[
  {
    "path": ".gitattributes",
    "content": ".git* export-ignore\n.hg* export-ignore\n*.c diff=cpp\n*.cpp diff=cpp\n*.h diff=cpp\n"
  },
  {
    "path": ".github/workflows/main.yml",
    "content": "name: continuous-integration\non: [push, pull_request]\n\njobs:\n  Linux:\n    runs-on: ${{ matrix.runner }}\n    strategy:\n      matrix:\n        runner: [ubuntu-22.04, ubuntu-24.04-arm]\n    permissions:\n      checks: write\n      pull-requests: write\n    env:\n      ALSOFT_CONF: love2d-${{ github.sha }}/testing/resources/alsoft.conf\n      VK_LAYER_SETTINGS_PATH: love2d-${{ github.sha }}/testing/resources/vk_layer_settings.txt\n      DISPLAY: :99\n    steps:\n    - name: Update APT\n      run: sudo apt-get update\n    - name: Install Dependencies\n      run: |\n        sudo apt-get install --assume-yes build-essential git make cmake autoconf automake \\\n                                          libtool pkg-config libasound2-dev libpulse-dev libaudio-dev \\\n                                          libjack-dev libx11-dev libxext-dev libxrandr-dev libxcursor-dev \\\n                                          libxfixes-dev libxi-dev libxinerama-dev libxxf86vm-dev libxss-dev \\\n                                          libxtst-dev \\\n                                          libgl1-mesa-dev libdbus-1-dev libudev-dev libgles2-mesa-dev \\\n                                          libegl1-mesa-dev libibus-1.0-dev fcitx-libs-dev libsamplerate0-dev \\\n                                          libsndio-dev libwayland-dev libxkbcommon-dev libdrm-dev libgbm-dev \\\n                                          libcurl4-openssl-dev libfuse2 wmctrl openbox mesa-vulkan-drivers \\\n                                          libpipewire-0.3-dev libwayland-dev libdecor-0-dev liburing-dev \\\n                                          libvulkan1\n    - name: Install Vulkan SDK\n      if: ${{ runner.arch == 'X64' }}\n      run: |\n        set -e\n        wget -qO- https://packages.lunarg.com/lunarg-signing-key-pub.asc | sudo tee /etc/apt/trusted.gpg.d/lunarg.asc\n        sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-1.3.283-jammy.list https://packages.lunarg.com/vulkan/1.3.283/lunarg-vulkan-1.3.283-jammy.list\n        sudo apt-get update\n        sudo apt-get install --assume-yes vulkan-sdk\n    - name: Checkout love-appimage-source\n      uses: actions/checkout@v4\n      with:\n        repository: love2d/love-appimage-source\n        ref: main\n    - name: Checkout LÖVE\n      uses: actions/checkout@v4\n      with:\n        path: love2d-${{ github.sha }}\n    - name: Get Dependencies for AppImage\n      shell: python\n      env:\n        LOVE_BRANCH: ${{ github.sha }}\n      run: |\n        import os\n        for i in range(250):\n            if os.system(f\"make getdeps LOVE_BRANCH={os.environ['LOVE_BRANCH']}\") == 0:\n                raise SystemExit(0)\n        raise Exception(\"make getdeps failed\")\n    - name: Build AppImage\n      run: make LOVE_BRANCH=${{ github.sha }}\n    - name: Print LuaJIT branch\n      run: git -C LuaJIT-v2.1 branch -v\n    # start xvfb for test running\n    - name: Start xvfb and openbox\n      run: |\n        echo \"Starting XVFB on $DISPLAY\"\n        Xvfb $DISPLAY -screen 0, 360x240x24 &\n        echo \"XVFBPID=$!\" >> $GITHUB_ENV\n        # wait for xvfb to startup (3s is the same amount xvfb-run waits by default)\n        sleep 3\n        openbox &\n        echo \"OPENBOXPID=$!\" >> $GITHUB_ENV\n    # linux opengl tests\n    - name: Run Test Suite (opengl)\n      run: |\n        chmod a+x love-${{ github.sha }}.AppImage\n        ./love-${{ github.sha }}.AppImage love2d-${{ github.sha }}/testing/main.lua --all --isRunner --renderers opengl\n    - name: Love Test Report (opengl)\n      id: report1\n      uses: ellraiser/love-test-report@main\n      with:\n        name: Love Testsuite Linux\n        title: test-report-linux-${{ runner.arch }}-opengl\n        path: love2d-${{ github.sha }}/testing/output/lovetest_all.md\n        token: ${{ secrets.GITHUB_TOKEN }}\n    - name: Zip Test Output (opengl)\n      run: |\n        7z a -tzip test-output-linux-opengl-${{ runner.arch }}.zip love2d-${{ github.sha }}/testing/output/\n    - name: Artifact Test Output (opengl)\n      uses: actions/upload-artifact@v4\n      with:\n        name: test-output-linux-${{ runner.arch }}-opengl-${{ steps.report1.outputs.conclusion }}\n        path: test-output-linux-${{ runner.arch }}-opengl.zip\n    # linux opengles tests\n    - name: Run Test Suite (opengles)\n      env:\n        LOVE_GRAPHICS_DEBUG: 1\n      run: |\n        export LOVE_GRAPHICS_USE_OPENGLES=1\n        ./love-${{ github.sha }}.AppImage love2d-${{ github.sha }}/testing/main.lua --all --isRunner --renderers opengl\n    - name: Love Test Report (opengles)\n      uses: ellraiser/love-test-report@main\n      id: report2\n      with:\n        name: Love Testsuite Linux\n        title: test-report-linux-${{ runner.arch }}-opengles\n        path: love2d-${{ github.sha }}/testing/output/lovetest_all.md\n        token: ${{ secrets.GITHUB_TOKEN }}\n    - name: Zip Test Output (opengles)\n      run: |\n        7z a -tzip test-output-linux-opengles-${{ runner.arch }}.zip love2d-${{ github.sha }}/testing/output/\n    - name: Artifact Test Output (opengles)\n      uses: actions/upload-artifact@v4\n      with:\n        name: test-output-linux-${{ runner.arch }}-opengles-${{ steps.report2.outputs.conclusion }}\n        path: test-output-linux-${{ runner.arch }}-opengles.zip\n    # linux vulkan tests\n    - name: Run Test Suite (vulkan)\n      env:\n        LOVE_GRAPHICS_DEBUG: ${{ runner.arch == 'ARM64' && '0' || '1' }} \n        LOVE_GRAPHICS_VULKAN_ALLOW_SOFTWARE: 1\n      run: |\n        ./love-${{ github.sha }}.AppImage love2d-${{ github.sha }}/testing/main.lua --all --isRunner --renderers vulkan\n    - name: Love Test Report (vulkan)\n      uses: ellraiser/love-test-report@main\n      id: report3\n      with:\n        name: Love Testsuite Linux\n        title: test-report-linux-${{ runner.arch }}-vulkan\n        path: love2d-${{ github.sha }}/testing/output/lovetest_all.md\n    - name: Zip Test Output (vulkan)\n      run: |\n        7z a -tzip test-output-linux-vulkan-${{ runner.arch }}.zip love2d-${{ github.sha }}/testing/output/\n    - name: Artifact Test Output (vulkan)\n      uses: actions/upload-artifact@v4\n      with:\n        name: test-output-linux-${{ runner.arch }}-vulkan-${{ steps.report3.outputs.conclusion }}\n        path: test-output-linux-${{ runner.arch }}-vulkan.zip\n    - name: Stop xvfb and openbox\n      # should always stop xvfb and openbox even if other steps failed\n      if: always()\n      run: |\n        kill $XVFBPID\n        kill $OPENBOXPID\n    - name: Artifact\n      uses: actions/upload-artifact@v4\n      with:\n        name: love-linux-${{ runner.arch }}.AppImage\n        path: love-${{ github.sha }}.AppImage\n    - name: Artifact Debug Symbols\n      uses: actions/upload-artifact@v4\n      with:\n        name: love-${{ runner.arch }}-AppImage-debug\n        path: love-${{ github.sha }}.AppImage-debug.tar.gz\n    - name: Check Tests Passing\n      if: steps.report1.outputs.conclusion == 'failure' || steps.report2.outputs.conclusion == 'failure' || steps.report3.outputs.conclusion == 'failure'\n      run: |\n        echo \"${{ steps.report1.outputs.failed }} opengl tests failed\"\n        echo \"${{ steps.report2.outputs.failed }} opengles tests failed\"\n        echo \"${{ steps.report3.outputs.failed }} vulkan tests failed\"\n        exit 1\n\n  Windows:\n    runs-on: windows-2025\n    permissions:\n      checks: write\n      pull-requests: write\n    env: \n      ALSOFT_CONF: megasource/libs/love/testing/resources/alsoft.conf\n      VK_ICD_FILENAMES: ${{ github.workspace }}\\mesa\\x64\\lvp_icd.x86_64.json\n      VULKAN_SDK: C:/VulkanSDK/1.3.231.1\n    strategy:\n      matrix:\n        platform: [x64, ARM64]\n    defaults:\n      run:\n        shell: cmd\n    continue-on-error: ${{ matrix.platform == 'ARM64' }}\n    steps:\n    - name: Define Variables\n      id: vars\n      run: |\n        rem JIT Modules\n        if \"${{ matrix.platform }}\" == \"x64\" (\n          (echo jitmodules=1)>> \"%GITHUB_OUTPUT%\"\n        ) else (\n          (echo jitmodules=0)>> \"%GITHUB_OUTPUT%\"\n        )\n        \n        rem Architecture-Specific Switch\n        goto ${{ matrix.platform }}\n        exit /b 1\n        \n        :Win32\n        (echo arch=x86)>> \"%GITHUB_OUTPUT%\"\n        (echo angle=0)>> \"%GITHUB_OUTPUT%\"\n        echo nofiles=warn>> \"%GITHUB_OUTPUT%\"\n        exit /b 0\n        \n        :x64\n        (echo arch=x64)>> \"%GITHUB_OUTPUT%\"\n        (echo angle=0)>> \"%GITHUB_OUTPUT%\"\n        echo nofiles=warn>> \"%GITHUB_OUTPUT%\"\n        exit /b 0\n        \n        :ARM64\n        (echo arch=arm64)>> \"%GITHUB_OUTPUT%\"\n        (echo angle=1)>> \"%GITHUB_OUTPUT%\"\n        echo nofiles=ignore>> \"%GITHUB_OUTPUT%\"\n        echo moredef=-DLOVE_EXTRA_DLLS=%CD%\\angle\\libEGL.dll;%CD%\\angle\\libGLESv2.dll>> \"%GITHUB_OUTPUT%\"\n        exit /b 0\n    - name: Install NSIS\n      run: winget install nsis --disable-interactivity --accept-source-agreements --accept-package-agreements\n    - name: Download pdbstr\n      run: curl -Lfo pdbstr.nupkg https://www.nuget.org/api/v2/package/Microsoft.Debugging.Tools.PdbStr/20230731.1609.0\n    - name: Download srctool\n      run: curl -Lfo srctool.nupkg https://www.nuget.org/api/v2/package/Microsoft.Debugging.Tools.SrcTool/20230731.1609.0\n    - name: Extract Tools and Add to PATH\n      run: |\n        mkdir debugtools\n        cd debugtools\n        if errorlevel 1 exit /b 1\n        7z e ..\\srctool.nupkg content/amd64/srctool.exe\n        if errorlevel 1 exit /b 1\n        7z e ..\\pdbstr.nupkg content/amd64/pdbstr.exe\n        if errorlevel 1 exit /b 1\n        echo %CD%>>%GITHUB_PATH%\n    - name: Setup Python 3.10\n      uses: actions/setup-python@v5\n      with:\n        python-version: \"3.10\"\n    - name: Download source_index.py\n      run: curl -Lfo source_index.py https://gist.github.com/MikuAuahDark/d9c099f5714e09a765496471c2827a55/raw/df34956052035f3473c5f01861dfb53930d06843/source_index.py\n    - name: Clone Megasource\n      uses: actions/checkout@v4\n      with:\n        path: megasource\n        repository: love2d/megasource\n        ref: main\n    - id: megasource\n      name: Get Megasource Commit SHA\n      shell: python\n      run: |\n        import os\n        import subprocess\n        \n        result = subprocess.run(\"git -C megasource rev-parse HEAD\".split(), check=True, capture_output=True, encoding=\"UTF-8\")\n        commit = result.stdout.split()[0]\n        with open(os.environ[\"GITHUB_OUTPUT\"], \"w\", encoding=\"UTF-8\") as f: f.write(f\"commit={commit}\")\n    - name: Checkout\n      uses: actions/checkout@v4\n      with:\n        path: megasource/libs/love\n    - name: Download ANGLE\n      uses: robinraju/release-downloader@v1.9\n      if: steps.vars.outputs.angle == '1'\n      with:\n        repository: MikuAuahDark/angle-winbuild\n        tag: cr_5249\n        fileName: angle-win-${{ steps.vars.outputs.arch }}.zip\n        tarBall: false\n        zipBall: false\n        out-file-path: angle\n    - name: Extract ANGLE\n      if: steps.vars.outputs.angle == '1'\n      working-directory: angle\n      run: 7z x angle-win-${{ steps.vars.outputs.arch }}.zip\n    - name: Remove Strawbery Perl From Path\n      # https://github.com/actions/runner-images/issues/6627\n      # In particular, this is not pretty, but even CMAKE_IGNORE_PREFIX_PATH\n      # cannot help in this case.\n      run: |\n        move /y C:\\Strawberry C:\\Strawberry_not_in_PATH\n        exit /b 0\n    - name: Configure\n      env:\n        CFLAGS: /Zi\n        CXXFLAGS: /Zi\n        LDFLAGS: /DEBUG:FULL /OPT:REF /OPT:ICF\n      run: cmake -Bbuild -Smegasource -T v143 -A ${{ matrix.platform }},version=10.0.26100.0 --install-prefix %CD%\\install -DCMAKE_PDB_OUTPUT_DIRECTORY=%CD%\\pdb ${{ steps.vars.outputs.moredef }}\n    - name: Install\n      run: cmake --build build --target PACKAGE --config Release -j2\n    - name: Copy LuaJIT lua51.pdb\n      run: |\n        copy /Y build\\libs\\LuaJIT\\src\\lua51.pdb pdb\\Release\\lua51.pdb\n        exit /b 0\n    - name: Add srcsrv to PATH\n      run: |\n        echo C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x64\\srcsrv>>%GITHUB_PATH%\n    - name: Embed Source Index into PDBs\n      run: |\n        python source_index.py ^\n        --source %CD%\\megasource\\libs\\love https://raw.githubusercontent.com/${{ github.repository }}/${{ github.sha }} ^\n        --source %CD%\\megasource https://raw.githubusercontent.com/love2d/megasource/${{ steps.megasource.outputs.commit }} ^\n        --source %CD%\\build\\libs\\LuaJIT https://raw.githubusercontent.com/love2d/megasource/${{ steps.megasource.outputs.commit }}/libs/LuaJIT ^\n        pdb\\Release\\*.pdb\n    - name: Artifact\n      uses: actions/upload-artifact@v4\n      with:\n        name: love-windows-${{ steps.vars.outputs.arch }}\n        path: |\n          build/*.zip\n          build/*.exe\n        if-no-files-found: ${{ steps.vars.outputs.nofiles }}\n    - name: Artifact JIT Modules\n      if: steps.vars.outputs.jitmodules == '1'\n      uses: actions/upload-artifact@v4\n      with:\n        name: love-windows-jitmodules\n        path: build/libs/LuaJIT/src/jit/*.lua\n    - name: Artifact PDB\n      uses: actions/upload-artifact@v4\n      with:\n        name: love-windows-${{ steps.vars.outputs.arch }}-dbg\n        path: pdb/Release/*.pdb\n    # install mesa for graphic tests\n    - name: Install Mesa \n      if: steps.vars.outputs.arch != 'ARM64'\n      run: |\n        curl -L --output mesa.7z --url https://github.com/pal1000/mesa-dist-win/releases/download/24.2.4/mesa3d-24.2.4-release-msvc.7z\n        7z x mesa.7z -o*\n        powershell.exe mesa\\systemwidedeploy.cmd 1\n    # build love to use for the tests\n    - name: Build Test Exe\n      if: steps.vars.outputs.arch != 'ARM64'\n      run: cmake --build build --config Release --target install\n    # windows opengl tests\n    - name: Run Tests (opengl)\n      if: steps.vars.outputs.arch != 'ARM64'\n      env:\n        LOVE_GRAPHICS_DEBUG: 1\n      run: |\n        echo 'check dir'\n        ls\n        powershell.exe ./install/lovec.exe ./megasource/libs/love/testing/main.lua --all --isRunner --renderers opengl\n    - name: Love Test Report (opengl)\n      id: report1\n      if: steps.vars.outputs.arch != 'ARM64'\n      uses: ellraiser/love-test-report@main\n      with:\n        name: Love Testsuite Windows ${{ steps.vars.outputs.arch }} (opengl)\n        title: test-report-windows-${{ steps.vars.outputs.arch }}-opengl\n        path: megasource/libs/love/testing/output/lovetest_all.md\n        token: ${{ secrets.GITHUB_TOKEN }}\n    - name: Zip Test Output (opengl)\n      if: steps.vars.outputs.arch != 'ARM64'\n      run: |\n        7z a -tzip test-output-windows-${{ steps.vars.outputs.arch }}-opengl.zip megasource/libs/love/testing/output/\n    - name: Artifact Test Output (opengl)\n      if: steps.vars.outputs.arch != 'ARM64'\n      uses: actions/upload-artifact@v4\n      with:\n        name: test-output-windows-${{ steps.vars.outputs.arch }}-opengl-${{ steps.report1.outputs.conclusion }}\n        path: test-output-windows-${{ steps.vars.outputs.arch }}-opengl.zip\n    # windows opengles tests\n    - name: Run Tests (opengles)\n      if: steps.vars.outputs.arch != 'ARM64'\n      env:\n        LOVE_GRAPHICS_DEBUG: 1\n        LOVE_GRAPHICS_USE_OPENGLES: 1\n      run: |\n        powershell.exe ./install/lovec.exe ./megasource/libs/love/testing/main.lua --all --isRunner --renderers opengl\n    - name: Love Test Report (opengles)\n      id: report2\n      if: steps.vars.outputs.arch != 'ARM64'\n      uses: ellraiser/love-test-report@main\n      with:\n        name: Love Testsuite Windows ${{ steps.vars.outputs.arch }} (opengles)\n        title: test-report-windows-${{ steps.vars.outputs.arch }}-opengles\n        path: megasource/libs/love/testing/output/lovetest_all.md\n        token: ${{ secrets.GITHUB_TOKEN }}\n    - name: Zip Test Output (opengles)\n      if: steps.vars.outputs.arch != 'ARM64'\n      run: |\n        7z a -tzip test-output-windows-${{ steps.vars.outputs.arch }}-opengles.zip megasource/libs/love/testing/output/\n    - name: Artifact Test Output (opengles)\n      if: steps.vars.outputs.arch != 'ARM64'\n      uses: actions/upload-artifact@v4\n      with:\n        name: test-output-windows-${{ steps.vars.outputs.arch }}-opengles-${{ steps.report2.outputs.conclusion }}\n        path: test-output-windows-${{ steps.vars.outputs.arch }}-opengles.zip\n    - name: Check Tests Passing\n      if: steps.report1.outputs.conclusion == 'failure' || steps.report2.outputs.conclusion == 'failure'\n      run: |\n        echo \"${{ steps.report1.outputs.failed }} opengl tests failed\"\n        echo \"${{ steps.report2.outputs.failed }} opengles tests failed\"\n        exit 1\n#    # install vulkan\n#    - name: Install Vulkan\n#      if: steps.vars.outputs.arch != 'ARM64'\n#      run: |\n#        curl -L --show-error --output VulkanSDK.exe https://sdk.lunarg.com/sdk/download/1.3.231.1/windows/VulkanSDK-1.3.231.1-Installer.exe\n#        ./VulkanSDK.exe --root C:/VulkanSDK/1.3.231.1 --accept-licenses --default-answer --confirm-command install com.lunarg.vulkan.core com.lunarg.vulkan.vma \n#        curl -L --show-error --output vulkan-runtime.zip https://sdk.lunarg.com/sdk/download/1.3.231.1/windows/vulkan-runtime-components.zip\n#        7z e vulkan-runtime.zip -o\"C:/VulkanSDK/1.3.231.1/runtime/x64\" */x64\n#        copy \"C:/VulkanSDK/1.3.231.1/runtime/x64/vulkan-1.dll\" \"mesa/x64\"\n#        copy \"C:/VulkanSDK/1.3.231.1/runtime/x64/vulkan-1.dll\" \"C:/Windows/System32\"\n#        copy \"C:/VulkanSDK/1.3.231.1/runtime/x64/vulkan-1.dll\" \"love-12.0-win64/love-12.0-win64\"\n#        reg add HKEY_LOCAL_MACHINE\\SOFTWARE\\Khronos\\Vulkan\\Drivers /v \"${{ github.workspace }}\\mesa\\x64\\lvp_icd.x86_64.json\" /t REG_DWORD /d 0\n#        powershell.exe C:/VulkanSDK/1.3.231.1/runtime/x64/vulkaninfo.exe --summary\n#    # windows vulkan tests\n#    - name: Run Tests (vulkan)\n#      if: steps.vars.outputs.arch != 'ARM64'\n#      env:\n#        LOVE_GRAPHICS_DEBUG: 1\n#        LOVE_GRAPHICS_VULKAN_ALLOW_SOFTWARE: 1\n#      run: |\n#        powershell.exe ./install/lovec.exe ./megasource/libs/love/testing/main.lua --all --isRunner --renderers vulkan\n#    - name: Love Test Report (vulkan)\n#      if: steps.vars.outputs.arch != 'ARM64'\n#      uses: ellraiser/love-test-report@main\n#      with:\n#        name: Love Testsuite Windows ${{ steps.vars.outputs.arch }} (vulkan)\n#        title: test-report-windows-${{ steps.vars.outputs.arch }}-vulkan\n#        path: megasource/libs/love/testing/output/lovetest_all.md\n#    - name: Zip Test Output (vulkan)\n#      if: steps.vars.outputs.arch != 'ARM64'\n#      run: |\n#        7z a -tzip test-output-windows-${{ steps.vars.outputs.arch }}-vulkan.zip megasource/libs/love/testing/output/\n#    - name: Artifact Test Output (vulkan)\n#      if: steps.vars.outputs.arch != 'ARM64'\n#      uses: actions/upload-artifact@v4\n#      with:\n#        name: test-output-windows-${{ steps.vars.outputs.arch }}-vulkan\n#        path: test-output-windows-${{ steps.vars.outputs.arch }}-vulkan.zip\n\n  macOS:\n    runs-on: macos-latest\n    permissions:\n      checks: write\n      pull-requests: write\n    env:\n      ALSOFT_CONF: testing/resources/alsoft.conf\n    steps:\n    - name: Checkout\n      uses: actions/checkout@v4\n    - name: Clone Dependencies\n      uses: actions/checkout@v4\n      with:\n        path: apple-dependencies\n        repository: love2d/love-apple-dependencies\n        ref: main\n    - name: Move Dependencies\n      run: |\n        mv apple-dependencies/macOS/Frameworks platform/xcode/macosx\n        mv apple-dependencies/shared platform/xcode\n    - name: Build\n      run:\n        xcodebuild clean archive -project platform/xcode/love.xcodeproj -scheme love-macosx -configuration Release -destination generic/platform=macOS -archivePath love-macos.xcarchive\n    - name: Export Archive\n      run:\n        xcodebuild -exportArchive -archivePath love-macos.xcarchive -exportPath love-macos -exportOptionsPlist platform/xcode/macosx/macos-copy-app.plist\n    - name: Zip Archive\n      run:\n        ditto -c -k --sequesterRsrc --keepParent love-macos/love.app love-macos.zip \n    - name: Artifact\n      uses: actions/upload-artifact@v4\n      with:\n        name: love-macos\n        path: love-macos.zip\n    # macos opengl tests\n    - name: Run Test Suite (OpenGL)\n      env:\n        LOVE_GRAPHICS_DEBUG: 1\n      run: |\n        ls\n        love-macos/love.app/Contents/MacOS/love ./testing/main.lua --all --isRunner --renderers opengl\n    - name: Love Test Report (OpenGL)\n      id: report1\n      uses: ellraiser/love-test-report@main\n      with:\n        name: Love Testsuite MacOS\n        title: test-report-macos-opengl\n        path: testing/output/lovetest_all.md\n        token: ${{ secrets.GITHUB_TOKEN }}\n    - name: Zip Test Output (OpenGL)\n      run: |\n        7z a -tzip test-output-macos-opengl.zip ./testing/output/\n    - name: Artifact Test Output (OpenGL)\n      uses: actions/upload-artifact@v4\n      with:\n        name: test-output-macos-opengl-${{ steps.report1.outputs.conclusion }}\n        path: test-output-macos-opengl.zip\n    - name: Check Tests Passing (OpenGL)\n      if: steps.report1.outputs.conclusion == 'failure'\n      run: |\n        echo \"${{ steps.report1.outputs.failed }} opengl tests failed\"\n        exit 1\n    # macos metal tests\n    - name: Run Test Suite (Metal)\n      env:\n        LOVE_GRAPHICS_DEBUG: 1\n      run: |\n        ls\n        love-macos/love.app/Contents/MacOS/love ./testing/main.lua --all --isRunner --renderers metal\n    - name: Love Test Report (Metal)\n      id: report2\n      uses: ellraiser/love-test-report@main\n      with:\n        name: Love Testsuite MacOS (Metal)\n        title: test-report-macos-metal\n        path: testing/output/lovetest_all.md\n        token: ${{ secrets.GITHUB_TOKEN }}\n    - name: Zip Test Output (Metal)\n      run: |\n        7z a -tzip test-output-macos-metal.zip ./testing/output/\n    - name: Artifact Test Output (Metal)\n      uses: actions/upload-artifact@v4\n      with:\n        name: test-output-macos-metal-${{ steps.report2.outputs.conclusion }}\n        path: test-output-macos-metal.zip\n    - name: Check Tests Passing (Metal)\n      if: steps.report2.outputs.conclusion == 'failure'\n      run: |\n        echo \"${{ steps.report2.outputs.failed }} metal tests failed\"\n        exit 1\n\n  iOS-Simulator:\n    runs-on: macos-14\n    steps:\n    - name: Checkout\n      uses: actions/checkout@v4\n    - name: Clone Dependencies\n      uses: actions/checkout@v4\n      with:\n        path: apple-dependencies\n        repository: love2d/love-apple-dependencies\n        ref: main\n    - name: Move Dependencies\n      run: |\n        mv apple-dependencies/iOS/libraries platform/xcode/ios\n        mv apple-dependencies/shared platform/xcode\n    - name: Build\n      run:\n        xcodebuild -project platform/xcode/love.xcodeproj -scheme love-ios -configuration Release -destination 'platform=iOS Simulator,name=iPhone 15'\n\n  Android:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        build_type: [Debug, Release]\n    env:\n      GRADLE_OPTS: \"-Dorg.gradle.jvmargs='-Xmx4G'\"\n    steps:\n    - name: Prepare Environment\n      run: sudo apt-get update && curl -Lfo kitware-archive.sh https://apt.kitware.com/kitware-archive.sh && sudo bash ./kitware-archive.sh\n    - name: Install Dependencies\n      run: sudo apt-get install ninja-build cmake\n    - name: Checkout love-android\n      uses: actions/checkout@v4\n      with:\n        repository: love2d/love-android\n        submodules: false\n    - name: Setup Java 17\n      uses: actions/setup-java@v4\n      with:\n        distribution: adopt-hotspot\n        java-version: 17\n        cache: gradle\n    - name: Clone Megasource\n      uses: actions/checkout@v4\n      with:\n        path: app/src/main/cpp/megasource\n        repository: love2d/megasource\n        ref: main\n    - name: Checkout\n      uses: actions/checkout@v4\n      with:\n        path: app/src/main/cpp/love\n    - name: Build Normal Flavor\n      run: bash ./gradlew assembleNormalRecord${{ matrix.build_type }}\n    - name: Build Release-specific Binaries\n      if: ${{ matrix.build_type == 'Release' }}\n      run: bash ./gradlew bundleNormalNoRecordRelease bundleEmbedRecordRelease bundleEmbedNoRecordRelease\n    - name: Artifact (Normal debug APK)\n      if: ${{ matrix.build_type == 'Debug' }}\n      uses: actions/upload-artifact@v4\n      with:\n        name: love-android-debug.apk\n        path: app/build/outputs/apk/normalRecord/debug/app-normal-record-debug.apk\n    - name: Artifact (Normal unsigned APK)\n      if: ${{ matrix.build_type == 'Release' }}\n      uses: actions/upload-artifact@v4\n      with:\n        name: love-android.apk\n        path: app/build/outputs/apk/normalRecord/release/app-normal-record-release-unsigned.apk\n    - name: Artifact (Normal AAB w/o recording)\n      if: ${{ matrix.build_type == 'Release' }}\n      uses: actions/upload-artifact@v4\n      with:\n        name: love-android-ps.aab\n        path: app/build/outputs/bundle/normalNoRecordRelease/app-normal-noRecord-release.aab\n    - name: Artifact (Embed AAB)\n      if: ${{ matrix.build_type == 'Release' }}\n      uses: actions/upload-artifact@v4\n      with:\n        name: love-android-embed-record.aab\n        path: app/build/outputs/bundle/embedRecordRelease/app-embed-record-release.aab\n    - name: Artifact (Embed AAB w/o recording)\n      if: ${{ matrix.build_type == 'Release' }}\n      uses: actions/upload-artifact@v4\n      with:\n        name: love-android-embed.aab\n        path: app/build/outputs/bundle/embedNoRecordRelease/app-embed-noRecord-release.aab\n    - name: Artifact (Debug symbols)\n      uses: actions/upload-artifact@v4\n      with:\n        name: love-android-unstripped-debugsyms-${{ matrix.build_type }}\n        path: app/build/intermediates/cxx\n"
  },
  {
    "path": ".gitignore",
    "content": "# automake products\n/config.h\n/config.h.in\n/config.log\n/config.status\n/configure\n/configure-modules-post.ac\n/configure-modules-pre.ac\n/configure.ac\n\n/extra/reshax/Release/\n/extra/reshax/Debug/\n/extra/reshax/resources.h\n/extra/reshax/resources.cpp\n*.obj\n*.o\n*.dirstamp\n*.m4\n*.Po\n*.lo\n*.Plo\n*.dll\n*.user\n*.suo\n*/Release*\n*/Debug*\n*.lib\n*.ncb\n*.exe\n*.bat\n/platform/xcode/Build\n/platform/xcode/DerivedData\n/platform/xcode/ios/include\n/platform/xcode/ios/libraries\n/platform/xcode/ios/luajit-git\n/platform/xcode/macosx/Frameworks\n/platform/xcode/shared/Frameworks\n*xcuserdata*\n*.DS_Store\n*.dylib\n*.dmg*\ndemos\n*.orig\n.*.swp\n/autom4te.cache/\n/src/.libs/\n*~\nMakefile*\nlibtool\n/src/config.h\n/platform/unix/ar-lib\n/platform/unix/compile\n/platform/unix/config.guess\n/platform/unix/config.sub\n/platform/unix/debian/changelog\n/platform/unix/debian/control\n/platform/unix/debian/rules\n/platform/unix/depcomp\n/platform/unix/install-sh\n/platform/unix/love.desktop\n/platform/unix/ltmain.sh\n/platform/unix/missing\n.lineno\n*.la\n*.Tpo\n*.rej\n*/.deps\nstamp-h1\n/src/love\n/src/tags\n.vs/\n.vscode/\n/testing/output/*.xml\n/testing/output/*.html\n/testing/output/*.md\n/testing/output/actual/*.png\n/testing/output/difference/*.png\n"
  },
  {
    "path": "CMakeLists.txt",
    "content": "#\r\n# Copyright (c) 2006-2026 LOVE Development Team\r\n#\r\n# This software is provided 'as-is', without any express or implied\r\n# warranty.  In no event will the authors be held liable for any damages\r\n# arising from the use of this software.\r\n#\r\n# Permission is granted to anyone to use this software for any purpose,\r\n# including commercial applications, and to alter it and redistribute it\r\n# freely, subject to the following restrictions:\r\n#\r\n# 1. The origin of this software must not be misrepresented; you must not\r\n#    claim that you wrote the original software. If you use this software\r\n#    in a product, an acknowledgment in the product documentation would be\r\n#    appreciated but is not required.\r\n# 2. Altered source versions must be plainly marked as such, and must not be\r\n#    misrepresented as being the original software.\r\n# 3. This notice may not be removed or altered from any source distribution.\r\n#\r\n\r\nif(${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_BINARY_DIR})\r\n\t# Protip: run cmake like this: cmake -G \"<generator>\" -H. -Bbuild\r\n\tmessage(FATAL_ERROR \"Prevented in-tree build.\")\r\nendif()\r\n\r\ncmake_minimum_required(VERSION 3.19)\r\n\r\nproject(love)\r\n\r\nset(CMAKE_MODULE_PATH \"${love_SOURCE_DIR}/extra/cmake\" ${CMAKE_MODULE_PATH})\r\nset(CMAKE_POSITION_INDEPENDENT_CODE TRUE) # Needed for shared libs on Linux. (-fPIC).\r\nset(CMAKE_CXX_STANDARD 17)\r\nset_property(GLOBAL PROPERTY USE_FOLDERS ON)\t# Allow grouping projects in Visual Studio\r\n\r\nif(APPLE)\r\n\tmessage(WARNING \"CMake is not an officially supported build system for love on Apple platforms.\")\r\n\tmessage(WARNING \"Use the prebuilt .app or the xcode project in platform/xcode/ instead.\")\r\nendif()\r\n\r\nif(MINGW)\r\n\tmessage(WARNING \"MinGW is not an officially supported build system for love.\")\r\n\tmessage(WARNING \"Use megasource with Visual Studio instead.\")\r\n\tmessage(WARNING \"Please see https://github.com/love2d/megasource\")\r\nendif()\r\n\r\ninclude(LoveMacros)\r\n\r\n# Extract version.h contents.\r\nfile(READ ${CMAKE_CURRENT_SOURCE_DIR}/src/common/version.h LOVE_VERSION_FILE_CONTENTS)\r\n\r\n# Extract one of LOVE_VERSION_MAJOR/MINOR/REV.\r\nfunction(match_version ARG_STRING OUT_VAR)\r\n\tstring(REGEX MATCH \"VERSION_${ARG_STRING} = ([0-9]+);\" TMP_VER \"${LOVE_VERSION_FILE_CONTENTS}\")\r\n\tstring(REGEX MATCH \"[0-9]+\" TMP_VER \"${TMP_VER}\")\r\n\tset(${OUT_VAR} ${TMP_VER} PARENT_SCOPE)\r\nendfunction()\r\n\r\nmatch_version(\"MAJOR\" LOVE_VERSION_MAJOR)\r\nmatch_version(\"MINOR\" LOVE_VERSION_MINOR)\r\nmatch_version(\"REV\" LOVE_VERSION_REV)\r\n\r\nset(LOVE_VERSION_STR \"${LOVE_VERSION_MAJOR}.${LOVE_VERSION_MINOR}\")\r\n\r\nmessage(STATUS \"Version: ${LOVE_VERSION_STR}\")\r\n\r\nset(LOVE_EXE_NAME love CACHE STRING \"The name of the executable, usually 'love'\")\r\n\r\nset(LOVE_DEFAULT_LIB_NAME liblove)\r\nif(\"${CMAKE_SYSTEM_NAME}\" STREQUAL \"Linux\")\r\n\tset(LOVE_DEFAULT_LIB_NAME \"${LOVE_EXE_NAME}-${LOVE_VERSION_STR}\")\r\nendif()\r\n\r\nset(LOVE_LIB_NAME ${LOVE_DEFAULT_LIB_NAME} CACHE STRING \"The name of the lua library, usually 'liblove' or 'love'\")\r\nset(LOVE_CONSOLE_EXE_NAME \"${LOVE_EXE_NAME}c\" CACHE STRING \"The name of the console version of the executable, usually 'lovec'\")\r\n\r\nif(CMAKE_SIZEOF_VOID_P EQUAL 8)\r\n\tset(LOVE_X64 TRUE)\r\n\tset(LOVE_TARGET_PLATFORM x64)\r\nelse()\r\n\tset(LOVE_X86 TRUE)\r\n\tset(LOVE_TARGET_PLATFORM x86)\r\nendif()\r\n\r\n\r\nif(APPLE)\r\n\tset(LOVE_DEFAULT_JIT FALSE)\r\nelse()\r\n\tset(LOVE_DEFAULT_JIT TRUE)\r\nendif()\r\n\r\noption(LOVE_JIT \"Use LuaJIT\" ${LOVE_DEFAULT_JIT})\r\n\r\nif(LOVE_JIT)\r\n\tif(APPLE)\r\n\t\tmessage(WARNING \"JIT not supported yet on Mac.\")\r\n\tendif()\r\n\tmessage(STATUS \"LuaJIT: Enabled\")\r\nelse()\r\n\tmessage(STATUS \"LuaJIT: Disabled\")\r\nendif()\r\n\r\nmessage(STATUS \"Target platform: ${LOVE_TARGET_PLATFORM}\")\r\n\r\nadd_library(lovedep::SDL INTERFACE IMPORTED)\r\nadd_library(lovedep::Freetype INTERFACE IMPORTED)\r\nadd_library(lovedep::Harfbuzz INTERFACE IMPORTED)\r\nadd_library(lovedep::OpenAL INTERFACE IMPORTED)\r\nadd_library(lovedep::Modplug INTERFACE IMPORTED)\r\nadd_library(lovedep::Theora INTERFACE IMPORTED)\r\nadd_library(lovedep::Vorbis INTERFACE IMPORTED)\r\nadd_library(lovedep::Ogg INTERFACE IMPORTED)\r\nadd_library(lovedep::Zlib INTERFACE IMPORTED)\r\nadd_library(lovedep::Lua INTERFACE IMPORTED)\r\n\r\nif(MEGA)\r\n\t# LOVE_MSVC_DLLS contains runtime DLLs that should be bundled with the love\r\n\t# binary (in e.g. the installer). Example: msvcp140.dll.\r\n\tset(LOVE_MSVC_DLLS ${MEGA_MSVC_DLLS})\r\n\r\n\t# These DLLs are moved next to the love binary in a post-build step to\r\n\t# love runnable from inside Visual Studio.\r\n\t#\r\n\t# LOVE_MOVE_DLLS can contain CMake targets, in which case the target's\r\n\t# output is assumed to be a DLL, or it can contain paths to actual files.\r\n\t# We detect whether or not each item is a target, and take the appropriate\r\n\t# action.\r\n\tset(LOVE_MOVE_DLLS\r\n\t\t${MEGA_SDL3}\r\n\t\t${MEGA_OPENAL}\r\n\t)\r\n\r\n\t# LOVE_EXTRA_DLLS are non-runtime DLLs which should be bundled with the\r\n\t# love binary in installers, etc. It's only needed for external\r\n\t# (non-CMake) targets, i.e. LuaJIT.\r\n\tif(NOT DEFINED LOVE_EXTRA_DLLS)\r\n\t\tset(LOVE_EXTRA_DLLS)\r\n\tendif()\r\n\r\n\ttarget_link_libraries(lovedep::SDL INTERFACE ${MEGA_SDL3})\r\n\ttarget_link_libraries(lovedep::Freetype INTERFACE ${MEGA_FREETYPE})\r\n\ttarget_link_libraries(lovedep::Harfbuzz INTERFACE ${MEGA_HARFBUZZ})\r\n\ttarget_link_libraries(lovedep::OpenAL INTERFACE ${MEGA_OPENAL})\r\n\ttarget_link_libraries(lovedep::Modplug INTERFACE ${MEGA_MODPLUG})\r\n\ttarget_link_libraries(lovedep::Theora INTERFACE ${MEGA_LIBTHEORA})\r\n\ttarget_link_libraries(lovedep::Vorbis INTERFACE ${MEGA_LIBVORBIS} ${MEGA_LIBVORBISFILE})\r\n\ttarget_link_libraries(lovedep::Ogg INTERFACE ${MEGA_LIBOGG})\r\n\ttarget_link_libraries(lovedep::Zlib INTERFACE ${MEGA_ZLIB})\r\n\r\n\tif(LOVE_JIT)\r\n\t\ttarget_include_directories(lovedep::Lua INTERFACE ${MEGA_LUAJIT_INCLUDE})\r\n\t\ttarget_link_libraries(lovedep::Lua INTERFACE ${MEGA_LUAJIT_LIB})\r\n\t\tset(LOVE_EXTRA_DLLS ${LOVE_EXTRA_DLLS} ${MEGA_LUAJIT_DLL})\r\n\t\tset(LOVE_EXTRA_DEPENDECIES luajit)\r\n\t\tset(LOVE_MOVE_DLLS\r\n\t\t\t${LOVE_MOVE_DLLS}\r\n\t\t\t${MEGA_LUAJIT_DLL}\r\n\t\t)\r\n\telse()\r\n\t\t# MEGA_LUA51 is a CMake target, so includes are handled\r\n\t\t# automatically.\r\n\t\ttarget_link_libraries(lovedep::Lua INTERFACE ${MEGA_LUA51})\r\n\t\tset(LOVE_MOVE_DLLS\r\n\t\t\t${LOVE_MOVE_DLLS}\r\n\t\t\t${MEGA_LUA51}\r\n\t\t)\r\n\tendif()\r\nelse()\r\n\tif(MSVC OR ANDROID)\r\n\t\tmessage(FATAL_ERROR \"\r\nIt is currently only possible to build with megasource on Windows and Android.\r\nPlease see https://github.com/love2d/megasource\r\n\")\r\n\tendif()\r\n\r\n\t# required for enet\r\n\tadd_definitions(-D HAS_SOCKLEN_T)\r\n\r\n\tfind_package(SDL3 3.1.3 REQUIRED CONFIG)\r\n\ttarget_include_directories(lovedep::SDL INTERFACE ${SDL3_INCLUDE_DIRS})\r\n\ttarget_link_libraries(lovedep::SDL INTERFACE ${SDL3_LIBRARIES})\r\n\r\n\tfind_package(Freetype REQUIRED)\r\n\ttarget_include_directories(lovedep::Freetype INTERFACE ${FREETYPE_INCLUDE_DIRS})\r\n\ttarget_link_libraries(lovedep::Freetype INTERFACE ${FREETYPE_LIBRARY})\r\n\r\n\tfind_package(Harfbuzz REQUIRED)\r\n\ttarget_include_directories(lovedep::Harfbuzz INTERFACE ${HARFBUZZ_INCLUDE_DIR})\r\n\ttarget_link_libraries(lovedep::Harfbuzz INTERFACE ${HARFBUZZ_LIBRARY})\r\n\r\n\tfind_package(OpenAL REQUIRED)\r\n\ttarget_include_directories(lovedep::OpenAL INTERFACE ${OPENAL_INCLUDE_DIR})\r\n\ttarget_link_libraries(lovedep::OpenAL INTERFACE ${OPENAL_LIBRARY})\r\n\r\n\tfind_package(ModPlug REQUIRED)\r\n\ttarget_include_directories(lovedep::Modplug INTERFACE ${MODPLUG_INCLUDE_DIR})\r\n\ttarget_link_libraries(lovedep::Modplug INTERFACE ${MODPLUG_LIBRARY})\r\n\r\n\tfind_package(Theora REQUIRED)\r\n\ttarget_include_directories(lovedep::Theora INTERFACE ${THEORA_INCLUDE_DIR})\r\n\ttarget_link_libraries(lovedep::Theora INTERFACE ${THEORA_LIBRARY} ${THEORADEC_LIBRARY})\r\n\r\n\tfind_package(Vorbis REQUIRED)\r\n\ttarget_include_directories(lovedep::Vorbis INTERFACE ${VORBIS_INCLUDE_DIR})\r\n\ttarget_link_libraries(lovedep::Vorbis INTERFACE ${VORBISFILE_LIBRARY})\r\n\r\n\tfind_package(Ogg REQUIRED)\r\n\ttarget_include_directories(lovedep::Ogg INTERFACE ${OGG_INCLUDE_DIR})\r\n\ttarget_link_libraries(lovedep::Ogg INTERFACE ${OGG_LIBRARY})\r\n\r\n\tfind_package(ZLIB REQUIRED)\r\n\ttarget_include_directories(lovedep::Zlib INTERFACE ${ZLIB_INCLUDE_DIRS})\r\n\ttarget_link_libraries(lovedep::Zlib INTERFACE ${ZLIB_LIBRARY})\r\n\r\n\tif(LOVE_JIT)\r\n\t\tfind_package(LuaJIT REQUIRED)\r\n\t\ttarget_include_directories(lovedep::Lua INTERFACE ${LUAJIT_INCLUDE_DIR})\r\n\t\ttarget_link_libraries(lovedep::Lua INTERFACE ${LUAJIT_LIBRARY})\r\n\telse()\r\n\t\tfind_package(Lua51 REQUIRED)\r\n\t\ttarget_include_directories(lovedep::Lua INTERFACE ${LUA_INCLUDE_DIR})\r\n\t\ttarget_link_libraries(lovedep::Lua INTERFACE ${LUA_LIBRARY})\r\n\tendif()\r\nendif()\r\n\r\n###\r\n### No Megasource-specific stuff beyond this point!\r\n###\r\n\r\nif(MSVC)\r\n\tset(DISABLE_WARNING_FLAG -W0)\r\nelse()\r\n\tset(DISABLE_WARNING_FLAG -w)\r\nendif()\r\n\r\nfunction(love_disable_warnings ARG_TARGET)\r\n\ttarget_compile_options(${ARG_TARGET} PRIVATE ${DISABLE_WARNING_FLAG})\r\nendfunction()\r\n\r\n#\r\n# common\r\n#\r\n\r\nadd_library(love_common STATIC\r\n\tsrc/common/android.cpp\r\n\tsrc/common/android.h\r\n\tsrc/common/b64.cpp\r\n\tsrc/common/b64.h\r\n\tsrc/common/Color.h\r\n\tsrc/common/config.h\r\n\tsrc/common/Data.cpp\r\n\tsrc/common/Data.h\r\n\tsrc/common/delay.cpp\r\n\tsrc/common/delay.h\r\n\tsrc/common/deprecation.cpp\r\n\tsrc/common/deprecation.h\r\n\tsrc/common/EnumMap.h\r\n\tsrc/common/Exception.cpp\r\n\tsrc/common/Exception.h\r\n\tsrc/common/floattypes.cpp\r\n\tsrc/common/floattypes.h\r\n\tsrc/common/int.h\r\n\tsrc/common/math.h\r\n\tsrc/common/Matrix.cpp\r\n\tsrc/common/Matrix.h\r\n\tsrc/common/memory.cpp\r\n\tsrc/common/memory.h\r\n\tsrc/common/Module.cpp\r\n\tsrc/common/Module.h\r\n\tsrc/common/Object.cpp\r\n\tsrc/common/Object.h\r\n\tsrc/common/Optional.h\r\n\tsrc/common/pixelformat.cpp\r\n\tsrc/common/pixelformat.h\r\n\tsrc/common/Range.h\r\n\tsrc/common/Reference.cpp\r\n\tsrc/common/Reference.h\r\n\tsrc/common/runtime.cpp\r\n\tsrc/common/runtime.h\r\n\tsrc/common/Stream.cpp\r\n\tsrc/common/Stream.h\r\n\tsrc/common/StringMap.cpp\r\n\tsrc/common/StringMap.h\r\n\tsrc/common/types.cpp\r\n\tsrc/common/types.h\r\n\tsrc/common/utf8.cpp\r\n\tsrc/common/utf8.h\r\n\tsrc/common/Variant.cpp\r\n\tsrc/common/Variant.h\r\n\t#src/common/Vector.cpp # Vector.cpp is empty.\r\n\tsrc/common/Vector.h\r\n\tsrc/common/version.h\r\n)\r\ntarget_link_libraries(love_common PUBLIC\r\n\tlovedep::Lua\r\n\tlovedep::SDL\r\n)\r\n\r\nif (APPLE)\r\n\ttarget_sources(love_common PRIVATE\r\n\t\tsrc/common/apple.mm\r\n\t)\r\n\ttarget_link_libraries(love_common PUBLIC\r\n\t\tobjc\r\n\t\t\"-framework CoreFoundation\"\r\n\t)\r\n\tif(CMAKE_SYSTEM_NAME STREQUAL \"Darwin\")\r\n\t\ttarget_sources(love_common PRIVATE\r\n\t\t\tsrc/common/macos.mm\r\n\t\t)\r\n\t\ttarget_link_libraries(love_common PUBLIC\r\n\t\t\t\"-framework AppKit\"\r\n\t\t)\r\n\telse()\r\n\t\ttarget_sources(love_common PRIVATE\r\n\t\t\tsrc/common/ios.mm\r\n\t\t)\r\n\t\ttarget_link_libraries(love_common PUBLIC\r\n\t\t\t\"-framework UIKit\"\r\n\t\t)\r\n\tendif()\r\nendif()\r\n\r\n#\r\n# love.audio\r\n#\r\n\r\nadd_library(love_audio_root STATIC\r\n\tsrc/modules/audio/Audio.cpp\r\n\tsrc/modules/audio/Audio.h\r\n\tsrc/modules/audio/Source.cpp\r\n\tsrc/modules/audio/Source.h\r\n\tsrc/modules/audio/RecordingDevice.cpp\r\n\tsrc/modules/audio/RecordingDevice.h\r\n\tsrc/modules/audio/Filter.cpp\r\n\tsrc/modules/audio/Filter.h\r\n\tsrc/modules/audio/Effect.cpp\r\n\tsrc/modules/audio/Effect.h\r\n\tsrc/modules/audio/wrap_Audio.cpp\r\n\tsrc/modules/audio/wrap_Audio.h\r\n\tsrc/modules/audio/wrap_Source.cpp\r\n\tsrc/modules/audio/wrap_Source.h\r\n\tsrc/modules/audio/wrap_RecordingDevice.cpp\r\n\tsrc/modules/audio/wrap_RecordingDevice.h\r\n)\r\ntarget_link_libraries(love_audio_root PUBLIC\r\n\tlovedep::Lua\r\n\tlovedep::OpenAL\r\n)\r\n\r\nadd_library(love_audio_null STATIC\r\n\tsrc/modules/audio/null/Audio.cpp\r\n\tsrc/modules/audio/null/Audio.h\r\n\tsrc/modules/audio/null/Source.cpp\r\n\tsrc/modules/audio/null/Source.h\r\n\tsrc/modules/audio/null/RecordingDevice.cpp\r\n\tsrc/modules/audio/null/RecordingDevice.h\r\n)\r\n\r\nadd_library(love_audio_openal STATIC\r\n\tsrc/modules/audio/openal/Audio.cpp\r\n\tsrc/modules/audio/openal/Audio.h\r\n\tsrc/modules/audio/openal/Pool.cpp\r\n\tsrc/modules/audio/openal/Pool.h\r\n\tsrc/modules/audio/openal/Source.cpp\r\n\tsrc/modules/audio/openal/Source.h\r\n\tsrc/modules/audio/openal/RecordingDevice.cpp\r\n\tsrc/modules/audio/openal/RecordingDevice.h\r\n\tsrc/modules/audio/openal/Filter.cpp\r\n\tsrc/modules/audio/openal/Filter.h\r\n\tsrc/modules/audio/openal/Effect.cpp\r\n\tsrc/modules/audio/openal/Effect.h\r\n)\r\ntarget_link_libraries(love_audio_openal PUBLIC\r\n\tlovedep::OpenAL\r\n)\r\n\r\nadd_library(love_audio INTERFACE)\r\ntarget_link_libraries(love_audio INTERFACE\r\n\tlove_audio_root\r\n\tlove_audio_null\r\n\tlove_audio_openal\r\n)\r\n\r\n#\r\n# love.data\r\n#\r\n\r\nadd_library(love_data STATIC\r\n\tsrc/modules/data/ByteData.cpp\r\n\tsrc/modules/data/ByteData.h\r\n\tsrc/modules/data/CompressedData.cpp\r\n\tsrc/modules/data/CompressedData.h\r\n\tsrc/modules/data/Compressor.cpp\r\n\tsrc/modules/data/Compressor.h\r\n\tsrc/modules/data/DataModule.cpp\r\n\tsrc/modules/data/DataModule.h\r\n\tsrc/modules/data/DataStream.cpp\r\n\tsrc/modules/data/DataStream.h\r\n\tsrc/modules/data/DataView.cpp\r\n\tsrc/modules/data/DataView.h\r\n\tsrc/modules/data/HashFunction.cpp\r\n\tsrc/modules/data/HashFunction.h\r\n\tsrc/modules/data/wrap_ByteData.cpp\r\n\tsrc/modules/data/wrap_ByteData.h\r\n\tsrc/modules/data/wrap_CompressedData.cpp\r\n\tsrc/modules/data/wrap_CompressedData.h\r\n\tsrc/modules/data/wrap_Data.cpp\r\n\tsrc/modules/data/wrap_Data.h\r\n\tsrc/modules/data/wrap_Data.lua\r\n\tsrc/modules/data/wrap_DataModule.cpp\r\n\tsrc/modules/data/wrap_DataModule.h\r\n\tsrc/modules/data/wrap_DataView.cpp\r\n\tsrc/modules/data/wrap_DataView.h\r\n)\r\ntarget_link_libraries(love_data PUBLIC\r\n\tlovedep::Lua\r\n\tlovedep::Zlib\r\n)\r\n\r\n#\r\n# love.event\r\n#\r\n\r\nadd_library(love_event_root STATIC\r\n\tsrc/modules/event/Event.cpp\r\n\tsrc/modules/event/Event.h\r\n\tsrc/modules/event/wrap_Event.cpp\r\n\tsrc/modules/event/wrap_Event.h\r\n\tsrc/modules/event/wrap_Event.lua\r\n)\r\ntarget_link_libraries(love_event_root PUBLIC\r\n\tlovedep::Lua\r\n\tlovedep::SDL\r\n)\r\n\r\nadd_library(love_event_sdl STATIC\r\n\tsrc/modules/event/sdl/Event.cpp\r\n\tsrc/modules/event/sdl/Event.h\r\n)\r\ntarget_link_libraries(love_event_sdl PUBLIC\r\n\tlovedep::SDL\r\n)\r\n\r\nadd_library(love_event INTERFACE)\r\ntarget_link_libraries(love_event INTERFACE\r\n\tlove_event_root\r\n\tlove_event_sdl\r\n)\r\n\r\n#\r\n# love.filesystem\r\n#\r\n\r\nadd_library(love_filesystem_root STATIC\r\n\tsrc/modules/filesystem/File.cpp\r\n\tsrc/modules/filesystem/File.h\r\n\tsrc/modules/filesystem/FileData.cpp\r\n\tsrc/modules/filesystem/FileData.h\r\n\tsrc/modules/filesystem/Filesystem.cpp\r\n\tsrc/modules/filesystem/Filesystem.h\r\n\tsrc/modules/filesystem/NativeFile.cpp\r\n\tsrc/modules/filesystem/NativeFile.h\r\n\tsrc/modules/filesystem/wrap_File.cpp\r\n\tsrc/modules/filesystem/wrap_File.h\r\n\tsrc/modules/filesystem/wrap_FileData.cpp\r\n\tsrc/modules/filesystem/wrap_FileData.h\r\n\tsrc/modules/filesystem/wrap_Filesystem.cpp\r\n\tsrc/modules/filesystem/wrap_Filesystem.h\r\n\tsrc/modules/filesystem/wrap_NativeFile.cpp\r\n\tsrc/modules/filesystem/wrap_NativeFile.h\r\n)\r\ntarget_link_libraries(love_filesystem_root PUBLIC\r\n\tlovedep::Lua\r\n\tlovedep::SDL\r\n)\r\n\r\nadd_library(love_filesystem_physfs STATIC\r\n\tsrc/modules/filesystem/physfs/File.cpp\r\n\tsrc/modules/filesystem/physfs/File.h\r\n\tsrc/modules/filesystem/physfs/Filesystem.cpp\r\n\tsrc/modules/filesystem/physfs/Filesystem.h\r\n\tsrc/modules/filesystem/physfs/PhysfsIo.h\r\n\tsrc/modules/filesystem/physfs/PhysfsIo.cpp\r\n)\r\nif(ANDROID)\r\n\ttarget_link_libraries(love_filesystem_physfs PUBLIC\r\n\t\tlovedep::SDL\r\n\t)\r\nendif()\r\n\r\nadd_library(love_filesystem INTERFACE)\r\ntarget_link_libraries(love_filesystem INTERFACE\r\n\tlove_filesystem_root\r\n\tlove_filesystem_physfs\r\n)\r\n\r\n#\r\n# love.font\r\n#\r\n\r\nadd_library(love_font_root STATIC\r\n\tsrc/modules/font/BMFontRasterizer.cpp\r\n\tsrc/modules/font/BMFontRasterizer.h\r\n\tsrc/modules/font/Font.cpp\r\n\tsrc/modules/font/Font.h\r\n\tsrc/modules/font/GenericShaper.cpp\r\n\tsrc/modules/font/GenericShaper.h\r\n\tsrc/modules/font/GlyphData.cpp\r\n\tsrc/modules/font/GlyphData.h\r\n\tsrc/modules/font/ImageRasterizer.cpp\r\n\tsrc/modules/font/ImageRasterizer.h\r\n\tsrc/modules/font/Rasterizer.cpp\r\n\tsrc/modules/font/Rasterizer.h\r\n\tsrc/modules/font/TextShaper.cpp\r\n\tsrc/modules/font/TextShaper.h\r\n\tsrc/modules/font/TrueTypeRasterizer.cpp\r\n\tsrc/modules/font/TrueTypeRasterizer.h\r\n\tsrc/modules/font/wrap_Font.cpp\r\n\tsrc/modules/font/wrap_Font.h\r\n\tsrc/modules/font/wrap_GlyphData.cpp\r\n\tsrc/modules/font/wrap_GlyphData.h\r\n\tsrc/modules/font/wrap_Rasterizer.cpp\r\n\tsrc/modules/font/wrap_Rasterizer.h\r\n)\r\ntarget_link_libraries(love_font_root PUBLIC\r\n\tlovedep::Lua\r\n\tlovedep::Freetype\r\n)\r\n\r\nadd_library(love_font_freetype STATIC\r\n\tsrc/modules/font/freetype/Font.cpp\r\n\tsrc/modules/font/freetype/Font.h\r\n\tsrc/modules/font/freetype/HarfbuzzShaper.cpp\r\n\tsrc/modules/font/freetype/HarfbuzzShaper.h\r\n\tsrc/modules/font/freetype/TrueTypeRasterizer.cpp\r\n\tsrc/modules/font/freetype/TrueTypeRasterizer.h\r\n)\r\ntarget_link_libraries(love_font_freetype PUBLIC\r\n\tlovedep::Freetype\r\n\tlovedep::Harfbuzz\r\n)\r\n\r\nadd_library(love_font INTERFACE)\r\ntarget_link_libraries(love_font INTERFACE\r\n\tlove_font_root\r\n\tlove_font_freetype\r\n)\r\n\r\n#\r\n# love.graphics\r\n#\r\n\r\nadd_library(love_graphics_root STATIC\r\n\tsrc/modules/graphics/Buffer.cpp\r\n\tsrc/modules/graphics/Buffer.h\r\n\tsrc/modules/graphics/Deprecations.cpp\r\n\tsrc/modules/graphics/Deprecations.h\r\n\tsrc/modules/graphics/Drawable.cpp\r\n\tsrc/modules/graphics/Drawable.h\r\n\tsrc/modules/graphics/Font.cpp\r\n\tsrc/modules/graphics/Font.h\r\n\tsrc/modules/graphics/Graphics.cpp\r\n\tsrc/modules/graphics/Graphics.h\r\n\tsrc/modules/graphics/GraphicsReadback.cpp\r\n\tsrc/modules/graphics/GraphicsReadback.h\r\n\tsrc/modules/graphics/Mesh.cpp\r\n\tsrc/modules/graphics/Mesh.h\r\n\tsrc/modules/graphics/ParticleSystem.cpp\r\n\tsrc/modules/graphics/ParticleSystem.h\r\n\tsrc/modules/graphics/Polyline.cpp\r\n\tsrc/modules/graphics/Polyline.h\r\n\tsrc/modules/graphics/Quad.cpp\r\n\tsrc/modules/graphics/Quad.h\r\n\tsrc/modules/graphics/renderstate.cpp\r\n\tsrc/modules/graphics/renderstate.h\r\n\tsrc/modules/graphics/Resource.h\r\n\tsrc/modules/graphics/Shader.cpp\r\n\tsrc/modules/graphics/Shader.h\r\n\tsrc/modules/graphics/ShaderStage.cpp\r\n\tsrc/modules/graphics/ShaderStage.h\r\n\tsrc/modules/graphics/SpriteBatch.cpp\r\n\tsrc/modules/graphics/SpriteBatch.h\r\n\tsrc/modules/graphics/StreamBuffer.cpp\r\n\tsrc/modules/graphics/StreamBuffer.h\r\n\tsrc/modules/graphics/TextBatch.cpp\r\n\tsrc/modules/graphics/TextBatch.h\r\n\tsrc/modules/graphics/Texture.cpp\r\n\tsrc/modules/graphics/Texture.h\r\n\tsrc/modules/graphics/vertex.cpp\r\n\tsrc/modules/graphics/vertex.h\r\n\tsrc/modules/graphics/Video.cpp\r\n\tsrc/modules/graphics/Video.h\r\n\tsrc/modules/graphics/Volatile.cpp\r\n\tsrc/modules/graphics/Volatile.h\r\n\tsrc/modules/graphics/wrap_Buffer.cpp\r\n\tsrc/modules/graphics/wrap_Buffer.h\r\n\tsrc/modules/graphics/wrap_Font.cpp\r\n\tsrc/modules/graphics/wrap_Font.h\r\n\tsrc/modules/graphics/wrap_Graphics.cpp\r\n\tsrc/modules/graphics/wrap_Graphics.h\r\n\tsrc/modules/graphics/wrap_Graphics.lua\r\n\tsrc/modules/graphics/wrap_GraphicsReadback.cpp\r\n\tsrc/modules/graphics/wrap_GraphicsReadback.h\r\n\tsrc/modules/graphics/wrap_Mesh.cpp\r\n\tsrc/modules/graphics/wrap_Mesh.h\r\n\tsrc/modules/graphics/wrap_ParticleSystem.cpp\r\n\tsrc/modules/graphics/wrap_ParticleSystem.h\r\n\tsrc/modules/graphics/wrap_Quad.cpp\r\n\tsrc/modules/graphics/wrap_Quad.h\r\n\tsrc/modules/graphics/wrap_Shader.cpp\r\n\tsrc/modules/graphics/wrap_Shader.h\r\n\tsrc/modules/graphics/wrap_SpriteBatch.cpp\r\n\tsrc/modules/graphics/wrap_SpriteBatch.h\r\n\tsrc/modules/graphics/wrap_Texture.cpp\r\n\tsrc/modules/graphics/wrap_Texture.h\r\n\tsrc/modules/graphics/wrap_TextBatch.cpp\r\n\tsrc/modules/graphics/wrap_TextBatch.h\r\n\tsrc/modules/graphics/wrap_Video.cpp\r\n\tsrc/modules/graphics/wrap_Video.h\r\n\tsrc/modules/graphics/wrap_Video.lua\r\n)\r\ntarget_link_libraries(love_graphics_root PUBLIC\r\n\tlovedep::Lua\r\n)\r\n\r\nadd_library(love_graphics_opengl STATIC\r\n\tsrc/modules/graphics/opengl/Buffer.cpp\r\n\tsrc/modules/graphics/opengl/Buffer.h\r\n\tsrc/modules/graphics/opengl/FenceSync.cpp\r\n\tsrc/modules/graphics/opengl/FenceSync.h\r\n\tsrc/modules/graphics/opengl/Graphics.cpp\r\n\tsrc/modules/graphics/opengl/Graphics.h\r\n\tsrc/modules/graphics/opengl/GraphicsReadback.cpp\r\n\tsrc/modules/graphics/opengl/GraphicsReadback.h\r\n\tsrc/modules/graphics/opengl/OpenGL.cpp\r\n\tsrc/modules/graphics/opengl/OpenGL.h\r\n\tsrc/modules/graphics/opengl/Shader.cpp\r\n\tsrc/modules/graphics/opengl/Shader.h\r\n\tsrc/modules/graphics/opengl/ShaderStage.cpp\r\n\tsrc/modules/graphics/opengl/ShaderStage.h\r\n\tsrc/modules/graphics/opengl/StreamBuffer.cpp\r\n\tsrc/modules/graphics/opengl/StreamBuffer.h\r\n\tsrc/modules/graphics/opengl/Texture.cpp\r\n\tsrc/modules/graphics/opengl/Texture.h\r\n)\r\ntarget_link_libraries(love_graphics_opengl PUBLIC\r\n\tlovedep::SDL\r\n)\r\n\r\nadd_library(love_graphics INTERFACE)\r\ntarget_link_libraries(love_graphics INTERFACE\r\n\tlove_graphics_root\r\n\tlove_graphics_opengl\r\n)\r\n\r\nif(APPLE)\r\n\tadd_library(love_graphics_metal STATIC\r\n\t\tsrc/modules/graphics/metal/Buffer.h\r\n\t\tsrc/modules/graphics/metal/Buffer.mm\r\n\t\tsrc/modules/graphics/metal/Graphics.h\r\n\t\tsrc/modules/graphics/metal/Graphics.mm\r\n\t\tsrc/modules/graphics/metal/GraphicsReadback.h\r\n\t\tsrc/modules/graphics/metal/GraphicsReadback.mm\r\n\t\tsrc/modules/graphics/metal/Metal.h\r\n\t\tsrc/modules/graphics/metal/Metal.mm\r\n\t\tsrc/modules/graphics/metal/Shader.h\r\n\t\tsrc/modules/graphics/metal/Shader.mm\r\n\t\tsrc/modules/graphics/metal/ShaderStage.h\r\n\t\tsrc/modules/graphics/metal/ShaderStage.mm\r\n\t\tsrc/modules/graphics/metal/StreamBuffer.h\r\n\t\tsrc/modules/graphics/metal/StreamBuffer.mm\r\n\t\tsrc/modules/graphics/metal/Texture.h\r\n\t\tsrc/modules/graphics/metal/Texture.mm\r\n\t)\r\n\ttarget_link_libraries(love_graphics_metal PUBLIC\r\n\t\tobjc\r\n\t\t\"-framework Metal\"\r\n\t\t\"-framework QuartzCore\"\r\n\t)\r\n\ttarget_link_libraries(love_graphics INTERFACE\r\n\t\tlove_graphics_metal\r\n\t)\r\nelse()\r\n\tadd_library(love_graphics_vulkan STATIC\r\n\t\tsrc/modules/graphics/vulkan/Graphics.h\r\n\t\tsrc/modules/graphics/vulkan/Graphics.cpp\r\n\t\tsrc/modules/graphics/vulkan/GraphicsReadback.h\r\n\t\tsrc/modules/graphics/vulkan/GraphicsReadback.cpp\r\n\t\tsrc/modules/graphics/vulkan/Shader.h\r\n\t\tsrc/modules/graphics/vulkan/Shader.cpp\r\n\t\tsrc/modules/graphics/vulkan/ShaderStage.h\r\n\t\tsrc/modules/graphics/vulkan/ShaderStage.cpp\r\n\t\tsrc/modules/graphics/vulkan/StreamBuffer.h\r\n\t\tsrc/modules/graphics/vulkan/StreamBuffer.cpp\r\n\t\tsrc/modules/graphics/vulkan/Buffer.h\r\n\t\tsrc/modules/graphics/vulkan/Buffer.cpp\r\n\t\tsrc/modules/graphics/vulkan/Texture.h\r\n\t\tsrc/modules/graphics/vulkan/Texture.cpp\r\n\t\tsrc/modules/graphics/vulkan/Vulkan.h\r\n\t\tsrc/modules/graphics/vulkan/Vulkan.cpp\r\n\t\tsrc/modules/graphics/vulkan/VulkanWrapper.h\r\n\t)\r\n\ttarget_link_libraries(love_graphics_vulkan PUBLIC\r\n\t\tlovedep::SDL\r\n\t)\r\n\ttarget_link_libraries(love_graphics INTERFACE\r\n\t\tlove_graphics_vulkan\r\n\t)\r\nendif()\r\n\r\n#\r\n# love.image\r\n#\r\n\r\nadd_library(love_image_root STATIC\r\n\tsrc/modules/image/CompressedImageData.cpp\r\n\tsrc/modules/image/CompressedImageData.h\r\n\tsrc/modules/image/CompressedSlice.cpp\r\n\tsrc/modules/image/CompressedSlice.h\r\n\tsrc/modules/image/FormatHandler.cpp\r\n\tsrc/modules/image/FormatHandler.h\r\n\tsrc/modules/image/Image.cpp\r\n\tsrc/modules/image/Image.h\r\n\tsrc/modules/image/ImageData.cpp\r\n\tsrc/modules/image/ImageData.h\r\n\tsrc/modules/image/ImageDataBase.cpp\r\n\tsrc/modules/image/ImageDataBase.h\r\n\tsrc/modules/image/wrap_CompressedImageData.cpp\r\n\tsrc/modules/image/wrap_CompressedImageData.h\r\n\tsrc/modules/image/wrap_Image.cpp\r\n\tsrc/modules/image/wrap_Image.h\r\n\tsrc/modules/image/wrap_ImageData.cpp\r\n\tsrc/modules/image/wrap_ImageData.h\r\n\tsrc/modules/image/wrap_ImageData.lua\r\n)\r\ntarget_link_libraries(love_image_root PUBLIC\r\n\tlovedep::Lua\r\n)\r\n\r\nadd_library(love_image_magpie STATIC\r\n\tsrc/modules/image/magpie/ASTCHandler.cpp\r\n\tsrc/modules/image/magpie/ASTCHandler.h\r\n\tsrc/modules/image/magpie/ddsHandler.cpp\r\n\tsrc/modules/image/magpie/ddsHandler.h\r\n\tsrc/modules/image/magpie/EXRHandler.cpp\r\n\tsrc/modules/image/magpie/EXRHandler.h\r\n\tsrc/modules/image/magpie/KTXHandler.cpp\r\n\tsrc/modules/image/magpie/KTXHandler.h\r\n\tsrc/modules/image/magpie/PKMHandler.cpp\r\n\tsrc/modules/image/magpie/PKMHandler.h\r\n\tsrc/modules/image/magpie/PNGHandler.cpp\r\n\tsrc/modules/image/magpie/PNGHandler.h\r\n\tsrc/modules/image/magpie/PVRHandler.cpp\r\n\tsrc/modules/image/magpie/PVRHandler.h\r\n\tsrc/modules/image/magpie/STBHandler.cpp\r\n\tsrc/modules/image/magpie/STBHandler.h\r\n)\r\ntarget_link_libraries(love_image_magpie PUBLIC\r\n\tlovedep::Zlib\r\n)\r\n\r\nadd_library(love_image INTERFACE)\r\ntarget_link_libraries(love_image INTERFACE\r\n\tlove_image_root\r\n\tlove_image_magpie\r\n)\r\n\r\n#\r\n# love.joystick\r\n#\r\n\r\nadd_library(love_joystick_root STATIC\r\n\tsrc/modules/joystick/Joystick.cpp\r\n\tsrc/modules/joystick/Joystick.h\r\n\tsrc/modules/joystick/JoystickModule.h\r\n\tsrc/modules/joystick/wrap_Joystick.cpp\r\n\tsrc/modules/joystick/wrap_Joystick.h\r\n\tsrc/modules/joystick/wrap_JoystickModule.cpp\r\n\tsrc/modules/joystick/wrap_JoystickModule.h\r\n)\r\ntarget_link_libraries(love_joystick_root PUBLIC\r\n\tlovedep::Lua\r\n)\r\n\r\nadd_library(love_joystick_sdl STATIC\r\n\tsrc/modules/joystick/sdl/Joystick.cpp\r\n\tsrc/modules/joystick/sdl/Joystick.h\r\n\tsrc/modules/joystick/sdl/JoystickModule.cpp\r\n\tsrc/modules/joystick/sdl/JoystickModule.h\r\n)\r\ntarget_link_libraries(love_joystick_sdl PUBLIC\r\n\tlovedep::SDL\r\n)\r\n\r\nadd_library(love_joystick INTERFACE)\r\ntarget_link_libraries(love_joystick INTERFACE\r\n\tlove_joystick_root\r\n\tlove_joystick_sdl\r\n)\r\n\r\n#\r\n# love.keyboard\r\n#\r\n\r\nadd_library(love_keyboard_root STATIC\r\n\tsrc/modules/keyboard/Keyboard.cpp\r\n\tsrc/modules/keyboard/Keyboard.h\r\n\tsrc/modules/keyboard/wrap_Keyboard.cpp\r\n\tsrc/modules/keyboard/wrap_Keyboard.h\r\n)\r\ntarget_link_libraries(love_keyboard_root PUBLIC\r\n\tlovedep::Lua\r\n\tlovedep::SDL\r\n)\r\n\r\nadd_library(love_keyboard_sdl STATIC\r\n\tsrc/modules/keyboard/sdl/Keyboard.cpp\r\n\tsrc/modules/keyboard/sdl/Keyboard.h\r\n)\r\ntarget_link_libraries(love_keyboard_sdl PUBLIC\r\n\tlovedep::SDL\r\n)\r\n\r\nadd_library(love_keyboard INTERFACE)\r\ntarget_link_libraries(love_keyboard INTERFACE\r\n\tlove_keyboard_root\r\n\tlove_keyboard_sdl\r\n)\r\n\r\n#\r\n# love.math\r\n#\r\n\r\nadd_library(love_math STATIC\r\n\tsrc/modules/math/BezierCurve.cpp\r\n\tsrc/modules/math/BezierCurve.h\r\n\tsrc/modules/math/MathModule.cpp\r\n\tsrc/modules/math/MathModule.h\r\n\tsrc/modules/math/RandomGenerator.cpp\r\n\tsrc/modules/math/RandomGenerator.h\r\n\tsrc/modules/math/Transform.cpp\r\n\tsrc/modules/math/Transform.h\r\n\tsrc/modules/math/wrap_BezierCurve.cpp\r\n\tsrc/modules/math/wrap_BezierCurve.h\r\n\tsrc/modules/math/wrap_Math.cpp\r\n\tsrc/modules/math/wrap_Math.h\r\n\tsrc/modules/math/wrap_Math.lua\r\n\tsrc/modules/math/wrap_RandomGenerator.cpp\r\n\tsrc/modules/math/wrap_RandomGenerator.h\r\n\tsrc/modules/math/wrap_RandomGenerator.lua\r\n\tsrc/modules/math/wrap_Transform.cpp\r\n\tsrc/modules/math/wrap_Transform.h\r\n)\r\ntarget_link_libraries(love_math PUBLIC\r\n\tlovedep::Lua\r\n)\r\n\r\n#\r\n# love.mouse\r\n#\r\n\r\nadd_library(love_mouse_root STATIC\r\n\tsrc/modules/mouse/Cursor.cpp\r\n\tsrc/modules/mouse/Cursor.h\r\n\tsrc/modules/mouse/Mouse.h\r\n\tsrc/modules/mouse/wrap_Cursor.cpp\r\n\tsrc/modules/mouse/wrap_Cursor.h\r\n\tsrc/modules/mouse/wrap_Mouse.cpp\r\n\tsrc/modules/mouse/wrap_Mouse.h\r\n)\r\ntarget_link_libraries(love_mouse_root PUBLIC\r\n\tlovedep::Lua\r\n\tlovedep::SDL\r\n)\r\n\r\nadd_library(love_mouse_sdl STATIC\r\n\tsrc/modules/mouse/sdl/Cursor.cpp\r\n\tsrc/modules/mouse/sdl/Cursor.h\r\n\tsrc/modules/mouse/sdl/Mouse.cpp\r\n\tsrc/modules/mouse/sdl/Mouse.h\r\n)\r\ntarget_link_libraries(love_mouse_sdl PUBLIC\r\n\tlovedep::SDL\r\n)\r\n\r\nadd_library(love_mouse INTERFACE)\r\ntarget_link_libraries(love_mouse INTERFACE\r\n\tlove_mouse_root\r\n\tlove_mouse_sdl\r\n)\r\n\r\n#\r\n# love.physics\r\n#\r\n\r\nadd_library(love_physics_root STATIC\r\n\tsrc/modules/physics/Body.cpp\r\n\tsrc/modules/physics/Body.h\r\n\tsrc/modules/physics/Joint.cpp\r\n\tsrc/modules/physics/Joint.h\r\n\tsrc/modules/physics/Shape.cpp\r\n\tsrc/modules/physics/Shape.h\r\n)\r\n\r\nadd_library(love_physics_box2d STATIC\r\n\tsrc/modules/physics/box2d/Body.cpp\r\n\tsrc/modules/physics/box2d/Body.h\r\n\tsrc/modules/physics/box2d/ChainShape.cpp\r\n\tsrc/modules/physics/box2d/ChainShape.h\r\n\tsrc/modules/physics/box2d/CircleShape.cpp\r\n\tsrc/modules/physics/box2d/CircleShape.h\r\n\tsrc/modules/physics/box2d/Contact.cpp\r\n\tsrc/modules/physics/box2d/Contact.h\r\n\tsrc/modules/physics/box2d/DistanceJoint.cpp\r\n\tsrc/modules/physics/box2d/DistanceJoint.h\r\n\tsrc/modules/physics/box2d/EdgeShape.cpp\r\n\tsrc/modules/physics/box2d/EdgeShape.h\r\n\tsrc/modules/physics/box2d/FrictionJoint.cpp\r\n\tsrc/modules/physics/box2d/FrictionJoint.h\r\n\tsrc/modules/physics/box2d/GearJoint.cpp\r\n\tsrc/modules/physics/box2d/GearJoint.h\r\n\tsrc/modules/physics/box2d/Joint.cpp\r\n\tsrc/modules/physics/box2d/Joint.h\r\n\tsrc/modules/physics/box2d/MotorJoint.cpp\r\n\tsrc/modules/physics/box2d/MotorJoint.h\r\n\tsrc/modules/physics/box2d/MouseJoint.cpp\r\n\tsrc/modules/physics/box2d/MouseJoint.h\r\n\tsrc/modules/physics/box2d/Physics.cpp\r\n\tsrc/modules/physics/box2d/Physics.h\r\n\tsrc/modules/physics/box2d/PolygonShape.cpp\r\n\tsrc/modules/physics/box2d/PolygonShape.h\r\n\tsrc/modules/physics/box2d/PrismaticJoint.cpp\r\n\tsrc/modules/physics/box2d/PrismaticJoint.h\r\n\tsrc/modules/physics/box2d/PulleyJoint.cpp\r\n\tsrc/modules/physics/box2d/PulleyJoint.h\r\n\tsrc/modules/physics/box2d/RevoluteJoint.cpp\r\n\tsrc/modules/physics/box2d/RevoluteJoint.h\r\n\tsrc/modules/physics/box2d/RopeJoint.cpp\r\n\tsrc/modules/physics/box2d/RopeJoint.h\r\n\tsrc/modules/physics/box2d/Shape.cpp\r\n\tsrc/modules/physics/box2d/Shape.h\r\n\tsrc/modules/physics/box2d/WeldJoint.cpp\r\n\tsrc/modules/physics/box2d/WeldJoint.h\r\n\tsrc/modules/physics/box2d/WheelJoint.cpp\r\n\tsrc/modules/physics/box2d/WheelJoint.h\r\n\tsrc/modules/physics/box2d/World.cpp\r\n\tsrc/modules/physics/box2d/World.h\r\n\tsrc/modules/physics/box2d/wrap_Body.cpp\r\n\tsrc/modules/physics/box2d/wrap_Body.h\r\n\tsrc/modules/physics/box2d/wrap_ChainShape.cpp\r\n\tsrc/modules/physics/box2d/wrap_ChainShape.h\r\n\tsrc/modules/physics/box2d/wrap_CircleShape.cpp\r\n\tsrc/modules/physics/box2d/wrap_CircleShape.h\r\n\tsrc/modules/physics/box2d/wrap_Contact.cpp\r\n\tsrc/modules/physics/box2d/wrap_Contact.h\r\n\tsrc/modules/physics/box2d/wrap_DistanceJoint.cpp\r\n\tsrc/modules/physics/box2d/wrap_DistanceJoint.h\r\n\tsrc/modules/physics/box2d/wrap_EdgeShape.cpp\r\n\tsrc/modules/physics/box2d/wrap_EdgeShape.h\r\n\tsrc/modules/physics/box2d/wrap_FrictionJoint.cpp\r\n\tsrc/modules/physics/box2d/wrap_FrictionJoint.h\r\n\tsrc/modules/physics/box2d/wrap_GearJoint.cpp\r\n\tsrc/modules/physics/box2d/wrap_GearJoint.h\r\n\tsrc/modules/physics/box2d/wrap_Joint.cpp\r\n\tsrc/modules/physics/box2d/wrap_Joint.h\r\n\tsrc/modules/physics/box2d/wrap_MotorJoint.cpp\r\n\tsrc/modules/physics/box2d/wrap_MotorJoint.h\r\n\tsrc/modules/physics/box2d/wrap_MouseJoint.cpp\r\n\tsrc/modules/physics/box2d/wrap_MouseJoint.h\r\n\tsrc/modules/physics/box2d/wrap_Physics.cpp\r\n\tsrc/modules/physics/box2d/wrap_Physics.h\r\n\tsrc/modules/physics/box2d/wrap_PolygonShape.cpp\r\n\tsrc/modules/physics/box2d/wrap_PolygonShape.h\r\n\tsrc/modules/physics/box2d/wrap_PrismaticJoint.cpp\r\n\tsrc/modules/physics/box2d/wrap_PrismaticJoint.h\r\n\tsrc/modules/physics/box2d/wrap_PulleyJoint.cpp\r\n\tsrc/modules/physics/box2d/wrap_PulleyJoint.h\r\n\tsrc/modules/physics/box2d/wrap_RevoluteJoint.cpp\r\n\tsrc/modules/physics/box2d/wrap_RevoluteJoint.h\r\n\tsrc/modules/physics/box2d/wrap_RopeJoint.cpp\r\n\tsrc/modules/physics/box2d/wrap_RopeJoint.h\r\n\tsrc/modules/physics/box2d/wrap_Shape.cpp\r\n\tsrc/modules/physics/box2d/wrap_Shape.h\r\n\tsrc/modules/physics/box2d/wrap_WeldJoint.cpp\r\n\tsrc/modules/physics/box2d/wrap_WeldJoint.h\r\n\tsrc/modules/physics/box2d/wrap_WheelJoint.cpp\r\n\tsrc/modules/physics/box2d/wrap_WheelJoint.h\r\n\tsrc/modules/physics/box2d/wrap_World.cpp\r\n\tsrc/modules/physics/box2d/wrap_World.h\r\n)\r\ntarget_link_libraries(love_physics_box2d PUBLIC\r\n\tlovedep::Lua\r\n)\r\n\r\nadd_library(love_physics INTERFACE)\r\ntarget_link_libraries(love_physics INTERFACE\r\n\tlove_physics_root\r\n\tlove_physics_box2d\r\n)\r\n\r\n#\r\n# love.sensor\r\n#\r\n\r\nadd_library(love_sensor_root STATIC\r\n\tsrc/modules/sensor/Sensor.cpp\r\n\tsrc/modules/sensor/Sensor.h\r\n\tsrc/modules/sensor/wrap_Sensor.cpp\r\n\tsrc/modules/sensor/wrap_Sensor.h\r\n)\r\ntarget_link_libraries(love_sensor_root PUBLIC\r\n\tlovedep::Lua\r\n\tlovedep::SDL\r\n)\r\n\r\nadd_library(love_sensor_sdl STATIC\r\n\tsrc/modules/sensor/sdl/Sensor.cpp\r\n\tsrc/modules/sensor/sdl/Sensor.h\r\n)\r\ntarget_link_libraries(love_sensor_sdl PUBLIC\r\n\tlovedep::SDL\r\n)\r\n\r\nadd_library(love_sensor INTERFACE)\r\ntarget_link_libraries(love_sensor INTERFACE\r\n\tlove_sensor_root\r\n\tlove_sensor_sdl\r\n)\r\n\r\n#\r\n# love.sound\r\n#\r\n\r\nadd_library(love_sound_root STATIC\r\n\tsrc/modules/sound/Decoder.cpp\r\n\tsrc/modules/sound/Decoder.h\r\n\tsrc/modules/sound/Sound.cpp\r\n\tsrc/modules/sound/Sound.h\r\n\tsrc/modules/sound/SoundData.cpp\r\n\tsrc/modules/sound/SoundData.h\r\n\tsrc/modules/sound/wrap_Decoder.cpp\r\n\tsrc/modules/sound/wrap_Decoder.h\r\n\tsrc/modules/sound/wrap_Sound.cpp\r\n\tsrc/modules/sound/wrap_Sound.h\r\n\tsrc/modules/sound/wrap_SoundData.cpp\r\n\tsrc/modules/sound/wrap_SoundData.h\r\n\tsrc/modules/sound/wrap_SoundData.lua\r\n)\r\ntarget_link_libraries(love_sound_root PUBLIC\r\n\tlovedep::Lua\r\n)\r\n\r\nadd_library(love_sound_lullaby STATIC\r\n\tsrc/modules/sound/lullaby/FLACDecoder.cpp\r\n\tsrc/modules/sound/lullaby/FLACDecoder.h\r\n\tsrc/modules/sound/lullaby/ModPlugDecoder.cpp\r\n\tsrc/modules/sound/lullaby/ModPlugDecoder.h\r\n\tsrc/modules/sound/lullaby/MP3Decoder.h\r\n\tsrc/modules/sound/lullaby/MP3Decoder.cpp\r\n\tsrc/modules/sound/lullaby/Sound.cpp\r\n\tsrc/modules/sound/lullaby/Sound.h\r\n\tsrc/modules/sound/lullaby/VorbisDecoder.cpp\r\n\tsrc/modules/sound/lullaby/VorbisDecoder.h\r\n\tsrc/modules/sound/lullaby/WaveDecoder.cpp\r\n\tsrc/modules/sound/lullaby/WaveDecoder.h\r\n)\r\ntarget_link_libraries(love_sound_lullaby PUBLIC\r\n\tlovedep::Modplug\r\n\tlovedep::Vorbis\r\n\tlovedep::Ogg\r\n)\r\n\r\nadd_library(love_sound INTERFACE)\r\ntarget_link_libraries(love_sound INTERFACE\r\n\tlove_sound_root\r\n\tlove_sound_lullaby\r\n)\r\n\r\n#\r\n# love.system\r\n#\r\n\r\nadd_library(love_system_root STATIC\r\n\tsrc/modules/system/System.cpp\r\n\tsrc/modules/system/System.h\r\n\tsrc/modules/system/wrap_System.cpp\r\n\tsrc/modules/system/wrap_System.h\r\n)\r\ntarget_link_libraries(love_system_root PUBLIC\r\n\tlovedep::Lua\r\n\tlovedep::SDL\r\n)\r\n\r\nadd_library(love_system_sdl STATIC\r\n\tsrc/modules/system/sdl/System.cpp\r\n\tsrc/modules/system/sdl/System.h\r\n)\r\ntarget_link_libraries(love_system_sdl PUBLIC\r\n\tlovedep::SDL\r\n)\r\n\r\nadd_library(love_system INTERFACE)\r\ntarget_link_libraries(love_system INTERFACE\r\n\tlove_system_root\r\n\tlove_system_sdl\r\n)\r\n\r\n#\r\n# love.thread\r\n#\r\n\r\nadd_library(love_thread_root STATIC\r\n\tsrc/modules/thread/Channel.cpp\r\n\tsrc/modules/thread/Channel.h\r\n\tsrc/modules/thread/LuaThread.cpp\r\n\tsrc/modules/thread/LuaThread.h\r\n\tsrc/modules/thread/Thread.h\r\n\tsrc/modules/thread/ThreadModule.cpp\r\n\tsrc/modules/thread/ThreadModule.h\r\n\tsrc/modules/thread/threads.cpp\r\n\tsrc/modules/thread/threads.h\r\n\tsrc/modules/thread/wrap_Channel.cpp\r\n\tsrc/modules/thread/wrap_Channel.h\r\n\tsrc/modules/thread/wrap_LuaThread.cpp\r\n\tsrc/modules/thread/wrap_LuaThread.h\r\n\tsrc/modules/thread/wrap_ThreadModule.cpp\r\n\tsrc/modules/thread/wrap_ThreadModule.h\r\n)\r\ntarget_link_libraries(love_thread_root PUBLIC\r\n\tlovedep::Lua\r\n)\r\n\r\nadd_library(love_thread_sdl STATIC\r\n\tsrc/modules/thread/sdl/Thread.cpp\r\n\tsrc/modules/thread/sdl/Thread.h\r\n\tsrc/modules/thread/sdl/threads.cpp\r\n\tsrc/modules/thread/sdl/threads.h\r\n)\r\ntarget_link_libraries(love_thread_sdl PUBLIC\r\n\tlovedep::SDL\r\n)\r\n\r\nadd_library(love_thread INTERFACE)\r\ntarget_link_libraries(love_thread INTERFACE\r\n\tlove_thread_root\r\n\tlove_thread_sdl\r\n)\r\n\r\n#\r\n# love.timer\r\n#\r\n\r\nadd_library(love_timer STATIC\r\n\tsrc/modules/timer/Timer.cpp\r\n\tsrc/modules/timer/Timer.h\r\n\tsrc/modules/timer/wrap_Timer.cpp\r\n\tsrc/modules/timer/wrap_Timer.h\r\n)\r\ntarget_link_libraries(love_timer PUBLIC\r\n\tlovedep::Lua\r\n)\r\n\r\n#\r\n# love.touch\r\n#\r\n\r\nadd_library(love_touch_root STATIC\r\n\tsrc/modules/touch/Touch.cpp\r\n\tsrc/modules/touch/Touch.h\r\n\tsrc/modules/touch/wrap_Touch.cpp\r\n\tsrc/modules/touch/wrap_Touch.h\r\n)\r\ntarget_link_libraries(love_touch_root PUBLIC\r\n\tlovedep::Lua\r\n\tlovedep::SDL\r\n)\r\n\r\nadd_library(love_touch_sdl STATIC\r\n\tsrc/modules/touch/sdl/Touch.cpp\r\n\tsrc/modules/touch/sdl/Touch.h\r\n)\r\ntarget_link_libraries(love_touch_sdl PUBLIC\r\n\tlovedep::SDL\r\n)\r\n\r\nadd_library(love_touch INTERFACE)\r\ntarget_link_libraries(love_touch INTERFACE\r\n\tlove_touch_root\r\n\tlove_touch_sdl\r\n)\r\n#\r\n# love.video\r\n#\r\n\r\nadd_library(love_video_root STATIC\r\n\tsrc/modules/video/Video.h\r\n\tsrc/modules/video/VideoStream.cpp\r\n\tsrc/modules/video/VideoStream.h\r\n\tsrc/modules/video/wrap_Video.cpp\r\n\tsrc/modules/video/wrap_Video.h\r\n\tsrc/modules/video/wrap_VideoStream.cpp\r\n\tsrc/modules/video/wrap_VideoStream.h\r\n)\r\ntarget_link_libraries(love_video_root PUBLIC\r\n\tlovedep::Lua\r\n\tlovedep::Theora\r\n\tlovedep::Ogg\r\n)\r\n\r\nadd_library(love_video_theora STATIC\r\n\tsrc/modules/video/theora/Video.cpp\r\n\tsrc/modules/video/theora/Video.h\r\n\tsrc/modules/video/theora/OggDemuxer.cpp\r\n\tsrc/modules/video/theora/OggDemuxer.h\r\n\tsrc/modules/video/theora/TheoraVideoStream.cpp\r\n\tsrc/modules/video/theora/TheoraVideoStream.h\r\n)\r\ntarget_link_libraries(love_video_theora PUBLIC\r\n\tlovedep::Theora\r\n\tlovedep::Ogg\r\n)\r\n\r\nadd_library(love_video INTERFACE)\r\ntarget_link_libraries(love_video INTERFACE\r\n\tlove_video_root\r\n\tlove_video_theora\r\n)\r\n\r\n#\r\n# love.window\r\n#\r\n\r\nadd_library(love_window_root STATIC\r\n\tsrc/modules/window/Window.cpp\r\n\tsrc/modules/window/Window.h\r\n\tsrc/modules/window/wrap_Window.cpp\r\n\tsrc/modules/window/wrap_Window.h\r\n)\r\ntarget_link_libraries(love_window_root PUBLIC\r\n\tlovedep::Lua\r\n\tlovedep::SDL\r\n)\r\n\r\nadd_library(love_window_sdl STATIC\r\n\tsrc/modules/window/sdl/Window.cpp\r\n\tsrc/modules/window/sdl/Window.h\r\n)\r\ntarget_link_libraries(love_window_sdl PUBLIC\r\n\tlovedep::SDL\r\n)\r\n\r\nadd_library(love_window INTERFACE)\r\ntarget_link_libraries(love_window INTERFACE\r\n\tlove_window_root\r\n\tlove_window_sdl\r\n)\r\n\r\n###################################\r\n# Third-party libraries\r\n###################################\r\n\r\n#\r\n# Box2D\r\n#\r\n\r\nadd_library(love_3p_box2d\r\n\tsrc/libraries/box2d/Box2D.h\r\n\tsrc/libraries/box2d/collision/b2_broad_phase.cpp\r\n\tsrc/libraries/box2d/collision/b2_chain_shape.cpp\r\n\tsrc/libraries/box2d/collision/b2_circle_shape.cpp\r\n\tsrc/libraries/box2d/collision/b2_collide_circle.cpp\r\n\tsrc/libraries/box2d/collision/b2_collide_edge.cpp\r\n\tsrc/libraries/box2d/collision/b2_collide_polygon.cpp\r\n\tsrc/libraries/box2d/collision/b2_collision.cpp\r\n\tsrc/libraries/box2d/collision/b2_distance.cpp\r\n\tsrc/libraries/box2d/collision/b2_dynamic_tree.cpp\r\n\tsrc/libraries/box2d/collision/b2_edge_shape.cpp\r\n\tsrc/libraries/box2d/collision/b2_polygon_shape.cpp\r\n\tsrc/libraries/box2d/collision/b2_time_of_impact.cpp\r\n\tsrc/libraries/box2d/common/b2_block_allocator.cpp\r\n\tsrc/libraries/box2d/common/b2_draw.cpp\r\n\tsrc/libraries/box2d/common/b2_math.cpp\r\n\tsrc/libraries/box2d/common/b2_settings.cpp\r\n\tsrc/libraries/box2d/common/b2_stack_allocator.cpp\r\n\tsrc/libraries/box2d/common/b2_timer.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_body.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_chain_circle_contact.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_chain_circle_contact.h\r\n\tsrc/libraries/box2d/dynamics/b2_chain_polygon_contact.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_chain_polygon_contact.h\r\n\tsrc/libraries/box2d/dynamics/b2_circle_contact.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_circle_contact.h\r\n\tsrc/libraries/box2d/dynamics/b2_contact.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_contact_manager.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_contact_solver.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_contact_solver.h\r\n\tsrc/libraries/box2d/dynamics/b2_distance_joint.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_edge_circle_contact.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_edge_circle_contact.h\r\n\tsrc/libraries/box2d/dynamics/b2_edge_polygon_contact.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_edge_polygon_contact.h\r\n\tsrc/libraries/box2d/dynamics/b2_fixture.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_friction_joint.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_gear_joint.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_island.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_island.h\r\n\tsrc/libraries/box2d/dynamics/b2_joint.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_motor_joint.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_mouse_joint.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_polygon_circle_contact.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_polygon_circle_contact.h\r\n\tsrc/libraries/box2d/dynamics/b2_polygon_contact.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_polygon_contact.h\r\n\tsrc/libraries/box2d/dynamics/b2_prismatic_joint.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_pulley_joint.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_revolute_joint.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_weld_joint.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_wheel_joint.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_world.cpp\r\n\tsrc/libraries/box2d/dynamics/b2_world_callbacks.cpp\r\n\tsrc/libraries/box2d/rope/b2_rope.cpp\r\n)\r\nlove_disable_warnings(love_3p_box2d)\r\n\r\n#\r\n# ddsparse\r\n#\r\n\r\nadd_library(love_3p_ddsparse\r\n\tsrc/libraries/ddsparse/ddsinfo.h\r\n\tsrc/libraries/ddsparse/ddsparse.cpp\r\n\tsrc/libraries/ddsparse/ddsparse.h\r\n)\r\n\r\n#\r\n# dr_flac\r\n#\r\n\r\n# dr_flac has no implementation files of its own.\r\n#add_library(love_3p_drflac\r\n#\tsrc/libraries/dr/dr_flac.h\r\n#)\r\n\r\n#\r\n# dr_mp3\r\n#\r\n\r\n# dr_mp3 has no implementation files of its own.\r\n#add_library(love_3p_drmp3\r\n#\tsrc/libraries/dr/dr_mp3.h\r\n#)\r\n\r\n#\r\n# enet\r\n#\r\n\r\nadd_library(love_3p_enet\r\n\tsrc/libraries/enet/enet.cpp\r\n\tsrc/libraries/enet/lua-enet.h\r\n\tsrc/libraries/enet/libenet/callbacks.c\r\n\tsrc/libraries/enet/libenet/compress.c\r\n\tsrc/libraries/enet/libenet/host.c\r\n\tsrc/libraries/enet/libenet/list.c\r\n\tsrc/libraries/enet/libenet/packet.c\r\n\tsrc/libraries/enet/libenet/peer.c\r\n\tsrc/libraries/enet/libenet/protocol.c\r\n\tsrc/libraries/enet/libenet/unix.c\r\n\tsrc/libraries/enet/libenet/win32.c\r\n\tsrc/libraries/enet/libenet/include/enet/enet.h\r\n\tsrc/libraries/enet/libenet/include/enet/list.h\r\n\tsrc/libraries/enet/libenet/include/enet/protocol.h\r\n\tsrc/libraries/enet/libenet/include/enet/time.h\r\n\tsrc/libraries/enet/libenet/include/enet/types.h\r\n\tsrc/libraries/enet/libenet/include/enet/unix.h\r\n\tsrc/libraries/enet/libenet/include/enet/utility.h\r\n\tsrc/libraries/enet/libenet/include/enet/win32.h\r\n)\r\nlove_disable_warnings(love_3p_enet)\r\ntarget_link_libraries(love_3p_enet lovedep::Lua)\r\ntarget_include_directories(love_3p_enet PUBLIC src/libraries/enet/libenet/include)\r\nif(MINGW)\r\n\ttarget_link_libraries(love_3p_enet winmm.a)\r\nendif()\r\n\r\n#\r\n# GLAD\r\n#\r\n\r\nadd_library(love_3p_glad\r\n\tsrc/libraries/glad/glad.cpp\r\n\tsrc/libraries/glad/glad.hpp\r\n\tsrc/libraries/glad/gladfuncs.hpp\r\n)\r\n\r\n#\r\n# glslang\r\n#\r\n\r\nadd_library(love_3p_glslang\r\n\tsrc/libraries/glslang/glslang/build_info.h\r\n\tsrc/libraries/glslang/glslang/GenericCodeGen/CodeGen.cpp\r\n\tsrc/libraries/glslang/glslang/GenericCodeGen/Link.cpp\r\n\tsrc/libraries/glslang/glslang/Include/arrays.h\r\n\tsrc/libraries/glslang/glslang/Include/BaseTypes.h\r\n\tsrc/libraries/glslang/glslang/Include/Common.h\r\n\tsrc/libraries/glslang/glslang/Include/ConstantUnion.h\r\n\tsrc/libraries/glslang/glslang/Include/InfoSink.h\r\n\tsrc/libraries/glslang/glslang/Include/InitializeGlobals.h\r\n\tsrc/libraries/glslang/glslang/Include/intermediate.h\r\n\tsrc/libraries/glslang/glslang/Include/PoolAlloc.h\r\n\tsrc/libraries/glslang/glslang/Include/ResourceLimits.h\r\n\tsrc/libraries/glslang/glslang/Include/ShHandle.h\r\n\tsrc/libraries/glslang/glslang/Include/SpirvIntrinsics.h\r\n\tsrc/libraries/glslang/glslang/Include/Types.h\r\n\tsrc/libraries/glslang/glslang/Include/visibility.h\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/preprocessor/Pp.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/preprocessor/PpAtom.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/preprocessor/PpContext.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/preprocessor/PpContext.h\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/preprocessor/PpScanner.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/preprocessor/PpTokens.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/preprocessor/PpTokens.h\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/attribute.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/attribute.h\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/Constant.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/gl_types.h\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/glslang_tab.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/glslang_tab.cpp.h\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/InfoSink.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/Initialize.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/Initialize.h\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/Intermediate.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/intermOut.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/IntermTraverse.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/iomapper.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/iomapper.h\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/limits.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/linkValidate.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/LiveTraverser.h\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/localintermediate.h\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/parseConst.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/ParseContextBase.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/ParseHelper.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/ParseHelper.h\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/parseVersions.h\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/pch.h\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/PoolAlloc.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/propagateNoContraction.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/propagateNoContraction.h\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/reflection.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/reflection.h\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/RemoveTree.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/RemoveTree.h\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/Scan.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/Scan.h\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/ScanContext.h\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/ShaderLang.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/span.h\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/SpirvIntrinsics.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/SymbolTable.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/SymbolTable.h\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/Versions.cpp\r\n\tsrc/libraries/glslang/glslang/MachineIndependent/Versions.h\r\n\tsrc/libraries/glslang/glslang/OSDependent/osinclude.h\r\n\tsrc/libraries/glslang/glslang/Public/ResourceLimits.h\r\n\tsrc/libraries/glslang/glslang/Public/ShaderLang.h\r\n\tsrc/libraries/glslang/glslang/ResourceLimits/ResourceLimits.cpp\r\n\tsrc/libraries/glslang/SPIRV/bitutils.h\r\n\tsrc/libraries/glslang/SPIRV/disassemble.cpp\r\n\tsrc/libraries/glslang/SPIRV/disassemble.h\r\n\tsrc/libraries/glslang/SPIRV/doc.cpp\r\n\tsrc/libraries/glslang/SPIRV/doc.h\r\n\tsrc/libraries/glslang/SPIRV/GLSL.ext.AMD.h\r\n\tsrc/libraries/glslang/SPIRV/GLSL.ext.ARM.h\r\n\tsrc/libraries/glslang/SPIRV/GLSL.ext.EXT.h\r\n\tsrc/libraries/glslang/SPIRV/GLSL.ext.KHR.h\r\n\tsrc/libraries/glslang/SPIRV/GLSL.ext.NV.h\r\n\tsrc/libraries/glslang/SPIRV/GLSL.ext.QCOM.h\r\n\tsrc/libraries/glslang/SPIRV/GLSL.std.450.h\r\n\tsrc/libraries/glslang/SPIRV/GlslangToSpv.cpp\r\n\tsrc/libraries/glslang/SPIRV/GlslangToSpv.h\r\n\tsrc/libraries/glslang/SPIRV/hex_float.h\r\n\tsrc/libraries/glslang/SPIRV/InReadableOrder.cpp\r\n\tsrc/libraries/glslang/SPIRV/Logger.cpp\r\n\tsrc/libraries/glslang/SPIRV/Logger.h\r\n\tsrc/libraries/glslang/SPIRV/NonSemanticDebugPrintf.h\r\n\tsrc/libraries/glslang/SPIRV/NonSemanticShaderDebugInfo100.h\r\n\tsrc/libraries/glslang/SPIRV/spirv.hpp11\r\n\tsrc/libraries/glslang/SPIRV/SpvBuilder.cpp\r\n\tsrc/libraries/glslang/SPIRV/SpvBuilder.h\r\n\tsrc/libraries/glslang/SPIRV/spvIR.h\r\n\tsrc/libraries/glslang/SPIRV/spvUtil.h\r\n\tsrc/libraries/glslang/SPIRV/SpvPostProcess.cpp\r\n\tsrc/libraries/glslang/SPIRV/SPVRemapper.cpp\r\n\tsrc/libraries/glslang/SPIRV/SPVRemapper.h\r\n\tsrc/libraries/glslang/SPIRV/SpvTools.cpp\r\n\tsrc/libraries/glslang/SPIRV/SpvTools.h\r\n)\r\n\r\nif(MSVC OR MINGW)\r\n\ttarget_sources(love_3p_glslang PRIVATE\r\n\t\tsrc/libraries/glslang/glslang/OSDependent/Windows/ossource.cpp\r\n\t)\r\nelse()\r\n\ttarget_sources(love_3p_glslang PRIVATE\r\n\t\tsrc/libraries/glslang/glslang/OSDependent/Unix/ossource.cpp\r\n\t)\r\nendif()\r\n\r\n#\r\n# LodePNG\r\n#\r\n\r\nadd_library(love_3p_lodepng\r\n\tsrc/libraries/lodepng/lodepng.cpp\r\n\tsrc/libraries/lodepng/lodepng.h\r\n)\r\n\r\n#\r\n# luasocket\r\n#\r\n\r\nif(MINGW)\r\n\tset(WIN32_LIB_EXT .a)\r\nelse()\r\n\tset(WIN32_LIB_EXT .lib)\r\nendif()\r\n\r\nadd_library(love_3p_luasocket\r\n\tsrc/libraries/luasocket/luasocket.cpp\r\n\tsrc/libraries/luasocket/luasocket.h\r\n\tsrc/libraries/luasocket/libluasocket/auxiliar.c\r\n\tsrc/libraries/luasocket/libluasocket/auxiliar.h\r\n\tsrc/libraries/luasocket/libluasocket/buffer.c\r\n\tsrc/libraries/luasocket/libluasocket/buffer.h\r\n\tsrc/libraries/luasocket/libluasocket/compat.c\r\n\tsrc/libraries/luasocket/libluasocket/compat.h\r\n\tsrc/libraries/luasocket/libluasocket/except.c\r\n\tsrc/libraries/luasocket/libluasocket/except.h\r\n\tsrc/libraries/luasocket/libluasocket/ftp.lua.h\r\n\tsrc/libraries/luasocket/libluasocket/headers.lua.h\r\n\tsrc/libraries/luasocket/libluasocket/http.lua.h\r\n\tsrc/libraries/luasocket/libluasocket/inet.c\r\n\tsrc/libraries/luasocket/libluasocket/inet.h\r\n\tsrc/libraries/luasocket/libluasocket/io.c\r\n\tsrc/libraries/luasocket/libluasocket/io.h\r\n\tsrc/libraries/luasocket/libluasocket/ltn12.lua.h\r\n\tsrc/libraries/luasocket/libluasocket/luasocket.c\r\n\tsrc/libraries/luasocket/libluasocket/luasocket.h\r\n\tsrc/libraries/luasocket/libluasocket/mbox.lua.h\r\n\tsrc/libraries/luasocket/libluasocket/mime.c\r\n\tsrc/libraries/luasocket/libluasocket/mime.h\r\n\tsrc/libraries/luasocket/libluasocket/mime.lua.h\r\n\tsrc/libraries/luasocket/libluasocket/options.c\r\n\tsrc/libraries/luasocket/libluasocket/options.h\r\n\tsrc/libraries/luasocket/libluasocket/pierror.h\r\n\tsrc/libraries/luasocket/libluasocket/select.c\r\n\tsrc/libraries/luasocket/libluasocket/select.h\r\n\tsrc/libraries/luasocket/libluasocket/smtp.lua.h\r\n\tsrc/libraries/luasocket/libluasocket/socket.h\r\n\tsrc/libraries/luasocket/libluasocket/socket.lua.h\r\n\tsrc/libraries/luasocket/libluasocket/tcp.c\r\n\tsrc/libraries/luasocket/libluasocket/tcp.h\r\n\tsrc/libraries/luasocket/libluasocket/timeout.c\r\n\tsrc/libraries/luasocket/libluasocket/timeout.h\r\n\tsrc/libraries/luasocket/libluasocket/tp.lua.h\r\n\tsrc/libraries/luasocket/libluasocket/udp.c\r\n\tsrc/libraries/luasocket/libluasocket/udp.h\r\n\tsrc/libraries/luasocket/libluasocket/url.lua.h\r\n\tsrc/libraries/luasocket/libluasocket/unix.c\r\n\tsrc/libraries/luasocket/libluasocket/unix.h\r\n\tsrc/libraries/luasocket/libluasocket/unixdgram.c\r\n\tsrc/libraries/luasocket/libluasocket/unixdgram.h\r\n\tsrc/libraries/luasocket/libluasocket/unixstream.c\r\n\tsrc/libraries/luasocket/libluasocket/unixstream.h\r\n)\r\ntarget_link_libraries(love_3p_luasocket lovedep::Lua)\r\nlove_disable_warnings(love_3p_luasocket)\r\n\r\nif(MSVC OR MINGW)\r\n\ttarget_sources(love_3p_luasocket PRIVATE\r\n\t\tsrc/libraries/luasocket/libluasocket/wsocket.c\r\n\t\tsrc/libraries/luasocket/libluasocket/wsocket.h\r\n\t)\r\n\r\n\ttarget_link_libraries(love_3p_luasocket\r\n\t\tws2_32${WIN32_LIB_EXT}\r\n\t)\r\nelse()\r\n\ttarget_sources(love_3p_luasocket PRIVATE\r\n\t\tsrc/libraries/luasocket/libluasocket/serial.c\r\n\t\tsrc/libraries/luasocket/libluasocket/usocket.c\r\n\t\tsrc/libraries/luasocket/libluasocket/usocket.h\r\n\t)\r\nendif()\r\n\r\n#\r\n# APIs from Lua 5.3\r\n#\r\n\r\nadd_library(love_3p_lua53\r\n\tsrc/libraries/lua53/lprefix.h\r\n\tsrc/libraries/lua53/lstrlib.c\r\n\tsrc/libraries/lua53/lstrlib.h\r\n\tsrc/libraries/lua53/lutf8lib.c\r\n\tsrc/libraries/lua53/lutf8lib.h\r\n)\r\ntarget_link_libraries(love_3p_lua53 lovedep::Lua)\r\n\r\n#\r\n# Lua HTTPS\r\n#\r\n\r\nadd_library(love_3p_luahttps\r\n\t# These are platform-dependent but have ifdef guards to make sure they only\r\n\t# compile on supported platforms.\r\n\tsrc/libraries/luahttps/src/android/AndroidClient.cpp\r\n\tsrc/libraries/luahttps/src/android/AndroidClient.h\r\n\tsrc/libraries/luahttps/src/common/config.h\r\n\tsrc/libraries/luahttps/src/common/Connection.h\r\n\tsrc/libraries/luahttps/src/common/ConnectionClient.h\r\n\tsrc/libraries/luahttps/src/common/HTTPRequest.cpp\r\n\tsrc/libraries/luahttps/src/common/HTTPRequest.h\r\n\tsrc/libraries/luahttps/src/common/HTTPS.cpp\r\n\tsrc/libraries/luahttps/src/common/HTTPS.h\r\n\tsrc/libraries/luahttps/src/common/HTTPSClient.cpp\r\n\tsrc/libraries/luahttps/src/common/HTTPSClient.h\r\n\tsrc/libraries/luahttps/src/common/LibraryLoader.h\r\n\tsrc/libraries/luahttps/src/common/PlaintextConnection.cpp\r\n\tsrc/libraries/luahttps/src/common/PlaintextConnection.h\r\n\tsrc/libraries/luahttps/src/generic/CurlClient.cpp\r\n\tsrc/libraries/luahttps/src/generic/CurlClient.h\r\n\tsrc/libraries/luahttps/src/generic/LinktimeLibraryLoader.cpp\r\n\tsrc/libraries/luahttps/src/generic/OpenSSLConnection.cpp\r\n\tsrc/libraries/luahttps/src/generic/OpenSSLConnection.h\r\n\tsrc/libraries/luahttps/src/generic/UnixLibraryLoader.cpp\r\n\tsrc/libraries/luahttps/src/lua/main.cpp\r\n\tsrc/libraries/luahttps/src/windows/SChannelConnection.cpp\r\n\tsrc/libraries/luahttps/src/windows/SChannelConnection.h\r\n\tsrc/libraries/luahttps/src/windows/WindowsLibraryLoader.cpp\r\n\tsrc/libraries/luahttps/src/windows/WinINetClient.cpp\r\n\tsrc/libraries/luahttps/src/windows/WinINetClient.h\r\n)\r\ntarget_link_libraries(love_3p_luahttps lovedep::Lua)\r\n\r\nif (APPLE)\r\n\ttarget_sources(love_3p_luahttps PRIVATE\r\n\t\tsrc/libraries/luahttps/src/apple/NSURLClient.mm\r\n\t\tsrc/libraries/luahttps/src/apple/NSURLClient.h\r\n\t)\r\n\ttarget_compile_options(love_3p_luahttps PRIVATE -fobjc-arc)\r\nendif()\r\n\r\nif(MSVC)\r\n\ttarget_link_libraries(love_3p_luahttps\r\n\t\tws2_32\r\n\t\tsecur32\r\n\t)\r\n\r\n\tif(NOT CMAKE_SYSTEM_NAME STREQUAL \"WindowsStore\")\r\n\t\ttarget_link_libraries(love_3p_luahttps\r\n\t\t\twininet\r\n\t\t)\r\n\tendif()\r\nendif()\r\n\r\n#\r\n# lz4\r\n#\r\n\r\nadd_library(love_3p_lz4\r\n\tsrc/libraries/lz4/lz4.c\r\n\tsrc/libraries/lz4/lz4.h\r\n\tsrc/libraries/lz4/lz4hc.c\r\n\tsrc/libraries/lz4/lz4hc.h\r\n\tsrc/libraries/lz4/lz4opt.h\r\n)\r\n\r\n#\r\n# noise1234\r\n#\r\n\r\nadd_library(love_3p_noise1234\r\n\tsrc/libraries/noise1234/noise1234.cpp\r\n\tsrc/libraries/noise1234/noise1234.h\r\n\tsrc/libraries/noise1234/simplexnoise1234.cpp\r\n\tsrc/libraries/noise1234/simplexnoise1234.h\r\n)\r\n\r\n#\r\n# physfs\r\n#\r\n\r\nadd_library(love_3p_physfs\r\n\tsrc/libraries/physfs/physfs_archiver_7z.c\r\n\tsrc/libraries/physfs/physfs_archiver_dir.c\r\n\tsrc/libraries/physfs/physfs_archiver_grp.c\r\n\tsrc/libraries/physfs/physfs_archiver_hog.c\r\n\tsrc/libraries/physfs/physfs_archiver_iso9660.c\r\n\tsrc/libraries/physfs/physfs_archiver_mvl.c\r\n\tsrc/libraries/physfs/physfs_archiver_qpak.c\r\n\tsrc/libraries/physfs/physfs_archiver_slb.c\r\n\tsrc/libraries/physfs/physfs_archiver_unpacked.c\r\n\tsrc/libraries/physfs/physfs_archiver_vdf.c\r\n\tsrc/libraries/physfs/physfs_archiver_wad.c\r\n\tsrc/libraries/physfs/physfs_archiver_zip.c\r\n\tsrc/libraries/physfs/physfs_byteorder.c\r\n\tsrc/libraries/physfs/physfs_casefolding.h\r\n\tsrc/libraries/physfs/physfs_internal.h\r\n\tsrc/libraries/physfs/physfs_lzmasdk.h\r\n\tsrc/libraries/physfs/physfs_miniz.h\r\n\tsrc/libraries/physfs/physfs_platform_android.c\r\n\tsrc/libraries/physfs/physfs_platform_haiku.cpp\r\n\tsrc/libraries/physfs/physfs_platform_os2.c\r\n\tsrc/libraries/physfs/physfs_platform_posix.c\r\n\tsrc/libraries/physfs/physfs_platform_qnx.c\r\n\tsrc/libraries/physfs/physfs_platform_unix.c\r\n\tsrc/libraries/physfs/physfs_platform_windows.c\r\n\tsrc/libraries/physfs/physfs_platform_winrt.cpp\r\n\tsrc/libraries/physfs/physfs_platforms.h\r\n\tsrc/libraries/physfs/physfs_unicode.c\r\n\tsrc/libraries/physfs/physfs.c\r\n\tsrc/libraries/physfs/physfs.h\r\n)\r\nlove_disable_warnings(love_3p_physfs)\r\n\r\nif(APPLE)\r\n\ttarget_sources(love_3p_physfs PRIVATE\r\n\t\tsrc/libraries/physfs/physfs_platform_apple.m\r\n\t)\r\n\ttarget_link_libraries(love_3p_physfs INTERFACE\r\n\t\t\"-framework IOKit\"\r\n\t)\r\nendif()\r\n\r\n#\r\n# spirv_cross\r\n#\r\n\r\nadd_library(love_3p_spirv_cross\r\n\tsrc/libraries/spirv_cross/GLSL.std.450.h\r\n\tsrc/libraries/spirv_cross/spirv_cfg.cpp\r\n\tsrc/libraries/spirv_cross/spirv_cfg.hpp\r\n\tsrc/libraries/spirv_cross/spirv_common.hpp\r\n\tsrc/libraries/spirv_cross/spirv_cpp.cpp\r\n\tsrc/libraries/spirv_cross/spirv_cpp.hpp\r\n\tsrc/libraries/spirv_cross/spirv_cross_containers.hpp\r\n\tsrc/libraries/spirv_cross/spirv_cross_error_handling.hpp\r\n\tsrc/libraries/spirv_cross/spirv_cross_parsed_ir.cpp\r\n\tsrc/libraries/spirv_cross/spirv_cross_parsed_ir.hpp\r\n\tsrc/libraries/spirv_cross/spirv_cross_util.cpp\r\n\tsrc/libraries/spirv_cross/spirv_cross_util.hpp\r\n\tsrc/libraries/spirv_cross/spirv_cross.cpp\r\n\tsrc/libraries/spirv_cross/spirv_cross.hpp\r\n\tsrc/libraries/spirv_cross/spirv_glsl.cpp\r\n\tsrc/libraries/spirv_cross/spirv_glsl.hpp\r\n\tsrc/libraries/spirv_cross/spirv_hlsl.cpp\r\n\tsrc/libraries/spirv_cross/spirv_hlsl.hpp\r\n\tsrc/libraries/spirv_cross/spirv_msl.cpp\r\n\tsrc/libraries/spirv_cross/spirv_msl.hpp\r\n\tsrc/libraries/spirv_cross/spirv_parser.cpp\r\n\tsrc/libraries/spirv_cross/spirv_parser.hpp\r\n\tsrc/libraries/spirv_cross/spirv_reflect.cpp\r\n\tsrc/libraries/spirv_cross/spirv_reflect.hpp\r\n\tsrc/libraries/spirv_cross/spirv.hpp\r\n)\r\n\r\n#\r\n# stb_image\r\n#\r\n\r\n# stb_image has no implementation files of its own.\r\n#add_library(love_3p_stb\r\n#\tsrc/libraries/stb/stb_image.h\r\n#)\r\n\r\n#\r\n# tiny exr\r\n#\r\n\r\n# tinyexr has no implementation files of its own.\r\n#add_library(love_3p_tinyexr\r\n#\tsrc/libraries/tinyexr/tinyexr.h\r\n#)\r\n\r\n#\r\n# utf8\r\n#\r\n\r\n# This library is all headers ... so there is no need to\r\n# add_library() here.\r\n#add_library(love_3p_utf8\r\n#\tsrc/libraries/utf8/utf8.h\r\n#\tsrc/libraries/utf8/utf8/checked.h\r\n#\tsrc/libraries/utf8/utf8/core.h\r\n#\tsrc/libraries/utf8/utf8/unchecked.h\r\n#)\r\n\r\n#\r\n# vma\r\n#\r\n\r\n# vulkan memory allocatory has no implementation files of its own.\r\n#add_library(love_3p_vma\r\n#\tsrc/libraries/vma/vk_mem_alloc.h\r\n#)\r\n\r\n#\r\n# volk\r\n#\r\n\r\n# since we don't want to use the system vulkan header files we need to \r\n# compile this library in the löve source code using VOLK_IMPLEMENTATION.\r\n#add_library(love_3p_volk \r\n#\tsrc/libraries/volk/volk.h\r\n#\tsrc/libraries/volk/volk.c)\r\n\r\n#\r\n# vulkan headers\r\n#\r\n\r\n# vulkan headers has no implementation files of its own.\r\n#add_library(love_3p_vulkan_headers\r\n#\tsrc/libraries/vulkanheaders/vk_icd.h\r\n#\tsrc/libraries/vulkanheaders/vk_layer.h\r\n#\tsrc/libraries/vulkanheaders/vk_platform.h\r\n#\tsrc/libraries/vulkanheaders/vk_sdk-platform.h\r\n#\tsrc/libraries/vulkanheaders/vulkan_android.h\r\n#\tsrc/libraries/vulkanheaders/vulkan_beta.h\r\n#\tsrc/libraries/vulkanheaders/vulkan_core.h\r\n#\tsrc/libraries/vulkanheaders/vulkan_directfb.h\r\n#\tsrc/libraries/vulkanheaders/vulkan_enums.hpp\r\n#\tsrc/libraries/vulkanheaders/vulkan_format_traits.hpp\r\n#\tsrc/libraries/vulkanheaders/vulkan_fuchsia.h\r\n#\tsrc/libraries/vulkanheaders/vulkan_funcs.h\r\n#\tsrc/libraries/vulkanheaders/vulkan_ggp.h\r\n#\tsrc/libraries/vulkanheaders/vulkan_handles.h\r\n#\tsrc/libraries/vulkanheaders/vulkan_hash.hpp\r\n#\tsrc/libraries/vulkanheaders/vulkan_ios.h\r\n#\tsrc/libraries/vulkanheaders/vulkan_macos.h\r\n#\tsrc/libraries/vulkanheaders/vulkan_metal.h\r\n#\tsrc/libraries/vulkanheaders/vulkan_raii.hpp\r\n#\tsrc/libraries/vulkanheaders/vulkan_screen.h\r\n#\tsrc/libraries/vulkanheaders/vulkan_static_assertions.h\r\n#\tsrc/libraries/vulkanheaders/vulkan_structs.hpp\r\n#\tsrc/libraries/vulkanheaders/vulkan_to_string.h\r\n#\tsrc/libraries/vulkanheaders/vulkan_vi.h\r\n#\tsrc/libraries/vulkanheaders/vulkan_wayland.h\r\n#\tsrc/libraries/vulkanheaders/vulkan_win32.h\r\n#\tsrc/libraries/vulkanheaders/vulkan_xcb.h\r\n#\tsrc/libraries/vulkanheaders/vulkan_xlib_xrandr.h\r\n#\tsrc/libraries/vulkanheaders/vulkan_xlib.h\r\n#\tsrc/libraries/vulkanheaders/vulkan.h\r\n#\tsrc/libraries/vulkanheaders/vulkan.hpp\r\n#)\r\n\r\n#\r\n# Wuff\r\n#\r\n\r\nadd_library(love_3p_wuff\r\n\tsrc/libraries/Wuff/wuff.c\r\n\tsrc/libraries/Wuff/wuff.h\r\n\tsrc/libraries/Wuff/wuff_config.h\r\n\tsrc/libraries/Wuff/wuff_convert.c\r\n\tsrc/libraries/Wuff/wuff_convert.h\r\n\tsrc/libraries/Wuff/wuff_internal.c\r\n\tsrc/libraries/Wuff/wuff_internal.h\r\n\tsrc/libraries/Wuff/wuff_memory.c\r\n)\r\n\r\n#\r\n# xxHash\r\n#\r\n\r\nadd_library(love_3p_xxhash\r\n\tsrc/libraries/xxHash/xxhash.c\r\n\tsrc/libraries/xxHash/xxhash.h\r\n)\r\n\r\n#\r\n# liblove\r\n#\r\ninclude_directories(\r\n\tBEFORE\r\n\tsrc\r\n\tsrc/libraries\r\n\tsrc/libraries/box2D\r\n\tsrc/modules\r\n)\r\n\r\nif(MINGW)\r\n\t# UTF-16 flags passed to windres. windres invokes gcc as preprocessor\r\n\t# -> gcc outputs utf8, so windres must read-in codepage 65001 (utf8)\r\n\tset(CMAKE_RC_FLAGS ${CMAKE_RC_FLAGS} \"-c 65001 --preprocessor-arg=-finput-charset=UTF-16LE\")\r\nendif()\r\n\r\nadd_library(liblove SHARED\r\n\tsrc/modules/love/love.cpp\r\n\tsrc/modules/love/love.h\r\n\t# These are here so they show up in Visual Studio:\r\n\tsrc/modules/love/arg.lua\r\n\tsrc/modules/love/boot.lua\r\n\tsrc/modules/love/callbacks.lua\r\n\tsrc/modules/love/jitsetup.lua\r\n\tsrc/scripts/nogame.lua\r\n)\r\nset_target_properties(liblove PROPERTIES\r\n\tC_VISIBILITY_PRESET hidden\r\n\tCXX_VISIBILITY_PRESET hidden\r\n\tVISIBILITY_INLINES_HIDDEN ON\r\n\tLIBRARY_OUTPUT_NAME \"${LOVE_LIB_NAME}\")\r\nset(LIBLOVE_DEPENDENCIES\r\n\tlove_common\r\n\tlove_audio\r\n\tlove_data\r\n\tlove_event\r\n\tlove_filesystem\r\n\tlove_font\r\n\tlove_graphics\r\n\tlove_image\r\n\tlove_joystick\r\n\tlove_keyboard\r\n\tlove_math\r\n\tlove_mouse\r\n\tlove_physics\r\n\tlove_sensor\r\n\tlove_sound\r\n\tlove_system\r\n\tlove_thread\r\n\tlove_timer\r\n\tlove_touch\r\n\tlove_video\r\n\tlove_window\r\n)\r\nset(LIBLOVE_LIBRARIES\r\n\tlove_3p_box2d\r\n\tlove_3p_ddsparse\r\n\tlove_3p_enet\r\n\tlove_3p_glad\r\n\tlove_3p_glslang\r\n\tlove_3p_lodepng\r\n\tlove_3p_luasocket\r\n\tlove_3p_lua53\r\n\tlove_3p_luahttps\r\n\tlove_3p_lz4\r\n\tlove_3p_noise1234\r\n\tlove_3p_physfs\r\n\tlove_3p_spirv_cross\r\n\tlove_3p_wuff\r\n\tlove_3p_xxhash\r\n)\r\ntarget_link_libraries(liblove ${LIBLOVE_DEPENDENCIES} ${LIBLOVE_LIBRARIES})\r\n\r\nif(LOVE_EXTRA_DEPENDECIES)\r\n\tadd_dependencies(liblove ${LOVE_EXTRA_DEPENDECIES})\r\nendif()\r\n\r\n#\r\n# Group projects in Visual Studio\r\n#\r\n\r\nlove_group_projects(NAME \"liblove\" NESTED TARGETS ${LIBLOVE_DEPENDENCIES})\r\nlove_group_projects(NAME \"liblove/libraries\" NESTED TARGETS ${LIBLOVE_LIBRARIES})\r\nlove_group_projects(NAME \"liblove\" TARGETS liblove ${LOVE_EXTRA_DEPENDECIES})\r\n\r\nlove_group_projects(NAME \"lovedep\" TARGETS lovedep::SDL lovedep::Freetype lovedep::Harfbuzz lovedep::OpenAL lovedep::Modplug lovedep::Theora lovedep::Vorbis lovedep::Ogg lovedep::Zlib lovedep::Lua)\r\nlove_group_projects(NAME \"lovedep\" TARGETS lua51 alcommon al-excommon harfbuzz-subset zlib)\r\n\r\n\r\nif(MSVC)\r\n\tset_target_properties(liblove PROPERTIES RELEASE_OUTPUT_NAME \"love\" PDB_NAME \"liblove\" IMPORT_PREFIX \"lib\")\r\n\tset_target_properties(liblove PROPERTIES DEBUG_OUTPUT_NAME \"love\" PDB_NAME \"liblove\" IMPORT_PREFIX \"lib\")\r\nendif()\r\n\r\nif(MSVC OR MINGW)\r\n\ttarget_link_libraries(liblove\r\n\t\tws2_32${WIN32_LIB_EXT}\r\n\t\twinmm${WIN32_LIB_EXT}\r\n\t\tdwmapi${WIN32_LIB_EXT}\r\n\t)\r\n\r\n\ttarget_sources(liblove PUBLIC\r\n\t\textra/windows/love.rc\r\n\t\textra/windows/love.ico\r\n\t)\r\nendif()\r\n\r\n#\r\n# love (executable)\r\n#\r\nif(ANDROID)\r\n\tadd_library(love SHARED) # On Android, the LOVE main entrypoint needs to be compiled as shared library\r\n\ttarget_link_libraries(liblove android)\r\nelse()\r\n\tadd_executable(love WIN32)\r\nendif()\r\n\r\ntarget_sources(love PRIVATE src/love.cpp)\r\ntarget_link_libraries(love liblove)\r\nset_target_properties(love PROPERTIES\r\n\tC_VISIBILITY_PRESET hidden\r\n\tCXX_VISIBILITY_PRESET hidden\r\n\tVISIBILITY_INLINES_HIDDEN ON\r\n\tOUTPUT_NAME ${LOVE_EXE_NAME})\r\n\r\nif(MSVC OR MINGW)\r\n\tadd_executable(lovec src/love.cpp)\r\n\ttarget_link_libraries(lovec liblove)\r\n\tset_target_properties(lovec PROPERTIES\r\n\t\tOUTPUT_NAME ${LOVE_CONSOLE_EXE_NAME})\r\nendif()\r\n\r\nfunction(post_step_move_dll ARG_POST_TARGET ARG_TARGET_OR_FILE)\r\n\tif(TARGET ${ARG_TARGET_OR_FILE})\r\n\t\tadd_custom_command(TARGET ${ARG_POST_TARGET} POST_BUILD\r\n\t\t\tCOMMAND ${CMAKE_COMMAND} -E copy\r\n\t\t\t$<TARGET_FILE:${ARG_TARGET_OR_FILE}>\r\n\t\t\t${CMAKE_CURRENT_BINARY_DIR}/$<CONFIGURATION>/$<TARGET_FILE_NAME:${ARG_TARGET_OR_FILE}>)\r\n\telse()\r\n\t\tget_filename_component(TEMP_FILENAME ${ARG_TARGET_OR_FILE} NAME)\r\n\t\tadd_custom_command(TARGET ${ARG_POST_TARGET} POST_BUILD\r\n\t\t\tCOMMAND ${CMAKE_COMMAND} -E copy\r\n\t\t\t${ARG_TARGET_OR_FILE}\r\n\t\t\t${CMAKE_CURRENT_BINARY_DIR}/$<CONFIGURATION>/${TEMP_FILENAME})\r\n\tendif()\r\nendfunction()\r\n\r\n# Add post build steps to move the DLLs next to the binary. Otherwise\r\n# running/debugging the binary will not work from inside VS.\r\nif(LOVE_MOVE_DLLS)\r\n\tforeach(DLL ${LOVE_MOVE_DLLS})\r\n\t\tpost_step_move_dll(love ${DLL})\r\n\tendforeach()\r\nendif()\r\n\r\nif(\"${CMAKE_SYSTEM_NAME}\" STREQUAL \"Windows\")\r\n\t###################################\r\n\t# CPack\r\n\t###################################\r\n\tinstall(TARGETS love lovec liblove RUNTIME DESTINATION .)\r\n\tinstall(PROGRAMS $<TARGET_FILE:${MEGA_SDL3}> DESTINATION .)\r\n\r\n\t# Our install script (and NSIS) doesn't fully support Windows ARM64 yet.\r\n\tif(MEGA_ARM64)\r\n\t\tset(CPACK_GENERATOR ZIP)\r\n\t\tset(CPACK_SYSTEM_NAME woa64)\r\n\telse()\r\n\t\tset(CPACK_GENERATOR ZIP NSIS)\r\n\tendif()\r\n\r\n\t# Extra DLLs.\r\n\tif(LOVE_EXTRA_DLLS)\r\n\t\tforeach(DLL ${LOVE_EXTRA_DLLS})\r\n\t\t\tget_filename_component(DLL_NAME ${DLL} NAME)\r\n\t\t\tmessage(STATUS \"Extra DLL: ${DLL_NAME}\")\r\n\t\tendforeach()\r\n\t\tinstall(FILES ${LOVE_EXTRA_DLLS} DESTINATION .)\r\n\tendif()\r\n\r\n\t# Dynamic runtime libs.\r\n\tif(LOVE_MSVC_DLLS)\r\n\t\tforeach(DLL ${LOVE_MSVC_DLLS})\r\n\t\t\tget_filename_component(DLL_NAME ${DLL} NAME)\r\n\t\t\tmessage(STATUS \"Runtime DLL: ${DLL_NAME}\")\r\n\t\tendforeach()\r\n\t\tinstall(FILES ${LOVE_MSVC_DLLS} DESTINATION .)\r\n\tendif()\r\n\r\n\t# Copy a text file from CMAKE_CURRENT_SOURCE_DIR to CMAKE_CURRENT_BINARY_DIR.\r\n\t# On Windows, this function will convert line endings to CR,LF.\r\n\tfunction(copy_text_file ARG_FILE_IN ARG_FILE_OUT)\r\n\t\tfile(READ ${CMAKE_CURRENT_SOURCE_DIR}/${ARG_FILE_IN} TMP_TXT_CONTENTS)\r\n\t\tfile(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${ARG_FILE_OUT} ${TMP_TXT_CONTENTS})\r\n\tendfunction()\r\n\r\n\t# Text files.\r\n\tcopy_text_file(readme.md readme.txt)\r\n\tcopy_text_file(license.txt license.txt)\r\n\tcopy_text_file(changes.txt changes.txt)\r\n\r\n\tinstall(FILES\r\n\t\t\t${CMAKE_CURRENT_BINARY_DIR}/changes.txt\r\n\t\t\t${CMAKE_CURRENT_BINARY_DIR}/license.txt\r\n\t\t\t${CMAKE_CURRENT_BINARY_DIR}/readme.txt\r\n\t\t\tDESTINATION .)\r\n\r\n\t# Icons\r\n\tinstall(FILES\r\n\t\t\t${CMAKE_CURRENT_SOURCE_DIR}/extra/nsis/love.ico\r\n\t\t\t${CMAKE_CURRENT_SOURCE_DIR}/extra/nsis/game.ico\r\n\t\t\tDESTINATION .)\r\n\r\n\tset(CPACK_PACKAGE_NAME \"love\")\r\n\tset(CPACK_PACKAGE_VENDOR \"love2d.org\")\r\n\tset(CPACK_PACKAGE_DESCRIPTION_SUMMARY \"LOVE -- It's awesome\")\r\n\tset(CPACK_PACKAGE_VERSION \"${LOVE_VERSION_STR}\")\r\n\tset(CPACK_PACKAGE_VERSION_MAJOR \"${LOVE_VERSION_MAJOR}\")\r\n\tset(CPACK_PACKAGE_VERSION_MINOR \"${LOVE_VERSION_MINOR}\")\r\n\tset(CPACK_PACKAGE_VERSION_PATCH \"${LOVE_VERSION_REV}\")\r\n\tset(CPACK_PACKAGE_INSTALL_DIRECTORY \"LOVE\")\r\n\tset(CPACK_PACKAGE_EXECUTABLES \"${LOVE_EXE_NAME};LOVE\")\r\n\tset(CPACK_RESOURCE_FILE_README \"${CMAKE_CURRENT_SOURCE_DIR}/readme.md\")\r\n\tset(CPACK_RESOURCE_FILE_LICENSE \"${CMAKE_CURRENT_SOURCE_DIR}/license.txt\")\r\n\r\n\tset(CPACK_NSIS_EXECUTABLES_DIRECTORY .)\r\n\tset(CPACK_NSIS_PACKAGE_NAME \"LOVE\")\r\n\tset(CPACK_NSIS_DISPLAY_NAME \"LOVE ${LOVE_VERSION_STR}\")\r\n\tset(CPACK_NSIS_MODIFY_PATH ON)\r\n\r\n\tif(LOVE_X64)\r\n\t\tset(CPACK_NSIS_INSTALL_ROOT \"$PROGRAMFILES64\")\r\n\telse()\r\n\t\tset(CPACK_NSIS_INSTALL_ROOT \"$PROGRAMFILES\")\r\n\tendif()\r\n\r\n\tset(CPACK_NSIS_MENU_LINKS \"http://love2d.org/wiki\" \"Documentation\")\r\n\r\n\t# Some bug somewhere in NSIS requires \"\\\\\\\\\" somewhere in the path,\r\n\t# according to The Internet. (And sure enough, it does not work\r\n\t# without it).\r\n\tset(NSIS_LEFT_BMP \"${CMAKE_CURRENT_SOURCE_DIR}/extra/nsis\\\\\\\\left.bmp\")\r\n\tset(NSIS_TOP_BMP \"${CMAKE_CURRENT_SOURCE_DIR}/extra/nsis\\\\\\\\top.bmp\")\r\n\tset(NSIS_MUI_ICON \"${CMAKE_CURRENT_SOURCE_DIR}/extra/nsis\\\\\\\\love.ico\")\r\n\tset(NSIS_MUI_UNICON \"${CMAKE_CURRENT_SOURCE_DIR}/extra/nsis\\\\\\\\love.ico\")\r\n\r\n\tset(CPACK_NSIS_INSTALLER_MUI_ICON_CODE \"\r\n\t\t!define MUI_WELCOMEPAGE_TITLE \\\\\\\"LOVE ${LOVE_VERSION_STR} Setup\\\\\\\"\r\n\t\t!define MUI_WELCOMEFINISHPAGE_BITMAP \\\\\\\"${NSIS_LEFT_BMP}\\\\\\\"\r\n\t\t!define MUI_HEADERIMAGE_BITMAP \\\\\\\"${NSIS_TOP_BMP}\\\\\\\"\r\n\t\t!define MUI_ICON \\\\\\\"${NSIS_MUI_ICON}\\\\\\\"\r\n\t\t!define MUI_UNICON \\\\\\\"${NSIS_MUI_UNICON}\\\\\\\"\r\n\t\")\r\n\r\n\tset(CPACK_NSIS_EXTRA_INSTALL_COMMANDS \"\r\n\t\tWriteRegStr HKCR \\\\\\\".love\\\\\\\" \\\\\\\"\\\\\\\" \\\\\\\"LOVE\\\\\\\"\r\n\t\tWriteRegStr HKCR \\\\\\\"LOVE\\\\\\\" \\\\\\\"\\\\\\\" \\\\\\\"LOVE Game File\\\\\\\"\r\n\t\tWriteRegStr HKCR \\\\\\\"LOVE\\\\\\\\DefaultIcon\\\\\\\" \\\\\\\"\\\\\\\" \\\\\\\"$INSTDIR\\\\\\\\game.ico\\\\\\\"\r\n\t\tWriteRegStr HKCR \\\\\\\"LOVE\\\\\\\\shell\\\\\\\" \\\\\\\"\\\\\\\" \\\\\\\"open\\\\\\\"\r\n\t\tWriteRegStr HKCR \\\\\\\"LOVE\\\\\\\\shell\\\\\\\\open\\\\\\\" \\\\\\\"\\\\\\\" \\\\\\\"Open in LOVE\\\\\\\"\r\n\t\tWriteRegStr HKCR \\\\\\\"LOVE\\\\\\\\shell\\\\\\\\open\\\\\\\\command\\\\\\\" \\\\\\\"\\\\\\\" \\\\\\\"$INSTDIR\\\\\\\\love.exe $\\\\\\\\\\\\\\\"%1$\\\\\\\\\\\\\\\"\\\\\\\"\r\n\t\tSystem::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v  (0x08000000, 0, 0, 0)'\r\n\t\")\r\n\r\n\tset(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS \"\r\n\t\tDeleteRegKey HKCR \\\\\\\"LOVE\\\\\\\"\r\n\t\tDeleteRegKey HKCR \\\\\\\".love\\\\\\\"\r\n\t\tSystem::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v  (0x08000000, 0, 0, 0)'\r\n\t\")\r\n\r\n\tinclude(CPack)\r\nelseif(\"${CMAKE_SYSTEM_NAME}\" STREQUAL \"Linux\")\r\n\tinclude(GNUInstallDirs)\r\n\r\n\tstring(TIMESTAMP LOVE_CONFIGURE_TIMESTAMP \"%a, %d %b %Y %H:%M:%S +0000\" UTC)\r\n\r\n\tfile(COPY platform/unix/debian/ DESTINATION debian PATTERN \"*.in\" EXCLUDE)\r\n\tconfigure_file(platform/unix/debian/control.in debian/control @ONLY)\r\n\tconfigure_file(platform/unix/debian/changelog.in debian/changelog @ONLY)\r\n\tconfigure_file(platform/unix/debian/rules.in debian/rules @ONLY)\r\n\r\n\tconfigure_file(platform/unix/love.desktop.in love.desktop @ONLY)\r\n\r\n\tinstall(TARGETS love liblove)\r\n\tinstall(FILES platform/unix/love.6\r\n\t\t\tDESTINATION ${CMAKE_INSTALL_MANDIR}/man1\r\n\t\t\tRENAME love.1)\r\n\tinstall(FILES ${CMAKE_CURRENT_BINARY_DIR}/love.desktop\r\n\t\t\tDESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications)\r\n\tinstall(FILES platform/unix/love.xml\r\n\t\t\tDESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/mime/packages)\r\n\tinstall(FILES platform/unix/love.svg\r\n\t\t\tDESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pixmaps)\r\n\tinstall(FILES platform/unix/application-x-love-game.svg\r\n\t\t\tDESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/mimetypes)\r\nendif()\r\n"
  },
  {
    "path": "changes.txt",
    "content": "LOVE 12.0 [N/A]\n---------------\n\nReleased: N/A\n\n* Added support for launching a specific .lua file as the main file.\n* Added basic usage instructions printed to the console when '--help' is used as a command-line parameter, and when the no-game screen is run.\n* Added love.parsedGameArguments and love.rawGameArguments tables, in the main thread.\n* Added love.markDeprecated.\n* Added HTTPS Lua module.\n* Added love.event.restart(optionalvalue). A new love.restart field will contain the value after restarting.\n* Added love.system.getPreferredLocales.\n* Added love.localechanged callback.\n* Added love.audiodisconnected callback.\n* Added love.filesystem.mountFullPath and love.filesystem.unmountFullPath, including opt-in mount-for-write support.\n* Added love.filesystem.mountCommonPath, unmountCommonPath, and getFullCommonPath.\n* Added 'readonly' field to love.filesystem.getInfo's returned table.\n* Added love.filesystem.openFile (replaces love.filesystem.newFile).\n* Added an optional load mode parameter to love.filesystem.load whetever to only allow binary chunks, text chunks, or both.\n* Added love.math.perlinNoise and love.math.simplexNoise (replaces love.math.noise).\n* Added SoundData:copyFrom.\n* Added SoundData:slice.\n* Added optional stream type parameter to love.audio.newSource streaming sources (\"file\" or \"memory\"). It defaults to \"file\".\n* Added love.audio.getPlaybackDevice, love.audio.getPlaybackDevices, and love.audio.setPlaybackDevice.\n* Added love.keyboard.isModifierActive.\n* Added Joystick:setPlayerIndex and Joystick:getPlayerIndex.\n* Added Joystick:getJoystickType.\n* Added Joystick:getGamepadType.\n* Added Joystick:hasSensor.\n* Added Joystick:isSensorEnabled and Joystick:setSensorEnabled.\n* Added Joystick:getSensorData.\n* Added Joystick:getPowerInfo which exposes infomation about batteries in a controller are and if they're charging.\n* Added Joystick:getConnectionState which indicates if a joystick is connected wired or wireless.\n* Added new Gamepad API buttons: \"misc1\", \"paddle1\", \"paddle2\", \"paddle3\", \"paddle4\". and \"touchpad\".\n* Added World:getFixturesInArea().\n* Added support for saving .exr image files via ImageData:encode.\n* Added a Metal backend to love.graphics, available on macOS 10.15+ and iOS 13+.\n* Added a Vulkan backend to love.graphics, available on Windows, Linux, and Android 7+.\n* Added '--renderers a,b,c' and '--excluderenderers a,b,c' command line arguments.\n* Added t.renderers and t.excluderenderers love.conf options.\n* Added t.highdpi startup flag in love.conf, replacing t.window.highdpi and the highdpi flag of love.window.setMode.\n* Added support for highdpi mode in Windows.\n* Added per-shader opt in support for the GLSL 4.30 (desktop) and GLSL ES 3.20 (mobile) shading languages, via #pragma language glsl4.\n* Added compile options table parameter to love.graphics.newShader. Allows setting #define values via newShader.\n* Added love.graphics.newTexture. newImage and newCanvas still exist as convenience constructor functions.\n* Added optional 'mipmapcount' field to the settings table in newTexture/newImage/newCanvas.\n* Added optional 'computewrite' boolean field to the settings table in newTexture/newImage/newCanvas.\n* Added love.graphics.getTextureFormats, which replaces getImageFormats and getCanvasFormats.\n* Added Texture:isCanvas and Texture:isComputeWritable.\n* Added Texture:isFormatLinear, Texture:getMSAA, Texture:generateMipmaps, Texture:replacePixels, and Texture:renderTo (moved from old Canvas and Image subclasses).\n* Added integer pixel formats for Textures and ImageData.\n* Added Graphics Buffer objects, including vertex, index, texel, shader storage, and indirect draw/dispatch argument buffers.\n* Added love.graphics.copyBuffer, copyBufferToTexture, and copyTextureToBuffer.\n* Added APIs for interacting with the Buffer objects owned by Meshes.\n* Added Mesh:getAttachedAttributes.\n* Added an optional start array index parameter to Mesh:attachAttribute.\n* Added integer buffer data formats.\n* Added love.graphics.readbackTexture and love.graphics.readbackTextureAsync (replaces Texture:newImageData).\n* Added love.graphics.readbackBuffer and love.graphics.readbackBufferAsync.\n* Added 'readback' buffer data usage enum, useful for advanced memory optimization when using love.graphics.readbackBuffer.\n* Added new lower level 'vertexmain' and 'pixelmain' shader entry points.\n* Added Compute Shader support via love.graphics.newComputeShader and a new 'computemain' shader entry point.\n* Added love.graphics.dispatchThreadgroups and love.graphics.dispatchIndirect for running compute shaders.\n* Added Shader:hasStage.\n* Added love.graphics.drawFromShader.\n* Added love.graphics.drawFromShaderIndirect.\n* Added love.graphics.drawIndirect.\n* Added love.graphics.getQuadIndexBuffer.\n* Added variants of love.graphics.applyTransform and replaceTransform which accept x,y,angle,sx,sy,ox,oy parameters.\n* Added APIs to override the default orthographic projection: love.graphics.setOrthoProjection, setPerspectiveProjection, and resetProjection.\n* Added ability to set point size within a vertex shader by setting the 'love_PointSize' variable.\n* Added love.graphics.setBlendState, which gives lower level control over blend operations than setBlendMode.\n* Added high level love.graphics.setStencilMode and getStencilMode functions. Replaces love.graphics.stencil and setStencilTest.\n* Added lower level love.graphics.setStencilState and getStencilState functions.\n* Added a variant of love.graphics.setColorMask which accepts a single boolean.\n* Added new 'clampone' wrap mode.\n* Added 'clampone', 'texelbuffer', 'indexbuffer32bit', 'mipmaprange', and 'indirectdraw' graphics feature enums.\n* Added 'copybuffer', 'copybuffertotexture', 'copytexturetobuffer', and 'copyrendertargettobuffer' graphics feature enums.\n* Added initial support for right-to-left (RTL) text when using TrueType and OpenType fonts.\n* Added a variant of Font:getWidth which takes a codepoint number argument.\n* Added love.graphics.newTextBatch (renamed from love.graphics.newText).\n* Added love.sensor module.\n* Added love.sensorupdated callback.\n* Added love.joysticksensorupdated callback.\n* Added variant for enet peer:send and host:broadcast which accepts a pointer (light userdata) and a size.\n* Added love.system.getMemorySize.\n\n* Changed the default font from Vera size 12 to Noto Sans size 13.\n* Changed TrueType and OpenType font handling to have improved kerning and character combining support.\n* Changed the Texture class and implementation to no longer have separate Canvas and Image subclasses.\n* Changed Images to no longer hold onto a CPU copy of their pixel data after creation.\n* Changed love.graphics.newImage to error instead of loading a placeholder texture, when the image dimensions are too large for the system.\n* Changed love.graphics.newImage to allow creating a mipmapped texture with less than the full mipmap range, instead of erroring.\n* Changed love.graphics.newMesh to no longer default to the \"fan\" Mesh draw mode.\n* Changed the behaviour of Meshes to no longer allow a vertex map or index buffer when the \"fan\" mesh draw mode is used.\n* Changed love.window.setMode to no longer clear the contents of Canvases or otherwise recreate OpenGL resources.\n* Changed love.graphics.points to require 'love_PointSize' to be set in the vertex shader, if a custom shader is used.\n* Changed love.graphics.setCanvas to always clear auto-generated temporary depth and stencil buffers when they're used.\n* Changed shader code parsing to ignore shader entry point functions inside comments.\n* Changed audio file decoding to choose the most appropriate decoder based on file contents instead of the file extension.\n* Changed Videos to stream audio from the file instead of loading all the video file into memory for use with audio decoding.\n* Changed love.filesystem.exists to no longer be deprecated.\n* Changed RevoluteJoint:getMotorTorque and WheelJoint:getMotorTorque to take 'dt' as a parameter instead of 'inverse_dt'.\n* Changed love.math.perlinNoise and simplexNoise to use higher precision numbers for its internal calculations.\n* Changed t.accelerometerjoystick startup flag in love.conf to unset by default.\n* Changed love.data.hash to take in a container type.\n\n* Renamed 'display' field to 'displayindex' in love.window.setMode/updateMode/getMode and love.conf.\n* Renamed love.graphics Text objects to TextBatch.\n\n* Updated Box2D from 2.3 to 2.4.1.\n* Updated LuaSocket from 3.0-rc1 to 3.1.0.\n\n* Deprecated usage of slashes instead of dots for module separators in require.\n* Deprecated love.filesystem.newFile (replaced by openFile).\n* Deprecated love.math.noise (replaced by perlinNoise and simplexNoise).\n* Deprecated love.graphics.setNewFont (use love.graphics.newFont and love.graphics.setFont instead).\n* Deprecated love.graphics.newText (renamed to love.graphics.newTextBatch).\n* Deprecated love.graphics.getImageFormats and love.graphics.getCanvasFormats (replaced by getTextureFormats).\n* Deprecated love.graphics.stencil (replaced by love.graphics.setStencilMode or love.graphics.setStencilState).\n* Deprecated love.graphics.setStencilTest and love.graphics.getStencilTest (replaced by love.graphics.setStencilMode or setStencilState).\n* Deprecated t.window.highdpi in love.conf and the highdpi flag of love.window.setMode (replaced by t.highdpi in love.conf).\n* Deprecated t.accelerometerjoystick in love.conf (replaced by love.sensor module).\n* Deprecated the variants of Mesh:attachAttribute and SpriteBatch:attachAttribute which accept a Mesh (replaced by variants which accept a Buffer).\n* Deprecated Texture:newImageData (replaced by love.graphics.readbackTexture).\n* Deprecated love.data.hash (replaced by function variant, which takes container type).\n\n* Removed the variant of SpriteBatch:setColor() which turns off all previously set colors.\n* Removed the no-argument variant of love.graphics.setColorMask.\n* Removed functions deprecated in LOVE 11:\n\t* Removed love.audio.getSourceCount (renamed to love.audio.getActiveSourceCount).\n\t* Removed Source:getChannels (renamed to Source:getChannelCount).\n\t* Removed Decoder:getChannels (renamed to Decoder:getChannelCount).\n\t* Removed love.filesystem.isDirectory (replaced by love.filesystem.getInfo).\n\t* Removed love.filesystem.isFile (replaced by love.filesystem.getInfo).\n\t* Removed love.filesystem.isSymlink (replaced by love.filesystem.getInfo).\n\t* Removed love.filesystem.getLastModified (replaced by love.filesystem.getInfo).\n\t* Removed love.filesystem.getSize (replaced by love.filesystem.getInfo).\n\t* Removed ParticleSystem:setAreaSpread and ParticleSystem:getAreaSpread (renamed to ParticleSystem:setEmissionArea and getEmissionArea).\n\t* Removed love.math.compress and love.math.decompress (replaced by love.data.compress and love.data.decompress).\n\t* Removed World:getBodyList, World:getJointList, and World:getContactList (renamed to World:getBodies, World:getJoints, and World:getContacts).\n\t* Removed Body:getFixtureList, Body:getJointList, and Body:getContactList (renamed to Body:getFixtures, Body:getJoints, and Body:getContacts).\n\t* Removed PrismaticJoint:hasLimitsEnabled (renamed to PrismaticJoint:areLimitsEnabled).\n\t* Removed RevoluteJoint:hasLimitsEnabled (renamed to RevoluteJoint:areLimitsEnabled).\n\n* Fixed BezierCurve:render adding collinear points in some situations.\n* Fixed sound Decoders to cause a Lua error instead of hard-crashing when memory for the decoding buffer can't be allocated.\n* Fixed enum misspelling for thousandsseparator from thsousandsseparator for both keyboard and scancode enums.\n\nLOVE 11.5 [Mysterious Mysteries]\n--------------------------------\n\nReleased: 2023-12-03\n\n* Added \"LÖVE Loader\" launcher on Android for easier loading of .love files.\n\n* Changed iOS game selector to alphabetically sort the list of .love files.\n* Changed JIT compilation on macOS arm64 (Apple Silicon) to be off by default, since performance and available JIT memory isn't reliable.\n\n* Fixed inconsistent and buggy behaviour of 'pairs' by updating LuaJIT.\n* Fixed \"unexpected alignment\" errors when running love on some 32 bit Linux systems.\n* Fixed running fused games on Windows when the executable has been code-signed.\n* Fixed undefined behaviour in love.data.hash's implementation.\n* Fixed writing files when a symlink exists in the save directory's path.\n* Fixed love.threaderror not being called if the error message is an empty string.\n* Fixed a race condition when a Thread is destroyed immediately after Thread:start.\n* Fixed unexpectedly slow first frames on macOS.\n* Fixed love.joystick.setGamepadMapping when replacing an existing mapping.\n* Fixed love.joystick.getGamepadMappingString.\n* Fixed duplicate platform fields in love.joystick.saveGamepadMappings.\n* Fixed DistanceJoint type information.\n* Fixed time drift in Source:tell after a Source loops.\n* Fixed audio not always pausing when the app is minimized on Android.\n* Fixed RecordingDevice:start to return false instead of hard-crashing on iOS.\n* Fixed identical frames in Ogg Theora videos being skipped.\n* Fixed love.font.newBMFontRasterizer's single file parameter variant.\n* Fixed the original window size not always being restored when exiting fullscreen on Linux.\n* Fixed some cases of framerate hitches in Windows when vsync is enabled in windowed mode.\n* Fixed colors appearing over-saturated on P3 displays in macOS.\n* Fixed textures looking washed out when gamma-correct rendering is used on some Android devices.\n* Fixed images with mipmaps when ANGLE is used with an AMD GPU.\n* Fixed line rendering when duplicate points are used in the line.\n* Fixed line rendering with miter and bevel line join modes when antiparallel lines are formed.\n* Fixed a crash when calling Text:add with an empty string parameter.\n\nLOVE 11.4 [Mysterious Mysteries]\n--------------------------------\n\nReleased: 2022-01-02\n\n* Added native arm64 support on macOS.\n* Added a variant of love.filesystem.newFileData which accepts a Data object.\n* Added Body:getLocalPoints.\n* Added Font:getKerning.\n* Added support for r16, rg16, and rgba16 pixel formats in Canvases.\n* Added Shader:send(name, matrixlayout, data, ...) variant, whose argument order is more consistent than Shader:send(name, data, matrixlayout, ...).\n\n* Changed all builds and platforms where LOVE provides LuaJIT to use LuaJIT 2.1 instead of 2.0.\n* Changed love.timer.getTime to start at 0 when the module is first loaded.\n* Changed certain out-of-Lua-memory situations to show a message box instead of instantly crashing.\n* Changed the naming scheme of LOVE's embedded Lua files for improved integration with Lua chunkname APIs.\n\n* Fixed build-time compatibility with Lua 5.4.\n* Fixed code compatibility with math.mod and string.gfind when LuaJIT 2.1 is used.\n* Fixed errors on some systems related to > 53 bit pointer addresses, when recent versions of LuaJIT 2.1 are used.\n* Fixed the default error handler showing a blank screen on some mobile devices.\n* Fixed drag-and-drop to open a love game on macOS causing love.event.quit(\"restart\") to fail.\n* Fixed fused macOS apps opening other love games when drag-and-drop is used (if the fused app hasn't already removed .love files from recognized document types).\n* Fixed File:isEOF when called on a dropped file.\n* Fixed support for > 2GB dropped files on desktops.\n* Fixed ByteData and DataView missing Data:clone implementations.\n* Fixed love.physics meter scale value persisting after love.event.quit(\"restart\").\n* Fixed audio to resume properly after interruption on iOS.\n* Fixed love.graphics.newVideo to error instead of crash when an invalid video file is given.\n* Fixed initial window creation to set the window's title during creation instead of after.\n* Fixed the window's screen position when exiting fullscreen via love.window.setFullscreen.\n* Fixed love.displayrotated being given a boolean instead of an enum string.\n* Fixed memory corruption and a crash when drawing smooth lines.\n* Fixed a crash in Canvas:newImageData when the pixel format's pixel byte size multiplied by its width isn't a multiple of 4.\n* Fixed love.graphics.newVolumeImage when explicit mipmaps are provided.\n* Fixed freezes and crashes in automatic batching when an AMD GPU is used.\n* Fixed love.graphics.print and Image:replacePixels on more AMD/ATI GPUs.\n* Fixed Font:setFallbacks to account for different DPI scales in each fallback font.\n* Fixed Font:getWrap to not remove trailing newlines.\n* Fixed Text:getWidth when the Text's string only contains spaces.\n* Fixed a crash with some Intel graphics drivers on Linux.\n* Fixed a hang with some Intel graphics drivers on Windows, by preventing gamma correct rendering on affected systems.\n* Fixed a crash with some Intel graphics drivers on Windows when mipmapped Canvases are used.\n* Fixed texture memory reported by love.graphics.getStats when a volume or array Canvas is created.\n* Fixed DXT1 textures which use 1 bit alpha-cutout.\n* Fixed rare issues where textures were not sent to shaders correctly.\n* Fixed Shader:send(name, data, matrixlayout, ...).\n* Fixed quad offsets in ParticleSystems when ParticleSystem:setOffset is not used.\n* Fixed a performance issue with setting a small subrange of data in non-stream Meshes and SpriteBatches.\n* Fixed rounded rectangles breaking if the rx or ry parameters are negative.\n* Fixed rounded rectangle automatic points calculation when rx or ry are more than half the rectangle's size.\n* Fixed source code compilation on Xcode 12+.\n* Fixed source code compilation on Linux systems that don't provide posix_spawn APIs.\n\nLOVE 11.3 [Mysterious Mysteries]\n--------------------------------\n\nReleased: 2019-10-27\n\n* Added support for FLAC audio files.\n* Added support for microphone recording on Android.\n* Added t.audio.mic (false by default). On Android, setting it to true requests microphone recording permission from the user.\n* Added Decoder:clone.\n* Added Data:getFFIPointer.\n* Added Joystick:getDeviceInfo.\n* Added Joystick:getGamepadMappingString and love.joystick.getGamepadMappingString(guid).\n* Added love.math.colorToBytes and love.math.colorFromBytes.\n* Added 'usedpiscale' boolean (true by default) to love.window.setMode and love.conf. Disables automatic DPI scaling when false.\n* Added love.window.getDisplayOrientation and a love.displayrotated callback.\n* Added love.window.get/setVSync, to allow setting vsync without recreating the window.\n* Added love.window.getSafeArea.\n* Added an optional vertex count parameter to Mesh:setVertices.\n* Added support for rgba4, rgb5a1, rgb565, rgb10a2, rg11b10f, r8, rg8, r16, rg16, r16f, rg16f, r32f, and rg32f formats in ImageData and Images.\n* Added support for loading .dds files that contain uncompressed pixel data.\n\n* Changed audio file type detection, so it probes all supported backends for unrecognized extensions.\n\n* Fixed \"bad lightuserdata\" errors when running love on some arm64 devices.\n* Fixed boot.lua's line numbers in stack traces to match its source code.\n* Fixed the deprecation system not fully restarting when love.event.quit(\"restart\") is used.\n* Fixed love.isVersionCompatible.\n* Fixed named Channels persisting across love.event.quit(\"restart\") occurrences.\n* Fixed race conditions when different love.physics Worlds are used in different threads.\n* Fixed World:getJoints to return the fully resolved type of the Joint, instead of the base type.\n* Fixed love.timer.sleep(0) to return control to the OS scheduler instead of being a no-op.\n* Fixed love.math.randomNormal incorrectly using cached state after love.math.setRandomSeed or setRandomState.\n* Fixed love.data.hash returning an incorrect hash for certain input sizes.\n* Fixed love.data.newByteData to cause a Lua error instead of crashing when invalid arguments are used.\n* Fixed the Data-returning variant of love.filesystem.read and File:read to return the number of bytes that were read.\n* Fixed love.filesystem's require loaders to error instead of crashing when no argument is given.\n* Fixed love.filesystem.mount(Data).\n* Fixed a memory leak when loading files in some situations.\n* Fixed t.audio.mixwithsystem.\n* Fixed audio clicks immediately after playing a Source on iOS.\n* Fixed Source:play + Source:stop + Source:play looping the first few ms of sound for streaming Sources on iOS.\n* Fixed Source:play + Source:seek looping the first few ms of sound for streaming Sources on iOS.\n* Fixed occasional pops in streaming sources on iOS.\n* Fixed love.audio.play(sources) to use previously set playback positions on stopped Sources.\n* Fixed Source:setEffect(name, true) and Source:getEffect(name) when the effect has no associated Filter.\n* Fixed love.audio.newSource(filename, \"queue\") to cause a Lua error.\n* Fixed Source:setPitch to error if the given pitch is <= 0, NaN, or infinity.\n* Fixed video seeking and pausing in various scenarios.\n* Fixed an audio Source memory leak when a Video gets garbage collected after playing it.\n* Fixed video playback support on some Adreno-based Android devices.\n* Fixed black fringes around text in some situations.\n* Fixed extreme flickering when text moves along non-integer coordinates.\n* Fixed the first character in a string sometimes not being processed during text vertex generation.\n* Fixed Text:set(\" \") not clearing any previously set text in a Text object.\n* Fixed love.graphics.getTextureTypes to return a table with boolean values in its fields instead of number values.\n* Fixed lines not rendering properly if a single line has more than 65,000 vertices.\n* Fixed a pixel shader performance regression on some graphics drivers when OpenGL 3 or OpenGL ES 3 is used.\n* Fixed text not showing up on Radeon HD 3000-series graphics cards on Windows.\n* Fixed non-integer DPI scale values being truncated to integers in love.graphics.newCanvas.\n* Fixed creating depth canvases on Windows systems when using an Intel HD 3000 GPU.\n* Fixed automatic batching performance to be more consistent on all operating systems.\n* Fixed gammaToLinearPrecise in shaders not being as precise as it should be.\n* Fixed ImageData:paste and ImageData:setPixel to have more consistent clamping and rounding of color values when different formats are used.\n\nLOVE 11.2 [Mysterious Mysteries]\n--------------------------------\n\nReleased: 2018-11-25\n\n* Added Source:setAirAbsorption and Source:getAirAbsorption.\n* Added Body:setTransform and Body:getTransform.\n\n* Improved performance of love.graphics.draw slightly on iOS and Android.\n\n* Fixed filesystem initialization on Windows 10 update 1809.\n* Fixed compatibility with Lua 5.2 and 5.3.\n* Fixed the explicit format + Data argument variant of love.data.decompress.\n* Fixed love.joystick.setGamepadMapping not being able to change existing mappings.\n* Fixed a crash on quit on Linux if a custom cursor is active when quitting.\n* Fixed a crash in the Data variant of Shader:send when it's called after love.window.setMode.\n* Fixed a love.graphics.setCanvas error message to be less confusing.\n\nLOVE 11.1 [Mysterious Mysteries]\n--------------------------------\n\nReleased: 2018-04-15\n\n* Fixed love.graphics.setCanvas failing randomly.\n* Fixed love.graphics.clear(colortable) when no Canvas is active.\n* Fixed stencil and depth support on older phones.\n* Fixed love.event.quit causing crashes and other unexpected behaviour if a Canvas is active.\n* Fixed Fixture:getShape crashing when returning a ChainShape.\n* Fixed love.joystick.loadJoystickMappings outputting a deprecation warning about love.filesystem.isFile.\n* Fixed Source:queue to show the correct argument name in the error message when an invalid data parameter is given.\n* Fixed t.console=true causing an error on Windows if lovec.exe is used.\n\nLOVE 11.0 [Mysterious Mysteries]\n--------------------------------\n\nReleased: 2018-04-01\n\n  * Added Object:release.\n  * Added Data:clone.\n  * Added queueable audio sources.\n  * Added audio input support.\n  * Added Source filters: low gain, high gain and band pass.\n  * Added audio effect APIs (reverb, echo, etc.)\n  * Added variants of SoundData:getSample/setSample which take a channel parameter.\n  * Added variants of all table-with-fields-returning get* functions, the new variants take an existing table to fill in.\n  * Added a variant to World:update, which accepts the number of iterations to run. The defaults are now 8 and 3.\n  * Added Body:isTouching.\n  * Added RopeJoint:setMaxLength.\n  * Added a click count argument to love.mousepressed and love.mousereleased.\n  * Added variants of love.filesystem.mount which accept a Data or FileData object containing zipped data.\n  * Added love.filesystem.get/setCRequirePath, and use that to find c libraries for require.\n  * Added variants of File:read and love.filesystem.read which take an enum to determine whether they return a FileData or a string.\n  * Added love.data module. It includes hex/base64 encoding functions, MD5 and SHA hashing, string packing, compression APIs, and more.\n  * Added Channel:hasRead, which checks if a message has been read. Takes an id, which Channel:push will now return.\n  * Added variants of Channel:demand and Channel:supply which take a timeout argument.\n  * Added Transform objects to love.math.\n  * Added support for different ImageData formats, including RGBA8 (the default), RGBA16, RGBA16F, and RGBA32F.\n  * Added the ability to load Radiance HDR, OpenEXR, and 16 bit PNG images.\n  * Added love.graphics.getImageFormats (replaces love.graphics.getCompressedImageFormats).\n  * Added the ability to specify a per-object pixel density scale factor when creating Images, Canvases, Fonts, and Videos. Affects drawing.\n  * Added Texture:getPixelWidth/Height and love.graphics.getPixelWidth/Height.\n  * Added Texture:getPixelDensity, love.graphics.getPixelDensity, and Font:getPixelDensity.\n  * Added Texture:getMipmapCount, getFormat, getLayerCount, getDepth, and getTextureType.\n  * Added Array, Cubemap, and Volume texture types and corresponding Image and Canvas APIs.\n  * Added love.graphics.getTextureTypes, returns a table with fields indicating support for each texture type.\n  * Added mipmapping support to Canvases, including both auto-generated mipmaps and manually rendering to a specific mipmap level.\n  * Added 'stencil8', 'depth24stencil8', 'depth32fstencil8', 'depth16', 'depth24', and 'depth32f' pixel formats for Canvases.\n  * Added variant of love.graphics.newCanvas which accepts a table of settings.\n  * Added optional 'readable' boolean field to the table passed into love.graphics.newCanvas.\n  * Added optional 'depthstencil' field to the table passed into love.graphics.setCanvas, for using a depth/stencil Canvas.\n  * Added optional 'depth' and 'stencil' boolean fields to the table passed into setCanvas, for enabling depth and stencil buffers if 'depthstencil' isn't used.\n  * Added shadow sampler support for Canvases.\n  * Added love.graphics.setDepthMode for using the depth buffer for depth testing/writes. Depth values of rendered objects can only be set via shaders.\n  * Added love.graphics.setMeshCullMode, for culling back- or front-facing triangles when drawing a Mesh.\n  * Added love.graphics.setFrontFaceWinding.\n  * Added variant of love.graphics.getCanvasFormats which takes a 'readable' boolean.\n  * Added love.graphics.drawLayer and SpriteBatch:add/setLayer for easily drawing layers of Array Textures.\n  * Added variants of love.graphics.print and printf which take a Font argument.\n  * Added variants of love.graphics.clear to control how the active depth and stencil buffers are cleared.\n  * Added love.graphics.applyTransform and love.graphics.replaceTransform.\n  * Added love.graphics.transformPoint and love.graphics.inverseTransformPoint.\n  * Added love.graphics.getStackDepth.\n  * Added love.graphics.flushBatch for manually flushing automatically batched draws.\n  * Added SpriteBatch:setDrawRange.\n  * Added per-shader opt in support for the GLSL 3.30 and GLSL ES 3.00 shading languages.\n  * Added 'void effect()' pixel shader entry point.\n  * Added love.graphics.validateShader.\n  * Added Shader:hasUniform.\n  * Added support for non-square shader uniform matrices on desktop platforms and on mobile GLSL 3.\n  * Added Shader:send(matrixname, is_column_major, matrix, ...) which specifies how to interpret the matrix table arguments.\n  * Added Shader:send variants which accept a Data object.\n  * Added 'borderellipse' and 'borderrectangle' ParticleSystem distributions.\n  * Added variant of ParticleSystem:setEmissionArea which accepts an area angle and a flag for whether particle directions are relative to the center of the area.\n  * Added ParticleSystem:set/getAreaSpreadAngle and set/getAreaSpreadIsRelativeDirection.\n  * Added love.graphics.captureScreenshot (replaces love.graphics.newScreenshot).\n  * Added 'glsl3', 'instancing', 'fullnpot','pixelshaderhighp', and 'shaderderivatives' graphics features.\n  * Added 'anisotropy' graphics limit.\n  * Added Mesh instancing support via love.graphics.drawInstanced and Mesh:attachAttribute.\n  * Added a Mesh:attachAttribute variant that takes a different target attribute name.\n  * Added Mesh:detachAttribute.\n  * Added a variant of Mesh:setVertexMap which accepts a Data object.\n  * Added love.window.updateMode.\n  * Added love.window.isMinimized.\n  * Added love.window.restore.\n  * Added the ability to prevent love from creating a stencil buffer for the window.\n  * Added cycle detection to Variant's table serialization, cycles now cause an error, rather than a stack overflow.\n  * Added love.graphics.newShader File and FileData variants.\n  * Added a default love.threaderror callback, which raises the error in the main thread.\n  * Added checks for invalid constants passed to love.keyboard.isDown/isScancodeDown.\n  * Added deprecation warnings, on by default for non-fused games.\n  * Added love.filesystem.getInfo.\n  * Added 'drawcallsbatched' to love.graphics.getStats.\n  * Added support for header-less DEFLATE to love.data.compress/decompress.\n\n  * Deprecated love.filesystem.exists / isFile / isDirectory / isSymlink / getLastModified / getSize (use getInfo instead).\n  * Deprecated love.math.compress / decompress (use love.data.compress / decompress instead).\n\n  * - All renamed APIs are formally deprecated rather than completely removed.\n  * Renamed love.window.getPixelScale to love.window.getDPIScale.\n  * Renamed love.mouse.hasCursor to love.mouse.isCursorSupported.\n  * Renamed ParticleSystem:setAreaSpread to ParticleSystem:setEmissionArea.\n  * Renamed love.errhand to love.errorhandler.\n  * Renamed Source/SoundData/Decoder:getChannels to getChannelCount.\n  * Renamed PrismaticJoint/RevoluteJoint:hasLimitsEnabled to areLimitsEnabled.\n  * Renamed love.audio.getSourceCount to love.audio.getActiveSourceCount.\n  * Renamed all get[Object]List functions to get[Object]s.\n\n  * Removed the default source type for love.audio.newSource.\n  * Removed variant of love.filesystem.newFileData which takes base64 data, use love.data.decode instead.\n  * Removed the no-argument variant of Text:set, use Text:clear instead.\n  * Removed love.graphics.getCompressedImageFormats, use love.graphics.getImageFormats instead.\n  * Removed the 'void effects(...)' pixel shader entry point. Use the new 'void effect()' instead.\n  * Removed Shader:getExternVariable, use Shader:hasUniform instead.\n  * Removed love.graphics.newScreenshot, use love.graphics.captureScreenshot instead.\n  * Removed deprecated enet function host:socket_get_address.\n  * Removed functions deprecated in LÖVE 0.10.2:\n    * Removed Shader:sendInt, Shader:sendBoolean, Shader:sentFloat, Shader:sendMatrix, and Shader:sendTexture (use Shader:send instead).\n    * Removed love.window.isCreated (use love.window.isOpen instead).\n\n  * Improved performance when drawing textures, shapes, lines, and points by automatically batching their draw calls together when possible.\n  * Improved performance of Shader:send when the Shader is not active.\n  * Improved performance of love.math.randomNormal when LuaJIT's JIT compiler is enabled.\n  * Improved performance of love.filesystem.lines and File:lines, especially when reading from a file inside a zip/.love.\n\n  * Changed all color values to be in the range 0-1, rather than 0-255.\n  * Changed high-dpi functionality to require much less code (often none at all) for graphics to appear at the correct sizes and positions.\n  * Changed love.graphics.print and friends to ignore carriage returns.\n  * Changed the 'multiply' blend mode to error if not used with the 'premultiplied' blend alpha mode, since the formula only works with that anyway.\n  * Changed some love.graphics, love.window, and love.event APIs to cause an error if a Canvas is active.\n  * Changed stenciling functionality with a Canvas active to require stencil=true (or a custom stencil-formatted Canvas) to be set in setCanvas.\n  * Changed Mesh:setDrawRange to take 'start' and 'count' parameters instead of 'min' and 'max'.\n  * Changed the 'vsync' field of love.window.setMode and t.window in love.conf. It's now an integer with 0 disabling vsync.\n  * Changed the audio playback APIs drastically.\n  * Changed enet to no longer set the 'enet' global, again matching luasocket.\n  * Changed Source seeking behaviour, all kinds of Sources now behave similarly when seeking past the boundaries.\n  * Changed love.timer.step, it now returns dt.\n  * Changed love.run and love.errhand to return a function for their main loop, which gets called until love quits.\n\n  * Updated and improved command line argument handling.\n  * Updated the boot sequence to show an error instead of the no-game screen, if a nonexistant folder is passed in as the source game directory.\n  * Updated 'love.exe --version' on Windows to print to the parent console.\n  * Updated Android print rerouting and JIT compilation disabling to apply inside threads.\n  * Updated invalid enum value error messages to show a list of the valid enum values.\n  * Updated Source:seek to work if the Source isn't playing.\n  * Updated love.event.poll to stop allocating memory unnecessarily.\n  * Updated love.math.random to have improved numeric distribution.\n  * Updated love.graphics to support Core Profile OpenGL 3.3+ when available.\n  * Updated shaders to always expose derivative functions (dFdx, dFdy, fwidth) when available in OpenGL ES.\n  * Updated shaders to allow using VERTEX and PIXEL in shader code.\n  * Updated love.graphics.circle/ellipse/arc/rectangle to take transformation scale into account when determining the number of segments to use.\n  * Updated Font glyph generation to improve antialiasing.\n  * Updated Canvas:newImageData to return an ImageData with a format that matches the Canvas' as closely as possible.\n  * Updated love.graphics.newImage to treat file names ending with \"@2x\", \"@3x\", etc. as a pixel density scale factor if none is explicitly supplied.\n  * Updated the error message when bad values are given to love.graphics.line.\n  * Updated the maximum love.graphics transformation/state stack depth from 64 to 128.\n  * Updated the default error handler to allow copying the error to the clipboard when the user decides to do so.\n  * Updated love.filesystem.setRequirePath to support multiple template '?' characters in each path.\n  * Updated luasocket to version 3.0rc1.\n  * Updated love.joystick.loadGamepadMappings so it doesn't error when given an empty string.\n  * Updated love.joystick.setGamepadMapping to use the controller's name for the new mapping when possible.\n\n  * Fixed error in default error handler when the error message contains non UTF-8 bytes.\n  * Fixed a memory leak when sending love objects to threads which never load that object's module.\n  * Fixed a memory leak in enet when peer:send fails.\n  * Fixed os.execute always returning -1 in Linux.\n  * Fixed the default reference angle for WeldJoint, PrismaticJoint, and RevoluteJoint.\n  * Fixed Fixture:getShape to reuse the existing internal Fixture-owned shape.\n  * Fixed MouseJoint:setFrequency to error instead of crashing if a frequency of 0 is set.\n  * Fixed love.system.set/getClipboardText to error instead of crashing, when a window hasn't been created.\n  * Fixed Joystick:getGamepadMapping to work with xinput controllers.\n  * Fixed love.joystick.setGamepadMapping's replacement code.\n  * Fixed baseline calculation when rendering text.\n  * Fixed VaryingTexCoords and love_ScreenSize in shaders to be 'highp' in OpenGL ES, when supported.\n  * Fixed ParticleSystem:setParticleLifetime to error if a negative value is given.\n  * Fixed Shader:send and Shader:sendColor ignoring the last argument for an array.\n  * Fixed a crash when love.graphics.pop is called after a love.window.setMode while the transformation stack was not empty.\n  * Fixed love.window.isMaximized.\n  * Fixed video playback to work with a wider range of Ogg Theora files.\n  * Fixed video seeking to be faster.\n  * Fixed BezierCurves to error instead of hanging in some situations.\n  * Fixed compilation of luasocket with newer luajit 2.1.0 beta versions.\n\nLOVE 0.10.2 [Super Toast]\n-------------------------\n\nReleased: 2016-10-31\n\n  * Added lovec.exe in Windows. It is the same as love.exe but built with the Console subsystem, so it always uses or provides a console.\n  * Added the ability to restart the game via love.event.quit(\"restart\").\n  * Added support for passing a table to love.mouse.isDown, love.keyboard.isDown, love.keyboard.isScancodeDown, Joystick:isDown, and Joystick:isGamepadDown.\n  * Added love.window.isMaximized.\n  * Added 'shaderswitches' field to the table returned by love.graphics.getStats.\n  * Added Quad:getTextureDimensions.\n  * Added 'ellipse' area distribution to ParticleSystems.\n  * Added support for BC4-7 compressed texture formats in KTX files.\n  * Added PrismaticJoint:getAxis and WheelJoint:getAxis.\n  * Added 2-point version of love.physics.newRevoluteJoint.\n  * Added table variants of Fixture:setCategory and Fixture:setMask.\n  * Added getNextVertex and getPreviousVertex to ChainShape and EdgeShape.\n  * Added optional reference angle arguments to RevoluteJoint, PrismaticJoint, and WeldJoint constructors.\n  * Added RevoluteJoint:getReferenceAngle, PrismaticJoint:getReferenceAngle, and WeldJoint:getReferenceAngle.\n\n  * Deprecated undocumented Shader:sendTexture, Shader:sendMatrix, Shader:sendInt, and Shader:sendFloat functions.\n\n  * Fixed love on iOS 6.\n  * Fixed os.execute always returning -1 on Linux.\n  * Fixed the love.lowmemory callback to call collectgarbage() after the callback has fired, instead of before.\n  * Fixed love.math.noise(nil) to error instead of returning nil.\n  * Fixed an occasional crash when a Thread ends.\n  * Fixed a hang at the end of video playback with some video files.\n  * Fixed the video decoding thread to not do any work when there are no videos to decode.\n  * Fixed love.graphics.newVideo(file) to no longer error if love.audio is disabled.\n  * Fixed a rare bug in Source:play for streaming Sources if the associated OpenAL source object was previously used for a static Source.\n  * Fixed corrupted Font glyphs in rare cases.\n  * Fixed stencils inside Canvases on some OpenGL ES 2 devices.\n  * Fixed an OpenGL error in OpenGL ES 3 when multiple render targets are used.\n  * Fixed love.window.setMode crashing when called with a Canvas active.\n  * Fixed love.window.maximize to update the reported window dimensions immediately.\n  * Fixed gamma correction of ImageFonts and BMFonts with colored images.\n  * Fixed the default shader improperly applying gamma correction to per-vertex colors when gamma correction is requested but not supported on OpenGL ES.\n  * Fixed text coloring breaking because of an empty string.\n  * Fixed large burst of particles when dramatically increasing the emission rate of a ParticleSystem.\n  * Fixed SpriteBatch:setBufferSize to keep old sprite data if it can fit.\n  * Fixed MouseJoint:getBodies unconditionally erroring.\n  * Fixed memory leak in Text:set.\n  * Fixed incorrect kerning caused by using kerning information for the wrong character in some fonts.\n  * Fixed ImageData:setPixel/getPixel/mapPixel and SoundData:setSample/getSample to properly handle non-integer coordinates.\n\n  * Improved performance of Channel methods by roughly 2x in many cases.\n  * Improved performance of Shader:send when small numbers of arguments are given.\n\n  * Updated love.filesystem.mount to accept a DroppedFile as the first parameter.\n  * Updated Shader:send to do type and argument checking based on the specified uniform variable's information instead of the arguments to the function.\n  * Updated Shader:send to accept a flat table for matrix uniforms.\n\n\nLOVE 0.10.1 [Super Toast]\n-------------------------\n\nReleased: 2016-02-14\n\n  * Added a new love.conf flag t.externalstorage, which determines whether files are saved in internal or external storage on Android devices.\n  * Added a new variant of love.graphics.arc which can draw different types of arcs (\"pie\", \"open\", or \"closed\").\n  * Added \"lighten\" and \"darken\" BlendModes. They can only be used with the \"premultiplied\" BlendAlphaMode.\n  * Added the \"lighten\" GraphicsFeature constant.\n  * Added the ability to avoid clearing specific Canvases when calling love.graphics.clear, if multiple Canvases are active at once via love.graphics.setCanvas.\n  * Added Text:getDimensions.\n  * Added optional \"collideconnected\" argument to love.physics.newMotorJoint.\n\n  * Fixed a Lua error in the no-game screen if the window's height is too small.\n  * Fixed the default error handler to reset the mouse Cursor.\n  * Fixed love.filesystem functions crashing when called if liblove is used directly without calling love.filesystem.init.\n  * Fixed audio on Android to pause when the app is inactive, and resume when the app becomes active again.\n  * Fixed the Video decoding thread hanging after Video:seek or when a Video finishes.\n  * Fixed Video:isPlaying to always return false after it finishes playing.\n  * Fixed RandomGenerator:random crashing if a nil 'self' is used.\n  * Fixed loading BMFont files which have characters with 0 width or height (a space character, for example).\n  * Fixed love.graphics.newFont causing crashes if FileData is passed in.\n  * Fixed love.graphics.clear(colortable) causing crashes on OpenGL ES 2 systems when a Canvas is active.\n  * Fixed a driver bug on some Android devices which caused all objects to show up as black.\n  * Fixed a driver bug on Windows with AMD graphics cards where love.graphics.clear would not always work.\n  * Fixed Shader:sendColor incorrectly converting alpha values from sRGB to linear RGB when gamma-correct rendering is enabled.\n  * Fixed love.graphics.newMesh(vertices) double-converting colors from sRGB to linear RGB when gamma-correct rendering is enabled.\n  * Fixed love.graphics.new* crashing when there is no graphics context/window.\n\n  * Updated the Windows executable to prefer the high-powered AMD graphics card on systems which have switchable Intel+AMD GPUs.\n  * Updated love.touch.getTouches to return the list of IDs in the relative order that the touches initially happened, instead of being in a random order.\n  * Updated the error messages caused by invalid or bad arguments to ImageData and SoundData methods to be more descriptive.\n\n\nLOVE 0.10.0 [Super Toast]\n-------------------------\n\nReleased: 2015-12-22\n\n  * Added an iOS port.\n  * Added an Android port.\n  * Added the flag t.accelerometerjoystick to love.conf. Disables accelerometer-as-joystick functionality on mobile devices when false.\n  * Added the flag t.gammacorrect to love.conf (replaces t.window.srgb.) Enabling it globally enables gamma-correct rendering, when supported.\n  * Added video playback support for Ogg Theora videos, via love.graphics.newVideo and Video objects.\n  * Added love.video module. It is not used for displaying videos on-screen, only decoding them.\n  * Added love.touch module. Note that it has important differences from the touch implementation in the LÖVE 0.9 Android and iOS ports.\n  * Added love.touchpressed, love.touchreleased, and love.touchmoved.\n  * Added love.system.vibrate.\n  * Added love.filesystem.setRequirePath and love.filesystem.getRequirePath.\n  * Added an optional program exit argument to love.event.quit.\n  * Added love.filedropped and love.directorydropped event callback functions.\n  * Added love.lowmemory event callback function, called when the app is running out of memory on mobile operating systems.\n  * Added love.textedited event callback function, called when the user is compositing text (e.g. via an IME.)\n  * Added love.wheelmoved event callback function (replaces \"wu\" and \"wd\" constants for love.mousepressed.)\n  * Added love.mouse.hasCursor.\n  * Added a boolean argument to love.mousepressed and love.mousereleased indicating whether the button event originated from a touch press.\n  * Added optional x/y/width/height arguments to love.keyboard.setTextInput. They tell the system where text will show up so on-screen keyboards can avoid that area.\n  * Added Source:getType (replaces Source:isStatic.)\n  * Added Source:getDuration and Decoder:getDuration.\n  * Added an optional string argument containing raw pixel byte data to the width/height variant of love.image.newImageData.\n  * Added love.graphics.ellipse.\n  * Added rounded-rectangle support to love.graphics.rectangle.\n  * Added love.graphics.points (replaces love.graphics.point.)\n  * Added love.graphics.intersectScissor.\n  * Added an optional argument to love.graphics.setBlendMode which indicates whether to treat the colors of drawn objects as having pre-multiplied alpha.\n  * Added love.graphics.getSupported (replaces love.graphics.isSupported.)\n  * Added love.graphics.getSystemLimits (replaces love.graphics.getSystemLimit.)\n  * Added love.graphics.stencil and love.graphics.set/getStencilTest (replaces love.graphics.setStencil.)\n  * Added love.graphics.isActive.\n  * Added color arguments to love.graphics.clear. It no longer always uses the background color value.\n  * Added love.graphics.discard.\n  * Added love.graphics.isGammaCorrect.\n  * Added the \"clampzero\" WrapMode.\n  * Added the ability to specify custom mipmaps when creating an image, via love.graphics.newImage(filename, {mipmaps={mip1, mip2, ...}})\n  * Added optional x/y/width/height arguments to Image:refresh and Canvas:newImageData.\n  * Added Image:getFlags.\n  * Added one- and two-channel Canvas formats: r8, rg8, r16f, rg16f, r32f, and rg32f.\n  * Added support for different formats in each Canvas when using multi-canvas rendering. Added the \"multicanvasformats\" Graphics Feature constant.\n  * Added support for OpenGL ES 2 and 3.\n  * Added support for loading ETC, EAC, PVRTC, and ASTC compressed textures on systems that support them.\n  * Added custom vertex attribute support for Meshes via new variants of love.graphics.newMesh.\n  * Added Mesh:setVertexAttribute and Mesh:getVertexAttribute.\n  * Added Mesh:getVertexFormat.\n  * Added Mesh:flush.\n  * Added an optional 'startvertex' argument to Mesh:setVertices.\n  * Added the ability for love.graphics.newMesh and Mesh:setVertices to accept a Data object.\n  * Added Mesh:setAttributeEnabled and Mesh:isAttributeEnabled.\n  * Added Mesh:attachAttribute.\n  * Added SpriteBatch:attachAttribute.\n  * Added Shader:sendColor.\n  * Added new shader functions: gammaCorrectColor, gammaToLinear, and linearToGamma. The functions also have 'precise' and 'fast' variants.\n  * Added Text objects and love.graphics.newText.\n  * Added per-character color support to love.graphics.print/printf and to Text objects.\n  * Added BMFont bitmap font file support to love.graphics.newFont and love.font.\n  * Added kerning support for TrueType/OpenType and BMFont Fonts.\n  * Added an optional font hinting argument to love.graphics.newFont when loading TrueType fonts.\n  * Added an optional spacing argument to love.graphics.newImageFont, which applies additional spacing to all rendered glyphs.\n  * Added Font:setFallbacks.\n  * Added love.window.maximize.\n  * Added love.window.close.\n  * Added love.window.requestAttention.\n  * Added love.window.setDisplaySleepEnabled and love.window.isDisplaySleepEnabled.\n  * Added BezierCurve:renderSegment and BezierCurve:removeControlPoint.\n  * Added BezierCurve:getSegment.\n  * Added love.math.compress and love.math.decompress.\n  * Added Channel:performAtomic.\n\n  * Changed love.mousepressed, love.mousereleased, and love.mouse.isDown to use button numbers instead of named button constants.\n  * Changed love.keypressed to be love.keypressed(key, scancode, isrepeat).\n  * Changed love.keyreleased to be love.keyreleased(key, scancode).\n  * Changed Font:getWrap's second return value to be a table containing the text split into lines.\n  * Changed love.graphics.newImage's optional second argument to be a table of flags (flags are \"mipmaps\" and \"linear\".)\n  * Changed the arguments for the standard variants of love.graphics.newMesh to newMesh(vertices [, drawmode, usage]) and newMesh(vertexcount [, drawmode, usage]).\n  * Changed ImageData:encode to return a FileData object. ImageData:encode's first parameter is now the format to encode to, and the second parameter is an optional filename to write to.\n\n  * Renamed the \"normal\" Fullscreen Type to \"exclusive\".\n  * Renamed the DistanceModel constants \"inverse clamped\", \"linear clamped\", and \"exponent clamped\" to \"inverseclamped\", \"linearclamped\", and \"exponentclamped\".\n  * Renamed the \"additive\", \"subtractive\", and \"multiplicative\" BlendModes to \"add\", \"subtract\", and \"multiply\".\n  * Renamed the KeyConstant and Scancode representing the spacebar from \" \" to \"space\".\n  * Renamed File:eof to File:isEOF.\n  * Renamed Canvas:getImageData to Canvas:newImageData.\n  * Renamed love.image's CompressedData type to CompressedImageData.\n\n  * Removed callback variant of love.filesystem.getDirectoryItems.\n  * Removed the \"wu\" and \"wd\" constants for love.mousepressed (replaced by love.wheelmoved.)\n  * Removed the named mouse button constants (replaced by button numbers.)\n  * Removed Source:isStatic (replaced by Source:getType.)\n  * Removed image loading support for all (non-compressed texture) file formats except for PNG, JPEG, TGA, and BMP.\n  * Removed JPEG encoding support from ImageData:encode.\n  * Removed love.graphics.point (replaced by love.graphics.points.)\n  * Removed love.graphics.setPointStyle and love.graphics.getPointStyle.\n  * Removed love.graphics.isSupported (replaced by love.graphics.getSupported.)\n  * Removed love.graphics.getSystemLimit (replaced by love.graphics.getSystemLimits.)\n  * Removed love.graphics.setStencil (replaced by love.graphics.stencil and love.graphics.setStencilTest.)\n  * Removed the \"canvas\", \"shader\", \"npot\", \"subtractive\", and \"mipmap\" Graphics Feature constants (the features always have guaranteed support now.)\n  * Removed the \"multicanvas\" Graphics Feature constant (use love.graphics.getSystemLimits instead.)\n  * Removed the \"srgb\" Graphics Feature constant (use love.graphics.isGammaCorrect() or love.graphics.getCanvasFormats().srgb instead.)\n  * Removed the \"srgb\" flag in love.window.setMode and in the t.window table in love.conf (Replaced by t.gammacorrect.)\n  * Removed the \"premultiplied\" blend mode (love.graphics.setBlendMode(\"alpha\", \"premultiplied\") now does the same thing.)\n  * Removed Canvas:getPixel (use Canvas:newImageData instead.)\n  * Removed Canvas:clear (use love.graphics.clear instead.)\n  * Removed Mesh:getVertices.\n  * Removed Mesh:setVertexColors and Mesh:hasVertexColors (use Mesh:setAttributeEnabled(\"VertexColor\", enable) instead.)\n  * Removed functions deprecated in LOVE 0.9.1 and 0.9.2:\n    * Removed love.graphics.getMaxImageSize and love.graphics.getMaxPointSize (replaced by love.graphics.getSystemLimits.)\n    * Removed Mesh:set/getImage, SpriteBatch:set/getImage, and ParticleSystem:set/getImage (replaced by set/getTexture.)\n    * Removed SpriteBatch:bind/unbind.\n    * Removed Canvas:getFSAA and the \"fsaa\" flag in love.conf and love.window.setMode (replaced by Canvas:getMSAA and \"msaa\".)\n    * Removed the \"dxt\" and \"bc5\" Graphics Feature constant (replaced by love.graphics.getCompressedImageFormats.)\n    * Removed the \"hdrcanvas\" Graphics Feature constant (replaced by love.graphics.getCanvasFormats.)\n    * Removed love.window.getWidth/getHeight/getDimensions (use love.graphics.getWidth/getHeight/getDimensions or love.window.getMode instead.)\n\n  * Fixed utf8.char.\n  * Fixed detection of fused love games.\n  * Fixed World:getCallbacks and World:getContactFilter when used in coroutines.\n  * Fixed crashes when objects which store Lua callback functions are garbage collected after being used in coroutines.\n  * Fixed memory leaks in love.physics if World:destroy is never called. When a World is GCed it now destroys all objects it owns.\n  * Fixed love.keyboard.getKeyFromScancode crashing when an invalid scancode is given.\n  * Fixed decoding of 8-bit WAV files.\n  * Fixed a crash issue when rewinding streaming ogg Sources, when certain versions of libvorbis are used.\n  * Fixed love.audio.stop() not rewinding streaming Sources.\n  * Fixed the stencil buffer in Canvases when an unsupported MSAA value is used to create the Canvas.\n  * Fixed Canvas:renderTo to restore the previous Canvas if an error occurs in the passed function.\n  * Fixed love.graphics.draw(canvas) to cause an error if that Canvas is the active one.\n  * Fixed Mesh:getVertexMap to return nil rather than an empty table, if no vertex map has been set.\n  * Fixed love.graphics.getColorMask.\n  * Fixed the default offset for particles when ParticleSystem:setQuads or ParticleSystem:setTexture is used.\n  * Fixed love.graphics.shear resetting all love.graphics transformations.\n  * Fixed the \"add\" and \"subtract\" blend modes to no longer modify the alpha of the Canvas / screen.\n\n  * Improved the performance of World:rayCast and World:queryBoundingBox.\n  * Improved the performance of love.graphics.line and other line drawing functions, when the \"smooth\" LineStyle is used.\n  * Improved the performance of Shader:send when matrices are used.\n  * Improved the performance of ImageData and SoundData methods when LuaJIT's JIT compiler is enabled, by using efficient FFI code.\n  * Improved the performance of love.math.noise, love.math.gammaToLinear, love.math.linearToGamma, love.math.random, and RandomGenerator:random when LuaJIT's JIT compiler is enabled.\n\n  * Updated the compatibility warning notice to use a message box and to show the version specified in love.conf.\n  * Updated the compatibility warning notice to display before main.lua is loaded.\n  * Updated the __tostring metamethod of love objects to output the pointer value, similar to tostring(table).\n  * Updated World:setCallbacks, World:setContactFilter, World:queryBoundingBox, and World:rayCast to have improved argument type checking.\n  * Updated threads to load love.filesystem automatically.\n  * Updated love.filesystem to enable symlinks by default.\n  * Updated love.math.setRandomSeed and RandomGenerator:setSeed to produce better results for the first few random() calls.\n  * Updated love.math.random and RandomGenerator:random to produce slightly better results in general.\n  * Updated Source methods that deal with spatial audio to error rather than failing silently if the Source isn't mono.\n  * Updated the 3D and 4D variants of love.math.noise to use Perlin noise rather than Simplex noise, to avoid patent issues.\n  * Updated ImageFonts to no longer treat separator pixels as spacing.\n  * Updated the default font to use less memory.\n  * Updated the behavior of text wrapping with love.graphics.printf and Font:getWrap to work better.\n  * Updated love.graphics.print and love.graphics.printf to no longer automatically round the x and y position arguments.\n  * Updated some error messages for love.graphics.newImage to be more descriptive.\n  * Updated love.graphics color functions to automatically apply love.math.gammaToLinear to color values when gamma-correct rendering is enabled.\n  * Updated the 'normal' Canvas format to internally use 'srgb' rather than 'rgba8' when gamma-correct rendering is enabled.\n  * Updated love.graphics.setColor to affect all drawn objects, including ParticleSystems, SpriteBatches, and Meshes.\n  * Updated the default fullscreen type to be \"desktop\" rather than \"exclusive\".\n  * Updated the minimum runtime system requirements of LOVE to require OpenGL 2.1 or OpenGL ES 2 support.\n  * Updated the pixel shader effect function so screen_coords.y is 0 at the top of the screen instead of the bottom.\n  * Updated Images to require setting the mipmaps flag to true on creation in order to use mipmaps.\n  * Updated Images to allow mipmaps for non-power-of-two sizes.\n\nLOVE 0.9.2 [Baby Inspector]\n---------------------------\n\n  Released: 2015-02-14\n\n  * Added Lua 5.3's UTF-8 module (via utf8 = require(\"utf8\")).\n  * Added Shader:getExternVariable.\n  * Added several new canvas texture formats.\n  * Added love.graphics.getCanvasFormats.\n  * Added love.graphics.getCompressedImageFormats.\n  * Added ParticleSystem:setQuads.\n  * Added ParticleSystem:setLinearDamping.\n  * Added SpriteBatch:flush.\n  * Added love.graphics.getStats.\n  * Added \"mirroredrepeat\" wrap mode.\n  * Added love.audio.setDopplerScale and love.audio.getDopplerScale.\n  * Added optional duration argument to Joystick:setVibration.\n  * Added love.joystick.loadGamepadMappings and love.joystick.saveGamepadMappings.\n  * Added Joint:setUserData and Joint:getUserData.\n  * Added Joint:getBodies.\n  * Added GearJoint:getJoints.\n  * Added Contact:getFixtures and Body:getContactList.\n  * Added Body:getWorld.\n  * Added Body:getJointList.\n  * Added Body/Contact/Fixture/Joint/World:isDestroyed.\n  * Added love.mousemoved event callback.\n  * Added love.mouse.setRelativeMode and love.mouse.getRelativeMode.\n  * Added Scancode enums, love.keyboard.getKeyFromScancode, and love.keyboard.getScancodeFromKey.\n  * Added love.window.getDisplayName.\n  * Added love.window.minimize.\n  * Added love.window.showMessageBox.\n  * Added 'refreshrate' field to the table returned by love.window.getMode.\n  * Added love.window.toPixels and love.window.fromPixels.\n  * Added love.window.setPosition and love.window.getPosition, and 'x' and 'y' fields to love.window.setMode and t.window in love.conf.\n  * Added love.filesystem.isSymlink, love.filesystem.setSymlinksEnabled, and love.filesystem.areSymlinksEnabled.\n  * Added love.filesystem.getRealDirectory.\n\n  * Deprecated SpriteBatch:bind and SpriteBatch:unbind.\n  * Deprecated all uses of the name 'FSAA' in favor of 'MSAA'.\n  * Deprecated the 'hdrcanvas' graphics feature enum in favor of getCanvasFormats.\n  * Deprecated the 'dxt' and 'bc5' graphics feature enums in favor of getCompressedImageFormats.\n\n  * Fixed crashes when love objects are used in multiple threads.\n  * Fixed love.filesystem.setIdentity breaking in some situations when called multiple times.\n  * Fixed the default love.filesystem identity when in Fused mode in Windows.\n  * Fixed love.system.openURL sometimes blocking indefinitely on Linux.\n  * Fixed love.joystick.setGamepadMapping.\n  * Fixed the order of vertices in ChainShapes.\n  * Fixed love.mouse.getPosition returning outdated values if love.mouse.setPosition is used in the same frame.\n  * Fixed love.graphics.newFont to error when given an invalid size argument.\n  * Fixed the filename and backtrace given when love.graphics.print errors.\n  * Fixed a small memory leak if love.graphics.newCanvas errors.\n  * Fixed shader:getWarnings returning unnecessary information.\n  * Fixed some cases of noncompliant shader code not properly erroring on some nvidia drivers.\n  * Fixed a potential crash when Shader objects are garbage collected.\n  * Fixed a potential small memory leak triggered when love.graphics.newShader errors.\n  * Fixed love.graphics.newMesh(vertexcount, ...) causing the Mesh to do instanced rendering.\n  * Fixed Mesh:getVertexMap.\n  * Fixed Image:refresh generating mipmaps multiple times if mipmap filtering is enabled.\n  * Fixed Image:setMipmapFilter to not keep bad state around if it errors.\n  * Fixed Mesh:setDrawRange when the Mesh has a vertex map set.\n  * Fixed internal detection of the 'position' and 'effect' shader functions.\n  * Fixed Texture memory leak when Meshes are garbage collected.\n  * Fixed the default line join mode to be 'miter' instead of an undefined value.\n  * Fixed the default error handler text size when highdpi mode is enabled on a Retina monitor.\n  * Fixed the default error handler background color when sRGB mode is enabled for the window.\n  * Fixed love.window.setMode to fall back to the largest available mode if a width or height greater than the largest supported is specified and fullscreen is used.\n  * Fixed the state of wireframe mode when love.window.setMode is called.\n  * Fixed Canvas:getPixel to error if the coordinates are not within the Canvas' size.\n  * Fixed detection of compressed textures to work regardless of the file's extension.\n\n  * Renamed all cases of FSAA to MSAA. The FSAA names still exist for backward-compatibility.\n\n  * Updated the Windows executable to automatically prefer the higher performance GPU on nvidia Optimus systems.\n  * Updated the --console command-line argument in Windows to open the console before conf.lua is loaded.\n  * Updated t.console and the --console command-line argument in Windows to use the existing Console window, if love was launched from one.\n  * Updated the love executable to verify that the love library's version matches.\n  * Updated the Lua wrapper code for modules to avoid crashes when the module's instance is created, deleted, and recreated.\n  * Updated internal code for handling garbage collection of love objects to be more efficient.\n  * Updated love's initialization code to trigger a Lua error if love.conf has an error in it.\n  * Updated the paths returned by love.filesystem.getSaveDirectory and friends to strip double-slashes from the string.\n  * Updated the error message when love.filesystem.write or File:open fails because the directory doesn't exist.\n  * Updated the error message when love.math.setRandomseed(0) is attempted.\n  * Updated the error message when invalid UTF-8 strings are used in love functions that expect UTF-8.\n  * Updated love.physics.newPolygonShape and love.physics.newChainShape to accept a table of vertices.\n  * Updated love.physics.newChainShape to error if the number of arguments is invalid.\n  * Updated love.thread.newThread to accept a literal string of code directly.\n  * Updated love-created threads to use names visible in external debuggers.\n  * Updated SpriteBatch:unbind to use less VRAM if the SpriteBatch has the static usage hint.\n  * Updated love.graphics.newImage, love.image.newImageData, etc. to leave less Lua-owned memory around.\n  * Updated love.graphics.push to accept different stack types to push. Current types are \"transform\" and \"all\".\n  * Updated love shaders to accept GLSL ES precision qualifiers on variables, although they do nothing.\n  * Updated the error message for love.graphics.newShader to be less cryptic if an invalid filename is given.\n  * Updated compressed texture loading code to allow BC6 and BC7 compressed textures (if the graphics driver supports them.)\n\nLOVE 0.9.1 [Baby Inspector]\n---------------------------\n\n  Released: 2014-04-01\n\n  * Added Source:clone.\n  * Added blend mode \"screen\".\n  * Added ParticleSystem:clone.\n  * Added ParticleSystem:moveTo, has smoother emitter movement compared to setPosition.\n  * Added ParticleSystem:setRelativeRotation.\n  * Added love.graphics.setWireframe for debugging.\n  * Added Mesh:setDrawRange and Mesh:getDrawRange.\n  * Added CircleShape:getPoint and CircleShape:setPoint.\n  * Added Mesh/SpriteBatch/ParticleSystem:setTexture, accepts Canvases and Images.\n  * Added high-dpi window support for Retina displays in OS X, via the 'highdpi' window flag.\n  * Added love.window.getPixelScale.\n  * Added love.graphics.getSystemLimit.\n  * Added antialiasing support to Canvases.\n  * Added Canvas:getFSAA.\n  * Added 'love_ScreenSize' built-in variable in shaders.\n  * Added love.getVersion.\n  * Added support for gamma-correct rendering.\n  * Added love.graphics.isSupported(\"srgb\").\n  * Added love.math.gammaToLinear and love.math.linearToGamma.\n  * Added RandomGenerator:getState and RandomGenerator:setState.\n  * Added Body:setUserData and Body:getUserData.\n  * Added some missing obscure key constants.\n  * Added optional callback function argument to love.filesystem.getDirectoryItems.\n  * Added love.system.openURL.\n\n  * Deprecated Mesh/SpriteBatch/ParticleSystem:setImage.\n  * Deprecated love.graphics.getMaxImageSize and love.graphics.getMaxPointSize.\n\n  * Fixed love.graphics.scale with negative values causing incorrect line widths.\n  * Fixed Joystick:isDown using 0-based button index arguments.\n  * Fixed Source:setPitch to error when infinity or NaN is given.\n  * Fixed love.graphics.setCanvas() to restore the proper viewport and scissor rectangles.\n  * Fixed TrueType font glyphs which request a monochrome bitmap pixel mode.\n  * Fixed love.graphics.reset causing crashes when called in between love.graphics.push/pop.\n  * Fixed tab characters (\"\\t\") to display properly with love.graphics.print.\n  * Fixed love.graphics.isCreated to return false when love.window.setMode fails completely.\n  * Fixed love.window.setMode to not destroy OpenGL resources before checking whether a fullsceren size is supported.\n  * Fixed World:getBodyList and World:getJointList causing hard crashes.\n  * Fixed loading BC4 compressed textures.\n  * Fixed SoundData objects being initialized with garbage values.\n  * Fixed 8-bit SoundData samples when used in love.audio Sources.\n\n  * Updated the error text for love.filesystem’s module searchers when require fails.\n  * Updated the love.filesystem module searchers to be tried after package.preload instead of before.\n  * Updated love.graphics.newParticleSystem, newSpriteBatch, and newMesh to accept Canvases.\n  * Updated Canvas drawing code, texture coordinates are no longer flipped vertically.\n  * Updated Canvas:renderTo to work properly if a Canvas is currently active.\n  * Updated ParticleSystem:setEmissionRate to accept non-integer numbers.\n  * Updated Source:play to return a boolean indicating success.\n  * Updated t.console in conf.lua to create the console before modules are loaded in Windows.\n  * Updated Mesh vertex maps (index buffers) to use less space in VRAM.\n  * Updated love.graphics.newMesh and Mesh:setVertices to default the UV parameters to 0,0.\n  * Updated Fixture:set/getUserData to work in Coroutines.\n  * Updated fullscreen-desktop and resizable window modes in OS X to use Mac OS 10.7's fullscreen Spaces.\n  * Updated love.filesystem's C library loader to look in paths added via love.filesystem.mount, in Fused mode.\n  * Updated the default love.run code to make initial love.math.random calls more random.\n\nLOVE 0.9.0 [Baby Inspector]\n---------------------------\n\n  Released: 2013-12-13\n\n  * Added better multiplayer networking support via ENet.\n  * Added --fused command line argument, to simulate fusing.\n  * Added liblove.\n  * Added the ability to have exit values.\n  * Added exit value of 1 in case of error by default.\n  * Added basic support for the file:// uri scheme.\n  * Added love.filesystem.isFused.\n  * Added love.filesystem.getIdentity.\n  * Added love.filesystem.append.\n  * Added love.filesystem.getSize.\n  * Added love.filesystem.mount and love.filesystem.unmount.\n  * Added optional file search order parameter to love.filesystem.setIdentity.\n  * Added File:isOpen and File:getMode.\n  * Added Fie:setBuffer, File:getBuffer, and File:flush.\n  * Added textinput event for unicode text input.\n  * Added love.keyboard.setTextInput and love.keyboard.hasTextInput.\n  * Added previously internal Rasterizer and GlyphData object methods.\n  * Added support for UTF-8 ImageFonts.\n  * Added Font:getAscent/getDescent/getBaseline.\n  * Added Font:setFilter/getFilter.\n  * Added Font:hasGlyphs.\n  * Added angle, scale, and shear parameters to love.graphics.printf.\n  * Added HDR canvas support.\n  * Added mipmapping support (has isSupported test).\n  * Added vertex shader support.\n  * Added boolean support to Shader:send.\n  * Added Canvas:getPixel.\n  * Added blend mode \"replace\".\n  * Added line join modes.\n  * Added Mesh objects, allowing for arbitrary textured polygons.\n  * Added multiple render target support to love.graphics.setCanvas.\n  * Added love.graphics.setColorMask.\n  * Added love.graphics.origin.\n  * Added love.graphics.getRendererInfo.\n  * Added love.graphics.getMaxImageSize.\n  * Added SpriteBatch:getCount and SpriteBatch:getBufferSize.\n  * Added SpriteBatch:getColor.\n  * Added ParticleSystem:emit.\n  * Added ParticleSystem:setInsertMode and ParticleSystem:getInsertMode.\n  * Added many ParticleSystem getter methods.\n  * Added DXT compressed texture support via love.image.newCompressedData.\n  * Added love.image.isCompressed and Image:isCompressed.\n  * Added Image/Canvas/ImageData:getDimensions.\n  * Added anisotropic filtering support for Images, Canvases, and Fonts.\n  * Added Image:refresh.\n  * Added Image:getData.\n  * Added SoundData:getDuration and SoundData:getSampleCount.\n  * Added Source:isPlaying.\n  * Added Source:setRelative and Source:isRelative.\n  * Added Source:setCone and Source:getCone.\n  * Added Source:getChannels.\n  * Added new Channels API for love.thread.\n  * Added limited table support to Channel:push.\n  * Added Thread:getError.\n  * Added Thread:isRunning.\n  * Added threaderror event.\n  * Added love.math module.\n  * Added a platform-independent (good) random implementation to love.math.\n  * Added RandomGenerator objects.\n  * Added BezierCurve objects.\n  * Added love.math.triangulate and love.math.isConvex.\n  * Added love.math.noise.\n  * Added love.timer.getAverageDelta.\n  * Added Data:getString.\n  * Added Contact:getChildren.\n  * Added love.system module.\n  * Added love.system.getClipboardText and love.system.setClipboardText.\n  * Added love.system.getOS and love.system.getProcessorCount.\n  * Added love.window module.\n  * Added love.window.isVisible.\n  * Added flags to love.window.setMode.\n  * Added monitor choosing support to love.window.setMode.\n  * Added support for resizable, borderless, and non-centered windows.\n  * Added support for \"fullscreen-desktop\" mode.\n  * Added window resize and visible events.\n  * Added love.window.getDimensions.\n  * Added love.window.getIcon.\n  * Added t.window.icon to love.conf.\n  * Added love.mousefocus and love.window.hasMouseFocus.\n  * Added custom hardware cursors via love.mouse.newCursor.\n  * Added love.mouse.setX/setY.\n  * Added Joystick objects.\n  * Added love.joystick.getJoystick.\n  * Added joystick connect and disconnect events.\n  * Added joystickaxis and joystickhat events.\n  * Added unified Gamepad API for joysticks which have a similar layout to the Xbox controller.\n  * Added joystick vibration support, works with most common gamepads.\n  * OPTIONAL: Added support for Game Music Emu.\n\n  * Fixed fused mode in OS X.\n  * Fixed printing to the console in Windows before love.load is called.\n  * Fixed the default love.run to not include the time taken by love.load in the first frame's dt.\n  * Fixed the error screen not always appearing until the next input event.\n  * Fixed love.event.clear.\n  * Fixed love.mouse.setPosition when called in love.load.\n  * Fixed scaling in several love.physics functions.\n  * Fixed Box2D exception in World:update.\n  * Fixed many uncaught Box2D / love.physics exceptions for Bodies and Joints.\n  * Fixed ChainShape:getPoints running out of Lua stack space and crashing.\n  * Fixed File:read reading past end of file.\n  * Fixed love.filesystem.setIdentity not removing read access from old directories.\n  * Fixed possible memory leak in utf-8 decoder.\n  * Fixed spacing for the last character in an ImageFont.\n  * Fixed line wrapping in love.graphics.printf.\n  * Fixed love.graphics.printf to error if the wrap limit is negative.\n  * Fixed love.graphics.print truncating strings with embedded zeros.\n  * Fixed crashes with font drawing on some ATI cards.\n  * Fixed artifacts when drawing lines at huge scale.\n  * Fixed Fonts and Canvases ignoring default image filter.\n  * Fixed scissor boxes when a canvas is set after love.graphics.setScissor is called.\n  * Fixed love.graphics.getLineWidth returning incorrect values.\n  * Fixed love.graphics.getColor on some Windows systems.\n  * Fixed alpha blend mode.\n  * Fixed multiplicative blend mode.\n  * Fixed love.graphics.getPointStyle.\n  * Fixed line numbers in shader errors.\n  * Fixed Shader:send with Images and Canvases failing sometimes.\n  * Fixed Shader:send to keep a reference to sent Images and Canvases.\n  * Fixed crash when binding SpriteBatches multiple times.\n  * Fixed SpriteBatches with more than 16,384 sprites.\n  * Fixed particle draw order for ParticleSystems.\n  * Fixed ParticleSystem:setSizes resetting the size variation.\n  * Fixed the graphics viewport not matching the window size when using an unsupported fullscreen mode.\n  * Fixed getMode and friends returning wrong values when using desktop size.\n  * Fixed keyrepeat settings being lost after (indirect) setMode.\n  * Fixed the icon being reset after setMode.\n  * Fixed memory leak in the mp3 decoder.\n  * Fixed sound issues with some versions of OpenAL soft, by enabling direct channels.\n  * Fixed 'random' hangs in audio.\n  * Fixed love.sound.newDecoder not accepting FileData.\n  * Fixed case (in)sensitivity of sound file extension parsing.\n  * Fixed looping support in tracker music formats.\n  * Fixed skipping/looping issues when playing streaming audio Sources.\n  * Fixed race condition in Source:play.\n  * Fixed WAVE sound playback.\n\n  * Moved love's startup to modules/love.\n  * Moved window-related functions from love.graphics to love.window.\n\n  * Renamed love's boot script to 'love.boot', which can be required.\n  * Renamed love.filesystem.mkdir to love.filesystem.createDirectory.\n  * Renamed love.filesystem.enumerate to love.filesystem.getDirectoryItems.\n  * Renamed World:setAllowSleeping to World:setSleepingAllowed.\n  * Renamed ChainShape:setPrevVertex to ChainShape:setPreviousVertex.\n  * Renamed Joint:enableMotor to Joint:setMotorEnabled.\n  * Renamed Joint:enableLimit and Joint:isLimitEnabled to Joint:setLimitsEnabled and Joint:hasLimitsEnabled.\n  * Renamed t.screen to t.window in love.conf.\n  * Renamed love.graphics.setCaption to love.window.setTitle.\n  * Renamed PixelEffect to Shader (but now with vertex shaders).\n  * Renamed love.graphics.setDefaultImageFilter to love.graphics.setDefaultFilter.\n  * Renamed ParticleSystem:setSprite to ParticleSystem:setImage.\n  * Renamed ParticleSystem:setGravity to ParticleSystem:setLinearAcceleration.\n  * Renamed ParticleSystem:setLifetime/setParticleLife to setEmitter/ParticleLifetime.\n  * Renamed ParticleSystem:count and all getNum* functions to get*Count.\n  * Renamed Source:setDistance to Source:setAttenuationDistances.\n  * Renamed SoundData:getBits and Decoder:getBits to SoundData:getBitDepth and Decoder:getBitDepth.\n  * Renamed love.mouse.setGrab to love.mouse.setGrabbed.\n\n  * Removed release mode.\n  * Removed love.keyboard.getKeyRepeat (see love.keyboard.hasKeyRepeat).\n  * Removed the unicode argument from love.keypressed (see love.textinput).\n  * Removed love.graphics.drawTest.\n  * Removed love.graphics.quad/triangle.\n  * Removed love.graphics.setColorMode.\n  * Removed love.graphics.newStencil.\n  * Removed love.graphics.setLine/setPoint.\n  * Removed love.graphics.drawq (functionality is merged into love.graphics.draw).\n  * Removed SpriteBatch:addq/setq (functionality is merged into SpriteBatch:add/set).\n  * Removed Quad:flip.\n  * Removed ParticleSystem:isFull/isEmpty.\n  * Removed ParticleSystem:getX/getY.\n  * Removed love.graphics.checkMode.\n  * Removed love.joystick.open and friends.\n  * Removed love.joystick module functions which operated on individual joysticks (see Joystick objects).\n  * Removed joystick ball support.\n  * Removed thread names.\n  * Removed old thread messaging API (see Channels).\n  * Removed love.timer.getMicroTime.\n\n  * Updated functions which return love objects to re-use the Lua-side object instead of always recreating it.\n  * Updated the windows console, it now tries to re-use an active one first.\n  * Updated error handling, error handlers now get resolved when the error occurs.\n  * Updated order of sleep/present in love.run (now draws, *then* sleeps).\n  * Updated love.filesystem to try to create the appdata directory if it doesn't exist yet.\n  * Updated the default filesystem identity to omit file extension.\n  * Updated love.filesystem.newFile to optionally open the file.\n  * Updated most love.filesystem functions to return nil, error on internal failure.\n  * Updated love.keyboard.setKeyRepeat to take a boolean argument instead of numbers.\n  * Updated love.keypressed's second argument to be a boolean indicating key repeat.\n  * Updated keyboard key constants for some more modern keyboard keys.\n  * Updated window code to use adaptive vsync when available, if vsync is enabled.\n  * updated love.graphics.print's x and y arguments to default to 0.\n  * Updated the setFilter and setWrap methods, the second argument is now optional.\n  * Updated Font and ParticleSystem rendering code, now more performant.\n  * Updated SpriteBatch code, now more performant when adding/setting and (un)binding.\n  * Updated Canvas code to support more systems.\n  * Updated Canvas:getImageData and love.graphics.newScreenshot to be more efficient.\n  * Updated love.graphics.newScreenshot to create a fully opaque image by default.\n  * Updated error messages when sending bad values to Shaders.\n  * Updated love.graphics.newParticleSystem to have a default buffer size of 1000.\n  * Updated ImageData:setPixel to accept a table and default to 255 alpha.\n  * Updated ImageData:mapPixel, is now more efficient and accepts optional x,y,w,h arguments.\n  * Updated love.image memory handling, improves errors and thread-safety.\n  * Updated all love object constructors to optionally accept FileData if they accept a filename.\n  * Updated allocation for SoundData, it's more efficient and less wasteful.\n  * Updated SoundData:set/getSample to error for invalid samples.\n  * Updated Source:set* functions to default z to 0.\n  * Updated Source:seek to error for negative offsets.\n  * Updated Thread:start to accept arguments which get passed to the thread.\n  * Updated love.timer.getFPS to be microsecond-accurate.\n  * Updated love.timer.getTime to be microsecond-accurate and monotonic.\n  * Updated Box2D to version 2.3.0.\n\nLOVE 0.8.0 [Rubber Piggy]\n-------------------------\n\n  Released: 2012-04-02\n\n  * Added release error screen.\n  * Added alpha to love.graphics.setBackgroundColor.\n  * Added Canvas:clear(r, g, b, a).\n  * Added Canvas support to love.graphics.drawq.\n  * Added Canvas:getWidth and Canvas:getHeight.\n  * Added love.graphics.arc.\n  * Added seek and tell to Source objects.\n  * Added color interpolation to ParticleSystem.\n  * Added automatic PO2 padding for systems not supporting the OpenGL extension.\n  * Added UTF-8 support for fonts.\n  * Added Box2D error handling for some commonly failing functions.\n  * Added ability for fused release games to have their write dir in appdata.\n  * Added shear transformation to drawing functions.\n  * Added origin to font printing.\n  * Added love.graphics.getMode.\n  * Added per-sprite colors on SpriteBatches.\n  * Added PixelEffects.\n  * Added love.graphics.isSupported.\n  * Added love.graphics.getCanvas.\n  * Added love.event.quit.\n  * Added stencil masks.\n  * Added alternative SpriteBatch provider, it should work everywhere now.\n  * Added a loader for binary modules.\n  * Added Thread:getKeys.\n  * Added option of fractions for Quads.\n  * Added PNG, JPEG and GIF support to ImageData:encode.\n  * Added 64-bit support for Mac OS X.\n  * Added premultiplied blending mode.\n  * Added functions to set/get default image filter modes.\n  * Added SpriteBatch:set.\n  * Added new events system, with support for custom events and long event names.\n  * Added sound attenuation by distance.\n  * Added SpriteBatch:getImage.\n  * Added combine color mode.\n  * Added automatic random seeding to love.run.\n  * Added support for the subtract BlendMode on older graphics cards.\n  * Added love._os field, which contains the OS the game is running on.\n\n  * Fixed wrapping for single words.\n  * Fixed tracebacks not showing filenames.\n  * Fixed love.graphics.push/pop capable of causing overflows/underflows.\n  * Fixed setScissor on Canvases.\n  * Fixed several issues with audio, e.g. clicks and pops in mp3s.\n  * Fixed crashes when bodies were destroyed during collisions.\n  * Fixed bound SpriteBatches corrupting when drawing.\n  * Fixed thread-safety issues with ImageData.\n  * Fixed memory leaks in audio sources.\n  * Fixed thread's set (previously send) accidentally changing the type.\n  * Fixed SoundData allocating the wrong number of samples.\n  * Fixed SpriteBatch support on Intel cards.\n  * Fixed love.filesystem.lines() leaking.\n  * Fixed most leaking on unclosed File objects.\n  * Fixed crashes when operating on non-existent files.\n  * Fixed a bug where empty files on windows would never reach eof.\n  * Fixed crash when SoundData runs out of memory.\n  * Fixed ordering of loaders, love should have priority over lua.\n  * Fixed several miscellaneous memory leaks.\n  * Fixed a few cases where strings with \\0 in them would not be stored correctly.\n  * Fixed love's startup time being in the first dt.\n  * Fixed internal string conversions, they are faster now.\n  * Fixed (bad) performance of ImageData:paste.\n  * Fixed love.graphics.toggleFullscreen not maintaining graphics state.\n\n  * Renamed SpriteBatch's lock/unlock to bind/unbind.\n  * Renamed Framebuffer to Canvas.\n  * Renamed love.thread.send/receive to set/get.\n  * Renamed love.graphics.setRenderTarget to setCanvas.\n\n  * Removed canvas auto-clearing.\n  * Removed EncodedImageData.\n  * Removed old syntax for require (with extension).\n  * Removed love.graphics.setFont([file], [size]).\n  * Removed Thread:kill.\n\n  * Updated love.joystick to be 1-indexed.\n  * Updated Sources to update more cleanly and control more intuitively.\n  * Updated font engine.\n  * Updated line drawing to a custom system.\n  * Updated love.timer.sleep to use seconds, like the rest of love.\n  * Updated love.timer to be more accurate.\n  * Updated love.graphics.circle to have max(10, r) as default for segments.\n  * Updated ImageData:encode to write to files directly.\n  * Updated version compatibility system to actually do something.\n  * Updated love.run's order, events are checked just before update.\n  * Updated Box2D to version 2.2.1.\n\nLOVE 0.7.2 [Game Slave]\n-----------------------\n\n  Released: 2011-05-04\n\n  * Added Framebuffer:get/setWrap.\n  * Added love.event.clear.\n  * Added support for any number of arguments to love.keyboard.isDown, love.mouse.isDown and love.joystick.isDown.\n  * Added SpriteBatch:setImage().\n\n  * Fixed fused games not working.\n  * Fixed ParticleSystem:setSize ignoring the variation argument.\n  * Fixed some file-opening exceptions not being caught.\n  * Fixed files loaded by libmodplug being too loud.\n  * Fixed paths with periods in them not working.\n  * Fixed love.graphics.getBlendMode not detecting subtractive and multiplicative blend modes.\n  * Fixed crash when there was no memory available for newImageData(w, h).\n\n  * Updated PhysicsFS version to 2.0.2 on Windows\n  * Updated OpenAL Soft version to 1.13 on Windows\n  * Updated libmodplug version to 0.8.8.1 on Windows\n  * Updated FreeType version to 2.4.4 on Windows\n  * Updated libmpg123 version to 1.13.2 on Windows\n  * Windows binary no longer depends on VC2005 runtime.\n  * Windows binary no longer depends on SSE2 support.\n\nLOVE 0.7.1 [Game Slave]\n-----------------------\n\n  Released: 2011-02-14\n\n  * Added source:isPaused()\n  * Added error when initial window can't be created.\n  * Added framebuffer filter modes.\n  * Added love.filesystem.getLastModified.\n  * Added filter modes for ImageFonts.\n  * Added dead key support by using \"unknown\" key with correct unicode value.\n  * Added 0 width and height in love.conf. (for current desktop resolution)\n  * Added alpha support when encoding TGA images.\n\n  * Fixed a lot of bugs regarding zero characters in threads.\n  * Fixed handling of a directory named \"love\" in current directory.\n  * Fixed a few unhandled errors in setScissor.\n  * Fixed a bug where old physics callbacks were never dereferenced.\n  * Fixed loss of mouse visibility settings on setMode.\n  * Fixed creation of a framebuffer unbinding current framebuffer.\n  * Fixed several race conditions in love.thread.\n  * Fixed 'love .', so it won't use lovedir/. as save dir.\n  * Fixed setLineHeight.\n  * Fixed extended ascii and ImageFonts.\n  * Fixed printf's line wrapping.\n  * Fixed crash when playing sounds.\n  * Fixed playback of mp3s with arbitrary sample rates.\n  * Fixed handling of negative indices in love.joystick.\n  * Fixed toggleFullscreen.\n  * Fixed unexpected behaviour with hash tables to love.graphics.line.\n  * Fixed mouse coordinates being capped after setMode.\n  * Fixed setFont's error handling on a non-existant file.\n  * Fixed issue where Windows builds would hard crash on Lua errors\n\n  * Removed custom sample rates for Decoders.\n\nLOVE 0.7.0 [Game Slave]\n-----------------------\n\n  Released: 2010-12-05\n\n  * Added love.thread.\n  * Added love.font.\n  * Added love.graphics.Framebuffer.\n  * Added Source:play, Source:pause, etc.\n  * Added Source:isStatic().\n  * Added get/setPosition, get/setVelocity, and get/setDirection to Source.\n  * Added get/setGroupIndex to CircleShape and PolygonShape.\n  * Added Font:getWrap.\n  * Added identity field to love.conf.\n  * Added love.quit callback.\n  * Added love.focus callback.\n  * Added extra meter parameter to love.physics.newWorld.\n  * Added love.graphics.setIcon.\n  * Added way to make the window desktop resolution.\n  * Added subtractive and multiplicative blend modes.\n  * Added body:getAllowSleeping.\n  * Added shape:getBody.\n  * Added love.filesystem.FileData for public usage.\n  * Added base64 support for love.filesystem.FileData.\n  * Added table support for love.graphics.setColor and love.graphics.setBackgroundColor.\n  * Added love.graphics.hasFocus().\n  * Added ?/init.lua to the loader.\n\n  * Fixed the debug module not being an upvalue of the error handlers. (you can now override debug)\n  * Fixed some cases when love.audio.pause and friends, were acting on everything, not just the passed Source.\n  * Fixed setFixedRotation enabling other flags.\n  * Fixed a bug in the loader (for require).\n  * Fixed ParticleSystem::setSprite not retaining the new image.\n  * Fixed setMode removing images settings (wrapping, filters).\n  * Fixed shape:getBody, it's now exposed for LÖVE usage.\n  * Fixed DistanceJoint:getType() returning \"circle\" - it now returns \"distance\".\n  * Fixed SpriteBatches being unaffected by setColor\n  * Fixed the audio bug.\n  * Fixed invalid FSAA values crashing LÖVE.\n  * Fixed a bunch of compiler warnings.\n  * Fixed OS X not properly using UTIs for .love files.\n  * Fixed the modplug decoder not properly handeling files that fail to load.\n  * Fixed a memory leak in setFont.\n  * Fixed bug where errors in threads wouldn't get picked up by demand.\n  * Fixed part of the bug with newlines when scaling text (rotating still messes up the lines).\n  * Fixed the bug where newImageFont would try to created ImageData out of ImageData.\n  * Fixed error handler not resetting the blend mode.\n\n  * Changed fonts, they're now po2 safe.\n  * Changed the traceback in the error screen.\n  * Changed font origin to top-left.\n  * Changed linux save dir location to obey to Freedesktop.org's XDG specs. (~/.local/share/love by default.)\n\n  * Removed font functions from love.graphics.\n  * Removed love.physics.newWorld(w, h). Use love.physics.newWorld(x1, y1, x2, y2) instead.\n\nLOVE 0.6.2 [Jiggly Juice]\n-------------------------\n\n  Released: 2010-03-06\n\n  * Fixed a bug causing ImageFonts to cut off some pixels.\n  * Fixed a bug where filled rectangles were too small.\n  * Fixed a bug in Image:setFilter where it would switch the parameters.\n  * Fixed a bug in ImageRasterizer where it wasn't using the data.\n  * Image filter and wrap modes now use string constants as well.\n  * Fixed double-transform bug in SpriteBatch.\n  * Errors are reported on stdout again.\n  * Another fix for the icons on ubuntu.\n\nLOVE 0.6.1 [Jiggly Juice]\n-------------------------\n\n  Released: 2010-02-07\n\n  * Added Shape:setGroupIndex and getGroupIndex.\n  * Added Body:setFixedRotation and Body:getFixedRotation.\n  * Added Body:setInertia.\n  * Added CircleShape:getLocalCenter and CircleShape:getWorldCenter.\n  * Added icons and file associations for the debs.\n  * Added the demos folder to the Mac OS X DMG.\n  * It's now possible to run a .love from Resources in Mac OS X, thanks to Steve Johnson.\n  * Fixed a bug with multiple Sources on the same Music.\n  * Fixed a bug so the mouse doesn't get crippled when the keyboard is disabled.\n  * Fixed a bug where love.graphics.rectangle drew a too large rectangle.\n  * Fixed a bug where memory wouldn't be released correctly.\n  * Fixed epic physics typo (getRestituion->getRestitution).\n  * Fixed crash on opening non-existent image.\n  * The error screen redraws when an event occurs.\n  * The default love.run() now gracefully handles disabled modules.\n  * The debian packages should now successfully include icons, file associations, etc, and should give the correct architecture.\n  * Added support for drawing polylines to love.graphics.line - the syntax is the same as love.graphics.polygon.\n  * Removed Music and Sound. There are now only sources.\n  * Improved the stability of love.audio/love.sound.\n\nLOVE 0.6.0 [Jiggly Juice]\n-------------------------\n\n  Released: 2009-12-24\n\n  * Lost track of 0.6.0 changes a long while ago. Don't trust the list below.\n\n  * Added love.graphics.print()/printf().\n  * Added unicode-translated parameter to love.keypressed().\n  * Added love.event.\n  * Added love.filesystem.setIdentity().\n  * Added OpenAL dependency.\n\n  * Fixed love.fileystem problems with internal \\0 in strings.\n  * Fixed love.filesystem.mkdir/remove not working when write directory not set.\n  * Fixed position of Window.\n\n  * Changed parameter order of draws().\n  * Changed origin for images to top-left.\n  * Changed love.filesystem.open to accept mode (removed from love.filesystem.newFile).\n  * Changed love.filesystem.read() which now returns two parameters (data, length).\n  * Changed love.filesystem.write() which now takes up to four parameters (file, data, length, mode).\n  * Changed default color mode to \"modulate\".\n  * Changed name of love.color_normal to \"replace\".\n  * Changed name of love.blend_normal to \"alpha\".\n  * Changed the conf file format.\n\n  * Removed Color object.\n  * Removed Animation.\n  * Removed several constants.\n  * Removed love.graphics.draw() for strings.\n  * Removed love.system.\n  * Removed SWIG.\n  * Removed boost.\n  * Removed SDL_mixer.\n\n\nLOVE 0.5.0 [Salted Nuts]\n------------------------\n\n  Released: 2009-01-02\n\n  * Added love.joystick.\n  * Added network support via LuaSocket.\n  * Added support for loading of appended .love-file.\n\n  * Added love.filesystem.lines().\n  * Added a loader function to enable use of normal require().\n  * Added love.filesystem.load().\n  * Added love.filesystem.getSaveDirectory()\n  * Added love.filesystem.getWorkingDirectory()\n\n  * Added optional explicit destruction of Box2D objects.\n  * Added shape:testSegment().\n  * Added love.graphics.screenshot() (.bmp only).\n  * Added default size (12) to font-related functions.\n  * Added love.graphics.setFont( filename, size )\n  * Added love.graphics.setLineStippe and related functions.\n  * Added love.graphics.setPointSize and related functions.\n\n  * Changed love.filesystem.read() to accept file name.\n  * Changed love.filesystem.write() to accept file name.\n  * Changed love.graphics.triangle() to accept CCW and CW ordering.\n\n  * Fixed love.graphics.read adding bogus characters at the end of string.\n  * Fixed epic swigfusion bug.\n  * Fixed love.graphics.getFont so it returns nil if no font is present.\n  * Fixed bug where love.graphics.getBlendMode() always returns blend_normal.\n  * Fixed bug which caused error screen to be scissored (when enabled).\n  * Fixed Body:setAngle to accept degrees like everything else.\n\n  * Cleaned up love::File and love_physfs.\n  * Cleaned up love::Reference so it stores its reference in _G.\n\nLOVE 0.4.0 [Taco Beam]\n----------------------\n\n  Released: 2008-08-29\n\n  * Added love.physics. (YES!)\n  * Added love.audio.setMode().\n  * Added love.audio.setChannels().\n  * Added love.graphics.polygon().\n  * Added love.graphics.setScissor() and love.graphics.getScissor() to handle scissoring the graphical area.\n  * Fixed missing constants related to image optimization.\n  * Fixed memory leak related to love::File (thanks amnesiasoft!).\n\n\nLOVE 0.3.2 [Lemony Fresh]\n-------------------------\n\n  Released: 2008-07-04\n\n  * Added love.graphics.rectangle()\n  * Added love.graphics.setLineWidth()\n  * Added love.graphics.setLineStyle()\n  * Added love.graphics.getLineWidth()\n  * Added love.graphics.getLineStyle()\n  * Added love.mouse.getPosition()\n  * Added love.audio_loop\n  * Added love.timer.getTime()\n  * Changed love.graphics.quad() to accept CCW and CW ordering.\n  * Fixed default color mode bug.\n  * Fixed line width being applied unnecessarily.\n  * Fixed line width bug related to fullscreen toggle.\n  * Fixed music not looping.\n\nLOVE 0.3.1 [Space Meat]\n-----------------------\n\n  Released: 2008-06-21\n\n  * Fixed segfault related to graphics.\n  * Fixed wait-forever bug related to audio.\n  * Fixed error reporting not working across modules.\n  * Fixed bug where games with a trailing \"/\" would not start.\n  * Fixed bug which caused love.timer.sleep to delay for (way) too long.\n\nLOVE 0.3.0 [Mutant Vermin]\n--------------------------\n\n  Released: 2008-06-17\n\n  * Added ParticleSystem.\n  * Added visual error reporting.\n  * Added love.system for game control needs.\n  * Added input grabbing.\n  * Added functions in love.graphics for display management.\n  * Added love.graphics.point().\n  * Added functions in love.graphics for getting current color, font, etc.\n  * Added love.filesystem.enumerate() for getting folder contents.\n  * Added functions for setting the window caption.\n  * Added version checking. An error occurs if the game is incompatible.\n  * Fixed print() :)\n  * Removed all keyboard shortcuts.\n  * Save folders are now created only if required.\n  * On Windows, the new save location is %APPDATA%\\LOVE\\game\n\nLOVE 0.2.1 [Impending Doom]\n---------------------------\n\n  Released: 2008-03-29\n\n  * Added many functions in love.filesystem.\n  * Added a dedicated save-folder for each game.\n  * Added timer.sleep.\n  * Added line heights to font objects.\n  * Added love.graphics.getWidth/getHeight.\n  * Added scaling and rotation for text.\n  * Added variable spacing to ImageFont.\n  * Added support for variable line quality when drawing primitives.\n  * Added several functions for drawing sections of images. (love.graphics.draws)\n  * Added image optimization function and padding function.\n  * Added love.graphics.getWidth/Height.\n\n  * Split devices up into actual SWIG-modules. This means that:\n    - Functions are used like this: love.graphics.draw, not love.graphics:draw\n    - love.objects is no more. Objects are created by an appropriate device.\n  * How you draw primitives has been altered.\n  * draw(string, x, y, wrap, align) has become drawf(string, x, y, wrap, align)\n\n  * Changed getFps to getFPS.\n  * Escape is no more ... enter: Alt+F4.\n  * love.filesystem.include has been renamed to love.filesystem.require.\n  * ImageFonts now consider the spacing as well as the glyph size.\n  * Fixed a massive ImageFont bug which resulted in float-positioning failure.\n  * Fixed a bug when loading fonts where the specified size doesn't represent the true size of the font.\n\n  * Updated DevIL to version 1.6.8-rc2 (Windows)\n  * Updated FreeType to freetype-2.3.5-1 (Windows)\n  * Updated Lua to 5.1.3 (Windows)\n  * Updated SDL to 1.2.13 (Windows)\n  * Removed boost::filesystem.\n\nLOVE 0.2.0 [Mini-Moose]\n-----------------------\n\n  Released: 2008-02-06\n\n  * Added ImageFont\n  * Added Animation\n  * Added text formatting functions\n  * Added setCenter for Image and Animation.\n  * Added methods for rendering of scaled/rotated sprites.\n  * Added the drawing of basic shapes.\n  * Added default font and embedded resources.\n  * Added Ctrl+R for reload.\n  * Added blending and color modes.\n  * Fixed memory usage of Graphics.\n  * Fixed a bug where the set text color would change the color of any images rendered.\n  * Fixed CWD bug.\n  * Fixed titlebar. Game title is now displayed.\n\n\nLOVE 0.1.1 [Santa-Power]\n------------------------\n\n\tInitial release!\n  Released: 2008-01-13\n\n * Image loading and rendering.\n * Sound loading and playing.\n * Font loading and rendering.\n * Lua-scriptable games.\n * Config files.\n * Stuff is loadable from archive files.\n * Keyboard, mouse, display, timer, etc. (Basic devices).\n"
  },
  {
    "path": "extra/cmake/FindHarfbuzz.cmake",
    "content": "# Sets the following variables:\n#\n#  HARFBUZZ_FOUND\n#  HARFBUZZ_INCLUDE_DIR\n#  HARFBUZZ_LIBRARY\n\nset(HARFBUZZ_SEARCH_PATHS\n\t/usr/local\n\t/usr\n\t)\n\nfind_path(HARFBUZZ_INCLUDE_DIR\n\tNAMES hb.h\n\tPATH_SUFFIXES include include/harfbuzz\n\tPATHS ${HARFBUZZ_SEARCH_PATHS})\n\nfind_library(HARFBUZZ_LIBRARY\n\tNAMES harfbuzz\n\tPATH_SUFFIXES lib\n\tPATHS ${HARFBUZZ_SEARCH_PATHS})\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(Harfbuzz DEFAULT_MSG HARFBUZZ_LIBRARY HARFBUZZ_INCLUDE_DIR)\n\nmark_as_advanced(HARFBUZZ_INCLUDE_DIR HARFBUZZ_LIBRARY)\n"
  },
  {
    "path": "extra/cmake/FindLuaJIT.cmake",
    "content": "# Sets the following variables:\n#\n# LUAJIT_FOUND\n# LUAJIT_INCLUDE_DIR\n# LUAJIT_LIBRARY\n\nset(LUAJIT_SEARCH_PATHS\n\t/usr/local\n\t/usr\n\t)\n\nfind_path(LUAJIT_INCLUDE_DIR\n\tNAMES luajit.h\n\tPATH_SUFFIXES include include/luajit-2.0 include/luajit-2.1\n\tPATHS ${LUAJIT_SEARCH_PATHS})\n\nfind_library(LUAJIT_LIBRARY\n\tNAMES luajit-5.1\n\tPATH_SUFFIXES lib\n\tPATHS ${LUAJIT_SEARCH_PATHS})\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(LuaJIT DEFAULT_MSG LUAJIT_LIBRARY LUAJIT_INCLUDE_DIR)\n\nmark_as_advanced(LUAJIT_INCLUDE_DIR LUAJIT_LIBRARY)\n"
  },
  {
    "path": "extra/cmake/FindModPlug.cmake",
    "content": "# Sets the following variables:\n#\n# MODPLUG_FOUND\n# MODPLUG_INCLUDE_DIR\n# MODPLUG_LIBRARY\n\nset(MODPLUG_SEARCH_PATHS\n\t/usr/local\n\t/usr\n\t)\n\nfind_path(MODPLUG_INCLUDE_DIR\n\tNAMES libmodplug/modplug.h\n\tPATH_SUFFIXES include\n\tPATHS ${MODPLUG_SEARCH_PATHS})\n\nfind_library(MODPLUG_LIBRARY\n\tNAMES modplug\n\tPATH_SUFFIXES lib\n\tPATHS ${MODPLUG_SEARCH_PATHS})\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(ModPlug DEFAULT_MSG MODPLUG_LIBRARY MODPLUG_INCLUDE_DIR)\n\nmark_as_advanced(MODPLUG_INCLUDE_DIR MODPLUG_LIBRARY)\n"
  },
  {
    "path": "extra/cmake/FindOgg.cmake",
    "content": "# Sets the following variables:\n#\n# OGG_FOUND\n# OGG_INCLUDE_DIR\n# OGG_LIBRARY\n\nset(OGG_SEARCH_PATHS\n\t/usr/local\n\t/usr\n\t)\n\nfind_path(OGG_INCLUDE_DIR\n\tNAMES ogg/ogg.h\n\tPATH_SUFFIXES include\n\tPATHS ${OGG_SEARCH_PATHS})\n\nfind_library(OGG_LIBRARY\n\tNAMES ogg\n\tPATH_SUFFIXES lib\n\tPATHS ${OGG_SEARCH_PATHS})\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(Ogg DEFAULT_MSG OGG_LIBRARY OGG_INCLUDE_DIR)\n\nmark_as_advanced(OGG_INCLUDE_DIR OGG_LIBRARY)\n"
  },
  {
    "path": "extra/cmake/FindSDL2.cmake",
    "content": "# Sets the following variables:\n#\n#  SDL2_FOUND\n#  SDL2_INCLUDE_DIR\n#  SDL2_LIBRARY\n\nset(SDL2_SEARCH_PATHS\n\t/usr/local\n\t/usr\n\t)\n\nfind_path(SDL2_INCLUDE_DIR\n\tNAMES SDL.h\n\tPATH_SUFFIXES include include/SDL2\n\tPATHS ${SDL2_SEARCH_PATHS})\n\nfind_library(SDL2_LIBRARY\n\tNAMES SDL2\n\tPATH_SUFFIXES lib\n\tPATHS ${SDL2_SEARCH_PATHS})\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(SDL2 DEFAULT_MSG SDL2_LIBRARY SDL2_INCLUDE_DIR)\n\nmark_as_advanced(SDL2_INCLUDE_DIR SDL2_LIBRARY)\n"
  },
  {
    "path": "extra/cmake/FindTheora.cmake",
    "content": "# Sets the following variables:\n#\n# THEORA_FOUND\n# THEORA_INCLUDE_DIR\n# THEORA_LIBRARY\n# THEORADEC_LIBRARY\n\nset(THEORA_SEARCH_PATHS\n\t/usr/local\n\t/usr\n\t)\n\nfind_path(THEORA_INCLUDE_DIR\n\tNAMES theora/codec.h\n\tPATH_SUFFIXES include\n\tPATHS ${THEORA_SEARCH_PATHS})\n\nfind_library(THEORA_LIBRARY\n\tNAMES theora\n\tPATH_SUFFIXES lib\n\tPATHS ${THEORA_SEARCH_PATHS})\n\nfind_library(THEORADEC_LIBRARY\n\tNAMES theoradec\n\tPATH_SUFFIXES lib\n\tPATHS ${THEORA_SEARCH_PATHS})\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(Theora DEFAULT_MSG THEORA_LIBRARY THEORA_INCLUDE_DIR)\n\nmark_as_advanced(THEORA_INCLUDE_DIR THEORA_LIBRARY)\n"
  },
  {
    "path": "extra/cmake/FindVorbis.cmake",
    "content": "# Sets the following variables:\n#\n# VORBIS_FOUND\n# VORBIS_INCLUDE_DIR\n# VORBIS_LIBRARY\n# VORBISFILE_LIBRARY\n\nset(VORBIS_SEARCH_PATHS\n\t/usr/local\n\t/usr\n\t)\n\nfind_path(VORBIS_INCLUDE_DIR vorbis/vorbisfile.h\n\tPATH_SUFFIXES include\n\tPATHS ${VORBIS_SEARCH_PATHS})\n\nfind_library(VORBIS_LIBRARY\n\tNAMES vorbis\n\tPATH_SUFFIXES lib\n\tPATHS ${VORBIS_SEARCH_PATHS})\n\nfind_library(VORBISFILE_LIBRARY\n\tNAMES vorbisfile\n\tPATH_SUFFIXES lib\n\tPATHS ${VORBIS_SEARCH_PATHS})\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(Vorbis DEFAULT_MSG VORBIS_LIBRARY VORBISFILE_LIBRARY VORBIS_INCLUDE_DIR)\n\nmark_as_advanced(VORBIS_INCLUDE_DIR VORBIS_LIBRARY VORBISFILE_LIBRARY)\n"
  },
  {
    "path": "extra/cmake/LoveMacros.cmake",
    "content": "\n# Group all related stuff in folders in Visual Studio\n\nfunction(love_group_projects)\n\tset(options NESTED)\n\tset(oneValueArgs NAME)\n\tset(multiValueArgs TARGETS)\n\tcmake_parse_arguments(LOVE_GROUP \"${options}\" \"${oneValueArgs}\" \"${multiValueArgs}\" ${ARGN})\n\n\tforeach(TARGET_NAME ${LOVE_GROUP_TARGETS})\n\t\tif (TARGET ${TARGET_NAME})\n\t\t\tget_target_property(TARGET_TYPE ${TARGET_NAME} TYPE)\n\t\t\t# If this is an interface target, walk the children\n\t\t\tif (${TARGET_TYPE} STREQUAL \"INTERFACE_LIBRARY\")\n\t\t\t\tget_target_property(TARGET_LIBS ${TARGET_NAME} INTERFACE_LINK_LIBRARIES)\n\t\t\t\tforeach(TARGET_LIB ${TARGET_LIBS})\n\t\t\t\t\t# Is this a target? (Could also be a .lib file)\n\t\t\t\t\tif (TARGET ${TARGET_LIB})\n\t\t\t\t\t\t# Resolve aliased target\n\t\t\t\t\t\tget_target_property(ORIGINAL_TARGET ${TARGET_LIB} ALIASED_TARGET)\n\t\t\t\t\t\tif (ORIGINAL_TARGET)\n\t\t\t\t\t\t\tset(TARGET_LIB ${ORIGINAL_TARGET})\n\t\t\t\t\t\tendif()\n\n\t\t\t\t\t\t# Do we want to nest per-project?\n\t\t\t\t\t\tif (LOVE_GROUP_NESTED)\n\t\t\t\t\t\t\tset_target_properties(${TARGET_LIB} PROPERTIES FOLDER \"${LOVE_GROUP_NAME}/${TARGET_NAME}\")\n\t\t\t\t\t\telse()\n\t\t\t\t\t\t\tset_target_properties(${TARGET_LIB} PROPERTIES FOLDER \"${LOVE_GROUP_NAME}\")\n\t\t\t\t\t\tendif()\n\t\t\t\t\tendif()\n\t\t\t\tendforeach()\n\t\t\telse()\n\t\t\t\t# This is no interface library, so group it under the root 'NAME' node\n\t\t\t\tset_target_properties(${TARGET_NAME} PROPERTIES FOLDER \"${LOVE_GROUP_NAME}\")\n\t\t\tendif()\n\t\tendif()\n\tendforeach()\nendfunction()\n"
  },
  {
    "path": "extra/cmake/NSIS.template.in",
    "content": "﻿; CMake - Cross Platform Makefile Generator\n; Copyright 2000-2024 Kitware, Inc. and Contributors\n; All rights reserved.\n; \n; Redistribution and use in source and binary forms, with or without\n; modification, are permitted provided that the following conditions\n; are met:\n; \n; * Redistributions of source code must retain the above copyright\n;   notice, this list of conditions and the following disclaimer.\n; \n; * Redistributions in binary form must reproduce the above copyright\n;   notice, this list of conditions and the following disclaimer in the\n;   documentation and/or other materials provided with the distribution.\n; \n; * Neither the name of Kitware, Inc. nor the names of Contributors\n;   may be used to endorse or promote products derived from this\n;   software without specific prior written permission.\n; \n; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n; \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n; HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n; \n; ------------------------------------------------------------------------------\n; \n; The following individuals and institutions are among the Contributors:\n; \n; * Aaron C. Meadows <cmake@shadowguarddev.com>\n; * Adriaan de Groot <groot@kde.org>\n; * Aleksey Avdeev <solo@altlinux.ru>\n; * Alexander Neundorf <neundorf@kde.org>\n; * Alexander Smorkalov <alexander.smorkalov@itseez.com>\n; * Alexey Sokolov <sokolov@google.com>\n; * Alex Merry <alex.merry@kde.org>\n; * Alex Turbov <i.zaufi@gmail.com>\n; * Andreas Pakulat <apaku@gmx.de>\n; * Andreas Schneider <asn@cryptomilk.org>\n; * André Rigland Brodtkorb <Andre.Brodtkorb@ifi.uio.no>\n; * Axel Huebl, Helmholtz-Zentrum Dresden - Rossendorf\n; * Benjamin Eikel\n; * Bjoern Ricks <bjoern.ricks@gmail.com>\n; * Brad Hards <bradh@kde.org>\n; * Christopher Harvey\n; * Christoph Grüninger <foss@grueninger.de>\n; * Clement Creusot <creusot@cs.york.ac.uk>\n; * Daniel Blezek <blezek@gmail.com>\n; * Daniel Pfeifer <daniel@pfeifer-mail.de>\n; * Dawid Wróbel <me@dawidwrobel.com>\n; * Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>\n; * Eran Ifrah <eran.ifrah@gmail.com>\n; * Esben Mose Hansen, Ange Optimization ApS\n; * Geoffrey Viola <geoffrey.viola@asirobots.com>\n; * Google Inc\n; * Gregor Jasny\n; * Helio Chissini de Castro <helio@kde.org>\n; * Ilya Lavrenov <ilya.lavrenov@itseez.com>\n; * Insight Software Consortium <insightsoftwareconsortium.org>\n; * Intel Corporation <www.intel.com>\n; * Jan Woetzel\n; * Jordan Williams <jordan@jwillikers.com>\n; * Julien Schueller\n; * Kelly Thompson <kgt@lanl.gov>\n; * Konstantin Podsvirov <konstantin@podsvirov.pro>\n; * Laurent Montel <montel@kde.org>\n; * Mario Bensi <mbensi@ipsquad.net>\n; * Martin Gräßlin <mgraesslin@kde.org>\n; * Mathieu Malaterre <mathieu.malaterre@gmail.com>\n; * Matthaeus G. Chajdas\n; * Matthias Kretz <kretz@kde.org>\n; * Matthias Maennich <matthias@maennich.net>\n; * Michael Hirsch, Ph.D. <www.scivision.co>\n; * Michael Stürmer\n; * Miguel A. Figueroa-Villanueva\n; * Mike Durso <rbprogrammer@gmail.com>\n; * Mike Jackson\n; * Mike McQuaid <mike@mikemcquaid.com>\n; * Nicolas Bock <nicolasbock@gmail.com>\n; * Nicolas Despres <nicolas.despres@gmail.com>\n; * Nikita Krupen'ko <krnekit@gmail.com>\n; * NVIDIA Corporation <www.nvidia.com>\n; * OpenGamma Ltd. <opengamma.com>\n; * Patrick Stotko <stotko@cs.uni-bonn.de>\n; * Per Øyvind Karlsen <peroyvind@mandriva.org>\n; * Peter Collingbourne <peter@pcc.me.uk>\n; * Petr Gotthard <gotthard@honeywell.com>\n; * Philip Lowman <philip@yhbt.com>\n; * Philippe Proulx <pproulx@efficios.com>\n; * Raffi Enficiaud, Max Planck Society\n; * Raumfeld <raumfeld.com>\n; * Roger Leigh <rleigh@codelibre.net>\n; * Rolf Eike Beer <eike@sf-mail.de>\n; * Roman Donchenko <roman.donchenko@itseez.com>\n; * Roman Kharitonov <roman.kharitonov@itseez.com>\n; * Ruslan Baratov\n; * Sebastian Holtermann <sebholt@xwmw.org>\n; * Stephen Kelly <steveire@gmail.com>\n; * Sylvain Joubert <joubert.sy@gmail.com>\n; * The Qt Company Ltd.\n; * Thomas Sondergaard <ts@medical-insight.com>\n; * Tobias Hunger <tobias.hunger@qt.io>\n; * Todd Gamblin <tgamblin@llnl.gov>\n; * Tristan Carel\n; * University of Dundee\n; * Vadim Zhukov\n; * Will Dicharry <wdicharry@stellarscience.com>\n; \n; See version control history for details of individual contributions.\n; \n; The above copyright and license notice applies to distributions of\n; CMake in source and binary form.  Third-party software packages supplied\n; with CMake under compatible licenses provide their own copyright notices\n; documented in corresponding subdirectories or source files.\n; \n; ------------------------------------------------------------------------------\n; \n; CMake was initially developed by Kitware with the following sponsorship:\n; \n;  * National Library of Medicine at the National Institutes of Health\n;    as part of the Insight Segmentation and Registration Toolkit (ITK).\n; \n;  * US National Labs (Los Alamos, Livermore, Sandia) ASC Parallel\n;    Visualization Initiative.\n; \n;  * National Alliance for Medical Image Computing (NAMIC) is funded by the\n;    National Institutes of Health through the NIH Roadmap for Medical Research,\n;    Grant U54 EB005149.\n; \n;  * Kitware, Inc.\n\n\n\n; CPack install script designed for a nmake build\n\n;--------------------------------\n; You must define these values\n\n  !define VERSION \"@CPACK_PACKAGE_VERSION@\"\n  !define PATCH  \"@CPACK_PACKAGE_VERSION_PATCH@\"\n  !define INST_DIR \"@CPACK_TEMPORARY_DIRECTORY@\"\n\n;--------------------------------\n;Variables\n\n  Var MUI_TEMP\n  Var STARTMENU_FOLDER\n  Var SV_ALLUSERS\n  Var START_MENU\n  Var DO_NOT_ADD_TO_PATH\n  Var ADD_TO_PATH_ALL_USERS\n  Var ADD_TO_PATH_CURRENT_USER\n  Var INSTALL_DESKTOP\n  Var IS_DEFAULT_INSTALLDIR\n;--------------------------------\n;Include Modern UI\n\n  !include \"MUI.nsh\"\n\n  ;Default installation folder\n  InstallDir \"@CPACK_NSIS_INSTALL_ROOT@\\@CPACK_PACKAGE_INSTALL_DIRECTORY@\"\n\n;--------------------------------\n;General\n\n  ;Name and file\n  Name \"@CPACK_NSIS_PACKAGE_NAME@\"\n  OutFile \"@CPACK_TOPLEVEL_DIRECTORY@/@CPACK_OUTPUT_FILE_NAME@\"\n\n  ;Set compression\n  SetCompressor @CPACK_NSIS_COMPRESSOR@\n\n  ;Require administrator access\n  RequestExecutionLevel admin\n\n@CPACK_NSIS_DEFINES@\n@CPACK_NSIS_MANIFEST_DPI_AWARE_CODE@\n@CPACK_NSIS_BRANDING_TEXT_CODE@\n\n  !include Sections.nsh\n\n;--- Component support macros: ---\n; The code for the add/remove functionality is from:\n;   https://nsis.sourceforge.io/Add/Remove_Functionality\n; It has been modified slightly and extended to provide\n; inter-component dependencies.\nVar AR_SecFlags\nVar AR_RegFlags\n@CPACK_NSIS_SECTION_SELECTED_VARS@\n\n; Loads the \"selected\" flag for the section named SecName into the\n; variable VarName.\n!macro LoadSectionSelectedIntoVar SecName VarName\n SectionGetFlags ${${SecName}} $${VarName}\n IntOp $${VarName} $${VarName} & ${SF_SELECTED}  ;Turn off all other bits\n!macroend\n\n; Loads the value of a variable... can we get around this?\n!macro LoadVar VarName\n  IntOp $R0 0 + $${VarName}\n!macroend\n\n; Sets the value of a variable\n!macro StoreVar VarName IntValue\n  IntOp $${VarName} 0 + ${IntValue}\n!macroend\n\n!macro InitSection SecName\n  ;  This macro reads component installed flag from the registry and\n  ;changes checked state of the section on the components page.\n  ;Input: section index constant name specified in Section command.\n\n  ClearErrors\n  ;Reading component status from registry\n  ReadRegDWORD $AR_RegFlags HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\\Components\\${SecName}\" \"Installed\"\n  IfErrors \"default_${SecName}\"\n    ;Status will stay default if registry value not found\n    ;(component was never installed)\n  IntOp $AR_RegFlags $AR_RegFlags & ${SF_SELECTED} ;Turn off all other bits\n  SectionGetFlags ${${SecName}} $AR_SecFlags  ;Reading default section flags\n  IntOp $AR_SecFlags $AR_SecFlags & 0xFFFE  ;Turn lowest (enabled) bit off\n  IntOp $AR_SecFlags $AR_RegFlags | $AR_SecFlags      ;Change lowest bit\n\n  ; Note whether this component was installed before\n  !insertmacro StoreVar ${SecName}_was_installed $AR_RegFlags\n  IntOp $R0 $AR_RegFlags & $AR_RegFlags\n\n  ;Writing modified flags\n  SectionSetFlags ${${SecName}} $AR_SecFlags\n\n \"default_${SecName}:\"\n !insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected\n!macroend\n\n!macro FinishSection SecName\n  ;  This macro reads section flag set by user and removes the section\n  ;if it is not selected.\n  ;Then it writes component installed flag to registry\n  ;Input: section index constant name specified in Section command.\n\n  SectionGetFlags ${${SecName}} $AR_SecFlags  ;Reading section flags\n  ;Checking lowest bit:\n  IntOp $AR_SecFlags $AR_SecFlags & ${SF_SELECTED}\n  IntCmp $AR_SecFlags 1 \"leave_${SecName}\"\n    ;Section is not selected:\n    ;Calling Section uninstall macro and writing zero installed flag\n    !insertmacro \"Remove_${${SecName}}\"\n    WriteRegDWORD HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\\Components\\${SecName}\" \\\n  \"Installed\" 0\n    Goto \"exit_${SecName}\"\n\n \"leave_${SecName}:\"\n    ;Section is selected:\n    WriteRegDWORD HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\\Components\\${SecName}\" \\\n  \"Installed\" 1\n\n \"exit_${SecName}:\"\n!macroend\n\n!macro RemoveSection_CPack SecName\n  ;  This macro is used to call section's Remove_... macro\n  ;from the uninstaller.\n  ;Input: section index constant name specified in Section command.\n\n  !insertmacro \"Remove_${${SecName}}\"\n!macroend\n\n; Determine whether the selection of SecName changed\n!macro MaybeSelectionChanged SecName\n  !insertmacro LoadVar ${SecName}_selected\n  SectionGetFlags ${${SecName}} $R1\n  IntOp $R1 $R1 & ${SF_SELECTED} ;Turn off all other bits\n\n  ; See if the status has changed:\n  IntCmp $R0 $R1 \"${SecName}_unchanged\"\n  !insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected\n\n  IntCmp $R1 ${SF_SELECTED} \"${SecName}_was_selected\"\n  !insertmacro \"Deselect_required_by_${SecName}\"\n  goto \"${SecName}_unchanged\"\n\n  \"${SecName}_was_selected:\"\n  !insertmacro \"Select_${SecName}_depends\"\n\n  \"${SecName}_unchanged:\"\n!macroend\n;--- End of Add/Remove macros ---\n\n;--------------------------------\n;Interface Settings\n\n  !define MUI_HEADERIMAGE\n  !define MUI_ABORTWARNING\n\n;----------------------------------------\n; based upon a script of \"Written by KiCHiK 2003-01-18 05:57:02\"\n;----------------------------------------\n!verbose 3\n!include \"WinMessages.NSH\"\n!verbose 4\n;====================================================\n; get_NT_environment\n;     Returns: the selected environment\n;     Output : head of the stack\n;====================================================\n!macro select_NT_profile UN\nFunction ${UN}select_NT_profile\n   StrCmp $ADD_TO_PATH_ALL_USERS \"1\" 0 environment_single\n      DetailPrint \"Selected environment for all users\"\n      Push \"all\"\n      Return\n   environment_single:\n      DetailPrint \"Selected environment for current user only.\"\n      Push \"current\"\n      Return\nFunctionEnd\n!macroend\n!insertmacro select_NT_profile \"\"\n!insertmacro select_NT_profile \"un.\"\n;----------------------------------------------------\n!define NT_current_env 'HKCU \"Environment\"'\n!define NT_all_env     'HKLM \"SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment\"'\n\n!ifndef WriteEnvStr_RegKey\n  !ifdef ALL_USERS\n    !define WriteEnvStr_RegKey \\\n       'HKLM \"SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment\"'\n  !else\n    !define WriteEnvStr_RegKey 'HKCU \"Environment\"'\n  !endif\n!endif\n\n; AddToPath - Adds the given dir to the search path.\n;        Input - head of the stack\n;        Note - Win9x systems requires reboot\n\nFunction AddToPath\n  Exch $0\n  Push $1\n  Push $2\n  Push $3\n\n  # don't add if the path doesn't exist\n  IfFileExists \"$0\\*.*\" \"\" AddToPath_done\n\n  ReadEnvStr $1 PATH\n  ; if the path is too long for a NSIS variable NSIS will return a 0\n  ; length string.  If we find that, then warn and skip any path\n  ; modification as it will trash the existing path.\n  StrLen $2 $1\n  IntCmp $2 0 CheckPathLength_ShowPathWarning CheckPathLength_Done CheckPathLength_Done\n    CheckPathLength_ShowPathWarning:\n    Messagebox MB_OK|MB_ICONEXCLAMATION \"Warning! PATH too long installer unable to modify PATH!\"\n    Goto AddToPath_done\n  CheckPathLength_Done:\n  Push \"$1;\"\n  Push \"$0;\"\n  Call StrStr\n  Pop $2\n  StrCmp $2 \"\" \"\" AddToPath_done\n  Push \"$1;\"\n  Push \"$0\\;\"\n  Call StrStr\n  Pop $2\n  StrCmp $2 \"\" \"\" AddToPath_done\n  GetFullPathName /SHORT $3 $0\n  Push \"$1;\"\n  Push \"$3;\"\n  Call StrStr\n  Pop $2\n  StrCmp $2 \"\" \"\" AddToPath_done\n  Push \"$1;\"\n  Push \"$3\\;\"\n  Call StrStr\n  Pop $2\n  StrCmp $2 \"\" \"\" AddToPath_done\n\n  Call IsNT\n  Pop $1\n  StrCmp $1 1 AddToPath_NT\n    ; Not on NT\n    StrCpy $1 $WINDIR 2\n    FileOpen $1 \"$1\\autoexec.bat\" a\n    FileSeek $1 -1 END\n    FileReadByte $1 $2\n    IntCmp $2 26 0 +2 +2 # DOS EOF\n      FileSeek $1 -1 END # write over EOF\n    FileWrite $1 \"$\\r$\\nSET PATH=%PATH%;$3$\\r$\\n\"\n    FileClose $1\n    SetRebootFlag true\n    Goto AddToPath_done\n\n  AddToPath_NT:\n    StrCmp $ADD_TO_PATH_ALL_USERS \"1\" ReadAllKey\n      ReadRegStr $1 ${NT_current_env} \"PATH\"\n      Goto DoTrim\n    ReadAllKey:\n      ReadRegStr $1 ${NT_all_env} \"PATH\"\n    DoTrim:\n    StrCmp $1 \"\" AddToPath_NTdoIt\n      Push $1\n      Call Trim\n      Pop $1\n      StrCpy $0 \"$1;$0\"\n    AddToPath_NTdoIt:\n      StrCmp $ADD_TO_PATH_ALL_USERS \"1\" WriteAllKey\n        WriteRegExpandStr ${NT_current_env} \"PATH\" $0\n        Goto DoSend\n      WriteAllKey:\n        WriteRegExpandStr ${NT_all_env} \"PATH\" $0\n      DoSend:\n      SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 \"STR:Environment\" /TIMEOUT=5000\n\n  AddToPath_done:\n    Pop $3\n    Pop $2\n    Pop $1\n    Pop $0\nFunctionEnd\n\n\n; RemoveFromPath - Remove a given dir from the path\n;     Input: head of the stack\n\nFunction un.RemoveFromPath\n  Exch $0\n  Push $1\n  Push $2\n  Push $3\n  Push $4\n  Push $5\n  Push $6\n\n  IntFmt $6 \"%c\" 26 # DOS EOF\n\n  Call un.IsNT\n  Pop $1\n  StrCmp $1 1 unRemoveFromPath_NT\n    ; Not on NT\n    StrCpy $1 $WINDIR 2\n    FileOpen $1 \"$1\\autoexec.bat\" r\n    GetTempFileName $4\n    FileOpen $2 $4 w\n    GetFullPathName /SHORT $0 $0\n    StrCpy $0 \"SET PATH=%PATH%;$0\"\n    Goto unRemoveFromPath_dosLoop\n\n    unRemoveFromPath_dosLoop:\n      FileRead $1 $3\n      StrCpy $5 $3 1 -1 # read last char\n      StrCmp $5 $6 0 +2 # if DOS EOF\n        StrCpy $3 $3 -1 # remove DOS EOF so we can compare\n      StrCmp $3 \"$0$\\r$\\n\" unRemoveFromPath_dosLoopRemoveLine\n      StrCmp $3 \"$0$\\n\" unRemoveFromPath_dosLoopRemoveLine\n      StrCmp $3 \"$0\" unRemoveFromPath_dosLoopRemoveLine\n      StrCmp $3 \"\" unRemoveFromPath_dosLoopEnd\n      FileWrite $2 $3\n      Goto unRemoveFromPath_dosLoop\n      unRemoveFromPath_dosLoopRemoveLine:\n        SetRebootFlag true\n        Goto unRemoveFromPath_dosLoop\n\n    unRemoveFromPath_dosLoopEnd:\n      FileClose $2\n      FileClose $1\n      StrCpy $1 $WINDIR 2\n      Delete \"$1\\autoexec.bat\"\n      CopyFiles /SILENT $4 \"$1\\autoexec.bat\"\n      Delete $4\n      Goto unRemoveFromPath_done\n\n  unRemoveFromPath_NT:\n    StrCmp $ADD_TO_PATH_ALL_USERS \"1\" unReadAllKey\n      ReadRegStr $1 ${NT_current_env} \"PATH\"\n      Goto unDoTrim\n    unReadAllKey:\n      ReadRegStr $1 ${NT_all_env} \"PATH\"\n    unDoTrim:\n    StrCpy $5 $1 1 -1 # copy last char\n    StrCmp $5 \";\" +2 # if last char != ;\n      StrCpy $1 \"$1;\" # append ;\n    Push $1\n    Push \"$0;\"\n    Call un.StrStr ; Find `$0;` in $1\n    Pop $2 ; pos of our dir\n    StrCmp $2 \"\" unRemoveFromPath_done\n      ; else, it is in path\n      # $0 - path to add\n      # $1 - path var\n      StrLen $3 \"$0;\"\n      StrLen $4 $2\n      StrCpy $5 $1 -$4 # $5 is now the part before the path to remove\n      StrCpy $6 $2 \"\" $3 # $6 is now the part after the path to remove\n      StrCpy $3 $5$6\n\n      StrCpy $5 $3 1 -1 # copy last char\n      StrCmp $5 \";\" 0 +2 # if last char == ;\n        StrCpy $3 $3 -1 # remove last char\n\n      StrCmp $ADD_TO_PATH_ALL_USERS \"1\" unWriteAllKey\n        WriteRegExpandStr ${NT_current_env} \"PATH\" $3\n        Goto unDoSend\n      unWriteAllKey:\n        WriteRegExpandStr ${NT_all_env} \"PATH\" $3\n      unDoSend:\n      SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 \"STR:Environment\" /TIMEOUT=5000\n\n  unRemoveFromPath_done:\n    Pop $6\n    Pop $5\n    Pop $4\n    Pop $3\n    Pop $2\n    Pop $1\n    Pop $0\nFunctionEnd\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Uninstall stuff\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n###########################################\n#            Utility Functions            #\n###########################################\n\n;====================================================\n; IsNT - Returns 1 if the current system is NT, 0\n;        otherwise.\n;     Output: head of the stack\n;====================================================\n; IsNT\n; no input\n; output, top of the stack = 1 if NT or 0 if not\n;\n; Usage:\n;   Call IsNT\n;   Pop $R0\n;  ($R0 at this point is 1 or 0)\n\n!macro IsNT un\nFunction ${un}IsNT\n  Push $0\n  ReadRegStr $0 HKLM \"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\" CurrentVersion\n  StrCmp $0 \"\" 0 IsNT_yes\n  ; we are not NT.\n  Pop $0\n  Push 0\n  Return\n\n  IsNT_yes:\n    ; NT!!!\n    Pop $0\n    Push 1\nFunctionEnd\n!macroend\n!insertmacro IsNT \"\"\n!insertmacro IsNT \"un.\"\n\n; StrStr\n; input, top of stack = string to search for\n;        top of stack-1 = string to search in\n; output, top of stack (replaces with the portion of the string remaining)\n; modifies no other variables.\n;\n; Usage:\n;   Push \"this is a long ass string\"\n;   Push \"ass\"\n;   Call StrStr\n;   Pop $R0\n;  ($R0 at this point is \"ass string\")\n\n!macro StrStr un\nFunction ${un}StrStr\nExch $R1 ; st=haystack,old$R1, $R1=needle\n  Exch    ; st=old$R1,haystack\n  Exch $R2 ; st=old$R1,old$R2, $R2=haystack\n  Push $R3\n  Push $R4\n  Push $R5\n  StrLen $R3 $R1\n  StrCpy $R4 0\n  ; $R1=needle\n  ; $R2=haystack\n  ; $R3=len(needle)\n  ; $R4=cnt\n  ; $R5=tmp\n  loop:\n    StrCpy $R5 $R2 $R3 $R4\n    StrCmp $R5 $R1 done\n    StrCmp $R5 \"\" done\n    IntOp $R4 $R4 + 1\n    Goto loop\ndone:\n  StrCpy $R1 $R2 \"\" $R4\n  Pop $R5\n  Pop $R4\n  Pop $R3\n  Pop $R2\n  Exch $R1\nFunctionEnd\n!macroend\n!insertmacro StrStr \"\"\n!insertmacro StrStr \"un.\"\n\nFunction Trim ; Added by Pelaca\n\tExch $R1\n\tPush $R2\nLoop:\n\tStrCpy $R2 \"$R1\" 1 -1\n\tStrCmp \"$R2\" \" \" RTrim\n\tStrCmp \"$R2\" \"$\\n\" RTrim\n\tStrCmp \"$R2\" \"$\\r\" RTrim\n\tStrCmp \"$R2\" \";\" RTrim\n\tGoTo Done\nRTrim:\n\tStrCpy $R1 \"$R1\" -1\n\tGoto Loop\nDone:\n\tPop $R2\n\tExch $R1\nFunctionEnd\n\nFunction ConditionalAddToRegistry\n  Pop $0\n  Pop $1\n  StrCmp \"$0\" \"\" ConditionalAddToRegistry_EmptyString\n    WriteRegStr SHCTX \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\" \\\n    \"$1\" \"$0\"\n    ;MessageBox MB_OK \"Set Registry: '$1' to '$0'\"\n    DetailPrint \"Set install registry entry: '$1' to '$0'\"\n  ConditionalAddToRegistry_EmptyString:\nFunctionEnd\n\n;--------------------------------\n\n!ifdef CPACK_USES_DOWNLOAD\nFunction DownloadFile\n    IfFileExists $INSTDIR\\* +2\n    CreateDirectory $INSTDIR\n    Pop $0\n\n    ; Skip if already downloaded\n    IfFileExists $INSTDIR\\$0 0 +2\n    Return\n\n    StrCpy $1 \"@CPACK_DOWNLOAD_SITE@\"\n\n  try_again:\n    NSISdl::download \"$1/$0\" \"$INSTDIR\\$0\"\n\n    Pop $1\n    StrCmp $1 \"success\" success\n    StrCmp $1 \"Cancelled\" cancel\n    MessageBox MB_OK \"Download failed: $1\"\n  cancel:\n    Return\n  success:\nFunctionEnd\n!endif\n\n;--------------------------------\n; Define some macro setting for the gui\n@CPACK_NSIS_INSTALLER_MUI_ICON_CODE@\n@CPACK_NSIS_INSTALLER_ICON_CODE@\n@CPACK_NSIS_INSTALLER_MUI_WELCOMEFINISH_CODE@\n@CPACK_NSIS_INSTALLER_MUI_UNWELCOMEFINISH_CODE@\n@CPACK_NSIS_INSTALLER_MUI_FINISHPAGE_RUN_CODE@\n\n;--------------------------------\n;Pages\n  @CPACK_NSIS_INSTALLER_WELCOME_TITLE_CODE@\n  @CPACK_NSIS_INSTALLER_WELCOME_TITLE_3LINES_CODE@\n  !insertmacro MUI_PAGE_WELCOME\n\n  @CPACK_NSIS_LICENSE_PAGE@\n  Page custom InstallOptionsPage\n  !insertmacro MUI_PAGE_DIRECTORY\n\n  ;Start Menu Folder Page Configuration\n  !define MUI_STARTMENUPAGE_REGISTRY_ROOT \"SHCTX\"\n  !define MUI_STARTMENUPAGE_REGISTRY_KEY \"Software\\@CPACK_PACKAGE_VENDOR@\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\"\n  !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME \"Start Menu Folder\"\n  !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER\n\n  @CPACK_NSIS_PAGE_COMPONENTS@\n\n  !insertmacro MUI_PAGE_INSTFILES\n  @CPACK_NSIS_INSTALLER_FINISH_TITLE_CODE@\n  @CPACK_NSIS_INSTALLER_FINISH_TITLE_3LINES_CODE@\n  !insertmacro MUI_PAGE_FINISH\n\n  !insertmacro MUI_UNPAGE_CONFIRM\n  !insertmacro MUI_UNPAGE_INSTFILES\n\n;--------------------------------\n;Languages\n\n  !insertmacro MUI_LANGUAGE \"English\" ;first language is the default language\n  !insertmacro MUI_LANGUAGE \"Afrikaans\"\n  !insertmacro MUI_LANGUAGE \"Albanian\"\n  !insertmacro MUI_LANGUAGE \"Arabic\"\n  !insertmacro MUI_LANGUAGE \"Asturian\"\n  !insertmacro MUI_LANGUAGE \"Basque\"\n  !insertmacro MUI_LANGUAGE \"Belarusian\"\n  !insertmacro MUI_LANGUAGE \"Bosnian\"\n  !insertmacro MUI_LANGUAGE \"Breton\"\n  !insertmacro MUI_LANGUAGE \"Bulgarian\"\n  !insertmacro MUI_LANGUAGE \"Catalan\"\n  !insertmacro MUI_LANGUAGE \"Corsican\"\n  !insertmacro MUI_LANGUAGE \"Croatian\"\n  !insertmacro MUI_LANGUAGE \"Czech\"\n  !insertmacro MUI_LANGUAGE \"Danish\"\n  !insertmacro MUI_LANGUAGE \"Dutch\"\n  !insertmacro MUI_LANGUAGE \"Esperanto\"\n  !insertmacro MUI_LANGUAGE \"Estonian\"\n  !insertmacro MUI_LANGUAGE \"Farsi\"\n  !insertmacro MUI_LANGUAGE \"Finnish\"\n  !insertmacro MUI_LANGUAGE \"French\"\n  !insertmacro MUI_LANGUAGE \"Galician\"\n  !insertmacro MUI_LANGUAGE \"German\"\n  !insertmacro MUI_LANGUAGE \"Greek\"\n  !insertmacro MUI_LANGUAGE \"Hebrew\"\n  !insertmacro MUI_LANGUAGE \"Hungarian\"\n  !insertmacro MUI_LANGUAGE \"Icelandic\"\n  !insertmacro MUI_LANGUAGE \"Indonesian\"\n  !insertmacro MUI_LANGUAGE \"Irish\"\n  !insertmacro MUI_LANGUAGE \"Italian\"\n  !insertmacro MUI_LANGUAGE \"Japanese\"\n  !insertmacro MUI_LANGUAGE \"Korean\"\n  !insertmacro MUI_LANGUAGE \"Kurdish\"\n  !insertmacro MUI_LANGUAGE \"Latvian\"\n  !insertmacro MUI_LANGUAGE \"Lithuanian\"\n  !insertmacro MUI_LANGUAGE \"Luxembourgish\"\n  !insertmacro MUI_LANGUAGE \"Macedonian\"\n  !insertmacro MUI_LANGUAGE \"Malay\"\n  !insertmacro MUI_LANGUAGE \"Mongolian\"\n  !insertmacro MUI_LANGUAGE \"Norwegian\"\n  !insertmacro MUI_LANGUAGE \"NorwegianNynorsk\"\n  !insertmacro MUI_LANGUAGE \"Pashto\"\n  !insertmacro MUI_LANGUAGE \"Polish\"\n  !insertmacro MUI_LANGUAGE \"Portuguese\"\n  !insertmacro MUI_LANGUAGE \"PortugueseBR\"\n  !insertmacro MUI_LANGUAGE \"Romanian\"\n  !insertmacro MUI_LANGUAGE \"Russian\"\n  !insertmacro MUI_LANGUAGE \"ScotsGaelic\"\n  !insertmacro MUI_LANGUAGE \"Serbian\"\n  !insertmacro MUI_LANGUAGE \"SerbianLatin\"\n  !insertmacro MUI_LANGUAGE \"SimpChinese\"\n  !insertmacro MUI_LANGUAGE \"Slovak\"\n  !insertmacro MUI_LANGUAGE \"Slovenian\"\n  !insertmacro MUI_LANGUAGE \"Spanish\"\n  !insertmacro MUI_LANGUAGE \"SpanishInternational\"\n  !insertmacro MUI_LANGUAGE \"Swedish\"\n  !insertmacro MUI_LANGUAGE \"Tatar\"\n  !insertmacro MUI_LANGUAGE \"Thai\"\n  !insertmacro MUI_LANGUAGE \"TradChinese\"\n  !insertmacro MUI_LANGUAGE \"Turkish\"\n  !insertmacro MUI_LANGUAGE \"Ukrainian\"\n  !insertmacro MUI_LANGUAGE \"Uzbek\"\n  !insertmacro MUI_LANGUAGE \"Vietnamese\"\n  !insertmacro MUI_LANGUAGE \"Welsh\"\n\n;--------------------------------\n;Reserve Files\n\n  ;These files should be inserted before other files in the data block\n  ;Keep these lines before any File command\n  ;Only for solid compression (by default, solid compression is enabled for BZIP2 and LZMA)\n\n  ReserveFile \"NSIS.InstallOptions.ini\"\n  !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS\n\n  ; for UserInfo::GetName and UserInfo::GetAccountType\n  ReserveFile /plugin 'UserInfo.dll'\n\n;--------------------------------\n; Installation types\n@CPACK_NSIS_INSTALLATION_TYPES@\n\n;--------------------------------\n; Component sections\n@CPACK_NSIS_COMPONENT_SECTIONS@\n@CPACK_NSIS_INSTALLER_MUI_COMPONENTS_DESC@\n;--------------------------------\n;Installer Sections\n\nSection \"-Core installation\"\n  ;Use the entire tree produced by the INSTALL target.  Keep the\n  ;list of directories here in sync with the RMDir commands below.\n  SetOutPath \"$INSTDIR\"\n  @CPACK_NSIS_EXTRA_PREINSTALL_COMMANDS@\n  @CPACK_NSIS_FULL_INSTALL@\n\n  ;Store installation folder\n  WriteRegStr SHCTX \"Software\\@CPACK_PACKAGE_VENDOR@\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\" \"\" $INSTDIR\n\n  ;Create uninstaller\n  WriteUninstaller \"$INSTDIR\\@CPACK_NSIS_UNINSTALL_NAME@.exe\"\n  Push \"DisplayName\"\n  Push \"@CPACK_NSIS_DISPLAY_NAME@\"\n  Call ConditionalAddToRegistry\n  Push \"DisplayVersion\"\n  Push \"@CPACK_PACKAGE_VERSION@\"\n  Call ConditionalAddToRegistry\n  Push \"Publisher\"\n  Push \"@CPACK_PACKAGE_VENDOR@\"\n  Call ConditionalAddToRegistry\n  Push \"UninstallString\"\n  Push \"$\\\"$INSTDIR\\@CPACK_NSIS_UNINSTALL_NAME@.exe$\\\"\"\n  Call ConditionalAddToRegistry\n  Push \"NoRepair\"\n  Push \"1\"\n  Call ConditionalAddToRegistry\n\n  !ifdef CPACK_NSIS_ADD_REMOVE\n  ;Create add/remove functionality\n  Push \"ModifyPath\"\n  Push \"$INSTDIR\\AddRemove.exe\"\n  Call ConditionalAddToRegistry\n  !else\n  Push \"NoModify\"\n  Push \"1\"\n  Call ConditionalAddToRegistry\n  !endif\n\n  ; Optional registration\n  Push \"DisplayIcon\"\n  Push \"$INSTDIR\\@CPACK_NSIS_INSTALLED_ICON_NAME@\"\n  Call ConditionalAddToRegistry\n  Push \"HelpLink\"\n  Push \"@CPACK_NSIS_HELP_LINK@\"\n  Call ConditionalAddToRegistry\n  Push \"URLInfoAbout\"\n  Push \"@CPACK_NSIS_URL_INFO_ABOUT@\"\n  Call ConditionalAddToRegistry\n  Push \"Contact\"\n  Push \"@CPACK_NSIS_CONTACT@\"\n  Call ConditionalAddToRegistry\n  !insertmacro MUI_INSTALLOPTIONS_READ $INSTALL_DESKTOP \"NSIS.InstallOptions.ini\" \"Field 5\" \"State\"\n  !insertmacro MUI_STARTMENU_WRITE_BEGIN Application\n\n  ;Create shortcuts\n  CreateDirectory \"$SMPROGRAMS\\$STARTMENU_FOLDER\"\n@CPACK_NSIS_CREATE_ICONS@\n@CPACK_NSIS_CREATE_ICONS_EXTRA@\n  CreateShortCut \"$SMPROGRAMS\\$STARTMENU_FOLDER\\Uninstall.lnk\" \"$INSTDIR\\@CPACK_NSIS_UNINSTALL_NAME@.exe\"\n\n  ;Read a value from an InstallOptions INI file\n  !insertmacro MUI_INSTALLOPTIONS_READ $DO_NOT_ADD_TO_PATH \"NSIS.InstallOptions.ini\" \"Field 2\" \"State\"\n  !insertmacro MUI_INSTALLOPTIONS_READ $ADD_TO_PATH_ALL_USERS \"NSIS.InstallOptions.ini\" \"Field 3\" \"State\"\n  !insertmacro MUI_INSTALLOPTIONS_READ $ADD_TO_PATH_CURRENT_USER \"NSIS.InstallOptions.ini\" \"Field 4\" \"State\"\n\n  ; Write special uninstall registry entries\n  Push \"StartMenu\"\n  Push \"$STARTMENU_FOLDER\"\n  Call ConditionalAddToRegistry\n  Push \"DoNotAddToPath\"\n  Push \"$DO_NOT_ADD_TO_PATH\"\n  Call ConditionalAddToRegistry\n  Push \"AddToPathAllUsers\"\n  Push \"$ADD_TO_PATH_ALL_USERS\"\n  Call ConditionalAddToRegistry\n  Push \"AddToPathCurrentUser\"\n  Push \"$ADD_TO_PATH_CURRENT_USER\"\n  Call ConditionalAddToRegistry\n  Push \"InstallToDesktop\"\n  Push \"$INSTALL_DESKTOP\"\n  Call ConditionalAddToRegistry\n\n  !insertmacro MUI_STARTMENU_WRITE_END\n\n@CPACK_NSIS_EXTRA_INSTALL_COMMANDS@\n\nSectionEnd\n\nSection \"-Add to path\"\n  Push $INSTDIR\n  StrCmp \"@CPACK_NSIS_MODIFY_PATH@\" \"ON\" 0 doNotAddToPath\n  StrCmp $DO_NOT_ADD_TO_PATH \"1\" doNotAddToPath 0\n    Call AddToPath\n  doNotAddToPath:\nSectionEnd\n\n;--------------------------------\n; Create custom pages\nFunction InstallOptionsPage\n  !insertmacro MUI_HEADER_TEXT \"Install Options\" \"Choose options for installing @CPACK_NSIS_PACKAGE_NAME@\"\n  !insertmacro MUI_INSTALLOPTIONS_DISPLAY \"NSIS.InstallOptions.ini\"\n\nFunctionEnd\n\n;--------------------------------\n; determine admin versus local install\nFunction un.onInit\n\n  ClearErrors\n  UserInfo::GetName\n  IfErrors noLM\n  Pop $0\n  UserInfo::GetAccountType\n  Pop $1\n  StrCmp $1 \"Admin\" 0 +3\n    SetShellVarContext all\n    ;MessageBox MB_OK 'User \"$0\" is in the Admin group'\n    Goto done\n  StrCmp $1 \"Power\" 0 +3\n    SetShellVarContext all\n    ;MessageBox MB_OK 'User \"$0\" is in the Power Users group'\n    Goto done\n\n  noLM:\n    ;Get installation folder from registry if available\n\n  done:\n\nFunctionEnd\n\n;--- Add/Remove callback functions: ---\n!macro SectionList MacroName\n  ;This macro used to perform operation on multiple sections.\n  ;List all of your components in following manner here.\n@CPACK_NSIS_COMPONENT_SECTION_LIST@\n!macroend\n\nSection -FinishComponents\n  ;Removes unselected components and writes component status to registry\n  !insertmacro SectionList \"FinishSection\"\n\n!ifdef CPACK_NSIS_ADD_REMOVE\n  ; Get the name of the installer executable\n  System::Call 'kernel32::GetModuleFileNameA(i 0, t .R0, i 1024) i r1'\n  StrCpy $R3 $R0\n\n  ; Strip off the last 13 characters, to see if we have AddRemove.exe\n  StrLen $R1 $R0\n  IntOp $R1 $R0 - 13\n  StrCpy $R2 $R0 13 $R1\n  StrCmp $R2 \"AddRemove.exe\" addremove_installed\n\n  ; We're not running AddRemove.exe, so install it\n  CopyFiles $R3 $INSTDIR\\AddRemove.exe\n\n  addremove_installed:\n!endif\nSectionEnd\n;--- End of Add/Remove callback functions ---\n\n;--------------------------------\n; Component dependencies\nFunction .onSelChange\n  !insertmacro SectionList MaybeSelectionChanged\nFunctionEnd\n\n;--------------------------------\n;Uninstaller Section\n\nSection \"Uninstall\"\n  ReadRegStr $START_MENU SHCTX \\\n   \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\" \"StartMenu\"\n  ;MessageBox MB_OK \"Start menu is in: $START_MENU\"\n  ReadRegStr $DO_NOT_ADD_TO_PATH SHCTX \\\n    \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\" \"DoNotAddToPath\"\n  ReadRegStr $ADD_TO_PATH_ALL_USERS SHCTX \\\n    \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\" \"AddToPathAllUsers\"\n  ReadRegStr $ADD_TO_PATH_CURRENT_USER SHCTX \\\n    \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\" \"AddToPathCurrentUser\"\n  ;MessageBox MB_OK \"Add to path: $DO_NOT_ADD_TO_PATH all users: $ADD_TO_PATH_ALL_USERS\"\n  ReadRegStr $INSTALL_DESKTOP SHCTX \\\n    \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\" \"InstallToDesktop\"\n  ;MessageBox MB_OK \"Install to desktop: $INSTALL_DESKTOP \"\n\n@CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS@\n\n  ;Remove files we installed.\n  ;Keep the list of directories here in sync with the File commands above.\n@CPACK_NSIS_DELETE_FILES@\n@CPACK_NSIS_DELETE_DIRECTORIES@\n\n!ifdef CPACK_NSIS_ADD_REMOVE\n  ;Remove the add/remove program\n  Delete \"$INSTDIR\\AddRemove.exe\"\n!endif\n\n  ;Remove the uninstaller itself.\n  Delete \"$INSTDIR\\@CPACK_NSIS_UNINSTALL_NAME@.exe\"\n  DeleteRegKey SHCTX \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\"\n\n  ;Remove the installation directory if it is empty.\n  RMDir \"$INSTDIR\"\n\n  ; Remove the registry entries.\n  DeleteRegKey SHCTX \"Software\\@CPACK_PACKAGE_VENDOR@\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\"\n\n  ; Removes all optional components\n  !insertmacro SectionList \"RemoveSection_CPack\"\n\n  !insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP\n\n  Delete \"$SMPROGRAMS\\$MUI_TEMP\\Uninstall.lnk\"\n@CPACK_NSIS_DELETE_ICONS@\n@CPACK_NSIS_DELETE_ICONS_EXTRA@\n\n  ;Delete empty start menu parent directories\n  StrCpy $MUI_TEMP \"$SMPROGRAMS\\$MUI_TEMP\"\n\n  startMenuDeleteLoop:\n    ClearErrors\n    RMDir $MUI_TEMP\n    GetFullPathName $MUI_TEMP \"$MUI_TEMP\\..\"\n\n    IfErrors startMenuDeleteLoopDone\n\n    StrCmp \"$MUI_TEMP\" \"$SMPROGRAMS\" startMenuDeleteLoopDone startMenuDeleteLoop\n  startMenuDeleteLoopDone:\n\n  ; If the user changed the shortcut, then uninstall may not work. This should\n  ; try to fix it.\n  StrCpy $MUI_TEMP \"$START_MENU\"\n  Delete \"$SMPROGRAMS\\$MUI_TEMP\\Uninstall.lnk\"\n@CPACK_NSIS_DELETE_ICONS_EXTRA@\n\n  ;Delete empty start menu parent directories\n  StrCpy $MUI_TEMP \"$SMPROGRAMS\\$MUI_TEMP\"\n\n  secondStartMenuDeleteLoop:\n    ClearErrors\n    RMDir $MUI_TEMP\n    GetFullPathName $MUI_TEMP \"$MUI_TEMP\\..\"\n\n    IfErrors secondStartMenuDeleteLoopDone\n\n    StrCmp \"$MUI_TEMP\" \"$SMPROGRAMS\" secondStartMenuDeleteLoopDone secondStartMenuDeleteLoop\n  secondStartMenuDeleteLoopDone:\n\n  DeleteRegKey /ifempty SHCTX \"Software\\@CPACK_PACKAGE_VENDOR@\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\"\n\n  Push $INSTDIR\n  StrCmp $DO_NOT_ADD_TO_PATH_ \"1\" doNotRemoveFromPath 0\n    Call un.RemoveFromPath\n  doNotRemoveFromPath:\nSectionEnd\n\n;--------------------------------\n; determine admin versus local install\n; Is install for \"AllUsers\" or \"JustMe\"?\n; Default to \"JustMe\" - set to \"AllUsers\" if admin or on Win9x\n; This function is used for the very first \"custom page\" of the installer.\n; This custom page does not show up visibly, but it executes prior to the\n; first visible page and sets up $INSTDIR properly...\n; Choose different default installation folder based on SV_ALLUSERS...\n; \"Program Files\" for AllUsers, \"My Documents\" for JustMe...\n\nFunction .onInit\n  StrCmp \"@CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL@\" \"ON\" 0 inst\n\n  ReadRegStr $0 HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\" \"UninstallString\"\n  StrCmp $0 \"\" inst\n\n  MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION \\\n  \"@CPACK_NSIS_PACKAGE_NAME@ is already installed. $\\n$\\nDo you want to uninstall the old version before installing the new one?\" \\\n  /SD IDYES IDYES uninst IDNO inst\n  Abort\n\n;Run the uninstaller\nuninst:\n  ClearErrors\n  # $0 should _always_ be quoted, however older versions of CMake did not\n  # do this.  We'll conditionally remove the begin/end quotes.\n  # Remove first char if quote\n  StrCpy $2 $0 1 0      # copy first char\n  StrCmp $2 \"$\\\"\" 0 +2  # if char is quote\n  StrCpy $0 $0 \"\" 1     # remove first char\n  # Remove last char if quote\n  StrCpy $2 $0 1 -1     # copy last char\n  StrCmp $2 \"$\\\"\" 0 +2  # if char is quote\n  StrCpy $0 $0 -1       # remove last char\n\n  StrLen $2 \"\\@CPACK_NSIS_UNINSTALL_NAME@.exe\"\n  StrCpy $3 $0 -$2 # remove \"\\@CPACK_NSIS_UNINSTALL_NAME@.exe\" from UninstallString to get path\n  ExecWait '\"$0\" /S _?=$3' ;Do not copy the uninstaller to a temp file\n\n  IfErrors uninst_failed inst\nuninst_failed:\n  MessageBox MB_OK|MB_ICONSTOP \"Uninstall failed.\"\n  Abort\n\n\ninst:\n  ; Reads components status for registry\n  !insertmacro SectionList \"InitSection\"\n\n  ; check to see if /D has been used to change\n  ; the install directory by comparing it to the\n  ; install directory that is expected to be the\n  ; default\n  StrCpy $IS_DEFAULT_INSTALLDIR 0\n  StrCmp \"$INSTDIR\" \"@CPACK_NSIS_INSTALL_ROOT@\\@CPACK_PACKAGE_INSTALL_DIRECTORY@\" 0 +2\n    StrCpy $IS_DEFAULT_INSTALLDIR 1\n\n  StrCpy $SV_ALLUSERS \"JustMe\"\n  ; if default install dir then change the default\n  ; if it is installed for JustMe\n  StrCmp \"$IS_DEFAULT_INSTALLDIR\" \"1\" 0 +2\n    StrCpy $INSTDIR \"$DOCUMENTS\\@CPACK_PACKAGE_INSTALL_DIRECTORY@\"\n\n  ClearErrors\n  UserInfo::GetName\n  IfErrors noLM\n  Pop $0\n  UserInfo::GetAccountType\n  Pop $1\n  StrCmp $1 \"Admin\" 0 +4\n    SetShellVarContext all\n    ;MessageBox MB_OK 'User \"$0\" is in the Admin group'\n    StrCpy $SV_ALLUSERS \"AllUsers\"\n    Goto done\n  StrCmp $1 \"Power\" 0 +3\n    SetShellVarContext all\n    ;MessageBox MB_OK 'User \"$0\" is in the Power Users group'\n    StrCpy $SV_ALLUSERS \"AllUsers\"\n    Goto done\n\n  noLM:\n    StrCpy $SV_ALLUSERS \"AllUsers\"\n    ;Get installation folder from registry if available\n\n  done:\n  StrCmp $SV_ALLUSERS \"AllUsers\" 0 +3\n    StrCmp \"$IS_DEFAULT_INSTALLDIR\" \"1\" 0 +2\n      StrCpy $INSTDIR \"@CPACK_NSIS_INSTALL_ROOT@\\@CPACK_PACKAGE_INSTALL_DIRECTORY@\"\n\n  StrCmp \"@CPACK_NSIS_MODIFY_PATH@\" \"ON\" 0 noOptionsPage\n    !insertmacro MUI_INSTALLOPTIONS_EXTRACT \"NSIS.InstallOptions.ini\"\n\n  noOptionsPage:\nFunctionEnd\n"
  },
  {
    "path": "extra/resources/b64.lua",
    "content": "function b64(name)\n\tlocal i = io.popen(\"base64 \" .. name)\n\tlocal encoded = i:read(\"*a\")\n\ti:close()\n\n\tlocal output = (\"local %s =\\n%q\"):format(name:gsub(\"%.\", \"_\"), encoded)\n\treturn output\nend\n\nfor i, v in ipairs(arg) do\n\tprint(b64(v))\nend\n"
  },
  {
    "path": "license.txt",
    "content": "Licensing information\r\n=====================\r\n\r\nThis distribution contains code from the following projects (full license text below):\r\n\r\n - LOVE\r\n\tWebsite: https://love2d.org/\r\n\tLicense: zlib\r\n\tCopyright (c) 2006-2026 LOVE Development Team\r\n\r\n - ENet\r\n\tWebsite: http://enet.bespin.org/index.html\r\n\tLicense: MIT/Expat\r\n\tCopyright (c) 2002-2016 Lee Salzman\r\n\r\n - FreeType\r\n\tWebsite: https://freetype.org/\r\n\tLicense: FreeType License\r\n\tCopyright (c) 2006-2017 David Turner, Robert Wilhelm, and Werner Lemberg.\r\n\r\n - GLAD\r\n\tWebsite: http://glad.dav1d.de/\r\n\tLicense: MIT/Expat\r\n\tCopyright (c) 2013 David Herberth, modified by Sasha Szpakowski\r\n\r\n - glslang\r\n\tWebsite: https://github.com/KhronosGroup/glslang\r\n\tLicense: 3-Clause BSD\r\n\tCopyright (C) 2002-2005  3Dlabs Inc. Ltd.\r\n\tCopyright (C) 2013-2016 LunarG, Inc.\r\n\t\r\n- SPIRV-Cross\r\n\tWebsite: https://github.com/KhronosGroup/SPIRV-Cross\r\n\tLicense: Apache 2.0 or MIT/Expat\r\n\tCopyright 2015-2021 Arm Limited\r\n\tCopyright 2016-2021 The Brenwill Workshop Ltd.\r\n\r\n - Kepler Project's lua-compat-5.3\r\n\tWebsite: https://github.com/keplerproject/lua-compat-5.3\r\n\tLicense: MIT/Expat\r\n\tCopyright (c) 2015 Kepler Project.\r\n\r\n - lua-enet\r\n\tWebsite: http://leafo.net/lua-enet/\r\n\tLicense: MIT/Expat\r\n\tCopyright (C) 2011 by Leaf Corcoran\r\n\r\n - LuaJIT\r\n\tWebsite: http://luajit.org/\r\n\tLicense: MIT/Expat\r\n\tLuaJIT is Copyright (c) 2005-2016 Mike Pall\r\n\r\n - Lua's UTF-8 module\r\n\tWebsite: https://www.lua.org/\r\n\tLicense: MIT/Expat\r\n\tCopyright (C) 1994-2015 Lua.org, PUC-Rio, 2015 LOVE Development Team.\r\n\r\n - LuaSocket\r\n\tWebsite: http://w3.impa.br/~diego/software/luasocket/home.html\r\n\tLicense: MIT/Expat\r\n\tCopyright (C) 2004-2013 Diego Nehab\r\n\r\n - LZ4\r\n\tWebsite: https://lz4.github.io/lz4/\r\n\tLicense: 2-Clause BSD\r\n\tCopyright (C) 2011-2015, Yann Collet.\r\n\t\tYou can contact the author at :\r\n\t\t- LZ4 source repository : https://github.com/Cyan4973/lz4\r\n\t\t- LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c\r\n\r\n - LodePNG\r\n\tWebsite: https://lodev.org/lodepng/\r\n\tSource download: https://github.com/lvandeve/lodepng\r\n\tLicense: zlib\r\n\tCopyright (c) 2005-2020 Lode Vandevenne\r\n\r\n - TinyEXR\r\n\tWebsite: https://github.com/syoyo/tinyexr\r\n\tLicense: 3-Clause BSD\r\n\tCopyright (c) 2014 - 2016, Syoyo Fujita\r\n\r\n - UTF8-CPP\r\n\tWebsite: https://github.com/nemtrif/utfcpp\r\n\tLicense: Unknown, MIT/Expat-like (listed as UTF8-CPP)\r\n\tCopyright 2006 Nemanja Trifunovic\r\n\r\n - xxHash\r\n\tWebsite: https://cyan4973.github.io/xxHash/\r\n\tLicense: 2-Clause BSD\r\n\tCopyright (C) 2012-2016, Yann Collet.\r\n\t\tYou can contact the author at :\r\n\t\t- xxHash source repository : https://github.com/Cyan4973/xxHash\r\n\r\n - dr_flac\r\n\tWebsite: https://github.com/mackron/dr_libs\r\n\tSource download: https://github.com/mackron/dr_libs/blob/15f37e3/dr_flac.h\r\n\tLicense: MIT/Expat\r\n\tCopyright 2018 David Reid\r\n\r\n - dr_mp3\r\n\tWebsite: https://mackron.github.io/dr_libs/\r\n\tSource download: https://github.com/mackron/dr_libs/blob/dd762b8/dr_mp3.h\r\n\tLicense: MIT/Expat\r\n\tCopyright 2018 David Reid\r\n\r\n - stb_image\r\n\tWebsite: https://github.com/nothings/stb\r\n\tSource download: https://github.com/nothings/stb/blob/e140649ccf40818781b7e408f6228a486f6d254b/stb_image.h\r\n\tLicense: MIT/Expat\r\n\tCopyright (c) 2017 Sean Barrett\r\n\r\n - OpenAL Soft\r\n\tWebsite: https://openal-soft.org/\r\n\tSource download: https://openal-soft.org/#download\r\n\tLicense: Mixed, licensing information obtained from the debian project\r\n\t\t- Alc/backends/opensl.c\r\n\t\t\tLicense: Apache 2.0\r\n\t\t\tCopyright 2011 The Android Open Source Project\r\n\t\t- examples/alhrtf.c examples/allatency.c examples/alloopback.c examples/alreverb.c examples/alstream.c examples/altonegen.c examples/common/alhelpers.c examples/common/sdl_sound.c utils/openal-info.c\r\n\t\t\tLicense: MIT/Expat\r\n\t\t\tCopyright © 2010, 2015 Chris Robinson <chris.kcat@gmail.com>\r\n\t\t- examples/alffplay.c\r\n\t\t\tLicense: unclear, presumed LGPL 2.1 or higher\r\n\t\t\tCopyright © 2003 Fabrice Bellard\r\n\t\t\tCopyright © Martin Bohme\r\n\t\t- Alc/bs2b.c OpenAL32/Include/bs2b.h\r\n\t\t\tLicense: MIT/Expat\r\n\t\t\tCopyright 2005 by Boris Mikhaylov\r\n\t\t- cmake/FindALSA.cmake cmake/FindFFmpeg.cmake cmake/FindJACK.cmake cmake/FindSDL2.cmake\r\n\t\t\tLicense: 3-Clause BSD\r\n\t\t\t Copyright © 2006 Matthias Kretz\r\n\t\t\t Copyright © 2008 Alexander Neundorf\r\n\t\t\t Copyright © 2003-2011 Kitware, Inc.\r\n\t\t\t Copyright © 2009-2011 Philip Lowman\r\n\t\t\t Copyright © 2011 Michael Jansen\r\n\t\t\t Copyright © 2012 Benjamin Eikel\r\n\t\t- utils/makehrtf.c (not included in distribution)\r\n\t\t\tLicense: GPL 2 or higher (2 listed below)\r\n\t\t\tCopyright 2011-2014 Christopher Fitzgerald\r\n\t\t- Everything else:\r\n\t\t\tLicense: LGPL 2.0 or higher (2.1 listed below)\r\n\t\t\tCopyright © 1999-2014 the OpenAL team\r\n\t\t\tCopyright © 2008-2015 Christopher Fitzgerald\r\n\t\t\tCopyright © 2009-2015 Chris Robinson\r\n\t\t\tCopyright © 2013 Anis A. Hireche\r\n\t\t\tCopyright © 2013 Nasca Octavian Paul\r\n\t\t\tCopyright © 2013 Mike Gorchak\r\n\t\t\tCopyright © 2014 Timothy Arceri\r\n\r\n - Vulkan Memory Allocator\r\n\tWebsite: https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator\r\n\tLicense: MIT/Expat\r\n\tCopyright (c) 2017-2022 Advanced Micro Devices, Inc.\r\n\r\n - volk\r\n\tWebsite: https://github.com/zeux/volk\r\n\tLicense: MIT/Expat\r\n\tCopyright (c) 2018-2022 Arseny Kapoulkine\r\n\r\n - Vulkan-Headers\r\n\tWebsite: https://github.com/KhronosGroup/Vulkan-Headers\r\n\tLicense: Apache 2.0\r\n\tCopyright (c) 2022 Khronos Group\r\n\r\nLicense text\r\n============\r\n\r\nzlib license\r\n\tThis software is provided 'as-is', without any express or implied\r\n\twarranty. In no event will the authors be held liable for any damages\r\n\tarising from the use of this software.\r\n\r\n\tPermission is granted to anyone to use this software for any purpose,\r\n\tincluding commercial applications, and to alter it and redistribute it\r\n\tfreely, subject to the following restrictions:\r\n\r\n\t1. The origin of this software must not be misrepresented; you must not\r\n\tclaim that you wrote the original software. If you use this software\r\n\tin a product, an acknowledgment in the product documentation would be\r\n\tappreciated but is not required.\r\n\r\n\t2. Altered source versions must be plainly marked as such, and must not be\r\n\tmisrepresented as being the original software.\r\n\r\n\t3. This notice may not be removed or altered from any source\r\n\tdistribution.\r\n\r\nMIT/Expat\r\n\tPermission is hereby granted, free of charge, to any person obtaining a copy\r\n\tof this software and associated documentation files (the \"Software\"), to deal\r\n\tin the Software without restriction, including without limitation the rights\r\n\tto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n\tcopies of the Software, and to permit persons to whom the Software is\r\n\tfurnished to do so, subject to the following conditions:\r\n\r\n\tThe above copyright notice and this permission notice shall be included in\r\n\tall copies or substantial portions of the Software.\r\n\r\n\tTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n\tIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n\tFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n\tAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n\tLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n\tOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n\tTHE SOFTWARE.\r\n\r\nFreeType License\r\n\t                    The FreeType Project LICENSE\r\n\t                    ----------------------------\r\n\r\n\t                            2006-Jan-27\r\n\r\n\t                    Copyright 1996-2002, 2006 by\r\n\t          David Turner, Robert Wilhelm, and Werner Lemberg\r\n\r\n\tIntroduction\r\n\t============\r\n\r\n\t  The FreeType  Project is distributed in  several archive packages;\r\n\t  some of them may contain, in addition to the FreeType font engine,\r\n\t  various tools and  contributions which rely on, or  relate to, the\r\n\t  FreeType Project.\r\n\r\n\t  This  license applies  to all  files found  in such  packages, and\r\n\t  which do not  fall under their own explicit  license.  The license\r\n\t  affects  thus  the  FreeType   font  engine,  the  test  programs,\r\n\t  documentation and makefiles, at the very least.\r\n\r\n\t  This  license   was  inspired  by  the  BSD,   Artistic,  and  IJG\r\n\t  (Independent JPEG  Group) licenses, which  all encourage inclusion\r\n\t  and  use of  free  software in  commercial  and freeware  products\r\n\t  alike.  As a consequence, its main points are that:\r\n\r\n\t    o We don't promise that this software works. However, we will be\r\n\t      interested in any kind of bug reports. (`as is' distribution)\r\n\r\n\t    o You can  use this software for whatever you  want, in parts or\r\n\t      full form, without having to pay us. (`royalty-free' usage)\r\n\r\n\t    o You may not pretend that  you wrote this software.  If you use\r\n\t      it, or  only parts of it,  in a program,  you must acknowledge\r\n\t      somewhere  in  your  documentation  that  you  have  used  the\r\n\t      FreeType code. (`credits')\r\n\r\n\t  We  specifically  permit  and  encourage  the  inclusion  of  this\r\n\t  software, with  or without modifications,  in commercial products.\r\n\t  We  disclaim  all warranties  covering  The  FreeType Project  and\r\n\t  assume no liability related to The FreeType Project.\r\n\r\n\r\n\t  Finally,  many  people  asked  us  for  a  preferred  form  for  a\r\n\t  credit/disclaimer to use in compliance with this license.  We thus\r\n\t  encourage you to use the following text:\r\n\r\n\t   \"\"\"\r\n\t    Portions of this software are copyright © <year> The FreeType\r\n\t    Project (www.freetype.org).  All rights reserved.\r\n\t   \"\"\"\r\n\r\n\t  Please replace <year> with the value from the FreeType version you\r\n\t  actually use.\r\n\r\n\r\n\tLegal Terms\r\n\t===========\r\n\r\n\t0. Definitions\r\n\t--------------\r\n\r\n\t  Throughout this license,  the terms `package', `FreeType Project',\r\n\t  and  `FreeType  archive' refer  to  the  set  of files  originally\r\n\t  distributed  by the  authors  (David Turner,  Robert Wilhelm,  and\r\n\t  Werner Lemberg) as the `FreeType Project', be they named as alpha,\r\n\t  beta or final release.\r\n\r\n\t  `You' refers to  the licensee, or person using  the project, where\r\n\t  `using' is a generic term including compiling the project's source\r\n\t  code as  well as linking it  to form a  `program' or `executable'.\r\n\t  This  program is  referred to  as  `a program  using the  FreeType\r\n\t  engine'.\r\n\r\n\t  This  license applies  to all  files distributed  in  the original\r\n\t  FreeType  Project,   including  all  source   code,  binaries  and\r\n\t  documentation,  unless  otherwise  stated   in  the  file  in  its\r\n\t  original, unmodified form as  distributed in the original archive.\r\n\t  If you are  unsure whether or not a particular  file is covered by\r\n\t  this license, you must contact us to verify this.\r\n\r\n\t  The FreeType  Project is copyright (C) 1996-2000  by David Turner,\r\n\t  Robert Wilhelm, and Werner Lemberg.  All rights reserved except as\r\n\t  specified below.\r\n\r\n\t1. No Warranty\r\n\t--------------\r\n\r\n\t  THE FREETYPE PROJECT  IS PROVIDED `AS IS' WITHOUT  WARRANTY OF ANY\r\n\t  KIND, EITHER  EXPRESS OR IMPLIED,  INCLUDING, BUT NOT  LIMITED TO,\r\n\t  WARRANTIES  OF  MERCHANTABILITY   AND  FITNESS  FOR  A  PARTICULAR\r\n\t  PURPOSE.  IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS\r\n\t  BE LIABLE  FOR ANY DAMAGES CAUSED  BY THE USE OR  THE INABILITY TO\r\n\t  USE, OF THE FREETYPE PROJECT.\r\n\r\n\t2. Redistribution\r\n\t-----------------\r\n\r\n\t  This  license  grants  a  worldwide, royalty-free,  perpetual  and\r\n\t  irrevocable right  and license to use,  execute, perform, compile,\r\n\t  display,  copy,   create  derivative  works   of,  distribute  and\r\n\t  sublicense the  FreeType Project (in  both source and  object code\r\n\t  forms)  and  derivative works  thereof  for  any  purpose; and  to\r\n\t  authorize others  to exercise  some or all  of the  rights granted\r\n\t  herein, subject to the following conditions:\r\n\r\n\t    o Redistribution of  source code  must retain this  license file\r\n\t      (`FTL.TXT') unaltered; any  additions, deletions or changes to\r\n\t      the original  files must be clearly  indicated in accompanying\r\n\t      documentation.   The  copyright   notices  of  the  unaltered,\r\n\t      original  files must  be  preserved in  all  copies of  source\r\n\t      files.\r\n\r\n\t    o Redistribution in binary form must provide a  disclaimer  that\r\n\t      states  that  the software is based in part of the work of the\r\n\t      FreeType Team,  in  the  distribution  documentation.  We also\r\n\t      encourage you to put an URL to the FreeType web page  in  your\r\n\t      documentation, though this isn't mandatory.\r\n\r\n\t  These conditions  apply to any  software derived from or  based on\r\n\t  the FreeType Project,  not just the unmodified files.   If you use\r\n\t  our work, you  must acknowledge us.  However, no  fee need be paid\r\n\t  to us.\r\n\r\n\t3. Advertising\r\n\t--------------\r\n\r\n\t  Neither the  FreeType authors and  contributors nor you  shall use\r\n\t  the name of the  other for commercial, advertising, or promotional\r\n\t  purposes without specific prior written permission.\r\n\r\n\t  We suggest,  but do not require, that  you use one or  more of the\r\n\t  following phrases to refer  to this software in your documentation\r\n\t  or advertising  materials: `FreeType Project',  `FreeType Engine',\r\n\t  `FreeType library', or `FreeType Distribution'.\r\n\r\n\t  As  you have  not signed  this license,  you are  not  required to\r\n\t  accept  it.   However,  as  the FreeType  Project  is  copyrighted\r\n\t  material, only  this license, or  another one contracted  with the\r\n\t  authors, grants you  the right to use, distribute,  and modify it.\r\n\t  Therefore,  by  using,  distributing,  or modifying  the  FreeType\r\n\t  Project, you indicate that you understand and accept all the terms\r\n\t  of this license.\r\n\r\n\t4. Contacts\r\n\t-----------\r\n\r\n\t  There are two mailing lists related to FreeType:\r\n\r\n\t    o freetype@nongnu.org\r\n\r\n\t      Discusses general use and applications of FreeType, as well as\r\n\t      future and  wanted additions to the  library and distribution.\r\n\t      If  you are looking  for support,  start in  this list  if you\r\n\t      haven't found anything to help you in the documentation.\r\n\r\n\t    o freetype-devel@nongnu.org\r\n\r\n\t      Discusses bugs,  as well  as engine internals,  design issues,\r\n\t      specific licenses, porting, etc.\r\n\r\n\t  Our home page can be found at\r\n\r\n\t    http://www.freetype.org\r\n\r\n3-Clause BSD\r\n\tAll rights reserved.\r\n\r\n\tRedistribution and use in source and binary forms, with or without\r\n\tmodification, are permitted provided that the following conditions\r\n\tare met:\r\n\r\n\t   Redistributions of source code must retain the above copyright\r\n\t   notice, this list of conditions and the following disclaimer.\r\n\r\n\t   Redistributions in binary form must reproduce the above\r\n\t   copyright notice, this list of conditions and the following\r\n\t   disclaimer in the documentation and/or other materials provided\r\n\t   with the distribution.\r\n\r\n\t   Neither the name of 3Dlabs Inc. Ltd. nor the names of its\r\n\t   contributors may be used to endorse or promote products derived\r\n\t   from this software without specific prior written permission.\r\n\r\n\tTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n\t\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\n\tLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\r\n\tFOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\r\n\tCOPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\r\n\tINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r\n\tBUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n\tLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n\tCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r\n\tLIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\r\n\tANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r\n\tPOSSIBILITY OF SUCH DAMAGE.\r\n\r\n2-Clause BSD\r\n\tRedistribution and use in source and binary forms, with or without\r\n\tmodification, are permitted provided that the following conditions are\r\n\tmet:\r\n\r\n\t   * Redistributions of source code must retain the above copyright\r\n\tnotice, this list of conditions and the following disclaimer.\r\n\t   * Redistributions in binary form must reproduce the above\r\n\tcopyright notice, this list of conditions and the following disclaimer\r\n\tin the documentation and/or other materials provided with the\r\n\tdistribution.\r\n\r\n\tTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n\t\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\n\tLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r\n\tA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r\n\tOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r\n\tSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r\n\tLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n\tDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r\n\tTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n\t(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n\tOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\nUTF8-CPP\r\n\tPermission is hereby granted, free of charge, to any person or organization\r\n\tobtaining a copy of the software and accompanying documentation covered by\r\n\tthis license (the \"Software\") to use, reproduce, display, distribute,\r\n\texecute, and transmit the Software, and to prepare derivative works of the\r\n\tSoftware, and to permit third-parties to whom the Software is furnished to\r\n\tdo so, all subject to the following:\r\n\r\n\tThe copyright notices in the Software and this entire statement, including\r\n\tthe above license grant, this restriction and the following disclaimer,\r\n\tmust be included in all copies of the Software, in whole or in part, and\r\n\tall derivative works of the Software, unless such copies or derivative\r\n\tworks are solely in the form of machine-executable object code generated by\r\n\ta source language processor.\r\n\r\n\tTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n\tIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n\tFITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\r\n\tSHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\r\n\tFOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\r\n\tARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r\n\tDEALINGS IN THE SOFTWARE.\r\n\r\nLGPL 2.1\r\n\t\t\t\t\t  GNU LESSER GENERAL PUBLIC LICENSE\r\n\t\t\t\t\t\t   Version 2.1, February 1999\r\n\r\n\t Copyright (C) 1991, 1999 Free Software Foundation, Inc.\r\n\t 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n\t Everyone is permitted to copy and distribute verbatim copies\r\n\t of this license document, but changing it is not allowed.\r\n\r\n\t[This is the first released version of the Lesser GPL.  It also counts\r\n\t as the successor of the GNU Library Public License, version 2, hence\r\n\t the version number 2.1.]\r\n\r\n\t\t\t\t\t\t\t\tPreamble\r\n\r\n\t  The licenses for most software are designed to take away your\r\n\tfreedom to share and change it.  By contrast, the GNU General Public\r\n\tLicenses are intended to guarantee your freedom to share and change\r\n\tfree software--to make sure the software is free for all its users.\r\n\r\n\t  This license, the Lesser General Public License, applies to some\r\n\tspecially designated software packages--typically libraries--of the\r\n\tFree Software Foundation and other authors who decide to use it.  You\r\n\tcan use it too, but we suggest you first think carefully about whether\r\n\tthis license or the ordinary General Public License is the better\r\n\tstrategy to use in any particular case, based on the explanations below.\r\n\r\n\t  When we speak of free software, we are referring to freedom of use,\r\n\tnot price.  Our General Public Licenses are designed to make sure that\r\n\tyou have the freedom to distribute copies of free software (and charge\r\n\tfor this service if you wish); that you receive source code or can get\r\n\tit if you want it; that you can change the software and use pieces of\r\n\tit in new free programs; and that you are informed that you can do\r\n\tthese things.\r\n\r\n\t  To protect your rights, we need to make restrictions that forbid\r\n\tdistributors to deny you these rights or to ask you to surrender these\r\n\trights.  These restrictions translate to certain responsibilities for\r\n\tyou if you distribute copies of the library or if you modify it.\r\n\r\n\t  For example, if you distribute copies of the library, whether gratis\r\n\tor for a fee, you must give the recipients all the rights that we gave\r\n\tyou.  You must make sure that they, too, receive or can get the source\r\n\tcode.  If you link other code with the library, you must provide\r\n\tcomplete object files to the recipients, so that they can relink them\r\n\twith the library after making changes to the library and recompiling\r\n\tit.  And you must show them these terms so they know their rights.\r\n\r\n\t  We protect your rights with a two-step method: (1) we copyright the\r\n\tlibrary, and (2) we offer you this license, which gives you legal\r\n\tpermission to copy, distribute and/or modify the library.\r\n\r\n\t  To protect each distributor, we want to make it very clear that\r\n\tthere is no warranty for the free library.  Also, if the library is\r\n\tmodified by someone else and passed on, the recipients should know\r\n\tthat what they have is not the original version, so that the original\r\n\tauthor's reputation will not be affected by problems that might be\r\n\tintroduced by others.\r\n\r\n\t  Finally, software patents pose a constant threat to the existence of\r\n\tany free program.  We wish to make sure that a company cannot\r\n\teffectively restrict the users of a free program by obtaining a\r\n\trestrictive license from a patent holder.  Therefore, we insist that\r\n\tany patent license obtained for a version of the library must be\r\n\tconsistent with the full freedom of use specified in this license.\r\n\r\n\t  Most GNU software, including some libraries, is covered by the\r\n\tordinary GNU General Public License.  This license, the GNU Lesser\r\n\tGeneral Public License, applies to certain designated libraries, and\r\n\tis quite different from the ordinary General Public License.  We use\r\n\tthis license for certain libraries in order to permit linking those\r\n\tlibraries into non-free programs.\r\n\r\n\t  When a program is linked with a library, whether statically or using\r\n\ta shared library, the combination of the two is legally speaking a\r\n\tcombined work, a derivative of the original library.  The ordinary\r\n\tGeneral Public License therefore permits such linking only if the\r\n\tentire combination fits its criteria of freedom.  The Lesser General\r\n\tPublic License permits more lax criteria for linking other code with\r\n\tthe library.\r\n\r\n\t  We call this license the \"Lesser\" General Public License because it\r\n\tdoes Less to protect the user's freedom than the ordinary General\r\n\tPublic License.  It also provides other free software developers Less\r\n\tof an advantage over competing non-free programs.  These disadvantages\r\n\tare the reason we use the ordinary General Public License for many\r\n\tlibraries.  However, the Lesser license provides advantages in certain\r\n\tspecial circumstances.\r\n\r\n\t  For example, on rare occasions, there may be a special need to\r\n\tencourage the widest possible use of a certain library, so that it becomes\r\n\ta de-facto standard.  To achieve this, non-free programs must be\r\n\tallowed to use the library.  A more frequent case is that a free\r\n\tlibrary does the same job as widely used non-free libraries.  In this\r\n\tcase, there is little to gain by limiting the free library to free\r\n\tsoftware only, so we use the Lesser General Public License.\r\n\r\n\t  In other cases, permission to use a particular library in non-free\r\n\tprograms enables a greater number of people to use a large body of\r\n\tfree software.  For example, permission to use the GNU C Library in\r\n\tnon-free programs enables many more people to use the whole GNU\r\n\toperating system, as well as its variant, the GNU/Linux operating\r\n\tsystem.\r\n\r\n\t  Although the Lesser General Public License is Less protective of the\r\n\tusers' freedom, it does ensure that the user of a program that is\r\n\tlinked with the Library has the freedom and the wherewithal to run\r\n\tthat program using a modified version of the Library.\r\n\r\n\t  The precise terms and conditions for copying, distribution and\r\n\tmodification follow.  Pay close attention to the difference between a\r\n\t\"work based on the library\" and a \"work that uses the library\".  The\r\n\tformer contains code derived from the library, whereas the latter must\r\n\tbe combined with the library in order to run.\r\n\r\n\t\t\t\t\t  GNU LESSER GENERAL PUBLIC LICENSE\r\n\t   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\r\n\r\n\t  0. This License Agreement applies to any software library or other\r\n\tprogram which contains a notice placed by the copyright holder or\r\n\tother authorized party saying it may be distributed under the terms of\r\n\tthis Lesser General Public License (also called \"this License\").\r\n\tEach licensee is addressed as \"you\".\r\n\r\n\t  A \"library\" means a collection of software functions and/or data\r\n\tprepared so as to be conveniently linked with application programs\r\n\t(which use some of those functions and data) to form executables.\r\n\r\n\t  The \"Library\", below, refers to any such software library or work\r\n\twhich has been distributed under these terms.  A \"work based on the\r\n\tLibrary\" means either the Library or any derivative work under\r\n\tcopyright law: that is to say, a work containing the Library or a\r\n\tportion of it, either verbatim or with modifications and/or translated\r\n\tstraightforwardly into another language.  (Hereinafter, translation is\r\n\tincluded without limitation in the term \"modification\".)\r\n\r\n\t  \"Source code\" for a work means the preferred form of the work for\r\n\tmaking modifications to it.  For a library, complete source code means\r\n\tall the source code for all modules it contains, plus any associated\r\n\tinterface definition files, plus the scripts used to control compilation\r\n\tand installation of the library.\r\n\r\n\t  Activities other than copying, distribution and modification are not\r\n\tcovered by this License; they are outside its scope.  The act of\r\n\trunning a program using the Library is not restricted, and output from\r\n\tsuch a program is covered only if its contents constitute a work based\r\n\ton the Library (independent of the use of the Library in a tool for\r\n\twriting it).  Whether that is true depends on what the Library does\r\n\tand what the program that uses the Library does.\r\n\r\n\t  1. You may copy and distribute verbatim copies of the Library's\r\n\tcomplete source code as you receive it, in any medium, provided that\r\n\tyou conspicuously and appropriately publish on each copy an\r\n\tappropriate copyright notice and disclaimer of warranty; keep intact\r\n\tall the notices that refer to this License and to the absence of any\r\n\twarranty; and distribute a copy of this License along with the\r\n\tLibrary.\r\n\r\n\t  You may charge a fee for the physical act of transferring a copy,\r\n\tand you may at your option offer warranty protection in exchange for a\r\n\tfee.\r\n\r\n\t  2. You may modify your copy or copies of the Library or any portion\r\n\tof it, thus forming a work based on the Library, and copy and\r\n\tdistribute such modifications or work under the terms of Section 1\r\n\tabove, provided that you also meet all of these conditions:\r\n\r\n\t\ta) The modified work must itself be a software library.\r\n\r\n\t\tb) You must cause the files modified to carry prominent notices\r\n\t\tstating that you changed the files and the date of any change.\r\n\r\n\t\tc) You must cause the whole of the work to be licensed at no\r\n\t\tcharge to all third parties under the terms of this License.\r\n\r\n\t\td) If a facility in the modified Library refers to a function or a\r\n\t\ttable of data to be supplied by an application program that uses\r\n\t\tthe facility, other than as an argument passed when the facility\r\n\t\tis invoked, then you must make a good faith effort to ensure that,\r\n\t\tin the event an application does not supply such function or\r\n\t\ttable, the facility still operates, and performs whatever part of\r\n\t\tits purpose remains meaningful.\r\n\r\n\t\t(For example, a function in a library to compute square roots has\r\n\t\ta purpose that is entirely well-defined independent of the\r\n\t\tapplication.  Therefore, Subsection 2d requires that any\r\n\t\tapplication-supplied function or table used by this function must\r\n\t\tbe optional: if the application does not supply it, the square\r\n\t\troot function must still compute square roots.)\r\n\r\n\tThese requirements apply to the modified work as a whole.  If\r\n\tidentifiable sections of that work are not derived from the Library,\r\n\tand can be reasonably considered independent and separate works in\r\n\tthemselves, then this License, and its terms, do not apply to those\r\n\tsections when you distribute them as separate works.  But when you\r\n\tdistribute the same sections as part of a whole which is a work based\r\n\ton the Library, the distribution of the whole must be on the terms of\r\n\tthis License, whose permissions for other licensees extend to the\r\n\tentire whole, and thus to each and every part regardless of who wrote\r\n\tit.\r\n\r\n\tThus, it is not the intent of this section to claim rights or contest\r\n\tyour rights to work written entirely by you; rather, the intent is to\r\n\texercise the right to control the distribution of derivative or\r\n\tcollective works based on the Library.\r\n\r\n\tIn addition, mere aggregation of another work not based on the Library\r\n\twith the Library (or with a work based on the Library) on a volume of\r\n\ta storage or distribution medium does not bring the other work under\r\n\tthe scope of this License.\r\n\r\n\t  3. You may opt to apply the terms of the ordinary GNU General Public\r\n\tLicense instead of this License to a given copy of the Library.  To do\r\n\tthis, you must alter all the notices that refer to this License, so\r\n\tthat they refer to the ordinary GNU General Public License, version 2,\r\n\tinstead of to this License.  (If a newer version than version 2 of the\r\n\tordinary GNU General Public License has appeared, then you can specify\r\n\tthat version instead if you wish.)  Do not make any other change in\r\n\tthese notices.\r\n\r\n\t  Once this change is made in a given copy, it is irreversible for\r\n\tthat copy, so the ordinary GNU General Public License applies to all\r\n\tsubsequent copies and derivative works made from that copy.\r\n\r\n\t  This option is useful when you wish to copy part of the code of\r\n\tthe Library into a program that is not a library.\r\n\r\n\t  4. You may copy and distribute the Library (or a portion or\r\n\tderivative of it, under Section 2) in object code or executable form\r\n\tunder the terms of Sections 1 and 2 above provided that you accompany\r\n\tit with the complete corresponding machine-readable source code, which\r\n\tmust be distributed under the terms of Sections 1 and 2 above on a\r\n\tmedium customarily used for software interchange.\r\n\r\n\t  If distribution of object code is made by offering access to copy\r\n\tfrom a designated place, then offering equivalent access to copy the\r\n\tsource code from the same place satisfies the requirement to\r\n\tdistribute the source code, even though third parties are not\r\n\tcompelled to copy the source along with the object code.\r\n\r\n\t  5. A program that contains no derivative of any portion of the\r\n\tLibrary, but is designed to work with the Library by being compiled or\r\n\tlinked with it, is called a \"work that uses the Library\".  Such a\r\n\twork, in isolation, is not a derivative work of the Library, and\r\n\ttherefore falls outside the scope of this License.\r\n\r\n\t  However, linking a \"work that uses the Library\" with the Library\r\n\tcreates an executable that is a derivative of the Library (because it\r\n\tcontains portions of the Library), rather than a \"work that uses the\r\n\tlibrary\".  The executable is therefore covered by this License.\r\n\tSection 6 states terms for distribution of such executables.\r\n\r\n\t  When a \"work that uses the Library\" uses material from a header file\r\n\tthat is part of the Library, the object code for the work may be a\r\n\tderivative work of the Library even though the source code is not.\r\n\tWhether this is true is especially significant if the work can be\r\n\tlinked without the Library, or if the work is itself a library.  The\r\n\tthreshold for this to be true is not precisely defined by law.\r\n\r\n\t  If such an object file uses only numerical parameters, data\r\n\tstructure layouts and accessors, and small macros and small inline\r\n\tfunctions (ten lines or less in length), then the use of the object\r\n\tfile is unrestricted, regardless of whether it is legally a derivative\r\n\twork.  (Executables containing this object code plus portions of the\r\n\tLibrary will still fall under Section 6.)\r\n\r\n\t  Otherwise, if the work is a derivative of the Library, you may\r\n\tdistribute the object code for the work under the terms of Section 6.\r\n\tAny executables containing that work also fall under Section 6,\r\n\twhether or not they are linked directly with the Library itself.\r\n\r\n\t  6. As an exception to the Sections above, you may also combine or\r\n\tlink a \"work that uses the Library\" with the Library to produce a\r\n\twork containing portions of the Library, and distribute that work\r\n\tunder terms of your choice, provided that the terms permit\r\n\tmodification of the work for the customer's own use and reverse\r\n\tengineering for debugging such modifications.\r\n\r\n\t  You must give prominent notice with each copy of the work that the\r\n\tLibrary is used in it and that the Library and its use are covered by\r\n\tthis License.  You must supply a copy of this License.  If the work\r\n\tduring execution displays copyright notices, you must include the\r\n\tcopyright notice for the Library among them, as well as a reference\r\n\tdirecting the user to the copy of this License.  Also, you must do one\r\n\tof these things:\r\n\r\n\t\ta) Accompany the work with the complete corresponding\r\n\t\tmachine-readable source code for the Library including whatever\r\n\t\tchanges were used in the work (which must be distributed under\r\n\t\tSections 1 and 2 above); and, if the work is an executable linked\r\n\t\twith the Library, with the complete machine-readable \"work that\r\n\t\tuses the Library\", as object code and/or source code, so that the\r\n\t\tuser can modify the Library and then relink to produce a modified\r\n\t\texecutable containing the modified Library.  (It is understood\r\n\t\tthat the user who changes the contents of definitions files in the\r\n\t\tLibrary will not necessarily be able to recompile the application\r\n\t\tto use the modified definitions.)\r\n\r\n\t\tb) Use a suitable shared library mechanism for linking with the\r\n\t\tLibrary.  A suitable mechanism is one that (1) uses at run time a\r\n\t\tcopy of the library already present on the user's computer system,\r\n\t\trather than copying library functions into the executable, and (2)\r\n\t\twill operate properly with a modified version of the library, if\r\n\t\tthe user installs one, as long as the modified version is\r\n\t\tinterface-compatible with the version that the work was made with.\r\n\r\n\t\tc) Accompany the work with a written offer, valid for at\r\n\t\tleast three years, to give the same user the materials\r\n\t\tspecified in Subsection 6a, above, for a charge no more\r\n\t\tthan the cost of performing this distribution.\r\n\r\n\t\td) If distribution of the work is made by offering access to copy\r\n\t\tfrom a designated place, offer equivalent access to copy the above\r\n\t\tspecified materials from the same place.\r\n\r\n\t\te) Verify that the user has already received a copy of these\r\n\t\tmaterials or that you have already sent this user a copy.\r\n\r\n\t  For an executable, the required form of the \"work that uses the\r\n\tLibrary\" must include any data and utility programs needed for\r\n\treproducing the executable from it.  However, as a special exception,\r\n\tthe materials to be distributed need not include anything that is\r\n\tnormally distributed (in either source or binary form) with the major\r\n\tcomponents (compiler, kernel, and so on) of the operating system on\r\n\twhich the executable runs, unless that component itself accompanies\r\n\tthe executable.\r\n\r\n\t  It may happen that this requirement contradicts the license\r\n\trestrictions of other proprietary libraries that do not normally\r\n\taccompany the operating system.  Such a contradiction means you cannot\r\n\tuse both them and the Library together in an executable that you\r\n\tdistribute.\r\n\r\n\t  7. You may place library facilities that are a work based on the\r\n\tLibrary side-by-side in a single library together with other library\r\n\tfacilities not covered by this License, and distribute such a combined\r\n\tlibrary, provided that the separate distribution of the work based on\r\n\tthe Library and of the other library facilities is otherwise\r\n\tpermitted, and provided that you do these two things:\r\n\r\n\t\ta) Accompany the combined library with a copy of the same work\r\n\t\tbased on the Library, uncombined with any other library\r\n\t\tfacilities.  This must be distributed under the terms of the\r\n\t\tSections above.\r\n\r\n\t\tb) Give prominent notice with the combined library of the fact\r\n\t\tthat part of it is a work based on the Library, and explaining\r\n\t\twhere to find the accompanying uncombined form of the same work.\r\n\r\n\t  8. You may not copy, modify, sublicense, link with, or distribute\r\n\tthe Library except as expressly provided under this License.  Any\r\n\tattempt otherwise to copy, modify, sublicense, link with, or\r\n\tdistribute the Library is void, and will automatically terminate your\r\n\trights under this License.  However, parties who have received copies,\r\n\tor rights, from you under this License will not have their licenses\r\n\tterminated so long as such parties remain in full compliance.\r\n\r\n\t  9. You are not required to accept this License, since you have not\r\n\tsigned it.  However, nothing else grants you permission to modify or\r\n\tdistribute the Library or its derivative works.  These actions are\r\n\tprohibited by law if you do not accept this License.  Therefore, by\r\n\tmodifying or distributing the Library (or any work based on the\r\n\tLibrary), you indicate your acceptance of this License to do so, and\r\n\tall its terms and conditions for copying, distributing or modifying\r\n\tthe Library or works based on it.\r\n\r\n\t  10. Each time you redistribute the Library (or any work based on the\r\n\tLibrary), the recipient automatically receives a license from the\r\n\toriginal licensor to copy, distribute, link with or modify the Library\r\n\tsubject to these terms and conditions.  You may not impose any further\r\n\trestrictions on the recipients' exercise of the rights granted herein.\r\n\tYou are not responsible for enforcing compliance by third parties with\r\n\tthis License.\r\n\r\n\t  11. If, as a consequence of a court judgment or allegation of patent\r\n\tinfringement or for any other reason (not limited to patent issues),\r\n\tconditions are imposed on you (whether by court order, agreement or\r\n\totherwise) that contradict the conditions of this License, they do not\r\n\texcuse you from the conditions of this License.  If you cannot\r\n\tdistribute so as to satisfy simultaneously your obligations under this\r\n\tLicense and any other pertinent obligations, then as a consequence you\r\n\tmay not distribute the Library at all.  For example, if a patent\r\n\tlicense would not permit royalty-free redistribution of the Library by\r\n\tall those who receive copies directly or indirectly through you, then\r\n\tthe only way you could satisfy both it and this License would be to\r\n\trefrain entirely from distribution of the Library.\r\n\r\n\tIf any portion of this section is held invalid or unenforceable under any\r\n\tparticular circumstance, the balance of the section is intended to apply,\r\n\tand the section as a whole is intended to apply in other circumstances.\r\n\r\n\tIt is not the purpose of this section to induce you to infringe any\r\n\tpatents or other property right claims or to contest validity of any\r\n\tsuch claims; this section has the sole purpose of protecting the\r\n\tintegrity of the free software distribution system which is\r\n\timplemented by public license practices.  Many people have made\r\n\tgenerous contributions to the wide range of software distributed\r\n\tthrough that system in reliance on consistent application of that\r\n\tsystem; it is up to the author/donor to decide if he or she is willing\r\n\tto distribute software through any other system and a licensee cannot\r\n\timpose that choice.\r\n\r\n\tThis section is intended to make thoroughly clear what is believed to\r\n\tbe a consequence of the rest of this License.\r\n\r\n\t  12. If the distribution and/or use of the Library is restricted in\r\n\tcertain countries either by patents or by copyrighted interfaces, the\r\n\toriginal copyright holder who places the Library under this License may add\r\n\tan explicit geographical distribution limitation excluding those countries,\r\n\tso that distribution is permitted only in or among countries not thus\r\n\texcluded.  In such case, this License incorporates the limitation as if\r\n\twritten in the body of this License.\r\n\r\n\t  13. The Free Software Foundation may publish revised and/or new\r\n\tversions of the Lesser General Public License from time to time.\r\n\tSuch new versions will be similar in spirit to the present version,\r\n\tbut may differ in detail to address new problems or concerns.\r\n\r\n\tEach version is given a distinguishing version number.  If the Library\r\n\tspecifies a version number of this License which applies to it and\r\n\t\"any later version\", you have the option of following the terms and\r\n\tconditions either of that version or of any later version published by\r\n\tthe Free Software Foundation.  If the Library does not specify a\r\n\tlicense version number, you may choose any version ever published by\r\n\tthe Free Software Foundation.\r\n\r\n\t  14. If you wish to incorporate parts of the Library into other free\r\n\tprograms whose distribution conditions are incompatible with these,\r\n\twrite to the author to ask for permission.  For software which is\r\n\tcopyrighted by the Free Software Foundation, write to the Free\r\n\tSoftware Foundation; we sometimes make exceptions for this.  Our\r\n\tdecision will be guided by the two goals of preserving the free status\r\n\tof all derivatives of our free software and of promoting the sharing\r\n\tand reuse of software generally.\r\n\r\n\t\t\t\t\t\t\t\tNO WARRANTY\r\n\r\n\t  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\r\n\tWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\r\n\tEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\r\n\tOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\r\n\tKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\r\n\tIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r\n\tPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\r\n\tLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\r\n\tTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\r\n\r\n\t  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\r\n\tWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\r\n\tAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\r\n\tFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\r\n\tCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\r\n\tLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\r\n\tRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\r\n\tFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\r\n\tSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\r\n\tDAMAGES.\r\n\r\n\t\t\t\t\t\t END OF TERMS AND CONDITIONS\r\n\r\n\t\t\t   How to Apply These Terms to Your New Libraries\r\n\r\n\t  If you develop a new library, and you want it to be of the greatest\r\n\tpossible use to the public, we recommend making it free software that\r\n\teveryone can redistribute and change.  You can do so by permitting\r\n\tredistribution under these terms (or, alternatively, under the terms of the\r\n\tordinary General Public License).\r\n\r\n\t  To apply these terms, attach the following notices to the library.  It is\r\n\tsafest to attach them to the start of each source file to most effectively\r\n\tconvey the exclusion of warranty; and each file should have at least the\r\n\t\"copyright\" line and a pointer to where the full notice is found.\r\n\r\n\t\t<one line to give the library's name and a brief idea of what it does.>\r\n\t\tCopyright (C) <year>  <name of author>\r\n\r\n\t\tThis library is free software; you can redistribute it and/or\r\n\t\tmodify it under the terms of the GNU Lesser General Public\r\n\t\tLicense as published by the Free Software Foundation; either\r\n\t\tversion 2.1 of the License, or (at your option) any later version.\r\n\r\n\t\tThis library is distributed in the hope that it will be useful,\r\n\t\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\t\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n\t\tLesser General Public License for more details.\r\n\r\n\t\tYou should have received a copy of the GNU Lesser General Public\r\n\t\tLicense along with this library; if not, write to the Free Software\r\n\t\tFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n\r\n\tAlso add information on how to contact you by electronic and paper mail.\r\n\r\n\tYou should also get your employer (if you work as a programmer) or your\r\n\tschool, if any, to sign a \"copyright disclaimer\" for the library, if\r\n\tnecessary.  Here is a sample; alter the names:\r\n\r\n\t  Yoyodyne, Inc., hereby disclaims all copyright interest in the\r\n\t  library `Frob' (a library for tweaking knobs) written by James Random Hacker.\r\n\r\n\t  <signature of Ty Coon>, 1 April 1990\r\n\t  Ty Coon, President of Vice\r\n\r\n\tThat's all there is to it!\r\n\r\nGPL 2\r\n\t\t\t\t\t\tGNU GENERAL PUBLIC LICENSE\r\n\t\t\t\t\t\t   Version 2, June 1991\r\n\r\n\t Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\r\n\t 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\r\n\t Everyone is permitted to copy and distribute verbatim copies\r\n\t of this license document, but changing it is not allowed.\r\n\r\n\t\t\t\t\t\t\t\tPreamble\r\n\r\n\t  The licenses for most software are designed to take away your\r\n\tfreedom to share and change it.  By contrast, the GNU General Public\r\n\tLicense is intended to guarantee your freedom to share and change free\r\n\tsoftware--to make sure the software is free for all its users.  This\r\n\tGeneral Public License applies to most of the Free Software\r\n\tFoundation's software and to any other program whose authors commit to\r\n\tusing it.  (Some other Free Software Foundation software is covered by\r\n\tthe GNU Lesser General Public License instead.)  You can apply it to\r\n\tyour programs, too.\r\n\r\n\t  When we speak of free software, we are referring to freedom, not\r\n\tprice.  Our General Public Licenses are designed to make sure that you\r\n\thave the freedom to distribute copies of free software (and charge for\r\n\tthis service if you wish), that you receive source code or can get it\r\n\tif you want it, that you can change the software or use pieces of it\r\n\tin new free programs; and that you know you can do these things.\r\n\r\n\t  To protect your rights, we need to make restrictions that forbid\r\n\tanyone to deny you these rights or to ask you to surrender the rights.\r\n\tThese restrictions translate to certain responsibilities for you if you\r\n\tdistribute copies of the software, or if you modify it.\r\n\r\n\t  For example, if you distribute copies of such a program, whether\r\n\tgratis or for a fee, you must give the recipients all the rights that\r\n\tyou have.  You must make sure that they, too, receive or can get the\r\n\tsource code.  And you must show them these terms so they know their\r\n\trights.\r\n\r\n\t  We protect your rights with two steps: (1) copyright the software, and\r\n\t(2) offer you this license which gives you legal permission to copy,\r\n\tdistribute and/or modify the software.\r\n\r\n\t  Also, for each author's protection and ours, we want to make certain\r\n\tthat everyone understands that there is no warranty for this free\r\n\tsoftware.  If the software is modified by someone else and passed on, we\r\n\twant its recipients to know that what they have is not the original, so\r\n\tthat any problems introduced by others will not reflect on the original\r\n\tauthors' reputations.\r\n\r\n\t  Finally, any free program is threatened constantly by software\r\n\tpatents.  We wish to avoid the danger that redistributors of a free\r\n\tprogram will individually obtain patent licenses, in effect making the\r\n\tprogram proprietary.  To prevent this, we have made it clear that any\r\n\tpatent must be licensed for everyone's free use or not licensed at all.\r\n\r\n\t  The precise terms and conditions for copying, distribution and\r\n\tmodification follow.\r\n\r\n\t\t\t\t\t\tGNU GENERAL PUBLIC LICENSE\r\n\t   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\r\n\r\n\t  0. This License applies to any program or other work which contains\r\n\ta notice placed by the copyright holder saying it may be distributed\r\n\tunder the terms of this General Public License.  The \"Program\", below,\r\n\trefers to any such program or work, and a \"work based on the Program\"\r\n\tmeans either the Program or any derivative work under copyright law:\r\n\tthat is to say, a work containing the Program or a portion of it,\r\n\teither verbatim or with modifications and/or translated into another\r\n\tlanguage.  (Hereinafter, translation is included without limitation in\r\n\tthe term \"modification\".)  Each licensee is addressed as \"you\".\r\n\r\n\tActivities other than copying, distribution and modification are not\r\n\tcovered by this License; they are outside its scope.  The act of\r\n\trunning the Program is not restricted, and the output from the Program\r\n\tis covered only if its contents constitute a work based on the\r\n\tProgram (independent of having been made by running the Program).\r\n\tWhether that is true depends on what the Program does.\r\n\r\n\t  1. You may copy and distribute verbatim copies of the Program's\r\n\tsource code as you receive it, in any medium, provided that you\r\n\tconspicuously and appropriately publish on each copy an appropriate\r\n\tcopyright notice and disclaimer of warranty; keep intact all the\r\n\tnotices that refer to this License and to the absence of any warranty;\r\n\tand give any other recipients of the Program a copy of this License\r\n\talong with the Program.\r\n\r\n\tYou may charge a fee for the physical act of transferring a copy, and\r\n\tyou may at your option offer warranty protection in exchange for a fee.\r\n\r\n\t  2. You may modify your copy or copies of the Program or any portion\r\n\tof it, thus forming a work based on the Program, and copy and\r\n\tdistribute such modifications or work under the terms of Section 1\r\n\tabove, provided that you also meet all of these conditions:\r\n\r\n\t\ta) You must cause the modified files to carry prominent notices\r\n\t\tstating that you changed the files and the date of any change.\r\n\r\n\t\tb) You must cause any work that you distribute or publish, that in\r\n\t\twhole or in part contains or is derived from the Program or any\r\n\t\tpart thereof, to be licensed as a whole at no charge to all third\r\n\t\tparties under the terms of this License.\r\n\r\n\t\tc) If the modified program normally reads commands interactively\r\n\t\twhen run, you must cause it, when started running for such\r\n\t\tinteractive use in the most ordinary way, to print or display an\r\n\t\tannouncement including an appropriate copyright notice and a\r\n\t\tnotice that there is no warranty (or else, saying that you provide\r\n\t\ta warranty) and that users may redistribute the program under\r\n\t\tthese conditions, and telling the user how to view a copy of this\r\n\t\tLicense.  (Exception: if the Program itself is interactive but\r\n\t\tdoes not normally print such an announcement, your work based on\r\n\t\tthe Program is not required to print an announcement.)\r\n\r\n\tThese requirements apply to the modified work as a whole.  If\r\n\tidentifiable sections of that work are not derived from the Program,\r\n\tand can be reasonably considered independent and separate works in\r\n\tthemselves, then this License, and its terms, do not apply to those\r\n\tsections when you distribute them as separate works.  But when you\r\n\tdistribute the same sections as part of a whole which is a work based\r\n\ton the Program, the distribution of the whole must be on the terms of\r\n\tthis License, whose permissions for other licensees extend to the\r\n\tentire whole, and thus to each and every part regardless of who wrote it.\r\n\r\n\tThus, it is not the intent of this section to claim rights or contest\r\n\tyour rights to work written entirely by you; rather, the intent is to\r\n\texercise the right to control the distribution of derivative or\r\n\tcollective works based on the Program.\r\n\r\n\tIn addition, mere aggregation of another work not based on the Program\r\n\twith the Program (or with a work based on the Program) on a volume of\r\n\ta storage or distribution medium does not bring the other work under\r\n\tthe scope of this License.\r\n\r\n\t  3. You may copy and distribute the Program (or a work based on it,\r\n\tunder Section 2) in object code or executable form under the terms of\r\n\tSections 1 and 2 above provided that you also do one of the following:\r\n\r\n\t\ta) Accompany it with the complete corresponding machine-readable\r\n\t\tsource code, which must be distributed under the terms of Sections\r\n\t\t1 and 2 above on a medium customarily used for software interchange; or,\r\n\r\n\t\tb) Accompany it with a written offer, valid for at least three\r\n\t\tyears, to give any third party, for a charge no more than your\r\n\t\tcost of physically performing source distribution, a complete\r\n\t\tmachine-readable copy of the corresponding source code, to be\r\n\t\tdistributed under the terms of Sections 1 and 2 above on a medium\r\n\t\tcustomarily used for software interchange; or,\r\n\r\n\t\tc) Accompany it with the information you received as to the offer\r\n\t\tto distribute corresponding source code.  (This alternative is\r\n\t\tallowed only for noncommercial distribution and only if you\r\n\t\treceived the program in object code or executable form with such\r\n\t\tan offer, in accord with Subsection b above.)\r\n\r\n\tThe source code for a work means the preferred form of the work for\r\n\tmaking modifications to it.  For an executable work, complete source\r\n\tcode means all the source code for all modules it contains, plus any\r\n\tassociated interface definition files, plus the scripts used to\r\n\tcontrol compilation and installation of the executable.  However, as a\r\n\tspecial exception, the source code distributed need not include\r\n\tanything that is normally distributed (in either source or binary\r\n\tform) with the major components (compiler, kernel, and so on) of the\r\n\toperating system on which the executable runs, unless that component\r\n\titself accompanies the executable.\r\n\r\n\tIf distribution of executable or object code is made by offering\r\n\taccess to copy from a designated place, then offering equivalent\r\n\taccess to copy the source code from the same place counts as\r\n\tdistribution of the source code, even though third parties are not\r\n\tcompelled to copy the source along with the object code.\r\n\r\n\t  4. You may not copy, modify, sublicense, or distribute the Program\r\n\texcept as expressly provided under this License.  Any attempt\r\n\totherwise to copy, modify, sublicense or distribute the Program is\r\n\tvoid, and will automatically terminate your rights under this License.\r\n\tHowever, parties who have received copies, or rights, from you under\r\n\tthis License will not have their licenses terminated so long as such\r\n\tparties remain in full compliance.\r\n\r\n\t  5. You are not required to accept this License, since you have not\r\n\tsigned it.  However, nothing else grants you permission to modify or\r\n\tdistribute the Program or its derivative works.  These actions are\r\n\tprohibited by law if you do not accept this License.  Therefore, by\r\n\tmodifying or distributing the Program (or any work based on the\r\n\tProgram), you indicate your acceptance of this License to do so, and\r\n\tall its terms and conditions for copying, distributing or modifying\r\n\tthe Program or works based on it.\r\n\r\n\t  6. Each time you redistribute the Program (or any work based on the\r\n\tProgram), the recipient automatically receives a license from the\r\n\toriginal licensor to copy, distribute or modify the Program subject to\r\n\tthese terms and conditions.  You may not impose any further\r\n\trestrictions on the recipients' exercise of the rights granted herein.\r\n\tYou are not responsible for enforcing compliance by third parties to\r\n\tthis License.\r\n\r\n\t  7. If, as a consequence of a court judgment or allegation of patent\r\n\tinfringement or for any other reason (not limited to patent issues),\r\n\tconditions are imposed on you (whether by court order, agreement or\r\n\totherwise) that contradict the conditions of this License, they do not\r\n\texcuse you from the conditions of this License.  If you cannot\r\n\tdistribute so as to satisfy simultaneously your obligations under this\r\n\tLicense and any other pertinent obligations, then as a consequence you\r\n\tmay not distribute the Program at all.  For example, if a patent\r\n\tlicense would not permit royalty-free redistribution of the Program by\r\n\tall those who receive copies directly or indirectly through you, then\r\n\tthe only way you could satisfy both it and this License would be to\r\n\trefrain entirely from distribution of the Program.\r\n\r\n\tIf any portion of this section is held invalid or unenforceable under\r\n\tany particular circumstance, the balance of the section is intended to\r\n\tapply and the section as a whole is intended to apply in other\r\n\tcircumstances.\r\n\r\n\tIt is not the purpose of this section to induce you to infringe any\r\n\tpatents or other property right claims or to contest validity of any\r\n\tsuch claims; this section has the sole purpose of protecting the\r\n\tintegrity of the free software distribution system, which is\r\n\timplemented by public license practices.  Many people have made\r\n\tgenerous contributions to the wide range of software distributed\r\n\tthrough that system in reliance on consistent application of that\r\n\tsystem; it is up to the author/donor to decide if he or she is willing\r\n\tto distribute software through any other system and a licensee cannot\r\n\timpose that choice.\r\n\r\n\tThis section is intended to make thoroughly clear what is believed to\r\n\tbe a consequence of the rest of this License.\r\n\r\n\t  8. If the distribution and/or use of the Program is restricted in\r\n\tcertain countries either by patents or by copyrighted interfaces, the\r\n\toriginal copyright holder who places the Program under this License\r\n\tmay add an explicit geographical distribution limitation excluding\r\n\tthose countries, so that distribution is permitted only in or among\r\n\tcountries not thus excluded.  In such case, this License incorporates\r\n\tthe limitation as if written in the body of this License.\r\n\r\n\t  9. The Free Software Foundation may publish revised and/or new versions\r\n\tof the General Public License from time to time.  Such new versions will\r\n\tbe similar in spirit to the present version, but may differ in detail to\r\n\taddress new problems or concerns.\r\n\r\n\tEach version is given a distinguishing version number.  If the Program\r\n\tspecifies a version number of this License which applies to it and \"any\r\n\tlater version\", you have the option of following the terms and conditions\r\n\teither of that version or of any later version published by the Free\r\n\tSoftware Foundation.  If the Program does not specify a version number of\r\n\tthis License, you may choose any version ever published by the Free Software\r\n\tFoundation.\r\n\r\n\t  10. If you wish to incorporate parts of the Program into other free\r\n\tprograms whose distribution conditions are different, write to the author\r\n\tto ask for permission.  For software which is copyrighted by the Free\r\n\tSoftware Foundation, write to the Free Software Foundation; we sometimes\r\n\tmake exceptions for this.  Our decision will be guided by the two goals\r\n\tof preserving the free status of all derivatives of our free software and\r\n\tof promoting the sharing and reuse of software generally.\r\n\r\n\t\t\t\t\t\t\t\tNO WARRANTY\r\n\r\n\t  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\r\n\tFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\r\n\tOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\r\n\tPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\r\n\tOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r\n\tMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\r\n\tTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\r\n\tPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\r\n\tREPAIR OR CORRECTION.\r\n\r\n\t  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\r\n\tWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\r\n\tREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\r\n\tINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\r\n\tOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\r\n\tTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\r\n\tYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\r\n\tPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\r\n\tPOSSIBILITY OF SUCH DAMAGES.\r\n\r\n\t\t\t\t\t\t END OF TERMS AND CONDITIONS\r\n\r\n\t\t\t\tHow to Apply These Terms to Your New Programs\r\n\r\n\t  If you develop a new program, and you want it to be of the greatest\r\n\tpossible use to the public, the best way to achieve this is to make it\r\n\tfree software which everyone can redistribute and change under these terms.\r\n\r\n\t  To do so, attach the following notices to the program.  It is safest\r\n\tto attach them to the start of each source file to most effectively\r\n\tconvey the exclusion of warranty; and each file should have at least\r\n\tthe \"copyright\" line and a pointer to where the full notice is found.\r\n\r\n\t\t<one line to give the program's name and a brief idea of what it does.>\r\n\t\tCopyright (C) <year>  <name of author>\r\n\r\n\t\tThis program is free software; you can redistribute it and/or modify\r\n\t\tit under the terms of the GNU General Public License as published by\r\n\t\tthe Free Software Foundation; either version 2 of the License, or\r\n\t\t(at your option) any later version.\r\n\r\n\t\tThis program is distributed in the hope that it will be useful,\r\n\t\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\t\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\t\tGNU General Public License for more details.\r\n\r\n\t\tYou should have received a copy of the GNU General Public License along\r\n\t\twith this program; if not, write to the Free Software Foundation, Inc.,\r\n\t\t51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r\n\r\n\tAlso add information on how to contact you by electronic and paper mail.\r\n\r\n\tIf the program is interactive, make it output a short notice like this\r\n\twhen it starts in an interactive mode:\r\n\r\n\t\tGnomovision version 69, Copyright (C) year name of author\r\n\t\tGnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\r\n\t\tThis is free software, and you are welcome to redistribute it\r\n\t\tunder certain conditions; type `show c' for details.\r\n\r\n\tThe hypothetical commands `show w' and `show c' should show the appropriate\r\n\tparts of the General Public License.  Of course, the commands you use may\r\n\tbe called something other than `show w' and `show c'; they could even be\r\n\tmouse-clicks or menu items--whatever suits your program.\r\n\r\n\tYou should also get your employer (if you work as a programmer) or your\r\n\tschool, if any, to sign a \"copyright disclaimer\" for the program, if\r\n\tnecessary.  Here is a sample; alter the names:\r\n\r\n\t  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\r\n\t  `Gnomovision' (which makes passes at compilers) written by James Hacker.\r\n\r\n\t  <signature of Ty Coon>, 1 April 1989\r\n\t  Ty Coon, President of Vice\r\n\r\n\tThis General Public License does not permit incorporating your program into\r\n\tproprietary programs.  If your program is a subroutine library, you may\r\n\tconsider it more useful to permit linking proprietary applications with the\r\n\tlibrary.  If this is what you want to do, use the GNU Lesser General\r\n\tPublic License instead of this License.\r\n\r\nApache 2.0\r\n\tApache License\r\n\r\n\tVersion 2.0, January 2004\r\n\r\n\thttp://www.apache.org/licenses/\r\n\r\n\tTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\r\n\r\n\t1. Definitions.\r\n\r\n\t\"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\r\n\r\n\t\"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\r\n\r\n\t\"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\r\n\r\n\t\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\r\n\r\n\t\"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\r\n\r\n\t\"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\r\n\r\n\t\"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\r\n\r\n\t\"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\r\n\r\n\t\"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\r\n\r\n\t\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\r\n\r\n\t2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\r\n\r\n\t3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\r\n\r\n\t4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\r\n\r\n\t\tYou must give any other recipients of the Work or Derivative Works a copy of this License; and\r\n\t\tYou must cause any modified files to carry prominent notices stating that You changed the files; and\r\n\t\tYou must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\r\n\t\tIf the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\r\n\r\n\t\tYou may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\r\n\r\n\t5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\r\n\r\n\t6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\r\n\r\n\t7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\r\n\r\n\t8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\r\n\r\n\t9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.\r\n\r\n\tEND OF TERMS AND CONDITIONS\r\n\tAPPENDIX: How to apply the Apache License to your work\r\n\r\n\tTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\r\n\r\n\tCopyright [yyyy] [name of copyright owner]\r\n\r\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\r\n\tyou may not use this file except in compliance with the License.\r\n\tYou may obtain a copy of the License at\r\n\r\n\t\thttp://www.apache.org/licenses/LICENSE-2.0\r\n\r\n\tUnless required by applicable law or agreed to in writing, software\r\n\tdistributed under the License is distributed on an \"AS IS\" BASIS,\r\n\tWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n\tSee the License for the specific language governing permissions and\r\n\tlimitations under the License.\r\n"
  },
  {
    "path": "platform/unix/debian/changelog.in",
    "content": "@LOVE_EXE_NAME@ (@LOVE_VERSION_STR@ppa1) focal; urgency=medium\n\n  * Upstream testing release\n\n -- Bart van Strien <bart.bes@gmail.com>  @LOVE_CONFIGURE_TIMESTAMP@\n"
  },
  {
    "path": "platform/unix/debian/compat",
    "content": "9\n"
  },
  {
    "path": "platform/unix/debian/control.in",
    "content": "Source: @LOVE_EXE_NAME@\nSection: games\nPriority: extra\nMaintainer: Bart van Strien <bart.bes@gmail.com>\nBuild-Depends: debhelper (>= 9),\n               cmake,\n               g++ (>= 4.7.0),\n               libfreetype6-dev,\n               libharfbuzz-dev,\n               luajit,\n               libluajit-5.1-dev,\n               libmodplug-dev,\n               libopenal-dev,\n               libphysfs-dev,\n               libsdl2-dev (>= 2.0.9),\n               libogg-dev,\n               libvorbis-dev,\n               libtheora-dev,\n               zlib1g-dev\nStandards-Version: 3.9.5\nHomepage: http://love2d.org\n\nPackage: @LOVE_LIB_NAME@0\nSection: libs\nArchitecture: any\nMulti-Arch: same\nPre-Depends: ${misc:Pre-Depends}\nDepends: ${misc:Depends},\n         ${shlibs:Depends}\nDescription: 2D game engine - runtime\n LOVE is a free 2D game engine which enables easy game creation in Lua.\n\nPackage: @LOVE_EXE_NAME@\nArchitecture: any\nDepends: ${misc:Depends},\n         ${shlibs:Depends},\n         @LOVE_LIB_NAME@0 (= ${binary:Version})\nDescription: 2D game engine\n LOVE is a free 2D game engine which enables easy game creation in Lua.\n\nPackage: @LOVE_LIB_NAME@-dbg\nPriority: extra\nSection: debug\nArchitecture: any\nMulti-Arch: same\nDepends: ${misc:Depends},\n         @LOVE_LIB_NAME@0 (= ${binary:Version})\nDescription: 2D game engine - debug symbols\n LOVE is a free 2D game engine which enables easy game creation in Lua.\n"
  },
  {
    "path": "platform/unix/debian/copyright",
    "content": "Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/\r\nUpstream-Name: LÖVE\r\nUpstream-Contact: Bart van Strien <bart.bes@gmail.com>\r\nSource: http://www.love2d.org/\r\n\r\nFiles: *\r\nCopyright: 2006-2026 LOVE Development Team\r\nLicense: zlib\r\n This software is provided 'as-is', without any express or implied\r\n warranty. In no event will the authors be held liable for any damages\r\n arising from the use of this software.\r\n .\r\n Permission is granted to anyone to use this software for any purpose,\r\n including commercial applications, and to alter it and redistribute it\r\n freely, subject to the following restrictions:\r\n .\r\n 1. The origin of this software must not be misrepresented; you must not\r\n claim that you wrote the original software. If you use this software\r\n in a product, an acknowledgment in the product documentation would be\r\n appreciated but is not required.\r\n .\r\n 2. Altered source versions must be plainly marked as such, and must not be\r\n misrepresented as being the original software.\r\n .\r\n 3. This notice may not be removed or altered from any source\r\n distribution.\r\n\r\n"
  },
  {
    "path": "platform/unix/debian/docs",
    "content": "changes.txt\nlicense.txt\n"
  },
  {
    "path": "platform/unix/debian/liblove-unstable0.docs",
    "content": "readme.md\n"
  },
  {
    "path": "platform/unix/debian/liblove-unstable0.install",
    "content": "usr/lib/*/liblove-unstable-*.so\n"
  },
  {
    "path": "platform/unix/debian/liblove0.docs",
    "content": "readme.md\n"
  },
  {
    "path": "platform/unix/debian/liblove0.install",
    "content": "usr/lib/*/liblove-*.so\n"
  },
  {
    "path": "platform/unix/debian/love-unstable.install",
    "content": "usr/bin/love-unstable\n"
  },
  {
    "path": "platform/unix/debian/love-unstable.manpages",
    "content": "platform/unix/love-unstable.6\n"
  },
  {
    "path": "platform/unix/debian/love.install",
    "content": "usr/bin\nusr/share/applications\nusr/share/mime\nusr/share/pixmaps\nusr/share/icons\n"
  },
  {
    "path": "platform/unix/debian/love.manpages",
    "content": "platform/unix/love.6\n"
  },
  {
    "path": "platform/unix/debian/rules.in",
    "content": "#!/usr/bin/make -f\n\n%:\n\tdh $@ --parallel\n\noverride_dh_auto_clean:\n\tdh_auto_clean\n\trm -f platform/unix/love-unstable.6\n\noverride_dh_installdocs:\n\tdh_installdocs --link-doc=@LOVE_LIB_NAME@0\n\noverride_dh_installchangelogs:\n\tdh_installchangelogs changes.txt\n\noverride_dh_installman:\n\tcp -f platform/unix/love.6 platform/unix/love-unstable.6\n\tdh_installman\n\noverride_dh_strip:\n\tdh_strip -p@LOVE_LIB_NAME@0 --dbg-package=@LOVE_LIB_NAME@-dbg\n\tdh_strip --remaining-packages\n\n"
  },
  {
    "path": "platform/unix/debian/source/format",
    "content": "3.0 (native)\n"
  },
  {
    "path": "platform/unix/love.6",
    "content": ".\\\" (c) 2008-2011 Miriam Ruiz <little_miry@yahoo.es>\n.\\\" (c) 2013-2018 Bart van Strien <bart.bes@gmail.com>\n.\\\"\n.\\\" This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damagesarising from the use of this software.\n.\\\"\n.\\\" Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:\n.\\\"\n.\\\" 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.\n.\\\"\n.\\\" 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n.\\\"\n.\\\" 3. This notice may not be removed or altered from any source distribution.\n.Dd March 31, 2018\n.Dt LOVE 6\n.Os LÖVE 12.0\n.Sh NAME\n.Nm love\n.Nd 2D game development framework\n.Sh SYNOPSIS\n.Nm love\n.Op Fl Fl fused\n.Ar game Ns .love\n.Pp\n.Nm love\n.Fl Fl version\n.Sh DESCRIPTION\nLÖVE was created to be a user-friendly engine in which simple (or complicated) games could be made without having extensive knowledge of system or graphics functions and without having to dedicate time towards developing the same engine features time and time again.\n.Pp\nDeveloped with cross-platform implementation in mind, it utilizes the latest open source libraries to deliver a similar game experience, independent of operating system.\nBy relying on the Lua scripting language for game-specific programming, it allows even the novice game creator to quickly and efficiently develop an idea into a fully working game.\n.Sh SEE ALSO\nYou can find more information at\n.Lk http://love2d.org/\n"
  },
  {
    "path": "platform/unix/love.desktop.in",
    "content": "[Desktop Entry]\nName=LÖVE\nComment=The unquestionably awesome 2D game engine\nMimeType=application/x-love-game;\nExec=@CMAKE_INSTALL_FULL_BINDIR@/love %f\nType=Application\nCategories=Development;Game;\nTerminal=false\nIcon=love\nNoDisplay=true\n"
  },
  {
    "path": "platform/unix/love.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<mime-info xmlns=\"http://www.freedesktop.org/standards/shared-mime-info\">\n\t<mime-type type=\"application/x-love-game\">\n\t\t<comment>LÖVE game</comment>\n\t<glob pattern=\"*.love\"/>\n\t</mime-type>\n</mime-info>\n"
  },
  {
    "path": "platform/xcode/Images.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "platform/xcode/Images.xcassets/OS X AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"size\" : \"16x16\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"16.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"16x16\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"32.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"32x32\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"32.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"32x32\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"64.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"128x128\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"128.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"128x128\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"256.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"256x256\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"256.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"256x256\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"512.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"512x512\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"512.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"512x512\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"1024.png\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "platform/xcode/Images.xcassets/iOS AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"icon-29pt@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"icon-29pt@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"icon-40pt@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"icon-40pt@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"icon-60pt@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"icon-60pt@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"icon-29pt@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"icon-29pt@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"icon-40pt@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"icon-40pt@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"icon-76pt@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"icon-76pt@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"83.5x83.5\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"icon-83.5pt@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"1024x1024\",\n      \"idiom\" : \"ios-marketing\",\n      \"filename\" : \"icon-1024pt@1x.png\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "platform/xcode/ios/Launch Screen.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"9531\" systemVersion=\"15C50\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"9529\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view contentMode=\"scaleToFill\" id=\"iN0-l3-epB\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"480\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n            <nil key=\"simulatedStatusBarMetrics\"/>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <point key=\"canvasLocation\" x=\"404\" y=\"445\"/>\n        </view>\n    </objects>\n</document>\n"
  },
  {
    "path": "platform/xcode/ios/love-ios.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundleDocumentTypes</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CFBundleTypeIconFiles</key>\n\t\t\t<array>\n\t\t\t\t<string>LoveDocument.icns</string>\n\t\t\t</array>\n\t\t\t<key>CFBundleTypeName</key>\n\t\t\t<string>LÖVE Project</string>\n\t\t\t<key>CFBundleTypeRole</key>\n\t\t\t<string>Viewer</string>\n\t\t\t<key>LSHandlerRank</key>\n\t\t\t<string>Owner</string>\n\t\t\t<key>LSItemContentTypes</key>\n\t\t\t<array>\n\t\t\t\t<string>org.love2d.love-game</string>\n\t\t\t</array>\n\t\t</dict>\n\t</array>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(MARKETING_VERSION)</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>LSSupportsOpeningDocumentsInPlace</key>\n\t<false/>\n\t<key>UIFileSharingEnabled</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>Launch Screen</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>opengles-2</string>\n\t</array>\n\t<key>UIStatusBarStyle</key>\n\t<string>UIStatusBarStyleLightContent</string>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UTExportedTypeDeclarations</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>UTTypeConformsTo</key>\n\t\t\t<array>\n\t\t\t\t<string>com.pkware.zip-archive</string>\n\t\t\t</array>\n\t\t\t<key>UTTypeDescription</key>\n\t\t\t<string>LÖVE Project</string>\n\t\t\t<key>UTTypeIdentifier</key>\n\t\t\t<string>org.love2d.love-game</string>\n\t\t\t<key>UTTypeSize320IconFile</key>\n\t\t\t<string>LoveDocument</string>\n\t\t\t<key>UTTypeSize64IconFile</key>\n\t\t\t<string>LoveDocument</string>\n\t\t\t<key>UTTypeTagSpecification</key>\n\t\t\t<dict>\n\t\t\t\t<key>com.apple.ostype</key>\n\t\t\t\t<string>LOVE</string>\n\t\t\t\t<key>public.filename-extension</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>love</string>\n\t\t\t\t</array>\n\t\t\t\t<key>public.mime-type</key>\n\t\t\t\t<string>application/x-love-game</string>\n\t\t\t</dict>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "platform/xcode/liblove.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 52;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t217DFBD91D9F6D490055D849 /* auxiliar.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFB9D1D9F6D490055D849 /* auxiliar.c */; };\n\t\t217DFBDA1D9F6D490055D849 /* auxiliar.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFB9E1D9F6D490055D849 /* auxiliar.h */; };\n\t\t217DFBDB1D9F6D490055D849 /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFB9F1D9F6D490055D849 /* buffer.c */; };\n\t\t217DFBDC1D9F6D490055D849 /* buffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBA01D9F6D490055D849 /* buffer.h */; };\n\t\t217DFBDD1D9F6D490055D849 /* compat.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBA11D9F6D490055D849 /* compat.c */; };\n\t\t217DFBDE1D9F6D490055D849 /* compat.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBA21D9F6D490055D849 /* compat.h */; };\n\t\t217DFBDF1D9F6D490055D849 /* except.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBA31D9F6D490055D849 /* except.c */; };\n\t\t217DFBE01D9F6D490055D849 /* except.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBA41D9F6D490055D849 /* except.h */; };\n\t\t217DFBE21D9F6D490055D849 /* ftp.lua.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBA61D9F6D490055D849 /* ftp.lua.h */; };\n\t\t217DFBE41D9F6D490055D849 /* headers.lua.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBA81D9F6D490055D849 /* headers.lua.h */; };\n\t\t217DFBE61D9F6D490055D849 /* http.lua.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBAA1D9F6D490055D849 /* http.lua.h */; };\n\t\t217DFBE71D9F6D490055D849 /* inet.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBAB1D9F6D490055D849 /* inet.c */; };\n\t\t217DFBE81D9F6D490055D849 /* inet.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBAC1D9F6D490055D849 /* inet.h */; };\n\t\t217DFBE91D9F6D490055D849 /* io.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBAD1D9F6D490055D849 /* io.c */; };\n\t\t217DFBEA1D9F6D490055D849 /* io.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBAE1D9F6D490055D849 /* io.h */; };\n\t\t217DFBEC1D9F6D490055D849 /* ltn12.lua.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBB01D9F6D490055D849 /* ltn12.lua.h */; };\n\t\t217DFBED1D9F6D490055D849 /* luasocket.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBB11D9F6D490055D849 /* luasocket.c */; };\n\t\t217DFBEE1D9F6D490055D849 /* luasocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBB21D9F6D490055D849 /* luasocket.h */; };\n\t\t217DFBF11D9F6D490055D849 /* mbox.lua.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBB51D9F6D490055D849 /* mbox.lua.h */; };\n\t\t217DFBF21D9F6D490055D849 /* mime.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBB61D9F6D490055D849 /* mime.c */; };\n\t\t217DFBF31D9F6D490055D849 /* mime.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBB71D9F6D490055D849 /* mime.h */; };\n\t\t217DFBF51D9F6D490055D849 /* mime.lua.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBB91D9F6D490055D849 /* mime.lua.h */; };\n\t\t217DFBF61D9F6D490055D849 /* options.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBBA1D9F6D490055D849 /* options.c */; };\n\t\t217DFBF71D9F6D490055D849 /* options.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBBB1D9F6D490055D849 /* options.h */; };\n\t\t217DFBF81D9F6D490055D849 /* pierror.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBBC1D9F6D490055D849 /* pierror.h */; };\n\t\t217DFBF91D9F6D490055D849 /* select.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBBD1D9F6D490055D849 /* select.c */; };\n\t\t217DFBFA1D9F6D490055D849 /* select.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBBE1D9F6D490055D849 /* select.h */; };\n\t\t217DFBFB1D9F6D490055D849 /* serial.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBBF1D9F6D490055D849 /* serial.c */; };\n\t\t217DFBFD1D9F6D490055D849 /* smtp.lua.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBC11D9F6D490055D849 /* smtp.lua.h */; };\n\t\t217DFBFE1D9F6D490055D849 /* socket.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBC21D9F6D490055D849 /* socket.h */; };\n\t\t217DFC001D9F6D490055D849 /* socket.lua.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBC41D9F6D490055D849 /* socket.lua.h */; };\n\t\t217DFC011D9F6D490055D849 /* tcp.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBC51D9F6D490055D849 /* tcp.c */; };\n\t\t217DFC021D9F6D490055D849 /* tcp.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBC61D9F6D490055D849 /* tcp.h */; };\n\t\t217DFC031D9F6D490055D849 /* timeout.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBC71D9F6D490055D849 /* timeout.c */; };\n\t\t217DFC041D9F6D490055D849 /* timeout.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBC81D9F6D490055D849 /* timeout.h */; };\n\t\t217DFC061D9F6D490055D849 /* tp.lua.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBCA1D9F6D490055D849 /* tp.lua.h */; };\n\t\t217DFC071D9F6D490055D849 /* udp.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBCB1D9F6D490055D849 /* udp.c */; };\n\t\t217DFC081D9F6D490055D849 /* udp.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBCC1D9F6D490055D849 /* udp.h */; };\n\t\t217DFC091D9F6D490055D849 /* unix.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBCD1D9F6D490055D849 /* unix.c */; };\n\t\t217DFC0A1D9F6D490055D849 /* unix.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBCE1D9F6D490055D849 /* unix.h */; };\n\t\t217DFC101D9F6D490055D849 /* url.lua.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBD41D9F6D490055D849 /* url.lua.h */; };\n\t\t217DFC111D9F6D490055D849 /* usocket.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBD51D9F6D490055D849 /* usocket.c */; };\n\t\t217DFC121D9F6D490055D849 /* usocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 217DFBD61D9F6D490055D849 /* usocket.h */; };\n\t\tD91C76122DE3D088001FC408 /* spvUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = D91C76112DE3D088001FC408 /* spvUtil.h */; };\n\t\tD91C76132DE3D088001FC408 /* spirv.hpp11 in Resources */ = {isa = PBXBuildFile; fileRef = D91C76102DE3D088001FC408 /* spirv.hpp11 */; };\n\t\tD91C76152DE3D0A2001FC408 /* visibility.h in Headers */ = {isa = PBXBuildFile; fileRef = D91C76142DE3D0A2001FC408 /* visibility.h */; };\n\t\tD923E7D3296B85B9002FF1B3 /* harfbuzz.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = D923E7D2296B85B9002FF1B3 /* harfbuzz.xcframework */; };\n\t\tD93660F82D1C727C00C0EC4B /* Touch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D93660F72D1C727C00C0EC4B /* Touch.cpp */; };\n\t\tD93660F92D1C727C00C0EC4B /* Touch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D93660F72D1C727C00C0EC4B /* Touch.cpp */; };\n\t\tD943E58E2A24D56000D80361 /* PhysfsIo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D943E58C2A24D56000D80361 /* PhysfsIo.cpp */; };\n\t\tD943E58F2A24D56000D80361 /* PhysfsIo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D943E58C2A24D56000D80361 /* PhysfsIo.cpp */; };\n\t\tD943E5902A24D56000D80361 /* PhysfsIo.h in Headers */ = {isa = PBXBuildFile; fileRef = D943E58D2A24D56000D80361 /* PhysfsIo.h */; };\n\t\tD9596F612CBAC93800BE58C1 /* SDL3.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = D9596F602CBAC93800BE58C1 /* SDL3.xcframework */; };\n\t\tD9596F622CBAC93800BE58C1 /* SDL3.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = D9596F602CBAC93800BE58C1 /* SDL3.xcframework */; };\n\t\tD9DAB9222961F0EE00C64820 /* HarfbuzzShaper.h in Headers */ = {isa = PBXBuildFile; fileRef = D9DAB9202961F0EE00C64820 /* HarfbuzzShaper.h */; };\n\t\tD9DAB9232961F0EE00C64820 /* HarfbuzzShaper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D9DAB9212961F0EE00C64820 /* HarfbuzzShaper.cpp */; };\n\t\tD9DAB9242961F0EE00C64820 /* HarfbuzzShaper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D9DAB9212961F0EE00C64820 /* HarfbuzzShaper.cpp */; };\n\t\tD9DAB9292961F10000C64820 /* GenericShaper.h in Headers */ = {isa = PBXBuildFile; fileRef = D9DAB9252961F0FF00C64820 /* GenericShaper.h */; };\n\t\tD9DAB92A2961F10000C64820 /* GenericShaper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D9DAB9262961F0FF00C64820 /* GenericShaper.cpp */; };\n\t\tD9DAB92B2961F10000C64820 /* GenericShaper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D9DAB9262961F0FF00C64820 /* GenericShaper.cpp */; };\n\t\tD9DAB92C2961F10000C64820 /* TextShaper.h in Headers */ = {isa = PBXBuildFile; fileRef = D9DAB9272961F0FF00C64820 /* TextShaper.h */; };\n\t\tD9DAB92D2961F10000C64820 /* TextShaper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D9DAB9282961F10000C64820 /* TextShaper.cpp */; };\n\t\tD9DAB92E2961F10000C64820 /* TextShaper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D9DAB9282961F10000C64820 /* TextShaper.cpp */; };\n\t\tD9DAB9322963CD7500C64820 /* harfbuzz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D9DAB9312963CD7500C64820 /* harfbuzz.framework */; };\n\t\tD9DB6E272B4B40660037A1F6 /* ResourceLimits.h in Headers */ = {isa = PBXBuildFile; fileRef = D9DB6E252B4B40660037A1F6 /* ResourceLimits.h */; };\n\t\tD9DB6E292B4B40970037A1F6 /* span.h in Headers */ = {isa = PBXBuildFile; fileRef = D9DB6E282B4B40970037A1F6 /* span.h */; };\n\t\tD9DB6E362B4B41100037A1F6 /* ResourceLimits.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D9DB6E332B4B41100037A1F6 /* ResourceLimits.cpp */; };\n\t\tD9DB6E372B4B41100037A1F6 /* ResourceLimits.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D9DB6E332B4B41100037A1F6 /* ResourceLimits.cpp */; };\n\t\tD9DB6E3E2B4B41580037A1F6 /* NonSemanticDebugPrintf.h in Headers */ = {isa = PBXBuildFile; fileRef = D9DB6E382B4B41570037A1F6 /* NonSemanticDebugPrintf.h */; };\n\t\tD9DB6E3F2B4B41580037A1F6 /* NonSemanticShaderDebugInfo100.h in Headers */ = {isa = PBXBuildFile; fileRef = D9DB6E392B4B41570037A1F6 /* NonSemanticShaderDebugInfo100.h */; };\n\t\tD9DB6E402B4B41580037A1F6 /* GLSL.ext.ARM.h in Headers */ = {isa = PBXBuildFile; fileRef = D9DB6E3A2B4B41570037A1F6 /* GLSL.ext.ARM.h */; };\n\t\tD9DB6E412B4B41580037A1F6 /* GLSL.ext.QCOM.h in Headers */ = {isa = PBXBuildFile; fileRef = D9DB6E3B2B4B41580037A1F6 /* GLSL.ext.QCOM.h */; };\n\t\tD9DB6E452B4B80E80037A1F6 /* build_info.h in Headers */ = {isa = PBXBuildFile; fileRef = D9DB6E442B4B80E80037A1F6 /* build_info.h */; };\n\t\tD9F0C2CC2C68091200BB2D25 /* LibraryLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = D9F0C2CB2C68091200BB2D25 /* LibraryLoader.h */; };\n\t\tD9F0C2D42C680A5500BB2D25 /* CurlClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D9F0C2CD2C680A5500BB2D25 /* CurlClient.cpp */; };\n\t\tD9F0C2D52C680A5500BB2D25 /* CurlClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D9F0C2CD2C680A5500BB2D25 /* CurlClient.cpp */; };\n\t\tD9F0C2D62C680A5500BB2D25 /* CurlClient.h in Headers */ = {isa = PBXBuildFile; fileRef = D9F0C2CE2C680A5500BB2D25 /* CurlClient.h */; };\n\t\tD9F0C2D72C680A5500BB2D25 /* LinktimeLibraryLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D9F0C2CF2C680A5500BB2D25 /* LinktimeLibraryLoader.cpp */; };\n\t\tD9F0C2D82C680A5500BB2D25 /* LinktimeLibraryLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D9F0C2CF2C680A5500BB2D25 /* LinktimeLibraryLoader.cpp */; };\n\t\tD9F0C2D92C680A5500BB2D25 /* OpenSSLConnection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D9F0C2D02C680A5500BB2D25 /* OpenSSLConnection.cpp */; };\n\t\tD9F0C2DA2C680A5500BB2D25 /* OpenSSLConnection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D9F0C2D02C680A5500BB2D25 /* OpenSSLConnection.cpp */; };\n\t\tD9F0C2DB2C680A5500BB2D25 /* OpenSSLConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = D9F0C2D12C680A5500BB2D25 /* OpenSSLConnection.h */; };\n\t\tD9F0C2DC2C680A5500BB2D25 /* UnixLibraryLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D9F0C2D22C680A5500BB2D25 /* UnixLibraryLoader.cpp */; };\n\t\tD9F0C2DD2C680A5500BB2D25 /* UnixLibraryLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D9F0C2D22C680A5500BB2D25 /* UnixLibraryLoader.cpp */; };\n\t\tFA0A3A5F23366CE9001C269E /* floattypes.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0A3A5D23366CE9001C269E /* floattypes.h */; };\n\t\tFA0A3A6023366CE9001C269E /* floattypes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0A3A5E23366CE9001C269E /* floattypes.cpp */; };\n\t\tFA0A3A6123366CE9001C269E /* floattypes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0A3A5E23366CE9001C269E /* floattypes.cpp */; };\n\t\tFA0B791B1A958E3B000E1D17 /* b64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B78F71A958E3B000E1D17 /* b64.cpp */; };\n\t\tFA0B791C1A958E3B000E1D17 /* b64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B78F71A958E3B000E1D17 /* b64.cpp */; };\n\t\tFA0B791D1A958E3B000E1D17 /* b64.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B78F81A958E3B000E1D17 /* b64.h */; };\n\t\tFA0B791E1A958E3B000E1D17 /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B78F91A958E3B000E1D17 /* config.h */; };\n\t\tFA0B791F1A958E3B000E1D17 /* Data.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B78FA1A958E3B000E1D17 /* Data.h */; };\n\t\tFA0B79201A958E3B000E1D17 /* delay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B78FB1A958E3B000E1D17 /* delay.cpp */; };\n\t\tFA0B79211A958E3B000E1D17 /* delay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B78FB1A958E3B000E1D17 /* delay.cpp */; };\n\t\tFA0B79221A958E3B000E1D17 /* delay.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B78FC1A958E3B000E1D17 /* delay.h */; };\n\t\tFA0B79231A958E3B000E1D17 /* EnumMap.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B78FD1A958E3B000E1D17 /* EnumMap.h */; };\n\t\tFA0B79241A958E3B000E1D17 /* Exception.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B78FE1A958E3B000E1D17 /* Exception.cpp */; };\n\t\tFA0B79251A958E3B000E1D17 /* Exception.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B78FE1A958E3B000E1D17 /* Exception.cpp */; };\n\t\tFA0B79261A958E3B000E1D17 /* Exception.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B78FF1A958E3B000E1D17 /* Exception.h */; };\n\t\tFA0B79271A958E3B000E1D17 /* int.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79001A958E3B000E1D17 /* int.h */; };\n\t\tFA0B79281A958E3B000E1D17 /* math.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79011A958E3B000E1D17 /* math.h */; };\n\t\tFA0B79291A958E3B000E1D17 /* Matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79021A958E3B000E1D17 /* Matrix.cpp */; };\n\t\tFA0B792A1A958E3B000E1D17 /* Matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79021A958E3B000E1D17 /* Matrix.cpp */; };\n\t\tFA0B792B1A958E3B000E1D17 /* Matrix.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79031A958E3B000E1D17 /* Matrix.h */; };\n\t\tFA0B792F1A958E3B000E1D17 /* Module.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79061A958E3B000E1D17 /* Module.cpp */; };\n\t\tFA0B79301A958E3B000E1D17 /* Module.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79061A958E3B000E1D17 /* Module.cpp */; };\n\t\tFA0B79311A958E3B000E1D17 /* Module.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79071A958E3B000E1D17 /* Module.h */; };\n\t\tFA0B79321A958E3B000E1D17 /* Object.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79081A958E3B000E1D17 /* Object.cpp */; };\n\t\tFA0B79331A958E3B000E1D17 /* Object.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79081A958E3B000E1D17 /* Object.cpp */; };\n\t\tFA0B79341A958E3B000E1D17 /* Object.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79091A958E3B000E1D17 /* Object.h */; };\n\t\tFA0B79381A958E3B000E1D17 /* Reference.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B790C1A958E3B000E1D17 /* Reference.cpp */; };\n\t\tFA0B79391A958E3B000E1D17 /* Reference.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B790C1A958E3B000E1D17 /* Reference.cpp */; };\n\t\tFA0B793A1A958E3B000E1D17 /* Reference.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B790D1A958E3B000E1D17 /* Reference.h */; };\n\t\tFA0B793B1A958E3B000E1D17 /* runtime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B790E1A958E3B000E1D17 /* runtime.cpp */; };\n\t\tFA0B793C1A958E3B000E1D17 /* runtime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B790E1A958E3B000E1D17 /* runtime.cpp */; };\n\t\tFA0B793D1A958E3B000E1D17 /* runtime.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B790F1A958E3B000E1D17 /* runtime.h */; };\n\t\tFA0B793E1A958E3B000E1D17 /* StringMap.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79101A958E3B000E1D17 /* StringMap.h */; };\n\t\tFA0B793F1A958E3B000E1D17 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79111A958E3B000E1D17 /* types.h */; };\n\t\tFA0B79401A958E3B000E1D17 /* utf8.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79121A958E3B000E1D17 /* utf8.cpp */; };\n\t\tFA0B79411A958E3B000E1D17 /* utf8.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79121A958E3B000E1D17 /* utf8.cpp */; };\n\t\tFA0B79421A958E3B000E1D17 /* utf8.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79131A958E3B000E1D17 /* utf8.h */; };\n\t\tFA0B79431A958E3B000E1D17 /* Variant.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79141A958E3B000E1D17 /* Variant.cpp */; };\n\t\tFA0B79441A958E3B000E1D17 /* Variant.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79141A958E3B000E1D17 /* Variant.cpp */; };\n\t\tFA0B79451A958E3B000E1D17 /* Variant.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79151A958E3B000E1D17 /* Variant.h */; };\n\t\tFA0B79461A958E3B000E1D17 /* Vector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79161A958E3B000E1D17 /* Vector.cpp */; };\n\t\tFA0B79471A958E3B000E1D17 /* Vector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79161A958E3B000E1D17 /* Vector.cpp */; };\n\t\tFA0B79481A958E3B000E1D17 /* Vector.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79171A958E3B000E1D17 /* Vector.h */; };\n\t\tFA0B79491A958E3B000E1D17 /* version.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79181A958E3B000E1D17 /* version.h */; };\n\t\tFA0B7AB41A958EA3000E1D17 /* ddsinfo.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79B51A958EA3000E1D17 /* ddsinfo.h */; };\n\t\tFA0B7AB51A958EA3000E1D17 /* ddsparse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79B61A958EA3000E1D17 /* ddsparse.cpp */; };\n\t\tFA0B7AB61A958EA3000E1D17 /* ddsparse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79B61A958EA3000E1D17 /* ddsparse.cpp */; };\n\t\tFA0B7AB71A958EA3000E1D17 /* ddsparse.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79B71A958EA3000E1D17 /* ddsparse.h */; };\n\t\tFA0B7AB81A958EA3000E1D17 /* enet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79B91A958EA3000E1D17 /* enet.cpp */; };\n\t\tFA0B7AB91A958EA3000E1D17 /* enet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79B91A958EA3000E1D17 /* enet.cpp */; };\n\t\tFA0B7ABA1A958EA3000E1D17 /* callbacks.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79BB1A958EA3000E1D17 /* callbacks.c */; };\n\t\tFA0B7ABB1A958EA3000E1D17 /* callbacks.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79BB1A958EA3000E1D17 /* callbacks.c */; };\n\t\tFA0B7ABD1A958EA3000E1D17 /* compress.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79BD1A958EA3000E1D17 /* compress.c */; };\n\t\tFA0B7ABE1A958EA3000E1D17 /* compress.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79BD1A958EA3000E1D17 /* compress.c */; };\n\t\tFA0B7ABF1A958EA3000E1D17 /* host.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79BE1A958EA3000E1D17 /* host.c */; };\n\t\tFA0B7AC01A958EA3000E1D17 /* host.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79BE1A958EA3000E1D17 /* host.c */; };\n\t\tFA0B7AC11A958EA3000E1D17 /* callbacks.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79C11A958EA3000E1D17 /* callbacks.h */; };\n\t\tFA0B7AC21A958EA3000E1D17 /* enet.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79C21A958EA3000E1D17 /* enet.h */; };\n\t\tFA0B7AC31A958EA3000E1D17 /* list.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79C31A958EA3000E1D17 /* list.h */; };\n\t\tFA0B7AC41A958EA3000E1D17 /* protocol.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79C41A958EA3000E1D17 /* protocol.h */; };\n\t\tFA0B7AC51A958EA3000E1D17 /* time.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79C51A958EA3000E1D17 /* time.h */; };\n\t\tFA0B7AC61A958EA3000E1D17 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79C61A958EA3000E1D17 /* types.h */; };\n\t\tFA0B7AC71A958EA3000E1D17 /* unix.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79C71A958EA3000E1D17 /* unix.h */; };\n\t\tFA0B7AC81A958EA3000E1D17 /* utility.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79C81A958EA3000E1D17 /* utility.h */; };\n\t\tFA0B7AC91A958EA3000E1D17 /* win32.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79C91A958EA3000E1D17 /* win32.h */; };\n\t\tFA0B7ACB1A958EA3000E1D17 /* list.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79CB1A958EA3000E1D17 /* list.c */; };\n\t\tFA0B7ACC1A958EA3000E1D17 /* list.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79CB1A958EA3000E1D17 /* list.c */; };\n\t\tFA0B7ACD1A958EA3000E1D17 /* packet.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79CC1A958EA3000E1D17 /* packet.c */; };\n\t\tFA0B7ACE1A958EA3000E1D17 /* packet.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79CC1A958EA3000E1D17 /* packet.c */; };\n\t\tFA0B7ACF1A958EA3000E1D17 /* peer.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79CD1A958EA3000E1D17 /* peer.c */; };\n\t\tFA0B7AD01A958EA3000E1D17 /* peer.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79CD1A958EA3000E1D17 /* peer.c */; };\n\t\tFA0B7AD11A958EA3000E1D17 /* protocol.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79CE1A958EA3000E1D17 /* protocol.c */; };\n\t\tFA0B7AD21A958EA3000E1D17 /* protocol.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79CE1A958EA3000E1D17 /* protocol.c */; };\n\t\tFA0B7AD41A958EA3000E1D17 /* unix.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79D01A958EA3000E1D17 /* unix.c */; };\n\t\tFA0B7AD51A958EA3000E1D17 /* unix.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79D01A958EA3000E1D17 /* unix.c */; };\n\t\tFA0B7AD61A958EA3000E1D17 /* win32.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79D11A958EA3000E1D17 /* win32.c */; };\n\t\tFA0B7AD71A958EA3000E1D17 /* win32.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79D11A958EA3000E1D17 /* win32.c */; };\n\t\tFA0B7AD81A958EA3000E1D17 /* lua-enet.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79D21A958EA3000E1D17 /* lua-enet.h */; };\n\t\tFA0B7AD91A958EA3000E1D17 /* glad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79D41A958EA3000E1D17 /* glad.cpp */; };\n\t\tFA0B7ADA1A958EA3000E1D17 /* glad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79D41A958EA3000E1D17 /* glad.cpp */; };\n\t\tFA0B7ADC1A958EA3000E1D17 /* glad.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79D61A958EA3000E1D17 /* glad.hpp */; };\n\t\tFA0B7ADD1A958EA3000E1D17 /* gladfuncs.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79D71A958EA3000E1D17 /* gladfuncs.hpp */; };\n\t\tFA0B7ADE1A958EA3000E1D17 /* lodepng.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79D91A958EA3000E1D17 /* lodepng.cpp */; };\n\t\tFA0B7ADF1A958EA3000E1D17 /* lodepng.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B79D91A958EA3000E1D17 /* lodepng.cpp */; };\n\t\tFA0B7AE01A958EA3000E1D17 /* lodepng.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B79DA1A958EA3000E1D17 /* lodepng.h */; };\n\t\tFA0B7B211A958EA3000E1D17 /* luasocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7A0E1A958EA3000E1D17 /* luasocket.cpp */; };\n\t\tFA0B7B221A958EA3000E1D17 /* luasocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7A0E1A958EA3000E1D17 /* luasocket.cpp */; };\n\t\tFA0B7B231A958EA3000E1D17 /* luasocket.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7A0F1A958EA3000E1D17 /* luasocket.h */; };\n\t\tFA0B7B281A958EA3000E1D17 /* simplexnoise1234.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7A151A958EA3000E1D17 /* simplexnoise1234.cpp */; };\n\t\tFA0B7B291A958EA3000E1D17 /* simplexnoise1234.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7A151A958EA3000E1D17 /* simplexnoise1234.cpp */; };\n\t\tFA0B7B2A1A958EA3000E1D17 /* simplexnoise1234.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7A161A958EA3000E1D17 /* simplexnoise1234.h */; };\n\t\tFA0B7B2B1A958EA3000E1D17 /* stb_image.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7A181A958EA3000E1D17 /* stb_image.h */; };\n\t\tFA0B7B2C1A958EA3000E1D17 /* checked.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7A1B1A958EA3000E1D17 /* checked.h */; };\n\t\tFA0B7B2D1A958EA3000E1D17 /* core.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7A1C1A958EA3000E1D17 /* core.h */; };\n\t\tFA0B7B2E1A958EA3000E1D17 /* unchecked.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7A1D1A958EA3000E1D17 /* unchecked.h */; };\n\t\tFA0B7B2F1A958EA3000E1D17 /* utf8.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7A1E1A958EA3000E1D17 /* utf8.h */; };\n\t\tFA0B7B301A958EA3000E1D17 /* wuff.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7A201A958EA3000E1D17 /* wuff.c */; };\n\t\tFA0B7B311A958EA3000E1D17 /* wuff.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7A201A958EA3000E1D17 /* wuff.c */; };\n\t\tFA0B7B321A958EA3000E1D17 /* wuff.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7A211A958EA3000E1D17 /* wuff.h */; };\n\t\tFA0B7B331A958EA3000E1D17 /* wuff_config.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7A221A958EA3000E1D17 /* wuff_config.h */; };\n\t\tFA0B7B341A958EA3000E1D17 /* wuff_convert.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7A231A958EA3000E1D17 /* wuff_convert.c */; };\n\t\tFA0B7B351A958EA3000E1D17 /* wuff_convert.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7A231A958EA3000E1D17 /* wuff_convert.c */; };\n\t\tFA0B7B361A958EA3000E1D17 /* wuff_convert.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7A241A958EA3000E1D17 /* wuff_convert.h */; };\n\t\tFA0B7B371A958EA3000E1D17 /* wuff_internal.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7A251A958EA3000E1D17 /* wuff_internal.c */; };\n\t\tFA0B7B381A958EA3000E1D17 /* wuff_internal.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7A251A958EA3000E1D17 /* wuff_internal.c */; };\n\t\tFA0B7B391A958EA3000E1D17 /* wuff_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7A261A958EA3000E1D17 /* wuff_internal.h */; };\n\t\tFA0B7B3A1A958EA3000E1D17 /* wuff_memory.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7A271A958EA3000E1D17 /* wuff_memory.c */; };\n\t\tFA0B7B3B1A958EA3000E1D17 /* wuff_memory.c in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7A271A958EA3000E1D17 /* wuff_memory.c */; };\n\t\tFA0B7CCD1A95902C000E1D17 /* Audio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B3E1A95902C000E1D17 /* Audio.cpp */; };\n\t\tFA0B7CCE1A95902C000E1D17 /* Audio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B3E1A95902C000E1D17 /* Audio.cpp */; };\n\t\tFA0B7CCF1A95902C000E1D17 /* Audio.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B3F1A95902C000E1D17 /* Audio.h */; };\n\t\tFA0B7CD01A95902C000E1D17 /* Audio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B411A95902C000E1D17 /* Audio.cpp */; };\n\t\tFA0B7CD11A95902C000E1D17 /* Audio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B411A95902C000E1D17 /* Audio.cpp */; };\n\t\tFA0B7CD21A95902C000E1D17 /* Audio.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B421A95902C000E1D17 /* Audio.h */; };\n\t\tFA0B7CD31A95902C000E1D17 /* Source.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B431A95902C000E1D17 /* Source.cpp */; };\n\t\tFA0B7CD41A95902C000E1D17 /* Source.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B431A95902C000E1D17 /* Source.cpp */; };\n\t\tFA0B7CD51A95902C000E1D17 /* Source.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B441A95902C000E1D17 /* Source.h */; };\n\t\tFA0B7CD61A95902C000E1D17 /* Audio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B461A95902C000E1D17 /* Audio.cpp */; };\n\t\tFA0B7CD71A95902C000E1D17 /* Audio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B461A95902C000E1D17 /* Audio.cpp */; };\n\t\tFA0B7CD81A95902C000E1D17 /* Audio.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B471A95902C000E1D17 /* Audio.h */; };\n\t\tFA0B7CD91A95902C000E1D17 /* Pool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B481A95902C000E1D17 /* Pool.cpp */; };\n\t\tFA0B7CDA1A95902C000E1D17 /* Pool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B481A95902C000E1D17 /* Pool.cpp */; };\n\t\tFA0B7CDB1A95902C000E1D17 /* Pool.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B491A95902C000E1D17 /* Pool.h */; };\n\t\tFA0B7CDC1A95902C000E1D17 /* Source.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B4A1A95902C000E1D17 /* Source.cpp */; };\n\t\tFA0B7CDD1A95902C000E1D17 /* Source.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B4A1A95902C000E1D17 /* Source.cpp */; };\n\t\tFA0B7CDE1A95902C000E1D17 /* Source.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B4B1A95902C000E1D17 /* Source.h */; };\n\t\tFA0B7CDF1A95902C000E1D17 /* Source.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B4C1A95902C000E1D17 /* Source.cpp */; };\n\t\tFA0B7CE01A95902C000E1D17 /* Source.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B4C1A95902C000E1D17 /* Source.cpp */; };\n\t\tFA0B7CE11A95902C000E1D17 /* Source.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B4D1A95902C000E1D17 /* Source.h */; };\n\t\tFA0B7CE21A95902C000E1D17 /* wrap_Audio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B4E1A95902C000E1D17 /* wrap_Audio.cpp */; };\n\t\tFA0B7CE31A95902C000E1D17 /* wrap_Audio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B4E1A95902C000E1D17 /* wrap_Audio.cpp */; };\n\t\tFA0B7CE41A95902C000E1D17 /* wrap_Audio.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B4F1A95902C000E1D17 /* wrap_Audio.h */; };\n\t\tFA0B7CE51A95902C000E1D17 /* wrap_Source.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B501A95902C000E1D17 /* wrap_Source.cpp */; };\n\t\tFA0B7CE61A95902C000E1D17 /* wrap_Source.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B501A95902C000E1D17 /* wrap_Source.cpp */; };\n\t\tFA0B7CE71A95902C000E1D17 /* wrap_Source.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B511A95902C000E1D17 /* wrap_Source.h */; };\n\t\tFA0B7CE81A95902C000E1D17 /* Event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B531A95902C000E1D17 /* Event.cpp */; };\n\t\tFA0B7CE91A95902C000E1D17 /* Event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B531A95902C000E1D17 /* Event.cpp */; };\n\t\tFA0B7CEA1A95902C000E1D17 /* Event.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B541A95902C000E1D17 /* Event.h */; };\n\t\tFA0B7CEB1A95902C000E1D17 /* Event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B561A95902C000E1D17 /* Event.cpp */; };\n\t\tFA0B7CEC1A95902C000E1D17 /* Event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B561A95902C000E1D17 /* Event.cpp */; };\n\t\tFA0B7CED1A95902C000E1D17 /* Event.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B571A95902C000E1D17 /* Event.h */; };\n\t\tFA0B7CF41A95902C000E1D17 /* File.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B5D1A95902C000E1D17 /* File.cpp */; };\n\t\tFA0B7CF51A95902C000E1D17 /* File.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B5D1A95902C000E1D17 /* File.cpp */; };\n\t\tFA0B7CF61A95902C000E1D17 /* File.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B5E1A95902C000E1D17 /* File.h */; };\n\t\tFA0B7CF71A95902C000E1D17 /* FileData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B5F1A95902C000E1D17 /* FileData.cpp */; };\n\t\tFA0B7CF81A95902C000E1D17 /* FileData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B5F1A95902C000E1D17 /* FileData.cpp */; };\n\t\tFA0B7CF91A95902C000E1D17 /* FileData.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B601A95902C000E1D17 /* FileData.h */; };\n\t\tFA0B7CFA1A95902C000E1D17 /* Filesystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B611A95902C000E1D17 /* Filesystem.cpp */; };\n\t\tFA0B7CFB1A95902C000E1D17 /* Filesystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B611A95902C000E1D17 /* Filesystem.cpp */; };\n\t\tFA0B7CFC1A95902C000E1D17 /* Filesystem.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B621A95902C000E1D17 /* Filesystem.h */; };\n\t\tFA0B7CFD1A95902C000E1D17 /* File.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B641A95902C000E1D17 /* File.cpp */; };\n\t\tFA0B7CFE1A95902C000E1D17 /* File.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B641A95902C000E1D17 /* File.cpp */; };\n\t\tFA0B7CFF1A95902C000E1D17 /* File.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B651A95902C000E1D17 /* File.h */; };\n\t\tFA0B7D001A95902C000E1D17 /* Filesystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B661A95902C000E1D17 /* Filesystem.cpp */; };\n\t\tFA0B7D011A95902C000E1D17 /* Filesystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B661A95902C000E1D17 /* Filesystem.cpp */; };\n\t\tFA0B7D021A95902C000E1D17 /* Filesystem.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B671A95902C000E1D17 /* Filesystem.h */; };\n\t\tFA0B7D061A95902C000E1D17 /* wrap_File.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B6A1A95902C000E1D17 /* wrap_File.cpp */; };\n\t\tFA0B7D071A95902C000E1D17 /* wrap_File.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B6A1A95902C000E1D17 /* wrap_File.cpp */; };\n\t\tFA0B7D081A95902C000E1D17 /* wrap_File.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B6B1A95902C000E1D17 /* wrap_File.h */; };\n\t\tFA0B7D091A95902C000E1D17 /* wrap_FileData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B6C1A95902C000E1D17 /* wrap_FileData.cpp */; };\n\t\tFA0B7D0A1A95902C000E1D17 /* wrap_FileData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B6C1A95902C000E1D17 /* wrap_FileData.cpp */; };\n\t\tFA0B7D0B1A95902C000E1D17 /* wrap_FileData.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B6D1A95902C000E1D17 /* wrap_FileData.h */; };\n\t\tFA0B7D0C1A95902C000E1D17 /* wrap_Filesystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B6E1A95902C000E1D17 /* wrap_Filesystem.cpp */; };\n\t\tFA0B7D0D1A95902C000E1D17 /* wrap_Filesystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B6E1A95902C000E1D17 /* wrap_Filesystem.cpp */; };\n\t\tFA0B7D0E1A95902C000E1D17 /* wrap_Filesystem.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B6F1A95902C000E1D17 /* wrap_Filesystem.h */; };\n\t\tFA0B7D0F1A95902C000E1D17 /* BMFontRasterizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B711A95902C000E1D17 /* BMFontRasterizer.cpp */; };\n\t\tFA0B7D101A95902C000E1D17 /* BMFontRasterizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B711A95902C000E1D17 /* BMFontRasterizer.cpp */; };\n\t\tFA0B7D111A95902C000E1D17 /* BMFontRasterizer.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B721A95902C000E1D17 /* BMFontRasterizer.h */; };\n\t\tFA0B7D121A95902C000E1D17 /* Font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B731A95902C000E1D17 /* Font.cpp */; };\n\t\tFA0B7D131A95902C000E1D17 /* Font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B731A95902C000E1D17 /* Font.cpp */; };\n\t\tFA0B7D141A95902C000E1D17 /* Font.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B741A95902C000E1D17 /* Font.h */; };\n\t\tFA0B7D151A95902C000E1D17 /* Font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B761A95902C000E1D17 /* Font.cpp */; };\n\t\tFA0B7D161A95902C000E1D17 /* Font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B761A95902C000E1D17 /* Font.cpp */; };\n\t\tFA0B7D171A95902C000E1D17 /* Font.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B771A95902C000E1D17 /* Font.h */; };\n\t\tFA0B7D181A95902C000E1D17 /* TrueTypeRasterizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B781A95902C000E1D17 /* TrueTypeRasterizer.cpp */; };\n\t\tFA0B7D191A95902C000E1D17 /* TrueTypeRasterizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B781A95902C000E1D17 /* TrueTypeRasterizer.cpp */; };\n\t\tFA0B7D1A1A95902C000E1D17 /* TrueTypeRasterizer.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B791A95902C000E1D17 /* TrueTypeRasterizer.h */; };\n\t\tFA0B7D1B1A95902C000E1D17 /* GlyphData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B7A1A95902C000E1D17 /* GlyphData.cpp */; };\n\t\tFA0B7D1C1A95902C000E1D17 /* GlyphData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B7A1A95902C000E1D17 /* GlyphData.cpp */; };\n\t\tFA0B7D1D1A95902C000E1D17 /* GlyphData.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B7B1A95902C000E1D17 /* GlyphData.h */; };\n\t\tFA0B7D1E1A95902C000E1D17 /* ImageRasterizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B7C1A95902C000E1D17 /* ImageRasterizer.cpp */; };\n\t\tFA0B7D1F1A95902C000E1D17 /* ImageRasterizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B7C1A95902C000E1D17 /* ImageRasterizer.cpp */; };\n\t\tFA0B7D201A95902C000E1D17 /* ImageRasterizer.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B7D1A95902C000E1D17 /* ImageRasterizer.h */; };\n\t\tFA0B7D211A95902C000E1D17 /* Rasterizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B7E1A95902C000E1D17 /* Rasterizer.cpp */; };\n\t\tFA0B7D221A95902C000E1D17 /* Rasterizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B7E1A95902C000E1D17 /* Rasterizer.cpp */; };\n\t\tFA0B7D231A95902C000E1D17 /* Rasterizer.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B7F1A95902C000E1D17 /* Rasterizer.h */; };\n\t\tFA0B7D251A95902C000E1D17 /* wrap_Font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B811A95902C000E1D17 /* wrap_Font.cpp */; };\n\t\tFA0B7D261A95902C000E1D17 /* wrap_Font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B811A95902C000E1D17 /* wrap_Font.cpp */; };\n\t\tFA0B7D271A95902C000E1D17 /* wrap_Font.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B821A95902C000E1D17 /* wrap_Font.h */; };\n\t\tFA0B7D281A95902C000E1D17 /* wrap_GlyphData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B831A95902C000E1D17 /* wrap_GlyphData.cpp */; };\n\t\tFA0B7D291A95902C000E1D17 /* wrap_GlyphData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B831A95902C000E1D17 /* wrap_GlyphData.cpp */; };\n\t\tFA0B7D2A1A95902C000E1D17 /* wrap_GlyphData.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B841A95902C000E1D17 /* wrap_GlyphData.h */; };\n\t\tFA0B7D2B1A95902C000E1D17 /* wrap_Rasterizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B851A95902C000E1D17 /* wrap_Rasterizer.cpp */; };\n\t\tFA0B7D2C1A95902C000E1D17 /* wrap_Rasterizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B851A95902C000E1D17 /* wrap_Rasterizer.cpp */; };\n\t\tFA0B7D2D1A95902C000E1D17 /* wrap_Rasterizer.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B861A95902C000E1D17 /* wrap_Rasterizer.h */; };\n\t\tFA0B7D2F1A95902C000E1D17 /* Drawable.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B891A95902C000E1D17 /* Drawable.h */; };\n\t\tFA0B7D301A95902C000E1D17 /* Graphics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B8A1A95902C000E1D17 /* Graphics.cpp */; };\n\t\tFA0B7D311A95902C000E1D17 /* Graphics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B8A1A95902C000E1D17 /* Graphics.cpp */; };\n\t\tFA0B7D321A95902C000E1D17 /* Graphics.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B8B1A95902C000E1D17 /* Graphics.h */; };\n\t\tFA0B7D391A95902C000E1D17 /* Graphics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B911A95902C000E1D17 /* Graphics.cpp */; };\n\t\tFA0B7D3A1A95902C000E1D17 /* Graphics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B911A95902C000E1D17 /* Graphics.cpp */; };\n\t\tFA0B7D3B1A95902C000E1D17 /* Graphics.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B921A95902C000E1D17 /* Graphics.h */; };\n\t\tFA0B7D3C1A95902C000E1D17 /* Texture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B931A95902C000E1D17 /* Texture.cpp */; };\n\t\tFA0B7D3D1A95902C000E1D17 /* Texture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B931A95902C000E1D17 /* Texture.cpp */; };\n\t\tFA0B7D3E1A95902C000E1D17 /* Texture.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B941A95902C000E1D17 /* Texture.h */; };\n\t\tFA0B7D421A95902C000E1D17 /* OpenGL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B971A95902C000E1D17 /* OpenGL.cpp */; };\n\t\tFA0B7D431A95902C000E1D17 /* OpenGL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B971A95902C000E1D17 /* OpenGL.cpp */; };\n\t\tFA0B7D441A95902C000E1D17 /* OpenGL.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B981A95902C000E1D17 /* OpenGL.h */; };\n\t\tFA0B7D481A95902C000E1D17 /* Polyline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B9B1A95902C000E1D17 /* Polyline.cpp */; };\n\t\tFA0B7D491A95902C000E1D17 /* Polyline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B9B1A95902C000E1D17 /* Polyline.cpp */; };\n\t\tFA0B7D4A1A95902C000E1D17 /* Polyline.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B9C1A95902C000E1D17 /* Polyline.h */; };\n\t\tFA0B7D4B1A95902C000E1D17 /* Shader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B9D1A95902C000E1D17 /* Shader.cpp */; };\n\t\tFA0B7D4C1A95902C000E1D17 /* Shader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7B9D1A95902C000E1D17 /* Shader.cpp */; };\n\t\tFA0B7D4D1A95902C000E1D17 /* Shader.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7B9E1A95902C000E1D17 /* Shader.h */; };\n\t\tFA0B7D551A95902C000E1D17 /* Buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BA41A95902C000E1D17 /* Buffer.cpp */; };\n\t\tFA0B7D561A95902C000E1D17 /* Buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BA41A95902C000E1D17 /* Buffer.cpp */; };\n\t\tFA0B7D571A95902C000E1D17 /* Buffer.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BA51A95902C000E1D17 /* Buffer.h */; };\n\t\tFA0B7D791A95902C000E1D17 /* Quad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BBC1A95902C000E1D17 /* Quad.cpp */; };\n\t\tFA0B7D7A1A95902C000E1D17 /* Quad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BBC1A95902C000E1D17 /* Quad.cpp */; };\n\t\tFA0B7D7B1A95902C000E1D17 /* Quad.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BBD1A95902C000E1D17 /* Quad.h */; };\n\t\tFA0B7D7C1A95902C000E1D17 /* Texture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BBE1A95902C000E1D17 /* Texture.cpp */; };\n\t\tFA0B7D7D1A95902C000E1D17 /* Texture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BBE1A95902C000E1D17 /* Texture.cpp */; };\n\t\tFA0B7D7E1A95902C000E1D17 /* Texture.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BBF1A95902C000E1D17 /* Texture.h */; };\n\t\tFA0B7D7F1A95902C000E1D17 /* Volatile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BC01A95902C000E1D17 /* Volatile.cpp */; };\n\t\tFA0B7D801A95902C000E1D17 /* Volatile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BC01A95902C000E1D17 /* Volatile.cpp */; };\n\t\tFA0B7D811A95902C000E1D17 /* Volatile.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BC11A95902C000E1D17 /* Volatile.h */; };\n\t\tFA0B7D821A95902C000E1D17 /* CompressedImageData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BC31A95902C000E1D17 /* CompressedImageData.cpp */; };\n\t\tFA0B7D831A95902C000E1D17 /* CompressedImageData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BC31A95902C000E1D17 /* CompressedImageData.cpp */; };\n\t\tFA0B7D841A95902C000E1D17 /* CompressedImageData.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BC41A95902C000E1D17 /* CompressedImageData.h */; };\n\t\tFA0B7D851A95902C000E1D17 /* Image.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BC51A95902C000E1D17 /* Image.h */; };\n\t\tFA0B7D861A95902C000E1D17 /* ImageData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BC61A95902C000E1D17 /* ImageData.cpp */; };\n\t\tFA0B7D871A95902C000E1D17 /* ImageData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BC61A95902C000E1D17 /* ImageData.cpp */; };\n\t\tFA0B7D881A95902C000E1D17 /* ImageData.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BC71A95902C000E1D17 /* ImageData.h */; };\n\t\tFA0B7D8D1A95902C000E1D17 /* ddsHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BCC1A95902C000E1D17 /* ddsHandler.cpp */; };\n\t\tFA0B7D8E1A95902C000E1D17 /* ddsHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BCC1A95902C000E1D17 /* ddsHandler.cpp */; };\n\t\tFA0B7D8F1A95902C000E1D17 /* ddsHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BCD1A95902C000E1D17 /* ddsHandler.h */; };\n\t\tFA0B7D9F1A95902C000E1D17 /* KTXHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BD81A95902C000E1D17 /* KTXHandler.cpp */; };\n\t\tFA0B7DA01A95902C000E1D17 /* KTXHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BD81A95902C000E1D17 /* KTXHandler.cpp */; };\n\t\tFA0B7DA11A95902C000E1D17 /* KTXHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BD91A95902C000E1D17 /* KTXHandler.h */; };\n\t\tFA0B7DA21A95902C000E1D17 /* PKMHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BDA1A95902C000E1D17 /* PKMHandler.cpp */; };\n\t\tFA0B7DA31A95902C000E1D17 /* PKMHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BDA1A95902C000E1D17 /* PKMHandler.cpp */; };\n\t\tFA0B7DA41A95902C000E1D17 /* PKMHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BDB1A95902C000E1D17 /* PKMHandler.h */; };\n\t\tFA0B7DA51A95902C000E1D17 /* PNGHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BDC1A95902C000E1D17 /* PNGHandler.cpp */; };\n\t\tFA0B7DA61A95902C000E1D17 /* PNGHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BDC1A95902C000E1D17 /* PNGHandler.cpp */; };\n\t\tFA0B7DA71A95902C000E1D17 /* PNGHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BDD1A95902C000E1D17 /* PNGHandler.h */; };\n\t\tFA0B7DA81A95902C000E1D17 /* PVRHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BDE1A95902C000E1D17 /* PVRHandler.cpp */; };\n\t\tFA0B7DA91A95902C000E1D17 /* PVRHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BDE1A95902C000E1D17 /* PVRHandler.cpp */; };\n\t\tFA0B7DAA1A95902C000E1D17 /* PVRHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BDF1A95902C000E1D17 /* PVRHandler.h */; };\n\t\tFA0B7DAB1A95902C000E1D17 /* STBHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BE01A95902C000E1D17 /* STBHandler.cpp */; };\n\t\tFA0B7DAC1A95902C000E1D17 /* STBHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BE01A95902C000E1D17 /* STBHandler.cpp */; };\n\t\tFA0B7DAD1A95902C000E1D17 /* STBHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BE11A95902C000E1D17 /* STBHandler.h */; };\n\t\tFA0B7DAE1A95902C000E1D17 /* wrap_CompressedImageData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BE21A95902C000E1D17 /* wrap_CompressedImageData.cpp */; };\n\t\tFA0B7DAF1A95902C000E1D17 /* wrap_CompressedImageData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BE21A95902C000E1D17 /* wrap_CompressedImageData.cpp */; };\n\t\tFA0B7DB01A95902C000E1D17 /* wrap_CompressedImageData.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BE31A95902C000E1D17 /* wrap_CompressedImageData.h */; };\n\t\tFA0B7DB11A95902C000E1D17 /* wrap_Image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BE41A95902C000E1D17 /* wrap_Image.cpp */; };\n\t\tFA0B7DB21A95902C000E1D17 /* wrap_Image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BE41A95902C000E1D17 /* wrap_Image.cpp */; };\n\t\tFA0B7DB31A95902C000E1D17 /* wrap_Image.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BE51A95902C000E1D17 /* wrap_Image.h */; };\n\t\tFA0B7DB41A95902C000E1D17 /* wrap_ImageData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BE61A95902C000E1D17 /* wrap_ImageData.cpp */; };\n\t\tFA0B7DB51A95902C000E1D17 /* wrap_ImageData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BE61A95902C000E1D17 /* wrap_ImageData.cpp */; };\n\t\tFA0B7DB61A95902C000E1D17 /* wrap_ImageData.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BE71A95902C000E1D17 /* wrap_ImageData.h */; };\n\t\tFA0B7DB71A95902C000E1D17 /* Joystick.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BE91A95902C000E1D17 /* Joystick.cpp */; };\n\t\tFA0B7DB81A95902C000E1D17 /* Joystick.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BE91A95902C000E1D17 /* Joystick.cpp */; };\n\t\tFA0B7DB91A95902C000E1D17 /* Joystick.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BEA1A95902C000E1D17 /* Joystick.h */; };\n\t\tFA0B7DBA1A95902C000E1D17 /* JoystickModule.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BEB1A95902C000E1D17 /* JoystickModule.h */; };\n\t\tFA0B7DBB1A95902C000E1D17 /* Joystick.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BED1A95902C000E1D17 /* Joystick.cpp */; };\n\t\tFA0B7DBC1A95902C000E1D17 /* Joystick.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BED1A95902C000E1D17 /* Joystick.cpp */; };\n\t\tFA0B7DBD1A95902C000E1D17 /* Joystick.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BEE1A95902C000E1D17 /* Joystick.h */; };\n\t\tFA0B7DBE1A95902C000E1D17 /* JoystickModule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BEF1A95902C000E1D17 /* JoystickModule.cpp */; };\n\t\tFA0B7DBF1A95902C000E1D17 /* JoystickModule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BEF1A95902C000E1D17 /* JoystickModule.cpp */; };\n\t\tFA0B7DC01A95902C000E1D17 /* JoystickModule.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BF01A95902C000E1D17 /* JoystickModule.h */; };\n\t\tFA0B7DC11A95902C000E1D17 /* wrap_Joystick.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BF11A95902C000E1D17 /* wrap_Joystick.cpp */; };\n\t\tFA0B7DC21A95902C000E1D17 /* wrap_Joystick.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BF11A95902C000E1D17 /* wrap_Joystick.cpp */; };\n\t\tFA0B7DC31A95902C000E1D17 /* wrap_Joystick.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BF21A95902C000E1D17 /* wrap_Joystick.h */; };\n\t\tFA0B7DC41A95902C000E1D17 /* wrap_JoystickModule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BF31A95902C000E1D17 /* wrap_JoystickModule.cpp */; };\n\t\tFA0B7DC51A95902C000E1D17 /* wrap_JoystickModule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BF31A95902C000E1D17 /* wrap_JoystickModule.cpp */; };\n\t\tFA0B7DC61A95902C000E1D17 /* wrap_JoystickModule.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BF41A95902C000E1D17 /* wrap_JoystickModule.h */; };\n\t\tFA0B7DC71A95902C000E1D17 /* Keyboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BF61A95902C000E1D17 /* Keyboard.cpp */; };\n\t\tFA0B7DC81A95902C000E1D17 /* Keyboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BF61A95902C000E1D17 /* Keyboard.cpp */; };\n\t\tFA0B7DC91A95902C000E1D17 /* Keyboard.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BF71A95902C000E1D17 /* Keyboard.h */; };\n\t\tFA0B7DCA1A95902C000E1D17 /* Keyboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BF91A95902C000E1D17 /* Keyboard.cpp */; };\n\t\tFA0B7DCB1A95902C000E1D17 /* Keyboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BF91A95902C000E1D17 /* Keyboard.cpp */; };\n\t\tFA0B7DCC1A95902C000E1D17 /* Keyboard.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BFA1A95902C000E1D17 /* Keyboard.h */; };\n\t\tFA0B7DCD1A95902C000E1D17 /* wrap_Keyboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BFB1A95902C000E1D17 /* wrap_Keyboard.cpp */; };\n\t\tFA0B7DCE1A95902C000E1D17 /* wrap_Keyboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BFB1A95902C000E1D17 /* wrap_Keyboard.cpp */; };\n\t\tFA0B7DCF1A95902C000E1D17 /* wrap_Keyboard.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BFC1A95902C000E1D17 /* wrap_Keyboard.h */; };\n\t\tFA0B7DD01A95902C000E1D17 /* love.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BFE1A95902C000E1D17 /* love.cpp */; };\n\t\tFA0B7DD11A95902C000E1D17 /* love.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7BFE1A95902C000E1D17 /* love.cpp */; };\n\t\tFA0B7DD21A95902C000E1D17 /* love.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7BFF1A95902C000E1D17 /* love.h */; };\n\t\tFA0B7DD31A95902C000E1D17 /* BezierCurve.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C011A95902C000E1D17 /* BezierCurve.cpp */; };\n\t\tFA0B7DD41A95902C000E1D17 /* BezierCurve.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C011A95902C000E1D17 /* BezierCurve.cpp */; };\n\t\tFA0B7DD51A95902C000E1D17 /* BezierCurve.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C021A95902C000E1D17 /* BezierCurve.h */; };\n\t\tFA0B7DD61A95902C000E1D17 /* MathModule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C031A95902C000E1D17 /* MathModule.cpp */; };\n\t\tFA0B7DD71A95902C000E1D17 /* MathModule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C031A95902C000E1D17 /* MathModule.cpp */; };\n\t\tFA0B7DD81A95902C000E1D17 /* MathModule.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C041A95902C000E1D17 /* MathModule.h */; };\n\t\tFA0B7DD91A95902C000E1D17 /* RandomGenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C051A95902C000E1D17 /* RandomGenerator.cpp */; };\n\t\tFA0B7DDA1A95902C000E1D17 /* RandomGenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C051A95902C000E1D17 /* RandomGenerator.cpp */; };\n\t\tFA0B7DDB1A95902C000E1D17 /* RandomGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C061A95902C000E1D17 /* RandomGenerator.h */; };\n\t\tFA0B7DDC1A95902C000E1D17 /* wrap_BezierCurve.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C071A95902C000E1D17 /* wrap_BezierCurve.cpp */; };\n\t\tFA0B7DDD1A95902C000E1D17 /* wrap_BezierCurve.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C071A95902C000E1D17 /* wrap_BezierCurve.cpp */; };\n\t\tFA0B7DDE1A95902C000E1D17 /* wrap_BezierCurve.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C081A95902C000E1D17 /* wrap_BezierCurve.h */; };\n\t\tFA0B7DDF1A95902C000E1D17 /* wrap_Math.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C091A95902C000E1D17 /* wrap_Math.cpp */; };\n\t\tFA0B7DE01A95902C000E1D17 /* wrap_Math.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C091A95902C000E1D17 /* wrap_Math.cpp */; };\n\t\tFA0B7DE11A95902C000E1D17 /* wrap_Math.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C0A1A95902C000E1D17 /* wrap_Math.h */; };\n\t\tFA0B7DE21A95902C000E1D17 /* wrap_RandomGenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C0B1A95902C000E1D17 /* wrap_RandomGenerator.cpp */; };\n\t\tFA0B7DE31A95902C000E1D17 /* wrap_RandomGenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C0B1A95902C000E1D17 /* wrap_RandomGenerator.cpp */; };\n\t\tFA0B7DE41A95902C000E1D17 /* wrap_RandomGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C0C1A95902C000E1D17 /* wrap_RandomGenerator.h */; };\n\t\tFA0B7DE51A95902C000E1D17 /* Cursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C0E1A95902C000E1D17 /* Cursor.cpp */; };\n\t\tFA0B7DE61A95902C000E1D17 /* Cursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C0E1A95902C000E1D17 /* Cursor.cpp */; };\n\t\tFA0B7DE71A95902C000E1D17 /* Cursor.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C0F1A95902C000E1D17 /* Cursor.h */; };\n\t\tFA0B7DEA1A95902C000E1D17 /* Mouse.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C111A95902C000E1D17 /* Mouse.h */; };\n\t\tFA0B7DEB1A95902C000E1D17 /* Cursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C131A95902C000E1D17 /* Cursor.cpp */; };\n\t\tFA0B7DEC1A95902C000E1D17 /* Cursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C131A95902C000E1D17 /* Cursor.cpp */; };\n\t\tFA0B7DED1A95902C000E1D17 /* Cursor.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C141A95902C000E1D17 /* Cursor.h */; };\n\t\tFA0B7DEE1A95902C000E1D17 /* Mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C151A95902C000E1D17 /* Mouse.cpp */; };\n\t\tFA0B7DEF1A95902C000E1D17 /* Mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C151A95902C000E1D17 /* Mouse.cpp */; };\n\t\tFA0B7DF01A95902C000E1D17 /* Mouse.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C161A95902C000E1D17 /* Mouse.h */; };\n\t\tFA0B7DF11A95902C000E1D17 /* wrap_Cursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C171A95902C000E1D17 /* wrap_Cursor.cpp */; };\n\t\tFA0B7DF21A95902C000E1D17 /* wrap_Cursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C171A95902C000E1D17 /* wrap_Cursor.cpp */; };\n\t\tFA0B7DF31A95902C000E1D17 /* wrap_Cursor.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C181A95902C000E1D17 /* wrap_Cursor.h */; };\n\t\tFA0B7DF41A95902C000E1D17 /* wrap_Mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C191A95902C000E1D17 /* wrap_Mouse.cpp */; };\n\t\tFA0B7DF51A95902C000E1D17 /* wrap_Mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C191A95902C000E1D17 /* wrap_Mouse.cpp */; };\n\t\tFA0B7DF61A95902C000E1D17 /* wrap_Mouse.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C1A1A95902C000E1D17 /* wrap_Mouse.h */; };\n\t\tFA0B7DF71A95902C000E1D17 /* Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C1C1A95902C000E1D17 /* Body.cpp */; };\n\t\tFA0B7DF81A95902C000E1D17 /* Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C1C1A95902C000E1D17 /* Body.cpp */; };\n\t\tFA0B7DF91A95902C000E1D17 /* Body.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C1D1A95902C000E1D17 /* Body.h */; };\n\t\tFA0B7DFA1A95902C000E1D17 /* Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C1F1A95902C000E1D17 /* Body.cpp */; };\n\t\tFA0B7DFB1A95902C000E1D17 /* Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C1F1A95902C000E1D17 /* Body.cpp */; };\n\t\tFA0B7DFC1A95902C000E1D17 /* Body.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C201A95902C000E1D17 /* Body.h */; };\n\t\tFA0B7DFD1A95902C000E1D17 /* ChainShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C211A95902C000E1D17 /* ChainShape.cpp */; };\n\t\tFA0B7DFE1A95902C000E1D17 /* ChainShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C211A95902C000E1D17 /* ChainShape.cpp */; };\n\t\tFA0B7DFF1A95902C000E1D17 /* ChainShape.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C221A95902C000E1D17 /* ChainShape.h */; };\n\t\tFA0B7E001A95902C000E1D17 /* CircleShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C231A95902C000E1D17 /* CircleShape.cpp */; };\n\t\tFA0B7E011A95902C000E1D17 /* CircleShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C231A95902C000E1D17 /* CircleShape.cpp */; };\n\t\tFA0B7E021A95902C000E1D17 /* CircleShape.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C241A95902C000E1D17 /* CircleShape.h */; };\n\t\tFA0B7E031A95902C000E1D17 /* Contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C251A95902C000E1D17 /* Contact.cpp */; };\n\t\tFA0B7E041A95902C000E1D17 /* Contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C251A95902C000E1D17 /* Contact.cpp */; };\n\t\tFA0B7E051A95902C000E1D17 /* Contact.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C261A95902C000E1D17 /* Contact.h */; };\n\t\tFA0B7E061A95902C000E1D17 /* DistanceJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C271A95902C000E1D17 /* DistanceJoint.cpp */; };\n\t\tFA0B7E071A95902C000E1D17 /* DistanceJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C271A95902C000E1D17 /* DistanceJoint.cpp */; };\n\t\tFA0B7E081A95902C000E1D17 /* DistanceJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C281A95902C000E1D17 /* DistanceJoint.h */; };\n\t\tFA0B7E091A95902C000E1D17 /* EdgeShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C291A95902C000E1D17 /* EdgeShape.cpp */; };\n\t\tFA0B7E0A1A95902C000E1D17 /* EdgeShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C291A95902C000E1D17 /* EdgeShape.cpp */; };\n\t\tFA0B7E0B1A95902C000E1D17 /* EdgeShape.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C2A1A95902C000E1D17 /* EdgeShape.h */; };\n\t\tFA0B7E0F1A95902C000E1D17 /* FrictionJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C2D1A95902C000E1D17 /* FrictionJoint.cpp */; };\n\t\tFA0B7E101A95902C000E1D17 /* FrictionJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C2D1A95902C000E1D17 /* FrictionJoint.cpp */; };\n\t\tFA0B7E111A95902C000E1D17 /* FrictionJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C2E1A95902C000E1D17 /* FrictionJoint.h */; };\n\t\tFA0B7E121A95902C000E1D17 /* GearJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C2F1A95902C000E1D17 /* GearJoint.cpp */; };\n\t\tFA0B7E131A95902C000E1D17 /* GearJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C2F1A95902C000E1D17 /* GearJoint.cpp */; };\n\t\tFA0B7E141A95902C000E1D17 /* GearJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C301A95902C000E1D17 /* GearJoint.h */; };\n\t\tFA0B7E151A95902C000E1D17 /* Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C311A95902C000E1D17 /* Joint.cpp */; };\n\t\tFA0B7E161A95902C000E1D17 /* Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C311A95902C000E1D17 /* Joint.cpp */; };\n\t\tFA0B7E171A95902C000E1D17 /* Joint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C321A95902C000E1D17 /* Joint.h */; };\n\t\tFA0B7E181A95902C000E1D17 /* MotorJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C331A95902C000E1D17 /* MotorJoint.cpp */; };\n\t\tFA0B7E191A95902C000E1D17 /* MotorJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C331A95902C000E1D17 /* MotorJoint.cpp */; };\n\t\tFA0B7E1A1A95902C000E1D17 /* MotorJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C341A95902C000E1D17 /* MotorJoint.h */; };\n\t\tFA0B7E1B1A95902C000E1D17 /* MouseJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C351A95902C000E1D17 /* MouseJoint.cpp */; };\n\t\tFA0B7E1C1A95902C000E1D17 /* MouseJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C351A95902C000E1D17 /* MouseJoint.cpp */; };\n\t\tFA0B7E1D1A95902C000E1D17 /* MouseJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C361A95902C000E1D17 /* MouseJoint.h */; };\n\t\tFA0B7E1E1A95902C000E1D17 /* Physics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C371A95902C000E1D17 /* Physics.cpp */; };\n\t\tFA0B7E1F1A95902C000E1D17 /* Physics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C371A95902C000E1D17 /* Physics.cpp */; };\n\t\tFA0B7E201A95902C000E1D17 /* Physics.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C381A95902C000E1D17 /* Physics.h */; };\n\t\tFA0B7E211A95902C000E1D17 /* PolygonShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C391A95902C000E1D17 /* PolygonShape.cpp */; };\n\t\tFA0B7E221A95902C000E1D17 /* PolygonShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C391A95902C000E1D17 /* PolygonShape.cpp */; };\n\t\tFA0B7E231A95902C000E1D17 /* PolygonShape.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C3A1A95902C000E1D17 /* PolygonShape.h */; };\n\t\tFA0B7E241A95902C000E1D17 /* PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C3B1A95902C000E1D17 /* PrismaticJoint.cpp */; };\n\t\tFA0B7E251A95902C000E1D17 /* PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C3B1A95902C000E1D17 /* PrismaticJoint.cpp */; };\n\t\tFA0B7E261A95902C000E1D17 /* PrismaticJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C3C1A95902C000E1D17 /* PrismaticJoint.h */; };\n\t\tFA0B7E271A95902C000E1D17 /* PulleyJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C3D1A95902C000E1D17 /* PulleyJoint.cpp */; };\n\t\tFA0B7E281A95902C000E1D17 /* PulleyJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C3D1A95902C000E1D17 /* PulleyJoint.cpp */; };\n\t\tFA0B7E291A95902C000E1D17 /* PulleyJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C3E1A95902C000E1D17 /* PulleyJoint.h */; };\n\t\tFA0B7E2A1A95902C000E1D17 /* RevoluteJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C3F1A95902C000E1D17 /* RevoluteJoint.cpp */; };\n\t\tFA0B7E2B1A95902C000E1D17 /* RevoluteJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C3F1A95902C000E1D17 /* RevoluteJoint.cpp */; };\n\t\tFA0B7E2C1A95902C000E1D17 /* RevoluteJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C401A95902C000E1D17 /* RevoluteJoint.h */; };\n\t\tFA0B7E2D1A95902C000E1D17 /* RopeJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C411A95902C000E1D17 /* RopeJoint.cpp */; };\n\t\tFA0B7E2E1A95902C000E1D17 /* RopeJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C411A95902C000E1D17 /* RopeJoint.cpp */; };\n\t\tFA0B7E2F1A95902C000E1D17 /* RopeJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C421A95902C000E1D17 /* RopeJoint.h */; };\n\t\tFA0B7E301A95902C000E1D17 /* Shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C431A95902C000E1D17 /* Shape.cpp */; };\n\t\tFA0B7E311A95902C000E1D17 /* Shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C431A95902C000E1D17 /* Shape.cpp */; };\n\t\tFA0B7E321A95902C000E1D17 /* Shape.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C441A95902C000E1D17 /* Shape.h */; };\n\t\tFA0B7E331A95902C000E1D17 /* WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C451A95902C000E1D17 /* WeldJoint.cpp */; };\n\t\tFA0B7E341A95902C000E1D17 /* WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C451A95902C000E1D17 /* WeldJoint.cpp */; };\n\t\tFA0B7E351A95902C000E1D17 /* WeldJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C461A95902C000E1D17 /* WeldJoint.h */; };\n\t\tFA0B7E361A95902C000E1D17 /* WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C471A95902C000E1D17 /* WheelJoint.cpp */; };\n\t\tFA0B7E371A95902C000E1D17 /* WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C471A95902C000E1D17 /* WheelJoint.cpp */; };\n\t\tFA0B7E381A95902C000E1D17 /* WheelJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C481A95902C000E1D17 /* WheelJoint.h */; };\n\t\tFA0B7E391A95902C000E1D17 /* World.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C491A95902C000E1D17 /* World.cpp */; };\n\t\tFA0B7E3A1A95902C000E1D17 /* World.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C491A95902C000E1D17 /* World.cpp */; };\n\t\tFA0B7E3B1A95902C000E1D17 /* World.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C4A1A95902C000E1D17 /* World.h */; };\n\t\tFA0B7E3C1A95902C000E1D17 /* wrap_Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C4B1A95902C000E1D17 /* wrap_Body.cpp */; };\n\t\tFA0B7E3D1A95902C000E1D17 /* wrap_Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C4B1A95902C000E1D17 /* wrap_Body.cpp */; };\n\t\tFA0B7E3E1A95902C000E1D17 /* wrap_Body.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C4C1A95902C000E1D17 /* wrap_Body.h */; };\n\t\tFA0B7E3F1A95902C000E1D17 /* wrap_ChainShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C4D1A95902C000E1D17 /* wrap_ChainShape.cpp */; };\n\t\tFA0B7E401A95902C000E1D17 /* wrap_ChainShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C4D1A95902C000E1D17 /* wrap_ChainShape.cpp */; };\n\t\tFA0B7E411A95902C000E1D17 /* wrap_ChainShape.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C4E1A95902C000E1D17 /* wrap_ChainShape.h */; };\n\t\tFA0B7E421A95902C000E1D17 /* wrap_CircleShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C4F1A95902C000E1D17 /* wrap_CircleShape.cpp */; };\n\t\tFA0B7E431A95902C000E1D17 /* wrap_CircleShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C4F1A95902C000E1D17 /* wrap_CircleShape.cpp */; };\n\t\tFA0B7E441A95902C000E1D17 /* wrap_CircleShape.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C501A95902C000E1D17 /* wrap_CircleShape.h */; };\n\t\tFA0B7E451A95902C000E1D17 /* wrap_Contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C511A95902C000E1D17 /* wrap_Contact.cpp */; };\n\t\tFA0B7E461A95902C000E1D17 /* wrap_Contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C511A95902C000E1D17 /* wrap_Contact.cpp */; };\n\t\tFA0B7E471A95902C000E1D17 /* wrap_Contact.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C521A95902C000E1D17 /* wrap_Contact.h */; };\n\t\tFA0B7E481A95902C000E1D17 /* wrap_DistanceJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C531A95902C000E1D17 /* wrap_DistanceJoint.cpp */; };\n\t\tFA0B7E491A95902C000E1D17 /* wrap_DistanceJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C531A95902C000E1D17 /* wrap_DistanceJoint.cpp */; };\n\t\tFA0B7E4A1A95902C000E1D17 /* wrap_DistanceJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C541A95902C000E1D17 /* wrap_DistanceJoint.h */; };\n\t\tFA0B7E4B1A95902C000E1D17 /* wrap_EdgeShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C551A95902C000E1D17 /* wrap_EdgeShape.cpp */; };\n\t\tFA0B7E4C1A95902C000E1D17 /* wrap_EdgeShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C551A95902C000E1D17 /* wrap_EdgeShape.cpp */; };\n\t\tFA0B7E4D1A95902C000E1D17 /* wrap_EdgeShape.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C561A95902C000E1D17 /* wrap_EdgeShape.h */; };\n\t\tFA0B7E511A95902C000E1D17 /* wrap_FrictionJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C591A95902C000E1D17 /* wrap_FrictionJoint.cpp */; };\n\t\tFA0B7E521A95902C000E1D17 /* wrap_FrictionJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C591A95902C000E1D17 /* wrap_FrictionJoint.cpp */; };\n\t\tFA0B7E531A95902C000E1D17 /* wrap_FrictionJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C5A1A95902C000E1D17 /* wrap_FrictionJoint.h */; };\n\t\tFA0B7E541A95902C000E1D17 /* wrap_GearJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C5B1A95902C000E1D17 /* wrap_GearJoint.cpp */; };\n\t\tFA0B7E551A95902C000E1D17 /* wrap_GearJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C5B1A95902C000E1D17 /* wrap_GearJoint.cpp */; };\n\t\tFA0B7E561A95902C000E1D17 /* wrap_GearJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C5C1A95902C000E1D17 /* wrap_GearJoint.h */; };\n\t\tFA0B7E571A95902C000E1D17 /* wrap_Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C5D1A95902C000E1D17 /* wrap_Joint.cpp */; };\n\t\tFA0B7E581A95902C000E1D17 /* wrap_Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C5D1A95902C000E1D17 /* wrap_Joint.cpp */; };\n\t\tFA0B7E591A95902C000E1D17 /* wrap_Joint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C5E1A95902C000E1D17 /* wrap_Joint.h */; };\n\t\tFA0B7E5A1A95902C000E1D17 /* wrap_MotorJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C5F1A95902C000E1D17 /* wrap_MotorJoint.cpp */; };\n\t\tFA0B7E5B1A95902C000E1D17 /* wrap_MotorJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C5F1A95902C000E1D17 /* wrap_MotorJoint.cpp */; };\n\t\tFA0B7E5C1A95902C000E1D17 /* wrap_MotorJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C601A95902C000E1D17 /* wrap_MotorJoint.h */; };\n\t\tFA0B7E5D1A95902C000E1D17 /* wrap_MouseJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C611A95902C000E1D17 /* wrap_MouseJoint.cpp */; };\n\t\tFA0B7E5E1A95902C000E1D17 /* wrap_MouseJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C611A95902C000E1D17 /* wrap_MouseJoint.cpp */; };\n\t\tFA0B7E5F1A95902C000E1D17 /* wrap_MouseJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C621A95902C000E1D17 /* wrap_MouseJoint.h */; };\n\t\tFA0B7E601A95902C000E1D17 /* wrap_Physics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C631A95902C000E1D17 /* wrap_Physics.cpp */; };\n\t\tFA0B7E611A95902C000E1D17 /* wrap_Physics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C631A95902C000E1D17 /* wrap_Physics.cpp */; };\n\t\tFA0B7E621A95902C000E1D17 /* wrap_Physics.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C641A95902C000E1D17 /* wrap_Physics.h */; };\n\t\tFA0B7E631A95902C000E1D17 /* wrap_PolygonShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C651A95902C000E1D17 /* wrap_PolygonShape.cpp */; };\n\t\tFA0B7E641A95902C000E1D17 /* wrap_PolygonShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C651A95902C000E1D17 /* wrap_PolygonShape.cpp */; };\n\t\tFA0B7E651A95902C000E1D17 /* wrap_PolygonShape.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C661A95902C000E1D17 /* wrap_PolygonShape.h */; };\n\t\tFA0B7E661A95902C000E1D17 /* wrap_PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C671A95902C000E1D17 /* wrap_PrismaticJoint.cpp */; };\n\t\tFA0B7E671A95902C000E1D17 /* wrap_PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C671A95902C000E1D17 /* wrap_PrismaticJoint.cpp */; };\n\t\tFA0B7E681A95902C000E1D17 /* wrap_PrismaticJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C681A95902C000E1D17 /* wrap_PrismaticJoint.h */; };\n\t\tFA0B7E691A95902C000E1D17 /* wrap_PulleyJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C691A95902C000E1D17 /* wrap_PulleyJoint.cpp */; };\n\t\tFA0B7E6A1A95902C000E1D17 /* wrap_PulleyJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C691A95902C000E1D17 /* wrap_PulleyJoint.cpp */; };\n\t\tFA0B7E6B1A95902C000E1D17 /* wrap_PulleyJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C6A1A95902C000E1D17 /* wrap_PulleyJoint.h */; };\n\t\tFA0B7E6C1A95902C000E1D17 /* wrap_RevoluteJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C6B1A95902C000E1D17 /* wrap_RevoluteJoint.cpp */; };\n\t\tFA0B7E6D1A95902C000E1D17 /* wrap_RevoluteJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C6B1A95902C000E1D17 /* wrap_RevoluteJoint.cpp */; };\n\t\tFA0B7E6E1A95902C000E1D17 /* wrap_RevoluteJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C6C1A95902C000E1D17 /* wrap_RevoluteJoint.h */; };\n\t\tFA0B7E6F1A95902C000E1D17 /* wrap_RopeJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C6D1A95902C000E1D17 /* wrap_RopeJoint.cpp */; };\n\t\tFA0B7E701A95902C000E1D17 /* wrap_RopeJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C6D1A95902C000E1D17 /* wrap_RopeJoint.cpp */; };\n\t\tFA0B7E711A95902C000E1D17 /* wrap_RopeJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C6E1A95902C000E1D17 /* wrap_RopeJoint.h */; };\n\t\tFA0B7E721A95902C000E1D17 /* wrap_Shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C6F1A95902C000E1D17 /* wrap_Shape.cpp */; };\n\t\tFA0B7E731A95902C000E1D17 /* wrap_Shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C6F1A95902C000E1D17 /* wrap_Shape.cpp */; };\n\t\tFA0B7E741A95902C000E1D17 /* wrap_Shape.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C701A95902C000E1D17 /* wrap_Shape.h */; };\n\t\tFA0B7E751A95902C000E1D17 /* wrap_WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C711A95902C000E1D17 /* wrap_WeldJoint.cpp */; };\n\t\tFA0B7E761A95902C000E1D17 /* wrap_WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C711A95902C000E1D17 /* wrap_WeldJoint.cpp */; };\n\t\tFA0B7E771A95902C000E1D17 /* wrap_WeldJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C721A95902C000E1D17 /* wrap_WeldJoint.h */; };\n\t\tFA0B7E781A95902C000E1D17 /* wrap_WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C731A95902C000E1D17 /* wrap_WheelJoint.cpp */; };\n\t\tFA0B7E791A95902C000E1D17 /* wrap_WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C731A95902C000E1D17 /* wrap_WheelJoint.cpp */; };\n\t\tFA0B7E7A1A95902C000E1D17 /* wrap_WheelJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C741A95902C000E1D17 /* wrap_WheelJoint.h */; };\n\t\tFA0B7E7B1A95902C000E1D17 /* wrap_World.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C751A95902C000E1D17 /* wrap_World.cpp */; };\n\t\tFA0B7E7C1A95902C000E1D17 /* wrap_World.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C751A95902C000E1D17 /* wrap_World.cpp */; };\n\t\tFA0B7E7D1A95902C000E1D17 /* wrap_World.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C761A95902C000E1D17 /* wrap_World.h */; };\n\t\tFA0B7E7E1A95902C000E1D17 /* Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C771A95902C000E1D17 /* Joint.cpp */; };\n\t\tFA0B7E7F1A95902C000E1D17 /* Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C771A95902C000E1D17 /* Joint.cpp */; };\n\t\tFA0B7E801A95902C000E1D17 /* Joint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C781A95902C000E1D17 /* Joint.h */; };\n\t\tFA0B7E811A95902C000E1D17 /* Shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C791A95902C000E1D17 /* Shape.cpp */; };\n\t\tFA0B7E821A95902C000E1D17 /* Shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C791A95902C000E1D17 /* Shape.cpp */; };\n\t\tFA0B7E831A95902C000E1D17 /* Shape.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C7A1A95902C000E1D17 /* Shape.h */; };\n\t\tFA0B7E841A95902C000E1D17 /* Decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C7C1A95902C000E1D17 /* Decoder.h */; };\n\t\tFA0B7E851A95902C000E1D17 /* CoreAudioDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C7E1A95902C000E1D17 /* CoreAudioDecoder.cpp */; };\n\t\tFA0B7E861A95902C000E1D17 /* CoreAudioDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C7E1A95902C000E1D17 /* CoreAudioDecoder.cpp */; };\n\t\tFA0B7E871A95902C000E1D17 /* CoreAudioDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C7F1A95902C000E1D17 /* CoreAudioDecoder.h */; };\n\t\tFA0B7E881A95902C000E1D17 /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C801A95902C000E1D17 /* Decoder.cpp */; };\n\t\tFA0B7E891A95902C000E1D17 /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C801A95902C000E1D17 /* Decoder.cpp */; };\n\t\tFA0B7E8B1A95902C000E1D17 /* FLACDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C821A95902C000E1D17 /* FLACDecoder.cpp */; };\n\t\tFA0B7E8C1A95902C000E1D17 /* FLACDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C821A95902C000E1D17 /* FLACDecoder.cpp */; };\n\t\tFA0B7E8D1A95902C000E1D17 /* FLACDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C831A95902C000E1D17 /* FLACDecoder.h */; };\n\t\tFA0B7E911A95902C000E1D17 /* ModPlugDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C861A95902C000E1D17 /* ModPlugDecoder.cpp */; };\n\t\tFA0B7E921A95902C000E1D17 /* ModPlugDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C861A95902C000E1D17 /* ModPlugDecoder.cpp */; };\n\t\tFA0B7E931A95902C000E1D17 /* ModPlugDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C871A95902C000E1D17 /* ModPlugDecoder.h */; };\n\t\tFA0B7E971A95902C000E1D17 /* Sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C8A1A95902C000E1D17 /* Sound.cpp */; };\n\t\tFA0B7E981A95902C000E1D17 /* Sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C8A1A95902C000E1D17 /* Sound.cpp */; };\n\t\tFA0B7E991A95902C000E1D17 /* Sound.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C8B1A95902C000E1D17 /* Sound.h */; };\n\t\tFA0B7E9A1A95902C000E1D17 /* VorbisDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C8C1A95902C000E1D17 /* VorbisDecoder.cpp */; };\n\t\tFA0B7E9B1A95902C000E1D17 /* VorbisDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C8C1A95902C000E1D17 /* VorbisDecoder.cpp */; };\n\t\tFA0B7E9C1A95902C000E1D17 /* VorbisDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C8D1A95902C000E1D17 /* VorbisDecoder.h */; };\n\t\tFA0B7E9D1A95902C000E1D17 /* WaveDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C8E1A95902C000E1D17 /* WaveDecoder.cpp */; };\n\t\tFA0B7E9E1A95902C000E1D17 /* WaveDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C8E1A95902C000E1D17 /* WaveDecoder.cpp */; };\n\t\tFA0B7E9F1A95902C000E1D17 /* WaveDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C8F1A95902C000E1D17 /* WaveDecoder.h */; };\n\t\tFA0B7EA01A95902C000E1D17 /* Sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C901A95902C000E1D17 /* Sound.cpp */; };\n\t\tFA0B7EA11A95902C000E1D17 /* Sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C901A95902C000E1D17 /* Sound.cpp */; };\n\t\tFA0B7EA21A95902C000E1D17 /* Sound.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C911A95902C000E1D17 /* Sound.h */; };\n\t\tFA0B7EA31A95902C000E1D17 /* SoundData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C921A95902C000E1D17 /* SoundData.cpp */; };\n\t\tFA0B7EA41A95902C000E1D17 /* SoundData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C921A95902C000E1D17 /* SoundData.cpp */; };\n\t\tFA0B7EA51A95902C000E1D17 /* SoundData.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C931A95902C000E1D17 /* SoundData.h */; };\n\t\tFA0B7EA61A95902C000E1D17 /* wrap_Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C941A95902C000E1D17 /* wrap_Decoder.cpp */; };\n\t\tFA0B7EA71A95902C000E1D17 /* wrap_Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C941A95902C000E1D17 /* wrap_Decoder.cpp */; };\n\t\tFA0B7EA81A95902C000E1D17 /* wrap_Decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C951A95902C000E1D17 /* wrap_Decoder.h */; };\n\t\tFA0B7EA91A95902C000E1D17 /* wrap_Sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C961A95902C000E1D17 /* wrap_Sound.cpp */; };\n\t\tFA0B7EAA1A95902C000E1D17 /* wrap_Sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C961A95902C000E1D17 /* wrap_Sound.cpp */; };\n\t\tFA0B7EAB1A95902C000E1D17 /* wrap_Sound.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C971A95902C000E1D17 /* wrap_Sound.h */; };\n\t\tFA0B7EAC1A95902C000E1D17 /* wrap_SoundData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C981A95902C000E1D17 /* wrap_SoundData.cpp */; };\n\t\tFA0B7EAD1A95902C000E1D17 /* wrap_SoundData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C981A95902C000E1D17 /* wrap_SoundData.cpp */; };\n\t\tFA0B7EAE1A95902C000E1D17 /* wrap_SoundData.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C991A95902C000E1D17 /* wrap_SoundData.h */; };\n\t\tFA0B7EAF1A95902C000E1D17 /* System.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C9C1A95902C000E1D17 /* System.cpp */; };\n\t\tFA0B7EB01A95902C000E1D17 /* System.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C9C1A95902C000E1D17 /* System.cpp */; };\n\t\tFA0B7EB11A95902C000E1D17 /* System.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C9D1A95902C000E1D17 /* System.h */; };\n\t\tFA0B7EB21A95902C000E1D17 /* System.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C9E1A95902C000E1D17 /* System.cpp */; };\n\t\tFA0B7EB31A95902C000E1D17 /* System.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7C9E1A95902C000E1D17 /* System.cpp */; };\n\t\tFA0B7EB41A95902C000E1D17 /* System.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7C9F1A95902C000E1D17 /* System.h */; };\n\t\tFA0B7EB51A95902C000E1D17 /* wrap_System.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CA01A95902C000E1D17 /* wrap_System.cpp */; };\n\t\tFA0B7EB61A95902C000E1D17 /* wrap_System.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CA01A95902C000E1D17 /* wrap_System.cpp */; };\n\t\tFA0B7EB71A95902C000E1D17 /* wrap_System.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7CA11A95902C000E1D17 /* wrap_System.h */; };\n\t\tFA0B7EB81A95902C000E1D17 /* Channel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CA31A95902C000E1D17 /* Channel.cpp */; };\n\t\tFA0B7EB91A95902C000E1D17 /* Channel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CA31A95902C000E1D17 /* Channel.cpp */; };\n\t\tFA0B7EBA1A95902C000E1D17 /* Channel.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7CA41A95902C000E1D17 /* Channel.h */; };\n\t\tFA0B7EBB1A95902C000E1D17 /* LuaThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CA51A95902C000E1D17 /* LuaThread.cpp */; };\n\t\tFA0B7EBC1A95902C000E1D17 /* LuaThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CA51A95902C000E1D17 /* LuaThread.cpp */; };\n\t\tFA0B7EBD1A95902C000E1D17 /* LuaThread.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7CA61A95902C000E1D17 /* LuaThread.h */; };\n\t\tFA0B7EBE1A95902C000E1D17 /* Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CA81A95902C000E1D17 /* Thread.cpp */; };\n\t\tFA0B7EBF1A95902C000E1D17 /* Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CA81A95902C000E1D17 /* Thread.cpp */; };\n\t\tFA0B7EC01A95902C000E1D17 /* Thread.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7CA91A95902C000E1D17 /* Thread.h */; };\n\t\tFA0B7EC11A95902C000E1D17 /* threads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CAA1A95902C000E1D17 /* threads.cpp */; };\n\t\tFA0B7EC21A95902C000E1D17 /* threads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CAA1A95902C000E1D17 /* threads.cpp */; };\n\t\tFA0B7EC31A95902C000E1D17 /* threads.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7CAB1A95902C000E1D17 /* threads.h */; };\n\t\tFA0B7EC41A95902C000E1D17 /* Thread.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7CAC1A95902C000E1D17 /* Thread.h */; };\n\t\tFA0B7EC51A95902C000E1D17 /* ThreadModule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CAD1A95902C000E1D17 /* ThreadModule.cpp */; };\n\t\tFA0B7EC61A95902C000E1D17 /* ThreadModule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CAD1A95902C000E1D17 /* ThreadModule.cpp */; };\n\t\tFA0B7EC71A95902C000E1D17 /* ThreadModule.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7CAE1A95902C000E1D17 /* ThreadModule.h */; };\n\t\tFA0B7EC81A95902C000E1D17 /* threads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CAF1A95902C000E1D17 /* threads.cpp */; };\n\t\tFA0B7EC91A95902C000E1D17 /* threads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CAF1A95902C000E1D17 /* threads.cpp */; };\n\t\tFA0B7ECA1A95902C000E1D17 /* threads.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7CB01A95902C000E1D17 /* threads.h */; };\n\t\tFA0B7ECB1A95902C000E1D17 /* wrap_Channel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CB11A95902C000E1D17 /* wrap_Channel.cpp */; };\n\t\tFA0B7ECC1A95902C000E1D17 /* wrap_Channel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CB11A95902C000E1D17 /* wrap_Channel.cpp */; };\n\t\tFA0B7ECD1A95902C000E1D17 /* wrap_Channel.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7CB21A95902C000E1D17 /* wrap_Channel.h */; };\n\t\tFA0B7ECE1A95902C000E1D17 /* wrap_LuaThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CB31A95902C000E1D17 /* wrap_LuaThread.cpp */; };\n\t\tFA0B7ECF1A95902C000E1D17 /* wrap_LuaThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CB31A95902C000E1D17 /* wrap_LuaThread.cpp */; };\n\t\tFA0B7ED01A95902C000E1D17 /* wrap_LuaThread.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7CB41A95902C000E1D17 /* wrap_LuaThread.h */; };\n\t\tFA0B7ED11A95902C000E1D17 /* wrap_ThreadModule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CB51A95902C000E1D17 /* wrap_ThreadModule.cpp */; };\n\t\tFA0B7ED21A95902C000E1D17 /* wrap_ThreadModule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CB51A95902C000E1D17 /* wrap_ThreadModule.cpp */; };\n\t\tFA0B7ED31A95902C000E1D17 /* wrap_ThreadModule.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7CB61A95902C000E1D17 /* wrap_ThreadModule.h */; };\n\t\tFA0B7ED71A95902D000E1D17 /* Timer.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7CBB1A95902C000E1D17 /* Timer.h */; };\n\t\tFA0B7ED81A95902D000E1D17 /* wrap_Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CBC1A95902C000E1D17 /* wrap_Timer.cpp */; };\n\t\tFA0B7ED91A95902D000E1D17 /* wrap_Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CBC1A95902C000E1D17 /* wrap_Timer.cpp */; };\n\t\tFA0B7EDA1A95902D000E1D17 /* wrap_Timer.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7CBD1A95902C000E1D17 /* wrap_Timer.h */; };\n\t\tFA0B7EDB1A95902D000E1D17 /* Touch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CC01A95902C000E1D17 /* Touch.cpp */; };\n\t\tFA0B7EDC1A95902D000E1D17 /* Touch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CC01A95902C000E1D17 /* Touch.cpp */; };\n\t\tFA0B7EDD1A95902D000E1D17 /* Touch.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7CC11A95902C000E1D17 /* Touch.h */; };\n\t\tFA0B7EDE1A95902D000E1D17 /* Touch.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7CC21A95902C000E1D17 /* Touch.h */; };\n\t\tFA0B7EDF1A95902D000E1D17 /* wrap_Touch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CC31A95902C000E1D17 /* wrap_Touch.cpp */; };\n\t\tFA0B7EE01A95902D000E1D17 /* wrap_Touch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CC31A95902C000E1D17 /* wrap_Touch.cpp */; };\n\t\tFA0B7EE11A95902D000E1D17 /* wrap_Touch.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7CC41A95902C000E1D17 /* wrap_Touch.h */; };\n\t\tFA0B7EE21A95902D000E1D17 /* Window.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CC71A95902C000E1D17 /* Window.cpp */; };\n\t\tFA0B7EE31A95902D000E1D17 /* Window.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CC71A95902C000E1D17 /* Window.cpp */; };\n\t\tFA0B7EE41A95902D000E1D17 /* Window.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7CC81A95902C000E1D17 /* Window.h */; };\n\t\tFA0B7EE51A95902D000E1D17 /* Window.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CC91A95902C000E1D17 /* Window.cpp */; };\n\t\tFA0B7EE61A95902D000E1D17 /* Window.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CC91A95902C000E1D17 /* Window.cpp */; };\n\t\tFA0B7EE71A95902D000E1D17 /* Window.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7CCA1A95902C000E1D17 /* Window.h */; };\n\t\tFA0B7EE81A95902D000E1D17 /* wrap_Window.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CCB1A95902C000E1D17 /* wrap_Window.cpp */; };\n\t\tFA0B7EE91A95902D000E1D17 /* wrap_Window.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7CCB1A95902C000E1D17 /* wrap_Window.cpp */; };\n\t\tFA0B7EEA1A95902D000E1D17 /* wrap_Window.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0B7CCC1A95902C000E1D17 /* wrap_Window.h */; };\n\t\tFA0B7EF21A959D2C000E1D17 /* ios.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA0B7EF11A959D2C000E1D17 /* ios.mm */; };\n\t\tFA1557C01CE90A2C00AFF582 /* tinyexr.h in Headers */ = {isa = PBXBuildFile; fileRef = FA1557BF1CE90A2C00AFF582 /* tinyexr.h */; };\n\t\tFA1557C31CE90BD200AFF582 /* EXRHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA1557C11CE90BD200AFF582 /* EXRHandler.cpp */; };\n\t\tFA1557C41CE90BD200AFF582 /* EXRHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = FA1557C21CE90BD200AFF582 /* EXRHandler.h */; };\n\t\tFA1557C51CE90BD900AFF582 /* EXRHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA1557C11CE90BD200AFF582 /* EXRHandler.cpp */; };\n\t\tFA1583E21E196180005E603B /* wrap_Shader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA1BA0B51E17043400AA2803 /* wrap_Shader.cpp */; };\n\t\tFA15DFAC1F9B8C850042AB22 /* StringMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA15DFAB1F9B8C850042AB22 /* StringMap.cpp */; };\n\t\tFA15DFAD1F9B8CBA0042AB22 /* StringMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA15DFAB1F9B8C850042AB22 /* StringMap.cpp */; };\n\t\tFA15DFAE1F9B8D360042AB22 /* lutf8lib.c in Sources */ = {isa = PBXBuildFile; fileRef = FAAA3FD61F64B3AD00F89E99 /* lutf8lib.c */; };\n\t\tFA15DFAF1F9B8D390042AB22 /* lstrlib.c in Sources */ = {isa = PBXBuildFile; fileRef = FAAA3FD41F64B3AD00F89E99 /* lstrlib.c */; };\n\t\tFA15DFB01F9B8D6A0042AB22 /* wrap_Data.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA6A2B651F5F7B6B0074C308 /* wrap_Data.cpp */; };\n\t\tFA15DFB11F9B8D820042AB22 /* OggDemuxer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAA54AC91F91660400A8FA7B /* OggDemuxer.cpp */; };\n\t\tFA15DFB21F9B8D840042AB22 /* TheoraVideoStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAA54AC81F91660400A8FA7B /* TheoraVideoStream.cpp */; };\n\t\tFA18CEC523D3AE6700263725 /* wrap_Buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA18CEC323D3AE6700263725 /* wrap_Buffer.cpp */; };\n\t\tFA18CEC623D3AE6800263725 /* wrap_Buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA18CEC323D3AE6700263725 /* wrap_Buffer.cpp */; };\n\t\tFA18CEC723D3AE6800263725 /* wrap_Buffer.h in Headers */ = {isa = PBXBuildFile; fileRef = FA18CEC423D3AE6700263725 /* wrap_Buffer.h */; };\n\t\tFA18CED723DBC6E000263725 /* Shader.h in Headers */ = {isa = PBXBuildFile; fileRef = FA18CECD23DBC6E000263725 /* Shader.h */; };\n\t\tFA18CED823DBC6E000263725 /* StreamBuffer.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA18CECE23DBC6E000263725 /* StreamBuffer.mm */; };\n\t\tFA18CED923DBC6E000263725 /* StreamBuffer.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA18CECE23DBC6E000263725 /* StreamBuffer.mm */; };\n\t\tFA18CEDC23DBC6E000263725 /* Metal.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA18CED023DBC6E000263725 /* Metal.mm */; };\n\t\tFA18CEDD23DBC6E000263725 /* Metal.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA18CED023DBC6E000263725 /* Metal.mm */; };\n\t\tFA18CEDE23DBC6E000263725 /* Shader.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA18CED123DBC6E000263725 /* Shader.mm */; };\n\t\tFA18CEDF23DBC6E000263725 /* Shader.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA18CED123DBC6E000263725 /* Shader.mm */; };\n\t\tFA18CEE023DBC6E000263725 /* StreamBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = FA18CED223DBC6E000263725 /* StreamBuffer.h */; };\n\t\tFA18CEE123DBC6E000263725 /* Graphics.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA18CED323DBC6E000263725 /* Graphics.mm */; };\n\t\tFA18CEE223DBC6E000263725 /* Graphics.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA18CED323DBC6E000263725 /* Graphics.mm */; };\n\t\tFA18CEE323DBC6E000263725 /* Metal.h in Headers */ = {isa = PBXBuildFile; fileRef = FA18CED423DBC6E000263725 /* Metal.h */; };\n\t\tFA18CEE423DBC6E000263725 /* Graphics.h in Headers */ = {isa = PBXBuildFile; fileRef = FA18CED523DBC6E000263725 /* Graphics.h */; };\n\t\tFA18CEE723DBC6F700263725 /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA18CEE623DBC6F700263725 /* Metal.framework */; };\n\t\tFA18CEE923DBC8D400263725 /* Buffer.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA18CEE823DBC8D400263725 /* Buffer.mm */; };\n\t\tFA18CEEA23DBC8D400263725 /* Buffer.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA18CEE823DBC8D400263725 /* Buffer.mm */; };\n\t\tFA18CEEF23DC9B3E00263725 /* Texture.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA18CEED23DC9B3E00263725 /* Texture.mm */; };\n\t\tFA18CEF023DC9B3E00263725 /* Texture.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA18CEED23DC9B3E00263725 /* Texture.mm */; };\n\t\tFA18CF1623DCF67900263725 /* spirv_parser.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FA18CEF223DCF67800263725 /* spirv_parser.hpp */; };\n\t\tFA18CF1723DCF67900263725 /* spirv_glsl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA18CEF323DCF67800263725 /* spirv_glsl.cpp */; };\n\t\tFA18CF1823DCF67900263725 /* spirv_glsl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA18CEF323DCF67800263725 /* spirv_glsl.cpp */; };\n\t\tFA18CF1923DCF67900263725 /* spirv_cross_error_handling.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FA18CEF423DCF67800263725 /* spirv_cross_error_handling.hpp */; };\n\t\tFA18CF1A23DCF67900263725 /* barrier.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FA18CEF723DCF67800263725 /* barrier.hpp */; };\n\t\tFA18CF1B23DCF67900263725 /* thread_group.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FA18CEF823DCF67800263725 /* thread_group.hpp */; };\n\t\tFA18CF1C23DCF67900263725 /* internal_interface.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FA18CEF923DCF67800263725 /* internal_interface.hpp */; };\n\t\tFA18CF1D23DCF67900263725 /* sampler.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FA18CEFA23DCF67800263725 /* sampler.hpp */; };\n\t\tFA18CF1E23DCF67900263725 /* external_interface.h in Headers */ = {isa = PBXBuildFile; fileRef = FA18CEFB23DCF67800263725 /* external_interface.h */; };\n\t\tFA18CF2023DCF67900263725 /* spirv_hlsl.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FA18CEFD23DCF67800263725 /* spirv_hlsl.hpp */; };\n\t\tFA18CF2123DCF67900263725 /* spirv.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FA18CEFE23DCF67800263725 /* spirv.hpp */; };\n\t\tFA18CF2223DCF67900263725 /* spirv_cfg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA18CEFF23DCF67800263725 /* spirv_cfg.cpp */; };\n\t\tFA18CF2323DCF67900263725 /* spirv_cfg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA18CEFF23DCF67800263725 /* spirv_cfg.cpp */; };\n\t\tFA18CF2423DCF67900263725 /* spirv_cpp.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FA18CF0023DCF67800263725 /* spirv_cpp.hpp */; };\n\t\tFA18CF2523DCF67900263725 /* spirv_cross_parsed_ir.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FA18CF0123DCF67800263725 /* spirv_cross_parsed_ir.hpp */; };\n\t\tFA18CF2623DCF67900263725 /* spirv_reflect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA18CF0223DCF67800263725 /* spirv_reflect.cpp */; };\n\t\tFA18CF2723DCF67900263725 /* spirv_reflect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA18CF0223DCF67800263725 /* spirv_reflect.cpp */; };\n\t\tFA18CF2823DCF67900263725 /* spirv_msl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA18CF0323DCF67800263725 /* spirv_msl.cpp */; };\n\t\tFA18CF2923DCF67900263725 /* spirv_msl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA18CF0323DCF67800263725 /* spirv_msl.cpp */; };\n\t\tFA18CF2A23DCF67900263725 /* spirv_cross_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA18CF0423DCF67800263725 /* spirv_cross_util.cpp */; };\n\t\tFA18CF2B23DCF67900263725 /* spirv_cross_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA18CF0423DCF67800263725 /* spirv_cross_util.cpp */; };\n\t\tFA18CF2C23DCF67900263725 /* spirv_cross.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA18CF0523DCF67800263725 /* spirv_cross.cpp */; };\n\t\tFA18CF2D23DCF67900263725 /* spirv_cross.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA18CF0523DCF67800263725 /* spirv_cross.cpp */; };\n\t\tFA18CF3023DCF67900263725 /* spirv_hlsl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA18CF0723DCF67800263725 /* spirv_hlsl.cpp */; };\n\t\tFA18CF3123DCF67900263725 /* spirv_hlsl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA18CF0723DCF67800263725 /* spirv_hlsl.cpp */; };\n\t\tFA18CF3223DCF67900263725 /* spirv_cfg.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FA18CF0823DCF67800263725 /* spirv_cfg.hpp */; };\n\t\tFA18CF3323DCF67900263725 /* spirv_cpp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA18CF0923DCF67800263725 /* spirv_cpp.cpp */; };\n\t\tFA18CF3423DCF67900263725 /* spirv_cpp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA18CF0923DCF67800263725 /* spirv_cpp.cpp */; };\n\t\tFA18CF3523DCF67900263725 /* spirv_cross_parsed_ir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA18CF0A23DCF67800263725 /* spirv_cross_parsed_ir.cpp */; };\n\t\tFA18CF3623DCF67900263725 /* spirv_cross_parsed_ir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA18CF0A23DCF67800263725 /* spirv_cross_parsed_ir.cpp */; };\n\t\tFA18CF3923DCF67900263725 /* spirv_msl.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FA18CF0D23DCF67800263725 /* spirv_msl.hpp */; };\n\t\tFA18CF3A23DCF67900263725 /* spirv_reflect.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FA18CF0E23DCF67800263725 /* spirv_reflect.hpp */; };\n\t\tFA18CF3B23DCF67900263725 /* spirv_cross_util.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FA18CF0F23DCF67800263725 /* spirv_cross_util.hpp */; };\n\t\tFA18CF3C23DCF67900263725 /* spirv_cross.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FA18CF1023DCF67800263725 /* spirv_cross.hpp */; };\n\t\tFA18CF3D23DCF67900263725 /* GLSL.std.450.h in Headers */ = {isa = PBXBuildFile; fileRef = FA18CF1123DCF67800263725 /* GLSL.std.450.h */; };\n\t\tFA18CF3E23DCF67900263725 /* spirv_cross_containers.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FA18CF1223DCF67800263725 /* spirv_cross_containers.hpp */; };\n\t\tFA18CF3F23DCF67900263725 /* spirv_parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA18CF1323DCF67800263725 /* spirv_parser.cpp */; };\n\t\tFA18CF4023DCF67900263725 /* spirv_parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA18CF1323DCF67800263725 /* spirv_parser.cpp */; };\n\t\tFA18CF4123DCF67900263725 /* spirv_common.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FA18CF1423DCF67800263725 /* spirv_common.hpp */; };\n\t\tFA18CF4223DCF67900263725 /* spirv_glsl.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FA18CF1523DCF67800263725 /* spirv_glsl.hpp */; };\n\t\tFA18CF4523DD1A8100263725 /* ShaderStage.h in Headers */ = {isa = PBXBuildFile; fileRef = FA18CF4323DD1A8000263725 /* ShaderStage.h */; };\n\t\tFA18CF4623DD1A8100263725 /* ShaderStage.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA18CF4423DD1A8000263725 /* ShaderStage.mm */; };\n\t\tFA18CF4723DD1A8100263725 /* ShaderStage.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA18CF4423DD1A8000263725 /* ShaderStage.mm */; };\n\t\tFA1BA09D1E16CFCE00AA2803 /* Font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA1BA09B1E16CFCE00AA2803 /* Font.cpp */; };\n\t\tFA1BA09E1E16CFCE00AA2803 /* Font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA1BA09B1E16CFCE00AA2803 /* Font.cpp */; };\n\t\tFA1BA09F1E16CFCE00AA2803 /* Font.h in Headers */ = {isa = PBXBuildFile; fileRef = FA1BA09C1E16CFCE00AA2803 /* Font.h */; };\n\t\tFA1BA0A21E16D97500AA2803 /* wrap_Font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA1BA0A01E16D97500AA2803 /* wrap_Font.cpp */; };\n\t\tFA1BA0A31E16D97500AA2803 /* wrap_Font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA1BA0A01E16D97500AA2803 /* wrap_Font.cpp */; };\n\t\tFA1BA0A41E16D97500AA2803 /* wrap_Font.h in Headers */ = {isa = PBXBuildFile; fileRef = FA1BA0A11E16D97500AA2803 /* wrap_Font.h */; };\n\t\tFA1BA0B11E16FD0800AA2803 /* Shader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA1BA0AF1E16FD0800AA2803 /* Shader.cpp */; };\n\t\tFA1BA0B21E16FD0800AA2803 /* Shader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA1BA0AF1E16FD0800AA2803 /* Shader.cpp */; };\n\t\tFA1BA0B31E16FD0800AA2803 /* Shader.h in Headers */ = {isa = PBXBuildFile; fileRef = FA1BA0B01E16FD0800AA2803 /* Shader.h */; };\n\t\tFA1BA0B71E17043400AA2803 /* wrap_Shader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA1BA0B51E17043400AA2803 /* wrap_Shader.cpp */; };\n\t\tFA1BA0B81E17043400AA2803 /* wrap_Shader.h in Headers */ = {isa = PBXBuildFile; fileRef = FA1BA0B61E17043400AA2803 /* wrap_Shader.h */; };\n\t\tFA1E887E1DF363CD00E808AA /* Filter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA1E887C1DF363CD00E808AA /* Filter.cpp */; };\n\t\tFA1E887F1DF363CD00E808AA /* Filter.h in Headers */ = {isa = PBXBuildFile; fileRef = FA1E887D1DF363CD00E808AA /* Filter.h */; };\n\t\tFA1E88801DF363D400E808AA /* Filter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA1E887C1DF363CD00E808AA /* Filter.cpp */; };\n\t\tFA1E88831DF363DB00E808AA /* Filter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA1E88811DF363DB00E808AA /* Filter.cpp */; };\n\t\tFA1E88841DF363DB00E808AA /* Filter.h in Headers */ = {isa = PBXBuildFile; fileRef = FA1E88821DF363DB00E808AA /* Filter.h */; };\n\t\tFA1E88851DF363E100E808AA /* Filter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA1E88811DF363DB00E808AA /* Filter.cpp */; };\n\t\tFA24348621D401CB00B8918A /* attribute.h in Headers */ = {isa = PBXBuildFile; fileRef = FA24348121D401CB00B8918A /* attribute.h */; };\n\t\tFA24348721D401CB00B8918A /* attribute.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA24348221D401CB00B8918A /* attribute.cpp */; };\n\t\tFA24348821D401CB00B8918A /* attribute.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA24348221D401CB00B8918A /* attribute.cpp */; };\n\t\tFA24348921D401CB00B8918A /* pch.h in Headers */ = {isa = PBXBuildFile; fileRef = FA24348321D401CB00B8918A /* pch.h */; };\n\t\tFA27B39D1B498151008A9DCE /* Video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA27B38A1B498151008A9DCE /* Video.cpp */; };\n\t\tFA27B39E1B498151008A9DCE /* Video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA27B38A1B498151008A9DCE /* Video.cpp */; };\n\t\tFA27B39F1B498151008A9DCE /* Video.h in Headers */ = {isa = PBXBuildFile; fileRef = FA27B38B1B498151008A9DCE /* Video.h */; };\n\t\tFA27B3A91B498151008A9DCE /* Video.h in Headers */ = {isa = PBXBuildFile; fileRef = FA27B3931B498151008A9DCE /* Video.h */; };\n\t\tFA27B3AA1B498151008A9DCE /* VideoStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA27B3941B498151008A9DCE /* VideoStream.cpp */; };\n\t\tFA27B3AB1B498151008A9DCE /* VideoStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA27B3941B498151008A9DCE /* VideoStream.cpp */; };\n\t\tFA27B3AC1B498151008A9DCE /* VideoStream.h in Headers */ = {isa = PBXBuildFile; fileRef = FA27B3951B498151008A9DCE /* VideoStream.h */; };\n\t\tFA27B3B31B498151008A9DCE /* wrap_Video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA27B39B1B498151008A9DCE /* wrap_Video.cpp */; };\n\t\tFA27B3B41B498151008A9DCE /* wrap_Video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA27B39B1B498151008A9DCE /* wrap_Video.cpp */; };\n\t\tFA27B3B51B498151008A9DCE /* wrap_Video.h in Headers */ = {isa = PBXBuildFile; fileRef = FA27B39C1B498151008A9DCE /* wrap_Video.h */; };\n\t\tFA27B3C01B4985BF008A9DCE /* wrap_VideoStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA27B3B91B4985BF008A9DCE /* wrap_VideoStream.cpp */; };\n\t\tFA27B3C11B4985BF008A9DCE /* wrap_VideoStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA27B3B91B4985BF008A9DCE /* wrap_VideoStream.cpp */; };\n\t\tFA27B3C21B4985BF008A9DCE /* wrap_VideoStream.h in Headers */ = {isa = PBXBuildFile; fileRef = FA27B3BA1B4985BF008A9DCE /* wrap_VideoStream.h */; };\n\t\tFA27B3C91B498623008A9DCE /* theora.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA27B3C81B498623008A9DCE /* theora.framework */; };\n\t\tFA28EBD51E352DB5003446F4 /* FenceSync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA28EBD31E352DB5003446F4 /* FenceSync.cpp */; };\n\t\tFA28EBD61E352DB5003446F4 /* FenceSync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA28EBD31E352DB5003446F4 /* FenceSync.cpp */; };\n\t\tFA28EBD71E352DB5003446F4 /* FenceSync.h in Headers */ = {isa = PBXBuildFile; fileRef = FA28EBD41E352DB5003446F4 /* FenceSync.h */; };\n\t\tFA29C0051E12355B00268CD8 /* StreamBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA29C0041E12355B00268CD8 /* StreamBuffer.cpp */; };\n\t\tFA29C0061E12355B00268CD8 /* StreamBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA29C0041E12355B00268CD8 /* StreamBuffer.cpp */; };\n\t\tFA2AF6741DAD64970032B62C /* vertex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA2AF6731DAD64970032B62C /* vertex.cpp */; };\n\t\tFA2AF6751DAD64970032B62C /* vertex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA2AF6731DAD64970032B62C /* vertex.cpp */; };\n\t\tFA3C5E421F8C368C0003C579 /* ShaderStage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA3C5E401F8C368C0003C579 /* ShaderStage.cpp */; };\n\t\tFA3C5E431F8C368C0003C579 /* ShaderStage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA3C5E401F8C368C0003C579 /* ShaderStage.cpp */; };\n\t\tFA3C5E441F8C368C0003C579 /* ShaderStage.h in Headers */ = {isa = PBXBuildFile; fileRef = FA3C5E411F8C368C0003C579 /* ShaderStage.h */; };\n\t\tFA3C5E471F8D80CA0003C579 /* ShaderStage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA3C5E451F8D80CA0003C579 /* ShaderStage.cpp */; };\n\t\tFA3C5E481F8D80CA0003C579 /* ShaderStage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA3C5E451F8D80CA0003C579 /* ShaderStage.cpp */; };\n\t\tFA3C5E491F8D80CA0003C579 /* ShaderStage.h in Headers */ = {isa = PBXBuildFile; fileRef = FA3C5E461F8D80CA0003C579 /* ShaderStage.h */; };\n\t\tFA41A3C81C0A1F950084430C /* ASTCHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA41A3C61C0A1F950084430C /* ASTCHandler.cpp */; };\n\t\tFA41A3C91C0A1F950084430C /* ASTCHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA41A3C61C0A1F950084430C /* ASTCHandler.cpp */; };\n\t\tFA41A3CA1C0A1F950084430C /* ASTCHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = FA41A3C71C0A1F950084430C /* ASTCHandler.h */; };\n\t\tFA4B66C91ABBCF1900558F15 /* Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA4B66C81ABBCF1900558F15 /* Timer.cpp */; };\n\t\tFA4B66CA1ABBCF1900558F15 /* Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA4B66C81ABBCF1900558F15 /* Timer.cpp */; };\n\t\tFA4F2B791DE0125B00CA37D7 /* xxhash.c in Sources */ = {isa = PBXBuildFile; fileRef = FA4F2B771DE0125B00CA37D7 /* xxhash.c */; };\n\t\tFA4F2B7A1DE0125B00CA37D7 /* xxhash.h in Headers */ = {isa = PBXBuildFile; fileRef = FA4F2B781DE0125B00CA37D7 /* xxhash.h */; };\n\t\tFA4F2B7B1DE0181B00CA37D7 /* xxhash.c in Sources */ = {isa = PBXBuildFile; fileRef = FA4F2B771DE0125B00CA37D7 /* xxhash.c */; };\n\t\tFA4F2BA61DE1E36400CA37D7 /* RecordingDevice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA4F2BA21DE1E36400CA37D7 /* RecordingDevice.cpp */; };\n\t\tFA4F2BA71DE1E36400CA37D7 /* RecordingDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = FA4F2BA31DE1E36400CA37D7 /* RecordingDevice.h */; };\n\t\tFA4F2BA81DE1E36400CA37D7 /* wrap_RecordingDevice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA4F2BA41DE1E36400CA37D7 /* wrap_RecordingDevice.cpp */; };\n\t\tFA4F2BA91DE1E36400CA37D7 /* wrap_RecordingDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = FA4F2BA51DE1E36400CA37D7 /* wrap_RecordingDevice.h */; };\n\t\tFA4F2BAC1DE1E37000CA37D7 /* RecordingDevice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA4F2BAA1DE1E37000CA37D7 /* RecordingDevice.cpp */; };\n\t\tFA4F2BAD1DE1E37000CA37D7 /* RecordingDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = FA4F2BAB1DE1E37000CA37D7 /* RecordingDevice.h */; };\n\t\tFA4F2BB01DE1E37B00CA37D7 /* RecordingDevice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA4F2BAE1DE1E37B00CA37D7 /* RecordingDevice.cpp */; };\n\t\tFA4F2BB11DE1E37B00CA37D7 /* RecordingDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = FA4F2BAF1DE1E37B00CA37D7 /* RecordingDevice.h */; };\n\t\tFA4F2BB21DE1E4B400CA37D7 /* RecordingDevice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA4F2BAE1DE1E37B00CA37D7 /* RecordingDevice.cpp */; };\n\t\tFA4F2BB31DE1E4B800CA37D7 /* RecordingDevice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA4F2BA21DE1E36400CA37D7 /* RecordingDevice.cpp */; };\n\t\tFA4F2BB41DE1E4BD00CA37D7 /* RecordingDevice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA4F2BAA1DE1E37000CA37D7 /* RecordingDevice.cpp */; };\n\t\tFA4F2BB51DE1E4C300CA37D7 /* wrap_RecordingDevice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA4F2BA41DE1E36400CA37D7 /* wrap_RecordingDevice.cpp */; };\n\t\tFA4F2BE31DE6650600CA37D7 /* Transform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA4F2BDF1DE6650600CA37D7 /* Transform.cpp */; };\n\t\tFA4F2BE41DE6650600CA37D7 /* Transform.h in Headers */ = {isa = PBXBuildFile; fileRef = FA4F2BE01DE6650600CA37D7 /* Transform.h */; };\n\t\tFA4F2BE51DE6650600CA37D7 /* wrap_Transform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA4F2BE11DE6650600CA37D7 /* wrap_Transform.cpp */; };\n\t\tFA4F2BE61DE6650600CA37D7 /* wrap_Transform.h in Headers */ = {isa = PBXBuildFile; fileRef = FA4F2BE21DE6650600CA37D7 /* wrap_Transform.h */; };\n\t\tFA4F2BE71DE6650D00CA37D7 /* Transform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA4F2BDF1DE6650600CA37D7 /* Transform.cpp */; };\n\t\tFA4F2BE81DE6651000CA37D7 /* wrap_Transform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA4F2BE11DE6650600CA37D7 /* wrap_Transform.cpp */; };\n\t\tFA4F2C031DE936C200CA37D7 /* auxiliar.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFB9D1D9F6D490055D849 /* auxiliar.c */; };\n\t\tFA4F2C041DE936C600CA37D7 /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFB9F1D9F6D490055D849 /* buffer.c */; };\n\t\tFA4F2C051DE936C900CA37D7 /* compat.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBA11D9F6D490055D849 /* compat.c */; };\n\t\tFA4F2C061DE936CD00CA37D7 /* except.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBA31D9F6D490055D849 /* except.c */; };\n\t\tFA4F2C071DE936DA00CA37D7 /* inet.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBAB1D9F6D490055D849 /* inet.c */; };\n\t\tFA4F2C081DE936DD00CA37D7 /* io.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBAD1D9F6D490055D849 /* io.c */; };\n\t\tFA4F2C091DE936E200CA37D7 /* luasocket.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBB11D9F6D490055D849 /* luasocket.c */; };\n\t\tFA4F2C0A1DE936E600CA37D7 /* mime.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBB61D9F6D490055D849 /* mime.c */; };\n\t\tFA4F2C0B1DE936EA00CA37D7 /* options.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBBA1D9F6D490055D849 /* options.c */; };\n\t\tFA4F2C0C1DE936ED00CA37D7 /* select.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBBD1D9F6D490055D849 /* select.c */; };\n\t\tFA4F2C0D1DE936F100CA37D7 /* serial.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBBF1D9F6D490055D849 /* serial.c */; };\n\t\tFA4F2C0E1DE936FE00CA37D7 /* tcp.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBC51D9F6D490055D849 /* tcp.c */; };\n\t\tFA4F2C0F1DE936FE00CA37D7 /* timeout.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBC71D9F6D490055D849 /* timeout.c */; };\n\t\tFA4F2C101DE936FE00CA37D7 /* udp.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBCB1D9F6D490055D849 /* udp.c */; };\n\t\tFA4F2C111DE936FE00CA37D7 /* unix.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBCD1D9F6D490055D849 /* unix.c */; };\n\t\tFA4F2C141DE936FE00CA37D7 /* usocket.c in Sources */ = {isa = PBXBuildFile; fileRef = 217DFBD51D9F6D490055D849 /* usocket.c */; };\n\t\tFA522D4D23F9FE380059EE3C /* MP3Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA522D4B23F9FE370059EE3C /* MP3Decoder.cpp */; };\n\t\tFA522D4E23F9FE380059EE3C /* MP3Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA522D4B23F9FE370059EE3C /* MP3Decoder.cpp */; };\n\t\tFA522D4F23F9FE380059EE3C /* MP3Decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = FA522D4C23F9FE380059EE3C /* MP3Decoder.h */; };\n\t\tFA522D5323F9FF2A0059EE3C /* dr_mp3.h in Headers */ = {isa = PBXBuildFile; fileRef = FA522D5123F9FF2A0059EE3C /* dr_mp3.h */; };\n\t\tFA522D5423F9FF2A0059EE3C /* dr_flac.h in Headers */ = {isa = PBXBuildFile; fileRef = FA522D5223F9FF2A0059EE3C /* dr_flac.h */; };\n\t\tFA522D5A23FA5ED50059EE3C /* NotoSans-Regular.ttf.gzip.h in Headers */ = {isa = PBXBuildFile; fileRef = FA522D5923FA5ED40059EE3C /* NotoSans-Regular.ttf.gzip.h */; };\n\t\tFA56AA381FAFF02000A43D5F /* memory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA56AA361FAFF02000A43D5F /* memory.cpp */; };\n\t\tFA56AA391FAFF02000A43D5F /* memory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA56AA361FAFF02000A43D5F /* memory.cpp */; };\n\t\tFA56AA3A1FAFF02000A43D5F /* memory.h in Headers */ = {isa = PBXBuildFile; fileRef = FA56AA371FAFF02000A43D5F /* memory.h */; };\n\t\tFA577AB016C7507900860150 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA577A7916C71A1700860150 /* Cocoa.framework */; };\n\t\tFA577AC516C7513400860150 /* libmodplug.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA577A8216C71A5300860150 /* libmodplug.framework */; };\n\t\tFA577AC816C7513C00860150 /* ogg.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA577A7116C719F400860150 /* ogg.framework */; };\n\t\tFA577ACA16C7514100860150 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA577A7C16C71A2600860150 /* OpenGL.framework */; };\n\t\tFA577ACD16C7514C00860150 /* vorbis.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA577A7716C71A0800860150 /* vorbis.framework */; };\n\t\tFA57FB981AE1993600F2AD6D /* noise1234.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA57FB961AE1993600F2AD6D /* noise1234.cpp */; };\n\t\tFA57FB991AE1993600F2AD6D /* noise1234.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA57FB961AE1993600F2AD6D /* noise1234.cpp */; };\n\t\tFA57FB9A1AE1993600F2AD6D /* noise1234.h in Headers */ = {isa = PBXBuildFile; fileRef = FA57FB971AE1993600F2AD6D /* noise1234.h */; };\n\t\tFA59A2D31C06481400328DBA /* ParticleSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAE272501C05A15B00A67640 /* ParticleSystem.cpp */; };\n\t\tFA620A321AA2F8DB005DB4C2 /* wrap_Quad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA620A2E1AA2F8DB005DB4C2 /* wrap_Quad.cpp */; };\n\t\tFA620A331AA2F8DB005DB4C2 /* wrap_Quad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA620A2E1AA2F8DB005DB4C2 /* wrap_Quad.cpp */; };\n\t\tFA620A341AA2F8DB005DB4C2 /* wrap_Quad.h in Headers */ = {isa = PBXBuildFile; fileRef = FA620A2F1AA2F8DB005DB4C2 /* wrap_Quad.h */; };\n\t\tFA620A351AA2F8DB005DB4C2 /* wrap_Texture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA620A301AA2F8DB005DB4C2 /* wrap_Texture.cpp */; };\n\t\tFA620A361AA2F8DB005DB4C2 /* wrap_Texture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA620A301AA2F8DB005DB4C2 /* wrap_Texture.cpp */; };\n\t\tFA620A371AA2F8DB005DB4C2 /* wrap_Texture.h in Headers */ = {isa = PBXBuildFile; fileRef = FA620A311AA2F8DB005DB4C2 /* wrap_Texture.h */; };\n\t\tFA620A3A1AA305F6005DB4C2 /* types.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA620A391AA305F6005DB4C2 /* types.cpp */; };\n\t\tFA620A3B1AA305F6005DB4C2 /* types.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA620A391AA305F6005DB4C2 /* types.cpp */; };\n\t\tFA6A2B661F5F7B6B0074C308 /* wrap_Data.h in Headers */ = {isa = PBXBuildFile; fileRef = FA6A2B641F5F7B6B0074C308 /* wrap_Data.h */; };\n\t\tFA6A2B671F5F7B6B0074C308 /* wrap_Data.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA6A2B651F5F7B6B0074C308 /* wrap_Data.cpp */; };\n\t\tFA6A2B6A1F5F7F560074C308 /* DataView.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA6A2B681F5F7F560074C308 /* DataView.cpp */; };\n\t\tFA6A2B6B1F5F7F560074C308 /* DataView.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA6A2B681F5F7F560074C308 /* DataView.cpp */; };\n\t\tFA6A2B6C1F5F7F560074C308 /* DataView.h in Headers */ = {isa = PBXBuildFile; fileRef = FA6A2B691F5F7F560074C308 /* DataView.h */; };\n\t\tFA6A2B6F1F5F845F0074C308 /* wrap_DataView.h in Headers */ = {isa = PBXBuildFile; fileRef = FA6A2B6D1F5F845F0074C308 /* wrap_DataView.h */; };\n\t\tFA6A2B701F5F845F0074C308 /* wrap_DataView.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA6A2B6E1F5F845F0074C308 /* wrap_DataView.cpp */; };\n\t\tFA6A2B711F5F845F0074C308 /* wrap_DataView.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA6A2B6E1F5F845F0074C308 /* wrap_DataView.cpp */; };\n\t\tFA6A2B741F60B6710074C308 /* ByteData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA6A2B721F60B6710074C308 /* ByteData.cpp */; };\n\t\tFA6A2B751F60B6710074C308 /* ByteData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA6A2B721F60B6710074C308 /* ByteData.cpp */; };\n\t\tFA6A2B761F60B6710074C308 /* ByteData.h in Headers */ = {isa = PBXBuildFile; fileRef = FA6A2B731F60B6710074C308 /* ByteData.h */; };\n\t\tFA6A2B791F60B8250074C308 /* wrap_ByteData.h in Headers */ = {isa = PBXBuildFile; fileRef = FA6A2B771F60B8250074C308 /* wrap_ByteData.h */; };\n\t\tFA6A2B7A1F60B8250074C308 /* wrap_ByteData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA6A2B781F60B8250074C308 /* wrap_ByteData.cpp */; };\n\t\tFA6A2B7B1F60B8250074C308 /* wrap_ByteData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA6A2B781F60B8250074C308 /* wrap_ByteData.cpp */; };\n\t\tFA6BDE5C1F31725300786805 /* Color.h in Headers */ = {isa = PBXBuildFile; fileRef = FA6BDE5B1F31725300786805 /* Color.h */; };\n\t\tFA6BDF89280B62A000240F2A /* GraphicsReadback.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA6BDF88280B62A000240F2A /* GraphicsReadback.mm */; };\n\t\tFA6BDF8A280B62A000240F2A /* GraphicsReadback.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA6BDF88280B62A000240F2A /* GraphicsReadback.mm */; };\n\t\tFA6BDF8E281219E900240F2A /* DataStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA6BDF8C281219E900240F2A /* DataStream.cpp */; };\n\t\tFA6BDF8F281219E900240F2A /* DataStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA6BDF8C281219E900240F2A /* DataStream.cpp */; };\n\t\tFA6BDF90281219E900240F2A /* DataStream.h in Headers */ = {isa = PBXBuildFile; fileRef = FA6BDF8D281219E900240F2A /* DataStream.h */; };\n\t\tFA76344A1E28722A0066EF9E /* StreamBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA7634481E28722A0066EF9E /* StreamBuffer.cpp */; };\n\t\tFA76344B1E28722A0066EF9E /* StreamBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA7634481E28722A0066EF9E /* StreamBuffer.cpp */; };\n\t\tFA76344C1E28722A0066EF9E /* StreamBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = FA7634491E28722A0066EF9E /* StreamBuffer.h */; };\n\t\tFA7E9207277E120900C24CB2 /* theora.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA7E9206277E120900C24CB2 /* theora.xcframework */; };\n\t\tFA84DE612778D7F3002674C6 /* SpirvIntrinsics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA84DE602778D7F3002674C6 /* SpirvIntrinsics.cpp */; };\n\t\tFA84DE622778D7F3002674C6 /* SpirvIntrinsics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA84DE602778D7F3002674C6 /* SpirvIntrinsics.cpp */; };\n\t\tFA84DE6627791C36002674C6 /* GraphicsReadback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA84DE6427791C36002674C6 /* GraphicsReadback.cpp */; };\n\t\tFA84DE6727791C36002674C6 /* GraphicsReadback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA84DE6427791C36002674C6 /* GraphicsReadback.cpp */; };\n\t\tFA84DE6827791C36002674C6 /* GraphicsReadback.h in Headers */ = {isa = PBXBuildFile; fileRef = FA84DE6527791C36002674C6 /* GraphicsReadback.h */; };\n\t\tFA84DE6B277943F6002674C6 /* GraphicsReadback.h in Headers */ = {isa = PBXBuildFile; fileRef = FA84DE69277943F6002674C6 /* GraphicsReadback.h */; };\n\t\tFA84DE6C277943F6002674C6 /* GraphicsReadback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA84DE6A277943F6002674C6 /* GraphicsReadback.cpp */; };\n\t\tFA84DE6D277943F6002674C6 /* GraphicsReadback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA84DE6A277943F6002674C6 /* GraphicsReadback.cpp */; };\n\t\tFA84DE7127795E22002674C6 /* wrap_GraphicsReadback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA84DE6F27795E22002674C6 /* wrap_GraphicsReadback.cpp */; };\n\t\tFA84DE7227795E22002674C6 /* wrap_GraphicsReadback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA84DE6F27795E22002674C6 /* wrap_GraphicsReadback.cpp */; };\n\t\tFA84DE7A277D4C88002674C6 /* modplug.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA84DE79277D4C88002674C6 /* modplug.xcframework */; };\n\t\tFA84DE7C277E045E002674C6 /* ogg.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA84DE7B277E045E002674C6 /* ogg.xcframework */; };\n\t\tFA84DE7E277E0A43002674C6 /* vorbis.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA84DE7D277E0A43002674C6 /* vorbis.xcframework */; };\n\t\tFA8951A21AA2EDF300EC385A /* wrap_Event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA8951A01AA2EDF300EC385A /* wrap_Event.cpp */; };\n\t\tFA8951A31AA2EDF300EC385A /* wrap_Event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA8951A01AA2EDF300EC385A /* wrap_Event.cpp */; };\n\t\tFA8951A41AA2EDF300EC385A /* wrap_Event.h in Headers */ = {isa = PBXBuildFile; fileRef = FA8951A11AA2EDF300EC385A /* wrap_Event.h */; };\n\t\tFA91DA8B1F377C3900C80E33 /* deprecation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA91DA891F377C3900C80E33 /* deprecation.cpp */; };\n\t\tFA91DA8C1F377C3900C80E33 /* deprecation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA91DA891F377C3900C80E33 /* deprecation.cpp */; };\n\t\tFA91DA8D1F377C3900C80E33 /* deprecation.h in Headers */ = {isa = PBXBuildFile; fileRef = FA91DA8A1F377C3900C80E33 /* deprecation.h */; };\n\t\tFA93C4531F315B960087CCD4 /* FormatHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = FA93C4501F315B960087CCD4 /* FormatHandler.h */; };\n\t\tFA93C4541F315B960087CCD4 /* FormatHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA93C4511F315B960087CCD4 /* FormatHandler.cpp */; };\n\t\tFA94727827A6EE1B00817677 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA94725227A6EE1B00817677 /* main.cpp */; };\n\t\tFA94727927A6EE1B00817677 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA94725227A6EE1B00817677 /* main.cpp */; };\n\t\tFA94727A27A6EE1B00817677 /* Connection.h in Headers */ = {isa = PBXBuildFile; fileRef = FA94725427A6EE1B00817677 /* Connection.h */; };\n\t\tFA94727B27A6EE1B00817677 /* HTTPSClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA94725527A6EE1B00817677 /* HTTPSClient.cpp */; };\n\t\tFA94727C27A6EE1B00817677 /* HTTPSClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA94725527A6EE1B00817677 /* HTTPSClient.cpp */; };\n\t\tFA94727D27A6EE1B00817677 /* HTTPSClient.h in Headers */ = {isa = PBXBuildFile; fileRef = FA94725627A6EE1B00817677 /* HTTPSClient.h */; };\n\t\tFA94727E27A6EE1B00817677 /* PlaintextConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = FA94725727A6EE1B00817677 /* PlaintextConnection.h */; };\n\t\tFA94727F27A6EE1B00817677 /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = FA94725827A6EE1B00817677 /* config.h */; };\n\t\tFA94728127A6EE1B00817677 /* HTTPS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA94725A27A6EE1B00817677 /* HTTPS.cpp */; };\n\t\tFA94728227A6EE1B00817677 /* HTTPS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA94725A27A6EE1B00817677 /* HTTPS.cpp */; };\n\t\tFA94728327A6EE1B00817677 /* HTTPRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = FA94725B27A6EE1B00817677 /* HTTPRequest.h */; };\n\t\tFA94728427A6EE1B00817677 /* ConnectionClient.h in Headers */ = {isa = PBXBuildFile; fileRef = FA94725C27A6EE1B00817677 /* ConnectionClient.h */; };\n\t\tFA94728527A6EE1B00817677 /* PlaintextConnection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA94725D27A6EE1B00817677 /* PlaintextConnection.cpp */; };\n\t\tFA94728627A6EE1B00817677 /* PlaintextConnection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA94725D27A6EE1B00817677 /* PlaintextConnection.cpp */; };\n\t\tFA94728727A6EE1B00817677 /* HTTPS.h in Headers */ = {isa = PBXBuildFile; fileRef = FA94725E27A6EE1B00817677 /* HTTPS.h */; };\n\t\tFA94728827A6EE1B00817677 /* HTTPRequest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA94725F27A6EE1B00817677 /* HTTPRequest.cpp */; };\n\t\tFA94728927A6EE1B00817677 /* HTTPRequest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA94725F27A6EE1B00817677 /* HTTPRequest.cpp */; };\n\t\tFA94729B27A6F9AD00817677 /* NSURLClient.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA94729927A6F9AC00817677 /* NSURLClient.mm */; };\n\t\tFA94729C27A6F9AD00817677 /* NSURLClient.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA94729927A6F9AC00817677 /* NSURLClient.mm */; };\n\t\tFA94729D27A6F9AD00817677 /* NSURLClient.h in Headers */ = {isa = PBXBuildFile; fileRef = FA94729A27A6F9AC00817677 /* NSURLClient.h */; };\n\t\tFA9D53AC1F5307E900125C6B /* Deprecations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA9D53AA1F5307E900125C6B /* Deprecations.cpp */; };\n\t\tFA9D53AD1F5307E900125C6B /* Deprecations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA9D53AA1F5307E900125C6B /* Deprecations.cpp */; };\n\t\tFA9D53AE1F5307E900125C6B /* Deprecations.h in Headers */ = {isa = PBXBuildFile; fileRef = FA9D53AB1F5307E900125C6B /* Deprecations.h */; };\n\t\tFA9D8DD11DEB56C3002CD881 /* pixelformat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA9D8DCF1DEB56C3002CD881 /* pixelformat.cpp */; };\n\t\tFA9D8DD21DEB56C3002CD881 /* pixelformat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA9D8DCF1DEB56C3002CD881 /* pixelformat.cpp */; };\n\t\tFA9D8DD31DEB56C3002CD881 /* pixelformat.h in Headers */ = {isa = PBXBuildFile; fileRef = FA9D8DD01DEB56C3002CD881 /* pixelformat.h */; };\n\t\tFA9D8DD71DEF8411002CD881 /* Data.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA9D8DD41DEF8411002CD881 /* Data.cpp */; };\n\t\tFA9D8DD81DEF8411002CD881 /* Data.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA9D8DD41DEF8411002CD881 /* Data.cpp */; };\n\t\tFA9D8DD91DEF8411002CD881 /* Stream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA9D8DD51DEF8411002CD881 /* Stream.cpp */; };\n\t\tFA9D8DDA1DEF8411002CD881 /* Stream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA9D8DD51DEF8411002CD881 /* Stream.cpp */; };\n\t\tFA9D8DDB1DEF8411002CD881 /* Stream.h in Headers */ = {isa = PBXBuildFile; fileRef = FA9D8DD61DEF8411002CD881 /* Stream.h */; };\n\t\tFA9D8DDD1DEF842A002CD881 /* Drawable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA9D8DDC1DEF842A002CD881 /* Drawable.cpp */; };\n\t\tFA9D8DDE1DEF842A002CD881 /* Drawable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA9D8DDC1DEF842A002CD881 /* Drawable.cpp */; };\n\t\tFA9D8DE01DEF843D002CD881 /* Image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA9D8DDF1DEF843D002CD881 /* Image.cpp */; };\n\t\tFA9D8DE11DEF843D002CD881 /* Image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA9D8DDF1DEF843D002CD881 /* Image.cpp */; };\n\t\tFAA3A9AE1B7D465A00CED060 /* android.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAA3A9AC1B7D465A00CED060 /* android.cpp */; };\n\t\tFAA3A9AF1B7D465A00CED060 /* android.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAA3A9AC1B7D465A00CED060 /* android.cpp */; };\n\t\tFAA3A9B01B7D465A00CED060 /* android.h in Headers */ = {isa = PBXBuildFile; fileRef = FAA3A9AD1B7D465A00CED060 /* android.h */; };\n\t\tFAA54ACA1F91660400A8FA7B /* OggDemuxer.h in Headers */ = {isa = PBXBuildFile; fileRef = FAA54AC61F91660400A8FA7B /* OggDemuxer.h */; };\n\t\tFAA54ACB1F91660400A8FA7B /* TheoraVideoStream.h in Headers */ = {isa = PBXBuildFile; fileRef = FAA54AC71F91660400A8FA7B /* TheoraVideoStream.h */; };\n\t\tFAA54ACC1F91660400A8FA7B /* TheoraVideoStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAA54AC81F91660400A8FA7B /* TheoraVideoStream.cpp */; };\n\t\tFAA54ACD1F91660400A8FA7B /* OggDemuxer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAA54AC91F91660400A8FA7B /* OggDemuxer.cpp */; };\n\t\tFAA627CE18E7E1560080752D /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FAA627CD18E7E1560080752D /* CoreServices.framework */; };\n\t\tFAAA3FD81F64B3AD00F89E99 /* lprefix.h in Headers */ = {isa = PBXBuildFile; fileRef = FAAA3FD31F64B3AD00F89E99 /* lprefix.h */; };\n\t\tFAAA3FD91F64B3AD00F89E99 /* lstrlib.c in Sources */ = {isa = PBXBuildFile; fileRef = FAAA3FD41F64B3AD00F89E99 /* lstrlib.c */; };\n\t\tFAAA3FDA1F64B3AD00F89E99 /* lstrlib.h in Headers */ = {isa = PBXBuildFile; fileRef = FAAA3FD51F64B3AD00F89E99 /* lstrlib.h */; };\n\t\tFAAA3FDB1F64B3AD00F89E99 /* lutf8lib.c in Sources */ = {isa = PBXBuildFile; fileRef = FAAA3FD61F64B3AD00F89E99 /* lutf8lib.c */; };\n\t\tFAAA3FDC1F64B3AD00F89E99 /* lutf8lib.h in Headers */ = {isa = PBXBuildFile; fileRef = FAAA3FD71F64B3AD00F89E99 /* lutf8lib.h */; };\n\t\tFAAC2F79251A9D2200BCB81B /* apple.mm in Sources */ = {isa = PBXBuildFile; fileRef = FAAC2F78251A9D2200BCB81B /* apple.mm */; };\n\t\tFAAC2F7A251A9D2200BCB81B /* apple.mm in Sources */ = {isa = PBXBuildFile; fileRef = FAAC2F78251A9D2200BCB81B /* apple.mm */; };\n\t\tFAAFF04416CB11C700CCDE45 /* OpenAL-Soft.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FAAFF04316CB11C700CCDE45 /* OpenAL-Soft.framework */; };\n\t\tFAB17BE61ABFAA9000F9BA27 /* lz4.c in Sources */ = {isa = PBXBuildFile; fileRef = FAB17BE41ABFAA9000F9BA27 /* lz4.c */; };\n\t\tFAB17BE71ABFAA9000F9BA27 /* lz4.c in Sources */ = {isa = PBXBuildFile; fileRef = FAB17BE41ABFAA9000F9BA27 /* lz4.c */; };\n\t\tFAB17BE81ABFAA9000F9BA27 /* lz4.h in Headers */ = {isa = PBXBuildFile; fileRef = FAB17BE51ABFAA9000F9BA27 /* lz4.h */; };\n\t\tFAB17BF51ABFC4B100F9BA27 /* lz4hc.c in Sources */ = {isa = PBXBuildFile; fileRef = FAB17BF31ABFC4B100F9BA27 /* lz4hc.c */; };\n\t\tFAB17BF61ABFC4B100F9BA27 /* lz4hc.c in Sources */ = {isa = PBXBuildFile; fileRef = FAB17BF31ABFC4B100F9BA27 /* lz4hc.c */; };\n\t\tFAB17BF71ABFC4B100F9BA27 /* lz4hc.h in Headers */ = {isa = PBXBuildFile; fileRef = FAB17BF41ABFC4B100F9BA27 /* lz4hc.h */; };\n\t\tFAB2D5AA1AABDD8A008224A4 /* TrueTypeRasterizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAB2D5A81AABDD8A008224A4 /* TrueTypeRasterizer.cpp */; };\n\t\tFAB2D5AB1AABDD8A008224A4 /* TrueTypeRasterizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAB2D5A81AABDD8A008224A4 /* TrueTypeRasterizer.cpp */; };\n\t\tFAB2D5AC1AABDD8A008224A4 /* TrueTypeRasterizer.h in Headers */ = {isa = PBXBuildFile; fileRef = FAB2D5A91AABDD8A008224A4 /* TrueTypeRasterizer.h */; };\n\t\tFAB922C6257D99EF0035DAD6 /* Range.h in Headers */ = {isa = PBXBuildFile; fileRef = FAB922C3257D99EF0035DAD6 /* Range.h */; };\n\t\tFABDA9762552448200B5C523 /* b2_joint.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9112552448200B5C523 /* b2_joint.h */; };\n\t\tFABDA9772552448200B5C523 /* b2_shape.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9122552448200B5C523 /* b2_shape.h */; };\n\t\tFABDA9782552448200B5C523 /* b2_block_allocator.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9132552448200B5C523 /* b2_block_allocator.h */; };\n\t\tFABDA9792552448200B5C523 /* b2_joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9152552448200B5C523 /* b2_joint.cpp */; };\n\t\tFABDA97A2552448200B5C523 /* b2_joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9152552448200B5C523 /* b2_joint.cpp */; };\n\t\tFABDA97B2552448200B5C523 /* b2_chain_polygon_contact.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9162552448200B5C523 /* b2_chain_polygon_contact.h */; };\n\t\tFABDA97C2552448200B5C523 /* b2_chain_circle_contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9172552448200B5C523 /* b2_chain_circle_contact.cpp */; };\n\t\tFABDA97D2552448200B5C523 /* b2_chain_circle_contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9172552448200B5C523 /* b2_chain_circle_contact.cpp */; };\n\t\tFABDA97E2552448200B5C523 /* b2_chain_circle_contact.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9182552448200B5C523 /* b2_chain_circle_contact.h */; };\n\t\tFABDA97F2552448200B5C523 /* b2_polygon_circle_contact.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9192552448200B5C523 /* b2_polygon_circle_contact.h */; };\n\t\tFABDA9802552448200B5C523 /* b2_circle_contact.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA91A2552448200B5C523 /* b2_circle_contact.h */; };\n\t\tFABDA9812552448200B5C523 /* b2_weld_joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA91B2552448200B5C523 /* b2_weld_joint.cpp */; };\n\t\tFABDA9822552448200B5C523 /* b2_weld_joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA91B2552448200B5C523 /* b2_weld_joint.cpp */; };\n\t\tFABDA9832552448200B5C523 /* b2_chain_polygon_contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA91C2552448200B5C523 /* b2_chain_polygon_contact.cpp */; };\n\t\tFABDA9842552448200B5C523 /* b2_chain_polygon_contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA91C2552448200B5C523 /* b2_chain_polygon_contact.cpp */; };\n\t\tFABDA9852552448200B5C523 /* b2_edge_circle_contact.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA91D2552448200B5C523 /* b2_edge_circle_contact.h */; };\n\t\tFABDA9862552448200B5C523 /* b2_body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA91E2552448200B5C523 /* b2_body.cpp */; };\n\t\tFABDA9872552448200B5C523 /* b2_body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA91E2552448200B5C523 /* b2_body.cpp */; };\n\t\tFABDA9882552448300B5C523 /* b2_contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA91F2552448200B5C523 /* b2_contact.cpp */; };\n\t\tFABDA9892552448300B5C523 /* b2_contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA91F2552448200B5C523 /* b2_contact.cpp */; };\n\t\tFABDA98A2552448300B5C523 /* b2_revolute_joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9202552448200B5C523 /* b2_revolute_joint.cpp */; };\n\t\tFABDA98B2552448300B5C523 /* b2_revolute_joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9202552448200B5C523 /* b2_revolute_joint.cpp */; };\n\t\tFABDA98C2552448300B5C523 /* b2_contact_solver.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9212552448200B5C523 /* b2_contact_solver.h */; };\n\t\tFABDA98D2552448300B5C523 /* b2_contact_solver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9222552448200B5C523 /* b2_contact_solver.cpp */; };\n\t\tFABDA98E2552448300B5C523 /* b2_contact_solver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9222552448200B5C523 /* b2_contact_solver.cpp */; };\n\t\tFABDA98F2552448300B5C523 /* b2_world_callbacks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9232552448200B5C523 /* b2_world_callbacks.cpp */; };\n\t\tFABDA9902552448300B5C523 /* b2_world_callbacks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9232552448200B5C523 /* b2_world_callbacks.cpp */; };\n\t\tFABDA9912552448300B5C523 /* b2_pulley_joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9242552448200B5C523 /* b2_pulley_joint.cpp */; };\n\t\tFABDA9922552448300B5C523 /* b2_pulley_joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9242552448200B5C523 /* b2_pulley_joint.cpp */; };\n\t\tFABDA9932552448300B5C523 /* b2_polygon_circle_contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9252552448200B5C523 /* b2_polygon_circle_contact.cpp */; };\n\t\tFABDA9942552448300B5C523 /* b2_polygon_circle_contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9252552448200B5C523 /* b2_polygon_circle_contact.cpp */; };\n\t\tFABDA9952552448300B5C523 /* b2_edge_polygon_contact.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9262552448200B5C523 /* b2_edge_polygon_contact.h */; };\n\t\tFABDA9962552448300B5C523 /* b2_distance_joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9272552448200B5C523 /* b2_distance_joint.cpp */; };\n\t\tFABDA9972552448300B5C523 /* b2_distance_joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9272552448200B5C523 /* b2_distance_joint.cpp */; };\n\t\tFABDA9982552448300B5C523 /* b2_contact_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9282552448200B5C523 /* b2_contact_manager.cpp */; };\n\t\tFABDA9992552448300B5C523 /* b2_contact_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9282552448200B5C523 /* b2_contact_manager.cpp */; };\n\t\tFABDA99A2552448300B5C523 /* b2_polygon_contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9292552448200B5C523 /* b2_polygon_contact.cpp */; };\n\t\tFABDA99B2552448300B5C523 /* b2_polygon_contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9292552448200B5C523 /* b2_polygon_contact.cpp */; };\n\t\tFABDA99C2552448300B5C523 /* b2_edge_polygon_contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA92A2552448200B5C523 /* b2_edge_polygon_contact.cpp */; };\n\t\tFABDA99D2552448300B5C523 /* b2_edge_polygon_contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA92A2552448200B5C523 /* b2_edge_polygon_contact.cpp */; };\n\t\tFABDA99E2552448300B5C523 /* b2_edge_circle_contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA92B2552448200B5C523 /* b2_edge_circle_contact.cpp */; };\n\t\tFABDA99F2552448300B5C523 /* b2_edge_circle_contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA92B2552448200B5C523 /* b2_edge_circle_contact.cpp */; };\n\t\tFABDA9A02552448300B5C523 /* b2_gear_joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA92C2552448200B5C523 /* b2_gear_joint.cpp */; };\n\t\tFABDA9A12552448300B5C523 /* b2_gear_joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA92C2552448200B5C523 /* b2_gear_joint.cpp */; };\n\t\tFABDA9A22552448300B5C523 /* b2_friction_joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA92D2552448200B5C523 /* b2_friction_joint.cpp */; };\n\t\tFABDA9A32552448300B5C523 /* b2_friction_joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA92D2552448200B5C523 /* b2_friction_joint.cpp */; };\n\t\tFABDA9A42552448300B5C523 /* b2_wheel_joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA92E2552448200B5C523 /* b2_wheel_joint.cpp */; };\n\t\tFABDA9A52552448300B5C523 /* b2_wheel_joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA92E2552448200B5C523 /* b2_wheel_joint.cpp */; };\n\t\tFABDA9A62552448300B5C523 /* b2_polygon_contact.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA92F2552448200B5C523 /* b2_polygon_contact.h */; };\n\t\tFABDA9A72552448300B5C523 /* b2_motor_joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9302552448200B5C523 /* b2_motor_joint.cpp */; };\n\t\tFABDA9A82552448300B5C523 /* b2_motor_joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9302552448200B5C523 /* b2_motor_joint.cpp */; };\n\t\tFABDA9AB2552448300B5C523 /* b2_world.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9322552448200B5C523 /* b2_world.cpp */; };\n\t\tFABDA9AC2552448300B5C523 /* b2_world.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9322552448200B5C523 /* b2_world.cpp */; };\n\t\tFABDA9AD2552448300B5C523 /* b2_island.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9332552448200B5C523 /* b2_island.cpp */; };\n\t\tFABDA9AE2552448300B5C523 /* b2_island.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9332552448200B5C523 /* b2_island.cpp */; };\n\t\tFABDA9AF2552448300B5C523 /* b2_mouse_joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9342552448200B5C523 /* b2_mouse_joint.cpp */; };\n\t\tFABDA9B02552448300B5C523 /* b2_mouse_joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9342552448200B5C523 /* b2_mouse_joint.cpp */; };\n\t\tFABDA9B12552448300B5C523 /* b2_circle_contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9352552448200B5C523 /* b2_circle_contact.cpp */; };\n\t\tFABDA9B22552448300B5C523 /* b2_circle_contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9352552448200B5C523 /* b2_circle_contact.cpp */; };\n\t\tFABDA9B32552448300B5C523 /* b2_prismatic_joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9362552448200B5C523 /* b2_prismatic_joint.cpp */; };\n\t\tFABDA9B42552448300B5C523 /* b2_prismatic_joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9362552448200B5C523 /* b2_prismatic_joint.cpp */; };\n\t\tFABDA9B52552448300B5C523 /* b2_fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9372552448200B5C523 /* b2_fixture.cpp */; };\n\t\tFABDA9B62552448300B5C523 /* b2_fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9372552448200B5C523 /* b2_fixture.cpp */; };\n\t\tFABDA9B72552448300B5C523 /* b2_island.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9382552448200B5C523 /* b2_island.h */; };\n\t\tFABDA9B82552448300B5C523 /* b2_motor_joint.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9392552448200B5C523 /* b2_motor_joint.h */; };\n\t\tFABDA9B92552448300B5C523 /* b2_common.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA93A2552448200B5C523 /* b2_common.h */; };\n\t\tFABDA9BA2552448300B5C523 /* b2_weld_joint.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA93B2552448200B5C523 /* b2_weld_joint.h */; };\n\t\tFABDA9BB2552448300B5C523 /* b2_dynamic_tree.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA93C2552448200B5C523 /* b2_dynamic_tree.h */; };\n\t\tFABDA9BC2552448300B5C523 /* b2_fixture.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA93D2552448200B5C523 /* b2_fixture.h */; };\n\t\tFABDA9BD2552448300B5C523 /* b2_stack_allocator.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA93E2552448200B5C523 /* b2_stack_allocator.h */; };\n\t\tFABDA9BE2552448300B5C523 /* Box2D.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA93F2552448200B5C523 /* Box2D.h */; };\n\t\tFABDA9BF2552448300B5C523 /* b2_types.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9402552448200B5C523 /* b2_types.h */; };\n\t\tFABDA9C02552448300B5C523 /* b2_broad_phase.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9412552448200B5C523 /* b2_broad_phase.h */; };\n\t\tFABDA9C12552448300B5C523 /* b2_rope.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9432552448200B5C523 /* b2_rope.cpp */; };\n\t\tFABDA9C22552448300B5C523 /* b2_rope.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9432552448200B5C523 /* b2_rope.cpp */; };\n\t\tFABDA9C32552448300B5C523 /* b2_settings.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9442552448200B5C523 /* b2_settings.h */; };\n\t\tFABDA9C42552448300B5C523 /* b2_revolute_joint.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9452552448200B5C523 /* b2_revolute_joint.h */; };\n\t\tFABDA9C62552448300B5C523 /* b2_rope.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9472552448200B5C523 /* b2_rope.h */; };\n\t\tFABDA9C72552448300B5C523 /* b2_distance_joint.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9482552448200B5C523 /* b2_distance_joint.h */; };\n\t\tFABDA9C82552448300B5C523 /* b2_body.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9492552448200B5C523 /* b2_body.h */; };\n\t\tFABDA9C92552448300B5C523 /* b2_distance.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA94A2552448200B5C523 /* b2_distance.h */; };\n\t\tFABDA9CA2552448300B5C523 /* b2_time_step.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA94B2552448200B5C523 /* b2_time_step.h */; };\n\t\tFABDA9CB2552448300B5C523 /* b2_pulley_joint.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA94C2552448200B5C523 /* b2_pulley_joint.h */; };\n\t\tFABDA9CC2552448300B5C523 /* b2_circle_shape.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA94D2552448200B5C523 /* b2_circle_shape.h */; };\n\t\tFABDA9CD2552448300B5C523 /* b2_math.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA94E2552448200B5C523 /* b2_math.h */; };\n\t\tFABDA9CE2552448300B5C523 /* b2_time_of_impact.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA94F2552448200B5C523 /* b2_time_of_impact.h */; };\n\t\tFABDA9CF2552448300B5C523 /* b2_mouse_joint.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9502552448200B5C523 /* b2_mouse_joint.h */; };\n\t\tFABDA9D02552448300B5C523 /* b2_draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9522552448200B5C523 /* b2_draw.cpp */; };\n\t\tFABDA9D12552448300B5C523 /* b2_draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9522552448200B5C523 /* b2_draw.cpp */; };\n\t\tFABDA9D22552448300B5C523 /* b2_timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9532552448200B5C523 /* b2_timer.cpp */; };\n\t\tFABDA9D32552448300B5C523 /* b2_timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9532552448200B5C523 /* b2_timer.cpp */; };\n\t\tFABDA9D42552448300B5C523 /* b2_block_allocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9542552448200B5C523 /* b2_block_allocator.cpp */; };\n\t\tFABDA9D52552448300B5C523 /* b2_block_allocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9542552448200B5C523 /* b2_block_allocator.cpp */; };\n\t\tFABDA9D62552448300B5C523 /* b2_stack_allocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9552552448200B5C523 /* b2_stack_allocator.cpp */; };\n\t\tFABDA9D72552448300B5C523 /* b2_stack_allocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9552552448200B5C523 /* b2_stack_allocator.cpp */; };\n\t\tFABDA9D82552448300B5C523 /* b2_settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9562552448200B5C523 /* b2_settings.cpp */; };\n\t\tFABDA9D92552448300B5C523 /* b2_settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9562552448200B5C523 /* b2_settings.cpp */; };\n\t\tFABDA9DA2552448300B5C523 /* b2_math.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9572552448200B5C523 /* b2_math.cpp */; };\n\t\tFABDA9DB2552448300B5C523 /* b2_math.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9572552448200B5C523 /* b2_math.cpp */; };\n\t\tFABDA9DC2552448300B5C523 /* b2_friction_joint.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9582552448200B5C523 /* b2_friction_joint.h */; };\n\t\tFABDA9DD2552448300B5C523 /* b2_contact.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9592552448200B5C523 /* b2_contact.h */; };\n\t\tFABDA9DE2552448300B5C523 /* b2_prismatic_joint.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA95A2552448200B5C523 /* b2_prismatic_joint.h */; };\n\t\tFABDA9DF2552448300B5C523 /* b2_world.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA95B2552448200B5C523 /* b2_world.h */; };\n\t\tFABDA9E02552448300B5C523 /* b2_polygon_shape.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA95C2552448200B5C523 /* b2_polygon_shape.h */; };\n\t\tFABDA9E12552448300B5C523 /* b2_wheel_joint.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA95D2552448200B5C523 /* b2_wheel_joint.h */; };\n\t\tFABDA9E22552448300B5C523 /* b2_growable_stack.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA95E2552448200B5C523 /* b2_growable_stack.h */; };\n\t\tFABDA9E32552448300B5C523 /* b2_draw.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA95F2552448200B5C523 /* b2_draw.h */; };\n\t\tFABDA9E42552448300B5C523 /* b2_collision.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9602552448200B5C523 /* b2_collision.h */; };\n\t\tFABDA9E62552448300B5C523 /* b2_api.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9622552448200B5C523 /* b2_api.h */; };\n\t\tFABDA9E72552448300B5C523 /* b2_chain_shape.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9632552448200B5C523 /* b2_chain_shape.h */; };\n\t\tFABDA9E82552448300B5C523 /* b2_gear_joint.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9642552448200B5C523 /* b2_gear_joint.h */; };\n\t\tFABDA9E92552448300B5C523 /* b2_timer.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9652552448200B5C523 /* b2_timer.h */; };\n\t\tFABDA9EA2552448300B5C523 /* b2_world_callbacks.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9662552448200B5C523 /* b2_world_callbacks.h */; };\n\t\tFABDA9EB2552448300B5C523 /* b2_collide_circle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9682552448200B5C523 /* b2_collide_circle.cpp */; };\n\t\tFABDA9EC2552448300B5C523 /* b2_collide_circle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9682552448200B5C523 /* b2_collide_circle.cpp */; };\n\t\tFABDA9ED2552448300B5C523 /* b2_circle_shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9692552448200B5C523 /* b2_circle_shape.cpp */; };\n\t\tFABDA9EE2552448300B5C523 /* b2_circle_shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9692552448200B5C523 /* b2_circle_shape.cpp */; };\n\t\tFABDA9EF2552448300B5C523 /* b2_collision.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA96A2552448200B5C523 /* b2_collision.cpp */; };\n\t\tFABDA9F02552448300B5C523 /* b2_collision.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA96A2552448200B5C523 /* b2_collision.cpp */; };\n\t\tFABDA9F12552448300B5C523 /* b2_collide_edge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA96B2552448200B5C523 /* b2_collide_edge.cpp */; };\n\t\tFABDA9F22552448300B5C523 /* b2_collide_edge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA96B2552448200B5C523 /* b2_collide_edge.cpp */; };\n\t\tFABDA9F32552448300B5C523 /* b2_chain_shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA96C2552448200B5C523 /* b2_chain_shape.cpp */; };\n\t\tFABDA9F42552448300B5C523 /* b2_chain_shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA96C2552448200B5C523 /* b2_chain_shape.cpp */; };\n\t\tFABDA9F52552448300B5C523 /* b2_broad_phase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA96D2552448200B5C523 /* b2_broad_phase.cpp */; };\n\t\tFABDA9F62552448300B5C523 /* b2_broad_phase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA96D2552448200B5C523 /* b2_broad_phase.cpp */; };\n\t\tFABDA9F72552448300B5C523 /* b2_dynamic_tree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA96E2552448200B5C523 /* b2_dynamic_tree.cpp */; };\n\t\tFABDA9F82552448300B5C523 /* b2_dynamic_tree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA96E2552448200B5C523 /* b2_dynamic_tree.cpp */; };\n\t\tFABDA9F92552448300B5C523 /* b2_polygon_shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA96F2552448200B5C523 /* b2_polygon_shape.cpp */; };\n\t\tFABDA9FA2552448300B5C523 /* b2_polygon_shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA96F2552448200B5C523 /* b2_polygon_shape.cpp */; };\n\t\tFABDA9FB2552448300B5C523 /* b2_collide_polygon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9702552448200B5C523 /* b2_collide_polygon.cpp */; };\n\t\tFABDA9FC2552448300B5C523 /* b2_collide_polygon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9702552448200B5C523 /* b2_collide_polygon.cpp */; };\n\t\tFABDA9FD2552448300B5C523 /* b2_edge_shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9712552448200B5C523 /* b2_edge_shape.cpp */; };\n\t\tFABDA9FE2552448300B5C523 /* b2_edge_shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9712552448200B5C523 /* b2_edge_shape.cpp */; };\n\t\tFABDA9FF2552448300B5C523 /* b2_time_of_impact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9722552448200B5C523 /* b2_time_of_impact.cpp */; };\n\t\tFABDAA002552448300B5C523 /* b2_time_of_impact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9722552448200B5C523 /* b2_time_of_impact.cpp */; };\n\t\tFABDAA012552448300B5C523 /* b2_distance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9732552448200B5C523 /* b2_distance.cpp */; };\n\t\tFABDAA022552448300B5C523 /* b2_distance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABDA9732552448200B5C523 /* b2_distance.cpp */; };\n\t\tFABDAA032552448300B5C523 /* b2_contact_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9742552448200B5C523 /* b2_contact_manager.h */; };\n\t\tFABDAA042552448300B5C523 /* b2_edge_shape.h in Headers */ = {isa = PBXBuildFile; fileRef = FABDA9752552448200B5C523 /* b2_edge_shape.h */; };\n\t\tFAC271E523B5B5B400C200D3 /* renderstate.h in Headers */ = {isa = PBXBuildFile; fileRef = FAC271E323B5B5B400C200D3 /* renderstate.h */; };\n\t\tFAC271E623B5B5B400C200D3 /* renderstate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAC271E423B5B5B400C200D3 /* renderstate.cpp */; };\n\t\tFAC271E723B5B5B400C200D3 /* renderstate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAC271E423B5B5B400C200D3 /* renderstate.cpp */; };\n\t\tFAC756F51E4F99B400B91289 /* Effect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAC756F31E4F99B400B91289 /* Effect.cpp */; };\n\t\tFAC756F61E4F99B400B91289 /* Effect.h in Headers */ = {isa = PBXBuildFile; fileRef = FAC756F41E4F99B400B91289 /* Effect.h */; };\n\t\tFAC756F71E4F99BC00B91289 /* Effect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAC756F31E4F99B400B91289 /* Effect.cpp */; };\n\t\tFAC756FA1E4F99D200B91289 /* Effect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAC756F81E4F99D200B91289 /* Effect.cpp */; };\n\t\tFAC756FB1E4F99D200B91289 /* Effect.h in Headers */ = {isa = PBXBuildFile; fileRef = FAC756F91E4F99D200B91289 /* Effect.h */; };\n\t\tFAC756FC1E4F99DB00B91289 /* Effect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAC756F81E4F99D200B91289 /* Effect.cpp */; };\n\t\tFAC7CD771FE35E95006A60C7 /* physfs_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = FAC7CD5A1FE35E95006A60C7 /* physfs_internal.h */; };\n\t\tFAC7CD781FE35E95006A60C7 /* physfs_platform_qnx.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD5B1FE35E95006A60C7 /* physfs_platform_qnx.c */; };\n\t\tFAC7CD791FE35E95006A60C7 /* physfs.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD5C1FE35E95006A60C7 /* physfs.c */; };\n\t\tFAC7CD7A1FE35E95006A60C7 /* physfs_archiver_7z.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD5D1FE35E95006A60C7 /* physfs_archiver_7z.c */; };\n\t\tFAC7CD7B1FE35E95006A60C7 /* physfs_platform_unix.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD5E1FE35E95006A60C7 /* physfs_platform_unix.c */; };\n\t\tFAC7CD7C1FE35E95006A60C7 /* physfs_archiver_slb.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD5F1FE35E95006A60C7 /* physfs_archiver_slb.c */; };\n\t\tFAC7CD7D1FE35E95006A60C7 /* physfs_platform_winrt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD601FE35E95006A60C7 /* physfs_platform_winrt.cpp */; };\n\t\tFAC7CD7E1FE35E95006A60C7 /* physfs_archiver_mvl.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD611FE35E95006A60C7 /* physfs_archiver_mvl.c */; };\n\t\tFAC7CD7F1FE35E95006A60C7 /* physfs_archiver_wad.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD621FE35E95006A60C7 /* physfs_archiver_wad.c */; };\n\t\tFAC7CD801FE35E95006A60C7 /* physfs_casefolding.h in Headers */ = {isa = PBXBuildFile; fileRef = FAC7CD631FE35E95006A60C7 /* physfs_casefolding.h */; };\n\t\tFAC7CD811FE35E95006A60C7 /* physfs_platform_os2.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD641FE35E95006A60C7 /* physfs_platform_os2.c */; };\n\t\tFAC7CD821FE35E95006A60C7 /* physfs_platform_haiku.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD651FE35E95006A60C7 /* physfs_platform_haiku.cpp */; };\n\t\tFAC7CD831FE35E95006A60C7 /* physfs_platform_windows.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD661FE35E95006A60C7 /* physfs_platform_windows.c */; };\n\t\tFAC7CD841FE35E95006A60C7 /* physfs_archiver_unpacked.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD671FE35E95006A60C7 /* physfs_archiver_unpacked.c */; };\n\t\tFAC7CD851FE35E95006A60C7 /* physfs_unicode.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD681FE35E95006A60C7 /* physfs_unicode.c */; };\n\t\tFAC7CD861FE35E95006A60C7 /* physfs.h in Headers */ = {isa = PBXBuildFile; fileRef = FAC7CD691FE35E95006A60C7 /* physfs.h */; };\n\t\tFAC7CD871FE35E95006A60C7 /* physfs_archiver_vdf.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD6A1FE35E95006A60C7 /* physfs_archiver_vdf.c */; };\n\t\tFAC7CD881FE35E95006A60C7 /* physfs_platform_apple.m in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD6B1FE35E95006A60C7 /* physfs_platform_apple.m */; };\n\t\tFAC7CD891FE35E95006A60C7 /* physfs_archiver_dir.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD6C1FE35E95006A60C7 /* physfs_archiver_dir.c */; };\n\t\tFAC7CD8A1FE35E95006A60C7 /* physfs_byteorder.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD6D1FE35E95006A60C7 /* physfs_byteorder.c */; };\n\t\tFAC7CD8B1FE35E95006A60C7 /* physfs_archiver_iso9660.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD6E1FE35E95006A60C7 /* physfs_archiver_iso9660.c */; };\n\t\tFAC7CD8C1FE35E95006A60C7 /* physfs_archiver_qpak.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD6F1FE35E95006A60C7 /* physfs_archiver_qpak.c */; };\n\t\tFAC7CD8D1FE35E95006A60C7 /* physfs_platforms.h in Headers */ = {isa = PBXBuildFile; fileRef = FAC7CD701FE35E95006A60C7 /* physfs_platforms.h */; };\n\t\tFAC7CD8E1FE35E95006A60C7 /* physfs_lzmasdk.h in Headers */ = {isa = PBXBuildFile; fileRef = FAC7CD711FE35E95006A60C7 /* physfs_lzmasdk.h */; };\n\t\tFAC7CD8F1FE35E95006A60C7 /* physfs_platform_posix.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD721FE35E95006A60C7 /* physfs_platform_posix.c */; };\n\t\tFAC7CD901FE35E95006A60C7 /* physfs_miniz.h in Headers */ = {isa = PBXBuildFile; fileRef = FAC7CD731FE35E95006A60C7 /* physfs_miniz.h */; };\n\t\tFAC7CD911FE35E95006A60C7 /* physfs_archiver_grp.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD741FE35E95006A60C7 /* physfs_archiver_grp.c */; };\n\t\tFAC7CD921FE35E95006A60C7 /* physfs_archiver_hog.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD751FE35E95006A60C7 /* physfs_archiver_hog.c */; };\n\t\tFAC7CD931FE35E95006A60C7 /* physfs_archiver_zip.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD761FE35E95006A60C7 /* physfs_archiver_zip.c */; };\n\t\tFAC7CD961FE755B4006A60C7 /* lz4opt.h in Headers */ = {isa = PBXBuildFile; fileRef = FAC7CD951FE755B3006A60C7 /* lz4opt.h */; };\n\t\tFAC8E54523AC832A007B07C8 /* NativeFile.h in Headers */ = {isa = PBXBuildFile; fileRef = FAC8E54323AC832A007B07C8 /* NativeFile.h */; };\n\t\tFAC8E54623AC832A007B07C8 /* NativeFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAC8E54423AC832A007B07C8 /* NativeFile.cpp */; };\n\t\tFAC8E54723AC832A007B07C8 /* NativeFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAC8E54423AC832A007B07C8 /* NativeFile.cpp */; };\n\t\tFAC8E54A23AC8379007B07C8 /* wrap_NativeFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAC8E54823AC8379007B07C8 /* wrap_NativeFile.cpp */; };\n\t\tFAC8E54B23AC8379007B07C8 /* wrap_NativeFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAC8E54823AC8379007B07C8 /* wrap_NativeFile.cpp */; };\n\t\tFAC8E54C23AC8379007B07C8 /* wrap_NativeFile.h in Headers */ = {isa = PBXBuildFile; fileRef = FAC8E54923AC8379007B07C8 /* wrap_NativeFile.h */; };\n\t\tFAC8E55023B01C0D007B07C8 /* macos.h in Headers */ = {isa = PBXBuildFile; fileRef = FAC8E54E23B01C0C007B07C8 /* macos.h */; };\n\t\tFAC8E55123B01C0D007B07C8 /* macos.mm in Sources */ = {isa = PBXBuildFile; fileRef = FAC8E54F23B01C0C007B07C8 /* macos.mm */; };\n\t\tFACA02EC1F5E396B0084B28F /* CompressedData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FACA02E01F5E396B0084B28F /* CompressedData.cpp */; };\n\t\tFACA02ED1F5E396B0084B28F /* CompressedData.h in Headers */ = {isa = PBXBuildFile; fileRef = FACA02E11F5E396B0084B28F /* CompressedData.h */; };\n\t\tFACA02EE1F5E396B0084B28F /* Compressor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FACA02E21F5E396B0084B28F /* Compressor.cpp */; };\n\t\tFACA02EF1F5E396B0084B28F /* Compressor.h in Headers */ = {isa = PBXBuildFile; fileRef = FACA02E31F5E396B0084B28F /* Compressor.h */; };\n\t\tFACA02F01F5E396B0084B28F /* DataModule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FACA02E41F5E396B0084B28F /* DataModule.cpp */; };\n\t\tFACA02F11F5E396B0084B28F /* DataModule.h in Headers */ = {isa = PBXBuildFile; fileRef = FACA02E51F5E396B0084B28F /* DataModule.h */; };\n\t\tFACA02F21F5E396B0084B28F /* HashFunction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FACA02E61F5E396B0084B28F /* HashFunction.cpp */; };\n\t\tFACA02F31F5E396B0084B28F /* HashFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = FACA02E71F5E396B0084B28F /* HashFunction.h */; };\n\t\tFACA02F41F5E396B0084B28F /* wrap_CompressedData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FACA02E81F5E396B0084B28F /* wrap_CompressedData.cpp */; };\n\t\tFACA02F51F5E396B0084B28F /* wrap_CompressedData.h in Headers */ = {isa = PBXBuildFile; fileRef = FACA02E91F5E396B0084B28F /* wrap_CompressedData.h */; };\n\t\tFACA02F61F5E396B0084B28F /* wrap_DataModule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FACA02EA1F5E396B0084B28F /* wrap_DataModule.cpp */; };\n\t\tFACA02F71F5E396B0084B28F /* wrap_DataModule.h in Headers */ = {isa = PBXBuildFile; fileRef = FACA02EB1F5E396B0084B28F /* wrap_DataModule.h */; };\n\t\tFACA02F81F5E39760084B28F /* CompressedData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FACA02E01F5E396B0084B28F /* CompressedData.cpp */; };\n\t\tFACA02F91F5E39790084B28F /* Compressor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FACA02E21F5E396B0084B28F /* Compressor.cpp */; };\n\t\tFACA02FA1F5E397B0084B28F /* DataModule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FACA02E41F5E396B0084B28F /* DataModule.cpp */; };\n\t\tFACA02FB1F5E397E0084B28F /* HashFunction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FACA02E61F5E396B0084B28F /* HashFunction.cpp */; };\n\t\tFACA02FC1F5E39810084B28F /* wrap_CompressedData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FACA02E81F5E396B0084B28F /* wrap_CompressedData.cpp */; };\n\t\tFACA02FD1F5E39840084B28F /* wrap_DataModule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FACA02EA1F5E396B0084B28F /* wrap_DataModule.cpp */; };\n\t\tFACA06AC293EE5CD001A2557 /* wrap_Sensor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FACA06A5293EE5CD001A2557 /* wrap_Sensor.cpp */; };\n\t\tFACA06AD293EE5CD001A2557 /* wrap_Sensor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FACA06A5293EE5CD001A2557 /* wrap_Sensor.cpp */; };\n\t\tFACA06AE293EE5CD001A2557 /* Sensor.h in Headers */ = {isa = PBXBuildFile; fileRef = FACA06A6293EE5CD001A2557 /* Sensor.h */; };\n\t\tFACA06AF293EE5CD001A2557 /* Sensor.h in Headers */ = {isa = PBXBuildFile; fileRef = FACA06A8293EE5CD001A2557 /* Sensor.h */; };\n\t\tFACA06B0293EE5CD001A2557 /* Sensor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FACA06A9293EE5CD001A2557 /* Sensor.cpp */; };\n\t\tFACA06B1293EE5CD001A2557 /* Sensor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FACA06A9293EE5CD001A2557 /* Sensor.cpp */; };\n\t\tFACA06B2293EE5CD001A2557 /* Sensor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FACA06AA293EE5CD001A2557 /* Sensor.cpp */; };\n\t\tFACA06B3293EE5CD001A2557 /* Sensor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FACA06AA293EE5CD001A2557 /* Sensor.cpp */; };\n\t\tFACA06B4293EE5CD001A2557 /* wrap_Sensor.h in Headers */ = {isa = PBXBuildFile; fileRef = FACA06AB293EE5CD001A2557 /* wrap_Sensor.h */; };\n\t\tFACFB751276D7E3B0089F78D /* freetype.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = FACFB750276D7E2B0089F78D /* freetype.xcframework */; };\n\t\tFACFB753276D7F860089F78D /* Lua.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = FACFB752276D7F6F0089F78D /* Lua.xcframework */; };\n\t\tFAD19A171DFF8CA200D5398A /* ImageDataBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAD19A151DFF8CA200D5398A /* ImageDataBase.cpp */; };\n\t\tFAD19A181DFF8CA200D5398A /* ImageDataBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAD19A151DFF8CA200D5398A /* ImageDataBase.cpp */; };\n\t\tFAD19A191DFF8CA200D5398A /* ImageDataBase.h in Headers */ = {isa = PBXBuildFile; fileRef = FAD19A161DFF8CA200D5398A /* ImageDataBase.h */; };\n\t\tFAD43ECC1FF312D800831BB8 /* freetype.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FAD43ECB1FF312D800831BB8 /* freetype.framework */; };\n\t\tFADF4CC62663D0EC004F95C1 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = FADF4CC52663D0EC004F95C1 /* libz.tbd */; };\n\t\tFADF53F81E3C7ACD00012CC0 /* Buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADF53F61E3C7ACD00012CC0 /* Buffer.cpp */; };\n\t\tFADF53F91E3C7ACD00012CC0 /* Buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADF53F61E3C7ACD00012CC0 /* Buffer.cpp */; };\n\t\tFADF53FA1E3C7ACD00012CC0 /* Buffer.h in Headers */ = {isa = PBXBuildFile; fileRef = FADF53F71E3C7ACD00012CC0 /* Buffer.h */; };\n\t\tFADF53FD1E3D74F200012CC0 /* TextBatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADF53FB1E3D74F200012CC0 /* TextBatch.cpp */; };\n\t\tFADF53FE1E3D74F200012CC0 /* TextBatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADF53FB1E3D74F200012CC0 /* TextBatch.cpp */; };\n\t\tFADF53FF1E3D74F200012CC0 /* TextBatch.h in Headers */ = {isa = PBXBuildFile; fileRef = FADF53FC1E3D74F200012CC0 /* TextBatch.h */; };\n\t\tFADF54021E3D77B500012CC0 /* wrap_TextBatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADF54001E3D77B500012CC0 /* wrap_TextBatch.cpp */; };\n\t\tFADF54031E3D77B500012CC0 /* wrap_TextBatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADF54001E3D77B500012CC0 /* wrap_TextBatch.cpp */; };\n\t\tFADF54041E3D77B500012CC0 /* wrap_TextBatch.h in Headers */ = {isa = PBXBuildFile; fileRef = FADF54011E3D77B500012CC0 /* wrap_TextBatch.h */; };\n\t\tFADF54071E3D78F700012CC0 /* Video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADF54051E3D78F700012CC0 /* Video.cpp */; };\n\t\tFADF54081E3D78F700012CC0 /* Video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADF54051E3D78F700012CC0 /* Video.cpp */; };\n\t\tFADF54091E3D78F700012CC0 /* Video.h in Headers */ = {isa = PBXBuildFile; fileRef = FADF54061E3D78F700012CC0 /* Video.h */; };\n\t\tFADF540D1E3D7CDD00012CC0 /* wrap_Video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADF540A1E3D7CDD00012CC0 /* wrap_Video.cpp */; };\n\t\tFADF540E1E3D7CDD00012CC0 /* wrap_Video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADF540A1E3D7CDD00012CC0 /* wrap_Video.cpp */; };\n\t\tFADF540F1E3D7CDD00012CC0 /* wrap_Video.h in Headers */ = {isa = PBXBuildFile; fileRef = FADF540B1E3D7CDD00012CC0 /* wrap_Video.h */; };\n\t\tFADF54201E3DA52C00012CC0 /* wrap_ParticleSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADF541E1E3DA52C00012CC0 /* wrap_ParticleSystem.cpp */; };\n\t\tFADF54211E3DA52C00012CC0 /* wrap_ParticleSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADF541E1E3DA52C00012CC0 /* wrap_ParticleSystem.cpp */; };\n\t\tFADF54221E3DA52C00012CC0 /* wrap_ParticleSystem.h in Headers */ = {isa = PBXBuildFile; fileRef = FADF541F1E3DA52C00012CC0 /* wrap_ParticleSystem.h */; };\n\t\tFADF54251E3DA5BA00012CC0 /* Mesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADF54231E3DA5BA00012CC0 /* Mesh.cpp */; };\n\t\tFADF54261E3DA5BA00012CC0 /* Mesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADF54231E3DA5BA00012CC0 /* Mesh.cpp */; };\n\t\tFADF54271E3DA5BA00012CC0 /* Mesh.h in Headers */ = {isa = PBXBuildFile; fileRef = FADF54241E3DA5BA00012CC0 /* Mesh.h */; };\n\t\tFADF542A1E3DAADA00012CC0 /* wrap_Mesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADF54281E3DAADA00012CC0 /* wrap_Mesh.cpp */; };\n\t\tFADF542B1E3DAADA00012CC0 /* wrap_Mesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADF54281E3DAADA00012CC0 /* wrap_Mesh.cpp */; };\n\t\tFADF542C1E3DAADA00012CC0 /* wrap_Mesh.h in Headers */ = {isa = PBXBuildFile; fileRef = FADF54291E3DAADA00012CC0 /* wrap_Mesh.h */; };\n\t\tFADF542F1E3DABF600012CC0 /* SpriteBatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADF542D1E3DABF600012CC0 /* SpriteBatch.cpp */; };\n\t\tFADF54301E3DABF600012CC0 /* SpriteBatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADF542D1E3DABF600012CC0 /* SpriteBatch.cpp */; };\n\t\tFADF54311E3DABF600012CC0 /* SpriteBatch.h in Headers */ = {isa = PBXBuildFile; fileRef = FADF542E1E3DABF600012CC0 /* SpriteBatch.h */; };\n\t\tFADF54341E3DAE6E00012CC0 /* wrap_SpriteBatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADF54321E3DAE6E00012CC0 /* wrap_SpriteBatch.cpp */; };\n\t\tFADF54351E3DAE6E00012CC0 /* wrap_SpriteBatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADF54321E3DAE6E00012CC0 /* wrap_SpriteBatch.cpp */; };\n\t\tFADF54361E3DAE6E00012CC0 /* wrap_SpriteBatch.h in Headers */ = {isa = PBXBuildFile; fileRef = FADF54331E3DAE6E00012CC0 /* wrap_SpriteBatch.h */; };\n\t\tFADF543B1E3DAFF700012CC0 /* wrap_Graphics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADF54391E3DAFF700012CC0 /* wrap_Graphics.cpp */; };\n\t\tFADF543C1E3DAFF700012CC0 /* wrap_Graphics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADF54391E3DAFF700012CC0 /* wrap_Graphics.cpp */; };\n\t\tFADF543D1E3DAFF700012CC0 /* wrap_Graphics.h in Headers */ = {isa = PBXBuildFile; fileRef = FADF543A1E3DAFF700012CC0 /* wrap_Graphics.h */; };\n\t\tFAE272521C05A15B00A67640 /* ParticleSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAE272501C05A15B00A67640 /* ParticleSystem.cpp */; };\n\t\tFAE272531C05A15B00A67640 /* ParticleSystem.h in Headers */ = {isa = PBXBuildFile; fileRef = FAE272511C05A15B00A67640 /* ParticleSystem.h */; };\n\t\tFAE64A802071362A00BC7981 /* physfs_archiver_7z.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD5D1FE35E95006A60C7 /* physfs_archiver_7z.c */; };\n\t\tFAE64A812071363100BC7981 /* physfs_archiver_dir.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD6C1FE35E95006A60C7 /* physfs_archiver_dir.c */; };\n\t\tFAE64A822071363100BC7981 /* physfs_archiver_grp.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD741FE35E95006A60C7 /* physfs_archiver_grp.c */; };\n\t\tFAE64A832071363100BC7981 /* physfs_archiver_hog.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD751FE35E95006A60C7 /* physfs_archiver_hog.c */; };\n\t\tFAE64A842071363100BC7981 /* physfs_archiver_iso9660.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD6E1FE35E95006A60C7 /* physfs_archiver_iso9660.c */; };\n\t\tFAE64A852071363100BC7981 /* physfs_archiver_mvl.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD611FE35E95006A60C7 /* physfs_archiver_mvl.c */; };\n\t\tFAE64A862071363100BC7981 /* physfs_archiver_qpak.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD6F1FE35E95006A60C7 /* physfs_archiver_qpak.c */; };\n\t\tFAE64A872071363100BC7981 /* physfs_archiver_slb.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD5F1FE35E95006A60C7 /* physfs_archiver_slb.c */; };\n\t\tFAE64A882071363100BC7981 /* physfs_archiver_unpacked.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD671FE35E95006A60C7 /* physfs_archiver_unpacked.c */; };\n\t\tFAE64A892071363100BC7981 /* physfs_archiver_vdf.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD6A1FE35E95006A60C7 /* physfs_archiver_vdf.c */; };\n\t\tFAE64A8A2071363100BC7981 /* physfs_archiver_wad.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD621FE35E95006A60C7 /* physfs_archiver_wad.c */; };\n\t\tFAE64A8B2071363100BC7981 /* physfs_archiver_zip.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD761FE35E95006A60C7 /* physfs_archiver_zip.c */; };\n\t\tFAE64A8C2071363100BC7981 /* physfs_byteorder.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD6D1FE35E95006A60C7 /* physfs_byteorder.c */; };\n\t\tFAE64A8D2071363500BC7981 /* physfs_platform_apple.m in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD6B1FE35E95006A60C7 /* physfs_platform_apple.m */; };\n\t\tFAE64A8E2071363A00BC7981 /* physfs_platform_posix.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD721FE35E95006A60C7 /* physfs_platform_posix.c */; };\n\t\tFAE64A8F2071364200BC7981 /* physfs_platform_unix.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD5E1FE35E95006A60C7 /* physfs_platform_unix.c */; };\n\t\tFAE64A902071364800BC7981 /* physfs_unicode.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD681FE35E95006A60C7 /* physfs_unicode.c */; };\n\t\tFAE64A912071364800BC7981 /* physfs.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD5C1FE35E95006A60C7 /* physfs.c */; };\n\t\tFAE64A922071364B00BC7981 /* physfs_platform_winrt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD601FE35E95006A60C7 /* physfs_platform_winrt.cpp */; };\n\t\tFAE64A932071365100BC7981 /* physfs_platform_haiku.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD651FE35E95006A60C7 /* physfs_platform_haiku.cpp */; };\n\t\tFAE64A942071365100BC7981 /* physfs_platform_os2.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD641FE35E95006A60C7 /* physfs_platform_os2.c */; };\n\t\tFAE64A952071365100BC7981 /* physfs_platform_qnx.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD5B1FE35E95006A60C7 /* physfs_platform_qnx.c */; };\n\t\tFAE64A962071365100BC7981 /* physfs_platform_windows.c in Sources */ = {isa = PBXBuildFile; fileRef = FAC7CD661FE35E95006A60C7 /* physfs_platform_windows.c */; };\n\t\tFAECA1B21F3164700095D008 /* CompressedSlice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAECA1B01F3164700095D008 /* CompressedSlice.cpp */; };\n\t\tFAECA1B31F3164700095D008 /* CompressedSlice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAECA1B01F3164700095D008 /* CompressedSlice.cpp */; };\n\t\tFAECA1B41F3164700095D008 /* CompressedSlice.h in Headers */ = {isa = PBXBuildFile; fileRef = FAECA1B11F3164700095D008 /* CompressedSlice.h */; };\n\t\tFAECA1B51F31648A0095D008 /* FormatHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA93C4511F315B960087CCD4 /* FormatHandler.cpp */; };\n\t\tFAF140531E20934C00F898D2 /* CodeGen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FC21E20934C00F898D2 /* CodeGen.cpp */; };\n\t\tFAF140541E20934C00F898D2 /* CodeGen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FC21E20934C00F898D2 /* CodeGen.cpp */; };\n\t\tFAF140551E20934C00F898D2 /* Link.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FC31E20934C00F898D2 /* Link.cpp */; };\n\t\tFAF140561E20934C00F898D2 /* Link.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FC31E20934C00F898D2 /* Link.cpp */; };\n\t\tFAF140571E20934C00F898D2 /* arrays.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FC51E20934C00F898D2 /* arrays.h */; };\n\t\tFAF140581E20934C00F898D2 /* BaseTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FC61E20934C00F898D2 /* BaseTypes.h */; };\n\t\tFAF140591E20934C00F898D2 /* Common.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FC71E20934C00F898D2 /* Common.h */; };\n\t\tFAF1405A1E20934C00F898D2 /* ConstantUnion.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FC81E20934C00F898D2 /* ConstantUnion.h */; };\n\t\tFAF1405B1E20934C00F898D2 /* InfoSink.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FC91E20934C00F898D2 /* InfoSink.h */; };\n\t\tFAF1405C1E20934C00F898D2 /* InitializeGlobals.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FCA1E20934C00F898D2 /* InitializeGlobals.h */; };\n\t\tFAF1405D1E20934C00F898D2 /* intermediate.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FCB1E20934C00F898D2 /* intermediate.h */; };\n\t\tFAF1405E1E20934C00F898D2 /* PoolAlloc.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FCC1E20934C00F898D2 /* PoolAlloc.h */; };\n\t\tFAF1405F1E20934C00F898D2 /* ResourceLimits.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FCD1E20934C00F898D2 /* ResourceLimits.h */; };\n\t\tFAF140621E20934C00F898D2 /* ShHandle.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FD01E20934C00F898D2 /* ShHandle.h */; };\n\t\tFAF140631E20934C00F898D2 /* Types.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FD11E20934C00F898D2 /* Types.h */; };\n\t\tFAF140641E20934C00F898D2 /* Constant.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FD31E20934C00F898D2 /* Constant.cpp */; };\n\t\tFAF140651E20934C00F898D2 /* Constant.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FD31E20934C00F898D2 /* Constant.cpp */; };\n\t\tFAF140661E20934C00F898D2 /* gl_types.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FD41E20934C00F898D2 /* gl_types.h */; };\n\t\tFAF140691E20934C00F898D2 /* glslang_tab.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FD61E20934C00F898D2 /* glslang_tab.cpp */; };\n\t\tFAF1406A1E20934C00F898D2 /* glslang_tab.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FD61E20934C00F898D2 /* glslang_tab.cpp */; };\n\t\tFAF1406B1E20934C00F898D2 /* glslang_tab.cpp.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FD71E20934C00F898D2 /* glslang_tab.cpp.h */; };\n\t\tFAF1406C1E20934C00F898D2 /* InfoSink.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FD81E20934C00F898D2 /* InfoSink.cpp */; };\n\t\tFAF1406D1E20934C00F898D2 /* InfoSink.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FD81E20934C00F898D2 /* InfoSink.cpp */; };\n\t\tFAF1406E1E20934C00F898D2 /* Initialize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FD91E20934C00F898D2 /* Initialize.cpp */; };\n\t\tFAF1406F1E20934C00F898D2 /* Initialize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FD91E20934C00F898D2 /* Initialize.cpp */; };\n\t\tFAF140701E20934C00F898D2 /* Initialize.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FDA1E20934C00F898D2 /* Initialize.h */; };\n\t\tFAF140711E20934C00F898D2 /* Intermediate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FDB1E20934C00F898D2 /* Intermediate.cpp */; };\n\t\tFAF140721E20934C00F898D2 /* Intermediate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FDB1E20934C00F898D2 /* Intermediate.cpp */; };\n\t\tFAF140731E20934C00F898D2 /* intermOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FDC1E20934C00F898D2 /* intermOut.cpp */; };\n\t\tFAF140741E20934C00F898D2 /* intermOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FDC1E20934C00F898D2 /* intermOut.cpp */; };\n\t\tFAF140751E20934C00F898D2 /* IntermTraverse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FDD1E20934C00F898D2 /* IntermTraverse.cpp */; };\n\t\tFAF140761E20934C00F898D2 /* IntermTraverse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FDD1E20934C00F898D2 /* IntermTraverse.cpp */; };\n\t\tFAF140771E20934C00F898D2 /* iomapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FDE1E20934C00F898D2 /* iomapper.cpp */; };\n\t\tFAF140781E20934C00F898D2 /* iomapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FDE1E20934C00F898D2 /* iomapper.cpp */; };\n\t\tFAF140791E20934C00F898D2 /* iomapper.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FDF1E20934C00F898D2 /* iomapper.h */; };\n\t\tFAF1407A1E20934C00F898D2 /* limits.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FE01E20934C00F898D2 /* limits.cpp */; };\n\t\tFAF1407B1E20934C00F898D2 /* limits.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FE01E20934C00F898D2 /* limits.cpp */; };\n\t\tFAF1407C1E20934C00F898D2 /* linkValidate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FE11E20934C00F898D2 /* linkValidate.cpp */; };\n\t\tFAF1407D1E20934C00F898D2 /* linkValidate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FE11E20934C00F898D2 /* linkValidate.cpp */; };\n\t\tFAF1407E1E20934C00F898D2 /* LiveTraverser.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FE21E20934C00F898D2 /* LiveTraverser.h */; };\n\t\tFAF1407F1E20934C00F898D2 /* localintermediate.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FE31E20934C00F898D2 /* localintermediate.h */; };\n\t\tFAF140801E20934C00F898D2 /* parseConst.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FE41E20934C00F898D2 /* parseConst.cpp */; };\n\t\tFAF140811E20934C00F898D2 /* parseConst.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FE41E20934C00F898D2 /* parseConst.cpp */; };\n\t\tFAF140821E20934C00F898D2 /* ParseContextBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FE51E20934C00F898D2 /* ParseContextBase.cpp */; };\n\t\tFAF140831E20934C00F898D2 /* ParseContextBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FE51E20934C00F898D2 /* ParseContextBase.cpp */; };\n\t\tFAF140841E20934C00F898D2 /* ParseHelper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FE61E20934C00F898D2 /* ParseHelper.cpp */; };\n\t\tFAF140851E20934C00F898D2 /* ParseHelper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FE61E20934C00F898D2 /* ParseHelper.cpp */; };\n\t\tFAF140861E20934C00F898D2 /* ParseHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FE71E20934C00F898D2 /* ParseHelper.h */; };\n\t\tFAF140871E20934C00F898D2 /* parseVersions.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FE81E20934C00F898D2 /* parseVersions.h */; };\n\t\tFAF140881E20934C00F898D2 /* PoolAlloc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FE91E20934C00F898D2 /* PoolAlloc.cpp */; };\n\t\tFAF140891E20934C00F898D2 /* PoolAlloc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FE91E20934C00F898D2 /* PoolAlloc.cpp */; };\n\t\tFAF1408A1E20934C00F898D2 /* Pp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FEB1E20934C00F898D2 /* Pp.cpp */; };\n\t\tFAF1408B1E20934C00F898D2 /* Pp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FEB1E20934C00F898D2 /* Pp.cpp */; };\n\t\tFAF1408C1E20934C00F898D2 /* PpAtom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FEC1E20934C00F898D2 /* PpAtom.cpp */; };\n\t\tFAF1408D1E20934C00F898D2 /* PpAtom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FEC1E20934C00F898D2 /* PpAtom.cpp */; };\n\t\tFAF1408E1E20934C00F898D2 /* PpContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FED1E20934C00F898D2 /* PpContext.cpp */; };\n\t\tFAF1408F1E20934C00F898D2 /* PpContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FED1E20934C00F898D2 /* PpContext.cpp */; };\n\t\tFAF140901E20934C00F898D2 /* PpContext.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FEE1E20934C00F898D2 /* PpContext.h */; };\n\t\tFAF140931E20934C00F898D2 /* PpScanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FF01E20934C00F898D2 /* PpScanner.cpp */; };\n\t\tFAF140941E20934C00F898D2 /* PpScanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FF01E20934C00F898D2 /* PpScanner.cpp */; };\n\t\tFAF140971E20934C00F898D2 /* PpTokens.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FF21E20934C00F898D2 /* PpTokens.cpp */; };\n\t\tFAF140981E20934C00F898D2 /* PpTokens.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FF21E20934C00F898D2 /* PpTokens.cpp */; };\n\t\tFAF140991E20934C00F898D2 /* PpTokens.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FF31E20934C00F898D2 /* PpTokens.h */; };\n\t\tFAF1409A1E20934C00F898D2 /* propagateNoContraction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FF41E20934C00F898D2 /* propagateNoContraction.cpp */; };\n\t\tFAF1409B1E20934C00F898D2 /* propagateNoContraction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FF41E20934C00F898D2 /* propagateNoContraction.cpp */; };\n\t\tFAF1409C1E20934C00F898D2 /* propagateNoContraction.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FF51E20934C00F898D2 /* propagateNoContraction.h */; };\n\t\tFAF1409D1E20934C00F898D2 /* reflection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FF61E20934C00F898D2 /* reflection.cpp */; };\n\t\tFAF1409E1E20934C00F898D2 /* reflection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FF61E20934C00F898D2 /* reflection.cpp */; };\n\t\tFAF1409F1E20934C00F898D2 /* reflection.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FF71E20934C00F898D2 /* reflection.h */; };\n\t\tFAF140A01E20934C00F898D2 /* RemoveTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FF81E20934C00F898D2 /* RemoveTree.cpp */; };\n\t\tFAF140A11E20934C00F898D2 /* RemoveTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FF81E20934C00F898D2 /* RemoveTree.cpp */; };\n\t\tFAF140A21E20934C00F898D2 /* RemoveTree.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FF91E20934C00F898D2 /* RemoveTree.h */; };\n\t\tFAF140A31E20934C00F898D2 /* Scan.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FFA1E20934C00F898D2 /* Scan.cpp */; };\n\t\tFAF140A41E20934C00F898D2 /* Scan.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FFA1E20934C00F898D2 /* Scan.cpp */; };\n\t\tFAF140A51E20934C00F898D2 /* Scan.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FFB1E20934C00F898D2 /* Scan.h */; };\n\t\tFAF140A61E20934C00F898D2 /* ScanContext.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FFC1E20934C00F898D2 /* ScanContext.h */; };\n\t\tFAF140A71E20934C00F898D2 /* ShaderLang.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FFD1E20934C00F898D2 /* ShaderLang.cpp */; };\n\t\tFAF140A81E20934C00F898D2 /* ShaderLang.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FFD1E20934C00F898D2 /* ShaderLang.cpp */; };\n\t\tFAF140A91E20934C00F898D2 /* SymbolTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FFE1E20934C00F898D2 /* SymbolTable.cpp */; };\n\t\tFAF140AA1E20934C00F898D2 /* SymbolTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF13FFE1E20934C00F898D2 /* SymbolTable.cpp */; };\n\t\tFAF140AB1E20934C00F898D2 /* SymbolTable.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF13FFF1E20934C00F898D2 /* SymbolTable.h */; };\n\t\tFAF140AC1E20934C00F898D2 /* Versions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF140001E20934C00F898D2 /* Versions.cpp */; };\n\t\tFAF140AD1E20934C00F898D2 /* Versions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF140001E20934C00F898D2 /* Versions.cpp */; };\n\t\tFAF140AE1E20934C00F898D2 /* Versions.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF140011E20934C00F898D2 /* Versions.h */; };\n\t\tFAF140AF1E20934C00F898D2 /* osinclude.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF140031E20934C00F898D2 /* osinclude.h */; };\n\t\tFAF140BB1E20934C00F898D2 /* ossource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF140211E20934C00F898D2 /* ossource.cpp */; };\n\t\tFAF140BC1E20934C00F898D2 /* ossource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF140211E20934C00F898D2 /* ossource.cpp */; };\n\t\tFAF140C41E20934C00F898D2 /* ShaderLang.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF140291E20934C00F898D2 /* ShaderLang.h */; };\n\t\tFAF6C9DA23C2DE2900D7B5BC /* SPVRemapper.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF6C9C123C2DE2900D7B5BC /* SPVRemapper.h */; };\n\t\tFAF6C9DB23C2DE2900D7B5BC /* SpvBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF6C9C223C2DE2900D7B5BC /* SpvBuilder.h */; };\n\t\tFAF6C9DC23C2DE2900D7B5BC /* SpvPostProcess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF6C9C323C2DE2900D7B5BC /* SpvPostProcess.cpp */; };\n\t\tFAF6C9DD23C2DE2900D7B5BC /* SpvPostProcess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF6C9C323C2DE2900D7B5BC /* SpvPostProcess.cpp */; };\n\t\tFAF6C9DE23C2DE2900D7B5BC /* SpvTools.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF6C9C423C2DE2900D7B5BC /* SpvTools.h */; };\n\t\tFAF6C9DF23C2DE2900D7B5BC /* SpvTools.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF6C9C523C2DE2900D7B5BC /* SpvTools.cpp */; };\n\t\tFAF6C9E023C2DE2900D7B5BC /* SpvTools.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF6C9C523C2DE2900D7B5BC /* SpvTools.cpp */; };\n\t\tFAF6C9E123C2DE2900D7B5BC /* InReadableOrder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF6C9C623C2DE2900D7B5BC /* InReadableOrder.cpp */; };\n\t\tFAF6C9E223C2DE2900D7B5BC /* InReadableOrder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF6C9C623C2DE2900D7B5BC /* InReadableOrder.cpp */; };\n\t\tFAF6C9E323C2DE2900D7B5BC /* GLSL.ext.AMD.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF6C9C723C2DE2900D7B5BC /* GLSL.ext.AMD.h */; };\n\t\tFAF6C9E423C2DE2900D7B5BC /* doc.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF6C9C823C2DE2900D7B5BC /* doc.h */; };\n\t\tFAF6C9E623C2DE2900D7B5BC /* SpvBuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF6C9CA23C2DE2900D7B5BC /* SpvBuilder.cpp */; };\n\t\tFAF6C9E723C2DE2900D7B5BC /* SpvBuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF6C9CA23C2DE2900D7B5BC /* SpvBuilder.cpp */; };\n\t\tFAF6C9E823C2DE2900D7B5BC /* GLSL.ext.EXT.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF6C9CB23C2DE2900D7B5BC /* GLSL.ext.EXT.h */; };\n\t\tFAF6C9E923C2DE2900D7B5BC /* GLSL.ext.KHR.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF6C9CC23C2DE2900D7B5BC /* GLSL.ext.KHR.h */; };\n\t\tFAF6C9EA23C2DE2900D7B5BC /* GLSL.ext.NV.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF6C9CD23C2DE2900D7B5BC /* GLSL.ext.NV.h */; };\n\t\tFAF6C9EB23C2DE2900D7B5BC /* GlslangToSpv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF6C9CE23C2DE2900D7B5BC /* GlslangToSpv.cpp */; };\n\t\tFAF6C9EC23C2DE2900D7B5BC /* GlslangToSpv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF6C9CE23C2DE2900D7B5BC /* GlslangToSpv.cpp */; };\n\t\tFAF6C9ED23C2DE2900D7B5BC /* spvIR.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF6C9CF23C2DE2900D7B5BC /* spvIR.h */; };\n\t\tFAF6C9EE23C2DE2900D7B5BC /* bitutils.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF6C9D023C2DE2900D7B5BC /* bitutils.h */; };\n\t\tFAF6C9EF23C2DE2900D7B5BC /* disassemble.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF6C9D123C2DE2900D7B5BC /* disassemble.h */; };\n\t\tFAF6C9F023C2DE2900D7B5BC /* GlslangToSpv.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF6C9D223C2DE2900D7B5BC /* GlslangToSpv.h */; };\n\t\tFAF6C9F123C2DE2900D7B5BC /* GLSL.std.450.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF6C9D323C2DE2900D7B5BC /* GLSL.std.450.h */; };\n\t\tFAF6C9F223C2DE2900D7B5BC /* SPVRemapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF6C9D423C2DE2900D7B5BC /* SPVRemapper.cpp */; };\n\t\tFAF6C9F323C2DE2900D7B5BC /* SPVRemapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF6C9D423C2DE2900D7B5BC /* SPVRemapper.cpp */; };\n\t\tFAF6C9F423C2DE2900D7B5BC /* Logger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF6C9D523C2DE2900D7B5BC /* Logger.cpp */; };\n\t\tFAF6C9F523C2DE2900D7B5BC /* Logger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF6C9D523C2DE2900D7B5BC /* Logger.cpp */; };\n\t\tFAF6C9F623C2DE2900D7B5BC /* hex_float.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF6C9D623C2DE2900D7B5BC /* hex_float.h */; };\n\t\tFAF6C9F723C2DE2900D7B5BC /* Logger.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF6C9D723C2DE2900D7B5BC /* Logger.h */; };\n\t\tFAF6C9F823C2DE2900D7B5BC /* doc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF6C9D823C2DE2900D7B5BC /* doc.cpp */; };\n\t\tFAF6C9F923C2DE2900D7B5BC /* doc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF6C9D823C2DE2900D7B5BC /* doc.cpp */; };\n\t\tFAF6C9FA23C2DE2900D7B5BC /* disassemble.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF6C9D923C2DE2900D7B5BC /* disassemble.cpp */; };\n\t\tFAF6C9FB23C2DE2900D7B5BC /* disassemble.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF6C9D923C2DE2900D7B5BC /* disassemble.cpp */; };\n\t\tFAFEB29928F210550025D7D0 /* unixdgram.c in Sources */ = {isa = PBXBuildFile; fileRef = FAFEB29528F210540025D7D0 /* unixdgram.c */; };\n\t\tFAFEB29A28F210550025D7D0 /* unixdgram.c in Sources */ = {isa = PBXBuildFile; fileRef = FAFEB29528F210540025D7D0 /* unixdgram.c */; };\n\t\tFAFEB29B28F210550025D7D0 /* unixdgram.h in Headers */ = {isa = PBXBuildFile; fileRef = FAFEB29628F210550025D7D0 /* unixdgram.h */; };\n\t\tFAFEB29C28F210550025D7D0 /* unixstream.c in Sources */ = {isa = PBXBuildFile; fileRef = FAFEB29728F210550025D7D0 /* unixstream.c */; };\n\t\tFAFEB29D28F210550025D7D0 /* unixstream.c in Sources */ = {isa = PBXBuildFile; fileRef = FAFEB29728F210550025D7D0 /* unixstream.c */; };\n\t\tFAFEB29E28F210550025D7D0 /* unixstream.h in Headers */ = {isa = PBXBuildFile; fileRef = FAFEB29828F210550025D7D0 /* unixstream.h */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\tFA0B78DB1A958B90000E1D17 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"include/$(PRODUCT_NAME)\";\n\t\t\tdstSubfolderSpec = 16;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t217DFB9D1D9F6D490055D849 /* auxiliar.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = auxiliar.c; sourceTree = \"<group>\"; };\n\t\t217DFB9E1D9F6D490055D849 /* auxiliar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = auxiliar.h; sourceTree = \"<group>\"; };\n\t\t217DFB9F1D9F6D490055D849 /* buffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = buffer.c; sourceTree = \"<group>\"; };\n\t\t217DFBA01D9F6D490055D849 /* buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = buffer.h; sourceTree = \"<group>\"; };\n\t\t217DFBA11D9F6D490055D849 /* compat.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = compat.c; sourceTree = \"<group>\"; };\n\t\t217DFBA21D9F6D490055D849 /* compat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compat.h; sourceTree = \"<group>\"; };\n\t\t217DFBA31D9F6D490055D849 /* except.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = except.c; sourceTree = \"<group>\"; };\n\t\t217DFBA41D9F6D490055D849 /* except.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = except.h; sourceTree = \"<group>\"; };\n\t\t217DFBA51D9F6D490055D849 /* ftp.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ftp.lua; sourceTree = \"<group>\"; };\n\t\t217DFBA61D9F6D490055D849 /* ftp.lua.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftp.lua.h; sourceTree = \"<group>\"; };\n\t\t217DFBA71D9F6D490055D849 /* headers.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = headers.lua; sourceTree = \"<group>\"; };\n\t\t217DFBA81D9F6D490055D849 /* headers.lua.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = headers.lua.h; sourceTree = \"<group>\"; };\n\t\t217DFBA91D9F6D490055D849 /* http.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = http.lua; sourceTree = \"<group>\"; };\n\t\t217DFBAA1D9F6D490055D849 /* http.lua.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = http.lua.h; sourceTree = \"<group>\"; };\n\t\t217DFBAB1D9F6D490055D849 /* inet.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = inet.c; sourceTree = \"<group>\"; };\n\t\t217DFBAC1D9F6D490055D849 /* inet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inet.h; sourceTree = \"<group>\"; };\n\t\t217DFBAD1D9F6D490055D849 /* io.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = io.c; sourceTree = \"<group>\"; };\n\t\t217DFBAE1D9F6D490055D849 /* io.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = io.h; sourceTree = \"<group>\"; };\n\t\t217DFBAF1D9F6D490055D849 /* ltn12.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ltn12.lua; sourceTree = \"<group>\"; };\n\t\t217DFBB01D9F6D490055D849 /* ltn12.lua.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ltn12.lua.h; sourceTree = \"<group>\"; };\n\t\t217DFBB11D9F6D490055D849 /* luasocket.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = luasocket.c; sourceTree = \"<group>\"; };\n\t\t217DFBB21D9F6D490055D849 /* luasocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = luasocket.h; sourceTree = \"<group>\"; };\n\t\t217DFBB41D9F6D490055D849 /* mbox.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = mbox.lua; sourceTree = \"<group>\"; };\n\t\t217DFBB51D9F6D490055D849 /* mbox.lua.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mbox.lua.h; sourceTree = \"<group>\"; };\n\t\t217DFBB61D9F6D490055D849 /* mime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mime.c; sourceTree = \"<group>\"; };\n\t\t217DFBB71D9F6D490055D849 /* mime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mime.h; sourceTree = \"<group>\"; };\n\t\t217DFBB81D9F6D490055D849 /* mime.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = mime.lua; sourceTree = \"<group>\"; };\n\t\t217DFBB91D9F6D490055D849 /* mime.lua.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mime.lua.h; sourceTree = \"<group>\"; };\n\t\t217DFBBA1D9F6D490055D849 /* options.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = options.c; sourceTree = \"<group>\"; };\n\t\t217DFBBB1D9F6D490055D849 /* options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = options.h; sourceTree = \"<group>\"; };\n\t\t217DFBBC1D9F6D490055D849 /* pierror.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pierror.h; sourceTree = \"<group>\"; };\n\t\t217DFBBD1D9F6D490055D849 /* select.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = select.c; sourceTree = \"<group>\"; };\n\t\t217DFBBE1D9F6D490055D849 /* select.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = select.h; sourceTree = \"<group>\"; };\n\t\t217DFBBF1D9F6D490055D849 /* serial.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = serial.c; sourceTree = \"<group>\"; };\n\t\t217DFBC01D9F6D490055D849 /* smtp.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = smtp.lua; sourceTree = \"<group>\"; };\n\t\t217DFBC11D9F6D490055D849 /* smtp.lua.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = smtp.lua.h; sourceTree = \"<group>\"; };\n\t\t217DFBC21D9F6D490055D849 /* socket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = socket.h; sourceTree = \"<group>\"; };\n\t\t217DFBC31D9F6D490055D849 /* socket.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = socket.lua; sourceTree = \"<group>\"; };\n\t\t217DFBC41D9F6D490055D849 /* socket.lua.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = socket.lua.h; sourceTree = \"<group>\"; };\n\t\t217DFBC51D9F6D490055D849 /* tcp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tcp.c; sourceTree = \"<group>\"; };\n\t\t217DFBC61D9F6D490055D849 /* tcp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tcp.h; sourceTree = \"<group>\"; };\n\t\t217DFBC71D9F6D490055D849 /* timeout.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = timeout.c; sourceTree = \"<group>\"; };\n\t\t217DFBC81D9F6D490055D849 /* timeout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timeout.h; sourceTree = \"<group>\"; };\n\t\t217DFBC91D9F6D490055D849 /* tp.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = tp.lua; sourceTree = \"<group>\"; };\n\t\t217DFBCA1D9F6D490055D849 /* tp.lua.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tp.lua.h; sourceTree = \"<group>\"; };\n\t\t217DFBCB1D9F6D490055D849 /* udp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = udp.c; sourceTree = \"<group>\"; };\n\t\t217DFBCC1D9F6D490055D849 /* udp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = udp.h; sourceTree = \"<group>\"; };\n\t\t217DFBCD1D9F6D490055D849 /* unix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = unix.c; sourceTree = \"<group>\"; };\n\t\t217DFBCE1D9F6D490055D849 /* unix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unix.h; sourceTree = \"<group>\"; };\n\t\t217DFBD31D9F6D490055D849 /* url.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = url.lua; sourceTree = \"<group>\"; };\n\t\t217DFBD41D9F6D490055D849 /* url.lua.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = url.lua.h; sourceTree = \"<group>\"; };\n\t\t217DFBD51D9F6D490055D849 /* usocket.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = usocket.c; sourceTree = \"<group>\"; };\n\t\t217DFBD61D9F6D490055D849 /* usocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = usocket.h; sourceTree = \"<group>\"; };\n\t\tD91C76102DE3D088001FC408 /* spirv.hpp11 */ = {isa = PBXFileReference; lastKnownFileType = text; path = spirv.hpp11; sourceTree = \"<group>\"; };\n\t\tD91C76112DE3D088001FC408 /* spvUtil.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = spvUtil.h; sourceTree = \"<group>\"; };\n\t\tD91C76142DE3D0A2001FC408 /* visibility.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = visibility.h; sourceTree = \"<group>\"; };\n\t\tD923E7D2296B85B9002FF1B3 /* harfbuzz.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = harfbuzz.xcframework; path = ios/libraries/harfbuzz.xcframework; sourceTree = \"<group>\"; };\n\t\tD93660F72D1C727C00C0EC4B /* Touch.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Touch.cpp; sourceTree = \"<group>\"; };\n\t\tD943E58C2A24D56000D80361 /* PhysfsIo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PhysfsIo.cpp; sourceTree = \"<group>\"; };\n\t\tD943E58D2A24D56000D80361 /* PhysfsIo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PhysfsIo.h; sourceTree = \"<group>\"; };\n\t\tD9596F602CBAC93800BE58C1 /* SDL3.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = SDL3.xcframework; path = shared/Frameworks/SDL3.xcframework; sourceTree = \"<group>\"; };\n\t\tD9DAB9202961F0EE00C64820 /* HarfbuzzShaper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HarfbuzzShaper.h; sourceTree = \"<group>\"; };\n\t\tD9DAB9212961F0EE00C64820 /* HarfbuzzShaper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HarfbuzzShaper.cpp; sourceTree = \"<group>\"; };\n\t\tD9DAB9252961F0FF00C64820 /* GenericShaper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GenericShaper.h; sourceTree = \"<group>\"; };\n\t\tD9DAB9262961F0FF00C64820 /* GenericShaper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GenericShaper.cpp; sourceTree = \"<group>\"; };\n\t\tD9DAB9272961F0FF00C64820 /* TextShaper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextShaper.h; sourceTree = \"<group>\"; };\n\t\tD9DAB9282961F10000C64820 /* TextShaper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextShaper.cpp; sourceTree = \"<group>\"; };\n\t\tD9DAB9312963CD7500C64820 /* harfbuzz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = harfbuzz.framework; path = macosx/Frameworks/harfbuzz.framework; sourceTree = \"<group>\"; };\n\t\tD9DB6E252B4B40660037A1F6 /* ResourceLimits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResourceLimits.h; sourceTree = \"<group>\"; };\n\t\tD9DB6E282B4B40970037A1F6 /* span.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = span.h; sourceTree = \"<group>\"; };\n\t\tD9DB6E332B4B41100037A1F6 /* ResourceLimits.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ResourceLimits.cpp; sourceTree = \"<group>\"; };\n\t\tD9DB6E382B4B41570037A1F6 /* NonSemanticDebugPrintf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NonSemanticDebugPrintf.h; sourceTree = \"<group>\"; };\n\t\tD9DB6E392B4B41570037A1F6 /* NonSemanticShaderDebugInfo100.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NonSemanticShaderDebugInfo100.h; sourceTree = \"<group>\"; };\n\t\tD9DB6E3A2B4B41570037A1F6 /* GLSL.ext.ARM.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GLSL.ext.ARM.h; sourceTree = \"<group>\"; };\n\t\tD9DB6E3B2B4B41580037A1F6 /* GLSL.ext.QCOM.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GLSL.ext.QCOM.h; sourceTree = \"<group>\"; };\n\t\tD9DB6E442B4B80E80037A1F6 /* build_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = build_info.h; sourceTree = \"<group>\"; };\n\t\tD9F0C2CB2C68091200BB2D25 /* LibraryLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LibraryLoader.h; sourceTree = \"<group>\"; };\n\t\tD9F0C2CD2C680A5500BB2D25 /* CurlClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CurlClient.cpp; sourceTree = \"<group>\"; };\n\t\tD9F0C2CE2C680A5500BB2D25 /* CurlClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CurlClient.h; sourceTree = \"<group>\"; };\n\t\tD9F0C2CF2C680A5500BB2D25 /* LinktimeLibraryLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LinktimeLibraryLoader.cpp; sourceTree = \"<group>\"; };\n\t\tD9F0C2D02C680A5500BB2D25 /* OpenSSLConnection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OpenSSLConnection.cpp; sourceTree = \"<group>\"; };\n\t\tD9F0C2D12C680A5500BB2D25 /* OpenSSLConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenSSLConnection.h; sourceTree = \"<group>\"; };\n\t\tD9F0C2D22C680A5500BB2D25 /* UnixLibraryLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UnixLibraryLoader.cpp; sourceTree = \"<group>\"; };\n\t\tFA08F5AE16C7525600F007B5 /* liblove-macosx.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = \"liblove-macosx.plist\"; path = \"macosx/liblove-macosx.plist\"; sourceTree = \"<group>\"; };\n\t\tFA0A3A5D23366CE9001C269E /* floattypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = floattypes.h; sourceTree = \"<group>\"; };\n\t\tFA0A3A5E23366CE9001C269E /* floattypes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = floattypes.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B78DD1A958B90000E1D17 /* liblove.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = liblove.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tFA0B78F71A958E3B000E1D17 /* b64.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = b64.cpp; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };\n\t\tFA0B78F81A958E3B000E1D17 /* b64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = b64.h; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };\n\t\tFA0B78F91A958E3B000E1D17 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = \"<group>\"; };\n\t\tFA0B78FA1A958E3B000E1D17 /* Data.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Data.h; sourceTree = \"<group>\"; };\n\t\tFA0B78FB1A958E3B000E1D17 /* delay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = delay.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B78FC1A958E3B000E1D17 /* delay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = delay.h; sourceTree = \"<group>\"; };\n\t\tFA0B78FD1A958E3B000E1D17 /* EnumMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EnumMap.h; sourceTree = \"<group>\"; };\n\t\tFA0B78FE1A958E3B000E1D17 /* Exception.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Exception.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B78FF1A958E3B000E1D17 /* Exception.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Exception.h; sourceTree = \"<group>\"; };\n\t\tFA0B79001A958E3B000E1D17 /* int.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int.h; sourceTree = \"<group>\"; };\n\t\tFA0B79011A958E3B000E1D17 /* math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = math.h; sourceTree = \"<group>\"; };\n\t\tFA0B79021A958E3B000E1D17 /* Matrix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Matrix.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B79031A958E3B000E1D17 /* Matrix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Matrix.h; sourceTree = \"<group>\"; };\n\t\tFA0B79061A958E3B000E1D17 /* Module.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Module.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B79071A958E3B000E1D17 /* Module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Module.h; sourceTree = \"<group>\"; };\n\t\tFA0B79081A958E3B000E1D17 /* Object.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Object.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B79091A958E3B000E1D17 /* Object.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Object.h; sourceTree = \"<group>\"; };\n\t\tFA0B790C1A958E3B000E1D17 /* Reference.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Reference.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B790D1A958E3B000E1D17 /* Reference.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reference.h; sourceTree = \"<group>\"; };\n\t\tFA0B790E1A958E3B000E1D17 /* runtime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = runtime.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B790F1A958E3B000E1D17 /* runtime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = runtime.h; sourceTree = \"<group>\"; };\n\t\tFA0B79101A958E3B000E1D17 /* StringMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringMap.h; sourceTree = \"<group>\"; };\n\t\tFA0B79111A958E3B000E1D17 /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = types.h; sourceTree = \"<group>\"; };\n\t\tFA0B79121A958E3B000E1D17 /* utf8.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = utf8.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B79131A958E3B000E1D17 /* utf8.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utf8.h; sourceTree = \"<group>\"; };\n\t\tFA0B79141A958E3B000E1D17 /* Variant.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Variant.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B79151A958E3B000E1D17 /* Variant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Variant.h; sourceTree = \"<group>\"; };\n\t\tFA0B79161A958E3B000E1D17 /* Vector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Vector.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B79171A958E3B000E1D17 /* Vector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Vector.h; sourceTree = \"<group>\"; };\n\t\tFA0B79181A958E3B000E1D17 /* version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = version.h; sourceTree = \"<group>\"; };\n\t\tFA0B79B51A958EA3000E1D17 /* ddsinfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ddsinfo.h; sourceTree = \"<group>\"; };\n\t\tFA0B79B61A958EA3000E1D17 /* ddsparse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ddsparse.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B79B71A958EA3000E1D17 /* ddsparse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ddsparse.h; sourceTree = \"<group>\"; };\n\t\tFA0B79B91A958EA3000E1D17 /* enet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = enet.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B79BB1A958EA3000E1D17 /* callbacks.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = callbacks.c; sourceTree = \"<group>\"; };\n\t\tFA0B79BD1A958EA3000E1D17 /* compress.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = compress.c; sourceTree = \"<group>\"; };\n\t\tFA0B79BE1A958EA3000E1D17 /* host.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = host.c; sourceTree = \"<group>\"; };\n\t\tFA0B79C11A958EA3000E1D17 /* callbacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = callbacks.h; sourceTree = \"<group>\"; };\n\t\tFA0B79C21A958EA3000E1D17 /* enet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = enet.h; sourceTree = \"<group>\"; };\n\t\tFA0B79C31A958EA3000E1D17 /* list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = list.h; sourceTree = \"<group>\"; };\n\t\tFA0B79C41A958EA3000E1D17 /* protocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = protocol.h; sourceTree = \"<group>\"; };\n\t\tFA0B79C51A958EA3000E1D17 /* time.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = time.h; sourceTree = \"<group>\"; };\n\t\tFA0B79C61A958EA3000E1D17 /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = types.h; sourceTree = \"<group>\"; };\n\t\tFA0B79C71A958EA3000E1D17 /* unix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unix.h; sourceTree = \"<group>\"; };\n\t\tFA0B79C81A958EA3000E1D17 /* utility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utility.h; sourceTree = \"<group>\"; };\n\t\tFA0B79C91A958EA3000E1D17 /* win32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = win32.h; sourceTree = \"<group>\"; };\n\t\tFA0B79CB1A958EA3000E1D17 /* list.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = list.c; sourceTree = \"<group>\"; };\n\t\tFA0B79CC1A958EA3000E1D17 /* packet.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = packet.c; sourceTree = \"<group>\"; };\n\t\tFA0B79CD1A958EA3000E1D17 /* peer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = peer.c; sourceTree = \"<group>\"; };\n\t\tFA0B79CE1A958EA3000E1D17 /* protocol.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = protocol.c; sourceTree = \"<group>\"; };\n\t\tFA0B79D01A958EA3000E1D17 /* unix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = unix.c; sourceTree = \"<group>\"; };\n\t\tFA0B79D11A958EA3000E1D17 /* win32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = win32.c; sourceTree = \"<group>\"; };\n\t\tFA0B79D21A958EA3000E1D17 /* lua-enet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"lua-enet.h\"; sourceTree = \"<group>\"; };\n\t\tFA0B79D41A958EA3000E1D17 /* glad.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = glad.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B79D61A958EA3000E1D17 /* glad.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = glad.hpp; sourceTree = \"<group>\"; };\n\t\tFA0B79D71A958EA3000E1D17 /* gladfuncs.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = gladfuncs.hpp; sourceTree = \"<group>\"; };\n\t\tFA0B79D91A958EA3000E1D17 /* lodepng.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lodepng.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B79DA1A958EA3000E1D17 /* lodepng.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lodepng.h; sourceTree = \"<group>\"; };\n\t\tFA0B7A0E1A958EA3000E1D17 /* luasocket.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = luasocket.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7A0F1A958EA3000E1D17 /* luasocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = luasocket.h; sourceTree = \"<group>\"; };\n\t\tFA0B7A151A958EA3000E1D17 /* simplexnoise1234.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = simplexnoise1234.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7A161A958EA3000E1D17 /* simplexnoise1234.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = simplexnoise1234.h; sourceTree = \"<group>\"; };\n\t\tFA0B7A181A958EA3000E1D17 /* stb_image.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stb_image.h; sourceTree = \"<group>\"; };\n\t\tFA0B7A1B1A958EA3000E1D17 /* checked.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = checked.h; sourceTree = \"<group>\"; };\n\t\tFA0B7A1C1A958EA3000E1D17 /* core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = core.h; sourceTree = \"<group>\"; };\n\t\tFA0B7A1D1A958EA3000E1D17 /* unchecked.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unchecked.h; sourceTree = \"<group>\"; };\n\t\tFA0B7A1E1A958EA3000E1D17 /* utf8.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utf8.h; sourceTree = \"<group>\"; };\n\t\tFA0B7A201A958EA3000E1D17 /* wuff.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wuff.c; sourceTree = \"<group>\"; };\n\t\tFA0B7A211A958EA3000E1D17 /* wuff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wuff.h; sourceTree = \"<group>\"; };\n\t\tFA0B7A221A958EA3000E1D17 /* wuff_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wuff_config.h; sourceTree = \"<group>\"; };\n\t\tFA0B7A231A958EA3000E1D17 /* wuff_convert.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wuff_convert.c; sourceTree = \"<group>\"; };\n\t\tFA0B7A241A958EA3000E1D17 /* wuff_convert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wuff_convert.h; sourceTree = \"<group>\"; };\n\t\tFA0B7A251A958EA3000E1D17 /* wuff_internal.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wuff_internal.c; sourceTree = \"<group>\"; };\n\t\tFA0B7A261A958EA3000E1D17 /* wuff_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wuff_internal.h; sourceTree = \"<group>\"; };\n\t\tFA0B7A271A958EA3000E1D17 /* wuff_memory.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wuff_memory.c; sourceTree = \"<group>\"; };\n\t\tFA0B7B3E1A95902C000E1D17 /* Audio.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = Audio.cpp; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };\n\t\tFA0B7B3F1A95902C000E1D17 /* Audio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = Audio.h; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };\n\t\tFA0B7B411A95902C000E1D17 /* Audio.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = Audio.cpp; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };\n\t\tFA0B7B421A95902C000E1D17 /* Audio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = Audio.h; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };\n\t\tFA0B7B431A95902C000E1D17 /* Source.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Source.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B441A95902C000E1D17 /* Source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Source.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B461A95902C000E1D17 /* Audio.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = Audio.cpp; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };\n\t\tFA0B7B471A95902C000E1D17 /* Audio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = Audio.h; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };\n\t\tFA0B7B481A95902C000E1D17 /* Pool.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Pool.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B491A95902C000E1D17 /* Pool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Pool.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B4A1A95902C000E1D17 /* Source.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Source.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B4B1A95902C000E1D17 /* Source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Source.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B4C1A95902C000E1D17 /* Source.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Source.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B4D1A95902C000E1D17 /* Source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Source.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B4E1A95902C000E1D17 /* wrap_Audio.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Audio.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B4F1A95902C000E1D17 /* wrap_Audio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Audio.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B501A95902C000E1D17 /* wrap_Source.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Source.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B511A95902C000E1D17 /* wrap_Source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Source.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B531A95902C000E1D17 /* Event.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Event.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B541A95902C000E1D17 /* Event.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Event.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B561A95902C000E1D17 /* Event.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Event.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B571A95902C000E1D17 /* Event.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Event.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B5D1A95902C000E1D17 /* File.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = File.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B5E1A95902C000E1D17 /* File.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = File.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B5F1A95902C000E1D17 /* FileData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileData.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B601A95902C000E1D17 /* FileData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileData.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B611A95902C000E1D17 /* Filesystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Filesystem.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B621A95902C000E1D17 /* Filesystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Filesystem.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B641A95902C000E1D17 /* File.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = File.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B651A95902C000E1D17 /* File.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = File.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B661A95902C000E1D17 /* Filesystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Filesystem.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B671A95902C000E1D17 /* Filesystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Filesystem.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B6A1A95902C000E1D17 /* wrap_File.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_File.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B6B1A95902C000E1D17 /* wrap_File.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_File.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B6C1A95902C000E1D17 /* wrap_FileData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_FileData.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B6D1A95902C000E1D17 /* wrap_FileData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_FileData.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B6E1A95902C000E1D17 /* wrap_Filesystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Filesystem.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B6F1A95902C000E1D17 /* wrap_Filesystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Filesystem.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B711A95902C000E1D17 /* BMFontRasterizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = BMFontRasterizer.cpp; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };\n\t\tFA0B7B721A95902C000E1D17 /* BMFontRasterizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BMFontRasterizer.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B731A95902C000E1D17 /* Font.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Font.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B741A95902C000E1D17 /* Font.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Font.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B761A95902C000E1D17 /* Font.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Font.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B771A95902C000E1D17 /* Font.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Font.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B781A95902C000E1D17 /* TrueTypeRasterizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TrueTypeRasterizer.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B791A95902C000E1D17 /* TrueTypeRasterizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrueTypeRasterizer.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B7A1A95902C000E1D17 /* GlyphData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GlyphData.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B7B1A95902C000E1D17 /* GlyphData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GlyphData.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B7C1A95902C000E1D17 /* ImageRasterizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ImageRasterizer.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B7D1A95902C000E1D17 /* ImageRasterizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageRasterizer.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B7E1A95902C000E1D17 /* Rasterizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Rasterizer.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B7F1A95902C000E1D17 /* Rasterizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Rasterizer.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B811A95902C000E1D17 /* wrap_Font.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Font.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B821A95902C000E1D17 /* wrap_Font.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Font.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B831A95902C000E1D17 /* wrap_GlyphData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_GlyphData.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B841A95902C000E1D17 /* wrap_GlyphData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_GlyphData.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B851A95902C000E1D17 /* wrap_Rasterizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Rasterizer.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B861A95902C000E1D17 /* wrap_Rasterizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Rasterizer.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B891A95902C000E1D17 /* Drawable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Drawable.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B8A1A95902C000E1D17 /* Graphics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = Graphics.cpp; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };\n\t\tFA0B7B8B1A95902C000E1D17 /* Graphics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Graphics.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B911A95902C000E1D17 /* Graphics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = Graphics.cpp; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };\n\t\tFA0B7B921A95902C000E1D17 /* Graphics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Graphics.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B931A95902C000E1D17 /* Texture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Texture.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B941A95902C000E1D17 /* Texture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Texture.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B971A95902C000E1D17 /* OpenGL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OpenGL.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B981A95902C000E1D17 /* OpenGL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenGL.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B9B1A95902C000E1D17 /* Polyline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Polyline.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B9C1A95902C000E1D17 /* Polyline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Polyline.h; sourceTree = \"<group>\"; };\n\t\tFA0B7B9D1A95902C000E1D17 /* Shader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Shader.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7B9E1A95902C000E1D17 /* Shader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Shader.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BA41A95902C000E1D17 /* Buffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Buffer.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7BA51A95902C000E1D17 /* Buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Buffer.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BBC1A95902C000E1D17 /* Quad.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Quad.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7BBD1A95902C000E1D17 /* Quad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Quad.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BBE1A95902C000E1D17 /* Texture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = Texture.cpp; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };\n\t\tFA0B7BBF1A95902C000E1D17 /* Texture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Texture.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BC01A95902C000E1D17 /* Volatile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Volatile.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7BC11A95902C000E1D17 /* Volatile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Volatile.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BC31A95902C000E1D17 /* CompressedImageData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CompressedImageData.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7BC41A95902C000E1D17 /* CompressedImageData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CompressedImageData.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BC51A95902C000E1D17 /* Image.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Image.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BC61A95902C000E1D17 /* ImageData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ImageData.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7BC71A95902C000E1D17 /* ImageData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageData.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BCC1A95902C000E1D17 /* ddsHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ddsHandler.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7BCD1A95902C000E1D17 /* ddsHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ddsHandler.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BD81A95902C000E1D17 /* KTXHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = KTXHandler.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7BD91A95902C000E1D17 /* KTXHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KTXHandler.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BDA1A95902C000E1D17 /* PKMHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PKMHandler.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7BDB1A95902C000E1D17 /* PKMHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PKMHandler.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BDC1A95902C000E1D17 /* PNGHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PNGHandler.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7BDD1A95902C000E1D17 /* PNGHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PNGHandler.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BDE1A95902C000E1D17 /* PVRHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PVRHandler.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7BDF1A95902C000E1D17 /* PVRHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PVRHandler.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BE01A95902C000E1D17 /* STBHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = STBHandler.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7BE11A95902C000E1D17 /* STBHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STBHandler.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BE21A95902C000E1D17 /* wrap_CompressedImageData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_CompressedImageData.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7BE31A95902C000E1D17 /* wrap_CompressedImageData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_CompressedImageData.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BE41A95902C000E1D17 /* wrap_Image.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Image.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7BE51A95902C000E1D17 /* wrap_Image.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Image.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BE61A95902C000E1D17 /* wrap_ImageData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_ImageData.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7BE71A95902C000E1D17 /* wrap_ImageData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_ImageData.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BE91A95902C000E1D17 /* Joystick.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Joystick.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7BEA1A95902C000E1D17 /* Joystick.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Joystick.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BEB1A95902C000E1D17 /* JoystickModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JoystickModule.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BED1A95902C000E1D17 /* Joystick.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Joystick.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7BEE1A95902C000E1D17 /* Joystick.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Joystick.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BEF1A95902C000E1D17 /* JoystickModule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JoystickModule.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7BF01A95902C000E1D17 /* JoystickModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JoystickModule.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BF11A95902C000E1D17 /* wrap_Joystick.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Joystick.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7BF21A95902C000E1D17 /* wrap_Joystick.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Joystick.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BF31A95902C000E1D17 /* wrap_JoystickModule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_JoystickModule.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7BF41A95902C000E1D17 /* wrap_JoystickModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_JoystickModule.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BF61A95902C000E1D17 /* Keyboard.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Keyboard.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7BF71A95902C000E1D17 /* Keyboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Keyboard.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BF91A95902C000E1D17 /* Keyboard.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Keyboard.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7BFA1A95902C000E1D17 /* Keyboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Keyboard.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BFB1A95902C000E1D17 /* wrap_Keyboard.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Keyboard.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7BFC1A95902C000E1D17 /* wrap_Keyboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Keyboard.h; sourceTree = \"<group>\"; };\n\t\tFA0B7BFE1A95902C000E1D17 /* love.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = love.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7BFF1A95902C000E1D17 /* love.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = love.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C011A95902C000E1D17 /* BezierCurve.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = BezierCurve.cpp; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };\n\t\tFA0B7C021A95902C000E1D17 /* BezierCurve.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = BezierCurve.h; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };\n\t\tFA0B7C031A95902C000E1D17 /* MathModule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MathModule.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C041A95902C000E1D17 /* MathModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MathModule.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C051A95902C000E1D17 /* RandomGenerator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RandomGenerator.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C061A95902C000E1D17 /* RandomGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RandomGenerator.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C071A95902C000E1D17 /* wrap_BezierCurve.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_BezierCurve.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C081A95902C000E1D17 /* wrap_BezierCurve.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_BezierCurve.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C091A95902C000E1D17 /* wrap_Math.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Math.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C0A1A95902C000E1D17 /* wrap_Math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Math.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C0B1A95902C000E1D17 /* wrap_RandomGenerator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_RandomGenerator.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C0C1A95902C000E1D17 /* wrap_RandomGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_RandomGenerator.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C0E1A95902C000E1D17 /* Cursor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Cursor.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C0F1A95902C000E1D17 /* Cursor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Cursor.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C111A95902C000E1D17 /* Mouse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Mouse.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C131A95902C000E1D17 /* Cursor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Cursor.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C141A95902C000E1D17 /* Cursor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Cursor.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C151A95902C000E1D17 /* Mouse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Mouse.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C161A95902C000E1D17 /* Mouse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Mouse.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C171A95902C000E1D17 /* wrap_Cursor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Cursor.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C181A95902C000E1D17 /* wrap_Cursor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Cursor.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C191A95902C000E1D17 /* wrap_Mouse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Mouse.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C1A1A95902C000E1D17 /* wrap_Mouse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Mouse.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C1C1A95902C000E1D17 /* Body.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Body.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C1D1A95902C000E1D17 /* Body.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Body.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C1F1A95902C000E1D17 /* Body.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Body.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C201A95902C000E1D17 /* Body.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Body.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C211A95902C000E1D17 /* ChainShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ChainShape.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C221A95902C000E1D17 /* ChainShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChainShape.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C231A95902C000E1D17 /* CircleShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CircleShape.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C241A95902C000E1D17 /* CircleShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CircleShape.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C251A95902C000E1D17 /* Contact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Contact.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C261A95902C000E1D17 /* Contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Contact.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C271A95902C000E1D17 /* DistanceJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DistanceJoint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C281A95902C000E1D17 /* DistanceJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DistanceJoint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C291A95902C000E1D17 /* EdgeShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EdgeShape.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C2A1A95902C000E1D17 /* EdgeShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EdgeShape.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C2D1A95902C000E1D17 /* FrictionJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FrictionJoint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C2E1A95902C000E1D17 /* FrictionJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FrictionJoint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C2F1A95902C000E1D17 /* GearJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GearJoint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C301A95902C000E1D17 /* GearJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GearJoint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C311A95902C000E1D17 /* Joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Joint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C321A95902C000E1D17 /* Joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Joint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C331A95902C000E1D17 /* MotorJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MotorJoint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C341A95902C000E1D17 /* MotorJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MotorJoint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C351A95902C000E1D17 /* MouseJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MouseJoint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C361A95902C000E1D17 /* MouseJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MouseJoint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C371A95902C000E1D17 /* Physics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Physics.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C381A95902C000E1D17 /* Physics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Physics.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C391A95902C000E1D17 /* PolygonShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PolygonShape.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C3A1A95902C000E1D17 /* PolygonShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PolygonShape.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C3B1A95902C000E1D17 /* PrismaticJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PrismaticJoint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C3C1A95902C000E1D17 /* PrismaticJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PrismaticJoint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C3D1A95902C000E1D17 /* PulleyJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PulleyJoint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C3E1A95902C000E1D17 /* PulleyJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PulleyJoint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C3F1A95902C000E1D17 /* RevoluteJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RevoluteJoint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C401A95902C000E1D17 /* RevoluteJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RevoluteJoint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C411A95902C000E1D17 /* RopeJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RopeJoint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C421A95902C000E1D17 /* RopeJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RopeJoint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C431A95902C000E1D17 /* Shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Shape.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C441A95902C000E1D17 /* Shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Shape.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C451A95902C000E1D17 /* WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WeldJoint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C461A95902C000E1D17 /* WeldJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WeldJoint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C471A95902C000E1D17 /* WheelJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WheelJoint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C481A95902C000E1D17 /* WheelJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WheelJoint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C491A95902C000E1D17 /* World.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = World.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C4A1A95902C000E1D17 /* World.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = World.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C4B1A95902C000E1D17 /* wrap_Body.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Body.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C4C1A95902C000E1D17 /* wrap_Body.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Body.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C4D1A95902C000E1D17 /* wrap_ChainShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_ChainShape.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C4E1A95902C000E1D17 /* wrap_ChainShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_ChainShape.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C4F1A95902C000E1D17 /* wrap_CircleShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_CircleShape.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C501A95902C000E1D17 /* wrap_CircleShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_CircleShape.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C511A95902C000E1D17 /* wrap_Contact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Contact.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C521A95902C000E1D17 /* wrap_Contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Contact.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C531A95902C000E1D17 /* wrap_DistanceJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_DistanceJoint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C541A95902C000E1D17 /* wrap_DistanceJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_DistanceJoint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C551A95902C000E1D17 /* wrap_EdgeShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_EdgeShape.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C561A95902C000E1D17 /* wrap_EdgeShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_EdgeShape.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C591A95902C000E1D17 /* wrap_FrictionJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_FrictionJoint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C5A1A95902C000E1D17 /* wrap_FrictionJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_FrictionJoint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C5B1A95902C000E1D17 /* wrap_GearJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_GearJoint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C5C1A95902C000E1D17 /* wrap_GearJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_GearJoint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C5D1A95902C000E1D17 /* wrap_Joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Joint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C5E1A95902C000E1D17 /* wrap_Joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Joint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C5F1A95902C000E1D17 /* wrap_MotorJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_MotorJoint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C601A95902C000E1D17 /* wrap_MotorJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_MotorJoint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C611A95902C000E1D17 /* wrap_MouseJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_MouseJoint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C621A95902C000E1D17 /* wrap_MouseJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_MouseJoint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C631A95902C000E1D17 /* wrap_Physics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Physics.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C641A95902C000E1D17 /* wrap_Physics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Physics.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C651A95902C000E1D17 /* wrap_PolygonShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_PolygonShape.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C661A95902C000E1D17 /* wrap_PolygonShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_PolygonShape.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C671A95902C000E1D17 /* wrap_PrismaticJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_PrismaticJoint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C681A95902C000E1D17 /* wrap_PrismaticJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_PrismaticJoint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C691A95902C000E1D17 /* wrap_PulleyJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_PulleyJoint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C6A1A95902C000E1D17 /* wrap_PulleyJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_PulleyJoint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C6B1A95902C000E1D17 /* wrap_RevoluteJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_RevoluteJoint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C6C1A95902C000E1D17 /* wrap_RevoluteJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_RevoluteJoint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C6D1A95902C000E1D17 /* wrap_RopeJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_RopeJoint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C6E1A95902C000E1D17 /* wrap_RopeJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_RopeJoint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C6F1A95902C000E1D17 /* wrap_Shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Shape.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C701A95902C000E1D17 /* wrap_Shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Shape.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C711A95902C000E1D17 /* wrap_WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_WeldJoint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C721A95902C000E1D17 /* wrap_WeldJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_WeldJoint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C731A95902C000E1D17 /* wrap_WheelJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_WheelJoint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C741A95902C000E1D17 /* wrap_WheelJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_WheelJoint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C751A95902C000E1D17 /* wrap_World.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_World.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C761A95902C000E1D17 /* wrap_World.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_World.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C771A95902C000E1D17 /* Joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Joint.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C781A95902C000E1D17 /* Joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Joint.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C791A95902C000E1D17 /* Shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Shape.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C7A1A95902C000E1D17 /* Shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Shape.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C7C1A95902C000E1D17 /* Decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Decoder.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C7E1A95902C000E1D17 /* CoreAudioDecoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CoreAudioDecoder.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C7F1A95902C000E1D17 /* CoreAudioDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoreAudioDecoder.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C801A95902C000E1D17 /* Decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Decoder.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C821A95902C000E1D17 /* FLACDecoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FLACDecoder.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C831A95902C000E1D17 /* FLACDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLACDecoder.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C861A95902C000E1D17 /* ModPlugDecoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ModPlugDecoder.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C871A95902C000E1D17 /* ModPlugDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModPlugDecoder.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C8A1A95902C000E1D17 /* Sound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Sound.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C8B1A95902C000E1D17 /* Sound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sound.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C8C1A95902C000E1D17 /* VorbisDecoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VorbisDecoder.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C8D1A95902C000E1D17 /* VorbisDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VorbisDecoder.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C8E1A95902C000E1D17 /* WaveDecoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WaveDecoder.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C8F1A95902C000E1D17 /* WaveDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WaveDecoder.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C901A95902C000E1D17 /* Sound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Sound.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C911A95902C000E1D17 /* Sound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sound.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C921A95902C000E1D17 /* SoundData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SoundData.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C931A95902C000E1D17 /* SoundData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SoundData.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C941A95902C000E1D17 /* wrap_Decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Decoder.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C951A95902C000E1D17 /* wrap_Decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Decoder.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C961A95902C000E1D17 /* wrap_Sound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Sound.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C971A95902C000E1D17 /* wrap_Sound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Sound.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C981A95902C000E1D17 /* wrap_SoundData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_SoundData.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C991A95902C000E1D17 /* wrap_SoundData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_SoundData.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C9C1A95902C000E1D17 /* System.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = System.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C9D1A95902C000E1D17 /* System.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = System.h; sourceTree = \"<group>\"; };\n\t\tFA0B7C9E1A95902C000E1D17 /* System.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = System.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7C9F1A95902C000E1D17 /* System.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = System.h; sourceTree = \"<group>\"; };\n\t\tFA0B7CA01A95902C000E1D17 /* wrap_System.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_System.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7CA11A95902C000E1D17 /* wrap_System.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_System.h; sourceTree = \"<group>\"; };\n\t\tFA0B7CA31A95902C000E1D17 /* Channel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Channel.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7CA41A95902C000E1D17 /* Channel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Channel.h; sourceTree = \"<group>\"; };\n\t\tFA0B7CA51A95902C000E1D17 /* LuaThread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LuaThread.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7CA61A95902C000E1D17 /* LuaThread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LuaThread.h; sourceTree = \"<group>\"; };\n\t\tFA0B7CA81A95902C000E1D17 /* Thread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Thread.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7CA91A95902C000E1D17 /* Thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Thread.h; sourceTree = \"<group>\"; };\n\t\tFA0B7CAA1A95902C000E1D17 /* threads.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = threads.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7CAB1A95902C000E1D17 /* threads.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = threads.h; sourceTree = \"<group>\"; };\n\t\tFA0B7CAC1A95902C000E1D17 /* Thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Thread.h; sourceTree = \"<group>\"; };\n\t\tFA0B7CAD1A95902C000E1D17 /* ThreadModule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ThreadModule.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7CAE1A95902C000E1D17 /* ThreadModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThreadModule.h; sourceTree = \"<group>\"; };\n\t\tFA0B7CAF1A95902C000E1D17 /* threads.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = threads.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7CB01A95902C000E1D17 /* threads.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = threads.h; sourceTree = \"<group>\"; };\n\t\tFA0B7CB11A95902C000E1D17 /* wrap_Channel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Channel.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7CB21A95902C000E1D17 /* wrap_Channel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Channel.h; sourceTree = \"<group>\"; };\n\t\tFA0B7CB31A95902C000E1D17 /* wrap_LuaThread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_LuaThread.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7CB41A95902C000E1D17 /* wrap_LuaThread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_LuaThread.h; sourceTree = \"<group>\"; };\n\t\tFA0B7CB51A95902C000E1D17 /* wrap_ThreadModule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_ThreadModule.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7CB61A95902C000E1D17 /* wrap_ThreadModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_ThreadModule.h; sourceTree = \"<group>\"; };\n\t\tFA0B7CBB1A95902C000E1D17 /* Timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Timer.h; sourceTree = \"<group>\"; };\n\t\tFA0B7CBC1A95902C000E1D17 /* wrap_Timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Timer.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7CBD1A95902C000E1D17 /* wrap_Timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Timer.h; sourceTree = \"<group>\"; };\n\t\tFA0B7CC01A95902C000E1D17 /* Touch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Touch.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7CC11A95902C000E1D17 /* Touch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Touch.h; sourceTree = \"<group>\"; };\n\t\tFA0B7CC21A95902C000E1D17 /* Touch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Touch.h; sourceTree = \"<group>\"; };\n\t\tFA0B7CC31A95902C000E1D17 /* wrap_Touch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Touch.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7CC41A95902C000E1D17 /* wrap_Touch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Touch.h; sourceTree = \"<group>\"; };\n\t\tFA0B7CC71A95902C000E1D17 /* Window.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Window.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7CC81A95902C000E1D17 /* Window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Window.h; sourceTree = \"<group>\"; };\n\t\tFA0B7CC91A95902C000E1D17 /* Window.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Window.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7CCA1A95902C000E1D17 /* Window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Window.h; sourceTree = \"<group>\"; };\n\t\tFA0B7CCB1A95902C000E1D17 /* wrap_Window.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Window.cpp; sourceTree = \"<group>\"; };\n\t\tFA0B7CCC1A95902C000E1D17 /* wrap_Window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Window.h; sourceTree = \"<group>\"; };\n\t\tFA0B7EF01A959D2C000E1D17 /* ios.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ios.h; sourceTree = \"<group>\"; };\n\t\tFA0B7EF11A959D2C000E1D17 /* ios.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ios.mm; sourceTree = \"<group>\"; };\n\t\tFA10DD7B1F9EC24E00E1FE3D /* Resource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Resource.h; sourceTree = \"<group>\"; };\n\t\tFA1557BF1CE90A2C00AFF582 /* tinyexr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tinyexr.h; sourceTree = \"<group>\"; };\n\t\tFA1557C11CE90BD200AFF582 /* EXRHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EXRHandler.cpp; sourceTree = \"<group>\"; };\n\t\tFA1557C21CE90BD200AFF582 /* EXRHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EXRHandler.h; sourceTree = \"<group>\"; };\n\t\tFA15DFAB1F9B8C850042AB22 /* StringMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StringMap.cpp; sourceTree = \"<group>\"; };\n\t\tFA18CEC323D3AE6700263725 /* wrap_Buffer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Buffer.cpp; sourceTree = \"<group>\"; };\n\t\tFA18CEC423D3AE6700263725 /* wrap_Buffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Buffer.h; sourceTree = \"<group>\"; };\n\t\tFA18CECD23DBC6E000263725 /* Shader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Shader.h; sourceTree = \"<group>\"; };\n\t\tFA18CECE23DBC6E000263725 /* StreamBuffer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = StreamBuffer.mm; sourceTree = \"<group>\"; };\n\t\tFA18CED023DBC6E000263725 /* Metal.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Metal.mm; sourceTree = \"<group>\"; };\n\t\tFA18CED123DBC6E000263725 /* Shader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Shader.mm; sourceTree = \"<group>\"; };\n\t\tFA18CED223DBC6E000263725 /* StreamBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StreamBuffer.h; sourceTree = \"<group>\"; };\n\t\tFA18CED323DBC6E000263725 /* Graphics.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Graphics.mm; sourceTree = \"<group>\"; };\n\t\tFA18CED423DBC6E000263725 /* Metal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Metal.h; sourceTree = \"<group>\"; };\n\t\tFA18CED523DBC6E000263725 /* Graphics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Graphics.h; sourceTree = \"<group>\"; };\n\t\tFA18CEE623DBC6F700263725 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; };\n\t\tFA18CEE823DBC8D400263725 /* Buffer.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = Buffer.mm; sourceTree = \"<group>\"; };\n\t\tFA18CEEB23DBC8EB00263725 /* Buffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Buffer.h; sourceTree = \"<group>\"; };\n\t\tFA18CEEC23DC9B3E00263725 /* Texture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Texture.h; sourceTree = \"<group>\"; };\n\t\tFA18CEED23DC9B3E00263725 /* Texture.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Texture.mm; sourceTree = \"<group>\"; };\n\t\tFA18CEF223DCF67800263725 /* spirv_parser.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv_parser.hpp; sourceTree = \"<group>\"; };\n\t\tFA18CEF323DCF67800263725 /* spirv_glsl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_glsl.cpp; sourceTree = \"<group>\"; };\n\t\tFA18CEF423DCF67800263725 /* spirv_cross_error_handling.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv_cross_error_handling.hpp; sourceTree = \"<group>\"; };\n\t\tFA18CEF723DCF67800263725 /* barrier.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = barrier.hpp; sourceTree = \"<group>\"; };\n\t\tFA18CEF823DCF67800263725 /* thread_group.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = thread_group.hpp; sourceTree = \"<group>\"; };\n\t\tFA18CEF923DCF67800263725 /* internal_interface.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = internal_interface.hpp; sourceTree = \"<group>\"; };\n\t\tFA18CEFA23DCF67800263725 /* sampler.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = sampler.hpp; sourceTree = \"<group>\"; };\n\t\tFA18CEFB23DCF67800263725 /* external_interface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = external_interface.h; sourceTree = \"<group>\"; };\n\t\tFA18CEFC23DCF67800263725 /* image.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = image.hpp; sourceTree = \"<group>\"; };\n\t\tFA18CEFD23DCF67800263725 /* spirv_hlsl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv_hlsl.hpp; sourceTree = \"<group>\"; };\n\t\tFA18CEFE23DCF67800263725 /* spirv.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv.hpp; sourceTree = \"<group>\"; };\n\t\tFA18CEFF23DCF67800263725 /* spirv_cfg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_cfg.cpp; sourceTree = \"<group>\"; };\n\t\tFA18CF0023DCF67800263725 /* spirv_cpp.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv_cpp.hpp; sourceTree = \"<group>\"; };\n\t\tFA18CF0123DCF67800263725 /* spirv_cross_parsed_ir.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv_cross_parsed_ir.hpp; sourceTree = \"<group>\"; };\n\t\tFA18CF0223DCF67800263725 /* spirv_reflect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_reflect.cpp; sourceTree = \"<group>\"; };\n\t\tFA18CF0323DCF67800263725 /* spirv_msl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_msl.cpp; sourceTree = \"<group>\"; };\n\t\tFA18CF0423DCF67800263725 /* spirv_cross_util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_cross_util.cpp; sourceTree = \"<group>\"; };\n\t\tFA18CF0523DCF67800263725 /* spirv_cross.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_cross.cpp; sourceTree = \"<group>\"; };\n\t\tFA18CF0723DCF67800263725 /* spirv_hlsl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_hlsl.cpp; sourceTree = \"<group>\"; };\n\t\tFA18CF0823DCF67800263725 /* spirv_cfg.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv_cfg.hpp; sourceTree = \"<group>\"; };\n\t\tFA18CF0923DCF67800263725 /* spirv_cpp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_cpp.cpp; sourceTree = \"<group>\"; };\n\t\tFA18CF0A23DCF67800263725 /* spirv_cross_parsed_ir.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_cross_parsed_ir.cpp; sourceTree = \"<group>\"; };\n\t\tFA18CF0D23DCF67800263725 /* spirv_msl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv_msl.hpp; sourceTree = \"<group>\"; };\n\t\tFA18CF0E23DCF67800263725 /* spirv_reflect.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv_reflect.hpp; sourceTree = \"<group>\"; };\n\t\tFA18CF0F23DCF67800263725 /* spirv_cross_util.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv_cross_util.hpp; sourceTree = \"<group>\"; };\n\t\tFA18CF1023DCF67800263725 /* spirv_cross.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv_cross.hpp; sourceTree = \"<group>\"; };\n\t\tFA18CF1123DCF67800263725 /* GLSL.std.450.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GLSL.std.450.h; sourceTree = \"<group>\"; };\n\t\tFA18CF1223DCF67800263725 /* spirv_cross_containers.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv_cross_containers.hpp; sourceTree = \"<group>\"; };\n\t\tFA18CF1323DCF67800263725 /* spirv_parser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spirv_parser.cpp; sourceTree = \"<group>\"; };\n\t\tFA18CF1423DCF67800263725 /* spirv_common.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv_common.hpp; sourceTree = \"<group>\"; };\n\t\tFA18CF1523DCF67800263725 /* spirv_glsl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spirv_glsl.hpp; sourceTree = \"<group>\"; };\n\t\tFA18CF4323DD1A8000263725 /* ShaderStage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShaderStage.h; sourceTree = \"<group>\"; };\n\t\tFA18CF4423DD1A8000263725 /* ShaderStage.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ShaderStage.mm; sourceTree = \"<group>\"; };\n\t\tFA1BA09B1E16CFCE00AA2803 /* Font.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Font.cpp; sourceTree = \"<group>\"; };\n\t\tFA1BA09C1E16CFCE00AA2803 /* Font.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Font.h; sourceTree = \"<group>\"; };\n\t\tFA1BA0A01E16D97500AA2803 /* wrap_Font.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Font.cpp; sourceTree = \"<group>\"; };\n\t\tFA1BA0A11E16D97500AA2803 /* wrap_Font.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Font.h; sourceTree = \"<group>\"; };\n\t\tFA1BA0AF1E16FD0800AA2803 /* Shader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Shader.cpp; sourceTree = \"<group>\"; };\n\t\tFA1BA0B01E16FD0800AA2803 /* Shader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Shader.h; sourceTree = \"<group>\"; };\n\t\tFA1BA0B51E17043400AA2803 /* wrap_Shader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Shader.cpp; sourceTree = \"<group>\"; };\n\t\tFA1BA0B61E17043400AA2803 /* wrap_Shader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Shader.h; sourceTree = \"<group>\"; };\n\t\tFA1E887C1DF363CD00E808AA /* Filter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Filter.cpp; sourceTree = \"<group>\"; };\n\t\tFA1E887D1DF363CD00E808AA /* Filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Filter.h; sourceTree = \"<group>\"; };\n\t\tFA1E88811DF363DB00E808AA /* Filter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Filter.cpp; sourceTree = \"<group>\"; };\n\t\tFA1E88821DF363DB00E808AA /* Filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Filter.h; sourceTree = \"<group>\"; };\n\t\tFA1E95B4271F932B0044CF08 /* arg.lua */ = {isa = PBXFileReference; lastKnownFileType = text; path = arg.lua; sourceTree = \"<group>\"; };\n\t\tFA1E95B5271F932B0044CF08 /* callbacks.lua */ = {isa = PBXFileReference; lastKnownFileType = text; path = callbacks.lua; sourceTree = \"<group>\"; };\n\t\tFA24348121D401CB00B8918A /* attribute.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = attribute.h; sourceTree = \"<group>\"; };\n\t\tFA24348221D401CB00B8918A /* attribute.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = attribute.cpp; sourceTree = \"<group>\"; };\n\t\tFA24348321D401CB00B8918A /* pch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pch.h; sourceTree = \"<group>\"; };\n\t\tFA27B38A1B498151008A9DCE /* Video.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Video.cpp; sourceTree = \"<group>\"; };\n\t\tFA27B38B1B498151008A9DCE /* Video.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Video.h; sourceTree = \"<group>\"; };\n\t\tFA27B3931B498151008A9DCE /* Video.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Video.h; sourceTree = \"<group>\"; };\n\t\tFA27B3941B498151008A9DCE /* VideoStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VideoStream.cpp; sourceTree = \"<group>\"; };\n\t\tFA27B3951B498151008A9DCE /* VideoStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoStream.h; sourceTree = \"<group>\"; };\n\t\tFA27B39B1B498151008A9DCE /* wrap_Video.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Video.cpp; sourceTree = \"<group>\"; };\n\t\tFA27B39C1B498151008A9DCE /* wrap_Video.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Video.h; sourceTree = \"<group>\"; };\n\t\tFA27B3B91B4985BF008A9DCE /* wrap_VideoStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_VideoStream.cpp; sourceTree = \"<group>\"; };\n\t\tFA27B3BA1B4985BF008A9DCE /* wrap_VideoStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_VideoStream.h; sourceTree = \"<group>\"; };\n\t\tFA27B3C81B498623008A9DCE /* theora.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = theora.framework; path = macosx/Frameworks/theora.framework; sourceTree = \"<group>\"; };\n\t\tFA283EDC1B27CFAA00C70067 /* nogame.lua */ = {isa = PBXFileReference; lastKnownFileType = text; path = nogame.lua; sourceTree = \"<group>\"; };\n\t\tFA283EDD1B27CFAA00C70067 /* nogame.lua.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = nogame.lua.h; sourceTree = \"<group>\"; };\n\t\tFA28EBD31E352DB5003446F4 /* FenceSync.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FenceSync.cpp; sourceTree = \"<group>\"; };\n\t\tFA28EBD41E352DB5003446F4 /* FenceSync.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FenceSync.h; sourceTree = \"<group>\"; };\n\t\tFA29C0041E12355B00268CD8 /* StreamBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StreamBuffer.cpp; sourceTree = \"<group>\"; };\n\t\tFA2AF6711DAC76FF0032B62C /* vertex.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = vertex.h; sourceTree = \"<group>\"; };\n\t\tFA2AF6721DAD62710032B62C /* StreamBuffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StreamBuffer.h; sourceTree = \"<group>\"; };\n\t\tFA2AF6731DAD64970032B62C /* vertex.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vertex.cpp; sourceTree = \"<group>\"; };\n\t\tFA2E9BFE1C19E00C0004A1EE /* wrap_RandomGenerator.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = wrap_RandomGenerator.lua; sourceTree = \"<group>\"; };\n\t\tFA34AF6A22E2977700F77015 /* wrap_Data.lua */ = {isa = PBXFileReference; lastKnownFileType = text; path = wrap_Data.lua; sourceTree = \"<group>\"; };\n\t\tFA3C5E401F8C368C0003C579 /* ShaderStage.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ShaderStage.cpp; sourceTree = \"<group>\"; };\n\t\tFA3C5E411F8C368C0003C579 /* ShaderStage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ShaderStage.h; sourceTree = \"<group>\"; };\n\t\tFA3C5E451F8D80CA0003C579 /* ShaderStage.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ShaderStage.cpp; sourceTree = \"<group>\"; };\n\t\tFA3C5E461F8D80CA0003C579 /* ShaderStage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ShaderStage.h; sourceTree = \"<group>\"; };\n\t\tFA41A3C61C0A1F950084430C /* ASTCHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = ASTCHandler.cpp; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };\n\t\tFA41A3C71C0A1F950084430C /* ASTCHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = ASTCHandler.h; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };\n\t\tFA4B66C81ABBCF1900558F15 /* Timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Timer.cpp; sourceTree = \"<group>\"; };\n\t\tFA4F2B771DE0125B00CA37D7 /* xxhash.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xxhash.c; sourceTree = \"<group>\"; };\n\t\tFA4F2B781DE0125B00CA37D7 /* xxhash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xxhash.h; sourceTree = \"<group>\"; };\n\t\tFA4F2BA21DE1E36400CA37D7 /* RecordingDevice.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RecordingDevice.cpp; sourceTree = \"<group>\"; };\n\t\tFA4F2BA31DE1E36400CA37D7 /* RecordingDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RecordingDevice.h; sourceTree = \"<group>\"; };\n\t\tFA4F2BA41DE1E36400CA37D7 /* wrap_RecordingDevice.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_RecordingDevice.cpp; sourceTree = \"<group>\"; };\n\t\tFA4F2BA51DE1E36400CA37D7 /* wrap_RecordingDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_RecordingDevice.h; sourceTree = \"<group>\"; };\n\t\tFA4F2BAA1DE1E37000CA37D7 /* RecordingDevice.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RecordingDevice.cpp; sourceTree = \"<group>\"; };\n\t\tFA4F2BAB1DE1E37000CA37D7 /* RecordingDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RecordingDevice.h; sourceTree = \"<group>\"; };\n\t\tFA4F2BAE1DE1E37B00CA37D7 /* RecordingDevice.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RecordingDevice.cpp; sourceTree = \"<group>\"; };\n\t\tFA4F2BAF1DE1E37B00CA37D7 /* RecordingDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RecordingDevice.h; sourceTree = \"<group>\"; };\n\t\tFA4F2BDF1DE6650600CA37D7 /* Transform.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Transform.cpp; sourceTree = \"<group>\"; };\n\t\tFA4F2BE01DE6650600CA37D7 /* Transform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Transform.h; sourceTree = \"<group>\"; };\n\t\tFA4F2BE11DE6650600CA37D7 /* wrap_Transform.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Transform.cpp; sourceTree = \"<group>\"; };\n\t\tFA4F2BE21DE6650600CA37D7 /* wrap_Transform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Transform.h; sourceTree = \"<group>\"; };\n\t\tFA522D4B23F9FE370059EE3C /* MP3Decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MP3Decoder.cpp; sourceTree = \"<group>\"; };\n\t\tFA522D4C23F9FE380059EE3C /* MP3Decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MP3Decoder.h; sourceTree = \"<group>\"; };\n\t\tFA522D5123F9FF2A0059EE3C /* dr_mp3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dr_mp3.h; sourceTree = \"<group>\"; };\n\t\tFA522D5223F9FF2A0059EE3C /* dr_flac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dr_flac.h; sourceTree = \"<group>\"; };\n\t\tFA522D5923FA5ED40059EE3C /* NotoSans-Regular.ttf.gzip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NotoSans-Regular.ttf.gzip.h\"; sourceTree = \"<group>\"; };\n\t\tFA56AA361FAFF02000A43D5F /* memory.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = memory.cpp; sourceTree = \"<group>\"; };\n\t\tFA56AA371FAFF02000A43D5F /* memory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = memory.h; sourceTree = \"<group>\"; };\n\t\tFA577A6D16C719EA00860150 /* Lua.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Lua.framework; path = macosx/Frameworks/Lua.framework; sourceTree = \"<group>\"; };\n\t\tFA577A7116C719F400860150 /* ogg.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ogg.framework; path = macosx/Frameworks/ogg.framework; sourceTree = \"<group>\"; };\n\t\tFA577A7716C71A0800860150 /* vorbis.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = vorbis.framework; path = macosx/Frameworks/vorbis.framework; sourceTree = \"<group>\"; };\n\t\tFA577A7916C71A1700860150 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = \"<absolute>\"; };\n\t\tFA577A7C16C71A2600860150 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = \"<absolute>\"; };\n\t\tFA577A8216C71A5300860150 /* libmodplug.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = libmodplug.framework; path = macosx/Frameworks/libmodplug.framework; sourceTree = \"<group>\"; };\n\t\tFA577A8C16C71D3600860150 /* auto.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; lineEnding = 0; path = auto.lua; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = \"<none>\"; };\n\t\tFA577A8D16C71D3600860150 /* boot.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = boot.lua; sourceTree = \"<group>\"; };\n\t\tFA577AAF16C7507900860150 /* love.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = love.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tFA57FB961AE1993600F2AD6D /* noise1234.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = noise1234.cpp; sourceTree = \"<group>\"; };\n\t\tFA57FB971AE1993600F2AD6D /* noise1234.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noise1234.h; sourceTree = \"<group>\"; };\n\t\tFA620A2E1AA2F8DB005DB4C2 /* wrap_Quad.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Quad.cpp; sourceTree = \"<group>\"; };\n\t\tFA620A2F1AA2F8DB005DB4C2 /* wrap_Quad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Quad.h; sourceTree = \"<group>\"; };\n\t\tFA620A301AA2F8DB005DB4C2 /* wrap_Texture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Texture.cpp; sourceTree = \"<group>\"; };\n\t\tFA620A311AA2F8DB005DB4C2 /* wrap_Texture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Texture.h; sourceTree = \"<group>\"; };\n\t\tFA620A391AA305F6005DB4C2 /* types.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = types.cpp; sourceTree = \"<group>\"; };\n\t\tFA69B918273828DD00CDC2E7 /* jitsetup.lua */ = {isa = PBXFileReference; lastKnownFileType = text; path = jitsetup.lua; sourceTree = \"<group>\"; };\n\t\tFA6A2B641F5F7B6B0074C308 /* wrap_Data.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Data.h; sourceTree = \"<group>\"; };\n\t\tFA6A2B651F5F7B6B0074C308 /* wrap_Data.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Data.cpp; sourceTree = \"<group>\"; };\n\t\tFA6A2B681F5F7F560074C308 /* DataView.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = DataView.cpp; sourceTree = \"<group>\"; };\n\t\tFA6A2B691F5F7F560074C308 /* DataView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DataView.h; sourceTree = \"<group>\"; };\n\t\tFA6A2B6D1F5F845F0074C308 /* wrap_DataView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_DataView.h; sourceTree = \"<group>\"; };\n\t\tFA6A2B6E1F5F845F0074C308 /* wrap_DataView.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_DataView.cpp; sourceTree = \"<group>\"; };\n\t\tFA6A2B721F60B6710074C308 /* ByteData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ByteData.cpp; sourceTree = \"<group>\"; };\n\t\tFA6A2B731F60B6710074C308 /* ByteData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ByteData.h; sourceTree = \"<group>\"; };\n\t\tFA6A2B771F60B8250074C308 /* wrap_ByteData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_ByteData.h; sourceTree = \"<group>\"; };\n\t\tFA6A2B781F60B8250074C308 /* wrap_ByteData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_ByteData.cpp; sourceTree = \"<group>\"; };\n\t\tFA6BDE5B1F31725300786805 /* Color.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Color.h; sourceTree = \"<group>\"; };\n\t\tFA6BDF88280B62A000240F2A /* GraphicsReadback.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = GraphicsReadback.mm; sourceTree = \"<group>\"; };\n\t\tFA6BDF8B280B62B600240F2A /* GraphicsReadback.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GraphicsReadback.h; sourceTree = \"<group>\"; };\n\t\tFA6BDF8C281219E900240F2A /* DataStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataStream.cpp; sourceTree = \"<group>\"; };\n\t\tFA6BDF8D281219E900240F2A /* DataStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataStream.h; sourceTree = \"<group>\"; };\n\t\tFA7634481E28722A0066EF9E /* StreamBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StreamBuffer.cpp; sourceTree = \"<group>\"; };\n\t\tFA7634491E28722A0066EF9E /* StreamBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StreamBuffer.h; sourceTree = \"<group>\"; };\n\t\tFA7DA04C1C16874A0056B200 /* wrap_Math.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = wrap_Math.lua; sourceTree = \"<group>\"; };\n\t\tFA7E9206277E120900C24CB2 /* theora.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = theora.xcframework; path = ios/libraries/theora.xcframework; sourceTree = \"<group>\"; };\n\t\tFA84DE5D2778D7DB002674C6 /* SpirvIntrinsics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SpirvIntrinsics.h; sourceTree = \"<group>\"; };\n\t\tFA84DE602778D7F3002674C6 /* SpirvIntrinsics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpirvIntrinsics.cpp; sourceTree = \"<group>\"; };\n\t\tFA84DE6427791C36002674C6 /* GraphicsReadback.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = GraphicsReadback.cpp; sourceTree = \"<group>\"; };\n\t\tFA84DE6527791C36002674C6 /* GraphicsReadback.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GraphicsReadback.h; sourceTree = \"<group>\"; };\n\t\tFA84DE69277943F6002674C6 /* GraphicsReadback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GraphicsReadback.h; sourceTree = \"<group>\"; };\n\t\tFA84DE6A277943F6002674C6 /* GraphicsReadback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GraphicsReadback.cpp; sourceTree = \"<group>\"; };\n\t\tFA84DE6E27795E22002674C6 /* wrap_GraphicsReadback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_GraphicsReadback.h; sourceTree = \"<group>\"; };\n\t\tFA84DE6F27795E22002674C6 /* wrap_GraphicsReadback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_GraphicsReadback.cpp; sourceTree = \"<group>\"; };\n\t\tFA84DE75277CB3D4002674C6 /* SDL2.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = SDL2.xcframework; path = ios/libraries/SDL2.xcframework; sourceTree = \"<group>\"; };\n\t\tFA84DE79277D4C88002674C6 /* modplug.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = modplug.xcframework; path = ios/libraries/modplug.xcframework; sourceTree = \"<group>\"; };\n\t\tFA84DE7B277E045E002674C6 /* ogg.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = ogg.xcframework; path = ios/libraries/ogg.xcframework; sourceTree = \"<group>\"; };\n\t\tFA84DE7D277E0A43002674C6 /* vorbis.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = vorbis.xcframework; path = ios/libraries/vorbis.xcframework; sourceTree = \"<group>\"; };\n\t\tFA8951A01AA2EDF300EC385A /* wrap_Event.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Event.cpp; sourceTree = \"<group>\"; };\n\t\tFA8951A11AA2EDF300EC385A /* wrap_Event.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Event.h; sourceTree = \"<group>\"; };\n\t\tFA91DA891F377C3900C80E33 /* deprecation.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = deprecation.cpp; sourceTree = \"<group>\"; };\n\t\tFA91DA8A1F377C3900C80E33 /* deprecation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = deprecation.h; sourceTree = \"<group>\"; };\n\t\tFA93C4501F315B960087CCD4 /* FormatHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FormatHandler.h; sourceTree = \"<group>\"; };\n\t\tFA93C4511F315B960087CCD4 /* FormatHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FormatHandler.cpp; sourceTree = \"<group>\"; };\n\t\tFA94725227A6EE1B00817677 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = \"<group>\"; };\n\t\tFA94725427A6EE1B00817677 /* Connection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Connection.h; sourceTree = \"<group>\"; };\n\t\tFA94725527A6EE1B00817677 /* HTTPSClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTTPSClient.cpp; sourceTree = \"<group>\"; };\n\t\tFA94725627A6EE1B00817677 /* HTTPSClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTTPSClient.h; sourceTree = \"<group>\"; };\n\t\tFA94725727A6EE1B00817677 /* PlaintextConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlaintextConnection.h; sourceTree = \"<group>\"; };\n\t\tFA94725827A6EE1B00817677 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = \"<group>\"; };\n\t\tFA94725A27A6EE1B00817677 /* HTTPS.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTTPS.cpp; sourceTree = \"<group>\"; };\n\t\tFA94725B27A6EE1B00817677 /* HTTPRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTTPRequest.h; sourceTree = \"<group>\"; };\n\t\tFA94725C27A6EE1B00817677 /* ConnectionClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConnectionClient.h; sourceTree = \"<group>\"; };\n\t\tFA94725D27A6EE1B00817677 /* PlaintextConnection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PlaintextConnection.cpp; sourceTree = \"<group>\"; };\n\t\tFA94725E27A6EE1B00817677 /* HTTPS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTTPS.h; sourceTree = \"<group>\"; };\n\t\tFA94725F27A6EE1B00817677 /* HTTPRequest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTTPRequest.cpp; sourceTree = \"<group>\"; };\n\t\tFA94729927A6F9AC00817677 /* NSURLClient.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NSURLClient.mm; sourceTree = \"<group>\"; };\n\t\tFA94729A27A6F9AC00817677 /* NSURLClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSURLClient.h; sourceTree = \"<group>\"; };\n\t\tFA9B4A0716E1578300074F42 /* SDL2.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SDL2.framework; path = macosx/Frameworks/SDL2.framework; sourceTree = \"<group>\"; };\n\t\tFA9D53AA1F5307E900125C6B /* Deprecations.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Deprecations.cpp; sourceTree = \"<group>\"; };\n\t\tFA9D53AB1F5307E900125C6B /* Deprecations.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Deprecations.h; sourceTree = \"<group>\"; };\n\t\tFA9D8DCF1DEB56C3002CD881 /* pixelformat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pixelformat.cpp; sourceTree = \"<group>\"; };\n\t\tFA9D8DD01DEB56C3002CD881 /* pixelformat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pixelformat.h; sourceTree = \"<group>\"; };\n\t\tFA9D8DD41DEF8411002CD881 /* Data.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Data.cpp; sourceTree = \"<group>\"; };\n\t\tFA9D8DD51DEF8411002CD881 /* Stream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Stream.cpp; sourceTree = \"<group>\"; };\n\t\tFA9D8DD61DEF8411002CD881 /* Stream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Stream.h; sourceTree = \"<group>\"; };\n\t\tFA9D8DDC1DEF842A002CD881 /* Drawable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Drawable.cpp; sourceTree = \"<group>\"; };\n\t\tFA9D8DDF1DEF843D002CD881 /* Image.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Image.cpp; sourceTree = \"<group>\"; };\n\t\tFAA3A9AC1B7D465A00CED060 /* android.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = android.cpp; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };\n\t\tFAA3A9AD1B7D465A00CED060 /* android.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = android.h; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };\n\t\tFAA54AC61F91660400A8FA7B /* OggDemuxer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OggDemuxer.h; sourceTree = \"<group>\"; };\n\t\tFAA54AC71F91660400A8FA7B /* TheoraVideoStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TheoraVideoStream.h; sourceTree = \"<group>\"; };\n\t\tFAA54AC81F91660400A8FA7B /* TheoraVideoStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TheoraVideoStream.cpp; sourceTree = \"<group>\"; };\n\t\tFAA54AC91F91660400A8FA7B /* OggDemuxer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OggDemuxer.cpp; sourceTree = \"<group>\"; };\n\t\tFAA627CD18E7E1560080752D /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = System/Library/Frameworks/CoreServices.framework; sourceTree = SDKROOT; };\n\t\tFAAA3FD31F64B3AD00F89E99 /* lprefix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lprefix.h; sourceTree = \"<group>\"; };\n\t\tFAAA3FD41F64B3AD00F89E99 /* lstrlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lstrlib.c; sourceTree = \"<group>\"; };\n\t\tFAAA3FD51F64B3AD00F89E99 /* lstrlib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lstrlib.h; sourceTree = \"<group>\"; };\n\t\tFAAA3FD61F64B3AD00F89E99 /* lutf8lib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lutf8lib.c; sourceTree = \"<group>\"; };\n\t\tFAAA3FD71F64B3AD00F89E99 /* lutf8lib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lutf8lib.h; sourceTree = \"<group>\"; };\n\t\tFAAC2F78251A9D2200BCB81B /* apple.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = apple.mm; sourceTree = \"<group>\"; };\n\t\tFAAC2F7F251A9D3E00BCB81B /* apple.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = apple.h; sourceTree = \"<group>\"; };\n\t\tFAAFF04316CB11C700CCDE45 /* OpenAL-Soft.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = \"OpenAL-Soft.framework\"; path = \"macosx/Frameworks/OpenAL-Soft.framework\"; sourceTree = \"<group>\"; };\n\t\tFAB17BE41ABFAA9000F9BA27 /* lz4.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lz4.c; sourceTree = \"<group>\"; };\n\t\tFAB17BE51ABFAA9000F9BA27 /* lz4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lz4.h; sourceTree = \"<group>\"; };\n\t\tFAB17BF31ABFC4B100F9BA27 /* lz4hc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lz4hc.c; sourceTree = \"<group>\"; };\n\t\tFAB17BF41ABFC4B100F9BA27 /* lz4hc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lz4hc.h; sourceTree = \"<group>\"; };\n\t\tFAB2D5A81AABDD8A008224A4 /* TrueTypeRasterizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TrueTypeRasterizer.cpp; sourceTree = \"<group>\"; };\n\t\tFAB2D5A91AABDD8A008224A4 /* TrueTypeRasterizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrueTypeRasterizer.h; sourceTree = \"<group>\"; };\n\t\tFAB922C3257D99EF0035DAD6 /* Range.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Range.h; sourceTree = \"<group>\"; };\n\t\tFABDA9112552448200B5C523 /* b2_joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_joint.h; sourceTree = \"<group>\"; };\n\t\tFABDA9122552448200B5C523 /* b2_shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_shape.h; sourceTree = \"<group>\"; };\n\t\tFABDA9132552448200B5C523 /* b2_block_allocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_block_allocator.h; sourceTree = \"<group>\"; };\n\t\tFABDA9152552448200B5C523 /* b2_joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_joint.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9162552448200B5C523 /* b2_chain_polygon_contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_chain_polygon_contact.h; sourceTree = \"<group>\"; };\n\t\tFABDA9172552448200B5C523 /* b2_chain_circle_contact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_chain_circle_contact.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9182552448200B5C523 /* b2_chain_circle_contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_chain_circle_contact.h; sourceTree = \"<group>\"; };\n\t\tFABDA9192552448200B5C523 /* b2_polygon_circle_contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_polygon_circle_contact.h; sourceTree = \"<group>\"; };\n\t\tFABDA91A2552448200B5C523 /* b2_circle_contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_circle_contact.h; sourceTree = \"<group>\"; };\n\t\tFABDA91B2552448200B5C523 /* b2_weld_joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_weld_joint.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA91C2552448200B5C523 /* b2_chain_polygon_contact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_chain_polygon_contact.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA91D2552448200B5C523 /* b2_edge_circle_contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_edge_circle_contact.h; sourceTree = \"<group>\"; };\n\t\tFABDA91E2552448200B5C523 /* b2_body.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_body.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA91F2552448200B5C523 /* b2_contact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_contact.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9202552448200B5C523 /* b2_revolute_joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_revolute_joint.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9212552448200B5C523 /* b2_contact_solver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_contact_solver.h; sourceTree = \"<group>\"; };\n\t\tFABDA9222552448200B5C523 /* b2_contact_solver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_contact_solver.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9232552448200B5C523 /* b2_world_callbacks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_world_callbacks.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9242552448200B5C523 /* b2_pulley_joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_pulley_joint.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9252552448200B5C523 /* b2_polygon_circle_contact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_polygon_circle_contact.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9262552448200B5C523 /* b2_edge_polygon_contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_edge_polygon_contact.h; sourceTree = \"<group>\"; };\n\t\tFABDA9272552448200B5C523 /* b2_distance_joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_distance_joint.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9282552448200B5C523 /* b2_contact_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_contact_manager.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9292552448200B5C523 /* b2_polygon_contact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_polygon_contact.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA92A2552448200B5C523 /* b2_edge_polygon_contact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_edge_polygon_contact.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA92B2552448200B5C523 /* b2_edge_circle_contact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_edge_circle_contact.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA92C2552448200B5C523 /* b2_gear_joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_gear_joint.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA92D2552448200B5C523 /* b2_friction_joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_friction_joint.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA92E2552448200B5C523 /* b2_wheel_joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_wheel_joint.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA92F2552448200B5C523 /* b2_polygon_contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_polygon_contact.h; sourceTree = \"<group>\"; };\n\t\tFABDA9302552448200B5C523 /* b2_motor_joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_motor_joint.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9322552448200B5C523 /* b2_world.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_world.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9332552448200B5C523 /* b2_island.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_island.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9342552448200B5C523 /* b2_mouse_joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_mouse_joint.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9352552448200B5C523 /* b2_circle_contact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_circle_contact.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9362552448200B5C523 /* b2_prismatic_joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_prismatic_joint.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9372552448200B5C523 /* b2_fixture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_fixture.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9382552448200B5C523 /* b2_island.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_island.h; sourceTree = \"<group>\"; };\n\t\tFABDA9392552448200B5C523 /* b2_motor_joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_motor_joint.h; sourceTree = \"<group>\"; };\n\t\tFABDA93A2552448200B5C523 /* b2_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_common.h; sourceTree = \"<group>\"; };\n\t\tFABDA93B2552448200B5C523 /* b2_weld_joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_weld_joint.h; sourceTree = \"<group>\"; };\n\t\tFABDA93C2552448200B5C523 /* b2_dynamic_tree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_dynamic_tree.h; sourceTree = \"<group>\"; };\n\t\tFABDA93D2552448200B5C523 /* b2_fixture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_fixture.h; sourceTree = \"<group>\"; };\n\t\tFABDA93E2552448200B5C523 /* b2_stack_allocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_stack_allocator.h; sourceTree = \"<group>\"; };\n\t\tFABDA93F2552448200B5C523 /* Box2D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Box2D.h; sourceTree = \"<group>\"; };\n\t\tFABDA9402552448200B5C523 /* b2_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_types.h; sourceTree = \"<group>\"; };\n\t\tFABDA9412552448200B5C523 /* b2_broad_phase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_broad_phase.h; sourceTree = \"<group>\"; };\n\t\tFABDA9432552448200B5C523 /* b2_rope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_rope.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9442552448200B5C523 /* b2_settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_settings.h; sourceTree = \"<group>\"; };\n\t\tFABDA9452552448200B5C523 /* b2_revolute_joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_revolute_joint.h; sourceTree = \"<group>\"; };\n\t\tFABDA9462552448200B5C523 /* README.MODIFIED */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README.MODIFIED; sourceTree = \"<group>\"; };\n\t\tFABDA9472552448200B5C523 /* b2_rope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_rope.h; sourceTree = \"<group>\"; };\n\t\tFABDA9482552448200B5C523 /* b2_distance_joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_distance_joint.h; sourceTree = \"<group>\"; };\n\t\tFABDA9492552448200B5C523 /* b2_body.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_body.h; sourceTree = \"<group>\"; };\n\t\tFABDA94A2552448200B5C523 /* b2_distance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_distance.h; sourceTree = \"<group>\"; };\n\t\tFABDA94B2552448200B5C523 /* b2_time_step.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_time_step.h; sourceTree = \"<group>\"; };\n\t\tFABDA94C2552448200B5C523 /* b2_pulley_joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_pulley_joint.h; sourceTree = \"<group>\"; };\n\t\tFABDA94D2552448200B5C523 /* b2_circle_shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_circle_shape.h; sourceTree = \"<group>\"; };\n\t\tFABDA94E2552448200B5C523 /* b2_math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_math.h; sourceTree = \"<group>\"; };\n\t\tFABDA94F2552448200B5C523 /* b2_time_of_impact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_time_of_impact.h; sourceTree = \"<group>\"; };\n\t\tFABDA9502552448200B5C523 /* b2_mouse_joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_mouse_joint.h; sourceTree = \"<group>\"; };\n\t\tFABDA9522552448200B5C523 /* b2_draw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_draw.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9532552448200B5C523 /* b2_timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_timer.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9542552448200B5C523 /* b2_block_allocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_block_allocator.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9552552448200B5C523 /* b2_stack_allocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_stack_allocator.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9562552448200B5C523 /* b2_settings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_settings.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9572552448200B5C523 /* b2_math.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_math.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9582552448200B5C523 /* b2_friction_joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_friction_joint.h; sourceTree = \"<group>\"; };\n\t\tFABDA9592552448200B5C523 /* b2_contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_contact.h; sourceTree = \"<group>\"; };\n\t\tFABDA95A2552448200B5C523 /* b2_prismatic_joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_prismatic_joint.h; sourceTree = \"<group>\"; };\n\t\tFABDA95B2552448200B5C523 /* b2_world.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_world.h; sourceTree = \"<group>\"; };\n\t\tFABDA95C2552448200B5C523 /* b2_polygon_shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_polygon_shape.h; sourceTree = \"<group>\"; };\n\t\tFABDA95D2552448200B5C523 /* b2_wheel_joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_wheel_joint.h; sourceTree = \"<group>\"; };\n\t\tFABDA95E2552448200B5C523 /* b2_growable_stack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_growable_stack.h; sourceTree = \"<group>\"; };\n\t\tFABDA95F2552448200B5C523 /* b2_draw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_draw.h; sourceTree = \"<group>\"; };\n\t\tFABDA9602552448200B5C523 /* b2_collision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_collision.h; sourceTree = \"<group>\"; };\n\t\tFABDA9622552448200B5C523 /* b2_api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_api.h; sourceTree = \"<group>\"; };\n\t\tFABDA9632552448200B5C523 /* b2_chain_shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_chain_shape.h; sourceTree = \"<group>\"; };\n\t\tFABDA9642552448200B5C523 /* b2_gear_joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_gear_joint.h; sourceTree = \"<group>\"; };\n\t\tFABDA9652552448200B5C523 /* b2_timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_timer.h; sourceTree = \"<group>\"; };\n\t\tFABDA9662552448200B5C523 /* b2_world_callbacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_world_callbacks.h; sourceTree = \"<group>\"; };\n\t\tFABDA9682552448200B5C523 /* b2_collide_circle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_collide_circle.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9692552448200B5C523 /* b2_circle_shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_circle_shape.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA96A2552448200B5C523 /* b2_collision.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_collision.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA96B2552448200B5C523 /* b2_collide_edge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_collide_edge.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA96C2552448200B5C523 /* b2_chain_shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_chain_shape.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA96D2552448200B5C523 /* b2_broad_phase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_broad_phase.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA96E2552448200B5C523 /* b2_dynamic_tree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_dynamic_tree.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA96F2552448200B5C523 /* b2_polygon_shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_polygon_shape.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9702552448200B5C523 /* b2_collide_polygon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_collide_polygon.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9712552448200B5C523 /* b2_edge_shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_edge_shape.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9722552448200B5C523 /* b2_time_of_impact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_time_of_impact.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9732552448200B5C523 /* b2_distance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2_distance.cpp; sourceTree = \"<group>\"; };\n\t\tFABDA9742552448200B5C523 /* b2_contact_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_contact_manager.h; sourceTree = \"<group>\"; };\n\t\tFABDA9752552448200B5C523 /* b2_edge_shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2_edge_shape.h; sourceTree = \"<group>\"; };\n\t\tFAC271E323B5B5B400C200D3 /* renderstate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = renderstate.h; sourceTree = \"<group>\"; };\n\t\tFAC271E423B5B5B400C200D3 /* renderstate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = renderstate.cpp; sourceTree = \"<group>\"; };\n\t\tFAC734C11B2E021A00AB460A /* wrap_SoundData.lua */ = {isa = PBXFileReference; lastKnownFileType = text; path = wrap_SoundData.lua; sourceTree = \"<group>\"; };\n\t\tFAC734C21B2E628700AB460A /* wrap_ImageData.lua */ = {isa = PBXFileReference; lastKnownFileType = text; path = wrap_ImageData.lua; sourceTree = \"<group>\"; };\n\t\tFAC756F31E4F99B400B91289 /* Effect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Effect.cpp; sourceTree = \"<group>\"; };\n\t\tFAC756F41E4F99B400B91289 /* Effect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Effect.h; sourceTree = \"<group>\"; };\n\t\tFAC756F81E4F99D200B91289 /* Effect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Effect.cpp; sourceTree = \"<group>\"; };\n\t\tFAC756F91E4F99D200B91289 /* Effect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Effect.h; sourceTree = \"<group>\"; };\n\t\tFAC7CD5A1FE35E95006A60C7 /* physfs_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = physfs_internal.h; sourceTree = \"<group>\"; };\n\t\tFAC7CD5B1FE35E95006A60C7 /* physfs_platform_qnx.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = physfs_platform_qnx.c; sourceTree = \"<group>\"; };\n\t\tFAC7CD5C1FE35E95006A60C7 /* physfs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = physfs.c; sourceTree = \"<group>\"; };\n\t\tFAC7CD5D1FE35E95006A60C7 /* physfs_archiver_7z.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = physfs_archiver_7z.c; sourceTree = \"<group>\"; };\n\t\tFAC7CD5E1FE35E95006A60C7 /* physfs_platform_unix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = physfs_platform_unix.c; sourceTree = \"<group>\"; };\n\t\tFAC7CD5F1FE35E95006A60C7 /* physfs_archiver_slb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = physfs_archiver_slb.c; sourceTree = \"<group>\"; };\n\t\tFAC7CD601FE35E95006A60C7 /* physfs_platform_winrt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = physfs_platform_winrt.cpp; sourceTree = \"<group>\"; };\n\t\tFAC7CD611FE35E95006A60C7 /* physfs_archiver_mvl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = physfs_archiver_mvl.c; sourceTree = \"<group>\"; };\n\t\tFAC7CD621FE35E95006A60C7 /* physfs_archiver_wad.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = physfs_archiver_wad.c; sourceTree = \"<group>\"; };\n\t\tFAC7CD631FE35E95006A60C7 /* physfs_casefolding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = physfs_casefolding.h; sourceTree = \"<group>\"; };\n\t\tFAC7CD641FE35E95006A60C7 /* physfs_platform_os2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = physfs_platform_os2.c; sourceTree = \"<group>\"; };\n\t\tFAC7CD651FE35E95006A60C7 /* physfs_platform_haiku.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = physfs_platform_haiku.cpp; sourceTree = \"<group>\"; };\n\t\tFAC7CD661FE35E95006A60C7 /* physfs_platform_windows.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = physfs_platform_windows.c; sourceTree = \"<group>\"; };\n\t\tFAC7CD671FE35E95006A60C7 /* physfs_archiver_unpacked.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = physfs_archiver_unpacked.c; sourceTree = \"<group>\"; };\n\t\tFAC7CD681FE35E95006A60C7 /* physfs_unicode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = physfs_unicode.c; sourceTree = \"<group>\"; };\n\t\tFAC7CD691FE35E95006A60C7 /* physfs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = physfs.h; sourceTree = \"<group>\"; };\n\t\tFAC7CD6A1FE35E95006A60C7 /* physfs_archiver_vdf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = physfs_archiver_vdf.c; sourceTree = \"<group>\"; };\n\t\tFAC7CD6B1FE35E95006A60C7 /* physfs_platform_apple.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = physfs_platform_apple.m; sourceTree = \"<group>\"; };\n\t\tFAC7CD6C1FE35E95006A60C7 /* physfs_archiver_dir.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = physfs_archiver_dir.c; sourceTree = \"<group>\"; };\n\t\tFAC7CD6D1FE35E95006A60C7 /* physfs_byteorder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = physfs_byteorder.c; sourceTree = \"<group>\"; };\n\t\tFAC7CD6E1FE35E95006A60C7 /* physfs_archiver_iso9660.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = physfs_archiver_iso9660.c; sourceTree = \"<group>\"; };\n\t\tFAC7CD6F1FE35E95006A60C7 /* physfs_archiver_qpak.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = physfs_archiver_qpak.c; sourceTree = \"<group>\"; };\n\t\tFAC7CD701FE35E95006A60C7 /* physfs_platforms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = physfs_platforms.h; sourceTree = \"<group>\"; };\n\t\tFAC7CD711FE35E95006A60C7 /* physfs_lzmasdk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = physfs_lzmasdk.h; sourceTree = \"<group>\"; };\n\t\tFAC7CD721FE35E95006A60C7 /* physfs_platform_posix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = physfs_platform_posix.c; sourceTree = \"<group>\"; };\n\t\tFAC7CD731FE35E95006A60C7 /* physfs_miniz.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = physfs_miniz.h; sourceTree = \"<group>\"; };\n\t\tFAC7CD741FE35E95006A60C7 /* physfs_archiver_grp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = physfs_archiver_grp.c; sourceTree = \"<group>\"; };\n\t\tFAC7CD751FE35E95006A60C7 /* physfs_archiver_hog.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = physfs_archiver_hog.c; sourceTree = \"<group>\"; };\n\t\tFAC7CD761FE35E95006A60C7 /* physfs_archiver_zip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = physfs_archiver_zip.c; sourceTree = \"<group>\"; };\n\t\tFAC7CD951FE755B3006A60C7 /* lz4opt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lz4opt.h; sourceTree = \"<group>\"; };\n\t\tFAC8E54323AC832A007B07C8 /* NativeFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NativeFile.h; sourceTree = \"<group>\"; };\n\t\tFAC8E54423AC832A007B07C8 /* NativeFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NativeFile.cpp; sourceTree = \"<group>\"; };\n\t\tFAC8E54823AC8379007B07C8 /* wrap_NativeFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_NativeFile.cpp; sourceTree = \"<group>\"; };\n\t\tFAC8E54923AC8379007B07C8 /* wrap_NativeFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_NativeFile.h; sourceTree = \"<group>\"; };\n\t\tFAC8E54E23B01C0C007B07C8 /* macos.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = macos.h; sourceTree = \"<group>\"; };\n\t\tFAC8E54F23B01C0C007B07C8 /* macos.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = macos.mm; sourceTree = \"<group>\"; };\n\t\tFACA02E01F5E396B0084B28F /* CompressedData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CompressedData.cpp; sourceTree = \"<group>\"; };\n\t\tFACA02E11F5E396B0084B28F /* CompressedData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CompressedData.h; sourceTree = \"<group>\"; };\n\t\tFACA02E21F5E396B0084B28F /* Compressor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Compressor.cpp; sourceTree = \"<group>\"; };\n\t\tFACA02E31F5E396B0084B28F /* Compressor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Compressor.h; sourceTree = \"<group>\"; };\n\t\tFACA02E41F5E396B0084B28F /* DataModule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataModule.cpp; sourceTree = \"<group>\"; };\n\t\tFACA02E51F5E396B0084B28F /* DataModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataModule.h; sourceTree = \"<group>\"; };\n\t\tFACA02E61F5E396B0084B28F /* HashFunction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HashFunction.cpp; sourceTree = \"<group>\"; };\n\t\tFACA02E71F5E396B0084B28F /* HashFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HashFunction.h; sourceTree = \"<group>\"; };\n\t\tFACA02E81F5E396B0084B28F /* wrap_CompressedData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_CompressedData.cpp; sourceTree = \"<group>\"; };\n\t\tFACA02E91F5E396B0084B28F /* wrap_CompressedData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_CompressedData.h; sourceTree = \"<group>\"; };\n\t\tFACA02EA1F5E396B0084B28F /* wrap_DataModule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_DataModule.cpp; sourceTree = \"<group>\"; };\n\t\tFACA02EB1F5E396B0084B28F /* wrap_DataModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_DataModule.h; sourceTree = \"<group>\"; };\n\t\tFACA06A5293EE5CD001A2557 /* wrap_Sensor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Sensor.cpp; sourceTree = \"<group>\"; };\n\t\tFACA06A6293EE5CD001A2557 /* Sensor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sensor.h; sourceTree = \"<group>\"; };\n\t\tFACA06A8293EE5CD001A2557 /* Sensor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sensor.h; sourceTree = \"<group>\"; };\n\t\tFACA06A9293EE5CD001A2557 /* Sensor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Sensor.cpp; sourceTree = \"<group>\"; };\n\t\tFACA06AA293EE5CD001A2557 /* Sensor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Sensor.cpp; sourceTree = \"<group>\"; };\n\t\tFACA06AB293EE5CD001A2557 /* wrap_Sensor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Sensor.h; sourceTree = \"<group>\"; };\n\t\tFACFB750276D7E2B0089F78D /* freetype.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = freetype.xcframework; path = ios/libraries/freetype.xcframework; sourceTree = \"<group>\"; };\n\t\tFACFB752276D7F6F0089F78D /* Lua.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Lua.xcframework; path = ios/libraries/Lua.xcframework; sourceTree = \"<group>\"; };\n\t\tFAD19A151DFF8CA200D5398A /* ImageDataBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ImageDataBase.cpp; sourceTree = \"<group>\"; };\n\t\tFAD19A161DFF8CA200D5398A /* ImageDataBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageDataBase.h; sourceTree = \"<group>\"; };\n\t\tFAD43ECB1FF312D800831BB8 /* freetype.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = freetype.framework; path = macosx/Frameworks/freetype.framework; sourceTree = \"<group>\"; };\n\t\tFADF4CC52663D0EC004F95C1 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };\n\t\tFADF53F61E3C7ACD00012CC0 /* Buffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Buffer.cpp; sourceTree = \"<group>\"; };\n\t\tFADF53F71E3C7ACD00012CC0 /* Buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Buffer.h; sourceTree = \"<group>\"; };\n\t\tFADF53FB1E3D74F200012CC0 /* TextBatch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextBatch.cpp; sourceTree = \"<group>\"; };\n\t\tFADF53FC1E3D74F200012CC0 /* TextBatch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextBatch.h; sourceTree = \"<group>\"; };\n\t\tFADF54001E3D77B500012CC0 /* wrap_TextBatch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_TextBatch.cpp; sourceTree = \"<group>\"; };\n\t\tFADF54011E3D77B500012CC0 /* wrap_TextBatch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_TextBatch.h; sourceTree = \"<group>\"; };\n\t\tFADF54051E3D78F700012CC0 /* Video.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Video.cpp; sourceTree = \"<group>\"; };\n\t\tFADF54061E3D78F700012CC0 /* Video.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Video.h; sourceTree = \"<group>\"; };\n\t\tFADF540A1E3D7CDD00012CC0 /* wrap_Video.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Video.cpp; sourceTree = \"<group>\"; };\n\t\tFADF540B1E3D7CDD00012CC0 /* wrap_Video.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Video.h; sourceTree = \"<group>\"; };\n\t\tFADF540C1E3D7CDD00012CC0 /* wrap_Video.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = wrap_Video.lua; sourceTree = \"<group>\"; };\n\t\tFADF541E1E3DA52C00012CC0 /* wrap_ParticleSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_ParticleSystem.cpp; sourceTree = \"<group>\"; };\n\t\tFADF541F1E3DA52C00012CC0 /* wrap_ParticleSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_ParticleSystem.h; sourceTree = \"<group>\"; };\n\t\tFADF54231E3DA5BA00012CC0 /* Mesh.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Mesh.cpp; sourceTree = \"<group>\"; };\n\t\tFADF54241E3DA5BA00012CC0 /* Mesh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Mesh.h; sourceTree = \"<group>\"; };\n\t\tFADF54281E3DAADA00012CC0 /* wrap_Mesh.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Mesh.cpp; sourceTree = \"<group>\"; };\n\t\tFADF54291E3DAADA00012CC0 /* wrap_Mesh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Mesh.h; sourceTree = \"<group>\"; };\n\t\tFADF542D1E3DABF600012CC0 /* SpriteBatch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpriteBatch.cpp; sourceTree = \"<group>\"; };\n\t\tFADF542E1E3DABF600012CC0 /* SpriteBatch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpriteBatch.h; sourceTree = \"<group>\"; };\n\t\tFADF54321E3DAE6E00012CC0 /* wrap_SpriteBatch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_SpriteBatch.cpp; sourceTree = \"<group>\"; };\n\t\tFADF54331E3DAE6E00012CC0 /* wrap_SpriteBatch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_SpriteBatch.h; sourceTree = \"<group>\"; };\n\t\tFADF54371E3DAFBA00012CC0 /* wrap_Graphics.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = wrap_Graphics.lua; sourceTree = \"<group>\"; };\n\t\tFADF54391E3DAFF700012CC0 /* wrap_Graphics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Graphics.cpp; sourceTree = \"<group>\"; };\n\t\tFADF543A1E3DAFF700012CC0 /* wrap_Graphics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Graphics.h; sourceTree = \"<group>\"; };\n\t\tFAE272501C05A15B00A67640 /* ParticleSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ParticleSystem.cpp; sourceTree = \"<group>\"; };\n\t\tFAE272511C05A15B00A67640 /* ParticleSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParticleSystem.h; sourceTree = \"<group>\"; };\n\t\tFAECA1B01F3164700095D008 /* CompressedSlice.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = CompressedSlice.cpp; sourceTree = \"<group>\"; };\n\t\tFAECA1B11F3164700095D008 /* CompressedSlice.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CompressedSlice.h; sourceTree = \"<group>\"; };\n\t\tFAF13FC21E20934C00F898D2 /* CodeGen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CodeGen.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FC31E20934C00F898D2 /* Link.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Link.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FC51E20934C00F898D2 /* arrays.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arrays.h; sourceTree = \"<group>\"; };\n\t\tFAF13FC61E20934C00F898D2 /* BaseTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseTypes.h; sourceTree = \"<group>\"; };\n\t\tFAF13FC71E20934C00F898D2 /* Common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Common.h; sourceTree = \"<group>\"; };\n\t\tFAF13FC81E20934C00F898D2 /* ConstantUnion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConstantUnion.h; sourceTree = \"<group>\"; };\n\t\tFAF13FC91E20934C00F898D2 /* InfoSink.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InfoSink.h; sourceTree = \"<group>\"; };\n\t\tFAF13FCA1E20934C00F898D2 /* InitializeGlobals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InitializeGlobals.h; sourceTree = \"<group>\"; };\n\t\tFAF13FCB1E20934C00F898D2 /* intermediate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = intermediate.h; sourceTree = \"<group>\"; };\n\t\tFAF13FCC1E20934C00F898D2 /* PoolAlloc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PoolAlloc.h; sourceTree = \"<group>\"; };\n\t\tFAF13FCD1E20934C00F898D2 /* ResourceLimits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResourceLimits.h; sourceTree = \"<group>\"; };\n\t\tFAF13FD01E20934C00F898D2 /* ShHandle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShHandle.h; sourceTree = \"<group>\"; };\n\t\tFAF13FD11E20934C00F898D2 /* Types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Types.h; sourceTree = \"<group>\"; };\n\t\tFAF13FD31E20934C00F898D2 /* Constant.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Constant.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FD41E20934C00F898D2 /* gl_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gl_types.h; sourceTree = \"<group>\"; };\n\t\tFAF13FD61E20934C00F898D2 /* glslang_tab.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = glslang_tab.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FD71E20934C00F898D2 /* glslang_tab.cpp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = glslang_tab.cpp.h; sourceTree = \"<group>\"; };\n\t\tFAF13FD81E20934C00F898D2 /* InfoSink.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InfoSink.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FD91E20934C00F898D2 /* Initialize.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Initialize.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FDA1E20934C00F898D2 /* Initialize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Initialize.h; sourceTree = \"<group>\"; };\n\t\tFAF13FDB1E20934C00F898D2 /* Intermediate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Intermediate.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FDC1E20934C00F898D2 /* intermOut.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = intermOut.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FDD1E20934C00F898D2 /* IntermTraverse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IntermTraverse.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FDE1E20934C00F898D2 /* iomapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = iomapper.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FDF1E20934C00F898D2 /* iomapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iomapper.h; sourceTree = \"<group>\"; };\n\t\tFAF13FE01E20934C00F898D2 /* limits.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = limits.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FE11E20934C00F898D2 /* linkValidate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = linkValidate.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FE21E20934C00F898D2 /* LiveTraverser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LiveTraverser.h; sourceTree = \"<group>\"; };\n\t\tFAF13FE31E20934C00F898D2 /* localintermediate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = localintermediate.h; sourceTree = \"<group>\"; };\n\t\tFAF13FE41E20934C00F898D2 /* parseConst.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parseConst.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FE51E20934C00F898D2 /* ParseContextBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ParseContextBase.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FE61E20934C00F898D2 /* ParseHelper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ParseHelper.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FE71E20934C00F898D2 /* ParseHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParseHelper.h; sourceTree = \"<group>\"; };\n\t\tFAF13FE81E20934C00F898D2 /* parseVersions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parseVersions.h; sourceTree = \"<group>\"; };\n\t\tFAF13FE91E20934C00F898D2 /* PoolAlloc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PoolAlloc.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FEB1E20934C00F898D2 /* Pp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Pp.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FEC1E20934C00F898D2 /* PpAtom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PpAtom.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FED1E20934C00F898D2 /* PpContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PpContext.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FEE1E20934C00F898D2 /* PpContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PpContext.h; sourceTree = \"<group>\"; };\n\t\tFAF13FF01E20934C00F898D2 /* PpScanner.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PpScanner.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FF21E20934C00F898D2 /* PpTokens.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PpTokens.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FF31E20934C00F898D2 /* PpTokens.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PpTokens.h; sourceTree = \"<group>\"; };\n\t\tFAF13FF41E20934C00F898D2 /* propagateNoContraction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = propagateNoContraction.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FF51E20934C00F898D2 /* propagateNoContraction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = propagateNoContraction.h; sourceTree = \"<group>\"; };\n\t\tFAF13FF61E20934C00F898D2 /* reflection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reflection.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FF71E20934C00F898D2 /* reflection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reflection.h; sourceTree = \"<group>\"; };\n\t\tFAF13FF81E20934C00F898D2 /* RemoveTree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RemoveTree.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FF91E20934C00F898D2 /* RemoveTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RemoveTree.h; sourceTree = \"<group>\"; };\n\t\tFAF13FFA1E20934C00F898D2 /* Scan.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Scan.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FFB1E20934C00F898D2 /* Scan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Scan.h; sourceTree = \"<group>\"; };\n\t\tFAF13FFC1E20934C00F898D2 /* ScanContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScanContext.h; sourceTree = \"<group>\"; };\n\t\tFAF13FFD1E20934C00F898D2 /* ShaderLang.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ShaderLang.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FFE1E20934C00F898D2 /* SymbolTable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SymbolTable.cpp; sourceTree = \"<group>\"; };\n\t\tFAF13FFF1E20934C00F898D2 /* SymbolTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SymbolTable.h; sourceTree = \"<group>\"; };\n\t\tFAF140001E20934C00F898D2 /* Versions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Versions.cpp; sourceTree = \"<group>\"; };\n\t\tFAF140011E20934C00F898D2 /* Versions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Versions.h; sourceTree = \"<group>\"; };\n\t\tFAF140031E20934C00F898D2 /* osinclude.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = osinclude.h; sourceTree = \"<group>\"; };\n\t\tFAF140211E20934C00F898D2 /* ossource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ossource.cpp; sourceTree = \"<group>\"; };\n\t\tFAF140291E20934C00F898D2 /* ShaderLang.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShaderLang.h; sourceTree = \"<group>\"; };\n\t\tFAF1889C1E9DA834008C1479 /* Optional.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Optional.h; sourceTree = \"<group>\"; };\n\t\tFAF6C9C123C2DE2900D7B5BC /* SPVRemapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPVRemapper.h; sourceTree = \"<group>\"; };\n\t\tFAF6C9C223C2DE2900D7B5BC /* SpvBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpvBuilder.h; sourceTree = \"<group>\"; };\n\t\tFAF6C9C323C2DE2900D7B5BC /* SpvPostProcess.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpvPostProcess.cpp; sourceTree = \"<group>\"; };\n\t\tFAF6C9C423C2DE2900D7B5BC /* SpvTools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpvTools.h; sourceTree = \"<group>\"; };\n\t\tFAF6C9C523C2DE2900D7B5BC /* SpvTools.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpvTools.cpp; sourceTree = \"<group>\"; };\n\t\tFAF6C9C623C2DE2900D7B5BC /* InReadableOrder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InReadableOrder.cpp; sourceTree = \"<group>\"; };\n\t\tFAF6C9C723C2DE2900D7B5BC /* GLSL.ext.AMD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GLSL.ext.AMD.h; sourceTree = \"<group>\"; };\n\t\tFAF6C9C823C2DE2900D7B5BC /* doc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = doc.h; sourceTree = \"<group>\"; };\n\t\tFAF6C9CA23C2DE2900D7B5BC /* SpvBuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpvBuilder.cpp; sourceTree = \"<group>\"; };\n\t\tFAF6C9CB23C2DE2900D7B5BC /* GLSL.ext.EXT.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GLSL.ext.EXT.h; sourceTree = \"<group>\"; };\n\t\tFAF6C9CC23C2DE2900D7B5BC /* GLSL.ext.KHR.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GLSL.ext.KHR.h; sourceTree = \"<group>\"; };\n\t\tFAF6C9CD23C2DE2900D7B5BC /* GLSL.ext.NV.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GLSL.ext.NV.h; sourceTree = \"<group>\"; };\n\t\tFAF6C9CE23C2DE2900D7B5BC /* GlslangToSpv.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GlslangToSpv.cpp; sourceTree = \"<group>\"; };\n\t\tFAF6C9CF23C2DE2900D7B5BC /* spvIR.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spvIR.h; sourceTree = \"<group>\"; };\n\t\tFAF6C9D023C2DE2900D7B5BC /* bitutils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bitutils.h; sourceTree = \"<group>\"; };\n\t\tFAF6C9D123C2DE2900D7B5BC /* disassemble.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = disassemble.h; sourceTree = \"<group>\"; };\n\t\tFAF6C9D223C2DE2900D7B5BC /* GlslangToSpv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GlslangToSpv.h; sourceTree = \"<group>\"; };\n\t\tFAF6C9D323C2DE2900D7B5BC /* GLSL.std.450.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GLSL.std.450.h; sourceTree = \"<group>\"; };\n\t\tFAF6C9D423C2DE2900D7B5BC /* SPVRemapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SPVRemapper.cpp; sourceTree = \"<group>\"; };\n\t\tFAF6C9D523C2DE2900D7B5BC /* Logger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Logger.cpp; sourceTree = \"<group>\"; };\n\t\tFAF6C9D623C2DE2900D7B5BC /* hex_float.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hex_float.h; sourceTree = \"<group>\"; };\n\t\tFAF6C9D723C2DE2900D7B5BC /* Logger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Logger.h; sourceTree = \"<group>\"; };\n\t\tFAF6C9D823C2DE2900D7B5BC /* doc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = doc.cpp; sourceTree = \"<group>\"; };\n\t\tFAF6C9D923C2DE2900D7B5BC /* disassemble.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = disassemble.cpp; sourceTree = \"<group>\"; };\n\t\tFAF949FD21DEE8B7001CD27E /* wrap_Event.lua */ = {isa = PBXFileReference; lastKnownFileType = text; path = wrap_Event.lua; sourceTree = \"<group>\"; };\n\t\tFAFEB29528F210540025D7D0 /* unixdgram.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = unixdgram.c; sourceTree = \"<group>\"; };\n\t\tFAFEB29628F210550025D7D0 /* unixdgram.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unixdgram.h; sourceTree = \"<group>\"; };\n\t\tFAFEB29728F210550025D7D0 /* unixstream.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = unixstream.c; sourceTree = \"<group>\"; };\n\t\tFAFEB29828F210550025D7D0 /* unixstream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unixstream.h; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tFA0B78DA1A958B90000E1D17 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tFACFB751276D7E3B0089F78D /* freetype.xcframework in Frameworks */,\n\t\t\t\tD923E7D3296B85B9002FF1B3 /* harfbuzz.xcframework in Frameworks */,\n\t\t\t\tFA84DE7A277D4C88002674C6 /* modplug.xcframework in Frameworks */,\n\t\t\t\tFA84DE7C277E045E002674C6 /* ogg.xcframework in Frameworks */,\n\t\t\t\tFACFB753276D7F860089F78D /* Lua.xcframework in Frameworks */,\n\t\t\t\tD9596F622CBAC93800BE58C1 /* SDL3.xcframework in Frameworks */,\n\t\t\t\tFA7E9207277E120900C24CB2 /* theora.xcframework in Frameworks */,\n\t\t\t\tFA84DE7E277E0A43002674C6 /* vorbis.xcframework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tFA577AAB16C7507900860150 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tFA18CEE723DBC6F700263725 /* Metal.framework in Frameworks */,\n\t\t\t\tFA27B3C91B498623008A9DCE /* theora.framework in Frameworks */,\n\t\t\t\tFAA627CE18E7E1560080752D /* CoreServices.framework in Frameworks */,\n\t\t\t\tFAAFF04416CB11C700CCDE45 /* OpenAL-Soft.framework in Frameworks */,\n\t\t\t\tFAD43ECC1FF312D800831BB8 /* freetype.framework in Frameworks */,\n\t\t\t\tFA577AB016C7507900860150 /* Cocoa.framework in Frameworks */,\n\t\t\t\tFA577AC516C7513400860150 /* libmodplug.framework in Frameworks */,\n\t\t\t\tFADF4CC62663D0EC004F95C1 /* libz.tbd in Frameworks */,\n\t\t\t\tD9596F612CBAC93800BE58C1 /* SDL3.xcframework in Frameworks */,\n\t\t\t\tFA577AC816C7513C00860150 /* ogg.framework in Frameworks */,\n\t\t\t\tD9DAB9322963CD7500C64820 /* harfbuzz.framework in Frameworks */,\n\t\t\t\tFA577ACA16C7514100860150 /* OpenGL.framework in Frameworks */,\n\t\t\t\tFA577ACD16C7514C00860150 /* vorbis.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t2F654C0235EB60C744A22507 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA577AAF16C7507900860150 /* love.framework */,\n\t\t\t\tFA0B78DD1A958B90000E1D17 /* liblove.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t352E6C5F6F8A681766EB5299 /* scripts */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA577A8C16C71D3600860150 /* auto.lua */,\n\t\t\t\tFA283EDC1B27CFAA00C70067 /* nogame.lua */,\n\t\t\t\tFA283EDD1B27CFAA00C70067 /* nogame.lua.h */,\n\t\t\t);\n\t\t\tname = scripts;\n\t\t\tpath = ../../src/scripts;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t54067CFB7D564E5764FA17DC /* love */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B78F61A958E3B000E1D17 /* common */,\n\t\t\t\tFA0B794D1A958EA3000E1D17 /* libraries */,\n\t\t\t\tFA0B7B3C1A95902C000E1D17 /* modules */,\n\t\t\t\t352E6C5F6F8A681766EB5299 /* scripts */,\n\t\t\t\tFA577A6616C7199700860150 /* Frameworks */,\n\t\t\t\tFA5D24A11A96D24500C6FC8F /* Libraries */,\n\t\t\t\tFA08F5AC16C751BA00F007B5 /* Resources */,\n\t\t\t\t2F654C0235EB60C744A22507 /* Products */,\n\t\t\t);\n\t\t\tname = love;\n\t\t\tsourceTree = \"<group>\";\n\t\t\tusesTabs = 1;\n\t\t};\n\t\tD9DB6E312B4B41100037A1F6 /* ResourceLimits */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD9DB6E332B4B41100037A1F6 /* ResourceLimits.cpp */,\n\t\t\t);\n\t\t\tpath = ResourceLimits;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD9F0C2D32C680A5500BB2D25 /* generic */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD9F0C2CD2C680A5500BB2D25 /* CurlClient.cpp */,\n\t\t\t\tD9F0C2CE2C680A5500BB2D25 /* CurlClient.h */,\n\t\t\t\tD9F0C2CF2C680A5500BB2D25 /* LinktimeLibraryLoader.cpp */,\n\t\t\t\tD9F0C2D02C680A5500BB2D25 /* OpenSSLConnection.cpp */,\n\t\t\t\tD9F0C2D12C680A5500BB2D25 /* OpenSSLConnection.h */,\n\t\t\t\tD9F0C2D22C680A5500BB2D25 /* UnixLibraryLoader.cpp */,\n\t\t\t);\n\t\t\tpath = generic;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA08F5AC16C751BA00F007B5 /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA08F5AE16C7525600F007B5 /* liblove-macosx.plist */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B78F61A958E3B000E1D17 /* common */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFAA3A9AC1B7D465A00CED060 /* android.cpp */,\n\t\t\t\tFAA3A9AD1B7D465A00CED060 /* android.h */,\n\t\t\t\tFAAC2F7F251A9D3E00BCB81B /* apple.h */,\n\t\t\t\tFAAC2F78251A9D2200BCB81B /* apple.mm */,\n\t\t\t\tFA0B78F71A958E3B000E1D17 /* b64.cpp */,\n\t\t\t\tFA0B78F81A958E3B000E1D17 /* b64.h */,\n\t\t\t\tFA6BDE5B1F31725300786805 /* Color.h */,\n\t\t\t\tFA0B78F91A958E3B000E1D17 /* config.h */,\n\t\t\t\tFA9D8DD41DEF8411002CD881 /* Data.cpp */,\n\t\t\t\tFA0B78FA1A958E3B000E1D17 /* Data.h */,\n\t\t\t\tFA0B78FB1A958E3B000E1D17 /* delay.cpp */,\n\t\t\t\tFA0B78FC1A958E3B000E1D17 /* delay.h */,\n\t\t\t\tFA91DA891F377C3900C80E33 /* deprecation.cpp */,\n\t\t\t\tFA91DA8A1F377C3900C80E33 /* deprecation.h */,\n\t\t\t\tFA0B78FD1A958E3B000E1D17 /* EnumMap.h */,\n\t\t\t\tFA0B78FE1A958E3B000E1D17 /* Exception.cpp */,\n\t\t\t\tFA0B78FF1A958E3B000E1D17 /* Exception.h */,\n\t\t\t\tFA0A3A5E23366CE9001C269E /* floattypes.cpp */,\n\t\t\t\tFA0A3A5D23366CE9001C269E /* floattypes.h */,\n\t\t\t\tFA0B79001A958E3B000E1D17 /* int.h */,\n\t\t\t\tFA0B7EF01A959D2C000E1D17 /* ios.h */,\n\t\t\t\tFA0B7EF11A959D2C000E1D17 /* ios.mm */,\n\t\t\t\tFAC8E54E23B01C0C007B07C8 /* macos.h */,\n\t\t\t\tFAC8E54F23B01C0C007B07C8 /* macos.mm */,\n\t\t\t\tFA0B79011A958E3B000E1D17 /* math.h */,\n\t\t\t\tFA0B79021A958E3B000E1D17 /* Matrix.cpp */,\n\t\t\t\tFA0B79031A958E3B000E1D17 /* Matrix.h */,\n\t\t\t\tFA56AA361FAFF02000A43D5F /* memory.cpp */,\n\t\t\t\tFA56AA371FAFF02000A43D5F /* memory.h */,\n\t\t\t\tFA0B79061A958E3B000E1D17 /* Module.cpp */,\n\t\t\t\tFA0B79071A958E3B000E1D17 /* Module.h */,\n\t\t\t\tFA0B79081A958E3B000E1D17 /* Object.cpp */,\n\t\t\t\tFA0B79091A958E3B000E1D17 /* Object.h */,\n\t\t\t\tFAF1889C1E9DA834008C1479 /* Optional.h */,\n\t\t\t\tFA9D8DCF1DEB56C3002CD881 /* pixelformat.cpp */,\n\t\t\t\tFA9D8DD01DEB56C3002CD881 /* pixelformat.h */,\n\t\t\t\tFAB922C3257D99EF0035DAD6 /* Range.h */,\n\t\t\t\tFA0B790C1A958E3B000E1D17 /* Reference.cpp */,\n\t\t\t\tFA0B790D1A958E3B000E1D17 /* Reference.h */,\n\t\t\t\tFA0B790E1A958E3B000E1D17 /* runtime.cpp */,\n\t\t\t\tFA0B790F1A958E3B000E1D17 /* runtime.h */,\n\t\t\t\tFA9D8DD51DEF8411002CD881 /* Stream.cpp */,\n\t\t\t\tFA9D8DD61DEF8411002CD881 /* Stream.h */,\n\t\t\t\tFA15DFAB1F9B8C850042AB22 /* StringMap.cpp */,\n\t\t\t\tFA0B79101A958E3B000E1D17 /* StringMap.h */,\n\t\t\t\tFA620A391AA305F6005DB4C2 /* types.cpp */,\n\t\t\t\tFA0B79111A958E3B000E1D17 /* types.h */,\n\t\t\t\tFA0B79121A958E3B000E1D17 /* utf8.cpp */,\n\t\t\t\tFA0B79131A958E3B000E1D17 /* utf8.h */,\n\t\t\t\tFA0B79141A958E3B000E1D17 /* Variant.cpp */,\n\t\t\t\tFA0B79151A958E3B000E1D17 /* Variant.h */,\n\t\t\t\tFA0B79161A958E3B000E1D17 /* Vector.cpp */,\n\t\t\t\tFA0B79171A958E3B000E1D17 /* Vector.h */,\n\t\t\t\tFA0B79181A958E3B000E1D17 /* version.h */,\n\t\t\t);\n\t\t\tname = common;\n\t\t\tpath = ../../src/common;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B794D1A958EA3000E1D17 /* libraries */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFABDA9102552448200B5C523 /* box2d */,\n\t\t\t\tFA0B79B41A958EA3000E1D17 /* ddsparse */,\n\t\t\t\tFA522D5023F9FF2A0059EE3C /* dr */,\n\t\t\t\tFA0B79B81A958EA3000E1D17 /* enet */,\n\t\t\t\tFA0B79D31A958EA3000E1D17 /* glad */,\n\t\t\t\tFAF13FBF1E20934C00F898D2 /* glslang */,\n\t\t\t\tFA0B79D81A958EA3000E1D17 /* lodepng */,\n\t\t\t\tFA94724527A6EE1B00817677 /* luahttps */,\n\t\t\t\tFAAA3FD21F64B3AD00F89E99 /* lua53 */,\n\t\t\t\tFA0B79DB1A958EA3000E1D17 /* luasocket */,\n\t\t\t\tFAB17BE31ABFAA9000F9BA27 /* lz4 */,\n\t\t\t\tFA0B7A141A958EA3000E1D17 /* noise1234 */,\n\t\t\t\tFAC7CD591FE35E95006A60C7 /* physfs */,\n\t\t\t\tFA18CEF123DCF67800263725 /* spirv_cross */,\n\t\t\t\tFA0B7A171A958EA3000E1D17 /* stb */,\n\t\t\t\tFA1557BE1CE90A2C00AFF582 /* tinyexr */,\n\t\t\t\tFA0B7A191A958EA3000E1D17 /* utf8 */,\n\t\t\t\tFA0B7A1F1A958EA3000E1D17 /* Wuff */,\n\t\t\t\tFA4F2B761DE0125B00CA37D7 /* xxHash */,\n\t\t\t);\n\t\t\tname = libraries;\n\t\t\tpath = ../../src/libraries;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B79B41A958EA3000E1D17 /* ddsparse */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B79B51A958EA3000E1D17 /* ddsinfo.h */,\n\t\t\t\tFA0B79B61A958EA3000E1D17 /* ddsparse.cpp */,\n\t\t\t\tFA0B79B71A958EA3000E1D17 /* ddsparse.h */,\n\t\t\t);\n\t\t\tpath = ddsparse;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B79B81A958EA3000E1D17 /* enet */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B79B91A958EA3000E1D17 /* enet.cpp */,\n\t\t\t\tFA0B79BA1A958EA3000E1D17 /* libenet */,\n\t\t\t\tFA0B79D21A958EA3000E1D17 /* lua-enet.h */,\n\t\t\t);\n\t\t\tpath = enet;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B79BA1A958EA3000E1D17 /* libenet */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B79BB1A958EA3000E1D17 /* callbacks.c */,\n\t\t\t\tFA0B79BD1A958EA3000E1D17 /* compress.c */,\n\t\t\t\tFA0B79BE1A958EA3000E1D17 /* host.c */,\n\t\t\t\tFA0B79BF1A958EA3000E1D17 /* include */,\n\t\t\t\tFA0B79CB1A958EA3000E1D17 /* list.c */,\n\t\t\t\tFA0B79CC1A958EA3000E1D17 /* packet.c */,\n\t\t\t\tFA0B79CD1A958EA3000E1D17 /* peer.c */,\n\t\t\t\tFA0B79CE1A958EA3000E1D17 /* protocol.c */,\n\t\t\t\tFA0B79D01A958EA3000E1D17 /* unix.c */,\n\t\t\t\tFA0B79D11A958EA3000E1D17 /* win32.c */,\n\t\t\t);\n\t\t\tpath = libenet;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B79BF1A958EA3000E1D17 /* include */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B79C01A958EA3000E1D17 /* enet */,\n\t\t\t);\n\t\t\tpath = include;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B79C01A958EA3000E1D17 /* enet */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B79C11A958EA3000E1D17 /* callbacks.h */,\n\t\t\t\tFA0B79C21A958EA3000E1D17 /* enet.h */,\n\t\t\t\tFA0B79C31A958EA3000E1D17 /* list.h */,\n\t\t\t\tFA0B79C41A958EA3000E1D17 /* protocol.h */,\n\t\t\t\tFA0B79C51A958EA3000E1D17 /* time.h */,\n\t\t\t\tFA0B79C61A958EA3000E1D17 /* types.h */,\n\t\t\t\tFA0B79C71A958EA3000E1D17 /* unix.h */,\n\t\t\t\tFA0B79C81A958EA3000E1D17 /* utility.h */,\n\t\t\t\tFA0B79C91A958EA3000E1D17 /* win32.h */,\n\t\t\t);\n\t\t\tpath = enet;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B79D31A958EA3000E1D17 /* glad */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B79D41A958EA3000E1D17 /* glad.cpp */,\n\t\t\t\tFA0B79D61A958EA3000E1D17 /* glad.hpp */,\n\t\t\t\tFA0B79D71A958EA3000E1D17 /* gladfuncs.hpp */,\n\t\t\t);\n\t\t\tpath = glad;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B79D81A958EA3000E1D17 /* lodepng */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B79D91A958EA3000E1D17 /* lodepng.cpp */,\n\t\t\t\tFA0B79DA1A958EA3000E1D17 /* lodepng.h */,\n\t\t\t);\n\t\t\tpath = lodepng;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B79DB1A958EA3000E1D17 /* luasocket */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B79DC1A958EA3000E1D17 /* libluasocket */,\n\t\t\t\tFA0B7A0E1A958EA3000E1D17 /* luasocket.cpp */,\n\t\t\t\tFA0B7A0F1A958EA3000E1D17 /* luasocket.h */,\n\t\t\t);\n\t\t\tpath = luasocket;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B79DC1A958EA3000E1D17 /* libluasocket */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t217DFB9D1D9F6D490055D849 /* auxiliar.c */,\n\t\t\t\t217DFB9E1D9F6D490055D849 /* auxiliar.h */,\n\t\t\t\t217DFB9F1D9F6D490055D849 /* buffer.c */,\n\t\t\t\t217DFBA01D9F6D490055D849 /* buffer.h */,\n\t\t\t\t217DFBA11D9F6D490055D849 /* compat.c */,\n\t\t\t\t217DFBA21D9F6D490055D849 /* compat.h */,\n\t\t\t\t217DFBA31D9F6D490055D849 /* except.c */,\n\t\t\t\t217DFBA41D9F6D490055D849 /* except.h */,\n\t\t\t\t217DFBA51D9F6D490055D849 /* ftp.lua */,\n\t\t\t\t217DFBA61D9F6D490055D849 /* ftp.lua.h */,\n\t\t\t\t217DFBA71D9F6D490055D849 /* headers.lua */,\n\t\t\t\t217DFBA81D9F6D490055D849 /* headers.lua.h */,\n\t\t\t\t217DFBA91D9F6D490055D849 /* http.lua */,\n\t\t\t\t217DFBAA1D9F6D490055D849 /* http.lua.h */,\n\t\t\t\t217DFBAB1D9F6D490055D849 /* inet.c */,\n\t\t\t\t217DFBAC1D9F6D490055D849 /* inet.h */,\n\t\t\t\t217DFBAD1D9F6D490055D849 /* io.c */,\n\t\t\t\t217DFBAE1D9F6D490055D849 /* io.h */,\n\t\t\t\t217DFBAF1D9F6D490055D849 /* ltn12.lua */,\n\t\t\t\t217DFBB01D9F6D490055D849 /* ltn12.lua.h */,\n\t\t\t\t217DFBB11D9F6D490055D849 /* luasocket.c */,\n\t\t\t\t217DFBB21D9F6D490055D849 /* luasocket.h */,\n\t\t\t\t217DFBB41D9F6D490055D849 /* mbox.lua */,\n\t\t\t\t217DFBB51D9F6D490055D849 /* mbox.lua.h */,\n\t\t\t\t217DFBB61D9F6D490055D849 /* mime.c */,\n\t\t\t\t217DFBB71D9F6D490055D849 /* mime.h */,\n\t\t\t\t217DFBB81D9F6D490055D849 /* mime.lua */,\n\t\t\t\t217DFBB91D9F6D490055D849 /* mime.lua.h */,\n\t\t\t\t217DFBBA1D9F6D490055D849 /* options.c */,\n\t\t\t\t217DFBBB1D9F6D490055D849 /* options.h */,\n\t\t\t\t217DFBBC1D9F6D490055D849 /* pierror.h */,\n\t\t\t\t217DFBBD1D9F6D490055D849 /* select.c */,\n\t\t\t\t217DFBBE1D9F6D490055D849 /* select.h */,\n\t\t\t\t217DFBBF1D9F6D490055D849 /* serial.c */,\n\t\t\t\t217DFBC01D9F6D490055D849 /* smtp.lua */,\n\t\t\t\t217DFBC11D9F6D490055D849 /* smtp.lua.h */,\n\t\t\t\t217DFBC21D9F6D490055D849 /* socket.h */,\n\t\t\t\t217DFBC31D9F6D490055D849 /* socket.lua */,\n\t\t\t\t217DFBC41D9F6D490055D849 /* socket.lua.h */,\n\t\t\t\t217DFBC51D9F6D490055D849 /* tcp.c */,\n\t\t\t\t217DFBC61D9F6D490055D849 /* tcp.h */,\n\t\t\t\t217DFBC71D9F6D490055D849 /* timeout.c */,\n\t\t\t\t217DFBC81D9F6D490055D849 /* timeout.h */,\n\t\t\t\t217DFBC91D9F6D490055D849 /* tp.lua */,\n\t\t\t\t217DFBCA1D9F6D490055D849 /* tp.lua.h */,\n\t\t\t\t217DFBCB1D9F6D490055D849 /* udp.c */,\n\t\t\t\t217DFBCC1D9F6D490055D849 /* udp.h */,\n\t\t\t\t217DFBCD1D9F6D490055D849 /* unix.c */,\n\t\t\t\t217DFBCE1D9F6D490055D849 /* unix.h */,\n\t\t\t\tFAFEB29528F210540025D7D0 /* unixdgram.c */,\n\t\t\t\tFAFEB29628F210550025D7D0 /* unixdgram.h */,\n\t\t\t\tFAFEB29728F210550025D7D0 /* unixstream.c */,\n\t\t\t\tFAFEB29828F210550025D7D0 /* unixstream.h */,\n\t\t\t\t217DFBD31D9F6D490055D849 /* url.lua */,\n\t\t\t\t217DFBD41D9F6D490055D849 /* url.lua.h */,\n\t\t\t\t217DFBD51D9F6D490055D849 /* usocket.c */,\n\t\t\t\t217DFBD61D9F6D490055D849 /* usocket.h */,\n\t\t\t);\n\t\t\tpath = libluasocket;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7A141A958EA3000E1D17 /* noise1234 */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA57FB961AE1993600F2AD6D /* noise1234.cpp */,\n\t\t\t\tFA57FB971AE1993600F2AD6D /* noise1234.h */,\n\t\t\t\tFA0B7A151A958EA3000E1D17 /* simplexnoise1234.cpp */,\n\t\t\t\tFA0B7A161A958EA3000E1D17 /* simplexnoise1234.h */,\n\t\t\t);\n\t\t\tpath = noise1234;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7A171A958EA3000E1D17 /* stb */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7A181A958EA3000E1D17 /* stb_image.h */,\n\t\t\t);\n\t\t\tpath = stb;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7A191A958EA3000E1D17 /* utf8 */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7A1A1A958EA3000E1D17 /* utf8 */,\n\t\t\t\tFA0B7A1E1A958EA3000E1D17 /* utf8.h */,\n\t\t\t);\n\t\t\tpath = utf8;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7A1A1A958EA3000E1D17 /* utf8 */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7A1B1A958EA3000E1D17 /* checked.h */,\n\t\t\t\tFA0B7A1C1A958EA3000E1D17 /* core.h */,\n\t\t\t\tFA0B7A1D1A958EA3000E1D17 /* unchecked.h */,\n\t\t\t);\n\t\t\tpath = utf8;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7A1F1A958EA3000E1D17 /* Wuff */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7A201A958EA3000E1D17 /* wuff.c */,\n\t\t\t\tFA0B7A211A958EA3000E1D17 /* wuff.h */,\n\t\t\t\tFA0B7A221A958EA3000E1D17 /* wuff_config.h */,\n\t\t\t\tFA0B7A231A958EA3000E1D17 /* wuff_convert.c */,\n\t\t\t\tFA0B7A241A958EA3000E1D17 /* wuff_convert.h */,\n\t\t\t\tFA0B7A251A958EA3000E1D17 /* wuff_internal.c */,\n\t\t\t\tFA0B7A261A958EA3000E1D17 /* wuff_internal.h */,\n\t\t\t\tFA0B7A271A958EA3000E1D17 /* wuff_memory.c */,\n\t\t\t);\n\t\t\tpath = Wuff;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7B3C1A95902C000E1D17 /* modules */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7B3D1A95902C000E1D17 /* audio */,\n\t\t\t\tFACA02DF1F5E396B0084B28F /* data */,\n\t\t\t\tFA0B7B521A95902C000E1D17 /* event */,\n\t\t\t\tFA0B7B5A1A95902C000E1D17 /* filesystem */,\n\t\t\t\tFA0B7B701A95902C000E1D17 /* font */,\n\t\t\t\tFA0B7B871A95902C000E1D17 /* graphics */,\n\t\t\t\tFA0B7BC21A95902C000E1D17 /* image */,\n\t\t\t\tFA0B7BE81A95902C000E1D17 /* joystick */,\n\t\t\t\tFA0B7BF51A95902C000E1D17 /* keyboard */,\n\t\t\t\tFA0B7BFD1A95902C000E1D17 /* love */,\n\t\t\t\tFA0B7C001A95902C000E1D17 /* math */,\n\t\t\t\tFA0B7C0D1A95902C000E1D17 /* mouse */,\n\t\t\t\tFA0B7C1B1A95902C000E1D17 /* physics */,\n\t\t\t\tFACA06A4293EE5CD001A2557 /* sensor */,\n\t\t\t\tFA0B7C7B1A95902C000E1D17 /* sound */,\n\t\t\t\tFA0B7C9A1A95902C000E1D17 /* system */,\n\t\t\t\tFA0B7CA21A95902C000E1D17 /* thread */,\n\t\t\t\tFA0B7CB71A95902C000E1D17 /* timer */,\n\t\t\t\tFA0B7CBE1A95902C000E1D17 /* touch */,\n\t\t\t\tFA27B3881B498151008A9DCE /* video */,\n\t\t\t\tFA0B7CC51A95902C000E1D17 /* window */,\n\t\t\t);\n\t\t\tname = modules;\n\t\t\tpath = ../../src/modules;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7B3D1A95902C000E1D17 /* audio */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7B3E1A95902C000E1D17 /* Audio.cpp */,\n\t\t\t\tFA0B7B3F1A95902C000E1D17 /* Audio.h */,\n\t\t\t\tFAC756F31E4F99B400B91289 /* Effect.cpp */,\n\t\t\t\tFAC756F41E4F99B400B91289 /* Effect.h */,\n\t\t\t\tFA1E887C1DF363CD00E808AA /* Filter.cpp */,\n\t\t\t\tFA1E887D1DF363CD00E808AA /* Filter.h */,\n\t\t\t\tFA0B7B401A95902C000E1D17 /* null */,\n\t\t\t\tFA0B7B451A95902C000E1D17 /* openal */,\n\t\t\t\tFA4F2BA21DE1E36400CA37D7 /* RecordingDevice.cpp */,\n\t\t\t\tFA4F2BA31DE1E36400CA37D7 /* RecordingDevice.h */,\n\t\t\t\tFA0B7B4C1A95902C000E1D17 /* Source.cpp */,\n\t\t\t\tFA0B7B4D1A95902C000E1D17 /* Source.h */,\n\t\t\t\tFA0B7B4E1A95902C000E1D17 /* wrap_Audio.cpp */,\n\t\t\t\tFA0B7B4F1A95902C000E1D17 /* wrap_Audio.h */,\n\t\t\t\tFA4F2BA41DE1E36400CA37D7 /* wrap_RecordingDevice.cpp */,\n\t\t\t\tFA4F2BA51DE1E36400CA37D7 /* wrap_RecordingDevice.h */,\n\t\t\t\tFA0B7B501A95902C000E1D17 /* wrap_Source.cpp */,\n\t\t\t\tFA0B7B511A95902C000E1D17 /* wrap_Source.h */,\n\t\t\t);\n\t\t\tpath = audio;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7B401A95902C000E1D17 /* null */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7B411A95902C000E1D17 /* Audio.cpp */,\n\t\t\t\tFA0B7B421A95902C000E1D17 /* Audio.h */,\n\t\t\t\tFA4F2BAA1DE1E37000CA37D7 /* RecordingDevice.cpp */,\n\t\t\t\tFA4F2BAB1DE1E37000CA37D7 /* RecordingDevice.h */,\n\t\t\t\tFA0B7B431A95902C000E1D17 /* Source.cpp */,\n\t\t\t\tFA0B7B441A95902C000E1D17 /* Source.h */,\n\t\t\t);\n\t\t\tpath = null;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7B451A95902C000E1D17 /* openal */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7B461A95902C000E1D17 /* Audio.cpp */,\n\t\t\t\tFA0B7B471A95902C000E1D17 /* Audio.h */,\n\t\t\t\tFAC756F81E4F99D200B91289 /* Effect.cpp */,\n\t\t\t\tFAC756F91E4F99D200B91289 /* Effect.h */,\n\t\t\t\tFA1E88811DF363DB00E808AA /* Filter.cpp */,\n\t\t\t\tFA1E88821DF363DB00E808AA /* Filter.h */,\n\t\t\t\tFA0B7B481A95902C000E1D17 /* Pool.cpp */,\n\t\t\t\tFA0B7B491A95902C000E1D17 /* Pool.h */,\n\t\t\t\tFA4F2BAE1DE1E37B00CA37D7 /* RecordingDevice.cpp */,\n\t\t\t\tFA4F2BAF1DE1E37B00CA37D7 /* RecordingDevice.h */,\n\t\t\t\tFA0B7B4A1A95902C000E1D17 /* Source.cpp */,\n\t\t\t\tFA0B7B4B1A95902C000E1D17 /* Source.h */,\n\t\t\t);\n\t\t\tpath = openal;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7B521A95902C000E1D17 /* event */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7B531A95902C000E1D17 /* Event.cpp */,\n\t\t\t\tFA0B7B541A95902C000E1D17 /* Event.h */,\n\t\t\t\tFA0B7B551A95902C000E1D17 /* sdl */,\n\t\t\t\tFA8951A01AA2EDF300EC385A /* wrap_Event.cpp */,\n\t\t\t\tFA8951A11AA2EDF300EC385A /* wrap_Event.h */,\n\t\t\t\tFAF949FD21DEE8B7001CD27E /* wrap_Event.lua */,\n\t\t\t);\n\t\t\tpath = event;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7B551A95902C000E1D17 /* sdl */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7B561A95902C000E1D17 /* Event.cpp */,\n\t\t\t\tFA0B7B571A95902C000E1D17 /* Event.h */,\n\t\t\t);\n\t\t\tpath = sdl;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7B5A1A95902C000E1D17 /* filesystem */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7B5D1A95902C000E1D17 /* File.cpp */,\n\t\t\t\tFA0B7B5E1A95902C000E1D17 /* File.h */,\n\t\t\t\tFA0B7B5F1A95902C000E1D17 /* FileData.cpp */,\n\t\t\t\tFA0B7B601A95902C000E1D17 /* FileData.h */,\n\t\t\t\tFA0B7B611A95902C000E1D17 /* Filesystem.cpp */,\n\t\t\t\tFA0B7B621A95902C000E1D17 /* Filesystem.h */,\n\t\t\t\tFAC8E54423AC832A007B07C8 /* NativeFile.cpp */,\n\t\t\t\tFAC8E54323AC832A007B07C8 /* NativeFile.h */,\n\t\t\t\tFA0B7B631A95902C000E1D17 /* physfs */,\n\t\t\t\tFA0B7B6A1A95902C000E1D17 /* wrap_File.cpp */,\n\t\t\t\tFA0B7B6B1A95902C000E1D17 /* wrap_File.h */,\n\t\t\t\tFA0B7B6C1A95902C000E1D17 /* wrap_FileData.cpp */,\n\t\t\t\tFA0B7B6D1A95902C000E1D17 /* wrap_FileData.h */,\n\t\t\t\tFA0B7B6E1A95902C000E1D17 /* wrap_Filesystem.cpp */,\n\t\t\t\tFA0B7B6F1A95902C000E1D17 /* wrap_Filesystem.h */,\n\t\t\t\tFAC8E54823AC8379007B07C8 /* wrap_NativeFile.cpp */,\n\t\t\t\tFAC8E54923AC8379007B07C8 /* wrap_NativeFile.h */,\n\t\t\t);\n\t\t\tpath = filesystem;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7B631A95902C000E1D17 /* physfs */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7B641A95902C000E1D17 /* File.cpp */,\n\t\t\t\tFA0B7B651A95902C000E1D17 /* File.h */,\n\t\t\t\tFA0B7B661A95902C000E1D17 /* Filesystem.cpp */,\n\t\t\t\tFA0B7B671A95902C000E1D17 /* Filesystem.h */,\n\t\t\t\tD943E58C2A24D56000D80361 /* PhysfsIo.cpp */,\n\t\t\t\tD943E58D2A24D56000D80361 /* PhysfsIo.h */,\n\t\t\t);\n\t\t\tpath = physfs;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7B701A95902C000E1D17 /* font */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7B711A95902C000E1D17 /* BMFontRasterizer.cpp */,\n\t\t\t\tFA0B7B721A95902C000E1D17 /* BMFontRasterizer.h */,\n\t\t\t\tFA0B7B731A95902C000E1D17 /* Font.cpp */,\n\t\t\t\tFA0B7B741A95902C000E1D17 /* Font.h */,\n\t\t\t\tFA0B7B751A95902C000E1D17 /* freetype */,\n\t\t\t\tD9DAB9262961F0FF00C64820 /* GenericShaper.cpp */,\n\t\t\t\tD9DAB9252961F0FF00C64820 /* GenericShaper.h */,\n\t\t\t\tFA0B7B7A1A95902C000E1D17 /* GlyphData.cpp */,\n\t\t\t\tFA0B7B7B1A95902C000E1D17 /* GlyphData.h */,\n\t\t\t\tFA0B7B7C1A95902C000E1D17 /* ImageRasterizer.cpp */,\n\t\t\t\tFA0B7B7D1A95902C000E1D17 /* ImageRasterizer.h */,\n\t\t\t\tFA522D5923FA5ED40059EE3C /* NotoSans-Regular.ttf.gzip.h */,\n\t\t\t\tFA0B7B7E1A95902C000E1D17 /* Rasterizer.cpp */,\n\t\t\t\tFA0B7B7F1A95902C000E1D17 /* Rasterizer.h */,\n\t\t\t\tD9DAB9282961F10000C64820 /* TextShaper.cpp */,\n\t\t\t\tD9DAB9272961F0FF00C64820 /* TextShaper.h */,\n\t\t\t\tFAB2D5A81AABDD8A008224A4 /* TrueTypeRasterizer.cpp */,\n\t\t\t\tFAB2D5A91AABDD8A008224A4 /* TrueTypeRasterizer.h */,\n\t\t\t\tFA0B7B811A95902C000E1D17 /* wrap_Font.cpp */,\n\t\t\t\tFA0B7B821A95902C000E1D17 /* wrap_Font.h */,\n\t\t\t\tFA0B7B831A95902C000E1D17 /* wrap_GlyphData.cpp */,\n\t\t\t\tFA0B7B841A95902C000E1D17 /* wrap_GlyphData.h */,\n\t\t\t\tFA0B7B851A95902C000E1D17 /* wrap_Rasterizer.cpp */,\n\t\t\t\tFA0B7B861A95902C000E1D17 /* wrap_Rasterizer.h */,\n\t\t\t);\n\t\t\tpath = font;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7B751A95902C000E1D17 /* freetype */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7B761A95902C000E1D17 /* Font.cpp */,\n\t\t\t\tFA0B7B771A95902C000E1D17 /* Font.h */,\n\t\t\t\tD9DAB9212961F0EE00C64820 /* HarfbuzzShaper.cpp */,\n\t\t\t\tD9DAB9202961F0EE00C64820 /* HarfbuzzShaper.h */,\n\t\t\t\tFA0B7B781A95902C000E1D17 /* TrueTypeRasterizer.cpp */,\n\t\t\t\tFA0B7B791A95902C000E1D17 /* TrueTypeRasterizer.h */,\n\t\t\t);\n\t\t\tpath = freetype;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7B871A95902C000E1D17 /* graphics */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFADF53F61E3C7ACD00012CC0 /* Buffer.cpp */,\n\t\t\t\tFADF53F71E3C7ACD00012CC0 /* Buffer.h */,\n\t\t\t\tFA9D53AA1F5307E900125C6B /* Deprecations.cpp */,\n\t\t\t\tFA9D53AB1F5307E900125C6B /* Deprecations.h */,\n\t\t\t\tFA9D8DDC1DEF842A002CD881 /* Drawable.cpp */,\n\t\t\t\tFA0B7B891A95902C000E1D17 /* Drawable.h */,\n\t\t\t\tFA1BA09B1E16CFCE00AA2803 /* Font.cpp */,\n\t\t\t\tFA1BA09C1E16CFCE00AA2803 /* Font.h */,\n\t\t\t\tFA0B7B8A1A95902C000E1D17 /* Graphics.cpp */,\n\t\t\t\tFA0B7B8B1A95902C000E1D17 /* Graphics.h */,\n\t\t\t\tFA84DE6427791C36002674C6 /* GraphicsReadback.cpp */,\n\t\t\t\tFA84DE6527791C36002674C6 /* GraphicsReadback.h */,\n\t\t\t\tFADF54231E3DA5BA00012CC0 /* Mesh.cpp */,\n\t\t\t\tFADF54241E3DA5BA00012CC0 /* Mesh.h */,\n\t\t\t\tFA18CECC23DBC6E000263725 /* metal */,\n\t\t\t\tFA0B7B8C1A95902C000E1D17 /* opengl */,\n\t\t\t\tFAE272501C05A15B00A67640 /* ParticleSystem.cpp */,\n\t\t\t\tFAE272511C05A15B00A67640 /* ParticleSystem.h */,\n\t\t\t\tFA0B7B9B1A95902C000E1D17 /* Polyline.cpp */,\n\t\t\t\tFA0B7B9C1A95902C000E1D17 /* Polyline.h */,\n\t\t\t\tFA0B7BBC1A95902C000E1D17 /* Quad.cpp */,\n\t\t\t\tFA0B7BBD1A95902C000E1D17 /* Quad.h */,\n\t\t\t\tFAC271E423B5B5B400C200D3 /* renderstate.cpp */,\n\t\t\t\tFAC271E323B5B5B400C200D3 /* renderstate.h */,\n\t\t\t\tFA10DD7B1F9EC24E00E1FE3D /* Resource.h */,\n\t\t\t\tFA1BA0AF1E16FD0800AA2803 /* Shader.cpp */,\n\t\t\t\tFA1BA0B01E16FD0800AA2803 /* Shader.h */,\n\t\t\t\tFA3C5E401F8C368C0003C579 /* ShaderStage.cpp */,\n\t\t\t\tFA3C5E411F8C368C0003C579 /* ShaderStage.h */,\n\t\t\t\tFADF542D1E3DABF600012CC0 /* SpriteBatch.cpp */,\n\t\t\t\tFADF542E1E3DABF600012CC0 /* SpriteBatch.h */,\n\t\t\t\tFA29C0041E12355B00268CD8 /* StreamBuffer.cpp */,\n\t\t\t\tFA2AF6721DAD62710032B62C /* StreamBuffer.h */,\n\t\t\t\tFADF53FB1E3D74F200012CC0 /* TextBatch.cpp */,\n\t\t\t\tFADF53FC1E3D74F200012CC0 /* TextBatch.h */,\n\t\t\t\tFA0B7BBE1A95902C000E1D17 /* Texture.cpp */,\n\t\t\t\tFA0B7BBF1A95902C000E1D17 /* Texture.h */,\n\t\t\t\tFA2AF6731DAD64970032B62C /* vertex.cpp */,\n\t\t\t\tFA2AF6711DAC76FF0032B62C /* vertex.h */,\n\t\t\t\tFADF54051E3D78F700012CC0 /* Video.cpp */,\n\t\t\t\tFADF54061E3D78F700012CC0 /* Video.h */,\n\t\t\t\tFA0B7BC01A95902C000E1D17 /* Volatile.cpp */,\n\t\t\t\tFA0B7BC11A95902C000E1D17 /* Volatile.h */,\n\t\t\t\tFA18CEC323D3AE6700263725 /* wrap_Buffer.cpp */,\n\t\t\t\tFA18CEC423D3AE6700263725 /* wrap_Buffer.h */,\n\t\t\t\tFA1BA0A01E16D97500AA2803 /* wrap_Font.cpp */,\n\t\t\t\tFA1BA0A11E16D97500AA2803 /* wrap_Font.h */,\n\t\t\t\tFADF54391E3DAFF700012CC0 /* wrap_Graphics.cpp */,\n\t\t\t\tFADF543A1E3DAFF700012CC0 /* wrap_Graphics.h */,\n\t\t\t\tFADF54371E3DAFBA00012CC0 /* wrap_Graphics.lua */,\n\t\t\t\tFA84DE6F27795E22002674C6 /* wrap_GraphicsReadback.cpp */,\n\t\t\t\tFA84DE6E27795E22002674C6 /* wrap_GraphicsReadback.h */,\n\t\t\t\tFADF54281E3DAADA00012CC0 /* wrap_Mesh.cpp */,\n\t\t\t\tFADF54291E3DAADA00012CC0 /* wrap_Mesh.h */,\n\t\t\t\tFADF541E1E3DA52C00012CC0 /* wrap_ParticleSystem.cpp */,\n\t\t\t\tFADF541F1E3DA52C00012CC0 /* wrap_ParticleSystem.h */,\n\t\t\t\tFA620A2E1AA2F8DB005DB4C2 /* wrap_Quad.cpp */,\n\t\t\t\tFA620A2F1AA2F8DB005DB4C2 /* wrap_Quad.h */,\n\t\t\t\tFA1BA0B51E17043400AA2803 /* wrap_Shader.cpp */,\n\t\t\t\tFA1BA0B61E17043400AA2803 /* wrap_Shader.h */,\n\t\t\t\tFADF54321E3DAE6E00012CC0 /* wrap_SpriteBatch.cpp */,\n\t\t\t\tFADF54331E3DAE6E00012CC0 /* wrap_SpriteBatch.h */,\n\t\t\t\tFADF54001E3D77B500012CC0 /* wrap_TextBatch.cpp */,\n\t\t\t\tFADF54011E3D77B500012CC0 /* wrap_TextBatch.h */,\n\t\t\t\tFA620A301AA2F8DB005DB4C2 /* wrap_Texture.cpp */,\n\t\t\t\tFA620A311AA2F8DB005DB4C2 /* wrap_Texture.h */,\n\t\t\t\tFADF540A1E3D7CDD00012CC0 /* wrap_Video.cpp */,\n\t\t\t\tFADF540B1E3D7CDD00012CC0 /* wrap_Video.h */,\n\t\t\t\tFADF540C1E3D7CDD00012CC0 /* wrap_Video.lua */,\n\t\t\t);\n\t\t\tpath = graphics;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7B8C1A95902C000E1D17 /* opengl */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7BA41A95902C000E1D17 /* Buffer.cpp */,\n\t\t\t\tFA0B7BA51A95902C000E1D17 /* Buffer.h */,\n\t\t\t\tFA28EBD31E352DB5003446F4 /* FenceSync.cpp */,\n\t\t\t\tFA28EBD41E352DB5003446F4 /* FenceSync.h */,\n\t\t\t\tFA0B7B911A95902C000E1D17 /* Graphics.cpp */,\n\t\t\t\tFA0B7B921A95902C000E1D17 /* Graphics.h */,\n\t\t\t\tFA84DE6A277943F6002674C6 /* GraphicsReadback.cpp */,\n\t\t\t\tFA84DE69277943F6002674C6 /* GraphicsReadback.h */,\n\t\t\t\tFA0B7B971A95902C000E1D17 /* OpenGL.cpp */,\n\t\t\t\tFA0B7B981A95902C000E1D17 /* OpenGL.h */,\n\t\t\t\tFA0B7B9D1A95902C000E1D17 /* Shader.cpp */,\n\t\t\t\tFA0B7B9E1A95902C000E1D17 /* Shader.h */,\n\t\t\t\tFA3C5E451F8D80CA0003C579 /* ShaderStage.cpp */,\n\t\t\t\tFA3C5E461F8D80CA0003C579 /* ShaderStage.h */,\n\t\t\t\tFA7634481E28722A0066EF9E /* StreamBuffer.cpp */,\n\t\t\t\tFA7634491E28722A0066EF9E /* StreamBuffer.h */,\n\t\t\t\tFA0B7B931A95902C000E1D17 /* Texture.cpp */,\n\t\t\t\tFA0B7B941A95902C000E1D17 /* Texture.h */,\n\t\t\t);\n\t\t\tpath = opengl;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7BC21A95902C000E1D17 /* image */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7BC31A95902C000E1D17 /* CompressedImageData.cpp */,\n\t\t\t\tFA0B7BC41A95902C000E1D17 /* CompressedImageData.h */,\n\t\t\t\tFAECA1B01F3164700095D008 /* CompressedSlice.cpp */,\n\t\t\t\tFAECA1B11F3164700095D008 /* CompressedSlice.h */,\n\t\t\t\tFA93C4511F315B960087CCD4 /* FormatHandler.cpp */,\n\t\t\t\tFA93C4501F315B960087CCD4 /* FormatHandler.h */,\n\t\t\t\tFA9D8DDF1DEF843D002CD881 /* Image.cpp */,\n\t\t\t\tFA0B7BC51A95902C000E1D17 /* Image.h */,\n\t\t\t\tFA0B7BC61A95902C000E1D17 /* ImageData.cpp */,\n\t\t\t\tFA0B7BC71A95902C000E1D17 /* ImageData.h */,\n\t\t\t\tFAD19A151DFF8CA200D5398A /* ImageDataBase.cpp */,\n\t\t\t\tFAD19A161DFF8CA200D5398A /* ImageDataBase.h */,\n\t\t\t\tFA0B7BC81A95902C000E1D17 /* magpie */,\n\t\t\t\tFA0B7BE21A95902C000E1D17 /* wrap_CompressedImageData.cpp */,\n\t\t\t\tFA0B7BE31A95902C000E1D17 /* wrap_CompressedImageData.h */,\n\t\t\t\tFA0B7BE41A95902C000E1D17 /* wrap_Image.cpp */,\n\t\t\t\tFA0B7BE51A95902C000E1D17 /* wrap_Image.h */,\n\t\t\t\tFA0B7BE61A95902C000E1D17 /* wrap_ImageData.cpp */,\n\t\t\t\tFA0B7BE71A95902C000E1D17 /* wrap_ImageData.h */,\n\t\t\t\tFAC734C21B2E628700AB460A /* wrap_ImageData.lua */,\n\t\t\t);\n\t\t\tpath = image;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7BC81A95902C000E1D17 /* magpie */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA41A3C61C0A1F950084430C /* ASTCHandler.cpp */,\n\t\t\t\tFA41A3C71C0A1F950084430C /* ASTCHandler.h */,\n\t\t\t\tFA0B7BCC1A95902C000E1D17 /* ddsHandler.cpp */,\n\t\t\t\tFA0B7BCD1A95902C000E1D17 /* ddsHandler.h */,\n\t\t\t\tFA1557C11CE90BD200AFF582 /* EXRHandler.cpp */,\n\t\t\t\tFA1557C21CE90BD200AFF582 /* EXRHandler.h */,\n\t\t\t\tFA0B7BD81A95902C000E1D17 /* KTXHandler.cpp */,\n\t\t\t\tFA0B7BD91A95902C000E1D17 /* KTXHandler.h */,\n\t\t\t\tFA0B7BDA1A95902C000E1D17 /* PKMHandler.cpp */,\n\t\t\t\tFA0B7BDB1A95902C000E1D17 /* PKMHandler.h */,\n\t\t\t\tFA0B7BDC1A95902C000E1D17 /* PNGHandler.cpp */,\n\t\t\t\tFA0B7BDD1A95902C000E1D17 /* PNGHandler.h */,\n\t\t\t\tFA0B7BDE1A95902C000E1D17 /* PVRHandler.cpp */,\n\t\t\t\tFA0B7BDF1A95902C000E1D17 /* PVRHandler.h */,\n\t\t\t\tFA0B7BE01A95902C000E1D17 /* STBHandler.cpp */,\n\t\t\t\tFA0B7BE11A95902C000E1D17 /* STBHandler.h */,\n\t\t\t);\n\t\t\tpath = magpie;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7BE81A95902C000E1D17 /* joystick */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7BE91A95902C000E1D17 /* Joystick.cpp */,\n\t\t\t\tFA0B7BEA1A95902C000E1D17 /* Joystick.h */,\n\t\t\t\tFA0B7BEB1A95902C000E1D17 /* JoystickModule.h */,\n\t\t\t\tFA0B7BEC1A95902C000E1D17 /* sdl */,\n\t\t\t\tFA0B7BF11A95902C000E1D17 /* wrap_Joystick.cpp */,\n\t\t\t\tFA0B7BF21A95902C000E1D17 /* wrap_Joystick.h */,\n\t\t\t\tFA0B7BF31A95902C000E1D17 /* wrap_JoystickModule.cpp */,\n\t\t\t\tFA0B7BF41A95902C000E1D17 /* wrap_JoystickModule.h */,\n\t\t\t);\n\t\t\tpath = joystick;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7BEC1A95902C000E1D17 /* sdl */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7BED1A95902C000E1D17 /* Joystick.cpp */,\n\t\t\t\tFA0B7BEE1A95902C000E1D17 /* Joystick.h */,\n\t\t\t\tFA0B7BEF1A95902C000E1D17 /* JoystickModule.cpp */,\n\t\t\t\tFA0B7BF01A95902C000E1D17 /* JoystickModule.h */,\n\t\t\t);\n\t\t\tpath = sdl;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7BF51A95902C000E1D17 /* keyboard */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7BF61A95902C000E1D17 /* Keyboard.cpp */,\n\t\t\t\tFA0B7BF71A95902C000E1D17 /* Keyboard.h */,\n\t\t\t\tFA0B7BF81A95902C000E1D17 /* sdl */,\n\t\t\t\tFA0B7BFB1A95902C000E1D17 /* wrap_Keyboard.cpp */,\n\t\t\t\tFA0B7BFC1A95902C000E1D17 /* wrap_Keyboard.h */,\n\t\t\t);\n\t\t\tpath = keyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7BF81A95902C000E1D17 /* sdl */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7BF91A95902C000E1D17 /* Keyboard.cpp */,\n\t\t\t\tFA0B7BFA1A95902C000E1D17 /* Keyboard.h */,\n\t\t\t);\n\t\t\tpath = sdl;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7BFD1A95902C000E1D17 /* love */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA1E95B4271F932B0044CF08 /* arg.lua */,\n\t\t\t\tFA577A8D16C71D3600860150 /* boot.lua */,\n\t\t\t\tFA1E95B5271F932B0044CF08 /* callbacks.lua */,\n\t\t\t\tFA69B918273828DD00CDC2E7 /* jitsetup.lua */,\n\t\t\t\tFA0B7BFE1A95902C000E1D17 /* love.cpp */,\n\t\t\t\tFA0B7BFF1A95902C000E1D17 /* love.h */,\n\t\t\t);\n\t\t\tpath = love;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7C001A95902C000E1D17 /* math */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7C011A95902C000E1D17 /* BezierCurve.cpp */,\n\t\t\t\tFA0B7C021A95902C000E1D17 /* BezierCurve.h */,\n\t\t\t\tFA0B7C031A95902C000E1D17 /* MathModule.cpp */,\n\t\t\t\tFA0B7C041A95902C000E1D17 /* MathModule.h */,\n\t\t\t\tFA0B7C051A95902C000E1D17 /* RandomGenerator.cpp */,\n\t\t\t\tFA0B7C061A95902C000E1D17 /* RandomGenerator.h */,\n\t\t\t\tFA4F2BDF1DE6650600CA37D7 /* Transform.cpp */,\n\t\t\t\tFA4F2BE01DE6650600CA37D7 /* Transform.h */,\n\t\t\t\tFA0B7C071A95902C000E1D17 /* wrap_BezierCurve.cpp */,\n\t\t\t\tFA0B7C081A95902C000E1D17 /* wrap_BezierCurve.h */,\n\t\t\t\tFA0B7C091A95902C000E1D17 /* wrap_Math.cpp */,\n\t\t\t\tFA0B7C0A1A95902C000E1D17 /* wrap_Math.h */,\n\t\t\t\tFA7DA04C1C16874A0056B200 /* wrap_Math.lua */,\n\t\t\t\tFA0B7C0B1A95902C000E1D17 /* wrap_RandomGenerator.cpp */,\n\t\t\t\tFA0B7C0C1A95902C000E1D17 /* wrap_RandomGenerator.h */,\n\t\t\t\tFA2E9BFE1C19E00C0004A1EE /* wrap_RandomGenerator.lua */,\n\t\t\t\tFA4F2BE11DE6650600CA37D7 /* wrap_Transform.cpp */,\n\t\t\t\tFA4F2BE21DE6650600CA37D7 /* wrap_Transform.h */,\n\t\t\t);\n\t\t\tpath = math;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7C0D1A95902C000E1D17 /* mouse */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7C0E1A95902C000E1D17 /* Cursor.cpp */,\n\t\t\t\tFA0B7C0F1A95902C000E1D17 /* Cursor.h */,\n\t\t\t\tFA0B7C111A95902C000E1D17 /* Mouse.h */,\n\t\t\t\tFA0B7C121A95902C000E1D17 /* sdl */,\n\t\t\t\tFA0B7C171A95902C000E1D17 /* wrap_Cursor.cpp */,\n\t\t\t\tFA0B7C181A95902C000E1D17 /* wrap_Cursor.h */,\n\t\t\t\tFA0B7C191A95902C000E1D17 /* wrap_Mouse.cpp */,\n\t\t\t\tFA0B7C1A1A95902C000E1D17 /* wrap_Mouse.h */,\n\t\t\t);\n\t\t\tpath = mouse;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7C121A95902C000E1D17 /* sdl */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7C131A95902C000E1D17 /* Cursor.cpp */,\n\t\t\t\tFA0B7C141A95902C000E1D17 /* Cursor.h */,\n\t\t\t\tFA0B7C151A95902C000E1D17 /* Mouse.cpp */,\n\t\t\t\tFA0B7C161A95902C000E1D17 /* Mouse.h */,\n\t\t\t);\n\t\t\tpath = sdl;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7C1B1A95902C000E1D17 /* physics */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7C1C1A95902C000E1D17 /* Body.cpp */,\n\t\t\t\tFA0B7C1D1A95902C000E1D17 /* Body.h */,\n\t\t\t\tFA0B7C1E1A95902C000E1D17 /* box2d */,\n\t\t\t\tFA0B7C771A95902C000E1D17 /* Joint.cpp */,\n\t\t\t\tFA0B7C781A95902C000E1D17 /* Joint.h */,\n\t\t\t\tFA0B7C791A95902C000E1D17 /* Shape.cpp */,\n\t\t\t\tFA0B7C7A1A95902C000E1D17 /* Shape.h */,\n\t\t\t);\n\t\t\tpath = physics;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7C1E1A95902C000E1D17 /* box2d */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7C1F1A95902C000E1D17 /* Body.cpp */,\n\t\t\t\tFA0B7C201A95902C000E1D17 /* Body.h */,\n\t\t\t\tFA0B7C211A95902C000E1D17 /* ChainShape.cpp */,\n\t\t\t\tFA0B7C221A95902C000E1D17 /* ChainShape.h */,\n\t\t\t\tFA0B7C231A95902C000E1D17 /* CircleShape.cpp */,\n\t\t\t\tFA0B7C241A95902C000E1D17 /* CircleShape.h */,\n\t\t\t\tFA0B7C251A95902C000E1D17 /* Contact.cpp */,\n\t\t\t\tFA0B7C261A95902C000E1D17 /* Contact.h */,\n\t\t\t\tFA0B7C271A95902C000E1D17 /* DistanceJoint.cpp */,\n\t\t\t\tFA0B7C281A95902C000E1D17 /* DistanceJoint.h */,\n\t\t\t\tFA0B7C291A95902C000E1D17 /* EdgeShape.cpp */,\n\t\t\t\tFA0B7C2A1A95902C000E1D17 /* EdgeShape.h */,\n\t\t\t\tFA0B7C2D1A95902C000E1D17 /* FrictionJoint.cpp */,\n\t\t\t\tFA0B7C2E1A95902C000E1D17 /* FrictionJoint.h */,\n\t\t\t\tFA0B7C2F1A95902C000E1D17 /* GearJoint.cpp */,\n\t\t\t\tFA0B7C301A95902C000E1D17 /* GearJoint.h */,\n\t\t\t\tFA0B7C311A95902C000E1D17 /* Joint.cpp */,\n\t\t\t\tFA0B7C321A95902C000E1D17 /* Joint.h */,\n\t\t\t\tFA0B7C331A95902C000E1D17 /* MotorJoint.cpp */,\n\t\t\t\tFA0B7C341A95902C000E1D17 /* MotorJoint.h */,\n\t\t\t\tFA0B7C351A95902C000E1D17 /* MouseJoint.cpp */,\n\t\t\t\tFA0B7C361A95902C000E1D17 /* MouseJoint.h */,\n\t\t\t\tFA0B7C371A95902C000E1D17 /* Physics.cpp */,\n\t\t\t\tFA0B7C381A95902C000E1D17 /* Physics.h */,\n\t\t\t\tFA0B7C391A95902C000E1D17 /* PolygonShape.cpp */,\n\t\t\t\tFA0B7C3A1A95902C000E1D17 /* PolygonShape.h */,\n\t\t\t\tFA0B7C3B1A95902C000E1D17 /* PrismaticJoint.cpp */,\n\t\t\t\tFA0B7C3C1A95902C000E1D17 /* PrismaticJoint.h */,\n\t\t\t\tFA0B7C3D1A95902C000E1D17 /* PulleyJoint.cpp */,\n\t\t\t\tFA0B7C3E1A95902C000E1D17 /* PulleyJoint.h */,\n\t\t\t\tFA0B7C3F1A95902C000E1D17 /* RevoluteJoint.cpp */,\n\t\t\t\tFA0B7C401A95902C000E1D17 /* RevoluteJoint.h */,\n\t\t\t\tFA0B7C411A95902C000E1D17 /* RopeJoint.cpp */,\n\t\t\t\tFA0B7C421A95902C000E1D17 /* RopeJoint.h */,\n\t\t\t\tFA0B7C431A95902C000E1D17 /* Shape.cpp */,\n\t\t\t\tFA0B7C441A95902C000E1D17 /* Shape.h */,\n\t\t\t\tFA0B7C451A95902C000E1D17 /* WeldJoint.cpp */,\n\t\t\t\tFA0B7C461A95902C000E1D17 /* WeldJoint.h */,\n\t\t\t\tFA0B7C471A95902C000E1D17 /* WheelJoint.cpp */,\n\t\t\t\tFA0B7C481A95902C000E1D17 /* WheelJoint.h */,\n\t\t\t\tFA0B7C491A95902C000E1D17 /* World.cpp */,\n\t\t\t\tFA0B7C4A1A95902C000E1D17 /* World.h */,\n\t\t\t\tFA0B7C4B1A95902C000E1D17 /* wrap_Body.cpp */,\n\t\t\t\tFA0B7C4C1A95902C000E1D17 /* wrap_Body.h */,\n\t\t\t\tFA0B7C4D1A95902C000E1D17 /* wrap_ChainShape.cpp */,\n\t\t\t\tFA0B7C4E1A95902C000E1D17 /* wrap_ChainShape.h */,\n\t\t\t\tFA0B7C4F1A95902C000E1D17 /* wrap_CircleShape.cpp */,\n\t\t\t\tFA0B7C501A95902C000E1D17 /* wrap_CircleShape.h */,\n\t\t\t\tFA0B7C511A95902C000E1D17 /* wrap_Contact.cpp */,\n\t\t\t\tFA0B7C521A95902C000E1D17 /* wrap_Contact.h */,\n\t\t\t\tFA0B7C531A95902C000E1D17 /* wrap_DistanceJoint.cpp */,\n\t\t\t\tFA0B7C541A95902C000E1D17 /* wrap_DistanceJoint.h */,\n\t\t\t\tFA0B7C551A95902C000E1D17 /* wrap_EdgeShape.cpp */,\n\t\t\t\tFA0B7C561A95902C000E1D17 /* wrap_EdgeShape.h */,\n\t\t\t\tFA0B7C591A95902C000E1D17 /* wrap_FrictionJoint.cpp */,\n\t\t\t\tFA0B7C5A1A95902C000E1D17 /* wrap_FrictionJoint.h */,\n\t\t\t\tFA0B7C5B1A95902C000E1D17 /* wrap_GearJoint.cpp */,\n\t\t\t\tFA0B7C5C1A95902C000E1D17 /* wrap_GearJoint.h */,\n\t\t\t\tFA0B7C5D1A95902C000E1D17 /* wrap_Joint.cpp */,\n\t\t\t\tFA0B7C5E1A95902C000E1D17 /* wrap_Joint.h */,\n\t\t\t\tFA0B7C5F1A95902C000E1D17 /* wrap_MotorJoint.cpp */,\n\t\t\t\tFA0B7C601A95902C000E1D17 /* wrap_MotorJoint.h */,\n\t\t\t\tFA0B7C611A95902C000E1D17 /* wrap_MouseJoint.cpp */,\n\t\t\t\tFA0B7C621A95902C000E1D17 /* wrap_MouseJoint.h */,\n\t\t\t\tFA0B7C631A95902C000E1D17 /* wrap_Physics.cpp */,\n\t\t\t\tFA0B7C641A95902C000E1D17 /* wrap_Physics.h */,\n\t\t\t\tFA0B7C651A95902C000E1D17 /* wrap_PolygonShape.cpp */,\n\t\t\t\tFA0B7C661A95902C000E1D17 /* wrap_PolygonShape.h */,\n\t\t\t\tFA0B7C671A95902C000E1D17 /* wrap_PrismaticJoint.cpp */,\n\t\t\t\tFA0B7C681A95902C000E1D17 /* wrap_PrismaticJoint.h */,\n\t\t\t\tFA0B7C691A95902C000E1D17 /* wrap_PulleyJoint.cpp */,\n\t\t\t\tFA0B7C6A1A95902C000E1D17 /* wrap_PulleyJoint.h */,\n\t\t\t\tFA0B7C6B1A95902C000E1D17 /* wrap_RevoluteJoint.cpp */,\n\t\t\t\tFA0B7C6C1A95902C000E1D17 /* wrap_RevoluteJoint.h */,\n\t\t\t\tFA0B7C6D1A95902C000E1D17 /* wrap_RopeJoint.cpp */,\n\t\t\t\tFA0B7C6E1A95902C000E1D17 /* wrap_RopeJoint.h */,\n\t\t\t\tFA0B7C6F1A95902C000E1D17 /* wrap_Shape.cpp */,\n\t\t\t\tFA0B7C701A95902C000E1D17 /* wrap_Shape.h */,\n\t\t\t\tFA0B7C711A95902C000E1D17 /* wrap_WeldJoint.cpp */,\n\t\t\t\tFA0B7C721A95902C000E1D17 /* wrap_WeldJoint.h */,\n\t\t\t\tFA0B7C731A95902C000E1D17 /* wrap_WheelJoint.cpp */,\n\t\t\t\tFA0B7C741A95902C000E1D17 /* wrap_WheelJoint.h */,\n\t\t\t\tFA0B7C751A95902C000E1D17 /* wrap_World.cpp */,\n\t\t\t\tFA0B7C761A95902C000E1D17 /* wrap_World.h */,\n\t\t\t);\n\t\t\tpath = box2d;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7C7B1A95902C000E1D17 /* sound */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7C801A95902C000E1D17 /* Decoder.cpp */,\n\t\t\t\tFA0B7C7C1A95902C000E1D17 /* Decoder.h */,\n\t\t\t\tFA0B7C7D1A95902C000E1D17 /* lullaby */,\n\t\t\t\tFA0B7C901A95902C000E1D17 /* Sound.cpp */,\n\t\t\t\tFA0B7C911A95902C000E1D17 /* Sound.h */,\n\t\t\t\tFA0B7C921A95902C000E1D17 /* SoundData.cpp */,\n\t\t\t\tFA0B7C931A95902C000E1D17 /* SoundData.h */,\n\t\t\t\tFA0B7C941A95902C000E1D17 /* wrap_Decoder.cpp */,\n\t\t\t\tFA0B7C951A95902C000E1D17 /* wrap_Decoder.h */,\n\t\t\t\tFA0B7C961A95902C000E1D17 /* wrap_Sound.cpp */,\n\t\t\t\tFA0B7C971A95902C000E1D17 /* wrap_Sound.h */,\n\t\t\t\tFA0B7C981A95902C000E1D17 /* wrap_SoundData.cpp */,\n\t\t\t\tFA0B7C991A95902C000E1D17 /* wrap_SoundData.h */,\n\t\t\t\tFAC734C11B2E021A00AB460A /* wrap_SoundData.lua */,\n\t\t\t);\n\t\t\tpath = sound;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7C7D1A95902C000E1D17 /* lullaby */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7C7E1A95902C000E1D17 /* CoreAudioDecoder.cpp */,\n\t\t\t\tFA0B7C7F1A95902C000E1D17 /* CoreAudioDecoder.h */,\n\t\t\t\tFA0B7C821A95902C000E1D17 /* FLACDecoder.cpp */,\n\t\t\t\tFA0B7C831A95902C000E1D17 /* FLACDecoder.h */,\n\t\t\t\tFA0B7C861A95902C000E1D17 /* ModPlugDecoder.cpp */,\n\t\t\t\tFA0B7C871A95902C000E1D17 /* ModPlugDecoder.h */,\n\t\t\t\tFA522D4B23F9FE370059EE3C /* MP3Decoder.cpp */,\n\t\t\t\tFA522D4C23F9FE380059EE3C /* MP3Decoder.h */,\n\t\t\t\tFA0B7C8A1A95902C000E1D17 /* Sound.cpp */,\n\t\t\t\tFA0B7C8B1A95902C000E1D17 /* Sound.h */,\n\t\t\t\tFA0B7C8C1A95902C000E1D17 /* VorbisDecoder.cpp */,\n\t\t\t\tFA0B7C8D1A95902C000E1D17 /* VorbisDecoder.h */,\n\t\t\t\tFA0B7C8E1A95902C000E1D17 /* WaveDecoder.cpp */,\n\t\t\t\tFA0B7C8F1A95902C000E1D17 /* WaveDecoder.h */,\n\t\t\t);\n\t\t\tpath = lullaby;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7C9A1A95902C000E1D17 /* system */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7C9B1A95902C000E1D17 /* sdl */,\n\t\t\t\tFA0B7C9E1A95902C000E1D17 /* System.cpp */,\n\t\t\t\tFA0B7C9F1A95902C000E1D17 /* System.h */,\n\t\t\t\tFA0B7CA01A95902C000E1D17 /* wrap_System.cpp */,\n\t\t\t\tFA0B7CA11A95902C000E1D17 /* wrap_System.h */,\n\t\t\t);\n\t\t\tpath = system;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7C9B1A95902C000E1D17 /* sdl */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7C9C1A95902C000E1D17 /* System.cpp */,\n\t\t\t\tFA0B7C9D1A95902C000E1D17 /* System.h */,\n\t\t\t);\n\t\t\tpath = sdl;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7CA21A95902C000E1D17 /* thread */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7CA31A95902C000E1D17 /* Channel.cpp */,\n\t\t\t\tFA0B7CA41A95902C000E1D17 /* Channel.h */,\n\t\t\t\tFA0B7CA51A95902C000E1D17 /* LuaThread.cpp */,\n\t\t\t\tFA0B7CA61A95902C000E1D17 /* LuaThread.h */,\n\t\t\t\tFA0B7CA71A95902C000E1D17 /* sdl */,\n\t\t\t\tFA0B7CAC1A95902C000E1D17 /* Thread.h */,\n\t\t\t\tFA0B7CAD1A95902C000E1D17 /* ThreadModule.cpp */,\n\t\t\t\tFA0B7CAE1A95902C000E1D17 /* ThreadModule.h */,\n\t\t\t\tFA0B7CAF1A95902C000E1D17 /* threads.cpp */,\n\t\t\t\tFA0B7CB01A95902C000E1D17 /* threads.h */,\n\t\t\t\tFA0B7CB11A95902C000E1D17 /* wrap_Channel.cpp */,\n\t\t\t\tFA0B7CB21A95902C000E1D17 /* wrap_Channel.h */,\n\t\t\t\tFA0B7CB31A95902C000E1D17 /* wrap_LuaThread.cpp */,\n\t\t\t\tFA0B7CB41A95902C000E1D17 /* wrap_LuaThread.h */,\n\t\t\t\tFA0B7CB51A95902C000E1D17 /* wrap_ThreadModule.cpp */,\n\t\t\t\tFA0B7CB61A95902C000E1D17 /* wrap_ThreadModule.h */,\n\t\t\t);\n\t\t\tpath = thread;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7CA71A95902C000E1D17 /* sdl */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7CA81A95902C000E1D17 /* Thread.cpp */,\n\t\t\t\tFA0B7CA91A95902C000E1D17 /* Thread.h */,\n\t\t\t\tFA0B7CAA1A95902C000E1D17 /* threads.cpp */,\n\t\t\t\tFA0B7CAB1A95902C000E1D17 /* threads.h */,\n\t\t\t);\n\t\t\tpath = sdl;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7CB71A95902C000E1D17 /* timer */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA4B66C81ABBCF1900558F15 /* Timer.cpp */,\n\t\t\t\tFA0B7CBB1A95902C000E1D17 /* Timer.h */,\n\t\t\t\tFA0B7CBC1A95902C000E1D17 /* wrap_Timer.cpp */,\n\t\t\t\tFA0B7CBD1A95902C000E1D17 /* wrap_Timer.h */,\n\t\t\t);\n\t\t\tpath = timer;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7CBE1A95902C000E1D17 /* touch */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7CBF1A95902C000E1D17 /* sdl */,\n\t\t\t\tFA0B7CC21A95902C000E1D17 /* Touch.h */,\n\t\t\t\tD93660F72D1C727C00C0EC4B /* Touch.cpp */,\n\t\t\t\tFA0B7CC41A95902C000E1D17 /* wrap_Touch.h */,\n\t\t\t\tFA0B7CC31A95902C000E1D17 /* wrap_Touch.cpp */,\n\t\t\t);\n\t\t\tpath = touch;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7CBF1A95902C000E1D17 /* sdl */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7CC01A95902C000E1D17 /* Touch.cpp */,\n\t\t\t\tFA0B7CC11A95902C000E1D17 /* Touch.h */,\n\t\t\t);\n\t\t\tpath = sdl;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7CC51A95902C000E1D17 /* window */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7CC61A95902C000E1D17 /* sdl */,\n\t\t\t\tFA0B7CC91A95902C000E1D17 /* Window.cpp */,\n\t\t\t\tFA0B7CCA1A95902C000E1D17 /* Window.h */,\n\t\t\t\tFA0B7CCB1A95902C000E1D17 /* wrap_Window.cpp */,\n\t\t\t\tFA0B7CCC1A95902C000E1D17 /* wrap_Window.h */,\n\t\t\t);\n\t\t\tpath = window;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7CC61A95902C000E1D17 /* sdl */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B7CC71A95902C000E1D17 /* Window.cpp */,\n\t\t\t\tFA0B7CC81A95902C000E1D17 /* Window.h */,\n\t\t\t);\n\t\t\tpath = sdl;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7EEB1A959125000E1D17 /* macosx */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA577A7916C71A1700860150 /* Cocoa.framework */,\n\t\t\t\tFAA627CD18E7E1560080752D /* CoreServices.framework */,\n\t\t\t\tFAD43ECB1FF312D800831BB8 /* freetype.framework */,\n\t\t\t\tD9DAB9312963CD7500C64820 /* harfbuzz.framework */,\n\t\t\t\tFA577A8216C71A5300860150 /* libmodplug.framework */,\n\t\t\t\tFADF4CC52663D0EC004F95C1 /* libz.tbd */,\n\t\t\t\tFA577A6D16C719EA00860150 /* Lua.framework */,\n\t\t\t\tFA577A7116C719F400860150 /* ogg.framework */,\n\t\t\t\tFAAFF04316CB11C700CCDE45 /* OpenAL-Soft.framework */,\n\t\t\t\tFA577A7C16C71A2600860150 /* OpenGL.framework */,\n\t\t\t\tFA9B4A0716E1578300074F42 /* SDL2.framework */,\n\t\t\t\tFA27B3C81B498623008A9DCE /* theora.framework */,\n\t\t\t\tFA577A7716C71A0800860150 /* vorbis.framework */,\n\t\t\t);\n\t\t\tname = macosx;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA1557BE1CE90A2C00AFF582 /* tinyexr */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA1557BF1CE90A2C00AFF582 /* tinyexr.h */,\n\t\t\t);\n\t\t\tpath = tinyexr;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA18CECC23DBC6E000263725 /* metal */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA18CEEB23DBC8EB00263725 /* Buffer.h */,\n\t\t\t\tFA18CEE823DBC8D400263725 /* Buffer.mm */,\n\t\t\t\tFA18CED523DBC6E000263725 /* Graphics.h */,\n\t\t\t\tFA18CED323DBC6E000263725 /* Graphics.mm */,\n\t\t\t\tFA6BDF8B280B62B600240F2A /* GraphicsReadback.h */,\n\t\t\t\tFA6BDF88280B62A000240F2A /* GraphicsReadback.mm */,\n\t\t\t\tFA18CED423DBC6E000263725 /* Metal.h */,\n\t\t\t\tFA18CED023DBC6E000263725 /* Metal.mm */,\n\t\t\t\tFA18CECD23DBC6E000263725 /* Shader.h */,\n\t\t\t\tFA18CED123DBC6E000263725 /* Shader.mm */,\n\t\t\t\tFA18CF4323DD1A8000263725 /* ShaderStage.h */,\n\t\t\t\tFA18CF4423DD1A8000263725 /* ShaderStage.mm */,\n\t\t\t\tFA18CED223DBC6E000263725 /* StreamBuffer.h */,\n\t\t\t\tFA18CECE23DBC6E000263725 /* StreamBuffer.mm */,\n\t\t\t\tFA18CEEC23DC9B3E00263725 /* Texture.h */,\n\t\t\t\tFA18CEED23DC9B3E00263725 /* Texture.mm */,\n\t\t\t);\n\t\t\tpath = metal;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA18CEF123DCF67800263725 /* spirv_cross */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA18CF1123DCF67800263725 /* GLSL.std.450.h */,\n\t\t\t\tFA18CEF523DCF67800263725 /* include */,\n\t\t\t\tFA18CEFF23DCF67800263725 /* spirv_cfg.cpp */,\n\t\t\t\tFA18CF0823DCF67800263725 /* spirv_cfg.hpp */,\n\t\t\t\tFA18CF1423DCF67800263725 /* spirv_common.hpp */,\n\t\t\t\tFA18CF0923DCF67800263725 /* spirv_cpp.cpp */,\n\t\t\t\tFA18CF0023DCF67800263725 /* spirv_cpp.hpp */,\n\t\t\t\tFA18CF1223DCF67800263725 /* spirv_cross_containers.hpp */,\n\t\t\t\tFA18CEF423DCF67800263725 /* spirv_cross_error_handling.hpp */,\n\t\t\t\tFA18CF0A23DCF67800263725 /* spirv_cross_parsed_ir.cpp */,\n\t\t\t\tFA18CF0123DCF67800263725 /* spirv_cross_parsed_ir.hpp */,\n\t\t\t\tFA18CF0423DCF67800263725 /* spirv_cross_util.cpp */,\n\t\t\t\tFA18CF0F23DCF67800263725 /* spirv_cross_util.hpp */,\n\t\t\t\tFA18CF0523DCF67800263725 /* spirv_cross.cpp */,\n\t\t\t\tFA18CF1023DCF67800263725 /* spirv_cross.hpp */,\n\t\t\t\tFA18CEF323DCF67800263725 /* spirv_glsl.cpp */,\n\t\t\t\tFA18CF1523DCF67800263725 /* spirv_glsl.hpp */,\n\t\t\t\tFA18CF0723DCF67800263725 /* spirv_hlsl.cpp */,\n\t\t\t\tFA18CEFD23DCF67800263725 /* spirv_hlsl.hpp */,\n\t\t\t\tFA18CF0323DCF67800263725 /* spirv_msl.cpp */,\n\t\t\t\tFA18CF0D23DCF67800263725 /* spirv_msl.hpp */,\n\t\t\t\tFA18CF1323DCF67800263725 /* spirv_parser.cpp */,\n\t\t\t\tFA18CEF223DCF67800263725 /* spirv_parser.hpp */,\n\t\t\t\tFA18CF0223DCF67800263725 /* spirv_reflect.cpp */,\n\t\t\t\tFA18CF0E23DCF67800263725 /* spirv_reflect.hpp */,\n\t\t\t\tFA18CEFE23DCF67800263725 /* spirv.hpp */,\n\t\t\t);\n\t\t\tpath = spirv_cross;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA18CEF523DCF67800263725 /* include */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA18CEF623DCF67800263725 /* spirv_cross */,\n\t\t\t);\n\t\t\tpath = include;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA18CEF623DCF67800263725 /* spirv_cross */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA18CEF723DCF67800263725 /* barrier.hpp */,\n\t\t\t\tFA18CEFB23DCF67800263725 /* external_interface.h */,\n\t\t\t\tFA18CEFC23DCF67800263725 /* image.hpp */,\n\t\t\t\tFA18CEF923DCF67800263725 /* internal_interface.hpp */,\n\t\t\t\tFA18CEFA23DCF67800263725 /* sampler.hpp */,\n\t\t\t\tFA18CEF823DCF67800263725 /* thread_group.hpp */,\n\t\t\t);\n\t\t\tpath = spirv_cross;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA27B3881B498151008A9DCE /* video */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA27B3891B498151008A9DCE /* theora */,\n\t\t\t\tFA27B3931B498151008A9DCE /* Video.h */,\n\t\t\t\tFA27B3941B498151008A9DCE /* VideoStream.cpp */,\n\t\t\t\tFA27B3951B498151008A9DCE /* VideoStream.h */,\n\t\t\t\tFA27B39B1B498151008A9DCE /* wrap_Video.cpp */,\n\t\t\t\tFA27B39C1B498151008A9DCE /* wrap_Video.h */,\n\t\t\t\tFA27B3B91B4985BF008A9DCE /* wrap_VideoStream.cpp */,\n\t\t\t\tFA27B3BA1B4985BF008A9DCE /* wrap_VideoStream.h */,\n\t\t\t);\n\t\t\tpath = video;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA27B3891B498151008A9DCE /* theora */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFAA54AC91F91660400A8FA7B /* OggDemuxer.cpp */,\n\t\t\t\tFAA54AC61F91660400A8FA7B /* OggDemuxer.h */,\n\t\t\t\tFAA54AC81F91660400A8FA7B /* TheoraVideoStream.cpp */,\n\t\t\t\tFAA54AC71F91660400A8FA7B /* TheoraVideoStream.h */,\n\t\t\t\tFA27B38A1B498151008A9DCE /* Video.cpp */,\n\t\t\t\tFA27B38B1B498151008A9DCE /* Video.h */,\n\t\t\t);\n\t\t\tpath = theora;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA4F2B761DE0125B00CA37D7 /* xxHash */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA4F2B771DE0125B00CA37D7 /* xxhash.c */,\n\t\t\t\tFA4F2B781DE0125B00CA37D7 /* xxhash.h */,\n\t\t\t);\n\t\t\tpath = xxHash;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA522D5023F9FF2A0059EE3C /* dr */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA522D5123F9FF2A0059EE3C /* dr_mp3.h */,\n\t\t\t\tFA522D5223F9FF2A0059EE3C /* dr_flac.h */,\n\t\t\t);\n\t\t\tpath = dr;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA577A6616C7199700860150 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD9596F602CBAC93800BE58C1 /* SDL3.xcframework */,\n\t\t\t\tFA18CEE623DBC6F700263725 /* Metal.framework */,\n\t\t\t\tFA0B7EEB1A959125000E1D17 /* macosx */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA5D24A11A96D24500C6FC8F /* Libraries */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA5D24A31A96D2C300C6FC8F /* ios */,\n\t\t\t);\n\t\t\tname = Libraries;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA5D24A31A96D2C300C6FC8F /* ios */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD923E7D2296B85B9002FF1B3 /* harfbuzz.xcframework */,\n\t\t\t\tFACFB750276D7E2B0089F78D /* freetype.xcframework */,\n\t\t\t\tFACFB752276D7F6F0089F78D /* Lua.xcframework */,\n\t\t\t\tFA84DE79277D4C88002674C6 /* modplug.xcframework */,\n\t\t\t\tFA84DE7B277E045E002674C6 /* ogg.xcframework */,\n\t\t\t\tFA84DE75277CB3D4002674C6 /* SDL2.xcframework */,\n\t\t\t\tFA7E9206277E120900C24CB2 /* theora.xcframework */,\n\t\t\t\tFA84DE7D277E0A43002674C6 /* vorbis.xcframework */,\n\t\t\t);\n\t\t\tname = ios;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA94724527A6EE1B00817677 /* luahttps */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA94724D27A6EE1B00817677 /* src */,\n\t\t\t);\n\t\t\tpath = luahttps;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA94724D27A6EE1B00817677 /* src */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA94729827A6F9AC00817677 /* apple */,\n\t\t\t\tFA94725327A6EE1B00817677 /* common */,\n\t\t\t\tD9F0C2D32C680A5500BB2D25 /* generic */,\n\t\t\t\tFA94725127A6EE1B00817677 /* lua */,\n\t\t\t);\n\t\t\tpath = src;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA94725127A6EE1B00817677 /* lua */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA94725227A6EE1B00817677 /* main.cpp */,\n\t\t\t);\n\t\t\tpath = lua;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA94725327A6EE1B00817677 /* common */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA94725827A6EE1B00817677 /* config.h */,\n\t\t\t\tFA94725427A6EE1B00817677 /* Connection.h */,\n\t\t\t\tFA94725C27A6EE1B00817677 /* ConnectionClient.h */,\n\t\t\t\tFA94725F27A6EE1B00817677 /* HTTPRequest.cpp */,\n\t\t\t\tFA94725B27A6EE1B00817677 /* HTTPRequest.h */,\n\t\t\t\tFA94725A27A6EE1B00817677 /* HTTPS.cpp */,\n\t\t\t\tFA94725E27A6EE1B00817677 /* HTTPS.h */,\n\t\t\t\tFA94725527A6EE1B00817677 /* HTTPSClient.cpp */,\n\t\t\t\tFA94725627A6EE1B00817677 /* HTTPSClient.h */,\n\t\t\t\tD9F0C2CB2C68091200BB2D25 /* LibraryLoader.h */,\n\t\t\t\tFA94725D27A6EE1B00817677 /* PlaintextConnection.cpp */,\n\t\t\t\tFA94725727A6EE1B00817677 /* PlaintextConnection.h */,\n\t\t\t);\n\t\t\tpath = common;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA94729827A6F9AC00817677 /* apple */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA94729A27A6F9AC00817677 /* NSURLClient.h */,\n\t\t\t\tFA94729927A6F9AC00817677 /* NSURLClient.mm */,\n\t\t\t);\n\t\t\tpath = apple;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFAAA3FD21F64B3AD00F89E99 /* lua53 */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFAAA3FD31F64B3AD00F89E99 /* lprefix.h */,\n\t\t\t\tFAAA3FD41F64B3AD00F89E99 /* lstrlib.c */,\n\t\t\t\tFAAA3FD51F64B3AD00F89E99 /* lstrlib.h */,\n\t\t\t\tFAAA3FD61F64B3AD00F89E99 /* lutf8lib.c */,\n\t\t\t\tFAAA3FD71F64B3AD00F89E99 /* lutf8lib.h */,\n\t\t\t);\n\t\t\tpath = lua53;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFAB17BE31ABFAA9000F9BA27 /* lz4 */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFAB17BE41ABFAA9000F9BA27 /* lz4.c */,\n\t\t\t\tFAB17BE51ABFAA9000F9BA27 /* lz4.h */,\n\t\t\t\tFAB17BF31ABFC4B100F9BA27 /* lz4hc.c */,\n\t\t\t\tFAB17BF41ABFC4B100F9BA27 /* lz4hc.h */,\n\t\t\t\tFAC7CD951FE755B3006A60C7 /* lz4opt.h */,\n\t\t\t);\n\t\t\tpath = lz4;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFABDA9102552448200B5C523 /* box2d */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFABDA9622552448200B5C523 /* b2_api.h */,\n\t\t\t\tFABDA9132552448200B5C523 /* b2_block_allocator.h */,\n\t\t\t\tFABDA9492552448200B5C523 /* b2_body.h */,\n\t\t\t\tFABDA9412552448200B5C523 /* b2_broad_phase.h */,\n\t\t\t\tFABDA9632552448200B5C523 /* b2_chain_shape.h */,\n\t\t\t\tFABDA94D2552448200B5C523 /* b2_circle_shape.h */,\n\t\t\t\tFABDA9602552448200B5C523 /* b2_collision.h */,\n\t\t\t\tFABDA93A2552448200B5C523 /* b2_common.h */,\n\t\t\t\tFABDA9742552448200B5C523 /* b2_contact_manager.h */,\n\t\t\t\tFABDA9592552448200B5C523 /* b2_contact.h */,\n\t\t\t\tFABDA9482552448200B5C523 /* b2_distance_joint.h */,\n\t\t\t\tFABDA94A2552448200B5C523 /* b2_distance.h */,\n\t\t\t\tFABDA95F2552448200B5C523 /* b2_draw.h */,\n\t\t\t\tFABDA93C2552448200B5C523 /* b2_dynamic_tree.h */,\n\t\t\t\tFABDA9752552448200B5C523 /* b2_edge_shape.h */,\n\t\t\t\tFABDA93D2552448200B5C523 /* b2_fixture.h */,\n\t\t\t\tFABDA9582552448200B5C523 /* b2_friction_joint.h */,\n\t\t\t\tFABDA9642552448200B5C523 /* b2_gear_joint.h */,\n\t\t\t\tFABDA95E2552448200B5C523 /* b2_growable_stack.h */,\n\t\t\t\tFABDA9112552448200B5C523 /* b2_joint.h */,\n\t\t\t\tFABDA94E2552448200B5C523 /* b2_math.h */,\n\t\t\t\tFABDA9392552448200B5C523 /* b2_motor_joint.h */,\n\t\t\t\tFABDA9502552448200B5C523 /* b2_mouse_joint.h */,\n\t\t\t\tFABDA95C2552448200B5C523 /* b2_polygon_shape.h */,\n\t\t\t\tFABDA95A2552448200B5C523 /* b2_prismatic_joint.h */,\n\t\t\t\tFABDA94C2552448200B5C523 /* b2_pulley_joint.h */,\n\t\t\t\tFABDA9452552448200B5C523 /* b2_revolute_joint.h */,\n\t\t\t\tFABDA9472552448200B5C523 /* b2_rope.h */,\n\t\t\t\tFABDA9442552448200B5C523 /* b2_settings.h */,\n\t\t\t\tFABDA9122552448200B5C523 /* b2_shape.h */,\n\t\t\t\tFABDA93E2552448200B5C523 /* b2_stack_allocator.h */,\n\t\t\t\tFABDA94F2552448200B5C523 /* b2_time_of_impact.h */,\n\t\t\t\tFABDA94B2552448200B5C523 /* b2_time_step.h */,\n\t\t\t\tFABDA9652552448200B5C523 /* b2_timer.h */,\n\t\t\t\tFABDA9402552448200B5C523 /* b2_types.h */,\n\t\t\t\tFABDA93B2552448200B5C523 /* b2_weld_joint.h */,\n\t\t\t\tFABDA95D2552448200B5C523 /* b2_wheel_joint.h */,\n\t\t\t\tFABDA9662552448200B5C523 /* b2_world_callbacks.h */,\n\t\t\t\tFABDA95B2552448200B5C523 /* b2_world.h */,\n\t\t\t\tFABDA93F2552448200B5C523 /* Box2D.h */,\n\t\t\t\tFABDA9672552448200B5C523 /* collision */,\n\t\t\t\tFABDA9512552448200B5C523 /* common */,\n\t\t\t\tFABDA9142552448200B5C523 /* dynamics */,\n\t\t\t\tFABDA9462552448200B5C523 /* README.MODIFIED */,\n\t\t\t\tFABDA9422552448200B5C523 /* rope */,\n\t\t\t);\n\t\t\tpath = box2d;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFABDA9142552448200B5C523 /* dynamics */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFABDA91E2552448200B5C523 /* b2_body.cpp */,\n\t\t\t\tFABDA9172552448200B5C523 /* b2_chain_circle_contact.cpp */,\n\t\t\t\tFABDA9182552448200B5C523 /* b2_chain_circle_contact.h */,\n\t\t\t\tFABDA91C2552448200B5C523 /* b2_chain_polygon_contact.cpp */,\n\t\t\t\tFABDA9162552448200B5C523 /* b2_chain_polygon_contact.h */,\n\t\t\t\tFABDA9352552448200B5C523 /* b2_circle_contact.cpp */,\n\t\t\t\tFABDA91A2552448200B5C523 /* b2_circle_contact.h */,\n\t\t\t\tFABDA9282552448200B5C523 /* b2_contact_manager.cpp */,\n\t\t\t\tFABDA9222552448200B5C523 /* b2_contact_solver.cpp */,\n\t\t\t\tFABDA9212552448200B5C523 /* b2_contact_solver.h */,\n\t\t\t\tFABDA91F2552448200B5C523 /* b2_contact.cpp */,\n\t\t\t\tFABDA9272552448200B5C523 /* b2_distance_joint.cpp */,\n\t\t\t\tFABDA92B2552448200B5C523 /* b2_edge_circle_contact.cpp */,\n\t\t\t\tFABDA91D2552448200B5C523 /* b2_edge_circle_contact.h */,\n\t\t\t\tFABDA92A2552448200B5C523 /* b2_edge_polygon_contact.cpp */,\n\t\t\t\tFABDA9262552448200B5C523 /* b2_edge_polygon_contact.h */,\n\t\t\t\tFABDA9372552448200B5C523 /* b2_fixture.cpp */,\n\t\t\t\tFABDA92D2552448200B5C523 /* b2_friction_joint.cpp */,\n\t\t\t\tFABDA92C2552448200B5C523 /* b2_gear_joint.cpp */,\n\t\t\t\tFABDA9332552448200B5C523 /* b2_island.cpp */,\n\t\t\t\tFABDA9382552448200B5C523 /* b2_island.h */,\n\t\t\t\tFABDA9152552448200B5C523 /* b2_joint.cpp */,\n\t\t\t\tFABDA9302552448200B5C523 /* b2_motor_joint.cpp */,\n\t\t\t\tFABDA9342552448200B5C523 /* b2_mouse_joint.cpp */,\n\t\t\t\tFABDA9252552448200B5C523 /* b2_polygon_circle_contact.cpp */,\n\t\t\t\tFABDA9192552448200B5C523 /* b2_polygon_circle_contact.h */,\n\t\t\t\tFABDA9292552448200B5C523 /* b2_polygon_contact.cpp */,\n\t\t\t\tFABDA92F2552448200B5C523 /* b2_polygon_contact.h */,\n\t\t\t\tFABDA9362552448200B5C523 /* b2_prismatic_joint.cpp */,\n\t\t\t\tFABDA9242552448200B5C523 /* b2_pulley_joint.cpp */,\n\t\t\t\tFABDA9202552448200B5C523 /* b2_revolute_joint.cpp */,\n\t\t\t\tFABDA91B2552448200B5C523 /* b2_weld_joint.cpp */,\n\t\t\t\tFABDA92E2552448200B5C523 /* b2_wheel_joint.cpp */,\n\t\t\t\tFABDA9232552448200B5C523 /* b2_world_callbacks.cpp */,\n\t\t\t\tFABDA9322552448200B5C523 /* b2_world.cpp */,\n\t\t\t);\n\t\t\tpath = dynamics;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFABDA9422552448200B5C523 /* rope */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFABDA9432552448200B5C523 /* b2_rope.cpp */,\n\t\t\t);\n\t\t\tpath = rope;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFABDA9512552448200B5C523 /* common */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFABDA9542552448200B5C523 /* b2_block_allocator.cpp */,\n\t\t\t\tFABDA9522552448200B5C523 /* b2_draw.cpp */,\n\t\t\t\tFABDA9572552448200B5C523 /* b2_math.cpp */,\n\t\t\t\tFABDA9562552448200B5C523 /* b2_settings.cpp */,\n\t\t\t\tFABDA9552552448200B5C523 /* b2_stack_allocator.cpp */,\n\t\t\t\tFABDA9532552448200B5C523 /* b2_timer.cpp */,\n\t\t\t);\n\t\t\tpath = common;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFABDA9672552448200B5C523 /* collision */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFABDA96D2552448200B5C523 /* b2_broad_phase.cpp */,\n\t\t\t\tFABDA96C2552448200B5C523 /* b2_chain_shape.cpp */,\n\t\t\t\tFABDA9692552448200B5C523 /* b2_circle_shape.cpp */,\n\t\t\t\tFABDA9682552448200B5C523 /* b2_collide_circle.cpp */,\n\t\t\t\tFABDA96B2552448200B5C523 /* b2_collide_edge.cpp */,\n\t\t\t\tFABDA9702552448200B5C523 /* b2_collide_polygon.cpp */,\n\t\t\t\tFABDA96A2552448200B5C523 /* b2_collision.cpp */,\n\t\t\t\tFABDA9732552448200B5C523 /* b2_distance.cpp */,\n\t\t\t\tFABDA96E2552448200B5C523 /* b2_dynamic_tree.cpp */,\n\t\t\t\tFABDA9712552448200B5C523 /* b2_edge_shape.cpp */,\n\t\t\t\tFABDA96F2552448200B5C523 /* b2_polygon_shape.cpp */,\n\t\t\t\tFABDA9722552448200B5C523 /* b2_time_of_impact.cpp */,\n\t\t\t);\n\t\t\tpath = collision;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFAC7CD591FE35E95006A60C7 /* physfs */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFAC7CD5D1FE35E95006A60C7 /* physfs_archiver_7z.c */,\n\t\t\t\tFAC7CD6C1FE35E95006A60C7 /* physfs_archiver_dir.c */,\n\t\t\t\tFAC7CD741FE35E95006A60C7 /* physfs_archiver_grp.c */,\n\t\t\t\tFAC7CD751FE35E95006A60C7 /* physfs_archiver_hog.c */,\n\t\t\t\tFAC7CD6E1FE35E95006A60C7 /* physfs_archiver_iso9660.c */,\n\t\t\t\tFAC7CD611FE35E95006A60C7 /* physfs_archiver_mvl.c */,\n\t\t\t\tFAC7CD6F1FE35E95006A60C7 /* physfs_archiver_qpak.c */,\n\t\t\t\tFAC7CD5F1FE35E95006A60C7 /* physfs_archiver_slb.c */,\n\t\t\t\tFAC7CD671FE35E95006A60C7 /* physfs_archiver_unpacked.c */,\n\t\t\t\tFAC7CD6A1FE35E95006A60C7 /* physfs_archiver_vdf.c */,\n\t\t\t\tFAC7CD621FE35E95006A60C7 /* physfs_archiver_wad.c */,\n\t\t\t\tFAC7CD761FE35E95006A60C7 /* physfs_archiver_zip.c */,\n\t\t\t\tFAC7CD6D1FE35E95006A60C7 /* physfs_byteorder.c */,\n\t\t\t\tFAC7CD631FE35E95006A60C7 /* physfs_casefolding.h */,\n\t\t\t\tFAC7CD5A1FE35E95006A60C7 /* physfs_internal.h */,\n\t\t\t\tFAC7CD711FE35E95006A60C7 /* physfs_lzmasdk.h */,\n\t\t\t\tFAC7CD731FE35E95006A60C7 /* physfs_miniz.h */,\n\t\t\t\tFAC7CD6B1FE35E95006A60C7 /* physfs_platform_apple.m */,\n\t\t\t\tFAC7CD651FE35E95006A60C7 /* physfs_platform_haiku.cpp */,\n\t\t\t\tFAC7CD641FE35E95006A60C7 /* physfs_platform_os2.c */,\n\t\t\t\tFAC7CD721FE35E95006A60C7 /* physfs_platform_posix.c */,\n\t\t\t\tFAC7CD5B1FE35E95006A60C7 /* physfs_platform_qnx.c */,\n\t\t\t\tFAC7CD5E1FE35E95006A60C7 /* physfs_platform_unix.c */,\n\t\t\t\tFAC7CD661FE35E95006A60C7 /* physfs_platform_windows.c */,\n\t\t\t\tFAC7CD601FE35E95006A60C7 /* physfs_platform_winrt.cpp */,\n\t\t\t\tFAC7CD701FE35E95006A60C7 /* physfs_platforms.h */,\n\t\t\t\tFAC7CD681FE35E95006A60C7 /* physfs_unicode.c */,\n\t\t\t\tFAC7CD5C1FE35E95006A60C7 /* physfs.c */,\n\t\t\t\tFAC7CD691FE35E95006A60C7 /* physfs.h */,\n\t\t\t);\n\t\t\tpath = physfs;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFACA02DF1F5E396B0084B28F /* data */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA6A2B721F60B6710074C308 /* ByteData.cpp */,\n\t\t\t\tFA6A2B731F60B6710074C308 /* ByteData.h */,\n\t\t\t\tFACA02E01F5E396B0084B28F /* CompressedData.cpp */,\n\t\t\t\tFACA02E11F5E396B0084B28F /* CompressedData.h */,\n\t\t\t\tFACA02E21F5E396B0084B28F /* Compressor.cpp */,\n\t\t\t\tFACA02E31F5E396B0084B28F /* Compressor.h */,\n\t\t\t\tFACA02E41F5E396B0084B28F /* DataModule.cpp */,\n\t\t\t\tFACA02E51F5E396B0084B28F /* DataModule.h */,\n\t\t\t\tFA6BDF8C281219E900240F2A /* DataStream.cpp */,\n\t\t\t\tFA6BDF8D281219E900240F2A /* DataStream.h */,\n\t\t\t\tFA6A2B681F5F7F560074C308 /* DataView.cpp */,\n\t\t\t\tFA6A2B691F5F7F560074C308 /* DataView.h */,\n\t\t\t\tFACA02E61F5E396B0084B28F /* HashFunction.cpp */,\n\t\t\t\tFACA02E71F5E396B0084B28F /* HashFunction.h */,\n\t\t\t\tFA6A2B781F60B8250074C308 /* wrap_ByteData.cpp */,\n\t\t\t\tFA6A2B771F60B8250074C308 /* wrap_ByteData.h */,\n\t\t\t\tFACA02E81F5E396B0084B28F /* wrap_CompressedData.cpp */,\n\t\t\t\tFACA02E91F5E396B0084B28F /* wrap_CompressedData.h */,\n\t\t\t\tFA6A2B651F5F7B6B0074C308 /* wrap_Data.cpp */,\n\t\t\t\tFA6A2B641F5F7B6B0074C308 /* wrap_Data.h */,\n\t\t\t\tFA34AF6A22E2977700F77015 /* wrap_Data.lua */,\n\t\t\t\tFACA02EA1F5E396B0084B28F /* wrap_DataModule.cpp */,\n\t\t\t\tFACA02EB1F5E396B0084B28F /* wrap_DataModule.h */,\n\t\t\t\tFA6A2B6E1F5F845F0074C308 /* wrap_DataView.cpp */,\n\t\t\t\tFA6A2B6D1F5F845F0074C308 /* wrap_DataView.h */,\n\t\t\t);\n\t\t\tpath = data;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFACA06A4293EE5CD001A2557 /* sensor */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFACA06A7293EE5CD001A2557 /* sdl */,\n\t\t\t\tFACA06AA293EE5CD001A2557 /* Sensor.cpp */,\n\t\t\t\tFACA06A6293EE5CD001A2557 /* Sensor.h */,\n\t\t\t\tFACA06A5293EE5CD001A2557 /* wrap_Sensor.cpp */,\n\t\t\t\tFACA06AB293EE5CD001A2557 /* wrap_Sensor.h */,\n\t\t\t);\n\t\t\tpath = sensor;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFACA06A7293EE5CD001A2557 /* sdl */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFACA06A9293EE5CD001A2557 /* Sensor.cpp */,\n\t\t\t\tFACA06A8293EE5CD001A2557 /* Sensor.h */,\n\t\t\t);\n\t\t\tpath = sdl;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFAF13FBF1E20934C00F898D2 /* glslang */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFAF13FC01E20934C00F898D2 /* glslang */,\n\t\t\t\tFAF6C9C023C2DE2900D7B5BC /* SPIRV */,\n\t\t\t);\n\t\t\tpath = glslang;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFAF13FC01E20934C00F898D2 /* glslang */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD9DB6E442B4B80E80037A1F6 /* build_info.h */,\n\t\t\t\tFAF13FC11E20934C00F898D2 /* GenericCodeGen */,\n\t\t\t\tFAF13FC41E20934C00F898D2 /* Include */,\n\t\t\t\tFAF13FD21E20934C00F898D2 /* MachineIndependent */,\n\t\t\t\tFAF140021E20934C00F898D2 /* OSDependent */,\n\t\t\t\tFAF140281E20934C00F898D2 /* Public */,\n\t\t\t\tD9DB6E312B4B41100037A1F6 /* ResourceLimits */,\n\t\t\t);\n\t\t\tpath = glslang;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFAF13FC11E20934C00F898D2 /* GenericCodeGen */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFAF13FC21E20934C00F898D2 /* CodeGen.cpp */,\n\t\t\t\tFAF13FC31E20934C00F898D2 /* Link.cpp */,\n\t\t\t);\n\t\t\tpath = GenericCodeGen;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFAF13FC41E20934C00F898D2 /* Include */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFAF13FC51E20934C00F898D2 /* arrays.h */,\n\t\t\t\tFAF13FC61E20934C00F898D2 /* BaseTypes.h */,\n\t\t\t\tFAF13FC71E20934C00F898D2 /* Common.h */,\n\t\t\t\tFAF13FC81E20934C00F898D2 /* ConstantUnion.h */,\n\t\t\t\tFAF13FC91E20934C00F898D2 /* InfoSink.h */,\n\t\t\t\tFAF13FCA1E20934C00F898D2 /* InitializeGlobals.h */,\n\t\t\t\tFAF13FCB1E20934C00F898D2 /* intermediate.h */,\n\t\t\t\tFAF13FCC1E20934C00F898D2 /* PoolAlloc.h */,\n\t\t\t\tFAF13FCD1E20934C00F898D2 /* ResourceLimits.h */,\n\t\t\t\tFAF13FD01E20934C00F898D2 /* ShHandle.h */,\n\t\t\t\tFA84DE5D2778D7DB002674C6 /* SpirvIntrinsics.h */,\n\t\t\t\tFAF13FD11E20934C00F898D2 /* Types.h */,\n\t\t\t\tD91C76142DE3D0A2001FC408 /* visibility.h */,\n\t\t\t);\n\t\t\tpath = Include;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFAF13FD21E20934C00F898D2 /* MachineIndependent */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA24348221D401CB00B8918A /* attribute.cpp */,\n\t\t\t\tFA24348121D401CB00B8918A /* attribute.h */,\n\t\t\t\tFAF13FD31E20934C00F898D2 /* Constant.cpp */,\n\t\t\t\tFAF13FD41E20934C00F898D2 /* gl_types.h */,\n\t\t\t\tFAF13FD61E20934C00F898D2 /* glslang_tab.cpp */,\n\t\t\t\tFAF13FD71E20934C00F898D2 /* glslang_tab.cpp.h */,\n\t\t\t\tFAF13FD81E20934C00F898D2 /* InfoSink.cpp */,\n\t\t\t\tFAF13FD91E20934C00F898D2 /* Initialize.cpp */,\n\t\t\t\tFAF13FDA1E20934C00F898D2 /* Initialize.h */,\n\t\t\t\tFAF13FDB1E20934C00F898D2 /* Intermediate.cpp */,\n\t\t\t\tFAF13FDC1E20934C00F898D2 /* intermOut.cpp */,\n\t\t\t\tFAF13FDD1E20934C00F898D2 /* IntermTraverse.cpp */,\n\t\t\t\tFAF13FDE1E20934C00F898D2 /* iomapper.cpp */,\n\t\t\t\tFAF13FDF1E20934C00F898D2 /* iomapper.h */,\n\t\t\t\tFAF13FE01E20934C00F898D2 /* limits.cpp */,\n\t\t\t\tFAF13FE11E20934C00F898D2 /* linkValidate.cpp */,\n\t\t\t\tFAF13FE21E20934C00F898D2 /* LiveTraverser.h */,\n\t\t\t\tFAF13FE31E20934C00F898D2 /* localintermediate.h */,\n\t\t\t\tFAF13FE41E20934C00F898D2 /* parseConst.cpp */,\n\t\t\t\tFAF13FE51E20934C00F898D2 /* ParseContextBase.cpp */,\n\t\t\t\tFAF13FE61E20934C00F898D2 /* ParseHelper.cpp */,\n\t\t\t\tFAF13FE71E20934C00F898D2 /* ParseHelper.h */,\n\t\t\t\tFAF13FE81E20934C00F898D2 /* parseVersions.h */,\n\t\t\t\tFA24348321D401CB00B8918A /* pch.h */,\n\t\t\t\tFAF13FE91E20934C00F898D2 /* PoolAlloc.cpp */,\n\t\t\t\tFAF13FEA1E20934C00F898D2 /* preprocessor */,\n\t\t\t\tFAF13FF41E20934C00F898D2 /* propagateNoContraction.cpp */,\n\t\t\t\tFAF13FF51E20934C00F898D2 /* propagateNoContraction.h */,\n\t\t\t\tFAF13FF61E20934C00F898D2 /* reflection.cpp */,\n\t\t\t\tFAF13FF71E20934C00F898D2 /* reflection.h */,\n\t\t\t\tFAF13FF81E20934C00F898D2 /* RemoveTree.cpp */,\n\t\t\t\tFAF13FF91E20934C00F898D2 /* RemoveTree.h */,\n\t\t\t\tFAF13FFA1E20934C00F898D2 /* Scan.cpp */,\n\t\t\t\tFAF13FFB1E20934C00F898D2 /* Scan.h */,\n\t\t\t\tFAF13FFC1E20934C00F898D2 /* ScanContext.h */,\n\t\t\t\tFAF13FFD1E20934C00F898D2 /* ShaderLang.cpp */,\n\t\t\t\tD9DB6E282B4B40970037A1F6 /* span.h */,\n\t\t\t\tFA84DE602778D7F3002674C6 /* SpirvIntrinsics.cpp */,\n\t\t\t\tFAF13FFE1E20934C00F898D2 /* SymbolTable.cpp */,\n\t\t\t\tFAF13FFF1E20934C00F898D2 /* SymbolTable.h */,\n\t\t\t\tFAF140001E20934C00F898D2 /* Versions.cpp */,\n\t\t\t\tFAF140011E20934C00F898D2 /* Versions.h */,\n\t\t\t);\n\t\t\tpath = MachineIndependent;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFAF13FEA1E20934C00F898D2 /* preprocessor */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFAF13FEB1E20934C00F898D2 /* Pp.cpp */,\n\t\t\t\tFAF13FEC1E20934C00F898D2 /* PpAtom.cpp */,\n\t\t\t\tFAF13FED1E20934C00F898D2 /* PpContext.cpp */,\n\t\t\t\tFAF13FEE1E20934C00F898D2 /* PpContext.h */,\n\t\t\t\tFAF13FF01E20934C00F898D2 /* PpScanner.cpp */,\n\t\t\t\tFAF13FF21E20934C00F898D2 /* PpTokens.cpp */,\n\t\t\t\tFAF13FF31E20934C00F898D2 /* PpTokens.h */,\n\t\t\t);\n\t\t\tpath = preprocessor;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFAF140021E20934C00F898D2 /* OSDependent */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFAF140031E20934C00F898D2 /* osinclude.h */,\n\t\t\t\tFAF140041E20934C00F898D2 /* Unix */,\n\t\t\t);\n\t\t\tpath = OSDependent;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFAF140041E20934C00F898D2 /* Unix */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFAF140211E20934C00F898D2 /* ossource.cpp */,\n\t\t\t);\n\t\t\tpath = Unix;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFAF140281E20934C00F898D2 /* Public */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD9DB6E252B4B40660037A1F6 /* ResourceLimits.h */,\n\t\t\t\tFAF140291E20934C00F898D2 /* ShaderLang.h */,\n\t\t\t);\n\t\t\tpath = Public;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFAF6C9C023C2DE2900D7B5BC /* SPIRV */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFAF6C9D023C2DE2900D7B5BC /* bitutils.h */,\n\t\t\t\tFAF6C9D123C2DE2900D7B5BC /* disassemble.h */,\n\t\t\t\tFAF6C9D923C2DE2900D7B5BC /* disassemble.cpp */,\n\t\t\t\tFAF6C9C823C2DE2900D7B5BC /* doc.h */,\n\t\t\t\tFAF6C9D823C2DE2900D7B5BC /* doc.cpp */,\n\t\t\t\tFAF6C9C723C2DE2900D7B5BC /* GLSL.ext.AMD.h */,\n\t\t\t\tD9DB6E3A2B4B41570037A1F6 /* GLSL.ext.ARM.h */,\n\t\t\t\tFAF6C9CB23C2DE2900D7B5BC /* GLSL.ext.EXT.h */,\n\t\t\t\tFAF6C9CC23C2DE2900D7B5BC /* GLSL.ext.KHR.h */,\n\t\t\t\tFAF6C9CD23C2DE2900D7B5BC /* GLSL.ext.NV.h */,\n\t\t\t\tD9DB6E3B2B4B41580037A1F6 /* GLSL.ext.QCOM.h */,\n\t\t\t\tFAF6C9D323C2DE2900D7B5BC /* GLSL.std.450.h */,\n\t\t\t\tFAF6C9D223C2DE2900D7B5BC /* GlslangToSpv.h */,\n\t\t\t\tFAF6C9CE23C2DE2900D7B5BC /* GlslangToSpv.cpp */,\n\t\t\t\tFAF6C9D623C2DE2900D7B5BC /* hex_float.h */,\n\t\t\t\tFAF6C9C623C2DE2900D7B5BC /* InReadableOrder.cpp */,\n\t\t\t\tFAF6C9D723C2DE2900D7B5BC /* Logger.h */,\n\t\t\t\tFAF6C9D523C2DE2900D7B5BC /* Logger.cpp */,\n\t\t\t\tD9DB6E382B4B41570037A1F6 /* NonSemanticDebugPrintf.h */,\n\t\t\t\tD9DB6E392B4B41570037A1F6 /* NonSemanticShaderDebugInfo100.h */,\n\t\t\t\tD91C76102DE3D088001FC408 /* spirv.hpp11 */,\n\t\t\t\tFAF6C9C223C2DE2900D7B5BC /* SpvBuilder.h */,\n\t\t\t\tFAF6C9CA23C2DE2900D7B5BC /* SpvBuilder.cpp */,\n\t\t\t\tFAF6C9CF23C2DE2900D7B5BC /* spvIR.h */,\n\t\t\t\tFAF6C9C323C2DE2900D7B5BC /* SpvPostProcess.cpp */,\n\t\t\t\tFAF6C9C123C2DE2900D7B5BC /* SPVRemapper.h */,\n\t\t\t\tFAF6C9D423C2DE2900D7B5BC /* SPVRemapper.cpp */,\n\t\t\t\tFAF6C9C423C2DE2900D7B5BC /* SpvTools.h */,\n\t\t\t\tFAF6C9C523C2DE2900D7B5BC /* SpvTools.cpp */,\n\t\t\t\tD91C76112DE3D088001FC408 /* spvUtil.h */,\n\t\t\t);\n\t\t\tpath = SPIRV;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\tFA577AAC16C7507900860150 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tFAF6C9F623C2DE2900D7B5BC /* hex_float.h in Headers */,\n\t\t\t\tFADF54221E3DA52C00012CC0 /* wrap_ParticleSystem.h in Headers */,\n\t\t\t\tFAF6C9EE23C2DE2900D7B5BC /* bitutils.h in Headers */,\n\t\t\t\t217DFC0A1D9F6D490055D849 /* unix.h in Headers */,\n\t\t\t\tFA0B7D7E1A95902C000E1D17 /* Texture.h in Headers */,\n\t\t\t\tFA18CF3C23DCF67900263725 /* spirv_cross.hpp in Headers */,\n\t\t\t\tFA0B7E561A95902C000E1D17 /* wrap_GearJoint.h in Headers */,\n\t\t\t\tFAF1409F1E20934C00F898D2 /* reflection.h in Headers */,\n\t\t\t\tFA0B7E1D1A95902C000E1D17 /* MouseJoint.h in Headers */,\n\t\t\t\tFA1BA0B81E17043400AA2803 /* wrap_Shader.h in Headers */,\n\t\t\t\tFA1557C41CE90BD200AFF582 /* EXRHandler.h in Headers */,\n\t\t\t\tFA0B7DC91A95902C000E1D17 /* Keyboard.h in Headers */,\n\t\t\t\tFA0B7D4A1A95902C000E1D17 /* Polyline.h in Headers */,\n\t\t\t\tFABDA9E72552448300B5C523 /* b2_chain_shape.h in Headers */,\n\t\t\t\tFAF1405C1E20934C00F898D2 /* InitializeGlobals.h in Headers */,\n\t\t\t\tFACA06B4293EE5CD001A2557 /* wrap_Sensor.h in Headers */,\n\t\t\t\tFA0B7DB31A95902C000E1D17 /* wrap_Image.h in Headers */,\n\t\t\t\tFAF140591E20934C00F898D2 /* Common.h in Headers */,\n\t\t\t\tFA0B7EC31A95902C000E1D17 /* threads.h in Headers */,\n\t\t\t\tFA0B7AC21A958EA3000E1D17 /* enet.h in Headers */,\n\t\t\t\tFA4F2BA71DE1E36400CA37D7 /* RecordingDevice.h in Headers */,\n\t\t\t\tFA0B7E201A95902C000E1D17 /* Physics.h in Headers */,\n\t\t\t\tFAF140791E20934C00F898D2 /* iomapper.h in Headers */,\n\t\t\t\t217DFBEA1D9F6D490055D849 /* io.h in Headers */,\n\t\t\t\tFA0B79221A958E3B000E1D17 /* delay.h in Headers */,\n\t\t\t\tFAFEB29E28F210550025D7D0 /* unixstream.h in Headers */,\n\t\t\t\tFA0B79481A958E3B000E1D17 /* Vector.h in Headers */,\n\t\t\t\tFA94728427A6EE1B00817677 /* ConnectionClient.h in Headers */,\n\t\t\t\tFA0B7CCF1A95902C000E1D17 /* Audio.h in Headers */,\n\t\t\t\tFA0B7EC01A95902C000E1D17 /* Thread.h in Headers */,\n\t\t\t\tFABDA9E12552448300B5C523 /* b2_wheel_joint.h in Headers */,\n\t\t\t\tFA0B7E9C1A95902C000E1D17 /* VorbisDecoder.h in Headers */,\n\t\t\t\tFAC271E523B5B5B400C200D3 /* renderstate.h in Headers */,\n\t\t\t\tFAC756FB1E4F99D200B91289 /* Effect.h in Headers */,\n\t\t\t\tFAF6C9EF23C2DE2900D7B5BC /* disassemble.h in Headers */,\n\t\t\t\tFA18CF4123DCF67900263725 /* spirv_common.hpp in Headers */,\n\t\t\t\tFAC7CD901FE35E95006A60C7 /* physfs_miniz.h in Headers */,\n\t\t\t\tD9DB6E3F2B4B41580037A1F6 /* NonSemanticShaderDebugInfo100.h in Headers */,\n\t\t\t\tFA0B791D1A958E3B000E1D17 /* b64.h in Headers */,\n\t\t\t\tFA0B7DC61A95902C000E1D17 /* wrap_JoystickModule.h in Headers */,\n\t\t\t\tFA0B7D201A95902C000E1D17 /* ImageRasterizer.h in Headers */,\n\t\t\t\tFAF6C9EA23C2DE2900D7B5BC /* GLSL.ext.NV.h in Headers */,\n\t\t\t\tFADF54311E3DABF600012CC0 /* SpriteBatch.h in Headers */,\n\t\t\t\tFA0B7E5F1A95902C000E1D17 /* wrap_MouseJoint.h in Headers */,\n\t\t\t\tFA76344C1E28722A0066EF9E /* StreamBuffer.h in Headers */,\n\t\t\t\tFA6A2B761F60B6710074C308 /* ByteData.h in Headers */,\n\t\t\t\t217DFBF31D9F6D490055D849 /* mime.h in Headers */,\n\t\t\t\tFA0B7B361A958EA3000E1D17 /* wuff_convert.h in Headers */,\n\t\t\t\tFA0B7CDE1A95902C000E1D17 /* Source.h in Headers */,\n\t\t\t\tFA0B7E141A95902C000E1D17 /* GearJoint.h in Headers */,\n\t\t\t\tFAAA3FDA1F64B3AD00F89E99 /* lstrlib.h in Headers */,\n\t\t\t\tFABDA98C2552448300B5C523 /* b2_contact_solver.h in Headers */,\n\t\t\t\tFA0B7E9F1A95902C000E1D17 /* WaveDecoder.h in Headers */,\n\t\t\t\tFAF140871E20934C00F898D2 /* parseVersions.h in Headers */,\n\t\t\t\tFA0B7AC61A958EA3000E1D17 /* types.h in Headers */,\n\t\t\t\tFA0B7DBD1A95902C000E1D17 /* Joystick.h in Headers */,\n\t\t\t\tD9DB6E452B4B80E80037A1F6 /* build_info.h in Headers */,\n\t\t\t\tFA0B7D0E1A95902C000E1D17 /* wrap_Filesystem.h in Headers */,\n\t\t\t\tFA0B7EE41A95902D000E1D17 /* Window.h in Headers */,\n\t\t\t\tFA0B7CFC1A95902C000E1D17 /* Filesystem.h in Headers */,\n\t\t\t\tFA0B7AD81A958EA3000E1D17 /* lua-enet.h in Headers */,\n\t\t\t\tFA0B7EBA1A95902C000E1D17 /* Channel.h in Headers */,\n\t\t\t\tFA0B7D3E1A95902C000E1D17 /* Texture.h in Headers */,\n\t\t\t\tFA0B7ECA1A95902C000E1D17 /* threads.h in Headers */,\n\t\t\t\tFADF54361E3DAE6E00012CC0 /* wrap_SpriteBatch.h in Headers */,\n\t\t\t\tD9F0C2D62C680A5500BB2D25 /* CurlClient.h in Headers */,\n\t\t\t\tFA0B7DB01A95902C000E1D17 /* wrap_CompressedImageData.h in Headers */,\n\t\t\t\tFAC7CD8D1FE35E95006A60C7 /* physfs_platforms.h in Headers */,\n\t\t\t\tFABDA9B82552448300B5C523 /* b2_motor_joint.h in Headers */,\n\t\t\t\tFA0B7AC11A958EA3000E1D17 /* callbacks.h in Headers */,\n\t\t\t\tFA3C5E491F8D80CA0003C579 /* ShaderStage.h in Headers */,\n\t\t\t\tD9DAB9292961F10000C64820 /* GenericShaper.h in Headers */,\n\t\t\t\tFA0B7D8F1A95902C000E1D17 /* ddsHandler.h in Headers */,\n\t\t\t\tFAB2D5AC1AABDD8A008224A4 /* TrueTypeRasterizer.h in Headers */,\n\t\t\t\tFABDAA042552448300B5C523 /* b2_edge_shape.h in Headers */,\n\t\t\t\tFAF140C41E20934C00F898D2 /* ShaderLang.h in Headers */,\n\t\t\t\tFA1E887F1DF363CD00E808AA /* Filter.h in Headers */,\n\t\t\t\tFA27B3C21B4985BF008A9DCE /* wrap_VideoStream.h in Headers */,\n\t\t\t\tFAF140621E20934C00F898D2 /* ShHandle.h in Headers */,\n\t\t\t\tFA0B7B2F1A958EA3000E1D17 /* utf8.h in Headers */,\n\t\t\t\tFA0B79231A958E3B000E1D17 /* EnumMap.h in Headers */,\n\t\t\t\tFAF140571E20934C00F898D2 /* arrays.h in Headers */,\n\t\t\t\tFA0B7E681A95902C000E1D17 /* wrap_PrismaticJoint.h in Headers */,\n\t\t\t\tFABDA9DC2552448300B5C523 /* b2_friction_joint.h in Headers */,\n\t\t\t\tFABDA9CA2552448300B5C523 /* b2_time_step.h in Headers */,\n\t\t\t\tFABDA9CC2552448300B5C523 /* b2_circle_shape.h in Headers */,\n\t\t\t\tFA0B7D571A95902C000E1D17 /* Buffer.h in Headers */,\n\t\t\t\tFAF140AB1E20934C00F898D2 /* SymbolTable.h in Headers */,\n\t\t\t\tFA18CF1E23DCF67900263725 /* external_interface.h in Headers */,\n\t\t\t\tFA0B7ED71A95902D000E1D17 /* Timer.h in Headers */,\n\t\t\t\tFA0B7AC31A958EA3000E1D17 /* list.h in Headers */,\n\t\t\t\tFA0B7B2D1A958EA3000E1D17 /* core.h in Headers */,\n\t\t\t\tFA1E88841DF363DB00E808AA /* Filter.h in Headers */,\n\t\t\t\tFA94727D27A6EE1B00817677 /* HTTPSClient.h in Headers */,\n\t\t\t\t217DFC061D9F6D490055D849 /* tp.lua.h in Headers */,\n\t\t\t\tFABDA9E02552448300B5C523 /* b2_polygon_shape.h in Headers */,\n\t\t\t\tFAB17BF71ABFC4B100F9BA27 /* lz4hc.h in Headers */,\n\t\t\t\tFA0B7E831A95902C000E1D17 /* Shape.h in Headers */,\n\t\t\t\tFAE272531C05A15B00A67640 /* ParticleSystem.h in Headers */,\n\t\t\t\tFA6A2B6C1F5F7F560074C308 /* DataView.h in Headers */,\n\t\t\t\tFAF140701E20934C00F898D2 /* Initialize.h in Headers */,\n\t\t\t\tFAC8E54C23AC8379007B07C8 /* wrap_NativeFile.h in Headers */,\n\t\t\t\tFAAA3FDC1F64B3AD00F89E99 /* lutf8lib.h in Headers */,\n\t\t\t\tFAC7CD801FE35E95006A60C7 /* physfs_casefolding.h in Headers */,\n\t\t\t\tFA1BA09F1E16CFCE00AA2803 /* Font.h in Headers */,\n\t\t\t\tFA0B7EDD1A95902D000E1D17 /* Touch.h in Headers */,\n\t\t\t\tFA0B7EDE1A95902D000E1D17 /* Touch.h in Headers */,\n\t\t\t\tFAC7CD861FE35E95006A60C7 /* physfs.h in Headers */,\n\t\t\t\tD9DAB92C2961F10000C64820 /* TextShaper.h in Headers */,\n\t\t\t\tFA522D4F23F9FE380059EE3C /* MP3Decoder.h in Headers */,\n\t\t\t\t217DFBEE1D9F6D490055D849 /* luasocket.h in Headers */,\n\t\t\t\tFACA02F31F5E396B0084B28F /* HashFunction.h in Headers */,\n\t\t\t\tFA0B7ED01A95902C000E1D17 /* wrap_LuaThread.h in Headers */,\n\t\t\t\tFAF6C9E923C2DE2900D7B5BC /* GLSL.ext.KHR.h in Headers */,\n\t\t\t\tFA0B7CE41A95902C000E1D17 /* wrap_Audio.h in Headers */,\n\t\t\t\tFADF540F1E3D7CDD00012CC0 /* wrap_Video.h in Headers */,\n\t\t\t\tFAA54ACA1F91660400A8FA7B /* OggDemuxer.h in Headers */,\n\t\t\t\tFA0B79491A958E3B000E1D17 /* version.h in Headers */,\n\t\t\t\tFAF140581E20934C00F898D2 /* BaseTypes.h in Headers */,\n\t\t\t\tFA18CED723DBC6E000263725 /* Shader.h in Headers */,\n\t\t\t\tFABDA9E32552448300B5C523 /* b2_draw.h in Headers */,\n\t\t\t\tFA0B7B2B1A958EA3000E1D17 /* stb_image.h in Headers */,\n\t\t\t\tFAF140AE1E20934C00F898D2 /* Versions.h in Headers */,\n\t\t\t\tFA0B7CD21A95902C000E1D17 /* Audio.h in Headers */,\n\t\t\t\tFA0B79421A958E3B000E1D17 /* utf8.h in Headers */,\n\t\t\t\tFA0B7D171A95902C000E1D17 /* Font.h in Headers */,\n\t\t\t\tFAECA1B41F3164700095D008 /* CompressedSlice.h in Headers */,\n\t\t\t\tFA0B7EAE1A95902C000E1D17 /* wrap_SoundData.h in Headers */,\n\t\t\t\tFA0B7CFF1A95902C000E1D17 /* File.h in Headers */,\n\t\t\t\tFA0B7AB41A958EA3000E1D17 /* ddsinfo.h in Headers */,\n\t\t\t\tFABDA9C62552448300B5C523 /* b2_rope.h in Headers */,\n\t\t\t\tFA0B7DD21A95902C000E1D17 /* love.h in Headers */,\n\t\t\t\tFAC8E54523AC832A007B07C8 /* NativeFile.h in Headers */,\n\t\t\t\tFA6A2B6F1F5F845F0074C308 /* wrap_DataView.h in Headers */,\n\t\t\t\tFA18CF3D23DCF67900263725 /* GLSL.std.450.h in Headers */,\n\t\t\t\tFA18CF3E23DCF67900263725 /* spirv_cross_containers.hpp in Headers */,\n\t\t\t\tFA18CF1B23DCF67900263725 /* thread_group.hpp in Headers */,\n\t\t\t\tFAF140861E20934C00F898D2 /* ParseHelper.h in Headers */,\n\t\t\t\tFA0B7CE71A95902C000E1D17 /* wrap_Source.h in Headers */,\n\t\t\t\tFA0B7B231A958EA3000E1D17 /* luasocket.h in Headers */,\n\t\t\t\tFA0B7D1D1A95902C000E1D17 /* GlyphData.h in Headers */,\n\t\t\t\tFA522D5A23FA5ED50059EE3C /* NotoSans-Regular.ttf.gzip.h in Headers */,\n\t\t\t\tFAC7CD8E1FE35E95006A60C7 /* physfs_lzmasdk.h in Headers */,\n\t\t\t\tFA0B7B391A958EA3000E1D17 /* wuff_internal.h in Headers */,\n\t\t\t\tFAC7CD771FE35E95006A60C7 /* physfs_internal.h in Headers */,\n\t\t\t\tFA0B7D881A95902C000E1D17 /* ImageData.h in Headers */,\n\t\t\t\tFAF6C9DA23C2DE2900D7B5BC /* SPVRemapper.h in Headers */,\n\t\t\t\tFA0B7EE11A95902D000E1D17 /* wrap_Touch.h in Headers */,\n\t\t\t\tFA9D8DDB1DEF8411002CD881 /* Stream.h in Headers */,\n\t\t\t\tFAF6C9E823C2DE2900D7B5BC /* GLSL.ext.EXT.h in Headers */,\n\t\t\t\tFACA02F71F5E396B0084B28F /* wrap_DataModule.h in Headers */,\n\t\t\t\tFABDA9BE2552448300B5C523 /* Box2D.h in Headers */,\n\t\t\t\tD9DAB9222961F0EE00C64820 /* HarfbuzzShaper.h in Headers */,\n\t\t\t\tFA56AA3A1FAFF02000A43D5F /* memory.h in Headers */,\n\t\t\t\tFA0B7E441A95902C000E1D17 /* wrap_CircleShape.h in Headers */,\n\t\t\t\tFA0B7EB41A95902C000E1D17 /* System.h in Headers */,\n\t\t\t\tFAF1405A1E20934C00F898D2 /* ConstantUnion.h in Headers */,\n\t\t\t\tFABDA9782552448200B5C523 /* b2_block_allocator.h in Headers */,\n\t\t\t\tFAF140A51E20934C00F898D2 /* Scan.h in Headers */,\n\t\t\t\tFABDA9C72552448300B5C523 /* b2_distance_joint.h in Headers */,\n\t\t\t\tFA0B7CE11A95902C000E1D17 /* Source.h in Headers */,\n\t\t\t\tFABDA9C32552448300B5C523 /* b2_settings.h in Headers */,\n\t\t\t\tFA24348621D401CB00B8918A /* attribute.h in Headers */,\n\t\t\t\tFABDA9C02552448300B5C523 /* b2_broad_phase.h in Headers */,\n\t\t\t\tFAF140901E20934C00F898D2 /* PpContext.h in Headers */,\n\t\t\t\tFA0B7E621A95902C000E1D17 /* wrap_Physics.h in Headers */,\n\t\t\t\tFA0B7DF01A95902C000E1D17 /* Mouse.h in Headers */,\n\t\t\t\tFABDA9E62552448300B5C523 /* b2_api.h in Headers */,\n\t\t\t\t217DFBDC1D9F6D490055D849 /* buffer.h in Headers */,\n\t\t\t\tFA0B7DAD1A95902C000E1D17 /* STBHandler.h in Headers */,\n\t\t\t\tFABDA9BB2552448300B5C523 /* b2_dynamic_tree.h in Headers */,\n\t\t\t\tFA1BA0A41E16D97500AA2803 /* wrap_Font.h in Headers */,\n\t\t\t\tD91C76122DE3D088001FC408 /* spvUtil.h in Headers */,\n\t\t\t\tFA0B7DE11A95902C000E1D17 /* wrap_Math.h in Headers */,\n\t\t\t\tFA0B7D1A1A95902C000E1D17 /* TrueTypeRasterizer.h in Headers */,\n\t\t\t\tFA0B7EA81A95902C000E1D17 /* wrap_Decoder.h in Headers */,\n\t\t\t\tFA0B7AC51A958EA3000E1D17 /* time.h in Headers */,\n\t\t\t\tFA0B793E1A958E3B000E1D17 /* StringMap.h in Headers */,\n\t\t\t\tFA18CF1623DCF67900263725 /* spirv_parser.hpp in Headers */,\n\t\t\t\tFA0B793A1A958E3B000E1D17 /* Reference.h in Headers */,\n\t\t\t\tFACA02F51F5E396B0084B28F /* wrap_CompressedData.h in Headers */,\n\t\t\t\tFABDA9DF2552448300B5C523 /* b2_world.h in Headers */,\n\t\t\t\tFA0B7DCC1A95902C000E1D17 /* Keyboard.h in Headers */,\n\t\t\t\tFA620A341AA2F8DB005DB4C2 /* wrap_Quad.h in Headers */,\n\t\t\t\tFA0B7EA51A95902C000E1D17 /* SoundData.h in Headers */,\n\t\t\t\tFADF54271E3DA5BA00012CC0 /* Mesh.h in Headers */,\n\t\t\t\tFAF1405E1E20934C00F898D2 /* PoolAlloc.h in Headers */,\n\t\t\t\tFA0B79341A958E3B000E1D17 /* Object.h in Headers */,\n\t\t\t\t217DFBF11D9F6D490055D849 /* mbox.lua.h in Headers */,\n\t\t\t\tFA0B7CEA1A95902C000E1D17 /* Event.h in Headers */,\n\t\t\t\tFA0B7E351A95902C000E1D17 /* WeldJoint.h in Headers */,\n\t\t\t\tFABDA9CB2552448300B5C523 /* b2_pulley_joint.h in Headers */,\n\t\t\t\tFA0B7E2F1A95902C000E1D17 /* RopeJoint.h in Headers */,\n\t\t\t\tFA0B7D141A95902C000E1D17 /* Font.h in Headers */,\n\t\t\t\tFA0B7E591A95902C000E1D17 /* wrap_Joint.h in Headers */,\n\t\t\t\tFA0B7E771A95902C000E1D17 /* wrap_WeldJoint.h in Headers */,\n\t\t\t\tFA18CEC723D3AE6800263725 /* wrap_Buffer.h in Headers */,\n\t\t\t\tFA0B7E291A95902C000E1D17 /* PulleyJoint.h in Headers */,\n\t\t\t\tFA6BDE5C1F31725300786805 /* Color.h in Headers */,\n\t\t\t\tFA0B7E231A95902C000E1D17 /* PolygonShape.h in Headers */,\n\t\t\t\tFA0B791E1A958E3B000E1D17 /* config.h in Headers */,\n\t\t\t\tFAB17BE81ABFAA9000F9BA27 /* lz4.h in Headers */,\n\t\t\t\tFA0B7E6B1A95902C000E1D17 /* wrap_PulleyJoint.h in Headers */,\n\t\t\t\tFAFEB29B28F210550025D7D0 /* unixdgram.h in Headers */,\n\t\t\t\tFA0B7E051A95902C000E1D17 /* Contact.h in Headers */,\n\t\t\t\tFA4F2BE41DE6650600CA37D7 /* Transform.h in Headers */,\n\t\t\t\tFA6A2B661F5F7B6B0074C308 /* wrap_Data.h in Headers */,\n\t\t\t\tFA18CEE423DBC6E000263725 /* Graphics.h in Headers */,\n\t\t\t\t217DFBE81D9F6D490055D849 /* inet.h in Headers */,\n\t\t\t\tFADF53FA1E3C7ACD00012CC0 /* Buffer.h in Headers */,\n\t\t\t\tFA18CF4223DCF67900263725 /* spirv_glsl.hpp in Headers */,\n\t\t\t\tFA18CF1C23DCF67900263725 /* internal_interface.hpp in Headers */,\n\t\t\t\tFA18CF2523DCF67900263725 /* spirv_cross_parsed_ir.hpp in Headers */,\n\t\t\t\tFA0B7EEA1A95902D000E1D17 /* wrap_Window.h in Headers */,\n\t\t\t\tFA1557C01CE90A2C00AFF582 /* tinyexr.h in Headers */,\n\t\t\t\tFA0B7E381A95902C000E1D17 /* WheelJoint.h in Headers */,\n\t\t\t\tD943E5902A24D56000D80361 /* PhysfsIo.h in Headers */,\n\t\t\t\tFA0B7D851A95902C000E1D17 /* Image.h in Headers */,\n\t\t\t\tFABDA9EA2552448300B5C523 /* b2_world_callbacks.h in Headers */,\n\t\t\t\tFA0B7E7D1A95902C000E1D17 /* wrap_World.h in Headers */,\n\t\t\t\tFA0B7EBD1A95902C000E1D17 /* LuaThread.h in Headers */,\n\t\t\t\tFADF53FF1E3D74F200012CC0 /* TextBatch.h in Headers */,\n\t\t\t\tFA0B7DC01A95902C000E1D17 /* JoystickModule.h in Headers */,\n\t\t\t\tFA18CF3923DCF67900263725 /* spirv_msl.hpp in Headers */,\n\t\t\t\tFA0B7E871A95902C000E1D17 /* CoreAudioDecoder.h in Headers */,\n\t\t\t\tFA0B7CD51A95902C000E1D17 /* Source.h in Headers */,\n\t\t\t\t217DFBFD1D9F6D490055D849 /* smtp.lua.h in Headers */,\n\t\t\t\tFABDA9772552448200B5C523 /* b2_shape.h in Headers */,\n\t\t\t\tFA27B39F1B498151008A9DCE /* Video.h in Headers */,\n\t\t\t\tFA94727A27A6EE1B00817677 /* Connection.h in Headers */,\n\t\t\t\tFA18CF3223DCF67900263725 /* spirv_cfg.hpp in Headers */,\n\t\t\t\tFA94727F27A6EE1B00817677 /* config.h in Headers */,\n\t\t\t\t217DFC041D9F6D490055D849 /* timeout.h in Headers */,\n\t\t\t\tFA0B7E7A1A95902C000E1D17 /* wrap_WheelJoint.h in Headers */,\n\t\t\t\tFA0B7DD81A95902C000E1D17 /* MathModule.h in Headers */,\n\t\t\t\t217DFBDA1D9F6D490055D849 /* auxiliar.h in Headers */,\n\t\t\t\tFA0B7EC71A95902C000E1D17 /* ThreadModule.h in Headers */,\n\t\t\t\tD9F0C2DB2C680A5500BB2D25 /* OpenSSLConnection.h in Headers */,\n\t\t\t\tFA4F2BAD1DE1E37000CA37D7 /* RecordingDevice.h in Headers */,\n\t\t\t\tFABDA9CE2552448300B5C523 /* b2_time_of_impact.h in Headers */,\n\t\t\t\tFA0B792B1A958E3B000E1D17 /* Matrix.h in Headers */,\n\t\t\t\tFA0B7DA41A95902C000E1D17 /* PKMHandler.h in Headers */,\n\t\t\t\tFAF6C9E423C2DE2900D7B5BC /* doc.h in Headers */,\n\t\t\t\tFA0B7AC81A958EA3000E1D17 /* utility.h in Headers */,\n\t\t\t\tFABDA9BA2552448300B5C523 /* b2_weld_joint.h in Headers */,\n\t\t\t\tFA522D5323F9FF2A0059EE3C /* dr_mp3.h in Headers */,\n\t\t\t\tD9DB6E272B4B40660037A1F6 /* ResourceLimits.h in Headers */,\n\t\t\t\tFA0B791F1A958E3B000E1D17 /* Data.h in Headers */,\n\t\t\t\tFA18CF4523DD1A8100263725 /* ShaderStage.h in Headers */,\n\t\t\t\t217DFBE41D9F6D490055D849 /* headers.lua.h in Headers */,\n\t\t\t\tFA0B7D021A95902C000E1D17 /* Filesystem.h in Headers */,\n\t\t\t\tFA0B7E471A95902C000E1D17 /* wrap_Contact.h in Headers */,\n\t\t\t\tFA0B7E021A95902C000E1D17 /* CircleShape.h in Headers */,\n\t\t\t\tD9DB6E3E2B4B41580037A1F6 /* NonSemanticDebugPrintf.h in Headers */,\n\t\t\t\tFABDA9E92552448300B5C523 /* b2_timer.h in Headers */,\n\t\t\t\tFA0B7E111A95902C000E1D17 /* FrictionJoint.h in Headers */,\n\t\t\t\tFA0B7AE01A958EA3000E1D17 /* lodepng.h in Headers */,\n\t\t\t\tFA0B7ECD1A95902C000E1D17 /* wrap_Channel.h in Headers */,\n\t\t\t\tFAF140AF1E20934C00F898D2 /* osinclude.h in Headers */,\n\t\t\t\tFA93C4531F315B960087CCD4 /* FormatHandler.h in Headers */,\n\t\t\t\tFA0B7CD81A95902C000E1D17 /* Audio.h in Headers */,\n\t\t\t\tFA0B7CF61A95902C000E1D17 /* File.h in Headers */,\n\t\t\t\tD9F0C2CC2C68091200BB2D25 /* LibraryLoader.h in Headers */,\n\t\t\t\tFA18CF2123DCF67900263725 /* spirv.hpp in Headers */,\n\t\t\t\tFA0A3A5F23366CE9001C269E /* floattypes.h in Headers */,\n\t\t\t\tFADF54091E3D78F700012CC0 /* Video.h in Headers */,\n\t\t\t\tFAA54ACB1F91660400A8FA7B /* TheoraVideoStream.h in Headers */,\n\t\t\t\tFA0B7DD51A95902C000E1D17 /* BezierCurve.h in Headers */,\n\t\t\t\tFA0B79271A958E3B000E1D17 /* int.h in Headers */,\n\t\t\t\tFA0B7E531A95902C000E1D17 /* wrap_FrictionJoint.h in Headers */,\n\t\t\t\tFA0B7EB71A95902C000E1D17 /* wrap_System.h in Headers */,\n\t\t\t\tFA18CF1923DCF67900263725 /* spirv_cross_error_handling.hpp in Headers */,\n\t\t\t\tFABDAA032552448300B5C523 /* b2_contact_manager.h in Headers */,\n\t\t\t\tFA27B3A91B498151008A9DCE /* Video.h in Headers */,\n\t\t\t\tFAAA3FD81F64B3AD00F89E99 /* lprefix.h in Headers */,\n\t\t\t\tFAF6C9F023C2DE2900D7B5BC /* GlslangToSpv.h in Headers */,\n\t\t\t\tFAF6C9F723C2DE2900D7B5BC /* Logger.h in Headers */,\n\t\t\t\t217DFBFA1D9F6D490055D849 /* select.h in Headers */,\n\t\t\t\tFABDA9BF2552448300B5C523 /* b2_types.h in Headers */,\n\t\t\t\tFA0B7DF61A95902C000E1D17 /* wrap_Mouse.h in Headers */,\n\t\t\t\tFAF140661E20934C00F898D2 /* gl_types.h in Headers */,\n\t\t\t\tFA0B7E801A95902C000E1D17 /* Joint.h in Headers */,\n\t\t\t\tFA0B7D2F1A95902C000E1D17 /* Drawable.h in Headers */,\n\t\t\t\tFA18CF3A23DCF67900263725 /* spirv_reflect.hpp in Headers */,\n\t\t\t\t217DFBE21D9F6D490055D849 /* ftp.lua.h in Headers */,\n\t\t\t\tFA0B7EC41A95902C000E1D17 /* Thread.h in Headers */,\n\t\t\t\tFA0B7DFF1A95902C000E1D17 /* ChainShape.h in Headers */,\n\t\t\t\tFA18CEE023DBC6E000263725 /* StreamBuffer.h in Headers */,\n\t\t\t\tFA0B7E4D1A95902C000E1D17 /* wrap_EdgeShape.h in Headers */,\n\t\t\t\tFA522D5423F9FF2A0059EE3C /* dr_flac.h in Headers */,\n\t\t\t\tFAF1405F1E20934C00F898D2 /* ResourceLimits.h in Headers */,\n\t\t\t\tFA0B7DDB1A95902C000E1D17 /* RandomGenerator.h in Headers */,\n\t\t\t\tFA0B7E841A95902C000E1D17 /* Decoder.h in Headers */,\n\t\t\t\tFA0B7EAB1A95902C000E1D17 /* wrap_Sound.h in Headers */,\n\t\t\t\tFA0B7B2C1A958EA3000E1D17 /* checked.h in Headers */,\n\t\t\t\tFABDA9A62552448300B5C523 /* b2_polygon_contact.h in Headers */,\n\t\t\t\tFA94728727A6EE1B00817677 /* HTTPS.h in Headers */,\n\t\t\t\tFA0B7D2A1A95902C000E1D17 /* wrap_GlyphData.h in Headers */,\n\t\t\t\tFACA02F11F5E396B0084B28F /* DataModule.h in Headers */,\n\t\t\t\tFABDA9C82552448300B5C523 /* b2_body.h in Headers */,\n\t\t\t\tFA0B7E741A95902C000E1D17 /* wrap_Shape.h in Headers */,\n\t\t\t\tFABDA9762552448200B5C523 /* b2_joint.h in Headers */,\n\t\t\t\tFABDA9CD2552448300B5C523 /* b2_math.h in Headers */,\n\t\t\t\tFABDA9C42552448300B5C523 /* b2_revolute_joint.h in Headers */,\n\t\t\t\tFA91DA8D1F377C3900C80E33 /* deprecation.h in Headers */,\n\t\t\t\tFAF1407F1E20934C00F898D2 /* localintermediate.h in Headers */,\n\t\t\t\tFAF1406B1E20934C00F898D2 /* glslang_tab.cpp.h in Headers */,\n\t\t\t\t217DFBF71D9F6D490055D849 /* options.h in Headers */,\n\t\t\t\tFA94728327A6EE1B00817677 /* HTTPRequest.h in Headers */,\n\t\t\t\tFAF6C9ED23C2DE2900D7B5BC /* spvIR.h in Headers */,\n\t\t\t\tFA0B7E3B1A95902C000E1D17 /* World.h in Headers */,\n\t\t\t\tFA0B7DC31A95902C000E1D17 /* wrap_Joystick.h in Headers */,\n\t\t\t\tFA18CF3B23DCF67900263725 /* spirv_cross_util.hpp in Headers */,\n\t\t\t\tFAF140631E20934C00F898D2 /* Types.h in Headers */,\n\t\t\t\tD9DB6E292B4B40970037A1F6 /* span.h in Headers */,\n\t\t\t\tFACA06AF293EE5CD001A2557 /* Sensor.h in Headers */,\n\t\t\t\tFA4F2BE61DE6650600CA37D7 /* wrap_Transform.h in Headers */,\n\t\t\t\tFA0B7EE71A95902D000E1D17 /* Window.h in Headers */,\n\t\t\t\tFA0B7E651A95902C000E1D17 /* wrap_PolygonShape.h in Headers */,\n\t\t\t\tFA18CEE323DBC6E000263725 /* Metal.h in Headers */,\n\t\t\t\tFABDA9952552448300B5C523 /* b2_edge_polygon_contact.h in Headers */,\n\t\t\t\tFA94729D27A6F9AD00817677 /* NSURLClient.h in Headers */,\n\t\t\t\tFA0B7AC91A958EA3000E1D17 /* win32.h in Headers */,\n\t\t\t\tFABDA9B92552448300B5C523 /* b2_common.h in Headers */,\n\t\t\t\tFA0B7DFC1A95902C000E1D17 /* Body.h in Headers */,\n\t\t\t\tFA1BA0B31E16FD0800AA2803 /* Shader.h in Headers */,\n\t\t\t\tFAF6C9F123C2DE2900D7B5BC /* GLSL.std.450.h in Headers */,\n\t\t\t\tFABDA97E2552448200B5C523 /* b2_chain_circle_contact.h in Headers */,\n\t\t\t\tFABDA9DD2552448300B5C523 /* b2_contact.h in Headers */,\n\t\t\t\tFABDA9802552448200B5C523 /* b2_circle_contact.h in Headers */,\n\t\t\t\t217DFC101D9F6D490055D849 /* url.lua.h in Headers */,\n\t\t\t\tFA0B7DF31A95902C000E1D17 /* wrap_Cursor.h in Headers */,\n\t\t\t\tFA18CF2023DCF67900263725 /* spirv_hlsl.hpp in Headers */,\n\t\t\t\tFA0B7D271A95902C000E1D17 /* wrap_Font.h in Headers */,\n\t\t\t\tFA0B7DAA1A95902C000E1D17 /* PVRHandler.h in Headers */,\n\t\t\t\tFA27B3B51B498151008A9DCE /* wrap_Video.h in Headers */,\n\t\t\t\tFABDA9BC2552448300B5C523 /* b2_fixture.h in Headers */,\n\t\t\t\tFA0B7D7B1A95902C000E1D17 /* Quad.h in Headers */,\n\t\t\t\tFA0B7E261A95902C000E1D17 /* PrismaticJoint.h in Headers */,\n\t\t\t\tFABDA9852552448200B5C523 /* b2_edge_circle_contact.h in Headers */,\n\t\t\t\tFA0B7E991A95902C000E1D17 /* Sound.h in Headers */,\n\t\t\t\tFA0B7D841A95902C000E1D17 /* CompressedImageData.h in Headers */,\n\t\t\t\tFACA02ED1F5E396B0084B28F /* CompressedData.h in Headers */,\n\t\t\t\tFAF1407E1E20934C00F898D2 /* LiveTraverser.h in Headers */,\n\t\t\t\tFA0B7D231A95902C000E1D17 /* Rasterizer.h in Headers */,\n\t\t\t\tFABDA9B72552448300B5C523 /* b2_island.h in Headers */,\n\t\t\t\tFAD19A191DFF8CA200D5398A /* ImageDataBase.h in Headers */,\n\t\t\t\tFABDA9E22552448300B5C523 /* b2_growable_stack.h in Headers */,\n\t\t\t\tFA0B7CDB1A95902C000E1D17 /* Pool.h in Headers */,\n\t\t\t\tFA0B7D0B1A95902C000E1D17 /* wrap_FileData.h in Headers */,\n\t\t\t\tFA0B7DF91A95902C000E1D17 /* Body.h in Headers */,\n\t\t\t\tFA0B7DB91A95902C000E1D17 /* Joystick.h in Headers */,\n\t\t\t\tFA4F2BB11DE1E37B00CA37D7 /* RecordingDevice.h in Headers */,\n\t\t\t\tFA0B7E2C1A95902C000E1D17 /* RevoluteJoint.h in Headers */,\n\t\t\t\tFA8951A41AA2EDF300EC385A /* wrap_Event.h in Headers */,\n\t\t\t\tFA0B7B2A1A958EA3000E1D17 /* simplexnoise1234.h in Headers */,\n\t\t\t\tFA9D53AE1F5307E900125C6B /* Deprecations.h in Headers */,\n\t\t\t\tFA0B7ADC1A958EA3000E1D17 /* glad.hpp in Headers */,\n\t\t\t\tFA6A2B791F60B8250074C308 /* wrap_ByteData.h in Headers */,\n\t\t\t\tFA0B7CF91A95902C000E1D17 /* FileData.h in Headers */,\n\t\t\t\tFA0B7DA71A95902C000E1D17 /* PNGHandler.h in Headers */,\n\t\t\t\tFA0B7AC41A958EA3000E1D17 /* protocol.h in Headers */,\n\t\t\t\tFABDA97F2552448200B5C523 /* b2_polygon_circle_contact.h in Headers */,\n\t\t\t\tFAF140A21E20934C00F898D2 /* RemoveTree.h in Headers */,\n\t\t\t\tFAF6C9DE23C2DE2900D7B5BC /* SpvTools.h in Headers */,\n\t\t\t\tFABDA9E82552448300B5C523 /* b2_gear_joint.h in Headers */,\n\t\t\t\tFA0B7D321A95902C000E1D17 /* Graphics.h in Headers */,\n\t\t\t\tFA0B7E321A95902C000E1D17 /* Shape.h in Headers */,\n\t\t\t\tFA620A371AA2F8DB005DB4C2 /* wrap_Texture.h in Headers */,\n\t\t\t\tFA0B7DBA1A95902C000E1D17 /* JoystickModule.h in Headers */,\n\t\t\t\tFA0B7DEA1A95902C000E1D17 /* Mouse.h in Headers */,\n\t\t\t\tFA0B7E931A95902C000E1D17 /* ModPlugDecoder.h in Headers */,\n\t\t\t\tFA0B7D111A95902C000E1D17 /* BMFontRasterizer.h in Headers */,\n\t\t\t\t217DFBE61D9F6D490055D849 /* http.lua.h in Headers */,\n\t\t\t\tFACA06AE293EE5CD001A2557 /* Sensor.h in Headers */,\n\t\t\t\tFA18CF1D23DCF67900263725 /* sampler.hpp in Headers */,\n\t\t\t\tFA0B7E3E1A95902C000E1D17 /* wrap_Body.h in Headers */,\n\t\t\t\tFABDA9C92552448300B5C523 /* b2_distance.h in Headers */,\n\t\t\t\tFA24348921D401CB00B8918A /* pch.h in Headers */,\n\t\t\t\tFAF140991E20934C00F898D2 /* PpTokens.h in Headers */,\n\t\t\t\tFA84DE6827791C36002674C6 /* GraphicsReadback.h in Headers */,\n\t\t\t\tFAF1405B1E20934C00F898D2 /* InfoSink.h in Headers */,\n\t\t\t\tFA18CF2423DCF67900263725 /* spirv_cpp.hpp in Headers */,\n\t\t\t\tFA0B7B321A958EA3000E1D17 /* wuff.h in Headers */,\n\t\t\t\t217DFBF81D9F6D490055D849 /* pierror.h in Headers */,\n\t\t\t\t217DFC021D9F6D490055D849 /* tcp.h in Headers */,\n\t\t\t\tFA3C5E441F8C368C0003C579 /* ShaderStage.h in Headers */,\n\t\t\t\tFA0B79261A958E3B000E1D17 /* Exception.h in Headers */,\n\t\t\t\tD9DB6E402B4B41580037A1F6 /* GLSL.ext.ARM.h in Headers */,\n\t\t\t\tFA0B7D4D1A95902C000E1D17 /* Shader.h in Headers */,\n\t\t\t\tFA0B793D1A958E3B000E1D17 /* runtime.h in Headers */,\n\t\t\t\tFAF6C9E323C2DE2900D7B5BC /* GLSL.ext.AMD.h in Headers */,\n\t\t\t\tFA57FB9A1AE1993600F2AD6D /* noise1234.h in Headers */,\n\t\t\t\tD91C76152DE3D0A2001FC408 /* visibility.h in Headers */,\n\t\t\t\tFACA02EF1F5E396B0084B28F /* Compressor.h in Headers */,\n\t\t\t\tFA0B7CED1A95902C000E1D17 /* Event.h in Headers */,\n\t\t\t\tFA0B7D811A95902C000E1D17 /* Volatile.h in Headers */,\n\t\t\t\tFA0B7B2E1A958EA3000E1D17 /* unchecked.h in Headers */,\n\t\t\t\tFA0B7D081A95902C000E1D17 /* wrap_File.h in Headers */,\n\t\t\t\tFA0B79451A958E3B000E1D17 /* Variant.h in Headers */,\n\t\t\t\tFA0B7E5C1A95902C000E1D17 /* wrap_MotorJoint.h in Headers */,\n\t\t\t\tFA4F2BA91DE1E36400CA37D7 /* wrap_RecordingDevice.h in Headers */,\n\t\t\t\tFA4F2B7A1DE0125B00CA37D7 /* xxhash.h in Headers */,\n\t\t\t\tFA0B7DDE1A95902C000E1D17 /* wrap_BezierCurve.h in Headers */,\n\t\t\t\tFA0B7DED1A95902C000E1D17 /* Cursor.h in Headers */,\n\t\t\t\tFA28EBD71E352DB5003446F4 /* FenceSync.h in Headers */,\n\t\t\t\tFADF542C1E3DAADA00012CC0 /* wrap_Mesh.h in Headers */,\n\t\t\t\tFAA3A9B01B7D465A00CED060 /* android.h in Headers */,\n\t\t\t\t217DFBDE1D9F6D490055D849 /* compat.h in Headers */,\n\t\t\t\tFA0B79281A958E3B000E1D17 /* math.h in Headers */,\n\t\t\t\t217DFC121D9F6D490055D849 /* usocket.h in Headers */,\n\t\t\t\t217DFC081D9F6D490055D849 /* udp.h in Headers */,\n\t\t\t\tFA0B7DCF1A95902C000E1D17 /* wrap_Keyboard.h in Headers */,\n\t\t\t\tFA6BDF90281219E900240F2A /* DataStream.h in Headers */,\n\t\t\t\tFAF6C9DB23C2DE2900D7B5BC /* SpvBuilder.h in Headers */,\n\t\t\t\tFA0B7EA21A95902C000E1D17 /* Sound.h in Headers */,\n\t\t\t\tD9DB6E412B4B41580037A1F6 /* GLSL.ext.QCOM.h in Headers */,\n\t\t\t\tFA0B7B331A958EA3000E1D17 /* wuff_config.h in Headers */,\n\t\t\t\tFA0B7D3B1A95902C000E1D17 /* Graphics.h in Headers */,\n\t\t\t\tFA0B7E6E1A95902C000E1D17 /* wrap_RevoluteJoint.h in Headers */,\n\t\t\t\tFA27B3AC1B498151008A9DCE /* VideoStream.h in Headers */,\n\t\t\t\tFA0B7AC71A958EA3000E1D17 /* unix.h in Headers */,\n\t\t\t\tFA0B7E8D1A95902C000E1D17 /* FLACDecoder.h in Headers */,\n\t\t\t\t217DFC001D9F6D490055D849 /* socket.lua.h in Headers */,\n\t\t\t\tFA0B7DE71A95902C000E1D17 /* Cursor.h in Headers */,\n\t\t\t\t217DFBEC1D9F6D490055D849 /* ltn12.lua.h in Headers */,\n\t\t\t\tFA0B7DB61A95902C000E1D17 /* wrap_ImageData.h in Headers */,\n\t\t\t\tFADF543D1E3DAFF700012CC0 /* wrap_Graphics.h in Headers */,\n\t\t\t\t217DFBFE1D9F6D490055D849 /* socket.h in Headers */,\n\t\t\t\tFAF1409C1E20934C00F898D2 /* propagateNoContraction.h in Headers */,\n\t\t\t\tFA0B7D2D1A95902C000E1D17 /* wrap_Rasterizer.h in Headers */,\n\t\t\t\tFA0B7AB71A958EA3000E1D17 /* ddsparse.h in Headers */,\n\t\t\t\tFA0B7DA11A95902C000E1D17 /* KTXHandler.h in Headers */,\n\t\t\t\t217DFBE01D9F6D490055D849 /* except.h in Headers */,\n\t\t\t\tFA0B79311A958E3B000E1D17 /* Module.h in Headers */,\n\t\t\t\t217DFBF51D9F6D490055D849 /* mime.lua.h in Headers */,\n\t\t\t\tFAC7CD961FE755B4006A60C7 /* lz4opt.h in Headers */,\n\t\t\t\tFA9D8DD31DEB56C3002CD881 /* pixelformat.h in Headers */,\n\t\t\t\tFABDA9DE2552448300B5C523 /* b2_prismatic_joint.h in Headers */,\n\t\t\t\tFA84DE6B277943F6002674C6 /* GraphicsReadback.h in Headers */,\n\t\t\t\tFAF140A61E20934C00F898D2 /* ScanContext.h in Headers */,\n\t\t\t\tFABDA97B2552448200B5C523 /* b2_chain_polygon_contact.h in Headers */,\n\t\t\t\tFA0B7E4A1A95902C000E1D17 /* wrap_DistanceJoint.h in Headers */,\n\t\t\t\tFA0B7DE41A95902C000E1D17 /* wrap_RandomGenerator.h in Headers */,\n\t\t\t\tFAC8E55023B01C0D007B07C8 /* macos.h in Headers */,\n\t\t\t\tFA0B7E0B1A95902C000E1D17 /* EdgeShape.h in Headers */,\n\t\t\t\tFA0B7EDA1A95902D000E1D17 /* wrap_Timer.h in Headers */,\n\t\t\t\tFA0B7EB11A95902C000E1D17 /* System.h in Headers */,\n\t\t\t\tFA0B7E1A1A95902C000E1D17 /* MotorJoint.h in Headers */,\n\t\t\t\tFA0B7D441A95902C000E1D17 /* OpenGL.h in Headers */,\n\t\t\t\tFA0B7E081A95902C000E1D17 /* DistanceJoint.h in Headers */,\n\t\t\t\tFA0B7E711A95902C000E1D17 /* wrap_RopeJoint.h in Headers */,\n\t\t\t\tFA0B7E411A95902C000E1D17 /* wrap_ChainShape.h in Headers */,\n\t\t\t\tFA18CF1A23DCF67900263725 /* barrier.hpp in Headers */,\n\t\t\t\tFA0B7E171A95902C000E1D17 /* Joint.h in Headers */,\n\t\t\t\tFA94727E27A6EE1B00817677 /* PlaintextConnection.h in Headers */,\n\t\t\t\tFA0B793F1A958E3B000E1D17 /* types.h in Headers */,\n\t\t\t\tFABDA9BD2552448300B5C523 /* b2_stack_allocator.h in Headers */,\n\t\t\t\tFABDA9CF2552448300B5C523 /* b2_mouse_joint.h in Headers */,\n\t\t\t\tFABDA9E42552448300B5C523 /* b2_collision.h in Headers */,\n\t\t\t\tFA41A3CA1C0A1F950084430C /* ASTCHandler.h in Headers */,\n\t\t\t\tFADF54041E3D77B500012CC0 /* wrap_TextBatch.h in Headers */,\n\t\t\t\tFA0B7ED31A95902C000E1D17 /* wrap_ThreadModule.h in Headers */,\n\t\t\t\tFAB922C6257D99EF0035DAD6 /* Range.h in Headers */,\n\t\t\t\tFAC756F61E4F99B400B91289 /* Effect.h in Headers */,\n\t\t\t\tFA0B7ADD1A958EA3000E1D17 /* gladfuncs.hpp in Headers */,\n\t\t\t\tFAF1405D1E20934C00F898D2 /* intermediate.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\tFA0B78DC1A958B90000E1D17 /* liblove-ios */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = FA0B78EE1A958B90000E1D17 /* Build configuration list for PBXNativeTarget \"liblove-ios\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tFA0B78D91A958B90000E1D17 /* Sources */,\n\t\t\t\tFA0B78DA1A958B90000E1D17 /* Frameworks */,\n\t\t\t\tFA0B78DB1A958B90000E1D17 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"liblove-ios\";\n\t\t\tproductName = \"liblove-ios\";\n\t\t\tproductReference = FA0B78DD1A958B90000E1D17 /* liblove.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\tFA577AAE16C7507900860150 /* liblove-macosx */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = FA577ABF16C7507900860150 /* Build configuration list for PBXNativeTarget \"liblove-macosx\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tFA577AAA16C7507900860150 /* Sources */,\n\t\t\t\tFA577AAB16C7507900860150 /* Frameworks */,\n\t\t\t\tFA577AAC16C7507900860150 /* Headers */,\n\t\t\t\tFA577AAD16C7507900860150 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"liblove-macosx\";\n\t\t\tproductName = love;\n\t\t\tproductReference = FA577AAF16C7507900860150 /* love.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t08FB7793FE84155DC02AAC07 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 1340;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tFA0B78DC1A958B90000E1D17 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.1.1;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 1DEB928908733DD80010E9CD /* Build configuration list for PBXProject \"liblove\" */;\n\t\t\tcompatibilityVersion = \"Xcode 11.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 1;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 54067CFB7D564E5764FA17DC /* love */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tFA577AAE16C7507900860150 /* liblove-macosx */,\n\t\t\t\tFA0B78DC1A958B90000E1D17 /* liblove-ios */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tFA577AAD16C7507900860150 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD91C76132DE3D088001FC408 /* spirv.hpp11 in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tFA0B78D91A958B90000E1D17 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tFA0B7DE01A95902C000E1D17 /* wrap_Math.cpp in Sources */,\n\t\t\t\tFA0B7DA91A95902C000E1D17 /* PVRHandler.cpp in Sources */,\n\t\t\t\tFAE64A842071363100BC7981 /* physfs_archiver_iso9660.c in Sources */,\n\t\t\t\tFA0B7EC61A95902C000E1D17 /* ThreadModule.cpp in Sources */,\n\t\t\t\tFAC8E54B23AC8379007B07C8 /* wrap_NativeFile.cpp in Sources */,\n\t\t\t\tFA0B7D2C1A95902C000E1D17 /* wrap_Rasterizer.cpp in Sources */,\n\t\t\t\tFADF54081E3D78F700012CC0 /* Video.cpp in Sources */,\n\t\t\t\tFA9D8DD81DEF8411002CD881 /* Data.cpp in Sources */,\n\t\t\t\tFABDA9992552448300B5C523 /* b2_contact_manager.cpp in Sources */,\n\t\t\t\tFADF542B1E3DAADA00012CC0 /* wrap_Mesh.cpp in Sources */,\n\t\t\t\tFA0B7CD71A95902C000E1D17 /* Audio.cpp in Sources */,\n\t\t\t\tFA0B7AC01A958EA3000E1D17 /* host.c in Sources */,\n\t\t\t\tFA0B7EB01A95902C000E1D17 /* System.cpp in Sources */,\n\t\t\t\tFA0B7EE31A95902D000E1D17 /* Window.cpp in Sources */,\n\t\t\t\tFA0B7EC21A95902C000E1D17 /* threads.cpp in Sources */,\n\t\t\t\tFA4F2C051DE936C900CA37D7 /* compat.c in Sources */,\n\t\t\t\tFA4F2BE81DE6651000CA37D7 /* wrap_Transform.cpp in Sources */,\n\t\t\t\tFA0B7D011A95902C000E1D17 /* Filesystem.cpp in Sources */,\n\t\t\t\tFAF140651E20934C00F898D2 /* Constant.cpp in Sources */,\n\t\t\t\tFA0B7ED91A95902D000E1D17 /* wrap_Timer.cpp in Sources */,\n\t\t\t\tFAF1407D1E20934C00F898D2 /* linkValidate.cpp in Sources */,\n\t\t\t\tFAE64A872071363100BC7981 /* physfs_archiver_slb.c in Sources */,\n\t\t\t\tFAF6C9E723C2DE2900D7B5BC /* SpvBuilder.cpp in Sources */,\n\t\t\t\tFA0B7DD11A95902C000E1D17 /* love.cpp in Sources */,\n\t\t\t\tFABDA9B42552448300B5C523 /* b2_prismatic_joint.cpp in Sources */,\n\t\t\t\tFA15DFAF1F9B8D390042AB22 /* lstrlib.c in Sources */,\n\t\t\t\tFA0B7AB61A958EA3000E1D17 /* ddsparse.cpp in Sources */,\n\t\t\t\tFABDA9F42552448300B5C523 /* b2_chain_shape.cpp in Sources */,\n\t\t\t\tFA0B7D221A95902C000E1D17 /* Rasterizer.cpp in Sources */,\n\t\t\t\tFAF6C9E223C2DE2900D7B5BC /* InReadableOrder.cpp in Sources */,\n\t\t\t\tFAF140BC1E20934C00F898D2 /* ossource.cpp in Sources */,\n\t\t\t\tFA0B7D7D1A95902C000E1D17 /* Texture.cpp in Sources */,\n\t\t\t\tFACA02FB1F5E397E0084B28F /* HashFunction.cpp in Sources */,\n\t\t\t\tFAF140A81E20934C00F898D2 /* ShaderLang.cpp in Sources */,\n\t\t\t\tFA1BA09E1E16CFCE00AA2803 /* Font.cpp in Sources */,\n\t\t\t\tFABDA9A12552448300B5C523 /* b2_gear_joint.cpp in Sources */,\n\t\t\t\tD9DB6E372B4B41100037A1F6 /* ResourceLimits.cpp in Sources */,\n\t\t\t\tFAE64A8A2071363100BC7981 /* physfs_archiver_wad.c in Sources */,\n\t\t\t\tFA18CF4723DD1A8100263725 /* ShaderStage.mm in Sources */,\n\t\t\t\tFA0B7ECC1A95902C000E1D17 /* wrap_Channel.cpp in Sources */,\n\t\t\t\tFA0B7E6D1A95902C000E1D17 /* wrap_RevoluteJoint.cpp in Sources */,\n\t\t\t\tFA84DE7227795E22002674C6 /* wrap_GraphicsReadback.cpp in Sources */,\n\t\t\t\tFACA02FA1F5E397B0084B28F /* DataModule.cpp in Sources */,\n\t\t\t\tFA0B7E641A95902C000E1D17 /* wrap_PolygonShape.cpp in Sources */,\n\t\t\t\tFA4F2C031DE936C200CA37D7 /* auxiliar.c in Sources */,\n\t\t\t\tFA0B7E731A95902C000E1D17 /* wrap_Shape.cpp in Sources */,\n\t\t\t\tFA0B7CFE1A95902C000E1D17 /* File.cpp in Sources */,\n\t\t\t\tFA3C5E481F8D80CA0003C579 /* ShaderStage.cpp in Sources */,\n\t\t\t\tFA27B39E1B498151008A9DCE /* Video.cpp in Sources */,\n\t\t\t\tFA0B7E6A1A95902C000E1D17 /* wrap_PulleyJoint.cpp in Sources */,\n\t\t\t\tFA0B7DB81A95902C000E1D17 /* Joystick.cpp in Sources */,\n\t\t\t\tFA91DA8C1F377C3900C80E33 /* deprecation.cpp in Sources */,\n\t\t\t\tFABDA9B02552448300B5C523 /* b2_mouse_joint.cpp in Sources */,\n\t\t\t\tFA6A2B6B1F5F7F560074C308 /* DataView.cpp in Sources */,\n\t\t\t\tFA0B7E401A95902C000E1D17 /* wrap_ChainShape.cpp in Sources */,\n\t\t\t\tFABDA99F2552448300B5C523 /* b2_edge_circle_contact.cpp in Sources */,\n\t\t\t\tFA0B7DEC1A95902C000E1D17 /* Cursor.cpp in Sources */,\n\t\t\t\tFA18CF2B23DCF67900263725 /* spirv_cross_util.cpp in Sources */,\n\t\t\t\tFA0B7D871A95902C000E1D17 /* ImageData.cpp in Sources */,\n\t\t\t\tFA18CF3123DCF67900263725 /* spirv_hlsl.cpp in Sources */,\n\t\t\t\tFA0B7E101A95902C000E1D17 /* FrictionJoint.cpp in Sources */,\n\t\t\t\tFABDA9902552448300B5C523 /* b2_world_callbacks.cpp in Sources */,\n\t\t\t\tFABDA9A52552448300B5C523 /* b2_wheel_joint.cpp in Sources */,\n\t\t\t\tFAF140741E20934C00F898D2 /* intermOut.cpp in Sources */,\n\t\t\t\tFA620A361AA2F8DB005DB4C2 /* wrap_Texture.cpp in Sources */,\n\t\t\t\tFA0B7D0A1A95902C000E1D17 /* wrap_FileData.cpp in Sources */,\n\t\t\t\tFAF140781E20934C00F898D2 /* iomapper.cpp in Sources */,\n\t\t\t\tFA0B7ABE1A958EA3000E1D17 /* compress.c in Sources */,\n\t\t\t\tFABDA9AE2552448300B5C523 /* b2_island.cpp in Sources */,\n\t\t\t\tFA4F2C141DE936FE00CA37D7 /* usocket.c in Sources */,\n\t\t\t\tFAF140831E20934C00F898D2 /* ParseContextBase.cpp in Sources */,\n\t\t\t\tFA0B7AD21A958EA3000E1D17 /* protocol.c in Sources */,\n\t\t\t\tFAF140A41E20934C00F898D2 /* Scan.cpp in Sources */,\n\t\t\t\tFA0B7D1F1A95902C000E1D17 /* ImageRasterizer.cpp in Sources */,\n\t\t\t\tFABDA9C22552448300B5C523 /* b2_rope.cpp in Sources */,\n\t\t\t\tFAE64A952071365100BC7981 /* physfs_platform_qnx.c in Sources */,\n\t\t\t\tFABDA9FC2552448300B5C523 /* b2_collide_polygon.cpp in Sources */,\n\t\t\t\tFABDA9D12552448300B5C523 /* b2_draw.cpp in Sources */,\n\t\t\t\tFACA06B3293EE5CD001A2557 /* Sensor.cpp in Sources */,\n\t\t\t\tFA0B7EA41A95902C000E1D17 /* SoundData.cpp in Sources */,\n\t\t\t\tFAF1406A1E20934C00F898D2 /* glslang_tab.cpp in Sources */,\n\t\t\t\tFA8951A31AA2EDF300EC385A /* wrap_Event.cpp in Sources */,\n\t\t\t\tFADF540E1E3D7CDD00012CC0 /* wrap_Video.cpp in Sources */,\n\t\t\t\tFA0B7D4C1A95902C000E1D17 /* Shader.cpp in Sources */,\n\t\t\t\tFA0B792A1A958E3B000E1D17 /* Matrix.cpp in Sources */,\n\t\t\t\tD9DAB92B2961F10000C64820 /* GenericShaper.cpp in Sources */,\n\t\t\t\tFAF140981E20934C00F898D2 /* PpTokens.cpp in Sources */,\n\t\t\t\tFAF140AA1E20934C00F898D2 /* SymbolTable.cpp in Sources */,\n\t\t\t\tFABDA9892552448300B5C523 /* b2_contact.cpp in Sources */,\n\t\t\t\tFA3C5E431F8C368C0003C579 /* ShaderStage.cpp in Sources */,\n\t\t\t\tFA0B7E191A95902C000E1D17 /* MotorJoint.cpp in Sources */,\n\t\t\t\tFAF1406F1E20934C00F898D2 /* Initialize.cpp in Sources */,\n\t\t\t\tFA0B7EBF1A95902C000E1D17 /* Thread.cpp in Sources */,\n\t\t\t\tFACA02F91F5E39790084B28F /* Compressor.cpp in Sources */,\n\t\t\t\tFABDAA002552448300B5C523 /* b2_time_of_impact.cpp in Sources */,\n\t\t\t\tFAF140811E20934C00F898D2 /* parseConst.cpp in Sources */,\n\t\t\t\tFA18CF3623DCF67900263725 /* spirv_cross_parsed_ir.cpp in Sources */,\n\t\t\t\tFA0B7EB91A95902C000E1D17 /* Channel.cpp in Sources */,\n\t\t\t\tFA18CF2323DCF67900263725 /* spirv_cfg.cpp in Sources */,\n\t\t\t\tFAE64A962071365100BC7981 /* physfs_platform_windows.c in Sources */,\n\t\t\t\tFA4B66CA1ABBCF1900558F15 /* Timer.cpp in Sources */,\n\t\t\t\tFA94727927A6EE1B00817677 /* main.cpp in Sources */,\n\t\t\t\tFA0B7E921A95902C000E1D17 /* ModPlugDecoder.cpp in Sources */,\n\t\t\t\tFA0B7E521A95902C000E1D17 /* wrap_FrictionJoint.cpp in Sources */,\n\t\t\t\tFADF54351E3DAE6E00012CC0 /* wrap_SpriteBatch.cpp in Sources */,\n\t\t\t\tFA4F2BB51DE1E4C300CA37D7 /* wrap_RecordingDevice.cpp in Sources */,\n\t\t\t\tFA4F2C111DE936FE00CA37D7 /* unix.c in Sources */,\n\t\t\t\tFA1BA0A31E16D97500AA2803 /* wrap_Font.cpp in Sources */,\n\t\t\t\tFABDA9842552448200B5C523 /* b2_chain_polygon_contact.cpp in Sources */,\n\t\t\t\tFADF53FE1E3D74F200012CC0 /* TextBatch.cpp in Sources */,\n\t\t\t\tFA0B7D191A95902C000E1D17 /* TrueTypeRasterizer.cpp in Sources */,\n\t\t\t\tFAC271E723B5B5B400C200D3 /* renderstate.cpp in Sources */,\n\t\t\t\tFA84DE6727791C36002674C6 /* GraphicsReadback.cpp in Sources */,\n\t\t\t\tFA0B7CFB1A95902C000E1D17 /* Filesystem.cpp in Sources */,\n\t\t\t\tFABDA9F82552448300B5C523 /* b2_dynamic_tree.cpp in Sources */,\n\t\t\t\tFABDA98B2552448300B5C523 /* b2_revolute_joint.cpp in Sources */,\n\t\t\t\tFA0B7D3D1A95902C000E1D17 /* Texture.cpp in Sources */,\n\t\t\t\tFA0B7B351A958EA3000E1D17 /* wuff_convert.c in Sources */,\n\t\t\t\tFAF140941E20934C00F898D2 /* PpScanner.cpp in Sources */,\n\t\t\t\tFABDA9EC2552448300B5C523 /* b2_collide_circle.cpp in Sources */,\n\t\t\t\tFA9D53AD1F5307E900125C6B /* Deprecations.cpp in Sources */,\n\t\t\t\tFA84DE622778D7F3002674C6 /* SpirvIntrinsics.cpp in Sources */,\n\t\t\t\tFA0B7E431A95902C000E1D17 /* wrap_CircleShape.cpp in Sources */,\n\t\t\t\tFAFEB29D28F210550025D7D0 /* unixstream.c in Sources */,\n\t\t\t\tFAE64A912071364800BC7981 /* physfs.c in Sources */,\n\t\t\t\tFAE64A852071363100BC7981 /* physfs_archiver_mvl.c in Sources */,\n\t\t\t\tFA0B7CE61A95902C000E1D17 /* wrap_Source.cpp in Sources */,\n\t\t\t\tFA9D8DDE1DEF842A002CD881 /* Drawable.cpp in Sources */,\n\t\t\t\tFA0B7CCE1A95902C000E1D17 /* Audio.cpp in Sources */,\n\t\t\t\tFADF54031E3D77B500012CC0 /* wrap_TextBatch.cpp in Sources */,\n\t\t\t\tFA0B7DCB1A95902C000E1D17 /* Keyboard.cpp in Sources */,\n\t\t\t\tD9F0C2DD2C680A5500BB2D25 /* UnixLibraryLoader.cpp in Sources */,\n\t\t\t\tFA0B7DFB1A95902C000E1D17 /* Body.cpp in Sources */,\n\t\t\t\tFA0B7ED21A95902C000E1D17 /* wrap_ThreadModule.cpp in Sources */,\n\t\t\t\tFADF54261E3DA5BA00012CC0 /* Mesh.cpp in Sources */,\n\t\t\t\tFA0B7EE01A95902D000E1D17 /* wrap_Touch.cpp in Sources */,\n\t\t\t\tFA4F2C081DE936DD00CA37D7 /* io.c in Sources */,\n\t\t\t\tFA0B7CDD1A95902C000E1D17 /* Source.cpp in Sources */,\n\t\t\t\tFAF6C9EC23C2DE2900D7B5BC /* GlslangToSpv.cpp in Sources */,\n\t\t\t\tFA0B7DC51A95902C000E1D17 /* wrap_JoystickModule.cpp in Sources */,\n\t\t\t\tFA0B7E701A95902C000E1D17 /* wrap_RopeJoint.cpp in Sources */,\n\t\t\t\tFA18CF4023DCF67900263725 /* spirv_parser.cpp in Sources */,\n\t\t\t\tFA24348821D401CB00B8918A /* attribute.cpp in Sources */,\n\t\t\t\tFACA02FC1F5E39810084B28F /* wrap_CompressedData.cpp in Sources */,\n\t\t\t\tD9F0C2DA2C680A5500BB2D25 /* OpenSSLConnection.cpp in Sources */,\n\t\t\t\tFABDA9A32552448300B5C523 /* b2_friction_joint.cpp in Sources */,\n\t\t\t\tD9F0C2D52C680A5500BB2D25 /* CurlClient.cpp in Sources */,\n\t\t\t\tFAF140AD1E20934C00F898D2 /* Versions.cpp in Sources */,\n\t\t\t\tFA0B793C1A958E3B000E1D17 /* runtime.cpp in Sources */,\n\t\t\t\tFA6BDF8A280B62A000240F2A /* GraphicsReadback.mm in Sources */,\n\t\t\t\tFA0B7DBC1A95902C000E1D17 /* Joystick.cpp in Sources */,\n\t\t\t\tFA0B7DAF1A95902C000E1D17 /* wrap_CompressedImageData.cpp in Sources */,\n\t\t\t\tFA0B7AD51A958EA3000E1D17 /* unix.c in Sources */,\n\t\t\t\tD93660F92D1C727C00C0EC4B /* Touch.cpp in Sources */,\n\t\t\t\tFAB17BE71ABFAA9000F9BA27 /* lz4.c in Sources */,\n\t\t\t\tFAE64A902071364800BC7981 /* physfs_unicode.c in Sources */,\n\t\t\t\tFACA06B1293EE5CD001A2557 /* Sensor.cpp in Sources */,\n\t\t\t\tFA4F2BE71DE6650D00CA37D7 /* Transform.cpp in Sources */,\n\t\t\t\tFAF140A11E20934C00F898D2 /* RemoveTree.cpp in Sources */,\n\t\t\t\tFABDA9972552448300B5C523 /* b2_distance_joint.cpp in Sources */,\n\t\t\t\tFA0B7CDA1A95902C000E1D17 /* Pool.cpp in Sources */,\n\t\t\t\tFA0B7E161A95902C000E1D17 /* Joint.cpp in Sources */,\n\t\t\t\tFA0B7EE91A95902D000E1D17 /* wrap_Window.cpp in Sources */,\n\t\t\t\tFA1583E21E196180005E603B /* wrap_Shader.cpp in Sources */,\n\t\t\t\tD943E58F2A24D56000D80361 /* PhysfsIo.cpp in Sources */,\n\t\t\t\tFA0B7AB91A958EA3000E1D17 /* enet.cpp in Sources */,\n\t\t\t\tFA0B7E281A95902C000E1D17 /* PulleyJoint.cpp in Sources */,\n\t\t\t\tFA56AA391FAFF02000A43D5F /* memory.cpp in Sources */,\n\t\t\t\tFABDA98E2552448300B5C523 /* b2_contact_solver.cpp in Sources */,\n\t\t\t\tFAF1409E1E20934C00F898D2 /* reflection.cpp in Sources */,\n\t\t\t\tFA15DFAE1F9B8D360042AB22 /* lutf8lib.c in Sources */,\n\t\t\t\tFAF1408B1E20934C00F898D2 /* Pp.cpp in Sources */,\n\t\t\t\tFA76344B1E28722A0066EF9E /* StreamBuffer.cpp in Sources */,\n\t\t\t\tFA0B7E041A95902C000E1D17 /* Contact.cpp in Sources */,\n\t\t\t\tFA0B7D831A95902C000E1D17 /* CompressedImageData.cpp in Sources */,\n\t\t\t\tFA0B7B311A958EA3000E1D17 /* wuff.c in Sources */,\n\t\t\t\tFA0B7DF21A95902C000E1D17 /* wrap_Cursor.cpp in Sources */,\n\t\t\t\tFA0B7E011A95902C000E1D17 /* CircleShape.cpp in Sources */,\n\t\t\t\tFAE64A8C2071363100BC7981 /* physfs_byteorder.c in Sources */,\n\t\t\t\tFA0B7E461A95902C000E1D17 /* wrap_Contact.cpp in Sources */,\n\t\t\t\tFA94727C27A6EE1B00817677 /* HTTPSClient.cpp in Sources */,\n\t\t\t\tFA0B7D161A95902C000E1D17 /* Font.cpp in Sources */,\n\t\t\t\tFA0B7EB61A95902C000E1D17 /* wrap_System.cpp in Sources */,\n\t\t\t\tFA0B7DAC1A95902C000E1D17 /* STBHandler.cpp in Sources */,\n\t\t\t\tFADF53F91E3C7ACD00012CC0 /* Buffer.cpp in Sources */,\n\t\t\t\tFA0B79301A958E3B000E1D17 /* Module.cpp in Sources */,\n\t\t\t\tFAF1409B1E20934C00F898D2 /* propagateNoContraction.cpp in Sources */,\n\t\t\t\tFA0B7DDA1A95902C000E1D17 /* RandomGenerator.cpp in Sources */,\n\t\t\t\tFA2AF6751DAD64970032B62C /* vertex.cpp in Sources */,\n\t\t\t\tFAF140561E20934C00F898D2 /* Link.cpp in Sources */,\n\t\t\t\tFAF140851E20934C00F898D2 /* ParseHelper.cpp in Sources */,\n\t\t\t\tFA0B7D801A95902C000E1D17 /* Volatile.cpp in Sources */,\n\t\t\t\tFA1BA0B21E16FD0800AA2803 /* Shader.cpp in Sources */,\n\t\t\t\tFA0B7EBC1A95902C000E1D17 /* LuaThread.cpp in Sources */,\n\t\t\t\tFA0B7EF21A959D2C000E1D17 /* ios.mm in Sources */,\n\t\t\t\tFAE64A802071362A00BC7981 /* physfs_archiver_7z.c in Sources */,\n\t\t\t\tFABDA9942552448300B5C523 /* b2_polygon_circle_contact.cpp in Sources */,\n\t\t\t\tFA0B7D3A1A95902C000E1D17 /* Graphics.cpp in Sources */,\n\t\t\t\tFA4F2BB21DE1E4B400CA37D7 /* RecordingDevice.cpp in Sources */,\n\t\t\t\tFAE64A922071364B00BC7981 /* physfs_platform_winrt.cpp in Sources */,\n\t\t\t\tFABDA97A2552448200B5C523 /* b2_joint.cpp in Sources */,\n\t\t\t\tFA4F2C0F1DE936FE00CA37D7 /* timeout.c in Sources */,\n\t\t\t\tFA6BDF8F281219E900240F2A /* DataStream.cpp in Sources */,\n\t\t\t\tFA59A2D31C06481400328DBA /* ParticleSystem.cpp in Sources */,\n\t\t\t\tFA0B7E131A95902C000E1D17 /* GearJoint.cpp in Sources */,\n\t\t\t\tFABDA99B2552448300B5C523 /* b2_polygon_contact.cpp in Sources */,\n\t\t\t\tD9DAB9242961F0EE00C64820 /* HarfbuzzShaper.cpp in Sources */,\n\t\t\t\tFA0B7DC21A95902C000E1D17 /* wrap_Joystick.cpp in Sources */,\n\t\t\t\tFA0B7CD41A95902C000E1D17 /* Source.cpp in Sources */,\n\t\t\t\tFAA3A9AF1B7D465A00CED060 /* android.cpp in Sources */,\n\t\t\t\tFAE64A812071363100BC7981 /* physfs_archiver_dir.c in Sources */,\n\t\t\t\tFA18CEF023DC9B3E00263725 /* Texture.mm in Sources */,\n\t\t\t\tFA0B7CD11A95902C000E1D17 /* Audio.cpp in Sources */,\n\t\t\t\tFA4F2B7B1DE0181B00CA37D7 /* xxhash.c in Sources */,\n\t\t\t\tFA0B7D131A95902C000E1D17 /* Font.cpp in Sources */,\n\t\t\t\tFABDA9F62552448300B5C523 /* b2_broad_phase.cpp in Sources */,\n\t\t\t\tFA0B7EC91A95902C000E1D17 /* threads.cpp in Sources */,\n\t\t\t\tFAF1408D1E20934C00F898D2 /* PpAtom.cpp in Sources */,\n\t\t\t\tFABDA99D2552448300B5C523 /* b2_edge_polygon_contact.cpp in Sources */,\n\t\t\t\tFAF140721E20934C00F898D2 /* Intermediate.cpp in Sources */,\n\t\t\t\tFA41A3C91C0A1F950084430C /* ASTCHandler.cpp in Sources */,\n\t\t\t\tFA0B7E551A95902C000E1D17 /* wrap_GearJoint.cpp in Sources */,\n\t\t\t\tFA0B7E791A95902C000E1D17 /* wrap_WheelJoint.cpp in Sources */,\n\t\t\t\tFABDA9AC2552448300B5C523 /* b2_world.cpp in Sources */,\n\t\t\t\tFA0B7DDD1A95902C000E1D17 /* wrap_BezierCurve.cpp in Sources */,\n\t\t\t\tFA0A3A6123366CE9001C269E /* floattypes.cpp in Sources */,\n\t\t\t\tFA0B7D071A95902C000E1D17 /* wrap_File.cpp in Sources */,\n\t\t\t\tFA18CF3423DCF67900263725 /* spirv_cpp.cpp in Sources */,\n\t\t\t\tFABDA9D52552448300B5C523 /* b2_block_allocator.cpp in Sources */,\n\t\t\t\tFA6A2B751F60B6710074C308 /* ByteData.cpp in Sources */,\n\t\t\t\tFABDA9F02552448300B5C523 /* b2_collision.cpp in Sources */,\n\t\t\t\tFAD19A181DFF8CA200D5398A /* ImageDataBase.cpp in Sources */,\n\t\t\t\tFA0B7AD01A958EA3000E1D17 /* peer.c in Sources */,\n\t\t\t\tFA27B3C11B4985BF008A9DCE /* wrap_VideoStream.cpp in Sources */,\n\t\t\t\tFADF54211E3DA52C00012CC0 /* wrap_ParticleSystem.cpp in Sources */,\n\t\t\t\tFA0B791C1A958E3B000E1D17 /* b64.cpp in Sources */,\n\t\t\t\tFA1E88851DF363E100E808AA /* Filter.cpp in Sources */,\n\t\t\t\tFABDA9DB2552448300B5C523 /* b2_math.cpp in Sources */,\n\t\t\t\tFA0B7DA01A95902C000E1D17 /* KTXHandler.cpp in Sources */,\n\t\t\t\tFA0B7CEC1A95902C000E1D17 /* Event.cpp in Sources */,\n\t\t\t\tFA27B3AB1B498151008A9DCE /* VideoStream.cpp in Sources */,\n\t\t\t\tFA94728227A6EE1B00817677 /* HTTPS.cpp in Sources */,\n\t\t\t\tFA0B7E581A95902C000E1D17 /* wrap_Joint.cpp in Sources */,\n\t\t\t\tFAECA1B51F31648A0095D008 /* FormatHandler.cpp in Sources */,\n\t\t\t\tFA4F2C0A1DE936E600CA37D7 /* mime.c in Sources */,\n\t\t\t\tFA0B7E311A95902C000E1D17 /* Shape.cpp in Sources */,\n\t\t\t\tFA0B7E491A95902C000E1D17 /* wrap_DistanceJoint.cpp in Sources */,\n\t\t\t\tFA4F2C101DE936FE00CA37D7 /* udp.c in Sources */,\n\t\t\t\tFAF6C9E023C2DE2900D7B5BC /* SpvTools.cpp in Sources */,\n\t\t\t\tFAE64A8F2071364200BC7981 /* physfs_platform_unix.c in Sources */,\n\t\t\t\tFA94729C27A6F9AD00817677 /* NSURLClient.mm in Sources */,\n\t\t\t\tFA94728927A6EE1B00817677 /* HTTPRequest.cpp in Sources */,\n\t\t\t\tFA18CEC623D3AE6800263725 /* wrap_Buffer.cpp in Sources */,\n\t\t\t\tFA0B7E2B1A95902C000E1D17 /* RevoluteJoint.cpp in Sources */,\n\t\t\t\tFA0B7B291A958EA3000E1D17 /* simplexnoise1234.cpp in Sources */,\n\t\t\t\tFA0B7D261A95902C000E1D17 /* wrap_Font.cpp in Sources */,\n\t\t\t\tFA4F2BB31DE1E4B800CA37D7 /* RecordingDevice.cpp in Sources */,\n\t\t\t\tFABDA9A82552448300B5C523 /* b2_motor_joint.cpp in Sources */,\n\t\t\t\tFA4F2C071DE936DA00CA37D7 /* inet.c in Sources */,\n\t\t\t\tFAE64A8B2071363100BC7981 /* physfs_archiver_zip.c in Sources */,\n\t\t\t\tFA4F2C0B1DE936EA00CA37D7 /* options.c in Sources */,\n\t\t\t\tFA4F2C0D1DE936F100CA37D7 /* serial.c in Sources */,\n\t\t\t\tFABDA9922552448300B5C523 /* b2_pulley_joint.cpp in Sources */,\n\t\t\t\tFA0B7E0A1A95902C000E1D17 /* EdgeShape.cpp in Sources */,\n\t\t\t\tFADF54301E3DABF600012CC0 /* SpriteBatch.cpp in Sources */,\n\t\t\t\tFA0B7CF81A95902C000E1D17 /* FileData.cpp in Sources */,\n\t\t\t\tFA0B7DA61A95902C000E1D17 /* PNGHandler.cpp in Sources */,\n\t\t\t\tFAF6C9F523C2DE2900D7B5BC /* Logger.cpp in Sources */,\n\t\t\t\tFA84DE6D277943F6002674C6 /* GraphicsReadback.cpp in Sources */,\n\t\t\t\tFAE64A932071365100BC7981 /* physfs_platform_haiku.cpp in Sources */,\n\t\t\t\tFA0B7E981A95902C000E1D17 /* Sound.cpp in Sources */,\n\t\t\t\tFA0B7E371A95902C000E1D17 /* WheelJoint.cpp in Sources */,\n\t\t\t\tFA4F2C0C1DE936ED00CA37D7 /* select.c in Sources */,\n\t\t\t\tFA0B7D8E1A95902C000E1D17 /* ddsHandler.cpp in Sources */,\n\t\t\t\tFA0B7DFE1A95902C000E1D17 /* ChainShape.cpp in Sources */,\n\t\t\t\tFAFEB29A28F210550025D7D0 /* unixdgram.c in Sources */,\n\t\t\t\tFAE64A892071363100BC7981 /* physfs_archiver_vdf.c in Sources */,\n\t\t\t\tFA15DFB21F9B8D840042AB22 /* TheoraVideoStream.cpp in Sources */,\n\t\t\t\tFAF1406D1E20934C00F898D2 /* InfoSink.cpp in Sources */,\n\t\t\t\tFAF1407B1E20934C00F898D2 /* limits.cpp in Sources */,\n\t\t\t\tFA0B7ABB1A958EA3000E1D17 /* callbacks.c in Sources */,\n\t\t\t\tFA0B7EAA1A95902C000E1D17 /* wrap_Sound.cpp in Sources */,\n\t\t\t\tFA0B79391A958E3B000E1D17 /* Reference.cpp in Sources */,\n\t\t\t\tFA620A331AA2F8DB005DB4C2 /* wrap_Quad.cpp in Sources */,\n\t\t\t\tFA0B7E071A95902C000E1D17 /* DistanceJoint.cpp in Sources */,\n\t\t\t\tFA18CEEA23DBC8D400263725 /* Buffer.mm in Sources */,\n\t\t\t\tFADF543C1E3DAFF700012CC0 /* wrap_Graphics.cpp in Sources */,\n\t\t\t\tFAE64A942071365100BC7981 /* physfs_platform_os2.c in Sources */,\n\t\t\t\tFA0B7E5E1A95902C000E1D17 /* wrap_MouseJoint.cpp in Sources */,\n\t\t\t\tFA0B7B3B1A958EA3000E1D17 /* wuff_memory.c in Sources */,\n\t\t\t\tFA0B79411A958E3B000E1D17 /* utf8.cpp in Sources */,\n\t\t\t\tFAE64A862071363100BC7981 /* physfs_archiver_qpak.c in Sources */,\n\t\t\t\tFA0B7ADF1A958EA3000E1D17 /* lodepng.cpp in Sources */,\n\t\t\t\tFAF140761E20934C00F898D2 /* IntermTraverse.cpp in Sources */,\n\t\t\t\tFA0B7E8C1A95902C000E1D17 /* FLACDecoder.cpp in Sources */,\n\t\t\t\tFA18CF2923DCF67900263725 /* spirv_msl.cpp in Sources */,\n\t\t\t\tFA0B7D491A95902C000E1D17 /* Polyline.cpp in Sources */,\n\t\t\t\tFA0B7CE31A95902C000E1D17 /* wrap_Audio.cpp in Sources */,\n\t\t\t\tFA0B7B381A958EA3000E1D17 /* wuff_internal.c in Sources */,\n\t\t\t\tFA0B7DF81A95902C000E1D17 /* Body.cpp in Sources */,\n\t\t\t\tFABDA9EE2552448300B5C523 /* b2_circle_shape.cpp in Sources */,\n\t\t\t\tFA4F2BB41DE1E4BD00CA37D7 /* RecordingDevice.cpp in Sources */,\n\t\t\t\tFA0B7DF51A95902C000E1D17 /* wrap_Mouse.cpp in Sources */,\n\t\t\t\tFA0B7E861A95902C000E1D17 /* CoreAudioDecoder.cpp in Sources */,\n\t\t\t\tFACA06AD293EE5CD001A2557 /* wrap_Sensor.cpp in Sources */,\n\t\t\t\tFA0B7E761A95902C000E1D17 /* wrap_WeldJoint.cpp in Sources */,\n\t\t\t\tFA0B7D561A95902C000E1D17 /* Buffer.cpp in Sources */,\n\t\t\t\tFA1557C51CE90BD900AFF582 /* EXRHandler.cpp in Sources */,\n\t\t\t\tFA57FB991AE1993600F2AD6D /* noise1234.cpp in Sources */,\n\t\t\t\tFA0B7E221A95902C000E1D17 /* PolygonShape.cpp in Sources */,\n\t\t\t\tFA18CEE223DBC6E000263725 /* Graphics.mm in Sources */,\n\t\t\t\tFA28EBD61E352DB5003446F4 /* FenceSync.cpp in Sources */,\n\t\t\t\tFA0B7DA31A95902C000E1D17 /* PKMHandler.cpp in Sources */,\n\t\t\t\tFAB17BF61ABFC4B100F9BA27 /* lz4hc.c in Sources */,\n\t\t\t\tFAF1408F1E20934C00F898D2 /* PpContext.cpp in Sources */,\n\t\t\t\tFA0B7EA71A95902C000E1D17 /* wrap_Decoder.cpp in Sources */,\n\t\t\t\tFA0B7E1C1A95902C000E1D17 /* MouseJoint.cpp in Sources */,\n\t\t\t\tFA29C0061E12355B00268CD8 /* StreamBuffer.cpp in Sources */,\n\t\t\t\tFABDA9B62552448300B5C523 /* b2_fixture.cpp in Sources */,\n\t\t\t\tFAE64A882071363100BC7981 /* physfs_archiver_unpacked.c in Sources */,\n\t\t\t\tFA94728627A6EE1B00817677 /* PlaintextConnection.cpp in Sources */,\n\t\t\t\tFA18CEDF23DBC6E000263725 /* Shader.mm in Sources */,\n\t\t\t\tFA0B7CF51A95902C000E1D17 /* File.cpp in Sources */,\n\t\t\t\tFA0B7E341A95902C000E1D17 /* WeldJoint.cpp in Sources */,\n\t\t\t\tFA4F2C091DE936E200CA37D7 /* luasocket.c in Sources */,\n\t\t\t\tFA9D8DD21DEB56C3002CD881 /* pixelformat.cpp in Sources */,\n\t\t\t\tFA0B7B221A958EA3000E1D17 /* luasocket.cpp in Sources */,\n\t\t\t\tFA0B7D311A95902C000E1D17 /* Graphics.cpp in Sources */,\n\t\t\t\tFA0B7E9E1A95902C000E1D17 /* WaveDecoder.cpp in Sources */,\n\t\t\t\tFA0B7EB31A95902C000E1D17 /* System.cpp in Sources */,\n\t\t\t\tFA522D4E23F9FE380059EE3C /* MP3Decoder.cpp in Sources */,\n\t\t\t\tFA0B7D1C1A95902C000E1D17 /* GlyphData.cpp in Sources */,\n\t\t\t\tFA4F2C061DE936CD00CA37D7 /* except.c in Sources */,\n\t\t\t\tFABDA9B22552448300B5C523 /* b2_circle_contact.cpp in Sources */,\n\t\t\t\tFABDA9822552448200B5C523 /* b2_weld_joint.cpp in Sources */,\n\t\t\t\tFA15DFB01F9B8D6A0042AB22 /* wrap_Data.cpp in Sources */,\n\t\t\t\tFA0B7E671A95902C000E1D17 /* wrap_PrismaticJoint.cpp in Sources */,\n\t\t\t\tFA0B7DCE1A95902C000E1D17 /* wrap_Keyboard.cpp in Sources */,\n\t\t\t\tFABDA9D32552448300B5C523 /* b2_timer.cpp in Sources */,\n\t\t\t\tFA0B7EE61A95902D000E1D17 /* Window.cpp in Sources */,\n\t\t\t\tFA0B7E3A1A95902C000E1D17 /* World.cpp in Sources */,\n\t\t\t\tFA18CF2D23DCF67900263725 /* spirv_cross.cpp in Sources */,\n\t\t\t\tFA0B79471A958E3B000E1D17 /* Vector.cpp in Sources */,\n\t\t\t\tFAE64A832071363100BC7981 /* physfs_archiver_hog.c in Sources */,\n\t\t\t\tFAC756F71E4F99BC00B91289 /* Effect.cpp in Sources */,\n\t\t\t\tFA0B7E7F1A95902C000E1D17 /* Joint.cpp in Sources */,\n\t\t\t\tFABDA9D92552448300B5C523 /* b2_settings.cpp in Sources */,\n\t\t\t\tFA0B7DB21A95902C000E1D17 /* wrap_Image.cpp in Sources */,\n\t\t\t\tFA0B7E891A95902C000E1D17 /* Decoder.cpp in Sources */,\n\t\t\t\tD9F0C2D82C680A5500BB2D25 /* LinktimeLibraryLoader.cpp in Sources */,\n\t\t\t\tFAECA1B31F3164700095D008 /* CompressedSlice.cpp in Sources */,\n\t\t\t\tFA18CF1823DCF67900263725 /* spirv_glsl.cpp in Sources */,\n\t\t\t\tFA0B7E3D1A95902C000E1D17 /* wrap_Body.cpp in Sources */,\n\t\t\t\tFABDA9FE2552448300B5C523 /* b2_edge_shape.cpp in Sources */,\n\t\t\t\tFA0B7D7A1A95902C000E1D17 /* Quad.cpp in Sources */,\n\t\t\t\tFA620A3B1AA305F6005DB4C2 /* types.cpp in Sources */,\n\t\t\t\tD9DAB92E2961F10000C64820 /* TextShaper.cpp in Sources */,\n\t\t\t\tFA0B7DD41A95902C000E1D17 /* BezierCurve.cpp in Sources */,\n\t\t\t\tFA0B7E7C1A95902C000E1D17 /* wrap_World.cpp in Sources */,\n\t\t\t\tFAF6C9F923C2DE2900D7B5BC /* doc.cpp in Sources */,\n\t\t\t\tFA4F2C0E1DE936FE00CA37D7 /* tcp.c in Sources */,\n\t\t\t\tFA0B7D431A95902C000E1D17 /* OpenGL.cpp in Sources */,\n\t\t\t\tFAF6C9DD23C2DE2900D7B5BC /* SpvPostProcess.cpp in Sources */,\n\t\t\t\tFA0B7DBF1A95902C000E1D17 /* JoystickModule.cpp in Sources */,\n\t\t\t\tFAB2D5AB1AABDD8A008224A4 /* TrueTypeRasterizer.cpp in Sources */,\n\t\t\t\tFAF6C9FB23C2DE2900D7B5BC /* disassemble.cpp in Sources */,\n\t\t\t\tFA18CEDD23DBC6E000263725 /* Metal.mm in Sources */,\n\t\t\t\tFAE64A822071363100BC7981 /* physfs_archiver_grp.c in Sources */,\n\t\t\t\tFAF6C9F323C2DE2900D7B5BC /* SPVRemapper.cpp in Sources */,\n\t\t\t\tFA0B79331A958E3B000E1D17 /* Object.cpp in Sources */,\n\t\t\t\tFAE64A8D2071363500BC7981 /* physfs_platform_apple.m in Sources */,\n\t\t\t\tFA0B7E5B1A95902C000E1D17 /* wrap_MotorJoint.cpp in Sources */,\n\t\t\t\tFA18CF2723DCF67900263725 /* spirv_reflect.cpp in Sources */,\n\t\t\t\tFA0B79441A958E3B000E1D17 /* Variant.cpp in Sources */,\n\t\t\t\tFA9D8DDA1DEF8411002CD881 /* Stream.cpp in Sources */,\n\t\t\t\tFA0B7DD71A95902C000E1D17 /* MathModule.cpp in Sources */,\n\t\t\t\tFAC756FC1E4F99DB00B91289 /* Effect.cpp in Sources */,\n\t\t\t\tFA0B7D101A95902C000E1D17 /* BMFontRasterizer.cpp in Sources */,\n\t\t\t\tFA0B7E9B1A95902C000E1D17 /* VorbisDecoder.cpp in Sources */,\n\t\t\t\tFA0B7E4C1A95902C000E1D17 /* wrap_EdgeShape.cpp in Sources */,\n\t\t\t\tFA0B7E251A95902C000E1D17 /* PrismaticJoint.cpp in Sources */,\n\t\t\t\tFA0B7E611A95902C000E1D17 /* wrap_Physics.cpp in Sources */,\n\t\t\t\tFA4F2C041DE936C600CA37D7 /* buffer.c in Sources */,\n\t\t\t\tFA0B7DC81A95902C000E1D17 /* Keyboard.cpp in Sources */,\n\t\t\t\tFA0B7EAD1A95902C000E1D17 /* wrap_SoundData.cpp in Sources */,\n\t\t\t\tFA0B7E2E1A95902C000E1D17 /* RopeJoint.cpp in Sources */,\n\t\t\t\tFABDA9F22552448300B5C523 /* b2_collide_edge.cpp in Sources */,\n\t\t\t\tFA0B7CE01A95902C000E1D17 /* Source.cpp in Sources */,\n\t\t\t\tFA18CED923DBC6E000263725 /* StreamBuffer.mm in Sources */,\n\t\t\t\tFA0B7ECF1A95902C000E1D17 /* wrap_LuaThread.cpp in Sources */,\n\t\t\t\tFA0B7EA11A95902C000E1D17 /* Sound.cpp in Sources */,\n\t\t\t\tFA0B7DE61A95902C000E1D17 /* Cursor.cpp in Sources */,\n\t\t\t\tFA6A2B711F5F845F0074C308 /* wrap_DataView.cpp in Sources */,\n\t\t\t\tFA0B7EDC1A95902D000E1D17 /* Touch.cpp in Sources */,\n\t\t\t\tFA0B7CE91A95902C000E1D17 /* Event.cpp in Sources */,\n\t\t\t\tFABDA97D2552448200B5C523 /* b2_chain_circle_contact.cpp in Sources */,\n\t\t\t\tFA9D8DE11DEF843D002CD881 /* Image.cpp in Sources */,\n\t\t\t\tFAC8E54723AC832A007B07C8 /* NativeFile.cpp in Sources */,\n\t\t\t\tFA15DFAD1F9B8CBA0042AB22 /* StringMap.cpp in Sources */,\n\t\t\t\tFACA02F81F5E39760084B28F /* CompressedData.cpp in Sources */,\n\t\t\t\tFA0B7ADA1A958EA3000E1D17 /* glad.cpp in Sources */,\n\t\t\t\tFAF140541E20934C00F898D2 /* CodeGen.cpp in Sources */,\n\t\t\t\tFA0B7E1F1A95902C000E1D17 /* Physics.cpp in Sources */,\n\t\t\t\tFA6A2B7B1F60B8250074C308 /* wrap_ByteData.cpp in Sources */,\n\t\t\t\tFA0B7E821A95902C000E1D17 /* Shape.cpp in Sources */,\n\t\t\t\tFAAC2F7A251A9D2200BCB81B /* apple.mm in Sources */,\n\t\t\t\tFA0B7ACE1A958EA3000E1D17 /* packet.c in Sources */,\n\t\t\t\tFABDA9872552448200B5C523 /* b2_body.cpp in Sources */,\n\t\t\t\tFAF140891E20934C00F898D2 /* PoolAlloc.cpp in Sources */,\n\t\t\t\tFABDA9FA2552448300B5C523 /* b2_polygon_shape.cpp in Sources */,\n\t\t\t\tFA27B3B41B498151008A9DCE /* wrap_Video.cpp in Sources */,\n\t\t\t\tFA1E88801DF363D400E808AA /* Filter.cpp in Sources */,\n\t\t\t\tFABDAA022552448300B5C523 /* b2_distance.cpp in Sources */,\n\t\t\t\tFA0B7ACC1A958EA3000E1D17 /* list.c in Sources */,\n\t\t\t\tFACA02FD1F5E39840084B28F /* wrap_DataModule.cpp in Sources */,\n\t\t\t\tFA0B7DEF1A95902C000E1D17 /* Mouse.cpp in Sources */,\n\t\t\t\tFABDA9D72552448300B5C523 /* b2_stack_allocator.cpp in Sources */,\n\t\t\t\tFA0B79251A958E3B000E1D17 /* Exception.cpp in Sources */,\n\t\t\t\tFA0B7D291A95902C000E1D17 /* wrap_GlyphData.cpp in Sources */,\n\t\t\t\tFA0B7DE31A95902C000E1D17 /* wrap_RandomGenerator.cpp in Sources */,\n\t\t\t\tFAE64A8E2071363A00BC7981 /* physfs_platform_posix.c in Sources */,\n\t\t\t\tFA0B7AD71A958EA3000E1D17 /* win32.c in Sources */,\n\t\t\t\tFA15DFB11F9B8D820042AB22 /* OggDemuxer.cpp in Sources */,\n\t\t\t\tFA0B7D0D1A95902C000E1D17 /* wrap_Filesystem.cpp in Sources */,\n\t\t\t\tFA0B79211A958E3B000E1D17 /* delay.cpp in Sources */,\n\t\t\t\tFA0B7DB51A95902C000E1D17 /* wrap_ImageData.cpp in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tFA577AAA16C7507900860150 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t217DFBDD1D9F6D490055D849 /* compat.c in Sources */,\n\t\t\t\tFA0B7DDF1A95902C000E1D17 /* wrap_Math.cpp in Sources */,\n\t\t\t\tFA0B7DA81A95902C000E1D17 /* PVRHandler.cpp in Sources */,\n\t\t\t\tFA0B7EC51A95902C000E1D17 /* ThreadModule.cpp in Sources */,\n\t\t\t\tFAC8E54A23AC8379007B07C8 /* wrap_NativeFile.cpp in Sources */,\n\t\t\t\tFADF54071E3D78F700012CC0 /* Video.cpp in Sources */,\n\t\t\t\t217DFC031D9F6D490055D849 /* timeout.c in Sources */,\n\t\t\t\tFA18CF2623DCF67900263725 /* spirv_reflect.cpp in Sources */,\n\t\t\t\tFA9D8DD71DEF8411002CD881 /* Data.cpp in Sources */,\n\t\t\t\tFABDA9982552448300B5C523 /* b2_contact_manager.cpp in Sources */,\n\t\t\t\tFADF542A1E3DAADA00012CC0 /* wrap_Mesh.cpp in Sources */,\n\t\t\t\tFA0B7D2B1A95902C000E1D17 /* wrap_Rasterizer.cpp in Sources */,\n\t\t\t\tFA0B7CD61A95902C000E1D17 /* Audio.cpp in Sources */,\n\t\t\t\tFA3C5E421F8C368C0003C579 /* ShaderStage.cpp in Sources */,\n\t\t\t\tFA0B7EAF1A95902C000E1D17 /* System.cpp in Sources */,\n\t\t\t\tFA0B7EE21A95902D000E1D17 /* Window.cpp in Sources */,\n\t\t\t\tFAF6C9E123C2DE2900D7B5BC /* InReadableOrder.cpp in Sources */,\n\t\t\t\tFA0B791B1A958E3B000E1D17 /* b64.cpp in Sources */,\n\t\t\t\tFA0B7EC11A95902C000E1D17 /* threads.cpp in Sources */,\n\t\t\t\tFA0B79321A958E3B000E1D17 /* Object.cpp in Sources */,\n\t\t\t\tFA0B7D001A95902C000E1D17 /* Filesystem.cpp in Sources */,\n\t\t\t\tFAF140641E20934C00F898D2 /* Constant.cpp in Sources */,\n\t\t\t\tFA0B7ED81A95902D000E1D17 /* wrap_Timer.cpp in Sources */,\n\t\t\t\tFAF1407C1E20934C00F898D2 /* linkValidate.cpp in Sources */,\n\t\t\t\tFAF6C9DC23C2DE2900D7B5BC /* SpvPostProcess.cpp in Sources */,\n\t\t\t\tFABDA9B32552448300B5C523 /* b2_prismatic_joint.cpp in Sources */,\n\t\t\t\tFA0B7DD01A95902C000E1D17 /* love.cpp in Sources */,\n\t\t\t\tFA0B7D211A95902C000E1D17 /* Rasterizer.cpp in Sources */,\n\t\t\t\tFABDA9F32552448300B5C523 /* b2_chain_shape.cpp in Sources */,\n\t\t\t\tFAC7CD7C1FE35E95006A60C7 /* physfs_archiver_slb.c in Sources */,\n\t\t\t\tFAF6C9FA23C2DE2900D7B5BC /* disassemble.cpp in Sources */,\n\t\t\t\tFA18CF2C23DCF67900263725 /* spirv_cross.cpp in Sources */,\n\t\t\t\tFAC7CD931FE35E95006A60C7 /* physfs_archiver_zip.c in Sources */,\n\t\t\t\tFA0B7D7C1A95902C000E1D17 /* Texture.cpp in Sources */,\n\t\t\t\tFAF140BB1E20934C00F898D2 /* ossource.cpp in Sources */,\n\t\t\t\tFA0B7ECB1A95902C000E1D17 /* wrap_Channel.cpp in Sources */,\n\t\t\t\tD9DB6E362B4B41100037A1F6 /* ResourceLimits.cpp in Sources */,\n\t\t\t\tFACA02F21F5E396B0084B28F /* HashFunction.cpp in Sources */,\n\t\t\t\tFABDA9A02552448300B5C523 /* b2_gear_joint.cpp in Sources */,\n\t\t\t\tFAF140A71E20934C00F898D2 /* ShaderLang.cpp in Sources */,\n\t\t\t\tFAC271E623B5B5B400C200D3 /* renderstate.cpp in Sources */,\n\t\t\t\tFA1BA09D1E16CFCE00AA2803 /* Font.cpp in Sources */,\n\t\t\t\tFA84DE7127795E22002674C6 /* wrap_GraphicsReadback.cpp in Sources */,\n\t\t\t\tFA0B7E6C1A95902C000E1D17 /* wrap_RevoluteJoint.cpp in Sources */,\n\t\t\t\tFA0B7E631A95902C000E1D17 /* wrap_PolygonShape.cpp in Sources */,\n\t\t\t\tFAC7CD7B1FE35E95006A60C7 /* physfs_platform_unix.c in Sources */,\n\t\t\t\tFACA02F01F5E396B0084B28F /* DataModule.cpp in Sources */,\n\t\t\t\tFA0B7E721A95902C000E1D17 /* wrap_Shape.cpp in Sources */,\n\t\t\t\tFA0B7CFD1A95902C000E1D17 /* File.cpp in Sources */,\n\t\t\t\tFA4F2BB01DE1E37B00CA37D7 /* RecordingDevice.cpp in Sources */,\n\t\t\t\tFAC7CD911FE35E95006A60C7 /* physfs_archiver_grp.c in Sources */,\n\t\t\t\tFA27B39D1B498151008A9DCE /* Video.cpp in Sources */,\n\t\t\t\tFA15DFAC1F9B8C850042AB22 /* StringMap.cpp in Sources */,\n\t\t\t\tFABDA9AF2552448300B5C523 /* b2_mouse_joint.cpp in Sources */,\n\t\t\t\tFA4F2BAC1DE1E37000CA37D7 /* RecordingDevice.cpp in Sources */,\n\t\t\t\tFA0B7E691A95902C000E1D17 /* wrap_PulleyJoint.cpp in Sources */,\n\t\t\t\tFA18CF2223DCF67900263725 /* spirv_cfg.cpp in Sources */,\n\t\t\t\tFABDA99E2552448300B5C523 /* b2_edge_circle_contact.cpp in Sources */,\n\t\t\t\tFA0B7DB71A95902C000E1D17 /* Joystick.cpp in Sources */,\n\t\t\t\tFA91DA8B1F377C3900C80E33 /* deprecation.cpp in Sources */,\n\t\t\t\tFA0B7E3F1A95902C000E1D17 /* wrap_ChainShape.cpp in Sources */,\n\t\t\t\tFA18CF3023DCF67900263725 /* spirv_hlsl.cpp in Sources */,\n\t\t\t\tFABDA98F2552448300B5C523 /* b2_world_callbacks.cpp in Sources */,\n\t\t\t\tFABDA9A42552448300B5C523 /* b2_wheel_joint.cpp in Sources */,\n\t\t\t\tFA0B7DEB1A95902C000E1D17 /* Cursor.cpp in Sources */,\n\t\t\t\tFA0B7D861A95902C000E1D17 /* ImageData.cpp in Sources */,\n\t\t\t\tFAF140731E20934C00F898D2 /* intermOut.cpp in Sources */,\n\t\t\t\tFA0B7E0F1A95902C000E1D17 /* FrictionJoint.cpp in Sources */,\n\t\t\t\tFA620A351AA2F8DB005DB4C2 /* wrap_Texture.cpp in Sources */,\n\t\t\t\tFABDA9AD2552448300B5C523 /* b2_island.cpp in Sources */,\n\t\t\t\tFAF140771E20934C00F898D2 /* iomapper.cpp in Sources */,\n\t\t\t\tFA0B7D091A95902C000E1D17 /* wrap_FileData.cpp in Sources */,\n\t\t\t\tFA18CEDC23DBC6E000263725 /* Metal.mm in Sources */,\n\t\t\t\tFA0B7B341A958EA3000E1D17 /* wuff_convert.c in Sources */,\n\t\t\t\tFAF140821E20934C00F898D2 /* ParseContextBase.cpp in Sources */,\n\t\t\t\tFAF6C9E623C2DE2900D7B5BC /* SpvBuilder.cpp in Sources */,\n\t\t\t\tFABDA9C12552448300B5C523 /* b2_rope.cpp in Sources */,\n\t\t\t\tFA0B7D1E1A95902C000E1D17 /* ImageRasterizer.cpp in Sources */,\n\t\t\t\tFACA06B2293EE5CD001A2557 /* Sensor.cpp in Sources */,\n\t\t\t\tFABDA9FB2552448300B5C523 /* b2_collide_polygon.cpp in Sources */,\n\t\t\t\tFABDA9D02552448300B5C523 /* b2_draw.cpp in Sources */,\n\t\t\t\tFAF140A31E20934C00F898D2 /* Scan.cpp in Sources */,\n\t\t\t\tFA0B7EA31A95902C000E1D17 /* SoundData.cpp in Sources */,\n\t\t\t\tFA0B79291A958E3B000E1D17 /* Matrix.cpp in Sources */,\n\t\t\t\tFA8951A21AA2EDF300EC385A /* wrap_Event.cpp in Sources */,\n\t\t\t\tD9DAB92A2961F10000C64820 /* GenericShaper.cpp in Sources */,\n\t\t\t\tFAF140691E20934C00F898D2 /* glslang_tab.cpp in Sources */,\n\t\t\t\tFA0B7ABF1A958EA3000E1D17 /* host.c in Sources */,\n\t\t\t\tFA0B7D4B1A95902C000E1D17 /* Shader.cpp in Sources */,\n\t\t\t\tFADF540D1E3D7CDD00012CC0 /* wrap_Video.cpp in Sources */,\n\t\t\t\tFABDA9882552448300B5C523 /* b2_contact.cpp in Sources */,\n\t\t\t\tFAF140971E20934C00F898D2 /* PpTokens.cpp in Sources */,\n\t\t\t\tFAF140A91E20934C00F898D2 /* SymbolTable.cpp in Sources */,\n\t\t\t\tFA0B7E181A95902C000E1D17 /* MotorJoint.cpp in Sources */,\n\t\t\t\tFA18CEC523D3AE6700263725 /* wrap_Buffer.cpp in Sources */,\n\t\t\t\tFAF6C9F423C2DE2900D7B5BC /* Logger.cpp in Sources */,\n\t\t\t\tFABDA9FF2552448300B5C523 /* b2_time_of_impact.cpp in Sources */,\n\t\t\t\tFA0B7EBE1A95902C000E1D17 /* Thread.cpp in Sources */,\n\t\t\t\tFAC7CD8F1FE35E95006A60C7 /* physfs_platform_posix.c in Sources */,\n\t\t\t\tFAF1406E1E20934C00F898D2 /* Initialize.cpp in Sources */,\n\t\t\t\tFAF6C9DF23C2DE2900D7B5BC /* SpvTools.cpp in Sources */,\n\t\t\t\tFA0B7EB81A95902C000E1D17 /* Channel.cpp in Sources */,\n\t\t\t\tFA94727827A6EE1B00817677 /* main.cpp in Sources */,\n\t\t\t\t217DFC091D9F6D490055D849 /* unix.c in Sources */,\n\t\t\t\tFACA02EE1F5E396B0084B28F /* Compressor.cpp in Sources */,\n\t\t\t\tFAF140801E20934C00F898D2 /* parseConst.cpp in Sources */,\n\t\t\t\tFA4B66C91ABBCF1900558F15 /* Timer.cpp in Sources */,\n\t\t\t\tFA0B7E911A95902C000E1D17 /* ModPlugDecoder.cpp in Sources */,\n\t\t\t\tFA0B7E511A95902C000E1D17 /* wrap_FrictionJoint.cpp in Sources */,\n\t\t\t\tFABDA9832552448200B5C523 /* b2_chain_polygon_contact.cpp in Sources */,\n\t\t\t\tFA0B7AD61A958EA3000E1D17 /* win32.c in Sources */,\n\t\t\t\tFADF54341E3DAE6E00012CC0 /* wrap_SpriteBatch.cpp in Sources */,\n\t\t\t\tFA0B7D181A95902C000E1D17 /* TrueTypeRasterizer.cpp in Sources */,\n\t\t\t\tFA84DE6627791C36002674C6 /* GraphicsReadback.cpp in Sources */,\n\t\t\t\tFA0B7CFA1A95902C000E1D17 /* Filesystem.cpp in Sources */,\n\t\t\t\tFABDA9F72552448300B5C523 /* b2_dynamic_tree.cpp in Sources */,\n\t\t\t\tFABDA98A2552448300B5C523 /* b2_revolute_joint.cpp in Sources */,\n\t\t\t\tFA1BA0A21E16D97500AA2803 /* wrap_Font.cpp in Sources */,\n\t\t\t\tFAC7CD781FE35E95006A60C7 /* physfs_platform_qnx.c in Sources */,\n\t\t\t\tFA0B7D3C1A95902C000E1D17 /* Texture.cpp in Sources */,\n\t\t\t\tFABDA9EB2552448300B5C523 /* b2_collide_circle.cpp in Sources */,\n\t\t\t\tFADF53FD1E3D74F200012CC0 /* TextBatch.cpp in Sources */,\n\t\t\t\tFA84DE612778D7F3002674C6 /* SpirvIntrinsics.cpp in Sources */,\n\t\t\t\tFAFEB29C28F210550025D7D0 /* unixstream.c in Sources */,\n\t\t\t\tFA6A2B741F60B6710074C308 /* ByteData.cpp in Sources */,\n\t\t\t\t217DFBE91D9F6D490055D849 /* io.c in Sources */,\n\t\t\t\tFA0B7E421A95902C000E1D17 /* wrap_CircleShape.cpp in Sources */,\n\t\t\t\tFA0B7CE51A95902C000E1D17 /* wrap_Source.cpp in Sources */,\n\t\t\t\tFAC7CD921FE35E95006A60C7 /* physfs_archiver_hog.c in Sources */,\n\t\t\t\tFAF140931E20934C00F898D2 /* PpScanner.cpp in Sources */,\n\t\t\t\tFA9D53AC1F5307E900125C6B /* Deprecations.cpp in Sources */,\n\t\t\t\tD9F0C2DC2C680A5500BB2D25 /* UnixLibraryLoader.cpp in Sources */,\n\t\t\t\tFA0B7CCD1A95902C000E1D17 /* Audio.cpp in Sources */,\n\t\t\t\tFA0B7DCA1A95902C000E1D17 /* Keyboard.cpp in Sources */,\n\t\t\t\tFA9D8DDD1DEF842A002CD881 /* Drawable.cpp in Sources */,\n\t\t\t\tFA0B7DFA1A95902C000E1D17 /* Body.cpp in Sources */,\n\t\t\t\tFAF6C9EB23C2DE2900D7B5BC /* GlslangToSpv.cpp in Sources */,\n\t\t\t\tFADF54021E3D77B500012CC0 /* wrap_TextBatch.cpp in Sources */,\n\t\t\t\tFA0B7ED11A95902C000E1D17 /* wrap_ThreadModule.cpp in Sources */,\n\t\t\t\tFAC7CD7F1FE35E95006A60C7 /* physfs_archiver_wad.c in Sources */,\n\t\t\t\tFA0B7EDF1A95902D000E1D17 /* wrap_Touch.cpp in Sources */,\n\t\t\t\t217DFBFB1D9F6D490055D849 /* serial.c in Sources */,\n\t\t\t\tFA18CED823DBC6E000263725 /* StreamBuffer.mm in Sources */,\n\t\t\t\tFADF54251E3DA5BA00012CC0 /* Mesh.cpp in Sources */,\n\t\t\t\tD9F0C2D92C680A5500BB2D25 /* OpenSSLConnection.cpp in Sources */,\n\t\t\t\tFA4F2BE51DE6650600CA37D7 /* wrap_Transform.cpp in Sources */,\n\t\t\t\tD9F0C2D42C680A5500BB2D25 /* CurlClient.cpp in Sources */,\n\t\t\t\tFABDA9A22552448300B5C523 /* b2_friction_joint.cpp in Sources */,\n\t\t\t\tFA0B7CDC1A95902C000E1D17 /* Source.cpp in Sources */,\n\t\t\t\tFA6BDF89280B62A000240F2A /* GraphicsReadback.mm in Sources */,\n\t\t\t\tFA0B7DC41A95902C000E1D17 /* wrap_JoystickModule.cpp in Sources */,\n\t\t\t\tFA0B7E6F1A95902C000E1D17 /* wrap_RopeJoint.cpp in Sources */,\n\t\t\t\tFA24348721D401CB00B8918A /* attribute.cpp in Sources */,\n\t\t\t\tD93660F82D1C727C00C0EC4B /* Touch.cpp in Sources */,\n\t\t\t\tFA0B7AB51A958EA3000E1D17 /* ddsparse.cpp in Sources */,\n\t\t\t\tFACA02F41F5E396B0084B28F /* wrap_CompressedData.cpp in Sources */,\n\t\t\t\tFAF140AC1E20934C00F898D2 /* Versions.cpp in Sources */,\n\t\t\t\tFACA06B0293EE5CD001A2557 /* Sensor.cpp in Sources */,\n\t\t\t\tFA0B79461A958E3B000E1D17 /* Vector.cpp in Sources */,\n\t\t\t\tFAC7CD811FE35E95006A60C7 /* physfs_platform_os2.c in Sources */,\n\t\t\t\tFABDA9962552448300B5C523 /* b2_distance_joint.cpp in Sources */,\n\t\t\t\tFA0B7DBB1A95902C000E1D17 /* Joystick.cpp in Sources */,\n\t\t\t\tFA0B7DAE1A95902C000E1D17 /* wrap_CompressedImageData.cpp in Sources */,\n\t\t\t\tFA6A2B701F5F845F0074C308 /* wrap_DataView.cpp in Sources */,\n\t\t\t\tFAB17BE61ABFAA9000F9BA27 /* lz4.c in Sources */,\n\t\t\t\tFA0B7B211A958EA3000E1D17 /* luasocket.cpp in Sources */,\n\t\t\t\tFA0B7CD91A95902C000E1D17 /* Pool.cpp in Sources */,\n\t\t\t\tFABDA98D2552448300B5C523 /* b2_contact_solver.cpp in Sources */,\n\t\t\t\tFAF140A01E20934C00F898D2 /* RemoveTree.cpp in Sources */,\n\t\t\t\tFA0B7E151A95902C000E1D17 /* Joint.cpp in Sources */,\n\t\t\t\tFA0B7EE81A95902D000E1D17 /* wrap_Window.cpp in Sources */,\n\t\t\t\tD943E58E2A24D56000D80361 /* PhysfsIo.cpp in Sources */,\n\t\t\t\tFA0B7E271A95902C000E1D17 /* PulleyJoint.cpp in Sources */,\n\t\t\t\tFA1BA0B71E17043400AA2803 /* wrap_Shader.cpp in Sources */,\n\t\t\t\tFA0B7B301A958EA3000E1D17 /* wuff.c in Sources */,\n\t\t\t\tFA56AA381FAFF02000A43D5F /* memory.cpp in Sources */,\n\t\t\t\tFA0B7E031A95902C000E1D17 /* Contact.cpp in Sources */,\n\t\t\t\tFA0B7D821A95902C000E1D17 /* CompressedImageData.cpp in Sources */,\n\t\t\t\tFA18CF2823DCF67900263725 /* spirv_msl.cpp in Sources */,\n\t\t\t\tFAF1409D1E20934C00F898D2 /* reflection.cpp in Sources */,\n\t\t\t\tFA94727B27A6EE1B00817677 /* HTTPSClient.cpp in Sources */,\n\t\t\t\tFAAA3FDB1F64B3AD00F89E99 /* lutf8lib.c in Sources */,\n\t\t\t\tFA18CEDE23DBC6E000263725 /* Shader.mm in Sources */,\n\t\t\t\tFAF1408A1E20934C00F898D2 /* Pp.cpp in Sources */,\n\t\t\t\tFA76344A1E28722A0066EF9E /* StreamBuffer.cpp in Sources */,\n\t\t\t\tFA0B7DF11A95902C000E1D17 /* wrap_Cursor.cpp in Sources */,\n\t\t\t\tFA0B7E001A95902C000E1D17 /* CircleShape.cpp in Sources */,\n\t\t\t\tFA0B7E451A95902C000E1D17 /* wrap_Contact.cpp in Sources */,\n\t\t\t\t217DFBE71D9F6D490055D849 /* inet.c in Sources */,\n\t\t\t\tFA0B7D151A95902C000E1D17 /* Font.cpp in Sources */,\n\t\t\t\tFA0B7EB51A95902C000E1D17 /* wrap_System.cpp in Sources */,\n\t\t\t\tFAC8E55123B01C0D007B07C8 /* macos.mm in Sources */,\n\t\t\t\tFA0B7DAB1A95902C000E1D17 /* STBHandler.cpp in Sources */,\n\t\t\t\tFA0B7AB81A958EA3000E1D17 /* enet.cpp in Sources */,\n\t\t\t\tFADF53F81E3C7ACD00012CC0 /* Buffer.cpp in Sources */,\n\t\t\t\tFA0B7DD91A95902C000E1D17 /* RandomGenerator.cpp in Sources */,\n\t\t\t\tFAF1409A1E20934C00F898D2 /* propagateNoContraction.cpp in Sources */,\n\t\t\t\tFA18CEE123DBC6E000263725 /* Graphics.mm in Sources */,\n\t\t\t\tFA2AF6741DAD64970032B62C /* vertex.cpp in Sources */,\n\t\t\t\tFABDA9932552448300B5C523 /* b2_polygon_circle_contact.cpp in Sources */,\n\t\t\t\tFAC7CD851FE35E95006A60C7 /* physfs_unicode.c in Sources */,\n\t\t\t\tFA6A2B7A1F60B8250074C308 /* wrap_ByteData.cpp in Sources */,\n\t\t\t\tFA6BDF8E281219E900240F2A /* DataStream.cpp in Sources */,\n\t\t\t\tFAF140551E20934C00F898D2 /* Link.cpp in Sources */,\n\t\t\t\tFABDA9792552448200B5C523 /* b2_joint.cpp in Sources */,\n\t\t\t\tFAF140841E20934C00F898D2 /* ParseHelper.cpp in Sources */,\n\t\t\t\tD9DAB9232961F0EE00C64820 /* HarfbuzzShaper.cpp in Sources */,\n\t\t\t\tFA0B7D7F1A95902C000E1D17 /* Volatile.cpp in Sources */,\n\t\t\t\tFA1BA0B11E16FD0800AA2803 /* Shader.cpp in Sources */,\n\t\t\t\tFABDA99A2552448300B5C523 /* b2_polygon_contact.cpp in Sources */,\n\t\t\t\t217DFBED1D9F6D490055D849 /* luasocket.c in Sources */,\n\t\t\t\t217DFC011D9F6D490055D849 /* tcp.c in Sources */,\n\t\t\t\tFA0B7EBB1A95902C000E1D17 /* LuaThread.cpp in Sources */,\n\t\t\t\tFA0B79381A958E3B000E1D17 /* Reference.cpp in Sources */,\n\t\t\t\tFAC7CD881FE35E95006A60C7 /* physfs_platform_apple.m in Sources */,\n\t\t\t\tFA0B7D391A95902C000E1D17 /* Graphics.cpp in Sources */,\n\t\t\t\tFA0B7E121A95902C000E1D17 /* GearJoint.cpp in Sources */,\n\t\t\t\tFABDA9F52552448300B5C523 /* b2_broad_phase.cpp in Sources */,\n\t\t\t\tFAE272521C05A15B00A67640 /* ParticleSystem.cpp in Sources */,\n\t\t\t\tFA0B7DC11A95902C000E1D17 /* wrap_Joystick.cpp in Sources */,\n\t\t\t\tFA18CF3523DCF67900263725 /* spirv_cross_parsed_ir.cpp in Sources */,\n\t\t\t\tFABDA99C2552448300B5C523 /* b2_edge_polygon_contact.cpp in Sources */,\n\t\t\t\tFA0B7CD31A95902C000E1D17 /* Source.cpp in Sources */,\n\t\t\t\tFA0B7CD01A95902C000E1D17 /* Audio.cpp in Sources */,\n\t\t\t\tFAA3A9AE1B7D465A00CED060 /* android.cpp in Sources */,\n\t\t\t\tFA0B7D121A95902C000E1D17 /* Font.cpp in Sources */,\n\t\t\t\tFABDA9AB2552448300B5C523 /* b2_world.cpp in Sources */,\n\t\t\t\tFA0B7EC81A95902C000E1D17 /* threads.cpp in Sources */,\n\t\t\t\tFAC7CD8B1FE35E95006A60C7 /* physfs_archiver_iso9660.c in Sources */,\n\t\t\t\t217DFBF91D9F6D490055D849 /* select.c in Sources */,\n\t\t\t\tFABDA9D42552448300B5C523 /* b2_block_allocator.cpp in Sources */,\n\t\t\t\tFAF1408C1E20934C00F898D2 /* PpAtom.cpp in Sources */,\n\t\t\t\tFABDA9EF2552448300B5C523 /* b2_collision.cpp in Sources */,\n\t\t\t\tFAF140711E20934C00F898D2 /* Intermediate.cpp in Sources */,\n\t\t\t\tFAF6C9F823C2DE2900D7B5BC /* doc.cpp in Sources */,\n\t\t\t\tFAC7CD7D1FE35E95006A60C7 /* physfs_platform_winrt.cpp in Sources */,\n\t\t\t\tFA0B7E541A95902C000E1D17 /* wrap_GearJoint.cpp in Sources */,\n\t\t\t\tFA0A3A6023366CE9001C269E /* floattypes.cpp in Sources */,\n\t\t\t\tFA41A3C81C0A1F950084430C /* ASTCHandler.cpp in Sources */,\n\t\t\t\tFABDA9DA2552448300B5C523 /* b2_math.cpp in Sources */,\n\t\t\t\tFA0B7E781A95902C000E1D17 /* wrap_WheelJoint.cpp in Sources */,\n\t\t\t\tFA94728127A6EE1B00817677 /* HTTPS.cpp in Sources */,\n\t\t\t\tFA0B7DDC1A95902C000E1D17 /* wrap_BezierCurve.cpp in Sources */,\n\t\t\t\tFA0B7D061A95902C000E1D17 /* wrap_File.cpp in Sources */,\n\t\t\t\tFAC7CD871FE35E95006A60C7 /* physfs_archiver_vdf.c in Sources */,\n\t\t\t\tFAD19A171DFF8CA200D5398A /* ImageDataBase.cpp in Sources */,\n\t\t\t\tFA27B3C01B4985BF008A9DCE /* wrap_VideoStream.cpp in Sources */,\n\t\t\t\tFADF54201E3DA52C00012CC0 /* wrap_ParticleSystem.cpp in Sources */,\n\t\t\t\tFA0B7D9F1A95902C000E1D17 /* KTXHandler.cpp in Sources */,\n\t\t\t\tFA1E88831DF363DB00E808AA /* Filter.cpp in Sources */,\n\t\t\t\tFA94729B27A6F9AD00817677 /* NSURLClient.mm in Sources */,\n\t\t\t\tFA94728827A6EE1B00817677 /* HTTPRequest.cpp in Sources */,\n\t\t\t\tFA0B7CEB1A95902C000E1D17 /* Event.cpp in Sources */,\n\t\t\t\tFA1557C31CE90BD200AFF582 /* EXRHandler.cpp in Sources */,\n\t\t\t\tFA27B3AA1B498151008A9DCE /* VideoStream.cpp in Sources */,\n\t\t\t\tFA0B7E571A95902C000E1D17 /* wrap_Joint.cpp in Sources */,\n\t\t\t\tFA0B7E301A95902C000E1D17 /* Shape.cpp in Sources */,\n\t\t\t\tFA93C4541F315B960087CCD4 /* FormatHandler.cpp in Sources */,\n\t\t\t\tFA0B7E481A95902C000E1D17 /* wrap_DistanceJoint.cpp in Sources */,\n\t\t\t\tFABDA9A72552448300B5C523 /* b2_motor_joint.cpp in Sources */,\n\t\t\t\tFA0B792F1A958E3B000E1D17 /* Module.cpp in Sources */,\n\t\t\t\tFA0B7E2A1A95902C000E1D17 /* RevoluteJoint.cpp in Sources */,\n\t\t\t\tFA0B7D251A95902C000E1D17 /* wrap_Font.cpp in Sources */,\n\t\t\t\tFA0B7E091A95902C000E1D17 /* EdgeShape.cpp in Sources */,\n\t\t\t\tFABDA9912552448300B5C523 /* b2_pulley_joint.cpp in Sources */,\n\t\t\t\tFA0B7CF71A95902C000E1D17 /* FileData.cpp in Sources */,\n\t\t\t\tFA18CF2A23DCF67900263725 /* spirv_cross_util.cpp in Sources */,\n\t\t\t\tFAC7CD8C1FE35E95006A60C7 /* physfs_archiver_qpak.c in Sources */,\n\t\t\t\tFA0B7DA51A95902C000E1D17 /* PNGHandler.cpp in Sources */,\n\t\t\t\tFA0B7B371A958EA3000E1D17 /* wuff_internal.c in Sources */,\n\t\t\t\tFA0B7E971A95902C000E1D17 /* Sound.cpp in Sources */,\n\t\t\t\tFA84DE6C277943F6002674C6 /* GraphicsReadback.cpp in Sources */,\n\t\t\t\tFA4F2B791DE0125B00CA37D7 /* xxhash.c in Sources */,\n\t\t\t\tFA0B7E361A95902C000E1D17 /* WheelJoint.cpp in Sources */,\n\t\t\t\tFAFEB29928F210550025D7D0 /* unixdgram.c in Sources */,\n\t\t\t\tFADF542F1E3DABF600012CC0 /* SpriteBatch.cpp in Sources */,\n\t\t\t\tFA0B7D8D1A95902C000E1D17 /* ddsHandler.cpp in Sources */,\n\t\t\t\tFAAA3FD91F64B3AD00F89E99 /* lstrlib.c in Sources */,\n\t\t\t\tFA0B7DFD1A95902C000E1D17 /* ChainShape.cpp in Sources */,\n\t\t\t\tFA0B79201A958E3B000E1D17 /* delay.cpp in Sources */,\n\t\t\t\tFA18CF1723DCF67900263725 /* spirv_glsl.cpp in Sources */,\n\t\t\t\tFA0B7EA91A95902C000E1D17 /* wrap_Sound.cpp in Sources */,\n\t\t\t\tFA6A2B671F5F7B6B0074C308 /* wrap_Data.cpp in Sources */,\n\t\t\t\tFA18CF3323DCF67900263725 /* spirv_cpp.cpp in Sources */,\n\t\t\t\tFA0B7E061A95902C000E1D17 /* DistanceJoint.cpp in Sources */,\n\t\t\t\tFA620A321AA2F8DB005DB4C2 /* wrap_Quad.cpp in Sources */,\n\t\t\t\tFA4F2BA61DE1E36400CA37D7 /* RecordingDevice.cpp in Sources */,\n\t\t\t\tFA18CF4623DD1A8100263725 /* ShaderStage.mm in Sources */,\n\t\t\t\tFAF1406C1E20934C00F898D2 /* InfoSink.cpp in Sources */,\n\t\t\t\tFAF1407A1E20934C00F898D2 /* limits.cpp in Sources */,\n\t\t\t\tFAC7CD7E1FE35E95006A60C7 /* physfs_archiver_mvl.c in Sources */,\n\t\t\t\tFA0B793B1A958E3B000E1D17 /* runtime.cpp in Sources */,\n\t\t\t\tFA0B7E5D1A95902C000E1D17 /* wrap_MouseJoint.cpp in Sources */,\n\t\t\t\tFA0B7AD41A958EA3000E1D17 /* unix.c in Sources */,\n\t\t\t\tFADF543B1E3DAFF700012CC0 /* wrap_Graphics.cpp in Sources */,\n\t\t\t\tFA0B7E8B1A95902C000E1D17 /* FLACDecoder.cpp in Sources */,\n\t\t\t\tFA0B7B3A1A958EA3000E1D17 /* wuff_memory.c in Sources */,\n\t\t\t\tFAECA1B21F3164700095D008 /* CompressedSlice.cpp in Sources */,\n\t\t\t\tFA0B7D481A95902C000E1D17 /* Polyline.cpp in Sources */,\n\t\t\t\t217DFC111D9F6D490055D849 /* usocket.c in Sources */,\n\t\t\t\tFAC7CD891FE35E95006A60C7 /* physfs_archiver_dir.c in Sources */,\n\t\t\t\tFAF140751E20934C00F898D2 /* IntermTraverse.cpp in Sources */,\n\t\t\t\tFA0B7CE21A95902C000E1D17 /* wrap_Audio.cpp in Sources */,\n\t\t\t\tFACA06AC293EE5CD001A2557 /* wrap_Sensor.cpp in Sources */,\n\t\t\t\tFA0B7DF71A95902C000E1D17 /* Body.cpp in Sources */,\n\t\t\t\tFABDA9ED2552448300B5C523 /* b2_circle_shape.cpp in Sources */,\n\t\t\t\tFA0B7DF41A95902C000E1D17 /* wrap_Mouse.cpp in Sources */,\n\t\t\t\tFA0B7E851A95902C000E1D17 /* CoreAudioDecoder.cpp in Sources */,\n\t\t\t\tFA0B7E751A95902C000E1D17 /* wrap_WeldJoint.cpp in Sources */,\n\t\t\t\tFA0B7D551A95902C000E1D17 /* Buffer.cpp in Sources */,\n\t\t\t\tFA57FB981AE1993600F2AD6D /* noise1234.cpp in Sources */,\n\t\t\t\tFA0B7E211A95902C000E1D17 /* PolygonShape.cpp in Sources */,\n\t\t\t\tFA0B7DA21A95902C000E1D17 /* PKMHandler.cpp in Sources */,\n\t\t\t\tFA0B7ABA1A958EA3000E1D17 /* callbacks.c in Sources */,\n\t\t\t\tFAB17BF51ABFC4B100F9BA27 /* lz4hc.c in Sources */,\n\t\t\t\tFA0B7EA61A95902C000E1D17 /* wrap_Decoder.cpp in Sources */,\n\t\t\t\tFA18CF3F23DCF67900263725 /* spirv_parser.cpp in Sources */,\n\t\t\t\t217DFBF21D9F6D490055D849 /* mime.c in Sources */,\n\t\t\t\t217DFBDF1D9F6D490055D849 /* except.c in Sources */,\n\t\t\t\tFA94728527A6EE1B00817677 /* PlaintextConnection.cpp in Sources */,\n\t\t\t\tFA28EBD51E352DB5003446F4 /* FenceSync.cpp in Sources */,\n\t\t\t\tFA0B7E1B1A95902C000E1D17 /* MouseJoint.cpp in Sources */,\n\t\t\t\tFA0B7CF41A95902C000E1D17 /* File.cpp in Sources */,\n\t\t\t\tFABDA9B52552448300B5C523 /* b2_fixture.cpp in Sources */,\n\t\t\t\tFAC7CD7A1FE35E95006A60C7 /* physfs_archiver_7z.c in Sources */,\n\t\t\t\tFA0B7E331A95902C000E1D17 /* WeldJoint.cpp in Sources */,\n\t\t\t\tFA0B7D301A95902C000E1D17 /* Graphics.cpp in Sources */,\n\t\t\t\tFAF1408E1E20934C00F898D2 /* PpContext.cpp in Sources */,\n\t\t\t\tFA0B7E9D1A95902C000E1D17 /* WaveDecoder.cpp in Sources */,\n\t\t\t\tFA29C0051E12355B00268CD8 /* StreamBuffer.cpp in Sources */,\n\t\t\t\tFA0B7EB21A95902C000E1D17 /* System.cpp in Sources */,\n\t\t\t\tFA0B7D1B1A95902C000E1D17 /* GlyphData.cpp in Sources */,\n\t\t\t\tFA0B7AD11A958EA3000E1D17 /* protocol.c in Sources */,\n\t\t\t\tFA522D4D23F9FE380059EE3C /* MP3Decoder.cpp in Sources */,\n\t\t\t\tFA9D8DD11DEB56C3002CD881 /* pixelformat.cpp in Sources */,\n\t\t\t\tFA0B7E661A95902C000E1D17 /* wrap_PrismaticJoint.cpp in Sources */,\n\t\t\t\tFABDA9B12552448300B5C523 /* b2_circle_contact.cpp in Sources */,\n\t\t\t\tFABDA9812552448200B5C523 /* b2_weld_joint.cpp in Sources */,\n\t\t\t\tFA0B7DCD1A95902C000E1D17 /* wrap_Keyboard.cpp in Sources */,\n\t\t\t\tFA0B7EE51A95902D000E1D17 /* Window.cpp in Sources */,\n\t\t\t\tFA18CEE923DBC8D400263725 /* Buffer.mm in Sources */,\n\t\t\t\tFA6A2B6A1F5F7F560074C308 /* DataView.cpp in Sources */,\n\t\t\t\tFABDA9D22552448300B5C523 /* b2_timer.cpp in Sources */,\n\t\t\t\tFA3C5E471F8D80CA0003C579 /* ShaderStage.cpp in Sources */,\n\t\t\t\tFA0B7E391A95902C000E1D17 /* World.cpp in Sources */,\n\t\t\t\tFA0B7ABD1A958EA3000E1D17 /* compress.c in Sources */,\n\t\t\t\tFA0B7ACB1A958EA3000E1D17 /* list.c in Sources */,\n\t\t\t\tFA0B7E7E1A95902C000E1D17 /* Joint.cpp in Sources */,\n\t\t\t\tFA0B7DB11A95902C000E1D17 /* wrap_Image.cpp in Sources */,\n\t\t\t\tD9F0C2D72C680A5500BB2D25 /* LinktimeLibraryLoader.cpp in Sources */,\n\t\t\t\tFABDA9D82552448300B5C523 /* b2_settings.cpp in Sources */,\n\t\t\t\tFAC7CD831FE35E95006A60C7 /* physfs_platform_windows.c in Sources */,\n\t\t\t\tFA0B7E881A95902C000E1D17 /* Decoder.cpp in Sources */,\n\t\t\t\tFA0B7E3C1A95902C000E1D17 /* wrap_Body.cpp in Sources */,\n\t\t\t\tFA0B7D791A95902C000E1D17 /* Quad.cpp in Sources */,\n\t\t\t\tD9DAB92D2961F10000C64820 /* TextShaper.cpp in Sources */,\n\t\t\t\tFABDA9FD2552448300B5C523 /* b2_edge_shape.cpp in Sources */,\n\t\t\t\tFAC756F51E4F99B400B91289 /* Effect.cpp in Sources */,\n\t\t\t\tFA620A3A1AA305F6005DB4C2 /* types.cpp in Sources */,\n\t\t\t\tFA0B7DD31A95902C000E1D17 /* BezierCurve.cpp in Sources */,\n\t\t\t\tFA0B7E7B1A95902C000E1D17 /* wrap_World.cpp in Sources */,\n\t\t\t\tFA0B7B281A958EA3000E1D17 /* simplexnoise1234.cpp in Sources */,\n\t\t\t\tFA0B7D421A95902C000E1D17 /* OpenGL.cpp in Sources */,\n\t\t\t\tFA0B7DBE1A95902C000E1D17 /* JoystickModule.cpp in Sources */,\n\t\t\t\tFAB2D5AA1AABDD8A008224A4 /* TrueTypeRasterizer.cpp in Sources */,\n\t\t\t\tFA0B7ACD1A958EA3000E1D17 /* packet.c in Sources */,\n\t\t\t\tFA0B7E5A1A95902C000E1D17 /* wrap_MotorJoint.cpp in Sources */,\n\t\t\t\tFA0B7DD61A95902C000E1D17 /* MathModule.cpp in Sources */,\n\t\t\t\tFAC7CD8A1FE35E95006A60C7 /* physfs_byteorder.c in Sources */,\n\t\t\t\tFA0B7D0F1A95902C000E1D17 /* BMFontRasterizer.cpp in Sources */,\n\t\t\t\tFA0B7E9A1A95902C000E1D17 /* VorbisDecoder.cpp in Sources */,\n\t\t\t\tFA0B7E4B1A95902C000E1D17 /* wrap_EdgeShape.cpp in Sources */,\n\t\t\t\tFA9D8DD91DEF8411002CD881 /* Stream.cpp in Sources */,\n\t\t\t\tFA0B7E241A95902C000E1D17 /* PrismaticJoint.cpp in Sources */,\n\t\t\t\tFAC7CD791FE35E95006A60C7 /* physfs.c in Sources */,\n\t\t\t\tFAC756FA1E4F99D200B91289 /* Effect.cpp in Sources */,\n\t\t\t\tFA0B7E601A95902C000E1D17 /* wrap_Physics.cpp in Sources */,\n\t\t\t\tFA0B7DC71A95902C000E1D17 /* Keyboard.cpp in Sources */,\n\t\t\t\t217DFC071D9F6D490055D849 /* udp.c in Sources */,\n\t\t\t\tFA0B7EAC1A95902C000E1D17 /* wrap_SoundData.cpp in Sources */,\n\t\t\t\tFA0B7E2D1A95902C000E1D17 /* RopeJoint.cpp in Sources */,\n\t\t\t\tFA0B7CDF1A95902C000E1D17 /* Source.cpp in Sources */,\n\t\t\t\tFA0B7ECE1A95902C000E1D17 /* wrap_LuaThread.cpp in Sources */,\n\t\t\t\tFA0B79431A958E3B000E1D17 /* Variant.cpp in Sources */,\n\t\t\t\tFA4F2BE31DE6650600CA37D7 /* Transform.cpp in Sources */,\n\t\t\t\tFA0B7EA01A95902C000E1D17 /* Sound.cpp in Sources */,\n\t\t\t\tFABDA9F12552448300B5C523 /* b2_collide_edge.cpp in Sources */,\n\t\t\t\tFA0B7DE51A95902C000E1D17 /* Cursor.cpp in Sources */,\n\t\t\t\tFA0B7EDB1A95902D000E1D17 /* Touch.cpp in Sources */,\n\t\t\t\tFA0B7CE81A95902C000E1D17 /* Event.cpp in Sources */,\n\t\t\t\tFA0B7ACF1A958EA3000E1D17 /* peer.c in Sources */,\n\t\t\t\tFA0B7ADE1A958EA3000E1D17 /* lodepng.cpp in Sources */,\n\t\t\t\tFA0B7E1E1A95902C000E1D17 /* Physics.cpp in Sources */,\n\t\t\t\tFA9D8DE01DEF843D002CD881 /* Image.cpp in Sources */,\n\t\t\t\tFA0B7E811A95902C000E1D17 /* Shape.cpp in Sources */,\n\t\t\t\tFABDA97C2552448200B5C523 /* b2_chain_circle_contact.cpp in Sources */,\n\t\t\t\tFAC8E54623AC832A007B07C8 /* NativeFile.cpp in Sources */,\n\t\t\t\tFA4F2BA81DE1E36400CA37D7 /* wrap_RecordingDevice.cpp in Sources */,\n\t\t\t\tFACA02EC1F5E396B0084B28F /* CompressedData.cpp in Sources */,\n\t\t\t\tFAF140531E20934C00F898D2 /* CodeGen.cpp in Sources */,\n\t\t\t\tFA27B3B31B498151008A9DCE /* wrap_Video.cpp in Sources */,\n\t\t\t\tFAF140881E20934C00F898D2 /* PoolAlloc.cpp in Sources */,\n\t\t\t\tFA0B7DEE1A95902C000E1D17 /* Mouse.cpp in Sources */,\n\t\t\t\tFAAC2F79251A9D2200BCB81B /* apple.mm in Sources */,\n\t\t\t\tFAA54ACC1F91660400A8FA7B /* TheoraVideoStream.cpp in Sources */,\n\t\t\t\tFA1E887E1DF363CD00E808AA /* Filter.cpp in Sources */,\n\t\t\t\tFABDA9862552448200B5C523 /* b2_body.cpp in Sources */,\n\t\t\t\tFA0B7D281A95902C000E1D17 /* wrap_GlyphData.cpp in Sources */,\n\t\t\t\tFABDA9F92552448300B5C523 /* b2_polygon_shape.cpp in Sources */,\n\t\t\t\tFA0B7DE21A95902C000E1D17 /* wrap_RandomGenerator.cpp in Sources */,\n\t\t\t\tFAF6C9F223C2DE2900D7B5BC /* SPVRemapper.cpp in Sources */,\n\t\t\t\tFA18CEEF23DC9B3E00263725 /* Texture.mm in Sources */,\n\t\t\t\tFABDAA012552448300B5C523 /* b2_distance.cpp in Sources */,\n\t\t\t\tFACA02F61F5E396B0084B28F /* wrap_DataModule.cpp in Sources */,\n\t\t\t\tFA0B79401A958E3B000E1D17 /* utf8.cpp in Sources */,\n\t\t\t\tFA0B79241A958E3B000E1D17 /* Exception.cpp in Sources */,\n\t\t\t\tFABDA9D62552448300B5C523 /* b2_stack_allocator.cpp in Sources */,\n\t\t\t\tFA0B7D0C1A95902C000E1D17 /* wrap_Filesystem.cpp in Sources */,\n\t\t\t\tFA0B7AD91A958EA3000E1D17 /* glad.cpp in Sources */,\n\t\t\t\tFAC7CD841FE35E95006A60C7 /* physfs_archiver_unpacked.c in Sources */,\n\t\t\t\t217DFBF61D9F6D490055D849 /* options.c in Sources */,\n\t\t\t\tFAA54ACD1F91660400A8FA7B /* OggDemuxer.cpp in Sources */,\n\t\t\t\tFAC7CD821FE35E95006A60C7 /* physfs_platform_haiku.cpp in Sources */,\n\t\t\t\t217DFBD91D9F6D490055D849 /* auxiliar.c in Sources */,\n\t\t\t\t217DFBDB1D9F6D490055D849 /* buffer.c in Sources */,\n\t\t\t\tFA0B7DB41A95902C000E1D17 /* wrap_ImageData.cpp in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t10D5479E63C26BB35EB5482E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"c++17\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = NO;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\";\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 3;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = LOVE_APPLE_USE_FRAMEWORKS;\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = NO;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_NEWLINE = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;\n\t\t\t\tGCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;\n\t\t\t\tGCC_WARN_SIGN_COMPARE = YES;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_PARAMETER = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/../../src\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/../../src/libraries\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/../../src/modules\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/../../src/libraries/enet/libenet/include\\\"\",\n\t\t\t\t);\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tLIBRARY_SEARCH_PATHS = \"\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.15;\n\t\t\t\tONLY_ACTIVE_ARCH = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tUSE_HEADERMAP = NO;\n\t\t\t\tWARNING_CFLAGS = \"-Wall\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t64274E785071353E1A1D0D4B /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"c++17\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = NO;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\";\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\tLOVE_APPLE_USE_FRAMEWORKS,\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = NO;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_NEWLINE = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;\n\t\t\t\tGCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;\n\t\t\t\tGCC_WARN_SIGN_COMPARE = YES;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_PARAMETER = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/../../src\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/../../src/libraries\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/../../src/modules\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/../../src/libraries/enet/libenet/include\\\"\",\n\t\t\t\t);\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tLIBRARY_SEARCH_PATHS = \"\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.15;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tUSE_HEADERMAP = NO;\n\t\t\t\tWARNING_CFLAGS = \"-Wall\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tFA0B78EF1A958B90000E1D17 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_64_BIT)\";\n\t\t\t\t\"ARCHS[sdk=iphonesimulator*]\" = \"$(ARCHS_STANDARD_64_BIT)\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(PROJECT_DIR)/ios/libraries\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\tLOVE_SUPPORT_COREAUDIO,\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = NO;\n\t\t\t\tHEADER_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tOTHER_LDFLAGS = \"-ObjC\";\n\t\t\t\tPRODUCT_NAME = love;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tFA0B78F01A958B90000E1D17 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_64_BIT)\";\n\t\t\t\t\"ARCHS[sdk=iphonesimulator*]\" = \"$(ARCHS_STANDARD_64_BIT)\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(PROJECT_DIR)/ios/libraries\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\tLOVE_SUPPORT_COREAUDIO,\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = NO;\n\t\t\t\tHEADER_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tOTHER_LDFLAGS = \"-ObjC\";\n\t\t\t\tPRODUCT_NAME = love;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tFA0B78F11A958B90000E1D17 /* Distribution */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_64_BIT)\";\n\t\t\t\t\"ARCHS[sdk=iphonesimulator*]\" = \"$(ARCHS_STANDARD_64_BIT)\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(PROJECT_DIR)/ios/libraries\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\tLOVE_SUPPORT_COREAUDIO,\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = NO;\n\t\t\t\tHEADER_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tOTHER_LDFLAGS = \"-ObjC\";\n\t\t\t\tPRODUCT_NAME = love;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Distribution;\n\t\t};\n\t\tFA5326C4189719C700F7BBF4 /* Distribution */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"c++17\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = NO;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\";\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 3;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = LOVE_APPLE_USE_FRAMEWORKS;\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = NO;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_NEWLINE = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;\n\t\t\t\tGCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;\n\t\t\t\tGCC_WARN_SIGN_COMPARE = YES;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_PARAMETER = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/../../src\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/../../src/libraries\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/../../src/modules\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/../../src/libraries/enet/libenet/include\\\"\",\n\t\t\t\t);\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tLIBRARY_SEARCH_PATHS = \"\";\n\t\t\t\tLLVM_LTO = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.15;\n\t\t\t\tONLY_ACTIVE_ARCH = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tUSE_HEADERMAP = NO;\n\t\t\t\tWARNING_CFLAGS = \"-Wall\";\n\t\t\t};\n\t\t\tname = Distribution;\n\t\t};\n\t\tFA5326C5189719C700F7BBF4 /* Distribution */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 9.0;\n\t\t\t\tDYLIB_CURRENT_VERSION = 9.0;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t);\n\t\t\t\tFRAMEWORK_VERSION = A;\n\t\t\t\tGCC_ENABLE_OBJC_EXCEPTIONS = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks/freetype.framework/Headers\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks/Lua.framework/Headers\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks/SDL2.framework/Headers\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks/harfbuzz.framework/Headers\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = \"macosx/liblove-macosx.plist\";\n\t\t\t\tLD_DYLIB_INSTALL_NAME = \"@rpath/$(EXECUTABLE_PATH)\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"@loader_path/../../../\";\n\t\t\t\tMARKETING_VERSION = 11.5;\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-undefined\",\n\t\t\t\t\tdynamic_lookup,\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"love2d.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = love;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tWRAPPER_EXTENSION = framework;\n\t\t\t};\n\t\t\tname = Distribution;\n\t\t};\n\t\tFA577AC016C7507900860150 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 9.0;\n\t\t\t\tDYLIB_CURRENT_VERSION = 9.0;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t);\n\t\t\t\tFRAMEWORK_VERSION = A;\n\t\t\t\tGCC_ENABLE_OBJC_EXCEPTIONS = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks/freetype.framework/Headers\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks/Lua.framework/Headers\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks/SDL2.framework/Headers\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks/harfbuzz.framework/Headers\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = \"macosx/liblove-macosx.plist\";\n\t\t\t\tLD_DYLIB_INSTALL_NAME = \"@rpath/$(EXECUTABLE_PATH)\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"@loader_path/../../../\";\n\t\t\t\tMARKETING_VERSION = 11.5;\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-undefined\",\n\t\t\t\t\tdynamic_lookup,\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"love2d.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = love;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tWRAPPER_EXTENSION = framework;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tFA577AC116C7507900860150 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 9.0;\n\t\t\t\tDYLIB_CURRENT_VERSION = 9.0;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t);\n\t\t\t\tFRAMEWORK_VERSION = A;\n\t\t\t\tGCC_ENABLE_OBJC_EXCEPTIONS = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks/freetype.framework/Headers\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks/Lua.framework/Headers\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks/SDL2.framework/Headers\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks/harfbuzz.framework/Headers\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = \"macosx/liblove-macosx.plist\";\n\t\t\t\tLD_DYLIB_INSTALL_NAME = \"@rpath/$(EXECUTABLE_PATH)\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"@loader_path/../../../\";\n\t\t\t\tMARKETING_VERSION = 11.5;\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-undefined\",\n\t\t\t\t\tdynamic_lookup,\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"love2d.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = love;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tWRAPPER_EXTENSION = framework;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t1DEB928908733DD80010E9CD /* Build configuration list for PBXProject \"liblove\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t64274E785071353E1A1D0D4B /* Debug */,\n\t\t\t\t10D5479E63C26BB35EB5482E /* Release */,\n\t\t\t\tFA5326C4189719C700F7BBF4 /* Distribution */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Debug;\n\t\t};\n\t\tFA0B78EE1A958B90000E1D17 /* Build configuration list for PBXNativeTarget \"liblove-ios\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tFA0B78EF1A958B90000E1D17 /* Debug */,\n\t\t\t\tFA0B78F01A958B90000E1D17 /* Release */,\n\t\t\t\tFA0B78F11A958B90000E1D17 /* Distribution */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Debug;\n\t\t};\n\t\tFA577ABF16C7507900860150 /* Build configuration list for PBXNativeTarget \"liblove-macosx\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tFA577AC016C7507900860150 /* Debug */,\n\t\t\t\tFA577AC116C7507900860150 /* Release */,\n\t\t\t\tFA5326C5189719C700F7BBF4 /* Distribution */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Debug;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 08FB7793FE84155DC02AAC07 /* Project object */;\n}\n"
  },
  {
    "path": "platform/xcode/liblove.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:liblove.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "platform/xcode/love.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>com.apple.security.cs.allow-jit</key>\n\t<true/>\n\t<key>com.apple.security.cs.allow-unsigned-executable-memory</key>\n\t<true/>\n\t<key>com.apple.security.cs.disable-library-validation</key>\n\t<true/>\n\t<key>com.apple.security.device.audio-input</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "platform/xcode/love.xcodeproj/default.pbxuser",
    "content": "// !$*UTF8*$!\n{\n\t29B97313FDCFA39411CA2CEA /* Project object */ = {\n\t\tactiveArchitecturePreference = ppc;\n\t\tactiveBuildConfigurationName = Release;\n\t\tactiveExecutable = A93E69C010420A88007D418B /* love */;\n\t\tactiveSDKPreference = macosx10.5;\n\t\tactiveTarget = 8D1107260486CEB800E47090 /* love */;\n\t\taddToTargets = (\n\t\t\t8D1107260486CEB800E47090 /* love */,\n\t\t);\n\t\tbreakpoints = (\n\t\t);\n\t\tcodeSenseManager = A93E69C410420AA6007D418B /* Code sense */;\n\t\texecutables = (\n\t\t\tA93E69C010420A88007D418B /* love */,\n\t\t);\n\t\tperUserDictionary = {\n\t\t\tPBXConfiguration.PBXFileTableDataSource3.PBXBookmarksDataSource = {\n\t\t\t\tPBXFileTableDataSourceColumnSortingDirectionKey = \"-1\";\n\t\t\t\tPBXFileTableDataSourceColumnSortingKey = PBXBookmarksDataSource_NameID;\n\t\t\t\tPBXFileTableDataSourceColumnWidthsKey = (\n\t\t\t\t\t200,\n\t\t\t\t\t200,\n\t\t\t\t\t150.58349609375,\n\t\t\t\t);\n\t\t\t\tPBXFileTableDataSourceColumnsKey = (\n\t\t\t\t\tPBXBookmarksDataSource_LocationID,\n\t\t\t\t\tPBXBookmarksDataSource_NameID,\n\t\t\t\t\tPBXBookmarksDataSource_CommentsID,\n\t\t\t\t);\n\t\t\t};\n\t\t\tPBXConfiguration.PBXFileTableDataSource3.PBXErrorsWarningsDataSource = {\n\t\t\t\tPBXFileTableDataSourceColumnSortingDirectionKey = \"-1\";\n\t\t\t\tPBXFileTableDataSourceColumnSortingKey = PBXErrorsWarningsDataSource_LocationID;\n\t\t\t\tPBXFileTableDataSourceColumnWidthsKey = (\n\t\t\t\t\t20,\n\t\t\t\t\t300,\n\t\t\t\t\t193.20849609375,\n\t\t\t\t);\n\t\t\t\tPBXFileTableDataSourceColumnsKey = (\n\t\t\t\t\tPBXErrorsWarningsDataSource_TypeID,\n\t\t\t\t\tPBXErrorsWarningsDataSource_MessageID,\n\t\t\t\t\tPBXErrorsWarningsDataSource_LocationID,\n\t\t\t\t);\n\t\t\t};\n\t\t\tPBXConfiguration.PBXFileTableDataSource3.PBXExecutablesDataSource = {\n\t\t\t\tPBXFileTableDataSourceColumnSortingDirectionKey = \"-1\";\n\t\t\t\tPBXFileTableDataSourceColumnSortingKey = PBXExecutablesDataSource_NameID;\n\t\t\t\tPBXFileTableDataSourceColumnWidthsKey = (\n\t\t\t\t\t22,\n\t\t\t\t\t300,\n\t\t\t\t\t191,\n\t\t\t\t);\n\t\t\t\tPBXFileTableDataSourceColumnsKey = (\n\t\t\t\t\tPBXExecutablesDataSource_ActiveFlagID,\n\t\t\t\t\tPBXExecutablesDataSource_NameID,\n\t\t\t\t\tPBXExecutablesDataSource_CommentsID,\n\t\t\t\t);\n\t\t\t};\n\t\t\tPBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = {\n\t\t\t\tPBXFileTableDataSourceColumnSortingDirectionKey = \"-1\";\n\t\t\t\tPBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_FiletypeID;\n\t\t\t\tPBXFileTableDataSourceColumnWidthsKey = (\n\t\t\t\t\t20,\n\t\t\t\t\t341,\n\t\t\t\t\t20,\n\t\t\t\t\t48,\n\t\t\t\t\t43,\n\t\t\t\t\t43,\n\t\t\t\t\t20,\n\t\t\t\t);\n\t\t\t\tPBXFileTableDataSourceColumnsKey = (\n\t\t\t\t\tPBXFileDataSource_FiletypeID,\n\t\t\t\t\tPBXFileDataSource_Filename_ColumnID,\n\t\t\t\t\tPBXFileDataSource_Built_ColumnID,\n\t\t\t\t\tPBXFileDataSource_ObjectSize_ColumnID,\n\t\t\t\t\tPBXFileDataSource_Errors_ColumnID,\n\t\t\t\t\tPBXFileDataSource_Warnings_ColumnID,\n\t\t\t\t\tPBXFileDataSource_Target_ColumnID,\n\t\t\t\t);\n\t\t\t};\n\t\t\tPBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = {\n\t\t\t\tPBXFileTableDataSourceColumnSortingDirectionKey = \"-1\";\n\t\t\t\tPBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;\n\t\t\t\tPBXFileTableDataSourceColumnWidthsKey = (\n\t\t\t\t\t20,\n\t\t\t\t\t301,\n\t\t\t\t\t60,\n\t\t\t\t\t20,\n\t\t\t\t\t48,\n\t\t\t\t\t43,\n\t\t\t\t\t43,\n\t\t\t\t);\n\t\t\t\tPBXFileTableDataSourceColumnsKey = (\n\t\t\t\t\tPBXFileDataSource_FiletypeID,\n\t\t\t\t\tPBXFileDataSource_Filename_ColumnID,\n\t\t\t\t\tPBXTargetDataSource_PrimaryAttribute,\n\t\t\t\t\tPBXFileDataSource_Built_ColumnID,\n\t\t\t\t\tPBXFileDataSource_ObjectSize_ColumnID,\n\t\t\t\t\tPBXFileDataSource_Errors_ColumnID,\n\t\t\t\t\tPBXFileDataSource_Warnings_ColumnID,\n\t\t\t\t);\n\t\t\t};\n\t\t\tPBXPerProjectTemplateStateSaveDate = 272885036;\n\t\t\tPBXWorkspaceStateSaveDate = 272885036;\n\t\t};\n\t\tperUserProjectItems = {\n\t\t\tA9D8FBD21043E5320063561F /* PBXTextBookmark */ = A9D8FBD21043E5320063561F /* PBXTextBookmark */;\n\t\t\tA9D8FBE01043E5AE0063561F /* PBXTextBookmark */ = A9D8FBE01043E5AE0063561F /* PBXTextBookmark */;\n\t\t\tA9D8FBE21043E5AE0063561F /* PBXTextBookmark */ = A9D8FBE21043E5AE0063561F /* PBXTextBookmark */;\n\t\t\tA9D8FBE71043E5C10063561F /* PBXTextBookmark */ = A9D8FBE71043E5C10063561F /* PBXTextBookmark */;\n\t\t\tA9D8FBE81043E5C10063561F /* PBXTextBookmark */ = A9D8FBE81043E5C10063561F /* PBXTextBookmark */;\n\t\t\tA9D8FBE91043E5C10063561F /* PBXTextBookmark */ = A9D8FBE91043E5C10063561F /* PBXTextBookmark */;\n\t\t\tA9D8FBEA1043E5C10063561F /* PBXTextBookmark */ = A9D8FBEA1043E5C10063561F /* PBXTextBookmark */;\n\t\t\tA9D8FBEB1043E5C10063561F /* PBXTextBookmark */ = A9D8FBEB1043E5C10063561F /* PBXTextBookmark */;\n\t\t\tA9D8FBEC1043E5C10063561F /* PBXTextBookmark */ = A9D8FBEC1043E5C10063561F /* PBXTextBookmark */;\n\t\t\tA9D8FBED1043E5C10063561F /* PBXTextBookmark */ = A9D8FBED1043E5C10063561F /* PBXTextBookmark */;\n\t\t\tA9D8FBFC1043E7C20063561F /* PBXTextBookmark */ = A9D8FBFC1043E7C20063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC011043E8770063561F /* PBXTextBookmark */ = A9D8FC011043E8770063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC031043E94F0063561F /* PBXTextBookmark */ = A9D8FC031043E94F0063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC041043E94F0063561F /* PBXTextBookmark */ = A9D8FC041043E94F0063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC051043E94F0063561F /* PBXTextBookmark */ = A9D8FC051043E94F0063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC061043E94F0063561F /* PBXTextBookmark */ = A9D8FC061043E94F0063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC0D1043EBD30063561F /* PBXTextBookmark */ = A9D8FC0D1043EBD30063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC131043EC200063561F /* PBXTextBookmark */ = A9D8FC131043EC200063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC1E1043EFA00063561F /* PBXTextBookmark */ = A9D8FC1E1043EFA00063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC2010441C030063561F /* PBXTextBookmark */ = A9D8FC2010441C030063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC2110441C0F0063561F /* PBXTextBookmark */ = A9D8FC2110441C0F0063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC2410441DF10063561F /* PBXTextBookmark */ = A9D8FC2410441DF10063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC2510441E590063561F /* PBXTextBookmark */ = A9D8FC2510441E590063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC2610441E700063561F /* PBXTextBookmark */ = A9D8FC2610441E700063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC2710441E890063561F /* PBXTextBookmark */ = A9D8FC2710441E890063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC2910441E9B0063561F /* PBXTextBookmark */ = A9D8FC2910441E9B0063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC2F104423D80063561F /* PBXTextBookmark */ = A9D8FC2F104423D80063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC30104423D80063561F /* PBXTextBookmark */ = A9D8FC30104423D80063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC31104423D80063561F /* PBXTextBookmark */ = A9D8FC31104423D80063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC32104423D80063561F /* PBXTextBookmark */ = A9D8FC32104423D80063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC36104423F90063561F /* PBXTextBookmark */ = A9D8FC36104423F90063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC3D104427770063561F /* PBXTextBookmark */ = A9D8FC3D104427770063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC3F104427A10063561F /* PBXTextBookmark */ = A9D8FC3F104427A10063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC40104427AE0063561F /* PBXTextBookmark */ = A9D8FC40104427AE0063561F /* PBXTextBookmark */;\n\t\t\tA9D8FC421044283D0063561F /* PBXTextBookmark */ = A9D8FC421044283D0063561F /* PBXTextBookmark */;\n\t\t\tA9DE83571043CE2800567BA4 = A9DE83571043CE2800567BA4 /* PBXTextBookmark */;\n\t\t\tA9DE835A1043CE2800567BA4 = A9DE835A1043CE2800567BA4 /* PBXTextBookmark */;\n\t\t\tA9DE83781043CFEF00567BA4 = A9DE83781043CFEF00567BA4 /* PBXTextBookmark */;\n\t\t\tA9DE83791043CFEF00567BA4 = A9DE83791043CFEF00567BA4 /* PBXTextBookmark */;\n\t\t\tA9DE837A1043CFEF00567BA4 = A9DE837A1043CFEF00567BA4 /* PBXBookmark */;\n\t\t\tA9DE837B1043CFEF00567BA4 = A9DE837B1043CFEF00567BA4 /* PBXTextBookmark */;\n\t\t\tA9DE837C1043CFEF00567BA4 = A9DE837C1043CFEF00567BA4 /* PBXTextBookmark */;\n\t\t\tA9DE85AA1043E49900567BA4 = A9DE85AA1043E49900567BA4 /* PBXTextBookmark */;\n\t\t};\n\t\tsourceControlManager = A93E69C310420AA6007D418B /* Source Control */;\n\t\tuserBuildSettings = {\n\t\t};\n\t};\n\t8D1107260486CEB800E47090 /* love */ = {\n\t\tactiveExec = 0;\n\t\texecutables = (\n\t\t\tA93E69C010420A88007D418B /* love */,\n\t\t);\n\t};\n\tA9255DEA1043188D00BA1496 /* SDLMain.m */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {762, 5586}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{561, 596}\";\n\t\t};\n\t};\n\tA93E69C010420A88007D418B /* love */ = {\n\t\tisa = PBXExecutable;\n\t\tactiveArgIndices = (\n\t\t);\n\t\targumentStrings = (\n\t\t);\n\t\tautoAttachOnCrash = 1;\n\t\tbreakpointsEnabled = 0;\n\t\tconfigStateDict = {\n\t\t};\n\t\tcustomDataFormattersEnabled = 1;\n\t\tdebuggerPlugin = GDBDebugging;\n\t\tdisassemblyDisplayState = 0;\n\t\tdylibVariantSuffix = \"\";\n\t\tenableDebugStr = 1;\n\t\tenvironmentEntries = (\n\t\t);\n\t\texecutableSystemSymbolLevel = 0;\n\t\texecutableUserSymbolLevel = 0;\n\t\tlibgmallocEnabled = 0;\n\t\tname = love;\n\t\tsourceDirectories = (\n\t\t);\n\t};\n\tA93E69C310420AA6007D418B /* Source Control */ = {\n\t\tisa = PBXSourceControlManager;\n\t\tfallbackIsa = XCSourceControlManager;\n\t\tisSCMEnabled = 0;\n\t\tscmConfiguration = {\n\t\t};\n\t};\n\tA93E69C410420AA6007D418B /* Code sense */ = {\n\t\tisa = PBXCodeSenseManager;\n\t\tindexTemplatePath = \"\";\n\t};\n\tA93E69DE10420ABF007D418B /* config.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {481, 812}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{922, 334}\";\n\t\t};\n\t};\n\tA93E69E110420ABF007D418B /* Exception.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {481, 770}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 844}\";\n\t\t};\n\t};\n\tA93E69E610420ABF007D418B /* MemoryData.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {481, 910}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{987, 353}\";\n\t\t};\n\t};\n\tA93E69E710420ABF007D418B /* Module.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {481, 798}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{1168, 298}\";\n\t\t};\n\t};\n\tA93E69EA10420ABF007D418B /* Reference.cpp */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 742}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 927}\";\n\t\t};\n\t};\n\tA93E69ED10420ABF007D418B /* runtime.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {798, 3990}}\";\n\t\t\tsepNavSelRange = \"{1030, 18}\";\n\t\t\tsepNavVisRange = \"{9125, 493}\";\n\t\t};\n\t};\n\tA93E69F110420ABF007D418B /* version.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {481, 532}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 844}\";\n\t\t};\n\t};\n\tA93E69F710420ABF007D418B /* keeper.lch */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 3094}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 1141}\";\n\t\t};\n\t};\n\tA93E6A0410420ABF007D418B /* auxiliar.c */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 2156}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 765}\";\n\t\t};\n\t};\n\tA93E6A2C10420AC0007D418B /* unix.c */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 5054}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 534}\";\n\t\t};\n\t};\n\tA93E6A3010420AC0007D418B /* usocket.c */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 5250}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 728}\";\n\t\t};\n\t};\n\tA93E6A3110420AC0007D418B /* usocket.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {1206, 641}}\";\n\t\t\tsepNavSelRange = \"{601, 0}\";\n\t\t\tsepNavVisRange = \"{0, 1146}\";\n\t\t\tsepNavWindowFrame = \"{{15, 4}, {1265, 769}}\";\n\t\t};\n\t};\n\tA93E6A3410420AC0007D418B /* love.cpp */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {606, 2576}}\";\n\t\t\tsepNavSelRange = \"{4804, 0}\";\n\t\t\tsepNavVisRange = \"{3953, 397}\";\n\t\t};\n\t};\n\tA93E6A4410420AC0007D418B /* Audio.cpp */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {468, 2590}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 674}\";\n\t\t};\n\t};\n\tA93E6A4510420AC0007D418B /* Audio.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {481, 1624}}\";\n\t\t\tsepNavSelRange = \"{1170, 127}\";\n\t\t\tsepNavVisRange = \"{1062, 295}\";\n\t\t};\n\t};\n\tA93E6A4710420AC0007D418B /* Music.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {481, 1064}}\";\n\t\t\tsepNavSelRange = \"{1084, 127}\";\n\t\t\tsepNavVisRange = \"{1065, 229}\";\n\t\t};\n\t};\n\tA93E6A4910420AC0007D418B /* Pool.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {481, 1806}}\";\n\t\t\tsepNavSelRange = \"{1297, 0}\";\n\t\t\tsepNavVisRange = \"{1139, 229}\";\n\t\t};\n\t};\n\tA93E6A4A10420AC0007D418B /* Sound.cpp */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 1008}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 926}\";\n\t\t};\n\t};\n\tA93E6A4B10420AC0007D418B /* Sound.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {481, 980}}\";\n\t\t\tsepNavSelRange = \"{1242, 0}\";\n\t\t\tsepNavVisRange = \"{1066, 274}\";\n\t\t};\n\t};\n\tA93E6A4D10420AC0007D418B /* Source.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {481, 1190}}\";\n\t\t\tsepNavSelRange = \"{1243, 0}\";\n\t\t\tsepNavVisRange = \"{1095, 229}\";\n\t\t};\n\t};\n\tA93E6A5210420AC0007D418B /* wrap_Audio.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 798}}\";\n\t\t\tsepNavSelRange = \"{1721, 64}\";\n\t\t\tsepNavVisRange = \"{1247, 565}\";\n\t\t};\n\t};\n\tA93E6A5E10420AC1007D418B /* wrap_Event.cpp */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 1260}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 927}\";\n\t\t};\n\t};\n\tA93E6A6B10420AC1007D418B /* wrap_FileData.cpp */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 798}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 908}\";\n\t\t};\n\t};\n\tA93E6A7510420AC2007D418B /* wrap_Font.cpp */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 1064}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 927}\";\n\t\t};\n\t};\n\tA93E6A8910420AC2007D418B /* GLee.c */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 182112}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 847}\";\n\t\t};\n\t};\n\tA93E6A8D10420AC2007D418B /* Graphics.cpp */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {696, 17220}}\";\n\t\t\tsepNavSelRange = \"{2543, 0}\";\n\t\t\tsepNavVisRange = \"{2152, 690}\";\n\t\t};\n\t};\n\tA93E6A8E10420AC2007D418B /* Graphics.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {481, 7588}}\";\n\t\t\tsepNavSelRange = \"{2168, 0}\";\n\t\t\tsepNavVisRange = \"{1975, 342}\";\n\t\t};\n\t};\n\tA93E6A9010420AC2007D418B /* Image.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 2002}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{1597, 394}\";\n\t\t};\n\t};\n\tA93E6AB210420AC3007D418B /* wrap_ImageData.cpp */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 1932}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 927}\";\n\t\t};\n\t};\n\tA93E6AB710420AC3007D418B /* Joystick.cpp */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 2968}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 926}\";\n\t\t};\n\t};\n\tA93E6AB910420AC3007D418B /* wrap_Joystick.cpp */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 2366}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 927}\";\n\t\t};\n\t};\n\tA93E6ABE10420AC3007D418B /* Keyboard.cpp */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 812}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 926}\";\n\t\t};\n\t};\n\tA93E6AC510420AC3007D418B /* Mouse.cpp */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 980}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 926}\";\n\t\t};\n\t};\n\tA93E6AC710420AC3007D418B /* wrap_Mouse.cpp */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 1694}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 927}\";\n\t\t};\n\t};\n\tA93E6ACB10420AC3007D418B /* api.c */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {481, 1680}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{1254, 265}\";\n\t\t};\n\t};\n\tA93E6AD710420AC5007D418B /* libtcc.c */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {444, 31906}}\";\n\t\t\tsepNavSelRange = \"{39418, 40}\";\n\t\t\tsepNavVisRange = \"{39238, 339}\";\n\t\t\tsepNavWindowFrame = \"{{15, 4}, {1265, 769}}\";\n\t\t};\n\t};\n\tA93E6AD810420AC5007D418B /* libtcc.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 1526}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 299}\";\n\t\t};\n\t};\n\tA93E6AD910420AC5007D418B /* stab.def */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 3332}}\";\n\t\t\tsepNavSelRange = \"{8422, 0}\";\n\t\t\tsepNavVisRange = \"{8041, 701}\";\n\t\t};\n\t};\n\tA93E6ADB10420AC5007D418B /* tcc.c */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {498, 7854}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{16939, 512}\";\n\t\t\tsepNavWindowFrame = \"{{15, 4}, {1265, 769}}\";\n\t\t};\n\t};\n\tA93E6ADC10420AC5007D418B /* tcc.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {481, 10990}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{2051, 632}\";\n\t\t\tsepNavWindowFrame = \"{{15, 4}, {1265, 769}}\";\n\t\t};\n\t};\n\tA93E6ADF10420AC6007D418B /* tccelf.c */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 38388}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 822}\";\n\t\t};\n\t};\n\tA93E6AE210420AC7007D418B /* tccpp.c */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {481, 40502}}\";\n\t\t\tsepNavSelRange = \"{5078, 31}\";\n\t\t\tsepNavVisRange = \"{4906, 460}\";\n\t\t};\n\t};\n\tA93E6AE510420AC7007D418B /* Native.cpp */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 2282}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{598, 493}\";\n\t\t};\n\t};\n\tA93E6AE610420AC7007D418B /* Native.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 1162}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{844, 283}\";\n\t\t};\n\t};\n\tA93E6AE710420AC7007D418B /* wrap_Native.cpp */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 1792}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 927}\";\n\t\t};\n\t};\n\tA93E6AF010420AC7007D418B /* Contact.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {468, 1526}}\";\n\t\t\tsepNavSelRange = \"{1359, 0}\";\n\t\t\tsepNavVisRange = \"{1199, 238}\";\n\t\t};\n\t};\n\tA93E6B0810420AC8007D418B /* Shape.cpp */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 2660}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 927}\";\n\t\t};\n\t};\n\tA93E6B1710420AC8007D418B /* b2CircleShape.cpp */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 1568}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 947}\";\n\t\t};\n\t};\n\tA93E6B5810420ACA007D418B /* wrap_GearJoint.cpp */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 854}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 927}\";\n\t\t};\n\t};\n\tA93E6B7010420ACB007D418B /* Signal.cpp */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 896}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 908}\";\n\t\t};\n\t};\n\tA93E6B7110420ACB007D418B /* Signal.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 812}}\";\n\t\t\tsepNavSelRange = \"{1377, 23}\";\n\t\t\tsepNavVisRange = \"{4, 905}\";\n\t\t};\n\t};\n\tA93E6B7210420ACB007D418B /* wrap_Signal.cpp */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 1106}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 908}\";\n\t\t};\n\t};\n\tA93E6B7910420ACB007D418B /* FLACDecoder.cpp */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 2296}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 908}\";\n\t\t};\n\t};\n\tA93E6B7F10420ACB007D418B /* Sound.cpp */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {618, 1050}}\";\n\t\t\tsepNavSelRange = \"{1940, 0}\";\n\t\t\tsepNavVisRange = \"{0, 926}\";\n\t\t};\n\t};\n\tA93E6B9710420ACC007D418B /* boot.lua */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {481, 9702}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 391}\";\n\t\t};\n\t};\n\tA93E6B9810420ACC007D418B /* boot.lua.h */ = {\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 9926}}\";\n\t\t\tsepNavSelRange = \"{0, 0}\";\n\t\t\tsepNavVisRange = \"{0, 1228}\";\n\t\t};\n\t};\n\tA9D8FBD21043E5320063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A93E6A8910420AC2007D418B /* GLee.c */;\n\t\tname = \"GLee.c: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 847;\n\t\tvrLoc = 0;\n\t};\n\tA9D8FBE01043E5AE0063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tcomments = \"warning: 'OV_CALLBACKS_DEFAULT' defined but not used\";\n\t\tfRef = A9D8FBE11043E5AE0063561F /* vorbisfile.h */;\n\t\trLen = 1;\n\t\trLoc = 55;\n\t\trType = 1;\n\t};\n\tA9D8FBE11043E5AE0063561F /* vorbisfile.h */ = {\n\t\tisa = PBXFileReference;\n\t\tlastKnownFileType = sourcecode.c.h;\n\t\tname = vorbisfile.h;\n\t\tpath = /opt/local/include/vorbis/vorbisfile.h;\n\t\tsourceTree = \"<absolute>\";\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {519, 2464}}\";\n\t\t\tsepNavSelRange = \"{2279, 45}\";\n\t\t\tsepNavVisRange = \"{1931, 733}\";\n\t\t};\n\t};\n\tA9D8FBE21043E5AE0063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9D8FBE31043E5AE0063561F /* vorbisfile.h */;\n\t\tname = \"vorbisfile.h: 56\";\n\t\trLen = 45;\n\t\trLoc = 2279;\n\t\trType = 0;\n\t\tvrLen = 629;\n\t\tvrLoc = 1931;\n\t};\n\tA9D8FBE31043E5AE0063561F /* vorbisfile.h */ = {\n\t\tisa = PBXFileReference;\n\t\tlastKnownFileType = sourcecode.c.h;\n\t\tname = vorbisfile.h;\n\t\tpath = /opt/local/include/vorbis/vorbisfile.h;\n\t\tsourceTree = \"<absolute>\";\n\t\tuiCtxt = {\n\t\t\tsepNavIntBoundsRect = \"{{0, 0}, {492, 2618}}\";\n\t\t\tsepNavSelRange = \"{2279, 45}\";\n\t\t\tsepNavVisRange = \"{1931, 629}\";\n\t\t};\n\t};\n\tA9D8FBE71043E5C10063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A93E6A8910420AC2007D418B /* GLee.c */;\n\t\tname = \"GLee.c: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 847;\n\t\tvrLoc = 0;\n\t};\n\tA9D8FBE81043E5C10063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A93E6B7910420ACB007D418B /* FLACDecoder.cpp */;\n\t\tname = \"FLACDecoder.cpp: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 908;\n\t\tvrLoc = 0;\n\t};\n\tA9D8FBE91043E5C10063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A93E6B7F10420ACB007D418B /* Sound.cpp */;\n\t\tname = \"Sound.cpp: 63\";\n\t\trLen = 0;\n\t\trLoc = 1940;\n\t\trType = 0;\n\t\tvrLen = 926;\n\t\tvrLoc = 0;\n\t};\n\tA9D8FBEA1043E5C10063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A93E6A8910420AC2007D418B /* GLee.c */;\n\t\tname = \"GLee.c: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 847;\n\t\tvrLoc = 0;\n\t};\n\tA9D8FBEB1043E5C10063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A93E6B7910420ACB007D418B /* FLACDecoder.cpp */;\n\t\tname = \"FLACDecoder.cpp: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 908;\n\t\tvrLoc = 0;\n\t};\n\tA9D8FBEC1043E5C10063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A93E6B7F10420ACB007D418B /* Sound.cpp */;\n\t\tname = \"Sound.cpp: 63\";\n\t\trLen = 0;\n\t\trLoc = 1940;\n\t\trType = 0;\n\t\tvrLen = 926;\n\t\tvrLoc = 0;\n\t};\n\tA9D8FBED1043E5C10063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9D8FBE11043E5AE0063561F /* vorbisfile.h */;\n\t\tname = \"vorbisfile.h: 56\";\n\t\trLen = 45;\n\t\trLoc = 2279;\n\t\trType = 0;\n\t\tvrLen = 733;\n\t\tvrLoc = 1931;\n\t};\n\tA9D8FBFC1043E7C20063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9D8FBE11043E5AE0063561F /* vorbisfile.h */;\n\t\tname = \"vorbisfile.h: 56\";\n\t\trLen = 45;\n\t\trLoc = 2279;\n\t\trType = 0;\n\t\tvrLen = 733;\n\t\tvrLoc = 1931;\n\t};\n\tA9D8FC011043E8770063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9D8FBE11043E5AE0063561F /* vorbisfile.h */;\n\t\tname = \"vorbisfile.h: 56\";\n\t\trLen = 45;\n\t\trLoc = 2279;\n\t\trType = 0;\n\t\tvrLen = 733;\n\t\tvrLoc = 1931;\n\t};\n\tA9D8FC031043E94F0063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9D8FBE11043E5AE0063561F /* vorbisfile.h */;\n\t\tname = \"vorbisfile.h: 56\";\n\t\trLen = 45;\n\t\trLoc = 2279;\n\t\trType = 0;\n\t\tvrLen = 733;\n\t\tvrLoc = 1931;\n\t};\n\tA9D8FC041043E94F0063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9255DEA1043188D00BA1496 /* SDLMain.m */;\n\t\tname = \"SDLMain.m: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 604;\n\t\tvrLoc = 0;\n\t};\n\tA9D8FC051043E94F0063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9D8FBE11043E5AE0063561F /* vorbisfile.h */;\n\t\tname = \"vorbisfile.h: 56\";\n\t\trLen = 45;\n\t\trLoc = 2279;\n\t\trType = 0;\n\t\tvrLen = 733;\n\t\tvrLoc = 1931;\n\t};\n\tA9D8FC061043E94F0063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9255DEA1043188D00BA1496 /* SDLMain.m */;\n\t\tname = \"SDLMain.m: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 549;\n\t\tvrLoc = 347;\n\t};\n\tA9D8FC0D1043EBD30063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9255DEA1043188D00BA1496 /* SDLMain.m */;\n\t\tname = \"SDLMain.m: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 596;\n\t\tvrLoc = 561;\n\t};\n\tA9D8FC131043EC200063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9255DEA1043188D00BA1496 /* SDLMain.m */;\n\t\tname = \"SDLMain.m: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 596;\n\t\tvrLoc = 561;\n\t};\n\tA9D8FC1E1043EFA00063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9255DEA1043188D00BA1496 /* SDLMain.m */;\n\t\tname = \"SDLMain.m: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 596;\n\t\tvrLoc = 561;\n\t};\n\tA9D8FC2010441C030063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9255DEA1043188D00BA1496 /* SDLMain.m */;\n\t\tname = \"SDLMain.m: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 596;\n\t\tvrLoc = 561;\n\t};\n\tA9D8FC2110441C0F0063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9255DEA1043188D00BA1496 /* SDLMain.m */;\n\t\tname = \"SDLMain.m: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 596;\n\t\tvrLoc = 561;\n\t};\n\tA9D8FC2410441DF10063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9255DEA1043188D00BA1496 /* SDLMain.m */;\n\t\tname = \"SDLMain.m: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 596;\n\t\tvrLoc = 561;\n\t};\n\tA9D8FC2510441E590063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9255DEA1043188D00BA1496 /* SDLMain.m */;\n\t\tname = \"SDLMain.m: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 596;\n\t\tvrLoc = 561;\n\t};\n\tA9D8FC2610441E700063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9255DEA1043188D00BA1496 /* SDLMain.m */;\n\t\tname = \"SDLMain.m: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 596;\n\t\tvrLoc = 561;\n\t};\n\tA9D8FC2710441E890063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9255DEA1043188D00BA1496 /* SDLMain.m */;\n\t\tname = \"SDLMain.m: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 596;\n\t\tvrLoc = 561;\n\t};\n\tA9D8FC2910441E9B0063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9255DEA1043188D00BA1496 /* SDLMain.m */;\n\t\tname = \"SDLMain.m: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 596;\n\t\tvrLoc = 561;\n\t};\n\tA9D8FC2F104423D80063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9D8FBE31043E5AE0063561F /* vorbisfile.h */;\n\t\tname = \"vorbisfile.h: 56\";\n\t\trLen = 45;\n\t\trLoc = 2279;\n\t\trType = 0;\n\t\tvrLen = 629;\n\t\tvrLoc = 1931;\n\t};\n\tA9D8FC30104423D80063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tcomments = \"error: 'struct mcontext' has no member named '__ss'\";\n\t\tfRef = A93E6AD710420AC5007D418B /* libtcc.c */;\n\t\trLen = 1;\n\t\trLoc = 1480;\n\t\trType = 1;\n\t};\n\tA9D8FC31104423D80063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9D8FBE31043E5AE0063561F /* vorbisfile.h */;\n\t\tname = \"vorbisfile.h: 56\";\n\t\trLen = 45;\n\t\trLoc = 2279;\n\t\trType = 0;\n\t\tvrLen = 629;\n\t\tvrLoc = 1931;\n\t};\n\tA9D8FC32104423D80063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A93E6AD710420AC5007D418B /* libtcc.c */;\n\t\tname = \"libtcc.c: 1481\";\n\t\trLen = 40;\n\t\trLoc = 39418;\n\t\trType = 0;\n\t\tvrLen = 300;\n\t\tvrLoc = 39238;\n\t};\n\tA9D8FC36104423F90063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9255DEA1043188D00BA1496 /* SDLMain.m */;\n\t\tname = \"SDLMain.m: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 596;\n\t\tvrLoc = 561;\n\t};\n\tA9D8FC3D104427770063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9255DEA1043188D00BA1496 /* SDLMain.m */;\n\t\tname = \"SDLMain.m: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 596;\n\t\tvrLoc = 561;\n\t};\n\tA9D8FC3F104427A10063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9255DEA1043188D00BA1496 /* SDLMain.m */;\n\t\tname = \"SDLMain.m: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 596;\n\t\tvrLoc = 561;\n\t};\n\tA9D8FC40104427AE0063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9255DEA1043188D00BA1496 /* SDLMain.m */;\n\t\tname = \"SDLMain.m: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 596;\n\t\tvrLoc = 561;\n\t};\n\tA9D8FC421044283D0063561F /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9255DEA1043188D00BA1496 /* SDLMain.m */;\n\t\tname = \"SDLMain.m: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 596;\n\t\tvrLoc = 561;\n\t};\n\tA9DE83571043CE2800567BA4 /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A93E6B7110420ACB007D418B /* Signal.h */;\n\t\tname = \"Signal.h: 52\";\n\t\trLen = 23;\n\t\trLoc = 1377;\n\t\trType = 0;\n\t\tvrLen = 905;\n\t\tvrLoc = 4;\n\t};\n\tA9DE83591043CE2800567BA4 /* Makefile */ = {\n\t\tisa = PBXFileReference;\n\t\tlastKnownFileType = sourcecode.make;\n\t\tname = Makefile;\n\t\tpath = \"/Users/bill/Downloads/flac-1.2.1/src/libFLAC++/Makefile\";\n\t\tsourceTree = \"<absolute>\";\n\t};\n\tA9DE835A1043CE2800567BA4 /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A93E6B7110420ACB007D418B /* Signal.h */;\n\t\tname = \"Signal.h: 52\";\n\t\trLen = 23;\n\t\trLoc = 1377;\n\t\trType = 0;\n\t\tvrLen = 905;\n\t\tvrLoc = 4;\n\t};\n\tA9DE83781043CFEF00567BA4 /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9DE83591043CE2800567BA4 /* Makefile */;\n\t\tname = \"Makefile: 608\";\n\t\trLen = 0;\n\t\trLoc = 18653;\n\t\trType = 0;\n\t\tvrLen = 753;\n\t\tvrLoc = 233;\n\t};\n\tA9DE83791043CFEF00567BA4 /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A93E6ADF10420AC6007D418B /* tccelf.c */;\n\t\tname = \"tccelf.c: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 822;\n\t\tvrLoc = 0;\n\t};\n\tA9DE837A1043CFEF00567BA4 /* PBXBookmark */ = {\n\t\tisa = PBXBookmark;\n\t\tfRef = A93E6A8910420AC2007D418B /* GLee.c */;\n\t};\n\tA9DE837B1043CFEF00567BA4 /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A9DE83591043CE2800567BA4 /* Makefile */;\n\t\tname = \"Makefile: 608\";\n\t\trLen = 0;\n\t\trLoc = 18653;\n\t\trType = 0;\n\t\tvrLen = 753;\n\t\tvrLoc = 233;\n\t};\n\tA9DE837C1043CFEF00567BA4 /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A93E6ADF10420AC6007D418B /* tccelf.c */;\n\t\tname = \"tccelf.c: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 822;\n\t\tvrLoc = 0;\n\t};\n\tA9DE85AA1043E49900567BA4 /* PBXTextBookmark */ = {\n\t\tisa = PBXTextBookmark;\n\t\tfRef = A93E6A8910420AC2007D418B /* GLee.c */;\n\t\tname = \"GLee.c: 1\";\n\t\trLen = 0;\n\t\trLoc = 0;\n\t\trType = 0;\n\t\tvrLen = 847;\n\t\tvrLoc = 0;\n\t};\n}\n"
  },
  {
    "path": "platform/xcode/love.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 52;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t05D204142D37FEFA00C1EE87 /* SDL3.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = D9596F632CBAC98B00BE58C1 /* SDL3.xcframework */; };\n\t\t05D204152D37FEFA00C1EE87 /* SDL3.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D9596F632CBAC98B00BE58C1 /* SDL3.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };\n\t\tA9255DD31043183600BA1496 /* Lua.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A93E6E5310420B57007D418B /* Lua.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };\n\t\tA9255E031043195A00BA1496 /* vorbis.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9255E021043195A00BA1496 /* vorbis.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };\n\t\tA9255F58104324E100BA1496 /* ogg.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9255F51104324D700BA1496 /* ogg.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };\n\t\tA93E6E5510420B57007D418B /* Lua.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A93E6E5310420B57007D418B /* Lua.framework */; };\n\t\tA93E6EED10420BA8007D418B /* love.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6A3410420AC0007D418B /* love.cpp */; };\n\t\tA9F169AD109E825000FC83D1 /* libmodplug.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = A9F16926109E7BAD00FC83D1 /* libmodplug.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };\n\t\tCE73F8001EEB64150052DAB3 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE73F7FF1EEB64150052DAB3 /* AVFoundation.framework */; };\n\t\tD9596F642CBAC98B00BE58C1 /* SDL3.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = D9596F632CBAC98B00BE58C1 /* SDL3.xcframework */; };\n\t\tD9596F662CBAC99F00BE58C1 /* SDL3.xcframework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = D9596F632CBAC98B00BE58C1 /* SDL3.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\tD9DAB9372963CF6900C64820 /* harfbuzz.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = D9DAB9352963CF5F00C64820 /* harfbuzz.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\tFA0797991BF480A200034B7C /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA0797981BF480A200034B7C /* GameController.framework */; settings = {ATTRIBUTES = (Weak, ); }; };\n\t\tFA08F69616C766E000F007B5 /* love.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA08F69116C765A200F007B5 /* love.framework */; };\n\t\tFA08F69716C766E700F007B5 /* love.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = FA08F69116C765A200F007B5 /* love.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };\n\t\tFA0B7F301A95AC7D000E1D17 /* love.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A93E6A3410420AC0007D418B /* love.cpp */; };\n\t\tFA15DFB41F9B8D9E0042AB22 /* libbz2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = FA15DFB31F9B8D9E0042AB22 /* libbz2.tbd */; };\n\t\tFA27B3CB1B498696008A9DCE /* theora.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA27B3CA1B498696008A9DCE /* theora.framework */; };\n\t\tFA5933751C6D625B000EC779 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FA5D249A1A96CF4300C6FC8F /* Images.xcassets */; };\n\t\tFA5D24821A96CA1800C6FC8F /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA5D24811A96CA1800C6FC8F /* OpenAL.framework */; };\n\t\tFA5D24841A96CA2700C6FC8F /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA5D24831A96CA2700C6FC8F /* OpenGLES.framework */; };\n\t\tFA5D24881A96CA8A00C6FC8F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA5D24871A96CA8A00C6FC8F /* UIKit.framework */; };\n\t\tFA5D248A1A96CA9600C6FC8F /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA5D24891A96CA9600C6FC8F /* AudioToolbox.framework */; };\n\t\tFA5D248C1A96CA9E00C6FC8F /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA5D248B1A96CA9E00C6FC8F /* QuartzCore.framework */; };\n\t\tFA5D248E1A96CAA700C6FC8F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA5D248D1A96CAA700C6FC8F /* CoreGraphics.framework */; };\n\t\tFA5D24941A96CABA00C6FC8F /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FA5D24931A96CABA00C6FC8F /* libz.dylib */; };\n\t\tFA5D24961A96CAC200C6FC8F /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA5D24951A96CAC200C6FC8F /* CoreMotion.framework */; };\n\t\tFA5D249C1A96CF4300C6FC8F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FA5D249A1A96CF4300C6FC8F /* Images.xcassets */; };\n\t\tFA5D24C21A96D78000C6FC8F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA5D24C11A96D78000C6FC8F /* Foundation.framework */; };\n\t\tFA5D24D11A96E73300C6FC8F /* liblove.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FA0B7EEF1A95924A000E1D17 /* liblove.a */; };\n\t\tFA7C636A1A9C49570000FD29 /* Launch Screen.xib in Resources */ = {isa = PBXBuildFile; fileRef = FA7C63691A9C49570000FD29 /* Launch Screen.xib */; };\n\t\tFA84DE78277CB55B002674C6 /* CoreHaptics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA84DE77277CB55B002674C6 /* CoreHaptics.framework */; settings = {ATTRIBUTES = (Weak, ); }; };\n\t\tFAAFF04716CB120000CCDE45 /* OpenAL-Soft.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = FAAFF04616CB120000CCDE45 /* OpenAL-Soft.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };\n\t\tFAC1A449196F5DC600125284 /* license.txt in Resources */ = {isa = PBXBuildFile; fileRef = FAC1A448196F5DC600125284 /* license.txt */; };\n\t\tFAD43ED01FF3136500831BB8 /* freetype.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = FAD43ECF1FF3133700831BB8 /* freetype.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\tFAD4B1731C1F50A3004CF150 /* theora.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = FA27B3CA1B498696008A9DCE /* theora.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };\n\t\tFAE64A9D2072738600BC7981 /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FAE64A9C2072738600BC7981 /* Metal.framework */; settings = {ATTRIBUTES = (Weak, ); }; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\tFA0B78D71A958301000E1D17 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = FA577A9316C7217800860150 /* liblove.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = FA577AAF16C7507900860150;\n\t\t\tremoteInfo = Framework;\n\t\t};\n\t\tFA0B7EEE1A95924A000E1D17 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = FA577A9316C7217800860150 /* liblove.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = FA0B78DD1A958B90000E1D17;\n\t\t\tremoteInfo = \"liblove-ios\";\n\t\t};\n\t\tFA5D24BA1A96D6FC00C6FC8F /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = FA577A9316C7217800860150 /* liblove.xcodeproj */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = FA0B78DC1A958B90000E1D17;\n\t\t\tremoteInfo = \"liblove-ios\";\n\t\t};\n\t\tFAA287711B0ABF1400B82827 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = FA577A9316C7217800860150 /* liblove.xcodeproj */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = FA577AAE16C7507900860150;\n\t\t\tremoteInfo = \"liblove-macosx\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t05D204162D37FEFA00C1EE87 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t05D204152D37FEFA00C1EE87 /* SDL3.xcframework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tA9255DDE1043185300BA1496 /* Copy Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\tFA08F69716C766E700F007B5 /* love.framework in Copy Frameworks */,\n\t\t\t\tD9596F662CBAC99F00BE58C1 /* SDL3.xcframework in Copy Frameworks */,\n\t\t\t\tFAD4B1731C1F50A3004CF150 /* theora.framework in Copy Frameworks */,\n\t\t\t\tFAAFF04716CB120000CCDE45 /* OpenAL-Soft.framework in Copy Frameworks */,\n\t\t\t\tFAD43ED01FF3136500831BB8 /* freetype.framework in Copy Frameworks */,\n\t\t\t\tD9DAB9372963CF6900C64820 /* harfbuzz.framework in Copy Frameworks */,\n\t\t\t\tA9F169AD109E825000FC83D1 /* libmodplug.framework in Copy Frameworks */,\n\t\t\t\tA9255F58104324E100BA1496 /* ogg.framework in Copy Frameworks */,\n\t\t\t\tA9255E031043195A00BA1496 /* vorbis.framework in Copy Frameworks */,\n\t\t\t\tA9255DD31043183600BA1496 /* Lua.framework in Copy Frameworks */,\n\t\t\t);\n\t\t\tname = \"Copy Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = \"<absolute>\"; };\n\t\t8D1107320486CEB800E47090 /* love.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = love.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tA9255E021043195A00BA1496 /* vorbis.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = vorbis.framework; path = macosx/Frameworks/vorbis.framework; sourceTree = \"<group>\"; };\n\t\tA9255F51104324D700BA1496 /* ogg.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ogg.framework; path = macosx/Frameworks/ogg.framework; sourceTree = \"<group>\"; };\n\t\tA93E6A3410420AC0007D418B /* love.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = love.cpp; path = ../../src/love.cpp; sourceTree = \"<group>\"; };\n\t\tA93E6E4710420B4A007D418B /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = \"<absolute>\"; };\n\t\tA93E6E5310420B57007D418B /* Lua.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Lua.framework; path = macosx/Frameworks/Lua.framework; sourceTree = \"<group>\"; };\n\t\tA97E3842132A9EDE00198A2F /* love-macosx.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = \"love-macosx.plist\"; path = \"macosx/love-macosx.plist\"; sourceTree = \"<group>\"; };\n\t\tA9F16926109E7BAD00FC83D1 /* libmodplug.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = libmodplug.framework; path = macosx/Frameworks/libmodplug.framework; sourceTree = \"<group>\"; };\n\t\tCE73F7FF1EEB64150052DAB3 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/AVFoundation.framework; sourceTree = DEVELOPER_DIR; };\n\t\tD9596F632CBAC98B00BE58C1 /* SDL3.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = SDL3.xcframework; path = shared/Frameworks/SDL3.xcframework; sourceTree = \"<group>\"; };\n\t\tD9DAB9352963CF5F00C64820 /* harfbuzz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = harfbuzz.framework; path = macosx/Frameworks/harfbuzz.framework; sourceTree = \"<group>\"; };\n\t\tFA0797981BF480A200034B7C /* GameController.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameController.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.1.sdk/System/Library/Frameworks/GameController.framework; sourceTree = DEVELOPER_DIR; };\n\t\tFA08F69116C765A200F007B5 /* love.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = love.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tFA0B7F061A95AAF3000E1D17 /* love.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = love.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tFA15DFB31F9B8D9E0042AB22 /* libbz2.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = libbz2.tbd; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.0.sdk/usr/lib/libbz2.tbd; sourceTree = DEVELOPER_DIR; };\n\t\tFA27B3CA1B498696008A9DCE /* theora.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = theora.framework; path = macosx/Frameworks/theora.framework; sourceTree = \"<group>\"; };\n\t\tFA577A9316C7217800860150 /* liblove.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; path = liblove.xcodeproj; sourceTree = \"<group>\"; };\n\t\tFA5D24811A96CA1800C6FC8F /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/OpenAL.framework; sourceTree = DEVELOPER_DIR; };\n\t\tFA5D24831A96CA2700C6FC8F /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/OpenGLES.framework; sourceTree = DEVELOPER_DIR; };\n\t\tFA5D24871A96CA8A00C6FC8F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };\n\t\tFA5D24891A96CA9600C6FC8F /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/AudioToolbox.framework; sourceTree = DEVELOPER_DIR; };\n\t\tFA5D248B1A96CA9E00C6FC8F /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; };\n\t\tFA5D248D1A96CAA700C6FC8F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; };\n\t\tFA5D24931A96CABA00C6FC8F /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = \"compiled.mach-o.dylib\"; name = libz.dylib; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/usr/lib/libz.dylib; sourceTree = DEVELOPER_DIR; };\n\t\tFA5D24951A96CAC200C6FC8F /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/CoreMotion.framework; sourceTree = DEVELOPER_DIR; };\n\t\tFA5D24971A96CE1E00C6FC8F /* love-ios.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = \"love-ios.plist\"; path = \"ios/love-ios.plist\"; sourceTree = \"<group>\"; };\n\t\tFA5D249A1A96CF4300C6FC8F /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = \"<group>\"; };\n\t\tFA5D24C11A96D78000C6FC8F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };\n\t\tFA7C63691A9C49570000FD29 /* Launch Screen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = \"Launch Screen.xib\"; path = \"ios/Launch Screen.xib\"; sourceTree = \"<group>\"; };\n\t\tFA84DE77277CB55B002674C6 /* CoreHaptics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreHaptics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.2.sdk/System/Library/Frameworks/CoreHaptics.framework; sourceTree = DEVELOPER_DIR; };\n\t\tFA9B4A0916E1579F00074F42 /* SDL2.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SDL2.framework; path = macosx/Frameworks/SDL2.framework; sourceTree = \"<group>\"; };\n\t\tFAAFF04616CB120000CCDE45 /* OpenAL-Soft.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = \"OpenAL-Soft.framework\"; path = \"macosx/Frameworks/OpenAL-Soft.framework\"; sourceTree = \"<group>\"; };\n\t\tFAC1A448196F5DC600125284 /* license.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = license.txt; path = ../../license.txt; sourceTree = \"<group>\"; };\n\t\tFAD43ECF1FF3133700831BB8 /* freetype.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = freetype.framework; path = macosx/Frameworks/freetype.framework; sourceTree = \"<group>\"; };\n\t\tFAE64A9C2072738600BC7981 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.2.sdk/System/Library/Frameworks/Metal.framework; sourceTree = DEVELOPER_DIR; };\n\t\tFAF5F96C233965DF0030A68A /* love.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = love.entitlements; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t8D11072E0486CEB800E47090 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tFA08F69616C766E000F007B5 /* love.framework in Frameworks */,\n\t\t\t\tD9596F642CBAC98B00BE58C1 /* SDL3.xcframework in Frameworks */,\n\t\t\t\t8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,\n\t\t\t\tA93E6E5510420B57007D418B /* Lua.framework in Frameworks */,\n\t\t\t\tFA27B3CB1B498696008A9DCE /* theora.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tFA0B7F031A95AAF3000E1D17 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tFA84DE78277CB55B002674C6 /* CoreHaptics.framework in Frameworks */,\n\t\t\t\tFAE64A9D2072738600BC7981 /* Metal.framework in Frameworks */,\n\t\t\t\tFA15DFB41F9B8D9E0042AB22 /* libbz2.tbd in Frameworks */,\n\t\t\t\tCE73F8001EEB64150052DAB3 /* AVFoundation.framework in Frameworks */,\n\t\t\t\tFA5D24D11A96E73300C6FC8F /* liblove.a in Frameworks */,\n\t\t\t\tFA5D24C21A96D78000C6FC8F /* Foundation.framework in Frameworks */,\n\t\t\t\tFA5D24961A96CAC200C6FC8F /* CoreMotion.framework in Frameworks */,\n\t\t\t\tFA0797991BF480A200034B7C /* GameController.framework in Frameworks */,\n\t\t\t\tFA5D24941A96CABA00C6FC8F /* libz.dylib in Frameworks */,\n\t\t\t\tFA5D248E1A96CAA700C6FC8F /* CoreGraphics.framework in Frameworks */,\n\t\t\t\tFA5D248C1A96CA9E00C6FC8F /* QuartzCore.framework in Frameworks */,\n\t\t\t\tFA5D248A1A96CA9600C6FC8F /* AudioToolbox.framework in Frameworks */,\n\t\t\t\tFA5D24881A96CA8A00C6FC8F /* UIKit.framework in Frameworks */,\n\t\t\t\t05D204142D37FEFA00C1EE87 /* SDL3.xcframework in Frameworks */,\n\t\t\t\tFA5D24841A96CA2700C6FC8F /* OpenGLES.framework in Frameworks */,\n\t\t\t\tFA5D24821A96CA1800C6FC8F /* OpenAL.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t1058C7A0FEA54F0111CA2CBB /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD9596F632CBAC98B00BE58C1 /* SDL3.xcframework */,\n\t\t\t\tFA84DE77277CB55B002674C6 /* CoreHaptics.framework */,\n\t\t\t\tFAE64A9C2072738600BC7981 /* Metal.framework */,\n\t\t\t\tFA15DFB31F9B8D9E0042AB22 /* libbz2.tbd */,\n\t\t\t\tCE73F7FF1EEB64150052DAB3 /* AVFoundation.framework */,\n\t\t\t\tFA5D24801A96C97900C6FC8F /* ios */,\n\t\t\t\tFA0B7EEC1A959249000E1D17 /* macosx */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t19C28FACFE9D520D11CA2CBB /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8D1107320486CEB800E47090 /* love.app */,\n\t\t\t\tFA0B7F061A95AAF3000E1D17 /* love.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t29B97314FDCFA39411CA2CEA /* love */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA5D249A1A96CF4300C6FC8F /* Images.xcassets */,\n\t\t\t\tFAF5F96C233965DF0030A68A /* love.entitlements */,\n\t\t\t\t19C28FACFE9D520D11CA2CBB /* Products */,\n\t\t\t\t1058C7A0FEA54F0111CA2CBB /* Frameworks */,\n\t\t\t\tFA5D24A01A96CF7200C6FC8F /* Supporting Files */,\n\t\t\t\t29B97317FDCFA39411CA2CEA /* Resources */,\n\t\t\t\tFA577A9D16C7262E00860150 /* Source */,\n\t\t\t\tFA577A9316C7217800860150 /* liblove.xcodeproj */,\n\t\t\t);\n\t\t\tname = love;\n\t\t\tsourceTree = \"<group>\";\n\t\t\tusesTabs = 1;\n\t\t};\n\t\t29B97317FDCFA39411CA2CEA /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFAC1A448196F5DC600125284 /* license.txt */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B78D41A958301000E1D17 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0B78D81A958301000E1D17 /* love.framework */,\n\t\t\t\tFA0B7EEF1A95924A000E1D17 /* liblove.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA0B7EEC1A959249000E1D17 /* macosx */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,\n\t\t\t\tFAD43ECF1FF3133700831BB8 /* freetype.framework */,\n\t\t\t\tD9DAB9352963CF5F00C64820 /* harfbuzz.framework */,\n\t\t\t\tA9F16926109E7BAD00FC83D1 /* libmodplug.framework */,\n\t\t\t\tFA08F69116C765A200F007B5 /* love.framework */,\n\t\t\t\tA93E6E5310420B57007D418B /* Lua.framework */,\n\t\t\t\tA9255F51104324D700BA1496 /* ogg.framework */,\n\t\t\t\tFAAFF04616CB120000CCDE45 /* OpenAL-Soft.framework */,\n\t\t\t\tA93E6E4710420B4A007D418B /* OpenGL.framework */,\n\t\t\t\tFA9B4A0916E1579F00074F42 /* SDL2.framework */,\n\t\t\t\tFA27B3CA1B498696008A9DCE /* theora.framework */,\n\t\t\t\tA9255E021043195A00BA1496 /* vorbis.framework */,\n\t\t\t);\n\t\t\tname = macosx;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA577A9D16C7262E00860150 /* Source */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA93E6A3410420AC0007D418B /* love.cpp */,\n\t\t\t);\n\t\t\tname = Source;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA5D24801A96C97900C6FC8F /* ios */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA0797981BF480A200034B7C /* GameController.framework */,\n\t\t\t\tFA5D24C11A96D78000C6FC8F /* Foundation.framework */,\n\t\t\t\tFA5D24891A96CA9600C6FC8F /* AudioToolbox.framework */,\n\t\t\t\tFA5D248D1A96CAA700C6FC8F /* CoreGraphics.framework */,\n\t\t\t\tFA5D24951A96CAC200C6FC8F /* CoreMotion.framework */,\n\t\t\t\tFA5D24931A96CABA00C6FC8F /* libz.dylib */,\n\t\t\t\tFA5D24811A96CA1800C6FC8F /* OpenAL.framework */,\n\t\t\t\tFA5D24831A96CA2700C6FC8F /* OpenGLES.framework */,\n\t\t\t\tFA5D248B1A96CA9E00C6FC8F /* QuartzCore.framework */,\n\t\t\t\tFA5D24871A96CA8A00C6FC8F /* UIKit.framework */,\n\t\t\t);\n\t\t\tname = ios;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA5D24A01A96CF7200C6FC8F /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA7C63691A9C49570000FD29 /* Launch Screen.xib */,\n\t\t\t\tFA5D24971A96CE1E00C6FC8F /* love-ios.plist */,\n\t\t\t\tA97E3842132A9EDE00198A2F /* love-macosx.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t8D1107260486CEB800E47090 /* love-macosx */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget \"love-macosx\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t8D1107290486CEB800E47090 /* Resources */,\n\t\t\t\t8D11072C0486CEB800E47090 /* Sources */,\n\t\t\t\tA9255DDE1043185300BA1496 /* Copy Frameworks */,\n\t\t\t\t8D11072E0486CEB800E47090 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tFAA287721B0ABF1400B82827 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"love-macosx\";\n\t\t\tproductInstallPath = \"$(HOME)/Applications\";\n\t\t\tproductName = love;\n\t\t\tproductReference = 8D1107320486CEB800E47090 /* love.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\tFA0B7F051A95AAF3000E1D17 /* love-ios */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = FA0B7F2E1A95AAF4000E1D17 /* Build configuration list for PBXNativeTarget \"love-ios\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tFA0B7F021A95AAF3000E1D17 /* Sources */,\n\t\t\t\tFA0B7F031A95AAF3000E1D17 /* Frameworks */,\n\t\t\t\tFA0B7F041A95AAF3000E1D17 /* Resources */,\n\t\t\t\t05D204162D37FEFA00C1EE87 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tFA5D24BB1A96D6FC00C6FC8F /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"love-ios\";\n\t\t\tproductName = \"love-ios\";\n\t\t\tproductReference = FA0B7F061A95AAF3000E1D17 /* love.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t29B97313FDCFA39411CA2CEA /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 1340;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tFA0B7F051A95AAF3000E1D17 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.1.1;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject \"love\" */;\n\t\t\tcompatibilityVersion = \"Xcode 11.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 1;\n\t\t\tknownRegions = (\n\t\t\t\tBase,\n\t\t\t\tfr,\n\t\t\t\ten,\n\t\t\t\tja,\n\t\t\t\tde,\n\t\t\t);\n\t\t\tmainGroup = 29B97314FDCFA39411CA2CEA /* love */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectReferences = (\n\t\t\t\t{\n\t\t\t\t\tProductGroup = FA0B78D41A958301000E1D17 /* Products */;\n\t\t\t\t\tProjectRef = FA577A9316C7217800860150 /* liblove.xcodeproj */;\n\t\t\t\t},\n\t\t\t);\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t8D1107260486CEB800E47090 /* love-macosx */,\n\t\t\t\tFA0B7F051A95AAF3000E1D17 /* love-ios */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXReferenceProxy section */\n\t\tFA0B78D81A958301000E1D17 /* love.framework */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = wrapper.framework;\n\t\t\tpath = love.framework;\n\t\t\tremoteRef = FA0B78D71A958301000E1D17 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\tFA0B7EEF1A95924A000E1D17 /* liblove.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = liblove.a;\n\t\t\tremoteRef = FA0B7EEE1A95924A000E1D17 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n/* End PBXReferenceProxy section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t8D1107290486CEB800E47090 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tFA5933751C6D625B000EC779 /* Images.xcassets in Resources */,\n\t\t\t\tFAC1A449196F5DC600125284 /* license.txt in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tFA0B7F041A95AAF3000E1D17 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tFA5D249C1A96CF4300C6FC8F /* Images.xcassets in Resources */,\n\t\t\t\tFA7C636A1A9C49570000FD29 /* Launch Screen.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t8D11072C0486CEB800E47090 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tA93E6EED10420BA8007D418B /* love.cpp in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tFA0B7F021A95AAF3000E1D17 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tFA0B7F301A95AC7D000E1D17 /* love.cpp in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\tFA5D24BB1A96D6FC00C6FC8F /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = \"liblove-ios\";\n\t\t\ttargetProxy = FA5D24BA1A96D6FC00C6FC8F /* PBXContainerItemProxy */;\n\t\t};\n\t\tFAA287721B0ABF1400B82827 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = \"liblove-macosx\";\n\t\t\ttargetProxy = FAA287711B0ABF1400B82827 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\tC01FCF4B08A954540054247B /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"OS X AppIcon\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = love.entitlements;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/build/Release\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/build/Debug\\\"\",\n\t\t\t\t);\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks/Lua.framework/Headers\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks/SDL2.framework/Headers\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = \"macosx/love-macosx.plist\";\n\t\t\t\tINSTALL_PATH = /Applications;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 12.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = org.love2d.love;\n\t\t\t\tPRODUCT_NAME = love;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tC01FCF4C08A954540054247B /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"OS X AppIcon\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = love.entitlements;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/build/Release\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/build/Debug\\\"\",\n\t\t\t\t);\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks/Lua.framework/Headers\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks/SDL2.framework/Headers\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = \"macosx/love-macosx.plist\";\n\t\t\t\tINSTALL_PATH = /Applications;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 12.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = org.love2d.love;\n\t\t\t\tPRODUCT_NAME = love;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tC01FCF4F08A954540054247B /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"c++17\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\";\n\t\t\t\tGCC_INCREASE_PRECOMPILED_HEADER_SHARING = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = LOVE_APPLE_USE_FRAMEWORKS;\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = YES;\n\t\t\t\tGCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = NO;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_NEWLINE = NO;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;\n\t\t\t\tGCC_WARN_ABOUT_POINTER_SIGNEDNESS = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = NO;\n\t\t\t\tGCC_WARN_CHECK_SWITCH_STATEMENTS = YES;\n\t\t\t\tGCC_WARN_FOUR_CHARACTER_CONSTANTS = NO;\n\t\t\t\tGCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO;\n\t\t\t\tGCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = NO;\n\t\t\t\tGCC_WARN_MISSING_PARENTHESES = NO;\n\t\t\t\tGCC_WARN_NON_VIRTUAL_DESTRUCTOR = NO;\n\t\t\t\tGCC_WARN_PEDANTIC = NO;\n\t\t\t\tGCC_WARN_SHADOW = NO;\n\t\t\t\tGCC_WARN_SIGN_COMPARE = YES;\n\t\t\t\tGCC_WARN_TYPECHECK_CALLS_TO_PRINTF = NO;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/../../src\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/../../src/libraries\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/../../src/modules\\\"\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = \"love-Info.plist\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"@loader_path/../Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.15;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_NAME = love;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tWARNING_CFLAGS = (\n\t\t\t\t\t\"-Wall\",\n\t\t\t\t\t\"-W\",\n\t\t\t\t);\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tC01FCF5008A954540054247B /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"c++17\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tDEPLOYMENT_POSTPROCESSING = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\";\n\t\t\t\tGCC_INPUT_FILETYPE = automatic;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 3;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = LOVE_APPLE_USE_FRAMEWORKS;\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = YES;\n\t\t\t\tGCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = NO;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_NEWLINE = NO;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;\n\t\t\t\tGCC_WARN_ABOUT_POINTER_SIGNEDNESS = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = NO;\n\t\t\t\tGCC_WARN_CHECK_SWITCH_STATEMENTS = YES;\n\t\t\t\tGCC_WARN_FOUR_CHARACTER_CONSTANTS = NO;\n\t\t\t\tGCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO;\n\t\t\t\tGCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = NO;\n\t\t\t\tGCC_WARN_MISSING_PARENTHESES = NO;\n\t\t\t\tGCC_WARN_NON_VIRTUAL_DESTRUCTOR = NO;\n\t\t\t\tGCC_WARN_PEDANTIC = NO;\n\t\t\t\tGCC_WARN_SHADOW = NO;\n\t\t\t\tGCC_WARN_SIGN_COMPARE = YES;\n\t\t\t\tGCC_WARN_TYPECHECK_CALLS_TO_PRINTF = NO;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_PARAMETER = NO;\n\t\t\t\tGCC_WARN_UNUSED_VALUE = NO;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/../../src\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/../../src/libraries\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/../../src/modules\\\"\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = \"love-Info.plist\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"@loader_path/../Frameworks\";\n\t\t\t\tLLVM_LTO = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.15;\n\t\t\t\tONLY_ACTIVE_ARCH = NO;\n\t\t\t\tPRODUCT_NAME = love;\n\t\t\t\tSCAN_ALL_SOURCE_FILES_FOR_INCLUDES = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tWARNING_CFLAGS = (\n\t\t\t\t\t\"-Wall\",\n\t\t\t\t\t\"-W\",\n\t\t\t\t);\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tFA0B7F261A95AAF4000E1D17 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_64_BIT)\";\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"iOS AppIcon\";\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/ios/libraries\",\n\t\t\t\t);\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\tios/include,\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/ios/love-ios.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 12.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = org.love2d.love;\n\t\t\t\tPRODUCT_NAME = love;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tFA0B7F271A95AAF4000E1D17 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_64_BIT)\";\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"iOS AppIcon\";\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/ios/libraries\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\tios/include,\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/ios/love-ios.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 12.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = org.love2d.love;\n\t\t\t\tPRODUCT_NAME = love;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tFA0B7F281A95AAF4000E1D17 /* Distribution */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_64_BIT)\";\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"iOS AppIcon\";\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/ios/libraries\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\tios/include,\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/ios/love-ios.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 12.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = org.love2d.love;\n\t\t\t\tPRODUCT_NAME = love;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Distribution;\n\t\t};\n\t\tFA5326C618971A0900F7BBF4 /* Distribution */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"c++17\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tDEPLOYMENT_POSTPROCESSING = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\";\n\t\t\t\tGCC_INPUT_FILETYPE = automatic;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 3;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = LOVE_APPLE_USE_FRAMEWORKS;\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = YES;\n\t\t\t\tGCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = NO;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_NEWLINE = NO;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;\n\t\t\t\tGCC_WARN_ABOUT_POINTER_SIGNEDNESS = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = NO;\n\t\t\t\tGCC_WARN_CHECK_SWITCH_STATEMENTS = YES;\n\t\t\t\tGCC_WARN_FOUR_CHARACTER_CONSTANTS = NO;\n\t\t\t\tGCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO;\n\t\t\t\tGCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = NO;\n\t\t\t\tGCC_WARN_MISSING_PARENTHESES = NO;\n\t\t\t\tGCC_WARN_NON_VIRTUAL_DESTRUCTOR = NO;\n\t\t\t\tGCC_WARN_PEDANTIC = NO;\n\t\t\t\tGCC_WARN_SHADOW = NO;\n\t\t\t\tGCC_WARN_SIGN_COMPARE = YES;\n\t\t\t\tGCC_WARN_TYPECHECK_CALLS_TO_PRINTF = NO;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_PARAMETER = NO;\n\t\t\t\tGCC_WARN_UNUSED_VALUE = NO;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/../../src\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/../../src/libraries\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/../../src/modules\\\"\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = \"love-Info.plist\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"@loader_path/../Frameworks\";\n\t\t\t\tLLVM_LTO = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.15;\n\t\t\t\tONLY_ACTIVE_ARCH = NO;\n\t\t\t\tPRODUCT_NAME = love;\n\t\t\t\tSCAN_ALL_SOURCE_FILES_FOR_INCLUDES = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tWARNING_CFLAGS = (\n\t\t\t\t\t\"-Wall\",\n\t\t\t\t\t\"-W\",\n\t\t\t\t);\n\t\t\t};\n\t\t\tname = Distribution;\n\t\t};\n\t\tFA5326C718971A0900F7BBF4 /* Distribution */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"OS X AppIcon\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = love.entitlements;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/build/Release\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/build/Debug\\\"\",\n\t\t\t\t);\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks/Lua.framework/Headers\",\n\t\t\t\t\t\"$(PROJECT_DIR)/macosx/Frameworks/SDL2.framework/Headers\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = \"macosx/love-macosx.plist\";\n\t\t\t\tINSTALL_PATH = /Applications;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 12.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = org.love2d.love;\n\t\t\t\tPRODUCT_NAME = love;\n\t\t\t};\n\t\t\tname = Distribution;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tC01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget \"love-macosx\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tC01FCF4B08A954540054247B /* Debug */,\n\t\t\t\tC01FCF4C08A954540054247B /* Release */,\n\t\t\t\tFA5326C718971A0900F7BBF4 /* Distribution */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tC01FCF4E08A954540054247B /* Build configuration list for PBXProject \"love\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tC01FCF4F08A954540054247B /* Debug */,\n\t\t\t\tC01FCF5008A954540054247B /* Release */,\n\t\t\t\tFA5326C618971A0900F7BBF4 /* Distribution */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tFA0B7F2E1A95AAF4000E1D17 /* Build configuration list for PBXNativeTarget \"love-ios\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tFA0B7F261A95AAF4000E1D17 /* Debug */,\n\t\t\t\tFA0B7F271A95AAF4000E1D17 /* Release */,\n\t\t\t\tFA0B7F281A95AAF4000E1D17 /* Distribution */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 29B97313FDCFA39411CA2CEA /* Project object */;\n}\n"
  },
  {
    "path": "platform/xcode/love.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:love.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "platform/xcode/love.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "platform/xcode/love.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict/>\n</plist>\n"
  },
  {
    "path": "platform/xcode/macosx/liblove-macosx.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>LÖVE</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>12.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>LoVe</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "platform/xcode/macosx/love-macosx.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleDocumentTypes</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CFBundleTypeExtensions</key>\n\t\t\t<array>\n\t\t\t\t<string>love</string>\n\t\t\t</array>\n\t\t\t<key>CFBundleTypeIconFile</key>\n\t\t\t<string>GameIcon</string>\n\t\t\t<key>CFBundleTypeName</key>\n\t\t\t<string>LÖVE Project</string>\n\t\t\t<key>CFBundleTypeRole</key>\n\t\t\t<string>Viewer</string>\n\t\t\t<key>LSHandlerRank</key>\n\t\t\t<string>Owner</string>\n\t\t\t<key>LSItemContentTypes</key>\n\t\t\t<array>\n\t\t\t\t<string>org.love2d.love-game</string>\n\t\t\t</array>\n\t\t\t<key>LSTypeIsPackage</key>\n\t\t\t<integer>1</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CFBundleTypeName</key>\n\t\t\t<string>Folder</string>\n\t\t\t<key>CFBundleTypeOSTypes</key>\n\t\t\t<array>\n\t\t\t\t<string>fold</string>\n\t\t\t</array>\n\t\t\t<key>CFBundleTypeRole</key>\n\t\t\t<string>Viewer</string>\n\t\t\t<key>LSHandlerRank</key>\n\t\t\t<string>None</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CFBundleTypeIconFile</key>\n\t\t\t<string>Document</string>\n\t\t\t<key>CFBundleTypeName</key>\n\t\t\t<string>Document</string>\n\t\t\t<key>CFBundleTypeOSTypes</key>\n\t\t\t<array>\n\t\t\t\t<string>****</string>\n\t\t\t</array>\n\t\t\t<key>CFBundleTypeRole</key>\n\t\t\t<string>Editor</string>\n\t\t</dict>\n\t</array>\n\t<key>CFBundleExecutable</key>\n\t<string>love</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>LÖVE</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(MARKETING_VERSION)</string>\n\t<key>CFBundleSignature</key>\n\t<string>LoVe</string>\n\t<key>LSApplicationCategoryType</key>\n\t<string>public.app-category.games</string>\n\t<key>NSHighResolutionCapable</key>\n\t<true/>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>© 2006-2024 LÖVE Development Team</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n\t<key>NSSupportsAutomaticGraphicsSwitching</key>\n\t<false/>\n\t<key>UTExportedTypeDeclarations</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>UTTypeConformsTo</key>\n\t\t\t<array>\n\t\t\t\t<string>com.pkware.zip-archive</string>\n\t\t\t\t<string>com.apple.package</string>\n\t\t\t</array>\n\t\t\t<key>UTTypeDescription</key>\n\t\t\t<string>LÖVE Project</string>\n\t\t\t<key>UTTypeIconFile</key>\n\t\t\t<string>GameIcon</string>\n\t\t\t<key>UTTypeIdentifier</key>\n\t\t\t<string>org.love2d.love-game</string>\n\t\t\t<key>UTTypeReferenceURL</key>\n\t\t\t<string>http://love2d.org/wiki/Game_Distribution</string>\n\t\t\t<key>UTTypeTagSpecification</key>\n\t\t\t<dict>\n\t\t\t\t<key>com.apple.ostype</key>\n\t\t\t\t<string>LOVE</string>\n\t\t\t\t<key>public.filename-extension</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>love</string>\n\t\t\t\t</array>\n\t\t\t\t<key>public.mime-type</key>\n\t\t\t\t<string>application/x-love-game</string>\n\t\t\t</dict>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "platform/xcode/macosx/macos-copy-app.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>method</key>\n  <string>mac-application</string>\n</dict>\n</plist>"
  },
  {
    "path": "readme-iOS.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg1252\\cocoartf2818\n\\cocoatextscaling0\\cocoaplatform0{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica-Bold;\\f1\\fswiss\\fcharset0 Helvetica;\\f2\\fnil\\fcharset0 Monaco;\n\\f3\\fnil\\fcharset0 LucidaGrande;}\n{\\colortbl;\\red255\\green255\\blue255;}\n{\\*\\expandedcolortbl;;}\n{\\*\\listtable{\\list\\listtemplateid1\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid1\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid1}\n{\\list\\listtemplateid2\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid101\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid2}\n{\\list\\listtemplateid3\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid201\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid3}\n{\\list\\listtemplateid4\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid301\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid4}\n{\\list\\listtemplateid5\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid401\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid5}\n{\\list\\listtemplateid6\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid501\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid6}}\n{\\*\\listoverridetable{\\listoverride\\listid1\\listoverridecount0\\ls1}{\\listoverride\\listid2\\listoverridecount0\\ls2}{\\listoverride\\listid3\\listoverridecount0\\ls3}{\\listoverride\\listid4\\listoverridecount0\\ls4}{\\listoverride\\listid5\\listoverridecount0\\ls5}{\\listoverride\\listid6\\listoverridecount0\\ls6}}\n\\margl1440\\margr1440\\vieww14040\\viewh10200\\viewkind0\n\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\\partightenfactor0\n\n\\f0\\b\\fs36 \\cf0 Building L\\'d6VE for iOS\n\\f1\\b0\\fs24 \\\n\\\nIn order to run L\\'d6VE for iOS, it must first be compiled and installed. To do that, you\\'92ll need macOS and {\\field{\\*\\fldinst{HYPERLINK \"https://developer.apple.com/xcode/\"}}{\\fldrslt Xcode}}.\\\n\\\n\\pard\\tx220\\tx720\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\li720\\fi-720\\pardirnatural\\partightenfactor0\n\\ls1\\ilvl0\\cf0 {\\listtext\t\\uc0\\u8226 \t}If the \n\\f2\\fs22 include\n\\f1\\fs24  and \n\\f2\\fs22 libraries\n\\f1\\fs24  folders are not present in the \n\\f2\\fs22 love/platform/xcode/ios\n\\f1\\fs24  folder and there\\'92s no l\n\\f2\\fs22 ove/platform/xcode/shared/\n\\f1\\fs24  folder, {\\field{\\*\\fldinst{HYPERLINK \"https://bitbucket.org/rude/love/downloads/love-0.10.0-ios-libraries.zip\"}}{\\fldrslt download them}} and place them there. They contain the third-party library dependencies used by L\\'d6VE.\\\n\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\\partightenfactor0\n\\cf0 \\\n\\pard\\tx220\\tx720\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\li720\\fi-720\\pardirnatural\\partightenfactor0\n\\ls2\\ilvl0\\cf0 {\\listtext\t\\uc0\\u8226 \t}Open the Xcode project found at \n\\f2\\fs22 love/platform/xcode/love.xcodeproj\n\\f1\\fs24 , and select the \\'93love-ios\\'94 target in the dropdown menu at the top of the window.\\\n\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\\partightenfactor0\n\\cf0 \\\n\\pard\\tx220\\tx720\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\li720\\fi-720\\pardirnatural\\partightenfactor0\n\\ls3\\ilvl0\\cf0 {\\listtext\t\\uc0\\u8226 \t}You may want to change the Build Configuration from Debug to Release mode for better runtime performance, by opening the \\'93Edit Scheme\\'85\\'94 menu from the same dropdown selection.\\\n\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\\partightenfactor0\n\\cf0 \\\n\\pard\\tx220\\tx720\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\li720\\fi-720\\pardirnatural\\partightenfactor0\n\\ls4\\ilvl0\\cf0 {\\listtext\t\\uc0\\u8226 \t}Choose either an iOS Simulator device or your plugged-in iOS device from the dropdown selection to the right of the previous one, and click the Build-and-Run \n\\f3 \\uc0\\u9654 \\u65038 \n\\f1  button to the left, which will install and run L\\'d6VE on the target device after compiling it.\\\n\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\\partightenfactor0\n\\cf0 \\\n\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\\partightenfactor0\n\n\\f0\\b\\fs36 \\cf0 Running Games on iOS\n\\f1\\b0\\fs24 \\\n\\\nL\\'d6VE on iOS includes a simple list interface of games that are installed (until you {\\field{\\*\\fldinst{HYPERLINK \"https://love2d.org/wiki/Game_Distribution\"}}{\\fldrslt fuse}} a .love to it for distribution.)\\\n\\\n\\pard\\tx220\\tx720\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\li720\\fi-720\\pardirnatural\\partightenfactor0\n\\ls5\\ilvl0\\cf0 {\\listtext\t\\uc0\\u8226 \t}To put a .love file on the iOS Simulator after L\\'d6VE is installed, drag the file onto the iOS Simulator\\'92s window while it\\'92s open. L\\'d6VE will launch if it\\'92s not running already. If another game is currently active you may need to quit L\\'d6VE for the new game to show up (press Shift-Command-H twice to open the App Switcher menu on the iOS Simulator.)\\\n\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\\partightenfactor0\n\\cf0 \\\n\\pard\\tx220\\tx720\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\li720\\fi-720\\pardirnatural\\partightenfactor0\n\\ls6\\ilvl0\\cf0 {\\listtext\t\\uc0\\u8226 \t}To put a .love file or game folder on your iOS device after L\\'d6VE is installed, you can either download it with the Safari, or transfer it from your computer through iTunes when your device is connected: open iTunes, go to the iOS device which has L\\'d6VE installed, go to the \\'91Apps\\'92 section and scroll down and find L\\'d6VE, and add the .love file or game folder to L\\'d6VE\\'92s Documents section.\\\n\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\\partightenfactor0\n\\cf0 \\\n\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\\partightenfactor0\n\n\\f0\\b\\fs36 \\cf0 Distributing a Game on iOS\n\\f1\\b0\\fs24 \\\n\\\nRefer to the {\\field{\\*\\fldinst{HYPERLINK \"https://love2d.org/wiki/Game_Distribution#iOS\"}}{\\fldrslt Game Distribution}} L\\'d6VE wiki page.\\\n}"
  },
  {
    "path": "readme.md",
    "content": "LÖVE is an *awesome* framework you can use to make 2D games in Lua. It's free, open-source, and works on Windows, macOS, Linux, Android, and iOS.\n\n[![Build Status: Github CI](https://github.com/love2d/love/workflows/continuous-integration/badge.svg)](https://github.com/love2d/love/actions?query=workflow%3Acontinuous-integration)\n\nDocumentation\n-------------\n\nWe use our [wiki][wiki] for documentation.\nIf you need further help, feel free to ask on our [forums][forums], our [Discord server][discord], or our [subreddit][subreddit].\n\nRepository\n----------\n\nWe use the 'main' branch for development of the next major release, and therefore it should not be considered stable.\n\nThere are also branches for currently released major versions, which may have fixes and changes meant for upcoming patch releases within that major version.\n\nWe tag all our releases (since we started using mercurial and git), and have binary downloads available for them.\n\nExperimental changes are sometimes developed in a separate [love-experiments][love-experiments] repository.\n\nBuilds\n------\n\nFiles for releases are in the [releases][releases] section on GitHub. [The site][site] has links to files and additional platform content for the latest release.\n\nThere are also unstable/nightly builds:\n\n- Builds for some platforms are automatically created after each commit and are available through GitHub's CI interfaces.\n- For ubuntu linux they are in [ppa:bartbes/love-unstable][unstableppa]\n- For arch linux there's [love-git][aur] in the AUR.\n\nTest Suite\n----------\n\nThe test suite in `testing/` covers all the LÖVE APIs, and tests them the same way developers use them. You can view current test coverage from any [action][workflows].  \nYou can run the suite locally like you would run a normal LÖVE project, e.g.:  \n`love testing`\n\nSee the [readme][testsuite] in the testing folder for more info.  \n\nContributing\n------------\n\nThe best places to contribute are through the issue tracker and the official Discord server or IRC channel.\n\nFor code contributions, pull requests and patches are welcome. Be sure to read the [source code style guide][codestyle].\nChanges and new features typically get discussed in the issue tracker or on Discord or the forums before a pull request is made.\n\n> [!NOTE] \n> Pull requests, bug reports, and other contributions made with LLM / generative AI technology will not be accepted.\n\nCompilation\n-----------\n\n### Windows\nFollow the instructions at the [megasource][megasource] repository page.\n\n### *nix\nBecause in-tree builds are not allowed, the Makefiles needs to be generated in a separate build directory. In this example, folder named `build` is used:\n\n\t$ cmake -B build -S. --install-prefix $PWD/prefix # this will create the directory `build/`.\n\t$ cmake --build build --target install -j$(nproc) # this will build with all cores and put the files in `prefix/`.\n\n> [!NOTE]  \n> CMake 3.15 and earlier doesn't support `--install-prefix`. In that case, use `-DCMAKE_INSTALL_PREFIX=` instead.\n\n### macOS\nDownload or clone [this repository][dependencies-apple] and copy, move, or symlink the `macOS/Frameworks` subfolder into love's `platform/xcode/macosx` folder and the `shared` subfolder into love's `platform/xcode` folder.\n\nThen use the Xcode project found at `platform/xcode/love.xcodeproj` to build the `love-macosx` target.\n\n### iOS\nBuilding for iOS requires macOS and Xcode.\n\nDownload the `love-apple-dependencies` zip file corresponding to the LÖVE version being used from the [Releases page][dependencies-ios],\nunzip it, and place the `iOS/libraries` subfolder into love's `platform/xcode/ios` folder and the `shared` subfolder into love's `platform/xcode` folder.\n\nOr, download or clone [this repository][dependencies-apple] and copy, move, or symlink the `iOS/libraries` subfolder into love's `platform/xcode/ios` folder and the `shared` subfolder into love's `platform/xcode` folder.\n\nThen use the Xcode project found at `platform/xcode/love.xcodeproj` to build the `love-ios` target.\n\nSee `readme-iOS.rtf` for more information.\n\n### Android\nVisit the [Android build repository][android-repository] for build instructions.\n\nDependencies\n------------\n\n- SDL3\n- OpenGL 3.3+ / OpenGL ES 3.0+ / Vulkan / Metal\n- OpenAL\n- Lua / LuaJIT / LLVM-lua\n- FreeType\n- harfbuzz\n- ModPlug\n- Vorbisfile\n- Theora\n\n[site]: https://love2d.org\n[wiki]: https://love2d.org/wiki\n[forums]: https://love2d.org/forums\n[discord]: https://discord.gg/rhUets9\n[subreddit]: https://www.reddit.com/r/love2d\n[dependencies-apple]: https://github.com/love2d/love-apple-dependencies\n[dependencies-ios]: https://github.com/love2d/love/releases\n[megasource]: https://github.com/love2d/megasource\n[unstableppa]: https://launchpad.net/~bartbes/+archive/love-unstable\n[aur]: https://aur.archlinux.org/packages/love-git\n[love-experiments]: https://github.com/slime73/love-experiments\n[codestyle]: https://love2d.org/wiki/Code_Style\n[android-repository]: https://github.com/love2d/love-android\n[releases]: https://github.com/love2d/love/releases\n[testsuite]: https://github.com/love2d/love/tree/main/testing\n[workflows]: https://github.com/love2d/love/actions/workflows/main.yml?query=branch%3Amain\n"
  },
  {
    "path": "src/.editorconfig",
    "content": "# Loosely based on https://love2d.org/wiki/Code_Style and other existing code.\n# Ref: https://learn.microsoft.com/en-us/visualstudio/ide/cpp-editorconfig-properties?view=vs-2022\n\nroot = true\n\n[*]\ninsert_final_newline = true\nindent_style = tab\n\n[*.{cpp,mm,h}]\ncpp_space_pointer_reference_alignment = right\ncpp_indent_namespace_contents = false\ncpp_new_line_before_open_brace_namespace = new_line\ncpp_new_line_before_open_brace_type = new_line\ncpp_new_line_before_open_brace_function = new_line\ncpp_new_line_before_open_brace_block = new_line\ncpp_new_line_before_else = true\ncpp_space_before_function_open_parenthesis = remove\ncpp_space_within_parameter_list_parentheses = false\ncpp_space_between_empty_parameter_list_parentheses = false\ncpp_space_after_keywords_in_control_flow_statements = true\ncpp_space_within_control_flow_statement_parentheses = false\n\n"
  },
  {
    "path": "src/common/Color.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_COLOR_H\n#define LOVE_COLOR_H\n\nnamespace love\n{\n\ntemplate <typename T>\nstruct ColorT\n{\n\tT r;\n\tT g;\n\tT b;\n\tT a;\n\n\tColorT() : r(0), g(0), b(0), a(0) {}\n\tColorT(T r_, T g_, T b_, T a_) : r(r_), g(g_), b(b_), a(a_) {}\n\tvoid set(T r_, T g_, T b_, T a_)\n\t{\n\t\tr = r_;\n\t\tg = g_;\n\t\tb = b_;\n\t\ta = a_;\n\t}\n\n\tbool operator==(const ColorT<T> &other) const;\n\tbool operator!=(const ColorT<T> &other) const;\n\n\tColorT<T> operator+=(const ColorT<T> &other);\n\tColorT<T> operator*=(const ColorT<T> &other);\n\tColorT<T> operator*=(T s);\n\tColorT<T> operator/=(T s);\n};\n\ntemplate <typename T>\nbool ColorT<T>::operator==(const ColorT<T> &other) const\n{\n\treturn r == other.r && g == other.g && b == other.b && a == other.a;\n}\n\ntemplate <typename T>\nbool ColorT<T>::operator!=(const ColorT<T> &other) const\n{\n\treturn !(operator==(other));\n}\n\ntemplate <typename T>\nColorT<T> ColorT<T>::operator+=(const ColorT<T> &other)\n{\n\tr += other.r;\n\tg += other.g;\n\tb += other.b;\n\ta += other.a;\n\treturn *this;\n}\n\ntemplate <typename T>\nColorT<T> ColorT<T>::operator*=(const ColorT<T> &other)\n{\n\tr *= other.r;\n\tg *= other.g;\n\tb *= other.b;\n\ta *= other.a;\n\treturn *this;\n}\n\ntemplate <typename T>\nColorT<T> ColorT<T>::operator*=(T s)\n{\n\tr *= s;\n\tg *= s;\n\tb *= s;\n\ta *= s;\n\treturn *this;\n}\n\ntemplate <typename T>\nColorT<T> ColorT<T>::operator/=(T s)\n{\n\tr /= s;\n\tg /= s;\n\tb /= s;\n\ta /= s;\n\treturn *this;\n}\n\ntemplate <typename T>\nColorT<T> operator+(const ColorT<T> &a, const ColorT<T> &b)\n{\n\tColorT<T> tmp(a);\n\treturn tmp += b;\n}\n\ntemplate <typename T>\nColorT<T> operator*(const ColorT<T> &a, const ColorT<T> &b)\n{\n\tColorT<T> res;\n\tres.r = a.r * b.r;\n\tres.g = a.g * b.g;\n\tres.b = a.b * b.b;\n\tres.a = a.a * b.a;\n\treturn res;\n}\n\ntemplate <typename T>\nColorT<T> operator*(const ColorT<T> &a, T s)\n{\n\tColorT<T> tmp(a);\n\treturn tmp *= s;\n}\n\ntemplate <typename T>\nColorT<T> operator/(const ColorT<T> &a, T s)\n{\n\tColorT<T> tmp(a);\n\treturn tmp /= s;\n}\n\ntypedef ColorT<unsigned char> Color32;\ntypedef ColorT<float> Colorf;\ntypedef ColorT<double> ColorD;\n\ninline Color32 toColor32(Colorf cf)\n{\n\treturn Color32((unsigned char) (cf.r * 255.0f),\n\t             (unsigned char) (cf.g * 255.0f),\n\t             (unsigned char) (cf.b * 255.0f),\n\t             (unsigned char) (cf.a * 255.0f));\n}\n\ninline Colorf toColorf(Color32 c)\n{\n\treturn Colorf(c.r / 255.0f, c.g / 255.0f, c.b / 255.0f, c.a / 255.0f);\n}\n\n} // love\n\n#endif // LOVE_COLOR_H\n"
  },
  {
    "path": "src/common/Data.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"Data.h\"\n#include \"thread/threads.h\"\n\nnamespace love\n{\n\nlove::Type Data::type(\"Data\", &Object::type);\n\nData::~Data()\n{\n\tdelete mutex;\n}\n\nstatic void createMutex(love::thread::Mutex **mutexAddress)\n{\n\t*mutexAddress = love::thread::newMutex();\n}\n\nlove::thread::Mutex *Data::getMutex()\n{\n\tstd::call_once(mutexCreated, createMutex, &mutex);\n\treturn mutex;\n}\n\n} // love\n"
  },
  {
    "path": "src/common/Data.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_DATA_H\n#define LOVE_DATA_H\n\n// LOVE\n#include \"Object.h\"\n\n// C\n#include <stddef.h>\n#include <mutex>\n\nnamespace love\n{\n\nnamespace thread\n{\nclass Mutex;\n}\n\n/**\n * This class is a simple abstraction over all objects which contain data.\n **/\nclass Data : public Object\n{\npublic:\n\n\tstatic love::Type type;\n\n\tData() {};\n\tvirtual ~Data();\n\n\t/**\n\t * Creates a duplicate of Data derived class instance.\n\t **/\n\tvirtual Data *clone() const = 0;\n\t/**\n\t * Gets a pointer to the data. This pointer will obviously not\n\t * be valid if the Data object is destroyed.\n\t **/\n\tvirtual void *getData() const = 0;\n\n\t/**\n\t * Gets the size of the Data in bytes.\n\t **/\n\tvirtual size_t getSize() const = 0;\n\n\t/**\n\t * Gets the Mutex associated with this Data object. Creates it in a thread-\n\t * safe manner if necessary.\n\t **/\n\tlove::thread::Mutex *getMutex();\n\nprivate:\n\n\tlove::thread::Mutex *mutex = nullptr;\n\tstd::once_flag mutexCreated;\n\n}; // Data\n\n} // love\n\n#endif // LOVE_DATA_H\n"
  },
  {
    "path": "src/common/EnumMap.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_ENUM_MAP_H\n#define LOVE_ENUM_MAP_H\n\n#include \"Exception.h\"\n\nnamespace love\n{\n\ntemplate<typename T, typename U, unsigned int PEAK>\nclass EnumMap\n{\npublic:\n\n\tstruct Entry\n\t{\n\t\tT t;\n\t\tU u;\n\t};\n\n\tEnumMap(const Entry *entries, unsigned int size)\n\t{\n\t\tunsigned int n = size / sizeof(Entry);\n\n\t\tfor (unsigned int i = 0; i < n; ++i)\n\t\t{\n\t\t\tunsigned int e_t = (unsigned int) entries[i].t;\n\t\t\tunsigned int e_u = (unsigned int) entries[i].u;\n\n\t\t\tif (e_t < PEAK)\n\t\t\t{\n\t\t\t\tvalues_u[e_t].v = e_u;\n\t\t\t\tvalues_u[e_t].set = true;\n\t\t\t}\n\t\t\tif (e_u < PEAK)\n\t\t\t{\n\t\t\t\tvalues_t[e_u].v = e_t;\n\t\t\t\tvalues_t[e_u].set = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tbool find(T t, U &u)\n\t{\n\t\tif ((unsigned int) t < PEAK && values_u[(unsigned int) t].set)\n\t\t{\n\t\t\tu = (U) values_u[(unsigned int) t].v;\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tbool find(U u, T &t)\n\t{\n\t\tif ((unsigned int) u < PEAK && values_t[(unsigned int) u].set)\n\t\t{\n\t\t\tt = (T) values_t[(unsigned int) u].v;\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\nprivate:\n\n\tstruct Value\n\t{\n\t\tunsigned v;\n\t\tbool set;\n\t\tValue() : set(false) {}\n\t};\n\n\tValue values_t[PEAK];\n\tValue values_u[PEAK];\n\n}; // EnumMap\n\n} // love\n\n#endif // LOVE_ENUM_MAP_H\n"
  },
  {
    "path": "src/common/Exception.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"common/config.h\"\n#include \"Exception.h\"\n\n#include <iostream>\n\nnamespace love\n{\n\nException::Exception(const char *fmt, ...)\n{\n\tva_list args;\n\tint size_buffer = 256, size_out;\n\tchar *buffer;\n\twhile (true)\n\t{\n\t\tbuffer = new char[size_buffer];\n\t\tmemset(buffer, 0, size_buffer);\n\n\t\tva_start(args, fmt);\n\t\tsize_out = vsnprintf(buffer, size_buffer, fmt, args);\n\t\tva_end(args);\n\n\t\t// see http://perfec.to/vsnprintf/pasprintf.c\n\t\t// if size_out ...\n\t\t//      == -1             --> output was truncated\n\t\t//      == size_buffer    --> output was truncated\n\t\t//      == size_buffer-1  --> ambiguous, /may/ have been truncated\n\t\t//       > size_buffer    --> output was truncated, and size_out\n\t\t//                            bytes would have been written\n\t\tif (size_out == size_buffer || size_out == -1 || size_out == size_buffer-1)\n\t\t\tsize_buffer *= 2;\n\t\telse if (size_out > size_buffer)\n\t\t\tsize_buffer = size_out + 2; // to avoid the ambiguous case\n\t\telse\n\t\t\tbreak;\n\n\t\tdelete[] buffer;\n\t}\n\tmessage = std::string(buffer);\n\tdelete[] buffer;\n}\n\nException::~Exception() throw()\n{\n}\n\n}\n"
  },
  {
    "path": "src/common/Exception.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_EXCEPTION_H\n#define LOVE_EXCEPTION_H\n\n#include <exception>\n#include <cstdarg> // vararg\n#include <cstdio> // vsnprintf\n#include <cstring> // strncpy\n#include <string>\n\nnamespace love\n{\n\n/**\n * A convenient vararg-enabled exception class.\n **/\nclass Exception : public std::exception\n{\npublic:\n\n\t/**\n\t * Creates a new Exception according to printf-rules.\n\t *\n\t * See: http://www.cplusplus.com/reference/clibrary/cstdio/printf/\n\t *\n\t * @param fmt The format string (see printf).\n\t **/\n\tException(const char *fmt, ...);\n\tvirtual ~Exception() throw();\n\n\t/**\n\t * Returns a string containing reason for the exception.\n\t * @return A description of the exception.\n\t **/\n\tinline virtual const char *what() const throw()\n\t{\n\t\treturn message.c_str();\n\t}\n\nprivate:\n\n\tstd::string message;\n\n}; // Exception\n\n} // love\n\n#endif // LOVE_EXCEPTION_H\n"
  },
  {
    "path": "src/common/Matrix.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Matrix.h\"\n#include \"common/config.h\"\n\n// STD\n#include <cstring> // memcpy\n#include <cmath>\n\n#if defined(LOVE_SIMD_SSE)\n#include <xmmintrin.h>\n#endif\n\n#if defined(LOVE_SIMD_NEON)\n#include <arm_neon.h>\n#endif\n\nnamespace love\n{\n\n//                 | e0 e4 e8  e12 |\n//                 | e1 e5 e9  e13 |\n//                 | e2 e6 e10 e14 |\n//                 | e3 e7 e11 e15 |\n// | e0 e4 e8  e12 |\n// | e1 e5 e9  e13 |\n// | e2 e6 e10 e14 |\n// | e3 e7 e11 e15 |\n\nvoid Matrix4::multiply(const Matrix4 &a, const Matrix4 &b, float t[16])\n{\n#if defined(LOVE_SIMD_SSE)\n\n\t// We can't guarantee 16-bit alignment (e.g. for heap-allocated Matrix4\n\t// objects) so we use unaligned loads and stores.\n\t__m128 col1 = _mm_loadu_ps(&a.e[0]);\n\t__m128 col2 = _mm_loadu_ps(&a.e[4]);\n\t__m128 col3 = _mm_loadu_ps(&a.e[8]);\n\t__m128 col4 = _mm_loadu_ps(&a.e[12]);\n\n\tfor (int i = 0; i < 4; i++)\n\t{\n\t\t__m128 brod1 = _mm_set1_ps(b.e[4*i + 0]);\n\t\t__m128 brod2 = _mm_set1_ps(b.e[4*i + 1]);\n\t\t__m128 brod3 = _mm_set1_ps(b.e[4*i + 2]);\n\t\t__m128 brod4 = _mm_set1_ps(b.e[4*i + 3]);\n\n\t\t__m128 col = _mm_add_ps(\n\t\t\t_mm_add_ps(_mm_mul_ps(brod1, col1), _mm_mul_ps(brod2, col2)),\n\t\t\t_mm_add_ps(_mm_mul_ps(brod3, col3), _mm_mul_ps(brod4, col4))\n\t\t);\n\n\t\t_mm_storeu_ps(&t[4*i], col);\n\t}\n\n#elif defined(LOVE_SIMD_NEON)\n\n\tfloat32x4_t cola1 = vld1q_f32(&a.e[0]);\n\tfloat32x4_t cola2 = vld1q_f32(&a.e[4]);\n\tfloat32x4_t cola3 = vld1q_f32(&a.e[8]);\n\tfloat32x4_t cola4 = vld1q_f32(&a.e[12]);\n\n\tfloat32x4_t col1 = vmulq_n_f32(cola1, b.e[0]);\n\tcol1 = vmlaq_n_f32(col1, cola2, b.e[1]);\n\tcol1 = vmlaq_n_f32(col1, cola3, b.e[2]);\n\tcol1 = vmlaq_n_f32(col1, cola4, b.e[3]);\n\n\tfloat32x4_t col2 = vmulq_n_f32(cola1, b.e[4]);\n\tcol2 = vmlaq_n_f32(col2, cola2, b.e[5]);\n\tcol2 = vmlaq_n_f32(col2, cola3, b.e[6]);\n\tcol2 = vmlaq_n_f32(col2, cola4, b.e[7]);\n\n\tfloat32x4_t col3 = vmulq_n_f32(cola1, b.e[8]);\n\tcol3 = vmlaq_n_f32(col3, cola2, b.e[9]);\n\tcol3 = vmlaq_n_f32(col3, cola3, b.e[10]);\n\tcol3 = vmlaq_n_f32(col3, cola4, b.e[11]);\n\n\tfloat32x4_t col4 = vmulq_n_f32(cola1, b.e[12]);\n\tcol4 = vmlaq_n_f32(col4, cola2, b.e[13]);\n\tcol4 = vmlaq_n_f32(col4, cola3, b.e[14]);\n\tcol4 = vmlaq_n_f32(col4, cola4, b.e[15]);\n\n\tvst1q_f32(&t[0], col1);\n\tvst1q_f32(&t[4], col2);\n\tvst1q_f32(&t[8], col3);\n\tvst1q_f32(&t[12], col4);\n\n#else\n\n\tt[0]  = (a.e[0]*b.e[0])  + (a.e[4]*b.e[1])  + (a.e[8]*b.e[2])  + (a.e[12]*b.e[3]);\n\tt[4]  = (a.e[0]*b.e[4])  + (a.e[4]*b.e[5])  + (a.e[8]*b.e[6])  + (a.e[12]*b.e[7]);\n\tt[8]  = (a.e[0]*b.e[8])  + (a.e[4]*b.e[9])  + (a.e[8]*b.e[10]) + (a.e[12]*b.e[11]);\n\tt[12] = (a.e[0]*b.e[12]) + (a.e[4]*b.e[13]) + (a.e[8]*b.e[14]) + (a.e[12]*b.e[15]);\n\n\tt[1]  = (a.e[1]*b.e[0])  + (a.e[5]*b.e[1])  + (a.e[9]*b.e[2])  + (a.e[13]*b.e[3]);\n\tt[5]  = (a.e[1]*b.e[4])  + (a.e[5]*b.e[5])  + (a.e[9]*b.e[6])  + (a.e[13]*b.e[7]);\n\tt[9]  = (a.e[1]*b.e[8])  + (a.e[5]*b.e[9])  + (a.e[9]*b.e[10]) + (a.e[13]*b.e[11]);\n\tt[13] = (a.e[1]*b.e[12]) + (a.e[5]*b.e[13]) + (a.e[9]*b.e[14]) + (a.e[13]*b.e[15]);\n\n\tt[2]  = (a.e[2]*b.e[0])  + (a.e[6]*b.e[1])  + (a.e[10]*b.e[2])  + (a.e[14]*b.e[3]);\n\tt[6]  = (a.e[2]*b.e[4])  + (a.e[6]*b.e[5])  + (a.e[10]*b.e[6])  + (a.e[14]*b.e[7]);\n\tt[10] = (a.e[2]*b.e[8])  + (a.e[6]*b.e[9])  + (a.e[10]*b.e[10]) + (a.e[14]*b.e[11]);\n\tt[14] = (a.e[2]*b.e[12]) + (a.e[6]*b.e[13]) + (a.e[10]*b.e[14]) + (a.e[14]*b.e[15]);\n\n\tt[3]  = (a.e[3]*b.e[0])  + (a.e[7]*b.e[1])  + (a.e[11]*b.e[2])  + (a.e[15]*b.e[3]);\n\tt[7]  = (a.e[3]*b.e[4])  + (a.e[7]*b.e[5])  + (a.e[11]*b.e[6])  + (a.e[15]*b.e[7]);\n\tt[11] = (a.e[3]*b.e[8])  + (a.e[7]*b.e[9])  + (a.e[11]*b.e[10]) + (a.e[15]*b.e[11]);\n\tt[15] = (a.e[3]*b.e[12]) + (a.e[7]*b.e[13]) + (a.e[11]*b.e[14]) + (a.e[15]*b.e[15]);\n\n#endif\n}\n\nvoid Matrix4::multiply(const Matrix4 &a, const Matrix4 &b, Matrix4 &t)\n{\n\tmultiply(a, b, t.e);\n}\n\n// | e0 e4 e8  e12 |\n// | e1 e5 e9  e13 |\n// | e2 e6 e10 e14 |\n// | e3 e7 e11 e15 |\n\nMatrix4::Matrix4()\n{\n\tsetIdentity();\n}\n\n\nMatrix4::Matrix4(const float elements[16])\n{\n\tmemcpy(e, elements, sizeof(float) * 16);\n}\n\t\nMatrix4::Matrix4(float t00, float t10, float t01, float t11, float x, float y)\n{\n\tsetRawTransformation(t00, t10, t01, t11, x, y);\n}\n\nMatrix4::Matrix4(const Matrix4 &a, const Matrix4 &b)\n{\n\tmultiply(a, b, e);\n}\n\nMatrix4::Matrix4(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky)\n{\n\tsetTransformation(x, y, angle, sx, sy, ox, oy, kx, ky);\n}\n\nMatrix4 Matrix4::operator * (const Matrix4 &m) const\n{\n\treturn Matrix4(*this, m);\n}\n\nvoid Matrix4::operator *= (const Matrix4 &m)\n{\n\tfloat t[16];\n\tmultiply(*this, m, t);\n\tmemcpy(this->e, t, sizeof(float)*16);\n}\n\nconst float *Matrix4::getElements() const\n{\n\treturn e;\n}\n\nvoid Matrix4::setRow(int r, const Vector4 &v)\n{\n\te[0 * 4 + r] = v.x;\n\te[1 * 4 + r] = v.y;\n\te[2 * 4 + r] = v.z;\n\te[3 * 4 + r] = v.w;\n}\n\nVector4 Matrix4::getRow(int r) const\n{\n\treturn Vector4(e[0 * 4 + r], e[1 * 4 + r], e[2 * 4 + r], e[3 * 4 + r]);\n}\n\nvoid Matrix4::setColumn(int c, const Vector4 &v)\n{\n\te[c * 4 + 0] = v.x;\n\te[c * 4 + 1] = v.y;\n\te[c * 4 + 2] = v.z;\n\te[c * 4 + 3] = v.w;\n}\n\nVector4 Matrix4::getColumn(int c) const\n{\n\treturn Vector4(e[c * 4 + 0], e[c * 4 + 1], e[c * 4 + 2], e[c * 4 + 3]);\n}\n\nvoid Matrix4::setIdentity()\n{\n\tmemset(e, 0, sizeof(float)*16);\n\te[15] = e[10] = e[5] = e[0] = 1;\n}\n\nvoid Matrix4::setTranslation(float x, float y)\n{\n\tsetIdentity();\n\te[12] = x;\n\te[13] = y;\n}\n\nvoid Matrix4::setRotation(float rad)\n{\n\tsetIdentity();\n\tfloat c = cosf(rad), s = sinf(rad);\n\te[0] = c;\n\te[4] = -s;\n\te[1] = s;\n\te[5] = c;\n}\n\nvoid Matrix4::setScale(float sx, float sy)\n{\n\tsetIdentity();\n\te[0] = sx;\n\te[5] = sy;\n}\n\nvoid Matrix4::setShear(float kx, float ky)\n{\n\tsetIdentity();\n\te[1] = ky;\n\te[4] = kx;\n}\n\nvoid Matrix4::getApproximateScale(float &sx, float &sy) const\n{\n\tsx = sqrtf(e[0] * e[0] + e[4] * e[4]);\n\tsy = sqrtf(e[1] * e[1] + e[5] * e[5]);\n}\n\t\nvoid Matrix4::setRawTransformation(float t00, float t10, float t01, float t11, float x, float y)\n{\n\tmemset(e, 0, sizeof(float)*16); // zero out matrix\n\te[10] = e[15] = 1.0f;\n\te[0] = t00;\n\te[1] = t10;\n\te[4] = t01;\n\te[5] = t11;\n\te[12] = x;\n\te[13] = y;\n}\n\nvoid Matrix4::setTransformation(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky)\n{\n\tmemset(e, 0, sizeof(float)*16); // zero out matrix\n\tfloat c = cosf(angle), s = sinf(angle);\n\t// matrix multiplication carried out on paper:\n\t// |1     x| |c -s    | |sx       | | 1 ky    | |1     -ox|\n\t// |  1   y| |s  c    | |   sy    | |kx  1    | |  1   -oy|\n\t// |    1  | |     1  | |      1  | |      1  | |    1    |\n\t// |      1| |       1| |        1| |        1| |       1 |\n\t//   move      rotate      scale       skew       origin\n\te[10] = e[15] = 1.0f;\n\te[0]  = c * sx - ky * s * sy; // = a\n\te[1]  = s * sx + ky * c * sy; // = b\n\te[4]  = kx * c * sx - s * sy; // = c\n\te[5]  = kx * s * sx + c * sy; // = d\n\te[12] = x - ox * e[0] - oy * e[4];\n\te[13] = y - ox * e[1] - oy * e[5];\n}\n\nvoid Matrix4::translate(float x, float y)\n{\n\tMatrix4 t;\n\tt.setTranslation(x, y);\n\tthis->operator *=(t);\n}\n\nvoid Matrix4::rotate(float rad)\n{\n\tMatrix4 t;\n\tt.setRotation(rad);\n\tthis->operator *=(t);\n}\n\nvoid Matrix4::scale(float sx, float sy)\n{\n\tMatrix4 t;\n\tt.setScale(sx, sy);\n\tthis->operator *=(t);\n}\n\nvoid Matrix4::shear(float kx, float ky)\n{\n\tMatrix4 t;\n\tt.setShear(kx,ky);\n\tthis->operator *=(t);\n}\n\nbool Matrix4::isAffine2DTransform() const\n{\n\treturn fabsf(e[2] + e[3] + e[6] + e[7] + e[8] + e[9] + e[11] + e[14]) < 0.00001f\n\t\t&& fabsf(e[10] + e[15] - 2.0f) < 0.00001f;\n}\n\nMatrix4 Matrix4::inverse() const\n{\n\tMatrix4 inv;\n\n\tinv.e[0] = e[5]  * e[10] * e[15] -\n\t           e[5]  * e[11] * e[14] -\n\t           e[9]  * e[6]  * e[15] +\n\t           e[9]  * e[7]  * e[14] +\n\t           e[13] * e[6]  * e[11] -\n\t           e[13] * e[7]  * e[10];\n\n\tinv.e[4] = -e[4]  * e[10] * e[15] +\n\t            e[4]  * e[11] * e[14] +\n\t            e[8]  * e[6]  * e[15] -\n\t            e[8]  * e[7]  * e[14] -\n\t            e[12] * e[6]  * e[11] +\n\t            e[12] * e[7]  * e[10];\n\n\tinv.e[8] = e[4]  * e[9]  * e[15] -\n\t           e[4]  * e[11] * e[13] -\n\t           e[8]  * e[5]  * e[15] +\n\t           e[8]  * e[7]  * e[13] +\n\t           e[12] * e[5]  * e[11] -\n\t           e[12] * e[7]  * e[9];\n\n\tinv.e[12] = -e[4]  * e[9]  * e[14] +\n\t             e[4]  * e[10] * e[13] +\n\t             e[8]  * e[5]  * e[14] -\n\t             e[8]  * e[6]  * e[13] -\n\t             e[12] * e[5]  * e[10] +\n\t             e[12] * e[6]  * e[9];\n\n\tinv.e[1] = -e[1]  * e[10] * e[15] +\n\t            e[1]  * e[11] * e[14] +\n\t            e[9]  * e[2]  * e[15] -\n\t            e[9]  * e[3]  * e[14] -\n\t            e[13] * e[2]  * e[11] +\n\t            e[13] * e[3]  * e[10];\n\n\tinv.e[5] = e[0]  * e[10] * e[15] -\n\t           e[0]  * e[11] * e[14] -\n\t           e[8]  * e[2]  * e[15] +\n\t           e[8]  * e[3]  * e[14] +\n\t           e[12] * e[2]  * e[11] -\n\t           e[12] * e[3]  * e[10];\n\n\tinv.e[9] = -e[0]  * e[9]  * e[15] +\n\t            e[0]  * e[11] * e[13] +\n\t            e[8]  * e[1]  * e[15] -\n\t            e[8]  * e[3]  * e[13] -\n\t            e[12] * e[1]  * e[11] +\n\t            e[12] * e[3]  * e[9];\n\n\tinv.e[13] = e[0]  * e[9]  * e[14] -\n\t            e[0]  * e[10] * e[13] -\n\t            e[8]  * e[1]  * e[14] +\n\t            e[8]  * e[2]  * e[13] +\n\t            e[12] * e[1]  * e[10] -\n\t            e[12] * e[2]  * e[9];\n\n\tinv.e[2] = e[1]  * e[6] * e[15] -\n\t           e[1]  * e[7] * e[14] -\n\t           e[5]  * e[2] * e[15] +\n\t           e[5]  * e[3] * e[14] +\n\t           e[13] * e[2] * e[7] -\n\t           e[13] * e[3] * e[6];\n\n\tinv.e[6] = -e[0]  * e[6] * e[15] +\n\t            e[0]  * e[7] * e[14] +\n\t            e[4]  * e[2] * e[15] -\n\t            e[4]  * e[3] * e[14] -\n\t            e[12] * e[2] * e[7] +\n\t            e[12] * e[3] * e[6];\n\n\tinv.e[10] = e[0]  * e[5] * e[15] -\n\t            e[0]  * e[7] * e[13] -\n\t            e[4]  * e[1] * e[15] +\n\t            e[4]  * e[3] * e[13] +\n\t            e[12] * e[1] * e[7] -\n\t            e[12] * e[3] * e[5];\n\n\tinv.e[14] = -e[0]  * e[5] * e[14] +\n\t             e[0]  * e[6] * e[13] +\n\t             e[4]  * e[1] * e[14] -\n\t             e[4]  * e[2] * e[13] -\n\t             e[12] * e[1] * e[6] +\n\t             e[12] * e[2] * e[5];\n\n\tinv.e[3] = -e[1] * e[6] * e[11] +\n\t            e[1] * e[7] * e[10] +\n\t            e[5] * e[2] * e[11] -\n\t            e[5] * e[3] * e[10] -\n\t            e[9] * e[2] * e[7] +\n\t            e[9] * e[3] * e[6];\n\n\tinv.e[7] = e[0] * e[6] * e[11] -\n\t           e[0] * e[7] * e[10] -\n\t           e[4] * e[2] * e[11] +\n\t           e[4] * e[3] * e[10] +\n\t           e[8] * e[2] * e[7] -\n\t           e[8] * e[3] * e[6];\n\n\tinv.e[11] = -e[0] * e[5] * e[11] +\n\t             e[0] * e[7] * e[9] +\n\t             e[4] * e[1] * e[11] -\n\t             e[4] * e[3] * e[9] -\n\t             e[8] * e[1] * e[7] +\n\t             e[8] * e[3] * e[5];\n\n\tinv.e[15] = e[0] * e[5] * e[10] -\n\t            e[0] * e[6] * e[9] -\n\t            e[4] * e[1] * e[10] +\n\t            e[4] * e[2] * e[9] +\n\t            e[8] * e[1] * e[6] -\n\t            e[8] * e[2] * e[5];\n\n\tfloat det = e[0] * inv.e[0] + e[1] * inv.e[4] + e[2] * inv.e[8] + e[3] * inv.e[12];\n\n\tfloat invdet = 1.0f / det;\n\n\tfor (int i = 0; i < 16; i++)\n\t\tinv.e[i] *= invdet;\n\n\treturn inv;\n}\n\nMatrix4 Matrix4::ortho(float left, float right, float bottom, float top, float near, float far)\n{\n\tMatrix4 m;\n\n\tm.e[0] = 2.0f / (right - left);\n\tm.e[5] = 2.0f / (top - bottom);\n\tm.e[10] = -2.0f / (far - near);\n\n\tm.e[12] = -(right + left) / (right - left);\n\tm.e[13] = -(top + bottom) / (top - bottom);\n\tm.e[14] = -(far + near) / (far - near);\n\n\treturn m;\n}\n\nMatrix4 Matrix4::perspective(float verticalfov, float aspect, float near, float far)\n{\n\tMatrix4 m;\n\n\tfloat cotangent = 1.0f / tanf(verticalfov * 0.5f);\n\n\tm.e[0] = cotangent / aspect;\n\tm.e[5] = cotangent;\n\tm.e[10] = (far + near) / (near - far);\n\tm.e[11] = -1.0f;\n\n\tm.e[14] = 2.0f * near * far / (near - far);\n\tm.e[15] = 0.0f;\n\n\treturn m;\n}\n\n/**\n * | e0 e3 e6 |\n * | e1 e4 e7 |\n * | e2 e5 e8 |\n **/\nMatrix3::Matrix3()\n{\n\tsetIdentity();\n}\n\nMatrix3::Matrix3(const Matrix4 &mat4)\n{\n\tconst float *mat4elems = mat4.getElements();\n\n\t// Column 0.\n\te[0] = mat4elems[0];\n\te[1] = mat4elems[1];\n\te[2] = mat4elems[2];\n\n\t// Column 1.\n\te[3] = mat4elems[4];\n\te[4] = mat4elems[5];\n\te[5] = mat4elems[6];\n\n\t// Column 2.\n\te[6] = mat4elems[8];\n\te[7] = mat4elems[9];\n\te[8] = mat4elems[10];\n}\n\nMatrix3::Matrix3(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky)\n{\n\tsetTransformation(x, y, angle, sx, sy, ox, oy, kx, ky);\n}\n\nMatrix3::~Matrix3()\n{\n}\n\nvoid Matrix3::setIdentity()\n{\n\tmemset(e, 0, sizeof(float) * 9);\n\te[8] = e[4] = e[0] = 1.0f;\n}\n\nMatrix3 Matrix3::operator * (const love::Matrix3 &m) const\n{\n\tMatrix3 t;\n\n\tt.e[0] = (e[0]*m.e[0]) + (e[3]*m.e[1]) + (e[6]*m.e[2]);\n\tt.e[3] = (e[0]*m.e[3]) + (e[3]*m.e[4]) + (e[6]*m.e[5]);\n\tt.e[6] = (e[0]*m.e[6]) + (e[3]*m.e[7]) + (e[6]*m.e[8]);\n\n\tt.e[1] = (e[1]*m.e[0]) + (e[4]*m.e[1]) + (e[7]*m.e[2]);\n\tt.e[4] = (e[1]*m.e[3]) + (e[4]*m.e[4]) + (e[7]*m.e[5]);\n\tt.e[7] = (e[1]*m.e[6]) + (e[4]*m.e[7]) + (e[7]*m.e[8]);\n\n\tt.e[2] = (e[2]*m.e[0]) + (e[5]*m.e[1]) + (e[8]*m.e[2]);\n\tt.e[5] = (e[2]*m.e[3]) + (e[5]*m.e[4]) + (e[8]*m.e[5]);\n\tt.e[8] = (e[2]*m.e[6]) + (e[5]*m.e[7]) + (e[8]*m.e[8]);\n\n\treturn t;\n}\n\nvoid Matrix3::operator *= (const Matrix3 &m)\n{\n\tMatrix3 t = (*this) * m;\n\tmemcpy(e, t.e, sizeof(float) * 9);\n}\n\nconst float *Matrix3::getElements() const\n{\n\treturn e;\n}\n\nMatrix3 Matrix3::transposedInverse() const\n{\n\t// e0 e3 e6\n\t// e1 e4 e7\n\t// e2 e5 e8\n\n\tfloat det = e[0] * (e[4]*e[8] - e[7]*e[5])\n\t          - e[1] * (e[3]*e[8] - e[5]*e[6])\n\t          + e[2] * (e[3]*e[7] - e[4]*e[6]);\n\n\tfloat invdet = 1.0f / det;\n\n\tMatrix3 m;\n\n\tm.e[0] =  invdet * (e[4]*e[8] - e[7]*e[5]);\n\tm.e[3] = -invdet * (e[1]*e[8] - e[2]*e[7]);\n\tm.e[6] =  invdet * (e[1]*e[5] - e[2]*e[4]);\n\tm.e[1] = -invdet * (e[3]*e[8] - e[5]*e[6]);\n\tm.e[4] =  invdet * (e[0]*e[8] - e[2]*e[6]);\n\tm.e[7] = -invdet * (e[0]*e[5] - e[3]*e[2]);\n\tm.e[2] =  invdet * (e[3]*e[7] - e[6]*e[4]);\n\tm.e[5] = -invdet * (e[0]*e[7] - e[6]*e[1]);\n\tm.e[8] =  invdet * (e[0]*e[4] - e[3]*e[1]);\n\n\treturn m;\n}\n\nvoid Matrix3::setTransformation(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky)\n{\n\tfloat c = cosf(angle), s = sinf(angle);\n\t// matrix multiplication carried out on paper:\n\t// |1    x| |c -s  | |sx     | | 1 ky  | |1   -ox|\n\t// |  1  y| |s  c  | |   sy  | |kx  1  | |  1 -oy|\n\t// |     1| |     1| |      1| |      1| |     1 |\n\t//   move    rotate    scale     skew      origin\n\te[0] = c * sx - ky * s * sy; // = a\n\te[1] = s * sx + ky * c * sy; // = b\n\te[3] = kx * c * sx - s * sy; // = c\n\te[4] = kx * s * sx + c * sy; // = d\n\te[6] = x - ox * e[0] - oy * e[3];\n\te[7] = y - ox * e[1] - oy * e[4];\n\n\te[2] = e[5] = 0.0f;\n\te[8] = 1.0f;\n}\n\n} // love\n"
  },
  {
    "path": "src/common/Matrix.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_MATRIX_H\n#define LOVE_MATRIX_H\n\n// LOVE\n#include \"math.h\"\n#include \"Vector.h\"\n\nnamespace love\n{\n\n/**\n * This class is the basis for all transformations in LOVE. Although not really\n * needed for 2D, it contains 4x4 elements to be compatible with OpenGL without\n * conversions.\n **/\nclass Matrix4\n{\nprivate:\n\n\tstatic void multiply(const Matrix4 &a, const Matrix4 &b, float t[16]);\n\npublic:\n\n\tstatic void multiply(const Matrix4 &a, const Matrix4 &b, Matrix4 &result);\n\n\t/**\n\t * Creates a new identity matrix.\n\t **/\n\tMatrix4();\n\t\n\t/**\n\t * Creates a new matrix with the transform values set.\n\t **/\n\tMatrix4(float t00, float t10, float t01, float t11, float x, float y);\n\n\t/**\n\t * Creates a new matrix from the specified elements. Be sure to pass\n\t * exactly 16 elements in!\n\t **/\n\tMatrix4(const float elements[16]);\n\n\t/**\n\t * Creates a new matrix from the result of multiplying the two specified\n\t * matrices.\n\t **/\n\tMatrix4(const Matrix4 &a, const Matrix4 &b);\n\n\t/**\n\t * Creates a new matrix set to a transformation.\n\t **/\n\tMatrix4(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky);\n\n\t/**\n\t * Multiplies this Matrix with another Matrix, changing neither.\n\t * @param m The Matrix to multiply with this Matrix.\n\t * @return The combined matrix.\n\t **/\n\tMatrix4 operator * (const Matrix4 &m) const;\n\n\t/**\n\t * Multiplies a Matrix into this Matrix.\n\t * @param m The Matrix to combine into this Matrix.\n\t **/\n\tvoid operator *= (const Matrix4 &m);\n\n\t/**\n\t * Gets a pointer to the 16 array elements.\n\t * @return The array elements.\n\t **/\n\tconst float *getElements() const;\n\n\tvoid setRow(int r, const Vector4 &v);\n\tVector4 getRow(int r) const;\n\n\tvoid setColumn(int c, const Vector4 &v);\n\tVector4 getColumn(int c) const;\n\t/**\n\t * Resets this Matrix to the identity matrix.\n\t **/\n\tvoid setIdentity();\n\n\t/**\n\t * Resets this Matrix to a translation.\n\t * @param x Translation along x-axis.\n\t * @param y Translation along y-axis.\n\t **/\n\tvoid setTranslation(float x, float y);\n\n\t/**\n\t * Resets this Matrix to a rotation.\n\t * @param r The angle in radians.\n\t **/\n\tvoid setRotation(float r);\n\n\t/**\n\t * Resets this Matrix to a scale transformation.\n\t * @param sx Scale factor along the x-axis.\n\t * @param sy Scale factor along the y-axis.\n\t **/\n\tvoid setScale(float sx, float sy);\n\n\t/**\n\t * Resets this Matrix to a shear transformation.\n\t * @param kx Shear along x-axis.\n\t * @param ky Shear along y-axis.\n\t **/\n\tvoid setShear(float kx, float ky);\n\n\t/**\n\t * Calculates the scale factors for a 2D affine transform. The output values\n\t * are absolute (not signed).\n\t **/\n\tvoid getApproximateScale(float &sx, float &sy) const;\n\t\n\t/**\n\t * Sets a transformation's values directly. Useful if you want to modify them inplace,\n\t * or if you want to create a transformation that's not buildable with setTransformation()\n\t * i.e. the inverse of setTransformation() is not easily built with another call\n\t * to setTransformation() with tweaked values.\n\t *\n\t * @param t00 The sx*cos(angle) component of the transformation.\n\t * @param t10 The sx*sin(angle) component of the transformation.\n\t * @param t01 The sy*(-sin(angle)) component of the transformation.\n\t * @param t11 The sy*cos(angle) component of the transformation.\n\t * @param x The x translation component of the transformation.\n\t * @param y The y translation component of the transformation.\n\t **/\n\tvoid setRawTransformation(float t00, float t10, float t01, float t11, float x, float y);\n\n\t/**\n\t * Creates a transformation with a certain position, orientation, scale\n\t * and offset. Perfect for Drawables -- what a coincidence!\n\t *\n\t * @param x The translation along the x-axis.\n\t * @param y The translation along the y-axis.\n\t * @param angle The rotation (rad) around the center with offset (ox,oy).\n\t * @param sx Scale along x-axis.\n\t * @param sy Scale along y-axis.\n\t * @param ox The offset for rotation along the x-axis.\n\t * @param oy The offset for rotation along the y-axis.\n\t * @param kx Shear along x-axis\n\t * @param ky Shear along y-axis\n\t **/\n\tvoid setTransformation(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky);\n\n\t/**\n\t * Multiplies this Matrix with a translation.\n\t * @param x Translation along x-axis.\n\t * @param y Translation along y-axis.\n\t **/\n\tvoid translate(float x, float y);\n\n\t/**\n\t * Multiplies this Matrix with a rotation.\n\t * @param r Angle in radians.\n\t **/\n\tvoid rotate(float r);\n\n\t/**\n\t * Multiplies this Matrix with a scale transformation.\n\t * @param sx Scale factor along the x-axis.\n\t * @param sy Scale factor along the y-axis.\n\t **/\n\tvoid scale(float sx, float sy);\n\n\t/**\n\t * Multiplies this Matrix with a shear transformation.\n\t * @param kx Shear along the x-axis.\n\t * @param ky Shear along the y-axis.\n\t **/\n\tvoid shear(float kx, float ky);\n\n\t/**\n\t * Transforms an array of 2-component vertices by this Matrix. The source\n\t * and destination arrays may be the same.\n\t **/\n\ttemplate <typename Vdst, typename Vsrc>\n\tvoid transformXY(Vdst *dst, const Vsrc *src, int size) const;\n\n\t/**\n\t * Transforms an array of 2-component vertices by this Matrix, and stores\n\t * them in an array of 3-component vertices.\n\t **/\n\ttemplate <typename Vdst, typename Vsrc>\n\tvoid transformXY0(Vdst *dst, const Vsrc *src, int size) const;\n\n\t/**\n\t * Transforms an array of 3-component vertices by this Matrix. The source\n\t * and destination arrays may be the same.\n\t **/\n\ttemplate <typename Vdst, typename Vsrc>\n\tvoid transformXYZ(Vdst *dst, const Vsrc *src, int size) const;\n\n\t/**\n\t * Gets whether this matrix is an affine 2D transform (if the only non-\n\t * identity elements are the upper-left 2x2 and 2 translation values in the\n\t * 4th column).\n\t **/\n\tbool isAffine2DTransform() const;\n\n\t/**\n\t * Computes and returns the inverse of the matrix.\n\t **/\n\tMatrix4 inverse() const;\n\n\t/**\n\t * Creates a new orthographic projection matrix.\n\t **/\n\tstatic Matrix4 ortho(float left, float right, float bottom, float top, float near, float far);\n\n\t/**\n\t * Creates a new perspective projection matrix.\n\t **/\n\tstatic Matrix4 perspective(float verticalfov, float aspect, float near, float far);\n\nprivate:\n\n\t/**\n\t * | e0 e4 e8  e12 |\n\t * | e1 e5 e9  e13 |\n\t * | e2 e6 e10 e14 |\n\t * | e3 e7 e11 e15 |\n\t **/\n\tfloat e[16];\n\n}; // Matrix4\n\nclass Matrix3\n{\npublic:\n\n\tMatrix3();\n\n\t/**\n\t * Constructs a 3x3 matrix from the upper left section of a 4x4 matrix.\n\t **/\n\tMatrix3(const Matrix4 &mat4);\n\n\t/**\n\t * Creates a new matrix set to a transformation.\n\t **/\n\tMatrix3(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky);\n\n\t~Matrix3();\n\n\t/**\n\t * Resets this matrix to the identity matrix.\n\t **/\n\tvoid setIdentity();\n\n\tMatrix3 operator * (const Matrix3 &m) const;\n\tvoid operator *= (const Matrix3 &m);\n\n\t/**\n\t * Gets a pointer to the 9 array elements.\n\t **/\n\tconst float *getElements() const;\n\n\t/**\n\t * Calculates the inverse of the transpose of this matrix.\n\t **/\n\tMatrix3 transposedInverse() const;\n\n\t/**\n\t * Creates a transformation with a certain position, orientation, scale\n\t * and offset.\n\t *\n\t * @param x The translation along the x-axis.\n\t * @param y The translation along the y-axis.\n\t * @param angle The rotation (rad) around the center with offset (ox,oy).\n\t * @param sx Scale along x-axis.\n\t * @param sy Scale along y-axis.\n\t * @param ox The offset for rotation along the x-axis.\n\t * @param oy The offset for rotation along the y-axis.\n\t * @param kx Shear along x-axis\n\t * @param ky Shear along y-axis\n\t **/\n\tvoid setTransformation(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky);\n\n\t/**\n\t * Transforms an array of vertices by this matrix.\n\t **/\n\ttemplate <typename Vdst, typename Vsrc>\n\tvoid transformXY(Vdst *dst, const Vsrc *src, int size) const;\n\nprivate:\n\n\t/**\n\t * | e0 e3 e6\n\t * | e1 e4 e7\n\t * | e2 e5 e8\n\t **/\n\tfloat e[9];\n\n}; // Matrix3\n\n//                 | x |\n//                 | y |\n//                 | 0 |\n//                 | 1 |\n// | e0 e4 e8  e12 |\n// | e1 e5 e9  e13 |\n// | e2 e6 e10 e14 |\n// | e3 e7 e11 e15 |\n\ntemplate <typename Vdst, typename Vsrc>\nvoid Matrix4::transformXY(Vdst *dst, const Vsrc *src, int size) const\n{\n\tfor (int i = 0; i < size; i++)\n\t{\n\t\t// Store in temp variables in case src = dst\n\t\tfloat x = (e[0]*src[i].x) + (e[4]*src[i].y) + (0) + (e[12]);\n\t\tfloat y = (e[1]*src[i].x) + (e[5]*src[i].y) + (0) + (e[13]);\n\n\t\tdst[i].x = x;\n\t\tdst[i].y = y;\n\t}\n}\n\ntemplate <typename Vdst, typename Vsrc>\nvoid Matrix4::transformXY0(Vdst *dst, const Vsrc *src, int size) const\n{\n\tfor (int i = 0; i < size; i++)\n\t{\n\t\t// Store in temp variables in case src = dst\n\t\tfloat x = (e[0]*src[i].x) + (e[4]*src[i].y) + (0) + (e[12]);\n\t\tfloat y = (e[1]*src[i].x) + (e[5]*src[i].y) + (0) + (e[13]);\n\t\tfloat z = (e[2]*src[i].x) + (e[6]*src[i].y) + (0) + (e[14]);\n\n\t\tdst[i].x = x;\n\t\tdst[i].y = y;\n\t\tdst[i].z = z;\n\t}\n}\n\n//                 | x |\n//                 | y |\n//                 | z |\n//                 | 1 |\n// | e0 e4 e8  e12 |\n// | e1 e5 e9  e13 |\n// | e2 e6 e10 e14 |\n// | e3 e7 e11 e15 |\n\ntemplate <typename Vdst, typename Vsrc>\nvoid Matrix4::transformXYZ(Vdst *dst, const Vsrc *src, int size) const\n{\n\tfor (int i = 0; i < size; i++)\n\t{\n\t\t// Store in temp variables in case src = dst\n\t\tfloat x = (e[0]*src[i].x) + (e[4]*src[i].y) + (e[ 8]*src[i].z) + (e[12]);\n\t\tfloat y = (e[1]*src[i].x) + (e[5]*src[i].y) + (e[ 9]*src[i].z) + (e[13]);\n\t\tfloat z = (e[2]*src[i].x) + (e[6]*src[i].y) + (e[10]*src[i].z) + (e[14]);\n\n\t\tdst[i].x = x;\n\t\tdst[i].y = y;\n\t\tdst[i].z = z;\n\t}\n}\n\n//            | x |\n//            | y |\n//            | 1 |\n// | e0 e3 e6 |\n// | e1 e4 e7 |\n// | e2 e5 e8 |\ntemplate <typename Vdst, typename Vsrc>\nvoid Matrix3::transformXY(Vdst *dst, const Vsrc *src, int size) const\n{\n\tfor (int i = 0; i < size; i++)\n\t{\n\t\tfloat x = (e[0]*src[i].x) + (e[3]*src[i].y) + (e[6]);\n\t\tfloat y = (e[1]*src[i].x) + (e[4]*src[i].y) + (e[7]);\n\n\t\tdst[i].x = x;\n\t\tdst[i].y = y;\n\t}\n}\n\n} //love\n\n#endif// LOVE_MATRIX_H\n"
  },
  {
    "path": "src/common/Module.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"Module.h\"\n#include \"Exception.h\"\n#include \"deprecation.h\"\n\n// std\n#include <map>\n#include <utility>\n#include <string>\n\nnamespace\n{\n\ttypedef std::map<std::string, love::Module*> ModuleRegistry;\n\n\t// The registry must be dynamically managed, because some modules\n\t// (the math module) are static globals that are not guaranteed to\n\t// be destroyed before other static globals.\n\tModuleRegistry *registry = nullptr;\n\n\tModuleRegistry &registryInstance()\n\t{\n\t\tif (!registry)\n\t\t\tregistry = new ModuleRegistry;\n\n\t\treturn *registry;\n\t}\n\n\tvoid freeEmptyRegistry()\n\t{\n\t\tif (registry && registry->empty())\n\t\t{\n\t\t\tdelete registry;\n\t\t\tregistry = nullptr;\n\t\t}\n\t}\n\n} // anonymous namespace\n\nnamespace love\n{\n\nlove::Type Module::type(\"Module\", &Object::type);\nModule *Module::instances[] = {};\n\nModule::Module(Module::ModuleType moduleType, const char *name)\n\t: moduleType(moduleType)\n\t, name(name)\n{\n\tinitDeprecation();\n\tregisterInstance(this);\n}\n\nModule::~Module()\n{\n\tModuleRegistry &registry = registryInstance();\n\n\t// We can't use the overridden Module::getName() in this destructor.\n\tfor (auto it = registry.begin(); it != registry.end(); ++it)\n\t{\n\t\tif (it->second == this)\n\t\t{\n\t\t\tregistry.erase(it);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Same deal with Module::getModuleType().\n\tfor (int i = 0; i < (int) M_MAX_ENUM; i++)\n\t{\n\t\tif (instances[i] == this)\n\t\t\tinstances[i] = nullptr;\n\t}\n\n\tfreeEmptyRegistry();\n\n\tdeinitDeprecation();\n}\n\nvoid Module::registerInstance(Module *instance)\n{\n\tif (instance == nullptr)\n\t\tthrow Exception(\"Module instance is null\");\n\n\tstd::string name(instance->getName());\n\n\tModuleRegistry &registry = registryInstance();\n\n\tauto it = registry.find(name);\n\n\tif (it != registry.end())\n\t{\n\t\tif (it->second == instance)\n\t\t\treturn;\n\t\tthrow Exception(\"Module %s already registered!\", instance->getName());\n\t}\n\n\tregistry.insert(make_pair(name, instance));\n\n\tModuleType mtype = instance->getModuleType();\n\n\tif (mtype != M_UNKNOWN)\n\t{\n\t\tif (instances[mtype] != nullptr)\n\t\t{\n\t\t\tprintf(\"Warning: overwriting module instance %s with new instance %s\\n\",\n\t\t\t\t   instances[mtype]->getName(), instance->getName());\n\t\t}\n\n\t\tinstances[mtype] = instance;\n\t}\n}\n\nModule *Module::getInstance(const std::string &name)\n{\n\tModuleRegistry &registry = registryInstance();\n\n\tauto it = registry.find(name);\n\n\tif (registry.end() == it)\n\t\treturn nullptr;\n\n\treturn it->second;\n}\n\n} // love\n"
  },
  {
    "path": "src/common/Module.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_MODULE_H\n#define LOVE_MODULE_H\n\n// LOVE\n#include \"Exception.h\"\n#include \"Object.h\"\n\nnamespace love\n{\n/**\n * Abstract superclass for all modules.\n **/\nclass Module : public Object\n{\npublic:\n\n\tstatic love::Type type;\n\n\tenum ModuleType\n\t{\n\t\tM_UNKNOWN = -1, // Use this for modules outside of LOVE's source code.\n\t\tM_AUDIO,\n\t\tM_DATA,\n\t\tM_EVENT,\n\t\tM_FILESYSTEM,\n\t\tM_FONT,\n\t\tM_GRAPHICS,\n\t\tM_IMAGE,\n\t\tM_JOYSTICK,\n\t\tM_KEYBOARD,\n\t\tM_MATH,\n\t\tM_MOUSE,\n\t\tM_PHYSICS,\n\t\tM_SENSOR,\n\t\tM_SOUND,\n\t\tM_SYSTEM,\n\t\tM_THREAD,\n\t\tM_TIMER,\n\t\tM_TOUCH,\n\t\tM_VIDEO,\n\t\tM_WINDOW,\n\t\tM_MAX_ENUM\n\t};\n\n\tModule(ModuleType moduleType, const char *name);\n\tvirtual ~Module();\n\n    /**\n     * Gets the base type of the module.\n     **/\n\tModuleType getModuleType() const { return moduleType; }\n\n\t/**\n\t * Gets the name of the module. This is used in case of errors\n\t * and other messages.\n\t *\n\t * @return The full name of the module, eg. love.graphics.opengl.\n\t **/\n\tconst char *getName() const { return name.c_str(); }\n\n\t/**\n\t * Retrieve module instance from internal registry. May return NULL\n\t * if module not registered.\n\t * @param name The full name of the module.\n\t * @return Module instance or NULL if the module is not registered.\n\t */\n\tstatic Module *getInstance(const std::string &name);\n\n\t/**\n\t * Retrieve module instance from the internal registry using the base\n\t * module type. May return null if the module is not registered.\n\t * @param type The base type of the module.\n\t **/\n\ttemplate <typename T>\n\tstatic T *getInstance(ModuleType type)\n\t{\n\t\treturn type != M_UNKNOWN ? (T *) instances[type] : nullptr;\n\t}\n\nprivate:\n\n\tstatic void registerInstance(Module *instance);\n\n\tModuleType moduleType;\n\tstd::string name;\n\n\tstatic Module *instances[M_MAX_ENUM];\n\n}; // Module\n\n} // love\n\n#endif // LOVE_MODULE_H\n"
  },
  {
    "path": "src/common/Object.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"Object.h\"\n\nnamespace love\n{\n\nlove::Type Object::type(\"Object\", nullptr);\n\nObject::Object()\n\t: count(1)\n{\n}\n\nObject::Object(const Object & /*other*/)\n\t: count(1) // Always start with a reference count of 1.\n{\n}\n\nObject::~Object()\n{\n}\n\nint Object::getReferenceCount() const\n{\n\treturn count;\n}\n\nvoid Object::retain()\n{\n\tcount.fetch_add(1, std::memory_order_relaxed);\n}\n\nvoid Object::release()\n{\n\t// http://www.boost.org/doc/libs/1_56_0/doc/html/atomic/usage_examples.html\n\tif (count.fetch_sub(1, std::memory_order_release) == 1)\n\t{\n\t\tstd::atomic_thread_fence(std::memory_order_acquire);\n\t\tdelete this;\n\t}\n}\n\n} // love\n"
  },
  {
    "path": "src/common/Object.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_OBJECT_H\n#define LOVE_OBJECT_H\n\n#include <atomic>\n#include \"types.h\"\n\nnamespace love\n{\n\n/**\n * Superclass for all object that should be able to  cross the Lua/C border\n * (this pertains to most objects).\n *\n * This class is an alternative to using smart pointers; it contains retain/release\n * methods, and will delete itself with the reference count hits zero. The wrapper\n * code assumes that all userdata inherits from this class.\n **/\nclass Object\n{\npublic:\n\n\tstatic love::Type type;\n\n\t/**\n\t * Constructor. Sets reference count to one.\n\t **/\n\tObject();\n\tObject(const Object &other);\n\n\t/**\n\t * Destructor.\n\t **/\n\tvirtual ~Object() = 0;\n\n\t/**\n\t * Gets the reference count of this Object.\n\t * @returns The reference count.\n\t **/\n\tint getReferenceCount() const;\n\n\t/**\n\t * Retains the Object, i.e. increases the\n\t * reference count by one.\n\t **/\n\tvoid retain();\n\n\t/**\n\t * Releases one reference to the Object, i.e. decrements the\n\t * reference count by one, and potentially deletes the Object\n\t * if there are no more references.\n\t **/\n\tvoid release();\n\nprivate:\n\n\t// The reference count.\n\tstd::atomic<int> count;\n\n}; // Object\n\n/**\n * Structure wrapping an object and its associated Type instance. This is used\n * for storing everything necessary to identify an object's properties in\n * environments where the Type is not easily obtained otherwise, for example in\n * a Lua state.\n **/\nstruct Proxy\n{\n\t// Holds type information (see types.h).\n\tlove::Type *type;\n\n\t// Pointer to the actual object.\n\tObject *object;\n};\n\nenum class Acquire\n{\n\tRETAIN,\n\tNORETAIN,\n};\n\ntemplate <typename T>\nclass StrongRef\n{\npublic:\n\n\tStrongRef()\n\t\t: object(nullptr)\n\t{\n\t}\n\n\tStrongRef(T *obj, Acquire acquire = Acquire::RETAIN)\n\t\t: object(obj)\n\t{\n\t\tif (object && acquire == Acquire::RETAIN) object->retain();\n\t}\n\n\tStrongRef(const StrongRef &other)\n\t\t: object(other.get())\n\t{\n\t\tif (object) object->retain();\n\t}\n\n\tStrongRef(StrongRef &&other)\n\t\t: object(other.object)\n\t{\n\t\tother.object = nullptr;\n\t}\n\n\t~StrongRef()\n\t{\n\t\tif (object) object->release();\n\t}\n\n\tStrongRef &operator = (const StrongRef &other)\n\t{\n\t\tset(other.get());\n\t\treturn *this;\n\t}\n\n\tT *operator->() const\n\t{\n\t\treturn object;\n\t}\n\n\texplicit operator bool() const\n\t{\n\t\treturn object != nullptr;\n\t}\n\n\toperator T*() const\n\t{\n\t\treturn object;\n\t}\n\n\tvoid set(T *obj, Acquire acquire = Acquire::RETAIN)\n\t{\n\t\tif (obj && acquire == Acquire::RETAIN) obj->retain();\n\t\tif (object) object->release();\n\t\tobject = obj;\n\t}\n\n\tT *get() const\n\t{\n\t\treturn object;\n\t}\n\nprivate:\n\n\tT *object;\n\n}; // StrongRef\n\n} // love\n\n#endif // LOVE_OBJECT_H\n"
  },
  {
    "path": "src/common/Optional.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\nnamespace love\n{\n\n// Currently only meant for simple and small types.\ntemplate <typename T>\nstruct Optional\n{\n\tT value;\n\tbool hasValue;\n\n\tOptional()\n\t\t: value(T())\n\t\t, hasValue(false)\n\t{}\n\n\tOptional(T val)\n\t\t: value(val)\n\t\t, hasValue(true)\n\t{}\n\n\tvoid set(T val)\n\t{\n\t\tvalue = val;\n\t\thasValue = true;\n\t}\n\n\tT get(T defaultVal) const\n\t{\n\t\treturn hasValue ? value : defaultVal;\n\t}\n\n\tvoid clear()\n\t{\n\t\thasValue = false;\n\t}\n};\n\ntypedef Optional<bool> OptionalBool;\ntypedef Optional<float> OptionalFloat;\ntypedef Optional<double> OptionalDouble;\ntypedef Optional<int> OptionalInt;\n\n} // love\n"
  },
  {
    "path": "src/common/Range.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include <stddef.h>\n#include <algorithm>\n#include <limits>\n\nnamespace love\n{\n\nstruct Range\n{\n\tsize_t first;\n\tsize_t last;\n\n\tRange()\n\t\t: first(std::numeric_limits<size_t>::max())\n\t\t, last(0)\n\t{}\n\n\tRange(size_t offset, size_t size)\n\t\t: first(offset)\n\t\t, last(offset + size - 1)\n\t{}\n\n\tbool isValid() const { return first <= last; }\n\n\tvoid invalidate()\n\t{\n\t\tfirst = std::numeric_limits<size_t>::max();\n\t\tlast = 0;\n\t}\n\n\tsize_t getMin() const { return first; }\n\tsize_t getMax() const { return last; }\n\n\tsize_t getOffset() const { return first; }\n\tsize_t getSize() const { return (last - first) + 1; }\n\n\tbool contains(const Range &other) const\n\t{\n\t\treturn first <= other.first && last >= other.last;\n\t}\n\n\tbool intersects(const Range &other) const\n\t{\n\t\treturn !(first > other.last || last < other.first);\n\t}\n\n\tvoid intersect(const Range &other)\n\t{\n\t\tfirst = std::max(first, other.first);\n\t\tlast = std::min(last, other.last);\n\t}\n\n\tvoid encapsulate(size_t index)\n\t{\n\t\tfirst = std::min(first, index);\n\t\tlast = std::max(last, index);\n\t}\n\n\tvoid encapsulate(size_t offset, size_t size)\n\t{\n\t\tfirst = std::min(first, offset);\n\t\tlast = std::max(last, offset + size - 1);\n\t}\n\n\tvoid encapsulate(const Range &other)\n\t{\n\t\tfirst = std::min(first, other.first);\n\t\tlast = std::max(last, other.last);\n\t}\n};\n\n} // love\n"
  },
  {
    "path": "src/common/Reference.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Reference.h\"\n#include \"runtime.h\"\n\nnamespace love\n{\n\nconst char REFERENCE_TABLE_NAME[] = \"love-references\";\n\nReference::Reference()\n\t: pinnedL(nullptr)\n\t, idx(LUA_REFNIL)\n{\n}\n\nReference::Reference(lua_State *L)\n\t: pinnedL(nullptr)\n\t, idx(LUA_REFNIL)\n{\n\tref(L);\n}\n\nReference::~Reference()\n{\n\tunref();\n}\n\nvoid Reference::ref(lua_State *L)\n{\n\tunref(); // Previously created reference needs to be cleared\n\tpinnedL = luax_getpinnedthread(L);\n\tluax_insist(L, LUA_REGISTRYINDEX, REFERENCE_TABLE_NAME);\n\tlua_insert(L, -2); // Move reference table behind value.\n\tidx = luaL_ref(L, -2);\n\tlua_pop(L, 1);\n}\n\nvoid Reference::unref()\n{\n\tif (idx != LUA_REFNIL)\n\t{\n\t\t// We use a pinned thread/coroutine for the Lua state because we know it\n\t\t// hasn't been garbage collected and is valid, as long as the whole lua\n\t\t// state is still open.\n\t\tluax_insist(pinnedL, LUA_REGISTRYINDEX, REFERENCE_TABLE_NAME);\n\t\tluaL_unref(pinnedL, -1, idx);\n\t\tlua_pop(pinnedL, 1);\n\t\tidx = LUA_REFNIL;\n\t}\n}\n\nvoid Reference::push(lua_State *L)\n{\n\tif (idx != LUA_REFNIL)\n\t{\n\t\tluax_insist(L, LUA_REGISTRYINDEX, REFERENCE_TABLE_NAME);\n\t\tlua_rawgeti(L, -1, idx);\n\t\tlua_remove(L, -2);\n\t}\n\telse\n\t\tlua_pushnil(L);\n}\n\n} // love\n"
  },
  {
    "path": "src/common/Reference.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_REFERENCE_H\n#define LOVE_REFERENCE_H\n\nstruct lua_State;\n\nnamespace love\n{\n\n/**\n * This class wraps the reference functionality built into\n * Lua, which allows C++ code to refer to Lua variables.\n **/\nclass Reference\n{\npublic:\n\n\t/**\n\t * Creates the reference object, but does not create\n\t * the actual reference.\n\t **/\n\tReference();\n\n\t/**\n\t * Creates the object and a reference to the value\n\t * on the top of the stack.\n\t **/\n\tReference(lua_State *L);\n\n\t/**\n\t * Deletes the reference, if any.\n\t **/\n\tvirtual ~Reference();\n\n\t/**\n\t * Creates a reference to the value on the\n\t * top of the stack.\n\t **/\n\tvoid ref(lua_State *L);\n\n\t/**\n\t * Unrefs the reference, if any.\n\t **/\n\tvoid unref();\n\n\t/**\n\t * Pushes the referred value onto the stack of the specified Lua coroutine.\n\t * NOTE: The coroutine *must* belong to the same Lua state that was used for\n\t * Reference::ref.\n\t **/\n\tvoid push(lua_State *L);\n\n\tlua_State *getPinnedL() const { return pinnedL; }\n\nprivate:\n\n\t// A pinned coroutine (probably the main thread) belonging to the Lua state\n\t// in which the reference resides.\n\tlua_State *pinnedL;\n\n\t// Index to the Lua reference.\n\tint idx;\n};\n\n} // love\n\n#endif // LOVE_REFERENCE_H\n"
  },
  {
    "path": "src/common/Stream.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"Stream.h\"\n#include \"Data.h\"\n#include \"data/ByteData.h\"\n#include \"Exception.h\"\n\nnamespace love\n{\n\nlove::Type Stream::type(\"Stream\", &Object::type);\n\nData *Stream::read(int64 size)\n{\n\tint64 max = LOVE_INT64_MAX;\n\tint64 cur = 0;\n\n\tif (isSeekable())\n\t{\n\t\tmax = getSize();\n\t\tcur = tell();\n\t}\n\n\tif (cur < 0)\n\t\tcur = 0;\n\telse if (cur > max)\n\t\tcur = max;\n\n\tif (cur + size > max)\n\t\tsize = max - cur;\n\n\tStrongRef<data::ByteData> dst(new data::ByteData(size, false), Acquire::NORETAIN);\n\n\tint64 bytesRead = read(dst->getData(), size);\n\n\tif (bytesRead < 0 || (bytesRead == 0 && bytesRead != size))\n\t\tthrow love::Exception(\"Could not read from stream.\");\n\n\tif (bytesRead < size)\n\t\tdst.set(new data::ByteData(dst->getData(), (size_t) bytesRead), Acquire::NORETAIN);\n\n\tdst->retain();\n\treturn dst;\n}\n\nbool Stream::write(Data *src)\n{\n\treturn write(src, 0, src->getSize());\n}\n\nbool Stream::write(Data *src, int64 offset, int64 size)\n{\n\tif (offset < 0 || size < 0 || offset + size > (int64) src->getSize())\n\t\tthrow love::Exception(\"Offset and size parameters do not fit within the given Data's size.\");\n\n\treturn write((const uint8 *) src->getData() + offset, size);\n}\n\n} // love\n"
  },
  {
    "path": "src/common/Stream.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_STREAM_H\n#define LOVE_STREAM_H\n\n// LOVE\n#include <stddef.h>\n#include \"Object.h\"\n#include \"int.h\"\n\nnamespace love\n{\n\nclass Data;\n\nclass Stream : public Object\n{\npublic:\n\n\tenum SeekOrigin\n\t{\n\t\tSEEKORIGIN_BEGIN,\n\t\tSEEKORIGIN_CURRENT,\n\t\tSEEKORIGIN_END,\n\t\tSEEKORIGIN_MAX_ENUM\n\t};\n\n\tstatic love::Type type;\n\n\tvirtual ~Stream() {}\n\n\t/**\n\t * Creates a new copy of the Stream, with the same settings as the original.\n\t * The seek position will be reset in the copy.\n\t **/\n\tvirtual Stream *clone() = 0;\n\n\t/**\n\t * Gets whether read() is supported for this Stream.\n\t **/\n\tvirtual bool isReadable() const = 0;\n\n\t/**\n\t * Gets whether write() is supported for this Stream.\n\t **/\n\tvirtual bool isWritable() const = 0;\n\n\t/**\n\t * Gets whether seek(), tell(), and getSize() are supported for this Stream.\n\t **/\n\tvirtual bool isSeekable() const = 0;\n\n\t/**\n\t * Reads data into the destination buffer, and returns the number of bytes\n\t * actually read.\n\t **/\n\tvirtual int64 read(void *dst, int64 size) = 0;\n\n\t/**\n\t * Reads data into a new Data object.\n\t **/\n\tvirtual Data *read(int64 size);\n\n\t/**\n\t * Writes data from the source buffer into the Stream.\n\t **/\n\tvirtual bool write(const void *src, int64 size) = 0;\n\n\t/**\n\t * Writes data from the source Data object into the Stream.\n\t **/\n\tvirtual bool write(Data *src, int64 offset, int64 size);\n\tbool write(Data *src);\n\n\t/**\n\t * Flushes all data written to the Stream.\n\t **/\n\tvirtual bool flush() = 0;\n\n\t/**\n\t * Gets the total size of the Stream, if supported.\n\t **/\n\tvirtual int64 getSize() = 0;\n\n\t/**\n\t * Sets the current position in the Stream, if supported.\n\t **/\n\tvirtual bool seek(int64 pos, SeekOrigin origin = SEEKORIGIN_BEGIN) = 0;\n\n\t/**\n\t * Gets the current position in the Stream, if supported.\n\t **/\n\tvirtual int64 tell() = 0;\n\n}; // Stream\n\n} // love\n\n#endif // LOVE_STREAM_H\n"
  },
  {
    "path": "src/common/StringMap.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"StringMap.h\"\n\n// See the header\ntemplate class std::vector<std::string>;\n"
  },
  {
    "path": "src/common/StringMap.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_STRING_MAP_H\n#define LOVE_STRING_MAP_H\n\n#include <string>\n#include <vector>\n\n// As StringMap instantiates std::vector<std::string> for instances that use\n// getNames(), we end up with multiple copies in the object files. This\n// declaration means we only emit it once (in StringMap.cpp).\nextern template class std::vector<std::string>;\n\nnamespace love\n{\n\ntemplate<typename T, unsigned int SIZE>\nclass StringMap\n{\npublic:\n\n\tstruct Entry\n\t{\n\t\tconst char *key;\n\t\tT value;\n\t};\n\n\tStringMap(const Entry *entries, unsigned int num)\n\t{\n\n\t\tfor (unsigned int i = 0; i < SIZE; ++i)\n\t\t\treverse[i] = nullptr;\n\n\t\tunsigned int n = num / sizeof(Entry);\n\n\t\tfor (unsigned int i = 0; i < n; ++i)\n\t\t\tadd(entries[i].key, entries[i].value);\n\t}\n\n\tbool streq(const char *a, const char *b)\n\t{\n\t\twhile (*a != 0 && *b != 0)\n\t\t{\n\t\t\tif (*a != *b)\n\t\t\t\treturn false;\n\n\t\t\t++a;\n\t\t\t++b;\n\t\t}\n\n\t\treturn (*a == 0 && *b == 0);\n\t}\n\n\tbool find(const char *key, T &t)\n\t{\n\t\tunsigned int str_hash = djb2(key);\n\n\t\tfor (unsigned int i = 0; i < MAX; ++i)\n\t\t{\n\t\t\tunsigned int str_i = (str_hash + i) % MAX;\n\n\t\t\tif (!records[str_i].set)\n\t\t\t\treturn false;\n\n\t\t\tif (streq(records[str_i].key, key))\n\t\t\t{\n\t\t\t\tt = records[str_i].value;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tbool find(T key, const char *&str)\n\t{\n\t\tunsigned int index = (unsigned int) key;\n\n\t\tif (index >= SIZE)\n\t\t\treturn false;\n\n\t\tif (reverse[index] != nullptr)\n\t\t{\n\t\t\tstr = reverse[index];\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tbool add(const char *key, T value)\n\t{\n\t\tunsigned int str_hash = djb2(key);\n\t\tbool inserted = false;\n\n\t\tfor (unsigned int i = 0; i < MAX; ++i)\n\t\t{\n\t\t\tunsigned int str_i = (str_hash + i) % MAX;\n\n\t\t\tif (!records[str_i].set)\n\t\t\t{\n\t\t\t\tinserted = true;\n\t\t\t\trecords[str_i].set = true;\n\t\t\t\trecords[str_i].key = key;\n\t\t\t\trecords[str_i].value = value;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tunsigned int index = (unsigned int) value;\n\n\t\tif (index >= SIZE)\n\t\t{\n\t\t\tprintf(\"Constant %s out of bounds with %u!\\n\", key, index);\n\t\t\treturn false;\n\t\t}\n\n\t\treverse[index] = key;\n\n\t\treturn inserted;\n\t}\n\n\tunsigned int djb2(const char *key)\n\t{\n\t\tunsigned int hash = 5381;\n\t\tint c;\n\n\t\twhile ((c = *key++))\n\t\t\thash = ((hash << 5) + hash) + c;\n\n\t\treturn hash;\n\t}\n\n\tstd::vector<std::string> getNames() const\n\t{\n\t\tstd::vector<std::string> names;\n\t\tnames.reserve(SIZE);\n\n\t\tfor (unsigned int i = 0; i < SIZE; ++i)\n\t\t\tif (reverse[i] != nullptr)\n\t\t\t\tnames.emplace_back(reverse[i]);\n\n\t\treturn names;\n\t}\n\nprivate:\n\n\tstruct Record\n\t{\n\t\tconst char *key;\n\t\tT value;\n\t\tbool set;\n\t\tRecord() : set(false) {}\n\t};\n\n\tstatic const unsigned int MAX = SIZE * 2;\n\n\tRecord records[MAX];\n\tconst char *reverse[SIZE];\n\n}; // StringMap\n\n#define STRINGMAP_DECLARE(type) \\\nbool getConstant(const char *in, type &out); \\\nbool getConstant(type in, const char *&out); \\\nstd::vector<std::string> getConstants(type); \\\n\n#define STRINGMAP_BEGIN(type, count, name) \\\nstatic StringMap<type, count>::Entry name##Entries[] =\n\n#define STRINGMAP_END(type, count, name) \\\n; \\\nstatic StringMap<type, count> name##s(name##Entries, sizeof(name##Entries)); \\\nbool getConstant(const char *in, type &out) { return name##s.find(in, out); } \\\nbool getConstant(type in, const char *&out) { return name##s.find(in, out); } \\\nstd::vector<std::string> getConstants(type) { return name##s.getNames(); }\n\n#define STRINGMAP_CLASS_DECLARE(type) \\\nstatic bool getConstant(const char *in, type &out); \\\nstatic bool getConstant(type in, const char *&out); \\\nstatic std::vector<std::string> getConstants(type); \\\n\n#define STRINGMAP_CLASS_BEGIN(classname, type, count, name) \\\nstatic StringMap<type, count>::Entry name##Entries[] =\n\n#define STRINGMAP_CLASS_END(classname, type, count, name) \\\n; \\\nstatic StringMap<type, count> name##s(name##Entries, sizeof(name##Entries)); \\\nbool classname::getConstant(const char *in, type &out) { return name##s.find(in, out); } \\\nbool classname::getConstant(type in, const char *&out) { return name##s.find(in, out); } \\\nstd::vector<std::string> classname::getConstants(type) { return name##s.getNames(); }\n\n} // love\n\n#endif // LOVE_STRING_MAP_H\n"
  },
  {
    "path": "src/common/Variant.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include <memory>\n\n#include \"Variant.h\"\n#include \"common/StringMap.h\"\n\nnamespace love\n{\n\nVariant::Variant(Type vtype)\n\t: type(vtype)\n{}\n\nVariant::Variant()\n\t: type(NIL)\n{}\n\nVariant::Variant(bool boolean)\n\t: type(BOOLEAN)\n{\n\tdata.boolean = boolean;\n}\n\nVariant::Variant(double number)\n\t: type(NUMBER)\n{\n\tdata.number = number;\n}\n\nVariant::Variant(const char *str, size_t len)\n{\n\tif (len <= MAX_SMALL_STRING_LENGTH)\n\t{\n\t\ttype = SMALLSTRING;\n\t\tmemcpy(data.smallstring.str, str, len);\n\t\tdata.smallstring.len = (uint8) len;\n\t}\n\telse\n\t{\n\t\ttype = STRING;\n\t\tdata.string = new SharedString(str, len);\n\t}\n}\n\nVariant::Variant(const std::string &str)\n\t: Variant(str.c_str(), str.length())\n{\n}\n\nVariant::Variant(void *lightuserdata)\n\t: type(LUSERDATA)\n{\n\tdata.userdata = lightuserdata;\n}\n\nVariant::Variant(love::Type *lovetype, love::Object *object)\n\t: type(LOVEOBJECT)\n{\n\tdata.objectproxy.type = lovetype;\n\tdata.objectproxy.object = object;\n\n\tif (data.objectproxy.object != nullptr)\n\t\tdata.objectproxy.object->retain();\n}\n\n// Variant gets ownership of the vector.\nVariant::Variant(SharedTable *table)\n\t: type(TABLE)\n{\n\tdata.table = table;\n}\n\nVariant::Variant(const Variant &v)\n\t: type(v.type)\n\t, data(v.data)\n{\n\tif (type == STRING)\n\t\tdata.string->retain();\n\telse if (type == LOVEOBJECT && data.objectproxy.object != nullptr)\n\t\tdata.objectproxy.object->retain();\n\telse if (type == TABLE)\n\t\tdata.table->retain();\n}\n\nVariant::Variant(Variant &&v)\n\t: type(std::move(v.type))\n\t, data(std::move(v.data))\n{\n\tv.type = NIL;\n}\n\nVariant::~Variant()\n{\n\tif (type == STRING)\n\t\tdata.string->release();\n\telse if (type == LOVEOBJECT && data.objectproxy.object != nullptr)\n\t\tdata.objectproxy.object->release();\n\telse if (type == TABLE)\n\t\tdata.table->release();\n}\n\nVariant &Variant::operator = (const Variant &v)\n{\n\tif (v.type == STRING)\n\t\tv.data.string->retain();\n\telse if (v.type == LOVEOBJECT && v.data.objectproxy.object != nullptr)\n\t\tv.data.objectproxy.object->retain();\n\telse if (v.type == TABLE)\n\t\tv.data.table->retain();\n\n\tif (type == STRING)\n\t\tdata.string->release();\n\telse if (type == LOVEOBJECT && data.objectproxy.object != nullptr)\n\t\tdata.objectproxy.object->release();\n\telse if (type == TABLE)\n\t\tdata.table->release();\n\n\ttype = v.type;\n\tdata = v.data;\n\n\treturn *this;\n}\n\n} // love\n"
  },
  {
    "path": "src/common/Variant.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_VARIANT_H\n#define LOVE_VARIANT_H\n\n#include \"common/config.h\"\n#include \"common/Object.h\"\n#include \"common/int.h\"\n\n#include <cstring>\n#include <string>\n#include <vector>\n\nnamespace love\n{\n\nclass LOVE_EXPORT Variant\n{\npublic:\n\n\tstatic const int MAX_SMALL_STRING_LENGTH = 15;\n\n\tenum Type\n\t{\n\t\tUNKNOWN = 0,\n\t\tBOOLEAN,\n\t\tNUMBER,\n\t\tSTRING,\n\t\tSMALLSTRING,\n\t\tLUSERDATA,\n\t\tLOVEOBJECT,\n\t\tNIL,\n\t\tTABLE\n\t};\n\n\tclass SharedString : public love::Object\n\t{\n\tpublic:\n\n\t\tSharedString(const char *string, size_t len)\n\t\t\t: len(len)\n\t\t{\n\t\t\tstr = new char[len+1];\n\t\t\tstr[len] = '\\0';\n\t\t\tmemcpy(str, string, len);\n\t\t}\n\t\tvirtual ~SharedString() { delete[] str; }\n\n\t\tchar *str;\n\t\tsize_t len;\n\t};\n\n\tclass SharedTable : public love::Object\n\t{\n\tpublic:\n\n\t\tSharedTable() {}\n\t\tvirtual ~SharedTable() {}\n\n\t\tstd::vector<std::pair<Variant, Variant>> pairs;\n\t};\n\n\tunion Data\n\t{\n\t\tbool boolean;\n\t\tdouble number;\n\t\tSharedString *string;\n\t\tvoid *userdata;\n\t\tProxy objectproxy;\n\t\tSharedTable *table;\n\t\tstruct\n\t\t{\n\t\t\tchar str[MAX_SMALL_STRING_LENGTH];\n\t\t\tuint8 len;\n\t\t} smallstring;\n\t};\n\n\tVariant();\n\tVariant(bool boolean);\n\tVariant(double number);\n\tVariant(const char *str, size_t len);\n\tVariant(const std::string &str);\n\tVariant(void *lightuserdata);\n\tVariant(love::Type *type, love::Object *object);\n\tVariant(SharedTable *table);\n\tVariant(const Variant &v);\n\tVariant(Variant &&v);\n\t~Variant();\n\n\tVariant &operator = (const Variant &v);\n\n\tType getType() const { return type; }\n\tconst Data &getData() const { return data; }\n\n\tstatic Variant unknown() { return Variant(UNKNOWN); }\n\nprivate:\n\n\tVariant(Type vtype);\n\n\tType type;\n\tData data;\n\n}; // Variant\n} // love\n\n#endif // LOVE_VARIANT_H\n"
  },
  {
    "path": "src/common/Vector.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Vector.h\"\n\nnamespace love\n{\n// Implementation in header.\n}\n"
  },
  {
    "path": "src/common/Vector.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_VECTOR_H\n#define LOVE_VECTOR_H\n\n// STD\n#include <cmath>\n\nnamespace love\n{\n\n// All math operators are component-wise.\nstruct Vector2\n{\n\tfloat x, y;\n\n\tVector2()\n\t\t: x(0.0f), y(0.0f)\n\t{}\n\n\tVector2(float x, float y)\n\t\t: x(x), y(y)\n\t{}\n\n\tVector2(const Vector2 &v)\n\t\t: x(v.x), y(v.y)\n\t{}\n\n\tfloat getLength() const;\n\tfloat getLengthSquare() const;\n\n\t/**\n\t * Normalizes the Vector.\n\t * @param length Desired length of the vector.\n\t **/\n\tvoid normalize(float length = 1.0f);\n\n\t/**\n\t * Gets a vector perpendicular to the Vector.\n\t * To get the true (normalized) normal, use v.getNormal(1.0f / v.getLength())\n\t **/\n\tVector2 getNormal() const;\n\n\t/**\n\t * Gets a vector perpendicular to the Vector.\n\t * To get the true (normalized) normal, use v.getNormal(1.0f / v.getLength())\n\t **/\n\tVector2 getNormal(float scale) const;\n\n\tstatic inline float dot(const Vector2 &a, const Vector2 &b);\n\tstatic inline float cross(const Vector2 &a, const Vector2 &b);\n\n\tVector2 operator + (const Vector2 &v) const;\n\tVector2 operator - (const Vector2 &v) const;\n\n\tVector2 operator * (float s) const;\n\tVector2 operator / (float s) const;\n\n\tVector2 operator - () const;\n\n\tvoid operator += (const Vector2 &v);\n\tvoid operator -= (const Vector2 &v);\n\n\tvoid operator *= (float s);\n\tvoid operator /= (float s);\n\n\tbool operator == (const Vector2 &v) const;\n\tbool operator != (const Vector2 &v) const;\n\n}; // Vector2\n\n\n// All math operators are component-wise.\nstruct Vector3\n{\n\tfloat x, y, z;\n\n\tVector3()\n\t\t: x(0.0f), y(0.0f), z(0.0f)\n\t{}\n\n\tVector3(float x, float y, float z)\n\t\t: x(x), y(y), z(z)\n\t{}\n\n\tVector3(const Vector2 &v, float z = 0.0f)\n\t\t: x(v.x), y(v.y), z(z)\n\t{}\n\n\tfloat getLength() const;\n\tfloat getLengthSquare() const;\n\n\t/**\n\t * Normalizes the Vector.\n\t * @param length Desired length of the vector.\n\t **/\n\tvoid normalize(float length = 1.0);\n\n\tstatic inline float dot(const Vector3 &a, const Vector3 &b);\n\tstatic inline Vector3 cross(const Vector3 &a, const Vector3 &b);\n\n\tVector3 operator + (const Vector3 &v) const;\n\tVector3 operator - (const Vector3 &v) const;\n\n\tVector3 operator * (float s) const;\n\tVector3 operator / (float s) const;\n\n\tVector3 operator - () const;\n\n\tvoid operator += (const Vector3 &v);\n\tvoid operator -= (const Vector3 &v);\n\n\tvoid operator *= (float s);\n\tvoid operator /= (float s);\n\n\tbool operator == (const Vector3 &v) const;\n\tbool operator != (const Vector3 &v) const;\n\n}; // Vector3\n\n\n// All math operators are component-wise.\nstruct Vector4\n{\n\tfloat x, y, z, w;\n\n\tVector4()\n\t\t: x(0.0f), y(0.0f), z(0.0f), w(0.0f)\n\t{}\n\n\tVector4(float x, float y, float z, float w)\n\t\t: x(x), y(y), z(z), w(w)\n\t{}\n\n\tVector4(const Vector2 &v, float z = 0.0f, float w = 0.0f)\n\t\t: x(v.x), y(v.y), z(z), w(w)\n\t{}\n\n\tVector4(const Vector3 &v, float w = 0.0f)\n\t\t: x(v.x), y(v.y), z(v.z), w(w)\n\t{}\n\n\tfloat getLength() const;\n\tfloat getLengthSquare() const;\n\n\t/**\n\t * Normalizes the Vector.\n\t * @param length Desired length of the vector.\n\t **/\n\tvoid normalize(float length = 1.0);\n\n\tstatic inline float dot(const Vector4 &a, const Vector4 &b);\n\n\tVector4 operator + (const Vector4 &v) const;\n\tVector4 operator - (const Vector4 &v) const;\n\n\tVector4 operator * (float s) const;\n\tVector4 operator / (float s) const;\n\n\tVector4 operator - () const;\n\n\tvoid operator += (const Vector4 &v);\n\tvoid operator -= (const Vector4 &v);\n\n\tvoid operator *= (float s);\n\tvoid operator /= (float s);\n\n\tbool operator == (const Vector4 &v) const;\n\tbool operator != (const Vector4 &v) const;\n\n}; // Vector4\n\n\ninline float Vector2::getLength() const\n{\n\treturn sqrtf(x*x + y*y);\n}\n\ninline float Vector2::getLengthSquare() const\n{\n\treturn x*x + y*y;\n}\n\ninline Vector2 Vector2::getNormal() const\n{\n\treturn Vector2(-y, x);\n}\n\ninline Vector2 Vector2::getNormal(float scale) const\n{\n\treturn Vector2(-y * scale, x * scale);\n}\n\ninline float Vector2::dot(const Vector2 &a, const Vector2 &b)\n{\n\treturn a.x * b.x + a.y * b.y;\n}\n\ninline float Vector2::cross(const Vector2 &a, const Vector2 &b)\n{\n\treturn a.x * b.y - a.y * b.x;\n}\n\ninline void Vector2::normalize(float length)\n{\n\tfloat length_current = getLength();\n\tif (length_current > 0)\n\t{\n\t\tfloat m = length / length_current;\n\t\tx *= m;\n\t\ty *= m;\n\t}\n}\n\ninline Vector2 Vector2::operator + (const Vector2 &v) const\n{\n\treturn Vector2(x + v.x, y + v.y);\n}\n\ninline Vector2 Vector2::operator - (const Vector2 &v) const\n{\n\treturn Vector2(x - v.x, y - v.y);\n}\n\ninline Vector2 Vector2::operator * (float s) const\n{\n\treturn Vector2(x*s, y*s);\n}\n\ninline Vector2 Vector2::operator / (float s) const\n{\n\tfloat invs = 1.0f / s;\n\treturn Vector2(x*invs, y*invs);\n}\n\ninline Vector2 Vector2::operator - () const\n{\n\treturn Vector2(-x, -y);\n}\n\ninline void Vector2::operator += (const Vector2 &v)\n{\n\tx += v.x;\n\ty += v.y;\n}\n\ninline void Vector2::operator -= (const Vector2 &v)\n{\n\tx -= v.x;\n\ty -= v.y;\n}\n\ninline void Vector2::operator *= (float s)\n{\n\tx *= s;\n\ty *= s;\n}\n\ninline void Vector2::operator /= (float s)\n{\n\tfloat invs = 1.0f / s;\n\tx *= invs;\n\ty *= invs;\n}\n\ninline bool Vector2::operator == (const Vector2 &v) const\n{\n\treturn x == v.x && y == v.y;\n}\n\ninline bool Vector2::operator != (const Vector2 &v) const\n{\n\treturn x != v.x || y != v.y;\n}\n\n\ninline float Vector3::getLength() const\n{\n\treturn sqrtf(x*x + y*y + z*z);\n}\n\ninline float Vector3::getLengthSquare() const\n{\n\treturn x*x + y*y + z*z;\n}\n\ninline float Vector3::dot(const Vector3 &a, const Vector3 &b)\n{\n\treturn a.x * b.x + a.y * b.y + a.z * b.z;\n}\n\ninline Vector3 Vector3::cross(const Vector3 &a, const Vector3 &b)\n{\n\treturn Vector3(a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x);\n}\n\ninline void Vector3::normalize(float length)\n{\n\tfloat length_current = getLength();\n\tif (length_current > 0)\n\t{\n\t\tfloat m = length / length_current;\n\t\tx *= m;\n\t\ty *= m;\n\t\tz *= m;\n\t}\n}\n\ninline Vector3 Vector3::operator + (const Vector3 &v) const\n{\n\treturn Vector3(x + v.x, y + v.y, z + v.z);\n}\n\ninline Vector3 Vector3::operator - (const Vector3 &v) const\n{\n\treturn Vector3(x - v.x, y - v.y, z - v.z);\n}\n\ninline Vector3 Vector3::operator * (float s) const\n{\n\treturn Vector3(x*s, y*s, z*s);\n}\n\ninline Vector3 Vector3::operator / (float s) const\n{\n\tfloat invs = 1.0f / s;\n\treturn Vector3(x*invs, y*invs, z*invs);\n}\n\ninline Vector3 Vector3::operator - () const\n{\n\treturn Vector3(-x, -y, -z);\n}\n\ninline void Vector3::operator += (const Vector3 &v)\n{\n\tx += v.x;\n\ty += v.y;\n\tz += v.z;\n}\n\ninline void Vector3::operator -= (const Vector3 &v)\n{\n\tx -= v.x;\n\ty -= v.y;\n\tz -= v.z;\n}\n\ninline void Vector3::operator *= (float s)\n{\n\tx *= s;\n\ty *= s;\n\tz *= s;\n}\n\ninline void Vector3::operator /= (float s)\n{\n\tfloat invs = 1.0f / s;\n\tx *= invs;\n\ty *= invs;\n\tz *= invs;\n}\n\ninline bool Vector3::operator == (const Vector3 &v) const\n{\n\treturn x == v.x && y == v.y && z == v.z;\n}\n\ninline bool Vector3::operator != (const Vector3 &v) const\n{\n\treturn x != v.x || y != v.y || z != v.z;\n}\n\n\ninline float Vector4::getLength() const\n{\n\treturn sqrtf(x*x + y*y + z*z + w*w);\n}\n\ninline float Vector4::getLengthSquare() const\n{\n\treturn x*x + y*y + z*z + w*w;\n}\n\ninline float Vector4::dot(const Vector4 &a, const Vector4 &b)\n{\n\treturn a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;\n}\n\ninline void Vector4::normalize(float length)\n{\n\tfloat length_current = getLength();\n\tif (length_current > 0)\n\t{\n\t\tfloat m = length / length_current;\n\t\tx *= m;\n\t\ty *= m;\n\t\tz *= m;\n\t\tw *= m;\n\t}\n}\n\ninline Vector4 Vector4::operator + (const Vector4 &v) const\n{\n\treturn Vector4(x + v.x, y + v.y, z + v.z, w + v.w);\n}\n\ninline Vector4 Vector4::operator - (const Vector4 &v) const\n{\n\treturn Vector4(x - v.x, y - v.y, z - v.z, w - v.w);\n}\n\ninline Vector4 Vector4::operator * (float s) const\n{\n\treturn Vector4(x*s, y*s, z*s, w*s);\n}\n\ninline Vector4 Vector4::operator / (float s) const\n{\n\tfloat invs = 1.0f / s;\n\treturn Vector4(x*invs, y*invs, z*invs, w*invs);\n}\n\ninline Vector4 Vector4::operator - () const\n{\n\treturn Vector4(-x, -y, -z, -w);\n}\n\ninline void Vector4::operator += (const Vector4 &v)\n{\n\tx += v.x;\n\ty += v.y;\n\tz += v.z;\n\tw += v.w;\n}\n\ninline void Vector4::operator -= (const Vector4 &v)\n{\n\tx -= v.x;\n\ty -= v.y;\n\tz -= v.z;\n\tw -= v.w;\n}\n\ninline void Vector4::operator *= (float s)\n{\n\tx *= s;\n\ty *= s;\n\tz *= s;\n\tw *= s;\n}\n\ninline void Vector4::operator /= (float s)\n{\n\tfloat invs = 1.0f / s;\n\tx *= invs;\n\ty *= invs;\n\tz *= invs;\n\tw *= invs;\n}\n\ninline bool Vector4::operator == (const Vector4 &v) const\n{\n\treturn x == v.x && y == v.y && z == v.z && w == v.w;\n}\n\ninline bool Vector4::operator != (const Vector4 &v) const\n{\n\treturn x != v.x || y != v.y || z != v.z || w != v.w;\n}\n\n} //love\n\n#endif// LOVE_VECTOR_H\n"
  },
  {
    "path": "src/common/android.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"android.h\"\n#include \"Object.h\"\n\n#ifdef LOVE_ANDROID\n\n#include <cerrno>\n#include <set>\n#include <unordered_map>\n\n#include <SDL3/SDL.h>\n\n#include <jni.h>\n#include <android/asset_manager.h>\n#include <android/asset_manager_jni.h>\n\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <unistd.h>\n\n#include \"libraries/physfs/physfs.h\"\n#include \"filesystem/physfs/PhysfsIo.h\"\n\nnamespace love\n{\nnamespace android\n{\n\nvoid setImmersive(bool immersive_active)\n{\n\tJNIEnv *env = (JNIEnv*) SDL_GetAndroidJNIEnv();\n\tjobject activity = (jobject) SDL_GetAndroidActivity();\n\tjclass clazz = env->GetObjectClass(activity);\n\n\tstatic jmethodID setImmersiveMethod = env->GetMethodID(clazz, \"setImmersiveMode\", \"(Z)V\");\n\tenv->CallVoidMethod(activity, setImmersiveMethod, immersive_active);\n\n\tenv->DeleteLocalRef(activity);\n\tenv->DeleteLocalRef(clazz);\n}\n\nbool getImmersive()\n{\n\tJNIEnv *env = (JNIEnv*) SDL_GetAndroidJNIEnv();\n\tjobject activity = (jobject) SDL_GetAndroidActivity();\n\tjclass clazz = env->GetObjectClass(activity);\n\n\tstatic jmethodID getImmersiveMethod = env->GetMethodID(clazz, \"getImmersiveMode\", \"()Z\");\n\tjboolean immersiveActive = env->CallBooleanMethod(activity, getImmersiveMethod);\n\n\tenv->DeleteLocalRef(activity);\n\tenv->DeleteLocalRef(clazz);\n\n\treturn immersiveActive;\n}\n\ndouble getScreenScale()\n{\n\tstatic double result = -1.;\n\n\tif (result == -1.)\n\t{\n\t\tJNIEnv *env = (JNIEnv*) SDL_GetAndroidJNIEnv();\n\t\tjobject activity = (jobject) SDL_GetAndroidActivity();\n\t\tjclass clazz = env->GetObjectClass(activity);\n\n\t\tjmethodID getDPIMethod = env->GetMethodID(clazz, \"getDPIScale\", \"()F\");\n\t\tresult = (double) env->CallFloatMethod(activity, getDPIMethod);\n\n\t\tenv->DeleteLocalRef(clazz);\n\t\tenv->DeleteLocalRef(activity);\n\t}\n\n\treturn result;\n}\n\nbool getSafeArea(int &top, int &left, int &bottom, int &right)\n{\n\tJNIEnv *env = (JNIEnv*) SDL_GetAndroidJNIEnv();\n\tjobject activity = (jobject) SDL_GetAndroidActivity();\n\tjclass clazz = env->GetObjectClass(activity);\n    jclass rectClass = env->FindClass(\"android/graphics/Rect\");\n    jmethodID methodID = env->GetMethodID(clazz, \"getSafeArea\", \"()Landroid/graphics/Rect;\");\n\tjobject safeArea = env->CallObjectMethod(activity, methodID);\n\n\tif (safeArea != nullptr)\n\t{\n\t\ttop = env->GetIntField(safeArea, env->GetFieldID(rectClass, \"top\", \"I\"));\n\t\tleft = env->GetIntField(safeArea, env->GetFieldID(rectClass, \"left\", \"I\"));\n\t\tbottom = env->GetIntField(safeArea, env->GetFieldID(rectClass, \"bottom\", \"I\"));\n\t\tright = env->GetIntField(safeArea, env->GetFieldID(rectClass, \"right\", \"I\"));\n        env->DeleteLocalRef(safeArea);\n\t}\n\n    env->DeleteLocalRef(rectClass);\n\tenv->DeleteLocalRef(clazz);\n\tenv->DeleteLocalRef(activity);\n\n\treturn safeArea != nullptr;\n}\n\nvoid vibrate(double seconds)\n{\n\tJNIEnv *env = (JNIEnv*) SDL_GetAndroidJNIEnv();\n\tjobject activity = (jobject) SDL_GetAndroidActivity();\n\tjclass clazz = env->GetObjectClass(activity);\n\n\tstatic jmethodID vibrateMethod = env->GetMethodID(clazz, \"vibrate\", \"(D)V\");\n\tenv->CallVoidMethod(activity, vibrateMethod, seconds);\n\n\tenv->DeleteLocalRef(clazz);\n\tenv->DeleteLocalRef(activity);\n}\n\n/*\n * Helper functions for the filesystem module\n */\nvoid freeGameArchiveMemory(void *ptr)\n{\n\tchar *game_love_data = static_cast<char*>(ptr);\n\tdelete[] game_love_data;\n}\n\nbool directoryExists(const char *path)\n{\n\tstruct stat s {};\n\tint err = stat(path, &s);\n\tif (err == -1)\n\t{\n\t\tif (errno != ENOENT)\n\t\t\tSDL_Log(\"Error checking for directory %s errno = %d: %s\", path, errno, strerror(errno));\n\t\treturn false;\n\t}\n\n\treturn S_ISDIR(s.st_mode);\n}\n\nbool mkdir(const char *path)\n{\n\tint err = ::mkdir(path, S_IRWXU | S_IRWXG | S_IRWXO | S_ISGID);\n\tif (err == -1)\n\t{\n\t\tconst char *error = strerror(errno);\n\t\tSDL_Log(\"Error: Could not create directory '%s': %s\", path, error);\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nbool chmod(const char *path, int mode)\n{\n\tint err = ::chmod(path, mode);\n\tif (err == -1)\n\t{\n\t\tconst char *error = strerror(errno);\n\t\tSDL_Log(\"Error: Could not change mode '%s': %s\", path, error);\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\ninline bool tryCreateDirectory(const char *path)\n{\n\tSDL_Log(\"Trying to create directory '%s'\", path);\n\n\tif (directoryExists(path))\n\t\treturn true;\n\telse if (mkdir(path))\n\t\treturn true;\n\treturn false;\n}\n\nbool createStorageDirectories()\n{\n\tstd::string internalStoragePath = SDL_GetAndroidInternalStoragePath();\n\tstd::string externalStoragePath = SDL_GetAndroidExternalStoragePath();\n\n\tstd::string saveDirectoryInternal = internalStoragePath + \"/save\";\n\tif (!tryCreateDirectory(saveDirectoryInternal.c_str()))\n\t\treturn false;\n\n\tstd::string saveDirectoryExternal = externalStoragePath + \"/save\";\n\tif (!tryCreateDirectory(saveDirectoryExternal.c_str()))\n\t\treturn false;\n\n\tstd::string game_directory = externalStoragePath + \"/game\";\n\tif (!tryCreateDirectory (game_directory.c_str()))\n\t\treturn false;\n\n\treturn true;\n}\n\nvoid fixupPermissionSingleFile(const std::string &savedir, const std::string &path, int mode)\n{\n    std::string fixedSavedir = savedir.back() == '/' ? savedir : (savedir + \"/\");\n    std::string target = fixedSavedir + path;\n    ::chmod(target.c_str(), mode);\n}\n\nvoid fixupExternalStoragePermission(const std::string &savedir, const std::string &path)\n{\n\tstd::set<std::string> pathsToFix;\n\tsize_t start = 0;\n\n\twhile (true)\n\t{\n\t\tsize_t pos = path.find('/', start);\n\t\tif (pos == std::string::npos)\n\t\t{\n\t\t\tpathsToFix.insert(path);\n\t\t\tbreak;\n\t\t}\n\n\t\tpathsToFix.insert(path.substr(0, pos));\n\t\tstart = pos + 1;\n\t}\n\n\tstd::string fixedSavedir = savedir.back() == '/' ? savedir : (savedir + \"/\");\n\tchmod(savedir.c_str(), S_IRWXU | S_IRWXG | S_IRWXO | S_ISGID);\n\n\tfor (const std::string &dir: pathsToFix)\n\t{\n        const char *realPath = PHYSFS_getRealDir(dir.c_str());\n\t\tif (!dir.empty() && strcmp(realPath, savedir.c_str()) == 0)\n\t\t{\n\t\t\tstd::string target = fixedSavedir + dir;\n\t\t\tchmod(target.c_str(), S_IRWXU | S_IRWXG | S_IRWXO | S_ISGID);\n\t\t}\n\t}\n}\n\nbool hasBackgroundMusic()\n{\n\tJNIEnv *env = (JNIEnv*) SDL_GetAndroidJNIEnv();\n\tjobject activity = (jobject) SDL_GetAndroidActivity();\n\n\tjclass clazz(env->GetObjectClass(activity));\n\tjmethodID method_id = env->GetMethodID(clazz, \"hasBackgroundMusic\", \"()Z\");\n\n\tjboolean result = env->CallBooleanMethod(activity, method_id);\n\n\tenv->DeleteLocalRef(activity);\n\tenv->DeleteLocalRef(clazz);\n\n\treturn result;\n}\n\nbool hasRecordingPermission()\n{\n\tJNIEnv *env = (JNIEnv*) SDL_GetAndroidJNIEnv();\n\tjobject activity = (jobject) SDL_GetAndroidActivity();\n\tjclass clazz = env->GetObjectClass(activity);\n\n\tstatic jmethodID methodID = env->GetMethodID(clazz, \"hasRecordAudioPermission\", \"()Z\");\n\tjboolean result = false;\n\n\tif (methodID == nullptr)\n\t\tenv->ExceptionClear();\n\telse\n\t\tresult = env->CallBooleanMethod(activity, methodID);\n\n\tenv->DeleteLocalRef(activity);\n\tenv->DeleteLocalRef(clazz);\n\n\treturn result;\n}\n\n\nvoid requestRecordingPermission()\n{\n\tJNIEnv *env = (JNIEnv*) SDL_GetAndroidJNIEnv();\n\tjobject activity = (jobject) SDL_GetAndroidActivity();\n\tjclass clazz(env->GetObjectClass(activity));\n\tjmethodID methodID = env->GetMethodID(clazz, \"requestRecordAudioPermission\", \"()V\");\n\n\tif (methodID == nullptr)\n\t\tenv->ExceptionClear();\n\telse\n\t\tenv->CallVoidMethod(activity, methodID);\n\n\tenv->DeleteLocalRef(clazz);\n\tenv->DeleteLocalRef(activity);\n}\n\nvoid showRecordingPermissionMissingDialog()\n{\n\tJNIEnv *env = (JNIEnv*) SDL_GetAndroidJNIEnv();\n\tjobject activity = (jobject) SDL_GetAndroidActivity();\n\tjclass clazz(env->GetObjectClass(activity));\n\tjmethodID methodID = env->GetMethodID(clazz, \"showRecordingAudioPermissionMissingDialog\", \"()V\");\n\n\tif (methodID == nullptr)\n\t\tenv->ExceptionClear();\n\telse\n\t\tenv->CallVoidMethod(activity, methodID);\n\n\tenv->DeleteLocalRef(clazz);\n\tenv->DeleteLocalRef(activity);\n}\n\n/* A container for AssetManager Java object */\nclass AssetManagerObject\n{\npublic:\n\tAssetManagerObject()\n\t{\n\t\tJNIEnv *env = (JNIEnv *) SDL_GetAndroidJNIEnv();\n\t\tjobject am = getLocalAssetManager(env);\n\n\t\tassetManager = env->NewGlobalRef(am);\n\t\tenv->DeleteLocalRef(am);\n\t}\n\n\t~AssetManagerObject()\n\t{\n\t\tJNIEnv *env = (JNIEnv *) SDL_GetAndroidJNIEnv();\n\t\tenv->DeleteGlobalRef(assetManager);\n\t}\n\n\tstatic jobject getLocalAssetManager(JNIEnv *env) {\n\t\tjobject self = (jobject) SDL_GetAndroidActivity();\n\t\tjclass activity = env->GetObjectClass(self);\n\t\tjmethodID method = env->GetMethodID(activity, \"getAssets\", \"()Landroid/content/res/AssetManager;\");\n\t\tjobject am = env->CallObjectMethod(self, method);\n\n\t\tenv->DeleteLocalRef(self);\n\t\tenv->DeleteLocalRef(activity);\n\t\treturn am;\n\t}\n\n\texplicit operator jobject()\n\t{\n\t\treturn assetManager;\n\t};\nprivate:\n\tjobject assetManager;\n};\n\n/*\n * Helper functions to aid new fusing method\n */\n\n// This returns *global* reference, no need to free it.\nstatic jobject getJavaAssetManager()\n{\n\tstatic AssetManagerObject assetManager;\n\treturn (jobject) assetManager;\n}\n\nstatic AAssetManager *getAssetManager()\n{\n\tJNIEnv *env = (JNIEnv*) SDL_GetAndroidJNIEnv();\n\treturn AAssetManager_fromJava(env, (jobject) getJavaAssetManager());\n}\n\nnamespace aasset\n{\n\nstruct AssetInfo: public love::filesystem::physfs::PhysfsIo<AssetInfo>\n{\n\tstatic const uint32_t version = 0;\n\n\tAAssetManager *assetManager;\n\tAAsset *asset;\n\tchar *filename;\n\tsize_t size;\n\n\tstatic AssetInfo *fromAAsset(AAssetManager *assetManager, const char *filename, AAsset *asset)\n\t{\n\t\treturn new AssetInfo(assetManager, filename, asset);\n\t}\n\n\tint64_t read(void* buf, uint64_t len) const\n\t{\n\t\tint readed = AAsset_read(asset, buf, (size_t) len);\n\n\t\tPHYSFS_setErrorCode(readed < 0 ? PHYSFS_ERR_OS_ERROR : PHYSFS_ERR_OK);\n\t\treturn (PHYSFS_sint64) readed;\n\t}\n\n\tint64_t write(const void* buf, uint64_t len) const\n\t{\n\t\tLOVE_UNUSED(buf);\n\t\tLOVE_UNUSED(len);\n\n\t\tPHYSFS_setErrorCode(PHYSFS_ERR_READ_ONLY);\n\t\treturn -1;\n\t}\n\n\tint64_t seek(uint64_t offset) const\n\t{\n\t\tint64_t success = AAsset_seek64(asset, (off64_t) offset, SEEK_SET) != -1;\n\n\t\tPHYSFS_setErrorCode(success ? PHYSFS_ERR_OK : PHYSFS_ERR_OS_ERROR);\n\t\treturn success;\n\t}\n\n\tint64_t tell() const\n\t{\n\t\toff64_t len = AAsset_getLength64(asset);\n\t\toff64_t remain = AAsset_getRemainingLength64(asset);\n\n\t\treturn len - remain;\n\t}\n\n\tint64_t length() const\n\t{\n\t\treturn AAsset_getLength64(asset);\n\t}\n\n\tint flush() const\n\t{\n\t\t// Do nothing\n\t\tPHYSFS_setErrorCode(PHYSFS_ERR_OK);\n\t\treturn 1;\n\t}\n\n\tAssetInfo(const AssetInfo &other)\n\t: assetManager(other.assetManager)\n\t, size(strlen(other.filename) + 1)\n\t{\n\t\tasset = AAssetManager_open(assetManager, other.filename, AASSET_MODE_RANDOM);\n\n\t\tif (asset == nullptr)\n\t\t{\n\t\t\tPHYSFS_setErrorCode(PHYSFS_ERR_OS_ERROR);\n\t\t\tthrow love::Exception(\"Unable to duplicate AssetInfo\");\n\t\t}\n\n\t\tfilename = new (std::nothrow) char[size];\n\t\tmemcpy(filename, other.filename, size);\n\t}\n\n\t~AssetInfo() override\n\t{\n\t\tAAsset_close(asset);\n\t\tdelete[] filename;\n\t}\n\nprivate:\n\tAssetInfo(AAssetManager *assetManager, const char *filename, AAsset *asset)\n\t: assetManager(assetManager)\n\t, asset(asset)\n\t, size(strlen(filename) + 1)\n\t{\n\t\tthis->filename = new (std::nothrow) char[size];\n\t\tmemcpy(this->filename, filename, size);\n\t}\n};\n\nstatic std::unordered_map<std::string, PHYSFS_FileType> fileTree;\n\nvoid *openArchive(PHYSFS_Io *io, const char *name, int forWrite, int *claimed)\n{\n\tif (forWrite || io->opaque == nullptr || memcmp(io->opaque, \"ASET\", 4) != 0)\n\t\treturn nullptr;\n\n\t// It's our archive\n\t*claimed = 1;\n\tAAssetManager *assetManager = getAssetManager();\n\n\tif (fileTree.empty())\n\t{\n\t\t// AAssetDir_getNextFileName intentionally excludes directories, so\n\t\t// we have to use JNI that calls AssetManager.list() recursively.\n\t\tJNIEnv *env = (JNIEnv *) SDL_GetAndroidJNIEnv();\n\t\tjobject activity = (jobject) SDL_GetAndroidActivity();\n\t\tjclass clazz = env->GetObjectClass(activity);\n\n\t\tjmethodID method = env->GetMethodID(clazz, \"buildFileTree\", \"()[Ljava/lang/String;\");\n\t\tjobjectArray list = (jobjectArray) env->CallObjectMethod(activity, method);\n\n\t\tfor (jsize i = 0; i < env->GetArrayLength(list); i++)\n\t\t{\n\t\t\tjstring jstr = (jstring) env->GetObjectArrayElement(list, i);\n\t\t\tconst char *str = env->GetStringUTFChars(jstr, nullptr);\n\n\t\t\tfileTree[str + 1] = str[0] == 'd' ? PHYSFS_FILETYPE_DIRECTORY : PHYSFS_FILETYPE_REGULAR;\n\n\t\t\tenv->ReleaseStringUTFChars(jstr, str);\n\t\t\tenv->DeleteLocalRef(jstr);\n\t\t}\n\n\t\tenv->DeleteLocalRef(list);\n\t\tenv->DeleteLocalRef(clazz);\n\t\tenv->DeleteLocalRef(activity);\n\t}\n\n\treturn assetManager;\n}\n\nPHYSFS_EnumerateCallbackResult enumerate(\n\tvoid *opaque,\n\tconst char *dirname,\n\tPHYSFS_EnumerateCallback cb,\n\tconst char *origdir,\n\tvoid *callbackdata\n)\n{\n\tusing FileTreeIterator = std::unordered_map<std::string, PHYSFS_FileType>::iterator;\n\tLOVE_UNUSED(opaque);\n\n\tconst char *path = dirname;\n\tif (path == nullptr || (path[0] == '/' && path[1] == 0))\n\t\tpath = \"\";\n\n\tif (path[0] != 0)\n\t{\n\t\tFileTreeIterator result = fileTree.find(path);\n\n\t\tif (result == fileTree.end() || result->second != PHYSFS_FILETYPE_DIRECTORY)\n\t\t{\n\t\t\tPHYSFS_setErrorCode(PHYSFS_ERR_NOT_FOUND);\n\t\t\treturn PHYSFS_ENUM_ERROR;\n\t\t}\n\t}\n\n\tJNIEnv *env = (JNIEnv *) SDL_GetAndroidJNIEnv();\n\tjobject assetManager = getJavaAssetManager();\n\tjclass clazz = env->GetObjectClass(assetManager);\n\tjmethodID method = env->GetMethodID(clazz, \"list\", \"(Ljava/lang/String;)[Ljava/lang/String;\");\n\n\tjstring jstringDir = env->NewStringUTF(path);\n\tjobjectArray dir = (jobjectArray) env->CallObjectMethod(assetManager, method, jstringDir);\n\n\tPHYSFS_EnumerateCallbackResult ret = PHYSFS_ENUM_OK;\n\n\tif (env->ExceptionCheck())\n\t{\n\t\t// IOException occured\n\t\tret = PHYSFS_ENUM_ERROR;\n\t\tenv->ExceptionClear();\n\t}\n\telse\n\t{\n\t\tjsize i = 0;\n\t\tjsize len = env->GetArrayLength(dir);\n\n\t\twhile (ret == PHYSFS_ENUM_OK && i < len) {\n\t\t\tjstring jstr = (jstring) env->GetObjectArrayElement(dir, i++);\n\t\t\tconst char *name = env->GetStringUTFChars(jstr, nullptr);\n\n\t\t\tret = cb(callbackdata, origdir, name);\n\n\t\t\tenv->ReleaseStringUTFChars(jstr, name);\n\t\t\tenv->DeleteLocalRef(jstr);\n\t\t}\n\n\t\tenv->DeleteLocalRef(dir);\n\t}\n\n\tenv->DeleteLocalRef(jstringDir);\n\tenv->DeleteLocalRef(clazz);\n\treturn ret;\n}\n\nPHYSFS_Io *openRead(void *opaque, const char *name)\n{\n\tAAssetManager *assetManager = (AAssetManager *) opaque;\n\tAAsset *file = AAssetManager_open(assetManager, name, AASSET_MODE_UNKNOWN);\n\n\tif (file == nullptr)\n\t{\n\t\tPHYSFS_setErrorCode(PHYSFS_ERR_NOT_FOUND);\n\t\treturn nullptr;\n\t}\n\n\tPHYSFS_setErrorCode(PHYSFS_ERR_OK);\n\treturn AssetInfo::fromAAsset(assetManager, name, file);\n}\n\nPHYSFS_Io *openWriteAppend(void *opaque, const char *name)\n{\n\tLOVE_UNUSED(opaque);\n\tLOVE_UNUSED(name);\n\n\t// AAsset doesn't support modification\n\tPHYSFS_setErrorCode(PHYSFS_ERR_READ_ONLY);\n\treturn nullptr;\n}\n\nint removeMkdir(void *opaque, const char *name)\n{\n\tLOVE_UNUSED(opaque);\n\tLOVE_UNUSED(name);\n\n\t// AAsset doesn't support modification\n\tPHYSFS_setErrorCode(PHYSFS_ERR_READ_ONLY);\n\treturn 0;\n}\n\nint stat(void *opaque, const char *name, PHYSFS_Stat *out)\n{\n\tusing FileTreeIterator = std::unordered_map<std::string, PHYSFS_FileType>::iterator;\n\tLOVE_UNUSED(opaque);\n\n\tFileTreeIterator result = fileTree.find(name);\n\n\tif (result != fileTree.end())\n\t{\n\t\tout->filetype = result->second;\n\t\tout->modtime = -1;\n\t\tout->createtime = -1;\n\t\tout->accesstime = -1;\n\t\tout->readonly = 1;\n\n\t\tPHYSFS_setErrorCode(PHYSFS_ERR_OK);\n\t\treturn 1;\n\t}\n\n\tPHYSFS_setErrorCode(PHYSFS_ERR_NOT_FOUND);\n\treturn 0;\n}\n\nvoid closeArchive(void *opaque)\n{\n\t// Do nothing\n\tLOVE_UNUSED(opaque);\n\tPHYSFS_setErrorCode(PHYSFS_ERR_OK);\n}\n\nstatic PHYSFS_Archiver g_AAssetArchiver = {\n\t0,\n\t{\n\t\t\"AASSET\",\n\t\t\"Android AAsset Wrapper\",\n\t\t\"LOVE Development Team\",\n\t\t\"https://developer.android.com/ndk/reference/group/asset\",\n\t\t0\n\t},\n\topenArchive,\n\tenumerate,\n\topenRead,\n\topenWriteAppend,\n\topenWriteAppend,\n\tremoveMkdir,\n\tremoveMkdir,\n\tstat,\n\tcloseArchive\n};\n\nstatic PHYSFS_sint64 dummyReturn0(PHYSFS_Io *io)\n{\n\tLOVE_UNUSED(io);\n\tPHYSFS_setErrorCode(PHYSFS_ERR_OK);\n\treturn 0;\n}\n\nstatic PHYSFS_Io *getDummyIO(PHYSFS_Io *io);\n\nstatic char dummyOpaque[] = \"ASET\";\nstatic PHYSFS_Io dummyIo = {\n\t0,\n\tdummyOpaque,\n\tnullptr,\n\tnullptr,\n\t[](PHYSFS_Io *io, PHYSFS_uint64 offset) -> int\n\t{\n\t\tPHYSFS_setErrorCode(offset == 0 ? PHYSFS_ERR_OK : PHYSFS_ERR_PAST_EOF);\n\t\treturn offset == 0;\n\t},\n\tdummyReturn0,\n\tdummyReturn0,\n\tgetDummyIO,\n\tnullptr,\n\t[](PHYSFS_Io *io) { LOVE_UNUSED(io); }\n};\n\nstatic PHYSFS_Io *getDummyIO(PHYSFS_Io *io)\n{\n\treturn &dummyIo;\n}\n\n} // aasset\n\nstruct SDLIO: public love::filesystem::physfs::PhysfsIo<SDLIO>\n{\n\tstatic const uint32_t version = 0;\n\n\tSDLIO(const std::string &filename)\n\t: filename(filename)\n\t, io(nullptr)\n\t{\n\t\tio = SDL_IOFromFile(filename.c_str(), \"rb\");\n\t\tif (!io)\n\t\t\tthrow love::Exception(\"Cannot open %s: %s\", filename.c_str(), SDL_GetError());\n\t}\n\n\tSDLIO(const SDLIO &other)\n\t: filename(other.filename)\n\t, io(nullptr)\n\t{\n\t\tio = SDL_IOFromFile(filename.c_str(), \"rb\");\n\t\tif (!io)\n\t\t\tthrow love::Exception(\"Cannot open %s: %s\", filename.c_str(), SDL_GetError());\n\t}\n\n\tint64_t read(void* buf, uint64_t len) const\n\t{\n\t\tsize_t readed = SDL_ReadIO(io, buf, (size_t) len);\n\t\treturn (int64_t) readed;\n\t}\n\n\tint64_t write(const void* buf, uint64_t len) const\n\t{\n\t\tsize_t written = SDL_WriteIO(io, buf, (size_t) len);\n\t\treturn (int64_t) written;\n\t}\n\n\tint seek(uint64_t offset) const\n\t{\n\t\tint64_t newpos = SDL_SeekIO(io, (Sint64) offset, SDL_IO_SEEK_SET);\n\n\t\tPHYSFS_setErrorCode(newpos >= 0 ? PHYSFS_ERR_OK : PHYSFS_ERR_OS_ERROR);\n\t\treturn newpos >= 0;\n\t}\n\n\tint64_t tell() const\n\t{\n\t\tint64_t pos = SDL_TellIO(io);\n\t\tPHYSFS_setErrorCode(pos >= 0 ? PHYSFS_ERR_OK : PHYSFS_ERR_OS_ERROR);\n\t\treturn pos;\n\t}\n\n\tint64_t length() const\n\t{\n\t\tint64_t size = SDL_GetIOSize(io);\n\t\tPHYSFS_setErrorCode(size >= 0 ? PHYSFS_ERR_OK : PHYSFS_ERR_OS_ERROR);\n\t\treturn size;\n\t}\n\n\tint flush() const\n\t{\n\t\tbool success = SDL_FlushIO(io);\n\t\tPHYSFS_setErrorCode(success ? PHYSFS_ERR_OK : PHYSFS_ERR_OS_ERROR);\n\t\treturn success;\n\t}\n\n\t~SDLIO() override\n\t{\n\t\tSDL_CloseIO(io);\n\t}\n\nprivate:\n\tstd::string filename;\n\tSDL_IOStream *io;\n};\n\nstatic bool isVirtualArchiveInitialized = false;\n\nbool initializeVirtualArchive()\n{\n\tif (isVirtualArchiveInitialized)\n\t\treturn true;\n\n\tif (!PHYSFS_registerArchiver(&aasset::g_AAssetArchiver))\n\t\treturn false;\n\tif (!PHYSFS_mountIo(&aasset::dummyIo, \"ASET.AASSET\", nullptr, 0))\n\t{\n\t\tPHYSFS_deregisterArchiver(aasset::g_AAssetArchiver.info.extension);\n\t\treturn false;\n\t}\n\n\tisVirtualArchiveInitialized = true;\n\treturn true;\n}\n\nvoid deinitializeVirtualArchive()\n{\n\tif (isVirtualArchiveInitialized)\n\t{\n\t\tPHYSFS_deregisterArchiver(aasset::g_AAssetArchiver.info.extension);\n\t\tisVirtualArchiveInitialized = false;\n\t}\n}\n\nbool checkFusedGame(void **physfsIO_Out)\n{\n\tPHYSFS_Io *&io = *(PHYSFS_Io **) physfsIO_Out;\n\tAAssetManager *assetManager = getAssetManager();\n\n\t// Prefer main.lua inside assets/ folder\n\tAAsset *asset = AAssetManager_open(assetManager, \"main.lua\", AASSET_MODE_STREAMING);\n\tif (asset)\n\t{\n\t\tAAsset_close(asset);\n\t\tio = nullptr;\n\t\treturn true;\n\t}\n\n\t// If there's no main.lua inside assets/ try game.love\n\tasset = AAssetManager_open(assetManager, \"game.love\", AASSET_MODE_RANDOM);\n\tif (asset)\n\t{\n\t\tio = aasset::AssetInfo::fromAAsset(assetManager, \"game.love\", asset);\n\t\treturn true;\n\t}\n\n\t// Not found\n\treturn false;\n}\n\nconst char *getCRequirePath()\n{\n\tstatic bool initialized = false;\n\tstatic std::string path;\n\n\tif (!initialized)\n\t{\n\t\tJNIEnv *env = (JNIEnv*) SDL_GetAndroidJNIEnv();\n\t\tjobject activity = (jobject) SDL_GetAndroidActivity();\n\t\tjclass clazz = env->GetObjectClass(activity);\n\n\t\tstatic jmethodID getCRequireMethod = env->GetMethodID(clazz, \"getCRequirePath\", \"()Ljava/lang/String;\");\n\n\t\tjstring cpath = (jstring) env->CallObjectMethod(activity, getCRequireMethod);\n\t\tconst char *utf = env->GetStringUTFChars(cpath, nullptr);\n\t\tif (utf)\n\t\t{\n\t\t\tpath = utf;\n\t\t\tenv->ReleaseStringUTFChars(cpath, utf);\n\t\t}\n\n\t\tenv->DeleteLocalRef(cpath);\n\t\tenv->DeleteLocalRef(activity);\n\t\tenv->DeleteLocalRef(clazz);\n\t}\n\n\treturn path.c_str();\n}\n\nvoid *getIOFromContentProtocol(const char *uri)\n{\n\t// Note: The static_cast is necessary, otherwise the pointer is shifted.\n\treturn static_cast<PHYSFS_Io*>(new SDLIO(uri));\n}\n\nconst char *getArg0()\n{\n\tstatic PHYSFS_AndroidInit androidInit = {nullptr, nullptr};\n\tandroidInit.jnienv = SDL_GetAndroidJNIEnv();\n\tandroidInit.context = SDL_GetAndroidActivity();\n\treturn (const char *) &androidInit;\n}\n\n} // android\n} // love\n\n#endif // LOVE_ANDROID\n"
  },
  {
    "path": "src/common/android.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_ANDROID_H\n#define LOVE_ANDROID_H\n\n#include \"config.h\"\n\n#ifdef LOVE_ANDROID\n\n#include <string>\n\nnamespace love\n{\nnamespace android\n{\n\n/**\n * Enables or disables immersive mode where the navigation bar is hidden.\n **/\nvoid setImmersive(bool immersive_active);\nbool getImmersive();\n\n/**\n * Gets the scale factor of the window's screen, e.g. on Retina displays this\n * will return 2.0.\n **/\ndouble getScreenScale();\n\n/**\n * Gets the window safe area, e.g. phone with notch display.\n * Returns false if safe area is not set.\n **/\nbool getSafeArea(int &top, int &left, int &bottom, int &right);\n\nvoid vibrate(double seconds);\n\nbool directoryExists(const char *path);\n\nbool mkdir(const char *path);\n\nbool createStorageDirectories();\n\nvoid fixupPermissionSingleFile(const std::string &savedir, const std::string &path, int mode = 0666);\n\nvoid fixupExternalStoragePermission(const std::string &savedir, const std::string &path);\n\nbool hasBackgroundMusic();\n\nbool hasRecordingPermission();\n\nvoid requestRecordingPermission();\n\nvoid showRecordingPermissionMissingDialog();\n\n/**\n * Initialize Android AAsset virtual archive.\n * @return true if successful.\n */\nbool initializeVirtualArchive();\n\n/**\n * Deinitialize Android AAsset virtual archive.\n * @return true if successful.\n */\nvoid deinitializeVirtualArchive();\n\n/**\n * Retrieve the fused game inside the APK\n * @param physfsIO_Out Pointer to PHYSFS_Io* struct\n * @return true if there's game inside the APK. If physfsIO_Out is not null, then it contains\n * the game.love which needs to be mounted to root. false if it's not fused, in which case\n * physfsIO_Out is undefined.\n */\nbool checkFusedGame(void **physfsIO_Out);\n\nconst char *getCRequirePath();\n\n/**\n * Convert \"content://\" to PHYSFS_Io using SDL_IOStream.\n * @param path Path with content:// URI\n * @return PHYSFS_Io casted to void*.\n */\nvoid *getIOFromContentProtocol(const char *path);\n\n/**\n * Retrieve PHYSFS_AndroidInit structure.\n * @return Pointer to PHYSFS_AndroidInit structure, casted to pointer of char.\n */\nconst char *getArg0();\n\n} // android\n} // love\n\n#endif // LOVE_ANDROID\n#endif // LOVE_ANDROID_H\n"
  },
  {
    "path": "src/common/apple.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"config.h\"\n\n#if defined(LOVE_IOS) || defined(LOVE_MACOS)\n\n#include <string>\n\nnamespace love\n{\nnamespace apple\n{\n\nenum UserDirectory\n{\n\tUSER_DIRECTORY_HOME,\n\tUSER_DIRECTORY_APPSUPPORT,\n\tUSER_DIRECTORY_DOCUMENTS,\n\tUSER_DIRECTORY_DESKTOP,\n\tUSER_DIRECTORY_CACHES,\n\tUSER_DIRECTORY_TEMP,\n};\n\nstd::string getUserDirectory(UserDirectory dir);\nstd::string getExecutablePath();\n\n} // apple\n} // love\n\n#endif // defined(LOVE_IOS) || defined(LOVE_MACOS)\n"
  },
  {
    "path": "src/common/apple.mm",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"apple.h\"\n\n#if defined(LOVE_IOS) || defined(LOVE_MACOS)\n\n#import <Foundation/Foundation.h>\n\nnamespace love\n{\nnamespace apple\n{\n\nstd::string getUserDirectory(UserDirectory dir)\n{\n\tstd::string path;\n\tNSSearchPathDirectory nsdir = NSTrashDirectory;\n\n\t@autoreleasepool\n\t{\n\t\tswitch (dir)\n\t\t{\n\t\tcase USER_DIRECTORY_HOME:\n\t\t\treturn NSHomeDirectory().UTF8String;\n\t\tcase USER_DIRECTORY_APPSUPPORT:\n\t\t\tnsdir = NSApplicationSupportDirectory;\n\t\t\tbreak;\n\t\tcase USER_DIRECTORY_DOCUMENTS:\n\t\t\tnsdir = NSDocumentDirectory;\n\t\t\tbreak;\n\t\tcase USER_DIRECTORY_DESKTOP:\n\t\t\tnsdir = NSDesktopDirectory;\n\t\t\tbreak;\n\t\tcase USER_DIRECTORY_CACHES:\n\t\t\tnsdir = NSCachesDirectory;\n\t\t\tbreak;\n\t\tcase USER_DIRECTORY_TEMP:\n\t\t\tnsdir = NSItemReplacementDirectory;\n\t\t\tbreak;\n\t\t}\n\n\t\tNSArray<NSURL *> *dirs = [[NSFileManager defaultManager] URLsForDirectory:nsdir inDomains:NSUserDomainMask];\n\t\tif (dirs.count > 0)\n\t\t\tpath = [dirs[0].path UTF8String];\n\t}\n\n\treturn path;\n}\n\nstd::string getExecutablePath()\n{\n\t@autoreleasepool\n\t{\n\t\treturn std::string([NSBundle mainBundle].executablePath.UTF8String);\n\t}\n}\n\n} // apple\n} // love\n\n#endif // defined(LOVE_IOS) || defined(LOVE_MACOS)\n"
  },
  {
    "path": "src/common/b64.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"b64.h\"\n#include \"Exception.h\"\n\n#include <limits>\n#include <stdio.h>\n\nnamespace love\n{\n\n// Translation table as described in RFC1113\nstatic const char cb64[]=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n// Translation table to decode (created by Bob Trower)\nstatic const char cd64[]=\"|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[\\\\]^_`abcdefghijklmnopq\";\n\n/**\n * encode 3 8-bit binary bytes as 4 '6-bit' characters\n **/\nstatic void b64_encode_block(char in[3], char out[4], int len)\n{\n\tout[0] = (char) cb64[(int)((in[0] & 0xfc) >> 2)];\n\tout[1] = (char) cb64[(int)(((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4))];\n\tout[2] = (char) (len > 1 ? cb64[(int)(((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6))] : '=');\n\tout[3] = (char) (len > 2 ? cb64[(int)(in[2] & 0x3f)] : '=');\n}\n\nchar *b64_encode(const char *src, size_t srclen, size_t linelen, size_t &dstlen)\n{\n\tif (linelen == 0)\n\t\tlinelen = std::numeric_limits<size_t>::max();\n\n\tsize_t blocksout = 0;\n\tsize_t srcpos = 0;\n\n\tsize_t adjustment = (srclen % 3) ? (3 - (srclen % 3)) : 0;\n\tsize_t paddedlen = ((srclen + adjustment) / 3) * 4;\n\n\tdstlen = paddedlen + paddedlen / linelen;\n\n\tif (dstlen == 0)\n\t\treturn nullptr;\n\n\tchar *dst = nullptr;\n\ttry\n\t{\n\t\tdst = new char[dstlen + 1];\n\t}\n\tcatch (std::exception &)\n\t{\n\t\tthrow love::Exception(\"Out of memory.\");\n\t}\n\n\tsize_t dstpos = 0;\n\n\twhile (srcpos < srclen)\n\t{\n\t\tchar in[3]  = {0};\n\t\tchar out[4] = {0};\n\n\t\tint len = 0;\n\n\t\tfor (int i = 0; i < 3; i++)\n\t\t{\n\t\t\tif (srcpos >= srclen)\n\t\t\t\tbreak;\n\n\t\t\tin[i] = src[srcpos++];\n\t\t\tlen++;\n\t\t}\n\n\t\tif (len > 0)\n\t\t{\n\t\t\tb64_encode_block(in, out, len);\n\n\t\t\tfor (int i = 0; i < 4 && dstpos < dstlen; i++, dstpos++)\n\t\t\t\tdst[dstpos] = out[i];\n\n\t\t\tblocksout++;\n\t\t}\n\n\t\tif (blocksout >= linelen / 4 || srcpos >= srclen)\n\t\t{\n\t\t\tif (blocksout > 0 && dstpos < dstlen)\n\t\t\t\tdst[dstpos++] = '\\n';\n\n\t\t\tblocksout = 0;\n\t\t}\n\t}\n\n\tdst[dstpos] = '\\0';\n\treturn dst;\n}\n\nstatic void b64_decode_block(char in[4], char out[3])\n{\n\tout[0] = (char)(in[0] << 2 | in[1] >> 4);\n\tout[1] = (char)(in[1] << 4 | in[2] >> 2);\n\tout[2] = (char)(((in[2] << 6) & 0xc0) | in[3]);\n}\n\nchar *b64_decode(const char *src, size_t srclen, size_t &size)\n{\n\tsize_t paddedsize = (srclen / 4) * 3;\n\n\tchar *dst = nullptr;\n\ttry\n\t{\n\t\tdst = new char[paddedsize];\n\t}\n\tcatch (std::exception &)\n\t{\n\t\tthrow love::Exception(\"Out of memory.\");\n\t}\n\n\tchar *d = dst;\n\n\tchar in[4]  = {0};\n\tchar out[3] = {0};\n\tsize_t i, len, srcpos = 0;\n\n\twhile (srcpos <= srclen)\n\t{\n\t\tfor (len = 0, i = 0; i < 4 && srcpos <= srclen; i++)\n\t\t{\n\t\t\tchar v = 0;\n\n\t\t\twhile (srcpos <= srclen && v == 0)\n\t\t\t{\n\t\t\t\tv = src[srcpos++];\n\t\t\t\tv = (char)((v < 43 || v > 122) ? 0 : cd64[v - 43]);\n\t\t\t\tif (v != 0)\n\t\t\t\t\tv = (char)((v == '$') ? 0 : v - 61);\n\t\t\t}\n\n\t\t\tif (srcpos <= srclen)\n\t\t\t{\n\t\t\t\tlen++;\n\t\t\t\tif (v != 0)\n\t\t\t\t\tin[i] = (char)(v - 1);\n\t\t\t}\n\t\t\telse\n\t\t\t\tin[i] = 0;\n\t\t}\n\n\t\tif (len)\n\t\t{\n\t\t\tb64_decode_block(in, out);\n\t\t\tfor (i = 0; i < len - 1; i++)\n\t\t\t\t *(d++) = out[i];\n\t\t}\n\t}\n\n\tsize = (size_t)(ptrdiff_t) (d - dst);\n\treturn dst;\n}\n\n} // love\n"
  },
  {
    "path": "src/common/b64.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"config.h\"\n\n#include <stddef.h>\n\n#ifndef LOVE_B64_H\n#define LOVE_B64_H\n\nnamespace love\n{\n\n/**\n * Base64-encode data.\n *\n * @param src The data to encode.\n * @param srclen The size in bytes of the data.\n * @param linelen The maximum length of each line in the encoded string.\n *        0 indicates no maximum length.\n * @param dstlen The length of the encoded string is stored here.\n * @return A string containing the base64-encoded data (allocated with new[]).\n */\nchar *b64_encode(const char *src, size_t srclen, size_t linelen, size_t &dstlen);\n\n/**\n * Decode base64 encoded data.\n *\n * @param src The string containing the base64 data.\n * @param srclen The length of the string.\n * @param dstlen The size of the binary data is stored here.\n * @return A chunk of memory containing the binary data (allocated with new[]).\n */\nchar *b64_decode(const char *src, size_t srclen, size_t &dstlen);\n\n} // love\n\n#endif // LOVE_B64_H\n"
  },
  {
    "path": "src/common/config.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_CONFIG_H\n#define LOVE_CONFIG_H\n\n// Platform stuff.\n#if defined(WIN32) || defined(_WIN32)\n#\tdefine LOVE_WINDOWS 1\n#\tinclude <winapifamily.h>\n#\tif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)\n#\t\tdefine LOVE_WINDOWS_UWP 1\n#\t\tdefine LOVE_NO_MODPLUG 1\n#\tendif\n#endif\n#if defined(linux) || defined(__linux) || defined(__linux__)\n#\tdefine LOVE_LINUX 1\n#endif\n#if defined(__ANDROID__)\n#\tdefine LOVE_ANDROID 1\n// Needed for ENet\n#\tdefine HAS_SOCKLEN_T 1\n#endif\n#if defined(__APPLE__)\n#\tinclude <TargetConditionals.h>\n#\tif TARGET_OS_IPHONE\n#\t\tdefine LOVE_IOS 1\n#\telif TARGET_OS_MAC\n#\t\tdefine LOVE_MACOS 1\n#\tendif\n#endif\n#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)\n// I know it's not linux, but it seems most \"linux-only\" code is bsd-compatible\n#\tdefine LOVE_LINUX 1\n#endif\n\n// Endianness.\n#if defined(__ppc__) || defined(__ppc) || defined(__powerpc__) || defined(__powerpc)\n#\tdefine LOVE_BIG_ENDIAN 1\n#else\n#\tdefine LOVE_LITTLE_ENDIAN 1\n#endif\n\n// SSE instructions.\n#if defined(__SSE__)\n#\tdefine LOVE_SIMD_SSE\n#elif defined(_MSC_VER)\n#\tif defined(_M_AMD64) || defined(_M_X64)\n#\t\tdefine LOVE_SIMD_SSE\n#\telif _M_IX86_FP\n#\t\tdefine LOVE_SIMD_SSE\n#\tendif\n#endif\n\n// NEON instructions.\n#if defined(__ARM_NEON) || defined(_M_ARM64)\n#\tdefine LOVE_SIMD_NEON\n#endif\n\n// Warnings.\n#ifndef _CRT_SECURE_NO_WARNINGS\n#\tdefine _CRT_SECURE_NO_WARNINGS\n#endif\n\n// Preferably, and ironically, this macro should go unused.\n#ifndef LOVE_UNUSED\n#\tdefine LOVE_UNUSED(x) (void)sizeof(x)\n#endif\n\n\n// Warn on unused return values\n#ifdef __GNUC__\n#\tdefine LOVE_WARN_UNUSED __attribute__((warn_unused_result))\n#elif _MSC_VER\n#\tdefine LOVE_WARN_UNUSED _Check_return_\n#else\n#\tdefine LOVE_WARN_UNUSED\n#endif\n\n#ifndef LOVE_BUILD\n#\tdefine LOVE_BUILD\n#\tdefine LOVE_BUILD_STANDALONE\n#\tdefine LOVE_BUILD_EXE\n//#\tdefine LOVE_BUILD_DLL\n#endif\n\n// DLL-stuff.\n#if defined(_MSC_VER) || defined(__MINGW32__)\n#\tdefine LOVE_EXPORT __declspec(dllexport)\n#elif defined(__GNUC__) || defined(__clang__)\n#\tdefine LOVE_EXPORT __attribute__((visibility(\"default\")))\n#else\n#\tdefine LOVE_EXPORT\n#endif\n\n#if defined(LOVE_WINDOWS)\n#ifndef LOVE_WINDOWS_UWP\n#\tdefine LOVE_LEGENDARY_CONSOLE_IO_HACK\n#endif // LOVE_WINDOWS_UWP\n#ifndef __MINGW32__\n#\tdefine NOMINMAX\n#endif\n#endif\n\n#if defined(LOVE_MACOS) || defined(LOVE_IOS)\n#\tdefine LOVE_LEGENDARY_APP_ARGV_HACK\n#endif\n\n#if defined(LOVE_WINDOWS) || defined(LOVE_LINUX) || defined(LOVE_ANDROID)\n#\tdefine LOVE_GRAPHICS_VULKAN\n#endif\n\n#if defined(LOVE_MACOS) || defined(LOVE_IOS)\n#\tdefine LOVE_GRAPHICS_METAL\n#endif\n\n// Autotools config.h\n#ifdef HAVE_CONFIG_H\n#\tinclude <../config.h>\n#\tundef VERSION\n#\tifdef WORDS_BIGENDIAN\n#\t\tundef LOVE_LITTLE_ENDIAN\n#\t\tdefine LOVE_BIG_ENDIAN 1\n#\telse\n#\t\tundef LOVE_BIG_ENDIAN\n#\t\tdefine LOVE_LITTLE_ENDIAN 1\n#\tendif\n#else\n#\tdefine LOVE_ENABLE_LOVE\n#\tdefine LOVE_ENABLE_AUDIO\n#\tdefine LOVE_ENABLE_DATA\n#\tdefine LOVE_ENABLE_EVENT\n#\tdefine LOVE_ENABLE_FILESYSTEM\n#\tdefine LOVE_ENABLE_FONT\n#\tdefine LOVE_ENABLE_GRAPHICS\n#\tdefine LOVE_ENABLE_IMAGE\n#\tdefine LOVE_ENABLE_JOYSTICK\n#\tdefine LOVE_ENABLE_KEYBOARD\n#\tdefine LOVE_ENABLE_MATH\n#\tdefine LOVE_ENABLE_MOUSE\n#\tdefine LOVE_ENABLE_PHYSICS\n#\tdefine LOVE_ENABLE_SENSOR\n#\tdefine LOVE_ENABLE_SOUND\n#\tdefine LOVE_ENABLE_SYSTEM\n#\tdefine LOVE_ENABLE_THREAD\n#\tdefine LOVE_ENABLE_TIMER\n#\tdefine LOVE_ENABLE_TOUCH\n#\tdefine LOVE_ENABLE_VIDEO\n#\tdefine LOVE_ENABLE_WINDOW\n\n#\tdefine LOVE_ENABLE_ENET\n#\tdefine LOVE_ENABLE_LUASOCKET\n#\tdefine LOVE_ENABLE_LUA53\n#\tdefine LOVE_ENABLE_LUAHTTPS\n#endif\n\n// Check we have a sane configuration\n#if !defined(LOVE_WINDOWS) && !defined(LOVE_LINUX) && !defined(LOVE_IOS) && !defined(LOVE_MACOS) && !defined(LOVE_ANDROID)\n#\terror Could not detect target platform\n#endif\n#if !defined(LOVE_LITTLE_ENDIAN) && !defined(LOVE_BIG_ENDIAN)\n#\terror Could not detect endianness\n#endif\n\n#endif // LOVE_CONFIG_H\n"
  },
  {
    "path": "src/common/delay.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"delay.h\"\n\n#include <SDL3/SDL_timer.h>\n\nnamespace love\n{\n\nvoid sleep(double ms)\n{\n\t// We don't need to initialize the SDL timer subsystem for SDL_Delay to\n\t// function - and doing so causes SDL to create a worker thread.\n\tSDL_DelayNS(SDL_NS_PER_MS * ms);\n}\n\n} // love\n"
  },
  {
    "path": "src/common/delay.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef DELAY_H_\n#define DELAY_H_\n\nnamespace love\n{\n\nvoid sleep(double ms);\n\n} // namespace love\n\n#endif // DELAY_H_\n"
  },
  {
    "path": "src/common/deprecation.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"common/config.h\"\n#include \"deprecation.h\"\n#include \"thread/threads.h\"\n\n#include <atomic>\n#include <map>\n#include <sstream>\n\nnamespace love\n{\n\nstatic std::map<std::string, DeprecationInfo> *deprecated = nullptr;\nstatic std::vector<const DeprecationInfo *> *deprecatedList = nullptr;\n\nstatic std::atomic<int> initCount;\n\nstatic thread::Mutex *mutex = nullptr;\nstatic bool outputEnabled = false;\n\nvoid initDeprecation()\n{\n\tif (initCount.fetch_add(1) == 0)\n\t{\n\t\tmutex = thread::newMutex();\n\n\t\t// These are heap-allocated because we want to clear them on deinit,\n\t\t// and deinit may be called when the program is shutting down in the\n\t\t// middle of static variable cleanup (eg in the Math module destructor).\n\t\t// Calling std::map::clear() in that case was causing segfaults.\n\t\tdeprecated = new std::map<std::string, DeprecationInfo>();\n\t\tdeprecatedList = new std::vector<const DeprecationInfo *>();\n\t}\n}\n\nvoid deinitDeprecation()\n{\n\tif (initCount.fetch_sub(1) == 1)\n\t{\n\t\tdelete deprecated;\n\t\tdelete deprecatedList;\n\t\tdelete mutex;\n\n\t\tdeprecated = nullptr;\n\t\tdeprecatedList = nullptr;\n\t\tmutex = nullptr;\n\t}\n}\n\nstatic void printDeprecationNotice(const DeprecationInfo &info)\n{\n\tstd::string notice = getDeprecationNotice(info, true);\n\tprintf(\"LOVE - Warning: %s\\n\", notice.c_str());\n}\n\nvoid setDeprecationOutputEnabled(bool enable)\n{\n\tif (enable == outputEnabled)\n\t\treturn;\n\n\toutputEnabled = enable;\n\n\tif (enable)\n\t{\n\t\tGetDeprecated deprecated;\n\n\t\tfor (const DeprecationInfo *info : deprecated.all)\n\t\t{\n\t\t\tif (info->uses == 1)\n\t\t\t\tprintDeprecationNotice(*info);\n\t\t}\n\t}\n}\n\nbool isDeprecationOutputEnabled()\n{\n\treturn outputEnabled;\n}\n\nstd::string getDeprecationNotice(const DeprecationInfo &info, bool usewhere)\n{\n\tstd::stringstream notice;\n\n\tif (usewhere)\n\t\tnotice << info.where;\n\n\tnotice << \"Using deprecated \";\n\n\tif (info.apiType == API_FUNCTION)\n\t\tnotice << \"function \";\n\telse if (info.apiType == API_FUNCTION_VARIANT)\n\t\tnotice << \"function variant in \";\n\telse if (info.apiType == API_METHOD)\n\t\tnotice << \"method \";\n\telse if (info.apiType == API_METHOD_VARIANT)\n\t\tnotice << \"method variant in \";\n\telse if (info.apiType == API_CALLBACK)\n\t\tnotice << \"callback \";\n\telse if (info.apiType == API_FIELD)\n\t\tnotice << \"field \";\n\telse if (info.apiType == API_CONSTANT)\n\t\tnotice << \"constant \";\n\n\tnotice << info.name;\n\n\tif (info.type == DEPRECATED_REPLACED && !info.replacement.empty())\n\t\tnotice << \" (replaced by \" << info.replacement << \")\";\n\telse if (info.type == DEPRECATED_RENAMED && !info.replacement.empty())\n\t\tnotice << \" (renamed to \" << info.replacement << \")\";\n\n\treturn notice.str();\n}\n\nGetDeprecated::GetDeprecated()\n\t: all(*deprecatedList)\n{\n\tif (mutex != nullptr)\n\t\tmutex->lock();\n}\n\nGetDeprecated::~GetDeprecated()\n{\n\tif (mutex != nullptr)\n\t\tmutex->unlock();\n}\n\nMarkDeprecated::MarkDeprecated(const char *name, APIType api)\n\t: MarkDeprecated(name, api, DEPRECATED_NO_REPLACEMENT, nullptr)\n{\n}\n\nMarkDeprecated::MarkDeprecated(const char *name, APIType api, DeprecationType type, const char *replacement)\n\t: info(nullptr)\n{\n\tif (mutex != nullptr)\n\t\tmutex->lock();\n\n\tauto it = deprecated->find(name);\n\n\tif (it != deprecated->end())\n\t{\n\t\tit->second.uses++;\n\t\tinfo = &it->second;\n\t}\n\telse\n\t{\n\t\tDeprecationInfo newinfo = {};\n\n\t\tnewinfo.type = type;\n\t\tnewinfo.apiType = api;\n\t\tnewinfo.uses = 1;\n\t\tnewinfo.name = name;\n\n\t\tif (replacement != nullptr)\n\t\t\tnewinfo.replacement = replacement;\n\n\t\tauto inserted = deprecated->insert(std::make_pair(newinfo.name, newinfo));\n\n\t\tinfo = &inserted.first->second;\n\t\tdeprecatedList->push_back(info);\n\t}\n}\n\nMarkDeprecated::~MarkDeprecated()\n{\n\tif (outputEnabled && info != nullptr && info->uses == 1)\n\t\tprintDeprecationNotice(*info);\n\n\tif (mutex != nullptr)\n\t\tmutex->unlock();\n}\n\nSTRINGMAP_BEGIN(APIType, API_MAX_ENUM, apiType)\n{\n\t{ \"function\", API_FUNCTION },\n\t{ \"functionvariant\", API_FUNCTION_VARIANT },\n\t{ \"method\",   API_METHOD   },\n\t{ \"methodvariant\", API_METHOD_VARIANT },\n\t{ \"callback\", API_CALLBACK },\n\t{ \"field\",    API_FIELD    },\n\t{ \"constant\", API_CONSTANT },\n\t{ \"custom\",   API_CUSTOM   },\n}\nSTRINGMAP_END(APIType, API_MAX_ENUM, apiType)\n\nSTRINGMAP_BEGIN(DeprecationType, DEPRECATED_MAX_ENUM, deprecationType)\n{\n\t{ \"noreplacement\", DEPRECATED_NO_REPLACEMENT },\n\t{ \"replaced\",      DEPRECATED_REPLACED       },\n\t{ \"renamed\",       DEPRECATED_RENAMED        },\n}\nSTRINGMAP_END(DeprecationType, DEPRECATED_MAX_ENUM, deprecationType)\n\n} // love\n"
  },
  {
    "path": "src/common/deprecation.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"int.h\"\n#include \"StringMap.h\"\n\n#include <string>\n#include <vector>\n\nnamespace love\n{\n\nenum APIType\n{\n\tAPI_FUNCTION,\n\tAPI_FUNCTION_VARIANT,\n\tAPI_METHOD,\n\tAPI_METHOD_VARIANT,\n\tAPI_CALLBACK,\n\tAPI_FIELD,\n\tAPI_CONSTANT,\n\tAPI_CUSTOM,\n\tAPI_MAX_ENUM\n};\n\nenum DeprecationType\n{\n\tDEPRECATED_NO_REPLACEMENT,\n\tDEPRECATED_REPLACED,\n\tDEPRECATED_RENAMED,\n\tDEPRECATED_MAX_ENUM\n};\n\nstruct DeprecationInfo\n{\n\tDeprecationType type;\n\tAPIType apiType;\n\tint64 uses;\n\tstd::string name;\n\tstd::string replacement;\n\tstd::string where;\n};\n\nvoid initDeprecation();\nvoid deinitDeprecation();\n\nvoid setDeprecationOutputEnabled(bool enable);\nbool isDeprecationOutputEnabled();\n\nstd::string getDeprecationNotice(const DeprecationInfo &info, bool usewhere);\n\nstruct GetDeprecated\n{\n\tGetDeprecated();\n\t~GetDeprecated();\n\n\tconst std::vector<const DeprecationInfo *> &all;\n};\n\nstruct MarkDeprecated\n{\n\tMarkDeprecated(const char *name, APIType api);\n\tMarkDeprecated(const char *name, APIType api, DeprecationType type, const char *replacement);\n\t~MarkDeprecated();\n\n\tDeprecationInfo *info;\n};\n\nSTRINGMAP_DECLARE(APIType);\nSTRINGMAP_DECLARE(DeprecationType);\n\n} // love\n"
  },
  {
    "path": "src/common/floattypes.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"floattypes.h\"\n\n#include <limits>\n#include <cmath>\n\nnamespace love\n{\n\n// Code from ftp://www.fox-toolkit.org/pub/fasthalffloatconversion.pdf\n\nstatic bool halfInitialized = false;\n\n// tables for half -> float conversions\nstatic uint32 mantissatable[2048];\nstatic uint16 offsettable[64];\nstatic uint32 exponenttable[64];\n\n// tables for float -> half conversions\nstatic uint16 basetable[512];\nstatic uint8 shifttable[512];\n\n\nstatic uint32 convertMantissa(uint32 i)\n{\n\tuint32 m = i << 13; // Zero pad mantissa bits\n\tuint32 e = 0; // Zero exponent\n\n\twhile (!(m & 0x00800000)) // While not normalized\n\t{\n\t\te -= 0x00800000; // Decrement exponent (1<<23)\n\t\tm <<= 1; // Shift mantissa\n\t}\n\n\tm &= ~(0x00800000); // Clear leading 1 bit\n\te += 0x38800000; // Adjust bias ((127-14)<<23)\n\n\treturn m | e; // Return combined number\n}\n\nvoid float16Init()\n{\n\tif (halfInitialized)\n\t\treturn;\n\n\thalfInitialized = true;\n\n\n\t// tables for float16 -> float32 conversions.\n\n\tmantissatable[0] = 0;\n\n\tfor (uint32 i = 1; i < 1024; i++)\n\t\tmantissatable[i] = convertMantissa(i);\n\n\tfor (uint32 i = 1024; i < 2048; i++)\n\t\tmantissatable[i] = 0x38000000 + ((i - 1024) << 13);\n\n\texponenttable[0] = 0;\n\texponenttable[32] = 0x80000000;\n\n\tfor (uint32 i = 0; i < 31; i++)\n\t\texponenttable[i] = i << 23;\n\n\tfor (uint32 i = 33; i < 63; i++)\n\t\texponenttable[i] = 0x80000000 + ((i - 32) << 23);\n\n\texponenttable[31] = 0x47800000;\n\texponenttable[63] = 0xC7800000;\n\n\tfor (int i = 0; i < 64; i++)\n\t{\n\t\tif (i == 0 || i == 32)\n\t\t\toffsettable[i] = 0;\n\t\telse\n\t\t\toffsettable[i] = 1024;\n\t}\n\n\n\t// tables for float32 -> float16 conversions.\n\n\tfor (uint32 i = 0; i < 256; i++)\n\t{\n\t\tint e = (int) i - 127;\n\n\t\tif (e < -24) // Very small numbers map to zero\n\t\t{\n\t\t\tbasetable[i | 0x000] = 0x0000;\n\t\t\tbasetable[i | 0x100] = 0x8000;\n\t\t\tshifttable[i | 0x000] = 24;\n\t\t\tshifttable[i | 0x100] = 24;\n\t\t}\n\t\telse if (e < -14) // Small numbers map to denorms\n\t\t{\n\t\t\tbasetable[i | 0x000] = (0x0400 >> (-e - 14));\n\t\t\tbasetable[i | 0x100] = (0x0400 >> (-e - 14)) | 0x8000;\n\t\t\tshifttable[i | 0x000] = -e - 1;\n\t\t\tshifttable[i | 0x100] = -e - 1;\n\t\t}\n\t\telse if (e <= 15) // Normal numbers just lose precision\n\t\t{\n\t\t\tbasetable[i | 0x000] = ((e + 15) << 10);\n\t\t\tbasetable[i | 0x100] = ((e + 15) << 10) | 0x8000;\n\t\t\tshifttable[i | 0x000] = 13;\n\t\t\tshifttable[i | 0x100] = 13;\n\t\t}\n\t\telse if (e < 128) // Large numbers map to Infinity\n\t\t{\n\t\t\tbasetable[i | 0x000] = 0x7C00;\n\t\t\tbasetable[i | 0x100] = 0xFC00;\n\t\t\tshifttable[i | 0x000] = 24;\n\t\t\tshifttable[i | 0x100] = 24;\n\t\t}\n\t\telse // Infinity and NaN's stay Infinity and NaN's\n\t\t{\n\t\t\tbasetable[i | 0x000] = 0x7C00;\n\t\t\tbasetable[i | 0x100] = 0xFC00;\n\t\t\tshifttable[i | 0x000] = 13;\n\t\t\tshifttable[i | 0x100] = 13;\n\t\t}\n\t}\n}\n\nstatic inline uint32 asuint32(float f)\n{\n\tunion { float f; uint32 u; } conv;\n\tconv.f = f;\n\treturn conv.u;\n}\n\nstatic inline float asfloat32(uint32 u)\n{\n\tunion { float f; uint32 u; } conv;\n\tconv.u = u;\n\treturn conv.f;\n}\n\nfloat float16to32(float16 f)\n{\n\treturn asfloat32(mantissatable[offsettable[f >> 10] + (f & 0x3FF)] + exponenttable[f >> 10]);\n}\n\nfloat16 float32to16(float f)\n{\n\tuint32 u = asuint32(f);\n\treturn basetable[(u >> 23) & 0x1FF] + ((u & 0x007FFFFF) >> shifttable[(u >> 23) & 0x1FF]);\n}\n\n// Adapted from https://stackoverflow.com/questions/41532085/how-to-pack-unpack-11-and-10-bit-floats-in-javascript-for-webgl2\n\nfloat float11to32(float11 f)\n{\n\tuint16 exponent = f >> 6;\n\tuint16 mantissa = f & 0x3F;\n\n\tif (exponent == 0)\n\t\treturn mantissa == 0 ? 0 : powf(2.0f, -14.0f) * (mantissa / 64.0f);\n\n\tif (exponent < 31)\n\t\treturn powf(2.0f, exponent - 15) * (1.0f + mantissa / 64.0f);\n\n\treturn mantissa == 0 ? std::numeric_limits<float>::infinity() : std::numeric_limits<float>::quiet_NaN();\n}\n\nfloat11 float32to11(float f)\n{\n\tconst uint16 EXPONENT_BITS = 0x1F;\n\tconst uint16 EXPONENT_SHIFT = 6;\n\tconst uint16 EXPONENT_BIAS = 15;\n\tconst uint16 MANTISSA_BITS = 0x3F;\n\tconst uint16 MANTISSA_SHIFT = (23 - EXPONENT_SHIFT);\n\tconst uint16 MAX_EXPONENT = (EXPONENT_BITS << EXPONENT_SHIFT);\n\n\tuint32 u = asuint32(f);\n\n\tif (u & 0x80000000)\n\t\treturn 0; // Negative values go to 0.\n\n\t// Map exponent to the range [-127,128]\n\tint32 exponent = (int32)((u >> 23) & 0xFF) - 127;\n\tuint32 mantissa = u & 0x007FFFFF;\n\n\tif (exponent > 15) // Infinity or NaN\n\t\treturn MAX_EXPONENT | (exponent == 128 ? (mantissa & MANTISSA_BITS) : 0);\n\telse if (exponent <= -15)\n\t\treturn 0;\n\n\texponent += EXPONENT_BIAS;\n\n\treturn ((uint16)exponent << EXPONENT_SHIFT) | (mantissa >> MANTISSA_SHIFT);\n}\n\nfloat float10to32(float10 f)\n{\n\tuint16 exponent = f >> 5;\n\tuint16 mantissa = f & 0x1F;\n\n\tif (exponent == 0)\n\t\treturn mantissa == 0 ? 0 : powf(2.0f, -14.0f) * (mantissa / 32.0f);\n\n\tif (exponent < 31)\n\t\treturn powf(2.0f, exponent - 15) * (1.0f + mantissa / 32.0f);\n\n\treturn mantissa == 0 ? std::numeric_limits<float>::infinity() : std::numeric_limits<float>::quiet_NaN();\n}\n\nfloat10 float32to10(float f)\n{\n\tconst uint16 EXPONENT_BITS = 0x1F;\n\tconst uint16 EXPONENT_SHIFT = 5;\n\tconst uint16 EXPONENT_BIAS = 15;\n\tconst uint16 MANTISSA_BITS = 0x1F;\n\tconst uint16 MANTISSA_SHIFT = (23 - EXPONENT_SHIFT);\n\tconst uint16 MAX_EXPONENT = (EXPONENT_BITS << EXPONENT_SHIFT);\n\n\tuint32 u = asuint32(f);\n\n\tif (u & 0x80000000)\n\t\treturn 0; // Negative values go to 0.\n\n\t// Map exponent to the range [-127,128]\n\tint32 exponent = (int32)((u >> 23) & 0xFF) - 127;\n\tuint32 mantissa = u & 0x007FFFFF;\n\n\tif (exponent > 15) // Infinity or NaN\n\t\treturn MAX_EXPONENT | (exponent == 128 ? (mantissa & MANTISSA_BITS) : 0);\n\telse if (exponent <= -15)\n\t\treturn 0;\n\n\texponent += EXPONENT_BIAS;\n\n\treturn ((uint16)exponent << EXPONENT_SHIFT) | (mantissa >> MANTISSA_SHIFT);\n}\n\n} // love\n"
  },
  {
    "path": "src/common/floattypes.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"int.h\"\n\nnamespace love\n{\n\ntypedef uint16 float16;\ntypedef uint16 float11;\ntypedef uint16 float10;\n\nvoid float16Init();\n\nfloat float16to32(float16 f);\nfloat16 float32to16(float f);\n\nfloat float11to32(float11 f);\nfloat11 float32to11(float f);\n\nfloat float10to32(float10 f);\nfloat10 float32to10(float f);\n\n} // love\n"
  },
  {
    "path": "src/common/int.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_INT_H\n#define LOVE_INT_H\n\n// C standard sized integer types.\n#include <stdint.h>\n\n#define LOVE_INT8_MAX   0x7F\n#define LOVE_UINT8_MAX  0xFF\n#define LOVE_INT16_MAX  0x7FFF\n#define LOVE_UINT16_MAX 0xFFFF\n#define LOVE_INT32_MAX  0x7FFFFFFF\n#define LOVE_UINT32_MAX 0xFFFFFFFF\n#define LOVE_INT64_MAX  0x7FFFFFFFFFFFFFFF\n#define LOVE_UINT64_MAX 0xFFFFFFFFFFFFFFFF\n\nnamespace love\n{\n\ntypedef int8_t int8;\ntypedef uint8_t uint8;\ntypedef int16_t int16;\ntypedef uint16_t uint16;\ntypedef int32_t int32;\ntypedef uint32_t uint32;\ntypedef int64_t int64;\ntypedef uint64_t uint64;\n\nstatic inline uint16 swapuint16(uint16 x)\n{\n\treturn (x >> 8) | (x << 8);\n}\n\nstatic inline uint32 swapuint32(uint32 x)\n{\n\treturn ((x & 0x000000FF) << 24) |\n\t       ((x & 0x0000FF00) <<  8) |\n\t       ((x & 0x00FF0000) >>  8) |\n\t       ((x & 0xFF000000) >> 24);\n}\n\nstatic inline uint64 swapuint64(uint64 x)\n{\n\treturn ((x << 56) & 0xFF00000000000000ULL) | ((x << 40) & 0x00FF000000000000ULL) |\n\t       ((x << 24) & 0x0000FF0000000000ULL) | ((x <<  8) & 0x000000FF00000000ULL) |\n\t       ((x >>  8) & 0x00000000FF000000ULL) | ((x >> 24) & 0x0000000000FF0000ULL) |\n\t       ((x >> 40) & 0x000000000000FF00ULL) | ((x >> 56) & 0x00000000000000FFULL);\n}\n\n} // love\n\n#endif // LOVE_INT_H\n"
  },
  {
    "path": "src/common/ios.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_IOS_H\n#define LOVE_IOS_H\n\n#include \"config.h\"\n\n#ifdef LOVE_IOS\n\n#include \"common/math.h\"\n\n#include <string>\n\nstruct SDL_Window;\n\nnamespace love\n{\nnamespace ios\n{\n\n/**\n * Gets the filepath of the first detected love file. The main .app Bundle is\n * searched first, and then the app's Documents folder.\n **/\nstd::string getLoveInResources(bool &fused);\n\n/**\n * Causes devices with vibration support to vibrate for about 0.5 seconds.\n **/\nvoid vibrate();\n\n/**\n * Enable mix mode (e.g. with background music apps) and playback with a muted device.\n **/\nbool setAudioMixWithOthers(bool mixEnabled);\n\n/**\n * Returns whether another application is playing audio.\n **/\nbool hasBackgroundMusic();\n\n/**\n * Registers notifications to handle and restore audio interruptions\n **/\nvoid initAudioSessionInterruptionHandler();\nvoid destroyAudioSessionInterruptionHandler();\n    \n/**\n * Gets the area in the window that is safe for UI to render to (not covered by\n * the status bar, notch, etc.)\n **/\nRect getSafeArea(SDL_Window *window);\n\n} // ios\n} // love\n\n#endif // LOVE_IOS\n#endif // LOVE_IOS_H\n"
  },
  {
    "path": "src/common/ios.mm",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"ios.h\"\n#include \"apple.h\"\n\nusing namespace love::apple;\n\n#ifdef LOVE_IOS\n\n#import <Foundation/Foundation.h>\n#import <UIKit/UIKit.h>\n\n#import <AudioToolbox/AudioServices.h>\n#import <AVFoundation/AVFoundation.h>\n\n#include \"modules/audio/Audio.h\"\n\n#include <vector>\n\n#if __has_include(<SDL3/SDL_events.h>)\n#include <SDL3/SDL_events.h>\n#include <SDL3/SDL_video.h>\n#include <SDL3/SDL_version.h>\n#else\n#include <SDL_events.h>\n#include <SDL_video.h>\n#include <SDL_syswm.h>\n#include <SDL_version.h>\n#endif\n\nstatic NSArray *getLovesInDocuments();\nstatic bool deleteFileInDocuments(NSString *filename);\n\n@interface LOVETableViewController : UITableViewController\n\n- (instancetype)initWithGameList:(NSArray *)list;\n\n@property (nonatomic) NSMutableArray *gameList;\n@property (nonatomic, readonly, copy) NSString *selectedGame;\n\n@end\n\n@implementation LOVETableViewController\n\n- (instancetype)initWithGameList:(NSArray *)list\n{\n\tif ((self = [super init]))\n\t{\n\t\t_gameList = [[NSMutableArray alloc] initWithArray:list copyItems:YES];\n\n\t\tself.title = @\"LÖVE Games\";\n\t\tself.navigationItem.rightBarButtonItem = self.editButtonItem;\n\t}\n\n\treturn self;\n}\n\n- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section\n{\n\t#pragma unused(tableView)\n\t#pragma unused(section)\n\t// We want to list all games plus the no-game screen.\n\treturn self.gameList.count + 1;\n}\n\n- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath\n{\n\tstatic NSString *cellIdentifier = @\"LOVETableCell\";\n\n\tUITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];\n\tif (cell == nil)\n\t\tcell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];\n\n\tif (indexPath.row < (NSInteger) self.gameList.count)\n\t\tcell.textLabel.text = self.gameList[indexPath.row];\n\telse\n\t\tcell.textLabel.text = @\"No-game screen\";\n\n\treturn cell;\n}\n\n- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath\n{\n\t#pragma unused(tableView)\n\tif (indexPath.row < (NSInteger) self.gameList.count)\n\t\t_selectedGame = [(NSString *)(self.gameList[indexPath.row]) copy];\n\telse\n\t{\n\t\t// We test against nil to check if a game has been selected, so we'll\n\t\t// just use an empty string instead to represent the no-game screen.\n\t\t_selectedGame = @\"\";\n\t}\n}\n\n- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath\n{\n\tif (editingStyle != UITableViewCellEditingStyleDelete)\n\t\treturn;\n\n\tif (indexPath.row >= (NSInteger) self.gameList.count)\n\t\treturn;\n\n\tNSString *filename = self.gameList[indexPath.row];\n\n\t// Delete the file.\n\tif (deleteFileInDocuments(filename))\n\t{\n\t\t[self.gameList removeObjectAtIndex:indexPath.row];\n\t\t[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];\n\t}\n}\n\n- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;\n{\n\t#pragma unused(tableView)\n\t// The no-game screen isn't removable.\n\treturn indexPath.row < (NSInteger) self.gameList.count;\n}\n\n@end\n\nstatic NSArray *getLovesInDocuments()\n{\n\tstd::string docdir = getUserDirectory(USER_DIRECTORY_DOCUMENTS);\n\n\tNSMutableArray *paths = [NSMutableArray new];\n\n\tNSFileManager *manager = [NSFileManager defaultManager];\n\tNSDirectoryEnumerator *enumerator = [manager enumeratorAtPath:@(docdir.c_str())];\n\n\tNSString *path = nil;\n\twhile ((path = [enumerator nextObject]))\n\t{\n\t\t//  Add .love files plus folders that contain main.lua to our list.\n\t\tif ([path.pathExtension isEqualToString:@\"love\"])\n\t\t\t[paths addObject:path];\n\t\telse if ([path.lastPathComponent isEqualToString:@\"main.lua\"])\n\t\t\t[paths addObject:path.stringByDeletingLastPathComponent];\n\t}\n\n\t[paths sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];\n\n\treturn paths;\n}\n\nstatic bool deleteFileInDocuments(NSString *filename)\n{\n\tstd::string docdir = getUserDirectory(USER_DIRECTORY_DOCUMENTS);\n\n\tNSString *file = [@(docdir.c_str()) stringByAppendingPathComponent:filename];\n\tbool success = [[NSFileManager defaultManager] removeItemAtPath:file error:nil];\n\n\tif (success)\n\t\tNSLog(@\"Deleted file %@ in Documents folder.\", filename);\n\n\treturn success;\n}\n\n#if SDL_VERSION_ATLEAST(3, 0, 0)\nstatic bool\n#else\nstatic int\n#endif\ndropFileEventFilter(void *userdata, SDL_Event *event)\n{\n\t@autoreleasepool\n\t{\n#if SDL_VERSION_ATLEAST(3, 0, 0)\n\t\tif (event->type != SDL_EVENT_DROP_FILE)\n#else\n\t\tif (event->type != SDL_DROPFILE)\n#endif\n\t\t\treturn 1;\n\n#if SDL_VERSION_ATLEAST(3, 0, 0)\n\t\tNSString *fname = @(event->drop.data);\n#else\n\t\tNSString *fname = @(event->drop.file);\n#endif\n\t\tNSFileManager *fmanager = [NSFileManager defaultManager];\n\n\t\tif ([fmanager fileExistsAtPath:fname] && [fname.pathExtension isEqual:@\"love\"])\n\t\t{\n\t\t\tstd::string docdir = getUserDirectory(USER_DIRECTORY_DOCUMENTS);\n\t\t\tNSString *documents = @(docdir.c_str());\n\n\t\t\tdocuments = documents.stringByStandardizingPath.stringByResolvingSymlinksInPath;\n\t\t\tfname = fname.stringByStandardizingPath.stringByResolvingSymlinksInPath;\n\n\t\t\t// Is the file inside the Documents directory?\n\t\t\tif ([fname hasPrefix:documents])\n\t\t\t{\n\t\t\t\tLOVETableViewController *vc = (__bridge LOVETableViewController *) userdata;\n\n\t\t\t\t// Update the game list.\n\t\t\t\tNSArray *games = getLovesInDocuments();\n\t\t\t\tvc.gameList = [[NSMutableArray alloc] initWithArray:games copyItems:YES];\n\t\t\t\t[vc.tableView reloadData];\n\n#if !SDL_VERSION_ATLEAST(3, 0, 0)\n\t\t\t\tSDL_free(event->drop.file);\n#endif\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\n\t\treturn 1;\n\t}\n}\n\n@interface LoveAudioInterruptionListener : NSObject\n@end\n\n@implementation LoveAudioInterruptionListener\n\n+ (id) shared\n{\n\t// thread-safe singleton\n\tstatic dispatch_once_t pred = 0;\n\t__strong static id _shared = nil;\n\tdispatch_once(&pred, ^{\n\t\t\t_shared = [[self alloc] init];\n\t\t});\n\treturn _shared;\n}\n\n- (void)audioSessionInterruption:(NSNotification *)note\n{\n\t@synchronized (self)\n\t{\n\t\tauto audio = love::Module::getInstance<love::audio::Audio>(love::Module::M_AUDIO);\n\t\tif (!audio)\n\t\t{\n\t\t\tNSLog(@\"LoveAudioInterruptionListener could not get love audio module\");\n\t\t\treturn;\n\t\t}\n\t\tNSNumber *type = note.userInfo[AVAudioSessionInterruptionTypeKey];\n\t\tif (type.unsignedIntegerValue == AVAudioSessionInterruptionTypeBegan)\n\t\t\taudio->pauseContext();\n\t\telse\n\t\t\taudio->resumeContext();\n\t}\n}\n\n- (void)applicationBecameActive:(NSNotification *)note\n{\n\t@synchronized (self)\n\t{\n\t\tauto audio = love::Module::getInstance<love::audio::Audio>(love::Module::M_AUDIO);\n\t\tif (!audio)\n\t\t{\n\t\t\tNSLog(@\"ERROR:could not get love audio module\");\n\t\t\treturn;\n\t\t}\n\t\taudio->resumeContext();\n\t}\n}\n\n@end // LoveAudioInterruptionListener\n\nnamespace love\n{\nnamespace ios\n{\n\n/**\n * Displays a full-screen list of available LOVE games for the user to choose.\n * Returns the index of the selected game from the list. The list of games\n * includes the no-game screen, and the function will return an index outside\n * of the array's range if that is selected.\n **/\nstatic NSString *showGameList(NSArray *filenames)\n{\n\t// Game list view controller.\n\tLOVETableViewController *tablecontroller = [[LOVETableViewController alloc] initWithGameList:filenames];\n\n\t// Navigation view controller (only used for the header bar right now.)\n\t// Contains the game list view/controller.\n\tUINavigationController *navcontroller = [[UINavigationController alloc] initWithRootViewController:tablecontroller];\n\n\tUIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];\n\twindow.rootViewController = navcontroller;\n\n\tSDL_EventFilter oldfilter = nullptr;\n\tvoid *oldudata = nullptr;\n\tSDL_GetEventFilter(&oldfilter, &oldudata);\n\n\t// Manually retain the table VC and use it for the event filter userdata.\n\t// We need to set a custom event filter to update the table when .love files\n\t// are opened by the user.\n\tvoid *tableudata = (void *) CFBridgingRetain(tablecontroller);\n\tSDL_SetEventFilter(dropFileEventFilter, tableudata);\n\n\t[window makeKeyAndVisible];\n\n\t// Process events until a game in the list is selected.\n\tNSRunLoop *runloop = [NSRunLoop currentRunLoop];\n\twhile (tablecontroller.selectedGame == nil)\n\t{\n\t\t[runloop runMode:NSDefaultRunLoopMode  beforeDate:[NSDate distantPast]];\n\t\t[runloop runMode:UITrackingRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:1.0/60.0]];\n\t}\n\n\t// The window will get released and cleaned up once we go out of scope.\n\twindow.hidden = YES;\n\n\tSDL_SetEventFilter(oldfilter, oldudata);\n\tCFBridgingRelease(tableudata);\n\n\treturn tablecontroller.selectedGame;\n}\n\nstd::string getLoveInResources(bool &fused)\n{\n\tfused = false;\n\tstd::string path;\n\n\t@autoreleasepool\n\t{\n\t\t// Start by looking in the main bundle (.app) folder for .love files.\n\t\tNSArray *bundlepaths = [[NSBundle mainBundle] pathsForResourcesOfType:@\"love\" inDirectory:nil];\n\n\t\tif (bundlepaths.count > 0)\n\t\t{\n\t\t\t// The game should be fused if we have something here.\n\t\t\tfused = true;\n\t\t\treturn [bundlepaths[0] UTF8String];\n\t\t}\n\n\t\t// Otherwise look in the app's Documents directory. The game won't be\n\t\t// fused.\n\t\tNSArray *filepaths = getLovesInDocuments();\n\n\t\t// Let the user select a game from the un-fused list.\n\t\tNSString *selectedfile = showGameList(filepaths);\n\n\t\t// The string length might be 0 if the no-game screen was selected.\n\t\tif (selectedfile != nil && selectedfile.length > 0)\n\t\t{\n\t\t\tstd::string docdir = getUserDirectory(USER_DIRECTORY_DOCUMENTS);\n\t\t\tNSString *documents = @(docdir.c_str());\n\t\t\tpath = [documents stringByAppendingPathComponent:selectedfile].UTF8String;\n\t\t}\n\t}\n\n\treturn path;\n}\n\nvoid vibrate()\n{\n\t@autoreleasepool\n\t{\n\t\tAudioServicesPlaySystemSound(kSystemSoundID_Vibrate);\n\t}\n}\n\nbool setAudioMixWithOthers(bool mixEnabled)\n{\n\t@autoreleasepool\n\t{\n\t\tNSString *category = AVAudioSessionCategorySoloAmbient;\n\t\tNSError *err;\n\n\t\tif (mixEnabled)\n\t\t\tcategory = AVAudioSessionCategoryAmbient;\n\n\t\tbool success = [[AVAudioSession sharedInstance] setCategory:category error:&err];\n\t\tif (!success)\n\t\t\tNSLog(@\"Error in AVAudioSession setCategory: %@\", [err localizedDescription]);\n\n\t\treturn success;\n\t}\n}\n\nbool hasBackgroundMusic()\n{\n\t@autoreleasepool\n\t{\n\t\tAVAudioSession *session = [AVAudioSession sharedInstance];\n\t\tif ([session respondsToSelector:@selector(secondaryAudioShouldBeSilencedHint)])\n\t\t\treturn session.secondaryAudioShouldBeSilencedHint;\n\t\treturn false;\n\t}\n}\n\nvoid initAudioSessionInterruptionHandler()\n{\n\t@autoreleasepool\n\t{\n\t\tAVAudioSession *session = [AVAudioSession sharedInstance];\n\t\tNSNotificationCenter *center = [NSNotificationCenter defaultCenter];\n\n\t\t[center addObserver:[LoveAudioInterruptionListener shared]\n\t\t\t   selector:@selector(audioSessionInterruption:)\n\t\t\t       name:AVAudioSessionInterruptionNotification\n\t\t\t     object:session];\n\n\t\t// An interruption end notification is not guaranteed to be sent if\n\t\t// we were previously interrupted... resuming if needed when the app\n\t\t// becomes active seems to be the way to go.\n\t\t[center addObserver:[LoveAudioInterruptionListener shared]\n\t\t\t   selector:@selector(applicationBecameActive:)\n\t\t\t       name:UIApplicationDidBecomeActiveNotification\n\t\t\t     object:nil];\n\n\t\t[center addObserver:[LoveAudioInterruptionListener shared]\n\t\t\t   selector:@selector(applicationBecameActive:)\n\t\t\t       name:UIApplicationWillEnterForegroundNotification\n\t\t\t     object:nil];\n\t}\n}\n\nvoid destroyAudioSessionInterruptionHandler()\n{\n\t[[NSNotificationCenter defaultCenter] removeObserver:[LoveAudioInterruptionListener shared]];\n}\n\nRect getSafeArea(SDL_Window *window)\n{\n\t@autoreleasepool\n\t{\n\t\tRect rect = {};\n\t\tSDL_GetWindowSize(window, &rect.w, &rect.h);\n\n#if SDL_VERSION_ATLEAST(3, 0, 0)\n\t\tSDL_PropertiesID props = SDL_GetWindowProperties(window);\n\t\tUIWindow *window = (__bridge UIWindow *) SDL_GetPointerProperty(props, SDL_PROP_WINDOW_UIKIT_WINDOW_POINTER, nullptr);\n\t\tif (window != nil)\n\t\t{\n\t\t\tUIView *view = window.rootViewController.view;\n#else\n\t\tSDL_SysWMinfo info = {};\n\t\tSDL_VERSION(&info.version);\n\t\tif (SDL_GetWindowWMInfo(window, &info))\n\t\t{\n\t\t\tUIView *view = info.info.uikit.window.rootViewController.view;\n#endif\n\t\t\tif (@available(iOS 11.0, tvOS 11.0, *))\n\t\t\t{\n\t\t\t\tUIEdgeInsets insets = view.safeAreaInsets;\n\n\t\t\t\trect.x += insets.left;\n\t\t\t\trect.w -= insets.left;\n\n\t\t\t\trect.w -= insets.right;\n\n\t\t\t\trect.y += insets.top;\n\t\t\t\trect.h -= insets.top;\n\n\t\t\t\trect.h -= insets.bottom;\n\t\t\t}\n\t\t}\n\n\t\treturn rect;\n\t}\n}\n\n} // ios\n} // love\n\n#endif // LOVE_IOS\n"
  },
  {
    "path": "src/common/macos.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"config.h\"\n\n#ifdef LOVE_MACOS\n\n#include <string>\n\ntypedef struct SDL_Window SDL_Window;\n\nnamespace love\n{\nnamespace macos\n{\n\n/**\n * Returns the filepath of the first detected love file in the Resources folder\n * in the main bundle (love.app.)\n * Returns an empty string if no love file is found.\n **/\nLOVE_EXPORT std::string getLoveInResources();\n\n/**\n * Checks for drop-file events. Returns the filepath if an event occurred, or\n * an empty string otherwise.\n **/\nLOVE_EXPORT std::string checkDropEvents();\n\n/**\n * Bounce the dock icon, if the app isn't in the foreground.\n **/\nvoid requestAttention(bool continuous);\n\n/**\n * Sets whether vsync is enabled for the given CAMetalLayer\n **/\nvoid setMetalLayerVSync(void *metallayer, bool vsync);\nbool getMetalLayerVSync(void *metallayer);\n\n/**\n * Explicitly sets the window's color space to be sRGB - which stops the OS\n * from interpreting the backbuffer output as P3 on P3-capable displays.\n **/\nvoid setWindowSRGBColorSpace(SDL_Window *window);\n\n} // macos\n} // love\n\n#endif // LOVE_MACOS\n"
  },
  {
    "path": "src/common/macos.mm",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"macos.h\"\n\n#ifdef LOVE_MACOS\n\n#import <Foundation/Foundation.h>\n#import <Cocoa/Cocoa.h>\n#import <QuartzCore/CAMetalLayer.h>\n\n#if __has_include(<SDL3/SDL.h>)\n#include <SDL3/SDL.h>\n#else\n#include <SDL.h>\n#include <SDL_syswm.h>\n#endif\n\nnamespace love\n{\nnamespace macos\n{\n\nstd::string getLoveInResources()\n{\n\tstd::string path;\n\n\t@autoreleasepool\n\t{\n\t\t// Check to see if there are any .love files in Resources.\n\t\tNSString *lovepath = [[NSBundle mainBundle] pathForResource:nil ofType:@\"love\"];\n\n\t\tif (lovepath != nil)\n\t\t\tpath = lovepath.UTF8String;\n\t}\n\n\treturn path;\n}\n\nstd::string checkDropEvents()\n{\n\tstd::string dropstr;\n\tSDL_Event event;\n\n\tSDL_InitSubSystem(SDL_INIT_VIDEO);\n\n\tSDL_PumpEvents();\n#if SDL_VERSION_ATLEAST(3, 0, 0)\n\tif (SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_EVENT_DROP_FILE, SDL_EVENT_DROP_FILE) > 0)\n\t{\n\t\tif (event.type == SDL_EVENT_DROP_FILE)\n\t\t\tdropstr = std::string(event.drop.data);\n\t}\n#else\n\tif (SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_DROPFILE, SDL_DROPFILE) > 0)\n\t{\n\t\tif (event.type == SDL_DROPFILE)\n\t\t{\n\t\t\tdropstr = std::string(event.drop.file);\n\t\t\tSDL_free(event.drop.file);\n\t\t}\n\t}\n#endif\n\n\tSDL_QuitSubSystem(SDL_INIT_VIDEO);\n\n\treturn dropstr;\n}\n\nvoid requestAttention(bool continuous)\n{\n\t@autoreleasepool\n\t{\n\t\tif (continuous)\n\t\t\t[NSApp requestUserAttention:NSCriticalRequest];\n\t\telse\n\t\t\t[NSApp requestUserAttention:NSInformationalRequest];\n\t}\n}\n\nvoid setMetalLayerVSync(void *metallayer, bool vsync)\n{\n\t@autoreleasepool\n\t{\n\t\tif (@available(macOS 10.13, *))\n\t\t{\n\t\t\tCAMetalLayer *layer = (__bridge CAMetalLayer *) metallayer;\n\t\t\tlayer.displaySyncEnabled = vsync;\n\t\t}\n\t}\n}\n\nbool getMetalLayerVSync(void *metallayer)\n{\n\t@autoreleasepool\n\t{\n\t\tif (@available(macOS 10.13, *))\n\t\t{\n\t\t\tCAMetalLayer *layer = (__bridge CAMetalLayer *) metallayer;\n\t\t\treturn layer.displaySyncEnabled;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nvoid setWindowSRGBColorSpace(SDL_Window *window)\n{\n\t@autoreleasepool\n\t{\n\t\t// This works on earlier macOS versions, but performance may be worse\n\t\t// (at least, it was back when I tested in December 2016).\n\t\tif (@available(macOS 11.0, *))\n\t\t{\n#if SDL_VERSION_ATLEAST(3, 0, 0)\n\t\t\tSDL_PropertiesID props = SDL_GetWindowProperties(window);\n\t\t\tNSWindow *window = (__bridge NSWindow *) SDL_GetPointerProperty(props, SDL_PROP_WINDOW_COCOA_WINDOW_POINTER, nullptr);\n\t\t\twindow.colorSpace = [NSColorSpace sRGBColorSpace];\n#else\n\t\t\tSDL_SysWMinfo info = {};\n\t\t\tif (SDL_GetWindowWMInfo(window, &info))\n\t\t\t\tinfo.info.cocoa.window.colorSpace = [NSColorSpace sRGBColorSpace];\n#endif\n\t\t}\n\t}\n}\n\n} // macos\n} // love\n\n#endif // LOVE_MACOS\n"
  },
  {
    "path": "src/common/math.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_MATH_H\n#define LOVE_MATH_H\n\n#include <climits> // for CHAR_BIT\n#include <cstdlib> // for rand() and RAND_MAX\n\n/* Definitions of useful mathematical constants\n * M_E        - e\n * M_LOG2E    - log2(e)\n * M_LOG10E   - log10(e)\n * M_LN2      - ln(2)\n * M_LN10     - ln(10)\n * M_PI       - pi\n * M_PI_2     - pi/2\n * M_PI_4     - pi/4\n * M_1_PI     - 1/pi\n * M_2_PI     - 2/pi\n * M_2_SQRTPI - 2/sqrt(pi)\n * M_SQRT2    - sqrt(2)\n * M_SQRT1_2  - 1/sqrt(2)\n */\n\n#define LOVE_M_E        2.71828182845904523536\n#define LOVE_M_LOG2E    1.44269504088896340736\n#define LOVE_M_LOG10E   0.434294481903251827651\n#define LOVE_M_LN2      0.693147180559945309417\n#define LOVE_M_LN10     2.30258509299404568402\n#define LOVE_M_PI       3.14159265358979323846\n#define LOVE_M_PI_2     1.57079632679489661923\n#define LOVE_M_PI_4     0.785398163397448309616\n#define LOVE_M_1_PI     0.318309886183790671538\n#define LOVE_M_2_PI     0.636619772367581343076\n#define LOVE_M_2_SQRTPI 1.12837916709551257390\n#define LOVE_M_SQRT2    1.41421356237309504880\n#define LOVE_M_SQRT1_2  0.707106781186547524401\n#define LOVE_M_TORAD\t(float)(LOVE_M_PI/180.0)\n#define LOVE_M_TODEG    (float)(180.0/LOVE_M_PI)\n#define LOVE_TORAD(x)\t(float)(x*LOVE_M_TORAD)\n#define LOVE_TODEG(x)\t(float)(x*LOVE_M_TODEG)\n\nnamespace love\n{\n\nstruct Rect\n{\n\tint x, y;\n\tint w, h;\n\n\tbool operator == (const Rect &rhs) const\n\t{\n\t\treturn x == rhs.x && y == rhs.y && w == rhs.w && h == rhs.h;\n\t}\n};\n\ninline int nextP2(int x)\n{\n\tx += (x == 0);\n\tx--;\n\tfor (unsigned int i = 1; i < sizeof(int)*CHAR_BIT; i <<= 1) x |= x >> i;\n\treturn ++x;\n}\n\ninline float nextP2(float x)\n{\n\treturn (float) nextP2((int) x);\n}\n\n} // love\n\n#endif // LOVE_MATH_H\n"
  },
  {
    "path": "src/common/memory.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"config.h\"\n#include \"memory.h\"\n\n#include <stdlib.h>\n\n#ifdef LOVE_WINDOWS\n#define WIN32_LEAN_AND_MEAN\n#include <malloc.h>\n#include <Windows.h>\n#else\n#include <unistd.h> // Assume POSIX support.\n#endif\n\nnamespace love\n{\n\nbool alignedMalloc(void **mem, size_t size, size_t alignment)\n{\n#ifdef LOVE_WINDOWS\n\t*mem = _aligned_malloc(size, alignment);\n\treturn *mem != nullptr;\n#else\n\treturn posix_memalign(mem, alignment, size) == 0;\n#endif\n}\n\nvoid alignedFree(void *mem)\n{\n#ifdef LOVE_WINDOWS\n\t_aligned_free(mem);\n#else\n\tfree(mem);\n#endif\n}\n\nsize_t getPageSize()\n{\n#ifdef LOVE_WINDOWS\n\tstatic DWORD size = 0;\n\tif (size == 0)\n\t{\n\t\tSYSTEM_INFO si;\n\t\tGetSystemInfo(&si);\n\t\tsize = si.dwPageSize;\n\t}\n\n\treturn (size_t) size;\n#else\n\tstatic const long size = sysconf(_SC_PAGESIZE);\n\treturn size > 0 ? (size_t) size : 4096;\n#endif\n}\n\nsize_t alignUp(size_t size, size_t alignment)\n{\n\treturn (size + alignment - 1) & (~(alignment - 1));\n}\n\n} // love\n"
  },
  {
    "path": "src/common/memory.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include <stddef.h>\n\nnamespace love\n{\n\nbool alignedMalloc(void **mem, size_t size, size_t alignment);\nvoid alignedFree(void *mem);\n\nsize_t getPageSize();\n\n/**\n * 'alignment' must be a power of two.\n **/\nsize_t alignUp(size_t size, size_t alignment);\n\n} // love\n"
  },
  {
    "path": "src/common/pixelformat.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"pixelformat.h\"\n#include \"StringMap.h\"\n\nnamespace love\n{\n\nstatic PixelFormatInfo formatInfo[] =\n{\n\t// components, blockW, blockH, blockSize, color, depth, stencil, compressed, sRGB, dataType\n    { 0, 1, 1, 0, false, false, false, false, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_UNKNOWN\n\n\t{ 0, 1, 1, 0, true, false, false, false, false, PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_NORMAL\n\t{ 0, 1, 1, 0, true, false, false, false, false, PIXELFORMATTYPE_SFLOAT }, // PIXELFORMAT_HDR\n\n\t{ 1, 1, 1, 1, true, false, false, false, false, PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_R8_UNORM\n\t{ 1, 1, 1, 1, true, false, false, false, false, PIXELFORMATTYPE_SINT   }, // PIXELFORMAT_R8_INT\n\t{ 1, 1, 1, 1, true, false, false, false, false, PIXELFORMATTYPE_UINT   }, // PIXELFORMAT_R8_UINT\n\t{ 1, 1, 1, 2, true, false, false, false, false, PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_R16_UNORM\n\t{ 1, 1, 1, 2, true, false, false, false, false, PIXELFORMATTYPE_SFLOAT }, // PIXELFORMAT_R16_FLOAT\n\t{ 1, 1, 1, 2, true, false, false, false, false, PIXELFORMATTYPE_SINT   }, // PIXELFORMAT_R16_INT\n\t{ 1, 1, 1, 2, true, false, false, false, false, PIXELFORMATTYPE_UINT   }, // PIXELFORMAT_R16_UINT\n\t{ 1, 1, 1, 4, true, false, false, false, false, PIXELFORMATTYPE_SFLOAT }, // PIXELFORMAT_R32_FLOAT\n\t{ 1, 1, 1, 4, true, false, false, false, false, PIXELFORMATTYPE_SINT   }, // PIXELFORMAT_R32_INT\n\t{ 1, 1, 1, 4, true, false, false, false, false, PIXELFORMATTYPE_UINT   }, // PIXELFORMAT_R32_UINT\n\n\t{ 2, 1, 1, 2, true, false, false, false, false, PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_RG8_UNORM\n\t{ 2, 1, 1, 2, true, false, false, false, false, PIXELFORMATTYPE_SINT   }, // PIXELFORMAT_RG8_INT\n\t{ 2, 1, 1, 2, true, false, false, false, false, PIXELFORMATTYPE_UINT   }, // PIXELFORMAT_RG8_UINT\n\t{ 2, 1, 1, 2, true, false, false, false, false, PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_LA8_UNORM\n\t{ 2, 1, 1, 4, true, false, false, false, false, PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_RG16_UNORM\n\t{ 2, 1, 1, 4, true, false, false, false, false, PIXELFORMATTYPE_SFLOAT }, // PIXELFORMAT_RG16_FLOAT\n\t{ 2, 1, 1, 4, true, false, false, false, false, PIXELFORMATTYPE_SINT   }, // PIXELFORMAT_RG16_INT\n\t{ 2, 1, 1, 4, true, false, false, false, false, PIXELFORMATTYPE_UINT   }, // PIXELFORMAT_RG16_UINT\n\t{ 2, 1, 1, 8, true, false, false, false, false, PIXELFORMATTYPE_SFLOAT }, // PIXELFORMAT_RG32_FLOAT\n\t{ 2, 1, 1, 8, true, false, false, false, false, PIXELFORMATTYPE_SINT   }, // PIXELFORMAT_RG32_INT\n\t{ 2, 1, 1, 8, true, false, false, false, false, PIXELFORMATTYPE_UINT   }, // PIXELFORMAT_RG32_UINT\n\n\t{ 4, 1, 1, 4,  true, false, false, false, false, PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_RGBA8_UNORM\n\t{ 4, 1, 1, 4,  true, false, false, false, true,  PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_RGBA8_sRGB\n\t{ 4, 1, 1, 4,  true, false, false, false, false, PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_BGRA8_UNORM\n\t{ 4, 1, 1, 4,  true, false, false, false, true,  PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_BGRA8_sRGB\n\t{ 4, 1, 1, 4,  true, false, false, false, false, PIXELFORMATTYPE_SINT   }, // PIXELFORMAT_RGBA8_INT\n\t{ 4, 1, 1, 4,  true, false, false, false, false, PIXELFORMATTYPE_UINT   }, // PIXELFORMAT_RGBA8_UINT\n\t{ 4, 1, 1, 8,  true, false, false, false, false, PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_RGBA16_UNORM\n\t{ 4, 1, 1, 8,  true, false, false, false, false, PIXELFORMATTYPE_SFLOAT }, // PIXELFORMAT_RGBA16_FLOAT\n\t{ 4, 1, 1, 8,  true, false, false, false, false, PIXELFORMATTYPE_SINT   }, // PIXELFORMAT_RGBA16_INT\n\t{ 4, 1, 1, 8,  true, false, false, false, false, PIXELFORMATTYPE_UINT   }, // PIXELFORMAT_RGBA16_UINT\n\t{ 4, 1, 1, 16, true, false, false, false, false, PIXELFORMATTYPE_SFLOAT }, // PIXELFORMAT_RGBA32_FLOAT\n\t{ 4, 1, 1, 16, true, false, false, false, false, PIXELFORMATTYPE_SINT   }, // PIXELFORMAT_RGBA32_INT\n\t{ 4, 1, 1, 16, true, false, false, false, false, PIXELFORMATTYPE_UINT   }, // PIXELFORMAT_RGBA32_UINT\n\n\t{ 4, 1, 1, 2, true, false, false, false, false, PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_RGBA4_UNORM\n\t{ 4, 1, 1, 2, true, false, false, false, false, PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_RGB5A1_UNORM\n\t{ 3, 1, 1, 2, true, false, false, false, false, PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_RGB565_UNORM\n\t{ 4, 1, 1, 4, true, false, false, false, false, PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_RGB10A2_UNORM\n\t{ 3, 1, 1, 4, true, false, false, false, false, PIXELFORMATTYPE_UFLOAT }, // PIXELFORMAT_RG11B10_FLOAT\n\n\t{ 1, 1, 1, 1, false, false, true , false, false, PIXELFORMATTYPE_UINT   }, // PIXELFORMAT_STENCIL8\n\t{ 1, 1, 1, 2, false, true,  false, false, false, PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_DEPTH16_UNORM\n\t{ 1, 1, 1, 3, false, true,  false, false, false, PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_DEPTH24_UNORM\n\t{ 1, 1, 1, 4, false, true,  false, false, false, PIXELFORMATTYPE_SFLOAT }, // PIXELFORMAT_DEPTH32_FLOAT\n\t{ 2, 1, 1, 4, false, true,  true , false, false, PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_DEPTH24_UNORM_STENCIL8\n\t{ 2, 1, 1, 5, false, true,  true , false, false, PIXELFORMATTYPE_SFLOAT }, // PIXELFORMAT_DEPTH32_FLOAT_STENCIL8\n\n\t{ 3, 4, 4, 8,  true, false, false, true, false, PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_DXT1_UNORM\n\t{ 3, 4, 4, 8,  true, false, false, true, true,  PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_DXT1_sRGB\n\t{ 4, 4, 4, 16, true, false, false, true, false, PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_DXT3_UNORM\n\t{ 4, 4, 4, 16, true, false, false, true, true,  PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_DXT3_sRGB\n\t{ 4, 4, 4, 16, true, false, false, true, false, PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_DXT5_UNORM\n\t{ 4, 4, 4, 16, true, false, false, true, true,  PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_DXT5_sRGB\n\t{ 1, 4, 4, 8,  true, false, false, true, false, PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_BC4_UNORM\n\t{ 1, 4, 4, 8,  true, false, false, true, false, PIXELFORMATTYPE_SNORM  }, // PIXELFORMAT_BC4_SNORM\n\t{ 2, 4, 4, 16, true, false, false, true, false, PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_BC5_UNORM\n\t{ 2, 4, 4, 16, true, false, false, true, false, PIXELFORMATTYPE_SNORM  }, // PIXELFORMAT_BC5_SNORM\n\t{ 3, 4, 4, 16, true, false, false, true, false, PIXELFORMATTYPE_UFLOAT }, // PIXELFORMAT_BC6H_UFLOAT\n\t{ 3, 4, 4, 16, true, false, false, true, false, PIXELFORMATTYPE_SFLOAT }, // PIXELFORMAT_BC6H_FLOAT\n\t{ 4, 4, 4, 16, true, false, false, true, false, PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_BC7_UNORM\n\t{ 4, 4, 4, 16, true, false, false, true, true,  PIXELFORMATTYPE_UNORM  }, // PIXELFORMAT_BC7_sRGB\n\n\t{ 3, 16, 8, 32, true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_PVR1_RGB2_UNORM\n\t{ 3, 16, 8, 32, true, false, false, true, true,  PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_PVR1_RGB2_sRGB\n\t{ 3, 8,  8, 32, true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_PVR1_RGB4_UNORM\n\t{ 3, 8,  8, 32, true, false, false, true, true,  PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_PVR1_RGB4_sRGB\n\t{ 4, 16, 8, 32, true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_PVR1_RGBA2_UNORM\n\t{ 4, 16, 8, 32, true, false, false, true, true,  PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_PVR1_RGBA2_sRGB\n\t{ 4, 8,  8, 32, true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_PVR1_RGBA4_UNORM\n\t{ 4, 8,  8, 32, true, false, false, true, true,  PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_PVR1_RGBA4_sRGB\n\n\t{ 3, 4, 4, 8,  true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ETC1_UNORM\n\t{ 3, 4, 4, 8,  true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ETC2_RGB_UNORM\n\t{ 3, 4, 4, 8,  true, false, false, true, true,  PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ETC2_RGB_sRGB\n\t{ 4, 4, 4, 16, true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ETC2_RGBA_UNORM\n\t{ 4, 4, 4, 16, true, false, false, true, true,  PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ETC2_RGBA_sRGB\n\t{ 4, 4, 4, 8,  true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ETC2_RGBA1_UNORM\n\t{ 4, 4, 4, 8,  true, false, false, true, true,  PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ETC2_RGBA1_sRGB\n\t{ 1, 4, 4, 8,  true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_EAC_R_UNORM\n\t{ 1, 4, 4, 8,  true, false, false, true, false, PIXELFORMATTYPE_SNORM }, // PIXELFORMAT_EAC_R_SNORM\n\t{ 2, 4, 4, 16, true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_EAC_RG_UNORM\n\t{ 2, 4, 4, 16, true, false, false, true, false, PIXELFORMATTYPE_SNORM }, // PIXELFORMAT_EAC_RG_SNORM\n\n\t{ 4, 4,  4,  1, true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_4x4_UNORM\n\t{ 4, 5,  4,  1, true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_5x4_UNORM\n\t{ 4, 5,  5,  1, true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_5x5_UNORM\n\t{ 4, 6,  5,  1, true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_6x5_UNORM\n\t{ 4, 6,  6,  1, true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_6x6_UNORM\n\t{ 4, 8,  5,  1, true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_8x5_UNORM\n\t{ 4, 8,  6,  1, true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_8x6_UNORM\n\t{ 4, 8,  8,  1, true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_8x8_UNORM\n\t{ 4, 8,  5,  1, true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_10x5_UNORM\n\t{ 4, 10, 6,  1, true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_10x6_UNORM\n\t{ 4, 10, 8,  1, true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_10x8_UNORM\n\t{ 4, 10, 10, 1, true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_10x10_UNORM\n\t{ 4, 12, 10, 1, true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_12x10_UNORM\n\t{ 4, 12, 12, 1, true, false, false, true, false, PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_12x12_UNORM\n\t{ 4, 4,  4,  1, true, false, false, true, true,  PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_4x4_sRGB\n\t{ 4, 5,  4,  1, true, false, false, true, true,  PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_5x4_sRGB\n\t{ 4, 5,  5,  1, true, false, false, true, true,  PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_5x5_sRGB\n\t{ 4, 6,  5,  1, true, false, false, true, true,  PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_6x5_sRGB\n\t{ 4, 6,  6,  1, true, false, false, true, true,  PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_6x6_sRGB\n\t{ 4, 8,  5,  1, true, false, false, true, true,  PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_8x5_sRGB\n\t{ 4, 8,  6,  1, true, false, false, true, true,  PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_8x6_sRGB\n\t{ 4, 8,  8,  1, true, false, false, true, true,  PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_8x8_sRGB\n\t{ 4, 8,  5,  1, true, false, false, true, true,  PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_10x5_sRGB\n\t{ 4, 10, 6,  1, true, false, false, true, true,  PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_10x6_sRGB\n\t{ 4, 10, 8,  1, true, false, false, true, true,  PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_10x8_sRGB\n\t{ 4, 10, 10, 1, true, false, false, true, true,  PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_10x10_sRGB\n\t{ 4, 12, 10, 1, true, false, false, true, true,  PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_12x10_sRGB\n\t{ 4, 12, 12, 1, true, false, false, true, true,  PIXELFORMATTYPE_UNORM }, // PIXELFORMAT_ASTC_12x12_sRGB\n};\n\nstatic_assert(sizeof(formatInfo) / sizeof(PixelFormatInfo) == PIXELFORMAT_MAX_ENUM, \"Update the formatInfo array when adding or removing a PixelFormat\");\n\nstatic StringMap<PixelFormat, PIXELFORMAT_MAX_ENUM>::Entry formatEntries[] =\n{\n    { \"unknown\", PIXELFORMAT_UNKNOWN },\n\n\t{ \"normal\",  PIXELFORMAT_NORMAL  },\n\t{ \"hdr\",     PIXELFORMAT_HDR     },\n\n\t{ \"r8\",    PIXELFORMAT_R8_UNORM  },\n\t{ \"r8i\",   PIXELFORMAT_R8_INT    },\n\t{ \"r8ui\",  PIXELFORMAT_R8_UINT   },\n\t{ \"r16\",   PIXELFORMAT_R16_UNORM },\n\t{ \"r16f\",  PIXELFORMAT_R16_FLOAT },\n\t{ \"r16i\",  PIXELFORMAT_R16_INT   },\n\t{ \"r16ui\", PIXELFORMAT_R16_UINT  },\n\t{ \"r32f\",  PIXELFORMAT_R32_FLOAT },\n\t{ \"r32i\",  PIXELFORMAT_R32_INT   },\n\t{ \"r32ui\", PIXELFORMAT_R32_UINT  },\n\n\t{ \"rg8\",    PIXELFORMAT_RG8_UNORM  },\n\t{ \"rg8i\",   PIXELFORMAT_RG8_INT    },\n\t{ \"rg8ui\",  PIXELFORMAT_RG8_UINT   },\n\t{ \"la8\",    PIXELFORMAT_LA8_UNORM  },\n\t{ \"rg16\",   PIXELFORMAT_RG16_UNORM },\n\t{ \"rg16f\",  PIXELFORMAT_RG16_FLOAT },\n\t{ \"rg16i\",  PIXELFORMAT_RG16_INT   },\n\t{ \"rg16ui\", PIXELFORMAT_RG16_UINT  },\n\t{ \"rg32f\",  PIXELFORMAT_RG32_FLOAT },\n\t{ \"rg32i\",  PIXELFORMAT_RG32_INT   },\n\t{ \"rg32ui\", PIXELFORMAT_RG32_UINT  },\n\n\t{ \"rgba8\",     PIXELFORMAT_RGBA8_UNORM  },\n\t{ \"srgba8\",    PIXELFORMAT_RGBA8_sRGB   },\n\t{ \"bgra8\",     PIXELFORMAT_BGRA8_UNORM  },\n\t{ \"bgra8srgb\", PIXELFORMAT_BGRA8_sRGB   },\n\t{ \"rgba8i\",    PIXELFORMAT_RGBA8_INT    },\n\t{ \"rgba8ui\",   PIXELFORMAT_RGBA8_UINT   },\n\t{ \"rgba16\",    PIXELFORMAT_RGBA16_UNORM },\n\t{ \"rgba16f\",   PIXELFORMAT_RGBA16_FLOAT },\n\t{ \"rgba16i\",   PIXELFORMAT_RGBA16_INT   },\n\t{ \"rgba16ui\",  PIXELFORMAT_RGBA16_UINT  },\n\t{ \"rgba32f\",   PIXELFORMAT_RGBA32_FLOAT },\n\t{ \"rgba32i\",   PIXELFORMAT_RGBA32_INT   },\n\t{ \"rgba32ui\",  PIXELFORMAT_RGBA32_UINT  },\n\n\t{ \"rgba4\",    PIXELFORMAT_RGBA4_UNORM    },\n\t{ \"rgb5a1\",   PIXELFORMAT_RGB5A1_UNORM   },\n\t{ \"rgb565\",   PIXELFORMAT_RGB565_UNORM   },\n\t{ \"rgb10a2\",  PIXELFORMAT_RGB10A2_UNORM  },\n\t{ \"rg11b10f\", PIXELFORMAT_RG11B10_FLOAT  },\n\n\t{ \"stencil8\",         PIXELFORMAT_STENCIL8               },\n\t{ \"depth16\",          PIXELFORMAT_DEPTH16_UNORM          },\n\t{ \"depth24\",          PIXELFORMAT_DEPTH24_UNORM          },\n\t{ \"depth32f\",         PIXELFORMAT_DEPTH32_FLOAT          },\n\t{ \"depth24stencil8\",  PIXELFORMAT_DEPTH24_UNORM_STENCIL8 },\n\t{ \"depth32fstencil8\", PIXELFORMAT_DEPTH32_FLOAT_STENCIL8 },\n\t\n\t{ \"DXT1\",     PIXELFORMAT_DXT1_UNORM  },\n\t{ \"DXT1srgb\", PIXELFORMAT_DXT1_sRGB   },\n\t{ \"DXT3\",     PIXELFORMAT_DXT3_UNORM  },\n\t{ \"DXT3srgb\", PIXELFORMAT_DXT3_sRGB   },\n\t{ \"DXT5\",     PIXELFORMAT_DXT5_UNORM  },\n\t{ \"DXT5srgb\", PIXELFORMAT_DXT5_sRGB   },\n\t{ \"BC4\",      PIXELFORMAT_BC4_UNORM   },\n\t{ \"BC4s\",     PIXELFORMAT_BC4_SNORM   },\n\t{ \"BC5\",      PIXELFORMAT_BC5_UNORM   },\n\t{ \"BC5s\",     PIXELFORMAT_BC5_SNORM   },\n\t{ \"BC6h\",     PIXELFORMAT_BC6H_UFLOAT },\n\t{ \"BC6hs\",    PIXELFORMAT_BC6H_FLOAT  },\n\t{ \"BC7\",      PIXELFORMAT_BC7_UNORM   },\n\t{ \"BC7srgb\",  PIXELFORMAT_BC7_sRGB    },\n\n\t{ \"PVR1rgb2\",      PIXELFORMAT_PVR1_RGB2_UNORM  },\n\t{ \"PVR1rgb2srgb\",  PIXELFORMAT_PVR1_RGB2_sRGB   },\n\t{ \"PVR1rgb4\",      PIXELFORMAT_PVR1_RGB4_UNORM  },\n\t{ \"PVR1rgb4srgb\",  PIXELFORMAT_PVR1_RGB4_sRGB   },\n\t{ \"PVR1rgba2\",     PIXELFORMAT_PVR1_RGBA2_UNORM },\n\t{ \"PVR1rgba2srgb\", PIXELFORMAT_PVR1_RGBA2_sRGB  },\n\t{ \"PVR1rgba4\",     PIXELFORMAT_PVR1_RGBA4_UNORM },\n\t{ \"PVR1rgba4srgb\", PIXELFORMAT_PVR1_RGBA4_sRGB  },\n\n\t{ \"ETC1\",       PIXELFORMAT_ETC1_UNORM       },\n\t{ \"ETC2rgb\",    PIXELFORMAT_ETC2_RGB_UNORM   },\n\t{ \"ETC2srgb\",   PIXELFORMAT_ETC2_RGB_sRGB    },\n\t{ \"ETC2rgba\",   PIXELFORMAT_ETC2_RGBA_UNORM  },\n\t{ \"ETC2srgba\",  PIXELFORMAT_ETC2_RGBA_sRGB   },\n\t{ \"ETC2rgba1\",  PIXELFORMAT_ETC2_RGBA1_UNORM },\n\t{ \"ETC2srgba1\", PIXELFORMAT_ETC2_RGBA1_sRGB  },\n\t{ \"EACr\",       PIXELFORMAT_EAC_R_UNORM      },\n\t{ \"EACrs\",      PIXELFORMAT_EAC_R_SNORM      },\n\t{ \"EACrg\",      PIXELFORMAT_EAC_RG_UNORM     },\n\t{ \"EACrgs\",     PIXELFORMAT_EAC_RG_SNORM     },\n\n\t{ \"ASTC4x4\",       PIXELFORMAT_ASTC_4x4_UNORM   },\n\t{ \"ASTC5x4\",       PIXELFORMAT_ASTC_5x4_UNORM   },\n\t{ \"ASTC5x5\",       PIXELFORMAT_ASTC_5x5_UNORM   },\n\t{ \"ASTC6x5\",       PIXELFORMAT_ASTC_6x5_UNORM   },\n\t{ \"ASTC6x6\",       PIXELFORMAT_ASTC_6x6_UNORM   },\n\t{ \"ASTC8x5\",       PIXELFORMAT_ASTC_8x5_UNORM   },\n\t{ \"ASTC8x6\",       PIXELFORMAT_ASTC_8x6_UNORM   },\n\t{ \"ASTC8x8\",       PIXELFORMAT_ASTC_8x8_UNORM   },\n\t{ \"ASTC10x5\",      PIXELFORMAT_ASTC_10x5_UNORM  },\n\t{ \"ASTC10x6\",      PIXELFORMAT_ASTC_10x6_UNORM  },\n\t{ \"ASTC10x8\",      PIXELFORMAT_ASTC_10x8_UNORM  },\n\t{ \"ASTC10x10\",     PIXELFORMAT_ASTC_10x10_UNORM },\n\t{ \"ASTC12x10\",     PIXELFORMAT_ASTC_12x10_UNORM },\n\t{ \"ASTC12x12\",     PIXELFORMAT_ASTC_12x12_UNORM },\n\t{ \"ASTC4x4srgb\",   PIXELFORMAT_ASTC_4x4_sRGB    },\n\t{ \"ASTC5x4srgb\",   PIXELFORMAT_ASTC_5x4_sRGB    },\n\t{ \"ASTC5x5srgb\",   PIXELFORMAT_ASTC_5x5_sRGB    },\n\t{ \"ASTC6x5srgb\",   PIXELFORMAT_ASTC_6x5_sRGB    },\n\t{ \"ASTC6x6srgb\",   PIXELFORMAT_ASTC_6x6_sRGB    },\n\t{ \"ASTC8x5srgb\",   PIXELFORMAT_ASTC_8x5_sRGB    },\n\t{ \"ASTC8x6srgb\",   PIXELFORMAT_ASTC_8x6_sRGB    },\n\t{ \"ASTC8x8srgb\",   PIXELFORMAT_ASTC_8x8_sRGB    },\n\t{ \"ASTC10x5srgb\",  PIXELFORMAT_ASTC_10x5_sRGB   },\n\t{ \"ASTC10x6srgb\",  PIXELFORMAT_ASTC_10x6_sRGB   },\n\t{ \"ASTC10x8srgb\",  PIXELFORMAT_ASTC_10x8_sRGB   },\n\t{ \"ASTC10x10srgb\", PIXELFORMAT_ASTC_10x10_sRGB  },\n\t{ \"ASTC12x10srgb\", PIXELFORMAT_ASTC_12x10_sRGB  },\n\t{ \"ASTC12x12srgb\", PIXELFORMAT_ASTC_12x12_sRGB  },\n};\n\nstatic_assert(sizeof(formatEntries) / sizeof(formatEntries[0]) == (size_t) PIXELFORMAT_MAX_ENUM, \"pixel format string map is missing entries!\");\n\nstatic StringMap<PixelFormat, PIXELFORMAT_MAX_ENUM> formats(formatEntries, sizeof(formatEntries));\n\nbool getConstant(const char *in, PixelFormat &out)\n{\n\treturn formats.find(in, out);\n}\n\nbool getConstant(PixelFormat in, const char *&out)\n{\n\treturn formats.find(in, out);\n}\n\nconst PixelFormatInfo &getPixelFormatInfo(PixelFormat format)\n{\n\treturn formatInfo[format];\n}\n\nconst char *getPixelFormatName(PixelFormat format)\n{\n\tconst char *name = \"unknown\";\n\tgetConstant(format, name);\n\treturn name;\n}\n\nbool isPixelFormatCompressed(PixelFormat format)\n{\n\treturn formatInfo[format].compressed;\n}\n\nbool isPixelFormatColor(PixelFormat format)\n{\n\treturn formatInfo[format].color;\n}\n\nbool isPixelFormatDepthStencil(PixelFormat format)\n{\n\tconst PixelFormatInfo &info = formatInfo[format];\n\treturn info.depth || info.stencil;\n}\n\nbool isPixelFormatDepth(PixelFormat format)\n{\n\treturn formatInfo[format].depth;\n}\n\nbool isPixelFormatStencil(PixelFormat format)\n{\n\treturn formatInfo[format].stencil;\n}\n\nbool isPixelFormatSRGB(PixelFormat format)\n{\n\treturn formatInfo[format].sRGB;\n}\n\nbool isPixelFormatInteger(PixelFormat format)\n{\n\tauto type = formatInfo[format].dataType;\n\treturn type == PIXELFORMATTYPE_SINT || type == PIXELFORMATTYPE_UINT;\n}\n\nPixelFormat getSRGBPixelFormat(PixelFormat format)\n{\n\tswitch (format)\n\t{\n\tcase PIXELFORMAT_RGBA8_UNORM: return PIXELFORMAT_RGBA8_sRGB;\n\tcase PIXELFORMAT_BGRA8_UNORM: return PIXELFORMAT_BGRA8_sRGB;\n\tcase PIXELFORMAT_DXT1_UNORM: return PIXELFORMAT_DXT1_sRGB;\n\tcase PIXELFORMAT_DXT3_UNORM: return PIXELFORMAT_DXT3_sRGB;\n\tcase PIXELFORMAT_DXT5_UNORM: return PIXELFORMAT_DXT5_sRGB;\n\tcase PIXELFORMAT_BC7_UNORM: return PIXELFORMAT_BC7_sRGB;\n\tcase PIXELFORMAT_PVR1_RGB2_UNORM: return PIXELFORMAT_PVR1_RGB2_sRGB;\n\tcase PIXELFORMAT_PVR1_RGB4_UNORM: return PIXELFORMAT_PVR1_RGB4_sRGB;\n\tcase PIXELFORMAT_PVR1_RGBA2_UNORM: return PIXELFORMAT_PVR1_RGBA2_sRGB;\n\tcase PIXELFORMAT_PVR1_RGBA4_UNORM: return PIXELFORMAT_PVR1_RGBA4_sRGB;\n\tcase PIXELFORMAT_ETC1_UNORM: return PIXELFORMAT_ETC2_RGB_sRGB; // ETC2 can load ETC1 data.\n\tcase PIXELFORMAT_ETC2_RGB_UNORM: return PIXELFORMAT_ETC2_RGB_sRGB;\n\tcase PIXELFORMAT_ETC2_RGBA_UNORM: return PIXELFORMAT_ETC2_RGBA_sRGB;\n\tcase PIXELFORMAT_ETC2_RGBA1_UNORM: return PIXELFORMAT_ETC2_RGBA1_sRGB;\n\tcase PIXELFORMAT_ASTC_4x4_UNORM: return PIXELFORMAT_ASTC_4x4_sRGB;\n\tcase PIXELFORMAT_ASTC_5x4_UNORM: return PIXELFORMAT_ASTC_5x4_sRGB;\n\tcase PIXELFORMAT_ASTC_5x5_UNORM: return PIXELFORMAT_ASTC_5x5_sRGB;\n\tcase PIXELFORMAT_ASTC_6x5_UNORM: return PIXELFORMAT_ASTC_6x5_sRGB;\n\tcase PIXELFORMAT_ASTC_6x6_UNORM: return PIXELFORMAT_ASTC_6x6_sRGB;\n\tcase PIXELFORMAT_ASTC_8x5_UNORM: return PIXELFORMAT_ASTC_8x5_sRGB;\n\tcase PIXELFORMAT_ASTC_8x6_UNORM: return PIXELFORMAT_ASTC_8x6_sRGB;\n\tcase PIXELFORMAT_ASTC_8x8_UNORM: return PIXELFORMAT_ASTC_8x8_sRGB;\n\tcase PIXELFORMAT_ASTC_10x5_UNORM: return PIXELFORMAT_ASTC_10x5_sRGB;\n\tcase PIXELFORMAT_ASTC_10x6_UNORM: return PIXELFORMAT_ASTC_10x6_sRGB;\n\tcase PIXELFORMAT_ASTC_10x8_UNORM: return PIXELFORMAT_ASTC_10x8_sRGB;\n\tcase PIXELFORMAT_ASTC_10x10_UNORM: return PIXELFORMAT_ASTC_10x10_sRGB;\n\tcase PIXELFORMAT_ASTC_12x10_UNORM: return PIXELFORMAT_ASTC_12x10_sRGB;\n\tcase PIXELFORMAT_ASTC_12x12_UNORM: return PIXELFORMAT_ASTC_12x12_sRGB;\n\tdefault: return format;\n\t}\n}\n\nPixelFormat getLinearPixelFormat(PixelFormat format)\n{\n\tswitch (format)\n\t{\n\tcase PIXELFORMAT_RGBA8_sRGB: return PIXELFORMAT_RGBA8_UNORM;\n\tcase PIXELFORMAT_BGRA8_sRGB: return PIXELFORMAT_BGRA8_UNORM;\n\tcase PIXELFORMAT_DXT1_sRGB: return PIXELFORMAT_DXT1_UNORM;\n\tcase PIXELFORMAT_DXT3_sRGB: return PIXELFORMAT_DXT3_UNORM;\n\tcase PIXELFORMAT_DXT5_sRGB: return PIXELFORMAT_DXT5_UNORM;\n\tcase PIXELFORMAT_BC7_sRGB: return PIXELFORMAT_BC7_UNORM;\n\tcase PIXELFORMAT_PVR1_RGB2_sRGB: return PIXELFORMAT_PVR1_RGB2_UNORM;\n\tcase PIXELFORMAT_PVR1_RGB4_sRGB: return PIXELFORMAT_PVR1_RGB4_UNORM;\n\tcase PIXELFORMAT_PVR1_RGBA2_sRGB: return PIXELFORMAT_PVR1_RGBA2_UNORM;\n\tcase PIXELFORMAT_PVR1_RGBA4_sRGB: return PIXELFORMAT_PVR1_RGBA4_UNORM;\n\tcase PIXELFORMAT_ETC2_RGB_sRGB: return PIXELFORMAT_ETC2_RGB_UNORM;\n\tcase PIXELFORMAT_ETC2_RGBA_sRGB: return PIXELFORMAT_ETC2_RGBA_UNORM;\n\tcase PIXELFORMAT_ETC2_RGBA1_sRGB: return PIXELFORMAT_ETC2_RGBA1_UNORM;\n\tcase PIXELFORMAT_ASTC_4x4_sRGB: return PIXELFORMAT_ASTC_4x4_UNORM;\n\tcase PIXELFORMAT_ASTC_5x4_sRGB: return PIXELFORMAT_ASTC_5x4_UNORM;\n\tcase PIXELFORMAT_ASTC_5x5_sRGB: return PIXELFORMAT_ASTC_5x5_UNORM;\n\tcase PIXELFORMAT_ASTC_6x5_sRGB: return PIXELFORMAT_ASTC_6x5_UNORM;\n\tcase PIXELFORMAT_ASTC_6x6_sRGB: return PIXELFORMAT_ASTC_6x6_UNORM;\n\tcase PIXELFORMAT_ASTC_8x5_sRGB: return PIXELFORMAT_ASTC_8x5_UNORM;\n\tcase PIXELFORMAT_ASTC_8x6_sRGB: return PIXELFORMAT_ASTC_8x6_UNORM;\n\tcase PIXELFORMAT_ASTC_8x8_sRGB: return PIXELFORMAT_ASTC_8x8_UNORM;\n\tcase PIXELFORMAT_ASTC_10x5_sRGB: return PIXELFORMAT_ASTC_10x5_UNORM;\n\tcase PIXELFORMAT_ASTC_10x6_sRGB: return PIXELFORMAT_ASTC_10x6_UNORM;\n\tcase PIXELFORMAT_ASTC_10x8_sRGB: return PIXELFORMAT_ASTC_10x8_UNORM;\n\tcase PIXELFORMAT_ASTC_10x10_sRGB: return PIXELFORMAT_ASTC_10x10_UNORM;\n\tcase PIXELFORMAT_ASTC_12x10_sRGB: return PIXELFORMAT_ASTC_12x10_UNORM;\n\tcase PIXELFORMAT_ASTC_12x12_sRGB: return PIXELFORMAT_ASTC_12x12_UNORM;\n\tdefault: return format;\n\t}\n}\n\nsize_t getPixelFormatBlockSize(PixelFormat format)\n{\n\treturn formatInfo[format].blockSize;\n}\n\nsize_t getPixelFormatUncompressedRowSize(PixelFormat format, int width)\n{\n\tconst PixelFormatInfo &info = formatInfo[format];\n\tif (info.compressed) return 0;\n\treturn info.blockSize * width / info.blockWidth;\n}\n\nsize_t getPixelFormatCompressedBlockRowSize(PixelFormat format, int width)\n{\n\tconst PixelFormatInfo &info = formatInfo[format];\n\tif (!info.compressed) return 0;\n\treturn info.blockSize * ((width + info.blockWidth - 1) / info.blockWidth);\n}\n\nsize_t getPixelFormatCompressedBlockRowCount(PixelFormat format, int height)\n{\n\tconst PixelFormatInfo &info = formatInfo[format];\n\tif (!info.compressed) return 0;\n\treturn (height + info.blockHeight - 1) / info.blockHeight;\n}\n\nsize_t getPixelFormatSliceSize(PixelFormat format, int width, int height)\n{\n\tconst PixelFormatInfo &info = formatInfo[format];\n\tsize_t blockW = (width + info.blockWidth - 1) / info.blockWidth;\n\tsize_t blockH = (height + info.blockHeight - 1) / info.blockHeight;\n\treturn info.blockSize * blockW * blockH;\n}\n\nint getPixelFormatColorComponents(PixelFormat format)\n{\n\treturn formatInfo[format].components;\n}\n\n} // love\n"
  },
  {
    "path": "src/common/pixelformat.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"stddef.h\"\n\nnamespace love\n{\n\nenum PixelFormat\n{\n    PIXELFORMAT_UNKNOWN,\n\n\t// these are converted to an actual format by love\n\tPIXELFORMAT_NORMAL,\n\tPIXELFORMAT_HDR,\n\n\t// 1-channel normal formats\n\tPIXELFORMAT_R8_UNORM,\n\tPIXELFORMAT_R8_INT,\n\tPIXELFORMAT_R8_UINT,\n\tPIXELFORMAT_R16_UNORM,\n\tPIXELFORMAT_R16_FLOAT,\n\tPIXELFORMAT_R16_INT,\n\tPIXELFORMAT_R16_UINT,\n\tPIXELFORMAT_R32_FLOAT,\n\tPIXELFORMAT_R32_INT,\n\tPIXELFORMAT_R32_UINT,\n\n\t// 2-channel normal formats\n\tPIXELFORMAT_RG8_UNORM,\n\tPIXELFORMAT_RG8_INT,\n\tPIXELFORMAT_RG8_UINT,\n\tPIXELFORMAT_LA8_UNORM, // Same as RG8, but accessed as (L, L, L, A)\n\tPIXELFORMAT_RG16_UNORM,\n\tPIXELFORMAT_RG16_FLOAT,\n\tPIXELFORMAT_RG16_INT,\n\tPIXELFORMAT_RG16_UINT,\n\tPIXELFORMAT_RG32_FLOAT,\n\tPIXELFORMAT_RG32_INT,\n\tPIXELFORMAT_RG32_UINT,\n\n\t// 4-channel normal formats\n\tPIXELFORMAT_RGBA8_UNORM,\n\tPIXELFORMAT_RGBA8_sRGB,\n\tPIXELFORMAT_BGRA8_UNORM,\n\tPIXELFORMAT_BGRA8_sRGB,\n\tPIXELFORMAT_RGBA8_INT,\n\tPIXELFORMAT_RGBA8_UINT,\n\tPIXELFORMAT_RGBA16_UNORM,\n\tPIXELFORMAT_RGBA16_FLOAT,\n\tPIXELFORMAT_RGBA16_INT,\n\tPIXELFORMAT_RGBA16_UINT,\n\tPIXELFORMAT_RGBA32_FLOAT,\n\tPIXELFORMAT_RGBA32_INT,\n\tPIXELFORMAT_RGBA32_UINT,\n\n\t// packed formats\n\tPIXELFORMAT_RGBA4_UNORM,    // LSB->MSB: [a, b, g, r]\n\tPIXELFORMAT_RGB5A1_UNORM,   // LSB->MSB: [a, b, g, r]\n\tPIXELFORMAT_RGB565_UNORM,   // LSB->MSB: [b, g, r]\n\tPIXELFORMAT_RGB10A2_UNORM,  // LSB->MSB: [r, g, b, a]\n\tPIXELFORMAT_RG11B10_FLOAT,  // LSB->MSB: [r, g, b]\n\n\t// depth/stencil formats\n\tPIXELFORMAT_STENCIL8,\n\tPIXELFORMAT_DEPTH16_UNORM,\n\tPIXELFORMAT_DEPTH24_UNORM,\n\tPIXELFORMAT_DEPTH32_FLOAT,\n\tPIXELFORMAT_DEPTH24_UNORM_STENCIL8,\n\tPIXELFORMAT_DEPTH32_FLOAT_STENCIL8,\n\n\t// compressed formats\n\tPIXELFORMAT_DXT1_UNORM,\n\tPIXELFORMAT_DXT1_sRGB,\n\tPIXELFORMAT_DXT3_UNORM,\n\tPIXELFORMAT_DXT3_sRGB,\n\tPIXELFORMAT_DXT5_UNORM,\n\tPIXELFORMAT_DXT5_sRGB,\n\tPIXELFORMAT_BC4_UNORM,\n\tPIXELFORMAT_BC4_SNORM,\n\tPIXELFORMAT_BC5_UNORM,\n\tPIXELFORMAT_BC5_SNORM,\n\tPIXELFORMAT_BC6H_UFLOAT,\n\tPIXELFORMAT_BC6H_FLOAT,\n\tPIXELFORMAT_BC7_UNORM,\n\tPIXELFORMAT_BC7_sRGB,\n\n\tPIXELFORMAT_PVR1_RGB2_UNORM,\n\tPIXELFORMAT_PVR1_RGB2_sRGB,\n\tPIXELFORMAT_PVR1_RGB4_UNORM,\n\tPIXELFORMAT_PVR1_RGB4_sRGB,\n\tPIXELFORMAT_PVR1_RGBA2_UNORM,\n\tPIXELFORMAT_PVR1_RGBA2_sRGB,\n\tPIXELFORMAT_PVR1_RGBA4_UNORM,\n\tPIXELFORMAT_PVR1_RGBA4_sRGB,\n\n\tPIXELFORMAT_ETC1_UNORM,\n\tPIXELFORMAT_ETC2_RGB_UNORM,\n\tPIXELFORMAT_ETC2_RGB_sRGB,\n\tPIXELFORMAT_ETC2_RGBA_UNORM,\n\tPIXELFORMAT_ETC2_RGBA_sRGB,\n\tPIXELFORMAT_ETC2_RGBA1_UNORM,\n\tPIXELFORMAT_ETC2_RGBA1_sRGB,\n\tPIXELFORMAT_EAC_R_UNORM,\n\tPIXELFORMAT_EAC_R_SNORM,\n\tPIXELFORMAT_EAC_RG_UNORM,\n\tPIXELFORMAT_EAC_RG_SNORM,\n\n\tPIXELFORMAT_ASTC_4x4_UNORM,\n\tPIXELFORMAT_ASTC_5x4_UNORM,\n\tPIXELFORMAT_ASTC_5x5_UNORM,\n\tPIXELFORMAT_ASTC_6x5_UNORM,\n\tPIXELFORMAT_ASTC_6x6_UNORM,\n\tPIXELFORMAT_ASTC_8x5_UNORM,\n\tPIXELFORMAT_ASTC_8x6_UNORM,\n\tPIXELFORMAT_ASTC_8x8_UNORM,\n\tPIXELFORMAT_ASTC_10x5_UNORM,\n\tPIXELFORMAT_ASTC_10x6_UNORM,\n\tPIXELFORMAT_ASTC_10x8_UNORM,\n\tPIXELFORMAT_ASTC_10x10_UNORM,\n\tPIXELFORMAT_ASTC_12x10_UNORM,\n\tPIXELFORMAT_ASTC_12x12_UNORM,\n\tPIXELFORMAT_ASTC_4x4_sRGB,\n\tPIXELFORMAT_ASTC_5x4_sRGB,\n\tPIXELFORMAT_ASTC_5x5_sRGB,\n\tPIXELFORMAT_ASTC_6x5_sRGB,\n\tPIXELFORMAT_ASTC_6x6_sRGB,\n\tPIXELFORMAT_ASTC_8x5_sRGB,\n\tPIXELFORMAT_ASTC_8x6_sRGB,\n\tPIXELFORMAT_ASTC_8x8_sRGB,\n\tPIXELFORMAT_ASTC_10x5_sRGB,\n\tPIXELFORMAT_ASTC_10x6_sRGB,\n\tPIXELFORMAT_ASTC_10x8_sRGB,\n\tPIXELFORMAT_ASTC_10x10_sRGB,\n\tPIXELFORMAT_ASTC_12x10_sRGB,\n\tPIXELFORMAT_ASTC_12x12_sRGB,\n\n\tPIXELFORMAT_MAX_ENUM\n};\n\nenum PixelFormatType\n{\n\tPIXELFORMATTYPE_UNORM,\n\tPIXELFORMATTYPE_SNORM,\n\tPIXELFORMATTYPE_UFLOAT,\n\tPIXELFORMATTYPE_SFLOAT,\n\tPIXELFORMATTYPE_UINT,\n\tPIXELFORMATTYPE_SINT,\n};\n\nstruct PixelFormatInfo\n{\n\tint components;\n\tsize_t blockWidth;\n\tsize_t blockHeight;\n\tsize_t blockSize;\n\tbool color;\n\tbool depth;\n\tbool stencil;\n\tbool compressed;\n\tbool sRGB;\n\tPixelFormatType dataType;\n};\n\nbool getConstant(PixelFormat in, const char *&out);\nbool getConstant(const char *in, PixelFormat &out);\n\nconst PixelFormatInfo &getPixelFormatInfo(PixelFormat format);\n\n/**\n * Gets the name of the specified pixel format.\n **/\nconst char *getPixelFormatName(PixelFormat format);\n\n/**\n * Gets whether the specified pixel format is a compressed type.\n **/\nbool isPixelFormatCompressed(PixelFormat format);\n\n/**\n * Gets whether the specified pixel format is a color type.\n **/\nbool isPixelFormatColor(PixelFormat format);\n\n/**\n * Gets whether the specified pixel format is a depth or stencil type.\n **/\nbool isPixelFormatDepthStencil(PixelFormat format);\n\n/**\n * Gets whether the specified pixel format is a depth type.\n **/\nbool isPixelFormatDepth(PixelFormat format);\n\n/**\n * Gets whether the specified pixel format is a stencil type.\n **/\nbool isPixelFormatStencil(PixelFormat format);\n\n/**\n * Gets whether the specified color pixel format is sRGB-encoded.\n **/\nbool isPixelFormatSRGB(PixelFormat format);\n\n/**\n * Gets whether the specified pixel format is a signed or unsigned integer type.\n **/\nbool isPixelFormatInteger(PixelFormat format);\n\n/**\n * Gets the sRGB version of a linear pixel format, if applicable.\n **/\nPixelFormat getSRGBPixelFormat(PixelFormat format);\n\n/**\n * Gets the linear version of a sRGB pixel format, if applicable.\n **/\nPixelFormat getLinearPixelFormat(PixelFormat format);\n\n/**\n * Gets the block size in bytes of the specified pixel format.\n * This is the size in bytes of a pixel for uncompressed formats, but *not*\n * for compressed formats!\n **/\nsize_t getPixelFormatBlockSize(PixelFormat format);\n\n/**\n * Gets the size in bytes of a row of an uncompressed pixel format.\n **/\nsize_t getPixelFormatUncompressedRowSize(PixelFormat format, int width);\n\n/**\n * Gets the size in bytes of a row of a compressed pixel format. This is the\n * number of blocks used by the given width, multiplied by the block size. The\n * number of rows of blocks for a given height can be computed by\n * getPixelFormatCompressedBlockRowCount.\n **/\nsize_t getPixelFormatCompressedBlockRowSize(PixelFormat format, int width);\n\n/**\n * Gets the number of rows of blocks the given compressed pixel format will use,\n * for the given height in pixels.\n **/\nsize_t getPixelFormatCompressedBlockRowCount(PixelFormat format, int height);\n\n/**\n * Gets the size in bytes of a slice (width x height 2D plane) which uses the\n * given pixel format.\n **/\nsize_t getPixelFormatSliceSize(PixelFormat format, int width, int height);\n\n/**\n * Gets the number of color components in the given pixel format.\n **/\nint getPixelFormatColorComponents(PixelFormat format);\n\n} // love\n"
  },
  {
    "path": "src/common/runtime.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"config.h\"\n#include \"runtime.h\"\n\n// LOVE\n#include \"Module.h\"\n#include \"Object.h\"\n#include \"Reference.h\"\n#include \"StringMap.h\"\n\n// C++\n#include <algorithm>\n#include <iostream>\n#include <cstdint>\n#include <cstdio>\n#include <cstddef>\n#include <cmath>\n#include <sstream>\n\nnamespace love\n{\n\n/**\n * Called when an object is collected. The object is released\n * once in this function, possibly deleting it.\n **/\nstatic int w__gc(lua_State *L)\n{\n\tProxy *p = (Proxy *) lua_touserdata(L, 1);\n\tif (p->object != nullptr)\n\t{\n\t\tp->object->release();\n\t\tp->object = nullptr;\n\t}\n\treturn 0;\n}\n\nstatic int w__tostring(lua_State *L)\n{\n\tProxy *p = (Proxy *) lua_touserdata(L, 1);\n\tconst char *typname = lua_tostring(L, lua_upvalueindex(1));\n\tlua_pushfstring(L, \"%s: %p\", typname, p->object);\n\treturn 1;\n}\n\nstatic int w__type(lua_State *L)\n{\n\tlua_pushvalue(L, lua_upvalueindex(1));\n\treturn 1;\n}\n\nstatic int w__typeOf(lua_State *L)\n{\n\tProxy *p = (Proxy *)lua_touserdata(L, 1);\n\tType *t = luax_type(L, 2);\n\tif (!t)\n\t\tluax_pushboolean(L, false);\n\telse\n\t\tluax_pushboolean(L, p->type->isa(*t));\n\treturn 1;\n}\n\nstatic int w__eq(lua_State *L)\n{\n\tProxy *p1 = (Proxy *)lua_touserdata(L, 1);\n\tProxy *p2 = (Proxy *)lua_touserdata(L, 2);\n\tluax_pushboolean(L, p1->object == p2->object && p1->object != nullptr);\n\treturn 1;\n}\n\ntypedef uint64 ObjectKey;\n\nstatic bool luax_isfulllightuserdatasupported(lua_State *L)\n{\n\t// LuaJIT prior to commit e9af1abec542e6f9851ff2368e7f196b6382a44c doesn't\n\t// support lightuserdata > 48 bits. This is not a problem with Android,\n\t// Windows, macOS, and iOS as they'll use updated LuaJIT or won't use\n\t// pointers > 48 bits, but this is not the case for Linux. So check for\n\t// this capability first!\n\tstatic bool checked = false;\n\tstatic bool supported = false;\n\n\tif (sizeof(void*) == 4)\n\t\t// 32-bit platforms always supports full-lightuserdata.\n\t\treturn true;\n\n\tif (!checked)\n\t{\n\t\tlua_pushcclosure(L, [](lua_State *L) -> int\n\t\t{\n\t\t\t// Try to push pointer with all bits set.\n\t\t\tlua_pushlightuserdata(L, (void *) (~((size_t) 0)));\n\t\t\treturn 1;\n\t\t}, 0);\n\n\t\tsupported = lua_pcall(L, 0, 1, 0) == 0;\n\t\tchecked = true;\n\n\t\tlua_pop(L, 1);\n\t}\n\n\treturn supported;\n}\n\n// For use with the love object pointer -> Proxy pointer registry.\n// Using the pointer directly via lightuserdata would be ideal, but LuaJIT\n// (before a commit to 2.1 in 2020) cannot use lightuserdata with more than 47\n// bits whereas some newer arm64 architectures allow pointers which use more\n// than that.\nstatic ObjectKey luax_computeloveobjectkey(lua_State *L, love::Object *object)\n{\n\t// love objects should be allocated on the heap, and thus are subject\n\t// to the alignment rules of operator new / malloc. Lua numbers (doubles)\n\t// can store all possible integers up to 2^53. We can store pointers that\n\t// use more than 53 bits if their alignment is guaranteed to be more than 1.\n\t// For example an alignment requirement of 8 means we can shift the\n\t// pointer's bits by 3. However, this is not always reliable on 32-bit platforms\n\t// as can be seen in this bug report: https://github.com/love2d/love/issues/1916.\n\t// It appears to be ABI violation. However it seems there's no reliable way to\n\t// get the correct alignment pre-C++17. Consider that 32-bit pointer still fits\n\t// in 2^53 range, it's perfectly fine to assume alignment of 1 there.\n\tconst size_t minalign = sizeof(void*) == 8 ? alignof(std::max_align_t) : 1;\n\tuintptr_t key = (uintptr_t) object;\n\n\tif ((key & (minalign - 1)) != 0)\n\t{\n\t\tluaL_error(L, \"Cannot push love object to Lua: unexpected alignment \"\n\t\t\t\t   \"(pointer is %p but alignment should be %d)\", object, (int) minalign);\n\t}\n\n\tstatic const size_t shift = (size_t) log2(minalign);\n\n\tkey >>= shift;\n\n\treturn (ObjectKey) key;\n}\n\nstatic void luax_pushloveobjectkey(lua_State *L, ObjectKey key)\n{\n\t// If full 64-bit lightuserdata is supported, always use that. Otherwise,\n\t// if the key is smaller than 2^53 (which is integer precision for double\n\t// datatype), then push number. Otherwise, throw error.\n\tif (luax_isfulllightuserdatasupported(L))\n\t\tlua_pushlightuserdata(L, (void *) key);\n\telse if (key > 0x20000000000000ULL) // 2^53\n\t\tluaL_error(L, \"Cannot push love object to Lua: pointer value %p is too large\", key);\n\telse\n\t\tlua_pushnumber(L, (lua_Number) key);\n}\n\nstatic int w__release(lua_State *L)\n{\n\tProxy *p = (Proxy *) lua_touserdata(L, 1);\n\tObject *object = p->object;\n\n\tif (object != nullptr)\n\t{\n\t\tp->object = nullptr;\n\t\tobject->release();\n\n\t\t// Fetch the registry table of instantiated objects.\n\t\tluax_getregistry(L, REGISTRY_OBJECTS);\n\n\t\tif (lua_istable(L, -1))\n\t\t{\n\t\t\t// loveobjects[object] = nil\n\t\t\tObjectKey objectkey = luax_computeloveobjectkey(L, object);\n\t\t\tluax_pushloveobjectkey(L, objectkey);\n\t\t\tlua_pushnil(L);\n\t\t\tlua_settable(L, -3);\n\t\t}\n\n\t\tlua_pop(L, 1);\n\t}\n\n\tluax_pushboolean(L, object != nullptr);\n\treturn 1;\n}\n\nReference *luax_refif(lua_State *L, int type)\n{\n\tReference *r = nullptr;\n\n\t// Create a reference only if the test succeeds.\n\tif (lua_type(L, -1) == type)\n\t\tr = new Reference(L);\n\telse // Pop the value manually if it fails (done by Reference if it succeeds).\n\t\tlua_pop(L, 1);\n\n\treturn r;\n}\n\nvoid luax_printstack(lua_State *L)\n{\n\tfor (int i = 1; i <= lua_gettop(L); i++)\n\t\tstd::cout << i << \" - \" << luaL_typename(L, i) << std::endl;\n}\n\nint luax_traceback(lua_State *L)\n{\n\tif (!lua_isstring(L, 1))  // 'message' not a string?\n\t\treturn 1; // keep it intact\n\n\tlua_getglobal(L, \"debug\");\n\tif (!lua_istable(L, -1))\n\t{\n\t\tlua_pop(L, 1);\n\t\treturn 1;\n\t}\n\n\tlua_getfield(L, -1, \"traceback\");\n\tif (!lua_isfunction(L, -1))\n\t{\n\t\tlua_pop(L, 2);\n\t\treturn 1;\n\t}\n\n\tlua_pushvalue(L, 1); // pass error message\n\tlua_pushinteger(L, 2); // skip this function and traceback\n\tlua_call(L, 2, 1); // call debug.traceback\n\treturn 1;\n}\n\nbool luax_isarrayoftables(lua_State *L, int idx)\n{\n\tif (!lua_istable(L, idx))\n\t\treturn false;\n\n\tlua_rawgeti(L, idx, 1);\n\tbool tableoftables = lua_istable(L, -1);\n\tlua_pop(L, 1);\n\treturn tableoftables;\n}\n\nbool luax_toboolean(lua_State *L, int idx)\n{\n\treturn (lua_toboolean(L, idx) != 0);\n}\n\nbool luax_checkboolean(lua_State *L, int idx)\n{\n\tluaL_checktype(L, idx, LUA_TBOOLEAN);\n\treturn luax_toboolean(L, idx);\n}\n\nvoid luax_pushboolean(lua_State *L, bool b)\n{\n\tlua_pushboolean(L, b ? 1 : 0);\n}\n\nbool luax_optboolean(lua_State *L, int idx, bool b)\n{\n\tif (lua_isboolean(L, idx) == 1)\n\t\treturn (lua_toboolean(L, idx) == 1 ? true : false);\n\treturn b;\n}\n\nstd::string luax_tostring(lua_State *L, int idx)\n{\n\tsize_t len;\n\tconst char *str = lua_tolstring(L, idx, &len);\n\treturn std::string(str, len);\n}\n\nstd::string luax_checkstring(lua_State *L, int idx)\n{\n\tsize_t len;\n\tconst char *str = luaL_checklstring(L, idx, &len);\n\treturn std::string(str, len);\n}\n\nvoid luax_pushstring(lua_State *L, const std::string &str)\n{\n\tlua_pushlstring(L, str.data(), str.size());\n}\n\nvoid luax_pushpointerasstring(lua_State *L, const void *pointer)\n{\n\tchar str[sizeof(void *)];\n\tmemcpy(str, &pointer, sizeof(void *));\n\tlua_pushlstring(L, str, sizeof(void *));\n}\n\nbool luax_boolflag(lua_State *L, int table_index, const char *key, bool defaultValue)\n{\n\tlua_getfield(L, table_index, key);\n\n\tbool retval;\n\tif (lua_isnoneornil(L, -1))\n\t\tretval = defaultValue;\n\telse\n\t\tretval = lua_toboolean(L, -1) != 0;\n\n\tlua_pop(L, 1);\n\treturn retval;\n}\n\nint luax_intflag(lua_State *L, int table_index, const char *key, int defaultValue)\n{\n\tlua_getfield(L, table_index, key);\n\n\tint retval;\n\tif (!lua_isnumber(L, -1))\n\t\tretval = defaultValue;\n\telse\n\t\tretval = (int) lua_tointeger(L, -1);\n\n\tlua_pop(L, 1);\n\treturn retval;\n}\n\ndouble luax_numberflag(lua_State *L, int table_index, const char *key, double defaultValue)\n{\n\tlua_getfield(L, table_index, key);\n\n\tdouble retval;\n\tif (!lua_isnumber(L, -1))\n\t\tretval = defaultValue;\n\telse\n\t\tretval = lua_tonumber(L, -1);\n\n\tlua_pop(L, 1);\n\treturn retval;\n}\n\nbool luax_checkboolflag(lua_State *L, int table_index, const char *key)\n{\n\tlua_getfield(L, table_index, key);\n\n\tbool retval = false;\n\tif (lua_type(L, -1) != LUA_TBOOLEAN)\n\t{\n\t\tstd::string err = \"expected boolean field '\" + std::string(key) + \"' in table\";\n\t\treturn luaL_argerror(L, table_index, err.c_str());\n\t}\n\telse\n\t\tretval = luax_toboolean(L, -1);\n\tlua_pop(L, 1);\n\n\treturn retval;\n}\n\nint luax_checkintflag(lua_State *L, int table_index, const char *key)\n{\n\tlua_getfield(L, table_index, key);\n\n\tint retval;\n\tif (!lua_isnumber(L, -1))\n\t{\n\t\tstd::string err = \"expected integer field '\" + std::string(key) + \"' in table\";\n\t\treturn luaL_argerror(L, table_index, err.c_str());\n\t}\n\telse\n\t\tretval = (int) luaL_checkinteger(L, -1);\n\tlua_pop(L, 1);\n\n\treturn retval;\n}\n\nint luax_assert_argc(lua_State *L, int min)\n{\n\tint argc = lua_gettop(L);\n\tif (argc < min)\n\t\treturn luaL_error(L, \"Incorrect number of arguments. Got [%d], expected at least [%d]\", argc, min);\n\treturn 0;\n}\n\nint luax_assert_argc(lua_State *L, int min, int max)\n{\n\tint argc = lua_gettop(L);\n\tif (argc < min || argc > max)\n\t\treturn luaL_error(L, \"Incorrect number of arguments. Got [%d], expected [%d-%d]\", argc, min, max);\n\treturn 0;\n}\n\nint luax_assert_function(lua_State *L, int idx)\n{\n\tif (!lua_isfunction(L, idx))\n\t\treturn luaL_error(L, \"Argument must be of type \\\"function\\\".\");\n\treturn 0;\n}\n\nint luax_assert_nilerror(lua_State *L, int idx)\n{\n\tif (lua_isnoneornil(L, idx))\n\t{\n\t\tif (lua_isstring(L, idx + 1))\n\t\t\treturn luaL_error(L, lua_tostring(L, idx + 1));\n\t\telse\n\t\t\treturn luaL_error(L, \"assertion failed!\");\n\t}\n\treturn 0;\n}\n\nvoid luax_setfuncs(lua_State *L, const luaL_Reg *l)\n{\n\tif (l == nullptr)\n\t\treturn;\n\n\tfor (; l->name != nullptr; l++)\n\t{\n\t\tlua_pushcfunction(L, l->func);\n\t\tlua_setfield(L, -2, l->name);\n\t}\n}\n\nint luax_require(lua_State *L, const char *name)\n{\n\tlua_getglobal(L, \"require\");\n\tlua_pushstring(L, name);\n\tlua_call(L, 1, 1);\n\treturn 1;\n}\n\nint luax_register_module(lua_State *L, const WrappedModule &m)\n{\n\tm.type->init();\n\n\t// Put a reference to the C++ module in Lua.\n\tluax_insistregistry(L, REGISTRY_MODULES);\n\n\tProxy *p = (Proxy *)lua_newuserdata(L, sizeof(Proxy));\n\tp->object = m.module;\n\tp->type = m.type;\n\n\tluaL_newmetatable(L, m.module->getName());\n\tlua_pushvalue(L, -1);\n\tlua_setfield(L, -2, \"__index\");\n\tlua_pushcfunction(L, w__gc);\n\tlua_setfield(L, -2, \"__gc\");\n\n\tlua_setmetatable(L, -2);\n\tlua_setfield(L, -2, m.name); // _modules[name] = proxy\n\tlua_pop(L, 1);\n\n\t// Gets the love table.\n\tluax_insistglobal(L, \"love\");\n\n\t// Create new table for module.\n\tlua_newtable(L);\n\n\t// Register all the functions.\n\tif (m.functions != nullptr)\n\t\tluax_setfuncs(L, m.functions);\n\n\t// Register types.\n\tif (m.types != nullptr)\n\t{\n\t\tfor (const lua_CFunction *t = m.types; *t != nullptr; t++)\n\t\t\t(*t)(L);\n\t}\n\n\tlua_pushvalue(L, -1);\n\tlua_setfield(L, -3, m.name); // love.graphics = table\n\tlua_remove(L, -2); // love\n\n\treturn 1;\n}\n\nint luax_preload(lua_State *L, lua_CFunction f, const char *name)\n{\n\tlua_getglobal(L, \"package\");\n\tlua_getfield(L, -1, \"preload\");\n\tlua_pushcfunction(L, f);\n\tlua_setfield(L, -2, name);\n\tlua_pop(L, 2);\n\treturn 0;\n}\n\nint luax_register_type(lua_State *L, love::Type *type, ...)\n{\n\ttype->init();\n\n\t// Get the place for storing and re-using instantiated love types.\n\tluax_getregistry(L, REGISTRY_OBJECTS);\n\n\t// Create registry._loveobjects if it doesn't exist yet.\n\tif (!lua_istable(L, -1))\n\t{\n\t\tlua_newtable(L);\n\t\tlua_replace(L, -2);\n\n\t\t// Create a metatable.\n\t\tlua_newtable(L);\n\n\t\t// metatable.__mode = \"v\". Weak userdata values.\n\t\tlua_pushliteral(L, \"v\");\n\t\tlua_setfield(L, -2, \"__mode\");\n\n\t\t// setmetatable(newtable, metatable)\n\t\tlua_setmetatable(L, -2);\n\n\t\t// registry._loveobjects = newtable\n\t\tlua_setfield(L, LUA_REGISTRYINDEX, \"_loveobjects\");\n\t}\n\telse\n\t\tlua_pop(L, 1);\n\n\tluaL_newmetatable(L, type->getName());\n\n\t// m.__index = m\n\tlua_pushvalue(L, -1);\n\tlua_setfield(L, -2, \"__index\");\n\n\t// setup gc\n\tlua_pushcfunction(L, w__gc);\n\tlua_setfield(L, -2, \"__gc\");\n\n\t// Add equality\n\tlua_pushcfunction(L, w__eq);\n\tlua_setfield(L, -2, \"__eq\");\n\n\t// Add tostring function.\n\tlua_pushstring(L, type->getName());\n\tlua_pushcclosure(L, w__tostring, 1);\n\tlua_setfield(L, -2, \"__tostring\");\n\n\t// Add type\n\tlua_pushstring(L, type->getName());\n\tlua_pushcclosure(L, w__type, 1);\n\tlua_setfield(L, -2, \"type\");\n\n\t// Add typeOf\n\tlua_pushcfunction(L, w__typeOf);\n\tlua_setfield(L, -2, \"typeOf\");\n\n\t// Add release\n\tlua_pushcfunction(L, w__release);\n\tlua_setfield(L, -2, \"release\");\n\n\t// Add __close for lua 5.4 (just calls release)\n\tlua_pushcfunction(L, w__release);\n\tlua_setfield(L, -2, \"__close\");\n\n\tva_list fs;\n\tva_start(fs, type);\n\tfor (const luaL_Reg *f = va_arg(fs, const luaL_Reg *); f; f = va_arg(fs, const luaL_Reg *))\n\t\tluax_setfuncs(L, f);\n\tva_end(fs);\n\n\tlua_pop(L, 1); // Pops metatable.\n\treturn 0;\n}\n\nvoid luax_gettypemetatable(lua_State *L, const love::Type &type)\n{\n\tconst char *name = type.getName();\n\tlua_getfield(L, LUA_REGISTRYINDEX, name);\n}\n\nint luax_table_insert(lua_State *L, int tindex, int vindex, int pos)\n{\n\tif (tindex < 0)\n\t\ttindex = lua_gettop(L)+1+tindex;\n\tif (vindex < 0)\n\t\tvindex = lua_gettop(L)+1+vindex;\n\n\tif (pos == -1)\n\t{\n\t\tlua_pushvalue(L, vindex);\n\t\tlua_rawseti(L, tindex, (int) luax_objlen(L, tindex)+1);\n\t\treturn 0;\n\t}\n\telse if (pos < 0)\n\t\tpos = (int) luax_objlen(L, tindex)+1+pos;\n\n\tfor (int i = (int) luax_objlen(L, tindex)+1; i > pos; i--)\n\t{\n\t\tlua_rawgeti(L, tindex, i-1);\n\t\tlua_rawseti(L, tindex, i);\n\t}\n\n\tlua_pushvalue(L, vindex);\n\tlua_rawseti(L, tindex, pos);\n\treturn 0;\n}\n\nint luax_register_searcher(lua_State *L, lua_CFunction f, int pos)\n{\n\t// Add the package loader to the package.loaders table.\n\tlua_getglobal(L, \"package\");\n\n\tif (lua_isnil(L, -1))\n\t\treturn luaL_error(L, \"Can't register searcher: package table does not exist.\");\n\n\tlua_getfield(L, -1, \"loaders\");\n\n\t// Lua 5.2 renamed package.loaders to package.searchers.\n\tif (lua_isnil(L, -1))\n\t{\n\t\tlua_pop(L, 1);\n\t\tlua_getfield(L, -1, \"searchers\");\n\t}\n\n\tif (lua_isnil(L, -1))\n\t\treturn luaL_error(L, \"Can't register searcher: package.loaders table does not exist.\");\n\n\tlua_pushcfunction(L, f);\n\tluax_table_insert(L, -2, -1, pos);\n\tlua_pop(L, 3);\n\treturn 0;\n}\n\nvoid luax_rawnewtype(lua_State *L, love::Type &type, love::Object *object)\n{\n\tProxy *u = (Proxy *)lua_newuserdata(L, sizeof(Proxy));\n\n\tobject->retain();\n\n\tu->object = object;\n\tu->type = &type;\n\n\tconst char *name = type.getName();\n\tluaL_newmetatable(L, name);\n\n\tlua_getfield(L, -1, \"__gc\");\n\tbool has_gc = !lua_isnoneornil(L, -1);\n\tlua_pop(L, 1);\n\n\t// Make sure mt.__gc exists, so Lua states which don't have the object's\n\t// module loaded will still clean the object up when it's collected.\n\tif (!has_gc)\n\t{\n\t\tlua_pushcfunction(L, w__gc);\n\t\tlua_setfield(L, -2, \"__gc\");\n\t}\n\n\tlua_setmetatable(L, -2);\n}\n\nvoid luax_pushtype(lua_State *L, love::Type &type, love::Object *object)\n{\n\tif (object == nullptr)\n\t{\n\t\tlua_pushnil(L);\n\t\treturn;\n\t}\n\n\t// Fetch the registry table of instantiated objects.\n\tluax_getregistry(L, REGISTRY_OBJECTS);\n\n\t// The table might not exist - it should be insisted in luax_register_type.\n\tif (lua_isnoneornil(L, -1))\n\t{\n\t\tlua_pop(L, 1);\n\t\treturn luax_rawnewtype(L, type, object);\n\t}\n\n\tObjectKey objectkey = luax_computeloveobjectkey(L, object);\n\n\t// Get the value of loveobjects[object] on the stack.\n\tluax_pushloveobjectkey(L, objectkey);\n\tlua_gettable(L, -2);\n\n\t// If the Proxy userdata isn't in the instantiated types table yet, add it.\n\tif (lua_type(L, -1) != LUA_TUSERDATA)\n\t{\n\t\tlua_pop(L, 1);\n\n\t\tluax_rawnewtype(L, type, object);\n\n\t\tluax_pushloveobjectkey(L, objectkey);\n\t\tlua_pushvalue(L, -2);\n\n\t\t// loveobjects[object] = Proxy.\n\t\tlua_settable(L, -4);\n\t}\n\n\t// Remove the loveobjects table from the stack.\n\tlua_remove(L, -2);\n\n\t// Keep the Proxy userdata on the stack.\n}\n\nbool luax_istype(lua_State *L, int idx, love::Type &type)\n{\n\tif (lua_type(L, idx) != LUA_TUSERDATA)\n\t\treturn false;\n\n\tProxy *p = (Proxy *) lua_touserdata(L, idx);\n\n\tif (p->type != nullptr)\n\t\treturn p->type->isa(type);\n\telse\n\t\treturn false;\n}\n\nstatic Proxy *tryextractproxy(lua_State *L, int idx)\n{\n\tProxy *u = (Proxy *)lua_touserdata(L, idx);\n\n\tif (u == nullptr || u->type == nullptr)\n\t\treturn nullptr;\n\n\t// We could get rid of the dynamic_cast for more performance, but it would\n\t// be less safe...\n\tif (dynamic_cast<Object *>(u->object) != nullptr)\n\t\treturn u;\n\n\treturn nullptr;\n}\n\nVariant luax_checkvariant(lua_State *L, int n, bool allowuserdata, std::set<const void*> *tableSet)\n{\n\tsize_t len;\n\tconst char *str;\n\tProxy *p = nullptr;\n\n\tif (n < 0) // Fix the stack position, we might modify it later\n\t\tn += lua_gettop(L) + 1;\n\n\tswitch (lua_type(L, n))\n\t{\n\tcase LUA_TBOOLEAN:\n\t\treturn Variant(luax_toboolean(L, n));\n\tcase LUA_TNUMBER:\n\t\treturn Variant(lua_tonumber(L, n));\n\tcase LUA_TSTRING:\n\t\tstr = lua_tolstring(L, n, &len);\n\t\treturn Variant(str, len);\n\tcase LUA_TLIGHTUSERDATA:\n\t\treturn Variant(lua_touserdata(L, n));\n\tcase LUA_TUSERDATA:\n\t\tif (!allowuserdata)\n\t\t{\n\t\t\tluax_typerror(L, n, \"copyable Lua value\");\n\t\t\treturn Variant();\n\t\t}\n\t\tp = tryextractproxy(L, n);\n\t\tif (p != nullptr)\n\t\t\treturn Variant(p->type, p->object);\n\t\telse\n\t\t{\n\t\t\tluax_typerror(L, n, \"love type\");\n\t\t\treturn Variant();\n\t\t}\n\tcase LUA_TNIL:\n\t\treturn Variant();\n\tcase LUA_TTABLE:\n\t\t{\n\t\t\tbool success = true;\n\t\t\tstd::set<const void *> topTableSet;\n\n\t\t\t// We can use a pointer to a stack-allocated variable because it's\n\t\t\t// never used after the stack-allocated variable is destroyed.\n\t\t\tif (tableSet == nullptr)\n\t\t\t\ttableSet = &topTableSet;\n\n\t\t\t// Now make sure this table wasn't already serialised\n\t\t\tconst void *tablePointer = lua_topointer(L, n);\n\t\t\t{\n\t\t\t\tauto result = tableSet->insert(tablePointer);\n\t\t\t\tif (!result.second) // insertion failed\n\t\t\t\t\tthrow love::Exception(\"Cycle detected in table\");\n\t\t\t}\n\n\t\t\tVariant::SharedTable *table = new Variant::SharedTable();\n\n\t\t\tsize_t len = luax_objlen(L, n);\n\t\t\tif (len > 0)\n\t\t\t\ttable->pairs.reserve(len);\n\n\t\t\tlua_pushnil(L);\n\n\t\t\twhile (lua_next(L, n))\n\t\t\t{\n\t\t\t\ttable->pairs.emplace_back(\n\t\t\t\t\tluax_checkvariant(L, -2, allowuserdata, tableSet),\n\t\t\t\t\tluax_checkvariant(L, -1, allowuserdata, tableSet)\n\t\t\t\t);\n\t\t\t\tlua_pop(L, 1);\n\n\t\t\t\tconst auto &p = table->pairs.back();\n\t\t\t\tif (p.first.getType() == Variant::UNKNOWN || p.second.getType() == Variant::UNKNOWN)\n\t\t\t\t{\n\t\t\t\t\tsuccess = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// And remove the table from the set again\n\t\t\ttableSet->erase(tablePointer);\n\n\t\t\tif (success)\n\t\t\t\treturn Variant(table);\n\t\t\telse\n\t\t\t\ttable->release();\n\t\t}\n\t\tbreak;\n\t}\n\n\treturn Variant::unknown();\n}\n\nvoid luax_pushvariant(lua_State *L, const Variant &v)\n{\n\tconst Variant::Data &data = v.getData();\n\tswitch (v.getType())\n\t{\n\tcase Variant::BOOLEAN:\n\t\tlua_pushboolean(L, data.boolean);\n\t\tbreak;\n\tcase Variant::NUMBER:\n\t\tlua_pushnumber(L, data.number);\n\t\tbreak;\n\tcase Variant::STRING:\n\t\tlua_pushlstring(L, data.string->str, data.string->len);\n\t\tbreak;\n\tcase Variant::SMALLSTRING:\n\t\tlua_pushlstring(L, data.smallstring.str, data.smallstring.len);\n\t\tbreak;\n\tcase Variant::LUSERDATA:\n\t\tlua_pushlightuserdata(L, data.userdata);\n\t\tbreak;\n\tcase Variant::LOVEOBJECT:\n\t\tluax_pushtype(L, *data.objectproxy.type, data.objectproxy.object);\n\t\tbreak;\n\tcase Variant::TABLE:\n\t{\n\t\tstd::vector<std::pair<Variant, Variant>> &table = data.table->pairs;\n\t\tint tsize = (int) table.size();\n\n\t\tlua_createtable(L, 0, tsize);\n\n\t\tfor (int i = 0; i < tsize; ++i)\n\t\t{\n\t\t\tstd::pair<Variant, Variant> &kv = table[i];\n\t\t\tluax_pushvariant(L, kv.first);\n\t\t\tluax_pushvariant(L, kv.second);\n\t\t\tlua_settable(L, -3);\n\t\t}\n\n\t\tbreak;\n\t}\n\tcase Variant::NIL:\n\tdefault:\n\t\tlua_pushnil(L);\n\t\tbreak;\n\t}\n}\n\nint luax_getfunction(lua_State *L, const char *mod, const char *fn)\n{\n\tlua_getglobal(L, \"love\");\n\tif (lua_isnil(L, -1)) return luaL_error(L, \"Could not find global love!\");\n\tlua_getfield(L, -1, mod);\n\tif (lua_isnil(L, -1)) return luaL_error(L, \"Could not find love.%s!\", mod);\n\tlua_getfield(L, -1, fn);\n\tif (lua_isnil(L, -1)) return luaL_error(L, \"Could not find love.%s.%s!\", mod, fn);\n\n\tlua_remove(L, -2); // remove mod\n\tlua_remove(L, -2); // remove fn\n\treturn 0;\n}\n\nint luax_convobj(lua_State *L, int idx, const char *mod, const char *fn)\n{\n\t// Convert to absolute index if necessary.\n\tif (idx < 0 && idx > LUA_REGISTRYINDEX)\n\t\tidx += lua_gettop(L) + 1;\n\n\t// Convert string to a file.\n\tluax_getfunction(L, mod, fn);\n\tlua_pushvalue(L, idx); // The initial argument.\n\tlua_call(L, 1, 2); // Call the function, one arg, one return value (plus optional errstring.)\n\tluax_assert_nilerror(L, -2); // Make sure the function returned something.\n\tlua_pop(L, 1); // Pop the second return value now that we don't need it.\n\tlua_replace(L, idx); // Replace the initial argument with the new object.\n\treturn 0;\n}\n\nint luax_convobj(lua_State *L, const int idxs[], int n, const char *mod, const char *fn)\n{\n\tluax_getfunction(L, mod, fn);\n\tfor (int i = 0; i < n; i++)\n\t{\n\t\tlua_pushvalue(L, idxs[i]); // The arguments.\n\t}\n\tlua_call(L, n, 2); // Call the function, n args, one return value (plus optional errstring.)\n\tluax_assert_nilerror(L, -2); // Make sure the function returned something.\n\tlua_pop(L, 1); // Pop the second return value now that we don't need it.\n\tif (n > 0)\n\t\tlua_replace(L, idxs[0]); // Replace the initial argument with the new object.\n\treturn 0;\n}\n\nint luax_convobj(lua_State *L, const std::vector<int>& idxs, const char *module, const char *function)\n{\n\tconst int *idxPtr = idxs.size() > 0 ? &idxs[0] : nullptr;\n\treturn luax_convobj(L, idxPtr, (int) idxs.size(), module, function);\n}\n\nint luax_pconvobj(lua_State *L, int idx, const char *mod, const char *fn)\n{\n\t// Convert string to a file.\n\tluax_getfunction(L, mod, fn);\n\tlua_pushvalue(L, idx); // The initial argument.\n\tint ret = lua_pcall(L, 1, 1, 0); // Call the function, one arg, one return value.\n\tif (ret == 0)\n\t\tlua_replace(L, idx); // Replace the initial argument with the new object.\n\treturn ret;\n}\n\nint luax_pconvobj(lua_State *L, const int idxs[], int n, const char *mod, const char *fn)\n{\n\tluax_getfunction(L, mod, fn);\n\tfor (int i = 0; i < n; i++)\n\t{\n\t\tlua_pushvalue(L, idxs[i]); // The arguments.\n\t}\n\tint ret = lua_pcall(L, n, 1, 0); // Call the function, n args, one return value.\n\tif (ret == 0)\n\t\tlua_replace(L, idxs[0]); // Replace the initial argument with the new object.\n\treturn ret;\n}\n\nint luax_pconvobj(lua_State *L, const std::vector<int>& idxs, const char *module, const char *function)\n{\n\tconst int *idxPtr = idxs.size() > 0 ? &idxs[0] : nullptr;\n\treturn luax_pconvobj(L, idxPtr, (int) idxs.size(), module, function);\n}\n\nint luax_insist(lua_State *L, int idx, const char *k)\n{\n\t// Convert to absolute index if necessary.\n\tif (idx < 0 && idx > LUA_REGISTRYINDEX)\n\t\tidx += lua_gettop(L) + 1;\n\n\tlua_getfield(L, idx, k);\n\n\t// Create if necessary.\n\tif (!lua_istable(L, -1))\n\t{\n\t\tlua_pop(L, 1); // Pop the non-table.\n\t\tlua_newtable(L);\n\t\tlua_pushvalue(L, -1); // Duplicate the table to leave on top.\n\t\tlua_setfield(L, idx, k); // lua_stack[idx][k] = lua_stack[-1] (table)\n\t}\n\n\treturn 1;\n}\n\nint luax_insistglobal(lua_State *L, const char *k)\n{\n\tlua_getglobal(L, k);\n\n\tif (!lua_istable(L, -1))\n\t{\n\t\tlua_pop(L, 1); // Pop the non-table.\n\t\tlua_newtable(L);\n\t\tlua_pushvalue(L, -1);\n\t\tlua_setglobal(L, k);\n\t}\n\n\treturn 1;\n}\n\nint luax_c_insistglobal(lua_State *L, const char *k)\n{\n\treturn luax_insistglobal(L, k);\n}\n\nint luax_insistlove(lua_State *L, const char *k)\n{\n\tluax_insistglobal(L, \"love\");\n\tluax_insist(L, -1, k);\n\n\t// The love table should be replaced with the top stack\n\t// item. Only the reqested table should remain on the stack.\n\tlua_replace(L, -2);\n\n\treturn 1;\n}\n\nint luax_getlove(lua_State *L, const char *k)\n{\n\tlua_getglobal(L, \"love\");\n\n\tif (!lua_isnil(L, -1))\n\t{\n\t\tlua_getfield(L, -1, k);\n\t\tlua_replace(L, -2);\n\t}\n\n\treturn 1;\n}\n\nint luax_insistregistry(lua_State *L, Registry r)\n{\n\tswitch (r)\n\t{\n\tcase REGISTRY_MODULES:\n\t\treturn luax_insistlove(L, \"_modules\");\n\tcase REGISTRY_OBJECTS:\n\t\treturn luax_insist(L, LUA_REGISTRYINDEX, \"_loveobjects\");\n\tdefault:\n\t\treturn luaL_error(L, \"Attempted to use invalid registry.\");\n\t}\n}\n\nint luax_getregistry(lua_State *L, Registry r)\n{\n\tswitch (r)\n\t{\n\tcase REGISTRY_MODULES:\n\t\treturn luax_getlove(L, \"_modules\");\n\tcase REGISTRY_OBJECTS:\n\t\tlua_getfield(L, LUA_REGISTRYINDEX, \"_loveobjects\");\n\t\treturn 1;\n\tdefault:\n\t\treturn luaL_error(L, \"Attempted to use invalid registry.\");\n\t}\n}\n\nstatic const char *MAIN_THREAD_KEY = \"_love_mainthread\";\n\nlua_State *luax_insistpinnedthread(lua_State *L)\n{\n\tlua_getfield(L, LUA_REGISTRYINDEX, MAIN_THREAD_KEY);\n\n\tif (lua_isnoneornil(L, -1))\n\t{\n\t\tlua_pop(L, 1);\n\n\t\t// lua_pushthread returns 1 if it's actually the main thread, but we\n\t\t// can't actually get the real main thread if lua_pushthread doesn't\n\t\t// return it (in Lua 5.1 at least), so we ignore that for now...\n\t\t// We do store a strong reference to the current thread/coroutine in\n\t\t// the registry, however.\n\t\tlua_pushthread(L);\n\t\tlua_pushvalue(L, -1);\n\t\tlua_setfield(L, LUA_REGISTRYINDEX, MAIN_THREAD_KEY);\n\t}\n\n\tlua_State *thread = lua_tothread(L, -1);\n\tlua_pop(L, 1);\n\treturn thread;\n}\n\nlua_State *luax_getpinnedthread(lua_State *L)\n{\n\tlua_getfield(L, LUA_REGISTRYINDEX, MAIN_THREAD_KEY);\n\tlua_State *thread = lua_tothread(L, -1);\n\tlua_pop(L, 1);\n\treturn thread;\n}\n\nvoid luax_markdeprecated(lua_State *L, int level, const char *name, APIType api)\n{\n\tluax_markdeprecated(L, level, name, api, DEPRECATED_NO_REPLACEMENT, nullptr);\n}\n\nvoid luax_markdeprecated(lua_State *L, int level, const char *name, APIType api, DeprecationType type, const char *replacement)\n{\n\tMarkDeprecated deprecated(name, api, type, replacement);\n\n\tif (deprecated.info != nullptr && deprecated.info->uses == 1)\n\t{\n\t\tluaL_where(L, level);\n\t\tconst char *where = lua_tostring(L, -1);\n\t\tif (where != nullptr)\n\t\t\tdeprecated.info->where = where;\n\t\tlua_pop(L, 1);\n\t}\n}\n\nextern \"C\" int luax_typerror(lua_State *L, int narg, const char *tname)\n{\n\tint argtype = lua_type(L, narg);\n\tconst char *argtname = nullptr;\n\n\t// We want to use the love type name for userdata, if possible.\n\tif (argtype == LUA_TUSERDATA && luaL_getmetafield(L, narg, \"type\") != 0)\n\t{\n\t\tlua_pushvalue(L, narg);\n\t\tif (lua_pcall(L, 1, 1, 0) == 0 && lua_type(L, -1) == LUA_TSTRING)\n\t\t{\n\t\t\targtname = lua_tostring(L, -1);\n\n\t\t\t// Non-love userdata might have a type metamethod which doesn't\n\t\t\t// describe its type properly, so we only use it for love types.\n\t\t\tif (!Type::byName(argtname))\n\t\t\t\targtname = nullptr;\n\t\t}\n\t}\n\n\tif (argtname == nullptr)\n\t\targtname = lua_typename(L, argtype);\n\n\tconst char *msg = lua_pushfstring(L, \"%s expected, got %s\", tname, argtname);\n\treturn luaL_argerror(L, narg, msg);\n}\n\nint luax_enumerror(lua_State *L, const char *enumName, const char *value)\n{\n\treturn luaL_error(L, \"Invalid %s: %s\", enumName, value);\n}\n\nint luax_enumerror(lua_State *L, const char *enumName, const std::vector<std::string> &values, const char *value)\n{\n\tstd::stringstream valueStream;\n\tbool first = true;\n\tfor (auto value : values)\n\t{\n\t\tvalueStream << (first ? \"'\" : \", '\") << value << \"'\";\n\t\tfirst = false;\n\t}\n\n\tstd::string valueString = valueStream.str();\n\treturn luaL_error(L, \"Invalid %s '%s', expected one of: %s\", enumName, value, valueString.c_str());\n}\n\nsize_t luax_objlen(lua_State *L, int ndx)\n{\n#if LUA_VERSION_NUM == 501\n\treturn lua_objlen(L, ndx);\n#else\n\treturn lua_rawlen(L, ndx);\n#endif\n}\n\nvoid luax_register(lua_State *L, const char *name, const luaL_Reg *l)\n{\n\tif (name)\n\t\tlua_newtable(L);\n\n\tluax_setfuncs(L, l);\n\tif (name)\n\t{\n\t\tlua_pushvalue(L, -1);\n\t\tlua_setglobal(L, name);\n\t}\n}\n\nvoid luax_runwrapper(lua_State *L, const char *filedata, size_t datalen, const char *filename, const love::Type &type, void *ffifuncs)\n{\n\tluax_gettypemetatable(L, type);\n\n\t// Load and execute the given Lua file, sending the metatable and the ffi\n\t// functions struct pointer as arguments.\n\tif (lua_istable(L, -1))\n\t{\n\t\tstd::string chunkname = std::string(\"=[love \\\"\") + std::string(filename) + std::string(\"\\\"]\");\n\n\t\tluaL_loadbuffer(L, filedata, datalen, chunkname.c_str());\n\t\tlua_pushvalue(L, -2);\n\t\tif (ffifuncs != nullptr)\n\t\t\tluax_pushpointerasstring(L, ffifuncs);\n\t\telse\n\t\t\tlua_pushnil(L);\n\t\tlua_call(L, 2, 0);\n\t}\n\n\t// Pop the metatable.\n\tlua_pop(L, 1);\n}\n\nType *luax_type(lua_State *L, int idx)\n{\n\treturn Type::byName(luaL_checkstring(L, idx));\n}\n\nint luax_resume(lua_State *L, int nargs, int* nres)\n{\n#if LUA_VERSION_NUM >= 504\n\treturn lua_resume(L, nullptr, nargs, nres);\n#elif LUA_VERSION_NUM >= 502\n\tLOVE_UNUSED(nres);\n\treturn lua_resume(L, nullptr, nargs);\n#else\n\tLOVE_UNUSED(nres);\n\treturn lua_resume(L, nargs);\n#endif\n}\n\n} // love\n"
  },
  {
    "path": "src/common/runtime.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_RUNTIME_H\n#define LOVE_RUNTIME_H\n\n// LOVE\n#include \"config.h\"\n#include \"types.h\"\n#include \"Object.h\"\n#include \"Variant.h\"\n#include \"deprecation.h\"\n\n// Lua\nextern \"C\" {\n\t#define LUA_COMPAT_ALL\n\t#include <lua.h>\n\t#include <lualib.h>\n\t#include <lauxlib.h>\n}\n\n// C++\n#include <exception>\n#include <algorithm>\n#include <set>\n\nnamespace love\n{\n\n// Forward declarations.\nclass Module;\nclass Reference;\n\ntemplate<typename T>\nclass StrongRef;\n\n/**\n * Registries represent special tables which can be accessed with\n * luax_insistregistry and luax_getregistry.\n **/\nenum Registry\n{\n\tREGISTRY_MODULES,\n\tREGISTRY_OBJECTS\n};\n\n/**\n * A Module with Lua wrapper functions and other data.\n **/\nstruct WrappedModule\n{\n\t// The module containing the functions.\n\tModule *module;\n\n\t// The name for the table to put the functions in, without the 'love'-prefix.\n\tconst char *name;\n\n\t// The type of this module.\n\tlove::Type *type;\n\n\t// The functions of the module (last element {0,0}).\n\tconst luaL_Reg *functions;\n\n\t// A list of functions which expose the types of the modules (last element 0).\n\tconst lua_CFunction *types;\n};\n\n/**\n * Returns a reference to the top stack element (-1) if the value\n * is of the specified type. If the value is incorrect, zero is returned.\n *\n * In any case, the top stack element is popped, regardless of its type.\n **/\nReference *luax_refif(lua_State *L, int type);\n\n/**\n * Prints the current contents of the stack. Only useful for debugging.\n * @param L The Lua state.\n **/\nvoid luax_printstack(lua_State *L);\n\n/**\n * Traceback function for use with lua_pcall. Calls debug.traceback.\n **/\nint luax_traceback(lua_State *L);\n\n/**\n * Gets whether the value at idx is an array of tables.\n **/\nbool luax_isarrayoftables(lua_State *L, int idx);\n\n/**\n * Converts the value at idx to a bool. It follow the same rules\n * as lua_toboolean, but returns a bool instead of an int.\n * @param L The Lua state.\n * @param idx The index on the Lua stack.\n * @return True if the value evaluates to true, false otherwise.\n **/\nbool luax_toboolean(lua_State *L, int idx);\n\n/**\n * Returns the boolean value at idx. Causes a Lua error if the value is not\n * a boolean.\n **/\nbool luax_checkboolean(lua_State *L, int idx);\n\n/**\n * Pushes a bool onto the stack. It's the same as lua_pushboolean,\n * but with bool instead of int.\n * @param L The Lua state.\n * @param b The bool to push.\n **/\nvoid luax_pushboolean(lua_State *L, bool b);\n\n/**\n * Converts the value at idx to a bool, or if not present, b is returned.\n * @param L The Lua state.\n * @param idx The index of the Lua stack.\n * @param b The value to return if no value exist at the specified index.\n * @return True if the value evaluates to true, false otherwise.\n **/\nbool luax_optboolean(lua_State *L, int idx, bool b);\n\n/**\n * Converts the value at idx to a std::string. It takes care of the string\n * size and possible embedded nulls.\n * @param L The Lua state.\n * @param idx The index on the Lua stack.\n * @return Copy of the string at the specified index.\n **/\nstd::string luax_tostring(lua_State *L, int idx);\n\n/**\n * Converts the value at idx to a std::string. It takes care of the string\n * size and possible embedded nulls.\n * @param L The Lua state.\n * @param idx The index on the Lua stack.\n * @return Copy of the string at the specified index.\n **/\nstd::string luax_checkstring(lua_State *L, int idx);\n\n/**\n * Pushes a std::string onto the stack. It uses the length of the string\n * for lua_pushlstring's len argument.\n * @param L The Lua state.\n * @param str The string to push.\n **/\nvoid luax_pushstring(lua_State *L, const std::string &str);\n\n/**\n * Pushes a pointer onto the stack as a string (i.e. a new string with a length\n * of 4 or 8 will be created, containing the given address in its bytes).\n * This is a workaround for lua_pushlightuserdata not working on systems which\n * use more than the lower 47 bits of address space, when LuaJIT is used.\n **/\nvoid luax_pushpointerasstring(lua_State *L, const void *pointer);\n\n\nbool luax_boolflag(lua_State *L, int table_index, const char *key, bool defaultValue);\nint luax_intflag(lua_State *L, int table_index, const char *key, int defaultValue);\ndouble luax_numberflag(lua_State *L, int table_index, const char *key, double defaultValue);\n\nbool luax_checkboolflag(lua_State *L, int table_index, const char *key);\nint luax_checkintflag(lua_State *L, int table_index, const char *key);\n\n/**\n * Convert the value at the specified index to an Lua number, and then\n * convert to a float.\n *\n * @param L The Lua state.\n * @param idx The index on the stack.\n */\ninline float luax_tofloat(lua_State *L, int idx)\n{\n\treturn static_cast<float>(lua_tonumber(L, idx));\n}\n\n/**\n * Like luax_tofloat, but checks that the value is a number.\n *\n * @see luax_tofloat\n */\ninline float luax_checkfloat(lua_State *L, int idx)\n{\n\treturn static_cast<float>(luaL_checknumber(L, idx));\n}\n\ninline int luax_toint(lua_State *L, int idx)\n{\n\treturn (int)lua_tointeger(L, idx);\n}\n\ninline int luax_checkint(lua_State *L, int idx)\n{\n\treturn (int)luaL_checkinteger(L, idx);\n}\n\ninline int luax_optint(lua_State *L, int idx, int def)\n{\n\treturn (int)luaL_optinteger(L, idx, (lua_Integer)def);\n}\n\ninline lua_Number luax_checknumberclamped(lua_State *L, int idx, double minv, double maxv)\n{\n\treturn std::min(std::max(luaL_checknumber(L, idx), minv), maxv);\n}\n\ninline lua_Number luax_optnumberclamped(lua_State *L, int idx, double minv, double maxv, double def)\n{\n\treturn std::min(std::max(luaL_optnumber(L, idx, def), minv), maxv);\n}\n\ninline lua_Number luax_checknumberclamped01(lua_State *L, int idx)\n{\n\treturn std::min(std::max(luaL_checknumber(L, idx), 0.0), 1.0);\n}\n\ninline lua_Number luax_optnumberclamped01(lua_State *L, int idx, double def)\n{\n\treturn std::min(std::max(luaL_optnumber(L, idx, def), 0.0), 1.0);\n}\n\n/**\n * Require at least 'min' number of items on the stack.\n * @param L The Lua state.\n * @param min The minimum number of items on the stack.\n * @return Zero if conditions are met, otherwise a Lua error (longjmp).\n **/\nint luax_assert_argc(lua_State *L, int min);\n\n/**\n * Require at least 'min', but more than 'max' items on the stack.\n * @param L The Lua state.\n * @param min The minimum number of items on the stack.\n * @param max The maximum number of items on the stack.\n * @return Zero if conditions are met, otherwise a Lua error (longjmp).\n **/\nint luax_assert_argc(lua_State *L, int min, int max);\n\n/**\n * Require that the value at idx is a function.\n * @param L The Lua state.\n *@param idx The index on the stack.\n **/\nint luax_assert_function(lua_State *L, int idx);\n\n/**\n * Require that the value at idx is not nil. If it is, the function throws an\n * error using an optional error string at idx+1.\n * @param L The Lua state.\n * @param idx The index on the stack.\n **/\nint luax_assert_nilerror(lua_State *L, int idx);\n\n/**\n * Registers all functions in the array l (see luaL_Reg) into the table at the\n * top of the stack.\n * Similar to Lua 5.2's luaL_setfuncs without the upvalues, and to Lua 5.1's\n * luaL_register without the library name.\n **/\nvoid luax_setfuncs(lua_State *L, const luaL_Reg *l);\n\n/**\n * Loads a Lua module using the 'require' function. Leaves the return result on\n * the stack.\n * @param name The name of the module to require.\n **/\nint luax_require(lua_State *L, const char *name);\n\n/**\n * Register a module in the love table. The love table will be created if it does not exist.\n * NOTE: The module-object is expected to have a +1 reference count before calling\n * this function, as it doesn't retain the object itself but Lua will release it\n * upon garbage collection.\n * @param L The Lua state.\n **/\nint luax_register_module(lua_State *L, const WrappedModule &m);\n\n/**\n * Inserts a module with 'name' into the package.preloaded table.\n * @param f The function to be called when the module is opened.\n * @param name The name of the module, with 'love'-prefix, for instance 'love.graphics'.\n **/\nint luax_preload(lua_State *L, lua_CFunction f, const char *name);\n\n/**\n * Register a new type.\n * NOTE: The type is passed by pointer instead of reference because calling va_start\n * on a reference is undefined behaviour.\n * @param type The type.\n * @param ... The list of lists of member functions for the type. (of type luaL_Reg*)\n **/\nint luax_register_type(lua_State *L, love::Type *type, ...);\n\n/**\n * Pushes the metatable of the specified type onto the stack.\n**/\nvoid luax_gettypemetatable(lua_State *L, const love::Type &type);\n\n/**\n * Do a table.insert from C\n * @param L the state\n * @param tindex the stack index of the table\n * @param vindex the stack index of the value\n * @param pos the position to insert it in\n **/\nint luax_table_insert(lua_State *L, int tindex, int vindex, int pos = -1);\n\n/**\n * Register a new searcher function for package.loaders. This can for instance enable\n * loading of files through love.filesystem using standard require.\n * @param L The Lua state.\n * @param f The searcher function.\n * @param pos The position to insert the loader in.\n **/\nint luax_register_searcher(lua_State *L, lua_CFunction f, int pos = -1);\n\n/**\n * Pushes a Lua representation of the given object onto the stack, creating and\n * storing the Lua representation in a weak table if it doesn't exist yet.\n * NOTE: The object will be retained by Lua and released upon garbage collection.\n * @param L The Lua state.\n * @param type The type information of the object.\n * @param object The pointer to the actual object.\n **/\nvoid luax_pushtype(lua_State *L, love::Type &type, love::Object *object);\n\ntemplate <typename T>\nvoid luax_pushtype(lua_State *L, T *object)\n{\n\tluax_pushtype(L, T::type, object);\n}\n\ntemplate <typename T>\nvoid luax_pushtype(lua_State *L, StrongRef<T> &object)\n{\n\tluax_pushtype(L, T::type, object);\n}\n\n/**\n * Creates a new Lua representation of the given object *without* checking if it\n * exists yet, and *without* storing it in a weak table.\n * This should only be used when performance is an extreme concern and the\n * object is not ever expected to be pushed to Lua again, as it prevents the\n * Lua-side objects from working in some cases when used as keys in tables.\n * NOTE: The object will be retained by Lua and released upon garbage collection.\n * @param L The Lua state.\n * @param type The type information of the object.\n * @param object The pointer to the actual object.\n **/\nvoid luax_rawnewtype(lua_State *L, love::Type &type, love::Object *object);\n\n/**\n * Stores the value at the given index on the stack into a Variant object.\n */\nLOVE_EXPORT Variant luax_checkvariant(lua_State *L, int idx, bool allowuserdata = true, std::set<const void*> *tableSet = nullptr);\n\n/**\n * Pushes the contents of the given Variant index onto the stack.\n */\nLOVE_EXPORT void luax_pushvariant(lua_State *L, const Variant &v);\n\n/**\n * Checks whether the value at idx is a certain type.\n * @param L The Lua state.\n * @param idx The index on the stack.\n * @param type The type to check for.\n * @return True if the value is Proxy of the specified type, false otherwise.\n **/\nbool luax_istype(lua_State *L, int idx, love::Type &type);\n\n/**\n * Gets the function love.module.function and puts it on top of the stack (alone). If the\n * love table, the module, or the function does not exist, an error is returned.\n * @return An error if nonexistent, or 1 if successful.\n **/\nint luax_getfunction(lua_State *L, const char *module, const char *function);\n\n/**\n * Converts an object into another object by the specified function love.module.function.\n * The conversion function must accept a single object of the relevant type as a parameter,\n * and returnone value. If the function does not exist (see luax_getfunction), an error is returned.\n *\n * Note that the initial object at idx is replaced by the new object.\n *\n * @param L The Lua state.\n * @param idx The index on the stack.\n * @param module The module in the love table.\n * @param function The function in the module.\n **/\nint luax_convobj(lua_State *L, int idx, const char *module, const char *function);\n\n/**\n * Converts an object into another object by the specified function love.module.function.\n * The conversion function must accept a single object of the relevant type as its first parameter,\n * and return one value. If the function does not exist (see luax_getfunction), an error is returned.\n *\n * Note that the initial object at idx is replaced by the new object.\n *\n * @param L The Lua state.\n * @param idxs An array of indices on the stack.\n * @param n How many arguments are being passed.\n * @param module The module in the love table.\n * @param function The function in the module.\n **/\nint luax_convobj(lua_State *L, const int idxs[], int n, const char *module, const char *function);\nint luax_convobj(lua_State *L, const std::vector<int>& idxs, const char *module, const char *function);\n\n// pcall versions of the above\nint luax_pconvobj(lua_State *L, int idx, const char *module, const char *function);\nint luax_pconvobj(lua_State *L, const int idxs[], int n, const char *module, const char *function);\nint luax_pconvobj(lua_State *L, const std::vector<int>& idxs, const char *module, const char *function);\n\n/**\n * 'Insist' that a table 'k' exists in the table at idx. Insistence involves that the\n * table (k) is created if it does not exist in the table at idx. The table at idx must\n * pre-exist, however. Also note that if the a non-table value exists at the specified\n * location, it will be overwritten with a new table. The insisted table, and only the\n * insisted table, will be placed on top of the stack.\n *\n * @param idx The index on the stack containing a table.\n * @param k The name of the table we are insisting exist.\n **/\nint luax_insist(lua_State *L, int idx, const char *k);\n\n/**\n * Insist that a global table 'k' exists. See luax_insist.\n * @param k The name of the table we are insisting exist.\n **/\nint luax_insistglobal(lua_State *L, const char *k);\n\n/**\n * Insists that a table 'k' exists inside the 'love' table. See luax_insist.\n * @param k The name of the table we are insisting exist.\n **/\nint luax_insistlove(lua_State *L, const char *k);\n\n/**\n * Pushes the table 'k' in the love table onto the stack. Pushes nil if the\n * table doesn't exist.\n * @param k The name of the table we want to get.\n **/\nint luax_getlove(lua_State *L, const char *k);\n\n/**\n * Gets (creates if needed) the specified Registry, and pushes it into the\n * stack.\n * @param L The Lua state.\n * @param r The Registry to get.\n **/\nint luax_insistregistry(lua_State *L, Registry r);\n\n/**\n * Gets the specified Registry, and pushes it onto the stack. Pushes nil if the\n * registry hasn't been created (see luax_insistregistry.)\n * @param L The Lua state.\n * @param r The Registry to get.\n **/\nint luax_getregistry(lua_State *L, Registry r);\n\n/**\n * Gets (and pins if needed) a \"pinned\" Lua thread (coroutine) in the specified\n * Lua state. This will usually be the main Lua thread, unless the first call\n * to this function for a specific Lua state is made from within a coroutine.\n * NOTE: This does not push anything to the stack.\n **/\nlua_State *luax_insistpinnedthread(lua_State *L);\n\n/**\n * Gets a \"pinned\" Lua thread (coroutine) in the specified Lua state. This will\n * usually be the main Lua thread. This can be used to access global variables\n * in a specific Lua state without needing another alive lua_State value.\n * PRECONDITION: luax_insistpinnedthread must have been called on a lua_State\n * value corresponding to the Lua state which will be used with this function.\n * NOTE: This does not push anything to the stack.\n **/\nlua_State *luax_getpinnedthread(lua_State *L);\n\n/**\n * Mark a function as deprecated. Should only be called inside wrapper function\n * code.\n **/\nvoid luax_markdeprecated(lua_State *L, int level, const char *name, APIType api);\nvoid luax_markdeprecated(lua_State *L, int level, const char *name, APIType api, DeprecationType type, const char *replacement);\n\nextern \"C\" { // Also called from luasocket\n\tint luax_typerror(lua_State *L, int narg, const char *tname);\n}\n\nint luax_enumerror(lua_State *L, const char *enumName, const char *value);\nint luax_enumerror(lua_State *L, const char *enumName, const std::vector<std::string> &values, const char *value);\n\ntemplate <typename T>\nvoid luax_checktablefields(lua_State *L, int idx, const char *enumName, bool (*getConstant)(const char *, T &))\n{\n\tluaL_checktype(L, idx, LUA_TTABLE);\n\n\t// We want to error for invalid / misspelled fields in the table.\n\tlua_pushnil(L);\n\twhile (lua_next(L, idx))\n\t{\n\t\tif (lua_type(L, -2) != LUA_TSTRING)\n\t\t\tluax_typerror(L, -2, \"string\");\n\n\t\tconst char *key = luaL_checkstring(L, -2);\n\t\tT constantvalue;\n\n\t\tif (!getConstant(key, constantvalue))\n\t\t\tluax_enumerror(L, enumName, key);\n\n\t\tlua_pop(L, 1);\n\t}\n}\n\nvoid luax_runwrapper(lua_State *L, const char *filedata, size_t datalen, const char *filename, const love::Type &type, void *ffifuncs);\n\n/**\n * Calls luax_objlen/lua_rawlen depending on version\n **/\nsize_t luax_objlen(lua_State *L, int ndx);\n\nextern \"C\" { // Called by enet and luasocket\n\tvoid luax_register(lua_State *L, const char *name, const luaL_Reg *l);\n\tint luax_c_insistglobal(lua_State *L, const char *k);\n}\n\n/**\n * Like luax_totype, but causes an error if the value at idx is not Proxy,\n * or is not the specified type.\n * @param L The Lua state.\n * @param idx The index on the stack.\n * @param type The type bit.\n **/\ntemplate <typename T>\nT *luax_checktype(lua_State *L, int idx, const love::Type &type)\n{\n\tif (lua_type(L, idx) != LUA_TUSERDATA)\n\t{\n\t\tconst char *name = type.getName();\n\t\tluax_typerror(L, idx, name);\n\t}\n\n\tProxy *u = (Proxy *)lua_touserdata(L, idx);\n\n\tif (u->type == nullptr || !u->type->isa(type))\n\t{\n\t\tconst char *name = type.getName();\n\t\tluax_typerror(L, idx, name);\n\t}\n\n\tif (u->object == nullptr)\n\t\tluaL_error(L, \"Cannot use object after it has been released.\");\n\n\treturn (T *)u->object;\n}\n\ntemplate <typename T>\nT *luax_checktype(lua_State *L, int idx)\n{\n\treturn luax_checktype<T>(L, idx, T::type);\n}\n\ntemplate <typename T>\nT *luax_ffi_checktype(Proxy *p, const love::Type &type = T::type)\n{\n\t// FIXME: We need better type-checking...\n\tif (p == nullptr || p->object == nullptr || p->type == nullptr || !p->type->isa(type))\n\t\treturn nullptr;\n\treturn (T *) p->object;\n}\n\ntemplate <typename T>\nT *luax_getmodule(lua_State *L, const love::Type &type)\n{\n\tconst char *name = type.getName();\n\n\tluax_insistregistry(L, REGISTRY_MODULES);\n\tlua_getfield(L, -1, name);\n\n\tif (!lua_isuserdata(L, -1))\n\t\tluaL_error(L, \"Tried to get nonexistent module %s.\", name);\n\n\tProxy *u = (Proxy *)lua_touserdata(L, -1);\n\n\tif (u->type == nullptr || !u->type->isa(type))\n\t\tluaL_error(L, \"Incorrect module %s\", name);\n\n\tlua_pop(L, 2);\n\n\treturn (T *)u->object;\n}\n\ntemplate <typename T>\nT *luax_getmodule(lua_State *L)\n{\n\treturn luax_getmodule<T>(L, T::type);\n}\n\ntemplate <typename T>\nT *luax_optmodule(lua_State *L, const love::Type &type)\n{\n\tconst char *name = type.getName();\n\n\tluax_insistregistry(L, REGISTRY_MODULES);\n\tlua_getfield(L, -1, name);\n\n\tif (!lua_isuserdata(L, -1))\n\t{\n\t\tlua_pop(L, 2);\n\t\treturn 0;\n\t}\n\n\tProxy *u = (Proxy *)lua_touserdata(L, -1);\n\n\tif (!u->type->isa(type))\n\t\tluaL_error(L, \"Incorrect module %s\", name);\n\n\tlua_pop(L, 2);\n\n\treturn (T *) u->object;\n}\n\ntemplate <typename T>\nT *luax_optmodule(lua_State *L)\n{\n\treturn luax_optmodule<T>(L, T::type);\n}\n\n/**\n * Converts the value at idx to the specified type. Returns null if the type\n * doesn't match.\n * @param L The Lua state.\n * @param idx The index on the stack.\n * @param type The type of the object.\n **/\ntemplate <typename T>\nT *luax_totype(lua_State *L, int idx, const love::Type &type)\n{\n\tif (lua_type(L, idx) != LUA_TUSERDATA)\n\t\treturn nullptr;\n\n\tProxy *p = (Proxy *) lua_touserdata(L, idx);\n\n\tif (p->type != nullptr && p->type->isa(type))\n\t{\n\t\tif (p->object == nullptr)\n\t\t\tluaL_error(L, \"Cannot use object after it has been released.\");\n\n\t\treturn (T *) p->object;\n\t}\n\n\treturn nullptr;\n}\n\ntemplate <typename T>\nT *luax_totype(lua_State *L, int idx)\n{\n\treturn luax_totype<T>(L, idx, T::type);\n}\n\nType *luax_type(lua_State *L, int idx);\n\n/**\n * Converts any exceptions thrown by the passed lambda function into a Lua error.\n * lua_error (and luaL_error) cannot be called from inside the exception handler\n * because they use longjmp, which causes undefined behaviour when the\n * destructor of the exception would have been called.\n **/\ntemplate <typename T>\nint luax_catchexcept(lua_State *L, const T& func)\n{\n\tbool should_error = false;\n\n\ttry\n\t{\n\t\tfunc();\n\t}\n\tcatch (const std::exception &e)\n\t{\n\t\tshould_error = true;\n\t\tlua_pushstring(L, e.what());\n\t}\n\n\tif (should_error)\n\t\treturn luaL_error(L, \"%s\", lua_tostring(L, -1));\n\n\treturn 0;\n}\n\ntemplate <typename T, typename F>\nint luax_catchexcept(lua_State *L, const T& func, const F& finallyfunc)\n{\n\tbool should_error = false;\n\n\ttry\n\t{\n\t\tfunc();\n\t}\n\tcatch (const std::exception &e)\n\t{\n\t\tshould_error = true;\n\t\tlua_pushstring(L, e.what());\n\t}\n\n\tfinallyfunc(should_error);\n\n\tif (should_error)\n\t\treturn luaL_error(L, \"%s\", lua_tostring(L, -1));\n\n\treturn 0;\n}\n\n/**\n * Compatibility shim for lua_resume\n * Exported because it's used in the launcher\n **/\nLOVE_EXPORT int luax_resume(lua_State *L, int nargs, int* nres);\n\n} // love\n\n#endif // LOVE_RUNTIME_H\n"
  },
  {
    "path": "src/common/types.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// STL\n#include <unordered_map>\n\n#include \"types.h\"\n\nnamespace love\n{\n\nstatic std::unordered_map<std::string, Type*> types;\n\nType::Type(const char *name, Type *parent)\n\t: name(name)\n\t, parent(parent)\n\t, id(0)\n\t, inited(false)\n{\n}\n\nvoid Type::init()\n{\n\tstatic uint32 nextId = 1;\n\n\t// Make sure we don't init twice, that would be bad\n\tif (inited)\n\t\treturn;\n\n\t// Note: we add it here, not in the constructor, because some Types can get initialized before the map!\n\ttypes[name] = this;\n\tid = nextId++;\n\tbits[id] = true;\n\tinited = true;\n\n\tif (!parent)\n\t\treturn;\n\tif (!parent->inited)\n\t\tparent->init();\n\tbits |= parent->bits;\n}\n\nuint32 Type::getId()\n{\n\tif (!inited)\n\t\tinit();\n\treturn id;\n}\n\nconst char *Type::getName() const\n{\n\treturn name;\n}\n\nType *Type::byName(const char *name)\n{\n\tauto pos = types.find(name);\n\tif (pos == types.end())\n\t\treturn nullptr;\n\treturn pos->second;\n}\n\n} // love\n"
  },
  {
    "path": "src/common/types.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_TYPES_H\n#define LOVE_TYPES_H\n\n#include \"int.h\"\n\n// STD\n#include <bitset>\n\nnamespace love\n{\n\nclass Type\n{\npublic:\n\tstatic const uint32 MAX_TYPES = 128;\n\n\tType(const char *name, Type *parent);\n\tType(const Type&) = delete;\n\n\tstatic Type *byName(const char *name);\n\n\tvoid init();\n\tuint32 getId();\n\tconst char *getName() const;\n\n\tbool isa(const uint32 &other)\n\t{\n\t\tif (!inited)\n\t\t\tinit();\n\t\treturn bits[other];\n\t}\n\n\tbool isa(const Type &other)\n\t{\n\t\tif (!inited)\n\t\t\tinit();\n\t\t// Note that if this type implements the other\n\t\t// calling init above will also have inited\n\t\t// the other.\n\t\treturn bits[other.id];\n\t}\n\nprivate:\n\tconst char * const name;\n\tType * const parent;\n\tuint32 id;\n\tbool inited;\n\tstd::bitset<MAX_TYPES> bits;\n};\n\n} // love\n\n#endif // LOVE_TYPES_H\n"
  },
  {
    "path": "src/common/utf8.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"utf8.h\"\n\n#ifdef LOVE_WINDOWS\n\nnamespace love\n{\n\nstd::string to_utf8(LPCWSTR wstr)\n{\n\tsize_t wide_len = wcslen(wstr)+1;\n\n\t// Get size in UTF-8.\n\tint utf8_size = WideCharToMultiByte(CP_UTF8, 0, wstr, wide_len, 0, 0, 0, 0);\n\n\tchar *utf8_str = new char[utf8_size];\n\n\t// Convert to UTF-8.\n\tint ok = WideCharToMultiByte(CP_UTF8, 0, wstr, wide_len, utf8_str, utf8_size, 0, 0);\n\n\tstd::string ret;\n\tif (ok)\n\t\tret = utf8_str;\n\n\tdelete[] utf8_str;\n\treturn ret;\n}\n\nstd::wstring to_widestr(const std::string &str)\n{\n\tif (str.empty())\n\t\treturn std::wstring();\n\n\tint wide_size = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), (int) str.length(), nullptr, 0);\n\n\tif (wide_size == 0)\n\t\treturn std::wstring();\n\n\tstd::wstring widestr;\n\twidestr.resize(wide_size);\n\n\tint ok = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), (int) str.length(), &widestr[0], widestr.length());\n\n\tif (!ok)\n\t\treturn std::wstring();\n\n\treturn widestr;\n}\n\nvoid replace_char(std::string &str, char find, char replace)\n{\n\tint length = str.length();\n\n\tfor (int i = 0; i<length; i++)\n\t{\n\t\tif (str[i] == find)\n\t\t\tstr[i] = replace;\n\t}\n}\n\n} // love\n\n#endif // LOVE_WINDOWS\n"
  },
  {
    "path": "src/common/utf8.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"config.h\"\n\n#ifdef LOVE_WINDOWS\n\n#include <string>\n\n#define WIN32_LEAN_AND_MEAN\n#include <windows.h>\n\nnamespace love\n{\n\n/**\n * Convert the wide string to a UTF-8 encoded string.\n * @param wstr The wide-char string.\n * @return A UTF-8 string.\n **/\nstd::string to_utf8(LPCWSTR wstr);\n\n/**\n * Convert a UTF-8 encoded string to a wide string.\n * @param str The UTF-8 string.\n * @return A wide string.\n**/\nstd::wstring to_widestr(const std::string &str);\n\n/**\n * Replace all occurences of 'find' with 'replace' in a string.\n * @param str The string to modify.\n * @param find The character to match.\n * @param replace The character to replace matches.\n **/\nvoid replace_char(std::string &str, char find, char replace);\n\n} // love\n\n#endif // LOVE_WINDOWS\n"
  },
  {
    "path": "src/common/version.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_VERSION_H\n#define LOVE_VERSION_H\n\nnamespace love\n{\n\n// Version stuff.\n#define LOVE_VERSION_STRING \"12.0\"\nstatic const int VERSION_MAJOR = 12;\nstatic const int VERSION_MINOR = 0;\nstatic const int VERSION_REV = 0;\nstatic const char *VERSION = LOVE_VERSION_STRING;\nstatic const char *VERSION_COMPATIBILITY[] =  { VERSION, 0 };\nstatic const char *VERSION_CODENAME = \"Bestest Friend\";\n\n} // love\n\n#endif // LOVE_VERSION_H\n"
  },
  {
    "path": "src/libraries/.editorconfig",
    "content": "# Don't enforce any styles here, it's all third party code.\nroot = true\n"
  },
  {
    "path": "src/libraries/Wuff/wuff.c",
    "content": "#include <string.h>\n\n#include \"wuff_config.h\"\n#include \"wuff.h\"\n#include \"wuff_internal.h\"\n\n\nwuff_sint32 wuff_open(struct wuff_handle ** handle_pointer, struct wuff_callback * callback, void * userdata)\n{\n\tstruct wuff_handle * handle;\n\twuff_sint32 wuff_status;\n\n\tif (handle_pointer == NULL || callback == NULL)\n\t\treturn WUFF_INVALID_PARAM;\n\n\thandle = wuff_alloc(sizeof(struct wuff_handle));\n\tif (handle == NULL)\n\t\treturn WUFF_MEMALLOC_ERROR;\n\n\tmemset(handle, 0, sizeof(struct wuff_handle));\n\thandle->buffer.data = NULL;\n\thandle->callback = callback;\n\thandle->userdata = userdata;\n\n\twuff_status = wuff_setup(handle);\n\tif (wuff_status < 0)\n\t{\n\t\twuff_cleanup(handle);\n\t\treturn wuff_status;\n\t}\n\n\t*handle_pointer = handle;\n\n\treturn WUFF_SUCCESS;\n}\n\nwuff_sint32 wuff_close(struct wuff_handle * handle)\n{\n\twuff_sint32 wuff_status;\n\n\tif (handle == NULL)\n\t\treturn WUFF_INVALID_PARAM;\n\n\twuff_status = wuff_cleanup(handle);\n\tWUFF_STATUS_BAIL()\n\n\treturn WUFF_SUCCESS;\n}\n\nwuff_sint32 wuff_seek(struct wuff_handle * handle, wuff_uint64 offset)\n{\n\twuff_sint32 wuff_status;\n\twuff_uint64 seek_offset;\n\n\tif (handle == NULL)\n\t\treturn WUFF_INVALID_PARAM;\n\n\t/* Clamp offset to stream length. */\n\toffset = offset <= handle->stream.length ? offset : handle->stream.length;\n\tseek_offset = offset * handle->stream.header.block_size;\n\twuff_status = handle->callback->seek(handle->userdata, handle->stream.data.offset + seek_offset);\n\tWUFF_STATUS_BAIL()\n\n\thandle->stream.position = offset;\n\thandle->output.block_offset = 0;\n\n\t/* A new position requires an empty buffer. */\n\twuff_status = wuff_buffer_clear(handle);\n\tWUFF_STATUS_BAIL()\n\n\treturn\tWUFF_SUCCESS;\n}\n\nwuff_sint32 wuff_tell(struct wuff_handle * handle, wuff_uint64 * offset)\n{\n\tif (handle == NULL)\n\t\treturn WUFF_INVALID_PARAM;\n\n\t*offset = handle->stream.position;\n\n\treturn\tWUFF_SUCCESS;\n}\n\nwuff_sint32 wuff_stream_info(struct wuff_handle * handle, struct wuff_info * info)\n{\n\tif (handle == NULL || info == NULL)\n\t\treturn WUFF_INVALID_PARAM;\n\n\tinfo->format = handle->stream.format;\n\tinfo->channels = handle->stream.header.channels;\n\tinfo->sample_rate = handle->stream.header.sample_rate;\n\tinfo->bits_per_sample = handle->stream.header.bits_per_sample;\n\tinfo->length = handle->stream.length;\n\t/* Think about adding channel mapping and perhaps other things. */\n\n\treturn WUFF_SUCCESS;\n}\n\nwuff_sint32 wuff_format(struct wuff_handle * handle, wuff_uint16 format)\n{\n\twuff_sint32 wuff_status;\n\n\tif (handle == NULL)\n\t\treturn WUFF_INVALID_PARAM;\n\telse if (format >= WUFF_FORMAT_MAX)\n\t\treturn WUFF_FORMAT_UNSUPPORTED;\n\n\t/* A format change resets the position to the start of the block. */\n\twuff_status = wuff_seek(handle, handle->stream.position);\n\tWUFF_STATUS_BAIL()\n\n\twuff_status = wuff_set_output_format(handle, format);\n\tWUFF_STATUS_BAIL()\n\n\treturn WUFF_SUCCESS;\n}\n\nwuff_sint32 wuff_read(struct wuff_handle * handle, wuff_uint8 * out_buffer, size_t * out_size)\n{\n\tsize_t current_offset;\n\tsize_t r_samples, num_samples;\n\twuff_uint8 head_offset, head, tail, sample_size;\n\twuff_uint8 * in_buffer;\n\twuff_sint32 wuff_status;\n\n\tif (handle == NULL || out_buffer == NULL || out_size == NULL)\n\t\treturn WUFF_INVALID_PARAM;\n\n\tif (*out_size == 0)\n\t\treturn WUFF_SUCCESS;\n\n\tsample_size = (wuff_uint8)handle->output.bytes_per_sample;\n\n\t/* Calculating the number of samples that fit into the application buffer. */\n\t/* The first and last sample may be truncated. */\n\tcurrent_offset = handle->output.block_offset;\n\thead_offset = current_offset % sample_size;\n\thead = head_offset == 0 ? 0 : sample_size - head_offset;\n\tnum_samples = wuff_calculate_samples(*out_size, sample_size, &head, &tail);\n\n\t/* Requesting the number of samples from the buffer. */\n\t/* Calculate the new sample count if necessary and write the output. */\n\tr_samples = num_samples;\n\twuff_status = wuff_buffer_request(handle, &in_buffer, &r_samples);\n\tWUFF_STATUS_BAIL()\n\telse if (r_samples == 0)\n\t{\n\t\t/* Possible EOF. */\n\t\t*out_size = 0;\n\t}\n\telse\n\t{\n\t\tif (r_samples == 1 && head != 0)\n\t\t{\n\t\t\t/* Only the first truncated sample fits. */\n\t\t\t/* I really hope nobody will use small buffers like this. */\n\t\t\tnum_samples = 0;\n\t\t\ttail = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* At this point the first (possibly truncated) sample will be fully written. */\n\t\t\t/* Subtract the first and last sample from the count if they're truncated. */\n\t\t\tif (r_samples < num_samples)\n\t\t\t\ttail = 0;\n\t\t\tnum_samples = r_samples - !!head - !!tail;\n\t\t}\n\n\t\thandle->output.function(out_buffer, in_buffer, num_samples, head_offset, head, tail);\n\n\t\t/* Report the number of bytes written. */\n\t\t*out_size = num_samples * sample_size + head + tail;\n\n\t\t/* Adjust the block offset and sample position. */\n\t\tcurrent_offset += *out_size;\n\t\tif (current_offset >= handle->output.block_size)\n\t\t{\n\t\t\thandle->stream.position += current_offset / handle->output.block_size;\n\t\t\thandle->output.block_offset = current_offset % handle->output.block_size;\n\t\t}\n\t\telse\n\t\t{\n\t\t\thandle->output.block_offset = current_offset;\n\t\t}\n\n\t\t/* Release the fully processed samples from the buffer. */\n\t\twuff_status = wuff_buffer_release(handle, head_offset + head == sample_size ? num_samples + 1 : num_samples);\n\t\tWUFF_STATUS_BAIL()\n\t}\n\n\treturn WUFF_SUCCESS;\n}\n\nvoid wuff_version(struct wuff_version * version)\n{\n\tif (version == NULL)\n\t\treturn;\n\n\tversion->major = WUFF_VERSION_MAJOR;\n\tversion->minor = WUFF_VERSION_MINOR;\n\tversion->build = WUFF_VERSION_BUILD;\n\tversion->revision = WUFF_VERSION_REVISION;\n}\n"
  },
  {
    "path": "src/libraries/Wuff/wuff.h",
    "content": "/*\n *\tWuff - A very basic WAVE reader\n */\n\n#ifndef WUFF_H\n#define WUFF_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n#define WUFF_VERSION_MAJOR         0\n#define WUFF_VERSION_MINOR         0\n#define WUFF_VERSION_BUILD         0\n#define WUFF_VERSION_REVISION      2\n\n\n#ifndef WUFF_API_OVERRIDE\n\t#if defined(_WIN32) && defined(WUFF_DYNAMIC_LIB)\n\t\t#define WUFF_EXPORT __declspec(dllexport)\n\t\t#define WUFF_IMPORT __declspec(dllimport)\n\t#else\n\t\t#define WUFF_EXPORT\n\t\t#define WUFF_IMPORT\n\t#endif\n#endif\n\n#ifdef WUFF_BUILDING_CORE\n\t#define WUFF_API WUFF_EXPORT\n#else\n\t#define WUFF_API WUFF_IMPORT\n#endif\n\n\n#ifdef WUFF_FORCE_STDINT_H\n\t#include <stdint.h>\ntypedef uint8_t             wuff_uint8;\ntypedef int8_t              wuff_sint8;\ntypedef uint16_t            wuff_uint16;\ntypedef int16_t             wuff_sint16;\ntypedef uint32_t            wuff_uint32;\ntypedef int32_t             wuff_sint32;\n\t#ifdef WUFF_NO_64BIT_TYPE\ntypedef uint32_t            wuff_uint64;\ntypedef int32_t             wuff_sint64;\n\t#else\ntypedef uint64_t            wuff_uint64;\ntypedef int64_t             wuff_sint64;\n\t#endif\n#elif _MSC_VER\ntypedef unsigned __int8     wuff_uint8;\ntypedef signed __int8       wuff_sint8;\ntypedef unsigned __int16    wuff_uint16;\ntypedef signed __int16      wuff_sint16;\ntypedef unsigned __int32    wuff_uint32;\ntypedef signed __int32      wuff_sint32;\ntypedef unsigned __int64    wuff_uint64;\ntypedef signed __int64      wuff_sint64;\n#else\ntypedef unsigned char       wuff_uint8;\ntypedef signed char         wuff_sint8;\ntypedef unsigned short      wuff_uint16;\ntypedef signed short        wuff_sint16;\ntypedef unsigned int        wuff_uint32;\ntypedef signed int          wuff_sint32;\n\t#ifdef WUFF_NO_64BIT_TYPE\ntypedef unsigned long       wuff_uint64;\ntypedef signed long         wuff_sint64;\n\t#else\ntypedef unsigned long long  wuff_uint64;\ntypedef signed long long    wuff_sint64;\n\t#endif\n#endif\n\n/** @file */\n/**\n * Opaque structure used to identify the open Wuff streams.\n */\nstruct wuff_handle;\n\n/**\n * Callbacks that control the delivery of the data of the WAVE file.\n *\n * The return values of the functions indicate their status. A zero or positive\n * value means success and a negative value failure. The macros WUFF_SUCCESS and\n * WUFF_ERROR, or a value equal or below WUFF_USER_ERROR can be used. The error\n * value will be returned by the function called by the application.\n */\nstruct wuff_callback\n{\n\t/**\n\t * The read callback requests the linking application to write at least\n\t * 'size' bytes into the memory where 'buffer' is pointing to. The value\n\t * pointed to by 'size' must be update to the actual number of bytes\n\t * written. Zero will be interepreted as the end-of-file.\n\t *\n\t * @param userdata The userdata set with wuff_open.\n\t * @param buffer A pointer to the memory where the data can be written to.\n\t * @param size A pointer to the size of the buffer and the bytes written.\n\t */\n\twuff_sint32 (* read)(void * userdata, wuff_uint8 * buffer, size_t * size);\n\n\t/**\n\t * The seek callback requests the linking application to seek to a new byte\n\t * offset in the WAVE data. The next call to the read callback must then\n\t * write data starting from this position. The offset is always relative\n\t * to the beginning of the WAVE data.\n\t *\n\t * @param userdata The userdata set with wuff_open.\n\t * @param offset The new offset.\n\t */\n\twuff_sint32 (* seek)(void * userdata, wuff_uint64 offset);\n\n\t/**\n\t * The tell callback requests the linking application to write the current\n\t * byte position to the integer pointed to by 'offset'.\n\t *\n\t * @param userdata The userdata set with wuff_open.\n\t * @param offset A pointer to an integer where the current position can be written to.\n\t */\n\twuff_sint32 (* tell)(void * userdata, wuff_uint64 * offset);\n};\n\n\n/**\n * Stream information structure.\n */\nstruct wuff_info\n{\n\twuff_uint16 format;           /**< The format of the stream.\n\t                               *   See \"Wuff raw sample formats\" below. */\n\twuff_uint16 channels;         /**< The number of channels in the stream. */\n\twuff_uint32 sample_rate;      /**< The sample rate in hertz. */\n\twuff_uint16 bits_per_sample;  /**< The number of bits per sample. */\n\twuff_uint64 length;           /**< The length of the stream in samples. */\n};\n\n\n/**\n * Version information structure.\n */\nstruct wuff_version\n{\n\twuff_uint16 major;\n\twuff_uint16 minor;\n\twuff_uint16 build;\n\twuff_uint16 revision;\n};\n\n\n/**\n * Opens a new Wuff stream. This will read from the callbacks immediately, make\n * sure they're ready. It will check if the WAVE file is supported.\n *\n * @param handle A pointer to pointer of a wuff_handle that will be\n * initialized if the function succeeds.\n * @param callback The callbacks for the data of the WAVE file.\n * @param userdata A void pointer that will be passed to the callbacks.\n * @return Returns a negative value if an error occured.\n */\nWUFF_API wuff_sint32 wuff_open(struct wuff_handle ** handle, struct wuff_callback * callback, void * userdata);\n\n/**\n * Closes a Wuff stream.\n *\n * @param handle The Wuff stream handle.\n * @return Returns a negative value if an error occured.\n */\nWUFF_API wuff_sint32 wuff_close(struct wuff_handle * handle);\n\n/**\n * Fills the wuff_info struct with information about the stream.\n *\n * @param handle The Wuff stream handle.\n * @param info A pointer to a wuff_info struct.\n * @return Returns a negative value if an error occured.\n */\nWUFF_API wuff_sint32 wuff_stream_info(struct wuff_handle * handle, struct wuff_info * info);\n\n/**\n * Sets the output format of the decoder. A new format resets the decoder output\n * to the beginning of the current block (the sample of the first channel).\n *\n * @param handle The Wuff stream handle.\n * @param format The new output format.\n * @return Returns a negative value if an error occured.\n */\nWUFF_API wuff_sint32 wuff_format(struct wuff_handle * handle, wuff_uint16 format);\n\n/**\n * Decodes samples to the passed memory location. The size_t pointer points to\n * the maximum number of bytes that can be written to the buffer. This count\n * will be adjusted to the number of bytes written to the buffer.\n *\n * @param handle The Wuff stream handle.\n * @param buffer The buffer to write to.\n * @param size The maximum number of bytes to write to the buffer.\n * @return Returns a negative value if an error occured.\n */\nWUFF_API wuff_sint32 wuff_read(struct wuff_handle * handle, wuff_uint8 * buffer, size_t * size);\n\n/**\n * Seeks to a sample location.\n * The next call to wuff_read will return samples starting from this position.\n *\n * @param handle The Wuff stream handle.\n * @param offset The sample offset to seek to.\n * @return Returns a negative value if an error occured.\n */\nWUFF_API wuff_sint32 wuff_seek(struct wuff_handle * handle, wuff_uint64 offset);\n\n/**\n * Sets the current position.\n *\n * @param handle The Wuff stream handle.\n * @param offset A pointer to a integer that will receive the sample offset.\n * @return Returns a negative value if an error occured.\n */\nWUFF_API wuff_sint32 wuff_tell(struct wuff_handle * handle, wuff_uint64 * offset);\n\n/**\n * Copies the Wuff version of the binary into the struct.\n * For compile-time version information use the WUFF_VERSION_MAJOR,\n * WUFF_VERSION_MINOR, WUFF_VERSION_BUILD, and WUFF_VERSION_REVISION macros.\n *\n * @param version A pointer to a wuff_version struct that will receive the\n * version information.\n */\nWUFF_API void wuff_version(struct wuff_version * version);\n\n\n/* Wuff raw sample formats. */\n#define WUFF_FORMAT_PCM_U8                             0\n#define WUFF_FORMAT_PCM_S16                            1\n#define WUFF_FORMAT_PCM_S24                            2\n#define WUFF_FORMAT_PCM_S32                            3\n#define WUFF_FORMAT_IEEE_FLOAT_32                      4\n#define WUFF_FORMAT_IEEE_FLOAT_64                      5\n#define WUFF_FORMAT_MAX                                6\n\n\n/* Success and error return values for all functions. */\n#define WUFF_STREAM_EOF                              100\n\n#define WUFF_SUCCESS                                   0\n\n#define WUFF_ERROR                                    -1\n#define WUFF_INVALID_PARAM                            -2\n#define WUFF_MEMALLOC_ERROR                           -3\n\n#define WUFF_STREAM_NOT_RIFF                        -100\n#define WUFF_STREAM_NOT_WAVE                        -101\n#define WUFF_STREAM_INVALID                         -102\n#define WUFF_STREAM_ZERO_CHANNELS                   -103\n#define WUFF_STREAM_ZERO_SAMPLE_RATE                -104\n#define WUFF_STREAM_ZERO_BITS_PER_SAMPLE            -105\n#define WUFF_STREAM_FORMAT_CHUNK_MISSING            -106\n#define WUFF_STREAM_DATA_CHUNK_MISSING              -107\n#define WUFF_STREAM_CHUNK_NOT_FOUND                 -108\n\n#define WUFF_FORMAT_UNSUPPORTED                     -200\n\n#define WUFF_BUFFER_INVALID_SIZE                    -300\n#define WUFF_BUFFER_INVALID_STREAM_POSITION         -301\n\n#define WUFF_USER_ERROR                           -10000\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* WUFF_H */\n"
  },
  {
    "path": "src/libraries/Wuff/wuff_config.h",
    "content": "#ifndef WUFF_CONFIG_H\n#define WUFF_CONFIG_H\n\n/* Defines that the internal code is being built. */\n/* The wuff.h header uses this to change export and import macros. */\n#define WUFF_BUILDING_CORE\n\n#ifndef WUFF_INLINE_OVERRIDE\n\t#ifdef __cplusplus\n\t\t#define WUFF_INLINE inline\n\t#else\n\t\t#ifdef _MSC_VER\n\t\t\t#define WUFF_INLINE __inline\n\t\t#elif __GNUC__\n\t\t\t#define WUFF_INLINE __inline__\n\t\t#else\n\t\t\t#define WUFF_INLINE\n\t\t#endif\n\t#endif\n#endif\n\n\n#ifndef WUFF_GCC_VISIBILITY_OVERRIDE\n\t#if __GNUC__ >= 4\n\t\t#define WUFF_INTERN_API __attribute__((visibility(\"hidden\")))\n\t#else\n\t\t#define WUFF_INTERN_API\n    #endif\n#endif\n\n\n#ifdef WUFF_MEMALLOC_OVERRIDE\n\t#ifdef __cplusplus\nextern \"C\" {\n\t#endif\n\n\t/* Define your own memory allocator. */\n\tvoid * wuff_alloc(size_t size);\n\tvoid wuff_free(void * mem);\n\n\t#ifdef __cplusplus\n}\n\t#endif\n#else\nWUFF_INTERN_API void * wuff_alloc(size_t size);\nWUFF_INTERN_API void wuff_free(void * mem);\n#endif\n\n\n#endif /* WUFF_CONFIG_H */\n"
  },
  {
    "path": "src/libraries/Wuff/wuff_convert.c",
    "content": "#include <string.h>\n\n#include \"wuff_config.h\"\n#include \"wuff.h\"\n#include \"wuff_convert.h\"\n\n/*\n * int8 functions.\n */\n\nWUFF_CONV_FUNC(wuff_int8_to_int8)\n{\n\t(void)offset;\n\tmemcpy(dst, src, samples + head + tail);\n}\n\nWUFF_CONV_FUNC(wuff_int8_to_int16)\n{\n\twuff_sint16 i16;\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\ti16 = (src[0] - 128) << 8;\n\t\tmemcpy(dst, (wuff_uint8 *)&i16 + offset, head);\n\t\tsrc += 1;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\ti16 = (src[i] - 128) << 8;\n\t\tmemcpy(dst + i * 2, &i16, 2);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\ti16 = (src[samples] - 128) << 8;\n\t\tmemcpy(dst + samples * 2, &i16, tail);\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_int8_to_int24)\n{\n\twuff_sint32 i24;\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\ti24 = (src[0] - 128) << 24;\n\t\tmemcpy(dst, (wuff_uint8 *)&i24 + 1 + offset, head);\n\t\tsrc += 1;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\ti24 = (src[i] - 128) << 24;\n\t\tmemcpy(dst + i * 3, (wuff_uint8 *)&i24 + 1, 3);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\ti24 = (src[samples] - 128) << 24;\n\t\tmemcpy(dst + samples * 3, (wuff_uint8 *)&i24 + 1, tail);\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_int8_to_int32)\n{\n\twuff_sint32 i32;\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\ti32 = (src[0] - 128) << 24;\n\t\tmemcpy(dst, (wuff_uint8 *)&i32 + offset, head);\n\t\tsrc += 1;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\ti32 = (src[i] - 128) << 24;\n\t\tmemcpy(dst + i * 4, &i32, 4);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\ti32 = (src[samples] - 128) << 24;\n\t\tmemcpy(dst + samples * 4, &i32, tail);\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_int8_to_float32)\n{\n\tfloat f32;\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\tf32 = (float)(src[0] - 128) / 128.0f;\n\t\tmemcpy(dst, (wuff_uint8 *)&f32 + offset, head);\n\t\tsrc += 1;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tf32 = (float)(src[i] - 128) / 128.0f;\n\t\tmemcpy(dst + i * 4, &f32, 4);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\tf32 = (float)(src[samples] - 128) / 128.0f;\n\t\tmemcpy(dst + samples * 4, &f32, tail);\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_int8_to_float64)\n{\n\tdouble f64;\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\tf64 = (double)(src[0] - 128) / 128.0;\n\t\tmemcpy(dst, (wuff_uint8 *)&f64 + offset, head);\n\t\tsrc += 1;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tf64 = (double)(src[i] - 128) / 128.0;\n\t\tmemcpy(dst + i * 8, &f64, 8);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\tf64 = (double)(src[samples] - 128) / 128.0;\n\t\tmemcpy(dst + samples * 8, &f64, tail);\n\t}\n}\n\n/*\n * int16 functions.\n */\n\nWUFF_CONV_FUNC(wuff_int16_to_int8)\n{\n\twuff_sint16 i16;\n\tsize_t i;\n\t(void)offset; (void)head; (void)tail;\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy(&i16, src + i * 2, 2);\n\t\tdst[i] = (i16 >> 8) + 128;\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_int16_to_int16)\n{\n\tmemcpy(dst, src + offset, samples * 2 + head + tail);\n}\n\nWUFF_CONV_FUNC(wuff_int16_to_int24)\n{\n\twuff_sint16 i16;\n\twuff_sint32 i24;\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\tmemcpy(&i16, src, 2);\n\t\ti24 = i16 << 16;\n\t\tmemcpy(dst, (wuff_uint8 *)&i24 + 1 + offset, head);\n\t\tsrc += 2;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy(&i16, src + i * 2, 2);\n\t\ti24 = i16 << 16;\n\t\tmemcpy(dst + i * 3, (wuff_uint8 *)&i24 + 1, 3);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\tmemcpy(&i16, src + samples * 2, 2);\n\t\ti24 = i16 << 16;\n\t\tmemcpy(dst + samples * 3, (wuff_uint8 *)&i24 + 1, tail);\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_int16_to_int32)\n{\n\twuff_sint16 i16;\n\twuff_sint32 i32;\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\tmemcpy(&i16, src, 2);\n\t\ti32 = i16 << 16;\n\t\tmemcpy(dst, (wuff_uint8 *)&i32 + offset, head);\n\t\tsrc += 2;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy(&i16, src + i * 2, 2);\n\t\ti32 = i16 << 16;\n\t\tmemcpy(dst + i * 4, &i32, 4);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\tmemcpy(&i16, src + samples * 2, 2);\n\t\ti32 = i16 << 16;\n\t\tmemcpy(dst + samples * 4, &i32, tail);\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_int16_to_float32)\n{\n\twuff_sint16 i16;\n\tfloat f32;\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\tmemcpy(&i16, src, 2);\n\t\tf32 = (float)i16 / 32768.0f;\n\t\tmemcpy(dst, (wuff_uint8 *)&f32 + offset, head);\n\t\tsrc += 2;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy(&i16, src + i * 2, 2);\n\t\tf32 = (float)i16 / 32768.0f;\n\t\tmemcpy(dst + i * 4, &f32, 4);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\tmemcpy(&i16, src + samples * 2, 2);\n\t\tf32 = (float)i16 / 32768.0f;\n\t\tmemcpy(dst + samples * 4, &f32, tail);\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_int16_to_float64)\n{\n\twuff_sint16 i16;\n\tdouble f64;\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\tmemcpy(&i16, src, 2);\n\t\tf64 = (double)i16  / 32768.0;\n\t\tmemcpy(dst, (wuff_uint8 *)&f64 + offset, head);\n\t\tsrc += 2;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy(&i16, src + i * 2, 2);\n\t\tf64 = (double)i16  / 32768.0;\n\t\tmemcpy(dst + i * 8, &f64, 8);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\tmemcpy(&i16, src + samples * 2, 2);\n\t\tf64 = (double)i16 / 32768.0;\n\t\tmemcpy(dst + samples * 8, &f64, tail);\n\t}\n}\n\n/*\n * int24 functions.\n */\n\nWUFF_CONV_FUNC(wuff_int24_to_int8)\n{\n\twuff_sint32 i24 = 0;\n\tsize_t i;\n\t(void)offset; (void)head; (void)tail;\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy((wuff_uint8 *)&i24 + 1, src + i * 3, 3);\n\t\tdst[i] = (wuff_uint8)((i24 >> 16) + 128);\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_int24_to_int16)\n{\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\tmemcpy(dst, src + 1 + offset, head);\n\t\tsrc += 3;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy(dst + i * 2, src + 1 + i * 3, 2);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\tmemcpy(dst + samples * 2, src + 1 + samples * 3, tail);\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_int24_to_int24)\n{\n\tmemcpy(dst, src + offset, samples * 3 + head + tail);\n}\n\nWUFF_CONV_FUNC(wuff_int24_to_int32)\n{\n\twuff_sint32 i32 = 0;\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\tmemcpy((wuff_uint8 *)&i32 + 1, src, 3);\n\t\tmemcpy(dst, (wuff_uint8 *)&i32 + offset, head);\n\t\tsrc += 3;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy((wuff_uint8 *)&i32 + 1, src + i * 3, 3);\n\t\tmemcpy(dst + i * 4, &i32, 4);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\tmemcpy((wuff_uint8 *)&i32 + 1, src + samples * 3, 3);\n\t\tmemcpy(dst + samples * 4, &i32, tail);\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_int24_to_float32)\n{\n\twuff_sint32 i24 = 0;\n\tfloat f32;\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\tmemcpy((wuff_uint8 *)&i24 + 1, src, 3);\n\t\tf32 = (float)((double)i24 / 2147483648.0);\n\t\tmemcpy(dst, (wuff_uint8 *)&f32 + offset, head);\n\t\tsrc += 3;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy((wuff_uint8 *)&i24 + 1, src + i * 3, 3);\n\t\tf32 = (float)((double)i24 / 2147483648.0);\n\t\tmemcpy(dst + i * 4, &f32, 4);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\tmemcpy((wuff_uint8 *)&i24 + 1, src + samples * 3, 3);\n\t\tf32 = (float)((double)i24 / 2147483648.0);\n\t\tmemcpy(dst + samples * 4, &f32, tail);\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_int24_to_float64)\n{\n\twuff_sint32 i24 = 0;\n\tdouble f64;\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\tmemcpy((wuff_uint8 *)&i24 + 1, src, 3);\n\t\tf64 = (double)i24 / 2147483648.0;\n\t\tmemcpy(dst, (wuff_uint8 *)&f64 + offset, head);\n\t\tsrc += 3;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy((wuff_uint8 *)&i24 + 1, src + i * 3, 3);\n\t\tf64 = (double)i24 / 2147483648.0;\n\t\tmemcpy(dst + i * 8, &f64, 8);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\tmemcpy((wuff_uint8 *)&i24 + 1, src + samples * 3, 3);\n\t\tf64 = (double)i24 / 2147483648.0;\n\t\tmemcpy(dst + samples * 8, &f64, tail);\n\t}\n}\n\n/*\n * int32 functions.\n */\n\nWUFF_CONV_FUNC(wuff_int32_to_int8)\n{\n\twuff_sint32 i32 = 0;\n\tsize_t i;\n\t(void)offset; (void)head; (void)tail;\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy(&i32, src + i * 4, 4);\n\t\tdst[i] = (i32 >> 24) + 128;\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_int32_to_int16)\n{\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\tmemcpy(dst, src + 2 + offset, head);\n\t\tsrc += 4;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy(dst + i * 2, src + 2 + i * 4, 2);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\tmemcpy(dst + samples * 2, src + 2 + samples * 4, tail);\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_int32_to_int24)\n{\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\tmemcpy(dst, src + 1 + offset, head);\n\t\tsrc += 4;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy(dst + i * 3, src + 1 + i * 4, 3);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\tmemcpy(dst + samples * 3, src + 1 + samples * 4, tail);\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_int32_to_int32)\n{\n\tmemcpy(dst, src + offset, samples * 4 + head + tail);\n}\n\nWUFF_CONV_FUNC(wuff_int32_to_float32)\n{\n\twuff_sint32 i32;\n\tfloat f32;\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\tmemcpy(&i32, src, 4);\n\t\tf32 = (float)((double)i32 / 2147483648.0);\n\t\tmemcpy(dst, (wuff_uint8 *)&f32 + offset, head);\n\t\tsrc += 4;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy(&i32, src + i * 4, 4);\n\t\tf32 = (float)((double)i32 / 2147483648.0);\n\t\tmemcpy(dst + i * 4, &f32, 4);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\tmemcpy(&i32, src + samples * 4, 4);\n\t\tf32 = (float)((double)i32 / 2147483648.0);\n\t\tmemcpy(dst + samples * 4, &f32, tail);\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_int32_to_float64)\n{\n\twuff_sint32 i32;\n\tdouble f64;\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\tmemcpy(&i32, src, 4);\n\t\tf64 = (double)i32 / 2147483648.0;\n\t\tmemcpy(dst, (wuff_uint8 *)&f64 + offset, head);\n\t\tsrc += 4;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy(&i32, src + i * 4, 4);\n\t\tf64 = (double)i32 / 2147483648.0;\n\t\tmemcpy(dst + i * 8, &f64, 8);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\tmemcpy(&i32, src + samples * 4, 4);\n\t\tf64 = (double)i32 / 2147483648.0;\n\t\tmemcpy(dst + samples * 8, &f64, tail);\n\t}\n}\n\n/*\n * float32 functions.\n */\n\nWUFF_CONV_FUNC(wuff_float32_to_int8)\n{\n\tfloat f32;\n\tsize_t i;\n\t(void)offset; (void)head; (void)tail;\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy(&f32, src + i * 4, 4);\n\t\tdst[i] = (wuff_uint8)((f32 * 127.5f) + 128.0f);\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_float32_to_int16)\n{\n\tfloat f32;\n\twuff_sint16 i16;\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\tmemcpy(&f32, src, 4);\n\t\ti16 = (wuff_sint16)(f32 * 32767.5f);\n\t\tmemcpy(dst, (wuff_uint8 *)&i16 + offset, head);\n\t\tsrc += 4;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy(&f32, src + i * 4, 4);\n\t\ti16 = (wuff_sint16)(f32 * 32767.5f);\n\t\tmemcpy(dst + i * 2, &i16, 2);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\tmemcpy(&f32, src + i * 4, 4);\n\t\ti16 = (wuff_sint16)(f32 * 32767.5f);\n\t\tmemcpy(dst + i * 2, &i16, tail);\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_float32_to_int24)\n{\n\tfloat f32;\n\twuff_sint32 i24;\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\tmemcpy(&f32, src, 4);\n\t\ti24 = (wuff_sint32)((double)f32 * 2147483647.5);\n\t\tmemcpy(dst, (wuff_uint8 *)&i24 + 1 + offset, head);\n\t\tsrc += 4;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy(&f32, src + i * 4, 4);\n\t\ti24 = (wuff_sint32)((double)f32 * 2147483647.5);\n\t\tmemcpy(dst + i * 3, (wuff_uint8 *)&i24 + 1, 3);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\tmemcpy(&f32, src + samples * 4, 4);\n\t\ti24 = (wuff_sint32)((double)f32 * 2147483647.5);\n\t\tmemcpy(dst + samples * 3, (wuff_uint8 *)&i24 + 1, tail);\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_float32_to_int32)\n{\n\tfloat f32;\n\twuff_sint32 i32;\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\tmemcpy(&f32, src, 4);\n\t\ti32 = (wuff_sint32)((double)f32 * 2147483647.5);\n\t\tmemcpy(dst, (wuff_uint8 *)&i32 + offset, head);\n\t\tsrc += 4;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy(&f32, src + i * 4, 4);\n\t\ti32 = (wuff_sint32)((double)f32 * 2147483647.5);\n\t\tmemcpy(dst + i * 4, &i32, 4);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\tmemcpy(&f32, src + samples * 4, 4);\n\t\ti32 = (wuff_sint32)((double)f32 * 2147483647.5);\n\t\tmemcpy(dst + samples * 4, &i32, tail);\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_float32_to_float32)\n{\n\tmemcpy(dst, src + offset, samples * 4 + head + tail);\n}\n\nWUFF_CONV_FUNC(wuff_float32_to_float64)\n{\n\tfloat f32;\n\tdouble f64;\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\tmemcpy(&f32, src, 4);\n\t\tf64 = f32;\n\t\tmemcpy(dst, (wuff_uint8 *)&f64 + offset, head);\n\t\tsrc += 4;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy(&f32, src + i * 4, 4);\n\t\tf64 = f32;\n\t\tmemcpy(dst + i * 8, &f64, 8);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\tmemcpy(&f32, src + samples * 4, 4);\n\t\tf64 = f32;\n\t\tmemcpy(dst + samples * 8, &f64, tail);\n\t}\n}\n\n/*\n * float64 functions.\n */\n\nWUFF_CONV_FUNC(wuff_float64_to_int8)\n{\n\tdouble f64;\n\tsize_t i;\n\t(void)offset; (void)head; (void)tail;\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy(&f64, src + i * 8, 8);\n\t\tdst[i] = (wuff_uint8)((f64 * 127.5) + 128.0);\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_float64_to_int16)\n{\n\tdouble f64;\n\twuff_sint16 i16;\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\tmemcpy(&f64, src, 8);\n\t\ti16 = (wuff_sint16)(f64 * 32767.5);\n\t\tmemcpy(dst, (wuff_uint8 *)&i16 + offset, head);\n\t\tsrc += 8;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy(&f64, src + i * 8, 8);\n\t\ti16 = (wuff_sint16)(f64 * 32767.5);\n\t\tmemcpy(dst + i * 2, &i16, 2);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\tmemcpy(&f64, src + i * 8, 8);\n\t\ti16 = (wuff_sint16)(f64 * 32767.5);\n\t\tmemcpy(dst + i * 2, &i16, tail);\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_float64_to_int24)\n{\n\tdouble f64;\n\twuff_sint32 i24;\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\tmemcpy(&f64, src, 8);\n\t\ti24 = (wuff_sint32)(f64 * 2147483647.5);\n\t\tmemcpy(dst, (wuff_uint8 *)&i24 + 1 + offset, head);\n\t\tsrc += 8;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy(&f64, src + i * 8, 8);\n\t\ti24 = (wuff_sint32)(f64 * 2147483647.5);\n\t\tmemcpy(dst + i * 3, (wuff_uint8 *)&i24 + 1, 3);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\tmemcpy(&f64, src + samples * 8, 8);\n\t\ti24 = (wuff_sint32)(f64 * 2147483647.5);\n\t\tmemcpy(dst + samples * 3, (wuff_uint8 *)&i24 + 1, tail);\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_float64_to_int32)\n{\n\tdouble f64;\n\twuff_sint32 i32;\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\tmemcpy(&f64, src, 8);\n\t\ti32 = (wuff_sint32)(f64 * 2147483647.5);\n\t\tmemcpy(dst, (wuff_uint8 *)&i32 + offset, head);\n\t\tsrc += 8;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy(&f64, src + i * 8, 8);\n\t\ti32 = (wuff_sint32)(f64 * 2147483647.5);\n\t\tmemcpy(dst + i * 4, &i32, 4);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\tmemcpy(&f64, src + samples * 8, 8);\n\t\ti32 = (wuff_sint32)(f64 * 2147483647.5);\n\t\tmemcpy(dst + samples * 4, &i32, tail);\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_float64_to_float32)\n{\n\tdouble f64;\n\tfloat f32;\n\tsize_t i;\n\n\tif (head != 0)\n\t{\n\t\tmemcpy(&f64, src, 8);\n\t\tf32 = (float)f64;\n\t\tmemcpy(dst, (wuff_uint8 *)&f32 + offset, head);\n\t\tsrc += 8;\n\t\tdst += head;\n\t}\n\n\tfor (i = 0; i < samples; i++)\n\t{\n\t\tmemcpy(&f64, src + i * 8, 8);\n\t\tf32 = (float)f64;\n\t\tmemcpy(dst + i * 4, &f32, 4);\n\t}\n\n\tif (tail != 0)\n\t{\n\t\tmemcpy(&f64, src + samples * 8, 8);\n\t\tf32 = (float)f64;\n\t\tmemcpy(dst + samples * 4, &f32, tail);\n\t}\n}\n\nWUFF_CONV_FUNC(wuff_float64_to_float64)\n{\n\tmemcpy(dst, src + offset, samples * 8 + head + tail);\n}\n"
  },
  {
    "path": "src/libraries/Wuff/wuff_convert.h",
    "content": "#ifndef WUFF_CONVERT_H\n#define WUFF_CONVERT_H\n\n#define WUFF_CONV_FUNC(name) WUFF_INTERN_API void name(wuff_uint8 * dst, wuff_uint8 * src, size_t samples, wuff_uint8 offset, wuff_uint8 head, wuff_uint8 tail)\n\nWUFF_CONV_FUNC(wuff_int8_to_int8);\nWUFF_CONV_FUNC(wuff_int8_to_int16);\nWUFF_CONV_FUNC(wuff_int8_to_int24);\nWUFF_CONV_FUNC(wuff_int8_to_int32);\nWUFF_CONV_FUNC(wuff_int8_to_float32);\nWUFF_CONV_FUNC(wuff_int8_to_float64);\n\nWUFF_CONV_FUNC(wuff_int16_to_int8);\nWUFF_CONV_FUNC(wuff_int16_to_int16);\nWUFF_CONV_FUNC(wuff_int16_to_int24);\nWUFF_CONV_FUNC(wuff_int16_to_int32);\nWUFF_CONV_FUNC(wuff_int16_to_float32);\nWUFF_CONV_FUNC(wuff_int16_to_float64);\n\nWUFF_CONV_FUNC(wuff_int24_to_int8);\nWUFF_CONV_FUNC(wuff_int24_to_int16);\nWUFF_CONV_FUNC(wuff_int24_to_int24);\nWUFF_CONV_FUNC(wuff_int24_to_int32);\nWUFF_CONV_FUNC(wuff_int24_to_float32);\nWUFF_CONV_FUNC(wuff_int24_to_float64);\n\nWUFF_CONV_FUNC(wuff_int32_to_int8);\nWUFF_CONV_FUNC(wuff_int32_to_int16);\nWUFF_CONV_FUNC(wuff_int32_to_int24);\nWUFF_CONV_FUNC(wuff_int32_to_int32);\nWUFF_CONV_FUNC(wuff_int32_to_float32);\nWUFF_CONV_FUNC(wuff_int32_to_float64);\n\nWUFF_CONV_FUNC(wuff_float32_to_int8);\nWUFF_CONV_FUNC(wuff_float32_to_int16);\nWUFF_CONV_FUNC(wuff_float32_to_int24);\nWUFF_CONV_FUNC(wuff_float32_to_int32);\nWUFF_CONV_FUNC(wuff_float32_to_float32);\nWUFF_CONV_FUNC(wuff_float32_to_float64);\n\nWUFF_CONV_FUNC(wuff_float64_to_int8);\nWUFF_CONV_FUNC(wuff_float64_to_int16);\nWUFF_CONV_FUNC(wuff_float64_to_int24);\nWUFF_CONV_FUNC(wuff_float64_to_int32);\nWUFF_CONV_FUNC(wuff_float64_to_float32);\nWUFF_CONV_FUNC(wuff_float64_to_float64);\n\n#endif /* WUFF_CONVERT_H */\n"
  },
  {
    "path": "src/libraries/Wuff/wuff_internal.c",
    "content": "#include <stdlib.h>\n#include <string.h>\n\n#include \"wuff_config.h\"\n#include \"wuff.h\"\n#include \"wuff_internal.h\"\n#include \"wuff_convert.h\"\n\n\nwuff_sint32 wuff_setup(struct wuff_handle * handle)\n{\n\twuff_sint32 wuff_status;\n\n\tif (handle == NULL)\n\t\treturn WUFF_INVALID_PARAM;\n\n\twuff_status = wuff_init_stream(handle);\n\tWUFF_STATUS_BAIL()\n\n\t/* Allocating the buffer for the handle requires information from the stream. */\n\twuff_status = wuff_buffer_alloc(handle);\n\tWUFF_STATUS_BAIL()\n\n\t/* The output format defaults to the stream format. */\n\twuff_status = wuff_format(handle, handle->stream.format);\n\tWUFF_STATUS_BAIL()\n\n\treturn WUFF_SUCCESS;\n}\n\nwuff_sint32 wuff_cleanup(struct wuff_handle * handle)\n{\n\tif (handle == NULL)\n\t\treturn WUFF_INVALID_PARAM;\n\n\tif (handle->buffer.data != NULL)\n\t\twuff_free(handle->buffer.data);\n\twuff_free(handle);\n\n\treturn WUFF_SUCCESS;\n}\n\nwuff_sint32 wuff_set_output_format(struct wuff_handle * handle, wuff_uint16 format)\n{\n\twuff_uint16 bits;\n\twuff_uint16 stream_format;\n\n\tif (handle == NULL)\n\t\treturn WUFF_INVALID_PARAM;\n\telse if (format >= WUFF_FORMAT_MAX)\n\t\treturn WUFF_FORMAT_UNSUPPORTED;\n\n\tstream_format = handle->stream.format;\n\n\tswitch (format)\n\t{\n\tcase WUFF_FORMAT_PCM_U8:\n\t\tbits = 8;\n\t\tswitch (stream_format)\n\t\t{\n\t\tcase WUFF_FORMAT_PCM_U8:\n\t\t\thandle->output.function = wuff_int8_to_int8;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_PCM_S16:\n\t\t\thandle->output.function = wuff_int16_to_int8;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_PCM_S24:\n\t\t\thandle->output.function = wuff_int24_to_int8;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_PCM_S32:\n\t\t\thandle->output.function = wuff_int32_to_int8;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_IEEE_FLOAT_32:\n\t\t\thandle->output.function = wuff_float32_to_int8;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_IEEE_FLOAT_64:\n\t\t\thandle->output.function = wuff_float64_to_int8;\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\tcase WUFF_FORMAT_PCM_S16:\n\t\tbits = 16;\n\t\tswitch (stream_format)\n\t\t{\n\t\tcase WUFF_FORMAT_PCM_U8:\n\t\t\thandle->output.function = wuff_int8_to_int16;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_PCM_S16:\n\t\t\thandle->output.function = wuff_int16_to_int16;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_PCM_S24:\n\t\t\thandle->output.function = wuff_int24_to_int16;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_PCM_S32:\n\t\t\thandle->output.function = wuff_int32_to_int16;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_IEEE_FLOAT_32:\n\t\t\thandle->output.function = wuff_float32_to_int16;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_IEEE_FLOAT_64:\n\t\t\thandle->output.function = wuff_float64_to_int16;\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\tcase WUFF_FORMAT_PCM_S24:\n\t\tbits = 24;\n\t\tswitch (stream_format)\n\t\t{\n\t\tcase WUFF_FORMAT_PCM_U8:\n\t\t\thandle->output.function = wuff_int8_to_int24;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_PCM_S16:\n\t\t\thandle->output.function = wuff_int16_to_int24;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_PCM_S24:\n\t\t\thandle->output.function = wuff_int24_to_int24;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_PCM_S32:\n\t\t\thandle->output.function = wuff_int32_to_int24;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_IEEE_FLOAT_32:\n\t\t\thandle->output.function = wuff_float32_to_int24;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_IEEE_FLOAT_64:\n\t\t\thandle->output.function = wuff_float64_to_int24;\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\tcase WUFF_FORMAT_PCM_S32:\n\t\tbits = 32;\n\t\tswitch (stream_format)\n\t\t{\n\t\tcase WUFF_FORMAT_PCM_U8:\n\t\t\thandle->output.function = wuff_int8_to_int32;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_PCM_S16:\n\t\t\thandle->output.function = wuff_int16_to_int32;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_PCM_S24:\n\t\t\thandle->output.function = wuff_int24_to_int32;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_PCM_S32:\n\t\t\thandle->output.function = wuff_int32_to_int32;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_IEEE_FLOAT_32:\n\t\t\thandle->output.function = wuff_float32_to_int32;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_IEEE_FLOAT_64:\n\t\t\thandle->output.function = wuff_float64_to_int32;\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\tcase WUFF_FORMAT_IEEE_FLOAT_32:\n\t\tbits = 32;\n\t\tswitch (stream_format)\n\t\t{\n\t\tcase WUFF_FORMAT_PCM_U8:\n\t\t\thandle->output.function = wuff_int8_to_float32;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_PCM_S16:\n\t\t\thandle->output.function = wuff_int16_to_float32;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_PCM_S24:\n\t\t\thandle->output.function = wuff_int24_to_float32;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_PCM_S32:\n\t\t\thandle->output.function = wuff_int32_to_float32;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_IEEE_FLOAT_32:\n\t\t\thandle->output.function = wuff_float32_to_float32;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_IEEE_FLOAT_64:\n\t\t\thandle->output.function = wuff_float64_to_float32;\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\tcase WUFF_FORMAT_IEEE_FLOAT_64:\n\t\tbits = 64;\n\t\tswitch (stream_format)\n\t\t{\n\t\tcase WUFF_FORMAT_PCM_U8:\n\t\t\thandle->output.function = wuff_int8_to_float64;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_PCM_S16:\n\t\t\thandle->output.function = wuff_int16_to_float64;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_PCM_S24:\n\t\t\thandle->output.function = wuff_int24_to_float64;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_PCM_S32:\n\t\t\thandle->output.function = wuff_int32_to_float64;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_IEEE_FLOAT_32:\n\t\t\thandle->output.function = wuff_float32_to_float64;\n\t\t\tbreak;\n\t\tcase WUFF_FORMAT_IEEE_FLOAT_64:\n\t\t\thandle->output.function = wuff_float64_to_float64;\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\treturn WUFF_FORMAT_UNSUPPORTED;\n\t}\n\n\thandle->output.format = format;\n\thandle->output.bytes_per_sample = bits / 8;\n\thandle->output.block_size = handle->stream.header.channels * (bits / 8);\n\n\treturn WUFF_SUCCESS;\n}\n\nwuff_sint32 wuff_check_bits(wuff_uint16 bits, wuff_uint16 * format)\n{\n\tif (*format == WUFF_FORMAT_PCM)\n\t{\n\t\tswitch (bits)\n\t\t{\n\t\tcase 8:\n\t\t\t*format = WUFF_FORMAT_PCM_U8;\n\t\t\tbreak;\n\t\tcase 16:\n\t\t\t*format = WUFF_FORMAT_PCM_S16;\n\t\t\tbreak;\n\t\tcase 24:\n\t\t\t*format = WUFF_FORMAT_PCM_S24;\n\t\t\tbreak;\n\t\tcase 32:\n\t\t\t*format = WUFF_FORMAT_PCM_S32;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\treturn WUFF_FORMAT_UNSUPPORTED;\n\t\t}\n\t}\n\telse if (*format == WUFF_FORMAT_IEEE_FLOAT)\n\t{\n\t\tswitch (bits)\n\t\t{\n\t\tcase 32:\n\t\t\t*format = WUFF_FORMAT_IEEE_FLOAT_32;\n\t\t\tbreak;\n\t\tcase 64:\n\t\t\t*format = WUFF_FORMAT_IEEE_FLOAT_64;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\treturn WUFF_FORMAT_UNSUPPORTED;\n\t\t}\n\t}\n\telse\n\t{\n\t\treturn WUFF_FORMAT_UNSUPPORTED;\n\t}\n\n\treturn WUFF_SUCCESS;\n}\n\nsize_t wuff_calculate_samples(size_t target_size, wuff_uint8 sample_size, wuff_uint8 * head, wuff_uint8 * tail)\n{\n\tsize_t samples = 0;\n\n\tif (*head != 0)\n\t{\n\t\tif (target_size <= *head)\n\t\t{\n\t\t\t*head = (wuff_uint8)target_size;\n\t\t\t*tail = 0;\n\t\t\treturn 1;\n\t\t}\n\t\ttarget_size -= *head;\n\t\t++samples;\n\t}\n\n\tsamples = target_size / sample_size;\n\t*tail = target_size % sample_size;\n\tif (*tail != 0)\n\t\t++samples;\n\treturn samples;\n}\n\nwuff_sint32 wuff_init_stream(struct wuff_handle * handle)\n{\n\t/* Allocate some space on the stack. */\n\t/* No need to do dynamic allocation for simple header probing. */\n\twuff_uint8 buffer[WUFF_HEADER_FETCH_SIZE];\n\tsize_t buffer_size = WUFF_HEADER_FETCH_SIZE;\n\twuff_uint64 search_offset;\n\tstruct wuff_chunk_header chunk;\n\twuff_sint32 wuff_status;\n\n\twuff_status = handle->callback->read(handle->userdata, buffer, &buffer_size);\n\tWUFF_STATUS_BAIL()\n\telse if (buffer_size < WUFF_STREAM_MIN_SIZE)\n\t\treturn WUFF_STREAM_NOT_RIFF;\n\n\t/* Check for RIFF signature. */\n\twuff_copy_chunk_header_data(&chunk, buffer);\n\tif (chunk.id != WUFF_RIFF_CHUNK_ID)\n\t\treturn WUFF_STREAM_NOT_RIFF;\n\thandle->stream.size = chunk.size;\n\n\t/* Check for WAVE format. */\n\twuff_copy_chunk_header_data(&chunk, buffer + 8);\n\tif (chunk.id != WUFF_WAVE_CHUNK_ID)\n\t\treturn WUFF_STREAM_NOT_WAVE;\n\n\t/* Search fmt chunk. */\n\twuff_copy_chunk_header_data(&chunk, buffer + 12);\n\tsearch_offset = 12;\n\tif (chunk.id != WUFF_FORMAT_CHUNK_ID)\n\t{\n\t\tchunk.id = 0;\n\t\t/* The fmt chunk must appear before the data chunk. */\n\t\twuff_status = wuff_search_chunk(handle, &chunk, &search_offset, WUFF_FORMAT_CHUNK_ID, WUFF_DATA_CHUNK_ID);\n\t\tif (wuff_status == WUFF_STREAM_CHUNK_NOT_FOUND)\n\t\t\treturn WUFF_STREAM_FORMAT_CHUNK_MISSING;\n\t\telse WUFF_STATUS_BAIL()\n\n\t\t/* In case the fmt chunk is not the first chunk, align it on the stack buffer as if it were. */\n\t\tbuffer_size = WUFF_HEADER_FETCH_SIZE - 20;\n\t\twuff_status = handle->callback->read(handle->userdata, buffer + 20, &buffer_size);\n\t\tWUFF_STATUS_BAIL()\n\t\t/* EOF bail. */\n\t\telse if (buffer_size < WUFF_HEADER_MIN_SIZE)\n\t\t\treturn WUFF_STREAM_INVALID;\n\t}\n\n\t/* Extract header information. */\n\thandle->stream.header.size = chunk.size;\n\thandle->stream.header.offset = search_offset + 8;\n\thandle->stream.header.format = wuff_get_uint16(buffer + 20);\n\thandle->stream.header.channels = wuff_get_uint16(buffer + 22);\n\thandle->stream.header.sample_rate = wuff_get_uint32(buffer + 24);\n\thandle->stream.header.bits_per_sample = wuff_get_uint16(buffer + 34);\n\thandle->stream.header.bytes_per_sample = handle->stream.header.bits_per_sample / 8;\n\thandle->stream.header.block_size = handle->stream.header.channels * handle->stream.header.bytes_per_sample;\n\n\t/* Bail on invalid streams. */\n\tif (handle->stream.header.channels == 0)\n\t\treturn WUFF_STREAM_ZERO_CHANNELS;\n\telse if (handle->stream.header.sample_rate == 0)\n\t\treturn WUFF_STREAM_ZERO_SAMPLE_RATE;\n\telse if (handle->stream.header.bits_per_sample == 0)\n\t\treturn WUFF_STREAM_ZERO_BITS_PER_SAMPLE;\n\n\t/* Grab the format from the extended header. */\n\tif (handle->stream.header.size > WUFF_HEADER_MIN_SIZE && wuff_get_uint16(buffer + 36) == 22)\n\t{\n\t\tif (handle->stream.header.format == WUFF_FORMAT_EXTENSIBLE)\n\t\t\thandle->stream.header.format = wuff_get_uint16(buffer + 44);\n\t}\n\n\t/* The check if this format is actually supported. */\n\thandle->stream.format = handle->stream.header.format;\n\twuff_status = wuff_check_bits(handle->stream.header.bits_per_sample, &handle->stream.format);\n\tWUFF_STATUS_BAIL()\n\n\t/* The search for the data chunk begins. */\n\twuff_copy_chunk_header_data(&chunk, buffer + 20 + handle->stream.header.size);\n\tsearch_offset = handle->stream.header.offset + handle->stream.header.size;\n\twuff_status = wuff_search_chunk(handle, &chunk, &search_offset, WUFF_DATA_CHUNK_ID, 0);\n\tif (wuff_status == WUFF_STREAM_CHUNK_NOT_FOUND)\n\t\treturn WUFF_STREAM_DATA_CHUNK_MISSING;\n\telse WUFF_STATUS_BAIL()\n\n\thandle->stream.data.size = chunk.size;\n\thandle->stream.data.offset = search_offset + 8;\n\thandle->stream.length = handle->stream.data.size / handle->stream.header.channels / handle->stream.header.bytes_per_sample;\n\thandle->stream.position = 0;\n\n\treturn WUFF_SUCCESS;\n}\n\nwuff_sint32 wuff_search_chunk(struct wuff_handle * handle, struct wuff_chunk_header * chunk, wuff_uint64 * offset, wuff_uint32 id, wuff_uint32 stop_id)\n{\n\twuff_uint8 buffer[8];\n\twuff_uint64 search_offset;\n\tsize_t buffer_size;\n\twuff_sint32 wuff_status = 0;\n\n\tif (chunk->id != 0 && chunk->id == id)\n\t\treturn WUFF_SUCCESS;\n\n\t/* Copy the current file position. */\n\tsearch_offset = *offset;\n\n\twhile (wuff_status >= 0)\n\t{\n\t\tsearch_offset += 8 + chunk->size;\n\t\t/* FIXME: Non-compliant RIFFs may not pad to WORD alignment. What now? */\n\t\tif (search_offset & 1)\n\t\t\tsearch_offset++;\n\n\t\twuff_status = handle->callback->seek(handle->userdata, search_offset);\n\t\tWUFF_STATUS_BAIL()\n\t\t/*else if (wuff_status == WUFF_CALLBACK_EOF)\n\t\t\treturn WUFF_STREAM_CHUNK_NOT_FOUND;*/\n\n\t\tbuffer_size = 8;\n\t\twuff_status = handle->callback->read(handle->userdata, buffer, &buffer_size);\n\t\tWUFF_STATUS_BAIL()\n\n\t\twuff_copy_chunk_header_data(chunk, buffer);\n\t\t/* Bail if we're at the EOF or the stop id. */\n\t\tif (buffer_size < 8 || (stop_id != 0 && chunk->id == stop_id))\n\t\t\treturn WUFF_STREAM_CHUNK_NOT_FOUND;\n\t\telse if (chunk->id == id)\n\t\t\tbreak;\n\t}\n\n\t/* Report chunk offset. */\n\t*offset = search_offset;\n\n\treturn WUFF_SUCCESS;\n}\n\nwuff_sint32 wuff_buffer_alloc(struct wuff_handle * handle)\n{\n\twuff_sint32 wuff_status;\n\n\tif (handle == NULL)\n\t\treturn WUFF_INVALID_PARAM;\n\n\t/* Try to allocate a buffer for 0.25 seconds, but clamp at some minimum and maximum value. */\n\thandle->buffer.size = handle->stream.header.sample_rate * handle->stream.header.block_size / 4;\n\tif (handle->buffer.size < WUFF_BUFFER_MIN_SIZE)\n\t\thandle->buffer.size = WUFF_BUFFER_MIN_SIZE;\n\telse if (handle->buffer.size > WUFF_BUFFER_MAX_SIZE)\n\t\thandle->buffer.size = WUFF_BUFFER_MAX_SIZE;\n\n\thandle->buffer.data = wuff_alloc(handle->buffer.size);\n\tif (handle->buffer.data == NULL)\n\t\treturn WUFF_MEMALLOC_ERROR;\n\n\t/* Just in case, let's null the offsets. */\n\twuff_status = wuff_buffer_clear(handle);\n\tWUFF_STATUS_BAIL()\n\n\treturn WUFF_SUCCESS;\n}\n\nwuff_sint32 wuff_buffer_clear(struct wuff_handle * handle)\n{\n\twuff_uint64 position;\n\twuff_sint32 wuff_status;\n\n\tif (handle == NULL)\n\t\treturn WUFF_INVALID_PARAM;\n\n\twuff_status = handle->callback->tell(handle->userdata, &position);\n\tWUFF_STATUS_BAIL()\n\n\tif (position < handle->stream.data.offset || position > handle->stream.data.offset + handle->stream.data.size)\n\t\treturn WUFF_BUFFER_INVALID_STREAM_POSITION;\n\n\thandle->buffer.bytes_left = handle->stream.data.size - (position - handle->stream.data.offset);\n\thandle->buffer.offset = 0;\n\thandle->buffer.end = 0;\n\n\treturn WUFF_SUCCESS;\n}\n\nwuff_sint32 wuff_buffer_fill(struct wuff_handle * handle)\n{\n\tsize_t bytes_in_buffer;\n\tsize_t bytes_to_read;\n\twuff_sint32 wuff_status;\n\n\tif (handle == NULL)\n\t\treturn WUFF_INVALID_PARAM;\n\n\t/* Check if there are bytes in the buffer and move them to the start of the buffer. */\n\t/* Probably not the most efficient way. Think on it some more! */\n\tbytes_in_buffer = handle->buffer.end - handle->buffer.offset;\n\n\tif (bytes_in_buffer == handle->buffer.size)\n\t\treturn WUFF_SUCCESS;\n\telse if (bytes_in_buffer > 0)\n\t\tmemmove(handle->buffer.data, handle->buffer.data + handle->buffer.offset, bytes_in_buffer);\n\n\tbytes_to_read = handle->buffer.size - bytes_in_buffer;\n\tif (bytes_to_read > handle->buffer.bytes_left)\n\t\tbytes_to_read = (size_t)handle->buffer.bytes_left;\n\n\twuff_status = handle->callback->read(handle->userdata, handle->buffer.data + bytes_in_buffer, &bytes_to_read);\n\tWUFF_STATUS_BAIL()\n\n\thandle->buffer.offset = 0;\n\thandle->buffer.end = bytes_in_buffer + bytes_to_read;\n\thandle->buffer.bytes_left -= bytes_to_read;\n\n\treturn WUFF_SUCCESS;\n}\n\nwuff_sint32 wuff_buffer_release(struct wuff_handle * handle, size_t samples)\n{\n\tsize_t size;\n\n\tif (handle == NULL)\n\t\treturn WUFF_INVALID_PARAM;\n\n\tsize = samples * handle->stream.header.bytes_per_sample;\n\n\t/* Check for an attempt to release more samples than the buffer could hold. */\n\t/* \"This should never happen.\" Let's throw an error anyway in case.*/\n\tif (size > handle->buffer.end - handle->buffer.offset)\n\t\treturn WUFF_BUFFER_INVALID_SIZE;\n\n\thandle->buffer.offset += size;\n\n\treturn WUFF_SUCCESS;\n}\n\nwuff_sint32 wuff_buffer_request(struct wuff_handle * handle, wuff_uint8 ** buffer, size_t * samples)\n{\n\tsize_t request_samples = *samples;\n\tsize_t buffer_samples, size;\n\tsize_t bps = handle->stream.header.bytes_per_sample;\n\twuff_sint32 wuff_status;\n\n\tif (handle == NULL || buffer == NULL || samples == NULL)\n\t\treturn WUFF_INVALID_PARAM;\n\n\t/* Fill the buffer some more if the requested size is bigger than the current data in the buffer. */\n\tsize = request_samples * bps;\n\tif (size > handle->buffer.end - handle->buffer.offset)\n\t{\n\t\twuff_status = wuff_buffer_fill(handle);\n\t\tWUFF_STATUS_BAIL()\n\t}\n\n\tbuffer_samples = (handle->buffer.end - handle->buffer.offset) / bps;\n\n\t/* Report sample count change. */\n\tif (buffer_samples < request_samples)\n\t\t*samples = buffer_samples;\n\n\t/* Report sample buffer start. */\n\t*buffer = handle->buffer.data + handle->buffer.offset;\n\n\treturn WUFF_SUCCESS;\n}\n"
  },
  {
    "path": "src/libraries/Wuff/wuff_internal.h",
    "content": "#ifndef WUFF_INTERNAL_H\n#define WUFF_INTERNAL_H\n\n#define WUFF_BUFFER_MIN_SIZE\t\t4096\n#define WUFF_BUFFER_MAX_SIZE\t\t2097152\n#define WUFF_STREAM_MIN_SIZE\t\t36\n#define WUFF_HEADER_MIN_SIZE\t\t16\n#define WUFF_HEADER_FETCH_SIZE\t\t80\n\n#define WUFF_FORMAT_PCM\t\t\t\t1\n#define WUFF_FORMAT_IEEE_FLOAT\t\t3\n#define WUFF_FORMAT_EXTENSIBLE\t\t0xFFFE\n\n\n#define WUFF_RIFF_CHUNK_ID   wuff_get_chunk_id(\"RIFF\")\n#define WUFF_WAVE_CHUNK_ID   wuff_get_chunk_id(\"WAVE\")\n#define WUFF_FORMAT_CHUNK_ID wuff_get_chunk_id(\"fmt \")\n#define WUFF_DATA_CHUNK_ID   wuff_get_chunk_id(\"data\")\n\n#define WUFF_STATUS_BAIL() if (wuff_status < 0) return wuff_status;\n\n\nstatic WUFF_INLINE wuff_uint32 wuff_get_uint32(wuff_uint8 * data)\n{\n\treturn data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24);\n}\n\nstatic WUFF_INLINE wuff_uint16 wuff_get_uint16(wuff_uint8 * data)\n{\n\treturn data[0] + (data[1] << 8);\n}\n\nstruct wuff_chunk_header\n{\n\twuff_uint32 id;\n\twuff_uint32 size;\n};\n\nstatic WUFF_INLINE wuff_uint32 wuff_get_chunk_id(const char txt[5])\n{\n\tconst wuff_uint8 * id = (wuff_uint8*) txt;\n\twuff_uint32 int_id;\n\twuff_uint8 * id_bytes = (wuff_uint8 *)&int_id;\n\tid_bytes[0] = id[0];\n\tid_bytes[1] = id[1];\n\tid_bytes[2] = id[2];\n\tid_bytes[3] = id[3];\n\n\treturn int_id;\n}\n\nstatic WUFF_INLINE void wuff_copy_chunk_header_data(struct wuff_chunk_header * chunk, wuff_uint8 * data)\n{\n\twuff_uint8 * id = (wuff_uint8 *)&chunk->id;\n\tid[0] = data[0];\n\tid[1] = data[1];\n\tid[2] = data[2];\n\tid[3] = data[3];\n\n\tchunk->size = wuff_get_uint32(data + 4);\n}\n\nstruct wuff_stream_header\n{\n\twuff_uint64 size;\n\twuff_uint64 offset;\n\n\twuff_uint16 format;\n\twuff_uint16 channels;\n\twuff_uint32 sample_rate;\n\twuff_uint16 bits_per_sample;\n\twuff_uint16 bytes_per_sample;\n\tsize_t block_size;\n};\n\nstruct wuff_stream_data\n{\n\twuff_uint64 size;\n\twuff_uint64 offset;\n};\n\nstruct wuff_buffer\n{\n\twuff_uint8 * data;\n\twuff_uint64 bytes_left;\n\tsize_t size;\n\tsize_t offset;\n\tsize_t end;\n};\n\nstruct wuff_output\n{\n\twuff_uint16 format;\n\tsize_t bytes_per_sample;\n\tsize_t block_size;\n\tsize_t block_offset;\n\tvoid (* function)(wuff_uint8 *, wuff_uint8 *, size_t, wuff_uint8, wuff_uint8, wuff_uint8);\n};\n\nstruct wuff_stream\n{\n\twuff_uint64 size;\n\twuff_uint64 length;\n\twuff_uint16 format;\n\n\twuff_uint64 position;\n\n\tstruct wuff_stream_header header;\n\tstruct wuff_stream_data data;\n};\n\nstruct wuff_handle\n{\n\tstruct wuff_stream stream;\n\tstruct wuff_buffer buffer;\n\tstruct wuff_output output;\n\tstruct wuff_callback * callback;\n\tvoid * userdata;\n};\n\n\n/* Initializes the stream, allocates the buffer, and sets the output format. */\n/* Expects a nulled wuff_handle and the callbacks set and ready. */\nWUFF_INTERN_API wuff_sint32 wuff_setup(struct wuff_handle * handle);\n\n/* Cleans the stream up, frees the buffer and the wuff_handle. */\nWUFF_INTERN_API wuff_sint32 wuff_cleanup(struct wuff_handle * handle);\n\n/* Called by wuff_setup. Initializes the stream by reading the data from the */\n/* callbacks, searching for headers and stream information. */\nWUFF_INTERN_API wuff_sint32 wuff_init_stream(struct wuff_handle * handle);\n\n/* Searches for a specific chunk id and stops before another if it's not 0. */\n/* If the id in wuff_chunk_header is not 0, it will be checked too and if */\n/* they match, then the function will return immediately. */\n/* Expects offset to point to the file position of a chunk and */\n/* wuff_chunk_header to have the size of this chunk. */\nWUFF_INTERN_API wuff_sint32 wuff_search_chunk(struct wuff_handle * handle, struct wuff_chunk_header * chunk, wuff_uint64 * offset, wuff_uint32 id, wuff_uint32 stop_id);\n\n/* Sets the output struct of the stream to the new format. */\nWUFF_INTERN_API wuff_sint32 wuff_set_output_format(struct wuff_handle * handle, wuff_uint16);\n\n/* Checks if the number of bits per samples is supported and writes the */\n/* output identifier to the 16-bit integer. */\nWUFF_INTERN_API wuff_sint32 wuff_check_bits(wuff_uint16 bits, wuff_uint16 * format);\n\n/* Calculates the number of samples that have to be requested from the buffer */\n/* by also taking the truncated samples at the start and end into account. */\n/* The return value is the number of samples needed. */\nWUFF_INTERN_API size_t wuff_calculate_samples(size_t target_size, wuff_uint8 sample_size, wuff_uint8 * head, wuff_uint8 * tail);\n\n\n/* Allocates the buffer for the input stream. */\n/* Expects the stream to be initialized, as format information is needed. */\nWUFF_INTERN_API wuff_sint32 wuff_buffer_alloc(struct wuff_handle * handle);\n\n/* Fills the buffer with new data. */\nWUFF_INTERN_API wuff_sint32 wuff_buffer_fill(struct wuff_handle * handle);\n\n/* Marks all bytes in the buffer as free. */\nWUFF_INTERN_API wuff_sint32 wuff_buffer_clear(struct wuff_handle * handle);\n\n/* Requests samples and a pointer to them. */\n/* The number of samples may be lower than requested. */\nWUFF_INTERN_API wuff_sint32 wuff_buffer_request(struct wuff_handle * handle, wuff_uint8 ** buffer, size_t * samples);\n\n/* Releases the number of samples from the buffer. */\nWUFF_INTERN_API wuff_sint32 wuff_buffer_release(struct wuff_handle * handle, size_t samples);\n\n\n#endif /* WUFF_INTERNAL_H */\n"
  },
  {
    "path": "src/libraries/Wuff/wuff_memory.c",
    "content": "#include <stdlib.h>\n\n#include \"wuff_config.h\"\n\n/* Default memory allocators. */\n/* They can be overridden with custom functions at build time. */\n#ifndef WUFF_MEMALLOC_OVERRIDE\nvoid * wuff_alloc(size_t size)\n{\n\treturn malloc(size);\n}\n\nvoid wuff_free(void * mem)\n{\n\tfree(mem);\n}\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/Box2D.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef BOX2D_H\n#define BOX2D_H\n\n// These include files constitute the main Box2D API\n\n#include \"b2_settings.h\"\n#include \"b2_draw.h\"\n#include \"b2_timer.h\"\n\n#include \"b2_chain_shape.h\"\n#include \"b2_circle_shape.h\"\n#include \"b2_edge_shape.h\"\n#include \"b2_polygon_shape.h\"\n\n#include \"b2_broad_phase.h\"\n#include \"b2_dynamic_tree.h\"\n\n#include \"b2_body.h\"\n#include \"b2_contact.h\"\n#include \"b2_fixture.h\"\n#include \"b2_time_step.h\"\n#include \"b2_world.h\"\n#include \"b2_world_callbacks.h\"\n#include \"b2_distance.h\"\n\n#include \"b2_distance_joint.h\"\n#include \"b2_friction_joint.h\"\n#include \"b2_gear_joint.h\"\n#include \"b2_motor_joint.h\"\n#include \"b2_mouse_joint.h\"\n#include \"b2_prismatic_joint.h\"\n#include \"b2_pulley_joint.h\"\n#include \"b2_revolute_joint.h\"\n#include \"b2_weld_joint.h\"\n#include \"b2_wheel_joint.h\"\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/README.MODIFIED",
    "content": "PLEASE NOTE, this version of Box2D is NOT original, it has been MODIFIED by the LÖVE Development Team.\n"
  },
  {
    "path": "src/libraries/box2d/b2_api.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_API_H\n#define B2_API_H\n\n#ifdef B2_SHARED\n  #if defined _WIN32 || defined __CYGWIN__\n    #ifdef box2d_EXPORTS\n      #ifdef __GNUC__\n        #define B2_API __attribute__ ((dllexport))\n      #else\n        #define B2_API __declspec(dllexport)\n      #endif\n    #else\n      #ifdef __GNUC__\n        #define B2_API __attribute__ ((dllimport))\n      #else\n        #define B2_API __declspec(dllimport)\n      #endif\n    #endif\n  #else\n    #if __GNUC__ >= 4\n      #define B2_API __attribute__ ((visibility (\"default\")))\n    #else\n      #define B2_API\n    #endif\n  #endif\n#else\n  #define B2_API\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_block_allocator.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_BLOCK_ALLOCATOR_H\n#define B2_BLOCK_ALLOCATOR_H\n\n#include \"b2_api.h\"\n#include \"b2_settings.h\"\n\nconst int32 b2_blockSizeCount = 14;\n\nstruct b2Block;\nstruct b2Chunk;\n\n/// This is a small object allocator used for allocating small\n/// objects that persist for more than one time step.\n/// See: http://www.codeproject.com/useritems/Small_Block_Allocator.asp\nclass B2_API b2BlockAllocator\n{\npublic:\n\tb2BlockAllocator();\n\t~b2BlockAllocator();\n\n\t/// Allocate memory. This will use b2Alloc if the size is larger than b2_maxBlockSize.\n\tvoid* Allocate(int32 size);\n\n\t/// Free memory. This will use b2Free if the size is larger than b2_maxBlockSize.\n\tvoid Free(void* p, int32 size);\n\n\tvoid Clear();\n\nprivate:\n\n\tb2Chunk* m_chunks;\n\tint32 m_chunkCount;\n\tint32 m_chunkSpace;\n\n\tb2Block* m_freeLists[b2_blockSizeCount];\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_body.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_BODY_H\n#define B2_BODY_H\n\n#include \"b2_api.h\"\n#include \"b2_math.h\"\n#include \"b2_shape.h\"\n\nclass b2Fixture;\nclass b2Joint;\nclass b2Contact;\nclass b2Controller;\nclass b2World;\nstruct b2FixtureDef;\nstruct b2JointEdge;\nstruct b2ContactEdge;\n\n/// The body type.\n/// static: zero mass, zero velocity, may be manually moved\n/// kinematic: zero mass, non-zero velocity set by user, moved by solver\n/// dynamic: positive mass, non-zero velocity determined by forces, moved by solver\nenum b2BodyType\n{\n\tb2_staticBody = 0,\n\tb2_kinematicBody,\n\tb2_dynamicBody\n};\n\n/// A body definition holds all the data needed to construct a rigid body.\n/// You can safely re-use body definitions. Shapes are added to a body after construction.\nstruct B2_API b2BodyDef\n{\n\t/// This constructor sets the body definition default values.\n\tb2BodyDef()\n\t{\n\t\tposition.Set(0.0f, 0.0f);\n\t\tangle = 0.0f;\n\t\tlinearVelocity.Set(0.0f, 0.0f);\n\t\tangularVelocity = 0.0f;\n\t\tlinearDamping = 0.0f;\n\t\tangularDamping = 0.0f;\n\t\tallowSleep = true;\n\t\tawake = true;\n\t\tfixedRotation = false;\n\t\tbullet = false;\n\t\ttype = b2_staticBody;\n\t\tenabled = true;\n\t\tgravityScale = 1.0f;\n\t}\n\n\t/// The body type: static, kinematic, or dynamic.\n\t/// Note: if a dynamic body would have zero mass, the mass is set to one.\n\tb2BodyType type;\n\n\t/// The world position of the body. Avoid creating bodies at the origin\n\t/// since this can lead to many overlapping shapes.\n\tb2Vec2 position;\n\n\t/// The world angle of the body in radians.\n\tfloat angle;\n\n\t/// The linear velocity of the body's origin in world co-ordinates.\n\tb2Vec2 linearVelocity;\n\n\t/// The angular velocity of the body.\n\tfloat angularVelocity;\n\n\t/// Linear damping is use to reduce the linear velocity. The damping parameter\n\t/// can be larger than 1.0f but the damping effect becomes sensitive to the\n\t/// time step when the damping parameter is large.\n\t/// Units are 1/time\n\tfloat linearDamping;\n\n\t/// Angular damping is use to reduce the angular velocity. The damping parameter\n\t/// can be larger than 1.0f but the damping effect becomes sensitive to the\n\t/// time step when the damping parameter is large.\n\t/// Units are 1/time\n\tfloat angularDamping;\n\n\t/// Set this flag to false if this body should never fall asleep. Note that\n\t/// this increases CPU usage.\n\tbool allowSleep;\n\n\t/// Is this body initially awake or sleeping?\n\tbool awake;\n\n\t/// Should this body be prevented from rotating? Useful for characters.\n\tbool fixedRotation;\n\n\t/// Is this a fast moving body that should be prevented from tunneling through\n\t/// other moving bodies? Note that all bodies are prevented from tunneling through\n\t/// kinematic and static bodies. This setting is only considered on dynamic bodies.\n\t/// @warning You should use this flag sparingly since it increases processing time.\n\tbool bullet;\n\n\t/// Does this body start out enabled?\n\tbool enabled;\n\n\t/// Use this to store application specific body data.\n\tb2BodyUserData userData;\n\n\t/// Scale the gravity applied to this body.\n\tfloat gravityScale;\n};\n\n/// A rigid body. These are created via b2World::CreateBody.\nclass B2_API b2Body\n{\npublic:\n\t/// Creates a fixture and attach it to this body. Use this function if you need\n\t/// to set some fixture parameters, like friction. Otherwise you can create the\n\t/// fixture directly from a shape.\n\t/// If the density is non-zero, this function automatically updates the mass of the body.\n\t/// Contacts are not created until the next time step.\n\t/// @param def the fixture definition.\n\t/// @warning This function is locked during callbacks.\n\tb2Fixture* CreateFixture(const b2FixtureDef* def);\n\n\t/// Creates a fixture from a shape and attach it to this body.\n\t/// This is a convenience function. Use b2FixtureDef if you need to set parameters\n\t/// like friction, restitution, user data, or filtering.\n\t/// If the density is non-zero, this function automatically updates the mass of the body.\n\t/// @param shape the shape to be cloned.\n\t/// @param density the shape density (set to zero for static bodies).\n\t/// @warning This function is locked during callbacks.\n\tb2Fixture* CreateFixture(const b2Shape* shape, float density);\n\n\t/// Destroy a fixture. This removes the fixture from the broad-phase and\n\t/// destroys all contacts associated with this fixture. This will\n\t/// automatically adjust the mass of the body if the body is dynamic and the\n\t/// fixture has positive density.\n\t/// All fixtures attached to a body are implicitly destroyed when the body is destroyed.\n\t/// @param fixture the fixture to be removed.\n\t/// @warning This function is locked during callbacks.\n\tvoid DestroyFixture(b2Fixture* fixture);\n\n\t/// Set the position of the body's origin and rotation.\n\t/// Manipulating a body's transform may cause non-physical behavior.\n\t/// Note: contacts are updated on the next call to b2World::Step.\n\t/// @param position the world position of the body's local origin.\n\t/// @param angle the world rotation in radians.\n\tvoid SetTransform(const b2Vec2& position, float angle);\n\n\t/// Get the body transform for the body's origin.\n\t/// @return the world transform of the body's origin.\n\tconst b2Transform& GetTransform() const;\n\n\t/// Get the world body origin position.\n\t/// @return the world position of the body's origin.\n\tconst b2Vec2& GetPosition() const;\n\n\t/// Get the angle in radians.\n\t/// @return the current world rotation angle in radians.\n\tfloat GetAngle() const;\n\n\t/// Get the world position of the center of mass.\n\tconst b2Vec2& GetWorldCenter() const;\n\n\t/// Get the local position of the center of mass.\n\tconst b2Vec2& GetLocalCenter() const;\n\n\t/// Set the linear velocity of the center of mass.\n\t/// @param v the new linear velocity of the center of mass.\n\tvoid SetLinearVelocity(const b2Vec2& v);\n\n\t/// Get the linear velocity of the center of mass.\n\t/// @return the linear velocity of the center of mass.\n\tconst b2Vec2& GetLinearVelocity() const;\n\n\t/// Set the angular velocity.\n\t/// @param omega the new angular velocity in radians/second.\n\tvoid SetAngularVelocity(float omega);\n\n\t/// Get the angular velocity.\n\t/// @return the angular velocity in radians/second.\n\tfloat GetAngularVelocity() const;\n\n\t/// Apply a force at a world point. If the force is not\n\t/// applied at the center of mass, it will generate a torque and\n\t/// affect the angular velocity. This wakes up the body.\n\t/// @param force the world force vector, usually in Newtons (N).\n\t/// @param point the world position of the point of application.\n\t/// @param wake also wake up the body\n\tvoid ApplyForce(const b2Vec2& force, const b2Vec2& point, bool wake);\n\n\t/// Apply a force to the center of mass. This wakes up the body.\n\t/// @param force the world force vector, usually in Newtons (N).\n\t/// @param wake also wake up the body\n\tvoid ApplyForceToCenter(const b2Vec2& force, bool wake);\n\n\t/// Apply a torque. This affects the angular velocity\n\t/// without affecting the linear velocity of the center of mass.\n\t/// @param torque about the z-axis (out of the screen), usually in N-m.\n\t/// @param wake also wake up the body\n\tvoid ApplyTorque(float torque, bool wake);\n\n\t/// Apply an impulse at a point. This immediately modifies the velocity.\n\t/// It also modifies the angular velocity if the point of application\n\t/// is not at the center of mass. This wakes up the body.\n\t/// @param impulse the world impulse vector, usually in N-seconds or kg-m/s.\n\t/// @param point the world position of the point of application.\n\t/// @param wake also wake up the body\n\tvoid ApplyLinearImpulse(const b2Vec2& impulse, const b2Vec2& point, bool wake);\n\n\t/// Apply an impulse to the center of mass. This immediately modifies the velocity.\n\t/// @param impulse the world impulse vector, usually in N-seconds or kg-m/s.\n\t/// @param wake also wake up the body\n\tvoid ApplyLinearImpulseToCenter(const b2Vec2& impulse, bool wake);\n\n\t/// Apply an angular impulse.\n\t/// @param impulse the angular impulse in units of kg*m*m/s\n\t/// @param wake also wake up the body\n\tvoid ApplyAngularImpulse(float impulse, bool wake);\n\n\t/// Get the total mass of the body.\n\t/// @return the mass, usually in kilograms (kg).\n\tfloat GetMass() const;\n\n\t/// Get the rotational inertia of the body about the local origin.\n\t/// @return the rotational inertia, usually in kg-m^2.\n\tfloat GetInertia() const;\n\n\t/// Get the mass data of the body.\n\t/// @return a struct containing the mass, inertia and center of the body.\n\tvoid GetMassData(b2MassData* data) const;\n\n\t/// Set the mass properties to override the mass properties of the fixtures.\n\t/// Note that this changes the center of mass position.\n\t/// Note that creating or destroying fixtures can also alter the mass.\n\t/// This function has no effect if the body isn't dynamic.\n\t/// @param data the mass properties.\n\tvoid SetMassData(const b2MassData* data);\n\n\t/// This resets the mass properties to the sum of the mass properties of the fixtures.\n\t/// This normally does not need to be called unless you called SetMassData to override\n\t/// the mass and you later want to reset the mass.\n\tvoid ResetMassData();\n\n\t/// Get the world coordinates of a point given the local coordinates.\n\t/// @param localPoint a point on the body measured relative the the body's origin.\n\t/// @return the same point expressed in world coordinates.\n\tb2Vec2 GetWorldPoint(const b2Vec2& localPoint) const;\n\n\t/// Get the world coordinates of a vector given the local coordinates.\n\t/// @param localVector a vector fixed in the body.\n\t/// @return the same vector expressed in world coordinates.\n\tb2Vec2 GetWorldVector(const b2Vec2& localVector) const;\n\n\t/// Gets a local point relative to the body's origin given a world point.\n\t/// @param worldPoint a point in world coordinates.\n\t/// @return the corresponding local point relative to the body's origin.\n\tb2Vec2 GetLocalPoint(const b2Vec2& worldPoint) const;\n\n\t/// Gets a local vector given a world vector.\n\t/// @param worldVector a vector in world coordinates.\n\t/// @return the corresponding local vector.\n\tb2Vec2 GetLocalVector(const b2Vec2& worldVector) const;\n\n\t/// Get the world linear velocity of a world point attached to this body.\n\t/// @param worldPoint a point in world coordinates.\n\t/// @return the world velocity of a point.\n\tb2Vec2 GetLinearVelocityFromWorldPoint(const b2Vec2& worldPoint) const;\n\n\t/// Get the world velocity of a local point.\n\t/// @param localPoint a point in local coordinates.\n\t/// @return the world velocity of a point.\n\tb2Vec2 GetLinearVelocityFromLocalPoint(const b2Vec2& localPoint) const;\n\n\t/// Get the linear damping of the body.\n\tfloat GetLinearDamping() const;\n\n\t/// Set the linear damping of the body.\n\tvoid SetLinearDamping(float linearDamping);\n\n\t/// Get the angular damping of the body.\n\tfloat GetAngularDamping() const;\n\n\t/// Set the angular damping of the body.\n\tvoid SetAngularDamping(float angularDamping);\n\n\t/// Get the gravity scale of the body.\n\tfloat GetGravityScale() const;\n\n\t/// Set the gravity scale of the body.\n\tvoid SetGravityScale(float scale);\n\n\t/// Set the type of this body. This may alter the mass and velocity.\n\tvoid SetType(b2BodyType type);\n\n\t/// Get the type of this body.\n\tb2BodyType GetType() const;\n\n\t/// Should this body be treated like a bullet for continuous collision detection?\n\tvoid SetBullet(bool flag);\n\n\t/// Is this body treated like a bullet for continuous collision detection?\n\tbool IsBullet() const;\n\n\t/// You can disable sleeping on this body. If you disable sleeping, the\n\t/// body will be woken.\n\tvoid SetSleepingAllowed(bool flag);\n\n\t/// Is this body allowed to sleep\n\tbool IsSleepingAllowed() const;\n\n\t/// Set the sleep state of the body. A sleeping body has very\n\t/// low CPU cost.\n\t/// @param flag set to true to wake the body, false to put it to sleep.\n\tvoid SetAwake(bool flag);\n\n\t/// Get the sleeping state of this body.\n\t/// @return true if the body is awake.\n\tbool IsAwake() const;\n\n\t/// Allow a body to be disabled. A disabled body is not simulated and cannot\n\t/// be collided with or woken up.\n\t/// If you pass a flag of true, all fixtures will be added to the broad-phase.\n\t/// If you pass a flag of false, all fixtures will be removed from the\n\t/// broad-phase and all contacts will be destroyed.\n\t/// Fixtures and joints are otherwise unaffected. You may continue\n\t/// to create/destroy fixtures and joints on disabled bodies.\n\t/// Fixtures on a disabled body are implicitly disabled and will\n\t/// not participate in collisions, ray-casts, or queries.\n\t/// Joints connected to a disabled body are implicitly disabled.\n\t/// An diabled body is still owned by a b2World object and remains\n\t/// in the body list.\n\tvoid SetEnabled(bool flag);\n\n\t/// Get the active state of the body.\n\tbool IsEnabled() const;\n\n\t/// Set this body to have fixed rotation. This causes the mass\n\t/// to be reset.\n\tvoid SetFixedRotation(bool flag);\n\n\t/// Does this body have fixed rotation?\n\tbool IsFixedRotation() const;\n\n\t/// Get the list of all fixtures attached to this body.\n\tb2Fixture* GetFixtureList();\n\tconst b2Fixture* GetFixtureList() const;\n\n\t/// Get the list of all joints attached to this body.\n\tb2JointEdge* GetJointList();\n\tconst b2JointEdge* GetJointList() const;\n\n\t/// Get the list of all contacts attached to this body.\n\t/// @warning this list changes during the time step and you may\n\t/// miss some collisions if you don't use b2ContactListener.\n\tb2ContactEdge* GetContactList();\n\tconst b2ContactEdge* GetContactList() const;\n\n\t/// Get the next body in the world's body list.\n\tb2Body* GetNext();\n\tconst b2Body* GetNext() const;\n\n\t/// Get the user data pointer that was provided in the body definition.\n\tb2BodyUserData& GetUserData();\n\n\t/// Set the user data. Use this to store your application specific data.\n\tvoid SetUserData(void* data);\n\n\t/// Get the parent world of this body.\n\tb2World* GetWorld();\n\tconst b2World* GetWorld() const;\n\n\t/// Dump this body to a file\n\tvoid Dump();\n\nprivate:\n\n\tfriend class b2World;\n\tfriend class b2Island;\n\tfriend class b2ContactManager;\n\tfriend class b2ContactSolver;\n\tfriend class b2Contact;\n\n\tfriend class b2DistanceJoint;\n\tfriend class b2FrictionJoint;\n\tfriend class b2GearJoint;\n\tfriend class b2MotorJoint;\n\tfriend class b2MouseJoint;\n\tfriend class b2PrismaticJoint;\n\tfriend class b2PulleyJoint;\n\tfriend class b2RevoluteJoint;\n\tfriend class b2RopeJoint;\n\tfriend class b2WeldJoint;\n\tfriend class b2WheelJoint;\n\n\t// m_flags\n\tenum\n\t{\n\t\te_islandFlag\t\t= 0x0001,\n\t\te_awakeFlag\t\t\t= 0x0002,\n\t\te_autoSleepFlag\t\t= 0x0004,\n\t\te_bulletFlag\t\t= 0x0008,\n\t\te_fixedRotationFlag\t= 0x0010,\n\t\te_enabledFlag\t\t= 0x0020,\n\t\te_toiFlag\t\t\t= 0x0040\n\t};\n\n\tb2Body(const b2BodyDef* bd, b2World* world);\n\t~b2Body();\n\n\tvoid SynchronizeFixtures();\n\tvoid SynchronizeTransform();\n\n\t// This is used to prevent connected bodies from colliding.\n\t// It may lie, depending on the collideConnected flag.\n\tbool ShouldCollide(const b2Body* other) const;\n\n\tvoid Advance(float t);\n\n\tb2BodyType m_type;\n\n\tuint16 m_flags;\n\n\tint32 m_islandIndex;\n\n\tb2Transform m_xf;\t\t// the body origin transform\n\tb2Sweep m_sweep;\t\t// the swept motion for CCD\n\n\tb2Vec2 m_linearVelocity;\n\tfloat m_angularVelocity;\n\n\tb2Vec2 m_force;\n\tfloat m_torque;\n\n\tb2World* m_world;\n\tb2Body* m_prev;\n\tb2Body* m_next;\n\n\tb2Fixture* m_fixtureList;\n\tint32 m_fixtureCount;\n\n\tb2JointEdge* m_jointList;\n\tb2ContactEdge* m_contactList;\n\n\tfloat m_mass, m_invMass;\n\n\t// Rotational inertia about the center of mass.\n\tfloat m_I, m_invI;\n\n\tfloat m_linearDamping;\n\tfloat m_angularDamping;\n\tfloat m_gravityScale;\n\n\tfloat m_sleepTime;\n\n\tb2BodyUserData m_userData;\n};\n\ninline b2BodyType b2Body::GetType() const\n{\n\treturn m_type;\n}\n\ninline const b2Transform& b2Body::GetTransform() const\n{\n\treturn m_xf;\n}\n\ninline const b2Vec2& b2Body::GetPosition() const\n{\n\treturn m_xf.p;\n}\n\ninline float b2Body::GetAngle() const\n{\n\treturn m_sweep.a;\n}\n\ninline const b2Vec2& b2Body::GetWorldCenter() const\n{\n\treturn m_sweep.c;\n}\n\ninline const b2Vec2& b2Body::GetLocalCenter() const\n{\n\treturn m_sweep.localCenter;\n}\n\ninline void b2Body::SetLinearVelocity(const b2Vec2& v)\n{\n\tif (m_type == b2_staticBody)\n\t{\n\t\treturn;\n\t}\n\n\tif (b2Dot(v,v) > 0.0f)\n\t{\n\t\tSetAwake(true);\n\t}\n\n\tm_linearVelocity = v;\n}\n\ninline const b2Vec2& b2Body::GetLinearVelocity() const\n{\n\treturn m_linearVelocity;\n}\n\ninline void b2Body::SetAngularVelocity(float w)\n{\n\tif (m_type == b2_staticBody)\n\t{\n\t\treturn;\n\t}\n\n\tif (w * w > 0.0f)\n\t{\n\t\tSetAwake(true);\n\t}\n\n\tm_angularVelocity = w;\n}\n\ninline float b2Body::GetAngularVelocity() const\n{\n\treturn m_angularVelocity;\n}\n\ninline float b2Body::GetMass() const\n{\n\treturn m_mass;\n}\n\ninline float b2Body::GetInertia() const\n{\n\treturn m_I + m_mass * b2Dot(m_sweep.localCenter, m_sweep.localCenter);\n}\n\ninline void b2Body::GetMassData(b2MassData* data) const\n{\n\tdata->mass = m_mass;\n\tdata->I = m_I + m_mass * b2Dot(m_sweep.localCenter, m_sweep.localCenter);\n\tdata->center = m_sweep.localCenter;\n}\n\ninline b2Vec2 b2Body::GetWorldPoint(const b2Vec2& localPoint) const\n{\n\treturn b2Mul(m_xf, localPoint);\n}\n\ninline b2Vec2 b2Body::GetWorldVector(const b2Vec2& localVector) const\n{\n\treturn b2Mul(m_xf.q, localVector);\n}\n\ninline b2Vec2 b2Body::GetLocalPoint(const b2Vec2& worldPoint) const\n{\n\treturn b2MulT(m_xf, worldPoint);\n}\n\ninline b2Vec2 b2Body::GetLocalVector(const b2Vec2& worldVector) const\n{\n\treturn b2MulT(m_xf.q, worldVector);\n}\n\ninline b2Vec2 b2Body::GetLinearVelocityFromWorldPoint(const b2Vec2& worldPoint) const\n{\n\treturn m_linearVelocity + b2Cross(m_angularVelocity, worldPoint - m_sweep.c);\n}\n\ninline b2Vec2 b2Body::GetLinearVelocityFromLocalPoint(const b2Vec2& localPoint) const\n{\n\treturn GetLinearVelocityFromWorldPoint(GetWorldPoint(localPoint));\n}\n\ninline float b2Body::GetLinearDamping() const\n{\n\treturn m_linearDamping;\n}\n\ninline void b2Body::SetLinearDamping(float linearDamping)\n{\n\tm_linearDamping = linearDamping;\n}\n\ninline float b2Body::GetAngularDamping() const\n{\n\treturn m_angularDamping;\n}\n\ninline void b2Body::SetAngularDamping(float angularDamping)\n{\n\tm_angularDamping = angularDamping;\n}\n\ninline float b2Body::GetGravityScale() const\n{\n\treturn m_gravityScale;\n}\n\ninline void b2Body::SetGravityScale(float scale)\n{\n\tm_gravityScale = scale;\n}\n\ninline void b2Body::SetBullet(bool flag)\n{\n\tif (flag)\n\t{\n\t\tm_flags |= e_bulletFlag;\n\t}\n\telse\n\t{\n\t\tm_flags &= ~e_bulletFlag;\n\t}\n}\n\ninline bool b2Body::IsBullet() const\n{\n\treturn (m_flags & e_bulletFlag) == e_bulletFlag;\n}\n\ninline void b2Body::SetAwake(bool flag)\n{\n\tif (m_type == b2_staticBody)\n\t{\n\t\treturn;\n\t}\n\n\tif (flag)\n\t{\n\t\tm_flags |= e_awakeFlag;\n\t\tm_sleepTime = 0.0f;\n\t}\n\telse\n\t{\n\t\tm_flags &= ~e_awakeFlag;\n\t\tm_sleepTime = 0.0f;\n\t\tm_linearVelocity.SetZero();\n\t\tm_angularVelocity = 0.0f;\n\t\tm_force.SetZero();\n\t\tm_torque = 0.0f;\n\t}\n}\n\ninline bool b2Body::IsAwake() const\n{\n\treturn (m_flags & e_awakeFlag) == e_awakeFlag;\n}\n\ninline bool b2Body::IsEnabled() const\n{\n\treturn (m_flags & e_enabledFlag) == e_enabledFlag;\n}\n\ninline bool b2Body::IsFixedRotation() const\n{\n\treturn (m_flags & e_fixedRotationFlag) == e_fixedRotationFlag;\n}\n\ninline void b2Body::SetSleepingAllowed(bool flag)\n{\n\tif (flag)\n\t{\n\t\tm_flags |= e_autoSleepFlag;\n\t}\n\telse\n\t{\n\t\tm_flags &= ~e_autoSleepFlag;\n\t\tSetAwake(true);\n\t}\n}\n\ninline bool b2Body::IsSleepingAllowed() const\n{\n\treturn (m_flags & e_autoSleepFlag) == e_autoSleepFlag;\n}\n\ninline b2Fixture* b2Body::GetFixtureList()\n{\n\treturn m_fixtureList;\n}\n\ninline const b2Fixture* b2Body::GetFixtureList() const\n{\n\treturn m_fixtureList;\n}\n\ninline b2JointEdge* b2Body::GetJointList()\n{\n\treturn m_jointList;\n}\n\ninline const b2JointEdge* b2Body::GetJointList() const\n{\n\treturn m_jointList;\n}\n\ninline b2ContactEdge* b2Body::GetContactList()\n{\n\treturn m_contactList;\n}\n\ninline const b2ContactEdge* b2Body::GetContactList() const\n{\n\treturn m_contactList;\n}\n\ninline b2Body* b2Body::GetNext()\n{\n\treturn m_next;\n}\n\ninline const b2Body* b2Body::GetNext() const\n{\n\treturn m_next;\n}\n\ninline b2BodyUserData& b2Body::GetUserData()\n{\n\treturn m_userData;\n}\n\ninline void b2Body::ApplyForce(const b2Vec2& force, const b2Vec2& point, bool wake)\n{\n\tif (m_type != b2_dynamicBody)\n\t{\n\t\treturn;\n\t}\n\n\tif (wake && (m_flags & e_awakeFlag) == 0)\n\t{\n\t\tSetAwake(true);\n\t}\n\n\t// Don't accumulate a force if the body is sleeping.\n\tif (m_flags & e_awakeFlag)\n\t{\n\t\tm_force += force;\n\t\tm_torque += b2Cross(point - m_sweep.c, force);\n\t}\n}\n\ninline void b2Body::ApplyForceToCenter(const b2Vec2& force, bool wake)\n{\n\tif (m_type != b2_dynamicBody)\n\t{\n\t\treturn;\n\t}\n\n\tif (wake && (m_flags & e_awakeFlag) == 0)\n\t{\n\t\tSetAwake(true);\n\t}\n\n\t// Don't accumulate a force if the body is sleeping\n\tif (m_flags & e_awakeFlag)\n\t{\n\t\tm_force += force;\n\t}\n}\n\ninline void b2Body::ApplyTorque(float torque, bool wake)\n{\n\tif (m_type != b2_dynamicBody)\n\t{\n\t\treturn;\n\t}\n\n\tif (wake && (m_flags & e_awakeFlag) == 0)\n\t{\n\t\tSetAwake(true);\n\t}\n\n\t// Don't accumulate a force if the body is sleeping\n\tif (m_flags & e_awakeFlag)\n\t{\n\t\tm_torque += torque;\n\t}\n}\n\ninline void b2Body::ApplyLinearImpulse(const b2Vec2& impulse, const b2Vec2& point, bool wake)\n{\n\tif (m_type != b2_dynamicBody)\n\t{\n\t\treturn;\n\t}\n\n\tif (wake && (m_flags & e_awakeFlag) == 0)\n\t{\n\t\tSetAwake(true);\n\t}\n\n\t// Don't accumulate velocity if the body is sleeping\n\tif (m_flags & e_awakeFlag)\n\t{\n\t\tm_linearVelocity += m_invMass * impulse;\n\t\tm_angularVelocity += m_invI * b2Cross(point - m_sweep.c, impulse);\n\t}\n}\n\ninline void b2Body::ApplyLinearImpulseToCenter(const b2Vec2& impulse, bool wake)\n{\n\tif (m_type != b2_dynamicBody)\n\t{\n\t\treturn;\n\t}\n\n\tif (wake && (m_flags & e_awakeFlag) == 0)\n\t{\n\t\tSetAwake(true);\n\t}\n\n\t// Don't accumulate velocity if the body is sleeping\n\tif (m_flags & e_awakeFlag)\n\t{\n\t\tm_linearVelocity += m_invMass * impulse;\n\t}\n}\n\ninline void b2Body::ApplyAngularImpulse(float impulse, bool wake)\n{\n\tif (m_type != b2_dynamicBody)\n\t{\n\t\treturn;\n\t}\n\n\tif (wake && (m_flags & e_awakeFlag) == 0)\n\t{\n\t\tSetAwake(true);\n\t}\n\n\t// Don't accumulate velocity if the body is sleeping\n\tif (m_flags & e_awakeFlag)\n\t{\n\t\tm_angularVelocity += m_invI * impulse;\n\t}\n}\n\ninline void b2Body::SynchronizeTransform()\n{\n\tm_xf.q.Set(m_sweep.a);\n\tm_xf.p = m_sweep.c - b2Mul(m_xf.q, m_sweep.localCenter);\n}\n\ninline void b2Body::Advance(float alpha)\n{\n\t// Advance to the new safe time. This doesn't sync the broad-phase.\n\tm_sweep.Advance(alpha);\n\tm_sweep.c = m_sweep.c0;\n\tm_sweep.a = m_sweep.a0;\n\tm_xf.q.Set(m_sweep.a);\n\tm_xf.p = m_sweep.c - b2Mul(m_xf.q, m_sweep.localCenter);\n}\n\ninline b2World* b2Body::GetWorld()\n{\n\treturn m_world;\n}\n\ninline const b2World* b2Body::GetWorld() const\n{\n\treturn m_world;\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_broad_phase.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_BROAD_PHASE_H\n#define B2_BROAD_PHASE_H\n\n#include \"b2_api.h\"\n#include \"b2_settings.h\"\n#include \"b2_collision.h\"\n#include \"b2_dynamic_tree.h\"\n\nstruct B2_API b2Pair\n{\n\tint32 proxyIdA;\n\tint32 proxyIdB;\n};\n\n/// The broad-phase is used for computing pairs and performing volume queries and ray casts.\n/// This broad-phase does not persist pairs. Instead, this reports potentially new pairs.\n/// It is up to the client to consume the new pairs and to track subsequent overlap.\nclass B2_API b2BroadPhase\n{\npublic:\n\n\tenum\n\t{\n\t\te_nullProxy = -1\n\t};\n\n\tb2BroadPhase();\n\t~b2BroadPhase();\n\n\t/// Create a proxy with an initial AABB. Pairs are not reported until\n\t/// UpdatePairs is called.\n\tint32 CreateProxy(const b2AABB& aabb, void* userData);\n\n\t/// Destroy a proxy. It is up to the client to remove any pairs.\n\tvoid DestroyProxy(int32 proxyId);\n\n\t/// Call MoveProxy as many times as you like, then when you are done\n\t/// call UpdatePairs to finalized the proxy pairs (for your time step).\n\tvoid MoveProxy(int32 proxyId, const b2AABB& aabb, const b2Vec2& displacement);\n\n\t/// Call to trigger a re-processing of it's pairs on the next call to UpdatePairs.\n\tvoid TouchProxy(int32 proxyId);\n\n\t/// Get the fat AABB for a proxy.\n\tconst b2AABB& GetFatAABB(int32 proxyId) const;\n\n\t/// Get user data from a proxy. Returns nullptr if the id is invalid.\n\tvoid* GetUserData(int32 proxyId) const;\n\n\t/// Test overlap of fat AABBs.\n\tbool TestOverlap(int32 proxyIdA, int32 proxyIdB) const;\n\n\t/// Get the number of proxies.\n\tint32 GetProxyCount() const;\n\n\t/// Update the pairs. This results in pair callbacks. This can only add pairs.\n\ttemplate <typename T>\n\tvoid UpdatePairs(T* callback);\n\n\t/// Query an AABB for overlapping proxies. The callback class\n\t/// is called for each proxy that overlaps the supplied AABB.\n\ttemplate <typename T>\n\tvoid Query(T* callback, const b2AABB& aabb) const;\n\n\t/// Ray-cast against the proxies in the tree. This relies on the callback\n\t/// to perform a exact ray-cast in the case were the proxy contains a shape.\n\t/// The callback also performs the any collision filtering. This has performance\n\t/// roughly equal to k * log(n), where k is the number of collisions and n is the\n\t/// number of proxies in the tree.\n\t/// @param input the ray-cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1).\n\t/// @param callback a callback class that is called for each proxy that is hit by the ray.\n\ttemplate <typename T>\n\tvoid RayCast(T* callback, const b2RayCastInput& input) const;\n\n\t/// Get the height of the embedded tree.\n\tint32 GetTreeHeight() const;\n\n\t/// Get the balance of the embedded tree.\n\tint32 GetTreeBalance() const;\n\n\t/// Get the quality metric of the embedded tree.\n\tfloat GetTreeQuality() const;\n\n\t/// Shift the world origin. Useful for large worlds.\n\t/// The shift formula is: position -= newOrigin\n\t/// @param newOrigin the new origin with respect to the old origin\n\tvoid ShiftOrigin(const b2Vec2& newOrigin);\n\nprivate:\n\n\tfriend class b2DynamicTree;\n\n\tvoid BufferMove(int32 proxyId);\n\tvoid UnBufferMove(int32 proxyId);\n\n\tbool QueryCallback(int32 proxyId);\n\n\tb2DynamicTree m_tree;\n\n\tint32 m_proxyCount;\n\n\tint32* m_moveBuffer;\n\tint32 m_moveCapacity;\n\tint32 m_moveCount;\n\n\tb2Pair* m_pairBuffer;\n\tint32 m_pairCapacity;\n\tint32 m_pairCount;\n\n\tint32 m_queryProxyId;\n};\n\ninline void* b2BroadPhase::GetUserData(int32 proxyId) const\n{\n\treturn m_tree.GetUserData(proxyId);\n}\n\ninline bool b2BroadPhase::TestOverlap(int32 proxyIdA, int32 proxyIdB) const\n{\n\tconst b2AABB& aabbA = m_tree.GetFatAABB(proxyIdA);\n\tconst b2AABB& aabbB = m_tree.GetFatAABB(proxyIdB);\n\treturn b2TestOverlap(aabbA, aabbB);\n}\n\ninline const b2AABB& b2BroadPhase::GetFatAABB(int32 proxyId) const\n{\n\treturn m_tree.GetFatAABB(proxyId);\n}\n\ninline int32 b2BroadPhase::GetProxyCount() const\n{\n\treturn m_proxyCount;\n}\n\ninline int32 b2BroadPhase::GetTreeHeight() const\n{\n\treturn m_tree.GetHeight();\n}\n\ninline int32 b2BroadPhase::GetTreeBalance() const\n{\n\treturn m_tree.GetMaxBalance();\n}\n\ninline float b2BroadPhase::GetTreeQuality() const\n{\n\treturn m_tree.GetAreaRatio();\n}\n\ntemplate <typename T>\nvoid b2BroadPhase::UpdatePairs(T* callback)\n{\n\t// Reset pair buffer\n\tm_pairCount = 0;\n\n\t// Perform tree queries for all moving proxies.\n\tfor (int32 i = 0; i < m_moveCount; ++i)\n\t{\n\t\tm_queryProxyId = m_moveBuffer[i];\n\t\tif (m_queryProxyId == e_nullProxy)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// We have to query the tree with the fat AABB so that\n\t\t// we don't fail to create a pair that may touch later.\n\t\tconst b2AABB& fatAABB = m_tree.GetFatAABB(m_queryProxyId);\n\n\t\t// Query tree, create pairs and add them pair buffer.\n\t\tm_tree.Query(this, fatAABB);\n\t}\n\n\t// Send pairs to caller\n\tfor (int32 i = 0; i < m_pairCount; ++i)\n\t{\n\t\tb2Pair* primaryPair = m_pairBuffer + i;\n\t\tvoid* userDataA = m_tree.GetUserData(primaryPair->proxyIdA);\n\t\tvoid* userDataB = m_tree.GetUserData(primaryPair->proxyIdB);\n\n\t\tcallback->AddPair(userDataA, userDataB);\n\t}\n\n\t// Clear move flags\n\tfor (int32 i = 0; i < m_moveCount; ++i)\n\t{\n\t\tint32 proxyId = m_moveBuffer[i];\n\t\tif (proxyId == e_nullProxy)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tm_tree.ClearMoved(proxyId);\n\t}\n\n\t// Reset move buffer\n\tm_moveCount = 0;\n}\n\ntemplate <typename T>\ninline void b2BroadPhase::Query(T* callback, const b2AABB& aabb) const\n{\n\tm_tree.Query(callback, aabb);\n}\n\ntemplate <typename T>\ninline void b2BroadPhase::RayCast(T* callback, const b2RayCastInput& input) const\n{\n\tm_tree.RayCast(callback, input);\n}\n\ninline void b2BroadPhase::ShiftOrigin(const b2Vec2& newOrigin)\n{\n\tm_tree.ShiftOrigin(newOrigin);\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_chain_shape.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_CHAIN_SHAPE_H\n#define B2_CHAIN_SHAPE_H\n\n#include \"b2_api.h\"\n#include \"b2_shape.h\"\n\nclass b2EdgeShape;\n\n/// A chain shape is a free form sequence of line segments.\n/// The chain has one-sided collision, with the surface normal pointing to the right of the edge.\n/// This provides a counter-clockwise winding like the polygon shape.\n/// Connectivity information is used to create smooth collisions.\n/// @warning the chain will not collide properly if there are self-intersections.\nclass B2_API b2ChainShape : public b2Shape\n{\npublic:\n\tb2ChainShape();\n\n\t/// The destructor frees the vertices using b2Free.\n\t~b2ChainShape();\n\n\t/// Clear all data.\n\tvoid Clear();\n\n\t/// Create a loop. This automatically adjusts connectivity.\n\t/// @param vertices an array of vertices, these are copied\n\t/// @param count the vertex count\n\tvoid CreateLoop(const b2Vec2* vertices, int32 count);\n\n\t/// Create a chain with ghost vertices to connect multiple chains together.\n\t/// @param vertices an array of vertices, these are copied\n\t/// @param count the vertex count\n\t/// @param prevVertex previous vertex from chain that connects to the start\n\t/// @param nextVertex next vertex from chain that connects to the end\n\tvoid CreateChain(const b2Vec2* vertices, int32 count,\n\t\tconst b2Vec2& prevVertex, const b2Vec2& nextVertex);\n\n\t/// Implement b2Shape. Vertices are cloned using b2Alloc.\n\tb2Shape* Clone(b2BlockAllocator* allocator) const override;\n\n\t/// @see b2Shape::GetChildCount\n\tint32 GetChildCount() const override;\n\n\t/// Get a child edge.\n\tvoid GetChildEdge(b2EdgeShape* edge, int32 index) const;\n\n\t/// This always return false.\n\t/// @see b2Shape::TestPoint\n\tbool TestPoint(const b2Transform& transform, const b2Vec2& p) const override;\n\n\t/// Implement b2Shape.\n\tbool RayCast(b2RayCastOutput* output, const b2RayCastInput& input,\n\t\t\t\t\tconst b2Transform& transform, int32 childIndex) const override;\n\n\t/// @see b2Shape::ComputeAABB\n\tvoid ComputeAABB(b2AABB* aabb, const b2Transform& transform, int32 childIndex) const override;\n\n\t/// Chains have zero mass.\n\t/// @see b2Shape::ComputeMass\n\tvoid ComputeMass(b2MassData* massData, float density) const override;\n\n\t/// The vertices. Owned by this class.\n\tb2Vec2* m_vertices;\n\n\t/// The vertex count.\n\tint32 m_count;\n\n\tb2Vec2 m_prevVertex, m_nextVertex;\n};\n\ninline b2ChainShape::b2ChainShape()\n{\n\tm_type = e_chain;\n\tm_radius = b2_polygonRadius;\n\tm_vertices = nullptr;\n\tm_count = 0;\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_circle_shape.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_CIRCLE_SHAPE_H\n#define B2_CIRCLE_SHAPE_H\n\n#include \"b2_api.h\"\n#include \"b2_shape.h\"\n\n/// A solid circle shape\nclass B2_API b2CircleShape : public b2Shape\n{\npublic:\n\tb2CircleShape();\n\n\t/// Implement b2Shape.\n\tb2Shape* Clone(b2BlockAllocator* allocator) const override;\n\n\t/// @see b2Shape::GetChildCount\n\tint32 GetChildCount() const override;\n\n\t/// Implement b2Shape.\n\tbool TestPoint(const b2Transform& transform, const b2Vec2& p) const override;\n\n\t/// Implement b2Shape.\n\t/// @note because the circle is solid, rays that start inside do not hit because the normal is\n\t/// not defined.\n\tbool RayCast(b2RayCastOutput* output, const b2RayCastInput& input,\n\t\t\t\tconst b2Transform& transform, int32 childIndex) const override;\n\n\t/// @see b2Shape::ComputeAABB\n\tvoid ComputeAABB(b2AABB* aabb, const b2Transform& transform, int32 childIndex) const override;\n\n\t/// @see b2Shape::ComputeMass\n\tvoid ComputeMass(b2MassData* massData, float density) const override;\n\n\t/// Position\n\tb2Vec2 m_p;\n};\n\ninline b2CircleShape::b2CircleShape()\n{\n\tm_type = e_circle;\n\tm_radius = 0.0f;\n\tm_p.SetZero();\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_collision.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_COLLISION_H\n#define B2_COLLISION_H\n\n#include <limits.h>\n\n#include \"b2_api.h\"\n#include \"b2_math.h\"\n\n/// @file\n/// Structures and functions used for computing contact points, distance\n/// queries, and TOI queries.\n\nclass b2Shape;\nclass b2CircleShape;\nclass b2EdgeShape;\nclass b2PolygonShape;\n\nconst uint8 b2_nullFeature = UCHAR_MAX;\n\n/// The features that intersect to form the contact point\n/// This must be 4 bytes or less.\nstruct B2_API b2ContactFeature\n{\n\tenum Type\n\t{\n\t\te_vertex = 0,\n\t\te_face = 1\n\t};\n\n\tuint8 indexA;\t\t///< Feature index on shapeA\n\tuint8 indexB;\t\t///< Feature index on shapeB\n\tuint8 typeA;\t\t///< The feature type on shapeA\n\tuint8 typeB;\t\t///< The feature type on shapeB\n};\n\n/// Contact ids to facilitate warm starting.\nunion B2_API b2ContactID\n{\n\tb2ContactFeature cf;\n\tuint32 key;\t\t\t\t\t///< Used to quickly compare contact ids.\n};\n\n/// A manifold point is a contact point belonging to a contact\n/// manifold. It holds details related to the geometry and dynamics\n/// of the contact points.\n/// The local point usage depends on the manifold type:\n/// -e_circles: the local center of circleB\n/// -e_faceA: the local center of cirlceB or the clip point of polygonB\n/// -e_faceB: the clip point of polygonA\n/// This structure is stored across time steps, so we keep it small.\n/// Note: the impulses are used for internal caching and may not\n/// provide reliable contact forces, especially for high speed collisions.\nstruct B2_API b2ManifoldPoint\n{\n\tb2Vec2 localPoint;\t\t///< usage depends on manifold type\n\tfloat normalImpulse;\t///< the non-penetration impulse\n\tfloat tangentImpulse;\t///< the friction impulse\n\tb2ContactID id;\t\t\t///< uniquely identifies a contact point between two shapes\n};\n\n/// A manifold for two touching convex shapes.\n/// Box2D supports multiple types of contact:\n/// - clip point versus plane with radius\n/// - point versus point with radius (circles)\n/// The local point usage depends on the manifold type:\n/// -e_circles: the local center of circleA\n/// -e_faceA: the center of faceA\n/// -e_faceB: the center of faceB\n/// Similarly the local normal usage:\n/// -e_circles: not used\n/// -e_faceA: the normal on polygonA\n/// -e_faceB: the normal on polygonB\n/// We store contacts in this way so that position correction can\n/// account for movement, which is critical for continuous physics.\n/// All contact scenarios must be expressed in one of these types.\n/// This structure is stored across time steps, so we keep it small.\nstruct B2_API b2Manifold\n{\n\tenum Type\n\t{\n\t\te_circles,\n\t\te_faceA,\n\t\te_faceB\n\t};\n\n\tb2ManifoldPoint points[b2_maxManifoldPoints];\t///< the points of contact\n\tb2Vec2 localNormal;\t\t\t\t\t\t\t\t///< not use for Type::e_points\n\tb2Vec2 localPoint;\t\t\t\t\t\t\t\t///< usage depends on manifold type\n\tType type;\n\tint32 pointCount;\t\t\t\t\t\t\t\t///< the number of manifold points\n};\n\n/// This is used to compute the current state of a contact manifold.\nstruct B2_API b2WorldManifold\n{\n\t/// Evaluate the manifold with supplied transforms. This assumes\n\t/// modest motion from the original state. This does not change the\n\t/// point count, impulses, etc. The radii must come from the shapes\n\t/// that generated the manifold.\n\tvoid Initialize(const b2Manifold* manifold,\n\t\t\t\t\tconst b2Transform& xfA, float radiusA,\n\t\t\t\t\tconst b2Transform& xfB, float radiusB);\n\n\tb2Vec2 normal;\t\t\t\t\t\t\t\t///< world vector pointing from A to B\n\tb2Vec2 points[b2_maxManifoldPoints];\t\t///< world contact point (point of intersection)\n\tfloat separations[b2_maxManifoldPoints];\t///< a negative value indicates overlap, in meters\n};\n\n/// This is used for determining the state of contact points.\nenum b2PointState\n{\n\tb2_nullState,\t\t///< point does not exist\n\tb2_addState,\t\t///< point was added in the update\n\tb2_persistState,\t///< point persisted across the update\n\tb2_removeState\t\t///< point was removed in the update\n};\n\n/// Compute the point states given two manifolds. The states pertain to the transition from manifold1\n/// to manifold2. So state1 is either persist or remove while state2 is either add or persist.\nB2_API void b2GetPointStates(b2PointState state1[b2_maxManifoldPoints], b2PointState state2[b2_maxManifoldPoints],\n\t\t\t\t\t  const b2Manifold* manifold1, const b2Manifold* manifold2);\n\n/// Used for computing contact manifolds.\nstruct B2_API b2ClipVertex\n{\n\tb2Vec2 v;\n\tb2ContactID id;\n};\n\n/// Ray-cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1).\nstruct B2_API b2RayCastInput\n{\n\tb2Vec2 p1, p2;\n\tfloat maxFraction;\n};\n\n/// Ray-cast output data. The ray hits at p1 + fraction * (p2 - p1), where p1 and p2\n/// come from b2RayCastInput.\nstruct B2_API b2RayCastOutput\n{\n\tb2Vec2 normal;\n\tfloat fraction;\n};\n\n/// An axis aligned bounding box.\nstruct B2_API b2AABB\n{\n\t/// Verify that the bounds are sorted.\n\tbool IsValid() const;\n\n\t/// Get the center of the AABB.\n\tb2Vec2 GetCenter() const\n\t{\n\t\treturn 0.5f * (lowerBound + upperBound);\n\t}\n\n\t/// Get the extents of the AABB (half-widths).\n\tb2Vec2 GetExtents() const\n\t{\n\t\treturn 0.5f * (upperBound - lowerBound);\n\t}\n\n\t/// Get the perimeter length\n\tfloat GetPerimeter() const\n\t{\n\t\tfloat wx = upperBound.x - lowerBound.x;\n\t\tfloat wy = upperBound.y - lowerBound.y;\n\t\treturn 2.0f * (wx + wy);\n\t}\n\n\t/// Combine an AABB into this one.\n\tvoid Combine(const b2AABB& aabb)\n\t{\n\t\tlowerBound = b2Min(lowerBound, aabb.lowerBound);\n\t\tupperBound = b2Max(upperBound, aabb.upperBound);\n\t}\n\n\t/// Combine two AABBs into this one.\n\tvoid Combine(const b2AABB& aabb1, const b2AABB& aabb2)\n\t{\n\t\tlowerBound = b2Min(aabb1.lowerBound, aabb2.lowerBound);\n\t\tupperBound = b2Max(aabb1.upperBound, aabb2.upperBound);\n\t}\n\n\t/// Does this aabb contain the provided AABB.\n\tbool Contains(const b2AABB& aabb) const\n\t{\n\t\tbool result = true;\n\t\tresult = result && lowerBound.x <= aabb.lowerBound.x;\n\t\tresult = result && lowerBound.y <= aabb.lowerBound.y;\n\t\tresult = result && aabb.upperBound.x <= upperBound.x;\n\t\tresult = result && aabb.upperBound.y <= upperBound.y;\n\t\treturn result;\n\t}\n\n\tbool RayCast(b2RayCastOutput* output, const b2RayCastInput& input) const;\n\n\tb2Vec2 lowerBound;\t///< the lower vertex\n\tb2Vec2 upperBound;\t///< the upper vertex\n};\n\n/// Compute the collision manifold between two circles.\nB2_API void b2CollideCircles(b2Manifold* manifold,\n\t\t\t\t\t  const b2CircleShape* circleA, const b2Transform& xfA,\n\t\t\t\t\t  const b2CircleShape* circleB, const b2Transform& xfB);\n\n/// Compute the collision manifold between a polygon and a circle.\nB2_API void b2CollidePolygonAndCircle(b2Manifold* manifold,\n\t\t\t\t\t\t\t   const b2PolygonShape* polygonA, const b2Transform& xfA,\n\t\t\t\t\t\t\t   const b2CircleShape* circleB, const b2Transform& xfB);\n\n/// Compute the collision manifold between two polygons.\nB2_API void b2CollidePolygons(b2Manifold* manifold,\n\t\t\t\t\t   const b2PolygonShape* polygonA, const b2Transform& xfA,\n\t\t\t\t\t   const b2PolygonShape* polygonB, const b2Transform& xfB);\n\n/// Compute the collision manifold between an edge and a circle.\nB2_API void b2CollideEdgeAndCircle(b2Manifold* manifold,\n\t\t\t\t\t\t\t   const b2EdgeShape* polygonA, const b2Transform& xfA,\n\t\t\t\t\t\t\t   const b2CircleShape* circleB, const b2Transform& xfB);\n\n/// Compute the collision manifold between an edge and a polygon.\nB2_API void b2CollideEdgeAndPolygon(b2Manifold* manifold,\n\t\t\t\t\t\t\t   const b2EdgeShape* edgeA, const b2Transform& xfA,\n\t\t\t\t\t\t\t   const b2PolygonShape* circleB, const b2Transform& xfB);\n\n/// Clipping for contact manifolds.\nB2_API int32 b2ClipSegmentToLine(b2ClipVertex vOut[2], const b2ClipVertex vIn[2],\n\t\t\t\t\t\t\tconst b2Vec2& normal, float offset, int32 vertexIndexA);\n\n/// Determine if two generic shapes overlap.\nB2_API bool b2TestOverlap(\tconst b2Shape* shapeA, int32 indexA,\n\t\t\t\t\tconst b2Shape* shapeB, int32 indexB,\n\t\t\t\t\tconst b2Transform& xfA, const b2Transform& xfB);\n\n// ---------------- Inline Functions ------------------------------------------\n\ninline bool b2AABB::IsValid() const\n{\n\tb2Vec2 d = upperBound - lowerBound;\n\tbool valid = d.x >= 0.0f && d.y >= 0.0f;\n\tvalid = valid && lowerBound.IsValid() && upperBound.IsValid();\n\treturn valid;\n}\n\ninline bool b2TestOverlap(const b2AABB& a, const b2AABB& b)\n{\n\tb2Vec2 d1, d2;\n\td1 = b.lowerBound - a.upperBound;\n\td2 = a.lowerBound - b.upperBound;\n\n\tif (d1.x > 0.0f || d1.y > 0.0f)\n\t\treturn false;\n\n\tif (d2.x > 0.0f || d2.y > 0.0f)\n\t\treturn false;\n\n\treturn true;\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_common.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_COMMON_H\n#define B2_COMMON_H\n\n#include \"b2_settings.h\"\n\n#include <stddef.h>\n#include <assert.h>\n#include <float.h>\n\n#if !defined(NDEBUG)\n\t#define b2DEBUG\n#endif\n\n#define B2_NOT_USED(x) ((void)(x))\nvoid loveAssert(bool test, const char* teststr);\n#define b2Assert(A) loveAssert((A), #A)\n\n#define\tb2_maxFloat\t\tFLT_MAX\n#define\tb2_epsilon\t\tFLT_EPSILON\n#define b2_pi\t\t\t3.14159265359f\n\n/// @file\n/// Global tuning constants based on meters-kilograms-seconds (MKS) units.\n///\n\n// Collision\n\n/// The maximum number of contact points between two convex shapes. Do\n/// not change this value.\n#define b2_maxManifoldPoints\t2\n\n/// This is used to fatten AABBs in the dynamic tree. This allows proxies\n/// to move by a small amount without triggering a tree adjustment.\n/// This is in meters.\n#define b2_aabbExtension\t\t(0.1f * b2_lengthUnitsPerMeter)\n\n/// This is used to fatten AABBs in the dynamic tree. This is used to predict\n/// the future position based on the current displacement.\n/// This is a dimensionless multiplier.\n#define b2_aabbMultiplier\t\t4.0f\n\n/// A small length used as a collision and constraint tolerance. Usually it is\n/// chosen to be numerically significant, but visually insignificant. In meters.\n#define b2_linearSlop\t\t\t(0.005f * b2_lengthUnitsPerMeter)\n\n/// A small angle used as a collision and constraint tolerance. Usually it is\n/// chosen to be numerically significant, but visually insignificant.\n#define b2_angularSlop\t\t\t(2.0f / 180.0f * b2_pi)\n\n/// The radius of the polygon/edge shape skin. This should not be modified. Making\n/// this smaller means polygons will have an insufficient buffer for continuous collision.\n/// Making it larger may create artifacts for vertex collision.\n#define b2_polygonRadius\t\t(2.0f * b2_linearSlop)\n\n/// Maximum number of sub-steps per contact in continuous physics simulation.\n#define b2_maxSubSteps\t\t\t8\n\n\n// Dynamics\n\n/// Maximum number of contacts to be handled to solve a TOI impact.\n#define b2_maxTOIContacts\t\t\t32\n\n/// The maximum linear position correction used when solving constraints. This helps to\n/// prevent overshoot. Meters.\n#define b2_maxLinearCorrection\t\t(0.2f * b2_lengthUnitsPerMeter)\n\n/// The maximum angular position correction used when solving constraints. This helps to\n/// prevent overshoot.\n#define b2_maxAngularCorrection\t\t(8.0f / 180.0f * b2_pi)\n\n/// The maximum linear translation of a body per step. This limit is very large and is used\n/// to prevent numerical problems. You shouldn't need to adjust this. Meters.\n#define b2_maxTranslation\t\t\t(2.0f * b2_lengthUnitsPerMeter)\n#define b2_maxTranslationSquared\t(b2_maxTranslation * b2_maxTranslation)\n\n/// The maximum angular velocity of a body. This limit is very large and is used\n/// to prevent numerical problems. You shouldn't need to adjust this.\n#define b2_maxRotation\t\t\t\t(0.5f * b2_pi)\n#define b2_maxRotationSquared\t\t(b2_maxRotation * b2_maxRotation)\n\n/// This scale factor controls how fast overlap is resolved. Ideally this would be 1 so\n/// that overlap is removed in one time step. However using values close to 1 often lead\n/// to overshoot.\n#define b2_baumgarte\t\t\t\t0.2f\n#define b2_toiBaumgarte\t\t\t\t0.75f\n\n\n// Sleep\n\n/// The time that a body must be still before it will go to sleep.\n#define b2_timeToSleep\t\t\t\t0.5f\n\n/// A body cannot sleep if its linear velocity is above this tolerance.\n#define b2_linearSleepTolerance\t\t(0.01f * b2_lengthUnitsPerMeter)\n\n/// A body cannot sleep if its angular velocity is above this tolerance.\n#define b2_angularSleepTolerance\t(2.0f / 180.0f * b2_pi)\n\n/// Dump to a file. Only one dump file allowed at a time.\nvoid b2OpenDump(const char* fileName);\nvoid b2Dump(const char* string, ...);\nvoid b2CloseDump();\n\n/// Version numbering scheme.\n/// See http://en.wikipedia.org/wiki/Software_versioning\nstruct b2Version\n{\n\tint32 major;\t\t///< significant changes\n\tint32 minor;\t\t///< incremental changes\n\tint32 revision;\t\t///< bug fixes\n};\n\n/// Current version.\nextern B2_API b2Version b2_version;\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_contact.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_CONTACT_H\n#define B2_CONTACT_H\n\n#include \"b2_api.h\"\n#include \"b2_collision.h\"\n#include \"b2_fixture.h\"\n#include \"b2_math.h\"\n#include \"b2_shape.h\"\n\nclass b2Body;\nclass b2Contact;\nclass b2Fixture;\nclass b2World;\nclass b2BlockAllocator;\nclass b2StackAllocator;\nclass b2ContactListener;\n\n/// Friction mixing law. The idea is to allow either fixture to drive the friction to zero.\n/// For example, anything slides on ice.\ninline float b2MixFriction(float friction1, float friction2)\n{\n\treturn b2Sqrt(friction1 * friction2);\n}\n\n/// Restitution mixing law. The idea is allow for anything to bounce off an inelastic surface.\n/// For example, a superball bounces on anything.\ninline float b2MixRestitution(float restitution1, float restitution2)\n{\n\treturn restitution1 > restitution2 ? restitution1 : restitution2;\n}\n\n/// Restitution mixing law. This picks the lowest value.\ninline float b2MixRestitutionThreshold(float threshold1, float threshold2)\n{\n\treturn threshold1 < threshold2 ? threshold1 : threshold2;\n}\n\ntypedef b2Contact* b2ContactCreateFcn(\tb2Fixture* fixtureA, int32 indexA,\n\t\t\t\t\t\t\t\t\t\tb2Fixture* fixtureB, int32 indexB,\n\t\t\t\t\t\t\t\t\t\tb2BlockAllocator* allocator);\ntypedef void b2ContactDestroyFcn(b2Contact* contact, b2BlockAllocator* allocator);\n\nstruct B2_API b2ContactRegister\n{\n\tb2ContactCreateFcn* createFcn;\n\tb2ContactDestroyFcn* destroyFcn;\n\tbool primary;\n};\n\n/// A contact edge is used to connect bodies and contacts together\n/// in a contact graph where each body is a node and each contact\n/// is an edge. A contact edge belongs to a doubly linked list\n/// maintained in each attached body. Each contact has two contact\n/// nodes, one for each attached body.\nstruct B2_API b2ContactEdge\n{\n\tb2Body* other;\t\t\t///< provides quick access to the other body attached.\n\tb2Contact* contact;\t\t///< the contact\n\tb2ContactEdge* prev;\t///< the previous contact edge in the body's contact list\n\tb2ContactEdge* next;\t///< the next contact edge in the body's contact list\n};\n\n/// The class manages contact between two shapes. A contact exists for each overlapping\n/// AABB in the broad-phase (except if filtered). Therefore a contact object may exist\n/// that has no contact points.\nclass B2_API b2Contact\n{\npublic:\n\n\t/// Get the contact manifold. Do not modify the manifold unless you understand the\n\t/// internals of Box2D.\n\tb2Manifold* GetManifold();\n\tconst b2Manifold* GetManifold() const;\n\n\t/// Get the world manifold.\n\tvoid GetWorldManifold(b2WorldManifold* worldManifold) const;\n\n\t/// Is this contact touching?\n\tbool IsTouching() const;\n\n\t/// Enable/disable this contact. This can be used inside the pre-solve\n\t/// contact listener. The contact is only disabled for the current\n\t/// time step (or sub-step in continuous collisions).\n\tvoid SetEnabled(bool flag);\n\n\t/// Has this contact been disabled?\n\tbool IsEnabled() const;\n\n\t/// Get the next contact in the world's contact list.\n\tb2Contact* GetNext();\n\tconst b2Contact* GetNext() const;\n\n\t/// Get fixture A in this contact.\n\tb2Fixture* GetFixtureA();\n\tconst b2Fixture* GetFixtureA() const;\n\n\t/// Get the child primitive index for fixture A.\n\tint32 GetChildIndexA() const;\n\n\t/// Get fixture B in this contact.\n\tb2Fixture* GetFixtureB();\n\tconst b2Fixture* GetFixtureB() const;\n\n\t/// Get the child primitive index for fixture B.\n\tint32 GetChildIndexB() const;\n\n\t/// Override the default friction mixture. You can call this in b2ContactListener::PreSolve.\n\t/// This value persists until set or reset.\n\tvoid SetFriction(float friction);\n\n\t/// Get the friction.\n\tfloat GetFriction() const;\n\n\t/// Reset the friction mixture to the default value.\n\tvoid ResetFriction();\n\n\t/// Override the default restitution mixture. You can call this in b2ContactListener::PreSolve.\n\t/// The value persists until you set or reset.\n\tvoid SetRestitution(float restitution);\n\n\t/// Get the restitution.\n\tfloat GetRestitution() const;\n\n\t/// Reset the restitution to the default value.\n\tvoid ResetRestitution();\n\n\t/// Override the default restitution velocity threshold mixture. You can call this in b2ContactListener::PreSolve.\n\t/// The value persists until you set or reset.\n\tvoid SetRestitutionThreshold(float threshold);\n\n\t/// Get the restitution threshold.\n\tfloat GetRestitutionThreshold() const;\n\n\t/// Reset the restitution threshold to the default value.\n\tvoid ResetRestitutionThreshold();\n\n\t/// Set the desired tangent speed for a conveyor belt behavior. In meters per second.\n\tvoid SetTangentSpeed(float speed);\n\n\t/// Get the desired tangent speed. In meters per second.\n\tfloat GetTangentSpeed() const;\n\n\t/// Evaluate this contact with your own manifold and transforms.\n\tvirtual void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) = 0;\n\nprotected:\n\tfriend class b2ContactManager;\n\tfriend class b2World;\n\tfriend class b2ContactSolver;\n\tfriend class b2Body;\n\tfriend class b2Fixture;\n\n\t// Flags stored in m_flags\n\tenum\n\t{\n\t\t// Used when crawling contact graph when forming islands.\n\t\te_islandFlag\t\t= 0x0001,\n\n\t\t// Set when the shapes are touching.\n\t\te_touchingFlag\t\t= 0x0002,\n\n\t\t// This contact can be disabled (by user)\n\t\te_enabledFlag\t\t= 0x0004,\n\n\t\t// This contact needs filtering because a fixture filter was changed.\n\t\te_filterFlag\t\t= 0x0008,\n\n\t\t// This bullet contact had a TOI event\n\t\te_bulletHitFlag\t\t= 0x0010,\n\n\t\t// This contact has a valid TOI in m_toi\n\t\te_toiFlag\t\t\t= 0x0020\n\t};\n\n\t/// Flag this contact for filtering. Filtering will occur the next time step.\n\tvoid FlagForFiltering();\n\n\tstatic void AddType(b2ContactCreateFcn* createFcn, b2ContactDestroyFcn* destroyFcn,\n\t\t\t\t\t\tb2Shape::Type typeA, b2Shape::Type typeB);\n\tstatic void InitializeRegisters();\n\tstatic b2Contact* Create(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator);\n\tstatic void Destroy(b2Contact* contact, b2Shape::Type typeA, b2Shape::Type typeB, b2BlockAllocator* allocator);\n\tstatic void Destroy(b2Contact* contact, b2BlockAllocator* allocator);\n\n\tb2Contact() : m_fixtureA(nullptr), m_fixtureB(nullptr) {}\n\tb2Contact(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB);\n\tvirtual ~b2Contact() {}\n\n\tvoid Update(b2ContactListener* listener);\n\n\tstatic b2ContactRegister s_registers[b2Shape::e_typeCount][b2Shape::e_typeCount];\n\tstatic bool s_initialized;\n\n\tuint32 m_flags;\n\n\t// World pool and list pointers.\n\tb2Contact* m_prev;\n\tb2Contact* m_next;\n\n\t// Nodes for connecting bodies.\n\tb2ContactEdge m_nodeA;\n\tb2ContactEdge m_nodeB;\n\n\tb2Fixture* m_fixtureA;\n\tb2Fixture* m_fixtureB;\n\n\tint32 m_indexA;\n\tint32 m_indexB;\n\n\tb2Manifold m_manifold;\n\n\tint32 m_toiCount;\n\tfloat m_toi;\n\n\tfloat m_friction;\n\tfloat m_restitution;\n\tfloat m_restitutionThreshold;\n\n\tfloat m_tangentSpeed;\n};\n\ninline b2Manifold* b2Contact::GetManifold()\n{\n\treturn &m_manifold;\n}\n\ninline const b2Manifold* b2Contact::GetManifold() const\n{\n\treturn &m_manifold;\n}\n\ninline void b2Contact::GetWorldManifold(b2WorldManifold* worldManifold) const\n{\n\tconst b2Body* bodyA = m_fixtureA->GetBody();\n\tconst b2Body* bodyB = m_fixtureB->GetBody();\n\tconst b2Shape* shapeA = m_fixtureA->GetShape();\n\tconst b2Shape* shapeB = m_fixtureB->GetShape();\n\n\tworldManifold->Initialize(&m_manifold, bodyA->GetTransform(), shapeA->m_radius, bodyB->GetTransform(), shapeB->m_radius);\n}\n\ninline void b2Contact::SetEnabled(bool flag)\n{\n\tif (flag)\n\t{\n\t\tm_flags |= e_enabledFlag;\n\t}\n\telse\n\t{\n\t\tm_flags &= ~e_enabledFlag;\n\t}\n}\n\ninline bool b2Contact::IsEnabled() const\n{\n\treturn (m_flags & e_enabledFlag) == e_enabledFlag;\n}\n\ninline bool b2Contact::IsTouching() const\n{\n\treturn (m_flags & e_touchingFlag) == e_touchingFlag;\n}\n\ninline b2Contact* b2Contact::GetNext()\n{\n\treturn m_next;\n}\n\ninline const b2Contact* b2Contact::GetNext() const\n{\n\treturn m_next;\n}\n\ninline b2Fixture* b2Contact::GetFixtureA()\n{\n\treturn m_fixtureA;\n}\n\ninline const b2Fixture* b2Contact::GetFixtureA() const\n{\n\treturn m_fixtureA;\n}\n\ninline b2Fixture* b2Contact::GetFixtureB()\n{\n\treturn m_fixtureB;\n}\n\ninline int32 b2Contact::GetChildIndexA() const\n{\n\treturn m_indexA;\n}\n\ninline const b2Fixture* b2Contact::GetFixtureB() const\n{\n\treturn m_fixtureB;\n}\n\ninline int32 b2Contact::GetChildIndexB() const\n{\n\treturn m_indexB;\n}\n\ninline void b2Contact::FlagForFiltering()\n{\n\tm_flags |= e_filterFlag;\n}\n\ninline void b2Contact::SetFriction(float friction)\n{\n\tm_friction = friction;\n}\n\ninline float b2Contact::GetFriction() const\n{\n\treturn m_friction;\n}\n\ninline void b2Contact::ResetFriction()\n{\n\tm_friction = b2MixFriction(m_fixtureA->m_friction, m_fixtureB->m_friction);\n}\n\ninline void b2Contact::SetRestitution(float restitution)\n{\n\tm_restitution = restitution;\n}\n\ninline float b2Contact::GetRestitution() const\n{\n\treturn m_restitution;\n}\n\ninline void b2Contact::ResetRestitution()\n{\n\tm_restitution = b2MixRestitution(m_fixtureA->m_restitution, m_fixtureB->m_restitution);\n}\n\ninline void b2Contact::SetRestitutionThreshold(float threshold)\n{\n\tm_restitutionThreshold = threshold;\n}\n\ninline float b2Contact::GetRestitutionThreshold() const\n{\n\treturn m_restitutionThreshold;\n}\n\ninline void b2Contact::ResetRestitutionThreshold()\n{\n\tm_restitutionThreshold = b2MixRestitutionThreshold(m_fixtureA->m_restitutionThreshold, m_fixtureB->m_restitutionThreshold);\n}\n\ninline void b2Contact::SetTangentSpeed(float speed)\n{\n\tm_tangentSpeed = speed;\n}\n\ninline float b2Contact::GetTangentSpeed() const\n{\n\treturn m_tangentSpeed;\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_contact_manager.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_CONTACT_MANAGER_H\n#define B2_CONTACT_MANAGER_H\n\n#include \"b2_api.h\"\n#include \"b2_broad_phase.h\"\n\nclass b2Contact;\nclass b2ContactFilter;\nclass b2ContactListener;\nclass b2BlockAllocator;\n\n// Delegate of b2World.\nclass B2_API b2ContactManager\n{\npublic:\n\tb2ContactManager();\n\n\t// Broad-phase callback.\n\tvoid AddPair(void* proxyUserDataA, void* proxyUserDataB);\n\n\tvoid FindNewContacts();\n\n\tvoid Destroy(b2Contact* c);\n\n\tvoid Collide();\n\n\tb2BroadPhase m_broadPhase;\n\tb2Contact* m_contactList;\n\tint32 m_contactCount;\n\tb2ContactFilter* m_contactFilter;\n\tb2ContactListener* m_contactListener;\n\tb2BlockAllocator* m_allocator;\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_distance.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_DISTANCE_H\n#define B2_DISTANCE_H\n\n#include \"b2_api.h\"\n#include \"b2_math.h\"\n\nclass b2Shape;\n\n/// A distance proxy is used by the GJK algorithm.\n/// It encapsulates any shape.\nstruct B2_API b2DistanceProxy\n{\n\tb2DistanceProxy() : m_vertices(nullptr), m_count(0), m_radius(0.0f) {}\n\n\t/// Initialize the proxy using the given shape. The shape\n\t/// must remain in scope while the proxy is in use.\n\tvoid Set(const b2Shape* shape, int32 index);\n\n    /// Initialize the proxy using a vertex cloud and radius. The vertices\n    /// must remain in scope while the proxy is in use.\n    void Set(const b2Vec2* vertices, int32 count, float radius);\n\n\t/// Get the supporting vertex index in the given direction.\n\tint32 GetSupport(const b2Vec2& d) const;\n\n\t/// Get the supporting vertex in the given direction.\n\tconst b2Vec2& GetSupportVertex(const b2Vec2& d) const;\n\n\t/// Get the vertex count.\n\tint32 GetVertexCount() const;\n\n\t/// Get a vertex by index. Used by b2Distance.\n\tconst b2Vec2& GetVertex(int32 index) const;\n\n\tb2Vec2 m_buffer[2];\n\tconst b2Vec2* m_vertices;\n\tint32 m_count;\n\tfloat m_radius;\n};\n\n/// Used to warm start b2Distance.\n/// Set count to zero on first call.\nstruct B2_API b2SimplexCache\n{\n\tfloat metric;\t\t///< length or area\n\tuint16 count;\n\tuint8 indexA[3];\t///< vertices on shape A\n\tuint8 indexB[3];\t///< vertices on shape B\n};\n\n/// Input for b2Distance.\n/// You have to option to use the shape radii\n/// in the computation. Even\nstruct B2_API b2DistanceInput\n{\n\tb2DistanceProxy proxyA;\n\tb2DistanceProxy proxyB;\n\tb2Transform transformA;\n\tb2Transform transformB;\n\tbool useRadii;\n};\n\n/// Output for b2Distance.\nstruct B2_API b2DistanceOutput\n{\n\tb2Vec2 pointA;\t\t///< closest point on shapeA\n\tb2Vec2 pointB;\t\t///< closest point on shapeB\n\tfloat distance;\n\tint32 iterations;\t///< number of GJK iterations used\n};\n\n/// Compute the closest points between two shapes. Supports any combination of:\n/// b2CircleShape, b2PolygonShape, b2EdgeShape. The simplex cache is input/output.\n/// On the first call set b2SimplexCache.count to zero.\nB2_API void b2Distance(b2DistanceOutput* output,\n\t\t\t\tb2SimplexCache* cache,\n\t\t\t\tconst b2DistanceInput* input);\n\n/// Input parameters for b2ShapeCast\nstruct B2_API b2ShapeCastInput\n{\n\tb2DistanceProxy proxyA;\n\tb2DistanceProxy proxyB;\n\tb2Transform transformA;\n\tb2Transform transformB;\n\tb2Vec2 translationB;\n};\n\n/// Output results for b2ShapeCast\nstruct B2_API b2ShapeCastOutput\n{\n\tb2Vec2 point;\n\tb2Vec2 normal;\n\tfloat lambda;\n\tint32 iterations;\n};\n\n/// Perform a linear shape cast of shape B moving and shape A fixed. Determines the hit point, normal, and translation fraction.\n/// @returns true if hit, false if there is no hit or an initial overlap\nB2_API bool b2ShapeCast(b2ShapeCastOutput* output, const b2ShapeCastInput* input);\n\n//////////////////////////////////////////////////////////////////////////\n\ninline int32 b2DistanceProxy::GetVertexCount() const\n{\n\treturn m_count;\n}\n\ninline const b2Vec2& b2DistanceProxy::GetVertex(int32 index) const\n{\n\tb2Assert(0 <= index && index < m_count);\n\treturn m_vertices[index];\n}\n\ninline int32 b2DistanceProxy::GetSupport(const b2Vec2& d) const\n{\n\tint32 bestIndex = 0;\n\tfloat bestValue = b2Dot(m_vertices[0], d);\n\tfor (int32 i = 1; i < m_count; ++i)\n\t{\n\t\tfloat value = b2Dot(m_vertices[i], d);\n\t\tif (value > bestValue)\n\t\t{\n\t\t\tbestIndex = i;\n\t\t\tbestValue = value;\n\t\t}\n\t}\n\n\treturn bestIndex;\n}\n\ninline const b2Vec2& b2DistanceProxy::GetSupportVertex(const b2Vec2& d) const\n{\n\tint32 bestIndex = 0;\n\tfloat bestValue = b2Dot(m_vertices[0], d);\n\tfor (int32 i = 1; i < m_count; ++i)\n\t{\n\t\tfloat value = b2Dot(m_vertices[i], d);\n\t\tif (value > bestValue)\n\t\t{\n\t\t\tbestIndex = i;\n\t\t\tbestValue = value;\n\t\t}\n\t}\n\n\treturn m_vertices[bestIndex];\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_distance_joint.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_DISTANCE_JOINT_H\n#define B2_DISTANCE_JOINT_H\n\n#include \"b2_api.h\"\n#include \"b2_joint.h\"\n\n/// Distance joint definition. This requires defining an anchor point on both\n/// bodies and the non-zero distance of the distance joint. The definition uses\n/// local anchor points so that the initial configuration can violate the\n/// constraint slightly. This helps when saving and loading a game.\nstruct B2_API b2DistanceJointDef : public b2JointDef\n{\n\tb2DistanceJointDef()\n\t{\n\t\ttype = e_distanceJoint;\n\t\tlocalAnchorA.Set(0.0f, 0.0f);\n\t\tlocalAnchorB.Set(0.0f, 0.0f);\n\t\tlength = 1.0f;\n\t\tminLength = 0.0f;\n\t\tmaxLength = FLT_MAX;\n\t\tstiffness = 0.0f;\n\t\tdamping = 0.0f;\n\t}\n\n\t/// Initialize the bodies, anchors, and rest length using world space anchors.\n\t/// The minimum and maximum lengths are set to the rest length.\n\tvoid Initialize(b2Body* bodyA, b2Body* bodyB,\n\t\t\t\t\tconst b2Vec2& anchorA, const b2Vec2& anchorB);\n\n\t/// The local anchor point relative to bodyA's origin.\n\tb2Vec2 localAnchorA;\n\n\t/// The local anchor point relative to bodyB's origin.\n\tb2Vec2 localAnchorB;\n\n\t/// The rest length of this joint. Clamped to a stable minimum value.\n\tfloat length;\n\n\t/// Minimum length. Clamped to a stable minimum value.\n\tfloat minLength;\n\n\t/// Maximum length. Must be greater than or equal to the minimum length.\n\tfloat maxLength;\n\n\t/// The linear stiffness in N/m.\n\tfloat stiffness;\n\n\t/// The linear damping in N*s/m.\n\tfloat damping;\n};\n\n/// A distance joint constrains two points on two bodies to remain at a fixed\n/// distance from each other. You can view this as a massless, rigid rod.\nclass B2_API b2DistanceJoint : public b2Joint\n{\npublic:\n\n\tb2Vec2 GetAnchorA() const override;\n\tb2Vec2 GetAnchorB() const override;\n\n\t/// Get the reaction force given the inverse time step.\n\t/// Unit is N.\n\tb2Vec2 GetReactionForce(float inv_dt) const override;\n\n\t/// Get the reaction torque given the inverse time step.\n\t/// Unit is N*m. This is always zero for a distance joint.\n\tfloat GetReactionTorque(float inv_dt) const override;\n\n\t/// The local anchor point relative to bodyA's origin.\n\tconst b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; }\n\n\t/// The local anchor point relative to bodyB's origin.\n\tconst b2Vec2& GetLocalAnchorB() const  { return m_localAnchorB; }\n\n\t/// Get the rest length\n\tfloat GetLength() const { return m_length; }\n\n\t/// Set the rest length\n\t/// @returns clamped rest length\n\tfloat SetLength(float length);\n\n\t/// Get the minimum length\n\tfloat GetMinLength() const { return m_minLength; }\n\n\t/// Set the minimum length\n\t/// @returns the clamped minimum length\n\tfloat SetMinLength(float minLength);\n\n\t/// Get the maximum length\n\tfloat GetMaxLength() const { return m_maxLength; }\n\n\t/// Set the maximum length\n\t/// @returns the clamped maximum length\n\tfloat SetMaxLength(float maxLength);\n\n\t/// Get the current length\n\tfloat GetCurrentLength() const;\n\n\t/// Set/get the linear stiffness in N/m\n\tvoid SetStiffness(float stiffness) { m_stiffness = stiffness; }\n\tfloat GetStiffness() const { return m_stiffness; }\n\n\t/// Set/get linear damping in N*s/m\n\tvoid SetDamping(float damping) { m_damping = damping; }\n\tfloat GetDamping() const { return m_damping; }\n\n\t/// Dump joint to dmLog\n\tvoid Dump() override;\n\n\t///\n\tvoid Draw(b2Draw* draw) const override;\n\nprotected:\n\n\tfriend class b2Joint;\n\tb2DistanceJoint(const b2DistanceJointDef* data);\n\n\tvoid InitVelocityConstraints(const b2SolverData& data) override;\n\tvoid SolveVelocityConstraints(const b2SolverData& data) override;\n\tbool SolvePositionConstraints(const b2SolverData& data) override;\n\n\tfloat m_stiffness;\n\tfloat m_damping;\n\tfloat m_bias;\n\tfloat m_length;\n\tfloat m_minLength;\n\tfloat m_maxLength;\n\n\t// Solver shared\n\tb2Vec2 m_localAnchorA;\n\tb2Vec2 m_localAnchorB;\n\tfloat m_gamma;\n\tfloat m_impulse;\n\tfloat m_lowerImpulse;\n\tfloat m_upperImpulse;\n\n\t// Solver temp\n\tint32 m_indexA;\n\tint32 m_indexB;\n\tb2Vec2 m_u;\n\tb2Vec2 m_rA;\n\tb2Vec2 m_rB;\n\tb2Vec2 m_localCenterA;\n\tb2Vec2 m_localCenterB;\n\tfloat m_currentLength;\n\tfloat m_invMassA;\n\tfloat m_invMassB;\n\tfloat m_invIA;\n\tfloat m_invIB;\n\tfloat m_softMass;\n\tfloat m_mass;\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_draw.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_DRAW_H\n#define B2_DRAW_H\n\n#include \"b2_api.h\"\n#include \"b2_math.h\"\n\n/// Color for debug drawing. Each value has the range [0,1].\nstruct B2_API b2Color\n{\n\tb2Color() {}\n\tb2Color(float rIn, float gIn, float bIn, float aIn = 1.0f)\n\t{\n\t\tr = rIn; g = gIn; b = bIn; a = aIn;\n\t}\n\n\tvoid Set(float rIn, float gIn, float bIn, float aIn = 1.0f)\n\t{\n\t\tr = rIn; g = gIn; b = bIn; a = aIn;\n\t}\n\n\tfloat r, g, b, a;\n};\n\n/// Implement and register this class with a b2World to provide debug drawing of physics\n/// entities in your game.\nclass B2_API b2Draw\n{\npublic:\n\tb2Draw();\n\n\tvirtual ~b2Draw() {}\n\n\tenum\n\t{\n\t\te_shapeBit\t\t\t\t= 0x0001,\t///< draw shapes\n\t\te_jointBit\t\t\t\t= 0x0002,\t///< draw joint connections\n\t\te_aabbBit\t\t\t\t= 0x0004,\t///< draw axis aligned bounding boxes\n\t\te_pairBit\t\t\t\t= 0x0008,\t///< draw broad-phase pairs\n\t\te_centerOfMassBit\t\t= 0x0010\t///< draw center of mass frame\n\t};\n\n\t/// Set the drawing flags.\n\tvoid SetFlags(uint32 flags);\n\n\t/// Get the drawing flags.\n\tuint32 GetFlags() const;\n\n\t/// Append flags to the current flags.\n\tvoid AppendFlags(uint32 flags);\n\n\t/// Clear flags from the current flags.\n\tvoid ClearFlags(uint32 flags);\n\n\t/// Draw a closed polygon provided in CCW order.\n\tvirtual void DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) = 0;\n\n\t/// Draw a solid closed polygon provided in CCW order.\n\tvirtual void DrawSolidPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) = 0;\n\n\t/// Draw a circle.\n\tvirtual void DrawCircle(const b2Vec2& center, float radius, const b2Color& color) = 0;\n\n\t/// Draw a solid circle.\n\tvirtual void DrawSolidCircle(const b2Vec2& center, float radius, const b2Vec2& axis, const b2Color& color) = 0;\n\n\t/// Draw a line segment.\n\tvirtual void DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color) = 0;\n\n\t/// Draw a transform. Choose your own length scale.\n\t/// @param xf a transform.\n\tvirtual void DrawTransform(const b2Transform& xf) = 0;\n\n\t/// Draw a point.\n\tvirtual void DrawPoint(const b2Vec2& p, float size, const b2Color& color) = 0;\n\nprotected:\n\tuint32 m_drawFlags;\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_dynamic_tree.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_DYNAMIC_TREE_H\n#define B2_DYNAMIC_TREE_H\n\n#include \"b2_api.h\"\n#include \"b2_collision.h\"\n#include \"b2_growable_stack.h\"\n\n#define b2_nullNode (-1)\n\n/// A node in the dynamic tree. The client does not interact with this directly.\nstruct B2_API b2TreeNode\n{\n\tbool IsLeaf() const\n\t{\n\t\treturn child1 == b2_nullNode;\n\t}\n\n\t/// Enlarged AABB\n\tb2AABB aabb;\n\n\tvoid* userData;\n\n\tunion\n\t{\n\t\tint32 parent;\n\t\tint32 next;\n\t};\n\n\tint32 child1;\n\tint32 child2;\n\n\t// leaf = 0, free node = -1\n\tint32 height;\n\n\tbool moved;\n};\n\n/// A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt.\n/// A dynamic tree arranges data in a binary tree to accelerate\n/// queries such as volume queries and ray casts. Leafs are proxies\n/// with an AABB. In the tree we expand the proxy AABB by b2_fatAABBFactor\n/// so that the proxy AABB is bigger than the client object. This allows the client\n/// object to move by small amounts without triggering a tree update.\n///\n/// Nodes are pooled and relocatable, so we use node indices rather than pointers.\nclass B2_API b2DynamicTree\n{\npublic:\n\t/// Constructing the tree initializes the node pool.\n\tb2DynamicTree();\n\n\t/// Destroy the tree, freeing the node pool.\n\t~b2DynamicTree();\n\n\t/// Create a proxy. Provide a tight fitting AABB and a userData pointer.\n\tint32 CreateProxy(const b2AABB& aabb, void* userData);\n\n\t/// Destroy a proxy. This asserts if the id is invalid.\n\tvoid DestroyProxy(int32 proxyId);\n\n\t/// Move a proxy with a swepted AABB. If the proxy has moved outside of its fattened AABB,\n\t/// then the proxy is removed from the tree and re-inserted. Otherwise\n\t/// the function returns immediately.\n\t/// @return true if the proxy was re-inserted.\n\tbool MoveProxy(int32 proxyId, const b2AABB& aabb1, const b2Vec2& displacement);\n\n\t/// Get proxy user data.\n\t/// @return the proxy user data or 0 if the id is invalid.\n\tvoid* GetUserData(int32 proxyId) const;\n\n\tbool WasMoved(int32 proxyId) const;\n\tvoid ClearMoved(int32 proxyId);\n\n\t/// Get the fat AABB for a proxy.\n\tconst b2AABB& GetFatAABB(int32 proxyId) const;\n\n\t/// Query an AABB for overlapping proxies. The callback class\n\t/// is called for each proxy that overlaps the supplied AABB.\n\ttemplate <typename T>\n\tvoid Query(T* callback, const b2AABB& aabb) const;\n\n\t/// Ray-cast against the proxies in the tree. This relies on the callback\n\t/// to perform a exact ray-cast in the case were the proxy contains a shape.\n\t/// The callback also performs the any collision filtering. This has performance\n\t/// roughly equal to k * log(n), where k is the number of collisions and n is the\n\t/// number of proxies in the tree.\n\t/// @param input the ray-cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1).\n\t/// @param callback a callback class that is called for each proxy that is hit by the ray.\n\ttemplate <typename T>\n\tvoid RayCast(T* callback, const b2RayCastInput& input) const;\n\n\t/// Validate this tree. For testing.\n\tvoid Validate() const;\n\n\t/// Compute the height of the binary tree in O(N) time. Should not be\n\t/// called often.\n\tint32 GetHeight() const;\n\n\t/// Get the maximum balance of an node in the tree. The balance is the difference\n\t/// in height of the two children of a node.\n\tint32 GetMaxBalance() const;\n\n\t/// Get the ratio of the sum of the node areas to the root area.\n\tfloat GetAreaRatio() const;\n\n\t/// Build an optimal tree. Very expensive. For testing.\n\tvoid RebuildBottomUp();\n\n\t/// Shift the world origin. Useful for large worlds.\n\t/// The shift formula is: position -= newOrigin\n\t/// @param newOrigin the new origin with respect to the old origin\n\tvoid ShiftOrigin(const b2Vec2& newOrigin);\n\nprivate:\n\n\tint32 AllocateNode();\n\tvoid FreeNode(int32 node);\n\n\tvoid InsertLeaf(int32 node);\n\tvoid RemoveLeaf(int32 node);\n\n\tint32 Balance(int32 index);\n\n\tint32 ComputeHeight() const;\n\tint32 ComputeHeight(int32 nodeId) const;\n\n\tvoid ValidateStructure(int32 index) const;\n\tvoid ValidateMetrics(int32 index) const;\n\n\tint32 m_root;\n\n\tb2TreeNode* m_nodes;\n\tint32 m_nodeCount;\n\tint32 m_nodeCapacity;\n\n\tint32 m_freeList;\n\n\tint32 m_insertionCount;\n};\n\ninline void* b2DynamicTree::GetUserData(int32 proxyId) const\n{\n\tb2Assert(0 <= proxyId && proxyId < m_nodeCapacity);\n\treturn m_nodes[proxyId].userData;\n}\n\ninline bool b2DynamicTree::WasMoved(int32 proxyId) const\n{\n\tb2Assert(0 <= proxyId && proxyId < m_nodeCapacity);\n\treturn m_nodes[proxyId].moved;\n}\n\ninline void b2DynamicTree::ClearMoved(int32 proxyId)\n{\n\tb2Assert(0 <= proxyId && proxyId < m_nodeCapacity);\n\tm_nodes[proxyId].moved = false;\n}\n\ninline const b2AABB& b2DynamicTree::GetFatAABB(int32 proxyId) const\n{\n\tb2Assert(0 <= proxyId && proxyId < m_nodeCapacity);\n\treturn m_nodes[proxyId].aabb;\n}\n\ntemplate <typename T>\ninline void b2DynamicTree::Query(T* callback, const b2AABB& aabb) const\n{\n\tb2GrowableStack<int32, 256> stack;\n\tstack.Push(m_root);\n\n\twhile (stack.GetCount() > 0)\n\t{\n\t\tint32 nodeId = stack.Pop();\n\t\tif (nodeId == b2_nullNode)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst b2TreeNode* node = m_nodes + nodeId;\n\n\t\tif (b2TestOverlap(node->aabb, aabb))\n\t\t{\n\t\t\tif (node->IsLeaf())\n\t\t\t{\n\t\t\t\tbool proceed = callback->QueryCallback(nodeId);\n\t\t\t\tif (proceed == false)\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstack.Push(node->child1);\n\t\t\t\tstack.Push(node->child2);\n\t\t\t}\n\t\t}\n\t}\n}\n\ntemplate <typename T>\ninline void b2DynamicTree::RayCast(T* callback, const b2RayCastInput& input) const\n{\n\tb2Vec2 p1 = input.p1;\n\tb2Vec2 p2 = input.p2;\n\tb2Vec2 r = p2 - p1;\n\tb2Assert(r.LengthSquared() > 0.0f);\n\tr.Normalize();\n\n\t// v is perpendicular to the segment.\n\tb2Vec2 v = b2Cross(1.0f, r);\n\tb2Vec2 abs_v = b2Abs(v);\n\n\t// Separating axis for segment (Gino, p80).\n\t// |dot(v, p1 - c)| > dot(|v|, h)\n\n\tfloat maxFraction = input.maxFraction;\n\n\t// Build a bounding box for the segment.\n\tb2AABB segmentAABB;\n\t{\n\t\tb2Vec2 t = p1 + maxFraction * (p2 - p1);\n\t\tsegmentAABB.lowerBound = b2Min(p1, t);\n\t\tsegmentAABB.upperBound = b2Max(p1, t);\n\t}\n\n\tb2GrowableStack<int32, 256> stack;\n\tstack.Push(m_root);\n\n\twhile (stack.GetCount() > 0)\n\t{\n\t\tint32 nodeId = stack.Pop();\n\t\tif (nodeId == b2_nullNode)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst b2TreeNode* node = m_nodes + nodeId;\n\n\t\tif (b2TestOverlap(node->aabb, segmentAABB) == false)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Separating axis for segment (Gino, p80).\n\t\t// |dot(v, p1 - c)| > dot(|v|, h)\n\t\tb2Vec2 c = node->aabb.GetCenter();\n\t\tb2Vec2 h = node->aabb.GetExtents();\n\t\tfloat separation = b2Abs(b2Dot(v, p1 - c)) - b2Dot(abs_v, h);\n\t\tif (separation > 0.0f)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (node->IsLeaf())\n\t\t{\n\t\t\tb2RayCastInput subInput;\n\t\t\tsubInput.p1 = input.p1;\n\t\t\tsubInput.p2 = input.p2;\n\t\t\tsubInput.maxFraction = maxFraction;\n\n\t\t\tfloat value = callback->RayCastCallback(subInput, nodeId);\n\n\t\t\tif (value == 0.0f)\n\t\t\t{\n\t\t\t\t// The client has terminated the ray cast.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (value > 0.0f)\n\t\t\t{\n\t\t\t\t// Update segment bounding box.\n\t\t\t\tmaxFraction = value;\n\t\t\t\tb2Vec2 t = p1 + maxFraction * (p2 - p1);\n\t\t\t\tsegmentAABB.lowerBound = b2Min(p1, t);\n\t\t\t\tsegmentAABB.upperBound = b2Max(p1, t);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstack.Push(node->child1);\n\t\t\tstack.Push(node->child2);\n\t\t}\n\t}\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_edge_shape.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_EDGE_SHAPE_H\n#define B2_EDGE_SHAPE_H\n\n#include \"b2_api.h\"\n#include \"b2_shape.h\"\n\n/// A line segment (edge) shape. These can be connected in chains or loops\n/// to other edge shapes. Edges created independently are two-sided and do\n/// no provide smooth movement across junctions.\nclass B2_API b2EdgeShape : public b2Shape\n{\npublic:\n\tb2EdgeShape();\n\n\t/// Set this as a part of a sequence. Vertex v0 precedes the edge and vertex v3\n\t/// follows. These extra vertices are used to provide smooth movement\n\t/// across junctions. This also makes the collision one-sided. The edge\n\t/// normal points to the right looking from v1 to v2.\n\tvoid SetOneSided(const b2Vec2& v0, const b2Vec2& v1,const b2Vec2& v2, const b2Vec2& v3);\n\n\t/// Set this as an isolated edge. Collision is two-sided.\n\tvoid SetTwoSided(const b2Vec2& v1, const b2Vec2& v2);\n\n\t/// Implement b2Shape.\n\tb2Shape* Clone(b2BlockAllocator* allocator) const override;\n\n\t/// @see b2Shape::GetChildCount\n\tint32 GetChildCount() const override;\n\n\t/// @see b2Shape::TestPoint\n\tbool TestPoint(const b2Transform& transform, const b2Vec2& p) const override;\n\n\t/// Implement b2Shape.\n\tbool RayCast(b2RayCastOutput* output, const b2RayCastInput& input,\n\t\t\t\tconst b2Transform& transform, int32 childIndex) const override;\n\n\t/// @see b2Shape::ComputeAABB\n\tvoid ComputeAABB(b2AABB* aabb, const b2Transform& transform, int32 childIndex) const override;\n\n\t/// @see b2Shape::ComputeMass\n\tvoid ComputeMass(b2MassData* massData, float density) const override;\n\n\t/// These are the edge vertices\n\tb2Vec2 m_vertex1, m_vertex2;\n\n\t/// Optional adjacent vertices. These are used for smooth collision.\n\tb2Vec2 m_vertex0, m_vertex3;\n\n\t/// Uses m_vertex0 and m_vertex3 to create smooth collision.\n\tbool m_oneSided;\n};\n\ninline b2EdgeShape::b2EdgeShape()\n{\n\tm_type = e_edge;\n\tm_radius = b2_polygonRadius;\n\tm_vertex0.x = 0.0f;\n\tm_vertex0.y = 0.0f;\n\tm_vertex3.x = 0.0f;\n\tm_vertex3.y = 0.0f;\n\tm_oneSided = false;\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_fixture.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_FIXTURE_H\n#define B2_FIXTURE_H\n\n#include \"b2_api.h\"\n#include \"b2_body.h\"\n#include \"b2_collision.h\"\n#include \"b2_shape.h\"\n\nclass b2BlockAllocator;\nclass b2Body;\nclass b2BroadPhase;\nclass b2Fixture;\n\n/// This holds contact filtering data.\nstruct B2_API b2Filter\n{\n\tb2Filter()\n\t{\n\t\tcategoryBits = 0x0001;\n\t\tmaskBits = 0xFFFF;\n\t\tgroupIndex = 0;\n\t}\n\n\t/// The collision category bits. Normally you would just set one bit.\n\tuint16 categoryBits;\n\n\t/// The collision mask bits. This states the categories that this\n\t/// shape would accept for collision.\n\tuint16 maskBits;\n\n\t/// Collision groups allow a certain group of objects to never collide (negative)\n\t/// or always collide (positive). Zero means no collision group. Non-zero group\n\t/// filtering always wins against the mask bits.\n\tint16 groupIndex;\n};\n\n/// A fixture definition is used to create a fixture. This class defines an\n/// abstract fixture definition. You can reuse fixture definitions safely.\nstruct B2_API b2FixtureDef\n{\n\t/// The constructor sets the default fixture definition values.\n\tb2FixtureDef()\n\t{\n\t\tshape = nullptr;\n\t\tfriction = 0.2f;\n\t\trestitution = 0.0f;\n\t\trestitutionThreshold = 1.0f * b2_lengthUnitsPerMeter;\n\t\tdensity = 0.0f;\n\t\tisSensor = false;\n\t}\n\n\t/// The shape, this must be set. The shape will be cloned, so you\n\t/// can create the shape on the stack.\n\tconst b2Shape* shape;\n\n\t/// Use this to store application specific fixture data.\n\tb2FixtureUserData userData;\n\n\t/// The friction coefficient, usually in the range [0,1].\n\tfloat friction;\n\n\t/// The restitution (elasticity) usually in the range [0,1].\n\tfloat restitution;\n\n\t/// Restitution velocity threshold, usually in m/s. Collisions above this\n\t/// speed have restitution applied (will bounce).\n\tfloat restitutionThreshold;\n\n\t/// The density, usually in kg/m^2.\n\tfloat density;\n\n\t/// A sensor shape collects contact information but never generates a collision\n\t/// response.\n\tbool isSensor;\n\n\t/// Contact filtering data.\n\tb2Filter filter;\n};\n\n/// This proxy is used internally to connect fixtures to the broad-phase.\nstruct B2_API b2FixtureProxy\n{\n\tb2AABB aabb;\n\tb2Fixture* fixture;\n\tint32 childIndex;\n\tint32 proxyId;\n};\n\n/// A fixture is used to attach a shape to a body for collision detection. A fixture\n/// inherits its transform from its parent. Fixtures hold additional non-geometric data\n/// such as friction, collision filters, etc.\n/// Fixtures are created via b2Body::CreateFixture.\n/// @warning you cannot reuse fixtures.\nclass B2_API b2Fixture\n{\npublic:\n\t/// Get the type of the child shape. You can use this to down cast to the concrete shape.\n\t/// @return the shape type.\n\tb2Shape::Type GetType() const;\n\n\t/// Get the child shape. You can modify the child shape, however you should not change the\n\t/// number of vertices because this will crash some collision caching mechanisms.\n\t/// Manipulating the shape may lead to non-physical behavior.\n\tb2Shape* GetShape();\n\tconst b2Shape* GetShape() const;\n\n\t/// Set if this fixture is a sensor.\n\tvoid SetSensor(bool sensor);\n\n\t/// Is this fixture a sensor (non-solid)?\n\t/// @return the true if the shape is a sensor.\n\tbool IsSensor() const;\n\n\t/// Set the contact filtering data. This will not update contacts until the next time\n\t/// step when either parent body is active and awake.\n\t/// This automatically calls Refilter.\n\tvoid SetFilterData(const b2Filter& filter);\n\n\t/// Get the contact filtering data.\n\tconst b2Filter& GetFilterData() const;\n\n\t/// Call this if you want to establish collision that was previously disabled by b2ContactFilter::ShouldCollide.\n\tvoid Refilter();\n\n\t/// Get the parent body of this fixture. This is nullptr if the fixture is not attached.\n\t/// @return the parent body.\n\tb2Body* GetBody();\n\tconst b2Body* GetBody() const;\n\n\t/// Get the next fixture in the parent body's fixture list.\n\t/// @return the next shape.\n\tb2Fixture* GetNext();\n\tconst b2Fixture* GetNext() const;\n\n\t/// Get the user data that was assigned in the fixture definition. Use this to\n\t/// store your application specific data.\n\tb2FixtureUserData& GetUserData();\n\n\t/// Test a point for containment in this fixture.\n\t/// @param p a point in world coordinates.\n\tbool TestPoint(const b2Vec2& p) const;\n\n\t/// Cast a ray against this shape.\n\t/// @param output the ray-cast results.\n\t/// @param input the ray-cast input parameters.\n\t/// @param childIndex the child shape index (e.g. edge index)\n\tbool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, int32 childIndex) const;\n\n\t/// Get the mass data for this fixture. The mass data is based on the density and\n\t/// the shape. The rotational inertia is about the shape's origin. This operation\n\t/// may be expensive.\n\tvoid GetMassData(b2MassData* massData) const;\n\n\t/// Set the density of this fixture. This will _not_ automatically adjust the mass\n\t/// of the body. You must call b2Body::ResetMassData to update the body's mass.\n\tvoid SetDensity(float density);\n\n\t/// Get the density of this fixture.\n\tfloat GetDensity() const;\n\n\t/// Get the coefficient of friction.\n\tfloat GetFriction() const;\n\n\t/// Set the coefficient of friction. This will _not_ change the friction of\n\t/// existing contacts.\n\tvoid SetFriction(float friction);\n\n\t/// Get the coefficient of restitution.\n\tfloat GetRestitution() const;\n\n\t/// Set the coefficient of restitution. This will _not_ change the restitution of\n\t/// existing contacts.\n\tvoid SetRestitution(float restitution);\n\n\t/// Get the restitution velocity threshold.\n\tfloat GetRestitutionThreshold() const;\n\n\t/// Set the restitution threshold. This will _not_ change the restitution threshold of\n\t/// existing contacts.\n\tvoid SetRestitutionThreshold(float threshold);\n\n\t/// Get the fixture's AABB. This AABB may be enlarge and/or stale.\n\t/// If you need a more accurate AABB, compute it using the shape and\n\t/// the body transform.\n\tconst b2AABB& GetAABB(int32 childIndex) const;\n\n\t/// Dump this fixture to the log file.\n\tvoid Dump(int32 bodyIndex);\n\nprotected:\n\n\tfriend class b2Body;\n\tfriend class b2World;\n\tfriend class b2Contact;\n\tfriend class b2ContactManager;\n\n\tb2Fixture();\n\n\t// We need separation create/destroy functions from the constructor/destructor because\n\t// the destructor cannot access the allocator (no destructor arguments allowed by C++).\n\tvoid Create(b2BlockAllocator* allocator, b2Body* body, const b2FixtureDef* def);\n\tvoid Destroy(b2BlockAllocator* allocator);\n\n\t// These support body activation/deactivation.\n\tvoid CreateProxies(b2BroadPhase* broadPhase, const b2Transform& xf);\n\tvoid DestroyProxies(b2BroadPhase* broadPhase);\n\n\tvoid Synchronize(b2BroadPhase* broadPhase, const b2Transform& xf1, const b2Transform& xf2);\n\n\tfloat m_density;\n\n\tb2Fixture* m_next;\n\tb2Body* m_body;\n\n\tb2Shape* m_shape;\n\n\tfloat m_friction;\n\tfloat m_restitution;\n\tfloat m_restitutionThreshold;\n\n\tb2FixtureProxy* m_proxies;\n\tint32 m_proxyCount;\n\n\tb2Filter m_filter;\n\n\tbool m_isSensor;\n\n\tb2FixtureUserData m_userData;\n};\n\ninline b2Shape::Type b2Fixture::GetType() const\n{\n\treturn m_shape->GetType();\n}\n\ninline b2Shape* b2Fixture::GetShape()\n{\n\treturn m_shape;\n}\n\ninline const b2Shape* b2Fixture::GetShape() const\n{\n\treturn m_shape;\n}\n\ninline bool b2Fixture::IsSensor() const\n{\n\treturn m_isSensor;\n}\n\ninline const b2Filter& b2Fixture::GetFilterData() const\n{\n\treturn m_filter;\n}\n\ninline b2FixtureUserData& b2Fixture::GetUserData()\n{\n\treturn m_userData;\n}\n\ninline b2Body* b2Fixture::GetBody()\n{\n\treturn m_body;\n}\n\ninline const b2Body* b2Fixture::GetBody() const\n{\n\treturn m_body;\n}\n\ninline b2Fixture* b2Fixture::GetNext()\n{\n\treturn m_next;\n}\n\ninline const b2Fixture* b2Fixture::GetNext() const\n{\n\treturn m_next;\n}\n\ninline void b2Fixture::SetDensity(float density)\n{\n\tb2Assert(b2IsValid(density) && density >= 0.0f);\n\tm_density = density;\n}\n\ninline float b2Fixture::GetDensity() const\n{\n\treturn m_density;\n}\n\ninline float b2Fixture::GetFriction() const\n{\n\treturn m_friction;\n}\n\ninline void b2Fixture::SetFriction(float friction)\n{\n\tm_friction = friction;\n}\n\ninline float b2Fixture::GetRestitution() const\n{\n\treturn m_restitution;\n}\n\ninline void b2Fixture::SetRestitution(float restitution)\n{\n\tm_restitution = restitution;\n}\n\ninline float b2Fixture::GetRestitutionThreshold() const\n{\n\treturn m_restitutionThreshold;\n}\n\ninline void b2Fixture::SetRestitutionThreshold(float threshold)\n{\n\tm_restitutionThreshold = threshold;\n}\n\ninline bool b2Fixture::TestPoint(const b2Vec2& p) const\n{\n\treturn m_shape->TestPoint(m_body->GetTransform(), p);\n}\n\ninline bool b2Fixture::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, int32 childIndex) const\n{\n\treturn m_shape->RayCast(output, input, m_body->GetTransform(), childIndex);\n}\n\ninline void b2Fixture::GetMassData(b2MassData* massData) const\n{\n\tm_shape->ComputeMass(massData, m_density);\n}\n\ninline const b2AABB& b2Fixture::GetAABB(int32 childIndex) const\n{\n\tb2Assert(0 <= childIndex && childIndex < m_proxyCount);\n\treturn m_proxies[childIndex].aabb;\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_friction_joint.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_FRICTION_JOINT_H\n#define B2_FRICTION_JOINT_H\n\n#include \"b2_api.h\"\n#include \"b2_joint.h\"\n\n/// Friction joint definition.\nstruct B2_API b2FrictionJointDef : public b2JointDef\n{\n\tb2FrictionJointDef()\n\t{\n\t\ttype = e_frictionJoint;\n\t\tlocalAnchorA.SetZero();\n\t\tlocalAnchorB.SetZero();\n\t\tmaxForce = 0.0f;\n\t\tmaxTorque = 0.0f;\n\t}\n\n\t/// Initialize the bodies, anchors, axis, and reference angle using the world\n\t/// anchor and world axis.\n\tvoid Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor);\n\n\t/// The local anchor point relative to bodyA's origin.\n\tb2Vec2 localAnchorA;\n\n\t/// The local anchor point relative to bodyB's origin.\n\tb2Vec2 localAnchorB;\n\n\t/// The maximum friction force in N.\n\tfloat maxForce;\n\n\t/// The maximum friction torque in N-m.\n\tfloat maxTorque;\n};\n\n/// Friction joint. This is used for top-down friction.\n/// It provides 2D translational friction and angular friction.\nclass B2_API b2FrictionJoint : public b2Joint\n{\npublic:\n\tb2Vec2 GetAnchorA() const override;\n\tb2Vec2 GetAnchorB() const override;\n\n\tb2Vec2 GetReactionForce(float inv_dt) const override;\n\tfloat GetReactionTorque(float inv_dt) const override;\n\n\t/// The local anchor point relative to bodyA's origin.\n\tconst b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; }\n\n\t/// The local anchor point relative to bodyB's origin.\n\tconst b2Vec2& GetLocalAnchorB() const  { return m_localAnchorB; }\n\n\t/// Set the maximum friction force in N.\n\tvoid SetMaxForce(float force);\n\n\t/// Get the maximum friction force in N.\n\tfloat GetMaxForce() const;\n\n\t/// Set the maximum friction torque in N*m.\n\tvoid SetMaxTorque(float torque);\n\n\t/// Get the maximum friction torque in N*m.\n\tfloat GetMaxTorque() const;\n\n\t/// Dump joint to dmLog\n\tvoid Dump() override;\n\nprotected:\n\n\tfriend class b2Joint;\n\n\tb2FrictionJoint(const b2FrictionJointDef* def);\n\n\tvoid InitVelocityConstraints(const b2SolverData& data) override;\n\tvoid SolveVelocityConstraints(const b2SolverData& data) override;\n\tbool SolvePositionConstraints(const b2SolverData& data) override;\n\n\tb2Vec2 m_localAnchorA;\n\tb2Vec2 m_localAnchorB;\n\n\t// Solver shared\n\tb2Vec2 m_linearImpulse;\n\tfloat m_angularImpulse;\n\tfloat m_maxForce;\n\tfloat m_maxTorque;\n\n\t// Solver temp\n\tint32 m_indexA;\n\tint32 m_indexB;\n\tb2Vec2 m_rA;\n\tb2Vec2 m_rB;\n\tb2Vec2 m_localCenterA;\n\tb2Vec2 m_localCenterB;\n\tfloat m_invMassA;\n\tfloat m_invMassB;\n\tfloat m_invIA;\n\tfloat m_invIB;\n\tb2Mat22 m_linearMass;\n\tfloat m_angularMass;\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_gear_joint.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_GEAR_JOINT_H\n#define B2_GEAR_JOINT_H\n\n#include \"b2_joint.h\"\n\n/// Gear joint definition. This definition requires two existing\n/// revolute or prismatic joints (any combination will work).\n/// @warning bodyB on the input joints must both be dynamic\nstruct B2_API b2GearJointDef : public b2JointDef\n{\n\tb2GearJointDef()\n\t{\n\t\ttype = e_gearJoint;\n\t\tjoint1 = nullptr;\n\t\tjoint2 = nullptr;\n\t\tratio = 1.0f;\n\t}\n\n\t/// The first revolute/prismatic joint attached to the gear joint.\n\tb2Joint* joint1;\n\n\t/// The second revolute/prismatic joint attached to the gear joint.\n\tb2Joint* joint2;\n\n\t/// The gear ratio.\n\t/// @see b2GearJoint for explanation.\n\tfloat ratio;\n};\n\n/// A gear joint is used to connect two joints together. Either joint\n/// can be a revolute or prismatic joint. You specify a gear ratio\n/// to bind the motions together:\n/// coordinate1 + ratio * coordinate2 = constant\n/// The ratio can be negative or positive. If one joint is a revolute joint\n/// and the other joint is a prismatic joint, then the ratio will have units\n/// of length or units of 1/length.\n/// @warning You have to manually destroy the gear joint if joint1 or joint2\n/// is destroyed.\nclass B2_API b2GearJoint : public b2Joint\n{\npublic:\n\tb2Vec2 GetAnchorA() const override;\n\tb2Vec2 GetAnchorB() const override;\n\n\tb2Vec2 GetReactionForce(float inv_dt) const override;\n\tfloat GetReactionTorque(float inv_dt) const override;\n\n\t/// Get the first joint.\n\tb2Joint* GetJoint1() { return m_joint1; }\n\n\t/// Get the second joint.\n\tb2Joint* GetJoint2() { return m_joint2; }\n\n\t/// Set/Get the gear ratio.\n\tvoid SetRatio(float ratio);\n\tfloat GetRatio() const;\n\n\t/// Dump joint to dmLog\n\tvoid Dump() override;\n\nprotected:\n\n\tfriend class b2Joint;\n\tb2GearJoint(const b2GearJointDef* data);\n\n\tvoid InitVelocityConstraints(const b2SolverData& data) override;\n\tvoid SolveVelocityConstraints(const b2SolverData& data) override;\n\tbool SolvePositionConstraints(const b2SolverData& data) override;\n\n\tb2Joint* m_joint1;\n\tb2Joint* m_joint2;\n\n\tb2JointType m_typeA;\n\tb2JointType m_typeB;\n\n\t// Body A is connected to body C\n\t// Body B is connected to body D\n\tb2Body* m_bodyC;\n\tb2Body* m_bodyD;\n\n\t// Solver shared\n\tb2Vec2 m_localAnchorA;\n\tb2Vec2 m_localAnchorB;\n\tb2Vec2 m_localAnchorC;\n\tb2Vec2 m_localAnchorD;\n\n\tb2Vec2 m_localAxisC;\n\tb2Vec2 m_localAxisD;\n\n\tfloat m_referenceAngleA;\n\tfloat m_referenceAngleB;\n\n\tfloat m_constant;\n\tfloat m_ratio;\n\n\tfloat m_impulse;\n\n\t// Solver temp\n\tint32 m_indexA, m_indexB, m_indexC, m_indexD;\n\tb2Vec2 m_lcA, m_lcB, m_lcC, m_lcD;\n\tfloat m_mA, m_mB, m_mC, m_mD;\n\tfloat m_iA, m_iB, m_iC, m_iD;\n\tb2Vec2 m_JvAC, m_JvBD;\n\tfloat m_JwA, m_JwB, m_JwC, m_JwD;\n\tfloat m_mass;\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_growable_stack.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_GROWABLE_STACK_H\n#define B2_GROWABLE_STACK_H\n\n#include <string.h>\n\n#include \"b2_settings.h\"\n\n/// This is a growable LIFO stack with an initial capacity of N.\n/// If the stack size exceeds the initial capacity, the heap is used\n/// to increase the size of the stack.\ntemplate <typename T, int32 N>\nclass b2GrowableStack\n{\npublic:\n\tb2GrowableStack()\n\t{\n\t\tm_stack = m_array;\n\t\tm_count = 0;\n\t\tm_capacity = N;\n\t}\n\n\t~b2GrowableStack()\n\t{\n\t\tif (m_stack != m_array)\n\t\t{\n\t\t\tb2Free(m_stack);\n\t\t\tm_stack = nullptr;\n\t\t}\n\t}\n\n\tvoid Push(const T& element)\n\t{\n\t\tif (m_count == m_capacity)\n\t\t{\n\t\t\tT* old = m_stack;\n\t\t\tm_capacity *= 2;\n\t\t\tm_stack = (T*)b2Alloc(m_capacity * sizeof(T));\n\t\t\tmemcpy(m_stack, old, m_count * sizeof(T));\n\t\t\tif (old != m_array)\n\t\t\t{\n\t\t\t\tb2Free(old);\n\t\t\t}\n\t\t}\n\n\t\tm_stack[m_count] = element;\n\t\t++m_count;\n\t}\n\n\tT Pop()\n\t{\n\t\tb2Assert(m_count > 0);\n\t\t--m_count;\n\t\treturn m_stack[m_count];\n\t}\n\n\tint32 GetCount()\n\t{\n\t\treturn m_count;\n\t}\n\nprivate:\n\tT* m_stack;\n\tT m_array[N];\n\tint32 m_count;\n\tint32 m_capacity;\n};\n\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_joint.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_JOINT_H\n#define B2_JOINT_H\n\n#include \"b2_api.h\"\n#include \"b2_math.h\"\n\nclass b2Body;\nclass b2Draw;\nclass b2Joint;\nstruct b2SolverData;\nclass b2BlockAllocator;\n\nenum b2JointType\n{\n\te_unknownJoint,\n\te_revoluteJoint,\n\te_prismaticJoint,\n\te_distanceJoint,\n\te_pulleyJoint,\n\te_mouseJoint,\n\te_gearJoint,\n\te_wheelJoint,\n    e_weldJoint,\n\te_frictionJoint,\n\te_ropeJoint,\n\te_motorJoint\n};\n\nstruct B2_API b2Jacobian\n{\n\tb2Vec2 linear;\n\tfloat angularA;\n\tfloat angularB;\n};\n\n/// A joint edge is used to connect bodies and joints together\n/// in a joint graph where each body is a node and each joint\n/// is an edge. A joint edge belongs to a doubly linked list\n/// maintained in each attached body. Each joint has two joint\n/// nodes, one for each attached body.\nstruct B2_API b2JointEdge\n{\n\tb2Body* other;\t\t\t///< provides quick access to the other body attached.\n\tb2Joint* joint;\t\t\t///< the joint\n\tb2JointEdge* prev;\t\t///< the previous joint edge in the body's joint list\n\tb2JointEdge* next;\t\t///< the next joint edge in the body's joint list\n};\n\n/// Joint definitions are used to construct joints.\nstruct B2_API b2JointDef\n{\n\tb2JointDef()\n\t{\n\t\ttype = e_unknownJoint;\n\t\tbodyA = nullptr;\n\t\tbodyB = nullptr;\n\t\tcollideConnected = false;\n\t}\n\n\t/// The joint type is set automatically for concrete joint types.\n\tb2JointType type;\n\n\t/// Use this to attach application specific data to your joints.\n\tb2JointUserData userData;\n\n\t/// The first attached body.\n\tb2Body* bodyA;\n\n\t/// The second attached body.\n\tb2Body* bodyB;\n\n\t/// Set this flag to true if the attached bodies should collide.\n\tbool collideConnected;\n};\n\n/// Utility to compute linear stiffness values from frequency and damping ratio\nB2_API void b2LinearStiffness(float& stiffness, float& damping,\n\tfloat frequencyHertz, float dampingRatio,\n\tconst b2Body* bodyA, const b2Body* bodyB);\n\n/// Utility to compute rotational stiffness values frequency and damping ratio\nB2_API void b2AngularStiffness(float& stiffness, float& damping,\n\tfloat frequencyHertz, float dampingRatio,\n\tconst b2Body* bodyA, const b2Body* bodyB);\n\n/// The base joint class. Joints are used to constraint two bodies together in\n/// various fashions. Some joints also feature limits and motors.\nclass B2_API b2Joint\n{\npublic:\n\n\t/// Get the type of the concrete joint.\n\tb2JointType GetType() const;\n\n\t/// Get the first body attached to this joint.\n\tb2Body* GetBodyA();\n\n\t/// Get the second body attached to this joint.\n\tb2Body* GetBodyB();\n\n\t/// Get the anchor point on bodyA in world coordinates.\n\tvirtual b2Vec2 GetAnchorA() const = 0;\n\n\t/// Get the anchor point on bodyB in world coordinates.\n\tvirtual b2Vec2 GetAnchorB() const = 0;\n\n\t/// Get the reaction force on bodyB at the joint anchor in Newtons.\n\tvirtual b2Vec2 GetReactionForce(float inv_dt) const = 0;\n\n\t/// Get the reaction torque on bodyB in N*m.\n\tvirtual float GetReactionTorque(float inv_dt) const = 0;\n\n\t/// Get the next joint the world joint list.\n\tb2Joint* GetNext();\n\tconst b2Joint* GetNext() const;\n\n\t/// Get the user data pointer.\n\tb2JointUserData& GetUserData();\n\n\t/// Short-cut function to determine if either body is enabled.\n\tbool IsEnabled() const;\n\n\t/// Get collide connected.\n\t/// Note: modifying the collide connect flag won't work correctly because\n\t/// the flag is only checked when fixture AABBs begin to overlap.\n\tbool GetCollideConnected() const;\n\n\t/// Dump this joint to the log file.\n\tvirtual void Dump() { b2Dump(\"// Dump is not supported for this joint type.\\n\"); }\n\n\t/// Shift the origin for any points stored in world coordinates.\n\tvirtual void ShiftOrigin(const b2Vec2& newOrigin) { B2_NOT_USED(newOrigin);  }\n\n\t/// Debug draw this joint\n\tvirtual void Draw(b2Draw* draw) const;\n\nprotected:\n\tfriend class b2World;\n\tfriend class b2Body;\n\tfriend class b2Island;\n\tfriend class b2GearJoint;\n\n\tstatic b2Joint* Create(const b2JointDef* def, b2BlockAllocator* allocator);\n\tstatic void Destroy(b2Joint* joint, b2BlockAllocator* allocator);\n\n\tb2Joint(const b2JointDef* def);\n\tvirtual ~b2Joint() {}\n\n\tvirtual void InitVelocityConstraints(const b2SolverData& data) = 0;\n\tvirtual void SolveVelocityConstraints(const b2SolverData& data) = 0;\n\n\t// This returns true if the position errors are within tolerance.\n\tvirtual bool SolvePositionConstraints(const b2SolverData& data) = 0;\n\n\tb2JointType m_type;\n\tb2Joint* m_prev;\n\tb2Joint* m_next;\n\tb2JointEdge m_edgeA;\n\tb2JointEdge m_edgeB;\n\tb2Body* m_bodyA;\n\tb2Body* m_bodyB;\n\n\tint32 m_index;\n\n\tbool m_islandFlag;\n\tbool m_collideConnected;\n\n\tb2JointUserData m_userData;\n};\n\ninline b2JointType b2Joint::GetType() const\n{\n\treturn m_type;\n}\n\ninline b2Body* b2Joint::GetBodyA()\n{\n\treturn m_bodyA;\n}\n\ninline b2Body* b2Joint::GetBodyB()\n{\n\treturn m_bodyB;\n}\n\ninline b2Joint* b2Joint::GetNext()\n{\n\treturn m_next;\n}\n\ninline const b2Joint* b2Joint::GetNext() const\n{\n\treturn m_next;\n}\n\ninline b2JointUserData& b2Joint::GetUserData()\n{\n\treturn m_userData;\n}\n\ninline bool b2Joint::GetCollideConnected() const\n{\n\treturn m_collideConnected;\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_math.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_MATH_H\n#define B2_MATH_H\n\n#include <math.h>\n#include <cmath>\n\n#include \"b2_api.h\"\n#include \"b2_settings.h\"\n\n/// This function is used to ensure that a floating point number is not a NaN or infinity.\ninline bool b2IsValid(float x)\n{\n\treturn std::isfinite(x);\n}\n\n#define\tb2Sqrt(x)\tsqrtf(x)\n#define\tb2Atan2(y, x)\tatan2f(y, x)\n\n/// A 2D column vector.\nstruct B2_API b2Vec2\n{\n\t/// Default constructor does nothing (for performance).\n\tb2Vec2() {}\n\n\t/// Construct using coordinates.\n\tb2Vec2(float xIn, float yIn) : x(xIn), y(yIn) {}\n\n\t/// Set this vector to all zeros.\n\tvoid SetZero() { x = 0.0f; y = 0.0f; }\n\n\t/// Set this vector to some specified coordinates.\n\tvoid Set(float x_, float y_) { x = x_; y = y_; }\n\n\t/// Negate this vector.\n\tb2Vec2 operator -() const { b2Vec2 v; v.Set(-x, -y); return v; }\n\n\t/// Read from and indexed element.\n\tfloat operator () (int32 i) const\n\t{\n\t\treturn (&x)[i];\n\t}\n\n\t/// Write to an indexed element.\n\tfloat& operator () (int32 i)\n\t{\n\t\treturn (&x)[i];\n\t}\n\n\t/// Add a vector to this vector.\n\tvoid operator += (const b2Vec2& v)\n\t{\n\t\tx += v.x; y += v.y;\n\t}\n\n\t/// Subtract a vector from this vector.\n\tvoid operator -= (const b2Vec2& v)\n\t{\n\t\tx -= v.x; y -= v.y;\n\t}\n\n\t/// Multiply this vector by a scalar.\n\tvoid operator *= (float a)\n\t{\n\t\tx *= a; y *= a;\n\t}\n\n\t/// Get the length of this vector (the norm).\n\tfloat Length() const\n\t{\n\t\treturn b2Sqrt(x * x + y * y);\n\t}\n\n\t/// Get the length squared. For performance, use this instead of\n\t/// b2Vec2::Length (if possible).\n\tfloat LengthSquared() const\n\t{\n\t\treturn x * x + y * y;\n\t}\n\n\t/// Convert this vector into a unit vector. Returns the length.\n\tfloat Normalize()\n\t{\n\t\tfloat length = Length();\n\t\tif (length < b2_epsilon)\n\t\t{\n\t\t\treturn 0.0f;\n\t\t}\n\t\tfloat invLength = 1.0f / length;\n\t\tx *= invLength;\n\t\ty *= invLength;\n\n\t\treturn length;\n\t}\n\n\t/// Does this vector contain finite coordinates?\n\tbool IsValid() const\n\t{\n\t\treturn b2IsValid(x) && b2IsValid(y);\n\t}\n\n\t/// Get the skew vector such that dot(skew_vec, other) == cross(vec, other)\n\tb2Vec2 Skew() const\n\t{\n\t\treturn b2Vec2(-y, x);\n\t}\n\n\tfloat x, y;\n};\n\n/// A 2D column vector with 3 elements.\nstruct B2_API b2Vec3\n{\n\t/// Default constructor does nothing (for performance).\n\tb2Vec3() {}\n\n\t/// Construct using coordinates.\n\tb2Vec3(float xIn, float yIn, float zIn) : x(xIn), y(yIn), z(zIn) {}\n\n\t/// Set this vector to all zeros.\n\tvoid SetZero() { x = 0.0f; y = 0.0f; z = 0.0f; }\n\n\t/// Set this vector to some specified coordinates.\n\tvoid Set(float x_, float y_, float z_) { x = x_; y = y_; z = z_; }\n\n\t/// Negate this vector.\n\tb2Vec3 operator -() const { b2Vec3 v; v.Set(-x, -y, -z); return v; }\n\n\t/// Add a vector to this vector.\n\tvoid operator += (const b2Vec3& v)\n\t{\n\t\tx += v.x; y += v.y; z += v.z;\n\t}\n\n\t/// Subtract a vector from this vector.\n\tvoid operator -= (const b2Vec3& v)\n\t{\n\t\tx -= v.x; y -= v.y; z -= v.z;\n\t}\n\n\t/// Multiply this vector by a scalar.\n\tvoid operator *= (float s)\n\t{\n\t\tx *= s; y *= s; z *= s;\n\t}\n\n\tfloat x, y, z;\n};\n\n/// A 2-by-2 matrix. Stored in column-major order.\nstruct B2_API b2Mat22\n{\n\t/// The default constructor does nothing (for performance).\n\tb2Mat22() {}\n\n\t/// Construct this matrix using columns.\n\tb2Mat22(const b2Vec2& c1, const b2Vec2& c2)\n\t{\n\t\tex = c1;\n\t\tey = c2;\n\t}\n\n\t/// Construct this matrix using scalars.\n\tb2Mat22(float a11, float a12, float a21, float a22)\n\t{\n\t\tex.x = a11; ex.y = a21;\n\t\tey.x = a12; ey.y = a22;\n\t}\n\n\t/// Initialize this matrix using columns.\n\tvoid Set(const b2Vec2& c1, const b2Vec2& c2)\n\t{\n\t\tex = c1;\n\t\tey = c2;\n\t}\n\n\t/// Set this to the identity matrix.\n\tvoid SetIdentity()\n\t{\n\t\tex.x = 1.0f; ey.x = 0.0f;\n\t\tex.y = 0.0f; ey.y = 1.0f;\n\t}\n\n\t/// Set this matrix to all zeros.\n\tvoid SetZero()\n\t{\n\t\tex.x = 0.0f; ey.x = 0.0f;\n\t\tex.y = 0.0f; ey.y = 0.0f;\n\t}\n\n\tb2Mat22 GetInverse() const\n\t{\n\t\tfloat a = ex.x, b = ey.x, c = ex.y, d = ey.y;\n\t\tb2Mat22 B;\n\t\tfloat det = a * d - b * c;\n\t\tif (det != 0.0f)\n\t\t{\n\t\t\tdet = 1.0f / det;\n\t\t}\n\t\tB.ex.x =  det * d;\tB.ey.x = -det * b;\n\t\tB.ex.y = -det * c;\tB.ey.y =  det * a;\n\t\treturn B;\n\t}\n\n\t/// Solve A * x = b, where b is a column vector. This is more efficient\n\t/// than computing the inverse in one-shot cases.\n\tb2Vec2 Solve(const b2Vec2& b) const\n\t{\n\t\tfloat a11 = ex.x, a12 = ey.x, a21 = ex.y, a22 = ey.y;\n\t\tfloat det = a11 * a22 - a12 * a21;\n\t\tif (det != 0.0f)\n\t\t{\n\t\t\tdet = 1.0f / det;\n\t\t}\n\t\tb2Vec2 x;\n\t\tx.x = det * (a22 * b.x - a12 * b.y);\n\t\tx.y = det * (a11 * b.y - a21 * b.x);\n\t\treturn x;\n\t}\n\n\tb2Vec2 ex, ey;\n};\n\n/// A 3-by-3 matrix. Stored in column-major order.\nstruct B2_API b2Mat33\n{\n\t/// The default constructor does nothing (for performance).\n\tb2Mat33() {}\n\n\t/// Construct this matrix using columns.\n\tb2Mat33(const b2Vec3& c1, const b2Vec3& c2, const b2Vec3& c3)\n\t{\n\t\tex = c1;\n\t\tey = c2;\n\t\tez = c3;\n\t}\n\n\t/// Set this matrix to all zeros.\n\tvoid SetZero()\n\t{\n\t\tex.SetZero();\n\t\tey.SetZero();\n\t\tez.SetZero();\n\t}\n\n\t/// Solve A * x = b, where b is a column vector. This is more efficient\n\t/// than computing the inverse in one-shot cases.\n\tb2Vec3 Solve33(const b2Vec3& b) const;\n\n\t/// Solve A * x = b, where b is a column vector. This is more efficient\n\t/// than computing the inverse in one-shot cases. Solve only the upper\n\t/// 2-by-2 matrix equation.\n\tb2Vec2 Solve22(const b2Vec2& b) const;\n\n\t/// Get the inverse of this matrix as a 2-by-2.\n\t/// Returns the zero matrix if singular.\n\tvoid GetInverse22(b2Mat33* M) const;\n\n\t/// Get the symmetric inverse of this matrix as a 3-by-3.\n\t/// Returns the zero matrix if singular.\n\tvoid GetSymInverse33(b2Mat33* M) const;\n\n\tb2Vec3 ex, ey, ez;\n};\n\n/// Rotation\nstruct B2_API b2Rot\n{\n\tb2Rot() {}\n\n\t/// Initialize from an angle in radians\n\texplicit b2Rot(float angle)\n\t{\n\t\t/// TODO_ERIN optimize\n\t\ts = sinf(angle);\n\t\tc = cosf(angle);\n\t}\n\n\t/// Set using an angle in radians.\n\tvoid Set(float angle)\n\t{\n\t\t/// TODO_ERIN optimize\n\t\ts = sinf(angle);\n\t\tc = cosf(angle);\n\t}\n\n\t/// Set to the identity rotation\n\tvoid SetIdentity()\n\t{\n\t\ts = 0.0f;\n\t\tc = 1.0f;\n\t}\n\n\t/// Get the angle in radians\n\tfloat GetAngle() const\n\t{\n\t\treturn b2Atan2(s, c);\n\t}\n\n\t/// Get the x-axis\n\tb2Vec2 GetXAxis() const\n\t{\n\t\treturn b2Vec2(c, s);\n\t}\n\n\t/// Get the u-axis\n\tb2Vec2 GetYAxis() const\n\t{\n\t\treturn b2Vec2(-s, c);\n\t}\n\n\t/// Sine and cosine\n\tfloat s, c;\n};\n\n/// A transform contains translation and rotation. It is used to represent\n/// the position and orientation of rigid frames.\nstruct B2_API b2Transform\n{\n\t/// The default constructor does nothing.\n\tb2Transform() {}\n\n\t/// Initialize using a position vector and a rotation.\n\tb2Transform(const b2Vec2& position, const b2Rot& rotation) : p(position), q(rotation) {}\n\n\t/// Set this to the identity transform.\n\tvoid SetIdentity()\n\t{\n\t\tp.SetZero();\n\t\tq.SetIdentity();\n\t}\n\n\t/// Set this based on the position and angle.\n\tvoid Set(const b2Vec2& position, float angle)\n\t{\n\t\tp = position;\n\t\tq.Set(angle);\n\t}\n\n\tb2Vec2 p;\n\tb2Rot q;\n};\n\n/// This describes the motion of a body/shape for TOI computation.\n/// Shapes are defined with respect to the body origin, which may\n/// no coincide with the center of mass. However, to support dynamics\n/// we must interpolate the center of mass position.\nstruct B2_API b2Sweep\n{\n\t/// Get the interpolated transform at a specific time.\n\t/// @param transform the output transform\n\t/// @param beta is a factor in [0,1], where 0 indicates alpha0.\n\tvoid GetTransform(b2Transform* transform, float beta) const;\n\n\t/// Advance the sweep forward, yielding a new initial state.\n\t/// @param alpha the new initial time.\n\tvoid Advance(float alpha);\n\n\t/// Normalize the angles.\n\tvoid Normalize();\n\n\tb2Vec2 localCenter;\t///< local center of mass position\n\tb2Vec2 c0, c;\t\t///< center world positions\n\tfloat a0, a;\t\t///< world angles\n\n\t/// Fraction of the current time step in the range [0,1]\n\t/// c0 and a0 are the positions at alpha0.\n\tfloat alpha0;\n};\n\n/// Useful constant\nextern B2_API const b2Vec2 b2Vec2_zero;\n\n/// Perform the dot product on two vectors.\ninline float b2Dot(const b2Vec2& a, const b2Vec2& b)\n{\n\treturn a.x * b.x + a.y * b.y;\n}\n\n/// Perform the cross product on two vectors. In 2D this produces a scalar.\ninline float b2Cross(const b2Vec2& a, const b2Vec2& b)\n{\n\treturn a.x * b.y - a.y * b.x;\n}\n\n/// Perform the cross product on a vector and a scalar. In 2D this produces\n/// a vector.\ninline b2Vec2 b2Cross(const b2Vec2& a, float s)\n{\n\treturn b2Vec2(s * a.y, -s * a.x);\n}\n\n/// Perform the cross product on a scalar and a vector. In 2D this produces\n/// a vector.\ninline b2Vec2 b2Cross(float s, const b2Vec2& a)\n{\n\treturn b2Vec2(-s * a.y, s * a.x);\n}\n\n/// Multiply a matrix times a vector. If a rotation matrix is provided,\n/// then this transforms the vector from one frame to another.\ninline b2Vec2 b2Mul(const b2Mat22& A, const b2Vec2& v)\n{\n\treturn b2Vec2(A.ex.x * v.x + A.ey.x * v.y, A.ex.y * v.x + A.ey.y * v.y);\n}\n\n/// Multiply a matrix transpose times a vector. If a rotation matrix is provided,\n/// then this transforms the vector from one frame to another (inverse transform).\ninline b2Vec2 b2MulT(const b2Mat22& A, const b2Vec2& v)\n{\n\treturn b2Vec2(b2Dot(v, A.ex), b2Dot(v, A.ey));\n}\n\n/// Add two vectors component-wise.\ninline b2Vec2 operator + (const b2Vec2& a, const b2Vec2& b)\n{\n\treturn b2Vec2(a.x + b.x, a.y + b.y);\n}\n\n/// Subtract two vectors component-wise.\ninline b2Vec2 operator - (const b2Vec2& a, const b2Vec2& b)\n{\n\treturn b2Vec2(a.x - b.x, a.y - b.y);\n}\n\ninline b2Vec2 operator * (float s, const b2Vec2& a)\n{\n\treturn b2Vec2(s * a.x, s * a.y);\n}\n\ninline bool operator == (const b2Vec2& a, const b2Vec2& b)\n{\n\treturn a.x == b.x && a.y == b.y;\n}\n\ninline bool operator != (const b2Vec2& a, const b2Vec2& b)\n{\n\treturn a.x != b.x || a.y != b.y;\n}\n\ninline float b2Distance(const b2Vec2& a, const b2Vec2& b)\n{\n\tb2Vec2 c = a - b;\n\treturn c.Length();\n}\n\ninline float b2DistanceSquared(const b2Vec2& a, const b2Vec2& b)\n{\n\tb2Vec2 c = a - b;\n\treturn b2Dot(c, c);\n}\n\ninline b2Vec3 operator * (float s, const b2Vec3& a)\n{\n\treturn b2Vec3(s * a.x, s * a.y, s * a.z);\n}\n\n/// Add two vectors component-wise.\ninline b2Vec3 operator + (const b2Vec3& a, const b2Vec3& b)\n{\n\treturn b2Vec3(a.x + b.x, a.y + b.y, a.z + b.z);\n}\n\n/// Subtract two vectors component-wise.\ninline b2Vec3 operator - (const b2Vec3& a, const b2Vec3& b)\n{\n\treturn b2Vec3(a.x - b.x, a.y - b.y, a.z - b.z);\n}\n\n/// Perform the dot product on two vectors.\ninline float b2Dot(const b2Vec3& a, const b2Vec3& b)\n{\n\treturn a.x * b.x + a.y * b.y + a.z * b.z;\n}\n\n/// Perform the cross product on two vectors.\ninline b2Vec3 b2Cross(const b2Vec3& a, const b2Vec3& b)\n{\n\treturn b2Vec3(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);\n}\n\ninline b2Mat22 operator + (const b2Mat22& A, const b2Mat22& B)\n{\n\treturn b2Mat22(A.ex + B.ex, A.ey + B.ey);\n}\n\n// A * B\ninline b2Mat22 b2Mul(const b2Mat22& A, const b2Mat22& B)\n{\n\treturn b2Mat22(b2Mul(A, B.ex), b2Mul(A, B.ey));\n}\n\n// A^T * B\ninline b2Mat22 b2MulT(const b2Mat22& A, const b2Mat22& B)\n{\n\tb2Vec2 c1(b2Dot(A.ex, B.ex), b2Dot(A.ey, B.ex));\n\tb2Vec2 c2(b2Dot(A.ex, B.ey), b2Dot(A.ey, B.ey));\n\treturn b2Mat22(c1, c2);\n}\n\n/// Multiply a matrix times a vector.\ninline b2Vec3 b2Mul(const b2Mat33& A, const b2Vec3& v)\n{\n\treturn v.x * A.ex + v.y * A.ey + v.z * A.ez;\n}\n\n/// Multiply a matrix times a vector.\ninline b2Vec2 b2Mul22(const b2Mat33& A, const b2Vec2& v)\n{\n\treturn b2Vec2(A.ex.x * v.x + A.ey.x * v.y, A.ex.y * v.x + A.ey.y * v.y);\n}\n\n/// Multiply two rotations: q * r\ninline b2Rot b2Mul(const b2Rot& q, const b2Rot& r)\n{\n\t// [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc]\n\t// [qs  qc]   [rs  rc]   [qs*rc+qc*rs -qs*rs+qc*rc]\n\t// s = qs * rc + qc * rs\n\t// c = qc * rc - qs * rs\n\tb2Rot qr;\n\tqr.s = q.s * r.c + q.c * r.s;\n\tqr.c = q.c * r.c - q.s * r.s;\n\treturn qr;\n}\n\n/// Transpose multiply two rotations: qT * r\ninline b2Rot b2MulT(const b2Rot& q, const b2Rot& r)\n{\n\t// [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc]\n\t// [-qs qc]   [rs  rc]   [-qs*rc+qc*rs qs*rs+qc*rc]\n\t// s = qc * rs - qs * rc\n\t// c = qc * rc + qs * rs\n\tb2Rot qr;\n\tqr.s = q.c * r.s - q.s * r.c;\n\tqr.c = q.c * r.c + q.s * r.s;\n\treturn qr;\n}\n\n/// Rotate a vector\ninline b2Vec2 b2Mul(const b2Rot& q, const b2Vec2& v)\n{\n\treturn b2Vec2(q.c * v.x - q.s * v.y, q.s * v.x + q.c * v.y);\n}\n\n/// Inverse rotate a vector\ninline b2Vec2 b2MulT(const b2Rot& q, const b2Vec2& v)\n{\n\treturn b2Vec2(q.c * v.x + q.s * v.y, -q.s * v.x + q.c * v.y);\n}\n\ninline b2Vec2 b2Mul(const b2Transform& T, const b2Vec2& v)\n{\n\tfloat x = (T.q.c * v.x - T.q.s * v.y) + T.p.x;\n\tfloat y = (T.q.s * v.x + T.q.c * v.y) + T.p.y;\n\n\treturn b2Vec2(x, y);\n}\n\ninline b2Vec2 b2MulT(const b2Transform& T, const b2Vec2& v)\n{\n\tfloat px = v.x - T.p.x;\n\tfloat py = v.y - T.p.y;\n\tfloat x = (T.q.c * px + T.q.s * py);\n\tfloat y = (-T.q.s * px + T.q.c * py);\n\n\treturn b2Vec2(x, y);\n}\n\n// v2 = A.q.Rot(B.q.Rot(v1) + B.p) + A.p\n//    = (A.q * B.q).Rot(v1) + A.q.Rot(B.p) + A.p\ninline b2Transform b2Mul(const b2Transform& A, const b2Transform& B)\n{\n\tb2Transform C;\n\tC.q = b2Mul(A.q, B.q);\n\tC.p = b2Mul(A.q, B.p) + A.p;\n\treturn C;\n}\n\n// v2 = A.q' * (B.q * v1 + B.p - A.p)\n//    = A.q' * B.q * v1 + A.q' * (B.p - A.p)\ninline b2Transform b2MulT(const b2Transform& A, const b2Transform& B)\n{\n\tb2Transform C;\n\tC.q = b2MulT(A.q, B.q);\n\tC.p = b2MulT(A.q, B.p - A.p);\n\treturn C;\n}\n\ntemplate <typename T>\ninline T b2Abs(T a)\n{\n\treturn a > T(0) ? a : -a;\n}\n\ninline b2Vec2 b2Abs(const b2Vec2& a)\n{\n\treturn b2Vec2(b2Abs(a.x), b2Abs(a.y));\n}\n\ninline b2Mat22 b2Abs(const b2Mat22& A)\n{\n\treturn b2Mat22(b2Abs(A.ex), b2Abs(A.ey));\n}\n\ntemplate <typename T>\ninline T b2Min(T a, T b)\n{\n\treturn a < b ? a : b;\n}\n\ninline b2Vec2 b2Min(const b2Vec2& a, const b2Vec2& b)\n{\n\treturn b2Vec2(b2Min(a.x, b.x), b2Min(a.y, b.y));\n}\n\ntemplate <typename T>\ninline T b2Max(T a, T b)\n{\n\treturn a > b ? a : b;\n}\n\ninline b2Vec2 b2Max(const b2Vec2& a, const b2Vec2& b)\n{\n\treturn b2Vec2(b2Max(a.x, b.x), b2Max(a.y, b.y));\n}\n\ntemplate <typename T>\ninline T b2Clamp(T a, T low, T high)\n{\n\treturn b2Max(low, b2Min(a, high));\n}\n\ninline b2Vec2 b2Clamp(const b2Vec2& a, const b2Vec2& low, const b2Vec2& high)\n{\n\treturn b2Max(low, b2Min(a, high));\n}\n\ntemplate<typename T> inline void b2Swap(T& a, T& b)\n{\n\tT tmp = a;\n\ta = b;\n\tb = tmp;\n}\n\n/// \"Next Largest Power of 2\n/// Given a binary integer value x, the next largest power of 2 can be computed by a SWAR algorithm\n/// that recursively \"folds\" the upper bits into the lower bits. This process yields a bit vector with\n/// the same most significant 1 as x, but all 1's below it. Adding 1 to that value yields the next\n/// largest power of 2. For a 32-bit value:\"\ninline uint32 b2NextPowerOfTwo(uint32 x)\n{\n\tx |= (x >> 1);\n\tx |= (x >> 2);\n\tx |= (x >> 4);\n\tx |= (x >> 8);\n\tx |= (x >> 16);\n\treturn x + 1;\n}\n\ninline bool b2IsPowerOfTwo(uint32 x)\n{\n\tbool result = x > 0 && (x & (x - 1)) == 0;\n\treturn result;\n}\n\n// https://fgiesen.wordpress.com/2012/08/15/linear-interpolation-past-present-and-future/\ninline void b2Sweep::GetTransform(b2Transform* xf, float beta) const\n{\n\txf->p = (1.0f - beta) * c0 + beta * c;\n\tfloat angle = (1.0f - beta) * a0 + beta * a;\n\txf->q.Set(angle);\n\n\t// Shift to origin\n\txf->p -= b2Mul(xf->q, localCenter);\n}\n\ninline void b2Sweep::Advance(float alpha)\n{\n\tb2Assert(alpha0 < 1.0f);\n\tfloat beta = (alpha - alpha0) / (1.0f - alpha0);\n\tc0 += beta * (c - c0);\n\ta0 += beta * (a - a0);\n\talpha0 = alpha;\n}\n\n/// Normalize an angle in radians to be between -pi and pi\ninline void b2Sweep::Normalize()\n{\n\tfloat twoPi = 2.0f * b2_pi;\n\tfloat d =  twoPi * floorf(a0 / twoPi);\n\ta0 -= d;\n\ta -= d;\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_motor_joint.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_MOTOR_JOINT_H\n#define B2_MOTOR_JOINT_H\n\n#include \"b2_api.h\"\n#include \"b2_joint.h\"\n\n/// Motor joint definition.\nstruct B2_API b2MotorJointDef : public b2JointDef\n{\n\tb2MotorJointDef()\n\t{\n\t\ttype = e_motorJoint;\n\t\tlinearOffset.SetZero();\n\t\tangularOffset = 0.0f;\n\t\tmaxForce = 1.0f;\n\t\tmaxTorque = 1.0f;\n\t\tcorrectionFactor = 0.3f;\n\t}\n\n\t/// Initialize the bodies and offsets using the current transforms.\n\tvoid Initialize(b2Body* bodyA, b2Body* bodyB);\n\n\t/// Position of bodyB minus the position of bodyA, in bodyA's frame, in meters.\n\tb2Vec2 linearOffset;\n\n\t/// The bodyB angle minus bodyA angle in radians.\n\tfloat angularOffset;\n\n\t/// The maximum motor force in N.\n\tfloat maxForce;\n\n\t/// The maximum motor torque in N-m.\n\tfloat maxTorque;\n\n\t/// Position correction factor in the range [0,1].\n\tfloat correctionFactor;\n};\n\n/// A motor joint is used to control the relative motion\n/// between two bodies. A typical usage is to control the movement\n/// of a dynamic body with respect to the ground.\nclass B2_API b2MotorJoint : public b2Joint\n{\npublic:\n\tb2Vec2 GetAnchorA() const override;\n\tb2Vec2 GetAnchorB() const override;\n\n\tb2Vec2 GetReactionForce(float inv_dt) const override;\n\tfloat GetReactionTorque(float inv_dt) const override;\n\n\t/// Set/get the target linear offset, in frame A, in meters.\n\tvoid SetLinearOffset(const b2Vec2& linearOffset);\n\tconst b2Vec2& GetLinearOffset() const;\n\n\t/// Set/get the target angular offset, in radians.\n\tvoid SetAngularOffset(float angularOffset);\n\tfloat GetAngularOffset() const;\n\n\t/// Set the maximum friction force in N.\n\tvoid SetMaxForce(float force);\n\n\t/// Get the maximum friction force in N.\n\tfloat GetMaxForce() const;\n\n\t/// Set the maximum friction torque in N*m.\n\tvoid SetMaxTorque(float torque);\n\n\t/// Get the maximum friction torque in N*m.\n\tfloat GetMaxTorque() const;\n\n\t/// Set the position correction factor in the range [0,1].\n\tvoid SetCorrectionFactor(float factor);\n\n\t/// Get the position correction factor in the range [0,1].\n\tfloat GetCorrectionFactor() const;\n\n\t/// Dump to b2Log\n\tvoid Dump() override;\n\nprotected:\n\n\tfriend class b2Joint;\n\n\tb2MotorJoint(const b2MotorJointDef* def);\n\n\tvoid InitVelocityConstraints(const b2SolverData& data) override;\n\tvoid SolveVelocityConstraints(const b2SolverData& data) override;\n\tbool SolvePositionConstraints(const b2SolverData& data) override;\n\n\t// Solver shared\n\tb2Vec2 m_linearOffset;\n\tfloat m_angularOffset;\n\tb2Vec2 m_linearImpulse;\n\tfloat m_angularImpulse;\n\tfloat m_maxForce;\n\tfloat m_maxTorque;\n\tfloat m_correctionFactor;\n\n\t// Solver temp\n\tint32 m_indexA;\n\tint32 m_indexB;\n\tb2Vec2 m_rA;\n\tb2Vec2 m_rB;\n\tb2Vec2 m_localCenterA;\n\tb2Vec2 m_localCenterB;\n\tb2Vec2 m_linearError;\n\tfloat m_angularError;\n\tfloat m_invMassA;\n\tfloat m_invMassB;\n\tfloat m_invIA;\n\tfloat m_invIB;\n\tb2Mat22 m_linearMass;\n\tfloat m_angularMass;\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_mouse_joint.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_MOUSE_JOINT_H\n#define B2_MOUSE_JOINT_H\n\n#include \"b2_api.h\"\n#include \"b2_joint.h\"\n\n/// Mouse joint definition. This requires a world target point,\n/// tuning parameters, and the time step.\nstruct B2_API b2MouseJointDef : public b2JointDef\n{\n\tb2MouseJointDef()\n\t{\n\t\ttype = e_mouseJoint;\n\t\ttarget.Set(0.0f, 0.0f);\n\t\tmaxForce = 0.0f;\n\t\tstiffness = 0.0f;\n\t\tdamping = 0.0f;\n\t}\n\n\t/// The initial world target point. This is assumed\n\t/// to coincide with the body anchor initially.\n\tb2Vec2 target;\n\n\t/// The maximum constraint force that can be exerted\n\t/// to move the candidate body. Usually you will express\n\t/// as some multiple of the weight (multiplier * mass * gravity).\n\tfloat maxForce;\n\n\t/// The linear stiffness in N/m\n\tfloat stiffness;\n\n\t/// The linear damping in N*s/m\n\tfloat damping;\n};\n\n/// A mouse joint is used to make a point on a body track a\n/// specified world point. This a soft constraint with a maximum\n/// force. This allows the constraint to stretch and without\n/// applying huge forces.\n/// NOTE: this joint is not documented in the manual because it was\n/// developed to be used in the testbed. If you want to learn how to\n/// use the mouse joint, look at the testbed.\nclass B2_API b2MouseJoint : public b2Joint\n{\npublic:\n\n\t/// Implements b2Joint.\n\tb2Vec2 GetAnchorA() const override;\n\n\t/// Implements b2Joint.\n\tb2Vec2 GetAnchorB() const override;\n\n\t/// Implements b2Joint.\n\tb2Vec2 GetReactionForce(float inv_dt) const override;\n\n\t/// Implements b2Joint.\n\tfloat GetReactionTorque(float inv_dt) const override;\n\n\t/// Use this to update the target point.\n\tvoid SetTarget(const b2Vec2& target);\n\tconst b2Vec2& GetTarget() const;\n\n\t/// Set/get the maximum force in Newtons.\n\tvoid SetMaxForce(float force);\n\tfloat GetMaxForce() const;\n\n\t/// Set/get the linear stiffness in N/m\n\tvoid SetStiffness(float stiffness) { m_stiffness = stiffness; }\n\tfloat GetStiffness() const { return m_stiffness; }\n\n\t/// Set/get linear damping in N*s/m\n\tvoid SetDamping(float damping) { m_damping = damping; }\n\tfloat GetDamping() const { return m_damping; }\n\n\t/// The mouse joint does not support dumping.\n\tvoid Dump() override { b2Log(\"Mouse joint dumping is not supported.\\n\"); }\n\n\t/// Implement b2Joint::ShiftOrigin\n\tvoid ShiftOrigin(const b2Vec2& newOrigin) override;\n\nprotected:\n\tfriend class b2Joint;\n\n\tb2MouseJoint(const b2MouseJointDef* def);\n\n\tvoid InitVelocityConstraints(const b2SolverData& data) override;\n\tvoid SolveVelocityConstraints(const b2SolverData& data) override;\n\tbool SolvePositionConstraints(const b2SolverData& data) override;\n\n\tb2Vec2 m_localAnchorB;\n\tb2Vec2 m_targetA;\n\tfloat m_stiffness;\n\tfloat m_damping;\n\tfloat m_beta;\n\n\t// Solver shared\n\tb2Vec2 m_impulse;\n\tfloat m_maxForce;\n\tfloat m_gamma;\n\n\t// Solver temp\n\tint32 m_indexA;\n\tint32 m_indexB;\n\tb2Vec2 m_rB;\n\tb2Vec2 m_localCenterB;\n\tfloat m_invMassB;\n\tfloat m_invIB;\n\tb2Mat22 m_mass;\n\tb2Vec2 m_C;\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_polygon_shape.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n#ifndef B2_POLYGON_SHAPE_H\n#define B2_POLYGON_SHAPE_H\n\n#include \"b2_api.h\"\n#include \"b2_shape.h\"\n\n/// A solid convex polygon. It is assumed that the interior of the polygon is to\n/// the left of each edge.\n/// Polygons have a maximum number of vertices equal to b2_maxPolygonVertices.\n/// In most cases you should not need many vertices for a convex polygon.\nclass B2_API b2PolygonShape : public b2Shape\n{\npublic:\n\tb2PolygonShape();\n\n\t/// Implement b2Shape.\n\tb2Shape* Clone(b2BlockAllocator* allocator) const override;\n\n\t/// @see b2Shape::GetChildCount\n\tint32 GetChildCount() const override;\n\n\t/// Create a convex hull from the given array of local points.\n\t/// The count must be in the range [3, b2_maxPolygonVertices].\n\t/// @warning the points may be re-ordered, even if they form a convex polygon\n\t/// @warning collinear points are handled but not removed. Collinear points\n\t/// may lead to poor stacking behavior.\n\tvoid Set(const b2Vec2* points, int32 count);\n\n\t/// Build vertices to represent an axis-aligned box centered on the local origin.\n\t/// @param hx the half-width.\n\t/// @param hy the half-height.\n\tvoid SetAsBox(float hx, float hy);\n\n\t/// Build vertices to represent an oriented box.\n\t/// @param hx the half-width.\n\t/// @param hy the half-height.\n\t/// @param center the center of the box in local coordinates.\n\t/// @param angle the rotation of the box in local coordinates.\n\tvoid SetAsBox(float hx, float hy, const b2Vec2& center, float angle);\n\n\t/// @see b2Shape::TestPoint\n\tbool TestPoint(const b2Transform& transform, const b2Vec2& p) const override;\n\n\t/// Implement b2Shape.\n\t/// @note because the polygon is solid, rays that start inside do not hit because the normal is\n\t/// not defined.\n\tbool RayCast(b2RayCastOutput* output, const b2RayCastInput& input,\n\t\t\t\t\tconst b2Transform& transform, int32 childIndex) const override;\n\n\t/// @see b2Shape::ComputeAABB\n\tvoid ComputeAABB(b2AABB* aabb, const b2Transform& transform, int32 childIndex) const override;\n\n\t/// @see b2Shape::ComputeMass\n\tvoid ComputeMass(b2MassData* massData, float density) const override;\n\n\t/// Validate convexity. This is a very time consuming operation.\n\t/// @returns true if valid\n\tbool Validate() const;\n\n\tb2Vec2 m_centroid;\n\tb2Vec2 m_vertices[b2_maxPolygonVertices];\n\tb2Vec2 m_normals[b2_maxPolygonVertices];\n\tint32 m_count;\n};\n\ninline b2PolygonShape::b2PolygonShape()\n{\n\tm_type = e_polygon;\n\tm_radius = b2_polygonRadius;\n\tm_count = 0;\n\tm_centroid.SetZero();\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_prismatic_joint.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_PRISMATIC_JOINT_H\n#define B2_PRISMATIC_JOINT_H\n\n#include \"b2_api.h\"\n#include \"b2_joint.h\"\n\n/// Prismatic joint definition. This requires defining a line of\n/// motion using an axis and an anchor point. The definition uses local\n/// anchor points and a local axis so that the initial configuration\n/// can violate the constraint slightly. The joint translation is zero\n/// when the local anchor points coincide in world space. Using local\n/// anchors and a local axis helps when saving and loading a game.\nstruct B2_API b2PrismaticJointDef : public b2JointDef\n{\n\tb2PrismaticJointDef()\n\t{\n\t\ttype = e_prismaticJoint;\n\t\tlocalAnchorA.SetZero();\n\t\tlocalAnchorB.SetZero();\n\t\tlocalAxisA.Set(1.0f, 0.0f);\n\t\treferenceAngle = 0.0f;\n\t\tenableLimit = false;\n\t\tlowerTranslation = 0.0f;\n\t\tupperTranslation = 0.0f;\n\t\tenableMotor = false;\n\t\tmaxMotorForce = 0.0f;\n\t\tmotorSpeed = 0.0f;\n\t}\n\n\t/// Initialize the bodies, anchors, axis, and reference angle using the world\n\t/// anchor and unit world axis.\n\tvoid Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor, const b2Vec2& axis);\n\n\t/// The local anchor point relative to bodyA's origin.\n\tb2Vec2 localAnchorA;\n\n\t/// The local anchor point relative to bodyB's origin.\n\tb2Vec2 localAnchorB;\n\n\t/// The local translation unit axis in bodyA.\n\tb2Vec2 localAxisA;\n\n\t/// The constrained angle between the bodies: bodyB_angle - bodyA_angle.\n\tfloat referenceAngle;\n\n\t/// Enable/disable the joint limit.\n\tbool enableLimit;\n\n\t/// The lower translation limit, usually in meters.\n\tfloat lowerTranslation;\n\n\t/// The upper translation limit, usually in meters.\n\tfloat upperTranslation;\n\n\t/// Enable/disable the joint motor.\n\tbool enableMotor;\n\n\t/// The maximum motor torque, usually in N-m.\n\tfloat maxMotorForce;\n\n\t/// The desired motor speed in radians per second.\n\tfloat motorSpeed;\n};\n\n/// A prismatic joint. This joint provides one degree of freedom: translation\n/// along an axis fixed in bodyA. Relative rotation is prevented. You can\n/// use a joint limit to restrict the range of motion and a joint motor to\n/// drive the motion or to model joint friction.\nclass B2_API b2PrismaticJoint : public b2Joint\n{\npublic:\n\tb2Vec2 GetAnchorA() const override;\n\tb2Vec2 GetAnchorB() const override;\n\n\tb2Vec2 GetReactionForce(float inv_dt) const override;\n\tfloat GetReactionTorque(float inv_dt) const override;\n\n\t/// The local anchor point relative to bodyA's origin.\n\tconst b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; }\n\n\t/// The local anchor point relative to bodyB's origin.\n\tconst b2Vec2& GetLocalAnchorB() const  { return m_localAnchorB; }\n\n\t/// The local joint axis relative to bodyA.\n\tconst b2Vec2& GetLocalAxisA() const { return m_localXAxisA; }\n\n\t/// Get the reference angle.\n\tfloat GetReferenceAngle() const { return m_referenceAngle; }\n\n\t/// Get the current joint translation, usually in meters.\n\tfloat GetJointTranslation() const;\n\n\t/// Get the current joint translation speed, usually in meters per second.\n\tfloat GetJointSpeed() const;\n\n\t/// Is the joint limit enabled?\n\tbool IsLimitEnabled() const;\n\n\t/// Enable/disable the joint limit.\n\tvoid EnableLimit(bool flag);\n\n\t/// Get the lower joint limit, usually in meters.\n\tfloat GetLowerLimit() const;\n\n\t/// Get the upper joint limit, usually in meters.\n\tfloat GetUpperLimit() const;\n\n\t/// Set the joint limits, usually in meters.\n\tvoid SetLimits(float lower, float upper);\n\n\t/// Is the joint motor enabled?\n\tbool IsMotorEnabled() const;\n\n\t/// Enable/disable the joint motor.\n\tvoid EnableMotor(bool flag);\n\n\t/// Set the motor speed, usually in meters per second.\n\tvoid SetMotorSpeed(float speed);\n\n\t/// Get the motor speed, usually in meters per second.\n\tfloat GetMotorSpeed() const;\n\n\t/// Set the maximum motor force, usually in N.\n\tvoid SetMaxMotorForce(float force);\n\tfloat GetMaxMotorForce() const { return m_maxMotorForce; }\n\n\t/// Get the current motor force given the inverse time step, usually in N.\n\tfloat GetMotorForce(float inv_dt) const;\n\n\t/// Dump to b2Log\n\tvoid Dump() override;\n\n\t///\n\tvoid Draw(b2Draw* draw) const override;\n\nprotected:\n\tfriend class b2Joint;\n\tfriend class b2GearJoint;\n\tb2PrismaticJoint(const b2PrismaticJointDef* def);\n\n\tvoid InitVelocityConstraints(const b2SolverData& data) override;\n\tvoid SolveVelocityConstraints(const b2SolverData& data) override;\n\tbool SolvePositionConstraints(const b2SolverData& data) override;\n\n\tb2Vec2 m_localAnchorA;\n\tb2Vec2 m_localAnchorB;\n\tb2Vec2 m_localXAxisA;\n\tb2Vec2 m_localYAxisA;\n\tfloat m_referenceAngle;\n\tb2Vec2 m_impulse;\n\tfloat m_motorImpulse;\n\tfloat m_lowerImpulse;\n\tfloat m_upperImpulse;\n\tfloat m_lowerTranslation;\n\tfloat m_upperTranslation;\n\tfloat m_maxMotorForce;\n\tfloat m_motorSpeed;\n\tbool m_enableLimit;\n\tbool m_enableMotor;\n\n\t// Solver temp\n\tint32 m_indexA;\n\tint32 m_indexB;\n\tb2Vec2 m_localCenterA;\n\tb2Vec2 m_localCenterB;\n\tfloat m_invMassA;\n\tfloat m_invMassB;\n\tfloat m_invIA;\n\tfloat m_invIB;\n\tb2Vec2 m_axis, m_perp;\n\tfloat m_s1, m_s2;\n\tfloat m_a1, m_a2;\n\tb2Mat22 m_K;\n\tfloat m_translation;\n\tfloat m_axialMass;\n};\n\ninline float b2PrismaticJoint::GetMotorSpeed() const\n{\n\treturn m_motorSpeed;\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_pulley_joint.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_PULLEY_JOINT_H\n#define B2_PULLEY_JOINT_H\n\n#include \"b2_api.h\"\n#include \"b2_joint.h\"\n\nconst float b2_minPulleyLength = 2.0f;\n\n/// Pulley joint definition. This requires two ground anchors,\n/// two dynamic body anchor points, and a pulley ratio.\nstruct B2_API b2PulleyJointDef : public b2JointDef\n{\n\tb2PulleyJointDef()\n\t{\n\t\ttype = e_pulleyJoint;\n\t\tgroundAnchorA.Set(-1.0f, 1.0f);\n\t\tgroundAnchorB.Set(1.0f, 1.0f);\n\t\tlocalAnchorA.Set(-1.0f, 0.0f);\n\t\tlocalAnchorB.Set(1.0f, 0.0f);\n\t\tlengthA = 0.0f;\n\t\tlengthB = 0.0f;\n\t\tratio = 1.0f;\n\t\tcollideConnected = true;\n\t}\n\n\t/// Initialize the bodies, anchors, lengths, max lengths, and ratio using the world anchors.\n\tvoid Initialize(b2Body* bodyA, b2Body* bodyB,\n\t\t\t\t\tconst b2Vec2& groundAnchorA, const b2Vec2& groundAnchorB,\n\t\t\t\t\tconst b2Vec2& anchorA, const b2Vec2& anchorB,\n\t\t\t\t\tfloat ratio);\n\n\t/// The first ground anchor in world coordinates. This point never moves.\n\tb2Vec2 groundAnchorA;\n\n\t/// The second ground anchor in world coordinates. This point never moves.\n\tb2Vec2 groundAnchorB;\n\n\t/// The local anchor point relative to bodyA's origin.\n\tb2Vec2 localAnchorA;\n\n\t/// The local anchor point relative to bodyB's origin.\n\tb2Vec2 localAnchorB;\n\n\t/// The a reference length for the segment attached to bodyA.\n\tfloat lengthA;\n\n\t/// The a reference length for the segment attached to bodyB.\n\tfloat lengthB;\n\n\t/// The pulley ratio, used to simulate a block-and-tackle.\n\tfloat ratio;\n};\n\n/// The pulley joint is connected to two bodies and two fixed ground points.\n/// The pulley supports a ratio such that:\n/// length1 + ratio * length2 <= constant\n/// Yes, the force transmitted is scaled by the ratio.\n/// Warning: the pulley joint can get a bit squirrelly by itself. They often\n/// work better when combined with prismatic joints. You should also cover the\n/// the anchor points with static shapes to prevent one side from going to\n/// zero length.\nclass B2_API b2PulleyJoint : public b2Joint\n{\npublic:\n\tb2Vec2 GetAnchorA() const override;\n\tb2Vec2 GetAnchorB() const override;\n\n\tb2Vec2 GetReactionForce(float inv_dt) const override;\n\tfloat GetReactionTorque(float inv_dt) const override;\n\n\t/// Get the first ground anchor.\n\tb2Vec2 GetGroundAnchorA() const;\n\n\t/// Get the second ground anchor.\n\tb2Vec2 GetGroundAnchorB() const;\n\n\t/// Get the current length of the segment attached to bodyA.\n\tfloat GetLengthA() const;\n\n\t/// Get the current length of the segment attached to bodyB.\n\tfloat GetLengthB() const;\n\n\t/// Get the pulley ratio.\n\tfloat GetRatio() const;\n\n\t/// Get the current length of the segment attached to bodyA.\n\tfloat GetCurrentLengthA() const;\n\n\t/// Get the current length of the segment attached to bodyB.\n\tfloat GetCurrentLengthB() const;\n\n\t/// Dump joint to dmLog\n\tvoid Dump() override;\n\n\t/// Implement b2Joint::ShiftOrigin\n\tvoid ShiftOrigin(const b2Vec2& newOrigin) override;\n\nprotected:\n\n\tfriend class b2Joint;\n\tb2PulleyJoint(const b2PulleyJointDef* data);\n\n\tvoid InitVelocityConstraints(const b2SolverData& data) override;\n\tvoid SolveVelocityConstraints(const b2SolverData& data) override;\n\tbool SolvePositionConstraints(const b2SolverData& data) override;\n\n\tb2Vec2 m_groundAnchorA;\n\tb2Vec2 m_groundAnchorB;\n\tfloat m_lengthA;\n\tfloat m_lengthB;\n\n\t// Solver shared\n\tb2Vec2 m_localAnchorA;\n\tb2Vec2 m_localAnchorB;\n\tfloat m_constant;\n\tfloat m_ratio;\n\tfloat m_impulse;\n\n\t// Solver temp\n\tint32 m_indexA;\n\tint32 m_indexB;\n\tb2Vec2 m_uA;\n\tb2Vec2 m_uB;\n\tb2Vec2 m_rA;\n\tb2Vec2 m_rB;\n\tb2Vec2 m_localCenterA;\n\tb2Vec2 m_localCenterB;\n\tfloat m_invMassA;\n\tfloat m_invMassB;\n\tfloat m_invIA;\n\tfloat m_invIB;\n\tfloat m_mass;\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_revolute_joint.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_REVOLUTE_JOINT_H\n#define B2_REVOLUTE_JOINT_H\n\n#include \"b2_api.h\"\n#include \"b2_joint.h\"\n\n/// Revolute joint definition. This requires defining an anchor point where the\n/// bodies are joined. The definition uses local anchor points so that the\n/// initial configuration can violate the constraint slightly. You also need to\n/// specify the initial relative angle for joint limits. This helps when saving\n/// and loading a game.\n/// The local anchor points are measured from the body's origin\n/// rather than the center of mass because:\n/// 1. you might not know where the center of mass will be.\n/// 2. if you add/remove shapes from a body and recompute the mass,\n///    the joints will be broken.\nstruct B2_API b2RevoluteJointDef : public b2JointDef\n{\n\tb2RevoluteJointDef()\n\t{\n\t\ttype = e_revoluteJoint;\n\t\tlocalAnchorA.Set(0.0f, 0.0f);\n\t\tlocalAnchorB.Set(0.0f, 0.0f);\n\t\treferenceAngle = 0.0f;\n\t\tlowerAngle = 0.0f;\n\t\tupperAngle = 0.0f;\n\t\tmaxMotorTorque = 0.0f;\n\t\tmotorSpeed = 0.0f;\n\t\tenableLimit = false;\n\t\tenableMotor = false;\n\t}\n\n\t/// Initialize the bodies, anchors, and reference angle using a world\n\t/// anchor point.\n\tvoid Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor);\n\n\t/// The local anchor point relative to bodyA's origin.\n\tb2Vec2 localAnchorA;\n\n\t/// The local anchor point relative to bodyB's origin.\n\tb2Vec2 localAnchorB;\n\n\t/// The bodyB angle minus bodyA angle in the reference state (radians).\n\tfloat referenceAngle;\n\n\t/// A flag to enable joint limits.\n\tbool enableLimit;\n\n\t/// The lower angle for the joint limit (radians).\n\tfloat lowerAngle;\n\n\t/// The upper angle for the joint limit (radians).\n\tfloat upperAngle;\n\n\t/// A flag to enable the joint motor.\n\tbool enableMotor;\n\n\t/// The desired motor speed. Usually in radians per second.\n\tfloat motorSpeed;\n\n\t/// The maximum motor torque used to achieve the desired motor speed.\n\t/// Usually in N-m.\n\tfloat maxMotorTorque;\n};\n\n/// A revolute joint constrains two bodies to share a common point while they\n/// are free to rotate about the point. The relative rotation about the shared\n/// point is the joint angle. You can limit the relative rotation with\n/// a joint limit that specifies a lower and upper angle. You can use a motor\n/// to drive the relative rotation about the shared point. A maximum motor torque\n/// is provided so that infinite forces are not generated.\nclass B2_API b2RevoluteJoint : public b2Joint\n{\npublic:\n\tb2Vec2 GetAnchorA() const override;\n\tb2Vec2 GetAnchorB() const override;\n\n\t/// The local anchor point relative to bodyA's origin.\n\tconst b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; }\n\n\t/// The local anchor point relative to bodyB's origin.\n\tconst b2Vec2& GetLocalAnchorB() const  { return m_localAnchorB; }\n\n\t/// Get the reference angle.\n\tfloat GetReferenceAngle() const { return m_referenceAngle; }\n\n\t/// Get the current joint angle in radians.\n\tfloat GetJointAngle() const;\n\n\t/// Get the current joint angle speed in radians per second.\n\tfloat GetJointSpeed() const;\n\n\t/// Is the joint limit enabled?\n\tbool IsLimitEnabled() const;\n\n\t/// Enable/disable the joint limit.\n\tvoid EnableLimit(bool flag);\n\n\t/// Get the lower joint limit in radians.\n\tfloat GetLowerLimit() const;\n\n\t/// Get the upper joint limit in radians.\n\tfloat GetUpperLimit() const;\n\n\t/// Set the joint limits in radians.\n\tvoid SetLimits(float lower, float upper);\n\n\t/// Is the joint motor enabled?\n\tbool IsMotorEnabled() const;\n\n\t/// Enable/disable the joint motor.\n\tvoid EnableMotor(bool flag);\n\n\t/// Set the motor speed in radians per second.\n\tvoid SetMotorSpeed(float speed);\n\n\t/// Get the motor speed in radians per second.\n\tfloat GetMotorSpeed() const;\n\n\t/// Set the maximum motor torque, usually in N-m.\n\tvoid SetMaxMotorTorque(float torque);\n\tfloat GetMaxMotorTorque() const { return m_maxMotorTorque; }\n\n\t/// Get the reaction force given the inverse time step.\n\t/// Unit is N.\n\tb2Vec2 GetReactionForce(float inv_dt) const override;\n\n\t/// Get the reaction torque due to the joint limit given the inverse time step.\n\t/// Unit is N*m.\n\tfloat GetReactionTorque(float inv_dt) const override;\n\n\t/// Get the current motor torque given the inverse time step.\n\t/// Unit is N*m.\n\tfloat GetMotorTorque(float inv_dt) const;\n\n\t/// Dump to b2Log.\n\tvoid Dump() override;\n\n\t///\n\tvoid Draw(b2Draw* draw) const override;\n\nprotected:\n\n\tfriend class b2Joint;\n\tfriend class b2GearJoint;\n\n\tb2RevoluteJoint(const b2RevoluteJointDef* def);\n\n\tvoid InitVelocityConstraints(const b2SolverData& data) override;\n\tvoid SolveVelocityConstraints(const b2SolverData& data) override;\n\tbool SolvePositionConstraints(const b2SolverData& data) override;\n\n\t// Solver shared\n\tb2Vec2 m_localAnchorA;\n\tb2Vec2 m_localAnchorB;\n\tb2Vec2 m_impulse;\n\tfloat m_motorImpulse;\n\tfloat m_lowerImpulse;\n\tfloat m_upperImpulse;\n\tbool m_enableMotor;\n\tfloat m_maxMotorTorque;\n\tfloat m_motorSpeed;\n\tbool m_enableLimit;\n\tfloat m_referenceAngle;\n\tfloat m_lowerAngle;\n\tfloat m_upperAngle;\n\n\t// Solver temp\n\tint32 m_indexA;\n\tint32 m_indexB;\n\tb2Vec2 m_rA;\n\tb2Vec2 m_rB;\n\tb2Vec2 m_localCenterA;\n\tb2Vec2 m_localCenterB;\n\tfloat m_invMassA;\n\tfloat m_invMassB;\n\tfloat m_invIA;\n\tfloat m_invIB;\n\tb2Mat22 m_K;\n\tfloat m_angle;\n\tfloat m_axialMass;\n};\n\ninline float b2RevoluteJoint::GetMotorSpeed() const\n{\n\treturn m_motorSpeed;\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_rope.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_ROPE_H\n#define B2_ROPE_H\n\n#include \"b2_api.h\"\n#include \"b2_math.h\"\n\nclass b2Draw;\nstruct b2RopeStretch;\nstruct b2RopeBend;\n\nenum b2StretchingModel\n{\n\tb2_pbdStretchingModel,\n\tb2_xpbdStretchingModel\n};\n\nenum b2BendingModel\n{\n\tb2_springAngleBendingModel = 0,\n\tb2_pbdAngleBendingModel,\n\tb2_xpbdAngleBendingModel,\n\tb2_pbdDistanceBendingModel,\n\tb2_pbdHeightBendingModel,\n\tb2_pbdTriangleBendingModel\n};\n\n///\nstruct B2_API b2RopeTuning\n{\n\tb2RopeTuning()\n\t{\n\t\tstretchingModel = b2_pbdStretchingModel;\n\t\tbendingModel = b2_pbdAngleBendingModel;\n\t\tdamping = 0.0f;\n\t\tstretchStiffness = 1.0f;\n\t\tbendStiffness = 0.5f;\n\t\tbendHertz = 1.0f;\n\t\tbendDamping = 0.0f;\n\t\tisometric = false;\n\t\tfixedEffectiveMass = false;\n\t\twarmStart = false;\n\t}\n\n\tb2StretchingModel stretchingModel;\n\tb2BendingModel bendingModel;\n\tfloat damping;\n\tfloat stretchStiffness;\n\tfloat stretchHertz;\n\tfloat stretchDamping;\n\tfloat bendStiffness;\n\tfloat bendHertz;\n\tfloat bendDamping;\n\tbool isometric;\n\tbool fixedEffectiveMass;\n\tbool warmStart;\n};\n\n///\nstruct B2_API b2RopeDef\n{\n\tb2RopeDef()\n\t{\n\t\tposition.SetZero();\n\t\tvertices = nullptr;\n\t\tcount = 0;\n\t\tmasses = nullptr;\n\t\tgravity.SetZero();\n\t}\n\n\tb2Vec2 position;\n\tb2Vec2* vertices;\n\tint32 count;\n\tfloat* masses;\n\tb2Vec2 gravity;\n\tb2RopeTuning tuning;\n};\n\n///\nclass B2_API b2Rope\n{\npublic:\n\tb2Rope();\n\t~b2Rope();\n\n\t///\n\tvoid Create(const b2RopeDef& def);\n\n\t///\n\tvoid SetTuning(const b2RopeTuning& tuning);\n\n\t///\n\tvoid Step(float timeStep, int32 iterations, const b2Vec2& position);\n\n\t///\n\tvoid Reset(const b2Vec2& position);\n\n\t///\n\tvoid Draw(b2Draw* draw) const;\n\nprivate:\n\n\tvoid SolveStretch_PBD();\n\tvoid SolveStretch_XPBD(float dt);\n\tvoid SolveBend_PBD_Angle();\n\tvoid SolveBend_XPBD_Angle(float dt);\n\tvoid SolveBend_PBD_Distance();\n\tvoid SolveBend_PBD_Height();\n\tvoid SolveBend_PBD_Triangle();\n\tvoid ApplyBendForces(float dt);\n\n\tb2Vec2 m_position;\n\n\tint32 m_count;\n\tint32 m_stretchCount;\n\tint32 m_bendCount;\n\n\tb2RopeStretch* m_stretchConstraints;\n\tb2RopeBend* m_bendConstraints;\n\n\tb2Vec2* m_bindPositions;\n\tb2Vec2* m_ps;\n\tb2Vec2* m_p0s;\n\tb2Vec2* m_vs;\n\n\tfloat* m_invMasses;\n\tb2Vec2 m_gravity;\n\n\tb2RopeTuning m_tuning;\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_settings.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_SETTINGS_H\n#define B2_SETTINGS_H\n\n#include \"b2_types.h\"\n#include \"b2_api.h\"\n\n/// @file\n/// Settings that can be overriden for your application\n///\n\n/// Define this macro in your build if you want to override settings\n#ifdef B2_USER_SETTINGS\n\n/// This is a user file that includes custom definitions of the macros, structs, and functions\n/// defined below.\n#include \"b2_user_settings.h\"\n\n#else\n\n#include <stdarg.h>\n#include <stdint.h>\n\n// Tunable Constants\n\n/// You can use this to change the length scale used by your game.\n/// For example for inches you could use 39.4.\n#define b2_lengthUnitsPerMeter 1.0f\n\n/// The maximum number of vertices on a convex polygon. You cannot increase\n/// this too much because b2BlockAllocator has a maximum object size.\n#define b2_maxPolygonVertices\t8\n\n// User data\n\n/// You can define this to inject whatever data you want in b2Body\nstruct B2_API b2BodyUserData\n{\n\tb2BodyUserData()\n\t{\n\t\tpointer = 0;\n\t}\n\n\t/// For legacy compatibility\n\tuintptr_t pointer;\n};\n\n/// You can define this to inject whatever data you want in b2Fixture\nstruct B2_API b2FixtureUserData\n{\n\tb2FixtureUserData()\n\t{\n\t\tpointer = 0;\n\t}\n\n\t/// For legacy compatibility\n\tuintptr_t pointer;\n};\n\n/// You can define this to inject whatever data you want in b2Joint\nstruct B2_API b2JointUserData\n{\n\tb2JointUserData()\n\t{\n\t\tpointer = 0;\n\t}\n\n\t/// For legacy compatibility\n\tuintptr_t pointer;\n};\n\n// Memory Allocation\n\n/// Default allocation functions\nB2_API void* b2Alloc_Default(int32 size);\nB2_API void b2Free_Default(void* mem);\n\n/// Implement this function to use your own memory allocator.\ninline void* b2Alloc(int32 size)\n{\n\treturn b2Alloc_Default(size);\n}\n\n/// If you implement b2Alloc, you should also implement this function.\ninline void b2Free(void* mem)\n{\n\tb2Free_Default(mem);\n}\n\n/// Default logging function\nB2_API void b2Log_Default(const char* string, va_list args);\n\n/// Implement this to use your own logging.\ninline void b2Log(const char* string, ...)\n{\n\tva_list args;\n\tva_start(args, string);\n\tb2Log_Default(string, args);\n\tva_end(args);\n}\n\n#endif // B2_USER_SETTINGS\n\n#include \"b2_common.h\"\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_shape.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_SHAPE_H\n#define B2_SHAPE_H\n\n#include \"b2_api.h\"\n#include \"b2_math.h\"\n#include \"b2_collision.h\"\n\nclass b2BlockAllocator;\n\n/// This holds the mass data computed for a shape.\nstruct B2_API b2MassData\n{\n\t/// The mass of the shape, usually in kilograms.\n\tfloat mass;\n\n\t/// The position of the shape's centroid relative to the shape's origin.\n\tb2Vec2 center;\n\n\t/// The rotational inertia of the shape about the local origin.\n\tfloat I;\n};\n\n/// A shape is used for collision detection. You can create a shape however you like.\n/// Shapes used for simulation in b2World are created automatically when a b2Fixture\n/// is created. Shapes may encapsulate a one or more child shapes.\nclass B2_API b2Shape\n{\npublic:\n\n\tenum Type\n\t{\n\t\te_circle = 0,\n\t\te_edge = 1,\n\t\te_polygon = 2,\n\t\te_chain = 3,\n\t\te_typeCount = 4\n\t};\n\n\tvirtual ~b2Shape() {}\n\n\t/// Clone the concrete shape using the provided allocator.\n\tvirtual b2Shape* Clone(b2BlockAllocator* allocator) const = 0;\n\n\t/// Get the type of this shape. You can use this to down cast to the concrete shape.\n\t/// @return the shape type.\n\tType GetType() const;\n\n\t/// Get the number of child primitives.\n\tvirtual int32 GetChildCount() const = 0;\n\n\t/// Test a point for containment in this shape. This only works for convex shapes.\n\t/// @param xf the shape world transform.\n\t/// @param p a point in world coordinates.\n\tvirtual bool TestPoint(const b2Transform& xf, const b2Vec2& p) const = 0;\n\n\t/// Cast a ray against a child shape.\n\t/// @param output the ray-cast results.\n\t/// @param input the ray-cast input parameters.\n\t/// @param transform the transform to be applied to the shape.\n\t/// @param childIndex the child shape index\n\tvirtual bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input,\n\t\t\t\t\t\tconst b2Transform& transform, int32 childIndex) const = 0;\n\n\t/// Given a transform, compute the associated axis aligned bounding box for a child shape.\n\t/// @param aabb returns the axis aligned box.\n\t/// @param xf the world transform of the shape.\n\t/// @param childIndex the child shape\n\tvirtual void ComputeAABB(b2AABB* aabb, const b2Transform& xf, int32 childIndex) const = 0;\n\n\t/// Compute the mass properties of this shape using its dimensions and density.\n\t/// The inertia tensor is computed about the local origin.\n\t/// @param massData returns the mass data for this shape.\n\t/// @param density the density in kilograms per meter squared.\n\tvirtual void ComputeMass(b2MassData* massData, float density) const = 0;\n\n\tType m_type;\n\n\t/// Radius of a shape. For polygonal shapes this must be b2_polygonRadius. There is no support for\n\t/// making rounded polygons.\n\tfloat m_radius;\n};\n\ninline b2Shape::Type b2Shape::GetType() const\n{\n\treturn m_type;\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_stack_allocator.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_STACK_ALLOCATOR_H\n#define B2_STACK_ALLOCATOR_H\n\n#include \"b2_api.h\"\n#include \"b2_settings.h\"\n\nconst int32 b2_stackSize = 100 * 1024;\t// 100k\nconst int32 b2_maxStackEntries = 32;\n\nstruct B2_API b2StackEntry\n{\n\tchar* data;\n\tint32 size;\n\tbool usedMalloc;\n};\n\n// This is a stack allocator used for fast per step allocations.\n// You must nest allocate/free pairs. The code will assert\n// if you try to interleave multiple allocate/free pairs.\nclass B2_API b2StackAllocator\n{\npublic:\n\tb2StackAllocator();\n\t~b2StackAllocator();\n\n\tvoid* Allocate(int32 size);\n\tvoid Free(void* p);\n\n\tint32 GetMaxAllocation() const;\n\nprivate:\n\n\tchar m_data[b2_stackSize];\n\tint32 m_index;\n\n\tint32 m_allocation;\n\tint32 m_maxAllocation;\n\n\tb2StackEntry m_entries[b2_maxStackEntries];\n\tint32 m_entryCount;\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_time_of_impact.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_TIME_OF_IMPACT_H\n#define B2_TIME_OF_IMPACT_H\n\n#include \"b2_api.h\"\n#include \"b2_math.h\"\n#include \"b2_distance.h\"\n\n/// Input parameters for b2TimeOfImpact\nstruct B2_API b2TOIInput\n{\n\tb2DistanceProxy proxyA;\n\tb2DistanceProxy proxyB;\n\tb2Sweep sweepA;\n\tb2Sweep sweepB;\n\tfloat tMax;\t\t// defines sweep interval [0, tMax]\n};\n\n/// Output parameters for b2TimeOfImpact.\nstruct B2_API b2TOIOutput\n{\n\tenum State\n\t{\n\t\te_unknown,\n\t\te_failed,\n\t\te_overlapped,\n\t\te_touching,\n\t\te_separated\n\t};\n\n\tState state;\n\tfloat t;\n};\n\n/// Compute the upper bound on time before two shapes penetrate. Time is represented as\n/// a fraction between [0,tMax]. This uses a swept separating axis and may miss some intermediate,\n/// non-tunneling collisions. If you change the time interval, you should call this function\n/// again.\n/// Note: use b2Distance to compute the contact point and normal at the time of impact.\nB2_API void b2TimeOfImpact(b2TOIOutput* output, const b2TOIInput* input);\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_time_step.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n#ifndef B2_TIME_STEP_H\n#define B2_TIME_STEP_H\n\n#include \"b2_api.h\"\n#include \"b2_math.h\"\n\n/// Profiling data. Times are in milliseconds.\nstruct B2_API b2Profile\n{\n\tfloat step;\n\tfloat collide;\n\tfloat solve;\n\tfloat solveInit;\n\tfloat solveVelocity;\n\tfloat solvePosition;\n\tfloat broadphase;\n\tfloat solveTOI;\n};\n\n/// This is an internal structure.\nstruct B2_API b2TimeStep\n{\n\tfloat dt;\t\t\t// time step\n\tfloat inv_dt;\t\t// inverse time step (0 if dt == 0).\n\tfloat dtRatio;\t// dt * inv_dt0\n\tint32 velocityIterations;\n\tint32 positionIterations;\n\tbool warmStarting;\n};\n\n/// This is an internal structure.\nstruct B2_API b2Position\n{\n\tb2Vec2 c;\n\tfloat a;\n};\n\n/// This is an internal structure.\nstruct B2_API b2Velocity\n{\n\tb2Vec2 v;\n\tfloat w;\n};\n\n/// Solver Data\nstruct B2_API b2SolverData\n{\n\tb2TimeStep step;\n\tb2Position* positions;\n\tb2Velocity* velocities;\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_timer.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_TIMER_H\n#define B2_TIMER_H\n\n#include \"b2_api.h\"\n#include \"b2_settings.h\"\n\n/// Timer for profiling. This has platform specific code and may\n/// not work on every platform.\nclass B2_API b2Timer\n{\npublic:\n\n\t/// Constructor\n\tb2Timer();\n\n\t/// Reset the timer.\n\tvoid Reset();\n\n\t/// Get the time since construction or the last reset.\n\tfloat GetMilliseconds() const;\n\nprivate:\n\n#if defined(_WIN32)\n\tdouble m_start;\n\tstatic double s_invFrequency;\n#elif defined(__linux__) || defined (__APPLE__)\n\tunsigned long long m_start_sec;\n\tunsigned long long m_start_usec;\n#endif\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_types.h",
    "content": "// MIT License\n\n// Copyright (c) 2020 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_TYPES_H\n#define B2_TYPES_H\n\ntypedef signed char\tint8;\ntypedef signed short int16;\ntypedef signed int int32;\ntypedef unsigned char uint8;\ntypedef unsigned short uint16;\ntypedef unsigned int uint32;\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_weld_joint.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_WELD_JOINT_H\n#define B2_WELD_JOINT_H\n\n#include \"b2_api.h\"\n#include \"b2_joint.h\"\n\n/// Weld joint definition. You need to specify local anchor points\n/// where they are attached and the relative body angle. The position\n/// of the anchor points is important for computing the reaction torque.\nstruct B2_API b2WeldJointDef : public b2JointDef\n{\n\tb2WeldJointDef()\n\t{\n\t\ttype = e_weldJoint;\n\t\tlocalAnchorA.Set(0.0f, 0.0f);\n\t\tlocalAnchorB.Set(0.0f, 0.0f);\n\t\treferenceAngle = 0.0f;\n\t\tstiffness = 0.0f;\n\t\tdamping = 0.0f;\n\t}\n\n\t/// Initialize the bodies, anchors, reference angle, stiffness, and damping.\n\t/// @param bodyA the first body connected by this joint\n\t/// @param bodyB the second body connected by this joint\n\t/// @param anchor the point of connection in world coordinates\n\tvoid Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor);\n\n\t/// The local anchor point relative to bodyA's origin.\n\tb2Vec2 localAnchorA;\n\n\t/// The local anchor point relative to bodyB's origin.\n\tb2Vec2 localAnchorB;\n\n\t/// The bodyB angle minus bodyA angle in the reference state (radians).\n\tfloat referenceAngle;\n\n\t/// The rotational stiffness in N*m\n\t/// Disable softness with a value of 0\n\tfloat stiffness;\n\n\t/// The rotational damping in N*m*s\n\tfloat damping;\n};\n\n/// A weld joint essentially glues two bodies together. A weld joint may\n/// distort somewhat because the island constraint solver is approximate.\nclass B2_API b2WeldJoint : public b2Joint\n{\npublic:\n\tb2Vec2 GetAnchorA() const override;\n\tb2Vec2 GetAnchorB() const override;\n\n\tb2Vec2 GetReactionForce(float inv_dt) const override;\n\tfloat GetReactionTorque(float inv_dt) const override;\n\n\t/// The local anchor point relative to bodyA's origin.\n\tconst b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; }\n\n\t/// The local anchor point relative to bodyB's origin.\n\tconst b2Vec2& GetLocalAnchorB() const  { return m_localAnchorB; }\n\n\t/// Get the reference angle.\n\tfloat GetReferenceAngle() const { return m_referenceAngle; }\n\n\t/// Set/get stiffness in N*m\n\tvoid SetStiffness(float hz) { m_stiffness = hz; }\n\tfloat GetStiffness() const { return m_stiffness; }\n\n\t/// Set/get damping in N*m*s\n\tvoid SetDamping(float damping) { m_damping = damping; }\n\tfloat GetDamping() const { return m_damping; }\n\n\t/// Dump to b2Log\n\tvoid Dump() override;\n\nprotected:\n\n\tfriend class b2Joint;\n\n\tb2WeldJoint(const b2WeldJointDef* def);\n\n\tvoid InitVelocityConstraints(const b2SolverData& data) override;\n\tvoid SolveVelocityConstraints(const b2SolverData& data) override;\n\tbool SolvePositionConstraints(const b2SolverData& data) override;\n\n\tfloat m_stiffness;\n\tfloat m_damping;\n\tfloat m_bias;\n\n\t// Solver shared\n\tb2Vec2 m_localAnchorA;\n\tb2Vec2 m_localAnchorB;\n\tfloat m_referenceAngle;\n\tfloat m_gamma;\n\tb2Vec3 m_impulse;\n\n\t// Solver temp\n\tint32 m_indexA;\n\tint32 m_indexB;\n\tb2Vec2 m_rA;\n\tb2Vec2 m_rB;\n\tb2Vec2 m_localCenterA;\n\tb2Vec2 m_localCenterB;\n\tfloat m_invMassA;\n\tfloat m_invMassB;\n\tfloat m_invIA;\n\tfloat m_invIB;\n\tb2Mat33 m_mass;\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_wheel_joint.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_WHEEL_JOINT_H\n#define B2_WHEEL_JOINT_H\n\n#include \"b2_api.h\"\n#include \"b2_joint.h\"\n\n/// Wheel joint definition. This requires defining a line of\n/// motion using an axis and an anchor point. The definition uses local\n/// anchor points and a local axis so that the initial configuration\n/// can violate the constraint slightly. The joint translation is zero\n/// when the local anchor points coincide in world space. Using local\n/// anchors and a local axis helps when saving and loading a game.\nstruct B2_API b2WheelJointDef : public b2JointDef\n{\n\tb2WheelJointDef()\n\t{\n\t\ttype = e_wheelJoint;\n\t\tlocalAnchorA.SetZero();\n\t\tlocalAnchorB.SetZero();\n\t\tlocalAxisA.Set(1.0f, 0.0f);\n\t\tenableLimit = false;\n\t\tlowerTranslation = 0.0f;\n\t\tupperTranslation = 0.0f;\n\t\tenableMotor = false;\n\t\tmaxMotorTorque = 0.0f;\n\t\tmotorSpeed = 0.0f;\n\t\tstiffness = 0.0f;\n\t\tdamping = 0.0f;\n\t}\n\n\t/// Initialize the bodies, anchors, axis, and reference angle using the world\n\t/// anchor and world axis.\n\tvoid Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor, const b2Vec2& axis);\n\n\t/// The local anchor point relative to bodyA's origin.\n\tb2Vec2 localAnchorA;\n\n\t/// The local anchor point relative to bodyB's origin.\n\tb2Vec2 localAnchorB;\n\n\t/// The local translation axis in bodyA.\n\tb2Vec2 localAxisA;\n\n\t/// Enable/disable the joint limit.\n\tbool enableLimit;\n\n\t/// The lower translation limit, usually in meters.\n\tfloat lowerTranslation;\n\n\t/// The upper translation limit, usually in meters.\n\tfloat upperTranslation;\n\n\t/// Enable/disable the joint motor.\n\tbool enableMotor;\n\n\t/// The maximum motor torque, usually in N-m.\n\tfloat maxMotorTorque;\n\n\t/// The desired motor speed in radians per second.\n\tfloat motorSpeed;\n\n\t/// Suspension stiffness. Typically in units N/m.\n\tfloat stiffness;\n\n\t/// Suspension damping. Typically in units of N*s/m.\n\tfloat damping;\n};\n\n/// A wheel joint. This joint provides two degrees of freedom: translation\n/// along an axis fixed in bodyA and rotation in the plane. In other words, it is a point to\n/// line constraint with a rotational motor and a linear spring/damper. The spring/damper is\n/// initialized upon creation. This joint is designed for vehicle suspensions.\nclass B2_API b2WheelJoint : public b2Joint\n{\npublic:\n\tb2Vec2 GetAnchorA() const override;\n\tb2Vec2 GetAnchorB() const override;\n\n\tb2Vec2 GetReactionForce(float inv_dt) const override;\n\tfloat GetReactionTorque(float inv_dt) const override;\n\n\t/// The local anchor point relative to bodyA's origin.\n\tconst b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; }\n\n\t/// The local anchor point relative to bodyB's origin.\n\tconst b2Vec2& GetLocalAnchorB() const  { return m_localAnchorB; }\n\n\t/// The local joint axis relative to bodyA.\n\tconst b2Vec2& GetLocalAxisA() const { return m_localXAxisA; }\n\n\t/// Get the current joint translation, usually in meters.\n\tfloat GetJointTranslation() const;\n\n\t/// Get the current joint linear speed, usually in meters per second.\n\tfloat GetJointLinearSpeed() const;\n\n\t/// Get the current joint angle in radians.\n\tfloat GetJointAngle() const;\n\n\t/// Get the current joint angular speed in radians per second.\n\tfloat GetJointAngularSpeed() const;\n\n\t/// Is the joint limit enabled?\n\tbool IsLimitEnabled() const;\n\n\t/// Enable/disable the joint translation limit.\n\tvoid EnableLimit(bool flag);\n\n\t/// Get the lower joint translation limit, usually in meters.\n\tfloat GetLowerLimit() const;\n\n\t/// Get the upper joint translation limit, usually in meters.\n\tfloat GetUpperLimit() const;\n\n\t/// Set the joint translation limits, usually in meters.\n\tvoid SetLimits(float lower, float upper);\n\n\t/// Is the joint motor enabled?\n\tbool IsMotorEnabled() const;\n\n\t/// Enable/disable the joint motor.\n\tvoid EnableMotor(bool flag);\n\n\t/// Set the motor speed, usually in radians per second.\n\tvoid SetMotorSpeed(float speed);\n\n\t/// Get the motor speed, usually in radians per second.\n\tfloat GetMotorSpeed() const;\n\n\t/// Set/Get the maximum motor force, usually in N-m.\n\tvoid SetMaxMotorTorque(float torque);\n\tfloat GetMaxMotorTorque() const;\n\n\t/// Get the current motor torque given the inverse time step, usually in N-m.\n\tfloat GetMotorTorque(float inv_dt) const;\n\n\t/// Access spring stiffness\n\tvoid SetStiffness(float stiffness);\n\tfloat GetStiffness() const;\n\n\t/// Access damping\n\tvoid SetDamping(float damping);\n\tfloat GetDamping() const;\n\n\t/// Dump to b2Log\n\tvoid Dump() override;\n\n\t///\n\tvoid Draw(b2Draw* draw) const override;\n\nprotected:\n\n\tfriend class b2Joint;\n\tb2WheelJoint(const b2WheelJointDef* def);\n\n\tvoid InitVelocityConstraints(const b2SolverData& data) override;\n\tvoid SolveVelocityConstraints(const b2SolverData& data) override;\n\tbool SolvePositionConstraints(const b2SolverData& data) override;\n\n\tb2Vec2 m_localAnchorA;\n\tb2Vec2 m_localAnchorB;\n\tb2Vec2 m_localXAxisA;\n\tb2Vec2 m_localYAxisA;\n\n\tfloat m_impulse;\n\tfloat m_motorImpulse;\n\tfloat m_springImpulse;\n\n\tfloat m_lowerImpulse;\n\tfloat m_upperImpulse;\n\tfloat m_translation;\n\tfloat m_lowerTranslation;\n\tfloat m_upperTranslation;\n\n\tfloat m_maxMotorTorque;\n\tfloat m_motorSpeed;\n\n\tbool m_enableLimit;\n\tbool m_enableMotor;\n\n\tfloat m_stiffness;\n\tfloat m_damping;\n\n\t// Solver temp\n\tint32 m_indexA;\n\tint32 m_indexB;\n\tb2Vec2 m_localCenterA;\n\tb2Vec2 m_localCenterB;\n\tfloat m_invMassA;\n\tfloat m_invMassB;\n\tfloat m_invIA;\n\tfloat m_invIB;\n\n\tb2Vec2 m_ax, m_ay;\n\tfloat m_sAx, m_sBx;\n\tfloat m_sAy, m_sBy;\n\n\tfloat m_mass;\n\tfloat m_motorMass;\n\tfloat m_axialMass;\n\tfloat m_springMass;\n\n\tfloat m_bias;\n\tfloat m_gamma;\n\n};\n\ninline float b2WheelJoint::GetMotorSpeed() const\n{\n\treturn m_motorSpeed;\n}\n\ninline float b2WheelJoint::GetMaxMotorTorque() const\n{\n\treturn m_maxMotorTorque;\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_world.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_WORLD_H\n#define B2_WORLD_H\n\n#include \"b2_api.h\"\n#include \"b2_block_allocator.h\"\n#include \"b2_contact_manager.h\"\n#include \"b2_math.h\"\n#include \"b2_stack_allocator.h\"\n#include \"b2_time_step.h\"\n#include \"b2_world_callbacks.h\"\n\nstruct b2AABB;\nstruct b2BodyDef;\nstruct b2Color;\nstruct b2JointDef;\nclass b2Body;\nclass b2Draw;\nclass b2Fixture;\nclass b2Joint;\n\n/// The world class manages all physics entities, dynamic simulation,\n/// and asynchronous queries. The world also contains efficient memory\n/// management facilities.\nclass B2_API b2World\n{\npublic:\n\t/// Construct a world object.\n\t/// @param gravity the world gravity vector.\n\tb2World(const b2Vec2& gravity);\n\n\t/// Destruct the world. All physics entities are destroyed and all heap memory is released.\n\t~b2World();\n\n\t/// Register a destruction listener. The listener is owned by you and must\n\t/// remain in scope.\n\tvoid SetDestructionListener(b2DestructionListener* listener);\n\n\t/// Register a contact filter to provide specific control over collision.\n\t/// Otherwise the default filter is used (b2_defaultFilter). The listener is\n\t/// owned by you and must remain in scope.\n\tvoid SetContactFilter(b2ContactFilter* filter);\n\n\t/// Register a contact event listener. The listener is owned by you and must\n\t/// remain in scope.\n\tvoid SetContactListener(b2ContactListener* listener);\n\n\t/// Register a routine for debug drawing. The debug draw functions are called\n\t/// inside with b2World::DebugDraw method. The debug draw object is owned\n\t/// by you and must remain in scope.\n\tvoid SetDebugDraw(b2Draw* debugDraw);\n\n\t/// Create a rigid body given a definition. No reference to the definition\n\t/// is retained.\n\t/// @warning This function is locked during callbacks.\n\tb2Body* CreateBody(const b2BodyDef* def);\n\n\t/// Destroy a rigid body given a definition. No reference to the definition\n\t/// is retained. This function is locked during callbacks.\n\t/// @warning This automatically deletes all associated shapes and joints.\n\t/// @warning This function is locked during callbacks.\n\tvoid DestroyBody(b2Body* body);\n\n\t/// Create a joint to constrain bodies together. No reference to the definition\n\t/// is retained. This may cause the connected bodies to cease colliding.\n\t/// @warning This function is locked during callbacks.\n\tb2Joint* CreateJoint(const b2JointDef* def);\n\n\t/// Destroy a joint. This may cause the connected bodies to begin colliding.\n\t/// @warning This function is locked during callbacks.\n\tvoid DestroyJoint(b2Joint* joint);\n\n\t/// Take a time step. This performs collision detection, integration,\n\t/// and constraint solution.\n\t/// @param timeStep the amount of time to simulate, this should not vary.\n\t/// @param velocityIterations for the velocity constraint solver.\n\t/// @param positionIterations for the position constraint solver.\n\tvoid Step(\tfloat timeStep,\n\t\t\t\tint32 velocityIterations,\n\t\t\t\tint32 positionIterations);\n\n\t/// Manually clear the force buffer on all bodies. By default, forces are cleared automatically\n\t/// after each call to Step. The default behavior is modified by calling SetAutoClearForces.\n\t/// The purpose of this function is to support sub-stepping. Sub-stepping is often used to maintain\n\t/// a fixed sized time step under a variable frame-rate.\n\t/// When you perform sub-stepping you will disable auto clearing of forces and instead call\n\t/// ClearForces after all sub-steps are complete in one pass of your game loop.\n\t/// @see SetAutoClearForces\n\tvoid ClearForces();\n\n\t/// Call this to draw shapes and other debug draw data. This is intentionally non-const.\n\tvoid DebugDraw();\n\n\t/// Query the world for all fixtures that potentially overlap the\n\t/// provided AABB.\n\t/// @param callback a user implemented callback class.\n\t/// @param aabb the query box.\n\tvoid QueryAABB(b2QueryCallback* callback, const b2AABB& aabb) const;\n\n\t/// Ray-cast the world for all fixtures in the path of the ray. Your callback\n\t/// controls whether you get the closest point, any point, or n-points.\n\t/// The ray-cast ignores shapes that contain the starting point.\n\t/// @param callback a user implemented callback class.\n\t/// @param point1 the ray starting point\n\t/// @param point2 the ray ending point\n\tvoid RayCast(b2RayCastCallback* callback, const b2Vec2& point1, const b2Vec2& point2) const;\n\n\t/// Get the world body list. With the returned body, use b2Body::GetNext to get\n\t/// the next body in the world list. A nullptr body indicates the end of the list.\n\t/// @return the head of the world body list.\n\tb2Body* GetBodyList();\n\tconst b2Body* GetBodyList() const;\n\n\t/// Get the world joint list. With the returned joint, use b2Joint::GetNext to get\n\t/// the next joint in the world list. A nullptr joint indicates the end of the list.\n\t/// @return the head of the world joint list.\n\tb2Joint* GetJointList();\n\tconst b2Joint* GetJointList() const;\n\n\t/// Get the world contact list. With the returned contact, use b2Contact::GetNext to get\n\t/// the next contact in the world list. A nullptr contact indicates the end of the list.\n\t/// @return the head of the world contact list.\n\t/// @warning contacts are created and destroyed in the middle of a time step.\n\t/// Use b2ContactListener to avoid missing contacts.\n\tb2Contact* GetContactList();\n\tconst b2Contact* GetContactList() const;\n\n\t/// Enable/disable sleep.\n\tvoid SetAllowSleeping(bool flag);\n\tbool GetAllowSleeping() const { return m_allowSleep; }\n\n\t/// Enable/disable warm starting. For testing.\n\tvoid SetWarmStarting(bool flag) { m_warmStarting = flag; }\n\tbool GetWarmStarting() const { return m_warmStarting; }\n\n\t/// Enable/disable continuous physics. For testing.\n\tvoid SetContinuousPhysics(bool flag) { m_continuousPhysics = flag; }\n\tbool GetContinuousPhysics() const { return m_continuousPhysics; }\n\n\t/// Enable/disable single stepped continuous physics. For testing.\n\tvoid SetSubStepping(bool flag) { m_subStepping = flag; }\n\tbool GetSubStepping() const { return m_subStepping; }\n\n\t/// Get the number of broad-phase proxies.\n\tint32 GetProxyCount() const;\n\n\t/// Get the number of bodies.\n\tint32 GetBodyCount() const;\n\n\t/// Get the number of joints.\n\tint32 GetJointCount() const;\n\n\t/// Get the number of contacts (each may have 0 or more contact points).\n\tint32 GetContactCount() const;\n\n\t/// Get the height of the dynamic tree.\n\tint32 GetTreeHeight() const;\n\n\t/// Get the balance of the dynamic tree.\n\tint32 GetTreeBalance() const;\n\n\t/// Get the quality metric of the dynamic tree. The smaller the better.\n\t/// The minimum is 1.\n\tfloat GetTreeQuality() const;\n\n\t/// Change the global gravity vector.\n\tvoid SetGravity(const b2Vec2& gravity);\n\n\t/// Get the global gravity vector.\n\tb2Vec2 GetGravity() const;\n\n\t/// Is the world locked (in the middle of a time step).\n\tbool IsLocked() const;\n\n\t/// Set flag to control automatic clearing of forces after each time step.\n\tvoid SetAutoClearForces(bool flag);\n\n\t/// Get the flag that controls automatic clearing of forces after each time step.\n\tbool GetAutoClearForces() const;\n\n\t/// Shift the world origin. Useful for large worlds.\n\t/// The body shift formula is: position -= newOrigin\n\t/// @param newOrigin the new origin with respect to the old origin\n\tvoid ShiftOrigin(const b2Vec2& newOrigin);\n\n\t/// Get the contact manager for testing.\n\tconst b2ContactManager& GetContactManager() const;\n\n\t/// Get the current profile.\n\tconst b2Profile& GetProfile() const;\n\n\t/// Dump the world into the log file.\n\t/// @warning this should be called outside of a time step.\n\tvoid Dump();\n\nprivate:\n\n\tfriend class b2Body;\n\tfriend class b2Fixture;\n\tfriend class b2ContactManager;\n\tfriend class b2Controller;\n\n\tvoid Solve(const b2TimeStep& step);\n\tvoid SolveTOI(const b2TimeStep& step);\n\n\tvoid DrawShape(b2Fixture* shape, const b2Transform& xf, const b2Color& color);\n\n\tb2BlockAllocator m_blockAllocator;\n\tb2StackAllocator m_stackAllocator;\n\n\tb2ContactManager m_contactManager;\n\n\tb2Body* m_bodyList;\n\tb2Joint* m_jointList;\n\n\tint32 m_bodyCount;\n\tint32 m_jointCount;\n\n\tb2Vec2 m_gravity;\n\tbool m_allowSleep;\n\n\tb2DestructionListener* m_destructionListener;\n\tb2Draw* m_debugDraw;\n\n\t// This is used to compute the time step ratio to\n\t// support a variable time step.\n\tfloat m_inv_dt0;\n\n\tbool m_newContacts;\n\tbool m_locked;\n\tbool m_clearForces;\n\n\t// These are for debugging the solver.\n\tbool m_warmStarting;\n\tbool m_continuousPhysics;\n\tbool m_subStepping;\n\n\tbool m_stepComplete;\n\n\tb2Profile m_profile;\n};\n\ninline b2Body* b2World::GetBodyList()\n{\n\treturn m_bodyList;\n}\n\ninline const b2Body* b2World::GetBodyList() const\n{\n\treturn m_bodyList;\n}\n\ninline b2Joint* b2World::GetJointList()\n{\n\treturn m_jointList;\n}\n\ninline const b2Joint* b2World::GetJointList() const\n{\n\treturn m_jointList;\n}\n\ninline b2Contact* b2World::GetContactList()\n{\n\treturn m_contactManager.m_contactList;\n}\n\ninline const b2Contact* b2World::GetContactList() const\n{\n\treturn m_contactManager.m_contactList;\n}\n\ninline int32 b2World::GetBodyCount() const\n{\n\treturn m_bodyCount;\n}\n\ninline int32 b2World::GetJointCount() const\n{\n\treturn m_jointCount;\n}\n\ninline int32 b2World::GetContactCount() const\n{\n\treturn m_contactManager.m_contactCount;\n}\n\ninline void b2World::SetGravity(const b2Vec2& gravity)\n{\n\tm_gravity = gravity;\n}\n\ninline b2Vec2 b2World::GetGravity() const\n{\n\treturn m_gravity;\n}\n\ninline bool b2World::IsLocked() const\n{\n\treturn m_locked;\n}\n\ninline void b2World::SetAutoClearForces(bool flag)\n{\n\tm_clearForces = flag;\n}\n\n/// Get the flag that controls automatic clearing of forces after each time step.\ninline bool b2World::GetAutoClearForces() const\n{\n\treturn m_clearForces;\n}\n\ninline const b2ContactManager& b2World::GetContactManager() const\n{\n\treturn m_contactManager;\n}\n\ninline const b2Profile& b2World::GetProfile() const\n{\n\treturn m_profile;\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/b2_world_callbacks.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_WORLD_CALLBACKS_H\n#define B2_WORLD_CALLBACKS_H\n\n#include \"b2_api.h\"\n#include \"b2_settings.h\"\n\nstruct b2Vec2;\nstruct b2Transform;\nclass b2Fixture;\nclass b2Body;\nclass b2Joint;\nclass b2Contact;\nstruct b2ContactResult;\nstruct b2Manifold;\n\n/// Joints and fixtures are destroyed when their associated\n/// body is destroyed. Implement this listener so that you\n/// may nullify references to these joints and shapes.\nclass B2_API b2DestructionListener\n{\npublic:\n\tvirtual ~b2DestructionListener() {}\n\n\t/// Called when any joint is about to be destroyed due\n\t/// to the destruction of one of its attached bodies.\n\tvirtual void SayGoodbye(b2Joint* joint) = 0;\n\n\t/// Called when any fixture is about to be destroyed due\n\t/// to the destruction of its parent body.\n\tvirtual void SayGoodbye(b2Fixture* fixture) = 0;\n};\n\n/// Implement this class to provide collision filtering. In other words, you can implement\n/// this class if you want finer control over contact creation.\nclass B2_API b2ContactFilter\n{\npublic:\n\tvirtual ~b2ContactFilter() {}\n\n\t/// Return true if contact calculations should be performed between these two shapes.\n\t/// @warning for performance reasons this is only called when the AABBs begin to overlap.\n\tvirtual bool ShouldCollide(b2Fixture* fixtureA, b2Fixture* fixtureB);\n};\n\n/// Contact impulses for reporting. Impulses are used instead of forces because\n/// sub-step forces may approach infinity for rigid body collisions. These\n/// match up one-to-one with the contact points in b2Manifold.\nstruct B2_API b2ContactImpulse\n{\n\tfloat normalImpulses[b2_maxManifoldPoints];\n\tfloat tangentImpulses[b2_maxManifoldPoints];\n\tint32 count;\n};\n\n/// Implement this class to get contact information. You can use these results for\n/// things like sounds and game logic. You can also get contact results by\n/// traversing the contact lists after the time step. However, you might miss\n/// some contacts because continuous physics leads to sub-stepping.\n/// Additionally you may receive multiple callbacks for the same contact in a\n/// single time step.\n/// You should strive to make your callbacks efficient because there may be\n/// many callbacks per time step.\n/// @warning You cannot create/destroy Box2D entities inside these callbacks.\nclass B2_API b2ContactListener\n{\npublic:\n\tvirtual ~b2ContactListener() {}\n\n\t/// Called when two fixtures begin to touch.\n\tvirtual void BeginContact(b2Contact* contact) { B2_NOT_USED(contact); }\n\n\t/// Called when two fixtures cease to touch.\n\tvirtual void EndContact(b2Contact* contact) { B2_NOT_USED(contact); }\n\n\t/// This is called after a contact is updated. This allows you to inspect a\n\t/// contact before it goes to the solver. If you are careful, you can modify the\n\t/// contact manifold (e.g. disable contact).\n\t/// A copy of the old manifold is provided so that you can detect changes.\n\t/// Note: this is called only for awake bodies.\n\t/// Note: this is called even when the number of contact points is zero.\n\t/// Note: this is not called for sensors.\n\t/// Note: if you set the number of contact points to zero, you will not\n\t/// get an EndContact callback. However, you may get a BeginContact callback\n\t/// the next step.\n\tvirtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold)\n\t{\n\t\tB2_NOT_USED(contact);\n\t\tB2_NOT_USED(oldManifold);\n\t}\n\n\t/// This lets you inspect a contact after the solver is finished. This is useful\n\t/// for inspecting impulses.\n\t/// Note: the contact manifold does not include time of impact impulses, which can be\n\t/// arbitrarily large if the sub-step is small. Hence the impulse is provided explicitly\n\t/// in a separate data structure.\n\t/// Note: this is only called for contacts that are touching, solid, and awake.\n\tvirtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse)\n\t{\n\t\tB2_NOT_USED(contact);\n\t\tB2_NOT_USED(impulse);\n\t}\n};\n\n/// Callback class for AABB queries.\n/// See b2World::Query\nclass B2_API b2QueryCallback\n{\npublic:\n\tvirtual ~b2QueryCallback() {}\n\n\t/// Called for each fixture found in the query AABB.\n\t/// @return false to terminate the query.\n\tvirtual bool ReportFixture(b2Fixture* fixture) = 0;\n};\n\n/// Callback class for ray casts.\n/// See b2World::RayCast\nclass B2_API b2RayCastCallback\n{\npublic:\n\tvirtual ~b2RayCastCallback() {}\n\n\t/// Called for each fixture found in the query. You control how the ray cast\n\t/// proceeds by returning a float:\n\t/// return -1: ignore this fixture and continue\n\t/// return 0: terminate the ray cast\n\t/// return fraction: clip the ray to this point\n\t/// return 1: don't clip the ray and continue\n\t/// @param fixture the fixture hit by the ray\n\t/// @param point the point of initial intersection\n\t/// @param normal the normal vector at the point of intersection\n\t/// @param fraction the fraction along the ray at the point of intersection\n\t/// @return -1 to filter, 0 to terminate, fraction to clip the ray for\n\t/// closest hit, 1 to continue\n\tvirtual float ReportFixture(\tb2Fixture* fixture, const b2Vec2& point,\n\t\t\t\t\t\t\t\t\tconst b2Vec2& normal, float fraction) = 0;\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/collision/b2_broad_phase.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_broad_phase.h\"\n#include <string.h>\n\nb2BroadPhase::b2BroadPhase()\n{\n\tm_proxyCount = 0;\n\n\tm_pairCapacity = 16;\n\tm_pairCount = 0;\n\tm_pairBuffer = (b2Pair*)b2Alloc(m_pairCapacity * sizeof(b2Pair));\n\n\tm_moveCapacity = 16;\n\tm_moveCount = 0;\n\tm_moveBuffer = (int32*)b2Alloc(m_moveCapacity * sizeof(int32));\n}\n\nb2BroadPhase::~b2BroadPhase()\n{\n\tb2Free(m_moveBuffer);\n\tb2Free(m_pairBuffer);\n}\n\nint32 b2BroadPhase::CreateProxy(const b2AABB& aabb, void* userData)\n{\n\tint32 proxyId = m_tree.CreateProxy(aabb, userData);\n\t++m_proxyCount;\n\tBufferMove(proxyId);\n\treturn proxyId;\n}\n\nvoid b2BroadPhase::DestroyProxy(int32 proxyId)\n{\n\tUnBufferMove(proxyId);\n\t--m_proxyCount;\n\tm_tree.DestroyProxy(proxyId);\n}\n\nvoid b2BroadPhase::MoveProxy(int32 proxyId, const b2AABB& aabb, const b2Vec2& displacement)\n{\n\tbool buffer = m_tree.MoveProxy(proxyId, aabb, displacement);\n\tif (buffer)\n\t{\n\t\tBufferMove(proxyId);\n\t}\n}\n\nvoid b2BroadPhase::TouchProxy(int32 proxyId)\n{\n\tBufferMove(proxyId);\n}\n\nvoid b2BroadPhase::BufferMove(int32 proxyId)\n{\n\tif (m_moveCount == m_moveCapacity)\n\t{\n\t\tint32* oldBuffer = m_moveBuffer;\n\t\tm_moveCapacity *= 2;\n\t\tm_moveBuffer = (int32*)b2Alloc(m_moveCapacity * sizeof(int32));\n\t\tmemcpy(m_moveBuffer, oldBuffer, m_moveCount * sizeof(int32));\n\t\tb2Free(oldBuffer);\n\t}\n\n\tm_moveBuffer[m_moveCount] = proxyId;\n\t++m_moveCount;\n}\n\nvoid b2BroadPhase::UnBufferMove(int32 proxyId)\n{\n\tfor (int32 i = 0; i < m_moveCount; ++i)\n\t{\n\t\tif (m_moveBuffer[i] == proxyId)\n\t\t{\n\t\t\tm_moveBuffer[i] = e_nullProxy;\n\t\t}\n\t}\n}\n\n// This is called from b2DynamicTree::Query when we are gathering pairs.\nbool b2BroadPhase::QueryCallback(int32 proxyId)\n{\n\t// A proxy cannot form a pair with itself.\n\tif (proxyId == m_queryProxyId)\n\t{\n\t\treturn true;\n\t}\n\n\tconst bool moved = m_tree.WasMoved(proxyId);\n\tif (moved && proxyId > m_queryProxyId)\n\t{\n\t\t// Both proxies are moving. Avoid duplicate pairs.\n\t\treturn true;\n\t}\n\n\t// Grow the pair buffer as needed.\n\tif (m_pairCount == m_pairCapacity)\n\t{\n\t\tb2Pair* oldBuffer = m_pairBuffer;\n\t\tm_pairCapacity = m_pairCapacity + (m_pairCapacity >> 1);\n\t\tm_pairBuffer = (b2Pair*)b2Alloc(m_pairCapacity * sizeof(b2Pair));\n\t\tmemcpy(m_pairBuffer, oldBuffer, m_pairCount * sizeof(b2Pair));\n\t\tb2Free(oldBuffer);\n\t}\n\n\tm_pairBuffer[m_pairCount].proxyIdA = b2Min(proxyId, m_queryProxyId);\n\tm_pairBuffer[m_pairCount].proxyIdB = b2Max(proxyId, m_queryProxyId);\n\t++m_pairCount;\n\n\treturn true;\n}\n"
  },
  {
    "path": "src/libraries/box2d/collision/b2_chain_shape.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_chain_shape.h\"\n#include \"box2d/b2_edge_shape.h\"\n\n#include \"box2d/b2_block_allocator.h\"\n\n#include <new>\n#include <string.h>\n\nb2ChainShape::~b2ChainShape()\n{\n\tClear();\n}\n\nvoid b2ChainShape::Clear()\n{\n\tb2Free(m_vertices);\n\tm_vertices = nullptr;\n\tm_count = 0;\n}\n\nvoid b2ChainShape::CreateLoop(const b2Vec2* vertices, int32 count)\n{\n\tb2Assert(m_vertices == nullptr && m_count == 0);\n\tb2Assert(count >= 3);\n\tif (count < 3)\n\t{\n\t\treturn;\n\t}\n\n\tfor (int32 i = 1; i < count; ++i)\n\t{\n\t\tb2Vec2 v1 = vertices[i-1];\n\t\tb2Vec2 v2 = vertices[i];\n\t\t// If the code crashes here, it means your vertices are too close together.\n\t\tb2Assert(b2DistanceSquared(v1, v2) > b2_linearSlop * b2_linearSlop);\n\t}\n\n\tm_count = count + 1;\n\tm_vertices = (b2Vec2*)b2Alloc(m_count * sizeof(b2Vec2));\n\tmemcpy(m_vertices, vertices, count * sizeof(b2Vec2));\n\tm_vertices[count] = m_vertices[0];\n\tm_prevVertex = m_vertices[m_count - 2];\n\tm_nextVertex = m_vertices[1];\n}\n\nvoid b2ChainShape::CreateChain(const b2Vec2* vertices, int32 count,\tconst b2Vec2& prevVertex, const b2Vec2& nextVertex)\n{\n\tb2Assert(m_vertices == nullptr && m_count == 0);\n\tb2Assert(count >= 2);\n\tfor (int32 i = 1; i < count; ++i)\n\t{\n\t\t// If the code crashes here, it means your vertices are too close together.\n\t\tb2Assert(b2DistanceSquared(vertices[i-1], vertices[i]) > b2_linearSlop * b2_linearSlop);\n\t}\n\n\tm_count = count;\n\tm_vertices = (b2Vec2*)b2Alloc(count * sizeof(b2Vec2));\n\tmemcpy(m_vertices, vertices, m_count * sizeof(b2Vec2));\n\n\tm_prevVertex = prevVertex;\n\tm_nextVertex = nextVertex;\n}\n\nb2Shape* b2ChainShape::Clone(b2BlockAllocator* allocator) const\n{\n\tvoid* mem = allocator->Allocate(sizeof(b2ChainShape));\n\tb2ChainShape* clone = new (mem) b2ChainShape;\n\tclone->CreateChain(m_vertices, m_count, m_prevVertex, m_nextVertex);\n\treturn clone;\n}\n\nint32 b2ChainShape::GetChildCount() const\n{\n\t// edge count = vertex count - 1\n\treturn m_count - 1;\n}\n\nvoid b2ChainShape::GetChildEdge(b2EdgeShape* edge, int32 index) const\n{\n\tb2Assert(0 <= index && index < m_count - 1);\n\tedge->m_type = b2Shape::e_edge;\n\tedge->m_radius = m_radius;\n\n\tedge->m_vertex1 = m_vertices[index + 0];\n\tedge->m_vertex2 = m_vertices[index + 1];\n\tedge->m_oneSided = true;\n\n\tif (index > 0)\n\t{\n\t\tedge->m_vertex0 = m_vertices[index - 1];\n\t}\n\telse\n\t{\n\t\tedge->m_vertex0 = m_prevVertex;\n\t}\n\n\tif (index < m_count - 2)\n\t{\n\t\tedge->m_vertex3 = m_vertices[index + 2];\n\t}\n\telse\n\t{\n\t\tedge->m_vertex3 = m_nextVertex;\n\t}\n}\n\nbool b2ChainShape::TestPoint(const b2Transform& xf, const b2Vec2& p) const\n{\n\tB2_NOT_USED(xf);\n\tB2_NOT_USED(p);\n\treturn false;\n}\n\nbool b2ChainShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input,\n\t\t\t\t\t\t\tconst b2Transform& xf, int32 childIndex) const\n{\n\tb2Assert(childIndex < m_count);\n\n\tb2EdgeShape edgeShape;\n\n\tint32 i1 = childIndex;\n\tint32 i2 = childIndex + 1;\n\tif (i2 == m_count)\n\t{\n\t\ti2 = 0;\n\t}\n\n\tedgeShape.m_vertex1 = m_vertices[i1];\n\tedgeShape.m_vertex2 = m_vertices[i2];\n\n\treturn edgeShape.RayCast(output, input, xf, 0);\n}\n\nvoid b2ChainShape::ComputeAABB(b2AABB* aabb, const b2Transform& xf, int32 childIndex) const\n{\n\tb2Assert(childIndex < m_count);\n\n\tint32 i1 = childIndex;\n\tint32 i2 = childIndex + 1;\n\tif (i2 == m_count)\n\t{\n\t\ti2 = 0;\n\t}\n\n\tb2Vec2 v1 = b2Mul(xf, m_vertices[i1]);\n\tb2Vec2 v2 = b2Mul(xf, m_vertices[i2]);\n\n\tb2Vec2 lower = b2Min(v1, v2);\n\tb2Vec2 upper = b2Max(v1, v2);\n\n\tb2Vec2 r(m_radius, m_radius);\n\taabb->lowerBound = lower - r;\n\taabb->upperBound = upper + r;\n}\n\nvoid b2ChainShape::ComputeMass(b2MassData* massData, float density) const\n{\n\tB2_NOT_USED(density);\n\n\tmassData->mass = 0.0f;\n\tmassData->center.SetZero();\n\tmassData->I = 0.0f;\n}\n"
  },
  {
    "path": "src/libraries/box2d/collision/b2_circle_shape.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_circle_shape.h\"\n#include \"box2d/b2_block_allocator.h\"\n\n#include <new>\n\nb2Shape* b2CircleShape::Clone(b2BlockAllocator* allocator) const\n{\n\tvoid* mem = allocator->Allocate(sizeof(b2CircleShape));\n\tb2CircleShape* clone = new (mem) b2CircleShape;\n\t*clone = *this;\n\treturn clone;\n}\n\nint32 b2CircleShape::GetChildCount() const\n{\n\treturn 1;\n}\n\nbool b2CircleShape::TestPoint(const b2Transform& transform, const b2Vec2& p) const\n{\n\tb2Vec2 center = transform.p + b2Mul(transform.q, m_p);\n\tb2Vec2 d = p - center;\n\treturn b2Dot(d, d) <= m_radius * m_radius;\n}\n\n// Collision Detection in Interactive 3D Environments by Gino van den Bergen\n// From Section 3.1.2\n// x = s + a * r\n// norm(x) = radius\nbool b2CircleShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input,\n\t\t\t\t\t\t\tconst b2Transform& transform, int32 childIndex) const\n{\n\tB2_NOT_USED(childIndex);\n\n\tb2Vec2 position = transform.p + b2Mul(transform.q, m_p);\n\tb2Vec2 s = input.p1 - position;\n\tfloat b = b2Dot(s, s) - m_radius * m_radius;\n\n\t// Solve quadratic equation.\n\tb2Vec2 r = input.p2 - input.p1;\n\tfloat c =  b2Dot(s, r);\n\tfloat rr = b2Dot(r, r);\n\tfloat sigma = c * c - rr * b;\n\n\t// Check for negative discriminant and short segment.\n\tif (sigma < 0.0f || rr < b2_epsilon)\n\t{\n\t\treturn false;\n\t}\n\n\t// Find the point of intersection of the line with the circle.\n\tfloat a = -(c + b2Sqrt(sigma));\n\n\t// Is the intersection point on the segment?\n\tif (0.0f <= a && a <= input.maxFraction * rr)\n\t{\n\t\ta /= rr;\n\t\toutput->fraction = a;\n\t\toutput->normal = s + a * r;\n\t\toutput->normal.Normalize();\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nvoid b2CircleShape::ComputeAABB(b2AABB* aabb, const b2Transform& transform, int32 childIndex) const\n{\n\tB2_NOT_USED(childIndex);\n\n\tb2Vec2 p = transform.p + b2Mul(transform.q, m_p);\n\taabb->lowerBound.Set(p.x - m_radius, p.y - m_radius);\n\taabb->upperBound.Set(p.x + m_radius, p.y + m_radius);\n}\n\nvoid b2CircleShape::ComputeMass(b2MassData* massData, float density) const\n{\n\tmassData->mass = density * b2_pi * m_radius * m_radius;\n\tmassData->center = m_p;\n\n\t// inertia about the local origin\n\tmassData->I = massData->mass * (0.5f * m_radius * m_radius + b2Dot(m_p, m_p));\n}\n"
  },
  {
    "path": "src/libraries/box2d/collision/b2_collide_circle.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_collision.h\"\n#include \"box2d/b2_circle_shape.h\"\n#include \"box2d/b2_polygon_shape.h\"\n\nvoid b2CollideCircles(\n\tb2Manifold* manifold,\n\tconst b2CircleShape* circleA, const b2Transform& xfA,\n\tconst b2CircleShape* circleB, const b2Transform& xfB)\n{\n\tmanifold->pointCount = 0;\n\n\tb2Vec2 pA = b2Mul(xfA, circleA->m_p);\n\tb2Vec2 pB = b2Mul(xfB, circleB->m_p);\n\n\tb2Vec2 d = pB - pA;\n\tfloat distSqr = b2Dot(d, d);\n\tfloat rA = circleA->m_radius, rB = circleB->m_radius;\n\tfloat radius = rA + rB;\n\tif (distSqr > radius * radius)\n\t{\n\t\treturn;\n\t}\n\n\tmanifold->type = b2Manifold::e_circles;\n\tmanifold->localPoint = circleA->m_p;\n\tmanifold->localNormal.SetZero();\n\tmanifold->pointCount = 1;\n\n\tmanifold->points[0].localPoint = circleB->m_p;\n\tmanifold->points[0].id.key = 0;\n}\n\nvoid b2CollidePolygonAndCircle(\n\tb2Manifold* manifold,\n\tconst b2PolygonShape* polygonA, const b2Transform& xfA,\n\tconst b2CircleShape* circleB, const b2Transform& xfB)\n{\n\tmanifold->pointCount = 0;\n\n\t// Compute circle position in the frame of the polygon.\n\tb2Vec2 c = b2Mul(xfB, circleB->m_p);\n\tb2Vec2 cLocal = b2MulT(xfA, c);\n\n\t// Find the min separating edge.\n\tint32 normalIndex = 0;\n\tfloat separation = -b2_maxFloat;\n\tfloat radius = polygonA->m_radius + circleB->m_radius;\n\tint32 vertexCount = polygonA->m_count;\n\tconst b2Vec2* vertices = polygonA->m_vertices;\n\tconst b2Vec2* normals = polygonA->m_normals;\n\n\tfor (int32 i = 0; i < vertexCount; ++i)\n\t{\n\t\tfloat s = b2Dot(normals[i], cLocal - vertices[i]);\n\n\t\tif (s > radius)\n\t\t{\n\t\t\t// Early out.\n\t\t\treturn;\n\t\t}\n\n\t\tif (s > separation)\n\t\t{\n\t\t\tseparation = s;\n\t\t\tnormalIndex = i;\n\t\t}\n\t}\n\n\t// Vertices that subtend the incident face.\n\tint32 vertIndex1 = normalIndex;\n\tint32 vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0;\n\tb2Vec2 v1 = vertices[vertIndex1];\n\tb2Vec2 v2 = vertices[vertIndex2];\n\n\t// If the center is inside the polygon ...\n\tif (separation < b2_epsilon)\n\t{\n\t\tmanifold->pointCount = 1;\n\t\tmanifold->type = b2Manifold::e_faceA;\n\t\tmanifold->localNormal = normals[normalIndex];\n\t\tmanifold->localPoint = 0.5f * (v1 + v2);\n\t\tmanifold->points[0].localPoint = circleB->m_p;\n\t\tmanifold->points[0].id.key = 0;\n\t\treturn;\n\t}\n\n\t// Compute barycentric coordinates\n\tfloat u1 = b2Dot(cLocal - v1, v2 - v1);\n\tfloat u2 = b2Dot(cLocal - v2, v1 - v2);\n\tif (u1 <= 0.0f)\n\t{\n\t\tif (b2DistanceSquared(cLocal, v1) > radius * radius)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tmanifold->pointCount = 1;\n\t\tmanifold->type = b2Manifold::e_faceA;\n\t\tmanifold->localNormal = cLocal - v1;\n\t\tmanifold->localNormal.Normalize();\n\t\tmanifold->localPoint = v1;\n\t\tmanifold->points[0].localPoint = circleB->m_p;\n\t\tmanifold->points[0].id.key = 0;\n\t}\n\telse if (u2 <= 0.0f)\n\t{\n\t\tif (b2DistanceSquared(cLocal, v2) > radius * radius)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tmanifold->pointCount = 1;\n\t\tmanifold->type = b2Manifold::e_faceA;\n\t\tmanifold->localNormal = cLocal - v2;\n\t\tmanifold->localNormal.Normalize();\n\t\tmanifold->localPoint = v2;\n\t\tmanifold->points[0].localPoint = circleB->m_p;\n\t\tmanifold->points[0].id.key = 0;\n\t}\n\telse\n\t{\n\t\tb2Vec2 faceCenter = 0.5f * (v1 + v2);\n\t\tfloat s = b2Dot(cLocal - faceCenter, normals[vertIndex1]);\n\t\tif (s > radius)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tmanifold->pointCount = 1;\n\t\tmanifold->type = b2Manifold::e_faceA;\n\t\tmanifold->localNormal = normals[vertIndex1];\n\t\tmanifold->localPoint = faceCenter;\n\t\tmanifold->points[0].localPoint = circleB->m_p;\n\t\tmanifold->points[0].id.key = 0;\n\t}\n}\n"
  },
  {
    "path": "src/libraries/box2d/collision/b2_collide_edge.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_collision.h\"\n#include \"box2d/b2_circle_shape.h\"\n#include \"box2d/b2_edge_shape.h\"\n#include \"box2d/b2_polygon_shape.h\"\n\n\n// Compute contact points for edge versus circle.\n// This accounts for edge connectivity.\nvoid b2CollideEdgeAndCircle(b2Manifold* manifold,\n\t\t\t\t\t\t\tconst b2EdgeShape* edgeA, const b2Transform& xfA,\n\t\t\t\t\t\t\tconst b2CircleShape* circleB, const b2Transform& xfB)\n{\n\tmanifold->pointCount = 0;\n\t\n\t// Compute circle in frame of edge\n\tb2Vec2 Q = b2MulT(xfA, b2Mul(xfB, circleB->m_p));\n\t\n\tb2Vec2 A = edgeA->m_vertex1, B = edgeA->m_vertex2;\n\tb2Vec2 e = B - A;\n\t\n\t// Normal points to the right for a CCW winding\n\tb2Vec2 n(e.y, -e.x);\n\tfloat offset = b2Dot(n, Q - A);\n\n\tbool oneSided = edgeA->m_oneSided;\n\tif (oneSided && offset < 0.0f)\n\t{\n\t\treturn;\n\t}\n\n\t// Barycentric coordinates\n\tfloat u = b2Dot(e, B - Q);\n\tfloat v = b2Dot(e, Q - A);\n\t\n\tfloat radius = edgeA->m_radius + circleB->m_radius;\n\t\n\tb2ContactFeature cf;\n\tcf.indexB = 0;\n\tcf.typeB = b2ContactFeature::e_vertex;\n\t\n\t// Region A\n\tif (v <= 0.0f)\n\t{\n\t\tb2Vec2 P = A;\n\t\tb2Vec2 d = Q - P;\n\t\tfloat dd = b2Dot(d, d);\n\t\tif (dd > radius * radius)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// Is there an edge connected to A?\n\t\tif (edgeA->m_oneSided)\n\t\t{\n\t\t\tb2Vec2 A1 = edgeA->m_vertex0;\n\t\t\tb2Vec2 B1 = A;\n\t\t\tb2Vec2 e1 = B1 - A1;\n\t\t\tfloat u1 = b2Dot(e1, B1 - Q);\n\t\t\t\n\t\t\t// Is the circle in Region AB of the previous edge?\n\t\t\tif (u1 > 0.0f)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t\n\t\tcf.indexA = 0;\n\t\tcf.typeA = b2ContactFeature::e_vertex;\n\t\tmanifold->pointCount = 1;\n\t\tmanifold->type = b2Manifold::e_circles;\n\t\tmanifold->localNormal.SetZero();\n\t\tmanifold->localPoint = P;\n\t\tmanifold->points[0].id.key = 0;\n\t\tmanifold->points[0].id.cf = cf;\n\t\tmanifold->points[0].localPoint = circleB->m_p;\n\t\treturn;\n\t}\n\t\n\t// Region B\n\tif (u <= 0.0f)\n\t{\n\t\tb2Vec2 P = B;\n\t\tb2Vec2 d = Q - P;\n\t\tfloat dd = b2Dot(d, d);\n\t\tif (dd > radius * radius)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// Is there an edge connected to B?\n\t\tif (edgeA->m_oneSided)\n\t\t{\n\t\t\tb2Vec2 B2 = edgeA->m_vertex3;\n\t\t\tb2Vec2 A2 = B;\n\t\t\tb2Vec2 e2 = B2 - A2;\n\t\t\tfloat v2 = b2Dot(e2, Q - A2);\n\t\t\t\n\t\t\t// Is the circle in Region AB of the next edge?\n\t\t\tif (v2 > 0.0f)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t\n\t\tcf.indexA = 1;\n\t\tcf.typeA = b2ContactFeature::e_vertex;\n\t\tmanifold->pointCount = 1;\n\t\tmanifold->type = b2Manifold::e_circles;\n\t\tmanifold->localNormal.SetZero();\n\t\tmanifold->localPoint = P;\n\t\tmanifold->points[0].id.key = 0;\n\t\tmanifold->points[0].id.cf = cf;\n\t\tmanifold->points[0].localPoint = circleB->m_p;\n\t\treturn;\n\t}\n\t\n\t// Region AB\n\tfloat den = b2Dot(e, e);\n\tb2Assert(den > 0.0f);\n\tb2Vec2 P = (1.0f / den) * (u * A + v * B);\n\tb2Vec2 d = Q - P;\n\tfloat dd = b2Dot(d, d);\n\tif (dd > radius * radius)\n\t{\n\t\treturn;\n\t}\n\t\n\tif (offset < 0.0f)\n\t{\n\t\tn.Set(-n.x, -n.y);\n\t}\n\tn.Normalize();\n\t\n\tcf.indexA = 0;\n\tcf.typeA = b2ContactFeature::e_face;\n\tmanifold->pointCount = 1;\n\tmanifold->type = b2Manifold::e_faceA;\n\tmanifold->localNormal = n;\n\tmanifold->localPoint = A;\n\tmanifold->points[0].id.key = 0;\n\tmanifold->points[0].id.cf = cf;\n\tmanifold->points[0].localPoint = circleB->m_p;\n}\n\n// This structure is used to keep track of the best separating axis.\nstruct b2EPAxis\n{\n\tenum Type\n\t{\n\t\te_unknown,\n\t\te_edgeA,\n\t\te_edgeB\n\t};\n\t\n\tb2Vec2 normal;\n\tType type;\n\tint32 index;\n\tfloat separation;\n};\n\n// This holds polygon B expressed in frame A.\nstruct b2TempPolygon\n{\n\tb2Vec2 vertices[b2_maxPolygonVertices];\n\tb2Vec2 normals[b2_maxPolygonVertices];\n\tint32 count;\n};\n\n// Reference face used for clipping\nstruct b2ReferenceFace\n{\n\tint32 i1, i2;\n\tb2Vec2 v1, v2;\n\tb2Vec2 normal;\n\t\n\tb2Vec2 sideNormal1;\n\tfloat sideOffset1;\n\t\n\tb2Vec2 sideNormal2;\n\tfloat sideOffset2;\n};\n\nstatic b2EPAxis b2ComputeEdgeSeparation(const b2TempPolygon& polygonB, const b2Vec2& v1, const b2Vec2& normal1)\n{\n\tb2EPAxis axis;\n\taxis.type = b2EPAxis::e_edgeA;\n\taxis.index = -1;\n\taxis.separation = -FLT_MAX;\n\taxis.normal.SetZero();\n\n\tb2Vec2 axes[2] = { normal1, -normal1 };\n\n\t// Find axis with least overlap (min-max problem)\n\tfor (int32 j = 0; j < 2; ++j)\n\t{\n\t\tfloat sj = FLT_MAX;\n\n\t\t// Find deepest polygon vertex along axis j\n\t\tfor (int32 i = 0; i < polygonB.count; ++i)\n\t\t{\n\t\t\tfloat si = b2Dot(axes[j], polygonB.vertices[i] - v1);\n\t\t\tif (si < sj)\n\t\t\t{\n\t\t\t\tsj = si;\n\t\t\t}\n\t\t}\n\n\t\tif (sj > axis.separation)\n\t\t{\n\t\t\taxis.index = j;\n\t\t\taxis.separation = sj;\n\t\t\taxis.normal = axes[j];\n\t\t}\n\t}\n\n\treturn axis;\n}\n\nstatic b2EPAxis b2ComputePolygonSeparation(const b2TempPolygon& polygonB, const b2Vec2& v1, const b2Vec2& v2)\n{\n\tb2EPAxis axis;\n\taxis.type = b2EPAxis::e_unknown;\n\taxis.index = -1;\n\taxis.separation = -FLT_MAX;\n\taxis.normal.SetZero();\n\n\tfor (int32 i = 0; i < polygonB.count; ++i)\n\t{\n\t\tb2Vec2 n = -polygonB.normals[i];\n\n\t\tfloat s1 = b2Dot(n, polygonB.vertices[i] - v1);\n\t\tfloat s2 = b2Dot(n, polygonB.vertices[i] - v2);\n\t\tfloat s = b2Min(s1, s2);\n\n\t\tif (s > axis.separation)\n\t\t{\n\t\t\taxis.type = b2EPAxis::e_edgeB;\n\t\t\taxis.index = i;\n\t\t\taxis.separation = s;\n\t\t\taxis.normal = n;\n\t\t}\n\t}\n\n\treturn axis;\n}\n\nvoid b2CollideEdgeAndPolygon(b2Manifold* manifold,\n\t\t\t\t\t\t\tconst b2EdgeShape* edgeA, const b2Transform& xfA,\n\t\t\t\t\t\t\tconst b2PolygonShape* polygonB, const b2Transform& xfB)\n{\n\tmanifold->pointCount = 0;\n\n\tb2Transform xf = b2MulT(xfA, xfB);\n\n\tb2Vec2 centroidB = b2Mul(xf, polygonB->m_centroid);\n\n\tb2Vec2 v1 = edgeA->m_vertex1;\n\tb2Vec2 v2 = edgeA->m_vertex2;\n\n\tb2Vec2 edge1 = v2 - v1;\n\tedge1.Normalize();\n\n\t// Normal points to the right for a CCW winding\n\tb2Vec2 normal1(edge1.y, -edge1.x);\n\tfloat offset1 = b2Dot(normal1, centroidB - v1);\n\n\tbool oneSided = edgeA->m_oneSided;\n\tif (oneSided && offset1 < 0.0f)\n\t{\n\t\treturn;\n\t}\n\n\t// Get polygonB in frameA\n\tb2TempPolygon tempPolygonB;\n\ttempPolygonB.count = polygonB->m_count;\n\tfor (int32 i = 0; i < polygonB->m_count; ++i)\n\t{\n\t\ttempPolygonB.vertices[i] = b2Mul(xf, polygonB->m_vertices[i]);\n\t\ttempPolygonB.normals[i] = b2Mul(xf.q, polygonB->m_normals[i]);\n\t}\n\n\tfloat radius = polygonB->m_radius + edgeA->m_radius;\n\n\tb2EPAxis edgeAxis = b2ComputeEdgeSeparation(tempPolygonB, v1, normal1);\n\tif (edgeAxis.separation > radius)\n\t{\n\t\treturn;\n\t}\n\n\tb2EPAxis polygonAxis = b2ComputePolygonSeparation(tempPolygonB, v1, v2);\n\tif (polygonAxis.separation > radius)\n\t{\n\t\treturn;\n\t}\n\n\t// Use hysteresis for jitter reduction.\n\tconst float k_relativeTol = 0.98f;\n\tconst float k_absoluteTol = 0.001f;\n\n\tb2EPAxis primaryAxis;\n\tif (polygonAxis.separation - radius > k_relativeTol * (edgeAxis.separation - radius) + k_absoluteTol)\n\t{\n\t\tprimaryAxis = polygonAxis;\n\t}\n\telse\n\t{\n\t\tprimaryAxis = edgeAxis;\n\t}\n\n\tif (oneSided)\n\t{\n\t\t// Smooth collision\n\t\t// See https://box2d.org/posts/2020/06/ghost-collisions/\n\n\t\tb2Vec2 edge0 = v1 - edgeA->m_vertex0;\n\t\tedge0.Normalize();\n\t\tb2Vec2 normal0(edge0.y, -edge0.x);\n\t\tbool convex1 = b2Cross(edge0, edge1) >= 0.0f;\n\n\t\tb2Vec2 edge2 = edgeA->m_vertex3 - v2;\n\t\tedge2.Normalize();\n\t\tb2Vec2 normal2(edge2.y, -edge2.x);\n\t\tbool convex2 = b2Cross(edge1, edge2) >= 0.0f;\n\n\t\tconst float sinTol = 0.1f;\n\t\tbool side1 = b2Dot(primaryAxis.normal, edge1) <= 0.0f;\n\n\t\t// Check Gauss Map\n\t\tif (side1)\n\t\t{\n\t\t\tif (convex1)\n\t\t\t{\n\t\t\t\tif (b2Cross(primaryAxis.normal, normal0) > sinTol)\n\t\t\t\t{\n\t\t\t\t\t// Skip region\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Admit region\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Snap region\n\t\t\t\tprimaryAxis = edgeAxis;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (convex2)\n\t\t\t{\n\t\t\t\tif (b2Cross(normal2, primaryAxis.normal) > sinTol)\n\t\t\t\t{\n\t\t\t\t\t// Skip region\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Admit region\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Snap region\n\t\t\t\tprimaryAxis = edgeAxis;\n\t\t\t}\n\t\t}\n\t}\n\n\tb2ClipVertex clipPoints[2];\n\tb2ReferenceFace ref;\n\tif (primaryAxis.type == b2EPAxis::e_edgeA)\n\t{\n\t\tmanifold->type = b2Manifold::e_faceA;\n\n\t\t// Search for the polygon normal that is most anti-parallel to the edge normal.\n\t\tint32 bestIndex = 0;\n\t\tfloat bestValue = b2Dot(primaryAxis.normal, tempPolygonB.normals[0]);\n\t\tfor (int32 i = 1; i < tempPolygonB.count; ++i)\n\t\t{\n\t\t\tfloat value = b2Dot(primaryAxis.normal, tempPolygonB.normals[i]);\n\t\t\tif (value < bestValue)\n\t\t\t{\n\t\t\t\tbestValue = value;\n\t\t\t\tbestIndex = i;\n\t\t\t}\n\t\t}\n\n\t\tint32 i1 = bestIndex;\n\t\tint32 i2 = i1 + 1 < tempPolygonB.count ? i1 + 1 : 0;\n\n\t\tclipPoints[0].v = tempPolygonB.vertices[i1];\n\t\tclipPoints[0].id.cf.indexA = 0;\n\t\tclipPoints[0].id.cf.indexB = static_cast<uint8>(i1);\n\t\tclipPoints[0].id.cf.typeA = b2ContactFeature::e_face;\n\t\tclipPoints[0].id.cf.typeB = b2ContactFeature::e_vertex;\n\n\t\tclipPoints[1].v = tempPolygonB.vertices[i2];\n\t\tclipPoints[1].id.cf.indexA = 0;\n\t\tclipPoints[1].id.cf.indexB = static_cast<uint8>(i2);\n\t\tclipPoints[1].id.cf.typeA = b2ContactFeature::e_face;\n\t\tclipPoints[1].id.cf.typeB = b2ContactFeature::e_vertex;\n\n\t\tref.i1 = 0;\n\t\tref.i2 = 1;\n\t\tref.v1 = v1;\n\t\tref.v2 = v2;\n\t\tref.normal = primaryAxis.normal;\n\t\tref.sideNormal1 = -edge1;\n\t\tref.sideNormal2 = edge1;\n\t}\n\telse\n\t{\n\t\tmanifold->type = b2Manifold::e_faceB;\n\n\t\tclipPoints[0].v = v2;\n\t\tclipPoints[0].id.cf.indexA = 1;\n\t\tclipPoints[0].id.cf.indexB = static_cast<uint8>(primaryAxis.index);\n\t\tclipPoints[0].id.cf.typeA = b2ContactFeature::e_vertex;\n\t\tclipPoints[0].id.cf.typeB = b2ContactFeature::e_face;\n\n\t\tclipPoints[1].v = v1;\n\t\tclipPoints[1].id.cf.indexA = 0;\n\t\tclipPoints[1].id.cf.indexB = static_cast<uint8>(primaryAxis.index);\t\t\n\t\tclipPoints[1].id.cf.typeA = b2ContactFeature::e_vertex;\n\t\tclipPoints[1].id.cf.typeB = b2ContactFeature::e_face;\n\n\t\tref.i1 = primaryAxis.index;\n\t\tref.i2 = ref.i1 + 1 < tempPolygonB.count ? ref.i1 + 1 : 0;\n\t\tref.v1 = tempPolygonB.vertices[ref.i1];\n\t\tref.v2 = tempPolygonB.vertices[ref.i2];\n\t\tref.normal = tempPolygonB.normals[ref.i1];\n\n\t\t// CCW winding\n\t\tref.sideNormal1.Set(ref.normal.y, -ref.normal.x);\n\t\tref.sideNormal2 = -ref.sideNormal1;\n\t}\n\n\tref.sideOffset1 = b2Dot(ref.sideNormal1, ref.v1);\n\tref.sideOffset2 = b2Dot(ref.sideNormal2, ref.v2);\n\n\t// Clip incident edge against reference face side planes\n\tb2ClipVertex clipPoints1[2];\n\tb2ClipVertex clipPoints2[2];\n\tint32 np;\n\n\t// Clip to side 1\n\tnp = b2ClipSegmentToLine(clipPoints1, clipPoints, ref.sideNormal1, ref.sideOffset1, ref.i1);\n\n\tif (np < b2_maxManifoldPoints)\n\t{\n\t\treturn;\n\t}\n\n\t// Clip to side 2\n\tnp = b2ClipSegmentToLine(clipPoints2, clipPoints1, ref.sideNormal2, ref.sideOffset2, ref.i2);\n\n\tif (np < b2_maxManifoldPoints)\n\t{\n\t\treturn;\n\t}\n\n\t// Now clipPoints2 contains the clipped points.\n\tif (primaryAxis.type == b2EPAxis::e_edgeA)\n\t{\n\t\tmanifold->localNormal = ref.normal;\n\t\tmanifold->localPoint = ref.v1;\n\t}\n\telse\n\t{\n\t\tmanifold->localNormal = polygonB->m_normals[ref.i1];\n\t\tmanifold->localPoint = polygonB->m_vertices[ref.i1];\n\t}\n\n\tint32 pointCount = 0;\n\tfor (int32 i = 0; i < b2_maxManifoldPoints; ++i)\n\t{\n\t\tfloat separation;\n\n\t\tseparation = b2Dot(ref.normal, clipPoints2[i].v - ref.v1);\n\n\t\tif (separation <= radius)\n\t\t{\n\t\t\tb2ManifoldPoint* cp = manifold->points + pointCount;\n\n\t\t\tif (primaryAxis.type == b2EPAxis::e_edgeA)\n\t\t\t{\n\t\t\t\tcp->localPoint = b2MulT(xf, clipPoints2[i].v);\n\t\t\t\tcp->id = clipPoints2[i].id;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tcp->localPoint = clipPoints2[i].v;\n\t\t\t\tcp->id.cf.typeA = clipPoints2[i].id.cf.typeB;\n\t\t\t\tcp->id.cf.typeB = clipPoints2[i].id.cf.typeA;\n\t\t\t\tcp->id.cf.indexA = clipPoints2[i].id.cf.indexB;\n\t\t\t\tcp->id.cf.indexB = clipPoints2[i].id.cf.indexA;\n\t\t\t}\n\n\t\t\t++pointCount;\n\t\t}\n\t}\n\n\tmanifold->pointCount = pointCount;\n}\n"
  },
  {
    "path": "src/libraries/box2d/collision/b2_collide_polygon.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_collision.h\"\n#include \"box2d/b2_polygon_shape.h\"\n\n// Find the max separation between poly1 and poly2 using edge normals from poly1.\nstatic float b2FindMaxSeparation(int32* edgeIndex,\n\t\t\t\t\t\t\t\t const b2PolygonShape* poly1, const b2Transform& xf1,\n\t\t\t\t\t\t\t\t const b2PolygonShape* poly2, const b2Transform& xf2)\n{\n\tint32 count1 = poly1->m_count;\n\tint32 count2 = poly2->m_count;\n\tconst b2Vec2* n1s = poly1->m_normals;\n\tconst b2Vec2* v1s = poly1->m_vertices;\n\tconst b2Vec2* v2s = poly2->m_vertices;\n\tb2Transform xf = b2MulT(xf2, xf1);\n\n\tint32 bestIndex = 0;\n\tfloat maxSeparation = -b2_maxFloat;\n\tfor (int32 i = 0; i < count1; ++i)\n\t{\n\t\t// Get poly1 normal in frame2.\n\t\tb2Vec2 n = b2Mul(xf.q, n1s[i]);\n\t\tb2Vec2 v1 = b2Mul(xf, v1s[i]);\n\n\t\t// Find deepest point for normal i.\n\t\tfloat si = b2_maxFloat;\n\t\tfor (int32 j = 0; j < count2; ++j)\n\t\t{\n\t\t\tfloat sij = b2Dot(n, v2s[j] - v1);\n\t\t\tif (sij < si)\n\t\t\t{\n\t\t\t\tsi = sij;\n\t\t\t}\n\t\t}\n\n\t\tif (si > maxSeparation)\n\t\t{\n\t\t\tmaxSeparation = si;\n\t\t\tbestIndex = i;\n\t\t}\n\t}\n\n\t*edgeIndex = bestIndex;\n\treturn maxSeparation;\n}\n\nstatic void b2FindIncidentEdge(b2ClipVertex c[2],\n\t\t\t\t\t\t\t const b2PolygonShape* poly1, const b2Transform& xf1, int32 edge1,\n\t\t\t\t\t\t\t const b2PolygonShape* poly2, const b2Transform& xf2)\n{\n\tconst b2Vec2* normals1 = poly1->m_normals;\n\n\tint32 count2 = poly2->m_count;\n\tconst b2Vec2* vertices2 = poly2->m_vertices;\n\tconst b2Vec2* normals2 = poly2->m_normals;\n\n\tb2Assert(0 <= edge1 && edge1 < poly1->m_count);\n\n\t// Get the normal of the reference edge in poly2's frame.\n\tb2Vec2 normal1 = b2MulT(xf2.q, b2Mul(xf1.q, normals1[edge1]));\n\n\t// Find the incident edge on poly2.\n\tint32 index = 0;\n\tfloat minDot = b2_maxFloat;\n\tfor (int32 i = 0; i < count2; ++i)\n\t{\n\t\tfloat dot = b2Dot(normal1, normals2[i]);\n\t\tif (dot < minDot)\n\t\t{\n\t\t\tminDot = dot;\n\t\t\tindex = i;\n\t\t}\n\t}\n\n\t// Build the clip vertices for the incident edge.\n\tint32 i1 = index;\n\tint32 i2 = i1 + 1 < count2 ? i1 + 1 : 0;\n\n\tc[0].v = b2Mul(xf2, vertices2[i1]);\n\tc[0].id.cf.indexA = (uint8)edge1;\n\tc[0].id.cf.indexB = (uint8)i1;\n\tc[0].id.cf.typeA = b2ContactFeature::e_face;\n\tc[0].id.cf.typeB = b2ContactFeature::e_vertex;\n\n\tc[1].v = b2Mul(xf2, vertices2[i2]);\n\tc[1].id.cf.indexA = (uint8)edge1;\n\tc[1].id.cf.indexB = (uint8)i2;\n\tc[1].id.cf.typeA = b2ContactFeature::e_face;\n\tc[1].id.cf.typeB = b2ContactFeature::e_vertex;\n}\n\n// Find edge normal of max separation on A - return if separating axis is found\n// Find edge normal of max separation on B - return if separation axis is found\n// Choose reference edge as min(minA, minB)\n// Find incident edge\n// Clip\n\n// The normal points from 1 to 2\nvoid b2CollidePolygons(b2Manifold* manifold,\n\t\t\t\t\t  const b2PolygonShape* polyA, const b2Transform& xfA,\n\t\t\t\t\t  const b2PolygonShape* polyB, const b2Transform& xfB)\n{\n\tmanifold->pointCount = 0;\n\tfloat totalRadius = polyA->m_radius + polyB->m_radius;\n\n\tint32 edgeA = 0;\n\tfloat separationA = b2FindMaxSeparation(&edgeA, polyA, xfA, polyB, xfB);\n\tif (separationA > totalRadius)\n\t\treturn;\n\n\tint32 edgeB = 0;\n\tfloat separationB = b2FindMaxSeparation(&edgeB, polyB, xfB, polyA, xfA);\n\tif (separationB > totalRadius)\n\t\treturn;\n\n\tconst b2PolygonShape* poly1;\t// reference polygon\n\tconst b2PolygonShape* poly2;\t// incident polygon\n\tb2Transform xf1, xf2;\n\tint32 edge1;\t\t\t\t\t// reference edge\n\tuint8 flip;\n\tconst float k_tol = 0.1f * b2_linearSlop;\n\n\tif (separationB > separationA + k_tol)\n\t{\n\t\tpoly1 = polyB;\n\t\tpoly2 = polyA;\n\t\txf1 = xfB;\n\t\txf2 = xfA;\n\t\tedge1 = edgeB;\n\t\tmanifold->type = b2Manifold::e_faceB;\n\t\tflip = 1;\n\t}\n\telse\n\t{\n\t\tpoly1 = polyA;\n\t\tpoly2 = polyB;\n\t\txf1 = xfA;\n\t\txf2 = xfB;\n\t\tedge1 = edgeA;\n\t\tmanifold->type = b2Manifold::e_faceA;\n\t\tflip = 0;\n\t}\n\n\tb2ClipVertex incidentEdge[2];\n\tb2FindIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2);\n\n\tint32 count1 = poly1->m_count;\n\tconst b2Vec2* vertices1 = poly1->m_vertices;\n\n\tint32 iv1 = edge1;\n\tint32 iv2 = edge1 + 1 < count1 ? edge1 + 1 : 0;\n\n\tb2Vec2 v11 = vertices1[iv1];\n\tb2Vec2 v12 = vertices1[iv2];\n\n\tb2Vec2 localTangent = v12 - v11;\n\tlocalTangent.Normalize();\n\t\n\tb2Vec2 localNormal = b2Cross(localTangent, 1.0f);\n\tb2Vec2 planePoint = 0.5f * (v11 + v12);\n\n\tb2Vec2 tangent = b2Mul(xf1.q, localTangent);\n\tb2Vec2 normal = b2Cross(tangent, 1.0f);\n\t\n\tv11 = b2Mul(xf1, v11);\n\tv12 = b2Mul(xf1, v12);\n\n\t// Face offset.\n\tfloat frontOffset = b2Dot(normal, v11);\n\n\t// Side offsets, extended by polytope skin thickness.\n\tfloat sideOffset1 = -b2Dot(tangent, v11) + totalRadius;\n\tfloat sideOffset2 = b2Dot(tangent, v12) + totalRadius;\n\n\t// Clip incident edge against extruded edge1 side edges.\n\tb2ClipVertex clipPoints1[2];\n\tb2ClipVertex clipPoints2[2];\n\tint np;\n\n\t// Clip to box side 1\n\tnp = b2ClipSegmentToLine(clipPoints1, incidentEdge, -tangent, sideOffset1, iv1);\n\n\tif (np < 2)\n\t\treturn;\n\n\t// Clip to negative box side 1\n\tnp = b2ClipSegmentToLine(clipPoints2, clipPoints1,  tangent, sideOffset2, iv2);\n\n\tif (np < 2)\n\t{\n\t\treturn;\n\t}\n\n\t// Now clipPoints2 contains the clipped points.\n\tmanifold->localNormal = localNormal;\n\tmanifold->localPoint = planePoint;\n\n\tint32 pointCount = 0;\n\tfor (int32 i = 0; i < b2_maxManifoldPoints; ++i)\n\t{\n\t\tfloat separation = b2Dot(normal, clipPoints2[i].v) - frontOffset;\n\n\t\tif (separation <= totalRadius)\n\t\t{\n\t\t\tb2ManifoldPoint* cp = manifold->points + pointCount;\n\t\t\tcp->localPoint = b2MulT(xf2, clipPoints2[i].v);\n\t\t\tcp->id = clipPoints2[i].id;\n\t\t\tif (flip)\n\t\t\t{\n\t\t\t\t// Swap features\n\t\t\t\tb2ContactFeature cf = cp->id.cf;\n\t\t\t\tcp->id.cf.indexA = cf.indexB;\n\t\t\t\tcp->id.cf.indexB = cf.indexA;\n\t\t\t\tcp->id.cf.typeA = cf.typeB;\n\t\t\t\tcp->id.cf.typeB = cf.typeA;\n\t\t\t}\n\t\t\t++pointCount;\n\t\t}\n\t}\n\n\tmanifold->pointCount = pointCount;\n}\n"
  },
  {
    "path": "src/libraries/box2d/collision/b2_collision.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_collision.h\"\n#include \"box2d/b2_distance.h\"\n\nvoid b2WorldManifold::Initialize(const b2Manifold* manifold,\n\t\t\t\t\t\t  const b2Transform& xfA, float radiusA,\n\t\t\t\t\t\t  const b2Transform& xfB, float radiusB)\n{\n\tif (manifold->pointCount == 0)\n\t{\n\t\treturn;\n\t}\n\n\tswitch (manifold->type)\n\t{\n\tcase b2Manifold::e_circles:\n\t\t{\n\t\t\tnormal.Set(1.0f, 0.0f);\n\t\t\tb2Vec2 pointA = b2Mul(xfA, manifold->localPoint);\n\t\t\tb2Vec2 pointB = b2Mul(xfB, manifold->points[0].localPoint);\n\t\t\tif (b2DistanceSquared(pointA, pointB) > b2_epsilon * b2_epsilon)\n\t\t\t{\n\t\t\t\tnormal = pointB - pointA;\n\t\t\t\tnormal.Normalize();\n\t\t\t}\n\n\t\t\tb2Vec2 cA = pointA + radiusA * normal;\n\t\t\tb2Vec2 cB = pointB - radiusB * normal;\n\t\t\tpoints[0] = 0.5f * (cA + cB);\n\t\t\tseparations[0] = b2Dot(cB - cA, normal);\n\t\t}\n\t\tbreak;\n\n\tcase b2Manifold::e_faceA:\n\t\t{\n\t\t\tnormal = b2Mul(xfA.q, manifold->localNormal);\n\t\t\tb2Vec2 planePoint = b2Mul(xfA, manifold->localPoint);\n\t\t\t\n\t\t\tfor (int32 i = 0; i < manifold->pointCount; ++i)\n\t\t\t{\n\t\t\t\tb2Vec2 clipPoint = b2Mul(xfB, manifold->points[i].localPoint);\n\t\t\t\tb2Vec2 cA = clipPoint + (radiusA - b2Dot(clipPoint - planePoint, normal)) * normal;\n\t\t\t\tb2Vec2 cB = clipPoint - radiusB * normal;\n\t\t\t\tpoints[i] = 0.5f * (cA + cB);\n\t\t\t\tseparations[i] = b2Dot(cB - cA, normal);\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase b2Manifold::e_faceB:\n\t\t{\n\t\t\tnormal = b2Mul(xfB.q, manifold->localNormal);\n\t\t\tb2Vec2 planePoint = b2Mul(xfB, manifold->localPoint);\n\n\t\t\tfor (int32 i = 0; i < manifold->pointCount; ++i)\n\t\t\t{\n\t\t\t\tb2Vec2 clipPoint = b2Mul(xfA, manifold->points[i].localPoint);\n\t\t\t\tb2Vec2 cB = clipPoint + (radiusB - b2Dot(clipPoint - planePoint, normal)) * normal;\n\t\t\t\tb2Vec2 cA = clipPoint - radiusA * normal;\n\t\t\t\tpoints[i] = 0.5f * (cA + cB);\n\t\t\t\tseparations[i] = b2Dot(cA - cB, normal);\n\t\t\t}\n\n\t\t\t// Ensure normal points from A to B.\n\t\t\tnormal = -normal;\n\t\t}\n\t\tbreak;\n\t}\n}\n\nvoid b2GetPointStates(b2PointState state1[b2_maxManifoldPoints], b2PointState state2[b2_maxManifoldPoints],\n\t\t\t\t\t  const b2Manifold* manifold1, const b2Manifold* manifold2)\n{\n\tfor (int32 i = 0; i < b2_maxManifoldPoints; ++i)\n\t{\n\t\tstate1[i] = b2_nullState;\n\t\tstate2[i] = b2_nullState;\n\t}\n\n\t// Detect persists and removes.\n\tfor (int32 i = 0; i < manifold1->pointCount; ++i)\n\t{\n\t\tb2ContactID id = manifold1->points[i].id;\n\n\t\tstate1[i] = b2_removeState;\n\n\t\tfor (int32 j = 0; j < manifold2->pointCount; ++j)\n\t\t{\n\t\t\tif (manifold2->points[j].id.key == id.key)\n\t\t\t{\n\t\t\t\tstate1[i] = b2_persistState;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Detect persists and adds.\n\tfor (int32 i = 0; i < manifold2->pointCount; ++i)\n\t{\n\t\tb2ContactID id = manifold2->points[i].id;\n\n\t\tstate2[i] = b2_addState;\n\n\t\tfor (int32 j = 0; j < manifold1->pointCount; ++j)\n\t\t{\n\t\t\tif (manifold1->points[j].id.key == id.key)\n\t\t\t{\n\t\t\t\tstate2[i] = b2_persistState;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\n// From Real-time Collision Detection, p179.\nbool b2AABB::RayCast(b2RayCastOutput* output, const b2RayCastInput& input) const\n{\n\tfloat tmin = -b2_maxFloat;\n\tfloat tmax = b2_maxFloat;\n\n\tb2Vec2 p = input.p1;\n\tb2Vec2 d = input.p2 - input.p1;\n\tb2Vec2 absD = b2Abs(d);\n\n\tb2Vec2 normal;\n\n\tfor (int32 i = 0; i < 2; ++i)\n\t{\n\t\tif (absD(i) < b2_epsilon)\n\t\t{\n\t\t\t// Parallel.\n\t\t\tif (p(i) < lowerBound(i) || upperBound(i) < p(i))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfloat inv_d = 1.0f / d(i);\n\t\t\tfloat t1 = (lowerBound(i) - p(i)) * inv_d;\n\t\t\tfloat t2 = (upperBound(i) - p(i)) * inv_d;\n\n\t\t\t// Sign of the normal vector.\n\t\t\tfloat s = -1.0f;\n\n\t\t\tif (t1 > t2)\n\t\t\t{\n\t\t\t\tb2Swap(t1, t2);\n\t\t\t\ts = 1.0f;\n\t\t\t}\n\n\t\t\t// Push the min up\n\t\t\tif (t1 > tmin)\n\t\t\t{\n\t\t\t\tnormal.SetZero();\n\t\t\t\tnormal(i) = s;\n\t\t\t\ttmin = t1;\n\t\t\t}\n\n\t\t\t// Pull the max down\n\t\t\ttmax = b2Min(tmax, t2);\n\n\t\t\tif (tmin > tmax)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Does the ray start inside the box?\n\t// Does the ray intersect beyond the max fraction?\n\tif (tmin < 0.0f || input.maxFraction < tmin)\n\t{\n\t\treturn false;\n\t}\n\n\t// Intersection.\n\toutput->fraction = tmin;\n\toutput->normal = normal;\n\treturn true;\n}\n\n// Sutherland-Hodgman clipping.\nint32 b2ClipSegmentToLine(b2ClipVertex vOut[2], const b2ClipVertex vIn[2],\n\t\t\t\t\t\tconst b2Vec2& normal, float offset, int32 vertexIndexA)\n{\n\t// Start with no output points\n\tint32 count = 0;\n\n\t// Calculate the distance of end points to the line\n\tfloat distance0 = b2Dot(normal, vIn[0].v) - offset;\n\tfloat distance1 = b2Dot(normal, vIn[1].v) - offset;\n\n\t// If the points are behind the plane\n\tif (distance0 <= 0.0f) vOut[count++] = vIn[0];\n\tif (distance1 <= 0.0f) vOut[count++] = vIn[1];\n\n\t// If the points are on different sides of the plane\n\tif (distance0 * distance1 < 0.0f)\n\t{\n\t\t// Find intersection point of edge and plane\n\t\tfloat interp = distance0 / (distance0 - distance1);\n\t\tvOut[count].v = vIn[0].v + interp * (vIn[1].v - vIn[0].v);\n\n\t\t// VertexA is hitting edgeB.\n\t\tvOut[count].id.cf.indexA = static_cast<uint8>(vertexIndexA);\n\t\tvOut[count].id.cf.indexB = vIn[0].id.cf.indexB;\n\t\tvOut[count].id.cf.typeA = b2ContactFeature::e_vertex;\n\t\tvOut[count].id.cf.typeB = b2ContactFeature::e_face;\n\t\t++count;\n\n\t\tb2Assert(count == 2);\n\t}\n\n\treturn count;\n}\n\nbool b2TestOverlap(\tconst b2Shape* shapeA, int32 indexA,\n\t\t\t\t\tconst b2Shape* shapeB, int32 indexB,\n\t\t\t\t\tconst b2Transform& xfA, const b2Transform& xfB)\n{\n\tb2DistanceInput input;\n\tinput.proxyA.Set(shapeA, indexA);\n\tinput.proxyB.Set(shapeB, indexB);\n\tinput.transformA = xfA;\n\tinput.transformB = xfB;\n\tinput.useRadii = true;\n\n\tb2SimplexCache cache;\n\tcache.count = 0;\n\n\tb2DistanceOutput output;\n\n\tb2Distance(&output, &cache, &input);\n\n\treturn output.distance < 10.0f * b2_epsilon;\n}\n"
  },
  {
    "path": "src/libraries/box2d/collision/b2_distance.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_circle_shape.h\"\n#include \"box2d/b2_distance.h\"\n#include \"box2d/b2_edge_shape.h\"\n#include \"box2d/b2_chain_shape.h\"\n#include \"box2d/b2_polygon_shape.h\"\n\n// GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates.\nB2_API int32 b2_gjkCalls, b2_gjkIters, b2_gjkMaxIters;\n\nvoid b2DistanceProxy::Set(const b2Shape* shape, int32 index)\n{\n\tswitch (shape->GetType())\n\t{\n\tcase b2Shape::e_circle:\n\t\t{\n\t\t\tconst b2CircleShape* circle = static_cast<const b2CircleShape*>(shape);\n\t\t\tm_vertices = &circle->m_p;\n\t\t\tm_count = 1;\n\t\t\tm_radius = circle->m_radius;\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_polygon:\n\t\t{\n\t\t\tconst b2PolygonShape* polygon = static_cast<const b2PolygonShape*>(shape);\n\t\t\tm_vertices = polygon->m_vertices;\n\t\t\tm_count = polygon->m_count;\n\t\t\tm_radius = polygon->m_radius;\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_chain:\n\t\t{\n\t\t\tconst b2ChainShape* chain = static_cast<const b2ChainShape*>(shape);\n\t\t\tb2Assert(0 <= index && index < chain->m_count);\n\n\t\t\tm_buffer[0] = chain->m_vertices[index];\n\t\t\tif (index + 1 < chain->m_count)\n\t\t\t{\n\t\t\t\tm_buffer[1] = chain->m_vertices[index + 1];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tm_buffer[1] = chain->m_vertices[0];\n\t\t\t}\n\n\t\t\tm_vertices = m_buffer;\n\t\t\tm_count = 2;\n\t\t\tm_radius = chain->m_radius;\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_edge:\n\t\t{\n\t\t\tconst b2EdgeShape* edge = static_cast<const b2EdgeShape*>(shape);\n\t\t\tm_vertices = &edge->m_vertex1;\n\t\t\tm_count = 2;\n\t\t\tm_radius = edge->m_radius;\n\t\t}\n\t\tbreak;\n\n\tdefault:\n\t\tb2Assert(false);\n\t}\n}\n\nvoid b2DistanceProxy::Set(const b2Vec2* vertices, int32 count, float radius)\n{\n    m_vertices = vertices;\n    m_count = count;\n    m_radius = radius;\n}\n\nstruct b2SimplexVertex\n{\n\tb2Vec2 wA;\t\t// support point in proxyA\n\tb2Vec2 wB;\t\t// support point in proxyB\n\tb2Vec2 w;\t\t// wB - wA\n\tfloat a;\t\t// barycentric coordinate for closest point\n\tint32 indexA;\t// wA index\n\tint32 indexB;\t// wB index\n};\n\nstruct b2Simplex\n{\n\tvoid ReadCache(\tconst b2SimplexCache* cache,\n\t\t\t\t\tconst b2DistanceProxy* proxyA, const b2Transform& transformA,\n\t\t\t\t\tconst b2DistanceProxy* proxyB, const b2Transform& transformB)\n\t{\n\t\tb2Assert(cache->count <= 3);\n\t\t\n\t\t// Copy data from cache.\n\t\tm_count = cache->count;\n\t\tb2SimplexVertex* vertices = &m_v1;\n\t\tfor (int32 i = 0; i < m_count; ++i)\n\t\t{\n\t\t\tb2SimplexVertex* v = vertices + i;\n\t\t\tv->indexA = cache->indexA[i];\n\t\t\tv->indexB = cache->indexB[i];\n\t\t\tb2Vec2 wALocal = proxyA->GetVertex(v->indexA);\n\t\t\tb2Vec2 wBLocal = proxyB->GetVertex(v->indexB);\n\t\t\tv->wA = b2Mul(transformA, wALocal);\n\t\t\tv->wB = b2Mul(transformB, wBLocal);\n\t\t\tv->w = v->wB - v->wA;\n\t\t\tv->a = 0.0f;\n\t\t}\n\n\t\t// Compute the new simplex metric, if it is substantially different than\n\t\t// old metric then flush the simplex.\n\t\tif (m_count > 1)\n\t\t{\n\t\t\tfloat metric1 = cache->metric;\n\t\t\tfloat metric2 = GetMetric();\n\t\t\tif (metric2 < 0.5f * metric1 || 2.0f * metric1 < metric2 || metric2 < b2_epsilon)\n\t\t\t{\n\t\t\t\t// Reset the simplex.\n\t\t\t\tm_count = 0;\n\t\t\t}\n\t\t}\n\n\t\t// If the cache is empty or invalid ...\n\t\tif (m_count == 0)\n\t\t{\n\t\t\tb2SimplexVertex* v = vertices + 0;\n\t\t\tv->indexA = 0;\n\t\t\tv->indexB = 0;\n\t\t\tb2Vec2 wALocal = proxyA->GetVertex(0);\n\t\t\tb2Vec2 wBLocal = proxyB->GetVertex(0);\n\t\t\tv->wA = b2Mul(transformA, wALocal);\n\t\t\tv->wB = b2Mul(transformB, wBLocal);\n\t\t\tv->w = v->wB - v->wA;\n\t\t\tv->a = 1.0f;\n\t\t\tm_count = 1;\n\t\t}\n\t}\n\n\tvoid WriteCache(b2SimplexCache* cache) const\n\t{\n\t\tcache->metric = GetMetric();\n\t\tcache->count = uint16(m_count);\n\t\tconst b2SimplexVertex* vertices = &m_v1;\n\t\tfor (int32 i = 0; i < m_count; ++i)\n\t\t{\n\t\t\tcache->indexA[i] = uint8(vertices[i].indexA);\n\t\t\tcache->indexB[i] = uint8(vertices[i].indexB);\n\t\t}\n\t}\n\n\tb2Vec2 GetSearchDirection() const\n\t{\n\t\tswitch (m_count)\n\t\t{\n\t\tcase 1:\n\t\t\treturn -m_v1.w;\n\n\t\tcase 2:\n\t\t\t{\n\t\t\t\tb2Vec2 e12 = m_v2.w - m_v1.w;\n\t\t\t\tfloat sgn = b2Cross(e12, -m_v1.w);\n\t\t\t\tif (sgn > 0.0f)\n\t\t\t\t{\n\t\t\t\t\t// Origin is left of e12.\n\t\t\t\t\treturn b2Cross(1.0f, e12);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Origin is right of e12.\n\t\t\t\t\treturn b2Cross(e12, 1.0f);\n\t\t\t\t}\n\t\t\t}\n\n\t\tdefault:\n\t\t\tb2Assert(false);\n\t\t\treturn b2Vec2_zero;\n\t\t}\n\t}\n\n\tb2Vec2 GetClosestPoint() const\n\t{\n\t\tswitch (m_count)\n\t\t{\n\t\tcase 0:\n\t\t\tb2Assert(false);\n\t\t\treturn b2Vec2_zero;\n\n\t\tcase 1:\n\t\t\treturn m_v1.w;\n\n\t\tcase 2:\n\t\t\treturn m_v1.a * m_v1.w + m_v2.a * m_v2.w;\n\n\t\tcase 3:\n\t\t\treturn b2Vec2_zero;\n\n\t\tdefault:\n\t\t\tb2Assert(false);\n\t\t\treturn b2Vec2_zero;\n\t\t}\n\t}\n\n\tvoid GetWitnessPoints(b2Vec2* pA, b2Vec2* pB) const\n\t{\n\t\tswitch (m_count)\n\t\t{\n\t\tcase 0:\n\t\t\tb2Assert(false);\n\t\t\tbreak;\n\n\t\tcase 1:\n\t\t\t*pA = m_v1.wA;\n\t\t\t*pB = m_v1.wB;\n\t\t\tbreak;\n\n\t\tcase 2:\n\t\t\t*pA = m_v1.a * m_v1.wA + m_v2.a * m_v2.wA;\n\t\t\t*pB = m_v1.a * m_v1.wB + m_v2.a * m_v2.wB;\n\t\t\tbreak;\n\n\t\tcase 3:\n\t\t\t*pA = m_v1.a * m_v1.wA + m_v2.a * m_v2.wA + m_v3.a * m_v3.wA;\n\t\t\t*pB = *pA;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tb2Assert(false);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tfloat GetMetric() const\n\t{\n\t\tswitch (m_count)\n\t\t{\n\t\tcase 0:\n\t\t\tb2Assert(false);\n\t\t\treturn 0.0f;\n\n\t\tcase 1:\n\t\t\treturn 0.0f;\n\n\t\tcase 2:\n\t\t\treturn b2Distance(m_v1.w, m_v2.w);\n\n\t\tcase 3:\n\t\t\treturn b2Cross(m_v2.w - m_v1.w, m_v3.w - m_v1.w);\n\n\t\tdefault:\n\t\t\tb2Assert(false);\n\t\t\treturn 0.0f;\n\t\t}\n\t}\n\n\tvoid Solve2();\n\tvoid Solve3();\n\n\tb2SimplexVertex m_v1, m_v2, m_v3;\n\tint32 m_count;\n};\n\n\n// Solve a line segment using barycentric coordinates.\n//\n// p = a1 * w1 + a2 * w2\n// a1 + a2 = 1\n//\n// The vector from the origin to the closest point on the line is\n// perpendicular to the line.\n// e12 = w2 - w1\n// dot(p, e) = 0\n// a1 * dot(w1, e) + a2 * dot(w2, e) = 0\n//\n// 2-by-2 linear system\n// [1      1     ][a1] = [1]\n// [w1.e12 w2.e12][a2] = [0]\n//\n// Define\n// d12_1 =  dot(w2, e12)\n// d12_2 = -dot(w1, e12)\n// d12 = d12_1 + d12_2\n//\n// Solution\n// a1 = d12_1 / d12\n// a2 = d12_2 / d12\nvoid b2Simplex::Solve2()\n{\n\tb2Vec2 w1 = m_v1.w;\n\tb2Vec2 w2 = m_v2.w;\n\tb2Vec2 e12 = w2 - w1;\n\n\t// w1 region\n\tfloat d12_2 = -b2Dot(w1, e12);\n\tif (d12_2 <= 0.0f)\n\t{\n\t\t// a2 <= 0, so we clamp it to 0\n\t\tm_v1.a = 1.0f;\n\t\tm_count = 1;\n\t\treturn;\n\t}\n\n\t// w2 region\n\tfloat d12_1 = b2Dot(w2, e12);\n\tif (d12_1 <= 0.0f)\n\t{\n\t\t// a1 <= 0, so we clamp it to 0\n\t\tm_v2.a = 1.0f;\n\t\tm_count = 1;\n\t\tm_v1 = m_v2;\n\t\treturn;\n\t}\n\n\t// Must be in e12 region.\n\tfloat inv_d12 = 1.0f / (d12_1 + d12_2);\n\tm_v1.a = d12_1 * inv_d12;\n\tm_v2.a = d12_2 * inv_d12;\n\tm_count = 2;\n}\n\n// Possible regions:\n// - points[2]\n// - edge points[0]-points[2]\n// - edge points[1]-points[2]\n// - inside the triangle\nvoid b2Simplex::Solve3()\n{\n\tb2Vec2 w1 = m_v1.w;\n\tb2Vec2 w2 = m_v2.w;\n\tb2Vec2 w3 = m_v3.w;\n\n\t// Edge12\n\t// [1      1     ][a1] = [1]\n\t// [w1.e12 w2.e12][a2] = [0]\n\t// a3 = 0\n\tb2Vec2 e12 = w2 - w1;\n\tfloat w1e12 = b2Dot(w1, e12);\n\tfloat w2e12 = b2Dot(w2, e12);\n\tfloat d12_1 = w2e12;\n\tfloat d12_2 = -w1e12;\n\n\t// Edge13\n\t// [1      1     ][a1] = [1]\n\t// [w1.e13 w3.e13][a3] = [0]\n\t// a2 = 0\n\tb2Vec2 e13 = w3 - w1;\n\tfloat w1e13 = b2Dot(w1, e13);\n\tfloat w3e13 = b2Dot(w3, e13);\n\tfloat d13_1 = w3e13;\n\tfloat d13_2 = -w1e13;\n\n\t// Edge23\n\t// [1      1     ][a2] = [1]\n\t// [w2.e23 w3.e23][a3] = [0]\n\t// a1 = 0\n\tb2Vec2 e23 = w3 - w2;\n\tfloat w2e23 = b2Dot(w2, e23);\n\tfloat w3e23 = b2Dot(w3, e23);\n\tfloat d23_1 = w3e23;\n\tfloat d23_2 = -w2e23;\n\t\n\t// Triangle123\n\tfloat n123 = b2Cross(e12, e13);\n\n\tfloat d123_1 = n123 * b2Cross(w2, w3);\n\tfloat d123_2 = n123 * b2Cross(w3, w1);\n\tfloat d123_3 = n123 * b2Cross(w1, w2);\n\n\t// w1 region\n\tif (d12_2 <= 0.0f && d13_2 <= 0.0f)\n\t{\n\t\tm_v1.a = 1.0f;\n\t\tm_count = 1;\n\t\treturn;\n\t}\n\n\t// e12\n\tif (d12_1 > 0.0f && d12_2 > 0.0f && d123_3 <= 0.0f)\n\t{\n\t\tfloat inv_d12 = 1.0f / (d12_1 + d12_2);\n\t\tm_v1.a = d12_1 * inv_d12;\n\t\tm_v2.a = d12_2 * inv_d12;\n\t\tm_count = 2;\n\t\treturn;\n\t}\n\n\t// e13\n\tif (d13_1 > 0.0f && d13_2 > 0.0f && d123_2 <= 0.0f)\n\t{\n\t\tfloat inv_d13 = 1.0f / (d13_1 + d13_2);\n\t\tm_v1.a = d13_1 * inv_d13;\n\t\tm_v3.a = d13_2 * inv_d13;\n\t\tm_count = 2;\n\t\tm_v2 = m_v3;\n\t\treturn;\n\t}\n\n\t// w2 region\n\tif (d12_1 <= 0.0f && d23_2 <= 0.0f)\n\t{\n\t\tm_v2.a = 1.0f;\n\t\tm_count = 1;\n\t\tm_v1 = m_v2;\n\t\treturn;\n\t}\n\n\t// w3 region\n\tif (d13_1 <= 0.0f && d23_1 <= 0.0f)\n\t{\n\t\tm_v3.a = 1.0f;\n\t\tm_count = 1;\n\t\tm_v1 = m_v3;\n\t\treturn;\n\t}\n\n\t// e23\n\tif (d23_1 > 0.0f && d23_2 > 0.0f && d123_1 <= 0.0f)\n\t{\n\t\tfloat inv_d23 = 1.0f / (d23_1 + d23_2);\n\t\tm_v2.a = d23_1 * inv_d23;\n\t\tm_v3.a = d23_2 * inv_d23;\n\t\tm_count = 2;\n\t\tm_v1 = m_v3;\n\t\treturn;\n\t}\n\n\t// Must be in triangle123\n\tfloat inv_d123 = 1.0f / (d123_1 + d123_2 + d123_3);\n\tm_v1.a = d123_1 * inv_d123;\n\tm_v2.a = d123_2 * inv_d123;\n\tm_v3.a = d123_3 * inv_d123;\n\tm_count = 3;\n}\n\nvoid b2Distance(b2DistanceOutput* output,\n\t\t\t\tb2SimplexCache* cache,\n\t\t\t\tconst b2DistanceInput* input)\n{\n\t++b2_gjkCalls;\n\n\tconst b2DistanceProxy* proxyA = &input->proxyA;\n\tconst b2DistanceProxy* proxyB = &input->proxyB;\n\n\tb2Transform transformA = input->transformA;\n\tb2Transform transformB = input->transformB;\n\n\t// Initialize the simplex.\n\tb2Simplex simplex;\n\tsimplex.ReadCache(cache, proxyA, transformA, proxyB, transformB);\n\n\t// Get simplex vertices as an array.\n\tb2SimplexVertex* vertices = &simplex.m_v1;\n\tconst int32 k_maxIters = 20;\n\n\t// These store the vertices of the last simplex so that we\n\t// can check for duplicates and prevent cycling.\n\tint32 saveA[3], saveB[3];\n\tint32 saveCount = 0;\n\n\t// Main iteration loop.\n\tint32 iter = 0;\n\twhile (iter < k_maxIters)\n\t{\n\t\t// Copy simplex so we can identify duplicates.\n\t\tsaveCount = simplex.m_count;\n\t\tfor (int32 i = 0; i < saveCount; ++i)\n\t\t{\n\t\t\tsaveA[i] = vertices[i].indexA;\n\t\t\tsaveB[i] = vertices[i].indexB;\n\t\t}\n\n\t\tswitch (simplex.m_count)\n\t\t{\n\t\tcase 1:\n\t\t\tbreak;\n\n\t\tcase 2:\n\t\t\tsimplex.Solve2();\n\t\t\tbreak;\n\n\t\tcase 3:\n\t\t\tsimplex.Solve3();\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tb2Assert(false);\n\t\t}\n\n\t\t// If we have 3 points, then the origin is in the corresponding triangle.\n\t\tif (simplex.m_count == 3)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n\t\t// Get search direction.\n\t\tb2Vec2 d = simplex.GetSearchDirection();\n\n\t\t// Ensure the search direction is numerically fit.\n\t\tif (d.LengthSquared() < b2_epsilon * b2_epsilon)\n\t\t{\n\t\t\t// The origin is probably contained by a line segment\n\t\t\t// or triangle. Thus the shapes are overlapped.\n\n\t\t\t// We can't return zero here even though there may be overlap.\n\t\t\t// In case the simplex is a point, segment, or triangle it is difficult\n\t\t\t// to determine if the origin is contained in the CSO or very close to it.\n\t\t\tbreak;\n\t\t}\n\n\t\t// Compute a tentative new simplex vertex using support points.\n\t\tb2SimplexVertex* vertex = vertices + simplex.m_count;\n\t\tvertex->indexA = proxyA->GetSupport(b2MulT(transformA.q, -d));\n\t\tvertex->wA = b2Mul(transformA, proxyA->GetVertex(vertex->indexA));\n\t\tvertex->indexB = proxyB->GetSupport(b2MulT(transformB.q, d));\n\t\tvertex->wB = b2Mul(transformB, proxyB->GetVertex(vertex->indexB));\n\t\tvertex->w = vertex->wB - vertex->wA;\n\n\t\t// Iteration count is equated to the number of support point calls.\n\t\t++iter;\n\t\t++b2_gjkIters;\n\n\t\t// Check for duplicate support points. This is the main termination criteria.\n\t\tbool duplicate = false;\n\t\tfor (int32 i = 0; i < saveCount; ++i)\n\t\t{\n\t\t\tif (vertex->indexA == saveA[i] && vertex->indexB == saveB[i])\n\t\t\t{\n\t\t\t\tduplicate = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// If we found a duplicate support point we must exit to avoid cycling.\n\t\tif (duplicate)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n\t\t// New vertex is ok and needed.\n\t\t++simplex.m_count;\n\t}\n\n\tb2_gjkMaxIters = b2Max(b2_gjkMaxIters, iter);\n\n\t// Prepare output.\n\tsimplex.GetWitnessPoints(&output->pointA, &output->pointB);\n\toutput->distance = b2Distance(output->pointA, output->pointB);\n\toutput->iterations = iter;\n\n\t// Cache the simplex.\n\tsimplex.WriteCache(cache);\n\n\t// Apply radii if requested.\n\tif (input->useRadii)\n\t{\n\t\tfloat rA = proxyA->m_radius;\n\t\tfloat rB = proxyB->m_radius;\n\n\t\tif (output->distance > rA + rB && output->distance > b2_epsilon)\n\t\t{\n\t\t\t// Shapes are still no overlapped.\n\t\t\t// Move the witness points to the outer surface.\n\t\t\toutput->distance -= rA + rB;\n\t\t\tb2Vec2 normal = output->pointB - output->pointA;\n\t\t\tnormal.Normalize();\n\t\t\toutput->pointA += rA * normal;\n\t\t\toutput->pointB -= rB * normal;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Shapes are overlapped when radii are considered.\n\t\t\t// Move the witness points to the middle.\n\t\t\tb2Vec2 p = 0.5f * (output->pointA + output->pointB);\n\t\t\toutput->pointA = p;\n\t\t\toutput->pointB = p;\n\t\t\toutput->distance = 0.0f;\n\t\t}\n\t}\n}\n\n// GJK-raycast\n// Algorithm by Gino van den Bergen.\n// \"Smooth Mesh Contacts with GJK\" in Game Physics Pearls. 2010\nbool b2ShapeCast(b2ShapeCastOutput * output, const b2ShapeCastInput * input)\n{\n    output->iterations = 0;\n    output->lambda = 1.0f;\n    output->normal.SetZero();\n    output->point.SetZero();\n\n\tconst b2DistanceProxy* proxyA = &input->proxyA;\n\tconst b2DistanceProxy* proxyB = &input->proxyB;\n\n    float radiusA = b2Max(proxyA->m_radius, b2_polygonRadius);\n    float radiusB = b2Max(proxyB->m_radius, b2_polygonRadius);\n    float radius = radiusA + radiusB;\n\n\tb2Transform xfA = input->transformA;\n\tb2Transform xfB = input->transformB;\n\n\tb2Vec2 r = input->translationB;\n\tb2Vec2 n(0.0f, 0.0f);\n\tfloat lambda = 0.0f;\n\n\t// Initial simplex\n\tb2Simplex simplex;\n\tsimplex.m_count = 0;\n\n\t// Get simplex vertices as an array.\n\tb2SimplexVertex* vertices = &simplex.m_v1;\n\n\t// Get support point in -r direction\n\tint32 indexA = proxyA->GetSupport(b2MulT(xfA.q, -r));\n\tb2Vec2 wA = b2Mul(xfA, proxyA->GetVertex(indexA));\n\tint32 indexB = proxyB->GetSupport(b2MulT(xfB.q, r));\n\tb2Vec2 wB = b2Mul(xfB, proxyB->GetVertex(indexB));\n    b2Vec2 v = wA - wB;\n\n    // Sigma is the target distance between polygons\n    float sigma = b2Max(b2_polygonRadius, radius - b2_polygonRadius);\n\tconst float tolerance = 0.5f * b2_linearSlop;\n\n\t// Main iteration loop.\n\tconst int32 k_maxIters = 20;\n\tint32 iter = 0;\n\twhile (iter < k_maxIters && v.Length() - sigma > tolerance)\n\t{\n\t\tb2Assert(simplex.m_count < 3);\n\n        output->iterations += 1;\n\n\t\t// Support in direction -v (A - B)\n\t\tindexA = proxyA->GetSupport(b2MulT(xfA.q, -v));\n\t\twA = b2Mul(xfA, proxyA->GetVertex(indexA));\n\t\tindexB = proxyB->GetSupport(b2MulT(xfB.q, v));\n\t\twB = b2Mul(xfB, proxyB->GetVertex(indexB));\n        b2Vec2 p = wA - wB;\n\n        // -v is a normal at p\n        v.Normalize();\n\n        // Intersect ray with plane\n\t\tfloat vp = b2Dot(v, p);\n        float vr = b2Dot(v, r);\n\t\tif (vp - sigma > lambda * vr)\n\t\t{\n\t\t\tif (vr <= 0.0f)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tlambda = (vp - sigma) / vr;\n\t\t\tif (lambda > 1.0f)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n            n = -v;\n            simplex.m_count = 0;\n\t\t}\n\n        // Reverse simplex since it works with B - A.\n        // Shift by lambda * r because we want the closest point to the current clip point.\n        // Note that the support point p is not shifted because we want the plane equation\n        // to be formed in unshifted space.\n\t\tb2SimplexVertex* vertex = vertices + simplex.m_count;\n\t\tvertex->indexA = indexB;\n\t\tvertex->wA = wB + lambda * r;\n\t\tvertex->indexB = indexA;\n\t\tvertex->wB = wA;\n\t\tvertex->w = vertex->wB - vertex->wA;\n\t\tvertex->a = 1.0f;\n\t\tsimplex.m_count += 1;\n\n\t\tswitch (simplex.m_count)\n\t\t{\n\t\tcase 1:\n\t\t\tbreak;\n\n\t\tcase 2:\n\t\t\tsimplex.Solve2();\n\t\t\tbreak;\n\n\t\tcase 3:\n\t\t\tsimplex.Solve3();\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tb2Assert(false);\n\t\t}\n\t\t\n\t\t// If we have 3 points, then the origin is in the corresponding triangle.\n\t\tif (simplex.m_count == 3)\n\t\t{\n\t\t\t// Overlap\n\t\t\treturn false;\n\t\t}\n\n\t\t// Get search direction.\n\t\tv = simplex.GetClosestPoint();\n\n\t\t// Iteration count is equated to the number of support point calls.\n\t\t++iter;\n\t}\n\n\tif (iter == 0)\n\t{\n\t\t// Initial overlap\n\t\treturn false;\n\t}\n\n\t// Prepare output.\n\tb2Vec2 pointA, pointB;\n\tsimplex.GetWitnessPoints(&pointB, &pointA);\n\n\tif (v.LengthSquared() > 0.0f)\n\t{\n        n = -v;\n\t\tn.Normalize();\n\t}\n\n    output->point = pointA + radiusA * n;\n\toutput->normal = n;\n\toutput->lambda = lambda;\n\toutput->iterations = iter;\n\treturn true;\n}\n"
  },
  {
    "path": "src/libraries/box2d/collision/b2_dynamic_tree.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n#include \"box2d/b2_dynamic_tree.h\"\n#include <string.h>\n\nb2DynamicTree::b2DynamicTree()\n{\n\tm_root = b2_nullNode;\n\n\tm_nodeCapacity = 16;\n\tm_nodeCount = 0;\n\tm_nodes = (b2TreeNode*)b2Alloc(m_nodeCapacity * sizeof(b2TreeNode));\n\tmemset(m_nodes, 0, m_nodeCapacity * sizeof(b2TreeNode));\n\n\t// Build a linked list for the free list.\n\tfor (int32 i = 0; i < m_nodeCapacity - 1; ++i)\n\t{\n\t\tm_nodes[i].next = i + 1;\n\t\tm_nodes[i].height = -1;\n\t}\n\tm_nodes[m_nodeCapacity-1].next = b2_nullNode;\n\tm_nodes[m_nodeCapacity-1].height = -1;\n\tm_freeList = 0;\n\n\tm_insertionCount = 0;\n}\n\nb2DynamicTree::~b2DynamicTree()\n{\n\t// This frees the entire tree in one shot.\n\tb2Free(m_nodes);\n}\n\n// Allocate a node from the pool. Grow the pool if necessary.\nint32 b2DynamicTree::AllocateNode()\n{\n\t// Expand the node pool as needed.\n\tif (m_freeList == b2_nullNode)\n\t{\n\t\tb2Assert(m_nodeCount == m_nodeCapacity);\n\n\t\t// The free list is empty. Rebuild a bigger pool.\n\t\tb2TreeNode* oldNodes = m_nodes;\n\t\tm_nodeCapacity *= 2;\n\t\tm_nodes = (b2TreeNode*)b2Alloc(m_nodeCapacity * sizeof(b2TreeNode));\n\t\tmemcpy(m_nodes, oldNodes, m_nodeCount * sizeof(b2TreeNode));\n\t\tb2Free(oldNodes);\n\n\t\t// Build a linked list for the free list. The parent\n\t\t// pointer becomes the \"next\" pointer.\n\t\tfor (int32 i = m_nodeCount; i < m_nodeCapacity - 1; ++i)\n\t\t{\n\t\t\tm_nodes[i].next = i + 1;\n\t\t\tm_nodes[i].height = -1;\n\t\t}\n\t\tm_nodes[m_nodeCapacity-1].next = b2_nullNode;\n\t\tm_nodes[m_nodeCapacity-1].height = -1;\n\t\tm_freeList = m_nodeCount;\n\t}\n\n\t// Peel a node off the free list.\n\tint32 nodeId = m_freeList;\n\tm_freeList = m_nodes[nodeId].next;\n\tm_nodes[nodeId].parent = b2_nullNode;\n\tm_nodes[nodeId].child1 = b2_nullNode;\n\tm_nodes[nodeId].child2 = b2_nullNode;\n\tm_nodes[nodeId].height = 0;\n\tm_nodes[nodeId].userData = nullptr;\n\tm_nodes[nodeId].moved = false;\n\t++m_nodeCount;\n\treturn nodeId;\n}\n\n// Return a node to the pool.\nvoid b2DynamicTree::FreeNode(int32 nodeId)\n{\n\tb2Assert(0 <= nodeId && nodeId < m_nodeCapacity);\n\tb2Assert(0 < m_nodeCount);\n\tm_nodes[nodeId].next = m_freeList;\n\tm_nodes[nodeId].height = -1;\n\tm_freeList = nodeId;\n\t--m_nodeCount;\n}\n\n// Create a proxy in the tree as a leaf node. We return the index\n// of the node instead of a pointer so that we can grow\n// the node pool.\nint32 b2DynamicTree::CreateProxy(const b2AABB& aabb, void* userData)\n{\n\tint32 proxyId = AllocateNode();\n\n\t// Fatten the aabb.\n\tb2Vec2 r(b2_aabbExtension, b2_aabbExtension);\n\tm_nodes[proxyId].aabb.lowerBound = aabb.lowerBound - r;\n\tm_nodes[proxyId].aabb.upperBound = aabb.upperBound + r;\n\tm_nodes[proxyId].userData = userData;\n\tm_nodes[proxyId].height = 0;\n\tm_nodes[proxyId].moved = true;\n\n\tInsertLeaf(proxyId);\n\n\treturn proxyId;\n}\n\nvoid b2DynamicTree::DestroyProxy(int32 proxyId)\n{\n\tb2Assert(0 <= proxyId && proxyId < m_nodeCapacity);\n\tb2Assert(m_nodes[proxyId].IsLeaf());\n\n\tRemoveLeaf(proxyId);\n\tFreeNode(proxyId);\n}\n\nbool b2DynamicTree::MoveProxy(int32 proxyId, const b2AABB& aabb, const b2Vec2& displacement)\n{\n\tb2Assert(0 <= proxyId && proxyId < m_nodeCapacity);\n\n\tb2Assert(m_nodes[proxyId].IsLeaf());\n\n\t// Extend AABB\n\tb2AABB fatAABB;\n\tb2Vec2 r(b2_aabbExtension, b2_aabbExtension);\n\tfatAABB.lowerBound = aabb.lowerBound - r;\n\tfatAABB.upperBound = aabb.upperBound + r;\n\n\t// Predict AABB movement\n\tb2Vec2 d = b2_aabbMultiplier * displacement;\n\n\tif (d.x < 0.0f)\n\t{\n\t\tfatAABB.lowerBound.x += d.x;\n\t}\n\telse\n\t{\n\t\tfatAABB.upperBound.x += d.x;\n\t}\n\n\tif (d.y < 0.0f)\n\t{\n\t\tfatAABB.lowerBound.y += d.y;\n\t}\n\telse\n\t{\n\t\tfatAABB.upperBound.y += d.y;\n\t}\n\n\tconst b2AABB& treeAABB = m_nodes[proxyId].aabb;\n\tif (treeAABB.Contains(aabb))\n\t{\n\t\t// The tree AABB still contains the object, but it might be too large.\n\t\t// Perhaps the object was moving fast but has since gone to sleep.\n\t\t// The huge AABB is larger than the new fat AABB.\n\t\tb2AABB hugeAABB;\n\t\thugeAABB.lowerBound = fatAABB.lowerBound - 4.0f * r;\n\t\thugeAABB.upperBound = fatAABB.upperBound + 4.0f * r;\n\n\t\tif (hugeAABB.Contains(treeAABB))\n\t\t{\n\t\t\t// The tree AABB contains the object AABB and the tree AABB is\n\t\t\t// not too large. No tree update needed.\n\t\t\treturn false;\n\t\t}\n\n\t\t// Otherwise the tree AABB is huge and needs to be shrunk\n\t}\n\n\tRemoveLeaf(proxyId);\n\n\tm_nodes[proxyId].aabb = fatAABB;\n\n\tInsertLeaf(proxyId);\n\n\tm_nodes[proxyId].moved = true;\n\n\treturn true;\n}\n\nvoid b2DynamicTree::InsertLeaf(int32 leaf)\n{\n\t++m_insertionCount;\n\n\tif (m_root == b2_nullNode)\n\t{\n\t\tm_root = leaf;\n\t\tm_nodes[m_root].parent = b2_nullNode;\n\t\treturn;\n\t}\n\n\t// Find the best sibling for this node\n\tb2AABB leafAABB = m_nodes[leaf].aabb;\n\tint32 index = m_root;\n\twhile (m_nodes[index].IsLeaf() == false)\n\t{\n\t\tint32 child1 = m_nodes[index].child1;\n\t\tint32 child2 = m_nodes[index].child2;\n\n\t\tfloat area = m_nodes[index].aabb.GetPerimeter();\n\n\t\tb2AABB combinedAABB;\n\t\tcombinedAABB.Combine(m_nodes[index].aabb, leafAABB);\n\t\tfloat combinedArea = combinedAABB.GetPerimeter();\n\n\t\t// Cost of creating a new parent for this node and the new leaf\n\t\tfloat cost = 2.0f * combinedArea;\n\n\t\t// Minimum cost of pushing the leaf further down the tree\n\t\tfloat inheritanceCost = 2.0f * (combinedArea - area);\n\n\t\t// Cost of descending into child1\n\t\tfloat cost1;\n\t\tif (m_nodes[child1].IsLeaf())\n\t\t{\n\t\t\tb2AABB aabb;\n\t\t\taabb.Combine(leafAABB, m_nodes[child1].aabb);\n\t\t\tcost1 = aabb.GetPerimeter() + inheritanceCost;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tb2AABB aabb;\n\t\t\taabb.Combine(leafAABB, m_nodes[child1].aabb);\n\t\t\tfloat oldArea = m_nodes[child1].aabb.GetPerimeter();\n\t\t\tfloat newArea = aabb.GetPerimeter();\n\t\t\tcost1 = (newArea - oldArea) + inheritanceCost;\n\t\t}\n\n\t\t// Cost of descending into child2\n\t\tfloat cost2;\n\t\tif (m_nodes[child2].IsLeaf())\n\t\t{\n\t\t\tb2AABB aabb;\n\t\t\taabb.Combine(leafAABB, m_nodes[child2].aabb);\n\t\t\tcost2 = aabb.GetPerimeter() + inheritanceCost;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tb2AABB aabb;\n\t\t\taabb.Combine(leafAABB, m_nodes[child2].aabb);\n\t\t\tfloat oldArea = m_nodes[child2].aabb.GetPerimeter();\n\t\t\tfloat newArea = aabb.GetPerimeter();\n\t\t\tcost2 = newArea - oldArea + inheritanceCost;\n\t\t}\n\n\t\t// Descend according to the minimum cost.\n\t\tif (cost < cost1 && cost < cost2)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n\t\t// Descend\n\t\tif (cost1 < cost2)\n\t\t{\n\t\t\tindex = child1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tindex = child2;\n\t\t}\n\t}\n\n\tint32 sibling = index;\n\n\t// Create a new parent.\n\tint32 oldParent = m_nodes[sibling].parent;\n\tint32 newParent = AllocateNode();\n\tm_nodes[newParent].parent = oldParent;\n\tm_nodes[newParent].userData = nullptr;\n\tm_nodes[newParent].aabb.Combine(leafAABB, m_nodes[sibling].aabb);\n\tm_nodes[newParent].height = m_nodes[sibling].height + 1;\n\n\tif (oldParent != b2_nullNode)\n\t{\n\t\t// The sibling was not the root.\n\t\tif (m_nodes[oldParent].child1 == sibling)\n\t\t{\n\t\t\tm_nodes[oldParent].child1 = newParent;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_nodes[oldParent].child2 = newParent;\n\t\t}\n\n\t\tm_nodes[newParent].child1 = sibling;\n\t\tm_nodes[newParent].child2 = leaf;\n\t\tm_nodes[sibling].parent = newParent;\n\t\tm_nodes[leaf].parent = newParent;\n\t}\n\telse\n\t{\n\t\t// The sibling was the root.\n\t\tm_nodes[newParent].child1 = sibling;\n\t\tm_nodes[newParent].child2 = leaf;\n\t\tm_nodes[sibling].parent = newParent;\n\t\tm_nodes[leaf].parent = newParent;\n\t\tm_root = newParent;\n\t}\n\n\t// Walk back up the tree fixing heights and AABBs\n\tindex = m_nodes[leaf].parent;\n\twhile (index != b2_nullNode)\n\t{\n\t\tindex = Balance(index);\n\n\t\tint32 child1 = m_nodes[index].child1;\n\t\tint32 child2 = m_nodes[index].child2;\n\n\t\tb2Assert(child1 != b2_nullNode);\n\t\tb2Assert(child2 != b2_nullNode);\n\n\t\tm_nodes[index].height = 1 + b2Max(m_nodes[child1].height, m_nodes[child2].height);\n\t\tm_nodes[index].aabb.Combine(m_nodes[child1].aabb, m_nodes[child2].aabb);\n\n\t\tindex = m_nodes[index].parent;\n\t}\n\n\t//Validate();\n}\n\nvoid b2DynamicTree::RemoveLeaf(int32 leaf)\n{\n\tif (leaf == m_root)\n\t{\n\t\tm_root = b2_nullNode;\n\t\treturn;\n\t}\n\n\tint32 parent = m_nodes[leaf].parent;\n\tint32 grandParent = m_nodes[parent].parent;\n\tint32 sibling;\n\tif (m_nodes[parent].child1 == leaf)\n\t{\n\t\tsibling = m_nodes[parent].child2;\n\t}\n\telse\n\t{\n\t\tsibling = m_nodes[parent].child1;\n\t}\n\n\tif (grandParent != b2_nullNode)\n\t{\n\t\t// Destroy parent and connect sibling to grandParent.\n\t\tif (m_nodes[grandParent].child1 == parent)\n\t\t{\n\t\t\tm_nodes[grandParent].child1 = sibling;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_nodes[grandParent].child2 = sibling;\n\t\t}\n\t\tm_nodes[sibling].parent = grandParent;\n\t\tFreeNode(parent);\n\n\t\t// Adjust ancestor bounds.\n\t\tint32 index = grandParent;\n\t\twhile (index != b2_nullNode)\n\t\t{\n\t\t\tindex = Balance(index);\n\n\t\t\tint32 child1 = m_nodes[index].child1;\n\t\t\tint32 child2 = m_nodes[index].child2;\n\n\t\t\tm_nodes[index].aabb.Combine(m_nodes[child1].aabb, m_nodes[child2].aabb);\n\t\t\tm_nodes[index].height = 1 + b2Max(m_nodes[child1].height, m_nodes[child2].height);\n\n\t\t\tindex = m_nodes[index].parent;\n\t\t}\n\t}\n\telse\n\t{\n\t\tm_root = sibling;\n\t\tm_nodes[sibling].parent = b2_nullNode;\n\t\tFreeNode(parent);\n\t}\n\n\t//Validate();\n}\n\n// Perform a left or right rotation if node A is imbalanced.\n// Returns the new root index.\nint32 b2DynamicTree::Balance(int32 iA)\n{\n\tb2Assert(iA != b2_nullNode);\n\n\tb2TreeNode* A = m_nodes + iA;\n\tif (A->IsLeaf() || A->height < 2)\n\t{\n\t\treturn iA;\n\t}\n\n\tint32 iB = A->child1;\n\tint32 iC = A->child2;\n\tb2Assert(0 <= iB && iB < m_nodeCapacity);\n\tb2Assert(0 <= iC && iC < m_nodeCapacity);\n\n\tb2TreeNode* B = m_nodes + iB;\n\tb2TreeNode* C = m_nodes + iC;\n\n\tint32 balance = C->height - B->height;\n\n\t// Rotate C up\n\tif (balance > 1)\n\t{\n\t\tint32 iF = C->child1;\n\t\tint32 iG = C->child2;\n\t\tb2TreeNode* F = m_nodes + iF;\n\t\tb2TreeNode* G = m_nodes + iG;\n\t\tb2Assert(0 <= iF && iF < m_nodeCapacity);\n\t\tb2Assert(0 <= iG && iG < m_nodeCapacity);\n\n\t\t// Swap A and C\n\t\tC->child1 = iA;\n\t\tC->parent = A->parent;\n\t\tA->parent = iC;\n\n\t\t// A's old parent should point to C\n\t\tif (C->parent != b2_nullNode)\n\t\t{\n\t\t\tif (m_nodes[C->parent].child1 == iA)\n\t\t\t{\n\t\t\t\tm_nodes[C->parent].child1 = iC;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tb2Assert(m_nodes[C->parent].child2 == iA);\n\t\t\t\tm_nodes[C->parent].child2 = iC;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_root = iC;\n\t\t}\n\n\t\t// Rotate\n\t\tif (F->height > G->height)\n\t\t{\n\t\t\tC->child2 = iF;\n\t\t\tA->child2 = iG;\n\t\t\tG->parent = iA;\n\t\t\tA->aabb.Combine(B->aabb, G->aabb);\n\t\t\tC->aabb.Combine(A->aabb, F->aabb);\n\n\t\t\tA->height = 1 + b2Max(B->height, G->height);\n\t\t\tC->height = 1 + b2Max(A->height, F->height);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tC->child2 = iG;\n\t\t\tA->child2 = iF;\n\t\t\tF->parent = iA;\n\t\t\tA->aabb.Combine(B->aabb, F->aabb);\n\t\t\tC->aabb.Combine(A->aabb, G->aabb);\n\n\t\t\tA->height = 1 + b2Max(B->height, F->height);\n\t\t\tC->height = 1 + b2Max(A->height, G->height);\n\t\t}\n\n\t\treturn iC;\n\t}\n\t\n\t// Rotate B up\n\tif (balance < -1)\n\t{\n\t\tint32 iD = B->child1;\n\t\tint32 iE = B->child2;\n\t\tb2TreeNode* D = m_nodes + iD;\n\t\tb2TreeNode* E = m_nodes + iE;\n\t\tb2Assert(0 <= iD && iD < m_nodeCapacity);\n\t\tb2Assert(0 <= iE && iE < m_nodeCapacity);\n\n\t\t// Swap A and B\n\t\tB->child1 = iA;\n\t\tB->parent = A->parent;\n\t\tA->parent = iB;\n\n\t\t// A's old parent should point to B\n\t\tif (B->parent != b2_nullNode)\n\t\t{\n\t\t\tif (m_nodes[B->parent].child1 == iA)\n\t\t\t{\n\t\t\t\tm_nodes[B->parent].child1 = iB;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tb2Assert(m_nodes[B->parent].child2 == iA);\n\t\t\t\tm_nodes[B->parent].child2 = iB;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_root = iB;\n\t\t}\n\n\t\t// Rotate\n\t\tif (D->height > E->height)\n\t\t{\n\t\t\tB->child2 = iD;\n\t\t\tA->child1 = iE;\n\t\t\tE->parent = iA;\n\t\t\tA->aabb.Combine(C->aabb, E->aabb);\n\t\t\tB->aabb.Combine(A->aabb, D->aabb);\n\n\t\t\tA->height = 1 + b2Max(C->height, E->height);\n\t\t\tB->height = 1 + b2Max(A->height, D->height);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tB->child2 = iE;\n\t\t\tA->child1 = iD;\n\t\t\tD->parent = iA;\n\t\t\tA->aabb.Combine(C->aabb, D->aabb);\n\t\t\tB->aabb.Combine(A->aabb, E->aabb);\n\n\t\t\tA->height = 1 + b2Max(C->height, D->height);\n\t\t\tB->height = 1 + b2Max(A->height, E->height);\n\t\t}\n\n\t\treturn iB;\n\t}\n\n\treturn iA;\n}\n\nint32 b2DynamicTree::GetHeight() const\n{\n\tif (m_root == b2_nullNode)\n\t{\n\t\treturn 0;\n\t}\n\n\treturn m_nodes[m_root].height;\n}\n\n//\nfloat b2DynamicTree::GetAreaRatio() const\n{\n\tif (m_root == b2_nullNode)\n\t{\n\t\treturn 0.0f;\n\t}\n\n\tconst b2TreeNode* root = m_nodes + m_root;\n\tfloat rootArea = root->aabb.GetPerimeter();\n\n\tfloat totalArea = 0.0f;\n\tfor (int32 i = 0; i < m_nodeCapacity; ++i)\n\t{\n\t\tconst b2TreeNode* node = m_nodes + i;\n\t\tif (node->height < 0)\n\t\t{\n\t\t\t// Free node in pool\n\t\t\tcontinue;\n\t\t}\n\n\t\ttotalArea += node->aabb.GetPerimeter();\n\t}\n\n\treturn totalArea / rootArea;\n}\n\n// Compute the height of a sub-tree.\nint32 b2DynamicTree::ComputeHeight(int32 nodeId) const\n{\n\tb2Assert(0 <= nodeId && nodeId < m_nodeCapacity);\n\tb2TreeNode* node = m_nodes + nodeId;\n\n\tif (node->IsLeaf())\n\t{\n\t\treturn 0;\n\t}\n\n\tint32 height1 = ComputeHeight(node->child1);\n\tint32 height2 = ComputeHeight(node->child2);\n\treturn 1 + b2Max(height1, height2);\n}\n\nint32 b2DynamicTree::ComputeHeight() const\n{\n\tint32 height = ComputeHeight(m_root);\n\treturn height;\n}\n\nvoid b2DynamicTree::ValidateStructure(int32 index) const\n{\n\tif (index == b2_nullNode)\n\t{\n\t\treturn;\n\t}\n\n\tif (index == m_root)\n\t{\n\t\tb2Assert(m_nodes[index].parent == b2_nullNode);\n\t}\n\n\tconst b2TreeNode* node = m_nodes + index;\n\n\tint32 child1 = node->child1;\n\tint32 child2 = node->child2;\n\n\tif (node->IsLeaf())\n\t{\n\t\tb2Assert(child1 == b2_nullNode);\n\t\tb2Assert(child2 == b2_nullNode);\n\t\tb2Assert(node->height == 0);\n\t\treturn;\n\t}\n\n\tb2Assert(0 <= child1 && child1 < m_nodeCapacity);\n\tb2Assert(0 <= child2 && child2 < m_nodeCapacity);\n\n\tb2Assert(m_nodes[child1].parent == index);\n\tb2Assert(m_nodes[child2].parent == index);\n\n\tValidateStructure(child1);\n\tValidateStructure(child2);\n}\n\nvoid b2DynamicTree::ValidateMetrics(int32 index) const\n{\n\tif (index == b2_nullNode)\n\t{\n\t\treturn;\n\t}\n\n\tconst b2TreeNode* node = m_nodes + index;\n\n\tint32 child1 = node->child1;\n\tint32 child2 = node->child2;\n\n\tif (node->IsLeaf())\n\t{\n\t\tb2Assert(child1 == b2_nullNode);\n\t\tb2Assert(child2 == b2_nullNode);\n\t\tb2Assert(node->height == 0);\n\t\treturn;\n\t}\n\n\tb2Assert(0 <= child1 && child1 < m_nodeCapacity);\n\tb2Assert(0 <= child2 && child2 < m_nodeCapacity);\n\n\tint32 height1 = m_nodes[child1].height;\n\tint32 height2 = m_nodes[child2].height;\n\tint32 height;\n\theight = 1 + b2Max(height1, height2);\n\tb2Assert(node->height == height);\n\n\tb2AABB aabb;\n\taabb.Combine(m_nodes[child1].aabb, m_nodes[child2].aabb);\n\n\tb2Assert(aabb.lowerBound == node->aabb.lowerBound);\n\tb2Assert(aabb.upperBound == node->aabb.upperBound);\n\n\tValidateMetrics(child1);\n\tValidateMetrics(child2);\n}\n\nvoid b2DynamicTree::Validate() const\n{\n#if defined(b2DEBUG)\n\tValidateStructure(m_root);\n\tValidateMetrics(m_root);\n\n\tint32 freeCount = 0;\n\tint32 freeIndex = m_freeList;\n\twhile (freeIndex != b2_nullNode)\n\t{\n\t\tb2Assert(0 <= freeIndex && freeIndex < m_nodeCapacity);\n\t\tfreeIndex = m_nodes[freeIndex].next;\n\t\t++freeCount;\n\t}\n\n\tb2Assert(GetHeight() == ComputeHeight());\n\n\tb2Assert(m_nodeCount + freeCount == m_nodeCapacity);\n#endif\n}\n\nint32 b2DynamicTree::GetMaxBalance() const\n{\n\tint32 maxBalance = 0;\n\tfor (int32 i = 0; i < m_nodeCapacity; ++i)\n\t{\n\t\tconst b2TreeNode* node = m_nodes + i;\n\t\tif (node->height <= 1)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tb2Assert(node->IsLeaf() == false);\n\n\t\tint32 child1 = node->child1;\n\t\tint32 child2 = node->child2;\n\t\tint32 balance = b2Abs(m_nodes[child2].height - m_nodes[child1].height);\n\t\tmaxBalance = b2Max(maxBalance, balance);\n\t}\n\n\treturn maxBalance;\n}\n\nvoid b2DynamicTree::RebuildBottomUp()\n{\n\tint32* nodes = (int32*)b2Alloc(m_nodeCount * sizeof(int32));\n\tint32 count = 0;\n\n\t// Build array of leaves. Free the rest.\n\tfor (int32 i = 0; i < m_nodeCapacity; ++i)\n\t{\n\t\tif (m_nodes[i].height < 0)\n\t\t{\n\t\t\t// free node in pool\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (m_nodes[i].IsLeaf())\n\t\t{\n\t\t\tm_nodes[i].parent = b2_nullNode;\n\t\t\tnodes[count] = i;\n\t\t\t++count;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tFreeNode(i);\n\t\t}\n\t}\n\n\twhile (count > 1)\n\t{\n\t\tfloat minCost = b2_maxFloat;\n\t\tint32 iMin = -1, jMin = -1;\n\t\tfor (int32 i = 0; i < count; ++i)\n\t\t{\n\t\t\tb2AABB aabbi = m_nodes[nodes[i]].aabb;\n\n\t\t\tfor (int32 j = i + 1; j < count; ++j)\n\t\t\t{\n\t\t\t\tb2AABB aabbj = m_nodes[nodes[j]].aabb;\n\t\t\t\tb2AABB b;\n\t\t\t\tb.Combine(aabbi, aabbj);\n\t\t\t\tfloat cost = b.GetPerimeter();\n\t\t\t\tif (cost < minCost)\n\t\t\t\t{\n\t\t\t\t\tiMin = i;\n\t\t\t\t\tjMin = j;\n\t\t\t\t\tminCost = cost;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tint32 index1 = nodes[iMin];\n\t\tint32 index2 = nodes[jMin];\n\t\tb2TreeNode* child1 = m_nodes + index1;\n\t\tb2TreeNode* child2 = m_nodes + index2;\n\n\t\tint32 parentIndex = AllocateNode();\n\t\tb2TreeNode* parent = m_nodes + parentIndex;\n\t\tparent->child1 = index1;\n\t\tparent->child2 = index2;\n\t\tparent->height = 1 + b2Max(child1->height, child2->height);\n\t\tparent->aabb.Combine(child1->aabb, child2->aabb);\n\t\tparent->parent = b2_nullNode;\n\n\t\tchild1->parent = parentIndex;\n\t\tchild2->parent = parentIndex;\n\n\t\tnodes[jMin] = nodes[count-1];\n\t\tnodes[iMin] = parentIndex;\n\t\t--count;\n\t}\n\n\tm_root = nodes[0];\n\tb2Free(nodes);\n\n\tValidate();\n}\n\nvoid b2DynamicTree::ShiftOrigin(const b2Vec2& newOrigin)\n{\n\t// Build array of leaves. Free the rest.\n\tfor (int32 i = 0; i < m_nodeCapacity; ++i)\n\t{\n\t\tm_nodes[i].aabb.lowerBound -= newOrigin;\n\t\tm_nodes[i].aabb.upperBound -= newOrigin;\n\t}\n}\n"
  },
  {
    "path": "src/libraries/box2d/collision/b2_edge_shape.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_edge_shape.h\"\n#include \"box2d/b2_block_allocator.h\"\n#include <new>\n\nvoid b2EdgeShape::SetOneSided(const b2Vec2& v0, const b2Vec2& v1, const b2Vec2& v2, const b2Vec2& v3)\n{\n\tm_vertex0 = v0;\n\tm_vertex1 = v1;\n\tm_vertex2 = v2;\n\tm_vertex3 = v3;\n\tm_oneSided = true;\n}\n\nvoid b2EdgeShape::SetTwoSided(const b2Vec2& v1, const b2Vec2& v2)\n{\n\tm_vertex1 = v1;\n\tm_vertex2 = v2;\n\tm_oneSided = false;\n}\n\nb2Shape* b2EdgeShape::Clone(b2BlockAllocator* allocator) const\n{\n\tvoid* mem = allocator->Allocate(sizeof(b2EdgeShape));\n\tb2EdgeShape* clone = new (mem) b2EdgeShape;\n\t*clone = *this;\n\treturn clone;\n}\n\nint32 b2EdgeShape::GetChildCount() const\n{\n\treturn 1;\n}\n\nbool b2EdgeShape::TestPoint(const b2Transform& xf, const b2Vec2& p) const\n{\n\tB2_NOT_USED(xf);\n\tB2_NOT_USED(p);\n\treturn false;\n}\n\n// p = p1 + t * d\n// v = v1 + s * e\n// p1 + t * d = v1 + s * e\n// s * e - t * d = p1 - v1\nbool b2EdgeShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input,\n\t\t\t\t\t\t\tconst b2Transform& xf, int32 childIndex) const\n{\n\tB2_NOT_USED(childIndex);\n\n\t// Put the ray into the edge's frame of reference.\n\tb2Vec2 p1 = b2MulT(xf.q, input.p1 - xf.p);\n\tb2Vec2 p2 = b2MulT(xf.q, input.p2 - xf.p);\n\tb2Vec2 d = p2 - p1;\n\n\tb2Vec2 v1 = m_vertex1;\n\tb2Vec2 v2 = m_vertex2;\n\tb2Vec2 e = v2 - v1;\n\n\t// Normal points to the right, looking from v1 at v2\n\tb2Vec2 normal(e.y, -e.x);\n\tnormal.Normalize();\n\n\t// q = p1 + t * d\n\t// dot(normal, q - v1) = 0\n\t// dot(normal, p1 - v1) + t * dot(normal, d) = 0\n\tfloat numerator = b2Dot(normal, v1 - p1);\n\tif (m_oneSided && numerator > 0.0f)\n\t{\n\t\treturn false;\n\t}\n\n\tfloat denominator = b2Dot(normal, d);\n\n\tif (denominator == 0.0f)\n\t{\n\t\treturn false;\n\t}\n\n\tfloat t = numerator / denominator;\n\tif (t < 0.0f || input.maxFraction < t)\n\t{\n\t\treturn false;\n\t}\n\n\tb2Vec2 q = p1 + t * d;\n\n\t// q = v1 + s * r\n\t// s = dot(q - v1, r) / dot(r, r)\n\tb2Vec2 r = v2 - v1;\n\tfloat rr = b2Dot(r, r);\n\tif (rr == 0.0f)\n\t{\n\t\treturn false;\n\t}\n\n\tfloat s = b2Dot(q - v1, r) / rr;\n\tif (s < 0.0f || 1.0f < s)\n\t{\n\t\treturn false;\n\t}\n\n\toutput->fraction = t;\n\tif (numerator > 0.0f)\n\t{\n\t\toutput->normal = -b2Mul(xf.q, normal);\n\t}\n\telse\n\t{\n\t\toutput->normal = b2Mul(xf.q, normal);\n\t}\n\treturn true;\n}\n\nvoid b2EdgeShape::ComputeAABB(b2AABB* aabb, const b2Transform& xf, int32 childIndex) const\n{\n\tB2_NOT_USED(childIndex);\n\n\tb2Vec2 v1 = b2Mul(xf, m_vertex1);\n\tb2Vec2 v2 = b2Mul(xf, m_vertex2);\n\n\tb2Vec2 lower = b2Min(v1, v2);\n\tb2Vec2 upper = b2Max(v1, v2);\n\n\tb2Vec2 r(m_radius, m_radius);\n\taabb->lowerBound = lower - r;\n\taabb->upperBound = upper + r;\n}\n\nvoid b2EdgeShape::ComputeMass(b2MassData* massData, float density) const\n{\n\tB2_NOT_USED(density);\n\n\tmassData->mass = 0.0f;\n\tmassData->center = 0.5f * (m_vertex1 + m_vertex2);\n\tmassData->I = 0.0f;\n}\n"
  },
  {
    "path": "src/libraries/box2d/collision/b2_polygon_shape.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_polygon_shape.h\"\n#include \"box2d/b2_block_allocator.h\"\n\n#include <new>\n\nb2Shape* b2PolygonShape::Clone(b2BlockAllocator* allocator) const\n{\n\tvoid* mem = allocator->Allocate(sizeof(b2PolygonShape));\n\tb2PolygonShape* clone = new (mem) b2PolygonShape;\n\t*clone = *this;\n\treturn clone;\n}\n\nvoid b2PolygonShape::SetAsBox(float hx, float hy)\n{\n\tm_count = 4;\n\tm_vertices[0].Set(-hx, -hy);\n\tm_vertices[1].Set( hx, -hy);\n\tm_vertices[2].Set( hx,  hy);\n\tm_vertices[3].Set(-hx,  hy);\n\tm_normals[0].Set(0.0f, -1.0f);\n\tm_normals[1].Set(1.0f, 0.0f);\n\tm_normals[2].Set(0.0f, 1.0f);\n\tm_normals[3].Set(-1.0f, 0.0f);\n\tm_centroid.SetZero();\n}\n\nvoid b2PolygonShape::SetAsBox(float hx, float hy, const b2Vec2& center, float angle)\n{\n\tm_count = 4;\n\tm_vertices[0].Set(-hx, -hy);\n\tm_vertices[1].Set( hx, -hy);\n\tm_vertices[2].Set( hx,  hy);\n\tm_vertices[3].Set(-hx,  hy);\n\tm_normals[0].Set(0.0f, -1.0f);\n\tm_normals[1].Set(1.0f, 0.0f);\n\tm_normals[2].Set(0.0f, 1.0f);\n\tm_normals[3].Set(-1.0f, 0.0f);\n\tm_centroid = center;\n\n\tb2Transform xf;\n\txf.p = center;\n\txf.q.Set(angle);\n\n\t// Transform vertices and normals.\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tm_vertices[i] = b2Mul(xf, m_vertices[i]);\n\t\tm_normals[i] = b2Mul(xf.q, m_normals[i]);\n\t}\n}\n\nint32 b2PolygonShape::GetChildCount() const\n{\n\treturn 1;\n}\n\nstatic b2Vec2 ComputeCentroid(const b2Vec2* vs, int32 count)\n{\n\tb2Assert(count >= 3);\n\n\tb2Vec2 c(0.0f, 0.0f);\n\tfloat area = 0.0f;\n\n\t// Get a reference point for forming triangles.\n\t// Use the first vertex to reduce round-off errors.\n\tb2Vec2 s = vs[0];\n\n\tconst float inv3 = 1.0f / 3.0f;\n\n\tfor (int32 i = 0; i < count; ++i)\n\t{\n\t\t// Triangle vertices.\n\t\tb2Vec2 p1 = vs[0] - s;\n\t\tb2Vec2 p2 = vs[i] - s;\n\t\tb2Vec2 p3 = i + 1 < count ? vs[i+1] - s : vs[0] - s;\n\n\t\tb2Vec2 e1 = p2 - p1;\n\t\tb2Vec2 e2 = p3 - p1;\n\n\t\tfloat D = b2Cross(e1, e2);\n\n\t\tfloat triangleArea = 0.5f * D;\n\t\tarea += triangleArea;\n\n\t\t// Area weighted centroid\n\t\tc += triangleArea * inv3 * (p1 + p2 + p3);\n\t}\n\n\t// Centroid\n\tb2Assert(area > b2_epsilon);\n\tc = (1.0f / area) * c + s;\n\treturn c;\n}\n\nvoid b2PolygonShape::Set(const b2Vec2* vertices, int32 count)\n{\n\tb2Assert(3 <= count && count <= b2_maxPolygonVertices);\n\tif (count < 3)\n\t{\n\t\tSetAsBox(1.0f, 1.0f);\n\t\treturn;\n\t}\n\t\n\tint32 n = b2Min(count, b2_maxPolygonVertices);\n\n\t// Perform welding and copy vertices into local buffer.\n\tb2Vec2 ps[b2_maxPolygonVertices];\n\tint32 tempCount = 0;\n\tfor (int32 i = 0; i < n; ++i)\n\t{\n\t\tb2Vec2 v = vertices[i];\n\n\t\tbool unique = true;\n\t\tfor (int32 j = 0; j < tempCount; ++j)\n\t\t{\n\t\t\tif (b2DistanceSquared(v, ps[j]) < ((0.5f * b2_linearSlop) * (0.5f * b2_linearSlop)))\n\t\t\t{\n\t\t\t\tunique = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (unique)\n\t\t{\n\t\t\tps[tempCount++] = v;\n\t\t}\n\t}\n\n\tn = tempCount;\n\tif (n < 3)\n\t{\n\t\t// Polygon is degenerate.\n\t\tb2Assert(false);\n\t\tSetAsBox(1.0f, 1.0f);\n\t\treturn;\n\t}\n\n\t// Create the convex hull using the Gift wrapping algorithm\n\t// http://en.wikipedia.org/wiki/Gift_wrapping_algorithm\n\n\t// Find the right most point on the hull\n\tint32 i0 = 0;\n\tfloat x0 = ps[0].x;\n\tfor (int32 i = 1; i < n; ++i)\n\t{\n\t\tfloat x = ps[i].x;\n\t\tif (x > x0 || (x == x0 && ps[i].y < ps[i0].y))\n\t\t{\n\t\t\ti0 = i;\n\t\t\tx0 = x;\n\t\t}\n\t}\n\n\tint32 hull[b2_maxPolygonVertices];\n\tint32 m = 0;\n\tint32 ih = i0;\n\n\tfor (;;)\n\t{\n\t\tb2Assert(m < b2_maxPolygonVertices);\n\t\thull[m] = ih;\n\n\t\tint32 ie = 0;\n\t\tfor (int32 j = 1; j < n; ++j)\n\t\t{\n\t\t\tif (ie == ih)\n\t\t\t{\n\t\t\t\tie = j;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tb2Vec2 r = ps[ie] - ps[hull[m]];\n\t\t\tb2Vec2 v = ps[j] - ps[hull[m]];\n\t\t\tfloat c = b2Cross(r, v);\n\t\t\tif (c < 0.0f)\n\t\t\t{\n\t\t\t\tie = j;\n\t\t\t}\n\n\t\t\t// Collinearity check\n\t\t\tif (c == 0.0f && v.LengthSquared() > r.LengthSquared())\n\t\t\t{\n\t\t\t\tie = j;\n\t\t\t}\n\t\t}\n\n\t\t++m;\n\t\tih = ie;\n\n\t\tif (ie == i0)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tif (m < 3)\n\t{\n\t\t// Polygon is degenerate.\n\t\tb2Assert(false);\n\t\tSetAsBox(1.0f, 1.0f);\n\t\treturn;\n\t}\n\n\tm_count = m;\n\n\t// Copy vertices.\n\tfor (int32 i = 0; i < m; ++i)\n\t{\n\t\tm_vertices[i] = ps[hull[i]];\n\t}\n\n\t// Compute normals. Ensure the edges have non-zero length.\n\tfor (int32 i = 0; i < m; ++i)\n\t{\n\t\tint32 i1 = i;\n\t\tint32 i2 = i + 1 < m ? i + 1 : 0;\n\t\tb2Vec2 edge = m_vertices[i2] - m_vertices[i1];\n\t\tb2Assert(edge.LengthSquared() > b2_epsilon * b2_epsilon);\n\t\tm_normals[i] = b2Cross(edge, 1.0f);\n\t\tm_normals[i].Normalize();\n\t}\n\n\t// Compute the polygon centroid.\n\tm_centroid = ComputeCentroid(m_vertices, m);\n}\n\nbool b2PolygonShape::TestPoint(const b2Transform& xf, const b2Vec2& p) const\n{\n\tb2Vec2 pLocal = b2MulT(xf.q, p - xf.p);\n\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tfloat dot = b2Dot(m_normals[i], pLocal - m_vertices[i]);\n\t\tif (dot > 0.0f)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nbool b2PolygonShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input,\n\t\t\t\t\t\t\t\tconst b2Transform& xf, int32 childIndex) const\n{\n\tB2_NOT_USED(childIndex);\n\n\t// Put the ray into the polygon's frame of reference.\n\tb2Vec2 p1 = b2MulT(xf.q, input.p1 - xf.p);\n\tb2Vec2 p2 = b2MulT(xf.q, input.p2 - xf.p);\n\tb2Vec2 d = p2 - p1;\n\n\tfloat lower = 0.0f, upper = input.maxFraction;\n\n\tint32 index = -1;\n\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\t// p = p1 + a * d\n\t\t// dot(normal, p - v) = 0\n\t\t// dot(normal, p1 - v) + a * dot(normal, d) = 0\n\t\tfloat numerator = b2Dot(m_normals[i], m_vertices[i] - p1);\n\t\tfloat denominator = b2Dot(m_normals[i], d);\n\n\t\tif (denominator == 0.0f)\n\t\t{\t\n\t\t\tif (numerator < 0.0f)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Note: we want this predicate without division:\n\t\t\t// lower < numerator / denominator, where denominator < 0\n\t\t\t// Since denominator < 0, we have to flip the inequality:\n\t\t\t// lower < numerator / denominator <==> denominator * lower > numerator.\n\t\t\tif (denominator < 0.0f && numerator < lower * denominator)\n\t\t\t{\n\t\t\t\t// Increase lower.\n\t\t\t\t// The segment enters this half-space.\n\t\t\t\tlower = numerator / denominator;\n\t\t\t\tindex = i;\n\t\t\t}\n\t\t\telse if (denominator > 0.0f && numerator < upper * denominator)\n\t\t\t{\n\t\t\t\t// Decrease upper.\n\t\t\t\t// The segment exits this half-space.\n\t\t\t\tupper = numerator / denominator;\n\t\t\t}\n\t\t}\n\n\t\t// The use of epsilon here causes the assert on lower to trip\n\t\t// in some cases. Apparently the use of epsilon was to make edge\n\t\t// shapes work, but now those are handled separately.\n\t\t//if (upper < lower - b2_epsilon)\n\t\tif (upper < lower)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tb2Assert(0.0f <= lower && lower <= input.maxFraction);\n\n\tif (index >= 0)\n\t{\n\t\toutput->fraction = lower;\n\t\toutput->normal = b2Mul(xf.q, m_normals[index]);\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nvoid b2PolygonShape::ComputeAABB(b2AABB* aabb, const b2Transform& xf, int32 childIndex) const\n{\n\tB2_NOT_USED(childIndex);\n\n\tb2Vec2 lower = b2Mul(xf, m_vertices[0]);\n\tb2Vec2 upper = lower;\n\n\tfor (int32 i = 1; i < m_count; ++i)\n\t{\n\t\tb2Vec2 v = b2Mul(xf, m_vertices[i]);\n\t\tlower = b2Min(lower, v);\n\t\tupper = b2Max(upper, v);\n\t}\n\n\tb2Vec2 r(m_radius, m_radius);\n\taabb->lowerBound = lower - r;\n\taabb->upperBound = upper + r;\n}\n\nvoid b2PolygonShape::ComputeMass(b2MassData* massData, float density) const\n{\n\t// Polygon mass, centroid, and inertia.\n\t// Let rho be the polygon density in mass per unit area.\n\t// Then:\n\t// mass = rho * int(dA)\n\t// centroid.x = (1/mass) * rho * int(x * dA)\n\t// centroid.y = (1/mass) * rho * int(y * dA)\n\t// I = rho * int((x*x + y*y) * dA)\n\t//\n\t// We can compute these integrals by summing all the integrals\n\t// for each triangle of the polygon. To evaluate the integral\n\t// for a single triangle, we make a change of variables to\n\t// the (u,v) coordinates of the triangle:\n\t// x = x0 + e1x * u + e2x * v\n\t// y = y0 + e1y * u + e2y * v\n\t// where 0 <= u && 0 <= v && u + v <= 1.\n\t//\n\t// We integrate u from [0,1-v] and then v from [0,1].\n\t// We also need to use the Jacobian of the transformation:\n\t// D = cross(e1, e2)\n\t//\n\t// Simplification: triangle centroid = (1/3) * (p1 + p2 + p3)\n\t//\n\t// The rest of the derivation is handled by computer algebra.\n\n\tb2Assert(m_count >= 3);\n\n\tb2Vec2 center(0.0f, 0.0f);\n\tfloat area = 0.0f;\n\tfloat I = 0.0f;\n\n\t// Get a reference point for forming triangles.\n\t// Use the first vertex to reduce round-off errors.\n\tb2Vec2 s = m_vertices[0];\n\n\tconst float k_inv3 = 1.0f / 3.0f;\n\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\t// Triangle vertices.\n\t\tb2Vec2 e1 = m_vertices[i] - s;\n\t\tb2Vec2 e2 = i + 1 < m_count ? m_vertices[i+1] - s : m_vertices[0] - s;\n\n\t\tfloat D = b2Cross(e1, e2);\n\n\t\tfloat triangleArea = 0.5f * D;\n\t\tarea += triangleArea;\n\n\t\t// Area weighted centroid\n\t\tcenter += triangleArea * k_inv3 * (e1 + e2);\n\n\t\tfloat ex1 = e1.x, ey1 = e1.y;\n\t\tfloat ex2 = e2.x, ey2 = e2.y;\n\n\t\tfloat intx2 = ex1*ex1 + ex2*ex1 + ex2*ex2;\n\t\tfloat inty2 = ey1*ey1 + ey2*ey1 + ey2*ey2;\n\n\t\tI += (0.25f * k_inv3 * D) * (intx2 + inty2);\n\t}\n\n\t// Total mass\n\tmassData->mass = density * area;\n\n\t// Center of mass\n\tb2Assert(area > b2_epsilon);\n\tcenter *= 1.0f / area;\n\tmassData->center = center + s;\n\n\t// Inertia tensor relative to the local origin (point s).\n\tmassData->I = density * I;\n\t\n\t// Shift to center of mass then to original body origin.\n\tmassData->I += massData->mass * (b2Dot(massData->center, massData->center) - b2Dot(center, center));\n}\n\nbool b2PolygonShape::Validate() const\n{\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tint32 i1 = i;\n\t\tint32 i2 = i < m_count - 1 ? i1 + 1 : 0;\n\t\tb2Vec2 p = m_vertices[i1];\n\t\tb2Vec2 e = m_vertices[i2] - p;\n\n\t\tfor (int32 j = 0; j < m_count; ++j)\n\t\t{\n\t\t\tif (j == i1 || j == i2)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tb2Vec2 v = m_vertices[j] - p;\n\t\t\tfloat c = b2Cross(e, v);\n\t\t\tif (c < 0.0f)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n}\n"
  },
  {
    "path": "src/libraries/box2d/collision/b2_time_of_impact.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_collision.h\"\n#include \"box2d/b2_distance.h\"\n#include \"box2d/b2_circle_shape.h\"\n#include \"box2d/b2_polygon_shape.h\"\n#include \"box2d/b2_time_of_impact.h\"\n#include \"box2d/b2_timer.h\"\n\n#include <stdio.h>\n\nB2_API float b2_toiTime, b2_toiMaxTime;\nB2_API int32 b2_toiCalls, b2_toiIters, b2_toiMaxIters;\nB2_API int32 b2_toiRootIters, b2_toiMaxRootIters;\n\n//\nstruct b2SeparationFunction\n{\n\tenum Type\n\t{\n\t\te_points,\n\t\te_faceA,\n\t\te_faceB\n\t};\n\n\t// TODO_ERIN might not need to return the separation\n\n\tfloat Initialize(const b2SimplexCache* cache,\n\t\tconst b2DistanceProxy* proxyA, const b2Sweep& sweepA,\n\t\tconst b2DistanceProxy* proxyB, const b2Sweep& sweepB,\n\t\tfloat t1)\n\t{\n\t\tm_proxyA = proxyA;\n\t\tm_proxyB = proxyB;\n\t\tint32 count = cache->count;\n\t\tb2Assert(0 < count && count < 3);\n\n\t\tm_sweepA = sweepA;\n\t\tm_sweepB = sweepB;\n\n\t\tb2Transform xfA, xfB;\n\t\tm_sweepA.GetTransform(&xfA, t1);\n\t\tm_sweepB.GetTransform(&xfB, t1);\n\n\t\tif (count == 1)\n\t\t{\n\t\t\tm_type = e_points;\n\t\t\tb2Vec2 localPointA = m_proxyA->GetVertex(cache->indexA[0]);\n\t\t\tb2Vec2 localPointB = m_proxyB->GetVertex(cache->indexB[0]);\n\t\t\tb2Vec2 pointA = b2Mul(xfA, localPointA);\n\t\t\tb2Vec2 pointB = b2Mul(xfB, localPointB);\n\t\t\tm_axis = pointB - pointA;\n\t\t\tfloat s = m_axis.Normalize();\n\t\t\treturn s;\n\t\t}\n\t\telse if (cache->indexA[0] == cache->indexA[1])\n\t\t{\n\t\t\t// Two points on B and one on A.\n\t\t\tm_type = e_faceB;\n\t\t\tb2Vec2 localPointB1 = proxyB->GetVertex(cache->indexB[0]);\n\t\t\tb2Vec2 localPointB2 = proxyB->GetVertex(cache->indexB[1]);\n\n\t\t\tm_axis = b2Cross(localPointB2 - localPointB1, 1.0f);\n\t\t\tm_axis.Normalize();\n\t\t\tb2Vec2 normal = b2Mul(xfB.q, m_axis);\n\n\t\t\tm_localPoint = 0.5f * (localPointB1 + localPointB2);\n\t\t\tb2Vec2 pointB = b2Mul(xfB, m_localPoint);\n\n\t\t\tb2Vec2 localPointA = proxyA->GetVertex(cache->indexA[0]);\n\t\t\tb2Vec2 pointA = b2Mul(xfA, localPointA);\n\n\t\t\tfloat s = b2Dot(pointA - pointB, normal);\n\t\t\tif (s < 0.0f)\n\t\t\t{\n\t\t\t\tm_axis = -m_axis;\n\t\t\t\ts = -s;\n\t\t\t}\n\t\t\treturn s;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Two points on A and one or two points on B.\n\t\t\tm_type = e_faceA;\n\t\t\tb2Vec2 localPointA1 = m_proxyA->GetVertex(cache->indexA[0]);\n\t\t\tb2Vec2 localPointA2 = m_proxyA->GetVertex(cache->indexA[1]);\n\t\t\t\n\t\t\tm_axis = b2Cross(localPointA2 - localPointA1, 1.0f);\n\t\t\tm_axis.Normalize();\n\t\t\tb2Vec2 normal = b2Mul(xfA.q, m_axis);\n\n\t\t\tm_localPoint = 0.5f * (localPointA1 + localPointA2);\n\t\t\tb2Vec2 pointA = b2Mul(xfA, m_localPoint);\n\n\t\t\tb2Vec2 localPointB = m_proxyB->GetVertex(cache->indexB[0]);\n\t\t\tb2Vec2 pointB = b2Mul(xfB, localPointB);\n\n\t\t\tfloat s = b2Dot(pointB - pointA, normal);\n\t\t\tif (s < 0.0f)\n\t\t\t{\n\t\t\t\tm_axis = -m_axis;\n\t\t\t\ts = -s;\n\t\t\t}\n\t\t\treturn s;\n\t\t}\n\t}\n\n\t//\n\tfloat FindMinSeparation(int32* indexA, int32* indexB, float t) const\n\t{\n\t\tb2Transform xfA, xfB;\n\t\tm_sweepA.GetTransform(&xfA, t);\n\t\tm_sweepB.GetTransform(&xfB, t);\n\n\t\tswitch (m_type)\n\t\t{\n\t\tcase e_points:\n\t\t\t{\n\t\t\t\tb2Vec2 axisA = b2MulT(xfA.q,  m_axis);\n\t\t\t\tb2Vec2 axisB = b2MulT(xfB.q, -m_axis);\n\n\t\t\t\t*indexA = m_proxyA->GetSupport(axisA);\n\t\t\t\t*indexB = m_proxyB->GetSupport(axisB);\n\n\t\t\t\tb2Vec2 localPointA = m_proxyA->GetVertex(*indexA);\n\t\t\t\tb2Vec2 localPointB = m_proxyB->GetVertex(*indexB);\n\t\t\t\t\n\t\t\t\tb2Vec2 pointA = b2Mul(xfA, localPointA);\n\t\t\t\tb2Vec2 pointB = b2Mul(xfB, localPointB);\n\n\t\t\t\tfloat separation = b2Dot(pointB - pointA, m_axis);\n\t\t\t\treturn separation;\n\t\t\t}\n\n\t\tcase e_faceA:\n\t\t\t{\n\t\t\t\tb2Vec2 normal = b2Mul(xfA.q, m_axis);\n\t\t\t\tb2Vec2 pointA = b2Mul(xfA, m_localPoint);\n\n\t\t\t\tb2Vec2 axisB = b2MulT(xfB.q, -normal);\n\t\t\t\t\n\t\t\t\t*indexA = -1;\n\t\t\t\t*indexB = m_proxyB->GetSupport(axisB);\n\n\t\t\t\tb2Vec2 localPointB = m_proxyB->GetVertex(*indexB);\n\t\t\t\tb2Vec2 pointB = b2Mul(xfB, localPointB);\n\n\t\t\t\tfloat separation = b2Dot(pointB - pointA, normal);\n\t\t\t\treturn separation;\n\t\t\t}\n\n\t\tcase e_faceB:\n\t\t\t{\n\t\t\t\tb2Vec2 normal = b2Mul(xfB.q, m_axis);\n\t\t\t\tb2Vec2 pointB = b2Mul(xfB, m_localPoint);\n\n\t\t\t\tb2Vec2 axisA = b2MulT(xfA.q, -normal);\n\n\t\t\t\t*indexB = -1;\n\t\t\t\t*indexA = m_proxyA->GetSupport(axisA);\n\n\t\t\t\tb2Vec2 localPointA = m_proxyA->GetVertex(*indexA);\n\t\t\t\tb2Vec2 pointA = b2Mul(xfA, localPointA);\n\n\t\t\t\tfloat separation = b2Dot(pointA - pointB, normal);\n\t\t\t\treturn separation;\n\t\t\t}\n\n\t\tdefault:\n\t\t\tb2Assert(false);\n\t\t\t*indexA = -1;\n\t\t\t*indexB = -1;\n\t\t\treturn 0.0f;\n\t\t}\n\t}\n\n\t//\n\tfloat Evaluate(int32 indexA, int32 indexB, float t) const\n\t{\n\t\tb2Transform xfA, xfB;\n\t\tm_sweepA.GetTransform(&xfA, t);\n\t\tm_sweepB.GetTransform(&xfB, t);\n\n\t\tswitch (m_type)\n\t\t{\n\t\tcase e_points:\n\t\t\t{\n\t\t\t\tb2Vec2 localPointA = m_proxyA->GetVertex(indexA);\n\t\t\t\tb2Vec2 localPointB = m_proxyB->GetVertex(indexB);\n\n\t\t\t\tb2Vec2 pointA = b2Mul(xfA, localPointA);\n\t\t\t\tb2Vec2 pointB = b2Mul(xfB, localPointB);\n\t\t\t\tfloat separation = b2Dot(pointB - pointA, m_axis);\n\n\t\t\t\treturn separation;\n\t\t\t}\n\n\t\tcase e_faceA:\n\t\t\t{\n\t\t\t\tb2Vec2 normal = b2Mul(xfA.q, m_axis);\n\t\t\t\tb2Vec2 pointA = b2Mul(xfA, m_localPoint);\n\n\t\t\t\tb2Vec2 localPointB = m_proxyB->GetVertex(indexB);\n\t\t\t\tb2Vec2 pointB = b2Mul(xfB, localPointB);\n\n\t\t\t\tfloat separation = b2Dot(pointB - pointA, normal);\n\t\t\t\treturn separation;\n\t\t\t}\n\n\t\tcase e_faceB:\n\t\t\t{\n\t\t\t\tb2Vec2 normal = b2Mul(xfB.q, m_axis);\n\t\t\t\tb2Vec2 pointB = b2Mul(xfB, m_localPoint);\n\n\t\t\t\tb2Vec2 localPointA = m_proxyA->GetVertex(indexA);\n\t\t\t\tb2Vec2 pointA = b2Mul(xfA, localPointA);\n\n\t\t\t\tfloat separation = b2Dot(pointA - pointB, normal);\n\t\t\t\treturn separation;\n\t\t\t}\n\n\t\tdefault:\n\t\t\tb2Assert(false);\n\t\t\treturn 0.0f;\n\t\t}\n\t}\n\n\tconst b2DistanceProxy* m_proxyA;\n\tconst b2DistanceProxy* m_proxyB;\n\tb2Sweep m_sweepA, m_sweepB;\n\tType m_type;\n\tb2Vec2 m_localPoint;\n\tb2Vec2 m_axis;\n};\n\n// CCD via the local separating axis method. This seeks progression\n// by computing the largest time at which separation is maintained.\nvoid b2TimeOfImpact(b2TOIOutput* output, const b2TOIInput* input)\n{\n\tb2Timer timer;\n\n\t++b2_toiCalls;\n\n\toutput->state = b2TOIOutput::e_unknown;\n\toutput->t = input->tMax;\n\n\tconst b2DistanceProxy* proxyA = &input->proxyA;\n\tconst b2DistanceProxy* proxyB = &input->proxyB;\n\n\tb2Sweep sweepA = input->sweepA;\n\tb2Sweep sweepB = input->sweepB;\n\n\t// Large rotations can make the root finder fail, so we normalize the\n\t// sweep angles.\n\tsweepA.Normalize();\n\tsweepB.Normalize();\n\n\tfloat tMax = input->tMax;\n\n\tfloat totalRadius = proxyA->m_radius + proxyB->m_radius;\n\tfloat target = b2Max(b2_linearSlop, totalRadius - 3.0f * b2_linearSlop);\n\tfloat tolerance = 0.25f * b2_linearSlop;\n\tb2Assert(target > tolerance);\n\n\tfloat t1 = 0.0f;\n\tconst int32 k_maxIterations = 20;\t// TODO_ERIN b2Settings\n\tint32 iter = 0;\n\n\t// Prepare input for distance query.\n\tb2SimplexCache cache;\n\tcache.count = 0;\n\tb2DistanceInput distanceInput;\n\tdistanceInput.proxyA = input->proxyA;\n\tdistanceInput.proxyB = input->proxyB;\n\tdistanceInput.useRadii = false;\n\n\t// The outer loop progressively attempts to compute new separating axes.\n\t// This loop terminates when an axis is repeated (no progress is made).\n\tfor(;;)\n\t{\n\t\tb2Transform xfA, xfB;\n\t\tsweepA.GetTransform(&xfA, t1);\n\t\tsweepB.GetTransform(&xfB, t1);\n\n\t\t// Get the distance between shapes. We can also use the results\n\t\t// to get a separating axis.\n\t\tdistanceInput.transformA = xfA;\n\t\tdistanceInput.transformB = xfB;\n\t\tb2DistanceOutput distanceOutput;\n\t\tb2Distance(&distanceOutput, &cache, &distanceInput);\n\n\t\t// If the shapes are overlapped, we give up on continuous collision.\n\t\tif (distanceOutput.distance <= 0.0f)\n\t\t{\n\t\t\t// Failure!\n\t\t\toutput->state = b2TOIOutput::e_overlapped;\n\t\t\toutput->t = 0.0f;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (distanceOutput.distance < target + tolerance)\n\t\t{\n\t\t\t// Victory!\n\t\t\toutput->state = b2TOIOutput::e_touching;\n\t\t\toutput->t = t1;\n\t\t\tbreak;\n\t\t}\n\n\t\t// Initialize the separating axis.\n\t\tb2SeparationFunction fcn;\n\t\tfcn.Initialize(&cache, proxyA, sweepA, proxyB, sweepB, t1);\n#if 0\n\t\t// Dump the curve seen by the root finder\n\t\t{\n\t\t\tconst int32 N = 100;\n\t\t\tfloat dx = 1.0f / N;\n\t\t\tfloat xs[N+1];\n\t\t\tfloat fs[N+1];\n\n\t\t\tfloat x = 0.0f;\n\n\t\t\tfor (int32 i = 0; i <= N; ++i)\n\t\t\t{\n\t\t\t\tsweepA.GetTransform(&xfA, x);\n\t\t\t\tsweepB.GetTransform(&xfB, x);\n\t\t\t\tfloat f = fcn.Evaluate(xfA, xfB) - target;\n\n\t\t\t\tprintf(\"%g %g\\n\", x, f);\n\n\t\t\t\txs[i] = x;\n\t\t\t\tfs[i] = f;\n\n\t\t\t\tx += dx;\n\t\t\t}\n\t\t}\n#endif\n\n\t\t// Compute the TOI on the separating axis. We do this by successively\n\t\t// resolving the deepest point. This loop is bounded by the number of vertices.\n\t\tbool done = false;\n\t\tfloat t2 = tMax;\n\t\tint32 pushBackIter = 0;\n\t\tfor (;;)\n\t\t{\n\t\t\t// Find the deepest point at t2. Store the witness point indices.\n\t\t\tint32 indexA, indexB;\n\t\t\tfloat s2 = fcn.FindMinSeparation(&indexA, &indexB, t2);\n\n\t\t\t// Is the final configuration separated?\n\t\t\tif (s2 > target + tolerance)\n\t\t\t{\n\t\t\t\t// Victory!\n\t\t\t\toutput->state = b2TOIOutput::e_separated;\n\t\t\t\toutput->t = tMax;\n\t\t\t\tdone = true;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Has the separation reached tolerance?\n\t\t\tif (s2 > target - tolerance)\n\t\t\t{\n\t\t\t\t// Advance the sweeps\n\t\t\t\tt1 = t2;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Compute the initial separation of the witness points.\n\t\t\tfloat s1 = fcn.Evaluate(indexA, indexB, t1);\n\n\t\t\t// Check for initial overlap. This might happen if the root finder\n\t\t\t// runs out of iterations.\n\t\t\tif (s1 < target - tolerance)\n\t\t\t{\n\t\t\t\toutput->state = b2TOIOutput::e_failed;\n\t\t\t\toutput->t = t1;\n\t\t\t\tdone = true;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Check for touching\n\t\t\tif (s1 <= target + tolerance)\n\t\t\t{\n\t\t\t\t// Victory! t1 should hold the TOI (could be 0.0).\n\t\t\t\toutput->state = b2TOIOutput::e_touching;\n\t\t\t\toutput->t = t1;\n\t\t\t\tdone = true;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Compute 1D root of: f(x) - target = 0\n\t\t\tint32 rootIterCount = 0;\n\t\t\tfloat a1 = t1, a2 = t2;\n\t\t\tfor (;;)\n\t\t\t{\n\t\t\t\t// Use a mix of the secant rule and bisection.\n\t\t\t\tfloat t;\n\t\t\t\tif (rootIterCount & 1)\n\t\t\t\t{\n\t\t\t\t\t// Secant rule to improve convergence.\n\t\t\t\t\tt = a1 + (target - s1) * (a2 - a1) / (s2 - s1);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Bisection to guarantee progress.\n\t\t\t\t\tt = 0.5f * (a1 + a2);\n\t\t\t\t}\n\n\t\t\t\t++rootIterCount;\n\t\t\t\t++b2_toiRootIters;\n\n\t\t\t\tfloat s = fcn.Evaluate(indexA, indexB, t);\n\n\t\t\t\tif (b2Abs(s - target) < tolerance)\n\t\t\t\t{\n\t\t\t\t\t// t2 holds a tentative value for t1\n\t\t\t\t\tt2 = t;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t// Ensure we continue to bracket the root.\n\t\t\t\tif (s > target)\n\t\t\t\t{\n\t\t\t\t\ta1 = t;\n\t\t\t\t\ts1 = s;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ta2 = t;\n\t\t\t\t\ts2 = s;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (rootIterCount == 50)\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tb2_toiMaxRootIters = b2Max(b2_toiMaxRootIters, rootIterCount);\n\n\t\t\t++pushBackIter;\n\n\t\t\tif (pushBackIter == b2_maxPolygonVertices)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t++iter;\n\t\t++b2_toiIters;\n\n\t\tif (done)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n\t\tif (iter == k_maxIterations)\n\t\t{\n\t\t\t// Root finder got stuck. Semi-victory.\n\t\t\toutput->state = b2TOIOutput::e_failed;\n\t\t\toutput->t = t1;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tb2_toiMaxIters = b2Max(b2_toiMaxIters, iter);\n\n\tfloat time = timer.GetMilliseconds();\n\tb2_toiMaxTime = b2Max(b2_toiMaxTime, time);\n\tb2_toiTime += time;\n}\n"
  },
  {
    "path": "src/libraries/box2d/common/b2_block_allocator.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_block_allocator.h\"\n#include <limits.h>\n#include <string.h>\n#include <stddef.h>\n\nstatic const int32 b2_chunkSize = 16 * 1024;\nstatic const int32 b2_maxBlockSize = 640;\nstatic const int32 b2_chunkArrayIncrement = 128;\n\n// These are the supported object sizes. Actual allocations are rounded up the next size.\nstatic const int32 b2_blockSizes[b2_blockSizeCount] =\n{\n\t16,\t\t// 0\n\t32,\t\t// 1\n\t64,\t\t// 2\n\t96,\t\t// 3\n\t128,\t// 4\n\t160,\t// 5\n\t192,\t// 6\n\t224,\t// 7\n\t256,\t// 8\n\t320,\t// 9\n\t384,\t// 10\n\t448,\t// 11\n\t512,\t// 12\n\t640,\t// 13\n};\n\n// This maps an arbitrary allocation size to a suitable slot in b2_blockSizes.\nstruct b2SizeMap\n{\n\tb2SizeMap()\n\t{\n\t\tint32 j = 0;\n\t\tvalues[0] = 0;\n\t\tfor (int32 i = 1; i <= b2_maxBlockSize; ++i)\n\t\t{\n\t\t\tb2Assert(j < b2_blockSizeCount);\n\t\t\tif (i <= b2_blockSizes[j])\n\t\t\t{\n\t\t\t\tvalues[i] = (uint8)j;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t++j;\n\t\t\t\tvalues[i] = (uint8)j;\n\t\t\t}\n\t\t}\n\t}\n\n\tuint8 values[b2_maxBlockSize + 1];\n};\n\nstatic const b2SizeMap b2_sizeMap;\n\nstruct b2Chunk\n{\n\tint32 blockSize;\n\tb2Block* blocks;\n};\n\nstruct b2Block\n{\n\tb2Block* next;\n};\n\nb2BlockAllocator::b2BlockAllocator()\n{\n\tb2Assert(b2_blockSizeCount < UCHAR_MAX);\n\n\tm_chunkSpace = b2_chunkArrayIncrement;\n\tm_chunkCount = 0;\n\tm_chunks = (b2Chunk*)b2Alloc(m_chunkSpace * sizeof(b2Chunk));\n\t\n\tmemset(m_chunks, 0, m_chunkSpace * sizeof(b2Chunk));\n\tmemset(m_freeLists, 0, sizeof(m_freeLists));\n}\n\nb2BlockAllocator::~b2BlockAllocator()\n{\n\tfor (int32 i = 0; i < m_chunkCount; ++i)\n\t{\n\t\tb2Free(m_chunks[i].blocks);\n\t}\n\n\tb2Free(m_chunks);\n}\n\nvoid* b2BlockAllocator::Allocate(int32 size)\n{\n\tif (size == 0)\n\t{\n\t\treturn nullptr;\n\t}\n\n\tb2Assert(0 < size);\n\n\tif (size > b2_maxBlockSize)\n\t{\n\t\treturn b2Alloc(size);\n\t}\n\n\tint32 index = b2_sizeMap.values[size];\n\tb2Assert(0 <= index && index < b2_blockSizeCount);\n\n\tif (m_freeLists[index])\n\t{\n\t\tb2Block* block = m_freeLists[index];\n\t\tm_freeLists[index] = block->next;\n\t\treturn block;\n\t}\n\telse\n\t{\n\t\tif (m_chunkCount == m_chunkSpace)\n\t\t{\n\t\t\tb2Chunk* oldChunks = m_chunks;\n\t\t\tm_chunkSpace += b2_chunkArrayIncrement;\n\t\t\tm_chunks = (b2Chunk*)b2Alloc(m_chunkSpace * sizeof(b2Chunk));\n\t\t\tmemcpy(m_chunks, oldChunks, m_chunkCount * sizeof(b2Chunk));\n\t\t\tmemset(m_chunks + m_chunkCount, 0, b2_chunkArrayIncrement * sizeof(b2Chunk));\n\t\t\tb2Free(oldChunks);\n\t\t}\n\n\t\tb2Chunk* chunk = m_chunks + m_chunkCount;\n\t\tchunk->blocks = (b2Block*)b2Alloc(b2_chunkSize);\n#if defined(_DEBUG)\n\t\tmemset(chunk->blocks, 0xcd, b2_chunkSize);\n#endif\n\t\tint32 blockSize = b2_blockSizes[index];\n\t\tchunk->blockSize = blockSize;\n\t\tint32 blockCount = b2_chunkSize / blockSize;\n\t\tb2Assert(blockCount * blockSize <= b2_chunkSize);\n\t\tfor (int32 i = 0; i < blockCount - 1; ++i)\n\t\t{\n\t\t\tb2Block* block = (b2Block*)((int8*)chunk->blocks + blockSize * i);\n\t\t\tb2Block* next = (b2Block*)((int8*)chunk->blocks + blockSize * (i + 1));\n\t\t\tblock->next = next;\n\t\t}\n\t\tb2Block* last = (b2Block*)((int8*)chunk->blocks + blockSize * (blockCount - 1));\n\t\tlast->next = nullptr;\n\n\t\tm_freeLists[index] = chunk->blocks->next;\n\t\t++m_chunkCount;\n\n\t\treturn chunk->blocks;\n\t}\n}\n\nvoid b2BlockAllocator::Free(void* p, int32 size)\n{\n\tif (size == 0)\n\t{\n\t\treturn;\n\t}\n\n\tb2Assert(0 < size);\n\n\tif (size > b2_maxBlockSize)\n\t{\n\t\tb2Free(p);\n\t\treturn;\n\t}\n\n\tint32 index = b2_sizeMap.values[size];\n\tb2Assert(0 <= index && index < b2_blockSizeCount);\n\n#if defined(_DEBUG)\n\t// Verify the memory address and size is valid.\n\tint32 blockSize = b2_blockSizes[index];\n\tbool found = false;\n\tfor (int32 i = 0; i < m_chunkCount; ++i)\n\t{\n\t\tb2Chunk* chunk = m_chunks + i;\n\t\tif (chunk->blockSize != blockSize)\n\t\t{\n\t\t\tb2Assert(\t(int8*)p + blockSize <= (int8*)chunk->blocks ||\n\t\t\t\t\t\t(int8*)chunk->blocks + b2_chunkSize <= (int8*)p);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif ((int8*)chunk->blocks <= (int8*)p && (int8*)p + blockSize <= (int8*)chunk->blocks + b2_chunkSize)\n\t\t\t{\n\t\t\t\tfound = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tb2Assert(found);\n\n\tmemset(p, 0xfd, blockSize);\n#endif\n\n\tb2Block* block = (b2Block*)p;\n\tblock->next = m_freeLists[index];\n\tm_freeLists[index] = block;\n}\n\nvoid b2BlockAllocator::Clear()\n{\n\tfor (int32 i = 0; i < m_chunkCount; ++i)\n\t{\n\t\tb2Free(m_chunks[i].blocks);\n\t}\n\n\tm_chunkCount = 0;\n\tmemset(m_chunks, 0, m_chunkSpace * sizeof(b2Chunk));\n\tmemset(m_freeLists, 0, sizeof(m_freeLists));\n}\n"
  },
  {
    "path": "src/libraries/box2d/common/b2_draw.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n#include \"box2d/b2_draw.h\"\n\nb2Draw::b2Draw()\n{\n\tm_drawFlags = 0;\n}\n\nvoid b2Draw::SetFlags(uint32 flags)\n{\n\tm_drawFlags = flags;\n}\n\nuint32 b2Draw::GetFlags() const\n{\n\treturn m_drawFlags;\n}\n\nvoid b2Draw::AppendFlags(uint32 flags)\n{\n\tm_drawFlags |= flags;\n}\n\nvoid b2Draw::ClearFlags(uint32 flags)\n{\n\tm_drawFlags &= ~flags;\n}\n"
  },
  {
    "path": "src/libraries/box2d/common/b2_math.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_math.h\"\n\nconst b2Vec2 b2Vec2_zero(0.0f, 0.0f);\n\n/// Solve A * x = b, where b is a column vector. This is more efficient\n/// than computing the inverse in one-shot cases.\nb2Vec3 b2Mat33::Solve33(const b2Vec3& b) const\n{\n\tfloat det = b2Dot(ex, b2Cross(ey, ez));\n\tif (det != 0.0f)\n\t{\n\t\tdet = 1.0f / det;\n\t}\n\tb2Vec3 x;\n\tx.x = det * b2Dot(b, b2Cross(ey, ez));\n\tx.y = det * b2Dot(ex, b2Cross(b, ez));\n\tx.z = det * b2Dot(ex, b2Cross(ey, b));\n\treturn x;\n}\n\n/// Solve A * x = b, where b is a column vector. This is more efficient\n/// than computing the inverse in one-shot cases.\nb2Vec2 b2Mat33::Solve22(const b2Vec2& b) const\n{\n\tfloat a11 = ex.x, a12 = ey.x, a21 = ex.y, a22 = ey.y;\n\tfloat det = a11 * a22 - a12 * a21;\n\tif (det != 0.0f)\n\t{\n\t\tdet = 1.0f / det;\n\t}\n\tb2Vec2 x;\n\tx.x = det * (a22 * b.x - a12 * b.y);\n\tx.y = det * (a11 * b.y - a21 * b.x);\n\treturn x;\n}\n\n///\nvoid b2Mat33::GetInverse22(b2Mat33* M) const\n{\n\tfloat a = ex.x, b = ey.x, c = ex.y, d = ey.y;\n\tfloat det = a * d - b * c;\n\tif (det != 0.0f)\n\t{\n\t\tdet = 1.0f / det;\n\t}\n\n\tM->ex.x =  det * d;\tM->ey.x = -det * b; M->ex.z = 0.0f;\n\tM->ex.y = -det * c;\tM->ey.y =  det * a; M->ey.z = 0.0f;\n\tM->ez.x = 0.0f; M->ez.y = 0.0f; M->ez.z = 0.0f;\n}\n\n/// Returns the zero matrix if singular.\nvoid b2Mat33::GetSymInverse33(b2Mat33* M) const\n{\n\tfloat det = b2Dot(ex, b2Cross(ey, ez));\n\tif (det != 0.0f)\n\t{\n\t\tdet = 1.0f / det;\n\t}\n\n\tfloat a11 = ex.x, a12 = ey.x, a13 = ez.x;\n\tfloat a22 = ey.y, a23 = ez.y;\n\tfloat a33 = ez.z;\n\n\tM->ex.x = det * (a22 * a33 - a23 * a23);\n\tM->ex.y = det * (a13 * a23 - a12 * a33);\n\tM->ex.z = det * (a12 * a23 - a13 * a22);\n\n\tM->ey.x = M->ex.y;\n\tM->ey.y = det * (a11 * a33 - a13 * a13);\n\tM->ey.z = det * (a13 * a12 - a11 * a23);\n\n\tM->ez.x = M->ex.z;\n\tM->ez.y = M->ey.z;\n\tM->ez.z = det * (a11 * a22 - a12 * a12);\n}\n"
  },
  {
    "path": "src/libraries/box2d/common/b2_settings.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#define _CRT_SECURE_NO_WARNINGS\n\n#include \"box2d/b2_settings.h\"\n#include <stdio.h>\n#include <stdarg.h>\n#include <stdlib.h>\n\n#include \"common/Exception.h\"\n\nb2Version b2_version = {2, 4, 0};\n\n// Memory allocators. Modify these to use your own allocator.\nvoid* b2Alloc_Default(int32 size)\n{\n\treturn malloc(size);\n}\n\nvoid b2Free_Default(void* mem)\n{\n\tfree(mem);\n}\n\n// You can modify this to use your logging facility.\nvoid b2Log_Default(const char* string, va_list args)\n{\n\tvprintf(string, args);\n}\n\nvoid loveAssert(bool test, const char* teststr)\n{\n\tif (!test)\n\t\tthrow love::Exception(\"Box2D assertion failed: %s\", teststr);\n}\n\nFILE* b2_dumpFile = nullptr;\n\nvoid b2OpenDump(const char* fileName)\n{\n\tb2Assert(b2_dumpFile == nullptr);\n\tb2_dumpFile = fopen(fileName, \"w\");\n}\n\nvoid b2Dump(const char* string, ...)\n{\n\tif (b2_dumpFile == nullptr)\n\t{\n\t\treturn;\n\t}\n\n\tva_list args;\n\tva_start(args, string);\n\tvfprintf(b2_dumpFile, string, args);\n\tva_end(args);\n}\n\nvoid b2CloseDump()\n{\n\tfclose(b2_dumpFile);\n\tb2_dumpFile = nullptr;\n}\n"
  },
  {
    "path": "src/libraries/box2d/common/b2_stack_allocator.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_stack_allocator.h\"\n#include \"box2d/b2_math.h\"\n\nb2StackAllocator::b2StackAllocator()\n{\n\tm_index = 0;\n\tm_allocation = 0;\n\tm_maxAllocation = 0;\n\tm_entryCount = 0;\n}\n\nb2StackAllocator::~b2StackAllocator()\n{\n\tb2Assert(m_index == 0);\n\tb2Assert(m_entryCount == 0);\n}\n\nvoid* b2StackAllocator::Allocate(int32 size)\n{\n\tb2Assert(m_entryCount < b2_maxStackEntries);\n\n\tb2StackEntry* entry = m_entries + m_entryCount;\n\tentry->size = size;\n\tif (m_index + size > b2_stackSize)\n\t{\n\t\tentry->data = (char*)b2Alloc(size);\n\t\tentry->usedMalloc = true;\n\t}\n\telse\n\t{\n\t\tentry->data = m_data + m_index;\n\t\tentry->usedMalloc = false;\n\t\tm_index += size;\n\t}\n\n\tm_allocation += size;\n\tm_maxAllocation = b2Max(m_maxAllocation, m_allocation);\n\t++m_entryCount;\n\n\treturn entry->data;\n}\n\nvoid b2StackAllocator::Free(void* p)\n{\n\tb2Assert(m_entryCount > 0);\n\tb2StackEntry* entry = m_entries + m_entryCount - 1;\n\tb2Assert(p == entry->data);\n\tif (entry->usedMalloc)\n\t{\n\t\tb2Free(p);\n\t}\n\telse\n\t{\n\t\tm_index -= entry->size;\n\t}\n\tm_allocation -= entry->size;\n\t--m_entryCount;\n\n\tp = nullptr;\n}\n\nint32 b2StackAllocator::GetMaxAllocation() const\n{\n\treturn m_maxAllocation;\n}\n"
  },
  {
    "path": "src/libraries/box2d/common/b2_timer.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_timer.h\"\n\n#if defined(_WIN32)\n\ndouble b2Timer::s_invFrequency = 0.0;\n\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif\n\n#include <windows.h>\n\nb2Timer::b2Timer()\n{\n\tLARGE_INTEGER largeInteger;\n\n\tif (s_invFrequency == 0.0)\n\t{\n\t\tQueryPerformanceFrequency(&largeInteger);\n\t\ts_invFrequency = double(largeInteger.QuadPart);\n\t\tif (s_invFrequency > 0.0)\n\t\t{\n\t\t\ts_invFrequency = 1000.0 / s_invFrequency;\n\t\t}\n\t}\n\n\tQueryPerformanceCounter(&largeInteger);\n\tm_start = double(largeInteger.QuadPart);\n}\n\nvoid b2Timer::Reset()\n{\n\tLARGE_INTEGER largeInteger;\n\tQueryPerformanceCounter(&largeInteger);\n\tm_start = double(largeInteger.QuadPart);\n}\n\nfloat b2Timer::GetMilliseconds() const\n{\n\tLARGE_INTEGER largeInteger;\n\tQueryPerformanceCounter(&largeInteger);\n\tdouble count = double(largeInteger.QuadPart);\n\tfloat ms = float(s_invFrequency * (count - m_start));\n\treturn ms;\n}\n\n#elif defined(__linux__) || defined (__APPLE__)\n\n#include <sys/time.h>\n\nb2Timer::b2Timer()\n{\n    Reset();\n}\n\nvoid b2Timer::Reset()\n{\n    timeval t;\n    gettimeofday(&t, 0);\n    m_start_sec = t.tv_sec;\n    m_start_usec = t.tv_usec;\n}\n\nfloat b2Timer::GetMilliseconds() const\n{\n    timeval t;\n    gettimeofday(&t, 0);\n\ttime_t start_sec = m_start_sec;\n\tsuseconds_t start_usec = m_start_usec;\n\t\n\t// http://www.gnu.org/software/libc/manual/html_node/Elapsed-Time.html\n\tif (t.tv_usec < start_usec)\n\t{\n\t\tint nsec = (start_usec - t.tv_usec) / 1000000 + 1;\n\t\tstart_usec -= 1000000 * nsec;\n\t\tstart_sec += nsec;\n\t}\n\t\n\tif (t.tv_usec - start_usec > 1000000)\n\t{\n\t\tint nsec = (t.tv_usec - start_usec) / 1000000;\n\t\tstart_usec += 1000000 * nsec;\n\t\tstart_sec -= nsec;\n\t}\n\treturn 1000.0f * (t.tv_sec - start_sec) + 0.001f * (t.tv_usec - start_usec);\n}\n\n#else\n\nb2Timer::b2Timer()\n{\n}\n\nvoid b2Timer::Reset()\n{\n}\n\nfloat b2Timer::GetMilliseconds() const\n{\n\treturn 0.0f;\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_body.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_body.h\"\n#include \"box2d/b2_contact.h\"\n#include \"box2d/b2_fixture.h\"\n#include \"box2d/b2_joint.h\"\n#include \"box2d/b2_world.h\"\n\n#include <new>\n\nb2Body::b2Body(const b2BodyDef* bd, b2World* world)\n{\n\tb2Assert(bd->position.IsValid());\n\tb2Assert(bd->linearVelocity.IsValid());\n\tb2Assert(b2IsValid(bd->angle));\n\tb2Assert(b2IsValid(bd->angularVelocity));\n\tb2Assert(b2IsValid(bd->angularDamping) && bd->angularDamping >= 0.0f);\n\tb2Assert(b2IsValid(bd->linearDamping) && bd->linearDamping >= 0.0f);\n\n\tm_flags = 0;\n\n\tif (bd->bullet)\n\t{\n\t\tm_flags |= e_bulletFlag;\n\t}\n\tif (bd->fixedRotation)\n\t{\n\t\tm_flags |= e_fixedRotationFlag;\n\t}\n\tif (bd->allowSleep)\n\t{\n\t\tm_flags |= e_autoSleepFlag;\n\t}\n\tif (bd->awake && bd->type != b2_staticBody)\n\t{\n\t\tm_flags |= e_awakeFlag;\n\t}\n\tif (bd->enabled)\n\t{\n\t\tm_flags |= e_enabledFlag;\n\t}\n\n\tm_world = world;\n\n\tm_xf.p = bd->position;\n\tm_xf.q.Set(bd->angle);\n\n\tm_sweep.localCenter.SetZero();\n\tm_sweep.c0 = m_xf.p;\n\tm_sweep.c = m_xf.p;\n\tm_sweep.a0 = bd->angle;\n\tm_sweep.a = bd->angle;\n\tm_sweep.alpha0 = 0.0f;\n\n\tm_jointList = nullptr;\n\tm_contactList = nullptr;\n\tm_prev = nullptr;\n\tm_next = nullptr;\n\n\tm_linearVelocity = bd->linearVelocity;\n\tm_angularVelocity = bd->angularVelocity;\n\n\tm_linearDamping = bd->linearDamping;\n\tm_angularDamping = bd->angularDamping;\n\tm_gravityScale = bd->gravityScale;\n\n\tm_force.SetZero();\n\tm_torque = 0.0f;\n\n\tm_sleepTime = 0.0f;\n\n\tm_type = bd->type;\n\n\tm_mass = 0.0f;\n\tm_invMass = 0.0f;\n\n\tm_I = 0.0f;\n\tm_invI = 0.0f;\n\n\tm_userData = bd->userData;\n\n\tm_fixtureList = nullptr;\n\tm_fixtureCount = 0;\n}\n\nb2Body::~b2Body()\n{\n\t// shapes and joints are destroyed in b2World::Destroy\n}\n\nvoid b2Body::SetType(b2BodyType type)\n{\n\tb2Assert(m_world->IsLocked() == false);\n\tif (m_world->IsLocked() == true)\n\t{\n\t\treturn;\n\t}\n\n\tif (m_type == type)\n\t{\n\t\treturn;\n\t}\n\n\tm_type = type;\n\n\tResetMassData();\n\n\tif (m_type == b2_staticBody)\n\t{\n\t\tm_linearVelocity.SetZero();\n\t\tm_angularVelocity = 0.0f;\n\t\tm_sweep.a0 = m_sweep.a;\n\t\tm_sweep.c0 = m_sweep.c;\n\t\tm_flags &= ~e_awakeFlag;\n\t\tSynchronizeFixtures();\n\t}\n\n\tSetAwake(true);\n\n\tm_force.SetZero();\n\tm_torque = 0.0f;\n\n\t// Delete the attached contacts.\n\tb2ContactEdge* ce = m_contactList;\n\twhile (ce)\n\t{\n\t\tb2ContactEdge* ce0 = ce;\n\t\tce = ce->next;\n\t\tm_world->m_contactManager.Destroy(ce0->contact);\n\t}\n\tm_contactList = nullptr;\n\n\t// Touch the proxies so that new contacts will be created (when appropriate)\n\tb2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase;\n\tfor (b2Fixture* f = m_fixtureList; f; f = f->m_next)\n\t{\n\t\tint32 proxyCount = f->m_proxyCount;\n\t\tfor (int32 i = 0; i < proxyCount; ++i)\n\t\t{\n\t\t\tbroadPhase->TouchProxy(f->m_proxies[i].proxyId);\n\t\t}\n\t}\n}\n\nb2Fixture* b2Body::CreateFixture(const b2FixtureDef* def)\n{\n\tb2Assert(m_world->IsLocked() == false);\n\tif (m_world->IsLocked() == true)\n\t{\n\t\treturn nullptr;\n\t}\n\n\tb2BlockAllocator* allocator = &m_world->m_blockAllocator;\n\n\tvoid* memory = allocator->Allocate(sizeof(b2Fixture));\n\tb2Fixture* fixture = new (memory) b2Fixture;\n\tfixture->Create(allocator, this, def);\n\n\tif (m_flags & e_enabledFlag)\n\t{\n\t\tb2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase;\n\t\tfixture->CreateProxies(broadPhase, m_xf);\n\t}\n\n\tfixture->m_next = m_fixtureList;\n\tm_fixtureList = fixture;\n\t++m_fixtureCount;\n\n\tfixture->m_body = this;\n\n\t// Adjust mass properties if needed.\n\tif (fixture->m_density > 0.0f)\n\t{\n\t\tResetMassData();\n\t}\n\n\t// Let the world know we have a new fixture. This will cause new contacts\n\t// to be created at the beginning of the next time step.\n\tm_world->m_newContacts = true;\n\n\treturn fixture;\n}\n\nb2Fixture* b2Body::CreateFixture(const b2Shape* shape, float density)\n{\n\tb2FixtureDef def;\n\tdef.shape = shape;\n\tdef.density = density;\n\n\treturn CreateFixture(&def);\n}\n\nvoid b2Body::DestroyFixture(b2Fixture* fixture)\n{\n\tif (fixture == NULL)\n\t{\n\t\treturn;\n\t}\n\n\tb2Assert(m_world->IsLocked() == false);\n\tif (m_world->IsLocked() == true)\n\t{\n\t\treturn;\n\t}\n\n\tb2Assert(fixture->m_body == this);\n\n\t// Remove the fixture from this body's singly linked list.\n\tb2Assert(m_fixtureCount > 0);\n\tb2Fixture** node = &m_fixtureList;\n\tbool found = false;\n\twhile (*node != nullptr)\n\t{\n\t\tif (*node == fixture)\n\t\t{\n\t\t\t*node = fixture->m_next;\n\t\t\tfound = true;\n\t\t\tbreak;\n\t\t}\n\n\t\tnode = &(*node)->m_next;\n\t}\n\n\t// You tried to remove a shape that is not attached to this body.\n\tb2Assert(found);\n\n\t// Destroy any contacts associated with the fixture.\n\tb2ContactEdge* edge = m_contactList;\n\twhile (edge)\n\t{\n\t\tb2Contact* c = edge->contact;\n\t\tedge = edge->next;\n\n\t\tb2Fixture* fixtureA = c->GetFixtureA();\n\t\tb2Fixture* fixtureB = c->GetFixtureB();\n\n\t\tif (fixture == fixtureA || fixture == fixtureB)\n\t\t{\n\t\t\t// This destroys the contact and removes it from\n\t\t\t// this body's contact list.\n\t\t\tm_world->m_contactManager.Destroy(c);\n\t\t}\n\t}\n\n\tb2BlockAllocator* allocator = &m_world->m_blockAllocator;\n\n\tif (m_flags & e_enabledFlag)\n\t{\n\t\tb2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase;\n\t\tfixture->DestroyProxies(broadPhase);\n\t}\n\n\tfixture->m_body = nullptr;\n\tfixture->m_next = nullptr;\n\tfixture->Destroy(allocator);\n\tfixture->~b2Fixture();\n\tallocator->Free(fixture, sizeof(b2Fixture));\n\n\t--m_fixtureCount;\n\n\t// Reset the mass data.\n\tResetMassData();\n}\n\nvoid b2Body::ResetMassData()\n{\n\t// Compute mass data from shapes. Each shape has its own density.\n\tm_mass = 0.0f;\n\tm_invMass = 0.0f;\n\tm_I = 0.0f;\n\tm_invI = 0.0f;\n\tm_sweep.localCenter.SetZero();\n\n\t// Static and kinematic bodies have zero mass.\n\tif (m_type == b2_staticBody || m_type == b2_kinematicBody)\n\t{\n\t\tm_sweep.c0 = m_xf.p;\n\t\tm_sweep.c = m_xf.p;\n\t\tm_sweep.a0 = m_sweep.a;\n\t\treturn;\n\t}\n\n\tb2Assert(m_type == b2_dynamicBody);\n\n\t// Accumulate mass over all fixtures.\n\tb2Vec2 localCenter = b2Vec2_zero;\n\tfor (b2Fixture* f = m_fixtureList; f; f = f->m_next)\n\t{\n\t\tif (f->m_density == 0.0f)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tb2MassData massData;\n\t\tf->GetMassData(&massData);\n\t\tm_mass += massData.mass;\n\t\tlocalCenter += massData.mass * massData.center;\n\t\tm_I += massData.I;\n\t}\n\n\t// Compute center of mass.\n\tif (m_mass > 0.0f)\n\t{\n\t\tm_invMass = 1.0f / m_mass;\n\t\tlocalCenter *= m_invMass;\n\t}\n\n\tif (m_I > 0.0f && (m_flags & e_fixedRotationFlag) == 0)\n\t{\n\t\t// Center the inertia about the center of mass.\n\t\tm_I -= m_mass * b2Dot(localCenter, localCenter);\n\t\tb2Assert(m_I > 0.0f);\n\t\tm_invI = 1.0f / m_I;\n\n\t}\n\telse\n\t{\n\t\tm_I = 0.0f;\n\t\tm_invI = 0.0f;\n\t}\n\n\t// Move center of mass.\n\tb2Vec2 oldCenter = m_sweep.c;\n\tm_sweep.localCenter = localCenter;\n\tm_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter);\n\n\t// Update center of mass velocity.\n\tm_linearVelocity += b2Cross(m_angularVelocity, m_sweep.c - oldCenter);\n}\n\nvoid b2Body::SetMassData(const b2MassData* massData)\n{\n\tb2Assert(m_world->IsLocked() == false);\n\tif (m_world->IsLocked() == true)\n\t{\n\t\treturn;\n\t}\n\n\tif (m_type != b2_dynamicBody)\n\t{\n\t\treturn;\n\t}\n\n\tm_invMass = 0.0f;\n\tm_I = 0.0f;\n\tm_invI = 0.0f;\n\n\tm_mass = massData->mass;\n\tif (m_mass <= 0.0f)\n\t{\n\t\tm_mass = 1.0f;\n\t}\n\n\tm_invMass = 1.0f / m_mass;\n\n\tif (massData->I > 0.0f && (m_flags & b2Body::e_fixedRotationFlag) == 0)\n\t{\n\t\tm_I = massData->I - m_mass * b2Dot(massData->center, massData->center);\n\t\tb2Assert(m_I > 0.0f);\n\t\tm_invI = 1.0f / m_I;\n\t}\n\n\t// Move center of mass.\n\tb2Vec2 oldCenter = m_sweep.c;\n\tm_sweep.localCenter =  massData->center;\n\tm_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter);\n\n\t// Update center of mass velocity.\n\tm_linearVelocity += b2Cross(m_angularVelocity, m_sweep.c - oldCenter);\n}\n\nbool b2Body::ShouldCollide(const b2Body* other) const\n{\n\t// At least one body should be dynamic.\n\tif (m_type != b2_dynamicBody && other->m_type != b2_dynamicBody)\n\t{\n\t\treturn false;\n\t}\n\n\t// Does a joint prevent collision?\n\tfor (b2JointEdge* jn = m_jointList; jn; jn = jn->next)\n\t{\n\t\tif (jn->other == other)\n\t\t{\n\t\t\tif (jn->joint->m_collideConnected == false)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n}\n\nvoid b2Body::SetTransform(const b2Vec2& position, float angle)\n{\n\tb2Assert(m_world->IsLocked() == false);\n\tif (m_world->IsLocked() == true)\n\t{\n\t\treturn;\n\t}\n\n\tm_xf.q.Set(angle);\n\tm_xf.p = position;\n\n\tm_sweep.c = b2Mul(m_xf, m_sweep.localCenter);\n\tm_sweep.a = angle;\n\n\tm_sweep.c0 = m_sweep.c;\n\tm_sweep.a0 = angle;\n\n\tb2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase;\n\tfor (b2Fixture* f = m_fixtureList; f; f = f->m_next)\n\t{\n\t\tf->Synchronize(broadPhase, m_xf, m_xf);\n\t}\n\n\t// Check for new contacts the next step\n\tm_world->m_newContacts = true;\n}\n\nvoid b2Body::SynchronizeFixtures()\n{\n\tb2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase;\n\n\tif (m_flags & b2Body::e_awakeFlag)\n\t{\n\t\tb2Transform xf1;\n\t\txf1.q.Set(m_sweep.a0);\n\t\txf1.p = m_sweep.c0 - b2Mul(xf1.q, m_sweep.localCenter);\n\n\t\tfor (b2Fixture* f = m_fixtureList; f; f = f->m_next)\n\t\t{\n\t\t\tf->Synchronize(broadPhase, xf1, m_xf);\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (b2Fixture* f = m_fixtureList; f; f = f->m_next)\n\t\t{\n\t\t\tf->Synchronize(broadPhase, m_xf, m_xf);\n\t\t}\n\t}\n}\n\nvoid b2Body::SetEnabled(bool flag)\n{\n\tb2Assert(m_world->IsLocked() == false);\n\n\tif (flag == IsEnabled())\n\t{\n\t\treturn;\n\t}\n\n\tif (flag)\n\t{\n\t\tm_flags |= e_enabledFlag;\n\n\t\t// Create all proxies.\n\t\tb2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase;\n\t\tfor (b2Fixture* f = m_fixtureList; f; f = f->m_next)\n\t\t{\n\t\t\tf->CreateProxies(broadPhase, m_xf);\n\t\t}\n\n\t\t// Contacts are created at the beginning of the next\n\t\tm_world->m_newContacts = true;\n\t}\n\telse\n\t{\n\t\tm_flags &= ~e_enabledFlag;\n\n\t\t// Destroy all proxies.\n\t\tb2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase;\n\t\tfor (b2Fixture* f = m_fixtureList; f; f = f->m_next)\n\t\t{\n\t\t\tf->DestroyProxies(broadPhase);\n\t\t}\n\n\t\t// Destroy the attached contacts.\n\t\tb2ContactEdge* ce = m_contactList;\n\t\twhile (ce)\n\t\t{\n\t\t\tb2ContactEdge* ce0 = ce;\n\t\t\tce = ce->next;\n\t\t\tm_world->m_contactManager.Destroy(ce0->contact);\n\t\t}\n\t\tm_contactList = nullptr;\n\t}\n}\n\nvoid b2Body::SetFixedRotation(bool flag)\n{\n\tbool status = (m_flags & e_fixedRotationFlag) == e_fixedRotationFlag;\n\tif (status == flag)\n\t{\n\t\treturn;\n\t}\n\n\tif (flag)\n\t{\n\t\tm_flags |= e_fixedRotationFlag;\n\t}\n\telse\n\t{\n\t\tm_flags &= ~e_fixedRotationFlag;\n\t}\n\n\tm_angularVelocity = 0.0f;\n\n\tResetMassData();\n}\n\nvoid b2Body::Dump()\n{\n\tint32 bodyIndex = m_islandIndex;\n\n\t// %.9g is sufficient to save and load the same value using text\n\t// FLT_DECIMAL_DIG == 9\n\n\tb2Dump(\"{\\n\");\n\tb2Dump(\"  b2BodyDef bd;\\n\");\n\tb2Dump(\"  bd.type = b2BodyType(%d);\\n\", m_type);\n\tb2Dump(\"  bd.position.Set(%.9g, %.9g);\\n\", m_xf.p.x, m_xf.p.y);\n\tb2Dump(\"  bd.angle = %.9g;\\n\", m_sweep.a);\n\tb2Dump(\"  bd.linearVelocity.Set(%.9g, %.9g);\\n\", m_linearVelocity.x, m_linearVelocity.y);\n\tb2Dump(\"  bd.angularVelocity = %.9g;\\n\", m_angularVelocity);\n\tb2Dump(\"  bd.linearDamping = %.9g;\\n\", m_linearDamping);\n\tb2Dump(\"  bd.angularDamping = %.9g;\\n\", m_angularDamping);\n\tb2Dump(\"  bd.allowSleep = bool(%d);\\n\", m_flags & e_autoSleepFlag);\n\tb2Dump(\"  bd.awake = bool(%d);\\n\", m_flags & e_awakeFlag);\n\tb2Dump(\"  bd.fixedRotation = bool(%d);\\n\", m_flags & e_fixedRotationFlag);\n\tb2Dump(\"  bd.bullet = bool(%d);\\n\", m_flags & e_bulletFlag);\n\tb2Dump(\"  bd.enabled = bool(%d);\\n\", m_flags & e_enabledFlag);\n\tb2Dump(\"  bd.gravityScale = %.9g;\\n\", m_gravityScale);\n\tb2Dump(\"  bodies[%d] = m_world->CreateBody(&bd);\\n\", m_islandIndex);\n\tb2Dump(\"\\n\");\n\tfor (b2Fixture* f = m_fixtureList; f; f = f->m_next)\n\t{\n\t\tb2Dump(\"  {\\n\");\n\t\tf->Dump(bodyIndex);\n\t\tb2Dump(\"  }\\n\");\n\t}\n\tb2Dump(\"}\\n\");\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_chain_circle_contact.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"b2_chain_circle_contact.h\"\n#include \"box2d/b2_block_allocator.h\"\n#include \"box2d/b2_fixture.h\"\n#include \"box2d/b2_chain_shape.h\"\n#include \"box2d/b2_edge_shape.h\"\n\n#include <new>\n\nb2Contact* b2ChainAndCircleContact::Create(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator)\n{\n\tvoid* mem = allocator->Allocate(sizeof(b2ChainAndCircleContact));\n\treturn new (mem) b2ChainAndCircleContact(fixtureA, indexA, fixtureB, indexB);\n}\n\nvoid b2ChainAndCircleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator)\n{\n\t((b2ChainAndCircleContact*)contact)->~b2ChainAndCircleContact();\n\tallocator->Free(contact, sizeof(b2ChainAndCircleContact));\n}\n\nb2ChainAndCircleContact::b2ChainAndCircleContact(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB)\n: b2Contact(fixtureA, indexA, fixtureB, indexB)\n{\n\tb2Assert(m_fixtureA->GetType() == b2Shape::e_chain);\n\tb2Assert(m_fixtureB->GetType() == b2Shape::e_circle);\n}\n\nvoid b2ChainAndCircleContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB)\n{\n\tb2ChainShape* chain = (b2ChainShape*)m_fixtureA->GetShape();\n\tb2EdgeShape edge;\n\tchain->GetChildEdge(&edge, m_indexA);\n\tb2CollideEdgeAndCircle(\tmanifold, &edge, xfA,\n\t\t\t\t\t\t\t(b2CircleShape*)m_fixtureB->GetShape(), xfB);\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_chain_circle_contact.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_CHAIN_AND_CIRCLE_CONTACT_H\n#define B2_CHAIN_AND_CIRCLE_CONTACT_H\n\n#include \"box2d/b2_contact.h\"\n\nclass b2BlockAllocator;\n\nclass b2ChainAndCircleContact : public b2Contact\n{\npublic:\n\tstatic b2Contact* Create(\tb2Fixture* fixtureA, int32 indexA,\n\t\t\t\t\t\t\t\tb2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator);\n\tstatic void Destroy(b2Contact* contact, b2BlockAllocator* allocator);\n\n\tb2ChainAndCircleContact(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB);\n\t~b2ChainAndCircleContact() {}\n\n\tvoid Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) override;\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_chain_polygon_contact.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"b2_chain_polygon_contact.h\"\n#include \"box2d/b2_block_allocator.h\"\n#include \"box2d/b2_fixture.h\"\n#include \"box2d/b2_chain_shape.h\"\n#include \"box2d/b2_edge_shape.h\"\n\n#include <new>\n\nb2Contact* b2ChainAndPolygonContact::Create(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator)\n{\n\tvoid* mem = allocator->Allocate(sizeof(b2ChainAndPolygonContact));\n\treturn new (mem) b2ChainAndPolygonContact(fixtureA, indexA, fixtureB, indexB);\n}\n\nvoid b2ChainAndPolygonContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator)\n{\n\t((b2ChainAndPolygonContact*)contact)->~b2ChainAndPolygonContact();\n\tallocator->Free(contact, sizeof(b2ChainAndPolygonContact));\n}\n\nb2ChainAndPolygonContact::b2ChainAndPolygonContact(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB)\n: b2Contact(fixtureA, indexA, fixtureB, indexB)\n{\n\tb2Assert(m_fixtureA->GetType() == b2Shape::e_chain);\n\tb2Assert(m_fixtureB->GetType() == b2Shape::e_polygon);\n}\n\nvoid b2ChainAndPolygonContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB)\n{\n\tb2ChainShape* chain = (b2ChainShape*)m_fixtureA->GetShape();\n\tb2EdgeShape edge;\n\tchain->GetChildEdge(&edge, m_indexA);\n\tb2CollideEdgeAndPolygon(\tmanifold, &edge, xfA,\n\t\t\t\t\t\t\t\t(b2PolygonShape*)m_fixtureB->GetShape(), xfB);\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_chain_polygon_contact.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_CHAIN_AND_POLYGON_CONTACT_H\n#define B2_CHAIN_AND_POLYGON_CONTACT_H\n\n#include \"box2d/b2_contact.h\"\n\nclass b2BlockAllocator;\n\nclass b2ChainAndPolygonContact : public b2Contact\n{\npublic:\n\tstatic b2Contact* Create(\tb2Fixture* fixtureA, int32 indexA,\n\t\t\t\t\t\t\t\tb2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator);\n\tstatic void Destroy(b2Contact* contact, b2BlockAllocator* allocator);\n\n\tb2ChainAndPolygonContact(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB);\n\t~b2ChainAndPolygonContact() {}\n\n\tvoid Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) override;\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_circle_contact.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"b2_circle_contact.h\"\n#include \"box2d/b2_block_allocator.h\"\n#include \"box2d/b2_body.h\"\n#include \"box2d/b2_fixture.h\"\n#include \"box2d/b2_time_of_impact.h\"\n#include \"box2d/b2_world_callbacks.h\"\n\n#include <new>\n\nb2Contact* b2CircleContact::Create(b2Fixture* fixtureA, int32, b2Fixture* fixtureB, int32, b2BlockAllocator* allocator)\n{\n\tvoid* mem = allocator->Allocate(sizeof(b2CircleContact));\n\treturn new (mem) b2CircleContact(fixtureA, fixtureB);\n}\n\nvoid b2CircleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator)\n{\n\t((b2CircleContact*)contact)->~b2CircleContact();\n\tallocator->Free(contact, sizeof(b2CircleContact));\n}\n\nb2CircleContact::b2CircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB)\n\t: b2Contact(fixtureA, 0, fixtureB, 0)\n{\n\tb2Assert(m_fixtureA->GetType() == b2Shape::e_circle);\n\tb2Assert(m_fixtureB->GetType() == b2Shape::e_circle);\n}\n\nvoid b2CircleContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB)\n{\n\tb2CollideCircles(manifold,\n\t\t\t\t\t(b2CircleShape*)m_fixtureA->GetShape(), xfA,\n\t\t\t\t\t(b2CircleShape*)m_fixtureB->GetShape(), xfB);\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_circle_contact.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_CIRCLE_CONTACT_H\n#define B2_CIRCLE_CONTACT_H\n\n#include \"box2d/b2_contact.h\"\n\nclass b2BlockAllocator;\n\nclass b2CircleContact : public b2Contact\n{\npublic:\n\tstatic b2Contact* Create(\tb2Fixture* fixtureA, int32 indexA,\n\t\t\t\t\t\t\t\tb2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator);\n\tstatic void Destroy(b2Contact* contact, b2BlockAllocator* allocator);\n\n\tb2CircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB);\n\t~b2CircleContact() {}\n\n\tvoid Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) override;\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_contact.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"b2_chain_circle_contact.h\"\n#include \"b2_chain_polygon_contact.h\"\n#include \"b2_circle_contact.h\"\n#include \"b2_contact_solver.h\"\n#include \"b2_edge_circle_contact.h\"\n#include \"b2_edge_polygon_contact.h\"\n#include \"b2_polygon_circle_contact.h\"\n#include \"b2_polygon_contact.h\"\n\n#include \"box2d/b2_contact.h\"\n#include \"box2d/b2_block_allocator.h\"\n#include \"box2d/b2_body.h\"\n#include \"box2d/b2_collision.h\"\n#include \"box2d/b2_fixture.h\"\n#include \"box2d/b2_shape.h\"\n#include \"box2d/b2_time_of_impact.h\"\n#include \"box2d/b2_world.h\"\n\nb2ContactRegister b2Contact::s_registers[b2Shape::e_typeCount][b2Shape::e_typeCount];\nbool b2Contact::s_initialized = false;\n\nvoid b2Contact::InitializeRegisters()\n{\n\tAddType(b2CircleContact::Create, b2CircleContact::Destroy, b2Shape::e_circle, b2Shape::e_circle);\n\tAddType(b2PolygonAndCircleContact::Create, b2PolygonAndCircleContact::Destroy, b2Shape::e_polygon, b2Shape::e_circle);\n\tAddType(b2PolygonContact::Create, b2PolygonContact::Destroy, b2Shape::e_polygon, b2Shape::e_polygon);\n\tAddType(b2EdgeAndCircleContact::Create, b2EdgeAndCircleContact::Destroy, b2Shape::e_edge, b2Shape::e_circle);\n\tAddType(b2EdgeAndPolygonContact::Create, b2EdgeAndPolygonContact::Destroy, b2Shape::e_edge, b2Shape::e_polygon);\n\tAddType(b2ChainAndCircleContact::Create, b2ChainAndCircleContact::Destroy, b2Shape::e_chain, b2Shape::e_circle);\n\tAddType(b2ChainAndPolygonContact::Create, b2ChainAndPolygonContact::Destroy, b2Shape::e_chain, b2Shape::e_polygon);\n}\n\nvoid b2Contact::AddType(b2ContactCreateFcn* createFcn, b2ContactDestroyFcn* destoryFcn,\n\t\t\t\t\t\tb2Shape::Type type1, b2Shape::Type type2)\n{\n\tb2Assert(0 <= type1 && type1 < b2Shape::e_typeCount);\n\tb2Assert(0 <= type2 && type2 < b2Shape::e_typeCount);\n\t\n\ts_registers[type1][type2].createFcn = createFcn;\n\ts_registers[type1][type2].destroyFcn = destoryFcn;\n\ts_registers[type1][type2].primary = true;\n\n\tif (type1 != type2)\n\t{\n\t\ts_registers[type2][type1].createFcn = createFcn;\n\t\ts_registers[type2][type1].destroyFcn = destoryFcn;\n\t\ts_registers[type2][type1].primary = false;\n\t}\n}\n\nb2Contact* b2Contact::Create(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator)\n{\n\tif (s_initialized == false)\n\t{\n\t\tInitializeRegisters();\n\t\ts_initialized = true;\n\t}\n\n\tb2Shape::Type type1 = fixtureA->GetType();\n\tb2Shape::Type type2 = fixtureB->GetType();\n\n\tb2Assert(0 <= type1 && type1 < b2Shape::e_typeCount);\n\tb2Assert(0 <= type2 && type2 < b2Shape::e_typeCount);\n\t\n\tb2ContactCreateFcn* createFcn = s_registers[type1][type2].createFcn;\n\tif (createFcn)\n\t{\n\t\tif (s_registers[type1][type2].primary)\n\t\t{\n\t\t\treturn createFcn(fixtureA, indexA, fixtureB, indexB, allocator);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn createFcn(fixtureB, indexB, fixtureA, indexA, allocator);\n\t\t}\n\t}\n\telse\n\t{\n\t\treturn nullptr;\n\t}\n}\n\nvoid b2Contact::Destroy(b2Contact* contact, b2BlockAllocator* allocator)\n{\n\tb2Assert(s_initialized == true);\n\n\tb2Fixture* fixtureA = contact->m_fixtureA;\n\tb2Fixture* fixtureB = contact->m_fixtureB;\n\n\tif (contact->m_manifold.pointCount > 0 &&\n\t\tfixtureA->IsSensor() == false &&\n\t\tfixtureB->IsSensor() == false)\n\t{\n\t\tfixtureA->GetBody()->SetAwake(true);\n\t\tfixtureB->GetBody()->SetAwake(true);\n\t}\n\n\tb2Shape::Type typeA = fixtureA->GetType();\n\tb2Shape::Type typeB = fixtureB->GetType();\n\n\tb2Assert(0 <= typeA && typeA < b2Shape::e_typeCount);\n\tb2Assert(0 <= typeB && typeB < b2Shape::e_typeCount);\n\n\tb2ContactDestroyFcn* destroyFcn = s_registers[typeA][typeB].destroyFcn;\n\tdestroyFcn(contact, allocator);\n}\n\nb2Contact::b2Contact(b2Fixture* fA, int32 indexA, b2Fixture* fB, int32 indexB)\n{\n\tm_flags = e_enabledFlag;\n\n\tm_fixtureA = fA;\n\tm_fixtureB = fB;\n\n\tm_indexA = indexA;\n\tm_indexB = indexB;\n\n\tm_manifold.pointCount = 0;\n\n\tm_prev = nullptr;\n\tm_next = nullptr;\n\n\tm_nodeA.contact = nullptr;\n\tm_nodeA.prev = nullptr;\n\tm_nodeA.next = nullptr;\n\tm_nodeA.other = nullptr;\n\n\tm_nodeB.contact = nullptr;\n\tm_nodeB.prev = nullptr;\n\tm_nodeB.next = nullptr;\n\tm_nodeB.other = nullptr;\n\n\tm_toiCount = 0;\n\n\tm_friction = b2MixFriction(m_fixtureA->m_friction, m_fixtureB->m_friction);\n\tm_restitution = b2MixRestitution(m_fixtureA->m_restitution, m_fixtureB->m_restitution);\n\tm_restitutionThreshold = b2MixRestitutionThreshold(m_fixtureA->m_restitutionThreshold, m_fixtureB->m_restitutionThreshold);\n\n\tm_tangentSpeed = 0.0f;\n}\n\n// Update the contact manifold and touching status.\n// Note: do not assume the fixture AABBs are overlapping or are valid.\nvoid b2Contact::Update(b2ContactListener* listener)\n{\n\tb2Manifold oldManifold = m_manifold;\n\n\t// Re-enable this contact.\n\tm_flags |= e_enabledFlag;\n\n\tbool touching = false;\n\tbool wasTouching = (m_flags & e_touchingFlag) == e_touchingFlag;\n\n\tbool sensorA = m_fixtureA->IsSensor();\n\tbool sensorB = m_fixtureB->IsSensor();\n\tbool sensor = sensorA || sensorB;\n\n\tb2Body* bodyA = m_fixtureA->GetBody();\n\tb2Body* bodyB = m_fixtureB->GetBody();\n\tconst b2Transform& xfA = bodyA->GetTransform();\n\tconst b2Transform& xfB = bodyB->GetTransform();\n\n\t// Is this contact a sensor?\n\tif (sensor)\n\t{\n\t\tconst b2Shape* shapeA = m_fixtureA->GetShape();\n\t\tconst b2Shape* shapeB = m_fixtureB->GetShape();\n\t\ttouching = b2TestOverlap(shapeA, m_indexA, shapeB, m_indexB, xfA, xfB);\n\n\t\t// Sensors don't generate manifolds.\n\t\tm_manifold.pointCount = 0;\n\t}\n\telse\n\t{\n\t\tEvaluate(&m_manifold, xfA, xfB);\n\t\ttouching = m_manifold.pointCount > 0;\n\n\t\t// Match old contact ids to new contact ids and copy the\n\t\t// stored impulses to warm start the solver.\n\t\tfor (int32 i = 0; i < m_manifold.pointCount; ++i)\n\t\t{\n\t\t\tb2ManifoldPoint* mp2 = m_manifold.points + i;\n\t\t\tmp2->normalImpulse = 0.0f;\n\t\t\tmp2->tangentImpulse = 0.0f;\n\t\t\tb2ContactID id2 = mp2->id;\n\n\t\t\tfor (int32 j = 0; j < oldManifold.pointCount; ++j)\n\t\t\t{\n\t\t\t\tb2ManifoldPoint* mp1 = oldManifold.points + j;\n\n\t\t\t\tif (mp1->id.key == id2.key)\n\t\t\t\t{\n\t\t\t\t\tmp2->normalImpulse = mp1->normalImpulse;\n\t\t\t\t\tmp2->tangentImpulse = mp1->tangentImpulse;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (touching != wasTouching)\n\t\t{\n\t\t\tbodyA->SetAwake(true);\n\t\t\tbodyB->SetAwake(true);\n\t\t}\n\t}\n\n\tif (touching)\n\t{\n\t\tm_flags |= e_touchingFlag;\n\t}\n\telse\n\t{\n\t\tm_flags &= ~e_touchingFlag;\n\t}\n\n\tif (wasTouching == false && touching == true && listener)\n\t{\n\t\tlistener->BeginContact(this);\n\t}\n\n\tif (wasTouching == true && touching == false && listener)\n\t{\n\t\tlistener->EndContact(this);\n\t}\n\n\tif (sensor == false && touching && listener)\n\t{\n\t\tlistener->PreSolve(this, &oldManifold);\n\t}\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_contact_manager.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_body.h\"\n#include \"box2d/b2_contact.h\"\n#include \"box2d/b2_contact_manager.h\"\n#include \"box2d/b2_fixture.h\"\n#include \"box2d/b2_world_callbacks.h\"\n\nb2ContactFilter b2_defaultFilter;\nb2ContactListener b2_defaultListener;\n\nb2ContactManager::b2ContactManager()\n{\n\tm_contactList = nullptr;\n\tm_contactCount = 0;\n\tm_contactFilter = &b2_defaultFilter;\n\tm_contactListener = &b2_defaultListener;\n\tm_allocator = nullptr;\n}\n\nvoid b2ContactManager::Destroy(b2Contact* c)\n{\n\tb2Fixture* fixtureA = c->GetFixtureA();\n\tb2Fixture* fixtureB = c->GetFixtureB();\n\tb2Body* bodyA = fixtureA->GetBody();\n\tb2Body* bodyB = fixtureB->GetBody();\n\n\tif (m_contactListener && c->IsTouching())\n\t{\n\t\tm_contactListener->EndContact(c);\n\t}\n\n\t// Remove from the world.\n\tif (c->m_prev)\n\t{\n\t\tc->m_prev->m_next = c->m_next;\n\t}\n\n\tif (c->m_next)\n\t{\n\t\tc->m_next->m_prev = c->m_prev;\n\t}\n\n\tif (c == m_contactList)\n\t{\n\t\tm_contactList = c->m_next;\n\t}\n\n\t// Remove from body 1\n\tif (c->m_nodeA.prev)\n\t{\n\t\tc->m_nodeA.prev->next = c->m_nodeA.next;\n\t}\n\n\tif (c->m_nodeA.next)\n\t{\n\t\tc->m_nodeA.next->prev = c->m_nodeA.prev;\n\t}\n\n\tif (&c->m_nodeA == bodyA->m_contactList)\n\t{\n\t\tbodyA->m_contactList = c->m_nodeA.next;\n\t}\n\n\t// Remove from body 2\n\tif (c->m_nodeB.prev)\n\t{\n\t\tc->m_nodeB.prev->next = c->m_nodeB.next;\n\t}\n\n\tif (c->m_nodeB.next)\n\t{\n\t\tc->m_nodeB.next->prev = c->m_nodeB.prev;\n\t}\n\n\tif (&c->m_nodeB == bodyB->m_contactList)\n\t{\n\t\tbodyB->m_contactList = c->m_nodeB.next;\n\t}\n\n\t// Call the factory.\n\tb2Contact::Destroy(c, m_allocator);\n\t--m_contactCount;\n}\n\n// This is the top level collision call for the time step. Here\n// all the narrow phase collision is processed for the world\n// contact list.\nvoid b2ContactManager::Collide()\n{\n\t// Update awake contacts.\n\tb2Contact* c = m_contactList;\n\twhile (c)\n\t{\n\t\tb2Fixture* fixtureA = c->GetFixtureA();\n\t\tb2Fixture* fixtureB = c->GetFixtureB();\n\t\tint32 indexA = c->GetChildIndexA();\n\t\tint32 indexB = c->GetChildIndexB();\n\t\tb2Body* bodyA = fixtureA->GetBody();\n\t\tb2Body* bodyB = fixtureB->GetBody();\n\t\t \n\t\t// Is this contact flagged for filtering?\n\t\tif (c->m_flags & b2Contact::e_filterFlag)\n\t\t{\n\t\t\t// Should these bodies collide?\n\t\t\tif (bodyB->ShouldCollide(bodyA) == false)\n\t\t\t{\n\t\t\t\tb2Contact* cNuke = c;\n\t\t\t\tc = cNuke->GetNext();\n\t\t\t\tDestroy(cNuke);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Check user filtering.\n\t\t\tif (m_contactFilter && m_contactFilter->ShouldCollide(fixtureA, fixtureB) == false)\n\t\t\t{\n\t\t\t\tb2Contact* cNuke = c;\n\t\t\t\tc = cNuke->GetNext();\n\t\t\t\tDestroy(cNuke);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Clear the filtering flag.\n\t\t\tc->m_flags &= ~b2Contact::e_filterFlag;\n\t\t}\n\n\t\tbool activeA = bodyA->IsAwake() && bodyA->m_type != b2_staticBody;\n\t\tbool activeB = bodyB->IsAwake() && bodyB->m_type != b2_staticBody;\n\n\t\t// At least one body must be awake and it must be dynamic or kinematic.\n\t\tif (activeA == false && activeB == false)\n\t\t{\n\t\t\tc = c->GetNext();\n\t\t\tcontinue;\n\t\t}\n\n\t\tint32 proxyIdA = fixtureA->m_proxies[indexA].proxyId;\n\t\tint32 proxyIdB = fixtureB->m_proxies[indexB].proxyId;\n\t\tbool overlap = m_broadPhase.TestOverlap(proxyIdA, proxyIdB);\n\n\t\t// Here we destroy contacts that cease to overlap in the broad-phase.\n\t\tif (overlap == false)\n\t\t{\n\t\t\tb2Contact* cNuke = c;\n\t\t\tc = cNuke->GetNext();\n\t\t\tDestroy(cNuke);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// The contact persists.\n\t\tc->Update(m_contactListener);\n\t\tc = c->GetNext();\n\t}\n}\n\nvoid b2ContactManager::FindNewContacts()\n{\n\tm_broadPhase.UpdatePairs(this);\n}\n\nvoid b2ContactManager::AddPair(void* proxyUserDataA, void* proxyUserDataB)\n{\n\tb2FixtureProxy* proxyA = (b2FixtureProxy*)proxyUserDataA;\n\tb2FixtureProxy* proxyB = (b2FixtureProxy*)proxyUserDataB;\n\n\tb2Fixture* fixtureA = proxyA->fixture;\n\tb2Fixture* fixtureB = proxyB->fixture;\n\n\tint32 indexA = proxyA->childIndex;\n\tint32 indexB = proxyB->childIndex;\n\n\tb2Body* bodyA = fixtureA->GetBody();\n\tb2Body* bodyB = fixtureB->GetBody();\n\n\t// Are the fixtures on the same body?\n\tif (bodyA == bodyB)\n\t{\n\t\treturn;\n\t}\n\n\t// TODO_ERIN use a hash table to remove a potential bottleneck when both\n\t// bodies have a lot of contacts.\n\t// Does a contact already exist?\n\tb2ContactEdge* edge = bodyB->GetContactList();\n\twhile (edge)\n\t{\n\t\tif (edge->other == bodyA)\n\t\t{\n\t\t\tb2Fixture* fA = edge->contact->GetFixtureA();\n\t\t\tb2Fixture* fB = edge->contact->GetFixtureB();\n\t\t\tint32 iA = edge->contact->GetChildIndexA();\n\t\t\tint32 iB = edge->contact->GetChildIndexB();\n\n\t\t\tif (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB)\n\t\t\t{\n\t\t\t\t// A contact already exists.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA)\n\t\t\t{\n\t\t\t\t// A contact already exists.\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tedge = edge->next;\n\t}\n\n\t// Does a joint override collision? Is at least one body dynamic?\n\tif (bodyB->ShouldCollide(bodyA) == false)\n\t{\n\t\treturn;\n\t}\n\n\t// Check user filtering.\n\tif (m_contactFilter && m_contactFilter->ShouldCollide(fixtureA, fixtureB) == false)\n\t{\n\t\treturn;\n\t}\n\n\t// Call the factory.\n\tb2Contact* c = b2Contact::Create(fixtureA, indexA, fixtureB, indexB, m_allocator);\n\tif (c == nullptr)\n\t{\n\t\treturn;\n\t}\n\n\t// Contact creation may swap fixtures.\n\tfixtureA = c->GetFixtureA();\n\tfixtureB = c->GetFixtureB();\n\tindexA = c->GetChildIndexA();\n\tindexB = c->GetChildIndexB();\n\tbodyA = fixtureA->GetBody();\n\tbodyB = fixtureB->GetBody();\n\n\t// Insert into the world.\n\tc->m_prev = nullptr;\n\tc->m_next = m_contactList;\n\tif (m_contactList != nullptr)\n\t{\n\t\tm_contactList->m_prev = c;\n\t}\n\tm_contactList = c;\n\n\t// Connect to island graph.\n\n\t// Connect to body A\n\tc->m_nodeA.contact = c;\n\tc->m_nodeA.other = bodyB;\n\n\tc->m_nodeA.prev = nullptr;\n\tc->m_nodeA.next = bodyA->m_contactList;\n\tif (bodyA->m_contactList != nullptr)\n\t{\n\t\tbodyA->m_contactList->prev = &c->m_nodeA;\n\t}\n\tbodyA->m_contactList = &c->m_nodeA;\n\n\t// Connect to body B\n\tc->m_nodeB.contact = c;\n\tc->m_nodeB.other = bodyA;\n\n\tc->m_nodeB.prev = nullptr;\n\tc->m_nodeB.next = bodyB->m_contactList;\n\tif (bodyB->m_contactList != nullptr)\n\t{\n\t\tbodyB->m_contactList->prev = &c->m_nodeB;\n\t}\n\tbodyB->m_contactList = &c->m_nodeB;\n\n\t++m_contactCount;\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_contact_solver.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"b2_contact_solver.h\"\n\n#include \"box2d/b2_body.h\"\n#include \"box2d/b2_contact.h\"\n#include \"box2d/b2_fixture.h\"\n#include \"box2d/b2_stack_allocator.h\"\n#include \"box2d/b2_world.h\"\n\n// Solver debugging is normally disabled because the block solver sometimes has to deal with a poorly conditioned effective mass matrix.\n#define B2_DEBUG_SOLVER 0\n\nB2_API bool g_blockSolve = true;\n\nstruct b2ContactPositionConstraint\n{\n\tb2Vec2 localPoints[b2_maxManifoldPoints];\n\tb2Vec2 localNormal;\n\tb2Vec2 localPoint;\n\tint32 indexA;\n\tint32 indexB;\n\tfloat invMassA, invMassB;\n\tb2Vec2 localCenterA, localCenterB;\n\tfloat invIA, invIB;\n\tb2Manifold::Type type;\n\tfloat radiusA, radiusB;\n\tint32 pointCount;\n};\n\nb2ContactSolver::b2ContactSolver(b2ContactSolverDef* def)\n{\n\tm_step = def->step;\n\tm_allocator = def->allocator;\n\tm_count = def->count;\n\tm_positionConstraints = (b2ContactPositionConstraint*)m_allocator->Allocate(m_count * sizeof(b2ContactPositionConstraint));\n\tm_velocityConstraints = (b2ContactVelocityConstraint*)m_allocator->Allocate(m_count * sizeof(b2ContactVelocityConstraint));\n\tm_positions = def->positions;\n\tm_velocities = def->velocities;\n\tm_contacts = def->contacts;\n\n\t// Initialize position independent portions of the constraints.\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tb2Contact* contact = m_contacts[i];\n\n\t\tb2Fixture* fixtureA = contact->m_fixtureA;\n\t\tb2Fixture* fixtureB = contact->m_fixtureB;\n\t\tb2Shape* shapeA = fixtureA->GetShape();\n\t\tb2Shape* shapeB = fixtureB->GetShape();\n\t\tfloat radiusA = shapeA->m_radius;\n\t\tfloat radiusB = shapeB->m_radius;\n\t\tb2Body* bodyA = fixtureA->GetBody();\n\t\tb2Body* bodyB = fixtureB->GetBody();\n\t\tb2Manifold* manifold = contact->GetManifold();\n\n\t\tint32 pointCount = manifold->pointCount;\n\t\tb2Assert(pointCount > 0);\n\n\t\tb2ContactVelocityConstraint* vc = m_velocityConstraints + i;\n\t\tvc->friction = contact->m_friction;\n\t\tvc->restitution = contact->m_restitution;\n\t\tvc->threshold = contact->m_restitutionThreshold;\n\t\tvc->tangentSpeed = contact->m_tangentSpeed;\n\t\tvc->indexA = bodyA->m_islandIndex;\n\t\tvc->indexB = bodyB->m_islandIndex;\n\t\tvc->invMassA = bodyA->m_invMass;\n\t\tvc->invMassB = bodyB->m_invMass;\n\t\tvc->invIA = bodyA->m_invI;\n\t\tvc->invIB = bodyB->m_invI;\n\t\tvc->contactIndex = i;\n\t\tvc->pointCount = pointCount;\n\t\tvc->K.SetZero();\n\t\tvc->normalMass.SetZero();\n\n\t\tb2ContactPositionConstraint* pc = m_positionConstraints + i;\n\t\tpc->indexA = bodyA->m_islandIndex;\n\t\tpc->indexB = bodyB->m_islandIndex;\n\t\tpc->invMassA = bodyA->m_invMass;\n\t\tpc->invMassB = bodyB->m_invMass;\n\t\tpc->localCenterA = bodyA->m_sweep.localCenter;\n\t\tpc->localCenterB = bodyB->m_sweep.localCenter;\n\t\tpc->invIA = bodyA->m_invI;\n\t\tpc->invIB = bodyB->m_invI;\n\t\tpc->localNormal = manifold->localNormal;\n\t\tpc->localPoint = manifold->localPoint;\n\t\tpc->pointCount = pointCount;\n\t\tpc->radiusA = radiusA;\n\t\tpc->radiusB = radiusB;\n\t\tpc->type = manifold->type;\n\n\t\tfor (int32 j = 0; j < pointCount; ++j)\n\t\t{\n\t\t\tb2ManifoldPoint* cp = manifold->points + j;\n\t\t\tb2VelocityConstraintPoint* vcp = vc->points + j;\n\t\n\t\t\tif (m_step.warmStarting)\n\t\t\t{\n\t\t\t\tvcp->normalImpulse = m_step.dtRatio * cp->normalImpulse;\n\t\t\t\tvcp->tangentImpulse = m_step.dtRatio * cp->tangentImpulse;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvcp->normalImpulse = 0.0f;\n\t\t\t\tvcp->tangentImpulse = 0.0f;\n\t\t\t}\n\n\t\t\tvcp->rA.SetZero();\n\t\t\tvcp->rB.SetZero();\n\t\t\tvcp->normalMass = 0.0f;\n\t\t\tvcp->tangentMass = 0.0f;\n\t\t\tvcp->velocityBias = 0.0f;\n\n\t\t\tpc->localPoints[j] = cp->localPoint;\n\t\t}\n\t}\n}\n\nb2ContactSolver::~b2ContactSolver()\n{\n\tm_allocator->Free(m_velocityConstraints);\n\tm_allocator->Free(m_positionConstraints);\n}\n\n// Initialize position dependent portions of the velocity constraints.\nvoid b2ContactSolver::InitializeVelocityConstraints()\n{\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tb2ContactVelocityConstraint* vc = m_velocityConstraints + i;\n\t\tb2ContactPositionConstraint* pc = m_positionConstraints + i;\n\n\t\tfloat radiusA = pc->radiusA;\n\t\tfloat radiusB = pc->radiusB;\n\t\tb2Manifold* manifold = m_contacts[vc->contactIndex]->GetManifold();\n\n\t\tint32 indexA = vc->indexA;\n\t\tint32 indexB = vc->indexB;\n\n\t\tfloat mA = vc->invMassA;\n\t\tfloat mB = vc->invMassB;\n\t\tfloat iA = vc->invIA;\n\t\tfloat iB = vc->invIB;\n\t\tb2Vec2 localCenterA = pc->localCenterA;\n\t\tb2Vec2 localCenterB = pc->localCenterB;\n\n\t\tb2Vec2 cA = m_positions[indexA].c;\n\t\tfloat aA = m_positions[indexA].a;\n\t\tb2Vec2 vA = m_velocities[indexA].v;\n\t\tfloat wA = m_velocities[indexA].w;\n\n\t\tb2Vec2 cB = m_positions[indexB].c;\n\t\tfloat aB = m_positions[indexB].a;\n\t\tb2Vec2 vB = m_velocities[indexB].v;\n\t\tfloat wB = m_velocities[indexB].w;\n\n\t\tb2Assert(manifold->pointCount > 0);\n\n\t\tb2Transform xfA, xfB;\n\t\txfA.q.Set(aA);\n\t\txfB.q.Set(aB);\n\t\txfA.p = cA - b2Mul(xfA.q, localCenterA);\n\t\txfB.p = cB - b2Mul(xfB.q, localCenterB);\n\n\t\tb2WorldManifold worldManifold;\n\t\tworldManifold.Initialize(manifold, xfA, radiusA, xfB, radiusB);\n\n\t\tvc->normal = worldManifold.normal;\n\n\t\tint32 pointCount = vc->pointCount;\n\t\tfor (int32 j = 0; j < pointCount; ++j)\n\t\t{\n\t\t\tb2VelocityConstraintPoint* vcp = vc->points + j;\n\n\t\t\tvcp->rA = worldManifold.points[j] - cA;\n\t\t\tvcp->rB = worldManifold.points[j] - cB;\n\n\t\t\tfloat rnA = b2Cross(vcp->rA, vc->normal);\n\t\t\tfloat rnB = b2Cross(vcp->rB, vc->normal);\n\n\t\t\tfloat kNormal = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n\t\t\tvcp->normalMass = kNormal > 0.0f ? 1.0f / kNormal : 0.0f;\n\n\t\t\tb2Vec2 tangent = b2Cross(vc->normal, 1.0f);\n\n\t\t\tfloat rtA = b2Cross(vcp->rA, tangent);\n\t\t\tfloat rtB = b2Cross(vcp->rB, tangent);\n\n\t\t\tfloat kTangent = mA + mB + iA * rtA * rtA + iB * rtB * rtB;\n\n\t\t\tvcp->tangentMass = kTangent > 0.0f ? 1.0f /  kTangent : 0.0f;\n\n\t\t\t// Setup a velocity bias for restitution.\n\t\t\tvcp->velocityBias = 0.0f;\n\t\t\tfloat vRel = b2Dot(vc->normal, vB + b2Cross(wB, vcp->rB) - vA - b2Cross(wA, vcp->rA));\n\t\t\tif (vRel < -vc->threshold)\n\t\t\t{\n\t\t\t\tvcp->velocityBias = -vc->restitution * vRel;\n\t\t\t}\n\t\t}\n\n\t\t// If we have two points, then prepare the block solver.\n\t\tif (vc->pointCount == 2 && g_blockSolve)\n\t\t{\n\t\t\tb2VelocityConstraintPoint* vcp1 = vc->points + 0;\n\t\t\tb2VelocityConstraintPoint* vcp2 = vc->points + 1;\n\n\t\t\tfloat rn1A = b2Cross(vcp1->rA, vc->normal);\n\t\t\tfloat rn1B = b2Cross(vcp1->rB, vc->normal);\n\t\t\tfloat rn2A = b2Cross(vcp2->rA, vc->normal);\n\t\t\tfloat rn2B = b2Cross(vcp2->rB, vc->normal);\n\n\t\t\tfloat k11 = mA + mB + iA * rn1A * rn1A + iB * rn1B * rn1B;\n\t\t\tfloat k22 = mA + mB + iA * rn2A * rn2A + iB * rn2B * rn2B;\n\t\t\tfloat k12 = mA + mB + iA * rn1A * rn2A + iB * rn1B * rn2B;\n\n\t\t\t// Ensure a reasonable condition number.\n\t\t\tconst float k_maxConditionNumber = 1000.0f;\n\t\t\tif (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12))\n\t\t\t{\n\t\t\t\t// K is safe to invert.\n\t\t\t\tvc->K.ex.Set(k11, k12);\n\t\t\t\tvc->K.ey.Set(k12, k22);\n\t\t\t\tvc->normalMass = vc->K.GetInverse();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// The constraints are redundant, just use one.\n\t\t\t\t// TODO_ERIN use deepest?\n\t\t\t\tvc->pointCount = 1;\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid b2ContactSolver::WarmStart()\n{\n\t// Warm start.\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tb2ContactVelocityConstraint* vc = m_velocityConstraints + i;\n\n\t\tint32 indexA = vc->indexA;\n\t\tint32 indexB = vc->indexB;\n\t\tfloat mA = vc->invMassA;\n\t\tfloat iA = vc->invIA;\n\t\tfloat mB = vc->invMassB;\n\t\tfloat iB = vc->invIB;\n\t\tint32 pointCount = vc->pointCount;\n\n\t\tb2Vec2 vA = m_velocities[indexA].v;\n\t\tfloat wA = m_velocities[indexA].w;\n\t\tb2Vec2 vB = m_velocities[indexB].v;\n\t\tfloat wB = m_velocities[indexB].w;\n\n\t\tb2Vec2 normal = vc->normal;\n\t\tb2Vec2 tangent = b2Cross(normal, 1.0f);\n\n\t\tfor (int32 j = 0; j < pointCount; ++j)\n\t\t{\n\t\t\tb2VelocityConstraintPoint* vcp = vc->points + j;\n\t\t\tb2Vec2 P = vcp->normalImpulse * normal + vcp->tangentImpulse * tangent;\n\t\t\twA -= iA * b2Cross(vcp->rA, P);\n\t\t\tvA -= mA * P;\n\t\t\twB += iB * b2Cross(vcp->rB, P);\n\t\t\tvB += mB * P;\n\t\t}\n\n\t\tm_velocities[indexA].v = vA;\n\t\tm_velocities[indexA].w = wA;\n\t\tm_velocities[indexB].v = vB;\n\t\tm_velocities[indexB].w = wB;\n\t}\n}\n\nvoid b2ContactSolver::SolveVelocityConstraints()\n{\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tb2ContactVelocityConstraint* vc = m_velocityConstraints + i;\n\n\t\tint32 indexA = vc->indexA;\n\t\tint32 indexB = vc->indexB;\n\t\tfloat mA = vc->invMassA;\n\t\tfloat iA = vc->invIA;\n\t\tfloat mB = vc->invMassB;\n\t\tfloat iB = vc->invIB;\n\t\tint32 pointCount = vc->pointCount;\n\n\t\tb2Vec2 vA = m_velocities[indexA].v;\n\t\tfloat wA = m_velocities[indexA].w;\n\t\tb2Vec2 vB = m_velocities[indexB].v;\n\t\tfloat wB = m_velocities[indexB].w;\n\n\t\tb2Vec2 normal = vc->normal;\n\t\tb2Vec2 tangent = b2Cross(normal, 1.0f);\n\t\tfloat friction = vc->friction;\n\n\t\tb2Assert(pointCount == 1 || pointCount == 2);\n\n\t\t// Solve tangent constraints first because non-penetration is more important\n\t\t// than friction.\n\t\tfor (int32 j = 0; j < pointCount; ++j)\n\t\t{\n\t\t\tb2VelocityConstraintPoint* vcp = vc->points + j;\n\n\t\t\t// Relative velocity at contact\n\t\t\tb2Vec2 dv = vB + b2Cross(wB, vcp->rB) - vA - b2Cross(wA, vcp->rA);\n\n\t\t\t// Compute tangent force\n\t\t\tfloat vt = b2Dot(dv, tangent) - vc->tangentSpeed;\n\t\t\tfloat lambda = vcp->tangentMass * (-vt);\n\n\t\t\t// b2Clamp the accumulated force\n\t\t\tfloat maxFriction = friction * vcp->normalImpulse;\n\t\t\tfloat newImpulse = b2Clamp(vcp->tangentImpulse + lambda, -maxFriction, maxFriction);\n\t\t\tlambda = newImpulse - vcp->tangentImpulse;\n\t\t\tvcp->tangentImpulse = newImpulse;\n\n\t\t\t// Apply contact impulse\n\t\t\tb2Vec2 P = lambda * tangent;\n\n\t\t\tvA -= mA * P;\n\t\t\twA -= iA * b2Cross(vcp->rA, P);\n\n\t\t\tvB += mB * P;\n\t\t\twB += iB * b2Cross(vcp->rB, P);\n\t\t}\n\n\t\t// Solve normal constraints\n\t\tif (pointCount == 1 || g_blockSolve == false)\n\t\t{\n\t\t\tfor (int32 j = 0; j < pointCount; ++j)\n\t\t\t{\n\t\t\t\tb2VelocityConstraintPoint* vcp = vc->points + j;\n\n\t\t\t\t// Relative velocity at contact\n\t\t\t\tb2Vec2 dv = vB + b2Cross(wB, vcp->rB) - vA - b2Cross(wA, vcp->rA);\n\n\t\t\t\t// Compute normal impulse\n\t\t\t\tfloat vn = b2Dot(dv, normal);\n\t\t\t\tfloat lambda = -vcp->normalMass * (vn - vcp->velocityBias);\n\n\t\t\t\t// b2Clamp the accumulated impulse\n\t\t\t\tfloat newImpulse = b2Max(vcp->normalImpulse + lambda, 0.0f);\n\t\t\t\tlambda = newImpulse - vcp->normalImpulse;\n\t\t\t\tvcp->normalImpulse = newImpulse;\n\n\t\t\t\t// Apply contact impulse\n\t\t\t\tb2Vec2 P = lambda * normal;\n\t\t\t\tvA -= mA * P;\n\t\t\t\twA -= iA * b2Cross(vcp->rA, P);\n\n\t\t\t\tvB += mB * P;\n\t\t\t\twB += iB * b2Cross(vcp->rB, P);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Block solver developed in collaboration with Dirk Gregorius (back in 01/07 on Box2D_Lite).\n\t\t\t// Build the mini LCP for this contact patch\n\t\t\t//\n\t\t\t// vn = A * x + b, vn >= 0, x >= 0 and vn_i * x_i = 0 with i = 1..2\n\t\t\t//\n\t\t\t// A = J * W * JT and J = ( -n, -r1 x n, n, r2 x n )\n\t\t\t// b = vn0 - velocityBias\n\t\t\t//\n\t\t\t// The system is solved using the \"Total enumeration method\" (s. Murty). The complementary constraint vn_i * x_i\n\t\t\t// implies that we must have in any solution either vn_i = 0 or x_i = 0. So for the 2D contact problem the cases\n\t\t\t// vn1 = 0 and vn2 = 0, x1 = 0 and x2 = 0, x1 = 0 and vn2 = 0, x2 = 0 and vn1 = 0 need to be tested. The first valid\n\t\t\t// solution that satisfies the problem is chosen.\n\t\t\t// \n\t\t\t// In order to account of the accumulated impulse 'a' (because of the iterative nature of the solver which only requires\n\t\t\t// that the accumulated impulse is clamped and not the incremental impulse) we change the impulse variable (x_i).\n\t\t\t//\n\t\t\t// Substitute:\n\t\t\t// \n\t\t\t// x = a + d\n\t\t\t// \n\t\t\t// a := old total impulse\n\t\t\t// x := new total impulse\n\t\t\t// d := incremental impulse \n\t\t\t//\n\t\t\t// For the current iteration we extend the formula for the incremental impulse\n\t\t\t// to compute the new total impulse:\n\t\t\t//\n\t\t\t// vn = A * d + b\n\t\t\t//    = A * (x - a) + b\n\t\t\t//    = A * x + b - A * a\n\t\t\t//    = A * x + b'\n\t\t\t// b' = b - A * a;\n\n\t\t\tb2VelocityConstraintPoint* cp1 = vc->points + 0;\n\t\t\tb2VelocityConstraintPoint* cp2 = vc->points + 1;\n\n\t\t\tb2Vec2 a(cp1->normalImpulse, cp2->normalImpulse);\n\t\t\tb2Assert(a.x >= 0.0f && a.y >= 0.0f);\n\n\t\t\t// Relative velocity at contact\n\t\t\tb2Vec2 dv1 = vB + b2Cross(wB, cp1->rB) - vA - b2Cross(wA, cp1->rA);\n\t\t\tb2Vec2 dv2 = vB + b2Cross(wB, cp2->rB) - vA - b2Cross(wA, cp2->rA);\n\n\t\t\t// Compute normal velocity\n\t\t\tfloat vn1 = b2Dot(dv1, normal);\n\t\t\tfloat vn2 = b2Dot(dv2, normal);\n\n\t\t\tb2Vec2 b;\n\t\t\tb.x = vn1 - cp1->velocityBias;\n\t\t\tb.y = vn2 - cp2->velocityBias;\n\n\t\t\t// Compute b'\n\t\t\tb -= b2Mul(vc->K, a);\n\n\t\t\tconst float k_errorTol = 1e-3f;\n\t\t\tB2_NOT_USED(k_errorTol);\n\n\t\t\tfor (;;)\n\t\t\t{\n\t\t\t\t//\n\t\t\t\t// Case 1: vn = 0\n\t\t\t\t//\n\t\t\t\t// 0 = A * x + b'\n\t\t\t\t//\n\t\t\t\t// Solve for x:\n\t\t\t\t//\n\t\t\t\t// x = - inv(A) * b'\n\t\t\t\t//\n\t\t\t\tb2Vec2 x = - b2Mul(vc->normalMass, b);\n\n\t\t\t\tif (x.x >= 0.0f && x.y >= 0.0f)\n\t\t\t\t{\n\t\t\t\t\t// Get the incremental impulse\n\t\t\t\t\tb2Vec2 d = x - a;\n\n\t\t\t\t\t// Apply incremental impulse\n\t\t\t\t\tb2Vec2 P1 = d.x * normal;\n\t\t\t\t\tb2Vec2 P2 = d.y * normal;\n\t\t\t\t\tvA -= mA * (P1 + P2);\n\t\t\t\t\twA -= iA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2));\n\n\t\t\t\t\tvB += mB * (P1 + P2);\n\t\t\t\t\twB += iB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2));\n\n\t\t\t\t\t// Accumulate\n\t\t\t\t\tcp1->normalImpulse = x.x;\n\t\t\t\t\tcp2->normalImpulse = x.y;\n\n#if B2_DEBUG_SOLVER == 1\n\t\t\t\t\t// Postconditions\n\t\t\t\t\tdv1 = vB + b2Cross(wB, cp1->rB) - vA - b2Cross(wA, cp1->rA);\n\t\t\t\t\tdv2 = vB + b2Cross(wB, cp2->rB) - vA - b2Cross(wA, cp2->rA);\n\n\t\t\t\t\t// Compute normal velocity\n\t\t\t\t\tvn1 = b2Dot(dv1, normal);\n\t\t\t\t\tvn2 = b2Dot(dv2, normal);\n\n\t\t\t\t\tb2Assert(b2Abs(vn1 - cp1->velocityBias) < k_errorTol);\n\t\t\t\t\tb2Assert(b2Abs(vn2 - cp2->velocityBias) < k_errorTol);\n#endif\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t//\n\t\t\t\t// Case 2: vn1 = 0 and x2 = 0\n\t\t\t\t//\n\t\t\t\t//   0 = a11 * x1 + a12 * 0 + b1' \n\t\t\t\t// vn2 = a21 * x1 + a22 * 0 + b2'\n\t\t\t\t//\n\t\t\t\tx.x = - cp1->normalMass * b.x;\n\t\t\t\tx.y = 0.0f;\n\t\t\t\tvn1 = 0.0f;\n\t\t\t\tvn2 = vc->K.ex.y * x.x + b.y;\n\t\t\t\tif (x.x >= 0.0f && vn2 >= 0.0f)\n\t\t\t\t{\n\t\t\t\t\t// Get the incremental impulse\n\t\t\t\t\tb2Vec2 d = x - a;\n\n\t\t\t\t\t// Apply incremental impulse\n\t\t\t\t\tb2Vec2 P1 = d.x * normal;\n\t\t\t\t\tb2Vec2 P2 = d.y * normal;\n\t\t\t\t\tvA -= mA * (P1 + P2);\n\t\t\t\t\twA -= iA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2));\n\n\t\t\t\t\tvB += mB * (P1 + P2);\n\t\t\t\t\twB += iB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2));\n\n\t\t\t\t\t// Accumulate\n\t\t\t\t\tcp1->normalImpulse = x.x;\n\t\t\t\t\tcp2->normalImpulse = x.y;\n\n#if B2_DEBUG_SOLVER == 1\n\t\t\t\t\t// Postconditions\n\t\t\t\t\tdv1 = vB + b2Cross(wB, cp1->rB) - vA - b2Cross(wA, cp1->rA);\n\n\t\t\t\t\t// Compute normal velocity\n\t\t\t\t\tvn1 = b2Dot(dv1, normal);\n\n\t\t\t\t\tb2Assert(b2Abs(vn1 - cp1->velocityBias) < k_errorTol);\n#endif\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\n\t\t\t\t//\n\t\t\t\t// Case 3: vn2 = 0 and x1 = 0\n\t\t\t\t//\n\t\t\t\t// vn1 = a11 * 0 + a12 * x2 + b1' \n\t\t\t\t//   0 = a21 * 0 + a22 * x2 + b2'\n\t\t\t\t//\n\t\t\t\tx.x = 0.0f;\n\t\t\t\tx.y = - cp2->normalMass * b.y;\n\t\t\t\tvn1 = vc->K.ey.x * x.y + b.x;\n\t\t\t\tvn2 = 0.0f;\n\n\t\t\t\tif (x.y >= 0.0f && vn1 >= 0.0f)\n\t\t\t\t{\n\t\t\t\t\t// Resubstitute for the incremental impulse\n\t\t\t\t\tb2Vec2 d = x - a;\n\n\t\t\t\t\t// Apply incremental impulse\n\t\t\t\t\tb2Vec2 P1 = d.x * normal;\n\t\t\t\t\tb2Vec2 P2 = d.y * normal;\n\t\t\t\t\tvA -= mA * (P1 + P2);\n\t\t\t\t\twA -= iA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2));\n\n\t\t\t\t\tvB += mB * (P1 + P2);\n\t\t\t\t\twB += iB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2));\n\n\t\t\t\t\t// Accumulate\n\t\t\t\t\tcp1->normalImpulse = x.x;\n\t\t\t\t\tcp2->normalImpulse = x.y;\n\n#if B2_DEBUG_SOLVER == 1\n\t\t\t\t\t// Postconditions\n\t\t\t\t\tdv2 = vB + b2Cross(wB, cp2->rB) - vA - b2Cross(wA, cp2->rA);\n\n\t\t\t\t\t// Compute normal velocity\n\t\t\t\t\tvn2 = b2Dot(dv2, normal);\n\n\t\t\t\t\tb2Assert(b2Abs(vn2 - cp2->velocityBias) < k_errorTol);\n#endif\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t//\n\t\t\t\t// Case 4: x1 = 0 and x2 = 0\n\t\t\t\t// \n\t\t\t\t// vn1 = b1\n\t\t\t\t// vn2 = b2;\n\t\t\t\tx.x = 0.0f;\n\t\t\t\tx.y = 0.0f;\n\t\t\t\tvn1 = b.x;\n\t\t\t\tvn2 = b.y;\n\n\t\t\t\tif (vn1 >= 0.0f && vn2 >= 0.0f )\n\t\t\t\t{\n\t\t\t\t\t// Resubstitute for the incremental impulse\n\t\t\t\t\tb2Vec2 d = x - a;\n\n\t\t\t\t\t// Apply incremental impulse\n\t\t\t\t\tb2Vec2 P1 = d.x * normal;\n\t\t\t\t\tb2Vec2 P2 = d.y * normal;\n\t\t\t\t\tvA -= mA * (P1 + P2);\n\t\t\t\t\twA -= iA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2));\n\n\t\t\t\t\tvB += mB * (P1 + P2);\n\t\t\t\t\twB += iB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2));\n\n\t\t\t\t\t// Accumulate\n\t\t\t\t\tcp1->normalImpulse = x.x;\n\t\t\t\t\tcp2->normalImpulse = x.y;\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t// No solution, give up. This is hit sometimes, but it doesn't seem to matter.\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tm_velocities[indexA].v = vA;\n\t\tm_velocities[indexA].w = wA;\n\t\tm_velocities[indexB].v = vB;\n\t\tm_velocities[indexB].w = wB;\n\t}\n}\n\nvoid b2ContactSolver::StoreImpulses()\n{\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tb2ContactVelocityConstraint* vc = m_velocityConstraints + i;\n\t\tb2Manifold* manifold = m_contacts[vc->contactIndex]->GetManifold();\n\n\t\tfor (int32 j = 0; j < vc->pointCount; ++j)\n\t\t{\n\t\t\tmanifold->points[j].normalImpulse = vc->points[j].normalImpulse;\n\t\t\tmanifold->points[j].tangentImpulse = vc->points[j].tangentImpulse;\n\t\t}\n\t}\n}\n\nstruct b2PositionSolverManifold\n{\n\tvoid Initialize(b2ContactPositionConstraint* pc, const b2Transform& xfA, const b2Transform& xfB, int32 index)\n\t{\n\t\tb2Assert(pc->pointCount > 0);\n\n\t\tswitch (pc->type)\n\t\t{\n\t\tcase b2Manifold::e_circles:\n\t\t\t{\n\t\t\t\tb2Vec2 pointA = b2Mul(xfA, pc->localPoint);\n\t\t\t\tb2Vec2 pointB = b2Mul(xfB, pc->localPoints[0]);\n\t\t\t\tnormal = pointB - pointA;\n\t\t\t\tnormal.Normalize();\n\t\t\t\tpoint = 0.5f * (pointA + pointB);\n\t\t\t\tseparation = b2Dot(pointB - pointA, normal) - pc->radiusA - pc->radiusB;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase b2Manifold::e_faceA:\n\t\t\t{\n\t\t\t\tnormal = b2Mul(xfA.q, pc->localNormal);\n\t\t\t\tb2Vec2 planePoint = b2Mul(xfA, pc->localPoint);\n\n\t\t\t\tb2Vec2 clipPoint = b2Mul(xfB, pc->localPoints[index]);\n\t\t\t\tseparation = b2Dot(clipPoint - planePoint, normal) - pc->radiusA - pc->radiusB;\n\t\t\t\tpoint = clipPoint;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase b2Manifold::e_faceB:\n\t\t\t{\n\t\t\t\tnormal = b2Mul(xfB.q, pc->localNormal);\n\t\t\t\tb2Vec2 planePoint = b2Mul(xfB, pc->localPoint);\n\n\t\t\t\tb2Vec2 clipPoint = b2Mul(xfA, pc->localPoints[index]);\n\t\t\t\tseparation = b2Dot(clipPoint - planePoint, normal) - pc->radiusA - pc->radiusB;\n\t\t\t\tpoint = clipPoint;\n\n\t\t\t\t// Ensure normal points from A to B\n\t\t\t\tnormal = -normal;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tb2Vec2 normal;\n\tb2Vec2 point;\n\tfloat separation;\n};\n\n// Sequential solver.\nbool b2ContactSolver::SolvePositionConstraints()\n{\n\tfloat minSeparation = 0.0f;\n\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tb2ContactPositionConstraint* pc = m_positionConstraints + i;\n\n\t\tint32 indexA = pc->indexA;\n\t\tint32 indexB = pc->indexB;\n\t\tb2Vec2 localCenterA = pc->localCenterA;\n\t\tfloat mA = pc->invMassA;\n\t\tfloat iA = pc->invIA;\n\t\tb2Vec2 localCenterB = pc->localCenterB;\n\t\tfloat mB = pc->invMassB;\n\t\tfloat iB = pc->invIB;\n\t\tint32 pointCount = pc->pointCount;\n\n\t\tb2Vec2 cA = m_positions[indexA].c;\n\t\tfloat aA = m_positions[indexA].a;\n\n\t\tb2Vec2 cB = m_positions[indexB].c;\n\t\tfloat aB = m_positions[indexB].a;\n\n\t\t// Solve normal constraints\n\t\tfor (int32 j = 0; j < pointCount; ++j)\n\t\t{\n\t\t\tb2Transform xfA, xfB;\n\t\t\txfA.q.Set(aA);\n\t\t\txfB.q.Set(aB);\n\t\t\txfA.p = cA - b2Mul(xfA.q, localCenterA);\n\t\t\txfB.p = cB - b2Mul(xfB.q, localCenterB);\n\n\t\t\tb2PositionSolverManifold psm;\n\t\t\tpsm.Initialize(pc, xfA, xfB, j);\n\t\t\tb2Vec2 normal = psm.normal;\n\n\t\t\tb2Vec2 point = psm.point;\n\t\t\tfloat separation = psm.separation;\n\n\t\t\tb2Vec2 rA = point - cA;\n\t\t\tb2Vec2 rB = point - cB;\n\n\t\t\t// Track max constraint error.\n\t\t\tminSeparation = b2Min(minSeparation, separation);\n\n\t\t\t// Prevent large corrections and allow slop.\n\t\t\tfloat C = b2Clamp(b2_baumgarte * (separation + b2_linearSlop), -b2_maxLinearCorrection, 0.0f);\n\n\t\t\t// Compute the effective mass.\n\t\t\tfloat rnA = b2Cross(rA, normal);\n\t\t\tfloat rnB = b2Cross(rB, normal);\n\t\t\tfloat K = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n\t\t\t// Compute normal impulse\n\t\t\tfloat impulse = K > 0.0f ? - C / K : 0.0f;\n\n\t\t\tb2Vec2 P = impulse * normal;\n\n\t\t\tcA -= mA * P;\n\t\t\taA -= iA * b2Cross(rA, P);\n\n\t\t\tcB += mB * P;\n\t\t\taB += iB * b2Cross(rB, P);\n\t\t}\n\n\t\tm_positions[indexA].c = cA;\n\t\tm_positions[indexA].a = aA;\n\n\t\tm_positions[indexB].c = cB;\n\t\tm_positions[indexB].a = aB;\n\t}\n\n\t// We can't expect minSpeparation >= -b2_linearSlop because we don't\n\t// push the separation above -b2_linearSlop.\n\treturn minSeparation >= -3.0f * b2_linearSlop;\n}\n\n// Sequential position solver for position constraints.\nbool b2ContactSolver::SolveTOIPositionConstraints(int32 toiIndexA, int32 toiIndexB)\n{\n\tfloat minSeparation = 0.0f;\n\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tb2ContactPositionConstraint* pc = m_positionConstraints + i;\n\n\t\tint32 indexA = pc->indexA;\n\t\tint32 indexB = pc->indexB;\n\t\tb2Vec2 localCenterA = pc->localCenterA;\n\t\tb2Vec2 localCenterB = pc->localCenterB;\n\t\tint32 pointCount = pc->pointCount;\n\n\t\tfloat mA = 0.0f;\n\t\tfloat iA = 0.0f;\n\t\tif (indexA == toiIndexA || indexA == toiIndexB)\n\t\t{\n\t\t\tmA = pc->invMassA;\n\t\t\tiA = pc->invIA;\n\t\t}\n\n\t\tfloat mB = 0.0f;\n\t\tfloat iB = 0.;\n\t\tif (indexB == toiIndexA || indexB == toiIndexB)\n\t\t{\n\t\t\tmB = pc->invMassB;\n\t\t\tiB = pc->invIB;\n\t\t}\n\n\t\tb2Vec2 cA = m_positions[indexA].c;\n\t\tfloat aA = m_positions[indexA].a;\n\n\t\tb2Vec2 cB = m_positions[indexB].c;\n\t\tfloat aB = m_positions[indexB].a;\n\n\t\t// Solve normal constraints\n\t\tfor (int32 j = 0; j < pointCount; ++j)\n\t\t{\n\t\t\tb2Transform xfA, xfB;\n\t\t\txfA.q.Set(aA);\n\t\t\txfB.q.Set(aB);\n\t\t\txfA.p = cA - b2Mul(xfA.q, localCenterA);\n\t\t\txfB.p = cB - b2Mul(xfB.q, localCenterB);\n\n\t\t\tb2PositionSolverManifold psm;\n\t\t\tpsm.Initialize(pc, xfA, xfB, j);\n\t\t\tb2Vec2 normal = psm.normal;\n\n\t\t\tb2Vec2 point = psm.point;\n\t\t\tfloat separation = psm.separation;\n\n\t\t\tb2Vec2 rA = point - cA;\n\t\t\tb2Vec2 rB = point - cB;\n\n\t\t\t// Track max constraint error.\n\t\t\tminSeparation = b2Min(minSeparation, separation);\n\n\t\t\t// Prevent large corrections and allow slop.\n\t\t\tfloat C = b2Clamp(b2_toiBaumgarte * (separation + b2_linearSlop), -b2_maxLinearCorrection, 0.0f);\n\n\t\t\t// Compute the effective mass.\n\t\t\tfloat rnA = b2Cross(rA, normal);\n\t\t\tfloat rnB = b2Cross(rB, normal);\n\t\t\tfloat K = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n\t\t\t// Compute normal impulse\n\t\t\tfloat impulse = K > 0.0f ? - C / K : 0.0f;\n\n\t\t\tb2Vec2 P = impulse * normal;\n\n\t\t\tcA -= mA * P;\n\t\t\taA -= iA * b2Cross(rA, P);\n\n\t\t\tcB += mB * P;\n\t\t\taB += iB * b2Cross(rB, P);\n\t\t}\n\n\t\tm_positions[indexA].c = cA;\n\t\tm_positions[indexA].a = aA;\n\n\t\tm_positions[indexB].c = cB;\n\t\tm_positions[indexB].a = aB;\n\t}\n\n\t// We can't expect minSpeparation >= -b2_linearSlop because we don't\n\t// push the separation above -b2_linearSlop.\n\treturn minSeparation >= -1.5f * b2_linearSlop;\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_contact_solver.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_CONTACT_SOLVER_H\n#define B2_CONTACT_SOLVER_H\n\n#include \"box2d/b2_collision.h\"\n#include \"box2d/b2_math.h\"\n#include \"box2d/b2_time_step.h\"\n\nclass b2Contact;\nclass b2Body;\nclass b2StackAllocator;\nstruct b2ContactPositionConstraint;\n\nstruct b2VelocityConstraintPoint\n{\n\tb2Vec2 rA;\n\tb2Vec2 rB;\n\tfloat normalImpulse;\n\tfloat tangentImpulse;\n\tfloat normalMass;\n\tfloat tangentMass;\n\tfloat velocityBias;\n};\n\nstruct b2ContactVelocityConstraint\n{\n\tb2VelocityConstraintPoint points[b2_maxManifoldPoints];\n\tb2Vec2 normal;\n\tb2Mat22 normalMass;\n\tb2Mat22 K;\n\tint32 indexA;\n\tint32 indexB;\n\tfloat invMassA, invMassB;\n\tfloat invIA, invIB;\n\tfloat friction;\n\tfloat restitution;\n\tfloat threshold;\n\tfloat tangentSpeed;\n\tint32 pointCount;\n\tint32 contactIndex;\n};\n\nstruct b2ContactSolverDef\n{\n\tb2TimeStep step;\n\tb2Contact** contacts;\n\tint32 count;\n\tb2Position* positions;\n\tb2Velocity* velocities;\n\tb2StackAllocator* allocator;\n};\n\nclass b2ContactSolver\n{\npublic:\n\tb2ContactSolver(b2ContactSolverDef* def);\n\t~b2ContactSolver();\n\n\tvoid InitializeVelocityConstraints();\n\n\tvoid WarmStart();\n\tvoid SolveVelocityConstraints();\n\tvoid StoreImpulses();\n\n\tbool SolvePositionConstraints();\n\tbool SolveTOIPositionConstraints(int32 toiIndexA, int32 toiIndexB);\n\n\tb2TimeStep m_step;\n\tb2Position* m_positions;\n\tb2Velocity* m_velocities;\n\tb2StackAllocator* m_allocator;\n\tb2ContactPositionConstraint* m_positionConstraints;\n\tb2ContactVelocityConstraint* m_velocityConstraints;\n\tb2Contact** m_contacts;\n\tint m_count;\n};\n\n#endif\n\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_distance_joint.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_body.h\"\n#include \"box2d/b2_draw.h\"\n#include \"box2d/b2_distance_joint.h\"\n#include \"box2d/b2_time_step.h\"\n\n// 1-D constrained system\n// m (v2 - v1) = lambda\n// v2 + (beta/h) * x1 + gamma * lambda = 0, gamma has units of inverse mass.\n// x2 = x1 + h * v2\n\n// 1-D mass-damper-spring system\n// m (v2 - v1) + h * d * v2 + h * k * \n\n// C = norm(p2 - p1) - L\n// u = (p2 - p1) / norm(p2 - p1)\n// Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1))\n// J = [-u -cross(r1, u) u cross(r2, u)]\n// K = J * invM * JT\n//   = invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2\n\n\nvoid b2DistanceJointDef::Initialize(b2Body* b1, b2Body* b2,\n\t\t\t\t\t\t\t\t\tconst b2Vec2& anchor1, const b2Vec2& anchor2)\n{\n\tbodyA = b1;\n\tbodyB = b2;\n\tlocalAnchorA = bodyA->GetLocalPoint(anchor1);\n\tlocalAnchorB = bodyB->GetLocalPoint(anchor2);\n\tb2Vec2 d = anchor2 - anchor1;\n\tlength = b2Max(d.Length(), b2_linearSlop);\n\tminLength = length;\n\tmaxLength = length;\n}\n\nb2DistanceJoint::b2DistanceJoint(const b2DistanceJointDef* def)\n: b2Joint(def)\n{\n\tm_localAnchorA = def->localAnchorA;\n\tm_localAnchorB = def->localAnchorB;\n\tm_length = b2Max(def->length, b2_linearSlop);\n\tm_minLength = b2Max(def->minLength, b2_linearSlop);\n\tm_maxLength = b2Max(def->maxLength, m_minLength);\n\tm_stiffness = def->stiffness;\n\tm_damping = def->damping;\n\n\tm_gamma = 0.0f;\n\tm_bias = 0.0f;\n\tm_impulse = 0.0f;\n\tm_lowerImpulse = 0.0f;\n\tm_upperImpulse = 0.0f;\n\tm_currentLength = 0.0f;\n}\n\nvoid b2DistanceJoint::InitVelocityConstraints(const b2SolverData& data)\n{\n\tm_indexA = m_bodyA->m_islandIndex;\n\tm_indexB = m_bodyB->m_islandIndex;\n\tm_localCenterA = m_bodyA->m_sweep.localCenter;\n\tm_localCenterB = m_bodyB->m_sweep.localCenter;\n\tm_invMassA = m_bodyA->m_invMass;\n\tm_invMassB = m_bodyB->m_invMass;\n\tm_invIA = m_bodyA->m_invI;\n\tm_invIB = m_bodyB->m_invI;\n\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat aA = data.positions[m_indexA].a;\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat wA = data.velocities[m_indexA].w;\n\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat aB = data.positions[m_indexB].a;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat wB = data.velocities[m_indexB].w;\n\n\tb2Rot qA(aA), qB(aB);\n\n\tm_rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tm_rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\tm_u = cB + m_rB - cA - m_rA;\n\n\t// Handle singularity.\n\tm_currentLength = m_u.Length();\n\tif (m_currentLength > b2_linearSlop)\n\t{\n\t\tm_u *= 1.0f / m_currentLength;\n\t}\n\telse\n\t{\n\t\tm_u.Set(0.0f, 0.0f);\n\t\tm_mass = 0.0f;\n\t\tm_impulse = 0.0f;\n\t\tm_lowerImpulse = 0.0f;\n\t\tm_upperImpulse = 0.0f;\n\t}\n\n\tfloat crAu = b2Cross(m_rA, m_u);\n\tfloat crBu = b2Cross(m_rB, m_u);\n\tfloat invMass = m_invMassA + m_invIA * crAu * crAu + m_invMassB + m_invIB * crBu * crBu;\n\tm_mass = invMass != 0.0f ? 1.0f / invMass : 0.0f;\n\n\tif (m_stiffness > 0.0f && m_minLength < m_maxLength)\n\t{\n\t\t// soft\n\t\tfloat C = m_currentLength - m_length;\n\n\t\tfloat d = m_damping;\n\t\tfloat k = m_stiffness;\n\n\t\t// magic formulas\n\t\tfloat h = data.step.dt;\n\n\t\t// gamma = 1 / (h * (d + h * k))\n\t\t// the extra factor of h in the denominator is since the lambda is an impulse, not a force\n\t\tm_gamma = h * (d + h * k);\n\t\tm_gamma = m_gamma != 0.0f ? 1.0f / m_gamma : 0.0f;\n\t\tm_bias = C * h * k * m_gamma;\n\n\t\tinvMass += m_gamma;\n\t\tm_softMass = invMass != 0.0f ? 1.0f / invMass : 0.0f;\n\t}\n\telse\n\t{\n\t\t// rigid\n\t\tm_gamma = 0.0f;\n\t\tm_bias = 0.0f;\n\t\tm_softMass = m_mass;\n\t}\n\n\tif (data.step.warmStarting)\n\t{\n\t\t// Scale the impulse to support a variable time step.\n\t\tm_impulse *= data.step.dtRatio;\n\t\tm_lowerImpulse *= data.step.dtRatio;\n\t\tm_upperImpulse *= data.step.dtRatio;\n\n\t\tb2Vec2 P = (m_impulse + m_lowerImpulse - m_upperImpulse) * m_u;\n\t\tvA -= m_invMassA * P;\n\t\twA -= m_invIA * b2Cross(m_rA, P);\n\t\tvB += m_invMassB * P;\n\t\twB += m_invIB * b2Cross(m_rB, P);\n\t}\n\telse\n\t{\n\t\tm_impulse = 0.0f;\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nvoid b2DistanceJoint::SolveVelocityConstraints(const b2SolverData& data)\n{\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat wA = data.velocities[m_indexA].w;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat wB = data.velocities[m_indexB].w;\n\n\tif (m_minLength < m_maxLength)\n\t{\n\t\tif (m_stiffness > 0.0f)\n\t\t{\n\t\t\t// Cdot = dot(u, v + cross(w, r))\n\t\t\tb2Vec2 vpA = vA + b2Cross(wA, m_rA);\n\t\t\tb2Vec2 vpB = vB + b2Cross(wB, m_rB);\n\t\t\tfloat Cdot = b2Dot(m_u, vpB - vpA);\n\n\t\t\tfloat impulse = -m_softMass * (Cdot + m_bias + m_gamma * m_impulse);\n\t\t\tm_impulse += impulse;\n\n\t\t\tb2Vec2 P = impulse * m_u;\n\t\t\tvA -= m_invMassA * P;\n\t\t\twA -= m_invIA * b2Cross(m_rA, P);\n\t\t\tvB += m_invMassB * P;\n\t\t\twB += m_invIB * b2Cross(m_rB, P);\n\t\t}\n\n\t\t// lower\n\t\t{\n\t\t\tfloat C = m_currentLength - m_minLength;\n\t\t\tfloat bias = b2Max(0.0f, C) * data.step.inv_dt;\n\n\t\t\tb2Vec2 vpA = vA + b2Cross(wA, m_rA);\n\t\t\tb2Vec2 vpB = vB + b2Cross(wB, m_rB);\n\t\t\tfloat Cdot = b2Dot(m_u, vpB - vpA);\n\n\t\t\tfloat impulse = -m_mass * (Cdot + bias);\n\t\t\tfloat oldImpulse = m_lowerImpulse;\n\t\t\tm_lowerImpulse = b2Max(0.0f, m_lowerImpulse + impulse);\n\t\t\timpulse = m_lowerImpulse - oldImpulse;\n\t\t\tb2Vec2 P = impulse * m_u;\n\n\t\t\tvA -= m_invMassA * P;\n\t\t\twA -= m_invIA * b2Cross(m_rA, P);\n\t\t\tvB += m_invMassB * P;\n\t\t\twB += m_invIB * b2Cross(m_rB, P);\n\t\t}\n\n\t\t// upper\n\t\t{\n\t\t\tfloat C = m_maxLength - m_currentLength;\n\t\t\tfloat bias = b2Max(0.0f, C) * data.step.inv_dt;\n\n\t\t\tb2Vec2 vpA = vA + b2Cross(wA, m_rA);\n\t\t\tb2Vec2 vpB = vB + b2Cross(wB, m_rB);\n\t\t\tfloat Cdot = b2Dot(m_u, vpA - vpB);\n\n\t\t\tfloat impulse = -m_mass * (Cdot + bias);\n\t\t\tfloat oldImpulse = m_upperImpulse;\n\t\t\tm_upperImpulse = b2Max(0.0f, m_upperImpulse + impulse);\n\t\t\timpulse = m_upperImpulse - oldImpulse;\n\t\t\tb2Vec2 P = -impulse * m_u;\n\n\t\t\tvA -= m_invMassA * P;\n\t\t\twA -= m_invIA * b2Cross(m_rA, P);\n\t\t\tvB += m_invMassB * P;\n\t\t\twB += m_invIB * b2Cross(m_rB, P);\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Equal limits\n\n\t\t// Cdot = dot(u, v + cross(w, r))\n\t\tb2Vec2 vpA = vA + b2Cross(wA, m_rA);\n\t\tb2Vec2 vpB = vB + b2Cross(wB, m_rB);\n\t\tfloat Cdot = b2Dot(m_u, vpB - vpA);\n\n\t\tfloat impulse = -m_mass * Cdot;\n\t\tm_impulse += impulse;\n\n\t\tb2Vec2 P = impulse * m_u;\n\t\tvA -= m_invMassA * P;\n\t\twA -= m_invIA * b2Cross(m_rA, P);\n\t\tvB += m_invMassB * P;\n\t\twB += m_invIB * b2Cross(m_rB, P);\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nbool b2DistanceJoint::SolvePositionConstraints(const b2SolverData& data)\n{\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat aA = data.positions[m_indexA].a;\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat aB = data.positions[m_indexB].a;\n\n\tb2Rot qA(aA), qB(aB);\n\n\tb2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tb2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\tb2Vec2 u = cB + rB - cA - rA;\n\n\tfloat length = u.Normalize();\n\tfloat C;\n\tif (m_minLength == m_maxLength)\n\t{\n\t\tC = length - m_minLength;\n\t}\n\telse if (length < m_minLength)\n\t{\n\t\tC = length - m_minLength;\n\t}\n\telse if (m_maxLength < length)\n\t{\n\t\tC = length - m_maxLength;\n\t}\n\telse\n\t{\n\t\treturn true;\n\t}\n\n\tfloat impulse = -m_mass * C;\n\tb2Vec2 P = impulse * u;\n\n\tcA -= m_invMassA * P;\n\taA -= m_invIA * b2Cross(rA, P);\n\tcB += m_invMassB * P;\n\taB += m_invIB * b2Cross(rB, P);\n\n\tdata.positions[m_indexA].c = cA;\n\tdata.positions[m_indexA].a = aA;\n\tdata.positions[m_indexB].c = cB;\n\tdata.positions[m_indexB].a = aB;\n\n\treturn b2Abs(C) < b2_linearSlop;\n}\n\nb2Vec2 b2DistanceJoint::GetAnchorA() const\n{\n\treturn m_bodyA->GetWorldPoint(m_localAnchorA);\n}\n\nb2Vec2 b2DistanceJoint::GetAnchorB() const\n{\n\treturn m_bodyB->GetWorldPoint(m_localAnchorB);\n}\n\nb2Vec2 b2DistanceJoint::GetReactionForce(float inv_dt) const\n{\n\tb2Vec2 F = inv_dt * (m_impulse + m_lowerImpulse - m_upperImpulse) * m_u;\n\treturn F;\n}\n\nfloat b2DistanceJoint::GetReactionTorque(float inv_dt) const\n{\n\tB2_NOT_USED(inv_dt);\n\treturn 0.0f;\n}\n\nfloat b2DistanceJoint::SetLength(float length)\n{\n\tm_impulse = 0.0f;\n\tm_length = b2Max(b2_linearSlop, length);\n\treturn m_length;\n}\n\nfloat b2DistanceJoint::SetMinLength(float minLength)\n{\n\tm_lowerImpulse = 0.0f;\n\tm_minLength = b2Clamp(minLength, b2_linearSlop, m_maxLength);\n\treturn m_minLength;\n}\n\nfloat b2DistanceJoint::SetMaxLength(float maxLength)\n{\n\tm_upperImpulse = 0.0f;\n\tm_maxLength = b2Max(maxLength, m_minLength);\n\treturn m_maxLength;\n}\n\nfloat b2DistanceJoint::GetCurrentLength() const\n{\n\tb2Vec2 pA = m_bodyA->GetWorldPoint(m_localAnchorA);\n\tb2Vec2 pB = m_bodyB->GetWorldPoint(m_localAnchorB);\n\tb2Vec2 d = pB - pA;\n\tfloat length = d.Length();\n\treturn length;\n}\n\nvoid b2DistanceJoint::Dump()\n{\n\tint32 indexA = m_bodyA->m_islandIndex;\n\tint32 indexB = m_bodyB->m_islandIndex;\n\n\tb2Dump(\"  b2DistanceJointDef jd;\\n\");\n\tb2Dump(\"  jd.bodyA = bodies[%d];\\n\", indexA);\n\tb2Dump(\"  jd.bodyB = bodies[%d];\\n\", indexB);\n\tb2Dump(\"  jd.collideConnected = bool(%d);\\n\", m_collideConnected);\n\tb2Dump(\"  jd.localAnchorA.Set(%.9g, %.9g);\\n\", m_localAnchorA.x, m_localAnchorA.y);\n\tb2Dump(\"  jd.localAnchorB.Set(%.9g, %.9g);\\n\", m_localAnchorB.x, m_localAnchorB.y);\n\tb2Dump(\"  jd.length = %.9g;\\n\", m_length);\n\tb2Dump(\"  jd.minLength = %.9g;\\n\", m_minLength);\n\tb2Dump(\"  jd.maxLength = %.9g;\\n\", m_maxLength);\n\tb2Dump(\"  jd.stiffness = %.9g;\\n\", m_stiffness);\n\tb2Dump(\"  jd.damping = %.9g;\\n\", m_damping);\n\tb2Dump(\"  joints[%d] = m_world->CreateJoint(&jd);\\n\", m_index);\n}\n\nvoid b2DistanceJoint::Draw(b2Draw* draw) const\n{\n\tconst b2Transform& xfA = m_bodyA->GetTransform();\n\tconst b2Transform& xfB = m_bodyB->GetTransform();\n\tb2Vec2 pA = b2Mul(xfA, m_localAnchorA);\n\tb2Vec2 pB = b2Mul(xfB, m_localAnchorB);\n\n\tb2Vec2 axis = pB - pA;\n\tfloat length = axis.Normalize();\n\n\tb2Color c1(0.7f, 0.7f, 0.7f);\n\tb2Color c2(0.3f, 0.9f, 0.3f);\n\tb2Color c3(0.9f, 0.3f, 0.3f);\n\tb2Color c4(0.4f, 0.4f, 0.4f);\n\n\tdraw->DrawSegment(pA, pB, c4);\n\t\n\tb2Vec2 pRest = pA + m_length * axis;\n\tdraw->DrawPoint(pRest, 8.0f, c1);\n\n\tif (m_minLength != m_maxLength)\n\t{\n\t\tif (m_minLength > b2_linearSlop)\n\t\t{\n\t\t\tb2Vec2 pMin = pA + m_minLength * axis;\n\t\t\tdraw->DrawPoint(pMin, 4.0f, c2);\n\t\t}\n\n\t\tif (m_maxLength < FLT_MAX)\n\t\t{\n\t\t\tb2Vec2 pMax = pA + m_maxLength * axis;\n\t\t\tdraw->DrawPoint(pMax, 4.0f, c3);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_edge_circle_contact.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"b2_edge_circle_contact.h\"\n\n#include \"box2d/b2_block_allocator.h\"\n#include \"box2d/b2_fixture.h\"\n\n#include <new>\n\nb2Contact* b2EdgeAndCircleContact::Create(b2Fixture* fixtureA, int32, b2Fixture* fixtureB, int32, b2BlockAllocator* allocator)\n{\n\tvoid* mem = allocator->Allocate(sizeof(b2EdgeAndCircleContact));\n\treturn new (mem) b2EdgeAndCircleContact(fixtureA, fixtureB);\n}\n\nvoid b2EdgeAndCircleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator)\n{\n\t((b2EdgeAndCircleContact*)contact)->~b2EdgeAndCircleContact();\n\tallocator->Free(contact, sizeof(b2EdgeAndCircleContact));\n}\n\nb2EdgeAndCircleContact::b2EdgeAndCircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB)\n: b2Contact(fixtureA, 0, fixtureB, 0)\n{\n\tb2Assert(m_fixtureA->GetType() == b2Shape::e_edge);\n\tb2Assert(m_fixtureB->GetType() == b2Shape::e_circle);\n}\n\nvoid b2EdgeAndCircleContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB)\n{\n\tb2CollideEdgeAndCircle(\tmanifold,\n\t\t\t\t\t\t\t\t(b2EdgeShape*)m_fixtureA->GetShape(), xfA,\n\t\t\t\t\t\t\t\t(b2CircleShape*)m_fixtureB->GetShape(), xfB);\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_edge_circle_contact.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_EDGE_AND_CIRCLE_CONTACT_H\n#define B2_EDGE_AND_CIRCLE_CONTACT_H\n\n#include \"box2d/b2_contact.h\"\n\nclass b2BlockAllocator;\n\nclass b2EdgeAndCircleContact : public b2Contact\n{\npublic:\n\tstatic b2Contact* Create(\tb2Fixture* fixtureA, int32 indexA,\n\t\t\t\t\t\t\t\tb2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator);\n\tstatic void Destroy(b2Contact* contact, b2BlockAllocator* allocator);\n\n\tb2EdgeAndCircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB);\n\t~b2EdgeAndCircleContact() {}\n\n\tvoid Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) override;\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_edge_polygon_contact.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"b2_edge_polygon_contact.h\"\n\n#include \"box2d/b2_block_allocator.h\"\n#include \"box2d/b2_fixture.h\"\n\n#include <new>\n\nb2Contact* b2EdgeAndPolygonContact::Create(b2Fixture* fixtureA, int32, b2Fixture* fixtureB, int32, b2BlockAllocator* allocator)\n{\n\tvoid* mem = allocator->Allocate(sizeof(b2EdgeAndPolygonContact));\n\treturn new (mem) b2EdgeAndPolygonContact(fixtureA, fixtureB);\n}\n\nvoid b2EdgeAndPolygonContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator)\n{\n\t((b2EdgeAndPolygonContact*)contact)->~b2EdgeAndPolygonContact();\n\tallocator->Free(contact, sizeof(b2EdgeAndPolygonContact));\n}\n\nb2EdgeAndPolygonContact::b2EdgeAndPolygonContact(b2Fixture* fixtureA, b2Fixture* fixtureB)\n: b2Contact(fixtureA, 0, fixtureB, 0)\n{\n\tb2Assert(m_fixtureA->GetType() == b2Shape::e_edge);\n\tb2Assert(m_fixtureB->GetType() == b2Shape::e_polygon);\n}\n\nvoid b2EdgeAndPolygonContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB)\n{\n\tb2CollideEdgeAndPolygon(\tmanifold,\n\t\t\t\t\t\t\t\t(b2EdgeShape*)m_fixtureA->GetShape(), xfA,\n\t\t\t\t\t\t\t\t(b2PolygonShape*)m_fixtureB->GetShape(), xfB);\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_edge_polygon_contact.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_EDGE_AND_POLYGON_CONTACT_H\n#define B2_EDGE_AND_POLYGON_CONTACT_H\n\n#include \"box2d/b2_contact.h\"\n\nclass b2BlockAllocator;\n\nclass b2EdgeAndPolygonContact : public b2Contact\n{\npublic:\n\tstatic b2Contact* Create(\tb2Fixture* fixtureA, int32 indexA,\n\t\t\t\t\t\t\t\tb2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator);\n\tstatic void Destroy(b2Contact* contact, b2BlockAllocator* allocator);\n\n\tb2EdgeAndPolygonContact(b2Fixture* fixtureA, b2Fixture* fixtureB);\n\t~b2EdgeAndPolygonContact() {}\n\n\tvoid Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) override;\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_fixture.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_fixture.h\"\n#include \"box2d/b2_block_allocator.h\"\n#include \"box2d/b2_broad_phase.h\"\n#include \"box2d/b2_chain_shape.h\"\n#include \"box2d/b2_circle_shape.h\"\n#include \"box2d/b2_collision.h\"\n#include \"box2d/b2_contact.h\"\n#include \"box2d/b2_edge_shape.h\"\n#include \"box2d/b2_polygon_shape.h\"\n#include \"box2d/b2_world.h\"\n\nb2Fixture::b2Fixture()\n{\n\tm_body = nullptr;\n\tm_next = nullptr;\n\tm_proxies = nullptr;\n\tm_proxyCount = 0;\n\tm_shape = nullptr;\n\tm_density = 0.0f;\n}\n\nvoid b2Fixture::Create(b2BlockAllocator* allocator, b2Body* body, const b2FixtureDef* def)\n{\n\tm_userData = def->userData;\n\tm_friction = def->friction;\n\tm_restitution = def->restitution;\n\tm_restitutionThreshold = def->restitutionThreshold;\n\n\tm_body = body;\n\tm_next = nullptr;\n\n\tm_filter = def->filter;\n\n\tm_isSensor = def->isSensor;\n\n\tm_shape = def->shape->Clone(allocator);\n\n\t// Reserve proxy space\n\tint32 childCount = m_shape->GetChildCount();\n\tm_proxies = (b2FixtureProxy*)allocator->Allocate(childCount * sizeof(b2FixtureProxy));\n\tfor (int32 i = 0; i < childCount; ++i)\n\t{\n\t\tm_proxies[i].fixture = nullptr;\n\t\tm_proxies[i].proxyId = b2BroadPhase::e_nullProxy;\n\t}\n\tm_proxyCount = 0;\n\n\tm_density = def->density;\n}\n\nvoid b2Fixture::Destroy(b2BlockAllocator* allocator)\n{\n\t// The proxies must be destroyed before calling this.\n\tb2Assert(m_proxyCount == 0);\n\n\t// Free the proxy array.\n\tint32 childCount = m_shape->GetChildCount();\n\tallocator->Free(m_proxies, childCount * sizeof(b2FixtureProxy));\n\tm_proxies = nullptr;\n\n\t// Free the child shape.\n\tswitch (m_shape->m_type)\n\t{\n\tcase b2Shape::e_circle:\n\t\t{\n\t\t\tb2CircleShape* s = (b2CircleShape*)m_shape;\n\t\t\ts->~b2CircleShape();\n\t\t\tallocator->Free(s, sizeof(b2CircleShape));\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_edge:\n\t\t{\n\t\t\tb2EdgeShape* s = (b2EdgeShape*)m_shape;\n\t\t\ts->~b2EdgeShape();\n\t\t\tallocator->Free(s, sizeof(b2EdgeShape));\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_polygon:\n\t\t{\n\t\t\tb2PolygonShape* s = (b2PolygonShape*)m_shape;\n\t\t\ts->~b2PolygonShape();\n\t\t\tallocator->Free(s, sizeof(b2PolygonShape));\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_chain:\n\t\t{\n\t\t\tb2ChainShape* s = (b2ChainShape*)m_shape;\n\t\t\ts->~b2ChainShape();\n\t\t\tallocator->Free(s, sizeof(b2ChainShape));\n\t\t}\n\t\tbreak;\n\n\tdefault:\n\t\tb2Assert(false);\n\t\tbreak;\n\t}\n\n\tm_shape = nullptr;\n}\n\nvoid b2Fixture::CreateProxies(b2BroadPhase* broadPhase, const b2Transform& xf)\n{\n\tb2Assert(m_proxyCount == 0);\n\n\t// Create proxies in the broad-phase.\n\tm_proxyCount = m_shape->GetChildCount();\n\n\tfor (int32 i = 0; i < m_proxyCount; ++i)\n\t{\n\t\tb2FixtureProxy* proxy = m_proxies + i;\n\t\tm_shape->ComputeAABB(&proxy->aabb, xf, i);\n\t\tproxy->proxyId = broadPhase->CreateProxy(proxy->aabb, proxy);\n\t\tproxy->fixture = this;\n\t\tproxy->childIndex = i;\n\t}\n}\n\nvoid b2Fixture::DestroyProxies(b2BroadPhase* broadPhase)\n{\n\t// Destroy proxies in the broad-phase.\n\tfor (int32 i = 0; i < m_proxyCount; ++i)\n\t{\n\t\tb2FixtureProxy* proxy = m_proxies + i;\n\t\tbroadPhase->DestroyProxy(proxy->proxyId);\n\t\tproxy->proxyId = b2BroadPhase::e_nullProxy;\n\t}\n\n\tm_proxyCount = 0;\n}\n\nvoid b2Fixture::Synchronize(b2BroadPhase* broadPhase, const b2Transform& transform1, const b2Transform& transform2)\n{\n\tif (m_proxyCount == 0)\n\t{\t\n\t\treturn;\n\t}\n\n\tfor (int32 i = 0; i < m_proxyCount; ++i)\n\t{\n\t\tb2FixtureProxy* proxy = m_proxies + i;\n\n\t\t// Compute an AABB that covers the swept shape (may miss some rotation effect).\n\t\tb2AABB aabb1, aabb2;\n\t\tm_shape->ComputeAABB(&aabb1, transform1, proxy->childIndex);\n\t\tm_shape->ComputeAABB(&aabb2, transform2, proxy->childIndex);\n\t\n\t\tproxy->aabb.Combine(aabb1, aabb2);\n\n\t\tb2Vec2 displacement = aabb2.GetCenter() - aabb1.GetCenter();\n\n\t\tbroadPhase->MoveProxy(proxy->proxyId, proxy->aabb, displacement);\n\t}\n}\n\nvoid b2Fixture::SetFilterData(const b2Filter& filter)\n{\n\tm_filter = filter;\n\n\tRefilter();\n}\n\nvoid b2Fixture::Refilter()\n{\n\tif (m_body == nullptr)\n\t{\n\t\treturn;\n\t}\n\n\t// Flag associated contacts for filtering.\n\tb2ContactEdge* edge = m_body->GetContactList();\n\twhile (edge)\n\t{\n\t\tb2Contact* contact = edge->contact;\n\t\tb2Fixture* fixtureA = contact->GetFixtureA();\n\t\tb2Fixture* fixtureB = contact->GetFixtureB();\n\t\tif (fixtureA == this || fixtureB == this)\n\t\t{\n\t\t\tcontact->FlagForFiltering();\n\t\t}\n\n\t\tedge = edge->next;\n\t}\n\n\tb2World* world = m_body->GetWorld();\n\n\tif (world == nullptr)\n\t{\n\t\treturn;\n\t}\n\n\t// Touch each proxy so that new pairs may be created\n\tb2BroadPhase* broadPhase = &world->m_contactManager.m_broadPhase;\n\tfor (int32 i = 0; i < m_proxyCount; ++i)\n\t{\n\t\tbroadPhase->TouchProxy(m_proxies[i].proxyId);\n\t}\n}\n\nvoid b2Fixture::SetSensor(bool sensor)\n{\n\tif (sensor != m_isSensor)\n\t{\n\t\tm_body->SetAwake(true);\n\t\tm_isSensor = sensor;\n\t}\n}\n\nvoid b2Fixture::Dump(int32 bodyIndex)\n{\n\tb2Dump(\"    b2FixtureDef fd;\\n\");\n\tb2Dump(\"    fd.friction = %.9g;\\n\", m_friction);\n\tb2Dump(\"    fd.restitution = %.9g;\\n\", m_restitution);\n\tb2Dump(\"    fd.restitutionThreshold = %.9g;\\n\", m_restitutionThreshold);\n\tb2Dump(\"    fd.density = %.9g;\\n\", m_density);\n\tb2Dump(\"    fd.isSensor = bool(%d);\\n\", m_isSensor);\n\tb2Dump(\"    fd.filter.categoryBits = uint16(%d);\\n\", m_filter.categoryBits);\n\tb2Dump(\"    fd.filter.maskBits = uint16(%d);\\n\", m_filter.maskBits);\n\tb2Dump(\"    fd.filter.groupIndex = int16(%d);\\n\", m_filter.groupIndex);\n\n\tswitch (m_shape->m_type)\n\t{\n\tcase b2Shape::e_circle:\n\t\t{\n\t\t\tb2CircleShape* s = (b2CircleShape*)m_shape;\n\t\t\tb2Dump(\"    b2CircleShape shape;\\n\");\n\t\t\tb2Dump(\"    shape.m_radius = %.9g;\\n\", s->m_radius);\n\t\t\tb2Dump(\"    shape.m_p.Set(%.9g, %.9g);\\n\", s->m_p.x, s->m_p.y);\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_edge:\n\t\t{\n\t\t\tb2EdgeShape* s = (b2EdgeShape*)m_shape;\n\t\t\tb2Dump(\"    b2EdgeShape shape;\\n\");\n\t\t\tb2Dump(\"    shape.m_radius = %.9g;\\n\", s->m_radius);\n\t\t\tb2Dump(\"    shape.m_vertex0.Set(%.9g, %.9g);\\n\", s->m_vertex0.x, s->m_vertex0.y);\n\t\t\tb2Dump(\"    shape.m_vertex1.Set(%.9g, %.9g);\\n\", s->m_vertex1.x, s->m_vertex1.y);\n\t\t\tb2Dump(\"    shape.m_vertex2.Set(%.9g, %.9g);\\n\", s->m_vertex2.x, s->m_vertex2.y);\n\t\t\tb2Dump(\"    shape.m_vertex3.Set(%.9g, %.9g);\\n\", s->m_vertex3.x, s->m_vertex3.y);\n\t\t\tb2Dump(\"    shape.m_oneSided = bool(%d);\\n\", s->m_oneSided);\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_polygon:\n\t\t{\n\t\t\tb2PolygonShape* s = (b2PolygonShape*)m_shape;\n\t\t\tb2Dump(\"    b2PolygonShape shape;\\n\");\n\t\t\tb2Dump(\"    b2Vec2 vs[%d];\\n\", b2_maxPolygonVertices);\n\t\t\tfor (int32 i = 0; i < s->m_count; ++i)\n\t\t\t{\n\t\t\t\tb2Dump(\"    vs[%d].Set(%.9g, %.9g);\\n\", i, s->m_vertices[i].x, s->m_vertices[i].y);\n\t\t\t}\n\t\t\tb2Dump(\"    shape.Set(vs, %d);\\n\", s->m_count);\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_chain:\n\t\t{\n\t\t\tb2ChainShape* s = (b2ChainShape*)m_shape;\n\t\t\tb2Dump(\"    b2ChainShape shape;\\n\");\n\t\t\tb2Dump(\"    b2Vec2 vs[%d];\\n\", s->m_count);\n\t\t\tfor (int32 i = 0; i < s->m_count; ++i)\n\t\t\t{\n\t\t\t\tb2Dump(\"    vs[%d].Set(%.9g, %.9g);\\n\", i, s->m_vertices[i].x, s->m_vertices[i].y);\n\t\t\t}\n\t\t\tb2Dump(\"    shape.CreateChain(vs, %d);\\n\", s->m_count);\n\t\t\tb2Dump(\"    shape.m_prevVertex.Set(%.9g, %.9g);\\n\", s->m_prevVertex.x, s->m_prevVertex.y);\n\t\t\tb2Dump(\"    shape.m_nextVertex.Set(%.9g, %.9g);\\n\", s->m_nextVertex.x, s->m_nextVertex.y);\n\t\t}\n\t\tbreak;\n\n\tdefault:\n\t\treturn;\n\t}\n\n\tb2Dump(\"\\n\");\n\tb2Dump(\"    fd.shape = &shape;\\n\");\n\tb2Dump(\"\\n\");\n\tb2Dump(\"    bodies[%d]->CreateFixture(&fd);\\n\", bodyIndex);\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_friction_joint.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_friction_joint.h\"\n#include \"box2d/b2_body.h\"\n#include \"box2d/b2_time_step.h\"\n\n// Point-to-point constraint\n// Cdot = v2 - v1\n//      = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n// J = [-I -r1_skew I r2_skew ]\n// Identity used:\n// w k % (rx i + ry j) = w * (-ry i + rx j)\n\n// Angle constraint\n// Cdot = w2 - w1\n// J = [0 0 -1 0 0 1]\n// K = invI1 + invI2\n\nvoid b2FrictionJointDef::Initialize(b2Body* bA, b2Body* bB, const b2Vec2& anchor)\n{\n\tbodyA = bA;\n\tbodyB = bB;\n\tlocalAnchorA = bodyA->GetLocalPoint(anchor);\n\tlocalAnchorB = bodyB->GetLocalPoint(anchor);\n}\n\nb2FrictionJoint::b2FrictionJoint(const b2FrictionJointDef* def)\n: b2Joint(def)\n{\n\tm_localAnchorA = def->localAnchorA;\n\tm_localAnchorB = def->localAnchorB;\n\n\tm_linearImpulse.SetZero();\n\tm_angularImpulse = 0.0f;\n\n\tm_maxForce = def->maxForce;\n\tm_maxTorque = def->maxTorque;\n}\n\nvoid b2FrictionJoint::InitVelocityConstraints(const b2SolverData& data)\n{\n\tm_indexA = m_bodyA->m_islandIndex;\n\tm_indexB = m_bodyB->m_islandIndex;\n\tm_localCenterA = m_bodyA->m_sweep.localCenter;\n\tm_localCenterB = m_bodyB->m_sweep.localCenter;\n\tm_invMassA = m_bodyA->m_invMass;\n\tm_invMassB = m_bodyB->m_invMass;\n\tm_invIA = m_bodyA->m_invI;\n\tm_invIB = m_bodyB->m_invI;\n\n\tfloat aA = data.positions[m_indexA].a;\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat wA = data.velocities[m_indexA].w;\n\n\tfloat aB = data.positions[m_indexB].a;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat wB = data.velocities[m_indexB].w;\n\n\tb2Rot qA(aA), qB(aB);\n\n\t// Compute the effective mass matrix.\n\tm_rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tm_rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\n\t// J = [-I -r1_skew I r2_skew]\n\t//     [ 0       -1 0       1]\n\t// r_skew = [-ry; rx]\n\n\t// Matlab\n\t// K = [ mA+r1y^2*iA+mB+r2y^2*iB,  -r1y*iA*r1x-r2y*iB*r2x,          -r1y*iA-r2y*iB]\n\t//     [  -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB,           r1x*iA+r2x*iB]\n\t//     [          -r1y*iA-r2y*iB,           r1x*iA+r2x*iB,                   iA+iB]\n\n\tfloat mA = m_invMassA, mB = m_invMassB;\n\tfloat iA = m_invIA, iB = m_invIB;\n\n\tb2Mat22 K;\n\tK.ex.x = mA + mB + iA * m_rA.y * m_rA.y + iB * m_rB.y * m_rB.y;\n\tK.ex.y = -iA * m_rA.x * m_rA.y - iB * m_rB.x * m_rB.y;\n\tK.ey.x = K.ex.y;\n\tK.ey.y = mA + mB + iA * m_rA.x * m_rA.x + iB * m_rB.x * m_rB.x;\n\n\tm_linearMass = K.GetInverse();\n\n\tm_angularMass = iA + iB;\n\tif (m_angularMass > 0.0f)\n\t{\n\t\tm_angularMass = 1.0f / m_angularMass;\n\t}\n\n\tif (data.step.warmStarting)\n\t{\n\t\t// Scale impulses to support a variable time step.\n\t\tm_linearImpulse *= data.step.dtRatio;\n\t\tm_angularImpulse *= data.step.dtRatio;\n\n\t\tb2Vec2 P(m_linearImpulse.x, m_linearImpulse.y);\n\t\tvA -= mA * P;\n\t\twA -= iA * (b2Cross(m_rA, P) + m_angularImpulse);\n\t\tvB += mB * P;\n\t\twB += iB * (b2Cross(m_rB, P) + m_angularImpulse);\n\t}\n\telse\n\t{\n\t\tm_linearImpulse.SetZero();\n\t\tm_angularImpulse = 0.0f;\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nvoid b2FrictionJoint::SolveVelocityConstraints(const b2SolverData& data)\n{\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat wA = data.velocities[m_indexA].w;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat wB = data.velocities[m_indexB].w;\n\n\tfloat mA = m_invMassA, mB = m_invMassB;\n\tfloat iA = m_invIA, iB = m_invIB;\n\n\tfloat h = data.step.dt;\n\n\t// Solve angular friction\n\t{\n\t\tfloat Cdot = wB - wA;\n\t\tfloat impulse = -m_angularMass * Cdot;\n\n\t\tfloat oldImpulse = m_angularImpulse;\n\t\tfloat maxImpulse = h * m_maxTorque;\n\t\tm_angularImpulse = b2Clamp(m_angularImpulse + impulse, -maxImpulse, maxImpulse);\n\t\timpulse = m_angularImpulse - oldImpulse;\n\n\t\twA -= iA * impulse;\n\t\twB += iB * impulse;\n\t}\n\n\t// Solve linear friction\n\t{\n\t\tb2Vec2 Cdot = vB + b2Cross(wB, m_rB) - vA - b2Cross(wA, m_rA);\n\n\t\tb2Vec2 impulse = -b2Mul(m_linearMass, Cdot);\n\t\tb2Vec2 oldImpulse = m_linearImpulse;\n\t\tm_linearImpulse += impulse;\n\n\t\tfloat maxImpulse = h * m_maxForce;\n\n\t\tif (m_linearImpulse.LengthSquared() > maxImpulse * maxImpulse)\n\t\t{\n\t\t\tm_linearImpulse.Normalize();\n\t\t\tm_linearImpulse *= maxImpulse;\n\t\t}\n\n\t\timpulse = m_linearImpulse - oldImpulse;\n\n\t\tvA -= mA * impulse;\n\t\twA -= iA * b2Cross(m_rA, impulse);\n\n\t\tvB += mB * impulse;\n\t\twB += iB * b2Cross(m_rB, impulse);\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nbool b2FrictionJoint::SolvePositionConstraints(const b2SolverData& data)\n{\n\tB2_NOT_USED(data);\n\n\treturn true;\n}\n\nb2Vec2 b2FrictionJoint::GetAnchorA() const\n{\n\treturn m_bodyA->GetWorldPoint(m_localAnchorA);\n}\n\nb2Vec2 b2FrictionJoint::GetAnchorB() const\n{\n\treturn m_bodyB->GetWorldPoint(m_localAnchorB);\n}\n\nb2Vec2 b2FrictionJoint::GetReactionForce(float inv_dt) const\n{\n\treturn inv_dt * m_linearImpulse;\n}\n\nfloat b2FrictionJoint::GetReactionTorque(float inv_dt) const\n{\n\treturn inv_dt * m_angularImpulse;\n}\n\nvoid b2FrictionJoint::SetMaxForce(float force)\n{\n\tb2Assert(b2IsValid(force) && force >= 0.0f);\n\tm_maxForce = force;\n}\n\nfloat b2FrictionJoint::GetMaxForce() const\n{\n\treturn m_maxForce;\n}\n\nvoid b2FrictionJoint::SetMaxTorque(float torque)\n{\n\tb2Assert(b2IsValid(torque) && torque >= 0.0f);\n\tm_maxTorque = torque;\n}\n\nfloat b2FrictionJoint::GetMaxTorque() const\n{\n\treturn m_maxTorque;\n}\n\nvoid b2FrictionJoint::Dump()\n{\n\tint32 indexA = m_bodyA->m_islandIndex;\n\tint32 indexB = m_bodyB->m_islandIndex;\n\n\tb2Dump(\"  b2FrictionJointDef jd;\\n\");\n\tb2Dump(\"  jd.bodyA = bodies[%d];\\n\", indexA);\n\tb2Dump(\"  jd.bodyB = bodies[%d];\\n\", indexB);\n\tb2Dump(\"  jd.collideConnected = bool(%d);\\n\", m_collideConnected);\n\tb2Dump(\"  jd.localAnchorA.Set(%.9g, %.9g);\\n\", m_localAnchorA.x, m_localAnchorA.y);\n\tb2Dump(\"  jd.localAnchorB.Set(%.9g, %.9g);\\n\", m_localAnchorB.x, m_localAnchorB.y);\n\tb2Dump(\"  jd.maxForce = %.9g;\\n\", m_maxForce);\n\tb2Dump(\"  jd.maxTorque = %.9g;\\n\", m_maxTorque);\n\tb2Dump(\"  joints[%d] = m_world->CreateJoint(&jd);\\n\", m_index);\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_gear_joint.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_gear_joint.h\"\n#include \"box2d/b2_revolute_joint.h\"\n#include \"box2d/b2_prismatic_joint.h\"\n#include \"box2d/b2_body.h\"\n#include \"box2d/b2_time_step.h\"\n\n// Gear Joint:\n// C0 = (coordinate1 + ratio * coordinate2)_initial\n// C = (coordinate1 + ratio * coordinate2) - C0 = 0\n// J = [J1 ratio * J2]\n// K = J * invM * JT\n//   = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T\n//\n// Revolute:\n// coordinate = rotation\n// Cdot = angularVelocity\n// J = [0 0 1]\n// K = J * invM * JT = invI\n//\n// Prismatic:\n// coordinate = dot(p - pg, ug)\n// Cdot = dot(v + cross(w, r), ug)\n// J = [ug cross(r, ug)]\n// K = J * invM * JT = invMass + invI * cross(r, ug)^2\n\nb2GearJoint::b2GearJoint(const b2GearJointDef* def)\n: b2Joint(def)\n{\n\tm_joint1 = def->joint1;\n\tm_joint2 = def->joint2;\n\n\tm_typeA = m_joint1->GetType();\n\tm_typeB = m_joint2->GetType();\n\n\tb2Assert(m_typeA == e_revoluteJoint || m_typeA == e_prismaticJoint);\n\tb2Assert(m_typeB == e_revoluteJoint || m_typeB == e_prismaticJoint);\n\n\tfloat coordinateA, coordinateB;\n\n\t// TODO_ERIN there might be some problem with the joint edges in b2Joint.\n\n\tm_bodyC = m_joint1->GetBodyA();\n\tm_bodyA = m_joint1->GetBodyB();\n\n\t// Body B on joint1 must be dynamic\n\tb2Assert(m_bodyA->m_type == b2_dynamicBody);\n\n\t// Get geometry of joint1\n\tb2Transform xfA = m_bodyA->m_xf;\n\tfloat aA = m_bodyA->m_sweep.a;\n\tb2Transform xfC = m_bodyC->m_xf;\n\tfloat aC = m_bodyC->m_sweep.a;\n\n\tif (m_typeA == e_revoluteJoint)\n\t{\n\t\tb2RevoluteJoint* revolute = (b2RevoluteJoint*)def->joint1;\n\t\tm_localAnchorC = revolute->m_localAnchorA;\n\t\tm_localAnchorA = revolute->m_localAnchorB;\n\t\tm_referenceAngleA = revolute->m_referenceAngle;\n\t\tm_localAxisC.SetZero();\n\n\t\tcoordinateA = aA - aC - m_referenceAngleA;\n\t}\n\telse\n\t{\n\t\tb2PrismaticJoint* prismatic = (b2PrismaticJoint*)def->joint1;\n\t\tm_localAnchorC = prismatic->m_localAnchorA;\n\t\tm_localAnchorA = prismatic->m_localAnchorB;\n\t\tm_referenceAngleA = prismatic->m_referenceAngle;\n\t\tm_localAxisC = prismatic->m_localXAxisA;\n\n\t\tb2Vec2 pC = m_localAnchorC;\n\t\tb2Vec2 pA = b2MulT(xfC.q, b2Mul(xfA.q, m_localAnchorA) + (xfA.p - xfC.p));\n\t\tcoordinateA = b2Dot(pA - pC, m_localAxisC);\n\t}\n\n\tm_bodyD = m_joint2->GetBodyA();\n\tm_bodyB = m_joint2->GetBodyB();\n\n\t// Body B on joint2 must be dynamic\n\tb2Assert(m_bodyB->m_type == b2_dynamicBody);\n\n\t// Get geometry of joint2\n\tb2Transform xfB = m_bodyB->m_xf;\n\tfloat aB = m_bodyB->m_sweep.a;\n\tb2Transform xfD = m_bodyD->m_xf;\n\tfloat aD = m_bodyD->m_sweep.a;\n\n\tif (m_typeB == e_revoluteJoint)\n\t{\n\t\tb2RevoluteJoint* revolute = (b2RevoluteJoint*)def->joint2;\n\t\tm_localAnchorD = revolute->m_localAnchorA;\n\t\tm_localAnchorB = revolute->m_localAnchorB;\n\t\tm_referenceAngleB = revolute->m_referenceAngle;\n\t\tm_localAxisD.SetZero();\n\n\t\tcoordinateB = aB - aD - m_referenceAngleB;\n\t}\n\telse\n\t{\n\t\tb2PrismaticJoint* prismatic = (b2PrismaticJoint*)def->joint2;\n\t\tm_localAnchorD = prismatic->m_localAnchorA;\n\t\tm_localAnchorB = prismatic->m_localAnchorB;\n\t\tm_referenceAngleB = prismatic->m_referenceAngle;\n\t\tm_localAxisD = prismatic->m_localXAxisA;\n\n\t\tb2Vec2 pD = m_localAnchorD;\n\t\tb2Vec2 pB = b2MulT(xfD.q, b2Mul(xfB.q, m_localAnchorB) + (xfB.p - xfD.p));\n\t\tcoordinateB = b2Dot(pB - pD, m_localAxisD);\n\t}\n\n\tm_ratio = def->ratio;\n\n\tm_constant = coordinateA + m_ratio * coordinateB;\n\n\tm_impulse = 0.0f;\n}\n\nvoid b2GearJoint::InitVelocityConstraints(const b2SolverData& data)\n{\n\tm_indexA = m_bodyA->m_islandIndex;\n\tm_indexB = m_bodyB->m_islandIndex;\n\tm_indexC = m_bodyC->m_islandIndex;\n\tm_indexD = m_bodyD->m_islandIndex;\n\tm_lcA = m_bodyA->m_sweep.localCenter;\n\tm_lcB = m_bodyB->m_sweep.localCenter;\n\tm_lcC = m_bodyC->m_sweep.localCenter;\n\tm_lcD = m_bodyD->m_sweep.localCenter;\n\tm_mA = m_bodyA->m_invMass;\n\tm_mB = m_bodyB->m_invMass;\n\tm_mC = m_bodyC->m_invMass;\n\tm_mD = m_bodyD->m_invMass;\n\tm_iA = m_bodyA->m_invI;\n\tm_iB = m_bodyB->m_invI;\n\tm_iC = m_bodyC->m_invI;\n\tm_iD = m_bodyD->m_invI;\n\n\tfloat aA = data.positions[m_indexA].a;\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat wA = data.velocities[m_indexA].w;\n\n\tfloat aB = data.positions[m_indexB].a;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat wB = data.velocities[m_indexB].w;\n\n\tfloat aC = data.positions[m_indexC].a;\n\tb2Vec2 vC = data.velocities[m_indexC].v;\n\tfloat wC = data.velocities[m_indexC].w;\n\n\tfloat aD = data.positions[m_indexD].a;\n\tb2Vec2 vD = data.velocities[m_indexD].v;\n\tfloat wD = data.velocities[m_indexD].w;\n\n\tb2Rot qA(aA), qB(aB), qC(aC), qD(aD);\n\n\tm_mass = 0.0f;\n\n\tif (m_typeA == e_revoluteJoint)\n\t{\n\t\tm_JvAC.SetZero();\n\t\tm_JwA = 1.0f;\n\t\tm_JwC = 1.0f;\n\t\tm_mass += m_iA + m_iC;\n\t}\n\telse\n\t{\n\t\tb2Vec2 u = b2Mul(qC, m_localAxisC);\n\t\tb2Vec2 rC = b2Mul(qC, m_localAnchorC - m_lcC);\n\t\tb2Vec2 rA = b2Mul(qA, m_localAnchorA - m_lcA);\n\t\tm_JvAC = u;\n\t\tm_JwC = b2Cross(rC, u);\n\t\tm_JwA = b2Cross(rA, u);\n\t\tm_mass += m_mC + m_mA + m_iC * m_JwC * m_JwC + m_iA * m_JwA * m_JwA;\n\t}\n\n\tif (m_typeB == e_revoluteJoint)\n\t{\n\t\tm_JvBD.SetZero();\n\t\tm_JwB = m_ratio;\n\t\tm_JwD = m_ratio;\n\t\tm_mass += m_ratio * m_ratio * (m_iB + m_iD);\n\t}\n\telse\n\t{\n\t\tb2Vec2 u = b2Mul(qD, m_localAxisD);\n\t\tb2Vec2 rD = b2Mul(qD, m_localAnchorD - m_lcD);\n\t\tb2Vec2 rB = b2Mul(qB, m_localAnchorB - m_lcB);\n\t\tm_JvBD = m_ratio * u;\n\t\tm_JwD = m_ratio * b2Cross(rD, u);\n\t\tm_JwB = m_ratio * b2Cross(rB, u);\n\t\tm_mass += m_ratio * m_ratio * (m_mD + m_mB) + m_iD * m_JwD * m_JwD + m_iB * m_JwB * m_JwB;\n\t}\n\n\t// Compute effective mass.\n\tm_mass = m_mass > 0.0f ? 1.0f / m_mass : 0.0f;\n\n\tif (data.step.warmStarting)\n\t{\n\t\tvA += (m_mA * m_impulse) * m_JvAC;\n\t\twA += m_iA * m_impulse * m_JwA;\n\t\tvB += (m_mB * m_impulse) * m_JvBD;\n\t\twB += m_iB * m_impulse * m_JwB;\n\t\tvC -= (m_mC * m_impulse) * m_JvAC;\n\t\twC -= m_iC * m_impulse * m_JwC;\n\t\tvD -= (m_mD * m_impulse) * m_JvBD;\n\t\twD -= m_iD * m_impulse * m_JwD;\n\t}\n\telse\n\t{\n\t\tm_impulse = 0.0f;\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n\tdata.velocities[m_indexC].v = vC;\n\tdata.velocities[m_indexC].w = wC;\n\tdata.velocities[m_indexD].v = vD;\n\tdata.velocities[m_indexD].w = wD;\n}\n\nvoid b2GearJoint::SolveVelocityConstraints(const b2SolverData& data)\n{\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat wA = data.velocities[m_indexA].w;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat wB = data.velocities[m_indexB].w;\n\tb2Vec2 vC = data.velocities[m_indexC].v;\n\tfloat wC = data.velocities[m_indexC].w;\n\tb2Vec2 vD = data.velocities[m_indexD].v;\n\tfloat wD = data.velocities[m_indexD].w;\n\n\tfloat Cdot = b2Dot(m_JvAC, vA - vC) + b2Dot(m_JvBD, vB - vD);\n\tCdot += (m_JwA * wA - m_JwC * wC) + (m_JwB * wB - m_JwD * wD);\n\n\tfloat impulse = -m_mass * Cdot;\n\tm_impulse += impulse;\n\n\tvA += (m_mA * impulse) * m_JvAC;\n\twA += m_iA * impulse * m_JwA;\n\tvB += (m_mB * impulse) * m_JvBD;\n\twB += m_iB * impulse * m_JwB;\n\tvC -= (m_mC * impulse) * m_JvAC;\n\twC -= m_iC * impulse * m_JwC;\n\tvD -= (m_mD * impulse) * m_JvBD;\n\twD -= m_iD * impulse * m_JwD;\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n\tdata.velocities[m_indexC].v = vC;\n\tdata.velocities[m_indexC].w = wC;\n\tdata.velocities[m_indexD].v = vD;\n\tdata.velocities[m_indexD].w = wD;\n}\n\nbool b2GearJoint::SolvePositionConstraints(const b2SolverData& data)\n{\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat aA = data.positions[m_indexA].a;\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat aB = data.positions[m_indexB].a;\n\tb2Vec2 cC = data.positions[m_indexC].c;\n\tfloat aC = data.positions[m_indexC].a;\n\tb2Vec2 cD = data.positions[m_indexD].c;\n\tfloat aD = data.positions[m_indexD].a;\n\n\tb2Rot qA(aA), qB(aB), qC(aC), qD(aD);\n\n\tfloat linearError = 0.0f;\n\n\tfloat coordinateA, coordinateB;\n\n\tb2Vec2 JvAC, JvBD;\n\tfloat JwA, JwB, JwC, JwD;\n\tfloat mass = 0.0f;\n\n\tif (m_typeA == e_revoluteJoint)\n\t{\n\t\tJvAC.SetZero();\n\t\tJwA = 1.0f;\n\t\tJwC = 1.0f;\n\t\tmass += m_iA + m_iC;\n\n\t\tcoordinateA = aA - aC - m_referenceAngleA;\n\t}\n\telse\n\t{\n\t\tb2Vec2 u = b2Mul(qC, m_localAxisC);\n\t\tb2Vec2 rC = b2Mul(qC, m_localAnchorC - m_lcC);\n\t\tb2Vec2 rA = b2Mul(qA, m_localAnchorA - m_lcA);\n\t\tJvAC = u;\n\t\tJwC = b2Cross(rC, u);\n\t\tJwA = b2Cross(rA, u);\n\t\tmass += m_mC + m_mA + m_iC * JwC * JwC + m_iA * JwA * JwA;\n\n\t\tb2Vec2 pC = m_localAnchorC - m_lcC;\n\t\tb2Vec2 pA = b2MulT(qC, rA + (cA - cC));\n\t\tcoordinateA = b2Dot(pA - pC, m_localAxisC);\n\t}\n\n\tif (m_typeB == e_revoluteJoint)\n\t{\n\t\tJvBD.SetZero();\n\t\tJwB = m_ratio;\n\t\tJwD = m_ratio;\n\t\tmass += m_ratio * m_ratio * (m_iB + m_iD);\n\n\t\tcoordinateB = aB - aD - m_referenceAngleB;\n\t}\n\telse\n\t{\n\t\tb2Vec2 u = b2Mul(qD, m_localAxisD);\n\t\tb2Vec2 rD = b2Mul(qD, m_localAnchorD - m_lcD);\n\t\tb2Vec2 rB = b2Mul(qB, m_localAnchorB - m_lcB);\n\t\tJvBD = m_ratio * u;\n\t\tJwD = m_ratio * b2Cross(rD, u);\n\t\tJwB = m_ratio * b2Cross(rB, u);\n\t\tmass += m_ratio * m_ratio * (m_mD + m_mB) + m_iD * JwD * JwD + m_iB * JwB * JwB;\n\n\t\tb2Vec2 pD = m_localAnchorD - m_lcD;\n\t\tb2Vec2 pB = b2MulT(qD, rB + (cB - cD));\n\t\tcoordinateB = b2Dot(pB - pD, m_localAxisD);\n\t}\n\n\tfloat C = (coordinateA + m_ratio * coordinateB) - m_constant;\n\n\tfloat impulse = 0.0f;\n\tif (mass > 0.0f)\n\t{\n\t\timpulse = -C / mass;\n\t}\n\n\tcA += m_mA * impulse * JvAC;\n\taA += m_iA * impulse * JwA;\n\tcB += m_mB * impulse * JvBD;\n\taB += m_iB * impulse * JwB;\n\tcC -= m_mC * impulse * JvAC;\n\taC -= m_iC * impulse * JwC;\n\tcD -= m_mD * impulse * JvBD;\n\taD -= m_iD * impulse * JwD;\n\n\tdata.positions[m_indexA].c = cA;\n\tdata.positions[m_indexA].a = aA;\n\tdata.positions[m_indexB].c = cB;\n\tdata.positions[m_indexB].a = aB;\n\tdata.positions[m_indexC].c = cC;\n\tdata.positions[m_indexC].a = aC;\n\tdata.positions[m_indexD].c = cD;\n\tdata.positions[m_indexD].a = aD;\n\n\t// TODO_ERIN not implemented\n\treturn linearError < b2_linearSlop;\n}\n\nb2Vec2 b2GearJoint::GetAnchorA() const\n{\n\treturn m_bodyA->GetWorldPoint(m_localAnchorA);\n}\n\nb2Vec2 b2GearJoint::GetAnchorB() const\n{\n\treturn m_bodyB->GetWorldPoint(m_localAnchorB);\n}\n\nb2Vec2 b2GearJoint::GetReactionForce(float inv_dt) const\n{\n\tb2Vec2 P = m_impulse * m_JvAC;\n\treturn inv_dt * P;\n}\n\nfloat b2GearJoint::GetReactionTorque(float inv_dt) const\n{\n\tfloat L = m_impulse * m_JwA;\n\treturn inv_dt * L;\n}\n\nvoid b2GearJoint::SetRatio(float ratio)\n{\n\tb2Assert(b2IsValid(ratio));\n\tm_ratio = ratio;\n}\n\nfloat b2GearJoint::GetRatio() const\n{\n\treturn m_ratio;\n}\n\nvoid b2GearJoint::Dump()\n{\n\tint32 indexA = m_bodyA->m_islandIndex;\n\tint32 indexB = m_bodyB->m_islandIndex;\n\n\tint32 index1 = m_joint1->m_index;\n\tint32 index2 = m_joint2->m_index;\n\n\tb2Dump(\"  b2GearJointDef jd;\\n\");\n\tb2Dump(\"  jd.bodyA = bodies[%d];\\n\", indexA);\n\tb2Dump(\"  jd.bodyB = bodies[%d];\\n\", indexB);\n\tb2Dump(\"  jd.collideConnected = bool(%d);\\n\", m_collideConnected);\n\tb2Dump(\"  jd.joint1 = joints[%d];\\n\", index1);\n\tb2Dump(\"  jd.joint2 = joints[%d];\\n\", index2);\n\tb2Dump(\"  jd.ratio = %.9g;\\n\", m_ratio);\n\tb2Dump(\"  joints[%d] = m_world->CreateJoint(&jd);\\n\", m_index);\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_island.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_body.h\"\n#include \"box2d/b2_contact.h\"\n#include \"box2d/b2_distance.h\"\n#include \"box2d/b2_fixture.h\"\n#include \"box2d/b2_joint.h\"\n#include \"box2d/b2_stack_allocator.h\"\n#include \"box2d/b2_timer.h\"\n#include \"box2d/b2_world.h\"\n\n#include \"b2_island.h\"\n#include \"b2_contact_solver.h\"\n\n/*\nPosition Correction Notes\n=========================\nI tried the several algorithms for position correction of the 2D revolute joint.\nI looked at these systems:\n- simple pendulum (1m diameter sphere on massless 5m stick) with initial angular velocity of 100 rad/s.\n- suspension bridge with 30 1m long planks of length 1m.\n- multi-link chain with 30 1m long links.\n\nHere are the algorithms:\n\nBaumgarte - A fraction of the position error is added to the velocity error. There is no\nseparate position solver.\n\nPseudo Velocities - After the velocity solver and position integration,\nthe position error, Jacobian, and effective mass are recomputed. Then\nthe velocity constraints are solved with pseudo velocities and a fraction\nof the position error is added to the pseudo velocity error. The pseudo\nvelocities are initialized to zero and there is no warm-starting. After\nthe position solver, the pseudo velocities are added to the positions.\nThis is also called the First Order World method or the Position LCP method.\n\nModified Nonlinear Gauss-Seidel (NGS) - Like Pseudo Velocities except the\nposition error is re-computed for each constraint and the positions are updated\nafter the constraint is solved. The radius vectors (aka Jacobians) are\nre-computed too (otherwise the algorithm has horrible instability). The pseudo\nvelocity states are not needed because they are effectively zero at the beginning\nof each iteration. Since we have the current position error, we allow the\niterations to terminate early if the error becomes smaller than b2_linearSlop.\n\nFull NGS or just NGS - Like Modified NGS except the effective mass are re-computed\neach time a constraint is solved.\n\nHere are the results:\nBaumgarte - this is the cheapest algorithm but it has some stability problems,\nespecially with the bridge. The chain links separate easily close to the root\nand they jitter as they struggle to pull together. This is one of the most common\nmethods in the field. The big drawback is that the position correction artificially\naffects the momentum, thus leading to instabilities and false bounce. I used a\nbias factor of 0.2. A larger bias factor makes the bridge less stable, a smaller\nfactor makes joints and contacts more spongy.\n\nPseudo Velocities - the is more stable than the Baumgarte method. The bridge is\nstable. However, joints still separate with large angular velocities. Drag the\nsimple pendulum in a circle quickly and the joint will separate. The chain separates\neasily and does not recover. I used a bias factor of 0.2. A larger value lead to\nthe bridge collapsing when a heavy cube drops on it.\n\nModified NGS - this algorithm is better in some ways than Baumgarte and Pseudo\nVelocities, but in other ways it is worse. The bridge and chain are much more\nstable, but the simple pendulum goes unstable at high angular velocities.\n\nFull NGS - stable in all tests. The joints display good stiffness. The bridge\nstill sags, but this is better than infinite forces.\n\nRecommendations\nPseudo Velocities are not really worthwhile because the bridge and chain cannot\nrecover from joint separation. In other cases the benefit over Baumgarte is small.\n\nModified NGS is not a robust method for the revolute joint due to the violent\ninstability seen in the simple pendulum. Perhaps it is viable with other constraint\ntypes, especially scalar constraints where the effective mass is a scalar.\n\nThis leaves Baumgarte and Full NGS. Baumgarte has small, but manageable instabilities\nand is very fast. I don't think we can escape Baumgarte, especially in highly\ndemanding cases where high constraint fidelity is not needed.\n\nFull NGS is robust and easy on the eyes. I recommend this as an option for\nhigher fidelity simulation and certainly for suspension bridges and long chains.\nFull NGS might be a good choice for ragdolls, especially motorized ragdolls where\njoint separation can be problematic. The number of NGS iterations can be reduced\nfor better performance without harming robustness much.\n\nEach joint in a can be handled differently in the position solver. So I recommend\na system where the user can select the algorithm on a per joint basis. I would\nprobably default to the slower Full NGS and let the user select the faster\nBaumgarte method in performance critical scenarios.\n*/\n\n/*\nCache Performance\n\nThe Box2D solvers are dominated by cache misses. Data structures are designed\nto increase the number of cache hits. Much of misses are due to random access\nto body data. The constraint structures are iterated over linearly, which leads\nto few cache misses.\n\nThe bodies are not accessed during iteration. Instead read only data, such as\nthe mass values are stored with the constraints. The mutable data are the constraint\nimpulses and the bodies velocities/positions. The impulses are held inside the\nconstraint structures. The body velocities/positions are held in compact, temporary\narrays to increase the number of cache hits. Linear and angular velocity are\nstored in a single array since multiple arrays lead to multiple misses.\n*/\n\n/*\n2D Rotation\n\nR = [cos(theta) -sin(theta)]\n    [sin(theta) cos(theta) ]\n\nthetaDot = omega\n\nLet q1 = cos(theta), q2 = sin(theta).\nR = [q1 -q2]\n    [q2  q1]\n\nq1Dot = -thetaDot * q2\nq2Dot = thetaDot * q1\n\nq1_new = q1_old - dt * w * q2\nq2_new = q2_old + dt * w * q1\nthen normalize.\n\nThis might be faster than computing sin+cos.\nHowever, we can compute sin+cos of the same angle fast.\n*/\n\nb2Island::b2Island(\n\tint32 bodyCapacity,\n\tint32 contactCapacity,\n\tint32 jointCapacity,\n\tb2StackAllocator* allocator,\n\tb2ContactListener* listener)\n{\n\tm_bodyCapacity = bodyCapacity;\n\tm_contactCapacity = contactCapacity;\n\tm_jointCapacity\t = jointCapacity;\n\tm_bodyCount = 0;\n\tm_contactCount = 0;\n\tm_jointCount = 0;\n\n\tm_allocator = allocator;\n\tm_listener = listener;\n\n\tm_bodies = (b2Body**)m_allocator->Allocate(bodyCapacity * sizeof(b2Body*));\n\tm_contacts = (b2Contact**)m_allocator->Allocate(contactCapacity\t * sizeof(b2Contact*));\n\tm_joints = (b2Joint**)m_allocator->Allocate(jointCapacity * sizeof(b2Joint*));\n\n\tm_velocities = (b2Velocity*)m_allocator->Allocate(m_bodyCapacity * sizeof(b2Velocity));\n\tm_positions = (b2Position*)m_allocator->Allocate(m_bodyCapacity * sizeof(b2Position));\n}\n\nb2Island::~b2Island()\n{\n\t// Warning: the order should reverse the constructor order.\n\tm_allocator->Free(m_positions);\n\tm_allocator->Free(m_velocities);\n\tm_allocator->Free(m_joints);\n\tm_allocator->Free(m_contacts);\n\tm_allocator->Free(m_bodies);\n}\n\nvoid b2Island::Solve(b2Profile* profile, const b2TimeStep& step, const b2Vec2& gravity, bool allowSleep)\n{\n\tb2Timer timer;\n\n\tfloat h = step.dt;\n\n\t// Integrate velocities and apply damping. Initialize the body state.\n\tfor (int32 i = 0; i < m_bodyCount; ++i)\n\t{\n\t\tb2Body* b = m_bodies[i];\n\n\t\tb2Vec2 c = b->m_sweep.c;\n\t\tfloat a = b->m_sweep.a;\n\t\tb2Vec2 v = b->m_linearVelocity;\n\t\tfloat w = b->m_angularVelocity;\n\n\t\t// Store positions for continuous collision.\n\t\tb->m_sweep.c0 = b->m_sweep.c;\n\t\tb->m_sweep.a0 = b->m_sweep.a;\n\n\t\tif (b->m_type == b2_dynamicBody)\n\t\t{\n\t\t\t// Integrate velocities.\n\t\t\tv += h * b->m_invMass * (b->m_gravityScale * b->m_mass * gravity + b->m_force);\n\t\t\tw += h * b->m_invI * b->m_torque;\n\n\t\t\t// Apply damping.\n\t\t\t// ODE: dv/dt + c * v = 0\n\t\t\t// Solution: v(t) = v0 * exp(-c * t)\n\t\t\t// Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt)\n\t\t\t// v2 = exp(-c * dt) * v1\n\t\t\t// Pade approximation:\n\t\t\t// v2 = v1 * 1 / (1 + c * dt)\n\t\t\tv *= 1.0f / (1.0f + h * b->m_linearDamping);\n\t\t\tw *= 1.0f / (1.0f + h * b->m_angularDamping);\n\t\t}\n\n\t\tm_positions[i].c = c;\n\t\tm_positions[i].a = a;\n\t\tm_velocities[i].v = v;\n\t\tm_velocities[i].w = w;\n\t}\n\n\ttimer.Reset();\n\n\t// Solver data\n\tb2SolverData solverData;\n\tsolverData.step = step;\n\tsolverData.positions = m_positions;\n\tsolverData.velocities = m_velocities;\n\n\t// Initialize velocity constraints.\n\tb2ContactSolverDef contactSolverDef;\n\tcontactSolverDef.step = step;\n\tcontactSolverDef.contacts = m_contacts;\n\tcontactSolverDef.count = m_contactCount;\n\tcontactSolverDef.positions = m_positions;\n\tcontactSolverDef.velocities = m_velocities;\n\tcontactSolverDef.allocator = m_allocator;\n\n\tb2ContactSolver contactSolver(&contactSolverDef);\n\tcontactSolver.InitializeVelocityConstraints();\n\n\tif (step.warmStarting)\n\t{\n\t\tcontactSolver.WarmStart();\n\t}\n\t\n\tfor (int32 i = 0; i < m_jointCount; ++i)\n\t{\n\t\tm_joints[i]->InitVelocityConstraints(solverData);\n\t}\n\n\tprofile->solveInit = timer.GetMilliseconds();\n\n\t// Solve velocity constraints\n\ttimer.Reset();\n\tfor (int32 i = 0; i < step.velocityIterations; ++i)\n\t{\n\t\tfor (int32 j = 0; j < m_jointCount; ++j)\n\t\t{\n\t\t\tm_joints[j]->SolveVelocityConstraints(solverData);\n\t\t}\n\n\t\tcontactSolver.SolveVelocityConstraints();\n\t}\n\n\t// Store impulses for warm starting\n\tcontactSolver.StoreImpulses();\n\tprofile->solveVelocity = timer.GetMilliseconds();\n\n\t// Integrate positions\n\tfor (int32 i = 0; i < m_bodyCount; ++i)\n\t{\n\t\tb2Vec2 c = m_positions[i].c;\n\t\tfloat a = m_positions[i].a;\n\t\tb2Vec2 v = m_velocities[i].v;\n\t\tfloat w = m_velocities[i].w;\n\n\t\t// Check for large velocities\n\t\tb2Vec2 translation = h * v;\n\t\tif (b2Dot(translation, translation) > b2_maxTranslationSquared)\n\t\t{\n\t\t\tfloat ratio = b2_maxTranslation / translation.Length();\n\t\t\tv *= ratio;\n\t\t}\n\n\t\tfloat rotation = h * w;\n\t\tif (rotation * rotation > b2_maxRotationSquared)\n\t\t{\n\t\t\tfloat ratio = b2_maxRotation / b2Abs(rotation);\n\t\t\tw *= ratio;\n\t\t}\n\n\t\t// Integrate\n\t\tc += h * v;\n\t\ta += h * w;\n\n\t\tm_positions[i].c = c;\n\t\tm_positions[i].a = a;\n\t\tm_velocities[i].v = v;\n\t\tm_velocities[i].w = w;\n\t}\n\n\t// Solve position constraints\n\ttimer.Reset();\n\tbool positionSolved = false;\n\tfor (int32 i = 0; i < step.positionIterations; ++i)\n\t{\n\t\tbool contactsOkay = contactSolver.SolvePositionConstraints();\n\n\t\tbool jointsOkay = true;\n\t\tfor (int32 j = 0; j < m_jointCount; ++j)\n\t\t{\n\t\t\tbool jointOkay = m_joints[j]->SolvePositionConstraints(solverData);\n\t\t\tjointsOkay = jointsOkay && jointOkay;\n\t\t}\n\n\t\tif (contactsOkay && jointsOkay)\n\t\t{\n\t\t\t// Exit early if the position errors are small.\n\t\t\tpositionSolved = true;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Copy state buffers back to the bodies\n\tfor (int32 i = 0; i < m_bodyCount; ++i)\n\t{\n\t\tb2Body* body = m_bodies[i];\n\t\tbody->m_sweep.c = m_positions[i].c;\n\t\tbody->m_sweep.a = m_positions[i].a;\n\t\tbody->m_linearVelocity = m_velocities[i].v;\n\t\tbody->m_angularVelocity = m_velocities[i].w;\n\t\tbody->SynchronizeTransform();\n\t}\n\n\tprofile->solvePosition = timer.GetMilliseconds();\n\n\tReport(contactSolver.m_velocityConstraints);\n\n\tif (allowSleep)\n\t{\n\t\tfloat minSleepTime = b2_maxFloat;\n\n\t\tconst float linTolSqr = b2_linearSleepTolerance * b2_linearSleepTolerance;\n\t\tconst float angTolSqr = b2_angularSleepTolerance * b2_angularSleepTolerance;\n\n\t\tfor (int32 i = 0; i < m_bodyCount; ++i)\n\t\t{\n\t\t\tb2Body* b = m_bodies[i];\n\t\t\tif (b->GetType() == b2_staticBody)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ((b->m_flags & b2Body::e_autoSleepFlag) == 0 ||\n\t\t\t\tb->m_angularVelocity * b->m_angularVelocity > angTolSqr ||\n\t\t\t\tb2Dot(b->m_linearVelocity, b->m_linearVelocity) > linTolSqr)\n\t\t\t{\n\t\t\t\tb->m_sleepTime = 0.0f;\n\t\t\t\tminSleepTime = 0.0f;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tb->m_sleepTime += h;\n\t\t\t\tminSleepTime = b2Min(minSleepTime, b->m_sleepTime);\n\t\t\t}\n\t\t}\n\n\t\tif (minSleepTime >= b2_timeToSleep && positionSolved)\n\t\t{\n\t\t\tfor (int32 i = 0; i < m_bodyCount; ++i)\n\t\t\t{\n\t\t\t\tb2Body* b = m_bodies[i];\n\t\t\t\tb->SetAwake(false);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid b2Island::SolveTOI(const b2TimeStep& subStep, int32 toiIndexA, int32 toiIndexB)\n{\n\tb2Assert(toiIndexA < m_bodyCount);\n\tb2Assert(toiIndexB < m_bodyCount);\n\n\t// Initialize the body state.\n\tfor (int32 i = 0; i < m_bodyCount; ++i)\n\t{\n\t\tb2Body* b = m_bodies[i];\n\t\tm_positions[i].c = b->m_sweep.c;\n\t\tm_positions[i].a = b->m_sweep.a;\n\t\tm_velocities[i].v = b->m_linearVelocity;\n\t\tm_velocities[i].w = b->m_angularVelocity;\n\t}\n\n\tb2ContactSolverDef contactSolverDef;\n\tcontactSolverDef.contacts = m_contacts;\n\tcontactSolverDef.count = m_contactCount;\n\tcontactSolverDef.allocator = m_allocator;\n\tcontactSolverDef.step = subStep;\n\tcontactSolverDef.positions = m_positions;\n\tcontactSolverDef.velocities = m_velocities;\n\tb2ContactSolver contactSolver(&contactSolverDef);\n\n\t// Solve position constraints.\n\tfor (int32 i = 0; i < subStep.positionIterations; ++i)\n\t{\n\t\tbool contactsOkay = contactSolver.SolveTOIPositionConstraints(toiIndexA, toiIndexB);\n\t\tif (contactsOkay)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\n#if 0\n\t// Is the new position really safe?\n\tfor (int32 i = 0; i < m_contactCount; ++i)\n\t{\n\t\tb2Contact* c = m_contacts[i];\n\t\tb2Fixture* fA = c->GetFixtureA();\n\t\tb2Fixture* fB = c->GetFixtureB();\n\n\t\tb2Body* bA = fA->GetBody();\n\t\tb2Body* bB = fB->GetBody();\n\n\t\tint32 indexA = c->GetChildIndexA();\n\t\tint32 indexB = c->GetChildIndexB();\n\n\t\tb2DistanceInput input;\n\t\tinput.proxyA.Set(fA->GetShape(), indexA);\n\t\tinput.proxyB.Set(fB->GetShape(), indexB);\n\t\tinput.transformA = bA->GetTransform();\n\t\tinput.transformB = bB->GetTransform();\n\t\tinput.useRadii = false;\n\n\t\tb2DistanceOutput output;\n\t\tb2SimplexCache cache;\n\t\tcache.count = 0;\n\t\tb2Distance(&output, &cache, &input);\n\n\t\tif (output.distance == 0 || cache.count == 3)\n\t\t{\n\t\t\tcache.count += 0;\n\t\t}\n\t}\n#endif\n\n\t// Leap of faith to new safe state.\n\tm_bodies[toiIndexA]->m_sweep.c0 = m_positions[toiIndexA].c;\n\tm_bodies[toiIndexA]->m_sweep.a0 = m_positions[toiIndexA].a;\n\tm_bodies[toiIndexB]->m_sweep.c0 = m_positions[toiIndexB].c;\n\tm_bodies[toiIndexB]->m_sweep.a0 = m_positions[toiIndexB].a;\n\n\t// No warm starting is needed for TOI events because warm\n\t// starting impulses were applied in the discrete solver.\n\tcontactSolver.InitializeVelocityConstraints();\n\n\t// Solve velocity constraints.\n\tfor (int32 i = 0; i < subStep.velocityIterations; ++i)\n\t{\n\t\tcontactSolver.SolveVelocityConstraints();\n\t}\n\n\t// Don't store the TOI contact forces for warm starting\n\t// because they can be quite large.\n\n\tfloat h = subStep.dt;\n\n\t// Integrate positions\n\tfor (int32 i = 0; i < m_bodyCount; ++i)\n\t{\n\t\tb2Vec2 c = m_positions[i].c;\n\t\tfloat a = m_positions[i].a;\n\t\tb2Vec2 v = m_velocities[i].v;\n\t\tfloat w = m_velocities[i].w;\n\n\t\t// Check for large velocities\n\t\tb2Vec2 translation = h * v;\n\t\tif (b2Dot(translation, translation) > b2_maxTranslationSquared)\n\t\t{\n\t\t\tfloat ratio = b2_maxTranslation / translation.Length();\n\t\t\tv *= ratio;\n\t\t}\n\n\t\tfloat rotation = h * w;\n\t\tif (rotation * rotation > b2_maxRotationSquared)\n\t\t{\n\t\t\tfloat ratio = b2_maxRotation / b2Abs(rotation);\n\t\t\tw *= ratio;\n\t\t}\n\n\t\t// Integrate\n\t\tc += h * v;\n\t\ta += h * w;\n\n\t\tm_positions[i].c = c;\n\t\tm_positions[i].a = a;\n\t\tm_velocities[i].v = v;\n\t\tm_velocities[i].w = w;\n\n\t\t// Sync bodies\n\t\tb2Body* body = m_bodies[i];\n\t\tbody->m_sweep.c = c;\n\t\tbody->m_sweep.a = a;\n\t\tbody->m_linearVelocity = v;\n\t\tbody->m_angularVelocity = w;\n\t\tbody->SynchronizeTransform();\n\t}\n\n\tReport(contactSolver.m_velocityConstraints);\n}\n\nvoid b2Island::Report(const b2ContactVelocityConstraint* constraints)\n{\n\tif (m_listener == nullptr)\n\t{\n\t\treturn;\n\t}\n\n\tfor (int32 i = 0; i < m_contactCount; ++i)\n\t{\n\t\tb2Contact* c = m_contacts[i];\n\n\t\tconst b2ContactVelocityConstraint* vc = constraints + i;\n\t\t\n\t\tb2ContactImpulse impulse;\n\t\timpulse.count = vc->pointCount;\n\t\tfor (int32 j = 0; j < vc->pointCount; ++j)\n\t\t{\n\t\t\timpulse.normalImpulses[j] = vc->points[j].normalImpulse;\n\t\t\timpulse.tangentImpulses[j] = vc->points[j].tangentImpulse;\n\t\t}\n\n\t\tm_listener->PostSolve(c, &impulse);\n\t}\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_island.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_ISLAND_H\n#define B2_ISLAND_H\n\n#include \"box2d/b2_body.h\"\n#include \"box2d/b2_math.h\"\n#include \"box2d/b2_time_step.h\"\n\nclass b2Contact;\nclass b2Joint;\nclass b2StackAllocator;\nclass b2ContactListener;\nstruct b2ContactVelocityConstraint;\nstruct b2Profile;\n\n/// This is an internal class.\nclass b2Island\n{\npublic:\n\tb2Island(int32 bodyCapacity, int32 contactCapacity, int32 jointCapacity,\n\t\t\tb2StackAllocator* allocator, b2ContactListener* listener);\n\t~b2Island();\n\n\tvoid Clear()\n\t{\n\t\tm_bodyCount = 0;\n\t\tm_contactCount = 0;\n\t\tm_jointCount = 0;\n\t}\n\n\tvoid Solve(b2Profile* profile, const b2TimeStep& step, const b2Vec2& gravity, bool allowSleep);\n\n\tvoid SolveTOI(const b2TimeStep& subStep, int32 toiIndexA, int32 toiIndexB);\n\n\tvoid Add(b2Body* body)\n\t{\n\t\tb2Assert(m_bodyCount < m_bodyCapacity);\n\t\tbody->m_islandIndex = m_bodyCount;\n\t\tm_bodies[m_bodyCount] = body;\n\t\t++m_bodyCount;\n\t}\n\n\tvoid Add(b2Contact* contact)\n\t{\n\t\tb2Assert(m_contactCount < m_contactCapacity);\n\t\tm_contacts[m_contactCount++] = contact;\n\t}\n\n\tvoid Add(b2Joint* joint)\n\t{\n\t\tb2Assert(m_jointCount < m_jointCapacity);\n\t\tm_joints[m_jointCount++] = joint;\n\t}\n\n\tvoid Report(const b2ContactVelocityConstraint* constraints);\n\n\tb2StackAllocator* m_allocator;\n\tb2ContactListener* m_listener;\n\n\tb2Body** m_bodies;\n\tb2Contact** m_contacts;\n\tb2Joint** m_joints;\n\n\tb2Position* m_positions;\n\tb2Velocity* m_velocities;\n\n\tint32 m_bodyCount;\n\tint32 m_jointCount;\n\tint32 m_contactCount;\n\n\tint32 m_bodyCapacity;\n\tint32 m_contactCapacity;\n\tint32 m_jointCapacity;\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_joint.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_block_allocator.h\"\n#include \"box2d/b2_body.h\"\n#include \"box2d/b2_distance_joint.h\"\n#include \"box2d/b2_draw.h\"\n#include \"box2d/b2_friction_joint.h\"\n#include \"box2d/b2_gear_joint.h\"\n#include \"box2d/b2_motor_joint.h\"\n#include \"box2d/b2_mouse_joint.h\"\n#include \"box2d/b2_prismatic_joint.h\"\n#include \"box2d/b2_pulley_joint.h\"\n#include \"box2d/b2_revolute_joint.h\"\n#include \"box2d/b2_weld_joint.h\"\n#include \"box2d/b2_wheel_joint.h\"\n#include \"box2d/b2_world.h\"\n\n#include <new>\n\nvoid b2LinearStiffness(float& stiffness, float& damping,\n\tfloat frequencyHertz, float dampingRatio,\n\tconst b2Body* bodyA, const b2Body* bodyB)\n{\n\tfloat massA = bodyA->GetMass();\n\tfloat massB = bodyB->GetMass();\n\tfloat mass;\n\tif (massA > 0.0f && massB > 0.0f)\n\t{\n\t\tmass = massA * massB / (massA + massB);\n\t}\n\telse if (massA > 0.0f)\n\t{\n\t\tmass = massA;\n\t}\n\telse\n\t{\n\t\tmass = massB;\n\t}\n\n\tfloat omega = 2.0f * b2_pi * frequencyHertz;\n\tstiffness = mass * omega * omega;\n\tdamping = 2.0f * mass * dampingRatio * omega;\n}\n\nvoid b2AngularStiffness(float& stiffness, float& damping,\n\tfloat frequencyHertz, float dampingRatio,\n\tconst b2Body* bodyA, const b2Body* bodyB)\n{\n\tfloat IA = bodyA->GetInertia();\n\tfloat IB = bodyB->GetInertia();\n\tfloat I;\n\tif (IA > 0.0f && IB > 0.0f)\n\t{\n\t\tI = IA * IB / (IA + IB);\n\t}\n\telse if (IA > 0.0f)\n\t{\n\t\tI = IA;\n\t}\n\telse\n\t{\n\t\tI = IB;\n\t}\n\n\tfloat omega = 2.0f * b2_pi * frequencyHertz;\n\tstiffness = I * omega * omega;\n\tdamping = 2.0f * I * dampingRatio * omega;\n}\n\nb2Joint* b2Joint::Create(const b2JointDef* def, b2BlockAllocator* allocator)\n{\n\tb2Joint* joint = nullptr;\n\n\tswitch (def->type)\n\t{\n\tcase e_distanceJoint:\n\t\t{\n\t\t\tvoid* mem = allocator->Allocate(sizeof(b2DistanceJoint));\n\t\t\tjoint = new (mem) b2DistanceJoint(static_cast<const b2DistanceJointDef*>(def));\n\t\t}\n\t\tbreak;\n\n\tcase e_mouseJoint:\n\t\t{\n\t\t\tvoid* mem = allocator->Allocate(sizeof(b2MouseJoint));\n\t\t\tjoint = new (mem) b2MouseJoint(static_cast<const b2MouseJointDef*>(def));\n\t\t}\n\t\tbreak;\n\n\tcase e_prismaticJoint:\n\t\t{\n\t\t\tvoid* mem = allocator->Allocate(sizeof(b2PrismaticJoint));\n\t\t\tjoint = new (mem) b2PrismaticJoint(static_cast<const b2PrismaticJointDef*>(def));\n\t\t}\n\t\tbreak;\n\n\tcase e_revoluteJoint:\n\t\t{\n\t\t\tvoid* mem = allocator->Allocate(sizeof(b2RevoluteJoint));\n\t\t\tjoint = new (mem) b2RevoluteJoint(static_cast<const b2RevoluteJointDef*>(def));\n\t\t}\n\t\tbreak;\n\n\tcase e_pulleyJoint:\n\t\t{\n\t\t\tvoid* mem = allocator->Allocate(sizeof(b2PulleyJoint));\n\t\t\tjoint = new (mem) b2PulleyJoint(static_cast<const b2PulleyJointDef*>(def));\n\t\t}\n\t\tbreak;\n\n\tcase e_gearJoint:\n\t\t{\n\t\t\tvoid* mem = allocator->Allocate(sizeof(b2GearJoint));\n\t\t\tjoint = new (mem) b2GearJoint(static_cast<const b2GearJointDef*>(def));\n\t\t}\n\t\tbreak;\n\n\tcase e_wheelJoint:\n\t\t{\n\t\t\tvoid* mem = allocator->Allocate(sizeof(b2WheelJoint));\n\t\t\tjoint = new (mem) b2WheelJoint(static_cast<const b2WheelJointDef*>(def));\n\t\t}\n\t\tbreak;\n\n\tcase e_weldJoint:\n\t\t{\n\t\t\tvoid* mem = allocator->Allocate(sizeof(b2WeldJoint));\n\t\t\tjoint = new (mem) b2WeldJoint(static_cast<const b2WeldJointDef*>(def));\n\t\t}\n\t\tbreak;\n        \n\tcase e_frictionJoint:\n\t\t{\n\t\t\tvoid* mem = allocator->Allocate(sizeof(b2FrictionJoint));\n\t\t\tjoint = new (mem) b2FrictionJoint(static_cast<const b2FrictionJointDef*>(def));\n\t\t}\n\t\tbreak;\n\n\tcase e_motorJoint:\n\t\t{\n\t\t\tvoid* mem = allocator->Allocate(sizeof(b2MotorJoint));\n\t\t\tjoint = new (mem) b2MotorJoint(static_cast<const b2MotorJointDef*>(def));\n\t\t}\n\t\tbreak;\n\n\tdefault:\n\t\tb2Assert(false);\n\t\tbreak;\n\t}\n\n\treturn joint;\n}\n\nvoid b2Joint::Destroy(b2Joint* joint, b2BlockAllocator* allocator)\n{\n\tjoint->~b2Joint();\n\tswitch (joint->m_type)\n\t{\n\tcase e_distanceJoint:\n\t\tallocator->Free(joint, sizeof(b2DistanceJoint));\n\t\tbreak;\n\n\tcase e_mouseJoint:\n\t\tallocator->Free(joint, sizeof(b2MouseJoint));\n\t\tbreak;\n\n\tcase e_prismaticJoint:\n\t\tallocator->Free(joint, sizeof(b2PrismaticJoint));\n\t\tbreak;\n\n\tcase e_revoluteJoint:\n\t\tallocator->Free(joint, sizeof(b2RevoluteJoint));\n\t\tbreak;\n\n\tcase e_pulleyJoint:\n\t\tallocator->Free(joint, sizeof(b2PulleyJoint));\n\t\tbreak;\n\n\tcase e_gearJoint:\n\t\tallocator->Free(joint, sizeof(b2GearJoint));\n\t\tbreak;\n\n\tcase e_wheelJoint:\n\t\tallocator->Free(joint, sizeof(b2WheelJoint));\n\t\tbreak;\n    \n\tcase e_weldJoint:\n\t\tallocator->Free(joint, sizeof(b2WeldJoint));\n\t\tbreak;\n\n\tcase e_frictionJoint:\n\t\tallocator->Free(joint, sizeof(b2FrictionJoint));\n\t\tbreak;\n\n\tcase e_motorJoint:\n\t\tallocator->Free(joint, sizeof(b2MotorJoint));\n\t\tbreak;\n\n\tdefault:\n\t\tb2Assert(false);\n\t\tbreak;\n\t}\n}\n\nb2Joint::b2Joint(const b2JointDef* def)\n{\n\tb2Assert(def->bodyA != def->bodyB);\n\n\tm_type = def->type;\n\tm_prev = nullptr;\n\tm_next = nullptr;\n\tm_bodyA = def->bodyA;\n\tm_bodyB = def->bodyB;\n\tm_index = 0;\n\tm_collideConnected = def->collideConnected;\n\tm_islandFlag = false;\n\tm_userData = def->userData;\n\n\tm_edgeA.joint = nullptr;\n\tm_edgeA.other = nullptr;\n\tm_edgeA.prev = nullptr;\n\tm_edgeA.next = nullptr;\n\n\tm_edgeB.joint = nullptr;\n\tm_edgeB.other = nullptr;\n\tm_edgeB.prev = nullptr;\n\tm_edgeB.next = nullptr;\n}\n\nbool b2Joint::IsEnabled() const\n{\n\treturn m_bodyA->IsEnabled() && m_bodyB->IsEnabled();\n}\n\nvoid b2Joint::Draw(b2Draw* draw) const\n{\n\tconst b2Transform& xf1 = m_bodyA->GetTransform();\n\tconst b2Transform& xf2 = m_bodyB->GetTransform();\n\tb2Vec2 x1 = xf1.p;\n\tb2Vec2 x2 = xf2.p;\n\tb2Vec2 p1 = GetAnchorA();\n\tb2Vec2 p2 = GetAnchorB();\n\n\tb2Color color(0.5f, 0.8f, 0.8f);\n\n\tswitch (m_type)\n\t{\n\tcase e_distanceJoint:\n\t\tdraw->DrawSegment(p1, p2, color);\n\t\tbreak;\n\n\tcase e_pulleyJoint:\n\t{\n\t\tb2PulleyJoint* pulley = (b2PulleyJoint*)this;\n\t\tb2Vec2 s1 = pulley->GetGroundAnchorA();\n\t\tb2Vec2 s2 = pulley->GetGroundAnchorB();\n\t\tdraw->DrawSegment(s1, p1, color);\n\t\tdraw->DrawSegment(s2, p2, color);\n\t\tdraw->DrawSegment(s1, s2, color);\n\t}\n\tbreak;\n\n\tcase e_mouseJoint:\n\t{\n\t\tb2Color c;\n\t\tc.Set(0.0f, 1.0f, 0.0f);\n\t\tdraw->DrawPoint(p1, 4.0f, c);\n\t\tdraw->DrawPoint(p2, 4.0f, c);\n\n\t\tc.Set(0.8f, 0.8f, 0.8f);\n\t\tdraw->DrawSegment(p1, p2, c);\n\n\t}\n\tbreak;\n\n\tdefault:\n\t\tdraw->DrawSegment(x1, p1, color);\n\t\tdraw->DrawSegment(p1, p2, color);\n\t\tdraw->DrawSegment(x2, p2, color);\n\t}\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_motor_joint.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_body.h\"\n#include \"box2d/b2_motor_joint.h\"\n#include \"box2d/b2_time_step.h\"\n\n// Point-to-point constraint\n// Cdot = v2 - v1\n//      = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n// J = [-I -r1_skew I r2_skew ]\n// Identity used:\n// w k % (rx i + ry j) = w * (-ry i + rx j)\n//\n// r1 = offset - c1\n// r2 = -c2\n\n// Angle constraint\n// Cdot = w2 - w1\n// J = [0 0 -1 0 0 1]\n// K = invI1 + invI2\n\nvoid b2MotorJointDef::Initialize(b2Body* bA, b2Body* bB)\n{\n\tbodyA = bA;\n\tbodyB = bB;\n\tb2Vec2 xB = bodyB->GetPosition();\n\tlinearOffset = bodyA->GetLocalPoint(xB);\n\n\tfloat angleA = bodyA->GetAngle();\n\tfloat angleB = bodyB->GetAngle();\n\tangularOffset = angleB - angleA;\n}\n\nb2MotorJoint::b2MotorJoint(const b2MotorJointDef* def)\n: b2Joint(def)\n{\n\tm_linearOffset = def->linearOffset;\n\tm_angularOffset = def->angularOffset;\n\n\tm_linearImpulse.SetZero();\n\tm_angularImpulse = 0.0f;\n\n\tm_maxForce = def->maxForce;\n\tm_maxTorque = def->maxTorque;\n\tm_correctionFactor = def->correctionFactor;\n}\n\nvoid b2MotorJoint::InitVelocityConstraints(const b2SolverData& data)\n{\n\tm_indexA = m_bodyA->m_islandIndex;\n\tm_indexB = m_bodyB->m_islandIndex;\n\tm_localCenterA = m_bodyA->m_sweep.localCenter;\n\tm_localCenterB = m_bodyB->m_sweep.localCenter;\n\tm_invMassA = m_bodyA->m_invMass;\n\tm_invMassB = m_bodyB->m_invMass;\n\tm_invIA = m_bodyA->m_invI;\n\tm_invIB = m_bodyB->m_invI;\n\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat aA = data.positions[m_indexA].a;\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat wA = data.velocities[m_indexA].w;\n\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat aB = data.positions[m_indexB].a;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat wB = data.velocities[m_indexB].w;\n\n\tb2Rot qA(aA), qB(aB);\n\n\t// Compute the effective mass matrix.\n\tm_rA = b2Mul(qA, m_linearOffset - m_localCenterA);\n\tm_rB = b2Mul(qB, -m_localCenterB);\n\n\t// J = [-I -r1_skew I r2_skew]\n\t// r_skew = [-ry; rx]\n\n\t// Matlab\n\t// K = [ mA+r1y^2*iA+mB+r2y^2*iB,  -r1y*iA*r1x-r2y*iB*r2x,          -r1y*iA-r2y*iB]\n\t//     [  -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB,           r1x*iA+r2x*iB]\n\t//     [          -r1y*iA-r2y*iB,           r1x*iA+r2x*iB,                   iA+iB]\n\n\tfloat mA = m_invMassA, mB = m_invMassB;\n\tfloat iA = m_invIA, iB = m_invIB;\n\n\t// Upper 2 by 2 of K for point to point\n\tb2Mat22 K;\n\tK.ex.x = mA + mB + iA * m_rA.y * m_rA.y + iB * m_rB.y * m_rB.y;\n\tK.ex.y = -iA * m_rA.x * m_rA.y - iB * m_rB.x * m_rB.y;\n\tK.ey.x = K.ex.y;\n\tK.ey.y = mA + mB + iA * m_rA.x * m_rA.x + iB * m_rB.x * m_rB.x;\n\n\tm_linearMass = K.GetInverse();\n\n\tm_angularMass = iA + iB;\n\tif (m_angularMass > 0.0f)\n\t{\n\t\tm_angularMass = 1.0f / m_angularMass;\n\t}\n\n\tm_linearError = cB + m_rB - cA - m_rA;\n\tm_angularError = aB - aA - m_angularOffset;\n\n\tif (data.step.warmStarting)\n\t{\n\t\t// Scale impulses to support a variable time step.\n\t\tm_linearImpulse *= data.step.dtRatio;\n\t\tm_angularImpulse *= data.step.dtRatio;\n\n\t\tb2Vec2 P(m_linearImpulse.x, m_linearImpulse.y);\n\t\tvA -= mA * P;\n\t\twA -= iA * (b2Cross(m_rA, P) + m_angularImpulse);\n\t\tvB += mB * P;\n\t\twB += iB * (b2Cross(m_rB, P) + m_angularImpulse);\n\t}\n\telse\n\t{\n\t\tm_linearImpulse.SetZero();\n\t\tm_angularImpulse = 0.0f;\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nvoid b2MotorJoint::SolveVelocityConstraints(const b2SolverData& data)\n{\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat wA = data.velocities[m_indexA].w;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat wB = data.velocities[m_indexB].w;\n\n\tfloat mA = m_invMassA, mB = m_invMassB;\n\tfloat iA = m_invIA, iB = m_invIB;\n\n\tfloat h = data.step.dt;\n\tfloat inv_h = data.step.inv_dt;\n\n\t// Solve angular friction\n\t{\n\t\tfloat Cdot = wB - wA + inv_h * m_correctionFactor * m_angularError;\n\t\tfloat impulse = -m_angularMass * Cdot;\n\n\t\tfloat oldImpulse = m_angularImpulse;\n\t\tfloat maxImpulse = h * m_maxTorque;\n\t\tm_angularImpulse = b2Clamp(m_angularImpulse + impulse, -maxImpulse, maxImpulse);\n\t\timpulse = m_angularImpulse - oldImpulse;\n\n\t\twA -= iA * impulse;\n\t\twB += iB * impulse;\n\t}\n\n\t// Solve linear friction\n\t{\n\t\tb2Vec2 Cdot = vB + b2Cross(wB, m_rB) - vA - b2Cross(wA, m_rA) + inv_h * m_correctionFactor * m_linearError;\n\n\t\tb2Vec2 impulse = -b2Mul(m_linearMass, Cdot);\n\t\tb2Vec2 oldImpulse = m_linearImpulse;\n\t\tm_linearImpulse += impulse;\n\n\t\tfloat maxImpulse = h * m_maxForce;\n\n\t\tif (m_linearImpulse.LengthSquared() > maxImpulse * maxImpulse)\n\t\t{\n\t\t\tm_linearImpulse.Normalize();\n\t\t\tm_linearImpulse *= maxImpulse;\n\t\t}\n\n\t\timpulse = m_linearImpulse - oldImpulse;\n\n\t\tvA -= mA * impulse;\n\t\twA -= iA * b2Cross(m_rA, impulse);\n\n\t\tvB += mB * impulse;\n\t\twB += iB * b2Cross(m_rB, impulse);\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nbool b2MotorJoint::SolvePositionConstraints(const b2SolverData& data)\n{\n\tB2_NOT_USED(data);\n\n\treturn true;\n}\n\nb2Vec2 b2MotorJoint::GetAnchorA() const\n{\n\treturn m_bodyA->GetPosition();\n}\n\nb2Vec2 b2MotorJoint::GetAnchorB() const\n{\n\treturn m_bodyB->GetPosition();\n}\n\nb2Vec2 b2MotorJoint::GetReactionForce(float inv_dt) const\n{\n\treturn inv_dt * m_linearImpulse;\n}\n\nfloat b2MotorJoint::GetReactionTorque(float inv_dt) const\n{\n\treturn inv_dt * m_angularImpulse;\n}\n\nvoid b2MotorJoint::SetMaxForce(float force)\n{\n\tb2Assert(b2IsValid(force) && force >= 0.0f);\n\tm_maxForce = force;\n}\n\nfloat b2MotorJoint::GetMaxForce() const\n{\n\treturn m_maxForce;\n}\n\nvoid b2MotorJoint::SetMaxTorque(float torque)\n{\n\tb2Assert(b2IsValid(torque) && torque >= 0.0f);\n\tm_maxTorque = torque;\n}\n\nfloat b2MotorJoint::GetMaxTorque() const\n{\n\treturn m_maxTorque;\n}\n\nvoid b2MotorJoint::SetCorrectionFactor(float factor)\n{\n\tb2Assert(b2IsValid(factor) && 0.0f <= factor && factor <= 1.0f);\n\tm_correctionFactor = factor;\n}\n\nfloat b2MotorJoint::GetCorrectionFactor() const\n{\n\treturn m_correctionFactor;\n}\n\nvoid b2MotorJoint::SetLinearOffset(const b2Vec2& linearOffset)\n{\n\tif (linearOffset.x != m_linearOffset.x || linearOffset.y != m_linearOffset.y)\n\t{\n\t\tm_bodyA->SetAwake(true);\n\t\tm_bodyB->SetAwake(true);\n\t\tm_linearOffset = linearOffset;\n\t}\n}\n\nconst b2Vec2& b2MotorJoint::GetLinearOffset() const\n{\n\treturn m_linearOffset;\n}\n\nvoid b2MotorJoint::SetAngularOffset(float angularOffset)\n{\n\tif (angularOffset != m_angularOffset)\n\t{\n\t\tm_bodyA->SetAwake(true);\n\t\tm_bodyB->SetAwake(true);\n\t\tm_angularOffset = angularOffset;\n\t}\n}\n\nfloat b2MotorJoint::GetAngularOffset() const\n{\n\treturn m_angularOffset;\n}\n\nvoid b2MotorJoint::Dump()\n{\n\tint32 indexA = m_bodyA->m_islandIndex;\n\tint32 indexB = m_bodyB->m_islandIndex;\n\n\tb2Dump(\"  b2MotorJointDef jd;\\n\");\n\tb2Dump(\"  jd.bodyA = bodies[%d];\\n\", indexA);\n\tb2Dump(\"  jd.bodyB = bodies[%d];\\n\", indexB);\n\tb2Dump(\"  jd.collideConnected = bool(%d);\\n\", m_collideConnected);\n\tb2Dump(\"  jd.linearOffset.Set(%.9g, %.9g);\\n\", m_linearOffset.x, m_linearOffset.y);\n\tb2Dump(\"  jd.angularOffset = %.9g;\\n\", m_angularOffset);\n\tb2Dump(\"  jd.maxForce = %.9g;\\n\", m_maxForce);\n\tb2Dump(\"  jd.maxTorque = %.9g;\\n\", m_maxTorque);\n\tb2Dump(\"  jd.correctionFactor = %.9g;\\n\", m_correctionFactor);\n\tb2Dump(\"  joints[%d] = m_world->CreateJoint(&jd);\\n\", m_index);\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_mouse_joint.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_body.h\"\n#include \"box2d/b2_mouse_joint.h\"\n#include \"box2d/b2_time_step.h\"\n\n// p = attached point, m = mouse point\n// C = p - m\n// Cdot = v\n//      = v + cross(w, r)\n// J = [I r_skew]\n// Identity used:\n// w k % (rx i + ry j) = w * (-ry i + rx j)\n\nb2MouseJoint::b2MouseJoint(const b2MouseJointDef* def)\n: b2Joint(def)\n{\n\tm_targetA = def->target;\n\tm_localAnchorB = b2MulT(m_bodyB->GetTransform(), m_targetA);\n\tm_maxForce = def->maxForce;\n\tm_stiffness = def->stiffness;\n\tm_damping = def->damping;\n\n\tm_impulse.SetZero();\n\tm_beta = 0.0f;\n\tm_gamma = 0.0f;\n}\n\nvoid b2MouseJoint::SetTarget(const b2Vec2& target)\n{\n\tif (target != m_targetA)\n\t{\n\t\tm_bodyB->SetAwake(true);\n\t\tm_targetA = target;\n\t}\n}\n\nconst b2Vec2& b2MouseJoint::GetTarget() const\n{\n\treturn m_targetA;\n}\n\nvoid b2MouseJoint::SetMaxForce(float force)\n{\n\tm_maxForce = force;\n}\n\nfloat b2MouseJoint::GetMaxForce() const\n{\n\treturn m_maxForce;\n}\n\nvoid b2MouseJoint::InitVelocityConstraints(const b2SolverData& data)\n{\n\tm_indexB = m_bodyB->m_islandIndex;\n\tm_localCenterB = m_bodyB->m_sweep.localCenter;\n\tm_invMassB = m_bodyB->m_invMass;\n\tm_invIB = m_bodyB->m_invI;\n\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat aB = data.positions[m_indexB].a;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat wB = data.velocities[m_indexB].w;\n\n\tb2Rot qB(aB);\n\n\tfloat mass = m_bodyB->GetMass();\n\n\tfloat d = m_damping;\n\tfloat k = m_stiffness;\n\n\t// magic formulas\n\t// gamma has units of inverse mass.\n\t// beta has units of inverse time.\n\tfloat h = data.step.dt;\n\tm_gamma = h * (d + h * k);\n\tif (m_gamma != 0.0f)\n\t{\n\t\tm_gamma = 1.0f / m_gamma;\n\t}\n\tm_beta = h * k * m_gamma;\n\n\t// Compute the effective mass matrix.\n\tm_rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\n\t// K    = [(1/m1 + 1/m2) * eye(2) - skew(r1) * invI1 * skew(r1) - skew(r2) * invI2 * skew(r2)]\n\t//      = [1/m1+1/m2     0    ] + invI1 * [r1.y*r1.y -r1.x*r1.y] + invI2 * [r1.y*r1.y -r1.x*r1.y]\n\t//        [    0     1/m1+1/m2]           [-r1.x*r1.y r1.x*r1.x]           [-r1.x*r1.y r1.x*r1.x]\n\tb2Mat22 K;\n\tK.ex.x = m_invMassB + m_invIB * m_rB.y * m_rB.y + m_gamma;\n\tK.ex.y = -m_invIB * m_rB.x * m_rB.y;\n\tK.ey.x = K.ex.y;\n\tK.ey.y = m_invMassB + m_invIB * m_rB.x * m_rB.x + m_gamma;\n\n\tm_mass = K.GetInverse();\n\n\tm_C = cB + m_rB - m_targetA;\n\tm_C *= m_beta;\n\n\t// Cheat with some damping\n\twB *= 0.98f;\n\n\tif (data.step.warmStarting)\n\t{\n\t\tm_impulse *= data.step.dtRatio;\n\t\tvB += m_invMassB * m_impulse;\n\t\twB += m_invIB * b2Cross(m_rB, m_impulse);\n\t}\n\telse\n\t{\n\t\tm_impulse.SetZero();\n\t}\n\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nvoid b2MouseJoint::SolveVelocityConstraints(const b2SolverData& data)\n{\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat wB = data.velocities[m_indexB].w;\n\n\t// Cdot = v + cross(w, r)\n\tb2Vec2 Cdot = vB + b2Cross(wB, m_rB);\n\tb2Vec2 impulse = b2Mul(m_mass, -(Cdot + m_C + m_gamma * m_impulse));\n\n\tb2Vec2 oldImpulse = m_impulse;\n\tm_impulse += impulse;\n\tfloat maxImpulse = data.step.dt * m_maxForce;\n\tif (m_impulse.LengthSquared() > maxImpulse * maxImpulse)\n\t{\n\t\tm_impulse *= maxImpulse / m_impulse.Length();\n\t}\n\timpulse = m_impulse - oldImpulse;\n\n\tvB += m_invMassB * impulse;\n\twB += m_invIB * b2Cross(m_rB, impulse);\n\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nbool b2MouseJoint::SolvePositionConstraints(const b2SolverData& data)\n{\n\tB2_NOT_USED(data);\n\treturn true;\n}\n\nb2Vec2 b2MouseJoint::GetAnchorA() const\n{\n\treturn m_targetA;\n}\n\nb2Vec2 b2MouseJoint::GetAnchorB() const\n{\n\treturn m_bodyB->GetWorldPoint(m_localAnchorB);\n}\n\nb2Vec2 b2MouseJoint::GetReactionForce(float inv_dt) const\n{\n\treturn inv_dt * m_impulse;\n}\n\nfloat b2MouseJoint::GetReactionTorque(float inv_dt) const\n{\n\treturn inv_dt * 0.0f;\n}\n\nvoid b2MouseJoint::ShiftOrigin(const b2Vec2& newOrigin)\n{\n\tm_targetA -= newOrigin;\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_polygon_circle_contact.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"b2_polygon_circle_contact.h\"\n\n#include \"box2d/b2_block_allocator.h\"\n#include \"box2d/b2_fixture.h\"\n\n#include <new>\n\nb2Contact* b2PolygonAndCircleContact::Create(b2Fixture* fixtureA, int32, b2Fixture* fixtureB, int32, b2BlockAllocator* allocator)\n{\n\tvoid* mem = allocator->Allocate(sizeof(b2PolygonAndCircleContact));\n\treturn new (mem) b2PolygonAndCircleContact(fixtureA, fixtureB);\n}\n\nvoid b2PolygonAndCircleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator)\n{\n\t((b2PolygonAndCircleContact*)contact)->~b2PolygonAndCircleContact();\n\tallocator->Free(contact, sizeof(b2PolygonAndCircleContact));\n}\n\nb2PolygonAndCircleContact::b2PolygonAndCircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB)\n: b2Contact(fixtureA, 0, fixtureB, 0)\n{\n\tb2Assert(m_fixtureA->GetType() == b2Shape::e_polygon);\n\tb2Assert(m_fixtureB->GetType() == b2Shape::e_circle);\n}\n\nvoid b2PolygonAndCircleContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB)\n{\n\tb2CollidePolygonAndCircle(\tmanifold,\n\t\t\t\t\t\t\t\t(b2PolygonShape*)m_fixtureA->GetShape(), xfA,\n\t\t\t\t\t\t\t\t(b2CircleShape*)m_fixtureB->GetShape(), xfB);\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_polygon_circle_contact.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_POLYGON_AND_CIRCLE_CONTACT_H\n#define B2_POLYGON_AND_CIRCLE_CONTACT_H\n\n#include \"box2d/b2_contact.h\"\n\nclass b2BlockAllocator;\n\nclass b2PolygonAndCircleContact : public b2Contact\n{\npublic:\n\tstatic b2Contact* Create(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator);\n\tstatic void Destroy(b2Contact* contact, b2BlockAllocator* allocator);\n\n\tb2PolygonAndCircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB);\n\t~b2PolygonAndCircleContact() {}\n\n\tvoid Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) override;\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_polygon_contact.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"b2_polygon_contact.h\"\n\n#include \"box2d/b2_block_allocator.h\"\n#include \"box2d/b2_body.h\"\n#include \"box2d/b2_fixture.h\"\n#include \"box2d/b2_time_of_impact.h\"\n#include \"box2d/b2_world_callbacks.h\"\n\n#include <new>\n\nb2Contact* b2PolygonContact::Create(b2Fixture* fixtureA, int32, b2Fixture* fixtureB, int32, b2BlockAllocator* allocator)\n{\n\tvoid* mem = allocator->Allocate(sizeof(b2PolygonContact));\n\treturn new (mem) b2PolygonContact(fixtureA, fixtureB);\n}\n\nvoid b2PolygonContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator)\n{\n\t((b2PolygonContact*)contact)->~b2PolygonContact();\n\tallocator->Free(contact, sizeof(b2PolygonContact));\n}\n\nb2PolygonContact::b2PolygonContact(b2Fixture* fixtureA, b2Fixture* fixtureB)\n\t: b2Contact(fixtureA, 0, fixtureB, 0)\n{\n\tb2Assert(m_fixtureA->GetType() == b2Shape::e_polygon);\n\tb2Assert(m_fixtureB->GetType() == b2Shape::e_polygon);\n}\n\nvoid b2PolygonContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB)\n{\n\tb2CollidePolygons(\tmanifold,\n\t\t\t\t\t\t(b2PolygonShape*)m_fixtureA->GetShape(), xfA,\n\t\t\t\t\t\t(b2PolygonShape*)m_fixtureB->GetShape(), xfB);\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_polygon_contact.h",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#ifndef B2_POLYGON_CONTACT_H\n#define B2_POLYGON_CONTACT_H\n\n#include \"box2d/b2_contact.h\"\n\nclass b2BlockAllocator;\n\nclass b2PolygonContact : public b2Contact\n{\npublic:\n\tstatic b2Contact* Create(\tb2Fixture* fixtureA, int32 indexA,\n\t\t\t\t\t\t\t\tb2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator);\n\tstatic void Destroy(b2Contact* contact, b2BlockAllocator* allocator);\n\n\tb2PolygonContact(b2Fixture* fixtureA, b2Fixture* fixtureB);\n\t~b2PolygonContact() {}\n\n\tvoid Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) override;\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_prismatic_joint.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_body.h\"\n#include \"box2d/b2_draw.h\"\n#include \"box2d/b2_prismatic_joint.h\"\n#include \"box2d/b2_time_step.h\"\n\n// Linear constraint (point-to-line)\n// d = p2 - p1 = x2 + r2 - x1 - r1\n// C = dot(perp, d)\n// Cdot = dot(d, cross(w1, perp)) + dot(perp, v2 + cross(w2, r2) - v1 - cross(w1, r1))\n//      = -dot(perp, v1) - dot(cross(d + r1, perp), w1) + dot(perp, v2) + dot(cross(r2, perp), v2)\n// J = [-perp, -cross(d + r1, perp), perp, cross(r2,perp)]\n//\n// Angular constraint\n// C = a2 - a1 + a_initial\n// Cdot = w2 - w1\n// J = [0 0 -1 0 0 1]\n//\n// K = J * invM * JT\n//\n// J = [-a -s1 a s2]\n//     [0  -1  0  1]\n// a = perp\n// s1 = cross(d + r1, a) = cross(p2 - x1, a)\n// s2 = cross(r2, a) = cross(p2 - x2, a)\n\n// Motor/Limit linear constraint\n// C = dot(ax1, d)\n// Cdot = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) + dot(cross(r2, ax1), v2)\n// J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)]\n\n// Predictive limit is applied even when the limit is not active.\n// Prevents a constraint speed that can lead to a constraint error in one time step.\n// Want C2 = C1 + h * Cdot >= 0\n// Or:\n// Cdot + C1/h >= 0\n// I do not apply a negative constraint error because that is handled in position correction.\n// So:\n// Cdot + max(C1, 0)/h >= 0\n\n// Block Solver\n// We develop a block solver that includes the angular and linear constraints. This makes the limit stiffer.\n//\n// The Jacobian has 2 rows:\n// J = [-uT -s1 uT s2] // linear\n//     [0   -1   0  1] // angular\n//\n// u = perp\n// s1 = cross(d + r1, u), s2 = cross(r2, u)\n// a1 = cross(d + r1, v), a2 = cross(r2, v)\n\nvoid b2PrismaticJointDef::Initialize(b2Body* bA, b2Body* bB, const b2Vec2& anchor, const b2Vec2& axis)\n{\n\tbodyA = bA;\n\tbodyB = bB;\n\tlocalAnchorA = bodyA->GetLocalPoint(anchor);\n\tlocalAnchorB = bodyB->GetLocalPoint(anchor);\n\tlocalAxisA = bodyA->GetLocalVector(axis);\n\treferenceAngle = bodyB->GetAngle() - bodyA->GetAngle();\n}\n\nb2PrismaticJoint::b2PrismaticJoint(const b2PrismaticJointDef* def)\n: b2Joint(def)\n{\n\tm_localAnchorA = def->localAnchorA;\n\tm_localAnchorB = def->localAnchorB;\n\tm_localXAxisA = def->localAxisA;\n\tm_localXAxisA.Normalize();\n\tm_localYAxisA = b2Cross(1.0f, m_localXAxisA);\n\tm_referenceAngle = def->referenceAngle;\n\n\tm_impulse.SetZero();\n\tm_axialMass = 0.0f;\n\tm_motorImpulse = 0.0f;\n\tm_lowerImpulse = 0.0f;\n\tm_upperImpulse = 0.0f;\n\n\tm_lowerTranslation = def->lowerTranslation;\n\tm_upperTranslation = def->upperTranslation;\n\n\tb2Assert(m_lowerTranslation <= m_upperTranslation);\n\n\tm_maxMotorForce = def->maxMotorForce;\n\tm_motorSpeed = def->motorSpeed;\n\tm_enableLimit = def->enableLimit;\n\tm_enableMotor = def->enableMotor;\n\n\tm_translation = 0.0f;\n\tm_axis.SetZero();\n\tm_perp.SetZero();\n}\n\nvoid b2PrismaticJoint::InitVelocityConstraints(const b2SolverData& data)\n{\n\tm_indexA = m_bodyA->m_islandIndex;\n\tm_indexB = m_bodyB->m_islandIndex;\n\tm_localCenterA = m_bodyA->m_sweep.localCenter;\n\tm_localCenterB = m_bodyB->m_sweep.localCenter;\n\tm_invMassA = m_bodyA->m_invMass;\n\tm_invMassB = m_bodyB->m_invMass;\n\tm_invIA = m_bodyA->m_invI;\n\tm_invIB = m_bodyB->m_invI;\n\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat aA = data.positions[m_indexA].a;\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat wA = data.velocities[m_indexA].w;\n\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat aB = data.positions[m_indexB].a;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat wB = data.velocities[m_indexB].w;\n\n\tb2Rot qA(aA), qB(aB);\n\n\t// Compute the effective masses.\n\tb2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tb2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\tb2Vec2 d = (cB - cA) + rB - rA;\n\n\tfloat mA = m_invMassA, mB = m_invMassB;\n\tfloat iA = m_invIA, iB = m_invIB;\n\n\t// Compute motor Jacobian and effective mass.\n\t{\n\t\tm_axis = b2Mul(qA, m_localXAxisA);\n\t\tm_a1 = b2Cross(d + rA, m_axis);\n\t\tm_a2 = b2Cross(rB, m_axis);\n\n\t\tm_axialMass = mA + mB + iA * m_a1 * m_a1 + iB * m_a2 * m_a2;\n\t\tif (m_axialMass > 0.0f)\n\t\t{\n\t\t\tm_axialMass = 1.0f / m_axialMass;\n\t\t}\n\t}\n\n\t// Prismatic constraint.\n\t{\n\t\tm_perp = b2Mul(qA, m_localYAxisA);\n\n\t\tm_s1 = b2Cross(d + rA, m_perp);\n\t\tm_s2 = b2Cross(rB, m_perp);\n\n\t\tfloat k11 = mA + mB + iA * m_s1 * m_s1 + iB * m_s2 * m_s2;\n\t\tfloat k12 = iA * m_s1 + iB * m_s2;\n\t\tfloat k22 = iA + iB;\n\t\tif (k22 == 0.0f)\n\t\t{\n\t\t\t// For bodies with fixed rotation.\n\t\t\tk22 = 1.0f;\n\t\t}\n\n\t\tm_K.ex.Set(k11, k12);\n\t\tm_K.ey.Set(k12, k22);\n\t}\n\n\tif (m_enableLimit)\n\t{\n\t\tm_translation = b2Dot(m_axis, d);\n\t}\n\telse\n\t{\n\t\tm_lowerImpulse = 0.0f;\n\t\tm_upperImpulse = 0.0f;\n\t}\n\n\tif (m_enableMotor == false)\n\t{\n\t\tm_motorImpulse = 0.0f;\n\t}\n\n\tif (data.step.warmStarting)\n\t{\n\t\t// Account for variable time step.\n\t\tm_impulse *= data.step.dtRatio;\n\t\tm_motorImpulse *= data.step.dtRatio;\n\t\tm_lowerImpulse *= data.step.dtRatio;\n\t\tm_upperImpulse *= data.step.dtRatio;\n\n\t\tfloat axialImpulse = m_motorImpulse + m_lowerImpulse - m_upperImpulse;\n\t\tb2Vec2 P = m_impulse.x * m_perp + axialImpulse * m_axis;\n\t\tfloat LA = m_impulse.x * m_s1 + m_impulse.y + axialImpulse * m_a1;\n\t\tfloat LB = m_impulse.x * m_s2 + m_impulse.y + axialImpulse * m_a2;\n\n\t\tvA -= mA * P;\n\t\twA -= iA * LA;\n\n\t\tvB += mB * P;\n\t\twB += iB * LB;\n\t}\n\telse\n\t{\n\t\tm_impulse.SetZero();\n\t\tm_motorImpulse = 0.0f;\n\t\tm_lowerImpulse = 0.0f;\n\t\tm_upperImpulse = 0.0f;\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nvoid b2PrismaticJoint::SolveVelocityConstraints(const b2SolverData& data)\n{\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat wA = data.velocities[m_indexA].w;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat wB = data.velocities[m_indexB].w;\n\n\tfloat mA = m_invMassA, mB = m_invMassB;\n\tfloat iA = m_invIA, iB = m_invIB;\n\n\t// Solve linear motor constraint\n\tif (m_enableMotor)\n\t{\n\t\tfloat Cdot = b2Dot(m_axis, vB - vA) + m_a2 * wB - m_a1 * wA;\n\t\tfloat impulse = m_axialMass * (m_motorSpeed - Cdot);\n\t\tfloat oldImpulse = m_motorImpulse;\n\t\tfloat maxImpulse = data.step.dt * m_maxMotorForce;\n\t\tm_motorImpulse = b2Clamp(m_motorImpulse + impulse, -maxImpulse, maxImpulse);\n\t\timpulse = m_motorImpulse - oldImpulse;\n\n\t\tb2Vec2 P = impulse * m_axis;\n\t\tfloat LA = impulse * m_a1;\n\t\tfloat LB = impulse * m_a2;\n\n\t\tvA -= mA * P;\n\t\twA -= iA * LA;\n\t\tvB += mB * P;\n\t\twB += iB * LB;\n\t}\n\n\tif (m_enableLimit)\n\t{\n\t\t// Lower limit\n\t\t{\n\t\t\tfloat C = m_translation - m_lowerTranslation;\n\t\t\tfloat Cdot = b2Dot(m_axis, vB - vA) + m_a2 * wB - m_a1 * wA;\n\t\t\tfloat impulse = -m_axialMass * (Cdot + b2Max(C, 0.0f) * data.step.inv_dt);\n\t\t\tfloat oldImpulse = m_lowerImpulse;\n\t\t\tm_lowerImpulse = b2Max(m_lowerImpulse + impulse, 0.0f);\n\t\t\timpulse = m_lowerImpulse - oldImpulse;\n\n\t\t\tb2Vec2 P = impulse * m_axis;\n\t\t\tfloat LA = impulse * m_a1;\n\t\t\tfloat LB = impulse * m_a2;\n\n\t\t\tvA -= mA * P;\n\t\t\twA -= iA * LA;\n\t\t\tvB += mB * P;\n\t\t\twB += iB * LB;\n\t\t}\n\n\t\t// Upper limit\n\t\t// Note: signs are flipped to keep C positive when the constraint is satisfied.\n\t\t// This also keeps the impulse positive when the limit is active.\n\t\t{\n\t\t\tfloat C = m_upperTranslation - m_translation;\n\t\t\tfloat Cdot = b2Dot(m_axis, vA - vB) + m_a1 * wA - m_a2 * wB;\n\t\t\tfloat impulse = -m_axialMass * (Cdot + b2Max(C, 0.0f) * data.step.inv_dt);\n\t\t\tfloat oldImpulse = m_upperImpulse;\n\t\t\tm_upperImpulse = b2Max(m_upperImpulse + impulse, 0.0f);\n\t\t\timpulse = m_upperImpulse - oldImpulse;\n\n\t\t\tb2Vec2 P = impulse * m_axis;\n\t\t\tfloat LA = impulse * m_a1;\n\t\t\tfloat LB = impulse * m_a2;\n\n\t\t\tvA += mA * P;\n\t\t\twA += iA * LA;\n\t\t\tvB -= mB * P;\n\t\t\twB -= iB * LB;\n\t\t}\n\t}\n\n\t// Solve the prismatic constraint in block form.\n\t{\n\t\tb2Vec2 Cdot;\n\t\tCdot.x = b2Dot(m_perp, vB - vA) + m_s2 * wB - m_s1 * wA;\n\t\tCdot.y = wB - wA;\n\n\t\tb2Vec2 df = m_K.Solve(-Cdot);\n\t\tm_impulse += df;\n\n\t\tb2Vec2 P = df.x * m_perp;\n\t\tfloat LA = df.x * m_s1 + df.y;\n\t\tfloat LB = df.x * m_s2 + df.y;\n\n\t\tvA -= mA * P;\n\t\twA -= iA * LA;\n\n\t\tvB += mB * P;\n\t\twB += iB * LB;\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\n// A velocity based solver computes reaction forces(impulses) using the velocity constraint solver.Under this context,\n// the position solver is not there to resolve forces.It is only there to cope with integration error.\n//\n// Therefore, the pseudo impulses in the position solver do not have any physical meaning.Thus it is okay if they suck.\n//\n// We could take the active state from the velocity solver.However, the joint might push past the limit when the velocity\n// solver indicates the limit is inactive.\nbool b2PrismaticJoint::SolvePositionConstraints(const b2SolverData& data)\n{\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat aA = data.positions[m_indexA].a;\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat aB = data.positions[m_indexB].a;\n\n\tb2Rot qA(aA), qB(aB);\n\n\tfloat mA = m_invMassA, mB = m_invMassB;\n\tfloat iA = m_invIA, iB = m_invIB;\n\n\t// Compute fresh Jacobians\n\tb2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tb2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\tb2Vec2 d = cB + rB - cA - rA;\n\n\tb2Vec2 axis = b2Mul(qA, m_localXAxisA);\n\tfloat a1 = b2Cross(d + rA, axis);\n\tfloat a2 = b2Cross(rB, axis);\n\tb2Vec2 perp = b2Mul(qA, m_localYAxisA);\n\n\tfloat s1 = b2Cross(d + rA, perp);\n\tfloat s2 = b2Cross(rB, perp);\n\n\tb2Vec3 impulse;\n\tb2Vec2 C1;\n\tC1.x = b2Dot(perp, d);\n\tC1.y = aB - aA - m_referenceAngle;\n\n\tfloat linearError = b2Abs(C1.x);\n\tfloat angularError = b2Abs(C1.y);\n\n\tbool active = false;\n\tfloat C2 = 0.0f;\n\tif (m_enableLimit)\n\t{\n\t\tfloat translation = b2Dot(axis, d);\n\t\tif (b2Abs(m_upperTranslation - m_lowerTranslation) < 2.0f * b2_linearSlop)\n\t\t{\n\t\t\tC2 = translation;\n\t\t\tlinearError = b2Max(linearError, b2Abs(translation));\n\t\t\tactive = true;\n\t\t}\n\t\telse if (translation <= m_lowerTranslation)\n\t\t{\n\t\t\tC2 = b2Min(translation - m_lowerTranslation, 0.0f);\n\t\t\tlinearError = b2Max(linearError, m_lowerTranslation - translation);\n\t\t\tactive = true;\n\t\t}\n\t\telse if (translation >= m_upperTranslation)\n\t\t{\n\t\t\tC2 = b2Max(translation - m_upperTranslation, 0.0f);\n\t\t\tlinearError = b2Max(linearError, translation - m_upperTranslation);\n\t\t\tactive = true;\n\t\t}\n\t}\n\n\tif (active)\n\t{\n\t\tfloat k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2;\n\t\tfloat k12 = iA * s1 + iB * s2;\n\t\tfloat k13 = iA * s1 * a1 + iB * s2 * a2;\n\t\tfloat k22 = iA + iB;\n\t\tif (k22 == 0.0f)\n\t\t{\n\t\t\t// For fixed rotation\n\t\t\tk22 = 1.0f;\n\t\t}\n\t\tfloat k23 = iA * a1 + iB * a2;\n\t\tfloat k33 = mA + mB + iA * a1 * a1 + iB * a2 * a2;\n\n\t\tb2Mat33 K;\n\t\tK.ex.Set(k11, k12, k13);\n\t\tK.ey.Set(k12, k22, k23);\n\t\tK.ez.Set(k13, k23, k33);\n\n\t\tb2Vec3 C;\n\t\tC.x = C1.x;\n\t\tC.y = C1.y;\n\t\tC.z = C2;\n\n\t\timpulse = K.Solve33(-C);\n\t}\n\telse\n\t{\n\t\tfloat k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2;\n\t\tfloat k12 = iA * s1 + iB * s2;\n\t\tfloat k22 = iA + iB;\n\t\tif (k22 == 0.0f)\n\t\t{\n\t\t\tk22 = 1.0f;\n\t\t}\n\n\t\tb2Mat22 K;\n\t\tK.ex.Set(k11, k12);\n\t\tK.ey.Set(k12, k22);\n\n\t\tb2Vec2 impulse1 = K.Solve(-C1);\n\t\timpulse.x = impulse1.x;\n\t\timpulse.y = impulse1.y;\n\t\timpulse.z = 0.0f;\n\t}\n\n\tb2Vec2 P = impulse.x * perp + impulse.z * axis;\n\tfloat LA = impulse.x * s1 + impulse.y + impulse.z * a1;\n\tfloat LB = impulse.x * s2 + impulse.y + impulse.z * a2;\n\n\tcA -= mA * P;\n\taA -= iA * LA;\n\tcB += mB * P;\n\taB += iB * LB;\n\n\tdata.positions[m_indexA].c = cA;\n\tdata.positions[m_indexA].a = aA;\n\tdata.positions[m_indexB].c = cB;\n\tdata.positions[m_indexB].a = aB;\n\n\treturn linearError <= b2_linearSlop && angularError <= b2_angularSlop;\n}\n\nb2Vec2 b2PrismaticJoint::GetAnchorA() const\n{\n\treturn m_bodyA->GetWorldPoint(m_localAnchorA);\n}\n\nb2Vec2 b2PrismaticJoint::GetAnchorB() const\n{\n\treturn m_bodyB->GetWorldPoint(m_localAnchorB);\n}\n\nb2Vec2 b2PrismaticJoint::GetReactionForce(float inv_dt) const\n{\n\treturn inv_dt * (m_impulse.x * m_perp + (m_motorImpulse + m_lowerImpulse - m_upperImpulse) * m_axis);\n}\n\nfloat b2PrismaticJoint::GetReactionTorque(float inv_dt) const\n{\n\treturn inv_dt * m_impulse.y;\n}\n\nfloat b2PrismaticJoint::GetJointTranslation() const\n{\n\tb2Vec2 pA = m_bodyA->GetWorldPoint(m_localAnchorA);\n\tb2Vec2 pB = m_bodyB->GetWorldPoint(m_localAnchorB);\n\tb2Vec2 d = pB - pA;\n\tb2Vec2 axis = m_bodyA->GetWorldVector(m_localXAxisA);\n\n\tfloat translation = b2Dot(d, axis);\n\treturn translation;\n}\n\nfloat b2PrismaticJoint::GetJointSpeed() const\n{\n\tb2Body* bA = m_bodyA;\n\tb2Body* bB = m_bodyB;\n\n\tb2Vec2 rA = b2Mul(bA->m_xf.q, m_localAnchorA - bA->m_sweep.localCenter);\n\tb2Vec2 rB = b2Mul(bB->m_xf.q, m_localAnchorB - bB->m_sweep.localCenter);\n\tb2Vec2 p1 = bA->m_sweep.c + rA;\n\tb2Vec2 p2 = bB->m_sweep.c + rB;\n\tb2Vec2 d = p2 - p1;\n\tb2Vec2 axis = b2Mul(bA->m_xf.q, m_localXAxisA);\n\n\tb2Vec2 vA = bA->m_linearVelocity;\n\tb2Vec2 vB = bB->m_linearVelocity;\n\tfloat wA = bA->m_angularVelocity;\n\tfloat wB = bB->m_angularVelocity;\n\n\tfloat speed = b2Dot(d, b2Cross(wA, axis)) + b2Dot(axis, vB + b2Cross(wB, rB) - vA - b2Cross(wA, rA));\n\treturn speed;\n}\n\nbool b2PrismaticJoint::IsLimitEnabled() const\n{\n\treturn m_enableLimit;\n}\n\nvoid b2PrismaticJoint::EnableLimit(bool flag)\n{\n\tif (flag != m_enableLimit)\n\t{\n\t\tm_bodyA->SetAwake(true);\n\t\tm_bodyB->SetAwake(true);\n\t\tm_enableLimit = flag;\n\t\tm_lowerImpulse = 0.0f;\n\t\tm_upperImpulse = 0.0f;\n\t}\n}\n\nfloat b2PrismaticJoint::GetLowerLimit() const\n{\n\treturn m_lowerTranslation;\n}\n\nfloat b2PrismaticJoint::GetUpperLimit() const\n{\n\treturn m_upperTranslation;\n}\n\nvoid b2PrismaticJoint::SetLimits(float lower, float upper)\n{\n\tb2Assert(lower <= upper);\n\tif (lower != m_lowerTranslation || upper != m_upperTranslation)\n\t{\n\t\tm_bodyA->SetAwake(true);\n\t\tm_bodyB->SetAwake(true);\n\t\tm_lowerTranslation = lower;\n\t\tm_upperTranslation = upper;\n\t\tm_lowerImpulse = 0.0f;\n\t\tm_upperImpulse = 0.0f;\n\t}\n}\n\nbool b2PrismaticJoint::IsMotorEnabled() const\n{\n\treturn m_enableMotor;\n}\n\nvoid b2PrismaticJoint::EnableMotor(bool flag)\n{\n\tif (flag != m_enableMotor)\n\t{\n\t\tm_bodyA->SetAwake(true);\n\t\tm_bodyB->SetAwake(true);\n\t\tm_enableMotor = flag;\n\t}\n}\n\nvoid b2PrismaticJoint::SetMotorSpeed(float speed)\n{\n\tif (speed != m_motorSpeed)\n\t{\n\t\tm_bodyA->SetAwake(true);\n\t\tm_bodyB->SetAwake(true);\n\t\tm_motorSpeed = speed;\n\t}\n}\n\nvoid b2PrismaticJoint::SetMaxMotorForce(float force)\n{\n\tif (force != m_maxMotorForce)\n\t{\n\t\tm_bodyA->SetAwake(true);\n\t\tm_bodyB->SetAwake(true);\n\t\tm_maxMotorForce = force;\n\t}\n}\n\nfloat b2PrismaticJoint::GetMotorForce(float inv_dt) const\n{\n\treturn inv_dt * m_motorImpulse;\n}\n\nvoid b2PrismaticJoint::Dump()\n{\n\t// FLT_DECIMAL_DIG == 9\n\n\tint32 indexA = m_bodyA->m_islandIndex;\n\tint32 indexB = m_bodyB->m_islandIndex;\n\n\tb2Dump(\"  b2PrismaticJointDef jd;\\n\");\n\tb2Dump(\"  jd.bodyA = bodies[%d];\\n\", indexA);\n\tb2Dump(\"  jd.bodyB = bodies[%d];\\n\", indexB);\n\tb2Dump(\"  jd.collideConnected = bool(%d);\\n\", m_collideConnected);\n\tb2Dump(\"  jd.localAnchorA.Set(%.9g, %.9g);\\n\", m_localAnchorA.x, m_localAnchorA.y);\n\tb2Dump(\"  jd.localAnchorB.Set(%.9g, %.9g);\\n\", m_localAnchorB.x, m_localAnchorB.y);\n\tb2Dump(\"  jd.localAxisA.Set(%.9g, %.9g);\\n\", m_localXAxisA.x, m_localXAxisA.y);\n\tb2Dump(\"  jd.referenceAngle = %.9g;\\n\", m_referenceAngle);\n\tb2Dump(\"  jd.enableLimit = bool(%d);\\n\", m_enableLimit);\n\tb2Dump(\"  jd.lowerTranslation = %.9g;\\n\", m_lowerTranslation);\n\tb2Dump(\"  jd.upperTranslation = %.9g;\\n\", m_upperTranslation);\n\tb2Dump(\"  jd.enableMotor = bool(%d);\\n\", m_enableMotor);\n\tb2Dump(\"  jd.motorSpeed = %.9g;\\n\", m_motorSpeed);\n\tb2Dump(\"  jd.maxMotorForce = %.9g;\\n\", m_maxMotorForce);\n\tb2Dump(\"  joints[%d] = m_world->CreateJoint(&jd);\\n\", m_index);\n}\n\nvoid b2PrismaticJoint::Draw(b2Draw* draw) const\n{\n\tconst b2Transform& xfA = m_bodyA->GetTransform();\n\tconst b2Transform& xfB = m_bodyB->GetTransform();\n\tb2Vec2 pA = b2Mul(xfA, m_localAnchorA);\n\tb2Vec2 pB = b2Mul(xfB, m_localAnchorB);\n\n\tb2Vec2 axis = b2Mul(xfA.q, m_localXAxisA);\n\n\tb2Color c1(0.7f, 0.7f, 0.7f);\n\tb2Color c2(0.3f, 0.9f, 0.3f);\n\tb2Color c3(0.9f, 0.3f, 0.3f);\n\tb2Color c4(0.3f, 0.3f, 0.9f);\n\tb2Color c5(0.4f, 0.4f, 0.4f);\n\n\tdraw->DrawSegment(pA, pB, c5);\n\n\tif (m_enableLimit)\n\t{\n\t\tb2Vec2 lower = pA + m_lowerTranslation * axis;\n\t\tb2Vec2 upper = pA + m_upperTranslation * axis;\n\t\tb2Vec2 perp = b2Mul(xfA.q, m_localYAxisA);\n\t\tdraw->DrawSegment(lower, upper, c1);\n\t\tdraw->DrawSegment(lower - 0.5f * perp, lower + 0.5f * perp, c2);\n\t\tdraw->DrawSegment(upper - 0.5f * perp, upper + 0.5f * perp, c3);\n\t}\n\telse\n\t{\n\t\tdraw->DrawSegment(pA - 1.0f * axis, pA + 1.0f * axis, c1);\n\t}\n\n\tdraw->DrawPoint(pA, 5.0f, c1);\n\tdraw->DrawPoint(pB, 5.0f, c4);\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_pulley_joint.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_body.h\"\n#include \"box2d/b2_pulley_joint.h\"\n#include \"box2d/b2_time_step.h\"\n\n// Pulley:\n// length1 = norm(p1 - s1)\n// length2 = norm(p2 - s2)\n// C0 = (length1 + ratio * length2)_initial\n// C = C0 - (length1 + ratio * length2)\n// u1 = (p1 - s1) / norm(p1 - s1)\n// u2 = (p2 - s2) / norm(p2 - s2)\n// Cdot = -dot(u1, v1 + cross(w1, r1)) - ratio * dot(u2, v2 + cross(w2, r2))\n// J = -[u1 cross(r1, u1) ratio * u2  ratio * cross(r2, u2)]\n// K = J * invM * JT\n//   = invMass1 + invI1 * cross(r1, u1)^2 + ratio^2 * (invMass2 + invI2 * cross(r2, u2)^2)\n\nvoid b2PulleyJointDef::Initialize(b2Body* bA, b2Body* bB,\n\t\t\t\tconst b2Vec2& groundA, const b2Vec2& groundB,\n\t\t\t\tconst b2Vec2& anchorA, const b2Vec2& anchorB,\n\t\t\t\tfloat r)\n{\n\tbodyA = bA;\n\tbodyB = bB;\n\tgroundAnchorA = groundA;\n\tgroundAnchorB = groundB;\n\tlocalAnchorA = bodyA->GetLocalPoint(anchorA);\n\tlocalAnchorB = bodyB->GetLocalPoint(anchorB);\n\tb2Vec2 dA = anchorA - groundA;\n\tlengthA = dA.Length();\n\tb2Vec2 dB = anchorB - groundB;\n\tlengthB = dB.Length();\n\tratio = r;\n\tb2Assert(ratio > b2_epsilon);\n}\n\nb2PulleyJoint::b2PulleyJoint(const b2PulleyJointDef* def)\n: b2Joint(def)\n{\n\tm_groundAnchorA = def->groundAnchorA;\n\tm_groundAnchorB = def->groundAnchorB;\n\tm_localAnchorA = def->localAnchorA;\n\tm_localAnchorB = def->localAnchorB;\n\n\tm_lengthA = def->lengthA;\n\tm_lengthB = def->lengthB;\n\n\tb2Assert(def->ratio != 0.0f);\n\tm_ratio = def->ratio;\n\n\tm_constant = def->lengthA + m_ratio * def->lengthB;\n\n\tm_impulse = 0.0f;\n}\n\nvoid b2PulleyJoint::InitVelocityConstraints(const b2SolverData& data)\n{\n\tm_indexA = m_bodyA->m_islandIndex;\n\tm_indexB = m_bodyB->m_islandIndex;\n\tm_localCenterA = m_bodyA->m_sweep.localCenter;\n\tm_localCenterB = m_bodyB->m_sweep.localCenter;\n\tm_invMassA = m_bodyA->m_invMass;\n\tm_invMassB = m_bodyB->m_invMass;\n\tm_invIA = m_bodyA->m_invI;\n\tm_invIB = m_bodyB->m_invI;\n\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat aA = data.positions[m_indexA].a;\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat wA = data.velocities[m_indexA].w;\n\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat aB = data.positions[m_indexB].a;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat wB = data.velocities[m_indexB].w;\n\n\tb2Rot qA(aA), qB(aB);\n\n\tm_rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tm_rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\n\t// Get the pulley axes.\n\tm_uA = cA + m_rA - m_groundAnchorA;\n\tm_uB = cB + m_rB - m_groundAnchorB;\n\n\tfloat lengthA = m_uA.Length();\n\tfloat lengthB = m_uB.Length();\n\n\tif (lengthA > 10.0f * b2_linearSlop)\n\t{\n\t\tm_uA *= 1.0f / lengthA;\n\t}\n\telse\n\t{\n\t\tm_uA.SetZero();\n\t}\n\n\tif (lengthB > 10.0f * b2_linearSlop)\n\t{\n\t\tm_uB *= 1.0f / lengthB;\n\t}\n\telse\n\t{\n\t\tm_uB.SetZero();\n\t}\n\n\t// Compute effective mass.\n\tfloat ruA = b2Cross(m_rA, m_uA);\n\tfloat ruB = b2Cross(m_rB, m_uB);\n\n\tfloat mA = m_invMassA + m_invIA * ruA * ruA;\n\tfloat mB = m_invMassB + m_invIB * ruB * ruB;\n\n\tm_mass = mA + m_ratio * m_ratio * mB;\n\n\tif (m_mass > 0.0f)\n\t{\n\t\tm_mass = 1.0f / m_mass;\n\t}\n\n\tif (data.step.warmStarting)\n\t{\n\t\t// Scale impulses to support variable time steps.\n\t\tm_impulse *= data.step.dtRatio;\n\n\t\t// Warm starting.\n\t\tb2Vec2 PA = -(m_impulse) * m_uA;\n\t\tb2Vec2 PB = (-m_ratio * m_impulse) * m_uB;\n\n\t\tvA += m_invMassA * PA;\n\t\twA += m_invIA * b2Cross(m_rA, PA);\n\t\tvB += m_invMassB * PB;\n\t\twB += m_invIB * b2Cross(m_rB, PB);\n\t}\n\telse\n\t{\n\t\tm_impulse = 0.0f;\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nvoid b2PulleyJoint::SolveVelocityConstraints(const b2SolverData& data)\n{\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat wA = data.velocities[m_indexA].w;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat wB = data.velocities[m_indexB].w;\n\n\tb2Vec2 vpA = vA + b2Cross(wA, m_rA);\n\tb2Vec2 vpB = vB + b2Cross(wB, m_rB);\n\n\tfloat Cdot = -b2Dot(m_uA, vpA) - m_ratio * b2Dot(m_uB, vpB);\n\tfloat impulse = -m_mass * Cdot;\n\tm_impulse += impulse;\n\n\tb2Vec2 PA = -impulse * m_uA;\n\tb2Vec2 PB = -m_ratio * impulse * m_uB;\n\tvA += m_invMassA * PA;\n\twA += m_invIA * b2Cross(m_rA, PA);\n\tvB += m_invMassB * PB;\n\twB += m_invIB * b2Cross(m_rB, PB);\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nbool b2PulleyJoint::SolvePositionConstraints(const b2SolverData& data)\n{\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat aA = data.positions[m_indexA].a;\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat aB = data.positions[m_indexB].a;\n\n\tb2Rot qA(aA), qB(aB);\n\n\tb2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tb2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\n\t// Get the pulley axes.\n\tb2Vec2 uA = cA + rA - m_groundAnchorA;\n\tb2Vec2 uB = cB + rB - m_groundAnchorB;\n\n\tfloat lengthA = uA.Length();\n\tfloat lengthB = uB.Length();\n\n\tif (lengthA > 10.0f * b2_linearSlop)\n\t{\n\t\tuA *= 1.0f / lengthA;\n\t}\n\telse\n\t{\n\t\tuA.SetZero();\n\t}\n\n\tif (lengthB > 10.0f * b2_linearSlop)\n\t{\n\t\tuB *= 1.0f / lengthB;\n\t}\n\telse\n\t{\n\t\tuB.SetZero();\n\t}\n\n\t// Compute effective mass.\n\tfloat ruA = b2Cross(rA, uA);\n\tfloat ruB = b2Cross(rB, uB);\n\n\tfloat mA = m_invMassA + m_invIA * ruA * ruA;\n\tfloat mB = m_invMassB + m_invIB * ruB * ruB;\n\n\tfloat mass = mA + m_ratio * m_ratio * mB;\n\n\tif (mass > 0.0f)\n\t{\n\t\tmass = 1.0f / mass;\n\t}\n\n\tfloat C = m_constant - lengthA - m_ratio * lengthB;\n\tfloat linearError = b2Abs(C);\n\n\tfloat impulse = -mass * C;\n\n\tb2Vec2 PA = -impulse * uA;\n\tb2Vec2 PB = -m_ratio * impulse * uB;\n\n\tcA += m_invMassA * PA;\n\taA += m_invIA * b2Cross(rA, PA);\n\tcB += m_invMassB * PB;\n\taB += m_invIB * b2Cross(rB, PB);\n\n\tdata.positions[m_indexA].c = cA;\n\tdata.positions[m_indexA].a = aA;\n\tdata.positions[m_indexB].c = cB;\n\tdata.positions[m_indexB].a = aB;\n\n\treturn linearError < b2_linearSlop;\n}\n\nb2Vec2 b2PulleyJoint::GetAnchorA() const\n{\n\treturn m_bodyA->GetWorldPoint(m_localAnchorA);\n}\n\nb2Vec2 b2PulleyJoint::GetAnchorB() const\n{\n\treturn m_bodyB->GetWorldPoint(m_localAnchorB);\n}\n\nb2Vec2 b2PulleyJoint::GetReactionForce(float inv_dt) const\n{\n\tb2Vec2 P = m_impulse * m_uB;\n\treturn inv_dt * P;\n}\n\nfloat b2PulleyJoint::GetReactionTorque(float inv_dt) const\n{\n\tB2_NOT_USED(inv_dt);\n\treturn 0.0f;\n}\n\nb2Vec2 b2PulleyJoint::GetGroundAnchorA() const\n{\n\treturn m_groundAnchorA;\n}\n\nb2Vec2 b2PulleyJoint::GetGroundAnchorB() const\n{\n\treturn m_groundAnchorB;\n}\n\nfloat b2PulleyJoint::GetLengthA() const\n{\n\treturn m_lengthA;\n}\n\nfloat b2PulleyJoint::GetLengthB() const\n{\n\treturn m_lengthB;\n}\n\nfloat b2PulleyJoint::GetRatio() const\n{\n\treturn m_ratio;\n}\n\nfloat b2PulleyJoint::GetCurrentLengthA() const\n{\n\tb2Vec2 p = m_bodyA->GetWorldPoint(m_localAnchorA);\n\tb2Vec2 s = m_groundAnchorA;\n\tb2Vec2 d = p - s;\n\treturn d.Length();\n}\n\nfloat b2PulleyJoint::GetCurrentLengthB() const\n{\n\tb2Vec2 p = m_bodyB->GetWorldPoint(m_localAnchorB);\n\tb2Vec2 s = m_groundAnchorB;\n\tb2Vec2 d = p - s;\n\treturn d.Length();\n}\n\nvoid b2PulleyJoint::Dump()\n{\n\tint32 indexA = m_bodyA->m_islandIndex;\n\tint32 indexB = m_bodyB->m_islandIndex;\n\n\tb2Dump(\"  b2PulleyJointDef jd;\\n\");\n\tb2Dump(\"  jd.bodyA = bodies[%d];\\n\", indexA);\n\tb2Dump(\"  jd.bodyB = bodies[%d];\\n\", indexB);\n\tb2Dump(\"  jd.collideConnected = bool(%d);\\n\", m_collideConnected);\n\tb2Dump(\"  jd.groundAnchorA.Set(%.9g, %.9g);\\n\", m_groundAnchorA.x, m_groundAnchorA.y);\n\tb2Dump(\"  jd.groundAnchorB.Set(%.9g, %.9g);\\n\", m_groundAnchorB.x, m_groundAnchorB.y);\n\tb2Dump(\"  jd.localAnchorA.Set(%.9g, %.9g);\\n\", m_localAnchorA.x, m_localAnchorA.y);\n\tb2Dump(\"  jd.localAnchorB.Set(%.9g, %.9g);\\n\", m_localAnchorB.x, m_localAnchorB.y);\n\tb2Dump(\"  jd.lengthA = %.9g;\\n\", m_lengthA);\n\tb2Dump(\"  jd.lengthB = %.9g;\\n\", m_lengthB);\n\tb2Dump(\"  jd.ratio = %.9g;\\n\", m_ratio);\n\tb2Dump(\"  joints[%d] = m_world->CreateJoint(&jd);\\n\", m_index);\n}\n\nvoid b2PulleyJoint::ShiftOrigin(const b2Vec2& newOrigin)\n{\n\tm_groundAnchorA -= newOrigin;\n\tm_groundAnchorB -= newOrigin;\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_revolute_joint.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_body.h\"\n#include \"box2d/b2_draw.h\"\n#include \"box2d/b2_revolute_joint.h\"\n#include \"box2d/b2_time_step.h\"\n\n// Point-to-point constraint\n// C = p2 - p1\n// Cdot = v2 - v1\n//      = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n// J = [-I -r1_skew I r2_skew ]\n// Identity used:\n// w k % (rx i + ry j) = w * (-ry i + rx j)\n\n// Motor constraint\n// Cdot = w2 - w1\n// J = [0 0 -1 0 0 1]\n// K = invI1 + invI2\n\nvoid b2RevoluteJointDef::Initialize(b2Body* bA, b2Body* bB, const b2Vec2& anchor)\n{\n\tbodyA = bA;\n\tbodyB = bB;\n\tlocalAnchorA = bodyA->GetLocalPoint(anchor);\n\tlocalAnchorB = bodyB->GetLocalPoint(anchor);\n\treferenceAngle = bodyB->GetAngle() - bodyA->GetAngle();\n}\n\nb2RevoluteJoint::b2RevoluteJoint(const b2RevoluteJointDef* def)\n: b2Joint(def)\n{\n\tm_localAnchorA = def->localAnchorA;\n\tm_localAnchorB = def->localAnchorB;\n\tm_referenceAngle = def->referenceAngle;\n\n\tm_impulse.SetZero();\n\tm_axialMass = 0.0f;\n\tm_motorImpulse = 0.0f;\n\tm_lowerImpulse = 0.0f;\n\tm_upperImpulse = 0.0f;\n\n\tm_lowerAngle = def->lowerAngle;\n\tm_upperAngle = def->upperAngle;\n\tm_maxMotorTorque = def->maxMotorTorque;\n\tm_motorSpeed = def->motorSpeed;\n\tm_enableLimit = def->enableLimit;\n\tm_enableMotor = def->enableMotor;\n\n\tm_angle = 0.0f;\n}\n\nvoid b2RevoluteJoint::InitVelocityConstraints(const b2SolverData& data)\n{\n\tm_indexA = m_bodyA->m_islandIndex;\n\tm_indexB = m_bodyB->m_islandIndex;\n\tm_localCenterA = m_bodyA->m_sweep.localCenter;\n\tm_localCenterB = m_bodyB->m_sweep.localCenter;\n\tm_invMassA = m_bodyA->m_invMass;\n\tm_invMassB = m_bodyB->m_invMass;\n\tm_invIA = m_bodyA->m_invI;\n\tm_invIB = m_bodyB->m_invI;\n\n\tfloat aA = data.positions[m_indexA].a;\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat wA = data.velocities[m_indexA].w;\n\n\tfloat aB = data.positions[m_indexB].a;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat wB = data.velocities[m_indexB].w;\n\n\tb2Rot qA(aA), qB(aB);\n\n\tm_rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tm_rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\n\t// J = [-I -r1_skew I r2_skew]\n\t// r_skew = [-ry; rx]\n\n\t// Matlab\n\t// K = [ mA+r1y^2*iA+mB+r2y^2*iB,  -r1y*iA*r1x-r2y*iB*r2x]\n\t//     [  -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB]\n\n\tfloat mA = m_invMassA, mB = m_invMassB;\n\tfloat iA = m_invIA, iB = m_invIB;\n\n\tm_K.ex.x = mA + mB + m_rA.y * m_rA.y * iA + m_rB.y * m_rB.y * iB;\n\tm_K.ey.x = -m_rA.y * m_rA.x * iA - m_rB.y * m_rB.x * iB;\n\tm_K.ex.y = m_K.ey.x;\n\tm_K.ey.y = mA + mB + m_rA.x * m_rA.x * iA + m_rB.x * m_rB.x * iB;\n\n\tm_axialMass = iA + iB;\n\tbool fixedRotation;\n\tif (m_axialMass > 0.0f)\n\t{\n\t\tm_axialMass = 1.0f / m_axialMass;\n\t\tfixedRotation = false;\n\t}\n\telse\n\t{\n\t\tfixedRotation = true;\n\t}\n\n\tm_angle = aB - aA - m_referenceAngle;\n\tif (m_enableLimit == false || fixedRotation)\n\t{\n\t\tm_lowerImpulse = 0.0f;\n\t\tm_upperImpulse = 0.0f;\n\t}\n\n\tif (m_enableMotor == false || fixedRotation)\n\t{\n\t\tm_motorImpulse = 0.0f;\n\t}\n\n\tif (data.step.warmStarting)\n\t{\n\t\t// Scale impulses to support a variable time step.\n\t\tm_impulse *= data.step.dtRatio;\n\t\tm_motorImpulse *= data.step.dtRatio;\n\t\tm_lowerImpulse *= data.step.dtRatio;\n\t\tm_upperImpulse *= data.step.dtRatio;\n\n\t\tfloat axialImpulse = m_motorImpulse + m_lowerImpulse - m_upperImpulse;\n\t\tb2Vec2 P(m_impulse.x, m_impulse.y);\n\n\t\tvA -= mA * P;\n\t\twA -= iA * (b2Cross(m_rA, P) + axialImpulse);\n\n\t\tvB += mB * P;\n\t\twB += iB * (b2Cross(m_rB, P) + axialImpulse);\n\t}\n\telse\n\t{\n\t\tm_impulse.SetZero();\n\t\tm_motorImpulse = 0.0f;\n\t\tm_lowerImpulse = 0.0f;\n\t\tm_upperImpulse = 0.0f;\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nvoid b2RevoluteJoint::SolveVelocityConstraints(const b2SolverData& data)\n{\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat wA = data.velocities[m_indexA].w;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat wB = data.velocities[m_indexB].w;\n\n\tfloat mA = m_invMassA, mB = m_invMassB;\n\tfloat iA = m_invIA, iB = m_invIB;\n\n\tbool fixedRotation = (iA + iB == 0.0f);\n\n\t// Solve motor constraint.\n\tif (m_enableMotor && fixedRotation == false)\n\t{\n\t\tfloat Cdot = wB - wA - m_motorSpeed;\n\t\tfloat impulse = -m_axialMass * Cdot;\n\t\tfloat oldImpulse = m_motorImpulse;\n\t\tfloat maxImpulse = data.step.dt * m_maxMotorTorque;\n\t\tm_motorImpulse = b2Clamp(m_motorImpulse + impulse, -maxImpulse, maxImpulse);\n\t\timpulse = m_motorImpulse - oldImpulse;\n\n\t\twA -= iA * impulse;\n\t\twB += iB * impulse;\n\t}\n\n\tif (m_enableLimit && fixedRotation == false)\n\t{\n\t\t// Lower limit\n\t\t{\n\t\t\tfloat C = m_angle - m_lowerAngle;\n\t\t\tfloat Cdot = wB - wA;\n\t\t\tfloat impulse = -m_axialMass * (Cdot + b2Max(C, 0.0f) * data.step.inv_dt);\n\t\t\tfloat oldImpulse = m_lowerImpulse;\n\t\t\tm_lowerImpulse = b2Max(m_lowerImpulse + impulse, 0.0f);\n\t\t\timpulse = m_lowerImpulse - oldImpulse;\n\n\t\t\twA -= iA * impulse;\n\t\t\twB += iB * impulse;\n\t\t}\n\n\t\t// Upper limit\n\t\t// Note: signs are flipped to keep C positive when the constraint is satisfied.\n\t\t// This also keeps the impulse positive when the limit is active.\n\t\t{\n\t\t\tfloat C = m_upperAngle - m_angle;\n\t\t\tfloat Cdot = wA - wB;\n\t\t\tfloat impulse = -m_axialMass * (Cdot + b2Max(C, 0.0f) * data.step.inv_dt);\n\t\t\tfloat oldImpulse = m_upperImpulse;\n\t\t\tm_upperImpulse = b2Max(m_upperImpulse + impulse, 0.0f);\n\t\t\timpulse = m_upperImpulse - oldImpulse;\n\n\t\t\twA += iA * impulse;\n\t\t\twB -= iB * impulse;\n\t\t}\n\t}\n\n\t// Solve point-to-point constraint\n\t{\n\t\tb2Vec2 Cdot = vB + b2Cross(wB, m_rB) - vA - b2Cross(wA, m_rA);\n\t\tb2Vec2 impulse = m_K.Solve(-Cdot);\n\n\t\tm_impulse.x += impulse.x;\n\t\tm_impulse.y += impulse.y;\n\n\t\tvA -= mA * impulse;\n\t\twA -= iA * b2Cross(m_rA, impulse);\n\n\t\tvB += mB * impulse;\n\t\twB += iB * b2Cross(m_rB, impulse);\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nbool b2RevoluteJoint::SolvePositionConstraints(const b2SolverData& data)\n{\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat aA = data.positions[m_indexA].a;\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat aB = data.positions[m_indexB].a;\n\n\tb2Rot qA(aA), qB(aB);\n\n\tfloat angularError = 0.0f;\n\tfloat positionError = 0.0f;\n\n\tbool fixedRotation = (m_invIA + m_invIB == 0.0f);\n\n\t// Solve angular limit constraint\n\tif (m_enableLimit && fixedRotation == false)\n\t{\n\t\tfloat angle = aB - aA - m_referenceAngle;\n\t\tfloat C = 0.0f;\n\n\t\tif (b2Abs(m_upperAngle - m_lowerAngle) < 2.0f * b2_angularSlop)\n\t\t{\n\t\t\t// Prevent large angular corrections\n\t\t\tC = b2Clamp(angle - m_lowerAngle, -b2_maxAngularCorrection, b2_maxAngularCorrection);\n\t\t}\n\t\telse if (angle <= m_lowerAngle)\n\t\t{\n\t\t\t// Prevent large angular corrections and allow some slop.\n\t\t\tC = b2Clamp(angle - m_lowerAngle + b2_angularSlop, -b2_maxAngularCorrection, 0.0f);\n\t\t}\n\t\telse if (angle >= m_upperAngle)\n\t\t{\n\t\t\t// Prevent large angular corrections and allow some slop.\n\t\t\tC = b2Clamp(angle - m_upperAngle - b2_angularSlop, 0.0f, b2_maxAngularCorrection);\n\t\t}\n\n\t\tfloat limitImpulse = -m_axialMass * C;\n\t\taA -= m_invIA * limitImpulse;\n\t\taB += m_invIB * limitImpulse;\n\t\tangularError = b2Abs(C);\n\t}\n\n\t// Solve point-to-point constraint.\n\t{\n\t\tqA.Set(aA);\n\t\tqB.Set(aB);\n\t\tb2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\t\tb2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\n\t\tb2Vec2 C = cB + rB - cA - rA;\n\t\tpositionError = C.Length();\n\n\t\tfloat mA = m_invMassA, mB = m_invMassB;\n\t\tfloat iA = m_invIA, iB = m_invIB;\n\n\t\tb2Mat22 K;\n\t\tK.ex.x = mA + mB + iA * rA.y * rA.y + iB * rB.y * rB.y;\n\t\tK.ex.y = -iA * rA.x * rA.y - iB * rB.x * rB.y;\n\t\tK.ey.x = K.ex.y;\n\t\tK.ey.y = mA + mB + iA * rA.x * rA.x + iB * rB.x * rB.x;\n\n\t\tb2Vec2 impulse = -K.Solve(C);\n\n\t\tcA -= mA * impulse;\n\t\taA -= iA * b2Cross(rA, impulse);\n\n\t\tcB += mB * impulse;\n\t\taB += iB * b2Cross(rB, impulse);\n\t}\n\n\tdata.positions[m_indexA].c = cA;\n\tdata.positions[m_indexA].a = aA;\n\tdata.positions[m_indexB].c = cB;\n\tdata.positions[m_indexB].a = aB;\n\n\treturn positionError <= b2_linearSlop && angularError <= b2_angularSlop;\n}\n\nb2Vec2 b2RevoluteJoint::GetAnchorA() const\n{\n\treturn m_bodyA->GetWorldPoint(m_localAnchorA);\n}\n\nb2Vec2 b2RevoluteJoint::GetAnchorB() const\n{\n\treturn m_bodyB->GetWorldPoint(m_localAnchorB);\n}\n\nb2Vec2 b2RevoluteJoint::GetReactionForce(float inv_dt) const\n{\n\tb2Vec2 P(m_impulse.x, m_impulse.y);\n\treturn inv_dt * P;\n}\n\nfloat b2RevoluteJoint::GetReactionTorque(float inv_dt) const\n{\n\treturn inv_dt * (m_motorImpulse + m_lowerImpulse - m_upperImpulse);\n}\n\nfloat b2RevoluteJoint::GetJointAngle() const\n{\n\tb2Body* bA = m_bodyA;\n\tb2Body* bB = m_bodyB;\n\treturn bB->m_sweep.a - bA->m_sweep.a - m_referenceAngle;\n}\n\nfloat b2RevoluteJoint::GetJointSpeed() const\n{\n\tb2Body* bA = m_bodyA;\n\tb2Body* bB = m_bodyB;\n\treturn bB->m_angularVelocity - bA->m_angularVelocity;\n}\n\nbool b2RevoluteJoint::IsMotorEnabled() const\n{\n\treturn m_enableMotor;\n}\n\nvoid b2RevoluteJoint::EnableMotor(bool flag)\n{\n\tif (flag != m_enableMotor)\n\t{\n\t\tm_bodyA->SetAwake(true);\n\t\tm_bodyB->SetAwake(true);\n\t\tm_enableMotor = flag;\n\t}\n}\n\nfloat b2RevoluteJoint::GetMotorTorque(float inv_dt) const\n{\n\treturn inv_dt * m_motorImpulse;\n}\n\nvoid b2RevoluteJoint::SetMotorSpeed(float speed)\n{\n\tif (speed != m_motorSpeed)\n\t{\n\t\tm_bodyA->SetAwake(true);\n\t\tm_bodyB->SetAwake(true);\n\t\tm_motorSpeed = speed;\n\t}\n}\n\nvoid b2RevoluteJoint::SetMaxMotorTorque(float torque)\n{\n\tif (torque != m_maxMotorTorque)\n\t{\n\t\tm_bodyA->SetAwake(true);\n\t\tm_bodyB->SetAwake(true);\n\t\tm_maxMotorTorque = torque;\n\t}\n}\n\nbool b2RevoluteJoint::IsLimitEnabled() const\n{\n\treturn m_enableLimit;\n}\n\nvoid b2RevoluteJoint::EnableLimit(bool flag)\n{\n\tif (flag != m_enableLimit)\n\t{\n\t\tm_bodyA->SetAwake(true);\n\t\tm_bodyB->SetAwake(true);\n\t\tm_enableLimit = flag;\n\t\tm_lowerImpulse = 0.0f;\n\t\tm_upperImpulse = 0.0f;\n\t}\n}\n\nfloat b2RevoluteJoint::GetLowerLimit() const\n{\n\treturn m_lowerAngle;\n}\n\nfloat b2RevoluteJoint::GetUpperLimit() const\n{\n\treturn m_upperAngle;\n}\n\nvoid b2RevoluteJoint::SetLimits(float lower, float upper)\n{\n\tb2Assert(lower <= upper);\n\t\n\tif (lower != m_lowerAngle || upper != m_upperAngle)\n\t{\n\t\tm_bodyA->SetAwake(true);\n\t\tm_bodyB->SetAwake(true);\n\t\tm_lowerImpulse = 0.0f;\n\t\tm_upperImpulse = 0.0f;\n\t\tm_lowerAngle = lower;\n\t\tm_upperAngle = upper;\n\t}\n}\n\nvoid b2RevoluteJoint::Dump()\n{\n\tint32 indexA = m_bodyA->m_islandIndex;\n\tint32 indexB = m_bodyB->m_islandIndex;\n\n\tb2Dump(\"  b2RevoluteJointDef jd;\\n\");\n\tb2Dump(\"  jd.bodyA = bodies[%d];\\n\", indexA);\n\tb2Dump(\"  jd.bodyB = bodies[%d];\\n\", indexB);\n\tb2Dump(\"  jd.collideConnected = bool(%d);\\n\", m_collideConnected);\n\tb2Dump(\"  jd.localAnchorA.Set(%.9g, %.9g);\\n\", m_localAnchorA.x, m_localAnchorA.y);\n\tb2Dump(\"  jd.localAnchorB.Set(%.9g, %.9g);\\n\", m_localAnchorB.x, m_localAnchorB.y);\n\tb2Dump(\"  jd.referenceAngle = %.9g;\\n\", m_referenceAngle);\n\tb2Dump(\"  jd.enableLimit = bool(%d);\\n\", m_enableLimit);\n\tb2Dump(\"  jd.lowerAngle = %.9g;\\n\", m_lowerAngle);\n\tb2Dump(\"  jd.upperAngle = %.9g;\\n\", m_upperAngle);\n\tb2Dump(\"  jd.enableMotor = bool(%d);\\n\", m_enableMotor);\n\tb2Dump(\"  jd.motorSpeed = %.9g;\\n\", m_motorSpeed);\n\tb2Dump(\"  jd.maxMotorTorque = %.9g;\\n\", m_maxMotorTorque);\n\tb2Dump(\"  joints[%d] = m_world->CreateJoint(&jd);\\n\", m_index);\n}\n\n///\nvoid b2RevoluteJoint::Draw(b2Draw* draw) const\n{\n\tconst b2Transform& xfA = m_bodyA->GetTransform();\n\tconst b2Transform& xfB = m_bodyB->GetTransform();\n\tb2Vec2 pA = b2Mul(xfA, m_localAnchorA);\n\tb2Vec2 pB = b2Mul(xfB, m_localAnchorB);\n\n\tb2Color c1(0.7f, 0.7f, 0.7f);\n\tb2Color c2(0.3f, 0.9f, 0.3f);\n\tb2Color c3(0.9f, 0.3f, 0.3f);\n\tb2Color c4(0.3f, 0.3f, 0.9f);\n\tb2Color c5(0.4f, 0.4f, 0.4f);\n\n\tdraw->DrawPoint(pA, 5.0f, c4);\n\tdraw->DrawPoint(pB, 5.0f, c5);\n\n\tfloat aA = m_bodyA->GetAngle();\n\tfloat aB = m_bodyB->GetAngle();\n\tfloat angle = aB - aA - m_referenceAngle;\n\n\tconst float L = 0.5f;\n\n\tb2Vec2 r = L * b2Vec2(cosf(angle), sinf(angle));\n\tdraw->DrawSegment(pB, pB + r, c1);\n\tdraw->DrawCircle(pB, L, c1);\n\n\tif (m_enableLimit)\n\t{\n\t\tb2Vec2 rlo = L * b2Vec2(cosf(m_lowerAngle), sinf(m_lowerAngle));\n\t\tb2Vec2 rhi = L * b2Vec2(cosf(m_upperAngle), sinf(m_upperAngle));\n\n\t\tdraw->DrawSegment(pB, pB + rlo, c2);\n\t\tdraw->DrawSegment(pB, pB + rhi, c3);\n\t}\n\n\tb2Color color(0.5f, 0.8f, 0.8f);\n\tdraw->DrawSegment(xfA.p, pA, color);\n\tdraw->DrawSegment(pA, pB, color);\n\tdraw->DrawSegment(xfB.p, pB, color);\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_weld_joint.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_body.h\"\n#include \"box2d/b2_time_step.h\"\n#include \"box2d/b2_weld_joint.h\"\n\n// Point-to-point constraint\n// C = p2 - p1\n// Cdot = v2 - v1\n//      = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n// J = [-I -r1_skew I r2_skew ]\n// Identity used:\n// w k % (rx i + ry j) = w * (-ry i + rx j)\n\n// Angle constraint\n// C = angle2 - angle1 - referenceAngle\n// Cdot = w2 - w1\n// J = [0 0 -1 0 0 1]\n// K = invI1 + invI2\n\nvoid b2WeldJointDef::Initialize(b2Body* bA, b2Body* bB, const b2Vec2& anchor)\n{\n\tbodyA = bA;\n\tbodyB = bB;\n\tlocalAnchorA = bodyA->GetLocalPoint(anchor);\n\tlocalAnchorB = bodyB->GetLocalPoint(anchor);\n\treferenceAngle = bodyB->GetAngle() - bodyA->GetAngle();\n}\n\nb2WeldJoint::b2WeldJoint(const b2WeldJointDef* def)\n: b2Joint(def)\n{\n\tm_localAnchorA = def->localAnchorA;\n\tm_localAnchorB = def->localAnchorB;\n\tm_referenceAngle = def->referenceAngle;\n\tm_stiffness = def->stiffness;\n\tm_damping = def->damping;\n\n\tm_impulse.SetZero();\n}\n\nvoid b2WeldJoint::InitVelocityConstraints(const b2SolverData& data)\n{\n\tm_indexA = m_bodyA->m_islandIndex;\n\tm_indexB = m_bodyB->m_islandIndex;\n\tm_localCenterA = m_bodyA->m_sweep.localCenter;\n\tm_localCenterB = m_bodyB->m_sweep.localCenter;\n\tm_invMassA = m_bodyA->m_invMass;\n\tm_invMassB = m_bodyB->m_invMass;\n\tm_invIA = m_bodyA->m_invI;\n\tm_invIB = m_bodyB->m_invI;\n\n\tfloat aA = data.positions[m_indexA].a;\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat wA = data.velocities[m_indexA].w;\n\n\tfloat aB = data.positions[m_indexB].a;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat wB = data.velocities[m_indexB].w;\n\n\tb2Rot qA(aA), qB(aB);\n\n\tm_rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tm_rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\n\t// J = [-I -r1_skew I r2_skew]\n\t//     [ 0       -1 0       1]\n\t// r_skew = [-ry; rx]\n\n\t// Matlab\n\t// K = [ mA+r1y^2*iA+mB+r2y^2*iB,  -r1y*iA*r1x-r2y*iB*r2x,          -r1y*iA-r2y*iB]\n\t//     [  -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB,           r1x*iA+r2x*iB]\n\t//     [          -r1y*iA-r2y*iB,           r1x*iA+r2x*iB,                   iA+iB]\n\n\tfloat mA = m_invMassA, mB = m_invMassB;\n\tfloat iA = m_invIA, iB = m_invIB;\n\n\tb2Mat33 K;\n\tK.ex.x = mA + mB + m_rA.y * m_rA.y * iA + m_rB.y * m_rB.y * iB;\n\tK.ey.x = -m_rA.y * m_rA.x * iA - m_rB.y * m_rB.x * iB;\n\tK.ez.x = -m_rA.y * iA - m_rB.y * iB;\n\tK.ex.y = K.ey.x;\n\tK.ey.y = mA + mB + m_rA.x * m_rA.x * iA + m_rB.x * m_rB.x * iB;\n\tK.ez.y = m_rA.x * iA + m_rB.x * iB;\n\tK.ex.z = K.ez.x;\n\tK.ey.z = K.ez.y;\n\tK.ez.z = iA + iB;\n\n\tif (m_stiffness > 0.0f)\n\t{\n\t\tK.GetInverse22(&m_mass);\n\n\t\tfloat invM = iA + iB;\n\n\t\tfloat C = aB - aA - m_referenceAngle;\n\n\t\t// Damping coefficient\n\t\tfloat d = m_damping;\n\n\t\t// Spring stiffness\n\t\tfloat k = m_stiffness;\n\n\t\t// magic formulas\n\t\tfloat h = data.step.dt;\n\t\tm_gamma = h * (d + h * k);\n\t\tm_gamma = m_gamma != 0.0f ? 1.0f / m_gamma : 0.0f;\n\t\tm_bias = C * h * k * m_gamma;\n\n\t\tinvM += m_gamma;\n\t\tm_mass.ez.z = invM != 0.0f ? 1.0f / invM : 0.0f;\n\t}\n\telse if (K.ez.z == 0.0f)\n\t{\n\t\tK.GetInverse22(&m_mass);\n\t\tm_gamma = 0.0f;\n\t\tm_bias = 0.0f;\n\t}\n\telse\n\t{\n\t\tK.GetSymInverse33(&m_mass);\n\t\tm_gamma = 0.0f;\n\t\tm_bias = 0.0f;\n\t}\n\n\tif (data.step.warmStarting)\n\t{\n\t\t// Scale impulses to support a variable time step.\n\t\tm_impulse *= data.step.dtRatio;\n\n\t\tb2Vec2 P(m_impulse.x, m_impulse.y);\n\n\t\tvA -= mA * P;\n\t\twA -= iA * (b2Cross(m_rA, P) + m_impulse.z);\n\n\t\tvB += mB * P;\n\t\twB += iB * (b2Cross(m_rB, P) + m_impulse.z);\n\t}\n\telse\n\t{\n\t\tm_impulse.SetZero();\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nvoid b2WeldJoint::SolveVelocityConstraints(const b2SolverData& data)\n{\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat wA = data.velocities[m_indexA].w;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat wB = data.velocities[m_indexB].w;\n\n\tfloat mA = m_invMassA, mB = m_invMassB;\n\tfloat iA = m_invIA, iB = m_invIB;\n\n\tif (m_stiffness > 0.0f)\n\t{\n\t\tfloat Cdot2 = wB - wA;\n\n\t\tfloat impulse2 = -m_mass.ez.z * (Cdot2 + m_bias + m_gamma * m_impulse.z);\n\t\tm_impulse.z += impulse2;\n\n\t\twA -= iA * impulse2;\n\t\twB += iB * impulse2;\n\n\t\tb2Vec2 Cdot1 = vB + b2Cross(wB, m_rB) - vA - b2Cross(wA, m_rA);\n\n\t\tb2Vec2 impulse1 = -b2Mul22(m_mass, Cdot1);\n\t\tm_impulse.x += impulse1.x;\n\t\tm_impulse.y += impulse1.y;\n\n\t\tb2Vec2 P = impulse1;\n\n\t\tvA -= mA * P;\n\t\twA -= iA * b2Cross(m_rA, P);\n\n\t\tvB += mB * P;\n\t\twB += iB * b2Cross(m_rB, P);\n\t}\n\telse\n\t{\n\t\tb2Vec2 Cdot1 = vB + b2Cross(wB, m_rB) - vA - b2Cross(wA, m_rA);\n\t\tfloat Cdot2 = wB - wA;\n\t\tb2Vec3 Cdot(Cdot1.x, Cdot1.y, Cdot2);\n\n\t\tb2Vec3 impulse = -b2Mul(m_mass, Cdot);\n\t\tm_impulse += impulse;\n\n\t\tb2Vec2 P(impulse.x, impulse.y);\n\n\t\tvA -= mA * P;\n\t\twA -= iA * (b2Cross(m_rA, P) + impulse.z);\n\n\t\tvB += mB * P;\n\t\twB += iB * (b2Cross(m_rB, P) + impulse.z);\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nbool b2WeldJoint::SolvePositionConstraints(const b2SolverData& data)\n{\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat aA = data.positions[m_indexA].a;\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat aB = data.positions[m_indexB].a;\n\n\tb2Rot qA(aA), qB(aB);\n\n\tfloat mA = m_invMassA, mB = m_invMassB;\n\tfloat iA = m_invIA, iB = m_invIB;\n\n\tb2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tb2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\n\tfloat positionError, angularError;\n\n\tb2Mat33 K;\n\tK.ex.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB;\n\tK.ey.x = -rA.y * rA.x * iA - rB.y * rB.x * iB;\n\tK.ez.x = -rA.y * iA - rB.y * iB;\n\tK.ex.y = K.ey.x;\n\tK.ey.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB;\n\tK.ez.y = rA.x * iA + rB.x * iB;\n\tK.ex.z = K.ez.x;\n\tK.ey.z = K.ez.y;\n\tK.ez.z = iA + iB;\n\n\tif (m_stiffness > 0.0f)\n\t{\n\t\tb2Vec2 C1 =  cB + rB - cA - rA;\n\n\t\tpositionError = C1.Length();\n\t\tangularError = 0.0f;\n\n\t\tb2Vec2 P = -K.Solve22(C1);\n\n\t\tcA -= mA * P;\n\t\taA -= iA * b2Cross(rA, P);\n\n\t\tcB += mB * P;\n\t\taB += iB * b2Cross(rB, P);\n\t}\n\telse\n\t{\n\t\tb2Vec2 C1 =  cB + rB - cA - rA;\n\t\tfloat C2 = aB - aA - m_referenceAngle;\n\n\t\tpositionError = C1.Length();\n\t\tangularError = b2Abs(C2);\n\n\t\tb2Vec3 C(C1.x, C1.y, C2);\n\t\n\t\tb2Vec3 impulse;\n\t\tif (K.ez.z > 0.0f)\n\t\t{\n\t\t\timpulse = -K.Solve33(C);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tb2Vec2 impulse2 = -K.Solve22(C1);\n\t\t\timpulse.Set(impulse2.x, impulse2.y, 0.0f);\n\t\t}\n\n\t\tb2Vec2 P(impulse.x, impulse.y);\n\n\t\tcA -= mA * P;\n\t\taA -= iA * (b2Cross(rA, P) + impulse.z);\n\n\t\tcB += mB * P;\n\t\taB += iB * (b2Cross(rB, P) + impulse.z);\n\t}\n\n\tdata.positions[m_indexA].c = cA;\n\tdata.positions[m_indexA].a = aA;\n\tdata.positions[m_indexB].c = cB;\n\tdata.positions[m_indexB].a = aB;\n\n\treturn positionError <= b2_linearSlop && angularError <= b2_angularSlop;\n}\n\nb2Vec2 b2WeldJoint::GetAnchorA() const\n{\n\treturn m_bodyA->GetWorldPoint(m_localAnchorA);\n}\n\nb2Vec2 b2WeldJoint::GetAnchorB() const\n{\n\treturn m_bodyB->GetWorldPoint(m_localAnchorB);\n}\n\nb2Vec2 b2WeldJoint::GetReactionForce(float inv_dt) const\n{\n\tb2Vec2 P(m_impulse.x, m_impulse.y);\n\treturn inv_dt * P;\n}\n\nfloat b2WeldJoint::GetReactionTorque(float inv_dt) const\n{\n\treturn inv_dt * m_impulse.z;\n}\n\nvoid b2WeldJoint::Dump()\n{\n\tint32 indexA = m_bodyA->m_islandIndex;\n\tint32 indexB = m_bodyB->m_islandIndex;\n\n\tb2Dump(\"  b2WeldJointDef jd;\\n\");\n\tb2Dump(\"  jd.bodyA = bodies[%d];\\n\", indexA);\n\tb2Dump(\"  jd.bodyB = bodies[%d];\\n\", indexB);\n\tb2Dump(\"  jd.collideConnected = bool(%d);\\n\", m_collideConnected);\n\tb2Dump(\"  jd.localAnchorA.Set(%.9g, %.9g);\\n\", m_localAnchorA.x, m_localAnchorA.y);\n\tb2Dump(\"  jd.localAnchorB.Set(%.9g, %.9g);\\n\", m_localAnchorB.x, m_localAnchorB.y);\n\tb2Dump(\"  jd.referenceAngle = %.9g;\\n\", m_referenceAngle);\n\tb2Dump(\"  jd.stiffness = %.9g;\\n\", m_stiffness);\n\tb2Dump(\"  jd.damping = %.9g;\\n\", m_damping);\n\tb2Dump(\"  joints[%d] = m_world->CreateJoint(&jd);\\n\", m_index);\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_wheel_joint.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_body.h\"\n#include \"box2d/b2_draw.h\"\n#include \"box2d/b2_wheel_joint.h\"\n#include \"box2d/b2_time_step.h\"\n\n// Linear constraint (point-to-line)\n// d = pB - pA = xB + rB - xA - rA\n// C = dot(ay, d)\n// Cdot = dot(d, cross(wA, ay)) + dot(ay, vB + cross(wB, rB) - vA - cross(wA, rA))\n//      = -dot(ay, vA) - dot(cross(d + rA, ay), wA) + dot(ay, vB) + dot(cross(rB, ay), vB)\n// J = [-ay, -cross(d + rA, ay), ay, cross(rB, ay)]\n\n// Spring linear constraint\n// C = dot(ax, d)\n// Cdot = = -dot(ax, vA) - dot(cross(d + rA, ax), wA) + dot(ax, vB) + dot(cross(rB, ax), vB)\n// J = [-ax -cross(d+rA, ax) ax cross(rB, ax)]\n\n// Motor rotational constraint\n// Cdot = wB - wA\n// J = [0 0 -1 0 0 1]\n\nvoid b2WheelJointDef::Initialize(b2Body* bA, b2Body* bB, const b2Vec2& anchor, const b2Vec2& axis)\n{\n\tbodyA = bA;\n\tbodyB = bB;\n\tlocalAnchorA = bodyA->GetLocalPoint(anchor);\n\tlocalAnchorB = bodyB->GetLocalPoint(anchor);\n\tlocalAxisA = bodyA->GetLocalVector(axis);\n}\n\nb2WheelJoint::b2WheelJoint(const b2WheelJointDef* def)\n: b2Joint(def)\n{\n\tm_localAnchorA = def->localAnchorA;\n\tm_localAnchorB = def->localAnchorB;\n\tm_localXAxisA = def->localAxisA;\n\tm_localYAxisA = b2Cross(1.0f, m_localXAxisA);\n\n\tm_mass = 0.0f;\n\tm_impulse = 0.0f;\n\tm_motorMass = 0.0f;\n\tm_motorImpulse = 0.0f;\n\tm_springMass = 0.0f;\n\tm_springImpulse = 0.0f;\n\n\tm_axialMass = 0.0f;\n\tm_lowerImpulse = 0.0f;\n\tm_upperImpulse = 0.0f;\n\tm_lowerTranslation = def->lowerTranslation;\n\tm_upperTranslation = def->upperTranslation;\n\tm_enableLimit = def->enableLimit;\n\n\tm_maxMotorTorque = def->maxMotorTorque;\n\tm_motorSpeed = def->motorSpeed;\n\tm_enableMotor = def->enableMotor;\n\n\tm_bias = 0.0f;\n\tm_gamma = 0.0f;\n\n\tm_ax.SetZero();\n\tm_ay.SetZero();\n\n\tm_stiffness = def->stiffness;\n\tm_damping = def->damping;\n}\n\nvoid b2WheelJoint::InitVelocityConstraints(const b2SolverData& data)\n{\n\tm_indexA = m_bodyA->m_islandIndex;\n\tm_indexB = m_bodyB->m_islandIndex;\n\tm_localCenterA = m_bodyA->m_sweep.localCenter;\n\tm_localCenterB = m_bodyB->m_sweep.localCenter;\n\tm_invMassA = m_bodyA->m_invMass;\n\tm_invMassB = m_bodyB->m_invMass;\n\tm_invIA = m_bodyA->m_invI;\n\tm_invIB = m_bodyB->m_invI;\n\n\tfloat mA = m_invMassA, mB = m_invMassB;\n\tfloat iA = m_invIA, iB = m_invIB;\n\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat aA = data.positions[m_indexA].a;\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat wA = data.velocities[m_indexA].w;\n\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat aB = data.positions[m_indexB].a;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat wB = data.velocities[m_indexB].w;\n\n\tb2Rot qA(aA), qB(aB);\n\n\t// Compute the effective masses.\n\tb2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\tb2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\tb2Vec2 d = cB + rB - cA - rA;\n\n\t// Point to line constraint\n\t{\n\t\tm_ay = b2Mul(qA, m_localYAxisA);\n\t\tm_sAy = b2Cross(d + rA, m_ay);\n\t\tm_sBy = b2Cross(rB, m_ay);\n\n\t\tm_mass = mA + mB + iA * m_sAy * m_sAy + iB * m_sBy * m_sBy;\n\n\t\tif (m_mass > 0.0f)\n\t\t{\n\t\t\tm_mass = 1.0f / m_mass;\n\t\t}\n\t}\n\n\t// Spring constraint\n\tm_ax = b2Mul(qA, m_localXAxisA);\n\tm_sAx = b2Cross(d + rA, m_ax);\n\tm_sBx = b2Cross(rB, m_ax);\n\n\tconst float invMass = mA + mB + iA * m_sAx * m_sAx + iB * m_sBx * m_sBx;\n\tif (invMass > 0.0f)\n\t{\n\t\tm_axialMass = 1.0f / invMass;\n\t}\n\telse\n\t{\n\t\tm_axialMass = 0.0f;\n\t}\n\n\tm_springMass = 0.0f;\n\tm_bias = 0.0f;\n\tm_gamma = 0.0f;\n\n\tif (m_stiffness > 0.0f && invMass > 0.0f)\n\t{\n\t\tm_springMass = 1.0f / invMass;\n\n\t\tfloat C = b2Dot(d, m_ax);\n\n\t\t// magic formulas\n\t\tfloat h = data.step.dt;\n\t\tm_gamma = h * (m_damping + h * m_stiffness);\n\t\tif (m_gamma > 0.0f)\n\t\t{\n\t\t\tm_gamma = 1.0f / m_gamma;\n\t\t}\n\n\t\tm_bias = C * h * m_stiffness * m_gamma;\n\n\t\tm_springMass = invMass + m_gamma;\n\t\tif (m_springMass > 0.0f)\n\t\t{\n\t\t\tm_springMass = 1.0f / m_springMass;\n\t\t}\n\t}\n\telse\n\t{\n\t\tm_springImpulse = 0.0f;\n\t}\n\n\tif (m_enableLimit)\n\t{\n\t\tm_translation = b2Dot(m_ax, d);\n\t}\n\telse\n\t{\n\t\tm_lowerImpulse = 0.0f;\n\t\tm_upperImpulse = 0.0f;\n\t}\n\n\tif (m_enableMotor)\n\t{\n\t\tm_motorMass = iA + iB;\n\t\tif (m_motorMass > 0.0f)\n\t\t{\n\t\t\tm_motorMass = 1.0f / m_motorMass;\n\t\t}\n\t}\n\telse\n\t{\n\t\tm_motorMass = 0.0f;\n\t\tm_motorImpulse = 0.0f;\n\t}\n\n\tif (data.step.warmStarting)\n\t{\n\t\t// Account for variable time step.\n\t\tm_impulse *= data.step.dtRatio;\n\t\tm_springImpulse *= data.step.dtRatio;\n\t\tm_motorImpulse *= data.step.dtRatio;\n\n\t\tfloat axialImpulse = m_springImpulse + m_lowerImpulse - m_upperImpulse;\n\t\tb2Vec2 P = m_impulse * m_ay + axialImpulse * m_ax;\n\t\tfloat LA = m_impulse * m_sAy + axialImpulse * m_sAx + m_motorImpulse;\n\t\tfloat LB = m_impulse * m_sBy + axialImpulse * m_sBx + m_motorImpulse;\n\n\t\tvA -= m_invMassA * P;\n\t\twA -= m_invIA * LA;\n\n\t\tvB += m_invMassB * P;\n\t\twB += m_invIB * LB;\n\t}\n\telse\n\t{\n\t\tm_impulse = 0.0f;\n\t\tm_springImpulse = 0.0f;\n\t\tm_motorImpulse = 0.0f;\n\t\tm_lowerImpulse = 0.0f;\n\t\tm_upperImpulse = 0.0f;\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nvoid b2WheelJoint::SolveVelocityConstraints(const b2SolverData& data)\n{\n\tfloat mA = m_invMassA, mB = m_invMassB;\n\tfloat iA = m_invIA, iB = m_invIB;\n\n\tb2Vec2 vA = data.velocities[m_indexA].v;\n\tfloat wA = data.velocities[m_indexA].w;\n\tb2Vec2 vB = data.velocities[m_indexB].v;\n\tfloat wB = data.velocities[m_indexB].w;\n\n\t// Solve spring constraint\n\t{\n\t\tfloat Cdot = b2Dot(m_ax, vB - vA) + m_sBx * wB - m_sAx * wA;\n\t\tfloat impulse = -m_springMass * (Cdot + m_bias + m_gamma * m_springImpulse);\n\t\tm_springImpulse += impulse;\n\n\t\tb2Vec2 P = impulse * m_ax;\n\t\tfloat LA = impulse * m_sAx;\n\t\tfloat LB = impulse * m_sBx;\n\n\t\tvA -= mA * P;\n\t\twA -= iA * LA;\n\n\t\tvB += mB * P;\n\t\twB += iB * LB;\n\t}\n\n\t// Solve rotational motor constraint\n\t{\n\t\tfloat Cdot = wB - wA - m_motorSpeed;\n\t\tfloat impulse = -m_motorMass * Cdot;\n\n\t\tfloat oldImpulse = m_motorImpulse;\n\t\tfloat maxImpulse = data.step.dt * m_maxMotorTorque;\n\t\tm_motorImpulse = b2Clamp(m_motorImpulse + impulse, -maxImpulse, maxImpulse);\n\t\timpulse = m_motorImpulse - oldImpulse;\n\n\t\twA -= iA * impulse;\n\t\twB += iB * impulse;\n\t}\n\n\tif (m_enableLimit)\n\t{\n\t\t// Lower limit\n\t\t{\n\t\t\tfloat C = m_translation - m_lowerTranslation;\n\t\t\tfloat Cdot = b2Dot(m_ax, vB - vA) + m_sBx * wB - m_sAx * wA;\n\t\t\tfloat impulse = -m_axialMass * (Cdot + b2Max(C, 0.0f) * data.step.inv_dt);\n\t\t\tfloat oldImpulse = m_lowerImpulse;\n\t\t\tm_lowerImpulse = b2Max(m_lowerImpulse + impulse, 0.0f);\n\t\t\timpulse = m_lowerImpulse - oldImpulse;\n\n\t\t\tb2Vec2 P = impulse * m_ax;\n\t\t\tfloat LA = impulse * m_sAx;\n\t\t\tfloat LB = impulse * m_sBx;\n\n\t\t\tvA -= mA * P;\n\t\t\twA -= iA * LA;\n\t\t\tvB += mB * P;\n\t\t\twB += iB * LB;\n\t\t}\n\n\t\t// Upper limit\n\t\t// Note: signs are flipped to keep C positive when the constraint is satisfied.\n\t\t// This also keeps the impulse positive when the limit is active.\n\t\t{\n\t\t\tfloat C = m_upperTranslation - m_translation;\n\t\t\tfloat Cdot = b2Dot(m_ax, vA - vB) + m_sAx * wA - m_sBx * wB;\n\t\t\tfloat impulse = -m_axialMass * (Cdot + b2Max(C, 0.0f) * data.step.inv_dt);\n\t\t\tfloat oldImpulse = m_upperImpulse;\n\t\t\tm_upperImpulse = b2Max(m_upperImpulse + impulse, 0.0f);\n\t\t\timpulse = m_upperImpulse - oldImpulse;\n\n\t\t\tb2Vec2 P = impulse * m_ax;\n\t\t\tfloat LA = impulse * m_sAx;\n\t\t\tfloat LB = impulse * m_sBx;\n\n\t\t\tvA += mA * P;\n\t\t\twA += iA * LA;\n\t\t\tvB -= mB * P;\n\t\t\twB -= iB * LB;\n\t\t}\n\t}\n\n\t// Solve point to line constraint\n\t{\n\t\tfloat Cdot = b2Dot(m_ay, vB - vA) + m_sBy * wB - m_sAy * wA;\n\t\tfloat impulse = -m_mass * Cdot;\n\t\tm_impulse += impulse;\n\n\t\tb2Vec2 P = impulse * m_ay;\n\t\tfloat LA = impulse * m_sAy;\n\t\tfloat LB = impulse * m_sBy;\n\n\t\tvA -= mA * P;\n\t\twA -= iA * LA;\n\n\t\tvB += mB * P;\n\t\twB += iB * LB;\n\t}\n\n\tdata.velocities[m_indexA].v = vA;\n\tdata.velocities[m_indexA].w = wA;\n\tdata.velocities[m_indexB].v = vB;\n\tdata.velocities[m_indexB].w = wB;\n}\n\nbool b2WheelJoint::SolvePositionConstraints(const b2SolverData& data)\n{\n\tb2Vec2 cA = data.positions[m_indexA].c;\n\tfloat aA = data.positions[m_indexA].a;\n\tb2Vec2 cB = data.positions[m_indexB].c;\n\tfloat aB = data.positions[m_indexB].a;\n\n\tfloat linearError = 0.0f;\n\n\tif (m_enableLimit)\n\t{\n\t\tb2Rot qA(aA), qB(aB);\n\n\t\tb2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\t\tb2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\t\tb2Vec2 d = (cB - cA) + rB - rA;\n\n\t\tb2Vec2 ax = b2Mul(qA, m_localXAxisA);\n\t\tfloat sAx = b2Cross(d + rA, m_ax);\n\t\tfloat sBx = b2Cross(rB, m_ax);\n\n\t\tfloat C = 0.0f;\n\t\tfloat translation = b2Dot(ax, d);\n\t\tif (b2Abs(m_upperTranslation - m_lowerTranslation) < 2.0f * b2_linearSlop)\n\t\t{\n\t\t\tC = translation;\n\t\t}\n\t\telse if (translation <= m_lowerTranslation)\n\t\t{\n\t\t\tC = b2Min(translation - m_lowerTranslation, 0.0f);\n\t\t}\n\t\telse if (translation >= m_upperTranslation)\n\t\t{\n\t\t\tC = b2Max(translation - m_upperTranslation, 0.0f);\n\t\t}\n\n\t\tif (C != 0.0f)\n\t\t{\n\n\t\t\tfloat invMass = m_invMassA + m_invMassB + m_invIA * sAx * sAx + m_invIB * sBx * sBx;\n\t\t\tfloat impulse = 0.0f;\n\t\t\tif (invMass != 0.0f)\n\t\t\t{\n\t\t\t\timpulse = -C / invMass;\n\t\t\t}\n\n\t\t\tb2Vec2 P = impulse * ax;\n\t\t\tfloat LA = impulse * sAx;\n\t\t\tfloat LB = impulse * sBx;\n\n\t\t\tcA -= m_invMassA * P;\n\t\t\taA -= m_invIA * LA;\n\t\t\tcB += m_invMassB * P;\n\t\t\taB += m_invIB * LB;\n\n\t\t\tlinearError = b2Abs(C);\n\t\t}\n\t}\n\n\t// Solve perpendicular constraint\n\t{\n\t\tb2Rot qA(aA), qB(aB);\n\n\t\tb2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA);\n\t\tb2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB);\n\t\tb2Vec2 d = (cB - cA) + rB - rA;\n\n\t\tb2Vec2 ay = b2Mul(qA, m_localYAxisA);\n\n\t\tfloat sAy = b2Cross(d + rA, ay);\n\t\tfloat sBy = b2Cross(rB, ay);\n\n\t\tfloat C = b2Dot(d, ay);\n\n\t\tfloat invMass = m_invMassA + m_invMassB + m_invIA * m_sAy * m_sAy + m_invIB * m_sBy * m_sBy;\n\n\t\tfloat impulse = 0.0f;\n\t\tif (invMass != 0.0f)\n\t\t{\n\t\t\timpulse = - C / invMass;\n\t\t}\n\n\t\tb2Vec2 P = impulse * ay;\n\t\tfloat LA = impulse * sAy;\n\t\tfloat LB = impulse * sBy;\n\n\t\tcA -= m_invMassA * P;\n\t\taA -= m_invIA * LA;\n\t\tcB += m_invMassB * P;\n\t\taB += m_invIB * LB;\n\n\t\tlinearError = b2Max(linearError, b2Abs(C));\n\t}\n\n\tdata.positions[m_indexA].c = cA;\n\tdata.positions[m_indexA].a = aA;\n\tdata.positions[m_indexB].c = cB;\n\tdata.positions[m_indexB].a = aB;\n\n\treturn linearError <= b2_linearSlop;\n}\n\nb2Vec2 b2WheelJoint::GetAnchorA() const\n{\n\treturn m_bodyA->GetWorldPoint(m_localAnchorA);\n}\n\nb2Vec2 b2WheelJoint::GetAnchorB() const\n{\n\treturn m_bodyB->GetWorldPoint(m_localAnchorB);\n}\n\nb2Vec2 b2WheelJoint::GetReactionForce(float inv_dt) const\n{\n\treturn inv_dt * (m_impulse * m_ay + (m_springImpulse + m_lowerImpulse - m_upperImpulse) * m_ax);\n}\n\nfloat b2WheelJoint::GetReactionTorque(float inv_dt) const\n{\n\treturn inv_dt * m_motorImpulse;\n}\n\nfloat b2WheelJoint::GetJointTranslation() const\n{\n\tb2Body* bA = m_bodyA;\n\tb2Body* bB = m_bodyB;\n\n\tb2Vec2 pA = bA->GetWorldPoint(m_localAnchorA);\n\tb2Vec2 pB = bB->GetWorldPoint(m_localAnchorB);\n\tb2Vec2 d = pB - pA;\n\tb2Vec2 axis = bA->GetWorldVector(m_localXAxisA);\n\n\tfloat translation = b2Dot(d, axis);\n\treturn translation;\n}\n\nfloat b2WheelJoint::GetJointLinearSpeed() const\n{\n\tb2Body* bA = m_bodyA;\n\tb2Body* bB = m_bodyB;\n\n\tb2Vec2 rA = b2Mul(bA->m_xf.q, m_localAnchorA - bA->m_sweep.localCenter);\n\tb2Vec2 rB = b2Mul(bB->m_xf.q, m_localAnchorB - bB->m_sweep.localCenter);\n\tb2Vec2 p1 = bA->m_sweep.c + rA;\n\tb2Vec2 p2 = bB->m_sweep.c + rB;\n\tb2Vec2 d = p2 - p1;\n\tb2Vec2 axis = b2Mul(bA->m_xf.q, m_localXAxisA);\n\n\tb2Vec2 vA = bA->m_linearVelocity;\n\tb2Vec2 vB = bB->m_linearVelocity;\n\tfloat wA = bA->m_angularVelocity;\n\tfloat wB = bB->m_angularVelocity;\n\n\tfloat speed = b2Dot(d, b2Cross(wA, axis)) + b2Dot(axis, vB + b2Cross(wB, rB) - vA - b2Cross(wA, rA));\n\treturn speed;\n}\n\nfloat b2WheelJoint::GetJointAngle() const\n{\n\tb2Body* bA = m_bodyA;\n\tb2Body* bB = m_bodyB;\n\treturn bB->m_sweep.a - bA->m_sweep.a;\n}\n\nfloat b2WheelJoint::GetJointAngularSpeed() const\n{\n\tfloat wA = m_bodyA->m_angularVelocity;\n\tfloat wB = m_bodyB->m_angularVelocity;\n\treturn wB - wA;\n}\n\nbool b2WheelJoint::IsLimitEnabled() const\n{\n\treturn m_enableLimit;\n}\n\nvoid b2WheelJoint::EnableLimit(bool flag)\n{\n\tif (flag != m_enableLimit)\n\t{\n\t\tm_bodyA->SetAwake(true);\n\t\tm_bodyB->SetAwake(true);\n\t\tm_enableLimit = flag;\n\t\tm_lowerImpulse = 0.0f;\n\t\tm_upperImpulse = 0.0f;\n\t}\n}\n\nfloat b2WheelJoint::GetLowerLimit() const\n{\n\treturn m_lowerTranslation;\n}\n\nfloat b2WheelJoint::GetUpperLimit() const\n{\n\treturn m_upperTranslation;\n}\n\nvoid b2WheelJoint::SetLimits(float lower, float upper)\n{\n\tb2Assert(lower <= upper);\n\tif (lower != m_lowerTranslation || upper != m_upperTranslation)\n\t{\n\t\tm_bodyA->SetAwake(true);\n\t\tm_bodyB->SetAwake(true);\n\t\tm_lowerTranslation = lower;\n\t\tm_upperTranslation = upper;\n\t\tm_lowerImpulse = 0.0f;\n\t\tm_upperImpulse = 0.0f;\n\t}\n}\n\nbool b2WheelJoint::IsMotorEnabled() const\n{\n\treturn m_enableMotor;\n}\n\nvoid b2WheelJoint::EnableMotor(bool flag)\n{\n\tif (flag != m_enableMotor)\n\t{\n\t\tm_bodyA->SetAwake(true);\n\t\tm_bodyB->SetAwake(true);\n\t\tm_enableMotor = flag;\n\t}\n}\n\nvoid b2WheelJoint::SetMotorSpeed(float speed)\n{\n\tif (speed != m_motorSpeed)\n\t{\n\t\tm_bodyA->SetAwake(true);\n\t\tm_bodyB->SetAwake(true);\n\t\tm_motorSpeed = speed;\n\t}\n}\n\nvoid b2WheelJoint::SetMaxMotorTorque(float torque)\n{\n\tif (torque != m_maxMotorTorque)\n\t{\n\t\tm_bodyA->SetAwake(true);\n\t\tm_bodyB->SetAwake(true);\n\t\tm_maxMotorTorque = torque;\n\t}\n}\n\nfloat b2WheelJoint::GetMotorTorque(float inv_dt) const\n{\n\treturn inv_dt * m_motorImpulse;\n}\n\nvoid b2WheelJoint::SetStiffness(float stiffness)\n{\n\tm_stiffness = stiffness;\n}\n\nfloat b2WheelJoint::GetStiffness() const\n{\n\treturn m_stiffness;\n}\n\nvoid b2WheelJoint::SetDamping(float damping)\n{\n\tm_damping = damping;\n}\n\nfloat b2WheelJoint::GetDamping() const\n{\n\treturn m_damping;\n}\n\nvoid b2WheelJoint::Dump()\n{\n\t// FLT_DECIMAL_DIG == 9\n\n\tint32 indexA = m_bodyA->m_islandIndex;\n\tint32 indexB = m_bodyB->m_islandIndex;\n\n\tb2Dump(\"  b2WheelJointDef jd;\\n\");\n\tb2Dump(\"  jd.bodyA = bodies[%d];\\n\", indexA);\n\tb2Dump(\"  jd.bodyB = bodies[%d];\\n\", indexB);\n\tb2Dump(\"  jd.collideConnected = bool(%d);\\n\", m_collideConnected);\n\tb2Dump(\"  jd.localAnchorA.Set(%.9g, %.9g);\\n\", m_localAnchorA.x, m_localAnchorA.y);\n\tb2Dump(\"  jd.localAnchorB.Set(%.9g, %.9g);\\n\", m_localAnchorB.x, m_localAnchorB.y);\n\tb2Dump(\"  jd.localAxisA.Set(%.9g, %.9g);\\n\", m_localXAxisA.x, m_localXAxisA.y);\n\tb2Dump(\"  jd.enableMotor = bool(%d);\\n\", m_enableMotor);\n\tb2Dump(\"  jd.motorSpeed = %.9g;\\n\", m_motorSpeed);\n\tb2Dump(\"  jd.maxMotorTorque = %.9g;\\n\", m_maxMotorTorque);\n\tb2Dump(\"  jd.stiffness = %.9g;\\n\", m_stiffness);\n\tb2Dump(\"  jd.damping = %.9g;\\n\", m_damping);\n\tb2Dump(\"  joints[%d] = m_world->CreateJoint(&jd);\\n\", m_index);\n}\n\n///\nvoid b2WheelJoint::Draw(b2Draw* draw) const\n{\n\tconst b2Transform& xfA = m_bodyA->GetTransform();\n\tconst b2Transform& xfB = m_bodyB->GetTransform();\n\tb2Vec2 pA = b2Mul(xfA, m_localAnchorA);\n\tb2Vec2 pB = b2Mul(xfB, m_localAnchorB);\n\n\tb2Vec2 axis = b2Mul(xfA.q, m_localXAxisA);\n\n\tb2Color c1(0.7f, 0.7f, 0.7f);\n\tb2Color c2(0.3f, 0.9f, 0.3f);\n\tb2Color c3(0.9f, 0.3f, 0.3f);\n\tb2Color c4(0.3f, 0.3f, 0.9f);\n\tb2Color c5(0.4f, 0.4f, 0.4f);\n\n\tdraw->DrawSegment(pA, pB, c5);\n\n\tif (m_enableLimit)\n\t{\n\t\tb2Vec2 lower = pA + m_lowerTranslation * axis;\n\t\tb2Vec2 upper = pA + m_upperTranslation * axis;\n\t\tb2Vec2 perp = b2Mul(xfA.q, m_localYAxisA);\n\t\tdraw->DrawSegment(lower, upper, c1);\n\t\tdraw->DrawSegment(lower - 0.5f * perp, lower + 0.5f * perp, c2);\n\t\tdraw->DrawSegment(upper - 0.5f * perp, upper + 0.5f * perp, c3);\n\t}\n\telse\n\t{\n\t\tdraw->DrawSegment(pA - 1.0f * axis, pA + 1.0f * axis, c1);\n\t}\n\n\tdraw->DrawPoint(pA, 5.0f, c1);\n\tdraw->DrawPoint(pB, 5.0f, c4);\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_world.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"b2_contact_solver.h\"\n#include \"b2_island.h\"\n\n#include \"box2d/b2_body.h\"\n#include \"box2d/b2_broad_phase.h\"\n#include \"box2d/b2_chain_shape.h\"\n#include \"box2d/b2_circle_shape.h\"\n#include \"box2d/b2_collision.h\"\n#include \"box2d/b2_contact.h\"\n#include \"box2d/b2_draw.h\"\n#include \"box2d/b2_edge_shape.h\"\n#include \"box2d/b2_fixture.h\"\n#include \"box2d/b2_polygon_shape.h\"\n#include \"box2d/b2_pulley_joint.h\"\n#include \"box2d/b2_time_of_impact.h\"\n#include \"box2d/b2_timer.h\"\n#include \"box2d/b2_world.h\"\n\n#include <new>\n\nb2World::b2World(const b2Vec2& gravity)\n{\n\tm_destructionListener = nullptr;\n\tm_debugDraw = nullptr;\n\n\tm_bodyList = nullptr;\n\tm_jointList = nullptr;\n\n\tm_bodyCount = 0;\n\tm_jointCount = 0;\n\n\tm_warmStarting = true;\n\tm_continuousPhysics = true;\n\tm_subStepping = false;\n\n\tm_stepComplete = true;\n\n\tm_allowSleep = true;\n\tm_gravity = gravity;\n\n\tm_newContacts = false;\n\tm_locked = false;\n\tm_clearForces = true;\n\n\tm_inv_dt0 = 0.0f;\n\n\tm_contactManager.m_allocator = &m_blockAllocator;\n\n\tmemset(&m_profile, 0, sizeof(b2Profile));\n}\n\nb2World::~b2World()\n{\n\t// Some shapes allocate using b2Alloc.\n\tb2Body* b = m_bodyList;\n\twhile (b)\n\t{\n\t\tb2Body* bNext = b->m_next;\n\n\t\tb2Fixture* f = b->m_fixtureList;\n\t\twhile (f)\n\t\t{\n\t\t\tb2Fixture* fNext = f->m_next;\n\t\t\tf->m_proxyCount = 0;\n\t\t\tf->Destroy(&m_blockAllocator);\n\t\t\tf = fNext;\n\t\t}\n\n\t\tb = bNext;\n\t}\n}\n\nvoid b2World::SetDestructionListener(b2DestructionListener* listener)\n{\n\tm_destructionListener = listener;\n}\n\nvoid b2World::SetContactFilter(b2ContactFilter* filter)\n{\n\tm_contactManager.m_contactFilter = filter;\n}\n\nvoid b2World::SetContactListener(b2ContactListener* listener)\n{\n\tm_contactManager.m_contactListener = listener;\n}\n\nvoid b2World::SetDebugDraw(b2Draw* debugDraw)\n{\n\tm_debugDraw = debugDraw;\n}\n\nb2Body* b2World::CreateBody(const b2BodyDef* def)\n{\n\tb2Assert(IsLocked() == false);\n\tif (IsLocked())\n\t{\n\t\treturn nullptr;\n\t}\n\n\tvoid* mem = m_blockAllocator.Allocate(sizeof(b2Body));\n\tb2Body* b = new (mem) b2Body(def, this);\n\n\t// Add to world doubly linked list.\n\tb->m_prev = nullptr;\n\tb->m_next = m_bodyList;\n\tif (m_bodyList)\n\t{\n\t\tm_bodyList->m_prev = b;\n\t}\n\tm_bodyList = b;\n\t++m_bodyCount;\n\n\treturn b;\n}\n\nvoid b2World::DestroyBody(b2Body* b)\n{\n\tb2Assert(m_bodyCount > 0);\n\tb2Assert(IsLocked() == false);\n\tif (IsLocked())\n\t{\n\t\treturn;\n\t}\n\n\t// Delete the attached joints.\n\tb2JointEdge* je = b->m_jointList;\n\twhile (je)\n\t{\n\t\tb2JointEdge* je0 = je;\n\t\tje = je->next;\n\n\t\tif (m_destructionListener)\n\t\t{\n\t\t\tm_destructionListener->SayGoodbye(je0->joint);\n\t\t}\n\n\t\tDestroyJoint(je0->joint);\n\n\t\tb->m_jointList = je;\n\t}\n\tb->m_jointList = nullptr;\n\n\t// Delete the attached contacts.\n\tb2ContactEdge* ce = b->m_contactList;\n\twhile (ce)\n\t{\n\t\tb2ContactEdge* ce0 = ce;\n\t\tce = ce->next;\n\t\tm_contactManager.Destroy(ce0->contact);\n\t}\n\tb->m_contactList = nullptr;\n\n\t// Delete the attached fixtures. This destroys broad-phase proxies.\n\tb2Fixture* f = b->m_fixtureList;\n\twhile (f)\n\t{\n\t\tb2Fixture* f0 = f;\n\t\tf = f->m_next;\n\n\t\tif (m_destructionListener)\n\t\t{\n\t\t\tm_destructionListener->SayGoodbye(f0);\n\t\t}\n\n\t\tf0->DestroyProxies(&m_contactManager.m_broadPhase);\n\t\tf0->Destroy(&m_blockAllocator);\n\t\tf0->~b2Fixture();\n\t\tm_blockAllocator.Free(f0, sizeof(b2Fixture));\n\n\t\tb->m_fixtureList = f;\n\t\tb->m_fixtureCount -= 1;\n\t}\n\tb->m_fixtureList = nullptr;\n\tb->m_fixtureCount = 0;\n\n\t// Remove world body list.\n\tif (b->m_prev)\n\t{\n\t\tb->m_prev->m_next = b->m_next;\n\t}\n\n\tif (b->m_next)\n\t{\n\t\tb->m_next->m_prev = b->m_prev;\n\t}\n\n\tif (b == m_bodyList)\n\t{\n\t\tm_bodyList = b->m_next;\n\t}\n\n\t--m_bodyCount;\n\tb->~b2Body();\n\tm_blockAllocator.Free(b, sizeof(b2Body));\n}\n\nb2Joint* b2World::CreateJoint(const b2JointDef* def)\n{\n\tb2Assert(IsLocked() == false);\n\tif (IsLocked())\n\t{\n\t\treturn nullptr;\n\t}\n\n\tb2Joint* j = b2Joint::Create(def, &m_blockAllocator);\n\n\t// Connect to the world list.\n\tj->m_prev = nullptr;\n\tj->m_next = m_jointList;\n\tif (m_jointList)\n\t{\n\t\tm_jointList->m_prev = j;\n\t}\n\tm_jointList = j;\n\t++m_jointCount;\n\n\t// Connect to the bodies' doubly linked lists.\n\tj->m_edgeA.joint = j;\n\tj->m_edgeA.other = j->m_bodyB;\n\tj->m_edgeA.prev = nullptr;\n\tj->m_edgeA.next = j->m_bodyA->m_jointList;\n\tif (j->m_bodyA->m_jointList) j->m_bodyA->m_jointList->prev = &j->m_edgeA;\n\tj->m_bodyA->m_jointList = &j->m_edgeA;\n\n\tj->m_edgeB.joint = j;\n\tj->m_edgeB.other = j->m_bodyA;\n\tj->m_edgeB.prev = nullptr;\n\tj->m_edgeB.next = j->m_bodyB->m_jointList;\n\tif (j->m_bodyB->m_jointList) j->m_bodyB->m_jointList->prev = &j->m_edgeB;\n\tj->m_bodyB->m_jointList = &j->m_edgeB;\n\n\tb2Body* bodyA = def->bodyA;\n\tb2Body* bodyB = def->bodyB;\n\n\t// If the joint prevents collisions, then flag any contacts for filtering.\n\tif (def->collideConnected == false)\n\t{\n\t\tb2ContactEdge* edge = bodyB->GetContactList();\n\t\twhile (edge)\n\t\t{\n\t\t\tif (edge->other == bodyA)\n\t\t\t{\n\t\t\t\t// Flag the contact for filtering at the next time step (where either\n\t\t\t\t// body is awake).\n\t\t\t\tedge->contact->FlagForFiltering();\n\t\t\t}\n\n\t\t\tedge = edge->next;\n\t\t}\n\t}\n\n\t// Note: creating a joint doesn't wake the bodies.\n\n\treturn j;\n}\n\nvoid b2World::DestroyJoint(b2Joint* j)\n{\n\tb2Assert(IsLocked() == false);\n\tif (IsLocked())\n\t{\n\t\treturn;\n\t}\n\n\tbool collideConnected = j->m_collideConnected;\n\n\t// Remove from the doubly linked list.\n\tif (j->m_prev)\n\t{\n\t\tj->m_prev->m_next = j->m_next;\n\t}\n\n\tif (j->m_next)\n\t{\n\t\tj->m_next->m_prev = j->m_prev;\n\t}\n\n\tif (j == m_jointList)\n\t{\n\t\tm_jointList = j->m_next;\n\t}\n\n\t// Disconnect from island graph.\n\tb2Body* bodyA = j->m_bodyA;\n\tb2Body* bodyB = j->m_bodyB;\n\n\t// Wake up connected bodies.\n\tbodyA->SetAwake(true);\n\tbodyB->SetAwake(true);\n\n\t// Remove from body 1.\n\tif (j->m_edgeA.prev)\n\t{\n\t\tj->m_edgeA.prev->next = j->m_edgeA.next;\n\t}\n\n\tif (j->m_edgeA.next)\n\t{\n\t\tj->m_edgeA.next->prev = j->m_edgeA.prev;\n\t}\n\n\tif (&j->m_edgeA == bodyA->m_jointList)\n\t{\n\t\tbodyA->m_jointList = j->m_edgeA.next;\n\t}\n\n\tj->m_edgeA.prev = nullptr;\n\tj->m_edgeA.next = nullptr;\n\n\t// Remove from body 2\n\tif (j->m_edgeB.prev)\n\t{\n\t\tj->m_edgeB.prev->next = j->m_edgeB.next;\n\t}\n\n\tif (j->m_edgeB.next)\n\t{\n\t\tj->m_edgeB.next->prev = j->m_edgeB.prev;\n\t}\n\n\tif (&j->m_edgeB == bodyB->m_jointList)\n\t{\n\t\tbodyB->m_jointList = j->m_edgeB.next;\n\t}\n\n\tj->m_edgeB.prev = nullptr;\n\tj->m_edgeB.next = nullptr;\n\n\tb2Joint::Destroy(j, &m_blockAllocator);\n\n\tb2Assert(m_jointCount > 0);\n\t--m_jointCount;\n\n\t// If the joint prevents collisions, then flag any contacts for filtering.\n\tif (collideConnected == false)\n\t{\n\t\tb2ContactEdge* edge = bodyB->GetContactList();\n\t\twhile (edge)\n\t\t{\n\t\t\tif (edge->other == bodyA)\n\t\t\t{\n\t\t\t\t// Flag the contact for filtering at the next time step (where either\n\t\t\t\t// body is awake).\n\t\t\t\tedge->contact->FlagForFiltering();\n\t\t\t}\n\n\t\t\tedge = edge->next;\n\t\t}\n\t}\n}\n\n//\nvoid b2World::SetAllowSleeping(bool flag)\n{\n\tif (flag == m_allowSleep)\n\t{\n\t\treturn;\n\t}\n\n\tm_allowSleep = flag;\n\tif (m_allowSleep == false)\n\t{\n\t\tfor (b2Body* b = m_bodyList; b; b = b->m_next)\n\t\t{\n\t\t\tb->SetAwake(true);\n\t\t}\n\t}\n}\n\n// Find islands, integrate and solve constraints, solve position constraints\nvoid b2World::Solve(const b2TimeStep& step)\n{\n\tm_profile.solveInit = 0.0f;\n\tm_profile.solveVelocity = 0.0f;\n\tm_profile.solvePosition = 0.0f;\n\n\t// Size the island for the worst case.\n\tb2Island island(m_bodyCount,\n\t\t\t\t\tm_contactManager.m_contactCount,\n\t\t\t\t\tm_jointCount,\n\t\t\t\t\t&m_stackAllocator,\n\t\t\t\t\tm_contactManager.m_contactListener);\n\n\t// Clear all the island flags.\n\tfor (b2Body* b = m_bodyList; b; b = b->m_next)\n\t{\n\t\tb->m_flags &= ~b2Body::e_islandFlag;\n\t}\n\tfor (b2Contact* c = m_contactManager.m_contactList; c; c = c->m_next)\n\t{\n\t\tc->m_flags &= ~b2Contact::e_islandFlag;\n\t}\n\tfor (b2Joint* j = m_jointList; j; j = j->m_next)\n\t{\n\t\tj->m_islandFlag = false;\n\t}\n\n\t// Build and simulate all awake islands.\n\tint32 stackSize = m_bodyCount;\n\tb2Body** stack = (b2Body**)m_stackAllocator.Allocate(stackSize * sizeof(b2Body*));\n\tfor (b2Body* seed = m_bodyList; seed; seed = seed->m_next)\n\t{\n\t\tif (seed->m_flags & b2Body::e_islandFlag)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (seed->IsAwake() == false || seed->IsEnabled() == false)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// The seed can be dynamic or kinematic.\n\t\tif (seed->GetType() == b2_staticBody)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Reset island and stack.\n\t\tisland.Clear();\n\t\tint32 stackCount = 0;\n\t\tstack[stackCount++] = seed;\n\t\tseed->m_flags |= b2Body::e_islandFlag;\n\n\t\t// Perform a depth first search (DFS) on the constraint graph.\n\t\twhile (stackCount > 0)\n\t\t{\n\t\t\t// Grab the next body off the stack and add it to the island.\n\t\t\tb2Body* b = stack[--stackCount];\n\t\t\tb2Assert(b->IsEnabled() == true);\n\t\t\tisland.Add(b);\n\n\t\t\t// To keep islands as small as possible, we don't\n\t\t\t// propagate islands across static bodies.\n\t\t\tif (b->GetType() == b2_staticBody)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Make sure the body is awake (without resetting sleep timer).\n\t\t\tb->m_flags |= b2Body::e_awakeFlag;\n\n\t\t\t// Search all contacts connected to this body.\n\t\t\tfor (b2ContactEdge* ce = b->m_contactList; ce; ce = ce->next)\n\t\t\t{\n\t\t\t\tb2Contact* contact = ce->contact;\n\n\t\t\t\t// Has this contact already been added to an island?\n\t\t\t\tif (contact->m_flags & b2Contact::e_islandFlag)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Is this contact solid and touching?\n\t\t\t\tif (contact->IsEnabled() == false ||\n\t\t\t\t\tcontact->IsTouching() == false)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Skip sensors.\n\t\t\t\tbool sensorA = contact->m_fixtureA->m_isSensor;\n\t\t\t\tbool sensorB = contact->m_fixtureB->m_isSensor;\n\t\t\t\tif (sensorA || sensorB)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tisland.Add(contact);\n\t\t\t\tcontact->m_flags |= b2Contact::e_islandFlag;\n\n\t\t\t\tb2Body* other = ce->other;\n\n\t\t\t\t// Was the other body already added to this island?\n\t\t\t\tif (other->m_flags & b2Body::e_islandFlag)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tb2Assert(stackCount < stackSize);\n\t\t\t\tstack[stackCount++] = other;\n\t\t\t\tother->m_flags |= b2Body::e_islandFlag;\n\t\t\t}\n\n\t\t\t// Search all joints connect to this body.\n\t\t\tfor (b2JointEdge* je = b->m_jointList; je; je = je->next)\n\t\t\t{\n\t\t\t\tif (je->joint->m_islandFlag == true)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tb2Body* other = je->other;\n\n\t\t\t\t// Don't simulate joints connected to diabled bodies.\n\t\t\t\tif (other->IsEnabled() == false)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tisland.Add(je->joint);\n\t\t\t\tje->joint->m_islandFlag = true;\n\n\t\t\t\tif (other->m_flags & b2Body::e_islandFlag)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tb2Assert(stackCount < stackSize);\n\t\t\t\tstack[stackCount++] = other;\n\t\t\t\tother->m_flags |= b2Body::e_islandFlag;\n\t\t\t}\n\t\t}\n\n\t\tb2Profile profile;\n\t\tisland.Solve(&profile, step, m_gravity, m_allowSleep);\n\t\tm_profile.solveInit += profile.solveInit;\n\t\tm_profile.solveVelocity += profile.solveVelocity;\n\t\tm_profile.solvePosition += profile.solvePosition;\n\n\t\t// Post solve cleanup.\n\t\tfor (int32 i = 0; i < island.m_bodyCount; ++i)\n\t\t{\n\t\t\t// Allow static bodies to participate in other islands.\n\t\t\tb2Body* b = island.m_bodies[i];\n\t\t\tif (b->GetType() == b2_staticBody)\n\t\t\t{\n\t\t\t\tb->m_flags &= ~b2Body::e_islandFlag;\n\t\t\t}\n\t\t}\n\t}\n\n\tm_stackAllocator.Free(stack);\n\n\t{\n\t\tb2Timer timer;\n\t\t// Synchronize fixtures, check for out of range bodies.\n\t\tfor (b2Body* b = m_bodyList; b; b = b->GetNext())\n\t\t{\n\t\t\t// If a body was not in an island then it did not move.\n\t\t\tif ((b->m_flags & b2Body::e_islandFlag) == 0)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (b->GetType() == b2_staticBody)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Update fixtures (for broad-phase).\n\t\t\tb->SynchronizeFixtures();\n\t\t}\n\n\t\t// Look for new contacts.\n\t\tm_contactManager.FindNewContacts();\n\t\tm_profile.broadphase = timer.GetMilliseconds();\n\t}\n}\n\n// Find TOI contacts and solve them.\nvoid b2World::SolveTOI(const b2TimeStep& step)\n{\n\tb2Island island(2 * b2_maxTOIContacts, b2_maxTOIContacts, 0, &m_stackAllocator, m_contactManager.m_contactListener);\n\n\tif (m_stepComplete)\n\t{\n\t\tfor (b2Body* b = m_bodyList; b; b = b->m_next)\n\t\t{\n\t\t\tb->m_flags &= ~b2Body::e_islandFlag;\n\t\t\tb->m_sweep.alpha0 = 0.0f;\n\t\t}\n\n\t\tfor (b2Contact* c = m_contactManager.m_contactList; c; c = c->m_next)\n\t\t{\n\t\t\t// Invalidate TOI\n\t\t\tc->m_flags &= ~(b2Contact::e_toiFlag | b2Contact::e_islandFlag);\n\t\t\tc->m_toiCount = 0;\n\t\t\tc->m_toi = 1.0f;\n\t\t}\n\t}\n\n\t// Find TOI events and solve them.\n\tfor (;;)\n\t{\n\t\t// Find the first TOI.\n\t\tb2Contact* minContact = nullptr;\n\t\tfloat minAlpha = 1.0f;\n\n\t\tfor (b2Contact* c = m_contactManager.m_contactList; c; c = c->m_next)\n\t\t{\n\t\t\t// Is this contact disabled?\n\t\t\tif (c->IsEnabled() == false)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Prevent excessive sub-stepping.\n\t\t\tif (c->m_toiCount > b2_maxSubSteps)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfloat alpha = 1.0f;\n\t\t\tif (c->m_flags & b2Contact::e_toiFlag)\n\t\t\t{\n\t\t\t\t// This contact has a valid cached TOI.\n\t\t\t\talpha = c->m_toi;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tb2Fixture* fA = c->GetFixtureA();\n\t\t\t\tb2Fixture* fB = c->GetFixtureB();\n\n\t\t\t\t// Is there a sensor?\n\t\t\t\tif (fA->IsSensor() || fB->IsSensor())\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tb2Body* bA = fA->GetBody();\n\t\t\t\tb2Body* bB = fB->GetBody();\n\n\t\t\t\tb2BodyType typeA = bA->m_type;\n\t\t\t\tb2BodyType typeB = bB->m_type;\n\t\t\t\tb2Assert(typeA == b2_dynamicBody || typeB == b2_dynamicBody);\n\n\t\t\t\tbool activeA = bA->IsAwake() && typeA != b2_staticBody;\n\t\t\t\tbool activeB = bB->IsAwake() && typeB != b2_staticBody;\n\n\t\t\t\t// Is at least one body active (awake and dynamic or kinematic)?\n\t\t\t\tif (activeA == false && activeB == false)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tbool collideA = bA->IsBullet() || typeA != b2_dynamicBody;\n\t\t\t\tbool collideB = bB->IsBullet() || typeB != b2_dynamicBody;\n\n\t\t\t\t// Are these two non-bullet dynamic bodies?\n\t\t\t\tif (collideA == false && collideB == false)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Compute the TOI for this contact.\n\t\t\t\t// Put the sweeps onto the same time interval.\n\t\t\t\tfloat alpha0 = bA->m_sweep.alpha0;\n\n\t\t\t\tif (bA->m_sweep.alpha0 < bB->m_sweep.alpha0)\n\t\t\t\t{\n\t\t\t\t\talpha0 = bB->m_sweep.alpha0;\n\t\t\t\t\tbA->m_sweep.Advance(alpha0);\n\t\t\t\t}\n\t\t\t\telse if (bB->m_sweep.alpha0 < bA->m_sweep.alpha0)\n\t\t\t\t{\n\t\t\t\t\talpha0 = bA->m_sweep.alpha0;\n\t\t\t\t\tbB->m_sweep.Advance(alpha0);\n\t\t\t\t}\n\n\t\t\t\tb2Assert(alpha0 < 1.0f);\n\n\t\t\t\tint32 indexA = c->GetChildIndexA();\n\t\t\t\tint32 indexB = c->GetChildIndexB();\n\n\t\t\t\t// Compute the time of impact in interval [0, minTOI]\n\t\t\t\tb2TOIInput input;\n\t\t\t\tinput.proxyA.Set(fA->GetShape(), indexA);\n\t\t\t\tinput.proxyB.Set(fB->GetShape(), indexB);\n\t\t\t\tinput.sweepA = bA->m_sweep;\n\t\t\t\tinput.sweepB = bB->m_sweep;\n\t\t\t\tinput.tMax = 1.0f;\n\n\t\t\t\tb2TOIOutput output;\n\t\t\t\tb2TimeOfImpact(&output, &input);\n\n\t\t\t\t// Beta is the fraction of the remaining portion of the .\n\t\t\t\tfloat beta = output.t;\n\t\t\t\tif (output.state == b2TOIOutput::e_touching)\n\t\t\t\t{\n\t\t\t\t\talpha = b2Min(alpha0 + (1.0f - alpha0) * beta, 1.0f);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\talpha = 1.0f;\n\t\t\t\t}\n\n\t\t\t\tc->m_toi = alpha;\n\t\t\t\tc->m_flags |= b2Contact::e_toiFlag;\n\t\t\t}\n\n\t\t\tif (alpha < minAlpha)\n\t\t\t{\n\t\t\t\t// This is the minimum TOI found so far.\n\t\t\t\tminContact = c;\n\t\t\t\tminAlpha = alpha;\n\t\t\t}\n\t\t}\n\n\t\tif (minContact == nullptr || 1.0f - 10.0f * b2_epsilon < minAlpha)\n\t\t{\n\t\t\t// No more TOI events. Done!\n\t\t\tm_stepComplete = true;\n\t\t\tbreak;\n\t\t}\n\n\t\t// Advance the bodies to the TOI.\n\t\tb2Fixture* fA = minContact->GetFixtureA();\n\t\tb2Fixture* fB = minContact->GetFixtureB();\n\t\tb2Body* bA = fA->GetBody();\n\t\tb2Body* bB = fB->GetBody();\n\n\t\tb2Sweep backup1 = bA->m_sweep;\n\t\tb2Sweep backup2 = bB->m_sweep;\n\n\t\tbA->Advance(minAlpha);\n\t\tbB->Advance(minAlpha);\n\n\t\t// The TOI contact likely has some new contact points.\n\t\tminContact->Update(m_contactManager.m_contactListener);\n\t\tminContact->m_flags &= ~b2Contact::e_toiFlag;\n\t\t++minContact->m_toiCount;\n\n\t\t// Is the contact solid?\n\t\tif (minContact->IsEnabled() == false || minContact->IsTouching() == false)\n\t\t{\n\t\t\t// Restore the sweeps.\n\t\t\tminContact->SetEnabled(false);\n\t\t\tbA->m_sweep = backup1;\n\t\t\tbB->m_sweep = backup2;\n\t\t\tbA->SynchronizeTransform();\n\t\t\tbB->SynchronizeTransform();\n\t\t\tcontinue;\n\t\t}\n\n\t\tbA->SetAwake(true);\n\t\tbB->SetAwake(true);\n\n\t\t// Build the island\n\t\tisland.Clear();\n\t\tisland.Add(bA);\n\t\tisland.Add(bB);\n\t\tisland.Add(minContact);\n\n\t\tbA->m_flags |= b2Body::e_islandFlag;\n\t\tbB->m_flags |= b2Body::e_islandFlag;\n\t\tminContact->m_flags |= b2Contact::e_islandFlag;\n\n\t\t// Get contacts on bodyA and bodyB.\n\t\tb2Body* bodies[2] = {bA, bB};\n\t\tfor (int32 i = 0; i < 2; ++i)\n\t\t{\n\t\t\tb2Body* body = bodies[i];\n\t\t\tif (body->m_type == b2_dynamicBody)\n\t\t\t{\n\t\t\t\tfor (b2ContactEdge* ce = body->m_contactList; ce; ce = ce->next)\n\t\t\t\t{\n\t\t\t\t\tif (island.m_bodyCount == island.m_bodyCapacity)\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (island.m_contactCount == island.m_contactCapacity)\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tb2Contact* contact = ce->contact;\n\n\t\t\t\t\t// Has this contact already been added to the island?\n\t\t\t\t\tif (contact->m_flags & b2Contact::e_islandFlag)\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only add static, kinematic, or bullet bodies.\n\t\t\t\t\tb2Body* other = ce->other;\n\t\t\t\t\tif (other->m_type == b2_dynamicBody &&\n\t\t\t\t\t\tbody->IsBullet() == false && other->IsBullet() == false)\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Skip sensors.\n\t\t\t\t\tbool sensorA = contact->m_fixtureA->m_isSensor;\n\t\t\t\t\tbool sensorB = contact->m_fixtureB->m_isSensor;\n\t\t\t\t\tif (sensorA || sensorB)\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Tentatively advance the body to the TOI.\n\t\t\t\t\tb2Sweep backup = other->m_sweep;\n\t\t\t\t\tif ((other->m_flags & b2Body::e_islandFlag) == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tother->Advance(minAlpha);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Update the contact points\n\t\t\t\t\tcontact->Update(m_contactManager.m_contactListener);\n\n\t\t\t\t\t// Was the contact disabled by the user?\n\t\t\t\t\tif (contact->IsEnabled() == false)\n\t\t\t\t\t{\n\t\t\t\t\t\tother->m_sweep = backup;\n\t\t\t\t\t\tother->SynchronizeTransform();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Are there contact points?\n\t\t\t\t\tif (contact->IsTouching() == false)\n\t\t\t\t\t{\n\t\t\t\t\t\tother->m_sweep = backup;\n\t\t\t\t\t\tother->SynchronizeTransform();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Add the contact to the island\n\t\t\t\t\tcontact->m_flags |= b2Contact::e_islandFlag;\n\t\t\t\t\tisland.Add(contact);\n\n\t\t\t\t\t// Has the other body already been added to the island?\n\t\t\t\t\tif (other->m_flags & b2Body::e_islandFlag)\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Add the other body to the island.\n\t\t\t\t\tother->m_flags |= b2Body::e_islandFlag;\n\n\t\t\t\t\tif (other->m_type != b2_staticBody)\n\t\t\t\t\t{\n\t\t\t\t\t\tother->SetAwake(true);\n\t\t\t\t\t}\n\n\t\t\t\t\tisland.Add(other);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tb2TimeStep subStep;\n\t\tsubStep.dt = (1.0f - minAlpha) * step.dt;\n\t\tsubStep.inv_dt = 1.0f / subStep.dt;\n\t\tsubStep.dtRatio = 1.0f;\n\t\tsubStep.positionIterations = 20;\n\t\tsubStep.velocityIterations = step.velocityIterations;\n\t\tsubStep.warmStarting = false;\n\t\tisland.SolveTOI(subStep, bA->m_islandIndex, bB->m_islandIndex);\n\n\t\t// Reset island flags and synchronize broad-phase proxies.\n\t\tfor (int32 i = 0; i < island.m_bodyCount; ++i)\n\t\t{\n\t\t\tb2Body* body = island.m_bodies[i];\n\t\t\tbody->m_flags &= ~b2Body::e_islandFlag;\n\n\t\t\tif (body->m_type != b2_dynamicBody)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tbody->SynchronizeFixtures();\n\n\t\t\t// Invalidate all contact TOIs on this displaced body.\n\t\t\tfor (b2ContactEdge* ce = body->m_contactList; ce; ce = ce->next)\n\t\t\t{\n\t\t\t\tce->contact->m_flags &= ~(b2Contact::e_toiFlag | b2Contact::e_islandFlag);\n\t\t\t}\n\t\t}\n\n\t\t// Commit fixture proxy movements to the broad-phase so that new contacts are created.\n\t\t// Also, some contacts can be destroyed.\n\t\tm_contactManager.FindNewContacts();\n\n\t\tif (m_subStepping)\n\t\t{\n\t\t\tm_stepComplete = false;\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nvoid b2World::Step(float dt, int32 velocityIterations, int32 positionIterations)\n{\n\tb2Timer stepTimer;\n\n\t// If new fixtures were added, we need to find the new contacts.\n\tif (m_newContacts)\n\t{\n\t\tm_contactManager.FindNewContacts();\n\t\tm_newContacts = false;\n\t}\n\n\tm_locked = true;\n\n\tb2TimeStep step;\n\tstep.dt = dt;\n\tstep.velocityIterations\t= velocityIterations;\n\tstep.positionIterations = positionIterations;\n\tif (dt > 0.0f)\n\t{\n\t\tstep.inv_dt = 1.0f / dt;\n\t}\n\telse\n\t{\n\t\tstep.inv_dt = 0.0f;\n\t}\n\n\tstep.dtRatio = m_inv_dt0 * dt;\n\n\tstep.warmStarting = m_warmStarting;\n\t\n\t// Update contacts. This is where some contacts are destroyed.\n\t{\n\t\tb2Timer timer;\n\t\tm_contactManager.Collide();\n\t\tm_profile.collide = timer.GetMilliseconds();\n\t}\n\n\t// Integrate velocities, solve velocity constraints, and integrate positions.\n\tif (m_stepComplete && step.dt > 0.0f)\n\t{\n\t\tb2Timer timer;\n\t\tSolve(step);\n\t\tm_profile.solve = timer.GetMilliseconds();\n\t}\n\n\t// Handle TOI events.\n\tif (m_continuousPhysics && step.dt > 0.0f)\n\t{\n\t\tb2Timer timer;\n\t\tSolveTOI(step);\n\t\tm_profile.solveTOI = timer.GetMilliseconds();\n\t}\n\n\tif (step.dt > 0.0f)\n\t{\n\t\tm_inv_dt0 = step.inv_dt;\n\t}\n\n\tif (m_clearForces)\n\t{\n\t\tClearForces();\n\t}\n\n\tm_locked = false;\n\n\tm_profile.step = stepTimer.GetMilliseconds();\n}\n\nvoid b2World::ClearForces()\n{\n\tfor (b2Body* body = m_bodyList; body; body = body->GetNext())\n\t{\n\t\tbody->m_force.SetZero();\n\t\tbody->m_torque = 0.0f;\n\t}\n}\n\nstruct b2WorldQueryWrapper\n{\n\tbool QueryCallback(int32 proxyId)\n\t{\n\t\tb2FixtureProxy* proxy = (b2FixtureProxy*)broadPhase->GetUserData(proxyId);\n\t\treturn callback->ReportFixture(proxy->fixture);\n\t}\n\n\tconst b2BroadPhase* broadPhase;\n\tb2QueryCallback* callback;\n};\n\nvoid b2World::QueryAABB(b2QueryCallback* callback, const b2AABB& aabb) const\n{\n\tb2WorldQueryWrapper wrapper;\n\twrapper.broadPhase = &m_contactManager.m_broadPhase;\n\twrapper.callback = callback;\n\tm_contactManager.m_broadPhase.Query(&wrapper, aabb);\n}\n\nstruct b2WorldRayCastWrapper\n{\n\tfloat RayCastCallback(const b2RayCastInput& input, int32 proxyId)\n\t{\n\t\tvoid* userData = broadPhase->GetUserData(proxyId);\n\t\tb2FixtureProxy* proxy = (b2FixtureProxy*)userData;\n\t\tb2Fixture* fixture = proxy->fixture;\n\t\tint32 index = proxy->childIndex;\n\t\tb2RayCastOutput output;\n\t\tbool hit = fixture->RayCast(&output, input, index);\n\n\t\tif (hit)\n\t\t{\n\t\t\tfloat fraction = output.fraction;\n\t\t\tb2Vec2 point = (1.0f - fraction) * input.p1 + fraction * input.p2;\n\t\t\treturn callback->ReportFixture(fixture, point, output.normal, fraction);\n\t\t}\n\n\t\treturn input.maxFraction;\n\t}\n\n\tconst b2BroadPhase* broadPhase;\n\tb2RayCastCallback* callback;\n};\n\nvoid b2World::RayCast(b2RayCastCallback* callback, const b2Vec2& point1, const b2Vec2& point2) const\n{\n\tb2WorldRayCastWrapper wrapper;\n\twrapper.broadPhase = &m_contactManager.m_broadPhase;\n\twrapper.callback = callback;\n\tb2RayCastInput input;\n\tinput.maxFraction = 1.0f;\n\tinput.p1 = point1;\n\tinput.p2 = point2;\n\tm_contactManager.m_broadPhase.RayCast(&wrapper, input);\n}\n\nvoid b2World::DrawShape(b2Fixture* fixture, const b2Transform& xf, const b2Color& color)\n{\n\tswitch (fixture->GetType())\n\t{\n\tcase b2Shape::e_circle:\n\t\t{\n\t\t\tb2CircleShape* circle = (b2CircleShape*)fixture->GetShape();\n\n\t\t\tb2Vec2 center = b2Mul(xf, circle->m_p);\n\t\t\tfloat radius = circle->m_radius;\n\t\t\tb2Vec2 axis = b2Mul(xf.q, b2Vec2(1.0f, 0.0f));\n\n\t\t\tm_debugDraw->DrawSolidCircle(center, radius, axis, color);\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_edge:\n\t\t{\n\t\t\tb2EdgeShape* edge = (b2EdgeShape*)fixture->GetShape();\n\t\t\tb2Vec2 v1 = b2Mul(xf, edge->m_vertex1);\n\t\t\tb2Vec2 v2 = b2Mul(xf, edge->m_vertex2);\n\t\t\tm_debugDraw->DrawSegment(v1, v2, color);\n\n\t\t\tif (edge->m_oneSided == false)\n\t\t\t{\n\t\t\t\tm_debugDraw->DrawPoint(v1, 4.0f, color);\n\t\t\t\tm_debugDraw->DrawPoint(v2, 4.0f, color);\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_chain:\n\t\t{\n\t\t\tb2ChainShape* chain = (b2ChainShape*)fixture->GetShape();\n\t\t\tint32 count = chain->m_count;\n\t\t\tconst b2Vec2* vertices = chain->m_vertices;\n\n\t\t\tb2Vec2 v1 = b2Mul(xf, vertices[0]);\n\t\t\tfor (int32 i = 1; i < count; ++i)\n\t\t\t{\n\t\t\t\tb2Vec2 v2 = b2Mul(xf, vertices[i]);\n\t\t\t\tm_debugDraw->DrawSegment(v1, v2, color);\n\t\t\t\tv1 = v2;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase b2Shape::e_polygon:\n\t\t{\n\t\t\tb2PolygonShape* poly = (b2PolygonShape*)fixture->GetShape();\n\t\t\tint32 vertexCount = poly->m_count;\n\t\t\tb2Assert(vertexCount <= b2_maxPolygonVertices);\n\t\t\tb2Vec2 vertices[b2_maxPolygonVertices];\n\n\t\t\tfor (int32 i = 0; i < vertexCount; ++i)\n\t\t\t{\n\t\t\t\tvertices[i] = b2Mul(xf, poly->m_vertices[i]);\n\t\t\t}\n\n\t\t\tm_debugDraw->DrawSolidPolygon(vertices, vertexCount, color);\n\t\t}\n\t\tbreak;\n\n\tdefault:\n\tbreak;\n\t}\n}\n\nvoid b2World::DebugDraw()\n{\n\tif (m_debugDraw == nullptr)\n\t{\n\t\treturn;\n\t}\n\n\tuint32 flags = m_debugDraw->GetFlags();\n\n\tif (flags & b2Draw::e_shapeBit)\n\t{\n\t\tfor (b2Body* b = m_bodyList; b; b = b->GetNext())\n\t\t{\n\t\t\tconst b2Transform& xf = b->GetTransform();\n\t\t\tfor (b2Fixture* f = b->GetFixtureList(); f; f = f->GetNext())\n\t\t\t{\n\t\t\t\tif (b->GetType() == b2_dynamicBody && b->m_mass == 0.0f)\n\t\t\t\t{\n\t\t\t\t\t// Bad body\n\t\t\t\t\tDrawShape(f, xf, b2Color(1.0f, 0.0f, 0.0f));\n\t\t\t\t}\n\t\t\t\telse if (b->IsEnabled() == false)\n\t\t\t\t{\n\t\t\t\t\tDrawShape(f, xf, b2Color(0.5f, 0.5f, 0.3f));\n\t\t\t\t}\n\t\t\t\telse if (b->GetType() == b2_staticBody)\n\t\t\t\t{\n\t\t\t\t\tDrawShape(f, xf, b2Color(0.5f, 0.9f, 0.5f));\n\t\t\t\t}\n\t\t\t\telse if (b->GetType() == b2_kinematicBody)\n\t\t\t\t{\n\t\t\t\t\tDrawShape(f, xf, b2Color(0.5f, 0.5f, 0.9f));\n\t\t\t\t}\n\t\t\t\telse if (b->IsAwake() == false)\n\t\t\t\t{\n\t\t\t\t\tDrawShape(f, xf, b2Color(0.6f, 0.6f, 0.6f));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDrawShape(f, xf, b2Color(0.9f, 0.7f, 0.7f));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (flags & b2Draw::e_jointBit)\n\t{\n\t\tfor (b2Joint* j = m_jointList; j; j = j->GetNext())\n\t\t{\n\t\t\tj->Draw(m_debugDraw);\n\t\t}\n\t}\n\n\tif (flags & b2Draw::e_pairBit)\n\t{\n\t\tb2Color color(0.3f, 0.9f, 0.9f);\n\t\tfor (b2Contact* c = m_contactManager.m_contactList; c; c = c->GetNext())\n\t\t{\n\t\t\tb2Fixture* fixtureA = c->GetFixtureA();\n\t\t\tb2Fixture* fixtureB = c->GetFixtureB();\n\t\t\tint32 indexA = c->GetChildIndexA();\n\t\t\tint32 indexB = c->GetChildIndexB();\n\t\t\tb2Vec2 cA = fixtureA->GetAABB(indexA).GetCenter();\n\t\t\tb2Vec2 cB = fixtureB->GetAABB(indexB).GetCenter();\n\n\t\t\tm_debugDraw->DrawSegment(cA, cB, color);\n\t\t}\n\t}\n\n\tif (flags & b2Draw::e_aabbBit)\n\t{\n\t\tb2Color color(0.9f, 0.3f, 0.9f);\n\t\tb2BroadPhase* bp = &m_contactManager.m_broadPhase;\n\n\t\tfor (b2Body* b = m_bodyList; b; b = b->GetNext())\n\t\t{\n\t\t\tif (b->IsEnabled() == false)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfor (b2Fixture* f = b->GetFixtureList(); f; f = f->GetNext())\n\t\t\t{\n\t\t\t\tfor (int32 i = 0; i < f->m_proxyCount; ++i)\n\t\t\t\t{\n\t\t\t\t\tb2FixtureProxy* proxy = f->m_proxies + i;\n\t\t\t\t\tb2AABB aabb = bp->GetFatAABB(proxy->proxyId);\n\t\t\t\t\tb2Vec2 vs[4];\n\t\t\t\t\tvs[0].Set(aabb.lowerBound.x, aabb.lowerBound.y);\n\t\t\t\t\tvs[1].Set(aabb.upperBound.x, aabb.lowerBound.y);\n\t\t\t\t\tvs[2].Set(aabb.upperBound.x, aabb.upperBound.y);\n\t\t\t\t\tvs[3].Set(aabb.lowerBound.x, aabb.upperBound.y);\n\n\t\t\t\t\tm_debugDraw->DrawPolygon(vs, 4, color);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (flags & b2Draw::e_centerOfMassBit)\n\t{\n\t\tfor (b2Body* b = m_bodyList; b; b = b->GetNext())\n\t\t{\n\t\t\tb2Transform xf = b->GetTransform();\n\t\t\txf.p = b->GetWorldCenter();\n\t\t\tm_debugDraw->DrawTransform(xf);\n\t\t}\n\t}\n}\n\nint32 b2World::GetProxyCount() const\n{\n\treturn m_contactManager.m_broadPhase.GetProxyCount();\n}\n\nint32 b2World::GetTreeHeight() const\n{\n\treturn m_contactManager.m_broadPhase.GetTreeHeight();\n}\n\nint32 b2World::GetTreeBalance() const\n{\n\treturn m_contactManager.m_broadPhase.GetTreeBalance();\n}\n\nfloat b2World::GetTreeQuality() const\n{\n\treturn m_contactManager.m_broadPhase.GetTreeQuality();\n}\n\nvoid b2World::ShiftOrigin(const b2Vec2& newOrigin)\n{\n\tb2Assert(m_locked == false);\n\tif (m_locked)\n\t{\n\t\treturn;\n\t}\n\n\tfor (b2Body* b = m_bodyList; b; b = b->m_next)\n\t{\n\t\tb->m_xf.p -= newOrigin;\n\t\tb->m_sweep.c0 -= newOrigin;\n\t\tb->m_sweep.c -= newOrigin;\n\t}\n\n\tfor (b2Joint* j = m_jointList; j; j = j->m_next)\n\t{\n\t\tj->ShiftOrigin(newOrigin);\n\t}\n\n\tm_contactManager.m_broadPhase.ShiftOrigin(newOrigin);\n}\n\nvoid b2World::Dump()\n{\n\tif (m_locked)\n\t{\n\t\treturn;\n\t}\n\n\tb2OpenDump(\"box2d_dump.inl\");\n\n\tb2Dump(\"b2Vec2 g(%.9g, %.9g);\\n\", m_gravity.x, m_gravity.y);\n\tb2Dump(\"m_world->SetGravity(g);\\n\");\n\n\tb2Dump(\"b2Body** bodies = (b2Body**)b2Alloc(%d * sizeof(b2Body*));\\n\", m_bodyCount);\n\tb2Dump(\"b2Joint** joints = (b2Joint**)b2Alloc(%d * sizeof(b2Joint*));\\n\", m_jointCount);\n\n\tint32 i = 0;\n\tfor (b2Body* b = m_bodyList; b; b = b->m_next)\n\t{\n\t\tb->m_islandIndex = i;\n\t\tb->Dump();\n\t\t++i;\n\t}\n\n\ti = 0;\n\tfor (b2Joint* j = m_jointList; j; j = j->m_next)\n\t{\n\t\tj->m_index = i;\n\t\t++i;\n\t}\n\n\t// First pass on joints, skip gear joints.\n\tfor (b2Joint* j = m_jointList; j; j = j->m_next)\n\t{\n\t\tif (j->m_type == e_gearJoint)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tb2Dump(\"{\\n\");\n\t\tj->Dump();\n\t\tb2Dump(\"}\\n\");\n\t}\n\n\t// Second pass on joints, only gear joints.\n\tfor (b2Joint* j = m_jointList; j; j = j->m_next)\n\t{\n\t\tif (j->m_type != e_gearJoint)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tb2Dump(\"{\\n\");\n\t\tj->Dump();\n\t\tb2Dump(\"}\\n\");\n\t}\n\n\tb2Dump(\"b2Free(joints);\\n\");\n\tb2Dump(\"b2Free(bodies);\\n\");\n\tb2Dump(\"joints = nullptr;\\n\");\n\tb2Dump(\"bodies = nullptr;\\n\");\n\n\tb2CloseDump();\n}\n"
  },
  {
    "path": "src/libraries/box2d/dynamics/b2_world_callbacks.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_fixture.h\"\n#include \"box2d/b2_world_callbacks.h\"\n\n// Return true if contact calculations should be performed between these two shapes.\n// If you implement your own collision filter you may want to build from this implementation.\nbool b2ContactFilter::ShouldCollide(b2Fixture* fixtureA, b2Fixture* fixtureB)\n{\n\tconst b2Filter& filterA = fixtureA->GetFilterData();\n\tconst b2Filter& filterB = fixtureB->GetFilterData();\n\n\tif (filterA.groupIndex == filterB.groupIndex && filterA.groupIndex != 0)\n\t{\n\t\treturn filterA.groupIndex > 0;\n\t}\n\n\tbool collide = (filterA.maskBits & filterB.categoryBits) != 0 && (filterA.categoryBits & filterB.maskBits) != 0;\n\treturn collide;\n}\n"
  },
  {
    "path": "src/libraries/box2d/rope/b2_rope.cpp",
    "content": "// MIT License\n\n// Copyright (c) 2019 Erin Catto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include \"box2d/b2_draw.h\"\n#include \"box2d/b2_rope.h\"\n\n#include <stdio.h>\n\nstruct b2RopeStretch\n{\n\tint32 i1, i2;\n\tfloat invMass1, invMass2;\n\tfloat L;\n\tfloat lambda;\n\tfloat spring;\n\tfloat damper;\n};\n\nstruct b2RopeBend\n{\n\tint32 i1, i2, i3;\n\tfloat invMass1, invMass2, invMass3;\n\tfloat invEffectiveMass;\n\tfloat lambda;\n\tfloat L1, L2;\n\tfloat alpha1, alpha2;\n\tfloat spring;\n\tfloat damper;\n};\n\nb2Rope::b2Rope()\n{\n\tm_position.SetZero();\n\tm_count = 0;\n\tm_stretchCount = 0;\n\tm_bendCount = 0;\n\tm_stretchConstraints = nullptr;\n\tm_bendConstraints = nullptr;\n\tm_bindPositions = nullptr;\n\tm_ps = nullptr;\n\tm_p0s = nullptr;\n\tm_vs = nullptr;\n\tm_invMasses = nullptr;\n\tm_gravity.SetZero();\n}\n\nb2Rope::~b2Rope()\n{\n\tb2Free(m_stretchConstraints);\n\tb2Free(m_bendConstraints);\n\tb2Free(m_bindPositions);\n\tb2Free(m_ps);\n\tb2Free(m_p0s);\n\tb2Free(m_vs);\n\tb2Free(m_invMasses);\n}\n\nvoid b2Rope::Create(const b2RopeDef& def)\n{\n\tb2Assert(def.count >= 3);\n\tm_position = def.position;\n\tm_count = def.count;\n\tm_bindPositions = (b2Vec2*)b2Alloc(m_count * sizeof(b2Vec2));\n\tm_ps = (b2Vec2*)b2Alloc(m_count * sizeof(b2Vec2));\n\tm_p0s = (b2Vec2*)b2Alloc(m_count * sizeof(b2Vec2));\n\tm_vs = (b2Vec2*)b2Alloc(m_count * sizeof(b2Vec2));\n\tm_invMasses = (float*)b2Alloc(m_count * sizeof(float));\n\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tm_bindPositions[i] = def.vertices[i];\n\t\tm_ps[i] = def.vertices[i] + m_position;\n\t\tm_p0s[i] = def.vertices[i] + m_position;\n\t\tm_vs[i].SetZero();\n\n\t\tfloat m = def.masses[i];\n\t\tif (m > 0.0f)\n\t\t{\n\t\t\tm_invMasses[i] = 1.0f / m;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_invMasses[i] = 0.0f;\n\t\t}\n\t}\n\n\tm_stretchCount = m_count - 1;\n\tm_bendCount = m_count - 2;\n\n\tm_stretchConstraints = (b2RopeStretch*)b2Alloc(m_stretchCount * sizeof(b2RopeStretch));\n\tm_bendConstraints = (b2RopeBend*)b2Alloc(m_bendCount * sizeof(b2RopeBend));\n\n\tfor (int32 i = 0; i < m_stretchCount; ++i)\n\t{\n\t\tb2RopeStretch& c = m_stretchConstraints[i];\n\n\t\tb2Vec2 p1 = m_ps[i];\n\t\tb2Vec2 p2 = m_ps[i+1];\n\n\t\tc.i1 = i;\n\t\tc.i2 = i + 1;\n\t\tc.L = b2Distance(p1, p2);\n\t\tc.invMass1 = m_invMasses[i];\n\t\tc.invMass2 = m_invMasses[i + 1];\n\t\tc.lambda = 0.0f;\n\t\tc.damper = 0.0f;\n\t\tc.spring = 0.0f;\n\t}\n\n\tfor (int32 i = 0; i < m_bendCount; ++i)\n\t{\n\t\tb2RopeBend& c = m_bendConstraints[i];\n\n\t\tb2Vec2 p1 = m_ps[i];\n\t\tb2Vec2 p2 = m_ps[i + 1];\n\t\tb2Vec2 p3 = m_ps[i + 2];\n\n\t\tc.i1 = i;\n\t\tc.i2 = i + 1;\n\t\tc.i3 = i + 2;\n\t\tc.invMass1 = m_invMasses[i];\n\t\tc.invMass2 = m_invMasses[i + 1];\n\t\tc.invMass3 = m_invMasses[i + 2];\n\t\tc.invEffectiveMass = 0.0f;\n\t\tc.L1 = b2Distance(p1, p2);\n\t\tc.L2 = b2Distance(p2, p3);\n\t\tc.lambda = 0.0f;\n\n\t\t// Pre-compute effective mass (TODO use flattened config)\n\t\tb2Vec2 e1 = p2 - p1;\n\t\tb2Vec2 e2 = p3 - p2;\n\t\tfloat L1sqr = e1.LengthSquared();\n\t\tfloat L2sqr = e2.LengthSquared();\n\n\t\tif (L1sqr * L2sqr == 0.0f)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tb2Vec2 Jd1 = (-1.0f / L1sqr) * e1.Skew();\n\t\tb2Vec2 Jd2 = (1.0f / L2sqr) * e2.Skew();\n\n\t\tb2Vec2 J1 = -Jd1;\n\t\tb2Vec2 J2 = Jd1 - Jd2;\n\t\tb2Vec2 J3 = Jd2;\n\n\t\tc.invEffectiveMass = c.invMass1 * b2Dot(J1, J1) + c.invMass2 * b2Dot(J2, J2) + c.invMass3 * b2Dot(J3, J3);\n\t\n\t\tb2Vec2 r = p3 - p1;\n\n\t\tfloat rr = r.LengthSquared();\n\t\tif (rr == 0.0f)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// a1 = h2 / (h1 + h2)\n\t\t// a2 = h1 / (h1 + h2)\n\t\tc.alpha1 = b2Dot(e2, r) / rr;\n\t\tc.alpha2 = b2Dot(e1, r) / rr;\n\t}\n\n\tm_gravity = def.gravity;\n\n\tSetTuning(def.tuning);\n}\n\nvoid b2Rope::SetTuning(const b2RopeTuning& tuning)\n{\n\tm_tuning = tuning;\n\n\t// Pre-compute spring and damper values based on tuning\n\n\tconst float bendOmega = 2.0f * b2_pi * m_tuning.bendHertz;\n\n\tfor (int32 i = 0; i < m_bendCount; ++i)\n\t{\n\t\tb2RopeBend& c = m_bendConstraints[i];\n\n\t\tfloat L1sqr = c.L1 * c.L1;\n\t\tfloat L2sqr = c.L2 * c.L2;\n\n\t\tif (L1sqr * L2sqr == 0.0f)\n\t\t{\n\t\t\tc.spring = 0.0f;\n\t\t\tc.damper = 0.0f;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Flatten the triangle formed by the two edges\n\t\tfloat J2 = 1.0f / c.L1 + 1.0f / c.L2;\n\t\tfloat sum = c.invMass1 / L1sqr + c.invMass2 * J2 * J2 + c.invMass3 / L2sqr;\n\t\tif (sum == 0.0f)\n\t\t{\n\t\t\tc.spring = 0.0f;\n\t\t\tc.damper = 0.0f;\n\t\t\tcontinue;\n\t\t}\n\n\t\tfloat mass = 1.0f / sum;\n\n\t\tc.spring = mass * bendOmega * bendOmega;\n\t\tc.damper = 2.0f * mass * m_tuning.bendDamping * bendOmega;\n\t}\n\t\n\tconst float stretchOmega = 2.0f * b2_pi * m_tuning.stretchHertz;\n\n\tfor (int32 i = 0; i < m_stretchCount; ++i)\n\t{\n\t\tb2RopeStretch& c = m_stretchConstraints[i];\n\n\t\tfloat sum = c.invMass1 + c.invMass2;\n\t\tif (sum == 0.0f)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tfloat mass = 1.0f / sum;\n\n\t\tc.spring = mass * stretchOmega * stretchOmega;\n\t\tc.damper = 2.0f * mass * m_tuning.stretchDamping * stretchOmega;\n\t}\n}\n\nvoid b2Rope::Step(float dt, int32 iterations, const b2Vec2& position)\n{\n\tif (dt == 0.0)\n\t{\n\t\treturn;\n\t}\n\n\tconst float inv_dt = 1.0f / dt;\n\tfloat d = expf(- dt * m_tuning.damping);\n\n\t// Apply gravity and damping\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tif (m_invMasses[i] > 0.0f)\n\t\t{\n\t\t\tm_vs[i] *= d;\n\t\t\tm_vs[i] += dt * m_gravity;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_vs[i] = inv_dt * (m_bindPositions[i] + position - m_p0s[i]);\n\t\t}\n\t}\n\n\t// Apply bending spring\n\tif (m_tuning.bendingModel == b2_springAngleBendingModel)\n\t{\n\t\tApplyBendForces(dt);\n\t}\n\n\tfor (int32 i = 0; i < m_bendCount; ++i)\n\t{\n\t\tm_bendConstraints[i].lambda = 0.0f;\n\t}\n\n\tfor (int32 i = 0; i < m_stretchCount; ++i)\n\t{\n\t\tm_stretchConstraints[i].lambda = 0.0f;\n\t}\n\n\t// Update position\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tm_ps[i] += dt * m_vs[i];\n\t}\n\n\t// Solve constraints\n\tfor (int32 i = 0; i < iterations; ++i)\n\t{\n\t\tif (m_tuning.bendingModel == b2_pbdAngleBendingModel)\n\t\t{\n\t\t\tSolveBend_PBD_Angle();\n\t\t}\n\t\telse if (m_tuning.bendingModel == b2_xpbdAngleBendingModel)\n\t\t{\n\t\t\tSolveBend_XPBD_Angle(dt);\n\t\t}\n\t\telse if (m_tuning.bendingModel == b2_pbdDistanceBendingModel)\n\t\t{\n\t\t\tSolveBend_PBD_Distance();\n\t\t}\n\t\telse if (m_tuning.bendingModel == b2_pbdHeightBendingModel)\n\t\t{\n\t\t\tSolveBend_PBD_Height();\n\t\t}\n\t\telse if (m_tuning.bendingModel == b2_pbdTriangleBendingModel)\n\t\t{\n\t\t\tSolveBend_PBD_Triangle();\n\t\t}\n\n\t\tif (m_tuning.stretchingModel == b2_pbdStretchingModel)\n\t\t{\n\t\t\tSolveStretch_PBD();\n\t\t}\n\t\telse if (m_tuning.stretchingModel == b2_xpbdStretchingModel)\n\t\t{\n\t\t\tSolveStretch_XPBD(dt);\n\t\t}\n\t}\n\n\t// Constrain velocity\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tm_vs[i] = inv_dt * (m_ps[i] - m_p0s[i]);\n\t\tm_p0s[i] = m_ps[i];\n\t}\n}\n\nvoid b2Rope::Reset(const b2Vec2& position)\n{\n\tm_position = position;\n\n\tfor (int32 i = 0; i < m_count; ++i)\n\t{\n\t\tm_ps[i] = m_bindPositions[i] + m_position;\n\t\tm_p0s[i] = m_bindPositions[i] + m_position;\n\t\tm_vs[i].SetZero();\n\t}\n\n\tfor (int32 i = 0; i < m_bendCount; ++i)\n\t{\n\t\tm_bendConstraints[i].lambda = 0.0f;\n\t}\n\n\tfor (int32 i = 0; i < m_stretchCount; ++i)\n\t{\n\t\tm_stretchConstraints[i].lambda = 0.0f;\n\t}\n}\n\nvoid b2Rope::SolveStretch_PBD()\n{\n\tconst float stiffness = m_tuning.stretchStiffness;\n\n\tfor (int32 i = 0; i < m_stretchCount; ++i)\n\t{\n\t\tconst b2RopeStretch& c = m_stretchConstraints[i];\n\n\t\tb2Vec2 p1 = m_ps[c.i1];\n\t\tb2Vec2 p2 = m_ps[c.i2];\n\n\t\tb2Vec2 d = p2 - p1;\n\t\tfloat L = d.Normalize();\n\n\t\tfloat sum = c.invMass1 + c.invMass2;\n\t\tif (sum == 0.0f)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tfloat s1 = c.invMass1 / sum;\n\t\tfloat s2 = c.invMass2 / sum;\n\n\t\tp1 -= stiffness * s1 * (c.L - L) * d;\n\t\tp2 += stiffness * s2 * (c.L - L) * d;\n\n\t\tm_ps[c.i1] = p1;\n\t\tm_ps[c.i2] = p2;\n\t}\n}\n\nvoid b2Rope::SolveStretch_XPBD(float dt)\n{\n\tb2Assert(dt > 0.0f);\n\n\tfor (int32 i = 0; i < m_stretchCount; ++i)\n\t{\n\t\tb2RopeStretch& c = m_stretchConstraints[i];\n\n\t\tb2Vec2 p1 = m_ps[c.i1];\n\t\tb2Vec2 p2 = m_ps[c.i2];\n\n\t\tb2Vec2 dp1 = p1 - m_p0s[c.i1];\n\t\tb2Vec2 dp2 = p2 - m_p0s[c.i2];\n\n\t\tb2Vec2 u = p2 - p1;\n\t\tfloat L = u.Normalize();\n\n\t\tb2Vec2 J1 = -u;\n\t\tb2Vec2 J2 = u;\n\n\t\tfloat sum = c.invMass1 + c.invMass2;\n\t\tif (sum == 0.0f)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst float alpha = 1.0f / (c.spring * dt * dt);\t// 1 / kg\n\t\tconst float beta = dt * dt * c.damper;\t\t\t\t// kg * s\n\t\tconst float sigma = alpha * beta / dt;\t\t\t\t// non-dimensional\n\t\tfloat C = L - c.L;\n\n\t\t// This is using the initial velocities\n\t\tfloat Cdot = b2Dot(J1, dp1) + b2Dot(J2, dp2);\n\n\t\tfloat B = C + alpha * c.lambda + sigma * Cdot;\n\t\tfloat sum2 = (1.0f + sigma) * sum + alpha;\n\n\t\tfloat impulse = -B / sum2;\n\n\t\tp1 += (c.invMass1 * impulse) * J1;\n\t\tp2 += (c.invMass2 * impulse) * J2;\n\n\t\tm_ps[c.i1] = p1;\n\t\tm_ps[c.i2] = p2;\n\t\tc.lambda += impulse;\n\t}\n}\n\nvoid b2Rope::SolveBend_PBD_Angle()\n{\n\tconst float stiffness = m_tuning.bendStiffness;\n\n\tfor (int32 i = 0; i < m_bendCount; ++i)\n\t{\n\t\tconst b2RopeBend& c = m_bendConstraints[i];\n\n\t\tb2Vec2 p1 = m_ps[c.i1];\n\t\tb2Vec2 p2 = m_ps[c.i2];\n\t\tb2Vec2 p3 = m_ps[c.i3];\n\n\t\tb2Vec2 d1 = p2 - p1;\n\t\tb2Vec2 d2 = p3 - p2;\n\t\tfloat a = b2Cross(d1, d2);\n\t\tfloat b = b2Dot(d1, d2);\n\n\t\tfloat angle = b2Atan2(a, b);\n\n\t\tfloat L1sqr, L2sqr;\n\t\t\n\t\tif (m_tuning.isometric)\n\t\t{\n\t\t\tL1sqr = c.L1 * c.L1;\n\t\t\tL2sqr = c.L2 * c.L2;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tL1sqr = d1.LengthSquared();\n\t\t\tL2sqr = d2.LengthSquared();\n\t\t}\n\n\t\tif (L1sqr * L2sqr == 0.0f)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tb2Vec2 Jd1 = (-1.0f / L1sqr) * d1.Skew();\n\t\tb2Vec2 Jd2 = (1.0f / L2sqr) * d2.Skew();\n\n\t\tb2Vec2 J1 = -Jd1;\n\t\tb2Vec2 J2 = Jd1 - Jd2;\n\t\tb2Vec2 J3 = Jd2;\n\n\t\tfloat sum;\n\t\tif (m_tuning.fixedEffectiveMass)\n\t\t{\n\t\t\tsum = c.invEffectiveMass;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tsum = c.invMass1 * b2Dot(J1, J1) + c.invMass2 * b2Dot(J2, J2) + c.invMass3 * b2Dot(J3, J3);\n\t\t}\n\n\t\tif (sum == 0.0f)\n\t\t{\n\t\t\tsum = c.invEffectiveMass;\n\t\t}\n\n\t\tfloat impulse = -stiffness * angle / sum;\n\n\t\tp1 += (c.invMass1 * impulse) * J1;\n\t\tp2 += (c.invMass2 * impulse) * J2;\n\t\tp3 += (c.invMass3 * impulse) * J3;\n\n\t\tm_ps[c.i1] = p1;\n\t\tm_ps[c.i2] = p2;\n\t\tm_ps[c.i3] = p3;\n\t}\n}\n\nvoid b2Rope::SolveBend_XPBD_Angle(float dt)\n{\n\tb2Assert(dt > 0.0f);\n\n\tfor (int32 i = 0; i < m_bendCount; ++i)\n\t{\n\t\tb2RopeBend& c = m_bendConstraints[i];\n\n\t\tb2Vec2 p1 = m_ps[c.i1];\n\t\tb2Vec2 p2 = m_ps[c.i2];\n\t\tb2Vec2 p3 = m_ps[c.i3];\n\n\t\tb2Vec2 dp1 = p1 - m_p0s[c.i1];\n\t\tb2Vec2 dp2 = p2 - m_p0s[c.i2];\n\t\tb2Vec2 dp3 = p3 - m_p0s[c.i3];\n\n\t\tb2Vec2 d1 = p2 - p1;\n\t\tb2Vec2 d2 = p3 - p2;\n\n\t\tfloat L1sqr, L2sqr;\n\n\t\tif (m_tuning.isometric)\n\t\t{\n\t\t\tL1sqr = c.L1 * c.L1;\n\t\t\tL2sqr = c.L2 * c.L2;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tL1sqr = d1.LengthSquared();\n\t\t\tL2sqr = d2.LengthSquared();\n\t\t}\n\n\t\tif (L1sqr * L2sqr == 0.0f)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tfloat a = b2Cross(d1, d2);\n\t\tfloat b = b2Dot(d1, d2);\n\n\t\tfloat angle = b2Atan2(a, b);\n\n\t\tb2Vec2 Jd1 = (-1.0f / L1sqr) * d1.Skew();\n\t\tb2Vec2 Jd2 = (1.0f / L2sqr) * d2.Skew();\n\n\t\tb2Vec2 J1 = -Jd1;\n\t\tb2Vec2 J2 = Jd1 - Jd2;\n\t\tb2Vec2 J3 = Jd2;\n\n\t\tfloat sum;\n\t\tif (m_tuning.fixedEffectiveMass)\n\t\t{\n\t\t\tsum = c.invEffectiveMass;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tsum = c.invMass1 * b2Dot(J1, J1) + c.invMass2 * b2Dot(J2, J2) + c.invMass3 * b2Dot(J3, J3);\n\t\t}\n\n\t\tif (sum == 0.0f)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst float alpha = 1.0f / (c.spring * dt * dt);\n\t\tconst float beta = dt * dt * c.damper;\n\t\tconst float sigma = alpha * beta / dt;\n\t\tfloat C = angle;\n\n\t\t// This is using the initial velocities\n\t\tfloat Cdot = b2Dot(J1, dp1) + b2Dot(J2, dp2) + b2Dot(J3, dp3);\n\n\t\tfloat B = C + alpha * c.lambda + sigma * Cdot;\n\t\tfloat sum2 = (1.0f + sigma) * sum + alpha;\n\n\t\tfloat impulse = -B / sum2;\n\n\t\tp1 += (c.invMass1 * impulse) * J1;\n\t\tp2 += (c.invMass2 * impulse) * J2;\n\t\tp3 += (c.invMass3 * impulse) * J3;\n\n\t\tm_ps[c.i1] = p1;\n\t\tm_ps[c.i2] = p2;\n\t\tm_ps[c.i3] = p3;\n\t\tc.lambda += impulse;\n\t}\n}\n\nvoid b2Rope::ApplyBendForces(float dt)\n{\n\t// omega = 2 * pi * hz\n\tconst float omega = 2.0f * b2_pi * m_tuning.bendHertz;\n\n\tfor (int32 i = 0; i < m_bendCount; ++i)\n\t{\n\t\tconst b2RopeBend& c = m_bendConstraints[i];\n\n\t\tb2Vec2 p1 = m_ps[c.i1];\n\t\tb2Vec2 p2 = m_ps[c.i2];\n\t\tb2Vec2 p3 = m_ps[c.i3];\n\n\t\tb2Vec2 v1 = m_vs[c.i1];\n\t\tb2Vec2 v2 = m_vs[c.i2];\n\t\tb2Vec2 v3 = m_vs[c.i3];\n\n\t\tb2Vec2 d1 = p2 - p1;\n\t\tb2Vec2 d2 = p3 - p2;\n\n\t\tfloat L1sqr, L2sqr;\n\n\t\tif (m_tuning.isometric)\n\t\t{\n\t\t\tL1sqr = c.L1 * c.L1;\n\t\t\tL2sqr = c.L2 * c.L2;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tL1sqr = d1.LengthSquared();\n\t\t\tL2sqr = d2.LengthSquared();\n\t\t}\n\n\t\tif (L1sqr * L2sqr == 0.0f)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tfloat a = b2Cross(d1, d2);\n\t\tfloat b = b2Dot(d1, d2);\n\n\t\tfloat angle = b2Atan2(a, b);\n\n\t\tb2Vec2 Jd1 = (-1.0f / L1sqr) * d1.Skew();\n\t\tb2Vec2 Jd2 = (1.0f / L2sqr) * d2.Skew();\n\n\t\tb2Vec2 J1 = -Jd1;\n\t\tb2Vec2 J2 = Jd1 - Jd2;\n\t\tb2Vec2 J3 = Jd2;\n\n\t\tfloat sum;\n\t\tif (m_tuning.fixedEffectiveMass)\n\t\t{\n\t\t\tsum = c.invEffectiveMass;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tsum = c.invMass1 * b2Dot(J1, J1) + c.invMass2 * b2Dot(J2, J2) + c.invMass3 * b2Dot(J3, J3);\n\t\t}\n\n\t\tif (sum == 0.0f)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tfloat mass = 1.0f / sum;\n\n\t\tconst float spring = mass * omega * omega;\n\t\tconst float damper = 2.0f * mass * m_tuning.bendDamping * omega;\n\n\t\tfloat C = angle;\n\t\tfloat Cdot = b2Dot(J1, v1) + b2Dot(J2, v2) + b2Dot(J3, v3);\n\n\t\tfloat impulse = -dt * (spring * C + damper * Cdot);\n\n\t\tm_vs[c.i1] += (c.invMass1 * impulse) * J1;\n\t\tm_vs[c.i2] += (c.invMass2 * impulse) * J2;\n\t\tm_vs[c.i3] += (c.invMass3 * impulse) * J3;\n\t}\n}\n\nvoid b2Rope::SolveBend_PBD_Distance()\n{\n\tconst float stiffness = m_tuning.bendStiffness;\n\n\tfor (int32 i = 0; i < m_bendCount; ++i)\n\t{\n\t\tconst b2RopeBend& c = m_bendConstraints[i];\n\n\t\tint32 i1 = c.i1;\n\t\tint32 i2 = c.i3;\n\n\t\tb2Vec2 p1 = m_ps[i1];\n\t\tb2Vec2 p2 = m_ps[i2];\n\n\t\tb2Vec2 d = p2 - p1;\n\t\tfloat L = d.Normalize();\n\n\t\tfloat sum = c.invMass1 + c.invMass3;\n\t\tif (sum == 0.0f)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tfloat s1 = c.invMass1 / sum;\n\t\tfloat s2 = c.invMass3 / sum;\n\n\t\tp1 -= stiffness * s1 * (c.L1 + c.L2 - L) * d;\n\t\tp2 += stiffness * s2 * (c.L1 + c.L2 - L) * d;\n\n\t\tm_ps[i1] = p1;\n\t\tm_ps[i2] = p2;\n\t}\n}\n\n// Constraint based implementation of:\n// P. Volino: Simple Linear Bending Stiffness in Particle Systems\nvoid b2Rope::SolveBend_PBD_Height()\n{\n\tconst float stiffness = m_tuning.bendStiffness;\n\n\tfor (int32 i = 0; i < m_bendCount; ++i)\n\t{\n\t\tconst b2RopeBend& c = m_bendConstraints[i];\n\n\t\tb2Vec2 p1 = m_ps[c.i1];\n\t\tb2Vec2 p2 = m_ps[c.i2];\n\t\tb2Vec2 p3 = m_ps[c.i3];\n\n\t\t// Barycentric coordinates are held constant\n\t\tb2Vec2 d = c.alpha1 * p1 + c.alpha2 * p3 - p2;\n\t\tfloat dLen = d.Length();\n\n\t\tif (dLen == 0.0f)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tb2Vec2 dHat = (1.0f / dLen) * d;\n\n\t\tb2Vec2 J1 = c.alpha1 * dHat;\n\t\tb2Vec2 J2 = -dHat;\n\t\tb2Vec2 J3 = c.alpha2 * dHat;\n\n\t\tfloat sum = c.invMass1 * c.alpha1 * c.alpha1 + c.invMass2 + c.invMass3 * c.alpha2 * c.alpha2;\n\n\t\tif (sum == 0.0f)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tfloat C = dLen;\n\t\tfloat mass = 1.0f / sum;\n\t\tfloat impulse = -stiffness * mass * C;\n\n\t\tp1 += (c.invMass1 * impulse) * J1;\n\t\tp2 += (c.invMass2 * impulse) * J2;\n\t\tp3 += (c.invMass3 * impulse) * J3;\n\n\t\tm_ps[c.i1] = p1;\n\t\tm_ps[c.i2] = p2;\n\t\tm_ps[c.i3] = p3;\n\t}\n}\n\n// M. Kelager: A Triangle Bending Constraint Model for PBD\nvoid b2Rope::SolveBend_PBD_Triangle()\n{\n\tconst float stiffness = m_tuning.bendStiffness;\n\n\tfor (int32 i = 0; i < m_bendCount; ++i)\n\t{\n\t\tconst b2RopeBend& c = m_bendConstraints[i];\n\n\t\tb2Vec2 b0 = m_ps[c.i1];\n\t\tb2Vec2 v = m_ps[c.i2];\n\t\tb2Vec2 b1 = m_ps[c.i3];\n\n\t\tfloat wb0 = c.invMass1;\n\t\tfloat wv = c.invMass2;\n\t\tfloat wb1 = c.invMass3;\n\n\t\tfloat W = wb0 + wb1 + 2.0f * wv;\n\t\tfloat invW = stiffness / W;\n\n\t\tb2Vec2 d = v - (1.0f / 3.0f) * (b0 + v + b1);\n\n\t\tb2Vec2 db0 = 2.0f * wb0 * invW * d;\n\t\tb2Vec2 dv = -4.0f * wv * invW * d;\n\t\tb2Vec2 db1 = 2.0f * wb1 * invW * d;\n\n\t\tb0 += db0;\n\t\tv += dv;\n\t\tb1 += db1;\n\n\t\tm_ps[c.i1] = b0;\n\t\tm_ps[c.i2] = v;\n\t\tm_ps[c.i3] = b1;\n\t}\n}\n\nvoid b2Rope::Draw(b2Draw* draw) const\n{\n\tb2Color c(0.4f, 0.5f, 0.7f);\n\tb2Color pg(0.1f, 0.8f, 0.1f);\n\tb2Color pd(0.7f, 0.2f, 0.4f);\n\n\tfor (int32 i = 0; i < m_count - 1; ++i)\n\t{\n\t\tdraw->DrawSegment(m_ps[i], m_ps[i+1], c);\n\n\t\tconst b2Color& pc = m_invMasses[i] > 0.0f ? pd : pg;\n\t\tdraw->DrawPoint(m_ps[i], 5.0f, pc);\n\t}\n\n\tconst b2Color& pc = m_invMasses[m_count - 1] > 0.0f ? pd : pg;\n\tdraw->DrawPoint(m_ps[m_count - 1], 5.0f, pc);\n}\n"
  },
  {
    "path": "src/libraries/ddsparse/ddsinfo.h",
    "content": "/**\n * Simple DDS data parser for compressed 2D textures.\n *\n * Copyright (c) 2013-2024 Sasha Szpakowski\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n *\n *\n * Enums and structs copied from Microsoft.\n * http://msdn.microsoft.com/en-us/library/bb943991.aspx\n **/\n\n#ifndef DDS_INFO_H\n#define DDS_INFO_H\n\n#include <stdint.h>\n\nnamespace dds\n{\nnamespace dxinfo\n{\n\nenum DDPF\n{\n\tDDPF_ALPHAPIXELS = 0x000001,\n\tDDPF_ALPHA       = 0x000002,\n\tDDPF_FOURCC      = 0x000004,\n\tDDPF_RGB         = 0x000040,\n\tDDPF_YUV         = 0x000200,\n\tDDPF_LUMINANCE   = 0x020000,\n\tDDPF_BUMPDUDV    = 0x080000,\n};\n\nenum D3D10ResourceDimension\n{\n\tD3D10_RESOURCE_DIMENSION_UNKNOWN   = 0,\n\tD3D10_RESOURCE_DIMENSION_BUFFER    = 1,\n\tD3D10_RESOURCE_DIMENSION_TEXTURE1D = 2,\n\tD3D10_RESOURCE_DIMENSION_TEXTURE2D = 3,\n\tD3D10_RESOURCE_DIMENSION_TEXTURE3D = 4\n};\n\nenum DXGIFormat\n{\n\tDXGI_FORMAT_UNKNOWN                     = 0,\n\n\tDXGI_FORMAT_R32G32B32A32_TYPELESS       = 1,\n\tDXGI_FORMAT_R32G32B32A32_FLOAT          = 2,\n\tDXGI_FORMAT_R32G32B32A32_UINT           = 3,\n\tDXGI_FORMAT_R32G32B32A32_SINT           = 4,\n\n\tDXGI_FORMAT_R32G32B32_TYPELESS          = 5,\n\tDXGI_FORMAT_R32G32B32_FLOAT             = 6,\n\tDXGI_FORMAT_R32G32B32_UINT              = 7,\n\tDXGI_FORMAT_R32G32B32_SINT              = 8,\n\n\tDXGI_FORMAT_R16G16B16A16_TYPELESS       = 9,\n\tDXGI_FORMAT_R16G16B16A16_FLOAT          = 10,\n\tDXGI_FORMAT_R16G16B16A16_UNORM          = 11,\n\tDXGI_FORMAT_R16G16B16A16_UINT           = 12,\n\tDXGI_FORMAT_R16G16B16A16_SNORM          = 13,\n\tDXGI_FORMAT_R16G16B16A16_SINT           = 14,\n\n\tDXGI_FORMAT_R32G32_TYPELESS             = 15,\n\tDXGI_FORMAT_R32G32_FLOAT                = 16,\n\tDXGI_FORMAT_R32G32_UINT                 = 17,\n\tDXGI_FORMAT_R32G32_SINT                 = 18,\n\n\tDXGI_FORMAT_R32G8X24_TYPELESS           = 19,\n\tDXGI_FORMAT_D32_FLOAT_S8X24_UINT        = 20,\n\tDXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS    = 21,\n\tDXGI_FORMAT_X32_TYPELESS_G8X24_UINT     = 22,\n\n\tDXGI_FORMAT_R10G10B10A2_TYPELESS        = 23,\n\tDXGI_FORMAT_R10G10B10A2_UNORM           = 24,\n\tDXGI_FORMAT_R10G10B10A2_UINT            = 25,\n\n\tDXGI_FORMAT_R11G11B10_FLOAT             = 26,\n\n\tDXGI_FORMAT_R8G8B8A8_TYPELESS           = 27,\n\tDXGI_FORMAT_R8G8B8A8_UNORM              = 28,\n\tDXGI_FORMAT_R8G8B8A8_UNORM_SRGB         = 29,\n\tDXGI_FORMAT_R8G8B8A8_UINT               = 30,\n\tDXGI_FORMAT_R8G8B8A8_SNORM              = 31,\n\tDXGI_FORMAT_R8G8B8A8_SINT               = 32,\n\n\tDXGI_FORMAT_R16G16_TYPELESS             = 33,\n\tDXGI_FORMAT_R16G16_FLOAT                = 34,\n\tDXGI_FORMAT_R16G16_UNORM                = 35,\n\tDXGI_FORMAT_R16G16_UINT                 = 36,\n\tDXGI_FORMAT_R16G16_SNORM                = 37,\n\tDXGI_FORMAT_R16G16_SINT                 = 38,\n\n\tDXGI_FORMAT_R32_TYPELESS                = 39,\n\tDXGI_FORMAT_D32_FLOAT                   = 40,\n\tDXGI_FORMAT_R32_FLOAT                   = 41,\n\tDXGI_FORMAT_R32_UINT                    = 42,\n\tDXGI_FORMAT_R32_SINT                    = 43,\n\n\tDXGI_FORMAT_R24G8_TYPELESS              = 44,\n\tDXGI_FORMAT_D24_UNORM_S8_UINT           = 45,\n\tDXGI_FORMAT_R24_UNORM_X8_TYPELESS       = 46,\n\tDXGI_FORMAT_X24_TYPELESS_G8_UINT        = 47,\n\n\tDXGI_FORMAT_R8G8_TYPELESS               = 48,\n\tDXGI_FORMAT_R8G8_UNORM                  = 49,\n\tDXGI_FORMAT_R8G8_UINT                   = 50,\n\tDXGI_FORMAT_R8G8_SNORM                  = 51,\n\tDXGI_FORMAT_R8G8_SINT                   = 52,\n\n\tDXGI_FORMAT_R16_TYPELESS                = 53,\n\tDXGI_FORMAT_R16_FLOAT                   = 54,\n\tDXGI_FORMAT_D16_UNORM                   = 55,\n\tDXGI_FORMAT_R16_UNORM                   = 56,\n\tDXGI_FORMAT_R16_UINT                    = 57,\n\tDXGI_FORMAT_R16_SNORM                   = 58,\n\tDXGI_FORMAT_R16_SINT                    = 59,\n\n\tDXGI_FORMAT_R8_TYPELESS                 = 60,\n\tDXGI_FORMAT_R8_UNORM                    = 61,\n\tDXGI_FORMAT_R8_UINT                     = 62,\n\tDXGI_FORMAT_R8_SNORM                    = 63,\n\tDXGI_FORMAT_R8_SINT                     = 64,\n\tDXGI_FORMAT_A8_UNORM                    = 65,\n\n\tDXGI_FORMAT_R1_UNORM                    = 66,\n\n\tDXGI_FORMAT_R9G9B9E5_SHAREDEXP          = 67,\n\n\tDXGI_FORMAT_R8G8_B8G8_UNORM             = 68,\n\tDXGI_FORMAT_G8R8_G8B8_UNORM             = 69,\n\n\tDXGI_FORMAT_BC1_TYPELESS                = 70,\n\tDXGI_FORMAT_BC1_UNORM                   = 71,\n\tDXGI_FORMAT_BC1_UNORM_SRGB              = 72,\n\n\tDXGI_FORMAT_BC2_TYPELESS                = 73,\n\tDXGI_FORMAT_BC2_UNORM                   = 74,\n\tDXGI_FORMAT_BC2_UNORM_SRGB              = 75,\n\n\tDXGI_FORMAT_BC3_TYPELESS                = 76,\n\tDXGI_FORMAT_BC3_UNORM                   = 77,\n\tDXGI_FORMAT_BC3_UNORM_SRGB              = 78,\n\n\tDXGI_FORMAT_BC4_TYPELESS                = 79,\n\tDXGI_FORMAT_BC4_UNORM                   = 80,\n\tDXGI_FORMAT_BC4_SNORM                   = 81,\n\n\tDXGI_FORMAT_BC5_TYPELESS                = 82,\n\tDXGI_FORMAT_BC5_UNORM                   = 83,\n\tDXGI_FORMAT_BC5_SNORM                   = 84,\n\n\tDXGI_FORMAT_B5G6R5_UNORM                = 85,\n\tDXGI_FORMAT_B5G5R5A1_UNORM              = 86,\n\tDXGI_FORMAT_B8G8R8A8_UNORM              = 87,\n\tDXGI_FORMAT_B8G8R8X8_UNORM              = 88,\n\n\tDXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM  = 89,\n\tDXGI_FORMAT_B8G8R8A8_TYPELESS           = 90,\n\tDXGI_FORMAT_B8G8R8A8_UNORM_SRGB         = 91,\n\tDXGI_FORMAT_B8G8R8X8_TYPELESS           = 92,\n\tDXGI_FORMAT_B8G8R8X8_UNORM_SRGB         = 93,\n\n\tDXGI_FORMAT_BC6H_TYPELESS               = 94,\n\tDXGI_FORMAT_BC6H_UF16                   = 95,\n\tDXGI_FORMAT_BC6H_SF16                   = 96,\n\n\tDXGI_FORMAT_BC7_TYPELESS                = 97,\n\tDXGI_FORMAT_BC7_UNORM                   = 98,\n\tDXGI_FORMAT_BC7_UNORM_SRGB              = 99,\n\n\tDXGI_FORMAT_FORCE_UINT                  = 0xffffffffUL\n};\n\nstruct DDSPixelFormat\n{\n\tuint32_t size;\n\tuint32_t flags;\n\tuint32_t fourCC;\n\tuint32_t rgbBitCount;\n\tuint32_t rBitMask;\n\tuint32_t gBitMask;\n\tuint32_t bBitMask;\n\tuint32_t aBitMask;\n};\n\nstruct DDSHeader\n{\n\tuint32_t size;\n\tuint32_t flags;\n\tuint32_t height;\n\tuint32_t width;\n\tuint32_t pitchOrLinearSize;\n\tuint32_t depth;\n\tuint32_t mipMapCount;\n\tuint32_t reserved[11];\n\n\tDDSPixelFormat format;\n\n\tuint32_t caps1;\n\tuint32_t caps2;\n\tuint32_t caps3;\n\tuint32_t caps4;\n\tuint32_t reserved2;\n};\n\nstruct DDSHeader10\n{\n\tDXGIFormat dxgiFormat;\n\tD3D10ResourceDimension resourceDimension;\n\n\tuint32_t miscFlag;\n\tuint32_t arraySize;\n\tuint32_t reserved;\n};\n\n} // dxinfo\n} // dds\n\n#endif // DDS_INFO_H\n"
  },
  {
    "path": "src/libraries/ddsparse/ddsparse.cpp",
    "content": "/**\n * Simple DDS data parser for compressed 2D textures.\n *\n * Copyright (c) 2013-2024 Sasha Szpakowski\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"ddsparse.h\"\n#include \"ddsinfo.h\"\n\n#include <algorithm>\n\nnamespace dds\n{\n\nusing namespace dds::dxinfo;\n\n// Creates a packed uint representation of a FourCC code.\n#define MakeFourCC(a, b, c, d) ((uint32_t) (((d)<<24) | ((c)<<16) | ((b)<<8) | (a)))\n\n#define ISBITMASK(r,g,b,a) (ddpf.rBitMask == r && ddpf.gBitMask == g && ddpf.bBitMask == b && ddpf.aBitMask == a)\n\n// Function adapted from DirectXTex:\n// https://github.com/microsoft/DirectXTex/blob/master/DDSTextureLoader/DDSTextureLoader.cpp#L623\nstatic DXGIFormat getDXGIFormat(const DDSPixelFormat& ddpf)\n{\n\tif (ddpf.flags & DDPF_RGB)\n\t{\n\t\t// Note that sRGB formats are written using the \"DX10\" extended header\n\n\t\tswitch (ddpf.rgbBitCount)\n\t\t{\n\t\tcase 32:\n\t\t\tif (ISBITMASK(0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000))\n\t\t\t\treturn DXGI_FORMAT_R8G8B8A8_UNORM;\n\n\t\t\tif (ISBITMASK(0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000))\n\t\t\t\treturn DXGI_FORMAT_B8G8R8A8_UNORM;\n\n\t\t\tif (ISBITMASK(0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000))\n\t\t\t\treturn DXGI_FORMAT_B8G8R8X8_UNORM;\n\n\t\t\t// No DXGI format maps to ISBITMASK(0x000000ff,0x0000ff00,0x00ff0000,0x00000000) aka D3DFMT_X8B8G8R8\n\n\t\t\t// Note that many common DDS reader/writers (including D3DX) swap the\n\t\t\t// the RED/BLUE masks for 10:10:10:2 formats. We assume\n\t\t\t// below that the 'backwards' header mask is being used since it is most\n\t\t\t// likely written by D3DX. The more robust solution is to use the 'DX10'\n\t\t\t// header extension and specify the DXGI_FORMAT_R10G10B10A2_UNORM format directly\n\n\t\t\t// For 'correct' writers, this should be 0x000003ff,0x000ffc00,0x3ff00000 for RGB data\n\t\t\tif (ISBITMASK(0x3ff00000, 0x000ffc00, 0x000003ff, 0xc0000000))\n\t\t\t\treturn DXGI_FORMAT_R10G10B10A2_UNORM;\n\n\t\t\t// No DXGI format maps to ISBITMASK(0x000003ff,0x000ffc00,0x3ff00000,0xc0000000) aka D3DFMT_A2R10G10B10\n\n\t\t\tif (ISBITMASK(0x0000ffff, 0xffff0000, 0x00000000, 0x00000000))\n\t\t\t\treturn DXGI_FORMAT_R16G16_UNORM;\n\n\t\t\tif (ISBITMASK(0xffffffff, 0x00000000, 0x00000000, 0x00000000))\n\t\t\t\t// Only 32-bit color channel format in D3D9 was R32F\n\t\t\t\treturn DXGI_FORMAT_R32_FLOAT; // D3DX writes this out as a FourCC of 114\n\t\t\tbreak;\n\n\t\tcase 24:\n\t\t\t// No 24bpp DXGI formats aka D3DFMT_R8G8B8\n\t\t\tbreak;\n\n\t\tcase 16:\n\t\t\tif (ISBITMASK(0x7c00, 0x03e0, 0x001f, 0x8000))\n\t\t\t\treturn DXGI_FORMAT_B5G5R5A1_UNORM;\n\n\t\t\tif (ISBITMASK(0xf800, 0x07e0, 0x001f, 0x0000))\n\t\t\t\treturn DXGI_FORMAT_B5G6R5_UNORM;\n\n\t\t\t// No DXGI format maps to ISBITMASK(0x7c00,0x03e0,0x001f,0x0000) aka D3DFMT_X1R5G5B5\n\n\t\t\t// No DXGI format maps to ISBITMASK(0x0f00,0x00f0,0x000f,0x0000) aka D3DFMT_X4R4G4B4\n\n\t\t\t// No 3:3:2, 3:3:2:8, or paletted DXGI formats aka D3DFMT_A8R3G3B2, D3DFMT_R3G3B2, D3DFMT_P8, D3DFMT_A8P8, etc.\n\t\t\tbreak;\n\t\t}\n\t}\n\telse if (ddpf.flags & DDPF_LUMINANCE)\n\t{\n\t\tif (ddpf.rgbBitCount == 8)\n\t\t{\n\t\t\tif (ISBITMASK(0x000000ff, 0x00000000, 0x00000000, 0x00000000))\n\t\t\t\treturn DXGI_FORMAT_R8_UNORM; // D3DX10/11 writes this out as DX10 extension\n\n\t\t\t// No DXGI format maps to ISBITMASK(0x0f,0x00,0x00,0xf0) aka D3DFMT_A4L4\n\n\t\t\tif (ISBITMASK(0x000000ff, 0x00000000, 0x00000000, 0x0000ff00))\n\t\t\t\treturn DXGI_FORMAT_R8G8_UNORM; // Some DDS writers assume the bitcount should be 8 instead of 16\n\t\t}\n\n\t\tif (ddpf.rgbBitCount == 16)\n\t\t{\n\t\t\tif (ISBITMASK(0x0000ffff, 0x00000000, 0x00000000, 0x00000000))\n\t\t\t\treturn DXGI_FORMAT_R16_UNORM; // D3DX10/11 writes this out as DX10 extension\n\n\t\t\tif (ISBITMASK(0x000000ff, 0x00000000, 0x00000000, 0x0000ff00))\n\t\t\t\treturn DXGI_FORMAT_R8G8_UNORM; // D3DX10/11 writes this out as DX10 extension\n\t\t}\n\t}\n\telse if (ddpf.flags & DDPF_ALPHA)\n\t{\n\t\tif (ddpf.rgbBitCount == 8)\n\t\t\treturn DXGI_FORMAT_A8_UNORM;\n\t}\n\telse if (ddpf.flags & DDPF_BUMPDUDV)\n\t{\n\t\tif (ddpf.rgbBitCount == 16)\n\t\t{\n\t\t\tif (ISBITMASK(0x00ff, 0xff00, 0x0000, 0x0000))\n\t\t\t\treturn DXGI_FORMAT_R8G8_SNORM; // D3DX10/11 writes this out as DX10 extension\n\t\t}\n\n\t\tif (ddpf.rgbBitCount == 32)\n\t\t{\n\t\t\tif (ISBITMASK(0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000))\n\t\t\t\treturn DXGI_FORMAT_R8G8B8A8_SNORM; // D3DX10/11 writes this out as DX10 extension\n\n\t\t\tif (ISBITMASK(0x0000ffff, 0xffff0000, 0x00000000, 0x00000000))\n\t\t\t\treturn DXGI_FORMAT_R16G16_SNORM; // D3DX10/11 writes this out as DX10 extension\n\n\t\t\t// No DXGI format maps to ISBITMASK(0x3ff00000, 0x000ffc00, 0x000003ff, 0xc0000000) aka D3DFMT_A2W10V10U10\n\t\t}\n\t}\n\telse if (ddpf.flags & DDPF_FOURCC)\n\t{\n\t\tswitch (ddpf.fourCC)\n\t\t{\n\t\tcase MakeFourCC('D','X','T','1'):\n\t\t\treturn DXGI_FORMAT_BC1_UNORM;\n\n\t\tcase MakeFourCC('D','X','T','3'):\n\t\t\treturn DXGI_FORMAT_BC2_UNORM;\n\n\t\tcase MakeFourCC('D','X','T','5'):\n\t\t\treturn DXGI_FORMAT_BC3_UNORM;\n\n\t\t// While pre-multiplied alpha isn't directly supported by the DXGI formats,\n\t\t// they are basically the same as these BC formats so they can be mapped\n\t\tcase MakeFourCC('D','X','T','2'):\n\t\t\treturn DXGI_FORMAT_BC2_UNORM;\n\n\t\tcase MakeFourCC('D','X','T','4'):\n\t\t\treturn DXGI_FORMAT_BC3_UNORM;\n\n\t\tcase MakeFourCC('A','T','I','1'):\n\t\t\treturn DXGI_FORMAT_BC4_UNORM;\n\n\t\tcase MakeFourCC('B','C','4','U'):\n\t\t\treturn DXGI_FORMAT_BC4_UNORM;\n\n\t\tcase MakeFourCC('B','C','4','S'):\n\t\t\treturn DXGI_FORMAT_BC4_SNORM;\n\n\t\tcase MakeFourCC('A','T','I','2'):\n\t\t\treturn DXGI_FORMAT_BC5_UNORM;\n\n\t\tcase MakeFourCC('B','C','5','U'):\n\t\t\treturn DXGI_FORMAT_BC5_UNORM;\n\n\t\tcase MakeFourCC('B','C','5','S'):\n\t\t\treturn DXGI_FORMAT_BC5_SNORM;\n\n\t\t// BC6H and BC7 are written using the \"DX10\" extended header\n\n\t\tcase MakeFourCC('R','G','B','G'):\n\t\t\treturn DXGI_FORMAT_R8G8_B8G8_UNORM;\n\n\t\tcase MakeFourCC('G','R','G','B'):\n\t\t\treturn DXGI_FORMAT_G8R8_G8B8_UNORM;\n\n\t\t// Check for D3DFORMAT enums being set here\n\t\tcase 36: // D3DFMT_A16B16G16R16\n\t\t\treturn DXGI_FORMAT_R16G16B16A16_UNORM;\n\n\t\tcase 110: // D3DFMT_Q16W16V16U16\n\t\t\treturn DXGI_FORMAT_R16G16B16A16_SNORM;\n\n\t\tcase 111: // D3DFMT_R16F\n\t\t\treturn DXGI_FORMAT_R16_FLOAT;\n\n\t\tcase 112: // D3DFMT_G16R16F\n\t\t\treturn DXGI_FORMAT_R16G16_FLOAT;\n\n\t\tcase 113: // D3DFMT_A16B16G16R16F\n\t\t\treturn DXGI_FORMAT_R16G16B16A16_FLOAT;\n\n\t\tcase 114: // D3DFMT_R32F\n\t\t\treturn DXGI_FORMAT_R32_FLOAT;\n\n\t\tcase 115: // D3DFMT_G32R32F\n\t\t\treturn DXGI_FORMAT_R32G32_FLOAT;\n\n\t\tcase 116: // D3DFMT_A32B32G32R32F\n\t\t\treturn DXGI_FORMAT_R32G32B32A32_FLOAT;\n\t\t}\n\t}\n\n\treturn DXGI_FORMAT_UNKNOWN;\n}\n\nstatic size_t getBitsPerPixel(DXGIFormat fmt)\n{\n\tswitch (fmt)\n\t{\n\tcase DXGI_FORMAT_R32G32B32A32_TYPELESS:\n\tcase DXGI_FORMAT_R32G32B32A32_FLOAT:\n\tcase DXGI_FORMAT_R32G32B32A32_UINT:\n\tcase DXGI_FORMAT_R32G32B32A32_SINT:\n\t\treturn 128;\n\n\tcase DXGI_FORMAT_R32G32B32_TYPELESS:\n\tcase DXGI_FORMAT_R32G32B32_FLOAT:\n\tcase DXGI_FORMAT_R32G32B32_UINT:\n\tcase DXGI_FORMAT_R32G32B32_SINT:\n\t\treturn 96;\n\n\tcase DXGI_FORMAT_R16G16B16A16_TYPELESS:\n\tcase DXGI_FORMAT_R16G16B16A16_FLOAT:\n\tcase DXGI_FORMAT_R16G16B16A16_UNORM:\n\tcase DXGI_FORMAT_R16G16B16A16_UINT:\n\tcase DXGI_FORMAT_R16G16B16A16_SNORM:\n\tcase DXGI_FORMAT_R16G16B16A16_SINT:\n\tcase DXGI_FORMAT_R32G32_TYPELESS:\n\tcase DXGI_FORMAT_R32G32_FLOAT:\n\tcase DXGI_FORMAT_R32G32_UINT:\n\tcase DXGI_FORMAT_R32G32_SINT:\n\tcase DXGI_FORMAT_R32G8X24_TYPELESS:\n\tcase DXGI_FORMAT_D32_FLOAT_S8X24_UINT:\n\tcase DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:\n\tcase DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:\n\t\treturn 64;\n\n\tcase DXGI_FORMAT_R10G10B10A2_TYPELESS:\n\tcase DXGI_FORMAT_R10G10B10A2_UNORM:\n\tcase DXGI_FORMAT_R10G10B10A2_UINT:\n\tcase DXGI_FORMAT_R11G11B10_FLOAT:\n\tcase DXGI_FORMAT_R8G8B8A8_TYPELESS:\n\tcase DXGI_FORMAT_R8G8B8A8_UNORM:\n\tcase DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:\n\tcase DXGI_FORMAT_R8G8B8A8_UINT:\n\tcase DXGI_FORMAT_R8G8B8A8_SNORM:\n\tcase DXGI_FORMAT_R8G8B8A8_SINT:\n\tcase DXGI_FORMAT_R16G16_TYPELESS:\n\tcase DXGI_FORMAT_R16G16_FLOAT:\n\tcase DXGI_FORMAT_R16G16_UNORM:\n\tcase DXGI_FORMAT_R16G16_UINT:\n\tcase DXGI_FORMAT_R16G16_SNORM:\n\tcase DXGI_FORMAT_R16G16_SINT:\n\tcase DXGI_FORMAT_R32_TYPELESS:\n\tcase DXGI_FORMAT_D32_FLOAT:\n\tcase DXGI_FORMAT_R32_FLOAT:\n\tcase DXGI_FORMAT_R32_UINT:\n\tcase DXGI_FORMAT_R32_SINT:\n\tcase DXGI_FORMAT_R24G8_TYPELESS:\n\tcase DXGI_FORMAT_D24_UNORM_S8_UINT:\n\tcase DXGI_FORMAT_R24_UNORM_X8_TYPELESS:\n\tcase DXGI_FORMAT_X24_TYPELESS_G8_UINT:\n\tcase DXGI_FORMAT_R9G9B9E5_SHAREDEXP:\n\tcase DXGI_FORMAT_R8G8_B8G8_UNORM:\n\tcase DXGI_FORMAT_G8R8_G8B8_UNORM:\n\tcase DXGI_FORMAT_B8G8R8A8_UNORM:\n\tcase DXGI_FORMAT_B8G8R8X8_UNORM:\n\tcase DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:\n\tcase DXGI_FORMAT_B8G8R8A8_TYPELESS:\n\tcase DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:\n\tcase DXGI_FORMAT_B8G8R8X8_TYPELESS:\n\tcase DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:\n\t\treturn 32;\n\n\tcase DXGI_FORMAT_R8G8_TYPELESS:\n\tcase DXGI_FORMAT_R8G8_UNORM:\n\tcase DXGI_FORMAT_R8G8_UINT:\n\tcase DXGI_FORMAT_R8G8_SNORM:\n\tcase DXGI_FORMAT_R8G8_SINT:\n\tcase DXGI_FORMAT_R16_TYPELESS:\n\tcase DXGI_FORMAT_R16_FLOAT:\n\tcase DXGI_FORMAT_D16_UNORM:\n\tcase DXGI_FORMAT_R16_UNORM:\n\tcase DXGI_FORMAT_R16_UINT:\n\tcase DXGI_FORMAT_R16_SNORM:\n\tcase DXGI_FORMAT_R16_SINT:\n\tcase DXGI_FORMAT_B5G6R5_UNORM:\n\tcase DXGI_FORMAT_B5G5R5A1_UNORM:\n\t\treturn 16;\n\n\tcase DXGI_FORMAT_R8_TYPELESS:\n\tcase DXGI_FORMAT_R8_UNORM:\n\tcase DXGI_FORMAT_R8_UINT:\n\tcase DXGI_FORMAT_R8_SNORM:\n\tcase DXGI_FORMAT_R8_SINT:\n\tcase DXGI_FORMAT_A8_UNORM:\n\t\treturn 8;\n\n\tcase DXGI_FORMAT_R1_UNORM:\n\t\treturn 1;\n\n\tcase DXGI_FORMAT_BC1_TYPELESS:\n\tcase DXGI_FORMAT_BC1_UNORM:\n\tcase DXGI_FORMAT_BC1_UNORM_SRGB:\n\tcase DXGI_FORMAT_BC4_TYPELESS:\n\tcase DXGI_FORMAT_BC4_UNORM:\n\tcase DXGI_FORMAT_BC4_SNORM:\n\t\treturn 4;\n\n\tcase DXGI_FORMAT_BC2_TYPELESS:\n\tcase DXGI_FORMAT_BC2_UNORM:\n\tcase DXGI_FORMAT_BC2_UNORM_SRGB:\n\tcase DXGI_FORMAT_BC3_TYPELESS:\n\tcase DXGI_FORMAT_BC3_UNORM:\n\tcase DXGI_FORMAT_BC3_UNORM_SRGB:\n\tcase DXGI_FORMAT_BC5_TYPELESS:\n\tcase DXGI_FORMAT_BC5_UNORM:\n\tcase DXGI_FORMAT_BC5_SNORM:\n\tcase DXGI_FORMAT_BC6H_TYPELESS:\n\tcase DXGI_FORMAT_BC6H_UF16:\n\tcase DXGI_FORMAT_BC6H_SF16:\n\tcase DXGI_FORMAT_BC7_TYPELESS:\n\tcase DXGI_FORMAT_BC7_UNORM:\n\tcase DXGI_FORMAT_BC7_UNORM_SRGB:\n\t\treturn 8;\n\n\tdefault:\n\t\treturn 0;\n\t}\n}\n\nstatic bool isBlockCompressed(DXGIFormat fmt)\n{\n\tswitch (fmt)\n\t{\n\tcase DXGI_FORMAT_BC1_TYPELESS:\n\tcase DXGI_FORMAT_BC1_UNORM:\n\tcase DXGI_FORMAT_BC1_UNORM_SRGB:\n\tcase DXGI_FORMAT_BC4_TYPELESS:\n\tcase DXGI_FORMAT_BC4_UNORM:\n\tcase DXGI_FORMAT_BC4_SNORM:\n\tcase DXGI_FORMAT_BC2_TYPELESS:\n\tcase DXGI_FORMAT_BC2_UNORM:\n\tcase DXGI_FORMAT_BC2_UNORM_SRGB:\n\tcase DXGI_FORMAT_BC3_TYPELESS:\n\tcase DXGI_FORMAT_BC3_UNORM:\n\tcase DXGI_FORMAT_BC3_UNORM_SRGB:\n\tcase DXGI_FORMAT_BC5_TYPELESS:\n\tcase DXGI_FORMAT_BC5_UNORM:\n\tcase DXGI_FORMAT_BC5_SNORM:\n\tcase DXGI_FORMAT_BC6H_TYPELESS:\n\tcase DXGI_FORMAT_BC6H_UF16:\n\tcase DXGI_FORMAT_BC6H_SF16:\n\tcase DXGI_FORMAT_BC7_TYPELESS:\n\tcase DXGI_FORMAT_BC7_UNORM:\n\tcase DXGI_FORMAT_BC7_UNORM_SRGB:\n\t\treturn true;\n\tdefault:\n\t\treturn false;\n\t}\n}\n\nbool isDDS(const void *data, size_t dataSize)\n{\n\tconst uint8_t *readData = (const uint8_t *) data;\n\tptrdiff_t offset = 0;\n\n\t// Is the data large enough to hold the DDS header?\n\tif(dataSize < sizeof(uint32_t) + sizeof(DDSHeader))\n\t\treturn false;\n\n\t// All DDS files start with \"DDS \".\n\tif((*(uint32_t *) readData) != MakeFourCC('D','D','S',' '))\n\t\treturn false;\n\n\toffset += sizeof(uint32_t);\n\n\tDDSHeader *header = (DDSHeader *) &readData[offset];\n\n\t// Verify header to validate DDS data.\n\tif (header->size != sizeof(DDSHeader) || header->format.size != sizeof(DDSPixelFormat))\n\t\treturn false;\n\n\toffset += sizeof(DDSHeader);\n\n\t// Check for DX10 extension.\n\tif ((header->format.flags & DDPF_FOURCC) && (header->format.fourCC == MakeFourCC('D','X','1','0')))\n\t{\n\t\t// Data must be big enough for both headers plus the magic value.\n\t\tif (dataSize < (sizeof(uint32_t) + sizeof(DDSHeader) + sizeof(DDSHeader10)))\n\t\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nDXGIFormat getDDSPixelFormat(const void *data, size_t dataSize)\n{\n\tif (!isDDS(data, dataSize))\n\t\treturn DXGI_FORMAT_UNKNOWN;\n\n\tconst uint8_t *readData = (const uint8_t *) data;\n\tptrdiff_t offset = sizeof(uint32_t);\n\n\tDDSHeader *header = (DDSHeader *) &readData[offset];\n\toffset += sizeof(DDSHeader);\n\n\t// Check for DX10 extension.\n\tif ((header->format.flags & DDPF_FOURCC) && (header->format.fourCC == MakeFourCC('D','X','1','0')))\n\t{\n\t\tDDSHeader10 *header10 = (DDSHeader10 *) &readData[offset];\n\t\treturn header10->dxgiFormat;\n\t}\n\n\treturn getDXGIFormat(header->format);\n}\n\nbool isCompressedDDS(const void *data, size_t dataSize)\n{\n\tDXGIFormat format = getDDSPixelFormat(data, dataSize);\n\treturn format != DXGI_FORMAT_UNKNOWN && isBlockCompressed(format);\n}\n\nParser::Parser(const void *data, size_t dataSize)\n\t: format(DXGI_FORMAT_UNKNOWN)\n{\n\tparseData(data, dataSize);\n}\n\nParser::Parser(const Parser &other)\n\t: texData(other.texData)\n\t, format(other.format)\n{\n}\n\nParser::Parser()\n\t: format(DXGI_FORMAT_UNKNOWN)\n{\n}\n\nParser &Parser::operator = (const Parser &other)\n{\n\ttexData = other.texData;\n\tformat = other.format;\n\n\treturn *this;\n}\n\nParser::~Parser()\n{\n}\n\nDXGIFormat Parser::getFormat() const\n{\n\treturn format;\n}\n\nconst Image *Parser::getImageData(size_t miplevel) const\n{\n\tif (miplevel >= texData.size())\n\t\treturn 0;\n\n\treturn &texData[miplevel];\n}\n\nsize_t Parser::getMipmapCount() const\n{\n\treturn texData.size();\n}\n\nsize_t Parser::parseImageSize(DXGIFormat fmt, int width, int height) const\n{\n\tsize_t bytes = 0;\n\tsize_t bytesPerBlock = 0;\n\n\tbool packed = false;\n\tbool blockCompressed = false;\n\n\tswitch (fmt)\n\t{\n\tcase DXGI_FORMAT_BC1_TYPELESS:\n\tcase DXGI_FORMAT_BC1_UNORM:\n\tcase DXGI_FORMAT_BC1_UNORM_SRGB:\n\tcase DXGI_FORMAT_BC4_TYPELESS:\n\tcase DXGI_FORMAT_BC4_UNORM:\n\tcase DXGI_FORMAT_BC4_SNORM:\n\t\tblockCompressed = true;\n\t\tbytesPerBlock = 8;\n\t\tbreak;\n\tcase DXGI_FORMAT_BC2_TYPELESS:\n\tcase DXGI_FORMAT_BC2_UNORM:\n\tcase DXGI_FORMAT_BC2_UNORM_SRGB:\n\tcase DXGI_FORMAT_BC3_TYPELESS:\n\tcase DXGI_FORMAT_BC3_UNORM:\n\tcase DXGI_FORMAT_BC3_UNORM_SRGB:\n\tcase DXGI_FORMAT_BC5_TYPELESS:\n\tcase DXGI_FORMAT_BC5_UNORM:\n\tcase DXGI_FORMAT_BC5_SNORM:\n\tcase DXGI_FORMAT_BC6H_TYPELESS:\n\tcase DXGI_FORMAT_BC6H_UF16:\n\tcase DXGI_FORMAT_BC6H_SF16:\n\tcase DXGI_FORMAT_BC7_TYPELESS:\n\tcase DXGI_FORMAT_BC7_UNORM:\n\tcase DXGI_FORMAT_BC7_UNORM_SRGB:\n\t\tblockCompressed = true;\n\t\tbytesPerBlock = 16;\n\t\tbreak;\n\tcase DXGI_FORMAT_R8G8_B8G8_UNORM:\n\tcase DXGI_FORMAT_G8R8_G8B8_UNORM:\n\t\tpacked = true;\n\t\tbytesPerBlock = 4;\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\n\tif (packed)\n\t{\n\t\tsize_t rowBytes = (((size_t) width + 1u) >> 1) * bytesPerBlock;\n\t\tbytes = rowBytes * height;\n\t}\n\telse if (blockCompressed)\n\t{\n\t\tsize_t numBlocksWide = width > 0 ? std::max(1, (width + 3) / 4) : 0;\n\t\tsize_t numBlocksHigh = height > 0 ? std::max(1, (height + 3) / 4) : 0;\n\t\tbytes = numBlocksWide * bytesPerBlock * numBlocksHigh;\n\t}\n\telse\n\t{\n\t\tsize_t bpp = getBitsPerPixel(fmt);\n\t\tif (bpp == 0)\n\t\t\treturn 0;\n\n\t\t// Round up to the nearest byte.\n\t\tsize_t rowBytes = ((size_t) width * bpp + 7u) / 8u;\n\t\tbytes = rowBytes * height;\n\t}\n\n\treturn bytes;\n}\n\nbool Parser::parseTexData(const uint8_t *data, size_t dataSize, DXGIFormat fmt, int w, int h, int nb_mips)\n{\n\tsize_t offset = 0;\n\tstd::vector<Image> newTexData;\n\n\tfor (int i = 0; i < nb_mips; i++)\n\t{\n\t\tImage img;\n\t\timg.width = w;\n\t\timg.height = h;\n\n\t\timg.dataSize = parseImageSize(fmt, img.width, img.height);\n\n\t\t// Make sure the data size is valid.\n\t\tif (img.dataSize == 0 || (offset + img.dataSize) > dataSize)\n\t\t\treturn false;\n\n\t\t// Store the memory address of the data representing this mip level.\n\t\timg.data = &data[offset];\n\n\t\tnewTexData.push_back(img);\n\n\t\t// Move to the next mip level.\n\t\toffset += img.dataSize;\n\n\t\tw = std::max(w / 2, 1);\n\t\th = std::max(h / 2, 1);\n\t}\n\n\ttexData = newTexData;\n\n\treturn true;\n}\n\nbool Parser::parseData(const void *data, size_t dataSize)\n{\n\tif (!isDDS(data, dataSize))\n\t\treturn false;\n\n\tconst uint8_t *readData = (const uint8_t *) data;\n\tptrdiff_t offset = sizeof(uint32_t);\n\n\tDDSHeader *header = (DDSHeader *) &readData[offset];\n\toffset += sizeof(DDSHeader);\n\n\t// Check for DX10 extension.\n\tif ((header->format.flags & DDPF_FOURCC) && (header->format.fourCC == MakeFourCC('D','X','1','0')))\n\t{\n\t\tDDSHeader10 *header10 = (DDSHeader10 *) &readData[offset];\n\t\toffset += sizeof(DDSHeader10);\n\n\t\t// We can't deal with 1D/3D textures.\n\t\tswitch (header10->resourceDimension)\n\t\t{\n\t\tcase D3D10_RESOURCE_DIMENSION_TEXTURE2D:\n\t\tcase D3D10_RESOURCE_DIMENSION_UNKNOWN:\n\t\t\tbreak;\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\n\t\t// We also can't deal with texture arrays and cubemaps.\n\t\tif (header10->arraySize > 1)\n\t\t\treturn false;\n\n\t\tformat = header10->dxgiFormat;\n\t}\n\telse\n\t\tformat = getDXGIFormat(header->format);\n\n\tif (format == DXGI_FORMAT_UNKNOWN)\n\t\treturn false;\n\n\tint w = header->width;\n\tint h = header->height;\n\n\tint nb_mips = std::max((int) header->mipMapCount, 1);\n\n\treturn parseTexData(&readData[offset], dataSize - offset, format, w, h, nb_mips);\n}\n\n} // dds\n"
  },
  {
    "path": "src/libraries/ddsparse/ddsparse.h",
    "content": "/**\n * Simple DDS data parser for compressed 2D textures.\n *\n * Copyright (c) 2013-2024 Sasha Szpakowski\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef DDS_PARSE_H\n#define DDS_PARSE_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n#include <vector>\n\n#include \"ddsinfo.h\"\n\nnamespace dds\n{\n\n// Represents a single mipmap level of a texture.\nstruct Image\n{\n\tint width = 0;\n\tint height = 0;\n\tsize_t dataSize = 0;\n\tconst uint8_t *data = nullptr;\n};\n\n/**\n * Determines whether the input byte data represents a valid DDS file.\n * Does not take into account whether the texture format is supported.\n *\n * @param data     The byte data to parse.\n * @param dataSize The size in bytes of the data.\n **/\nbool isDDS(const void *data, size_t dataSize);\n\n/**\n * Determines whether the input byte data represents a valid compressed DDS\n * file. Takes into account texture format, but not type (3D textures, etc.)\n *\n * @param data     The byte data to parse.\n * @param dataSize The size in bytes of the data.\n **/\nbool isCompressedDDS(const void *data, size_t dataSize);\n\ndxinfo::DXGIFormat getDDSPixelFormat(const void *data, size_t dataSize);\n\nclass Parser\n{\npublic:\n\n\t/**\n\t * Constructor.\n\t * Attempts to parse byte data as a compressed DDS file.\n\t *\n\t * @param data     The byte data to parse.\n\t * @param dataSize The size in bytes of the data.\n\t **/\n\tParser(const void *data, size_t dataSize);\n\tParser(const Parser &other);\n\tParser();\n\n\tParser &operator = (const Parser &other);\n\n\t~Parser();\n\n\t/**\n\t * Gets the format of this texture.\n\t **/\n\tdxinfo::DXGIFormat getFormat() const;\n\n\t/**\n\t * Gets the data of this texture at a mipmap level. Mipmap level 0\n\t * represents the base image.\n\t *\n\t * @param miplevel The mipmap level to get the data of.\n\t * @return Pointer to the image data, or NULL if miplevel is not within the\n\t *         range of [0, numMipmaps).\n\t **/\n\tconst Image *getImageData(size_t miplevel = 0) const;\n\n\t/**\n\t * Gets the number of mipmap levels in this texture.\n\t * Includes the base mip level.\n\t **/\n\tsize_t getMipmapCount() const;\n\nprivate:\n\n\tsize_t parseImageSize(dxinfo::DXGIFormat fmt, int width, int height) const;\n\tbool parseTexData(const uint8_t *data, size_t dataSize, dxinfo::DXGIFormat fmt, int w, int h, int nb_mips);\n\tbool parseData(const void *data, size_t dataSize);\n\n\tstd::vector<Image> texData;\n\tdxinfo::DXGIFormat format;\n\n}; // Parser\n\n} // dds\n\n#endif // DDS_PARSE_H\n"
  },
  {
    "path": "src/libraries/dr/dr_flac.h",
    "content": "/*\nFLAC audio decoder. Choice of public domain or MIT-0. See license statements at the end of this file.\ndr_flac - v0.12.38 - 2022-04-10\n\nDavid Reid - mackron@gmail.com\n\nGitHub: https://github.com/mackron/dr_libs\n*/\n\n/*\nRELEASE NOTES - v0.12.0\n=======================\nVersion 0.12.0 has breaking API changes including changes to the existing API and the removal of deprecated APIs.\n\n\nImproved Client-Defined Memory Allocation\n-----------------------------------------\nThe main change with this release is the addition of a more flexible way of implementing custom memory allocation routines. The\nexisting system of DRFLAC_MALLOC, DRFLAC_REALLOC and DRFLAC_FREE are still in place and will be used by default when no custom\nallocation callbacks are specified.\n\nTo use the new system, you pass in a pointer to a drflac_allocation_callbacks object to drflac_open() and family, like this:\n\n    void* my_malloc(size_t sz, void* pUserData)\n    {\n        return malloc(sz);\n    }\n    void* my_realloc(void* p, size_t sz, void* pUserData)\n    {\n        return realloc(p, sz);\n    }\n    void my_free(void* p, void* pUserData)\n    {\n        free(p);\n    }\n\n    ...\n\n    drflac_allocation_callbacks allocationCallbacks;\n    allocationCallbacks.pUserData = &myData;\n    allocationCallbacks.onMalloc  = my_malloc;\n    allocationCallbacks.onRealloc = my_realloc;\n    allocationCallbacks.onFree    = my_free;\n    drflac* pFlac = drflac_open_file(\"my_file.flac\", &allocationCallbacks);\n\nThe advantage of this new system is that it allows you to specify user data which will be passed in to the allocation routines.\n\nPassing in null for the allocation callbacks object will cause dr_flac to use defaults which is the same as DRFLAC_MALLOC,\nDRFLAC_REALLOC and DRFLAC_FREE and the equivalent of how it worked in previous versions.\n\nEvery API that opens a drflac object now takes this extra parameter. These include the following:\n\n    drflac_open()\n    drflac_open_relaxed()\n    drflac_open_with_metadata()\n    drflac_open_with_metadata_relaxed()\n    drflac_open_file()\n    drflac_open_file_with_metadata()\n    drflac_open_memory()\n    drflac_open_memory_with_metadata()\n    drflac_open_and_read_pcm_frames_s32()\n    drflac_open_and_read_pcm_frames_s16()\n    drflac_open_and_read_pcm_frames_f32()\n    drflac_open_file_and_read_pcm_frames_s32()\n    drflac_open_file_and_read_pcm_frames_s16()\n    drflac_open_file_and_read_pcm_frames_f32()\n    drflac_open_memory_and_read_pcm_frames_s32()\n    drflac_open_memory_and_read_pcm_frames_s16()\n    drflac_open_memory_and_read_pcm_frames_f32()\n\n\n\nOptimizations\n-------------\nSeeking performance has been greatly improved. A new binary search based seeking algorithm has been introduced which significantly\nimproves performance over the brute force method which was used when no seek table was present. Seek table based seeking also takes\nadvantage of the new binary search seeking system to further improve performance there as well. Note that this depends on CRC which\nmeans it will be disabled when DR_FLAC_NO_CRC is used.\n\nThe SSE4.1 pipeline has been cleaned up and optimized. You should see some improvements with decoding speed of 24-bit files in\nparticular. 16-bit streams should also see some improvement.\n\ndrflac_read_pcm_frames_s16() has been optimized. Previously this sat on top of drflac_read_pcm_frames_s32() and performed it's s32\nto s16 conversion in a second pass. This is now all done in a single pass. This includes SSE2 and ARM NEON optimized paths.\n\nA minor optimization has been implemented for drflac_read_pcm_frames_s32(). This will now use an SSE2 optimized pipeline for stereo\nchannel reconstruction which is the last part of the decoding process.\n\nThe ARM build has seen a few improvements. The CLZ (count leading zeroes) and REV (byte swap) instructions are now used when\ncompiling with GCC and Clang which is achieved using inline assembly. The CLZ instruction requires ARM architecture version 5 at\ncompile time and the REV instruction requires ARM architecture version 6.\n\nAn ARM NEON optimized pipeline has been implemented. To enable this you'll need to add -mfpu=neon to the command line when compiling.\n\n\nRemoved APIs\n------------\nThe following APIs were deprecated in version 0.11.0 and have been completely removed in version 0.12.0:\n\n    drflac_read_s32()                   -> drflac_read_pcm_frames_s32()\n    drflac_read_s16()                   -> drflac_read_pcm_frames_s16()\n    drflac_read_f32()                   -> drflac_read_pcm_frames_f32()\n    drflac_seek_to_sample()             -> drflac_seek_to_pcm_frame()\n    drflac_open_and_decode_s32()        -> drflac_open_and_read_pcm_frames_s32()\n    drflac_open_and_decode_s16()        -> drflac_open_and_read_pcm_frames_s16()\n    drflac_open_and_decode_f32()        -> drflac_open_and_read_pcm_frames_f32()\n    drflac_open_and_decode_file_s32()   -> drflac_open_file_and_read_pcm_frames_s32()\n    drflac_open_and_decode_file_s16()   -> drflac_open_file_and_read_pcm_frames_s16()\n    drflac_open_and_decode_file_f32()   -> drflac_open_file_and_read_pcm_frames_f32()\n    drflac_open_and_decode_memory_s32() -> drflac_open_memory_and_read_pcm_frames_s32()\n    drflac_open_and_decode_memory_s16() -> drflac_open_memory_and_read_pcm_frames_s16()\n    drflac_open_and_decode_memory_f32() -> drflac_open_memroy_and_read_pcm_frames_f32()\n\nPrior versions of dr_flac operated on a per-sample basis whereas now it operates on PCM frames. The removed APIs all relate\nto the old per-sample APIs. You now need to use the \"pcm_frame\" versions.\n*/\n\n\n/*\nIntroduction\n============\ndr_flac is a single file library. To use it, do something like the following in one .c file.\n\n    ```c\n    #define DR_FLAC_IMPLEMENTATION\n    #include \"dr_flac.h\"\n    ```\n\nYou can then #include this file in other parts of the program as you would with any other header file. To decode audio data, do something like the following:\n\n    ```c\n    drflac* pFlac = drflac_open_file(\"MySong.flac\", NULL);\n    if (pFlac == NULL) {\n        // Failed to open FLAC file\n    }\n\n    drflac_int32* pSamples = malloc(pFlac->totalPCMFrameCount * pFlac->channels * sizeof(drflac_int32));\n    drflac_uint64 numberOfInterleavedSamplesActuallyRead = drflac_read_pcm_frames_s32(pFlac, pFlac->totalPCMFrameCount, pSamples);\n    ```\n\nThe drflac object represents the decoder. It is a transparent type so all the information you need, such as the number of channels and the bits per sample,\nshould be directly accessible - just make sure you don't change their values. Samples are always output as interleaved signed 32-bit PCM. In the example above\na native FLAC stream was opened, however dr_flac has seamless support for Ogg encapsulated FLAC streams as well.\n\nYou do not need to decode the entire stream in one go - you just specify how many samples you'd like at any given time and the decoder will give you as many\nsamples as it can, up to the amount requested. Later on when you need the next batch of samples, just call it again. Example:\n\n    ```c\n    while (drflac_read_pcm_frames_s32(pFlac, chunkSizeInPCMFrames, pChunkSamples) > 0) {\n        do_something();\n    }\n    ```\n\nYou can seek to a specific PCM frame with `drflac_seek_to_pcm_frame()`.\n\nIf you just want to quickly decode an entire FLAC file in one go you can do something like this:\n\n    ```c\n    unsigned int channels;\n    unsigned int sampleRate;\n    drflac_uint64 totalPCMFrameCount;\n    drflac_int32* pSampleData = drflac_open_file_and_read_pcm_frames_s32(\"MySong.flac\", &channels, &sampleRate, &totalPCMFrameCount, NULL);\n    if (pSampleData == NULL) {\n        // Failed to open and decode FLAC file.\n    }\n\n    ...\n\n    drflac_free(pSampleData, NULL);\n    ```\n\nYou can read samples as signed 16-bit integer and 32-bit floating-point PCM with the *_s16() and *_f32() family of APIs respectively, but note that these\nshould be considered lossy.\n\n\nIf you need access to metadata (album art, etc.), use `drflac_open_with_metadata()`, `drflac_open_file_with_metdata()` or `drflac_open_memory_with_metadata()`.\nThe rationale for keeping these APIs separate is that they're slightly slower than the normal versions and also just a little bit harder to use. dr_flac\nreports metadata to the application through the use of a callback, and every metadata block is reported before `drflac_open_with_metdata()` returns.\n\nThe main opening APIs (`drflac_open()`, etc.) will fail if the header is not present. The presents a problem in certain scenarios such as broadcast style\nstreams or internet radio where the header may not be present because the user has started playback mid-stream. To handle this, use the relaxed APIs:\n    \n    `drflac_open_relaxed()`\n    `drflac_open_with_metadata_relaxed()`\n\nIt is not recommended to use these APIs for file based streams because a missing header would usually indicate a corrupt or perverse file. In addition, these\nAPIs can take a long time to initialize because they may need to spend a lot of time finding the first frame.\n\n\n\nBuild Options\n=============\n#define these options before including this file.\n\n#define DR_FLAC_NO_STDIO\n  Disable `drflac_open_file()` and family.\n\n#define DR_FLAC_NO_OGG\n  Disables support for Ogg/FLAC streams.\n\n#define DR_FLAC_BUFFER_SIZE <number>\n  Defines the size of the internal buffer to store data from onRead(). This buffer is used to reduce the number of calls back to the client for more data.\n  Larger values means more memory, but better performance. My tests show diminishing returns after about 4KB (which is the default). Consider reducing this if\n  you have a very efficient implementation of onRead(), or increase it if it's very inefficient. Must be a multiple of 8.\n\n#define DR_FLAC_NO_CRC\n  Disables CRC checks. This will offer a performance boost when CRC is unnecessary. This will disable binary search seeking. When seeking, the seek table will\n  be used if available. Otherwise the seek will be performed using brute force.\n\n#define DR_FLAC_NO_SIMD\n  Disables SIMD optimizations (SSE on x86/x64 architectures, NEON on ARM architectures). Use this if you are having compatibility issues with your compiler.\n\n\n\nNotes\n=====\n- dr_flac does not support changing the sample rate nor channel count mid stream.\n- dr_flac is not thread-safe, but its APIs can be called from any thread so long as you do your own synchronization.\n- When using Ogg encapsulation, a corrupted metadata block will result in `drflac_open_with_metadata()` and `drflac_open()` returning inconsistent samples due\n  to differences in corrupted stream recorvery logic between the two APIs.\n*/\n\n#ifndef dr_flac_h\n#define dr_flac_h\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define DRFLAC_STRINGIFY(x)      #x\n#define DRFLAC_XSTRINGIFY(x)     DRFLAC_STRINGIFY(x)\n\n#define DRFLAC_VERSION_MAJOR     0\n#define DRFLAC_VERSION_MINOR     12\n#define DRFLAC_VERSION_REVISION  38\n#define DRFLAC_VERSION_STRING    DRFLAC_XSTRINGIFY(DRFLAC_VERSION_MAJOR) \".\" DRFLAC_XSTRINGIFY(DRFLAC_VERSION_MINOR) \".\" DRFLAC_XSTRINGIFY(DRFLAC_VERSION_REVISION)\n\n#include <stddef.h> /* For size_t. */\n\n/* Sized types. */\ntypedef   signed char           drflac_int8;\ntypedef unsigned char           drflac_uint8;\ntypedef   signed short          drflac_int16;\ntypedef unsigned short          drflac_uint16;\ntypedef   signed int            drflac_int32;\ntypedef unsigned int            drflac_uint32;\n#if defined(_MSC_VER) && !defined(__clang__)\n    typedef   signed __int64    drflac_int64;\n    typedef unsigned __int64    drflac_uint64;\n#else\n    #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))\n        #pragma GCC diagnostic push\n        #pragma GCC diagnostic ignored \"-Wlong-long\"\n        #if defined(__clang__)\n            #pragma GCC diagnostic ignored \"-Wc++11-long-long\"\n        #endif\n    #endif\n    typedef   signed long long  drflac_int64;\n    typedef unsigned long long  drflac_uint64;\n    #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))\n        #pragma GCC diagnostic pop\n    #endif\n#endif\n#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__)) || defined(_M_X64) || defined(__ia64) || defined(_M_IA64) || defined(__aarch64__) || defined(_M_ARM64) || defined(__powerpc64__)\n    typedef drflac_uint64       drflac_uintptr;\n#else\n    typedef drflac_uint32       drflac_uintptr;\n#endif\ntypedef drflac_uint8            drflac_bool8;\ntypedef drflac_uint32           drflac_bool32;\n#define DRFLAC_TRUE             1\n#define DRFLAC_FALSE            0\n\n#if !defined(DRFLAC_API)\n    #if defined(DRFLAC_DLL)\n        #if defined(_WIN32)\n            #define DRFLAC_DLL_IMPORT  __declspec(dllimport)\n            #define DRFLAC_DLL_EXPORT  __declspec(dllexport)\n            #define DRFLAC_DLL_PRIVATE static\n        #else\n            #if defined(__GNUC__) && __GNUC__ >= 4\n                #define DRFLAC_DLL_IMPORT  __attribute__((visibility(\"default\")))\n                #define DRFLAC_DLL_EXPORT  __attribute__((visibility(\"default\")))\n                #define DRFLAC_DLL_PRIVATE __attribute__((visibility(\"hidden\")))\n            #else\n                #define DRFLAC_DLL_IMPORT\n                #define DRFLAC_DLL_EXPORT\n                #define DRFLAC_DLL_PRIVATE static\n            #endif\n        #endif\n\n        #if defined(DR_FLAC_IMPLEMENTATION) || defined(DRFLAC_IMPLEMENTATION)\n            #define DRFLAC_API  DRFLAC_DLL_EXPORT\n        #else\n            #define DRFLAC_API  DRFLAC_DLL_IMPORT\n        #endif\n        #define DRFLAC_PRIVATE DRFLAC_DLL_PRIVATE\n    #else\n        #define DRFLAC_API extern\n        #define DRFLAC_PRIVATE static\n    #endif\n#endif\n\n#if defined(_MSC_VER) && _MSC_VER >= 1700   /* Visual Studio 2012 */\n    #define DRFLAC_DEPRECATED       __declspec(deprecated)\n#elif (defined(__GNUC__) && __GNUC__ >= 4)  /* GCC 4 */\n    #define DRFLAC_DEPRECATED       __attribute__((deprecated))\n#elif defined(__has_feature)                /* Clang */\n    #if __has_feature(attribute_deprecated)\n        #define DRFLAC_DEPRECATED   __attribute__((deprecated))\n    #else\n        #define DRFLAC_DEPRECATED\n    #endif\n#else\n    #define DRFLAC_DEPRECATED\n#endif\n\nDRFLAC_API void drflac_version(drflac_uint32* pMajor, drflac_uint32* pMinor, drflac_uint32* pRevision);\nDRFLAC_API const char* drflac_version_string(void);\n\n/*\nAs data is read from the client it is placed into an internal buffer for fast access. This controls the size of that buffer. Larger values means more speed,\nbut also more memory. In my testing there is diminishing returns after about 4KB, but you can fiddle with this to suit your own needs. Must be a multiple of 8.\n*/\n#ifndef DR_FLAC_BUFFER_SIZE\n#define DR_FLAC_BUFFER_SIZE   4096\n#endif\n\n/* Check if we can enable 64-bit optimizations. */\n#if defined(_WIN64) || defined(_LP64) || defined(__LP64__)\n#define DRFLAC_64BIT\n#endif\n\n#ifdef DRFLAC_64BIT\ntypedef drflac_uint64 drflac_cache_t;\n#else\ntypedef drflac_uint32 drflac_cache_t;\n#endif\n\n/* The various metadata block types. */\n#define DRFLAC_METADATA_BLOCK_TYPE_STREAMINFO       0\n#define DRFLAC_METADATA_BLOCK_TYPE_PADDING          1\n#define DRFLAC_METADATA_BLOCK_TYPE_APPLICATION      2\n#define DRFLAC_METADATA_BLOCK_TYPE_SEEKTABLE        3\n#define DRFLAC_METADATA_BLOCK_TYPE_VORBIS_COMMENT   4\n#define DRFLAC_METADATA_BLOCK_TYPE_CUESHEET         5\n#define DRFLAC_METADATA_BLOCK_TYPE_PICTURE          6\n#define DRFLAC_METADATA_BLOCK_TYPE_INVALID          127\n\n/* The various picture types specified in the PICTURE block. */\n#define DRFLAC_PICTURE_TYPE_OTHER                   0\n#define DRFLAC_PICTURE_TYPE_FILE_ICON               1\n#define DRFLAC_PICTURE_TYPE_OTHER_FILE_ICON         2\n#define DRFLAC_PICTURE_TYPE_COVER_FRONT             3\n#define DRFLAC_PICTURE_TYPE_COVER_BACK              4\n#define DRFLAC_PICTURE_TYPE_LEAFLET_PAGE            5\n#define DRFLAC_PICTURE_TYPE_MEDIA                   6\n#define DRFLAC_PICTURE_TYPE_LEAD_ARTIST             7\n#define DRFLAC_PICTURE_TYPE_ARTIST                  8\n#define DRFLAC_PICTURE_TYPE_CONDUCTOR               9\n#define DRFLAC_PICTURE_TYPE_BAND                    10\n#define DRFLAC_PICTURE_TYPE_COMPOSER                11\n#define DRFLAC_PICTURE_TYPE_LYRICIST                12\n#define DRFLAC_PICTURE_TYPE_RECORDING_LOCATION      13\n#define DRFLAC_PICTURE_TYPE_DURING_RECORDING        14\n#define DRFLAC_PICTURE_TYPE_DURING_PERFORMANCE      15\n#define DRFLAC_PICTURE_TYPE_SCREEN_CAPTURE          16\n#define DRFLAC_PICTURE_TYPE_BRIGHT_COLORED_FISH     17\n#define DRFLAC_PICTURE_TYPE_ILLUSTRATION            18\n#define DRFLAC_PICTURE_TYPE_BAND_LOGOTYPE           19\n#define DRFLAC_PICTURE_TYPE_PUBLISHER_LOGOTYPE      20\n\ntypedef enum\n{\n    drflac_container_native,\n    drflac_container_ogg,\n    drflac_container_unknown\n} drflac_container;\n\ntypedef enum\n{\n    drflac_seek_origin_start,\n    drflac_seek_origin_current\n} drflac_seek_origin;\n\n/* Packing is important on this structure because we map this directly to the raw data within the SEEKTABLE metadata block. */\n#pragma pack(2)\ntypedef struct\n{\n    drflac_uint64 firstPCMFrame;\n    drflac_uint64 flacFrameOffset;   /* The offset from the first byte of the header of the first frame. */\n    drflac_uint16 pcmFrameCount;\n} drflac_seekpoint;\n#pragma pack()\n\ntypedef struct\n{\n    drflac_uint16 minBlockSizeInPCMFrames;\n    drflac_uint16 maxBlockSizeInPCMFrames;\n    drflac_uint32 minFrameSizeInPCMFrames;\n    drflac_uint32 maxFrameSizeInPCMFrames;\n    drflac_uint32 sampleRate;\n    drflac_uint8  channels;\n    drflac_uint8  bitsPerSample;\n    drflac_uint64 totalPCMFrameCount;\n    drflac_uint8  md5[16];\n} drflac_streaminfo;\n\ntypedef struct\n{\n    /*\n    The metadata type. Use this to know how to interpret the data below. Will be set to one of the\n    DRFLAC_METADATA_BLOCK_TYPE_* tokens.\n    */\n    drflac_uint32 type;\n\n    /*\n    A pointer to the raw data. This points to a temporary buffer so don't hold on to it. It's best to\n    not modify the contents of this buffer. Use the structures below for more meaningful and structured\n    information about the metadata. It's possible for this to be null.\n    */\n    const void* pRawData;\n\n    /* The size in bytes of the block and the buffer pointed to by pRawData if it's non-NULL. */\n    drflac_uint32 rawDataSize;\n\n    union\n    {\n        drflac_streaminfo streaminfo;\n\n        struct\n        {\n            int unused;\n        } padding;\n\n        struct\n        {\n            drflac_uint32 id;\n            const void* pData;\n            drflac_uint32 dataSize;\n        } application;\n\n        struct\n        {\n            drflac_uint32 seekpointCount;\n            const drflac_seekpoint* pSeekpoints;\n        } seektable;\n\n        struct\n        {\n            drflac_uint32 vendorLength;\n            const char* vendor;\n            drflac_uint32 commentCount;\n            const void* pComments;\n        } vorbis_comment;\n\n        struct\n        {\n            char catalog[128];\n            drflac_uint64 leadInSampleCount;\n            drflac_bool32 isCD;\n            drflac_uint8 trackCount;\n            const void* pTrackData;\n        } cuesheet;\n\n        struct\n        {\n            drflac_uint32 type;\n            drflac_uint32 mimeLength;\n            const char* mime;\n            drflac_uint32 descriptionLength;\n            const char* description;\n            drflac_uint32 width;\n            drflac_uint32 height;\n            drflac_uint32 colorDepth;\n            drflac_uint32 indexColorCount;\n            drflac_uint32 pictureDataSize;\n            const drflac_uint8* pPictureData;\n        } picture;\n    } data;\n} drflac_metadata;\n\n\n/*\nCallback for when data needs to be read from the client.\n\n\nParameters\n----------\npUserData (in)\n    The user data that was passed to drflac_open() and family.\n\npBufferOut (out)\n    The output buffer.\n\nbytesToRead (in)\n    The number of bytes to read.\n\n\nReturn Value\n------------\nThe number of bytes actually read.\n\n\nRemarks\n-------\nA return value of less than bytesToRead indicates the end of the stream. Do _not_ return from this callback until either the entire bytesToRead is filled or\nyou have reached the end of the stream.\n*/\ntypedef size_t (* drflac_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead);\n\n/*\nCallback for when data needs to be seeked.\n\n\nParameters\n----------\npUserData (in)\n    The user data that was passed to drflac_open() and family.\n\noffset (in)\n    The number of bytes to move, relative to the origin. Will never be negative.\n\norigin (in)\n    The origin of the seek - the current position or the start of the stream.\n\n\nReturn Value\n------------\nWhether or not the seek was successful.\n\n\nRemarks\n-------\nThe offset will never be negative. Whether or not it is relative to the beginning or current position is determined by the \"origin\" parameter which will be\neither drflac_seek_origin_start or drflac_seek_origin_current.\n\nWhen seeking to a PCM frame using drflac_seek_to_pcm_frame(), dr_flac may call this with an offset beyond the end of the FLAC stream. This needs to be detected\nand handled by returning DRFLAC_FALSE.\n*/\ntypedef drflac_bool32 (* drflac_seek_proc)(void* pUserData, int offset, drflac_seek_origin origin);\n\n/*\nCallback for when a metadata block is read.\n\n\nParameters\n----------\npUserData (in)\n    The user data that was passed to drflac_open() and family.\n\npMetadata (in)\n    A pointer to a structure containing the data of the metadata block.\n\n\nRemarks\n-------\nUse pMetadata->type to determine which metadata block is being handled and how to read the data. This\nwill be set to one of the DRFLAC_METADATA_BLOCK_TYPE_* tokens.\n*/\ntypedef void (* drflac_meta_proc)(void* pUserData, drflac_metadata* pMetadata);\n\n\ntypedef struct\n{\n    void* pUserData;\n    void* (* onMalloc)(size_t sz, void* pUserData);\n    void* (* onRealloc)(void* p, size_t sz, void* pUserData);\n    void  (* onFree)(void* p, void* pUserData);\n} drflac_allocation_callbacks;\n\n/* Structure for internal use. Only used for decoders opened with drflac_open_memory. */\ntypedef struct\n{\n    const drflac_uint8* data;\n    size_t dataSize;\n    size_t currentReadPos;\n} drflac__memory_stream;\n\n/* Structure for internal use. Used for bit streaming. */\ntypedef struct\n{\n    /* The function to call when more data needs to be read. */\n    drflac_read_proc onRead;\n\n    /* The function to call when the current read position needs to be moved. */\n    drflac_seek_proc onSeek;\n\n    /* The user data to pass around to onRead and onSeek. */\n    void* pUserData;\n\n\n    /*\n    The number of unaligned bytes in the L2 cache. This will always be 0 until the end of the stream is hit. At the end of the\n    stream there will be a number of bytes that don't cleanly fit in an L1 cache line, so we use this variable to know whether\n    or not the bistreamer needs to run on a slower path to read those last bytes. This will never be more than sizeof(drflac_cache_t).\n    */\n    size_t unalignedByteCount;\n\n    /* The content of the unaligned bytes. */\n    drflac_cache_t unalignedCache;\n\n    /* The index of the next valid cache line in the \"L2\" cache. */\n    drflac_uint32 nextL2Line;\n\n    /* The number of bits that have been consumed by the cache. This is used to determine how many valid bits are remaining. */\n    drflac_uint32 consumedBits;\n\n    /*\n    The cached data which was most recently read from the client. There are two levels of cache. Data flows as such:\n    Client -> L2 -> L1. The L2 -> L1 movement is aligned and runs on a fast path in just a few instructions.\n    */\n    drflac_cache_t cacheL2[DR_FLAC_BUFFER_SIZE/sizeof(drflac_cache_t)];\n    drflac_cache_t cache;\n\n    /*\n    CRC-16. This is updated whenever bits are read from the bit stream. Manually set this to 0 to reset the CRC. For FLAC, this\n    is reset to 0 at the beginning of each frame.\n    */\n    drflac_uint16 crc16;\n    drflac_cache_t crc16Cache;              /* A cache for optimizing CRC calculations. This is filled when when the L1 cache is reloaded. */\n    drflac_uint32 crc16CacheIgnoredBytes;   /* The number of bytes to ignore when updating the CRC-16 from the CRC-16 cache. */\n} drflac_bs;\n\ntypedef struct\n{\n    /* The type of the subframe: SUBFRAME_CONSTANT, SUBFRAME_VERBATIM, SUBFRAME_FIXED or SUBFRAME_LPC. */\n    drflac_uint8 subframeType;\n\n    /* The number of wasted bits per sample as specified by the sub-frame header. */\n    drflac_uint8 wastedBitsPerSample;\n\n    /* The order to use for the prediction stage for SUBFRAME_FIXED and SUBFRAME_LPC. */\n    drflac_uint8 lpcOrder;\n\n    /* A pointer to the buffer containing the decoded samples in the subframe. This pointer is an offset from drflac::pExtraData. */\n    drflac_int32* pSamplesS32;\n} drflac_subframe;\n\ntypedef struct\n{\n    /*\n    If the stream uses variable block sizes, this will be set to the index of the first PCM frame. If fixed block sizes are used, this will\n    always be set to 0. This is 64-bit because the decoded PCM frame number will be 36 bits.\n    */\n    drflac_uint64 pcmFrameNumber;\n\n    /*\n    If the stream uses fixed block sizes, this will be set to the frame number. If variable block sizes are used, this will always be 0. This\n    is 32-bit because in fixed block sizes, the maximum frame number will be 31 bits.\n    */\n    drflac_uint32 flacFrameNumber;\n\n    /* The sample rate of this frame. */\n    drflac_uint32 sampleRate;\n\n    /* The number of PCM frames in each sub-frame within this frame. */\n    drflac_uint16 blockSizeInPCMFrames;\n\n    /*\n    The channel assignment of this frame. This is not always set to the channel count. If interchannel decorrelation is being used this\n    will be set to DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE, DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE or DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE.\n    */\n    drflac_uint8 channelAssignment;\n\n    /* The number of bits per sample within this frame. */\n    drflac_uint8 bitsPerSample;\n\n    /* The frame's CRC. */\n    drflac_uint8 crc8;\n} drflac_frame_header;\n\ntypedef struct\n{\n    /* The header. */\n    drflac_frame_header header;\n\n    /*\n    The number of PCM frames left to be read in this FLAC frame. This is initially set to the block size. As PCM frames are read,\n    this will be decremented. When it reaches 0, the decoder will see this frame as fully consumed and load the next frame.\n    */\n    drflac_uint32 pcmFramesRemaining;\n\n    /* The list of sub-frames within the frame. There is one sub-frame for each channel, and there's a maximum of 8 channels. */\n    drflac_subframe subframes[8];\n} drflac_frame;\n\ntypedef struct\n{\n    /* The function to call when a metadata block is read. */\n    drflac_meta_proc onMeta;\n\n    /* The user data posted to the metadata callback function. */\n    void* pUserDataMD;\n\n    /* Memory allocation callbacks. */\n    drflac_allocation_callbacks allocationCallbacks;\n\n\n    /* The sample rate. Will be set to something like 44100. */\n    drflac_uint32 sampleRate;\n\n    /*\n    The number of channels. This will be set to 1 for monaural streams, 2 for stereo, etc. Maximum 8. This is set based on the\n    value specified in the STREAMINFO block.\n    */\n    drflac_uint8 channels;\n\n    /* The bits per sample. Will be set to something like 16, 24, etc. */\n    drflac_uint8 bitsPerSample;\n\n    /* The maximum block size, in samples. This number represents the number of samples in each channel (not combined). */\n    drflac_uint16 maxBlockSizeInPCMFrames;\n\n    /*\n    The total number of PCM Frames making up the stream. Can be 0 in which case it's still a valid stream, but just means\n    the total PCM frame count is unknown. Likely the case with streams like internet radio.\n    */\n    drflac_uint64 totalPCMFrameCount;\n\n\n    /* The container type. This is set based on whether or not the decoder was opened from a native or Ogg stream. */\n    drflac_container container;\n\n    /* The number of seekpoints in the seektable. */\n    drflac_uint32 seekpointCount;\n\n\n    /* Information about the frame the decoder is currently sitting on. */\n    drflac_frame currentFLACFrame;\n\n\n    /* The index of the PCM frame the decoder is currently sitting on. This is only used for seeking. */\n    drflac_uint64 currentPCMFrame;\n\n    /* The position of the first FLAC frame in the stream. This is only ever used for seeking. */\n    drflac_uint64 firstFLACFramePosInBytes;\n\n\n    /* A hack to avoid a malloc() when opening a decoder with drflac_open_memory(). */\n    drflac__memory_stream memoryStream;\n\n\n    /* A pointer to the decoded sample data. This is an offset of pExtraData. */\n    drflac_int32* pDecodedSamples;\n\n    /* A pointer to the seek table. This is an offset of pExtraData, or NULL if there is no seek table. */\n    drflac_seekpoint* pSeekpoints;\n\n    /* Internal use only. Only used with Ogg containers. Points to a drflac_oggbs object. This is an offset of pExtraData. */\n    void* _oggbs;\n\n    /* Internal use only. Used for profiling and testing different seeking modes. */\n    drflac_bool32 _noSeekTableSeek    : 1;\n    drflac_bool32 _noBinarySearchSeek : 1;\n    drflac_bool32 _noBruteForceSeek   : 1;\n\n    /* The bit streamer. The raw FLAC data is fed through this object. */\n    drflac_bs bs;\n\n    /* Variable length extra data. We attach this to the end of the object so we can avoid unnecessary mallocs. */\n    drflac_uint8 pExtraData[1];\n} drflac;\n\n\n/*\nOpens a FLAC decoder.\n\n\nParameters\n----------\nonRead (in)\n    The function to call when data needs to be read from the client.\n\nonSeek (in)\n    The function to call when the read position of the client data needs to move.\n\npUserData (in, optional)\n    A pointer to application defined data that will be passed to onRead and onSeek.\n\npAllocationCallbacks (in, optional)\n    A pointer to application defined callbacks for managing memory allocations.\n\n\nReturn Value\n------------\nReturns a pointer to an object representing the decoder.\n\n\nRemarks\n-------\nClose the decoder with `drflac_close()`.\n\n`pAllocationCallbacks` can be NULL in which case it will use `DRFLAC_MALLOC`, `DRFLAC_REALLOC` and `DRFLAC_FREE`.\n\nThis function will automatically detect whether or not you are attempting to open a native or Ogg encapsulated FLAC, both of which should work seamlessly\nwithout any manual intervention. Ogg encapsulation also works with multiplexed streams which basically means it can play FLAC encoded audio tracks in videos.\n\nThis is the lowest level function for opening a FLAC stream. You can also use `drflac_open_file()` and `drflac_open_memory()` to open the stream from a file or\nfrom a block of memory respectively.\n\nThe STREAMINFO block must be present for this to succeed. Use `drflac_open_relaxed()` to open a FLAC stream where the header may not be present.\n\nUse `drflac_open_with_metadata()` if you need access to metadata.\n\n\nSeek Also\n---------\ndrflac_open_file()\ndrflac_open_memory()\ndrflac_open_with_metadata()\ndrflac_close()\n*/\nDRFLAC_API drflac* drflac_open(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks);\n\n/*\nOpens a FLAC stream with relaxed validation of the header block.\n\n\nParameters\n----------\nonRead (in)\n    The function to call when data needs to be read from the client.\n\nonSeek (in)\n    The function to call when the read position of the client data needs to move.\n\ncontainer (in)\n    Whether or not the FLAC stream is encapsulated using standard FLAC encapsulation or Ogg encapsulation.\n\npUserData (in, optional)\n    A pointer to application defined data that will be passed to onRead and onSeek.\n\npAllocationCallbacks (in, optional)\n    A pointer to application defined callbacks for managing memory allocations.\n\n\nReturn Value\n------------\nA pointer to an object representing the decoder.\n\n\nRemarks\n-------\nThe same as drflac_open(), except attempts to open the stream even when a header block is not present.\n\nBecause the header is not necessarily available, the caller must explicitly define the container (Native or Ogg). Do not set this to `drflac_container_unknown`\nas that is for internal use only.\n\nOpening in relaxed mode will continue reading data from onRead until it finds a valid frame. If a frame is never found it will continue forever. To abort,\nforce your `onRead` callback to return 0, which dr_flac will use as an indicator that the end of the stream was found.\n\nUse `drflac_open_with_metadata_relaxed()` if you need access to metadata.\n*/\nDRFLAC_API drflac* drflac_open_relaxed(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_container container, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks);\n\n/*\nOpens a FLAC decoder and notifies the caller of the metadata chunks (album art, etc.).\n\n\nParameters\n----------\nonRead (in)\n    The function to call when data needs to be read from the client.\n\nonSeek (in)\n    The function to call when the read position of the client data needs to move.\n\nonMeta (in)\n    The function to call for every metadata block.\n\npUserData (in, optional)\n    A pointer to application defined data that will be passed to onRead, onSeek and onMeta.\n\npAllocationCallbacks (in, optional)\n    A pointer to application defined callbacks for managing memory allocations.\n\n\nReturn Value\n------------\nA pointer to an object representing the decoder.\n\n\nRemarks\n-------\nClose the decoder with `drflac_close()`.\n\n`pAllocationCallbacks` can be NULL in which case it will use `DRFLAC_MALLOC`, `DRFLAC_REALLOC` and `DRFLAC_FREE`.\n\nThis is slower than `drflac_open()`, so avoid this one if you don't need metadata. Internally, this will allocate and free memory on the heap for every\nmetadata block except for STREAMINFO and PADDING blocks.\n\nThe caller is notified of the metadata via the `onMeta` callback. All metadata blocks will be handled before the function returns. This callback takes a\npointer to a `drflac_metadata` object which is a union containing the data of all relevant metadata blocks. Use the `type` member to discriminate against\nthe different metadata types.\n\nThe STREAMINFO block must be present for this to succeed. Use `drflac_open_with_metadata_relaxed()` to open a FLAC stream where the header may not be present.\n\nNote that this will behave inconsistently with `drflac_open()` if the stream is an Ogg encapsulated stream and a metadata block is corrupted. This is due to\nthe way the Ogg stream recovers from corrupted pages. When `drflac_open_with_metadata()` is being used, the open routine will try to read the contents of the\nmetadata block, whereas `drflac_open()` will simply seek past it (for the sake of efficiency). This inconsistency can result in different samples being\nreturned depending on whether or not the stream is being opened with metadata.\n\n\nSeek Also\n---------\ndrflac_open_file_with_metadata()\ndrflac_open_memory_with_metadata()\ndrflac_open()\ndrflac_close()\n*/\nDRFLAC_API drflac* drflac_open_with_metadata(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks);\n\n/*\nThe same as drflac_open_with_metadata(), except attempts to open the stream even when a header block is not present.\n\nSee Also\n--------\ndrflac_open_with_metadata()\ndrflac_open_relaxed()\n*/\nDRFLAC_API drflac* drflac_open_with_metadata_relaxed(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, drflac_container container, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks);\n\n/*\nCloses the given FLAC decoder.\n\n\nParameters\n----------\npFlac (in)\n    The decoder to close.\n\n\nRemarks\n-------\nThis will destroy the decoder object.\n\n\nSee Also\n--------\ndrflac_open()\ndrflac_open_with_metadata()\ndrflac_open_file()\ndrflac_open_file_w()\ndrflac_open_file_with_metadata()\ndrflac_open_file_with_metadata_w()\ndrflac_open_memory()\ndrflac_open_memory_with_metadata()\n*/\nDRFLAC_API void drflac_close(drflac* pFlac);\n\n\n/*\nReads sample data from the given FLAC decoder, output as interleaved signed 32-bit PCM.\n\n\nParameters\n----------\npFlac (in)\n    The decoder.\n\nframesToRead (in)\n    The number of PCM frames to read.\n\npBufferOut (out, optional)\n    A pointer to the buffer that will receive the decoded samples.\n\n\nReturn Value\n------------\nReturns the number of PCM frames actually read. If the return value is less than `framesToRead` it has reached the end.\n\n\nRemarks\n-------\npBufferOut can be null, in which case the call will act as a seek, and the return value will be the number of frames seeked.\n*/\nDRFLAC_API drflac_uint64 drflac_read_pcm_frames_s32(drflac* pFlac, drflac_uint64 framesToRead, drflac_int32* pBufferOut);\n\n\n/*\nReads sample data from the given FLAC decoder, output as interleaved signed 16-bit PCM.\n\n\nParameters\n----------\npFlac (in)\n    The decoder.\n\nframesToRead (in)\n    The number of PCM frames to read.\n\npBufferOut (out, optional)\n    A pointer to the buffer that will receive the decoded samples.\n\n\nReturn Value\n------------\nReturns the number of PCM frames actually read. If the return value is less than `framesToRead` it has reached the end.\n\n\nRemarks\n-------\npBufferOut can be null, in which case the call will act as a seek, and the return value will be the number of frames seeked.\n\nNote that this is lossy for streams where the bits per sample is larger than 16.\n*/\nDRFLAC_API drflac_uint64 drflac_read_pcm_frames_s16(drflac* pFlac, drflac_uint64 framesToRead, drflac_int16* pBufferOut);\n\n/*\nReads sample data from the given FLAC decoder, output as interleaved 32-bit floating point PCM.\n\n\nParameters\n----------\npFlac (in)\n    The decoder.\n\nframesToRead (in)\n    The number of PCM frames to read.\n\npBufferOut (out, optional)\n    A pointer to the buffer that will receive the decoded samples.\n\n\nReturn Value\n------------\nReturns the number of PCM frames actually read. If the return value is less than `framesToRead` it has reached the end.\n\n\nRemarks\n-------\npBufferOut can be null, in which case the call will act as a seek, and the return value will be the number of frames seeked.\n\nNote that this should be considered lossy due to the nature of floating point numbers not being able to exactly represent every possible number.\n*/\nDRFLAC_API drflac_uint64 drflac_read_pcm_frames_f32(drflac* pFlac, drflac_uint64 framesToRead, float* pBufferOut);\n\n/*\nSeeks to the PCM frame at the given index.\n\n\nParameters\n----------\npFlac (in)\n    The decoder.\n\npcmFrameIndex (in)\n    The index of the PCM frame to seek to. See notes below.\n\n\nReturn Value\n-------------\n`DRFLAC_TRUE` if successful; `DRFLAC_FALSE` otherwise.\n*/\nDRFLAC_API drflac_bool32 drflac_seek_to_pcm_frame(drflac* pFlac, drflac_uint64 pcmFrameIndex);\n\n\n\n#ifndef DR_FLAC_NO_STDIO\n/*\nOpens a FLAC decoder from the file at the given path.\n\n\nParameters\n----------\npFileName (in)\n    The path of the file to open, either absolute or relative to the current directory.\n\npAllocationCallbacks (in, optional)\n    A pointer to application defined callbacks for managing memory allocations.\n\n\nReturn Value\n------------\nA pointer to an object representing the decoder.\n\n\nRemarks\n-------\nClose the decoder with drflac_close().\n\n\nRemarks\n-------\nThis will hold a handle to the file until the decoder is closed with drflac_close(). Some platforms will restrict the number of files a process can have open\nat any given time, so keep this mind if you have many decoders open at the same time.\n\n\nSee Also\n--------\ndrflac_open_file_with_metadata()\ndrflac_open()\ndrflac_close()\n*/\nDRFLAC_API drflac* drflac_open_file(const char* pFileName, const drflac_allocation_callbacks* pAllocationCallbacks);\nDRFLAC_API drflac* drflac_open_file_w(const wchar_t* pFileName, const drflac_allocation_callbacks* pAllocationCallbacks);\n\n/*\nOpens a FLAC decoder from the file at the given path and notifies the caller of the metadata chunks (album art, etc.)\n\n\nParameters\n----------\npFileName (in)\n    The path of the file to open, either absolute or relative to the current directory.\n\npAllocationCallbacks (in, optional)\n    A pointer to application defined callbacks for managing memory allocations.\n\nonMeta (in)\n    The callback to fire for each metadata block.\n\npUserData (in)\n    A pointer to the user data to pass to the metadata callback.\n\npAllocationCallbacks (in)\n    A pointer to application defined callbacks for managing memory allocations.\n\n\nRemarks\n-------\nLook at the documentation for drflac_open_with_metadata() for more information on how metadata is handled.\n\n\nSee Also\n--------\ndrflac_open_with_metadata()\ndrflac_open()\ndrflac_close()\n*/\nDRFLAC_API drflac* drflac_open_file_with_metadata(const char* pFileName, drflac_meta_proc onMeta, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks);\nDRFLAC_API drflac* drflac_open_file_with_metadata_w(const wchar_t* pFileName, drflac_meta_proc onMeta, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks);\n#endif\n\n/*\nOpens a FLAC decoder from a pre-allocated block of memory\n\n\nParameters\n----------\npData (in)\n    A pointer to the raw encoded FLAC data.\n\ndataSize (in)\n    The size in bytes of `data`.\n\npAllocationCallbacks (in)\n    A pointer to application defined callbacks for managing memory allocations.\n\n\nReturn Value\n------------\nA pointer to an object representing the decoder.\n\n\nRemarks\n-------\nThis does not create a copy of the data. It is up to the application to ensure the buffer remains valid for the lifetime of the decoder.\n\n\nSee Also\n--------\ndrflac_open()\ndrflac_close()\n*/\nDRFLAC_API drflac* drflac_open_memory(const void* pData, size_t dataSize, const drflac_allocation_callbacks* pAllocationCallbacks);\n\n/*\nOpens a FLAC decoder from a pre-allocated block of memory and notifies the caller of the metadata chunks (album art, etc.)\n\n\nParameters\n----------\npData (in)\n    A pointer to the raw encoded FLAC data.\n\ndataSize (in)\n    The size in bytes of `data`.\n\nonMeta (in)\n    The callback to fire for each metadata block.\n\npUserData (in)\n    A pointer to the user data to pass to the metadata callback.\n\npAllocationCallbacks (in)\n    A pointer to application defined callbacks for managing memory allocations.\n\n\nRemarks\n-------\nLook at the documentation for drflac_open_with_metadata() for more information on how metadata is handled.\n\n\nSee Also\n-------\ndrflac_open_with_metadata()\ndrflac_open()\ndrflac_close()\n*/\nDRFLAC_API drflac* drflac_open_memory_with_metadata(const void* pData, size_t dataSize, drflac_meta_proc onMeta, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks);\n\n\n\n/* High Level APIs */\n\n/*\nOpens a FLAC stream from the given callbacks and fully decodes it in a single operation. The return value is a\npointer to the sample data as interleaved signed 32-bit PCM. The returned data must be freed with drflac_free().\n\nYou can pass in custom memory allocation callbacks via the pAllocationCallbacks parameter. This can be NULL in which\ncase it will use DRFLAC_MALLOC, DRFLAC_REALLOC and DRFLAC_FREE.\n\nSometimes a FLAC file won't keep track of the total sample count. In this situation the function will continuously\nread samples into a dynamically sized buffer on the heap until no samples are left.\n\nDo not call this function on a broadcast type of stream (like internet radio streams and whatnot).\n*/\nDRFLAC_API drflac_int32* drflac_open_and_read_pcm_frames_s32(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks);\n\n/* Same as drflac_open_and_read_pcm_frames_s32(), except returns signed 16-bit integer samples. */\nDRFLAC_API drflac_int16* drflac_open_and_read_pcm_frames_s16(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks);\n\n/* Same as drflac_open_and_read_pcm_frames_s32(), except returns 32-bit floating-point samples. */\nDRFLAC_API float* drflac_open_and_read_pcm_frames_f32(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks);\n\n#ifndef DR_FLAC_NO_STDIO\n/* Same as drflac_open_and_read_pcm_frames_s32() except opens the decoder from a file. */\nDRFLAC_API drflac_int32* drflac_open_file_and_read_pcm_frames_s32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks);\n\n/* Same as drflac_open_file_and_read_pcm_frames_s32(), except returns signed 16-bit integer samples. */\nDRFLAC_API drflac_int16* drflac_open_file_and_read_pcm_frames_s16(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks);\n\n/* Same as drflac_open_file_and_read_pcm_frames_s32(), except returns 32-bit floating-point samples. */\nDRFLAC_API float* drflac_open_file_and_read_pcm_frames_f32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks);\n#endif\n\n/* Same as drflac_open_and_read_pcm_frames_s32() except opens the decoder from a block of memory. */\nDRFLAC_API drflac_int32* drflac_open_memory_and_read_pcm_frames_s32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks);\n\n/* Same as drflac_open_memory_and_read_pcm_frames_s32(), except returns signed 16-bit integer samples. */\nDRFLAC_API drflac_int16* drflac_open_memory_and_read_pcm_frames_s16(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks);\n\n/* Same as drflac_open_memory_and_read_pcm_frames_s32(), except returns 32-bit floating-point samples. */\nDRFLAC_API float* drflac_open_memory_and_read_pcm_frames_f32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks);\n\n/*\nFrees memory that was allocated internally by dr_flac.\n\nSet pAllocationCallbacks to the same object that was passed to drflac_open_*_and_read_pcm_frames_*(). If you originally passed in NULL, pass in NULL for this.\n*/\nDRFLAC_API void drflac_free(void* p, const drflac_allocation_callbacks* pAllocationCallbacks);\n\n\n/* Structure representing an iterator for vorbis comments in a VORBIS_COMMENT metadata block. */\ntypedef struct\n{\n    drflac_uint32 countRemaining;\n    const char* pRunningData;\n} drflac_vorbis_comment_iterator;\n\n/*\nInitializes a vorbis comment iterator. This can be used for iterating over the vorbis comments in a VORBIS_COMMENT\nmetadata block.\n*/\nDRFLAC_API void drflac_init_vorbis_comment_iterator(drflac_vorbis_comment_iterator* pIter, drflac_uint32 commentCount, const void* pComments);\n\n/*\nGoes to the next vorbis comment in the given iterator. If null is returned it means there are no more comments. The\nreturned string is NOT null terminated.\n*/\nDRFLAC_API const char* drflac_next_vorbis_comment(drflac_vorbis_comment_iterator* pIter, drflac_uint32* pCommentLengthOut);\n\n\n/* Structure representing an iterator for cuesheet tracks in a CUESHEET metadata block. */\ntypedef struct\n{\n    drflac_uint32 countRemaining;\n    const char* pRunningData;\n} drflac_cuesheet_track_iterator;\n\n/* Packing is important on this structure because we map this directly to the raw data within the CUESHEET metadata block. */\n#pragma pack(4)\ntypedef struct\n{\n    drflac_uint64 offset;\n    drflac_uint8 index;\n    drflac_uint8 reserved[3];\n} drflac_cuesheet_track_index;\n#pragma pack()\n\ntypedef struct\n{\n    drflac_uint64 offset;\n    drflac_uint8 trackNumber;\n    char ISRC[12];\n    drflac_bool8 isAudio;\n    drflac_bool8 preEmphasis;\n    drflac_uint8 indexCount;\n    const drflac_cuesheet_track_index* pIndexPoints;\n} drflac_cuesheet_track;\n\n/*\nInitializes a cuesheet track iterator. This can be used for iterating over the cuesheet tracks in a CUESHEET metadata\nblock.\n*/\nDRFLAC_API void drflac_init_cuesheet_track_iterator(drflac_cuesheet_track_iterator* pIter, drflac_uint32 trackCount, const void* pTrackData);\n\n/* Goes to the next cuesheet track in the given iterator. If DRFLAC_FALSE is returned it means there are no more comments. */\nDRFLAC_API drflac_bool32 drflac_next_cuesheet_track(drflac_cuesheet_track_iterator* pIter, drflac_cuesheet_track* pCuesheetTrack);\n\n\n#ifdef __cplusplus\n}\n#endif\n#endif  /* dr_flac_h */\n\n\n/************************************************************************************************************************************************************\n ************************************************************************************************************************************************************\n\n IMPLEMENTATION\n\n ************************************************************************************************************************************************************\n ************************************************************************************************************************************************************/\n#if defined(DR_FLAC_IMPLEMENTATION) || defined(DRFLAC_IMPLEMENTATION)\n#ifndef dr_flac_c\n#define dr_flac_c\n\n/* Disable some annoying warnings. */\n#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))\n    #pragma GCC diagnostic push\n    #if __GNUC__ >= 7\n    #pragma GCC diagnostic ignored \"-Wimplicit-fallthrough\"\n    #endif\n#endif\n\n#ifdef __linux__\n    #ifndef _BSD_SOURCE\n        #define _BSD_SOURCE\n    #endif\n    #ifndef _DEFAULT_SOURCE\n        #define _DEFAULT_SOURCE\n    #endif\n    #ifndef __USE_BSD\n        #define __USE_BSD\n    #endif\n    #include <endian.h>\n#endif\n\n#include <stdlib.h>\n#include <string.h>\n\n#ifdef _MSC_VER\n    #define DRFLAC_INLINE __forceinline\n#elif defined(__GNUC__)\n    /*\n    I've had a bug report where GCC is emitting warnings about functions possibly not being inlineable. This warning happens when\n    the __attribute__((always_inline)) attribute is defined without an \"inline\" statement. I think therefore there must be some\n    case where \"__inline__\" is not always defined, thus the compiler emitting these warnings. When using -std=c89 or -ansi on the\n    command line, we cannot use the \"inline\" keyword and instead need to use \"__inline__\". In an attempt to work around this issue\n    I am using \"__inline__\" only when we're compiling in strict ANSI mode.\n    */\n    #if defined(__STRICT_ANSI__)\n        #define DRFLAC_GNUC_INLINE_HINT __inline__\n    #else\n        #define DRFLAC_GNUC_INLINE_HINT inline\n    #endif\n\n    #if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)) || defined(__clang__)\n        #define DRFLAC_INLINE DRFLAC_GNUC_INLINE_HINT __attribute__((always_inline))\n    #else\n        #define DRFLAC_INLINE DRFLAC_GNUC_INLINE_HINT\n    #endif\n#elif defined(__WATCOMC__)\n    #define DRFLAC_INLINE __inline\n#else\n    #define DRFLAC_INLINE\n#endif\n\n/* CPU architecture. */\n#if defined(__x86_64__) || defined(_M_X64)\n    #define DRFLAC_X64\n#elif defined(__i386) || defined(_M_IX86)\n    #define DRFLAC_X86\n#elif defined(__arm__) || defined(_M_ARM) || defined(__arm64) || defined(__arm64__) || defined(__aarch64__) || defined(_M_ARM64)\n    #define DRFLAC_ARM\n#endif\n\n/*\nIntrinsics Support\n\nThere's a bug in GCC 4.2.x which results in an incorrect compilation error when using _mm_slli_epi32() where it complains with\n\n    \"error: shift must be an immediate\"\n\nUnfortuantely dr_flac depends on this for a few things so we're just going to disable SSE on GCC 4.2 and below.\n*/\n#if !defined(DR_FLAC_NO_SIMD)\n    #if defined(DRFLAC_X64) || defined(DRFLAC_X86)\n        #if defined(_MSC_VER) && !defined(__clang__)\n            /* MSVC. */\n            #if _MSC_VER >= 1400 && !defined(DRFLAC_NO_SSE2)    /* 2005 */\n                #define DRFLAC_SUPPORT_SSE2\n            #endif\n            #if _MSC_VER >= 1600 && !defined(DRFLAC_NO_SSE41)   /* 2010 */\n                #define DRFLAC_SUPPORT_SSE41\n            #endif\n        #elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))\n            /* Assume GNUC-style. */\n            #if defined(__SSE2__) && !defined(DRFLAC_NO_SSE2)\n                #define DRFLAC_SUPPORT_SSE2\n            #endif\n            #if defined(__SSE4_1__) && !defined(DRFLAC_NO_SSE41)\n                #define DRFLAC_SUPPORT_SSE41\n            #endif\n        #endif\n\n        /* If at this point we still haven't determined compiler support for the intrinsics just fall back to __has_include. */\n        #if !defined(__GNUC__) && !defined(__clang__) && defined(__has_include)\n            #if !defined(DRFLAC_SUPPORT_SSE2) && !defined(DRFLAC_NO_SSE2) && __has_include(<emmintrin.h>)\n                #define DRFLAC_SUPPORT_SSE2\n            #endif\n            #if !defined(DRFLAC_SUPPORT_SSE41) && !defined(DRFLAC_NO_SSE41) && __has_include(<smmintrin.h>)\n                #define DRFLAC_SUPPORT_SSE41\n            #endif\n        #endif\n\n        #if defined(DRFLAC_SUPPORT_SSE41)\n            #include <smmintrin.h>\n        #elif defined(DRFLAC_SUPPORT_SSE2)\n            #include <emmintrin.h>\n        #endif\n    #endif\n\n    #if defined(DRFLAC_ARM)\n        #if !defined(DRFLAC_NO_NEON) && (defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64))\n            #define DRFLAC_SUPPORT_NEON\n            #include <arm_neon.h>\n        #endif\n    #endif\n#endif\n\n/* Compile-time CPU feature support. */\n#if !defined(DR_FLAC_NO_SIMD) && (defined(DRFLAC_X86) || defined(DRFLAC_X64))\n    #if defined(_MSC_VER) && !defined(__clang__)\n        #if _MSC_VER >= 1400\n            #include <intrin.h>\n            static void drflac__cpuid(int info[4], int fid)\n            {\n                __cpuid(info, fid);\n            }\n        #else\n            #define DRFLAC_NO_CPUID\n        #endif\n    #else\n        #if defined(__GNUC__) || defined(__clang__)\n            static void drflac__cpuid(int info[4], int fid)\n            {\n                /*\n                It looks like the -fPIC option uses the ebx register which GCC complains about. We can work around this by just using a different register, the\n                specific register of which I'm letting the compiler decide on. The \"k\" prefix is used to specify a 32-bit register. The {...} syntax is for\n                supporting different assembly dialects.\n\n                What's basically happening is that we're saving and restoring the ebx register manually.\n                */\n                #if defined(DRFLAC_X86) && defined(__PIC__)\n                    __asm__ __volatile__ (\n                        \"xchg{l} {%%}ebx, %k1;\"\n                        \"cpuid;\"\n                        \"xchg{l} {%%}ebx, %k1;\"\n                        : \"=a\"(info[0]), \"=&r\"(info[1]), \"=c\"(info[2]), \"=d\"(info[3]) : \"a\"(fid), \"c\"(0)\n                    );\n                #else\n                    __asm__ __volatile__ (\n                        \"cpuid\" : \"=a\"(info[0]), \"=b\"(info[1]), \"=c\"(info[2]), \"=d\"(info[3]) : \"a\"(fid), \"c\"(0)\n                    );\n                #endif\n            }\n        #else\n            #define DRFLAC_NO_CPUID\n        #endif\n    #endif\n#else\n    #define DRFLAC_NO_CPUID\n#endif\n\nstatic DRFLAC_INLINE drflac_bool32 drflac_has_sse2(void)\n{\n#if defined(DRFLAC_SUPPORT_SSE2)\n    #if (defined(DRFLAC_X64) || defined(DRFLAC_X86)) && !defined(DRFLAC_NO_SSE2)\n        #if defined(DRFLAC_X64)\n            return DRFLAC_TRUE;    /* 64-bit targets always support SSE2. */\n        #elif (defined(_M_IX86_FP) && _M_IX86_FP == 2) || defined(__SSE2__)\n            return DRFLAC_TRUE;    /* If the compiler is allowed to freely generate SSE2 code we can assume support. */\n        #else\n            #if defined(DRFLAC_NO_CPUID)\n                return DRFLAC_FALSE;\n            #else\n                int info[4];\n                drflac__cpuid(info, 1);\n                return (info[3] & (1 << 26)) != 0;\n            #endif\n        #endif\n    #else\n        return DRFLAC_FALSE;       /* SSE2 is only supported on x86 and x64 architectures. */\n    #endif\n#else\n    return DRFLAC_FALSE;           /* No compiler support. */\n#endif\n}\n\nstatic DRFLAC_INLINE drflac_bool32 drflac_has_sse41(void)\n{\n#if defined(DRFLAC_SUPPORT_SSE41)\n    #if (defined(DRFLAC_X64) || defined(DRFLAC_X86)) && !defined(DRFLAC_NO_SSE41)\n        #if defined(DRFLAC_X64)\n            return DRFLAC_TRUE;    /* 64-bit targets always support SSE4.1. */\n        #elif (defined(_M_IX86_FP) && _M_IX86_FP == 2) || defined(__SSE4_1__)\n            return DRFLAC_TRUE;    /* If the compiler is allowed to freely generate SSE41 code we can assume support. */\n        #else\n            #if defined(DRFLAC_NO_CPUID)\n                return DRFLAC_FALSE;\n            #else\n                int info[4];\n                drflac__cpuid(info, 1);\n                return (info[2] & (1 << 19)) != 0;\n            #endif\n        #endif\n    #else\n        return DRFLAC_FALSE;       /* SSE41 is only supported on x86 and x64 architectures. */\n    #endif\n#else\n    return DRFLAC_FALSE;           /* No compiler support. */\n#endif\n}\n\n\n#if defined(_MSC_VER) && _MSC_VER >= 1500 && (defined(DRFLAC_X86) || defined(DRFLAC_X64)) && !defined(__clang__)\n    #define DRFLAC_HAS_LZCNT_INTRINSIC\n#elif (defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)))\n    #define DRFLAC_HAS_LZCNT_INTRINSIC\n#elif defined(__clang__)\n    #if defined(__has_builtin)\n        #if __has_builtin(__builtin_clzll) || __has_builtin(__builtin_clzl)\n            #define DRFLAC_HAS_LZCNT_INTRINSIC\n        #endif\n    #endif\n#endif\n\n#if defined(_MSC_VER) && _MSC_VER >= 1400 && !defined(__clang__)\n    #define DRFLAC_HAS_BYTESWAP16_INTRINSIC\n    #define DRFLAC_HAS_BYTESWAP32_INTRINSIC\n    #define DRFLAC_HAS_BYTESWAP64_INTRINSIC\n#elif defined(__clang__)\n    #if defined(__has_builtin)\n        #if __has_builtin(__builtin_bswap16)\n            #define DRFLAC_HAS_BYTESWAP16_INTRINSIC\n        #endif\n        #if __has_builtin(__builtin_bswap32)\n            #define DRFLAC_HAS_BYTESWAP32_INTRINSIC\n        #endif\n        #if __has_builtin(__builtin_bswap64)\n            #define DRFLAC_HAS_BYTESWAP64_INTRINSIC\n        #endif\n    #endif\n#elif defined(__GNUC__)\n    #if ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))\n        #define DRFLAC_HAS_BYTESWAP32_INTRINSIC\n        #define DRFLAC_HAS_BYTESWAP64_INTRINSIC\n    #endif\n    #if ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))\n        #define DRFLAC_HAS_BYTESWAP16_INTRINSIC\n    #endif\n#elif defined(__WATCOMC__) && defined(__386__)\n    #define DRFLAC_HAS_BYTESWAP16_INTRINSIC\n    #define DRFLAC_HAS_BYTESWAP32_INTRINSIC\n    #define DRFLAC_HAS_BYTESWAP64_INTRINSIC\n    extern __inline drflac_uint16 _watcom_bswap16(drflac_uint16);\n    extern __inline drflac_uint32 _watcom_bswap32(drflac_uint32);\n    extern __inline drflac_uint64 _watcom_bswap64(drflac_uint64);\n#pragma aux _watcom_bswap16 = \\\n    \"xchg al, ah\" \\\n    parm   [ax]   \\\n    modify [ax];\n#pragma aux _watcom_bswap32 = \\\n    \"bswap eax\"  \\\n    parm   [eax] \\\n    modify [eax];\n#pragma aux _watcom_bswap64 = \\\n    \"bswap eax\"     \\\n    \"bswap edx\"     \\\n    \"xchg eax,edx\"  \\\n    parm [eax edx]  \\\n    modify [eax edx];\n#endif\n\n\n/* Standard library stuff. */\n#ifndef DRFLAC_ASSERT\n#include <assert.h>\n#define DRFLAC_ASSERT(expression)           assert(expression)\n#endif\n#ifndef DRFLAC_MALLOC\n#define DRFLAC_MALLOC(sz)                   malloc((sz))\n#endif\n#ifndef DRFLAC_REALLOC\n#define DRFLAC_REALLOC(p, sz)               realloc((p), (sz))\n#endif\n#ifndef DRFLAC_FREE\n#define DRFLAC_FREE(p)                      free((p))\n#endif\n#ifndef DRFLAC_COPY_MEMORY\n#define DRFLAC_COPY_MEMORY(dst, src, sz)    memcpy((dst), (src), (sz))\n#endif\n#ifndef DRFLAC_ZERO_MEMORY\n#define DRFLAC_ZERO_MEMORY(p, sz)           memset((p), 0, (sz))\n#endif\n#ifndef DRFLAC_ZERO_OBJECT\n#define DRFLAC_ZERO_OBJECT(p)               DRFLAC_ZERO_MEMORY((p), sizeof(*(p)))\n#endif\n\n#define DRFLAC_MAX_SIMD_VECTOR_SIZE                     64  /* 64 for AVX-512 in the future. */\n\ntypedef drflac_int32 drflac_result;\n#define DRFLAC_SUCCESS                                   0\n#define DRFLAC_ERROR                                    -1   /* A generic error. */\n#define DRFLAC_INVALID_ARGS                             -2\n#define DRFLAC_INVALID_OPERATION                        -3\n#define DRFLAC_OUT_OF_MEMORY                            -4\n#define DRFLAC_OUT_OF_RANGE                             -5\n#define DRFLAC_ACCESS_DENIED                            -6\n#define DRFLAC_DOES_NOT_EXIST                           -7\n#define DRFLAC_ALREADY_EXISTS                           -8\n#define DRFLAC_TOO_MANY_OPEN_FILES                      -9\n#define DRFLAC_INVALID_FILE                             -10\n#define DRFLAC_TOO_BIG                                  -11\n#define DRFLAC_PATH_TOO_LONG                            -12\n#define DRFLAC_NAME_TOO_LONG                            -13\n#define DRFLAC_NOT_DIRECTORY                            -14\n#define DRFLAC_IS_DIRECTORY                             -15\n#define DRFLAC_DIRECTORY_NOT_EMPTY                      -16\n#define DRFLAC_END_OF_FILE                              -17\n#define DRFLAC_NO_SPACE                                 -18\n#define DRFLAC_BUSY                                     -19\n#define DRFLAC_IO_ERROR                                 -20\n#define DRFLAC_INTERRUPT                                -21\n#define DRFLAC_UNAVAILABLE                              -22\n#define DRFLAC_ALREADY_IN_USE                           -23\n#define DRFLAC_BAD_ADDRESS                              -24\n#define DRFLAC_BAD_SEEK                                 -25\n#define DRFLAC_BAD_PIPE                                 -26\n#define DRFLAC_DEADLOCK                                 -27\n#define DRFLAC_TOO_MANY_LINKS                           -28\n#define DRFLAC_NOT_IMPLEMENTED                          -29\n#define DRFLAC_NO_MESSAGE                               -30\n#define DRFLAC_BAD_MESSAGE                              -31\n#define DRFLAC_NO_DATA_AVAILABLE                        -32\n#define DRFLAC_INVALID_DATA                             -33\n#define DRFLAC_TIMEOUT                                  -34\n#define DRFLAC_NO_NETWORK                               -35\n#define DRFLAC_NOT_UNIQUE                               -36\n#define DRFLAC_NOT_SOCKET                               -37\n#define DRFLAC_NO_ADDRESS                               -38\n#define DRFLAC_BAD_PROTOCOL                             -39\n#define DRFLAC_PROTOCOL_UNAVAILABLE                     -40\n#define DRFLAC_PROTOCOL_NOT_SUPPORTED                   -41\n#define DRFLAC_PROTOCOL_FAMILY_NOT_SUPPORTED            -42\n#define DRFLAC_ADDRESS_FAMILY_NOT_SUPPORTED             -43\n#define DRFLAC_SOCKET_NOT_SUPPORTED                     -44\n#define DRFLAC_CONNECTION_RESET                         -45\n#define DRFLAC_ALREADY_CONNECTED                        -46\n#define DRFLAC_NOT_CONNECTED                            -47\n#define DRFLAC_CONNECTION_REFUSED                       -48\n#define DRFLAC_NO_HOST                                  -49\n#define DRFLAC_IN_PROGRESS                              -50\n#define DRFLAC_CANCELLED                                -51\n#define DRFLAC_MEMORY_ALREADY_MAPPED                    -52\n#define DRFLAC_AT_END                                   -53\n#define DRFLAC_CRC_MISMATCH                             -128\n\n#define DRFLAC_SUBFRAME_CONSTANT                        0\n#define DRFLAC_SUBFRAME_VERBATIM                        1\n#define DRFLAC_SUBFRAME_FIXED                           8\n#define DRFLAC_SUBFRAME_LPC                             32\n#define DRFLAC_SUBFRAME_RESERVED                        255\n\n#define DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE  0\n#define DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2 1\n\n#define DRFLAC_CHANNEL_ASSIGNMENT_INDEPENDENT           0\n#define DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE             8\n#define DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE            9\n#define DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE              10\n\n#define drflac_align(x, a)                              ((((x) + (a) - 1) / (a)) * (a))\n\n\nDRFLAC_API void drflac_version(drflac_uint32* pMajor, drflac_uint32* pMinor, drflac_uint32* pRevision)\n{\n    if (pMajor) {\n        *pMajor = DRFLAC_VERSION_MAJOR;\n    }\n\n    if (pMinor) {\n        *pMinor = DRFLAC_VERSION_MINOR;\n    }\n\n    if (pRevision) {\n        *pRevision = DRFLAC_VERSION_REVISION;\n    }\n}\n\nDRFLAC_API const char* drflac_version_string(void)\n{\n    return DRFLAC_VERSION_STRING;\n}\n\n\n/* CPU caps. */\n#if defined(__has_feature)\n    #if __has_feature(thread_sanitizer)\n        #define DRFLAC_NO_THREAD_SANITIZE __attribute__((no_sanitize(\"thread\")))\n    #else\n        #define DRFLAC_NO_THREAD_SANITIZE\n    #endif\n#else\n    #define DRFLAC_NO_THREAD_SANITIZE\n#endif\n\n#if defined(DRFLAC_HAS_LZCNT_INTRINSIC)\nstatic drflac_bool32 drflac__gIsLZCNTSupported = DRFLAC_FALSE;\n#endif\n\n#ifndef DRFLAC_NO_CPUID\nstatic drflac_bool32 drflac__gIsSSE2Supported  = DRFLAC_FALSE;\nstatic drflac_bool32 drflac__gIsSSE41Supported = DRFLAC_FALSE;\n\n/*\nI've had a bug report that Clang's ThreadSanitizer presents a warning in this function. Having reviewed this, this does\nactually make sense. However, since CPU caps should never differ for a running process, I don't think the trade off of\ncomplicating internal API's by passing around CPU caps versus just disabling the warnings is worthwhile. I'm therefore\njust going to disable these warnings. This is disabled via the DRFLAC_NO_THREAD_SANITIZE attribute.\n*/\nDRFLAC_NO_THREAD_SANITIZE static void drflac__init_cpu_caps(void)\n{\n    static drflac_bool32 isCPUCapsInitialized = DRFLAC_FALSE;\n\n    if (!isCPUCapsInitialized) {\n        /* LZCNT */\n#if defined(DRFLAC_HAS_LZCNT_INTRINSIC)\n        int info[4] = {0};\n        drflac__cpuid(info, 0x80000001);\n        drflac__gIsLZCNTSupported = (info[2] & (1 << 5)) != 0;\n#endif\n\n        /* SSE2 */\n        drflac__gIsSSE2Supported = drflac_has_sse2();\n\n        /* SSE4.1 */\n        drflac__gIsSSE41Supported = drflac_has_sse41();\n\n        /* Initialized. */\n        isCPUCapsInitialized = DRFLAC_TRUE;\n    }\n}\n#else\nstatic drflac_bool32 drflac__gIsNEONSupported  = DRFLAC_FALSE;\n\nstatic DRFLAC_INLINE drflac_bool32 drflac__has_neon(void)\n{\n#if defined(DRFLAC_SUPPORT_NEON)\n    #if defined(DRFLAC_ARM) && !defined(DRFLAC_NO_NEON)\n        #if (defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64))\n            return DRFLAC_TRUE;    /* If the compiler is allowed to freely generate NEON code we can assume support. */\n        #else\n            /* TODO: Runtime check. */\n            return DRFLAC_FALSE;\n        #endif\n    #else\n        return DRFLAC_FALSE;       /* NEON is only supported on ARM architectures. */\n    #endif\n#else\n    return DRFLAC_FALSE;           /* No compiler support. */\n#endif\n}\n\nDRFLAC_NO_THREAD_SANITIZE static void drflac__init_cpu_caps(void)\n{\n    drflac__gIsNEONSupported = drflac__has_neon();\n\n#if defined(DRFLAC_HAS_LZCNT_INTRINSIC) && defined(DRFLAC_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 5)\n    drflac__gIsLZCNTSupported = DRFLAC_TRUE;\n#endif\n}\n#endif\n\n\n/* Endian Management */\nstatic DRFLAC_INLINE drflac_bool32 drflac__is_little_endian(void)\n{\n#if defined(DRFLAC_X86) || defined(DRFLAC_X64)\n    return DRFLAC_TRUE;\n#elif defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && __BYTE_ORDER == __LITTLE_ENDIAN\n    return DRFLAC_TRUE;\n#else\n    int n = 1;\n    return (*(char*)&n) == 1;\n#endif\n}\n\nstatic DRFLAC_INLINE drflac_uint16 drflac__swap_endian_uint16(drflac_uint16 n)\n{\n#ifdef DRFLAC_HAS_BYTESWAP16_INTRINSIC\n    #if defined(_MSC_VER) && !defined(__clang__)\n        return _byteswap_ushort(n);\n    #elif defined(__GNUC__) || defined(__clang__)\n        return __builtin_bswap16(n);\n    #elif defined(__WATCOMC__) && defined(__386__)\n        return _watcom_bswap16(n);\n    #else\n        #error \"This compiler does not support the byte swap intrinsic.\"\n    #endif\n#else\n    return ((n & 0xFF00) >> 8) |\n           ((n & 0x00FF) << 8);\n#endif\n}\n\nstatic DRFLAC_INLINE drflac_uint32 drflac__swap_endian_uint32(drflac_uint32 n)\n{\n#ifdef DRFLAC_HAS_BYTESWAP32_INTRINSIC\n    #if defined(_MSC_VER) && !defined(__clang__)\n        return _byteswap_ulong(n);\n    #elif defined(__GNUC__) || defined(__clang__)\n        #if defined(DRFLAC_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 6) && !defined(DRFLAC_64BIT)   /* <-- 64-bit inline assembly has not been tested, so disabling for now. */\n            /* Inline assembly optimized implementation for ARM. In my testing, GCC does not generate optimized code with __builtin_bswap32(). */\n            drflac_uint32 r;\n            __asm__ __volatile__ (\n            #if defined(DRFLAC_64BIT)\n                \"rev %w[out], %w[in]\" : [out]\"=r\"(r) : [in]\"r\"(n)   /* <-- This is untested. If someone in the community could test this, that would be appreciated! */\n            #else\n                \"rev %[out], %[in]\" : [out]\"=r\"(r) : [in]\"r\"(n)\n            #endif\n            );\n            return r;\n        #else\n            return __builtin_bswap32(n);\n        #endif\n    #elif defined(__WATCOMC__) && defined(__386__)\n        return _watcom_bswap32(n);\n    #else\n        #error \"This compiler does not support the byte swap intrinsic.\"\n    #endif\n#else\n    return ((n & 0xFF000000) >> 24) |\n           ((n & 0x00FF0000) >>  8) |\n           ((n & 0x0000FF00) <<  8) |\n           ((n & 0x000000FF) << 24);\n#endif\n}\n\nstatic DRFLAC_INLINE drflac_uint64 drflac__swap_endian_uint64(drflac_uint64 n)\n{\n#ifdef DRFLAC_HAS_BYTESWAP64_INTRINSIC\n    #if defined(_MSC_VER) && !defined(__clang__)\n        return _byteswap_uint64(n);\n    #elif defined(__GNUC__) || defined(__clang__)\n        return __builtin_bswap64(n);\n    #elif defined(__WATCOMC__) && defined(__386__)\n        return _watcom_bswap64(n);\n    #else\n        #error \"This compiler does not support the byte swap intrinsic.\"\n    #endif\n#else\n    /* Weird \"<< 32\" bitshift is required for C89 because it doesn't support 64-bit constants. Should be optimized out by a good compiler. */\n    return ((n & ((drflac_uint64)0xFF000000 << 32)) >> 56) |\n           ((n & ((drflac_uint64)0x00FF0000 << 32)) >> 40) |\n           ((n & ((drflac_uint64)0x0000FF00 << 32)) >> 24) |\n           ((n & ((drflac_uint64)0x000000FF << 32)) >>  8) |\n           ((n & ((drflac_uint64)0xFF000000      )) <<  8) |\n           ((n & ((drflac_uint64)0x00FF0000      )) << 24) |\n           ((n & ((drflac_uint64)0x0000FF00      )) << 40) |\n           ((n & ((drflac_uint64)0x000000FF      )) << 56);\n#endif\n}\n\n\nstatic DRFLAC_INLINE drflac_uint16 drflac__be2host_16(drflac_uint16 n)\n{\n    if (drflac__is_little_endian()) {\n        return drflac__swap_endian_uint16(n);\n    }\n\n    return n;\n}\n\nstatic DRFLAC_INLINE drflac_uint32 drflac__be2host_32(drflac_uint32 n)\n{\n    if (drflac__is_little_endian()) {\n        return drflac__swap_endian_uint32(n);\n    }\n\n    return n;\n}\n\nstatic DRFLAC_INLINE drflac_uint32 drflac__be2host_32_ptr_unaligned(const void* pData)\n{\n    const drflac_uint8* pNum = (drflac_uint8*)pData;\n    return *(pNum) << 24 | *(pNum+1) << 16 | *(pNum+2) << 8 | *(pNum+3);\n}\n\nstatic DRFLAC_INLINE drflac_uint64 drflac__be2host_64(drflac_uint64 n)\n{\n    if (drflac__is_little_endian()) {\n        return drflac__swap_endian_uint64(n);\n    }\n\n    return n;\n}\n\n\nstatic DRFLAC_INLINE drflac_uint32 drflac__le2host_32(drflac_uint32 n)\n{\n    if (!drflac__is_little_endian()) {\n        return drflac__swap_endian_uint32(n);\n    }\n\n    return n;\n}\n\nstatic DRFLAC_INLINE drflac_uint32 drflac__le2host_32_ptr_unaligned(const void* pData)\n{\n    const drflac_uint8* pNum = (drflac_uint8*)pData;\n    return *pNum | *(pNum+1) << 8 |  *(pNum+2) << 16 | *(pNum+3) << 24;\n}\n\n\nstatic DRFLAC_INLINE drflac_uint32 drflac__unsynchsafe_32(drflac_uint32 n)\n{\n    drflac_uint32 result = 0;\n    result |= (n & 0x7F000000) >> 3;\n    result |= (n & 0x007F0000) >> 2;\n    result |= (n & 0x00007F00) >> 1;\n    result |= (n & 0x0000007F) >> 0;\n\n    return result;\n}\n\n\n\n/* The CRC code below is based on this document: http://zlib.net/crc_v3.txt */\nstatic drflac_uint8 drflac__crc8_table[] = {\n    0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,\n    0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,\n    0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5, 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,\n    0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,\n    0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,\n    0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,\n    0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,\n    0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42, 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,\n    0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,\n    0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,\n    0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,\n    0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C, 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,\n    0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,\n    0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,\n    0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,\n    0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3\n};\n\nstatic drflac_uint16 drflac__crc16_table[] = {\n    0x0000, 0x8005, 0x800F, 0x000A, 0x801B, 0x001E, 0x0014, 0x8011,\n    0x8033, 0x0036, 0x003C, 0x8039, 0x0028, 0x802D, 0x8027, 0x0022,\n    0x8063, 0x0066, 0x006C, 0x8069, 0x0078, 0x807D, 0x8077, 0x0072,\n    0x0050, 0x8055, 0x805F, 0x005A, 0x804B, 0x004E, 0x0044, 0x8041,\n    0x80C3, 0x00C6, 0x00CC, 0x80C9, 0x00D8, 0x80DD, 0x80D7, 0x00D2,\n    0x00F0, 0x80F5, 0x80FF, 0x00FA, 0x80EB, 0x00EE, 0x00E4, 0x80E1,\n    0x00A0, 0x80A5, 0x80AF, 0x00AA, 0x80BB, 0x00BE, 0x00B4, 0x80B1,\n    0x8093, 0x0096, 0x009C, 0x8099, 0x0088, 0x808D, 0x8087, 0x0082,\n    0x8183, 0x0186, 0x018C, 0x8189, 0x0198, 0x819D, 0x8197, 0x0192,\n    0x01B0, 0x81B5, 0x81BF, 0x01BA, 0x81AB, 0x01AE, 0x01A4, 0x81A1,\n    0x01E0, 0x81E5, 0x81EF, 0x01EA, 0x81FB, 0x01FE, 0x01F4, 0x81F1,\n    0x81D3, 0x01D6, 0x01DC, 0x81D9, 0x01C8, 0x81CD, 0x81C7, 0x01C2,\n    0x0140, 0x8145, 0x814F, 0x014A, 0x815B, 0x015E, 0x0154, 0x8151,\n    0x8173, 0x0176, 0x017C, 0x8179, 0x0168, 0x816D, 0x8167, 0x0162,\n    0x8123, 0x0126, 0x012C, 0x8129, 0x0138, 0x813D, 0x8137, 0x0132,\n    0x0110, 0x8115, 0x811F, 0x011A, 0x810B, 0x010E, 0x0104, 0x8101,\n    0x8303, 0x0306, 0x030C, 0x8309, 0x0318, 0x831D, 0x8317, 0x0312,\n    0x0330, 0x8335, 0x833F, 0x033A, 0x832B, 0x032E, 0x0324, 0x8321,\n    0x0360, 0x8365, 0x836F, 0x036A, 0x837B, 0x037E, 0x0374, 0x8371,\n    0x8353, 0x0356, 0x035C, 0x8359, 0x0348, 0x834D, 0x8347, 0x0342,\n    0x03C0, 0x83C5, 0x83CF, 0x03CA, 0x83DB, 0x03DE, 0x03D4, 0x83D1,\n    0x83F3, 0x03F6, 0x03FC, 0x83F9, 0x03E8, 0x83ED, 0x83E7, 0x03E2,\n    0x83A3, 0x03A6, 0x03AC, 0x83A9, 0x03B8, 0x83BD, 0x83B7, 0x03B2,\n    0x0390, 0x8395, 0x839F, 0x039A, 0x838B, 0x038E, 0x0384, 0x8381,\n    0x0280, 0x8285, 0x828F, 0x028A, 0x829B, 0x029E, 0x0294, 0x8291,\n    0x82B3, 0x02B6, 0x02BC, 0x82B9, 0x02A8, 0x82AD, 0x82A7, 0x02A2,\n    0x82E3, 0x02E6, 0x02EC, 0x82E9, 0x02F8, 0x82FD, 0x82F7, 0x02F2,\n    0x02D0, 0x82D5, 0x82DF, 0x02DA, 0x82CB, 0x02CE, 0x02C4, 0x82C1,\n    0x8243, 0x0246, 0x024C, 0x8249, 0x0258, 0x825D, 0x8257, 0x0252,\n    0x0270, 0x8275, 0x827F, 0x027A, 0x826B, 0x026E, 0x0264, 0x8261,\n    0x0220, 0x8225, 0x822F, 0x022A, 0x823B, 0x023E, 0x0234, 0x8231,\n    0x8213, 0x0216, 0x021C, 0x8219, 0x0208, 0x820D, 0x8207, 0x0202\n};\n\nstatic DRFLAC_INLINE drflac_uint8 drflac_crc8_byte(drflac_uint8 crc, drflac_uint8 data)\n{\n    return drflac__crc8_table[crc ^ data];\n}\n\nstatic DRFLAC_INLINE drflac_uint8 drflac_crc8(drflac_uint8 crc, drflac_uint32 data, drflac_uint32 count)\n{\n#ifdef DR_FLAC_NO_CRC\n    (void)crc;\n    (void)data;\n    (void)count;\n    return 0;\n#else\n#if 0\n    /* REFERENCE (use of this implementation requires an explicit flush by doing \"drflac_crc8(crc, 0, 8);\") */\n    drflac_uint8 p = 0x07;\n    for (int i = count-1; i >= 0; --i) {\n        drflac_uint8 bit = (data & (1 << i)) >> i;\n        if (crc & 0x80) {\n            crc = ((crc << 1) | bit) ^ p;\n        } else {\n            crc = ((crc << 1) | bit);\n        }\n    }\n    return crc;\n#else\n    drflac_uint32 wholeBytes;\n    drflac_uint32 leftoverBits;\n    drflac_uint64 leftoverDataMask;\n\n    static drflac_uint64 leftoverDataMaskTable[8] = {\n        0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F\n    };\n\n    DRFLAC_ASSERT(count <= 32);\n\n    wholeBytes = count >> 3;\n    leftoverBits = count - (wholeBytes*8);\n    leftoverDataMask = leftoverDataMaskTable[leftoverBits];\n\n    switch (wholeBytes) {\n        case 4: crc = drflac_crc8_byte(crc, (drflac_uint8)((data & (0xFF000000UL << leftoverBits)) >> (24 + leftoverBits)));\n        case 3: crc = drflac_crc8_byte(crc, (drflac_uint8)((data & (0x00FF0000UL << leftoverBits)) >> (16 + leftoverBits)));\n        case 2: crc = drflac_crc8_byte(crc, (drflac_uint8)((data & (0x0000FF00UL << leftoverBits)) >> ( 8 + leftoverBits)));\n        case 1: crc = drflac_crc8_byte(crc, (drflac_uint8)((data & (0x000000FFUL << leftoverBits)) >> ( 0 + leftoverBits)));\n        case 0: if (leftoverBits > 0) crc = (drflac_uint8)((crc << leftoverBits) ^ drflac__crc8_table[(crc >> (8 - leftoverBits)) ^ (data & leftoverDataMask)]);\n    }\n    return crc;\n#endif\n#endif\n}\n\nstatic DRFLAC_INLINE drflac_uint16 drflac_crc16_byte(drflac_uint16 crc, drflac_uint8 data)\n{\n    return (crc << 8) ^ drflac__crc16_table[(drflac_uint8)(crc >> 8) ^ data];\n}\n\nstatic DRFLAC_INLINE drflac_uint16 drflac_crc16_cache(drflac_uint16 crc, drflac_cache_t data)\n{\n#ifdef DRFLAC_64BIT\n    crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 56) & 0xFF));\n    crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 48) & 0xFF));\n    crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 40) & 0xFF));\n    crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 32) & 0xFF));\n#endif\n    crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 24) & 0xFF));\n    crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 16) & 0xFF));\n    crc = drflac_crc16_byte(crc, (drflac_uint8)((data >>  8) & 0xFF));\n    crc = drflac_crc16_byte(crc, (drflac_uint8)((data >>  0) & 0xFF));\n\n    return crc;\n}\n\nstatic DRFLAC_INLINE drflac_uint16 drflac_crc16_bytes(drflac_uint16 crc, drflac_cache_t data, drflac_uint32 byteCount)\n{\n    switch (byteCount)\n    {\n#ifdef DRFLAC_64BIT\n    case 8: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 56) & 0xFF));\n    case 7: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 48) & 0xFF));\n    case 6: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 40) & 0xFF));\n    case 5: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 32) & 0xFF));\n#endif\n    case 4: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 24) & 0xFF));\n    case 3: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 16) & 0xFF));\n    case 2: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >>  8) & 0xFF));\n    case 1: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >>  0) & 0xFF));\n    }\n\n    return crc;\n}\n\n#if 0\nstatic DRFLAC_INLINE drflac_uint16 drflac_crc16__32bit(drflac_uint16 crc, drflac_uint32 data, drflac_uint32 count)\n{\n#ifdef DR_FLAC_NO_CRC\n    (void)crc;\n    (void)data;\n    (void)count;\n    return 0;\n#else\n#if 0\n    /* REFERENCE (use of this implementation requires an explicit flush by doing \"drflac_crc16(crc, 0, 16);\") */\n    drflac_uint16 p = 0x8005;\n    for (int i = count-1; i >= 0; --i) {\n        drflac_uint16 bit = (data & (1ULL << i)) >> i;\n        if (r & 0x8000) {\n            r = ((r << 1) | bit) ^ p;\n        } else {\n            r = ((r << 1) | bit);\n        }\n    }\n\n    return crc;\n#else\n    drflac_uint32 wholeBytes;\n    drflac_uint32 leftoverBits;\n    drflac_uint64 leftoverDataMask;\n\n    static drflac_uint64 leftoverDataMaskTable[8] = {\n        0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F\n    };\n\n    DRFLAC_ASSERT(count <= 64);\n\n    wholeBytes = count >> 3;\n    leftoverBits = count & 7;\n    leftoverDataMask = leftoverDataMaskTable[leftoverBits];\n\n    switch (wholeBytes) {\n        default:\n        case 4: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (0xFF000000UL << leftoverBits)) >> (24 + leftoverBits)));\n        case 3: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (0x00FF0000UL << leftoverBits)) >> (16 + leftoverBits)));\n        case 2: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (0x0000FF00UL << leftoverBits)) >> ( 8 + leftoverBits)));\n        case 1: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (0x000000FFUL << leftoverBits)) >> ( 0 + leftoverBits)));\n        case 0: if (leftoverBits > 0) crc = (crc << leftoverBits) ^ drflac__crc16_table[(crc >> (16 - leftoverBits)) ^ (data & leftoverDataMask)];\n    }\n    return crc;\n#endif\n#endif\n}\n\nstatic DRFLAC_INLINE drflac_uint16 drflac_crc16__64bit(drflac_uint16 crc, drflac_uint64 data, drflac_uint32 count)\n{\n#ifdef DR_FLAC_NO_CRC\n    (void)crc;\n    (void)data;\n    (void)count;\n    return 0;\n#else\n    drflac_uint32 wholeBytes;\n    drflac_uint32 leftoverBits;\n    drflac_uint64 leftoverDataMask;\n\n    static drflac_uint64 leftoverDataMaskTable[8] = {\n        0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F\n    };\n\n    DRFLAC_ASSERT(count <= 64);\n\n    wholeBytes = count >> 3;\n    leftoverBits = count & 7;\n    leftoverDataMask = leftoverDataMaskTable[leftoverBits];\n\n    switch (wholeBytes) {\n        default:\n        case 8: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0xFF000000 << 32) << leftoverBits)) >> (56 + leftoverBits)));    /* Weird \"<< 32\" bitshift is required for C89 because it doesn't support 64-bit constants. Should be optimized out by a good compiler. */\n        case 7: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x00FF0000 << 32) << leftoverBits)) >> (48 + leftoverBits)));\n        case 6: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x0000FF00 << 32) << leftoverBits)) >> (40 + leftoverBits)));\n        case 5: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x000000FF << 32) << leftoverBits)) >> (32 + leftoverBits)));\n        case 4: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0xFF000000      ) << leftoverBits)) >> (24 + leftoverBits)));\n        case 3: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x00FF0000      ) << leftoverBits)) >> (16 + leftoverBits)));\n        case 2: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x0000FF00      ) << leftoverBits)) >> ( 8 + leftoverBits)));\n        case 1: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x000000FF      ) << leftoverBits)) >> ( 0 + leftoverBits)));\n        case 0: if (leftoverBits > 0) crc = (crc << leftoverBits) ^ drflac__crc16_table[(crc >> (16 - leftoverBits)) ^ (data & leftoverDataMask)];\n    }\n    return crc;\n#endif\n}\n\n\nstatic DRFLAC_INLINE drflac_uint16 drflac_crc16(drflac_uint16 crc, drflac_cache_t data, drflac_uint32 count)\n{\n#ifdef DRFLAC_64BIT\n    return drflac_crc16__64bit(crc, data, count);\n#else\n    return drflac_crc16__32bit(crc, data, count);\n#endif\n}\n#endif\n\n\n#ifdef DRFLAC_64BIT\n#define drflac__be2host__cache_line drflac__be2host_64\n#else\n#define drflac__be2host__cache_line drflac__be2host_32\n#endif\n\n/*\nBIT READING ATTEMPT #2\n\nThis uses a 32- or 64-bit bit-shifted cache - as bits are read, the cache is shifted such that the first valid bit is sitting\non the most significant bit. It uses the notion of an L1 and L2 cache (borrowed from CPU architecture), where the L1 cache\nis a 32- or 64-bit unsigned integer (depending on whether or not a 32- or 64-bit build is being compiled) and the L2 is an\narray of \"cache lines\", with each cache line being the same size as the L1. The L2 is a buffer of about 4KB and is where data\nfrom onRead() is read into.\n*/\n#define DRFLAC_CACHE_L1_SIZE_BYTES(bs)                      (sizeof((bs)->cache))\n#define DRFLAC_CACHE_L1_SIZE_BITS(bs)                       (sizeof((bs)->cache)*8)\n#define DRFLAC_CACHE_L1_BITS_REMAINING(bs)                  (DRFLAC_CACHE_L1_SIZE_BITS(bs) - (bs)->consumedBits)\n#define DRFLAC_CACHE_L1_SELECTION_MASK(_bitCount)           (~((~(drflac_cache_t)0) >> (_bitCount)))\n#define DRFLAC_CACHE_L1_SELECTION_SHIFT(bs, _bitCount)      (DRFLAC_CACHE_L1_SIZE_BITS(bs) - (_bitCount))\n#define DRFLAC_CACHE_L1_SELECT(bs, _bitCount)               (((bs)->cache) & DRFLAC_CACHE_L1_SELECTION_MASK(_bitCount))\n#define DRFLAC_CACHE_L1_SELECT_AND_SHIFT(bs, _bitCount)     (DRFLAC_CACHE_L1_SELECT((bs), (_bitCount)) >>  DRFLAC_CACHE_L1_SELECTION_SHIFT((bs), (_bitCount)))\n#define DRFLAC_CACHE_L1_SELECT_AND_SHIFT_SAFE(bs, _bitCount)(DRFLAC_CACHE_L1_SELECT((bs), (_bitCount)) >> (DRFLAC_CACHE_L1_SELECTION_SHIFT((bs), (_bitCount)) & (DRFLAC_CACHE_L1_SIZE_BITS(bs)-1)))\n#define DRFLAC_CACHE_L2_SIZE_BYTES(bs)                      (sizeof((bs)->cacheL2))\n#define DRFLAC_CACHE_L2_LINE_COUNT(bs)                      (DRFLAC_CACHE_L2_SIZE_BYTES(bs) / sizeof((bs)->cacheL2[0]))\n#define DRFLAC_CACHE_L2_LINES_REMAINING(bs)                 (DRFLAC_CACHE_L2_LINE_COUNT(bs) - (bs)->nextL2Line)\n\n\n#ifndef DR_FLAC_NO_CRC\nstatic DRFLAC_INLINE void drflac__reset_crc16(drflac_bs* bs)\n{\n    bs->crc16 = 0;\n    bs->crc16CacheIgnoredBytes = bs->consumedBits >> 3;\n}\n\nstatic DRFLAC_INLINE void drflac__update_crc16(drflac_bs* bs)\n{\n    if (bs->crc16CacheIgnoredBytes == 0) {\n        bs->crc16 = drflac_crc16_cache(bs->crc16, bs->crc16Cache);\n    } else {\n        bs->crc16 = drflac_crc16_bytes(bs->crc16, bs->crc16Cache, DRFLAC_CACHE_L1_SIZE_BYTES(bs) - bs->crc16CacheIgnoredBytes);\n        bs->crc16CacheIgnoredBytes = 0;\n    }\n}\n\nstatic DRFLAC_INLINE drflac_uint16 drflac__flush_crc16(drflac_bs* bs)\n{\n    /* We should never be flushing in a situation where we are not aligned on a byte boundary. */\n    DRFLAC_ASSERT((DRFLAC_CACHE_L1_BITS_REMAINING(bs) & 7) == 0);\n\n    /*\n    The bits that were read from the L1 cache need to be accumulated. The number of bytes needing to be accumulated is determined\n    by the number of bits that have been consumed.\n    */\n    if (DRFLAC_CACHE_L1_BITS_REMAINING(bs) == 0) {\n        drflac__update_crc16(bs);\n    } else {\n        /* We only accumulate the consumed bits. */\n        bs->crc16 = drflac_crc16_bytes(bs->crc16, bs->crc16Cache >> DRFLAC_CACHE_L1_BITS_REMAINING(bs), (bs->consumedBits >> 3) - bs->crc16CacheIgnoredBytes);\n\n        /*\n        The bits that we just accumulated should never be accumulated again. We need to keep track of how many bytes were accumulated\n        so we can handle that later.\n        */\n        bs->crc16CacheIgnoredBytes = bs->consumedBits >> 3;\n    }\n\n    return bs->crc16;\n}\n#endif\n\nstatic DRFLAC_INLINE drflac_bool32 drflac__reload_l1_cache_from_l2(drflac_bs* bs)\n{\n    size_t bytesRead;\n    size_t alignedL1LineCount;\n\n    /* Fast path. Try loading straight from L2. */\n    if (bs->nextL2Line < DRFLAC_CACHE_L2_LINE_COUNT(bs)) {\n        bs->cache = bs->cacheL2[bs->nextL2Line++];\n        return DRFLAC_TRUE;\n    }\n\n    /*\n    If we get here it means we've run out of data in the L2 cache. We'll need to fetch more from the client, if there's\n    any left.\n    */\n    if (bs->unalignedByteCount > 0) {\n        return DRFLAC_FALSE;   /* If we have any unaligned bytes it means there's no more aligned bytes left in the client. */\n    }\n\n    bytesRead = bs->onRead(bs->pUserData, bs->cacheL2, DRFLAC_CACHE_L2_SIZE_BYTES(bs));\n\n    bs->nextL2Line = 0;\n    if (bytesRead == DRFLAC_CACHE_L2_SIZE_BYTES(bs)) {\n        bs->cache = bs->cacheL2[bs->nextL2Line++];\n        return DRFLAC_TRUE;\n    }\n\n\n    /*\n    If we get here it means we were unable to retrieve enough data to fill the entire L2 cache. It probably\n    means we've just reached the end of the file. We need to move the valid data down to the end of the buffer\n    and adjust the index of the next line accordingly. Also keep in mind that the L2 cache must be aligned to\n    the size of the L1 so we'll need to seek backwards by any misaligned bytes.\n    */\n    alignedL1LineCount = bytesRead / DRFLAC_CACHE_L1_SIZE_BYTES(bs);\n\n    /* We need to keep track of any unaligned bytes for later use. */\n    bs->unalignedByteCount = bytesRead - (alignedL1LineCount * DRFLAC_CACHE_L1_SIZE_BYTES(bs));\n    if (bs->unalignedByteCount > 0) {\n        bs->unalignedCache = bs->cacheL2[alignedL1LineCount];\n    }\n\n    if (alignedL1LineCount > 0) {\n        size_t offset = DRFLAC_CACHE_L2_LINE_COUNT(bs) - alignedL1LineCount;\n        size_t i;\n        for (i = alignedL1LineCount; i > 0; --i) {\n            bs->cacheL2[i-1 + offset] = bs->cacheL2[i-1];\n        }\n\n        bs->nextL2Line = (drflac_uint32)offset;\n        bs->cache = bs->cacheL2[bs->nextL2Line++];\n        return DRFLAC_TRUE;\n    } else {\n        /* If we get into this branch it means we weren't able to load any L1-aligned data. */\n        bs->nextL2Line = DRFLAC_CACHE_L2_LINE_COUNT(bs);\n        return DRFLAC_FALSE;\n    }\n}\n\nstatic drflac_bool32 drflac__reload_cache(drflac_bs* bs)\n{\n    size_t bytesRead;\n\n#ifndef DR_FLAC_NO_CRC\n    drflac__update_crc16(bs);\n#endif\n\n    /* Fast path. Try just moving the next value in the L2 cache to the L1 cache. */\n    if (drflac__reload_l1_cache_from_l2(bs)) {\n        bs->cache = drflac__be2host__cache_line(bs->cache);\n        bs->consumedBits = 0;\n#ifndef DR_FLAC_NO_CRC\n        bs->crc16Cache = bs->cache;\n#endif\n        return DRFLAC_TRUE;\n    }\n\n    /* Slow path. */\n\n    /*\n    If we get here it means we have failed to load the L1 cache from the L2. Likely we've just reached the end of the stream and the last\n    few bytes did not meet the alignment requirements for the L2 cache. In this case we need to fall back to a slower path and read the\n    data from the unaligned cache.\n    */\n    bytesRead = bs->unalignedByteCount;\n    if (bytesRead == 0) {\n        bs->consumedBits = DRFLAC_CACHE_L1_SIZE_BITS(bs);   /* <-- The stream has been exhausted, so marked the bits as consumed. */\n        return DRFLAC_FALSE;\n    }\n\n    DRFLAC_ASSERT(bytesRead < DRFLAC_CACHE_L1_SIZE_BYTES(bs));\n    bs->consumedBits = (drflac_uint32)(DRFLAC_CACHE_L1_SIZE_BYTES(bs) - bytesRead) * 8;\n\n    bs->cache = drflac__be2host__cache_line(bs->unalignedCache);\n    bs->cache &= DRFLAC_CACHE_L1_SELECTION_MASK(DRFLAC_CACHE_L1_BITS_REMAINING(bs));    /* <-- Make sure the consumed bits are always set to zero. Other parts of the library depend on this property. */\n    bs->unalignedByteCount = 0;     /* <-- At this point the unaligned bytes have been moved into the cache and we thus have no more unaligned bytes. */\n\n#ifndef DR_FLAC_NO_CRC\n    bs->crc16Cache = bs->cache >> bs->consumedBits;\n    bs->crc16CacheIgnoredBytes = bs->consumedBits >> 3;\n#endif\n    return DRFLAC_TRUE;\n}\n\nstatic void drflac__reset_cache(drflac_bs* bs)\n{\n    bs->nextL2Line   = DRFLAC_CACHE_L2_LINE_COUNT(bs);  /* <-- This clears the L2 cache. */\n    bs->consumedBits = DRFLAC_CACHE_L1_SIZE_BITS(bs);   /* <-- This clears the L1 cache. */\n    bs->cache = 0;\n    bs->unalignedByteCount = 0;                         /* <-- This clears the trailing unaligned bytes. */\n    bs->unalignedCache = 0;\n\n#ifndef DR_FLAC_NO_CRC\n    bs->crc16Cache = 0;\n    bs->crc16CacheIgnoredBytes = 0;\n#endif\n}\n\n\nstatic DRFLAC_INLINE drflac_bool32 drflac__read_uint32(drflac_bs* bs, unsigned int bitCount, drflac_uint32* pResultOut)\n{\n    DRFLAC_ASSERT(bs != NULL);\n    DRFLAC_ASSERT(pResultOut != NULL);\n    DRFLAC_ASSERT(bitCount > 0);\n    DRFLAC_ASSERT(bitCount <= 32);\n\n    if (bs->consumedBits == DRFLAC_CACHE_L1_SIZE_BITS(bs)) {\n        if (!drflac__reload_cache(bs)) {\n            return DRFLAC_FALSE;\n        }\n    }\n\n    if (bitCount <= DRFLAC_CACHE_L1_BITS_REMAINING(bs)) {\n        /*\n        If we want to load all 32-bits from a 32-bit cache we need to do it slightly differently because we can't do\n        a 32-bit shift on a 32-bit integer. This will never be the case on 64-bit caches, so we can have a slightly\n        more optimal solution for this.\n        */\n#ifdef DRFLAC_64BIT\n        *pResultOut = (drflac_uint32)DRFLAC_CACHE_L1_SELECT_AND_SHIFT(bs, bitCount);\n        bs->consumedBits += bitCount;\n        bs->cache <<= bitCount;\n#else\n        if (bitCount < DRFLAC_CACHE_L1_SIZE_BITS(bs)) {\n            *pResultOut = (drflac_uint32)DRFLAC_CACHE_L1_SELECT_AND_SHIFT(bs, bitCount);\n            bs->consumedBits += bitCount;\n            bs->cache <<= bitCount;\n        } else {\n            /* Cannot shift by 32-bits, so need to do it differently. */\n            *pResultOut = (drflac_uint32)bs->cache;\n            bs->consumedBits = DRFLAC_CACHE_L1_SIZE_BITS(bs);\n            bs->cache = 0;\n        }\n#endif\n\n        return DRFLAC_TRUE;\n    } else {\n        /* It straddles the cached data. It will never cover more than the next chunk. We just read the number in two parts and combine them. */\n        drflac_uint32 bitCountHi = DRFLAC_CACHE_L1_BITS_REMAINING(bs);\n        drflac_uint32 bitCountLo = bitCount - bitCountHi;\n        drflac_uint32 resultHi;\n\n        DRFLAC_ASSERT(bitCountHi > 0);\n        DRFLAC_ASSERT(bitCountHi < 32);\n        resultHi = (drflac_uint32)DRFLAC_CACHE_L1_SELECT_AND_SHIFT(bs, bitCountHi);\n\n        if (!drflac__reload_cache(bs)) {\n            return DRFLAC_FALSE;\n        }\n        if (bitCountLo > DRFLAC_CACHE_L1_BITS_REMAINING(bs)) {\n            /* This happens when we get to end of stream */\n            return DRFLAC_FALSE;\n        }\n\n        *pResultOut = (resultHi << bitCountLo) | (drflac_uint32)DRFLAC_CACHE_L1_SELECT_AND_SHIFT(bs, bitCountLo);\n        bs->consumedBits += bitCountLo;\n        bs->cache <<= bitCountLo;\n        return DRFLAC_TRUE;\n    }\n}\n\nstatic drflac_bool32 drflac__read_int32(drflac_bs* bs, unsigned int bitCount, drflac_int32* pResult)\n{\n    drflac_uint32 result;\n\n    DRFLAC_ASSERT(bs != NULL);\n    DRFLAC_ASSERT(pResult != NULL);\n    DRFLAC_ASSERT(bitCount > 0);\n    DRFLAC_ASSERT(bitCount <= 32);\n\n    if (!drflac__read_uint32(bs, bitCount, &result)) {\n        return DRFLAC_FALSE;\n    }\n\n    /* Do not attempt to shift by 32 as it's undefined. */\n    if (bitCount < 32) {\n        drflac_uint32 signbit;\n        signbit = ((result >> (bitCount-1)) & 0x01);\n        result |= (~signbit + 1) << bitCount;\n    }\n\n    *pResult = (drflac_int32)result;\n    return DRFLAC_TRUE;\n}\n\n#ifdef DRFLAC_64BIT\nstatic drflac_bool32 drflac__read_uint64(drflac_bs* bs, unsigned int bitCount, drflac_uint64* pResultOut)\n{\n    drflac_uint32 resultHi;\n    drflac_uint32 resultLo;\n\n    DRFLAC_ASSERT(bitCount <= 64);\n    DRFLAC_ASSERT(bitCount >  32);\n\n    if (!drflac__read_uint32(bs, bitCount - 32, &resultHi)) {\n        return DRFLAC_FALSE;\n    }\n\n    if (!drflac__read_uint32(bs, 32, &resultLo)) {\n        return DRFLAC_FALSE;\n    }\n\n    *pResultOut = (((drflac_uint64)resultHi) << 32) | ((drflac_uint64)resultLo);\n    return DRFLAC_TRUE;\n}\n#endif\n\n/* Function below is unused, but leaving it here in case I need to quickly add it again. */\n#if 0\nstatic drflac_bool32 drflac__read_int64(drflac_bs* bs, unsigned int bitCount, drflac_int64* pResultOut)\n{\n    drflac_uint64 result;\n    drflac_uint64 signbit;\n\n    DRFLAC_ASSERT(bitCount <= 64);\n\n    if (!drflac__read_uint64(bs, bitCount, &result)) {\n        return DRFLAC_FALSE;\n    }\n\n    signbit = ((result >> (bitCount-1)) & 0x01);\n    result |= (~signbit + 1) << bitCount;\n\n    *pResultOut = (drflac_int64)result;\n    return DRFLAC_TRUE;\n}\n#endif\n\nstatic drflac_bool32 drflac__read_uint16(drflac_bs* bs, unsigned int bitCount, drflac_uint16* pResult)\n{\n    drflac_uint32 result;\n\n    DRFLAC_ASSERT(bs != NULL);\n    DRFLAC_ASSERT(pResult != NULL);\n    DRFLAC_ASSERT(bitCount > 0);\n    DRFLAC_ASSERT(bitCount <= 16);\n\n    if (!drflac__read_uint32(bs, bitCount, &result)) {\n        return DRFLAC_FALSE;\n    }\n\n    *pResult = (drflac_uint16)result;\n    return DRFLAC_TRUE;\n}\n\n#if 0\nstatic drflac_bool32 drflac__read_int16(drflac_bs* bs, unsigned int bitCount, drflac_int16* pResult)\n{\n    drflac_int32 result;\n\n    DRFLAC_ASSERT(bs != NULL);\n    DRFLAC_ASSERT(pResult != NULL);\n    DRFLAC_ASSERT(bitCount > 0);\n    DRFLAC_ASSERT(bitCount <= 16);\n\n    if (!drflac__read_int32(bs, bitCount, &result)) {\n        return DRFLAC_FALSE;\n    }\n\n    *pResult = (drflac_int16)result;\n    return DRFLAC_TRUE;\n}\n#endif\n\nstatic drflac_bool32 drflac__read_uint8(drflac_bs* bs, unsigned int bitCount, drflac_uint8* pResult)\n{\n    drflac_uint32 result;\n\n    DRFLAC_ASSERT(bs != NULL);\n    DRFLAC_ASSERT(pResult != NULL);\n    DRFLAC_ASSERT(bitCount > 0);\n    DRFLAC_ASSERT(bitCount <= 8);\n\n    if (!drflac__read_uint32(bs, bitCount, &result)) {\n        return DRFLAC_FALSE;\n    }\n\n    *pResult = (drflac_uint8)result;\n    return DRFLAC_TRUE;\n}\n\nstatic drflac_bool32 drflac__read_int8(drflac_bs* bs, unsigned int bitCount, drflac_int8* pResult)\n{\n    drflac_int32 result;\n\n    DRFLAC_ASSERT(bs != NULL);\n    DRFLAC_ASSERT(pResult != NULL);\n    DRFLAC_ASSERT(bitCount > 0);\n    DRFLAC_ASSERT(bitCount <= 8);\n\n    if (!drflac__read_int32(bs, bitCount, &result)) {\n        return DRFLAC_FALSE;\n    }\n\n    *pResult = (drflac_int8)result;\n    return DRFLAC_TRUE;\n}\n\n\nstatic drflac_bool32 drflac__seek_bits(drflac_bs* bs, size_t bitsToSeek)\n{\n    if (bitsToSeek <= DRFLAC_CACHE_L1_BITS_REMAINING(bs)) {\n        bs->consumedBits += (drflac_uint32)bitsToSeek;\n        bs->cache <<= bitsToSeek;\n        return DRFLAC_TRUE;\n    } else {\n        /* It straddles the cached data. This function isn't called too frequently so I'm favouring simplicity here. */\n        bitsToSeek       -= DRFLAC_CACHE_L1_BITS_REMAINING(bs);\n        bs->consumedBits += DRFLAC_CACHE_L1_BITS_REMAINING(bs);\n        bs->cache         = 0;\n\n        /* Simple case. Seek in groups of the same number as bits that fit within a cache line. */\n#ifdef DRFLAC_64BIT\n        while (bitsToSeek >= DRFLAC_CACHE_L1_SIZE_BITS(bs)) {\n            drflac_uint64 bin;\n            if (!drflac__read_uint64(bs, DRFLAC_CACHE_L1_SIZE_BITS(bs), &bin)) {\n                return DRFLAC_FALSE;\n            }\n            bitsToSeek -= DRFLAC_CACHE_L1_SIZE_BITS(bs);\n        }\n#else\n        while (bitsToSeek >= DRFLAC_CACHE_L1_SIZE_BITS(bs)) {\n            drflac_uint32 bin;\n            if (!drflac__read_uint32(bs, DRFLAC_CACHE_L1_SIZE_BITS(bs), &bin)) {\n                return DRFLAC_FALSE;\n            }\n            bitsToSeek -= DRFLAC_CACHE_L1_SIZE_BITS(bs);\n        }\n#endif\n\n        /* Whole leftover bytes. */\n        while (bitsToSeek >= 8) {\n            drflac_uint8 bin;\n            if (!drflac__read_uint8(bs, 8, &bin)) {\n                return DRFLAC_FALSE;\n            }\n            bitsToSeek -= 8;\n        }\n\n        /* Leftover bits. */\n        if (bitsToSeek > 0) {\n            drflac_uint8 bin;\n            if (!drflac__read_uint8(bs, (drflac_uint32)bitsToSeek, &bin)) {\n                return DRFLAC_FALSE;\n            }\n            bitsToSeek = 0; /* <-- Necessary for the assert below. */\n        }\n\n        DRFLAC_ASSERT(bitsToSeek == 0);\n        return DRFLAC_TRUE;\n    }\n}\n\n\n/* This function moves the bit streamer to the first bit after the sync code (bit 15 of the of the frame header). It will also update the CRC-16. */\nstatic drflac_bool32 drflac__find_and_seek_to_next_sync_code(drflac_bs* bs)\n{\n    DRFLAC_ASSERT(bs != NULL);\n\n    /*\n    The sync code is always aligned to 8 bits. This is convenient for us because it means we can do byte-aligned movements. The first\n    thing to do is align to the next byte.\n    */\n    if (!drflac__seek_bits(bs, DRFLAC_CACHE_L1_BITS_REMAINING(bs) & 7)) {\n        return DRFLAC_FALSE;\n    }\n\n    for (;;) {\n        drflac_uint8 hi;\n\n#ifndef DR_FLAC_NO_CRC\n        drflac__reset_crc16(bs);\n#endif\n\n        if (!drflac__read_uint8(bs, 8, &hi)) {\n            return DRFLAC_FALSE;\n        }\n\n        if (hi == 0xFF) {\n            drflac_uint8 lo;\n            if (!drflac__read_uint8(bs, 6, &lo)) {\n                return DRFLAC_FALSE;\n            }\n\n            if (lo == 0x3E) {\n                return DRFLAC_TRUE;\n            } else {\n                if (!drflac__seek_bits(bs, DRFLAC_CACHE_L1_BITS_REMAINING(bs) & 7)) {\n                    return DRFLAC_FALSE;\n                }\n            }\n        }\n    }\n\n    /* Should never get here. */\n    /*return DRFLAC_FALSE;*/\n}\n\n\n#if defined(DRFLAC_HAS_LZCNT_INTRINSIC)\n#define DRFLAC_IMPLEMENT_CLZ_LZCNT\n#endif\n#if  defined(_MSC_VER) && _MSC_VER >= 1400 && (defined(DRFLAC_X64) || defined(DRFLAC_X86)) && !defined(__clang__)\n#define DRFLAC_IMPLEMENT_CLZ_MSVC\n#endif\n#if  defined(__WATCOMC__) && defined(__386__)\n#define DRFLAC_IMPLEMENT_CLZ_WATCOM\n#endif\n\nstatic DRFLAC_INLINE drflac_uint32 drflac__clz_software(drflac_cache_t x)\n{\n    drflac_uint32 n;\n    static drflac_uint32 clz_table_4[] = {\n        0,\n        4,\n        3, 3,\n        2, 2, 2, 2,\n        1, 1, 1, 1, 1, 1, 1, 1\n    };\n\n    if (x == 0) {\n        return sizeof(x)*8;\n    }\n\n    n = clz_table_4[x >> (sizeof(x)*8 - 4)];\n    if (n == 0) {\n#ifdef DRFLAC_64BIT\n        if ((x & ((drflac_uint64)0xFFFFFFFF << 32)) == 0) { n  = 32; x <<= 32; }\n        if ((x & ((drflac_uint64)0xFFFF0000 << 32)) == 0) { n += 16; x <<= 16; }\n        if ((x & ((drflac_uint64)0xFF000000 << 32)) == 0) { n += 8;  x <<= 8;  }\n        if ((x & ((drflac_uint64)0xF0000000 << 32)) == 0) { n += 4;  x <<= 4;  }\n#else\n        if ((x & 0xFFFF0000) == 0) { n  = 16; x <<= 16; }\n        if ((x & 0xFF000000) == 0) { n += 8;  x <<= 8;  }\n        if ((x & 0xF0000000) == 0) { n += 4;  x <<= 4;  }\n#endif\n        n += clz_table_4[x >> (sizeof(x)*8 - 4)];\n    }\n\n    return n - 1;\n}\n\n#ifdef DRFLAC_IMPLEMENT_CLZ_LZCNT\nstatic DRFLAC_INLINE drflac_bool32 drflac__is_lzcnt_supported(void)\n{\n    /* Fast compile time check for ARM. */\n#if defined(DRFLAC_HAS_LZCNT_INTRINSIC) && defined(DRFLAC_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 5)\n    return DRFLAC_TRUE;\n#else\n    /* If the compiler itself does not support the intrinsic then we'll need to return false. */\n    #ifdef DRFLAC_HAS_LZCNT_INTRINSIC\n        return drflac__gIsLZCNTSupported;\n    #else\n        return DRFLAC_FALSE;\n    #endif\n#endif\n}\n\nstatic DRFLAC_INLINE drflac_uint32 drflac__clz_lzcnt(drflac_cache_t x)\n{\n    /*\n    It's critical for competitive decoding performance that this function be highly optimal. With MSVC we can use the __lzcnt64() and __lzcnt() intrinsics\n    to achieve good performance, however on GCC and Clang it's a little bit more annoying. The __builtin_clzl() and __builtin_clzll() intrinsics leave\n    it undefined as to the return value when `x` is 0. We need this to be well defined as returning 32 or 64, depending on whether or not it's a 32- or\n    64-bit build. To work around this we would need to add a conditional to check for the x = 0 case, but this creates unnecessary inefficiency. To work\n    around this problem I have written some inline assembly to emit the LZCNT (x86) or CLZ (ARM) instruction directly which removes the need to include\n    the conditional. This has worked well in the past, but for some reason Clang's MSVC compatible driver, clang-cl, does not seem to be handling this\n    in the same way as the normal Clang driver. It seems that `clang-cl` is just outputting the wrong results sometimes, maybe due to some register\n    getting clobbered?\n\n    I'm not sure if this is a bug with dr_flac's inlined assembly (most likely), a bug in `clang-cl` or just a misunderstanding on my part with inline\n    assembly rules for `clang-cl`. If somebody can identify an error in dr_flac's inlined assembly I'm happy to get that fixed.\n\n    Fortunately there is an easy workaround for this. Clang implements MSVC-specific intrinsics for compatibility. It also defines _MSC_VER for extra\n    compatibility. We can therefore just check for _MSC_VER and use the MSVC intrinsic which, fortunately for us, Clang supports. It would still be nice\n    to know how to fix the inlined assembly for correctness sake, however.\n    */\n\n#if defined(_MSC_VER) /*&& !defined(__clang__)*/    /* <-- Intentionally wanting Clang to use the MSVC __lzcnt64/__lzcnt intrinsics due to above ^. */\n    #ifdef DRFLAC_64BIT\n        return (drflac_uint32)__lzcnt64(x);\n    #else\n        return (drflac_uint32)__lzcnt(x);\n    #endif\n#else\n    #if defined(__GNUC__) || defined(__clang__)\n        #if defined(DRFLAC_X64)\n            {\n                drflac_uint64 r;\n                __asm__ __volatile__ (\n                    \"lzcnt{ %1, %0| %0, %1}\" : \"=r\"(r) : \"r\"(x) : \"cc\"\n                );\n\n                return (drflac_uint32)r;\n            }\n        #elif defined(DRFLAC_X86)\n            {\n                drflac_uint32 r;\n                __asm__ __volatile__ (\n                    \"lzcnt{l %1, %0| %0, %1}\" : \"=r\"(r) : \"r\"(x) : \"cc\"\n                );\n\n                return r;\n            }\n        #elif defined(DRFLAC_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 5) && !defined(DRFLAC_64BIT)   /* <-- I haven't tested 64-bit inline assembly, so only enabling this for the 32-bit build for now. */\n            {\n                unsigned int r;\n                __asm__ __volatile__ (\n                #if defined(DRFLAC_64BIT)\n                    \"clz %w[out], %w[in]\" : [out]\"=r\"(r) : [in]\"r\"(x)   /* <-- This is untested. If someone in the community could test this, that would be appreciated! */\n                #else\n                    \"clz %[out], %[in]\" : [out]\"=r\"(r) : [in]\"r\"(x)\n                #endif\n                );\n\n                return r;\n            }\n        #else\n            if (x == 0) {\n                return sizeof(x)*8;\n            }\n            #ifdef DRFLAC_64BIT\n                return (drflac_uint32)__builtin_clzll((drflac_uint64)x);\n            #else\n                return (drflac_uint32)__builtin_clzl((drflac_uint32)x);\n            #endif\n        #endif\n    #else\n        /* Unsupported compiler. */\n        #error \"This compiler does not support the lzcnt intrinsic.\"\n    #endif\n#endif\n}\n#endif\n\n#ifdef DRFLAC_IMPLEMENT_CLZ_MSVC\n#include <intrin.h> /* For BitScanReverse(). */\n\nstatic DRFLAC_INLINE drflac_uint32 drflac__clz_msvc(drflac_cache_t x)\n{\n    drflac_uint32 n;\n\n    if (x == 0) {\n        return sizeof(x)*8;\n    }\n\n#ifdef DRFLAC_64BIT\n    _BitScanReverse64((unsigned long*)&n, x);\n#else\n    _BitScanReverse((unsigned long*)&n, x);\n#endif\n    return sizeof(x)*8 - n - 1;\n}\n#endif\n\n#ifdef DRFLAC_IMPLEMENT_CLZ_WATCOM\nstatic __inline drflac_uint32 drflac__clz_watcom (drflac_uint32);\n#pragma aux drflac__clz_watcom = \\\n    \"bsr eax, eax\" \\\n    \"xor eax, 31\" \\\n    parm [eax] nomemory \\\n    value [eax] \\\n    modify exact [eax] nomemory;\n#endif\n\nstatic DRFLAC_INLINE drflac_uint32 drflac__clz(drflac_cache_t x)\n{\n#ifdef DRFLAC_IMPLEMENT_CLZ_LZCNT\n    if (drflac__is_lzcnt_supported()) {\n        return drflac__clz_lzcnt(x);\n    } else\n#endif\n    {\n#ifdef DRFLAC_IMPLEMENT_CLZ_MSVC\n        return drflac__clz_msvc(x);\n#elif defined(DRFLAC_IMPLEMENT_CLZ_WATCOM)\n        return (x == 0) ? sizeof(x)*8 : drflac__clz_watcom(x);\n#else\n        return drflac__clz_software(x);\n#endif\n    }\n}\n\n\nstatic DRFLAC_INLINE drflac_bool32 drflac__seek_past_next_set_bit(drflac_bs* bs, unsigned int* pOffsetOut)\n{\n    drflac_uint32 zeroCounter = 0;\n    drflac_uint32 setBitOffsetPlus1;\n\n    while (bs->cache == 0) {\n        zeroCounter += (drflac_uint32)DRFLAC_CACHE_L1_BITS_REMAINING(bs);\n        if (!drflac__reload_cache(bs)) {\n            return DRFLAC_FALSE;\n        }\n    }\n\n    if (bs->cache == 1) {\n        /* Not catching this would lead to undefined behaviour: a shift of a 32-bit number by 32 or more is undefined */\n        *pOffsetOut = zeroCounter + (drflac_uint32)DRFLAC_CACHE_L1_BITS_REMAINING(bs) - 1;\n        if (!drflac__reload_cache(bs)) {\n            return DRFLAC_FALSE;\n        }\n\n        return DRFLAC_TRUE;\n    }\n\n    setBitOffsetPlus1 = drflac__clz(bs->cache);\n    setBitOffsetPlus1 += 1;\n\n    if (setBitOffsetPlus1 > DRFLAC_CACHE_L1_BITS_REMAINING(bs)) {\n        /* This happens when we get to end of stream */\n        return DRFLAC_FALSE;\n    }\n\n    bs->consumedBits += setBitOffsetPlus1;\n    bs->cache <<= setBitOffsetPlus1;\n\n    *pOffsetOut = zeroCounter + setBitOffsetPlus1 - 1;\n    return DRFLAC_TRUE;\n}\n\n\n\nstatic drflac_bool32 drflac__seek_to_byte(drflac_bs* bs, drflac_uint64 offsetFromStart)\n{\n    DRFLAC_ASSERT(bs != NULL);\n    DRFLAC_ASSERT(offsetFromStart > 0);\n\n    /*\n    Seeking from the start is not quite as trivial as it sounds because the onSeek callback takes a signed 32-bit integer (which\n    is intentional because it simplifies the implementation of the onSeek callbacks), however offsetFromStart is unsigned 64-bit.\n    To resolve we just need to do an initial seek from the start, and then a series of offset seeks to make up the remainder.\n    */\n    if (offsetFromStart > 0x7FFFFFFF) {\n        drflac_uint64 bytesRemaining = offsetFromStart;\n        if (!bs->onSeek(bs->pUserData, 0x7FFFFFFF, drflac_seek_origin_start)) {\n            return DRFLAC_FALSE;\n        }\n        bytesRemaining -= 0x7FFFFFFF;\n\n        while (bytesRemaining > 0x7FFFFFFF) {\n            if (!bs->onSeek(bs->pUserData, 0x7FFFFFFF, drflac_seek_origin_current)) {\n                return DRFLAC_FALSE;\n            }\n            bytesRemaining -= 0x7FFFFFFF;\n        }\n\n        if (bytesRemaining > 0) {\n            if (!bs->onSeek(bs->pUserData, (int)bytesRemaining, drflac_seek_origin_current)) {\n                return DRFLAC_FALSE;\n            }\n        }\n    } else {\n        if (!bs->onSeek(bs->pUserData, (int)offsetFromStart, drflac_seek_origin_start)) {\n            return DRFLAC_FALSE;\n        }\n    }\n\n    /* The cache should be reset to force a reload of fresh data from the client. */\n    drflac__reset_cache(bs);\n    return DRFLAC_TRUE;\n}\n\n\nstatic drflac_result drflac__read_utf8_coded_number(drflac_bs* bs, drflac_uint64* pNumberOut, drflac_uint8* pCRCOut)\n{\n    drflac_uint8 crc;\n    drflac_uint64 result;\n    drflac_uint8 utf8[7] = {0};\n    int byteCount;\n    int i;\n\n    DRFLAC_ASSERT(bs != NULL);\n    DRFLAC_ASSERT(pNumberOut != NULL);\n    DRFLAC_ASSERT(pCRCOut != NULL);\n\n    crc = *pCRCOut;\n\n    if (!drflac__read_uint8(bs, 8, utf8)) {\n        *pNumberOut = 0;\n        return DRFLAC_AT_END;\n    }\n    crc = drflac_crc8(crc, utf8[0], 8);\n\n    if ((utf8[0] & 0x80) == 0) {\n        *pNumberOut = utf8[0];\n        *pCRCOut = crc;\n        return DRFLAC_SUCCESS;\n    }\n\n    /*byteCount = 1;*/\n    if ((utf8[0] & 0xE0) == 0xC0) {\n        byteCount = 2;\n    } else if ((utf8[0] & 0xF0) == 0xE0) {\n        byteCount = 3;\n    } else if ((utf8[0] & 0xF8) == 0xF0) {\n        byteCount = 4;\n    } else if ((utf8[0] & 0xFC) == 0xF8) {\n        byteCount = 5;\n    } else if ((utf8[0] & 0xFE) == 0xFC) {\n        byteCount = 6;\n    } else if ((utf8[0] & 0xFF) == 0xFE) {\n        byteCount = 7;\n    } else {\n        *pNumberOut = 0;\n        return DRFLAC_CRC_MISMATCH;     /* Bad UTF-8 encoding. */\n    }\n\n    /* Read extra bytes. */\n    DRFLAC_ASSERT(byteCount > 1);\n\n    result = (drflac_uint64)(utf8[0] & (0xFF >> (byteCount + 1)));\n    for (i = 1; i < byteCount; ++i) {\n        if (!drflac__read_uint8(bs, 8, utf8 + i)) {\n            *pNumberOut = 0;\n            return DRFLAC_AT_END;\n        }\n        crc = drflac_crc8(crc, utf8[i], 8);\n\n        result = (result << 6) | (utf8[i] & 0x3F);\n    }\n\n    *pNumberOut = result;\n    *pCRCOut = crc;\n    return DRFLAC_SUCCESS;\n}\n\n\nstatic DRFLAC_INLINE drflac_uint32 drflac__ilog2_u32(drflac_uint32 x)\n{\n#if 1   /* Needs optimizing. */\n    drflac_uint32 result = 0;\n    while (x > 0) {\n        result += 1;\n        x >>= 1;\n    }\n\n    return result;\n#endif\n}\n\nstatic DRFLAC_INLINE drflac_bool32 drflac__use_64_bit_prediction(drflac_uint32 bitsPerSample, drflac_uint32 order, drflac_uint32 precision)\n{\n    /* https://web.archive.org/web/20220205005724/https://github.com/ietf-wg-cellar/flac-specification/blob/37a49aa48ba4ba12e8757badfc59c0df35435fec/rfc_backmatter.md */\n    return bitsPerSample + precision + drflac__ilog2_u32(order) > 32;\n}\n\n\n/*\nThe next two functions are responsible for calculating the prediction.\n\nWhen the bits per sample is >16 we need to use 64-bit integer arithmetic because otherwise we'll run out of precision. It's\nsafe to assume this will be slower on 32-bit platforms so we use a more optimal solution when the bits per sample is <=16.\n*/\n#if defined(__clang__)\n__attribute__((no_sanitize(\"signed-integer-overflow\")))\n#endif\nstatic DRFLAC_INLINE drflac_int32 drflac__calculate_prediction_32(drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pDecodedSamples)\n{\n    drflac_int32 prediction = 0;\n\n    DRFLAC_ASSERT(order <= 32);\n\n    /* 32-bit version. */\n\n    /* VC++ optimizes this to a single jmp. I've not yet verified this for other compilers. */\n    switch (order)\n    {\n    case 32: prediction += coefficients[31] * pDecodedSamples[-32];\n    case 31: prediction += coefficients[30] * pDecodedSamples[-31];\n    case 30: prediction += coefficients[29] * pDecodedSamples[-30];\n    case 29: prediction += coefficients[28] * pDecodedSamples[-29];\n    case 28: prediction += coefficients[27] * pDecodedSamples[-28];\n    case 27: prediction += coefficients[26] * pDecodedSamples[-27];\n    case 26: prediction += coefficients[25] * pDecodedSamples[-26];\n    case 25: prediction += coefficients[24] * pDecodedSamples[-25];\n    case 24: prediction += coefficients[23] * pDecodedSamples[-24];\n    case 23: prediction += coefficients[22] * pDecodedSamples[-23];\n    case 22: prediction += coefficients[21] * pDecodedSamples[-22];\n    case 21: prediction += coefficients[20] * pDecodedSamples[-21];\n    case 20: prediction += coefficients[19] * pDecodedSamples[-20];\n    case 19: prediction += coefficients[18] * pDecodedSamples[-19];\n    case 18: prediction += coefficients[17] * pDecodedSamples[-18];\n    case 17: prediction += coefficients[16] * pDecodedSamples[-17];\n    case 16: prediction += coefficients[15] * pDecodedSamples[-16];\n    case 15: prediction += coefficients[14] * pDecodedSamples[-15];\n    case 14: prediction += coefficients[13] * pDecodedSamples[-14];\n    case 13: prediction += coefficients[12] * pDecodedSamples[-13];\n    case 12: prediction += coefficients[11] * pDecodedSamples[-12];\n    case 11: prediction += coefficients[10] * pDecodedSamples[-11];\n    case 10: prediction += coefficients[ 9] * pDecodedSamples[-10];\n    case  9: prediction += coefficients[ 8] * pDecodedSamples[- 9];\n    case  8: prediction += coefficients[ 7] * pDecodedSamples[- 8];\n    case  7: prediction += coefficients[ 6] * pDecodedSamples[- 7];\n    case  6: prediction += coefficients[ 5] * pDecodedSamples[- 6];\n    case  5: prediction += coefficients[ 4] * pDecodedSamples[- 5];\n    case  4: prediction += coefficients[ 3] * pDecodedSamples[- 4];\n    case  3: prediction += coefficients[ 2] * pDecodedSamples[- 3];\n    case  2: prediction += coefficients[ 1] * pDecodedSamples[- 2];\n    case  1: prediction += coefficients[ 0] * pDecodedSamples[- 1];\n    }\n\n    return (drflac_int32)(prediction >> shift);\n}\n\nstatic DRFLAC_INLINE drflac_int32 drflac__calculate_prediction_64(drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pDecodedSamples)\n{\n    drflac_int64 prediction;\n\n    DRFLAC_ASSERT(order <= 32);\n\n    /* 64-bit version. */\n\n    /* This method is faster on the 32-bit build when compiling with VC++. See note below. */\n#ifndef DRFLAC_64BIT\n    if (order == 8)\n    {\n        prediction  = coefficients[0] * (drflac_int64)pDecodedSamples[-1];\n        prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2];\n        prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3];\n        prediction += coefficients[3] * (drflac_int64)pDecodedSamples[-4];\n        prediction += coefficients[4] * (drflac_int64)pDecodedSamples[-5];\n        prediction += coefficients[5] * (drflac_int64)pDecodedSamples[-6];\n        prediction += coefficients[6] * (drflac_int64)pDecodedSamples[-7];\n        prediction += coefficients[7] * (drflac_int64)pDecodedSamples[-8];\n    }\n    else if (order == 7)\n    {\n        prediction  = coefficients[0] * (drflac_int64)pDecodedSamples[-1];\n        prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2];\n        prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3];\n        prediction += coefficients[3] * (drflac_int64)pDecodedSamples[-4];\n        prediction += coefficients[4] * (drflac_int64)pDecodedSamples[-5];\n        prediction += coefficients[5] * (drflac_int64)pDecodedSamples[-6];\n        prediction += coefficients[6] * (drflac_int64)pDecodedSamples[-7];\n    }\n    else if (order == 3)\n    {\n        prediction  = coefficients[0] * (drflac_int64)pDecodedSamples[-1];\n        prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2];\n        prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3];\n    }\n    else if (order == 6)\n    {\n        prediction  = coefficients[0] * (drflac_int64)pDecodedSamples[-1];\n        prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2];\n        prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3];\n        prediction += coefficients[3] * (drflac_int64)pDecodedSamples[-4];\n        prediction += coefficients[4] * (drflac_int64)pDecodedSamples[-5];\n        prediction += coefficients[5] * (drflac_int64)pDecodedSamples[-6];\n    }\n    else if (order == 5)\n    {\n        prediction  = coefficients[0] * (drflac_int64)pDecodedSamples[-1];\n        prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2];\n        prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3];\n        prediction += coefficients[3] * (drflac_int64)pDecodedSamples[-4];\n        prediction += coefficients[4] * (drflac_int64)pDecodedSamples[-5];\n    }\n    else if (order == 4)\n    {\n        prediction  = coefficients[0] * (drflac_int64)pDecodedSamples[-1];\n        prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2];\n        prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3];\n        prediction += coefficients[3] * (drflac_int64)pDecodedSamples[-4];\n    }\n    else if (order == 12)\n    {\n        prediction  = coefficients[0]  * (drflac_int64)pDecodedSamples[-1];\n        prediction += coefficients[1]  * (drflac_int64)pDecodedSamples[-2];\n        prediction += coefficients[2]  * (drflac_int64)pDecodedSamples[-3];\n        prediction += coefficients[3]  * (drflac_int64)pDecodedSamples[-4];\n        prediction += coefficients[4]  * (drflac_int64)pDecodedSamples[-5];\n        prediction += coefficients[5]  * (drflac_int64)pDecodedSamples[-6];\n        prediction += coefficients[6]  * (drflac_int64)pDecodedSamples[-7];\n        prediction += coefficients[7]  * (drflac_int64)pDecodedSamples[-8];\n        prediction += coefficients[8]  * (drflac_int64)pDecodedSamples[-9];\n        prediction += coefficients[9]  * (drflac_int64)pDecodedSamples[-10];\n        prediction += coefficients[10] * (drflac_int64)pDecodedSamples[-11];\n        prediction += coefficients[11] * (drflac_int64)pDecodedSamples[-12];\n    }\n    else if (order == 2)\n    {\n        prediction  = coefficients[0] * (drflac_int64)pDecodedSamples[-1];\n        prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2];\n    }\n    else if (order == 1)\n    {\n        prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1];\n    }\n    else if (order == 10)\n    {\n        prediction  = coefficients[0]  * (drflac_int64)pDecodedSamples[-1];\n        prediction += coefficients[1]  * (drflac_int64)pDecodedSamples[-2];\n        prediction += coefficients[2]  * (drflac_int64)pDecodedSamples[-3];\n        prediction += coefficients[3]  * (drflac_int64)pDecodedSamples[-4];\n        prediction += coefficients[4]  * (drflac_int64)pDecodedSamples[-5];\n        prediction += coefficients[5]  * (drflac_int64)pDecodedSamples[-6];\n        prediction += coefficients[6]  * (drflac_int64)pDecodedSamples[-7];\n        prediction += coefficients[7]  * (drflac_int64)pDecodedSamples[-8];\n        prediction += coefficients[8]  * (drflac_int64)pDecodedSamples[-9];\n        prediction += coefficients[9]  * (drflac_int64)pDecodedSamples[-10];\n    }\n    else if (order == 9)\n    {\n        prediction  = coefficients[0]  * (drflac_int64)pDecodedSamples[-1];\n        prediction += coefficients[1]  * (drflac_int64)pDecodedSamples[-2];\n        prediction += coefficients[2]  * (drflac_int64)pDecodedSamples[-3];\n        prediction += coefficients[3]  * (drflac_int64)pDecodedSamples[-4];\n        prediction += coefficients[4]  * (drflac_int64)pDecodedSamples[-5];\n        prediction += coefficients[5]  * (drflac_int64)pDecodedSamples[-6];\n        prediction += coefficients[6]  * (drflac_int64)pDecodedSamples[-7];\n        prediction += coefficients[7]  * (drflac_int64)pDecodedSamples[-8];\n        prediction += coefficients[8]  * (drflac_int64)pDecodedSamples[-9];\n    }\n    else if (order == 11)\n    {\n        prediction  = coefficients[0]  * (drflac_int64)pDecodedSamples[-1];\n        prediction += coefficients[1]  * (drflac_int64)pDecodedSamples[-2];\n        prediction += coefficients[2]  * (drflac_int64)pDecodedSamples[-3];\n        prediction += coefficients[3]  * (drflac_int64)pDecodedSamples[-4];\n        prediction += coefficients[4]  * (drflac_int64)pDecodedSamples[-5];\n        prediction += coefficients[5]  * (drflac_int64)pDecodedSamples[-6];\n        prediction += coefficients[6]  * (drflac_int64)pDecodedSamples[-7];\n        prediction += coefficients[7]  * (drflac_int64)pDecodedSamples[-8];\n        prediction += coefficients[8]  * (drflac_int64)pDecodedSamples[-9];\n        prediction += coefficients[9]  * (drflac_int64)pDecodedSamples[-10];\n        prediction += coefficients[10] * (drflac_int64)pDecodedSamples[-11];\n    }\n    else\n    {\n        int j;\n\n        prediction = 0;\n        for (j = 0; j < (int)order; ++j) {\n            prediction += coefficients[j] * (drflac_int64)pDecodedSamples[-j-1];\n        }\n    }\n#endif\n\n    /*\n    VC++ optimizes this to a single jmp instruction, but only the 64-bit build. The 32-bit build generates less efficient code for some\n    reason. The ugly version above is faster so we'll just switch between the two depending on the target platform.\n    */\n#ifdef DRFLAC_64BIT\n    prediction = 0;\n    switch (order)\n    {\n    case 32: prediction += coefficients[31] * (drflac_int64)pDecodedSamples[-32];\n    case 31: prediction += coefficients[30] * (drflac_int64)pDecodedSamples[-31];\n    case 30: prediction += coefficients[29] * (drflac_int64)pDecodedSamples[-30];\n    case 29: prediction += coefficients[28] * (drflac_int64)pDecodedSamples[-29];\n    case 28: prediction += coefficients[27] * (drflac_int64)pDecodedSamples[-28];\n    case 27: prediction += coefficients[26] * (drflac_int64)pDecodedSamples[-27];\n    case 26: prediction += coefficients[25] * (drflac_int64)pDecodedSamples[-26];\n    case 25: prediction += coefficients[24] * (drflac_int64)pDecodedSamples[-25];\n    case 24: prediction += coefficients[23] * (drflac_int64)pDecodedSamples[-24];\n    case 23: prediction += coefficients[22] * (drflac_int64)pDecodedSamples[-23];\n    case 22: prediction += coefficients[21] * (drflac_int64)pDecodedSamples[-22];\n    case 21: prediction += coefficients[20] * (drflac_int64)pDecodedSamples[-21];\n    case 20: prediction += coefficients[19] * (drflac_int64)pDecodedSamples[-20];\n    case 19: prediction += coefficients[18] * (drflac_int64)pDecodedSamples[-19];\n    case 18: prediction += coefficients[17] * (drflac_int64)pDecodedSamples[-18];\n    case 17: prediction += coefficients[16] * (drflac_int64)pDecodedSamples[-17];\n    case 16: prediction += coefficients[15] * (drflac_int64)pDecodedSamples[-16];\n    case 15: prediction += coefficients[14] * (drflac_int64)pDecodedSamples[-15];\n    case 14: prediction += coefficients[13] * (drflac_int64)pDecodedSamples[-14];\n    case 13: prediction += coefficients[12] * (drflac_int64)pDecodedSamples[-13];\n    case 12: prediction += coefficients[11] * (drflac_int64)pDecodedSamples[-12];\n    case 11: prediction += coefficients[10] * (drflac_int64)pDecodedSamples[-11];\n    case 10: prediction += coefficients[ 9] * (drflac_int64)pDecodedSamples[-10];\n    case  9: prediction += coefficients[ 8] * (drflac_int64)pDecodedSamples[- 9];\n    case  8: prediction += coefficients[ 7] * (drflac_int64)pDecodedSamples[- 8];\n    case  7: prediction += coefficients[ 6] * (drflac_int64)pDecodedSamples[- 7];\n    case  6: prediction += coefficients[ 5] * (drflac_int64)pDecodedSamples[- 6];\n    case  5: prediction += coefficients[ 4] * (drflac_int64)pDecodedSamples[- 5];\n    case  4: prediction += coefficients[ 3] * (drflac_int64)pDecodedSamples[- 4];\n    case  3: prediction += coefficients[ 2] * (drflac_int64)pDecodedSamples[- 3];\n    case  2: prediction += coefficients[ 1] * (drflac_int64)pDecodedSamples[- 2];\n    case  1: prediction += coefficients[ 0] * (drflac_int64)pDecodedSamples[- 1];\n    }\n#endif\n\n    return (drflac_int32)(prediction >> shift);\n}\n\n\n#if 0\n/*\nReference implementation for reading and decoding samples with residual. This is intentionally left unoptimized for the\nsake of readability and should only be used as a reference.\n*/\nstatic drflac_bool32 drflac__decode_samples_with_residual__rice__reference(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 lpcOrder, drflac_int32 lpcShift, drflac_uint32 lpcPrecision, const drflac_int32* coefficients, drflac_int32* pSamplesOut)\n{\n    drflac_uint32 i;\n\n    DRFLAC_ASSERT(bs != NULL);\n    DRFLAC_ASSERT(pSamplesOut != NULL);\n\n    for (i = 0; i < count; ++i) {\n        drflac_uint32 zeroCounter = 0;\n        for (;;) {\n            drflac_uint8 bit;\n            if (!drflac__read_uint8(bs, 1, &bit)) {\n                return DRFLAC_FALSE;\n            }\n\n            if (bit == 0) {\n                zeroCounter += 1;\n            } else {\n                break;\n            }\n        }\n\n        drflac_uint32 decodedRice;\n        if (riceParam > 0) {\n            if (!drflac__read_uint32(bs, riceParam, &decodedRice)) {\n                return DRFLAC_FALSE;\n            }\n        } else {\n            decodedRice = 0;\n        }\n\n        decodedRice |= (zeroCounter << riceParam);\n        if ((decodedRice & 0x01)) {\n            decodedRice = ~(decodedRice >> 1);\n        } else {\n            decodedRice =  (decodedRice >> 1);\n        }\n\n\n        if (drflac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) {\n            pSamplesOut[i] = decodedRice + drflac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + i);\n        } else {\n            pSamplesOut[i] = decodedRice + drflac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + i);\n        }\n    }\n\n    return DRFLAC_TRUE;\n}\n#endif\n\n#if 0\nstatic drflac_bool32 drflac__read_rice_parts__reference(drflac_bs* bs, drflac_uint8 riceParam, drflac_uint32* pZeroCounterOut, drflac_uint32* pRiceParamPartOut)\n{\n    drflac_uint32 zeroCounter = 0;\n    drflac_uint32 decodedRice;\n\n    for (;;) {\n        drflac_uint8 bit;\n        if (!drflac__read_uint8(bs, 1, &bit)) {\n            return DRFLAC_FALSE;\n        }\n\n        if (bit == 0) {\n            zeroCounter += 1;\n        } else {\n            break;\n        }\n    }\n\n    if (riceParam > 0) {\n        if (!drflac__read_uint32(bs, riceParam, &decodedRice)) {\n            return DRFLAC_FALSE;\n        }\n    } else {\n        decodedRice = 0;\n    }\n\n    *pZeroCounterOut = zeroCounter;\n    *pRiceParamPartOut = decodedRice;\n    return DRFLAC_TRUE;\n}\n#endif\n\n#if 0\nstatic DRFLAC_INLINE drflac_bool32 drflac__read_rice_parts(drflac_bs* bs, drflac_uint8 riceParam, drflac_uint32* pZeroCounterOut, drflac_uint32* pRiceParamPartOut)\n{\n    drflac_cache_t riceParamMask;\n    drflac_uint32 zeroCounter;\n    drflac_uint32 setBitOffsetPlus1;\n    drflac_uint32 riceParamPart;\n    drflac_uint32 riceLength;\n\n    DRFLAC_ASSERT(riceParam > 0);   /* <-- riceParam should never be 0. drflac__read_rice_parts__param_equals_zero() should be used instead for this case. */\n\n    riceParamMask = DRFLAC_CACHE_L1_SELECTION_MASK(riceParam);\n\n    zeroCounter = 0;\n    while (bs->cache == 0) {\n        zeroCounter += (drflac_uint32)DRFLAC_CACHE_L1_BITS_REMAINING(bs);\n        if (!drflac__reload_cache(bs)) {\n            return DRFLAC_FALSE;\n        }\n    }\n\n    setBitOffsetPlus1 = drflac__clz(bs->cache);\n    zeroCounter += setBitOffsetPlus1;\n    setBitOffsetPlus1 += 1;\n\n    riceLength = setBitOffsetPlus1 + riceParam;\n    if (riceLength < DRFLAC_CACHE_L1_BITS_REMAINING(bs)) {\n        riceParamPart = (drflac_uint32)((bs->cache & (riceParamMask >> setBitOffsetPlus1)) >> DRFLAC_CACHE_L1_SELECTION_SHIFT(bs, riceLength));\n\n        bs->consumedBits += riceLength;\n        bs->cache <<= riceLength;\n    } else {\n        drflac_uint32 bitCountLo;\n        drflac_cache_t resultHi;\n\n        bs->consumedBits += riceLength;\n        bs->cache <<= setBitOffsetPlus1 & (DRFLAC_CACHE_L1_SIZE_BITS(bs)-1);    /* <-- Equivalent to \"if (setBitOffsetPlus1 < DRFLAC_CACHE_L1_SIZE_BITS(bs)) { bs->cache <<= setBitOffsetPlus1; }\" */\n\n        /* It straddles the cached data. It will never cover more than the next chunk. We just read the number in two parts and combine them. */\n        bitCountLo = bs->consumedBits - DRFLAC_CACHE_L1_SIZE_BITS(bs);\n        resultHi = DRFLAC_CACHE_L1_SELECT_AND_SHIFT(bs, riceParam);  /* <-- Use DRFLAC_CACHE_L1_SELECT_AND_SHIFT_SAFE() if ever this function allows riceParam=0. */\n\n        if (bs->nextL2Line < DRFLAC_CACHE_L2_LINE_COUNT(bs)) {\n#ifndef DR_FLAC_NO_CRC\n            drflac__update_crc16(bs);\n#endif\n            bs->cache = drflac__be2host__cache_line(bs->cacheL2[bs->nextL2Line++]);\n            bs->consumedBits = 0;\n#ifndef DR_FLAC_NO_CRC\n            bs->crc16Cache = bs->cache;\n#endif\n        } else {\n            /* Slow path. We need to fetch more data from the client. */\n            if (!drflac__reload_cache(bs)) {\n                return DRFLAC_FALSE;\n            }\n            if (bitCountLo > DRFLAC_CACHE_L1_BITS_REMAINING(bs)) {\n                /* This happens when we get to end of stream */\n                return DRFLAC_FALSE;\n            }\n        }\n\n        riceParamPart = (drflac_uint32)(resultHi | DRFLAC_CACHE_L1_SELECT_AND_SHIFT_SAFE(bs, bitCountLo));\n\n        bs->consumedBits += bitCountLo;\n        bs->cache <<= bitCountLo;\n    }\n\n    pZeroCounterOut[0] = zeroCounter;\n    pRiceParamPartOut[0] = riceParamPart;\n\n    return DRFLAC_TRUE;\n}\n#endif\n\nstatic DRFLAC_INLINE drflac_bool32 drflac__read_rice_parts_x1(drflac_bs* bs, drflac_uint8 riceParam, drflac_uint32* pZeroCounterOut, drflac_uint32* pRiceParamPartOut)\n{\n    drflac_uint32  riceParamPlus1 = riceParam + 1;\n    /*drflac_cache_t riceParamPlus1Mask  = DRFLAC_CACHE_L1_SELECTION_MASK(riceParamPlus1);*/\n    drflac_uint32  riceParamPlus1Shift = DRFLAC_CACHE_L1_SELECTION_SHIFT(bs, riceParamPlus1);\n    drflac_uint32  riceParamPlus1MaxConsumedBits = DRFLAC_CACHE_L1_SIZE_BITS(bs) - riceParamPlus1;\n\n    /*\n    The idea here is to use local variables for the cache in an attempt to encourage the compiler to store them in registers. I have\n    no idea how this will work in practice...\n    */\n    drflac_cache_t bs_cache = bs->cache;\n    drflac_uint32  bs_consumedBits = bs->consumedBits;\n\n    /* The first thing to do is find the first unset bit. Most likely a bit will be set in the current cache line. */\n    drflac_uint32  lzcount = drflac__clz(bs_cache);\n    if (lzcount < sizeof(bs_cache)*8) {\n        pZeroCounterOut[0] = lzcount;\n\n        /*\n        It is most likely that the riceParam part (which comes after the zero counter) is also on this cache line. When extracting\n        this, we include the set bit from the unary coded part because it simplifies cache management. This bit will be handled\n        outside of this function at a higher level.\n        */\n    extract_rice_param_part:\n        bs_cache       <<= lzcount;\n        bs_consumedBits += lzcount;\n\n        if (bs_consumedBits <= riceParamPlus1MaxConsumedBits) {\n            /* Getting here means the rice parameter part is wholly contained within the current cache line. */\n            pRiceParamPartOut[0] = (drflac_uint32)(bs_cache >> riceParamPlus1Shift);\n            bs_cache       <<= riceParamPlus1;\n            bs_consumedBits += riceParamPlus1;\n        } else {\n            drflac_uint32 riceParamPartHi;\n            drflac_uint32 riceParamPartLo;\n            drflac_uint32 riceParamPartLoBitCount;\n\n            /*\n            Getting here means the rice parameter part straddles the cache line. We need to read from the tail of the current cache\n            line, reload the cache, and then combine it with the head of the next cache line.\n            */\n\n            /* Grab the high part of the rice parameter part. */\n            riceParamPartHi = (drflac_uint32)(bs_cache >> riceParamPlus1Shift);\n\n            /* Before reloading the cache we need to grab the size in bits of the low part. */\n            riceParamPartLoBitCount = bs_consumedBits - riceParamPlus1MaxConsumedBits;\n            DRFLAC_ASSERT(riceParamPartLoBitCount > 0 && riceParamPartLoBitCount < 32);\n\n            /* Now reload the cache. */\n            if (bs->nextL2Line < DRFLAC_CACHE_L2_LINE_COUNT(bs)) {\n            #ifndef DR_FLAC_NO_CRC\n                drflac__update_crc16(bs);\n            #endif\n                bs_cache = drflac__be2host__cache_line(bs->cacheL2[bs->nextL2Line++]);\n                bs_consumedBits = riceParamPartLoBitCount;\n            #ifndef DR_FLAC_NO_CRC\n                bs->crc16Cache = bs_cache;\n            #endif\n            } else {\n                /* Slow path. We need to fetch more data from the client. */\n                if (!drflac__reload_cache(bs)) {\n                    return DRFLAC_FALSE;\n                }\n                if (riceParamPartLoBitCount > DRFLAC_CACHE_L1_BITS_REMAINING(bs)) {\n                    /* This happens when we get to end of stream */\n                    return DRFLAC_FALSE;\n                }\n\n                bs_cache = bs->cache;\n                bs_consumedBits = bs->consumedBits + riceParamPartLoBitCount;\n            }\n\n            /* We should now have enough information to construct the rice parameter part. */\n            riceParamPartLo = (drflac_uint32)(bs_cache >> (DRFLAC_CACHE_L1_SELECTION_SHIFT(bs, riceParamPartLoBitCount)));\n            pRiceParamPartOut[0] = riceParamPartHi | riceParamPartLo;\n\n            bs_cache <<= riceParamPartLoBitCount;\n        }\n    } else {\n        /*\n        Getting here means there are no bits set on the cache line. This is a less optimal case because we just wasted a call\n        to drflac__clz() and we need to reload the cache.\n        */\n        drflac_uint32 zeroCounter = (drflac_uint32)(DRFLAC_CACHE_L1_SIZE_BITS(bs) - bs_consumedBits);\n        for (;;) {\n            if (bs->nextL2Line < DRFLAC_CACHE_L2_LINE_COUNT(bs)) {\n            #ifndef DR_FLAC_NO_CRC\n                drflac__update_crc16(bs);\n            #endif\n                bs_cache = drflac__be2host__cache_line(bs->cacheL2[bs->nextL2Line++]);\n                bs_consumedBits = 0;\n            #ifndef DR_FLAC_NO_CRC\n                bs->crc16Cache = bs_cache;\n            #endif\n            } else {\n                /* Slow path. We need to fetch more data from the client. */\n                if (!drflac__reload_cache(bs)) {\n                    return DRFLAC_FALSE;\n                }\n\n                bs_cache = bs->cache;\n                bs_consumedBits = bs->consumedBits;\n            }\n\n            lzcount = drflac__clz(bs_cache);\n            zeroCounter += lzcount;\n\n            if (lzcount < sizeof(bs_cache)*8) {\n                break;\n            }\n        }\n\n        pZeroCounterOut[0] = zeroCounter;\n        goto extract_rice_param_part;\n    }\n\n    /* Make sure the cache is restored at the end of it all. */\n    bs->cache = bs_cache;\n    bs->consumedBits = bs_consumedBits;\n\n    return DRFLAC_TRUE;\n}\n\nstatic DRFLAC_INLINE drflac_bool32 drflac__seek_rice_parts(drflac_bs* bs, drflac_uint8 riceParam)\n{\n    drflac_uint32  riceParamPlus1 = riceParam + 1;\n    drflac_uint32  riceParamPlus1MaxConsumedBits = DRFLAC_CACHE_L1_SIZE_BITS(bs) - riceParamPlus1;\n\n    /*\n    The idea here is to use local variables for the cache in an attempt to encourage the compiler to store them in registers. I have\n    no idea how this will work in practice...\n    */\n    drflac_cache_t bs_cache = bs->cache;\n    drflac_uint32  bs_consumedBits = bs->consumedBits;\n\n    /* The first thing to do is find the first unset bit. Most likely a bit will be set in the current cache line. */\n    drflac_uint32  lzcount = drflac__clz(bs_cache);\n    if (lzcount < sizeof(bs_cache)*8) {\n        /*\n        It is most likely that the riceParam part (which comes after the zero counter) is also on this cache line. When extracting\n        this, we include the set bit from the unary coded part because it simplifies cache management. This bit will be handled\n        outside of this function at a higher level.\n        */\n    extract_rice_param_part:\n        bs_cache       <<= lzcount;\n        bs_consumedBits += lzcount;\n\n        if (bs_consumedBits <= riceParamPlus1MaxConsumedBits) {\n            /* Getting here means the rice parameter part is wholly contained within the current cache line. */\n            bs_cache       <<= riceParamPlus1;\n            bs_consumedBits += riceParamPlus1;\n        } else {\n            /*\n            Getting here means the rice parameter part straddles the cache line. We need to read from the tail of the current cache\n            line, reload the cache, and then combine it with the head of the next cache line.\n            */\n\n            /* Before reloading the cache we need to grab the size in bits of the low part. */\n            drflac_uint32 riceParamPartLoBitCount = bs_consumedBits - riceParamPlus1MaxConsumedBits;\n            DRFLAC_ASSERT(riceParamPartLoBitCount > 0 && riceParamPartLoBitCount < 32);\n\n            /* Now reload the cache. */\n            if (bs->nextL2Line < DRFLAC_CACHE_L2_LINE_COUNT(bs)) {\n            #ifndef DR_FLAC_NO_CRC\n                drflac__update_crc16(bs);\n            #endif\n                bs_cache = drflac__be2host__cache_line(bs->cacheL2[bs->nextL2Line++]);\n                bs_consumedBits = riceParamPartLoBitCount;\n            #ifndef DR_FLAC_NO_CRC\n                bs->crc16Cache = bs_cache;\n            #endif\n            } else {\n                /* Slow path. We need to fetch more data from the client. */\n                if (!drflac__reload_cache(bs)) {\n                    return DRFLAC_FALSE;\n                }\n\n                if (riceParamPartLoBitCount > DRFLAC_CACHE_L1_BITS_REMAINING(bs)) {\n                    /* This happens when we get to end of stream */\n                    return DRFLAC_FALSE;\n                }\n\n                bs_cache = bs->cache;\n                bs_consumedBits = bs->consumedBits + riceParamPartLoBitCount;\n            }\n\n            bs_cache <<= riceParamPartLoBitCount;\n        }\n    } else {\n        /*\n        Getting here means there are no bits set on the cache line. This is a less optimal case because we just wasted a call\n        to drflac__clz() and we need to reload the cache.\n        */\n        for (;;) {\n            if (bs->nextL2Line < DRFLAC_CACHE_L2_LINE_COUNT(bs)) {\n            #ifndef DR_FLAC_NO_CRC\n                drflac__update_crc16(bs);\n            #endif\n                bs_cache = drflac__be2host__cache_line(bs->cacheL2[bs->nextL2Line++]);\n                bs_consumedBits = 0;\n            #ifndef DR_FLAC_NO_CRC\n                bs->crc16Cache = bs_cache;\n            #endif\n            } else {\n                /* Slow path. We need to fetch more data from the client. */\n                if (!drflac__reload_cache(bs)) {\n                    return DRFLAC_FALSE;\n                }\n\n                bs_cache = bs->cache;\n                bs_consumedBits = bs->consumedBits;\n            }\n\n            lzcount = drflac__clz(bs_cache);\n            if (lzcount < sizeof(bs_cache)*8) {\n                break;\n            }\n        }\n\n        goto extract_rice_param_part;\n    }\n\n    /* Make sure the cache is restored at the end of it all. */\n    bs->cache = bs_cache;\n    bs->consumedBits = bs_consumedBits;\n\n    return DRFLAC_TRUE;\n}\n\n\nstatic drflac_bool32 drflac__decode_samples_with_residual__rice__scalar_zeroorder(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pSamplesOut)\n{\n    drflac_uint32 t[2] = {0x00000000, 0xFFFFFFFF};\n    drflac_uint32 zeroCountPart0;\n    drflac_uint32 riceParamPart0;\n    drflac_uint32 riceParamMask;\n    drflac_uint32 i;\n\n    DRFLAC_ASSERT(bs != NULL);\n    DRFLAC_ASSERT(pSamplesOut != NULL);\n\n    (void)bitsPerSample;\n    (void)order;\n    (void)shift;\n    (void)coefficients;\n\n    riceParamMask  = (drflac_uint32)~((~0UL) << riceParam);\n\n    i = 0;\n    while (i < count) {\n        /* Rice extraction. */\n        if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart0, &riceParamPart0)) {\n            return DRFLAC_FALSE;\n        }\n\n        /* Rice reconstruction. */\n        riceParamPart0 &= riceParamMask;\n        riceParamPart0 |= (zeroCountPart0 << riceParam);\n        riceParamPart0  = (riceParamPart0 >> 1) ^ t[riceParamPart0 & 0x01];\n\n        pSamplesOut[i] = riceParamPart0;\n\n        i += 1;\n    }\n\n    return DRFLAC_TRUE;\n}\n\nstatic drflac_bool32 drflac__decode_samples_with_residual__rice__scalar(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 lpcOrder, drflac_int32 lpcShift, drflac_uint32 lpcPrecision, const drflac_int32* coefficients, drflac_int32* pSamplesOut)\n{\n    drflac_uint32 t[2] = {0x00000000, 0xFFFFFFFF};\n    drflac_uint32 zeroCountPart0 = 0;\n    drflac_uint32 zeroCountPart1 = 0;\n    drflac_uint32 zeroCountPart2 = 0;\n    drflac_uint32 zeroCountPart3 = 0;\n    drflac_uint32 riceParamPart0 = 0;\n    drflac_uint32 riceParamPart1 = 0;\n    drflac_uint32 riceParamPart2 = 0;\n    drflac_uint32 riceParamPart3 = 0;\n    drflac_uint32 riceParamMask;\n    const drflac_int32* pSamplesOutEnd;\n    drflac_uint32 i;\n\n    DRFLAC_ASSERT(bs != NULL);\n    DRFLAC_ASSERT(pSamplesOut != NULL);\n\n    if (lpcOrder == 0) {\n        return drflac__decode_samples_with_residual__rice__scalar_zeroorder(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, coefficients, pSamplesOut);\n    }\n\n    riceParamMask  = (drflac_uint32)~((~0UL) << riceParam);\n    pSamplesOutEnd = pSamplesOut + (count & ~3);\n\n    if (drflac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) {\n        while (pSamplesOut < pSamplesOutEnd) {\n            /*\n            Rice extraction. It's faster to do this one at a time against local variables than it is to use the x4 version\n            against an array. Not sure why, but perhaps it's making more efficient use of registers?\n            */\n            if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart0, &riceParamPart0) ||\n                !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart1, &riceParamPart1) ||\n                !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart2, &riceParamPart2) ||\n                !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart3, &riceParamPart3)) {\n                return DRFLAC_FALSE;\n            }\n\n            riceParamPart0 &= riceParamMask;\n            riceParamPart1 &= riceParamMask;\n            riceParamPart2 &= riceParamMask;\n            riceParamPart3 &= riceParamMask;\n\n            riceParamPart0 |= (zeroCountPart0 << riceParam);\n            riceParamPart1 |= (zeroCountPart1 << riceParam);\n            riceParamPart2 |= (zeroCountPart2 << riceParam);\n            riceParamPart3 |= (zeroCountPart3 << riceParam);\n\n            riceParamPart0  = (riceParamPart0 >> 1) ^ t[riceParamPart0 & 0x01];\n            riceParamPart1  = (riceParamPart1 >> 1) ^ t[riceParamPart1 & 0x01];\n            riceParamPart2  = (riceParamPart2 >> 1) ^ t[riceParamPart2 & 0x01];\n            riceParamPart3  = (riceParamPart3 >> 1) ^ t[riceParamPart3 & 0x01];\n\n            pSamplesOut[0] = riceParamPart0 + drflac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + 0);\n            pSamplesOut[1] = riceParamPart1 + drflac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + 1);\n            pSamplesOut[2] = riceParamPart2 + drflac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + 2);\n            pSamplesOut[3] = riceParamPart3 + drflac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + 3);\n\n            pSamplesOut += 4;\n        }\n    } else {\n        while (pSamplesOut < pSamplesOutEnd) {\n            if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart0, &riceParamPart0) ||\n                !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart1, &riceParamPart1) ||\n                !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart2, &riceParamPart2) ||\n                !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart3, &riceParamPart3)) {\n                return DRFLAC_FALSE;\n            }\n\n            riceParamPart0 &= riceParamMask;\n            riceParamPart1 &= riceParamMask;\n            riceParamPart2 &= riceParamMask;\n            riceParamPart3 &= riceParamMask;\n\n            riceParamPart0 |= (zeroCountPart0 << riceParam);\n            riceParamPart1 |= (zeroCountPart1 << riceParam);\n            riceParamPart2 |= (zeroCountPart2 << riceParam);\n            riceParamPart3 |= (zeroCountPart3 << riceParam);\n\n            riceParamPart0  = (riceParamPart0 >> 1) ^ t[riceParamPart0 & 0x01];\n            riceParamPart1  = (riceParamPart1 >> 1) ^ t[riceParamPart1 & 0x01];\n            riceParamPart2  = (riceParamPart2 >> 1) ^ t[riceParamPart2 & 0x01];\n            riceParamPart3  = (riceParamPart3 >> 1) ^ t[riceParamPart3 & 0x01];\n\n            pSamplesOut[0] = riceParamPart0 + drflac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + 0);\n            pSamplesOut[1] = riceParamPart1 + drflac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + 1);\n            pSamplesOut[2] = riceParamPart2 + drflac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + 2);\n            pSamplesOut[3] = riceParamPart3 + drflac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + 3);\n\n            pSamplesOut += 4;\n        }\n    }\n\n    i = (count & ~3);\n    while (i < count) {\n        /* Rice extraction. */\n        if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart0, &riceParamPart0)) {\n            return DRFLAC_FALSE;\n        }\n\n        /* Rice reconstruction. */\n        riceParamPart0 &= riceParamMask;\n        riceParamPart0 |= (zeroCountPart0 << riceParam);\n        riceParamPart0  = (riceParamPart0 >> 1) ^ t[riceParamPart0 & 0x01];\n        /*riceParamPart0  = (riceParamPart0 >> 1) ^ (~(riceParamPart0 & 0x01) + 1);*/\n\n        /* Sample reconstruction. */\n        if (drflac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) {\n            pSamplesOut[0] = riceParamPart0 + drflac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + 0);\n        } else {\n            pSamplesOut[0] = riceParamPart0 + drflac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + 0);\n        }\n\n        i += 1;\n        pSamplesOut += 1;\n    }\n\n    return DRFLAC_TRUE;\n}\n\n#if defined(DRFLAC_SUPPORT_SSE2)\nstatic DRFLAC_INLINE __m128i drflac__mm_packs_interleaved_epi32(__m128i a, __m128i b)\n{\n    __m128i r;\n\n    /* Pack. */\n    r = _mm_packs_epi32(a, b);\n\n    /* a3a2 a1a0 b3b2 b1b0 -> a3a2 b3b2 a1a0 b1b0 */\n    r = _mm_shuffle_epi32(r, _MM_SHUFFLE(3, 1, 2, 0));\n\n    /* a3a2 b3b2 a1a0 b1b0 -> a3b3 a2b2 a1b1 a0b0 */\n    r = _mm_shufflehi_epi16(r, _MM_SHUFFLE(3, 1, 2, 0));\n    r = _mm_shufflelo_epi16(r, _MM_SHUFFLE(3, 1, 2, 0));\n\n    return r;\n}\n#endif\n\n#if defined(DRFLAC_SUPPORT_SSE41)\nstatic DRFLAC_INLINE __m128i drflac__mm_not_si128(__m128i a)\n{\n    return _mm_xor_si128(a, _mm_cmpeq_epi32(_mm_setzero_si128(), _mm_setzero_si128()));\n}\n\nstatic DRFLAC_INLINE __m128i drflac__mm_hadd_epi32(__m128i x)\n{\n    __m128i x64 = _mm_add_epi32(x, _mm_shuffle_epi32(x, _MM_SHUFFLE(1, 0, 3, 2)));\n    __m128i x32 = _mm_shufflelo_epi16(x64, _MM_SHUFFLE(1, 0, 3, 2));\n    return _mm_add_epi32(x64, x32);\n}\n\nstatic DRFLAC_INLINE __m128i drflac__mm_hadd_epi64(__m128i x)\n{\n    return _mm_add_epi64(x, _mm_shuffle_epi32(x, _MM_SHUFFLE(1, 0, 3, 2)));\n}\n\nstatic DRFLAC_INLINE __m128i drflac__mm_srai_epi64(__m128i x, int count)\n{\n    /*\n    To simplify this we are assuming count < 32. This restriction allows us to work on a low side and a high side. The low side\n    is shifted with zero bits, whereas the right side is shifted with sign bits.\n    */\n    __m128i lo = _mm_srli_epi64(x, count);\n    __m128i hi = _mm_srai_epi32(x, count);\n\n    hi = _mm_and_si128(hi, _mm_set_epi32(0xFFFFFFFF, 0, 0xFFFFFFFF, 0));    /* The high part needs to have the low part cleared. */\n\n    return _mm_or_si128(lo, hi);\n}\n\nstatic drflac_bool32 drflac__decode_samples_with_residual__rice__sse41_32(drflac_bs* bs, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pSamplesOut)\n{\n    int i;\n    drflac_uint32 riceParamMask;\n    drflac_int32* pDecodedSamples    = pSamplesOut;\n    drflac_int32* pDecodedSamplesEnd = pSamplesOut + (count & ~3);\n    drflac_uint32 zeroCountParts0 = 0;\n    drflac_uint32 zeroCountParts1 = 0;\n    drflac_uint32 zeroCountParts2 = 0;\n    drflac_uint32 zeroCountParts3 = 0;\n    drflac_uint32 riceParamParts0 = 0;\n    drflac_uint32 riceParamParts1 = 0;\n    drflac_uint32 riceParamParts2 = 0;\n    drflac_uint32 riceParamParts3 = 0;\n    __m128i coefficients128_0;\n    __m128i coefficients128_4;\n    __m128i coefficients128_8;\n    __m128i samples128_0;\n    __m128i samples128_4;\n    __m128i samples128_8;\n    __m128i riceParamMask128;\n\n    const drflac_uint32 t[2] = {0x00000000, 0xFFFFFFFF};\n\n    riceParamMask    = (drflac_uint32)~((~0UL) << riceParam);\n    riceParamMask128 = _mm_set1_epi32(riceParamMask);\n\n    /* Pre-load. */\n    coefficients128_0 = _mm_setzero_si128();\n    coefficients128_4 = _mm_setzero_si128();\n    coefficients128_8 = _mm_setzero_si128();\n\n    samples128_0 = _mm_setzero_si128();\n    samples128_4 = _mm_setzero_si128();\n    samples128_8 = _mm_setzero_si128();\n\n    /*\n    Pre-loading the coefficients and prior samples is annoying because we need to ensure we don't try reading more than\n    what's available in the input buffers. It would be convenient to use a fall-through switch to do this, but this results\n    in strict aliasing warnings with GCC. To work around this I'm just doing something hacky. This feels a bit convoluted\n    so I think there's opportunity for this to be simplified.\n    */\n#if 1\n    {\n        int runningOrder = order;\n\n        /* 0 - 3. */\n        if (runningOrder >= 4) {\n            coefficients128_0 = _mm_loadu_si128((const __m128i*)(coefficients + 0));\n            samples128_0      = _mm_loadu_si128((const __m128i*)(pSamplesOut  - 4));\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: coefficients128_0 = _mm_set_epi32(0, coefficients[2], coefficients[1], coefficients[0]); samples128_0 = _mm_set_epi32(pSamplesOut[-1], pSamplesOut[-2], pSamplesOut[-3], 0); break;\n                case 2: coefficients128_0 = _mm_set_epi32(0, 0,               coefficients[1], coefficients[0]); samples128_0 = _mm_set_epi32(pSamplesOut[-1], pSamplesOut[-2], 0,               0); break;\n                case 1: coefficients128_0 = _mm_set_epi32(0, 0,               0,               coefficients[0]); samples128_0 = _mm_set_epi32(pSamplesOut[-1], 0,               0,               0); break;\n            }\n            runningOrder = 0;\n        }\n\n        /* 4 - 7 */\n        if (runningOrder >= 4) {\n            coefficients128_4 = _mm_loadu_si128((const __m128i*)(coefficients + 4));\n            samples128_4      = _mm_loadu_si128((const __m128i*)(pSamplesOut  - 8));\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: coefficients128_4 = _mm_set_epi32(0, coefficients[6], coefficients[5], coefficients[4]); samples128_4 = _mm_set_epi32(pSamplesOut[-5], pSamplesOut[-6], pSamplesOut[-7], 0); break;\n                case 2: coefficients128_4 = _mm_set_epi32(0, 0,               coefficients[5], coefficients[4]); samples128_4 = _mm_set_epi32(pSamplesOut[-5], pSamplesOut[-6], 0,               0); break;\n                case 1: coefficients128_4 = _mm_set_epi32(0, 0,               0,               coefficients[4]); samples128_4 = _mm_set_epi32(pSamplesOut[-5], 0,               0,               0); break;\n            }\n            runningOrder = 0;\n        }\n\n        /* 8 - 11 */\n        if (runningOrder == 4) {\n            coefficients128_8 = _mm_loadu_si128((const __m128i*)(coefficients + 8));\n            samples128_8      = _mm_loadu_si128((const __m128i*)(pSamplesOut  - 12));\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: coefficients128_8 = _mm_set_epi32(0, coefficients[10], coefficients[9], coefficients[8]); samples128_8 = _mm_set_epi32(pSamplesOut[-9], pSamplesOut[-10], pSamplesOut[-11], 0); break;\n                case 2: coefficients128_8 = _mm_set_epi32(0, 0,                coefficients[9], coefficients[8]); samples128_8 = _mm_set_epi32(pSamplesOut[-9], pSamplesOut[-10], 0,                0); break;\n                case 1: coefficients128_8 = _mm_set_epi32(0, 0,                0,               coefficients[8]); samples128_8 = _mm_set_epi32(pSamplesOut[-9], 0,                0,                0); break;\n            }\n            runningOrder = 0;\n        }\n\n        /* Coefficients need to be shuffled for our streaming algorithm below to work. Samples are already in the correct order from the loading routine above. */\n        coefficients128_0 = _mm_shuffle_epi32(coefficients128_0, _MM_SHUFFLE(0, 1, 2, 3));\n        coefficients128_4 = _mm_shuffle_epi32(coefficients128_4, _MM_SHUFFLE(0, 1, 2, 3));\n        coefficients128_8 = _mm_shuffle_epi32(coefficients128_8, _MM_SHUFFLE(0, 1, 2, 3));\n    }\n#else\n    /* This causes strict-aliasing warnings with GCC. */\n    switch (order)\n    {\n    case 12: ((drflac_int32*)&coefficients128_8)[0] = coefficients[11]; ((drflac_int32*)&samples128_8)[0] = pDecodedSamples[-12];\n    case 11: ((drflac_int32*)&coefficients128_8)[1] = coefficients[10]; ((drflac_int32*)&samples128_8)[1] = pDecodedSamples[-11];\n    case 10: ((drflac_int32*)&coefficients128_8)[2] = coefficients[ 9]; ((drflac_int32*)&samples128_8)[2] = pDecodedSamples[-10];\n    case 9:  ((drflac_int32*)&coefficients128_8)[3] = coefficients[ 8]; ((drflac_int32*)&samples128_8)[3] = pDecodedSamples[- 9];\n    case 8:  ((drflac_int32*)&coefficients128_4)[0] = coefficients[ 7]; ((drflac_int32*)&samples128_4)[0] = pDecodedSamples[- 8];\n    case 7:  ((drflac_int32*)&coefficients128_4)[1] = coefficients[ 6]; ((drflac_int32*)&samples128_4)[1] = pDecodedSamples[- 7];\n    case 6:  ((drflac_int32*)&coefficients128_4)[2] = coefficients[ 5]; ((drflac_int32*)&samples128_4)[2] = pDecodedSamples[- 6];\n    case 5:  ((drflac_int32*)&coefficients128_4)[3] = coefficients[ 4]; ((drflac_int32*)&samples128_4)[3] = pDecodedSamples[- 5];\n    case 4:  ((drflac_int32*)&coefficients128_0)[0] = coefficients[ 3]; ((drflac_int32*)&samples128_0)[0] = pDecodedSamples[- 4];\n    case 3:  ((drflac_int32*)&coefficients128_0)[1] = coefficients[ 2]; ((drflac_int32*)&samples128_0)[1] = pDecodedSamples[- 3];\n    case 2:  ((drflac_int32*)&coefficients128_0)[2] = coefficients[ 1]; ((drflac_int32*)&samples128_0)[2] = pDecodedSamples[- 2];\n    case 1:  ((drflac_int32*)&coefficients128_0)[3] = coefficients[ 0]; ((drflac_int32*)&samples128_0)[3] = pDecodedSamples[- 1];\n    }\n#endif\n\n    /* For this version we are doing one sample at a time. */\n    while (pDecodedSamples < pDecodedSamplesEnd) {\n        __m128i prediction128;\n        __m128i zeroCountPart128;\n        __m128i riceParamPart128;\n\n        if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts0, &riceParamParts0) ||\n            !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts1, &riceParamParts1) ||\n            !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts2, &riceParamParts2) ||\n            !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts3, &riceParamParts3)) {\n            return DRFLAC_FALSE;\n        }\n\n        zeroCountPart128 = _mm_set_epi32(zeroCountParts3, zeroCountParts2, zeroCountParts1, zeroCountParts0);\n        riceParamPart128 = _mm_set_epi32(riceParamParts3, riceParamParts2, riceParamParts1, riceParamParts0);\n\n        riceParamPart128 = _mm_and_si128(riceParamPart128, riceParamMask128);\n        riceParamPart128 = _mm_or_si128(riceParamPart128, _mm_slli_epi32(zeroCountPart128, riceParam));\n        riceParamPart128 = _mm_xor_si128(_mm_srli_epi32(riceParamPart128, 1), _mm_add_epi32(drflac__mm_not_si128(_mm_and_si128(riceParamPart128, _mm_set1_epi32(0x01))), _mm_set1_epi32(0x01)));  /* <-- SSE2 compatible */\n        /*riceParamPart128 = _mm_xor_si128(_mm_srli_epi32(riceParamPart128, 1), _mm_mullo_epi32(_mm_and_si128(riceParamPart128, _mm_set1_epi32(0x01)), _mm_set1_epi32(0xFFFFFFFF)));*/   /* <-- Only supported from SSE4.1 and is slower in my testing... */\n\n        if (order <= 4) {\n            for (i = 0; i < 4; i += 1) {\n                prediction128 = _mm_mullo_epi32(coefficients128_0, samples128_0);\n\n                /* Horizontal add and shift. */\n                prediction128 = drflac__mm_hadd_epi32(prediction128);\n                prediction128 = _mm_srai_epi32(prediction128, shift);\n                prediction128 = _mm_add_epi32(riceParamPart128, prediction128);\n\n                samples128_0 = _mm_alignr_epi8(prediction128, samples128_0, 4);\n                riceParamPart128 = _mm_alignr_epi8(_mm_setzero_si128(), riceParamPart128, 4);\n            }\n        } else if (order <= 8) {\n            for (i = 0; i < 4; i += 1) {\n                prediction128 =                              _mm_mullo_epi32(coefficients128_4, samples128_4);\n                prediction128 = _mm_add_epi32(prediction128, _mm_mullo_epi32(coefficients128_0, samples128_0));\n\n                /* Horizontal add and shift. */\n                prediction128 = drflac__mm_hadd_epi32(prediction128);\n                prediction128 = _mm_srai_epi32(prediction128, shift);\n                prediction128 = _mm_add_epi32(riceParamPart128, prediction128);\n\n                samples128_4 = _mm_alignr_epi8(samples128_0,  samples128_4, 4);\n                samples128_0 = _mm_alignr_epi8(prediction128, samples128_0, 4);\n                riceParamPart128 = _mm_alignr_epi8(_mm_setzero_si128(), riceParamPart128, 4);\n            }\n        } else {\n            for (i = 0; i < 4; i += 1) {\n                prediction128 =                              _mm_mullo_epi32(coefficients128_8, samples128_8);\n                prediction128 = _mm_add_epi32(prediction128, _mm_mullo_epi32(coefficients128_4, samples128_4));\n                prediction128 = _mm_add_epi32(prediction128, _mm_mullo_epi32(coefficients128_0, samples128_0));\n\n                /* Horizontal add and shift. */\n                prediction128 = drflac__mm_hadd_epi32(prediction128);\n                prediction128 = _mm_srai_epi32(prediction128, shift);\n                prediction128 = _mm_add_epi32(riceParamPart128, prediction128);\n\n                samples128_8 = _mm_alignr_epi8(samples128_4,  samples128_8, 4);\n                samples128_4 = _mm_alignr_epi8(samples128_0,  samples128_4, 4);\n                samples128_0 = _mm_alignr_epi8(prediction128, samples128_0, 4);\n                riceParamPart128 = _mm_alignr_epi8(_mm_setzero_si128(), riceParamPart128, 4);\n            }\n        }\n\n        /* We store samples in groups of 4. */\n        _mm_storeu_si128((__m128i*)pDecodedSamples, samples128_0);\n        pDecodedSamples += 4;\n    }\n\n    /* Make sure we process the last few samples. */\n    i = (count & ~3);\n    while (i < (int)count) {\n        /* Rice extraction. */\n        if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts0, &riceParamParts0)) {\n            return DRFLAC_FALSE;\n        }\n\n        /* Rice reconstruction. */\n        riceParamParts0 &= riceParamMask;\n        riceParamParts0 |= (zeroCountParts0 << riceParam);\n        riceParamParts0  = (riceParamParts0 >> 1) ^ t[riceParamParts0 & 0x01];\n\n        /* Sample reconstruction. */\n        pDecodedSamples[0] = riceParamParts0 + drflac__calculate_prediction_32(order, shift, coefficients, pDecodedSamples);\n\n        i += 1;\n        pDecodedSamples += 1;\n    }\n\n    return DRFLAC_TRUE;\n}\n\nstatic drflac_bool32 drflac__decode_samples_with_residual__rice__sse41_64(drflac_bs* bs, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pSamplesOut)\n{\n    int i;\n    drflac_uint32 riceParamMask;\n    drflac_int32* pDecodedSamples    = pSamplesOut;\n    drflac_int32* pDecodedSamplesEnd = pSamplesOut + (count & ~3);\n    drflac_uint32 zeroCountParts0 = 0;\n    drflac_uint32 zeroCountParts1 = 0;\n    drflac_uint32 zeroCountParts2 = 0;\n    drflac_uint32 zeroCountParts3 = 0;\n    drflac_uint32 riceParamParts0 = 0;\n    drflac_uint32 riceParamParts1 = 0;\n    drflac_uint32 riceParamParts2 = 0;\n    drflac_uint32 riceParamParts3 = 0;\n    __m128i coefficients128_0;\n    __m128i coefficients128_4;\n    __m128i coefficients128_8;\n    __m128i samples128_0;\n    __m128i samples128_4;\n    __m128i samples128_8;\n    __m128i prediction128;\n    __m128i riceParamMask128;\n\n    const drflac_uint32 t[2] = {0x00000000, 0xFFFFFFFF};\n\n    DRFLAC_ASSERT(order <= 12);\n\n    riceParamMask    = (drflac_uint32)~((~0UL) << riceParam);\n    riceParamMask128 = _mm_set1_epi32(riceParamMask);\n\n    prediction128 = _mm_setzero_si128();\n\n    /* Pre-load. */\n    coefficients128_0  = _mm_setzero_si128();\n    coefficients128_4  = _mm_setzero_si128();\n    coefficients128_8  = _mm_setzero_si128();\n\n    samples128_0  = _mm_setzero_si128();\n    samples128_4  = _mm_setzero_si128();\n    samples128_8  = _mm_setzero_si128();\n\n#if 1\n    {\n        int runningOrder = order;\n\n        /* 0 - 3. */\n        if (runningOrder >= 4) {\n            coefficients128_0 = _mm_loadu_si128((const __m128i*)(coefficients + 0));\n            samples128_0      = _mm_loadu_si128((const __m128i*)(pSamplesOut  - 4));\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: coefficients128_0 = _mm_set_epi32(0, coefficients[2], coefficients[1], coefficients[0]); samples128_0 = _mm_set_epi32(pSamplesOut[-1], pSamplesOut[-2], pSamplesOut[-3], 0); break;\n                case 2: coefficients128_0 = _mm_set_epi32(0, 0,               coefficients[1], coefficients[0]); samples128_0 = _mm_set_epi32(pSamplesOut[-1], pSamplesOut[-2], 0,               0); break;\n                case 1: coefficients128_0 = _mm_set_epi32(0, 0,               0,               coefficients[0]); samples128_0 = _mm_set_epi32(pSamplesOut[-1], 0,               0,               0); break;\n            }\n            runningOrder = 0;\n        }\n\n        /* 4 - 7 */\n        if (runningOrder >= 4) {\n            coefficients128_4 = _mm_loadu_si128((const __m128i*)(coefficients + 4));\n            samples128_4      = _mm_loadu_si128((const __m128i*)(pSamplesOut  - 8));\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: coefficients128_4 = _mm_set_epi32(0, coefficients[6], coefficients[5], coefficients[4]); samples128_4 = _mm_set_epi32(pSamplesOut[-5], pSamplesOut[-6], pSamplesOut[-7], 0); break;\n                case 2: coefficients128_4 = _mm_set_epi32(0, 0,               coefficients[5], coefficients[4]); samples128_4 = _mm_set_epi32(pSamplesOut[-5], pSamplesOut[-6], 0,               0); break;\n                case 1: coefficients128_4 = _mm_set_epi32(0, 0,               0,               coefficients[4]); samples128_4 = _mm_set_epi32(pSamplesOut[-5], 0,               0,               0); break;\n            }\n            runningOrder = 0;\n        }\n\n        /* 8 - 11 */\n        if (runningOrder == 4) {\n            coefficients128_8 = _mm_loadu_si128((const __m128i*)(coefficients + 8));\n            samples128_8      = _mm_loadu_si128((const __m128i*)(pSamplesOut  - 12));\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: coefficients128_8 = _mm_set_epi32(0, coefficients[10], coefficients[9], coefficients[8]); samples128_8 = _mm_set_epi32(pSamplesOut[-9], pSamplesOut[-10], pSamplesOut[-11], 0); break;\n                case 2: coefficients128_8 = _mm_set_epi32(0, 0,                coefficients[9], coefficients[8]); samples128_8 = _mm_set_epi32(pSamplesOut[-9], pSamplesOut[-10], 0,                0); break;\n                case 1: coefficients128_8 = _mm_set_epi32(0, 0,                0,               coefficients[8]); samples128_8 = _mm_set_epi32(pSamplesOut[-9], 0,                0,                0); break;\n            }\n            runningOrder = 0;\n        }\n\n        /* Coefficients need to be shuffled for our streaming algorithm below to work. Samples are already in the correct order from the loading routine above. */\n        coefficients128_0 = _mm_shuffle_epi32(coefficients128_0, _MM_SHUFFLE(0, 1, 2, 3));\n        coefficients128_4 = _mm_shuffle_epi32(coefficients128_4, _MM_SHUFFLE(0, 1, 2, 3));\n        coefficients128_8 = _mm_shuffle_epi32(coefficients128_8, _MM_SHUFFLE(0, 1, 2, 3));\n    }\n#else\n    switch (order)\n    {\n    case 12: ((drflac_int32*)&coefficients128_8)[0] = coefficients[11]; ((drflac_int32*)&samples128_8)[0] = pDecodedSamples[-12];\n    case 11: ((drflac_int32*)&coefficients128_8)[1] = coefficients[10]; ((drflac_int32*)&samples128_8)[1] = pDecodedSamples[-11];\n    case 10: ((drflac_int32*)&coefficients128_8)[2] = coefficients[ 9]; ((drflac_int32*)&samples128_8)[2] = pDecodedSamples[-10];\n    case 9:  ((drflac_int32*)&coefficients128_8)[3] = coefficients[ 8]; ((drflac_int32*)&samples128_8)[3] = pDecodedSamples[- 9];\n    case 8:  ((drflac_int32*)&coefficients128_4)[0] = coefficients[ 7]; ((drflac_int32*)&samples128_4)[0] = pDecodedSamples[- 8];\n    case 7:  ((drflac_int32*)&coefficients128_4)[1] = coefficients[ 6]; ((drflac_int32*)&samples128_4)[1] = pDecodedSamples[- 7];\n    case 6:  ((drflac_int32*)&coefficients128_4)[2] = coefficients[ 5]; ((drflac_int32*)&samples128_4)[2] = pDecodedSamples[- 6];\n    case 5:  ((drflac_int32*)&coefficients128_4)[3] = coefficients[ 4]; ((drflac_int32*)&samples128_4)[3] = pDecodedSamples[- 5];\n    case 4:  ((drflac_int32*)&coefficients128_0)[0] = coefficients[ 3]; ((drflac_int32*)&samples128_0)[0] = pDecodedSamples[- 4];\n    case 3:  ((drflac_int32*)&coefficients128_0)[1] = coefficients[ 2]; ((drflac_int32*)&samples128_0)[1] = pDecodedSamples[- 3];\n    case 2:  ((drflac_int32*)&coefficients128_0)[2] = coefficients[ 1]; ((drflac_int32*)&samples128_0)[2] = pDecodedSamples[- 2];\n    case 1:  ((drflac_int32*)&coefficients128_0)[3] = coefficients[ 0]; ((drflac_int32*)&samples128_0)[3] = pDecodedSamples[- 1];\n    }\n#endif\n\n    /* For this version we are doing one sample at a time. */\n    while (pDecodedSamples < pDecodedSamplesEnd) {\n        __m128i zeroCountPart128;\n        __m128i riceParamPart128;\n\n        if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts0, &riceParamParts0) ||\n            !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts1, &riceParamParts1) ||\n            !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts2, &riceParamParts2) ||\n            !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts3, &riceParamParts3)) {\n            return DRFLAC_FALSE;\n        }\n\n        zeroCountPart128 = _mm_set_epi32(zeroCountParts3, zeroCountParts2, zeroCountParts1, zeroCountParts0);\n        riceParamPart128 = _mm_set_epi32(riceParamParts3, riceParamParts2, riceParamParts1, riceParamParts0);\n\n        riceParamPart128 = _mm_and_si128(riceParamPart128, riceParamMask128);\n        riceParamPart128 = _mm_or_si128(riceParamPart128, _mm_slli_epi32(zeroCountPart128, riceParam));\n        riceParamPart128 = _mm_xor_si128(_mm_srli_epi32(riceParamPart128, 1), _mm_add_epi32(drflac__mm_not_si128(_mm_and_si128(riceParamPart128, _mm_set1_epi32(1))), _mm_set1_epi32(1)));\n\n        for (i = 0; i < 4; i += 1) {\n            prediction128 = _mm_xor_si128(prediction128, prediction128);    /* Reset to 0. */\n\n            switch (order)\n            {\n            case 12:\n            case 11: prediction128 = _mm_add_epi64(prediction128, _mm_mul_epi32(_mm_shuffle_epi32(coefficients128_8, _MM_SHUFFLE(1, 1, 0, 0)), _mm_shuffle_epi32(samples128_8, _MM_SHUFFLE(1, 1, 0, 0))));\n            case 10:\n            case  9: prediction128 = _mm_add_epi64(prediction128, _mm_mul_epi32(_mm_shuffle_epi32(coefficients128_8, _MM_SHUFFLE(3, 3, 2, 2)), _mm_shuffle_epi32(samples128_8, _MM_SHUFFLE(3, 3, 2, 2))));\n            case  8:\n            case  7: prediction128 = _mm_add_epi64(prediction128, _mm_mul_epi32(_mm_shuffle_epi32(coefficients128_4, _MM_SHUFFLE(1, 1, 0, 0)), _mm_shuffle_epi32(samples128_4, _MM_SHUFFLE(1, 1, 0, 0))));\n            case  6:\n            case  5: prediction128 = _mm_add_epi64(prediction128, _mm_mul_epi32(_mm_shuffle_epi32(coefficients128_4, _MM_SHUFFLE(3, 3, 2, 2)), _mm_shuffle_epi32(samples128_4, _MM_SHUFFLE(3, 3, 2, 2))));\n            case  4:\n            case  3: prediction128 = _mm_add_epi64(prediction128, _mm_mul_epi32(_mm_shuffle_epi32(coefficients128_0, _MM_SHUFFLE(1, 1, 0, 0)), _mm_shuffle_epi32(samples128_0, _MM_SHUFFLE(1, 1, 0, 0))));\n            case  2:\n            case  1: prediction128 = _mm_add_epi64(prediction128, _mm_mul_epi32(_mm_shuffle_epi32(coefficients128_0, _MM_SHUFFLE(3, 3, 2, 2)), _mm_shuffle_epi32(samples128_0, _MM_SHUFFLE(3, 3, 2, 2))));\n            }\n\n            /* Horizontal add and shift. */\n            prediction128 = drflac__mm_hadd_epi64(prediction128);\n            prediction128 = drflac__mm_srai_epi64(prediction128, shift);\n            prediction128 = _mm_add_epi32(riceParamPart128, prediction128);\n\n            /* Our value should be sitting in prediction128[0]. We need to combine this with our SSE samples. */\n            samples128_8 = _mm_alignr_epi8(samples128_4,  samples128_8, 4);\n            samples128_4 = _mm_alignr_epi8(samples128_0,  samples128_4, 4);\n            samples128_0 = _mm_alignr_epi8(prediction128, samples128_0, 4);\n\n            /* Slide our rice parameter down so that the value in position 0 contains the next one to process. */\n            riceParamPart128 = _mm_alignr_epi8(_mm_setzero_si128(), riceParamPart128, 4);\n        }\n\n        /* We store samples in groups of 4. */\n        _mm_storeu_si128((__m128i*)pDecodedSamples, samples128_0);\n        pDecodedSamples += 4;\n    }\n\n    /* Make sure we process the last few samples. */\n    i = (count & ~3);\n    while (i < (int)count) {\n        /* Rice extraction. */\n        if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts0, &riceParamParts0)) {\n            return DRFLAC_FALSE;\n        }\n\n        /* Rice reconstruction. */\n        riceParamParts0 &= riceParamMask;\n        riceParamParts0 |= (zeroCountParts0 << riceParam);\n        riceParamParts0  = (riceParamParts0 >> 1) ^ t[riceParamParts0 & 0x01];\n\n        /* Sample reconstruction. */\n        pDecodedSamples[0] = riceParamParts0 + drflac__calculate_prediction_64(order, shift, coefficients, pDecodedSamples);\n\n        i += 1;\n        pDecodedSamples += 1;\n    }\n\n    return DRFLAC_TRUE;\n}\n\nstatic drflac_bool32 drflac__decode_samples_with_residual__rice__sse41(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 lpcOrder, drflac_int32 lpcShift, drflac_uint32 lpcPrecision, const drflac_int32* coefficients, drflac_int32* pSamplesOut)\n{\n    DRFLAC_ASSERT(bs != NULL);\n    DRFLAC_ASSERT(pSamplesOut != NULL);\n\n    /* In my testing the order is rarely > 12, so in this case I'm going to simplify the SSE implementation by only handling order <= 12. */\n    if (lpcOrder > 0 && lpcOrder <= 12) {\n        if (drflac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) {\n            return drflac__decode_samples_with_residual__rice__sse41_64(bs, count, riceParam, lpcOrder, lpcShift, coefficients, pSamplesOut);\n        } else {\n            return drflac__decode_samples_with_residual__rice__sse41_32(bs, count, riceParam, lpcOrder, lpcShift, coefficients, pSamplesOut);\n        }\n    } else {\n        return drflac__decode_samples_with_residual__rice__scalar(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut);\n    }\n}\n#endif\n\n#if defined(DRFLAC_SUPPORT_NEON)\nstatic DRFLAC_INLINE void drflac__vst2q_s32(drflac_int32* p, int32x4x2_t x)\n{\n    vst1q_s32(p+0, x.val[0]);\n    vst1q_s32(p+4, x.val[1]);\n}\n\nstatic DRFLAC_INLINE void drflac__vst2q_u32(drflac_uint32* p, uint32x4x2_t x)\n{\n    vst1q_u32(p+0, x.val[0]);\n    vst1q_u32(p+4, x.val[1]);\n}\n\nstatic DRFLAC_INLINE void drflac__vst2q_f32(float* p, float32x4x2_t x)\n{\n    vst1q_f32(p+0, x.val[0]);\n    vst1q_f32(p+4, x.val[1]);\n}\n\nstatic DRFLAC_INLINE void drflac__vst2q_s16(drflac_int16* p, int16x4x2_t x)\n{\n    vst1q_s16(p, vcombine_s16(x.val[0], x.val[1]));\n}\n\nstatic DRFLAC_INLINE void drflac__vst2q_u16(drflac_uint16* p, uint16x4x2_t x)\n{\n    vst1q_u16(p, vcombine_u16(x.val[0], x.val[1]));\n}\n\nstatic DRFLAC_INLINE int32x4_t drflac__vdupq_n_s32x4(drflac_int32 x3, drflac_int32 x2, drflac_int32 x1, drflac_int32 x0)\n{\n    drflac_int32 x[4];\n    x[3] = x3;\n    x[2] = x2;\n    x[1] = x1;\n    x[0] = x0;\n    return vld1q_s32(x);\n}\n\nstatic DRFLAC_INLINE int32x4_t drflac__valignrq_s32_1(int32x4_t a, int32x4_t b)\n{\n    /* Equivalent to SSE's _mm_alignr_epi8(a, b, 4) */\n\n    /* Reference */\n    /*return drflac__vdupq_n_s32x4(\n        vgetq_lane_s32(a, 0),\n        vgetq_lane_s32(b, 3),\n        vgetq_lane_s32(b, 2),\n        vgetq_lane_s32(b, 1)\n    );*/\n\n    return vextq_s32(b, a, 1);\n}\n\nstatic DRFLAC_INLINE uint32x4_t drflac__valignrq_u32_1(uint32x4_t a, uint32x4_t b)\n{\n    /* Equivalent to SSE's _mm_alignr_epi8(a, b, 4) */\n\n    /* Reference */\n    /*return drflac__vdupq_n_s32x4(\n        vgetq_lane_s32(a, 0),\n        vgetq_lane_s32(b, 3),\n        vgetq_lane_s32(b, 2),\n        vgetq_lane_s32(b, 1)\n    );*/\n\n    return vextq_u32(b, a, 1);\n}\n\nstatic DRFLAC_INLINE int32x2_t drflac__vhaddq_s32(int32x4_t x)\n{\n    /* The sum must end up in position 0. */\n\n    /* Reference */\n    /*return vdupq_n_s32(\n        vgetq_lane_s32(x, 3) +\n        vgetq_lane_s32(x, 2) +\n        vgetq_lane_s32(x, 1) +\n        vgetq_lane_s32(x, 0)\n    );*/\n\n    int32x2_t r = vadd_s32(vget_high_s32(x), vget_low_s32(x));\n    return vpadd_s32(r, r);\n}\n\nstatic DRFLAC_INLINE int64x1_t drflac__vhaddq_s64(int64x2_t x)\n{\n    return vadd_s64(vget_high_s64(x), vget_low_s64(x));\n}\n\nstatic DRFLAC_INLINE int32x4_t drflac__vrevq_s32(int32x4_t x)\n{\n    /* Reference */\n    /*return drflac__vdupq_n_s32x4(\n        vgetq_lane_s32(x, 0),\n        vgetq_lane_s32(x, 1),\n        vgetq_lane_s32(x, 2),\n        vgetq_lane_s32(x, 3)\n    );*/\n\n    return vrev64q_s32(vcombine_s32(vget_high_s32(x), vget_low_s32(x)));\n}\n\nstatic DRFLAC_INLINE int32x4_t drflac__vnotq_s32(int32x4_t x)\n{\n    return veorq_s32(x, vdupq_n_s32(0xFFFFFFFF));\n}\n\nstatic DRFLAC_INLINE uint32x4_t drflac__vnotq_u32(uint32x4_t x)\n{\n    return veorq_u32(x, vdupq_n_u32(0xFFFFFFFF));\n}\n\nstatic drflac_bool32 drflac__decode_samples_with_residual__rice__neon_32(drflac_bs* bs, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pSamplesOut)\n{\n    int i;\n    drflac_uint32 riceParamMask;\n    drflac_int32* pDecodedSamples    = pSamplesOut;\n    drflac_int32* pDecodedSamplesEnd = pSamplesOut + (count & ~3);\n    drflac_uint32 zeroCountParts[4];\n    drflac_uint32 riceParamParts[4];\n    int32x4_t coefficients128_0;\n    int32x4_t coefficients128_4;\n    int32x4_t coefficients128_8;\n    int32x4_t samples128_0;\n    int32x4_t samples128_4;\n    int32x4_t samples128_8;\n    uint32x4_t riceParamMask128;\n    int32x4_t riceParam128;\n    int32x2_t shift64;\n    uint32x4_t one128;\n\n    const drflac_uint32 t[2] = {0x00000000, 0xFFFFFFFF};\n\n    riceParamMask    = ~((~0UL) << riceParam);\n    riceParamMask128 = vdupq_n_u32(riceParamMask);\n\n    riceParam128 = vdupq_n_s32(riceParam);\n    shift64 = vdup_n_s32(-shift); /* Negate the shift because we'll be doing a variable shift using vshlq_s32(). */\n    one128 = vdupq_n_u32(1);\n\n    /*\n    Pre-loading the coefficients and prior samples is annoying because we need to ensure we don't try reading more than\n    what's available in the input buffers. It would be conenient to use a fall-through switch to do this, but this results\n    in strict aliasing warnings with GCC. To work around this I'm just doing something hacky. This feels a bit convoluted\n    so I think there's opportunity for this to be simplified.\n    */\n    {\n        int runningOrder = order;\n        drflac_int32 tempC[4] = {0, 0, 0, 0};\n        drflac_int32 tempS[4] = {0, 0, 0, 0};\n\n        /* 0 - 3. */\n        if (runningOrder >= 4) {\n            coefficients128_0 = vld1q_s32(coefficients + 0);\n            samples128_0      = vld1q_s32(pSamplesOut  - 4);\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: tempC[2] = coefficients[2]; tempS[1] = pSamplesOut[-3]; /* fallthrough */\n                case 2: tempC[1] = coefficients[1]; tempS[2] = pSamplesOut[-2]; /* fallthrough */\n                case 1: tempC[0] = coefficients[0]; tempS[3] = pSamplesOut[-1]; /* fallthrough */\n            }\n\n            coefficients128_0 = vld1q_s32(tempC);\n            samples128_0      = vld1q_s32(tempS);\n            runningOrder = 0;\n        }\n\n        /* 4 - 7 */\n        if (runningOrder >= 4) {\n            coefficients128_4 = vld1q_s32(coefficients + 4);\n            samples128_4      = vld1q_s32(pSamplesOut  - 8);\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: tempC[2] = coefficients[6]; tempS[1] = pSamplesOut[-7]; /* fallthrough */\n                case 2: tempC[1] = coefficients[5]; tempS[2] = pSamplesOut[-6]; /* fallthrough */\n                case 1: tempC[0] = coefficients[4]; tempS[3] = pSamplesOut[-5]; /* fallthrough */\n            }\n\n            coefficients128_4 = vld1q_s32(tempC);\n            samples128_4      = vld1q_s32(tempS);\n            runningOrder = 0;\n        }\n\n        /* 8 - 11 */\n        if (runningOrder == 4) {\n            coefficients128_8 = vld1q_s32(coefficients + 8);\n            samples128_8      = vld1q_s32(pSamplesOut  - 12);\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: tempC[2] = coefficients[10]; tempS[1] = pSamplesOut[-11]; /* fallthrough */\n                case 2: tempC[1] = coefficients[ 9]; tempS[2] = pSamplesOut[-10]; /* fallthrough */\n                case 1: tempC[0] = coefficients[ 8]; tempS[3] = pSamplesOut[- 9]; /* fallthrough */\n            }\n\n            coefficients128_8 = vld1q_s32(tempC);\n            samples128_8      = vld1q_s32(tempS);\n            runningOrder = 0;\n        }\n\n        /* Coefficients need to be shuffled for our streaming algorithm below to work. Samples are already in the correct order from the loading routine above. */\n        coefficients128_0 = drflac__vrevq_s32(coefficients128_0);\n        coefficients128_4 = drflac__vrevq_s32(coefficients128_4);\n        coefficients128_8 = drflac__vrevq_s32(coefficients128_8);\n    }\n\n    /* For this version we are doing one sample at a time. */\n    while (pDecodedSamples < pDecodedSamplesEnd) {\n        int32x4_t prediction128;\n        int32x2_t prediction64;\n        uint32x4_t zeroCountPart128;\n        uint32x4_t riceParamPart128;\n\n        if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[0], &riceParamParts[0]) ||\n            !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[1], &riceParamParts[1]) ||\n            !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[2], &riceParamParts[2]) ||\n            !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[3], &riceParamParts[3])) {\n            return DRFLAC_FALSE;\n        }\n\n        zeroCountPart128 = vld1q_u32(zeroCountParts);\n        riceParamPart128 = vld1q_u32(riceParamParts);\n\n        riceParamPart128 = vandq_u32(riceParamPart128, riceParamMask128);\n        riceParamPart128 = vorrq_u32(riceParamPart128, vshlq_u32(zeroCountPart128, riceParam128));\n        riceParamPart128 = veorq_u32(vshrq_n_u32(riceParamPart128, 1), vaddq_u32(drflac__vnotq_u32(vandq_u32(riceParamPart128, one128)), one128));\n\n        if (order <= 4) {\n            for (i = 0; i < 4; i += 1) {\n                prediction128 = vmulq_s32(coefficients128_0, samples128_0);\n\n                /* Horizontal add and shift. */\n                prediction64 = drflac__vhaddq_s32(prediction128);\n                prediction64 = vshl_s32(prediction64, shift64);\n                prediction64 = vadd_s32(prediction64, vget_low_s32(vreinterpretq_s32_u32(riceParamPart128)));\n\n                samples128_0 = drflac__valignrq_s32_1(vcombine_s32(prediction64, vdup_n_s32(0)), samples128_0);\n                riceParamPart128 = drflac__valignrq_u32_1(vdupq_n_u32(0), riceParamPart128);\n            }\n        } else if (order <= 8) {\n            for (i = 0; i < 4; i += 1) {\n                prediction128 =                vmulq_s32(coefficients128_4, samples128_4);\n                prediction128 = vmlaq_s32(prediction128, coefficients128_0, samples128_0);\n\n                /* Horizontal add and shift. */\n                prediction64 = drflac__vhaddq_s32(prediction128);\n                prediction64 = vshl_s32(prediction64, shift64);\n                prediction64 = vadd_s32(prediction64, vget_low_s32(vreinterpretq_s32_u32(riceParamPart128)));\n\n                samples128_4 = drflac__valignrq_s32_1(samples128_0, samples128_4);\n                samples128_0 = drflac__valignrq_s32_1(vcombine_s32(prediction64, vdup_n_s32(0)), samples128_0);\n                riceParamPart128 = drflac__valignrq_u32_1(vdupq_n_u32(0), riceParamPart128);\n            }\n        } else {\n            for (i = 0; i < 4; i += 1) {\n                prediction128 =                vmulq_s32(coefficients128_8, samples128_8);\n                prediction128 = vmlaq_s32(prediction128, coefficients128_4, samples128_4);\n                prediction128 = vmlaq_s32(prediction128, coefficients128_0, samples128_0);\n\n                /* Horizontal add and shift. */\n                prediction64 = drflac__vhaddq_s32(prediction128);\n                prediction64 = vshl_s32(prediction64, shift64);\n                prediction64 = vadd_s32(prediction64, vget_low_s32(vreinterpretq_s32_u32(riceParamPart128)));\n\n                samples128_8 = drflac__valignrq_s32_1(samples128_4, samples128_8);\n                samples128_4 = drflac__valignrq_s32_1(samples128_0, samples128_4);\n                samples128_0 = drflac__valignrq_s32_1(vcombine_s32(prediction64, vdup_n_s32(0)), samples128_0);\n                riceParamPart128 = drflac__valignrq_u32_1(vdupq_n_u32(0), riceParamPart128);\n            }\n        }\n\n        /* We store samples in groups of 4. */\n        vst1q_s32(pDecodedSamples, samples128_0);\n        pDecodedSamples += 4;\n    }\n\n    /* Make sure we process the last few samples. */\n    i = (count & ~3);\n    while (i < (int)count) {\n        /* Rice extraction. */\n        if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[0], &riceParamParts[0])) {\n            return DRFLAC_FALSE;\n        }\n\n        /* Rice reconstruction. */\n        riceParamParts[0] &= riceParamMask;\n        riceParamParts[0] |= (zeroCountParts[0] << riceParam);\n        riceParamParts[0]  = (riceParamParts[0] >> 1) ^ t[riceParamParts[0] & 0x01];\n\n        /* Sample reconstruction. */\n        pDecodedSamples[0] = riceParamParts[0] + drflac__calculate_prediction_32(order, shift, coefficients, pDecodedSamples);\n\n        i += 1;\n        pDecodedSamples += 1;\n    }\n\n    return DRFLAC_TRUE;\n}\n\nstatic drflac_bool32 drflac__decode_samples_with_residual__rice__neon_64(drflac_bs* bs, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pSamplesOut)\n{\n    int i;\n    drflac_uint32 riceParamMask;\n    drflac_int32* pDecodedSamples    = pSamplesOut;\n    drflac_int32* pDecodedSamplesEnd = pSamplesOut + (count & ~3);\n    drflac_uint32 zeroCountParts[4];\n    drflac_uint32 riceParamParts[4];\n    int32x4_t coefficients128_0;\n    int32x4_t coefficients128_4;\n    int32x4_t coefficients128_8;\n    int32x4_t samples128_0;\n    int32x4_t samples128_4;\n    int32x4_t samples128_8;\n    uint32x4_t riceParamMask128;\n    int32x4_t riceParam128;\n    int64x1_t shift64;\n    uint32x4_t one128;\n\n    const drflac_uint32 t[2] = {0x00000000, 0xFFFFFFFF};\n\n    riceParamMask    = ~((~0UL) << riceParam);\n    riceParamMask128 = vdupq_n_u32(riceParamMask);\n\n    riceParam128 = vdupq_n_s32(riceParam);\n    shift64 = vdup_n_s64(-shift); /* Negate the shift because we'll be doing a variable shift using vshlq_s32(). */\n    one128 = vdupq_n_u32(1);\n\n    /*\n    Pre-loading the coefficients and prior samples is annoying because we need to ensure we don't try reading more than\n    what's available in the input buffers. It would be convenient to use a fall-through switch to do this, but this results\n    in strict aliasing warnings with GCC. To work around this I'm just doing something hacky. This feels a bit convoluted\n    so I think there's opportunity for this to be simplified.\n    */\n    {\n        int runningOrder = order;\n        drflac_int32 tempC[4] = {0, 0, 0, 0};\n        drflac_int32 tempS[4] = {0, 0, 0, 0};\n\n        /* 0 - 3. */\n        if (runningOrder >= 4) {\n            coefficients128_0 = vld1q_s32(coefficients + 0);\n            samples128_0      = vld1q_s32(pSamplesOut  - 4);\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: tempC[2] = coefficients[2]; tempS[1] = pSamplesOut[-3]; /* fallthrough */\n                case 2: tempC[1] = coefficients[1]; tempS[2] = pSamplesOut[-2]; /* fallthrough */\n                case 1: tempC[0] = coefficients[0]; tempS[3] = pSamplesOut[-1]; /* fallthrough */\n            }\n\n            coefficients128_0 = vld1q_s32(tempC);\n            samples128_0      = vld1q_s32(tempS);\n            runningOrder = 0;\n        }\n\n        /* 4 - 7 */\n        if (runningOrder >= 4) {\n            coefficients128_4 = vld1q_s32(coefficients + 4);\n            samples128_4      = vld1q_s32(pSamplesOut  - 8);\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: tempC[2] = coefficients[6]; tempS[1] = pSamplesOut[-7]; /* fallthrough */\n                case 2: tempC[1] = coefficients[5]; tempS[2] = pSamplesOut[-6]; /* fallthrough */\n                case 1: tempC[0] = coefficients[4]; tempS[3] = pSamplesOut[-5]; /* fallthrough */\n            }\n\n            coefficients128_4 = vld1q_s32(tempC);\n            samples128_4      = vld1q_s32(tempS);\n            runningOrder = 0;\n        }\n\n        /* 8 - 11 */\n        if (runningOrder == 4) {\n            coefficients128_8 = vld1q_s32(coefficients + 8);\n            samples128_8      = vld1q_s32(pSamplesOut  - 12);\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: tempC[2] = coefficients[10]; tempS[1] = pSamplesOut[-11]; /* fallthrough */\n                case 2: tempC[1] = coefficients[ 9]; tempS[2] = pSamplesOut[-10]; /* fallthrough */\n                case 1: tempC[0] = coefficients[ 8]; tempS[3] = pSamplesOut[- 9]; /* fallthrough */\n            }\n\n            coefficients128_8 = vld1q_s32(tempC);\n            samples128_8      = vld1q_s32(tempS);\n            runningOrder = 0;\n        }\n\n        /* Coefficients need to be shuffled for our streaming algorithm below to work. Samples are already in the correct order from the loading routine above. */\n        coefficients128_0 = drflac__vrevq_s32(coefficients128_0);\n        coefficients128_4 = drflac__vrevq_s32(coefficients128_4);\n        coefficients128_8 = drflac__vrevq_s32(coefficients128_8);\n    }\n\n    /* For this version we are doing one sample at a time. */\n    while (pDecodedSamples < pDecodedSamplesEnd) {\n        int64x2_t prediction128;\n        uint32x4_t zeroCountPart128;\n        uint32x4_t riceParamPart128;\n\n        if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[0], &riceParamParts[0]) ||\n            !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[1], &riceParamParts[1]) ||\n            !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[2], &riceParamParts[2]) ||\n            !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[3], &riceParamParts[3])) {\n            return DRFLAC_FALSE;\n        }\n\n        zeroCountPart128 = vld1q_u32(zeroCountParts);\n        riceParamPart128 = vld1q_u32(riceParamParts);\n\n        riceParamPart128 = vandq_u32(riceParamPart128, riceParamMask128);\n        riceParamPart128 = vorrq_u32(riceParamPart128, vshlq_u32(zeroCountPart128, riceParam128));\n        riceParamPart128 = veorq_u32(vshrq_n_u32(riceParamPart128, 1), vaddq_u32(drflac__vnotq_u32(vandq_u32(riceParamPart128, one128)), one128));\n\n        for (i = 0; i < 4; i += 1) {\n            int64x1_t prediction64;\n\n            prediction128 = veorq_s64(prediction128, prediction128);    /* Reset to 0. */\n            switch (order)\n            {\n            case 12:\n            case 11: prediction128 = vaddq_s64(prediction128, vmull_s32(vget_low_s32(coefficients128_8), vget_low_s32(samples128_8)));\n            case 10:\n            case  9: prediction128 = vaddq_s64(prediction128, vmull_s32(vget_high_s32(coefficients128_8), vget_high_s32(samples128_8)));\n            case  8:\n            case  7: prediction128 = vaddq_s64(prediction128, vmull_s32(vget_low_s32(coefficients128_4), vget_low_s32(samples128_4)));\n            case  6:\n            case  5: prediction128 = vaddq_s64(prediction128, vmull_s32(vget_high_s32(coefficients128_4), vget_high_s32(samples128_4)));\n            case  4:\n            case  3: prediction128 = vaddq_s64(prediction128, vmull_s32(vget_low_s32(coefficients128_0), vget_low_s32(samples128_0)));\n            case  2:\n            case  1: prediction128 = vaddq_s64(prediction128, vmull_s32(vget_high_s32(coefficients128_0), vget_high_s32(samples128_0)));\n            }\n\n            /* Horizontal add and shift. */\n            prediction64 = drflac__vhaddq_s64(prediction128);\n            prediction64 = vshl_s64(prediction64, shift64);\n            prediction64 = vadd_s64(prediction64, vdup_n_s64(vgetq_lane_u32(riceParamPart128, 0)));\n\n            /* Our value should be sitting in prediction64[0]. We need to combine this with our SSE samples. */\n            samples128_8 = drflac__valignrq_s32_1(samples128_4, samples128_8);\n            samples128_4 = drflac__valignrq_s32_1(samples128_0, samples128_4);\n            samples128_0 = drflac__valignrq_s32_1(vcombine_s32(vreinterpret_s32_s64(prediction64), vdup_n_s32(0)), samples128_0);\n\n            /* Slide our rice parameter down so that the value in position 0 contains the next one to process. */\n            riceParamPart128 = drflac__valignrq_u32_1(vdupq_n_u32(0), riceParamPart128);\n        }\n\n        /* We store samples in groups of 4. */\n        vst1q_s32(pDecodedSamples, samples128_0);\n        pDecodedSamples += 4;\n    }\n\n    /* Make sure we process the last few samples. */\n    i = (count & ~3);\n    while (i < (int)count) {\n        /* Rice extraction. */\n        if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[0], &riceParamParts[0])) {\n            return DRFLAC_FALSE;\n        }\n\n        /* Rice reconstruction. */\n        riceParamParts[0] &= riceParamMask;\n        riceParamParts[0] |= (zeroCountParts[0] << riceParam);\n        riceParamParts[0]  = (riceParamParts[0] >> 1) ^ t[riceParamParts[0] & 0x01];\n\n        /* Sample reconstruction. */\n        pDecodedSamples[0] = riceParamParts[0] + drflac__calculate_prediction_64(order, shift, coefficients, pDecodedSamples);\n\n        i += 1;\n        pDecodedSamples += 1;\n    }\n\n    return DRFLAC_TRUE;\n}\n\nstatic drflac_bool32 drflac__decode_samples_with_residual__rice__neon(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 lpcOrder, drflac_int32 lpcShift, drflac_uint32 lpcPrecision, const drflac_int32* coefficients, drflac_int32* pSamplesOut)\n{\n    DRFLAC_ASSERT(bs != NULL);\n    DRFLAC_ASSERT(pSamplesOut != NULL);\n\n    /* In my testing the order is rarely > 12, so in this case I'm going to simplify the NEON implementation by only handling order <= 12. */\n    if (lpcOrder > 0 && lpcOrder <= 12) {\n        if (drflac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) {\n            return drflac__decode_samples_with_residual__rice__neon_64(bs, count, riceParam, lpcOrder, lpcShift, coefficients, pSamplesOut);\n        } else {\n            return drflac__decode_samples_with_residual__rice__neon_32(bs, count, riceParam, lpcOrder, lpcShift, coefficients, pSamplesOut);\n        }\n    } else {\n        return drflac__decode_samples_with_residual__rice__scalar(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut);\n    }\n}\n#endif\n\nstatic drflac_bool32 drflac__decode_samples_with_residual__rice(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 lpcOrder, drflac_int32 lpcShift, drflac_uint32 lpcPrecision, const drflac_int32* coefficients, drflac_int32* pSamplesOut)\n{\n#if defined(DRFLAC_SUPPORT_SSE41)\n    if (drflac__gIsSSE41Supported) {\n        return drflac__decode_samples_with_residual__rice__sse41(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut);\n    } else\n#elif defined(DRFLAC_SUPPORT_NEON)\n    if (drflac__gIsNEONSupported) {\n        return drflac__decode_samples_with_residual__rice__neon(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut);\n    } else\n#endif\n    {\n        /* Scalar fallback. */\n    #if 0\n        return drflac__decode_samples_with_residual__rice__reference(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut);\n    #else\n        return drflac__decode_samples_with_residual__rice__scalar(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut);\n    #endif\n    }\n}\n\n/* Reads and seeks past a string of residual values as Rice codes. The decoder should be sitting on the first bit of the Rice codes. */\nstatic drflac_bool32 drflac__read_and_seek_residual__rice(drflac_bs* bs, drflac_uint32 count, drflac_uint8 riceParam)\n{\n    drflac_uint32 i;\n\n    DRFLAC_ASSERT(bs != NULL);\n\n    for (i = 0; i < count; ++i) {\n        if (!drflac__seek_rice_parts(bs, riceParam)) {\n            return DRFLAC_FALSE;\n        }\n    }\n\n    return DRFLAC_TRUE;\n}\n\n#if defined(__clang__)\n__attribute__((no_sanitize(\"signed-integer-overflow\")))\n#endif\nstatic drflac_bool32 drflac__decode_samples_with_residual__unencoded(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 unencodedBitsPerSample, drflac_uint32 lpcOrder, drflac_int32 lpcShift, drflac_uint32 lpcPrecision, const drflac_int32* coefficients, drflac_int32* pSamplesOut)\n{\n    drflac_uint32 i;\n\n    DRFLAC_ASSERT(bs != NULL);\n    DRFLAC_ASSERT(unencodedBitsPerSample <= 31);    /* <-- unencodedBitsPerSample is a 5 bit number, so cannot exceed 31. */\n    DRFLAC_ASSERT(pSamplesOut != NULL);\n\n    for (i = 0; i < count; ++i) {\n        if (unencodedBitsPerSample > 0) {\n            if (!drflac__read_int32(bs, unencodedBitsPerSample, pSamplesOut + i)) {\n                return DRFLAC_FALSE;\n            }\n        } else {\n            pSamplesOut[i] = 0;\n        }\n\n        if (drflac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) {\n            pSamplesOut[i] += drflac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + i);\n        } else {\n            pSamplesOut[i] += drflac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + i);\n        }\n    }\n\n    return DRFLAC_TRUE;\n}\n\n\n/*\nReads and decodes the residual for the sub-frame the decoder is currently sitting on. This function should be called\nwhen the decoder is sitting at the very start of the RESIDUAL block. The first <order> residuals will be ignored. The\n<blockSize> and <order> parameters are used to determine how many residual values need to be decoded.\n*/\nstatic drflac_bool32 drflac__decode_samples_with_residual(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 blockSize, drflac_uint32 lpcOrder, drflac_int32 lpcShift, drflac_uint32 lpcPrecision, const drflac_int32* coefficients, drflac_int32* pDecodedSamples)\n{\n    drflac_uint8 residualMethod;\n    drflac_uint8 partitionOrder;\n    drflac_uint32 samplesInPartition;\n    drflac_uint32 partitionsRemaining;\n\n    DRFLAC_ASSERT(bs != NULL);\n    DRFLAC_ASSERT(blockSize != 0);\n    DRFLAC_ASSERT(pDecodedSamples != NULL);       /* <-- Should we allow NULL, in which case we just seek past the residual rather than do a full decode? */\n\n    if (!drflac__read_uint8(bs, 2, &residualMethod)) {\n        return DRFLAC_FALSE;\n    }\n\n    if (residualMethod != DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE && residualMethod != DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2) {\n        return DRFLAC_FALSE;    /* Unknown or unsupported residual coding method. */\n    }\n\n    /* Ignore the first <order> values. */\n    pDecodedSamples += lpcOrder;\n\n    if (!drflac__read_uint8(bs, 4, &partitionOrder)) {\n        return DRFLAC_FALSE;\n    }\n\n    /*\n    From the FLAC spec:\n      The Rice partition order in a Rice-coded residual section must be less than or equal to 8.\n    */\n    if (partitionOrder > 8) {\n        return DRFLAC_FALSE;\n    }\n\n    /* Validation check. */\n    if ((blockSize / (1 << partitionOrder)) < lpcOrder) {\n        return DRFLAC_FALSE;\n    }\n\n    samplesInPartition = (blockSize / (1 << partitionOrder)) - lpcOrder;\n    partitionsRemaining = (1 << partitionOrder);\n    for (;;) {\n        drflac_uint8 riceParam = 0;\n        if (residualMethod == DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE) {\n            if (!drflac__read_uint8(bs, 4, &riceParam)) {\n                return DRFLAC_FALSE;\n            }\n            if (riceParam == 15) {\n                riceParam = 0xFF;\n            }\n        } else if (residualMethod == DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2) {\n            if (!drflac__read_uint8(bs, 5, &riceParam)) {\n                return DRFLAC_FALSE;\n            }\n            if (riceParam == 31) {\n                riceParam = 0xFF;\n            }\n        }\n\n        if (riceParam != 0xFF) {\n            if (!drflac__decode_samples_with_residual__rice(bs, bitsPerSample, samplesInPartition, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pDecodedSamples)) {\n                return DRFLAC_FALSE;\n            }\n        } else {\n            drflac_uint8 unencodedBitsPerSample = 0;\n            if (!drflac__read_uint8(bs, 5, &unencodedBitsPerSample)) {\n                return DRFLAC_FALSE;\n            }\n\n            if (!drflac__decode_samples_with_residual__unencoded(bs, bitsPerSample, samplesInPartition, unencodedBitsPerSample, lpcOrder, lpcShift, lpcPrecision, coefficients, pDecodedSamples)) {\n                return DRFLAC_FALSE;\n            }\n        }\n\n        pDecodedSamples += samplesInPartition;\n\n        if (partitionsRemaining == 1) {\n            break;\n        }\n\n        partitionsRemaining -= 1;\n\n        if (partitionOrder != 0) {\n            samplesInPartition = blockSize / (1 << partitionOrder);\n        }\n    }\n\n    return DRFLAC_TRUE;\n}\n\n/*\nReads and seeks past the residual for the sub-frame the decoder is currently sitting on. This function should be called\nwhen the decoder is sitting at the very start of the RESIDUAL block. The first <order> residuals will be set to 0. The\n<blockSize> and <order> parameters are used to determine how many residual values need to be decoded.\n*/\nstatic drflac_bool32 drflac__read_and_seek_residual(drflac_bs* bs, drflac_uint32 blockSize, drflac_uint32 order)\n{\n    drflac_uint8 residualMethod;\n    drflac_uint8 partitionOrder;\n    drflac_uint32 samplesInPartition;\n    drflac_uint32 partitionsRemaining;\n\n    DRFLAC_ASSERT(bs != NULL);\n    DRFLAC_ASSERT(blockSize != 0);\n\n    if (!drflac__read_uint8(bs, 2, &residualMethod)) {\n        return DRFLAC_FALSE;\n    }\n\n    if (residualMethod != DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE && residualMethod != DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2) {\n        return DRFLAC_FALSE;    /* Unknown or unsupported residual coding method. */\n    }\n\n    if (!drflac__read_uint8(bs, 4, &partitionOrder)) {\n        return DRFLAC_FALSE;\n    }\n\n    /*\n    From the FLAC spec:\n      The Rice partition order in a Rice-coded residual section must be less than or equal to 8.\n    */\n    if (partitionOrder > 8) {\n        return DRFLAC_FALSE;\n    }\n\n    /* Validation check. */\n    if ((blockSize / (1 << partitionOrder)) <= order) {\n        return DRFLAC_FALSE;\n    }\n\n    samplesInPartition = (blockSize / (1 << partitionOrder)) - order;\n    partitionsRemaining = (1 << partitionOrder);\n    for (;;)\n    {\n        drflac_uint8 riceParam = 0;\n        if (residualMethod == DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE) {\n            if (!drflac__read_uint8(bs, 4, &riceParam)) {\n                return DRFLAC_FALSE;\n            }\n            if (riceParam == 15) {\n                riceParam = 0xFF;\n            }\n        } else if (residualMethod == DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2) {\n            if (!drflac__read_uint8(bs, 5, &riceParam)) {\n                return DRFLAC_FALSE;\n            }\n            if (riceParam == 31) {\n                riceParam = 0xFF;\n            }\n        }\n\n        if (riceParam != 0xFF) {\n            if (!drflac__read_and_seek_residual__rice(bs, samplesInPartition, riceParam)) {\n                return DRFLAC_FALSE;\n            }\n        } else {\n            drflac_uint8 unencodedBitsPerSample = 0;\n            if (!drflac__read_uint8(bs, 5, &unencodedBitsPerSample)) {\n                return DRFLAC_FALSE;\n            }\n\n            if (!drflac__seek_bits(bs, unencodedBitsPerSample * samplesInPartition)) {\n                return DRFLAC_FALSE;\n            }\n        }\n\n\n        if (partitionsRemaining == 1) {\n            break;\n        }\n\n        partitionsRemaining -= 1;\n        samplesInPartition = blockSize / (1 << partitionOrder);\n    }\n\n    return DRFLAC_TRUE;\n}\n\n\nstatic drflac_bool32 drflac__decode_samples__constant(drflac_bs* bs, drflac_uint32 blockSize, drflac_uint32 subframeBitsPerSample, drflac_int32* pDecodedSamples)\n{\n    drflac_uint32 i;\n\n    /* Only a single sample needs to be decoded here. */\n    drflac_int32 sample;\n    if (!drflac__read_int32(bs, subframeBitsPerSample, &sample)) {\n        return DRFLAC_FALSE;\n    }\n\n    /*\n    We don't really need to expand this, but it does simplify the process of reading samples. If this becomes a performance issue (unlikely)\n    we'll want to look at a more efficient way.\n    */\n    for (i = 0; i < blockSize; ++i) {\n        pDecodedSamples[i] = sample;\n    }\n\n    return DRFLAC_TRUE;\n}\n\nstatic drflac_bool32 drflac__decode_samples__verbatim(drflac_bs* bs, drflac_uint32 blockSize, drflac_uint32 subframeBitsPerSample, drflac_int32* pDecodedSamples)\n{\n    drflac_uint32 i;\n\n    for (i = 0; i < blockSize; ++i) {\n        drflac_int32 sample;\n        if (!drflac__read_int32(bs, subframeBitsPerSample, &sample)) {\n            return DRFLAC_FALSE;\n        }\n\n        pDecodedSamples[i] = sample;\n    }\n\n    return DRFLAC_TRUE;\n}\n\nstatic drflac_bool32 drflac__decode_samples__fixed(drflac_bs* bs, drflac_uint32 blockSize, drflac_uint32 subframeBitsPerSample, drflac_uint8 lpcOrder, drflac_int32* pDecodedSamples)\n{\n    drflac_uint32 i;\n\n    static drflac_int32 lpcCoefficientsTable[5][4] = {\n        {0,  0, 0,  0},\n        {1,  0, 0,  0},\n        {2, -1, 0,  0},\n        {3, -3, 1,  0},\n        {4, -6, 4, -1}\n    };\n\n    /* Warm up samples and coefficients. */\n    for (i = 0; i < lpcOrder; ++i) {\n        drflac_int32 sample;\n        if (!drflac__read_int32(bs, subframeBitsPerSample, &sample)) {\n            return DRFLAC_FALSE;\n        }\n\n        pDecodedSamples[i] = sample;\n    }\n\n    if (!drflac__decode_samples_with_residual(bs, subframeBitsPerSample, blockSize, lpcOrder, 0, 4, lpcCoefficientsTable[lpcOrder], pDecodedSamples)) {\n        return DRFLAC_FALSE;\n    }\n\n    return DRFLAC_TRUE;\n}\n\nstatic drflac_bool32 drflac__decode_samples__lpc(drflac_bs* bs, drflac_uint32 blockSize, drflac_uint32 bitsPerSample, drflac_uint8 lpcOrder, drflac_int32* pDecodedSamples)\n{\n    drflac_uint8 i;\n    drflac_uint8 lpcPrecision;\n    drflac_int8 lpcShift;\n    drflac_int32 coefficients[32];\n\n    /* Warm up samples. */\n    for (i = 0; i < lpcOrder; ++i) {\n        drflac_int32 sample;\n        if (!drflac__read_int32(bs, bitsPerSample, &sample)) {\n            return DRFLAC_FALSE;\n        }\n\n        pDecodedSamples[i] = sample;\n    }\n\n    if (!drflac__read_uint8(bs, 4, &lpcPrecision)) {\n        return DRFLAC_FALSE;\n    }\n    if (lpcPrecision == 15) {\n        return DRFLAC_FALSE;    /* Invalid. */\n    }\n    lpcPrecision += 1;\n\n    if (!drflac__read_int8(bs, 5, &lpcShift)) {\n        return DRFLAC_FALSE;\n    }\n\n    /*\n    From the FLAC specification:\n\n        Quantized linear predictor coefficient shift needed in bits (NOTE: this number is signed two's-complement)\n\n    Emphasis on the \"signed two's-complement\". In practice there does not seem to be any encoders nor decoders supporting negative shifts. For now dr_flac is\n    not going to support negative shifts as I don't have any reference files. However, when a reference file comes through I will consider adding support.\n    */\n    if (lpcShift < 0) {\n        return DRFLAC_FALSE;\n    }\n\n    DRFLAC_ZERO_MEMORY(coefficients, sizeof(coefficients));\n    for (i = 0; i < lpcOrder; ++i) {\n        if (!drflac__read_int32(bs, lpcPrecision, coefficients + i)) {\n            return DRFLAC_FALSE;\n        }\n    }\n\n    if (!drflac__decode_samples_with_residual(bs, bitsPerSample, blockSize, lpcOrder, lpcShift, lpcPrecision, coefficients, pDecodedSamples)) {\n        return DRFLAC_FALSE;\n    }\n\n    return DRFLAC_TRUE;\n}\n\n\nstatic drflac_bool32 drflac__read_next_flac_frame_header(drflac_bs* bs, drflac_uint8 streaminfoBitsPerSample, drflac_frame_header* header)\n{\n    const drflac_uint32 sampleRateTable[12]  = {0, 88200, 176400, 192000, 8000, 16000, 22050, 24000, 32000, 44100, 48000, 96000};\n    const drflac_uint8 bitsPerSampleTable[8] = {0, 8, 12, (drflac_uint8)-1, 16, 20, 24, (drflac_uint8)-1};   /* -1 = reserved. */\n\n    DRFLAC_ASSERT(bs != NULL);\n    DRFLAC_ASSERT(header != NULL);\n\n    /* Keep looping until we find a valid sync code. */\n    for (;;) {\n        drflac_uint8 crc8 = 0xCE; /* 0xCE = drflac_crc8(0, 0x3FFE, 14); */\n        drflac_uint8 reserved = 0;\n        drflac_uint8 blockingStrategy = 0;\n        drflac_uint8 blockSize = 0;\n        drflac_uint8 sampleRate = 0;\n        drflac_uint8 channelAssignment = 0;\n        drflac_uint8 bitsPerSample = 0;\n        drflac_bool32 isVariableBlockSize;\n\n        if (!drflac__find_and_seek_to_next_sync_code(bs)) {\n            return DRFLAC_FALSE;\n        }\n\n        if (!drflac__read_uint8(bs, 1, &reserved)) {\n            return DRFLAC_FALSE;\n        }\n        if (reserved == 1) {\n            continue;\n        }\n        crc8 = drflac_crc8(crc8, reserved, 1);\n\n        if (!drflac__read_uint8(bs, 1, &blockingStrategy)) {\n            return DRFLAC_FALSE;\n        }\n        crc8 = drflac_crc8(crc8, blockingStrategy, 1);\n\n        if (!drflac__read_uint8(bs, 4, &blockSize)) {\n            return DRFLAC_FALSE;\n        }\n        if (blockSize == 0) {\n            continue;\n        }\n        crc8 = drflac_crc8(crc8, blockSize, 4);\n\n        if (!drflac__read_uint8(bs, 4, &sampleRate)) {\n            return DRFLAC_FALSE;\n        }\n        crc8 = drflac_crc8(crc8, sampleRate, 4);\n\n        if (!drflac__read_uint8(bs, 4, &channelAssignment)) {\n            return DRFLAC_FALSE;\n        }\n        if (channelAssignment > 10) {\n            continue;\n        }\n        crc8 = drflac_crc8(crc8, channelAssignment, 4);\n\n        if (!drflac__read_uint8(bs, 3, &bitsPerSample)) {\n            return DRFLAC_FALSE;\n        }\n        if (bitsPerSample == 3 || bitsPerSample == 7) {\n            continue;\n        }\n        crc8 = drflac_crc8(crc8, bitsPerSample, 3);\n\n\n        if (!drflac__read_uint8(bs, 1, &reserved)) {\n            return DRFLAC_FALSE;\n        }\n        if (reserved == 1) {\n            continue;\n        }\n        crc8 = drflac_crc8(crc8, reserved, 1);\n\n\n        isVariableBlockSize = blockingStrategy == 1;\n        if (isVariableBlockSize) {\n            drflac_uint64 pcmFrameNumber;\n            drflac_result result = drflac__read_utf8_coded_number(bs, &pcmFrameNumber, &crc8);\n            if (result != DRFLAC_SUCCESS) {\n                if (result == DRFLAC_AT_END) {\n                    return DRFLAC_FALSE;\n                } else {\n                    continue;\n                }\n            }\n            header->flacFrameNumber  = 0;\n            header->pcmFrameNumber = pcmFrameNumber;\n        } else {\n            drflac_uint64 flacFrameNumber = 0;\n            drflac_result result = drflac__read_utf8_coded_number(bs, &flacFrameNumber, &crc8);\n            if (result != DRFLAC_SUCCESS) {\n                if (result == DRFLAC_AT_END) {\n                    return DRFLAC_FALSE;\n                } else {\n                    continue;\n                }\n            }\n            header->flacFrameNumber  = (drflac_uint32)flacFrameNumber;   /* <-- Safe cast. */\n            header->pcmFrameNumber = 0;\n        }\n\n\n        DRFLAC_ASSERT(blockSize > 0);\n        if (blockSize == 1) {\n            header->blockSizeInPCMFrames = 192;\n        } else if (blockSize <= 5) {\n            DRFLAC_ASSERT(blockSize >= 2);\n            header->blockSizeInPCMFrames = 576 * (1 << (blockSize - 2));\n        } else if (blockSize == 6) {\n            if (!drflac__read_uint16(bs, 8, &header->blockSizeInPCMFrames)) {\n                return DRFLAC_FALSE;\n            }\n            crc8 = drflac_crc8(crc8, header->blockSizeInPCMFrames, 8);\n            header->blockSizeInPCMFrames += 1;\n        } else if (blockSize == 7) {\n            if (!drflac__read_uint16(bs, 16, &header->blockSizeInPCMFrames)) {\n                return DRFLAC_FALSE;\n            }\n            crc8 = drflac_crc8(crc8, header->blockSizeInPCMFrames, 16);\n            if (header->blockSizeInPCMFrames == 0xFFFF) {\n                return DRFLAC_FALSE;    /* Frame is too big. This is the size of the frame minus 1. The STREAMINFO block defines the max block size which is 16-bits. Adding one will make it 17 bits and therefore too big. */\n            }\n            header->blockSizeInPCMFrames += 1;\n        } else {\n            DRFLAC_ASSERT(blockSize >= 8);\n            header->blockSizeInPCMFrames = 256 * (1 << (blockSize - 8));\n        }\n\n\n        if (sampleRate <= 11) {\n            header->sampleRate = sampleRateTable[sampleRate];\n        } else if (sampleRate == 12) {\n            if (!drflac__read_uint32(bs, 8, &header->sampleRate)) {\n                return DRFLAC_FALSE;\n            }\n            crc8 = drflac_crc8(crc8, header->sampleRate, 8);\n            header->sampleRate *= 1000;\n        } else if (sampleRate == 13) {\n            if (!drflac__read_uint32(bs, 16, &header->sampleRate)) {\n                return DRFLAC_FALSE;\n            }\n            crc8 = drflac_crc8(crc8, header->sampleRate, 16);\n        } else if (sampleRate == 14) {\n            if (!drflac__read_uint32(bs, 16, &header->sampleRate)) {\n                return DRFLAC_FALSE;\n            }\n            crc8 = drflac_crc8(crc8, header->sampleRate, 16);\n            header->sampleRate *= 10;\n        } else {\n            continue;  /* Invalid. Assume an invalid block. */\n        }\n\n\n        header->channelAssignment = channelAssignment;\n\n        header->bitsPerSample = bitsPerSampleTable[bitsPerSample];\n        if (header->bitsPerSample == 0) {\n            header->bitsPerSample = streaminfoBitsPerSample;\n        }\n\n        if (header->bitsPerSample != streaminfoBitsPerSample) {\n            /* If this subframe has a different bitsPerSample then streaminfo or the first frame, reject it */\n            return DRFLAC_FALSE;\n        }\n\n        if (!drflac__read_uint8(bs, 8, &header->crc8)) {\n            return DRFLAC_FALSE;\n        }\n\n#ifndef DR_FLAC_NO_CRC\n        if (header->crc8 != crc8) {\n            continue;    /* CRC mismatch. Loop back to the top and find the next sync code. */\n        }\n#endif\n        return DRFLAC_TRUE;\n    }\n}\n\nstatic drflac_bool32 drflac__read_subframe_header(drflac_bs* bs, drflac_subframe* pSubframe)\n{\n    drflac_uint8 header;\n    int type;\n\n    if (!drflac__read_uint8(bs, 8, &header)) {\n        return DRFLAC_FALSE;\n    }\n\n    /* First bit should always be 0. */\n    if ((header & 0x80) != 0) {\n        return DRFLAC_FALSE;\n    }\n\n    type = (header & 0x7E) >> 1;\n    if (type == 0) {\n        pSubframe->subframeType = DRFLAC_SUBFRAME_CONSTANT;\n    } else if (type == 1) {\n        pSubframe->subframeType = DRFLAC_SUBFRAME_VERBATIM;\n    } else {\n        if ((type & 0x20) != 0) {\n            pSubframe->subframeType = DRFLAC_SUBFRAME_LPC;\n            pSubframe->lpcOrder = (drflac_uint8)(type & 0x1F) + 1;\n        } else if ((type & 0x08) != 0) {\n            pSubframe->subframeType = DRFLAC_SUBFRAME_FIXED;\n            pSubframe->lpcOrder = (drflac_uint8)(type & 0x07);\n            if (pSubframe->lpcOrder > 4) {\n                pSubframe->subframeType = DRFLAC_SUBFRAME_RESERVED;\n                pSubframe->lpcOrder = 0;\n            }\n        } else {\n            pSubframe->subframeType = DRFLAC_SUBFRAME_RESERVED;\n        }\n    }\n\n    if (pSubframe->subframeType == DRFLAC_SUBFRAME_RESERVED) {\n        return DRFLAC_FALSE;\n    }\n\n    /* Wasted bits per sample. */\n    pSubframe->wastedBitsPerSample = 0;\n    if ((header & 0x01) == 1) {\n        unsigned int wastedBitsPerSample;\n        if (!drflac__seek_past_next_set_bit(bs, &wastedBitsPerSample)) {\n            return DRFLAC_FALSE;\n        }\n        pSubframe->wastedBitsPerSample = (drflac_uint8)wastedBitsPerSample + 1;\n    }\n\n    return DRFLAC_TRUE;\n}\n\nstatic drflac_bool32 drflac__decode_subframe(drflac_bs* bs, drflac_frame* frame, int subframeIndex, drflac_int32* pDecodedSamplesOut)\n{\n    drflac_subframe* pSubframe;\n    drflac_uint32 subframeBitsPerSample;\n\n    DRFLAC_ASSERT(bs != NULL);\n    DRFLAC_ASSERT(frame != NULL);\n\n    pSubframe = frame->subframes + subframeIndex;\n    if (!drflac__read_subframe_header(bs, pSubframe)) {\n        return DRFLAC_FALSE;\n    }\n\n    /* Side channels require an extra bit per sample. Took a while to figure that one out... */\n    subframeBitsPerSample = frame->header.bitsPerSample;\n    if ((frame->header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE || frame->header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE) && subframeIndex == 1) {\n        subframeBitsPerSample += 1;\n    } else if (frame->header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE && subframeIndex == 0) {\n        subframeBitsPerSample += 1;\n    }\n\n    if (subframeBitsPerSample > 32) {\n        /* libFLAC and ffmpeg reject 33-bit subframes as well */\n        return DRFLAC_FALSE;\n    }\n\n    /* Need to handle wasted bits per sample. */\n    if (pSubframe->wastedBitsPerSample >= subframeBitsPerSample) {\n        return DRFLAC_FALSE;\n    }\n    subframeBitsPerSample -= pSubframe->wastedBitsPerSample;\n\n    pSubframe->pSamplesS32 = pDecodedSamplesOut;\n\n    switch (pSubframe->subframeType)\n    {\n        case DRFLAC_SUBFRAME_CONSTANT:\n        {\n            drflac__decode_samples__constant(bs, frame->header.blockSizeInPCMFrames, subframeBitsPerSample, pSubframe->pSamplesS32);\n        } break;\n\n        case DRFLAC_SUBFRAME_VERBATIM:\n        {\n            drflac__decode_samples__verbatim(bs, frame->header.blockSizeInPCMFrames, subframeBitsPerSample, pSubframe->pSamplesS32);\n        } break;\n\n        case DRFLAC_SUBFRAME_FIXED:\n        {\n            drflac__decode_samples__fixed(bs, frame->header.blockSizeInPCMFrames, subframeBitsPerSample, pSubframe->lpcOrder, pSubframe->pSamplesS32);\n        } break;\n\n        case DRFLAC_SUBFRAME_LPC:\n        {\n            drflac__decode_samples__lpc(bs, frame->header.blockSizeInPCMFrames, subframeBitsPerSample, pSubframe->lpcOrder, pSubframe->pSamplesS32);\n        } break;\n\n        default: return DRFLAC_FALSE;\n    }\n\n    return DRFLAC_TRUE;\n}\n\nstatic drflac_bool32 drflac__seek_subframe(drflac_bs* bs, drflac_frame* frame, int subframeIndex)\n{\n    drflac_subframe* pSubframe;\n    drflac_uint32 subframeBitsPerSample;\n\n    DRFLAC_ASSERT(bs != NULL);\n    DRFLAC_ASSERT(frame != NULL);\n\n    pSubframe = frame->subframes + subframeIndex;\n    if (!drflac__read_subframe_header(bs, pSubframe)) {\n        return DRFLAC_FALSE;\n    }\n\n    /* Side channels require an extra bit per sample. Took a while to figure that one out... */\n    subframeBitsPerSample = frame->header.bitsPerSample;\n    if ((frame->header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE || frame->header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE) && subframeIndex == 1) {\n        subframeBitsPerSample += 1;\n    } else if (frame->header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE && subframeIndex == 0) {\n        subframeBitsPerSample += 1;\n    }\n\n    /* Need to handle wasted bits per sample. */\n    if (pSubframe->wastedBitsPerSample >= subframeBitsPerSample) {\n        return DRFLAC_FALSE;\n    }\n    subframeBitsPerSample -= pSubframe->wastedBitsPerSample;\n\n    pSubframe->pSamplesS32 = NULL;\n\n    switch (pSubframe->subframeType)\n    {\n        case DRFLAC_SUBFRAME_CONSTANT:\n        {\n            if (!drflac__seek_bits(bs, subframeBitsPerSample)) {\n                return DRFLAC_FALSE;\n            }\n        } break;\n\n        case DRFLAC_SUBFRAME_VERBATIM:\n        {\n            unsigned int bitsToSeek = frame->header.blockSizeInPCMFrames * subframeBitsPerSample;\n            if (!drflac__seek_bits(bs, bitsToSeek)) {\n                return DRFLAC_FALSE;\n            }\n        } break;\n\n        case DRFLAC_SUBFRAME_FIXED:\n        {\n            unsigned int bitsToSeek = pSubframe->lpcOrder * subframeBitsPerSample;\n            if (!drflac__seek_bits(bs, bitsToSeek)) {\n                return DRFLAC_FALSE;\n            }\n\n            if (!drflac__read_and_seek_residual(bs, frame->header.blockSizeInPCMFrames, pSubframe->lpcOrder)) {\n                return DRFLAC_FALSE;\n            }\n        } break;\n\n        case DRFLAC_SUBFRAME_LPC:\n        {\n            drflac_uint8 lpcPrecision;\n\n            unsigned int bitsToSeek = pSubframe->lpcOrder * subframeBitsPerSample;\n            if (!drflac__seek_bits(bs, bitsToSeek)) {\n                return DRFLAC_FALSE;\n            }\n\n            if (!drflac__read_uint8(bs, 4, &lpcPrecision)) {\n                return DRFLAC_FALSE;\n            }\n            if (lpcPrecision == 15) {\n                return DRFLAC_FALSE;    /* Invalid. */\n            }\n            lpcPrecision += 1;\n\n\n            bitsToSeek = (pSubframe->lpcOrder * lpcPrecision) + 5;    /* +5 for shift. */\n            if (!drflac__seek_bits(bs, bitsToSeek)) {\n                return DRFLAC_FALSE;\n            }\n\n            if (!drflac__read_and_seek_residual(bs, frame->header.blockSizeInPCMFrames, pSubframe->lpcOrder)) {\n                return DRFLAC_FALSE;\n            }\n        } break;\n\n        default: return DRFLAC_FALSE;\n    }\n\n    return DRFLAC_TRUE;\n}\n\n\nstatic DRFLAC_INLINE drflac_uint8 drflac__get_channel_count_from_channel_assignment(drflac_int8 channelAssignment)\n{\n    drflac_uint8 lookup[] = {1, 2, 3, 4, 5, 6, 7, 8, 2, 2, 2};\n\n    DRFLAC_ASSERT(channelAssignment <= 10);\n    return lookup[channelAssignment];\n}\n\nstatic drflac_result drflac__decode_flac_frame(drflac* pFlac)\n{\n    int channelCount;\n    int i;\n    drflac_uint8 paddingSizeInBits;\n    drflac_uint16 desiredCRC16;\n#ifndef DR_FLAC_NO_CRC\n    drflac_uint16 actualCRC16;\n#endif\n\n    /* This function should be called while the stream is sitting on the first byte after the frame header. */\n    DRFLAC_ZERO_MEMORY(pFlac->currentFLACFrame.subframes, sizeof(pFlac->currentFLACFrame.subframes));\n\n    /* The frame block size must never be larger than the maximum block size defined by the FLAC stream. */\n    if (pFlac->currentFLACFrame.header.blockSizeInPCMFrames > pFlac->maxBlockSizeInPCMFrames) {\n        return DRFLAC_ERROR;\n    }\n\n    /* The number of channels in the frame must match the channel count from the STREAMINFO block. */\n    channelCount = drflac__get_channel_count_from_channel_assignment(pFlac->currentFLACFrame.header.channelAssignment);\n    if (channelCount != (int)pFlac->channels) {\n        return DRFLAC_ERROR;\n    }\n\n    for (i = 0; i < channelCount; ++i) {\n        if (!drflac__decode_subframe(&pFlac->bs, &pFlac->currentFLACFrame, i, pFlac->pDecodedSamples + (pFlac->currentFLACFrame.header.blockSizeInPCMFrames * i))) {\n            return DRFLAC_ERROR;\n        }\n    }\n\n    paddingSizeInBits = (drflac_uint8)(DRFLAC_CACHE_L1_BITS_REMAINING(&pFlac->bs) & 7);\n    if (paddingSizeInBits > 0) {\n        drflac_uint8 padding = 0;\n        if (!drflac__read_uint8(&pFlac->bs, paddingSizeInBits, &padding)) {\n            return DRFLAC_AT_END;\n        }\n    }\n\n#ifndef DR_FLAC_NO_CRC\n    actualCRC16 = drflac__flush_crc16(&pFlac->bs);\n#endif\n    if (!drflac__read_uint16(&pFlac->bs, 16, &desiredCRC16)) {\n        return DRFLAC_AT_END;\n    }\n\n#ifndef DR_FLAC_NO_CRC\n    if (actualCRC16 != desiredCRC16) {\n        return DRFLAC_CRC_MISMATCH;    /* CRC mismatch. */\n    }\n#endif\n\n    pFlac->currentFLACFrame.pcmFramesRemaining = pFlac->currentFLACFrame.header.blockSizeInPCMFrames;\n\n    return DRFLAC_SUCCESS;\n}\n\nstatic drflac_result drflac__seek_flac_frame(drflac* pFlac)\n{\n    int channelCount;\n    int i;\n    drflac_uint16 desiredCRC16;\n#ifndef DR_FLAC_NO_CRC\n    drflac_uint16 actualCRC16;\n#endif\n\n    channelCount = drflac__get_channel_count_from_channel_assignment(pFlac->currentFLACFrame.header.channelAssignment);\n    for (i = 0; i < channelCount; ++i) {\n        if (!drflac__seek_subframe(&pFlac->bs, &pFlac->currentFLACFrame, i)) {\n            return DRFLAC_ERROR;\n        }\n    }\n\n    /* Padding. */\n    if (!drflac__seek_bits(&pFlac->bs, DRFLAC_CACHE_L1_BITS_REMAINING(&pFlac->bs) & 7)) {\n        return DRFLAC_ERROR;\n    }\n\n    /* CRC. */\n#ifndef DR_FLAC_NO_CRC\n    actualCRC16 = drflac__flush_crc16(&pFlac->bs);\n#endif\n    if (!drflac__read_uint16(&pFlac->bs, 16, &desiredCRC16)) {\n        return DRFLAC_AT_END;\n    }\n\n#ifndef DR_FLAC_NO_CRC\n    if (actualCRC16 != desiredCRC16) {\n        return DRFLAC_CRC_MISMATCH;    /* CRC mismatch. */\n    }\n#endif\n\n    return DRFLAC_SUCCESS;\n}\n\nstatic drflac_bool32 drflac__read_and_decode_next_flac_frame(drflac* pFlac)\n{\n    DRFLAC_ASSERT(pFlac != NULL);\n\n    for (;;) {\n        drflac_result result;\n\n        if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) {\n            return DRFLAC_FALSE;\n        }\n\n        result = drflac__decode_flac_frame(pFlac);\n        if (result != DRFLAC_SUCCESS) {\n            if (result == DRFLAC_CRC_MISMATCH) {\n                continue;   /* CRC mismatch. Skip to the next frame. */\n            } else {\n                return DRFLAC_FALSE;\n            }\n        }\n\n        return DRFLAC_TRUE;\n    }\n}\n\nstatic void drflac__get_pcm_frame_range_of_current_flac_frame(drflac* pFlac, drflac_uint64* pFirstPCMFrame, drflac_uint64* pLastPCMFrame)\n{\n    drflac_uint64 firstPCMFrame;\n    drflac_uint64 lastPCMFrame;\n\n    DRFLAC_ASSERT(pFlac != NULL);\n\n    firstPCMFrame = pFlac->currentFLACFrame.header.pcmFrameNumber;\n    if (firstPCMFrame == 0) {\n        firstPCMFrame = ((drflac_uint64)pFlac->currentFLACFrame.header.flacFrameNumber) * pFlac->maxBlockSizeInPCMFrames;\n    }\n\n    lastPCMFrame = firstPCMFrame + pFlac->currentFLACFrame.header.blockSizeInPCMFrames;\n    if (lastPCMFrame > 0) {\n        lastPCMFrame -= 1; /* Needs to be zero based. */\n    }\n\n    if (pFirstPCMFrame) {\n        *pFirstPCMFrame = firstPCMFrame;\n    }\n    if (pLastPCMFrame) {\n        *pLastPCMFrame = lastPCMFrame;\n    }\n}\n\nstatic drflac_bool32 drflac__seek_to_first_frame(drflac* pFlac)\n{\n    drflac_bool32 result;\n\n    DRFLAC_ASSERT(pFlac != NULL);\n\n    result = drflac__seek_to_byte(&pFlac->bs, pFlac->firstFLACFramePosInBytes);\n\n    DRFLAC_ZERO_MEMORY(&pFlac->currentFLACFrame, sizeof(pFlac->currentFLACFrame));\n    pFlac->currentPCMFrame = 0;\n\n    return result;\n}\n\nstatic DRFLAC_INLINE drflac_result drflac__seek_to_next_flac_frame(drflac* pFlac)\n{\n    /* This function should only ever be called while the decoder is sitting on the first byte past the FRAME_HEADER section. */\n    DRFLAC_ASSERT(pFlac != NULL);\n    return drflac__seek_flac_frame(pFlac);\n}\n\n\nstatic drflac_uint64 drflac__seek_forward_by_pcm_frames(drflac* pFlac, drflac_uint64 pcmFramesToSeek)\n{\n    drflac_uint64 pcmFramesRead = 0;\n    while (pcmFramesToSeek > 0) {\n        if (pFlac->currentFLACFrame.pcmFramesRemaining == 0) {\n            if (!drflac__read_and_decode_next_flac_frame(pFlac)) {\n                break;  /* Couldn't read the next frame, so just break from the loop and return. */\n            }\n        } else {\n            if (pFlac->currentFLACFrame.pcmFramesRemaining > pcmFramesToSeek) {\n                pcmFramesRead   += pcmFramesToSeek;\n                pFlac->currentFLACFrame.pcmFramesRemaining -= (drflac_uint32)pcmFramesToSeek;   /* <-- Safe cast. Will always be < currentFrame.pcmFramesRemaining < 65536. */\n                pcmFramesToSeek  = 0;\n            } else {\n                pcmFramesRead   += pFlac->currentFLACFrame.pcmFramesRemaining;\n                pcmFramesToSeek -= pFlac->currentFLACFrame.pcmFramesRemaining;\n                pFlac->currentFLACFrame.pcmFramesRemaining = 0;\n            }\n        }\n    }\n\n    pFlac->currentPCMFrame += pcmFramesRead;\n    return pcmFramesRead;\n}\n\n\nstatic drflac_bool32 drflac__seek_to_pcm_frame__brute_force(drflac* pFlac, drflac_uint64 pcmFrameIndex)\n{\n    drflac_bool32 isMidFrame = DRFLAC_FALSE;\n    drflac_uint64 runningPCMFrameCount;\n\n    DRFLAC_ASSERT(pFlac != NULL);\n\n    /* If we are seeking forward we start from the current position. Otherwise we need to start all the way from the start of the file. */\n    if (pcmFrameIndex >= pFlac->currentPCMFrame) {\n        /* Seeking forward. Need to seek from the current position. */\n        runningPCMFrameCount = pFlac->currentPCMFrame;\n\n        /* The frame header for the first frame may not yet have been read. We need to do that if necessary. */\n        if (pFlac->currentPCMFrame == 0 && pFlac->currentFLACFrame.pcmFramesRemaining == 0) {\n            if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) {\n                return DRFLAC_FALSE;\n            }\n        } else {\n            isMidFrame = DRFLAC_TRUE;\n        }\n    } else {\n        /* Seeking backwards. Need to seek from the start of the file. */\n        runningPCMFrameCount = 0;\n\n        /* Move back to the start. */\n        if (!drflac__seek_to_first_frame(pFlac)) {\n            return DRFLAC_FALSE;\n        }\n\n        /* Decode the first frame in preparation for sample-exact seeking below. */\n        if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) {\n            return DRFLAC_FALSE;\n        }\n    }\n\n    /*\n    We need to as quickly as possible find the frame that contains the target sample. To do this, we iterate over each frame and inspect its\n    header. If based on the header we can determine that the frame contains the sample, we do a full decode of that frame.\n    */\n    for (;;) {\n        drflac_uint64 pcmFrameCountInThisFLACFrame;\n        drflac_uint64 firstPCMFrameInFLACFrame = 0;\n        drflac_uint64 lastPCMFrameInFLACFrame = 0;\n\n        drflac__get_pcm_frame_range_of_current_flac_frame(pFlac, &firstPCMFrameInFLACFrame, &lastPCMFrameInFLACFrame);\n\n        pcmFrameCountInThisFLACFrame = (lastPCMFrameInFLACFrame - firstPCMFrameInFLACFrame) + 1;\n        if (pcmFrameIndex < (runningPCMFrameCount + pcmFrameCountInThisFLACFrame)) {\n            /*\n            The sample should be in this frame. We need to fully decode it, however if it's an invalid frame (a CRC mismatch), we need to pretend\n            it never existed and keep iterating.\n            */\n            drflac_uint64 pcmFramesToDecode = pcmFrameIndex - runningPCMFrameCount;\n\n            if (!isMidFrame) {\n                drflac_result result = drflac__decode_flac_frame(pFlac);\n                if (result == DRFLAC_SUCCESS) {\n                    /* The frame is valid. We just need to skip over some samples to ensure it's sample-exact. */\n                    return drflac__seek_forward_by_pcm_frames(pFlac, pcmFramesToDecode) == pcmFramesToDecode;  /* <-- If this fails, something bad has happened (it should never fail). */\n                } else {\n                    if (result == DRFLAC_CRC_MISMATCH) {\n                        goto next_iteration;   /* CRC mismatch. Pretend this frame never existed. */\n                    } else {\n                        return DRFLAC_FALSE;\n                    }\n                }\n            } else {\n                /* We started seeking mid-frame which means we need to skip the frame decoding part. */\n                return drflac__seek_forward_by_pcm_frames(pFlac, pcmFramesToDecode) == pcmFramesToDecode;\n            }\n        } else {\n            /*\n            It's not in this frame. We need to seek past the frame, but check if there was a CRC mismatch. If so, we pretend this\n            frame never existed and leave the running sample count untouched.\n            */\n            if (!isMidFrame) {\n                drflac_result result = drflac__seek_to_next_flac_frame(pFlac);\n                if (result == DRFLAC_SUCCESS) {\n                    runningPCMFrameCount += pcmFrameCountInThisFLACFrame;\n                } else {\n                    if (result == DRFLAC_CRC_MISMATCH) {\n                        goto next_iteration;   /* CRC mismatch. Pretend this frame never existed. */\n                    } else {\n                        return DRFLAC_FALSE;\n                    }\n                }\n            } else {\n                /*\n                We started seeking mid-frame which means we need to seek by reading to the end of the frame instead of with\n                drflac__seek_to_next_flac_frame() which only works if the decoder is sitting on the byte just after the frame header.\n                */\n                runningPCMFrameCount += pFlac->currentFLACFrame.pcmFramesRemaining;\n                pFlac->currentFLACFrame.pcmFramesRemaining = 0;\n                isMidFrame = DRFLAC_FALSE;\n            }\n\n            /* If we are seeking to the end of the file and we've just hit it, we're done. */\n            if (pcmFrameIndex == pFlac->totalPCMFrameCount && runningPCMFrameCount == pFlac->totalPCMFrameCount) {\n                return DRFLAC_TRUE;\n            }\n        }\n\n    next_iteration:\n        /* Grab the next frame in preparation for the next iteration. */\n        if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) {\n            return DRFLAC_FALSE;\n        }\n    }\n}\n\n\n#if !defined(DR_FLAC_NO_CRC)\n/*\nWe use an average compression ratio to determine our approximate start location. FLAC files are generally about 50%-70% the size of their\nuncompressed counterparts so we'll use this as a basis. I'm going to split the middle and use a factor of 0.6 to determine the starting\nlocation.\n*/\n#define DRFLAC_BINARY_SEARCH_APPROX_COMPRESSION_RATIO 0.6f\n\nstatic drflac_bool32 drflac__seek_to_approximate_flac_frame_to_byte(drflac* pFlac, drflac_uint64 targetByte, drflac_uint64 rangeLo, drflac_uint64 rangeHi, drflac_uint64* pLastSuccessfulSeekOffset)\n{\n    DRFLAC_ASSERT(pFlac != NULL);\n    DRFLAC_ASSERT(pLastSuccessfulSeekOffset != NULL);\n    DRFLAC_ASSERT(targetByte >= rangeLo);\n    DRFLAC_ASSERT(targetByte <= rangeHi);\n\n    *pLastSuccessfulSeekOffset = pFlac->firstFLACFramePosInBytes;\n\n    for (;;) {\n        /* After rangeLo == rangeHi == targetByte fails, we need to break out. */\n        drflac_uint64 lastTargetByte = targetByte;\n\n        /* When seeking to a byte, failure probably means we've attempted to seek beyond the end of the stream. To counter this we just halve it each attempt. */\n        if (!drflac__seek_to_byte(&pFlac->bs, targetByte)) {\n            /* If we couldn't even seek to the first byte in the stream we have a problem. Just abandon the whole thing. */\n            if (targetByte == 0) {\n                drflac__seek_to_first_frame(pFlac); /* Try to recover. */\n                return DRFLAC_FALSE;\n            }\n\n            /* Halve the byte location and continue. */\n            targetByte = rangeLo + ((rangeHi - rangeLo)/2);\n            rangeHi = targetByte;\n        } else {\n            /* Getting here should mean that we have seeked to an appropriate byte. */\n\n            /* Clear the details of the FLAC frame so we don't misreport data. */\n            DRFLAC_ZERO_MEMORY(&pFlac->currentFLACFrame, sizeof(pFlac->currentFLACFrame));\n\n            /*\n            Now seek to the next FLAC frame. We need to decode the entire frame (not just the header) because it's possible for the header to incorrectly pass the\n            CRC check and return bad data. We need to decode the entire frame to be more certain. Although this seems unlikely, this has happened to me in testing\n            so it needs to stay this way for now.\n            */\n#if 1\n            if (!drflac__read_and_decode_next_flac_frame(pFlac)) {\n                /* Halve the byte location and continue. */\n                targetByte = rangeLo + ((rangeHi - rangeLo)/2);\n                rangeHi = targetByte;\n            } else {\n                break;\n            }\n#else\n            if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) {\n                /* Halve the byte location and continue. */\n                targetByte = rangeLo + ((rangeHi - rangeLo)/2);\n                rangeHi = targetByte;\n            } else {\n                break;\n            }\n#endif\n        }\n\n        /* We already tried this byte and there are no more to try, break out. */\n        if(targetByte == lastTargetByte) {\n            return DRFLAC_FALSE;\n        }\n    }\n\n    /* The current PCM frame needs to be updated based on the frame we just seeked to. */\n    drflac__get_pcm_frame_range_of_current_flac_frame(pFlac, &pFlac->currentPCMFrame, NULL);\n\n    DRFLAC_ASSERT(targetByte <= rangeHi);\n\n    *pLastSuccessfulSeekOffset = targetByte;\n    return DRFLAC_TRUE;\n}\n\nstatic drflac_bool32 drflac__decode_flac_frame_and_seek_forward_by_pcm_frames(drflac* pFlac, drflac_uint64 offset)\n{\n    /* This section of code would be used if we were only decoding the FLAC frame header when calling drflac__seek_to_approximate_flac_frame_to_byte(). */\n#if 0\n    if (drflac__decode_flac_frame(pFlac) != DRFLAC_SUCCESS) {\n        /* We failed to decode this frame which may be due to it being corrupt. We'll just use the next valid FLAC frame. */\n        if (drflac__read_and_decode_next_flac_frame(pFlac) == DRFLAC_FALSE) {\n            return DRFLAC_FALSE;\n        }\n    }\n#endif\n\n    return drflac__seek_forward_by_pcm_frames(pFlac, offset) == offset;\n}\n\n\nstatic drflac_bool32 drflac__seek_to_pcm_frame__binary_search_internal(drflac* pFlac, drflac_uint64 pcmFrameIndex, drflac_uint64 byteRangeLo, drflac_uint64 byteRangeHi)\n{\n    /* This assumes pFlac->currentPCMFrame is sitting on byteRangeLo upon entry. */\n\n    drflac_uint64 targetByte;\n    drflac_uint64 pcmRangeLo = pFlac->totalPCMFrameCount;\n    drflac_uint64 pcmRangeHi = 0;\n    drflac_uint64 lastSuccessfulSeekOffset = (drflac_uint64)-1;\n    drflac_uint64 closestSeekOffsetBeforeTargetPCMFrame = byteRangeLo;\n    drflac_uint32 seekForwardThreshold = (pFlac->maxBlockSizeInPCMFrames != 0) ? pFlac->maxBlockSizeInPCMFrames*2 : 4096;\n\n    targetByte = byteRangeLo + (drflac_uint64)(((drflac_int64)((pcmFrameIndex - pFlac->currentPCMFrame) * pFlac->channels * pFlac->bitsPerSample)/8.0f) * DRFLAC_BINARY_SEARCH_APPROX_COMPRESSION_RATIO);\n    if (targetByte > byteRangeHi) {\n        targetByte = byteRangeHi;\n    }\n\n    for (;;) {\n        if (drflac__seek_to_approximate_flac_frame_to_byte(pFlac, targetByte, byteRangeLo, byteRangeHi, &lastSuccessfulSeekOffset)) {\n            /* We found a FLAC frame. We need to check if it contains the sample we're looking for. */\n            drflac_uint64 newPCMRangeLo;\n            drflac_uint64 newPCMRangeHi;\n            drflac__get_pcm_frame_range_of_current_flac_frame(pFlac, &newPCMRangeLo, &newPCMRangeHi);\n\n            /* If we selected the same frame, it means we should be pretty close. Just decode the rest. */\n            if (pcmRangeLo == newPCMRangeLo) {\n                if (!drflac__seek_to_approximate_flac_frame_to_byte(pFlac, closestSeekOffsetBeforeTargetPCMFrame, closestSeekOffsetBeforeTargetPCMFrame, byteRangeHi, &lastSuccessfulSeekOffset)) {\n                    break;  /* Failed to seek to closest frame. */\n                }\n\n                if (drflac__decode_flac_frame_and_seek_forward_by_pcm_frames(pFlac, pcmFrameIndex - pFlac->currentPCMFrame)) {\n                    return DRFLAC_TRUE;\n                } else {\n                    break;  /* Failed to seek forward. */\n                }\n            }\n\n            pcmRangeLo = newPCMRangeLo;\n            pcmRangeHi = newPCMRangeHi;\n\n            if (pcmRangeLo <= pcmFrameIndex && pcmRangeHi >= pcmFrameIndex) {\n                /* The target PCM frame is in this FLAC frame. */\n                if (drflac__decode_flac_frame_and_seek_forward_by_pcm_frames(pFlac, pcmFrameIndex - pFlac->currentPCMFrame) ) {\n                    return DRFLAC_TRUE;\n                } else {\n                    break;  /* Failed to seek to FLAC frame. */\n                }\n            } else {\n                const float approxCompressionRatio = (drflac_int64)(lastSuccessfulSeekOffset - pFlac->firstFLACFramePosInBytes) / ((drflac_int64)(pcmRangeLo * pFlac->channels * pFlac->bitsPerSample)/8.0f);\n\n                if (pcmRangeLo > pcmFrameIndex) {\n                    /* We seeked too far forward. We need to move our target byte backward and try again. */\n                    byteRangeHi = lastSuccessfulSeekOffset;\n                    if (byteRangeLo > byteRangeHi) {\n                        byteRangeLo = byteRangeHi;\n                    }\n\n                    targetByte = byteRangeLo + ((byteRangeHi - byteRangeLo) / 2);\n                    if (targetByte < byteRangeLo) {\n                        targetByte = byteRangeLo;\n                    }\n                } else /*if (pcmRangeHi < pcmFrameIndex)*/ {\n                    /* We didn't seek far enough. We need to move our target byte forward and try again. */\n\n                    /* If we're close enough we can just seek forward. */\n                    if ((pcmFrameIndex - pcmRangeLo) < seekForwardThreshold) {\n                        if (drflac__decode_flac_frame_and_seek_forward_by_pcm_frames(pFlac, pcmFrameIndex - pFlac->currentPCMFrame)) {\n                            return DRFLAC_TRUE;\n                        } else {\n                            break;  /* Failed to seek to FLAC frame. */\n                        }\n                    } else {\n                        byteRangeLo = lastSuccessfulSeekOffset;\n                        if (byteRangeHi < byteRangeLo) {\n                            byteRangeHi = byteRangeLo;\n                        }\n\n                        targetByte = lastSuccessfulSeekOffset + (drflac_uint64)(((drflac_int64)((pcmFrameIndex-pcmRangeLo) * pFlac->channels * pFlac->bitsPerSample)/8.0f) * approxCompressionRatio);\n                        if (targetByte > byteRangeHi) {\n                            targetByte = byteRangeHi;\n                        }\n\n                        if (closestSeekOffsetBeforeTargetPCMFrame < lastSuccessfulSeekOffset) {\n                            closestSeekOffsetBeforeTargetPCMFrame = lastSuccessfulSeekOffset;\n                        }\n                    }\n                }\n            }\n        } else {\n            /* Getting here is really bad. We just recover as best we can, but moving to the first frame in the stream, and then abort. */\n            break;\n        }\n    }\n\n    drflac__seek_to_first_frame(pFlac); /* <-- Try to recover. */\n    return DRFLAC_FALSE;\n}\n\nstatic drflac_bool32 drflac__seek_to_pcm_frame__binary_search(drflac* pFlac, drflac_uint64 pcmFrameIndex)\n{\n    drflac_uint64 byteRangeLo;\n    drflac_uint64 byteRangeHi;\n    drflac_uint32 seekForwardThreshold = (pFlac->maxBlockSizeInPCMFrames != 0) ? pFlac->maxBlockSizeInPCMFrames*2 : 4096;\n\n    /* Our algorithm currently assumes the FLAC stream is currently sitting at the start. */\n    if (drflac__seek_to_first_frame(pFlac) == DRFLAC_FALSE) {\n        return DRFLAC_FALSE;\n    }\n\n    /* If we're close enough to the start, just move to the start and seek forward. */\n    if (pcmFrameIndex < seekForwardThreshold) {\n        return drflac__seek_forward_by_pcm_frames(pFlac, pcmFrameIndex) == pcmFrameIndex;\n    }\n\n    /*\n    Our starting byte range is the byte position of the first FLAC frame and the approximate end of the file as if it were completely uncompressed. This ensures\n    the entire file is included, even though most of the time it'll exceed the end of the actual stream. This is OK as the frame searching logic will handle it.\n    */\n    byteRangeLo = pFlac->firstFLACFramePosInBytes;\n    byteRangeHi = pFlac->firstFLACFramePosInBytes + (drflac_uint64)((drflac_int64)(pFlac->totalPCMFrameCount * pFlac->channels * pFlac->bitsPerSample)/8.0f);\n\n    return drflac__seek_to_pcm_frame__binary_search_internal(pFlac, pcmFrameIndex, byteRangeLo, byteRangeHi);\n}\n#endif  /* !DR_FLAC_NO_CRC */\n\nstatic drflac_bool32 drflac__seek_to_pcm_frame__seek_table(drflac* pFlac, drflac_uint64 pcmFrameIndex)\n{\n    drflac_uint32 iClosestSeekpoint = 0;\n    drflac_bool32 isMidFrame = DRFLAC_FALSE;\n    drflac_uint64 runningPCMFrameCount;\n    drflac_uint32 iSeekpoint;\n\n\n    DRFLAC_ASSERT(pFlac != NULL);\n\n    if (pFlac->pSeekpoints == NULL || pFlac->seekpointCount == 0) {\n        return DRFLAC_FALSE;\n    }\n\n    /* Do not use the seektable if pcmFramIndex is not coverd by it. */\n    if (pFlac->pSeekpoints[0].firstPCMFrame > pcmFrameIndex) {\n        return DRFLAC_FALSE;\n    }\n\n    for (iSeekpoint = 0; iSeekpoint < pFlac->seekpointCount; ++iSeekpoint) {\n        if (pFlac->pSeekpoints[iSeekpoint].firstPCMFrame >= pcmFrameIndex) {\n            break;\n        }\n\n        iClosestSeekpoint = iSeekpoint;\n    }\n\n    /* There's been cases where the seek table contains only zeros. We need to do some basic validation on the closest seekpoint. */\n    if (pFlac->pSeekpoints[iClosestSeekpoint].pcmFrameCount == 0 || pFlac->pSeekpoints[iClosestSeekpoint].pcmFrameCount > pFlac->maxBlockSizeInPCMFrames) {\n        return DRFLAC_FALSE;\n    }\n    if (pFlac->pSeekpoints[iClosestSeekpoint].firstPCMFrame > pFlac->totalPCMFrameCount && pFlac->totalPCMFrameCount > 0) {\n        return DRFLAC_FALSE;\n    }\n\n#if !defined(DR_FLAC_NO_CRC)\n    /* At this point we should know the closest seek point. We can use a binary search for this. We need to know the total sample count for this. */\n    if (pFlac->totalPCMFrameCount > 0) {\n        drflac_uint64 byteRangeLo;\n        drflac_uint64 byteRangeHi;\n\n        byteRangeHi = pFlac->firstFLACFramePosInBytes + (drflac_uint64)((drflac_int64)(pFlac->totalPCMFrameCount * pFlac->channels * pFlac->bitsPerSample)/8.0f);\n        byteRangeLo = pFlac->firstFLACFramePosInBytes + pFlac->pSeekpoints[iClosestSeekpoint].flacFrameOffset;\n\n        /*\n        If our closest seek point is not the last one, we only need to search between it and the next one. The section below calculates an appropriate starting\n        value for byteRangeHi which will clamp it appropriately.\n\n        Note that the next seekpoint must have an offset greater than the closest seekpoint because otherwise our binary search algorithm will break down. There\n        have been cases where a seektable consists of seek points where every byte offset is set to 0 which causes problems. If this happens we need to abort.\n        */\n        if (iClosestSeekpoint < pFlac->seekpointCount-1) {\n            drflac_uint32 iNextSeekpoint = iClosestSeekpoint + 1;\n\n            /* Basic validation on the seekpoints to ensure they're usable. */\n            if (pFlac->pSeekpoints[iClosestSeekpoint].flacFrameOffset >= pFlac->pSeekpoints[iNextSeekpoint].flacFrameOffset || pFlac->pSeekpoints[iNextSeekpoint].pcmFrameCount == 0) {\n                return DRFLAC_FALSE;    /* The next seekpoint doesn't look right. The seek table cannot be trusted from here. Abort. */\n            }\n\n            if (pFlac->pSeekpoints[iNextSeekpoint].firstPCMFrame != (((drflac_uint64)0xFFFFFFFF << 32) | 0xFFFFFFFF)) { /* Make sure it's not a placeholder seekpoint. */\n                byteRangeHi = pFlac->firstFLACFramePosInBytes + pFlac->pSeekpoints[iNextSeekpoint].flacFrameOffset - 1; /* byteRangeHi must be zero based. */\n            }\n        }\n\n        if (drflac__seek_to_byte(&pFlac->bs, pFlac->firstFLACFramePosInBytes + pFlac->pSeekpoints[iClosestSeekpoint].flacFrameOffset)) {\n            if (drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) {\n                drflac__get_pcm_frame_range_of_current_flac_frame(pFlac, &pFlac->currentPCMFrame, NULL);\n\n                if (drflac__seek_to_pcm_frame__binary_search_internal(pFlac, pcmFrameIndex, byteRangeLo, byteRangeHi)) {\n                    return DRFLAC_TRUE;\n                }\n            }\n        }\n    }\n#endif  /* !DR_FLAC_NO_CRC */\n\n    /* Getting here means we need to use a slower algorithm because the binary search method failed or cannot be used. */\n\n    /*\n    If we are seeking forward and the closest seekpoint is _before_ the current sample, we just seek forward from where we are. Otherwise we start seeking\n    from the seekpoint's first sample.\n    */\n    if (pcmFrameIndex >= pFlac->currentPCMFrame && pFlac->pSeekpoints[iClosestSeekpoint].firstPCMFrame <= pFlac->currentPCMFrame) {\n        /* Optimized case. Just seek forward from where we are. */\n        runningPCMFrameCount = pFlac->currentPCMFrame;\n\n        /* The frame header for the first frame may not yet have been read. We need to do that if necessary. */\n        if (pFlac->currentPCMFrame == 0 && pFlac->currentFLACFrame.pcmFramesRemaining == 0) {\n            if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) {\n                return DRFLAC_FALSE;\n            }\n        } else {\n            isMidFrame = DRFLAC_TRUE;\n        }\n    } else {\n        /* Slower case. Seek to the start of the seekpoint and then seek forward from there. */\n        runningPCMFrameCount = pFlac->pSeekpoints[iClosestSeekpoint].firstPCMFrame;\n\n        if (!drflac__seek_to_byte(&pFlac->bs, pFlac->firstFLACFramePosInBytes + pFlac->pSeekpoints[iClosestSeekpoint].flacFrameOffset)) {\n            return DRFLAC_FALSE;\n        }\n\n        /* Grab the frame the seekpoint is sitting on in preparation for the sample-exact seeking below. */\n        if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) {\n            return DRFLAC_FALSE;\n        }\n    }\n\n    for (;;) {\n        drflac_uint64 pcmFrameCountInThisFLACFrame;\n        drflac_uint64 firstPCMFrameInFLACFrame = 0;\n        drflac_uint64 lastPCMFrameInFLACFrame = 0;\n\n        drflac__get_pcm_frame_range_of_current_flac_frame(pFlac, &firstPCMFrameInFLACFrame, &lastPCMFrameInFLACFrame);\n\n        pcmFrameCountInThisFLACFrame = (lastPCMFrameInFLACFrame - firstPCMFrameInFLACFrame) + 1;\n        if (pcmFrameIndex < (runningPCMFrameCount + pcmFrameCountInThisFLACFrame)) {\n            /*\n            The sample should be in this frame. We need to fully decode it, but if it's an invalid frame (a CRC mismatch) we need to pretend\n            it never existed and keep iterating.\n            */\n            drflac_uint64 pcmFramesToDecode = pcmFrameIndex - runningPCMFrameCount;\n\n            if (!isMidFrame) {\n                drflac_result result = drflac__decode_flac_frame(pFlac);\n                if (result == DRFLAC_SUCCESS) {\n                    /* The frame is valid. We just need to skip over some samples to ensure it's sample-exact. */\n                    return drflac__seek_forward_by_pcm_frames(pFlac, pcmFramesToDecode) == pcmFramesToDecode;  /* <-- If this fails, something bad has happened (it should never fail). */\n                } else {\n                    if (result == DRFLAC_CRC_MISMATCH) {\n                        goto next_iteration;   /* CRC mismatch. Pretend this frame never existed. */\n                    } else {\n                        return DRFLAC_FALSE;\n                    }\n                }\n            } else {\n                /* We started seeking mid-frame which means we need to skip the frame decoding part. */\n                return drflac__seek_forward_by_pcm_frames(pFlac, pcmFramesToDecode) == pcmFramesToDecode;\n            }\n        } else {\n            /*\n            It's not in this frame. We need to seek past the frame, but check if there was a CRC mismatch. If so, we pretend this\n            frame never existed and leave the running sample count untouched.\n            */\n            if (!isMidFrame) {\n                drflac_result result = drflac__seek_to_next_flac_frame(pFlac);\n                if (result == DRFLAC_SUCCESS) {\n                    runningPCMFrameCount += pcmFrameCountInThisFLACFrame;\n                } else {\n                    if (result == DRFLAC_CRC_MISMATCH) {\n                        goto next_iteration;   /* CRC mismatch. Pretend this frame never existed. */\n                    } else {\n                        return DRFLAC_FALSE;\n                    }\n                }\n            } else {\n                /*\n                We started seeking mid-frame which means we need to seek by reading to the end of the frame instead of with\n                drflac__seek_to_next_flac_frame() which only works if the decoder is sitting on the byte just after the frame header.\n                */\n                runningPCMFrameCount += pFlac->currentFLACFrame.pcmFramesRemaining;\n                pFlac->currentFLACFrame.pcmFramesRemaining = 0;\n                isMidFrame = DRFLAC_FALSE;\n            }\n\n            /* If we are seeking to the end of the file and we've just hit it, we're done. */\n            if (pcmFrameIndex == pFlac->totalPCMFrameCount && runningPCMFrameCount == pFlac->totalPCMFrameCount) {\n                return DRFLAC_TRUE;\n            }\n        }\n\n    next_iteration:\n        /* Grab the next frame in preparation for the next iteration. */\n        if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) {\n            return DRFLAC_FALSE;\n        }\n    }\n}\n\n\n#ifndef DR_FLAC_NO_OGG\ntypedef struct\n{\n    drflac_uint8 capturePattern[4];  /* Should be \"OggS\" */\n    drflac_uint8 structureVersion;   /* Always 0. */\n    drflac_uint8 headerType;\n    drflac_uint64 granulePosition;\n    drflac_uint32 serialNumber;\n    drflac_uint32 sequenceNumber;\n    drflac_uint32 checksum;\n    drflac_uint8 segmentCount;\n    drflac_uint8 segmentTable[255];\n} drflac_ogg_page_header;\n#endif\n\ntypedef struct\n{\n    drflac_read_proc onRead;\n    drflac_seek_proc onSeek;\n    drflac_meta_proc onMeta;\n    drflac_container container;\n    void* pUserData;\n    void* pUserDataMD;\n    drflac_uint32 sampleRate;\n    drflac_uint8  channels;\n    drflac_uint8  bitsPerSample;\n    drflac_uint64 totalPCMFrameCount;\n    drflac_uint16 maxBlockSizeInPCMFrames;\n    drflac_uint64 runningFilePos;\n    drflac_bool32 hasStreamInfoBlock;\n    drflac_bool32 hasMetadataBlocks;\n    drflac_bs bs;                           /* <-- A bit streamer is required for loading data during initialization. */\n    drflac_frame_header firstFrameHeader;   /* <-- The header of the first frame that was read during relaxed initalization. Only set if there is no STREAMINFO block. */\n\n#ifndef DR_FLAC_NO_OGG\n    drflac_uint32 oggSerial;\n    drflac_uint64 oggFirstBytePos;\n    drflac_ogg_page_header oggBosHeader;\n#endif\n} drflac_init_info;\n\nstatic DRFLAC_INLINE void drflac__decode_block_header(drflac_uint32 blockHeader, drflac_uint8* isLastBlock, drflac_uint8* blockType, drflac_uint32* blockSize)\n{\n    blockHeader = drflac__be2host_32(blockHeader);\n    *isLastBlock = (drflac_uint8)((blockHeader & 0x80000000UL) >> 31);\n    *blockType   = (drflac_uint8)((blockHeader & 0x7F000000UL) >> 24);\n    *blockSize   =                (blockHeader & 0x00FFFFFFUL);\n}\n\nstatic DRFLAC_INLINE drflac_bool32 drflac__read_and_decode_block_header(drflac_read_proc onRead, void* pUserData, drflac_uint8* isLastBlock, drflac_uint8* blockType, drflac_uint32* blockSize)\n{\n    drflac_uint32 blockHeader;\n\n    *blockSize = 0;\n    if (onRead(pUserData, &blockHeader, 4) != 4) {\n        return DRFLAC_FALSE;\n    }\n\n    drflac__decode_block_header(blockHeader, isLastBlock, blockType, blockSize);\n    return DRFLAC_TRUE;\n}\n\nstatic drflac_bool32 drflac__read_streaminfo(drflac_read_proc onRead, void* pUserData, drflac_streaminfo* pStreamInfo)\n{\n    drflac_uint32 blockSizes;\n    drflac_uint64 frameSizes = 0;\n    drflac_uint64 importantProps;\n    drflac_uint8 md5[16];\n\n    /* min/max block size. */\n    if (onRead(pUserData, &blockSizes, 4) != 4) {\n        return DRFLAC_FALSE;\n    }\n\n    /* min/max frame size. */\n    if (onRead(pUserData, &frameSizes, 6) != 6) {\n        return DRFLAC_FALSE;\n    }\n\n    /* Sample rate, channels, bits per sample and total sample count. */\n    if (onRead(pUserData, &importantProps, 8) != 8) {\n        return DRFLAC_FALSE;\n    }\n\n    /* MD5 */\n    if (onRead(pUserData, md5, sizeof(md5)) != sizeof(md5)) {\n        return DRFLAC_FALSE;\n    }\n\n    blockSizes     = drflac__be2host_32(blockSizes);\n    frameSizes     = drflac__be2host_64(frameSizes);\n    importantProps = drflac__be2host_64(importantProps);\n\n    pStreamInfo->minBlockSizeInPCMFrames = (drflac_uint16)((blockSizes & 0xFFFF0000) >> 16);\n    pStreamInfo->maxBlockSizeInPCMFrames = (drflac_uint16) (blockSizes & 0x0000FFFF);\n    pStreamInfo->minFrameSizeInPCMFrames = (drflac_uint32)((frameSizes     &  (((drflac_uint64)0x00FFFFFF << 16) << 24)) >> 40);\n    pStreamInfo->maxFrameSizeInPCMFrames = (drflac_uint32)((frameSizes     &  (((drflac_uint64)0x00FFFFFF << 16) <<  0)) >> 16);\n    pStreamInfo->sampleRate              = (drflac_uint32)((importantProps &  (((drflac_uint64)0x000FFFFF << 16) << 28)) >> 44);\n    pStreamInfo->channels                = (drflac_uint8 )((importantProps &  (((drflac_uint64)0x0000000E << 16) << 24)) >> 41) + 1;\n    pStreamInfo->bitsPerSample           = (drflac_uint8 )((importantProps &  (((drflac_uint64)0x0000001F << 16) << 20)) >> 36) + 1;\n    pStreamInfo->totalPCMFrameCount      =                ((importantProps & ((((drflac_uint64)0x0000000F << 16) << 16) | 0xFFFFFFFF)));\n    DRFLAC_COPY_MEMORY(pStreamInfo->md5, md5, sizeof(md5));\n\n    return DRFLAC_TRUE;\n}\n\n\nstatic void* drflac__malloc_default(size_t sz, void* pUserData)\n{\n    (void)pUserData;\n    return DRFLAC_MALLOC(sz);\n}\n\nstatic void* drflac__realloc_default(void* p, size_t sz, void* pUserData)\n{\n    (void)pUserData;\n    return DRFLAC_REALLOC(p, sz);\n}\n\nstatic void drflac__free_default(void* p, void* pUserData)\n{\n    (void)pUserData;\n    DRFLAC_FREE(p);\n}\n\n\nstatic void* drflac__malloc_from_callbacks(size_t sz, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pAllocationCallbacks == NULL) {\n        return NULL;\n    }\n\n    if (pAllocationCallbacks->onMalloc != NULL) {\n        return pAllocationCallbacks->onMalloc(sz, pAllocationCallbacks->pUserData);\n    }\n\n    /* Try using realloc(). */\n    if (pAllocationCallbacks->onRealloc != NULL) {\n        return pAllocationCallbacks->onRealloc(NULL, sz, pAllocationCallbacks->pUserData);\n    }\n\n    return NULL;\n}\n\nstatic void* drflac__realloc_from_callbacks(void* p, size_t szNew, size_t szOld, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pAllocationCallbacks == NULL) {\n        return NULL;\n    }\n\n    if (pAllocationCallbacks->onRealloc != NULL) {\n        return pAllocationCallbacks->onRealloc(p, szNew, pAllocationCallbacks->pUserData);\n    }\n\n    /* Try emulating realloc() in terms of malloc()/free(). */\n    if (pAllocationCallbacks->onMalloc != NULL && pAllocationCallbacks->onFree != NULL) {\n        void* p2;\n\n        p2 = pAllocationCallbacks->onMalloc(szNew, pAllocationCallbacks->pUserData);\n        if (p2 == NULL) {\n            return NULL;\n        }\n\n        if (p != NULL) {\n            DRFLAC_COPY_MEMORY(p2, p, szOld);\n            pAllocationCallbacks->onFree(p, pAllocationCallbacks->pUserData);\n        }\n\n        return p2;\n    }\n\n    return NULL;\n}\n\nstatic void drflac__free_from_callbacks(void* p, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    if (p == NULL || pAllocationCallbacks == NULL) {\n        return;\n    }\n\n    if (pAllocationCallbacks->onFree != NULL) {\n        pAllocationCallbacks->onFree(p, pAllocationCallbacks->pUserData);\n    }\n}\n\n\nstatic drflac_bool32 drflac__read_and_decode_metadata(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData, void* pUserDataMD, drflac_uint64* pFirstFramePos, drflac_uint64* pSeektablePos, drflac_uint32* pSeektableSize, drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    /*\n    We want to keep track of the byte position in the stream of the seektable. At the time of calling this function we know that\n    we'll be sitting on byte 42.\n    */\n    drflac_uint64 runningFilePos = 42;\n    drflac_uint64 seektablePos   = 0;\n    drflac_uint32 seektableSize  = 0;\n\n    for (;;) {\n        drflac_metadata metadata;\n        drflac_uint8 isLastBlock = 0;\n        drflac_uint8 blockType;\n        drflac_uint32 blockSize;\n        if (drflac__read_and_decode_block_header(onRead, pUserData, &isLastBlock, &blockType, &blockSize) == DRFLAC_FALSE) {\n            return DRFLAC_FALSE;\n        }\n        runningFilePos += 4;\n\n        metadata.type = blockType;\n        metadata.pRawData = NULL;\n        metadata.rawDataSize = 0;\n\n        switch (blockType)\n        {\n            case DRFLAC_METADATA_BLOCK_TYPE_APPLICATION:\n            {\n                if (blockSize < 4) {\n                    return DRFLAC_FALSE;\n                }\n\n                if (onMeta) {\n                    void* pRawData = drflac__malloc_from_callbacks(blockSize, pAllocationCallbacks);\n                    if (pRawData == NULL) {\n                        return DRFLAC_FALSE;\n                    }\n\n                    if (onRead(pUserData, pRawData, blockSize) != blockSize) {\n                        drflac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                        return DRFLAC_FALSE;\n                    }\n\n                    metadata.pRawData = pRawData;\n                    metadata.rawDataSize = blockSize;\n                    metadata.data.application.id       = drflac__be2host_32(*(drflac_uint32*)pRawData);\n                    metadata.data.application.pData    = (const void*)((drflac_uint8*)pRawData + sizeof(drflac_uint32));\n                    metadata.data.application.dataSize = blockSize - sizeof(drflac_uint32);\n                    onMeta(pUserDataMD, &metadata);\n\n                    drflac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                }\n            } break;\n\n            case DRFLAC_METADATA_BLOCK_TYPE_SEEKTABLE:\n            {\n                seektablePos  = runningFilePos;\n                seektableSize = blockSize;\n\n                if (onMeta) {\n                    drflac_uint32 iSeekpoint;\n                    void* pRawData;\n\n                    pRawData = drflac__malloc_from_callbacks(blockSize, pAllocationCallbacks);\n                    if (pRawData == NULL) {\n                        return DRFLAC_FALSE;\n                    }\n\n                    if (onRead(pUserData, pRawData, blockSize) != blockSize) {\n                        drflac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                        return DRFLAC_FALSE;\n                    }\n\n                    metadata.pRawData = pRawData;\n                    metadata.rawDataSize = blockSize;\n                    metadata.data.seektable.seekpointCount = blockSize/sizeof(drflac_seekpoint);\n                    metadata.data.seektable.pSeekpoints = (const drflac_seekpoint*)pRawData;\n\n                    /* Endian swap. */\n                    for (iSeekpoint = 0; iSeekpoint < metadata.data.seektable.seekpointCount; ++iSeekpoint) {\n                        drflac_seekpoint* pSeekpoint = (drflac_seekpoint*)pRawData + iSeekpoint;\n                        pSeekpoint->firstPCMFrame   = drflac__be2host_64(pSeekpoint->firstPCMFrame);\n                        pSeekpoint->flacFrameOffset = drflac__be2host_64(pSeekpoint->flacFrameOffset);\n                        pSeekpoint->pcmFrameCount   = drflac__be2host_16(pSeekpoint->pcmFrameCount);\n                    }\n\n                    onMeta(pUserDataMD, &metadata);\n\n                    drflac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                }\n            } break;\n\n            case DRFLAC_METADATA_BLOCK_TYPE_VORBIS_COMMENT:\n            {\n                if (blockSize < 8) {\n                    return DRFLAC_FALSE;\n                }\n\n                if (onMeta) {\n                    void* pRawData;\n                    const char* pRunningData;\n                    const char* pRunningDataEnd;\n                    drflac_uint32 i;\n\n                    pRawData = drflac__malloc_from_callbacks(blockSize, pAllocationCallbacks);\n                    if (pRawData == NULL) {\n                        return DRFLAC_FALSE;\n                    }\n\n                    if (onRead(pUserData, pRawData, blockSize) != blockSize) {\n                        drflac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                        return DRFLAC_FALSE;\n                    }\n\n                    metadata.pRawData = pRawData;\n                    metadata.rawDataSize = blockSize;\n\n                    pRunningData    = (const char*)pRawData;\n                    pRunningDataEnd = (const char*)pRawData + blockSize;\n\n                    metadata.data.vorbis_comment.vendorLength = drflac__le2host_32_ptr_unaligned(pRunningData); pRunningData += 4;\n\n                    /* Need space for the rest of the block */\n                    if ((pRunningDataEnd - pRunningData) - 4 < (drflac_int64)metadata.data.vorbis_comment.vendorLength) { /* <-- Note the order of operations to avoid overflow to a valid value */\n                        drflac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                        return DRFLAC_FALSE;\n                    }\n                    metadata.data.vorbis_comment.vendor       = pRunningData;                                            pRunningData += metadata.data.vorbis_comment.vendorLength;\n                    metadata.data.vorbis_comment.commentCount = drflac__le2host_32_ptr_unaligned(pRunningData); pRunningData += 4;\n\n                    /* Need space for 'commentCount' comments after the block, which at minimum is a drflac_uint32 per comment */\n                    if ((pRunningDataEnd - pRunningData) / sizeof(drflac_uint32) < metadata.data.vorbis_comment.commentCount) { /* <-- Note the order of operations to avoid overflow to a valid value */\n                        drflac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                        return DRFLAC_FALSE;\n                    }\n                    metadata.data.vorbis_comment.pComments    = pRunningData;\n\n                    /* Check that the comments section is valid before passing it to the callback */\n                    for (i = 0; i < metadata.data.vorbis_comment.commentCount; ++i) {\n                        drflac_uint32 commentLength;\n\n                        if (pRunningDataEnd - pRunningData < 4) {\n                            drflac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                            return DRFLAC_FALSE;\n                        }\n\n                        commentLength = drflac__le2host_32_ptr_unaligned(pRunningData); pRunningData += 4;\n                        if (pRunningDataEnd - pRunningData < (drflac_int64)commentLength) { /* <-- Note the order of operations to avoid overflow to a valid value */\n                            drflac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                            return DRFLAC_FALSE;\n                        }\n                        pRunningData += commentLength;\n                    }\n\n                    onMeta(pUserDataMD, &metadata);\n\n                    drflac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                }\n            } break;\n\n            case DRFLAC_METADATA_BLOCK_TYPE_CUESHEET:\n            {\n                if (blockSize < 396) {\n                    return DRFLAC_FALSE;\n                }\n\n                if (onMeta) {\n                    void* pRawData;\n                    const char* pRunningData;\n                    const char* pRunningDataEnd;\n                    drflac_uint8 iTrack;\n                    drflac_uint8 iIndex;\n\n                    pRawData = drflac__malloc_from_callbacks(blockSize, pAllocationCallbacks);\n                    if (pRawData == NULL) {\n                        return DRFLAC_FALSE;\n                    }\n\n                    if (onRead(pUserData, pRawData, blockSize) != blockSize) {\n                        drflac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                        return DRFLAC_FALSE;\n                    }\n\n                    metadata.pRawData = pRawData;\n                    metadata.rawDataSize = blockSize;\n\n                    pRunningData    = (const char*)pRawData;\n                    pRunningDataEnd = (const char*)pRawData + blockSize;\n\n                    DRFLAC_COPY_MEMORY(metadata.data.cuesheet.catalog, pRunningData, 128);                              pRunningData += 128;\n                    metadata.data.cuesheet.leadInSampleCount = drflac__be2host_64(*(const drflac_uint64*)pRunningData); pRunningData += 8;\n                    metadata.data.cuesheet.isCD              = (pRunningData[0] & 0x80) != 0;                           pRunningData += 259;\n                    metadata.data.cuesheet.trackCount        = pRunningData[0];                                         pRunningData += 1;\n                    metadata.data.cuesheet.pTrackData        = pRunningData;\n\n                    /* Check that the cuesheet tracks are valid before passing it to the callback */\n                    for (iTrack = 0; iTrack < metadata.data.cuesheet.trackCount; ++iTrack) {\n                        drflac_uint8 indexCount;\n                        drflac_uint32 indexPointSize;\n\n                        if (pRunningDataEnd - pRunningData < 36) {\n                            drflac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                            return DRFLAC_FALSE;\n                        }\n\n                        /* Skip to the index point count */\n                        pRunningData += 35;\n                        indexCount = pRunningData[0]; pRunningData += 1;\n                        indexPointSize = indexCount * sizeof(drflac_cuesheet_track_index);\n                        if (pRunningDataEnd - pRunningData < (drflac_int64)indexPointSize) {\n                            drflac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                            return DRFLAC_FALSE;\n                        }\n\n                        /* Endian swap. */\n                        for (iIndex = 0; iIndex < indexCount; ++iIndex) {\n                            drflac_cuesheet_track_index* pTrack = (drflac_cuesheet_track_index*)pRunningData;\n                            pRunningData += sizeof(drflac_cuesheet_track_index);\n                            pTrack->offset = drflac__be2host_64(pTrack->offset);\n                        }\n                    }\n\n                    onMeta(pUserDataMD, &metadata);\n\n                    drflac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                }\n            } break;\n\n            case DRFLAC_METADATA_BLOCK_TYPE_PICTURE:\n            {\n                if (blockSize < 32) {\n                    return DRFLAC_FALSE;\n                }\n\n                if (onMeta) {\n                    void* pRawData;\n                    const char* pRunningData;\n                    const char* pRunningDataEnd;\n\n                    pRawData = drflac__malloc_from_callbacks(blockSize, pAllocationCallbacks);\n                    if (pRawData == NULL) {\n                        return DRFLAC_FALSE;\n                    }\n\n                    if (onRead(pUserData, pRawData, blockSize) != blockSize) {\n                        drflac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                        return DRFLAC_FALSE;\n                    }\n\n                    metadata.pRawData = pRawData;\n                    metadata.rawDataSize = blockSize;\n\n                    pRunningData    = (const char*)pRawData;\n                    pRunningDataEnd = (const char*)pRawData + blockSize;\n\n                    metadata.data.picture.type       = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4;\n                    metadata.data.picture.mimeLength = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4;\n\n                    /* Need space for the rest of the block */\n                    if ((pRunningDataEnd - pRunningData) - 24 < (drflac_int64)metadata.data.picture.mimeLength) { /* <-- Note the order of operations to avoid overflow to a valid value */\n                        drflac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                        return DRFLAC_FALSE;\n                    }\n                    metadata.data.picture.mime              = pRunningData;                                            pRunningData += metadata.data.picture.mimeLength;\n                    metadata.data.picture.descriptionLength = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4;\n\n                    /* Need space for the rest of the block */\n                    if ((pRunningDataEnd - pRunningData) - 20 < (drflac_int64)metadata.data.picture.descriptionLength) { /* <-- Note the order of operations to avoid overflow to a valid value */\n                        drflac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                        return DRFLAC_FALSE;\n                    }\n                    metadata.data.picture.description     = pRunningData;                                            pRunningData += metadata.data.picture.descriptionLength;\n                    metadata.data.picture.width           = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4;\n                    metadata.data.picture.height          = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4;\n                    metadata.data.picture.colorDepth      = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4;\n                    metadata.data.picture.indexColorCount = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4;\n                    metadata.data.picture.pictureDataSize = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4;\n                    metadata.data.picture.pPictureData    = (const drflac_uint8*)pRunningData;\n\n                    /* Need space for the picture after the block */\n                    if (pRunningDataEnd - pRunningData < (drflac_int64)metadata.data.picture.pictureDataSize) { /* <-- Note the order of operations to avoid overflow to a valid value */\n                        drflac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                        return DRFLAC_FALSE;\n                    }\n\n                    onMeta(pUserDataMD, &metadata);\n\n                    drflac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                }\n            } break;\n\n            case DRFLAC_METADATA_BLOCK_TYPE_PADDING:\n            {\n                if (onMeta) {\n                    metadata.data.padding.unused = 0;\n\n                    /* Padding doesn't have anything meaningful in it, so just skip over it, but make sure the caller is aware of it by firing the callback. */\n                    if (!onSeek(pUserData, blockSize, drflac_seek_origin_current)) {\n                        isLastBlock = DRFLAC_TRUE;  /* An error occurred while seeking. Attempt to recover by treating this as the last block which will in turn terminate the loop. */\n                    } else {\n                        onMeta(pUserDataMD, &metadata);\n                    }\n                }\n            } break;\n\n            case DRFLAC_METADATA_BLOCK_TYPE_INVALID:\n            {\n                /* Invalid chunk. Just skip over this one. */\n                if (onMeta) {\n                    if (!onSeek(pUserData, blockSize, drflac_seek_origin_current)) {\n                        isLastBlock = DRFLAC_TRUE;  /* An error occurred while seeking. Attempt to recover by treating this as the last block which will in turn terminate the loop. */\n                    }\n                }\n            } break;\n\n            default:\n            {\n                /*\n                It's an unknown chunk, but not necessarily invalid. There's a chance more metadata blocks might be defined later on, so we\n                can at the very least report the chunk to the application and let it look at the raw data.\n                */\n                if (onMeta) {\n                    void* pRawData = drflac__malloc_from_callbacks(blockSize, pAllocationCallbacks);\n                    if (pRawData == NULL) {\n                        return DRFLAC_FALSE;\n                    }\n\n                    if (onRead(pUserData, pRawData, blockSize) != blockSize) {\n                        drflac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                        return DRFLAC_FALSE;\n                    }\n\n                    metadata.pRawData = pRawData;\n                    metadata.rawDataSize = blockSize;\n                    onMeta(pUserDataMD, &metadata);\n\n                    drflac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                }\n            } break;\n        }\n\n        /* If we're not handling metadata, just skip over the block. If we are, it will have been handled earlier in the switch statement above. */\n        if (onMeta == NULL && blockSize > 0) {\n            if (!onSeek(pUserData, blockSize, drflac_seek_origin_current)) {\n                isLastBlock = DRFLAC_TRUE;\n            }\n        }\n\n        runningFilePos += blockSize;\n        if (isLastBlock) {\n            break;\n        }\n    }\n\n    *pSeektablePos = seektablePos;\n    *pSeektableSize = seektableSize;\n    *pFirstFramePos = runningFilePos;\n\n    return DRFLAC_TRUE;\n}\n\nstatic drflac_bool32 drflac__init_private__native(drflac_init_info* pInit, drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData, void* pUserDataMD, drflac_bool32 relaxed)\n{\n    /* Pre Condition: The bit stream should be sitting just past the 4-byte id header. */\n\n    drflac_uint8 isLastBlock;\n    drflac_uint8 blockType;\n    drflac_uint32 blockSize;\n\n    (void)onSeek;\n\n    pInit->container = drflac_container_native;\n\n    /* The first metadata block should be the STREAMINFO block. */\n    if (!drflac__read_and_decode_block_header(onRead, pUserData, &isLastBlock, &blockType, &blockSize)) {\n        return DRFLAC_FALSE;\n    }\n\n    if (blockType != DRFLAC_METADATA_BLOCK_TYPE_STREAMINFO || blockSize != 34) {\n        if (!relaxed) {\n            /* We're opening in strict mode and the first block is not the STREAMINFO block. Error. */\n            return DRFLAC_FALSE;\n        } else {\n            /*\n            Relaxed mode. To open from here we need to just find the first frame and set the sample rate, etc. to whatever is defined\n            for that frame.\n            */\n            pInit->hasStreamInfoBlock = DRFLAC_FALSE;\n            pInit->hasMetadataBlocks  = DRFLAC_FALSE;\n\n            if (!drflac__read_next_flac_frame_header(&pInit->bs, 0, &pInit->firstFrameHeader)) {\n                return DRFLAC_FALSE;    /* Couldn't find a frame. */\n            }\n\n            if (pInit->firstFrameHeader.bitsPerSample == 0) {\n                return DRFLAC_FALSE;    /* Failed to initialize because the first frame depends on the STREAMINFO block, which does not exist. */\n            }\n\n            pInit->sampleRate              = pInit->firstFrameHeader.sampleRate;\n            pInit->channels                = drflac__get_channel_count_from_channel_assignment(pInit->firstFrameHeader.channelAssignment);\n            pInit->bitsPerSample           = pInit->firstFrameHeader.bitsPerSample;\n            pInit->maxBlockSizeInPCMFrames = 65535;   /* <-- See notes here: https://xiph.org/flac/format.html#metadata_block_streaminfo */\n            return DRFLAC_TRUE;\n        }\n    } else {\n        drflac_streaminfo streaminfo;\n        if (!drflac__read_streaminfo(onRead, pUserData, &streaminfo)) {\n            return DRFLAC_FALSE;\n        }\n\n        pInit->hasStreamInfoBlock      = DRFLAC_TRUE;\n        pInit->sampleRate              = streaminfo.sampleRate;\n        pInit->channels                = streaminfo.channels;\n        pInit->bitsPerSample           = streaminfo.bitsPerSample;\n        pInit->totalPCMFrameCount      = streaminfo.totalPCMFrameCount;\n        pInit->maxBlockSizeInPCMFrames = streaminfo.maxBlockSizeInPCMFrames;    /* Don't care about the min block size - only the max (used for determining the size of the memory allocation). */\n        pInit->hasMetadataBlocks       = !isLastBlock;\n\n        if (onMeta) {\n            drflac_metadata metadata;\n            metadata.type = DRFLAC_METADATA_BLOCK_TYPE_STREAMINFO;\n            metadata.pRawData = NULL;\n            metadata.rawDataSize = 0;\n            metadata.data.streaminfo = streaminfo;\n            onMeta(pUserDataMD, &metadata);\n        }\n\n        return DRFLAC_TRUE;\n    }\n}\n\n#ifndef DR_FLAC_NO_OGG\n#define DRFLAC_OGG_MAX_PAGE_SIZE            65307\n#define DRFLAC_OGG_CAPTURE_PATTERN_CRC32    1605413199  /* CRC-32 of \"OggS\". */\n\ntypedef enum\n{\n    drflac_ogg_recover_on_crc_mismatch,\n    drflac_ogg_fail_on_crc_mismatch\n} drflac_ogg_crc_mismatch_recovery;\n\n#ifndef DR_FLAC_NO_CRC\nstatic drflac_uint32 drflac__crc32_table[] = {\n    0x00000000L, 0x04C11DB7L, 0x09823B6EL, 0x0D4326D9L,\n    0x130476DCL, 0x17C56B6BL, 0x1A864DB2L, 0x1E475005L,\n    0x2608EDB8L, 0x22C9F00FL, 0x2F8AD6D6L, 0x2B4BCB61L,\n    0x350C9B64L, 0x31CD86D3L, 0x3C8EA00AL, 0x384FBDBDL,\n    0x4C11DB70L, 0x48D0C6C7L, 0x4593E01EL, 0x4152FDA9L,\n    0x5F15ADACL, 0x5BD4B01BL, 0x569796C2L, 0x52568B75L,\n    0x6A1936C8L, 0x6ED82B7FL, 0x639B0DA6L, 0x675A1011L,\n    0x791D4014L, 0x7DDC5DA3L, 0x709F7B7AL, 0x745E66CDL,\n    0x9823B6E0L, 0x9CE2AB57L, 0x91A18D8EL, 0x95609039L,\n    0x8B27C03CL, 0x8FE6DD8BL, 0x82A5FB52L, 0x8664E6E5L,\n    0xBE2B5B58L, 0xBAEA46EFL, 0xB7A96036L, 0xB3687D81L,\n    0xAD2F2D84L, 0xA9EE3033L, 0xA4AD16EAL, 0xA06C0B5DL,\n    0xD4326D90L, 0xD0F37027L, 0xDDB056FEL, 0xD9714B49L,\n    0xC7361B4CL, 0xC3F706FBL, 0xCEB42022L, 0xCA753D95L,\n    0xF23A8028L, 0xF6FB9D9FL, 0xFBB8BB46L, 0xFF79A6F1L,\n    0xE13EF6F4L, 0xE5FFEB43L, 0xE8BCCD9AL, 0xEC7DD02DL,\n    0x34867077L, 0x30476DC0L, 0x3D044B19L, 0x39C556AEL,\n    0x278206ABL, 0x23431B1CL, 0x2E003DC5L, 0x2AC12072L,\n    0x128E9DCFL, 0x164F8078L, 0x1B0CA6A1L, 0x1FCDBB16L,\n    0x018AEB13L, 0x054BF6A4L, 0x0808D07DL, 0x0CC9CDCAL,\n    0x7897AB07L, 0x7C56B6B0L, 0x71159069L, 0x75D48DDEL,\n    0x6B93DDDBL, 0x6F52C06CL, 0x6211E6B5L, 0x66D0FB02L,\n    0x5E9F46BFL, 0x5A5E5B08L, 0x571D7DD1L, 0x53DC6066L,\n    0x4D9B3063L, 0x495A2DD4L, 0x44190B0DL, 0x40D816BAL,\n    0xACA5C697L, 0xA864DB20L, 0xA527FDF9L, 0xA1E6E04EL,\n    0xBFA1B04BL, 0xBB60ADFCL, 0xB6238B25L, 0xB2E29692L,\n    0x8AAD2B2FL, 0x8E6C3698L, 0x832F1041L, 0x87EE0DF6L,\n    0x99A95DF3L, 0x9D684044L, 0x902B669DL, 0x94EA7B2AL,\n    0xE0B41DE7L, 0xE4750050L, 0xE9362689L, 0xEDF73B3EL,\n    0xF3B06B3BL, 0xF771768CL, 0xFA325055L, 0xFEF34DE2L,\n    0xC6BCF05FL, 0xC27DEDE8L, 0xCF3ECB31L, 0xCBFFD686L,\n    0xD5B88683L, 0xD1799B34L, 0xDC3ABDEDL, 0xD8FBA05AL,\n    0x690CE0EEL, 0x6DCDFD59L, 0x608EDB80L, 0x644FC637L,\n    0x7A089632L, 0x7EC98B85L, 0x738AAD5CL, 0x774BB0EBL,\n    0x4F040D56L, 0x4BC510E1L, 0x46863638L, 0x42472B8FL,\n    0x5C007B8AL, 0x58C1663DL, 0x558240E4L, 0x51435D53L,\n    0x251D3B9EL, 0x21DC2629L, 0x2C9F00F0L, 0x285E1D47L,\n    0x36194D42L, 0x32D850F5L, 0x3F9B762CL, 0x3B5A6B9BL,\n    0x0315D626L, 0x07D4CB91L, 0x0A97ED48L, 0x0E56F0FFL,\n    0x1011A0FAL, 0x14D0BD4DL, 0x19939B94L, 0x1D528623L,\n    0xF12F560EL, 0xF5EE4BB9L, 0xF8AD6D60L, 0xFC6C70D7L,\n    0xE22B20D2L, 0xE6EA3D65L, 0xEBA91BBCL, 0xEF68060BL,\n    0xD727BBB6L, 0xD3E6A601L, 0xDEA580D8L, 0xDA649D6FL,\n    0xC423CD6AL, 0xC0E2D0DDL, 0xCDA1F604L, 0xC960EBB3L,\n    0xBD3E8D7EL, 0xB9FF90C9L, 0xB4BCB610L, 0xB07DABA7L,\n    0xAE3AFBA2L, 0xAAFBE615L, 0xA7B8C0CCL, 0xA379DD7BL,\n    0x9B3660C6L, 0x9FF77D71L, 0x92B45BA8L, 0x9675461FL,\n    0x8832161AL, 0x8CF30BADL, 0x81B02D74L, 0x857130C3L,\n    0x5D8A9099L, 0x594B8D2EL, 0x5408ABF7L, 0x50C9B640L,\n    0x4E8EE645L, 0x4A4FFBF2L, 0x470CDD2BL, 0x43CDC09CL,\n    0x7B827D21L, 0x7F436096L, 0x7200464FL, 0x76C15BF8L,\n    0x68860BFDL, 0x6C47164AL, 0x61043093L, 0x65C52D24L,\n    0x119B4BE9L, 0x155A565EL, 0x18197087L, 0x1CD86D30L,\n    0x029F3D35L, 0x065E2082L, 0x0B1D065BL, 0x0FDC1BECL,\n    0x3793A651L, 0x3352BBE6L, 0x3E119D3FL, 0x3AD08088L,\n    0x2497D08DL, 0x2056CD3AL, 0x2D15EBE3L, 0x29D4F654L,\n    0xC5A92679L, 0xC1683BCEL, 0xCC2B1D17L, 0xC8EA00A0L,\n    0xD6AD50A5L, 0xD26C4D12L, 0xDF2F6BCBL, 0xDBEE767CL,\n    0xE3A1CBC1L, 0xE760D676L, 0xEA23F0AFL, 0xEEE2ED18L,\n    0xF0A5BD1DL, 0xF464A0AAL, 0xF9278673L, 0xFDE69BC4L,\n    0x89B8FD09L, 0x8D79E0BEL, 0x803AC667L, 0x84FBDBD0L,\n    0x9ABC8BD5L, 0x9E7D9662L, 0x933EB0BBL, 0x97FFAD0CL,\n    0xAFB010B1L, 0xAB710D06L, 0xA6322BDFL, 0xA2F33668L,\n    0xBCB4666DL, 0xB8757BDAL, 0xB5365D03L, 0xB1F740B4L\n};\n#endif\n\nstatic DRFLAC_INLINE drflac_uint32 drflac_crc32_byte(drflac_uint32 crc32, drflac_uint8 data)\n{\n#ifndef DR_FLAC_NO_CRC\n    return (crc32 << 8) ^ drflac__crc32_table[(drflac_uint8)((crc32 >> 24) & 0xFF) ^ data];\n#else\n    (void)data;\n    return crc32;\n#endif\n}\n\n#if 0\nstatic DRFLAC_INLINE drflac_uint32 drflac_crc32_uint32(drflac_uint32 crc32, drflac_uint32 data)\n{\n    crc32 = drflac_crc32_byte(crc32, (drflac_uint8)((data >> 24) & 0xFF));\n    crc32 = drflac_crc32_byte(crc32, (drflac_uint8)((data >> 16) & 0xFF));\n    crc32 = drflac_crc32_byte(crc32, (drflac_uint8)((data >>  8) & 0xFF));\n    crc32 = drflac_crc32_byte(crc32, (drflac_uint8)((data >>  0) & 0xFF));\n    return crc32;\n}\n\nstatic DRFLAC_INLINE drflac_uint32 drflac_crc32_uint64(drflac_uint32 crc32, drflac_uint64 data)\n{\n    crc32 = drflac_crc32_uint32(crc32, (drflac_uint32)((data >> 32) & 0xFFFFFFFF));\n    crc32 = drflac_crc32_uint32(crc32, (drflac_uint32)((data >>  0) & 0xFFFFFFFF));\n    return crc32;\n}\n#endif\n\nstatic DRFLAC_INLINE drflac_uint32 drflac_crc32_buffer(drflac_uint32 crc32, drflac_uint8* pData, drflac_uint32 dataSize)\n{\n    /* This can be optimized. */\n    drflac_uint32 i;\n    for (i = 0; i < dataSize; ++i) {\n        crc32 = drflac_crc32_byte(crc32, pData[i]);\n    }\n    return crc32;\n}\n\n\nstatic DRFLAC_INLINE drflac_bool32 drflac_ogg__is_capture_pattern(drflac_uint8 pattern[4])\n{\n    return pattern[0] == 'O' && pattern[1] == 'g' && pattern[2] == 'g' && pattern[3] == 'S';\n}\n\nstatic DRFLAC_INLINE drflac_uint32 drflac_ogg__get_page_header_size(drflac_ogg_page_header* pHeader)\n{\n    return 27 + pHeader->segmentCount;\n}\n\nstatic DRFLAC_INLINE drflac_uint32 drflac_ogg__get_page_body_size(drflac_ogg_page_header* pHeader)\n{\n    drflac_uint32 pageBodySize = 0;\n    int i;\n\n    for (i = 0; i < pHeader->segmentCount; ++i) {\n        pageBodySize += pHeader->segmentTable[i];\n    }\n\n    return pageBodySize;\n}\n\nstatic drflac_result drflac_ogg__read_page_header_after_capture_pattern(drflac_read_proc onRead, void* pUserData, drflac_ogg_page_header* pHeader, drflac_uint32* pBytesRead, drflac_uint32* pCRC32)\n{\n    drflac_uint8 data[23];\n    drflac_uint32 i;\n\n    DRFLAC_ASSERT(*pCRC32 == DRFLAC_OGG_CAPTURE_PATTERN_CRC32);\n\n    if (onRead(pUserData, data, 23) != 23) {\n        return DRFLAC_AT_END;\n    }\n    *pBytesRead += 23;\n\n    /*\n    It's not actually used, but set the capture pattern to 'OggS' for completeness. Not doing this will cause static analysers to complain about\n    us trying to access uninitialized data. We could alternatively just comment out this member of the drflac_ogg_page_header structure, but I\n    like to have it map to the structure of the underlying data.\n    */\n    pHeader->capturePattern[0] = 'O';\n    pHeader->capturePattern[1] = 'g';\n    pHeader->capturePattern[2] = 'g';\n    pHeader->capturePattern[3] = 'S';\n\n    pHeader->structureVersion = data[0];\n    pHeader->headerType       = data[1];\n    DRFLAC_COPY_MEMORY(&pHeader->granulePosition, &data[ 2], 8);\n    DRFLAC_COPY_MEMORY(&pHeader->serialNumber,    &data[10], 4);\n    DRFLAC_COPY_MEMORY(&pHeader->sequenceNumber,  &data[14], 4);\n    DRFLAC_COPY_MEMORY(&pHeader->checksum,        &data[18], 4);\n    pHeader->segmentCount     = data[22];\n\n    /* Calculate the CRC. Note that for the calculation the checksum part of the page needs to be set to 0. */\n    data[18] = 0;\n    data[19] = 0;\n    data[20] = 0;\n    data[21] = 0;\n\n    for (i = 0; i < 23; ++i) {\n        *pCRC32 = drflac_crc32_byte(*pCRC32, data[i]);\n    }\n\n\n    if (onRead(pUserData, pHeader->segmentTable, pHeader->segmentCount) != pHeader->segmentCount) {\n        return DRFLAC_AT_END;\n    }\n    *pBytesRead += pHeader->segmentCount;\n\n    for (i = 0; i < pHeader->segmentCount; ++i) {\n        *pCRC32 = drflac_crc32_byte(*pCRC32, pHeader->segmentTable[i]);\n    }\n\n    return DRFLAC_SUCCESS;\n}\n\nstatic drflac_result drflac_ogg__read_page_header(drflac_read_proc onRead, void* pUserData, drflac_ogg_page_header* pHeader, drflac_uint32* pBytesRead, drflac_uint32* pCRC32)\n{\n    drflac_uint8 id[4];\n\n    *pBytesRead = 0;\n\n    if (onRead(pUserData, id, 4) != 4) {\n        return DRFLAC_AT_END;\n    }\n    *pBytesRead += 4;\n\n    /* We need to read byte-by-byte until we find the OggS capture pattern. */\n    for (;;) {\n        if (drflac_ogg__is_capture_pattern(id)) {\n            drflac_result result;\n\n            *pCRC32 = DRFLAC_OGG_CAPTURE_PATTERN_CRC32;\n\n            result = drflac_ogg__read_page_header_after_capture_pattern(onRead, pUserData, pHeader, pBytesRead, pCRC32);\n            if (result == DRFLAC_SUCCESS) {\n                return DRFLAC_SUCCESS;\n            } else {\n                if (result == DRFLAC_CRC_MISMATCH) {\n                    continue;\n                } else {\n                    return result;\n                }\n            }\n        } else {\n            /* The first 4 bytes did not equal the capture pattern. Read the next byte and try again. */\n            id[0] = id[1];\n            id[1] = id[2];\n            id[2] = id[3];\n            if (onRead(pUserData, &id[3], 1) != 1) {\n                return DRFLAC_AT_END;\n            }\n            *pBytesRead += 1;\n        }\n    }\n}\n\n\n/*\nThe main part of the Ogg encapsulation is the conversion from the physical Ogg bitstream to the native FLAC bitstream. It works\nin three general stages: Ogg Physical Bitstream -> Ogg/FLAC Logical Bitstream -> FLAC Native Bitstream. dr_flac is designed\nin such a way that the core sections assume everything is delivered in native format. Therefore, for each encapsulation type\ndr_flac is supporting there needs to be a layer sitting on top of the onRead and onSeek callbacks that ensures the bits read from\nthe physical Ogg bitstream are converted and delivered in native FLAC format.\n*/\ntypedef struct\n{\n    drflac_read_proc onRead;                /* The original onRead callback from drflac_open() and family. */\n    drflac_seek_proc onSeek;                /* The original onSeek callback from drflac_open() and family. */\n    void* pUserData;                        /* The user data passed on onRead and onSeek. This is the user data that was passed on drflac_open() and family. */\n    drflac_uint64 currentBytePos;           /* The position of the byte we are sitting on in the physical byte stream. Used for efficient seeking. */\n    drflac_uint64 firstBytePos;             /* The position of the first byte in the physical bitstream. Points to the start of the \"OggS\" identifier of the FLAC bos page. */\n    drflac_uint32 serialNumber;             /* The serial number of the FLAC audio pages. This is determined by the initial header page that was read during initialization. */\n    drflac_ogg_page_header bosPageHeader;   /* Used for seeking. */\n    drflac_ogg_page_header currentPageHeader;\n    drflac_uint32 bytesRemainingInPage;\n    drflac_uint32 pageDataSize;\n    drflac_uint8 pageData[DRFLAC_OGG_MAX_PAGE_SIZE];\n} drflac_oggbs; /* oggbs = Ogg Bitstream */\n\nstatic size_t drflac_oggbs__read_physical(drflac_oggbs* oggbs, void* bufferOut, size_t bytesToRead)\n{\n    size_t bytesActuallyRead = oggbs->onRead(oggbs->pUserData, bufferOut, bytesToRead);\n    oggbs->currentBytePos += bytesActuallyRead;\n\n    return bytesActuallyRead;\n}\n\nstatic drflac_bool32 drflac_oggbs__seek_physical(drflac_oggbs* oggbs, drflac_uint64 offset, drflac_seek_origin origin)\n{\n    if (origin == drflac_seek_origin_start) {\n        if (offset <= 0x7FFFFFFF) {\n            if (!oggbs->onSeek(oggbs->pUserData, (int)offset, drflac_seek_origin_start)) {\n                return DRFLAC_FALSE;\n            }\n            oggbs->currentBytePos = offset;\n\n            return DRFLAC_TRUE;\n        } else {\n            if (!oggbs->onSeek(oggbs->pUserData, 0x7FFFFFFF, drflac_seek_origin_start)) {\n                return DRFLAC_FALSE;\n            }\n            oggbs->currentBytePos = offset;\n\n            return drflac_oggbs__seek_physical(oggbs, offset - 0x7FFFFFFF, drflac_seek_origin_current);\n        }\n    } else {\n        while (offset > 0x7FFFFFFF) {\n            if (!oggbs->onSeek(oggbs->pUserData, 0x7FFFFFFF, drflac_seek_origin_current)) {\n                return DRFLAC_FALSE;\n            }\n            oggbs->currentBytePos += 0x7FFFFFFF;\n            offset -= 0x7FFFFFFF;\n        }\n\n        if (!oggbs->onSeek(oggbs->pUserData, (int)offset, drflac_seek_origin_current)) {    /* <-- Safe cast thanks to the loop above. */\n            return DRFLAC_FALSE;\n        }\n        oggbs->currentBytePos += offset;\n\n        return DRFLAC_TRUE;\n    }\n}\n\nstatic drflac_bool32 drflac_oggbs__goto_next_page(drflac_oggbs* oggbs, drflac_ogg_crc_mismatch_recovery recoveryMethod)\n{\n    drflac_ogg_page_header header;\n    for (;;) {\n        drflac_uint32 crc32 = 0;\n        drflac_uint32 bytesRead;\n        drflac_uint32 pageBodySize;\n#ifndef DR_FLAC_NO_CRC\n        drflac_uint32 actualCRC32;\n#endif\n\n        if (drflac_ogg__read_page_header(oggbs->onRead, oggbs->pUserData, &header, &bytesRead, &crc32) != DRFLAC_SUCCESS) {\n            return DRFLAC_FALSE;\n        }\n        oggbs->currentBytePos += bytesRead;\n\n        pageBodySize = drflac_ogg__get_page_body_size(&header);\n        if (pageBodySize > DRFLAC_OGG_MAX_PAGE_SIZE) {\n            continue;   /* Invalid page size. Assume it's corrupted and just move to the next page. */\n        }\n\n        if (header.serialNumber != oggbs->serialNumber) {\n            /* It's not a FLAC page. Skip it. */\n            if (pageBodySize > 0 && !drflac_oggbs__seek_physical(oggbs, pageBodySize, drflac_seek_origin_current)) {\n                return DRFLAC_FALSE;\n            }\n            continue;\n        }\n\n\n        /* We need to read the entire page and then do a CRC check on it. If there's a CRC mismatch we need to skip this page. */\n        if (drflac_oggbs__read_physical(oggbs, oggbs->pageData, pageBodySize) != pageBodySize) {\n            return DRFLAC_FALSE;\n        }\n        oggbs->pageDataSize = pageBodySize;\n\n#ifndef DR_FLAC_NO_CRC\n        actualCRC32 = drflac_crc32_buffer(crc32, oggbs->pageData, oggbs->pageDataSize);\n        if (actualCRC32 != header.checksum) {\n            if (recoveryMethod == drflac_ogg_recover_on_crc_mismatch) {\n                continue;   /* CRC mismatch. Skip this page. */\n            } else {\n                /*\n                Even though we are failing on a CRC mismatch, we still want our stream to be in a good state. Therefore we\n                go to the next valid page to ensure we're in a good state, but return false to let the caller know that the\n                seek did not fully complete.\n                */\n                drflac_oggbs__goto_next_page(oggbs, drflac_ogg_recover_on_crc_mismatch);\n                return DRFLAC_FALSE;\n            }\n        }\n#else\n        (void)recoveryMethod;   /* <-- Silence a warning. */\n#endif\n\n        oggbs->currentPageHeader = header;\n        oggbs->bytesRemainingInPage = pageBodySize;\n        return DRFLAC_TRUE;\n    }\n}\n\n/* Function below is unused at the moment, but I might be re-adding it later. */\n#if 0\nstatic drflac_uint8 drflac_oggbs__get_current_segment_index(drflac_oggbs* oggbs, drflac_uint8* pBytesRemainingInSeg)\n{\n    drflac_uint32 bytesConsumedInPage = drflac_ogg__get_page_body_size(&oggbs->currentPageHeader) - oggbs->bytesRemainingInPage;\n    drflac_uint8 iSeg = 0;\n    drflac_uint32 iByte = 0;\n    while (iByte < bytesConsumedInPage) {\n        drflac_uint8 segmentSize = oggbs->currentPageHeader.segmentTable[iSeg];\n        if (iByte + segmentSize > bytesConsumedInPage) {\n            break;\n        } else {\n            iSeg += 1;\n            iByte += segmentSize;\n        }\n    }\n\n    *pBytesRemainingInSeg = oggbs->currentPageHeader.segmentTable[iSeg] - (drflac_uint8)(bytesConsumedInPage - iByte);\n    return iSeg;\n}\n\nstatic drflac_bool32 drflac_oggbs__seek_to_next_packet(drflac_oggbs* oggbs)\n{\n    /* The current packet ends when we get to the segment with a lacing value of < 255 which is not at the end of a page. */\n    for (;;) {\n        drflac_bool32 atEndOfPage = DRFLAC_FALSE;\n\n        drflac_uint8 bytesRemainingInSeg;\n        drflac_uint8 iFirstSeg = drflac_oggbs__get_current_segment_index(oggbs, &bytesRemainingInSeg);\n\n        drflac_uint32 bytesToEndOfPacketOrPage = bytesRemainingInSeg;\n        for (drflac_uint8 iSeg = iFirstSeg; iSeg < oggbs->currentPageHeader.segmentCount; ++iSeg) {\n            drflac_uint8 segmentSize = oggbs->currentPageHeader.segmentTable[iSeg];\n            if (segmentSize < 255) {\n                if (iSeg == oggbs->currentPageHeader.segmentCount-1) {\n                    atEndOfPage = DRFLAC_TRUE;\n                }\n\n                break;\n            }\n\n            bytesToEndOfPacketOrPage += segmentSize;\n        }\n\n        /*\n        At this point we will have found either the packet or the end of the page. If were at the end of the page we'll\n        want to load the next page and keep searching for the end of the packet.\n        */\n        drflac_oggbs__seek_physical(oggbs, bytesToEndOfPacketOrPage, drflac_seek_origin_current);\n        oggbs->bytesRemainingInPage -= bytesToEndOfPacketOrPage;\n\n        if (atEndOfPage) {\n            /*\n            We're potentially at the next packet, but we need to check the next page first to be sure because the packet may\n            straddle pages.\n            */\n            if (!drflac_oggbs__goto_next_page(oggbs)) {\n                return DRFLAC_FALSE;\n            }\n\n            /* If it's a fresh packet it most likely means we're at the next packet. */\n            if ((oggbs->currentPageHeader.headerType & 0x01) == 0) {\n                return DRFLAC_TRUE;\n            }\n        } else {\n            /* We're at the next packet. */\n            return DRFLAC_TRUE;\n        }\n    }\n}\n\nstatic drflac_bool32 drflac_oggbs__seek_to_next_frame(drflac_oggbs* oggbs)\n{\n    /* The bitstream should be sitting on the first byte just after the header of the frame. */\n\n    /* What we're actually doing here is seeking to the start of the next packet. */\n    return drflac_oggbs__seek_to_next_packet(oggbs);\n}\n#endif\n\nstatic size_t drflac__on_read_ogg(void* pUserData, void* bufferOut, size_t bytesToRead)\n{\n    drflac_oggbs* oggbs = (drflac_oggbs*)pUserData;\n    drflac_uint8* pRunningBufferOut = (drflac_uint8*)bufferOut;\n    size_t bytesRead = 0;\n\n    DRFLAC_ASSERT(oggbs != NULL);\n    DRFLAC_ASSERT(pRunningBufferOut != NULL);\n\n    /* Reading is done page-by-page. If we've run out of bytes in the page we need to move to the next one. */\n    while (bytesRead < bytesToRead) {\n        size_t bytesRemainingToRead = bytesToRead - bytesRead;\n\n        if (oggbs->bytesRemainingInPage >= bytesRemainingToRead) {\n            DRFLAC_COPY_MEMORY(pRunningBufferOut, oggbs->pageData + (oggbs->pageDataSize - oggbs->bytesRemainingInPage), bytesRemainingToRead);\n            bytesRead += bytesRemainingToRead;\n            oggbs->bytesRemainingInPage -= (drflac_uint32)bytesRemainingToRead;\n            break;\n        }\n\n        /* If we get here it means some of the requested data is contained in the next pages. */\n        if (oggbs->bytesRemainingInPage > 0) {\n            DRFLAC_COPY_MEMORY(pRunningBufferOut, oggbs->pageData + (oggbs->pageDataSize - oggbs->bytesRemainingInPage), oggbs->bytesRemainingInPage);\n            bytesRead += oggbs->bytesRemainingInPage;\n            pRunningBufferOut += oggbs->bytesRemainingInPage;\n            oggbs->bytesRemainingInPage = 0;\n        }\n\n        DRFLAC_ASSERT(bytesRemainingToRead > 0);\n        if (!drflac_oggbs__goto_next_page(oggbs, drflac_ogg_recover_on_crc_mismatch)) {\n            break;  /* Failed to go to the next page. Might have simply hit the end of the stream. */\n        }\n    }\n\n    return bytesRead;\n}\n\nstatic drflac_bool32 drflac__on_seek_ogg(void* pUserData, int offset, drflac_seek_origin origin)\n{\n    drflac_oggbs* oggbs = (drflac_oggbs*)pUserData;\n    int bytesSeeked = 0;\n\n    DRFLAC_ASSERT(oggbs != NULL);\n    DRFLAC_ASSERT(offset >= 0);  /* <-- Never seek backwards. */\n\n    /* Seeking is always forward which makes things a lot simpler. */\n    if (origin == drflac_seek_origin_start) {\n        if (!drflac_oggbs__seek_physical(oggbs, (int)oggbs->firstBytePos, drflac_seek_origin_start)) {\n            return DRFLAC_FALSE;\n        }\n\n        if (!drflac_oggbs__goto_next_page(oggbs, drflac_ogg_fail_on_crc_mismatch)) {\n            return DRFLAC_FALSE;\n        }\n\n        return drflac__on_seek_ogg(pUserData, offset, drflac_seek_origin_current);\n    }\n\n    DRFLAC_ASSERT(origin == drflac_seek_origin_current);\n\n    while (bytesSeeked < offset) {\n        int bytesRemainingToSeek = offset - bytesSeeked;\n        DRFLAC_ASSERT(bytesRemainingToSeek >= 0);\n\n        if (oggbs->bytesRemainingInPage >= (size_t)bytesRemainingToSeek) {\n            bytesSeeked += bytesRemainingToSeek;\n            (void)bytesSeeked;  /* <-- Silence a dead store warning emitted by Clang Static Analyzer. */\n            oggbs->bytesRemainingInPage -= bytesRemainingToSeek;\n            break;\n        }\n\n        /* If we get here it means some of the requested data is contained in the next pages. */\n        if (oggbs->bytesRemainingInPage > 0) {\n            bytesSeeked += (int)oggbs->bytesRemainingInPage;\n            oggbs->bytesRemainingInPage = 0;\n        }\n\n        DRFLAC_ASSERT(bytesRemainingToSeek > 0);\n        if (!drflac_oggbs__goto_next_page(oggbs, drflac_ogg_fail_on_crc_mismatch)) {\n            /* Failed to go to the next page. We either hit the end of the stream or had a CRC mismatch. */\n            return DRFLAC_FALSE;\n        }\n    }\n\n    return DRFLAC_TRUE;\n}\n\n\nstatic drflac_bool32 drflac_ogg__seek_to_pcm_frame(drflac* pFlac, drflac_uint64 pcmFrameIndex)\n{\n    drflac_oggbs* oggbs = (drflac_oggbs*)pFlac->_oggbs;\n    drflac_uint64 originalBytePos;\n    drflac_uint64 runningGranulePosition;\n    drflac_uint64 runningFrameBytePos;\n    drflac_uint64 runningPCMFrameCount;\n\n    DRFLAC_ASSERT(oggbs != NULL);\n\n    originalBytePos = oggbs->currentBytePos;   /* For recovery. Points to the OggS identifier. */\n\n    /* First seek to the first frame. */\n    if (!drflac__seek_to_byte(&pFlac->bs, pFlac->firstFLACFramePosInBytes)) {\n        return DRFLAC_FALSE;\n    }\n    oggbs->bytesRemainingInPage = 0;\n\n    runningGranulePosition = 0;\n    for (;;) {\n        if (!drflac_oggbs__goto_next_page(oggbs, drflac_ogg_recover_on_crc_mismatch)) {\n            drflac_oggbs__seek_physical(oggbs, originalBytePos, drflac_seek_origin_start);\n            return DRFLAC_FALSE;   /* Never did find that sample... */\n        }\n\n        runningFrameBytePos = oggbs->currentBytePos - drflac_ogg__get_page_header_size(&oggbs->currentPageHeader) - oggbs->pageDataSize;\n        if (oggbs->currentPageHeader.granulePosition >= pcmFrameIndex) {\n            break; /* The sample is somewhere in the previous page. */\n        }\n\n        /*\n        At this point we know the sample is not in the previous page. It could possibly be in this page. For simplicity we\n        disregard any pages that do not begin a fresh packet.\n        */\n        if ((oggbs->currentPageHeader.headerType & 0x01) == 0) {    /* <-- Is it a fresh page? */\n            if (oggbs->currentPageHeader.segmentTable[0] >= 2) {\n                drflac_uint8 firstBytesInPage[2];\n                firstBytesInPage[0] = oggbs->pageData[0];\n                firstBytesInPage[1] = oggbs->pageData[1];\n\n                if ((firstBytesInPage[0] == 0xFF) && (firstBytesInPage[1] & 0xFC) == 0xF8) {    /* <-- Does the page begin with a frame's sync code? */\n                    runningGranulePosition = oggbs->currentPageHeader.granulePosition;\n                }\n\n                continue;\n            }\n        }\n    }\n\n    /*\n    We found the page that that is closest to the sample, so now we need to find it. The first thing to do is seek to the\n    start of that page. In the loop above we checked that it was a fresh page which means this page is also the start of\n    a new frame. This property means that after we've seeked to the page we can immediately start looping over frames until\n    we find the one containing the target sample.\n    */\n    if (!drflac_oggbs__seek_physical(oggbs, runningFrameBytePos, drflac_seek_origin_start)) {\n        return DRFLAC_FALSE;\n    }\n    if (!drflac_oggbs__goto_next_page(oggbs, drflac_ogg_recover_on_crc_mismatch)) {\n        return DRFLAC_FALSE;\n    }\n\n    /*\n    At this point we'll be sitting on the first byte of the frame header of the first frame in the page. We just keep\n    looping over these frames until we find the one containing the sample we're after.\n    */\n    runningPCMFrameCount = runningGranulePosition;\n    for (;;) {\n        /*\n        There are two ways to find the sample and seek past irrelevant frames:\n          1) Use the native FLAC decoder.\n          2) Use Ogg's framing system.\n\n        Both of these options have their own pros and cons. Using the native FLAC decoder is slower because it needs to\n        do a full decode of the frame. Using Ogg's framing system is faster, but more complicated and involves some code\n        duplication for the decoding of frame headers.\n\n        Another thing to consider is that using the Ogg framing system will perform direct seeking of the physical Ogg\n        bitstream. This is important to consider because it means we cannot read data from the drflac_bs object using the\n        standard drflac__*() APIs because that will read in extra data for its own internal caching which in turn breaks\n        the positioning of the read pointer of the physical Ogg bitstream. Therefore, anything that would normally be read\n        using the native FLAC decoding APIs, such as drflac__read_next_flac_frame_header(), need to be re-implemented so as to\n        avoid the use of the drflac_bs object.\n\n        Considering these issues, I have decided to use the slower native FLAC decoding method for the following reasons:\n          1) Seeking is already partially accelerated using Ogg's paging system in the code block above.\n          2) Seeking in an Ogg encapsulated FLAC stream is probably quite uncommon.\n          3) Simplicity.\n        */\n        drflac_uint64 firstPCMFrameInFLACFrame = 0;\n        drflac_uint64 lastPCMFrameInFLACFrame = 0;\n        drflac_uint64 pcmFrameCountInThisFrame;\n\n        if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) {\n            return DRFLAC_FALSE;\n        }\n\n        drflac__get_pcm_frame_range_of_current_flac_frame(pFlac, &firstPCMFrameInFLACFrame, &lastPCMFrameInFLACFrame);\n\n        pcmFrameCountInThisFrame = (lastPCMFrameInFLACFrame - firstPCMFrameInFLACFrame) + 1;\n\n        /* If we are seeking to the end of the file and we've just hit it, we're done. */\n        if (pcmFrameIndex == pFlac->totalPCMFrameCount && (runningPCMFrameCount + pcmFrameCountInThisFrame) == pFlac->totalPCMFrameCount) {\n            drflac_result result = drflac__decode_flac_frame(pFlac);\n            if (result == DRFLAC_SUCCESS) {\n                pFlac->currentPCMFrame = pcmFrameIndex;\n                pFlac->currentFLACFrame.pcmFramesRemaining = 0;\n                return DRFLAC_TRUE;\n            } else {\n                return DRFLAC_FALSE;\n            }\n        }\n\n        if (pcmFrameIndex < (runningPCMFrameCount + pcmFrameCountInThisFrame)) {\n            /*\n            The sample should be in this FLAC frame. We need to fully decode it, however if it's an invalid frame (a CRC mismatch), we need to pretend\n            it never existed and keep iterating.\n            */\n            drflac_result result = drflac__decode_flac_frame(pFlac);\n            if (result == DRFLAC_SUCCESS) {\n                /* The frame is valid. We just need to skip over some samples to ensure it's sample-exact. */\n                drflac_uint64 pcmFramesToDecode = (size_t)(pcmFrameIndex - runningPCMFrameCount);    /* <-- Safe cast because the maximum number of samples in a frame is 65535. */\n                if (pcmFramesToDecode == 0) {\n                    return DRFLAC_TRUE;\n                }\n\n                pFlac->currentPCMFrame = runningPCMFrameCount;\n\n                return drflac__seek_forward_by_pcm_frames(pFlac, pcmFramesToDecode) == pcmFramesToDecode;  /* <-- If this fails, something bad has happened (it should never fail). */\n            } else {\n                if (result == DRFLAC_CRC_MISMATCH) {\n                    continue;   /* CRC mismatch. Pretend this frame never existed. */\n                } else {\n                    return DRFLAC_FALSE;\n                }\n            }\n        } else {\n            /*\n            It's not in this frame. We need to seek past the frame, but check if there was a CRC mismatch. If so, we pretend this\n            frame never existed and leave the running sample count untouched.\n            */\n            drflac_result result = drflac__seek_to_next_flac_frame(pFlac);\n            if (result == DRFLAC_SUCCESS) {\n                runningPCMFrameCount += pcmFrameCountInThisFrame;\n            } else {\n                if (result == DRFLAC_CRC_MISMATCH) {\n                    continue;   /* CRC mismatch. Pretend this frame never existed. */\n                } else {\n                    return DRFLAC_FALSE;\n                }\n            }\n        }\n    }\n}\n\n\n\nstatic drflac_bool32 drflac__init_private__ogg(drflac_init_info* pInit, drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData, void* pUserDataMD, drflac_bool32 relaxed)\n{\n    drflac_ogg_page_header header;\n    drflac_uint32 crc32 = DRFLAC_OGG_CAPTURE_PATTERN_CRC32;\n    drflac_uint32 bytesRead = 0;\n\n    /* Pre Condition: The bit stream should be sitting just past the 4-byte OggS capture pattern. */\n    (void)relaxed;\n\n    pInit->container = drflac_container_ogg;\n    pInit->oggFirstBytePos = 0;\n\n    /*\n    We'll get here if the first 4 bytes of the stream were the OggS capture pattern, however it doesn't necessarily mean the\n    stream includes FLAC encoded audio. To check for this we need to scan the beginning-of-stream page markers and check if\n    any match the FLAC specification. Important to keep in mind that the stream may be multiplexed.\n    */\n    if (drflac_ogg__read_page_header_after_capture_pattern(onRead, pUserData, &header, &bytesRead, &crc32) != DRFLAC_SUCCESS) {\n        return DRFLAC_FALSE;\n    }\n    pInit->runningFilePos += bytesRead;\n\n    for (;;) {\n        int pageBodySize;\n\n        /* Break if we're past the beginning of stream page. */\n        if ((header.headerType & 0x02) == 0) {\n            return DRFLAC_FALSE;\n        }\n\n        /* Check if it's a FLAC header. */\n        pageBodySize = drflac_ogg__get_page_body_size(&header);\n        if (pageBodySize == 51) {   /* 51 = the lacing value of the FLAC header packet. */\n            /* It could be a FLAC page... */\n            drflac_uint32 bytesRemainingInPage = pageBodySize;\n            drflac_uint8 packetType;\n\n            if (onRead(pUserData, &packetType, 1) != 1) {\n                return DRFLAC_FALSE;\n            }\n\n            bytesRemainingInPage -= 1;\n            if (packetType == 0x7F) {\n                /* Increasingly more likely to be a FLAC page... */\n                drflac_uint8 sig[4];\n                if (onRead(pUserData, sig, 4) != 4) {\n                    return DRFLAC_FALSE;\n                }\n\n                bytesRemainingInPage -= 4;\n                if (sig[0] == 'F' && sig[1] == 'L' && sig[2] == 'A' && sig[3] == 'C') {\n                    /* Almost certainly a FLAC page... */\n                    drflac_uint8 mappingVersion[2];\n                    if (onRead(pUserData, mappingVersion, 2) != 2) {\n                        return DRFLAC_FALSE;\n                    }\n\n                    if (mappingVersion[0] != 1) {\n                        return DRFLAC_FALSE;   /* Only supporting version 1.x of the Ogg mapping. */\n                    }\n\n                    /*\n                    The next 2 bytes are the non-audio packets, not including this one. We don't care about this because we're going to\n                    be handling it in a generic way based on the serial number and packet types.\n                    */\n                    if (!onSeek(pUserData, 2, drflac_seek_origin_current)) {\n                        return DRFLAC_FALSE;\n                    }\n\n                    /* Expecting the native FLAC signature \"fLaC\". */\n                    if (onRead(pUserData, sig, 4) != 4) {\n                        return DRFLAC_FALSE;\n                    }\n\n                    if (sig[0] == 'f' && sig[1] == 'L' && sig[2] == 'a' && sig[3] == 'C') {\n                        /* The remaining data in the page should be the STREAMINFO block. */\n                        drflac_streaminfo streaminfo;\n                        drflac_uint8 isLastBlock;\n                        drflac_uint8 blockType;\n                        drflac_uint32 blockSize;\n                        if (!drflac__read_and_decode_block_header(onRead, pUserData, &isLastBlock, &blockType, &blockSize)) {\n                            return DRFLAC_FALSE;\n                        }\n\n                        if (blockType != DRFLAC_METADATA_BLOCK_TYPE_STREAMINFO || blockSize != 34) {\n                            return DRFLAC_FALSE;    /* Invalid block type. First block must be the STREAMINFO block. */\n                        }\n\n                        if (drflac__read_streaminfo(onRead, pUserData, &streaminfo)) {\n                            /* Success! */\n                            pInit->hasStreamInfoBlock      = DRFLAC_TRUE;\n                            pInit->sampleRate              = streaminfo.sampleRate;\n                            pInit->channels                = streaminfo.channels;\n                            pInit->bitsPerSample           = streaminfo.bitsPerSample;\n                            pInit->totalPCMFrameCount      = streaminfo.totalPCMFrameCount;\n                            pInit->maxBlockSizeInPCMFrames = streaminfo.maxBlockSizeInPCMFrames;\n                            pInit->hasMetadataBlocks       = !isLastBlock;\n\n                            if (onMeta) {\n                                drflac_metadata metadata;\n                                metadata.type = DRFLAC_METADATA_BLOCK_TYPE_STREAMINFO;\n                                metadata.pRawData = NULL;\n                                metadata.rawDataSize = 0;\n                                metadata.data.streaminfo = streaminfo;\n                                onMeta(pUserDataMD, &metadata);\n                            }\n\n                            pInit->runningFilePos  += pageBodySize;\n                            pInit->oggFirstBytePos  = pInit->runningFilePos - 79;   /* Subtracting 79 will place us right on top of the \"OggS\" identifier of the FLAC bos page. */\n                            pInit->oggSerial        = header.serialNumber;\n                            pInit->oggBosHeader     = header;\n                            break;\n                        } else {\n                            /* Failed to read STREAMINFO block. Aww, so close... */\n                            return DRFLAC_FALSE;\n                        }\n                    } else {\n                        /* Invalid file. */\n                        return DRFLAC_FALSE;\n                    }\n                } else {\n                    /* Not a FLAC header. Skip it. */\n                    if (!onSeek(pUserData, bytesRemainingInPage, drflac_seek_origin_current)) {\n                        return DRFLAC_FALSE;\n                    }\n                }\n            } else {\n                /* Not a FLAC header. Seek past the entire page and move on to the next. */\n                if (!onSeek(pUserData, bytesRemainingInPage, drflac_seek_origin_current)) {\n                    return DRFLAC_FALSE;\n                }\n            }\n        } else {\n            if (!onSeek(pUserData, pageBodySize, drflac_seek_origin_current)) {\n                return DRFLAC_FALSE;\n            }\n        }\n\n        pInit->runningFilePos += pageBodySize;\n\n\n        /* Read the header of the next page. */\n        if (drflac_ogg__read_page_header(onRead, pUserData, &header, &bytesRead, &crc32) != DRFLAC_SUCCESS) {\n            return DRFLAC_FALSE;\n        }\n        pInit->runningFilePos += bytesRead;\n    }\n\n    /*\n    If we get here it means we found a FLAC audio stream. We should be sitting on the first byte of the header of the next page. The next\n    packets in the FLAC logical stream contain the metadata. The only thing left to do in the initialization phase for Ogg is to create the\n    Ogg bistream object.\n    */\n    pInit->hasMetadataBlocks = DRFLAC_TRUE;    /* <-- Always have at least VORBIS_COMMENT metadata block. */\n    return DRFLAC_TRUE;\n}\n#endif\n\nstatic drflac_bool32 drflac__init_private(drflac_init_info* pInit, drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, drflac_container container, void* pUserData, void* pUserDataMD)\n{\n    drflac_bool32 relaxed;\n    drflac_uint8 id[4];\n\n    if (pInit == NULL || onRead == NULL || onSeek == NULL) {\n        return DRFLAC_FALSE;\n    }\n\n    DRFLAC_ZERO_MEMORY(pInit, sizeof(*pInit));\n    pInit->onRead       = onRead;\n    pInit->onSeek       = onSeek;\n    pInit->onMeta       = onMeta;\n    pInit->container    = container;\n    pInit->pUserData    = pUserData;\n    pInit->pUserDataMD  = pUserDataMD;\n\n    pInit->bs.onRead    = onRead;\n    pInit->bs.onSeek    = onSeek;\n    pInit->bs.pUserData = pUserData;\n    drflac__reset_cache(&pInit->bs);\n\n\n    /* If the container is explicitly defined then we can try opening in relaxed mode. */\n    relaxed = container != drflac_container_unknown;\n\n    /* Skip over any ID3 tags. */\n    for (;;) {\n        if (onRead(pUserData, id, 4) != 4) {\n            return DRFLAC_FALSE;    /* Ran out of data. */\n        }\n        pInit->runningFilePos += 4;\n\n        if (id[0] == 'I' && id[1] == 'D' && id[2] == '3') {\n            drflac_uint8 header[6];\n            drflac_uint8 flags;\n            drflac_uint32 headerSize;\n\n            if (onRead(pUserData, header, 6) != 6) {\n                return DRFLAC_FALSE;    /* Ran out of data. */\n            }\n            pInit->runningFilePos += 6;\n\n            flags = header[1];\n\n            DRFLAC_COPY_MEMORY(&headerSize, header+2, 4);\n            headerSize = drflac__unsynchsafe_32(drflac__be2host_32(headerSize));\n            if (flags & 0x10) {\n                headerSize += 10;\n            }\n\n            if (!onSeek(pUserData, headerSize, drflac_seek_origin_current)) {\n                return DRFLAC_FALSE;    /* Failed to seek past the tag. */\n            }\n            pInit->runningFilePos += headerSize;\n        } else {\n            break;\n        }\n    }\n\n    if (id[0] == 'f' && id[1] == 'L' && id[2] == 'a' && id[3] == 'C') {\n        return drflac__init_private__native(pInit, onRead, onSeek, onMeta, pUserData, pUserDataMD, relaxed);\n    }\n#ifndef DR_FLAC_NO_OGG\n    if (id[0] == 'O' && id[1] == 'g' && id[2] == 'g' && id[3] == 'S') {\n        return drflac__init_private__ogg(pInit, onRead, onSeek, onMeta, pUserData, pUserDataMD, relaxed);\n    }\n#endif\n\n    /* If we get here it means we likely don't have a header. Try opening in relaxed mode, if applicable. */\n    if (relaxed) {\n        if (container == drflac_container_native) {\n            return drflac__init_private__native(pInit, onRead, onSeek, onMeta, pUserData, pUserDataMD, relaxed);\n        }\n#ifndef DR_FLAC_NO_OGG\n        if (container == drflac_container_ogg) {\n            return drflac__init_private__ogg(pInit, onRead, onSeek, onMeta, pUserData, pUserDataMD, relaxed);\n        }\n#endif\n    }\n\n    /* Unsupported container. */\n    return DRFLAC_FALSE;\n}\n\nstatic void drflac__init_from_info(drflac* pFlac, const drflac_init_info* pInit)\n{\n    DRFLAC_ASSERT(pFlac != NULL);\n    DRFLAC_ASSERT(pInit != NULL);\n\n    DRFLAC_ZERO_MEMORY(pFlac, sizeof(*pFlac));\n    pFlac->bs                      = pInit->bs;\n    pFlac->onMeta                  = pInit->onMeta;\n    pFlac->pUserDataMD             = pInit->pUserDataMD;\n    pFlac->maxBlockSizeInPCMFrames = pInit->maxBlockSizeInPCMFrames;\n    pFlac->sampleRate              = pInit->sampleRate;\n    pFlac->channels                = (drflac_uint8)pInit->channels;\n    pFlac->bitsPerSample           = (drflac_uint8)pInit->bitsPerSample;\n    pFlac->totalPCMFrameCount      = pInit->totalPCMFrameCount;\n    pFlac->container               = pInit->container;\n}\n\n\nstatic drflac* drflac_open_with_metadata_private(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, drflac_container container, void* pUserData, void* pUserDataMD, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    drflac_init_info init;\n    drflac_uint32 allocationSize;\n    drflac_uint32 wholeSIMDVectorCountPerChannel;\n    drflac_uint32 decodedSamplesAllocationSize;\n#ifndef DR_FLAC_NO_OGG\n    drflac_oggbs oggbs;\n#endif\n    drflac_uint64 firstFramePos;\n    drflac_uint64 seektablePos;\n    drflac_uint32 seektableSize;\n    drflac_allocation_callbacks allocationCallbacks;\n    drflac* pFlac;\n\n    /* CPU support first. */\n    drflac__init_cpu_caps();\n\n    if (!drflac__init_private(&init, onRead, onSeek, onMeta, container, pUserData, pUserDataMD)) {\n        return NULL;\n    }\n\n    if (pAllocationCallbacks != NULL) {\n        allocationCallbacks = *pAllocationCallbacks;\n        if (allocationCallbacks.onFree == NULL || (allocationCallbacks.onMalloc == NULL && allocationCallbacks.onRealloc == NULL)) {\n            return NULL;    /* Invalid allocation callbacks. */\n        }\n    } else {\n        allocationCallbacks.pUserData = NULL;\n        allocationCallbacks.onMalloc  = drflac__malloc_default;\n        allocationCallbacks.onRealloc = drflac__realloc_default;\n        allocationCallbacks.onFree    = drflac__free_default;\n    }\n\n\n    /*\n    The size of the allocation for the drflac object needs to be large enough to fit the following:\n      1) The main members of the drflac structure\n      2) A block of memory large enough to store the decoded samples of the largest frame in the stream\n      3) If the container is Ogg, a drflac_oggbs object\n\n    The complicated part of the allocation is making sure there's enough room the decoded samples, taking into consideration\n    the different SIMD instruction sets.\n    */\n    allocationSize = sizeof(drflac);\n\n    /*\n    The allocation size for decoded frames depends on the number of 32-bit integers that fit inside the largest SIMD vector\n    we are supporting.\n    */\n    if ((init.maxBlockSizeInPCMFrames % (DRFLAC_MAX_SIMD_VECTOR_SIZE / sizeof(drflac_int32))) == 0) {\n        wholeSIMDVectorCountPerChannel = (init.maxBlockSizeInPCMFrames / (DRFLAC_MAX_SIMD_VECTOR_SIZE / sizeof(drflac_int32)));\n    } else {\n        wholeSIMDVectorCountPerChannel = (init.maxBlockSizeInPCMFrames / (DRFLAC_MAX_SIMD_VECTOR_SIZE / sizeof(drflac_int32))) + 1;\n    }\n\n    decodedSamplesAllocationSize = wholeSIMDVectorCountPerChannel * DRFLAC_MAX_SIMD_VECTOR_SIZE * init.channels;\n\n    allocationSize += decodedSamplesAllocationSize;\n    allocationSize += DRFLAC_MAX_SIMD_VECTOR_SIZE;  /* Allocate extra bytes to ensure we have enough for alignment. */\n\n#ifndef DR_FLAC_NO_OGG\n    /* There's additional data required for Ogg streams. */\n    if (init.container == drflac_container_ogg) {\n        allocationSize += sizeof(drflac_oggbs);\n    }\n\n    DRFLAC_ZERO_MEMORY(&oggbs, sizeof(oggbs));\n    if (init.container == drflac_container_ogg) {\n        oggbs.onRead = onRead;\n        oggbs.onSeek = onSeek;\n        oggbs.pUserData = pUserData;\n        oggbs.currentBytePos = init.oggFirstBytePos;\n        oggbs.firstBytePos = init.oggFirstBytePos;\n        oggbs.serialNumber = init.oggSerial;\n        oggbs.bosPageHeader = init.oggBosHeader;\n        oggbs.bytesRemainingInPage = 0;\n    }\n#endif\n\n    /*\n    This part is a bit awkward. We need to load the seektable so that it can be referenced in-memory, but I want the drflac object to\n    consist of only a single heap allocation. To this, the size of the seek table needs to be known, which we determine when reading\n    and decoding the metadata.\n    */\n    firstFramePos = 42;   /* <-- We know we are at byte 42 at this point. */\n    seektablePos  = 0;\n    seektableSize = 0;\n    if (init.hasMetadataBlocks) {\n        drflac_read_proc onReadOverride = onRead;\n        drflac_seek_proc onSeekOverride = onSeek;\n        void* pUserDataOverride = pUserData;\n\n#ifndef DR_FLAC_NO_OGG\n        if (init.container == drflac_container_ogg) {\n            onReadOverride = drflac__on_read_ogg;\n            onSeekOverride = drflac__on_seek_ogg;\n            pUserDataOverride = (void*)&oggbs;\n        }\n#endif\n\n        if (!drflac__read_and_decode_metadata(onReadOverride, onSeekOverride, onMeta, pUserDataOverride, pUserDataMD, &firstFramePos, &seektablePos, &seektableSize, &allocationCallbacks)) {\n            return NULL;\n        }\n\n        allocationSize += seektableSize;\n    }\n\n\n    pFlac = (drflac*)drflac__malloc_from_callbacks(allocationSize, &allocationCallbacks);\n    if (pFlac == NULL) {\n        return NULL;\n    }\n\n    drflac__init_from_info(pFlac, &init);\n    pFlac->allocationCallbacks = allocationCallbacks;\n    pFlac->pDecodedSamples = (drflac_int32*)drflac_align((size_t)pFlac->pExtraData, DRFLAC_MAX_SIMD_VECTOR_SIZE);\n\n#ifndef DR_FLAC_NO_OGG\n    if (init.container == drflac_container_ogg) {\n        drflac_oggbs* pInternalOggbs = (drflac_oggbs*)((drflac_uint8*)pFlac->pDecodedSamples + decodedSamplesAllocationSize + seektableSize);\n        DRFLAC_COPY_MEMORY(pInternalOggbs, &oggbs, sizeof(oggbs));\n\n        /* The Ogg bistream needs to be layered on top of the original bitstream. */\n        pFlac->bs.onRead = drflac__on_read_ogg;\n        pFlac->bs.onSeek = drflac__on_seek_ogg;\n        pFlac->bs.pUserData = (void*)pInternalOggbs;\n        pFlac->_oggbs = (void*)pInternalOggbs;\n    }\n#endif\n\n    pFlac->firstFLACFramePosInBytes = firstFramePos;\n\n    /* NOTE: Seektables are not currently compatible with Ogg encapsulation (Ogg has its own accelerated seeking system). I may change this later, so I'm leaving this here for now. */\n#ifndef DR_FLAC_NO_OGG\n    if (init.container == drflac_container_ogg)\n    {\n        pFlac->pSeekpoints = NULL;\n        pFlac->seekpointCount = 0;\n    }\n    else\n#endif\n    {\n        /* If we have a seektable we need to load it now, making sure we move back to where we were previously. */\n        if (seektablePos != 0) {\n            pFlac->seekpointCount = seektableSize / sizeof(*pFlac->pSeekpoints);\n            pFlac->pSeekpoints = (drflac_seekpoint*)((drflac_uint8*)pFlac->pDecodedSamples + decodedSamplesAllocationSize);\n\n            DRFLAC_ASSERT(pFlac->bs.onSeek != NULL);\n            DRFLAC_ASSERT(pFlac->bs.onRead != NULL);\n\n            /* Seek to the seektable, then just read directly into our seektable buffer. */\n            if (pFlac->bs.onSeek(pFlac->bs.pUserData, (int)seektablePos, drflac_seek_origin_start)) {\n                if (pFlac->bs.onRead(pFlac->bs.pUserData, pFlac->pSeekpoints, seektableSize) == seektableSize) {\n                    /* Endian swap. */\n                    drflac_uint32 iSeekpoint;\n                    for (iSeekpoint = 0; iSeekpoint < pFlac->seekpointCount; ++iSeekpoint) {\n                        pFlac->pSeekpoints[iSeekpoint].firstPCMFrame   = drflac__be2host_64(pFlac->pSeekpoints[iSeekpoint].firstPCMFrame);\n                        pFlac->pSeekpoints[iSeekpoint].flacFrameOffset = drflac__be2host_64(pFlac->pSeekpoints[iSeekpoint].flacFrameOffset);\n                        pFlac->pSeekpoints[iSeekpoint].pcmFrameCount   = drflac__be2host_16(pFlac->pSeekpoints[iSeekpoint].pcmFrameCount);\n                    }\n                } else {\n                    /* Failed to read the seektable. Pretend we don't have one. */\n                    pFlac->pSeekpoints = NULL;\n                    pFlac->seekpointCount = 0;\n                }\n\n                /* We need to seek back to where we were. If this fails it's a critical error. */\n                if (!pFlac->bs.onSeek(pFlac->bs.pUserData, (int)pFlac->firstFLACFramePosInBytes, drflac_seek_origin_start)) {\n                    drflac__free_from_callbacks(pFlac, &allocationCallbacks);\n                    return NULL;\n                }\n            } else {\n                /* Failed to seek to the seektable. Ominous sign, but for now we can just pretend we don't have one. */\n                pFlac->pSeekpoints = NULL;\n                pFlac->seekpointCount = 0;\n            }\n        }\n    }\n\n\n    /*\n    If we get here, but don't have a STREAMINFO block, it means we've opened the stream in relaxed mode and need to decode\n    the first frame.\n    */\n    if (!init.hasStreamInfoBlock) {\n        pFlac->currentFLACFrame.header = init.firstFrameHeader;\n        for (;;) {\n            drflac_result result = drflac__decode_flac_frame(pFlac);\n            if (result == DRFLAC_SUCCESS) {\n                break;\n            } else {\n                if (result == DRFLAC_CRC_MISMATCH) {\n                    if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) {\n                        drflac__free_from_callbacks(pFlac, &allocationCallbacks);\n                        return NULL;\n                    }\n                    continue;\n                } else {\n                    drflac__free_from_callbacks(pFlac, &allocationCallbacks);\n                    return NULL;\n                }\n            }\n        }\n    }\n\n    return pFlac;\n}\n\n\n\n#ifndef DR_FLAC_NO_STDIO\n#include <stdio.h>\n#include <wchar.h>      /* For wcslen(), wcsrtombs() */\n\n/* drflac_result_from_errno() is only used for fopen() and wfopen() so putting it inside DR_WAV_NO_STDIO for now. If something else needs this later we can move it out. */\n#include <errno.h>\nstatic drflac_result drflac_result_from_errno(int e)\n{\n    switch (e)\n    {\n        case 0: return DRFLAC_SUCCESS;\n    #ifdef EPERM\n        case EPERM: return DRFLAC_INVALID_OPERATION;\n    #endif\n    #ifdef ENOENT\n        case ENOENT: return DRFLAC_DOES_NOT_EXIST;\n    #endif\n    #ifdef ESRCH\n        case ESRCH: return DRFLAC_DOES_NOT_EXIST;\n    #endif\n    #ifdef EINTR\n        case EINTR: return DRFLAC_INTERRUPT;\n    #endif\n    #ifdef EIO\n        case EIO: return DRFLAC_IO_ERROR;\n    #endif\n    #ifdef ENXIO\n        case ENXIO: return DRFLAC_DOES_NOT_EXIST;\n    #endif\n    #ifdef E2BIG\n        case E2BIG: return DRFLAC_INVALID_ARGS;\n    #endif\n    #ifdef ENOEXEC\n        case ENOEXEC: return DRFLAC_INVALID_FILE;\n    #endif\n    #ifdef EBADF\n        case EBADF: return DRFLAC_INVALID_FILE;\n    #endif\n    #ifdef ECHILD\n        case ECHILD: return DRFLAC_ERROR;\n    #endif\n    #ifdef EAGAIN\n        case EAGAIN: return DRFLAC_UNAVAILABLE;\n    #endif\n    #ifdef ENOMEM\n        case ENOMEM: return DRFLAC_OUT_OF_MEMORY;\n    #endif\n    #ifdef EACCES\n        case EACCES: return DRFLAC_ACCESS_DENIED;\n    #endif\n    #ifdef EFAULT\n        case EFAULT: return DRFLAC_BAD_ADDRESS;\n    #endif\n    #ifdef ENOTBLK\n        case ENOTBLK: return DRFLAC_ERROR;\n    #endif\n    #ifdef EBUSY\n        case EBUSY: return DRFLAC_BUSY;\n    #endif\n    #ifdef EEXIST\n        case EEXIST: return DRFLAC_ALREADY_EXISTS;\n    #endif\n    #ifdef EXDEV\n        case EXDEV: return DRFLAC_ERROR;\n    #endif\n    #ifdef ENODEV\n        case ENODEV: return DRFLAC_DOES_NOT_EXIST;\n    #endif\n    #ifdef ENOTDIR\n        case ENOTDIR: return DRFLAC_NOT_DIRECTORY;\n    #endif\n    #ifdef EISDIR\n        case EISDIR: return DRFLAC_IS_DIRECTORY;\n    #endif\n    #ifdef EINVAL\n        case EINVAL: return DRFLAC_INVALID_ARGS;\n    #endif\n    #ifdef ENFILE\n        case ENFILE: return DRFLAC_TOO_MANY_OPEN_FILES;\n    #endif\n    #ifdef EMFILE\n        case EMFILE: return DRFLAC_TOO_MANY_OPEN_FILES;\n    #endif\n    #ifdef ENOTTY\n        case ENOTTY: return DRFLAC_INVALID_OPERATION;\n    #endif\n    #ifdef ETXTBSY\n        case ETXTBSY: return DRFLAC_BUSY;\n    #endif\n    #ifdef EFBIG\n        case EFBIG: return DRFLAC_TOO_BIG;\n    #endif\n    #ifdef ENOSPC\n        case ENOSPC: return DRFLAC_NO_SPACE;\n    #endif\n    #ifdef ESPIPE\n        case ESPIPE: return DRFLAC_BAD_SEEK;\n    #endif\n    #ifdef EROFS\n        case EROFS: return DRFLAC_ACCESS_DENIED;\n    #endif\n    #ifdef EMLINK\n        case EMLINK: return DRFLAC_TOO_MANY_LINKS;\n    #endif\n    #ifdef EPIPE\n        case EPIPE: return DRFLAC_BAD_PIPE;\n    #endif\n    #ifdef EDOM\n        case EDOM: return DRFLAC_OUT_OF_RANGE;\n    #endif\n    #ifdef ERANGE\n        case ERANGE: return DRFLAC_OUT_OF_RANGE;\n    #endif\n    #ifdef EDEADLK\n        case EDEADLK: return DRFLAC_DEADLOCK;\n    #endif\n    #ifdef ENAMETOOLONG\n        case ENAMETOOLONG: return DRFLAC_PATH_TOO_LONG;\n    #endif\n    #ifdef ENOLCK\n        case ENOLCK: return DRFLAC_ERROR;\n    #endif\n    #ifdef ENOSYS\n        case ENOSYS: return DRFLAC_NOT_IMPLEMENTED;\n    #endif\n    #ifdef ENOTEMPTY\n        case ENOTEMPTY: return DRFLAC_DIRECTORY_NOT_EMPTY;\n    #endif\n    #ifdef ELOOP\n        case ELOOP: return DRFLAC_TOO_MANY_LINKS;\n    #endif\n    #ifdef ENOMSG\n        case ENOMSG: return DRFLAC_NO_MESSAGE;\n    #endif\n    #ifdef EIDRM\n        case EIDRM: return DRFLAC_ERROR;\n    #endif\n    #ifdef ECHRNG\n        case ECHRNG: return DRFLAC_ERROR;\n    #endif\n    #ifdef EL2NSYNC\n        case EL2NSYNC: return DRFLAC_ERROR;\n    #endif\n    #ifdef EL3HLT\n        case EL3HLT: return DRFLAC_ERROR;\n    #endif\n    #ifdef EL3RST\n        case EL3RST: return DRFLAC_ERROR;\n    #endif\n    #ifdef ELNRNG\n        case ELNRNG: return DRFLAC_OUT_OF_RANGE;\n    #endif\n    #ifdef EUNATCH\n        case EUNATCH: return DRFLAC_ERROR;\n    #endif\n    #ifdef ENOCSI\n        case ENOCSI: return DRFLAC_ERROR;\n    #endif\n    #ifdef EL2HLT\n        case EL2HLT: return DRFLAC_ERROR;\n    #endif\n    #ifdef EBADE\n        case EBADE: return DRFLAC_ERROR;\n    #endif\n    #ifdef EBADR\n        case EBADR: return DRFLAC_ERROR;\n    #endif\n    #ifdef EXFULL\n        case EXFULL: return DRFLAC_ERROR;\n    #endif\n    #ifdef ENOANO\n        case ENOANO: return DRFLAC_ERROR;\n    #endif\n    #ifdef EBADRQC\n        case EBADRQC: return DRFLAC_ERROR;\n    #endif\n    #ifdef EBADSLT\n        case EBADSLT: return DRFLAC_ERROR;\n    #endif\n    #ifdef EBFONT\n        case EBFONT: return DRFLAC_INVALID_FILE;\n    #endif\n    #ifdef ENOSTR\n        case ENOSTR: return DRFLAC_ERROR;\n    #endif\n    #ifdef ENODATA\n        case ENODATA: return DRFLAC_NO_DATA_AVAILABLE;\n    #endif\n    #ifdef ETIME\n        case ETIME: return DRFLAC_TIMEOUT;\n    #endif\n    #ifdef ENOSR\n        case ENOSR: return DRFLAC_NO_DATA_AVAILABLE;\n    #endif\n    #ifdef ENONET\n        case ENONET: return DRFLAC_NO_NETWORK;\n    #endif\n    #ifdef ENOPKG\n        case ENOPKG: return DRFLAC_ERROR;\n    #endif\n    #ifdef EREMOTE\n        case EREMOTE: return DRFLAC_ERROR;\n    #endif\n    #ifdef ENOLINK\n        case ENOLINK: return DRFLAC_ERROR;\n    #endif\n    #ifdef EADV\n        case EADV: return DRFLAC_ERROR;\n    #endif\n    #ifdef ESRMNT\n        case ESRMNT: return DRFLAC_ERROR;\n    #endif\n    #ifdef ECOMM\n        case ECOMM: return DRFLAC_ERROR;\n    #endif\n    #ifdef EPROTO\n        case EPROTO: return DRFLAC_ERROR;\n    #endif\n    #ifdef EMULTIHOP\n        case EMULTIHOP: return DRFLAC_ERROR;\n    #endif\n    #ifdef EDOTDOT\n        case EDOTDOT: return DRFLAC_ERROR;\n    #endif\n    #ifdef EBADMSG\n        case EBADMSG: return DRFLAC_BAD_MESSAGE;\n    #endif\n    #ifdef EOVERFLOW\n        case EOVERFLOW: return DRFLAC_TOO_BIG;\n    #endif\n    #ifdef ENOTUNIQ\n        case ENOTUNIQ: return DRFLAC_NOT_UNIQUE;\n    #endif\n    #ifdef EBADFD\n        case EBADFD: return DRFLAC_ERROR;\n    #endif\n    #ifdef EREMCHG\n        case EREMCHG: return DRFLAC_ERROR;\n    #endif\n    #ifdef ELIBACC\n        case ELIBACC: return DRFLAC_ACCESS_DENIED;\n    #endif\n    #ifdef ELIBBAD\n        case ELIBBAD: return DRFLAC_INVALID_FILE;\n    #endif\n    #ifdef ELIBSCN\n        case ELIBSCN: return DRFLAC_INVALID_FILE;\n    #endif\n    #ifdef ELIBMAX\n        case ELIBMAX: return DRFLAC_ERROR;\n    #endif\n    #ifdef ELIBEXEC\n        case ELIBEXEC: return DRFLAC_ERROR;\n    #endif\n    #ifdef EILSEQ\n        case EILSEQ: return DRFLAC_INVALID_DATA;\n    #endif\n    #ifdef ERESTART\n        case ERESTART: return DRFLAC_ERROR;\n    #endif\n    #ifdef ESTRPIPE\n        case ESTRPIPE: return DRFLAC_ERROR;\n    #endif\n    #ifdef EUSERS\n        case EUSERS: return DRFLAC_ERROR;\n    #endif\n    #ifdef ENOTSOCK\n        case ENOTSOCK: return DRFLAC_NOT_SOCKET;\n    #endif\n    #ifdef EDESTADDRREQ\n        case EDESTADDRREQ: return DRFLAC_NO_ADDRESS;\n    #endif\n    #ifdef EMSGSIZE\n        case EMSGSIZE: return DRFLAC_TOO_BIG;\n    #endif\n    #ifdef EPROTOTYPE\n        case EPROTOTYPE: return DRFLAC_BAD_PROTOCOL;\n    #endif\n    #ifdef ENOPROTOOPT\n        case ENOPROTOOPT: return DRFLAC_PROTOCOL_UNAVAILABLE;\n    #endif\n    #ifdef EPROTONOSUPPORT\n        case EPROTONOSUPPORT: return DRFLAC_PROTOCOL_NOT_SUPPORTED;\n    #endif\n    #ifdef ESOCKTNOSUPPORT\n        case ESOCKTNOSUPPORT: return DRFLAC_SOCKET_NOT_SUPPORTED;\n    #endif\n    #ifdef EOPNOTSUPP\n        case EOPNOTSUPP: return DRFLAC_INVALID_OPERATION;\n    #endif\n    #ifdef EPFNOSUPPORT\n        case EPFNOSUPPORT: return DRFLAC_PROTOCOL_FAMILY_NOT_SUPPORTED;\n    #endif\n    #ifdef EAFNOSUPPORT\n        case EAFNOSUPPORT: return DRFLAC_ADDRESS_FAMILY_NOT_SUPPORTED;\n    #endif\n    #ifdef EADDRINUSE\n        case EADDRINUSE: return DRFLAC_ALREADY_IN_USE;\n    #endif\n    #ifdef EADDRNOTAVAIL\n        case EADDRNOTAVAIL: return DRFLAC_ERROR;\n    #endif\n    #ifdef ENETDOWN\n        case ENETDOWN: return DRFLAC_NO_NETWORK;\n    #endif\n    #ifdef ENETUNREACH\n        case ENETUNREACH: return DRFLAC_NO_NETWORK;\n    #endif\n    #ifdef ENETRESET\n        case ENETRESET: return DRFLAC_NO_NETWORK;\n    #endif\n    #ifdef ECONNABORTED\n        case ECONNABORTED: return DRFLAC_NO_NETWORK;\n    #endif\n    #ifdef ECONNRESET\n        case ECONNRESET: return DRFLAC_CONNECTION_RESET;\n    #endif\n    #ifdef ENOBUFS\n        case ENOBUFS: return DRFLAC_NO_SPACE;\n    #endif\n    #ifdef EISCONN\n        case EISCONN: return DRFLAC_ALREADY_CONNECTED;\n    #endif\n    #ifdef ENOTCONN\n        case ENOTCONN: return DRFLAC_NOT_CONNECTED;\n    #endif\n    #ifdef ESHUTDOWN\n        case ESHUTDOWN: return DRFLAC_ERROR;\n    #endif\n    #ifdef ETOOMANYREFS\n        case ETOOMANYREFS: return DRFLAC_ERROR;\n    #endif\n    #ifdef ETIMEDOUT\n        case ETIMEDOUT: return DRFLAC_TIMEOUT;\n    #endif\n    #ifdef ECONNREFUSED\n        case ECONNREFUSED: return DRFLAC_CONNECTION_REFUSED;\n    #endif\n    #ifdef EHOSTDOWN\n        case EHOSTDOWN: return DRFLAC_NO_HOST;\n    #endif\n    #ifdef EHOSTUNREACH\n        case EHOSTUNREACH: return DRFLAC_NO_HOST;\n    #endif\n    #ifdef EALREADY\n        case EALREADY: return DRFLAC_IN_PROGRESS;\n    #endif\n    #ifdef EINPROGRESS\n        case EINPROGRESS: return DRFLAC_IN_PROGRESS;\n    #endif\n    #ifdef ESTALE\n        case ESTALE: return DRFLAC_INVALID_FILE;\n    #endif\n    #ifdef EUCLEAN\n        case EUCLEAN: return DRFLAC_ERROR;\n    #endif\n    #ifdef ENOTNAM\n        case ENOTNAM: return DRFLAC_ERROR;\n    #endif\n    #ifdef ENAVAIL\n        case ENAVAIL: return DRFLAC_ERROR;\n    #endif\n    #ifdef EISNAM\n        case EISNAM: return DRFLAC_ERROR;\n    #endif\n    #ifdef EREMOTEIO\n        case EREMOTEIO: return DRFLAC_IO_ERROR;\n    #endif\n    #ifdef EDQUOT\n        case EDQUOT: return DRFLAC_NO_SPACE;\n    #endif\n    #ifdef ENOMEDIUM\n        case ENOMEDIUM: return DRFLAC_DOES_NOT_EXIST;\n    #endif\n    #ifdef EMEDIUMTYPE\n        case EMEDIUMTYPE: return DRFLAC_ERROR;\n    #endif\n    #ifdef ECANCELED\n        case ECANCELED: return DRFLAC_CANCELLED;\n    #endif\n    #ifdef ENOKEY\n        case ENOKEY: return DRFLAC_ERROR;\n    #endif\n    #ifdef EKEYEXPIRED\n        case EKEYEXPIRED: return DRFLAC_ERROR;\n    #endif\n    #ifdef EKEYREVOKED\n        case EKEYREVOKED: return DRFLAC_ERROR;\n    #endif\n    #ifdef EKEYREJECTED\n        case EKEYREJECTED: return DRFLAC_ERROR;\n    #endif\n    #ifdef EOWNERDEAD\n        case EOWNERDEAD: return DRFLAC_ERROR;\n    #endif\n    #ifdef ENOTRECOVERABLE\n        case ENOTRECOVERABLE: return DRFLAC_ERROR;\n    #endif\n    #ifdef ERFKILL\n        case ERFKILL: return DRFLAC_ERROR;\n    #endif\n    #ifdef EHWPOISON\n        case EHWPOISON: return DRFLAC_ERROR;\n    #endif\n        default: return DRFLAC_ERROR;\n    }\n}\n\nstatic drflac_result drflac_fopen(FILE** ppFile, const char* pFilePath, const char* pOpenMode)\n{\n#if defined(_MSC_VER) && _MSC_VER >= 1400\n    errno_t err;\n#endif\n\n    if (ppFile != NULL) {\n        *ppFile = NULL;  /* Safety. */\n    }\n\n    if (pFilePath == NULL || pOpenMode == NULL || ppFile == NULL) {\n        return DRFLAC_INVALID_ARGS;\n    }\n\n#if defined(_MSC_VER) && _MSC_VER >= 1400\n    err = fopen_s(ppFile, pFilePath, pOpenMode);\n    if (err != 0) {\n        return drflac_result_from_errno(err);\n    }\n#else\n#if defined(_WIN32) || defined(__APPLE__)\n    *ppFile = fopen(pFilePath, pOpenMode);\n#else\n    #if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64 && defined(_LARGEFILE64_SOURCE)\n        *ppFile = fopen64(pFilePath, pOpenMode);\n    #else\n        *ppFile = fopen(pFilePath, pOpenMode);\n    #endif\n#endif\n    if (*ppFile == NULL) {\n        drflac_result result = drflac_result_from_errno(errno);\n        if (result == DRFLAC_SUCCESS) {\n            result = DRFLAC_ERROR;   /* Just a safety check to make sure we never ever return success when pFile == NULL. */\n        }\n\n        return result;\n    }\n#endif\n\n    return DRFLAC_SUCCESS;\n}\n\n/*\n_wfopen() isn't always available in all compilation environments.\n\n    * Windows only.\n    * MSVC seems to support it universally as far back as VC6 from what I can tell (haven't checked further back).\n    * MinGW-64 (both 32- and 64-bit) seems to support it.\n    * MinGW wraps it in !defined(__STRICT_ANSI__).\n    * OpenWatcom wraps it in !defined(_NO_EXT_KEYS).\n\nThis can be reviewed as compatibility issues arise. The preference is to use _wfopen_s() and _wfopen() as opposed to the wcsrtombs()\nfallback, so if you notice your compiler not detecting this properly I'm happy to look at adding support.\n*/\n#if defined(_WIN32)\n    #if defined(_MSC_VER) || defined(__MINGW64__) || (!defined(__STRICT_ANSI__) && !defined(_NO_EXT_KEYS))\n        #define DRFLAC_HAS_WFOPEN\n    #endif\n#endif\n\nstatic drflac_result drflac_wfopen(FILE** ppFile, const wchar_t* pFilePath, const wchar_t* pOpenMode, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    if (ppFile != NULL) {\n        *ppFile = NULL;  /* Safety. */\n    }\n\n    if (pFilePath == NULL || pOpenMode == NULL || ppFile == NULL) {\n        return DRFLAC_INVALID_ARGS;\n    }\n\n#if defined(DRFLAC_HAS_WFOPEN)\n    {\n        /* Use _wfopen() on Windows. */\n    #if defined(_MSC_VER) && _MSC_VER >= 1400\n        errno_t err = _wfopen_s(ppFile, pFilePath, pOpenMode);\n        if (err != 0) {\n            return drflac_result_from_errno(err);\n        }\n    #else\n        *ppFile = _wfopen(pFilePath, pOpenMode);\n        if (*ppFile == NULL) {\n            return drflac_result_from_errno(errno);\n        }\n    #endif\n        (void)pAllocationCallbacks;\n    }\n#else\n    /*\n    Use fopen() on anything other than Windows. Requires a conversion. This is annoying because fopen() is locale specific. The only real way I can\n    think of to do this is with wcsrtombs(). Note that wcstombs() is apparently not thread-safe because it uses a static global mbstate_t object for\n    maintaining state. I've checked this with -std=c89 and it works, but if somebody get's a compiler error I'll look into improving compatibility.\n    */\n    {\n        mbstate_t mbs;\n        size_t lenMB;\n        const wchar_t* pFilePathTemp = pFilePath;\n        char* pFilePathMB = NULL;\n        char pOpenModeMB[32] = {0};\n\n        /* Get the length first. */\n        DRFLAC_ZERO_OBJECT(&mbs);\n        lenMB = wcsrtombs(NULL, &pFilePathTemp, 0, &mbs);\n        if (lenMB == (size_t)-1) {\n            return drflac_result_from_errno(errno);\n        }\n\n        pFilePathMB = (char*)drflac__malloc_from_callbacks(lenMB + 1, pAllocationCallbacks);\n        if (pFilePathMB == NULL) {\n            return DRFLAC_OUT_OF_MEMORY;\n        }\n\n        pFilePathTemp = pFilePath;\n        DRFLAC_ZERO_OBJECT(&mbs);\n        wcsrtombs(pFilePathMB, &pFilePathTemp, lenMB + 1, &mbs);\n\n        /* The open mode should always consist of ASCII characters so we should be able to do a trivial conversion. */\n        {\n            size_t i = 0;\n            for (;;) {\n                if (pOpenMode[i] == 0) {\n                    pOpenModeMB[i] = '\\0';\n                    break;\n                }\n\n                pOpenModeMB[i] = (char)pOpenMode[i];\n                i += 1;\n            }\n        }\n\n        *ppFile = fopen(pFilePathMB, pOpenModeMB);\n\n        drflac__free_from_callbacks(pFilePathMB, pAllocationCallbacks);\n    }\n\n    if (*ppFile == NULL) {\n        return DRFLAC_ERROR;\n    }\n#endif\n\n    return DRFLAC_SUCCESS;\n}\n\nstatic size_t drflac__on_read_stdio(void* pUserData, void* bufferOut, size_t bytesToRead)\n{\n    return fread(bufferOut, 1, bytesToRead, (FILE*)pUserData);\n}\n\nstatic drflac_bool32 drflac__on_seek_stdio(void* pUserData, int offset, drflac_seek_origin origin)\n{\n    DRFLAC_ASSERT(offset >= 0);  /* <-- Never seek backwards. */\n\n    return fseek((FILE*)pUserData, offset, (origin == drflac_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0;\n}\n\n\nDRFLAC_API drflac* drflac_open_file(const char* pFileName, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    drflac* pFlac;\n    FILE* pFile;\n\n    if (drflac_fopen(&pFile, pFileName, \"rb\") != DRFLAC_SUCCESS) {\n        return NULL;\n    }\n\n    pFlac = drflac_open(drflac__on_read_stdio, drflac__on_seek_stdio, (void*)pFile, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        fclose(pFile);\n        return NULL;\n    }\n\n    return pFlac;\n}\n\nDRFLAC_API drflac* drflac_open_file_w(const wchar_t* pFileName, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    drflac* pFlac;\n    FILE* pFile;\n\n    if (drflac_wfopen(&pFile, pFileName, L\"rb\", pAllocationCallbacks) != DRFLAC_SUCCESS) {\n        return NULL;\n    }\n\n    pFlac = drflac_open(drflac__on_read_stdio, drflac__on_seek_stdio, (void*)pFile, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        fclose(pFile);\n        return NULL;\n    }\n\n    return pFlac;\n}\n\nDRFLAC_API drflac* drflac_open_file_with_metadata(const char* pFileName, drflac_meta_proc onMeta, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    drflac* pFlac;\n    FILE* pFile;\n\n    if (drflac_fopen(&pFile, pFileName, \"rb\") != DRFLAC_SUCCESS) {\n        return NULL;\n    }\n\n    pFlac = drflac_open_with_metadata_private(drflac__on_read_stdio, drflac__on_seek_stdio, onMeta, drflac_container_unknown, (void*)pFile, pUserData, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        fclose(pFile);\n        return pFlac;\n    }\n\n    return pFlac;\n}\n\nDRFLAC_API drflac* drflac_open_file_with_metadata_w(const wchar_t* pFileName, drflac_meta_proc onMeta, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    drflac* pFlac;\n    FILE* pFile;\n\n    if (drflac_wfopen(&pFile, pFileName, L\"rb\", pAllocationCallbacks) != DRFLAC_SUCCESS) {\n        return NULL;\n    }\n\n    pFlac = drflac_open_with_metadata_private(drflac__on_read_stdio, drflac__on_seek_stdio, onMeta, drflac_container_unknown, (void*)pFile, pUserData, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        fclose(pFile);\n        return pFlac;\n    }\n\n    return pFlac;\n}\n#endif  /* DR_FLAC_NO_STDIO */\n\nstatic size_t drflac__on_read_memory(void* pUserData, void* bufferOut, size_t bytesToRead)\n{\n    drflac__memory_stream* memoryStream = (drflac__memory_stream*)pUserData;\n    size_t bytesRemaining;\n\n    DRFLAC_ASSERT(memoryStream != NULL);\n    DRFLAC_ASSERT(memoryStream->dataSize >= memoryStream->currentReadPos);\n\n    bytesRemaining = memoryStream->dataSize - memoryStream->currentReadPos;\n    if (bytesToRead > bytesRemaining) {\n        bytesToRead = bytesRemaining;\n    }\n\n    if (bytesToRead > 0) {\n        DRFLAC_COPY_MEMORY(bufferOut, memoryStream->data + memoryStream->currentReadPos, bytesToRead);\n        memoryStream->currentReadPos += bytesToRead;\n    }\n\n    return bytesToRead;\n}\n\nstatic drflac_bool32 drflac__on_seek_memory(void* pUserData, int offset, drflac_seek_origin origin)\n{\n    drflac__memory_stream* memoryStream = (drflac__memory_stream*)pUserData;\n\n    DRFLAC_ASSERT(memoryStream != NULL);\n    DRFLAC_ASSERT(offset >= 0); /* <-- Never seek backwards. */\n\n    if (offset > (drflac_int64)memoryStream->dataSize) {\n        return DRFLAC_FALSE;\n    }\n\n    if (origin == drflac_seek_origin_current) {\n        if (memoryStream->currentReadPos + offset <= memoryStream->dataSize) {\n            memoryStream->currentReadPos += offset;\n        } else {\n            return DRFLAC_FALSE;  /* Trying to seek too far forward. */\n        }\n    } else {\n        if ((drflac_uint32)offset <= memoryStream->dataSize) {\n            memoryStream->currentReadPos = offset;\n        } else {\n            return DRFLAC_FALSE;  /* Trying to seek too far forward. */\n        }\n    }\n\n    return DRFLAC_TRUE;\n}\n\nDRFLAC_API drflac* drflac_open_memory(const void* pData, size_t dataSize, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    drflac__memory_stream memoryStream;\n    drflac* pFlac;\n\n    memoryStream.data = (const drflac_uint8*)pData;\n    memoryStream.dataSize = dataSize;\n    memoryStream.currentReadPos = 0;\n    pFlac = drflac_open(drflac__on_read_memory, drflac__on_seek_memory, &memoryStream, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return NULL;\n    }\n\n    pFlac->memoryStream = memoryStream;\n\n    /* This is an awful hack... */\n#ifndef DR_FLAC_NO_OGG\n    if (pFlac->container == drflac_container_ogg)\n    {\n        drflac_oggbs* oggbs = (drflac_oggbs*)pFlac->_oggbs;\n        oggbs->pUserData = &pFlac->memoryStream;\n    }\n    else\n#endif\n    {\n        pFlac->bs.pUserData = &pFlac->memoryStream;\n    }\n\n    return pFlac;\n}\n\nDRFLAC_API drflac* drflac_open_memory_with_metadata(const void* pData, size_t dataSize, drflac_meta_proc onMeta, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    drflac__memory_stream memoryStream;\n    drflac* pFlac;\n\n    memoryStream.data = (const drflac_uint8*)pData;\n    memoryStream.dataSize = dataSize;\n    memoryStream.currentReadPos = 0;\n    pFlac = drflac_open_with_metadata_private(drflac__on_read_memory, drflac__on_seek_memory, onMeta, drflac_container_unknown, &memoryStream, pUserData, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return NULL;\n    }\n\n    pFlac->memoryStream = memoryStream;\n\n    /* This is an awful hack... */\n#ifndef DR_FLAC_NO_OGG\n    if (pFlac->container == drflac_container_ogg)\n    {\n        drflac_oggbs* oggbs = (drflac_oggbs*)pFlac->_oggbs;\n        oggbs->pUserData = &pFlac->memoryStream;\n    }\n    else\n#endif\n    {\n        pFlac->bs.pUserData = &pFlac->memoryStream;\n    }\n\n    return pFlac;\n}\n\n\n\nDRFLAC_API drflac* drflac_open(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    return drflac_open_with_metadata_private(onRead, onSeek, NULL, drflac_container_unknown, pUserData, pUserData, pAllocationCallbacks);\n}\nDRFLAC_API drflac* drflac_open_relaxed(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_container container, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    return drflac_open_with_metadata_private(onRead, onSeek, NULL, container, pUserData, pUserData, pAllocationCallbacks);\n}\n\nDRFLAC_API drflac* drflac_open_with_metadata(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    return drflac_open_with_metadata_private(onRead, onSeek, onMeta, drflac_container_unknown, pUserData, pUserData, pAllocationCallbacks);\n}\nDRFLAC_API drflac* drflac_open_with_metadata_relaxed(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, drflac_container container, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    return drflac_open_with_metadata_private(onRead, onSeek, onMeta, container, pUserData, pUserData, pAllocationCallbacks);\n}\n\nDRFLAC_API void drflac_close(drflac* pFlac)\n{\n    if (pFlac == NULL) {\n        return;\n    }\n\n#ifndef DR_FLAC_NO_STDIO\n    /*\n    If we opened the file with drflac_open_file() we will want to close the file handle. We can know whether or not drflac_open_file()\n    was used by looking at the callbacks.\n    */\n    if (pFlac->bs.onRead == drflac__on_read_stdio) {\n        fclose((FILE*)pFlac->bs.pUserData);\n    }\n\n#ifndef DR_FLAC_NO_OGG\n    /* Need to clean up Ogg streams a bit differently due to the way the bit streaming is chained. */\n    if (pFlac->container == drflac_container_ogg) {\n        drflac_oggbs* oggbs = (drflac_oggbs*)pFlac->_oggbs;\n        DRFLAC_ASSERT(pFlac->bs.onRead == drflac__on_read_ogg);\n\n        if (oggbs->onRead == drflac__on_read_stdio) {\n            fclose((FILE*)oggbs->pUserData);\n        }\n    }\n#endif\n#endif\n\n    drflac__free_from_callbacks(pFlac, &pFlac->allocationCallbacks);\n}\n\n\n#if 0\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_left_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples)\n{\n    drflac_uint64 i;\n    for (i = 0; i < frameCount; ++i) {\n        drflac_uint32 left  = (drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n        drflac_uint32 side  = (drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n        drflac_uint32 right = left - side;\n\n        pOutputSamples[i*2+0] = (drflac_int32)left;\n        pOutputSamples[i*2+1] = (drflac_int32)right;\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_left_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n    for (i = 0; i < frameCount4; ++i) {\n        drflac_uint32 left0 = pInputSamples0U32[i*4+0] << shift0;\n        drflac_uint32 left1 = pInputSamples0U32[i*4+1] << shift0;\n        drflac_uint32 left2 = pInputSamples0U32[i*4+2] << shift0;\n        drflac_uint32 left3 = pInputSamples0U32[i*4+3] << shift0;\n\n        drflac_uint32 side0 = pInputSamples1U32[i*4+0] << shift1;\n        drflac_uint32 side1 = pInputSamples1U32[i*4+1] << shift1;\n        drflac_uint32 side2 = pInputSamples1U32[i*4+2] << shift1;\n        drflac_uint32 side3 = pInputSamples1U32[i*4+3] << shift1;\n\n        drflac_uint32 right0 = left0 - side0;\n        drflac_uint32 right1 = left1 - side1;\n        drflac_uint32 right2 = left2 - side2;\n        drflac_uint32 right3 = left3 - side3;\n\n        pOutputSamples[i*8+0] = (drflac_int32)left0;\n        pOutputSamples[i*8+1] = (drflac_int32)right0;\n        pOutputSamples[i*8+2] = (drflac_int32)left1;\n        pOutputSamples[i*8+3] = (drflac_int32)right1;\n        pOutputSamples[i*8+4] = (drflac_int32)left2;\n        pOutputSamples[i*8+5] = (drflac_int32)right2;\n        pOutputSamples[i*8+6] = (drflac_int32)left3;\n        pOutputSamples[i*8+7] = (drflac_int32)right3;\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        drflac_uint32 left  = pInputSamples0U32[i] << shift0;\n        drflac_uint32 side  = pInputSamples1U32[i] << shift1;\n        drflac_uint32 right = left - side;\n\n        pOutputSamples[i*2+0] = (drflac_int32)left;\n        pOutputSamples[i*2+1] = (drflac_int32)right;\n    }\n}\n\n#if defined(DRFLAC_SUPPORT_SSE2)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_left_side__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n    DRFLAC_ASSERT(pFlac->bitsPerSample <= 24);\n\n    for (i = 0; i < frameCount4; ++i) {\n        __m128i left  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0);\n        __m128i side  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1);\n        __m128i right = _mm_sub_epi32(left, side);\n\n        _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 0), _mm_unpacklo_epi32(left, right));\n        _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 4), _mm_unpackhi_epi32(left, right));\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        drflac_uint32 left  = pInputSamples0U32[i] << shift0;\n        drflac_uint32 side  = pInputSamples1U32[i] << shift1;\n        drflac_uint32 right = left - side;\n\n        pOutputSamples[i*2+0] = (drflac_int32)left;\n        pOutputSamples[i*2+1] = (drflac_int32)right;\n    }\n}\n#endif\n\n#if defined(DRFLAC_SUPPORT_NEON)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_left_side__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    int32x4_t shift0_4;\n    int32x4_t shift1_4;\n\n    DRFLAC_ASSERT(pFlac->bitsPerSample <= 24);\n\n    shift0_4 = vdupq_n_s32(shift0);\n    shift1_4 = vdupq_n_s32(shift1);\n\n    for (i = 0; i < frameCount4; ++i) {\n        uint32x4_t left;\n        uint32x4_t side;\n        uint32x4_t right;\n\n        left  = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4);\n        side  = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4);\n        right = vsubq_u32(left, side);\n\n        drflac__vst2q_u32((drflac_uint32*)pOutputSamples + i*8, vzipq_u32(left, right));\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        drflac_uint32 left  = pInputSamples0U32[i] << shift0;\n        drflac_uint32 side  = pInputSamples1U32[i] << shift1;\n        drflac_uint32 right = left - side;\n\n        pOutputSamples[i*2+0] = (drflac_int32)left;\n        pOutputSamples[i*2+1] = (drflac_int32)right;\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_left_side(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples)\n{\n#if defined(DRFLAC_SUPPORT_SSE2)\n    if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_s32__decode_left_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(DRFLAC_SUPPORT_NEON)\n    if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_s32__decode_left_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n        /* Scalar fallback. */\n#if 0\n        drflac_read_pcm_frames_s32__decode_left_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        drflac_read_pcm_frames_s32__decode_left_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\n\n\n#if 0\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_right_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples)\n{\n    drflac_uint64 i;\n    for (i = 0; i < frameCount; ++i) {\n        drflac_uint32 side  = (drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n        drflac_uint32 right = (drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n        drflac_uint32 left  = right + side;\n\n        pOutputSamples[i*2+0] = (drflac_int32)left;\n        pOutputSamples[i*2+1] = (drflac_int32)right;\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_right_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n    for (i = 0; i < frameCount4; ++i) {\n        drflac_uint32 side0  = pInputSamples0U32[i*4+0] << shift0;\n        drflac_uint32 side1  = pInputSamples0U32[i*4+1] << shift0;\n        drflac_uint32 side2  = pInputSamples0U32[i*4+2] << shift0;\n        drflac_uint32 side3  = pInputSamples0U32[i*4+3] << shift0;\n\n        drflac_uint32 right0 = pInputSamples1U32[i*4+0] << shift1;\n        drflac_uint32 right1 = pInputSamples1U32[i*4+1] << shift1;\n        drflac_uint32 right2 = pInputSamples1U32[i*4+2] << shift1;\n        drflac_uint32 right3 = pInputSamples1U32[i*4+3] << shift1;\n\n        drflac_uint32 left0 = right0 + side0;\n        drflac_uint32 left1 = right1 + side1;\n        drflac_uint32 left2 = right2 + side2;\n        drflac_uint32 left3 = right3 + side3;\n\n        pOutputSamples[i*8+0] = (drflac_int32)left0;\n        pOutputSamples[i*8+1] = (drflac_int32)right0;\n        pOutputSamples[i*8+2] = (drflac_int32)left1;\n        pOutputSamples[i*8+3] = (drflac_int32)right1;\n        pOutputSamples[i*8+4] = (drflac_int32)left2;\n        pOutputSamples[i*8+5] = (drflac_int32)right2;\n        pOutputSamples[i*8+6] = (drflac_int32)left3;\n        pOutputSamples[i*8+7] = (drflac_int32)right3;\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        drflac_uint32 side  = pInputSamples0U32[i] << shift0;\n        drflac_uint32 right = pInputSamples1U32[i] << shift1;\n        drflac_uint32 left  = right + side;\n\n        pOutputSamples[i*2+0] = (drflac_int32)left;\n        pOutputSamples[i*2+1] = (drflac_int32)right;\n    }\n}\n\n#if defined(DRFLAC_SUPPORT_SSE2)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_right_side__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n    DRFLAC_ASSERT(pFlac->bitsPerSample <= 24);\n\n    for (i = 0; i < frameCount4; ++i) {\n        __m128i side  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0);\n        __m128i right = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1);\n        __m128i left  = _mm_add_epi32(right, side);\n\n        _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 0), _mm_unpacklo_epi32(left, right));\n        _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 4), _mm_unpackhi_epi32(left, right));\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        drflac_uint32 side  = pInputSamples0U32[i] << shift0;\n        drflac_uint32 right = pInputSamples1U32[i] << shift1;\n        drflac_uint32 left  = right + side;\n\n        pOutputSamples[i*2+0] = (drflac_int32)left;\n        pOutputSamples[i*2+1] = (drflac_int32)right;\n    }\n}\n#endif\n\n#if defined(DRFLAC_SUPPORT_NEON)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_right_side__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    int32x4_t shift0_4;\n    int32x4_t shift1_4;\n\n    DRFLAC_ASSERT(pFlac->bitsPerSample <= 24);\n\n    shift0_4 = vdupq_n_s32(shift0);\n    shift1_4 = vdupq_n_s32(shift1);\n\n    for (i = 0; i < frameCount4; ++i) {\n        uint32x4_t side;\n        uint32x4_t right;\n        uint32x4_t left;\n\n        side  = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4);\n        right = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4);\n        left  = vaddq_u32(right, side);\n\n        drflac__vst2q_u32((drflac_uint32*)pOutputSamples + i*8, vzipq_u32(left, right));\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        drflac_uint32 side  = pInputSamples0U32[i] << shift0;\n        drflac_uint32 right = pInputSamples1U32[i] << shift1;\n        drflac_uint32 left  = right + side;\n\n        pOutputSamples[i*2+0] = (drflac_int32)left;\n        pOutputSamples[i*2+1] = (drflac_int32)right;\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_right_side(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples)\n{\n#if defined(DRFLAC_SUPPORT_SSE2)\n    if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_s32__decode_right_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(DRFLAC_SUPPORT_NEON)\n    if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_s32__decode_right_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n        /* Scalar fallback. */\n#if 0\n        drflac_read_pcm_frames_s32__decode_right_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        drflac_read_pcm_frames_s32__decode_right_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\n\n\n#if 0\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_mid_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples)\n{\n    for (drflac_uint64 i = 0; i < frameCount; ++i) {\n        drflac_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n        drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n        mid = (mid << 1) | (side & 0x01);\n\n        pOutputSamples[i*2+0] = (drflac_int32)((drflac_uint32)((drflac_int32)(mid + side) >> 1) << unusedBitsPerSample);\n        pOutputSamples[i*2+1] = (drflac_int32)((drflac_uint32)((drflac_int32)(mid - side) >> 1) << unusedBitsPerSample);\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_mid_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_int32 shift = unusedBitsPerSample;\n\n    if (shift > 0) {\n        shift -= 1;\n        for (i = 0; i < frameCount4; ++i) {\n            drflac_uint32 temp0L;\n            drflac_uint32 temp1L;\n            drflac_uint32 temp2L;\n            drflac_uint32 temp3L;\n            drflac_uint32 temp0R;\n            drflac_uint32 temp1R;\n            drflac_uint32 temp2R;\n            drflac_uint32 temp3R;\n\n            drflac_uint32 mid0  = pInputSamples0U32[i*4+0] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 mid1  = pInputSamples0U32[i*4+1] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 mid2  = pInputSamples0U32[i*4+2] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 mid3  = pInputSamples0U32[i*4+3] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n\n            drflac_uint32 side0 = pInputSamples1U32[i*4+0] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            drflac_uint32 side1 = pInputSamples1U32[i*4+1] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            drflac_uint32 side2 = pInputSamples1U32[i*4+2] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            drflac_uint32 side3 = pInputSamples1U32[i*4+3] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n            mid0 = (mid0 << 1) | (side0 & 0x01);\n            mid1 = (mid1 << 1) | (side1 & 0x01);\n            mid2 = (mid2 << 1) | (side2 & 0x01);\n            mid3 = (mid3 << 1) | (side3 & 0x01);\n\n            temp0L = (mid0 + side0) << shift;\n            temp1L = (mid1 + side1) << shift;\n            temp2L = (mid2 + side2) << shift;\n            temp3L = (mid3 + side3) << shift;\n\n            temp0R = (mid0 - side0) << shift;\n            temp1R = (mid1 - side1) << shift;\n            temp2R = (mid2 - side2) << shift;\n            temp3R = (mid3 - side3) << shift;\n\n            pOutputSamples[i*8+0] = (drflac_int32)temp0L;\n            pOutputSamples[i*8+1] = (drflac_int32)temp0R;\n            pOutputSamples[i*8+2] = (drflac_int32)temp1L;\n            pOutputSamples[i*8+3] = (drflac_int32)temp1R;\n            pOutputSamples[i*8+4] = (drflac_int32)temp2L;\n            pOutputSamples[i*8+5] = (drflac_int32)temp2R;\n            pOutputSamples[i*8+6] = (drflac_int32)temp3L;\n            pOutputSamples[i*8+7] = (drflac_int32)temp3R;\n        }\n    } else {\n        for (i = 0; i < frameCount4; ++i) {\n            drflac_uint32 temp0L;\n            drflac_uint32 temp1L;\n            drflac_uint32 temp2L;\n            drflac_uint32 temp3L;\n            drflac_uint32 temp0R;\n            drflac_uint32 temp1R;\n            drflac_uint32 temp2R;\n            drflac_uint32 temp3R;\n\n            drflac_uint32 mid0  = pInputSamples0U32[i*4+0] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 mid1  = pInputSamples0U32[i*4+1] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 mid2  = pInputSamples0U32[i*4+2] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 mid3  = pInputSamples0U32[i*4+3] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n\n            drflac_uint32 side0 = pInputSamples1U32[i*4+0] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            drflac_uint32 side1 = pInputSamples1U32[i*4+1] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            drflac_uint32 side2 = pInputSamples1U32[i*4+2] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            drflac_uint32 side3 = pInputSamples1U32[i*4+3] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n            mid0 = (mid0 << 1) | (side0 & 0x01);\n            mid1 = (mid1 << 1) | (side1 & 0x01);\n            mid2 = (mid2 << 1) | (side2 & 0x01);\n            mid3 = (mid3 << 1) | (side3 & 0x01);\n\n            temp0L = (drflac_uint32)((drflac_int32)(mid0 + side0) >> 1);\n            temp1L = (drflac_uint32)((drflac_int32)(mid1 + side1) >> 1);\n            temp2L = (drflac_uint32)((drflac_int32)(mid2 + side2) >> 1);\n            temp3L = (drflac_uint32)((drflac_int32)(mid3 + side3) >> 1);\n\n            temp0R = (drflac_uint32)((drflac_int32)(mid0 - side0) >> 1);\n            temp1R = (drflac_uint32)((drflac_int32)(mid1 - side1) >> 1);\n            temp2R = (drflac_uint32)((drflac_int32)(mid2 - side2) >> 1);\n            temp3R = (drflac_uint32)((drflac_int32)(mid3 - side3) >> 1);\n\n            pOutputSamples[i*8+0] = (drflac_int32)temp0L;\n            pOutputSamples[i*8+1] = (drflac_int32)temp0R;\n            pOutputSamples[i*8+2] = (drflac_int32)temp1L;\n            pOutputSamples[i*8+3] = (drflac_int32)temp1R;\n            pOutputSamples[i*8+4] = (drflac_int32)temp2L;\n            pOutputSamples[i*8+5] = (drflac_int32)temp2R;\n            pOutputSamples[i*8+6] = (drflac_int32)temp3L;\n            pOutputSamples[i*8+7] = (drflac_int32)temp3R;\n        }\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        drflac_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n        drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n        mid = (mid << 1) | (side & 0x01);\n\n        pOutputSamples[i*2+0] = (drflac_int32)((drflac_uint32)((drflac_int32)(mid + side) >> 1) << unusedBitsPerSample);\n        pOutputSamples[i*2+1] = (drflac_int32)((drflac_uint32)((drflac_int32)(mid - side) >> 1) << unusedBitsPerSample);\n    }\n}\n\n#if defined(DRFLAC_SUPPORT_SSE2)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_mid_side__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_int32 shift = unusedBitsPerSample;\n\n    DRFLAC_ASSERT(pFlac->bitsPerSample <= 24);\n\n    if (shift == 0) {\n        for (i = 0; i < frameCount4; ++i) {\n            __m128i mid;\n            __m128i side;\n            __m128i left;\n            __m128i right;\n\n            mid   = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n            side  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n\n            mid   = _mm_or_si128(_mm_slli_epi32(mid, 1), _mm_and_si128(side, _mm_set1_epi32(0x01)));\n\n            left  = _mm_srai_epi32(_mm_add_epi32(mid, side), 1);\n            right = _mm_srai_epi32(_mm_sub_epi32(mid, side), 1);\n\n            _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 0), _mm_unpacklo_epi32(left, right));\n            _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 4), _mm_unpackhi_epi32(left, right));\n        }\n\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            drflac_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n            mid = (mid << 1) | (side & 0x01);\n\n            pOutputSamples[i*2+0] = (drflac_int32)(mid + side) >> 1;\n            pOutputSamples[i*2+1] = (drflac_int32)(mid - side) >> 1;\n        }\n    } else {\n        shift -= 1;\n        for (i = 0; i < frameCount4; ++i) {\n            __m128i mid;\n            __m128i side;\n            __m128i left;\n            __m128i right;\n\n            mid   = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n            side  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n\n            mid   = _mm_or_si128(_mm_slli_epi32(mid, 1), _mm_and_si128(side, _mm_set1_epi32(0x01)));\n\n            left  = _mm_slli_epi32(_mm_add_epi32(mid, side), shift);\n            right = _mm_slli_epi32(_mm_sub_epi32(mid, side), shift);\n\n            _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 0), _mm_unpacklo_epi32(left, right));\n            _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 4), _mm_unpackhi_epi32(left, right));\n        }\n\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            drflac_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n            mid = (mid << 1) | (side & 0x01);\n\n            pOutputSamples[i*2+0] = (drflac_int32)((mid + side) << shift);\n            pOutputSamples[i*2+1] = (drflac_int32)((mid - side) << shift);\n        }\n    }\n}\n#endif\n\n#if defined(DRFLAC_SUPPORT_NEON)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_mid_side__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_int32 shift = unusedBitsPerSample;\n    int32x4_t  wbpsShift0_4; /* wbps = Wasted Bits Per Sample */\n    int32x4_t  wbpsShift1_4; /* wbps = Wasted Bits Per Sample */\n    uint32x4_t one4;\n\n    DRFLAC_ASSERT(pFlac->bitsPerSample <= 24);\n\n    wbpsShift0_4 = vdupq_n_s32(pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n    wbpsShift1_4 = vdupq_n_s32(pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n    one4         = vdupq_n_u32(1);\n\n    if (shift == 0) {\n        for (i = 0; i < frameCount4; ++i) {\n            uint32x4_t mid;\n            uint32x4_t side;\n            int32x4_t left;\n            int32x4_t right;\n\n            mid   = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), wbpsShift0_4);\n            side  = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), wbpsShift1_4);\n\n            mid   = vorrq_u32(vshlq_n_u32(mid, 1), vandq_u32(side, one4));\n\n            left  = vshrq_n_s32(vreinterpretq_s32_u32(vaddq_u32(mid, side)), 1);\n            right = vshrq_n_s32(vreinterpretq_s32_u32(vsubq_u32(mid, side)), 1);\n\n            drflac__vst2q_s32(pOutputSamples + i*8, vzipq_s32(left, right));\n        }\n\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            drflac_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n            mid = (mid << 1) | (side & 0x01);\n\n            pOutputSamples[i*2+0] = (drflac_int32)(mid + side) >> 1;\n            pOutputSamples[i*2+1] = (drflac_int32)(mid - side) >> 1;\n        }\n    } else {\n        int32x4_t shift4;\n\n        shift -= 1;\n        shift4 = vdupq_n_s32(shift);\n\n        for (i = 0; i < frameCount4; ++i) {\n            uint32x4_t mid;\n            uint32x4_t side;\n            int32x4_t left;\n            int32x4_t right;\n\n            mid   = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), wbpsShift0_4);\n            side  = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), wbpsShift1_4);\n\n            mid   = vorrq_u32(vshlq_n_u32(mid, 1), vandq_u32(side, one4));\n\n            left  = vreinterpretq_s32_u32(vshlq_u32(vaddq_u32(mid, side), shift4));\n            right = vreinterpretq_s32_u32(vshlq_u32(vsubq_u32(mid, side), shift4));\n\n            drflac__vst2q_s32(pOutputSamples + i*8, vzipq_s32(left, right));\n        }\n\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            drflac_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n            mid = (mid << 1) | (side & 0x01);\n\n            pOutputSamples[i*2+0] = (drflac_int32)((mid + side) << shift);\n            pOutputSamples[i*2+1] = (drflac_int32)((mid - side) << shift);\n        }\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_mid_side(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples)\n{\n#if defined(DRFLAC_SUPPORT_SSE2)\n    if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_s32__decode_mid_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(DRFLAC_SUPPORT_NEON)\n    if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_s32__decode_mid_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n        /* Scalar fallback. */\n#if 0\n        drflac_read_pcm_frames_s32__decode_mid_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        drflac_read_pcm_frames_s32__decode_mid_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\n\n\n#if 0\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_independent_stereo__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples)\n{\n    for (drflac_uint64 i = 0; i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (drflac_int32)((drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample));\n        pOutputSamples[i*2+1] = (drflac_int32)((drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample));\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_independent_stereo__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n    for (i = 0; i < frameCount4; ++i) {\n        drflac_uint32 tempL0 = pInputSamples0U32[i*4+0] << shift0;\n        drflac_uint32 tempL1 = pInputSamples0U32[i*4+1] << shift0;\n        drflac_uint32 tempL2 = pInputSamples0U32[i*4+2] << shift0;\n        drflac_uint32 tempL3 = pInputSamples0U32[i*4+3] << shift0;\n\n        drflac_uint32 tempR0 = pInputSamples1U32[i*4+0] << shift1;\n        drflac_uint32 tempR1 = pInputSamples1U32[i*4+1] << shift1;\n        drflac_uint32 tempR2 = pInputSamples1U32[i*4+2] << shift1;\n        drflac_uint32 tempR3 = pInputSamples1U32[i*4+3] << shift1;\n\n        pOutputSamples[i*8+0] = (drflac_int32)tempL0;\n        pOutputSamples[i*8+1] = (drflac_int32)tempR0;\n        pOutputSamples[i*8+2] = (drflac_int32)tempL1;\n        pOutputSamples[i*8+3] = (drflac_int32)tempR1;\n        pOutputSamples[i*8+4] = (drflac_int32)tempL2;\n        pOutputSamples[i*8+5] = (drflac_int32)tempR2;\n        pOutputSamples[i*8+6] = (drflac_int32)tempL3;\n        pOutputSamples[i*8+7] = (drflac_int32)tempR3;\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (drflac_int32)(pInputSamples0U32[i] << shift0);\n        pOutputSamples[i*2+1] = (drflac_int32)(pInputSamples1U32[i] << shift1);\n    }\n}\n\n#if defined(DRFLAC_SUPPORT_SSE2)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_independent_stereo__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n    for (i = 0; i < frameCount4; ++i) {\n        __m128i left  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0);\n        __m128i right = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1);\n\n        _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 0), _mm_unpacklo_epi32(left, right));\n        _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 4), _mm_unpackhi_epi32(left, right));\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (drflac_int32)(pInputSamples0U32[i] << shift0);\n        pOutputSamples[i*2+1] = (drflac_int32)(pInputSamples1U32[i] << shift1);\n    }\n}\n#endif\n\n#if defined(DRFLAC_SUPPORT_NEON)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_independent_stereo__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n    int32x4_t shift4_0 = vdupq_n_s32(shift0);\n    int32x4_t shift4_1 = vdupq_n_s32(shift1);\n\n    for (i = 0; i < frameCount4; ++i) {\n        int32x4_t left;\n        int32x4_t right;\n\n        left  = vreinterpretq_s32_u32(vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift4_0));\n        right = vreinterpretq_s32_u32(vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift4_1));\n\n        drflac__vst2q_s32(pOutputSamples + i*8, vzipq_s32(left, right));\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (drflac_int32)(pInputSamples0U32[i] << shift0);\n        pOutputSamples[i*2+1] = (drflac_int32)(pInputSamples1U32[i] << shift1);\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_independent_stereo(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples)\n{\n#if defined(DRFLAC_SUPPORT_SSE2)\n    if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_s32__decode_independent_stereo__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(DRFLAC_SUPPORT_NEON)\n    if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_s32__decode_independent_stereo__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n        /* Scalar fallback. */\n#if 0\n        drflac_read_pcm_frames_s32__decode_independent_stereo__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        drflac_read_pcm_frames_s32__decode_independent_stereo__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\n\n\nDRFLAC_API drflac_uint64 drflac_read_pcm_frames_s32(drflac* pFlac, drflac_uint64 framesToRead, drflac_int32* pBufferOut)\n{\n    drflac_uint64 framesRead;\n    drflac_uint32 unusedBitsPerSample;\n\n    if (pFlac == NULL || framesToRead == 0) {\n        return 0;\n    }\n\n    if (pBufferOut == NULL) {\n        return drflac__seek_forward_by_pcm_frames(pFlac, framesToRead);\n    }\n\n    DRFLAC_ASSERT(pFlac->bitsPerSample <= 32);\n    unusedBitsPerSample = 32 - pFlac->bitsPerSample;\n\n    framesRead = 0;\n    while (framesToRead > 0) {\n        /* If we've run out of samples in this frame, go to the next. */\n        if (pFlac->currentFLACFrame.pcmFramesRemaining == 0) {\n            if (!drflac__read_and_decode_next_flac_frame(pFlac)) {\n                break;  /* Couldn't read the next frame, so just break from the loop and return. */\n            }\n        } else {\n            unsigned int channelCount = drflac__get_channel_count_from_channel_assignment(pFlac->currentFLACFrame.header.channelAssignment);\n            drflac_uint64 iFirstPCMFrame = pFlac->currentFLACFrame.header.blockSizeInPCMFrames - pFlac->currentFLACFrame.pcmFramesRemaining;\n            drflac_uint64 frameCountThisIteration = framesToRead;\n\n            if (frameCountThisIteration > pFlac->currentFLACFrame.pcmFramesRemaining) {\n                frameCountThisIteration = pFlac->currentFLACFrame.pcmFramesRemaining;\n            }\n\n            if (channelCount == 2) {\n                const drflac_int32* pDecodedSamples0 = pFlac->currentFLACFrame.subframes[0].pSamplesS32 + iFirstPCMFrame;\n                const drflac_int32* pDecodedSamples1 = pFlac->currentFLACFrame.subframes[1].pSamplesS32 + iFirstPCMFrame;\n\n                switch (pFlac->currentFLACFrame.header.channelAssignment)\n                {\n                    case DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE:\n                    {\n                        drflac_read_pcm_frames_s32__decode_left_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n\n                    case DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE:\n                    {\n                        drflac_read_pcm_frames_s32__decode_right_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n\n                    case DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE:\n                    {\n                        drflac_read_pcm_frames_s32__decode_mid_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n\n                    case DRFLAC_CHANNEL_ASSIGNMENT_INDEPENDENT:\n                    default:\n                    {\n                        drflac_read_pcm_frames_s32__decode_independent_stereo(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n                }\n            } else {\n                /* Generic interleaving. */\n                drflac_uint64 i;\n                for (i = 0; i < frameCountThisIteration; ++i) {\n                    unsigned int j;\n                    for (j = 0; j < channelCount; ++j) {\n                        pBufferOut[(i*channelCount)+j] = (drflac_int32)((drflac_uint32)(pFlac->currentFLACFrame.subframes[j].pSamplesS32[iFirstPCMFrame + i]) << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[j].wastedBitsPerSample));\n                    }\n                }\n            }\n\n            framesRead                += frameCountThisIteration;\n            pBufferOut                += frameCountThisIteration * channelCount;\n            framesToRead              -= frameCountThisIteration;\n            pFlac->currentPCMFrame    += frameCountThisIteration;\n            pFlac->currentFLACFrame.pcmFramesRemaining -= (drflac_uint32)frameCountThisIteration;\n        }\n    }\n\n    return framesRead;\n}\n\n\n#if 0\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_left_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples)\n{\n    drflac_uint64 i;\n    for (i = 0; i < frameCount; ++i) {\n        drflac_uint32 left  = (drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n        drflac_uint32 side  = (drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n        drflac_uint32 right = left - side;\n\n        left  >>= 16;\n        right >>= 16;\n\n        pOutputSamples[i*2+0] = (drflac_int16)left;\n        pOutputSamples[i*2+1] = (drflac_int16)right;\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_left_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n    for (i = 0; i < frameCount4; ++i) {\n        drflac_uint32 left0 = pInputSamples0U32[i*4+0] << shift0;\n        drflac_uint32 left1 = pInputSamples0U32[i*4+1] << shift0;\n        drflac_uint32 left2 = pInputSamples0U32[i*4+2] << shift0;\n        drflac_uint32 left3 = pInputSamples0U32[i*4+3] << shift0;\n\n        drflac_uint32 side0 = pInputSamples1U32[i*4+0] << shift1;\n        drflac_uint32 side1 = pInputSamples1U32[i*4+1] << shift1;\n        drflac_uint32 side2 = pInputSamples1U32[i*4+2] << shift1;\n        drflac_uint32 side3 = pInputSamples1U32[i*4+3] << shift1;\n\n        drflac_uint32 right0 = left0 - side0;\n        drflac_uint32 right1 = left1 - side1;\n        drflac_uint32 right2 = left2 - side2;\n        drflac_uint32 right3 = left3 - side3;\n\n        left0  >>= 16;\n        left1  >>= 16;\n        left2  >>= 16;\n        left3  >>= 16;\n\n        right0 >>= 16;\n        right1 >>= 16;\n        right2 >>= 16;\n        right3 >>= 16;\n\n        pOutputSamples[i*8+0] = (drflac_int16)left0;\n        pOutputSamples[i*8+1] = (drflac_int16)right0;\n        pOutputSamples[i*8+2] = (drflac_int16)left1;\n        pOutputSamples[i*8+3] = (drflac_int16)right1;\n        pOutputSamples[i*8+4] = (drflac_int16)left2;\n        pOutputSamples[i*8+5] = (drflac_int16)right2;\n        pOutputSamples[i*8+6] = (drflac_int16)left3;\n        pOutputSamples[i*8+7] = (drflac_int16)right3;\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        drflac_uint32 left  = pInputSamples0U32[i] << shift0;\n        drflac_uint32 side  = pInputSamples1U32[i] << shift1;\n        drflac_uint32 right = left - side;\n\n        left  >>= 16;\n        right >>= 16;\n\n        pOutputSamples[i*2+0] = (drflac_int16)left;\n        pOutputSamples[i*2+1] = (drflac_int16)right;\n    }\n}\n\n#if defined(DRFLAC_SUPPORT_SSE2)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_left_side__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n    DRFLAC_ASSERT(pFlac->bitsPerSample <= 24);\n\n    for (i = 0; i < frameCount4; ++i) {\n        __m128i left  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0);\n        __m128i side  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1);\n        __m128i right = _mm_sub_epi32(left, side);\n\n        left  = _mm_srai_epi32(left,  16);\n        right = _mm_srai_epi32(right, 16);\n\n        _mm_storeu_si128((__m128i*)(pOutputSamples + i*8), drflac__mm_packs_interleaved_epi32(left, right));\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        drflac_uint32 left  = pInputSamples0U32[i] << shift0;\n        drflac_uint32 side  = pInputSamples1U32[i] << shift1;\n        drflac_uint32 right = left - side;\n\n        left  >>= 16;\n        right >>= 16;\n\n        pOutputSamples[i*2+0] = (drflac_int16)left;\n        pOutputSamples[i*2+1] = (drflac_int16)right;\n    }\n}\n#endif\n\n#if defined(DRFLAC_SUPPORT_NEON)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_left_side__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    int32x4_t shift0_4;\n    int32x4_t shift1_4;\n\n    DRFLAC_ASSERT(pFlac->bitsPerSample <= 24);\n\n    shift0_4 = vdupq_n_s32(shift0);\n    shift1_4 = vdupq_n_s32(shift1);\n\n    for (i = 0; i < frameCount4; ++i) {\n        uint32x4_t left;\n        uint32x4_t side;\n        uint32x4_t right;\n\n        left  = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4);\n        side  = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4);\n        right = vsubq_u32(left, side);\n\n        left  = vshrq_n_u32(left,  16);\n        right = vshrq_n_u32(right, 16);\n\n        drflac__vst2q_u16((drflac_uint16*)pOutputSamples + i*8, vzip_u16(vmovn_u32(left), vmovn_u32(right)));\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        drflac_uint32 left  = pInputSamples0U32[i] << shift0;\n        drflac_uint32 side  = pInputSamples1U32[i] << shift1;\n        drflac_uint32 right = left - side;\n\n        left  >>= 16;\n        right >>= 16;\n\n        pOutputSamples[i*2+0] = (drflac_int16)left;\n        pOutputSamples[i*2+1] = (drflac_int16)right;\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_left_side(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples)\n{\n#if defined(DRFLAC_SUPPORT_SSE2)\n    if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_s16__decode_left_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(DRFLAC_SUPPORT_NEON)\n    if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_s16__decode_left_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n        /* Scalar fallback. */\n#if 0\n        drflac_read_pcm_frames_s16__decode_left_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        drflac_read_pcm_frames_s16__decode_left_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\n\n\n#if 0\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_right_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples)\n{\n    drflac_uint64 i;\n    for (i = 0; i < frameCount; ++i) {\n        drflac_uint32 side  = (drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n        drflac_uint32 right = (drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n        drflac_uint32 left  = right + side;\n\n        left  >>= 16;\n        right >>= 16;\n\n        pOutputSamples[i*2+0] = (drflac_int16)left;\n        pOutputSamples[i*2+1] = (drflac_int16)right;\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_right_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n    for (i = 0; i < frameCount4; ++i) {\n        drflac_uint32 side0  = pInputSamples0U32[i*4+0] << shift0;\n        drflac_uint32 side1  = pInputSamples0U32[i*4+1] << shift0;\n        drflac_uint32 side2  = pInputSamples0U32[i*4+2] << shift0;\n        drflac_uint32 side3  = pInputSamples0U32[i*4+3] << shift0;\n\n        drflac_uint32 right0 = pInputSamples1U32[i*4+0] << shift1;\n        drflac_uint32 right1 = pInputSamples1U32[i*4+1] << shift1;\n        drflac_uint32 right2 = pInputSamples1U32[i*4+2] << shift1;\n        drflac_uint32 right3 = pInputSamples1U32[i*4+3] << shift1;\n\n        drflac_uint32 left0 = right0 + side0;\n        drflac_uint32 left1 = right1 + side1;\n        drflac_uint32 left2 = right2 + side2;\n        drflac_uint32 left3 = right3 + side3;\n\n        left0  >>= 16;\n        left1  >>= 16;\n        left2  >>= 16;\n        left3  >>= 16;\n\n        right0 >>= 16;\n        right1 >>= 16;\n        right2 >>= 16;\n        right3 >>= 16;\n\n        pOutputSamples[i*8+0] = (drflac_int16)left0;\n        pOutputSamples[i*8+1] = (drflac_int16)right0;\n        pOutputSamples[i*8+2] = (drflac_int16)left1;\n        pOutputSamples[i*8+3] = (drflac_int16)right1;\n        pOutputSamples[i*8+4] = (drflac_int16)left2;\n        pOutputSamples[i*8+5] = (drflac_int16)right2;\n        pOutputSamples[i*8+6] = (drflac_int16)left3;\n        pOutputSamples[i*8+7] = (drflac_int16)right3;\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        drflac_uint32 side  = pInputSamples0U32[i] << shift0;\n        drflac_uint32 right = pInputSamples1U32[i] << shift1;\n        drflac_uint32 left  = right + side;\n\n        left  >>= 16;\n        right >>= 16;\n\n        pOutputSamples[i*2+0] = (drflac_int16)left;\n        pOutputSamples[i*2+1] = (drflac_int16)right;\n    }\n}\n\n#if defined(DRFLAC_SUPPORT_SSE2)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_right_side__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n    DRFLAC_ASSERT(pFlac->bitsPerSample <= 24);\n\n    for (i = 0; i < frameCount4; ++i) {\n        __m128i side  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0);\n        __m128i right = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1);\n        __m128i left  = _mm_add_epi32(right, side);\n\n        left  = _mm_srai_epi32(left,  16);\n        right = _mm_srai_epi32(right, 16);\n\n        _mm_storeu_si128((__m128i*)(pOutputSamples + i*8), drflac__mm_packs_interleaved_epi32(left, right));\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        drflac_uint32 side  = pInputSamples0U32[i] << shift0;\n        drflac_uint32 right = pInputSamples1U32[i] << shift1;\n        drflac_uint32 left  = right + side;\n\n        left  >>= 16;\n        right >>= 16;\n\n        pOutputSamples[i*2+0] = (drflac_int16)left;\n        pOutputSamples[i*2+1] = (drflac_int16)right;\n    }\n}\n#endif\n\n#if defined(DRFLAC_SUPPORT_NEON)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_right_side__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    int32x4_t shift0_4;\n    int32x4_t shift1_4;\n\n    DRFLAC_ASSERT(pFlac->bitsPerSample <= 24);\n\n    shift0_4 = vdupq_n_s32(shift0);\n    shift1_4 = vdupq_n_s32(shift1);\n\n    for (i = 0; i < frameCount4; ++i) {\n        uint32x4_t side;\n        uint32x4_t right;\n        uint32x4_t left;\n\n        side  = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4);\n        right = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4);\n        left  = vaddq_u32(right, side);\n\n        left  = vshrq_n_u32(left,  16);\n        right = vshrq_n_u32(right, 16);\n\n        drflac__vst2q_u16((drflac_uint16*)pOutputSamples + i*8, vzip_u16(vmovn_u32(left), vmovn_u32(right)));\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        drflac_uint32 side  = pInputSamples0U32[i] << shift0;\n        drflac_uint32 right = pInputSamples1U32[i] << shift1;\n        drflac_uint32 left  = right + side;\n\n        left  >>= 16;\n        right >>= 16;\n\n        pOutputSamples[i*2+0] = (drflac_int16)left;\n        pOutputSamples[i*2+1] = (drflac_int16)right;\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_right_side(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples)\n{\n#if defined(DRFLAC_SUPPORT_SSE2)\n    if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_s16__decode_right_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(DRFLAC_SUPPORT_NEON)\n    if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_s16__decode_right_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n        /* Scalar fallback. */\n#if 0\n        drflac_read_pcm_frames_s16__decode_right_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        drflac_read_pcm_frames_s16__decode_right_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\n\n\n#if 0\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_mid_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples)\n{\n    for (drflac_uint64 i = 0; i < frameCount; ++i) {\n        drflac_uint32 mid  = (drflac_uint32)pInputSamples0[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n        drflac_uint32 side = (drflac_uint32)pInputSamples1[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n        mid = (mid << 1) | (side & 0x01);\n\n        pOutputSamples[i*2+0] = (drflac_int16)(((drflac_uint32)((drflac_int32)(mid + side) >> 1) << unusedBitsPerSample) >> 16);\n        pOutputSamples[i*2+1] = (drflac_int16)(((drflac_uint32)((drflac_int32)(mid - side) >> 1) << unusedBitsPerSample) >> 16);\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_mid_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift = unusedBitsPerSample;\n\n    if (shift > 0) {\n        shift -= 1;\n        for (i = 0; i < frameCount4; ++i) {\n            drflac_uint32 temp0L;\n            drflac_uint32 temp1L;\n            drflac_uint32 temp2L;\n            drflac_uint32 temp3L;\n            drflac_uint32 temp0R;\n            drflac_uint32 temp1R;\n            drflac_uint32 temp2R;\n            drflac_uint32 temp3R;\n\n            drflac_uint32 mid0  = pInputSamples0U32[i*4+0] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 mid1  = pInputSamples0U32[i*4+1] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 mid2  = pInputSamples0U32[i*4+2] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 mid3  = pInputSamples0U32[i*4+3] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n\n            drflac_uint32 side0 = pInputSamples1U32[i*4+0] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            drflac_uint32 side1 = pInputSamples1U32[i*4+1] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            drflac_uint32 side2 = pInputSamples1U32[i*4+2] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            drflac_uint32 side3 = pInputSamples1U32[i*4+3] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n            mid0 = (mid0 << 1) | (side0 & 0x01);\n            mid1 = (mid1 << 1) | (side1 & 0x01);\n            mid2 = (mid2 << 1) | (side2 & 0x01);\n            mid3 = (mid3 << 1) | (side3 & 0x01);\n\n            temp0L = (mid0 + side0) << shift;\n            temp1L = (mid1 + side1) << shift;\n            temp2L = (mid2 + side2) << shift;\n            temp3L = (mid3 + side3) << shift;\n\n            temp0R = (mid0 - side0) << shift;\n            temp1R = (mid1 - side1) << shift;\n            temp2R = (mid2 - side2) << shift;\n            temp3R = (mid3 - side3) << shift;\n\n            temp0L >>= 16;\n            temp1L >>= 16;\n            temp2L >>= 16;\n            temp3L >>= 16;\n\n            temp0R >>= 16;\n            temp1R >>= 16;\n            temp2R >>= 16;\n            temp3R >>= 16;\n\n            pOutputSamples[i*8+0] = (drflac_int16)temp0L;\n            pOutputSamples[i*8+1] = (drflac_int16)temp0R;\n            pOutputSamples[i*8+2] = (drflac_int16)temp1L;\n            pOutputSamples[i*8+3] = (drflac_int16)temp1R;\n            pOutputSamples[i*8+4] = (drflac_int16)temp2L;\n            pOutputSamples[i*8+5] = (drflac_int16)temp2R;\n            pOutputSamples[i*8+6] = (drflac_int16)temp3L;\n            pOutputSamples[i*8+7] = (drflac_int16)temp3R;\n        }\n    } else {\n        for (i = 0; i < frameCount4; ++i) {\n            drflac_uint32 temp0L;\n            drflac_uint32 temp1L;\n            drflac_uint32 temp2L;\n            drflac_uint32 temp3L;\n            drflac_uint32 temp0R;\n            drflac_uint32 temp1R;\n            drflac_uint32 temp2R;\n            drflac_uint32 temp3R;\n\n            drflac_uint32 mid0  = pInputSamples0U32[i*4+0] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 mid1  = pInputSamples0U32[i*4+1] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 mid2  = pInputSamples0U32[i*4+2] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 mid3  = pInputSamples0U32[i*4+3] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n\n            drflac_uint32 side0 = pInputSamples1U32[i*4+0] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            drflac_uint32 side1 = pInputSamples1U32[i*4+1] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            drflac_uint32 side2 = pInputSamples1U32[i*4+2] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            drflac_uint32 side3 = pInputSamples1U32[i*4+3] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n            mid0 = (mid0 << 1) | (side0 & 0x01);\n            mid1 = (mid1 << 1) | (side1 & 0x01);\n            mid2 = (mid2 << 1) | (side2 & 0x01);\n            mid3 = (mid3 << 1) | (side3 & 0x01);\n\n            temp0L = ((drflac_int32)(mid0 + side0) >> 1);\n            temp1L = ((drflac_int32)(mid1 + side1) >> 1);\n            temp2L = ((drflac_int32)(mid2 + side2) >> 1);\n            temp3L = ((drflac_int32)(mid3 + side3) >> 1);\n\n            temp0R = ((drflac_int32)(mid0 - side0) >> 1);\n            temp1R = ((drflac_int32)(mid1 - side1) >> 1);\n            temp2R = ((drflac_int32)(mid2 - side2) >> 1);\n            temp3R = ((drflac_int32)(mid3 - side3) >> 1);\n\n            temp0L >>= 16;\n            temp1L >>= 16;\n            temp2L >>= 16;\n            temp3L >>= 16;\n\n            temp0R >>= 16;\n            temp1R >>= 16;\n            temp2R >>= 16;\n            temp3R >>= 16;\n\n            pOutputSamples[i*8+0] = (drflac_int16)temp0L;\n            pOutputSamples[i*8+1] = (drflac_int16)temp0R;\n            pOutputSamples[i*8+2] = (drflac_int16)temp1L;\n            pOutputSamples[i*8+3] = (drflac_int16)temp1R;\n            pOutputSamples[i*8+4] = (drflac_int16)temp2L;\n            pOutputSamples[i*8+5] = (drflac_int16)temp2R;\n            pOutputSamples[i*8+6] = (drflac_int16)temp3L;\n            pOutputSamples[i*8+7] = (drflac_int16)temp3R;\n        }\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        drflac_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n        drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n        mid = (mid << 1) | (side & 0x01);\n\n        pOutputSamples[i*2+0] = (drflac_int16)(((drflac_uint32)((drflac_int32)(mid + side) >> 1) << unusedBitsPerSample) >> 16);\n        pOutputSamples[i*2+1] = (drflac_int16)(((drflac_uint32)((drflac_int32)(mid - side) >> 1) << unusedBitsPerSample) >> 16);\n    }\n}\n\n#if defined(DRFLAC_SUPPORT_SSE2)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_mid_side__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift = unusedBitsPerSample;\n\n    DRFLAC_ASSERT(pFlac->bitsPerSample <= 24);\n\n    if (shift == 0) {\n        for (i = 0; i < frameCount4; ++i) {\n            __m128i mid;\n            __m128i side;\n            __m128i left;\n            __m128i right;\n\n            mid   = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n            side  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n\n            mid   = _mm_or_si128(_mm_slli_epi32(mid, 1), _mm_and_si128(side, _mm_set1_epi32(0x01)));\n\n            left  = _mm_srai_epi32(_mm_add_epi32(mid, side), 1);\n            right = _mm_srai_epi32(_mm_sub_epi32(mid, side), 1);\n\n            left  = _mm_srai_epi32(left,  16);\n            right = _mm_srai_epi32(right, 16);\n\n            _mm_storeu_si128((__m128i*)(pOutputSamples + i*8), drflac__mm_packs_interleaved_epi32(left, right));\n        }\n\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            drflac_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n            mid = (mid << 1) | (side & 0x01);\n\n            pOutputSamples[i*2+0] = (drflac_int16)(((drflac_int32)(mid + side) >> 1) >> 16);\n            pOutputSamples[i*2+1] = (drflac_int16)(((drflac_int32)(mid - side) >> 1) >> 16);\n        }\n    } else {\n        shift -= 1;\n        for (i = 0; i < frameCount4; ++i) {\n            __m128i mid;\n            __m128i side;\n            __m128i left;\n            __m128i right;\n\n            mid   = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n            side  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n\n            mid   = _mm_or_si128(_mm_slli_epi32(mid, 1), _mm_and_si128(side, _mm_set1_epi32(0x01)));\n\n            left  = _mm_slli_epi32(_mm_add_epi32(mid, side), shift);\n            right = _mm_slli_epi32(_mm_sub_epi32(mid, side), shift);\n\n            left  = _mm_srai_epi32(left,  16);\n            right = _mm_srai_epi32(right, 16);\n\n            _mm_storeu_si128((__m128i*)(pOutputSamples + i*8), drflac__mm_packs_interleaved_epi32(left, right));\n        }\n\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            drflac_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n            mid = (mid << 1) | (side & 0x01);\n\n            pOutputSamples[i*2+0] = (drflac_int16)(((mid + side) << shift) >> 16);\n            pOutputSamples[i*2+1] = (drflac_int16)(((mid - side) << shift) >> 16);\n        }\n    }\n}\n#endif\n\n#if defined(DRFLAC_SUPPORT_NEON)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_mid_side__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift = unusedBitsPerSample;\n    int32x4_t wbpsShift0_4; /* wbps = Wasted Bits Per Sample */\n    int32x4_t wbpsShift1_4; /* wbps = Wasted Bits Per Sample */\n\n    DRFLAC_ASSERT(pFlac->bitsPerSample <= 24);\n\n    wbpsShift0_4 = vdupq_n_s32(pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n    wbpsShift1_4 = vdupq_n_s32(pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n\n    if (shift == 0) {\n        for (i = 0; i < frameCount4; ++i) {\n            uint32x4_t mid;\n            uint32x4_t side;\n            int32x4_t left;\n            int32x4_t right;\n\n            mid   = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), wbpsShift0_4);\n            side  = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), wbpsShift1_4);\n\n            mid   = vorrq_u32(vshlq_n_u32(mid, 1), vandq_u32(side, vdupq_n_u32(1)));\n\n            left  = vshrq_n_s32(vreinterpretq_s32_u32(vaddq_u32(mid, side)), 1);\n            right = vshrq_n_s32(vreinterpretq_s32_u32(vsubq_u32(mid, side)), 1);\n\n            left  = vshrq_n_s32(left,  16);\n            right = vshrq_n_s32(right, 16);\n\n            drflac__vst2q_s16(pOutputSamples + i*8, vzip_s16(vmovn_s32(left), vmovn_s32(right)));\n        }\n\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            drflac_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n            mid = (mid << 1) | (side & 0x01);\n\n            pOutputSamples[i*2+0] = (drflac_int16)(((drflac_int32)(mid + side) >> 1) >> 16);\n            pOutputSamples[i*2+1] = (drflac_int16)(((drflac_int32)(mid - side) >> 1) >> 16);\n        }\n    } else {\n        int32x4_t shift4;\n\n        shift -= 1;\n        shift4 = vdupq_n_s32(shift);\n\n        for (i = 0; i < frameCount4; ++i) {\n            uint32x4_t mid;\n            uint32x4_t side;\n            int32x4_t left;\n            int32x4_t right;\n\n            mid   = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), wbpsShift0_4);\n            side  = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), wbpsShift1_4);\n\n            mid   = vorrq_u32(vshlq_n_u32(mid, 1), vandq_u32(side, vdupq_n_u32(1)));\n\n            left  = vreinterpretq_s32_u32(vshlq_u32(vaddq_u32(mid, side), shift4));\n            right = vreinterpretq_s32_u32(vshlq_u32(vsubq_u32(mid, side), shift4));\n\n            left  = vshrq_n_s32(left,  16);\n            right = vshrq_n_s32(right, 16);\n\n            drflac__vst2q_s16(pOutputSamples + i*8, vzip_s16(vmovn_s32(left), vmovn_s32(right)));\n        }\n\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            drflac_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n            mid = (mid << 1) | (side & 0x01);\n\n            pOutputSamples[i*2+0] = (drflac_int16)(((mid + side) << shift) >> 16);\n            pOutputSamples[i*2+1] = (drflac_int16)(((mid - side) << shift) >> 16);\n        }\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_mid_side(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples)\n{\n#if defined(DRFLAC_SUPPORT_SSE2)\n    if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_s16__decode_mid_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(DRFLAC_SUPPORT_NEON)\n    if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_s16__decode_mid_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n        /* Scalar fallback. */\n#if 0\n        drflac_read_pcm_frames_s16__decode_mid_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        drflac_read_pcm_frames_s16__decode_mid_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\n\n\n#if 0\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_independent_stereo__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples)\n{\n    for (drflac_uint64 i = 0; i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (drflac_int16)((drflac_int32)((drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample)) >> 16);\n        pOutputSamples[i*2+1] = (drflac_int16)((drflac_int32)((drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample)) >> 16);\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_independent_stereo__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n    for (i = 0; i < frameCount4; ++i) {\n        drflac_uint32 tempL0 = pInputSamples0U32[i*4+0] << shift0;\n        drflac_uint32 tempL1 = pInputSamples0U32[i*4+1] << shift0;\n        drflac_uint32 tempL2 = pInputSamples0U32[i*4+2] << shift0;\n        drflac_uint32 tempL3 = pInputSamples0U32[i*4+3] << shift0;\n\n        drflac_uint32 tempR0 = pInputSamples1U32[i*4+0] << shift1;\n        drflac_uint32 tempR1 = pInputSamples1U32[i*4+1] << shift1;\n        drflac_uint32 tempR2 = pInputSamples1U32[i*4+2] << shift1;\n        drflac_uint32 tempR3 = pInputSamples1U32[i*4+3] << shift1;\n\n        tempL0 >>= 16;\n        tempL1 >>= 16;\n        tempL2 >>= 16;\n        tempL3 >>= 16;\n\n        tempR0 >>= 16;\n        tempR1 >>= 16;\n        tempR2 >>= 16;\n        tempR3 >>= 16;\n\n        pOutputSamples[i*8+0] = (drflac_int16)tempL0;\n        pOutputSamples[i*8+1] = (drflac_int16)tempR0;\n        pOutputSamples[i*8+2] = (drflac_int16)tempL1;\n        pOutputSamples[i*8+3] = (drflac_int16)tempR1;\n        pOutputSamples[i*8+4] = (drflac_int16)tempL2;\n        pOutputSamples[i*8+5] = (drflac_int16)tempR2;\n        pOutputSamples[i*8+6] = (drflac_int16)tempL3;\n        pOutputSamples[i*8+7] = (drflac_int16)tempR3;\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (drflac_int16)((pInputSamples0U32[i] << shift0) >> 16);\n        pOutputSamples[i*2+1] = (drflac_int16)((pInputSamples1U32[i] << shift1) >> 16);\n    }\n}\n\n#if defined(DRFLAC_SUPPORT_SSE2)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_independent_stereo__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n    for (i = 0; i < frameCount4; ++i) {\n        __m128i left  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0);\n        __m128i right = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1);\n\n        left  = _mm_srai_epi32(left,  16);\n        right = _mm_srai_epi32(right, 16);\n\n        /* At this point we have results. We can now pack and interleave these into a single __m128i object and then store the in the output buffer. */\n        _mm_storeu_si128((__m128i*)(pOutputSamples + i*8), drflac__mm_packs_interleaved_epi32(left, right));\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (drflac_int16)((pInputSamples0U32[i] << shift0) >> 16);\n        pOutputSamples[i*2+1] = (drflac_int16)((pInputSamples1U32[i] << shift1) >> 16);\n    }\n}\n#endif\n\n#if defined(DRFLAC_SUPPORT_NEON)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_independent_stereo__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n    int32x4_t shift0_4 = vdupq_n_s32(shift0);\n    int32x4_t shift1_4 = vdupq_n_s32(shift1);\n\n    for (i = 0; i < frameCount4; ++i) {\n        int32x4_t left;\n        int32x4_t right;\n\n        left  = vreinterpretq_s32_u32(vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4));\n        right = vreinterpretq_s32_u32(vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4));\n\n        left  = vshrq_n_s32(left,  16);\n        right = vshrq_n_s32(right, 16);\n\n        drflac__vst2q_s16(pOutputSamples + i*8, vzip_s16(vmovn_s32(left), vmovn_s32(right)));\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (drflac_int16)((pInputSamples0U32[i] << shift0) >> 16);\n        pOutputSamples[i*2+1] = (drflac_int16)((pInputSamples1U32[i] << shift1) >> 16);\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_independent_stereo(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples)\n{\n#if defined(DRFLAC_SUPPORT_SSE2)\n    if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_s16__decode_independent_stereo__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(DRFLAC_SUPPORT_NEON)\n    if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_s16__decode_independent_stereo__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n        /* Scalar fallback. */\n#if 0\n        drflac_read_pcm_frames_s16__decode_independent_stereo__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        drflac_read_pcm_frames_s16__decode_independent_stereo__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\n\nDRFLAC_API drflac_uint64 drflac_read_pcm_frames_s16(drflac* pFlac, drflac_uint64 framesToRead, drflac_int16* pBufferOut)\n{\n    drflac_uint64 framesRead;\n    drflac_uint32 unusedBitsPerSample;\n\n    if (pFlac == NULL || framesToRead == 0) {\n        return 0;\n    }\n\n    if (pBufferOut == NULL) {\n        return drflac__seek_forward_by_pcm_frames(pFlac, framesToRead);\n    }\n\n    DRFLAC_ASSERT(pFlac->bitsPerSample <= 32);\n    unusedBitsPerSample = 32 - pFlac->bitsPerSample;\n\n    framesRead = 0;\n    while (framesToRead > 0) {\n        /* If we've run out of samples in this frame, go to the next. */\n        if (pFlac->currentFLACFrame.pcmFramesRemaining == 0) {\n            if (!drflac__read_and_decode_next_flac_frame(pFlac)) {\n                break;  /* Couldn't read the next frame, so just break from the loop and return. */\n            }\n        } else {\n            unsigned int channelCount = drflac__get_channel_count_from_channel_assignment(pFlac->currentFLACFrame.header.channelAssignment);\n            drflac_uint64 iFirstPCMFrame = pFlac->currentFLACFrame.header.blockSizeInPCMFrames - pFlac->currentFLACFrame.pcmFramesRemaining;\n            drflac_uint64 frameCountThisIteration = framesToRead;\n\n            if (frameCountThisIteration > pFlac->currentFLACFrame.pcmFramesRemaining) {\n                frameCountThisIteration = pFlac->currentFLACFrame.pcmFramesRemaining;\n            }\n\n            if (channelCount == 2) {\n                const drflac_int32* pDecodedSamples0 = pFlac->currentFLACFrame.subframes[0].pSamplesS32 + iFirstPCMFrame;\n                const drflac_int32* pDecodedSamples1 = pFlac->currentFLACFrame.subframes[1].pSamplesS32 + iFirstPCMFrame;\n\n                switch (pFlac->currentFLACFrame.header.channelAssignment)\n                {\n                    case DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE:\n                    {\n                        drflac_read_pcm_frames_s16__decode_left_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n\n                    case DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE:\n                    {\n                        drflac_read_pcm_frames_s16__decode_right_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n\n                    case DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE:\n                    {\n                        drflac_read_pcm_frames_s16__decode_mid_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n\n                    case DRFLAC_CHANNEL_ASSIGNMENT_INDEPENDENT:\n                    default:\n                    {\n                        drflac_read_pcm_frames_s16__decode_independent_stereo(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n                }\n            } else {\n                /* Generic interleaving. */\n                drflac_uint64 i;\n                for (i = 0; i < frameCountThisIteration; ++i) {\n                    unsigned int j;\n                    for (j = 0; j < channelCount; ++j) {\n                        drflac_int32 sampleS32 = (drflac_int32)((drflac_uint32)(pFlac->currentFLACFrame.subframes[j].pSamplesS32[iFirstPCMFrame + i]) << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[j].wastedBitsPerSample));\n                        pBufferOut[(i*channelCount)+j] = (drflac_int16)(sampleS32 >> 16);\n                    }\n                }\n            }\n\n            framesRead                += frameCountThisIteration;\n            pBufferOut                += frameCountThisIteration * channelCount;\n            framesToRead              -= frameCountThisIteration;\n            pFlac->currentPCMFrame    += frameCountThisIteration;\n            pFlac->currentFLACFrame.pcmFramesRemaining -= (drflac_uint32)frameCountThisIteration;\n        }\n    }\n\n    return framesRead;\n}\n\n\n#if 0\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_left_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples)\n{\n    drflac_uint64 i;\n    for (i = 0; i < frameCount; ++i) {\n        drflac_uint32 left  = (drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n        drflac_uint32 side  = (drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n        drflac_uint32 right = left - side;\n\n        pOutputSamples[i*2+0] = (float)((drflac_int32)left  / 2147483648.0);\n        pOutputSamples[i*2+1] = (float)((drflac_int32)right / 2147483648.0);\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_left_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n    float factor = 1 / 2147483648.0;\n\n    for (i = 0; i < frameCount4; ++i) {\n        drflac_uint32 left0 = pInputSamples0U32[i*4+0] << shift0;\n        drflac_uint32 left1 = pInputSamples0U32[i*4+1] << shift0;\n        drflac_uint32 left2 = pInputSamples0U32[i*4+2] << shift0;\n        drflac_uint32 left3 = pInputSamples0U32[i*4+3] << shift0;\n\n        drflac_uint32 side0 = pInputSamples1U32[i*4+0] << shift1;\n        drflac_uint32 side1 = pInputSamples1U32[i*4+1] << shift1;\n        drflac_uint32 side2 = pInputSamples1U32[i*4+2] << shift1;\n        drflac_uint32 side3 = pInputSamples1U32[i*4+3] << shift1;\n\n        drflac_uint32 right0 = left0 - side0;\n        drflac_uint32 right1 = left1 - side1;\n        drflac_uint32 right2 = left2 - side2;\n        drflac_uint32 right3 = left3 - side3;\n\n        pOutputSamples[i*8+0] = (drflac_int32)left0  * factor;\n        pOutputSamples[i*8+1] = (drflac_int32)right0 * factor;\n        pOutputSamples[i*8+2] = (drflac_int32)left1  * factor;\n        pOutputSamples[i*8+3] = (drflac_int32)right1 * factor;\n        pOutputSamples[i*8+4] = (drflac_int32)left2  * factor;\n        pOutputSamples[i*8+5] = (drflac_int32)right2 * factor;\n        pOutputSamples[i*8+6] = (drflac_int32)left3  * factor;\n        pOutputSamples[i*8+7] = (drflac_int32)right3 * factor;\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        drflac_uint32 left  = pInputSamples0U32[i] << shift0;\n        drflac_uint32 side  = pInputSamples1U32[i] << shift1;\n        drflac_uint32 right = left - side;\n\n        pOutputSamples[i*2+0] = (drflac_int32)left  * factor;\n        pOutputSamples[i*2+1] = (drflac_int32)right * factor;\n    }\n}\n\n#if defined(DRFLAC_SUPPORT_SSE2)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_left_side__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample) - 8;\n    drflac_uint32 shift1 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample) - 8;\n    __m128 factor;\n\n    DRFLAC_ASSERT(pFlac->bitsPerSample <= 24);\n\n    factor = _mm_set1_ps(1.0f / 8388608.0f);\n\n    for (i = 0; i < frameCount4; ++i) {\n        __m128i left  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0);\n        __m128i side  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1);\n        __m128i right = _mm_sub_epi32(left, side);\n        __m128 leftf  = _mm_mul_ps(_mm_cvtepi32_ps(left),  factor);\n        __m128 rightf = _mm_mul_ps(_mm_cvtepi32_ps(right), factor);\n\n        _mm_storeu_ps(pOutputSamples + i*8 + 0, _mm_unpacklo_ps(leftf, rightf));\n        _mm_storeu_ps(pOutputSamples + i*8 + 4, _mm_unpackhi_ps(leftf, rightf));\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        drflac_uint32 left  = pInputSamples0U32[i] << shift0;\n        drflac_uint32 side  = pInputSamples1U32[i] << shift1;\n        drflac_uint32 right = left - side;\n\n        pOutputSamples[i*2+0] = (drflac_int32)left  / 8388608.0f;\n        pOutputSamples[i*2+1] = (drflac_int32)right / 8388608.0f;\n    }\n}\n#endif\n\n#if defined(DRFLAC_SUPPORT_NEON)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_left_side__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample) - 8;\n    drflac_uint32 shift1 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample) - 8;\n    float32x4_t factor4;\n    int32x4_t shift0_4;\n    int32x4_t shift1_4;\n\n    DRFLAC_ASSERT(pFlac->bitsPerSample <= 24);\n\n    factor4  = vdupq_n_f32(1.0f / 8388608.0f);\n    shift0_4 = vdupq_n_s32(shift0);\n    shift1_4 = vdupq_n_s32(shift1);\n\n    for (i = 0; i < frameCount4; ++i) {\n        uint32x4_t left;\n        uint32x4_t side;\n        uint32x4_t right;\n        float32x4_t leftf;\n        float32x4_t rightf;\n\n        left   = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4);\n        side   = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4);\n        right  = vsubq_u32(left, side);\n        leftf  = vmulq_f32(vcvtq_f32_s32(vreinterpretq_s32_u32(left)),  factor4);\n        rightf = vmulq_f32(vcvtq_f32_s32(vreinterpretq_s32_u32(right)), factor4);\n\n        drflac__vst2q_f32(pOutputSamples + i*8, vzipq_f32(leftf, rightf));\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        drflac_uint32 left  = pInputSamples0U32[i] << shift0;\n        drflac_uint32 side  = pInputSamples1U32[i] << shift1;\n        drflac_uint32 right = left - side;\n\n        pOutputSamples[i*2+0] = (drflac_int32)left  / 8388608.0f;\n        pOutputSamples[i*2+1] = (drflac_int32)right / 8388608.0f;\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_left_side(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples)\n{\n#if defined(DRFLAC_SUPPORT_SSE2)\n    if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_f32__decode_left_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(DRFLAC_SUPPORT_NEON)\n    if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_f32__decode_left_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n        /* Scalar fallback. */\n#if 0\n        drflac_read_pcm_frames_f32__decode_left_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        drflac_read_pcm_frames_f32__decode_left_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\n\n\n#if 0\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_right_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples)\n{\n    drflac_uint64 i;\n    for (i = 0; i < frameCount; ++i) {\n        drflac_uint32 side  = (drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n        drflac_uint32 right = (drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n        drflac_uint32 left  = right + side;\n\n        pOutputSamples[i*2+0] = (float)((drflac_int32)left  / 2147483648.0);\n        pOutputSamples[i*2+1] = (float)((drflac_int32)right / 2147483648.0);\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_right_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    float factor = 1 / 2147483648.0;\n\n    for (i = 0; i < frameCount4; ++i) {\n        drflac_uint32 side0  = pInputSamples0U32[i*4+0] << shift0;\n        drflac_uint32 side1  = pInputSamples0U32[i*4+1] << shift0;\n        drflac_uint32 side2  = pInputSamples0U32[i*4+2] << shift0;\n        drflac_uint32 side3  = pInputSamples0U32[i*4+3] << shift0;\n\n        drflac_uint32 right0 = pInputSamples1U32[i*4+0] << shift1;\n        drflac_uint32 right1 = pInputSamples1U32[i*4+1] << shift1;\n        drflac_uint32 right2 = pInputSamples1U32[i*4+2] << shift1;\n        drflac_uint32 right3 = pInputSamples1U32[i*4+3] << shift1;\n\n        drflac_uint32 left0 = right0 + side0;\n        drflac_uint32 left1 = right1 + side1;\n        drflac_uint32 left2 = right2 + side2;\n        drflac_uint32 left3 = right3 + side3;\n\n        pOutputSamples[i*8+0] = (drflac_int32)left0  * factor;\n        pOutputSamples[i*8+1] = (drflac_int32)right0 * factor;\n        pOutputSamples[i*8+2] = (drflac_int32)left1  * factor;\n        pOutputSamples[i*8+3] = (drflac_int32)right1 * factor;\n        pOutputSamples[i*8+4] = (drflac_int32)left2  * factor;\n        pOutputSamples[i*8+5] = (drflac_int32)right2 * factor;\n        pOutputSamples[i*8+6] = (drflac_int32)left3  * factor;\n        pOutputSamples[i*8+7] = (drflac_int32)right3 * factor;\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        drflac_uint32 side  = pInputSamples0U32[i] << shift0;\n        drflac_uint32 right = pInputSamples1U32[i] << shift1;\n        drflac_uint32 left  = right + side;\n\n        pOutputSamples[i*2+0] = (drflac_int32)left  * factor;\n        pOutputSamples[i*2+1] = (drflac_int32)right * factor;\n    }\n}\n\n#if defined(DRFLAC_SUPPORT_SSE2)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_right_side__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample) - 8;\n    drflac_uint32 shift1 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample) - 8;\n    __m128 factor;\n\n    DRFLAC_ASSERT(pFlac->bitsPerSample <= 24);\n\n    factor = _mm_set1_ps(1.0f / 8388608.0f);\n\n    for (i = 0; i < frameCount4; ++i) {\n        __m128i side  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0);\n        __m128i right = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1);\n        __m128i left  = _mm_add_epi32(right, side);\n        __m128 leftf  = _mm_mul_ps(_mm_cvtepi32_ps(left),  factor);\n        __m128 rightf = _mm_mul_ps(_mm_cvtepi32_ps(right), factor);\n\n        _mm_storeu_ps(pOutputSamples + i*8 + 0, _mm_unpacklo_ps(leftf, rightf));\n        _mm_storeu_ps(pOutputSamples + i*8 + 4, _mm_unpackhi_ps(leftf, rightf));\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        drflac_uint32 side  = pInputSamples0U32[i] << shift0;\n        drflac_uint32 right = pInputSamples1U32[i] << shift1;\n        drflac_uint32 left  = right + side;\n\n        pOutputSamples[i*2+0] = (drflac_int32)left  / 8388608.0f;\n        pOutputSamples[i*2+1] = (drflac_int32)right / 8388608.0f;\n    }\n}\n#endif\n\n#if defined(DRFLAC_SUPPORT_NEON)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_right_side__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample) - 8;\n    drflac_uint32 shift1 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample) - 8;\n    float32x4_t factor4;\n    int32x4_t shift0_4;\n    int32x4_t shift1_4;\n\n    DRFLAC_ASSERT(pFlac->bitsPerSample <= 24);\n\n    factor4  = vdupq_n_f32(1.0f / 8388608.0f);\n    shift0_4 = vdupq_n_s32(shift0);\n    shift1_4 = vdupq_n_s32(shift1);\n\n    for (i = 0; i < frameCount4; ++i) {\n        uint32x4_t side;\n        uint32x4_t right;\n        uint32x4_t left;\n        float32x4_t leftf;\n        float32x4_t rightf;\n\n        side   = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4);\n        right  = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4);\n        left   = vaddq_u32(right, side);\n        leftf  = vmulq_f32(vcvtq_f32_s32(vreinterpretq_s32_u32(left)),  factor4);\n        rightf = vmulq_f32(vcvtq_f32_s32(vreinterpretq_s32_u32(right)), factor4);\n\n        drflac__vst2q_f32(pOutputSamples + i*8, vzipq_f32(leftf, rightf));\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        drflac_uint32 side  = pInputSamples0U32[i] << shift0;\n        drflac_uint32 right = pInputSamples1U32[i] << shift1;\n        drflac_uint32 left  = right + side;\n\n        pOutputSamples[i*2+0] = (drflac_int32)left  / 8388608.0f;\n        pOutputSamples[i*2+1] = (drflac_int32)right / 8388608.0f;\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_right_side(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples)\n{\n#if defined(DRFLAC_SUPPORT_SSE2)\n    if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_f32__decode_right_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(DRFLAC_SUPPORT_NEON)\n    if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_f32__decode_right_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n        /* Scalar fallback. */\n#if 0\n        drflac_read_pcm_frames_f32__decode_right_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        drflac_read_pcm_frames_f32__decode_right_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\n\n\n#if 0\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_mid_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples)\n{\n    for (drflac_uint64 i = 0; i < frameCount; ++i) {\n        drflac_uint32 mid  = (drflac_uint32)pInputSamples0[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n        drflac_uint32 side = (drflac_uint32)pInputSamples1[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n        mid = (mid << 1) | (side & 0x01);\n\n        pOutputSamples[i*2+0] = (float)((((drflac_int32)(mid + side) >> 1) << (unusedBitsPerSample)) / 2147483648.0);\n        pOutputSamples[i*2+1] = (float)((((drflac_int32)(mid - side) >> 1) << (unusedBitsPerSample)) / 2147483648.0);\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_mid_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift = unusedBitsPerSample;\n    float factor = 1 / 2147483648.0;\n\n    if (shift > 0) {\n        shift -= 1;\n        for (i = 0; i < frameCount4; ++i) {\n            drflac_uint32 temp0L;\n            drflac_uint32 temp1L;\n            drflac_uint32 temp2L;\n            drflac_uint32 temp3L;\n            drflac_uint32 temp0R;\n            drflac_uint32 temp1R;\n            drflac_uint32 temp2R;\n            drflac_uint32 temp3R;\n\n            drflac_uint32 mid0  = pInputSamples0U32[i*4+0] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 mid1  = pInputSamples0U32[i*4+1] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 mid2  = pInputSamples0U32[i*4+2] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 mid3  = pInputSamples0U32[i*4+3] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n\n            drflac_uint32 side0 = pInputSamples1U32[i*4+0] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            drflac_uint32 side1 = pInputSamples1U32[i*4+1] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            drflac_uint32 side2 = pInputSamples1U32[i*4+2] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            drflac_uint32 side3 = pInputSamples1U32[i*4+3] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n            mid0 = (mid0 << 1) | (side0 & 0x01);\n            mid1 = (mid1 << 1) | (side1 & 0x01);\n            mid2 = (mid2 << 1) | (side2 & 0x01);\n            mid3 = (mid3 << 1) | (side3 & 0x01);\n\n            temp0L = (mid0 + side0) << shift;\n            temp1L = (mid1 + side1) << shift;\n            temp2L = (mid2 + side2) << shift;\n            temp3L = (mid3 + side3) << shift;\n\n            temp0R = (mid0 - side0) << shift;\n            temp1R = (mid1 - side1) << shift;\n            temp2R = (mid2 - side2) << shift;\n            temp3R = (mid3 - side3) << shift;\n\n            pOutputSamples[i*8+0] = (drflac_int32)temp0L * factor;\n            pOutputSamples[i*8+1] = (drflac_int32)temp0R * factor;\n            pOutputSamples[i*8+2] = (drflac_int32)temp1L * factor;\n            pOutputSamples[i*8+3] = (drflac_int32)temp1R * factor;\n            pOutputSamples[i*8+4] = (drflac_int32)temp2L * factor;\n            pOutputSamples[i*8+5] = (drflac_int32)temp2R * factor;\n            pOutputSamples[i*8+6] = (drflac_int32)temp3L * factor;\n            pOutputSamples[i*8+7] = (drflac_int32)temp3R * factor;\n        }\n    } else {\n        for (i = 0; i < frameCount4; ++i) {\n            drflac_uint32 temp0L;\n            drflac_uint32 temp1L;\n            drflac_uint32 temp2L;\n            drflac_uint32 temp3L;\n            drflac_uint32 temp0R;\n            drflac_uint32 temp1R;\n            drflac_uint32 temp2R;\n            drflac_uint32 temp3R;\n\n            drflac_uint32 mid0  = pInputSamples0U32[i*4+0] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 mid1  = pInputSamples0U32[i*4+1] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 mid2  = pInputSamples0U32[i*4+2] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 mid3  = pInputSamples0U32[i*4+3] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n\n            drflac_uint32 side0 = pInputSamples1U32[i*4+0] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            drflac_uint32 side1 = pInputSamples1U32[i*4+1] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            drflac_uint32 side2 = pInputSamples1U32[i*4+2] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            drflac_uint32 side3 = pInputSamples1U32[i*4+3] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n            mid0 = (mid0 << 1) | (side0 & 0x01);\n            mid1 = (mid1 << 1) | (side1 & 0x01);\n            mid2 = (mid2 << 1) | (side2 & 0x01);\n            mid3 = (mid3 << 1) | (side3 & 0x01);\n\n            temp0L = (drflac_uint32)((drflac_int32)(mid0 + side0) >> 1);\n            temp1L = (drflac_uint32)((drflac_int32)(mid1 + side1) >> 1);\n            temp2L = (drflac_uint32)((drflac_int32)(mid2 + side2) >> 1);\n            temp3L = (drflac_uint32)((drflac_int32)(mid3 + side3) >> 1);\n\n            temp0R = (drflac_uint32)((drflac_int32)(mid0 - side0) >> 1);\n            temp1R = (drflac_uint32)((drflac_int32)(mid1 - side1) >> 1);\n            temp2R = (drflac_uint32)((drflac_int32)(mid2 - side2) >> 1);\n            temp3R = (drflac_uint32)((drflac_int32)(mid3 - side3) >> 1);\n\n            pOutputSamples[i*8+0] = (drflac_int32)temp0L * factor;\n            pOutputSamples[i*8+1] = (drflac_int32)temp0R * factor;\n            pOutputSamples[i*8+2] = (drflac_int32)temp1L * factor;\n            pOutputSamples[i*8+3] = (drflac_int32)temp1R * factor;\n            pOutputSamples[i*8+4] = (drflac_int32)temp2L * factor;\n            pOutputSamples[i*8+5] = (drflac_int32)temp2R * factor;\n            pOutputSamples[i*8+6] = (drflac_int32)temp3L * factor;\n            pOutputSamples[i*8+7] = (drflac_int32)temp3R * factor;\n        }\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        drflac_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n        drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n        mid = (mid << 1) | (side & 0x01);\n\n        pOutputSamples[i*2+0] = (drflac_int32)((drflac_uint32)((drflac_int32)(mid + side) >> 1) << unusedBitsPerSample) * factor;\n        pOutputSamples[i*2+1] = (drflac_int32)((drflac_uint32)((drflac_int32)(mid - side) >> 1) << unusedBitsPerSample) * factor;\n    }\n}\n\n#if defined(DRFLAC_SUPPORT_SSE2)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_mid_side__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift = unusedBitsPerSample - 8;\n    float factor;\n    __m128 factor128;\n\n    DRFLAC_ASSERT(pFlac->bitsPerSample <= 24);\n\n    factor = 1.0f / 8388608.0f;\n    factor128 = _mm_set1_ps(factor);\n\n    if (shift == 0) {\n        for (i = 0; i < frameCount4; ++i) {\n            __m128i mid;\n            __m128i side;\n            __m128i tempL;\n            __m128i tempR;\n            __m128  leftf;\n            __m128  rightf;\n\n            mid    = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n            side   = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n\n            mid    = _mm_or_si128(_mm_slli_epi32(mid, 1), _mm_and_si128(side, _mm_set1_epi32(0x01)));\n\n            tempL  = _mm_srai_epi32(_mm_add_epi32(mid, side), 1);\n            tempR  = _mm_srai_epi32(_mm_sub_epi32(mid, side), 1);\n\n            leftf  = _mm_mul_ps(_mm_cvtepi32_ps(tempL), factor128);\n            rightf = _mm_mul_ps(_mm_cvtepi32_ps(tempR), factor128);\n\n            _mm_storeu_ps(pOutputSamples + i*8 + 0, _mm_unpacklo_ps(leftf, rightf));\n            _mm_storeu_ps(pOutputSamples + i*8 + 4, _mm_unpackhi_ps(leftf, rightf));\n        }\n\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            drflac_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n            mid = (mid << 1) | (side & 0x01);\n\n            pOutputSamples[i*2+0] = ((drflac_int32)(mid + side) >> 1) * factor;\n            pOutputSamples[i*2+1] = ((drflac_int32)(mid - side) >> 1) * factor;\n        }\n    } else {\n        shift -= 1;\n        for (i = 0; i < frameCount4; ++i) {\n            __m128i mid;\n            __m128i side;\n            __m128i tempL;\n            __m128i tempR;\n            __m128 leftf;\n            __m128 rightf;\n\n            mid    = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n            side   = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n\n            mid    = _mm_or_si128(_mm_slli_epi32(mid, 1), _mm_and_si128(side, _mm_set1_epi32(0x01)));\n\n            tempL  = _mm_slli_epi32(_mm_add_epi32(mid, side), shift);\n            tempR  = _mm_slli_epi32(_mm_sub_epi32(mid, side), shift);\n\n            leftf  = _mm_mul_ps(_mm_cvtepi32_ps(tempL), factor128);\n            rightf = _mm_mul_ps(_mm_cvtepi32_ps(tempR), factor128);\n\n            _mm_storeu_ps(pOutputSamples + i*8 + 0, _mm_unpacklo_ps(leftf, rightf));\n            _mm_storeu_ps(pOutputSamples + i*8 + 4, _mm_unpackhi_ps(leftf, rightf));\n        }\n\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            drflac_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n            mid = (mid << 1) | (side & 0x01);\n\n            pOutputSamples[i*2+0] = (drflac_int32)((mid + side) << shift) * factor;\n            pOutputSamples[i*2+1] = (drflac_int32)((mid - side) << shift) * factor;\n        }\n    }\n}\n#endif\n\n#if defined(DRFLAC_SUPPORT_NEON)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_mid_side__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift = unusedBitsPerSample - 8;\n    float factor;\n    float32x4_t factor4;\n    int32x4_t shift4;\n    int32x4_t wbps0_4;  /* Wasted Bits Per Sample */\n    int32x4_t wbps1_4;  /* Wasted Bits Per Sample */\n\n    DRFLAC_ASSERT(pFlac->bitsPerSample <= 24);\n\n    factor  = 1.0f / 8388608.0f;\n    factor4 = vdupq_n_f32(factor);\n    wbps0_4 = vdupq_n_s32(pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n    wbps1_4 = vdupq_n_s32(pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n\n    if (shift == 0) {\n        for (i = 0; i < frameCount4; ++i) {\n            int32x4_t lefti;\n            int32x4_t righti;\n            float32x4_t leftf;\n            float32x4_t rightf;\n\n            uint32x4_t mid  = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), wbps0_4);\n            uint32x4_t side = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), wbps1_4);\n\n            mid    = vorrq_u32(vshlq_n_u32(mid, 1), vandq_u32(side, vdupq_n_u32(1)));\n\n            lefti  = vshrq_n_s32(vreinterpretq_s32_u32(vaddq_u32(mid, side)), 1);\n            righti = vshrq_n_s32(vreinterpretq_s32_u32(vsubq_u32(mid, side)), 1);\n\n            leftf  = vmulq_f32(vcvtq_f32_s32(lefti),  factor4);\n            rightf = vmulq_f32(vcvtq_f32_s32(righti), factor4);\n\n            drflac__vst2q_f32(pOutputSamples + i*8, vzipq_f32(leftf, rightf));\n        }\n\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            drflac_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n            mid = (mid << 1) | (side & 0x01);\n\n            pOutputSamples[i*2+0] = ((drflac_int32)(mid + side) >> 1) * factor;\n            pOutputSamples[i*2+1] = ((drflac_int32)(mid - side) >> 1) * factor;\n        }\n    } else {\n        shift -= 1;\n        shift4 = vdupq_n_s32(shift);\n        for (i = 0; i < frameCount4; ++i) {\n            uint32x4_t mid;\n            uint32x4_t side;\n            int32x4_t lefti;\n            int32x4_t righti;\n            float32x4_t leftf;\n            float32x4_t rightf;\n\n            mid    = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), wbps0_4);\n            side   = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), wbps1_4);\n\n            mid    = vorrq_u32(vshlq_n_u32(mid, 1), vandq_u32(side, vdupq_n_u32(1)));\n\n            lefti  = vreinterpretq_s32_u32(vshlq_u32(vaddq_u32(mid, side), shift4));\n            righti = vreinterpretq_s32_u32(vshlq_u32(vsubq_u32(mid, side), shift4));\n\n            leftf  = vmulq_f32(vcvtq_f32_s32(lefti),  factor4);\n            rightf = vmulq_f32(vcvtq_f32_s32(righti), factor4);\n\n            drflac__vst2q_f32(pOutputSamples + i*8, vzipq_f32(leftf, rightf));\n        }\n\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            drflac_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n\n            mid = (mid << 1) | (side & 0x01);\n\n            pOutputSamples[i*2+0] = (drflac_int32)((mid + side) << shift) * factor;\n            pOutputSamples[i*2+1] = (drflac_int32)((mid - side) << shift) * factor;\n        }\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_mid_side(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples)\n{\n#if defined(DRFLAC_SUPPORT_SSE2)\n    if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_f32__decode_mid_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(DRFLAC_SUPPORT_NEON)\n    if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_f32__decode_mid_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n        /* Scalar fallback. */\n#if 0\n        drflac_read_pcm_frames_f32__decode_mid_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        drflac_read_pcm_frames_f32__decode_mid_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\n\n#if 0\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_independent_stereo__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples)\n{\n    for (drflac_uint64 i = 0; i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (float)((drflac_int32)((drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample)) / 2147483648.0);\n        pOutputSamples[i*2+1] = (float)((drflac_int32)((drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample)) / 2147483648.0);\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_independent_stereo__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    float factor = 1 / 2147483648.0;\n\n    for (i = 0; i < frameCount4; ++i) {\n        drflac_uint32 tempL0 = pInputSamples0U32[i*4+0] << shift0;\n        drflac_uint32 tempL1 = pInputSamples0U32[i*4+1] << shift0;\n        drflac_uint32 tempL2 = pInputSamples0U32[i*4+2] << shift0;\n        drflac_uint32 tempL3 = pInputSamples0U32[i*4+3] << shift0;\n\n        drflac_uint32 tempR0 = pInputSamples1U32[i*4+0] << shift1;\n        drflac_uint32 tempR1 = pInputSamples1U32[i*4+1] << shift1;\n        drflac_uint32 tempR2 = pInputSamples1U32[i*4+2] << shift1;\n        drflac_uint32 tempR3 = pInputSamples1U32[i*4+3] << shift1;\n\n        pOutputSamples[i*8+0] = (drflac_int32)tempL0 * factor;\n        pOutputSamples[i*8+1] = (drflac_int32)tempR0 * factor;\n        pOutputSamples[i*8+2] = (drflac_int32)tempL1 * factor;\n        pOutputSamples[i*8+3] = (drflac_int32)tempR1 * factor;\n        pOutputSamples[i*8+4] = (drflac_int32)tempL2 * factor;\n        pOutputSamples[i*8+5] = (drflac_int32)tempR2 * factor;\n        pOutputSamples[i*8+6] = (drflac_int32)tempL3 * factor;\n        pOutputSamples[i*8+7] = (drflac_int32)tempR3 * factor;\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (drflac_int32)(pInputSamples0U32[i] << shift0) * factor;\n        pOutputSamples[i*2+1] = (drflac_int32)(pInputSamples1U32[i] << shift1) * factor;\n    }\n}\n\n#if defined(DRFLAC_SUPPORT_SSE2)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_independent_stereo__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample) - 8;\n    drflac_uint32 shift1 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample) - 8;\n\n    float factor = 1.0f / 8388608.0f;\n    __m128 factor128 = _mm_set1_ps(factor);\n\n    for (i = 0; i < frameCount4; ++i) {\n        __m128i lefti;\n        __m128i righti;\n        __m128 leftf;\n        __m128 rightf;\n\n        lefti  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0);\n        righti = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1);\n\n        leftf  = _mm_mul_ps(_mm_cvtepi32_ps(lefti),  factor128);\n        rightf = _mm_mul_ps(_mm_cvtepi32_ps(righti), factor128);\n\n        _mm_storeu_ps(pOutputSamples + i*8 + 0, _mm_unpacklo_ps(leftf, rightf));\n        _mm_storeu_ps(pOutputSamples + i*8 + 4, _mm_unpackhi_ps(leftf, rightf));\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (drflac_int32)(pInputSamples0U32[i] << shift0) * factor;\n        pOutputSamples[i*2+1] = (drflac_int32)(pInputSamples1U32[i] << shift1) * factor;\n    }\n}\n#endif\n\n#if defined(DRFLAC_SUPPORT_NEON)\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_independent_stereo__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples)\n{\n    drflac_uint64 i;\n    drflac_uint64 frameCount4 = frameCount >> 2;\n    const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0;\n    const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1;\n    drflac_uint32 shift0 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample) - 8;\n    drflac_uint32 shift1 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample) - 8;\n\n    float factor = 1.0f / 8388608.0f;\n    float32x4_t factor4 = vdupq_n_f32(factor);\n    int32x4_t shift0_4  = vdupq_n_s32(shift0);\n    int32x4_t shift1_4  = vdupq_n_s32(shift1);\n\n    for (i = 0; i < frameCount4; ++i) {\n        int32x4_t lefti;\n        int32x4_t righti;\n        float32x4_t leftf;\n        float32x4_t rightf;\n\n        lefti  = vreinterpretq_s32_u32(vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4));\n        righti = vreinterpretq_s32_u32(vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4));\n\n        leftf  = vmulq_f32(vcvtq_f32_s32(lefti),  factor4);\n        rightf = vmulq_f32(vcvtq_f32_s32(righti), factor4);\n\n        drflac__vst2q_f32(pOutputSamples + i*8, vzipq_f32(leftf, rightf));\n    }\n\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (drflac_int32)(pInputSamples0U32[i] << shift0) * factor;\n        pOutputSamples[i*2+1] = (drflac_int32)(pInputSamples1U32[i] << shift1) * factor;\n    }\n}\n#endif\n\nstatic DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_independent_stereo(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples)\n{\n#if defined(DRFLAC_SUPPORT_SSE2)\n    if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_f32__decode_independent_stereo__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(DRFLAC_SUPPORT_NEON)\n    if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        drflac_read_pcm_frames_f32__decode_independent_stereo__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n        /* Scalar fallback. */\n#if 0\n        drflac_read_pcm_frames_f32__decode_independent_stereo__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        drflac_read_pcm_frames_f32__decode_independent_stereo__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\n\nDRFLAC_API drflac_uint64 drflac_read_pcm_frames_f32(drflac* pFlac, drflac_uint64 framesToRead, float* pBufferOut)\n{\n    drflac_uint64 framesRead;\n    drflac_uint32 unusedBitsPerSample;\n\n    if (pFlac == NULL || framesToRead == 0) {\n        return 0;\n    }\n\n    if (pBufferOut == NULL) {\n        return drflac__seek_forward_by_pcm_frames(pFlac, framesToRead);\n    }\n\n    DRFLAC_ASSERT(pFlac->bitsPerSample <= 32);\n    unusedBitsPerSample = 32 - pFlac->bitsPerSample;\n\n    framesRead = 0;\n    while (framesToRead > 0) {\n        /* If we've run out of samples in this frame, go to the next. */\n        if (pFlac->currentFLACFrame.pcmFramesRemaining == 0) {\n            if (!drflac__read_and_decode_next_flac_frame(pFlac)) {\n                break;  /* Couldn't read the next frame, so just break from the loop and return. */\n            }\n        } else {\n            unsigned int channelCount = drflac__get_channel_count_from_channel_assignment(pFlac->currentFLACFrame.header.channelAssignment);\n            drflac_uint64 iFirstPCMFrame = pFlac->currentFLACFrame.header.blockSizeInPCMFrames - pFlac->currentFLACFrame.pcmFramesRemaining;\n            drflac_uint64 frameCountThisIteration = framesToRead;\n\n            if (frameCountThisIteration > pFlac->currentFLACFrame.pcmFramesRemaining) {\n                frameCountThisIteration = pFlac->currentFLACFrame.pcmFramesRemaining;\n            }\n\n            if (channelCount == 2) {\n                const drflac_int32* pDecodedSamples0 = pFlac->currentFLACFrame.subframes[0].pSamplesS32 + iFirstPCMFrame;\n                const drflac_int32* pDecodedSamples1 = pFlac->currentFLACFrame.subframes[1].pSamplesS32 + iFirstPCMFrame;\n\n                switch (pFlac->currentFLACFrame.header.channelAssignment)\n                {\n                    case DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE:\n                    {\n                        drflac_read_pcm_frames_f32__decode_left_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n\n                    case DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE:\n                    {\n                        drflac_read_pcm_frames_f32__decode_right_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n\n                    case DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE:\n                    {\n                        drflac_read_pcm_frames_f32__decode_mid_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n\n                    case DRFLAC_CHANNEL_ASSIGNMENT_INDEPENDENT:\n                    default:\n                    {\n                        drflac_read_pcm_frames_f32__decode_independent_stereo(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n                }\n            } else {\n                /* Generic interleaving. */\n                drflac_uint64 i;\n                for (i = 0; i < frameCountThisIteration; ++i) {\n                    unsigned int j;\n                    for (j = 0; j < channelCount; ++j) {\n                        drflac_int32 sampleS32 = (drflac_int32)((drflac_uint32)(pFlac->currentFLACFrame.subframes[j].pSamplesS32[iFirstPCMFrame + i]) << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[j].wastedBitsPerSample));\n                        pBufferOut[(i*channelCount)+j] = (float)(sampleS32 / 2147483648.0);\n                    }\n                }\n            }\n\n            framesRead                += frameCountThisIteration;\n            pBufferOut                += frameCountThisIteration * channelCount;\n            framesToRead              -= frameCountThisIteration;\n            pFlac->currentPCMFrame    += frameCountThisIteration;\n            pFlac->currentFLACFrame.pcmFramesRemaining -= (unsigned int)frameCountThisIteration;\n        }\n    }\n\n    return framesRead;\n}\n\n\nDRFLAC_API drflac_bool32 drflac_seek_to_pcm_frame(drflac* pFlac, drflac_uint64 pcmFrameIndex)\n{\n    if (pFlac == NULL) {\n        return DRFLAC_FALSE;\n    }\n\n    /* Don't do anything if we're already on the seek point. */\n    if (pFlac->currentPCMFrame == pcmFrameIndex) {\n        return DRFLAC_TRUE;\n    }\n\n    /*\n    If we don't know where the first frame begins then we can't seek. This will happen when the STREAMINFO block was not present\n    when the decoder was opened.\n    */\n    if (pFlac->firstFLACFramePosInBytes == 0) {\n        return DRFLAC_FALSE;\n    }\n\n    if (pcmFrameIndex == 0) {\n        pFlac->currentPCMFrame = 0;\n        return drflac__seek_to_first_frame(pFlac);\n    } else {\n        drflac_bool32 wasSuccessful = DRFLAC_FALSE;\n        drflac_uint64 originalPCMFrame = pFlac->currentPCMFrame;\n\n        /* Clamp the sample to the end. */\n        if (pcmFrameIndex > pFlac->totalPCMFrameCount) {\n            pcmFrameIndex = pFlac->totalPCMFrameCount;\n        }\n\n        /* If the target sample and the current sample are in the same frame we just move the position forward. */\n        if (pcmFrameIndex > pFlac->currentPCMFrame) {\n            /* Forward. */\n            drflac_uint32 offset = (drflac_uint32)(pcmFrameIndex - pFlac->currentPCMFrame);\n            if (pFlac->currentFLACFrame.pcmFramesRemaining >  offset) {\n                pFlac->currentFLACFrame.pcmFramesRemaining -= offset;\n                pFlac->currentPCMFrame = pcmFrameIndex;\n                return DRFLAC_TRUE;\n            }\n        } else {\n            /* Backward. */\n            drflac_uint32 offsetAbs = (drflac_uint32)(pFlac->currentPCMFrame - pcmFrameIndex);\n            drflac_uint32 currentFLACFramePCMFrameCount = pFlac->currentFLACFrame.header.blockSizeInPCMFrames;\n            drflac_uint32 currentFLACFramePCMFramesConsumed = currentFLACFramePCMFrameCount - pFlac->currentFLACFrame.pcmFramesRemaining;\n            if (currentFLACFramePCMFramesConsumed > offsetAbs) {\n                pFlac->currentFLACFrame.pcmFramesRemaining += offsetAbs;\n                pFlac->currentPCMFrame = pcmFrameIndex;\n                return DRFLAC_TRUE;\n            }\n        }\n\n        /*\n        Different techniques depending on encapsulation. Using the native FLAC seektable with Ogg encapsulation is a bit awkward so\n        we'll instead use Ogg's natural seeking facility.\n        */\n#ifndef DR_FLAC_NO_OGG\n        if (pFlac->container == drflac_container_ogg)\n        {\n            wasSuccessful = drflac_ogg__seek_to_pcm_frame(pFlac, pcmFrameIndex);\n        }\n        else\n#endif\n        {\n            /* First try seeking via the seek table. If this fails, fall back to a brute force seek which is much slower. */\n            if (/*!wasSuccessful && */!pFlac->_noSeekTableSeek) {\n                wasSuccessful = drflac__seek_to_pcm_frame__seek_table(pFlac, pcmFrameIndex);\n            }\n\n#if !defined(DR_FLAC_NO_CRC)\n            /* Fall back to binary search if seek table seeking fails. This requires the length of the stream to be known. */\n            if (!wasSuccessful && !pFlac->_noBinarySearchSeek && pFlac->totalPCMFrameCount > 0) {\n                wasSuccessful = drflac__seek_to_pcm_frame__binary_search(pFlac, pcmFrameIndex);\n            }\n#endif\n\n            /* Fall back to brute force if all else fails. */\n            if (!wasSuccessful && !pFlac->_noBruteForceSeek) {\n                wasSuccessful = drflac__seek_to_pcm_frame__brute_force(pFlac, pcmFrameIndex);\n            }\n        }\n\n        if (wasSuccessful) {\n            pFlac->currentPCMFrame = pcmFrameIndex;\n        } else {\n            /* Seek failed. Try putting the decoder back to it's original state. */\n            if (drflac_seek_to_pcm_frame(pFlac, originalPCMFrame) == DRFLAC_FALSE) {\n                /* Failed to seek back to the original PCM frame. Fall back to 0. */\n                drflac_seek_to_pcm_frame(pFlac, 0);\n            }\n        }\n\n        return wasSuccessful;\n    }\n}\n\n\n\n/* High Level APIs */\n\n#if defined(SIZE_MAX)\n    #define DRFLAC_SIZE_MAX  SIZE_MAX\n#else\n    #if defined(DRFLAC_64BIT)\n        #define DRFLAC_SIZE_MAX  ((drflac_uint64)0xFFFFFFFFFFFFFFFF)\n    #else\n        #define DRFLAC_SIZE_MAX  0xFFFFFFFF\n    #endif\n#endif\n\n\n/* Using a macro as the definition of the drflac__full_decode_and_close_*() API family. Sue me. */\n#define DRFLAC_DEFINE_FULL_READ_AND_CLOSE(extension, type) \\\nstatic type* drflac__full_read_and_close_ ## extension (drflac* pFlac, unsigned int* channelsOut, unsigned int* sampleRateOut, drflac_uint64* totalPCMFrameCountOut)\\\n{                                                                                                                                                                   \\\n    type* pSampleData = NULL;                                                                                                                                       \\\n    drflac_uint64 totalPCMFrameCount;                                                                                                                               \\\n                                                                                                                                                                    \\\n    DRFLAC_ASSERT(pFlac != NULL);                                                                                                                                   \\\n                                                                                                                                                                    \\\n    totalPCMFrameCount = pFlac->totalPCMFrameCount;                                                                                                                 \\\n                                                                                                                                                                    \\\n    if (totalPCMFrameCount == 0) {                                                                                                                                  \\\n        type buffer[4096];                                                                                                                                          \\\n        drflac_uint64 pcmFramesRead;                                                                                                                                \\\n        size_t sampleDataBufferSize = sizeof(buffer);                                                                                                               \\\n                                                                                                                                                                    \\\n        pSampleData = (type*)drflac__malloc_from_callbacks(sampleDataBufferSize, &pFlac->allocationCallbacks);                                                      \\\n        if (pSampleData == NULL) {                                                                                                                                  \\\n            goto on_error;                                                                                                                                          \\\n        }                                                                                                                                                           \\\n                                                                                                                                                                    \\\n        while ((pcmFramesRead = (drflac_uint64)drflac_read_pcm_frames_##extension(pFlac, sizeof(buffer)/sizeof(buffer[0])/pFlac->channels, buffer)) > 0) {          \\\n            if (((totalPCMFrameCount + pcmFramesRead) * pFlac->channels * sizeof(type)) > sampleDataBufferSize) {                                                   \\\n                type* pNewSampleData;                                                                                                                               \\\n                size_t newSampleDataBufferSize;                                                                                                                     \\\n                                                                                                                                                                    \\\n                newSampleDataBufferSize = sampleDataBufferSize * 2;                                                                                                 \\\n                pNewSampleData = (type*)drflac__realloc_from_callbacks(pSampleData, newSampleDataBufferSize, sampleDataBufferSize, &pFlac->allocationCallbacks);    \\\n                if (pNewSampleData == NULL) {                                                                                                                       \\\n                    drflac__free_from_callbacks(pSampleData, &pFlac->allocationCallbacks);                                                                          \\\n                    goto on_error;                                                                                                                                  \\\n                }                                                                                                                                                   \\\n                                                                                                                                                                    \\\n                sampleDataBufferSize = newSampleDataBufferSize;                                                                                                     \\\n                pSampleData = pNewSampleData;                                                                                                                       \\\n            }                                                                                                                                                       \\\n                                                                                                                                                                    \\\n            DRFLAC_COPY_MEMORY(pSampleData + (totalPCMFrameCount*pFlac->channels), buffer, (size_t)(pcmFramesRead*pFlac->channels*sizeof(type)));                   \\\n            totalPCMFrameCount += pcmFramesRead;                                                                                                                    \\\n        }                                                                                                                                                           \\\n                                                                                                                                                                    \\\n        /* At this point everything should be decoded, but we just want to fill the unused part buffer with silence - need to                                       \\\n           protect those ears from random noise! */                                                                                                                 \\\n        DRFLAC_ZERO_MEMORY(pSampleData + (totalPCMFrameCount*pFlac->channels), (size_t)(sampleDataBufferSize - totalPCMFrameCount*pFlac->channels*sizeof(type)));   \\\n    } else {                                                                                                                                                        \\\n        drflac_uint64 dataSize = totalPCMFrameCount*pFlac->channels*sizeof(type);                                                                                   \\\n        if (dataSize > (drflac_uint64)DRFLAC_SIZE_MAX) {                                                                                                            \\\n            goto on_error;  /* The decoded data is too big. */                                                                                                      \\\n        }                                                                                                                                                           \\\n                                                                                                                                                                    \\\n        pSampleData = (type*)drflac__malloc_from_callbacks((size_t)dataSize, &pFlac->allocationCallbacks);    /* <-- Safe cast as per the check above. */           \\\n        if (pSampleData == NULL) {                                                                                                                                  \\\n            goto on_error;                                                                                                                                          \\\n        }                                                                                                                                                           \\\n                                                                                                                                                                    \\\n        totalPCMFrameCount = drflac_read_pcm_frames_##extension(pFlac, pFlac->totalPCMFrameCount, pSampleData);                                                     \\\n    }                                                                                                                                                               \\\n                                                                                                                                                                    \\\n    if (sampleRateOut) *sampleRateOut = pFlac->sampleRate;                                                                                                          \\\n    if (channelsOut) *channelsOut = pFlac->channels;                                                                                                                \\\n    if (totalPCMFrameCountOut) *totalPCMFrameCountOut = totalPCMFrameCount;                                                                                         \\\n                                                                                                                                                                    \\\n    drflac_close(pFlac);                                                                                                                                            \\\n    return pSampleData;                                                                                                                                             \\\n                                                                                                                                                                    \\\non_error:                                                                                                                                                           \\\n    drflac_close(pFlac);                                                                                                                                            \\\n    return NULL;                                                                                                                                                    \\\n}\n\nDRFLAC_DEFINE_FULL_READ_AND_CLOSE(s32, drflac_int32)\nDRFLAC_DEFINE_FULL_READ_AND_CLOSE(s16, drflac_int16)\nDRFLAC_DEFINE_FULL_READ_AND_CLOSE(f32, float)\n\nDRFLAC_API drflac_int32* drflac_open_and_read_pcm_frames_s32(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, drflac_uint64* totalPCMFrameCountOut, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    drflac* pFlac;\n\n    if (channelsOut) {\n        *channelsOut = 0;\n    }\n    if (sampleRateOut) {\n        *sampleRateOut = 0;\n    }\n    if (totalPCMFrameCountOut) {\n        *totalPCMFrameCountOut = 0;\n    }\n\n    pFlac = drflac_open(onRead, onSeek, pUserData, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return NULL;\n    }\n\n    return drflac__full_read_and_close_s32(pFlac, channelsOut, sampleRateOut, totalPCMFrameCountOut);\n}\n\nDRFLAC_API drflac_int16* drflac_open_and_read_pcm_frames_s16(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, drflac_uint64* totalPCMFrameCountOut, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    drflac* pFlac;\n\n    if (channelsOut) {\n        *channelsOut = 0;\n    }\n    if (sampleRateOut) {\n        *sampleRateOut = 0;\n    }\n    if (totalPCMFrameCountOut) {\n        *totalPCMFrameCountOut = 0;\n    }\n\n    pFlac = drflac_open(onRead, onSeek, pUserData, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return NULL;\n    }\n\n    return drflac__full_read_and_close_s16(pFlac, channelsOut, sampleRateOut, totalPCMFrameCountOut);\n}\n\nDRFLAC_API float* drflac_open_and_read_pcm_frames_f32(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, drflac_uint64* totalPCMFrameCountOut, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    drflac* pFlac;\n\n    if (channelsOut) {\n        *channelsOut = 0;\n    }\n    if (sampleRateOut) {\n        *sampleRateOut = 0;\n    }\n    if (totalPCMFrameCountOut) {\n        *totalPCMFrameCountOut = 0;\n    }\n\n    pFlac = drflac_open(onRead, onSeek, pUserData, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return NULL;\n    }\n\n    return drflac__full_read_and_close_f32(pFlac, channelsOut, sampleRateOut, totalPCMFrameCountOut);\n}\n\n#ifndef DR_FLAC_NO_STDIO\nDRFLAC_API drflac_int32* drflac_open_file_and_read_pcm_frames_s32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    drflac* pFlac;\n\n    if (sampleRate) {\n        *sampleRate = 0;\n    }\n    if (channels) {\n        *channels = 0;\n    }\n    if (totalPCMFrameCount) {\n        *totalPCMFrameCount = 0;\n    }\n\n    pFlac = drflac_open_file(filename, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return NULL;\n    }\n\n    return drflac__full_read_and_close_s32(pFlac, channels, sampleRate, totalPCMFrameCount);\n}\n\nDRFLAC_API drflac_int16* drflac_open_file_and_read_pcm_frames_s16(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    drflac* pFlac;\n\n    if (sampleRate) {\n        *sampleRate = 0;\n    }\n    if (channels) {\n        *channels = 0;\n    }\n    if (totalPCMFrameCount) {\n        *totalPCMFrameCount = 0;\n    }\n\n    pFlac = drflac_open_file(filename, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return NULL;\n    }\n\n    return drflac__full_read_and_close_s16(pFlac, channels, sampleRate, totalPCMFrameCount);\n}\n\nDRFLAC_API float* drflac_open_file_and_read_pcm_frames_f32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    drflac* pFlac;\n\n    if (sampleRate) {\n        *sampleRate = 0;\n    }\n    if (channels) {\n        *channels = 0;\n    }\n    if (totalPCMFrameCount) {\n        *totalPCMFrameCount = 0;\n    }\n\n    pFlac = drflac_open_file(filename, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return NULL;\n    }\n\n    return drflac__full_read_and_close_f32(pFlac, channels, sampleRate, totalPCMFrameCount);\n}\n#endif\n\nDRFLAC_API drflac_int32* drflac_open_memory_and_read_pcm_frames_s32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    drflac* pFlac;\n\n    if (sampleRate) {\n        *sampleRate = 0;\n    }\n    if (channels) {\n        *channels = 0;\n    }\n    if (totalPCMFrameCount) {\n        *totalPCMFrameCount = 0;\n    }\n\n    pFlac = drflac_open_memory(data, dataSize, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return NULL;\n    }\n\n    return drflac__full_read_and_close_s32(pFlac, channels, sampleRate, totalPCMFrameCount);\n}\n\nDRFLAC_API drflac_int16* drflac_open_memory_and_read_pcm_frames_s16(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    drflac* pFlac;\n\n    if (sampleRate) {\n        *sampleRate = 0;\n    }\n    if (channels) {\n        *channels = 0;\n    }\n    if (totalPCMFrameCount) {\n        *totalPCMFrameCount = 0;\n    }\n\n    pFlac = drflac_open_memory(data, dataSize, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return NULL;\n    }\n\n    return drflac__full_read_and_close_s16(pFlac, channels, sampleRate, totalPCMFrameCount);\n}\n\nDRFLAC_API float* drflac_open_memory_and_read_pcm_frames_f32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    drflac* pFlac;\n\n    if (sampleRate) {\n        *sampleRate = 0;\n    }\n    if (channels) {\n        *channels = 0;\n    }\n    if (totalPCMFrameCount) {\n        *totalPCMFrameCount = 0;\n    }\n\n    pFlac = drflac_open_memory(data, dataSize, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return NULL;\n    }\n\n    return drflac__full_read_and_close_f32(pFlac, channels, sampleRate, totalPCMFrameCount);\n}\n\n\nDRFLAC_API void drflac_free(void* p, const drflac_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pAllocationCallbacks != NULL) {\n        drflac__free_from_callbacks(p, pAllocationCallbacks);\n    } else {\n        drflac__free_default(p, NULL);\n    }\n}\n\n\n\n\nDRFLAC_API void drflac_init_vorbis_comment_iterator(drflac_vorbis_comment_iterator* pIter, drflac_uint32 commentCount, const void* pComments)\n{\n    if (pIter == NULL) {\n        return;\n    }\n\n    pIter->countRemaining = commentCount;\n    pIter->pRunningData   = (const char*)pComments;\n}\n\nDRFLAC_API const char* drflac_next_vorbis_comment(drflac_vorbis_comment_iterator* pIter, drflac_uint32* pCommentLengthOut)\n{\n    drflac_int32 length;\n    const char* pComment;\n\n    /* Safety. */\n    if (pCommentLengthOut) {\n        *pCommentLengthOut = 0;\n    }\n\n    if (pIter == NULL || pIter->countRemaining == 0 || pIter->pRunningData == NULL) {\n        return NULL;\n    }\n\n    length = drflac__le2host_32_ptr_unaligned(pIter->pRunningData);\n    pIter->pRunningData += 4;\n\n    pComment = pIter->pRunningData;\n    pIter->pRunningData += length;\n    pIter->countRemaining -= 1;\n\n    if (pCommentLengthOut) {\n        *pCommentLengthOut = length;\n    }\n\n    return pComment;\n}\n\n\n\n\nDRFLAC_API void drflac_init_cuesheet_track_iterator(drflac_cuesheet_track_iterator* pIter, drflac_uint32 trackCount, const void* pTrackData)\n{\n    if (pIter == NULL) {\n        return;\n    }\n\n    pIter->countRemaining = trackCount;\n    pIter->pRunningData   = (const char*)pTrackData;\n}\n\nDRFLAC_API drflac_bool32 drflac_next_cuesheet_track(drflac_cuesheet_track_iterator* pIter, drflac_cuesheet_track* pCuesheetTrack)\n{\n    drflac_cuesheet_track cuesheetTrack;\n    const char* pRunningData;\n    drflac_uint64 offsetHi;\n    drflac_uint64 offsetLo;\n\n    if (pIter == NULL || pIter->countRemaining == 0 || pIter->pRunningData == NULL) {\n        return DRFLAC_FALSE;\n    }\n\n    pRunningData = pIter->pRunningData;\n\n    offsetHi                   = drflac__be2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4;\n    offsetLo                   = drflac__be2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4;\n    cuesheetTrack.offset       = offsetLo | (offsetHi << 32);\n    cuesheetTrack.trackNumber  = pRunningData[0];                                         pRunningData += 1;\n    DRFLAC_COPY_MEMORY(cuesheetTrack.ISRC, pRunningData, sizeof(cuesheetTrack.ISRC));     pRunningData += 12;\n    cuesheetTrack.isAudio      = (pRunningData[0] & 0x80) != 0;\n    cuesheetTrack.preEmphasis  = (pRunningData[0] & 0x40) != 0;                           pRunningData += 14;\n    cuesheetTrack.indexCount   = pRunningData[0];                                         pRunningData += 1;\n    cuesheetTrack.pIndexPoints = (const drflac_cuesheet_track_index*)pRunningData;        pRunningData += cuesheetTrack.indexCount * sizeof(drflac_cuesheet_track_index);\n\n    pIter->pRunningData = pRunningData;\n    pIter->countRemaining -= 1;\n\n    if (pCuesheetTrack) {\n        *pCuesheetTrack = cuesheetTrack;\n    }\n\n    return DRFLAC_TRUE;\n}\n\n#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))\n    #pragma GCC diagnostic pop\n#endif\n#endif  /* dr_flac_c */\n#endif  /* DR_FLAC_IMPLEMENTATION */\n\n\n/*\nREVISION HISTORY\n================\nv0.12.38 - 2022-04-10\n  - Fix compilation error on older versions of GCC.\n\nv0.12.37 - 2022-02-12\n  - Improve ARM detection.\n\nv0.12.36 - 2022-02-07\n  - Fix a compilation error with the ARM build.\n\nv0.12.35 - 2022-02-06\n  - Fix a bug due to underestimating the amount of precision required for the prediction stage.\n  - Fix some bugs found from fuzz testing.\n\nv0.12.34 - 2022-01-07\n  - Fix some misalignment bugs when reading metadata.\n\nv0.12.33 - 2021-12-22\n  - Fix a bug with seeking when the seek table does not start at PCM frame 0.\n\nv0.12.32 - 2021-12-11\n  - Fix a warning with Clang.\n\nv0.12.31 - 2021-08-16\n  - Silence some warnings.\n\nv0.12.30 - 2021-07-31\n  - Fix platform detection for ARM64.\n\nv0.12.29 - 2021-04-02\n  - Fix a bug where the running PCM frame index is set to an invalid value when over-seeking.\n  - Fix a decoding error due to an incorrect validation check.\n\nv0.12.28 - 2021-02-21\n  - Fix a warning due to referencing _MSC_VER when it is undefined.\n\nv0.12.27 - 2021-01-31\n  - Fix a static analysis warning.\n\nv0.12.26 - 2021-01-17\n  - Fix a compilation warning due to _BSD_SOURCE being deprecated.\n\nv0.12.25 - 2020-12-26\n  - Update documentation.\n\nv0.12.24 - 2020-11-29\n  - Fix ARM64/NEON detection when compiling with MSVC.\n\nv0.12.23 - 2020-11-21\n  - Fix compilation with OpenWatcom.\n\nv0.12.22 - 2020-11-01\n  - Fix an error with the previous release.\n\nv0.12.21 - 2020-11-01\n  - Fix a possible deadlock when seeking.\n  - Improve compiler support for older versions of GCC.\n\nv0.12.20 - 2020-09-08\n  - Fix a compilation error on older compilers.\n\nv0.12.19 - 2020-08-30\n  - Fix a bug due to an undefined 32-bit shift.\n\nv0.12.18 - 2020-08-14\n  - Fix a crash when compiling with clang-cl.\n\nv0.12.17 - 2020-08-02\n  - Simplify sized types.\n\nv0.12.16 - 2020-07-25\n  - Fix a compilation warning.\n\nv0.12.15 - 2020-07-06\n  - Check for negative LPC shifts and return an error.\n\nv0.12.14 - 2020-06-23\n  - Add include guard for the implementation section.\n\nv0.12.13 - 2020-05-16\n  - Add compile-time and run-time version querying.\n    - DRFLAC_VERSION_MINOR\n    - DRFLAC_VERSION_MAJOR\n    - DRFLAC_VERSION_REVISION\n    - DRFLAC_VERSION_STRING\n    - drflac_version()\n    - drflac_version_string()\n\nv0.12.12 - 2020-04-30\n  - Fix compilation errors with VC6.\n\nv0.12.11 - 2020-04-19\n  - Fix some pedantic warnings.\n  - Fix some undefined behaviour warnings.\n\nv0.12.10 - 2020-04-10\n  - Fix some bugs when trying to seek with an invalid seek table.\n\nv0.12.9 - 2020-04-05\n  - Fix warnings.\n\nv0.12.8 - 2020-04-04\n  - Add drflac_open_file_w() and drflac_open_file_with_metadata_w().\n  - Fix some static analysis warnings.\n  - Minor documentation updates.\n\nv0.12.7 - 2020-03-14\n  - Fix compilation errors with VC6.\n\nv0.12.6 - 2020-03-07\n  - Fix compilation error with Visual Studio .NET 2003.\n\nv0.12.5 - 2020-01-30\n  - Silence some static analysis warnings.\n\nv0.12.4 - 2020-01-29\n  - Silence some static analysis warnings.\n\nv0.12.3 - 2019-12-02\n  - Fix some warnings when compiling with GCC and the -Og flag.\n  - Fix a crash in out-of-memory situations.\n  - Fix potential integer overflow bug.\n  - Fix some static analysis warnings.\n  - Fix a possible crash when using custom memory allocators without a custom realloc() implementation.\n  - Fix a bug with binary search seeking where the bits per sample is not a multiple of 8.\n\nv0.12.2 - 2019-10-07\n  - Internal code clean up.\n\nv0.12.1 - 2019-09-29\n  - Fix some Clang Static Analyzer warnings.\n  - Fix an unused variable warning.\n\nv0.12.0 - 2019-09-23\n  - API CHANGE: Add support for user defined memory allocation routines. This system allows the program to specify their own memory allocation\n    routines with a user data pointer for client-specific contextual data. This adds an extra parameter to the end of the following APIs:\n    - drflac_open()\n    - drflac_open_relaxed()\n    - drflac_open_with_metadata()\n    - drflac_open_with_metadata_relaxed()\n    - drflac_open_file()\n    - drflac_open_file_with_metadata()\n    - drflac_open_memory()\n    - drflac_open_memory_with_metadata()\n    - drflac_open_and_read_pcm_frames_s32()\n    - drflac_open_and_read_pcm_frames_s16()\n    - drflac_open_and_read_pcm_frames_f32()\n    - drflac_open_file_and_read_pcm_frames_s32()\n    - drflac_open_file_and_read_pcm_frames_s16()\n    - drflac_open_file_and_read_pcm_frames_f32()\n    - drflac_open_memory_and_read_pcm_frames_s32()\n    - drflac_open_memory_and_read_pcm_frames_s16()\n    - drflac_open_memory_and_read_pcm_frames_f32()\n    Set this extra parameter to NULL to use defaults which is the same as the previous behaviour. Setting this NULL will use\n    DRFLAC_MALLOC, DRFLAC_REALLOC and DRFLAC_FREE.\n  - Remove deprecated APIs:\n    - drflac_read_s32()\n    - drflac_read_s16()\n    - drflac_read_f32()\n    - drflac_seek_to_sample()\n    - drflac_open_and_decode_s32()\n    - drflac_open_and_decode_s16()\n    - drflac_open_and_decode_f32()\n    - drflac_open_and_decode_file_s32()\n    - drflac_open_and_decode_file_s16()\n    - drflac_open_and_decode_file_f32()\n    - drflac_open_and_decode_memory_s32()\n    - drflac_open_and_decode_memory_s16()\n    - drflac_open_and_decode_memory_f32()\n  - Remove drflac.totalSampleCount which is now replaced with drflac.totalPCMFrameCount. You can emulate drflac.totalSampleCount\n    by doing pFlac->totalPCMFrameCount*pFlac->channels.\n  - Rename drflac.currentFrame to drflac.currentFLACFrame to remove ambiguity with PCM frames.\n  - Fix errors when seeking to the end of a stream.\n  - Optimizations to seeking.\n  - SSE improvements and optimizations.\n  - ARM NEON optimizations.\n  - Optimizations to drflac_read_pcm_frames_s16().\n  - Optimizations to drflac_read_pcm_frames_s32().\n\nv0.11.10 - 2019-06-26\n  - Fix a compiler error.\n\nv0.11.9 - 2019-06-16\n  - Silence some ThreadSanitizer warnings.\n\nv0.11.8 - 2019-05-21\n  - Fix warnings.\n\nv0.11.7 - 2019-05-06\n  - C89 fixes.\n\nv0.11.6 - 2019-05-05\n  - Add support for C89.\n  - Fix a compiler warning when CRC is disabled.\n  - Change license to choice of public domain or MIT-0.\n\nv0.11.5 - 2019-04-19\n  - Fix a compiler error with GCC.\n\nv0.11.4 - 2019-04-17\n  - Fix some warnings with GCC when compiling with -std=c99.\n\nv0.11.3 - 2019-04-07\n  - Silence warnings with GCC.\n\nv0.11.2 - 2019-03-10\n  - Fix a warning.\n\nv0.11.1 - 2019-02-17\n  - Fix a potential bug with seeking.\n\nv0.11.0 - 2018-12-16\n  - API CHANGE: Deprecated drflac_read_s32(), drflac_read_s16() and drflac_read_f32() and replaced them with\n    drflac_read_pcm_frames_s32(), drflac_read_pcm_frames_s16() and drflac_read_pcm_frames_f32(). The new APIs take\n    and return PCM frame counts instead of sample counts. To upgrade you will need to change the input count by\n    dividing it by the channel count, and then do the same with the return value.\n  - API_CHANGE: Deprecated drflac_seek_to_sample() and replaced with drflac_seek_to_pcm_frame(). Same rules as\n    the changes to drflac_read_*() apply.\n  - API CHANGE: Deprecated drflac_open_and_decode_*() and replaced with drflac_open_*_and_read_*(). Same rules as\n    the changes to drflac_read_*() apply.\n  - Optimizations.\n\nv0.10.0 - 2018-09-11\n  - Remove the DR_FLAC_NO_WIN32_IO option and the Win32 file IO functionality. If you need to use Win32 file IO you\n    need to do it yourself via the callback API.\n  - Fix the clang build.\n  - Fix undefined behavior.\n  - Fix errors with CUESHEET metdata blocks.\n  - Add an API for iterating over each cuesheet track in the CUESHEET metadata block. This works the same way as the\n    Vorbis comment API.\n  - Other miscellaneous bug fixes, mostly relating to invalid FLAC streams.\n  - Minor optimizations.\n\nv0.9.11 - 2018-08-29\n  - Fix a bug with sample reconstruction.\n\nv0.9.10 - 2018-08-07\n  - Improve 64-bit detection.\n\nv0.9.9 - 2018-08-05\n  - Fix C++ build on older versions of GCC.\n\nv0.9.8 - 2018-07-24\n  - Fix compilation errors.\n\nv0.9.7 - 2018-07-05\n  - Fix a warning.\n\nv0.9.6 - 2018-06-29\n  - Fix some typos.\n\nv0.9.5 - 2018-06-23\n  - Fix some warnings.\n\nv0.9.4 - 2018-06-14\n  - Optimizations to seeking.\n  - Clean up.\n\nv0.9.3 - 2018-05-22\n  - Bug fix.\n\nv0.9.2 - 2018-05-12\n  - Fix a compilation error due to a missing break statement.\n\nv0.9.1 - 2018-04-29\n  - Fix compilation error with Clang.\n\nv0.9 - 2018-04-24\n  - Fix Clang build.\n  - Start using major.minor.revision versioning.\n\nv0.8g - 2018-04-19\n  - Fix build on non-x86/x64 architectures.\n\nv0.8f - 2018-02-02\n  - Stop pretending to support changing rate/channels mid stream.\n\nv0.8e - 2018-02-01\n  - Fix a crash when the block size of a frame is larger than the maximum block size defined by the FLAC stream.\n  - Fix a crash the the Rice partition order is invalid.\n\nv0.8d - 2017-09-22\n  - Add support for decoding streams with ID3 tags. ID3 tags are just skipped.\n\nv0.8c - 2017-09-07\n  - Fix warning on non-x86/x64 architectures.\n\nv0.8b - 2017-08-19\n  - Fix build on non-x86/x64 architectures.\n\nv0.8a - 2017-08-13\n  - A small optimization for the Clang build.\n\nv0.8 - 2017-08-12\n  - API CHANGE: Rename dr_* types to drflac_*.\n  - Optimizations. This brings dr_flac back to about the same class of efficiency as the reference implementation.\n  - Add support for custom implementations of malloc(), realloc(), etc.\n  - Add CRC checking to Ogg encapsulated streams.\n  - Fix VC++ 6 build. This is only for the C++ compiler. The C compiler is not currently supported.\n  - Bug fixes.\n\nv0.7 - 2017-07-23\n  - Add support for opening a stream without a header block. To do this, use drflac_open_relaxed() / drflac_open_with_metadata_relaxed().\n\nv0.6 - 2017-07-22\n  - Add support for recovering from invalid frames. With this change, dr_flac will simply skip over invalid frames as if they\n    never existed. Frames are checked against their sync code, the CRC-8 of the frame header and the CRC-16 of the whole frame.\n\nv0.5 - 2017-07-16\n  - Fix typos.\n  - Change drflac_bool* types to unsigned.\n  - Add CRC checking. This makes dr_flac slower, but can be disabled with #define DR_FLAC_NO_CRC.\n\nv0.4f - 2017-03-10\n  - Fix a couple of bugs with the bitstreaming code.\n\nv0.4e - 2017-02-17\n  - Fix some warnings.\n\nv0.4d - 2016-12-26\n  - Add support for 32-bit floating-point PCM decoding.\n  - Use drflac_int* and drflac_uint* sized types to improve compiler support.\n  - Minor improvements to documentation.\n\nv0.4c - 2016-12-26\n  - Add support for signed 16-bit integer PCM decoding.\n\nv0.4b - 2016-10-23\n  - A minor change to drflac_bool8 and drflac_bool32 types.\n\nv0.4a - 2016-10-11\n  - Rename drBool32 to drflac_bool32 for styling consistency.\n\nv0.4 - 2016-09-29\n  - API/ABI CHANGE: Use fixed size 32-bit booleans instead of the built-in bool type.\n  - API CHANGE: Rename drflac_open_and_decode*() to drflac_open_and_decode*_s32().\n  - API CHANGE: Swap the order of \"channels\" and \"sampleRate\" parameters in drflac_open_and_decode*(). Rationale for this is to\n    keep it consistent with drflac_audio.\n\nv0.3f - 2016-09-21\n  - Fix a warning with GCC.\n\nv0.3e - 2016-09-18\n  - Fixed a bug where GCC 4.3+ was not getting properly identified.\n  - Fixed a few typos.\n  - Changed date formats to ISO 8601 (YYYY-MM-DD).\n\nv0.3d - 2016-06-11\n  - Minor clean up.\n\nv0.3c - 2016-05-28\n  - Fixed compilation error.\n\nv0.3b - 2016-05-16\n  - Fixed Linux/GCC build.\n  - Updated documentation.\n\nv0.3a - 2016-05-15\n  - Minor fixes to documentation.\n\nv0.3 - 2016-05-11\n  - Optimizations. Now at about parity with the reference implementation on 32-bit builds.\n  - Lots of clean up.\n\nv0.2b - 2016-05-10\n  - Bug fixes.\n\nv0.2a - 2016-05-10\n  - Made drflac_open_and_decode() more robust.\n  - Removed an unused debugging variable\n\nv0.2 - 2016-05-09\n  - Added support for Ogg encapsulation.\n  - API CHANGE. Have the onSeek callback take a third argument which specifies whether or not the seek\n    should be relative to the start or the current position. Also changes the seeking rules such that\n    seeking offsets will never be negative.\n  - Have drflac_open_and_decode() fail gracefully if the stream has an unknown total sample count.\n\nv0.1b - 2016-05-07\n  - Properly close the file handle in drflac_open_file() and family when the decoder fails to initialize.\n  - Removed a stale comment.\n\nv0.1a - 2016-05-05\n  - Minor formatting changes.\n  - Fixed a warning on the GCC build.\n\nv0.1 - 2016-05-03\n  - Initial versioned release.\n*/\n\n/*\nThis software is available as a choice of the following licenses. Choose\nwhichever you prefer.\n\n===============================================================================\nALTERNATIVE 1 - Public Domain (www.unlicense.org)\n===============================================================================\nThis is free and unencumbered software released into the public domain.\n\nAnyone is free to copy, modify, publish, use, compile, sell, or distribute this\nsoftware, either in source code form or as a compiled binary, for any purpose,\ncommercial or non-commercial, and by any means.\n\nIn jurisdictions that recognize copyright laws, the author or authors of this\nsoftware dedicate any and all copyright interest in the software to the public\ndomain. We make this dedication for the benefit of the public at large and to\nthe detriment of our heirs and successors. We intend this dedication to be an\novert act of relinquishment in perpetuity of all present and future rights to\nthis software under copyright law.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\nACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nFor more information, please refer to <http://unlicense.org/>\n\n===============================================================================\nALTERNATIVE 2 - MIT No Attribution\n===============================================================================\nCopyright 2020 David Reid\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n"
  },
  {
    "path": "src/libraries/dr/dr_mp3.h",
    "content": "/*\nMP3 audio decoder. Choice of public domain or MIT-0. See license statements at the end of this file.\ndr_mp3 - v0.6.34 - 2022-09-17\n\nDavid Reid - mackron@gmail.com\n\nGitHub: https://github.com/mackron/dr_libs\n\nBased on minimp3 (https://github.com/lieff/minimp3) which is where the real work was done. See the bottom of this file for differences between minimp3 and dr_mp3.\n*/\n\n/*\nRELEASE NOTES - VERSION 0.6\n===========================\nVersion 0.6 includes breaking changes with the configuration of decoders. The ability to customize the number of output channels and the sample rate has been\nremoved. You must now use the channel count and sample rate reported by the MP3 stream itself, and all channel and sample rate conversion must be done\nyourself.\n\n\nChanges to Initialization\n-------------------------\nPreviously, `drmp3_init()`, etc. took a pointer to a `drmp3_config` object that allowed you to customize the output channels and sample rate. This has been\nremoved. If you need the old behaviour you will need to convert the data yourself or just not upgrade. The following APIs have changed.\n\n    `drmp3_init()`\n    `drmp3_init_memory()`\n    `drmp3_init_file()`\n\n\nMiscellaneous Changes\n---------------------\nSupport for loading a file from a `wchar_t` string has been added via the `drmp3_init_file_w()` API.\n*/\n\n/*\nIntroducation\n=============\ndr_mp3 is a single file library. To use it, do something like the following in one .c file.\n\n    ```c\n    #define DR_MP3_IMPLEMENTATION\n    #include \"dr_mp3.h\"\n    ```\n\nYou can then #include this file in other parts of the program as you would with any other header file. To decode audio data, do something like the following:\n\n    ```c\n    drmp3 mp3;\n    if (!drmp3_init_file(&mp3, \"MySong.mp3\", NULL)) {\n        // Failed to open file\n    }\n\n    ...\n\n    drmp3_uint64 framesRead = drmp3_read_pcm_frames_f32(pMP3, framesToRead, pFrames);\n    ```\n\nThe drmp3 object is transparent so you can get access to the channel count and sample rate like so:\n\n    ```\n    drmp3_uint32 channels = mp3.channels;\n    drmp3_uint32 sampleRate = mp3.sampleRate;\n    ```\n\nThe example above initializes a decoder from a file, but you can also initialize it from a block of memory and read and seek callbacks with\n`drmp3_init_memory()` and `drmp3_init()` respectively.\n\nYou do not need to do any annoying memory management when reading PCM frames - this is all managed internally. You can request any number of PCM frames in each\ncall to `drmp3_read_pcm_frames_f32()` and it will return as many PCM frames as it can, up to the requested amount.\n\nYou can also decode an entire file in one go with `drmp3_open_and_read_pcm_frames_f32()`, `drmp3_open_memory_and_read_pcm_frames_f32()` and\n`drmp3_open_file_and_read_pcm_frames_f32()`.\n\n\nBuild Options\n=============\n#define these options before including this file.\n\n#define DR_MP3_NO_STDIO\n  Disable drmp3_init_file(), etc.\n\n#define DR_MP3_NO_SIMD\n  Disable SIMD optimizations.\n*/\n\n#ifndef dr_mp3_h\n#define dr_mp3_h\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define DRMP3_STRINGIFY(x)      #x\n#define DRMP3_XSTRINGIFY(x)     DRMP3_STRINGIFY(x)\n\n#define DRMP3_VERSION_MAJOR     0\n#define DRMP3_VERSION_MINOR     6\n#define DRMP3_VERSION_REVISION  34\n#define DRMP3_VERSION_STRING    DRMP3_XSTRINGIFY(DRMP3_VERSION_MAJOR) \".\" DRMP3_XSTRINGIFY(DRMP3_VERSION_MINOR) \".\" DRMP3_XSTRINGIFY(DRMP3_VERSION_REVISION)\n\n#include <stddef.h> /* For size_t. */\n\n/* Sized types. */\ntypedef   signed char           drmp3_int8;\ntypedef unsigned char           drmp3_uint8;\ntypedef   signed short          drmp3_int16;\ntypedef unsigned short          drmp3_uint16;\ntypedef   signed int            drmp3_int32;\ntypedef unsigned int            drmp3_uint32;\n#if defined(_MSC_VER) && !defined(__clang__)\n    typedef   signed __int64    drmp3_int64;\n    typedef unsigned __int64    drmp3_uint64;\n#else\n    #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))\n        #pragma GCC diagnostic push\n        #pragma GCC diagnostic ignored \"-Wlong-long\"\n        #if defined(__clang__)\n            #pragma GCC diagnostic ignored \"-Wc++11-long-long\"\n        #endif\n    #endif\n    typedef   signed long long  drmp3_int64;\n    typedef unsigned long long  drmp3_uint64;\n    #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))\n        #pragma GCC diagnostic pop\n    #endif\n#endif\n#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__)) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(_M_ARM64) || defined(__powerpc64__)\n    typedef drmp3_uint64        drmp3_uintptr;\n#else\n    typedef drmp3_uint32        drmp3_uintptr;\n#endif\ntypedef drmp3_uint8             drmp3_bool8;\ntypedef drmp3_uint32            drmp3_bool32;\n#define DRMP3_TRUE              1\n#define DRMP3_FALSE             0\n\n#if !defined(DRMP3_API)\n    #if defined(DRMP3_DLL)\n        #if defined(_WIN32)\n            #define DRMP3_DLL_IMPORT  __declspec(dllimport)\n            #define DRMP3_DLL_EXPORT  __declspec(dllexport)\n            #define DRMP3_DLL_PRIVATE static\n        #else\n            #if defined(__GNUC__) && __GNUC__ >= 4\n                #define DRMP3_DLL_IMPORT  __attribute__((visibility(\"default\")))\n                #define DRMP3_DLL_EXPORT  __attribute__((visibility(\"default\")))\n                #define DRMP3_DLL_PRIVATE __attribute__((visibility(\"hidden\")))\n            #else\n                #define DRMP3_DLL_IMPORT\n                #define DRMP3_DLL_EXPORT\n                #define DRMP3_DLL_PRIVATE static\n            #endif\n        #endif\n\n        #if defined(DR_MP3_IMPLEMENTATION) || defined(DRMP3_IMPLEMENTATION)\n            #define DRMP3_API  DRMP3_DLL_EXPORT\n        #else\n            #define DRMP3_API  DRMP3_DLL_IMPORT\n        #endif\n        #define DRMP3_PRIVATE DRMP3_DLL_PRIVATE\n    #else\n        #define DRMP3_API extern\n        #define DRMP3_PRIVATE static\n    #endif\n#endif\n\ntypedef drmp3_int32 drmp3_result;\n#define DRMP3_SUCCESS                        0\n#define DRMP3_ERROR                         -1   /* A generic error. */\n#define DRMP3_INVALID_ARGS                  -2\n#define DRMP3_INVALID_OPERATION             -3\n#define DRMP3_OUT_OF_MEMORY                 -4\n#define DRMP3_OUT_OF_RANGE                  -5\n#define DRMP3_ACCESS_DENIED                 -6\n#define DRMP3_DOES_NOT_EXIST                -7\n#define DRMP3_ALREADY_EXISTS                -8\n#define DRMP3_TOO_MANY_OPEN_FILES           -9\n#define DRMP3_INVALID_FILE                  -10\n#define DRMP3_TOO_BIG                       -11\n#define DRMP3_PATH_TOO_LONG                 -12\n#define DRMP3_NAME_TOO_LONG                 -13\n#define DRMP3_NOT_DIRECTORY                 -14\n#define DRMP3_IS_DIRECTORY                  -15\n#define DRMP3_DIRECTORY_NOT_EMPTY           -16\n#define DRMP3_END_OF_FILE                   -17\n#define DRMP3_NO_SPACE                      -18\n#define DRMP3_BUSY                          -19\n#define DRMP3_IO_ERROR                      -20\n#define DRMP3_INTERRUPT                     -21\n#define DRMP3_UNAVAILABLE                   -22\n#define DRMP3_ALREADY_IN_USE                -23\n#define DRMP3_BAD_ADDRESS                   -24\n#define DRMP3_BAD_SEEK                      -25\n#define DRMP3_BAD_PIPE                      -26\n#define DRMP3_DEADLOCK                      -27\n#define DRMP3_TOO_MANY_LINKS                -28\n#define DRMP3_NOT_IMPLEMENTED               -29\n#define DRMP3_NO_MESSAGE                    -30\n#define DRMP3_BAD_MESSAGE                   -31\n#define DRMP3_NO_DATA_AVAILABLE             -32\n#define DRMP3_INVALID_DATA                  -33\n#define DRMP3_TIMEOUT                       -34\n#define DRMP3_NO_NETWORK                    -35\n#define DRMP3_NOT_UNIQUE                    -36\n#define DRMP3_NOT_SOCKET                    -37\n#define DRMP3_NO_ADDRESS                    -38\n#define DRMP3_BAD_PROTOCOL                  -39\n#define DRMP3_PROTOCOL_UNAVAILABLE          -40\n#define DRMP3_PROTOCOL_NOT_SUPPORTED        -41\n#define DRMP3_PROTOCOL_FAMILY_NOT_SUPPORTED -42\n#define DRMP3_ADDRESS_FAMILY_NOT_SUPPORTED  -43\n#define DRMP3_SOCKET_NOT_SUPPORTED          -44\n#define DRMP3_CONNECTION_RESET              -45\n#define DRMP3_ALREADY_CONNECTED             -46\n#define DRMP3_NOT_CONNECTED                 -47\n#define DRMP3_CONNECTION_REFUSED            -48\n#define DRMP3_NO_HOST                       -49\n#define DRMP3_IN_PROGRESS                   -50\n#define DRMP3_CANCELLED                     -51\n#define DRMP3_MEMORY_ALREADY_MAPPED         -52\n#define DRMP3_AT_END                        -53\n\n\n#define DRMP3_MAX_PCM_FRAMES_PER_MP3_FRAME  1152\n#define DRMP3_MAX_SAMPLES_PER_FRAME         (DRMP3_MAX_PCM_FRAMES_PER_MP3_FRAME*2)\n\n#ifdef _MSC_VER\n    #define DRMP3_INLINE __forceinline\n#elif defined(__GNUC__)\n    /*\n    I've had a bug report where GCC is emitting warnings about functions possibly not being inlineable. This warning happens when\n    the __attribute__((always_inline)) attribute is defined without an \"inline\" statement. I think therefore there must be some\n    case where \"__inline__\" is not always defined, thus the compiler emitting these warnings. When using -std=c89 or -ansi on the\n    command line, we cannot use the \"inline\" keyword and instead need to use \"__inline__\". In an attempt to work around this issue\n    I am using \"__inline__\" only when we're compiling in strict ANSI mode.\n    */\n    #if defined(__STRICT_ANSI__)\n        #define DRMP3_GNUC_INLINE_HINT __inline__\n    #else\n        #define DRMP3_GNUC_INLINE_HINT inline\n    #endif\n\n    #if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)) || defined(__clang__)\n        #define DRMP3_INLINE DRMP3_GNUC_INLINE_HINT __attribute__((always_inline))\n    #else\n        #define DRMP3_INLINE DRMP3_GNUC_INLINE_HINT\n    #endif\n#elif defined(__WATCOMC__)\n    #define DRMP3_INLINE __inline\n#else\n    #define DRMP3_INLINE\n#endif\n\n\nDRMP3_API void drmp3_version(drmp3_uint32* pMajor, drmp3_uint32* pMinor, drmp3_uint32* pRevision);\nDRMP3_API const char* drmp3_version_string(void);\n\n\n/*\nLow Level Push API\n==================\n*/\ntypedef struct\n{\n    int frame_bytes, channels, hz, layer, bitrate_kbps;\n} drmp3dec_frame_info;\n\ntypedef struct\n{\n    float mdct_overlap[2][9*32], qmf_state[15*2*32];\n    int reserv, free_format_bytes;\n    drmp3_uint8 header[4], reserv_buf[511];\n} drmp3dec;\n\n/* Initializes a low level decoder. */\nDRMP3_API void drmp3dec_init(drmp3dec *dec);\n\n/* Reads a frame from a low level decoder. */\nDRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int mp3_bytes, void *pcm, drmp3dec_frame_info *info);\n\n/* Helper for converting between f32 and s16. */\nDRMP3_API void drmp3dec_f32_to_s16(const float *in, drmp3_int16 *out, size_t num_samples);\n\n\n\n/*\nMain API (Pull API)\n===================\n*/\ntypedef enum\n{\n    drmp3_seek_origin_start,\n    drmp3_seek_origin_current\n} drmp3_seek_origin;\n\ntypedef struct\n{\n    drmp3_uint64 seekPosInBytes;        /* Points to the first byte of an MP3 frame. */\n    drmp3_uint64 pcmFrameIndex;         /* The index of the PCM frame this seek point targets. */\n    drmp3_uint16 mp3FramesToDiscard;    /* The number of whole MP3 frames to be discarded before pcmFramesToDiscard. */\n    drmp3_uint16 pcmFramesToDiscard;    /* The number of leading samples to read and discard. These are discarded after mp3FramesToDiscard. */\n} drmp3_seek_point;\n\n/*\nCallback for when data is read. Return value is the number of bytes actually read.\n\npUserData   [in]  The user data that was passed to drmp3_init(), drmp3_open() and family.\npBufferOut  [out] The output buffer.\nbytesToRead [in]  The number of bytes to read.\n\nReturns the number of bytes actually read.\n\nA return value of less than bytesToRead indicates the end of the stream. Do _not_ return from this callback until\neither the entire bytesToRead is filled or you have reached the end of the stream.\n*/\ntypedef size_t (* drmp3_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead);\n\n/*\nCallback for when data needs to be seeked.\n\npUserData [in] The user data that was passed to drmp3_init(), drmp3_open() and family.\noffset    [in] The number of bytes to move, relative to the origin. Will never be negative.\norigin    [in] The origin of the seek - the current position or the start of the stream.\n\nReturns whether or not the seek was successful.\n\nWhether or not it is relative to the beginning or current position is determined by the \"origin\" parameter which\nwill be either drmp3_seek_origin_start or drmp3_seek_origin_current.\n*/\ntypedef drmp3_bool32 (* drmp3_seek_proc)(void* pUserData, int offset, drmp3_seek_origin origin);\n\ntypedef struct\n{\n    void* pUserData;\n    void* (* onMalloc)(size_t sz, void* pUserData);\n    void* (* onRealloc)(void* p, size_t sz, void* pUserData);\n    void  (* onFree)(void* p, void* pUserData);\n} drmp3_allocation_callbacks;\n\ntypedef struct\n{\n    drmp3_uint32 channels;\n    drmp3_uint32 sampleRate;\n} drmp3_config;\n\ntypedef struct\n{\n    drmp3dec decoder;\n    drmp3_uint32 channels;\n    drmp3_uint32 sampleRate;\n    drmp3_read_proc onRead;\n    drmp3_seek_proc onSeek;\n    void* pUserData;\n    drmp3_allocation_callbacks allocationCallbacks;\n    drmp3_uint32 mp3FrameChannels;      /* The number of channels in the currently loaded MP3 frame. Internal use only. */\n    drmp3_uint32 mp3FrameSampleRate;    /* The sample rate of the currently loaded MP3 frame. Internal use only. */\n    drmp3_uint32 pcmFramesConsumedInMP3Frame;\n    drmp3_uint32 pcmFramesRemainingInMP3Frame;\n    drmp3_uint8 pcmFrames[sizeof(float)*DRMP3_MAX_SAMPLES_PER_FRAME];  /* <-- Multipled by sizeof(float) to ensure there's enough room for DR_MP3_FLOAT_OUTPUT. */\n    drmp3_uint64 currentPCMFrame;       /* The current PCM frame, globally, based on the output sample rate. Mainly used for seeking. */\n    drmp3_uint64 streamCursor;          /* The current byte the decoder is sitting on in the raw stream. */\n    drmp3_seek_point* pSeekPoints;      /* NULL by default. Set with drmp3_bind_seek_table(). Memory is owned by the client. dr_mp3 will never attempt to free this pointer. */\n    drmp3_uint32 seekPointCount;        /* The number of items in pSeekPoints. When set to 0 assumes to no seek table. Defaults to zero. */\n    size_t dataSize;\n    size_t dataCapacity;\n    size_t dataConsumed;\n    drmp3_uint8* pData;\n    drmp3_bool32 atEnd : 1;\n    struct\n    {\n        const drmp3_uint8* pData;\n        size_t dataSize;\n        size_t currentReadPos;\n    } memory;   /* Only used for decoders that were opened against a block of memory. */\n} drmp3;\n\n/*\nInitializes an MP3 decoder.\n\nonRead    [in]           The function to call when data needs to be read from the client.\nonSeek    [in]           The function to call when the read position of the client data needs to move.\npUserData [in, optional] A pointer to application defined data that will be passed to onRead and onSeek.\n\nReturns true if successful; false otherwise.\n\nClose the loader with drmp3_uninit().\n\nSee also: drmp3_init_file(), drmp3_init_memory(), drmp3_uninit()\n*/\nDRMP3_API drmp3_bool32 drmp3_init(drmp3* pMP3, drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, const drmp3_allocation_callbacks* pAllocationCallbacks);\n\n/*\nInitializes an MP3 decoder from a block of memory.\n\nThis does not create a copy of the data. It is up to the application to ensure the buffer remains valid for\nthe lifetime of the drmp3 object.\n\nThe buffer should contain the contents of the entire MP3 file.\n*/\nDRMP3_API drmp3_bool32 drmp3_init_memory(drmp3* pMP3, const void* pData, size_t dataSize, const drmp3_allocation_callbacks* pAllocationCallbacks);\n\n#ifndef DR_MP3_NO_STDIO\n/*\nInitializes an MP3 decoder from a file.\n\nThis holds the internal FILE object until drmp3_uninit() is called. Keep this in mind if you're caching drmp3\nobjects because the operating system may restrict the number of file handles an application can have open at\nany given time.\n*/\nDRMP3_API drmp3_bool32 drmp3_init_file(drmp3* pMP3, const char* pFilePath, const drmp3_allocation_callbacks* pAllocationCallbacks);\nDRMP3_API drmp3_bool32 drmp3_init_file_w(drmp3* pMP3, const wchar_t* pFilePath, const drmp3_allocation_callbacks* pAllocationCallbacks);\n#endif\n\n/*\nUninitializes an MP3 decoder.\n*/\nDRMP3_API void drmp3_uninit(drmp3* pMP3);\n\n/*\nReads PCM frames as interleaved 32-bit IEEE floating point PCM.\n\nNote that framesToRead specifies the number of PCM frames to read, _not_ the number of MP3 frames.\n*/\nDRMP3_API drmp3_uint64 drmp3_read_pcm_frames_f32(drmp3* pMP3, drmp3_uint64 framesToRead, float* pBufferOut);\n\n/*\nReads PCM frames as interleaved signed 16-bit integer PCM.\n\nNote that framesToRead specifies the number of PCM frames to read, _not_ the number of MP3 frames.\n*/\nDRMP3_API drmp3_uint64 drmp3_read_pcm_frames_s16(drmp3* pMP3, drmp3_uint64 framesToRead, drmp3_int16* pBufferOut);\n\n/*\nSeeks to a specific frame.\n\nNote that this is _not_ an MP3 frame, but rather a PCM frame.\n*/\nDRMP3_API drmp3_bool32 drmp3_seek_to_pcm_frame(drmp3* pMP3, drmp3_uint64 frameIndex);\n\n/*\nCalculates the total number of PCM frames in the MP3 stream. Cannot be used for infinite streams such as internet\nradio. Runs in linear time. Returns 0 on error.\n*/\nDRMP3_API drmp3_uint64 drmp3_get_pcm_frame_count(drmp3* pMP3);\n\n/*\nCalculates the total number of MP3 frames in the MP3 stream. Cannot be used for infinite streams such as internet\nradio. Runs in linear time. Returns 0 on error.\n*/\nDRMP3_API drmp3_uint64 drmp3_get_mp3_frame_count(drmp3* pMP3);\n\n/*\nCalculates the total number of MP3 and PCM frames in the MP3 stream. Cannot be used for infinite streams such as internet\nradio. Runs in linear time. Returns 0 on error.\n\nThis is equivalent to calling drmp3_get_mp3_frame_count() and drmp3_get_pcm_frame_count() except that it's more efficient.\n*/\nDRMP3_API drmp3_bool32 drmp3_get_mp3_and_pcm_frame_count(drmp3* pMP3, drmp3_uint64* pMP3FrameCount, drmp3_uint64* pPCMFrameCount);\n\n/*\nCalculates the seekpoints based on PCM frames. This is slow.\n\npSeekpoint count is a pointer to a uint32 containing the seekpoint count. On input it contains the desired count.\nOn output it contains the actual count. The reason for this design is that the client may request too many\nseekpoints, in which case dr_mp3 will return a corrected count.\n\nNote that seektable seeking is not quite sample exact when the MP3 stream contains inconsistent sample rates.\n*/\nDRMP3_API drmp3_bool32 drmp3_calculate_seek_points(drmp3* pMP3, drmp3_uint32* pSeekPointCount, drmp3_seek_point* pSeekPoints);\n\n/*\nBinds a seek table to the decoder.\n\nThis does _not_ make a copy of pSeekPoints - it only references it. It is up to the application to ensure this\nremains valid while it is bound to the decoder.\n\nUse drmp3_calculate_seek_points() to calculate the seek points.\n*/\nDRMP3_API drmp3_bool32 drmp3_bind_seek_table(drmp3* pMP3, drmp3_uint32 seekPointCount, drmp3_seek_point* pSeekPoints);\n\n\n/*\nOpens an decodes an entire MP3 stream as a single operation.\n\nOn output pConfig will receive the channel count and sample rate of the stream.\n\nFree the returned pointer with drmp3_free().\n*/\nDRMP3_API float* drmp3_open_and_read_pcm_frames_f32(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks);\nDRMP3_API drmp3_int16* drmp3_open_and_read_pcm_frames_s16(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks);\n\nDRMP3_API float* drmp3_open_memory_and_read_pcm_frames_f32(const void* pData, size_t dataSize, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks);\nDRMP3_API drmp3_int16* drmp3_open_memory_and_read_pcm_frames_s16(const void* pData, size_t dataSize, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks);\n\n#ifndef DR_MP3_NO_STDIO\nDRMP3_API float* drmp3_open_file_and_read_pcm_frames_f32(const char* filePath, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks);\nDRMP3_API drmp3_int16* drmp3_open_file_and_read_pcm_frames_s16(const char* filePath, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks);\n#endif\n\n/*\nAllocates a block of memory on the heap.\n*/\nDRMP3_API void* drmp3_malloc(size_t sz, const drmp3_allocation_callbacks* pAllocationCallbacks);\n\n/*\nFrees any memory that was allocated by a public drmp3 API.\n*/\nDRMP3_API void drmp3_free(void* p, const drmp3_allocation_callbacks* pAllocationCallbacks);\n\n#ifdef __cplusplus\n}\n#endif\n#endif  /* dr_mp3_h */\n\n\n/************************************************************************************************************************************************************\n ************************************************************************************************************************************************************\n\n IMPLEMENTATION\n\n ************************************************************************************************************************************************************\n ************************************************************************************************************************************************************/\n#if defined(DR_MP3_IMPLEMENTATION) || defined(DRMP3_IMPLEMENTATION)\n#ifndef dr_mp3_c\n#define dr_mp3_c\n\n#include <stdlib.h>\n#include <string.h>\n#include <limits.h> /* For INT_MAX */\n\nDRMP3_API void drmp3_version(drmp3_uint32* pMajor, drmp3_uint32* pMinor, drmp3_uint32* pRevision)\n{\n    if (pMajor) {\n        *pMajor = DRMP3_VERSION_MAJOR;\n    }\n\n    if (pMinor) {\n        *pMinor = DRMP3_VERSION_MINOR;\n    }\n\n    if (pRevision) {\n        *pRevision = DRMP3_VERSION_REVISION;\n    }\n}\n\nDRMP3_API const char* drmp3_version_string(void)\n{\n    return DRMP3_VERSION_STRING;\n}\n\n/* Disable SIMD when compiling with TCC for now. */\n#if defined(__TINYC__)\n#define DR_MP3_NO_SIMD\n#endif\n\n#define DRMP3_OFFSET_PTR(p, offset) ((void*)((drmp3_uint8*)(p) + (offset)))\n\n#define DRMP3_MAX_FREE_FORMAT_FRAME_SIZE  2304    /* more than ISO spec's */\n#ifndef DRMP3_MAX_FRAME_SYNC_MATCHES\n#define DRMP3_MAX_FRAME_SYNC_MATCHES      10\n#endif\n\n#define DRMP3_MAX_L3_FRAME_PAYLOAD_BYTES  DRMP3_MAX_FREE_FORMAT_FRAME_SIZE /* MUST be >= 320000/8/32000*1152 = 1440 */\n\n#define DRMP3_MAX_BITRESERVOIR_BYTES      511\n#define DRMP3_SHORT_BLOCK_TYPE            2\n#define DRMP3_STOP_BLOCK_TYPE             3\n#define DRMP3_MODE_MONO                   3\n#define DRMP3_MODE_JOINT_STEREO           1\n#define DRMP3_HDR_SIZE                    4\n#define DRMP3_HDR_IS_MONO(h)              (((h[3]) & 0xC0) == 0xC0)\n#define DRMP3_HDR_IS_MS_STEREO(h)         (((h[3]) & 0xE0) == 0x60)\n#define DRMP3_HDR_IS_FREE_FORMAT(h)       (((h[2]) & 0xF0) == 0)\n#define DRMP3_HDR_IS_CRC(h)               (!((h[1]) & 1))\n#define DRMP3_HDR_TEST_PADDING(h)         ((h[2]) & 0x2)\n#define DRMP3_HDR_TEST_MPEG1(h)           ((h[1]) & 0x8)\n#define DRMP3_HDR_TEST_NOT_MPEG25(h)      ((h[1]) & 0x10)\n#define DRMP3_HDR_TEST_I_STEREO(h)        ((h[3]) & 0x10)\n#define DRMP3_HDR_TEST_MS_STEREO(h)       ((h[3]) & 0x20)\n#define DRMP3_HDR_GET_STEREO_MODE(h)      (((h[3]) >> 6) & 3)\n#define DRMP3_HDR_GET_STEREO_MODE_EXT(h)  (((h[3]) >> 4) & 3)\n#define DRMP3_HDR_GET_LAYER(h)            (((h[1]) >> 1) & 3)\n#define DRMP3_HDR_GET_BITRATE(h)          ((h[2]) >> 4)\n#define DRMP3_HDR_GET_SAMPLE_RATE(h)      (((h[2]) >> 2) & 3)\n#define DRMP3_HDR_GET_MY_SAMPLE_RATE(h)   (DRMP3_HDR_GET_SAMPLE_RATE(h) + (((h[1] >> 3) & 1) + ((h[1] >> 4) & 1))*3)\n#define DRMP3_HDR_IS_FRAME_576(h)         ((h[1] & 14) == 2)\n#define DRMP3_HDR_IS_LAYER_1(h)           ((h[1] & 6) == 6)\n\n#define DRMP3_BITS_DEQUANTIZER_OUT        -1\n#define DRMP3_MAX_SCF                     (255 + DRMP3_BITS_DEQUANTIZER_OUT*4 - 210)\n#define DRMP3_MAX_SCFI                    ((DRMP3_MAX_SCF + 3) & ~3)\n\n#define DRMP3_MIN(a, b)           ((a) > (b) ? (b) : (a))\n#define DRMP3_MAX(a, b)           ((a) < (b) ? (b) : (a))\n\n#if !defined(DR_MP3_NO_SIMD)\n\n#if !defined(DR_MP3_ONLY_SIMD) && (defined(_M_X64) || defined(__x86_64__) || defined(__aarch64__) || defined(_M_ARM64))\n/* x64 always have SSE2, arm64 always have neon, no need for generic code */\n#define DR_MP3_ONLY_SIMD\n#endif\n\n#if ((defined(_MSC_VER) && _MSC_VER >= 1400) && defined(_M_X64)) || ((defined(__i386) || defined(_M_IX86) || defined(__i386__) || defined(__x86_64__)) && ((defined(_M_IX86_FP) && _M_IX86_FP == 2) || defined(__SSE2__)))\n#if defined(_MSC_VER)\n#include <intrin.h>\n#endif\n#include <emmintrin.h>\n#define DRMP3_HAVE_SSE 1\n#define DRMP3_HAVE_SIMD 1\n#define DRMP3_VSTORE _mm_storeu_ps\n#define DRMP3_VLD _mm_loadu_ps\n#define DRMP3_VSET _mm_set1_ps\n#define DRMP3_VADD _mm_add_ps\n#define DRMP3_VSUB _mm_sub_ps\n#define DRMP3_VMUL _mm_mul_ps\n#define DRMP3_VMAC(a, x, y) _mm_add_ps(a, _mm_mul_ps(x, y))\n#define DRMP3_VMSB(a, x, y) _mm_sub_ps(a, _mm_mul_ps(x, y))\n#define DRMP3_VMUL_S(x, s)  _mm_mul_ps(x, _mm_set1_ps(s))\n#define DRMP3_VREV(x) _mm_shuffle_ps(x, x, _MM_SHUFFLE(0, 1, 2, 3))\ntypedef __m128 drmp3_f4;\n#if defined(_MSC_VER) || defined(DR_MP3_ONLY_SIMD)\n#define drmp3_cpuid __cpuid\n#else\nstatic __inline__ __attribute__((always_inline)) void drmp3_cpuid(int CPUInfo[], const int InfoType)\n{\n#if defined(__PIC__)\n    __asm__ __volatile__(\n#if defined(__x86_64__)\n        \"push %%rbx\\n\"\n        \"cpuid\\n\"\n        \"xchgl %%ebx, %1\\n\"\n        \"pop  %%rbx\\n\"\n#else\n        \"xchgl %%ebx, %1\\n\"\n        \"cpuid\\n\"\n        \"xchgl %%ebx, %1\\n\"\n#endif\n        : \"=a\" (CPUInfo[0]), \"=r\" (CPUInfo[1]), \"=c\" (CPUInfo[2]), \"=d\" (CPUInfo[3])\n        : \"a\" (InfoType));\n#else\n    __asm__ __volatile__(\n        \"cpuid\"\n        : \"=a\" (CPUInfo[0]), \"=b\" (CPUInfo[1]), \"=c\" (CPUInfo[2]), \"=d\" (CPUInfo[3])\n        : \"a\" (InfoType));\n#endif\n}\n#endif\nstatic int drmp3_have_simd(void)\n{\n#ifdef DR_MP3_ONLY_SIMD\n    return 1;\n#else\n    static int g_have_simd;\n    int CPUInfo[4];\n#ifdef MINIMP3_TEST\n    static int g_counter;\n    if (g_counter++ > 100)\n        return 0;\n#endif\n    if (g_have_simd)\n        goto end;\n    drmp3_cpuid(CPUInfo, 0);\n    if (CPUInfo[0] > 0)\n    {\n        drmp3_cpuid(CPUInfo, 1);\n        g_have_simd = (CPUInfo[3] & (1 << 26)) + 1; /* SSE2 */\n        return g_have_simd - 1;\n    }\n\nend:\n    return g_have_simd - 1;\n#endif\n}\n#elif defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64)\n#include <arm_neon.h>\n#define DRMP3_HAVE_SSE 0\n#define DRMP3_HAVE_SIMD 1\n#define DRMP3_VSTORE vst1q_f32\n#define DRMP3_VLD vld1q_f32\n#define DRMP3_VSET vmovq_n_f32\n#define DRMP3_VADD vaddq_f32\n#define DRMP3_VSUB vsubq_f32\n#define DRMP3_VMUL vmulq_f32\n#define DRMP3_VMAC(a, x, y) vmlaq_f32(a, x, y)\n#define DRMP3_VMSB(a, x, y) vmlsq_f32(a, x, y)\n#define DRMP3_VMUL_S(x, s)  vmulq_f32(x, vmovq_n_f32(s))\n#define DRMP3_VREV(x) vcombine_f32(vget_high_f32(vrev64q_f32(x)), vget_low_f32(vrev64q_f32(x)))\ntypedef float32x4_t drmp3_f4;\nstatic int drmp3_have_simd(void)\n{   /* TODO: detect neon for !DR_MP3_ONLY_SIMD */\n    return 1;\n}\n#else\n#define DRMP3_HAVE_SSE 0\n#define DRMP3_HAVE_SIMD 0\n#ifdef DR_MP3_ONLY_SIMD\n#error DR_MP3_ONLY_SIMD used, but SSE/NEON not enabled\n#endif\n#endif\n\n#else\n\n#define DRMP3_HAVE_SIMD 0\n\n#endif\n\n#if defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__aarch64__) && !defined(_M_ARM64)\n#define DRMP3_HAVE_ARMV6 1\nstatic __inline__ __attribute__((always_inline)) drmp3_int32 drmp3_clip_int16_arm(drmp3_int32 a)\n{\n    drmp3_int32 x = 0;\n    __asm__ (\"ssat %0, #16, %1\" : \"=r\"(x) : \"r\"(a));\n    return x;\n}\n#else\n#define DRMP3_HAVE_ARMV6 0\n#endif\n\n\n/* Standard library stuff. */\n#ifndef DRMP3_ASSERT\n#include <assert.h>\n#define DRMP3_ASSERT(expression) assert(expression)\n#endif\n#ifndef DRMP3_COPY_MEMORY\n#define DRMP3_COPY_MEMORY(dst, src, sz) memcpy((dst), (src), (sz))\n#endif\n#ifndef DRMP3_MOVE_MEMORY\n#define DRMP3_MOVE_MEMORY(dst, src, sz) memmove((dst), (src), (sz))\n#endif\n#ifndef DRMP3_ZERO_MEMORY\n#define DRMP3_ZERO_MEMORY(p, sz) memset((p), 0, (sz))\n#endif\n#define DRMP3_ZERO_OBJECT(p) DRMP3_ZERO_MEMORY((p), sizeof(*(p)))\n#ifndef DRMP3_MALLOC\n#define DRMP3_MALLOC(sz) malloc((sz))\n#endif\n#ifndef DRMP3_REALLOC\n#define DRMP3_REALLOC(p, sz) realloc((p), (sz))\n#endif\n#ifndef DRMP3_FREE\n#define DRMP3_FREE(p) free((p))\n#endif\n\ntypedef struct\n{\n    const drmp3_uint8 *buf;\n    int pos, limit;\n} drmp3_bs;\n\ntypedef struct\n{\n    float scf[3*64];\n    drmp3_uint8 total_bands, stereo_bands, bitalloc[64], scfcod[64];\n} drmp3_L12_scale_info;\n\ntypedef struct\n{\n    drmp3_uint8 tab_offset, code_tab_width, band_count;\n} drmp3_L12_subband_alloc;\n\ntypedef struct\n{\n    const drmp3_uint8 *sfbtab;\n    drmp3_uint16 part_23_length, big_values, scalefac_compress;\n    drmp3_uint8 global_gain, block_type, mixed_block_flag, n_long_sfb, n_short_sfb;\n    drmp3_uint8 table_select[3], region_count[3], subblock_gain[3];\n    drmp3_uint8 preflag, scalefac_scale, count1_table, scfsi;\n} drmp3_L3_gr_info;\n\ntypedef struct\n{\n    drmp3_bs bs;\n    drmp3_uint8 maindata[DRMP3_MAX_BITRESERVOIR_BYTES + DRMP3_MAX_L3_FRAME_PAYLOAD_BYTES];\n    drmp3_L3_gr_info gr_info[4];\n    float grbuf[2][576], scf[40], syn[18 + 15][2*32];\n    drmp3_uint8 ist_pos[2][39];\n} drmp3dec_scratch;\n\nstatic void drmp3_bs_init(drmp3_bs *bs, const drmp3_uint8 *data, int bytes)\n{\n    bs->buf   = data;\n    bs->pos   = 0;\n    bs->limit = bytes*8;\n}\n\nstatic drmp3_uint32 drmp3_bs_get_bits(drmp3_bs *bs, int n)\n{\n    drmp3_uint32 next, cache = 0, s = bs->pos & 7;\n    int shl = n + s;\n    const drmp3_uint8 *p = bs->buf + (bs->pos >> 3);\n    if ((bs->pos += n) > bs->limit)\n        return 0;\n    next = *p++ & (255 >> s);\n    while ((shl -= 8) > 0)\n    {\n        cache |= next << shl;\n        next = *p++;\n    }\n    return cache | (next >> -shl);\n}\n\nstatic int drmp3_hdr_valid(const drmp3_uint8 *h)\n{\n    return h[0] == 0xff &&\n        ((h[1] & 0xF0) == 0xf0 || (h[1] & 0xFE) == 0xe2) &&\n        (DRMP3_HDR_GET_LAYER(h) != 0) &&\n        (DRMP3_HDR_GET_BITRATE(h) != 15) &&\n        (DRMP3_HDR_GET_SAMPLE_RATE(h) != 3);\n}\n\nstatic int drmp3_hdr_compare(const drmp3_uint8 *h1, const drmp3_uint8 *h2)\n{\n    return drmp3_hdr_valid(h2) &&\n        ((h1[1] ^ h2[1]) & 0xFE) == 0 &&\n        ((h1[2] ^ h2[2]) & 0x0C) == 0 &&\n        !(DRMP3_HDR_IS_FREE_FORMAT(h1) ^ DRMP3_HDR_IS_FREE_FORMAT(h2));\n}\n\nstatic unsigned drmp3_hdr_bitrate_kbps(const drmp3_uint8 *h)\n{\n    static const drmp3_uint8 halfrate[2][3][15] = {\n        { { 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 }, { 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 }, { 0,16,24,28,32,40,48,56,64,72,80,88,96,112,128 } },\n        { { 0,16,20,24,28,32,40,48,56,64,80,96,112,128,160 }, { 0,16,24,28,32,40,48,56,64,80,96,112,128,160,192 }, { 0,16,32,48,64,80,96,112,128,144,160,176,192,208,224 } },\n    };\n    return 2*halfrate[!!DRMP3_HDR_TEST_MPEG1(h)][DRMP3_HDR_GET_LAYER(h) - 1][DRMP3_HDR_GET_BITRATE(h)];\n}\n\nstatic unsigned drmp3_hdr_sample_rate_hz(const drmp3_uint8 *h)\n{\n    static const unsigned g_hz[3] = { 44100, 48000, 32000 };\n    return g_hz[DRMP3_HDR_GET_SAMPLE_RATE(h)] >> (int)!DRMP3_HDR_TEST_MPEG1(h) >> (int)!DRMP3_HDR_TEST_NOT_MPEG25(h);\n}\n\nstatic unsigned drmp3_hdr_frame_samples(const drmp3_uint8 *h)\n{\n    return DRMP3_HDR_IS_LAYER_1(h) ? 384 : (1152 >> (int)DRMP3_HDR_IS_FRAME_576(h));\n}\n\nstatic int drmp3_hdr_frame_bytes(const drmp3_uint8 *h, int free_format_size)\n{\n    int frame_bytes = drmp3_hdr_frame_samples(h)*drmp3_hdr_bitrate_kbps(h)*125/drmp3_hdr_sample_rate_hz(h);\n    if (DRMP3_HDR_IS_LAYER_1(h))\n    {\n        frame_bytes &= ~3; /* slot align */\n    }\n    return frame_bytes ? frame_bytes : free_format_size;\n}\n\nstatic int drmp3_hdr_padding(const drmp3_uint8 *h)\n{\n    return DRMP3_HDR_TEST_PADDING(h) ? (DRMP3_HDR_IS_LAYER_1(h) ? 4 : 1) : 0;\n}\n\n#ifndef DR_MP3_ONLY_MP3\nstatic const drmp3_L12_subband_alloc *drmp3_L12_subband_alloc_table(const drmp3_uint8 *hdr, drmp3_L12_scale_info *sci)\n{\n    const drmp3_L12_subband_alloc *alloc;\n    int mode = DRMP3_HDR_GET_STEREO_MODE(hdr);\n    int nbands, stereo_bands = (mode == DRMP3_MODE_MONO) ? 0 : (mode == DRMP3_MODE_JOINT_STEREO) ? (DRMP3_HDR_GET_STEREO_MODE_EXT(hdr) << 2) + 4 : 32;\n\n    if (DRMP3_HDR_IS_LAYER_1(hdr))\n    {\n        static const drmp3_L12_subband_alloc g_alloc_L1[] = { { 76, 4, 32 } };\n        alloc = g_alloc_L1;\n        nbands = 32;\n    } else if (!DRMP3_HDR_TEST_MPEG1(hdr))\n    {\n        static const drmp3_L12_subband_alloc g_alloc_L2M2[] = { { 60, 4, 4 }, { 44, 3, 7 }, { 44, 2, 19 } };\n        alloc = g_alloc_L2M2;\n        nbands = 30;\n    } else\n    {\n        static const drmp3_L12_subband_alloc g_alloc_L2M1[] = { { 0, 4, 3 }, { 16, 4, 8 }, { 32, 3, 12 }, { 40, 2, 7 } };\n        int sample_rate_idx = DRMP3_HDR_GET_SAMPLE_RATE(hdr);\n        unsigned kbps = drmp3_hdr_bitrate_kbps(hdr) >> (int)(mode != DRMP3_MODE_MONO);\n        if (!kbps) /* free-format */\n        {\n            kbps = 192;\n        }\n\n        alloc = g_alloc_L2M1;\n        nbands = 27;\n        if (kbps < 56)\n        {\n            static const drmp3_L12_subband_alloc g_alloc_L2M1_lowrate[] = { { 44, 4, 2 }, { 44, 3, 10 } };\n            alloc = g_alloc_L2M1_lowrate;\n            nbands = sample_rate_idx == 2 ? 12 : 8;\n        } else if (kbps >= 96 && sample_rate_idx != 1)\n        {\n            nbands = 30;\n        }\n    }\n\n    sci->total_bands = (drmp3_uint8)nbands;\n    sci->stereo_bands = (drmp3_uint8)DRMP3_MIN(stereo_bands, nbands);\n\n    return alloc;\n}\n\nstatic void drmp3_L12_read_scalefactors(drmp3_bs *bs, drmp3_uint8 *pba, drmp3_uint8 *scfcod, int bands, float *scf)\n{\n    static const float g_deq_L12[18*3] = {\n#define DRMP3_DQ(x) 9.53674316e-07f/x, 7.56931807e-07f/x, 6.00777173e-07f/x\n        DRMP3_DQ(3),DRMP3_DQ(7),DRMP3_DQ(15),DRMP3_DQ(31),DRMP3_DQ(63),DRMP3_DQ(127),DRMP3_DQ(255),DRMP3_DQ(511),DRMP3_DQ(1023),DRMP3_DQ(2047),DRMP3_DQ(4095),DRMP3_DQ(8191),DRMP3_DQ(16383),DRMP3_DQ(32767),DRMP3_DQ(65535),DRMP3_DQ(3),DRMP3_DQ(5),DRMP3_DQ(9)\n    };\n    int i, m;\n    for (i = 0; i < bands; i++)\n    {\n        float s = 0;\n        int ba = *pba++;\n        int mask = ba ? 4 + ((19 >> scfcod[i]) & 3) : 0;\n        for (m = 4; m; m >>= 1)\n        {\n            if (mask & m)\n            {\n                int b = drmp3_bs_get_bits(bs, 6);\n                s = g_deq_L12[ba*3 - 6 + b % 3]*(int)(1 << 21 >> b/3);\n            }\n            *scf++ = s;\n        }\n    }\n}\n\nstatic void drmp3_L12_read_scale_info(const drmp3_uint8 *hdr, drmp3_bs *bs, drmp3_L12_scale_info *sci)\n{\n    static const drmp3_uint8 g_bitalloc_code_tab[] = {\n        0,17, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16,\n        0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,16,\n        0,17,18, 3,19,4,5,16,\n        0,17,18,16,\n        0,17,18,19, 4,5,6, 7,8, 9,10,11,12,13,14,15,\n        0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,14,\n        0, 2, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16\n    };\n    const drmp3_L12_subband_alloc *subband_alloc = drmp3_L12_subband_alloc_table(hdr, sci);\n\n    int i, k = 0, ba_bits = 0;\n    const drmp3_uint8 *ba_code_tab = g_bitalloc_code_tab;\n\n    for (i = 0; i < sci->total_bands; i++)\n    {\n        drmp3_uint8 ba;\n        if (i == k)\n        {\n            k += subband_alloc->band_count;\n            ba_bits = subband_alloc->code_tab_width;\n            ba_code_tab = g_bitalloc_code_tab + subband_alloc->tab_offset;\n            subband_alloc++;\n        }\n        ba = ba_code_tab[drmp3_bs_get_bits(bs, ba_bits)];\n        sci->bitalloc[2*i] = ba;\n        if (i < sci->stereo_bands)\n        {\n            ba = ba_code_tab[drmp3_bs_get_bits(bs, ba_bits)];\n        }\n        sci->bitalloc[2*i + 1] = sci->stereo_bands ? ba : 0;\n    }\n\n    for (i = 0; i < 2*sci->total_bands; i++)\n    {\n        sci->scfcod[i] = (drmp3_uint8)(sci->bitalloc[i] ? DRMP3_HDR_IS_LAYER_1(hdr) ? 2 : drmp3_bs_get_bits(bs, 2) : 6);\n    }\n\n    drmp3_L12_read_scalefactors(bs, sci->bitalloc, sci->scfcod, sci->total_bands*2, sci->scf);\n\n    for (i = sci->stereo_bands; i < sci->total_bands; i++)\n    {\n        sci->bitalloc[2*i + 1] = 0;\n    }\n}\n\nstatic int drmp3_L12_dequantize_granule(float *grbuf, drmp3_bs *bs, drmp3_L12_scale_info *sci, int group_size)\n{\n    int i, j, k, choff = 576;\n    for (j = 0; j < 4; j++)\n    {\n        float *dst = grbuf + group_size*j;\n        for (i = 0; i < 2*sci->total_bands; i++)\n        {\n            int ba = sci->bitalloc[i];\n            if (ba != 0)\n            {\n                if (ba < 17)\n                {\n                    int half = (1 << (ba - 1)) - 1;\n                    for (k = 0; k < group_size; k++)\n                    {\n                        dst[k] = (float)((int)drmp3_bs_get_bits(bs, ba) - half);\n                    }\n                } else\n                {\n                    unsigned mod = (2 << (ba - 17)) + 1;    /* 3, 5, 9 */\n                    unsigned code = drmp3_bs_get_bits(bs, mod + 2 - (mod >> 3));  /* 5, 7, 10 */\n                    for (k = 0; k < group_size; k++, code /= mod)\n                    {\n                        dst[k] = (float)((int)(code % mod - mod/2));\n                    }\n                }\n            }\n            dst += choff;\n            choff = 18 - choff;\n        }\n    }\n    return group_size*4;\n}\n\nstatic void drmp3_L12_apply_scf_384(drmp3_L12_scale_info *sci, const float *scf, float *dst)\n{\n    int i, k;\n    DRMP3_COPY_MEMORY(dst + 576 + sci->stereo_bands*18, dst + sci->stereo_bands*18, (sci->total_bands - sci->stereo_bands)*18*sizeof(float));\n    for (i = 0; i < sci->total_bands; i++, dst += 18, scf += 6)\n    {\n        for (k = 0; k < 12; k++)\n        {\n            dst[k + 0]   *= scf[0];\n            dst[k + 576] *= scf[3];\n        }\n    }\n}\n#endif\n\nstatic int drmp3_L3_read_side_info(drmp3_bs *bs, drmp3_L3_gr_info *gr, const drmp3_uint8 *hdr)\n{\n    static const drmp3_uint8 g_scf_long[8][23] = {\n        { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },\n        { 12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2,0 },\n        { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },\n        { 6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,54,62,70,76,36,0 },\n        { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },\n        { 4,4,4,4,4,4,6,6,8,8,10,12,16,20,24,28,34,42,50,54,76,158,0 },\n        { 4,4,4,4,4,4,6,6,6,8,10,12,16,18,22,28,34,40,46,54,54,192,0 },\n        { 4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102,26,0 }\n    };\n    static const drmp3_uint8 g_scf_short[8][40] = {\n        { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },\n        { 8,8,8,8,8,8,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 },\n        { 4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 },\n        { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 },\n        { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },\n        { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 },\n        { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 },\n        { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 }\n    };\n    static const drmp3_uint8 g_scf_mixed[8][40] = {\n        { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },\n        { 12,12,12,4,4,4,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 },\n        { 6,6,6,6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 },\n        { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 },\n        { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },\n        { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 },\n        { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 },\n        { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 }\n    };\n\n    unsigned tables, scfsi = 0;\n    int main_data_begin, part_23_sum = 0;\n    int gr_count = DRMP3_HDR_IS_MONO(hdr) ? 1 : 2;\n    int sr_idx = DRMP3_HDR_GET_MY_SAMPLE_RATE(hdr); sr_idx -= (sr_idx != 0);\n\n    if (DRMP3_HDR_TEST_MPEG1(hdr))\n    {\n        gr_count *= 2;\n        main_data_begin = drmp3_bs_get_bits(bs, 9);\n        scfsi = drmp3_bs_get_bits(bs, 7 + gr_count);\n    } else\n    {\n        main_data_begin = drmp3_bs_get_bits(bs, 8 + gr_count) >> gr_count;\n    }\n\n    do\n    {\n        if (DRMP3_HDR_IS_MONO(hdr))\n        {\n            scfsi <<= 4;\n        }\n        gr->part_23_length = (drmp3_uint16)drmp3_bs_get_bits(bs, 12);\n        part_23_sum += gr->part_23_length;\n        gr->big_values = (drmp3_uint16)drmp3_bs_get_bits(bs,  9);\n        if (gr->big_values > 288)\n        {\n            return -1;\n        }\n        gr->global_gain = (drmp3_uint8)drmp3_bs_get_bits(bs, 8);\n        gr->scalefac_compress = (drmp3_uint16)drmp3_bs_get_bits(bs, DRMP3_HDR_TEST_MPEG1(hdr) ? 4 : 9);\n        gr->sfbtab = g_scf_long[sr_idx];\n        gr->n_long_sfb  = 22;\n        gr->n_short_sfb = 0;\n        if (drmp3_bs_get_bits(bs, 1))\n        {\n            gr->block_type = (drmp3_uint8)drmp3_bs_get_bits(bs, 2);\n            if (!gr->block_type)\n            {\n                return -1;\n            }\n            gr->mixed_block_flag = (drmp3_uint8)drmp3_bs_get_bits(bs, 1);\n            gr->region_count[0] = 7;\n            gr->region_count[1] = 255;\n            if (gr->block_type == DRMP3_SHORT_BLOCK_TYPE)\n            {\n                scfsi &= 0x0F0F;\n                if (!gr->mixed_block_flag)\n                {\n                    gr->region_count[0] = 8;\n                    gr->sfbtab = g_scf_short[sr_idx];\n                    gr->n_long_sfb = 0;\n                    gr->n_short_sfb = 39;\n                } else\n                {\n                    gr->sfbtab = g_scf_mixed[sr_idx];\n                    gr->n_long_sfb = DRMP3_HDR_TEST_MPEG1(hdr) ? 8 : 6;\n                    gr->n_short_sfb = 30;\n                }\n            }\n            tables = drmp3_bs_get_bits(bs, 10);\n            tables <<= 5;\n            gr->subblock_gain[0] = (drmp3_uint8)drmp3_bs_get_bits(bs, 3);\n            gr->subblock_gain[1] = (drmp3_uint8)drmp3_bs_get_bits(bs, 3);\n            gr->subblock_gain[2] = (drmp3_uint8)drmp3_bs_get_bits(bs, 3);\n        } else\n        {\n            gr->block_type = 0;\n            gr->mixed_block_flag = 0;\n            tables = drmp3_bs_get_bits(bs, 15);\n            gr->region_count[0] = (drmp3_uint8)drmp3_bs_get_bits(bs, 4);\n            gr->region_count[1] = (drmp3_uint8)drmp3_bs_get_bits(bs, 3);\n            gr->region_count[2] = 255;\n        }\n        gr->table_select[0] = (drmp3_uint8)(tables >> 10);\n        gr->table_select[1] = (drmp3_uint8)((tables >> 5) & 31);\n        gr->table_select[2] = (drmp3_uint8)((tables) & 31);\n        gr->preflag = (drmp3_uint8)(DRMP3_HDR_TEST_MPEG1(hdr) ? drmp3_bs_get_bits(bs, 1) : (gr->scalefac_compress >= 500));\n        gr->scalefac_scale = (drmp3_uint8)drmp3_bs_get_bits(bs, 1);\n        gr->count1_table = (drmp3_uint8)drmp3_bs_get_bits(bs, 1);\n        gr->scfsi = (drmp3_uint8)((scfsi >> 12) & 15);\n        scfsi <<= 4;\n        gr++;\n    } while(--gr_count);\n\n    if (part_23_sum + bs->pos > bs->limit + main_data_begin*8)\n    {\n        return -1;\n    }\n\n    return main_data_begin;\n}\n\nstatic void drmp3_L3_read_scalefactors(drmp3_uint8 *scf, drmp3_uint8 *ist_pos, const drmp3_uint8 *scf_size, const drmp3_uint8 *scf_count, drmp3_bs *bitbuf, int scfsi)\n{\n    int i, k;\n    for (i = 0; i < 4 && scf_count[i]; i++, scfsi *= 2)\n    {\n        int cnt = scf_count[i];\n        if (scfsi & 8)\n        {\n            DRMP3_COPY_MEMORY(scf, ist_pos, cnt);\n        } else\n        {\n            int bits = scf_size[i];\n            if (!bits)\n            {\n                DRMP3_ZERO_MEMORY(scf, cnt);\n                DRMP3_ZERO_MEMORY(ist_pos, cnt);\n            } else\n            {\n                int max_scf = (scfsi < 0) ? (1 << bits) - 1 : -1;\n                for (k = 0; k < cnt; k++)\n                {\n                    int s = drmp3_bs_get_bits(bitbuf, bits);\n                    ist_pos[k] = (drmp3_uint8)(s == max_scf ? -1 : s);\n                    scf[k] = (drmp3_uint8)s;\n                }\n            }\n        }\n        ist_pos += cnt;\n        scf += cnt;\n    }\n    scf[0] = scf[1] = scf[2] = 0;\n}\n\nstatic float drmp3_L3_ldexp_q2(float y, int exp_q2)\n{\n    static const float g_expfrac[4] = { 9.31322575e-10f,7.83145814e-10f,6.58544508e-10f,5.53767716e-10f };\n    int e;\n    do\n    {\n        e = DRMP3_MIN(30*4, exp_q2);\n        y *= g_expfrac[e & 3]*(1 << 30 >> (e >> 2));\n    } while ((exp_q2 -= e) > 0);\n    return y;\n}\n\nstatic void drmp3_L3_decode_scalefactors(const drmp3_uint8 *hdr, drmp3_uint8 *ist_pos, drmp3_bs *bs, const drmp3_L3_gr_info *gr, float *scf, int ch)\n{\n    static const drmp3_uint8 g_scf_partitions[3][28] = {\n        { 6,5,5, 5,6,5,5,5,6,5, 7,3,11,10,0,0, 7, 7, 7,0, 6, 6,6,3, 8, 8,5,0 },\n        { 8,9,6,12,6,9,9,9,6,9,12,6,15,18,0,0, 6,15,12,0, 6,12,9,6, 6,18,9,0 },\n        { 9,9,6,12,9,9,9,9,9,9,12,6,18,18,0,0,12,12,12,0,12, 9,9,6,15,12,9,0 }\n    };\n    const drmp3_uint8 *scf_partition = g_scf_partitions[!!gr->n_short_sfb + !gr->n_long_sfb];\n    drmp3_uint8 scf_size[4], iscf[40];\n    int i, scf_shift = gr->scalefac_scale + 1, gain_exp, scfsi = gr->scfsi;\n    float gain;\n\n    if (DRMP3_HDR_TEST_MPEG1(hdr))\n    {\n        static const drmp3_uint8 g_scfc_decode[16] = { 0,1,2,3, 12,5,6,7, 9,10,11,13, 14,15,18,19 };\n        int part = g_scfc_decode[gr->scalefac_compress];\n        scf_size[1] = scf_size[0] = (drmp3_uint8)(part >> 2);\n        scf_size[3] = scf_size[2] = (drmp3_uint8)(part & 3);\n    } else\n    {\n        static const drmp3_uint8 g_mod[6*4] = { 5,5,4,4,5,5,4,1,4,3,1,1,5,6,6,1,4,4,4,1,4,3,1,1 };\n        int k, modprod, sfc, ist = DRMP3_HDR_TEST_I_STEREO(hdr) && ch;\n        sfc = gr->scalefac_compress >> ist;\n        for (k = ist*3*4; sfc >= 0; sfc -= modprod, k += 4)\n        {\n            for (modprod = 1, i = 3; i >= 0; i--)\n            {\n                scf_size[i] = (drmp3_uint8)(sfc / modprod % g_mod[k + i]);\n                modprod *= g_mod[k + i];\n            }\n        }\n        scf_partition += k;\n        scfsi = -16;\n    }\n    drmp3_L3_read_scalefactors(iscf, ist_pos, scf_size, scf_partition, bs, scfsi);\n\n    if (gr->n_short_sfb)\n    {\n        int sh = 3 - scf_shift;\n        for (i = 0; i < gr->n_short_sfb; i += 3)\n        {\n            iscf[gr->n_long_sfb + i + 0] = (drmp3_uint8)(iscf[gr->n_long_sfb + i + 0] + (gr->subblock_gain[0] << sh));\n            iscf[gr->n_long_sfb + i + 1] = (drmp3_uint8)(iscf[gr->n_long_sfb + i + 1] + (gr->subblock_gain[1] << sh));\n            iscf[gr->n_long_sfb + i + 2] = (drmp3_uint8)(iscf[gr->n_long_sfb + i + 2] + (gr->subblock_gain[2] << sh));\n        }\n    } else if (gr->preflag)\n    {\n        static const drmp3_uint8 g_preamp[10] = { 1,1,1,1,2,2,3,3,3,2 };\n        for (i = 0; i < 10; i++)\n        {\n            iscf[11 + i] = (drmp3_uint8)(iscf[11 + i] + g_preamp[i]);\n        }\n    }\n\n    gain_exp = gr->global_gain + DRMP3_BITS_DEQUANTIZER_OUT*4 - 210 - (DRMP3_HDR_IS_MS_STEREO(hdr) ? 2 : 0);\n    gain = drmp3_L3_ldexp_q2(1 << (DRMP3_MAX_SCFI/4),  DRMP3_MAX_SCFI - gain_exp);\n    for (i = 0; i < (int)(gr->n_long_sfb + gr->n_short_sfb); i++)\n    {\n        scf[i] = drmp3_L3_ldexp_q2(gain, iscf[i] << scf_shift);\n    }\n}\n\nstatic const float g_drmp3_pow43[129 + 16] = {\n    0,-1,-2.519842f,-4.326749f,-6.349604f,-8.549880f,-10.902724f,-13.390518f,-16.000000f,-18.720754f,-21.544347f,-24.463781f,-27.473142f,-30.567351f,-33.741992f,-36.993181f,\n    0,1,2.519842f,4.326749f,6.349604f,8.549880f,10.902724f,13.390518f,16.000000f,18.720754f,21.544347f,24.463781f,27.473142f,30.567351f,33.741992f,36.993181f,40.317474f,43.711787f,47.173345f,50.699631f,54.288352f,57.937408f,61.644865f,65.408941f,69.227979f,73.100443f,77.024898f,81.000000f,85.024491f,89.097188f,93.216975f,97.382800f,101.593667f,105.848633f,110.146801f,114.487321f,118.869381f,123.292209f,127.755065f,132.257246f,136.798076f,141.376907f,145.993119f,150.646117f,155.335327f,160.060199f,164.820202f,169.614826f,174.443577f,179.305980f,184.201575f,189.129918f,194.090580f,199.083145f,204.107210f,209.162385f,214.248292f,219.364564f,224.510845f,229.686789f,234.892058f,240.126328f,245.389280f,250.680604f,256.000000f,261.347174f,266.721841f,272.123723f,277.552547f,283.008049f,288.489971f,293.998060f,299.532071f,305.091761f,310.676898f,316.287249f,321.922592f,327.582707f,333.267377f,338.976394f,344.709550f,350.466646f,356.247482f,362.051866f,367.879608f,373.730522f,379.604427f,385.501143f,391.420496f,397.362314f,403.326427f,409.312672f,415.320884f,421.350905f,427.402579f,433.475750f,439.570269f,445.685987f,451.822757f,457.980436f,464.158883f,470.357960f,476.577530f,482.817459f,489.077615f,495.357868f,501.658090f,507.978156f,514.317941f,520.677324f,527.056184f,533.454404f,539.871867f,546.308458f,552.764065f,559.238575f,565.731879f,572.243870f,578.774440f,585.323483f,591.890898f,598.476581f,605.080431f,611.702349f,618.342238f,625.000000f,631.675540f,638.368763f,645.079578f\n};\n\nstatic float drmp3_L3_pow_43(int x)\n{\n    float frac;\n    int sign, mult = 256;\n\n    if (x < 129)\n    {\n        return g_drmp3_pow43[16 + x];\n    }\n\n    if (x < 1024)\n    {\n        mult = 16;\n        x <<= 3;\n    }\n\n    sign = 2*x & 64;\n    frac = (float)((x & 63) - sign) / ((x & ~63) + sign);\n    return g_drmp3_pow43[16 + ((x + sign) >> 6)]*(1.f + frac*((4.f/3) + frac*(2.f/9)))*mult;\n}\n\nstatic void drmp3_L3_huffman(float *dst, drmp3_bs *bs, const drmp3_L3_gr_info *gr_info, const float *scf, int layer3gr_limit)\n{\n    static const drmp3_int16 tabs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n        785,785,785,785,784,784,784,784,513,513,513,513,513,513,513,513,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,\n        -255,1313,1298,1282,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,290,288,\n        -255,1313,1298,1282,769,769,769,769,529,529,529,529,529,529,529,529,528,528,528,528,528,528,528,528,512,512,512,512,512,512,512,512,290,288,\n        -253,-318,-351,-367,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,819,818,547,547,275,275,275,275,561,560,515,546,289,274,288,258,\n        -254,-287,1329,1299,1314,1312,1057,1057,1042,1042,1026,1026,784,784,784,784,529,529,529,529,529,529,529,529,769,769,769,769,768,768,768,768,563,560,306,306,291,259,\n        -252,-413,-477,-542,1298,-575,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-383,-399,1107,1092,1106,1061,849,849,789,789,1104,1091,773,773,1076,1075,341,340,325,309,834,804,577,577,532,532,516,516,832,818,803,816,561,561,531,531,515,546,289,289,288,258,\n        -252,-429,-493,-559,1057,1057,1042,1042,529,529,529,529,529,529,529,529,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,-382,1077,-415,1106,1061,1104,849,849,789,789,1091,1076,1029,1075,834,834,597,581,340,340,339,324,804,833,532,532,832,772,818,803,817,787,816,771,290,290,290,290,288,258,\n        -253,-349,-414,-447,-463,1329,1299,-479,1314,1312,1057,1057,1042,1042,1026,1026,785,785,785,785,784,784,784,784,769,769,769,769,768,768,768,768,-319,851,821,-335,836,850,805,849,341,340,325,336,533,533,579,579,564,564,773,832,578,548,563,516,321,276,306,291,304,259,\n        -251,-572,-733,-830,-863,-879,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,1396,1351,1381,1366,1395,1335,1380,-559,1334,1138,1138,1063,1063,1350,1392,1031,1031,1062,1062,1364,1363,1120,1120,1333,1348,881,881,881,881,375,374,359,373,343,358,341,325,791,791,1123,1122,-703,1105,1045,-719,865,865,790,790,774,774,1104,1029,338,293,323,308,-799,-815,833,788,772,818,803,816,322,292,307,320,561,531,515,546,289,274,288,258,\n        -251,-525,-605,-685,-765,-831,-846,1298,1057,1057,1312,1282,785,785,785,785,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,1399,1398,1383,1367,1382,1396,1351,-511,1381,1366,1139,1139,1079,1079,1124,1124,1364,1349,1363,1333,882,882,882,882,807,807,807,807,1094,1094,1136,1136,373,341,535,535,881,775,867,822,774,-591,324,338,-671,849,550,550,866,864,609,609,293,336,534,534,789,835,773,-751,834,804,308,307,833,788,832,772,562,562,547,547,305,275,560,515,290,290,\n        -252,-397,-477,-557,-622,-653,-719,-735,-750,1329,1299,1314,1057,1057,1042,1042,1312,1282,1024,1024,785,785,785,785,784,784,784,784,769,769,769,769,-383,1127,1141,1111,1126,1140,1095,1110,869,869,883,883,1079,1109,882,882,375,374,807,868,838,881,791,-463,867,822,368,263,852,837,836,-543,610,610,550,550,352,336,534,534,865,774,851,821,850,805,593,533,579,564,773,832,578,578,548,548,577,577,307,276,306,291,516,560,259,259,\n        -250,-2107,-2507,-2764,-2909,-2974,-3007,-3023,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-767,-1052,-1213,-1277,-1358,-1405,-1469,-1535,-1550,-1582,-1614,-1647,-1662,-1694,-1726,-1759,-1774,-1807,-1822,-1854,-1886,1565,-1919,-1935,-1951,-1967,1731,1730,1580,1717,-1983,1729,1564,-1999,1548,-2015,-2031,1715,1595,-2047,1714,-2063,1610,-2079,1609,-2095,1323,1323,1457,1457,1307,1307,1712,1547,1641,1700,1699,1594,1685,1625,1442,1442,1322,1322,-780,-973,-910,1279,1278,1277,1262,1276,1261,1275,1215,1260,1229,-959,974,974,989,989,-943,735,478,478,495,463,506,414,-1039,1003,958,1017,927,942,987,957,431,476,1272,1167,1228,-1183,1256,-1199,895,895,941,941,1242,1227,1212,1135,1014,1014,490,489,503,487,910,1013,985,925,863,894,970,955,1012,847,-1343,831,755,755,984,909,428,366,754,559,-1391,752,486,457,924,997,698,698,983,893,740,740,908,877,739,739,667,667,953,938,497,287,271,271,683,606,590,712,726,574,302,302,738,736,481,286,526,725,605,711,636,724,696,651,589,681,666,710,364,467,573,695,466,466,301,465,379,379,709,604,665,679,316,316,634,633,436,436,464,269,424,394,452,332,438,363,347,408,393,448,331,422,362,407,392,421,346,406,391,376,375,359,1441,1306,-2367,1290,-2383,1337,-2399,-2415,1426,1321,-2431,1411,1336,-2447,-2463,-2479,1169,1169,1049,1049,1424,1289,1412,1352,1319,-2495,1154,1154,1064,1064,1153,1153,416,390,360,404,403,389,344,374,373,343,358,372,327,357,342,311,356,326,1395,1394,1137,1137,1047,1047,1365,1392,1287,1379,1334,1364,1349,1378,1318,1363,792,792,792,792,1152,1152,1032,1032,1121,1121,1046,1046,1120,1120,1030,1030,-2895,1106,1061,1104,849,849,789,789,1091,1076,1029,1090,1060,1075,833,833,309,324,532,532,832,772,818,803,561,561,531,560,515,546,289,274,288,258,\n        -250,-1179,-1579,-1836,-1996,-2124,-2253,-2333,-2413,-2477,-2542,-2574,-2607,-2622,-2655,1314,1313,1298,1312,1282,785,785,785,785,1040,1040,1025,1025,768,768,768,768,-766,-798,-830,-862,-895,-911,-927,-943,-959,-975,-991,-1007,-1023,-1039,-1055,-1070,1724,1647,-1103,-1119,1631,1767,1662,1738,1708,1723,-1135,1780,1615,1779,1599,1677,1646,1778,1583,-1151,1777,1567,1737,1692,1765,1722,1707,1630,1751,1661,1764,1614,1736,1676,1763,1750,1645,1598,1721,1691,1762,1706,1582,1761,1566,-1167,1749,1629,767,766,751,765,494,494,735,764,719,749,734,763,447,447,748,718,477,506,431,491,446,476,461,505,415,430,475,445,504,399,460,489,414,503,383,474,429,459,502,502,746,752,488,398,501,473,413,472,486,271,480,270,-1439,-1455,1357,-1471,-1487,-1503,1341,1325,-1519,1489,1463,1403,1309,-1535,1372,1448,1418,1476,1356,1462,1387,-1551,1475,1340,1447,1402,1386,-1567,1068,1068,1474,1461,455,380,468,440,395,425,410,454,364,467,466,464,453,269,409,448,268,432,1371,1473,1432,1417,1308,1460,1355,1446,1459,1431,1083,1083,1401,1416,1458,1445,1067,1067,1370,1457,1051,1051,1291,1430,1385,1444,1354,1415,1400,1443,1082,1082,1173,1113,1186,1066,1185,1050,-1967,1158,1128,1172,1097,1171,1081,-1983,1157,1112,416,266,375,400,1170,1142,1127,1065,793,793,1169,1033,1156,1096,1141,1111,1155,1080,1126,1140,898,898,808,808,897,897,792,792,1095,1152,1032,1125,1110,1139,1079,1124,882,807,838,881,853,791,-2319,867,368,263,822,852,837,866,806,865,-2399,851,352,262,534,534,821,836,594,594,549,549,593,593,533,533,848,773,579,579,564,578,548,563,276,276,577,576,306,291,516,560,305,305,275,259,\n        -251,-892,-2058,-2620,-2828,-2957,-3023,-3039,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,-559,1530,-575,-591,1528,1527,1407,1526,1391,1023,1023,1023,1023,1525,1375,1268,1268,1103,1103,1087,1087,1039,1039,1523,-604,815,815,815,815,510,495,509,479,508,463,507,447,431,505,415,399,-734,-782,1262,-815,1259,1244,-831,1258,1228,-847,-863,1196,-879,1253,987,987,748,-767,493,493,462,477,414,414,686,669,478,446,461,445,474,429,487,458,412,471,1266,1264,1009,1009,799,799,-1019,-1276,-1452,-1581,-1677,-1757,-1821,-1886,-1933,-1997,1257,1257,1483,1468,1512,1422,1497,1406,1467,1496,1421,1510,1134,1134,1225,1225,1466,1451,1374,1405,1252,1252,1358,1480,1164,1164,1251,1251,1238,1238,1389,1465,-1407,1054,1101,-1423,1207,-1439,830,830,1248,1038,1237,1117,1223,1148,1236,1208,411,426,395,410,379,269,1193,1222,1132,1235,1221,1116,976,976,1192,1162,1177,1220,1131,1191,963,963,-1647,961,780,-1663,558,558,994,993,437,408,393,407,829,978,813,797,947,-1743,721,721,377,392,844,950,828,890,706,706,812,859,796,960,948,843,934,874,571,571,-1919,690,555,689,421,346,539,539,944,779,918,873,932,842,903,888,570,570,931,917,674,674,-2575,1562,-2591,1609,-2607,1654,1322,1322,1441,1441,1696,1546,1683,1593,1669,1624,1426,1426,1321,1321,1639,1680,1425,1425,1305,1305,1545,1668,1608,1623,1667,1592,1638,1666,1320,1320,1652,1607,1409,1409,1304,1304,1288,1288,1664,1637,1395,1395,1335,1335,1622,1636,1394,1394,1319,1319,1606,1621,1392,1392,1137,1137,1137,1137,345,390,360,375,404,373,1047,-2751,-2767,-2783,1062,1121,1046,-2799,1077,-2815,1106,1061,789,789,1105,1104,263,355,310,340,325,354,352,262,339,324,1091,1076,1029,1090,1060,1075,833,833,788,788,1088,1028,818,818,803,803,561,561,531,531,816,771,546,546,289,274,288,258,\n        -253,-317,-381,-446,-478,-509,1279,1279,-811,-1179,-1451,-1756,-1900,-2028,-2189,-2253,-2333,-2414,-2445,-2511,-2526,1313,1298,-2559,1041,1041,1040,1040,1025,1025,1024,1024,1022,1007,1021,991,1020,975,1019,959,687,687,1018,1017,671,671,655,655,1016,1015,639,639,758,758,623,623,757,607,756,591,755,575,754,559,543,543,1009,783,-575,-621,-685,-749,496,-590,750,749,734,748,974,989,1003,958,988,973,1002,942,987,957,972,1001,926,986,941,971,956,1000,910,985,925,999,894,970,-1071,-1087,-1102,1390,-1135,1436,1509,1451,1374,-1151,1405,1358,1480,1420,-1167,1507,1494,1389,1342,1465,1435,1450,1326,1505,1310,1493,1373,1479,1404,1492,1464,1419,428,443,472,397,736,526,464,464,486,457,442,471,484,482,1357,1449,1434,1478,1388,1491,1341,1490,1325,1489,1463,1403,1309,1477,1372,1448,1418,1433,1476,1356,1462,1387,-1439,1475,1340,1447,1402,1474,1324,1461,1371,1473,269,448,1432,1417,1308,1460,-1711,1459,-1727,1441,1099,1099,1446,1386,1431,1401,-1743,1289,1083,1083,1160,1160,1458,1445,1067,1067,1370,1457,1307,1430,1129,1129,1098,1098,268,432,267,416,266,400,-1887,1144,1187,1082,1173,1113,1186,1066,1050,1158,1128,1143,1172,1097,1171,1081,420,391,1157,1112,1170,1142,1127,1065,1169,1049,1156,1096,1141,1111,1155,1080,1126,1154,1064,1153,1140,1095,1048,-2159,1125,1110,1137,-2175,823,823,1139,1138,807,807,384,264,368,263,868,838,853,791,867,822,852,837,866,806,865,790,-2319,851,821,836,352,262,850,805,849,-2399,533,533,835,820,336,261,578,548,563,577,532,532,832,772,562,562,547,547,305,275,560,515,290,290,288,258 };\n    static const drmp3_uint8 tab32[] = { 130,162,193,209,44,28,76,140,9,9,9,9,9,9,9,9,190,254,222,238,126,94,157,157,109,61,173,205};\n    static const drmp3_uint8 tab33[] = { 252,236,220,204,188,172,156,140,124,108,92,76,60,44,28,12 };\n    static const drmp3_int16 tabindex[2*16] = { 0,32,64,98,0,132,180,218,292,364,426,538,648,746,0,1126,1460,1460,1460,1460,1460,1460,1460,1460,1842,1842,1842,1842,1842,1842,1842,1842 };\n    static const drmp3_uint8 g_linbits[] =  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,6,8,10,13,4,5,6,7,8,9,11,13 };\n\n#define DRMP3_PEEK_BITS(n)    (bs_cache >> (32 - (n)))\n#define DRMP3_FLUSH_BITS(n)   { bs_cache <<= (n); bs_sh += (n); }\n#define DRMP3_CHECK_BITS      while (bs_sh >= 0) { bs_cache |= (drmp3_uint32)*bs_next_ptr++ << bs_sh; bs_sh -= 8; }\n#define DRMP3_BSPOS           ((bs_next_ptr - bs->buf)*8 - 24 + bs_sh)\n\n    float one = 0.0f;\n    int ireg = 0, big_val_cnt = gr_info->big_values;\n    const drmp3_uint8 *sfb = gr_info->sfbtab;\n    const drmp3_uint8 *bs_next_ptr = bs->buf + bs->pos/8;\n    drmp3_uint32 bs_cache = (((bs_next_ptr[0]*256u + bs_next_ptr[1])*256u + bs_next_ptr[2])*256u + bs_next_ptr[3]) << (bs->pos & 7);\n    int pairs_to_decode, np, bs_sh = (bs->pos & 7) - 8;\n    bs_next_ptr += 4;\n\n    while (big_val_cnt > 0)\n    {\n        int tab_num = gr_info->table_select[ireg];\n        int sfb_cnt = gr_info->region_count[ireg++];\n        const drmp3_int16 *codebook = tabs + tabindex[tab_num];\n        int linbits = g_linbits[tab_num];\n        if (linbits)\n        {\n            do\n            {\n                np = *sfb++ / 2;\n                pairs_to_decode = DRMP3_MIN(big_val_cnt, np);\n                one = *scf++;\n                do\n                {\n                    int j, w = 5;\n                    int leaf = codebook[DRMP3_PEEK_BITS(w)];\n                    while (leaf < 0)\n                    {\n                        DRMP3_FLUSH_BITS(w);\n                        w = leaf & 7;\n                        leaf = codebook[DRMP3_PEEK_BITS(w) - (leaf >> 3)];\n                    }\n                    DRMP3_FLUSH_BITS(leaf >> 8);\n\n                    for (j = 0; j < 2; j++, dst++, leaf >>= 4)\n                    {\n                        int lsb = leaf & 0x0F;\n                        if (lsb == 15)\n                        {\n                            lsb += DRMP3_PEEK_BITS(linbits);\n                            DRMP3_FLUSH_BITS(linbits);\n                            DRMP3_CHECK_BITS;\n                            *dst = one*drmp3_L3_pow_43(lsb)*((drmp3_int32)bs_cache < 0 ? -1: 1);\n                        } else\n                        {\n                            *dst = g_drmp3_pow43[16 + lsb - 16*(bs_cache >> 31)]*one;\n                        }\n                        DRMP3_FLUSH_BITS(lsb ? 1 : 0);\n                    }\n                    DRMP3_CHECK_BITS;\n                } while (--pairs_to_decode);\n            } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);\n        } else\n        {\n            do\n            {\n                np = *sfb++ / 2;\n                pairs_to_decode = DRMP3_MIN(big_val_cnt, np);\n                one = *scf++;\n                do\n                {\n                    int j, w = 5;\n                    int leaf = codebook[DRMP3_PEEK_BITS(w)];\n                    while (leaf < 0)\n                    {\n                        DRMP3_FLUSH_BITS(w);\n                        w = leaf & 7;\n                        leaf = codebook[DRMP3_PEEK_BITS(w) - (leaf >> 3)];\n                    }\n                    DRMP3_FLUSH_BITS(leaf >> 8);\n\n                    for (j = 0; j < 2; j++, dst++, leaf >>= 4)\n                    {\n                        int lsb = leaf & 0x0F;\n                        *dst = g_drmp3_pow43[16 + lsb - 16*(bs_cache >> 31)]*one;\n                        DRMP3_FLUSH_BITS(lsb ? 1 : 0);\n                    }\n                    DRMP3_CHECK_BITS;\n                } while (--pairs_to_decode);\n            } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);\n        }\n    }\n\n    for (np = 1 - big_val_cnt;; dst += 4)\n    {\n        const drmp3_uint8 *codebook_count1 = (gr_info->count1_table) ? tab33 : tab32;\n        int leaf = codebook_count1[DRMP3_PEEK_BITS(4)];\n        if (!(leaf & 8))\n        {\n            leaf = codebook_count1[(leaf >> 3) + (bs_cache << 4 >> (32 - (leaf & 3)))];\n        }\n        DRMP3_FLUSH_BITS(leaf & 7);\n        if (DRMP3_BSPOS > layer3gr_limit)\n        {\n            break;\n        }\n#define DRMP3_RELOAD_SCALEFACTOR  if (!--np) { np = *sfb++/2; if (!np) break; one = *scf++; }\n#define DRMP3_DEQ_COUNT1(s) if (leaf & (128 >> s)) { dst[s] = ((drmp3_int32)bs_cache < 0) ? -one : one; DRMP3_FLUSH_BITS(1) }\n        DRMP3_RELOAD_SCALEFACTOR;\n        DRMP3_DEQ_COUNT1(0);\n        DRMP3_DEQ_COUNT1(1);\n        DRMP3_RELOAD_SCALEFACTOR;\n        DRMP3_DEQ_COUNT1(2);\n        DRMP3_DEQ_COUNT1(3);\n        DRMP3_CHECK_BITS;\n    }\n\n    bs->pos = layer3gr_limit;\n}\n\nstatic void drmp3_L3_midside_stereo(float *left, int n)\n{\n    int i = 0;\n    float *right = left + 576;\n#if DRMP3_HAVE_SIMD\n    if (drmp3_have_simd())\n    {\n        for (; i < n - 3; i += 4)\n        {\n            drmp3_f4 vl = DRMP3_VLD(left + i);\n            drmp3_f4 vr = DRMP3_VLD(right + i);\n            DRMP3_VSTORE(left + i, DRMP3_VADD(vl, vr));\n            DRMP3_VSTORE(right + i, DRMP3_VSUB(vl, vr));\n        }\n#ifdef __GNUC__\n        /* Workaround for spurious -Waggressive-loop-optimizations warning from gcc.\n         * For more info see: https://github.com/lieff/minimp3/issues/88\n         */\n        if (__builtin_constant_p(n % 4 == 0) && n % 4 == 0)\n            return;\n#endif\n    }\n#endif\n    for (; i < n; i++)\n    {\n        float a = left[i];\n        float b = right[i];\n        left[i] = a + b;\n        right[i] = a - b;\n    }\n}\n\nstatic void drmp3_L3_intensity_stereo_band(float *left, int n, float kl, float kr)\n{\n    int i;\n    for (i = 0; i < n; i++)\n    {\n        left[i + 576] = left[i]*kr;\n        left[i] = left[i]*kl;\n    }\n}\n\nstatic void drmp3_L3_stereo_top_band(const float *right, const drmp3_uint8 *sfb, int nbands, int max_band[3])\n{\n    int i, k;\n\n    max_band[0] = max_band[1] = max_band[2] = -1;\n\n    for (i = 0; i < nbands; i++)\n    {\n        for (k = 0; k < sfb[i]; k += 2)\n        {\n            if (right[k] != 0 || right[k + 1] != 0)\n            {\n                max_band[i % 3] = i;\n                break;\n            }\n        }\n        right += sfb[i];\n    }\n}\n\nstatic void drmp3_L3_stereo_process(float *left, const drmp3_uint8 *ist_pos, const drmp3_uint8 *sfb, const drmp3_uint8 *hdr, int max_band[3], int mpeg2_sh)\n{\n    static const float g_pan[7*2] = { 0,1,0.21132487f,0.78867513f,0.36602540f,0.63397460f,0.5f,0.5f,0.63397460f,0.36602540f,0.78867513f,0.21132487f,1,0 };\n    unsigned i, max_pos = DRMP3_HDR_TEST_MPEG1(hdr) ? 7 : 64;\n\n    for (i = 0; sfb[i]; i++)\n    {\n        unsigned ipos = ist_pos[i];\n        if ((int)i > max_band[i % 3] && ipos < max_pos)\n        {\n            float kl, kr, s = DRMP3_HDR_TEST_MS_STEREO(hdr) ? 1.41421356f : 1;\n            if (DRMP3_HDR_TEST_MPEG1(hdr))\n            {\n                kl = g_pan[2*ipos];\n                kr = g_pan[2*ipos + 1];\n            } else\n            {\n                kl = 1;\n                kr = drmp3_L3_ldexp_q2(1, (ipos + 1) >> 1 << mpeg2_sh);\n                if (ipos & 1)\n                {\n                    kl = kr;\n                    kr = 1;\n                }\n            }\n            drmp3_L3_intensity_stereo_band(left, sfb[i], kl*s, kr*s);\n        } else if (DRMP3_HDR_TEST_MS_STEREO(hdr))\n        {\n            drmp3_L3_midside_stereo(left, sfb[i]);\n        }\n        left += sfb[i];\n    }\n}\n\nstatic void drmp3_L3_intensity_stereo(float *left, drmp3_uint8 *ist_pos, const drmp3_L3_gr_info *gr, const drmp3_uint8 *hdr)\n{\n    int max_band[3], n_sfb = gr->n_long_sfb + gr->n_short_sfb;\n    int i, max_blocks = gr->n_short_sfb ? 3 : 1;\n\n    drmp3_L3_stereo_top_band(left + 576, gr->sfbtab, n_sfb, max_band);\n    if (gr->n_long_sfb)\n    {\n        max_band[0] = max_band[1] = max_band[2] = DRMP3_MAX(DRMP3_MAX(max_band[0], max_band[1]), max_band[2]);\n    }\n    for (i = 0; i < max_blocks; i++)\n    {\n        int default_pos = DRMP3_HDR_TEST_MPEG1(hdr) ? 3 : 0;\n        int itop = n_sfb - max_blocks + i;\n        int prev = itop - max_blocks;\n        ist_pos[itop] = (drmp3_uint8)(max_band[i] >= prev ? default_pos : ist_pos[prev]);\n    }\n    drmp3_L3_stereo_process(left, ist_pos, gr->sfbtab, hdr, max_band, gr[1].scalefac_compress & 1);\n}\n\nstatic void drmp3_L3_reorder(float *grbuf, float *scratch, const drmp3_uint8 *sfb)\n{\n    int i, len;\n    float *src = grbuf, *dst = scratch;\n\n    for (;0 != (len = *sfb); sfb += 3, src += 2*len)\n    {\n        for (i = 0; i < len; i++, src++)\n        {\n            *dst++ = src[0*len];\n            *dst++ = src[1*len];\n            *dst++ = src[2*len];\n        }\n    }\n    DRMP3_COPY_MEMORY(grbuf, scratch, (dst - scratch)*sizeof(float));\n}\n\nstatic void drmp3_L3_antialias(float *grbuf, int nbands)\n{\n    static const float g_aa[2][8] = {\n        {0.85749293f,0.88174200f,0.94962865f,0.98331459f,0.99551782f,0.99916056f,0.99989920f,0.99999316f},\n        {0.51449576f,0.47173197f,0.31337745f,0.18191320f,0.09457419f,0.04096558f,0.01419856f,0.00369997f}\n    };\n\n    for (; nbands > 0; nbands--, grbuf += 18)\n    {\n        int i = 0;\n#if DRMP3_HAVE_SIMD\n        if (drmp3_have_simd()) for (; i < 8; i += 4)\n        {\n            drmp3_f4 vu = DRMP3_VLD(grbuf + 18 + i);\n            drmp3_f4 vd = DRMP3_VLD(grbuf + 14 - i);\n            drmp3_f4 vc0 = DRMP3_VLD(g_aa[0] + i);\n            drmp3_f4 vc1 = DRMP3_VLD(g_aa[1] + i);\n            vd = DRMP3_VREV(vd);\n            DRMP3_VSTORE(grbuf + 18 + i, DRMP3_VSUB(DRMP3_VMUL(vu, vc0), DRMP3_VMUL(vd, vc1)));\n            vd = DRMP3_VADD(DRMP3_VMUL(vu, vc1), DRMP3_VMUL(vd, vc0));\n            DRMP3_VSTORE(grbuf + 14 - i, DRMP3_VREV(vd));\n        }\n#endif\n#ifndef DR_MP3_ONLY_SIMD\n        for(; i < 8; i++)\n        {\n            float u = grbuf[18 + i];\n            float d = grbuf[17 - i];\n            grbuf[18 + i] = u*g_aa[0][i] - d*g_aa[1][i];\n            grbuf[17 - i] = u*g_aa[1][i] + d*g_aa[0][i];\n        }\n#endif\n    }\n}\n\nstatic void drmp3_L3_dct3_9(float *y)\n{\n    float s0, s1, s2, s3, s4, s5, s6, s7, s8, t0, t2, t4;\n\n    s0 = y[0]; s2 = y[2]; s4 = y[4]; s6 = y[6]; s8 = y[8];\n    t0 = s0 + s6*0.5f;\n    s0 -= s6;\n    t4 = (s4 + s2)*0.93969262f;\n    t2 = (s8 + s2)*0.76604444f;\n    s6 = (s4 - s8)*0.17364818f;\n    s4 += s8 - s2;\n\n    s2 = s0 - s4*0.5f;\n    y[4] = s4 + s0;\n    s8 = t0 - t2 + s6;\n    s0 = t0 - t4 + t2;\n    s4 = t0 + t4 - s6;\n\n    s1 = y[1]; s3 = y[3]; s5 = y[5]; s7 = y[7];\n\n    s3 *= 0.86602540f;\n    t0 = (s5 + s1)*0.98480775f;\n    t4 = (s5 - s7)*0.34202014f;\n    t2 = (s1 + s7)*0.64278761f;\n    s1 = (s1 - s5 - s7)*0.86602540f;\n\n    s5 = t0 - s3 - t2;\n    s7 = t4 - s3 - t0;\n    s3 = t4 + s3 - t2;\n\n    y[0] = s4 - s7;\n    y[1] = s2 + s1;\n    y[2] = s0 - s3;\n    y[3] = s8 + s5;\n    y[5] = s8 - s5;\n    y[6] = s0 + s3;\n    y[7] = s2 - s1;\n    y[8] = s4 + s7;\n}\n\nstatic void drmp3_L3_imdct36(float *grbuf, float *overlap, const float *window, int nbands)\n{\n    int i, j;\n    static const float g_twid9[18] = {\n        0.73727734f,0.79335334f,0.84339145f,0.88701083f,0.92387953f,0.95371695f,0.97629601f,0.99144486f,0.99904822f,0.67559021f,0.60876143f,0.53729961f,0.46174861f,0.38268343f,0.30070580f,0.21643961f,0.13052619f,0.04361938f\n    };\n\n    for (j = 0; j < nbands; j++, grbuf += 18, overlap += 9)\n    {\n        float co[9], si[9];\n        co[0] = -grbuf[0];\n        si[0] = grbuf[17];\n        for (i = 0; i < 4; i++)\n        {\n            si[8 - 2*i] =   grbuf[4*i + 1] - grbuf[4*i + 2];\n            co[1 + 2*i] =   grbuf[4*i + 1] + grbuf[4*i + 2];\n            si[7 - 2*i] =   grbuf[4*i + 4] - grbuf[4*i + 3];\n            co[2 + 2*i] = -(grbuf[4*i + 3] + grbuf[4*i + 4]);\n        }\n        drmp3_L3_dct3_9(co);\n        drmp3_L3_dct3_9(si);\n\n        si[1] = -si[1];\n        si[3] = -si[3];\n        si[5] = -si[5];\n        si[7] = -si[7];\n\n        i = 0;\n\n#if DRMP3_HAVE_SIMD\n        if (drmp3_have_simd()) for (; i < 8; i += 4)\n        {\n            drmp3_f4 vovl = DRMP3_VLD(overlap + i);\n            drmp3_f4 vc = DRMP3_VLD(co + i);\n            drmp3_f4 vs = DRMP3_VLD(si + i);\n            drmp3_f4 vr0 = DRMP3_VLD(g_twid9 + i);\n            drmp3_f4 vr1 = DRMP3_VLD(g_twid9 + 9 + i);\n            drmp3_f4 vw0 = DRMP3_VLD(window + i);\n            drmp3_f4 vw1 = DRMP3_VLD(window + 9 + i);\n            drmp3_f4 vsum = DRMP3_VADD(DRMP3_VMUL(vc, vr1), DRMP3_VMUL(vs, vr0));\n            DRMP3_VSTORE(overlap + i, DRMP3_VSUB(DRMP3_VMUL(vc, vr0), DRMP3_VMUL(vs, vr1)));\n            DRMP3_VSTORE(grbuf + i, DRMP3_VSUB(DRMP3_VMUL(vovl, vw0), DRMP3_VMUL(vsum, vw1)));\n            vsum = DRMP3_VADD(DRMP3_VMUL(vovl, vw1), DRMP3_VMUL(vsum, vw0));\n            DRMP3_VSTORE(grbuf + 14 - i, DRMP3_VREV(vsum));\n        }\n#endif\n        for (; i < 9; i++)\n        {\n            float ovl  = overlap[i];\n            float sum  = co[i]*g_twid9[9 + i] + si[i]*g_twid9[0 + i];\n            overlap[i] = co[i]*g_twid9[0 + i] - si[i]*g_twid9[9 + i];\n            grbuf[i]      = ovl*window[0 + i] - sum*window[9 + i];\n            grbuf[17 - i] = ovl*window[9 + i] + sum*window[0 + i];\n        }\n    }\n}\n\nstatic void drmp3_L3_idct3(float x0, float x1, float x2, float *dst)\n{\n    float m1 = x1*0.86602540f;\n    float a1 = x0 - x2*0.5f;\n    dst[1] = x0 + x2;\n    dst[0] = a1 + m1;\n    dst[2] = a1 - m1;\n}\n\nstatic void drmp3_L3_imdct12(float *x, float *dst, float *overlap)\n{\n    static const float g_twid3[6] = { 0.79335334f,0.92387953f,0.99144486f, 0.60876143f,0.38268343f,0.13052619f };\n    float co[3], si[3];\n    int i;\n\n    drmp3_L3_idct3(-x[0], x[6] + x[3], x[12] + x[9], co);\n    drmp3_L3_idct3(x[15], x[12] - x[9], x[6] - x[3], si);\n    si[1] = -si[1];\n\n    for (i = 0; i < 3; i++)\n    {\n        float ovl  = overlap[i];\n        float sum  = co[i]*g_twid3[3 + i] + si[i]*g_twid3[0 + i];\n        overlap[i] = co[i]*g_twid3[0 + i] - si[i]*g_twid3[3 + i];\n        dst[i]     = ovl*g_twid3[2 - i] - sum*g_twid3[5 - i];\n        dst[5 - i] = ovl*g_twid3[5 - i] + sum*g_twid3[2 - i];\n    }\n}\n\nstatic void drmp3_L3_imdct_short(float *grbuf, float *overlap, int nbands)\n{\n    for (;nbands > 0; nbands--, overlap += 9, grbuf += 18)\n    {\n        float tmp[18];\n        DRMP3_COPY_MEMORY(tmp, grbuf, sizeof(tmp));\n        DRMP3_COPY_MEMORY(grbuf, overlap, 6*sizeof(float));\n        drmp3_L3_imdct12(tmp, grbuf + 6, overlap + 6);\n        drmp3_L3_imdct12(tmp + 1, grbuf + 12, overlap + 6);\n        drmp3_L3_imdct12(tmp + 2, overlap, overlap + 6);\n    }\n}\n\nstatic void drmp3_L3_change_sign(float *grbuf)\n{\n    int b, i;\n    for (b = 0, grbuf += 18; b < 32; b += 2, grbuf += 36)\n        for (i = 1; i < 18; i += 2)\n            grbuf[i] = -grbuf[i];\n}\n\nstatic void drmp3_L3_imdct_gr(float *grbuf, float *overlap, unsigned block_type, unsigned n_long_bands)\n{\n    static const float g_mdct_window[2][18] = {\n        { 0.99904822f,0.99144486f,0.97629601f,0.95371695f,0.92387953f,0.88701083f,0.84339145f,0.79335334f,0.73727734f,0.04361938f,0.13052619f,0.21643961f,0.30070580f,0.38268343f,0.46174861f,0.53729961f,0.60876143f,0.67559021f },\n        { 1,1,1,1,1,1,0.99144486f,0.92387953f,0.79335334f,0,0,0,0,0,0,0.13052619f,0.38268343f,0.60876143f }\n    };\n    if (n_long_bands)\n    {\n        drmp3_L3_imdct36(grbuf, overlap, g_mdct_window[0], n_long_bands);\n        grbuf += 18*n_long_bands;\n        overlap += 9*n_long_bands;\n    }\n    if (block_type == DRMP3_SHORT_BLOCK_TYPE)\n        drmp3_L3_imdct_short(grbuf, overlap, 32 - n_long_bands);\n    else\n        drmp3_L3_imdct36(grbuf, overlap, g_mdct_window[block_type == DRMP3_STOP_BLOCK_TYPE], 32 - n_long_bands);\n}\n\nstatic void drmp3_L3_save_reservoir(drmp3dec *h, drmp3dec_scratch *s)\n{\n    int pos = (s->bs.pos + 7)/8u;\n    int remains = s->bs.limit/8u - pos;\n    if (remains > DRMP3_MAX_BITRESERVOIR_BYTES)\n    {\n        pos += remains - DRMP3_MAX_BITRESERVOIR_BYTES;\n        remains = DRMP3_MAX_BITRESERVOIR_BYTES;\n    }\n    if (remains > 0)\n    {\n        DRMP3_MOVE_MEMORY(h->reserv_buf, s->maindata + pos, remains);\n    }\n    h->reserv = remains;\n}\n\nstatic int drmp3_L3_restore_reservoir(drmp3dec *h, drmp3_bs *bs, drmp3dec_scratch *s, int main_data_begin)\n{\n    int frame_bytes = (bs->limit - bs->pos)/8;\n    int bytes_have = DRMP3_MIN(h->reserv, main_data_begin);\n    DRMP3_COPY_MEMORY(s->maindata, h->reserv_buf + DRMP3_MAX(0, h->reserv - main_data_begin), DRMP3_MIN(h->reserv, main_data_begin));\n    DRMP3_COPY_MEMORY(s->maindata + bytes_have, bs->buf + bs->pos/8, frame_bytes);\n    drmp3_bs_init(&s->bs, s->maindata, bytes_have + frame_bytes);\n    return h->reserv >= main_data_begin;\n}\n\nstatic void drmp3_L3_decode(drmp3dec *h, drmp3dec_scratch *s, drmp3_L3_gr_info *gr_info, int nch)\n{\n    int ch;\n\n    for (ch = 0; ch < nch; ch++)\n    {\n        int layer3gr_limit = s->bs.pos + gr_info[ch].part_23_length;\n        drmp3_L3_decode_scalefactors(h->header, s->ist_pos[ch], &s->bs, gr_info + ch, s->scf, ch);\n        drmp3_L3_huffman(s->grbuf[ch], &s->bs, gr_info + ch, s->scf, layer3gr_limit);\n    }\n\n    if (DRMP3_HDR_TEST_I_STEREO(h->header))\n    {\n        drmp3_L3_intensity_stereo(s->grbuf[0], s->ist_pos[1], gr_info, h->header);\n    } else if (DRMP3_HDR_IS_MS_STEREO(h->header))\n    {\n        drmp3_L3_midside_stereo(s->grbuf[0], 576);\n    }\n\n    for (ch = 0; ch < nch; ch++, gr_info++)\n    {\n        int aa_bands = 31;\n        int n_long_bands = (gr_info->mixed_block_flag ? 2 : 0) << (int)(DRMP3_HDR_GET_MY_SAMPLE_RATE(h->header) == 2);\n\n        if (gr_info->n_short_sfb)\n        {\n            aa_bands = n_long_bands - 1;\n            drmp3_L3_reorder(s->grbuf[ch] + n_long_bands*18, s->syn[0], gr_info->sfbtab + gr_info->n_long_sfb);\n        }\n\n        drmp3_L3_antialias(s->grbuf[ch], aa_bands);\n        drmp3_L3_imdct_gr(s->grbuf[ch], h->mdct_overlap[ch], gr_info->block_type, n_long_bands);\n        drmp3_L3_change_sign(s->grbuf[ch]);\n    }\n}\n\nstatic void drmp3d_DCT_II(float *grbuf, int n)\n{\n    static const float g_sec[24] = {\n        10.19000816f,0.50060302f,0.50241929f,3.40760851f,0.50547093f,0.52249861f,2.05778098f,0.51544732f,0.56694406f,1.48416460f,0.53104258f,0.64682180f,1.16943991f,0.55310392f,0.78815460f,0.97256821f,0.58293498f,1.06067765f,0.83934963f,0.62250412f,1.72244716f,0.74453628f,0.67480832f,5.10114861f\n    };\n    int i, k = 0;\n#if DRMP3_HAVE_SIMD\n    if (drmp3_have_simd()) for (; k < n; k += 4)\n    {\n        drmp3_f4 t[4][8], *x;\n        float *y = grbuf + k;\n\n        for (x = t[0], i = 0; i < 8; i++, x++)\n        {\n            drmp3_f4 x0 = DRMP3_VLD(&y[i*18]);\n            drmp3_f4 x1 = DRMP3_VLD(&y[(15 - i)*18]);\n            drmp3_f4 x2 = DRMP3_VLD(&y[(16 + i)*18]);\n            drmp3_f4 x3 = DRMP3_VLD(&y[(31 - i)*18]);\n            drmp3_f4 t0 = DRMP3_VADD(x0, x3);\n            drmp3_f4 t1 = DRMP3_VADD(x1, x2);\n            drmp3_f4 t2 = DRMP3_VMUL_S(DRMP3_VSUB(x1, x2), g_sec[3*i + 0]);\n            drmp3_f4 t3 = DRMP3_VMUL_S(DRMP3_VSUB(x0, x3), g_sec[3*i + 1]);\n            x[0] = DRMP3_VADD(t0, t1);\n            x[8] = DRMP3_VMUL_S(DRMP3_VSUB(t0, t1), g_sec[3*i + 2]);\n            x[16] = DRMP3_VADD(t3, t2);\n            x[24] = DRMP3_VMUL_S(DRMP3_VSUB(t3, t2), g_sec[3*i + 2]);\n        }\n        for (x = t[0], i = 0; i < 4; i++, x += 8)\n        {\n            drmp3_f4 x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3], x4 = x[4], x5 = x[5], x6 = x[6], x7 = x[7], xt;\n            xt = DRMP3_VSUB(x0, x7); x0 = DRMP3_VADD(x0, x7);\n            x7 = DRMP3_VSUB(x1, x6); x1 = DRMP3_VADD(x1, x6);\n            x6 = DRMP3_VSUB(x2, x5); x2 = DRMP3_VADD(x2, x5);\n            x5 = DRMP3_VSUB(x3, x4); x3 = DRMP3_VADD(x3, x4);\n            x4 = DRMP3_VSUB(x0, x3); x0 = DRMP3_VADD(x0, x3);\n            x3 = DRMP3_VSUB(x1, x2); x1 = DRMP3_VADD(x1, x2);\n            x[0] = DRMP3_VADD(x0, x1);\n            x[4] = DRMP3_VMUL_S(DRMP3_VSUB(x0, x1), 0.70710677f);\n            x5 = DRMP3_VADD(x5, x6);\n            x6 = DRMP3_VMUL_S(DRMP3_VADD(x6, x7), 0.70710677f);\n            x7 = DRMP3_VADD(x7, xt);\n            x3 = DRMP3_VMUL_S(DRMP3_VADD(x3, x4), 0.70710677f);\n            x5 = DRMP3_VSUB(x5, DRMP3_VMUL_S(x7, 0.198912367f)); /* rotate by PI/8 */\n            x7 = DRMP3_VADD(x7, DRMP3_VMUL_S(x5, 0.382683432f));\n            x5 = DRMP3_VSUB(x5, DRMP3_VMUL_S(x7, 0.198912367f));\n            x0 = DRMP3_VSUB(xt, x6); xt = DRMP3_VADD(xt, x6);\n            x[1] = DRMP3_VMUL_S(DRMP3_VADD(xt, x7), 0.50979561f);\n            x[2] = DRMP3_VMUL_S(DRMP3_VADD(x4, x3), 0.54119611f);\n            x[3] = DRMP3_VMUL_S(DRMP3_VSUB(x0, x5), 0.60134488f);\n            x[5] = DRMP3_VMUL_S(DRMP3_VADD(x0, x5), 0.89997619f);\n            x[6] = DRMP3_VMUL_S(DRMP3_VSUB(x4, x3), 1.30656302f);\n            x[7] = DRMP3_VMUL_S(DRMP3_VSUB(xt, x7), 2.56291556f);\n        }\n\n        if (k > n - 3)\n        {\n#if DRMP3_HAVE_SSE\n#define DRMP3_VSAVE2(i, v) _mm_storel_pi((__m64 *)(void*)&y[i*18], v)\n#else\n#define DRMP3_VSAVE2(i, v) vst1_f32((float32_t *)&y[(i)*18],  vget_low_f32(v))\n#endif\n            for (i = 0; i < 7; i++, y += 4*18)\n            {\n                drmp3_f4 s = DRMP3_VADD(t[3][i], t[3][i + 1]);\n                DRMP3_VSAVE2(0, t[0][i]);\n                DRMP3_VSAVE2(1, DRMP3_VADD(t[2][i], s));\n                DRMP3_VSAVE2(2, DRMP3_VADD(t[1][i], t[1][i + 1]));\n                DRMP3_VSAVE2(3, DRMP3_VADD(t[2][1 + i], s));\n            }\n            DRMP3_VSAVE2(0, t[0][7]);\n            DRMP3_VSAVE2(1, DRMP3_VADD(t[2][7], t[3][7]));\n            DRMP3_VSAVE2(2, t[1][7]);\n            DRMP3_VSAVE2(3, t[3][7]);\n        } else\n        {\n#define DRMP3_VSAVE4(i, v) DRMP3_VSTORE(&y[(i)*18], v)\n            for (i = 0; i < 7; i++, y += 4*18)\n            {\n                drmp3_f4 s = DRMP3_VADD(t[3][i], t[3][i + 1]);\n                DRMP3_VSAVE4(0, t[0][i]);\n                DRMP3_VSAVE4(1, DRMP3_VADD(t[2][i], s));\n                DRMP3_VSAVE4(2, DRMP3_VADD(t[1][i], t[1][i + 1]));\n                DRMP3_VSAVE4(3, DRMP3_VADD(t[2][1 + i], s));\n            }\n            DRMP3_VSAVE4(0, t[0][7]);\n            DRMP3_VSAVE4(1, DRMP3_VADD(t[2][7], t[3][7]));\n            DRMP3_VSAVE4(2, t[1][7]);\n            DRMP3_VSAVE4(3, t[3][7]);\n        }\n    } else\n#endif\n#ifdef DR_MP3_ONLY_SIMD\n    {} /* for HAVE_SIMD=1, MINIMP3_ONLY_SIMD=1 case we do not need non-intrinsic \"else\" branch */\n#else\n    for (; k < n; k++)\n    {\n        float t[4][8], *x, *y = grbuf + k;\n\n        for (x = t[0], i = 0; i < 8; i++, x++)\n        {\n            float x0 = y[i*18];\n            float x1 = y[(15 - i)*18];\n            float x2 = y[(16 + i)*18];\n            float x3 = y[(31 - i)*18];\n            float t0 = x0 + x3;\n            float t1 = x1 + x2;\n            float t2 = (x1 - x2)*g_sec[3*i + 0];\n            float t3 = (x0 - x3)*g_sec[3*i + 1];\n            x[0] = t0 + t1;\n            x[8] = (t0 - t1)*g_sec[3*i + 2];\n            x[16] = t3 + t2;\n            x[24] = (t3 - t2)*g_sec[3*i + 2];\n        }\n        for (x = t[0], i = 0; i < 4; i++, x += 8)\n        {\n            float x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3], x4 = x[4], x5 = x[5], x6 = x[6], x7 = x[7], xt;\n            xt = x0 - x7; x0 += x7;\n            x7 = x1 - x6; x1 += x6;\n            x6 = x2 - x5; x2 += x5;\n            x5 = x3 - x4; x3 += x4;\n            x4 = x0 - x3; x0 += x3;\n            x3 = x1 - x2; x1 += x2;\n            x[0] = x0 + x1;\n            x[4] = (x0 - x1)*0.70710677f;\n            x5 =  x5 + x6;\n            x6 = (x6 + x7)*0.70710677f;\n            x7 =  x7 + xt;\n            x3 = (x3 + x4)*0.70710677f;\n            x5 -= x7*0.198912367f;  /* rotate by PI/8 */\n            x7 += x5*0.382683432f;\n            x5 -= x7*0.198912367f;\n            x0 = xt - x6; xt += x6;\n            x[1] = (xt + x7)*0.50979561f;\n            x[2] = (x4 + x3)*0.54119611f;\n            x[3] = (x0 - x5)*0.60134488f;\n            x[5] = (x0 + x5)*0.89997619f;\n            x[6] = (x4 - x3)*1.30656302f;\n            x[7] = (xt - x7)*2.56291556f;\n\n        }\n        for (i = 0; i < 7; i++, y += 4*18)\n        {\n            y[0*18] = t[0][i];\n            y[1*18] = t[2][i] + t[3][i] + t[3][i + 1];\n            y[2*18] = t[1][i] + t[1][i + 1];\n            y[3*18] = t[2][i + 1] + t[3][i] + t[3][i + 1];\n        }\n        y[0*18] = t[0][7];\n        y[1*18] = t[2][7] + t[3][7];\n        y[2*18] = t[1][7];\n        y[3*18] = t[3][7];\n    }\n#endif\n}\n\n#ifndef DR_MP3_FLOAT_OUTPUT\ntypedef drmp3_int16 drmp3d_sample_t;\n\nstatic drmp3_int16 drmp3d_scale_pcm(float sample)\n{\n    drmp3_int16 s;\n#if DRMP3_HAVE_ARMV6\n    drmp3_int32 s32 = (drmp3_int32)(sample + .5f);\n    s32 -= (s32 < 0);\n    s = (drmp3_int16)drmp3_clip_int16_arm(s32);\n#else\n    if (sample >=  32766.5) return (drmp3_int16) 32767;\n    if (sample <= -32767.5) return (drmp3_int16)-32768;\n    s = (drmp3_int16)(sample + .5f);\n    s -= (s < 0);   /* away from zero, to be compliant */\n#endif\n    return s;\n}\n#else\ntypedef float drmp3d_sample_t;\n\nstatic float drmp3d_scale_pcm(float sample)\n{\n    return sample*(1.f/32768.f);\n}\n#endif\n\nstatic void drmp3d_synth_pair(drmp3d_sample_t *pcm, int nch, const float *z)\n{\n    float a;\n    a  = (z[14*64] - z[    0]) * 29;\n    a += (z[ 1*64] + z[13*64]) * 213;\n    a += (z[12*64] - z[ 2*64]) * 459;\n    a += (z[ 3*64] + z[11*64]) * 2037;\n    a += (z[10*64] - z[ 4*64]) * 5153;\n    a += (z[ 5*64] + z[ 9*64]) * 6574;\n    a += (z[ 8*64] - z[ 6*64]) * 37489;\n    a +=  z[ 7*64]             * 75038;\n    pcm[0] = drmp3d_scale_pcm(a);\n\n    z += 2;\n    a  = z[14*64] * 104;\n    a += z[12*64] * 1567;\n    a += z[10*64] * 9727;\n    a += z[ 8*64] * 64019;\n    a += z[ 6*64] * -9975;\n    a += z[ 4*64] * -45;\n    a += z[ 2*64] * 146;\n    a += z[ 0*64] * -5;\n    pcm[16*nch] = drmp3d_scale_pcm(a);\n}\n\nstatic void drmp3d_synth(float *xl, drmp3d_sample_t *dstl, int nch, float *lins)\n{\n    int i;\n    float *xr = xl + 576*(nch - 1);\n    drmp3d_sample_t *dstr = dstl + (nch - 1);\n\n    static const float g_win[] = {\n        -1,26,-31,208,218,401,-519,2063,2000,4788,-5517,7134,5959,35640,-39336,74992,\n        -1,24,-35,202,222,347,-581,2080,1952,4425,-5879,7640,5288,33791,-41176,74856,\n        -1,21,-38,196,225,294,-645,2087,1893,4063,-6237,8092,4561,31947,-43006,74630,\n        -1,19,-41,190,227,244,-711,2085,1822,3705,-6589,8492,3776,30112,-44821,74313,\n        -1,17,-45,183,228,197,-779,2075,1739,3351,-6935,8840,2935,28289,-46617,73908,\n        -1,16,-49,176,228,153,-848,2057,1644,3004,-7271,9139,2037,26482,-48390,73415,\n        -2,14,-53,169,227,111,-919,2032,1535,2663,-7597,9389,1082,24694,-50137,72835,\n        -2,13,-58,161,224,72,-991,2001,1414,2330,-7910,9592,70,22929,-51853,72169,\n        -2,11,-63,154,221,36,-1064,1962,1280,2006,-8209,9750,-998,21189,-53534,71420,\n        -2,10,-68,147,215,2,-1137,1919,1131,1692,-8491,9863,-2122,19478,-55178,70590,\n        -3,9,-73,139,208,-29,-1210,1870,970,1388,-8755,9935,-3300,17799,-56778,69679,\n        -3,8,-79,132,200,-57,-1283,1817,794,1095,-8998,9966,-4533,16155,-58333,68692,\n        -4,7,-85,125,189,-83,-1356,1759,605,814,-9219,9959,-5818,14548,-59838,67629,\n        -4,7,-91,117,177,-106,-1428,1698,402,545,-9416,9916,-7154,12980,-61289,66494,\n        -5,6,-97,111,163,-127,-1498,1634,185,288,-9585,9838,-8540,11455,-62684,65290\n    };\n    float *zlin = lins + 15*64;\n    const float *w = g_win;\n\n    zlin[4*15]     = xl[18*16];\n    zlin[4*15 + 1] = xr[18*16];\n    zlin[4*15 + 2] = xl[0];\n    zlin[4*15 + 3] = xr[0];\n\n    zlin[4*31]     = xl[1 + 18*16];\n    zlin[4*31 + 1] = xr[1 + 18*16];\n    zlin[4*31 + 2] = xl[1];\n    zlin[4*31 + 3] = xr[1];\n\n    drmp3d_synth_pair(dstr, nch, lins + 4*15 + 1);\n    drmp3d_synth_pair(dstr + 32*nch, nch, lins + 4*15 + 64 + 1);\n    drmp3d_synth_pair(dstl, nch, lins + 4*15);\n    drmp3d_synth_pair(dstl + 32*nch, nch, lins + 4*15 + 64);\n\n#if DRMP3_HAVE_SIMD\n    if (drmp3_have_simd()) for (i = 14; i >= 0; i--)\n    {\n#define DRMP3_VLOAD(k) drmp3_f4 w0 = DRMP3_VSET(*w++); drmp3_f4 w1 = DRMP3_VSET(*w++); drmp3_f4 vz = DRMP3_VLD(&zlin[4*i - 64*k]); drmp3_f4 vy = DRMP3_VLD(&zlin[4*i - 64*(15 - k)]);\n#define DRMP3_V0(k) { DRMP3_VLOAD(k) b =               DRMP3_VADD(DRMP3_VMUL(vz, w1), DRMP3_VMUL(vy, w0)) ; a =               DRMP3_VSUB(DRMP3_VMUL(vz, w0), DRMP3_VMUL(vy, w1));  }\n#define DRMP3_V1(k) { DRMP3_VLOAD(k) b = DRMP3_VADD(b, DRMP3_VADD(DRMP3_VMUL(vz, w1), DRMP3_VMUL(vy, w0))); a = DRMP3_VADD(a, DRMP3_VSUB(DRMP3_VMUL(vz, w0), DRMP3_VMUL(vy, w1))); }\n#define DRMP3_V2(k) { DRMP3_VLOAD(k) b = DRMP3_VADD(b, DRMP3_VADD(DRMP3_VMUL(vz, w1), DRMP3_VMUL(vy, w0))); a = DRMP3_VADD(a, DRMP3_VSUB(DRMP3_VMUL(vy, w1), DRMP3_VMUL(vz, w0))); }\n        drmp3_f4 a, b;\n        zlin[4*i]     = xl[18*(31 - i)];\n        zlin[4*i + 1] = xr[18*(31 - i)];\n        zlin[4*i + 2] = xl[1 + 18*(31 - i)];\n        zlin[4*i + 3] = xr[1 + 18*(31 - i)];\n        zlin[4*i + 64] = xl[1 + 18*(1 + i)];\n        zlin[4*i + 64 + 1] = xr[1 + 18*(1 + i)];\n        zlin[4*i - 64 + 2] = xl[18*(1 + i)];\n        zlin[4*i - 64 + 3] = xr[18*(1 + i)];\n\n        DRMP3_V0(0) DRMP3_V2(1) DRMP3_V1(2) DRMP3_V2(3) DRMP3_V1(4) DRMP3_V2(5) DRMP3_V1(6) DRMP3_V2(7)\n\n        {\n#ifndef DR_MP3_FLOAT_OUTPUT\n#if DRMP3_HAVE_SSE\n            static const drmp3_f4 g_max = { 32767.0f, 32767.0f, 32767.0f, 32767.0f };\n            static const drmp3_f4 g_min = { -32768.0f, -32768.0f, -32768.0f, -32768.0f };\n            __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, g_max), g_min)),\n                                           _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, g_max), g_min)));\n            dstr[(15 - i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 1);\n            dstr[(17 + i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 5);\n            dstl[(15 - i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 0);\n            dstl[(17 + i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 4);\n            dstr[(47 - i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 3);\n            dstr[(49 + i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 7);\n            dstl[(47 - i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 2);\n            dstl[(49 + i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 6);\n#else\n            int16x4_t pcma, pcmb;\n            a = DRMP3_VADD(a, DRMP3_VSET(0.5f));\n            b = DRMP3_VADD(b, DRMP3_VSET(0.5f));\n            pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, DRMP3_VSET(0)))));\n            pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, DRMP3_VSET(0)))));\n            vst1_lane_s16(dstr + (15 - i)*nch, pcma, 1);\n            vst1_lane_s16(dstr + (17 + i)*nch, pcmb, 1);\n            vst1_lane_s16(dstl + (15 - i)*nch, pcma, 0);\n            vst1_lane_s16(dstl + (17 + i)*nch, pcmb, 0);\n            vst1_lane_s16(dstr + (47 - i)*nch, pcma, 3);\n            vst1_lane_s16(dstr + (49 + i)*nch, pcmb, 3);\n            vst1_lane_s16(dstl + (47 - i)*nch, pcma, 2);\n            vst1_lane_s16(dstl + (49 + i)*nch, pcmb, 2);\n#endif\n#else\n        #if DRMP3_HAVE_SSE\n            static const drmp3_f4 g_scale = { 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f };\n        #else\n            const drmp3_f4 g_scale = vdupq_n_f32(1.0f/32768.0f);\n        #endif\n            a = DRMP3_VMUL(a, g_scale);\n            b = DRMP3_VMUL(b, g_scale);\n#if DRMP3_HAVE_SSE\n            _mm_store_ss(dstr + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)));\n            _mm_store_ss(dstr + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(1, 1, 1, 1)));\n            _mm_store_ss(dstl + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)));\n            _mm_store_ss(dstl + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(0, 0, 0, 0)));\n            _mm_store_ss(dstr + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3)));\n            _mm_store_ss(dstr + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 3, 3, 3)));\n            _mm_store_ss(dstl + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)));\n            _mm_store_ss(dstl + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(2, 2, 2, 2)));\n#else\n            vst1q_lane_f32(dstr + (15 - i)*nch, a, 1);\n            vst1q_lane_f32(dstr + (17 + i)*nch, b, 1);\n            vst1q_lane_f32(dstl + (15 - i)*nch, a, 0);\n            vst1q_lane_f32(dstl + (17 + i)*nch, b, 0);\n            vst1q_lane_f32(dstr + (47 - i)*nch, a, 3);\n            vst1q_lane_f32(dstr + (49 + i)*nch, b, 3);\n            vst1q_lane_f32(dstl + (47 - i)*nch, a, 2);\n            vst1q_lane_f32(dstl + (49 + i)*nch, b, 2);\n#endif\n#endif /* DR_MP3_FLOAT_OUTPUT */\n        }\n    } else\n#endif\n#ifdef DR_MP3_ONLY_SIMD\n    {} /* for HAVE_SIMD=1, MINIMP3_ONLY_SIMD=1 case we do not need non-intrinsic \"else\" branch */\n#else\n    for (i = 14; i >= 0; i--)\n    {\n#define DRMP3_LOAD(k) float w0 = *w++; float w1 = *w++; float *vz = &zlin[4*i - k*64]; float *vy = &zlin[4*i - (15 - k)*64];\n#define DRMP3_S0(k) { int j; DRMP3_LOAD(k); for (j = 0; j < 4; j++) b[j]  = vz[j]*w1 + vy[j]*w0, a[j]  = vz[j]*w0 - vy[j]*w1; }\n#define DRMP3_S1(k) { int j; DRMP3_LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vz[j]*w0 - vy[j]*w1; }\n#define DRMP3_S2(k) { int j; DRMP3_LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vy[j]*w1 - vz[j]*w0; }\n        float a[4], b[4];\n\n        zlin[4*i]     = xl[18*(31 - i)];\n        zlin[4*i + 1] = xr[18*(31 - i)];\n        zlin[4*i + 2] = xl[1 + 18*(31 - i)];\n        zlin[4*i + 3] = xr[1 + 18*(31 - i)];\n        zlin[4*(i + 16)]   = xl[1 + 18*(1 + i)];\n        zlin[4*(i + 16) + 1] = xr[1 + 18*(1 + i)];\n        zlin[4*(i - 16) + 2] = xl[18*(1 + i)];\n        zlin[4*(i - 16) + 3] = xr[18*(1 + i)];\n\n        DRMP3_S0(0) DRMP3_S2(1) DRMP3_S1(2) DRMP3_S2(3) DRMP3_S1(4) DRMP3_S2(5) DRMP3_S1(6) DRMP3_S2(7)\n\n        dstr[(15 - i)*nch] = drmp3d_scale_pcm(a[1]);\n        dstr[(17 + i)*nch] = drmp3d_scale_pcm(b[1]);\n        dstl[(15 - i)*nch] = drmp3d_scale_pcm(a[0]);\n        dstl[(17 + i)*nch] = drmp3d_scale_pcm(b[0]);\n        dstr[(47 - i)*nch] = drmp3d_scale_pcm(a[3]);\n        dstr[(49 + i)*nch] = drmp3d_scale_pcm(b[3]);\n        dstl[(47 - i)*nch] = drmp3d_scale_pcm(a[2]);\n        dstl[(49 + i)*nch] = drmp3d_scale_pcm(b[2]);\n    }\n#endif\n}\n\nstatic void drmp3d_synth_granule(float *qmf_state, float *grbuf, int nbands, int nch, drmp3d_sample_t *pcm, float *lins)\n{\n    int i;\n    for (i = 0; i < nch; i++)\n    {\n        drmp3d_DCT_II(grbuf + 576*i, nbands);\n    }\n\n    DRMP3_COPY_MEMORY(lins, qmf_state, sizeof(float)*15*64);\n\n    for (i = 0; i < nbands; i += 2)\n    {\n        drmp3d_synth(grbuf + i, pcm + 32*nch*i, nch, lins + i*64);\n    }\n#ifndef DR_MP3_NONSTANDARD_BUT_LOGICAL\n    if (nch == 1)\n    {\n        for (i = 0; i < 15*64; i += 2)\n        {\n            qmf_state[i] = lins[nbands*64 + i];\n        }\n    } else\n#endif\n    {\n        DRMP3_COPY_MEMORY(qmf_state, lins + nbands*64, sizeof(float)*15*64);\n    }\n}\n\nstatic int drmp3d_match_frame(const drmp3_uint8 *hdr, int mp3_bytes, int frame_bytes)\n{\n    int i, nmatch;\n    for (i = 0, nmatch = 0; nmatch < DRMP3_MAX_FRAME_SYNC_MATCHES; nmatch++)\n    {\n        i += drmp3_hdr_frame_bytes(hdr + i, frame_bytes) + drmp3_hdr_padding(hdr + i);\n        if (i + DRMP3_HDR_SIZE > mp3_bytes)\n            return nmatch > 0;\n        if (!drmp3_hdr_compare(hdr, hdr + i))\n            return 0;\n    }\n    return 1;\n}\n\nstatic int drmp3d_find_frame(const drmp3_uint8 *mp3, int mp3_bytes, int *free_format_bytes, int *ptr_frame_bytes)\n{\n    int i, k;\n    for (i = 0; i < mp3_bytes - DRMP3_HDR_SIZE; i++, mp3++)\n    {\n        if (drmp3_hdr_valid(mp3))\n        {\n            int frame_bytes = drmp3_hdr_frame_bytes(mp3, *free_format_bytes);\n            int frame_and_padding = frame_bytes + drmp3_hdr_padding(mp3);\n\n            for (k = DRMP3_HDR_SIZE; !frame_bytes && k < DRMP3_MAX_FREE_FORMAT_FRAME_SIZE && i + 2*k < mp3_bytes - DRMP3_HDR_SIZE; k++)\n            {\n                if (drmp3_hdr_compare(mp3, mp3 + k))\n                {\n                    int fb = k - drmp3_hdr_padding(mp3);\n                    int nextfb = fb + drmp3_hdr_padding(mp3 + k);\n                    if (i + k + nextfb + DRMP3_HDR_SIZE > mp3_bytes || !drmp3_hdr_compare(mp3, mp3 + k + nextfb))\n                        continue;\n                    frame_and_padding = k;\n                    frame_bytes = fb;\n                    *free_format_bytes = fb;\n                }\n            }\n\n            if ((frame_bytes && i + frame_and_padding <= mp3_bytes &&\n                drmp3d_match_frame(mp3, mp3_bytes - i, frame_bytes)) ||\n                (!i && frame_and_padding == mp3_bytes))\n            {\n                *ptr_frame_bytes = frame_and_padding;\n                return i;\n            }\n            *free_format_bytes = 0;\n        }\n    }\n    *ptr_frame_bytes = 0;\n    return mp3_bytes;\n}\n\nDRMP3_API void drmp3dec_init(drmp3dec *dec)\n{\n    dec->header[0] = 0;\n}\n\nDRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int mp3_bytes, void *pcm, drmp3dec_frame_info *info)\n{\n    int i = 0, igr, frame_size = 0, success = 1;\n    const drmp3_uint8 *hdr;\n    drmp3_bs bs_frame[1];\n    drmp3dec_scratch scratch;\n\n    if (mp3_bytes > 4 && dec->header[0] == 0xff && drmp3_hdr_compare(dec->header, mp3))\n    {\n        frame_size = drmp3_hdr_frame_bytes(mp3, dec->free_format_bytes) + drmp3_hdr_padding(mp3);\n        if (frame_size != mp3_bytes && (frame_size + DRMP3_HDR_SIZE > mp3_bytes || !drmp3_hdr_compare(mp3, mp3 + frame_size)))\n        {\n            frame_size = 0;\n        }\n    }\n    if (!frame_size)\n    {\n        DRMP3_ZERO_MEMORY(dec, sizeof(drmp3dec));\n        i = drmp3d_find_frame(mp3, mp3_bytes, &dec->free_format_bytes, &frame_size);\n        if (!frame_size || i + frame_size > mp3_bytes)\n        {\n            info->frame_bytes = i;\n            return 0;\n        }\n    }\n\n    hdr = mp3 + i;\n    DRMP3_COPY_MEMORY(dec->header, hdr, DRMP3_HDR_SIZE);\n    info->frame_bytes = i + frame_size;\n    info->channels = DRMP3_HDR_IS_MONO(hdr) ? 1 : 2;\n    info->hz = drmp3_hdr_sample_rate_hz(hdr);\n    info->layer = 4 - DRMP3_HDR_GET_LAYER(hdr);\n    info->bitrate_kbps = drmp3_hdr_bitrate_kbps(hdr);\n\n    drmp3_bs_init(bs_frame, hdr + DRMP3_HDR_SIZE, frame_size - DRMP3_HDR_SIZE);\n    if (DRMP3_HDR_IS_CRC(hdr))\n    {\n        drmp3_bs_get_bits(bs_frame, 16);\n    }\n\n    if (info->layer == 3)\n    {\n        int main_data_begin = drmp3_L3_read_side_info(bs_frame, scratch.gr_info, hdr);\n        if (main_data_begin < 0 || bs_frame->pos > bs_frame->limit)\n        {\n            drmp3dec_init(dec);\n            return 0;\n        }\n        success = drmp3_L3_restore_reservoir(dec, bs_frame, &scratch, main_data_begin);\n        if (success && pcm != NULL)\n        {\n            for (igr = 0; igr < (DRMP3_HDR_TEST_MPEG1(hdr) ? 2 : 1); igr++, pcm = DRMP3_OFFSET_PTR(pcm, sizeof(drmp3d_sample_t)*576*info->channels))\n            {\n                DRMP3_ZERO_MEMORY(scratch.grbuf[0], 576*2*sizeof(float));\n                drmp3_L3_decode(dec, &scratch, scratch.gr_info + igr*info->channels, info->channels);\n                drmp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 18, info->channels, (drmp3d_sample_t*)pcm, scratch.syn[0]);\n            }\n        }\n        drmp3_L3_save_reservoir(dec, &scratch);\n    } else\n    {\n#ifdef DR_MP3_ONLY_MP3\n        return 0;\n#else\n        drmp3_L12_scale_info sci[1];\n\n        if (pcm == NULL) {\n            return drmp3_hdr_frame_samples(hdr);\n        }\n\n        drmp3_L12_read_scale_info(hdr, bs_frame, sci);\n\n        DRMP3_ZERO_MEMORY(scratch.grbuf[0], 576*2*sizeof(float));\n        for (i = 0, igr = 0; igr < 3; igr++)\n        {\n            if (12 == (i += drmp3_L12_dequantize_granule(scratch.grbuf[0] + i, bs_frame, sci, info->layer | 1)))\n            {\n                i = 0;\n                drmp3_L12_apply_scf_384(sci, sci->scf + igr, scratch.grbuf[0]);\n                drmp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 12, info->channels, (drmp3d_sample_t*)pcm, scratch.syn[0]);\n                DRMP3_ZERO_MEMORY(scratch.grbuf[0], 576*2*sizeof(float));\n                pcm = DRMP3_OFFSET_PTR(pcm, sizeof(drmp3d_sample_t)*384*info->channels);\n            }\n            if (bs_frame->pos > bs_frame->limit)\n            {\n                drmp3dec_init(dec);\n                return 0;\n            }\n        }\n#endif\n    }\n\n    return success*drmp3_hdr_frame_samples(dec->header);\n}\n\nDRMP3_API void drmp3dec_f32_to_s16(const float *in, drmp3_int16 *out, size_t num_samples)\n{\n    size_t i = 0;\n#if DRMP3_HAVE_SIMD\n    size_t aligned_count = num_samples & ~7;\n    for(; i < aligned_count; i+=8)\n    {\n        drmp3_f4 scale = DRMP3_VSET(32768.0f);\n        drmp3_f4 a = DRMP3_VMUL(DRMP3_VLD(&in[i  ]), scale);\n        drmp3_f4 b = DRMP3_VMUL(DRMP3_VLD(&in[i+4]), scale);\n#if DRMP3_HAVE_SSE\n        drmp3_f4 s16max = DRMP3_VSET( 32767.0f);\n        drmp3_f4 s16min = DRMP3_VSET(-32768.0f);\n        __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, s16max), s16min)),\n                                        _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, s16max), s16min)));\n        out[i  ] = (drmp3_int16)_mm_extract_epi16(pcm8, 0);\n        out[i+1] = (drmp3_int16)_mm_extract_epi16(pcm8, 1);\n        out[i+2] = (drmp3_int16)_mm_extract_epi16(pcm8, 2);\n        out[i+3] = (drmp3_int16)_mm_extract_epi16(pcm8, 3);\n        out[i+4] = (drmp3_int16)_mm_extract_epi16(pcm8, 4);\n        out[i+5] = (drmp3_int16)_mm_extract_epi16(pcm8, 5);\n        out[i+6] = (drmp3_int16)_mm_extract_epi16(pcm8, 6);\n        out[i+7] = (drmp3_int16)_mm_extract_epi16(pcm8, 7);\n#else\n        int16x4_t pcma, pcmb;\n        a = DRMP3_VADD(a, DRMP3_VSET(0.5f));\n        b = DRMP3_VADD(b, DRMP3_VSET(0.5f));\n        pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, DRMP3_VSET(0)))));\n        pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, DRMP3_VSET(0)))));\n        vst1_lane_s16(out+i  , pcma, 0);\n        vst1_lane_s16(out+i+1, pcma, 1);\n        vst1_lane_s16(out+i+2, pcma, 2);\n        vst1_lane_s16(out+i+3, pcma, 3);\n        vst1_lane_s16(out+i+4, pcmb, 0);\n        vst1_lane_s16(out+i+5, pcmb, 1);\n        vst1_lane_s16(out+i+6, pcmb, 2);\n        vst1_lane_s16(out+i+7, pcmb, 3);\n#endif\n    }\n#endif\n    for(; i < num_samples; i++)\n    {\n        float sample = in[i] * 32768.0f;\n        if (sample >=  32766.5)\n            out[i] = (drmp3_int16) 32767;\n        else if (sample <= -32767.5)\n            out[i] = (drmp3_int16)-32768;\n        else\n        {\n            short s = (drmp3_int16)(sample + .5f);\n            s -= (s < 0);   /* away from zero, to be compliant */\n            out[i] = s;\n        }\n    }\n}\n\n\n\n/************************************************************************************************************************************************************\n\n Main Public API\n\n ************************************************************************************************************************************************************/\n#if defined(SIZE_MAX)\n    #define DRMP3_SIZE_MAX  SIZE_MAX\n#else\n    #if defined(_WIN64) || defined(_LP64) || defined(__LP64__)\n        #define DRMP3_SIZE_MAX  ((drmp3_uint64)0xFFFFFFFFFFFFFFFF)\n    #else\n        #define DRMP3_SIZE_MAX  0xFFFFFFFF\n    #endif\n#endif\n\n/* Options. */\n#ifndef DRMP3_SEEK_LEADING_MP3_FRAMES\n#define DRMP3_SEEK_LEADING_MP3_FRAMES   2\n#endif\n\n#define DRMP3_MIN_DATA_CHUNK_SIZE   16384\n\n/* The size in bytes of each chunk of data to read from the MP3 stream. minimp3 recommends at least 16K, but in an attempt to reduce data movement I'm making this slightly larger. */\n#ifndef DRMP3_DATA_CHUNK_SIZE\n#define DRMP3_DATA_CHUNK_SIZE  (DRMP3_MIN_DATA_CHUNK_SIZE*4)\n#endif\n\n\n#define DRMP3_COUNTOF(x)        (sizeof(x) / sizeof(x[0]))\n#define DRMP3_CLAMP(x, lo, hi)  (DRMP3_MAX(lo, DRMP3_MIN(x, hi)))\n\n#ifndef DRMP3_PI_D\n#define DRMP3_PI_D    3.14159265358979323846264\n#endif\n\n#define DRMP3_DEFAULT_RESAMPLER_LPF_ORDER   2\n\nstatic DRMP3_INLINE float drmp3_mix_f32(float x, float y, float a)\n{\n    return x*(1-a) + y*a;\n}\nstatic DRMP3_INLINE float drmp3_mix_f32_fast(float x, float y, float a)\n{\n    float r0 = (y - x);\n    float r1 = r0*a;\n    return x + r1;\n    /*return x + (y - x)*a;*/\n}\n\n\n/*\nGreatest common factor using Euclid's algorithm iteratively.\n*/\nstatic DRMP3_INLINE drmp3_uint32 drmp3_gcf_u32(drmp3_uint32 a, drmp3_uint32 b)\n{\n    for (;;) {\n        if (b == 0) {\n            break;\n        } else {\n            drmp3_uint32 t = a;\n            a = b;\n            b = t % a;\n        }\n    }\n\n    return a;\n}\n\n\nstatic void* drmp3__malloc_default(size_t sz, void* pUserData)\n{\n    (void)pUserData;\n    return DRMP3_MALLOC(sz);\n}\n\nstatic void* drmp3__realloc_default(void* p, size_t sz, void* pUserData)\n{\n    (void)pUserData;\n    return DRMP3_REALLOC(p, sz);\n}\n\nstatic void drmp3__free_default(void* p, void* pUserData)\n{\n    (void)pUserData;\n    DRMP3_FREE(p);\n}\n\n\nstatic void* drmp3__malloc_from_callbacks(size_t sz, const drmp3_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pAllocationCallbacks == NULL) {\n        return NULL;\n    }\n\n    if (pAllocationCallbacks->onMalloc != NULL) {\n        return pAllocationCallbacks->onMalloc(sz, pAllocationCallbacks->pUserData);\n    }\n\n    /* Try using realloc(). */\n    if (pAllocationCallbacks->onRealloc != NULL) {\n        return pAllocationCallbacks->onRealloc(NULL, sz, pAllocationCallbacks->pUserData);\n    }\n\n    return NULL;\n}\n\nstatic void* drmp3__realloc_from_callbacks(void* p, size_t szNew, size_t szOld, const drmp3_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pAllocationCallbacks == NULL) {\n        return NULL;\n    }\n\n    if (pAllocationCallbacks->onRealloc != NULL) {\n        return pAllocationCallbacks->onRealloc(p, szNew, pAllocationCallbacks->pUserData);\n    }\n\n    /* Try emulating realloc() in terms of malloc()/free(). */\n    if (pAllocationCallbacks->onMalloc != NULL && pAllocationCallbacks->onFree != NULL) {\n        void* p2;\n\n        p2 = pAllocationCallbacks->onMalloc(szNew, pAllocationCallbacks->pUserData);\n        if (p2 == NULL) {\n            return NULL;\n        }\n\n        if (p != NULL) {\n            DRMP3_COPY_MEMORY(p2, p, szOld);\n            pAllocationCallbacks->onFree(p, pAllocationCallbacks->pUserData);\n        }\n\n        return p2;\n    }\n\n    return NULL;\n}\n\nstatic void drmp3__free_from_callbacks(void* p, const drmp3_allocation_callbacks* pAllocationCallbacks)\n{\n    if (p == NULL || pAllocationCallbacks == NULL) {\n        return;\n    }\n\n    if (pAllocationCallbacks->onFree != NULL) {\n        pAllocationCallbacks->onFree(p, pAllocationCallbacks->pUserData);\n    }\n}\n\n\nstatic drmp3_allocation_callbacks drmp3_copy_allocation_callbacks_or_defaults(const drmp3_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pAllocationCallbacks != NULL) {\n        /* Copy. */\n        return *pAllocationCallbacks;\n    } else {\n        /* Defaults. */\n        drmp3_allocation_callbacks allocationCallbacks;\n        allocationCallbacks.pUserData = NULL;\n        allocationCallbacks.onMalloc  = drmp3__malloc_default;\n        allocationCallbacks.onRealloc = drmp3__realloc_default;\n        allocationCallbacks.onFree    = drmp3__free_default;\n        return allocationCallbacks;\n    }\n}\n\n\n\nstatic size_t drmp3__on_read(drmp3* pMP3, void* pBufferOut, size_t bytesToRead)\n{\n    size_t bytesRead = pMP3->onRead(pMP3->pUserData, pBufferOut, bytesToRead);\n    pMP3->streamCursor += bytesRead;\n    return bytesRead;\n}\n\nstatic drmp3_bool32 drmp3__on_seek(drmp3* pMP3, int offset, drmp3_seek_origin origin)\n{\n    DRMP3_ASSERT(offset >= 0);\n\n    if (!pMP3->onSeek(pMP3->pUserData, offset, origin)) {\n        return DRMP3_FALSE;\n    }\n\n    if (origin == drmp3_seek_origin_start) {\n        pMP3->streamCursor = (drmp3_uint64)offset;\n    } else {\n        pMP3->streamCursor += offset;\n    }\n\n    return DRMP3_TRUE;\n}\n\nstatic drmp3_bool32 drmp3__on_seek_64(drmp3* pMP3, drmp3_uint64 offset, drmp3_seek_origin origin)\n{\n    if (offset <= 0x7FFFFFFF) {\n        return drmp3__on_seek(pMP3, (int)offset, origin);\n    }\n\n\n    /* Getting here \"offset\" is too large for a 32-bit integer. We just keep seeking forward until we hit the offset. */\n    if (!drmp3__on_seek(pMP3, 0x7FFFFFFF, drmp3_seek_origin_start)) {\n        return DRMP3_FALSE;\n    }\n\n    offset -= 0x7FFFFFFF;\n    while (offset > 0) {\n        if (offset <= 0x7FFFFFFF) {\n            if (!drmp3__on_seek(pMP3, (int)offset, drmp3_seek_origin_current)) {\n                return DRMP3_FALSE;\n            }\n            offset = 0;\n        } else {\n            if (!drmp3__on_seek(pMP3, 0x7FFFFFFF, drmp3_seek_origin_current)) {\n                return DRMP3_FALSE;\n            }\n            offset -= 0x7FFFFFFF;\n        }\n    }\n\n    return DRMP3_TRUE;\n}\n\n\nstatic drmp3_uint32 drmp3_decode_next_frame_ex__callbacks(drmp3* pMP3, drmp3d_sample_t* pPCMFrames)\n{\n    drmp3_uint32 pcmFramesRead = 0;\n\n    DRMP3_ASSERT(pMP3 != NULL);\n    DRMP3_ASSERT(pMP3->onRead != NULL);\n\n    if (pMP3->atEnd) {\n        return 0;\n    }\n\n    for (;;) {\n        drmp3dec_frame_info info;\n\n        /* minimp3 recommends doing data submission in chunks of at least 16K. If we don't have at least 16K bytes available, get more. */\n        if (pMP3->dataSize < DRMP3_MIN_DATA_CHUNK_SIZE) {\n            size_t bytesRead;\n\n            /* First we need to move the data down. */\n            if (pMP3->pData != NULL) {\n                DRMP3_MOVE_MEMORY(pMP3->pData, pMP3->pData + pMP3->dataConsumed, pMP3->dataSize);\n            }\n\n            pMP3->dataConsumed = 0;\n\n            if (pMP3->dataCapacity < DRMP3_DATA_CHUNK_SIZE) {\n                drmp3_uint8* pNewData;\n                size_t newDataCap;\n\n                newDataCap = DRMP3_DATA_CHUNK_SIZE;\n\n                pNewData = (drmp3_uint8*)drmp3__realloc_from_callbacks(pMP3->pData, newDataCap, pMP3->dataCapacity, &pMP3->allocationCallbacks);\n                if (pNewData == NULL) {\n                    return 0; /* Out of memory. */\n                }\n\n                pMP3->pData = pNewData;\n                pMP3->dataCapacity = newDataCap;\n            }\n\n            bytesRead = drmp3__on_read(pMP3, pMP3->pData + pMP3->dataSize, (pMP3->dataCapacity - pMP3->dataSize));\n            if (bytesRead == 0) {\n                if (pMP3->dataSize == 0) {\n                    pMP3->atEnd = DRMP3_TRUE;\n                    return 0; /* No data. */\n                }\n            }\n\n            pMP3->dataSize += bytesRead;\n        }\n\n        if (pMP3->dataSize > INT_MAX) {\n            pMP3->atEnd = DRMP3_TRUE;\n            return 0; /* File too big. */\n        }\n\n        DRMP3_ASSERT(pMP3->pData != NULL);\n        DRMP3_ASSERT(pMP3->dataCapacity > 0);\n\n        pcmFramesRead = drmp3dec_decode_frame(&pMP3->decoder, pMP3->pData + pMP3->dataConsumed, (int)pMP3->dataSize, pPCMFrames, &info);    /* <-- Safe size_t -> int conversion thanks to the check above. */\n\n        /* Consume the data. */\n        if (info.frame_bytes > 0) {\n            pMP3->dataConsumed += (size_t)info.frame_bytes;\n            pMP3->dataSize     -= (size_t)info.frame_bytes;\n        }\n\n        /* pcmFramesRead will be equal to 0 if decoding failed. If it is zero and info.frame_bytes > 0 then we have successfully decoded the frame. */\n        if (pcmFramesRead > 0) {\n            pcmFramesRead = drmp3_hdr_frame_samples(pMP3->decoder.header);\n            pMP3->pcmFramesConsumedInMP3Frame = 0;\n            pMP3->pcmFramesRemainingInMP3Frame = pcmFramesRead;\n            pMP3->mp3FrameChannels = info.channels;\n            pMP3->mp3FrameSampleRate = info.hz;\n            break;\n        } else if (info.frame_bytes == 0) {\n            /* Need more data. minimp3 recommends doing data submission in 16K chunks. */\n            size_t bytesRead;\n\n            /* First we need to move the data down. */\n            DRMP3_MOVE_MEMORY(pMP3->pData, pMP3->pData + pMP3->dataConsumed, pMP3->dataSize);\n            pMP3->dataConsumed = 0;\n\n            if (pMP3->dataCapacity == pMP3->dataSize) {\n                /* No room. Expand. */\n                drmp3_uint8* pNewData;\n                size_t newDataCap;\n\n                newDataCap = pMP3->dataCapacity + DRMP3_DATA_CHUNK_SIZE;\n\n                pNewData = (drmp3_uint8*)drmp3__realloc_from_callbacks(pMP3->pData, newDataCap, pMP3->dataCapacity, &pMP3->allocationCallbacks);\n                if (pNewData == NULL) {\n                    return 0; /* Out of memory. */\n                }\n\n                pMP3->pData = pNewData;\n                pMP3->dataCapacity = newDataCap;\n            }\n\n            /* Fill in a chunk. */\n            bytesRead = drmp3__on_read(pMP3, pMP3->pData + pMP3->dataSize, (pMP3->dataCapacity - pMP3->dataSize));\n            if (bytesRead == 0) {\n                pMP3->atEnd = DRMP3_TRUE;\n                return 0; /* Error reading more data. */\n            }\n\n            pMP3->dataSize += bytesRead;\n        }\n    };\n\n    return pcmFramesRead;\n}\n\nstatic drmp3_uint32 drmp3_decode_next_frame_ex__memory(drmp3* pMP3, drmp3d_sample_t* pPCMFrames)\n{\n    drmp3_uint32 pcmFramesRead = 0;\n    drmp3dec_frame_info info;\n\n    DRMP3_ASSERT(pMP3 != NULL);\n    DRMP3_ASSERT(pMP3->memory.pData != NULL);\n\n    if (pMP3->atEnd) {\n        return 0;\n    }\n\n    for (;;) {\n        pcmFramesRead = drmp3dec_decode_frame(&pMP3->decoder, pMP3->memory.pData + pMP3->memory.currentReadPos, (int)(pMP3->memory.dataSize - pMP3->memory.currentReadPos), pPCMFrames, &info);\n        if (pcmFramesRead > 0) {\n            pcmFramesRead = drmp3_hdr_frame_samples(pMP3->decoder.header);\n            pMP3->pcmFramesConsumedInMP3Frame  = 0;\n            pMP3->pcmFramesRemainingInMP3Frame = pcmFramesRead;\n            pMP3->mp3FrameChannels             = info.channels;\n            pMP3->mp3FrameSampleRate           = info.hz;\n            break;\n        } else if (info.frame_bytes > 0) {\n            /* No frames were read, but it looks like we skipped past one. Read the next MP3 frame. */\n            pMP3->memory.currentReadPos += (size_t)info.frame_bytes;\n        } else {\n            /* Nothing at all was read. Abort. */\n            break;\n        }\n    }\n\n    /* Consume the data. */\n    pMP3->memory.currentReadPos += (size_t)info.frame_bytes;\n\n    return pcmFramesRead;\n}\n\nstatic drmp3_uint32 drmp3_decode_next_frame_ex(drmp3* pMP3, drmp3d_sample_t* pPCMFrames)\n{\n    if (pMP3->memory.pData != NULL && pMP3->memory.dataSize > 0) {\n        return drmp3_decode_next_frame_ex__memory(pMP3, pPCMFrames);\n    } else {\n        return drmp3_decode_next_frame_ex__callbacks(pMP3, pPCMFrames);\n    }\n}\n\nstatic drmp3_uint32 drmp3_decode_next_frame(drmp3* pMP3)\n{\n    DRMP3_ASSERT(pMP3 != NULL);\n    return drmp3_decode_next_frame_ex(pMP3, (drmp3d_sample_t*)pMP3->pcmFrames);\n}\n\n#if 0\nstatic drmp3_uint32 drmp3_seek_next_frame(drmp3* pMP3)\n{\n    drmp3_uint32 pcmFrameCount;\n\n    DRMP3_ASSERT(pMP3 != NULL);\n\n    pcmFrameCount = drmp3_decode_next_frame_ex(pMP3, NULL);\n    if (pcmFrameCount == 0) {\n        return 0;\n    }\n\n    /* We have essentially just skipped past the frame, so just set the remaining samples to 0. */\n    pMP3->currentPCMFrame             += pcmFrameCount;\n    pMP3->pcmFramesConsumedInMP3Frame  = pcmFrameCount;\n    pMP3->pcmFramesRemainingInMP3Frame = 0;\n\n    return pcmFrameCount;\n}\n#endif\n\nstatic drmp3_bool32 drmp3_init_internal(drmp3* pMP3, drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, const drmp3_allocation_callbacks* pAllocationCallbacks)\n{\n    DRMP3_ASSERT(pMP3 != NULL);\n    DRMP3_ASSERT(onRead != NULL);\n\n    /* This function assumes the output object has already been reset to 0. Do not do that here, otherwise things will break. */\n    drmp3dec_init(&pMP3->decoder);\n\n    pMP3->onRead = onRead;\n    pMP3->onSeek = onSeek;\n    pMP3->pUserData = pUserData;\n    pMP3->allocationCallbacks = drmp3_copy_allocation_callbacks_or_defaults(pAllocationCallbacks);\n\n    if (pMP3->allocationCallbacks.onFree == NULL || (pMP3->allocationCallbacks.onMalloc == NULL && pMP3->allocationCallbacks.onRealloc == NULL)) {\n        return DRMP3_FALSE;    /* Invalid allocation callbacks. */\n    }\n\n    /* Decode the first frame to confirm that it is indeed a valid MP3 stream. */\n    if (drmp3_decode_next_frame(pMP3) == 0) {\n        drmp3__free_from_callbacks(pMP3->pData, &pMP3->allocationCallbacks);    /* The call above may have allocated memory. Need to make sure it's freed before aborting. */\n        return DRMP3_FALSE; /* Not a valid MP3 stream. */\n    }\n\n    pMP3->channels   = pMP3->mp3FrameChannels;\n    pMP3->sampleRate = pMP3->mp3FrameSampleRate;\n\n    return DRMP3_TRUE;\n}\n\nDRMP3_API drmp3_bool32 drmp3_init(drmp3* pMP3, drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, const drmp3_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pMP3 == NULL || onRead == NULL) {\n        return DRMP3_FALSE;\n    }\n\n    DRMP3_ZERO_OBJECT(pMP3);\n    return drmp3_init_internal(pMP3, onRead, onSeek, pUserData, pAllocationCallbacks);\n}\n\n\nstatic size_t drmp3__on_read_memory(void* pUserData, void* pBufferOut, size_t bytesToRead)\n{\n    drmp3* pMP3 = (drmp3*)pUserData;\n    size_t bytesRemaining;\n\n    DRMP3_ASSERT(pMP3 != NULL);\n    DRMP3_ASSERT(pMP3->memory.dataSize >= pMP3->memory.currentReadPos);\n\n    bytesRemaining = pMP3->memory.dataSize - pMP3->memory.currentReadPos;\n    if (bytesToRead > bytesRemaining) {\n        bytesToRead = bytesRemaining;\n    }\n\n    if (bytesToRead > 0) {\n        DRMP3_COPY_MEMORY(pBufferOut, pMP3->memory.pData + pMP3->memory.currentReadPos, bytesToRead);\n        pMP3->memory.currentReadPos += bytesToRead;\n    }\n\n    return bytesToRead;\n}\n\nstatic drmp3_bool32 drmp3__on_seek_memory(void* pUserData, int byteOffset, drmp3_seek_origin origin)\n{\n    drmp3* pMP3 = (drmp3*)pUserData;\n\n    DRMP3_ASSERT(pMP3 != NULL);\n\n    if (origin == drmp3_seek_origin_current) {\n        if (byteOffset > 0) {\n            if (pMP3->memory.currentReadPos + byteOffset > pMP3->memory.dataSize) {\n                byteOffset = (int)(pMP3->memory.dataSize - pMP3->memory.currentReadPos);  /* Trying to seek too far forward. */\n            }\n        } else {\n            if (pMP3->memory.currentReadPos < (size_t)-byteOffset) {\n                byteOffset = -(int)pMP3->memory.currentReadPos;  /* Trying to seek too far backwards. */\n            }\n        }\n\n        /* This will never underflow thanks to the clamps above. */\n        pMP3->memory.currentReadPos += byteOffset;\n    } else {\n        if ((drmp3_uint32)byteOffset <= pMP3->memory.dataSize) {\n            pMP3->memory.currentReadPos = byteOffset;\n        } else {\n            pMP3->memory.currentReadPos = pMP3->memory.dataSize;  /* Trying to seek too far forward. */\n        }\n    }\n\n    return DRMP3_TRUE;\n}\n\nDRMP3_API drmp3_bool32 drmp3_init_memory(drmp3* pMP3, const void* pData, size_t dataSize, const drmp3_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pMP3 == NULL) {\n        return DRMP3_FALSE;\n    }\n\n    DRMP3_ZERO_OBJECT(pMP3);\n\n    if (pData == NULL || dataSize == 0) {\n        return DRMP3_FALSE;\n    }\n\n    pMP3->memory.pData = (const drmp3_uint8*)pData;\n    pMP3->memory.dataSize = dataSize;\n    pMP3->memory.currentReadPos = 0;\n\n    return drmp3_init_internal(pMP3, drmp3__on_read_memory, drmp3__on_seek_memory, pMP3, pAllocationCallbacks);\n}\n\n\n#ifndef DR_MP3_NO_STDIO\n#include <stdio.h>\n#include <wchar.h>      /* For wcslen(), wcsrtombs() */\n\n/* drmp3_result_from_errno() is only used inside DR_MP3_NO_STDIO for now. Move this out if it's ever used elsewhere. */\n#include <errno.h>\nstatic drmp3_result drmp3_result_from_errno(int e)\n{\n    switch (e)\n    {\n        case 0: return DRMP3_SUCCESS;\n    #ifdef EPERM\n        case EPERM: return DRMP3_INVALID_OPERATION;\n    #endif\n    #ifdef ENOENT\n        case ENOENT: return DRMP3_DOES_NOT_EXIST;\n    #endif\n    #ifdef ESRCH\n        case ESRCH: return DRMP3_DOES_NOT_EXIST;\n    #endif\n    #ifdef EINTR\n        case EINTR: return DRMP3_INTERRUPT;\n    #endif\n    #ifdef EIO\n        case EIO: return DRMP3_IO_ERROR;\n    #endif\n    #ifdef ENXIO\n        case ENXIO: return DRMP3_DOES_NOT_EXIST;\n    #endif\n    #ifdef E2BIG\n        case E2BIG: return DRMP3_INVALID_ARGS;\n    #endif\n    #ifdef ENOEXEC\n        case ENOEXEC: return DRMP3_INVALID_FILE;\n    #endif\n    #ifdef EBADF\n        case EBADF: return DRMP3_INVALID_FILE;\n    #endif\n    #ifdef ECHILD\n        case ECHILD: return DRMP3_ERROR;\n    #endif\n    #ifdef EAGAIN\n        case EAGAIN: return DRMP3_UNAVAILABLE;\n    #endif\n    #ifdef ENOMEM\n        case ENOMEM: return DRMP3_OUT_OF_MEMORY;\n    #endif\n    #ifdef EACCES\n        case EACCES: return DRMP3_ACCESS_DENIED;\n    #endif\n    #ifdef EFAULT\n        case EFAULT: return DRMP3_BAD_ADDRESS;\n    #endif\n    #ifdef ENOTBLK\n        case ENOTBLK: return DRMP3_ERROR;\n    #endif\n    #ifdef EBUSY\n        case EBUSY: return DRMP3_BUSY;\n    #endif\n    #ifdef EEXIST\n        case EEXIST: return DRMP3_ALREADY_EXISTS;\n    #endif\n    #ifdef EXDEV\n        case EXDEV: return DRMP3_ERROR;\n    #endif\n    #ifdef ENODEV\n        case ENODEV: return DRMP3_DOES_NOT_EXIST;\n    #endif\n    #ifdef ENOTDIR\n        case ENOTDIR: return DRMP3_NOT_DIRECTORY;\n    #endif\n    #ifdef EISDIR\n        case EISDIR: return DRMP3_IS_DIRECTORY;\n    #endif\n    #ifdef EINVAL\n        case EINVAL: return DRMP3_INVALID_ARGS;\n    #endif\n    #ifdef ENFILE\n        case ENFILE: return DRMP3_TOO_MANY_OPEN_FILES;\n    #endif\n    #ifdef EMFILE\n        case EMFILE: return DRMP3_TOO_MANY_OPEN_FILES;\n    #endif\n    #ifdef ENOTTY\n        case ENOTTY: return DRMP3_INVALID_OPERATION;\n    #endif\n    #ifdef ETXTBSY\n        case ETXTBSY: return DRMP3_BUSY;\n    #endif\n    #ifdef EFBIG\n        case EFBIG: return DRMP3_TOO_BIG;\n    #endif\n    #ifdef ENOSPC\n        case ENOSPC: return DRMP3_NO_SPACE;\n    #endif\n    #ifdef ESPIPE\n        case ESPIPE: return DRMP3_BAD_SEEK;\n    #endif\n    #ifdef EROFS\n        case EROFS: return DRMP3_ACCESS_DENIED;\n    #endif\n    #ifdef EMLINK\n        case EMLINK: return DRMP3_TOO_MANY_LINKS;\n    #endif\n    #ifdef EPIPE\n        case EPIPE: return DRMP3_BAD_PIPE;\n    #endif\n    #ifdef EDOM\n        case EDOM: return DRMP3_OUT_OF_RANGE;\n    #endif\n    #ifdef ERANGE\n        case ERANGE: return DRMP3_OUT_OF_RANGE;\n    #endif\n    #ifdef EDEADLK\n        case EDEADLK: return DRMP3_DEADLOCK;\n    #endif\n    #ifdef ENAMETOOLONG\n        case ENAMETOOLONG: return DRMP3_PATH_TOO_LONG;\n    #endif\n    #ifdef ENOLCK\n        case ENOLCK: return DRMP3_ERROR;\n    #endif\n    #ifdef ENOSYS\n        case ENOSYS: return DRMP3_NOT_IMPLEMENTED;\n    #endif\n    #ifdef ENOTEMPTY\n        case ENOTEMPTY: return DRMP3_DIRECTORY_NOT_EMPTY;\n    #endif\n    #ifdef ELOOP\n        case ELOOP: return DRMP3_TOO_MANY_LINKS;\n    #endif\n    #ifdef ENOMSG\n        case ENOMSG: return DRMP3_NO_MESSAGE;\n    #endif\n    #ifdef EIDRM\n        case EIDRM: return DRMP3_ERROR;\n    #endif\n    #ifdef ECHRNG\n        case ECHRNG: return DRMP3_ERROR;\n    #endif\n    #ifdef EL2NSYNC\n        case EL2NSYNC: return DRMP3_ERROR;\n    #endif\n    #ifdef EL3HLT\n        case EL3HLT: return DRMP3_ERROR;\n    #endif\n    #ifdef EL3RST\n        case EL3RST: return DRMP3_ERROR;\n    #endif\n    #ifdef ELNRNG\n        case ELNRNG: return DRMP3_OUT_OF_RANGE;\n    #endif\n    #ifdef EUNATCH\n        case EUNATCH: return DRMP3_ERROR;\n    #endif\n    #ifdef ENOCSI\n        case ENOCSI: return DRMP3_ERROR;\n    #endif\n    #ifdef EL2HLT\n        case EL2HLT: return DRMP3_ERROR;\n    #endif\n    #ifdef EBADE\n        case EBADE: return DRMP3_ERROR;\n    #endif\n    #ifdef EBADR\n        case EBADR: return DRMP3_ERROR;\n    #endif\n    #ifdef EXFULL\n        case EXFULL: return DRMP3_ERROR;\n    #endif\n    #ifdef ENOANO\n        case ENOANO: return DRMP3_ERROR;\n    #endif\n    #ifdef EBADRQC\n        case EBADRQC: return DRMP3_ERROR;\n    #endif\n    #ifdef EBADSLT\n        case EBADSLT: return DRMP3_ERROR;\n    #endif\n    #ifdef EBFONT\n        case EBFONT: return DRMP3_INVALID_FILE;\n    #endif\n    #ifdef ENOSTR\n        case ENOSTR: return DRMP3_ERROR;\n    #endif\n    #ifdef ENODATA\n        case ENODATA: return DRMP3_NO_DATA_AVAILABLE;\n    #endif\n    #ifdef ETIME\n        case ETIME: return DRMP3_TIMEOUT;\n    #endif\n    #ifdef ENOSR\n        case ENOSR: return DRMP3_NO_DATA_AVAILABLE;\n    #endif\n    #ifdef ENONET\n        case ENONET: return DRMP3_NO_NETWORK;\n    #endif\n    #ifdef ENOPKG\n        case ENOPKG: return DRMP3_ERROR;\n    #endif\n    #ifdef EREMOTE\n        case EREMOTE: return DRMP3_ERROR;\n    #endif\n    #ifdef ENOLINK\n        case ENOLINK: return DRMP3_ERROR;\n    #endif\n    #ifdef EADV\n        case EADV: return DRMP3_ERROR;\n    #endif\n    #ifdef ESRMNT\n        case ESRMNT: return DRMP3_ERROR;\n    #endif\n    #ifdef ECOMM\n        case ECOMM: return DRMP3_ERROR;\n    #endif\n    #ifdef EPROTO\n        case EPROTO: return DRMP3_ERROR;\n    #endif\n    #ifdef EMULTIHOP\n        case EMULTIHOP: return DRMP3_ERROR;\n    #endif\n    #ifdef EDOTDOT\n        case EDOTDOT: return DRMP3_ERROR;\n    #endif\n    #ifdef EBADMSG\n        case EBADMSG: return DRMP3_BAD_MESSAGE;\n    #endif\n    #ifdef EOVERFLOW\n        case EOVERFLOW: return DRMP3_TOO_BIG;\n    #endif\n    #ifdef ENOTUNIQ\n        case ENOTUNIQ: return DRMP3_NOT_UNIQUE;\n    #endif\n    #ifdef EBADFD\n        case EBADFD: return DRMP3_ERROR;\n    #endif\n    #ifdef EREMCHG\n        case EREMCHG: return DRMP3_ERROR;\n    #endif\n    #ifdef ELIBACC\n        case ELIBACC: return DRMP3_ACCESS_DENIED;\n    #endif\n    #ifdef ELIBBAD\n        case ELIBBAD: return DRMP3_INVALID_FILE;\n    #endif\n    #ifdef ELIBSCN\n        case ELIBSCN: return DRMP3_INVALID_FILE;\n    #endif\n    #ifdef ELIBMAX\n        case ELIBMAX: return DRMP3_ERROR;\n    #endif\n    #ifdef ELIBEXEC\n        case ELIBEXEC: return DRMP3_ERROR;\n    #endif\n    #ifdef EILSEQ\n        case EILSEQ: return DRMP3_INVALID_DATA;\n    #endif\n    #ifdef ERESTART\n        case ERESTART: return DRMP3_ERROR;\n    #endif\n    #ifdef ESTRPIPE\n        case ESTRPIPE: return DRMP3_ERROR;\n    #endif\n    #ifdef EUSERS\n        case EUSERS: return DRMP3_ERROR;\n    #endif\n    #ifdef ENOTSOCK\n        case ENOTSOCK: return DRMP3_NOT_SOCKET;\n    #endif\n    #ifdef EDESTADDRREQ\n        case EDESTADDRREQ: return DRMP3_NO_ADDRESS;\n    #endif\n    #ifdef EMSGSIZE\n        case EMSGSIZE: return DRMP3_TOO_BIG;\n    #endif\n    #ifdef EPROTOTYPE\n        case EPROTOTYPE: return DRMP3_BAD_PROTOCOL;\n    #endif\n    #ifdef ENOPROTOOPT\n        case ENOPROTOOPT: return DRMP3_PROTOCOL_UNAVAILABLE;\n    #endif\n    #ifdef EPROTONOSUPPORT\n        case EPROTONOSUPPORT: return DRMP3_PROTOCOL_NOT_SUPPORTED;\n    #endif\n    #ifdef ESOCKTNOSUPPORT\n        case ESOCKTNOSUPPORT: return DRMP3_SOCKET_NOT_SUPPORTED;\n    #endif\n    #ifdef EOPNOTSUPP\n        case EOPNOTSUPP: return DRMP3_INVALID_OPERATION;\n    #endif\n    #ifdef EPFNOSUPPORT\n        case EPFNOSUPPORT: return DRMP3_PROTOCOL_FAMILY_NOT_SUPPORTED;\n    #endif\n    #ifdef EAFNOSUPPORT\n        case EAFNOSUPPORT: return DRMP3_ADDRESS_FAMILY_NOT_SUPPORTED;\n    #endif\n    #ifdef EADDRINUSE\n        case EADDRINUSE: return DRMP3_ALREADY_IN_USE;\n    #endif\n    #ifdef EADDRNOTAVAIL\n        case EADDRNOTAVAIL: return DRMP3_ERROR;\n    #endif\n    #ifdef ENETDOWN\n        case ENETDOWN: return DRMP3_NO_NETWORK;\n    #endif\n    #ifdef ENETUNREACH\n        case ENETUNREACH: return DRMP3_NO_NETWORK;\n    #endif\n    #ifdef ENETRESET\n        case ENETRESET: return DRMP3_NO_NETWORK;\n    #endif\n    #ifdef ECONNABORTED\n        case ECONNABORTED: return DRMP3_NO_NETWORK;\n    #endif\n    #ifdef ECONNRESET\n        case ECONNRESET: return DRMP3_CONNECTION_RESET;\n    #endif\n    #ifdef ENOBUFS\n        case ENOBUFS: return DRMP3_NO_SPACE;\n    #endif\n    #ifdef EISCONN\n        case EISCONN: return DRMP3_ALREADY_CONNECTED;\n    #endif\n    #ifdef ENOTCONN\n        case ENOTCONN: return DRMP3_NOT_CONNECTED;\n    #endif\n    #ifdef ESHUTDOWN\n        case ESHUTDOWN: return DRMP3_ERROR;\n    #endif\n    #ifdef ETOOMANYREFS\n        case ETOOMANYREFS: return DRMP3_ERROR;\n    #endif\n    #ifdef ETIMEDOUT\n        case ETIMEDOUT: return DRMP3_TIMEOUT;\n    #endif\n    #ifdef ECONNREFUSED\n        case ECONNREFUSED: return DRMP3_CONNECTION_REFUSED;\n    #endif\n    #ifdef EHOSTDOWN\n        case EHOSTDOWN: return DRMP3_NO_HOST;\n    #endif\n    #ifdef EHOSTUNREACH\n        case EHOSTUNREACH: return DRMP3_NO_HOST;\n    #endif\n    #ifdef EALREADY\n        case EALREADY: return DRMP3_IN_PROGRESS;\n    #endif\n    #ifdef EINPROGRESS\n        case EINPROGRESS: return DRMP3_IN_PROGRESS;\n    #endif\n    #ifdef ESTALE\n        case ESTALE: return DRMP3_INVALID_FILE;\n    #endif\n    #ifdef EUCLEAN\n        case EUCLEAN: return DRMP3_ERROR;\n    #endif\n    #ifdef ENOTNAM\n        case ENOTNAM: return DRMP3_ERROR;\n    #endif\n    #ifdef ENAVAIL\n        case ENAVAIL: return DRMP3_ERROR;\n    #endif\n    #ifdef EISNAM\n        case EISNAM: return DRMP3_ERROR;\n    #endif\n    #ifdef EREMOTEIO\n        case EREMOTEIO: return DRMP3_IO_ERROR;\n    #endif\n    #ifdef EDQUOT\n        case EDQUOT: return DRMP3_NO_SPACE;\n    #endif\n    #ifdef ENOMEDIUM\n        case ENOMEDIUM: return DRMP3_DOES_NOT_EXIST;\n    #endif\n    #ifdef EMEDIUMTYPE\n        case EMEDIUMTYPE: return DRMP3_ERROR;\n    #endif\n    #ifdef ECANCELED\n        case ECANCELED: return DRMP3_CANCELLED;\n    #endif\n    #ifdef ENOKEY\n        case ENOKEY: return DRMP3_ERROR;\n    #endif\n    #ifdef EKEYEXPIRED\n        case EKEYEXPIRED: return DRMP3_ERROR;\n    #endif\n    #ifdef EKEYREVOKED\n        case EKEYREVOKED: return DRMP3_ERROR;\n    #endif\n    #ifdef EKEYREJECTED\n        case EKEYREJECTED: return DRMP3_ERROR;\n    #endif\n    #ifdef EOWNERDEAD\n        case EOWNERDEAD: return DRMP3_ERROR;\n    #endif\n    #ifdef ENOTRECOVERABLE\n        case ENOTRECOVERABLE: return DRMP3_ERROR;\n    #endif\n    #ifdef ERFKILL\n        case ERFKILL: return DRMP3_ERROR;\n    #endif\n    #ifdef EHWPOISON\n        case EHWPOISON: return DRMP3_ERROR;\n    #endif\n        default: return DRMP3_ERROR;\n    }\n}\n\nstatic drmp3_result drmp3_fopen(FILE** ppFile, const char* pFilePath, const char* pOpenMode)\n{\n#if defined(_MSC_VER) && _MSC_VER >= 1400\n    errno_t err;\n#endif\n\n    if (ppFile != NULL) {\n        *ppFile = NULL;  /* Safety. */\n    }\n\n    if (pFilePath == NULL || pOpenMode == NULL || ppFile == NULL) {\n        return DRMP3_INVALID_ARGS;\n    }\n\n#if defined(_MSC_VER) && _MSC_VER >= 1400\n    err = fopen_s(ppFile, pFilePath, pOpenMode);\n    if (err != 0) {\n        return drmp3_result_from_errno(err);\n    }\n#else\n#if defined(_WIN32) || defined(__APPLE__)\n    *ppFile = fopen(pFilePath, pOpenMode);\n#else\n    #if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64 && defined(_LARGEFILE64_SOURCE)\n        *ppFile = fopen64(pFilePath, pOpenMode);\n    #else\n        *ppFile = fopen(pFilePath, pOpenMode);\n    #endif\n#endif\n    if (*ppFile == NULL) {\n        drmp3_result result = drmp3_result_from_errno(errno);\n        if (result == DRMP3_SUCCESS) {\n            result = DRMP3_ERROR;   /* Just a safety check to make sure we never ever return success when pFile == NULL. */\n        }\n\n        return result;\n    }\n#endif\n\n    return DRMP3_SUCCESS;\n}\n\n/*\n_wfopen() isn't always available in all compilation environments.\n\n    * Windows only.\n    * MSVC seems to support it universally as far back as VC6 from what I can tell (haven't checked further back).\n    * MinGW-64 (both 32- and 64-bit) seems to support it.\n    * MinGW wraps it in !defined(__STRICT_ANSI__).\n    * OpenWatcom wraps it in !defined(_NO_EXT_KEYS).\n\nThis can be reviewed as compatibility issues arise. The preference is to use _wfopen_s() and _wfopen() as opposed to the wcsrtombs()\nfallback, so if you notice your compiler not detecting this properly I'm happy to look at adding support.\n*/\n#if defined(_WIN32)\n    #if defined(_MSC_VER) || defined(__MINGW64__) || (!defined(__STRICT_ANSI__) && !defined(_NO_EXT_KEYS))\n        #define DRMP3_HAS_WFOPEN\n    #endif\n#endif\n\nstatic drmp3_result drmp3_wfopen(FILE** ppFile, const wchar_t* pFilePath, const wchar_t* pOpenMode, const drmp3_allocation_callbacks* pAllocationCallbacks)\n{\n    if (ppFile != NULL) {\n        *ppFile = NULL;  /* Safety. */\n    }\n\n    if (pFilePath == NULL || pOpenMode == NULL || ppFile == NULL) {\n        return DRMP3_INVALID_ARGS;\n    }\n\n#if defined(DRMP3_HAS_WFOPEN)\n    {\n        /* Use _wfopen() on Windows. */\n    #if defined(_MSC_VER) && _MSC_VER >= 1400\n        errno_t err = _wfopen_s(ppFile, pFilePath, pOpenMode);\n        if (err != 0) {\n            return drmp3_result_from_errno(err);\n        }\n    #else\n        *ppFile = _wfopen(pFilePath, pOpenMode);\n        if (*ppFile == NULL) {\n            return drmp3_result_from_errno(errno);\n        }\n    #endif\n        (void)pAllocationCallbacks;\n    }\n#else\n    /*\n    Use fopen() on anything other than Windows. Requires a conversion. This is annoying because\n\tfopen() is locale specific. The only real way I can think of to do this is with wcsrtombs(). Note\n\tthat wcstombs() is apparently not thread-safe because it uses a static global mbstate_t object for\n    maintaining state. I've checked this with -std=c89 and it works, but if somebody get's a compiler\n\terror I'll look into improving compatibility.\n    */\n\n\t/*\n\tSome compilers don't support wchar_t or wcsrtombs() which we're using below. In this case we just\n\tneed to abort with an error. If you encounter a compiler lacking such support, add it to this list\n\tand submit a bug report and it'll be added to the library upstream.\n\t*/\n\t#if defined(__DJGPP__)\n\t{\n\t\t/* Nothing to do here. This will fall through to the error check below. */\n\t}\n\t#else\n    {\n        mbstate_t mbs;\n        size_t lenMB;\n        const wchar_t* pFilePathTemp = pFilePath;\n        char* pFilePathMB = NULL;\n        char pOpenModeMB[32] = {0};\n\n        /* Get the length first. */\n        DRMP3_ZERO_OBJECT(&mbs);\n        lenMB = wcsrtombs(NULL, &pFilePathTemp, 0, &mbs);\n        if (lenMB == (size_t)-1) {\n            return drmp3_result_from_errno(errno);\n        }\n\n        pFilePathMB = (char*)drmp3__malloc_from_callbacks(lenMB + 1, pAllocationCallbacks);\n        if (pFilePathMB == NULL) {\n            return DRMP3_OUT_OF_MEMORY;\n        }\n\n        pFilePathTemp = pFilePath;\n        DRMP3_ZERO_OBJECT(&mbs);\n        wcsrtombs(pFilePathMB, &pFilePathTemp, lenMB + 1, &mbs);\n\n        /* The open mode should always consist of ASCII characters so we should be able to do a trivial conversion. */\n        {\n            size_t i = 0;\n            for (;;) {\n                if (pOpenMode[i] == 0) {\n                    pOpenModeMB[i] = '\\0';\n                    break;\n                }\n\n                pOpenModeMB[i] = (char)pOpenMode[i];\n                i += 1;\n            }\n        }\n\n        *ppFile = fopen(pFilePathMB, pOpenModeMB);\n\n        drmp3__free_from_callbacks(pFilePathMB, pAllocationCallbacks);\n    }\n\t#endif\n\n    if (*ppFile == NULL) {\n        return DRMP3_ERROR;\n    }\n#endif\n\n    return DRMP3_SUCCESS;\n}\n\n\n\nstatic size_t drmp3__on_read_stdio(void* pUserData, void* pBufferOut, size_t bytesToRead)\n{\n    return fread(pBufferOut, 1, bytesToRead, (FILE*)pUserData);\n}\n\nstatic drmp3_bool32 drmp3__on_seek_stdio(void* pUserData, int offset, drmp3_seek_origin origin)\n{\n    return fseek((FILE*)pUserData, offset, (origin == drmp3_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0;\n}\n\nDRMP3_API drmp3_bool32 drmp3_init_file(drmp3* pMP3, const char* pFilePath, const drmp3_allocation_callbacks* pAllocationCallbacks)\n{\n    drmp3_bool32 result;\n    FILE* pFile;\n\n    if (drmp3_fopen(&pFile, pFilePath, \"rb\") != DRMP3_SUCCESS) {\n        return DRMP3_FALSE;\n    }\n\n    result = drmp3_init(pMP3, drmp3__on_read_stdio, drmp3__on_seek_stdio, (void*)pFile, pAllocationCallbacks);\n    if (result != DRMP3_TRUE) {\n        fclose(pFile);\n        return result;\n    }\n\n    return DRMP3_TRUE;\n}\n\nDRMP3_API drmp3_bool32 drmp3_init_file_w(drmp3* pMP3, const wchar_t* pFilePath, const drmp3_allocation_callbacks* pAllocationCallbacks)\n{\n    drmp3_bool32 result;\n    FILE* pFile;\n\n    if (drmp3_wfopen(&pFile, pFilePath, L\"rb\", pAllocationCallbacks) != DRMP3_SUCCESS) {\n        return DRMP3_FALSE;\n    }\n\n    result = drmp3_init(pMP3, drmp3__on_read_stdio, drmp3__on_seek_stdio, (void*)pFile, pAllocationCallbacks);\n    if (result != DRMP3_TRUE) {\n        fclose(pFile);\n        return result;\n    }\n\n    return DRMP3_TRUE;\n}\n#endif\n\nDRMP3_API void drmp3_uninit(drmp3* pMP3)\n{\n    if (pMP3 == NULL) {\n        return;\n    }\n    \n#ifndef DR_MP3_NO_STDIO\n    if (pMP3->onRead == drmp3__on_read_stdio) {\n        FILE* pFile = (FILE*)pMP3->pUserData;\n        if (pFile != NULL) {\n            fclose(pFile);\n            pMP3->pUserData = NULL; /* Make sure the file handle is cleared to NULL to we don't attempt to close it a second time. */\n        }\n    }\n#endif\n\n    drmp3__free_from_callbacks(pMP3->pData, &pMP3->allocationCallbacks);\n}\n\n#if defined(DR_MP3_FLOAT_OUTPUT)\nstatic void drmp3_f32_to_s16(drmp3_int16* dst, const float* src, drmp3_uint64 sampleCount)\n{\n    drmp3_uint64 i;\n    drmp3_uint64 i4;\n    drmp3_uint64 sampleCount4;\n\n    /* Unrolled. */\n    i = 0;\n    sampleCount4 = sampleCount >> 2;\n    for (i4 = 0; i4 < sampleCount4; i4 += 1) {\n        float x0 = src[i+0];\n        float x1 = src[i+1];\n        float x2 = src[i+2];\n        float x3 = src[i+3];\n\n        x0 = ((x0 < -1) ? -1 : ((x0 > 1) ? 1 : x0));\n        x1 = ((x1 < -1) ? -1 : ((x1 > 1) ? 1 : x1));\n        x2 = ((x2 < -1) ? -1 : ((x2 > 1) ? 1 : x2));\n        x3 = ((x3 < -1) ? -1 : ((x3 > 1) ? 1 : x3));\n\n        x0 = x0 * 32767.0f;\n        x1 = x1 * 32767.0f;\n        x2 = x2 * 32767.0f;\n        x3 = x3 * 32767.0f;\n\n        dst[i+0] = (drmp3_int16)x0;\n        dst[i+1] = (drmp3_int16)x1;\n        dst[i+2] = (drmp3_int16)x2;\n        dst[i+3] = (drmp3_int16)x3;\n\n        i += 4;\n    }\n\n    /* Leftover. */\n    for (; i < sampleCount; i += 1) {\n        float x = src[i];\n        x = ((x < -1) ? -1 : ((x > 1) ? 1 : x));    /* clip */\n        x = x * 32767.0f;                           /* -1..1 to -32767..32767 */\n\n        dst[i] = (drmp3_int16)x;\n    }\n}\n#endif\n\n#if !defined(DR_MP3_FLOAT_OUTPUT)\nstatic void drmp3_s16_to_f32(float* dst, const drmp3_int16* src, drmp3_uint64 sampleCount)\n{\n    drmp3_uint64 i;\n    for (i = 0; i < sampleCount; i += 1) {\n        float x = (float)src[i];\n        x = x * 0.000030517578125f;         /* -32768..32767 to -1..0.999969482421875 */\n        dst[i] = x;\n    }\n}\n#endif\n\n\nstatic drmp3_uint64 drmp3_read_pcm_frames_raw(drmp3* pMP3, drmp3_uint64 framesToRead, void* pBufferOut)\n{\n    drmp3_uint64 totalFramesRead = 0;\n\n    DRMP3_ASSERT(pMP3 != NULL);\n    DRMP3_ASSERT(pMP3->onRead != NULL);\n\n    while (framesToRead > 0) {\n        drmp3_uint32 framesToConsume = (drmp3_uint32)DRMP3_MIN(pMP3->pcmFramesRemainingInMP3Frame, framesToRead);\n        if (pBufferOut != NULL) {\n        #if defined(DR_MP3_FLOAT_OUTPUT)\n            /* f32 */\n            float* pFramesOutF32 = (float*)DRMP3_OFFSET_PTR(pBufferOut,          sizeof(float) * totalFramesRead                   * pMP3->channels);\n            float* pFramesInF32  = (float*)DRMP3_OFFSET_PTR(&pMP3->pcmFrames[0], sizeof(float) * pMP3->pcmFramesConsumedInMP3Frame * pMP3->mp3FrameChannels);\n            DRMP3_COPY_MEMORY(pFramesOutF32, pFramesInF32, sizeof(float) * framesToConsume * pMP3->channels);\n        #else\n            /* s16 */\n            drmp3_int16* pFramesOutS16 = (drmp3_int16*)DRMP3_OFFSET_PTR(pBufferOut,          sizeof(drmp3_int16) * totalFramesRead                   * pMP3->channels);\n            drmp3_int16* pFramesInS16  = (drmp3_int16*)DRMP3_OFFSET_PTR(&pMP3->pcmFrames[0], sizeof(drmp3_int16) * pMP3->pcmFramesConsumedInMP3Frame * pMP3->mp3FrameChannels);\n            DRMP3_COPY_MEMORY(pFramesOutS16, pFramesInS16, sizeof(drmp3_int16) * framesToConsume * pMP3->channels);\n        #endif\n        }\n\n        pMP3->currentPCMFrame              += framesToConsume;\n        pMP3->pcmFramesConsumedInMP3Frame  += framesToConsume;\n        pMP3->pcmFramesRemainingInMP3Frame -= framesToConsume;\n        totalFramesRead                    += framesToConsume;\n        framesToRead                       -= framesToConsume;\n\n        if (framesToRead == 0) {\n            break;\n        }\n\n        DRMP3_ASSERT(pMP3->pcmFramesRemainingInMP3Frame == 0);\n\n        /*\n        At this point we have exhausted our in-memory buffer so we need to re-fill. Note that the sample rate may have changed\n        at this point which means we'll also need to update our sample rate conversion pipeline.\n        */\n        if (drmp3_decode_next_frame(pMP3) == 0) {\n            break;\n        }\n    }\n\n    return totalFramesRead;\n}\n\n\nDRMP3_API drmp3_uint64 drmp3_read_pcm_frames_f32(drmp3* pMP3, drmp3_uint64 framesToRead, float* pBufferOut)\n{\n    if (pMP3 == NULL || pMP3->onRead == NULL) {\n        return 0;\n    }\n\n#if defined(DR_MP3_FLOAT_OUTPUT)\n    /* Fast path. No conversion required. */\n    return drmp3_read_pcm_frames_raw(pMP3, framesToRead, pBufferOut);\n#else\n    /* Slow path. Convert from s16 to f32. */\n    {\n        drmp3_int16 pTempS16[8192];\n        drmp3_uint64 totalPCMFramesRead = 0;\n\n        while (totalPCMFramesRead < framesToRead) {\n            drmp3_uint64 framesJustRead;\n            drmp3_uint64 framesRemaining = framesToRead - totalPCMFramesRead;\n            drmp3_uint64 framesToReadNow = DRMP3_COUNTOF(pTempS16) / pMP3->channels;\n            if (framesToReadNow > framesRemaining) {\n                framesToReadNow = framesRemaining;\n            }\n\n            framesJustRead = drmp3_read_pcm_frames_raw(pMP3, framesToReadNow, pTempS16);\n            if (framesJustRead == 0) {\n                break;\n            }\n\n            drmp3_s16_to_f32((float*)DRMP3_OFFSET_PTR(pBufferOut, sizeof(float) * totalPCMFramesRead * pMP3->channels), pTempS16, framesJustRead * pMP3->channels);\n            totalPCMFramesRead += framesJustRead;\n        }\n\n        return totalPCMFramesRead;\n    }\n#endif\n}\n\nDRMP3_API drmp3_uint64 drmp3_read_pcm_frames_s16(drmp3* pMP3, drmp3_uint64 framesToRead, drmp3_int16* pBufferOut)\n{\n    if (pMP3 == NULL || pMP3->onRead == NULL) {\n        return 0;\n    }\n\n#if !defined(DR_MP3_FLOAT_OUTPUT)\n    /* Fast path. No conversion required. */\n    return drmp3_read_pcm_frames_raw(pMP3, framesToRead, pBufferOut);\n#else\n    /* Slow path. Convert from f32 to s16. */\n    {\n        float pTempF32[4096];\n        drmp3_uint64 totalPCMFramesRead = 0;\n\n        while (totalPCMFramesRead < framesToRead) {\n            drmp3_uint64 framesJustRead;\n            drmp3_uint64 framesRemaining = framesToRead - totalPCMFramesRead;\n            drmp3_uint64 framesToReadNow = DRMP3_COUNTOF(pTempF32) / pMP3->channels;\n            if (framesToReadNow > framesRemaining) {\n                framesToReadNow = framesRemaining;\n            }\n\n            framesJustRead = drmp3_read_pcm_frames_raw(pMP3, framesToReadNow, pTempF32);\n            if (framesJustRead == 0) {\n                break;\n            }\n\n            drmp3_f32_to_s16((drmp3_int16*)DRMP3_OFFSET_PTR(pBufferOut, sizeof(drmp3_int16) * totalPCMFramesRead * pMP3->channels), pTempF32, framesJustRead * pMP3->channels);\n            totalPCMFramesRead += framesJustRead;\n        }\n\n        return totalPCMFramesRead;\n    }\n#endif\n}\n\nstatic void drmp3_reset(drmp3* pMP3)\n{\n    DRMP3_ASSERT(pMP3 != NULL);\n\n    pMP3->pcmFramesConsumedInMP3Frame = 0;\n    pMP3->pcmFramesRemainingInMP3Frame = 0;\n    pMP3->currentPCMFrame = 0;\n    pMP3->dataSize = 0;\n    pMP3->atEnd = DRMP3_FALSE;\n    drmp3dec_init(&pMP3->decoder);\n}\n\nstatic drmp3_bool32 drmp3_seek_to_start_of_stream(drmp3* pMP3)\n{\n    DRMP3_ASSERT(pMP3 != NULL);\n    DRMP3_ASSERT(pMP3->onSeek != NULL);\n\n    /* Seek to the start of the stream to begin with. */\n    if (!drmp3__on_seek(pMP3, 0, drmp3_seek_origin_start)) {\n        return DRMP3_FALSE;\n    }\n\n    /* Clear any cached data. */\n    drmp3_reset(pMP3);\n    return DRMP3_TRUE;\n}\n\n\nstatic drmp3_bool32 drmp3_seek_forward_by_pcm_frames__brute_force(drmp3* pMP3, drmp3_uint64 frameOffset)\n{\n    drmp3_uint64 framesRead;\n\n    /*\n    Just using a dumb read-and-discard for now. What would be nice is to parse only the header of the MP3 frame, and then skip over leading\n    frames without spending the time doing a full decode. I cannot see an easy way to do this in minimp3, however, so it may involve some\n    kind of manual processing.\n    */\n#if defined(DR_MP3_FLOAT_OUTPUT)\n    framesRead = drmp3_read_pcm_frames_f32(pMP3, frameOffset, NULL);\n#else\n    framesRead = drmp3_read_pcm_frames_s16(pMP3, frameOffset, NULL);\n#endif\n    if (framesRead != frameOffset) {\n        return DRMP3_FALSE;\n    }\n\n    return DRMP3_TRUE;\n}\n\nstatic drmp3_bool32 drmp3_seek_to_pcm_frame__brute_force(drmp3* pMP3, drmp3_uint64 frameIndex)\n{\n    DRMP3_ASSERT(pMP3 != NULL);\n\n    if (frameIndex == pMP3->currentPCMFrame) {\n        return DRMP3_TRUE;\n    }\n\n    /*\n    If we're moving foward we just read from where we're at. Otherwise we need to move back to the start of\n    the stream and read from the beginning.\n    */\n    if (frameIndex < pMP3->currentPCMFrame) {\n        /* Moving backward. Move to the start of the stream and then move forward. */\n        if (!drmp3_seek_to_start_of_stream(pMP3)) {\n            return DRMP3_FALSE;\n        }\n    }\n\n    DRMP3_ASSERT(frameIndex >= pMP3->currentPCMFrame);\n    return drmp3_seek_forward_by_pcm_frames__brute_force(pMP3, (frameIndex - pMP3->currentPCMFrame));\n}\n\nstatic drmp3_bool32 drmp3_find_closest_seek_point(drmp3* pMP3, drmp3_uint64 frameIndex, drmp3_uint32* pSeekPointIndex)\n{\n    drmp3_uint32 iSeekPoint;\n\n    DRMP3_ASSERT(pSeekPointIndex != NULL);\n\n    *pSeekPointIndex = 0;\n\n    if (frameIndex < pMP3->pSeekPoints[0].pcmFrameIndex) {\n        return DRMP3_FALSE;\n    }\n\n    /* Linear search for simplicity to begin with while I'm getting this thing working. Once it's all working change this to a binary search. */\n    for (iSeekPoint = 0; iSeekPoint < pMP3->seekPointCount; ++iSeekPoint) {\n        if (pMP3->pSeekPoints[iSeekPoint].pcmFrameIndex > frameIndex) {\n            break;  /* Found it. */\n        }\n\n        *pSeekPointIndex = iSeekPoint;\n    }\n\n    return DRMP3_TRUE;\n}\n\nstatic drmp3_bool32 drmp3_seek_to_pcm_frame__seek_table(drmp3* pMP3, drmp3_uint64 frameIndex)\n{\n    drmp3_seek_point seekPoint;\n    drmp3_uint32 priorSeekPointIndex;\n    drmp3_uint16 iMP3Frame;\n    drmp3_uint64 leftoverFrames;\n\n    DRMP3_ASSERT(pMP3 != NULL);\n    DRMP3_ASSERT(pMP3->pSeekPoints != NULL);\n    DRMP3_ASSERT(pMP3->seekPointCount > 0);\n\n    /* If there is no prior seekpoint it means the target PCM frame comes before the first seek point. Just assume a seekpoint at the start of the file in this case. */\n    if (drmp3_find_closest_seek_point(pMP3, frameIndex, &priorSeekPointIndex)) {\n        seekPoint = pMP3->pSeekPoints[priorSeekPointIndex];\n    } else {\n        seekPoint.seekPosInBytes     = 0;\n        seekPoint.pcmFrameIndex      = 0;\n        seekPoint.mp3FramesToDiscard = 0;\n        seekPoint.pcmFramesToDiscard = 0;\n    }\n\n    /* First thing to do is seek to the first byte of the relevant MP3 frame. */\n    if (!drmp3__on_seek_64(pMP3, seekPoint.seekPosInBytes, drmp3_seek_origin_start)) {\n        return DRMP3_FALSE; /* Failed to seek. */\n    }\n\n    /* Clear any cached data. */\n    drmp3_reset(pMP3);\n\n    /* Whole MP3 frames need to be discarded first. */\n    for (iMP3Frame = 0; iMP3Frame < seekPoint.mp3FramesToDiscard; ++iMP3Frame) {\n        drmp3_uint32 pcmFramesRead;\n        drmp3d_sample_t* pPCMFrames;\n\n        /* Pass in non-null for the last frame because we want to ensure the sample rate converter is preloaded correctly. */\n        pPCMFrames = NULL;\n        if (iMP3Frame == seekPoint.mp3FramesToDiscard-1) {\n            pPCMFrames = (drmp3d_sample_t*)pMP3->pcmFrames;\n        }\n\n        /* We first need to decode the next frame. */\n        pcmFramesRead = drmp3_decode_next_frame_ex(pMP3, pPCMFrames);\n        if (pcmFramesRead == 0) {\n            return DRMP3_FALSE;\n        }\n    }\n\n    /* We seeked to an MP3 frame in the raw stream so we need to make sure the current PCM frame is set correctly. */\n    pMP3->currentPCMFrame = seekPoint.pcmFrameIndex - seekPoint.pcmFramesToDiscard;\n\n    /*\n    Now at this point we can follow the same process as the brute force technique where we just skip over unnecessary MP3 frames and then\n    read-and-discard at least 2 whole MP3 frames.\n    */\n    leftoverFrames = frameIndex - pMP3->currentPCMFrame;\n    return drmp3_seek_forward_by_pcm_frames__brute_force(pMP3, leftoverFrames);\n}\n\nDRMP3_API drmp3_bool32 drmp3_seek_to_pcm_frame(drmp3* pMP3, drmp3_uint64 frameIndex)\n{\n    if (pMP3 == NULL || pMP3->onSeek == NULL) {\n        return DRMP3_FALSE;\n    }\n\n    if (frameIndex == 0) {\n        return drmp3_seek_to_start_of_stream(pMP3);\n    }\n\n    /* Use the seek table if we have one. */\n    if (pMP3->pSeekPoints != NULL && pMP3->seekPointCount > 0) {\n        return drmp3_seek_to_pcm_frame__seek_table(pMP3, frameIndex);\n    } else {\n        return drmp3_seek_to_pcm_frame__brute_force(pMP3, frameIndex);\n    }\n}\n\nDRMP3_API drmp3_bool32 drmp3_get_mp3_and_pcm_frame_count(drmp3* pMP3, drmp3_uint64* pMP3FrameCount, drmp3_uint64* pPCMFrameCount)\n{\n    drmp3_uint64 currentPCMFrame;\n    drmp3_uint64 totalPCMFrameCount;\n    drmp3_uint64 totalMP3FrameCount;\n\n    if (pMP3 == NULL) {\n        return DRMP3_FALSE;\n    }\n\n    /*\n    The way this works is we move back to the start of the stream, iterate over each MP3 frame and calculate the frame count based\n    on our output sample rate, the seek back to the PCM frame we were sitting on before calling this function.\n    */\n\n    /* The stream must support seeking for this to work. */\n    if (pMP3->onSeek == NULL) {\n        return DRMP3_FALSE;\n    }\n\n    /* We'll need to seek back to where we were, so grab the PCM frame we're currently sitting on so we can restore later. */\n    currentPCMFrame = pMP3->currentPCMFrame;\n    \n    if (!drmp3_seek_to_start_of_stream(pMP3)) {\n        return DRMP3_FALSE;\n    }\n\n    totalPCMFrameCount = 0;\n    totalMP3FrameCount = 0;\n\n    for (;;) {\n        drmp3_uint32 pcmFramesInCurrentMP3Frame;\n\n        pcmFramesInCurrentMP3Frame = drmp3_decode_next_frame_ex(pMP3, NULL);\n        if (pcmFramesInCurrentMP3Frame == 0) {\n            break;\n        }\n\n        totalPCMFrameCount += pcmFramesInCurrentMP3Frame;\n        totalMP3FrameCount += 1;\n    }\n\n    /* Finally, we need to seek back to where we were. */\n    if (!drmp3_seek_to_start_of_stream(pMP3)) {\n        return DRMP3_FALSE;\n    }\n\n    if (!drmp3_seek_to_pcm_frame(pMP3, currentPCMFrame)) {\n        return DRMP3_FALSE;\n    }\n\n    if (pMP3FrameCount != NULL) {\n        *pMP3FrameCount = totalMP3FrameCount;\n    }\n    if (pPCMFrameCount != NULL) {\n        *pPCMFrameCount = totalPCMFrameCount;\n    }\n\n    return DRMP3_TRUE;\n}\n\nDRMP3_API drmp3_uint64 drmp3_get_pcm_frame_count(drmp3* pMP3)\n{\n    drmp3_uint64 totalPCMFrameCount;\n    if (!drmp3_get_mp3_and_pcm_frame_count(pMP3, NULL, &totalPCMFrameCount)) {\n        return 0;\n    }\n\n    return totalPCMFrameCount;\n}\n\nDRMP3_API drmp3_uint64 drmp3_get_mp3_frame_count(drmp3* pMP3)\n{\n    drmp3_uint64 totalMP3FrameCount;\n    if (!drmp3_get_mp3_and_pcm_frame_count(pMP3, &totalMP3FrameCount, NULL)) {\n        return 0;\n    }\n\n    return totalMP3FrameCount;\n}\n\nstatic void drmp3__accumulate_running_pcm_frame_count(drmp3* pMP3, drmp3_uint32 pcmFrameCountIn, drmp3_uint64* pRunningPCMFrameCount, float* pRunningPCMFrameCountFractionalPart)\n{\n    float srcRatio;\n    float pcmFrameCountOutF;\n    drmp3_uint32 pcmFrameCountOut;\n\n    srcRatio = (float)pMP3->mp3FrameSampleRate / (float)pMP3->sampleRate;\n    DRMP3_ASSERT(srcRatio > 0);\n\n    pcmFrameCountOutF = *pRunningPCMFrameCountFractionalPart + (pcmFrameCountIn / srcRatio);\n    pcmFrameCountOut  = (drmp3_uint32)pcmFrameCountOutF;\n    *pRunningPCMFrameCountFractionalPart = pcmFrameCountOutF - pcmFrameCountOut;\n    *pRunningPCMFrameCount += pcmFrameCountOut;\n}\n\ntypedef struct\n{\n    drmp3_uint64 bytePos;\n    drmp3_uint64 pcmFrameIndex; /* <-- After sample rate conversion. */\n} drmp3__seeking_mp3_frame_info;\n\nDRMP3_API drmp3_bool32 drmp3_calculate_seek_points(drmp3* pMP3, drmp3_uint32* pSeekPointCount, drmp3_seek_point* pSeekPoints)\n{\n    drmp3_uint32 seekPointCount;\n    drmp3_uint64 currentPCMFrame;\n    drmp3_uint64 totalMP3FrameCount;\n    drmp3_uint64 totalPCMFrameCount;\n\n    if (pMP3 == NULL || pSeekPointCount == NULL || pSeekPoints == NULL) {\n        return DRMP3_FALSE; /* Invalid args. */\n    }\n\n    seekPointCount = *pSeekPointCount;\n    if (seekPointCount == 0) {\n        return DRMP3_FALSE;  /* The client has requested no seek points. Consider this to be invalid arguments since the client has probably not intended this. */\n    }\n\n    /* We'll need to seek back to the current sample after calculating the seekpoints so we need to go ahead and grab the current location at the top. */\n    currentPCMFrame = pMP3->currentPCMFrame;\n    \n    /* We never do more than the total number of MP3 frames and we limit it to 32-bits. */\n    if (!drmp3_get_mp3_and_pcm_frame_count(pMP3, &totalMP3FrameCount, &totalPCMFrameCount)) {\n        return DRMP3_FALSE;\n    }\n\n    /* If there's less than DRMP3_SEEK_LEADING_MP3_FRAMES+1 frames we just report 1 seek point which will be the very start of the stream. */\n    if (totalMP3FrameCount < DRMP3_SEEK_LEADING_MP3_FRAMES+1) {\n        seekPointCount = 1;\n        pSeekPoints[0].seekPosInBytes     = 0;\n        pSeekPoints[0].pcmFrameIndex      = 0;\n        pSeekPoints[0].mp3FramesToDiscard = 0;\n        pSeekPoints[0].pcmFramesToDiscard = 0;\n    } else {\n        drmp3_uint64 pcmFramesBetweenSeekPoints;\n        drmp3__seeking_mp3_frame_info mp3FrameInfo[DRMP3_SEEK_LEADING_MP3_FRAMES+1];\n        drmp3_uint64 runningPCMFrameCount = 0;\n        float runningPCMFrameCountFractionalPart = 0;\n        drmp3_uint64 nextTargetPCMFrame;\n        drmp3_uint32 iMP3Frame;\n        drmp3_uint32 iSeekPoint;\n\n        if (seekPointCount > totalMP3FrameCount-1) {\n            seekPointCount = (drmp3_uint32)totalMP3FrameCount-1;\n        }\n\n        pcmFramesBetweenSeekPoints = totalPCMFrameCount / (seekPointCount+1);\n\n        /*\n        Here is where we actually calculate the seek points. We need to start by moving the start of the stream. We then enumerate over each\n        MP3 frame.\n        */\n        if (!drmp3_seek_to_start_of_stream(pMP3)) {\n            return DRMP3_FALSE;\n        }\n\n        /*\n        We need to cache the byte positions of the previous MP3 frames. As a new MP3 frame is iterated, we cycle the byte positions in this\n        array. The value in the first item in this array is the byte position that will be reported in the next seek point.\n        */\n\n        /* We need to initialize the array of MP3 byte positions for the leading MP3 frames. */\n        for (iMP3Frame = 0; iMP3Frame < DRMP3_SEEK_LEADING_MP3_FRAMES+1; ++iMP3Frame) {\n            drmp3_uint32 pcmFramesInCurrentMP3FrameIn;\n\n            /* The byte position of the next frame will be the stream's cursor position, minus whatever is sitting in the buffer. */\n            DRMP3_ASSERT(pMP3->streamCursor >= pMP3->dataSize);\n            mp3FrameInfo[iMP3Frame].bytePos       = pMP3->streamCursor - pMP3->dataSize;\n            mp3FrameInfo[iMP3Frame].pcmFrameIndex = runningPCMFrameCount;\n\n            /* We need to get information about this frame so we can know how many samples it contained. */\n            pcmFramesInCurrentMP3FrameIn = drmp3_decode_next_frame_ex(pMP3, NULL);\n            if (pcmFramesInCurrentMP3FrameIn == 0) {\n                return DRMP3_FALSE; /* This should never happen. */\n            }\n\n            drmp3__accumulate_running_pcm_frame_count(pMP3, pcmFramesInCurrentMP3FrameIn, &runningPCMFrameCount, &runningPCMFrameCountFractionalPart);\n        }\n\n        /*\n        At this point we will have extracted the byte positions of the leading MP3 frames. We can now start iterating over each seek point and\n        calculate them.\n        */\n        nextTargetPCMFrame = 0;\n        for (iSeekPoint = 0; iSeekPoint < seekPointCount; ++iSeekPoint) {\n            nextTargetPCMFrame += pcmFramesBetweenSeekPoints;\n\n            for (;;) {\n                if (nextTargetPCMFrame < runningPCMFrameCount) {\n                    /* The next seek point is in the current MP3 frame. */\n                    pSeekPoints[iSeekPoint].seekPosInBytes     = mp3FrameInfo[0].bytePos;\n                    pSeekPoints[iSeekPoint].pcmFrameIndex      = nextTargetPCMFrame;\n                    pSeekPoints[iSeekPoint].mp3FramesToDiscard = DRMP3_SEEK_LEADING_MP3_FRAMES;\n                    pSeekPoints[iSeekPoint].pcmFramesToDiscard = (drmp3_uint16)(nextTargetPCMFrame - mp3FrameInfo[DRMP3_SEEK_LEADING_MP3_FRAMES-1].pcmFrameIndex);\n                    break;\n                } else {\n                    size_t i;\n                    drmp3_uint32 pcmFramesInCurrentMP3FrameIn;\n\n                    /*\n                    The next seek point is not in the current MP3 frame, so continue on to the next one. The first thing to do is cycle the cached\n                    MP3 frame info.\n                    */\n                    for (i = 0; i < DRMP3_COUNTOF(mp3FrameInfo)-1; ++i) {\n                        mp3FrameInfo[i] = mp3FrameInfo[i+1];\n                    }\n\n                    /* Cache previous MP3 frame info. */\n                    mp3FrameInfo[DRMP3_COUNTOF(mp3FrameInfo)-1].bytePos       = pMP3->streamCursor - pMP3->dataSize;\n                    mp3FrameInfo[DRMP3_COUNTOF(mp3FrameInfo)-1].pcmFrameIndex = runningPCMFrameCount;\n\n                    /*\n                    Go to the next MP3 frame. This shouldn't ever fail, but just in case it does we just set the seek point and break. If it happens, it\n                    should only ever do it for the last seek point.\n                    */\n                    pcmFramesInCurrentMP3FrameIn = drmp3_decode_next_frame_ex(pMP3, NULL);\n                    if (pcmFramesInCurrentMP3FrameIn == 0) {\n                        pSeekPoints[iSeekPoint].seekPosInBytes     = mp3FrameInfo[0].bytePos;\n                        pSeekPoints[iSeekPoint].pcmFrameIndex      = nextTargetPCMFrame;\n                        pSeekPoints[iSeekPoint].mp3FramesToDiscard = DRMP3_SEEK_LEADING_MP3_FRAMES;\n                        pSeekPoints[iSeekPoint].pcmFramesToDiscard = (drmp3_uint16)(nextTargetPCMFrame - mp3FrameInfo[DRMP3_SEEK_LEADING_MP3_FRAMES-1].pcmFrameIndex);\n                        break;\n                    }\n\n                    drmp3__accumulate_running_pcm_frame_count(pMP3, pcmFramesInCurrentMP3FrameIn, &runningPCMFrameCount, &runningPCMFrameCountFractionalPart);\n                }\n            }\n        }\n\n        /* Finally, we need to seek back to where we were. */\n        if (!drmp3_seek_to_start_of_stream(pMP3)) {\n            return DRMP3_FALSE;\n        }\n        if (!drmp3_seek_to_pcm_frame(pMP3, currentPCMFrame)) {\n            return DRMP3_FALSE;\n        }\n    }\n\n    *pSeekPointCount = seekPointCount;\n    return DRMP3_TRUE;\n}\n\nDRMP3_API drmp3_bool32 drmp3_bind_seek_table(drmp3* pMP3, drmp3_uint32 seekPointCount, drmp3_seek_point* pSeekPoints)\n{\n    if (pMP3 == NULL) {\n        return DRMP3_FALSE;\n    }\n\n    if (seekPointCount == 0 || pSeekPoints == NULL) {\n        /* Unbinding. */\n        pMP3->seekPointCount = 0;\n        pMP3->pSeekPoints = NULL;\n    } else {\n        /* Binding. */\n        pMP3->seekPointCount = seekPointCount;\n        pMP3->pSeekPoints = pSeekPoints;\n    }\n\n    return DRMP3_TRUE;\n}\n\n\nstatic float* drmp3__full_read_and_close_f32(drmp3* pMP3, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount)\n{\n    drmp3_uint64 totalFramesRead = 0;\n    drmp3_uint64 framesCapacity = 0;\n    float* pFrames = NULL;\n    float temp[4096];\n\n    DRMP3_ASSERT(pMP3 != NULL);\n\n    for (;;) {\n        drmp3_uint64 framesToReadRightNow = DRMP3_COUNTOF(temp) / pMP3->channels;\n        drmp3_uint64 framesJustRead = drmp3_read_pcm_frames_f32(pMP3, framesToReadRightNow, temp);\n        if (framesJustRead == 0) {\n            break;\n        }\n\n        /* Reallocate the output buffer if there's not enough room. */\n        if (framesCapacity < totalFramesRead + framesJustRead) {\n            drmp3_uint64 oldFramesBufferSize;\n            drmp3_uint64 newFramesBufferSize;\n            drmp3_uint64 newFramesCap;\n            float* pNewFrames;\n\n            newFramesCap = framesCapacity * 2;\n            if (newFramesCap < totalFramesRead + framesJustRead) {\n                newFramesCap = totalFramesRead + framesJustRead;\n            }\n\n            oldFramesBufferSize = framesCapacity * pMP3->channels * sizeof(float);\n            newFramesBufferSize = newFramesCap   * pMP3->channels * sizeof(float);\n            if (newFramesBufferSize > (drmp3_uint64)DRMP3_SIZE_MAX) {\n                break;\n            }\n\n            pNewFrames = (float*)drmp3__realloc_from_callbacks(pFrames, (size_t)newFramesBufferSize, (size_t)oldFramesBufferSize, &pMP3->allocationCallbacks);\n            if (pNewFrames == NULL) {\n                drmp3__free_from_callbacks(pFrames, &pMP3->allocationCallbacks);\n                break;\n            }\n\n            pFrames = pNewFrames;\n            framesCapacity = newFramesCap;\n        }\n\n        DRMP3_COPY_MEMORY(pFrames + totalFramesRead*pMP3->channels, temp, (size_t)(framesJustRead*pMP3->channels*sizeof(float)));\n        totalFramesRead += framesJustRead;\n\n        /* If the number of frames we asked for is less that what we actually read it means we've reached the end. */\n        if (framesJustRead != framesToReadRightNow) {\n            break;\n        }\n    }\n\n    if (pConfig != NULL) {\n        pConfig->channels   = pMP3->channels;\n        pConfig->sampleRate = pMP3->sampleRate;\n    }\n\n    drmp3_uninit(pMP3);\n\n    if (pTotalFrameCount) {\n        *pTotalFrameCount = totalFramesRead;\n    }\n\n    return pFrames;\n}\n\nstatic drmp3_int16* drmp3__full_read_and_close_s16(drmp3* pMP3, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount)\n{\n    drmp3_uint64 totalFramesRead = 0;\n    drmp3_uint64 framesCapacity = 0;\n    drmp3_int16* pFrames = NULL;\n    drmp3_int16 temp[4096];\n\n    DRMP3_ASSERT(pMP3 != NULL);\n\n    for (;;) {\n        drmp3_uint64 framesToReadRightNow = DRMP3_COUNTOF(temp) / pMP3->channels;\n        drmp3_uint64 framesJustRead = drmp3_read_pcm_frames_s16(pMP3, framesToReadRightNow, temp);\n        if (framesJustRead == 0) {\n            break;\n        }\n\n        /* Reallocate the output buffer if there's not enough room. */\n        if (framesCapacity < totalFramesRead + framesJustRead) {\n            drmp3_uint64 newFramesBufferSize;\n            drmp3_uint64 oldFramesBufferSize;\n            drmp3_uint64 newFramesCap;\n            drmp3_int16* pNewFrames;\n\n            newFramesCap = framesCapacity * 2;\n            if (newFramesCap < totalFramesRead + framesJustRead) {\n                newFramesCap = totalFramesRead + framesJustRead;\n            }\n\n            oldFramesBufferSize = framesCapacity * pMP3->channels * sizeof(drmp3_int16);\n            newFramesBufferSize = newFramesCap   * pMP3->channels * sizeof(drmp3_int16);\n            if (newFramesBufferSize > (drmp3_uint64)DRMP3_SIZE_MAX) {\n                break;\n            }\n\n            pNewFrames = (drmp3_int16*)drmp3__realloc_from_callbacks(pFrames, (size_t)newFramesBufferSize, (size_t)oldFramesBufferSize, &pMP3->allocationCallbacks);\n            if (pNewFrames == NULL) {\n                drmp3__free_from_callbacks(pFrames, &pMP3->allocationCallbacks);\n                break;\n            }\n\n            pFrames = pNewFrames;\n            framesCapacity = newFramesCap;\n        }\n\n        DRMP3_COPY_MEMORY(pFrames + totalFramesRead*pMP3->channels, temp, (size_t)(framesJustRead*pMP3->channels*sizeof(drmp3_int16)));\n        totalFramesRead += framesJustRead;\n\n        /* If the number of frames we asked for is less that what we actually read it means we've reached the end. */\n        if (framesJustRead != framesToReadRightNow) {\n            break;\n        }\n    }\n\n    if (pConfig != NULL) {\n        pConfig->channels   = pMP3->channels;\n        pConfig->sampleRate = pMP3->sampleRate;\n    }\n\n    drmp3_uninit(pMP3);\n\n    if (pTotalFrameCount) {\n        *pTotalFrameCount = totalFramesRead;\n    }\n\n    return pFrames;\n}\n\n\nDRMP3_API float* drmp3_open_and_read_pcm_frames_f32(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks)\n{\n    drmp3 mp3;\n    if (!drmp3_init(&mp3, onRead, onSeek, pUserData, pAllocationCallbacks)) {\n        return NULL;\n    }\n\n    return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount);\n}\n\nDRMP3_API drmp3_int16* drmp3_open_and_read_pcm_frames_s16(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks)\n{\n    drmp3 mp3;\n    if (!drmp3_init(&mp3, onRead, onSeek, pUserData, pAllocationCallbacks)) {\n        return NULL;\n    }\n\n    return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount);\n}\n\n\nDRMP3_API float* drmp3_open_memory_and_read_pcm_frames_f32(const void* pData, size_t dataSize, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks)\n{\n    drmp3 mp3;\n    if (!drmp3_init_memory(&mp3, pData, dataSize, pAllocationCallbacks)) {\n        return NULL;\n    }\n\n    return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount);\n}\n\nDRMP3_API drmp3_int16* drmp3_open_memory_and_read_pcm_frames_s16(const void* pData, size_t dataSize, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks)\n{\n    drmp3 mp3;\n    if (!drmp3_init_memory(&mp3, pData, dataSize, pAllocationCallbacks)) {\n        return NULL;\n    }\n\n    return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount);\n}\n\n\n#ifndef DR_MP3_NO_STDIO\nDRMP3_API float* drmp3_open_file_and_read_pcm_frames_f32(const char* filePath, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks)\n{\n    drmp3 mp3;\n    if (!drmp3_init_file(&mp3, filePath, pAllocationCallbacks)) {\n        return NULL;\n    }\n\n    return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount);\n}\n\nDRMP3_API drmp3_int16* drmp3_open_file_and_read_pcm_frames_s16(const char* filePath, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks)\n{\n    drmp3 mp3;\n    if (!drmp3_init_file(&mp3, filePath, pAllocationCallbacks)) {\n        return NULL;\n    }\n\n    return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount);\n}\n#endif\n\nDRMP3_API void* drmp3_malloc(size_t sz, const drmp3_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pAllocationCallbacks != NULL) {\n        return drmp3__malloc_from_callbacks(sz, pAllocationCallbacks);\n    } else {\n        return drmp3__malloc_default(sz, NULL);\n    }\n}\n\nDRMP3_API void drmp3_free(void* p, const drmp3_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pAllocationCallbacks != NULL) {\n        drmp3__free_from_callbacks(p, pAllocationCallbacks);\n    } else {\n        drmp3__free_default(p, NULL);\n    }\n}\n\n#endif  /* dr_mp3_c */\n#endif  /*DR_MP3_IMPLEMENTATION*/\n\n/*\nDIFFERENCES BETWEEN minimp3 AND dr_mp3\n======================================\n- First, keep in mind that minimp3 (https://github.com/lieff/minimp3) is where all the real work was done. All of the\n  code relating to the actual decoding remains mostly unmodified, apart from some namespacing changes.\n- dr_mp3 adds a pulling style API which allows you to deliver raw data via callbacks. So, rather than pushing data\n  to the decoder, the decoder _pulls_ data from your callbacks.\n- In addition to callbacks, a decoder can be initialized from a block of memory and a file.\n- The dr_mp3 pull API reads PCM frames rather than whole MP3 frames.\n- dr_mp3 adds convenience APIs for opening and decoding entire files in one go.\n- dr_mp3 is fully namespaced, including the implementation section, which is more suitable when compiling projects\n  as a single translation unit (aka unity builds). At the time of writing this, a unity build is not possible when\n  using minimp3 in conjunction with stb_vorbis. dr_mp3 addresses this.\n*/\n\n/*\nRELEASE NOTES - v0.5.0\n=======================\nVersion 0.5.0 has breaking API changes.\n\nImproved Client-Defined Memory Allocation\n-----------------------------------------\nThe main change with this release is the addition of a more flexible way of implementing custom memory allocation routines. The\nexisting system of DRMP3_MALLOC, DRMP3_REALLOC and DRMP3_FREE are still in place and will be used by default when no custom\nallocation callbacks are specified.\n\nTo use the new system, you pass in a pointer to a drmp3_allocation_callbacks object to drmp3_init() and family, like this:\n\n    void* my_malloc(size_t sz, void* pUserData)\n    {\n        return malloc(sz);\n    }\n    void* my_realloc(void* p, size_t sz, void* pUserData)\n    {\n        return realloc(p, sz);\n    }\n    void my_free(void* p, void* pUserData)\n    {\n        free(p);\n    }\n\n    ...\n\n    drmp3_allocation_callbacks allocationCallbacks;\n    allocationCallbacks.pUserData = &myData;\n    allocationCallbacks.onMalloc  = my_malloc;\n    allocationCallbacks.onRealloc = my_realloc;\n    allocationCallbacks.onFree    = my_free;\n    drmp3_init_file(&mp3, \"my_file.mp3\", NULL, &allocationCallbacks);\n\nThe advantage of this new system is that it allows you to specify user data which will be passed in to the allocation routines.\n\nPassing in null for the allocation callbacks object will cause dr_mp3 to use defaults which is the same as DRMP3_MALLOC,\nDRMP3_REALLOC and DRMP3_FREE and the equivalent of how it worked in previous versions.\n\nEvery API that opens a drmp3 object now takes this extra parameter. These include the following:\n\n    drmp3_init()\n    drmp3_init_file()\n    drmp3_init_memory()\n    drmp3_open_and_read_pcm_frames_f32()\n    drmp3_open_and_read_pcm_frames_s16()\n    drmp3_open_memory_and_read_pcm_frames_f32()\n    drmp3_open_memory_and_read_pcm_frames_s16()\n    drmp3_open_file_and_read_pcm_frames_f32()\n    drmp3_open_file_and_read_pcm_frames_s16()\n\nRenamed APIs\n------------\nThe following APIs have been renamed for consistency with other dr_* libraries and to make it clear that they return PCM frame\ncounts rather than sample counts.\n\n    drmp3_open_and_read_f32()        -> drmp3_open_and_read_pcm_frames_f32()\n    drmp3_open_and_read_s16()        -> drmp3_open_and_read_pcm_frames_s16()\n    drmp3_open_memory_and_read_f32() -> drmp3_open_memory_and_read_pcm_frames_f32()\n    drmp3_open_memory_and_read_s16() -> drmp3_open_memory_and_read_pcm_frames_s16()\n    drmp3_open_file_and_read_f32()   -> drmp3_open_file_and_read_pcm_frames_f32()\n    drmp3_open_file_and_read_s16()   -> drmp3_open_file_and_read_pcm_frames_s16()\n*/\n\n/*\nREVISION HISTORY\n================\nv0.6.34 - 2022-09-17\n  - Fix compilation with DJGPP.\n  - Fix compilation when compiling with x86 with no SSE2.\n  - Remove an unnecessary variable from the drmp3 structure.\n\nv0.6.33 - 2022-04-10\n  - Fix compilation error with the MSVC ARM64 build.\n  - Fix compilation error on older versions of GCC.\n  - Remove some unused functions.\n\nv0.6.32 - 2021-12-11\n  - Fix a warning with Clang.\n\nv0.6.31 - 2021-08-22\n  - Fix a bug when loading from memory.\n\nv0.6.30 - 2021-08-16\n  - Silence some warnings.\n  - Replace memory operations with DRMP3_* macros.\n\nv0.6.29 - 2021-08-08\n  - Bring up to date with minimp3.\n\nv0.6.28 - 2021-07-31\n  - Fix platform detection for ARM64.\n  - Fix a compilation error with C89.\n\nv0.6.27 - 2021-02-21\n  - Fix a warning due to referencing _MSC_VER when it is undefined.\n\nv0.6.26 - 2021-01-31\n  - Bring up to date with minimp3.\n\nv0.6.25 - 2020-12-26\n  - Remove DRMP3_DEFAULT_CHANNELS and DRMP3_DEFAULT_SAMPLE_RATE which are leftovers from some removed APIs.\n\nv0.6.24 - 2020-12-07\n  - Fix a typo in version date for 0.6.23.\n\nv0.6.23 - 2020-12-03\n  - Fix an error where a file can be closed twice when initialization of the decoder fails.\n\nv0.6.22 - 2020-12-02\n  - Fix an error where it's possible for a file handle to be left open when initialization of the decoder fails.\n\nv0.6.21 - 2020-11-28\n  - Bring up to date with minimp3.\n\nv0.6.20 - 2020-11-21\n  - Fix compilation with OpenWatcom.\n\nv0.6.19 - 2020-11-13\n  - Minor code clean up.\n\nv0.6.18 - 2020-11-01\n  - Improve compiler support for older versions of GCC.\n\nv0.6.17 - 2020-09-28\n  - Bring up to date with minimp3.\n\nv0.6.16 - 2020-08-02\n  - Simplify sized types.\n\nv0.6.15 - 2020-07-25\n  - Fix a compilation warning.\n\nv0.6.14 - 2020-07-23\n  - Fix undefined behaviour with memmove().\n\nv0.6.13 - 2020-07-06\n  - Fix a bug when converting from s16 to f32 in drmp3_read_pcm_frames_f32().\n\nv0.6.12 - 2020-06-23\n  - Add include guard for the implementation section.\n\nv0.6.11 - 2020-05-26\n  - Fix use of uninitialized variable error.\n\nv0.6.10 - 2020-05-16\n  - Add compile-time and run-time version querying.\n    - DRMP3_VERSION_MINOR\n    - DRMP3_VERSION_MAJOR\n    - DRMP3_VERSION_REVISION\n    - DRMP3_VERSION_STRING\n    - drmp3_version()\n    - drmp3_version_string()\n\nv0.6.9 - 2020-04-30\n  - Change the `pcm` parameter of drmp3dec_decode_frame() to a `const drmp3_uint8*` for consistency with internal APIs.\n\nv0.6.8 - 2020-04-26\n  - Optimizations to decoding when initializing from memory.\n\nv0.6.7 - 2020-04-25\n  - Fix a compilation error with DR_MP3_NO_STDIO\n  - Optimization to decoding by reducing some data movement.\n\nv0.6.6 - 2020-04-23\n  - Fix a minor bug with the running PCM frame counter.\n\nv0.6.5 - 2020-04-19\n  - Fix compilation error on ARM builds.\n\nv0.6.4 - 2020-04-19\n  - Bring up to date with changes to minimp3.\n\nv0.6.3 - 2020-04-13\n  - Fix some pedantic warnings.\n\nv0.6.2 - 2020-04-10\n  - Fix a crash in drmp3_open_*_and_read_pcm_frames_*() if the output config object is NULL.\n\nv0.6.1 - 2020-04-05\n  - Fix warnings.\n\nv0.6.0 - 2020-04-04\n  - API CHANGE: Remove the pConfig parameter from the following APIs:\n    - drmp3_init()\n    - drmp3_init_memory()\n    - drmp3_init_file()\n  - Add drmp3_init_file_w() for opening a file from a wchar_t encoded path.\n\nv0.5.6 - 2020-02-12\n  - Bring up to date with minimp3.\n\nv0.5.5 - 2020-01-29\n  - Fix a memory allocation bug in high level s16 decoding APIs.\n\nv0.5.4 - 2019-12-02\n  - Fix a possible null pointer dereference when using custom memory allocators for realloc().\n\nv0.5.3 - 2019-11-14\n  - Fix typos in documentation.\n\nv0.5.2 - 2019-11-02\n  - Bring up to date with minimp3.\n\nv0.5.1 - 2019-10-08\n  - Fix a warning with GCC.\n\nv0.5.0 - 2019-10-07\n  - API CHANGE: Add support for user defined memory allocation routines. This system allows the program to specify their own memory allocation\n    routines with a user data pointer for client-specific contextual data. This adds an extra parameter to the end of the following APIs:\n    - drmp3_init()\n    - drmp3_init_file()\n    - drmp3_init_memory()\n    - drmp3_open_and_read_pcm_frames_f32()\n    - drmp3_open_and_read_pcm_frames_s16()\n    - drmp3_open_memory_and_read_pcm_frames_f32()\n    - drmp3_open_memory_and_read_pcm_frames_s16()\n    - drmp3_open_file_and_read_pcm_frames_f32()\n    - drmp3_open_file_and_read_pcm_frames_s16()\n  - API CHANGE: Renamed the following APIs:\n    - drmp3_open_and_read_f32()        -> drmp3_open_and_read_pcm_frames_f32()\n    - drmp3_open_and_read_s16()        -> drmp3_open_and_read_pcm_frames_s16()\n    - drmp3_open_memory_and_read_f32() -> drmp3_open_memory_and_read_pcm_frames_f32()\n    - drmp3_open_memory_and_read_s16() -> drmp3_open_memory_and_read_pcm_frames_s16()\n    - drmp3_open_file_and_read_f32()   -> drmp3_open_file_and_read_pcm_frames_f32()\n    - drmp3_open_file_and_read_s16()   -> drmp3_open_file_and_read_pcm_frames_s16()\n\nv0.4.7 - 2019-07-28\n  - Fix a compiler error.\n\nv0.4.6 - 2019-06-14\n  - Fix a compiler error.\n\nv0.4.5 - 2019-06-06\n  - Bring up to date with minimp3.\n\nv0.4.4 - 2019-05-06\n  - Fixes to the VC6 build.\n\nv0.4.3 - 2019-05-05\n  - Use the channel count and/or sample rate of the first MP3 frame instead of DRMP3_DEFAULT_CHANNELS and\n    DRMP3_DEFAULT_SAMPLE_RATE when they are set to 0. To use the old behaviour, just set the relevant property to\n    DRMP3_DEFAULT_CHANNELS or DRMP3_DEFAULT_SAMPLE_RATE.\n  - Add s16 reading APIs\n    - drmp3_read_pcm_frames_s16\n    - drmp3_open_memory_and_read_pcm_frames_s16\n    - drmp3_open_and_read_pcm_frames_s16\n    - drmp3_open_file_and_read_pcm_frames_s16\n  - Add drmp3_get_mp3_and_pcm_frame_count() to the public header section.\n  - Add support for C89.\n  - Change license to choice of public domain or MIT-0.\n\nv0.4.2 - 2019-02-21\n  - Fix a warning.\n\nv0.4.1 - 2018-12-30\n  - Fix a warning.\n\nv0.4.0 - 2018-12-16\n  - API CHANGE: Rename some APIs:\n    - drmp3_read_f32 -> to drmp3_read_pcm_frames_f32\n    - drmp3_seek_to_frame -> drmp3_seek_to_pcm_frame\n    - drmp3_open_and_decode_f32 -> drmp3_open_and_read_pcm_frames_f32\n    - drmp3_open_and_decode_memory_f32 -> drmp3_open_memory_and_read_pcm_frames_f32\n    - drmp3_open_and_decode_file_f32 -> drmp3_open_file_and_read_pcm_frames_f32\n  - Add drmp3_get_pcm_frame_count().\n  - Add drmp3_get_mp3_frame_count().\n  - Improve seeking performance.\n\nv0.3.2 - 2018-09-11\n  - Fix a couple of memory leaks.\n  - Bring up to date with minimp3.\n\nv0.3.1 - 2018-08-25\n  - Fix C++ build.\n\nv0.3.0 - 2018-08-25\n  - Bring up to date with minimp3. This has a minor API change: the \"pcm\" parameter of drmp3dec_decode_frame() has\n    been changed from short* to void* because it can now output both s16 and f32 samples, depending on whether or\n    not the DR_MP3_FLOAT_OUTPUT option is set.\n\nv0.2.11 - 2018-08-08\n  - Fix a bug where the last part of a file is not read.\n\nv0.2.10 - 2018-08-07\n  - Improve 64-bit detection.\n\nv0.2.9 - 2018-08-05\n  - Fix C++ build on older versions of GCC.\n  - Bring up to date with minimp3.\n\nv0.2.8 - 2018-08-02\n  - Fix compilation errors with older versions of GCC.\n\nv0.2.7 - 2018-07-13\n  - Bring up to date with minimp3.\n\nv0.2.6 - 2018-07-12\n  - Bring up to date with minimp3.\n\nv0.2.5 - 2018-06-22\n  - Bring up to date with minimp3.\n\nv0.2.4 - 2018-05-12\n  - Bring up to date with minimp3.\n\nv0.2.3 - 2018-04-29\n  - Fix TCC build.\n\nv0.2.2 - 2018-04-28\n  - Fix bug when opening a decoder from memory.\n\nv0.2.1 - 2018-04-27\n  - Efficiency improvements when the decoder reaches the end of the stream.\n\nv0.2 - 2018-04-21\n  - Bring up to date with minimp3.\n  - Start using major.minor.revision versioning.\n\nv0.1d - 2018-03-30\n  - Bring up to date with minimp3.\n\nv0.1c - 2018-03-11\n  - Fix C++ build error.\n\nv0.1b - 2018-03-07\n  - Bring up to date with minimp3.\n\nv0.1a - 2018-02-28\n  - Fix compilation error on GCC/Clang.\n  - Fix some warnings.\n\nv0.1 - 2018-02-xx\n  - Initial versioned release.\n*/\n\n/*\nThis software is available as a choice of the following licenses. Choose\nwhichever you prefer.\n\n===============================================================================\nALTERNATIVE 1 - Public Domain (www.unlicense.org)\n===============================================================================\nThis is free and unencumbered software released into the public domain.\n\nAnyone is free to copy, modify, publish, use, compile, sell, or distribute this\nsoftware, either in source code form or as a compiled binary, for any purpose,\ncommercial or non-commercial, and by any means.\n\nIn jurisdictions that recognize copyright laws, the author or authors of this\nsoftware dedicate any and all copyright interest in the software to the public\ndomain. We make this dedication for the benefit of the public at large and to\nthe detriment of our heirs and successors. We intend this dedication to be an\novert act of relinquishment in perpetuity of all present and future rights to\nthis software under copyright law.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\nACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nFor more information, please refer to <http://unlicense.org/>\n\n===============================================================================\nALTERNATIVE 2 - MIT No Attribution\n===============================================================================\nCopyright 2020 David Reid\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\n/*\n    https://github.com/lieff/minimp3\n    To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide.\n    This software is distributed without any warranty.\n    See <http://creativecommons.org/publicdomain/zero/1.0/>.\n*/\n"
  },
  {
    "path": "src/libraries/enet/enet.cpp",
    "content": "/**\n *\n * Copyright (C) 2014 by Leaf Corcoran\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n#ifdef _WIN32\n#define NOMINMAX\n#endif\n\n#include <stdlib.h>\n#include <string.h>\n#include <math.h>\n#include <stdint.h>\n\n#include <cstdio>\n#include <cstddef>\n#include <algorithm>\n\nextern \"C\" {\n#define LUA_COMPAT_ALL\n#include \"lua.h\"\n#include \"lualib.h\"\n#include \"lauxlib.h\"\n#include <enet/enet.h>\n}\n\n#define check_host(l, idx)\\\n\t*(ENetHost**)luaL_checkudata(l, idx, \"enet_host\")\n\n#define check_peer(l, idx)\\\n\t*(ENetPeer**)luaL_checkudata(l, idx, \"enet_peer\")\n\n/**\n * Parse address string, eg:\n *\t*:5959\n *\t127.0.0.1:*\n *\twebsite.com:8080\n */\nstatic void parse_address(lua_State *l, const char *addr_str, ENetAddress *address) {\n\tint host_i = 0, port_i = 0;\n\tchar host_str[128] = {0};\n\tchar port_str[32] = {0};\n\tint scanning_port = 0;\n\n\tchar *c = (char *)addr_str;\n\n\twhile (*c != 0) {\n\t\tif (host_i >= 128 || port_i >= 32 ) luaL_error(l, \"Hostname too long\");\n\t\tif (scanning_port) {\n\t\t\tport_str[port_i++] = *c;\n\t\t} else {\n\t\t\tif (*c == ':') {\n\t\t\t\tscanning_port = 1;\n\t\t\t} else {\n\t\t\t\thost_str[host_i++] = *c;\n\t\t\t}\n\t\t}\n\t\tc++;\n\t}\n\thost_str[host_i] = '\\0';\n\tport_str[port_i] = '\\0';\n\n\tif (host_i == 0) luaL_error(l, \"Failed to parse address\");\n\tif (port_i == 0) luaL_error(l, \"Missing port in address\");\n\n\tif (strcmp(\"*\", host_str) == 0) {\n\t\taddress->host = ENET_HOST_ANY;\n\t} else {\n\t\tif (enet_address_set_host(address, host_str) != 0) {\n\t\t\tluaL_error(l, \"Failed to resolve host name\");\n\t\t}\n\t}\n\n\tif (strcmp(\"*\", port_str) == 0) {\n\t\taddress->port = ENET_PORT_ANY;\n\t} else {\n\t\taddress->port = atoi(port_str);\n\t}\n}\n\n/**\n * Find the index of a given peer for which we only have the pointer.\n */\nstatic size_t find_peer_index(lua_State *l, ENetHost *enet_host, ENetPeer *peer) {\n\tsize_t peer_index;\n\tfor (peer_index = 0; peer_index < enet_host->peerCount; peer_index++) {\n\t\tif (peer == &(enet_host->peers[peer_index]))\n\t\t\treturn peer_index;\n\t}\n\n\tluaL_error (l, \"enet: could not find peer id!\");\n\n\treturn peer_index;\n}\n\nstatic bool supports_full_lightuserdata(lua_State *L)\n{\n\tstatic bool checked = false;\n\tstatic bool supported = false;\n\n\tif (sizeof(void*) == 4)\n\t\t// 32-bit platforms always supports full-lightuserdata.\n\t\treturn true;\n\n\tif (!checked)\n\t{\n\t\tlua_pushcclosure(L, [](lua_State* L) -> int\n\t\t{\n\t\t\t// Try to push pointer with all bits set.\n\t\t\tlua_pushlightuserdata(L, (void*)(~((size_t)0)));\n\t\t\treturn 1;\n\t\t}, 0);\n\n\t\tsupported = lua_pcall(L, 0, 1, 0) == 0;\n\t\tchecked = true;\n\n\t\tlua_pop(L, 1);\n\t}\n\n\treturn supported;\n}\n\nstatic uintptr_t compute_peer_key(lua_State *L, ENetPeer *peer)\n{\n\t// ENet peers are be allocated on the heap in an array. Lua numbers\n\t// (doubles) can store all possible integers up to 2^53. We can store\n\t// pointers that use more than 53 bits if their alignment is guaranteed to\n\t// be more than 1. For example an alignment requirement of 8 means we can\n\t// shift the pointer's bits by 3.\n\n\t// Please see these for the reason of this ternary operator:\n\t// * https://github.com/love2d/love/issues/1916\n\t// * https://github.com/love2d/love/commit/4ab9a1ce8c\n\tconst size_t minalign = sizeof(void*) == 8 ? std::min(alignof(ENetPeer), alignof(std::max_align_t)) : 1;\n\tuintptr_t key = (uintptr_t) peer;\n\n\tif ((key & (minalign - 1)) != 0)\n\t{\n\t\tluaL_error(L, \"Cannot push enet peer to Lua: unexpected alignment \"\n\t\t\t\t   \"(pointer is %p but alignment should be %d)\", peer, minalign);\n\t}\n\n\tstatic const size_t shift = (size_t) log2((double) minalign);\n\n\treturn key >> shift;\n}\n\nstatic void push_peer_key(lua_State *L, uintptr_t key)\n{\n\t// If full 64-bit lightuserdata is supported (or it's 32-bit platform),\n\t// always use that. Otherwise, if the key is smaller than 2^53 (which is\n\t// integer precision for double datatype) on 64-bit platform, then push\n\t// number. Otherwise, throw error.\n\tif (supports_full_lightuserdata(L))\n\t\tlua_pushlightuserdata(L, (void*) key);\n#if UINTPTR_MAX == 0xffffffffffffffff\n\telse if (key > 0x20000000000000ULL) // 2^53\n\t\tluaL_error(L, \"Cannot push enet peer to Lua: pointer value %p is too large\", key);\n#endif\n\telse\n\t\tlua_pushnumber(L, (lua_Number) key);\n}\n\nstatic void push_peer(lua_State *l, ENetPeer *peer) {\n\tuintptr_t key = compute_peer_key(l, peer);\n\n\t// try to find in peer table\n\tlua_getfield(l, LUA_REGISTRYINDEX, \"enet_peers\");\n\tpush_peer_key(l, key);\n\tlua_gettable(l, -2);\n\n\tif (lua_isnil(l, -1)) {\n\t\t// printf(\"creating new peer\\n\");\n\t\tlua_pop(l, 1);\n\n\t\t*(ENetPeer**)lua_newuserdata(l, sizeof(void*)) = peer;\n\t\tluaL_getmetatable(l, \"enet_peer\");\n\t\tlua_setmetatable(l, -2);\n\n\t\tpush_peer_key(l, key);\n\t\tlua_pushvalue(l, -2);\n\n\t\tlua_settable(l, -4);\n\t}\n\tlua_remove(l, -2); // remove enet_peers\n}\n\nstatic void push_event(lua_State *l, ENetEvent *event) {\n\tlua_newtable(l); // event table\n\n\tif (event->peer) {\n\t\tpush_peer(l, event->peer);\n\t\tlua_setfield(l, -2, \"peer\");\n\t}\n\n\tswitch (event->type) {\n\t\tcase ENET_EVENT_TYPE_CONNECT:\n\t\t\tlua_pushinteger(l, event->data);\n\t\t\tlua_setfield(l, -2, \"data\");\n\n\t\t\tlua_pushstring(l, \"connect\");\n\t\t\tbreak;\n\t\tcase ENET_EVENT_TYPE_DISCONNECT:\n\t\t\tlua_pushinteger(l, event->data);\n\t\t\tlua_setfield(l, -2, \"data\");\n\n\t\t\tlua_pushstring(l, \"disconnect\");\n\t\t\tbreak;\n\t\tcase ENET_EVENT_TYPE_RECEIVE:\n\t\t\tlua_pushlstring(l, (const char *)event->packet->data, event->packet->dataLength);\n\t\t\tlua_setfield(l, -2, \"data\");\n\n\t\t\tlua_pushinteger(l, event->channelID);\n\t\t\tlua_setfield(l, -2, \"channel\");\n\n\t\t\tlua_pushstring(l, \"receive\");\n\n\t\t\tenet_packet_destroy(event->packet);\n\t\t\tbreak;\n\t\tcase ENET_EVENT_TYPE_NONE:\n\t\t\tlua_pushstring(l, \"none\");\n\t\t\tbreak;\n\t}\n\n\tlua_setfield(l, -2, \"type\");\n}\n\n/**\n * Read a packet off the stack as a string\n * idx is position of string or lightuserdata\n */\nstatic ENetPacket *read_packet(lua_State *l, int idx, enet_uint8 *channel_id) {\n\tsize_t size;\n\tint argc = lua_gettop(l);\n\tconst void* data;\n\n\tif (lua_islightuserdata(l, idx)) {\n\t\tdata = lua_touserdata(l, idx);\n\t\tsize = (size_t) luaL_checknumber(l, idx + 1);\n\t\tidx++;\n\t}\n\telse {\n\t\tdata = luaL_checklstring(l, idx, &size);\n\t}\n\tENetPacket *packet;\n\n\tenet_uint32 flags = ENET_PACKET_FLAG_RELIABLE;\n\t*channel_id = 0;\n\n\tif (argc >= idx+2 && !lua_isnil(l, idx+2)) {\n\t\tconst char *flag_str = luaL_checkstring(l, idx+2);\n\t\tif (strcmp(\"unsequenced\", flag_str) == 0) {\n\t\t\tflags = ENET_PACKET_FLAG_UNSEQUENCED;\n\t\t} else if (strcmp(\"reliable\", flag_str) == 0) {\n\t\t\tflags = ENET_PACKET_FLAG_RELIABLE;\n\t\t} else if (strcmp(\"unreliable\", flag_str) == 0) {\n\t\t\tflags = 0;\n\t\t} else {\n\t\t\tluaL_error(l, \"Unknown packet flag: %s\", flag_str);\n\t\t}\n\t}\n\n\tif (argc >= idx+1 && !lua_isnil(l, idx+1)) {\n\t\t*channel_id = (int) luaL_checknumber(l, idx+1);\n\t}\n\n\tpacket = enet_packet_create(data, size, flags);\n\tif (packet == NULL) {\n\t\tluaL_error(l, \"Failed to create packet\");\n\t}\n\n\treturn packet;\n}\n\n/**\n * Create a new host\n * Args:\n *\taddress (nil for client)\n *\t[peer_count = 64]\n *\t[channel_count = 1]\n *\t[in_bandwidth = 0]\n *\t[out_bandwidth = 0]\n */\nstatic int host_create(lua_State *l) {\n\tENetHost *host;\n\tsize_t peer_count = 64, channel_count = 1;\n\tenet_uint32 in_bandwidth = 0, out_bandwidth = 0;\n\n\tint have_address = 1;\n\tENetAddress address;\n\n\tif (lua_gettop(l) == 0 || lua_isnil(l, 1)) {\n\t\thave_address = 0;\n\t} else {\n\t\tparse_address(l, luaL_checkstring(l, 1), &address);\n\t}\n\n\tswitch (lua_gettop(l)) {\n\t\tcase 5:\n\t\t\tif (!lua_isnil(l, 5)) out_bandwidth = (int) luaL_checknumber(l, 5);\n\t\tcase 4:\n\t\t\tif (!lua_isnil(l, 4)) in_bandwidth = (int) luaL_checknumber(l, 4);\n\t\tcase 3:\n\t\t\tif (!lua_isnil(l, 3)) channel_count = (int) luaL_checknumber(l, 3);\n\t\tcase 2:\n\t\t\tif (!lua_isnil(l, 2)) peer_count = (int) luaL_checknumber(l, 2);\n\t}\n\n\t// printf(\"host create, peers=%d, channels=%d, in=%d, out=%d\\n\",\n\t//\t\tpeer_count, channel_count, in_bandwidth, out_bandwidth);\n\thost = enet_host_create(have_address ? &address : NULL, peer_count,\n\t\t\tchannel_count, in_bandwidth, out_bandwidth);\n\n\tif (host == NULL) {\n\t\tlua_pushnil (l);\n\t\tlua_pushstring(l, \"enet: failed to create host (already listening?)\");\n\t\treturn 2;\n\t}\n\n\t*(ENetHost**)lua_newuserdata(l, sizeof(void*)) = host;\n\tluaL_getmetatable(l, \"enet_host\");\n\tlua_setmetatable(l, -2);\n\n\treturn 1;\n}\n\nstatic int linked_version(lua_State *l) {\n\tlua_pushfstring(l, \"%d.%d.%d\",\n\t\t\tENET_VERSION_GET_MAJOR(enet_linked_version()),\n\t\t\tENET_VERSION_GET_MINOR(enet_linked_version()),\n\t\t\tENET_VERSION_GET_PATCH(enet_linked_version()));\n\treturn 1;\n}\n\n/**\n * Serice a host\n * Args:\n *\ttimeout\n *\n * Return\n *\tnil on no event\n *\tan event table on event\n */\nstatic int host_service(lua_State *l) {\n\tENetHost *host = check_host(l, 1);\n\tif (!host) {\n\t\treturn luaL_error(l, \"Tried to index a nil host!\");\n\t}\n\tENetEvent event;\n\tint timeout = 0, out;\n\n\tif (lua_gettop(l) > 1)\n\t\ttimeout = (int) luaL_checknumber(l, 2);\n\n\tout = enet_host_service(host, &event, timeout);\n\tif (out == 0) return 0;\n\tif (out < 0) return luaL_error(l, \"Error during service\");\n\n\tpush_event(l, &event);\n\treturn 1;\n}\n\n/**\n * Dispatch a single event if available\n */\nstatic int host_check_events(lua_State *l) {\n\tENetHost *host = check_host(l, 1);\n\tif (!host) {\n\t\treturn luaL_error(l, \"Tried to index a nil host!\");\n\t}\n\tENetEvent event;\n\tint out = enet_host_check_events(host, &event);\n\tif (out == 0) return 0;\n\tif (out < 0) return luaL_error(l, \"Error checking event\");\n\n\tpush_event(l, &event);\n\treturn 1;\n}\n\n/**\n * Enables an adaptive order-2 PPM range coder for the transmitted data of\n * all peers.\n */\nstatic int host_compress_with_range_coder(lua_State *l) {\n\tENetHost *host = check_host(l, 1);\n\tif (!host) {\n\t\treturn luaL_error(l, \"Tried to index a nil host!\");\n\t}\n\n\tint result = enet_host_compress_with_range_coder (host);\n\tif (result == 0) {\n\t\tlua_pushboolean (l, 1);\n\t} else {\n\t\tlua_pushboolean (l, 0);\n\t}\n\n\treturn 1;\n}\n\n/**\n * Connect a host to an address\n * Args:\n *\tthe address\n *\t[channel_count = 1]\n *\t[data = 0]\n */\nstatic int host_connect(lua_State *l) {\n\tENetHost *host = check_host(l, 1);\n\tif (!host) {\n\t\treturn luaL_error(l, \"Tried to index a nil host!\");\n\t}\n\tENetAddress address;\n\tENetPeer *peer;\n\n\tenet_uint32 data = 0;\n\tsize_t channel_count = 1;\n\n\tparse_address(l, luaL_checkstring(l, 2), &address);\n\n\tswitch (lua_gettop(l)) {\n\t\tcase 4:\n\t\t\tif (!lua_isnil(l, 4)) data = (int) luaL_checknumber(l, 4);\n\t\tcase 3:\n\t\t\tif (!lua_isnil(l, 3)) channel_count = (int) luaL_checknumber(l, 3);\n\t}\n\n\t// printf(\"host connect, channels=%d, data=%d\\n\", channel_count, data);\n\tpeer = enet_host_connect(host, &address, channel_count, data);\n\n\tif (peer == NULL) {\n\t\treturn luaL_error(l, \"Failed to create peer\");\n\t}\n\n\tpush_peer(l, peer);\n\n\treturn 1;\n}\n\nstatic int host_flush(lua_State *l) {\n\tENetHost *host = check_host(l, 1);\n\tif (!host) {\n\t\treturn luaL_error(l, \"Tried to index a nil host!\");\n\t}\n\tenet_host_flush(host);\n\treturn 0;\n}\n\nstatic int host_broadcast(lua_State *l) {\n\tENetHost *host = check_host(l, 1);\n\tif (!host) {\n\t\treturn luaL_error(l, \"Tried to index a nil host!\");\n\t}\n\n\tenet_uint8 channel_id;\n\tENetPacket *packet = read_packet(l, 2, &channel_id);\n\tenet_host_broadcast(host, channel_id, packet);\n\treturn 0;\n}\n\n// Args: limit:number\nstatic int host_channel_limit(lua_State *l) {\n\tENetHost *host = check_host(l, 1);\n\tif (!host) {\n\t\treturn luaL_error(l, \"Tried to index a nil host!\");\n\t}\n\tint limit = (int) luaL_checknumber(l, 2);\n\tenet_host_channel_limit(host, limit);\n\treturn 0;\n}\n\nstatic int host_bandwidth_limit(lua_State *l) {\n\tENetHost *host = check_host(l, 1);\n\tif (!host) {\n\t\treturn luaL_error(l, \"Tried to index a nil host!\");\n\t}\n\tenet_uint32 in_bandwidth = (int) luaL_checknumber(l, 2);\n\tenet_uint32 out_bandwidth = (int) luaL_checknumber(l, 2);\n\tenet_host_bandwidth_limit(host, in_bandwidth, out_bandwidth);\n\treturn 0;\n}\n\nstatic int host_get_socket_address(lua_State *l) {\n\tENetHost *host = check_host(l, 1);\n\tif (!host) {\n\t\treturn luaL_error(l, \"Tried to index a nil host!\");\n\t}\n\tENetAddress address;\n\tenet_socket_get_address (host->socket, &address);\n\n\tlua_pushfstring(l, \"%d.%d.%d.%d:%d\",\n\t\t\t((address.host) & 0xFF),\n\t\t\t((address.host >> 8) & 0xFF),\n\t\t\t((address.host >> 16) & 0xFF),\n\t\t\t(address.host >> 24& 0xFF),\n\t\t\taddress.port);\n\treturn 1;\n}\nstatic int host_total_sent_data(lua_State *l) {\n\tENetHost *host = check_host(l, 1);\n\tif (!host) {\n\t\treturn luaL_error(l, \"Tried to index a nil host!\");\n\t}\n\n\tlua_pushinteger (l, host->totalSentData);\n\n\treturn 1;\n}\n\nstatic int host_total_received_data(lua_State *l) {\n\tENetHost *host = check_host(l, 1);\n\tif (!host) {\n\t\treturn luaL_error(l, \"Tried to index a nil host!\");\n\t}\n\n\tlua_pushinteger (l, host->totalReceivedData);\n\n\treturn 1;\n}\nstatic int host_service_time(lua_State *l) {\n\tENetHost *host = check_host(l, 1);\n\tif (!host) {\n\t\treturn luaL_error(l, \"Tried to index a nil host!\");\n\t}\n\n\tlua_pushinteger (l, host->serviceTime);\n\n\treturn 1;\n}\n\nstatic int host_peer_count(lua_State *l) {\n\tENetHost *host = check_host(l, 1);\n\tif (!host) {\n\t\treturn luaL_error(l, \"Tried to index a nil host!\");\n\t}\n\n\tlua_pushinteger (l, host->peerCount);\n\n\treturn 1;\n}\n\nstatic int host_get_peer(lua_State *l) {\n\tENetHost *host = check_host(l, 1);\n\tif (!host) {\n\t\treturn luaL_error(l, \"Tried to index a nil host!\");\n\t}\n\n\tint peer_index = (int) luaL_checknumber(l, 2) - 1;\n\n\tif (peer_index < 0 || ((size_t) peer_index) >= host->peerCount) {\n\t\tluaL_argerror (l, 2, \"Invalid peer index\");\n\t}\n\n\tENetPeer *peer = &(host->peers[peer_index]);\n\n\tpush_peer (l, peer);\n\treturn 1;\n}\n\nstatic int host_gc(lua_State *l) {\n\t// We have to manually grab the userdata so that we can set it to NULL.\n\tENetHost** host = (ENetHost**)luaL_checkudata(l, 1, \"enet_host\");\n\t// We don't want to crash by destroying a non-existant host.\n\tif (*host) {\n\t\tenet_host_destroy(*host);\n\t}\n\t*host = NULL;\n\treturn 0;\n}\n\nstatic int peer_tostring(lua_State *l) {\n\tENetPeer *peer = check_peer(l, 1);\n\tchar host_str[128];\n\tenet_address_get_host_ip(&peer->address, host_str, 128);\n\n\tlua_pushstring(l, host_str);\n\tlua_pushstring(l, \":\");\n\tlua_pushinteger(l, peer->address.port);\n\tlua_concat(l, 3);\n\treturn 1;\n}\n\nstatic int peer_ping(lua_State *l) {\n\tENetPeer *peer = check_peer(l, 1);\n\tenet_peer_ping(peer);\n\treturn 0;\n}\n\nstatic int peer_throttle_configure(lua_State *l) {\n\tENetPeer *peer = check_peer(l, 1);\n\n\tenet_uint32 interval = (int) luaL_checknumber(l, 2);\n\tenet_uint32 acceleration = (int) luaL_checknumber(l, 3);\n\tenet_uint32 deceleration = (int) luaL_checknumber(l, 4);\n\n\tenet_peer_throttle_configure(peer, interval, acceleration, deceleration);\n\treturn 0;\n}\n\nstatic int peer_round_trip_time(lua_State *l) {\n\tENetPeer *peer = check_peer(l, 1);\n\n\tif (lua_gettop(l) > 1) {\n\t\tenet_uint32 round_trip_time = (int) luaL_checknumber(l, 2);\n\t\tpeer->roundTripTime = round_trip_time;\n\t}\n\n\tlua_pushinteger (l, peer->roundTripTime);\n\n\treturn 1;\n}\n\nstatic int peer_last_round_trip_time(lua_State *l) {\n\tENetPeer *peer = check_peer(l, 1);\n\n\tif (lua_gettop(l) > 1) {\n\t\tenet_uint32 round_trip_time = (int) luaL_checknumber(l, 2);\n\t\tpeer->lastRoundTripTime = round_trip_time;\n\t}\n\tlua_pushinteger (l, peer->lastRoundTripTime);\n\n\treturn 1;\n}\n\nstatic int peer_ping_interval(lua_State *l) {\n\tENetPeer *peer = check_peer(l, 1);\n\n\tif (lua_gettop(l) > 1) {\n\t\tenet_uint32 interval = (int) luaL_checknumber(l, 2);\n\t\tenet_peer_ping_interval (peer, interval);\n\t}\n\n\tlua_pushinteger (l, peer->pingInterval);\n\n\treturn 1;\n}\n\nstatic int peer_timeout(lua_State *l) {\n\tENetPeer *peer = check_peer(l, 1);\n\n\tenet_uint32 timeout_limit = 0;\n\tenet_uint32 timeout_minimum = 0;\n\tenet_uint32 timeout_maximum = 0;\n\n\tswitch (lua_gettop(l)) {\n\t\tcase 4:\n\t\t\tif (!lua_isnil(l, 4)) timeout_maximum = (int) luaL_checknumber(l, 4);\n\t\tcase 3:\n\t\t\tif (!lua_isnil(l, 3)) timeout_minimum = (int) luaL_checknumber(l, 3);\n\t\tcase 2:\n\t\t\tif (!lua_isnil(l, 2)) timeout_limit = (int) luaL_checknumber(l, 2);\n\t}\n\n\tenet_peer_timeout (peer, timeout_limit, timeout_minimum, timeout_maximum);\n\n\tlua_pushinteger (l, peer->timeoutLimit);\n\tlua_pushinteger (l, peer->timeoutMinimum);\n\tlua_pushinteger (l, peer->timeoutMaximum);\n\n\treturn 3;\n}\n\nstatic int peer_disconnect(lua_State *l) {\n\tENetPeer *peer = check_peer(l, 1);\n\n\tenet_uint32 data = lua_gettop(l) > 1 ? (int) luaL_checknumber(l, 2) : 0;\n\tenet_peer_disconnect(peer, data);\n\treturn 0;\n}\n\nstatic int peer_disconnect_now(lua_State *l) {\n\tENetPeer *peer = check_peer(l, 1);\n\n\tenet_uint32 data = lua_gettop(l) > 1 ? (int) luaL_checknumber(l, 2) : 0;\n\tenet_peer_disconnect_now(peer, data);\n\treturn 0;\n}\n\nstatic int peer_disconnect_later(lua_State *l) {\n\tENetPeer *peer = check_peer(l, 1);\n\n\tenet_uint32 data = lua_gettop(l) > 1 ? (int) luaL_checknumber(l, 2) : 0;\n\tenet_peer_disconnect_later(peer, data);\n\treturn 0;\n}\n\nstatic int peer_index(lua_State *l) {\n\tENetPeer *peer = check_peer(l, 1);\n\n\tsize_t peer_index = find_peer_index (l, peer->host, peer);\n\tlua_pushinteger (l, peer_index + 1);\n\n\treturn 1;\n}\n\nstatic int peer_state(lua_State *l) {\n\tENetPeer *peer = check_peer(l, 1);\n\n\tswitch (peer->state) {\n\t\tcase (ENET_PEER_STATE_DISCONNECTED):\n\t\t\tlua_pushstring (l, \"disconnected\");\n\t\t\tbreak;\n\t\tcase (ENET_PEER_STATE_CONNECTING):\n\t\t\tlua_pushstring (l, \"connecting\");\n\t\t\tbreak;\n\t\tcase (ENET_PEER_STATE_ACKNOWLEDGING_CONNECT):\n\t\t\tlua_pushstring (l, \"acknowledging_connect\");\n\t\t\tbreak;\n\t\tcase (ENET_PEER_STATE_CONNECTION_PENDING):\n\t\t\tlua_pushstring (l, \"connection_pending\");\n\t\t\tbreak;\n\t\tcase (ENET_PEER_STATE_CONNECTION_SUCCEEDED):\n\t\t\tlua_pushstring (l, \"connection_succeeded\");\n\t\t\tbreak;\n\t\tcase (ENET_PEER_STATE_CONNECTED):\n\t\t\tlua_pushstring (l, \"connected\");\n\t\t\tbreak;\n\t\tcase (ENET_PEER_STATE_DISCONNECT_LATER):\n\t\t\tlua_pushstring (l, \"disconnect_later\");\n\t\t\tbreak;\n\t\tcase (ENET_PEER_STATE_DISCONNECTING):\n\t\t\tlua_pushstring (l, \"disconnecting\");\n\t\t\tbreak;\n\t\tcase (ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT):\n\t\t\tlua_pushstring (l, \"acknowledging_disconnect\");\n\t\t\tbreak;\n\t\tcase (ENET_PEER_STATE_ZOMBIE):\n\t\t\tlua_pushstring (l, \"zombie\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tlua_pushstring (l, \"unknown\");\n\t}\n\n\treturn 1;\n}\n\nstatic int peer_connect_id(lua_State *l) {\n\tENetPeer *peer = check_peer(l, 1);\n\n\tlua_pushinteger (l, peer->connectID);\n\n\treturn 1;\n}\n\n\nstatic int peer_reset(lua_State *l) {\n\tENetPeer *peer = check_peer(l, 1);\n\tenet_peer_reset(peer);\n\treturn 0;\n}\n\nstatic int peer_receive(lua_State *l) {\n\tENetPeer *peer = check_peer(l, 1);\n\tENetPacket *packet;\n\tenet_uint8 channel_id = 0;\n\n\tif (lua_gettop(l) > 1) {\n\t\tchannel_id = (int) luaL_checknumber(l, 2);\n\t}\n\n\tpacket = enet_peer_receive(peer, &channel_id);\n\tif (packet == NULL) return 0;\n\n\tlua_pushlstring(l, (const char *)packet->data, packet->dataLength);\n\tlua_pushinteger(l, channel_id);\n\n\tenet_packet_destroy(packet);\n\treturn 2;\n}\n\n\n/**\n * Send a lua string to a peer\n * Args:\n *\tpacket data, string\n *\tchannel id\n *\tflags [\"reliable\", nil]\n *\n */\nstatic int peer_send(lua_State *l) {\n\tENetPeer *peer = check_peer(l, 1);\n\n\tenet_uint8 channel_id;\n\tENetPacket *packet = read_packet(l, 2, &channel_id);\n\n\t// printf(\"sending, channel_id=%d\\n\", channel_id);\n\tint ret = enet_peer_send(peer, channel_id, packet);\n\tif (ret < 0) {\n\t\tenet_packet_destroy(packet);\n\t}\n\n\tlua_pushinteger(l, ret);\n\n\treturn 1;\n}\n\nstatic const struct luaL_Reg enet_funcs [] = {\n\t{\"host_create\", host_create},\n\t{\"linked_version\", linked_version},\n\t{NULL, NULL}\n};\n\nstatic const struct luaL_Reg enet_host_funcs [] = {\n\t{\"service\", host_service},\n\t{\"check_events\", host_check_events},\n\t{\"compress_with_range_coder\", host_compress_with_range_coder},\n\t{\"connect\", host_connect},\n\t{\"flush\", host_flush},\n\t{\"broadcast\", host_broadcast},\n\t{\"channel_limit\", host_channel_limit},\n\t{\"bandwidth_limit\", host_bandwidth_limit},\n\t// Since ENetSocket isn't part of enet-lua, we should try to keep\n\t// naming conventions the same as the rest of the lib.\n\t{\"get_socket_address\", host_get_socket_address},\n\t// We need this function to free up our ports when needed!\n\t{\"destroy\", host_gc},\n\n\t// additional convenience functions (mostly accessors)\n\t{\"total_sent_data\", host_total_sent_data},\n\t{\"total_received_data\", host_total_received_data},\n\t{\"service_time\", host_service_time},\n\t{\"peer_count\", host_peer_count},\n\t{\"get_peer\", host_get_peer},\n\t{NULL, NULL}\n};\n\nstatic const struct luaL_Reg enet_peer_funcs [] = {\n\t{\"disconnect\", peer_disconnect},\n\t{\"disconnect_now\", peer_disconnect_now},\n\t{\"disconnect_later\", peer_disconnect_later},\n\t{\"reset\", peer_reset},\n\t{\"ping\", peer_ping},\n\t{\"receive\", peer_receive},\n\t{\"send\", peer_send},\n\t{\"throttle_configure\", peer_throttle_configure},\n\t{\"ping_interval\", peer_ping_interval},\n\t{\"timeout\", peer_timeout},\n\n\t// additional convenience functions to member variables\n\t{\"index\", peer_index},\n\t{\"state\", peer_state},\n\t{\"connect_id\", peer_connect_id},\n\t{\"round_trip_time\", peer_round_trip_time},\n\t{\"last_round_trip_time\", peer_last_round_trip_time},\n\t{NULL, NULL}\n};\n\nextern \"C\" {\n\tvoid luax_register(lua_State *L, const char *name, const luaL_Reg *l);\n}\n\nint luaopen_enet(lua_State *l) {\n\tenet_initialize();\n\tatexit(enet_deinitialize);\n\n\t// create metatables\n\tluaL_newmetatable(l, \"enet_host\");\n\tlua_newtable(l); // index\n\tluax_register(l, NULL, enet_host_funcs);\n\tlua_setfield(l, -2, \"__index\");\n\tlua_pushcfunction(l, host_gc);\n\tlua_setfield(l, -2, \"__gc\");\n\n\tluaL_newmetatable(l, \"enet_peer\");\n\tlua_newtable(l);\n\tluax_register(l, NULL, enet_peer_funcs);\n\tlua_setfield(l, -2, \"__index\");\n\tlua_pushcfunction(l, peer_tostring);\n\tlua_setfield(l, -2, \"__tostring\");\n\n\t// set up peer table\n\tlua_newtable(l);\n\n\tlua_newtable(l); // metatable\n\tlua_pushstring(l, \"v\");\n\tlua_setfield(l, -2, \"__mode\");\n\tlua_setmetatable(l, -2);\n\n\tlua_setfield(l, LUA_REGISTRYINDEX, \"enet_peers\");\n\n\tluax_register(l, nullptr, enet_funcs);\n\n\t// return the enet table created with luaL_register\n\treturn 1;\n}\n"
  },
  {
    "path": "src/libraries/enet/libenet/ChangeLog",
    "content": "* use getaddrinfo and getnameinfo where available\n\nENet 1.3.13 (April 30, 2015):\n\n* miscellaneous bug fixes\n* added premake and cmake support\n* miscellaneous documentation cleanups\n\nENet 1.3.12 (April 24, 2014):\n\n* added maximumPacketSize and maximumWaitingData fields to ENetHost to limit the amount of \ndata waiting to be delivered on a peer (beware that the default maximumPacketSize is\n32MB and should be set higher if desired as should maximumWaitingData)\n\nENet 1.3.11 (December 26, 2013):\n\n* allow an ENetHost to connect to itself\n* fixed possible bug with disconnect notifications during connect attempts\n* fixed some preprocessor definition bugs\n\nENet 1.3.10 (October 23, 2013);\n\n* doubled maximum reliable window size\n* fixed RCVTIMEO/SNDTIMEO socket options and also added NODELAY\n\nENet 1.3.9 (August 19, 2013):\n\n* added duplicatePeers option to ENetHost which can limit the number of peers from duplicate IPs\n* added enet_socket_get_option() and ENET_SOCKOPT_ERROR\n* added enet_host_random_seed() platform stub\n\nENet 1.3.8 (June 2, 2013):\n\n* added enet_linked_version() for checking the linked version \n* added enet_socket_get_address() for querying the local address of a socket\n* silenced some debugging prints unless ENET_DEBUG is defined during compilation\n* handle EINTR in enet_socket_wait() so that enet_host_service() doesn't propagate errors from signals\n* optimized enet_host_bandwidth_throttle() to be less expensive for large numbers of peers\n\nENet 1.3.7 (March 6, 2013):\n\n* added ENET_PACKET_FLAG_SENT to indicate that a packet is being freed because it has been sent\n* added userData field to ENetPacket\n* changed how random seed is generated on Windows to avoid import warnings\n* fixed case where disconnects could be generated with no preceding connect event\n\nENet 1.3.6 (December 11, 2012):\n\n* added support for intercept callback in ENetHost that can be used to process raw packets before ENet\n* added enet_socket_shutdown() for issuing shutdown on a socket\n* fixed enet_socket_connect() to not error on non-blocking connects\n* fixed bug in MTU negotiation during connections\n \nENet 1.3.5 (July 31, 2012):\n\n* fixed bug in unreliable packet fragment queuing\n\nENet 1.3.4 (May 29, 2012):\n\n* added enet_peer_ping_interval() for configuring per-peer ping intervals\n* added enet_peer_timeout() for configuring per-peer timeouts\n* added protocol packet size limits\n\nENet 1.3.3 (June 28, 2011):\n\n* fixed bug with simultaneous disconnects not dispatching events\n\nENet 1.3.2 (May 31, 2011):\n\n* added support for unreliable packet fragmenting via the packet flag\nENET_PACKET_FLAG_UNRELIABLE_FRAGMENT\n* fixed regression in unreliable packet queuing\n* added check against received port to limit some forms of IP-spoofing\n\nENet 1.3.1 (February 10, 2011):\n\n* fixed bug in tracking of reliable data in transit\n* reliable data window size now scales with the throttle\n* fixed bug in fragment length calculation when checksums are used\n\nENet 1.3.0 (June 5, 2010):\n\n* enet_host_create() now requires the channel limit to be specified as\na parameter\n* enet_host_connect() now accepts a data parameter which is supplied \nto the receiving receiving host in the event data field for a connect event\n* added an adaptive order-2 PPM range coder as a built-in compressor option\nwhich can be set with enet_host_compress_with_range_coder()\n* added support for packet compression configurable with a callback\n* improved session number handling to not rely on the packet checksum\nfield, saving 4 bytes per packet unless the checksum option is used\n* removed the dependence on the rand callback for session number handling\n\nCaveats: This version is not protocol compatible with the 1.2 series or \nearlier. The enet_host_connect and enet_host_create API functions require\nsupplying additional parameters.\n\nENet 1.2.5 (June 28, 2011):\n\n* fixed bug with simultaneous disconnects not dispatching events\n\nENet 1.2.4 (May 31, 2011):\n\n* fixed regression in unreliable packet queuing\n* added check against received port to limit some forms of IP-spoofing\n\nENet 1.2.3 (February 10, 2011):\n\n* fixed bug in tracking reliable data in transit\n\nENet 1.2.2 (June 5, 2010):\n\n* checksum functionality is now enabled by setting a checksum callback\ninside ENetHost instead of being a configure script option\n* added totalSentData, totalSentPackets, totalReceivedData, and\ntotalReceivedPackets counters inside ENetHost for getting usage\nstatistics\n* added enet_host_channel_limit() for limiting the maximum number of\nchannels allowed by connected peers\n* now uses dispatch queues for event dispatch rather than potentially\nunscalable array walking\n* added no_memory callback that is called when a malloc attempt fails,\nsuch that if no_memory returns rather than aborts (the default behavior),\nthen the error is propagated to the return value of the API calls\n* now uses packed attribute for protocol structures on platforms with \nstrange alignment rules\n* improved autoconf build system contributed by Nathan Brink allowing \nfor easier building as a shared library\n\nCaveats: If you were using the compile-time option that enabled checksums,\nmake sure to set the checksum callback inside ENetHost to enet_crc32 to\nregain the old behavior. The ENetCallbacks structure has added new fields,\nso make sure to clear the structure to zero before use if \nusing enet_initialize_with_callbacks().\n\nENet 1.2.1 (November 12, 2009):\n\n* fixed bug that could cause disconnect events to be dropped\n* added thin wrapper around select() for portable usage\n* added ENET_SOCKOPT_REUSEADDR socket option\n* factored enet_socket_bind()/enet_socket_listen() out of enet_socket_create()\n* added contributed Code::Blocks build file\n\nENet 1.2 (February 12, 2008):\n\n* fixed bug in VERIFY_CONNECT acknowledgement that could cause connect\nattempts to occasionally timeout\n* fixed acknowledgements to check both the outgoing and sent queues\nwhen removing acknowledged packets\n* fixed accidental bit rot in the MSVC project file\n* revised sequence number overflow handling to address some possible\ndisconnect bugs\n* added enet_host_check_events() for getting only local queued events\n* factored out socket option setting into enet_socket_set_option() so\nthat socket options are now set separately from enet_socket_create()\n\nCaveats: While this release is superficially protocol compatible with 1.1,\ndifferences in the sequence number overflow handling can potentially cause\nrandom disconnects.\n\nENet 1.1 (June 6, 2007):\n\n* optional CRC32 just in case someone needs a stronger checksum than UDP \nprovides (--enable-crc32 configure option)\n* the size of packet headers are half the size they used to be (so less \noverhead when sending small packets)\n* enet_peer_disconnect_later() that waits till all queued outgoing \npackets get sent before issuing an actual disconnect\n* freeCallback field in individual packets for notification of when a \npacket is about to be freed\n* ENET_PACKET_FLAG_NO_ALLOCATE for supplying pre-allocated data to a \npacket (can be used in concert with freeCallback to support some custom \nallocation schemes that the normal memory allocation callbacks would \nnormally not allow)\n* enet_address_get_host_ip() for printing address numbers\n* promoted the enet_socket_*() functions to be part of the API now\n* a few stability/crash fixes\n\n\n"
  },
  {
    "path": "src/libraries/enet/libenet/LICENSE",
    "content": "Copyright (c) 2002-2016 Lee Salzman\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "src/libraries/enet/libenet/README",
    "content": "Please visit the ENet homepage at http://enet.bespin.org for installation\nand usage instructions.\n\nIf you obtained this package from github, the quick description on how to build\nis:\n\n# Generate the build system.\n\nautoreconf -vfi\n\n# Compile and install the library.\n\n./configure && make && make install\n\n\n"
  },
  {
    "path": "src/libraries/enet/libenet/callbacks.c",
    "content": "/** \n @file callbacks.c\n @brief ENet callback functions\n*/\n#define ENET_BUILDING_LIB 1\n#include \"enet/enet.h\"\n\nstatic ENetCallbacks callbacks = { malloc, free, abort };\n\nint\nenet_initialize_with_callbacks (ENetVersion version, const ENetCallbacks * inits)\n{\n   if (version < ENET_VERSION_CREATE (1, 3, 0))\n     return -1;\n\n   if (inits -> malloc != NULL || inits -> free != NULL)\n   {\n      if (inits -> malloc == NULL || inits -> free == NULL)\n        return -1;\n\n      callbacks.malloc = inits -> malloc;\n      callbacks.free = inits -> free;\n   }\n      \n   if (inits -> no_memory != NULL)\n     callbacks.no_memory = inits -> no_memory;\n\n   return enet_initialize ();\n}\n\nENetVersion\nenet_linked_version (void)\n{\n    return ENET_VERSION;\n}\n           \nvoid *\nenet_malloc (size_t size)\n{\n   void * memory = callbacks.malloc (size);\n\n   if (memory == NULL)\n     callbacks.no_memory ();\n\n   return memory;\n}\n\nvoid\nenet_free (void * memory)\n{\n   callbacks.free (memory);\n}\n\n"
  },
  {
    "path": "src/libraries/enet/libenet/compress.c",
    "content": "/** \n @file compress.c\n @brief An adaptive order-2 PPM range coder\n*/\n#define ENET_BUILDING_LIB 1\n#include <string.h>\n#include \"enet/enet.h\"\n\ntypedef struct _ENetSymbol\n{\n    /* binary indexed tree of symbols */\n    enet_uint8 value;\n    enet_uint8 count;\n    enet_uint16 under;\n    enet_uint16 left, right;\n\n    /* context defined by this symbol */\n    enet_uint16 symbols;\n    enet_uint16 escapes;\n    enet_uint16 total;\n    enet_uint16 parent; \n} ENetSymbol;\n\n/* adaptation constants tuned aggressively for small packet sizes rather than large file compression */\nenum\n{\n    ENET_RANGE_CODER_TOP    = 1<<24,\n    ENET_RANGE_CODER_BOTTOM = 1<<16,\n\n    ENET_CONTEXT_SYMBOL_DELTA = 3,\n    ENET_CONTEXT_SYMBOL_MINIMUM = 1,\n    ENET_CONTEXT_ESCAPE_MINIMUM = 1,\n\n    ENET_SUBCONTEXT_ORDER = 2,\n    ENET_SUBCONTEXT_SYMBOL_DELTA = 2,\n    ENET_SUBCONTEXT_ESCAPE_DELTA = 5\n};\n\n/* context exclusion roughly halves compression speed, so disable for now */\n#undef ENET_CONTEXT_EXCLUSION\n\ntypedef struct _ENetRangeCoder\n{\n    /* only allocate enough symbols for reasonable MTUs, would need to be larger for large file compression */\n    ENetSymbol symbols[4096];\n} ENetRangeCoder;\n\nvoid *\nenet_range_coder_create (void)\n{\n    ENetRangeCoder * rangeCoder = (ENetRangeCoder *) enet_malloc (sizeof (ENetRangeCoder));\n    if (rangeCoder == NULL)\n      return NULL;\n\n    return rangeCoder;\n}\n\nvoid\nenet_range_coder_destroy (void * context)\n{\n    ENetRangeCoder * rangeCoder = (ENetRangeCoder *) context;\n    if (rangeCoder == NULL)\n      return;\n\n    enet_free (rangeCoder);\n}\n\n#define ENET_SYMBOL_CREATE(symbol, value_, count_) \\\n{ \\\n    symbol = & rangeCoder -> symbols [nextSymbol ++]; \\\n    symbol -> value = value_; \\\n    symbol -> count = count_; \\\n    symbol -> under = count_; \\\n    symbol -> left = 0; \\\n    symbol -> right = 0; \\\n    symbol -> symbols = 0; \\\n    symbol -> escapes = 0; \\\n    symbol -> total = 0; \\\n    symbol -> parent = 0; \\\n}\n\n#define ENET_CONTEXT_CREATE(context, escapes_, minimum) \\\n{ \\\n    ENET_SYMBOL_CREATE (context, 0, 0); \\\n    (context) -> escapes = escapes_; \\\n    (context) -> total = escapes_ + 256*minimum; \\\n    (context) -> symbols = 0; \\\n}\n\nstatic enet_uint16\nenet_symbol_rescale (ENetSymbol * symbol)\n{\n    enet_uint16 total = 0;\n    for (;;)\n    {\n        symbol -> count -= symbol->count >> 1;\n        symbol -> under = symbol -> count;\n        if (symbol -> left)\n          symbol -> under += enet_symbol_rescale (symbol + symbol -> left);\n        total += symbol -> under;\n        if (! symbol -> right) break;\n        symbol += symbol -> right;\n    } \n    return total;\n}\n\n#define ENET_CONTEXT_RESCALE(context, minimum) \\\n{ \\\n    (context) -> total = (context) -> symbols ? enet_symbol_rescale ((context) + (context) -> symbols) : 0; \\\n    (context) -> escapes -= (context) -> escapes >> 1; \\\n    (context) -> total += (context) -> escapes + 256*minimum; \\\n}\n\n#define ENET_RANGE_CODER_OUTPUT(value) \\\n{ \\\n    if (outData >= outEnd) \\\n      return 0; \\\n    * outData ++ = value; \\\n}\n\n#define ENET_RANGE_CODER_ENCODE(under, count, total) \\\n{ \\\n    encodeRange /= (total); \\\n    encodeLow += (under) * encodeRange; \\\n    encodeRange *= (count); \\\n    for (;;) \\\n    { \\\n        if((encodeLow ^ (encodeLow + encodeRange)) >= ENET_RANGE_CODER_TOP) \\\n        { \\\n            if(encodeRange >= ENET_RANGE_CODER_BOTTOM) break; \\\n            encodeRange = -encodeLow & (ENET_RANGE_CODER_BOTTOM - 1); \\\n        } \\\n        ENET_RANGE_CODER_OUTPUT (encodeLow >> 24); \\\n        encodeRange <<= 8; \\\n        encodeLow <<= 8; \\\n    } \\\n}\n\n#define ENET_RANGE_CODER_FLUSH \\\n{ \\\n    while (encodeLow) \\\n    { \\\n        ENET_RANGE_CODER_OUTPUT (encodeLow >> 24); \\\n        encodeLow <<= 8; \\\n    } \\\n}\n\n#define ENET_RANGE_CODER_FREE_SYMBOLS \\\n{ \\\n    if (nextSymbol >= sizeof (rangeCoder -> symbols) / sizeof (ENetSymbol) - ENET_SUBCONTEXT_ORDER ) \\\n    { \\\n        nextSymbol = 0; \\\n        ENET_CONTEXT_CREATE (root, ENET_CONTEXT_ESCAPE_MINIMUM, ENET_CONTEXT_SYMBOL_MINIMUM); \\\n        predicted = 0; \\\n        order = 0; \\\n    } \\\n}\n\n#define ENET_CONTEXT_ENCODE(context, symbol_, value_, under_, count_, update, minimum) \\\n{ \\\n    under_ = value*minimum; \\\n    count_ = minimum; \\\n    if (! (context) -> symbols) \\\n    { \\\n        ENET_SYMBOL_CREATE (symbol_, value_, update); \\\n        (context) -> symbols = symbol_ - (context); \\\n    } \\\n    else \\\n    { \\\n        ENetSymbol * node = (context) + (context) -> symbols; \\\n        for (;;) \\\n        { \\\n            if (value_ < node -> value) \\\n            { \\\n                node -> under += update; \\\n                if (node -> left) { node += node -> left; continue; } \\\n                ENET_SYMBOL_CREATE (symbol_, value_, update); \\\n                node -> left = symbol_ - node; \\\n            } \\\n            else \\\n            if (value_ > node -> value) \\\n            { \\\n                under_ += node -> under; \\\n                if (node -> right) { node += node -> right; continue; } \\\n                ENET_SYMBOL_CREATE (symbol_, value_, update); \\\n                node -> right = symbol_ - node; \\\n            } \\\n            else \\\n            { \\\n                count_ += node -> count; \\\n                under_ += node -> under - node -> count; \\\n                node -> under += update; \\\n                node -> count += update; \\\n                symbol_ = node; \\\n            } \\\n            break; \\\n        } \\\n    } \\\n}\n\n#ifdef ENET_CONTEXT_EXCLUSION\nstatic const ENetSymbol emptyContext = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };\n\n#define ENET_CONTEXT_WALK(context, body) \\\n{ \\\n    const ENetSymbol * node = (context) + (context) -> symbols; \\\n    const ENetSymbol * stack [256]; \\\n    size_t stackSize = 0; \\\n    while (node -> left) \\\n    { \\\n        stack [stackSize ++] = node; \\\n        node += node -> left; \\\n    } \\\n    for (;;) \\\n    { \\\n        body; \\\n        if (node -> right) \\\n        { \\\n            node += node -> right; \\\n            while (node -> left) \\\n            { \\\n                stack [stackSize ++] = node; \\\n                node += node -> left; \\\n            } \\\n        } \\\n        else \\\n        if (stackSize <= 0) \\\n            break; \\\n        else \\\n            node = stack [-- stackSize]; \\\n    } \\\n}\n\n#define ENET_CONTEXT_ENCODE_EXCLUDE(context, value_, under, total, minimum) \\\nENET_CONTEXT_WALK(context, { \\\n    if (node -> value != value_) \\\n    { \\\n        enet_uint16 parentCount = rangeCoder -> symbols [node -> parent].count + minimum; \\\n        if (node -> value < value_) \\\n          under -= parentCount; \\\n        total -= parentCount; \\\n    } \\\n})\n#endif\n\nsize_t\nenet_range_coder_compress (void * context, const ENetBuffer * inBuffers, size_t inBufferCount, size_t inLimit, enet_uint8 * outData, size_t outLimit)\n{\n    ENetRangeCoder * rangeCoder = (ENetRangeCoder *) context;\n    enet_uint8 * outStart = outData, * outEnd = & outData [outLimit];\n    const enet_uint8 * inData, * inEnd;\n    enet_uint32 encodeLow = 0, encodeRange = ~0;\n    ENetSymbol * root;\n    enet_uint16 predicted = 0;\n    size_t order = 0, nextSymbol = 0;\n\n    if (rangeCoder == NULL || inBufferCount <= 0 || inLimit <= 0)\n      return 0;\n\n    inData = (const enet_uint8 *) inBuffers -> data;\n    inEnd = & inData [inBuffers -> dataLength];\n    inBuffers ++;\n    inBufferCount --;\n\n    ENET_CONTEXT_CREATE (root, ENET_CONTEXT_ESCAPE_MINIMUM, ENET_CONTEXT_SYMBOL_MINIMUM);\n\n    for (;;)\n    {\n        ENetSymbol * subcontext, * symbol;\n#ifdef ENET_CONTEXT_EXCLUSION\n        const ENetSymbol * childContext = & emptyContext;\n#endif\n        enet_uint8 value;\n        enet_uint16 count, under, * parent = & predicted, total;\n        if (inData >= inEnd)\n        {\n            if (inBufferCount <= 0)\n              break;\n            inData = (const enet_uint8 *) inBuffers -> data;\n            inEnd = & inData [inBuffers -> dataLength];\n            inBuffers ++;\n            inBufferCount --;\n        }\n        value = * inData ++;\n    \n        for (subcontext = & rangeCoder -> symbols [predicted]; \n             subcontext != root; \n#ifdef ENET_CONTEXT_EXCLUSION\n             childContext = subcontext, \n#endif\n                subcontext = & rangeCoder -> symbols [subcontext -> parent])\n        {\n            ENET_CONTEXT_ENCODE (subcontext, symbol, value, under, count, ENET_SUBCONTEXT_SYMBOL_DELTA, 0);\n            * parent = symbol - rangeCoder -> symbols;\n            parent = & symbol -> parent;\n            total = subcontext -> total;\n#ifdef ENET_CONTEXT_EXCLUSION\n            if (childContext -> total > ENET_SUBCONTEXT_SYMBOL_DELTA + ENET_SUBCONTEXT_ESCAPE_DELTA)\n              ENET_CONTEXT_ENCODE_EXCLUDE (childContext, value, under, total, 0);\n#endif\n            if (count > 0)\n            {\n                ENET_RANGE_CODER_ENCODE (subcontext -> escapes + under, count, total);\n            }\n            else\n            {\n                if (subcontext -> escapes > 0 && subcontext -> escapes < total) \n                    ENET_RANGE_CODER_ENCODE (0, subcontext -> escapes, total); \n                subcontext -> escapes += ENET_SUBCONTEXT_ESCAPE_DELTA;\n                subcontext -> total += ENET_SUBCONTEXT_ESCAPE_DELTA;\n            }\n            subcontext -> total += ENET_SUBCONTEXT_SYMBOL_DELTA;\n            if (count > 0xFF - 2*ENET_SUBCONTEXT_SYMBOL_DELTA || subcontext -> total > ENET_RANGE_CODER_BOTTOM - 0x100)\n              ENET_CONTEXT_RESCALE (subcontext, 0);\n            if (count > 0) goto nextInput;\n        }\n\n        ENET_CONTEXT_ENCODE (root, symbol, value, under, count, ENET_CONTEXT_SYMBOL_DELTA, ENET_CONTEXT_SYMBOL_MINIMUM);\n        * parent = symbol - rangeCoder -> symbols;\n        parent = & symbol -> parent;\n        total = root -> total;\n#ifdef ENET_CONTEXT_EXCLUSION\n        if (childContext -> total > ENET_SUBCONTEXT_SYMBOL_DELTA + ENET_SUBCONTEXT_ESCAPE_DELTA)\n          ENET_CONTEXT_ENCODE_EXCLUDE (childContext, value, under, total, ENET_CONTEXT_SYMBOL_MINIMUM); \n#endif\n        ENET_RANGE_CODER_ENCODE (root -> escapes + under, count, total);\n        root -> total += ENET_CONTEXT_SYMBOL_DELTA; \n        if (count > 0xFF - 2*ENET_CONTEXT_SYMBOL_DELTA + ENET_CONTEXT_SYMBOL_MINIMUM || root -> total > ENET_RANGE_CODER_BOTTOM - 0x100)\n          ENET_CONTEXT_RESCALE (root, ENET_CONTEXT_SYMBOL_MINIMUM);\n\n    nextInput:\n        if (order >= ENET_SUBCONTEXT_ORDER) \n          predicted = rangeCoder -> symbols [predicted].parent;\n        else \n          order ++;\n        ENET_RANGE_CODER_FREE_SYMBOLS;\n    }\n\n    ENET_RANGE_CODER_FLUSH;\n\n    return (size_t) (outData - outStart);\n}\n\n#define ENET_RANGE_CODER_SEED \\\n{ \\\n    if (inData < inEnd) decodeCode |= * inData ++ << 24; \\\n    if (inData < inEnd) decodeCode |= * inData ++ << 16; \\\n    if (inData < inEnd) decodeCode |= * inData ++ << 8; \\\n    if (inData < inEnd) decodeCode |= * inData ++; \\\n}\n\n#define ENET_RANGE_CODER_READ(total) ((decodeCode - decodeLow) / (decodeRange /= (total)))\n\n#define ENET_RANGE_CODER_DECODE(under, count, total) \\\n{ \\\n    decodeLow += (under) * decodeRange; \\\n    decodeRange *= (count); \\\n    for (;;) \\\n    { \\\n        if((decodeLow ^ (decodeLow + decodeRange)) >= ENET_RANGE_CODER_TOP) \\\n        { \\\n            if(decodeRange >= ENET_RANGE_CODER_BOTTOM) break; \\\n            decodeRange = -decodeLow & (ENET_RANGE_CODER_BOTTOM - 1); \\\n        } \\\n        decodeCode <<= 8; \\\n        if (inData < inEnd) \\\n          decodeCode |= * inData ++; \\\n        decodeRange <<= 8; \\\n        decodeLow <<= 8; \\\n    } \\\n}\n\n#define ENET_CONTEXT_DECODE(context, symbol_, code, value_, under_, count_, update, minimum, createRoot, visitNode, createRight, createLeft) \\\n{ \\\n    under_ = 0; \\\n    count_ = minimum; \\\n    if (! (context) -> symbols) \\\n    { \\\n        createRoot; \\\n    } \\\n    else \\\n    { \\\n        ENetSymbol * node = (context) + (context) -> symbols; \\\n        for (;;) \\\n        { \\\n            enet_uint16 after = under_ + node -> under + (node -> value + 1)*minimum, before = node -> count + minimum; \\\n            visitNode; \\\n            if (code >= after) \\\n            { \\\n                under_ += node -> under; \\\n                if (node -> right) { node += node -> right; continue; } \\\n                createRight; \\\n            } \\\n            else \\\n            if (code < after - before) \\\n            { \\\n                node -> under += update; \\\n                if (node -> left) { node += node -> left; continue; } \\\n                createLeft; \\\n            } \\\n            else \\\n            { \\\n                value_ = node -> value; \\\n                count_ += node -> count; \\\n                under_ = after - before; \\\n                node -> under += update; \\\n                node -> count += update; \\\n                symbol_ = node; \\\n            } \\\n            break; \\\n        } \\\n    } \\\n}\n\n#define ENET_CONTEXT_TRY_DECODE(context, symbol_, code, value_, under_, count_, update, minimum, exclude) \\\nENET_CONTEXT_DECODE (context, symbol_, code, value_, under_, count_, update, minimum, return 0, exclude (node -> value, after, before), return 0, return 0)\n\n#define ENET_CONTEXT_ROOT_DECODE(context, symbol_, code, value_, under_, count_, update, minimum, exclude) \\\nENET_CONTEXT_DECODE (context, symbol_, code, value_, under_, count_, update, minimum, \\\n    { \\\n        value_ = code / minimum; \\\n        under_ = code - code%minimum; \\\n        ENET_SYMBOL_CREATE (symbol_, value_, update); \\\n        (context) -> symbols = symbol_ - (context); \\\n    }, \\\n    exclude (node -> value, after, before), \\\n    { \\\n        value_ = node->value + 1 + (code - after)/minimum; \\\n        under_ = code - (code - after)%minimum; \\\n        ENET_SYMBOL_CREATE (symbol_, value_, update); \\\n        node -> right = symbol_ - node; \\\n    }, \\\n    { \\\n        value_ = node->value - 1 - (after - before - code - 1)/minimum; \\\n        under_ = code - (after - before - code - 1)%minimum; \\\n        ENET_SYMBOL_CREATE (symbol_, value_, update); \\\n        node -> left = symbol_ - node; \\\n    }) \\\n\n#ifdef ENET_CONTEXT_EXCLUSION\ntypedef struct _ENetExclude\n{\n    enet_uint8 value;\n    enet_uint16 under;\n} ENetExclude;\n\n#define ENET_CONTEXT_DECODE_EXCLUDE(context, total, minimum) \\\n{ \\\n    enet_uint16 under = 0; \\\n    nextExclude = excludes; \\\n    ENET_CONTEXT_WALK (context, { \\\n        under += rangeCoder -> symbols [node -> parent].count + minimum; \\\n        nextExclude -> value = node -> value; \\\n        nextExclude -> under = under; \\\n        nextExclude ++; \\\n    }); \\\n    total -= under; \\\n}\n\n#define ENET_CONTEXT_EXCLUDED(value_, after, before) \\\n{ \\\n    size_t low = 0, high = nextExclude - excludes; \\\n    for(;;) \\\n    { \\\n        size_t mid = (low + high) >> 1; \\\n        const ENetExclude * exclude = & excludes [mid]; \\\n        if (value_ < exclude -> value) \\\n        { \\\n            if (low + 1 < high) \\\n            { \\\n                high = mid; \\\n                continue; \\\n            } \\\n            if (exclude > excludes) \\\n              after -= exclude [-1].under; \\\n        } \\\n        else \\\n        { \\\n            if (value_ > exclude -> value) \\\n            { \\\n                if (low + 1 < high) \\\n                { \\\n                    low = mid; \\\n                    continue; \\\n                } \\\n            } \\\n            else \\\n              before = 0; \\\n            after -= exclude -> under; \\\n        } \\\n        break; \\\n    } \\\n}\n#endif\n\n#define ENET_CONTEXT_NOT_EXCLUDED(value_, after, before)\n\nsize_t\nenet_range_coder_decompress (void * context, const enet_uint8 * inData, size_t inLimit, enet_uint8 * outData, size_t outLimit)\n{\n    ENetRangeCoder * rangeCoder = (ENetRangeCoder *) context;\n    enet_uint8 * outStart = outData, * outEnd = & outData [outLimit];\n    const enet_uint8 * inEnd = & inData [inLimit];\n    enet_uint32 decodeLow = 0, decodeCode = 0, decodeRange = ~0;\n    ENetSymbol * root;\n    enet_uint16 predicted = 0;\n    size_t order = 0, nextSymbol = 0;\n#ifdef ENET_CONTEXT_EXCLUSION\n    ENetExclude excludes [256];\n    ENetExclude * nextExclude = excludes;\n#endif\n  \n    if (rangeCoder == NULL || inLimit <= 0)\n      return 0;\n\n    ENET_CONTEXT_CREATE (root, ENET_CONTEXT_ESCAPE_MINIMUM, ENET_CONTEXT_SYMBOL_MINIMUM);\n\n    ENET_RANGE_CODER_SEED;\n\n    for (;;)\n    {\n        ENetSymbol * subcontext, * symbol, * patch;\n#ifdef ENET_CONTEXT_EXCLUSION\n        const ENetSymbol * childContext = & emptyContext;\n#endif\n        enet_uint8 value = 0;\n        enet_uint16 code, under, count, bottom, * parent = & predicted, total;\n\n        for (subcontext = & rangeCoder -> symbols [predicted];\n             subcontext != root;\n#ifdef ENET_CONTEXT_EXCLUSION\n             childContext = subcontext, \n#endif\n                subcontext = & rangeCoder -> symbols [subcontext -> parent])\n        {\n            if (subcontext -> escapes <= 0)\n              continue;\n            total = subcontext -> total;\n#ifdef ENET_CONTEXT_EXCLUSION\n            if (childContext -> total > 0) \n              ENET_CONTEXT_DECODE_EXCLUDE (childContext, total, 0); \n#endif\n            if (subcontext -> escapes >= total)\n              continue;\n            code = ENET_RANGE_CODER_READ (total);\n            if (code < subcontext -> escapes) \n            {\n                ENET_RANGE_CODER_DECODE (0, subcontext -> escapes, total); \n                continue;\n            }\n            code -= subcontext -> escapes;\n#ifdef ENET_CONTEXT_EXCLUSION\n            if (childContext -> total > 0)\n            {\n                ENET_CONTEXT_TRY_DECODE (subcontext, symbol, code, value, under, count, ENET_SUBCONTEXT_SYMBOL_DELTA, 0, ENET_CONTEXT_EXCLUDED); \n            }\n            else\n#endif\n            {\n                ENET_CONTEXT_TRY_DECODE (subcontext, symbol, code, value, under, count, ENET_SUBCONTEXT_SYMBOL_DELTA, 0, ENET_CONTEXT_NOT_EXCLUDED); \n            }\n            bottom = symbol - rangeCoder -> symbols;\n            ENET_RANGE_CODER_DECODE (subcontext -> escapes + under, count, total);\n            subcontext -> total += ENET_SUBCONTEXT_SYMBOL_DELTA;\n            if (count > 0xFF - 2*ENET_SUBCONTEXT_SYMBOL_DELTA || subcontext -> total > ENET_RANGE_CODER_BOTTOM - 0x100)\n              ENET_CONTEXT_RESCALE (subcontext, 0);\n            goto patchContexts;\n        }\n\n        total = root -> total;\n#ifdef ENET_CONTEXT_EXCLUSION\n        if (childContext -> total > 0)\n          ENET_CONTEXT_DECODE_EXCLUDE (childContext, total, ENET_CONTEXT_SYMBOL_MINIMUM);  \n#endif\n        code = ENET_RANGE_CODER_READ (total);\n        if (code < root -> escapes)\n        {\n            ENET_RANGE_CODER_DECODE (0, root -> escapes, total);\n            break;\n        }\n        code -= root -> escapes;\n#ifdef ENET_CONTEXT_EXCLUSION\n        if (childContext -> total > 0)\n        {\n            ENET_CONTEXT_ROOT_DECODE (root, symbol, code, value, under, count, ENET_CONTEXT_SYMBOL_DELTA, ENET_CONTEXT_SYMBOL_MINIMUM, ENET_CONTEXT_EXCLUDED); \n        }\n        else\n#endif\n        {\n            ENET_CONTEXT_ROOT_DECODE (root, symbol, code, value, under, count, ENET_CONTEXT_SYMBOL_DELTA, ENET_CONTEXT_SYMBOL_MINIMUM, ENET_CONTEXT_NOT_EXCLUDED); \n        }\n        bottom = symbol - rangeCoder -> symbols;\n        ENET_RANGE_CODER_DECODE (root -> escapes + under, count, total);\n        root -> total += ENET_CONTEXT_SYMBOL_DELTA;\n        if (count > 0xFF - 2*ENET_CONTEXT_SYMBOL_DELTA + ENET_CONTEXT_SYMBOL_MINIMUM || root -> total > ENET_RANGE_CODER_BOTTOM - 0x100)\n          ENET_CONTEXT_RESCALE (root, ENET_CONTEXT_SYMBOL_MINIMUM);\n\n    patchContexts:\n        for (patch = & rangeCoder -> symbols [predicted];\n             patch != subcontext;\n             patch = & rangeCoder -> symbols [patch -> parent])\n        {\n            ENET_CONTEXT_ENCODE (patch, symbol, value, under, count, ENET_SUBCONTEXT_SYMBOL_DELTA, 0);\n            * parent = symbol - rangeCoder -> symbols;\n            parent = & symbol -> parent;\n            if (count <= 0)\n            {\n                patch -> escapes += ENET_SUBCONTEXT_ESCAPE_DELTA;\n                patch -> total += ENET_SUBCONTEXT_ESCAPE_DELTA;\n            }\n            patch -> total += ENET_SUBCONTEXT_SYMBOL_DELTA; \n            if (count > 0xFF - 2*ENET_SUBCONTEXT_SYMBOL_DELTA || patch -> total > ENET_RANGE_CODER_BOTTOM - 0x100)\n              ENET_CONTEXT_RESCALE (patch, 0);\n        }\n        * parent = bottom;\n\n        ENET_RANGE_CODER_OUTPUT (value);\n\n        if (order >= ENET_SUBCONTEXT_ORDER)\n          predicted = rangeCoder -> symbols [predicted].parent;\n        else\n          order ++;\n        ENET_RANGE_CODER_FREE_SYMBOLS;\n    }\n                        \n    return (size_t) (outData - outStart);\n}\n\n/** @defgroup host ENet host functions\n    @{\n*/\n\n/** Sets the packet compressor the host should use to the default range coder.\n    @param host host to enable the range coder for\n    @returns 0 on success, < 0 on failure\n*/\nint\nenet_host_compress_with_range_coder (ENetHost * host)\n{\n    ENetCompressor compressor;\n    memset (& compressor, 0, sizeof (compressor));\n    compressor.context = enet_range_coder_create();\n    if (compressor.context == NULL)\n      return -1;\n    compressor.compress = enet_range_coder_compress;\n    compressor.decompress = enet_range_coder_decompress;\n    compressor.destroy = enet_range_coder_destroy;\n    enet_host_compress (host, & compressor);\n    return 0;\n}\n    \n/** @} */\n    \n     \n"
  },
  {
    "path": "src/libraries/enet/libenet/host.c",
    "content": "/** \n @file host.c\n @brief ENet host management functions\n*/\n#define ENET_BUILDING_LIB 1\n#include <string.h>\n#include \"enet/enet.h\"\n\n/** @defgroup host ENet host functions\n    @{\n*/\n\n/** Creates a host for communicating to peers.  \n\n    @param address   the address at which other peers may connect to this host.  If NULL, then no peers may connect to the host.\n    @param peerCount the maximum number of peers that should be allocated for the host.\n    @param channelLimit the maximum number of channels allowed; if 0, then this is equivalent to ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT\n    @param incomingBandwidth downstream bandwidth of the host in bytes/second; if 0, ENet will assume unlimited bandwidth.\n    @param outgoingBandwidth upstream bandwidth of the host in bytes/second; if 0, ENet will assume unlimited bandwidth.\n\n    @returns the host on success and NULL on failure\n\n    @remarks ENet will strategically drop packets on specific sides of a connection between hosts\n    to ensure the host's bandwidth is not overwhelmed.  The bandwidth parameters also determine\n    the window size of a connection which limits the amount of reliable packets that may be in transit\n    at any given time.\n*/\nENetHost *\nenet_host_create (const ENetAddress * address, size_t peerCount, size_t channelLimit, enet_uint32 incomingBandwidth, enet_uint32 outgoingBandwidth)\n{\n    ENetHost * host;\n    ENetPeer * currentPeer;\n\n    if (peerCount > ENET_PROTOCOL_MAXIMUM_PEER_ID)\n      return NULL;\n\n    host = (ENetHost *) enet_malloc (sizeof (ENetHost));\n    if (host == NULL)\n      return NULL;\n    memset (host, 0, sizeof (ENetHost));\n\n    host -> peers = (ENetPeer *) enet_malloc (peerCount * sizeof (ENetPeer));\n    if (host -> peers == NULL)\n    {\n       enet_free (host);\n\n       return NULL;\n    }\n    memset (host -> peers, 0, peerCount * sizeof (ENetPeer));\n\n    host -> socket = enet_socket_create (ENET_SOCKET_TYPE_DATAGRAM);\n    if (host -> socket == ENET_SOCKET_NULL || (address != NULL && enet_socket_bind (host -> socket, address) < 0))\n    {\n       if (host -> socket != ENET_SOCKET_NULL)\n         enet_socket_destroy (host -> socket);\n\n       enet_free (host -> peers);\n       enet_free (host);\n\n       return NULL;\n    }\n\n    enet_socket_set_option (host -> socket, ENET_SOCKOPT_NONBLOCK, 1);\n    enet_socket_set_option (host -> socket, ENET_SOCKOPT_BROADCAST, 1);\n    enet_socket_set_option (host -> socket, ENET_SOCKOPT_RCVBUF, ENET_HOST_RECEIVE_BUFFER_SIZE);\n    enet_socket_set_option (host -> socket, ENET_SOCKOPT_SNDBUF, ENET_HOST_SEND_BUFFER_SIZE);\n\n    if (address != NULL && enet_socket_get_address (host -> socket, & host -> address) < 0)   \n      host -> address = * address;\n\n    if (! channelLimit || channelLimit > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT)\n      channelLimit = ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT;\n    else\n    if (channelLimit < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT)\n      channelLimit = ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT;\n\n    host -> randomSeed = (enet_uint32) (size_t) host;\n    host -> randomSeed += enet_host_random_seed ();\n    host -> randomSeed = (host -> randomSeed << 16) | (host -> randomSeed >> 16);\n    host -> channelLimit = channelLimit;\n    host -> incomingBandwidth = incomingBandwidth;\n    host -> outgoingBandwidth = outgoingBandwidth;\n    host -> bandwidthThrottleEpoch = 0;\n    host -> recalculateBandwidthLimits = 0;\n    host -> mtu = ENET_HOST_DEFAULT_MTU;\n    host -> peerCount = peerCount;\n    host -> commandCount = 0;\n    host -> bufferCount = 0;\n    host -> checksum = NULL;\n    host -> receivedAddress.host = ENET_HOST_ANY;\n    host -> receivedAddress.port = 0;\n    host -> receivedData = NULL;\n    host -> receivedDataLength = 0;\n     \n    host -> totalSentData = 0;\n    host -> totalSentPackets = 0;\n    host -> totalReceivedData = 0;\n    host -> totalReceivedPackets = 0;\n\n    host -> connectedPeers = 0;\n    host -> bandwidthLimitedPeers = 0;\n    host -> duplicatePeers = ENET_PROTOCOL_MAXIMUM_PEER_ID;\n    host -> maximumPacketSize = ENET_HOST_DEFAULT_MAXIMUM_PACKET_SIZE;\n    host -> maximumWaitingData = ENET_HOST_DEFAULT_MAXIMUM_WAITING_DATA;\n\n    host -> compressor.context = NULL;\n    host -> compressor.compress = NULL;\n    host -> compressor.decompress = NULL;\n    host -> compressor.destroy = NULL;\n\n    host -> intercept = NULL;\n\n    enet_list_clear (& host -> dispatchQueue);\n\n    for (currentPeer = host -> peers;\n         currentPeer < & host -> peers [host -> peerCount];\n         ++ currentPeer)\n    {\n       currentPeer -> host = host;\n       currentPeer -> incomingPeerID = currentPeer - host -> peers;\n       currentPeer -> outgoingSessionID = currentPeer -> incomingSessionID = 0xFF;\n       currentPeer -> data = NULL;\n\n       enet_list_clear (& currentPeer -> acknowledgements);\n       enet_list_clear (& currentPeer -> sentReliableCommands);\n       enet_list_clear (& currentPeer -> sentUnreliableCommands);\n       enet_list_clear (& currentPeer -> outgoingReliableCommands);\n       enet_list_clear (& currentPeer -> outgoingUnreliableCommands);\n       enet_list_clear (& currentPeer -> dispatchedCommands);\n\n       enet_peer_reset (currentPeer);\n    }\n\n    return host;\n}\n\n/** Destroys the host and all resources associated with it.\n    @param host pointer to the host to destroy\n*/\nvoid\nenet_host_destroy (ENetHost * host)\n{\n    ENetPeer * currentPeer;\n\n    if (host == NULL)\n      return;\n\n    enet_socket_destroy (host -> socket);\n\n    for (currentPeer = host -> peers;\n         currentPeer < & host -> peers [host -> peerCount];\n         ++ currentPeer)\n    {\n       enet_peer_reset (currentPeer);\n    }\n\n    if (host -> compressor.context != NULL && host -> compressor.destroy)\n      (* host -> compressor.destroy) (host -> compressor.context);\n\n    enet_free (host -> peers);\n    enet_free (host);\n}\n\n/** Initiates a connection to a foreign host.\n    @param host host seeking the connection\n    @param address destination for the connection\n    @param channelCount number of channels to allocate\n    @param data user data supplied to the receiving host \n    @returns a peer representing the foreign host on success, NULL on failure\n    @remarks The peer returned will have not completed the connection until enet_host_service()\n    notifies of an ENET_EVENT_TYPE_CONNECT event for the peer.\n*/\nENetPeer *\nenet_host_connect (ENetHost * host, const ENetAddress * address, size_t channelCount, enet_uint32 data)\n{\n    ENetPeer * currentPeer;\n    ENetChannel * channel;\n    ENetProtocol command;\n\n    if (channelCount < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT)\n      channelCount = ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT;\n    else\n    if (channelCount > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT)\n      channelCount = ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT;\n\n    for (currentPeer = host -> peers;\n         currentPeer < & host -> peers [host -> peerCount];\n         ++ currentPeer)\n    {\n       if (currentPeer -> state == ENET_PEER_STATE_DISCONNECTED)\n         break;\n    }\n\n    if (currentPeer >= & host -> peers [host -> peerCount])\n      return NULL;\n\n    currentPeer -> channels = (ENetChannel *) enet_malloc (channelCount * sizeof (ENetChannel));\n    if (currentPeer -> channels == NULL)\n      return NULL;\n    currentPeer -> channelCount = channelCount;\n    currentPeer -> state = ENET_PEER_STATE_CONNECTING;\n    currentPeer -> address = * address;\n    currentPeer -> connectID = ++ host -> randomSeed;\n\n    if (host -> outgoingBandwidth == 0)\n      currentPeer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE;\n    else\n      currentPeer -> windowSize = (host -> outgoingBandwidth /\n                                    ENET_PEER_WINDOW_SIZE_SCALE) * \n                                      ENET_PROTOCOL_MINIMUM_WINDOW_SIZE;\n\n    if (currentPeer -> windowSize < ENET_PROTOCOL_MINIMUM_WINDOW_SIZE)\n      currentPeer -> windowSize = ENET_PROTOCOL_MINIMUM_WINDOW_SIZE;\n    else\n    if (currentPeer -> windowSize > ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE)\n      currentPeer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE;\n         \n    for (channel = currentPeer -> channels;\n         channel < & currentPeer -> channels [channelCount];\n         ++ channel)\n    {\n        channel -> outgoingReliableSequenceNumber = 0;\n        channel -> outgoingUnreliableSequenceNumber = 0;\n        channel -> incomingReliableSequenceNumber = 0;\n        channel -> incomingUnreliableSequenceNumber = 0;\n\n        enet_list_clear (& channel -> incomingReliableCommands);\n        enet_list_clear (& channel -> incomingUnreliableCommands);\n\n        channel -> usedReliableWindows = 0;\n        memset (channel -> reliableWindows, 0, sizeof (channel -> reliableWindows));\n    }\n        \n    command.header.command = ENET_PROTOCOL_COMMAND_CONNECT | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE;\n    command.header.channelID = 0xFF;\n    command.connect.outgoingPeerID = ENET_HOST_TO_NET_16 (currentPeer -> incomingPeerID);\n    command.connect.incomingSessionID = currentPeer -> incomingSessionID;\n    command.connect.outgoingSessionID = currentPeer -> outgoingSessionID;\n    command.connect.mtu = ENET_HOST_TO_NET_32 (currentPeer -> mtu);\n    command.connect.windowSize = ENET_HOST_TO_NET_32 (currentPeer -> windowSize);\n    command.connect.channelCount = ENET_HOST_TO_NET_32 (channelCount);\n    command.connect.incomingBandwidth = ENET_HOST_TO_NET_32 (host -> incomingBandwidth);\n    command.connect.outgoingBandwidth = ENET_HOST_TO_NET_32 (host -> outgoingBandwidth);\n    command.connect.packetThrottleInterval = ENET_HOST_TO_NET_32 (currentPeer -> packetThrottleInterval);\n    command.connect.packetThrottleAcceleration = ENET_HOST_TO_NET_32 (currentPeer -> packetThrottleAcceleration);\n    command.connect.packetThrottleDeceleration = ENET_HOST_TO_NET_32 (currentPeer -> packetThrottleDeceleration);\n    command.connect.connectID = currentPeer -> connectID;\n    command.connect.data = ENET_HOST_TO_NET_32 (data);\n \n    enet_peer_queue_outgoing_command (currentPeer, & command, NULL, 0, 0);\n\n    return currentPeer;\n}\n\n/** Queues a packet to be sent to all peers associated with the host.\n    @param host host on which to broadcast the packet\n    @param channelID channel on which to broadcast\n    @param packet packet to broadcast\n*/\nvoid\nenet_host_broadcast (ENetHost * host, enet_uint8 channelID, ENetPacket * packet)\n{\n    ENetPeer * currentPeer;\n\n    for (currentPeer = host -> peers;\n         currentPeer < & host -> peers [host -> peerCount];\n         ++ currentPeer)\n    {\n       if (currentPeer -> state != ENET_PEER_STATE_CONNECTED)\n         continue;\n\n       enet_peer_send (currentPeer, channelID, packet);\n    }\n\n    if (packet -> referenceCount == 0)\n      enet_packet_destroy (packet);\n}\n\n/** Sets the packet compressor the host should use to compress and decompress packets.\n    @param host host to enable or disable compression for\n    @param compressor callbacks for for the packet compressor; if NULL, then compression is disabled\n*/\nvoid\nenet_host_compress (ENetHost * host, const ENetCompressor * compressor)\n{\n    if (host -> compressor.context != NULL && host -> compressor.destroy)\n      (* host -> compressor.destroy) (host -> compressor.context);\n\n    if (compressor)\n      host -> compressor = * compressor;\n    else\n      host -> compressor.context = NULL;\n}\n\n/** Limits the maximum allowed channels of future incoming connections.\n    @param host host to limit\n    @param channelLimit the maximum number of channels allowed; if 0, then this is equivalent to ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT\n*/\nvoid\nenet_host_channel_limit (ENetHost * host, size_t channelLimit)\n{\n    if (! channelLimit || channelLimit > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT)\n      channelLimit = ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT;\n    else\n    if (channelLimit < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT)\n      channelLimit = ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT;\n\n    host -> channelLimit = channelLimit;\n}\n\n\n/** Adjusts the bandwidth limits of a host.\n    @param host host to adjust\n    @param incomingBandwidth new incoming bandwidth\n    @param outgoingBandwidth new outgoing bandwidth\n    @remarks the incoming and outgoing bandwidth parameters are identical in function to those\n    specified in enet_host_create().\n*/\nvoid\nenet_host_bandwidth_limit (ENetHost * host, enet_uint32 incomingBandwidth, enet_uint32 outgoingBandwidth)\n{\n    host -> incomingBandwidth = incomingBandwidth;\n    host -> outgoingBandwidth = outgoingBandwidth;\n    host -> recalculateBandwidthLimits = 1;\n}\n\nvoid\nenet_host_bandwidth_throttle (ENetHost * host)\n{\n    enet_uint32 timeCurrent = enet_time_get (),\n           elapsedTime = timeCurrent - host -> bandwidthThrottleEpoch,\n           peersRemaining = (enet_uint32) host -> connectedPeers,\n           dataTotal = ~0,\n           bandwidth = ~0,\n           throttle = 0,\n           bandwidthLimit = 0;\n    int needsAdjustment = host -> bandwidthLimitedPeers > 0 ? 1 : 0;\n    ENetPeer * peer;\n    ENetProtocol command;\n\n    if (elapsedTime < ENET_HOST_BANDWIDTH_THROTTLE_INTERVAL)\n      return;\n\n    host -> bandwidthThrottleEpoch = timeCurrent;\n\n    if (peersRemaining == 0)\n      return;\n\n    if (host -> outgoingBandwidth != 0)\n    {\n        dataTotal = 0;\n        bandwidth = (host -> outgoingBandwidth * elapsedTime) / 1000;\n\n        for (peer = host -> peers;\n             peer < & host -> peers [host -> peerCount];\n            ++ peer)\n        {\n            if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER)\n              continue;\n\n            dataTotal += peer -> outgoingDataTotal;\n        }\n    }\n\n    while (peersRemaining > 0 && needsAdjustment != 0)\n    {\n        needsAdjustment = 0;\n        \n        if (dataTotal <= bandwidth)\n          throttle = ENET_PEER_PACKET_THROTTLE_SCALE;\n        else\n          throttle = (bandwidth * ENET_PEER_PACKET_THROTTLE_SCALE) / dataTotal;\n\n        for (peer = host -> peers;\n             peer < & host -> peers [host -> peerCount];\n             ++ peer)\n        {\n            enet_uint32 peerBandwidth;\n            \n            if ((peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) ||\n                peer -> incomingBandwidth == 0 ||\n                peer -> outgoingBandwidthThrottleEpoch == timeCurrent)\n              continue;\n\n            peerBandwidth = (peer -> incomingBandwidth * elapsedTime) / 1000;\n            if ((throttle * peer -> outgoingDataTotal) / ENET_PEER_PACKET_THROTTLE_SCALE <= peerBandwidth)\n              continue;\n\n            peer -> packetThrottleLimit = (peerBandwidth * \n                                            ENET_PEER_PACKET_THROTTLE_SCALE) / peer -> outgoingDataTotal;\n            \n            if (peer -> packetThrottleLimit == 0)\n              peer -> packetThrottleLimit = 1;\n            \n            if (peer -> packetThrottle > peer -> packetThrottleLimit)\n              peer -> packetThrottle = peer -> packetThrottleLimit;\n\n            peer -> outgoingBandwidthThrottleEpoch = timeCurrent;\n\n            peer -> incomingDataTotal = 0;\n            peer -> outgoingDataTotal = 0;\n\n            needsAdjustment = 1;\n            -- peersRemaining;\n            bandwidth -= peerBandwidth;\n            dataTotal -= peerBandwidth;\n        }\n    }\n\n    if (peersRemaining > 0)\n    {\n        if (dataTotal <= bandwidth)\n          throttle = ENET_PEER_PACKET_THROTTLE_SCALE;\n        else\n          throttle = (bandwidth * ENET_PEER_PACKET_THROTTLE_SCALE) / dataTotal;\n\n        for (peer = host -> peers;\n             peer < & host -> peers [host -> peerCount];\n             ++ peer)\n        {\n            if ((peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) ||\n                peer -> outgoingBandwidthThrottleEpoch == timeCurrent)\n              continue;\n\n            peer -> packetThrottleLimit = throttle;\n\n            if (peer -> packetThrottle > peer -> packetThrottleLimit)\n              peer -> packetThrottle = peer -> packetThrottleLimit;\n\n            peer -> incomingDataTotal = 0;\n            peer -> outgoingDataTotal = 0;\n        }\n    }\n\n    if (host -> recalculateBandwidthLimits)\n    {\n       host -> recalculateBandwidthLimits = 0;\n\n       peersRemaining = (enet_uint32) host -> connectedPeers;\n       bandwidth = host -> incomingBandwidth;\n       needsAdjustment = 1;\n\n       if (bandwidth == 0)\n         bandwidthLimit = 0;\n       else\n       while (peersRemaining > 0 && needsAdjustment != 0)\n       {\n           needsAdjustment = 0;\n           bandwidthLimit = bandwidth / peersRemaining;\n\n           for (peer = host -> peers;\n                peer < & host -> peers [host -> peerCount];\n                ++ peer)\n           {\n               if ((peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) ||\n                   peer -> incomingBandwidthThrottleEpoch == timeCurrent)\n                 continue;\n\n               if (peer -> outgoingBandwidth > 0 &&\n                   peer -> outgoingBandwidth >= bandwidthLimit)\n                 continue;\n\n               peer -> incomingBandwidthThrottleEpoch = timeCurrent;\n \n               needsAdjustment = 1;\n               -- peersRemaining;\n               bandwidth -= peer -> outgoingBandwidth;\n           }\n       }\n\n       for (peer = host -> peers;\n            peer < & host -> peers [host -> peerCount];\n            ++ peer)\n       {\n           if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER)\n             continue;\n\n           command.header.command = ENET_PROTOCOL_COMMAND_BANDWIDTH_LIMIT | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE;\n           command.header.channelID = 0xFF;\n           command.bandwidthLimit.outgoingBandwidth = ENET_HOST_TO_NET_32 (host -> outgoingBandwidth);\n\n           if (peer -> incomingBandwidthThrottleEpoch == timeCurrent)\n             command.bandwidthLimit.incomingBandwidth = ENET_HOST_TO_NET_32 (peer -> outgoingBandwidth);\n           else\n             command.bandwidthLimit.incomingBandwidth = ENET_HOST_TO_NET_32 (bandwidthLimit);\n\n           enet_peer_queue_outgoing_command (peer, & command, NULL, 0, 0);\n       } \n    }\n}\n    \n/** @} */\n"
  },
  {
    "path": "src/libraries/enet/libenet/include/enet/callbacks.h",
    "content": "/** \n @file  callbacks.h\n @brief ENet callbacks\n*/\n#ifndef __ENET_CALLBACKS_H__\n#define __ENET_CALLBACKS_H__\n\n#include <stdlib.h>\n\ntypedef struct _ENetCallbacks\n{\n    void * (ENET_CALLBACK * malloc) (size_t size);\n    void (ENET_CALLBACK * free) (void * memory);\n    void (ENET_CALLBACK * no_memory) (void);\n} ENetCallbacks;\n\n/** @defgroup callbacks ENet internal callbacks\n    @{\n    @ingroup private\n*/\nextern void * enet_malloc (size_t);\nextern void   enet_free (void *);\n\n/** @} */\n\n#endif /* __ENET_CALLBACKS_H__ */\n\n"
  },
  {
    "path": "src/libraries/enet/libenet/include/enet/enet.h",
    "content": "/** \n @file  enet.h\n @brief ENet public header file\n*/\n#ifndef __ENET_ENET_H__\n#define __ENET_ENET_H__\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\n#include <stdlib.h>\n\n#ifdef _WIN32\n#include \"enet/win32.h\"\n#else\n#include \"enet/unix.h\"\n#endif\n\n#include \"enet/types.h\"\n#include \"enet/protocol.h\"\n#include \"enet/list.h\"\n#include \"enet/callbacks.h\"\n\n#define ENET_VERSION_MAJOR 1\n#define ENET_VERSION_MINOR 3\n#define ENET_VERSION_PATCH 13\n#define ENET_VERSION_CREATE(major, minor, patch) (((major)<<16) | ((minor)<<8) | (patch))\n#define ENET_VERSION_GET_MAJOR(version) (((version)>>16)&0xFF)\n#define ENET_VERSION_GET_MINOR(version) (((version)>>8)&0xFF)\n#define ENET_VERSION_GET_PATCH(version) ((version)&0xFF)\n#define ENET_VERSION ENET_VERSION_CREATE(ENET_VERSION_MAJOR, ENET_VERSION_MINOR, ENET_VERSION_PATCH)\n\ntypedef enet_uint32 ENetVersion;\n\nstruct _ENetHost;\nstruct _ENetEvent;\nstruct _ENetPacket;\n\ntypedef enum _ENetSocketType\n{\n   ENET_SOCKET_TYPE_STREAM   = 1,\n   ENET_SOCKET_TYPE_DATAGRAM = 2\n} ENetSocketType;\n\ntypedef enum _ENetSocketWait\n{\n   ENET_SOCKET_WAIT_NONE      = 0,\n   ENET_SOCKET_WAIT_SEND      = (1 << 0),\n   ENET_SOCKET_WAIT_RECEIVE   = (1 << 1),\n   ENET_SOCKET_WAIT_INTERRUPT = (1 << 2)\n} ENetSocketWait;\n\ntypedef enum _ENetSocketOption\n{\n   ENET_SOCKOPT_NONBLOCK  = 1,\n   ENET_SOCKOPT_BROADCAST = 2,\n   ENET_SOCKOPT_RCVBUF    = 3,\n   ENET_SOCKOPT_SNDBUF    = 4,\n   ENET_SOCKOPT_REUSEADDR = 5,\n   ENET_SOCKOPT_RCVTIMEO  = 6,\n   ENET_SOCKOPT_SNDTIMEO  = 7,\n   ENET_SOCKOPT_ERROR     = 8,\n   ENET_SOCKOPT_NODELAY   = 9\n} ENetSocketOption;\n\ntypedef enum _ENetSocketShutdown\n{\n    ENET_SOCKET_SHUTDOWN_READ       = 0,\n    ENET_SOCKET_SHUTDOWN_WRITE      = 1,\n    ENET_SOCKET_SHUTDOWN_READ_WRITE = 2\n} ENetSocketShutdown;\n\n#define ENET_HOST_ANY       0\n#define ENET_HOST_BROADCAST 0xFFFFFFFFU\n#define ENET_PORT_ANY       0\n\n/**\n * Portable internet address structure. \n *\n * The host must be specified in network byte-order, and the port must be in host \n * byte-order. The constant ENET_HOST_ANY may be used to specify the default \n * server host. The constant ENET_HOST_BROADCAST may be used to specify the\n * broadcast address (255.255.255.255).  This makes sense for enet_host_connect,\n * but not for enet_host_create.  Once a server responds to a broadcast, the\n * address is updated from ENET_HOST_BROADCAST to the server's actual IP address.\n */\ntypedef struct _ENetAddress\n{\n   enet_uint32 host;\n   enet_uint16 port;\n} ENetAddress;\n\n/**\n * Packet flag bit constants.\n *\n * The host must be specified in network byte-order, and the port must be in\n * host byte-order. The constant ENET_HOST_ANY may be used to specify the\n * default server host.\n \n   @sa ENetPacket\n*/\ntypedef enum _ENetPacketFlag\n{\n   /** packet must be received by the target peer and resend attempts should be\n     * made until the packet is delivered */\n   ENET_PACKET_FLAG_RELIABLE    = (1 << 0),\n   /** packet will not be sequenced with other packets\n     * not supported for reliable packets\n     */\n   ENET_PACKET_FLAG_UNSEQUENCED = (1 << 1),\n   /** packet will not allocate data, and user must supply it instead */\n   ENET_PACKET_FLAG_NO_ALLOCATE = (1 << 2),\n   /** packet will be fragmented using unreliable (instead of reliable) sends\n     * if it exceeds the MTU */\n   ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT = (1 << 3),\n\n   /** whether the packet has been sent from all queues it has been entered into */\n   ENET_PACKET_FLAG_SENT = (1<<8)\n} ENetPacketFlag;\n\ntypedef void (ENET_CALLBACK * ENetPacketFreeCallback) (struct _ENetPacket *);\n\n/**\n * ENet packet structure.\n *\n * An ENet data packet that may be sent to or received from a peer. The shown \n * fields should only be read and never modified. The data field contains the \n * allocated data for the packet. The dataLength fields specifies the length \n * of the allocated data.  The flags field is either 0 (specifying no flags), \n * or a bitwise-or of any combination of the following flags:\n *\n *    ENET_PACKET_FLAG_RELIABLE - packet must be received by the target peer\n *    and resend attempts should be made until the packet is delivered\n *\n *    ENET_PACKET_FLAG_UNSEQUENCED - packet will not be sequenced with other packets \n *    (not supported for reliable packets)\n *\n *    ENET_PACKET_FLAG_NO_ALLOCATE - packet will not allocate data, and user must supply it instead\n *\n *    ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT - packet will be fragmented using unreliable\n *    (instead of reliable) sends if it exceeds the MTU\n *\n *    ENET_PACKET_FLAG_SENT - whether the packet has been sent from all queues it has been entered into\n   @sa ENetPacketFlag\n */\ntypedef struct _ENetPacket\n{\n   size_t                   referenceCount;  /**< internal use only */\n   enet_uint32              flags;           /**< bitwise-or of ENetPacketFlag constants */\n   enet_uint8 *             data;            /**< allocated data for packet */\n   size_t                   dataLength;      /**< length of data */\n   ENetPacketFreeCallback   freeCallback;    /**< function to be called when the packet is no longer in use */\n   void *                   userData;        /**< application private data, may be freely modified */\n} ENetPacket;\n\ntypedef struct _ENetAcknowledgement\n{\n   ENetListNode acknowledgementList;\n   enet_uint32  sentTime;\n   ENetProtocol command;\n} ENetAcknowledgement;\n\ntypedef struct _ENetOutgoingCommand\n{\n   ENetListNode outgoingCommandList;\n   enet_uint16  reliableSequenceNumber;\n   enet_uint16  unreliableSequenceNumber;\n   enet_uint32  sentTime;\n   enet_uint32  roundTripTimeout;\n   enet_uint32  roundTripTimeoutLimit;\n   enet_uint32  fragmentOffset;\n   enet_uint16  fragmentLength;\n   enet_uint16  sendAttempts;\n   ENetProtocol command;\n   ENetPacket * packet;\n} ENetOutgoingCommand;\n\ntypedef struct _ENetIncomingCommand\n{  \n   ENetListNode     incomingCommandList;\n   enet_uint16      reliableSequenceNumber;\n   enet_uint16      unreliableSequenceNumber;\n   ENetProtocol     command;\n   enet_uint32      fragmentCount;\n   enet_uint32      fragmentsRemaining;\n   enet_uint32 *    fragments;\n   ENetPacket *     packet;\n} ENetIncomingCommand;\n\ntypedef enum _ENetPeerState\n{\n   ENET_PEER_STATE_DISCONNECTED                = 0,\n   ENET_PEER_STATE_CONNECTING                  = 1,\n   ENET_PEER_STATE_ACKNOWLEDGING_CONNECT       = 2,\n   ENET_PEER_STATE_CONNECTION_PENDING          = 3,\n   ENET_PEER_STATE_CONNECTION_SUCCEEDED        = 4,\n   ENET_PEER_STATE_CONNECTED                   = 5,\n   ENET_PEER_STATE_DISCONNECT_LATER            = 6,\n   ENET_PEER_STATE_DISCONNECTING               = 7,\n   ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT    = 8,\n   ENET_PEER_STATE_ZOMBIE                      = 9 \n} ENetPeerState;\n\n#ifndef ENET_BUFFER_MAXIMUM\n#define ENET_BUFFER_MAXIMUM (1 + 2 * ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS)\n#endif\n\nenum\n{\n   ENET_HOST_RECEIVE_BUFFER_SIZE          = 256 * 1024,\n   ENET_HOST_SEND_BUFFER_SIZE             = 256 * 1024,\n   ENET_HOST_BANDWIDTH_THROTTLE_INTERVAL  = 1000,\n   ENET_HOST_DEFAULT_MTU                  = 1400,\n   ENET_HOST_DEFAULT_MAXIMUM_PACKET_SIZE  = 32 * 1024 * 1024,\n   ENET_HOST_DEFAULT_MAXIMUM_WAITING_DATA = 32 * 1024 * 1024,\n\n   ENET_PEER_DEFAULT_ROUND_TRIP_TIME      = 500,\n   ENET_PEER_DEFAULT_PACKET_THROTTLE      = 32,\n   ENET_PEER_PACKET_THROTTLE_SCALE        = 32,\n   ENET_PEER_PACKET_THROTTLE_COUNTER      = 7, \n   ENET_PEER_PACKET_THROTTLE_ACCELERATION = 2,\n   ENET_PEER_PACKET_THROTTLE_DECELERATION = 2,\n   ENET_PEER_PACKET_THROTTLE_INTERVAL     = 5000,\n   ENET_PEER_PACKET_LOSS_SCALE            = (1 << 16),\n   ENET_PEER_PACKET_LOSS_INTERVAL         = 10000,\n   ENET_PEER_WINDOW_SIZE_SCALE            = 64 * 1024,\n   ENET_PEER_TIMEOUT_LIMIT                = 32,\n   ENET_PEER_TIMEOUT_MINIMUM              = 5000,\n   ENET_PEER_TIMEOUT_MAXIMUM              = 30000,\n   ENET_PEER_PING_INTERVAL                = 500,\n   ENET_PEER_UNSEQUENCED_WINDOWS          = 64,\n   ENET_PEER_UNSEQUENCED_WINDOW_SIZE      = 1024,\n   ENET_PEER_FREE_UNSEQUENCED_WINDOWS     = 32,\n   ENET_PEER_RELIABLE_WINDOWS             = 16,\n   ENET_PEER_RELIABLE_WINDOW_SIZE         = 0x1000,\n   ENET_PEER_FREE_RELIABLE_WINDOWS        = 8\n};\n\ntypedef struct _ENetChannel\n{\n   enet_uint16  outgoingReliableSequenceNumber;\n   enet_uint16  outgoingUnreliableSequenceNumber;\n   enet_uint16  usedReliableWindows;\n   enet_uint16  reliableWindows [ENET_PEER_RELIABLE_WINDOWS];\n   enet_uint16  incomingReliableSequenceNumber;\n   enet_uint16  incomingUnreliableSequenceNumber;\n   ENetList     incomingReliableCommands;\n   ENetList     incomingUnreliableCommands;\n} ENetChannel;\n\n/**\n * An ENet peer which data packets may be sent or received from. \n *\n * No fields should be modified unless otherwise specified. \n */\ntypedef struct _ENetPeer\n{ \n   ENetListNode  dispatchList;\n   struct _ENetHost * host;\n   enet_uint16   outgoingPeerID;\n   enet_uint16   incomingPeerID;\n   enet_uint32   connectID;\n   enet_uint8    outgoingSessionID;\n   enet_uint8    incomingSessionID;\n   ENetAddress   address;            /**< Internet address of the peer */\n   void *        data;               /**< Application private data, may be freely modified */\n   ENetPeerState state;\n   ENetChannel * channels;\n   size_t        channelCount;       /**< Number of channels allocated for communication with peer */\n   enet_uint32   incomingBandwidth;  /**< Downstream bandwidth of the client in bytes/second */\n   enet_uint32   outgoingBandwidth;  /**< Upstream bandwidth of the client in bytes/second */\n   enet_uint32   incomingBandwidthThrottleEpoch;\n   enet_uint32   outgoingBandwidthThrottleEpoch;\n   enet_uint32   incomingDataTotal;\n   enet_uint32   outgoingDataTotal;\n   enet_uint32   lastSendTime;\n   enet_uint32   lastReceiveTime;\n   enet_uint32   nextTimeout;\n   enet_uint32   earliestTimeout;\n   enet_uint32   packetLossEpoch;\n   enet_uint32   packetsSent;\n   enet_uint32   packetsLost;\n   enet_uint32   packetLoss;          /**< mean packet loss of reliable packets as a ratio with respect to the constant ENET_PEER_PACKET_LOSS_SCALE */\n   enet_uint32   packetLossVariance;\n   enet_uint32   packetThrottle;\n   enet_uint32   packetThrottleLimit;\n   enet_uint32   packetThrottleCounter;\n   enet_uint32   packetThrottleEpoch;\n   enet_uint32   packetThrottleAcceleration;\n   enet_uint32   packetThrottleDeceleration;\n   enet_uint32   packetThrottleInterval;\n   enet_uint32   pingInterval;\n   enet_uint32   timeoutLimit;\n   enet_uint32   timeoutMinimum;\n   enet_uint32   timeoutMaximum;\n   enet_uint32   lastRoundTripTime;\n   enet_uint32   lowestRoundTripTime;\n   enet_uint32   lastRoundTripTimeVariance;\n   enet_uint32   highestRoundTripTimeVariance;\n   enet_uint32   roundTripTime;            /**< mean round trip time (RTT), in milliseconds, between sending a reliable packet and receiving its acknowledgement */\n   enet_uint32   roundTripTimeVariance;\n   enet_uint32   mtu;\n   enet_uint32   windowSize;\n   enet_uint32   reliableDataInTransit;\n   enet_uint16   outgoingReliableSequenceNumber;\n   ENetList      acknowledgements;\n   ENetList      sentReliableCommands;\n   ENetList      sentUnreliableCommands;\n   ENetList      outgoingReliableCommands;\n   ENetList      outgoingUnreliableCommands;\n   ENetList      dispatchedCommands;\n   int           needsDispatch;\n   enet_uint16   incomingUnsequencedGroup;\n   enet_uint16   outgoingUnsequencedGroup;\n   enet_uint32   unsequencedWindow [ENET_PEER_UNSEQUENCED_WINDOW_SIZE / 32]; \n   enet_uint32   eventData;\n   size_t        totalWaitingData;\n} ENetPeer;\n\n/** An ENet packet compressor for compressing UDP packets before socket sends or receives.\n */\ntypedef struct _ENetCompressor\n{\n   /** Context data for the compressor. Must be non-NULL. */\n   void * context;\n   /** Compresses from inBuffers[0:inBufferCount-1], containing inLimit bytes, to outData, outputting at most outLimit bytes. Should return 0 on failure. */\n   size_t (ENET_CALLBACK * compress) (void * context, const ENetBuffer * inBuffers, size_t inBufferCount, size_t inLimit, enet_uint8 * outData, size_t outLimit);\n   /** Decompresses from inData, containing inLimit bytes, to outData, outputting at most outLimit bytes. Should return 0 on failure. */\n   size_t (ENET_CALLBACK * decompress) (void * context, const enet_uint8 * inData, size_t inLimit, enet_uint8 * outData, size_t outLimit);\n   /** Destroys the context when compression is disabled or the host is destroyed. May be NULL. */\n   void (ENET_CALLBACK * destroy) (void * context);\n} ENetCompressor;\n\n/** Callback that computes the checksum of the data held in buffers[0:bufferCount-1] */\ntypedef enet_uint32 (ENET_CALLBACK * ENetChecksumCallback) (const ENetBuffer * buffers, size_t bufferCount);\n\n/** Callback for intercepting received raw UDP packets. Should return 1 to intercept, 0 to ignore, or -1 to propagate an error. */\ntypedef int (ENET_CALLBACK * ENetInterceptCallback) (struct _ENetHost * host, struct _ENetEvent * event);\n \n/** An ENet host for communicating with peers.\n  *\n  * No fields should be modified unless otherwise stated.\n\n    @sa enet_host_create()\n    @sa enet_host_destroy()\n    @sa enet_host_connect()\n    @sa enet_host_service()\n    @sa enet_host_flush()\n    @sa enet_host_broadcast()\n    @sa enet_host_compress()\n    @sa enet_host_compress_with_range_coder()\n    @sa enet_host_channel_limit()\n    @sa enet_host_bandwidth_limit()\n    @sa enet_host_bandwidth_throttle()\n  */\ntypedef struct _ENetHost\n{\n   ENetSocket           socket;\n   ENetAddress          address;                     /**< Internet address of the host */\n   enet_uint32          incomingBandwidth;           /**< downstream bandwidth of the host */\n   enet_uint32          outgoingBandwidth;           /**< upstream bandwidth of the host */\n   enet_uint32          bandwidthThrottleEpoch;\n   enet_uint32          mtu;\n   enet_uint32          randomSeed;\n   int                  recalculateBandwidthLimits;\n   ENetPeer *           peers;                       /**< array of peers allocated for this host */\n   size_t               peerCount;                   /**< number of peers allocated for this host */\n   size_t               channelLimit;                /**< maximum number of channels allowed for connected peers */\n   enet_uint32          serviceTime;\n   ENetList             dispatchQueue;\n   int                  continueSending;\n   size_t               packetSize;\n   enet_uint16          headerFlags;\n   ENetProtocol         commands [ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS];\n   size_t               commandCount;\n   ENetBuffer           buffers [ENET_BUFFER_MAXIMUM];\n   size_t               bufferCount;\n   ENetChecksumCallback checksum;                    /**< callback the user can set to enable packet checksums for this host */\n   ENetCompressor       compressor;\n   enet_uint8           packetData [2][ENET_PROTOCOL_MAXIMUM_MTU];\n   ENetAddress          receivedAddress;\n   enet_uint8 *         receivedData;\n   size_t               receivedDataLength;\n   enet_uint32          totalSentData;               /**< total data sent, user should reset to 0 as needed to prevent overflow */\n   enet_uint32          totalSentPackets;            /**< total UDP packets sent, user should reset to 0 as needed to prevent overflow */\n   enet_uint32          totalReceivedData;           /**< total data received, user should reset to 0 as needed to prevent overflow */\n   enet_uint32          totalReceivedPackets;        /**< total UDP packets received, user should reset to 0 as needed to prevent overflow */\n   ENetInterceptCallback intercept;                  /**< callback the user can set to intercept received raw UDP packets */\n   size_t               connectedPeers;\n   size_t               bandwidthLimitedPeers;\n   size_t               duplicatePeers;              /**< optional number of allowed peers from duplicate IPs, defaults to ENET_PROTOCOL_MAXIMUM_PEER_ID */\n   size_t               maximumPacketSize;           /**< the maximum allowable packet size that may be sent or received on a peer */\n   size_t               maximumWaitingData;          /**< the maximum aggregate amount of buffer space a peer may use waiting for packets to be delivered */\n} ENetHost;\n\n/**\n * An ENet event type, as specified in @ref ENetEvent.\n */\ntypedef enum _ENetEventType\n{\n   /** no event occurred within the specified time limit */\n   ENET_EVENT_TYPE_NONE       = 0,  \n\n   /** a connection request initiated by enet_host_connect has completed.  \n     * The peer field contains the peer which successfully connected. \n     */\n   ENET_EVENT_TYPE_CONNECT    = 1,  \n\n   /** a peer has disconnected.  This event is generated on a successful \n     * completion of a disconnect initiated by enet_pper_disconnect, if \n     * a peer has timed out, or if a connection request intialized by \n     * enet_host_connect has timed out.  The peer field contains the peer \n     * which disconnected. The data field contains user supplied data \n     * describing the disconnection, or 0, if none is available.\n     */\n   ENET_EVENT_TYPE_DISCONNECT = 2,  \n\n   /** a packet has been received from a peer.  The peer field specifies the\n     * peer which sent the packet.  The channelID field specifies the channel\n     * number upon which the packet was received.  The packet field contains\n     * the packet that was received; this packet must be destroyed with\n     * enet_packet_destroy after use.\n     */\n   ENET_EVENT_TYPE_RECEIVE    = 3\n} ENetEventType;\n\n/**\n * An ENet event as returned by enet_host_service().\n   \n   @sa enet_host_service\n */\ntypedef struct _ENetEvent \n{\n   ENetEventType        type;      /**< type of the event */\n   ENetPeer *           peer;      /**< peer that generated a connect, disconnect or receive event */\n   enet_uint8           channelID; /**< channel on the peer that generated the event, if appropriate */\n   enet_uint32          data;      /**< data associated with the event, if appropriate */\n   ENetPacket *         packet;    /**< packet associated with the event, if appropriate */\n} ENetEvent;\n\n/** @defgroup global ENet global functions\n    @{ \n*/\n\n/** \n  Initializes ENet globally.  Must be called prior to using any functions in\n  ENet.\n  @returns 0 on success, < 0 on failure\n*/\nENET_API int enet_initialize (void);\n\n/** \n  Initializes ENet globally and supplies user-overridden callbacks. Must be called prior to using any functions in ENet. Do not use enet_initialize() if you use this variant. Make sure the ENetCallbacks structure is zeroed out so that any additional callbacks added in future versions will be properly ignored.\n\n  @param version the constant ENET_VERSION should be supplied so ENet knows which version of ENetCallbacks struct to use\n  @param inits user-overridden callbacks where any NULL callbacks will use ENet's defaults\n  @returns 0 on success, < 0 on failure\n*/\nENET_API int enet_initialize_with_callbacks (ENetVersion version, const ENetCallbacks * inits);\n\n/** \n  Shuts down ENet globally.  Should be called when a program that has\n  initialized ENet exits.\n*/\nENET_API void enet_deinitialize (void);\n\n/**\n  Gives the linked version of the ENet library.\n  @returns the version number \n*/\nENET_API ENetVersion enet_linked_version (void);\n\n/** @} */\n\n/** @defgroup private ENet private implementation functions */\n\n/**\n  Returns the wall-time in milliseconds.  Its initial value is unspecified\n  unless otherwise set.\n  */\nENET_API enet_uint32 enet_time_get (void);\n/**\n  Sets the current wall-time in milliseconds.\n  */\nENET_API void enet_time_set (enet_uint32);\n\n/** @defgroup socket ENet socket functions\n    @{\n*/\nENET_API ENetSocket enet_socket_create (ENetSocketType);\nENET_API int        enet_socket_bind (ENetSocket, const ENetAddress *);\nENET_API int        enet_socket_get_address (ENetSocket, ENetAddress *);\nENET_API int        enet_socket_listen (ENetSocket, int);\nENET_API ENetSocket enet_socket_accept (ENetSocket, ENetAddress *);\nENET_API int        enet_socket_connect (ENetSocket, const ENetAddress *);\nENET_API int        enet_socket_send (ENetSocket, const ENetAddress *, const ENetBuffer *, size_t);\nENET_API int        enet_socket_receive (ENetSocket, ENetAddress *, ENetBuffer *, size_t);\nENET_API int        enet_socket_wait (ENetSocket, enet_uint32 *, enet_uint32);\nENET_API int        enet_socket_set_option (ENetSocket, ENetSocketOption, int);\nENET_API int        enet_socket_get_option (ENetSocket, ENetSocketOption, int *);\nENET_API int        enet_socket_shutdown (ENetSocket, ENetSocketShutdown);\nENET_API void       enet_socket_destroy (ENetSocket);\nENET_API int        enet_socketset_select (ENetSocket, ENetSocketSet *, ENetSocketSet *, enet_uint32);\n\n/** @} */\n\n/** @defgroup Address ENet address functions\n    @{\n*/\n/** Attempts to resolve the host named by the parameter hostName and sets\n    the host field in the address parameter if successful.\n    @param address destination to store resolved address\n    @param hostName host name to lookup\n    @retval 0 on success\n    @retval < 0 on failure\n    @returns the address of the given hostName in address on success\n*/\nENET_API int enet_address_set_host (ENetAddress * address, const char * hostName);\n\n/** Gives the printable form of the IP address specified in the address parameter.\n    @param address    address printed\n    @param hostName   destination for name, must not be NULL\n    @param nameLength maximum length of hostName.\n    @returns the null-terminated name of the host in hostName on success\n    @retval 0 on success\n    @retval < 0 on failure\n*/\nENET_API int enet_address_get_host_ip (const ENetAddress * address, char * hostName, size_t nameLength);\n\n/** Attempts to do a reverse lookup of the host field in the address parameter.\n    @param address    address used for reverse lookup\n    @param hostName   destination for name, must not be NULL\n    @param nameLength maximum length of hostName.\n    @returns the null-terminated name of the host in hostName on success\n    @retval 0 on success\n    @retval < 0 on failure\n*/\nENET_API int enet_address_get_host (const ENetAddress * address, char * hostName, size_t nameLength);\n\n/** @} */\n\nENET_API ENetPacket * enet_packet_create (const void *, size_t, enet_uint32);\nENET_API void         enet_packet_destroy (ENetPacket *);\nENET_API int          enet_packet_resize  (ENetPacket *, size_t);\nENET_API enet_uint32  enet_crc32 (const ENetBuffer *, size_t);\n                \nENET_API ENetHost * enet_host_create (const ENetAddress *, size_t, size_t, enet_uint32, enet_uint32);\nENET_API void       enet_host_destroy (ENetHost *);\nENET_API ENetPeer * enet_host_connect (ENetHost *, const ENetAddress *, size_t, enet_uint32);\nENET_API int        enet_host_check_events (ENetHost *, ENetEvent *);\nENET_API int        enet_host_service (ENetHost *, ENetEvent *, enet_uint32);\nENET_API void       enet_host_flush (ENetHost *);\nENET_API void       enet_host_broadcast (ENetHost *, enet_uint8, ENetPacket *);\nENET_API void       enet_host_compress (ENetHost *, const ENetCompressor *);\nENET_API int        enet_host_compress_with_range_coder (ENetHost * host);\nENET_API void       enet_host_channel_limit (ENetHost *, size_t);\nENET_API void       enet_host_bandwidth_limit (ENetHost *, enet_uint32, enet_uint32);\nextern   void       enet_host_bandwidth_throttle (ENetHost *);\nextern  enet_uint32 enet_host_random_seed (void);\n\nENET_API int                 enet_peer_send (ENetPeer *, enet_uint8, ENetPacket *);\nENET_API ENetPacket *        enet_peer_receive (ENetPeer *, enet_uint8 * channelID);\nENET_API void                enet_peer_ping (ENetPeer *);\nENET_API void                enet_peer_ping_interval (ENetPeer *, enet_uint32);\nENET_API void                enet_peer_timeout (ENetPeer *, enet_uint32, enet_uint32, enet_uint32);\nENET_API void                enet_peer_reset (ENetPeer *);\nENET_API void                enet_peer_disconnect (ENetPeer *, enet_uint32);\nENET_API void                enet_peer_disconnect_now (ENetPeer *, enet_uint32);\nENET_API void                enet_peer_disconnect_later (ENetPeer *, enet_uint32);\nENET_API void                enet_peer_throttle_configure (ENetPeer *, enet_uint32, enet_uint32, enet_uint32);\nextern int                   enet_peer_throttle (ENetPeer *, enet_uint32);\nextern void                  enet_peer_reset_queues (ENetPeer *);\nextern void                  enet_peer_setup_outgoing_command (ENetPeer *, ENetOutgoingCommand *);\nextern ENetOutgoingCommand * enet_peer_queue_outgoing_command (ENetPeer *, const ENetProtocol *, ENetPacket *, enet_uint32, enet_uint16);\nextern ENetIncomingCommand * enet_peer_queue_incoming_command (ENetPeer *, const ENetProtocol *, const void *, size_t, enet_uint32, enet_uint32);\nextern ENetAcknowledgement * enet_peer_queue_acknowledgement (ENetPeer *, const ENetProtocol *, enet_uint16);\nextern void                  enet_peer_dispatch_incoming_unreliable_commands (ENetPeer *, ENetChannel *);\nextern void                  enet_peer_dispatch_incoming_reliable_commands (ENetPeer *, ENetChannel *);\nextern void                  enet_peer_on_connect (ENetPeer *);\nextern void                  enet_peer_on_disconnect (ENetPeer *);\n\nENET_API void * enet_range_coder_create (void);\nENET_API void   enet_range_coder_destroy (void *);\nENET_API size_t enet_range_coder_compress (void *, const ENetBuffer *, size_t, size_t, enet_uint8 *, size_t);\nENET_API size_t enet_range_coder_decompress (void *, const enet_uint8 *, size_t, enet_uint8 *, size_t);\n   \nextern size_t enet_protocol_command_size (enet_uint8);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __ENET_ENET_H__ */\n\n"
  },
  {
    "path": "src/libraries/enet/libenet/include/enet/list.h",
    "content": "/** \n @file  list.h\n @brief ENet list management \n*/\n#ifndef __ENET_LIST_H__\n#define __ENET_LIST_H__\n\n#include <stdlib.h>\n\ntypedef struct _ENetListNode\n{\n   struct _ENetListNode * next;\n   struct _ENetListNode * previous;\n} ENetListNode;\n\ntypedef ENetListNode * ENetListIterator;\n\ntypedef struct _ENetList\n{\n   ENetListNode sentinel;\n} ENetList;\n\nextern void enet_list_clear (ENetList *);\n\nextern ENetListIterator enet_list_insert (ENetListIterator, void *);\nextern void * enet_list_remove (ENetListIterator);\nextern ENetListIterator enet_list_move (ENetListIterator, void *, void *);\n\nextern size_t enet_list_size (ENetList *);\n\n#define enet_list_begin(list) ((list) -> sentinel.next)\n#define enet_list_end(list) (& (list) -> sentinel)\n\n#define enet_list_empty(list) (enet_list_begin (list) == enet_list_end (list))\n\n#define enet_list_next(iterator) ((iterator) -> next)\n#define enet_list_previous(iterator) ((iterator) -> previous)\n\n#define enet_list_front(list) ((void *) (list) -> sentinel.next)\n#define enet_list_back(list) ((void *) (list) -> sentinel.previous)\n\n#endif /* __ENET_LIST_H__ */\n\n"
  },
  {
    "path": "src/libraries/enet/libenet/include/enet/protocol.h",
    "content": "/** \n @file  protocol.h\n @brief ENet protocol\n*/\n#ifndef __ENET_PROTOCOL_H__\n#define __ENET_PROTOCOL_H__\n\n#include \"enet/types.h\"\n\nenum\n{\n   ENET_PROTOCOL_MINIMUM_MTU             = 576,\n   ENET_PROTOCOL_MAXIMUM_MTU             = 4096,\n   ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS = 32,\n   ENET_PROTOCOL_MINIMUM_WINDOW_SIZE     = 4096,\n   ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE     = 65536,\n   ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT   = 1,\n   ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT   = 255,\n   ENET_PROTOCOL_MAXIMUM_PEER_ID         = 0xFFF,\n   ENET_PROTOCOL_MAXIMUM_FRAGMENT_COUNT  = 1024 * 1024\n};\n\ntypedef enum _ENetProtocolCommand\n{\n   ENET_PROTOCOL_COMMAND_NONE               = 0,\n   ENET_PROTOCOL_COMMAND_ACKNOWLEDGE        = 1,\n   ENET_PROTOCOL_COMMAND_CONNECT            = 2,\n   ENET_PROTOCOL_COMMAND_VERIFY_CONNECT     = 3,\n   ENET_PROTOCOL_COMMAND_DISCONNECT         = 4,\n   ENET_PROTOCOL_COMMAND_PING               = 5,\n   ENET_PROTOCOL_COMMAND_SEND_RELIABLE      = 6,\n   ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE    = 7,\n   ENET_PROTOCOL_COMMAND_SEND_FRAGMENT      = 8,\n   ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED   = 9,\n   ENET_PROTOCOL_COMMAND_BANDWIDTH_LIMIT    = 10,\n   ENET_PROTOCOL_COMMAND_THROTTLE_CONFIGURE = 11,\n   ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT = 12,\n   ENET_PROTOCOL_COMMAND_COUNT              = 13,\n\n   ENET_PROTOCOL_COMMAND_MASK               = 0x0F\n} ENetProtocolCommand;\n\ntypedef enum _ENetProtocolFlag\n{\n   ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE = (1 << 7),\n   ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED = (1 << 6),\n\n   ENET_PROTOCOL_HEADER_FLAG_COMPRESSED = (1 << 14),\n   ENET_PROTOCOL_HEADER_FLAG_SENT_TIME  = (1 << 15),\n   ENET_PROTOCOL_HEADER_FLAG_MASK       = ENET_PROTOCOL_HEADER_FLAG_COMPRESSED | ENET_PROTOCOL_HEADER_FLAG_SENT_TIME,\n\n   ENET_PROTOCOL_HEADER_SESSION_MASK    = (3 << 12),\n   ENET_PROTOCOL_HEADER_SESSION_SHIFT   = 12\n} ENetProtocolFlag;\n\n#ifdef _MSC_VER\n#pragma pack(push, 1)\n#define ENET_PACKED\n#elif defined(__GNUC__) || defined(__clang__)\n#define ENET_PACKED __attribute__ ((packed))\n#else\n#define ENET_PACKED\n#endif\n\ntypedef struct _ENetProtocolHeader\n{\n   enet_uint16 peerID;\n   enet_uint16 sentTime;\n} ENET_PACKED ENetProtocolHeader;\n\ntypedef struct _ENetProtocolCommandHeader\n{\n   enet_uint8 command;\n   enet_uint8 channelID;\n   enet_uint16 reliableSequenceNumber;\n} ENET_PACKED ENetProtocolCommandHeader;\n\ntypedef struct _ENetProtocolAcknowledge\n{\n   ENetProtocolCommandHeader header;\n   enet_uint16 receivedReliableSequenceNumber;\n   enet_uint16 receivedSentTime;\n} ENET_PACKED ENetProtocolAcknowledge;\n\ntypedef struct _ENetProtocolConnect\n{\n   ENetProtocolCommandHeader header;\n   enet_uint16 outgoingPeerID;\n   enet_uint8  incomingSessionID;\n   enet_uint8  outgoingSessionID;\n   enet_uint32 mtu;\n   enet_uint32 windowSize;\n   enet_uint32 channelCount;\n   enet_uint32 incomingBandwidth;\n   enet_uint32 outgoingBandwidth;\n   enet_uint32 packetThrottleInterval;\n   enet_uint32 packetThrottleAcceleration;\n   enet_uint32 packetThrottleDeceleration;\n   enet_uint32 connectID;\n   enet_uint32 data;\n} ENET_PACKED ENetProtocolConnect;\n\ntypedef struct _ENetProtocolVerifyConnect\n{\n   ENetProtocolCommandHeader header;\n   enet_uint16 outgoingPeerID;\n   enet_uint8  incomingSessionID;\n   enet_uint8  outgoingSessionID;\n   enet_uint32 mtu;\n   enet_uint32 windowSize;\n   enet_uint32 channelCount;\n   enet_uint32 incomingBandwidth;\n   enet_uint32 outgoingBandwidth;\n   enet_uint32 packetThrottleInterval;\n   enet_uint32 packetThrottleAcceleration;\n   enet_uint32 packetThrottleDeceleration;\n   enet_uint32 connectID;\n} ENET_PACKED ENetProtocolVerifyConnect;\n\ntypedef struct _ENetProtocolBandwidthLimit\n{\n   ENetProtocolCommandHeader header;\n   enet_uint32 incomingBandwidth;\n   enet_uint32 outgoingBandwidth;\n} ENET_PACKED ENetProtocolBandwidthLimit;\n\ntypedef struct _ENetProtocolThrottleConfigure\n{\n   ENetProtocolCommandHeader header;\n   enet_uint32 packetThrottleInterval;\n   enet_uint32 packetThrottleAcceleration;\n   enet_uint32 packetThrottleDeceleration;\n} ENET_PACKED ENetProtocolThrottleConfigure;\n\ntypedef struct _ENetProtocolDisconnect\n{\n   ENetProtocolCommandHeader header;\n   enet_uint32 data;\n} ENET_PACKED ENetProtocolDisconnect;\n\ntypedef struct _ENetProtocolPing\n{\n   ENetProtocolCommandHeader header;\n} ENET_PACKED ENetProtocolPing;\n\ntypedef struct _ENetProtocolSendReliable\n{\n   ENetProtocolCommandHeader header;\n   enet_uint16 dataLength;\n} ENET_PACKED ENetProtocolSendReliable;\n\ntypedef struct _ENetProtocolSendUnreliable\n{\n   ENetProtocolCommandHeader header;\n   enet_uint16 unreliableSequenceNumber;\n   enet_uint16 dataLength;\n} ENET_PACKED ENetProtocolSendUnreliable;\n\ntypedef struct _ENetProtocolSendUnsequenced\n{\n   ENetProtocolCommandHeader header;\n   enet_uint16 unsequencedGroup;\n   enet_uint16 dataLength;\n} ENET_PACKED ENetProtocolSendUnsequenced;\n\ntypedef struct _ENetProtocolSendFragment\n{\n   ENetProtocolCommandHeader header;\n   enet_uint16 startSequenceNumber;\n   enet_uint16 dataLength;\n   enet_uint32 fragmentCount;\n   enet_uint32 fragmentNumber;\n   enet_uint32 totalLength;\n   enet_uint32 fragmentOffset;\n} ENET_PACKED ENetProtocolSendFragment;\n\ntypedef union _ENetProtocol\n{\n   ENetProtocolCommandHeader header;\n   ENetProtocolAcknowledge acknowledge;\n   ENetProtocolConnect connect;\n   ENetProtocolVerifyConnect verifyConnect;\n   ENetProtocolDisconnect disconnect;\n   ENetProtocolPing ping;\n   ENetProtocolSendReliable sendReliable;\n   ENetProtocolSendUnreliable sendUnreliable;\n   ENetProtocolSendUnsequenced sendUnsequenced;\n   ENetProtocolSendFragment sendFragment;\n   ENetProtocolBandwidthLimit bandwidthLimit;\n   ENetProtocolThrottleConfigure throttleConfigure;\n} ENET_PACKED ENetProtocol;\n\n#ifdef _MSC_VER\n#pragma pack(pop)\n#endif\n\n#endif /* __ENET_PROTOCOL_H__ */\n\n"
  },
  {
    "path": "src/libraries/enet/libenet/include/enet/time.h",
    "content": "/** \n @file  time.h\n @brief ENet time constants and macros\n*/\n#ifndef __ENET_TIME_H__\n#define __ENET_TIME_H__\n\n#define ENET_TIME_OVERFLOW 86400000\n\n#define ENET_TIME_LESS(a, b) ((a) - (b) >= ENET_TIME_OVERFLOW)\n#define ENET_TIME_GREATER(a, b) ((b) - (a) >= ENET_TIME_OVERFLOW)\n#define ENET_TIME_LESS_EQUAL(a, b) (! ENET_TIME_GREATER (a, b))\n#define ENET_TIME_GREATER_EQUAL(a, b) (! ENET_TIME_LESS (a, b))\n\n#define ENET_TIME_DIFFERENCE(a, b) ((a) - (b) >= ENET_TIME_OVERFLOW ? (b) - (a) : (a) - (b))\n\n#endif /* __ENET_TIME_H__ */\n\n"
  },
  {
    "path": "src/libraries/enet/libenet/include/enet/types.h",
    "content": "/** \n @file  types.h\n @brief type definitions for ENet\n*/\n#ifndef __ENET_TYPES_H__\n#define __ENET_TYPES_H__\n\ntypedef unsigned char enet_uint8;       /**< unsigned 8-bit type  */\ntypedef unsigned short enet_uint16;     /**< unsigned 16-bit type */\ntypedef unsigned int enet_uint32;      /**< unsigned 32-bit type */\n\n#endif /* __ENET_TYPES_H__ */\n\n"
  },
  {
    "path": "src/libraries/enet/libenet/include/enet/unix.h",
    "content": "/** \n @file  unix.h\n @brief ENet Unix header\n*/\n#ifndef __ENET_UNIX_H__\n#define __ENET_UNIX_H__\n\n#include <stdlib.h>\n#include <sys/time.h>\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <unistd.h>\n\n#ifdef MSG_MAXIOVLEN\n#define ENET_BUFFER_MAXIMUM MSG_MAXIOVLEN\n#endif\n\ntypedef int ENetSocket;\n\n#define ENET_SOCKET_NULL -1\n\n#define ENET_HOST_TO_NET_16(value) (htons (value)) /**< macro that converts host to net byte-order of a 16-bit value */\n#define ENET_HOST_TO_NET_32(value) (htonl (value)) /**< macro that converts host to net byte-order of a 32-bit value */\n\n#define ENET_NET_TO_HOST_16(value) (ntohs (value)) /**< macro that converts net to host byte-order of a 16-bit value */\n#define ENET_NET_TO_HOST_32(value) (ntohl (value)) /**< macro that converts net to host byte-order of a 32-bit value */\n\ntypedef struct\n{\n    void * data;\n    size_t dataLength;\n} ENetBuffer;\n\n#define ENET_CALLBACK\n\n#define ENET_API extern\n\ntypedef fd_set ENetSocketSet;\n\n#define ENET_SOCKETSET_EMPTY(sockset)          FD_ZERO (& (sockset))\n#define ENET_SOCKETSET_ADD(sockset, socket)    FD_SET (socket, & (sockset))\n#define ENET_SOCKETSET_REMOVE(sockset, socket) FD_CLR (socket, & (sockset))\n#define ENET_SOCKETSET_CHECK(sockset, socket)  FD_ISSET (socket, & (sockset))\n    \n#endif /* __ENET_UNIX_H__ */\n\n"
  },
  {
    "path": "src/libraries/enet/libenet/include/enet/utility.h",
    "content": "/** \n @file  utility.h\n @brief ENet utility header\n*/\n#ifndef __ENET_UTILITY_H__\n#define __ENET_UTILITY_H__\n\n#define ENET_MAX(x, y) ((x) > (y) ? (x) : (y))\n#define ENET_MIN(x, y) ((x) < (y) ? (x) : (y))\n\n#endif /* __ENET_UTILITY_H__ */\n\n"
  },
  {
    "path": "src/libraries/enet/libenet/include/enet/win32.h",
    "content": "/** \n @file  win32.h\n @brief ENet Win32 header\n*/\n#ifndef __ENET_WIN32_H__\n#define __ENET_WIN32_H__\n\n#ifdef _MSC_VER\n#ifdef ENET_BUILDING_LIB\n#pragma warning (disable: 4267) // size_t to int conversion\n#pragma warning (disable: 4244) // 64bit to 32bit int\n#pragma warning (disable: 4018) // signed/unsigned mismatch\n#pragma warning (disable: 4146) // unary minus operator applied to unsigned type\n#endif\n#endif\n\n#include <stdlib.h>\n#include <winsock2.h>\n\ntypedef SOCKET ENetSocket;\n\n#define ENET_SOCKET_NULL INVALID_SOCKET\n\n#define ENET_HOST_TO_NET_16(value) (htons (value))\n#define ENET_HOST_TO_NET_32(value) (htonl (value))\n\n#define ENET_NET_TO_HOST_16(value) (ntohs (value))\n#define ENET_NET_TO_HOST_32(value) (ntohl (value))\n\ntypedef struct\n{\n    size_t dataLength;\n    void * data;\n} ENetBuffer;\n\n#define ENET_CALLBACK __cdecl\n\n#ifdef ENET_DLL\n#ifdef ENET_BUILDING_LIB\n#define ENET_API __declspec( dllexport )\n#else\n#define ENET_API __declspec( dllimport )\n#endif /* ENET_BUILDING_LIB */\n#else /* !ENET_DLL */\n#define ENET_API extern\n#endif /* ENET_DLL */\n\ntypedef fd_set ENetSocketSet;\n\n#define ENET_SOCKETSET_EMPTY(sockset)          FD_ZERO (& (sockset))\n#define ENET_SOCKETSET_ADD(sockset, socket)    FD_SET (socket, & (sockset))\n#define ENET_SOCKETSET_REMOVE(sockset, socket) FD_CLR (socket, & (sockset))\n#define ENET_SOCKETSET_CHECK(sockset, socket)  FD_ISSET (socket, & (sockset))\n\n#endif /* __ENET_WIN32_H__ */\n\n\n"
  },
  {
    "path": "src/libraries/enet/libenet/list.c",
    "content": "/** \n @file list.c\n @brief ENet linked list functions\n*/\n#define ENET_BUILDING_LIB 1\n#include \"enet/enet.h\"\n\n/** \n    @defgroup list ENet linked list utility functions\n    @ingroup private\n    @{\n*/\nvoid\nenet_list_clear (ENetList * list)\n{\n   list -> sentinel.next = & list -> sentinel;\n   list -> sentinel.previous = & list -> sentinel;\n}\n\nENetListIterator\nenet_list_insert (ENetListIterator position, void * data)\n{\n   ENetListIterator result = (ENetListIterator) data;\n\n   result -> previous = position -> previous;\n   result -> next = position;\n\n   result -> previous -> next = result;\n   position -> previous = result;\n\n   return result;\n}\n\nvoid *\nenet_list_remove (ENetListIterator position)\n{\n   position -> previous -> next = position -> next;\n   position -> next -> previous = position -> previous;\n\n   return position;\n}\n\nENetListIterator\nenet_list_move (ENetListIterator position, void * dataFirst, void * dataLast)\n{\n   ENetListIterator first = (ENetListIterator) dataFirst,\n                    last = (ENetListIterator) dataLast;\n\n   first -> previous -> next = last -> next;\n   last -> next -> previous = first -> previous;\n\n   first -> previous = position -> previous;\n   last -> next = position;\n\n   first -> previous -> next = first;\n   position -> previous = last;\n    \n   return first;\n}\n\nsize_t\nenet_list_size (ENetList * list)\n{\n   size_t size = 0;\n   ENetListIterator position;\n\n   for (position = enet_list_begin (list);\n        position != enet_list_end (list);\n        position = enet_list_next (position))\n     ++ size;\n   \n   return size;\n}\n\n/** @} */\n"
  },
  {
    "path": "src/libraries/enet/libenet/packet.c",
    "content": "/** \n @file  packet.c\n @brief ENet packet management functions\n*/\n#include <string.h>\n#define ENET_BUILDING_LIB 1\n#include \"enet/enet.h\"\n\n/** @defgroup Packet ENet packet functions \n    @{ \n*/\n\n/** Creates a packet that may be sent to a peer.\n    @param data         initial contents of the packet's data; the packet's data will remain uninitialized if data is NULL.\n    @param dataLength   size of the data allocated for this packet\n    @param flags        flags for this packet as described for the ENetPacket structure.\n    @returns the packet on success, NULL on failure\n*/\nENetPacket *\nenet_packet_create (const void * data, size_t dataLength, enet_uint32 flags)\n{\n    ENetPacket * packet = (ENetPacket *) enet_malloc (sizeof (ENetPacket));\n    if (packet == NULL)\n      return NULL;\n\n    if (flags & ENET_PACKET_FLAG_NO_ALLOCATE)\n      packet -> data = (enet_uint8 *) data;\n    else\n    if (dataLength <= 0)\n      packet -> data = NULL;\n    else\n    {\n       packet -> data = (enet_uint8 *) enet_malloc (dataLength);\n       if (packet -> data == NULL)\n       {\n          enet_free (packet);\n          return NULL;\n       }\n\n       if (data != NULL)\n         memcpy (packet -> data, data, dataLength);\n    }\n\n    packet -> referenceCount = 0;\n    packet -> flags = flags;\n    packet -> dataLength = dataLength;\n    packet -> freeCallback = NULL;\n    packet -> userData = NULL;\n\n    return packet;\n}\n\n/** Destroys the packet and deallocates its data.\n    @param packet packet to be destroyed\n*/\nvoid\nenet_packet_destroy (ENetPacket * packet)\n{\n    if (packet == NULL)\n      return;\n\n    if (packet -> freeCallback != NULL)\n      (* packet -> freeCallback) (packet);\n    if (! (packet -> flags & ENET_PACKET_FLAG_NO_ALLOCATE) &&\n        packet -> data != NULL)\n      enet_free (packet -> data);\n    enet_free (packet);\n}\n\n/** Attempts to resize the data in the packet to length specified in the \n    dataLength parameter \n    @param packet packet to resize\n    @param dataLength new size for the packet data\n    @returns 0 on success, < 0 on failure\n*/\nint\nenet_packet_resize (ENetPacket * packet, size_t dataLength)\n{\n    enet_uint8 * newData;\n   \n    if (dataLength <= packet -> dataLength || (packet -> flags & ENET_PACKET_FLAG_NO_ALLOCATE))\n    {\n       packet -> dataLength = dataLength;\n\n       return 0;\n    }\n\n    newData = (enet_uint8 *) enet_malloc (dataLength);\n    if (newData == NULL)\n      return -1;\n\n    memcpy (newData, packet -> data, packet -> dataLength);\n    enet_free (packet -> data);\n    \n    packet -> data = newData;\n    packet -> dataLength = dataLength;\n\n    return 0;\n}\n\nstatic int initializedCRC32 = 0;\nstatic enet_uint32 crcTable [256];\n\nstatic enet_uint32 \nreflect_crc (int val, int bits)\n{\n    int result = 0, bit;\n\n    for (bit = 0; bit < bits; bit ++)\n    {\n        if(val & 1) result |= 1 << (bits - 1 - bit); \n        val >>= 1;\n    }\n\n    return result;\n}\n\nstatic void \ninitialize_crc32 (void)\n{\n    int byte;\n\n    for (byte = 0; byte < 256; ++ byte)\n    {\n        enet_uint32 crc = reflect_crc (byte, 8) << 24;\n        int offset;\n\n        for(offset = 0; offset < 8; ++ offset)\n        {\n            if (crc & 0x80000000)\n                crc = (crc << 1) ^ 0x04c11db7;\n            else\n                crc <<= 1;\n        }\n\n        crcTable [byte] = reflect_crc (crc, 32);\n    }\n\n    initializedCRC32 = 1;\n}\n    \nenet_uint32\nenet_crc32 (const ENetBuffer * buffers, size_t bufferCount)\n{\n    enet_uint32 crc = 0xFFFFFFFF;\n    \n    if (! initializedCRC32) initialize_crc32 ();\n\n    while (bufferCount -- > 0)\n    {\n        const enet_uint8 * data = (const enet_uint8 *) buffers -> data,\n                         * dataEnd = & data [buffers -> dataLength];\n\n        while (data < dataEnd)\n        {\n            crc = (crc >> 8) ^ crcTable [(crc & 0xFF) ^ *data++];        \n        }\n\n        ++ buffers;\n    }\n\n    return ENET_HOST_TO_NET_32 (~ crc);\n}\n\n/** @} */\n"
  },
  {
    "path": "src/libraries/enet/libenet/peer.c",
    "content": "/** \n @file  peer.c\n @brief ENet peer management functions\n*/\n#include <string.h>\n#define ENET_BUILDING_LIB 1\n#include \"enet/enet.h\"\n\n/** @defgroup peer ENet peer functions \n    @{\n*/\n\n/** Configures throttle parameter for a peer.\n\n    Unreliable packets are dropped by ENet in response to the varying conditions\n    of the Internet connection to the peer.  The throttle represents a probability\n    that an unreliable packet should not be dropped and thus sent by ENet to the peer.\n    The lowest mean round trip time from the sending of a reliable packet to the\n    receipt of its acknowledgement is measured over an amount of time specified by\n    the interval parameter in milliseconds.  If a measured round trip time happens to\n    be significantly less than the mean round trip time measured over the interval, \n    then the throttle probability is increased to allow more traffic by an amount\n    specified in the acceleration parameter, which is a ratio to the ENET_PEER_PACKET_THROTTLE_SCALE\n    constant.  If a measured round trip time happens to be significantly greater than\n    the mean round trip time measured over the interval, then the throttle probability\n    is decreased to limit traffic by an amount specified in the deceleration parameter, which\n    is a ratio to the ENET_PEER_PACKET_THROTTLE_SCALE constant.  When the throttle has\n    a value of ENET_PEER_PACKET_THROTTLE_SCALE, no unreliable packets are dropped by \n    ENet, and so 100% of all unreliable packets will be sent.  When the throttle has a\n    value of 0, all unreliable packets are dropped by ENet, and so 0% of all unreliable\n    packets will be sent.  Intermediate values for the throttle represent intermediate\n    probabilities between 0% and 100% of unreliable packets being sent.  The bandwidth\n    limits of the local and foreign hosts are taken into account to determine a \n    sensible limit for the throttle probability above which it should not raise even in\n    the best of conditions.\n\n    @param peer peer to configure \n    @param interval interval, in milliseconds, over which to measure lowest mean RTT; the default value is ENET_PEER_PACKET_THROTTLE_INTERVAL.\n    @param acceleration rate at which to increase the throttle probability as mean RTT declines\n    @param deceleration rate at which to decrease the throttle probability as mean RTT increases\n*/\nvoid\nenet_peer_throttle_configure (ENetPeer * peer, enet_uint32 interval, enet_uint32 acceleration, enet_uint32 deceleration)\n{\n    ENetProtocol command;\n\n    peer -> packetThrottleInterval = interval;\n    peer -> packetThrottleAcceleration = acceleration;\n    peer -> packetThrottleDeceleration = deceleration;\n\n    command.header.command = ENET_PROTOCOL_COMMAND_THROTTLE_CONFIGURE | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE;\n    command.header.channelID = 0xFF;\n\n    command.throttleConfigure.packetThrottleInterval = ENET_HOST_TO_NET_32 (interval);\n    command.throttleConfigure.packetThrottleAcceleration = ENET_HOST_TO_NET_32 (acceleration);\n    command.throttleConfigure.packetThrottleDeceleration = ENET_HOST_TO_NET_32 (deceleration);\n\n    enet_peer_queue_outgoing_command (peer, & command, NULL, 0, 0);\n}\n\nint\nenet_peer_throttle (ENetPeer * peer, enet_uint32 rtt)\n{\n    if (peer -> lastRoundTripTime <= peer -> lastRoundTripTimeVariance)\n    {\n        peer -> packetThrottle = peer -> packetThrottleLimit;\n    }\n    else\n    if (rtt < peer -> lastRoundTripTime)\n    {\n        peer -> packetThrottle += peer -> packetThrottleAcceleration;\n\n        if (peer -> packetThrottle > peer -> packetThrottleLimit)\n          peer -> packetThrottle = peer -> packetThrottleLimit;\n\n        return 1;\n    }\n    else\n    if (rtt > peer -> lastRoundTripTime + 2 * peer -> lastRoundTripTimeVariance)\n    {\n        if (peer -> packetThrottle > peer -> packetThrottleDeceleration)\n          peer -> packetThrottle -= peer -> packetThrottleDeceleration;\n        else\n          peer -> packetThrottle = 0;\n\n        return -1;\n    }\n\n    return 0;\n}\n\n/** Queues a packet to be sent.\n    @param peer destination for the packet\n    @param channelID channel on which to send\n    @param packet packet to send\n    @retval 0 on success\n    @retval < 0 on failure\n*/\nint\nenet_peer_send (ENetPeer * peer, enet_uint8 channelID, ENetPacket * packet)\n{\n   ENetChannel * channel = & peer -> channels [channelID];\n   ENetProtocol command;\n   size_t fragmentLength;\n\n   if (peer -> state != ENET_PEER_STATE_CONNECTED ||\n       channelID >= peer -> channelCount ||\n       packet -> dataLength > peer -> host -> maximumPacketSize)\n     return -1;\n\n   fragmentLength = peer -> mtu - sizeof (ENetProtocolHeader) - sizeof (ENetProtocolSendFragment);\n   if (peer -> host -> checksum != NULL)\n     fragmentLength -= sizeof(enet_uint32);\n\n   if (packet -> dataLength > fragmentLength)\n   {\n      enet_uint32 fragmentCount = (packet -> dataLength + fragmentLength - 1) / fragmentLength,\n             fragmentNumber,\n             fragmentOffset;\n      enet_uint8 commandNumber;\n      enet_uint16 startSequenceNumber; \n      ENetList fragments;\n      ENetOutgoingCommand * fragment;\n\n      if (fragmentCount > ENET_PROTOCOL_MAXIMUM_FRAGMENT_COUNT)\n        return -1;\n\n      if ((packet -> flags & (ENET_PACKET_FLAG_RELIABLE | ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT)) == ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT &&\n          channel -> outgoingUnreliableSequenceNumber < 0xFFFF)\n      {\n         commandNumber = ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT;\n         startSequenceNumber = ENET_HOST_TO_NET_16 (channel -> outgoingUnreliableSequenceNumber + 1);\n      }\n      else\n      {\n         commandNumber = ENET_PROTOCOL_COMMAND_SEND_FRAGMENT | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE;\n         startSequenceNumber = ENET_HOST_TO_NET_16 (channel -> outgoingReliableSequenceNumber + 1);\n      }\n        \n      enet_list_clear (& fragments);\n\n      for (fragmentNumber = 0,\n             fragmentOffset = 0;\n           fragmentOffset < packet -> dataLength;\n           ++ fragmentNumber,\n             fragmentOffset += fragmentLength)\n      {\n         if (packet -> dataLength - fragmentOffset < fragmentLength)\n           fragmentLength = packet -> dataLength - fragmentOffset;\n\n         fragment = (ENetOutgoingCommand *) enet_malloc (sizeof (ENetOutgoingCommand));\n         if (fragment == NULL)\n         {\n            while (! enet_list_empty (& fragments))\n            {\n               fragment = (ENetOutgoingCommand *) enet_list_remove (enet_list_begin (& fragments));\n               \n               enet_free (fragment);\n            }\n            \n            return -1;\n         }\n         \n         fragment -> fragmentOffset = fragmentOffset;\n         fragment -> fragmentLength = fragmentLength;\n         fragment -> packet = packet;\n         fragment -> command.header.command = commandNumber;\n         fragment -> command.header.channelID = channelID;\n         fragment -> command.sendFragment.startSequenceNumber = startSequenceNumber;\n         fragment -> command.sendFragment.dataLength = ENET_HOST_TO_NET_16 (fragmentLength);\n         fragment -> command.sendFragment.fragmentCount = ENET_HOST_TO_NET_32 (fragmentCount);\n         fragment -> command.sendFragment.fragmentNumber = ENET_HOST_TO_NET_32 (fragmentNumber);\n         fragment -> command.sendFragment.totalLength = ENET_HOST_TO_NET_32 (packet -> dataLength);\n         fragment -> command.sendFragment.fragmentOffset = ENET_NET_TO_HOST_32 (fragmentOffset);\n        \n         enet_list_insert (enet_list_end (& fragments), fragment);\n      }\n\n      packet -> referenceCount += fragmentNumber;\n\n      while (! enet_list_empty (& fragments))\n      {\n         fragment = (ENetOutgoingCommand *) enet_list_remove (enet_list_begin (& fragments));\n \n         enet_peer_setup_outgoing_command (peer, fragment);\n      }\n\n      return 0;\n   }\n\n   command.header.channelID = channelID;\n\n   if ((packet -> flags & (ENET_PACKET_FLAG_RELIABLE | ENET_PACKET_FLAG_UNSEQUENCED)) == ENET_PACKET_FLAG_UNSEQUENCED)\n   {\n      command.header.command = ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED | ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED;\n      command.sendUnsequenced.dataLength = ENET_HOST_TO_NET_16 (packet -> dataLength);\n   }\n   else \n   if (packet -> flags & ENET_PACKET_FLAG_RELIABLE || channel -> outgoingUnreliableSequenceNumber >= 0xFFFF)\n   {\n      command.header.command = ENET_PROTOCOL_COMMAND_SEND_RELIABLE | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE;\n      command.sendReliable.dataLength = ENET_HOST_TO_NET_16 (packet -> dataLength);\n   }\n   else\n   {\n      command.header.command = ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE;\n      command.sendUnreliable.dataLength = ENET_HOST_TO_NET_16 (packet -> dataLength);\n   }\n\n   if (enet_peer_queue_outgoing_command (peer, & command, packet, 0, packet -> dataLength) == NULL)\n     return -1;\n\n   return 0;\n}\n\n/** Attempts to dequeue any incoming queued packet.\n    @param peer peer to dequeue packets from\n    @param channelID holds the channel ID of the channel the packet was received on success\n    @returns a pointer to the packet, or NULL if there are no available incoming queued packets\n*/\nENetPacket *\nenet_peer_receive (ENetPeer * peer, enet_uint8 * channelID)\n{\n   ENetIncomingCommand * incomingCommand;\n   ENetPacket * packet;\n   \n   if (enet_list_empty (& peer -> dispatchedCommands))\n     return NULL;\n\n   incomingCommand = (ENetIncomingCommand *) enet_list_remove (enet_list_begin (& peer -> dispatchedCommands));\n\n   if (channelID != NULL)\n     * channelID = incomingCommand -> command.header.channelID;\n\n   packet = incomingCommand -> packet;\n\n   -- packet -> referenceCount;\n\n   if (incomingCommand -> fragments != NULL)\n     enet_free (incomingCommand -> fragments);\n\n   enet_free (incomingCommand);\n\n   peer -> totalWaitingData -= packet -> dataLength;\n\n   return packet;\n}\n\nstatic void\nenet_peer_reset_outgoing_commands (ENetList * queue)\n{\n    ENetOutgoingCommand * outgoingCommand;\n\n    while (! enet_list_empty (queue))\n    {\n       outgoingCommand = (ENetOutgoingCommand *) enet_list_remove (enet_list_begin (queue));\n\n       if (outgoingCommand -> packet != NULL)\n       {\n          -- outgoingCommand -> packet -> referenceCount;\n\n          if (outgoingCommand -> packet -> referenceCount == 0)\n            enet_packet_destroy (outgoingCommand -> packet);\n       }\n\n       enet_free (outgoingCommand);\n    }\n}\n\nstatic void\nenet_peer_remove_incoming_commands (ENetList * queue, ENetListIterator startCommand, ENetListIterator endCommand)\n{\n    ENetListIterator currentCommand;    \n    \n    for (currentCommand = startCommand; currentCommand != endCommand; )\n    {\n       ENetIncomingCommand * incomingCommand = (ENetIncomingCommand *) currentCommand;\n\n       currentCommand = enet_list_next (currentCommand);\n\n       enet_list_remove (& incomingCommand -> incomingCommandList);\n \n       if (incomingCommand -> packet != NULL)\n       {\n          -- incomingCommand -> packet -> referenceCount;\n\n          if (incomingCommand -> packet -> referenceCount == 0)\n            enet_packet_destroy (incomingCommand -> packet);\n       }\n\n       if (incomingCommand -> fragments != NULL)\n         enet_free (incomingCommand -> fragments);\n\n       enet_free (incomingCommand);\n    }\n}\n\nstatic void\nenet_peer_reset_incoming_commands (ENetList * queue)\n{\n    enet_peer_remove_incoming_commands(queue, enet_list_begin (queue), enet_list_end (queue));\n}\n \nvoid\nenet_peer_reset_queues (ENetPeer * peer)\n{\n    ENetChannel * channel;\n\n    if (peer -> needsDispatch)\n    {\n       enet_list_remove (& peer -> dispatchList);\n\n       peer -> needsDispatch = 0;\n    }\n\n    while (! enet_list_empty (& peer -> acknowledgements))\n      enet_free (enet_list_remove (enet_list_begin (& peer -> acknowledgements)));\n\n    enet_peer_reset_outgoing_commands (& peer -> sentReliableCommands);\n    enet_peer_reset_outgoing_commands (& peer -> sentUnreliableCommands);\n    enet_peer_reset_outgoing_commands (& peer -> outgoingReliableCommands);\n    enet_peer_reset_outgoing_commands (& peer -> outgoingUnreliableCommands);\n    enet_peer_reset_incoming_commands (& peer -> dispatchedCommands);\n\n    if (peer -> channels != NULL && peer -> channelCount > 0)\n    {\n        for (channel = peer -> channels;\n             channel < & peer -> channels [peer -> channelCount];\n             ++ channel)\n        {\n            enet_peer_reset_incoming_commands (& channel -> incomingReliableCommands);\n            enet_peer_reset_incoming_commands (& channel -> incomingUnreliableCommands);\n        }\n\n        enet_free (peer -> channels);\n    }\n\n    peer -> channels = NULL;\n    peer -> channelCount = 0;\n}\n\nvoid\nenet_peer_on_connect (ENetPeer * peer)\n{\n    if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER)\n    {\n        if (peer -> incomingBandwidth != 0)\n          ++ peer -> host -> bandwidthLimitedPeers;\n\n        ++ peer -> host -> connectedPeers;\n    }\n}\n\nvoid\nenet_peer_on_disconnect (ENetPeer * peer)\n{\n    if (peer -> state == ENET_PEER_STATE_CONNECTED || peer -> state == ENET_PEER_STATE_DISCONNECT_LATER)\n    {\n        if (peer -> incomingBandwidth != 0)\n          -- peer -> host -> bandwidthLimitedPeers;\n\n        -- peer -> host -> connectedPeers;\n    }\n}\n\n/** Forcefully disconnects a peer.\n    @param peer peer to forcefully disconnect\n    @remarks The foreign host represented by the peer is not notified of the disconnection and will timeout\n    on its connection to the local host.\n*/\nvoid\nenet_peer_reset (ENetPeer * peer)\n{\n    enet_peer_on_disconnect (peer);\n        \n    peer -> outgoingPeerID = ENET_PROTOCOL_MAXIMUM_PEER_ID;\n    peer -> connectID = 0;\n\n    peer -> state = ENET_PEER_STATE_DISCONNECTED;\n\n    peer -> incomingBandwidth = 0;\n    peer -> outgoingBandwidth = 0;\n    peer -> incomingBandwidthThrottleEpoch = 0;\n    peer -> outgoingBandwidthThrottleEpoch = 0;\n    peer -> incomingDataTotal = 0;\n    peer -> outgoingDataTotal = 0;\n    peer -> lastSendTime = 0;\n    peer -> lastReceiveTime = 0;\n    peer -> nextTimeout = 0;\n    peer -> earliestTimeout = 0;\n    peer -> packetLossEpoch = 0;\n    peer -> packetsSent = 0;\n    peer -> packetsLost = 0;\n    peer -> packetLoss = 0;\n    peer -> packetLossVariance = 0;\n    peer -> packetThrottle = ENET_PEER_DEFAULT_PACKET_THROTTLE;\n    peer -> packetThrottleLimit = ENET_PEER_PACKET_THROTTLE_SCALE;\n    peer -> packetThrottleCounter = 0;\n    peer -> packetThrottleEpoch = 0;\n    peer -> packetThrottleAcceleration = ENET_PEER_PACKET_THROTTLE_ACCELERATION;\n    peer -> packetThrottleDeceleration = ENET_PEER_PACKET_THROTTLE_DECELERATION;\n    peer -> packetThrottleInterval = ENET_PEER_PACKET_THROTTLE_INTERVAL;\n    peer -> pingInterval = ENET_PEER_PING_INTERVAL;\n    peer -> timeoutLimit = ENET_PEER_TIMEOUT_LIMIT;\n    peer -> timeoutMinimum = ENET_PEER_TIMEOUT_MINIMUM;\n    peer -> timeoutMaximum = ENET_PEER_TIMEOUT_MAXIMUM;\n    peer -> lastRoundTripTime = ENET_PEER_DEFAULT_ROUND_TRIP_TIME;\n    peer -> lowestRoundTripTime = ENET_PEER_DEFAULT_ROUND_TRIP_TIME;\n    peer -> lastRoundTripTimeVariance = 0;\n    peer -> highestRoundTripTimeVariance = 0;\n    peer -> roundTripTime = ENET_PEER_DEFAULT_ROUND_TRIP_TIME;\n    peer -> roundTripTimeVariance = 0;\n    peer -> mtu = peer -> host -> mtu;\n    peer -> reliableDataInTransit = 0;\n    peer -> outgoingReliableSequenceNumber = 0;\n    peer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE;\n    peer -> incomingUnsequencedGroup = 0;\n    peer -> outgoingUnsequencedGroup = 0;\n    peer -> eventData = 0;\n    peer -> totalWaitingData = 0;\n\n    memset (peer -> unsequencedWindow, 0, sizeof (peer -> unsequencedWindow));\n    \n    enet_peer_reset_queues (peer);\n}\n\n/** Sends a ping request to a peer.\n    @param peer destination for the ping request\n    @remarks ping requests factor into the mean round trip time as designated by the \n    roundTripTime field in the ENetPeer structure.  ENet automatically pings all connected\n    peers at regular intervals, however, this function may be called to ensure more\n    frequent ping requests.\n*/\nvoid\nenet_peer_ping (ENetPeer * peer)\n{\n    ENetProtocol command;\n\n    if (peer -> state != ENET_PEER_STATE_CONNECTED)\n      return;\n\n    command.header.command = ENET_PROTOCOL_COMMAND_PING | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE;\n    command.header.channelID = 0xFF;\n   \n    enet_peer_queue_outgoing_command (peer, & command, NULL, 0, 0);\n}\n\n/** Sets the interval at which pings will be sent to a peer. \n    \n    Pings are used both to monitor the liveness of the connection and also to dynamically\n    adjust the throttle during periods of low traffic so that the throttle has reasonable\n    responsiveness during traffic spikes.\n\n    @param peer the peer to adjust\n    @param pingInterval the interval at which to send pings; defaults to ENET_PEER_PING_INTERVAL if 0\n*/\nvoid\nenet_peer_ping_interval (ENetPeer * peer, enet_uint32 pingInterval)\n{\n    peer -> pingInterval = pingInterval ? pingInterval : ENET_PEER_PING_INTERVAL;\n}\n\n/** Sets the timeout parameters for a peer.\n\n    The timeout parameter control how and when a peer will timeout from a failure to acknowledge\n    reliable traffic. Timeout values use an exponential backoff mechanism, where if a reliable\n    packet is not acknowledge within some multiple of the average RTT plus a variance tolerance, \n    the timeout will be doubled until it reaches a set limit. If the timeout is thus at this\n    limit and reliable packets have been sent but not acknowledged within a certain minimum time \n    period, the peer will be disconnected. Alternatively, if reliable packets have been sent\n    but not acknowledged for a certain maximum time period, the peer will be disconnected regardless\n    of the current timeout limit value.\n    \n    @param peer the peer to adjust\n    @param timeoutLimit the timeout limit; defaults to ENET_PEER_TIMEOUT_LIMIT if 0\n    @param timeoutMinimum the timeout minimum; defaults to ENET_PEER_TIMEOUT_MINIMUM if 0\n    @param timeoutMaximum the timeout maximum; defaults to ENET_PEER_TIMEOUT_MAXIMUM if 0\n*/\n\nvoid\nenet_peer_timeout (ENetPeer * peer, enet_uint32 timeoutLimit, enet_uint32 timeoutMinimum, enet_uint32 timeoutMaximum)\n{\n    peer -> timeoutLimit = timeoutLimit ? timeoutLimit : ENET_PEER_TIMEOUT_LIMIT;\n    peer -> timeoutMinimum = timeoutMinimum ? timeoutMinimum : ENET_PEER_TIMEOUT_MINIMUM;\n    peer -> timeoutMaximum = timeoutMaximum ? timeoutMaximum : ENET_PEER_TIMEOUT_MAXIMUM;\n}\n\n/** Force an immediate disconnection from a peer.\n    @param peer peer to disconnect\n    @param data data describing the disconnection\n    @remarks No ENET_EVENT_DISCONNECT event will be generated. The foreign peer is not\n    guaranteed to receive the disconnect notification, and is reset immediately upon\n    return from this function.\n*/\nvoid\nenet_peer_disconnect_now (ENetPeer * peer, enet_uint32 data)\n{\n    ENetProtocol command;\n\n    if (peer -> state == ENET_PEER_STATE_DISCONNECTED)\n      return;\n\n    if (peer -> state != ENET_PEER_STATE_ZOMBIE &&\n        peer -> state != ENET_PEER_STATE_DISCONNECTING)\n    {\n        enet_peer_reset_queues (peer);\n\n        command.header.command = ENET_PROTOCOL_COMMAND_DISCONNECT | ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED;\n        command.header.channelID = 0xFF;\n        command.disconnect.data = ENET_HOST_TO_NET_32 (data);\n\n        enet_peer_queue_outgoing_command (peer, & command, NULL, 0, 0);\n\n        enet_host_flush (peer -> host);\n    }\n\n    enet_peer_reset (peer);\n}\n\n/** Request a disconnection from a peer.\n    @param peer peer to request a disconnection\n    @param data data describing the disconnection\n    @remarks An ENET_EVENT_DISCONNECT event will be generated by enet_host_service()\n    once the disconnection is complete.\n*/\nvoid\nenet_peer_disconnect (ENetPeer * peer, enet_uint32 data)\n{\n    ENetProtocol command;\n\n    if (peer -> state == ENET_PEER_STATE_DISCONNECTING ||\n        peer -> state == ENET_PEER_STATE_DISCONNECTED ||\n        peer -> state == ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT ||\n        peer -> state == ENET_PEER_STATE_ZOMBIE)\n      return;\n\n    enet_peer_reset_queues (peer);\n\n    command.header.command = ENET_PROTOCOL_COMMAND_DISCONNECT;\n    command.header.channelID = 0xFF;\n    command.disconnect.data = ENET_HOST_TO_NET_32 (data);\n\n    if (peer -> state == ENET_PEER_STATE_CONNECTED || peer -> state == ENET_PEER_STATE_DISCONNECT_LATER)\n      command.header.command |= ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE;\n    else\n      command.header.command |= ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED;      \n    \n    enet_peer_queue_outgoing_command (peer, & command, NULL, 0, 0);\n\n    if (peer -> state == ENET_PEER_STATE_CONNECTED || peer -> state == ENET_PEER_STATE_DISCONNECT_LATER)\n    {\n        enet_peer_on_disconnect (peer);\n\n        peer -> state = ENET_PEER_STATE_DISCONNECTING;\n    }\n    else\n    {\n        enet_host_flush (peer -> host);\n        enet_peer_reset (peer);\n    }\n}\n\n/** Request a disconnection from a peer, but only after all queued outgoing packets are sent.\n    @param peer peer to request a disconnection\n    @param data data describing the disconnection\n    @remarks An ENET_EVENT_DISCONNECT event will be generated by enet_host_service()\n    once the disconnection is complete.\n*/\nvoid\nenet_peer_disconnect_later (ENetPeer * peer, enet_uint32 data)\n{   \n    if ((peer -> state == ENET_PEER_STATE_CONNECTED || peer -> state == ENET_PEER_STATE_DISCONNECT_LATER) && \n        ! (enet_list_empty (& peer -> outgoingReliableCommands) &&\n           enet_list_empty (& peer -> outgoingUnreliableCommands) && \n           enet_list_empty (& peer -> sentReliableCommands)))\n    {\n        peer -> state = ENET_PEER_STATE_DISCONNECT_LATER;\n        peer -> eventData = data;\n    }\n    else\n      enet_peer_disconnect (peer, data);\n}\n\nENetAcknowledgement *\nenet_peer_queue_acknowledgement (ENetPeer * peer, const ENetProtocol * command, enet_uint16 sentTime)\n{\n    ENetAcknowledgement * acknowledgement;\n\n    if (command -> header.channelID < peer -> channelCount)\n    {\n        ENetChannel * channel = & peer -> channels [command -> header.channelID];\n        enet_uint16 reliableWindow = command -> header.reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE,\n                    currentWindow = channel -> incomingReliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE;\n\n        if (command -> header.reliableSequenceNumber < channel -> incomingReliableSequenceNumber)\n           reliableWindow += ENET_PEER_RELIABLE_WINDOWS;\n\n        if (reliableWindow >= currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS - 1 && reliableWindow <= currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS)\n          return NULL;\n    }\n\n    acknowledgement = (ENetAcknowledgement *) enet_malloc (sizeof (ENetAcknowledgement));\n    if (acknowledgement == NULL)\n      return NULL;\n\n    peer -> outgoingDataTotal += sizeof (ENetProtocolAcknowledge);\n\n    acknowledgement -> sentTime = sentTime;\n    acknowledgement -> command = * command;\n    \n    enet_list_insert (enet_list_end (& peer -> acknowledgements), acknowledgement);\n    \n    return acknowledgement;\n}\n\nvoid\nenet_peer_setup_outgoing_command (ENetPeer * peer, ENetOutgoingCommand * outgoingCommand)\n{\n    ENetChannel * channel = & peer -> channels [outgoingCommand -> command.header.channelID];\n    \n    peer -> outgoingDataTotal += enet_protocol_command_size (outgoingCommand -> command.header.command) + outgoingCommand -> fragmentLength;\n\n    if (outgoingCommand -> command.header.channelID == 0xFF)\n    {\n       ++ peer -> outgoingReliableSequenceNumber;\n\n       outgoingCommand -> reliableSequenceNumber = peer -> outgoingReliableSequenceNumber;\n       outgoingCommand -> unreliableSequenceNumber = 0;\n    }\n    else\n    if (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE)\n    {\n       ++ channel -> outgoingReliableSequenceNumber;\n       channel -> outgoingUnreliableSequenceNumber = 0;\n\n       outgoingCommand -> reliableSequenceNumber = channel -> outgoingReliableSequenceNumber;\n       outgoingCommand -> unreliableSequenceNumber = 0;\n    }\n    else\n    if (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED)\n    {\n       ++ peer -> outgoingUnsequencedGroup;\n\n       outgoingCommand -> reliableSequenceNumber = 0;\n       outgoingCommand -> unreliableSequenceNumber = 0;\n    }\n    else\n    {\n       if (outgoingCommand -> fragmentOffset == 0)\n         ++ channel -> outgoingUnreliableSequenceNumber;\n        \n       outgoingCommand -> reliableSequenceNumber = channel -> outgoingReliableSequenceNumber;\n       outgoingCommand -> unreliableSequenceNumber = channel -> outgoingUnreliableSequenceNumber;\n    }\n   \n    outgoingCommand -> sendAttempts = 0;\n    outgoingCommand -> sentTime = 0;\n    outgoingCommand -> roundTripTimeout = 0;\n    outgoingCommand -> roundTripTimeoutLimit = 0;\n    outgoingCommand -> command.header.reliableSequenceNumber = ENET_HOST_TO_NET_16 (outgoingCommand -> reliableSequenceNumber);\n\n    switch (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK)\n    {\n    case ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE:\n        outgoingCommand -> command.sendUnreliable.unreliableSequenceNumber = ENET_HOST_TO_NET_16 (outgoingCommand -> unreliableSequenceNumber);\n        break;\n\n    case ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED:\n        outgoingCommand -> command.sendUnsequenced.unsequencedGroup = ENET_HOST_TO_NET_16 (peer -> outgoingUnsequencedGroup);\n        break;\n    \n    default:\n        break;\n    }\n\n    if (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE)\n      enet_list_insert (enet_list_end (& peer -> outgoingReliableCommands), outgoingCommand);\n    else\n      enet_list_insert (enet_list_end (& peer -> outgoingUnreliableCommands), outgoingCommand);\n}\n\nENetOutgoingCommand *\nenet_peer_queue_outgoing_command (ENetPeer * peer, const ENetProtocol * command, ENetPacket * packet, enet_uint32 offset, enet_uint16 length)\n{\n    ENetOutgoingCommand * outgoingCommand = (ENetOutgoingCommand *) enet_malloc (sizeof (ENetOutgoingCommand));\n    if (outgoingCommand == NULL)\n      return NULL;\n\n    outgoingCommand -> command = * command;\n    outgoingCommand -> fragmentOffset = offset;\n    outgoingCommand -> fragmentLength = length;\n    outgoingCommand -> packet = packet;\n    if (packet != NULL)\n      ++ packet -> referenceCount;\n\n    enet_peer_setup_outgoing_command (peer, outgoingCommand);\n\n    return outgoingCommand;\n}\n\nvoid\nenet_peer_dispatch_incoming_unreliable_commands (ENetPeer * peer, ENetChannel * channel)\n{\n    ENetListIterator droppedCommand, startCommand, currentCommand;\n\n    for (droppedCommand = startCommand = currentCommand = enet_list_begin (& channel -> incomingUnreliableCommands);\n         currentCommand != enet_list_end (& channel -> incomingUnreliableCommands);\n         currentCommand = enet_list_next (currentCommand))\n    {\n       ENetIncomingCommand * incomingCommand = (ENetIncomingCommand *) currentCommand;\n\n       if ((incomingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) == ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED)\n         continue;\n\n       if (incomingCommand -> reliableSequenceNumber == channel -> incomingReliableSequenceNumber)\n       {\n          if (incomingCommand -> fragmentsRemaining <= 0)\n          {\n             channel -> incomingUnreliableSequenceNumber = incomingCommand -> unreliableSequenceNumber;\n             continue;\n          }\n\n          if (startCommand != currentCommand)\n          {\n             enet_list_move (enet_list_end (& peer -> dispatchedCommands), startCommand, enet_list_previous (currentCommand));\n\n             if (! peer -> needsDispatch)\n             {\n                enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList);\n\n                peer -> needsDispatch = 1;\n             }\n\n             droppedCommand = currentCommand;\n          }\n          else\n          if (droppedCommand != currentCommand)\n            droppedCommand = enet_list_previous (currentCommand);\n       }\n       else \n       {\n          enet_uint16 reliableWindow = incomingCommand -> reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE,\n                      currentWindow = channel -> incomingReliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE;\n          if (incomingCommand -> reliableSequenceNumber < channel -> incomingReliableSequenceNumber)\n            reliableWindow += ENET_PEER_RELIABLE_WINDOWS;\n          if (reliableWindow >= currentWindow && reliableWindow < currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS - 1)\n            break;\n\n          droppedCommand = enet_list_next (currentCommand);\n\n          if (startCommand != currentCommand)\n          {\n             enet_list_move (enet_list_end (& peer -> dispatchedCommands), startCommand, enet_list_previous (currentCommand));\n\n             if (! peer -> needsDispatch)\n             {\n                enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList);\n\n                peer -> needsDispatch = 1;\n             }\n          }\n       }\n          \n       startCommand = enet_list_next (currentCommand);\n    }\n\n    if (startCommand != currentCommand)\n    {\n       enet_list_move (enet_list_end (& peer -> dispatchedCommands), startCommand, enet_list_previous (currentCommand));\n\n       if (! peer -> needsDispatch)\n       {\n           enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList);\n\n           peer -> needsDispatch = 1;\n       }\n\n       droppedCommand = currentCommand;\n    }\n\n    enet_peer_remove_incoming_commands (& channel -> incomingUnreliableCommands, enet_list_begin (& channel -> incomingUnreliableCommands), droppedCommand);\n}\n\nvoid\nenet_peer_dispatch_incoming_reliable_commands (ENetPeer * peer, ENetChannel * channel)\n{\n    ENetListIterator currentCommand;\n\n    for (currentCommand = enet_list_begin (& channel -> incomingReliableCommands);\n         currentCommand != enet_list_end (& channel -> incomingReliableCommands);\n         currentCommand = enet_list_next (currentCommand))\n    {\n       ENetIncomingCommand * incomingCommand = (ENetIncomingCommand *) currentCommand;\n         \n       if (incomingCommand -> fragmentsRemaining > 0 ||\n           incomingCommand -> reliableSequenceNumber != (enet_uint16) (channel -> incomingReliableSequenceNumber + 1))\n         break;\n\n       channel -> incomingReliableSequenceNumber = incomingCommand -> reliableSequenceNumber;\n\n       if (incomingCommand -> fragmentCount > 0)\n         channel -> incomingReliableSequenceNumber += incomingCommand -> fragmentCount - 1;\n    } \n\n    if (currentCommand == enet_list_begin (& channel -> incomingReliableCommands))\n      return;\n\n    channel -> incomingUnreliableSequenceNumber = 0;\n\n    enet_list_move (enet_list_end (& peer -> dispatchedCommands), enet_list_begin (& channel -> incomingReliableCommands), enet_list_previous (currentCommand));\n\n    if (! peer -> needsDispatch)\n    {\n       enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList);\n\n       peer -> needsDispatch = 1;\n    }\n\n    if (! enet_list_empty (& channel -> incomingUnreliableCommands))\n       enet_peer_dispatch_incoming_unreliable_commands (peer, channel);\n}\n\nENetIncomingCommand *\nenet_peer_queue_incoming_command (ENetPeer * peer, const ENetProtocol * command, const void * data, size_t dataLength, enet_uint32 flags, enet_uint32 fragmentCount)\n{\n    static ENetIncomingCommand dummyCommand;\n\n    ENetChannel * channel = & peer -> channels [command -> header.channelID];\n    enet_uint32 unreliableSequenceNumber = 0, reliableSequenceNumber = 0;\n    enet_uint16 reliableWindow, currentWindow;\n    ENetIncomingCommand * incomingCommand;\n    ENetListIterator currentCommand;\n    ENetPacket * packet = NULL;\n\n    if (peer -> state == ENET_PEER_STATE_DISCONNECT_LATER)\n      goto discardCommand;\n\n    if ((command -> header.command & ENET_PROTOCOL_COMMAND_MASK) != ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED)\n    {\n        reliableSequenceNumber = command -> header.reliableSequenceNumber;\n        reliableWindow = reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE;\n        currentWindow = channel -> incomingReliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE;\n\n        if (reliableSequenceNumber < channel -> incomingReliableSequenceNumber)\n           reliableWindow += ENET_PEER_RELIABLE_WINDOWS;\n\n        if (reliableWindow < currentWindow || reliableWindow >= currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS - 1)\n          goto discardCommand;\n    }\n                    \n    switch (command -> header.command & ENET_PROTOCOL_COMMAND_MASK)\n    {\n    case ENET_PROTOCOL_COMMAND_SEND_FRAGMENT:\n    case ENET_PROTOCOL_COMMAND_SEND_RELIABLE:\n       if (reliableSequenceNumber == channel -> incomingReliableSequenceNumber)\n         goto discardCommand;\n       \n       for (currentCommand = enet_list_previous (enet_list_end (& channel -> incomingReliableCommands));\n            currentCommand != enet_list_end (& channel -> incomingReliableCommands);\n            currentCommand = enet_list_previous (currentCommand))\n       {\n          incomingCommand = (ENetIncomingCommand *) currentCommand;\n\n          if (reliableSequenceNumber >= channel -> incomingReliableSequenceNumber)\n          {\n             if (incomingCommand -> reliableSequenceNumber < channel -> incomingReliableSequenceNumber)\n               continue;\n          }\n          else\n          if (incomingCommand -> reliableSequenceNumber >= channel -> incomingReliableSequenceNumber)\n            break;\n\n          if (incomingCommand -> reliableSequenceNumber <= reliableSequenceNumber)\n          {\n             if (incomingCommand -> reliableSequenceNumber < reliableSequenceNumber)\n               break;\n\n             goto discardCommand;\n          }\n       }\n       break;\n\n    case ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE:\n    case ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT:\n       unreliableSequenceNumber = ENET_NET_TO_HOST_16 (command -> sendUnreliable.unreliableSequenceNumber);\n\n       if (reliableSequenceNumber == channel -> incomingReliableSequenceNumber && \n           unreliableSequenceNumber <= channel -> incomingUnreliableSequenceNumber)\n         goto discardCommand;\n\n       for (currentCommand = enet_list_previous (enet_list_end (& channel -> incomingUnreliableCommands));\n            currentCommand != enet_list_end (& channel -> incomingUnreliableCommands);\n            currentCommand = enet_list_previous (currentCommand))\n       {\n          incomingCommand = (ENetIncomingCommand *) currentCommand;\n\n          if ((command -> header.command & ENET_PROTOCOL_COMMAND_MASK) == ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED)\n            continue;\n\n          if (reliableSequenceNumber >= channel -> incomingReliableSequenceNumber)\n          {\n             if (incomingCommand -> reliableSequenceNumber < channel -> incomingReliableSequenceNumber)\n               continue;\n          }\n          else\n          if (incomingCommand -> reliableSequenceNumber >= channel -> incomingReliableSequenceNumber)\n            break;\n\n          if (incomingCommand -> reliableSequenceNumber < reliableSequenceNumber)\n            break;\n\n          if (incomingCommand -> reliableSequenceNumber > reliableSequenceNumber)\n            continue;\n\n          if (incomingCommand -> unreliableSequenceNumber <= unreliableSequenceNumber)\n          {\n             if (incomingCommand -> unreliableSequenceNumber < unreliableSequenceNumber)\n               break;\n\n             goto discardCommand;\n          }\n       }\n       break;\n\n    case ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED:\n       currentCommand = enet_list_end (& channel -> incomingUnreliableCommands);\n       break;\n\n    default:\n       goto discardCommand;\n    }\n\n    if (peer -> totalWaitingData >= peer -> host -> maximumWaitingData)\n      goto notifyError;\n\n    packet = enet_packet_create (data, dataLength, flags);\n    if (packet == NULL)\n      goto notifyError;\n\n    incomingCommand = (ENetIncomingCommand *) enet_malloc (sizeof (ENetIncomingCommand));\n    if (incomingCommand == NULL)\n      goto notifyError;\n\n    incomingCommand -> reliableSequenceNumber = command -> header.reliableSequenceNumber;\n    incomingCommand -> unreliableSequenceNumber = unreliableSequenceNumber & 0xFFFF;\n    incomingCommand -> command = * command;\n    incomingCommand -> fragmentCount = fragmentCount;\n    incomingCommand -> fragmentsRemaining = fragmentCount;\n    incomingCommand -> packet = packet;\n    incomingCommand -> fragments = NULL;\n    \n    if (fragmentCount > 0)\n    { \n       if (fragmentCount <= ENET_PROTOCOL_MAXIMUM_FRAGMENT_COUNT)\n         incomingCommand -> fragments = (enet_uint32 *) enet_malloc ((fragmentCount + 31) / 32 * sizeof (enet_uint32));\n       if (incomingCommand -> fragments == NULL)\n       {\n          enet_free (incomingCommand);\n\n          goto notifyError;\n       }\n       memset (incomingCommand -> fragments, 0, (fragmentCount + 31) / 32 * sizeof (enet_uint32));\n    }\n\n    if (packet != NULL)\n    {\n       ++ packet -> referenceCount;\n      \n       peer -> totalWaitingData += packet -> dataLength;\n    }\n\n    enet_list_insert (enet_list_next (currentCommand), incomingCommand);\n\n    switch (command -> header.command & ENET_PROTOCOL_COMMAND_MASK)\n    {\n    case ENET_PROTOCOL_COMMAND_SEND_FRAGMENT:\n    case ENET_PROTOCOL_COMMAND_SEND_RELIABLE:\n       enet_peer_dispatch_incoming_reliable_commands (peer, channel);\n       break;\n\n    default:\n       enet_peer_dispatch_incoming_unreliable_commands (peer, channel);\n       break;\n    }\n\n    return incomingCommand;\n\ndiscardCommand:\n    if (fragmentCount > 0)\n      goto notifyError;\n\n    if (packet != NULL && packet -> referenceCount == 0)\n      enet_packet_destroy (packet);\n\n    return & dummyCommand;\n\nnotifyError:\n    if (packet != NULL && packet -> referenceCount == 0)\n      enet_packet_destroy (packet);\n\n    return NULL;\n}\n\n/** @} */\n"
  },
  {
    "path": "src/libraries/enet/libenet/protocol.c",
    "content": "/** \n @file  protocol.c\n @brief ENet protocol functions\n*/\n#include <stdio.h>\n#include <string.h>\n#define ENET_BUILDING_LIB 1\n#include \"enet/utility.h\"\n#include \"enet/time.h\"\n#include \"enet/enet.h\"\n\nstatic size_t commandSizes [ENET_PROTOCOL_COMMAND_COUNT] =\n{\n    0,\n    sizeof (ENetProtocolAcknowledge),\n    sizeof (ENetProtocolConnect),\n    sizeof (ENetProtocolVerifyConnect),\n    sizeof (ENetProtocolDisconnect),\n    sizeof (ENetProtocolPing),\n    sizeof (ENetProtocolSendReliable),\n    sizeof (ENetProtocolSendUnreliable),\n    sizeof (ENetProtocolSendFragment),\n    sizeof (ENetProtocolSendUnsequenced),\n    sizeof (ENetProtocolBandwidthLimit),\n    sizeof (ENetProtocolThrottleConfigure),\n    sizeof (ENetProtocolSendFragment)\n};\n\nsize_t\nenet_protocol_command_size (enet_uint8 commandNumber)\n{\n    return commandSizes [commandNumber & ENET_PROTOCOL_COMMAND_MASK];\n}\n\nstatic void\nenet_protocol_change_state (ENetHost * host, ENetPeer * peer, ENetPeerState state)\n{\n    if (state == ENET_PEER_STATE_CONNECTED || state == ENET_PEER_STATE_DISCONNECT_LATER)\n      enet_peer_on_connect (peer);\n    else\n      enet_peer_on_disconnect (peer);\n\n    peer -> state = state;\n}\n\nstatic void\nenet_protocol_dispatch_state (ENetHost * host, ENetPeer * peer, ENetPeerState state)\n{\n    enet_protocol_change_state (host, peer, state);\n\n    if (! peer -> needsDispatch)\n    {\n       enet_list_insert (enet_list_end (& host -> dispatchQueue), & peer -> dispatchList);\n\n       peer -> needsDispatch = 1;\n    }\n}\n\nstatic int\nenet_protocol_dispatch_incoming_commands (ENetHost * host, ENetEvent * event)\n{\n    while (! enet_list_empty (& host -> dispatchQueue))\n    {\n       ENetPeer * peer = (ENetPeer *) enet_list_remove (enet_list_begin (& host -> dispatchQueue));\n\n       peer -> needsDispatch = 0;\n\n       switch (peer -> state)\n       {\n       case ENET_PEER_STATE_CONNECTION_PENDING:\n       case ENET_PEER_STATE_CONNECTION_SUCCEEDED:\n           enet_protocol_change_state (host, peer, ENET_PEER_STATE_CONNECTED);\n\n           event -> type = ENET_EVENT_TYPE_CONNECT;\n           event -> peer = peer;\n           event -> data = peer -> eventData;\n\n           return 1;\n           \n       case ENET_PEER_STATE_ZOMBIE:\n           host -> recalculateBandwidthLimits = 1;\n\n           event -> type = ENET_EVENT_TYPE_DISCONNECT;\n           event -> peer = peer;\n           event -> data = peer -> eventData;\n\n           enet_peer_reset (peer);\n\n           return 1;\n\n       case ENET_PEER_STATE_CONNECTED:\n           if (enet_list_empty (& peer -> dispatchedCommands))\n             continue;\n\n           event -> packet = enet_peer_receive (peer, & event -> channelID);\n           if (event -> packet == NULL)\n             continue;\n             \n           event -> type = ENET_EVENT_TYPE_RECEIVE;\n           event -> peer = peer;\n\n           if (! enet_list_empty (& peer -> dispatchedCommands))\n           {\n              peer -> needsDispatch = 1;\n         \n              enet_list_insert (enet_list_end (& host -> dispatchQueue), & peer -> dispatchList);\n           }\n\n           return 1;\n\n       default:\n           break;\n       }\n    }\n\n    return 0;\n}\n\nstatic void\nenet_protocol_notify_connect (ENetHost * host, ENetPeer * peer, ENetEvent * event)\n{\n    host -> recalculateBandwidthLimits = 1;\n\n    if (event != NULL)\n    {\n        enet_protocol_change_state (host, peer, ENET_PEER_STATE_CONNECTED);\n\n        event -> type = ENET_EVENT_TYPE_CONNECT;\n        event -> peer = peer;\n        event -> data = peer -> eventData;\n    }\n    else \n        enet_protocol_dispatch_state (host, peer, peer -> state == ENET_PEER_STATE_CONNECTING ? ENET_PEER_STATE_CONNECTION_SUCCEEDED : ENET_PEER_STATE_CONNECTION_PENDING);\n}\n\nstatic void\nenet_protocol_notify_disconnect (ENetHost * host, ENetPeer * peer, ENetEvent * event)\n{\n    if (peer -> state >= ENET_PEER_STATE_CONNECTION_PENDING)\n       host -> recalculateBandwidthLimits = 1;\n\n    if (peer -> state != ENET_PEER_STATE_CONNECTING && peer -> state < ENET_PEER_STATE_CONNECTION_SUCCEEDED)\n        enet_peer_reset (peer);\n    else\n    if (event != NULL)\n    {\n        event -> type = ENET_EVENT_TYPE_DISCONNECT;\n        event -> peer = peer;\n        event -> data = 0;\n\n        enet_peer_reset (peer);\n    }\n    else \n    {\n        peer -> eventData = 0;\n\n        enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE);\n    }\n}\n\nstatic void\nenet_protocol_remove_sent_unreliable_commands (ENetPeer * peer)\n{\n    ENetOutgoingCommand * outgoingCommand;\n\n    while (! enet_list_empty (& peer -> sentUnreliableCommands))\n    {\n        outgoingCommand = (ENetOutgoingCommand *) enet_list_front (& peer -> sentUnreliableCommands);\n        \n        enet_list_remove (& outgoingCommand -> outgoingCommandList);\n\n        if (outgoingCommand -> packet != NULL)\n        {\n           -- outgoingCommand -> packet -> referenceCount;\n\n           if (outgoingCommand -> packet -> referenceCount == 0)\n           {\n              outgoingCommand -> packet -> flags |= ENET_PACKET_FLAG_SENT;\n \n              enet_packet_destroy (outgoingCommand -> packet);\n           }\n        }\n\n        enet_free (outgoingCommand);\n    }\n}\n\nstatic ENetProtocolCommand\nenet_protocol_remove_sent_reliable_command (ENetPeer * peer, enet_uint16 reliableSequenceNumber, enet_uint8 channelID)\n{\n    ENetOutgoingCommand * outgoingCommand = NULL;\n    ENetListIterator currentCommand;\n    ENetProtocolCommand commandNumber;\n    int wasSent = 1;\n\n    for (currentCommand = enet_list_begin (& peer -> sentReliableCommands);\n         currentCommand != enet_list_end (& peer -> sentReliableCommands);\n         currentCommand = enet_list_next (currentCommand))\n    {\n       outgoingCommand = (ENetOutgoingCommand *) currentCommand;\n        \n       if (outgoingCommand -> reliableSequenceNumber == reliableSequenceNumber &&\n           outgoingCommand -> command.header.channelID == channelID)\n         break;\n    }\n\n    if (currentCommand == enet_list_end (& peer -> sentReliableCommands))\n    {\n       for (currentCommand = enet_list_begin (& peer -> outgoingReliableCommands);\n            currentCommand != enet_list_end (& peer -> outgoingReliableCommands);\n            currentCommand = enet_list_next (currentCommand))\n       {\n          outgoingCommand = (ENetOutgoingCommand *) currentCommand;\n\n          if (outgoingCommand -> sendAttempts < 1) return ENET_PROTOCOL_COMMAND_NONE;\n\n          if (outgoingCommand -> reliableSequenceNumber == reliableSequenceNumber &&\n              outgoingCommand -> command.header.channelID == channelID)\n            break;\n       }\n\n       if (currentCommand == enet_list_end (& peer -> outgoingReliableCommands))\n         return ENET_PROTOCOL_COMMAND_NONE;\n\n       wasSent = 0;\n    }\n\n    if (outgoingCommand == NULL)\n      return ENET_PROTOCOL_COMMAND_NONE;\n\n    if (channelID < peer -> channelCount)\n    {\n       ENetChannel * channel = & peer -> channels [channelID];\n       enet_uint16 reliableWindow = reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE;\n       if (channel -> reliableWindows [reliableWindow] > 0)\n       {\n          -- channel -> reliableWindows [reliableWindow];\n          if (! channel -> reliableWindows [reliableWindow])\n            channel -> usedReliableWindows &= ~ (1 << reliableWindow);\n       }\n    }\n\n    commandNumber = (ENetProtocolCommand) (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK);\n    \n    enet_list_remove (& outgoingCommand -> outgoingCommandList);\n\n    if (outgoingCommand -> packet != NULL)\n    {\n       if (wasSent)\n         peer -> reliableDataInTransit -= outgoingCommand -> fragmentLength;\n\n       -- outgoingCommand -> packet -> referenceCount;\n\n       if (outgoingCommand -> packet -> referenceCount == 0)\n       {\n          outgoingCommand -> packet -> flags |= ENET_PACKET_FLAG_SENT;\n\n          enet_packet_destroy (outgoingCommand -> packet);\n       }\n    }\n\n    enet_free (outgoingCommand);\n\n    if (enet_list_empty (& peer -> sentReliableCommands))\n      return commandNumber;\n    \n    outgoingCommand = (ENetOutgoingCommand *) enet_list_front (& peer -> sentReliableCommands);\n    \n    peer -> nextTimeout = outgoingCommand -> sentTime + outgoingCommand -> roundTripTimeout;\n\n    return commandNumber;\n} \n\nstatic ENetPeer *\nenet_protocol_handle_connect (ENetHost * host, ENetProtocolHeader * header, ENetProtocol * command)\n{\n    enet_uint8 incomingSessionID, outgoingSessionID;\n    enet_uint32 mtu, windowSize;\n    ENetChannel * channel;\n    size_t channelCount, duplicatePeers = 0;\n    ENetPeer * currentPeer, * peer = NULL;\n    ENetProtocol verifyCommand;\n\n    channelCount = ENET_NET_TO_HOST_32 (command -> connect.channelCount);\n\n    if (channelCount < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT ||\n        channelCount > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT)\n      return NULL;\n\n    for (currentPeer = host -> peers;\n         currentPeer < & host -> peers [host -> peerCount];\n         ++ currentPeer)\n    {\n        if (currentPeer -> state == ENET_PEER_STATE_DISCONNECTED)\n        {\n            if (peer == NULL)\n              peer = currentPeer;\n        }\n        else \n        if (currentPeer -> state != ENET_PEER_STATE_CONNECTING &&\n            currentPeer -> address.host == host -> receivedAddress.host)\n        {\n            if (currentPeer -> address.port == host -> receivedAddress.port &&\n                currentPeer -> connectID == command -> connect.connectID)\n              return NULL;\n\n            ++ duplicatePeers;\n        }\n    }\n\n    if (peer == NULL || duplicatePeers >= host -> duplicatePeers)\n      return NULL;\n\n    if (channelCount > host -> channelLimit)\n      channelCount = host -> channelLimit;\n    peer -> channels = (ENetChannel *) enet_malloc (channelCount * sizeof (ENetChannel));\n    if (peer -> channels == NULL)\n      return NULL;\n    peer -> channelCount = channelCount;\n    peer -> state = ENET_PEER_STATE_ACKNOWLEDGING_CONNECT;\n    peer -> connectID = command -> connect.connectID;\n    peer -> address = host -> receivedAddress;\n    peer -> outgoingPeerID = ENET_NET_TO_HOST_16 (command -> connect.outgoingPeerID);\n    peer -> incomingBandwidth = ENET_NET_TO_HOST_32 (command -> connect.incomingBandwidth);\n    peer -> outgoingBandwidth = ENET_NET_TO_HOST_32 (command -> connect.outgoingBandwidth);\n    peer -> packetThrottleInterval = ENET_NET_TO_HOST_32 (command -> connect.packetThrottleInterval);\n    peer -> packetThrottleAcceleration = ENET_NET_TO_HOST_32 (command -> connect.packetThrottleAcceleration);\n    peer -> packetThrottleDeceleration = ENET_NET_TO_HOST_32 (command -> connect.packetThrottleDeceleration);\n    peer -> eventData = ENET_NET_TO_HOST_32 (command -> connect.data);\n\n    incomingSessionID = command -> connect.incomingSessionID == 0xFF ? peer -> outgoingSessionID : command -> connect.incomingSessionID;\n    incomingSessionID = (incomingSessionID + 1) & (ENET_PROTOCOL_HEADER_SESSION_MASK >> ENET_PROTOCOL_HEADER_SESSION_SHIFT);\n    if (incomingSessionID == peer -> outgoingSessionID)\n      incomingSessionID = (incomingSessionID + 1) & (ENET_PROTOCOL_HEADER_SESSION_MASK >> ENET_PROTOCOL_HEADER_SESSION_SHIFT);\n    peer -> outgoingSessionID = incomingSessionID;\n\n    outgoingSessionID = command -> connect.outgoingSessionID == 0xFF ? peer -> incomingSessionID : command -> connect.outgoingSessionID;\n    outgoingSessionID = (outgoingSessionID + 1) & (ENET_PROTOCOL_HEADER_SESSION_MASK >> ENET_PROTOCOL_HEADER_SESSION_SHIFT);\n    if (outgoingSessionID == peer -> incomingSessionID)\n      outgoingSessionID = (outgoingSessionID + 1) & (ENET_PROTOCOL_HEADER_SESSION_MASK >> ENET_PROTOCOL_HEADER_SESSION_SHIFT);\n    peer -> incomingSessionID = outgoingSessionID;\n\n    for (channel = peer -> channels;\n         channel < & peer -> channels [channelCount];\n         ++ channel)\n    {\n        channel -> outgoingReliableSequenceNumber = 0;\n        channel -> outgoingUnreliableSequenceNumber = 0;\n        channel -> incomingReliableSequenceNumber = 0;\n        channel -> incomingUnreliableSequenceNumber = 0;\n\n        enet_list_clear (& channel -> incomingReliableCommands);\n        enet_list_clear (& channel -> incomingUnreliableCommands);\n\n        channel -> usedReliableWindows = 0;\n        memset (channel -> reliableWindows, 0, sizeof (channel -> reliableWindows));\n    }\n\n    mtu = ENET_NET_TO_HOST_32 (command -> connect.mtu);\n\n    if (mtu < ENET_PROTOCOL_MINIMUM_MTU)\n      mtu = ENET_PROTOCOL_MINIMUM_MTU;\n    else\n    if (mtu > ENET_PROTOCOL_MAXIMUM_MTU)\n      mtu = ENET_PROTOCOL_MAXIMUM_MTU;\n\n    peer -> mtu = mtu;\n\n    if (host -> outgoingBandwidth == 0 &&\n        peer -> incomingBandwidth == 0)\n      peer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE;\n    else\n    if (host -> outgoingBandwidth == 0 ||\n        peer -> incomingBandwidth == 0)\n      peer -> windowSize = (ENET_MAX (host -> outgoingBandwidth, peer -> incomingBandwidth) /\n                                    ENET_PEER_WINDOW_SIZE_SCALE) *\n                                      ENET_PROTOCOL_MINIMUM_WINDOW_SIZE;\n    else\n      peer -> windowSize = (ENET_MIN (host -> outgoingBandwidth, peer -> incomingBandwidth) /\n                                    ENET_PEER_WINDOW_SIZE_SCALE) * \n                                      ENET_PROTOCOL_MINIMUM_WINDOW_SIZE;\n\n    if (peer -> windowSize < ENET_PROTOCOL_MINIMUM_WINDOW_SIZE)\n      peer -> windowSize = ENET_PROTOCOL_MINIMUM_WINDOW_SIZE;\n    else\n    if (peer -> windowSize > ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE)\n      peer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE;\n\n    if (host -> incomingBandwidth == 0)\n      windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE;\n    else\n      windowSize = (host -> incomingBandwidth / ENET_PEER_WINDOW_SIZE_SCALE) *\n                     ENET_PROTOCOL_MINIMUM_WINDOW_SIZE;\n\n    if (windowSize > ENET_NET_TO_HOST_32 (command -> connect.windowSize))\n      windowSize = ENET_NET_TO_HOST_32 (command -> connect.windowSize);\n\n    if (windowSize < ENET_PROTOCOL_MINIMUM_WINDOW_SIZE)\n      windowSize = ENET_PROTOCOL_MINIMUM_WINDOW_SIZE;\n    else\n    if (windowSize > ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE)\n      windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE;\n\n    verifyCommand.header.command = ENET_PROTOCOL_COMMAND_VERIFY_CONNECT | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE;\n    verifyCommand.header.channelID = 0xFF;\n    verifyCommand.verifyConnect.outgoingPeerID = ENET_HOST_TO_NET_16 (peer -> incomingPeerID);\n    verifyCommand.verifyConnect.incomingSessionID = incomingSessionID;\n    verifyCommand.verifyConnect.outgoingSessionID = outgoingSessionID;\n    verifyCommand.verifyConnect.mtu = ENET_HOST_TO_NET_32 (peer -> mtu);\n    verifyCommand.verifyConnect.windowSize = ENET_HOST_TO_NET_32 (windowSize);\n    verifyCommand.verifyConnect.channelCount = ENET_HOST_TO_NET_32 (channelCount);\n    verifyCommand.verifyConnect.incomingBandwidth = ENET_HOST_TO_NET_32 (host -> incomingBandwidth);\n    verifyCommand.verifyConnect.outgoingBandwidth = ENET_HOST_TO_NET_32 (host -> outgoingBandwidth);\n    verifyCommand.verifyConnect.packetThrottleInterval = ENET_HOST_TO_NET_32 (peer -> packetThrottleInterval);\n    verifyCommand.verifyConnect.packetThrottleAcceleration = ENET_HOST_TO_NET_32 (peer -> packetThrottleAcceleration);\n    verifyCommand.verifyConnect.packetThrottleDeceleration = ENET_HOST_TO_NET_32 (peer -> packetThrottleDeceleration);\n    verifyCommand.verifyConnect.connectID = peer -> connectID;\n\n    enet_peer_queue_outgoing_command (peer, & verifyCommand, NULL, 0, 0);\n\n    return peer;\n}\n\nstatic int\nenet_protocol_handle_send_reliable (ENetHost * host, ENetPeer * peer, const ENetProtocol * command, enet_uint8 ** currentData)\n{\n    size_t dataLength;\n\n    if (command -> header.channelID >= peer -> channelCount ||\n        (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER))\n      return -1;\n\n    dataLength = ENET_NET_TO_HOST_16 (command -> sendReliable.dataLength);\n    * currentData += dataLength;\n    if (dataLength > host -> maximumPacketSize ||\n        * currentData < host -> receivedData ||\n        * currentData > & host -> receivedData [host -> receivedDataLength])\n      return -1;\n\n    if (enet_peer_queue_incoming_command (peer, command, (const enet_uint8 *) command + sizeof (ENetProtocolSendReliable), dataLength, ENET_PACKET_FLAG_RELIABLE, 0) == NULL)\n      return -1;\n\n    return 0;\n}\n\nstatic int\nenet_protocol_handle_send_unsequenced (ENetHost * host, ENetPeer * peer, const ENetProtocol * command, enet_uint8 ** currentData)\n{\n    enet_uint32 unsequencedGroup, index;\n    size_t dataLength;\n\n    if (command -> header.channelID >= peer -> channelCount ||\n        (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER))\n      return -1;\n\n    dataLength = ENET_NET_TO_HOST_16 (command -> sendUnsequenced.dataLength);\n    * currentData += dataLength;\n    if (dataLength > host -> maximumPacketSize ||\n        * currentData < host -> receivedData ||\n        * currentData > & host -> receivedData [host -> receivedDataLength])\n      return -1; \n\n    unsequencedGroup = ENET_NET_TO_HOST_16 (command -> sendUnsequenced.unsequencedGroup);\n    index = unsequencedGroup % ENET_PEER_UNSEQUENCED_WINDOW_SIZE;\n   \n    if (unsequencedGroup < peer -> incomingUnsequencedGroup)\n      unsequencedGroup += 0x10000;\n\n    if (unsequencedGroup >= (enet_uint32) peer -> incomingUnsequencedGroup + ENET_PEER_FREE_UNSEQUENCED_WINDOWS * ENET_PEER_UNSEQUENCED_WINDOW_SIZE)\n      return 0;\n\n    unsequencedGroup &= 0xFFFF;\n\n    if (unsequencedGroup - index != peer -> incomingUnsequencedGroup)\n    {\n        peer -> incomingUnsequencedGroup = unsequencedGroup - index;\n\n        memset (peer -> unsequencedWindow, 0, sizeof (peer -> unsequencedWindow));\n    }\n    else\n    if (peer -> unsequencedWindow [index / 32] & (1 << (index % 32)))\n      return 0;\n      \n    if (enet_peer_queue_incoming_command (peer, command, (const enet_uint8 *) command + sizeof (ENetProtocolSendUnsequenced), dataLength, ENET_PACKET_FLAG_UNSEQUENCED, 0) == NULL)\n      return -1;\n   \n    peer -> unsequencedWindow [index / 32] |= 1 << (index % 32);\n \n    return 0;\n}\n\nstatic int\nenet_protocol_handle_send_unreliable (ENetHost * host, ENetPeer * peer, const ENetProtocol * command, enet_uint8 ** currentData)\n{\n    size_t dataLength;\n\n    if (command -> header.channelID >= peer -> channelCount ||\n        (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER))\n      return -1;\n\n    dataLength = ENET_NET_TO_HOST_16 (command -> sendUnreliable.dataLength);\n    * currentData += dataLength;\n    if (dataLength > host -> maximumPacketSize ||\n        * currentData < host -> receivedData ||\n        * currentData > & host -> receivedData [host -> receivedDataLength])\n      return -1;\n\n    if (enet_peer_queue_incoming_command (peer, command, (const enet_uint8 *) command + sizeof (ENetProtocolSendUnreliable), dataLength, 0, 0) == NULL)\n      return -1;\n\n    return 0;\n}\n\nstatic int\nenet_protocol_handle_send_fragment (ENetHost * host, ENetPeer * peer, const ENetProtocol * command, enet_uint8 ** currentData)\n{\n    enet_uint32 fragmentNumber,\n           fragmentCount,\n           fragmentOffset,\n           fragmentLength,\n           startSequenceNumber,\n           totalLength;\n    ENetChannel * channel;\n    enet_uint16 startWindow, currentWindow;\n    ENetListIterator currentCommand;\n    ENetIncomingCommand * startCommand = NULL;\n\n    if (command -> header.channelID >= peer -> channelCount ||\n        (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER))\n      return -1;\n\n    fragmentLength = ENET_NET_TO_HOST_16 (command -> sendFragment.dataLength);\n    * currentData += fragmentLength;\n    if (fragmentLength > host -> maximumPacketSize ||\n        * currentData < host -> receivedData ||\n        * currentData > & host -> receivedData [host -> receivedDataLength])\n      return -1;\n\n    channel = & peer -> channels [command -> header.channelID];\n    startSequenceNumber = ENET_NET_TO_HOST_16 (command -> sendFragment.startSequenceNumber);\n    startWindow = startSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE;\n    currentWindow = channel -> incomingReliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE;\n\n    if (startSequenceNumber < channel -> incomingReliableSequenceNumber)\n      startWindow += ENET_PEER_RELIABLE_WINDOWS;\n\n    if (startWindow < currentWindow || startWindow >= currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS - 1)\n      return 0;\n\n    fragmentNumber = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentNumber);\n    fragmentCount = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentCount);\n    fragmentOffset = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentOffset);\n    totalLength = ENET_NET_TO_HOST_32 (command -> sendFragment.totalLength);\n    \n    if (fragmentCount > ENET_PROTOCOL_MAXIMUM_FRAGMENT_COUNT ||\n        fragmentNumber >= fragmentCount ||\n        totalLength > host -> maximumPacketSize ||\n        fragmentOffset >= totalLength ||\n        fragmentLength > totalLength - fragmentOffset)\n      return -1;\n \n    for (currentCommand = enet_list_previous (enet_list_end (& channel -> incomingReliableCommands));\n         currentCommand != enet_list_end (& channel -> incomingReliableCommands);\n         currentCommand = enet_list_previous (currentCommand))\n    {\n       ENetIncomingCommand * incomingCommand = (ENetIncomingCommand *) currentCommand;\n\n       if (startSequenceNumber >= channel -> incomingReliableSequenceNumber)\n       {\n          if (incomingCommand -> reliableSequenceNumber < channel -> incomingReliableSequenceNumber)\n            continue;\n       }\n       else\n       if (incomingCommand -> reliableSequenceNumber >= channel -> incomingReliableSequenceNumber)\n         break;\n\n       if (incomingCommand -> reliableSequenceNumber <= startSequenceNumber)\n       {\n          if (incomingCommand -> reliableSequenceNumber < startSequenceNumber)\n            break;\n        \n          if ((incomingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) != ENET_PROTOCOL_COMMAND_SEND_FRAGMENT ||\n              totalLength != incomingCommand -> packet -> dataLength ||\n              fragmentCount != incomingCommand -> fragmentCount)\n            return -1;\n\n          startCommand = incomingCommand;\n          break;\n       }\n    }\n \n    if (startCommand == NULL)\n    {\n       ENetProtocol hostCommand = * command;\n\n       hostCommand.header.reliableSequenceNumber = startSequenceNumber;\n\n       startCommand = enet_peer_queue_incoming_command (peer, & hostCommand, NULL, totalLength, ENET_PACKET_FLAG_RELIABLE, fragmentCount);\n       if (startCommand == NULL)\n         return -1;\n    }\n    \n    if ((startCommand -> fragments [fragmentNumber / 32] & (1 << (fragmentNumber % 32))) == 0)\n    {\n       -- startCommand -> fragmentsRemaining;\n\n       startCommand -> fragments [fragmentNumber / 32] |= (1 << (fragmentNumber % 32));\n\n       if (fragmentOffset + fragmentLength > startCommand -> packet -> dataLength)\n         fragmentLength = startCommand -> packet -> dataLength - fragmentOffset;\n\n       memcpy (startCommand -> packet -> data + fragmentOffset,\n               (enet_uint8 *) command + sizeof (ENetProtocolSendFragment),\n               fragmentLength);\n\n        if (startCommand -> fragmentsRemaining <= 0)\n          enet_peer_dispatch_incoming_reliable_commands (peer, channel);\n    }\n\n    return 0;\n}\n\nstatic int\nenet_protocol_handle_send_unreliable_fragment (ENetHost * host, ENetPeer * peer, const ENetProtocol * command, enet_uint8 ** currentData)\n{\n    enet_uint32 fragmentNumber,\n           fragmentCount,\n           fragmentOffset,\n           fragmentLength,\n           reliableSequenceNumber,\n           startSequenceNumber,\n           totalLength;\n    enet_uint16 reliableWindow, currentWindow;\n    ENetChannel * channel;\n    ENetListIterator currentCommand;\n    ENetIncomingCommand * startCommand = NULL;\n\n    if (command -> header.channelID >= peer -> channelCount ||\n        (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER))\n      return -1;\n\n    fragmentLength = ENET_NET_TO_HOST_16 (command -> sendFragment.dataLength);\n    * currentData += fragmentLength;\n    if (fragmentLength > host -> maximumPacketSize ||\n        * currentData < host -> receivedData ||\n        * currentData > & host -> receivedData [host -> receivedDataLength])\n      return -1;\n\n    channel = & peer -> channels [command -> header.channelID];\n    reliableSequenceNumber = command -> header.reliableSequenceNumber;\n    startSequenceNumber = ENET_NET_TO_HOST_16 (command -> sendFragment.startSequenceNumber);\n\n    reliableWindow = reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE;\n    currentWindow = channel -> incomingReliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE;\n\n    if (reliableSequenceNumber < channel -> incomingReliableSequenceNumber)\n      reliableWindow += ENET_PEER_RELIABLE_WINDOWS;\n\n    if (reliableWindow < currentWindow || reliableWindow >= currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS - 1)\n      return 0;\n\n    if (reliableSequenceNumber == channel -> incomingReliableSequenceNumber &&\n        startSequenceNumber <= channel -> incomingUnreliableSequenceNumber)\n      return 0;\n\n    fragmentNumber = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentNumber);\n    fragmentCount = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentCount);\n    fragmentOffset = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentOffset);\n    totalLength = ENET_NET_TO_HOST_32 (command -> sendFragment.totalLength);\n\n    if (fragmentCount > ENET_PROTOCOL_MAXIMUM_FRAGMENT_COUNT ||\n        fragmentNumber >= fragmentCount ||\n        totalLength > host -> maximumPacketSize ||\n        fragmentOffset >= totalLength ||\n        fragmentLength > totalLength - fragmentOffset)\n      return -1;\n\n    for (currentCommand = enet_list_previous (enet_list_end (& channel -> incomingUnreliableCommands));\n         currentCommand != enet_list_end (& channel -> incomingUnreliableCommands);\n         currentCommand = enet_list_previous (currentCommand))\n    {\n       ENetIncomingCommand * incomingCommand = (ENetIncomingCommand *) currentCommand;\n\n       if (reliableSequenceNumber >= channel -> incomingReliableSequenceNumber)\n       {\n          if (incomingCommand -> reliableSequenceNumber < channel -> incomingReliableSequenceNumber)\n            continue;\n       }\n       else\n       if (incomingCommand -> reliableSequenceNumber >= channel -> incomingReliableSequenceNumber)\n         break;\n\n       if (incomingCommand -> reliableSequenceNumber < reliableSequenceNumber)\n         break;\n\n       if (incomingCommand -> reliableSequenceNumber > reliableSequenceNumber)\n         continue;\n\n       if (incomingCommand -> unreliableSequenceNumber <= startSequenceNumber)\n       {\n          if (incomingCommand -> unreliableSequenceNumber < startSequenceNumber)\n            break;\n\n          if ((incomingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) != ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT ||\n              totalLength != incomingCommand -> packet -> dataLength ||\n              fragmentCount != incomingCommand -> fragmentCount)\n            return -1;\n\n          startCommand = incomingCommand;\n          break;\n       }\n    }\n\n    if (startCommand == NULL)\n    {\n       startCommand = enet_peer_queue_incoming_command (peer, command, NULL, totalLength, ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT, fragmentCount);\n       if (startCommand == NULL)\n         return -1;\n    }\n\n    if ((startCommand -> fragments [fragmentNumber / 32] & (1 << (fragmentNumber % 32))) == 0)\n    {\n       -- startCommand -> fragmentsRemaining;\n\n       startCommand -> fragments [fragmentNumber / 32] |= (1 << (fragmentNumber % 32));\n\n       if (fragmentOffset + fragmentLength > startCommand -> packet -> dataLength)\n         fragmentLength = startCommand -> packet -> dataLength - fragmentOffset;\n\n       memcpy (startCommand -> packet -> data + fragmentOffset,\n               (enet_uint8 *) command + sizeof (ENetProtocolSendFragment),\n               fragmentLength);\n\n        if (startCommand -> fragmentsRemaining <= 0)\n          enet_peer_dispatch_incoming_unreliable_commands (peer, channel);\n    }\n\n    return 0;\n}\n\nstatic int\nenet_protocol_handle_ping (ENetHost * host, ENetPeer * peer, const ENetProtocol * command)\n{\n    if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER)\n      return -1;\n\n    return 0;\n}\n\nstatic int\nenet_protocol_handle_bandwidth_limit (ENetHost * host, ENetPeer * peer, const ENetProtocol * command)\n{\n    if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER)\n      return -1;\n\n    if (peer -> incomingBandwidth != 0)\n      -- host -> bandwidthLimitedPeers;\n\n    peer -> incomingBandwidth = ENET_NET_TO_HOST_32 (command -> bandwidthLimit.incomingBandwidth);\n    peer -> outgoingBandwidth = ENET_NET_TO_HOST_32 (command -> bandwidthLimit.outgoingBandwidth);\n\n    if (peer -> incomingBandwidth != 0)\n      ++ host -> bandwidthLimitedPeers;\n\n    if (peer -> incomingBandwidth == 0 && host -> outgoingBandwidth == 0)\n      peer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE;\n    else\n    if (peer -> incomingBandwidth == 0 || host -> outgoingBandwidth == 0)\n      peer -> windowSize = (ENET_MAX (peer -> incomingBandwidth, host -> outgoingBandwidth) /\n                             ENET_PEER_WINDOW_SIZE_SCALE) * ENET_PROTOCOL_MINIMUM_WINDOW_SIZE;\n    else\n      peer -> windowSize = (ENET_MIN (peer -> incomingBandwidth, host -> outgoingBandwidth) /\n                             ENET_PEER_WINDOW_SIZE_SCALE) * ENET_PROTOCOL_MINIMUM_WINDOW_SIZE;\n\n    if (peer -> windowSize < ENET_PROTOCOL_MINIMUM_WINDOW_SIZE)\n      peer -> windowSize = ENET_PROTOCOL_MINIMUM_WINDOW_SIZE;\n    else\n    if (peer -> windowSize > ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE)\n      peer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE;\n\n    return 0;\n}\n\nstatic int\nenet_protocol_handle_throttle_configure (ENetHost * host, ENetPeer * peer, const ENetProtocol * command)\n{\n    if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER)\n      return -1;\n\n    peer -> packetThrottleInterval = ENET_NET_TO_HOST_32 (command -> throttleConfigure.packetThrottleInterval);\n    peer -> packetThrottleAcceleration = ENET_NET_TO_HOST_32 (command -> throttleConfigure.packetThrottleAcceleration);\n    peer -> packetThrottleDeceleration = ENET_NET_TO_HOST_32 (command -> throttleConfigure.packetThrottleDeceleration);\n\n    return 0;\n}\n\nstatic int\nenet_protocol_handle_disconnect (ENetHost * host, ENetPeer * peer, const ENetProtocol * command)\n{\n    if (peer -> state == ENET_PEER_STATE_DISCONNECTED || peer -> state == ENET_PEER_STATE_ZOMBIE || peer -> state == ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT)\n      return 0;\n\n    enet_peer_reset_queues (peer);\n\n    if (peer -> state == ENET_PEER_STATE_CONNECTION_SUCCEEDED || peer -> state == ENET_PEER_STATE_DISCONNECTING || peer -> state == ENET_PEER_STATE_CONNECTING)\n        enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE);\n    else\n    if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER)\n    {\n        if (peer -> state == ENET_PEER_STATE_CONNECTION_PENDING) host -> recalculateBandwidthLimits = 1;\n\n        enet_peer_reset (peer);\n    }\n    else\n    if (command -> header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE)\n      enet_protocol_change_state (host, peer, ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT);\n    else\n      enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE);\n\n    if (peer -> state != ENET_PEER_STATE_DISCONNECTED)\n      peer -> eventData = ENET_NET_TO_HOST_32 (command -> disconnect.data);\n\n    return 0;\n}\n\nstatic int\nenet_protocol_handle_acknowledge (ENetHost * host, ENetEvent * event, ENetPeer * peer, const ENetProtocol * command)\n{\n    enet_uint32 roundTripTime,\n           receivedSentTime,\n           receivedReliableSequenceNumber;\n    ENetProtocolCommand commandNumber;\n\n    if (peer -> state == ENET_PEER_STATE_DISCONNECTED || peer -> state == ENET_PEER_STATE_ZOMBIE)\n      return 0;\n\n    receivedSentTime = ENET_NET_TO_HOST_16 (command -> acknowledge.receivedSentTime);\n    receivedSentTime |= host -> serviceTime & 0xFFFF0000;\n    if ((receivedSentTime & 0x8000) > (host -> serviceTime & 0x8000))\n        receivedSentTime -= 0x10000;\n\n    if (ENET_TIME_LESS (host -> serviceTime, receivedSentTime))\n      return 0;\n\n    peer -> lastReceiveTime = host -> serviceTime;\n    peer -> earliestTimeout = 0;\n\n    roundTripTime = ENET_TIME_DIFFERENCE (host -> serviceTime, receivedSentTime);\n\n    enet_peer_throttle (peer, roundTripTime);\n\n    peer -> roundTripTimeVariance -= peer -> roundTripTimeVariance / 4;\n\n    if (roundTripTime >= peer -> roundTripTime)\n    {\n       peer -> roundTripTime += (roundTripTime - peer -> roundTripTime) / 8;\n       peer -> roundTripTimeVariance += (roundTripTime - peer -> roundTripTime) / 4;\n    }\n    else\n    {\n       peer -> roundTripTime -= (peer -> roundTripTime - roundTripTime) / 8;\n       peer -> roundTripTimeVariance += (peer -> roundTripTime - roundTripTime) / 4;\n    }\n\n    if (peer -> roundTripTime < peer -> lowestRoundTripTime)\n      peer -> lowestRoundTripTime = peer -> roundTripTime;\n\n    if (peer -> roundTripTimeVariance > peer -> highestRoundTripTimeVariance) \n      peer -> highestRoundTripTimeVariance = peer -> roundTripTimeVariance;\n\n    if (peer -> packetThrottleEpoch == 0 ||\n        ENET_TIME_DIFFERENCE (host -> serviceTime, peer -> packetThrottleEpoch) >= peer -> packetThrottleInterval)\n    {\n        peer -> lastRoundTripTime = peer -> lowestRoundTripTime;\n        peer -> lastRoundTripTimeVariance = peer -> highestRoundTripTimeVariance;\n        peer -> lowestRoundTripTime = peer -> roundTripTime;\n        peer -> highestRoundTripTimeVariance = peer -> roundTripTimeVariance;\n        peer -> packetThrottleEpoch = host -> serviceTime;\n    }\n\n    receivedReliableSequenceNumber = ENET_NET_TO_HOST_16 (command -> acknowledge.receivedReliableSequenceNumber);\n\n    commandNumber = enet_protocol_remove_sent_reliable_command (peer, receivedReliableSequenceNumber, command -> header.channelID);\n\n    switch (peer -> state)\n    {\n    case ENET_PEER_STATE_ACKNOWLEDGING_CONNECT:\n       if (commandNumber != ENET_PROTOCOL_COMMAND_VERIFY_CONNECT)\n         return -1;\n\n       enet_protocol_notify_connect (host, peer, event);\n       break;\n\n    case ENET_PEER_STATE_DISCONNECTING:\n       if (commandNumber != ENET_PROTOCOL_COMMAND_DISCONNECT)\n         return -1;\n\n       enet_protocol_notify_disconnect (host, peer, event);\n       break;\n\n    case ENET_PEER_STATE_DISCONNECT_LATER:\n       if (enet_list_empty (& peer -> outgoingReliableCommands) &&\n           enet_list_empty (& peer -> outgoingUnreliableCommands) &&   \n           enet_list_empty (& peer -> sentReliableCommands))\n         enet_peer_disconnect (peer, peer -> eventData);\n       break;\n\n    default:\n       break;\n    }\n   \n    return 0;\n}\n\nstatic int\nenet_protocol_handle_verify_connect (ENetHost * host, ENetEvent * event, ENetPeer * peer, const ENetProtocol * command)\n{\n    enet_uint32 mtu, windowSize;\n    size_t channelCount;\n\n    if (peer -> state != ENET_PEER_STATE_CONNECTING)\n      return 0;\n\n    channelCount = ENET_NET_TO_HOST_32 (command -> verifyConnect.channelCount);\n\n    if (channelCount < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT || channelCount > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT ||\n        ENET_NET_TO_HOST_32 (command -> verifyConnect.packetThrottleInterval) != peer -> packetThrottleInterval ||\n        ENET_NET_TO_HOST_32 (command -> verifyConnect.packetThrottleAcceleration) != peer -> packetThrottleAcceleration ||\n        ENET_NET_TO_HOST_32 (command -> verifyConnect.packetThrottleDeceleration) != peer -> packetThrottleDeceleration ||\n        command -> verifyConnect.connectID != peer -> connectID)\n    {\n        peer -> eventData = 0;\n\n        enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE);\n\n        return -1;\n    }\n\n    enet_protocol_remove_sent_reliable_command (peer, 1, 0xFF);\n    \n    if (channelCount < peer -> channelCount)\n      peer -> channelCount = channelCount;\n\n    peer -> outgoingPeerID = ENET_NET_TO_HOST_16 (command -> verifyConnect.outgoingPeerID);\n    peer -> incomingSessionID = command -> verifyConnect.incomingSessionID;\n    peer -> outgoingSessionID = command -> verifyConnect.outgoingSessionID;\n\n    mtu = ENET_NET_TO_HOST_32 (command -> verifyConnect.mtu);\n\n    if (mtu < ENET_PROTOCOL_MINIMUM_MTU)\n      mtu = ENET_PROTOCOL_MINIMUM_MTU;\n    else \n    if (mtu > ENET_PROTOCOL_MAXIMUM_MTU)\n      mtu = ENET_PROTOCOL_MAXIMUM_MTU;\n\n    if (mtu < peer -> mtu)\n      peer -> mtu = mtu;\n\n    windowSize = ENET_NET_TO_HOST_32 (command -> verifyConnect.windowSize);\n\n    if (windowSize < ENET_PROTOCOL_MINIMUM_WINDOW_SIZE)\n      windowSize = ENET_PROTOCOL_MINIMUM_WINDOW_SIZE;\n\n    if (windowSize > ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE)\n      windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE;\n\n    if (windowSize < peer -> windowSize)\n      peer -> windowSize = windowSize;\n\n    peer -> incomingBandwidth = ENET_NET_TO_HOST_32 (command -> verifyConnect.incomingBandwidth);\n    peer -> outgoingBandwidth = ENET_NET_TO_HOST_32 (command -> verifyConnect.outgoingBandwidth);\n\n    enet_protocol_notify_connect (host, peer, event);\n    return 0;\n}\n\nstatic int\nenet_protocol_handle_incoming_commands (ENetHost * host, ENetEvent * event)\n{\n    ENetProtocolHeader * header;\n    ENetProtocol * command;\n    ENetPeer * peer;\n    enet_uint8 * currentData;\n    size_t headerSize;\n    enet_uint16 peerID, flags;\n    enet_uint8 sessionID;\n\n    if (host -> receivedDataLength < (size_t) & ((ENetProtocolHeader *) 0) -> sentTime)\n      return 0;\n\n    header = (ENetProtocolHeader *) host -> receivedData;\n\n    peerID = ENET_NET_TO_HOST_16 (header -> peerID);\n    sessionID = (peerID & ENET_PROTOCOL_HEADER_SESSION_MASK) >> ENET_PROTOCOL_HEADER_SESSION_SHIFT;\n    flags = peerID & ENET_PROTOCOL_HEADER_FLAG_MASK;\n    peerID &= ~ (ENET_PROTOCOL_HEADER_FLAG_MASK | ENET_PROTOCOL_HEADER_SESSION_MASK);\n\n    headerSize = (flags & ENET_PROTOCOL_HEADER_FLAG_SENT_TIME ? sizeof (ENetProtocolHeader) : (size_t) & ((ENetProtocolHeader *) 0) -> sentTime);\n    if (host -> checksum != NULL)\n      headerSize += sizeof (enet_uint32);\n\n    if (peerID == ENET_PROTOCOL_MAXIMUM_PEER_ID)\n      peer = NULL;\n    else\n    if (peerID >= host -> peerCount)\n      return 0;\n    else\n    {\n       peer = & host -> peers [peerID];\n\n       if (peer -> state == ENET_PEER_STATE_DISCONNECTED ||\n           peer -> state == ENET_PEER_STATE_ZOMBIE ||\n           ((host -> receivedAddress.host != peer -> address.host ||\n             host -> receivedAddress.port != peer -> address.port) &&\n             peer -> address.host != ENET_HOST_BROADCAST) ||\n           (peer -> outgoingPeerID < ENET_PROTOCOL_MAXIMUM_PEER_ID &&\n            sessionID != peer -> incomingSessionID))\n         return 0;\n    }\n \n    if (flags & ENET_PROTOCOL_HEADER_FLAG_COMPRESSED)\n    {\n        size_t originalSize;\n        if (host -> compressor.context == NULL || host -> compressor.decompress == NULL)\n          return 0;\n\n        originalSize = host -> compressor.decompress (host -> compressor.context,\n                                    host -> receivedData + headerSize, \n                                    host -> receivedDataLength - headerSize, \n                                    host -> packetData [1] + headerSize, \n                                    sizeof (host -> packetData [1]) - headerSize);\n        if (originalSize <= 0 || originalSize > sizeof (host -> packetData [1]) - headerSize)\n          return 0;\n\n        memcpy (host -> packetData [1], header, headerSize);\n        host -> receivedData = host -> packetData [1];\n        host -> receivedDataLength = headerSize + originalSize;\n    }\n\n    if (host -> checksum != NULL)\n    {\n        enet_uint32 * checksum = (enet_uint32 *) & host -> receivedData [headerSize - sizeof (enet_uint32)],\n                    desiredChecksum = * checksum;\n        ENetBuffer buffer;\n\n        * checksum = peer != NULL ? peer -> connectID : 0;\n\n        buffer.data = host -> receivedData;\n        buffer.dataLength = host -> receivedDataLength;\n\n        if (host -> checksum (& buffer, 1) != desiredChecksum)\n          return 0;\n    }\n       \n    if (peer != NULL)\n    {\n       peer -> address.host = host -> receivedAddress.host;\n       peer -> address.port = host -> receivedAddress.port;\n       peer -> incomingDataTotal += host -> receivedDataLength;\n    }\n    \n    currentData = host -> receivedData + headerSize;\n  \n    while (currentData < & host -> receivedData [host -> receivedDataLength])\n    {\n       enet_uint8 commandNumber;\n       size_t commandSize;\n\n       command = (ENetProtocol *) currentData;\n\n       if (currentData + sizeof (ENetProtocolCommandHeader) > & host -> receivedData [host -> receivedDataLength])\n         break;\n\n       commandNumber = command -> header.command & ENET_PROTOCOL_COMMAND_MASK;\n       if (commandNumber >= ENET_PROTOCOL_COMMAND_COUNT) \n         break;\n       \n       commandSize = commandSizes [commandNumber];\n       if (commandSize == 0 || currentData + commandSize > & host -> receivedData [host -> receivedDataLength])\n         break;\n\n       currentData += commandSize;\n\n       if (peer == NULL && commandNumber != ENET_PROTOCOL_COMMAND_CONNECT)\n         break;\n         \n       command -> header.reliableSequenceNumber = ENET_NET_TO_HOST_16 (command -> header.reliableSequenceNumber);\n\n       switch (commandNumber)\n       {\n       case ENET_PROTOCOL_COMMAND_ACKNOWLEDGE:\n          if (enet_protocol_handle_acknowledge (host, event, peer, command))\n            goto commandError;\n          break;\n\n       case ENET_PROTOCOL_COMMAND_CONNECT:\n          if (peer != NULL)\n            goto commandError;\n          peer = enet_protocol_handle_connect (host, header, command);\n          if (peer == NULL)\n            goto commandError;\n          break;\n\n       case ENET_PROTOCOL_COMMAND_VERIFY_CONNECT:\n          if (enet_protocol_handle_verify_connect (host, event, peer, command))\n            goto commandError;\n          break;\n\n       case ENET_PROTOCOL_COMMAND_DISCONNECT:\n          if (enet_protocol_handle_disconnect (host, peer, command))\n            goto commandError;\n          break;\n\n       case ENET_PROTOCOL_COMMAND_PING:\n          if (enet_protocol_handle_ping (host, peer, command))\n            goto commandError;\n          break;\n\n       case ENET_PROTOCOL_COMMAND_SEND_RELIABLE:\n          if (enet_protocol_handle_send_reliable (host, peer, command, & currentData))\n            goto commandError;\n          break;\n\n       case ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE:\n          if (enet_protocol_handle_send_unreliable (host, peer, command, & currentData))\n            goto commandError;\n          break;\n\n       case ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED:\n          if (enet_protocol_handle_send_unsequenced (host, peer, command, & currentData))\n            goto commandError;\n          break;\n\n       case ENET_PROTOCOL_COMMAND_SEND_FRAGMENT:\n          if (enet_protocol_handle_send_fragment (host, peer, command, & currentData))\n            goto commandError;\n          break;\n\n       case ENET_PROTOCOL_COMMAND_BANDWIDTH_LIMIT:\n          if (enet_protocol_handle_bandwidth_limit (host, peer, command))\n            goto commandError;\n          break;\n\n       case ENET_PROTOCOL_COMMAND_THROTTLE_CONFIGURE:\n          if (enet_protocol_handle_throttle_configure (host, peer, command))\n            goto commandError;\n          break;\n\n       case ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT:\n          if (enet_protocol_handle_send_unreliable_fragment (host, peer, command, & currentData))\n            goto commandError;\n          break;\n\n       default:\n          goto commandError;\n       }\n\n       if (peer != NULL &&\n           (command -> header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE) != 0)\n       {\n           enet_uint16 sentTime;\n\n           if (! (flags & ENET_PROTOCOL_HEADER_FLAG_SENT_TIME))\n             break;\n\n           sentTime = ENET_NET_TO_HOST_16 (header -> sentTime);\n\n           switch (peer -> state)\n           {\n           case ENET_PEER_STATE_DISCONNECTING:\n           case ENET_PEER_STATE_ACKNOWLEDGING_CONNECT:\n           case ENET_PEER_STATE_DISCONNECTED:\n           case ENET_PEER_STATE_ZOMBIE:\n              break;\n\n           case ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT:\n              if ((command -> header.command & ENET_PROTOCOL_COMMAND_MASK) == ENET_PROTOCOL_COMMAND_DISCONNECT)\n                enet_peer_queue_acknowledgement (peer, command, sentTime);\n              break;\n\n           default:   \n              enet_peer_queue_acknowledgement (peer, command, sentTime);        \n              break;\n           }\n       }\n    }\n\ncommandError:\n    if (event != NULL && event -> type != ENET_EVENT_TYPE_NONE)\n      return 1;\n\n    return 0;\n}\n \nstatic int\nenet_protocol_receive_incoming_commands (ENetHost * host, ENetEvent * event)\n{\n    int packets;\n\n    for (packets = 0; packets < 256; ++ packets)\n    {\n       int receivedLength;\n       ENetBuffer buffer;\n\n       buffer.data = host -> packetData [0];\n       buffer.dataLength = sizeof (host -> packetData [0]);\n\n       receivedLength = enet_socket_receive (host -> socket,\n                                             & host -> receivedAddress,\n                                             & buffer,\n                                             1);\n\n       if (receivedLength < 0)\n         return -1;\n\n       if (receivedLength == 0)\n         return 0;\n\n       host -> receivedData = host -> packetData [0];\n       host -> receivedDataLength = receivedLength;\n      \n       host -> totalReceivedData += receivedLength;\n       host -> totalReceivedPackets ++;\n\n       if (host -> intercept != NULL)\n       {\n          switch (host -> intercept (host, event))\n          {\n          case 1:\n             if (event != NULL && event -> type != ENET_EVENT_TYPE_NONE)\n               return 1;\n\n             continue;\n          \n          case -1:\n             return -1;\n        \n          default:\n             break;\n          }\n       }\n        \n       switch (enet_protocol_handle_incoming_commands (host, event))\n       {\n       case 1:\n          return 1;\n       \n       case -1:\n          return -1;\n\n       default:\n          break;\n       }\n    }\n\n    return -1;\n}\n\nstatic void\nenet_protocol_send_acknowledgements (ENetHost * host, ENetPeer * peer)\n{\n    ENetProtocol * command = & host -> commands [host -> commandCount];\n    ENetBuffer * buffer = & host -> buffers [host -> bufferCount];\n    ENetAcknowledgement * acknowledgement;\n    ENetListIterator currentAcknowledgement;\n    enet_uint16 reliableSequenceNumber;\n \n    currentAcknowledgement = enet_list_begin (& peer -> acknowledgements);\n         \n    while (currentAcknowledgement != enet_list_end (& peer -> acknowledgements))\n    {\n       if (command >= & host -> commands [sizeof (host -> commands) / sizeof (ENetProtocol)] ||\n           buffer >= & host -> buffers [sizeof (host -> buffers) / sizeof (ENetBuffer)] ||\n           peer -> mtu - host -> packetSize < sizeof (ENetProtocolAcknowledge))\n       {\n          host -> continueSending = 1;\n\n          break;\n       }\n\n       acknowledgement = (ENetAcknowledgement *) currentAcknowledgement;\n \n       currentAcknowledgement = enet_list_next (currentAcknowledgement);\n\n       buffer -> data = command;\n       buffer -> dataLength = sizeof (ENetProtocolAcknowledge);\n\n       host -> packetSize += buffer -> dataLength;\n\n       reliableSequenceNumber = ENET_HOST_TO_NET_16 (acknowledgement -> command.header.reliableSequenceNumber);\n  \n       command -> header.command = ENET_PROTOCOL_COMMAND_ACKNOWLEDGE;\n       command -> header.channelID = acknowledgement -> command.header.channelID;\n       command -> header.reliableSequenceNumber = reliableSequenceNumber;\n       command -> acknowledge.receivedReliableSequenceNumber = reliableSequenceNumber;\n       command -> acknowledge.receivedSentTime = ENET_HOST_TO_NET_16 (acknowledgement -> sentTime);\n  \n       if ((acknowledgement -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) == ENET_PROTOCOL_COMMAND_DISCONNECT)\n         enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE);\n\n       enet_list_remove (& acknowledgement -> acknowledgementList);\n       enet_free (acknowledgement);\n\n       ++ command;\n       ++ buffer;\n    }\n\n    host -> commandCount = command - host -> commands;\n    host -> bufferCount = buffer - host -> buffers;\n}\n\nstatic void\nenet_protocol_send_unreliable_outgoing_commands (ENetHost * host, ENetPeer * peer)\n{\n    ENetProtocol * command = & host -> commands [host -> commandCount];\n    ENetBuffer * buffer = & host -> buffers [host -> bufferCount];\n    ENetOutgoingCommand * outgoingCommand;\n    ENetListIterator currentCommand;\n\n    currentCommand = enet_list_begin (& peer -> outgoingUnreliableCommands);\n    \n    while (currentCommand != enet_list_end (& peer -> outgoingUnreliableCommands))\n    {\n       size_t commandSize;\n\n       outgoingCommand = (ENetOutgoingCommand *) currentCommand;\n       commandSize = commandSizes [outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK];\n\n       if (command >= & host -> commands [sizeof (host -> commands) / sizeof (ENetProtocol)] ||\n           buffer + 1 >= & host -> buffers [sizeof (host -> buffers) / sizeof (ENetBuffer)] ||\n           peer -> mtu - host -> packetSize < commandSize ||\n           (outgoingCommand -> packet != NULL &&\n             peer -> mtu - host -> packetSize < commandSize + outgoingCommand -> fragmentLength))\n       {\n          host -> continueSending = 1;\n\n          break;\n       }\n\n       currentCommand = enet_list_next (currentCommand);\n\n       if (outgoingCommand -> packet != NULL && outgoingCommand -> fragmentOffset == 0)\n       {\n          peer -> packetThrottleCounter += ENET_PEER_PACKET_THROTTLE_COUNTER;\n          peer -> packetThrottleCounter %= ENET_PEER_PACKET_THROTTLE_SCALE;\n          \n          if (peer -> packetThrottleCounter > peer -> packetThrottle)\n          {\n             enet_uint16 reliableSequenceNumber = outgoingCommand -> reliableSequenceNumber,\n                         unreliableSequenceNumber = outgoingCommand -> unreliableSequenceNumber;\n             for (;;)\n             {\n                -- outgoingCommand -> packet -> referenceCount;\n\n                if (outgoingCommand -> packet -> referenceCount == 0)\n                  enet_packet_destroy (outgoingCommand -> packet);\n         \n                enet_list_remove (& outgoingCommand -> outgoingCommandList);\n                enet_free (outgoingCommand);\n\n                if (currentCommand == enet_list_end (& peer -> outgoingUnreliableCommands))\n                  break;\n\n                outgoingCommand = (ENetOutgoingCommand *) currentCommand;\n                if (outgoingCommand -> reliableSequenceNumber != reliableSequenceNumber ||\n                    outgoingCommand -> unreliableSequenceNumber != unreliableSequenceNumber)\n                  break;\n\n                currentCommand = enet_list_next (currentCommand);\n             }\n           \n             continue;\n          }\n       }\n\n       buffer -> data = command;\n       buffer -> dataLength = commandSize;\n      \n       host -> packetSize += buffer -> dataLength;\n\n       * command = outgoingCommand -> command;\n       \n       enet_list_remove (& outgoingCommand -> outgoingCommandList);\n\n       if (outgoingCommand -> packet != NULL)\n       {\n          ++ buffer;\n          \n          buffer -> data = outgoingCommand -> packet -> data + outgoingCommand -> fragmentOffset;\n          buffer -> dataLength = outgoingCommand -> fragmentLength;\n\n          host -> packetSize += buffer -> dataLength;\n\n          enet_list_insert (enet_list_end (& peer -> sentUnreliableCommands), outgoingCommand);\n       }\n       else\n         enet_free (outgoingCommand);\n\n       ++ command;\n       ++ buffer;\n    } \n\n    host -> commandCount = command - host -> commands;\n    host -> bufferCount = buffer - host -> buffers;\n\n    if (peer -> state == ENET_PEER_STATE_DISCONNECT_LATER && \n        enet_list_empty (& peer -> outgoingReliableCommands) &&\n        enet_list_empty (& peer -> outgoingUnreliableCommands) && \n        enet_list_empty (& peer -> sentReliableCommands))\n      enet_peer_disconnect (peer, peer -> eventData);\n}\n\nstatic int\nenet_protocol_check_timeouts (ENetHost * host, ENetPeer * peer, ENetEvent * event)\n{\n    ENetOutgoingCommand * outgoingCommand;\n    ENetListIterator currentCommand, insertPosition;\n\n    currentCommand = enet_list_begin (& peer -> sentReliableCommands);\n    insertPosition = enet_list_begin (& peer -> outgoingReliableCommands);\n\n    while (currentCommand != enet_list_end (& peer -> sentReliableCommands))\n    {\n       outgoingCommand = (ENetOutgoingCommand *) currentCommand;\n\n       currentCommand = enet_list_next (currentCommand);\n\n       if (ENET_TIME_DIFFERENCE (host -> serviceTime, outgoingCommand -> sentTime) < outgoingCommand -> roundTripTimeout)\n         continue;\n\n       if (peer -> earliestTimeout == 0 ||\n           ENET_TIME_LESS (outgoingCommand -> sentTime, peer -> earliestTimeout))\n         peer -> earliestTimeout = outgoingCommand -> sentTime;\n\n       if (peer -> earliestTimeout != 0 &&\n             (ENET_TIME_DIFFERENCE (host -> serviceTime, peer -> earliestTimeout) >= peer -> timeoutMaximum ||\n               (outgoingCommand -> roundTripTimeout >= outgoingCommand -> roundTripTimeoutLimit &&\n                 ENET_TIME_DIFFERENCE (host -> serviceTime, peer -> earliestTimeout) >= peer -> timeoutMinimum)))\n       {\n          enet_protocol_notify_disconnect (host, peer, event);\n\n          return 1;\n       }\n\n       if (outgoingCommand -> packet != NULL)\n         peer -> reliableDataInTransit -= outgoingCommand -> fragmentLength;\n          \n       ++ peer -> packetsLost;\n\n       outgoingCommand -> roundTripTimeout *= 2;\n\n       enet_list_insert (insertPosition, enet_list_remove (& outgoingCommand -> outgoingCommandList));\n\n       if (currentCommand == enet_list_begin (& peer -> sentReliableCommands) &&\n           ! enet_list_empty (& peer -> sentReliableCommands))\n       {\n          outgoingCommand = (ENetOutgoingCommand *) currentCommand;\n\n          peer -> nextTimeout = outgoingCommand -> sentTime + outgoingCommand -> roundTripTimeout;\n       }\n    }\n    \n    return 0;\n}\n\nstatic int\nenet_protocol_send_reliable_outgoing_commands (ENetHost * host, ENetPeer * peer)\n{\n    ENetProtocol * command = & host -> commands [host -> commandCount];\n    ENetBuffer * buffer = & host -> buffers [host -> bufferCount];\n    ENetOutgoingCommand * outgoingCommand;\n    ENetListIterator currentCommand;\n    ENetChannel *channel;\n    enet_uint16 reliableWindow;\n    size_t commandSize;\n    int windowExceeded = 0, windowWrap = 0, canPing = 1;\n\n    currentCommand = enet_list_begin (& peer -> outgoingReliableCommands);\n    \n    while (currentCommand != enet_list_end (& peer -> outgoingReliableCommands))\n    {\n       outgoingCommand = (ENetOutgoingCommand *) currentCommand;\n\n       channel = outgoingCommand -> command.header.channelID < peer -> channelCount ? & peer -> channels [outgoingCommand -> command.header.channelID] : NULL;\n       reliableWindow = outgoingCommand -> reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE;\n       if (channel != NULL)\n       {\n           if (! windowWrap &&      \n               outgoingCommand -> sendAttempts < 1 && \n               ! (outgoingCommand -> reliableSequenceNumber % ENET_PEER_RELIABLE_WINDOW_SIZE) &&\n               (channel -> reliableWindows [(reliableWindow + ENET_PEER_RELIABLE_WINDOWS - 1) % ENET_PEER_RELIABLE_WINDOWS] >= ENET_PEER_RELIABLE_WINDOW_SIZE ||\n                 channel -> usedReliableWindows & ((((1 << ENET_PEER_FREE_RELIABLE_WINDOWS) - 1) << reliableWindow) | \n                   (((1 << ENET_PEER_FREE_RELIABLE_WINDOWS) - 1) >> (ENET_PEER_RELIABLE_WINDOWS - reliableWindow)))))\n             windowWrap = 1;\n          if (windowWrap)\n          {\n             currentCommand = enet_list_next (currentCommand);\n \n             continue;\n          }\n       }\n \n       if (outgoingCommand -> packet != NULL)\n       {\n          if (! windowExceeded)\n          {\n             enet_uint32 windowSize = (peer -> packetThrottle * peer -> windowSize) / ENET_PEER_PACKET_THROTTLE_SCALE;\n             \n             if (peer -> reliableDataInTransit + outgoingCommand -> fragmentLength > ENET_MAX (windowSize, peer -> mtu))\n               windowExceeded = 1;\n          }\n          if (windowExceeded)\n          {\n             currentCommand = enet_list_next (currentCommand);\n\n             continue;\n          }\n       }\n\n       canPing = 0;\n\n       commandSize = commandSizes [outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK];\n       if (command >= & host -> commands [sizeof (host -> commands) / sizeof (ENetProtocol)] ||\n           buffer + 1 >= & host -> buffers [sizeof (host -> buffers) / sizeof (ENetBuffer)] ||\n           peer -> mtu - host -> packetSize < commandSize ||\n           (outgoingCommand -> packet != NULL && \n             (enet_uint16) (peer -> mtu - host -> packetSize) < (enet_uint16) (commandSize + outgoingCommand -> fragmentLength)))\n       {\n          host -> continueSending = 1;\n          \n          break;\n       }\n\n       currentCommand = enet_list_next (currentCommand);\n\n       if (channel != NULL && outgoingCommand -> sendAttempts < 1)\n       {\n          channel -> usedReliableWindows |= 1 << reliableWindow;\n          ++ channel -> reliableWindows [reliableWindow];\n       }\n\n       ++ outgoingCommand -> sendAttempts;\n \n       if (outgoingCommand -> roundTripTimeout == 0)\n       {\n          outgoingCommand -> roundTripTimeout = peer -> roundTripTime + 4 * peer -> roundTripTimeVariance;\n          outgoingCommand -> roundTripTimeoutLimit = peer -> timeoutLimit * outgoingCommand -> roundTripTimeout;\n       }\n\n       if (enet_list_empty (& peer -> sentReliableCommands))\n         peer -> nextTimeout = host -> serviceTime + outgoingCommand -> roundTripTimeout;\n\n       enet_list_insert (enet_list_end (& peer -> sentReliableCommands),\n                         enet_list_remove (& outgoingCommand -> outgoingCommandList));\n\n       outgoingCommand -> sentTime = host -> serviceTime;\n\n       buffer -> data = command;\n       buffer -> dataLength = commandSize;\n\n       host -> packetSize += buffer -> dataLength;\n       host -> headerFlags |= ENET_PROTOCOL_HEADER_FLAG_SENT_TIME;\n\n       * command = outgoingCommand -> command;\n\n       if (outgoingCommand -> packet != NULL)\n       {\n          ++ buffer;\n          \n          buffer -> data = outgoingCommand -> packet -> data + outgoingCommand -> fragmentOffset;\n          buffer -> dataLength = outgoingCommand -> fragmentLength;\n\n          host -> packetSize += outgoingCommand -> fragmentLength;\n\n          peer -> reliableDataInTransit += outgoingCommand -> fragmentLength;\n       }\n\n       ++ peer -> packetsSent;\n        \n       ++ command;\n       ++ buffer;\n    }\n\n    host -> commandCount = command - host -> commands;\n    host -> bufferCount = buffer - host -> buffers;\n\n    return canPing;\n}\n\nstatic int\nenet_protocol_send_outgoing_commands (ENetHost * host, ENetEvent * event, int checkForTimeouts)\n{\n    enet_uint8 headerData [sizeof (ENetProtocolHeader) + sizeof (enet_uint32)];\n    ENetProtocolHeader * header = (ENetProtocolHeader *) headerData;\n    ENetPeer * currentPeer;\n    int sentLength;\n    size_t shouldCompress = 0;\n \n    host -> continueSending = 1;\n\n    while (host -> continueSending)\n    for (host -> continueSending = 0,\n           currentPeer = host -> peers;\n         currentPeer < & host -> peers [host -> peerCount];\n         ++ currentPeer)\n    {\n        if (currentPeer -> state == ENET_PEER_STATE_DISCONNECTED ||\n            currentPeer -> state == ENET_PEER_STATE_ZOMBIE)\n          continue;\n\n        host -> headerFlags = 0;\n        host -> commandCount = 0;\n        host -> bufferCount = 1;\n        host -> packetSize = sizeof (ENetProtocolHeader);\n\n        if (! enet_list_empty (& currentPeer -> acknowledgements))\n          enet_protocol_send_acknowledgements (host, currentPeer);\n\n        if (checkForTimeouts != 0 &&\n            ! enet_list_empty (& currentPeer -> sentReliableCommands) &&\n            ENET_TIME_GREATER_EQUAL (host -> serviceTime, currentPeer -> nextTimeout) &&\n            enet_protocol_check_timeouts (host, currentPeer, event) == 1)\n        {\n            if (event != NULL && event -> type != ENET_EVENT_TYPE_NONE)\n              return 1;\n            else\n              continue;\n        }\n\n        if ((enet_list_empty (& currentPeer -> outgoingReliableCommands) ||\n              enet_protocol_send_reliable_outgoing_commands (host, currentPeer)) &&\n            enet_list_empty (& currentPeer -> sentReliableCommands) &&\n            ENET_TIME_DIFFERENCE (host -> serviceTime, currentPeer -> lastReceiveTime) >= currentPeer -> pingInterval &&\n            currentPeer -> mtu - host -> packetSize >= sizeof (ENetProtocolPing))\n        { \n            enet_peer_ping (currentPeer);\n            enet_protocol_send_reliable_outgoing_commands (host, currentPeer);\n        }\n                      \n        if (! enet_list_empty (& currentPeer -> outgoingUnreliableCommands))\n          enet_protocol_send_unreliable_outgoing_commands (host, currentPeer);\n\n        if (host -> commandCount == 0)\n          continue;\n\n        if (currentPeer -> packetLossEpoch == 0)\n          currentPeer -> packetLossEpoch = host -> serviceTime;\n        else\n        if (ENET_TIME_DIFFERENCE (host -> serviceTime, currentPeer -> packetLossEpoch) >= ENET_PEER_PACKET_LOSS_INTERVAL &&\n            currentPeer -> packetsSent > 0)\n        {\n           enet_uint32 packetLoss = currentPeer -> packetsLost * ENET_PEER_PACKET_LOSS_SCALE / currentPeer -> packetsSent;\n\n#ifdef ENET_DEBUG\n           printf (\"peer %u: %f%%+-%f%% packet loss, %u+-%u ms round trip time, %f%% throttle, %u/%u outgoing, %u/%u incoming\\n\", currentPeer -> incomingPeerID, currentPeer -> packetLoss / (float) ENET_PEER_PACKET_LOSS_SCALE, currentPeer -> packetLossVariance / (float) ENET_PEER_PACKET_LOSS_SCALE, currentPeer -> roundTripTime, currentPeer -> roundTripTimeVariance, currentPeer -> packetThrottle / (float) ENET_PEER_PACKET_THROTTLE_SCALE, enet_list_size (& currentPeer -> outgoingReliableCommands), enet_list_size (& currentPeer -> outgoingUnreliableCommands), currentPeer -> channels != NULL ? enet_list_size (& currentPeer -> channels -> incomingReliableCommands) : 0, currentPeer -> channels != NULL ? enet_list_size (& currentPeer -> channels -> incomingUnreliableCommands) : 0);\n#endif\n          \n           currentPeer -> packetLossVariance -= currentPeer -> packetLossVariance / 4;\n\n           if (packetLoss >= currentPeer -> packetLoss)\n           {\n              currentPeer -> packetLoss += (packetLoss - currentPeer -> packetLoss) / 8;\n              currentPeer -> packetLossVariance += (packetLoss - currentPeer -> packetLoss) / 4;\n           }\n           else\n           {\n              currentPeer -> packetLoss -= (currentPeer -> packetLoss - packetLoss) / 8;\n              currentPeer -> packetLossVariance += (currentPeer -> packetLoss - packetLoss) / 4;\n           }\n\n           currentPeer -> packetLossEpoch = host -> serviceTime;\n           currentPeer -> packetsSent = 0;\n           currentPeer -> packetsLost = 0;\n        }\n\n        host -> buffers -> data = headerData;\n        if (host -> headerFlags & ENET_PROTOCOL_HEADER_FLAG_SENT_TIME)\n        {\n            header -> sentTime = ENET_HOST_TO_NET_16 (host -> serviceTime & 0xFFFF);\n\n            host -> buffers -> dataLength = sizeof (ENetProtocolHeader);\n        }\n        else\n          host -> buffers -> dataLength = (size_t) & ((ENetProtocolHeader *) 0) -> sentTime;\n\n        shouldCompress = 0;\n        if (host -> compressor.context != NULL && host -> compressor.compress != NULL)\n        {\n            size_t originalSize = host -> packetSize - sizeof(ENetProtocolHeader),\n                   compressedSize = host -> compressor.compress (host -> compressor.context,\n                                        & host -> buffers [1], host -> bufferCount - 1,\n                                        originalSize,\n                                        host -> packetData [1],\n                                        originalSize);\n            if (compressedSize > 0 && compressedSize < originalSize)\n            {\n                host -> headerFlags |= ENET_PROTOCOL_HEADER_FLAG_COMPRESSED;\n                shouldCompress = compressedSize;\n#ifdef ENET_DEBUG_COMPRESS\n                printf (\"peer %u: compressed %u -> %u (%u%%)\\n\", currentPeer -> incomingPeerID, originalSize, compressedSize, (compressedSize * 100) / originalSize);\n#endif\n            }\n        }\n\n        if (currentPeer -> outgoingPeerID < ENET_PROTOCOL_MAXIMUM_PEER_ID)\n          host -> headerFlags |= currentPeer -> outgoingSessionID << ENET_PROTOCOL_HEADER_SESSION_SHIFT;\n        header -> peerID = ENET_HOST_TO_NET_16 (currentPeer -> outgoingPeerID | host -> headerFlags);\n        if (host -> checksum != NULL)\n        {\n            enet_uint32 * checksum = (enet_uint32 *) & headerData [host -> buffers -> dataLength];\n            * checksum = currentPeer -> outgoingPeerID < ENET_PROTOCOL_MAXIMUM_PEER_ID ? currentPeer -> connectID : 0;\n            host -> buffers -> dataLength += sizeof (enet_uint32);\n            * checksum = host -> checksum (host -> buffers, host -> bufferCount);\n        }\n\n        if (shouldCompress > 0)\n        {\n            host -> buffers [1].data = host -> packetData [1];\n            host -> buffers [1].dataLength = shouldCompress;\n            host -> bufferCount = 2;\n        }\n\n        currentPeer -> lastSendTime = host -> serviceTime;\n\n        sentLength = enet_socket_send (host -> socket, & currentPeer -> address, host -> buffers, host -> bufferCount);\n\n        enet_protocol_remove_sent_unreliable_commands (currentPeer);\n\n        if (sentLength < 0)\n          return -1;\n\n        host -> totalSentData += sentLength;\n        host -> totalSentPackets ++;\n    }\n   \n    return 0;\n}\n\n/** Sends any queued packets on the host specified to its designated peers.\n\n    @param host   host to flush\n    @remarks this function need only be used in circumstances where one wishes to send queued packets earlier than in a call to enet_host_service().\n    @ingroup host\n*/\nvoid\nenet_host_flush (ENetHost * host)\n{\n    host -> serviceTime = enet_time_get ();\n\n    enet_protocol_send_outgoing_commands (host, NULL, 0);\n}\n\n/** Checks for any queued events on the host and dispatches one if available.\n\n    @param host    host to check for events\n    @param event   an event structure where event details will be placed if available\n    @retval > 0 if an event was dispatched\n    @retval 0 if no events are available\n    @retval < 0 on failure\n    @ingroup host\n*/\nint\nenet_host_check_events (ENetHost * host, ENetEvent * event)\n{\n    if (event == NULL) return -1;\n\n    event -> type = ENET_EVENT_TYPE_NONE;\n    event -> peer = NULL;\n    event -> packet = NULL;\n\n    return enet_protocol_dispatch_incoming_commands (host, event);\n}\n\n/** Waits for events on the host specified and shuttles packets between\n    the host and its peers.\n\n    @param host    host to service\n    @param event   an event structure where event details will be placed if one occurs\n                   if event == NULL then no events will be delivered\n    @param timeout number of milliseconds that ENet should wait for events\n    @retval > 0 if an event occurred within the specified time limit\n    @retval 0 if no event occurred\n    @retval < 0 on failure\n    @remarks enet_host_service should be called fairly regularly for adequate performance\n    @ingroup host\n*/\nint\nenet_host_service (ENetHost * host, ENetEvent * event, enet_uint32 timeout)\n{\n    enet_uint32 waitCondition;\n\n    if (event != NULL)\n    {\n        event -> type = ENET_EVENT_TYPE_NONE;\n        event -> peer = NULL;\n        event -> packet = NULL;\n\n        switch (enet_protocol_dispatch_incoming_commands (host, event))\n        {\n        case 1:\n            return 1;\n\n        case -1:\n#ifdef ENET_DEBUG\n            perror (\"Error dispatching incoming packets\");\n#endif\n\n            return -1;\n\n        default:\n            break;\n        }\n    }\n\n    host -> serviceTime = enet_time_get ();\n    \n    timeout += host -> serviceTime;\n\n    do\n    {\n       if (ENET_TIME_DIFFERENCE (host -> serviceTime, host -> bandwidthThrottleEpoch) >= ENET_HOST_BANDWIDTH_THROTTLE_INTERVAL)\n         enet_host_bandwidth_throttle (host);\n\n       switch (enet_protocol_send_outgoing_commands (host, event, 1))\n       {\n       case 1:\n          return 1;\n\n       case -1:\n#ifdef ENET_DEBUG\n          perror (\"Error sending outgoing packets\");\n#endif\n\n          return -1;\n\n       default:\n          break;\n       }\n\n       switch (enet_protocol_receive_incoming_commands (host, event))\n       {\n       case 1:\n          return 1;\n\n       case -1:\n#ifdef ENET_DEBUG\n          perror (\"Error receiving incoming packets\");\n#endif\n\n          return -1;\n\n       default:\n          break;\n       }\n\n       switch (enet_protocol_send_outgoing_commands (host, event, 1))\n       {\n       case 1:\n          return 1;\n\n       case -1:\n#ifdef ENET_DEBUG\n          perror (\"Error sending outgoing packets\");\n#endif\n\n          return -1;\n\n       default:\n          break;\n       }\n\n       if (event != NULL)\n       {\n          switch (enet_protocol_dispatch_incoming_commands (host, event))\n          {\n          case 1:\n             return 1;\n\n          case -1:\n#ifdef ENET_DEBUG\n             perror (\"Error dispatching incoming packets\");\n#endif\n\n             return -1;\n\n          default:\n             break;\n          }\n       }\n\n       if (ENET_TIME_GREATER_EQUAL (host -> serviceTime, timeout))\n         return 0;\n\n       do\n       {\n          host -> serviceTime = enet_time_get ();\n\n          if (ENET_TIME_GREATER_EQUAL (host -> serviceTime, timeout))\n            return 0;\n\n          waitCondition = ENET_SOCKET_WAIT_RECEIVE | ENET_SOCKET_WAIT_INTERRUPT;\n\n          if (enet_socket_wait (host -> socket, & waitCondition, ENET_TIME_DIFFERENCE (timeout, host -> serviceTime)) != 0)\n            return -1;\n       }\n       while (waitCondition & ENET_SOCKET_WAIT_INTERRUPT);\n\n       host -> serviceTime = enet_time_get ();\n    } while (waitCondition & ENET_SOCKET_WAIT_RECEIVE);\n\n    return 0; \n}\n\n"
  },
  {
    "path": "src/libraries/enet/libenet/unix.c",
    "content": "/** \n @file  unix.c\n @brief ENet Unix system specific functions\n*/\n#ifndef _WIN32\n\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <sys/ioctl.h>\n#include <sys/time.h>\n#include <arpa/inet.h>\n#include <netinet/tcp.h>\n#include <netdb.h>\n#include <unistd.h>\n#include <string.h>\n#include <errno.h>\n#include <time.h>\n\n#define ENET_BUILDING_LIB 1\n#include \"enet/enet.h\"\n\n#ifdef __APPLE__\n#ifdef HAS_POLL\n#undef HAS_POLL\n#endif\n#ifndef HAS_FCNTL\n#define HAS_FCNTL 1\n#endif\n#ifndef HAS_INET_PTON\n#define HAS_INET_PTON 1\n#endif\n#ifndef HAS_INET_NTOP\n#define HAS_INET_NTOP 1\n#endif\n#ifndef HAS_MSGHDR_FLAGS\n#define HAS_MSGHDR_FLAGS 1\n#endif\n#ifndef HAS_SOCKLEN_T\n#define HAS_SOCKLEN_T 1\n#endif\n#ifndef HAS_GETADDRINFO\n#define HAS_GETADDRINFO 1\n#endif\n#ifndef HAS_GETNAMEINFO\n#define HAS_GETNAMEINFO 1\n#endif\n#endif\n\n#ifdef HAS_FCNTL\n#include <fcntl.h>\n#endif\n\n#ifdef HAS_POLL\n#include <sys/poll.h>\n#endif\n\n#include \"common/config.h\"\n#ifndef HAS_SOCKLEN_T\ntypedef int socklen_t;\n#endif\n\n#ifndef MSG_NOSIGNAL\n#define MSG_NOSIGNAL 0\n#endif\n\nstatic enet_uint32 timeBase = 0;\n\nint\nenet_initialize (void)\n{\n    return 0;\n}\n\nvoid\nenet_deinitialize (void)\n{\n}\n\nenet_uint32\nenet_host_random_seed (void)\n{\n    return (enet_uint32) time (NULL);\n}\n\nenet_uint32\nenet_time_get (void)\n{\n    struct timeval timeVal;\n\n    gettimeofday (& timeVal, NULL);\n\n    return timeVal.tv_sec * 1000 + timeVal.tv_usec / 1000 - timeBase;\n}\n\nvoid\nenet_time_set (enet_uint32 newTimeBase)\n{\n    struct timeval timeVal;\n\n    gettimeofday (& timeVal, NULL);\n    \n    timeBase = timeVal.tv_sec * 1000 + timeVal.tv_usec / 1000 - newTimeBase;\n}\n\nint\nenet_address_set_host (ENetAddress * address, const char * name)\n{\n#ifdef HAS_GETADDRINFO\n    struct addrinfo hints, * resultList = NULL, * result = NULL;\n\n    memset (& hints, 0, sizeof (hints));\n    hints.ai_family = AF_INET;\n\n    if (getaddrinfo (name, NULL, NULL, & resultList) != 0)\n      return -1;\n\n    for (result = resultList; result != NULL; result = result -> ai_next)\n    {\n        if (result -> ai_family == AF_INET && result -> ai_addr != NULL && result -> ai_addrlen >= sizeof (struct sockaddr_in))\n        {\n            struct sockaddr_in * sin = (struct sockaddr_in *) result -> ai_addr;\n\n            address -> host = sin -> sin_addr.s_addr;\n\n            freeaddrinfo (resultList);\n\n            return 0;\n        }\n    }\n\n    if (resultList != NULL)\n      freeaddrinfo (resultList);\n#else\n    struct hostent * hostEntry = NULL;\n#ifdef HAS_GETHOSTBYNAME_R\n    struct hostent hostData;\n    char buffer [2048];\n    int errnum;\n\n#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)\n    gethostbyname_r (name, & hostData, buffer, sizeof (buffer), & hostEntry, & errnum);\n#else\n    hostEntry = gethostbyname_r (name, & hostData, buffer, sizeof (buffer), & errnum);\n#endif\n#else\n    hostEntry = gethostbyname (name);\n#endif\n\n    if (hostEntry != NULL && hostEntry -> h_addrtype == AF_INET)\n    {\n        address -> host = * (enet_uint32 *) hostEntry -> h_addr_list [0];\n\n        return 0;\n    }\n#endif\n\n#ifdef HAS_INET_PTON\n    if (! inet_pton (AF_INET, name, & address -> host))\n#else\n    if (! inet_aton (name, (struct in_addr *) & address -> host))\n#endif\n        return -1;\n\n    return 0;\n}\n\nint\nenet_address_get_host_ip (const ENetAddress * address, char * name, size_t nameLength)\n{\n#ifdef HAS_INET_NTOP\n    if (inet_ntop (AF_INET, & address -> host, name, nameLength) == NULL)\n#else\n    char * addr = inet_ntoa (* (struct in_addr *) & address -> host);\n    if (addr != NULL)\n    {\n        size_t addrLen = strlen(addr);\n        if (addrLen >= nameLength)\n          return -1;\n        memcpy (name, addr, addrLen + 1);\n    } \n    else\n#endif\n        return -1;\n    return 0;\n}\n\nint\nenet_address_get_host (const ENetAddress * address, char * name, size_t nameLength)\n{\n#ifdef HAS_GETNAMEINFO\n    struct sockaddr_in sin;\n    int err;\n\n    memset (& sin, 0, sizeof (struct sockaddr_in));\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = ENET_HOST_TO_NET_16 (address -> port);\n    sin.sin_addr.s_addr = address -> host;\n\n    err = getnameinfo ((struct sockaddr *) & sin, sizeof (sin), name, nameLength, NULL, 0, NI_NAMEREQD);\n    if (! err)\n    {\n        if (name != NULL && nameLength > 0 && ! memchr (name, '\\0', nameLength))\n          return -1;\n        return 0;\n    }\n    if (err != EAI_NONAME)\n      return -1;\n#else\n    struct in_addr in;\n    struct hostent * hostEntry = NULL;\n#ifdef HAS_GETHOSTBYADDR_R\n    struct hostent hostData;\n    char buffer [2048];\n    int errnum;\n\n    in.s_addr = address -> host;\n\n#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)\n    gethostbyaddr_r ((char *) & in, sizeof (struct in_addr), AF_INET, & hostData, buffer, sizeof (buffer), & hostEntry, & errnum);\n#else\n    hostEntry = gethostbyaddr_r ((char *) & in, sizeof (struct in_addr), AF_INET, & hostData, buffer, sizeof (buffer), & errnum);\n#endif\n#else\n    in.s_addr = address -> host;\n\n    hostEntry = gethostbyaddr ((char *) & in, sizeof (struct in_addr), AF_INET);\n#endif\n\n    if (hostEntry != NULL)\n    {\n       size_t hostLen = strlen (hostEntry -> h_name);\n       if (hostLen >= nameLength)\n         return -1;\n       memcpy (name, hostEntry -> h_name, hostLen + 1);\n       return 0;\n    }\n#endif\n\n    return enet_address_get_host_ip (address, name, nameLength);\n}\n\nint\nenet_socket_bind (ENetSocket socket, const ENetAddress * address)\n{\n    struct sockaddr_in sin;\n\n    memset (& sin, 0, sizeof (struct sockaddr_in));\n\n    sin.sin_family = AF_INET;\n\n    if (address != NULL)\n    {\n       sin.sin_port = ENET_HOST_TO_NET_16 (address -> port);\n       sin.sin_addr.s_addr = address -> host;\n    }\n    else\n    {\n       sin.sin_port = 0;\n       sin.sin_addr.s_addr = INADDR_ANY;\n    }\n\n    return bind (socket,\n                 (struct sockaddr *) & sin,\n                 sizeof (struct sockaddr_in)); \n}\n\nint\nenet_socket_get_address (ENetSocket socket, ENetAddress * address)\n{\n    struct sockaddr_in sin;\n    socklen_t sinLength = sizeof (struct sockaddr_in);\n\n    if (getsockname (socket, (struct sockaddr *) & sin, & sinLength) == -1)\n      return -1;\n\n    address -> host = (enet_uint32) sin.sin_addr.s_addr;\n    address -> port = ENET_NET_TO_HOST_16 (sin.sin_port);\n\n    return 0;\n}\n\nint \nenet_socket_listen (ENetSocket socket, int backlog)\n{\n    return listen (socket, backlog < 0 ? SOMAXCONN : backlog);\n}\n\nENetSocket\nenet_socket_create (ENetSocketType type)\n{\n    return socket (PF_INET, type == ENET_SOCKET_TYPE_DATAGRAM ? SOCK_DGRAM : SOCK_STREAM, 0);\n}\n\nint\nenet_socket_set_option (ENetSocket socket, ENetSocketOption option, int value)\n{\n    int result = -1;\n    switch (option)\n    {\n        case ENET_SOCKOPT_NONBLOCK:\n#ifdef HAS_FCNTL\n            result = fcntl (socket, F_SETFL, (value ? O_NONBLOCK : 0) | (fcntl (socket, F_GETFL) & ~O_NONBLOCK));\n#else\n            result = ioctl (socket, FIONBIO, & value);\n#endif\n            break;\n\n        case ENET_SOCKOPT_BROADCAST:\n            result = setsockopt (socket, SOL_SOCKET, SO_BROADCAST, (char *) & value, sizeof (int));\n            break;\n\n        case ENET_SOCKOPT_REUSEADDR:\n            result = setsockopt (socket, SOL_SOCKET, SO_REUSEADDR, (char *) & value, sizeof (int));\n            break;\n\n        case ENET_SOCKOPT_RCVBUF:\n            result = setsockopt (socket, SOL_SOCKET, SO_RCVBUF, (char *) & value, sizeof (int));\n            break;\n\n        case ENET_SOCKOPT_SNDBUF:\n            result = setsockopt (socket, SOL_SOCKET, SO_SNDBUF, (char *) & value, sizeof (int));\n            break;\n\n        case ENET_SOCKOPT_RCVTIMEO:\n        {\n            struct timeval timeVal;\n            timeVal.tv_sec = value / 1000;\n            timeVal.tv_usec = (value % 1000) * 1000;\n            result = setsockopt (socket, SOL_SOCKET, SO_RCVTIMEO, (char *) & timeVal, sizeof (struct timeval));\n            break;\n        }\n\n        case ENET_SOCKOPT_SNDTIMEO:\n        {\n            struct timeval timeVal;\n            timeVal.tv_sec = value / 1000;\n            timeVal.tv_usec = (value % 1000) * 1000;\n            result = setsockopt (socket, SOL_SOCKET, SO_SNDTIMEO, (char *) & timeVal, sizeof (struct timeval));\n            break;\n        }\n\n        case ENET_SOCKOPT_NODELAY:\n            result = setsockopt (socket, IPPROTO_TCP, TCP_NODELAY, (char *) & value, sizeof (int));\n            break;\n\n        default:\n            break;\n    }\n    return result == -1 ? -1 : 0;\n}\n\nint\nenet_socket_get_option (ENetSocket socket, ENetSocketOption option, int * value)\n{\n    int result = -1;\n    socklen_t len;\n    switch (option)\n    {\n        case ENET_SOCKOPT_ERROR:\n            len = sizeof (int);\n            result = getsockopt (socket, SOL_SOCKET, SO_ERROR, value, & len);\n            break;\n\n        default:\n            break;\n    }\n    return result == -1 ? -1 : 0;\n}\n\nint\nenet_socket_connect (ENetSocket socket, const ENetAddress * address)\n{\n    struct sockaddr_in sin;\n    int result;\n\n    memset (& sin, 0, sizeof (struct sockaddr_in));\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = ENET_HOST_TO_NET_16 (address -> port);\n    sin.sin_addr.s_addr = address -> host;\n\n    result = connect (socket, (struct sockaddr *) & sin, sizeof (struct sockaddr_in));\n    if (result == -1 && errno == EINPROGRESS)\n      return 0;\n\n    return result;\n}\n\nENetSocket\nenet_socket_accept (ENetSocket socket, ENetAddress * address)\n{\n    int result;\n    struct sockaddr_in sin;\n    socklen_t sinLength = sizeof (struct sockaddr_in);\n\n    result = accept (socket, \n                     address != NULL ? (struct sockaddr *) & sin : NULL, \n                     address != NULL ? & sinLength : NULL);\n    \n    if (result == -1)\n      return ENET_SOCKET_NULL;\n\n    if (address != NULL)\n    {\n        address -> host = (enet_uint32) sin.sin_addr.s_addr;\n        address -> port = ENET_NET_TO_HOST_16 (sin.sin_port);\n    }\n\n    return result;\n} \n    \nint\nenet_socket_shutdown (ENetSocket socket, ENetSocketShutdown how)\n{\n    return shutdown (socket, (int) how);\n}\n\nvoid\nenet_socket_destroy (ENetSocket socket)\n{\n    if (socket != -1)\n      close (socket);\n}\n\nint\nenet_socket_send (ENetSocket socket,\n                  const ENetAddress * address,\n                  const ENetBuffer * buffers,\n                  size_t bufferCount)\n{\n    struct msghdr msgHdr;\n    struct sockaddr_in sin;\n    int sentLength;\n\n    memset (& msgHdr, 0, sizeof (struct msghdr));\n\n    if (address != NULL)\n    {\n        memset (& sin, 0, sizeof (struct sockaddr_in));\n\n        sin.sin_family = AF_INET;\n        sin.sin_port = ENET_HOST_TO_NET_16 (address -> port);\n        sin.sin_addr.s_addr = address -> host;\n\n        msgHdr.msg_name = & sin;\n        msgHdr.msg_namelen = sizeof (struct sockaddr_in);\n    }\n\n    msgHdr.msg_iov = (struct iovec *) buffers;\n    msgHdr.msg_iovlen = bufferCount;\n\n    sentLength = sendmsg (socket, & msgHdr, MSG_NOSIGNAL);\n    \n    if (sentLength == -1)\n    {\n       if (errno == EWOULDBLOCK)\n         return 0;\n\n       return -1;\n    }\n\n    return sentLength;\n}\n\nint\nenet_socket_receive (ENetSocket socket,\n                     ENetAddress * address,\n                     ENetBuffer * buffers,\n                     size_t bufferCount)\n{\n    struct msghdr msgHdr;\n    struct sockaddr_in sin;\n    int recvLength;\n\n    memset (& msgHdr, 0, sizeof (struct msghdr));\n\n    if (address != NULL)\n    {\n        msgHdr.msg_name = & sin;\n        msgHdr.msg_namelen = sizeof (struct sockaddr_in);\n    }\n\n    msgHdr.msg_iov = (struct iovec *) buffers;\n    msgHdr.msg_iovlen = bufferCount;\n\n    recvLength = recvmsg (socket, & msgHdr, MSG_NOSIGNAL);\n\n    if (recvLength == -1)\n    {\n       if (errno == EWOULDBLOCK)\n         return 0;\n\n       return -1;\n    }\n\n#ifdef HAS_MSGHDR_FLAGS\n    if (msgHdr.msg_flags & MSG_TRUNC)\n      return -1;\n#endif\n\n    if (address != NULL)\n    {\n        address -> host = (enet_uint32) sin.sin_addr.s_addr;\n        address -> port = ENET_NET_TO_HOST_16 (sin.sin_port);\n    }\n\n    return recvLength;\n}\n\nint\nenet_socketset_select (ENetSocket maxSocket, ENetSocketSet * readSet, ENetSocketSet * writeSet, enet_uint32 timeout)\n{\n    struct timeval timeVal;\n\n    timeVal.tv_sec = timeout / 1000;\n    timeVal.tv_usec = (timeout % 1000) * 1000;\n\n    return select (maxSocket + 1, readSet, writeSet, NULL, & timeVal);\n}\n\nint\nenet_socket_wait (ENetSocket socket, enet_uint32 * condition, enet_uint32 timeout)\n{\n#ifdef HAS_POLL\n    struct pollfd pollSocket;\n    int pollCount;\n    \n    pollSocket.fd = socket;\n    pollSocket.events = 0;\n\n    if (* condition & ENET_SOCKET_WAIT_SEND)\n      pollSocket.events |= POLLOUT;\n\n    if (* condition & ENET_SOCKET_WAIT_RECEIVE)\n      pollSocket.events |= POLLIN;\n\n    pollCount = poll (& pollSocket, 1, timeout);\n\n    if (pollCount < 0)\n    {\n        if (errno == EINTR && * condition & ENET_SOCKET_WAIT_INTERRUPT)\n        {\n            * condition = ENET_SOCKET_WAIT_INTERRUPT;\n\n            return 0;\n        }\n\n        return -1;\n    }\n\n    * condition = ENET_SOCKET_WAIT_NONE;\n\n    if (pollCount == 0)\n      return 0;\n\n    if (pollSocket.revents & POLLOUT)\n      * condition |= ENET_SOCKET_WAIT_SEND;\n    \n    if (pollSocket.revents & POLLIN)\n      * condition |= ENET_SOCKET_WAIT_RECEIVE;\n\n    return 0;\n#else\n    fd_set readSet, writeSet;\n    struct timeval timeVal;\n    int selectCount;\n\n    timeVal.tv_sec = timeout / 1000;\n    timeVal.tv_usec = (timeout % 1000) * 1000;\n\n    FD_ZERO (& readSet);\n    FD_ZERO (& writeSet);\n\n    if (* condition & ENET_SOCKET_WAIT_SEND)\n      FD_SET (socket, & writeSet);\n\n    if (* condition & ENET_SOCKET_WAIT_RECEIVE)\n      FD_SET (socket, & readSet);\n\n    selectCount = select (socket + 1, & readSet, & writeSet, NULL, & timeVal);\n\n    if (selectCount < 0)\n    {\n        if (errno == EINTR && * condition & ENET_SOCKET_WAIT_INTERRUPT)\n        {\n            * condition = ENET_SOCKET_WAIT_INTERRUPT;\n\n            return 0;\n        }\n      \n        return -1;\n    }\n\n    * condition = ENET_SOCKET_WAIT_NONE;\n\n    if (selectCount == 0)\n      return 0;\n\n    if (FD_ISSET (socket, & writeSet))\n      * condition |= ENET_SOCKET_WAIT_SEND;\n\n    if (FD_ISSET (socket, & readSet))\n      * condition |= ENET_SOCKET_WAIT_RECEIVE;\n\n    return 0;\n#endif\n}\n\n#endif\n\n"
  },
  {
    "path": "src/libraries/enet/libenet/win32.c",
    "content": "/** \n @file  win32.c\n @brief ENet Win32 system specific functions\n*/\n#ifdef _WIN32\n\n#define ENET_BUILDING_LIB 1\n#include \"enet/enet.h\"\n#include <windows.h>\n#include <mmsystem.h>\n\nstatic enet_uint32 timeBase = 0;\n\nint\nenet_initialize (void)\n{\n    WORD versionRequested = MAKEWORD (1, 1);\n    WSADATA wsaData;\n   \n    if (WSAStartup (versionRequested, & wsaData))\n       return -1;\n\n    if (LOBYTE (wsaData.wVersion) != 1||\n        HIBYTE (wsaData.wVersion) != 1)\n    {\n       WSACleanup ();\n       \n       return -1;\n    }\n\n    timeBeginPeriod (1);\n\n    return 0;\n}\n\nvoid\nenet_deinitialize (void)\n{\n    timeEndPeriod (1);\n\n    WSACleanup ();\n}\n\nenet_uint32\nenet_host_random_seed (void)\n{\n    return (enet_uint32) timeGetTime ();\n}\n\nenet_uint32\nenet_time_get (void)\n{\n    return (enet_uint32) timeGetTime () - timeBase;\n}\n\nvoid\nenet_time_set (enet_uint32 newTimeBase)\n{\n    timeBase = (enet_uint32) timeGetTime () - newTimeBase;\n}\n\nint\nenet_address_set_host (ENetAddress * address, const char * name)\n{\n    struct hostent * hostEntry;\n\n    hostEntry = gethostbyname (name);\n    if (hostEntry == NULL ||\n        hostEntry -> h_addrtype != AF_INET)\n    {\n        unsigned long host = inet_addr (name);\n        if (host == INADDR_NONE)\n            return -1;\n        address -> host = host;\n        return 0;\n    }\n\n    address -> host = * (enet_uint32 *) hostEntry -> h_addr_list [0];\n\n    return 0;\n}\n\nint\nenet_address_get_host_ip (const ENetAddress * address, char * name, size_t nameLength)\n{\n    char * addr = inet_ntoa (* (struct in_addr *) & address -> host);\n    if (addr == NULL)\n        return -1;\n    else\n    {\n        size_t addrLen = strlen(addr);\n        if (addrLen >= nameLength)\n          return -1;\n        memcpy (name, addr, addrLen + 1);\n    }\n    return 0;\n}\n\nint\nenet_address_get_host (const ENetAddress * address, char * name, size_t nameLength)\n{\n    struct in_addr in;\n    struct hostent * hostEntry;\n \n    in.s_addr = address -> host;\n    \n    hostEntry = gethostbyaddr ((char *) & in, sizeof (struct in_addr), AF_INET);\n    if (hostEntry == NULL)\n      return enet_address_get_host_ip (address, name, nameLength);\n    else\n    {\n       size_t hostLen = strlen (hostEntry -> h_name);\n       if (hostLen >= nameLength)\n         return -1;\n       memcpy (name, hostEntry -> h_name, hostLen + 1);\n    }\n\n    return 0;\n}\n\nint\nenet_socket_bind (ENetSocket socket, const ENetAddress * address)\n{\n    struct sockaddr_in sin;\n\n    memset (& sin, 0, sizeof (struct sockaddr_in));\n\n    sin.sin_family = AF_INET;\n\n    if (address != NULL)\n    {\n       sin.sin_port = ENET_HOST_TO_NET_16 (address -> port);\n       sin.sin_addr.s_addr = address -> host;\n    }\n    else\n    {\n       sin.sin_port = 0;\n       sin.sin_addr.s_addr = INADDR_ANY;\n    }\n\n    return bind (socket,\n                 (struct sockaddr *) & sin,\n                 sizeof (struct sockaddr_in)) == SOCKET_ERROR ? -1 : 0;\n}\n\nint\nenet_socket_get_address (ENetSocket socket, ENetAddress * address)\n{\n    struct sockaddr_in sin;\n    int sinLength = sizeof (struct sockaddr_in);\n\n    if (getsockname (socket, (struct sockaddr *) & sin, & sinLength) == -1)\n      return -1;\n\n    address -> host = (enet_uint32) sin.sin_addr.s_addr;\n    address -> port = ENET_NET_TO_HOST_16 (sin.sin_port);\n\n    return 0;\n}\n\nint\nenet_socket_listen (ENetSocket socket, int backlog)\n{\n    return listen (socket, backlog < 0 ? SOMAXCONN : backlog) == SOCKET_ERROR ? -1 : 0;\n}\n\nENetSocket\nenet_socket_create (ENetSocketType type)\n{\n    return socket (PF_INET, type == ENET_SOCKET_TYPE_DATAGRAM ? SOCK_DGRAM : SOCK_STREAM, 0);\n}\n\nint\nenet_socket_set_option (ENetSocket socket, ENetSocketOption option, int value)\n{\n    int result = SOCKET_ERROR;\n    switch (option)\n    {\n        case ENET_SOCKOPT_NONBLOCK:\n        {\n            u_long nonBlocking = (u_long) value;\n            result = ioctlsocket (socket, FIONBIO, & nonBlocking);\n            break;\n        }\n\n        case ENET_SOCKOPT_BROADCAST:\n            result = setsockopt (socket, SOL_SOCKET, SO_BROADCAST, (char *) & value, sizeof (int));\n            break;\n\n        case ENET_SOCKOPT_REUSEADDR:\n            result = setsockopt (socket, SOL_SOCKET, SO_REUSEADDR, (char *) & value, sizeof (int));\n            break;\n\n        case ENET_SOCKOPT_RCVBUF:\n            result = setsockopt (socket, SOL_SOCKET, SO_RCVBUF, (char *) & value, sizeof (int));\n            break;\n\n        case ENET_SOCKOPT_SNDBUF:\n            result = setsockopt (socket, SOL_SOCKET, SO_SNDBUF, (char *) & value, sizeof (int));\n            break;\n\n        case ENET_SOCKOPT_RCVTIMEO:\n            result = setsockopt (socket, SOL_SOCKET, SO_RCVTIMEO, (char *) & value, sizeof (int));\n            break;\n\n        case ENET_SOCKOPT_SNDTIMEO:\n            result = setsockopt (socket, SOL_SOCKET, SO_SNDTIMEO, (char *) & value, sizeof (int));\n            break;\n\n        case ENET_SOCKOPT_NODELAY:\n            result = setsockopt (socket, IPPROTO_TCP, TCP_NODELAY, (char *) & value, sizeof (int));\n            break;\n\n        default:\n            break;\n    }\n    return result == SOCKET_ERROR ? -1 : 0;\n}\n\nint\nenet_socket_get_option (ENetSocket socket, ENetSocketOption option, int * value)\n{\n    int result = SOCKET_ERROR, len;\n    switch (option)\n    {\n        case ENET_SOCKOPT_ERROR:\n            len = sizeof(int);\n            result = getsockopt (socket, SOL_SOCKET, SO_ERROR, (char *) value, & len);\n            break;\n\n        default:\n            break;\n    }\n    return result == SOCKET_ERROR ? -1 : 0;\n}\n\nint\nenet_socket_connect (ENetSocket socket, const ENetAddress * address)\n{\n    struct sockaddr_in sin;\n    int result;\n\n    memset (& sin, 0, sizeof (struct sockaddr_in));\n\n    sin.sin_family = AF_INET;\n    sin.sin_port = ENET_HOST_TO_NET_16 (address -> port);\n    sin.sin_addr.s_addr = address -> host;\n\n    result = connect (socket, (struct sockaddr *) & sin, sizeof (struct sockaddr_in));\n    if (result == SOCKET_ERROR && WSAGetLastError () != WSAEWOULDBLOCK)\n      return -1;\n\n    return 0;\n}\n\nENetSocket\nenet_socket_accept (ENetSocket socket, ENetAddress * address)\n{\n    SOCKET result;\n    struct sockaddr_in sin;\n    int sinLength = sizeof (struct sockaddr_in);\n\n    result = accept (socket, \n                     address != NULL ? (struct sockaddr *) & sin : NULL, \n                     address != NULL ? & sinLength : NULL);\n\n    if (result == INVALID_SOCKET)\n      return ENET_SOCKET_NULL;\n\n    if (address != NULL)\n    {\n        address -> host = (enet_uint32) sin.sin_addr.s_addr;\n        address -> port = ENET_NET_TO_HOST_16 (sin.sin_port);\n    }\n\n    return result;\n}\n\nint\nenet_socket_shutdown (ENetSocket socket, ENetSocketShutdown how)\n{\n    return shutdown (socket, (int) how) == SOCKET_ERROR ? -1 : 0;\n}\n\nvoid\nenet_socket_destroy (ENetSocket socket)\n{\n    if (socket != INVALID_SOCKET)\n      closesocket (socket);\n}\n\nint\nenet_socket_send (ENetSocket socket,\n                  const ENetAddress * address,\n                  const ENetBuffer * buffers,\n                  size_t bufferCount)\n{\n    struct sockaddr_in sin;\n    DWORD sentLength;\n\n    if (address != NULL)\n    {\n        memset (& sin, 0, sizeof (struct sockaddr_in));\n\n        sin.sin_family = AF_INET;\n        sin.sin_port = ENET_HOST_TO_NET_16 (address -> port);\n        sin.sin_addr.s_addr = address -> host;\n    }\n\n    if (WSASendTo (socket, \n                   (LPWSABUF) buffers,\n                   (DWORD) bufferCount,\n                   & sentLength,\n                   0,\n                   address != NULL ? (struct sockaddr *) & sin : NULL,\n                   address != NULL ? sizeof (struct sockaddr_in) : 0,\n                   NULL,\n                   NULL) == SOCKET_ERROR)\n    {\n       if (WSAGetLastError () == WSAEWOULDBLOCK)\n         return 0;\n\n       return -1;\n    }\n\n    return (int) sentLength;\n}\n\nint\nenet_socket_receive (ENetSocket socket,\n                     ENetAddress * address,\n                     ENetBuffer * buffers,\n                     size_t bufferCount)\n{\n    INT sinLength = sizeof (struct sockaddr_in);\n    DWORD flags = 0,\n          recvLength;\n    struct sockaddr_in sin;\n\n    if (WSARecvFrom (socket,\n                     (LPWSABUF) buffers,\n                     (DWORD) bufferCount,\n                     & recvLength,\n                     & flags,\n                     address != NULL ? (struct sockaddr *) & sin : NULL,\n                     address != NULL ? & sinLength : NULL,\n                     NULL,\n                     NULL) == SOCKET_ERROR)\n    {\n       switch (WSAGetLastError ())\n       {\n       case WSAEWOULDBLOCK:\n       case WSAECONNRESET:\n          return 0;\n       }\n\n       return -1;\n    }\n\n    if (flags & MSG_PARTIAL)\n      return -1;\n\n    if (address != NULL)\n    {\n        address -> host = (enet_uint32) sin.sin_addr.s_addr;\n        address -> port = ENET_NET_TO_HOST_16 (sin.sin_port);\n    }\n\n    return (int) recvLength;\n}\n\nint\nenet_socketset_select (ENetSocket maxSocket, ENetSocketSet * readSet, ENetSocketSet * writeSet, enet_uint32 timeout)\n{\n    struct timeval timeVal;\n\n    timeVal.tv_sec = timeout / 1000;\n    timeVal.tv_usec = (timeout % 1000) * 1000;\n\n    return select (maxSocket + 1, readSet, writeSet, NULL, & timeVal);\n}\n\nint\nenet_socket_wait (ENetSocket socket, enet_uint32 * condition, enet_uint32 timeout)\n{\n    fd_set readSet, writeSet;\n    struct timeval timeVal;\n    int selectCount;\n    \n    timeVal.tv_sec = timeout / 1000;\n    timeVal.tv_usec = (timeout % 1000) * 1000;\n    \n    FD_ZERO (& readSet);\n    FD_ZERO (& writeSet);\n\n    if (* condition & ENET_SOCKET_WAIT_SEND)\n      FD_SET (socket, & writeSet);\n\n    if (* condition & ENET_SOCKET_WAIT_RECEIVE)\n      FD_SET (socket, & readSet);\n\n    selectCount = select (socket + 1, & readSet, & writeSet, NULL, & timeVal);\n\n    if (selectCount < 0)\n      return -1;\n\n    * condition = ENET_SOCKET_WAIT_NONE;\n\n    if (selectCount == 0)\n      return 0;\n\n    if (FD_ISSET (socket, & writeSet))\n      * condition |= ENET_SOCKET_WAIT_SEND;\n    \n    if (FD_ISSET (socket, & readSet))\n      * condition |= ENET_SOCKET_WAIT_RECEIVE;\n\n    return 0;\n} \n\n#endif\n\n"
  },
  {
    "path": "src/libraries/enet/lua-enet.h",
    "content": "/**\n* Copyright (c) 2006-2026 LOVE Development Team\n* \n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n* \n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n* \n* 1. The origin of this software must not be misrepresented; you must not\n*    claim that you wrote the original software. If you use this software\n*    in a product, an acknowledgment in the product documentation would be\n*    appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n*    misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n**/\n\n#ifndef LOVE_LUAENET_LUAENET_H\n#define LOVE_LUAENET_LUAENET_H\n\nint luaopen_enet(lua_State * L);\n\n#endif // LOVE_LUAENET_LUAENET_H\n"
  },
  {
    "path": "src/libraries/glad/glad.cpp",
    "content": "#include <string.h>\n\n#ifdef GLAD_USE_SDL\n#include <SDL.h>\n#if !SDL_VERSION_ATLEAST(2,0,0)\n#error SDL 2 is required!\n#endif\n#else\n#include <assert.h>\n#endif\n\n#include \"glad.hpp\"\n\nnamespace glad {\n\nbool gladLoadGL(void) {\n#ifdef GLAD_USE_SDL\n    return gladLoadGLLoader(SDL_GL_GetProcAddress);\n#else\n    // generic gladLoadGL is not implemented, use gladLoadGLLoader or define GLAD_USE_SDL\n    assert(0);\n    return false;\n#endif\n}\n\nstruct {\n    int major;\n    int minor;\n    int gles;\n} GLVersion;\n\n\nstatic bool has_ext(const char *ext) {\n    if(GLVersion.major < 3) {\n        const char *extensions;\n        const char *loc;\n        const char *terminator;\n        extensions = (const char *)fp_glGetString(GL_EXTENSIONS);\n        if(extensions == NULL || ext == NULL) {\n            return false;\n        }\n\n        while(1) {\n            loc = strstr(extensions, ext);\n            if(loc == NULL) {\n                return false;\n            }\n\n            terminator = loc + strlen(ext);\n            if((loc == extensions || *(loc - 1) == ' ') &&\n                (*terminator == ' ' || *terminator == '\\0')) {\n                return true;\n            }\n            extensions = terminator;\n        }\n    } else {\n        int num;\n        fp_glGetIntegerv(GL_NUM_EXTENSIONS, &num);\n\n        int index;\n        for(index = 0; index < num; index++) {\n            const char *e = (const char*)fp_glGetStringi(GL_EXTENSIONS, index);\n            if(strcmp(e, ext) == 0) {\n                return true;\n            }\n        }\n    }\n\n    return false;\n}\n\npfn_glCopyTexImage1D fp_glCopyTexImage1D;\npfn_glTextureParameterf fp_glTextureParameterf;\npfn_glVertexAttribI3ui fp_glVertexAttribI3ui;\npfn_glVertexArrayElementBuffer fp_glVertexArrayElementBuffer;\npfn_glWindowPos2s fp_glWindowPos2s;\npfn_glTextureStorage3DMultisample fp_glTextureStorage3DMultisample;\npfn_glTextureParameterfv fp_glTextureParameterfv;\npfn_glWindowPos2i fp_glWindowPos2i;\npfn_glWindowPos2f fp_glWindowPos2f;\npfn_glWindowPos2d fp_glWindowPos2d;\npfn_glVertex2fv fp_glVertex2fv;\npfn_glIndexi fp_glIndexi;\npfn_glFramebufferRenderbuffer fp_glFramebufferRenderbuffer;\npfn_glUniformSubroutinesuiv fp_glUniformSubroutinesuiv;\npfn_glRectdv fp_glRectdv;\npfn_glCompressedTexSubImage3D fp_glCompressedTexSubImage3D;\npfn_glEvalCoord2d fp_glEvalCoord2d;\npfn_glEvalCoord2f fp_glEvalCoord2f;\npfn_glGetDoublei_v fp_glGetDoublei_v;\npfn_glIndexd fp_glIndexd;\npfn_glVertexAttrib1sv fp_glVertexAttrib1sv;\npfn_glIndexf fp_glIndexf;\npfn_glBindSampler fp_glBindSampler;\npfn_glLineWidth fp_glLineWidth;\npfn_glColorP3uiv fp_glColorP3uiv;\npfn_glGetIntegeri_v fp_glGetIntegeri_v;\npfn_glGetMapfv fp_glGetMapfv;\npfn_glIndexs fp_glIndexs;\npfn_glCompileShader fp_glCompileShader;\npfn_glGetTransformFeedbackVarying fp_glGetTransformFeedbackVarying;\npfn_glWindowPos2iv fp_glWindowPos2iv;\npfn_glDrawTransformFeedbackStreamInstanced fp_glDrawTransformFeedbackStreamInstanced;\npfn_glIndexfv fp_glIndexfv;\npfn_glGetCompressedTextureImage fp_glGetCompressedTextureImage;\npfn_glGetnMapfv fp_glGetnMapfv;\npfn_glFogiv fp_glFogiv;\npfn_glStencilMaskSeparate fp_glStencilMaskSeparate;\npfn_glRasterPos2fv fp_glRasterPos2fv;\npfn_glLightModeliv fp_glLightModeliv;\npfn_glDepthRangef fp_glDepthRangef;\npfn_glColor4ui fp_glColor4ui;\npfn_glSecondaryColor3fv fp_glSecondaryColor3fv;\npfn_glMultiTexCoordP3ui fp_glMultiTexCoordP3ui;\npfn_glMemoryBarrierByRegion fp_glMemoryBarrierByRegion;\npfn_glGetNamedBufferParameteriv fp_glGetNamedBufferParameteriv;\npfn_glFogfv fp_glFogfv;\npfn_glVertexP4ui fp_glVertexP4ui;\npfn_glDrawElementsInstancedBaseInstance fp_glDrawElementsInstancedBaseInstance;\npfn_glEnablei fp_glEnablei;\npfn_glProgramUniform3dv fp_glProgramUniform3dv;\npfn_glVertex4iv fp_glVertex4iv;\npfn_glEvalCoord1fv fp_glEvalCoord1fv;\npfn_glWindowPos2sv fp_glWindowPos2sv;\npfn_glVertexAttribP4ui fp_glVertexAttribP4ui;\npfn_glCreateShader fp_glCreateShader;\npfn_glIsBuffer fp_glIsBuffer;\npfn_glGetMultisamplefv fp_glGetMultisamplefv;\npfn_glProgramUniformMatrix2dv fp_glProgramUniformMatrix2dv;\npfn_glGenRenderbuffers fp_glGenRenderbuffers;\npfn_glCopyTexSubImage2D fp_glCopyTexSubImage2D;\npfn_glCompressedTexImage2D fp_glCompressedTexImage2D;\npfn_glVertexAttrib1f fp_glVertexAttrib1f;\npfn_glBlendFuncSeparate fp_glBlendFuncSeparate;\npfn_glVertex4fv fp_glVertex4fv;\npfn_glMinSampleShading fp_glMinSampleShading;\npfn_glClearNamedFramebufferfi fp_glClearNamedFramebufferfi;\npfn_glGetQueryBufferObjectuiv fp_glGetQueryBufferObjectuiv;\npfn_glBindTexture fp_glBindTexture;\npfn_glVertexAttrib1s fp_glVertexAttrib1s;\npfn_glTexCoord2fv fp_glTexCoord2fv;\npfn_glSampleMaski fp_glSampleMaski;\npfn_glVertexP2ui fp_glVertexP2ui;\npfn_glDrawRangeElementsBaseVertex fp_glDrawRangeElementsBaseVertex;\npfn_glTexCoord4fv fp_glTexCoord4fv;\npfn_glUniformMatrix3x2fv fp_glUniformMatrix3x2fv;\npfn_glDebugMessageControl fp_glDebugMessageControl;\npfn_glPointSize fp_glPointSize;\npfn_glBindTextureUnit fp_glBindTextureUnit;\npfn_glVertexAttrib2dv fp_glVertexAttrib2dv;\npfn_glDeleteProgram fp_glDeleteProgram;\npfn_glColor4bv fp_glColor4bv;\npfn_glRasterPos2f fp_glRasterPos2f;\npfn_glRasterPos2d fp_glRasterPos2d;\npfn_glLoadIdentity fp_glLoadIdentity;\npfn_glRasterPos2i fp_glRasterPos2i;\npfn_glMultiDrawArraysIndirect fp_glMultiDrawArraysIndirect;\npfn_glRenderbufferStorage fp_glRenderbufferStorage;\npfn_glUniformMatrix4x3fv fp_glUniformMatrix4x3fv;\npfn_glColor3b fp_glColor3b;\npfn_glClearBufferfv fp_glClearBufferfv;\npfn_glEdgeFlag fp_glEdgeFlag;\npfn_glDeleteSamplers fp_glDeleteSamplers;\npfn_glVertex3d fp_glVertex3d;\npfn_glVertex3f fp_glVertex3f;\npfn_glGetnMapiv fp_glGetnMapiv;\npfn_glVertex3i fp_glVertex3i;\npfn_glColor3i fp_glColor3i;\npfn_glUniform3d fp_glUniform3d;\npfn_glUniform3f fp_glUniform3f;\npfn_glVertexAttrib4ubv fp_glVertexAttrib4ubv;\npfn_glColor3s fp_glColor3s;\npfn_glVertex3s fp_glVertex3s;\npfn_glTexCoordP2ui fp_glTexCoordP2ui;\npfn_glColorMaski fp_glColorMaski;\npfn_glClearBufferfi fp_glClearBufferfi;\npfn_glDrawArraysIndirect fp_glDrawArraysIndirect;\npfn_glTexCoord1iv fp_glTexCoord1iv;\npfn_glBlitFramebuffer fp_glBlitFramebuffer;\npfn_glPauseTransformFeedback fp_glPauseTransformFeedback;\npfn_glMultiTexCoordP2ui fp_glMultiTexCoordP2ui;\npfn_glProgramUniformMatrix3x2dv fp_glProgramUniformMatrix3x2dv;\npfn_glCopyNamedBufferSubData fp_glCopyNamedBufferSubData;\npfn_glNamedFramebufferTexture fp_glNamedFramebufferTexture;\npfn_glProgramUniformMatrix3x2fv fp_glProgramUniformMatrix3x2fv;\npfn_glGetSamplerParameterIiv fp_glGetSamplerParameterIiv;\npfn_glGetFragDataIndex fp_glGetFragDataIndex;\npfn_glVertexAttribL4d fp_glVertexAttribL4d;\npfn_glBindImageTexture fp_glBindImageTexture;\npfn_glVertexAttrib3f fp_glVertexAttrib3f;\npfn_glProgramUniformMatrix4fv fp_glProgramUniformMatrix4fv;\npfn_glVertex2iv fp_glVertex2iv;\npfn_glGetQueryBufferObjecti64v fp_glGetQueryBufferObjecti64v;\npfn_glColor3sv fp_glColor3sv;\npfn_glGetVertexAttribdv fp_glGetVertexAttribdv;\npfn_glActiveShaderProgram fp_glActiveShaderProgram;\npfn_glUniformMatrix3x4fv fp_glUniformMatrix3x4fv;\npfn_glUniformMatrix3dv fp_glUniformMatrix3dv;\npfn_glNormalPointer fp_glNormalPointer;\npfn_glTexCoordP3uiv fp_glTexCoordP3uiv;\npfn_glVertex4sv fp_glVertex4sv;\npfn_glVertexArrayAttribLFormat fp_glVertexArrayAttribLFormat;\npfn_glInvalidateBufferSubData fp_glInvalidateBufferSubData;\npfn_glPassThrough fp_glPassThrough;\npfn_glMultiTexCoordP4ui fp_glMultiTexCoordP4ui;\npfn_glFogi fp_glFogi;\npfn_glBegin fp_glBegin;\npfn_glEvalCoord2dv fp_glEvalCoord2dv;\npfn_glColor3ubv fp_glColor3ubv;\npfn_glVertexPointer fp_glVertexPointer;\npfn_glSecondaryColor3uiv fp_glSecondaryColor3uiv;\npfn_glDeleteFramebuffers fp_glDeleteFramebuffers;\npfn_glDrawArrays fp_glDrawArrays;\npfn_glUniform1ui fp_glUniform1ui;\npfn_glGetTransformFeedbackiv fp_glGetTransformFeedbackiv;\npfn_glMultiTexCoord1d fp_glMultiTexCoord1d;\npfn_glMultiTexCoord1f fp_glMultiTexCoord1f;\npfn_glProgramParameteri fp_glProgramParameteri;\npfn_glLightfv fp_glLightfv;\npfn_glTexCoordP3ui fp_glTexCoordP3ui;\npfn_glVertexAttrib3d fp_glVertexAttrib3d;\npfn_glClear fp_glClear;\npfn_glMultiTexCoord1i fp_glMultiTexCoord1i;\npfn_glGetActiveUniformName fp_glGetActiveUniformName;\npfn_glMemoryBarrier fp_glMemoryBarrier;\npfn_glGetGraphicsResetStatus fp_glGetGraphicsResetStatus;\npfn_glMultiTexCoord1s fp_glMultiTexCoord1s;\npfn_glIsEnabled fp_glIsEnabled;\npfn_glStencilOp fp_glStencilOp;\npfn_glGetQueryObjectuiv fp_glGetQueryObjectuiv;\npfn_glFramebufferTexture2D fp_glFramebufferTexture2D;\npfn_glGetFramebufferAttachmentParameteriv fp_glGetFramebufferAttachmentParameteriv;\npfn_glTranslatef fp_glTranslatef;\npfn_glVertexAttrib4Nub fp_glVertexAttrib4Nub;\npfn_glTranslated fp_glTranslated;\npfn_glTexCoord3sv fp_glTexCoord3sv;\npfn_glGetFragDataLocation fp_glGetFragDataLocation;\npfn_glGetTextureParameterIiv fp_glGetTextureParameterIiv;\npfn_glTexImage1D fp_glTexImage1D;\npfn_glCopyTextureSubImage3D fp_glCopyTextureSubImage3D;\npfn_glVertexP3uiv fp_glVertexP3uiv;\npfn_glTexParameteriv fp_glTexParameteriv;\npfn_glVertexArrayAttribIFormat fp_glVertexArrayAttribIFormat;\npfn_glSecondaryColor3bv fp_glSecondaryColor3bv;\npfn_glGetMaterialfv fp_glGetMaterialfv;\npfn_glGetTexImage fp_glGetTexImage;\npfn_glFogCoordfv fp_glFogCoordfv;\npfn_glPixelMapuiv fp_glPixelMapuiv;\npfn_glGetShaderInfoLog fp_glGetShaderInfoLog;\npfn_glGetQueryObjecti64v fp_glGetQueryObjecti64v;\npfn_glGenFramebuffers fp_glGenFramebuffers;\npfn_glCreateTextures fp_glCreateTextures;\npfn_glTransformFeedbackBufferBase fp_glTransformFeedbackBufferBase;\npfn_glIndexsv fp_glIndexsv;\npfn_glClearTexSubImage fp_glClearTexSubImage;\npfn_glProgramUniformMatrix3x4dv fp_glProgramUniformMatrix3x4dv;\npfn_glGetAttachedShaders fp_glGetAttachedShaders;\npfn_glIsRenderbuffer fp_glIsRenderbuffer;\npfn_glVertex3iv fp_glVertex3iv;\npfn_glBitmap fp_glBitmap;\npfn_glGetDebugMessageLog fp_glGetDebugMessageLog;\npfn_glProgramUniform1uiv fp_glProgramUniform1uiv;\npfn_glMateriali fp_glMateriali;\npfn_glIsVertexArray fp_glIsVertexArray;\npfn_glDisableVertexAttribArray fp_glDisableVertexAttribArray;\npfn_glProgramUniform2iv fp_glProgramUniform2iv;\npfn_glGetQueryiv fp_glGetQueryiv;\npfn_glTexCoord4f fp_glTexCoord4f;\npfn_glBlitNamedFramebuffer fp_glBlitNamedFramebuffer;\npfn_glTexCoord4d fp_glTexCoord4d;\npfn_glCreateQueries fp_glCreateQueries;\npfn_glGetSamplerParameterfv fp_glGetSamplerParameterfv;\npfn_glTexCoord4i fp_glTexCoord4i;\npfn_glShaderStorageBlockBinding fp_glShaderStorageBlockBinding;\npfn_glMaterialf fp_glMaterialf;\npfn_glTexCoord4s fp_glTexCoord4s;\npfn_glProgramUniformMatrix4x2dv fp_glProgramUniformMatrix4x2dv;\npfn_glGetUniformIndices fp_glGetUniformIndices;\npfn_glIsShader fp_glIsShader;\npfn_glMultiTexCoord2s fp_glMultiTexCoord2s;\npfn_glVertexAttribI4ubv fp_glVertexAttribI4ubv;\npfn_glVertex3dv fp_glVertex3dv;\npfn_glGetInteger64v fp_glGetInteger64v;\npfn_glPointParameteriv fp_glPointParameteriv;\npfn_glGetnMinmax fp_glGetnMinmax;\npfn_glEnable fp_glEnable;\npfn_glGetActiveUniformsiv fp_glGetActiveUniformsiv;\npfn_glColor4fv fp_glColor4fv;\npfn_glTexCoord1fv fp_glTexCoord1fv;\npfn_glVertexArrayAttribBinding fp_glVertexArrayAttribBinding;\npfn_glTextureStorage1D fp_glTextureStorage1D;\npfn_glPopDebugGroup fp_glPopDebugGroup;\npfn_glBlendEquationi fp_glBlendEquationi;\npfn_glTexCoord2sv fp_glTexCoord2sv;\npfn_glVertexAttrib4dv fp_glVertexAttrib4dv;\npfn_glMultiTexCoord1dv fp_glMultiTexCoord1dv;\npfn_glGetProgramInterfaceiv fp_glGetProgramInterfaceiv;\npfn_glMultiTexCoord2i fp_glMultiTexCoord2i;\npfn_glTexCoord3fv fp_glTexCoord3fv;\npfn_glSecondaryColor3usv fp_glSecondaryColor3usv;\npfn_glTexGenf fp_glTexGenf;\npfn_glMapNamedBuffer fp_glMapNamedBuffer;\npfn_glMultiTexCoordP3uiv fp_glMultiTexCoordP3uiv;\npfn_glVertexAttribP3ui fp_glVertexAttribP3ui;\npfn_glVertexAttribL1dv fp_glVertexAttribL1dv;\npfn_glTextureBufferRange fp_glTextureBufferRange;\npfn_glGetnUniformdv fp_glGetnUniformdv;\npfn_glMultiTexCoordP1ui fp_glMultiTexCoordP1ui;\npfn_glProgramUniform3ui fp_glProgramUniform3ui;\npfn_glTransformFeedbackBufferRange fp_glTransformFeedbackBufferRange;\npfn_glGetPointerv fp_glGetPointerv;\npfn_glVertexBindingDivisor fp_glVertexBindingDivisor;\npfn_glPolygonOffset fp_glPolygonOffset;\npfn_glGetUniformuiv fp_glGetUniformuiv;\npfn_glNormal3fv fp_glNormal3fv;\npfn_glSecondaryColor3s fp_glSecondaryColor3s;\npfn_glNamedFramebufferDrawBuffers fp_glNamedFramebufferDrawBuffers;\npfn_glDepthRange fp_glDepthRange;\npfn_glFrustum fp_glFrustum;\npfn_glMultiTexCoord4sv fp_glMultiTexCoord4sv;\npfn_glVertexArrayBindingDivisor fp_glVertexArrayBindingDivisor;\npfn_glDrawBuffer fp_glDrawBuffer;\npfn_glPushMatrix fp_glPushMatrix;\npfn_glGetnPixelMapusv fp_glGetnPixelMapusv;\npfn_glRasterPos3fv fp_glRasterPos3fv;\npfn_glOrtho fp_glOrtho;\npfn_glDrawElementsInstanced fp_glDrawElementsInstanced;\npfn_glWindowPos3sv fp_glWindowPos3sv;\npfn_glVertexAttribL4dv fp_glVertexAttribL4dv;\npfn_glProgramUniform1i fp_glProgramUniform1i;\npfn_glUniform2dv fp_glUniform2dv;\npfn_glProgramUniform1d fp_glProgramUniform1d;\npfn_glProgramUniform1f fp_glProgramUniform1f;\npfn_glClearIndex fp_glClearIndex;\npfn_glMap1d fp_glMap1d;\npfn_glMap1f fp_glMap1f;\npfn_glFlush fp_glFlush;\npfn_glGetRenderbufferParameteriv fp_glGetRenderbufferParameteriv;\npfn_glBeginQueryIndexed fp_glBeginQueryIndexed;\npfn_glProgramUniform3iv fp_glProgramUniform3iv;\npfn_glIndexiv fp_glIndexiv;\npfn_glNamedRenderbufferStorage fp_glNamedRenderbufferStorage;\npfn_glRasterPos3sv fp_glRasterPos3sv;\npfn_glGetVertexAttribPointerv fp_glGetVertexAttribPointerv;\npfn_glPixelZoom fp_glPixelZoom;\npfn_glFenceSync fp_glFenceSync;\npfn_glDeleteVertexArrays fp_glDeleteVertexArrays;\npfn_glColorP3ui fp_glColorP3ui;\npfn_glDrawElementsInstancedBaseVertexBaseInstance fp_glDrawElementsInstancedBaseVertexBaseInstance;\npfn_glTextureStorage2DMultisample fp_glTextureStorage2DMultisample;\npfn_glVertexAttrib3sv fp_glVertexAttrib3sv;\npfn_glBeginConditionalRender fp_glBeginConditionalRender;\npfn_glPushDebugGroup fp_glPushDebugGroup;\npfn_glGetShaderPrecisionFormat fp_glGetShaderPrecisionFormat;\npfn_glValidateProgramPipeline fp_glValidateProgramPipeline;\npfn_glDrawElementsBaseVertex fp_glDrawElementsBaseVertex;\npfn_glGetTexLevelParameteriv fp_glGetTexLevelParameteriv;\npfn_glLighti fp_glLighti;\npfn_glMultiTexCoordP4uiv fp_glMultiTexCoordP4uiv;\npfn_glVertexArrayVertexBuffer fp_glVertexArrayVertexBuffer;\npfn_glLightf fp_glLightf;\npfn_glBindVertexBuffers fp_glBindVertexBuffers;\npfn_glGetAttribLocation fp_glGetAttribLocation;\npfn_glTexStorage3DMultisample fp_glTexStorage3DMultisample;\npfn_glStencilFuncSeparate fp_glStencilFuncSeparate;\npfn_glDisableVertexArrayAttrib fp_glDisableVertexArrayAttrib;\npfn_glGenSamplers fp_glGenSamplers;\npfn_glClampColor fp_glClampColor;\npfn_glUniform4iv fp_glUniform4iv;\npfn_glClearStencil fp_glClearStencil;\npfn_glTexCoordP1uiv fp_glTexCoordP1uiv;\npfn_glGetNamedRenderbufferParameteriv fp_glGetNamedRenderbufferParameteriv;\npfn_glDrawTransformFeedbackInstanced fp_glDrawTransformFeedbackInstanced;\npfn_glMultiTexCoord3fv fp_glMultiTexCoord3fv;\npfn_glGetPixelMapuiv fp_glGetPixelMapuiv;\npfn_glGenTextures fp_glGenTextures;\npfn_glTexCoord4iv fp_glTexCoord4iv;\npfn_glDrawTransformFeedback fp_glDrawTransformFeedback;\npfn_glUniform1dv fp_glUniform1dv;\npfn_glGetTexParameterIuiv fp_glGetTexParameterIuiv;\npfn_glGetTransformFeedbacki_v fp_glGetTransformFeedbacki_v;\npfn_glIndexPointer fp_glIndexPointer;\npfn_glGetnPolygonStipple fp_glGetnPolygonStipple;\npfn_glVertexAttrib4Nbv fp_glVertexAttrib4Nbv;\npfn_glClearNamedFramebufferuiv fp_glClearNamedFramebufferuiv;\npfn_glGetVertexArrayIndexediv fp_glGetVertexArrayIndexediv;\npfn_glIsSync fp_glIsSync;\npfn_glVertex2f fp_glVertex2f;\npfn_glVertex2d fp_glVertex2d;\npfn_glDeleteRenderbuffers fp_glDeleteRenderbuffers;\npfn_glUniform2i fp_glUniform2i;\npfn_glMapGrid2d fp_glMapGrid2d;\npfn_glMapGrid2f fp_glMapGrid2f;\npfn_glTexCoordP4ui fp_glTexCoordP4ui;\npfn_glVertex2i fp_glVertex2i;\npfn_glVertexAttribPointer fp_glVertexAttribPointer;\npfn_glProgramUniform1ui fp_glProgramUniform1ui;\npfn_glFramebufferTextureLayer fp_glFramebufferTextureLayer;\npfn_glVertex2s fp_glVertex2s;\npfn_glGetObjectPtrLabel fp_glGetObjectPtrLabel;\npfn_glTextureParameteri fp_glTextureParameteri;\npfn_glNormal3bv fp_glNormal3bv;\npfn_glVertexAttrib4Nuiv fp_glVertexAttrib4Nuiv;\npfn_glFlushMappedBufferRange fp_glFlushMappedBufferRange;\npfn_glProgramUniform2fv fp_glProgramUniform2fv;\npfn_glUniformMatrix2x3dv fp_glUniformMatrix2x3dv;\npfn_glProgramUniformMatrix4dv fp_glProgramUniformMatrix4dv;\npfn_glSecondaryColor3sv fp_glSecondaryColor3sv;\npfn_glPrimitiveBoundingBox fp_glPrimitiveBoundingBox;\npfn_glProgramUniformMatrix2x4dv fp_glProgramUniformMatrix2x4dv;\npfn_glDispatchCompute fp_glDispatchCompute;\npfn_glVertex3sv fp_glVertex3sv;\npfn_glGenQueries fp_glGenQueries;\npfn_glGetPixelMapfv fp_glGetPixelMapfv;\npfn_glTexEnvf fp_glTexEnvf;\npfn_glVertexAttribP1ui fp_glVertexAttribP1ui;\npfn_glTexSubImage3D fp_glTexSubImage3D;\npfn_glGetInteger64i_v fp_glGetInteger64i_v;\npfn_glFogCoordd fp_glFogCoordd;\npfn_glFogCoordf fp_glFogCoordf;\npfn_glCopyTexImage2D fp_glCopyTexImage2D;\npfn_glTexEnvi fp_glTexEnvi;\npfn_glMultiTexCoord1iv fp_glMultiTexCoord1iv;\npfn_glIsEnabledi fp_glIsEnabledi;\npfn_glBindBuffersRange fp_glBindBuffersRange;\npfn_glSecondaryColorP3ui fp_glSecondaryColorP3ui;\npfn_glVertexAttribI2i fp_glVertexAttribI2i;\npfn_glBindFragDataLocationIndexed fp_glBindFragDataLocationIndexed;\npfn_glCopyImageSubData fp_glCopyImageSubData;\npfn_glMultiTexCoord2dv fp_glMultiTexCoord2dv;\npfn_glUniform2iv fp_glUniform2iv;\npfn_glVertexAttrib1fv fp_glVertexAttrib1fv;\npfn_glGetInternalformativ fp_glGetInternalformativ;\npfn_glUniform4uiv fp_glUniform4uiv;\npfn_glMatrixMode fp_glMatrixMode;\npfn_glGetTextureImage fp_glGetTextureImage;\npfn_glFeedbackBuffer fp_glFeedbackBuffer;\npfn_glProgramUniform2dv fp_glProgramUniform2dv;\npfn_glEndQueryIndexed fp_glEndQueryIndexed;\npfn_glGetMapiv fp_glGetMapiv;\npfn_glTextureSubImage3D fp_glTextureSubImage3D;\npfn_glFramebufferTexture1D fp_glFramebufferTexture1D;\npfn_glUniform4d fp_glUniform4d;\npfn_glGetShaderiv fp_glGetShaderiv;\npfn_glMultiTexCoord2d fp_glMultiTexCoord2d;\npfn_glMultiTexCoord2f fp_glMultiTexCoord2f;\npfn_glProgramUniformMatrix3fv fp_glProgramUniformMatrix3fv;\npfn_glObjectPtrLabel fp_glObjectPtrLabel;\npfn_glInvalidateFramebuffer fp_glInvalidateFramebuffer;\npfn_glBindTextures fp_glBindTextures;\npfn_glBindFragDataLocation fp_glBindFragDataLocation;\npfn_glNamedBufferStorage fp_glNamedBufferStorage;\npfn_glScissorArrayv fp_glScissorArrayv;\npfn_glPrioritizeTextures fp_glPrioritizeTextures;\npfn_glCallList fp_glCallList;\npfn_glPatchParameterfv fp_glPatchParameterfv;\npfn_glSecondaryColor3ubv fp_glSecondaryColor3ubv;\npfn_glGetDoublev fp_glGetDoublev;\npfn_glMultiTexCoord3iv fp_glMultiTexCoord3iv;\npfn_glVertexAttrib1d fp_glVertexAttrib1d;\npfn_glUniform4dv fp_glUniform4dv;\npfn_glLightModelf fp_glLightModelf;\npfn_glGetUniformiv fp_glGetUniformiv;\npfn_glInvalidateBufferData fp_glInvalidateBufferData;\npfn_glVertex2sv fp_glVertex2sv;\npfn_glVertexArrayVertexBuffers fp_glVertexArrayVertexBuffers;\npfn_glCompressedTextureSubImage1D fp_glCompressedTextureSubImage1D;\npfn_glLightModeli fp_glLightModeli;\npfn_glWindowPos3iv fp_glWindowPos3iv;\npfn_glMultiTexCoordP1uiv fp_glMultiTexCoordP1uiv;\npfn_glUniform3fv fp_glUniform3fv;\npfn_glPixelStorei fp_glPixelStorei;\npfn_glGetProgramPipelineInfoLog fp_glGetProgramPipelineInfoLog;\npfn_glCallLists fp_glCallLists;\npfn_glProgramUniformMatrix3x4fv fp_glProgramUniformMatrix3x4fv;\npfn_glInvalidateSubFramebuffer fp_glInvalidateSubFramebuffer;\npfn_glMapBuffer fp_glMapBuffer;\npfn_glSecondaryColor3d fp_glSecondaryColor3d;\npfn_glTexCoord3i fp_glTexCoord3i;\npfn_glMultiTexCoord4fv fp_glMultiTexCoord4fv;\npfn_glRasterPos3i fp_glRasterPos3i;\npfn_glSecondaryColor3b fp_glSecondaryColor3b;\npfn_glRasterPos3d fp_glRasterPos3d;\npfn_glRasterPos3f fp_glRasterPos3f;\npfn_glCompressedTexImage3D fp_glCompressedTexImage3D;\npfn_glTexCoord3f fp_glTexCoord3f;\npfn_glDeleteSync fp_glDeleteSync;\npfn_glTexCoord3d fp_glTexCoord3d;\npfn_glGetTransformFeedbacki64_v fp_glGetTransformFeedbacki64_v;\npfn_glUniformMatrix4dv fp_glUniformMatrix4dv;\npfn_glTexImage2DMultisample fp_glTexImage2DMultisample;\npfn_glGetVertexAttribiv fp_glGetVertexAttribiv;\npfn_glUniformMatrix4x2dv fp_glUniformMatrix4x2dv;\npfn_glMultiDrawElements fp_glMultiDrawElements;\npfn_glVertexAttrib3fv fp_glVertexAttrib3fv;\npfn_glTexCoord3s fp_glTexCoord3s;\npfn_glUniform3iv fp_glUniform3iv;\npfn_glRasterPos3s fp_glRasterPos3s;\npfn_glPolygonMode fp_glPolygonMode;\npfn_glDrawBuffers fp_glDrawBuffers;\npfn_glGetnHistogram fp_glGetnHistogram;\npfn_glGetActiveUniformBlockiv fp_glGetActiveUniformBlockiv;\npfn_glAreTexturesResident fp_glAreTexturesResident;\npfn_glProgramUniform2d fp_glProgramUniform2d;\npfn_glProgramUniformMatrix4x3dv fp_glProgramUniformMatrix4x3dv;\npfn_glIsList fp_glIsList;\npfn_glProgramUniform4iv fp_glProgramUniform4iv;\npfn_glRasterPos2sv fp_glRasterPos2sv;\npfn_glRasterPos4sv fp_glRasterPos4sv;\npfn_glColor4s fp_glColor4s;\npfn_glGetProgramBinary fp_glGetProgramBinary;\npfn_glUseProgram fp_glUseProgram;\npfn_glLineStipple fp_glLineStipple;\npfn_glMultiTexCoord1sv fp_glMultiTexCoord1sv;\npfn_glGetProgramInfoLog fp_glGetProgramInfoLog;\npfn_glClearTexImage fp_glClearTexImage;\npfn_glGetBufferParameteriv fp_glGetBufferParameteriv;\npfn_glMultiTexCoord2iv fp_glMultiTexCoord2iv;\npfn_glUniformMatrix2x4fv fp_glUniformMatrix2x4fv;\npfn_glBindVertexArray fp_glBindVertexArray;\npfn_glColor4b fp_glColor4b;\npfn_glSecondaryColor3f fp_glSecondaryColor3f;\npfn_glColor4f fp_glColor4f;\npfn_glColor4d fp_glColor4d;\npfn_glColor4i fp_glColor4i;\npfn_glSamplerParameterIiv fp_glSamplerParameterIiv;\npfn_glMultiDrawElementsBaseVertex fp_glMultiDrawElementsBaseVertex;\npfn_glVertexAttribLFormat fp_glVertexAttribLFormat;\npfn_glRasterPos3iv fp_glRasterPos3iv;\npfn_glTextureStorage2D fp_glTextureStorage2D;\npfn_glGenerateTextureMipmap fp_glGenerateTextureMipmap;\npfn_glVertex2dv fp_glVertex2dv;\npfn_glTexCoord4sv fp_glTexCoord4sv;\npfn_glUniform2uiv fp_glUniform2uiv;\npfn_glCompressedTexSubImage1D fp_glCompressedTexSubImage1D;\npfn_glFinish fp_glFinish;\npfn_glDepthRangeIndexed fp_glDepthRangeIndexed;\npfn_glGetBooleanv fp_glGetBooleanv;\npfn_glDeleteShader fp_glDeleteShader;\npfn_glDrawElements fp_glDrawElements;\npfn_glGetInternalformati64v fp_glGetInternalformati64v;\npfn_glRasterPos2s fp_glRasterPos2s;\npfn_glCopyTextureSubImage1D fp_glCopyTextureSubImage1D;\npfn_glGetMapdv fp_glGetMapdv;\npfn_glVertexAttrib4Nsv fp_glVertexAttrib4Nsv;\npfn_glMaterialfv fp_glMaterialfv;\npfn_glTextureParameterIuiv fp_glTextureParameterIuiv;\npfn_glViewport fp_glViewport;\npfn_glUniform1uiv fp_glUniform1uiv;\npfn_glTransformFeedbackVaryings fp_glTransformFeedbackVaryings;\npfn_glIndexdv fp_glIndexdv;\npfn_glCopyTexSubImage3D fp_glCopyTexSubImage3D;\npfn_glTexCoord3iv fp_glTexCoord3iv;\npfn_glDebugMessageCallback fp_glDebugMessageCallback;\npfn_glVertexAttribI3i fp_glVertexAttribI3i;\npfn_glInvalidateTexImage fp_glInvalidateTexImage;\npfn_glVertexAttribFormat fp_glVertexAttribFormat;\npfn_glClearDepth fp_glClearDepth;\npfn_glVertexAttribI4usv fp_glVertexAttribI4usv;\npfn_glTexParameterf fp_glTexParameterf;\npfn_glVertexAttribBinding fp_glVertexAttribBinding;\npfn_glTexParameteri fp_glTexParameteri;\npfn_glGetActiveSubroutineUniformiv fp_glGetActiveSubroutineUniformiv;\npfn_glGetShaderSource fp_glGetShaderSource;\npfn_glCreateTransformFeedbacks fp_glCreateTransformFeedbacks;\npfn_glGetnTexImage fp_glGetnTexImage;\npfn_glTexBuffer fp_glTexBuffer;\npfn_glPopName fp_glPopName;\npfn_glValidateProgram fp_glValidateProgram;\npfn_glPixelStoref fp_glPixelStoref;\npfn_glUniform3uiv fp_glUniform3uiv;\npfn_glViewportIndexedf fp_glViewportIndexedf;\npfn_glRasterPos4fv fp_glRasterPos4fv;\npfn_glEvalCoord1dv fp_glEvalCoord1dv;\npfn_glMultiTexCoordP2uiv fp_glMultiTexCoordP2uiv;\npfn_glGenProgramPipelines fp_glGenProgramPipelines;\npfn_glRecti fp_glRecti;\npfn_glColor4ub fp_glColor4ub;\npfn_glMultTransposeMatrixf fp_glMultTransposeMatrixf;\npfn_glRectf fp_glRectf;\npfn_glRectd fp_glRectd;\npfn_glNormal3sv fp_glNormal3sv;\npfn_glNewList fp_glNewList;\npfn_glProgramUniformMatrix2x3dv fp_glProgramUniformMatrix2x3dv;\npfn_glColor4us fp_glColor4us;\npfn_glVertexAttribP1uiv fp_glVertexAttribP1uiv;\npfn_glLinkProgram fp_glLinkProgram;\npfn_glHint fp_glHint;\npfn_glRects fp_glRects;\npfn_glTexCoord2dv fp_glTexCoord2dv;\npfn_glRasterPos4iv fp_glRasterPos4iv;\npfn_glGetObjectLabel fp_glGetObjectLabel;\npfn_glProgramUniform2f fp_glProgramUniform2f;\npfn_glGetString fp_glGetString;\npfn_glVertexAttribP2uiv fp_glVertexAttribP2uiv;\npfn_glEdgeFlagv fp_glEdgeFlagv;\npfn_glDetachShader fp_glDetachShader;\npfn_glProgramUniform3i fp_glProgramUniform3i;\npfn_glScalef fp_glScalef;\npfn_glEndQuery fp_glEndQuery;\npfn_glScaled fp_glScaled;\npfn_glEdgeFlagPointer fp_glEdgeFlagPointer;\npfn_glFramebufferParameteri fp_glFramebufferParameteri;\npfn_glGetProgramResourceName fp_glGetProgramResourceName;\npfn_glUniformMatrix4x3dv fp_glUniformMatrix4x3dv;\npfn_glDepthRangeArrayv fp_glDepthRangeArrayv;\npfn_glCopyPixels fp_glCopyPixels;\npfn_glVertexAttribI2ui fp_glVertexAttribI2ui;\npfn_glGetProgramResourceLocation fp_glGetProgramResourceLocation;\npfn_glPopAttrib fp_glPopAttrib;\npfn_glDeleteTextures fp_glDeleteTextures;\npfn_glGetActiveAtomicCounterBufferiv fp_glGetActiveAtomicCounterBufferiv;\npfn_glStencilOpSeparate fp_glStencilOpSeparate;\npfn_glGetTextureParameteriv fp_glGetTextureParameteriv;\npfn_glDeleteQueries fp_glDeleteQueries;\npfn_glNormalP3uiv fp_glNormalP3uiv;\npfn_glVertexAttrib4f fp_glVertexAttrib4f;\npfn_glVertexAttrib4d fp_glVertexAttrib4d;\npfn_glViewportIndexedfv fp_glViewportIndexedfv;\npfn_glInitNames fp_glInitNames;\npfn_glGetBufferParameteri64v fp_glGetBufferParameteri64v;\npfn_glColor3dv fp_glColor3dv;\npfn_glVertexAttribI1i fp_glVertexAttribI1i;\npfn_glGetTexParameteriv fp_glGetTexParameteriv;\npfn_glWaitSync fp_glWaitSync;\npfn_glCreateVertexArrays fp_glCreateVertexArrays;\npfn_glProgramUniform1dv fp_glProgramUniform1dv;\npfn_glVertexAttrib4s fp_glVertexAttrib4s;\npfn_glColorMaterial fp_glColorMaterial;\npfn_glSampleCoverage fp_glSampleCoverage;\npfn_glSamplerParameteri fp_glSamplerParameteri;\npfn_glClearBufferSubData fp_glClearBufferSubData;\npfn_glSamplerParameterf fp_glSamplerParameterf;\npfn_glTexStorage1D fp_glTexStorage1D;\npfn_glUniform1f fp_glUniform1f;\npfn_glGetVertexAttribfv fp_glGetVertexAttribfv;\npfn_glUniform1d fp_glUniform1d;\npfn_glRenderMode fp_glRenderMode;\npfn_glGetCompressedTexImage fp_glGetCompressedTexImage;\npfn_glGetnCompressedTexImage fp_glGetnCompressedTexImage;\npfn_glWindowPos2dv fp_glWindowPos2dv;\npfn_glUniform1i fp_glUniform1i;\npfn_glGetActiveAttrib fp_glGetActiveAttrib;\npfn_glUniform3i fp_glUniform3i;\npfn_glPixelTransferi fp_glPixelTransferi;\npfn_glTexSubImage2D fp_glTexSubImage2D;\npfn_glDisable fp_glDisable;\npfn_glLogicOp fp_glLogicOp;\npfn_glEvalPoint2 fp_glEvalPoint2;\npfn_glPixelTransferf fp_glPixelTransferf;\npfn_glSecondaryColor3i fp_glSecondaryColor3i;\npfn_glProgramUniform4uiv fp_glProgramUniform4uiv;\npfn_glUniform4ui fp_glUniform4ui;\npfn_glColor3f fp_glColor3f;\npfn_glNamedFramebufferReadBuffer fp_glNamedFramebufferReadBuffer;\npfn_glBindFramebuffer fp_glBindFramebuffer;\npfn_glGetTexEnvfv fp_glGetTexEnvfv;\npfn_glRectfv fp_glRectfv;\npfn_glCullFace fp_glCullFace;\npfn_glGetLightfv fp_glGetLightfv;\npfn_glGetnUniformiv fp_glGetnUniformiv;\npfn_glColor3d fp_glColor3d;\npfn_glProgramUniform4i fp_glProgramUniform4i;\npfn_glTexGend fp_glTexGend;\npfn_glProgramUniform4f fp_glProgramUniform4f;\npfn_glTexGeni fp_glTexGeni;\npfn_glProgramUniform4d fp_glProgramUniform4d;\npfn_glTextureParameterIiv fp_glTextureParameterIiv;\npfn_glMultiTexCoord3s fp_glMultiTexCoord3s;\npfn_glGetStringi fp_glGetStringi;\npfn_glGetTextureParameterfv fp_glGetTextureParameterfv;\npfn_glTextureSubImage2D fp_glTextureSubImage2D;\npfn_glMultiTexCoord3i fp_glMultiTexCoord3i;\npfn_glMultiTexCoord3f fp_glMultiTexCoord3f;\npfn_glDrawTransformFeedbackStream fp_glDrawTransformFeedbackStream;\npfn_glMultiTexCoord3d fp_glMultiTexCoord3d;\npfn_glAttachShader fp_glAttachShader;\npfn_glFogCoorddv fp_glFogCoorddv;\npfn_glUniformMatrix2x3fv fp_glUniformMatrix2x3fv;\npfn_glGetTexGenfv fp_glGetTexGenfv;\npfn_glQueryCounter fp_glQueryCounter;\npfn_glFogCoordPointer fp_glFogCoordPointer;\npfn_glProgramUniformMatrix3dv fp_glProgramUniformMatrix3dv;\npfn_glProvokingVertex fp_glProvokingVertex;\npfn_glShaderBinary fp_glShaderBinary;\npfn_glUnmapNamedBuffer fp_glUnmapNamedBuffer;\npfn_glGetnColorTable fp_glGetnColorTable;\npfn_glFramebufferTexture3D fp_glFramebufferTexture3D;\npfn_glTexGeniv fp_glTexGeniv;\npfn_glRasterPos2dv fp_glRasterPos2dv;\npfn_glSecondaryColor3dv fp_glSecondaryColor3dv;\npfn_glClientActiveTexture fp_glClientActiveTexture;\npfn_glNamedRenderbufferStorageMultisample fp_glNamedRenderbufferStorageMultisample;\npfn_glVertexAttribI4sv fp_glVertexAttribI4sv;\npfn_glClearNamedBufferData fp_glClearNamedBufferData;\npfn_glSecondaryColor3us fp_glSecondaryColor3us;\npfn_glNormalP3ui fp_glNormalP3ui;\npfn_glTexEnvfv fp_glTexEnvfv;\npfn_glReadBuffer fp_glReadBuffer;\npfn_glViewportArrayv fp_glViewportArrayv;\npfn_glTexParameterIuiv fp_glTexParameterIuiv;\npfn_glDrawArraysInstanced fp_glDrawArraysInstanced;\npfn_glGenerateMipmap fp_glGenerateMipmap;\npfn_glCompressedTextureSubImage2D fp_glCompressedTextureSubImage2D;\npfn_glProgramUniformMatrix2fv fp_glProgramUniformMatrix2fv;\npfn_glWindowPos3fv fp_glWindowPos3fv;\npfn_glUniformMatrix3x4dv fp_glUniformMatrix3x4dv;\npfn_glLightModelfv fp_glLightModelfv;\npfn_glSamplerParameteriv fp_glSamplerParameteriv;\npfn_glDeleteLists fp_glDeleteLists;\npfn_glGetClipPlane fp_glGetClipPlane;\npfn_glVertex4dv fp_glVertex4dv;\npfn_glTexCoord2d fp_glTexCoord2d;\npfn_glPopMatrix fp_glPopMatrix;\npfn_glTexCoord2f fp_glTexCoord2f;\npfn_glColor4iv fp_glColor4iv;\npfn_glIndexubv fp_glIndexubv;\npfn_glCheckNamedFramebufferStatus fp_glCheckNamedFramebufferStatus;\npfn_glUnmapBuffer fp_glUnmapBuffer;\npfn_glTexCoord2i fp_glTexCoord2i;\npfn_glRasterPos4d fp_glRasterPos4d;\npfn_glRasterPos4f fp_glRasterPos4f;\npfn_glProgramUniform1iv fp_glProgramUniform1iv;\npfn_glGetVertexArrayiv fp_glGetVertexArrayiv;\npfn_glCopyTextureSubImage2D fp_glCopyTextureSubImage2D;\npfn_glVertexAttrib3s fp_glVertexAttrib3s;\npfn_glTexCoord2s fp_glTexCoord2s;\npfn_glBindRenderbuffer fp_glBindRenderbuffer;\npfn_glVertex3fv fp_glVertex3fv;\npfn_glTexCoord4dv fp_glTexCoord4dv;\npfn_glMaterialiv fp_glMaterialiv;\npfn_glVertexAttribP4uiv fp_glVertexAttribP4uiv;\npfn_glGetProgramStageiv fp_glGetProgramStageiv;\npfn_glIsProgram fp_glIsProgram;\npfn_glVertexAttrib4bv fp_glVertexAttrib4bv;\npfn_glVertex4s fp_glVertex4s;\npfn_glUniformMatrix3x2dv fp_glUniformMatrix3x2dv;\npfn_glVertexAttrib4fv fp_glVertexAttrib4fv;\npfn_glNormal3dv fp_glNormal3dv;\npfn_glIsTransformFeedback fp_glIsTransformFeedback;\npfn_glUniform4i fp_glUniform4i;\npfn_glActiveTexture fp_glActiveTexture;\npfn_glEnableVertexAttribArray fp_glEnableVertexAttribArray;\npfn_glRotated fp_glRotated;\npfn_glIsProgramPipeline fp_glIsProgramPipeline;\npfn_glRotatef fp_glRotatef;\npfn_glVertex4i fp_glVertex4i;\npfn_glReadPixels fp_glReadPixels;\npfn_glVertexAttribI3iv fp_glVertexAttribI3iv;\npfn_glLoadName fp_glLoadName;\npfn_glUniform4f fp_glUniform4f;\npfn_glRenderbufferStorageMultisample fp_glRenderbufferStorageMultisample;\npfn_glCreateProgramPipelines fp_glCreateProgramPipelines;\npfn_glGenVertexArrays fp_glGenVertexArrays;\npfn_glShadeModel fp_glShadeModel;\npfn_glMapGrid1d fp_glMapGrid1d;\npfn_glGetUniformfv fp_glGetUniformfv;\npfn_glMapGrid1f fp_glMapGrid1f;\npfn_glSamplerParameterfv fp_glSamplerParameterfv;\npfn_glVertexAttribLPointer fp_glVertexAttribLPointer;\npfn_glDisableClientState fp_glDisableClientState;\npfn_glMultiTexCoord3sv fp_glMultiTexCoord3sv;\npfn_glGetnUniformfv fp_glGetnUniformfv;\npfn_glDrawElementsInstancedBaseVertex fp_glDrawElementsInstancedBaseVertex;\npfn_glVertexAttribL2dv fp_glVertexAttribL2dv;\npfn_glMultiDrawElementsIndirect fp_glMultiDrawElementsIndirect;\npfn_glEnableVertexArrayAttrib fp_glEnableVertexArrayAttrib;\npfn_glSecondaryColorPointer fp_glSecondaryColorPointer;\npfn_glAlphaFunc fp_glAlphaFunc;\npfn_glUniform1iv fp_glUniform1iv;\npfn_glCreateShaderProgramv fp_glCreateShaderProgramv;\npfn_glGetActiveSubroutineName fp_glGetActiveSubroutineName;\npfn_glMultiTexCoord4iv fp_glMultiTexCoord4iv;\npfn_glVertexAttribL2d fp_glVertexAttribL2d;\npfn_glGetQueryObjectiv fp_glGetQueryObjectiv;\npfn_glStencilFunc fp_glStencilFunc;\npfn_glInvalidateNamedFramebufferData fp_glInvalidateNamedFramebufferData;\npfn_glMultiTexCoord1fv fp_glMultiTexCoord1fv;\npfn_glUniformBlockBinding fp_glUniformBlockBinding;\npfn_glColor4uiv fp_glColor4uiv;\npfn_glRectiv fp_glRectiv;\npfn_glColorP4ui fp_glColorP4ui;\npfn_glUseProgramStages fp_glUseProgramStages;\npfn_glRasterPos3dv fp_glRasterPos3dv;\npfn_glEvalMesh2 fp_glEvalMesh2;\npfn_glEvalMesh1 fp_glEvalMesh1;\npfn_glTexCoordPointer fp_glTexCoordPointer;\npfn_glProgramUniform3f fp_glProgramUniform3f;\npfn_glProgramUniform3d fp_glProgramUniform3d;\npfn_glVertexAttrib4Nubv fp_glVertexAttrib4Nubv;\npfn_glVertexAttribI4iv fp_glVertexAttribI4iv;\npfn_glGetProgramPipelineiv fp_glGetProgramPipelineiv;\npfn_glTexStorage3D fp_glTexStorage3D;\npfn_glEvalCoord2fv fp_glEvalCoord2fv;\npfn_glNamedFramebufferDrawBuffer fp_glNamedFramebufferDrawBuffer;\npfn_glGetQueryIndexediv fp_glGetQueryIndexediv;\npfn_glColor4ubv fp_glColor4ubv;\npfn_glLoadTransposeMatrixd fp_glLoadTransposeMatrixd;\npfn_glLoadTransposeMatrixf fp_glLoadTransposeMatrixf;\npfn_glTextureParameteriv fp_glTextureParameteriv;\npfn_glObjectLabel fp_glObjectLabel;\npfn_glVertexAttribI4i fp_glVertexAttribI4i;\npfn_glRasterPos2iv fp_glRasterPos2iv;\npfn_glGetBufferSubData fp_glGetBufferSubData;\npfn_glGetVertexAttribLdv fp_glGetVertexAttribLdv;\npfn_glGetnUniformuiv fp_glGetnUniformuiv;\npfn_glGetQueryBufferObjectiv fp_glGetQueryBufferObjectiv;\npfn_glTexEnviv fp_glTexEnviv;\npfn_glBlendEquationSeparate fp_glBlendEquationSeparate;\npfn_glVertexAttribI1ui fp_glVertexAttribI1ui;\npfn_glGenBuffers fp_glGenBuffers;\npfn_glSelectBuffer fp_glSelectBuffer;\npfn_glGetSubroutineIndex fp_glGetSubroutineIndex;\npfn_glVertexAttrib2sv fp_glVertexAttrib2sv;\npfn_glScissorIndexedv fp_glScissorIndexedv;\npfn_glPushAttrib fp_glPushAttrib;\npfn_glVertexAttribIPointer fp_glVertexAttribIPointer;\npfn_glBlendFunc fp_glBlendFunc;\npfn_glCreateProgram fp_glCreateProgram;\npfn_glNamedBufferSubData fp_glNamedBufferSubData;\npfn_glTexImage3D fp_glTexImage3D;\npfn_glIsFramebuffer fp_glIsFramebuffer;\npfn_glClearNamedFramebufferfv fp_glClearNamedFramebufferfv;\npfn_glLightiv fp_glLightiv;\npfn_glGetNamedBufferSubData fp_glGetNamedBufferSubData;\npfn_glCompressedTextureSubImage3D fp_glCompressedTextureSubImage3D;\npfn_glPrimitiveRestartIndex fp_glPrimitiveRestartIndex;\npfn_glFlushMappedNamedBufferRange fp_glFlushMappedNamedBufferRange;\npfn_glInvalidateTexSubImage fp_glInvalidateTexSubImage;\npfn_glTexGenfv fp_glTexGenfv;\npfn_glGetTextureParameterIuiv fp_glGetTextureParameterIuiv;\npfn_glGetnConvolutionFilter fp_glGetnConvolutionFilter;\npfn_glBindImageTextures fp_glBindImageTextures;\npfn_glEnd fp_glEnd;\npfn_glDeleteBuffers fp_glDeleteBuffers;\npfn_glBindProgramPipeline fp_glBindProgramPipeline;\npfn_glScissor fp_glScissor;\npfn_glTexCoordP4uiv fp_glTexCoordP4uiv;\npfn_glClipPlane fp_glClipPlane;\npfn_glPushName fp_glPushName;\npfn_glTexGendv fp_glTexGendv;\npfn_glIndexub fp_glIndexub;\npfn_glGetNamedFramebufferAttachmentParameteriv fp_glGetNamedFramebufferAttachmentParameteriv;\npfn_glNamedFramebufferRenderbuffer fp_glNamedFramebufferRenderbuffer;\npfn_glVertexP2uiv fp_glVertexP2uiv;\npfn_glSecondaryColor3iv fp_glSecondaryColor3iv;\npfn_glRasterPos4i fp_glRasterPos4i;\npfn_glMultTransposeMatrixd fp_glMultTransposeMatrixd;\npfn_glClearColor fp_glClearColor;\npfn_glVertexAttrib4uiv fp_glVertexAttrib4uiv;\npfn_glNormal3s fp_glNormal3s;\npfn_glVertexAttrib4Niv fp_glVertexAttrib4Niv;\npfn_glProgramUniformMatrix2x3fv fp_glProgramUniformMatrix2x3fv;\npfn_glClearBufferiv fp_glClearBufferiv;\npfn_glPointParameteri fp_glPointParameteri;\npfn_glProgramUniform4dv fp_glProgramUniform4dv;\npfn_glColorP4uiv fp_glColorP4uiv;\npfn_glBlendColor fp_glBlendColor;\npfn_glGetnPixelMapuiv fp_glGetnPixelMapuiv;\npfn_glGetTextureLevelParameteriv fp_glGetTextureLevelParameteriv;\npfn_glWindowPos3d fp_glWindowPos3d;\npfn_glProgramUniform3fv fp_glProgramUniform3fv;\npfn_glVertexAttribI2uiv fp_glVertexAttribI2uiv;\npfn_glGetNamedFramebufferParameteriv fp_glGetNamedFramebufferParameteriv;\npfn_glSamplerParameterIuiv fp_glSamplerParameterIuiv;\npfn_glUniform3ui fp_glUniform3ui;\npfn_glProgramUniform3uiv fp_glProgramUniform3uiv;\npfn_glColor4dv fp_glColor4dv;\npfn_glVertexAttribI4uiv fp_glVertexAttribI4uiv;\npfn_glPointParameterfv fp_glPointParameterfv;\npfn_glResumeTransformFeedback fp_glResumeTransformFeedback;\npfn_glUniform2fv fp_glUniform2fv;\npfn_glGetActiveSubroutineUniformName fp_glGetActiveSubroutineUniformName;\npfn_glGetProgramResourceIndex fp_glGetProgramResourceIndex;\npfn_glSecondaryColor3ub fp_glSecondaryColor3ub;\npfn_glDrawElementsIndirect fp_glDrawElementsIndirect;\npfn_glGetTextureLevelParameterfv fp_glGetTextureLevelParameterfv;\npfn_glSecondaryColor3ui fp_glSecondaryColor3ui;\npfn_glTexCoord3dv fp_glTexCoord3dv;\npfn_glGetNamedBufferPointerv fp_glGetNamedBufferPointerv;\npfn_glDispatchComputeIndirect fp_glDispatchComputeIndirect;\npfn_glInvalidateNamedFramebufferSubData fp_glInvalidateNamedFramebufferSubData;\npfn_glGetSamplerParameterIuiv fp_glGetSamplerParameterIuiv;\npfn_glBindBufferRange fp_glBindBufferRange;\npfn_glNormal3iv fp_glNormal3iv;\npfn_glTextureSubImage1D fp_glTextureSubImage1D;\npfn_glVertexAttribL3dv fp_glVertexAttribL3dv;\npfn_glGetUniformdv fp_glGetUniformdv;\npfn_glWindowPos3s fp_glWindowPos3s;\npfn_glPointParameterf fp_glPointParameterf;\npfn_glClearDepthf fp_glClearDepthf;\npfn_glGetVertexAttribIuiv fp_glGetVertexAttribIuiv;\npfn_glWindowPos3i fp_glWindowPos3i;\npfn_glMultiTexCoord4s fp_glMultiTexCoord4s;\npfn_glGetTextureSubImage fp_glGetTextureSubImage;\npfn_glWindowPos3f fp_glWindowPos3f;\npfn_glGenTransformFeedbacks fp_glGenTransformFeedbacks;\npfn_glColor3us fp_glColor3us;\npfn_glColor3uiv fp_glColor3uiv;\npfn_glVertexAttrib4Nusv fp_glVertexAttrib4Nusv;\npfn_glGetLightiv fp_glGetLightiv;\npfn_glDepthFunc fp_glDepthFunc;\npfn_glCompressedTexSubImage2D fp_glCompressedTexSubImage2D;\npfn_glListBase fp_glListBase;\npfn_glMultiTexCoord4f fp_glMultiTexCoord4f;\npfn_glColor3ub fp_glColor3ub;\npfn_glMultiTexCoord4d fp_glMultiTexCoord4d;\npfn_glVertexAttribI4bv fp_glVertexAttribI4bv;\npfn_glBlendEquationSeparatei fp_glBlendEquationSeparatei;\npfn_glGetTexParameterfv fp_glGetTexParameterfv;\npfn_glColor3ui fp_glColor3ui;\npfn_glGetProgramResourceLocationIndex fp_glGetProgramResourceLocationIndex;\npfn_glMultiTexCoord4i fp_glMultiTexCoord4i;\npfn_glBufferStorage fp_glBufferStorage;\npfn_glGetPolygonStipple fp_glGetPolygonStipple;\npfn_glClientWaitSync fp_glClientWaitSync;\npfn_glVertexAttribI4ui fp_glVertexAttribI4ui;\npfn_glGetFloati_v fp_glGetFloati_v;\npfn_glMultiTexCoord4dv fp_glMultiTexCoord4dv;\npfn_glColorMask fp_glColorMask;\npfn_glTextureBuffer fp_glTextureBuffer;\npfn_glTexParameterIiv fp_glTexParameterIiv;\npfn_glBlendEquation fp_glBlendEquation;\npfn_glGetUniformLocation fp_glGetUniformLocation;\npfn_glGetSamplerParameteriv fp_glGetSamplerParameteriv;\npfn_glVertexArrayAttribFormat fp_glVertexArrayAttribFormat;\npfn_glReadnPixels fp_glReadnPixels;\npfn_glRasterPos4s fp_glRasterPos4s;\npfn_glEndTransformFeedback fp_glEndTransformFeedback;\npfn_glVertexAttrib4usv fp_glVertexAttrib4usv;\npfn_glGetUniformSubroutineuiv fp_glGetUniformSubroutineuiv;\npfn_glMultiTexCoord3dv fp_glMultiTexCoord3dv;\npfn_glBindVertexBuffer fp_glBindVertexBuffer;\npfn_glColor4sv fp_glColor4sv;\npfn_glDebugMessageInsert fp_glDebugMessageInsert;\npfn_glCreateSamplers fp_glCreateSamplers;\npfn_glPopClientAttrib fp_glPopClientAttrib;\npfn_glClearBufferData fp_glClearBufferData;\npfn_glBeginTransformFeedback fp_glBeginTransformFeedback;\npfn_glFogf fp_glFogf;\npfn_glVertexAttribI1iv fp_glVertexAttribI1iv;\npfn_glProgramBinary fp_glProgramBinary;\npfn_glIsSampler fp_glIsSampler;\npfn_glVertexP3ui fp_glVertexP3ui;\npfn_glVertexAttribDivisor fp_glVertexAttribDivisor;\npfn_glBindSamplers fp_glBindSamplers;\npfn_glColor3iv fp_glColor3iv;\npfn_glCompressedTexImage1D fp_glCompressedTexImage1D;\npfn_glDeleteTransformFeedbacks fp_glDeleteTransformFeedbacks;\npfn_glCopyTexSubImage1D fp_glCopyTexSubImage1D;\npfn_glTexCoord1i fp_glTexCoord1i;\npfn_glCheckFramebufferStatus fp_glCheckFramebufferStatus;\npfn_glTexCoord1d fp_glTexCoord1d;\npfn_glTexCoord1f fp_glTexCoord1f;\npfn_glTextureStorage3D fp_glTextureStorage3D;\npfn_glEndConditionalRender fp_glEndConditionalRender;\npfn_glEnableClientState fp_glEnableClientState;\npfn_glBindAttribLocation fp_glBindAttribLocation;\npfn_glUniformMatrix4x2fv fp_glUniformMatrix4x2fv;\npfn_glUniformMatrix2dv fp_glUniformMatrix2dv;\npfn_glBlendFunci fp_glBlendFunci;\npfn_glMultiTexCoord2sv fp_glMultiTexCoord2sv;\npfn_glVertexAttrib1dv fp_glVertexAttrib1dv;\npfn_glDrawRangeElements fp_glDrawRangeElements;\npfn_glTexCoord1s fp_glTexCoord1s;\npfn_glBindBufferBase fp_glBindBufferBase;\npfn_glBufferSubData fp_glBufferSubData;\npfn_glVertexAttrib4iv fp_glVertexAttrib4iv;\npfn_glGenLists fp_glGenLists;\npfn_glColor3bv fp_glColor3bv;\npfn_glMapBufferRange fp_glMapBufferRange;\npfn_glFramebufferTexture fp_glFramebufferTexture;\npfn_glBlendFuncSeparatei fp_glBlendFuncSeparatei;\npfn_glProgramUniformMatrix4x2fv fp_glProgramUniformMatrix4x2fv;\npfn_glVertexAttribL1d fp_glVertexAttribL1d;\npfn_glGetTexGendv fp_glGetTexGendv;\npfn_glClearNamedFramebufferiv fp_glClearNamedFramebufferiv;\npfn_glMultiDrawArrays fp_glMultiDrawArrays;\npfn_glEndList fp_glEndList;\npfn_glScissorIndexed fp_glScissorIndexed;\npfn_glVertexP4uiv fp_glVertexP4uiv;\npfn_glUniform2ui fp_glUniform2ui;\npfn_glVertexAttribI2iv fp_glVertexAttribI2iv;\npfn_glGetnMapdv fp_glGetnMapdv;\npfn_glColor3usv fp_glColor3usv;\npfn_glWindowPos2fv fp_glWindowPos2fv;\npfn_glTextureView fp_glTextureView;\npfn_glDisablei fp_glDisablei;\npfn_glProgramUniformMatrix2x4fv fp_glProgramUniformMatrix2x4fv;\npfn_glCreateRenderbuffers fp_glCreateRenderbuffers;\npfn_glIndexMask fp_glIndexMask;\npfn_glPushClientAttrib fp_glPushClientAttrib;\npfn_glShaderSource fp_glShaderSource;\npfn_glGetnSeparableFilter fp_glGetnSeparableFilter;\npfn_glGetActiveUniformBlockName fp_glGetActiveUniformBlockName;\npfn_glVertexAttribI3uiv fp_glVertexAttribI3uiv;\npfn_glReleaseShaderCompiler fp_glReleaseShaderCompiler;\npfn_glVertexAttribIFormat fp_glVertexAttribIFormat;\npfn_glCreateFramebuffers fp_glCreateFramebuffers;\npfn_glClearAccum fp_glClearAccum;\npfn_glGetSynciv fp_glGetSynciv;\npfn_glProgramUniform2uiv fp_glProgramUniform2uiv;\npfn_glGetnPixelMapfv fp_glGetnPixelMapfv;\npfn_glTexCoordP2uiv fp_glTexCoordP2uiv;\npfn_glPatchParameteri fp_glPatchParameteri;\npfn_glProgramUniform2i fp_glProgramUniform2i;\npfn_glUniform2f fp_glUniform2f;\npfn_glGetNamedBufferParameteri64v fp_glGetNamedBufferParameteri64v;\npfn_glBeginQuery fp_glBeginQuery;\npfn_glGetUniformBlockIndex fp_glGetUniformBlockIndex;\npfn_glBindBuffer fp_glBindBuffer;\npfn_glMap2d fp_glMap2d;\npfn_glMap2f fp_glMap2f;\npfn_glTexStorage2DMultisample fp_glTexStorage2DMultisample;\npfn_glUniform2d fp_glUniform2d;\npfn_glVertex4d fp_glVertex4d;\npfn_glUniformMatrix2fv fp_glUniformMatrix2fv;\npfn_glTexCoord1sv fp_glTexCoord1sv;\npfn_glBufferData fp_glBufferData;\npfn_glEvalPoint1 fp_glEvalPoint1;\npfn_glGetTexParameterIiv fp_glGetTexParameterIiv;\npfn_glGetQueryBufferObjectui64v fp_glGetQueryBufferObjectui64v;\npfn_glTexCoord1dv fp_glTexCoord1dv;\npfn_glTexCoordP1ui fp_glTexCoordP1ui;\npfn_glGetError fp_glGetError;\npfn_glGetTexEnviv fp_glGetTexEnviv;\npfn_glGetProgramiv fp_glGetProgramiv;\npfn_glVertexAttribP2ui fp_glVertexAttribP2ui;\npfn_glGetFloatv fp_glGetFloatv;\npfn_glTexSubImage1D fp_glTexSubImage1D;\npfn_glMultiTexCoord2fv fp_glMultiTexCoord2fv;\npfn_glUniformMatrix2x4dv fp_glUniformMatrix2x4dv;\npfn_glVertexAttrib2fv fp_glVertexAttrib2fv;\npfn_glEvalCoord1d fp_glEvalCoord1d;\npfn_glGetTexLevelParameterfv fp_glGetTexLevelParameterfv;\npfn_glEvalCoord1f fp_glEvalCoord1f;\npfn_glPixelMapfv fp_glPixelMapfv;\npfn_glVertexAttribP3uiv fp_glVertexAttribP3uiv;\npfn_glGetPixelMapusv fp_glGetPixelMapusv;\npfn_glSecondaryColorP3uiv fp_glSecondaryColorP3uiv;\npfn_glGetIntegerv fp_glGetIntegerv;\npfn_glAccum fp_glAccum;\npfn_glGetVertexArrayIndexed64iv fp_glGetVertexArrayIndexed64iv;\npfn_glGetBufferPointerv fp_glGetBufferPointerv;\npfn_glGetVertexAttribIiv fp_glGetVertexAttribIiv;\npfn_glRasterPos4dv fp_glRasterPos4dv;\npfn_glProgramUniform4fv fp_glProgramUniform4fv;\npfn_glTexCoord2iv fp_glTexCoord2iv;\npfn_glTextureBarrier fp_glTextureBarrier;\npfn_glIsQuery fp_glIsQuery;\npfn_glBlendBarrier fp_glBlendBarrier;\npfn_glProgramUniform2ui fp_glProgramUniform2ui;\npfn_glProgramUniform4ui fp_glProgramUniform4ui;\npfn_glVertexAttrib4sv fp_glVertexAttrib4sv;\npfn_glWindowPos3dv fp_glWindowPos3dv;\npfn_glTexImage2D fp_glTexImage2D;\npfn_glStencilMask fp_glStencilMask;\npfn_glDrawPixels fp_glDrawPixels;\npfn_glMultMatrixd fp_glMultMatrixd;\npfn_glMultMatrixf fp_glMultMatrixf;\npfn_glIsTexture fp_glIsTexture;\npfn_glGetMaterialiv fp_glGetMaterialiv;\npfn_glNamedBufferData fp_glNamedBufferData;\npfn_glUniform1fv fp_glUniform1fv;\npfn_glLoadMatrixf fp_glLoadMatrixf;\npfn_glTexStorage2D fp_glTexStorage2D;\npfn_glLoadMatrixd fp_glLoadMatrixd;\npfn_glClearNamedBufferSubData fp_glClearNamedBufferSubData;\npfn_glMapNamedBufferRange fp_glMapNamedBufferRange;\npfn_glNamedFramebufferTextureLayer fp_glNamedFramebufferTextureLayer;\npfn_glTexParameterfv fp_glTexParameterfv;\npfn_glUniformMatrix3fv fp_glUniformMatrix3fv;\npfn_glVertex4f fp_glVertex4f;\npfn_glRectsv fp_glRectsv;\npfn_glColor4usv fp_glColor4usv;\npfn_glUniform3dv fp_glUniform3dv;\npfn_glProgramUniformMatrix4x3fv fp_glProgramUniformMatrix4x3fv;\npfn_glPolygonStipple fp_glPolygonStipple;\npfn_glBindBuffersBase fp_glBindBuffersBase;\npfn_glInterleavedArrays fp_glInterleavedArrays;\npfn_glGetSubroutineUniformLocation fp_glGetSubroutineUniformLocation;\npfn_glNormal3i fp_glNormal3i;\npfn_glNormal3f fp_glNormal3f;\npfn_glNormal3d fp_glNormal3d;\npfn_glNormal3b fp_glNormal3b;\npfn_glGetFramebufferParameteriv fp_glGetFramebufferParameteriv;\npfn_glPixelMapusv fp_glPixelMapusv;\npfn_glGetTexGeniv fp_glGetTexGeniv;\npfn_glArrayElement fp_glArrayElement;\npfn_glGetCompressedTextureSubImage fp_glGetCompressedTextureSubImage;\npfn_glCopyBufferSubData fp_glCopyBufferSubData;\npfn_glVertexAttribI1uiv fp_glVertexAttribI1uiv;\npfn_glVertexAttrib2d fp_glVertexAttrib2d;\npfn_glBindTransformFeedback fp_glBindTransformFeedback;\npfn_glVertexAttrib2f fp_glVertexAttrib2f;\npfn_glVertexAttrib3dv fp_glVertexAttrib3dv;\npfn_glGetQueryObjectui64v fp_glGetQueryObjectui64v;\npfn_glDepthMask fp_glDepthMask;\npfn_glVertexAttrib2s fp_glVertexAttrib2s;\npfn_glColor3fv fp_glColor3fv;\npfn_glTexImage3DMultisample fp_glTexImage3DMultisample;\npfn_glProgramUniform1fv fp_glProgramUniform1fv;\npfn_glUniformMatrix4fv fp_glUniformMatrix4fv;\npfn_glUniform4fv fp_glUniform4fv;\npfn_glGetActiveUniform fp_glGetActiveUniform;\npfn_glColorPointer fp_glColorPointer;\npfn_glFrontFace fp_glFrontFace;\npfn_glTexBufferRange fp_glTexBufferRange;\npfn_glCreateBuffers fp_glCreateBuffers;\npfn_glNamedFramebufferParameteri fp_glNamedFramebufferParameteri;\npfn_glDrawArraysInstancedBaseInstance fp_glDrawArraysInstancedBaseInstance;\npfn_glGetBooleani_v fp_glGetBooleani_v;\npfn_glVertexAttribL3d fp_glVertexAttribL3d;\npfn_glDeleteProgramPipelines fp_glDeleteProgramPipelines;\npfn_glClearBufferuiv fp_glClearBufferuiv;\npfn_glClipControl fp_glClipControl;\npfn_glGetProgramResourceiv fp_glGetProgramResourceiv;\npfn_glBlendBarrierKHR fp_glBlendBarrierKHR;\npfn_glDebugMessageControlKHR fp_glDebugMessageControlKHR;\npfn_glDebugMessageInsertKHR fp_glDebugMessageInsertKHR;\npfn_glDebugMessageCallbackKHR fp_glDebugMessageCallbackKHR;\npfn_glGetDebugMessageLogKHR fp_glGetDebugMessageLogKHR;\npfn_glPushDebugGroupKHR fp_glPushDebugGroupKHR;\npfn_glPopDebugGroupKHR fp_glPopDebugGroupKHR;\npfn_glObjectLabelKHR fp_glObjectLabelKHR;\npfn_glGetObjectLabelKHR fp_glGetObjectLabelKHR;\npfn_glObjectPtrLabelKHR fp_glObjectPtrLabelKHR;\npfn_glGetObjectPtrLabelKHR fp_glGetObjectPtrLabelKHR;\npfn_glGetPointervKHR fp_glGetPointervKHR;\npfn_glGetGraphicsResetStatusKHR fp_glGetGraphicsResetStatusKHR;\npfn_glReadnPixelsKHR fp_glReadnPixelsKHR;\npfn_glGetnUniformfvKHR fp_glGetnUniformfvKHR;\npfn_glGetnUniformivKHR fp_glGetnUniformivKHR;\npfn_glGetnUniformuivKHR fp_glGetnUniformuivKHR;\npfn_glGetTextureHandleARB fp_glGetTextureHandleARB;\npfn_glGetTextureSamplerHandleARB fp_glGetTextureSamplerHandleARB;\npfn_glMakeTextureHandleResidentARB fp_glMakeTextureHandleResidentARB;\npfn_glMakeTextureHandleNonResidentARB fp_glMakeTextureHandleNonResidentARB;\npfn_glGetImageHandleARB fp_glGetImageHandleARB;\npfn_glMakeImageHandleResidentARB fp_glMakeImageHandleResidentARB;\npfn_glMakeImageHandleNonResidentARB fp_glMakeImageHandleNonResidentARB;\npfn_glUniformHandleui64ARB fp_glUniformHandleui64ARB;\npfn_glUniformHandleui64vARB fp_glUniformHandleui64vARB;\npfn_glProgramUniformHandleui64ARB fp_glProgramUniformHandleui64ARB;\npfn_glProgramUniformHandleui64vARB fp_glProgramUniformHandleui64vARB;\npfn_glIsTextureHandleResidentARB fp_glIsTextureHandleResidentARB;\npfn_glIsImageHandleResidentARB fp_glIsImageHandleResidentARB;\npfn_glVertexAttribL1ui64ARB fp_glVertexAttribL1ui64ARB;\npfn_glVertexAttribL1ui64vARB fp_glVertexAttribL1ui64vARB;\npfn_glGetVertexAttribLui64vARB fp_glGetVertexAttribLui64vARB;\npfn_glCreateSyncFromCLeventARB fp_glCreateSyncFromCLeventARB;\npfn_glClampColorARB fp_glClampColorARB;\npfn_glDispatchComputeGroupSizeARB fp_glDispatchComputeGroupSizeARB;\npfn_glDebugMessageControlARB fp_glDebugMessageControlARB;\npfn_glDebugMessageInsertARB fp_glDebugMessageInsertARB;\npfn_glDebugMessageCallbackARB fp_glDebugMessageCallbackARB;\npfn_glGetDebugMessageLogARB fp_glGetDebugMessageLogARB;\npfn_glBlendEquationiARB fp_glBlendEquationiARB;\npfn_glBlendEquationSeparateiARB fp_glBlendEquationSeparateiARB;\npfn_glBlendFunciARB fp_glBlendFunciARB;\npfn_glBlendFuncSeparateiARB fp_glBlendFuncSeparateiARB;\npfn_glDrawArraysInstancedARB fp_glDrawArraysInstancedARB;\npfn_glDrawElementsInstancedARB fp_glDrawElementsInstancedARB;\npfn_glPrimitiveBoundingBoxARB fp_glPrimitiveBoundingBoxARB;\npfn_glProgramParameteriARB fp_glProgramParameteriARB;\npfn_glFramebufferTextureARB fp_glFramebufferTextureARB;\npfn_glFramebufferTextureLayerARB fp_glFramebufferTextureLayerARB;\npfn_glFramebufferTextureFaceARB fp_glFramebufferTextureFaceARB;\npfn_glUniform1i64ARB fp_glUniform1i64ARB;\npfn_glUniform2i64ARB fp_glUniform2i64ARB;\npfn_glUniform3i64ARB fp_glUniform3i64ARB;\npfn_glUniform4i64ARB fp_glUniform4i64ARB;\npfn_glUniform1i64vARB fp_glUniform1i64vARB;\npfn_glUniform2i64vARB fp_glUniform2i64vARB;\npfn_glUniform3i64vARB fp_glUniform3i64vARB;\npfn_glUniform4i64vARB fp_glUniform4i64vARB;\npfn_glUniform1ui64ARB fp_glUniform1ui64ARB;\npfn_glUniform2ui64ARB fp_glUniform2ui64ARB;\npfn_glUniform3ui64ARB fp_glUniform3ui64ARB;\npfn_glUniform4ui64ARB fp_glUniform4ui64ARB;\npfn_glUniform1ui64vARB fp_glUniform1ui64vARB;\npfn_glUniform2ui64vARB fp_glUniform2ui64vARB;\npfn_glUniform3ui64vARB fp_glUniform3ui64vARB;\npfn_glUniform4ui64vARB fp_glUniform4ui64vARB;\npfn_glGetUniformi64vARB fp_glGetUniformi64vARB;\npfn_glGetUniformui64vARB fp_glGetUniformui64vARB;\npfn_glGetnUniformi64vARB fp_glGetnUniformi64vARB;\npfn_glGetnUniformui64vARB fp_glGetnUniformui64vARB;\npfn_glProgramUniform1i64ARB fp_glProgramUniform1i64ARB;\npfn_glProgramUniform2i64ARB fp_glProgramUniform2i64ARB;\npfn_glProgramUniform3i64ARB fp_glProgramUniform3i64ARB;\npfn_glProgramUniform4i64ARB fp_glProgramUniform4i64ARB;\npfn_glProgramUniform1i64vARB fp_glProgramUniform1i64vARB;\npfn_glProgramUniform2i64vARB fp_glProgramUniform2i64vARB;\npfn_glProgramUniform3i64vARB fp_glProgramUniform3i64vARB;\npfn_glProgramUniform4i64vARB fp_glProgramUniform4i64vARB;\npfn_glProgramUniform1ui64ARB fp_glProgramUniform1ui64ARB;\npfn_glProgramUniform2ui64ARB fp_glProgramUniform2ui64ARB;\npfn_glProgramUniform3ui64ARB fp_glProgramUniform3ui64ARB;\npfn_glProgramUniform4ui64ARB fp_glProgramUniform4ui64ARB;\npfn_glProgramUniform1ui64vARB fp_glProgramUniform1ui64vARB;\npfn_glProgramUniform2ui64vARB fp_glProgramUniform2ui64vARB;\npfn_glProgramUniform3ui64vARB fp_glProgramUniform3ui64vARB;\npfn_glProgramUniform4ui64vARB fp_glProgramUniform4ui64vARB;\npfn_glMultiDrawArraysIndirectCountARB fp_glMultiDrawArraysIndirectCountARB;\npfn_glMultiDrawElementsIndirectCountARB fp_glMultiDrawElementsIndirectCountARB;\npfn_glVertexAttribDivisorARB fp_glVertexAttribDivisorARB;\npfn_glMaxShaderCompilerThreadsARB fp_glMaxShaderCompilerThreadsARB;\npfn_glGetGraphicsResetStatusARB fp_glGetGraphicsResetStatusARB;\npfn_glGetnTexImageARB fp_glGetnTexImageARB;\npfn_glReadnPixelsARB fp_glReadnPixelsARB;\npfn_glGetnCompressedTexImageARB fp_glGetnCompressedTexImageARB;\npfn_glGetnUniformfvARB fp_glGetnUniformfvARB;\npfn_glGetnUniformivARB fp_glGetnUniformivARB;\npfn_glGetnUniformuivARB fp_glGetnUniformuivARB;\npfn_glGetnUniformdvARB fp_glGetnUniformdvARB;\npfn_glGetnMapdvARB fp_glGetnMapdvARB;\npfn_glGetnMapfvARB fp_glGetnMapfvARB;\npfn_glGetnMapivARB fp_glGetnMapivARB;\npfn_glGetnPixelMapfvARB fp_glGetnPixelMapfvARB;\npfn_glGetnPixelMapuivARB fp_glGetnPixelMapuivARB;\npfn_glGetnPixelMapusvARB fp_glGetnPixelMapusvARB;\npfn_glGetnPolygonStippleARB fp_glGetnPolygonStippleARB;\npfn_glGetnColorTableARB fp_glGetnColorTableARB;\npfn_glGetnConvolutionFilterARB fp_glGetnConvolutionFilterARB;\npfn_glGetnSeparableFilterARB fp_glGetnSeparableFilterARB;\npfn_glGetnHistogramARB fp_glGetnHistogramARB;\npfn_glGetnMinmaxARB fp_glGetnMinmaxARB;\npfn_glFramebufferSampleLocationsfvARB fp_glFramebufferSampleLocationsfvARB;\npfn_glNamedFramebufferSampleLocationsfvARB fp_glNamedFramebufferSampleLocationsfvARB;\npfn_glEvaluateDepthValuesARB fp_glEvaluateDepthValuesARB;\npfn_glMinSampleShadingARB fp_glMinSampleShadingARB;\npfn_glNamedStringARB fp_glNamedStringARB;\npfn_glDeleteNamedStringARB fp_glDeleteNamedStringARB;\npfn_glCompileShaderIncludeARB fp_glCompileShaderIncludeARB;\npfn_glIsNamedStringARB fp_glIsNamedStringARB;\npfn_glGetNamedStringARB fp_glGetNamedStringARB;\npfn_glGetNamedStringivARB fp_glGetNamedStringivARB;\npfn_glBufferPageCommitmentARB fp_glBufferPageCommitmentARB;\npfn_glNamedBufferPageCommitmentEXT fp_glNamedBufferPageCommitmentEXT;\npfn_glNamedBufferPageCommitmentARB fp_glNamedBufferPageCommitmentARB;\npfn_glTexPageCommitmentARB fp_glTexPageCommitmentARB;\npfn_glTexBufferARB fp_glTexBufferARB;\npfn_glDrawArraysInstancedBaseInstanceEXT fp_glDrawArraysInstancedBaseInstanceEXT;\npfn_glDrawElementsInstancedBaseInstanceEXT fp_glDrawElementsInstancedBaseInstanceEXT;\npfn_glDrawElementsInstancedBaseVertexBaseInstanceEXT fp_glDrawElementsInstancedBaseVertexBaseInstanceEXT;\npfn_glUniformBufferEXT fp_glUniformBufferEXT;\npfn_glGetUniformBufferSizeEXT fp_glGetUniformBufferSizeEXT;\npfn_glGetUniformOffsetEXT fp_glGetUniformOffsetEXT;\npfn_glBindFragDataLocationIndexedEXT fp_glBindFragDataLocationIndexedEXT;\npfn_glBindFragDataLocationEXT fp_glBindFragDataLocationEXT;\npfn_glGetProgramResourceLocationIndexEXT fp_glGetProgramResourceLocationIndexEXT;\npfn_glGetFragDataIndexEXT fp_glGetFragDataIndexEXT;\npfn_glBlendEquationEXT fp_glBlendEquationEXT;\npfn_glBufferStorageEXT fp_glBufferStorageEXT;\npfn_glCopyImageSubDataEXT fp_glCopyImageSubDataEXT;\npfn_glLabelObjectEXT fp_glLabelObjectEXT;\npfn_glGetObjectLabelEXT fp_glGetObjectLabelEXT;\npfn_glInsertEventMarkerEXT fp_glInsertEventMarkerEXT;\npfn_glPushGroupMarkerEXT fp_glPushGroupMarkerEXT;\npfn_glPopGroupMarkerEXT fp_glPopGroupMarkerEXT;\npfn_glMatrixLoadfEXT fp_glMatrixLoadfEXT;\npfn_glMatrixLoaddEXT fp_glMatrixLoaddEXT;\npfn_glMatrixMultfEXT fp_glMatrixMultfEXT;\npfn_glMatrixMultdEXT fp_glMatrixMultdEXT;\npfn_glMatrixLoadIdentityEXT fp_glMatrixLoadIdentityEXT;\npfn_glMatrixRotatefEXT fp_glMatrixRotatefEXT;\npfn_glMatrixRotatedEXT fp_glMatrixRotatedEXT;\npfn_glMatrixScalefEXT fp_glMatrixScalefEXT;\npfn_glMatrixScaledEXT fp_glMatrixScaledEXT;\npfn_glMatrixTranslatefEXT fp_glMatrixTranslatefEXT;\npfn_glMatrixTranslatedEXT fp_glMatrixTranslatedEXT;\npfn_glMatrixFrustumEXT fp_glMatrixFrustumEXT;\npfn_glMatrixOrthoEXT fp_glMatrixOrthoEXT;\npfn_glMatrixPopEXT fp_glMatrixPopEXT;\npfn_glMatrixPushEXT fp_glMatrixPushEXT;\npfn_glClientAttribDefaultEXT fp_glClientAttribDefaultEXT;\npfn_glPushClientAttribDefaultEXT fp_glPushClientAttribDefaultEXT;\npfn_glTextureParameterfEXT fp_glTextureParameterfEXT;\npfn_glTextureParameterfvEXT fp_glTextureParameterfvEXT;\npfn_glTextureParameteriEXT fp_glTextureParameteriEXT;\npfn_glTextureParameterivEXT fp_glTextureParameterivEXT;\npfn_glTextureImage1DEXT fp_glTextureImage1DEXT;\npfn_glTextureImage2DEXT fp_glTextureImage2DEXT;\npfn_glTextureSubImage1DEXT fp_glTextureSubImage1DEXT;\npfn_glTextureSubImage2DEXT fp_glTextureSubImage2DEXT;\npfn_glCopyTextureImage1DEXT fp_glCopyTextureImage1DEXT;\npfn_glCopyTextureImage2DEXT fp_glCopyTextureImage2DEXT;\npfn_glCopyTextureSubImage1DEXT fp_glCopyTextureSubImage1DEXT;\npfn_glCopyTextureSubImage2DEXT fp_glCopyTextureSubImage2DEXT;\npfn_glGetTextureImageEXT fp_glGetTextureImageEXT;\npfn_glGetTextureParameterfvEXT fp_glGetTextureParameterfvEXT;\npfn_glGetTextureParameterivEXT fp_glGetTextureParameterivEXT;\npfn_glGetTextureLevelParameterfvEXT fp_glGetTextureLevelParameterfvEXT;\npfn_glGetTextureLevelParameterivEXT fp_glGetTextureLevelParameterivEXT;\npfn_glTextureImage3DEXT fp_glTextureImage3DEXT;\npfn_glTextureSubImage3DEXT fp_glTextureSubImage3DEXT;\npfn_glCopyTextureSubImage3DEXT fp_glCopyTextureSubImage3DEXT;\npfn_glBindMultiTextureEXT fp_glBindMultiTextureEXT;\npfn_glMultiTexCoordPointerEXT fp_glMultiTexCoordPointerEXT;\npfn_glMultiTexEnvfEXT fp_glMultiTexEnvfEXT;\npfn_glMultiTexEnvfvEXT fp_glMultiTexEnvfvEXT;\npfn_glMultiTexEnviEXT fp_glMultiTexEnviEXT;\npfn_glMultiTexEnvivEXT fp_glMultiTexEnvivEXT;\npfn_glMultiTexGendEXT fp_glMultiTexGendEXT;\npfn_glMultiTexGendvEXT fp_glMultiTexGendvEXT;\npfn_glMultiTexGenfEXT fp_glMultiTexGenfEXT;\npfn_glMultiTexGenfvEXT fp_glMultiTexGenfvEXT;\npfn_glMultiTexGeniEXT fp_glMultiTexGeniEXT;\npfn_glMultiTexGenivEXT fp_glMultiTexGenivEXT;\npfn_glGetMultiTexEnvfvEXT fp_glGetMultiTexEnvfvEXT;\npfn_glGetMultiTexEnvivEXT fp_glGetMultiTexEnvivEXT;\npfn_glGetMultiTexGendvEXT fp_glGetMultiTexGendvEXT;\npfn_glGetMultiTexGenfvEXT fp_glGetMultiTexGenfvEXT;\npfn_glGetMultiTexGenivEXT fp_glGetMultiTexGenivEXT;\npfn_glMultiTexParameteriEXT fp_glMultiTexParameteriEXT;\npfn_glMultiTexParameterivEXT fp_glMultiTexParameterivEXT;\npfn_glMultiTexParameterfEXT fp_glMultiTexParameterfEXT;\npfn_glMultiTexParameterfvEXT fp_glMultiTexParameterfvEXT;\npfn_glMultiTexImage1DEXT fp_glMultiTexImage1DEXT;\npfn_glMultiTexImage2DEXT fp_glMultiTexImage2DEXT;\npfn_glMultiTexSubImage1DEXT fp_glMultiTexSubImage1DEXT;\npfn_glMultiTexSubImage2DEXT fp_glMultiTexSubImage2DEXT;\npfn_glCopyMultiTexImage1DEXT fp_glCopyMultiTexImage1DEXT;\npfn_glCopyMultiTexImage2DEXT fp_glCopyMultiTexImage2DEXT;\npfn_glCopyMultiTexSubImage1DEXT fp_glCopyMultiTexSubImage1DEXT;\npfn_glCopyMultiTexSubImage2DEXT fp_glCopyMultiTexSubImage2DEXT;\npfn_glGetMultiTexImageEXT fp_glGetMultiTexImageEXT;\npfn_glGetMultiTexParameterfvEXT fp_glGetMultiTexParameterfvEXT;\npfn_glGetMultiTexParameterivEXT fp_glGetMultiTexParameterivEXT;\npfn_glGetMultiTexLevelParameterfvEXT fp_glGetMultiTexLevelParameterfvEXT;\npfn_glGetMultiTexLevelParameterivEXT fp_glGetMultiTexLevelParameterivEXT;\npfn_glMultiTexImage3DEXT fp_glMultiTexImage3DEXT;\npfn_glMultiTexSubImage3DEXT fp_glMultiTexSubImage3DEXT;\npfn_glCopyMultiTexSubImage3DEXT fp_glCopyMultiTexSubImage3DEXT;\npfn_glEnableClientStateIndexedEXT fp_glEnableClientStateIndexedEXT;\npfn_glDisableClientStateIndexedEXT fp_glDisableClientStateIndexedEXT;\npfn_glGetFloatIndexedvEXT fp_glGetFloatIndexedvEXT;\npfn_glGetDoubleIndexedvEXT fp_glGetDoubleIndexedvEXT;\npfn_glGetPointerIndexedvEXT fp_glGetPointerIndexedvEXT;\npfn_glEnableIndexedEXT fp_glEnableIndexedEXT;\npfn_glDisableIndexedEXT fp_glDisableIndexedEXT;\npfn_glIsEnabledIndexedEXT fp_glIsEnabledIndexedEXT;\npfn_glGetIntegerIndexedvEXT fp_glGetIntegerIndexedvEXT;\npfn_glGetBooleanIndexedvEXT fp_glGetBooleanIndexedvEXT;\npfn_glCompressedTextureImage3DEXT fp_glCompressedTextureImage3DEXT;\npfn_glCompressedTextureImage2DEXT fp_glCompressedTextureImage2DEXT;\npfn_glCompressedTextureImage1DEXT fp_glCompressedTextureImage1DEXT;\npfn_glCompressedTextureSubImage3DEXT fp_glCompressedTextureSubImage3DEXT;\npfn_glCompressedTextureSubImage2DEXT fp_glCompressedTextureSubImage2DEXT;\npfn_glCompressedTextureSubImage1DEXT fp_glCompressedTextureSubImage1DEXT;\npfn_glGetCompressedTextureImageEXT fp_glGetCompressedTextureImageEXT;\npfn_glCompressedMultiTexImage3DEXT fp_glCompressedMultiTexImage3DEXT;\npfn_glCompressedMultiTexImage2DEXT fp_glCompressedMultiTexImage2DEXT;\npfn_glCompressedMultiTexImage1DEXT fp_glCompressedMultiTexImage1DEXT;\npfn_glCompressedMultiTexSubImage3DEXT fp_glCompressedMultiTexSubImage3DEXT;\npfn_glCompressedMultiTexSubImage2DEXT fp_glCompressedMultiTexSubImage2DEXT;\npfn_glCompressedMultiTexSubImage1DEXT fp_glCompressedMultiTexSubImage1DEXT;\npfn_glGetCompressedMultiTexImageEXT fp_glGetCompressedMultiTexImageEXT;\npfn_glMatrixLoadTransposefEXT fp_glMatrixLoadTransposefEXT;\npfn_glMatrixLoadTransposedEXT fp_glMatrixLoadTransposedEXT;\npfn_glMatrixMultTransposefEXT fp_glMatrixMultTransposefEXT;\npfn_glMatrixMultTransposedEXT fp_glMatrixMultTransposedEXT;\npfn_glNamedBufferDataEXT fp_glNamedBufferDataEXT;\npfn_glNamedBufferSubDataEXT fp_glNamedBufferSubDataEXT;\npfn_glMapNamedBufferEXT fp_glMapNamedBufferEXT;\npfn_glUnmapNamedBufferEXT fp_glUnmapNamedBufferEXT;\npfn_glGetNamedBufferParameterivEXT fp_glGetNamedBufferParameterivEXT;\npfn_glGetNamedBufferPointervEXT fp_glGetNamedBufferPointervEXT;\npfn_glGetNamedBufferSubDataEXT fp_glGetNamedBufferSubDataEXT;\npfn_glProgramUniform1fEXT fp_glProgramUniform1fEXT;\npfn_glProgramUniform2fEXT fp_glProgramUniform2fEXT;\npfn_glProgramUniform3fEXT fp_glProgramUniform3fEXT;\npfn_glProgramUniform4fEXT fp_glProgramUniform4fEXT;\npfn_glProgramUniform1iEXT fp_glProgramUniform1iEXT;\npfn_glProgramUniform2iEXT fp_glProgramUniform2iEXT;\npfn_glProgramUniform3iEXT fp_glProgramUniform3iEXT;\npfn_glProgramUniform4iEXT fp_glProgramUniform4iEXT;\npfn_glProgramUniform1fvEXT fp_glProgramUniform1fvEXT;\npfn_glProgramUniform2fvEXT fp_glProgramUniform2fvEXT;\npfn_glProgramUniform3fvEXT fp_glProgramUniform3fvEXT;\npfn_glProgramUniform4fvEXT fp_glProgramUniform4fvEXT;\npfn_glProgramUniform1ivEXT fp_glProgramUniform1ivEXT;\npfn_glProgramUniform2ivEXT fp_glProgramUniform2ivEXT;\npfn_glProgramUniform3ivEXT fp_glProgramUniform3ivEXT;\npfn_glProgramUniform4ivEXT fp_glProgramUniform4ivEXT;\npfn_glProgramUniformMatrix2fvEXT fp_glProgramUniformMatrix2fvEXT;\npfn_glProgramUniformMatrix3fvEXT fp_glProgramUniformMatrix3fvEXT;\npfn_glProgramUniformMatrix4fvEXT fp_glProgramUniformMatrix4fvEXT;\npfn_glProgramUniformMatrix2x3fvEXT fp_glProgramUniformMatrix2x3fvEXT;\npfn_glProgramUniformMatrix3x2fvEXT fp_glProgramUniformMatrix3x2fvEXT;\npfn_glProgramUniformMatrix2x4fvEXT fp_glProgramUniformMatrix2x4fvEXT;\npfn_glProgramUniformMatrix4x2fvEXT fp_glProgramUniformMatrix4x2fvEXT;\npfn_glProgramUniformMatrix3x4fvEXT fp_glProgramUniformMatrix3x4fvEXT;\npfn_glProgramUniformMatrix4x3fvEXT fp_glProgramUniformMatrix4x3fvEXT;\npfn_glTextureBufferEXT fp_glTextureBufferEXT;\npfn_glMultiTexBufferEXT fp_glMultiTexBufferEXT;\npfn_glTextureParameterIivEXT fp_glTextureParameterIivEXT;\npfn_glTextureParameterIuivEXT fp_glTextureParameterIuivEXT;\npfn_glGetTextureParameterIivEXT fp_glGetTextureParameterIivEXT;\npfn_glGetTextureParameterIuivEXT fp_glGetTextureParameterIuivEXT;\npfn_glMultiTexParameterIivEXT fp_glMultiTexParameterIivEXT;\npfn_glMultiTexParameterIuivEXT fp_glMultiTexParameterIuivEXT;\npfn_glGetMultiTexParameterIivEXT fp_glGetMultiTexParameterIivEXT;\npfn_glGetMultiTexParameterIuivEXT fp_glGetMultiTexParameterIuivEXT;\npfn_glProgramUniform1uiEXT fp_glProgramUniform1uiEXT;\npfn_glProgramUniform2uiEXT fp_glProgramUniform2uiEXT;\npfn_glProgramUniform3uiEXT fp_glProgramUniform3uiEXT;\npfn_glProgramUniform4uiEXT fp_glProgramUniform4uiEXT;\npfn_glProgramUniform1uivEXT fp_glProgramUniform1uivEXT;\npfn_glProgramUniform2uivEXT fp_glProgramUniform2uivEXT;\npfn_glProgramUniform3uivEXT fp_glProgramUniform3uivEXT;\npfn_glProgramUniform4uivEXT fp_glProgramUniform4uivEXT;\npfn_glNamedProgramLocalParameters4fvEXT fp_glNamedProgramLocalParameters4fvEXT;\npfn_glNamedProgramLocalParameterI4iEXT fp_glNamedProgramLocalParameterI4iEXT;\npfn_glNamedProgramLocalParameterI4ivEXT fp_glNamedProgramLocalParameterI4ivEXT;\npfn_glNamedProgramLocalParametersI4ivEXT fp_glNamedProgramLocalParametersI4ivEXT;\npfn_glNamedProgramLocalParameterI4uiEXT fp_glNamedProgramLocalParameterI4uiEXT;\npfn_glNamedProgramLocalParameterI4uivEXT fp_glNamedProgramLocalParameterI4uivEXT;\npfn_glNamedProgramLocalParametersI4uivEXT fp_glNamedProgramLocalParametersI4uivEXT;\npfn_glGetNamedProgramLocalParameterIivEXT fp_glGetNamedProgramLocalParameterIivEXT;\npfn_glGetNamedProgramLocalParameterIuivEXT fp_glGetNamedProgramLocalParameterIuivEXT;\npfn_glEnableClientStateiEXT fp_glEnableClientStateiEXT;\npfn_glDisableClientStateiEXT fp_glDisableClientStateiEXT;\npfn_glGetFloati_vEXT fp_glGetFloati_vEXT;\npfn_glGetDoublei_vEXT fp_glGetDoublei_vEXT;\npfn_glGetPointeri_vEXT fp_glGetPointeri_vEXT;\npfn_glNamedProgramStringEXT fp_glNamedProgramStringEXT;\npfn_glNamedProgramLocalParameter4dEXT fp_glNamedProgramLocalParameter4dEXT;\npfn_glNamedProgramLocalParameter4dvEXT fp_glNamedProgramLocalParameter4dvEXT;\npfn_glNamedProgramLocalParameter4fEXT fp_glNamedProgramLocalParameter4fEXT;\npfn_glNamedProgramLocalParameter4fvEXT fp_glNamedProgramLocalParameter4fvEXT;\npfn_glGetNamedProgramLocalParameterdvEXT fp_glGetNamedProgramLocalParameterdvEXT;\npfn_glGetNamedProgramLocalParameterfvEXT fp_glGetNamedProgramLocalParameterfvEXT;\npfn_glGetNamedProgramivEXT fp_glGetNamedProgramivEXT;\npfn_glGetNamedProgramStringEXT fp_glGetNamedProgramStringEXT;\npfn_glNamedRenderbufferStorageEXT fp_glNamedRenderbufferStorageEXT;\npfn_glGetNamedRenderbufferParameterivEXT fp_glGetNamedRenderbufferParameterivEXT;\npfn_glNamedRenderbufferStorageMultisampleEXT fp_glNamedRenderbufferStorageMultisampleEXT;\npfn_glNamedRenderbufferStorageMultisampleCoverageEXT fp_glNamedRenderbufferStorageMultisampleCoverageEXT;\npfn_glCheckNamedFramebufferStatusEXT fp_glCheckNamedFramebufferStatusEXT;\npfn_glNamedFramebufferTexture1DEXT fp_glNamedFramebufferTexture1DEXT;\npfn_glNamedFramebufferTexture2DEXT fp_glNamedFramebufferTexture2DEXT;\npfn_glNamedFramebufferTexture3DEXT fp_glNamedFramebufferTexture3DEXT;\npfn_glNamedFramebufferRenderbufferEXT fp_glNamedFramebufferRenderbufferEXT;\npfn_glGetNamedFramebufferAttachmentParameterivEXT fp_glGetNamedFramebufferAttachmentParameterivEXT;\npfn_glGenerateTextureMipmapEXT fp_glGenerateTextureMipmapEXT;\npfn_glGenerateMultiTexMipmapEXT fp_glGenerateMultiTexMipmapEXT;\npfn_glFramebufferDrawBufferEXT fp_glFramebufferDrawBufferEXT;\npfn_glFramebufferDrawBuffersEXT fp_glFramebufferDrawBuffersEXT;\npfn_glFramebufferReadBufferEXT fp_glFramebufferReadBufferEXT;\npfn_glGetFramebufferParameterivEXT fp_glGetFramebufferParameterivEXT;\npfn_glNamedCopyBufferSubDataEXT fp_glNamedCopyBufferSubDataEXT;\npfn_glNamedFramebufferTextureEXT fp_glNamedFramebufferTextureEXT;\npfn_glNamedFramebufferTextureLayerEXT fp_glNamedFramebufferTextureLayerEXT;\npfn_glNamedFramebufferTextureFaceEXT fp_glNamedFramebufferTextureFaceEXT;\npfn_glTextureRenderbufferEXT fp_glTextureRenderbufferEXT;\npfn_glMultiTexRenderbufferEXT fp_glMultiTexRenderbufferEXT;\npfn_glVertexArrayVertexOffsetEXT fp_glVertexArrayVertexOffsetEXT;\npfn_glVertexArrayColorOffsetEXT fp_glVertexArrayColorOffsetEXT;\npfn_glVertexArrayEdgeFlagOffsetEXT fp_glVertexArrayEdgeFlagOffsetEXT;\npfn_glVertexArrayIndexOffsetEXT fp_glVertexArrayIndexOffsetEXT;\npfn_glVertexArrayNormalOffsetEXT fp_glVertexArrayNormalOffsetEXT;\npfn_glVertexArrayTexCoordOffsetEXT fp_glVertexArrayTexCoordOffsetEXT;\npfn_glVertexArrayMultiTexCoordOffsetEXT fp_glVertexArrayMultiTexCoordOffsetEXT;\npfn_glVertexArrayFogCoordOffsetEXT fp_glVertexArrayFogCoordOffsetEXT;\npfn_glVertexArraySecondaryColorOffsetEXT fp_glVertexArraySecondaryColorOffsetEXT;\npfn_glVertexArrayVertexAttribOffsetEXT fp_glVertexArrayVertexAttribOffsetEXT;\npfn_glVertexArrayVertexAttribIOffsetEXT fp_glVertexArrayVertexAttribIOffsetEXT;\npfn_glEnableVertexArrayEXT fp_glEnableVertexArrayEXT;\npfn_glDisableVertexArrayEXT fp_glDisableVertexArrayEXT;\npfn_glEnableVertexArrayAttribEXT fp_glEnableVertexArrayAttribEXT;\npfn_glDisableVertexArrayAttribEXT fp_glDisableVertexArrayAttribEXT;\npfn_glGetVertexArrayIntegervEXT fp_glGetVertexArrayIntegervEXT;\npfn_glGetVertexArrayPointervEXT fp_glGetVertexArrayPointervEXT;\npfn_glGetVertexArrayIntegeri_vEXT fp_glGetVertexArrayIntegeri_vEXT;\npfn_glGetVertexArrayPointeri_vEXT fp_glGetVertexArrayPointeri_vEXT;\npfn_glMapNamedBufferRangeEXT fp_glMapNamedBufferRangeEXT;\npfn_glFlushMappedNamedBufferRangeEXT fp_glFlushMappedNamedBufferRangeEXT;\npfn_glNamedBufferStorageEXT fp_glNamedBufferStorageEXT;\npfn_glClearNamedBufferDataEXT fp_glClearNamedBufferDataEXT;\npfn_glClearNamedBufferSubDataEXT fp_glClearNamedBufferSubDataEXT;\npfn_glNamedFramebufferParameteriEXT fp_glNamedFramebufferParameteriEXT;\npfn_glGetNamedFramebufferParameterivEXT fp_glGetNamedFramebufferParameterivEXT;\npfn_glProgramUniform1dEXT fp_glProgramUniform1dEXT;\npfn_glProgramUniform2dEXT fp_glProgramUniform2dEXT;\npfn_glProgramUniform3dEXT fp_glProgramUniform3dEXT;\npfn_glProgramUniform4dEXT fp_glProgramUniform4dEXT;\npfn_glProgramUniform1dvEXT fp_glProgramUniform1dvEXT;\npfn_glProgramUniform2dvEXT fp_glProgramUniform2dvEXT;\npfn_glProgramUniform3dvEXT fp_glProgramUniform3dvEXT;\npfn_glProgramUniform4dvEXT fp_glProgramUniform4dvEXT;\npfn_glProgramUniformMatrix2dvEXT fp_glProgramUniformMatrix2dvEXT;\npfn_glProgramUniformMatrix3dvEXT fp_glProgramUniformMatrix3dvEXT;\npfn_glProgramUniformMatrix4dvEXT fp_glProgramUniformMatrix4dvEXT;\npfn_glProgramUniformMatrix2x3dvEXT fp_glProgramUniformMatrix2x3dvEXT;\npfn_glProgramUniformMatrix2x4dvEXT fp_glProgramUniformMatrix2x4dvEXT;\npfn_glProgramUniformMatrix3x2dvEXT fp_glProgramUniformMatrix3x2dvEXT;\npfn_glProgramUniformMatrix3x4dvEXT fp_glProgramUniformMatrix3x4dvEXT;\npfn_glProgramUniformMatrix4x2dvEXT fp_glProgramUniformMatrix4x2dvEXT;\npfn_glProgramUniformMatrix4x3dvEXT fp_glProgramUniformMatrix4x3dvEXT;\npfn_glTextureBufferRangeEXT fp_glTextureBufferRangeEXT;\npfn_glTextureStorage1DEXT fp_glTextureStorage1DEXT;\npfn_glTextureStorage2DEXT fp_glTextureStorage2DEXT;\npfn_glTextureStorage3DEXT fp_glTextureStorage3DEXT;\npfn_glTextureStorage2DMultisampleEXT fp_glTextureStorage2DMultisampleEXT;\npfn_glTextureStorage3DMultisampleEXT fp_glTextureStorage3DMultisampleEXT;\npfn_glVertexArrayBindVertexBufferEXT fp_glVertexArrayBindVertexBufferEXT;\npfn_glVertexArrayVertexAttribFormatEXT fp_glVertexArrayVertexAttribFormatEXT;\npfn_glVertexArrayVertexAttribIFormatEXT fp_glVertexArrayVertexAttribIFormatEXT;\npfn_glVertexArrayVertexAttribLFormatEXT fp_glVertexArrayVertexAttribLFormatEXT;\npfn_glVertexArrayVertexAttribBindingEXT fp_glVertexArrayVertexAttribBindingEXT;\npfn_glVertexArrayVertexBindingDivisorEXT fp_glVertexArrayVertexBindingDivisorEXT;\npfn_glVertexArrayVertexAttribLOffsetEXT fp_glVertexArrayVertexAttribLOffsetEXT;\npfn_glTexturePageCommitmentEXT fp_glTexturePageCommitmentEXT;\npfn_glVertexArrayVertexAttribDivisorEXT fp_glVertexArrayVertexAttribDivisorEXT;\npfn_glDiscardFramebufferEXT fp_glDiscardFramebufferEXT;\npfn_glGenQueriesEXT fp_glGenQueriesEXT;\npfn_glDeleteQueriesEXT fp_glDeleteQueriesEXT;\npfn_glIsQueryEXT fp_glIsQueryEXT;\npfn_glBeginQueryEXT fp_glBeginQueryEXT;\npfn_glEndQueryEXT fp_glEndQueryEXT;\npfn_glQueryCounterEXT fp_glQueryCounterEXT;\npfn_glGetQueryivEXT fp_glGetQueryivEXT;\npfn_glGetQueryObjectivEXT fp_glGetQueryObjectivEXT;\npfn_glGetQueryObjectuivEXT fp_glGetQueryObjectuivEXT;\npfn_glGetQueryObjecti64vEXT fp_glGetQueryObjecti64vEXT;\npfn_glGetQueryObjectui64vEXT fp_glGetQueryObjectui64vEXT;\npfn_glDrawBuffersEXT fp_glDrawBuffersEXT;\npfn_glColorMaskIndexedEXT fp_glColorMaskIndexedEXT;\npfn_glEnableiEXT fp_glEnableiEXT;\npfn_glDisableiEXT fp_glDisableiEXT;\npfn_glBlendEquationiEXT fp_glBlendEquationiEXT;\npfn_glBlendEquationSeparateiEXT fp_glBlendEquationSeparateiEXT;\npfn_glBlendFunciEXT fp_glBlendFunciEXT;\npfn_glBlendFuncSeparateiEXT fp_glBlendFuncSeparateiEXT;\npfn_glColorMaskiEXT fp_glColorMaskiEXT;\npfn_glIsEnablediEXT fp_glIsEnablediEXT;\npfn_glDrawElementsBaseVertexEXT fp_glDrawElementsBaseVertexEXT;\npfn_glDrawRangeElementsBaseVertexEXT fp_glDrawRangeElementsBaseVertexEXT;\npfn_glDrawElementsInstancedBaseVertexEXT fp_glDrawElementsInstancedBaseVertexEXT;\npfn_glMultiDrawElementsBaseVertexEXT fp_glMultiDrawElementsBaseVertexEXT;\npfn_glDrawArraysInstancedEXT fp_glDrawArraysInstancedEXT;\npfn_glDrawElementsInstancedEXT fp_glDrawElementsInstancedEXT;\npfn_glBlitFramebufferEXT fp_glBlitFramebufferEXT;\npfn_glRenderbufferStorageMultisampleEXT fp_glRenderbufferStorageMultisampleEXT;\npfn_glIsRenderbufferEXT fp_glIsRenderbufferEXT;\npfn_glBindRenderbufferEXT fp_glBindRenderbufferEXT;\npfn_glDeleteRenderbuffersEXT fp_glDeleteRenderbuffersEXT;\npfn_glGenRenderbuffersEXT fp_glGenRenderbuffersEXT;\npfn_glRenderbufferStorageEXT fp_glRenderbufferStorageEXT;\npfn_glGetRenderbufferParameterivEXT fp_glGetRenderbufferParameterivEXT;\npfn_glIsFramebufferEXT fp_glIsFramebufferEXT;\npfn_glBindFramebufferEXT fp_glBindFramebufferEXT;\npfn_glDeleteFramebuffersEXT fp_glDeleteFramebuffersEXT;\npfn_glGenFramebuffersEXT fp_glGenFramebuffersEXT;\npfn_glCheckFramebufferStatusEXT fp_glCheckFramebufferStatusEXT;\npfn_glFramebufferTexture1DEXT fp_glFramebufferTexture1DEXT;\npfn_glFramebufferTexture2DEXT fp_glFramebufferTexture2DEXT;\npfn_glFramebufferTexture3DEXT fp_glFramebufferTexture3DEXT;\npfn_glFramebufferRenderbufferEXT fp_glFramebufferRenderbufferEXT;\npfn_glGetFramebufferAttachmentParameterivEXT fp_glGetFramebufferAttachmentParameterivEXT;\npfn_glGenerateMipmapEXT fp_glGenerateMipmapEXT;\npfn_glFramebufferTextureEXT fp_glFramebufferTextureEXT;\npfn_glProgramParameteriEXT fp_glProgramParameteriEXT;\npfn_glProgramEnvParameters4fvEXT fp_glProgramEnvParameters4fvEXT;\npfn_glProgramLocalParameters4fvEXT fp_glProgramLocalParameters4fvEXT;\npfn_glGetUniformuivEXT fp_glGetUniformuivEXT;\npfn_glGetFragDataLocationEXT fp_glGetFragDataLocationEXT;\npfn_glUniform1uiEXT fp_glUniform1uiEXT;\npfn_glUniform2uiEXT fp_glUniform2uiEXT;\npfn_glUniform3uiEXT fp_glUniform3uiEXT;\npfn_glUniform4uiEXT fp_glUniform4uiEXT;\npfn_glUniform1uivEXT fp_glUniform1uivEXT;\npfn_glUniform2uivEXT fp_glUniform2uivEXT;\npfn_glUniform3uivEXT fp_glUniform3uivEXT;\npfn_glUniform4uivEXT fp_glUniform4uivEXT;\npfn_glVertexAttribDivisorEXT fp_glVertexAttribDivisorEXT;\npfn_glMapBufferRangeEXT fp_glMapBufferRangeEXT;\npfn_glFlushMappedBufferRangeEXT fp_glFlushMappedBufferRangeEXT;\npfn_glMultiDrawArraysIndirectEXT fp_glMultiDrawArraysIndirectEXT;\npfn_glMultiDrawElementsIndirectEXT fp_glMultiDrawElementsIndirectEXT;\npfn_glFramebufferTexture2DMultisampleEXT fp_glFramebufferTexture2DMultisampleEXT;\npfn_glReadBufferIndexedEXT fp_glReadBufferIndexedEXT;\npfn_glDrawBuffersIndexedEXT fp_glDrawBuffersIndexedEXT;\npfn_glGetIntegeri_vEXT fp_glGetIntegeri_vEXT;\npfn_glPolygonOffsetClampEXT fp_glPolygonOffsetClampEXT;\npfn_glPrimitiveBoundingBoxEXT fp_glPrimitiveBoundingBoxEXT;\npfn_glProvokingVertexEXT fp_glProvokingVertexEXT;\npfn_glRasterSamplesEXT fp_glRasterSamplesEXT;\npfn_glGetGraphicsResetStatusEXT fp_glGetGraphicsResetStatusEXT;\npfn_glReadnPixelsEXT fp_glReadnPixelsEXT;\npfn_glGetnUniformfvEXT fp_glGetnUniformfvEXT;\npfn_glGetnUniformivEXT fp_glGetnUniformivEXT;\npfn_glUseShaderProgramEXT fp_glUseShaderProgramEXT;\npfn_glActiveProgramEXT fp_glActiveProgramEXT;\npfn_glCreateShaderProgramEXT fp_glCreateShaderProgramEXT;\npfn_glActiveShaderProgramEXT fp_glActiveShaderProgramEXT;\npfn_glBindProgramPipelineEXT fp_glBindProgramPipelineEXT;\npfn_glCreateShaderProgramvEXT fp_glCreateShaderProgramvEXT;\npfn_glDeleteProgramPipelinesEXT fp_glDeleteProgramPipelinesEXT;\npfn_glGenProgramPipelinesEXT fp_glGenProgramPipelinesEXT;\npfn_glGetProgramPipelineInfoLogEXT fp_glGetProgramPipelineInfoLogEXT;\npfn_glGetProgramPipelineivEXT fp_glGetProgramPipelineivEXT;\npfn_glIsProgramPipelineEXT fp_glIsProgramPipelineEXT;\npfn_glUseProgramStagesEXT fp_glUseProgramStagesEXT;\npfn_glValidateProgramPipelineEXT fp_glValidateProgramPipelineEXT;\npfn_glBindImageTextureEXT fp_glBindImageTextureEXT;\npfn_glMemoryBarrierEXT fp_glMemoryBarrierEXT;\npfn_glTexPageCommitmentEXT fp_glTexPageCommitmentEXT;\npfn_glStencilClearTagEXT fp_glStencilClearTagEXT;\npfn_glPatchParameteriEXT fp_glPatchParameteriEXT;\npfn_glFramebufferTextureLayerEXT fp_glFramebufferTextureLayerEXT;\npfn_glTexParameterIivEXT fp_glTexParameterIivEXT;\npfn_glTexParameterIuivEXT fp_glTexParameterIuivEXT;\npfn_glGetTexParameterIivEXT fp_glGetTexParameterIivEXT;\npfn_glGetTexParameterIuivEXT fp_glGetTexParameterIuivEXT;\npfn_glSamplerParameterIivEXT fp_glSamplerParameterIivEXT;\npfn_glSamplerParameterIuivEXT fp_glSamplerParameterIuivEXT;\npfn_glGetSamplerParameterIivEXT fp_glGetSamplerParameterIivEXT;\npfn_glGetSamplerParameterIuivEXT fp_glGetSamplerParameterIuivEXT;\npfn_glTexBufferEXT fp_glTexBufferEXT;\npfn_glTexBufferRangeEXT fp_glTexBufferRangeEXT;\npfn_glClearColorIiEXT fp_glClearColorIiEXT;\npfn_glClearColorIuiEXT fp_glClearColorIuiEXT;\npfn_glTexStorage1DEXT fp_glTexStorage1DEXT;\npfn_glTexStorage2DEXT fp_glTexStorage2DEXT;\npfn_glTexStorage3DEXT fp_glTexStorage3DEXT;\npfn_glTextureViewEXT fp_glTextureViewEXT;\npfn_glBeginTransformFeedbackEXT fp_glBeginTransformFeedbackEXT;\npfn_glEndTransformFeedbackEXT fp_glEndTransformFeedbackEXT;\npfn_glBindBufferRangeEXT fp_glBindBufferRangeEXT;\npfn_glBindBufferOffsetEXT fp_glBindBufferOffsetEXT;\npfn_glBindBufferBaseEXT fp_glBindBufferBaseEXT;\npfn_glTransformFeedbackVaryingsEXT fp_glTransformFeedbackVaryingsEXT;\npfn_glGetTransformFeedbackVaryingEXT fp_glGetTransformFeedbackVaryingEXT;\npfn_glVertexAttribL1dEXT fp_glVertexAttribL1dEXT;\npfn_glVertexAttribL2dEXT fp_glVertexAttribL2dEXT;\npfn_glVertexAttribL3dEXT fp_glVertexAttribL3dEXT;\npfn_glVertexAttribL4dEXT fp_glVertexAttribL4dEXT;\npfn_glVertexAttribL1dvEXT fp_glVertexAttribL1dvEXT;\npfn_glVertexAttribL2dvEXT fp_glVertexAttribL2dvEXT;\npfn_glVertexAttribL3dvEXT fp_glVertexAttribL3dvEXT;\npfn_glVertexAttribL4dvEXT fp_glVertexAttribL4dvEXT;\npfn_glVertexAttribLPointerEXT fp_glVertexAttribLPointerEXT;\npfn_glGetVertexAttribLdvEXT fp_glGetVertexAttribLdvEXT;\npfn_glImportSyncEXT fp_glImportSyncEXT;\npfn_glCopyImageSubDataOES fp_glCopyImageSubDataOES;\npfn_glEnableiOES fp_glEnableiOES;\npfn_glDisableiOES fp_glDisableiOES;\npfn_glBlendEquationiOES fp_glBlendEquationiOES;\npfn_glBlendEquationSeparateiOES fp_glBlendEquationSeparateiOES;\npfn_glBlendFunciOES fp_glBlendFunciOES;\npfn_glBlendFuncSeparateiOES fp_glBlendFuncSeparateiOES;\npfn_glColorMaskiOES fp_glColorMaskiOES;\npfn_glIsEnablediOES fp_glIsEnablediOES;\npfn_glDrawElementsBaseVertexOES fp_glDrawElementsBaseVertexOES;\npfn_glDrawRangeElementsBaseVertexOES fp_glDrawRangeElementsBaseVertexOES;\npfn_glDrawElementsInstancedBaseVertexOES fp_glDrawElementsInstancedBaseVertexOES;\npfn_glMultiDrawElementsBaseVertexOES fp_glMultiDrawElementsBaseVertexOES;\npfn_glEGLImageTargetTexture2DOES fp_glEGLImageTargetTexture2DOES;\npfn_glEGLImageTargetRenderbufferStorageOES fp_glEGLImageTargetRenderbufferStorageOES;\npfn_glFramebufferTextureOES fp_glFramebufferTextureOES;\npfn_glGetProgramBinaryOES fp_glGetProgramBinaryOES;\npfn_glProgramBinaryOES fp_glProgramBinaryOES;\npfn_glMapBufferOES fp_glMapBufferOES;\npfn_glUnmapBufferOES fp_glUnmapBufferOES;\npfn_glGetBufferPointervOES fp_glGetBufferPointervOES;\npfn_glPrimitiveBoundingBoxOES fp_glPrimitiveBoundingBoxOES;\npfn_glMinSampleShadingOES fp_glMinSampleShadingOES;\npfn_glPatchParameteriOES fp_glPatchParameteriOES;\npfn_glTexImage3DOES fp_glTexImage3DOES;\npfn_glTexSubImage3DOES fp_glTexSubImage3DOES;\npfn_glCopyTexSubImage3DOES fp_glCopyTexSubImage3DOES;\npfn_glCompressedTexImage3DOES fp_glCompressedTexImage3DOES;\npfn_glCompressedTexSubImage3DOES fp_glCompressedTexSubImage3DOES;\npfn_glFramebufferTexture3DOES fp_glFramebufferTexture3DOES;\npfn_glTexParameterIivOES fp_glTexParameterIivOES;\npfn_glTexParameterIuivOES fp_glTexParameterIuivOES;\npfn_glGetTexParameterIivOES fp_glGetTexParameterIivOES;\npfn_glGetTexParameterIuivOES fp_glGetTexParameterIuivOES;\npfn_glSamplerParameterIivOES fp_glSamplerParameterIivOES;\npfn_glSamplerParameterIuivOES fp_glSamplerParameterIuivOES;\npfn_glGetSamplerParameterIivOES fp_glGetSamplerParameterIivOES;\npfn_glGetSamplerParameterIuivOES fp_glGetSamplerParameterIuivOES;\npfn_glTexBufferOES fp_glTexBufferOES;\npfn_glTexBufferRangeOES fp_glTexBufferRangeOES;\npfn_glTexStorage3DMultisampleOES fp_glTexStorage3DMultisampleOES;\npfn_glTextureViewOES fp_glTextureViewOES;\npfn_glBindVertexArrayOES fp_glBindVertexArrayOES;\npfn_glDeleteVertexArraysOES fp_glDeleteVertexArraysOES;\npfn_glGenVertexArraysOES fp_glGenVertexArraysOES;\npfn_glIsVertexArrayOES fp_glIsVertexArrayOES;\npfn_glDebugMessageEnableAMD fp_glDebugMessageEnableAMD;\npfn_glDebugMessageInsertAMD fp_glDebugMessageInsertAMD;\npfn_glDebugMessageCallbackAMD fp_glDebugMessageCallbackAMD;\npfn_glGetDebugMessageLogAMD fp_glGetDebugMessageLogAMD;\npfn_glBlendFuncIndexedAMD fp_glBlendFuncIndexedAMD;\npfn_glBlendFuncSeparateIndexedAMD fp_glBlendFuncSeparateIndexedAMD;\npfn_glBlendEquationIndexedAMD fp_glBlendEquationIndexedAMD;\npfn_glBlendEquationSeparateIndexedAMD fp_glBlendEquationSeparateIndexedAMD;\npfn_glUniform1i64NV fp_glUniform1i64NV;\npfn_glUniform2i64NV fp_glUniform2i64NV;\npfn_glUniform3i64NV fp_glUniform3i64NV;\npfn_glUniform4i64NV fp_glUniform4i64NV;\npfn_glUniform1i64vNV fp_glUniform1i64vNV;\npfn_glUniform2i64vNV fp_glUniform2i64vNV;\npfn_glUniform3i64vNV fp_glUniform3i64vNV;\npfn_glUniform4i64vNV fp_glUniform4i64vNV;\npfn_glUniform1ui64NV fp_glUniform1ui64NV;\npfn_glUniform2ui64NV fp_glUniform2ui64NV;\npfn_glUniform3ui64NV fp_glUniform3ui64NV;\npfn_glUniform4ui64NV fp_glUniform4ui64NV;\npfn_glUniform1ui64vNV fp_glUniform1ui64vNV;\npfn_glUniform2ui64vNV fp_glUniform2ui64vNV;\npfn_glUniform3ui64vNV fp_glUniform3ui64vNV;\npfn_glUniform4ui64vNV fp_glUniform4ui64vNV;\npfn_glGetUniformi64vNV fp_glGetUniformi64vNV;\npfn_glGetUniformui64vNV fp_glGetUniformui64vNV;\npfn_glProgramUniform1i64NV fp_glProgramUniform1i64NV;\npfn_glProgramUniform2i64NV fp_glProgramUniform2i64NV;\npfn_glProgramUniform3i64NV fp_glProgramUniform3i64NV;\npfn_glProgramUniform4i64NV fp_glProgramUniform4i64NV;\npfn_glProgramUniform1i64vNV fp_glProgramUniform1i64vNV;\npfn_glProgramUniform2i64vNV fp_glProgramUniform2i64vNV;\npfn_glProgramUniform3i64vNV fp_glProgramUniform3i64vNV;\npfn_glProgramUniform4i64vNV fp_glProgramUniform4i64vNV;\npfn_glProgramUniform1ui64NV fp_glProgramUniform1ui64NV;\npfn_glProgramUniform2ui64NV fp_glProgramUniform2ui64NV;\npfn_glProgramUniform3ui64NV fp_glProgramUniform3ui64NV;\npfn_glProgramUniform4ui64NV fp_glProgramUniform4ui64NV;\npfn_glProgramUniform1ui64vNV fp_glProgramUniform1ui64vNV;\npfn_glProgramUniform2ui64vNV fp_glProgramUniform2ui64vNV;\npfn_glProgramUniform3ui64vNV fp_glProgramUniform3ui64vNV;\npfn_glProgramUniform4ui64vNV fp_glProgramUniform4ui64vNV;\npfn_glVertexAttribParameteriAMD fp_glVertexAttribParameteriAMD;\npfn_glMultiDrawArraysIndirectAMD fp_glMultiDrawArraysIndirectAMD;\npfn_glMultiDrawElementsIndirectAMD fp_glMultiDrawElementsIndirectAMD;\npfn_glGenNamesAMD fp_glGenNamesAMD;\npfn_glDeleteNamesAMD fp_glDeleteNamesAMD;\npfn_glIsNameAMD fp_glIsNameAMD;\npfn_glQueryObjectParameteruiAMD fp_glQueryObjectParameteruiAMD;\npfn_glGetPerfMonitorGroupsAMD fp_glGetPerfMonitorGroupsAMD;\npfn_glGetPerfMonitorCountersAMD fp_glGetPerfMonitorCountersAMD;\npfn_glGetPerfMonitorGroupStringAMD fp_glGetPerfMonitorGroupStringAMD;\npfn_glGetPerfMonitorCounterStringAMD fp_glGetPerfMonitorCounterStringAMD;\npfn_glGetPerfMonitorCounterInfoAMD fp_glGetPerfMonitorCounterInfoAMD;\npfn_glGenPerfMonitorsAMD fp_glGenPerfMonitorsAMD;\npfn_glDeletePerfMonitorsAMD fp_glDeletePerfMonitorsAMD;\npfn_glSelectPerfMonitorCountersAMD fp_glSelectPerfMonitorCountersAMD;\npfn_glBeginPerfMonitorAMD fp_glBeginPerfMonitorAMD;\npfn_glEndPerfMonitorAMD fp_glEndPerfMonitorAMD;\npfn_glGetPerfMonitorCounterDataAMD fp_glGetPerfMonitorCounterDataAMD;\npfn_glSetMultisamplefvAMD fp_glSetMultisamplefvAMD;\npfn_glTexStorageSparseAMD fp_glTexStorageSparseAMD;\npfn_glTextureStorageSparseAMD fp_glTextureStorageSparseAMD;\npfn_glStencilOpValueAMD fp_glStencilOpValueAMD;\npfn_glTessellationFactorAMD fp_glTessellationFactorAMD;\npfn_glTessellationModeAMD fp_glTessellationModeAMD;\npfn_glBlitFramebufferANGLE fp_glBlitFramebufferANGLE;\npfn_glRenderbufferStorageMultisampleANGLE fp_glRenderbufferStorageMultisampleANGLE;\npfn_glDrawArraysInstancedANGLE fp_glDrawArraysInstancedANGLE;\npfn_glDrawElementsInstancedANGLE fp_glDrawElementsInstancedANGLE;\npfn_glVertexAttribDivisorANGLE fp_glVertexAttribDivisorANGLE;\npfn_glGetTranslatedShaderSourceANGLE fp_glGetTranslatedShaderSourceANGLE;\npfn_glCopyTextureLevelsAPPLE fp_glCopyTextureLevelsAPPLE;\npfn_glElementPointerAPPLE fp_glElementPointerAPPLE;\npfn_glDrawElementArrayAPPLE fp_glDrawElementArrayAPPLE;\npfn_glDrawRangeElementArrayAPPLE fp_glDrawRangeElementArrayAPPLE;\npfn_glMultiDrawElementArrayAPPLE fp_glMultiDrawElementArrayAPPLE;\npfn_glMultiDrawRangeElementArrayAPPLE fp_glMultiDrawRangeElementArrayAPPLE;\npfn_glGenFencesAPPLE fp_glGenFencesAPPLE;\npfn_glDeleteFencesAPPLE fp_glDeleteFencesAPPLE;\npfn_glSetFenceAPPLE fp_glSetFenceAPPLE;\npfn_glIsFenceAPPLE fp_glIsFenceAPPLE;\npfn_glTestFenceAPPLE fp_glTestFenceAPPLE;\npfn_glFinishFenceAPPLE fp_glFinishFenceAPPLE;\npfn_glTestObjectAPPLE fp_glTestObjectAPPLE;\npfn_glFinishObjectAPPLE fp_glFinishObjectAPPLE;\npfn_glBufferParameteriAPPLE fp_glBufferParameteriAPPLE;\npfn_glFlushMappedBufferRangeAPPLE fp_glFlushMappedBufferRangeAPPLE;\npfn_glRenderbufferStorageMultisampleAPPLE fp_glRenderbufferStorageMultisampleAPPLE;\npfn_glResolveMultisampleFramebufferAPPLE fp_glResolveMultisampleFramebufferAPPLE;\npfn_glObjectPurgeableAPPLE fp_glObjectPurgeableAPPLE;\npfn_glObjectUnpurgeableAPPLE fp_glObjectUnpurgeableAPPLE;\npfn_glGetObjectParameterivAPPLE fp_glGetObjectParameterivAPPLE;\npfn_glFenceSyncAPPLE fp_glFenceSyncAPPLE;\npfn_glIsSyncAPPLE fp_glIsSyncAPPLE;\npfn_glDeleteSyncAPPLE fp_glDeleteSyncAPPLE;\npfn_glClientWaitSyncAPPLE fp_glClientWaitSyncAPPLE;\npfn_glWaitSyncAPPLE fp_glWaitSyncAPPLE;\npfn_glGetInteger64vAPPLE fp_glGetInteger64vAPPLE;\npfn_glGetSyncivAPPLE fp_glGetSyncivAPPLE;\npfn_glTextureRangeAPPLE fp_glTextureRangeAPPLE;\npfn_glGetTexParameterPointervAPPLE fp_glGetTexParameterPointervAPPLE;\npfn_glBindVertexArrayAPPLE fp_glBindVertexArrayAPPLE;\npfn_glDeleteVertexArraysAPPLE fp_glDeleteVertexArraysAPPLE;\npfn_glGenVertexArraysAPPLE fp_glGenVertexArraysAPPLE;\npfn_glIsVertexArrayAPPLE fp_glIsVertexArrayAPPLE;\npfn_glVertexArrayRangeAPPLE fp_glVertexArrayRangeAPPLE;\npfn_glFlushVertexArrayRangeAPPLE fp_glFlushVertexArrayRangeAPPLE;\npfn_glVertexArrayParameteriAPPLE fp_glVertexArrayParameteriAPPLE;\npfn_glEnableVertexAttribAPPLE fp_glEnableVertexAttribAPPLE;\npfn_glDisableVertexAttribAPPLE fp_glDisableVertexAttribAPPLE;\npfn_glIsVertexAttribEnabledAPPLE fp_glIsVertexAttribEnabledAPPLE;\npfn_glMapVertexAttrib1dAPPLE fp_glMapVertexAttrib1dAPPLE;\npfn_glMapVertexAttrib1fAPPLE fp_glMapVertexAttrib1fAPPLE;\npfn_glMapVertexAttrib2dAPPLE fp_glMapVertexAttrib2dAPPLE;\npfn_glMapVertexAttrib2fAPPLE fp_glMapVertexAttrib2fAPPLE;\npfn_glFrameTerminatorGREMEDY fp_glFrameTerminatorGREMEDY;\npfn_glStringMarkerGREMEDY fp_glStringMarkerGREMEDY;\npfn_glRenderbufferStorageMultisampleIMG fp_glRenderbufferStorageMultisampleIMG;\npfn_glFramebufferTexture2DMultisampleIMG fp_glFramebufferTexture2DMultisampleIMG;\npfn_glBlendFuncSeparateINGR fp_glBlendFuncSeparateINGR;\npfn_glApplyFramebufferAttachmentCMAAINTEL fp_glApplyFramebufferAttachmentCMAAINTEL;\npfn_glSyncTextureINTEL fp_glSyncTextureINTEL;\npfn_glUnmapTexture2DINTEL fp_glUnmapTexture2DINTEL;\npfn_glMapTexture2DINTEL fp_glMapTexture2DINTEL;\npfn_glBeginPerfQueryINTEL fp_glBeginPerfQueryINTEL;\npfn_glCreatePerfQueryINTEL fp_glCreatePerfQueryINTEL;\npfn_glDeletePerfQueryINTEL fp_glDeletePerfQueryINTEL;\npfn_glEndPerfQueryINTEL fp_glEndPerfQueryINTEL;\npfn_glGetFirstPerfQueryIdINTEL fp_glGetFirstPerfQueryIdINTEL;\npfn_glGetNextPerfQueryIdINTEL fp_glGetNextPerfQueryIdINTEL;\npfn_glGetPerfCounterInfoINTEL fp_glGetPerfCounterInfoINTEL;\npfn_glGetPerfQueryDataINTEL fp_glGetPerfQueryDataINTEL;\npfn_glGetPerfQueryIdByNameINTEL fp_glGetPerfQueryIdByNameINTEL;\npfn_glGetPerfQueryInfoINTEL fp_glGetPerfQueryInfoINTEL;\npfn_glMultiDrawArraysIndirectBindlessNV fp_glMultiDrawArraysIndirectBindlessNV;\npfn_glMultiDrawElementsIndirectBindlessNV fp_glMultiDrawElementsIndirectBindlessNV;\npfn_glMultiDrawArraysIndirectBindlessCountNV fp_glMultiDrawArraysIndirectBindlessCountNV;\npfn_glMultiDrawElementsIndirectBindlessCountNV fp_glMultiDrawElementsIndirectBindlessCountNV;\npfn_glGetTextureHandleNV fp_glGetTextureHandleNV;\npfn_glGetTextureSamplerHandleNV fp_glGetTextureSamplerHandleNV;\npfn_glMakeTextureHandleResidentNV fp_glMakeTextureHandleResidentNV;\npfn_glMakeTextureHandleNonResidentNV fp_glMakeTextureHandleNonResidentNV;\npfn_glGetImageHandleNV fp_glGetImageHandleNV;\npfn_glMakeImageHandleResidentNV fp_glMakeImageHandleResidentNV;\npfn_glMakeImageHandleNonResidentNV fp_glMakeImageHandleNonResidentNV;\npfn_glUniformHandleui64NV fp_glUniformHandleui64NV;\npfn_glUniformHandleui64vNV fp_glUniformHandleui64vNV;\npfn_glProgramUniformHandleui64NV fp_glProgramUniformHandleui64NV;\npfn_glProgramUniformHandleui64vNV fp_glProgramUniformHandleui64vNV;\npfn_glIsTextureHandleResidentNV fp_glIsTextureHandleResidentNV;\npfn_glIsImageHandleResidentNV fp_glIsImageHandleResidentNV;\npfn_glBlendParameteriNV fp_glBlendParameteriNV;\npfn_glBlendBarrierNV fp_glBlendBarrierNV;\npfn_glCreateStatesNV fp_glCreateStatesNV;\npfn_glDeleteStatesNV fp_glDeleteStatesNV;\npfn_glIsStateNV fp_glIsStateNV;\npfn_glStateCaptureNV fp_glStateCaptureNV;\npfn_glGetCommandHeaderNV fp_glGetCommandHeaderNV;\npfn_glGetStageIndexNV fp_glGetStageIndexNV;\npfn_glDrawCommandsNV fp_glDrawCommandsNV;\npfn_glDrawCommandsAddressNV fp_glDrawCommandsAddressNV;\npfn_glDrawCommandsStatesNV fp_glDrawCommandsStatesNV;\npfn_glDrawCommandsStatesAddressNV fp_glDrawCommandsStatesAddressNV;\npfn_glCreateCommandListsNV fp_glCreateCommandListsNV;\npfn_glDeleteCommandListsNV fp_glDeleteCommandListsNV;\npfn_glIsCommandListNV fp_glIsCommandListNV;\npfn_glListDrawCommandsStatesClientNV fp_glListDrawCommandsStatesClientNV;\npfn_glCommandListSegmentsNV fp_glCommandListSegmentsNV;\npfn_glCompileCommandListNV fp_glCompileCommandListNV;\npfn_glCallCommandListNV fp_glCallCommandListNV;\npfn_glBeginConditionalRenderNV fp_glBeginConditionalRenderNV;\npfn_glEndConditionalRenderNV fp_glEndConditionalRenderNV;\npfn_glSubpixelPrecisionBiasNV fp_glSubpixelPrecisionBiasNV;\npfn_glConservativeRasterParameterfNV fp_glConservativeRasterParameterfNV;\npfn_glCopyBufferSubDataNV fp_glCopyBufferSubDataNV;\npfn_glCopyImageSubDataNV fp_glCopyImageSubDataNV;\npfn_glCoverageMaskNV fp_glCoverageMaskNV;\npfn_glCoverageOperationNV fp_glCoverageOperationNV;\npfn_glDepthRangedNV fp_glDepthRangedNV;\npfn_glClearDepthdNV fp_glClearDepthdNV;\npfn_glDepthBoundsdNV fp_glDepthBoundsdNV;\npfn_glDrawBuffersNV fp_glDrawBuffersNV;\npfn_glDrawArraysInstancedNV fp_glDrawArraysInstancedNV;\npfn_glDrawElementsInstancedNV fp_glDrawElementsInstancedNV;\npfn_glDrawTextureNV fp_glDrawTextureNV;\npfn_glGetMultisamplefvNV fp_glGetMultisamplefvNV;\npfn_glSampleMaskIndexedNV fp_glSampleMaskIndexedNV;\npfn_glTexRenderbufferNV fp_glTexRenderbufferNV;\npfn_glDeleteFencesNV fp_glDeleteFencesNV;\npfn_glGenFencesNV fp_glGenFencesNV;\npfn_glIsFenceNV fp_glIsFenceNV;\npfn_glTestFenceNV fp_glTestFenceNV;\npfn_glGetFenceivNV fp_glGetFenceivNV;\npfn_glFinishFenceNV fp_glFinishFenceNV;\npfn_glSetFenceNV fp_glSetFenceNV;\npfn_glFragmentCoverageColorNV fp_glFragmentCoverageColorNV;\npfn_glBlitFramebufferNV fp_glBlitFramebufferNV;\npfn_glCoverageModulationTableNV fp_glCoverageModulationTableNV;\npfn_glGetCoverageModulationTableNV fp_glGetCoverageModulationTableNV;\npfn_glCoverageModulationNV fp_glCoverageModulationNV;\npfn_glRenderbufferStorageMultisampleNV fp_glRenderbufferStorageMultisampleNV;\npfn_glRenderbufferStorageMultisampleCoverageNV fp_glRenderbufferStorageMultisampleCoverageNV;\npfn_glProgramVertexLimitNV fp_glProgramVertexLimitNV;\npfn_glFramebufferTextureFaceEXT fp_glFramebufferTextureFaceEXT;\npfn_glProgramLocalParameterI4iNV fp_glProgramLocalParameterI4iNV;\npfn_glProgramLocalParameterI4ivNV fp_glProgramLocalParameterI4ivNV;\npfn_glProgramLocalParametersI4ivNV fp_glProgramLocalParametersI4ivNV;\npfn_glProgramLocalParameterI4uiNV fp_glProgramLocalParameterI4uiNV;\npfn_glProgramLocalParameterI4uivNV fp_glProgramLocalParameterI4uivNV;\npfn_glProgramLocalParametersI4uivNV fp_glProgramLocalParametersI4uivNV;\npfn_glProgramEnvParameterI4iNV fp_glProgramEnvParameterI4iNV;\npfn_glProgramEnvParameterI4ivNV fp_glProgramEnvParameterI4ivNV;\npfn_glProgramEnvParametersI4ivNV fp_glProgramEnvParametersI4ivNV;\npfn_glProgramEnvParameterI4uiNV fp_glProgramEnvParameterI4uiNV;\npfn_glProgramEnvParameterI4uivNV fp_glProgramEnvParameterI4uivNV;\npfn_glProgramEnvParametersI4uivNV fp_glProgramEnvParametersI4uivNV;\npfn_glGetProgramLocalParameterIivNV fp_glGetProgramLocalParameterIivNV;\npfn_glGetProgramLocalParameterIuivNV fp_glGetProgramLocalParameterIuivNV;\npfn_glGetProgramEnvParameterIivNV fp_glGetProgramEnvParameterIivNV;\npfn_glGetProgramEnvParameterIuivNV fp_glGetProgramEnvParameterIuivNV;\npfn_glProgramSubroutineParametersuivNV fp_glProgramSubroutineParametersuivNV;\npfn_glGetProgramSubroutineParameteruivNV fp_glGetProgramSubroutineParameteruivNV;\npfn_glVertex2hNV fp_glVertex2hNV;\npfn_glVertex2hvNV fp_glVertex2hvNV;\npfn_glVertex3hNV fp_glVertex3hNV;\npfn_glVertex3hvNV fp_glVertex3hvNV;\npfn_glVertex4hNV fp_glVertex4hNV;\npfn_glVertex4hvNV fp_glVertex4hvNV;\npfn_glNormal3hNV fp_glNormal3hNV;\npfn_glNormal3hvNV fp_glNormal3hvNV;\npfn_glColor3hNV fp_glColor3hNV;\npfn_glColor3hvNV fp_glColor3hvNV;\npfn_glColor4hNV fp_glColor4hNV;\npfn_glColor4hvNV fp_glColor4hvNV;\npfn_glTexCoord1hNV fp_glTexCoord1hNV;\npfn_glTexCoord1hvNV fp_glTexCoord1hvNV;\npfn_glTexCoord2hNV fp_glTexCoord2hNV;\npfn_glTexCoord2hvNV fp_glTexCoord2hvNV;\npfn_glTexCoord3hNV fp_glTexCoord3hNV;\npfn_glTexCoord3hvNV fp_glTexCoord3hvNV;\npfn_glTexCoord4hNV fp_glTexCoord4hNV;\npfn_glTexCoord4hvNV fp_glTexCoord4hvNV;\npfn_glMultiTexCoord1hNV fp_glMultiTexCoord1hNV;\npfn_glMultiTexCoord1hvNV fp_glMultiTexCoord1hvNV;\npfn_glMultiTexCoord2hNV fp_glMultiTexCoord2hNV;\npfn_glMultiTexCoord2hvNV fp_glMultiTexCoord2hvNV;\npfn_glMultiTexCoord3hNV fp_glMultiTexCoord3hNV;\npfn_glMultiTexCoord3hvNV fp_glMultiTexCoord3hvNV;\npfn_glMultiTexCoord4hNV fp_glMultiTexCoord4hNV;\npfn_glMultiTexCoord4hvNV fp_glMultiTexCoord4hvNV;\npfn_glFogCoordhNV fp_glFogCoordhNV;\npfn_glFogCoordhvNV fp_glFogCoordhvNV;\npfn_glSecondaryColor3hNV fp_glSecondaryColor3hNV;\npfn_glSecondaryColor3hvNV fp_glSecondaryColor3hvNV;\npfn_glVertexWeighthNV fp_glVertexWeighthNV;\npfn_glVertexWeighthvNV fp_glVertexWeighthvNV;\npfn_glVertexAttrib1hNV fp_glVertexAttrib1hNV;\npfn_glVertexAttrib1hvNV fp_glVertexAttrib1hvNV;\npfn_glVertexAttrib2hNV fp_glVertexAttrib2hNV;\npfn_glVertexAttrib2hvNV fp_glVertexAttrib2hvNV;\npfn_glVertexAttrib3hNV fp_glVertexAttrib3hNV;\npfn_glVertexAttrib3hvNV fp_glVertexAttrib3hvNV;\npfn_glVertexAttrib4hNV fp_glVertexAttrib4hNV;\npfn_glVertexAttrib4hvNV fp_glVertexAttrib4hvNV;\npfn_glVertexAttribs1hvNV fp_glVertexAttribs1hvNV;\npfn_glVertexAttribs2hvNV fp_glVertexAttribs2hvNV;\npfn_glVertexAttribs3hvNV fp_glVertexAttribs3hvNV;\npfn_glVertexAttribs4hvNV fp_glVertexAttribs4hvNV;\npfn_glVertexAttribDivisorNV fp_glVertexAttribDivisorNV;\npfn_glGetInternalformatSampleivNV fp_glGetInternalformatSampleivNV;\npfn_glUniformMatrix2x3fvNV fp_glUniformMatrix2x3fvNV;\npfn_glUniformMatrix3x2fvNV fp_glUniformMatrix3x2fvNV;\npfn_glUniformMatrix2x4fvNV fp_glUniformMatrix2x4fvNV;\npfn_glUniformMatrix4x2fvNV fp_glUniformMatrix4x2fvNV;\npfn_glUniformMatrix3x4fvNV fp_glUniformMatrix3x4fvNV;\npfn_glUniformMatrix4x3fvNV fp_glUniformMatrix4x3fvNV;\npfn_glGenOcclusionQueriesNV fp_glGenOcclusionQueriesNV;\npfn_glDeleteOcclusionQueriesNV fp_glDeleteOcclusionQueriesNV;\npfn_glIsOcclusionQueryNV fp_glIsOcclusionQueryNV;\npfn_glBeginOcclusionQueryNV fp_glBeginOcclusionQueryNV;\npfn_glEndOcclusionQueryNV fp_glEndOcclusionQueryNV;\npfn_glGetOcclusionQueryivNV fp_glGetOcclusionQueryivNV;\npfn_glGetOcclusionQueryuivNV fp_glGetOcclusionQueryuivNV;\npfn_glProgramBufferParametersfvNV fp_glProgramBufferParametersfvNV;\npfn_glProgramBufferParametersIivNV fp_glProgramBufferParametersIivNV;\npfn_glProgramBufferParametersIuivNV fp_glProgramBufferParametersIuivNV;\npfn_glGenPathsNV fp_glGenPathsNV;\npfn_glDeletePathsNV fp_glDeletePathsNV;\npfn_glIsPathNV fp_glIsPathNV;\npfn_glPathCommandsNV fp_glPathCommandsNV;\npfn_glPathCoordsNV fp_glPathCoordsNV;\npfn_glPathSubCommandsNV fp_glPathSubCommandsNV;\npfn_glPathSubCoordsNV fp_glPathSubCoordsNV;\npfn_glPathStringNV fp_glPathStringNV;\npfn_glPathGlyphsNV fp_glPathGlyphsNV;\npfn_glPathGlyphRangeNV fp_glPathGlyphRangeNV;\npfn_glWeightPathsNV fp_glWeightPathsNV;\npfn_glCopyPathNV fp_glCopyPathNV;\npfn_glInterpolatePathsNV fp_glInterpolatePathsNV;\npfn_glTransformPathNV fp_glTransformPathNV;\npfn_glPathParameterivNV fp_glPathParameterivNV;\npfn_glPathParameteriNV fp_glPathParameteriNV;\npfn_glPathParameterfvNV fp_glPathParameterfvNV;\npfn_glPathParameterfNV fp_glPathParameterfNV;\npfn_glPathDashArrayNV fp_glPathDashArrayNV;\npfn_glPathStencilFuncNV fp_glPathStencilFuncNV;\npfn_glPathStencilDepthOffsetNV fp_glPathStencilDepthOffsetNV;\npfn_glStencilFillPathNV fp_glStencilFillPathNV;\npfn_glStencilStrokePathNV fp_glStencilStrokePathNV;\npfn_glStencilFillPathInstancedNV fp_glStencilFillPathInstancedNV;\npfn_glStencilStrokePathInstancedNV fp_glStencilStrokePathInstancedNV;\npfn_glPathCoverDepthFuncNV fp_glPathCoverDepthFuncNV;\npfn_glCoverFillPathNV fp_glCoverFillPathNV;\npfn_glCoverStrokePathNV fp_glCoverStrokePathNV;\npfn_glCoverFillPathInstancedNV fp_glCoverFillPathInstancedNV;\npfn_glCoverStrokePathInstancedNV fp_glCoverStrokePathInstancedNV;\npfn_glGetPathParameterivNV fp_glGetPathParameterivNV;\npfn_glGetPathParameterfvNV fp_glGetPathParameterfvNV;\npfn_glGetPathCommandsNV fp_glGetPathCommandsNV;\npfn_glGetPathCoordsNV fp_glGetPathCoordsNV;\npfn_glGetPathDashArrayNV fp_glGetPathDashArrayNV;\npfn_glGetPathMetricsNV fp_glGetPathMetricsNV;\npfn_glGetPathMetricRangeNV fp_glGetPathMetricRangeNV;\npfn_glGetPathSpacingNV fp_glGetPathSpacingNV;\npfn_glIsPointInFillPathNV fp_glIsPointInFillPathNV;\npfn_glIsPointInStrokePathNV fp_glIsPointInStrokePathNV;\npfn_glGetPathLengthNV fp_glGetPathLengthNV;\npfn_glPointAlongPathNV fp_glPointAlongPathNV;\npfn_glMatrixLoad3x2fNV fp_glMatrixLoad3x2fNV;\npfn_glMatrixLoad3x3fNV fp_glMatrixLoad3x3fNV;\npfn_glMatrixLoadTranspose3x3fNV fp_glMatrixLoadTranspose3x3fNV;\npfn_glMatrixMult3x2fNV fp_glMatrixMult3x2fNV;\npfn_glMatrixMult3x3fNV fp_glMatrixMult3x3fNV;\npfn_glMatrixMultTranspose3x3fNV fp_glMatrixMultTranspose3x3fNV;\npfn_glStencilThenCoverFillPathNV fp_glStencilThenCoverFillPathNV;\npfn_glStencilThenCoverStrokePathNV fp_glStencilThenCoverStrokePathNV;\npfn_glStencilThenCoverFillPathInstancedNV fp_glStencilThenCoverFillPathInstancedNV;\npfn_glStencilThenCoverStrokePathInstancedNV fp_glStencilThenCoverStrokePathInstancedNV;\npfn_glPathGlyphIndexRangeNV fp_glPathGlyphIndexRangeNV;\npfn_glPathGlyphIndexArrayNV fp_glPathGlyphIndexArrayNV;\npfn_glPathMemoryGlyphIndexArrayNV fp_glPathMemoryGlyphIndexArrayNV;\npfn_glProgramPathFragmentInputGenNV fp_glProgramPathFragmentInputGenNV;\npfn_glGetProgramResourcefvNV fp_glGetProgramResourcefvNV;\npfn_glPathColorGenNV fp_glPathColorGenNV;\npfn_glPathTexGenNV fp_glPathTexGenNV;\npfn_glPathFogGenNV fp_glPathFogGenNV;\npfn_glGetPathColorGenivNV fp_glGetPathColorGenivNV;\npfn_glGetPathColorGenfvNV fp_glGetPathColorGenfvNV;\npfn_glGetPathTexGenivNV fp_glGetPathTexGenivNV;\npfn_glGetPathTexGenfvNV fp_glGetPathTexGenfvNV;\npfn_glPolygonModeNV fp_glPolygonModeNV;\npfn_glPresentFrameKeyedNV fp_glPresentFrameKeyedNV;\npfn_glPresentFrameDualFillNV fp_glPresentFrameDualFillNV;\npfn_glGetVideoivNV fp_glGetVideoivNV;\npfn_glGetVideouivNV fp_glGetVideouivNV;\npfn_glGetVideoi64vNV fp_glGetVideoi64vNV;\npfn_glGetVideoui64vNV fp_glGetVideoui64vNV;\npfn_glPrimitiveRestartNV fp_glPrimitiveRestartNV;\npfn_glPrimitiveRestartIndexNV fp_glPrimitiveRestartIndexNV;\npfn_glReadBufferNV fp_glReadBufferNV;\npfn_glFramebufferSampleLocationsfvNV fp_glFramebufferSampleLocationsfvNV;\npfn_glNamedFramebufferSampleLocationsfvNV fp_glNamedFramebufferSampleLocationsfvNV;\npfn_glResolveDepthValuesNV fp_glResolveDepthValuesNV;\npfn_glMakeBufferResidentNV fp_glMakeBufferResidentNV;\npfn_glMakeBufferNonResidentNV fp_glMakeBufferNonResidentNV;\npfn_glIsBufferResidentNV fp_glIsBufferResidentNV;\npfn_glMakeNamedBufferResidentNV fp_glMakeNamedBufferResidentNV;\npfn_glMakeNamedBufferNonResidentNV fp_glMakeNamedBufferNonResidentNV;\npfn_glIsNamedBufferResidentNV fp_glIsNamedBufferResidentNV;\npfn_glGetBufferParameterui64vNV fp_glGetBufferParameterui64vNV;\npfn_glGetNamedBufferParameterui64vNV fp_glGetNamedBufferParameterui64vNV;\npfn_glGetIntegerui64vNV fp_glGetIntegerui64vNV;\npfn_glUniformui64NV fp_glUniformui64NV;\npfn_glUniformui64vNV fp_glUniformui64vNV;\npfn_glProgramUniformui64NV fp_glProgramUniformui64NV;\npfn_glProgramUniformui64vNV fp_glProgramUniformui64vNV;\npfn_glTextureBarrierNV fp_glTextureBarrierNV;\npfn_glTexImage2DMultisampleCoverageNV fp_glTexImage2DMultisampleCoverageNV;\npfn_glTexImage3DMultisampleCoverageNV fp_glTexImage3DMultisampleCoverageNV;\npfn_glTextureImage2DMultisampleNV fp_glTextureImage2DMultisampleNV;\npfn_glTextureImage3DMultisampleNV fp_glTextureImage3DMultisampleNV;\npfn_glTextureImage2DMultisampleCoverageNV fp_glTextureImage2DMultisampleCoverageNV;\npfn_glTextureImage3DMultisampleCoverageNV fp_glTextureImage3DMultisampleCoverageNV;\npfn_glBeginTransformFeedbackNV fp_glBeginTransformFeedbackNV;\npfn_glEndTransformFeedbackNV fp_glEndTransformFeedbackNV;\npfn_glTransformFeedbackAttribsNV fp_glTransformFeedbackAttribsNV;\npfn_glBindBufferRangeNV fp_glBindBufferRangeNV;\npfn_glBindBufferOffsetNV fp_glBindBufferOffsetNV;\npfn_glBindBufferBaseNV fp_glBindBufferBaseNV;\npfn_glTransformFeedbackVaryingsNV fp_glTransformFeedbackVaryingsNV;\npfn_glActiveVaryingNV fp_glActiveVaryingNV;\npfn_glGetVaryingLocationNV fp_glGetVaryingLocationNV;\npfn_glGetActiveVaryingNV fp_glGetActiveVaryingNV;\npfn_glGetTransformFeedbackVaryingNV fp_glGetTransformFeedbackVaryingNV;\npfn_glTransformFeedbackStreamAttribsNV fp_glTransformFeedbackStreamAttribsNV;\npfn_glBindTransformFeedbackNV fp_glBindTransformFeedbackNV;\npfn_glDeleteTransformFeedbacksNV fp_glDeleteTransformFeedbacksNV;\npfn_glGenTransformFeedbacksNV fp_glGenTransformFeedbacksNV;\npfn_glIsTransformFeedbackNV fp_glIsTransformFeedbackNV;\npfn_glPauseTransformFeedbackNV fp_glPauseTransformFeedbackNV;\npfn_glResumeTransformFeedbackNV fp_glResumeTransformFeedbackNV;\npfn_glDrawTransformFeedbackNV fp_glDrawTransformFeedbackNV;\npfn_glVDPAUInitNV fp_glVDPAUInitNV;\npfn_glVDPAUFiniNV fp_glVDPAUFiniNV;\npfn_glVDPAURegisterVideoSurfaceNV fp_glVDPAURegisterVideoSurfaceNV;\npfn_glVDPAURegisterOutputSurfaceNV fp_glVDPAURegisterOutputSurfaceNV;\npfn_glVDPAUIsSurfaceNV fp_glVDPAUIsSurfaceNV;\npfn_glVDPAUUnregisterSurfaceNV fp_glVDPAUUnregisterSurfaceNV;\npfn_glVDPAUGetSurfaceivNV fp_glVDPAUGetSurfaceivNV;\npfn_glVDPAUSurfaceAccessNV fp_glVDPAUSurfaceAccessNV;\npfn_glVDPAUMapSurfacesNV fp_glVDPAUMapSurfacesNV;\npfn_glVDPAUUnmapSurfacesNV fp_glVDPAUUnmapSurfacesNV;\npfn_glVertexAttribL1i64NV fp_glVertexAttribL1i64NV;\npfn_glVertexAttribL2i64NV fp_glVertexAttribL2i64NV;\npfn_glVertexAttribL3i64NV fp_glVertexAttribL3i64NV;\npfn_glVertexAttribL4i64NV fp_glVertexAttribL4i64NV;\npfn_glVertexAttribL1i64vNV fp_glVertexAttribL1i64vNV;\npfn_glVertexAttribL2i64vNV fp_glVertexAttribL2i64vNV;\npfn_glVertexAttribL3i64vNV fp_glVertexAttribL3i64vNV;\npfn_glVertexAttribL4i64vNV fp_glVertexAttribL4i64vNV;\npfn_glVertexAttribL1ui64NV fp_glVertexAttribL1ui64NV;\npfn_glVertexAttribL2ui64NV fp_glVertexAttribL2ui64NV;\npfn_glVertexAttribL3ui64NV fp_glVertexAttribL3ui64NV;\npfn_glVertexAttribL4ui64NV fp_glVertexAttribL4ui64NV;\npfn_glVertexAttribL1ui64vNV fp_glVertexAttribL1ui64vNV;\npfn_glVertexAttribL2ui64vNV fp_glVertexAttribL2ui64vNV;\npfn_glVertexAttribL3ui64vNV fp_glVertexAttribL3ui64vNV;\npfn_glVertexAttribL4ui64vNV fp_glVertexAttribL4ui64vNV;\npfn_glGetVertexAttribLi64vNV fp_glGetVertexAttribLi64vNV;\npfn_glGetVertexAttribLui64vNV fp_glGetVertexAttribLui64vNV;\npfn_glVertexAttribLFormatNV fp_glVertexAttribLFormatNV;\npfn_glBufferAddressRangeNV fp_glBufferAddressRangeNV;\npfn_glVertexFormatNV fp_glVertexFormatNV;\npfn_glNormalFormatNV fp_glNormalFormatNV;\npfn_glColorFormatNV fp_glColorFormatNV;\npfn_glIndexFormatNV fp_glIndexFormatNV;\npfn_glTexCoordFormatNV fp_glTexCoordFormatNV;\npfn_glEdgeFlagFormatNV fp_glEdgeFlagFormatNV;\npfn_glSecondaryColorFormatNV fp_glSecondaryColorFormatNV;\npfn_glFogCoordFormatNV fp_glFogCoordFormatNV;\npfn_glVertexAttribFormatNV fp_glVertexAttribFormatNV;\npfn_glVertexAttribIFormatNV fp_glVertexAttribIFormatNV;\npfn_glGetIntegerui64i_vNV fp_glGetIntegerui64i_vNV;\npfn_glVertexAttribI1iEXT fp_glVertexAttribI1iEXT;\npfn_glVertexAttribI2iEXT fp_glVertexAttribI2iEXT;\npfn_glVertexAttribI3iEXT fp_glVertexAttribI3iEXT;\npfn_glVertexAttribI4iEXT fp_glVertexAttribI4iEXT;\npfn_glVertexAttribI1uiEXT fp_glVertexAttribI1uiEXT;\npfn_glVertexAttribI2uiEXT fp_glVertexAttribI2uiEXT;\npfn_glVertexAttribI3uiEXT fp_glVertexAttribI3uiEXT;\npfn_glVertexAttribI4uiEXT fp_glVertexAttribI4uiEXT;\npfn_glVertexAttribI1ivEXT fp_glVertexAttribI1ivEXT;\npfn_glVertexAttribI2ivEXT fp_glVertexAttribI2ivEXT;\npfn_glVertexAttribI3ivEXT fp_glVertexAttribI3ivEXT;\npfn_glVertexAttribI4ivEXT fp_glVertexAttribI4ivEXT;\npfn_glVertexAttribI1uivEXT fp_glVertexAttribI1uivEXT;\npfn_glVertexAttribI2uivEXT fp_glVertexAttribI2uivEXT;\npfn_glVertexAttribI3uivEXT fp_glVertexAttribI3uivEXT;\npfn_glVertexAttribI4uivEXT fp_glVertexAttribI4uivEXT;\npfn_glVertexAttribI4bvEXT fp_glVertexAttribI4bvEXT;\npfn_glVertexAttribI4svEXT fp_glVertexAttribI4svEXT;\npfn_glVertexAttribI4ubvEXT fp_glVertexAttribI4ubvEXT;\npfn_glVertexAttribI4usvEXT fp_glVertexAttribI4usvEXT;\npfn_glVertexAttribIPointerEXT fp_glVertexAttribIPointerEXT;\npfn_glGetVertexAttribIivEXT fp_glGetVertexAttribIivEXT;\npfn_glGetVertexAttribIuivEXT fp_glGetVertexAttribIuivEXT;\npfn_glBeginVideoCaptureNV fp_glBeginVideoCaptureNV;\npfn_glBindVideoCaptureStreamBufferNV fp_glBindVideoCaptureStreamBufferNV;\npfn_glBindVideoCaptureStreamTextureNV fp_glBindVideoCaptureStreamTextureNV;\npfn_glEndVideoCaptureNV fp_glEndVideoCaptureNV;\npfn_glGetVideoCaptureivNV fp_glGetVideoCaptureivNV;\npfn_glGetVideoCaptureStreamivNV fp_glGetVideoCaptureStreamivNV;\npfn_glGetVideoCaptureStreamfvNV fp_glGetVideoCaptureStreamfvNV;\npfn_glGetVideoCaptureStreamdvNV fp_glGetVideoCaptureStreamdvNV;\npfn_glVideoCaptureNV fp_glVideoCaptureNV;\npfn_glVideoCaptureStreamParameterivNV fp_glVideoCaptureStreamParameterivNV;\npfn_glVideoCaptureStreamParameterfvNV fp_glVideoCaptureStreamParameterfvNV;\npfn_glVideoCaptureStreamParameterdvNV fp_glVideoCaptureStreamParameterdvNV;\npfn_glViewportArrayvNV fp_glViewportArrayvNV;\npfn_glViewportIndexedfNV fp_glViewportIndexedfNV;\npfn_glViewportIndexedfvNV fp_glViewportIndexedfvNV;\npfn_glScissorArrayvNV fp_glScissorArrayvNV;\npfn_glScissorIndexedNV fp_glScissorIndexedNV;\npfn_glScissorIndexedvNV fp_glScissorIndexedvNV;\npfn_glDepthRangeArrayfvNV fp_glDepthRangeArrayfvNV;\npfn_glDepthRangeIndexedfNV fp_glDepthRangeIndexedfNV;\npfn_glGetFloati_vNV fp_glGetFloati_vNV;\npfn_glEnableiNV fp_glEnableiNV;\npfn_glDisableiNV fp_glDisableiNV;\npfn_glIsEnablediNV fp_glIsEnablediNV;\npfn_glBeginConditionalRenderNVX fp_glBeginConditionalRenderNVX;\npfn_glEndConditionalRenderNVX fp_glEndConditionalRenderNVX;\npfn_glFramebufferTextureMultiviewOVR fp_glFramebufferTextureMultiviewOVR;\npfn_glFramebufferTextureMultisampleMultiviewOVR fp_glFramebufferTextureMultisampleMultiviewOVR;\npfn_glAlphaFuncQCOM fp_glAlphaFuncQCOM;\npfn_glGetDriverControlsQCOM fp_glGetDriverControlsQCOM;\npfn_glGetDriverControlStringQCOM fp_glGetDriverControlStringQCOM;\npfn_glEnableDriverControlQCOM fp_glEnableDriverControlQCOM;\npfn_glDisableDriverControlQCOM fp_glDisableDriverControlQCOM;\npfn_glExtGetTexturesQCOM fp_glExtGetTexturesQCOM;\npfn_glExtGetBuffersQCOM fp_glExtGetBuffersQCOM;\npfn_glExtGetRenderbuffersQCOM fp_glExtGetRenderbuffersQCOM;\npfn_glExtGetFramebuffersQCOM fp_glExtGetFramebuffersQCOM;\npfn_glExtGetTexLevelParameterivQCOM fp_glExtGetTexLevelParameterivQCOM;\npfn_glExtTexObjectStateOverrideiQCOM fp_glExtTexObjectStateOverrideiQCOM;\npfn_glExtGetTexSubImageQCOM fp_glExtGetTexSubImageQCOM;\npfn_glExtGetBufferPointervQCOM fp_glExtGetBufferPointervQCOM;\npfn_glExtGetShadersQCOM fp_glExtGetShadersQCOM;\npfn_glExtGetProgramsQCOM fp_glExtGetProgramsQCOM;\npfn_glExtIsProgramBinaryQCOM fp_glExtIsProgramBinaryQCOM;\npfn_glExtGetProgramBinarySourceQCOM fp_glExtGetProgramBinarySourceQCOM;\npfn_glStartTilingQCOM fp_glStartTilingQCOM;\npfn_glEndTilingQCOM fp_glEndTilingQCOM;\n\nGLboolean GLAD_VERSION_1_0 = GL_FALSE;\nstatic void load_GL_VERSION_1_0(LOADER load) {\n\tif(!GLAD_VERSION_1_0) return;\n\tfp_glCullFace = (pfn_glCullFace)load(\"glCullFace\");\n\tfp_glFrontFace = (pfn_glFrontFace)load(\"glFrontFace\");\n\tfp_glHint = (pfn_glHint)load(\"glHint\");\n\tfp_glLineWidth = (pfn_glLineWidth)load(\"glLineWidth\");\n\tfp_glPointSize = (pfn_glPointSize)load(\"glPointSize\");\n\tfp_glPolygonMode = (pfn_glPolygonMode)load(\"glPolygonMode\");\n\tfp_glScissor = (pfn_glScissor)load(\"glScissor\");\n\tfp_glTexParameterf = (pfn_glTexParameterf)load(\"glTexParameterf\");\n\tfp_glTexParameterfv = (pfn_glTexParameterfv)load(\"glTexParameterfv\");\n\tfp_glTexParameteri = (pfn_glTexParameteri)load(\"glTexParameteri\");\n\tfp_glTexParameteriv = (pfn_glTexParameteriv)load(\"glTexParameteriv\");\n\tfp_glTexImage1D = (pfn_glTexImage1D)load(\"glTexImage1D\");\n\tfp_glTexImage2D = (pfn_glTexImage2D)load(\"glTexImage2D\");\n\tfp_glDrawBuffer = (pfn_glDrawBuffer)load(\"glDrawBuffer\");\n\tfp_glClear = (pfn_glClear)load(\"glClear\");\n\tfp_glClearColor = (pfn_glClearColor)load(\"glClearColor\");\n\tfp_glClearStencil = (pfn_glClearStencil)load(\"glClearStencil\");\n\tfp_glClearDepth = (pfn_glClearDepth)load(\"glClearDepth\");\n\tfp_glStencilMask = (pfn_glStencilMask)load(\"glStencilMask\");\n\tfp_glColorMask = (pfn_glColorMask)load(\"glColorMask\");\n\tfp_glDepthMask = (pfn_glDepthMask)load(\"glDepthMask\");\n\tfp_glDisable = (pfn_glDisable)load(\"glDisable\");\n\tfp_glEnable = (pfn_glEnable)load(\"glEnable\");\n\tfp_glFinish = (pfn_glFinish)load(\"glFinish\");\n\tfp_glFlush = (pfn_glFlush)load(\"glFlush\");\n\tfp_glBlendFunc = (pfn_glBlendFunc)load(\"glBlendFunc\");\n\tfp_glLogicOp = (pfn_glLogicOp)load(\"glLogicOp\");\n\tfp_glStencilFunc = (pfn_glStencilFunc)load(\"glStencilFunc\");\n\tfp_glStencilOp = (pfn_glStencilOp)load(\"glStencilOp\");\n\tfp_glDepthFunc = (pfn_glDepthFunc)load(\"glDepthFunc\");\n\tfp_glPixelStoref = (pfn_glPixelStoref)load(\"glPixelStoref\");\n\tfp_glPixelStorei = (pfn_glPixelStorei)load(\"glPixelStorei\");\n\tfp_glReadBuffer = (pfn_glReadBuffer)load(\"glReadBuffer\");\n\tfp_glReadPixels = (pfn_glReadPixels)load(\"glReadPixels\");\n\tfp_glGetBooleanv = (pfn_glGetBooleanv)load(\"glGetBooleanv\");\n\tfp_glGetDoublev = (pfn_glGetDoublev)load(\"glGetDoublev\");\n\tfp_glGetError = (pfn_glGetError)load(\"glGetError\");\n\tfp_glGetFloatv = (pfn_glGetFloatv)load(\"glGetFloatv\");\n\tfp_glGetIntegerv = (pfn_glGetIntegerv)load(\"glGetIntegerv\");\n\tfp_glGetString = (pfn_glGetString)load(\"glGetString\");\n\tfp_glGetTexImage = (pfn_glGetTexImage)load(\"glGetTexImage\");\n\tfp_glGetTexParameterfv = (pfn_glGetTexParameterfv)load(\"glGetTexParameterfv\");\n\tfp_glGetTexParameteriv = (pfn_glGetTexParameteriv)load(\"glGetTexParameteriv\");\n\tfp_glGetTexLevelParameterfv = (pfn_glGetTexLevelParameterfv)load(\"glGetTexLevelParameterfv\");\n\tfp_glGetTexLevelParameteriv = (pfn_glGetTexLevelParameteriv)load(\"glGetTexLevelParameteriv\");\n\tfp_glIsEnabled = (pfn_glIsEnabled)load(\"glIsEnabled\");\n\tfp_glDepthRange = (pfn_glDepthRange)load(\"glDepthRange\");\n\tfp_glViewport = (pfn_glViewport)load(\"glViewport\");\n\tfp_glNewList = (pfn_glNewList)load(\"glNewList\");\n\tfp_glEndList = (pfn_glEndList)load(\"glEndList\");\n\tfp_glCallList = (pfn_glCallList)load(\"glCallList\");\n\tfp_glCallLists = (pfn_glCallLists)load(\"glCallLists\");\n\tfp_glDeleteLists = (pfn_glDeleteLists)load(\"glDeleteLists\");\n\tfp_glGenLists = (pfn_glGenLists)load(\"glGenLists\");\n\tfp_glListBase = (pfn_glListBase)load(\"glListBase\");\n\tfp_glBegin = (pfn_glBegin)load(\"glBegin\");\n\tfp_glBitmap = (pfn_glBitmap)load(\"glBitmap\");\n\tfp_glColor3b = (pfn_glColor3b)load(\"glColor3b\");\n\tfp_glColor3bv = (pfn_glColor3bv)load(\"glColor3bv\");\n\tfp_glColor3d = (pfn_glColor3d)load(\"glColor3d\");\n\tfp_glColor3dv = (pfn_glColor3dv)load(\"glColor3dv\");\n\tfp_glColor3f = (pfn_glColor3f)load(\"glColor3f\");\n\tfp_glColor3fv = (pfn_glColor3fv)load(\"glColor3fv\");\n\tfp_glColor3i = (pfn_glColor3i)load(\"glColor3i\");\n\tfp_glColor3iv = (pfn_glColor3iv)load(\"glColor3iv\");\n\tfp_glColor3s = (pfn_glColor3s)load(\"glColor3s\");\n\tfp_glColor3sv = (pfn_glColor3sv)load(\"glColor3sv\");\n\tfp_glColor3ub = (pfn_glColor3ub)load(\"glColor3ub\");\n\tfp_glColor3ubv = (pfn_glColor3ubv)load(\"glColor3ubv\");\n\tfp_glColor3ui = (pfn_glColor3ui)load(\"glColor3ui\");\n\tfp_glColor3uiv = (pfn_glColor3uiv)load(\"glColor3uiv\");\n\tfp_glColor3us = (pfn_glColor3us)load(\"glColor3us\");\n\tfp_glColor3usv = (pfn_glColor3usv)load(\"glColor3usv\");\n\tfp_glColor4b = (pfn_glColor4b)load(\"glColor4b\");\n\tfp_glColor4bv = (pfn_glColor4bv)load(\"glColor4bv\");\n\tfp_glColor4d = (pfn_glColor4d)load(\"glColor4d\");\n\tfp_glColor4dv = (pfn_glColor4dv)load(\"glColor4dv\");\n\tfp_glColor4f = (pfn_glColor4f)load(\"glColor4f\");\n\tfp_glColor4fv = (pfn_glColor4fv)load(\"glColor4fv\");\n\tfp_glColor4i = (pfn_glColor4i)load(\"glColor4i\");\n\tfp_glColor4iv = (pfn_glColor4iv)load(\"glColor4iv\");\n\tfp_glColor4s = (pfn_glColor4s)load(\"glColor4s\");\n\tfp_glColor4sv = (pfn_glColor4sv)load(\"glColor4sv\");\n\tfp_glColor4ub = (pfn_glColor4ub)load(\"glColor4ub\");\n\tfp_glColor4ubv = (pfn_glColor4ubv)load(\"glColor4ubv\");\n\tfp_glColor4ui = (pfn_glColor4ui)load(\"glColor4ui\");\n\tfp_glColor4uiv = (pfn_glColor4uiv)load(\"glColor4uiv\");\n\tfp_glColor4us = (pfn_glColor4us)load(\"glColor4us\");\n\tfp_glColor4usv = (pfn_glColor4usv)load(\"glColor4usv\");\n\tfp_glEdgeFlag = (pfn_glEdgeFlag)load(\"glEdgeFlag\");\n\tfp_glEdgeFlagv = (pfn_glEdgeFlagv)load(\"glEdgeFlagv\");\n\tfp_glEnd = (pfn_glEnd)load(\"glEnd\");\n\tfp_glIndexd = (pfn_glIndexd)load(\"glIndexd\");\n\tfp_glIndexdv = (pfn_glIndexdv)load(\"glIndexdv\");\n\tfp_glIndexf = (pfn_glIndexf)load(\"glIndexf\");\n\tfp_glIndexfv = (pfn_glIndexfv)load(\"glIndexfv\");\n\tfp_glIndexi = (pfn_glIndexi)load(\"glIndexi\");\n\tfp_glIndexiv = (pfn_glIndexiv)load(\"glIndexiv\");\n\tfp_glIndexs = (pfn_glIndexs)load(\"glIndexs\");\n\tfp_glIndexsv = (pfn_glIndexsv)load(\"glIndexsv\");\n\tfp_glNormal3b = (pfn_glNormal3b)load(\"glNormal3b\");\n\tfp_glNormal3bv = (pfn_glNormal3bv)load(\"glNormal3bv\");\n\tfp_glNormal3d = (pfn_glNormal3d)load(\"glNormal3d\");\n\tfp_glNormal3dv = (pfn_glNormal3dv)load(\"glNormal3dv\");\n\tfp_glNormal3f = (pfn_glNormal3f)load(\"glNormal3f\");\n\tfp_glNormal3fv = (pfn_glNormal3fv)load(\"glNormal3fv\");\n\tfp_glNormal3i = (pfn_glNormal3i)load(\"glNormal3i\");\n\tfp_glNormal3iv = (pfn_glNormal3iv)load(\"glNormal3iv\");\n\tfp_glNormal3s = (pfn_glNormal3s)load(\"glNormal3s\");\n\tfp_glNormal3sv = (pfn_glNormal3sv)load(\"glNormal3sv\");\n\tfp_glRasterPos2d = (pfn_glRasterPos2d)load(\"glRasterPos2d\");\n\tfp_glRasterPos2dv = (pfn_glRasterPos2dv)load(\"glRasterPos2dv\");\n\tfp_glRasterPos2f = (pfn_glRasterPos2f)load(\"glRasterPos2f\");\n\tfp_glRasterPos2fv = (pfn_glRasterPos2fv)load(\"glRasterPos2fv\");\n\tfp_glRasterPos2i = (pfn_glRasterPos2i)load(\"glRasterPos2i\");\n\tfp_glRasterPos2iv = (pfn_glRasterPos2iv)load(\"glRasterPos2iv\");\n\tfp_glRasterPos2s = (pfn_glRasterPos2s)load(\"glRasterPos2s\");\n\tfp_glRasterPos2sv = (pfn_glRasterPos2sv)load(\"glRasterPos2sv\");\n\tfp_glRasterPos3d = (pfn_glRasterPos3d)load(\"glRasterPos3d\");\n\tfp_glRasterPos3dv = (pfn_glRasterPos3dv)load(\"glRasterPos3dv\");\n\tfp_glRasterPos3f = (pfn_glRasterPos3f)load(\"glRasterPos3f\");\n\tfp_glRasterPos3fv = (pfn_glRasterPos3fv)load(\"glRasterPos3fv\");\n\tfp_glRasterPos3i = (pfn_glRasterPos3i)load(\"glRasterPos3i\");\n\tfp_glRasterPos3iv = (pfn_glRasterPos3iv)load(\"glRasterPos3iv\");\n\tfp_glRasterPos3s = (pfn_glRasterPos3s)load(\"glRasterPos3s\");\n\tfp_glRasterPos3sv = (pfn_glRasterPos3sv)load(\"glRasterPos3sv\");\n\tfp_glRasterPos4d = (pfn_glRasterPos4d)load(\"glRasterPos4d\");\n\tfp_glRasterPos4dv = (pfn_glRasterPos4dv)load(\"glRasterPos4dv\");\n\tfp_glRasterPos4f = (pfn_glRasterPos4f)load(\"glRasterPos4f\");\n\tfp_glRasterPos4fv = (pfn_glRasterPos4fv)load(\"glRasterPos4fv\");\n\tfp_glRasterPos4i = (pfn_glRasterPos4i)load(\"glRasterPos4i\");\n\tfp_glRasterPos4iv = (pfn_glRasterPos4iv)load(\"glRasterPos4iv\");\n\tfp_glRasterPos4s = (pfn_glRasterPos4s)load(\"glRasterPos4s\");\n\tfp_glRasterPos4sv = (pfn_glRasterPos4sv)load(\"glRasterPos4sv\");\n\tfp_glRectd = (pfn_glRectd)load(\"glRectd\");\n\tfp_glRectdv = (pfn_glRectdv)load(\"glRectdv\");\n\tfp_glRectf = (pfn_glRectf)load(\"glRectf\");\n\tfp_glRectfv = (pfn_glRectfv)load(\"glRectfv\");\n\tfp_glRecti = (pfn_glRecti)load(\"glRecti\");\n\tfp_glRectiv = (pfn_glRectiv)load(\"glRectiv\");\n\tfp_glRects = (pfn_glRects)load(\"glRects\");\n\tfp_glRectsv = (pfn_glRectsv)load(\"glRectsv\");\n\tfp_glTexCoord1d = (pfn_glTexCoord1d)load(\"glTexCoord1d\");\n\tfp_glTexCoord1dv = (pfn_glTexCoord1dv)load(\"glTexCoord1dv\");\n\tfp_glTexCoord1f = (pfn_glTexCoord1f)load(\"glTexCoord1f\");\n\tfp_glTexCoord1fv = (pfn_glTexCoord1fv)load(\"glTexCoord1fv\");\n\tfp_glTexCoord1i = (pfn_glTexCoord1i)load(\"glTexCoord1i\");\n\tfp_glTexCoord1iv = (pfn_glTexCoord1iv)load(\"glTexCoord1iv\");\n\tfp_glTexCoord1s = (pfn_glTexCoord1s)load(\"glTexCoord1s\");\n\tfp_glTexCoord1sv = (pfn_glTexCoord1sv)load(\"glTexCoord1sv\");\n\tfp_glTexCoord2d = (pfn_glTexCoord2d)load(\"glTexCoord2d\");\n\tfp_glTexCoord2dv = (pfn_glTexCoord2dv)load(\"glTexCoord2dv\");\n\tfp_glTexCoord2f = (pfn_glTexCoord2f)load(\"glTexCoord2f\");\n\tfp_glTexCoord2fv = (pfn_glTexCoord2fv)load(\"glTexCoord2fv\");\n\tfp_glTexCoord2i = (pfn_glTexCoord2i)load(\"glTexCoord2i\");\n\tfp_glTexCoord2iv = (pfn_glTexCoord2iv)load(\"glTexCoord2iv\");\n\tfp_glTexCoord2s = (pfn_glTexCoord2s)load(\"glTexCoord2s\");\n\tfp_glTexCoord2sv = (pfn_glTexCoord2sv)load(\"glTexCoord2sv\");\n\tfp_glTexCoord3d = (pfn_glTexCoord3d)load(\"glTexCoord3d\");\n\tfp_glTexCoord3dv = (pfn_glTexCoord3dv)load(\"glTexCoord3dv\");\n\tfp_glTexCoord3f = (pfn_glTexCoord3f)load(\"glTexCoord3f\");\n\tfp_glTexCoord3fv = (pfn_glTexCoord3fv)load(\"glTexCoord3fv\");\n\tfp_glTexCoord3i = (pfn_glTexCoord3i)load(\"glTexCoord3i\");\n\tfp_glTexCoord3iv = (pfn_glTexCoord3iv)load(\"glTexCoord3iv\");\n\tfp_glTexCoord3s = (pfn_glTexCoord3s)load(\"glTexCoord3s\");\n\tfp_glTexCoord3sv = (pfn_glTexCoord3sv)load(\"glTexCoord3sv\");\n\tfp_glTexCoord4d = (pfn_glTexCoord4d)load(\"glTexCoord4d\");\n\tfp_glTexCoord4dv = (pfn_glTexCoord4dv)load(\"glTexCoord4dv\");\n\tfp_glTexCoord4f = (pfn_glTexCoord4f)load(\"glTexCoord4f\");\n\tfp_glTexCoord4fv = (pfn_glTexCoord4fv)load(\"glTexCoord4fv\");\n\tfp_glTexCoord4i = (pfn_glTexCoord4i)load(\"glTexCoord4i\");\n\tfp_glTexCoord4iv = (pfn_glTexCoord4iv)load(\"glTexCoord4iv\");\n\tfp_glTexCoord4s = (pfn_glTexCoord4s)load(\"glTexCoord4s\");\n\tfp_glTexCoord4sv = (pfn_glTexCoord4sv)load(\"glTexCoord4sv\");\n\tfp_glVertex2d = (pfn_glVertex2d)load(\"glVertex2d\");\n\tfp_glVertex2dv = (pfn_glVertex2dv)load(\"glVertex2dv\");\n\tfp_glVertex2f = (pfn_glVertex2f)load(\"glVertex2f\");\n\tfp_glVertex2fv = (pfn_glVertex2fv)load(\"glVertex2fv\");\n\tfp_glVertex2i = (pfn_glVertex2i)load(\"glVertex2i\");\n\tfp_glVertex2iv = (pfn_glVertex2iv)load(\"glVertex2iv\");\n\tfp_glVertex2s = (pfn_glVertex2s)load(\"glVertex2s\");\n\tfp_glVertex2sv = (pfn_glVertex2sv)load(\"glVertex2sv\");\n\tfp_glVertex3d = (pfn_glVertex3d)load(\"glVertex3d\");\n\tfp_glVertex3dv = (pfn_glVertex3dv)load(\"glVertex3dv\");\n\tfp_glVertex3f = (pfn_glVertex3f)load(\"glVertex3f\");\n\tfp_glVertex3fv = (pfn_glVertex3fv)load(\"glVertex3fv\");\n\tfp_glVertex3i = (pfn_glVertex3i)load(\"glVertex3i\");\n\tfp_glVertex3iv = (pfn_glVertex3iv)load(\"glVertex3iv\");\n\tfp_glVertex3s = (pfn_glVertex3s)load(\"glVertex3s\");\n\tfp_glVertex3sv = (pfn_glVertex3sv)load(\"glVertex3sv\");\n\tfp_glVertex4d = (pfn_glVertex4d)load(\"glVertex4d\");\n\tfp_glVertex4dv = (pfn_glVertex4dv)load(\"glVertex4dv\");\n\tfp_glVertex4f = (pfn_glVertex4f)load(\"glVertex4f\");\n\tfp_glVertex4fv = (pfn_glVertex4fv)load(\"glVertex4fv\");\n\tfp_glVertex4i = (pfn_glVertex4i)load(\"glVertex4i\");\n\tfp_glVertex4iv = (pfn_glVertex4iv)load(\"glVertex4iv\");\n\tfp_glVertex4s = (pfn_glVertex4s)load(\"glVertex4s\");\n\tfp_glVertex4sv = (pfn_glVertex4sv)load(\"glVertex4sv\");\n\tfp_glClipPlane = (pfn_glClipPlane)load(\"glClipPlane\");\n\tfp_glColorMaterial = (pfn_glColorMaterial)load(\"glColorMaterial\");\n\tfp_glFogf = (pfn_glFogf)load(\"glFogf\");\n\tfp_glFogfv = (pfn_glFogfv)load(\"glFogfv\");\n\tfp_glFogi = (pfn_glFogi)load(\"glFogi\");\n\tfp_glFogiv = (pfn_glFogiv)load(\"glFogiv\");\n\tfp_glLightf = (pfn_glLightf)load(\"glLightf\");\n\tfp_glLightfv = (pfn_glLightfv)load(\"glLightfv\");\n\tfp_glLighti = (pfn_glLighti)load(\"glLighti\");\n\tfp_glLightiv = (pfn_glLightiv)load(\"glLightiv\");\n\tfp_glLightModelf = (pfn_glLightModelf)load(\"glLightModelf\");\n\tfp_glLightModelfv = (pfn_glLightModelfv)load(\"glLightModelfv\");\n\tfp_glLightModeli = (pfn_glLightModeli)load(\"glLightModeli\");\n\tfp_glLightModeliv = (pfn_glLightModeliv)load(\"glLightModeliv\");\n\tfp_glLineStipple = (pfn_glLineStipple)load(\"glLineStipple\");\n\tfp_glMaterialf = (pfn_glMaterialf)load(\"glMaterialf\");\n\tfp_glMaterialfv = (pfn_glMaterialfv)load(\"glMaterialfv\");\n\tfp_glMateriali = (pfn_glMateriali)load(\"glMateriali\");\n\tfp_glMaterialiv = (pfn_glMaterialiv)load(\"glMaterialiv\");\n\tfp_glPolygonStipple = (pfn_glPolygonStipple)load(\"glPolygonStipple\");\n\tfp_glShadeModel = (pfn_glShadeModel)load(\"glShadeModel\");\n\tfp_glTexEnvf = (pfn_glTexEnvf)load(\"glTexEnvf\");\n\tfp_glTexEnvfv = (pfn_glTexEnvfv)load(\"glTexEnvfv\");\n\tfp_glTexEnvi = (pfn_glTexEnvi)load(\"glTexEnvi\");\n\tfp_glTexEnviv = (pfn_glTexEnviv)load(\"glTexEnviv\");\n\tfp_glTexGend = (pfn_glTexGend)load(\"glTexGend\");\n\tfp_glTexGendv = (pfn_glTexGendv)load(\"glTexGendv\");\n\tfp_glTexGenf = (pfn_glTexGenf)load(\"glTexGenf\");\n\tfp_glTexGenfv = (pfn_glTexGenfv)load(\"glTexGenfv\");\n\tfp_glTexGeni = (pfn_glTexGeni)load(\"glTexGeni\");\n\tfp_glTexGeniv = (pfn_glTexGeniv)load(\"glTexGeniv\");\n\tfp_glFeedbackBuffer = (pfn_glFeedbackBuffer)load(\"glFeedbackBuffer\");\n\tfp_glSelectBuffer = (pfn_glSelectBuffer)load(\"glSelectBuffer\");\n\tfp_glRenderMode = (pfn_glRenderMode)load(\"glRenderMode\");\n\tfp_glInitNames = (pfn_glInitNames)load(\"glInitNames\");\n\tfp_glLoadName = (pfn_glLoadName)load(\"glLoadName\");\n\tfp_glPassThrough = (pfn_glPassThrough)load(\"glPassThrough\");\n\tfp_glPopName = (pfn_glPopName)load(\"glPopName\");\n\tfp_glPushName = (pfn_glPushName)load(\"glPushName\");\n\tfp_glClearAccum = (pfn_glClearAccum)load(\"glClearAccum\");\n\tfp_glClearIndex = (pfn_glClearIndex)load(\"glClearIndex\");\n\tfp_glIndexMask = (pfn_glIndexMask)load(\"glIndexMask\");\n\tfp_glAccum = (pfn_glAccum)load(\"glAccum\");\n\tfp_glPopAttrib = (pfn_glPopAttrib)load(\"glPopAttrib\");\n\tfp_glPushAttrib = (pfn_glPushAttrib)load(\"glPushAttrib\");\n\tfp_glMap1d = (pfn_glMap1d)load(\"glMap1d\");\n\tfp_glMap1f = (pfn_glMap1f)load(\"glMap1f\");\n\tfp_glMap2d = (pfn_glMap2d)load(\"glMap2d\");\n\tfp_glMap2f = (pfn_glMap2f)load(\"glMap2f\");\n\tfp_glMapGrid1d = (pfn_glMapGrid1d)load(\"glMapGrid1d\");\n\tfp_glMapGrid1f = (pfn_glMapGrid1f)load(\"glMapGrid1f\");\n\tfp_glMapGrid2d = (pfn_glMapGrid2d)load(\"glMapGrid2d\");\n\tfp_glMapGrid2f = (pfn_glMapGrid2f)load(\"glMapGrid2f\");\n\tfp_glEvalCoord1d = (pfn_glEvalCoord1d)load(\"glEvalCoord1d\");\n\tfp_glEvalCoord1dv = (pfn_glEvalCoord1dv)load(\"glEvalCoord1dv\");\n\tfp_glEvalCoord1f = (pfn_glEvalCoord1f)load(\"glEvalCoord1f\");\n\tfp_glEvalCoord1fv = (pfn_glEvalCoord1fv)load(\"glEvalCoord1fv\");\n\tfp_glEvalCoord2d = (pfn_glEvalCoord2d)load(\"glEvalCoord2d\");\n\tfp_glEvalCoord2dv = (pfn_glEvalCoord2dv)load(\"glEvalCoord2dv\");\n\tfp_glEvalCoord2f = (pfn_glEvalCoord2f)load(\"glEvalCoord2f\");\n\tfp_glEvalCoord2fv = (pfn_glEvalCoord2fv)load(\"glEvalCoord2fv\");\n\tfp_glEvalMesh1 = (pfn_glEvalMesh1)load(\"glEvalMesh1\");\n\tfp_glEvalPoint1 = (pfn_glEvalPoint1)load(\"glEvalPoint1\");\n\tfp_glEvalMesh2 = (pfn_glEvalMesh2)load(\"glEvalMesh2\");\n\tfp_glEvalPoint2 = (pfn_glEvalPoint2)load(\"glEvalPoint2\");\n\tfp_glAlphaFunc = (pfn_glAlphaFunc)load(\"glAlphaFunc\");\n\tfp_glPixelZoom = (pfn_glPixelZoom)load(\"glPixelZoom\");\n\tfp_glPixelTransferf = (pfn_glPixelTransferf)load(\"glPixelTransferf\");\n\tfp_glPixelTransferi = (pfn_glPixelTransferi)load(\"glPixelTransferi\");\n\tfp_glPixelMapfv = (pfn_glPixelMapfv)load(\"glPixelMapfv\");\n\tfp_glPixelMapuiv = (pfn_glPixelMapuiv)load(\"glPixelMapuiv\");\n\tfp_glPixelMapusv = (pfn_glPixelMapusv)load(\"glPixelMapusv\");\n\tfp_glCopyPixels = (pfn_glCopyPixels)load(\"glCopyPixels\");\n\tfp_glDrawPixels = (pfn_glDrawPixels)load(\"glDrawPixels\");\n\tfp_glGetClipPlane = (pfn_glGetClipPlane)load(\"glGetClipPlane\");\n\tfp_glGetLightfv = (pfn_glGetLightfv)load(\"glGetLightfv\");\n\tfp_glGetLightiv = (pfn_glGetLightiv)load(\"glGetLightiv\");\n\tfp_glGetMapdv = (pfn_glGetMapdv)load(\"glGetMapdv\");\n\tfp_glGetMapfv = (pfn_glGetMapfv)load(\"glGetMapfv\");\n\tfp_glGetMapiv = (pfn_glGetMapiv)load(\"glGetMapiv\");\n\tfp_glGetMaterialfv = (pfn_glGetMaterialfv)load(\"glGetMaterialfv\");\n\tfp_glGetMaterialiv = (pfn_glGetMaterialiv)load(\"glGetMaterialiv\");\n\tfp_glGetPixelMapfv = (pfn_glGetPixelMapfv)load(\"glGetPixelMapfv\");\n\tfp_glGetPixelMapuiv = (pfn_glGetPixelMapuiv)load(\"glGetPixelMapuiv\");\n\tfp_glGetPixelMapusv = (pfn_glGetPixelMapusv)load(\"glGetPixelMapusv\");\n\tfp_glGetPolygonStipple = (pfn_glGetPolygonStipple)load(\"glGetPolygonStipple\");\n\tfp_glGetTexEnvfv = (pfn_glGetTexEnvfv)load(\"glGetTexEnvfv\");\n\tfp_glGetTexEnviv = (pfn_glGetTexEnviv)load(\"glGetTexEnviv\");\n\tfp_glGetTexGendv = (pfn_glGetTexGendv)load(\"glGetTexGendv\");\n\tfp_glGetTexGenfv = (pfn_glGetTexGenfv)load(\"glGetTexGenfv\");\n\tfp_glGetTexGeniv = (pfn_glGetTexGeniv)load(\"glGetTexGeniv\");\n\tfp_glIsList = (pfn_glIsList)load(\"glIsList\");\n\tfp_glFrustum = (pfn_glFrustum)load(\"glFrustum\");\n\tfp_glLoadIdentity = (pfn_glLoadIdentity)load(\"glLoadIdentity\");\n\tfp_glLoadMatrixf = (pfn_glLoadMatrixf)load(\"glLoadMatrixf\");\n\tfp_glLoadMatrixd = (pfn_glLoadMatrixd)load(\"glLoadMatrixd\");\n\tfp_glMatrixMode = (pfn_glMatrixMode)load(\"glMatrixMode\");\n\tfp_glMultMatrixf = (pfn_glMultMatrixf)load(\"glMultMatrixf\");\n\tfp_glMultMatrixd = (pfn_glMultMatrixd)load(\"glMultMatrixd\");\n\tfp_glOrtho = (pfn_glOrtho)load(\"glOrtho\");\n\tfp_glPopMatrix = (pfn_glPopMatrix)load(\"glPopMatrix\");\n\tfp_glPushMatrix = (pfn_glPushMatrix)load(\"glPushMatrix\");\n\tfp_glRotated = (pfn_glRotated)load(\"glRotated\");\n\tfp_glRotatef = (pfn_glRotatef)load(\"glRotatef\");\n\tfp_glScaled = (pfn_glScaled)load(\"glScaled\");\n\tfp_glScalef = (pfn_glScalef)load(\"glScalef\");\n\tfp_glTranslated = (pfn_glTranslated)load(\"glTranslated\");\n\tfp_glTranslatef = (pfn_glTranslatef)load(\"glTranslatef\");\n}\n\nGLboolean GLAD_VERSION_1_1 = GL_FALSE;\nstatic void load_GL_VERSION_1_1(LOADER load) {\n\tif(!GLAD_VERSION_1_1) return;\n\tfp_glDrawArrays = (pfn_glDrawArrays)load(\"glDrawArrays\");\n\tfp_glDrawElements = (pfn_glDrawElements)load(\"glDrawElements\");\n\tfp_glGetPointerv = (pfn_glGetPointerv)load(\"glGetPointerv\");\n\tfp_glPolygonOffset = (pfn_glPolygonOffset)load(\"glPolygonOffset\");\n\tfp_glCopyTexImage1D = (pfn_glCopyTexImage1D)load(\"glCopyTexImage1D\");\n\tfp_glCopyTexImage2D = (pfn_glCopyTexImage2D)load(\"glCopyTexImage2D\");\n\tfp_glCopyTexSubImage1D = (pfn_glCopyTexSubImage1D)load(\"glCopyTexSubImage1D\");\n\tfp_glCopyTexSubImage2D = (pfn_glCopyTexSubImage2D)load(\"glCopyTexSubImage2D\");\n\tfp_glTexSubImage1D = (pfn_glTexSubImage1D)load(\"glTexSubImage1D\");\n\tfp_glTexSubImage2D = (pfn_glTexSubImage2D)load(\"glTexSubImage2D\");\n\tfp_glBindTexture = (pfn_glBindTexture)load(\"glBindTexture\");\n\tfp_glDeleteTextures = (pfn_glDeleteTextures)load(\"glDeleteTextures\");\n\tfp_glGenTextures = (pfn_glGenTextures)load(\"glGenTextures\");\n\tfp_glIsTexture = (pfn_glIsTexture)load(\"glIsTexture\");\n\tfp_glArrayElement = (pfn_glArrayElement)load(\"glArrayElement\");\n\tfp_glColorPointer = (pfn_glColorPointer)load(\"glColorPointer\");\n\tfp_glDisableClientState = (pfn_glDisableClientState)load(\"glDisableClientState\");\n\tfp_glEdgeFlagPointer = (pfn_glEdgeFlagPointer)load(\"glEdgeFlagPointer\");\n\tfp_glEnableClientState = (pfn_glEnableClientState)load(\"glEnableClientState\");\n\tfp_glIndexPointer = (pfn_glIndexPointer)load(\"glIndexPointer\");\n\tfp_glInterleavedArrays = (pfn_glInterleavedArrays)load(\"glInterleavedArrays\");\n\tfp_glNormalPointer = (pfn_glNormalPointer)load(\"glNormalPointer\");\n\tfp_glTexCoordPointer = (pfn_glTexCoordPointer)load(\"glTexCoordPointer\");\n\tfp_glVertexPointer = (pfn_glVertexPointer)load(\"glVertexPointer\");\n\tfp_glAreTexturesResident = (pfn_glAreTexturesResident)load(\"glAreTexturesResident\");\n\tfp_glPrioritizeTextures = (pfn_glPrioritizeTextures)load(\"glPrioritizeTextures\");\n\tfp_glIndexub = (pfn_glIndexub)load(\"glIndexub\");\n\tfp_glIndexubv = (pfn_glIndexubv)load(\"glIndexubv\");\n\tfp_glPopClientAttrib = (pfn_glPopClientAttrib)load(\"glPopClientAttrib\");\n\tfp_glPushClientAttrib = (pfn_glPushClientAttrib)load(\"glPushClientAttrib\");\n}\n\nGLboolean GLAD_VERSION_1_2 = GL_FALSE;\nstatic void load_GL_VERSION_1_2(LOADER load) {\n\tif(!GLAD_VERSION_1_2) return;\n\tfp_glDrawRangeElements = (pfn_glDrawRangeElements)load(\"glDrawRangeElements\");\n\tfp_glTexImage3D = (pfn_glTexImage3D)load(\"glTexImage3D\");\n\tfp_glTexSubImage3D = (pfn_glTexSubImage3D)load(\"glTexSubImage3D\");\n\tfp_glCopyTexSubImage3D = (pfn_glCopyTexSubImage3D)load(\"glCopyTexSubImage3D\");\n}\n\nGLboolean GLAD_VERSION_1_3 = GL_FALSE;\nstatic void load_GL_VERSION_1_3(LOADER load) {\n\tif(!GLAD_VERSION_1_3) return;\n\tfp_glActiveTexture = (pfn_glActiveTexture)load(\"glActiveTexture\");\n\tfp_glSampleCoverage = (pfn_glSampleCoverage)load(\"glSampleCoverage\");\n\tfp_glCompressedTexImage3D = (pfn_glCompressedTexImage3D)load(\"glCompressedTexImage3D\");\n\tfp_glCompressedTexImage2D = (pfn_glCompressedTexImage2D)load(\"glCompressedTexImage2D\");\n\tfp_glCompressedTexImage1D = (pfn_glCompressedTexImage1D)load(\"glCompressedTexImage1D\");\n\tfp_glCompressedTexSubImage3D = (pfn_glCompressedTexSubImage3D)load(\"glCompressedTexSubImage3D\");\n\tfp_glCompressedTexSubImage2D = (pfn_glCompressedTexSubImage2D)load(\"glCompressedTexSubImage2D\");\n\tfp_glCompressedTexSubImage1D = (pfn_glCompressedTexSubImage1D)load(\"glCompressedTexSubImage1D\");\n\tfp_glGetCompressedTexImage = (pfn_glGetCompressedTexImage)load(\"glGetCompressedTexImage\");\n\tfp_glClientActiveTexture = (pfn_glClientActiveTexture)load(\"glClientActiveTexture\");\n\tfp_glMultiTexCoord1d = (pfn_glMultiTexCoord1d)load(\"glMultiTexCoord1d\");\n\tfp_glMultiTexCoord1dv = (pfn_glMultiTexCoord1dv)load(\"glMultiTexCoord1dv\");\n\tfp_glMultiTexCoord1f = (pfn_glMultiTexCoord1f)load(\"glMultiTexCoord1f\");\n\tfp_glMultiTexCoord1fv = (pfn_glMultiTexCoord1fv)load(\"glMultiTexCoord1fv\");\n\tfp_glMultiTexCoord1i = (pfn_glMultiTexCoord1i)load(\"glMultiTexCoord1i\");\n\tfp_glMultiTexCoord1iv = (pfn_glMultiTexCoord1iv)load(\"glMultiTexCoord1iv\");\n\tfp_glMultiTexCoord1s = (pfn_glMultiTexCoord1s)load(\"glMultiTexCoord1s\");\n\tfp_glMultiTexCoord1sv = (pfn_glMultiTexCoord1sv)load(\"glMultiTexCoord1sv\");\n\tfp_glMultiTexCoord2d = (pfn_glMultiTexCoord2d)load(\"glMultiTexCoord2d\");\n\tfp_glMultiTexCoord2dv = (pfn_glMultiTexCoord2dv)load(\"glMultiTexCoord2dv\");\n\tfp_glMultiTexCoord2f = (pfn_glMultiTexCoord2f)load(\"glMultiTexCoord2f\");\n\tfp_glMultiTexCoord2fv = (pfn_glMultiTexCoord2fv)load(\"glMultiTexCoord2fv\");\n\tfp_glMultiTexCoord2i = (pfn_glMultiTexCoord2i)load(\"glMultiTexCoord2i\");\n\tfp_glMultiTexCoord2iv = (pfn_glMultiTexCoord2iv)load(\"glMultiTexCoord2iv\");\n\tfp_glMultiTexCoord2s = (pfn_glMultiTexCoord2s)load(\"glMultiTexCoord2s\");\n\tfp_glMultiTexCoord2sv = (pfn_glMultiTexCoord2sv)load(\"glMultiTexCoord2sv\");\n\tfp_glMultiTexCoord3d = (pfn_glMultiTexCoord3d)load(\"glMultiTexCoord3d\");\n\tfp_glMultiTexCoord3dv = (pfn_glMultiTexCoord3dv)load(\"glMultiTexCoord3dv\");\n\tfp_glMultiTexCoord3f = (pfn_glMultiTexCoord3f)load(\"glMultiTexCoord3f\");\n\tfp_glMultiTexCoord3fv = (pfn_glMultiTexCoord3fv)load(\"glMultiTexCoord3fv\");\n\tfp_glMultiTexCoord3i = (pfn_glMultiTexCoord3i)load(\"glMultiTexCoord3i\");\n\tfp_glMultiTexCoord3iv = (pfn_glMultiTexCoord3iv)load(\"glMultiTexCoord3iv\");\n\tfp_glMultiTexCoord3s = (pfn_glMultiTexCoord3s)load(\"glMultiTexCoord3s\");\n\tfp_glMultiTexCoord3sv = (pfn_glMultiTexCoord3sv)load(\"glMultiTexCoord3sv\");\n\tfp_glMultiTexCoord4d = (pfn_glMultiTexCoord4d)load(\"glMultiTexCoord4d\");\n\tfp_glMultiTexCoord4dv = (pfn_glMultiTexCoord4dv)load(\"glMultiTexCoord4dv\");\n\tfp_glMultiTexCoord4f = (pfn_glMultiTexCoord4f)load(\"glMultiTexCoord4f\");\n\tfp_glMultiTexCoord4fv = (pfn_glMultiTexCoord4fv)load(\"glMultiTexCoord4fv\");\n\tfp_glMultiTexCoord4i = (pfn_glMultiTexCoord4i)load(\"glMultiTexCoord4i\");\n\tfp_glMultiTexCoord4iv = (pfn_glMultiTexCoord4iv)load(\"glMultiTexCoord4iv\");\n\tfp_glMultiTexCoord4s = (pfn_glMultiTexCoord4s)load(\"glMultiTexCoord4s\");\n\tfp_glMultiTexCoord4sv = (pfn_glMultiTexCoord4sv)load(\"glMultiTexCoord4sv\");\n\tfp_glLoadTransposeMatrixf = (pfn_glLoadTransposeMatrixf)load(\"glLoadTransposeMatrixf\");\n\tfp_glLoadTransposeMatrixd = (pfn_glLoadTransposeMatrixd)load(\"glLoadTransposeMatrixd\");\n\tfp_glMultTransposeMatrixf = (pfn_glMultTransposeMatrixf)load(\"glMultTransposeMatrixf\");\n\tfp_glMultTransposeMatrixd = (pfn_glMultTransposeMatrixd)load(\"glMultTransposeMatrixd\");\n}\n\nGLboolean GLAD_VERSION_1_4 = GL_FALSE;\nstatic void load_GL_VERSION_1_4(LOADER load) {\n\tif(!GLAD_VERSION_1_4) return;\n\tfp_glBlendFuncSeparate = (pfn_glBlendFuncSeparate)load(\"glBlendFuncSeparate\");\n\tfp_glMultiDrawArrays = (pfn_glMultiDrawArrays)load(\"glMultiDrawArrays\");\n\tfp_glMultiDrawElements = (pfn_glMultiDrawElements)load(\"glMultiDrawElements\");\n\tfp_glPointParameterf = (pfn_glPointParameterf)load(\"glPointParameterf\");\n\tfp_glPointParameterfv = (pfn_glPointParameterfv)load(\"glPointParameterfv\");\n\tfp_glPointParameteri = (pfn_glPointParameteri)load(\"glPointParameteri\");\n\tfp_glPointParameteriv = (pfn_glPointParameteriv)load(\"glPointParameteriv\");\n\tfp_glFogCoordf = (pfn_glFogCoordf)load(\"glFogCoordf\");\n\tfp_glFogCoordfv = (pfn_glFogCoordfv)load(\"glFogCoordfv\");\n\tfp_glFogCoordd = (pfn_glFogCoordd)load(\"glFogCoordd\");\n\tfp_glFogCoorddv = (pfn_glFogCoorddv)load(\"glFogCoorddv\");\n\tfp_glFogCoordPointer = (pfn_glFogCoordPointer)load(\"glFogCoordPointer\");\n\tfp_glSecondaryColor3b = (pfn_glSecondaryColor3b)load(\"glSecondaryColor3b\");\n\tfp_glSecondaryColor3bv = (pfn_glSecondaryColor3bv)load(\"glSecondaryColor3bv\");\n\tfp_glSecondaryColor3d = (pfn_glSecondaryColor3d)load(\"glSecondaryColor3d\");\n\tfp_glSecondaryColor3dv = (pfn_glSecondaryColor3dv)load(\"glSecondaryColor3dv\");\n\tfp_glSecondaryColor3f = (pfn_glSecondaryColor3f)load(\"glSecondaryColor3f\");\n\tfp_glSecondaryColor3fv = (pfn_glSecondaryColor3fv)load(\"glSecondaryColor3fv\");\n\tfp_glSecondaryColor3i = (pfn_glSecondaryColor3i)load(\"glSecondaryColor3i\");\n\tfp_glSecondaryColor3iv = (pfn_glSecondaryColor3iv)load(\"glSecondaryColor3iv\");\n\tfp_glSecondaryColor3s = (pfn_glSecondaryColor3s)load(\"glSecondaryColor3s\");\n\tfp_glSecondaryColor3sv = (pfn_glSecondaryColor3sv)load(\"glSecondaryColor3sv\");\n\tfp_glSecondaryColor3ub = (pfn_glSecondaryColor3ub)load(\"glSecondaryColor3ub\");\n\tfp_glSecondaryColor3ubv = (pfn_glSecondaryColor3ubv)load(\"glSecondaryColor3ubv\");\n\tfp_glSecondaryColor3ui = (pfn_glSecondaryColor3ui)load(\"glSecondaryColor3ui\");\n\tfp_glSecondaryColor3uiv = (pfn_glSecondaryColor3uiv)load(\"glSecondaryColor3uiv\");\n\tfp_glSecondaryColor3us = (pfn_glSecondaryColor3us)load(\"glSecondaryColor3us\");\n\tfp_glSecondaryColor3usv = (pfn_glSecondaryColor3usv)load(\"glSecondaryColor3usv\");\n\tfp_glSecondaryColorPointer = (pfn_glSecondaryColorPointer)load(\"glSecondaryColorPointer\");\n\tfp_glWindowPos2d = (pfn_glWindowPos2d)load(\"glWindowPos2d\");\n\tfp_glWindowPos2dv = (pfn_glWindowPos2dv)load(\"glWindowPos2dv\");\n\tfp_glWindowPos2f = (pfn_glWindowPos2f)load(\"glWindowPos2f\");\n\tfp_glWindowPos2fv = (pfn_glWindowPos2fv)load(\"glWindowPos2fv\");\n\tfp_glWindowPos2i = (pfn_glWindowPos2i)load(\"glWindowPos2i\");\n\tfp_glWindowPos2iv = (pfn_glWindowPos2iv)load(\"glWindowPos2iv\");\n\tfp_glWindowPos2s = (pfn_glWindowPos2s)load(\"glWindowPos2s\");\n\tfp_glWindowPos2sv = (pfn_glWindowPos2sv)load(\"glWindowPos2sv\");\n\tfp_glWindowPos3d = (pfn_glWindowPos3d)load(\"glWindowPos3d\");\n\tfp_glWindowPos3dv = (pfn_glWindowPos3dv)load(\"glWindowPos3dv\");\n\tfp_glWindowPos3f = (pfn_glWindowPos3f)load(\"glWindowPos3f\");\n\tfp_glWindowPos3fv = (pfn_glWindowPos3fv)load(\"glWindowPos3fv\");\n\tfp_glWindowPos3i = (pfn_glWindowPos3i)load(\"glWindowPos3i\");\n\tfp_glWindowPos3iv = (pfn_glWindowPos3iv)load(\"glWindowPos3iv\");\n\tfp_glWindowPos3s = (pfn_glWindowPos3s)load(\"glWindowPos3s\");\n\tfp_glWindowPos3sv = (pfn_glWindowPos3sv)load(\"glWindowPos3sv\");\n\tfp_glBlendColor = (pfn_glBlendColor)load(\"glBlendColor\");\n\tfp_glBlendEquation = (pfn_glBlendEquation)load(\"glBlendEquation\");\n}\n\nGLboolean GLAD_VERSION_1_5 = GL_FALSE;\nstatic void load_GL_VERSION_1_5(LOADER load) {\n\tif(!GLAD_VERSION_1_5) return;\n\tfp_glGenQueries = (pfn_glGenQueries)load(\"glGenQueries\");\n\tfp_glDeleteQueries = (pfn_glDeleteQueries)load(\"glDeleteQueries\");\n\tfp_glIsQuery = (pfn_glIsQuery)load(\"glIsQuery\");\n\tfp_glBeginQuery = (pfn_glBeginQuery)load(\"glBeginQuery\");\n\tfp_glEndQuery = (pfn_glEndQuery)load(\"glEndQuery\");\n\tfp_glGetQueryiv = (pfn_glGetQueryiv)load(\"glGetQueryiv\");\n\tfp_glGetQueryObjectiv = (pfn_glGetQueryObjectiv)load(\"glGetQueryObjectiv\");\n\tfp_glGetQueryObjectuiv = (pfn_glGetQueryObjectuiv)load(\"glGetQueryObjectuiv\");\n\tfp_glBindBuffer = (pfn_glBindBuffer)load(\"glBindBuffer\");\n\tfp_glDeleteBuffers = (pfn_glDeleteBuffers)load(\"glDeleteBuffers\");\n\tfp_glGenBuffers = (pfn_glGenBuffers)load(\"glGenBuffers\");\n\tfp_glIsBuffer = (pfn_glIsBuffer)load(\"glIsBuffer\");\n\tfp_glBufferData = (pfn_glBufferData)load(\"glBufferData\");\n\tfp_glBufferSubData = (pfn_glBufferSubData)load(\"glBufferSubData\");\n\tfp_glGetBufferSubData = (pfn_glGetBufferSubData)load(\"glGetBufferSubData\");\n\tfp_glMapBuffer = (pfn_glMapBuffer)load(\"glMapBuffer\");\n\tfp_glUnmapBuffer = (pfn_glUnmapBuffer)load(\"glUnmapBuffer\");\n\tfp_glGetBufferParameteriv = (pfn_glGetBufferParameteriv)load(\"glGetBufferParameteriv\");\n\tfp_glGetBufferPointerv = (pfn_glGetBufferPointerv)load(\"glGetBufferPointerv\");\n}\n\nGLboolean GLAD_VERSION_2_0 = GL_FALSE;\nstatic void load_GL_VERSION_2_0(LOADER load) {\n\tif(!GLAD_VERSION_2_0) return;\n\tfp_glBlendEquationSeparate = (pfn_glBlendEquationSeparate)load(\"glBlendEquationSeparate\");\n\tfp_glDrawBuffers = (pfn_glDrawBuffers)load(\"glDrawBuffers\");\n\tfp_glStencilOpSeparate = (pfn_glStencilOpSeparate)load(\"glStencilOpSeparate\");\n\tfp_glStencilFuncSeparate = (pfn_glStencilFuncSeparate)load(\"glStencilFuncSeparate\");\n\tfp_glStencilMaskSeparate = (pfn_glStencilMaskSeparate)load(\"glStencilMaskSeparate\");\n\tfp_glAttachShader = (pfn_glAttachShader)load(\"glAttachShader\");\n\tfp_glBindAttribLocation = (pfn_glBindAttribLocation)load(\"glBindAttribLocation\");\n\tfp_glCompileShader = (pfn_glCompileShader)load(\"glCompileShader\");\n\tfp_glCreateProgram = (pfn_glCreateProgram)load(\"glCreateProgram\");\n\tfp_glCreateShader = (pfn_glCreateShader)load(\"glCreateShader\");\n\tfp_glDeleteProgram = (pfn_glDeleteProgram)load(\"glDeleteProgram\");\n\tfp_glDeleteShader = (pfn_glDeleteShader)load(\"glDeleteShader\");\n\tfp_glDetachShader = (pfn_glDetachShader)load(\"glDetachShader\");\n\tfp_glDisableVertexAttribArray = (pfn_glDisableVertexAttribArray)load(\"glDisableVertexAttribArray\");\n\tfp_glEnableVertexAttribArray = (pfn_glEnableVertexAttribArray)load(\"glEnableVertexAttribArray\");\n\tfp_glGetActiveAttrib = (pfn_glGetActiveAttrib)load(\"glGetActiveAttrib\");\n\tfp_glGetActiveUniform = (pfn_glGetActiveUniform)load(\"glGetActiveUniform\");\n\tfp_glGetAttachedShaders = (pfn_glGetAttachedShaders)load(\"glGetAttachedShaders\");\n\tfp_glGetAttribLocation = (pfn_glGetAttribLocation)load(\"glGetAttribLocation\");\n\tfp_glGetProgramiv = (pfn_glGetProgramiv)load(\"glGetProgramiv\");\n\tfp_glGetProgramInfoLog = (pfn_glGetProgramInfoLog)load(\"glGetProgramInfoLog\");\n\tfp_glGetShaderiv = (pfn_glGetShaderiv)load(\"glGetShaderiv\");\n\tfp_glGetShaderInfoLog = (pfn_glGetShaderInfoLog)load(\"glGetShaderInfoLog\");\n\tfp_glGetShaderSource = (pfn_glGetShaderSource)load(\"glGetShaderSource\");\n\tfp_glGetUniformLocation = (pfn_glGetUniformLocation)load(\"glGetUniformLocation\");\n\tfp_glGetUniformfv = (pfn_glGetUniformfv)load(\"glGetUniformfv\");\n\tfp_glGetUniformiv = (pfn_glGetUniformiv)load(\"glGetUniformiv\");\n\tfp_glGetVertexAttribdv = (pfn_glGetVertexAttribdv)load(\"glGetVertexAttribdv\");\n\tfp_glGetVertexAttribfv = (pfn_glGetVertexAttribfv)load(\"glGetVertexAttribfv\");\n\tfp_glGetVertexAttribiv = (pfn_glGetVertexAttribiv)load(\"glGetVertexAttribiv\");\n\tfp_glGetVertexAttribPointerv = (pfn_glGetVertexAttribPointerv)load(\"glGetVertexAttribPointerv\");\n\tfp_glIsProgram = (pfn_glIsProgram)load(\"glIsProgram\");\n\tfp_glIsShader = (pfn_glIsShader)load(\"glIsShader\");\n\tfp_glLinkProgram = (pfn_glLinkProgram)load(\"glLinkProgram\");\n\tfp_glShaderSource = (pfn_glShaderSource)load(\"glShaderSource\");\n\tfp_glUseProgram = (pfn_glUseProgram)load(\"glUseProgram\");\n\tfp_glUniform1f = (pfn_glUniform1f)load(\"glUniform1f\");\n\tfp_glUniform2f = (pfn_glUniform2f)load(\"glUniform2f\");\n\tfp_glUniform3f = (pfn_glUniform3f)load(\"glUniform3f\");\n\tfp_glUniform4f = (pfn_glUniform4f)load(\"glUniform4f\");\n\tfp_glUniform1i = (pfn_glUniform1i)load(\"glUniform1i\");\n\tfp_glUniform2i = (pfn_glUniform2i)load(\"glUniform2i\");\n\tfp_glUniform3i = (pfn_glUniform3i)load(\"glUniform3i\");\n\tfp_glUniform4i = (pfn_glUniform4i)load(\"glUniform4i\");\n\tfp_glUniform1fv = (pfn_glUniform1fv)load(\"glUniform1fv\");\n\tfp_glUniform2fv = (pfn_glUniform2fv)load(\"glUniform2fv\");\n\tfp_glUniform3fv = (pfn_glUniform3fv)load(\"glUniform3fv\");\n\tfp_glUniform4fv = (pfn_glUniform4fv)load(\"glUniform4fv\");\n\tfp_glUniform1iv = (pfn_glUniform1iv)load(\"glUniform1iv\");\n\tfp_glUniform2iv = (pfn_glUniform2iv)load(\"glUniform2iv\");\n\tfp_glUniform3iv = (pfn_glUniform3iv)load(\"glUniform3iv\");\n\tfp_glUniform4iv = (pfn_glUniform4iv)load(\"glUniform4iv\");\n\tfp_glUniformMatrix2fv = (pfn_glUniformMatrix2fv)load(\"glUniformMatrix2fv\");\n\tfp_glUniformMatrix3fv = (pfn_glUniformMatrix3fv)load(\"glUniformMatrix3fv\");\n\tfp_glUniformMatrix4fv = (pfn_glUniformMatrix4fv)load(\"glUniformMatrix4fv\");\n\tfp_glValidateProgram = (pfn_glValidateProgram)load(\"glValidateProgram\");\n\tfp_glVertexAttrib1d = (pfn_glVertexAttrib1d)load(\"glVertexAttrib1d\");\n\tfp_glVertexAttrib1dv = (pfn_glVertexAttrib1dv)load(\"glVertexAttrib1dv\");\n\tfp_glVertexAttrib1f = (pfn_glVertexAttrib1f)load(\"glVertexAttrib1f\");\n\tfp_glVertexAttrib1fv = (pfn_glVertexAttrib1fv)load(\"glVertexAttrib1fv\");\n\tfp_glVertexAttrib1s = (pfn_glVertexAttrib1s)load(\"glVertexAttrib1s\");\n\tfp_glVertexAttrib1sv = (pfn_glVertexAttrib1sv)load(\"glVertexAttrib1sv\");\n\tfp_glVertexAttrib2d = (pfn_glVertexAttrib2d)load(\"glVertexAttrib2d\");\n\tfp_glVertexAttrib2dv = (pfn_glVertexAttrib2dv)load(\"glVertexAttrib2dv\");\n\tfp_glVertexAttrib2f = (pfn_glVertexAttrib2f)load(\"glVertexAttrib2f\");\n\tfp_glVertexAttrib2fv = (pfn_glVertexAttrib2fv)load(\"glVertexAttrib2fv\");\n\tfp_glVertexAttrib2s = (pfn_glVertexAttrib2s)load(\"glVertexAttrib2s\");\n\tfp_glVertexAttrib2sv = (pfn_glVertexAttrib2sv)load(\"glVertexAttrib2sv\");\n\tfp_glVertexAttrib3d = (pfn_glVertexAttrib3d)load(\"glVertexAttrib3d\");\n\tfp_glVertexAttrib3dv = (pfn_glVertexAttrib3dv)load(\"glVertexAttrib3dv\");\n\tfp_glVertexAttrib3f = (pfn_glVertexAttrib3f)load(\"glVertexAttrib3f\");\n\tfp_glVertexAttrib3fv = (pfn_glVertexAttrib3fv)load(\"glVertexAttrib3fv\");\n\tfp_glVertexAttrib3s = (pfn_glVertexAttrib3s)load(\"glVertexAttrib3s\");\n\tfp_glVertexAttrib3sv = (pfn_glVertexAttrib3sv)load(\"glVertexAttrib3sv\");\n\tfp_glVertexAttrib4Nbv = (pfn_glVertexAttrib4Nbv)load(\"glVertexAttrib4Nbv\");\n\tfp_glVertexAttrib4Niv = (pfn_glVertexAttrib4Niv)load(\"glVertexAttrib4Niv\");\n\tfp_glVertexAttrib4Nsv = (pfn_glVertexAttrib4Nsv)load(\"glVertexAttrib4Nsv\");\n\tfp_glVertexAttrib4Nub = (pfn_glVertexAttrib4Nub)load(\"glVertexAttrib4Nub\");\n\tfp_glVertexAttrib4Nubv = (pfn_glVertexAttrib4Nubv)load(\"glVertexAttrib4Nubv\");\n\tfp_glVertexAttrib4Nuiv = (pfn_glVertexAttrib4Nuiv)load(\"glVertexAttrib4Nuiv\");\n\tfp_glVertexAttrib4Nusv = (pfn_glVertexAttrib4Nusv)load(\"glVertexAttrib4Nusv\");\n\tfp_glVertexAttrib4bv = (pfn_glVertexAttrib4bv)load(\"glVertexAttrib4bv\");\n\tfp_glVertexAttrib4d = (pfn_glVertexAttrib4d)load(\"glVertexAttrib4d\");\n\tfp_glVertexAttrib4dv = (pfn_glVertexAttrib4dv)load(\"glVertexAttrib4dv\");\n\tfp_glVertexAttrib4f = (pfn_glVertexAttrib4f)load(\"glVertexAttrib4f\");\n\tfp_glVertexAttrib4fv = (pfn_glVertexAttrib4fv)load(\"glVertexAttrib4fv\");\n\tfp_glVertexAttrib4iv = (pfn_glVertexAttrib4iv)load(\"glVertexAttrib4iv\");\n\tfp_glVertexAttrib4s = (pfn_glVertexAttrib4s)load(\"glVertexAttrib4s\");\n\tfp_glVertexAttrib4sv = (pfn_glVertexAttrib4sv)load(\"glVertexAttrib4sv\");\n\tfp_glVertexAttrib4ubv = (pfn_glVertexAttrib4ubv)load(\"glVertexAttrib4ubv\");\n\tfp_glVertexAttrib4uiv = (pfn_glVertexAttrib4uiv)load(\"glVertexAttrib4uiv\");\n\tfp_glVertexAttrib4usv = (pfn_glVertexAttrib4usv)load(\"glVertexAttrib4usv\");\n\tfp_glVertexAttribPointer = (pfn_glVertexAttribPointer)load(\"glVertexAttribPointer\");\n}\n\nGLboolean GLAD_VERSION_2_1 = GL_FALSE;\nstatic void load_GL_VERSION_2_1(LOADER load) {\n\tif(!GLAD_VERSION_2_1) return;\n\tfp_glUniformMatrix2x3fv = (pfn_glUniformMatrix2x3fv)load(\"glUniformMatrix2x3fv\");\n\tfp_glUniformMatrix3x2fv = (pfn_glUniformMatrix3x2fv)load(\"glUniformMatrix3x2fv\");\n\tfp_glUniformMatrix2x4fv = (pfn_glUniformMatrix2x4fv)load(\"glUniformMatrix2x4fv\");\n\tfp_glUniformMatrix4x2fv = (pfn_glUniformMatrix4x2fv)load(\"glUniformMatrix4x2fv\");\n\tfp_glUniformMatrix3x4fv = (pfn_glUniformMatrix3x4fv)load(\"glUniformMatrix3x4fv\");\n\tfp_glUniformMatrix4x3fv = (pfn_glUniformMatrix4x3fv)load(\"glUniformMatrix4x3fv\");\n}\n\nGLboolean GLAD_VERSION_3_0 = GL_FALSE;\nstatic void load_GL_VERSION_3_0(LOADER load) {\n\tif(!GLAD_VERSION_3_0) return;\n\tfp_glColorMaski = (pfn_glColorMaski)load(\"glColorMaski\");\n\tfp_glGetBooleani_v = (pfn_glGetBooleani_v)load(\"glGetBooleani_v\");\n\tfp_glGetIntegeri_v = (pfn_glGetIntegeri_v)load(\"glGetIntegeri_v\");\n\tfp_glEnablei = (pfn_glEnablei)load(\"glEnablei\");\n\tfp_glDisablei = (pfn_glDisablei)load(\"glDisablei\");\n\tfp_glIsEnabledi = (pfn_glIsEnabledi)load(\"glIsEnabledi\");\n\tfp_glBeginTransformFeedback = (pfn_glBeginTransformFeedback)load(\"glBeginTransformFeedback\");\n\tfp_glEndTransformFeedback = (pfn_glEndTransformFeedback)load(\"glEndTransformFeedback\");\n\tfp_glBindBufferRange = (pfn_glBindBufferRange)load(\"glBindBufferRange\");\n\tfp_glBindBufferBase = (pfn_glBindBufferBase)load(\"glBindBufferBase\");\n\tfp_glTransformFeedbackVaryings = (pfn_glTransformFeedbackVaryings)load(\"glTransformFeedbackVaryings\");\n\tfp_glGetTransformFeedbackVarying = (pfn_glGetTransformFeedbackVarying)load(\"glGetTransformFeedbackVarying\");\n\tfp_glClampColor = (pfn_glClampColor)load(\"glClampColor\");\n\tfp_glBeginConditionalRender = (pfn_glBeginConditionalRender)load(\"glBeginConditionalRender\");\n\tfp_glEndConditionalRender = (pfn_glEndConditionalRender)load(\"glEndConditionalRender\");\n\tfp_glVertexAttribIPointer = (pfn_glVertexAttribIPointer)load(\"glVertexAttribIPointer\");\n\tfp_glGetVertexAttribIiv = (pfn_glGetVertexAttribIiv)load(\"glGetVertexAttribIiv\");\n\tfp_glGetVertexAttribIuiv = (pfn_glGetVertexAttribIuiv)load(\"glGetVertexAttribIuiv\");\n\tfp_glVertexAttribI1i = (pfn_glVertexAttribI1i)load(\"glVertexAttribI1i\");\n\tfp_glVertexAttribI2i = (pfn_glVertexAttribI2i)load(\"glVertexAttribI2i\");\n\tfp_glVertexAttribI3i = (pfn_glVertexAttribI3i)load(\"glVertexAttribI3i\");\n\tfp_glVertexAttribI4i = (pfn_glVertexAttribI4i)load(\"glVertexAttribI4i\");\n\tfp_glVertexAttribI1ui = (pfn_glVertexAttribI1ui)load(\"glVertexAttribI1ui\");\n\tfp_glVertexAttribI2ui = (pfn_glVertexAttribI2ui)load(\"glVertexAttribI2ui\");\n\tfp_glVertexAttribI3ui = (pfn_glVertexAttribI3ui)load(\"glVertexAttribI3ui\");\n\tfp_glVertexAttribI4ui = (pfn_glVertexAttribI4ui)load(\"glVertexAttribI4ui\");\n\tfp_glVertexAttribI1iv = (pfn_glVertexAttribI1iv)load(\"glVertexAttribI1iv\");\n\tfp_glVertexAttribI2iv = (pfn_glVertexAttribI2iv)load(\"glVertexAttribI2iv\");\n\tfp_glVertexAttribI3iv = (pfn_glVertexAttribI3iv)load(\"glVertexAttribI3iv\");\n\tfp_glVertexAttribI4iv = (pfn_glVertexAttribI4iv)load(\"glVertexAttribI4iv\");\n\tfp_glVertexAttribI1uiv = (pfn_glVertexAttribI1uiv)load(\"glVertexAttribI1uiv\");\n\tfp_glVertexAttribI2uiv = (pfn_glVertexAttribI2uiv)load(\"glVertexAttribI2uiv\");\n\tfp_glVertexAttribI3uiv = (pfn_glVertexAttribI3uiv)load(\"glVertexAttribI3uiv\");\n\tfp_glVertexAttribI4uiv = (pfn_glVertexAttribI4uiv)load(\"glVertexAttribI4uiv\");\n\tfp_glVertexAttribI4bv = (pfn_glVertexAttribI4bv)load(\"glVertexAttribI4bv\");\n\tfp_glVertexAttribI4sv = (pfn_glVertexAttribI4sv)load(\"glVertexAttribI4sv\");\n\tfp_glVertexAttribI4ubv = (pfn_glVertexAttribI4ubv)load(\"glVertexAttribI4ubv\");\n\tfp_glVertexAttribI4usv = (pfn_glVertexAttribI4usv)load(\"glVertexAttribI4usv\");\n\tfp_glGetUniformuiv = (pfn_glGetUniformuiv)load(\"glGetUniformuiv\");\n\tfp_glBindFragDataLocation = (pfn_glBindFragDataLocation)load(\"glBindFragDataLocation\");\n\tfp_glGetFragDataLocation = (pfn_glGetFragDataLocation)load(\"glGetFragDataLocation\");\n\tfp_glUniform1ui = (pfn_glUniform1ui)load(\"glUniform1ui\");\n\tfp_glUniform2ui = (pfn_glUniform2ui)load(\"glUniform2ui\");\n\tfp_glUniform3ui = (pfn_glUniform3ui)load(\"glUniform3ui\");\n\tfp_glUniform4ui = (pfn_glUniform4ui)load(\"glUniform4ui\");\n\tfp_glUniform1uiv = (pfn_glUniform1uiv)load(\"glUniform1uiv\");\n\tfp_glUniform2uiv = (pfn_glUniform2uiv)load(\"glUniform2uiv\");\n\tfp_glUniform3uiv = (pfn_glUniform3uiv)load(\"glUniform3uiv\");\n\tfp_glUniform4uiv = (pfn_glUniform4uiv)load(\"glUniform4uiv\");\n\tfp_glTexParameterIiv = (pfn_glTexParameterIiv)load(\"glTexParameterIiv\");\n\tfp_glTexParameterIuiv = (pfn_glTexParameterIuiv)load(\"glTexParameterIuiv\");\n\tfp_glGetTexParameterIiv = (pfn_glGetTexParameterIiv)load(\"glGetTexParameterIiv\");\n\tfp_glGetTexParameterIuiv = (pfn_glGetTexParameterIuiv)load(\"glGetTexParameterIuiv\");\n\tfp_glClearBufferiv = (pfn_glClearBufferiv)load(\"glClearBufferiv\");\n\tfp_glClearBufferuiv = (pfn_glClearBufferuiv)load(\"glClearBufferuiv\");\n\tfp_glClearBufferfv = (pfn_glClearBufferfv)load(\"glClearBufferfv\");\n\tfp_glClearBufferfi = (pfn_glClearBufferfi)load(\"glClearBufferfi\");\n\tfp_glGetStringi = (pfn_glGetStringi)load(\"glGetStringi\");\n\tfp_glIsRenderbuffer = (pfn_glIsRenderbuffer)load(\"glIsRenderbuffer\");\n\tfp_glBindRenderbuffer = (pfn_glBindRenderbuffer)load(\"glBindRenderbuffer\");\n\tfp_glDeleteRenderbuffers = (pfn_glDeleteRenderbuffers)load(\"glDeleteRenderbuffers\");\n\tfp_glGenRenderbuffers = (pfn_glGenRenderbuffers)load(\"glGenRenderbuffers\");\n\tfp_glRenderbufferStorage = (pfn_glRenderbufferStorage)load(\"glRenderbufferStorage\");\n\tfp_glGetRenderbufferParameteriv = (pfn_glGetRenderbufferParameteriv)load(\"glGetRenderbufferParameteriv\");\n\tfp_glIsFramebuffer = (pfn_glIsFramebuffer)load(\"glIsFramebuffer\");\n\tfp_glBindFramebuffer = (pfn_glBindFramebuffer)load(\"glBindFramebuffer\");\n\tfp_glDeleteFramebuffers = (pfn_glDeleteFramebuffers)load(\"glDeleteFramebuffers\");\n\tfp_glGenFramebuffers = (pfn_glGenFramebuffers)load(\"glGenFramebuffers\");\n\tfp_glCheckFramebufferStatus = (pfn_glCheckFramebufferStatus)load(\"glCheckFramebufferStatus\");\n\tfp_glFramebufferTexture1D = (pfn_glFramebufferTexture1D)load(\"glFramebufferTexture1D\");\n\tfp_glFramebufferTexture2D = (pfn_glFramebufferTexture2D)load(\"glFramebufferTexture2D\");\n\tfp_glFramebufferTexture3D = (pfn_glFramebufferTexture3D)load(\"glFramebufferTexture3D\");\n\tfp_glFramebufferRenderbuffer = (pfn_glFramebufferRenderbuffer)load(\"glFramebufferRenderbuffer\");\n\tfp_glGetFramebufferAttachmentParameteriv = (pfn_glGetFramebufferAttachmentParameteriv)load(\"glGetFramebufferAttachmentParameteriv\");\n\tfp_glGenerateMipmap = (pfn_glGenerateMipmap)load(\"glGenerateMipmap\");\n\tfp_glBlitFramebuffer = (pfn_glBlitFramebuffer)load(\"glBlitFramebuffer\");\n\tfp_glRenderbufferStorageMultisample = (pfn_glRenderbufferStorageMultisample)load(\"glRenderbufferStorageMultisample\");\n\tfp_glFramebufferTextureLayer = (pfn_glFramebufferTextureLayer)load(\"glFramebufferTextureLayer\");\n\tfp_glMapBufferRange = (pfn_glMapBufferRange)load(\"glMapBufferRange\");\n\tfp_glFlushMappedBufferRange = (pfn_glFlushMappedBufferRange)load(\"glFlushMappedBufferRange\");\n\tfp_glBindVertexArray = (pfn_glBindVertexArray)load(\"glBindVertexArray\");\n\tfp_glDeleteVertexArrays = (pfn_glDeleteVertexArrays)load(\"glDeleteVertexArrays\");\n\tfp_glGenVertexArrays = (pfn_glGenVertexArrays)load(\"glGenVertexArrays\");\n\tfp_glIsVertexArray = (pfn_glIsVertexArray)load(\"glIsVertexArray\");\n}\n\nGLboolean GLAD_VERSION_3_1 = GL_FALSE;\nstatic void load_GL_VERSION_3_1(LOADER load) {\n\tif(!GLAD_VERSION_3_1) return;\n\tfp_glDrawArraysInstanced = (pfn_glDrawArraysInstanced)load(\"glDrawArraysInstanced\");\n\tfp_glDrawElementsInstanced = (pfn_glDrawElementsInstanced)load(\"glDrawElementsInstanced\");\n\tfp_glTexBuffer = (pfn_glTexBuffer)load(\"glTexBuffer\");\n\tfp_glPrimitiveRestartIndex = (pfn_glPrimitiveRestartIndex)load(\"glPrimitiveRestartIndex\");\n\tfp_glCopyBufferSubData = (pfn_glCopyBufferSubData)load(\"glCopyBufferSubData\");\n\tfp_glGetUniformIndices = (pfn_glGetUniformIndices)load(\"glGetUniformIndices\");\n\tfp_glGetActiveUniformsiv = (pfn_glGetActiveUniformsiv)load(\"glGetActiveUniformsiv\");\n\tfp_glGetActiveUniformName = (pfn_glGetActiveUniformName)load(\"glGetActiveUniformName\");\n\tfp_glGetUniformBlockIndex = (pfn_glGetUniformBlockIndex)load(\"glGetUniformBlockIndex\");\n\tfp_glGetActiveUniformBlockiv = (pfn_glGetActiveUniformBlockiv)load(\"glGetActiveUniformBlockiv\");\n\tfp_glGetActiveUniformBlockName = (pfn_glGetActiveUniformBlockName)load(\"glGetActiveUniformBlockName\");\n\tfp_glUniformBlockBinding = (pfn_glUniformBlockBinding)load(\"glUniformBlockBinding\");\n\tfp_glBindBufferRange = (pfn_glBindBufferRange)load(\"glBindBufferRange\");\n\tfp_glBindBufferBase = (pfn_glBindBufferBase)load(\"glBindBufferBase\");\n\tfp_glGetIntegeri_v = (pfn_glGetIntegeri_v)load(\"glGetIntegeri_v\");\n}\n\nGLboolean GLAD_VERSION_3_2 = GL_FALSE;\nstatic void load_GL_VERSION_3_2(LOADER load) {\n\tif(!GLAD_VERSION_3_2) return;\n\tfp_glDrawElementsBaseVertex = (pfn_glDrawElementsBaseVertex)load(\"glDrawElementsBaseVertex\");\n\tfp_glDrawRangeElementsBaseVertex = (pfn_glDrawRangeElementsBaseVertex)load(\"glDrawRangeElementsBaseVertex\");\n\tfp_glDrawElementsInstancedBaseVertex = (pfn_glDrawElementsInstancedBaseVertex)load(\"glDrawElementsInstancedBaseVertex\");\n\tfp_glMultiDrawElementsBaseVertex = (pfn_glMultiDrawElementsBaseVertex)load(\"glMultiDrawElementsBaseVertex\");\n\tfp_glProvokingVertex = (pfn_glProvokingVertex)load(\"glProvokingVertex\");\n\tfp_glFenceSync = (pfn_glFenceSync)load(\"glFenceSync\");\n\tfp_glIsSync = (pfn_glIsSync)load(\"glIsSync\");\n\tfp_glDeleteSync = (pfn_glDeleteSync)load(\"glDeleteSync\");\n\tfp_glClientWaitSync = (pfn_glClientWaitSync)load(\"glClientWaitSync\");\n\tfp_glWaitSync = (pfn_glWaitSync)load(\"glWaitSync\");\n\tfp_glGetInteger64v = (pfn_glGetInteger64v)load(\"glGetInteger64v\");\n\tfp_glGetSynciv = (pfn_glGetSynciv)load(\"glGetSynciv\");\n\tfp_glGetInteger64i_v = (pfn_glGetInteger64i_v)load(\"glGetInteger64i_v\");\n\tfp_glGetBufferParameteri64v = (pfn_glGetBufferParameteri64v)load(\"glGetBufferParameteri64v\");\n\tfp_glFramebufferTexture = (pfn_glFramebufferTexture)load(\"glFramebufferTexture\");\n\tfp_glTexImage2DMultisample = (pfn_glTexImage2DMultisample)load(\"glTexImage2DMultisample\");\n\tfp_glTexImage3DMultisample = (pfn_glTexImage3DMultisample)load(\"glTexImage3DMultisample\");\n\tfp_glGetMultisamplefv = (pfn_glGetMultisamplefv)load(\"glGetMultisamplefv\");\n\tfp_glSampleMaski = (pfn_glSampleMaski)load(\"glSampleMaski\");\n}\n\nGLboolean GLAD_VERSION_3_3 = GL_FALSE;\nstatic void load_GL_VERSION_3_3(LOADER load) {\n\tif(!GLAD_VERSION_3_3) return;\n\tfp_glBindFragDataLocationIndexed = (pfn_glBindFragDataLocationIndexed)load(\"glBindFragDataLocationIndexed\");\n\tfp_glGetFragDataIndex = (pfn_glGetFragDataIndex)load(\"glGetFragDataIndex\");\n\tfp_glGenSamplers = (pfn_glGenSamplers)load(\"glGenSamplers\");\n\tfp_glDeleteSamplers = (pfn_glDeleteSamplers)load(\"glDeleteSamplers\");\n\tfp_glIsSampler = (pfn_glIsSampler)load(\"glIsSampler\");\n\tfp_glBindSampler = (pfn_glBindSampler)load(\"glBindSampler\");\n\tfp_glSamplerParameteri = (pfn_glSamplerParameteri)load(\"glSamplerParameteri\");\n\tfp_glSamplerParameteriv = (pfn_glSamplerParameteriv)load(\"glSamplerParameteriv\");\n\tfp_glSamplerParameterf = (pfn_glSamplerParameterf)load(\"glSamplerParameterf\");\n\tfp_glSamplerParameterfv = (pfn_glSamplerParameterfv)load(\"glSamplerParameterfv\");\n\tfp_glSamplerParameterIiv = (pfn_glSamplerParameterIiv)load(\"glSamplerParameterIiv\");\n\tfp_glSamplerParameterIuiv = (pfn_glSamplerParameterIuiv)load(\"glSamplerParameterIuiv\");\n\tfp_glGetSamplerParameteriv = (pfn_glGetSamplerParameteriv)load(\"glGetSamplerParameteriv\");\n\tfp_glGetSamplerParameterIiv = (pfn_glGetSamplerParameterIiv)load(\"glGetSamplerParameterIiv\");\n\tfp_glGetSamplerParameterfv = (pfn_glGetSamplerParameterfv)load(\"glGetSamplerParameterfv\");\n\tfp_glGetSamplerParameterIuiv = (pfn_glGetSamplerParameterIuiv)load(\"glGetSamplerParameterIuiv\");\n\tfp_glQueryCounter = (pfn_glQueryCounter)load(\"glQueryCounter\");\n\tfp_glGetQueryObjecti64v = (pfn_glGetQueryObjecti64v)load(\"glGetQueryObjecti64v\");\n\tfp_glGetQueryObjectui64v = (pfn_glGetQueryObjectui64v)load(\"glGetQueryObjectui64v\");\n\tfp_glVertexAttribDivisor = (pfn_glVertexAttribDivisor)load(\"glVertexAttribDivisor\");\n\tfp_glVertexAttribP1ui = (pfn_glVertexAttribP1ui)load(\"glVertexAttribP1ui\");\n\tfp_glVertexAttribP1uiv = (pfn_glVertexAttribP1uiv)load(\"glVertexAttribP1uiv\");\n\tfp_glVertexAttribP2ui = (pfn_glVertexAttribP2ui)load(\"glVertexAttribP2ui\");\n\tfp_glVertexAttribP2uiv = (pfn_glVertexAttribP2uiv)load(\"glVertexAttribP2uiv\");\n\tfp_glVertexAttribP3ui = (pfn_glVertexAttribP3ui)load(\"glVertexAttribP3ui\");\n\tfp_glVertexAttribP3uiv = (pfn_glVertexAttribP3uiv)load(\"glVertexAttribP3uiv\");\n\tfp_glVertexAttribP4ui = (pfn_glVertexAttribP4ui)load(\"glVertexAttribP4ui\");\n\tfp_glVertexAttribP4uiv = (pfn_glVertexAttribP4uiv)load(\"glVertexAttribP4uiv\");\n\tfp_glVertexP2ui = (pfn_glVertexP2ui)load(\"glVertexP2ui\");\n\tfp_glVertexP2uiv = (pfn_glVertexP2uiv)load(\"glVertexP2uiv\");\n\tfp_glVertexP3ui = (pfn_glVertexP3ui)load(\"glVertexP3ui\");\n\tfp_glVertexP3uiv = (pfn_glVertexP3uiv)load(\"glVertexP3uiv\");\n\tfp_glVertexP4ui = (pfn_glVertexP4ui)load(\"glVertexP4ui\");\n\tfp_glVertexP4uiv = (pfn_glVertexP4uiv)load(\"glVertexP4uiv\");\n\tfp_glTexCoordP1ui = (pfn_glTexCoordP1ui)load(\"glTexCoordP1ui\");\n\tfp_glTexCoordP1uiv = (pfn_glTexCoordP1uiv)load(\"glTexCoordP1uiv\");\n\tfp_glTexCoordP2ui = (pfn_glTexCoordP2ui)load(\"glTexCoordP2ui\");\n\tfp_glTexCoordP2uiv = (pfn_glTexCoordP2uiv)load(\"glTexCoordP2uiv\");\n\tfp_glTexCoordP3ui = (pfn_glTexCoordP3ui)load(\"glTexCoordP3ui\");\n\tfp_glTexCoordP3uiv = (pfn_glTexCoordP3uiv)load(\"glTexCoordP3uiv\");\n\tfp_glTexCoordP4ui = (pfn_glTexCoordP4ui)load(\"glTexCoordP4ui\");\n\tfp_glTexCoordP4uiv = (pfn_glTexCoordP4uiv)load(\"glTexCoordP4uiv\");\n\tfp_glMultiTexCoordP1ui = (pfn_glMultiTexCoordP1ui)load(\"glMultiTexCoordP1ui\");\n\tfp_glMultiTexCoordP1uiv = (pfn_glMultiTexCoordP1uiv)load(\"glMultiTexCoordP1uiv\");\n\tfp_glMultiTexCoordP2ui = (pfn_glMultiTexCoordP2ui)load(\"glMultiTexCoordP2ui\");\n\tfp_glMultiTexCoordP2uiv = (pfn_glMultiTexCoordP2uiv)load(\"glMultiTexCoordP2uiv\");\n\tfp_glMultiTexCoordP3ui = (pfn_glMultiTexCoordP3ui)load(\"glMultiTexCoordP3ui\");\n\tfp_glMultiTexCoordP3uiv = (pfn_glMultiTexCoordP3uiv)load(\"glMultiTexCoordP3uiv\");\n\tfp_glMultiTexCoordP4ui = (pfn_glMultiTexCoordP4ui)load(\"glMultiTexCoordP4ui\");\n\tfp_glMultiTexCoordP4uiv = (pfn_glMultiTexCoordP4uiv)load(\"glMultiTexCoordP4uiv\");\n\tfp_glNormalP3ui = (pfn_glNormalP3ui)load(\"glNormalP3ui\");\n\tfp_glNormalP3uiv = (pfn_glNormalP3uiv)load(\"glNormalP3uiv\");\n\tfp_glColorP3ui = (pfn_glColorP3ui)load(\"glColorP3ui\");\n\tfp_glColorP3uiv = (pfn_glColorP3uiv)load(\"glColorP3uiv\");\n\tfp_glColorP4ui = (pfn_glColorP4ui)load(\"glColorP4ui\");\n\tfp_glColorP4uiv = (pfn_glColorP4uiv)load(\"glColorP4uiv\");\n\tfp_glSecondaryColorP3ui = (pfn_glSecondaryColorP3ui)load(\"glSecondaryColorP3ui\");\n\tfp_glSecondaryColorP3uiv = (pfn_glSecondaryColorP3uiv)load(\"glSecondaryColorP3uiv\");\n}\n\nGLboolean GLAD_VERSION_4_0 = GL_FALSE;\nstatic void load_GL_VERSION_4_0(LOADER load) {\n\tif(!GLAD_VERSION_4_0) return;\n\tfp_glMinSampleShading = (pfn_glMinSampleShading)load(\"glMinSampleShading\");\n\tfp_glBlendEquationi = (pfn_glBlendEquationi)load(\"glBlendEquationi\");\n\tfp_glBlendEquationSeparatei = (pfn_glBlendEquationSeparatei)load(\"glBlendEquationSeparatei\");\n\tfp_glBlendFunci = (pfn_glBlendFunci)load(\"glBlendFunci\");\n\tfp_glBlendFuncSeparatei = (pfn_glBlendFuncSeparatei)load(\"glBlendFuncSeparatei\");\n\tfp_glDrawArraysIndirect = (pfn_glDrawArraysIndirect)load(\"glDrawArraysIndirect\");\n\tfp_glDrawElementsIndirect = (pfn_glDrawElementsIndirect)load(\"glDrawElementsIndirect\");\n\tfp_glUniform1d = (pfn_glUniform1d)load(\"glUniform1d\");\n\tfp_glUniform2d = (pfn_glUniform2d)load(\"glUniform2d\");\n\tfp_glUniform3d = (pfn_glUniform3d)load(\"glUniform3d\");\n\tfp_glUniform4d = (pfn_glUniform4d)load(\"glUniform4d\");\n\tfp_glUniform1dv = (pfn_glUniform1dv)load(\"glUniform1dv\");\n\tfp_glUniform2dv = (pfn_glUniform2dv)load(\"glUniform2dv\");\n\tfp_glUniform3dv = (pfn_glUniform3dv)load(\"glUniform3dv\");\n\tfp_glUniform4dv = (pfn_glUniform4dv)load(\"glUniform4dv\");\n\tfp_glUniformMatrix2dv = (pfn_glUniformMatrix2dv)load(\"glUniformMatrix2dv\");\n\tfp_glUniformMatrix3dv = (pfn_glUniformMatrix3dv)load(\"glUniformMatrix3dv\");\n\tfp_glUniformMatrix4dv = (pfn_glUniformMatrix4dv)load(\"glUniformMatrix4dv\");\n\tfp_glUniformMatrix2x3dv = (pfn_glUniformMatrix2x3dv)load(\"glUniformMatrix2x3dv\");\n\tfp_glUniformMatrix2x4dv = (pfn_glUniformMatrix2x4dv)load(\"glUniformMatrix2x4dv\");\n\tfp_glUniformMatrix3x2dv = (pfn_glUniformMatrix3x2dv)load(\"glUniformMatrix3x2dv\");\n\tfp_glUniformMatrix3x4dv = (pfn_glUniformMatrix3x4dv)load(\"glUniformMatrix3x4dv\");\n\tfp_glUniformMatrix4x2dv = (pfn_glUniformMatrix4x2dv)load(\"glUniformMatrix4x2dv\");\n\tfp_glUniformMatrix4x3dv = (pfn_glUniformMatrix4x3dv)load(\"glUniformMatrix4x3dv\");\n\tfp_glGetUniformdv = (pfn_glGetUniformdv)load(\"glGetUniformdv\");\n\tfp_glGetSubroutineUniformLocation = (pfn_glGetSubroutineUniformLocation)load(\"glGetSubroutineUniformLocation\");\n\tfp_glGetSubroutineIndex = (pfn_glGetSubroutineIndex)load(\"glGetSubroutineIndex\");\n\tfp_glGetActiveSubroutineUniformiv = (pfn_glGetActiveSubroutineUniformiv)load(\"glGetActiveSubroutineUniformiv\");\n\tfp_glGetActiveSubroutineUniformName = (pfn_glGetActiveSubroutineUniformName)load(\"glGetActiveSubroutineUniformName\");\n\tfp_glGetActiveSubroutineName = (pfn_glGetActiveSubroutineName)load(\"glGetActiveSubroutineName\");\n\tfp_glUniformSubroutinesuiv = (pfn_glUniformSubroutinesuiv)load(\"glUniformSubroutinesuiv\");\n\tfp_glGetUniformSubroutineuiv = (pfn_glGetUniformSubroutineuiv)load(\"glGetUniformSubroutineuiv\");\n\tfp_glGetProgramStageiv = (pfn_glGetProgramStageiv)load(\"glGetProgramStageiv\");\n\tfp_glPatchParameteri = (pfn_glPatchParameteri)load(\"glPatchParameteri\");\n\tfp_glPatchParameterfv = (pfn_glPatchParameterfv)load(\"glPatchParameterfv\");\n\tfp_glBindTransformFeedback = (pfn_glBindTransformFeedback)load(\"glBindTransformFeedback\");\n\tfp_glDeleteTransformFeedbacks = (pfn_glDeleteTransformFeedbacks)load(\"glDeleteTransformFeedbacks\");\n\tfp_glGenTransformFeedbacks = (pfn_glGenTransformFeedbacks)load(\"glGenTransformFeedbacks\");\n\tfp_glIsTransformFeedback = (pfn_glIsTransformFeedback)load(\"glIsTransformFeedback\");\n\tfp_glPauseTransformFeedback = (pfn_glPauseTransformFeedback)load(\"glPauseTransformFeedback\");\n\tfp_glResumeTransformFeedback = (pfn_glResumeTransformFeedback)load(\"glResumeTransformFeedback\");\n\tfp_glDrawTransformFeedback = (pfn_glDrawTransformFeedback)load(\"glDrawTransformFeedback\");\n\tfp_glDrawTransformFeedbackStream = (pfn_glDrawTransformFeedbackStream)load(\"glDrawTransformFeedbackStream\");\n\tfp_glBeginQueryIndexed = (pfn_glBeginQueryIndexed)load(\"glBeginQueryIndexed\");\n\tfp_glEndQueryIndexed = (pfn_glEndQueryIndexed)load(\"glEndQueryIndexed\");\n\tfp_glGetQueryIndexediv = (pfn_glGetQueryIndexediv)load(\"glGetQueryIndexediv\");\n}\n\nGLboolean GLAD_VERSION_4_1 = GL_FALSE;\nstatic void load_GL_VERSION_4_1(LOADER load) {\n\tif(!GLAD_VERSION_4_1) return;\n\tfp_glReleaseShaderCompiler = (pfn_glReleaseShaderCompiler)load(\"glReleaseShaderCompiler\");\n\tfp_glShaderBinary = (pfn_glShaderBinary)load(\"glShaderBinary\");\n\tfp_glGetShaderPrecisionFormat = (pfn_glGetShaderPrecisionFormat)load(\"glGetShaderPrecisionFormat\");\n\tfp_glDepthRangef = (pfn_glDepthRangef)load(\"glDepthRangef\");\n\tfp_glClearDepthf = (pfn_glClearDepthf)load(\"glClearDepthf\");\n\tfp_glGetProgramBinary = (pfn_glGetProgramBinary)load(\"glGetProgramBinary\");\n\tfp_glProgramBinary = (pfn_glProgramBinary)load(\"glProgramBinary\");\n\tfp_glProgramParameteri = (pfn_glProgramParameteri)load(\"glProgramParameteri\");\n\tfp_glUseProgramStages = (pfn_glUseProgramStages)load(\"glUseProgramStages\");\n\tfp_glActiveShaderProgram = (pfn_glActiveShaderProgram)load(\"glActiveShaderProgram\");\n\tfp_glCreateShaderProgramv = (pfn_glCreateShaderProgramv)load(\"glCreateShaderProgramv\");\n\tfp_glBindProgramPipeline = (pfn_glBindProgramPipeline)load(\"glBindProgramPipeline\");\n\tfp_glDeleteProgramPipelines = (pfn_glDeleteProgramPipelines)load(\"glDeleteProgramPipelines\");\n\tfp_glGenProgramPipelines = (pfn_glGenProgramPipelines)load(\"glGenProgramPipelines\");\n\tfp_glIsProgramPipeline = (pfn_glIsProgramPipeline)load(\"glIsProgramPipeline\");\n\tfp_glGetProgramPipelineiv = (pfn_glGetProgramPipelineiv)load(\"glGetProgramPipelineiv\");\n\tfp_glProgramUniform1i = (pfn_glProgramUniform1i)load(\"glProgramUniform1i\");\n\tfp_glProgramUniform1iv = (pfn_glProgramUniform1iv)load(\"glProgramUniform1iv\");\n\tfp_glProgramUniform1f = (pfn_glProgramUniform1f)load(\"glProgramUniform1f\");\n\tfp_glProgramUniform1fv = (pfn_glProgramUniform1fv)load(\"glProgramUniform1fv\");\n\tfp_glProgramUniform1d = (pfn_glProgramUniform1d)load(\"glProgramUniform1d\");\n\tfp_glProgramUniform1dv = (pfn_glProgramUniform1dv)load(\"glProgramUniform1dv\");\n\tfp_glProgramUniform1ui = (pfn_glProgramUniform1ui)load(\"glProgramUniform1ui\");\n\tfp_glProgramUniform1uiv = (pfn_glProgramUniform1uiv)load(\"glProgramUniform1uiv\");\n\tfp_glProgramUniform2i = (pfn_glProgramUniform2i)load(\"glProgramUniform2i\");\n\tfp_glProgramUniform2iv = (pfn_glProgramUniform2iv)load(\"glProgramUniform2iv\");\n\tfp_glProgramUniform2f = (pfn_glProgramUniform2f)load(\"glProgramUniform2f\");\n\tfp_glProgramUniform2fv = (pfn_glProgramUniform2fv)load(\"glProgramUniform2fv\");\n\tfp_glProgramUniform2d = (pfn_glProgramUniform2d)load(\"glProgramUniform2d\");\n\tfp_glProgramUniform2dv = (pfn_glProgramUniform2dv)load(\"glProgramUniform2dv\");\n\tfp_glProgramUniform2ui = (pfn_glProgramUniform2ui)load(\"glProgramUniform2ui\");\n\tfp_glProgramUniform2uiv = (pfn_glProgramUniform2uiv)load(\"glProgramUniform2uiv\");\n\tfp_glProgramUniform3i = (pfn_glProgramUniform3i)load(\"glProgramUniform3i\");\n\tfp_glProgramUniform3iv = (pfn_glProgramUniform3iv)load(\"glProgramUniform3iv\");\n\tfp_glProgramUniform3f = (pfn_glProgramUniform3f)load(\"glProgramUniform3f\");\n\tfp_glProgramUniform3fv = (pfn_glProgramUniform3fv)load(\"glProgramUniform3fv\");\n\tfp_glProgramUniform3d = (pfn_glProgramUniform3d)load(\"glProgramUniform3d\");\n\tfp_glProgramUniform3dv = (pfn_glProgramUniform3dv)load(\"glProgramUniform3dv\");\n\tfp_glProgramUniform3ui = (pfn_glProgramUniform3ui)load(\"glProgramUniform3ui\");\n\tfp_glProgramUniform3uiv = (pfn_glProgramUniform3uiv)load(\"glProgramUniform3uiv\");\n\tfp_glProgramUniform4i = (pfn_glProgramUniform4i)load(\"glProgramUniform4i\");\n\tfp_glProgramUniform4iv = (pfn_glProgramUniform4iv)load(\"glProgramUniform4iv\");\n\tfp_glProgramUniform4f = (pfn_glProgramUniform4f)load(\"glProgramUniform4f\");\n\tfp_glProgramUniform4fv = (pfn_glProgramUniform4fv)load(\"glProgramUniform4fv\");\n\tfp_glProgramUniform4d = (pfn_glProgramUniform4d)load(\"glProgramUniform4d\");\n\tfp_glProgramUniform4dv = (pfn_glProgramUniform4dv)load(\"glProgramUniform4dv\");\n\tfp_glProgramUniform4ui = (pfn_glProgramUniform4ui)load(\"glProgramUniform4ui\");\n\tfp_glProgramUniform4uiv = (pfn_glProgramUniform4uiv)load(\"glProgramUniform4uiv\");\n\tfp_glProgramUniformMatrix2fv = (pfn_glProgramUniformMatrix2fv)load(\"glProgramUniformMatrix2fv\");\n\tfp_glProgramUniformMatrix3fv = (pfn_glProgramUniformMatrix3fv)load(\"glProgramUniformMatrix3fv\");\n\tfp_glProgramUniformMatrix4fv = (pfn_glProgramUniformMatrix4fv)load(\"glProgramUniformMatrix4fv\");\n\tfp_glProgramUniformMatrix2dv = (pfn_glProgramUniformMatrix2dv)load(\"glProgramUniformMatrix2dv\");\n\tfp_glProgramUniformMatrix3dv = (pfn_glProgramUniformMatrix3dv)load(\"glProgramUniformMatrix3dv\");\n\tfp_glProgramUniformMatrix4dv = (pfn_glProgramUniformMatrix4dv)load(\"glProgramUniformMatrix4dv\");\n\tfp_glProgramUniformMatrix2x3fv = (pfn_glProgramUniformMatrix2x3fv)load(\"glProgramUniformMatrix2x3fv\");\n\tfp_glProgramUniformMatrix3x2fv = (pfn_glProgramUniformMatrix3x2fv)load(\"glProgramUniformMatrix3x2fv\");\n\tfp_glProgramUniformMatrix2x4fv = (pfn_glProgramUniformMatrix2x4fv)load(\"glProgramUniformMatrix2x4fv\");\n\tfp_glProgramUniformMatrix4x2fv = (pfn_glProgramUniformMatrix4x2fv)load(\"glProgramUniformMatrix4x2fv\");\n\tfp_glProgramUniformMatrix3x4fv = (pfn_glProgramUniformMatrix3x4fv)load(\"glProgramUniformMatrix3x4fv\");\n\tfp_glProgramUniformMatrix4x3fv = (pfn_glProgramUniformMatrix4x3fv)load(\"glProgramUniformMatrix4x3fv\");\n\tfp_glProgramUniformMatrix2x3dv = (pfn_glProgramUniformMatrix2x3dv)load(\"glProgramUniformMatrix2x3dv\");\n\tfp_glProgramUniformMatrix3x2dv = (pfn_glProgramUniformMatrix3x2dv)load(\"glProgramUniformMatrix3x2dv\");\n\tfp_glProgramUniformMatrix2x4dv = (pfn_glProgramUniformMatrix2x4dv)load(\"glProgramUniformMatrix2x4dv\");\n\tfp_glProgramUniformMatrix4x2dv = (pfn_glProgramUniformMatrix4x2dv)load(\"glProgramUniformMatrix4x2dv\");\n\tfp_glProgramUniformMatrix3x4dv = (pfn_glProgramUniformMatrix3x4dv)load(\"glProgramUniformMatrix3x4dv\");\n\tfp_glProgramUniformMatrix4x3dv = (pfn_glProgramUniformMatrix4x3dv)load(\"glProgramUniformMatrix4x3dv\");\n\tfp_glValidateProgramPipeline = (pfn_glValidateProgramPipeline)load(\"glValidateProgramPipeline\");\n\tfp_glGetProgramPipelineInfoLog = (pfn_glGetProgramPipelineInfoLog)load(\"glGetProgramPipelineInfoLog\");\n\tfp_glVertexAttribL1d = (pfn_glVertexAttribL1d)load(\"glVertexAttribL1d\");\n\tfp_glVertexAttribL2d = (pfn_glVertexAttribL2d)load(\"glVertexAttribL2d\");\n\tfp_glVertexAttribL3d = (pfn_glVertexAttribL3d)load(\"glVertexAttribL3d\");\n\tfp_glVertexAttribL4d = (pfn_glVertexAttribL4d)load(\"glVertexAttribL4d\");\n\tfp_glVertexAttribL1dv = (pfn_glVertexAttribL1dv)load(\"glVertexAttribL1dv\");\n\tfp_glVertexAttribL2dv = (pfn_glVertexAttribL2dv)load(\"glVertexAttribL2dv\");\n\tfp_glVertexAttribL3dv = (pfn_glVertexAttribL3dv)load(\"glVertexAttribL3dv\");\n\tfp_glVertexAttribL4dv = (pfn_glVertexAttribL4dv)load(\"glVertexAttribL4dv\");\n\tfp_glVertexAttribLPointer = (pfn_glVertexAttribLPointer)load(\"glVertexAttribLPointer\");\n\tfp_glGetVertexAttribLdv = (pfn_glGetVertexAttribLdv)load(\"glGetVertexAttribLdv\");\n\tfp_glViewportArrayv = (pfn_glViewportArrayv)load(\"glViewportArrayv\");\n\tfp_glViewportIndexedf = (pfn_glViewportIndexedf)load(\"glViewportIndexedf\");\n\tfp_glViewportIndexedfv = (pfn_glViewportIndexedfv)load(\"glViewportIndexedfv\");\n\tfp_glScissorArrayv = (pfn_glScissorArrayv)load(\"glScissorArrayv\");\n\tfp_glScissorIndexed = (pfn_glScissorIndexed)load(\"glScissorIndexed\");\n\tfp_glScissorIndexedv = (pfn_glScissorIndexedv)load(\"glScissorIndexedv\");\n\tfp_glDepthRangeArrayv = (pfn_glDepthRangeArrayv)load(\"glDepthRangeArrayv\");\n\tfp_glDepthRangeIndexed = (pfn_glDepthRangeIndexed)load(\"glDepthRangeIndexed\");\n\tfp_glGetFloati_v = (pfn_glGetFloati_v)load(\"glGetFloati_v\");\n\tfp_glGetDoublei_v = (pfn_glGetDoublei_v)load(\"glGetDoublei_v\");\n}\n\nGLboolean GLAD_VERSION_4_2 = GL_FALSE;\nstatic void load_GL_VERSION_4_2(LOADER load) {\n\tif(!GLAD_VERSION_4_2) return;\n\tfp_glDrawArraysInstancedBaseInstance = (pfn_glDrawArraysInstancedBaseInstance)load(\"glDrawArraysInstancedBaseInstance\");\n\tfp_glDrawElementsInstancedBaseInstance = (pfn_glDrawElementsInstancedBaseInstance)load(\"glDrawElementsInstancedBaseInstance\");\n\tfp_glDrawElementsInstancedBaseVertexBaseInstance = (pfn_glDrawElementsInstancedBaseVertexBaseInstance)load(\"glDrawElementsInstancedBaseVertexBaseInstance\");\n\tfp_glGetInternalformativ = (pfn_glGetInternalformativ)load(\"glGetInternalformativ\");\n\tfp_glGetActiveAtomicCounterBufferiv = (pfn_glGetActiveAtomicCounterBufferiv)load(\"glGetActiveAtomicCounterBufferiv\");\n\tfp_glBindImageTexture = (pfn_glBindImageTexture)load(\"glBindImageTexture\");\n\tfp_glMemoryBarrier = (pfn_glMemoryBarrier)load(\"glMemoryBarrier\");\n\tfp_glTexStorage1D = (pfn_glTexStorage1D)load(\"glTexStorage1D\");\n\tfp_glTexStorage2D = (pfn_glTexStorage2D)load(\"glTexStorage2D\");\n\tfp_glTexStorage3D = (pfn_glTexStorage3D)load(\"glTexStorage3D\");\n\tfp_glDrawTransformFeedbackInstanced = (pfn_glDrawTransformFeedbackInstanced)load(\"glDrawTransformFeedbackInstanced\");\n\tfp_glDrawTransformFeedbackStreamInstanced = (pfn_glDrawTransformFeedbackStreamInstanced)load(\"glDrawTransformFeedbackStreamInstanced\");\n}\n\nGLboolean GLAD_VERSION_4_3 = GL_FALSE;\nstatic void load_GL_VERSION_4_3(LOADER load) {\n\tif(!GLAD_VERSION_4_3) return;\n\tfp_glClearBufferData = (pfn_glClearBufferData)load(\"glClearBufferData\");\n\tfp_glClearBufferSubData = (pfn_glClearBufferSubData)load(\"glClearBufferSubData\");\n\tfp_glDispatchCompute = (pfn_glDispatchCompute)load(\"glDispatchCompute\");\n\tfp_glDispatchComputeIndirect = (pfn_glDispatchComputeIndirect)load(\"glDispatchComputeIndirect\");\n\tfp_glCopyImageSubData = (pfn_glCopyImageSubData)load(\"glCopyImageSubData\");\n\tfp_glFramebufferParameteri = (pfn_glFramebufferParameteri)load(\"glFramebufferParameteri\");\n\tfp_glGetFramebufferParameteriv = (pfn_glGetFramebufferParameteriv)load(\"glGetFramebufferParameteriv\");\n\tfp_glGetInternalformati64v = (pfn_glGetInternalformati64v)load(\"glGetInternalformati64v\");\n\tfp_glInvalidateTexSubImage = (pfn_glInvalidateTexSubImage)load(\"glInvalidateTexSubImage\");\n\tfp_glInvalidateTexImage = (pfn_glInvalidateTexImage)load(\"glInvalidateTexImage\");\n\tfp_glInvalidateBufferSubData = (pfn_glInvalidateBufferSubData)load(\"glInvalidateBufferSubData\");\n\tfp_glInvalidateBufferData = (pfn_glInvalidateBufferData)load(\"glInvalidateBufferData\");\n\tfp_glInvalidateFramebuffer = (pfn_glInvalidateFramebuffer)load(\"glInvalidateFramebuffer\");\n\tfp_glInvalidateSubFramebuffer = (pfn_glInvalidateSubFramebuffer)load(\"glInvalidateSubFramebuffer\");\n\tfp_glMultiDrawArraysIndirect = (pfn_glMultiDrawArraysIndirect)load(\"glMultiDrawArraysIndirect\");\n\tfp_glMultiDrawElementsIndirect = (pfn_glMultiDrawElementsIndirect)load(\"glMultiDrawElementsIndirect\");\n\tfp_glGetProgramInterfaceiv = (pfn_glGetProgramInterfaceiv)load(\"glGetProgramInterfaceiv\");\n\tfp_glGetProgramResourceIndex = (pfn_glGetProgramResourceIndex)load(\"glGetProgramResourceIndex\");\n\tfp_glGetProgramResourceName = (pfn_glGetProgramResourceName)load(\"glGetProgramResourceName\");\n\tfp_glGetProgramResourceiv = (pfn_glGetProgramResourceiv)load(\"glGetProgramResourceiv\");\n\tfp_glGetProgramResourceLocation = (pfn_glGetProgramResourceLocation)load(\"glGetProgramResourceLocation\");\n\tfp_glGetProgramResourceLocationIndex = (pfn_glGetProgramResourceLocationIndex)load(\"glGetProgramResourceLocationIndex\");\n\tfp_glShaderStorageBlockBinding = (pfn_glShaderStorageBlockBinding)load(\"glShaderStorageBlockBinding\");\n\tfp_glTexBufferRange = (pfn_glTexBufferRange)load(\"glTexBufferRange\");\n\tfp_glTexStorage2DMultisample = (pfn_glTexStorage2DMultisample)load(\"glTexStorage2DMultisample\");\n\tfp_glTexStorage3DMultisample = (pfn_glTexStorage3DMultisample)load(\"glTexStorage3DMultisample\");\n\tfp_glTextureView = (pfn_glTextureView)load(\"glTextureView\");\n\tfp_glBindVertexBuffer = (pfn_glBindVertexBuffer)load(\"glBindVertexBuffer\");\n\tfp_glVertexAttribFormat = (pfn_glVertexAttribFormat)load(\"glVertexAttribFormat\");\n\tfp_glVertexAttribIFormat = (pfn_glVertexAttribIFormat)load(\"glVertexAttribIFormat\");\n\tfp_glVertexAttribLFormat = (pfn_glVertexAttribLFormat)load(\"glVertexAttribLFormat\");\n\tfp_glVertexAttribBinding = (pfn_glVertexAttribBinding)load(\"glVertexAttribBinding\");\n\tfp_glVertexBindingDivisor = (pfn_glVertexBindingDivisor)load(\"glVertexBindingDivisor\");\n\tfp_glDebugMessageControl = (pfn_glDebugMessageControl)load(\"glDebugMessageControl\");\n\tfp_glDebugMessageInsert = (pfn_glDebugMessageInsert)load(\"glDebugMessageInsert\");\n\tfp_glDebugMessageCallback = (pfn_glDebugMessageCallback)load(\"glDebugMessageCallback\");\n\tfp_glGetDebugMessageLog = (pfn_glGetDebugMessageLog)load(\"glGetDebugMessageLog\");\n\tfp_glPushDebugGroup = (pfn_glPushDebugGroup)load(\"glPushDebugGroup\");\n\tfp_glPopDebugGroup = (pfn_glPopDebugGroup)load(\"glPopDebugGroup\");\n\tfp_glObjectLabel = (pfn_glObjectLabel)load(\"glObjectLabel\");\n\tfp_glGetObjectLabel = (pfn_glGetObjectLabel)load(\"glGetObjectLabel\");\n\tfp_glObjectPtrLabel = (pfn_glObjectPtrLabel)load(\"glObjectPtrLabel\");\n\tfp_glGetObjectPtrLabel = (pfn_glGetObjectPtrLabel)load(\"glGetObjectPtrLabel\");\n\tfp_glGetPointerv = (pfn_glGetPointerv)load(\"glGetPointerv\");\n\tfp_glGetPointerv = (pfn_glGetPointerv)load(\"glGetPointerv\");\n}\n\nGLboolean GLAD_VERSION_4_4 = GL_FALSE;\nstatic void load_GL_VERSION_4_4(LOADER load) {\n\tif(!GLAD_VERSION_4_4) return;\n\tfp_glBufferStorage = (pfn_glBufferStorage)load(\"glBufferStorage\");\n\tfp_glClearTexImage = (pfn_glClearTexImage)load(\"glClearTexImage\");\n\tfp_glClearTexSubImage = (pfn_glClearTexSubImage)load(\"glClearTexSubImage\");\n\tfp_glBindBuffersBase = (pfn_glBindBuffersBase)load(\"glBindBuffersBase\");\n\tfp_glBindBuffersRange = (pfn_glBindBuffersRange)load(\"glBindBuffersRange\");\n\tfp_glBindTextures = (pfn_glBindTextures)load(\"glBindTextures\");\n\tfp_glBindSamplers = (pfn_glBindSamplers)load(\"glBindSamplers\");\n\tfp_glBindImageTextures = (pfn_glBindImageTextures)load(\"glBindImageTextures\");\n\tfp_glBindVertexBuffers = (pfn_glBindVertexBuffers)load(\"glBindVertexBuffers\");\n}\n\nGLboolean GLAD_VERSION_4_5 = GL_FALSE;\nstatic void load_GL_VERSION_4_5(LOADER load) {\n\tif(!GLAD_VERSION_4_5) return;\n\tfp_glClipControl = (pfn_glClipControl)load(\"glClipControl\");\n\tfp_glCreateTransformFeedbacks = (pfn_glCreateTransformFeedbacks)load(\"glCreateTransformFeedbacks\");\n\tfp_glTransformFeedbackBufferBase = (pfn_glTransformFeedbackBufferBase)load(\"glTransformFeedbackBufferBase\");\n\tfp_glTransformFeedbackBufferRange = (pfn_glTransformFeedbackBufferRange)load(\"glTransformFeedbackBufferRange\");\n\tfp_glGetTransformFeedbackiv = (pfn_glGetTransformFeedbackiv)load(\"glGetTransformFeedbackiv\");\n\tfp_glGetTransformFeedbacki_v = (pfn_glGetTransformFeedbacki_v)load(\"glGetTransformFeedbacki_v\");\n\tfp_glGetTransformFeedbacki64_v = (pfn_glGetTransformFeedbacki64_v)load(\"glGetTransformFeedbacki64_v\");\n\tfp_glCreateBuffers = (pfn_glCreateBuffers)load(\"glCreateBuffers\");\n\tfp_glNamedBufferStorage = (pfn_glNamedBufferStorage)load(\"glNamedBufferStorage\");\n\tfp_glNamedBufferData = (pfn_glNamedBufferData)load(\"glNamedBufferData\");\n\tfp_glNamedBufferSubData = (pfn_glNamedBufferSubData)load(\"glNamedBufferSubData\");\n\tfp_glCopyNamedBufferSubData = (pfn_glCopyNamedBufferSubData)load(\"glCopyNamedBufferSubData\");\n\tfp_glClearNamedBufferData = (pfn_glClearNamedBufferData)load(\"glClearNamedBufferData\");\n\tfp_glClearNamedBufferSubData = (pfn_glClearNamedBufferSubData)load(\"glClearNamedBufferSubData\");\n\tfp_glMapNamedBuffer = (pfn_glMapNamedBuffer)load(\"glMapNamedBuffer\");\n\tfp_glMapNamedBufferRange = (pfn_glMapNamedBufferRange)load(\"glMapNamedBufferRange\");\n\tfp_glUnmapNamedBuffer = (pfn_glUnmapNamedBuffer)load(\"glUnmapNamedBuffer\");\n\tfp_glFlushMappedNamedBufferRange = (pfn_glFlushMappedNamedBufferRange)load(\"glFlushMappedNamedBufferRange\");\n\tfp_glGetNamedBufferParameteriv = (pfn_glGetNamedBufferParameteriv)load(\"glGetNamedBufferParameteriv\");\n\tfp_glGetNamedBufferParameteri64v = (pfn_glGetNamedBufferParameteri64v)load(\"glGetNamedBufferParameteri64v\");\n\tfp_glGetNamedBufferPointerv = (pfn_glGetNamedBufferPointerv)load(\"glGetNamedBufferPointerv\");\n\tfp_glGetNamedBufferSubData = (pfn_glGetNamedBufferSubData)load(\"glGetNamedBufferSubData\");\n\tfp_glCreateFramebuffers = (pfn_glCreateFramebuffers)load(\"glCreateFramebuffers\");\n\tfp_glNamedFramebufferRenderbuffer = (pfn_glNamedFramebufferRenderbuffer)load(\"glNamedFramebufferRenderbuffer\");\n\tfp_glNamedFramebufferParameteri = (pfn_glNamedFramebufferParameteri)load(\"glNamedFramebufferParameteri\");\n\tfp_glNamedFramebufferTexture = (pfn_glNamedFramebufferTexture)load(\"glNamedFramebufferTexture\");\n\tfp_glNamedFramebufferTextureLayer = (pfn_glNamedFramebufferTextureLayer)load(\"glNamedFramebufferTextureLayer\");\n\tfp_glNamedFramebufferDrawBuffer = (pfn_glNamedFramebufferDrawBuffer)load(\"glNamedFramebufferDrawBuffer\");\n\tfp_glNamedFramebufferDrawBuffers = (pfn_glNamedFramebufferDrawBuffers)load(\"glNamedFramebufferDrawBuffers\");\n\tfp_glNamedFramebufferReadBuffer = (pfn_glNamedFramebufferReadBuffer)load(\"glNamedFramebufferReadBuffer\");\n\tfp_glInvalidateNamedFramebufferData = (pfn_glInvalidateNamedFramebufferData)load(\"glInvalidateNamedFramebufferData\");\n\tfp_glInvalidateNamedFramebufferSubData = (pfn_glInvalidateNamedFramebufferSubData)load(\"glInvalidateNamedFramebufferSubData\");\n\tfp_glClearNamedFramebufferiv = (pfn_glClearNamedFramebufferiv)load(\"glClearNamedFramebufferiv\");\n\tfp_glClearNamedFramebufferuiv = (pfn_glClearNamedFramebufferuiv)load(\"glClearNamedFramebufferuiv\");\n\tfp_glClearNamedFramebufferfv = (pfn_glClearNamedFramebufferfv)load(\"glClearNamedFramebufferfv\");\n\tfp_glClearNamedFramebufferfi = (pfn_glClearNamedFramebufferfi)load(\"glClearNamedFramebufferfi\");\n\tfp_glBlitNamedFramebuffer = (pfn_glBlitNamedFramebuffer)load(\"glBlitNamedFramebuffer\");\n\tfp_glCheckNamedFramebufferStatus = (pfn_glCheckNamedFramebufferStatus)load(\"glCheckNamedFramebufferStatus\");\n\tfp_glGetNamedFramebufferParameteriv = (pfn_glGetNamedFramebufferParameteriv)load(\"glGetNamedFramebufferParameteriv\");\n\tfp_glGetNamedFramebufferAttachmentParameteriv = (pfn_glGetNamedFramebufferAttachmentParameteriv)load(\"glGetNamedFramebufferAttachmentParameteriv\");\n\tfp_glCreateRenderbuffers = (pfn_glCreateRenderbuffers)load(\"glCreateRenderbuffers\");\n\tfp_glNamedRenderbufferStorage = (pfn_glNamedRenderbufferStorage)load(\"glNamedRenderbufferStorage\");\n\tfp_glNamedRenderbufferStorageMultisample = (pfn_glNamedRenderbufferStorageMultisample)load(\"glNamedRenderbufferStorageMultisample\");\n\tfp_glGetNamedRenderbufferParameteriv = (pfn_glGetNamedRenderbufferParameteriv)load(\"glGetNamedRenderbufferParameteriv\");\n\tfp_glCreateTextures = (pfn_glCreateTextures)load(\"glCreateTextures\");\n\tfp_glTextureBuffer = (pfn_glTextureBuffer)load(\"glTextureBuffer\");\n\tfp_glTextureBufferRange = (pfn_glTextureBufferRange)load(\"glTextureBufferRange\");\n\tfp_glTextureStorage1D = (pfn_glTextureStorage1D)load(\"glTextureStorage1D\");\n\tfp_glTextureStorage2D = (pfn_glTextureStorage2D)load(\"glTextureStorage2D\");\n\tfp_glTextureStorage3D = (pfn_glTextureStorage3D)load(\"glTextureStorage3D\");\n\tfp_glTextureStorage2DMultisample = (pfn_glTextureStorage2DMultisample)load(\"glTextureStorage2DMultisample\");\n\tfp_glTextureStorage3DMultisample = (pfn_glTextureStorage3DMultisample)load(\"glTextureStorage3DMultisample\");\n\tfp_glTextureSubImage1D = (pfn_glTextureSubImage1D)load(\"glTextureSubImage1D\");\n\tfp_glTextureSubImage2D = (pfn_glTextureSubImage2D)load(\"glTextureSubImage2D\");\n\tfp_glTextureSubImage3D = (pfn_glTextureSubImage3D)load(\"glTextureSubImage3D\");\n\tfp_glCompressedTextureSubImage1D = (pfn_glCompressedTextureSubImage1D)load(\"glCompressedTextureSubImage1D\");\n\tfp_glCompressedTextureSubImage2D = (pfn_glCompressedTextureSubImage2D)load(\"glCompressedTextureSubImage2D\");\n\tfp_glCompressedTextureSubImage3D = (pfn_glCompressedTextureSubImage3D)load(\"glCompressedTextureSubImage3D\");\n\tfp_glCopyTextureSubImage1D = (pfn_glCopyTextureSubImage1D)load(\"glCopyTextureSubImage1D\");\n\tfp_glCopyTextureSubImage2D = (pfn_glCopyTextureSubImage2D)load(\"glCopyTextureSubImage2D\");\n\tfp_glCopyTextureSubImage3D = (pfn_glCopyTextureSubImage3D)load(\"glCopyTextureSubImage3D\");\n\tfp_glTextureParameterf = (pfn_glTextureParameterf)load(\"glTextureParameterf\");\n\tfp_glTextureParameterfv = (pfn_glTextureParameterfv)load(\"glTextureParameterfv\");\n\tfp_glTextureParameteri = (pfn_glTextureParameteri)load(\"glTextureParameteri\");\n\tfp_glTextureParameterIiv = (pfn_glTextureParameterIiv)load(\"glTextureParameterIiv\");\n\tfp_glTextureParameterIuiv = (pfn_glTextureParameterIuiv)load(\"glTextureParameterIuiv\");\n\tfp_glTextureParameteriv = (pfn_glTextureParameteriv)load(\"glTextureParameteriv\");\n\tfp_glGenerateTextureMipmap = (pfn_glGenerateTextureMipmap)load(\"glGenerateTextureMipmap\");\n\tfp_glBindTextureUnit = (pfn_glBindTextureUnit)load(\"glBindTextureUnit\");\n\tfp_glGetTextureImage = (pfn_glGetTextureImage)load(\"glGetTextureImage\");\n\tfp_glGetCompressedTextureImage = (pfn_glGetCompressedTextureImage)load(\"glGetCompressedTextureImage\");\n\tfp_glGetTextureLevelParameterfv = (pfn_glGetTextureLevelParameterfv)load(\"glGetTextureLevelParameterfv\");\n\tfp_glGetTextureLevelParameteriv = (pfn_glGetTextureLevelParameteriv)load(\"glGetTextureLevelParameteriv\");\n\tfp_glGetTextureParameterfv = (pfn_glGetTextureParameterfv)load(\"glGetTextureParameterfv\");\n\tfp_glGetTextureParameterIiv = (pfn_glGetTextureParameterIiv)load(\"glGetTextureParameterIiv\");\n\tfp_glGetTextureParameterIuiv = (pfn_glGetTextureParameterIuiv)load(\"glGetTextureParameterIuiv\");\n\tfp_glGetTextureParameteriv = (pfn_glGetTextureParameteriv)load(\"glGetTextureParameteriv\");\n\tfp_glCreateVertexArrays = (pfn_glCreateVertexArrays)load(\"glCreateVertexArrays\");\n\tfp_glDisableVertexArrayAttrib = (pfn_glDisableVertexArrayAttrib)load(\"glDisableVertexArrayAttrib\");\n\tfp_glEnableVertexArrayAttrib = (pfn_glEnableVertexArrayAttrib)load(\"glEnableVertexArrayAttrib\");\n\tfp_glVertexArrayElementBuffer = (pfn_glVertexArrayElementBuffer)load(\"glVertexArrayElementBuffer\");\n\tfp_glVertexArrayVertexBuffer = (pfn_glVertexArrayVertexBuffer)load(\"glVertexArrayVertexBuffer\");\n\tfp_glVertexArrayVertexBuffers = (pfn_glVertexArrayVertexBuffers)load(\"glVertexArrayVertexBuffers\");\n\tfp_glVertexArrayAttribBinding = (pfn_glVertexArrayAttribBinding)load(\"glVertexArrayAttribBinding\");\n\tfp_glVertexArrayAttribFormat = (pfn_glVertexArrayAttribFormat)load(\"glVertexArrayAttribFormat\");\n\tfp_glVertexArrayAttribIFormat = (pfn_glVertexArrayAttribIFormat)load(\"glVertexArrayAttribIFormat\");\n\tfp_glVertexArrayAttribLFormat = (pfn_glVertexArrayAttribLFormat)load(\"glVertexArrayAttribLFormat\");\n\tfp_glVertexArrayBindingDivisor = (pfn_glVertexArrayBindingDivisor)load(\"glVertexArrayBindingDivisor\");\n\tfp_glGetVertexArrayiv = (pfn_glGetVertexArrayiv)load(\"glGetVertexArrayiv\");\n\tfp_glGetVertexArrayIndexediv = (pfn_glGetVertexArrayIndexediv)load(\"glGetVertexArrayIndexediv\");\n\tfp_glGetVertexArrayIndexed64iv = (pfn_glGetVertexArrayIndexed64iv)load(\"glGetVertexArrayIndexed64iv\");\n\tfp_glCreateSamplers = (pfn_glCreateSamplers)load(\"glCreateSamplers\");\n\tfp_glCreateProgramPipelines = (pfn_glCreateProgramPipelines)load(\"glCreateProgramPipelines\");\n\tfp_glCreateQueries = (pfn_glCreateQueries)load(\"glCreateQueries\");\n\tfp_glGetQueryBufferObjecti64v = (pfn_glGetQueryBufferObjecti64v)load(\"glGetQueryBufferObjecti64v\");\n\tfp_glGetQueryBufferObjectiv = (pfn_glGetQueryBufferObjectiv)load(\"glGetQueryBufferObjectiv\");\n\tfp_glGetQueryBufferObjectui64v = (pfn_glGetQueryBufferObjectui64v)load(\"glGetQueryBufferObjectui64v\");\n\tfp_glGetQueryBufferObjectuiv = (pfn_glGetQueryBufferObjectuiv)load(\"glGetQueryBufferObjectuiv\");\n\tfp_glMemoryBarrierByRegion = (pfn_glMemoryBarrierByRegion)load(\"glMemoryBarrierByRegion\");\n\tfp_glGetTextureSubImage = (pfn_glGetTextureSubImage)load(\"glGetTextureSubImage\");\n\tfp_glGetCompressedTextureSubImage = (pfn_glGetCompressedTextureSubImage)load(\"glGetCompressedTextureSubImage\");\n\tfp_glGetGraphicsResetStatus = (pfn_glGetGraphicsResetStatus)load(\"glGetGraphicsResetStatus\");\n\tfp_glGetnCompressedTexImage = (pfn_glGetnCompressedTexImage)load(\"glGetnCompressedTexImage\");\n\tfp_glGetnTexImage = (pfn_glGetnTexImage)load(\"glGetnTexImage\");\n\tfp_glGetnUniformdv = (pfn_glGetnUniformdv)load(\"glGetnUniformdv\");\n\tfp_glGetnUniformfv = (pfn_glGetnUniformfv)load(\"glGetnUniformfv\");\n\tfp_glGetnUniformiv = (pfn_glGetnUniformiv)load(\"glGetnUniformiv\");\n\tfp_glGetnUniformuiv = (pfn_glGetnUniformuiv)load(\"glGetnUniformuiv\");\n\tfp_glReadnPixels = (pfn_glReadnPixels)load(\"glReadnPixels\");\n\tfp_glGetnMapdv = (pfn_glGetnMapdv)load(\"glGetnMapdv\");\n\tfp_glGetnMapfv = (pfn_glGetnMapfv)load(\"glGetnMapfv\");\n\tfp_glGetnMapiv = (pfn_glGetnMapiv)load(\"glGetnMapiv\");\n\tfp_glGetnPixelMapfv = (pfn_glGetnPixelMapfv)load(\"glGetnPixelMapfv\");\n\tfp_glGetnPixelMapuiv = (pfn_glGetnPixelMapuiv)load(\"glGetnPixelMapuiv\");\n\tfp_glGetnPixelMapusv = (pfn_glGetnPixelMapusv)load(\"glGetnPixelMapusv\");\n\tfp_glGetnPolygonStipple = (pfn_glGetnPolygonStipple)load(\"glGetnPolygonStipple\");\n\tfp_glGetnColorTable = (pfn_glGetnColorTable)load(\"glGetnColorTable\");\n\tfp_glGetnConvolutionFilter = (pfn_glGetnConvolutionFilter)load(\"glGetnConvolutionFilter\");\n\tfp_glGetnSeparableFilter = (pfn_glGetnSeparableFilter)load(\"glGetnSeparableFilter\");\n\tfp_glGetnHistogram = (pfn_glGetnHistogram)load(\"glGetnHistogram\");\n\tfp_glGetnMinmax = (pfn_glGetnMinmax)load(\"glGetnMinmax\");\n\tfp_glTextureBarrier = (pfn_glTextureBarrier)load(\"glTextureBarrier\");\n}\n\nGLboolean GLAD_ES_VERSION_2_0 = GL_FALSE;\nstatic void load_GL_ES_VERSION_2_0(LOADER load) {\n\tif(!GLAD_ES_VERSION_2_0) return;\n\tfp_glActiveTexture = (pfn_glActiveTexture)load(\"glActiveTexture\");\n\tfp_glAttachShader = (pfn_glAttachShader)load(\"glAttachShader\");\n\tfp_glBindAttribLocation = (pfn_glBindAttribLocation)load(\"glBindAttribLocation\");\n\tfp_glBindBuffer = (pfn_glBindBuffer)load(\"glBindBuffer\");\n\tfp_glBindFramebuffer = (pfn_glBindFramebuffer)load(\"glBindFramebuffer\");\n\tfp_glBindRenderbuffer = (pfn_glBindRenderbuffer)load(\"glBindRenderbuffer\");\n\tfp_glBindTexture = (pfn_glBindTexture)load(\"glBindTexture\");\n\tfp_glBlendColor = (pfn_glBlendColor)load(\"glBlendColor\");\n\tfp_glBlendEquation = (pfn_glBlendEquation)load(\"glBlendEquation\");\n\tfp_glBlendEquationSeparate = (pfn_glBlendEquationSeparate)load(\"glBlendEquationSeparate\");\n\tfp_glBlendFunc = (pfn_glBlendFunc)load(\"glBlendFunc\");\n\tfp_glBlendFuncSeparate = (pfn_glBlendFuncSeparate)load(\"glBlendFuncSeparate\");\n\tfp_glBufferData = (pfn_glBufferData)load(\"glBufferData\");\n\tfp_glBufferSubData = (pfn_glBufferSubData)load(\"glBufferSubData\");\n\tfp_glCheckFramebufferStatus = (pfn_glCheckFramebufferStatus)load(\"glCheckFramebufferStatus\");\n\tfp_glClear = (pfn_glClear)load(\"glClear\");\n\tfp_glClearColor = (pfn_glClearColor)load(\"glClearColor\");\n\tfp_glClearDepthf = (pfn_glClearDepthf)load(\"glClearDepthf\");\n\tfp_glClearStencil = (pfn_glClearStencil)load(\"glClearStencil\");\n\tfp_glColorMask = (pfn_glColorMask)load(\"glColorMask\");\n\tfp_glCompileShader = (pfn_glCompileShader)load(\"glCompileShader\");\n\tfp_glCompressedTexImage2D = (pfn_glCompressedTexImage2D)load(\"glCompressedTexImage2D\");\n\tfp_glCompressedTexSubImage2D = (pfn_glCompressedTexSubImage2D)load(\"glCompressedTexSubImage2D\");\n\tfp_glCopyTexImage2D = (pfn_glCopyTexImage2D)load(\"glCopyTexImage2D\");\n\tfp_glCopyTexSubImage2D = (pfn_glCopyTexSubImage2D)load(\"glCopyTexSubImage2D\");\n\tfp_glCreateProgram = (pfn_glCreateProgram)load(\"glCreateProgram\");\n\tfp_glCreateShader = (pfn_glCreateShader)load(\"glCreateShader\");\n\tfp_glCullFace = (pfn_glCullFace)load(\"glCullFace\");\n\tfp_glDeleteBuffers = (pfn_glDeleteBuffers)load(\"glDeleteBuffers\");\n\tfp_glDeleteFramebuffers = (pfn_glDeleteFramebuffers)load(\"glDeleteFramebuffers\");\n\tfp_glDeleteProgram = (pfn_glDeleteProgram)load(\"glDeleteProgram\");\n\tfp_glDeleteRenderbuffers = (pfn_glDeleteRenderbuffers)load(\"glDeleteRenderbuffers\");\n\tfp_glDeleteShader = (pfn_glDeleteShader)load(\"glDeleteShader\");\n\tfp_glDeleteTextures = (pfn_glDeleteTextures)load(\"glDeleteTextures\");\n\tfp_glDepthFunc = (pfn_glDepthFunc)load(\"glDepthFunc\");\n\tfp_glDepthMask = (pfn_glDepthMask)load(\"glDepthMask\");\n\tfp_glDepthRangef = (pfn_glDepthRangef)load(\"glDepthRangef\");\n\tfp_glDetachShader = (pfn_glDetachShader)load(\"glDetachShader\");\n\tfp_glDisable = (pfn_glDisable)load(\"glDisable\");\n\tfp_glDisableVertexAttribArray = (pfn_glDisableVertexAttribArray)load(\"glDisableVertexAttribArray\");\n\tfp_glDrawArrays = (pfn_glDrawArrays)load(\"glDrawArrays\");\n\tfp_glDrawElements = (pfn_glDrawElements)load(\"glDrawElements\");\n\tfp_glEnable = (pfn_glEnable)load(\"glEnable\");\n\tfp_glEnableVertexAttribArray = (pfn_glEnableVertexAttribArray)load(\"glEnableVertexAttribArray\");\n\tfp_glFinish = (pfn_glFinish)load(\"glFinish\");\n\tfp_glFlush = (pfn_glFlush)load(\"glFlush\");\n\tfp_glFramebufferRenderbuffer = (pfn_glFramebufferRenderbuffer)load(\"glFramebufferRenderbuffer\");\n\tfp_glFramebufferTexture2D = (pfn_glFramebufferTexture2D)load(\"glFramebufferTexture2D\");\n\tfp_glFrontFace = (pfn_glFrontFace)load(\"glFrontFace\");\n\tfp_glGenBuffers = (pfn_glGenBuffers)load(\"glGenBuffers\");\n\tfp_glGenerateMipmap = (pfn_glGenerateMipmap)load(\"glGenerateMipmap\");\n\tfp_glGenFramebuffers = (pfn_glGenFramebuffers)load(\"glGenFramebuffers\");\n\tfp_glGenRenderbuffers = (pfn_glGenRenderbuffers)load(\"glGenRenderbuffers\");\n\tfp_glGenTextures = (pfn_glGenTextures)load(\"glGenTextures\");\n\tfp_glGetActiveAttrib = (pfn_glGetActiveAttrib)load(\"glGetActiveAttrib\");\n\tfp_glGetActiveUniform = (pfn_glGetActiveUniform)load(\"glGetActiveUniform\");\n\tfp_glGetAttachedShaders = (pfn_glGetAttachedShaders)load(\"glGetAttachedShaders\");\n\tfp_glGetAttribLocation = (pfn_glGetAttribLocation)load(\"glGetAttribLocation\");\n\tfp_glGetBooleanv = (pfn_glGetBooleanv)load(\"glGetBooleanv\");\n\tfp_glGetBufferParameteriv = (pfn_glGetBufferParameteriv)load(\"glGetBufferParameteriv\");\n\tfp_glGetError = (pfn_glGetError)load(\"glGetError\");\n\tfp_glGetFloatv = (pfn_glGetFloatv)load(\"glGetFloatv\");\n\tfp_glGetFramebufferAttachmentParameteriv = (pfn_glGetFramebufferAttachmentParameteriv)load(\"glGetFramebufferAttachmentParameteriv\");\n\tfp_glGetIntegerv = (pfn_glGetIntegerv)load(\"glGetIntegerv\");\n\tfp_glGetProgramiv = (pfn_glGetProgramiv)load(\"glGetProgramiv\");\n\tfp_glGetProgramInfoLog = (pfn_glGetProgramInfoLog)load(\"glGetProgramInfoLog\");\n\tfp_glGetRenderbufferParameteriv = (pfn_glGetRenderbufferParameteriv)load(\"glGetRenderbufferParameteriv\");\n\tfp_glGetShaderiv = (pfn_glGetShaderiv)load(\"glGetShaderiv\");\n\tfp_glGetShaderInfoLog = (pfn_glGetShaderInfoLog)load(\"glGetShaderInfoLog\");\n\tfp_glGetShaderPrecisionFormat = (pfn_glGetShaderPrecisionFormat)load(\"glGetShaderPrecisionFormat\");\n\tfp_glGetShaderSource = (pfn_glGetShaderSource)load(\"glGetShaderSource\");\n\tfp_glGetString = (pfn_glGetString)load(\"glGetString\");\n\tfp_glGetTexParameterfv = (pfn_glGetTexParameterfv)load(\"glGetTexParameterfv\");\n\tfp_glGetTexParameteriv = (pfn_glGetTexParameteriv)load(\"glGetTexParameteriv\");\n\tfp_glGetUniformfv = (pfn_glGetUniformfv)load(\"glGetUniformfv\");\n\tfp_glGetUniformiv = (pfn_glGetUniformiv)load(\"glGetUniformiv\");\n\tfp_glGetUniformLocation = (pfn_glGetUniformLocation)load(\"glGetUniformLocation\");\n\tfp_glGetVertexAttribfv = (pfn_glGetVertexAttribfv)load(\"glGetVertexAttribfv\");\n\tfp_glGetVertexAttribiv = (pfn_glGetVertexAttribiv)load(\"glGetVertexAttribiv\");\n\tfp_glGetVertexAttribPointerv = (pfn_glGetVertexAttribPointerv)load(\"glGetVertexAttribPointerv\");\n\tfp_glHint = (pfn_glHint)load(\"glHint\");\n\tfp_glIsBuffer = (pfn_glIsBuffer)load(\"glIsBuffer\");\n\tfp_glIsEnabled = (pfn_glIsEnabled)load(\"glIsEnabled\");\n\tfp_glIsFramebuffer = (pfn_glIsFramebuffer)load(\"glIsFramebuffer\");\n\tfp_glIsProgram = (pfn_glIsProgram)load(\"glIsProgram\");\n\tfp_glIsRenderbuffer = (pfn_glIsRenderbuffer)load(\"glIsRenderbuffer\");\n\tfp_glIsShader = (pfn_glIsShader)load(\"glIsShader\");\n\tfp_glIsTexture = (pfn_glIsTexture)load(\"glIsTexture\");\n\tfp_glLineWidth = (pfn_glLineWidth)load(\"glLineWidth\");\n\tfp_glLinkProgram = (pfn_glLinkProgram)load(\"glLinkProgram\");\n\tfp_glPixelStorei = (pfn_glPixelStorei)load(\"glPixelStorei\");\n\tfp_glPolygonOffset = (pfn_glPolygonOffset)load(\"glPolygonOffset\");\n\tfp_glReadPixels = (pfn_glReadPixels)load(\"glReadPixels\");\n\tfp_glReleaseShaderCompiler = (pfn_glReleaseShaderCompiler)load(\"glReleaseShaderCompiler\");\n\tfp_glRenderbufferStorage = (pfn_glRenderbufferStorage)load(\"glRenderbufferStorage\");\n\tfp_glSampleCoverage = (pfn_glSampleCoverage)load(\"glSampleCoverage\");\n\tfp_glScissor = (pfn_glScissor)load(\"glScissor\");\n\tfp_glShaderBinary = (pfn_glShaderBinary)load(\"glShaderBinary\");\n\tfp_glShaderSource = (pfn_glShaderSource)load(\"glShaderSource\");\n\tfp_glStencilFunc = (pfn_glStencilFunc)load(\"glStencilFunc\");\n\tfp_glStencilFuncSeparate = (pfn_glStencilFuncSeparate)load(\"glStencilFuncSeparate\");\n\tfp_glStencilMask = (pfn_glStencilMask)load(\"glStencilMask\");\n\tfp_glStencilMaskSeparate = (pfn_glStencilMaskSeparate)load(\"glStencilMaskSeparate\");\n\tfp_glStencilOp = (pfn_glStencilOp)load(\"glStencilOp\");\n\tfp_glStencilOpSeparate = (pfn_glStencilOpSeparate)load(\"glStencilOpSeparate\");\n\tfp_glTexImage2D = (pfn_glTexImage2D)load(\"glTexImage2D\");\n\tfp_glTexParameterf = (pfn_glTexParameterf)load(\"glTexParameterf\");\n\tfp_glTexParameterfv = (pfn_glTexParameterfv)load(\"glTexParameterfv\");\n\tfp_glTexParameteri = (pfn_glTexParameteri)load(\"glTexParameteri\");\n\tfp_glTexParameteriv = (pfn_glTexParameteriv)load(\"glTexParameteriv\");\n\tfp_glTexSubImage2D = (pfn_glTexSubImage2D)load(\"glTexSubImage2D\");\n\tfp_glUniform1f = (pfn_glUniform1f)load(\"glUniform1f\");\n\tfp_glUniform1fv = (pfn_glUniform1fv)load(\"glUniform1fv\");\n\tfp_glUniform1i = (pfn_glUniform1i)load(\"glUniform1i\");\n\tfp_glUniform1iv = (pfn_glUniform1iv)load(\"glUniform1iv\");\n\tfp_glUniform2f = (pfn_glUniform2f)load(\"glUniform2f\");\n\tfp_glUniform2fv = (pfn_glUniform2fv)load(\"glUniform2fv\");\n\tfp_glUniform2i = (pfn_glUniform2i)load(\"glUniform2i\");\n\tfp_glUniform2iv = (pfn_glUniform2iv)load(\"glUniform2iv\");\n\tfp_glUniform3f = (pfn_glUniform3f)load(\"glUniform3f\");\n\tfp_glUniform3fv = (pfn_glUniform3fv)load(\"glUniform3fv\");\n\tfp_glUniform3i = (pfn_glUniform3i)load(\"glUniform3i\");\n\tfp_glUniform3iv = (pfn_glUniform3iv)load(\"glUniform3iv\");\n\tfp_glUniform4f = (pfn_glUniform4f)load(\"glUniform4f\");\n\tfp_glUniform4fv = (pfn_glUniform4fv)load(\"glUniform4fv\");\n\tfp_glUniform4i = (pfn_glUniform4i)load(\"glUniform4i\");\n\tfp_glUniform4iv = (pfn_glUniform4iv)load(\"glUniform4iv\");\n\tfp_glUniformMatrix2fv = (pfn_glUniformMatrix2fv)load(\"glUniformMatrix2fv\");\n\tfp_glUniformMatrix3fv = (pfn_glUniformMatrix3fv)load(\"glUniformMatrix3fv\");\n\tfp_glUniformMatrix4fv = (pfn_glUniformMatrix4fv)load(\"glUniformMatrix4fv\");\n\tfp_glUseProgram = (pfn_glUseProgram)load(\"glUseProgram\");\n\tfp_glValidateProgram = (pfn_glValidateProgram)load(\"glValidateProgram\");\n\tfp_glVertexAttrib1f = (pfn_glVertexAttrib1f)load(\"glVertexAttrib1f\");\n\tfp_glVertexAttrib1fv = (pfn_glVertexAttrib1fv)load(\"glVertexAttrib1fv\");\n\tfp_glVertexAttrib2f = (pfn_glVertexAttrib2f)load(\"glVertexAttrib2f\");\n\tfp_glVertexAttrib2fv = (pfn_glVertexAttrib2fv)load(\"glVertexAttrib2fv\");\n\tfp_glVertexAttrib3f = (pfn_glVertexAttrib3f)load(\"glVertexAttrib3f\");\n\tfp_glVertexAttrib3fv = (pfn_glVertexAttrib3fv)load(\"glVertexAttrib3fv\");\n\tfp_glVertexAttrib4f = (pfn_glVertexAttrib4f)load(\"glVertexAttrib4f\");\n\tfp_glVertexAttrib4fv = (pfn_glVertexAttrib4fv)load(\"glVertexAttrib4fv\");\n\tfp_glVertexAttribPointer = (pfn_glVertexAttribPointer)load(\"glVertexAttribPointer\");\n\tfp_glViewport = (pfn_glViewport)load(\"glViewport\");\n}\n\nGLboolean GLAD_ES_VERSION_3_0 = GL_FALSE;\nstatic void load_GL_ES_VERSION_3_0(LOADER load) {\n\tif(!GLAD_ES_VERSION_3_0) return;\n\tfp_glReadBuffer = (pfn_glReadBuffer)load(\"glReadBuffer\");\n\tfp_glDrawRangeElements = (pfn_glDrawRangeElements)load(\"glDrawRangeElements\");\n\tfp_glTexImage3D = (pfn_glTexImage3D)load(\"glTexImage3D\");\n\tfp_glTexSubImage3D = (pfn_glTexSubImage3D)load(\"glTexSubImage3D\");\n\tfp_glCopyTexSubImage3D = (pfn_glCopyTexSubImage3D)load(\"glCopyTexSubImage3D\");\n\tfp_glCompressedTexImage3D = (pfn_glCompressedTexImage3D)load(\"glCompressedTexImage3D\");\n\tfp_glCompressedTexSubImage3D = (pfn_glCompressedTexSubImage3D)load(\"glCompressedTexSubImage3D\");\n\tfp_glGenQueries = (pfn_glGenQueries)load(\"glGenQueries\");\n\tfp_glDeleteQueries = (pfn_glDeleteQueries)load(\"glDeleteQueries\");\n\tfp_glIsQuery = (pfn_glIsQuery)load(\"glIsQuery\");\n\tfp_glBeginQuery = (pfn_glBeginQuery)load(\"glBeginQuery\");\n\tfp_glEndQuery = (pfn_glEndQuery)load(\"glEndQuery\");\n\tfp_glGetQueryiv = (pfn_glGetQueryiv)load(\"glGetQueryiv\");\n\tfp_glGetQueryObjectuiv = (pfn_glGetQueryObjectuiv)load(\"glGetQueryObjectuiv\");\n\tfp_glUnmapBuffer = (pfn_glUnmapBuffer)load(\"glUnmapBuffer\");\n\tfp_glGetBufferPointerv = (pfn_glGetBufferPointerv)load(\"glGetBufferPointerv\");\n\tfp_glDrawBuffers = (pfn_glDrawBuffers)load(\"glDrawBuffers\");\n\tfp_glUniformMatrix2x3fv = (pfn_glUniformMatrix2x3fv)load(\"glUniformMatrix2x3fv\");\n\tfp_glUniformMatrix3x2fv = (pfn_glUniformMatrix3x2fv)load(\"glUniformMatrix3x2fv\");\n\tfp_glUniformMatrix2x4fv = (pfn_glUniformMatrix2x4fv)load(\"glUniformMatrix2x4fv\");\n\tfp_glUniformMatrix4x2fv = (pfn_glUniformMatrix4x2fv)load(\"glUniformMatrix4x2fv\");\n\tfp_glUniformMatrix3x4fv = (pfn_glUniformMatrix3x4fv)load(\"glUniformMatrix3x4fv\");\n\tfp_glUniformMatrix4x3fv = (pfn_glUniformMatrix4x3fv)load(\"glUniformMatrix4x3fv\");\n\tfp_glBlitFramebuffer = (pfn_glBlitFramebuffer)load(\"glBlitFramebuffer\");\n\tfp_glRenderbufferStorageMultisample = (pfn_glRenderbufferStorageMultisample)load(\"glRenderbufferStorageMultisample\");\n\tfp_glFramebufferTextureLayer = (pfn_glFramebufferTextureLayer)load(\"glFramebufferTextureLayer\");\n\tfp_glMapBufferRange = (pfn_glMapBufferRange)load(\"glMapBufferRange\");\n\tfp_glFlushMappedBufferRange = (pfn_glFlushMappedBufferRange)load(\"glFlushMappedBufferRange\");\n\tfp_glBindVertexArray = (pfn_glBindVertexArray)load(\"glBindVertexArray\");\n\tfp_glDeleteVertexArrays = (pfn_glDeleteVertexArrays)load(\"glDeleteVertexArrays\");\n\tfp_glGenVertexArrays = (pfn_glGenVertexArrays)load(\"glGenVertexArrays\");\n\tfp_glIsVertexArray = (pfn_glIsVertexArray)load(\"glIsVertexArray\");\n\tfp_glGetIntegeri_v = (pfn_glGetIntegeri_v)load(\"glGetIntegeri_v\");\n\tfp_glBeginTransformFeedback = (pfn_glBeginTransformFeedback)load(\"glBeginTransformFeedback\");\n\tfp_glEndTransformFeedback = (pfn_glEndTransformFeedback)load(\"glEndTransformFeedback\");\n\tfp_glBindBufferRange = (pfn_glBindBufferRange)load(\"glBindBufferRange\");\n\tfp_glBindBufferBase = (pfn_glBindBufferBase)load(\"glBindBufferBase\");\n\tfp_glTransformFeedbackVaryings = (pfn_glTransformFeedbackVaryings)load(\"glTransformFeedbackVaryings\");\n\tfp_glGetTransformFeedbackVarying = (pfn_glGetTransformFeedbackVarying)load(\"glGetTransformFeedbackVarying\");\n\tfp_glVertexAttribIPointer = (pfn_glVertexAttribIPointer)load(\"glVertexAttribIPointer\");\n\tfp_glGetVertexAttribIiv = (pfn_glGetVertexAttribIiv)load(\"glGetVertexAttribIiv\");\n\tfp_glGetVertexAttribIuiv = (pfn_glGetVertexAttribIuiv)load(\"glGetVertexAttribIuiv\");\n\tfp_glVertexAttribI4i = (pfn_glVertexAttribI4i)load(\"glVertexAttribI4i\");\n\tfp_glVertexAttribI4ui = (pfn_glVertexAttribI4ui)load(\"glVertexAttribI4ui\");\n\tfp_glVertexAttribI4iv = (pfn_glVertexAttribI4iv)load(\"glVertexAttribI4iv\");\n\tfp_glVertexAttribI4uiv = (pfn_glVertexAttribI4uiv)load(\"glVertexAttribI4uiv\");\n\tfp_glGetUniformuiv = (pfn_glGetUniformuiv)load(\"glGetUniformuiv\");\n\tfp_glGetFragDataLocation = (pfn_glGetFragDataLocation)load(\"glGetFragDataLocation\");\n\tfp_glUniform1ui = (pfn_glUniform1ui)load(\"glUniform1ui\");\n\tfp_glUniform2ui = (pfn_glUniform2ui)load(\"glUniform2ui\");\n\tfp_glUniform3ui = (pfn_glUniform3ui)load(\"glUniform3ui\");\n\tfp_glUniform4ui = (pfn_glUniform4ui)load(\"glUniform4ui\");\n\tfp_glUniform1uiv = (pfn_glUniform1uiv)load(\"glUniform1uiv\");\n\tfp_glUniform2uiv = (pfn_glUniform2uiv)load(\"glUniform2uiv\");\n\tfp_glUniform3uiv = (pfn_glUniform3uiv)load(\"glUniform3uiv\");\n\tfp_glUniform4uiv = (pfn_glUniform4uiv)load(\"glUniform4uiv\");\n\tfp_glClearBufferiv = (pfn_glClearBufferiv)load(\"glClearBufferiv\");\n\tfp_glClearBufferuiv = (pfn_glClearBufferuiv)load(\"glClearBufferuiv\");\n\tfp_glClearBufferfv = (pfn_glClearBufferfv)load(\"glClearBufferfv\");\n\tfp_glClearBufferfi = (pfn_glClearBufferfi)load(\"glClearBufferfi\");\n\tfp_glGetStringi = (pfn_glGetStringi)load(\"glGetStringi\");\n\tfp_glCopyBufferSubData = (pfn_glCopyBufferSubData)load(\"glCopyBufferSubData\");\n\tfp_glGetUniformIndices = (pfn_glGetUniformIndices)load(\"glGetUniformIndices\");\n\tfp_glGetActiveUniformsiv = (pfn_glGetActiveUniformsiv)load(\"glGetActiveUniformsiv\");\n\tfp_glGetUniformBlockIndex = (pfn_glGetUniformBlockIndex)load(\"glGetUniformBlockIndex\");\n\tfp_glGetActiveUniformBlockiv = (pfn_glGetActiveUniformBlockiv)load(\"glGetActiveUniformBlockiv\");\n\tfp_glGetActiveUniformBlockName = (pfn_glGetActiveUniformBlockName)load(\"glGetActiveUniformBlockName\");\n\tfp_glUniformBlockBinding = (pfn_glUniformBlockBinding)load(\"glUniformBlockBinding\");\n\tfp_glDrawArraysInstanced = (pfn_glDrawArraysInstanced)load(\"glDrawArraysInstanced\");\n\tfp_glDrawElementsInstanced = (pfn_glDrawElementsInstanced)load(\"glDrawElementsInstanced\");\n\tfp_glFenceSync = (pfn_glFenceSync)load(\"glFenceSync\");\n\tfp_glIsSync = (pfn_glIsSync)load(\"glIsSync\");\n\tfp_glDeleteSync = (pfn_glDeleteSync)load(\"glDeleteSync\");\n\tfp_glClientWaitSync = (pfn_glClientWaitSync)load(\"glClientWaitSync\");\n\tfp_glWaitSync = (pfn_glWaitSync)load(\"glWaitSync\");\n\tfp_glGetInteger64v = (pfn_glGetInteger64v)load(\"glGetInteger64v\");\n\tfp_glGetSynciv = (pfn_glGetSynciv)load(\"glGetSynciv\");\n\tfp_glGetInteger64i_v = (pfn_glGetInteger64i_v)load(\"glGetInteger64i_v\");\n\tfp_glGetBufferParameteri64v = (pfn_glGetBufferParameteri64v)load(\"glGetBufferParameteri64v\");\n\tfp_glGenSamplers = (pfn_glGenSamplers)load(\"glGenSamplers\");\n\tfp_glDeleteSamplers = (pfn_glDeleteSamplers)load(\"glDeleteSamplers\");\n\tfp_glIsSampler = (pfn_glIsSampler)load(\"glIsSampler\");\n\tfp_glBindSampler = (pfn_glBindSampler)load(\"glBindSampler\");\n\tfp_glSamplerParameteri = (pfn_glSamplerParameteri)load(\"glSamplerParameteri\");\n\tfp_glSamplerParameteriv = (pfn_glSamplerParameteriv)load(\"glSamplerParameteriv\");\n\tfp_glSamplerParameterf = (pfn_glSamplerParameterf)load(\"glSamplerParameterf\");\n\tfp_glSamplerParameterfv = (pfn_glSamplerParameterfv)load(\"glSamplerParameterfv\");\n\tfp_glGetSamplerParameteriv = (pfn_glGetSamplerParameteriv)load(\"glGetSamplerParameteriv\");\n\tfp_glGetSamplerParameterfv = (pfn_glGetSamplerParameterfv)load(\"glGetSamplerParameterfv\");\n\tfp_glVertexAttribDivisor = (pfn_glVertexAttribDivisor)load(\"glVertexAttribDivisor\");\n\tfp_glBindTransformFeedback = (pfn_glBindTransformFeedback)load(\"glBindTransformFeedback\");\n\tfp_glDeleteTransformFeedbacks = (pfn_glDeleteTransformFeedbacks)load(\"glDeleteTransformFeedbacks\");\n\tfp_glGenTransformFeedbacks = (pfn_glGenTransformFeedbacks)load(\"glGenTransformFeedbacks\");\n\tfp_glIsTransformFeedback = (pfn_glIsTransformFeedback)load(\"glIsTransformFeedback\");\n\tfp_glPauseTransformFeedback = (pfn_glPauseTransformFeedback)load(\"glPauseTransformFeedback\");\n\tfp_glResumeTransformFeedback = (pfn_glResumeTransformFeedback)load(\"glResumeTransformFeedback\");\n\tfp_glGetProgramBinary = (pfn_glGetProgramBinary)load(\"glGetProgramBinary\");\n\tfp_glProgramBinary = (pfn_glProgramBinary)load(\"glProgramBinary\");\n\tfp_glProgramParameteri = (pfn_glProgramParameteri)load(\"glProgramParameteri\");\n\tfp_glInvalidateFramebuffer = (pfn_glInvalidateFramebuffer)load(\"glInvalidateFramebuffer\");\n\tfp_glInvalidateSubFramebuffer = (pfn_glInvalidateSubFramebuffer)load(\"glInvalidateSubFramebuffer\");\n\tfp_glTexStorage2D = (pfn_glTexStorage2D)load(\"glTexStorage2D\");\n\tfp_glTexStorage3D = (pfn_glTexStorage3D)load(\"glTexStorage3D\");\n\tfp_glGetInternalformativ = (pfn_glGetInternalformativ)load(\"glGetInternalformativ\");\n}\n\nGLboolean GLAD_ES_VERSION_3_1 = GL_FALSE;\nstatic void load_GL_ES_VERSION_3_1(LOADER load) {\n\tif(!GLAD_ES_VERSION_3_1) return;\n\tfp_glDispatchCompute = (pfn_glDispatchCompute)load(\"glDispatchCompute\");\n\tfp_glDispatchComputeIndirect = (pfn_glDispatchComputeIndirect)load(\"glDispatchComputeIndirect\");\n\tfp_glDrawArraysIndirect = (pfn_glDrawArraysIndirect)load(\"glDrawArraysIndirect\");\n\tfp_glDrawElementsIndirect = (pfn_glDrawElementsIndirect)load(\"glDrawElementsIndirect\");\n\tfp_glFramebufferParameteri = (pfn_glFramebufferParameteri)load(\"glFramebufferParameteri\");\n\tfp_glGetFramebufferParameteriv = (pfn_glGetFramebufferParameteriv)load(\"glGetFramebufferParameteriv\");\n\tfp_glGetProgramInterfaceiv = (pfn_glGetProgramInterfaceiv)load(\"glGetProgramInterfaceiv\");\n\tfp_glGetProgramResourceIndex = (pfn_glGetProgramResourceIndex)load(\"glGetProgramResourceIndex\");\n\tfp_glGetProgramResourceName = (pfn_glGetProgramResourceName)load(\"glGetProgramResourceName\");\n\tfp_glGetProgramResourceiv = (pfn_glGetProgramResourceiv)load(\"glGetProgramResourceiv\");\n\tfp_glGetProgramResourceLocation = (pfn_glGetProgramResourceLocation)load(\"glGetProgramResourceLocation\");\n\tfp_glUseProgramStages = (pfn_glUseProgramStages)load(\"glUseProgramStages\");\n\tfp_glActiveShaderProgram = (pfn_glActiveShaderProgram)load(\"glActiveShaderProgram\");\n\tfp_glCreateShaderProgramv = (pfn_glCreateShaderProgramv)load(\"glCreateShaderProgramv\");\n\tfp_glBindProgramPipeline = (pfn_glBindProgramPipeline)load(\"glBindProgramPipeline\");\n\tfp_glDeleteProgramPipelines = (pfn_glDeleteProgramPipelines)load(\"glDeleteProgramPipelines\");\n\tfp_glGenProgramPipelines = (pfn_glGenProgramPipelines)load(\"glGenProgramPipelines\");\n\tfp_glIsProgramPipeline = (pfn_glIsProgramPipeline)load(\"glIsProgramPipeline\");\n\tfp_glGetProgramPipelineiv = (pfn_glGetProgramPipelineiv)load(\"glGetProgramPipelineiv\");\n\tfp_glProgramUniform1i = (pfn_glProgramUniform1i)load(\"glProgramUniform1i\");\n\tfp_glProgramUniform2i = (pfn_glProgramUniform2i)load(\"glProgramUniform2i\");\n\tfp_glProgramUniform3i = (pfn_glProgramUniform3i)load(\"glProgramUniform3i\");\n\tfp_glProgramUniform4i = (pfn_glProgramUniform4i)load(\"glProgramUniform4i\");\n\tfp_glProgramUniform1ui = (pfn_glProgramUniform1ui)load(\"glProgramUniform1ui\");\n\tfp_glProgramUniform2ui = (pfn_glProgramUniform2ui)load(\"glProgramUniform2ui\");\n\tfp_glProgramUniform3ui = (pfn_glProgramUniform3ui)load(\"glProgramUniform3ui\");\n\tfp_glProgramUniform4ui = (pfn_glProgramUniform4ui)load(\"glProgramUniform4ui\");\n\tfp_glProgramUniform1f = (pfn_glProgramUniform1f)load(\"glProgramUniform1f\");\n\tfp_glProgramUniform2f = (pfn_glProgramUniform2f)load(\"glProgramUniform2f\");\n\tfp_glProgramUniform3f = (pfn_glProgramUniform3f)load(\"glProgramUniform3f\");\n\tfp_glProgramUniform4f = (pfn_glProgramUniform4f)load(\"glProgramUniform4f\");\n\tfp_glProgramUniform1iv = (pfn_glProgramUniform1iv)load(\"glProgramUniform1iv\");\n\tfp_glProgramUniform2iv = (pfn_glProgramUniform2iv)load(\"glProgramUniform2iv\");\n\tfp_glProgramUniform3iv = (pfn_glProgramUniform3iv)load(\"glProgramUniform3iv\");\n\tfp_glProgramUniform4iv = (pfn_glProgramUniform4iv)load(\"glProgramUniform4iv\");\n\tfp_glProgramUniform1uiv = (pfn_glProgramUniform1uiv)load(\"glProgramUniform1uiv\");\n\tfp_glProgramUniform2uiv = (pfn_glProgramUniform2uiv)load(\"glProgramUniform2uiv\");\n\tfp_glProgramUniform3uiv = (pfn_glProgramUniform3uiv)load(\"glProgramUniform3uiv\");\n\tfp_glProgramUniform4uiv = (pfn_glProgramUniform4uiv)load(\"glProgramUniform4uiv\");\n\tfp_glProgramUniform1fv = (pfn_glProgramUniform1fv)load(\"glProgramUniform1fv\");\n\tfp_glProgramUniform2fv = (pfn_glProgramUniform2fv)load(\"glProgramUniform2fv\");\n\tfp_glProgramUniform3fv = (pfn_glProgramUniform3fv)load(\"glProgramUniform3fv\");\n\tfp_glProgramUniform4fv = (pfn_glProgramUniform4fv)load(\"glProgramUniform4fv\");\n\tfp_glProgramUniformMatrix2fv = (pfn_glProgramUniformMatrix2fv)load(\"glProgramUniformMatrix2fv\");\n\tfp_glProgramUniformMatrix3fv = (pfn_glProgramUniformMatrix3fv)load(\"glProgramUniformMatrix3fv\");\n\tfp_glProgramUniformMatrix4fv = (pfn_glProgramUniformMatrix4fv)load(\"glProgramUniformMatrix4fv\");\n\tfp_glProgramUniformMatrix2x3fv = (pfn_glProgramUniformMatrix2x3fv)load(\"glProgramUniformMatrix2x3fv\");\n\tfp_glProgramUniformMatrix3x2fv = (pfn_glProgramUniformMatrix3x2fv)load(\"glProgramUniformMatrix3x2fv\");\n\tfp_glProgramUniformMatrix2x4fv = (pfn_glProgramUniformMatrix2x4fv)load(\"glProgramUniformMatrix2x4fv\");\n\tfp_glProgramUniformMatrix4x2fv = (pfn_glProgramUniformMatrix4x2fv)load(\"glProgramUniformMatrix4x2fv\");\n\tfp_glProgramUniformMatrix3x4fv = (pfn_glProgramUniformMatrix3x4fv)load(\"glProgramUniformMatrix3x4fv\");\n\tfp_glProgramUniformMatrix4x3fv = (pfn_glProgramUniformMatrix4x3fv)load(\"glProgramUniformMatrix4x3fv\");\n\tfp_glValidateProgramPipeline = (pfn_glValidateProgramPipeline)load(\"glValidateProgramPipeline\");\n\tfp_glGetProgramPipelineInfoLog = (pfn_glGetProgramPipelineInfoLog)load(\"glGetProgramPipelineInfoLog\");\n\tfp_glBindImageTexture = (pfn_glBindImageTexture)load(\"glBindImageTexture\");\n\tfp_glGetBooleani_v = (pfn_glGetBooleani_v)load(\"glGetBooleani_v\");\n\tfp_glMemoryBarrier = (pfn_glMemoryBarrier)load(\"glMemoryBarrier\");\n\tfp_glMemoryBarrierByRegion = (pfn_glMemoryBarrierByRegion)load(\"glMemoryBarrierByRegion\");\n\tfp_glTexStorage2DMultisample = (pfn_glTexStorage2DMultisample)load(\"glTexStorage2DMultisample\");\n\tfp_glGetMultisamplefv = (pfn_glGetMultisamplefv)load(\"glGetMultisamplefv\");\n\tfp_glSampleMaski = (pfn_glSampleMaski)load(\"glSampleMaski\");\n\tfp_glGetTexLevelParameteriv = (pfn_glGetTexLevelParameteriv)load(\"glGetTexLevelParameteriv\");\n\tfp_glGetTexLevelParameterfv = (pfn_glGetTexLevelParameterfv)load(\"glGetTexLevelParameterfv\");\n\tfp_glBindVertexBuffer = (pfn_glBindVertexBuffer)load(\"glBindVertexBuffer\");\n\tfp_glVertexAttribFormat = (pfn_glVertexAttribFormat)load(\"glVertexAttribFormat\");\n\tfp_glVertexAttribIFormat = (pfn_glVertexAttribIFormat)load(\"glVertexAttribIFormat\");\n\tfp_glVertexAttribBinding = (pfn_glVertexAttribBinding)load(\"glVertexAttribBinding\");\n\tfp_glVertexBindingDivisor = (pfn_glVertexBindingDivisor)load(\"glVertexBindingDivisor\");\n}\n\nGLboolean GLAD_ES_VERSION_3_2 = GL_FALSE;\nstatic void load_GL_ES_VERSION_3_2(LOADER load) {\n\tif(!GLAD_ES_VERSION_3_2) return;\n\tfp_glBlendBarrier = (pfn_glBlendBarrier)load(\"glBlendBarrier\");\n\tfp_glCopyImageSubData = (pfn_glCopyImageSubData)load(\"glCopyImageSubData\");\n\tfp_glDebugMessageControl = (pfn_glDebugMessageControl)load(\"glDebugMessageControl\");\n\tfp_glDebugMessageInsert = (pfn_glDebugMessageInsert)load(\"glDebugMessageInsert\");\n\tfp_glDebugMessageCallback = (pfn_glDebugMessageCallback)load(\"glDebugMessageCallback\");\n\tfp_glGetDebugMessageLog = (pfn_glGetDebugMessageLog)load(\"glGetDebugMessageLog\");\n\tfp_glPushDebugGroup = (pfn_glPushDebugGroup)load(\"glPushDebugGroup\");\n\tfp_glPopDebugGroup = (pfn_glPopDebugGroup)load(\"glPopDebugGroup\");\n\tfp_glObjectLabel = (pfn_glObjectLabel)load(\"glObjectLabel\");\n\tfp_glGetObjectLabel = (pfn_glGetObjectLabel)load(\"glGetObjectLabel\");\n\tfp_glObjectPtrLabel = (pfn_glObjectPtrLabel)load(\"glObjectPtrLabel\");\n\tfp_glGetObjectPtrLabel = (pfn_glGetObjectPtrLabel)load(\"glGetObjectPtrLabel\");\n\tfp_glGetPointerv = (pfn_glGetPointerv)load(\"glGetPointerv\");\n\tfp_glEnablei = (pfn_glEnablei)load(\"glEnablei\");\n\tfp_glDisablei = (pfn_glDisablei)load(\"glDisablei\");\n\tfp_glBlendEquationi = (pfn_glBlendEquationi)load(\"glBlendEquationi\");\n\tfp_glBlendEquationSeparatei = (pfn_glBlendEquationSeparatei)load(\"glBlendEquationSeparatei\");\n\tfp_glBlendFunci = (pfn_glBlendFunci)load(\"glBlendFunci\");\n\tfp_glBlendFuncSeparatei = (pfn_glBlendFuncSeparatei)load(\"glBlendFuncSeparatei\");\n\tfp_glColorMaski = (pfn_glColorMaski)load(\"glColorMaski\");\n\tfp_glIsEnabledi = (pfn_glIsEnabledi)load(\"glIsEnabledi\");\n\tfp_glDrawElementsBaseVertex = (pfn_glDrawElementsBaseVertex)load(\"glDrawElementsBaseVertex\");\n\tfp_glDrawRangeElementsBaseVertex = (pfn_glDrawRangeElementsBaseVertex)load(\"glDrawRangeElementsBaseVertex\");\n\tfp_glDrawElementsInstancedBaseVertex = (pfn_glDrawElementsInstancedBaseVertex)load(\"glDrawElementsInstancedBaseVertex\");\n\tfp_glFramebufferTexture = (pfn_glFramebufferTexture)load(\"glFramebufferTexture\");\n\tfp_glPrimitiveBoundingBox = (pfn_glPrimitiveBoundingBox)load(\"glPrimitiveBoundingBox\");\n\tfp_glGetGraphicsResetStatus = (pfn_glGetGraphicsResetStatus)load(\"glGetGraphicsResetStatus\");\n\tfp_glReadnPixels = (pfn_glReadnPixels)load(\"glReadnPixels\");\n\tfp_glGetnUniformfv = (pfn_glGetnUniformfv)load(\"glGetnUniformfv\");\n\tfp_glGetnUniformiv = (pfn_glGetnUniformiv)load(\"glGetnUniformiv\");\n\tfp_glGetnUniformuiv = (pfn_glGetnUniformuiv)load(\"glGetnUniformuiv\");\n\tfp_glMinSampleShading = (pfn_glMinSampleShading)load(\"glMinSampleShading\");\n\tfp_glPatchParameteri = (pfn_glPatchParameteri)load(\"glPatchParameteri\");\n\tfp_glTexParameterIiv = (pfn_glTexParameterIiv)load(\"glTexParameterIiv\");\n\tfp_glTexParameterIuiv = (pfn_glTexParameterIuiv)load(\"glTexParameterIuiv\");\n\tfp_glGetTexParameterIiv = (pfn_glGetTexParameterIiv)load(\"glGetTexParameterIiv\");\n\tfp_glGetTexParameterIuiv = (pfn_glGetTexParameterIuiv)load(\"glGetTexParameterIuiv\");\n\tfp_glSamplerParameterIiv = (pfn_glSamplerParameterIiv)load(\"glSamplerParameterIiv\");\n\tfp_glSamplerParameterIuiv = (pfn_glSamplerParameterIuiv)load(\"glSamplerParameterIuiv\");\n\tfp_glGetSamplerParameterIiv = (pfn_glGetSamplerParameterIiv)load(\"glGetSamplerParameterIiv\");\n\tfp_glGetSamplerParameterIuiv = (pfn_glGetSamplerParameterIuiv)load(\"glGetSamplerParameterIuiv\");\n\tfp_glTexBuffer = (pfn_glTexBuffer)load(\"glTexBuffer\");\n\tfp_glTexBufferRange = (pfn_glTexBufferRange)load(\"glTexBufferRange\");\n\tfp_glTexStorage3DMultisample = (pfn_glTexStorage3DMultisample)load(\"glTexStorage3DMultisample\");\n}\n\nGLboolean GLAD_KHR_blend_equation_advanced = GL_FALSE;\nstatic void load_GL_KHR_blend_equation_advanced(LOADER load) {\n\tif(!GLAD_KHR_blend_equation_advanced) return;\n\tfp_glBlendBarrierKHR = (pfn_glBlendBarrierKHR)load(\"glBlendBarrierKHR\");\n}\n\nGLboolean GLAD_KHR_blend_equation_advanced_coherent = GL_FALSE;\nGLboolean GLAD_KHR_context_flush_control = GL_FALSE;\nGLboolean GLAD_KHR_debug = GL_FALSE;\nstatic void load_GL_KHR_debug(LOADER load) {\n\tif(!GLAD_KHR_debug) return;\n\tfp_glDebugMessageControl = (pfn_glDebugMessageControl)load(\"glDebugMessageControl\");\n\tfp_glDebugMessageInsert = (pfn_glDebugMessageInsert)load(\"glDebugMessageInsert\");\n\tfp_glDebugMessageCallback = (pfn_glDebugMessageCallback)load(\"glDebugMessageCallback\");\n\tfp_glGetDebugMessageLog = (pfn_glGetDebugMessageLog)load(\"glGetDebugMessageLog\");\n\tfp_glPushDebugGroup = (pfn_glPushDebugGroup)load(\"glPushDebugGroup\");\n\tfp_glPopDebugGroup = (pfn_glPopDebugGroup)load(\"glPopDebugGroup\");\n\tfp_glObjectLabel = (pfn_glObjectLabel)load(\"glObjectLabel\");\n\tfp_glGetObjectLabel = (pfn_glGetObjectLabel)load(\"glGetObjectLabel\");\n\tfp_glObjectPtrLabel = (pfn_glObjectPtrLabel)load(\"glObjectPtrLabel\");\n\tfp_glGetObjectPtrLabel = (pfn_glGetObjectPtrLabel)load(\"glGetObjectPtrLabel\");\n\tfp_glGetPointerv = (pfn_glGetPointerv)load(\"glGetPointerv\");\n\tfp_glDebugMessageControlKHR = (pfn_glDebugMessageControlKHR)load(\"glDebugMessageControlKHR\");\n\tfp_glDebugMessageInsertKHR = (pfn_glDebugMessageInsertKHR)load(\"glDebugMessageInsertKHR\");\n\tfp_glDebugMessageCallbackKHR = (pfn_glDebugMessageCallbackKHR)load(\"glDebugMessageCallbackKHR\");\n\tfp_glGetDebugMessageLogKHR = (pfn_glGetDebugMessageLogKHR)load(\"glGetDebugMessageLogKHR\");\n\tfp_glPushDebugGroupKHR = (pfn_glPushDebugGroupKHR)load(\"glPushDebugGroupKHR\");\n\tfp_glPopDebugGroupKHR = (pfn_glPopDebugGroupKHR)load(\"glPopDebugGroupKHR\");\n\tfp_glObjectLabelKHR = (pfn_glObjectLabelKHR)load(\"glObjectLabelKHR\");\n\tfp_glGetObjectLabelKHR = (pfn_glGetObjectLabelKHR)load(\"glGetObjectLabelKHR\");\n\tfp_glObjectPtrLabelKHR = (pfn_glObjectPtrLabelKHR)load(\"glObjectPtrLabelKHR\");\n\tfp_glGetObjectPtrLabelKHR = (pfn_glGetObjectPtrLabelKHR)load(\"glGetObjectPtrLabelKHR\");\n\tfp_glGetPointervKHR = (pfn_glGetPointervKHR)load(\"glGetPointervKHR\");\n}\n\nGLboolean GLAD_KHR_no_error = GL_FALSE;\nGLboolean GLAD_KHR_robust_buffer_access_behavior = GL_FALSE;\nGLboolean GLAD_KHR_robustness = GL_FALSE;\nstatic void load_GL_KHR_robustness(LOADER load) {\n\tif(!GLAD_KHR_robustness) return;\n\tfp_glGetGraphicsResetStatus = (pfn_glGetGraphicsResetStatus)load(\"glGetGraphicsResetStatus\");\n\tfp_glReadnPixels = (pfn_glReadnPixels)load(\"glReadnPixels\");\n\tfp_glGetnUniformfv = (pfn_glGetnUniformfv)load(\"glGetnUniformfv\");\n\tfp_glGetnUniformiv = (pfn_glGetnUniformiv)load(\"glGetnUniformiv\");\n\tfp_glGetnUniformuiv = (pfn_glGetnUniformuiv)load(\"glGetnUniformuiv\");\n\tfp_glGetGraphicsResetStatusKHR = (pfn_glGetGraphicsResetStatusKHR)load(\"glGetGraphicsResetStatusKHR\");\n\tfp_glReadnPixelsKHR = (pfn_glReadnPixelsKHR)load(\"glReadnPixelsKHR\");\n\tfp_glGetnUniformfvKHR = (pfn_glGetnUniformfvKHR)load(\"glGetnUniformfvKHR\");\n\tfp_glGetnUniformivKHR = (pfn_glGetnUniformivKHR)load(\"glGetnUniformivKHR\");\n\tfp_glGetnUniformuivKHR = (pfn_glGetnUniformuivKHR)load(\"glGetnUniformuivKHR\");\n}\n\nGLboolean GLAD_KHR_texture_compression_astc_hdr = GL_FALSE;\nGLboolean GLAD_KHR_texture_compression_astc_ldr = GL_FALSE;\nGLboolean GLAD_KHR_texture_compression_astc_sliced_3d = GL_FALSE;\nGLboolean GLAD_ARB_arrays_of_arrays = GL_FALSE;\nGLboolean GLAD_ARB_base_instance = GL_FALSE;\nstatic void load_GL_ARB_base_instance(LOADER load) {\n\tif(!GLAD_ARB_base_instance) return;\n\tfp_glDrawArraysInstancedBaseInstance = (pfn_glDrawArraysInstancedBaseInstance)load(\"glDrawArraysInstancedBaseInstance\");\n\tfp_glDrawElementsInstancedBaseInstance = (pfn_glDrawElementsInstancedBaseInstance)load(\"glDrawElementsInstancedBaseInstance\");\n\tfp_glDrawElementsInstancedBaseVertexBaseInstance = (pfn_glDrawElementsInstancedBaseVertexBaseInstance)load(\"glDrawElementsInstancedBaseVertexBaseInstance\");\n}\n\nGLboolean GLAD_ARB_bindless_texture = GL_FALSE;\nstatic void load_GL_ARB_bindless_texture(LOADER load) {\n\tif(!GLAD_ARB_bindless_texture) return;\n\tfp_glGetTextureHandleARB = (pfn_glGetTextureHandleARB)load(\"glGetTextureHandleARB\");\n\tfp_glGetTextureSamplerHandleARB = (pfn_glGetTextureSamplerHandleARB)load(\"glGetTextureSamplerHandleARB\");\n\tfp_glMakeTextureHandleResidentARB = (pfn_glMakeTextureHandleResidentARB)load(\"glMakeTextureHandleResidentARB\");\n\tfp_glMakeTextureHandleNonResidentARB = (pfn_glMakeTextureHandleNonResidentARB)load(\"glMakeTextureHandleNonResidentARB\");\n\tfp_glGetImageHandleARB = (pfn_glGetImageHandleARB)load(\"glGetImageHandleARB\");\n\tfp_glMakeImageHandleResidentARB = (pfn_glMakeImageHandleResidentARB)load(\"glMakeImageHandleResidentARB\");\n\tfp_glMakeImageHandleNonResidentARB = (pfn_glMakeImageHandleNonResidentARB)load(\"glMakeImageHandleNonResidentARB\");\n\tfp_glUniformHandleui64ARB = (pfn_glUniformHandleui64ARB)load(\"glUniformHandleui64ARB\");\n\tfp_glUniformHandleui64vARB = (pfn_glUniformHandleui64vARB)load(\"glUniformHandleui64vARB\");\n\tfp_glProgramUniformHandleui64ARB = (pfn_glProgramUniformHandleui64ARB)load(\"glProgramUniformHandleui64ARB\");\n\tfp_glProgramUniformHandleui64vARB = (pfn_glProgramUniformHandleui64vARB)load(\"glProgramUniformHandleui64vARB\");\n\tfp_glIsTextureHandleResidentARB = (pfn_glIsTextureHandleResidentARB)load(\"glIsTextureHandleResidentARB\");\n\tfp_glIsImageHandleResidentARB = (pfn_glIsImageHandleResidentARB)load(\"glIsImageHandleResidentARB\");\n\tfp_glVertexAttribL1ui64ARB = (pfn_glVertexAttribL1ui64ARB)load(\"glVertexAttribL1ui64ARB\");\n\tfp_glVertexAttribL1ui64vARB = (pfn_glVertexAttribL1ui64vARB)load(\"glVertexAttribL1ui64vARB\");\n\tfp_glGetVertexAttribLui64vARB = (pfn_glGetVertexAttribLui64vARB)load(\"glGetVertexAttribLui64vARB\");\n}\n\nGLboolean GLAD_ARB_blend_func_extended = GL_FALSE;\nstatic void load_GL_ARB_blend_func_extended(LOADER load) {\n\tif(!GLAD_ARB_blend_func_extended) return;\n\tfp_glBindFragDataLocationIndexed = (pfn_glBindFragDataLocationIndexed)load(\"glBindFragDataLocationIndexed\");\n\tfp_glGetFragDataIndex = (pfn_glGetFragDataIndex)load(\"glGetFragDataIndex\");\n}\n\nGLboolean GLAD_ARB_buffer_storage = GL_FALSE;\nstatic void load_GL_ARB_buffer_storage(LOADER load) {\n\tif(!GLAD_ARB_buffer_storage) return;\n\tfp_glBufferStorage = (pfn_glBufferStorage)load(\"glBufferStorage\");\n}\n\nGLboolean GLAD_ARB_cl_event = GL_FALSE;\nstatic void load_GL_ARB_cl_event(LOADER load) {\n\tif(!GLAD_ARB_cl_event) return;\n\tfp_glCreateSyncFromCLeventARB = (pfn_glCreateSyncFromCLeventARB)load(\"glCreateSyncFromCLeventARB\");\n}\n\nGLboolean GLAD_ARB_clear_buffer_object = GL_FALSE;\nstatic void load_GL_ARB_clear_buffer_object(LOADER load) {\n\tif(!GLAD_ARB_clear_buffer_object) return;\n\tfp_glClearBufferData = (pfn_glClearBufferData)load(\"glClearBufferData\");\n\tfp_glClearBufferSubData = (pfn_glClearBufferSubData)load(\"glClearBufferSubData\");\n}\n\nGLboolean GLAD_ARB_clear_texture = GL_FALSE;\nstatic void load_GL_ARB_clear_texture(LOADER load) {\n\tif(!GLAD_ARB_clear_texture) return;\n\tfp_glClearTexImage = (pfn_glClearTexImage)load(\"glClearTexImage\");\n\tfp_glClearTexSubImage = (pfn_glClearTexSubImage)load(\"glClearTexSubImage\");\n}\n\nGLboolean GLAD_ARB_clip_control = GL_FALSE;\nstatic void load_GL_ARB_clip_control(LOADER load) {\n\tif(!GLAD_ARB_clip_control) return;\n\tfp_glClipControl = (pfn_glClipControl)load(\"glClipControl\");\n}\n\nGLboolean GLAD_ARB_color_buffer_float = GL_FALSE;\nstatic void load_GL_ARB_color_buffer_float(LOADER load) {\n\tif(!GLAD_ARB_color_buffer_float) return;\n\tfp_glClampColorARB = (pfn_glClampColorARB)load(\"glClampColorARB\");\n}\n\nGLboolean GLAD_ARB_compatibility = GL_FALSE;\nGLboolean GLAD_ARB_compressed_texture_pixel_storage = GL_FALSE;\nGLboolean GLAD_ARB_compute_shader = GL_FALSE;\nstatic void load_GL_ARB_compute_shader(LOADER load) {\n\tif(!GLAD_ARB_compute_shader) return;\n\tfp_glDispatchCompute = (pfn_glDispatchCompute)load(\"glDispatchCompute\");\n\tfp_glDispatchComputeIndirect = (pfn_glDispatchComputeIndirect)load(\"glDispatchComputeIndirect\");\n}\n\nGLboolean GLAD_ARB_compute_variable_group_size = GL_FALSE;\nstatic void load_GL_ARB_compute_variable_group_size(LOADER load) {\n\tif(!GLAD_ARB_compute_variable_group_size) return;\n\tfp_glDispatchComputeGroupSizeARB = (pfn_glDispatchComputeGroupSizeARB)load(\"glDispatchComputeGroupSizeARB\");\n}\n\nGLboolean GLAD_ARB_conditional_render_inverted = GL_FALSE;\nGLboolean GLAD_ARB_conservative_depth = GL_FALSE;\nGLboolean GLAD_ARB_copy_buffer = GL_FALSE;\nstatic void load_GL_ARB_copy_buffer(LOADER load) {\n\tif(!GLAD_ARB_copy_buffer) return;\n\tfp_glCopyBufferSubData = (pfn_glCopyBufferSubData)load(\"glCopyBufferSubData\");\n}\n\nGLboolean GLAD_ARB_copy_image = GL_FALSE;\nstatic void load_GL_ARB_copy_image(LOADER load) {\n\tif(!GLAD_ARB_copy_image) return;\n\tfp_glCopyImageSubData = (pfn_glCopyImageSubData)load(\"glCopyImageSubData\");\n}\n\nGLboolean GLAD_ARB_cull_distance = GL_FALSE;\nGLboolean GLAD_ARB_debug_output = GL_FALSE;\nstatic void load_GL_ARB_debug_output(LOADER load) {\n\tif(!GLAD_ARB_debug_output) return;\n\tfp_glDebugMessageControlARB = (pfn_glDebugMessageControlARB)load(\"glDebugMessageControlARB\");\n\tfp_glDebugMessageInsertARB = (pfn_glDebugMessageInsertARB)load(\"glDebugMessageInsertARB\");\n\tfp_glDebugMessageCallbackARB = (pfn_glDebugMessageCallbackARB)load(\"glDebugMessageCallbackARB\");\n\tfp_glGetDebugMessageLogARB = (pfn_glGetDebugMessageLogARB)load(\"glGetDebugMessageLogARB\");\n}\n\nGLboolean GLAD_ARB_depth_buffer_float = GL_FALSE;\nGLboolean GLAD_ARB_depth_clamp = GL_FALSE;\nGLboolean GLAD_ARB_derivative_control = GL_FALSE;\nGLboolean GLAD_ARB_direct_state_access = GL_FALSE;\nstatic void load_GL_ARB_direct_state_access(LOADER load) {\n\tif(!GLAD_ARB_direct_state_access) return;\n\tfp_glCreateTransformFeedbacks = (pfn_glCreateTransformFeedbacks)load(\"glCreateTransformFeedbacks\");\n\tfp_glTransformFeedbackBufferBase = (pfn_glTransformFeedbackBufferBase)load(\"glTransformFeedbackBufferBase\");\n\tfp_glTransformFeedbackBufferRange = (pfn_glTransformFeedbackBufferRange)load(\"glTransformFeedbackBufferRange\");\n\tfp_glGetTransformFeedbackiv = (pfn_glGetTransformFeedbackiv)load(\"glGetTransformFeedbackiv\");\n\tfp_glGetTransformFeedbacki_v = (pfn_glGetTransformFeedbacki_v)load(\"glGetTransformFeedbacki_v\");\n\tfp_glGetTransformFeedbacki64_v = (pfn_glGetTransformFeedbacki64_v)load(\"glGetTransformFeedbacki64_v\");\n\tfp_glCreateBuffers = (pfn_glCreateBuffers)load(\"glCreateBuffers\");\n\tfp_glNamedBufferStorage = (pfn_glNamedBufferStorage)load(\"glNamedBufferStorage\");\n\tfp_glNamedBufferData = (pfn_glNamedBufferData)load(\"glNamedBufferData\");\n\tfp_glNamedBufferSubData = (pfn_glNamedBufferSubData)load(\"glNamedBufferSubData\");\n\tfp_glCopyNamedBufferSubData = (pfn_glCopyNamedBufferSubData)load(\"glCopyNamedBufferSubData\");\n\tfp_glClearNamedBufferData = (pfn_glClearNamedBufferData)load(\"glClearNamedBufferData\");\n\tfp_glClearNamedBufferSubData = (pfn_glClearNamedBufferSubData)load(\"glClearNamedBufferSubData\");\n\tfp_glMapNamedBuffer = (pfn_glMapNamedBuffer)load(\"glMapNamedBuffer\");\n\tfp_glMapNamedBufferRange = (pfn_glMapNamedBufferRange)load(\"glMapNamedBufferRange\");\n\tfp_glUnmapNamedBuffer = (pfn_glUnmapNamedBuffer)load(\"glUnmapNamedBuffer\");\n\tfp_glFlushMappedNamedBufferRange = (pfn_glFlushMappedNamedBufferRange)load(\"glFlushMappedNamedBufferRange\");\n\tfp_glGetNamedBufferParameteriv = (pfn_glGetNamedBufferParameteriv)load(\"glGetNamedBufferParameteriv\");\n\tfp_glGetNamedBufferParameteri64v = (pfn_glGetNamedBufferParameteri64v)load(\"glGetNamedBufferParameteri64v\");\n\tfp_glGetNamedBufferPointerv = (pfn_glGetNamedBufferPointerv)load(\"glGetNamedBufferPointerv\");\n\tfp_glGetNamedBufferSubData = (pfn_glGetNamedBufferSubData)load(\"glGetNamedBufferSubData\");\n\tfp_glCreateFramebuffers = (pfn_glCreateFramebuffers)load(\"glCreateFramebuffers\");\n\tfp_glNamedFramebufferRenderbuffer = (pfn_glNamedFramebufferRenderbuffer)load(\"glNamedFramebufferRenderbuffer\");\n\tfp_glNamedFramebufferParameteri = (pfn_glNamedFramebufferParameteri)load(\"glNamedFramebufferParameteri\");\n\tfp_glNamedFramebufferTexture = (pfn_glNamedFramebufferTexture)load(\"glNamedFramebufferTexture\");\n\tfp_glNamedFramebufferTextureLayer = (pfn_glNamedFramebufferTextureLayer)load(\"glNamedFramebufferTextureLayer\");\n\tfp_glNamedFramebufferDrawBuffer = (pfn_glNamedFramebufferDrawBuffer)load(\"glNamedFramebufferDrawBuffer\");\n\tfp_glNamedFramebufferDrawBuffers = (pfn_glNamedFramebufferDrawBuffers)load(\"glNamedFramebufferDrawBuffers\");\n\tfp_glNamedFramebufferReadBuffer = (pfn_glNamedFramebufferReadBuffer)load(\"glNamedFramebufferReadBuffer\");\n\tfp_glInvalidateNamedFramebufferData = (pfn_glInvalidateNamedFramebufferData)load(\"glInvalidateNamedFramebufferData\");\n\tfp_glInvalidateNamedFramebufferSubData = (pfn_glInvalidateNamedFramebufferSubData)load(\"glInvalidateNamedFramebufferSubData\");\n\tfp_glClearNamedFramebufferiv = (pfn_glClearNamedFramebufferiv)load(\"glClearNamedFramebufferiv\");\n\tfp_glClearNamedFramebufferuiv = (pfn_glClearNamedFramebufferuiv)load(\"glClearNamedFramebufferuiv\");\n\tfp_glClearNamedFramebufferfv = (pfn_glClearNamedFramebufferfv)load(\"glClearNamedFramebufferfv\");\n\tfp_glClearNamedFramebufferfi = (pfn_glClearNamedFramebufferfi)load(\"glClearNamedFramebufferfi\");\n\tfp_glBlitNamedFramebuffer = (pfn_glBlitNamedFramebuffer)load(\"glBlitNamedFramebuffer\");\n\tfp_glCheckNamedFramebufferStatus = (pfn_glCheckNamedFramebufferStatus)load(\"glCheckNamedFramebufferStatus\");\n\tfp_glGetNamedFramebufferParameteriv = (pfn_glGetNamedFramebufferParameteriv)load(\"glGetNamedFramebufferParameteriv\");\n\tfp_glGetNamedFramebufferAttachmentParameteriv = (pfn_glGetNamedFramebufferAttachmentParameteriv)load(\"glGetNamedFramebufferAttachmentParameteriv\");\n\tfp_glCreateRenderbuffers = (pfn_glCreateRenderbuffers)load(\"glCreateRenderbuffers\");\n\tfp_glNamedRenderbufferStorage = (pfn_glNamedRenderbufferStorage)load(\"glNamedRenderbufferStorage\");\n\tfp_glNamedRenderbufferStorageMultisample = (pfn_glNamedRenderbufferStorageMultisample)load(\"glNamedRenderbufferStorageMultisample\");\n\tfp_glGetNamedRenderbufferParameteriv = (pfn_glGetNamedRenderbufferParameteriv)load(\"glGetNamedRenderbufferParameteriv\");\n\tfp_glCreateTextures = (pfn_glCreateTextures)load(\"glCreateTextures\");\n\tfp_glTextureBuffer = (pfn_glTextureBuffer)load(\"glTextureBuffer\");\n\tfp_glTextureBufferRange = (pfn_glTextureBufferRange)load(\"glTextureBufferRange\");\n\tfp_glTextureStorage1D = (pfn_glTextureStorage1D)load(\"glTextureStorage1D\");\n\tfp_glTextureStorage2D = (pfn_glTextureStorage2D)load(\"glTextureStorage2D\");\n\tfp_glTextureStorage3D = (pfn_glTextureStorage3D)load(\"glTextureStorage3D\");\n\tfp_glTextureStorage2DMultisample = (pfn_glTextureStorage2DMultisample)load(\"glTextureStorage2DMultisample\");\n\tfp_glTextureStorage3DMultisample = (pfn_glTextureStorage3DMultisample)load(\"glTextureStorage3DMultisample\");\n\tfp_glTextureSubImage1D = (pfn_glTextureSubImage1D)load(\"glTextureSubImage1D\");\n\tfp_glTextureSubImage2D = (pfn_glTextureSubImage2D)load(\"glTextureSubImage2D\");\n\tfp_glTextureSubImage3D = (pfn_glTextureSubImage3D)load(\"glTextureSubImage3D\");\n\tfp_glCompressedTextureSubImage1D = (pfn_glCompressedTextureSubImage1D)load(\"glCompressedTextureSubImage1D\");\n\tfp_glCompressedTextureSubImage2D = (pfn_glCompressedTextureSubImage2D)load(\"glCompressedTextureSubImage2D\");\n\tfp_glCompressedTextureSubImage3D = (pfn_glCompressedTextureSubImage3D)load(\"glCompressedTextureSubImage3D\");\n\tfp_glCopyTextureSubImage1D = (pfn_glCopyTextureSubImage1D)load(\"glCopyTextureSubImage1D\");\n\tfp_glCopyTextureSubImage2D = (pfn_glCopyTextureSubImage2D)load(\"glCopyTextureSubImage2D\");\n\tfp_glCopyTextureSubImage3D = (pfn_glCopyTextureSubImage3D)load(\"glCopyTextureSubImage3D\");\n\tfp_glTextureParameterf = (pfn_glTextureParameterf)load(\"glTextureParameterf\");\n\tfp_glTextureParameterfv = (pfn_glTextureParameterfv)load(\"glTextureParameterfv\");\n\tfp_glTextureParameteri = (pfn_glTextureParameteri)load(\"glTextureParameteri\");\n\tfp_glTextureParameterIiv = (pfn_glTextureParameterIiv)load(\"glTextureParameterIiv\");\n\tfp_glTextureParameterIuiv = (pfn_glTextureParameterIuiv)load(\"glTextureParameterIuiv\");\n\tfp_glTextureParameteriv = (pfn_glTextureParameteriv)load(\"glTextureParameteriv\");\n\tfp_glGenerateTextureMipmap = (pfn_glGenerateTextureMipmap)load(\"glGenerateTextureMipmap\");\n\tfp_glBindTextureUnit = (pfn_glBindTextureUnit)load(\"glBindTextureUnit\");\n\tfp_glGetTextureImage = (pfn_glGetTextureImage)load(\"glGetTextureImage\");\n\tfp_glGetCompressedTextureImage = (pfn_glGetCompressedTextureImage)load(\"glGetCompressedTextureImage\");\n\tfp_glGetTextureLevelParameterfv = (pfn_glGetTextureLevelParameterfv)load(\"glGetTextureLevelParameterfv\");\n\tfp_glGetTextureLevelParameteriv = (pfn_glGetTextureLevelParameteriv)load(\"glGetTextureLevelParameteriv\");\n\tfp_glGetTextureParameterfv = (pfn_glGetTextureParameterfv)load(\"glGetTextureParameterfv\");\n\tfp_glGetTextureParameterIiv = (pfn_glGetTextureParameterIiv)load(\"glGetTextureParameterIiv\");\n\tfp_glGetTextureParameterIuiv = (pfn_glGetTextureParameterIuiv)load(\"glGetTextureParameterIuiv\");\n\tfp_glGetTextureParameteriv = (pfn_glGetTextureParameteriv)load(\"glGetTextureParameteriv\");\n\tfp_glCreateVertexArrays = (pfn_glCreateVertexArrays)load(\"glCreateVertexArrays\");\n\tfp_glDisableVertexArrayAttrib = (pfn_glDisableVertexArrayAttrib)load(\"glDisableVertexArrayAttrib\");\n\tfp_glEnableVertexArrayAttrib = (pfn_glEnableVertexArrayAttrib)load(\"glEnableVertexArrayAttrib\");\n\tfp_glVertexArrayElementBuffer = (pfn_glVertexArrayElementBuffer)load(\"glVertexArrayElementBuffer\");\n\tfp_glVertexArrayVertexBuffer = (pfn_glVertexArrayVertexBuffer)load(\"glVertexArrayVertexBuffer\");\n\tfp_glVertexArrayVertexBuffers = (pfn_glVertexArrayVertexBuffers)load(\"glVertexArrayVertexBuffers\");\n\tfp_glVertexArrayAttribBinding = (pfn_glVertexArrayAttribBinding)load(\"glVertexArrayAttribBinding\");\n\tfp_glVertexArrayAttribFormat = (pfn_glVertexArrayAttribFormat)load(\"glVertexArrayAttribFormat\");\n\tfp_glVertexArrayAttribIFormat = (pfn_glVertexArrayAttribIFormat)load(\"glVertexArrayAttribIFormat\");\n\tfp_glVertexArrayAttribLFormat = (pfn_glVertexArrayAttribLFormat)load(\"glVertexArrayAttribLFormat\");\n\tfp_glVertexArrayBindingDivisor = (pfn_glVertexArrayBindingDivisor)load(\"glVertexArrayBindingDivisor\");\n\tfp_glGetVertexArrayiv = (pfn_glGetVertexArrayiv)load(\"glGetVertexArrayiv\");\n\tfp_glGetVertexArrayIndexediv = (pfn_glGetVertexArrayIndexediv)load(\"glGetVertexArrayIndexediv\");\n\tfp_glGetVertexArrayIndexed64iv = (pfn_glGetVertexArrayIndexed64iv)load(\"glGetVertexArrayIndexed64iv\");\n\tfp_glCreateSamplers = (pfn_glCreateSamplers)load(\"glCreateSamplers\");\n\tfp_glCreateProgramPipelines = (pfn_glCreateProgramPipelines)load(\"glCreateProgramPipelines\");\n\tfp_glCreateQueries = (pfn_glCreateQueries)load(\"glCreateQueries\");\n\tfp_glGetQueryBufferObjecti64v = (pfn_glGetQueryBufferObjecti64v)load(\"glGetQueryBufferObjecti64v\");\n\tfp_glGetQueryBufferObjectiv = (pfn_glGetQueryBufferObjectiv)load(\"glGetQueryBufferObjectiv\");\n\tfp_glGetQueryBufferObjectui64v = (pfn_glGetQueryBufferObjectui64v)load(\"glGetQueryBufferObjectui64v\");\n\tfp_glGetQueryBufferObjectuiv = (pfn_glGetQueryBufferObjectuiv)load(\"glGetQueryBufferObjectuiv\");\n}\n\nGLboolean GLAD_ARB_draw_buffers_blend = GL_FALSE;\nstatic void load_GL_ARB_draw_buffers_blend(LOADER load) {\n\tif(!GLAD_ARB_draw_buffers_blend) return;\n\tfp_glBlendEquationiARB = (pfn_glBlendEquationiARB)load(\"glBlendEquationiARB\");\n\tfp_glBlendEquationSeparateiARB = (pfn_glBlendEquationSeparateiARB)load(\"glBlendEquationSeparateiARB\");\n\tfp_glBlendFunciARB = (pfn_glBlendFunciARB)load(\"glBlendFunciARB\");\n\tfp_glBlendFuncSeparateiARB = (pfn_glBlendFuncSeparateiARB)load(\"glBlendFuncSeparateiARB\");\n}\n\nGLboolean GLAD_ARB_draw_elements_base_vertex = GL_FALSE;\nstatic void load_GL_ARB_draw_elements_base_vertex(LOADER load) {\n\tif(!GLAD_ARB_draw_elements_base_vertex) return;\n\tfp_glDrawElementsBaseVertex = (pfn_glDrawElementsBaseVertex)load(\"glDrawElementsBaseVertex\");\n\tfp_glDrawRangeElementsBaseVertex = (pfn_glDrawRangeElementsBaseVertex)load(\"glDrawRangeElementsBaseVertex\");\n\tfp_glDrawElementsInstancedBaseVertex = (pfn_glDrawElementsInstancedBaseVertex)load(\"glDrawElementsInstancedBaseVertex\");\n\tfp_glMultiDrawElementsBaseVertex = (pfn_glMultiDrawElementsBaseVertex)load(\"glMultiDrawElementsBaseVertex\");\n}\n\nGLboolean GLAD_ARB_draw_indirect = GL_FALSE;\nstatic void load_GL_ARB_draw_indirect(LOADER load) {\n\tif(!GLAD_ARB_draw_indirect) return;\n\tfp_glDrawArraysIndirect = (pfn_glDrawArraysIndirect)load(\"glDrawArraysIndirect\");\n\tfp_glDrawElementsIndirect = (pfn_glDrawElementsIndirect)load(\"glDrawElementsIndirect\");\n}\n\nGLboolean GLAD_ARB_draw_instanced = GL_FALSE;\nstatic void load_GL_ARB_draw_instanced(LOADER load) {\n\tif(!GLAD_ARB_draw_instanced) return;\n\tfp_glDrawArraysInstancedARB = (pfn_glDrawArraysInstancedARB)load(\"glDrawArraysInstancedARB\");\n\tfp_glDrawElementsInstancedARB = (pfn_glDrawElementsInstancedARB)load(\"glDrawElementsInstancedARB\");\n}\n\nGLboolean GLAD_ARB_enhanced_layouts = GL_FALSE;\nGLboolean GLAD_ARB_ES2_compatibility = GL_FALSE;\nstatic void load_GL_ARB_ES2_compatibility(LOADER load) {\n\tif(!GLAD_ARB_ES2_compatibility) return;\n\tfp_glReleaseShaderCompiler = (pfn_glReleaseShaderCompiler)load(\"glReleaseShaderCompiler\");\n\tfp_glShaderBinary = (pfn_glShaderBinary)load(\"glShaderBinary\");\n\tfp_glGetShaderPrecisionFormat = (pfn_glGetShaderPrecisionFormat)load(\"glGetShaderPrecisionFormat\");\n\tfp_glDepthRangef = (pfn_glDepthRangef)load(\"glDepthRangef\");\n\tfp_glClearDepthf = (pfn_glClearDepthf)load(\"glClearDepthf\");\n}\n\nGLboolean GLAD_ARB_ES3_1_compatibility = GL_FALSE;\nstatic void load_GL_ARB_ES3_1_compatibility(LOADER load) {\n\tif(!GLAD_ARB_ES3_1_compatibility) return;\n\tfp_glMemoryBarrierByRegion = (pfn_glMemoryBarrierByRegion)load(\"glMemoryBarrierByRegion\");\n}\n\nGLboolean GLAD_ARB_ES3_2_compatibility = GL_FALSE;\nstatic void load_GL_ARB_ES3_2_compatibility(LOADER load) {\n\tif(!GLAD_ARB_ES3_2_compatibility) return;\n\tfp_glPrimitiveBoundingBoxARB = (pfn_glPrimitiveBoundingBoxARB)load(\"glPrimitiveBoundingBoxARB\");\n}\n\nGLboolean GLAD_ARB_ES3_compatibility = GL_FALSE;\nGLboolean GLAD_ARB_explicit_attrib_location = GL_FALSE;\nGLboolean GLAD_ARB_explicit_uniform_location = GL_FALSE;\nGLboolean GLAD_ARB_fragment_coord_conventions = GL_FALSE;\nGLboolean GLAD_ARB_fragment_layer_viewport = GL_FALSE;\nGLboolean GLAD_ARB_fragment_shader_interlock = GL_FALSE;\nGLboolean GLAD_ARB_framebuffer_no_attachments = GL_FALSE;\nstatic void load_GL_ARB_framebuffer_no_attachments(LOADER load) {\n\tif(!GLAD_ARB_framebuffer_no_attachments) return;\n\tfp_glFramebufferParameteri = (pfn_glFramebufferParameteri)load(\"glFramebufferParameteri\");\n\tfp_glGetFramebufferParameteriv = (pfn_glGetFramebufferParameteriv)load(\"glGetFramebufferParameteriv\");\n}\n\nGLboolean GLAD_ARB_framebuffer_object = GL_FALSE;\nstatic void load_GL_ARB_framebuffer_object(LOADER load) {\n\tif(!GLAD_ARB_framebuffer_object) return;\n\tfp_glIsRenderbuffer = (pfn_glIsRenderbuffer)load(\"glIsRenderbuffer\");\n\tfp_glBindRenderbuffer = (pfn_glBindRenderbuffer)load(\"glBindRenderbuffer\");\n\tfp_glDeleteRenderbuffers = (pfn_glDeleteRenderbuffers)load(\"glDeleteRenderbuffers\");\n\tfp_glGenRenderbuffers = (pfn_glGenRenderbuffers)load(\"glGenRenderbuffers\");\n\tfp_glRenderbufferStorage = (pfn_glRenderbufferStorage)load(\"glRenderbufferStorage\");\n\tfp_glGetRenderbufferParameteriv = (pfn_glGetRenderbufferParameteriv)load(\"glGetRenderbufferParameteriv\");\n\tfp_glIsFramebuffer = (pfn_glIsFramebuffer)load(\"glIsFramebuffer\");\n\tfp_glBindFramebuffer = (pfn_glBindFramebuffer)load(\"glBindFramebuffer\");\n\tfp_glDeleteFramebuffers = (pfn_glDeleteFramebuffers)load(\"glDeleteFramebuffers\");\n\tfp_glGenFramebuffers = (pfn_glGenFramebuffers)load(\"glGenFramebuffers\");\n\tfp_glCheckFramebufferStatus = (pfn_glCheckFramebufferStatus)load(\"glCheckFramebufferStatus\");\n\tfp_glFramebufferTexture1D = (pfn_glFramebufferTexture1D)load(\"glFramebufferTexture1D\");\n\tfp_glFramebufferTexture2D = (pfn_glFramebufferTexture2D)load(\"glFramebufferTexture2D\");\n\tfp_glFramebufferTexture3D = (pfn_glFramebufferTexture3D)load(\"glFramebufferTexture3D\");\n\tfp_glFramebufferRenderbuffer = (pfn_glFramebufferRenderbuffer)load(\"glFramebufferRenderbuffer\");\n\tfp_glGetFramebufferAttachmentParameteriv = (pfn_glGetFramebufferAttachmentParameteriv)load(\"glGetFramebufferAttachmentParameteriv\");\n\tfp_glGenerateMipmap = (pfn_glGenerateMipmap)load(\"glGenerateMipmap\");\n\tfp_glBlitFramebuffer = (pfn_glBlitFramebuffer)load(\"glBlitFramebuffer\");\n\tfp_glRenderbufferStorageMultisample = (pfn_glRenderbufferStorageMultisample)load(\"glRenderbufferStorageMultisample\");\n\tfp_glFramebufferTextureLayer = (pfn_glFramebufferTextureLayer)load(\"glFramebufferTextureLayer\");\n}\n\nGLboolean GLAD_ARB_framebuffer_sRGB = GL_FALSE;\nGLboolean GLAD_ARB_geometry_shader4 = GL_FALSE;\nstatic void load_GL_ARB_geometry_shader4(LOADER load) {\n\tif(!GLAD_ARB_geometry_shader4) return;\n\tfp_glProgramParameteriARB = (pfn_glProgramParameteriARB)load(\"glProgramParameteriARB\");\n\tfp_glFramebufferTextureARB = (pfn_glFramebufferTextureARB)load(\"glFramebufferTextureARB\");\n\tfp_glFramebufferTextureLayerARB = (pfn_glFramebufferTextureLayerARB)load(\"glFramebufferTextureLayerARB\");\n\tfp_glFramebufferTextureFaceARB = (pfn_glFramebufferTextureFaceARB)load(\"glFramebufferTextureFaceARB\");\n}\n\nGLboolean GLAD_ARB_get_program_binary = GL_FALSE;\nstatic void load_GL_ARB_get_program_binary(LOADER load) {\n\tif(!GLAD_ARB_get_program_binary) return;\n\tfp_glGetProgramBinary = (pfn_glGetProgramBinary)load(\"glGetProgramBinary\");\n\tfp_glProgramBinary = (pfn_glProgramBinary)load(\"glProgramBinary\");\n\tfp_glProgramParameteri = (pfn_glProgramParameteri)load(\"glProgramParameteri\");\n}\n\nGLboolean GLAD_ARB_get_texture_sub_image = GL_FALSE;\nstatic void load_GL_ARB_get_texture_sub_image(LOADER load) {\n\tif(!GLAD_ARB_get_texture_sub_image) return;\n\tfp_glGetTextureSubImage = (pfn_glGetTextureSubImage)load(\"glGetTextureSubImage\");\n\tfp_glGetCompressedTextureSubImage = (pfn_glGetCompressedTextureSubImage)load(\"glGetCompressedTextureSubImage\");\n}\n\nGLboolean GLAD_ARB_gpu_shader5 = GL_FALSE;\nGLboolean GLAD_ARB_gpu_shader_fp64 = GL_FALSE;\nstatic void load_GL_ARB_gpu_shader_fp64(LOADER load) {\n\tif(!GLAD_ARB_gpu_shader_fp64) return;\n\tfp_glUniform1d = (pfn_glUniform1d)load(\"glUniform1d\");\n\tfp_glUniform2d = (pfn_glUniform2d)load(\"glUniform2d\");\n\tfp_glUniform3d = (pfn_glUniform3d)load(\"glUniform3d\");\n\tfp_glUniform4d = (pfn_glUniform4d)load(\"glUniform4d\");\n\tfp_glUniform1dv = (pfn_glUniform1dv)load(\"glUniform1dv\");\n\tfp_glUniform2dv = (pfn_glUniform2dv)load(\"glUniform2dv\");\n\tfp_glUniform3dv = (pfn_glUniform3dv)load(\"glUniform3dv\");\n\tfp_glUniform4dv = (pfn_glUniform4dv)load(\"glUniform4dv\");\n\tfp_glUniformMatrix2dv = (pfn_glUniformMatrix2dv)load(\"glUniformMatrix2dv\");\n\tfp_glUniformMatrix3dv = (pfn_glUniformMatrix3dv)load(\"glUniformMatrix3dv\");\n\tfp_glUniformMatrix4dv = (pfn_glUniformMatrix4dv)load(\"glUniformMatrix4dv\");\n\tfp_glUniformMatrix2x3dv = (pfn_glUniformMatrix2x3dv)load(\"glUniformMatrix2x3dv\");\n\tfp_glUniformMatrix2x4dv = (pfn_glUniformMatrix2x4dv)load(\"glUniformMatrix2x4dv\");\n\tfp_glUniformMatrix3x2dv = (pfn_glUniformMatrix3x2dv)load(\"glUniformMatrix3x2dv\");\n\tfp_glUniformMatrix3x4dv = (pfn_glUniformMatrix3x4dv)load(\"glUniformMatrix3x4dv\");\n\tfp_glUniformMatrix4x2dv = (pfn_glUniformMatrix4x2dv)load(\"glUniformMatrix4x2dv\");\n\tfp_glUniformMatrix4x3dv = (pfn_glUniformMatrix4x3dv)load(\"glUniformMatrix4x3dv\");\n\tfp_glGetUniformdv = (pfn_glGetUniformdv)load(\"glGetUniformdv\");\n}\n\nGLboolean GLAD_ARB_gpu_shader_int64 = GL_FALSE;\nstatic void load_GL_ARB_gpu_shader_int64(LOADER load) {\n\tif(!GLAD_ARB_gpu_shader_int64) return;\n\tfp_glUniform1i64ARB = (pfn_glUniform1i64ARB)load(\"glUniform1i64ARB\");\n\tfp_glUniform2i64ARB = (pfn_glUniform2i64ARB)load(\"glUniform2i64ARB\");\n\tfp_glUniform3i64ARB = (pfn_glUniform3i64ARB)load(\"glUniform3i64ARB\");\n\tfp_glUniform4i64ARB = (pfn_glUniform4i64ARB)load(\"glUniform4i64ARB\");\n\tfp_glUniform1i64vARB = (pfn_glUniform1i64vARB)load(\"glUniform1i64vARB\");\n\tfp_glUniform2i64vARB = (pfn_glUniform2i64vARB)load(\"glUniform2i64vARB\");\n\tfp_glUniform3i64vARB = (pfn_glUniform3i64vARB)load(\"glUniform3i64vARB\");\n\tfp_glUniform4i64vARB = (pfn_glUniform4i64vARB)load(\"glUniform4i64vARB\");\n\tfp_glUniform1ui64ARB = (pfn_glUniform1ui64ARB)load(\"glUniform1ui64ARB\");\n\tfp_glUniform2ui64ARB = (pfn_glUniform2ui64ARB)load(\"glUniform2ui64ARB\");\n\tfp_glUniform3ui64ARB = (pfn_glUniform3ui64ARB)load(\"glUniform3ui64ARB\");\n\tfp_glUniform4ui64ARB = (pfn_glUniform4ui64ARB)load(\"glUniform4ui64ARB\");\n\tfp_glUniform1ui64vARB = (pfn_glUniform1ui64vARB)load(\"glUniform1ui64vARB\");\n\tfp_glUniform2ui64vARB = (pfn_glUniform2ui64vARB)load(\"glUniform2ui64vARB\");\n\tfp_glUniform3ui64vARB = (pfn_glUniform3ui64vARB)load(\"glUniform3ui64vARB\");\n\tfp_glUniform4ui64vARB = (pfn_glUniform4ui64vARB)load(\"glUniform4ui64vARB\");\n\tfp_glGetUniformi64vARB = (pfn_glGetUniformi64vARB)load(\"glGetUniformi64vARB\");\n\tfp_glGetUniformui64vARB = (pfn_glGetUniformui64vARB)load(\"glGetUniformui64vARB\");\n\tfp_glGetnUniformi64vARB = (pfn_glGetnUniformi64vARB)load(\"glGetnUniformi64vARB\");\n\tfp_glGetnUniformui64vARB = (pfn_glGetnUniformui64vARB)load(\"glGetnUniformui64vARB\");\n\tfp_glProgramUniform1i64ARB = (pfn_glProgramUniform1i64ARB)load(\"glProgramUniform1i64ARB\");\n\tfp_glProgramUniform2i64ARB = (pfn_glProgramUniform2i64ARB)load(\"glProgramUniform2i64ARB\");\n\tfp_glProgramUniform3i64ARB = (pfn_glProgramUniform3i64ARB)load(\"glProgramUniform3i64ARB\");\n\tfp_glProgramUniform4i64ARB = (pfn_glProgramUniform4i64ARB)load(\"glProgramUniform4i64ARB\");\n\tfp_glProgramUniform1i64vARB = (pfn_glProgramUniform1i64vARB)load(\"glProgramUniform1i64vARB\");\n\tfp_glProgramUniform2i64vARB = (pfn_glProgramUniform2i64vARB)load(\"glProgramUniform2i64vARB\");\n\tfp_glProgramUniform3i64vARB = (pfn_glProgramUniform3i64vARB)load(\"glProgramUniform3i64vARB\");\n\tfp_glProgramUniform4i64vARB = (pfn_glProgramUniform4i64vARB)load(\"glProgramUniform4i64vARB\");\n\tfp_glProgramUniform1ui64ARB = (pfn_glProgramUniform1ui64ARB)load(\"glProgramUniform1ui64ARB\");\n\tfp_glProgramUniform2ui64ARB = (pfn_glProgramUniform2ui64ARB)load(\"glProgramUniform2ui64ARB\");\n\tfp_glProgramUniform3ui64ARB = (pfn_glProgramUniform3ui64ARB)load(\"glProgramUniform3ui64ARB\");\n\tfp_glProgramUniform4ui64ARB = (pfn_glProgramUniform4ui64ARB)load(\"glProgramUniform4ui64ARB\");\n\tfp_glProgramUniform1ui64vARB = (pfn_glProgramUniform1ui64vARB)load(\"glProgramUniform1ui64vARB\");\n\tfp_glProgramUniform2ui64vARB = (pfn_glProgramUniform2ui64vARB)load(\"glProgramUniform2ui64vARB\");\n\tfp_glProgramUniform3ui64vARB = (pfn_glProgramUniform3ui64vARB)load(\"glProgramUniform3ui64vARB\");\n\tfp_glProgramUniform4ui64vARB = (pfn_glProgramUniform4ui64vARB)load(\"glProgramUniform4ui64vARB\");\n}\n\nGLboolean GLAD_ARB_half_float_pixel = GL_FALSE;\nGLboolean GLAD_ARB_half_float_vertex = GL_FALSE;\nGLboolean GLAD_ARB_indirect_parameters = GL_FALSE;\nstatic void load_GL_ARB_indirect_parameters(LOADER load) {\n\tif(!GLAD_ARB_indirect_parameters) return;\n\tfp_glMultiDrawArraysIndirectCountARB = (pfn_glMultiDrawArraysIndirectCountARB)load(\"glMultiDrawArraysIndirectCountARB\");\n\tfp_glMultiDrawElementsIndirectCountARB = (pfn_glMultiDrawElementsIndirectCountARB)load(\"glMultiDrawElementsIndirectCountARB\");\n}\n\nGLboolean GLAD_ARB_instanced_arrays = GL_FALSE;\nstatic void load_GL_ARB_instanced_arrays(LOADER load) {\n\tif(!GLAD_ARB_instanced_arrays) return;\n\tfp_glVertexAttribDivisorARB = (pfn_glVertexAttribDivisorARB)load(\"glVertexAttribDivisorARB\");\n}\n\nGLboolean GLAD_ARB_internalformat_query = GL_FALSE;\nstatic void load_GL_ARB_internalformat_query(LOADER load) {\n\tif(!GLAD_ARB_internalformat_query) return;\n\tfp_glGetInternalformativ = (pfn_glGetInternalformativ)load(\"glGetInternalformativ\");\n}\n\nGLboolean GLAD_ARB_internalformat_query2 = GL_FALSE;\nstatic void load_GL_ARB_internalformat_query2(LOADER load) {\n\tif(!GLAD_ARB_internalformat_query2) return;\n\tfp_glGetInternalformati64v = (pfn_glGetInternalformati64v)load(\"glGetInternalformati64v\");\n}\n\nGLboolean GLAD_ARB_invalidate_subdata = GL_FALSE;\nstatic void load_GL_ARB_invalidate_subdata(LOADER load) {\n\tif(!GLAD_ARB_invalidate_subdata) return;\n\tfp_glInvalidateTexSubImage = (pfn_glInvalidateTexSubImage)load(\"glInvalidateTexSubImage\");\n\tfp_glInvalidateTexImage = (pfn_glInvalidateTexImage)load(\"glInvalidateTexImage\");\n\tfp_glInvalidateBufferSubData = (pfn_glInvalidateBufferSubData)load(\"glInvalidateBufferSubData\");\n\tfp_glInvalidateBufferData = (pfn_glInvalidateBufferData)load(\"glInvalidateBufferData\");\n\tfp_glInvalidateFramebuffer = (pfn_glInvalidateFramebuffer)load(\"glInvalidateFramebuffer\");\n\tfp_glInvalidateSubFramebuffer = (pfn_glInvalidateSubFramebuffer)load(\"glInvalidateSubFramebuffer\");\n}\n\nGLboolean GLAD_ARB_map_buffer_alignment = GL_FALSE;\nGLboolean GLAD_ARB_map_buffer_range = GL_FALSE;\nstatic void load_GL_ARB_map_buffer_range(LOADER load) {\n\tif(!GLAD_ARB_map_buffer_range) return;\n\tfp_glMapBufferRange = (pfn_glMapBufferRange)load(\"glMapBufferRange\");\n\tfp_glFlushMappedBufferRange = (pfn_glFlushMappedBufferRange)load(\"glFlushMappedBufferRange\");\n}\n\nGLboolean GLAD_ARB_multi_bind = GL_FALSE;\nstatic void load_GL_ARB_multi_bind(LOADER load) {\n\tif(!GLAD_ARB_multi_bind) return;\n\tfp_glBindBuffersBase = (pfn_glBindBuffersBase)load(\"glBindBuffersBase\");\n\tfp_glBindBuffersRange = (pfn_glBindBuffersRange)load(\"glBindBuffersRange\");\n\tfp_glBindTextures = (pfn_glBindTextures)load(\"glBindTextures\");\n\tfp_glBindSamplers = (pfn_glBindSamplers)load(\"glBindSamplers\");\n\tfp_glBindImageTextures = (pfn_glBindImageTextures)load(\"glBindImageTextures\");\n\tfp_glBindVertexBuffers = (pfn_glBindVertexBuffers)load(\"glBindVertexBuffers\");\n}\n\nGLboolean GLAD_ARB_multi_draw_indirect = GL_FALSE;\nstatic void load_GL_ARB_multi_draw_indirect(LOADER load) {\n\tif(!GLAD_ARB_multi_draw_indirect) return;\n\tfp_glMultiDrawArraysIndirect = (pfn_glMultiDrawArraysIndirect)load(\"glMultiDrawArraysIndirect\");\n\tfp_glMultiDrawElementsIndirect = (pfn_glMultiDrawElementsIndirect)load(\"glMultiDrawElementsIndirect\");\n}\n\nGLboolean GLAD_ARB_occlusion_query2 = GL_FALSE;\nGLboolean GLAD_ARB_parallel_shader_compile = GL_FALSE;\nstatic void load_GL_ARB_parallel_shader_compile(LOADER load) {\n\tif(!GLAD_ARB_parallel_shader_compile) return;\n\tfp_glMaxShaderCompilerThreadsARB = (pfn_glMaxShaderCompilerThreadsARB)load(\"glMaxShaderCompilerThreadsARB\");\n}\n\nGLboolean GLAD_ARB_pipeline_statistics_query = GL_FALSE;\nGLboolean GLAD_ARB_pixel_buffer_object = GL_FALSE;\nGLboolean GLAD_ARB_post_depth_coverage = GL_FALSE;\nGLboolean GLAD_ARB_program_interface_query = GL_FALSE;\nstatic void load_GL_ARB_program_interface_query(LOADER load) {\n\tif(!GLAD_ARB_program_interface_query) return;\n\tfp_glGetProgramInterfaceiv = (pfn_glGetProgramInterfaceiv)load(\"glGetProgramInterfaceiv\");\n\tfp_glGetProgramResourceIndex = (pfn_glGetProgramResourceIndex)load(\"glGetProgramResourceIndex\");\n\tfp_glGetProgramResourceName = (pfn_glGetProgramResourceName)load(\"glGetProgramResourceName\");\n\tfp_glGetProgramResourceiv = (pfn_glGetProgramResourceiv)load(\"glGetProgramResourceiv\");\n\tfp_glGetProgramResourceLocation = (pfn_glGetProgramResourceLocation)load(\"glGetProgramResourceLocation\");\n\tfp_glGetProgramResourceLocationIndex = (pfn_glGetProgramResourceLocationIndex)load(\"glGetProgramResourceLocationIndex\");\n}\n\nGLboolean GLAD_ARB_provoking_vertex = GL_FALSE;\nstatic void load_GL_ARB_provoking_vertex(LOADER load) {\n\tif(!GLAD_ARB_provoking_vertex) return;\n\tfp_glProvokingVertex = (pfn_glProvokingVertex)load(\"glProvokingVertex\");\n}\n\nGLboolean GLAD_ARB_query_buffer_object = GL_FALSE;\nGLboolean GLAD_ARB_robust_buffer_access_behavior = GL_FALSE;\nGLboolean GLAD_ARB_robustness = GL_FALSE;\nstatic void load_GL_ARB_robustness(LOADER load) {\n\tif(!GLAD_ARB_robustness) return;\n\tfp_glGetGraphicsResetStatusARB = (pfn_glGetGraphicsResetStatusARB)load(\"glGetGraphicsResetStatusARB\");\n\tfp_glGetnTexImageARB = (pfn_glGetnTexImageARB)load(\"glGetnTexImageARB\");\n\tfp_glReadnPixelsARB = (pfn_glReadnPixelsARB)load(\"glReadnPixelsARB\");\n\tfp_glGetnCompressedTexImageARB = (pfn_glGetnCompressedTexImageARB)load(\"glGetnCompressedTexImageARB\");\n\tfp_glGetnUniformfvARB = (pfn_glGetnUniformfvARB)load(\"glGetnUniformfvARB\");\n\tfp_glGetnUniformivARB = (pfn_glGetnUniformivARB)load(\"glGetnUniformivARB\");\n\tfp_glGetnUniformuivARB = (pfn_glGetnUniformuivARB)load(\"glGetnUniformuivARB\");\n\tfp_glGetnUniformdvARB = (pfn_glGetnUniformdvARB)load(\"glGetnUniformdvARB\");\n\tfp_glGetnMapdvARB = (pfn_glGetnMapdvARB)load(\"glGetnMapdvARB\");\n\tfp_glGetnMapfvARB = (pfn_glGetnMapfvARB)load(\"glGetnMapfvARB\");\n\tfp_glGetnMapivARB = (pfn_glGetnMapivARB)load(\"glGetnMapivARB\");\n\tfp_glGetnPixelMapfvARB = (pfn_glGetnPixelMapfvARB)load(\"glGetnPixelMapfvARB\");\n\tfp_glGetnPixelMapuivARB = (pfn_glGetnPixelMapuivARB)load(\"glGetnPixelMapuivARB\");\n\tfp_glGetnPixelMapusvARB = (pfn_glGetnPixelMapusvARB)load(\"glGetnPixelMapusvARB\");\n\tfp_glGetnPolygonStippleARB = (pfn_glGetnPolygonStippleARB)load(\"glGetnPolygonStippleARB\");\n\tfp_glGetnColorTableARB = (pfn_glGetnColorTableARB)load(\"glGetnColorTableARB\");\n\tfp_glGetnConvolutionFilterARB = (pfn_glGetnConvolutionFilterARB)load(\"glGetnConvolutionFilterARB\");\n\tfp_glGetnSeparableFilterARB = (pfn_glGetnSeparableFilterARB)load(\"glGetnSeparableFilterARB\");\n\tfp_glGetnHistogramARB = (pfn_glGetnHistogramARB)load(\"glGetnHistogramARB\");\n\tfp_glGetnMinmaxARB = (pfn_glGetnMinmaxARB)load(\"glGetnMinmaxARB\");\n}\n\nGLboolean GLAD_ARB_robustness_isolation = GL_FALSE;\nGLboolean GLAD_ARB_sample_locations = GL_FALSE;\nstatic void load_GL_ARB_sample_locations(LOADER load) {\n\tif(!GLAD_ARB_sample_locations) return;\n\tfp_glFramebufferSampleLocationsfvARB = (pfn_glFramebufferSampleLocationsfvARB)load(\"glFramebufferSampleLocationsfvARB\");\n\tfp_glNamedFramebufferSampleLocationsfvARB = (pfn_glNamedFramebufferSampleLocationsfvARB)load(\"glNamedFramebufferSampleLocationsfvARB\");\n\tfp_glEvaluateDepthValuesARB = (pfn_glEvaluateDepthValuesARB)load(\"glEvaluateDepthValuesARB\");\n}\n\nGLboolean GLAD_ARB_sample_shading = GL_FALSE;\nstatic void load_GL_ARB_sample_shading(LOADER load) {\n\tif(!GLAD_ARB_sample_shading) return;\n\tfp_glMinSampleShadingARB = (pfn_glMinSampleShadingARB)load(\"glMinSampleShadingARB\");\n}\n\nGLboolean GLAD_ARB_sampler_objects = GL_FALSE;\nstatic void load_GL_ARB_sampler_objects(LOADER load) {\n\tif(!GLAD_ARB_sampler_objects) return;\n\tfp_glGenSamplers = (pfn_glGenSamplers)load(\"glGenSamplers\");\n\tfp_glDeleteSamplers = (pfn_glDeleteSamplers)load(\"glDeleteSamplers\");\n\tfp_glIsSampler = (pfn_glIsSampler)load(\"glIsSampler\");\n\tfp_glBindSampler = (pfn_glBindSampler)load(\"glBindSampler\");\n\tfp_glSamplerParameteri = (pfn_glSamplerParameteri)load(\"glSamplerParameteri\");\n\tfp_glSamplerParameteriv = (pfn_glSamplerParameteriv)load(\"glSamplerParameteriv\");\n\tfp_glSamplerParameterf = (pfn_glSamplerParameterf)load(\"glSamplerParameterf\");\n\tfp_glSamplerParameterfv = (pfn_glSamplerParameterfv)load(\"glSamplerParameterfv\");\n\tfp_glSamplerParameterIiv = (pfn_glSamplerParameterIiv)load(\"glSamplerParameterIiv\");\n\tfp_glSamplerParameterIuiv = (pfn_glSamplerParameterIuiv)load(\"glSamplerParameterIuiv\");\n\tfp_glGetSamplerParameteriv = (pfn_glGetSamplerParameteriv)load(\"glGetSamplerParameteriv\");\n\tfp_glGetSamplerParameterIiv = (pfn_glGetSamplerParameterIiv)load(\"glGetSamplerParameterIiv\");\n\tfp_glGetSamplerParameterfv = (pfn_glGetSamplerParameterfv)load(\"glGetSamplerParameterfv\");\n\tfp_glGetSamplerParameterIuiv = (pfn_glGetSamplerParameterIuiv)load(\"glGetSamplerParameterIuiv\");\n}\n\nGLboolean GLAD_ARB_seamless_cube_map = GL_FALSE;\nGLboolean GLAD_ARB_seamless_cubemap_per_texture = GL_FALSE;\nGLboolean GLAD_ARB_separate_shader_objects = GL_FALSE;\nstatic void load_GL_ARB_separate_shader_objects(LOADER load) {\n\tif(!GLAD_ARB_separate_shader_objects) return;\n\tfp_glUseProgramStages = (pfn_glUseProgramStages)load(\"glUseProgramStages\");\n\tfp_glActiveShaderProgram = (pfn_glActiveShaderProgram)load(\"glActiveShaderProgram\");\n\tfp_glCreateShaderProgramv = (pfn_glCreateShaderProgramv)load(\"glCreateShaderProgramv\");\n\tfp_glBindProgramPipeline = (pfn_glBindProgramPipeline)load(\"glBindProgramPipeline\");\n\tfp_glDeleteProgramPipelines = (pfn_glDeleteProgramPipelines)load(\"glDeleteProgramPipelines\");\n\tfp_glGenProgramPipelines = (pfn_glGenProgramPipelines)load(\"glGenProgramPipelines\");\n\tfp_glIsProgramPipeline = (pfn_glIsProgramPipeline)load(\"glIsProgramPipeline\");\n\tfp_glGetProgramPipelineiv = (pfn_glGetProgramPipelineiv)load(\"glGetProgramPipelineiv\");\n\tfp_glProgramUniform1i = (pfn_glProgramUniform1i)load(\"glProgramUniform1i\");\n\tfp_glProgramUniform1iv = (pfn_glProgramUniform1iv)load(\"glProgramUniform1iv\");\n\tfp_glProgramUniform1f = (pfn_glProgramUniform1f)load(\"glProgramUniform1f\");\n\tfp_glProgramUniform1fv = (pfn_glProgramUniform1fv)load(\"glProgramUniform1fv\");\n\tfp_glProgramUniform1d = (pfn_glProgramUniform1d)load(\"glProgramUniform1d\");\n\tfp_glProgramUniform1dv = (pfn_glProgramUniform1dv)load(\"glProgramUniform1dv\");\n\tfp_glProgramUniform1ui = (pfn_glProgramUniform1ui)load(\"glProgramUniform1ui\");\n\tfp_glProgramUniform1uiv = (pfn_glProgramUniform1uiv)load(\"glProgramUniform1uiv\");\n\tfp_glProgramUniform2i = (pfn_glProgramUniform2i)load(\"glProgramUniform2i\");\n\tfp_glProgramUniform2iv = (pfn_glProgramUniform2iv)load(\"glProgramUniform2iv\");\n\tfp_glProgramUniform2f = (pfn_glProgramUniform2f)load(\"glProgramUniform2f\");\n\tfp_glProgramUniform2fv = (pfn_glProgramUniform2fv)load(\"glProgramUniform2fv\");\n\tfp_glProgramUniform2d = (pfn_glProgramUniform2d)load(\"glProgramUniform2d\");\n\tfp_glProgramUniform2dv = (pfn_glProgramUniform2dv)load(\"glProgramUniform2dv\");\n\tfp_glProgramUniform2ui = (pfn_glProgramUniform2ui)load(\"glProgramUniform2ui\");\n\tfp_glProgramUniform2uiv = (pfn_glProgramUniform2uiv)load(\"glProgramUniform2uiv\");\n\tfp_glProgramUniform3i = (pfn_glProgramUniform3i)load(\"glProgramUniform3i\");\n\tfp_glProgramUniform3iv = (pfn_glProgramUniform3iv)load(\"glProgramUniform3iv\");\n\tfp_glProgramUniform3f = (pfn_glProgramUniform3f)load(\"glProgramUniform3f\");\n\tfp_glProgramUniform3fv = (pfn_glProgramUniform3fv)load(\"glProgramUniform3fv\");\n\tfp_glProgramUniform3d = (pfn_glProgramUniform3d)load(\"glProgramUniform3d\");\n\tfp_glProgramUniform3dv = (pfn_glProgramUniform3dv)load(\"glProgramUniform3dv\");\n\tfp_glProgramUniform3ui = (pfn_glProgramUniform3ui)load(\"glProgramUniform3ui\");\n\tfp_glProgramUniform3uiv = (pfn_glProgramUniform3uiv)load(\"glProgramUniform3uiv\");\n\tfp_glProgramUniform4i = (pfn_glProgramUniform4i)load(\"glProgramUniform4i\");\n\tfp_glProgramUniform4iv = (pfn_glProgramUniform4iv)load(\"glProgramUniform4iv\");\n\tfp_glProgramUniform4f = (pfn_glProgramUniform4f)load(\"glProgramUniform4f\");\n\tfp_glProgramUniform4fv = (pfn_glProgramUniform4fv)load(\"glProgramUniform4fv\");\n\tfp_glProgramUniform4d = (pfn_glProgramUniform4d)load(\"glProgramUniform4d\");\n\tfp_glProgramUniform4dv = (pfn_glProgramUniform4dv)load(\"glProgramUniform4dv\");\n\tfp_glProgramUniform4ui = (pfn_glProgramUniform4ui)load(\"glProgramUniform4ui\");\n\tfp_glProgramUniform4uiv = (pfn_glProgramUniform4uiv)load(\"glProgramUniform4uiv\");\n\tfp_glProgramUniformMatrix2fv = (pfn_glProgramUniformMatrix2fv)load(\"glProgramUniformMatrix2fv\");\n\tfp_glProgramUniformMatrix3fv = (pfn_glProgramUniformMatrix3fv)load(\"glProgramUniformMatrix3fv\");\n\tfp_glProgramUniformMatrix4fv = (pfn_glProgramUniformMatrix4fv)load(\"glProgramUniformMatrix4fv\");\n\tfp_glProgramUniformMatrix2dv = (pfn_glProgramUniformMatrix2dv)load(\"glProgramUniformMatrix2dv\");\n\tfp_glProgramUniformMatrix3dv = (pfn_glProgramUniformMatrix3dv)load(\"glProgramUniformMatrix3dv\");\n\tfp_glProgramUniformMatrix4dv = (pfn_glProgramUniformMatrix4dv)load(\"glProgramUniformMatrix4dv\");\n\tfp_glProgramUniformMatrix2x3fv = (pfn_glProgramUniformMatrix2x3fv)load(\"glProgramUniformMatrix2x3fv\");\n\tfp_glProgramUniformMatrix3x2fv = (pfn_glProgramUniformMatrix3x2fv)load(\"glProgramUniformMatrix3x2fv\");\n\tfp_glProgramUniformMatrix2x4fv = (pfn_glProgramUniformMatrix2x4fv)load(\"glProgramUniformMatrix2x4fv\");\n\tfp_glProgramUniformMatrix4x2fv = (pfn_glProgramUniformMatrix4x2fv)load(\"glProgramUniformMatrix4x2fv\");\n\tfp_glProgramUniformMatrix3x4fv = (pfn_glProgramUniformMatrix3x4fv)load(\"glProgramUniformMatrix3x4fv\");\n\tfp_glProgramUniformMatrix4x3fv = (pfn_glProgramUniformMatrix4x3fv)load(\"glProgramUniformMatrix4x3fv\");\n\tfp_glProgramUniformMatrix2x3dv = (pfn_glProgramUniformMatrix2x3dv)load(\"glProgramUniformMatrix2x3dv\");\n\tfp_glProgramUniformMatrix3x2dv = (pfn_glProgramUniformMatrix3x2dv)load(\"glProgramUniformMatrix3x2dv\");\n\tfp_glProgramUniformMatrix2x4dv = (pfn_glProgramUniformMatrix2x4dv)load(\"glProgramUniformMatrix2x4dv\");\n\tfp_glProgramUniformMatrix4x2dv = (pfn_glProgramUniformMatrix4x2dv)load(\"glProgramUniformMatrix4x2dv\");\n\tfp_glProgramUniformMatrix3x4dv = (pfn_glProgramUniformMatrix3x4dv)load(\"glProgramUniformMatrix3x4dv\");\n\tfp_glProgramUniformMatrix4x3dv = (pfn_glProgramUniformMatrix4x3dv)load(\"glProgramUniformMatrix4x3dv\");\n\tfp_glValidateProgramPipeline = (pfn_glValidateProgramPipeline)load(\"glValidateProgramPipeline\");\n\tfp_glGetProgramPipelineInfoLog = (pfn_glGetProgramPipelineInfoLog)load(\"glGetProgramPipelineInfoLog\");\n}\n\nGLboolean GLAD_ARB_shader_atomic_counter_ops = GL_FALSE;\nGLboolean GLAD_ARB_shader_atomic_counters = GL_FALSE;\nstatic void load_GL_ARB_shader_atomic_counters(LOADER load) {\n\tif(!GLAD_ARB_shader_atomic_counters) return;\n\tfp_glGetActiveAtomicCounterBufferiv = (pfn_glGetActiveAtomicCounterBufferiv)load(\"glGetActiveAtomicCounterBufferiv\");\n}\n\nGLboolean GLAD_ARB_shader_ballot = GL_FALSE;\nGLboolean GLAD_ARB_shader_bit_encoding = GL_FALSE;\nGLboolean GLAD_ARB_shader_clock = GL_FALSE;\nGLboolean GLAD_ARB_shader_draw_parameters = GL_FALSE;\nGLboolean GLAD_ARB_shader_group_vote = GL_FALSE;\nGLboolean GLAD_ARB_shader_image_load_store = GL_FALSE;\nstatic void load_GL_ARB_shader_image_load_store(LOADER load) {\n\tif(!GLAD_ARB_shader_image_load_store) return;\n\tfp_glBindImageTexture = (pfn_glBindImageTexture)load(\"glBindImageTexture\");\n\tfp_glMemoryBarrier = (pfn_glMemoryBarrier)load(\"glMemoryBarrier\");\n}\n\nGLboolean GLAD_ARB_shader_image_size = GL_FALSE;\nGLboolean GLAD_ARB_shader_precision = GL_FALSE;\nGLboolean GLAD_ARB_shader_stencil_export = GL_FALSE;\nGLboolean GLAD_ARB_shader_storage_buffer_object = GL_FALSE;\nstatic void load_GL_ARB_shader_storage_buffer_object(LOADER load) {\n\tif(!GLAD_ARB_shader_storage_buffer_object) return;\n\tfp_glShaderStorageBlockBinding = (pfn_glShaderStorageBlockBinding)load(\"glShaderStorageBlockBinding\");\n}\n\nGLboolean GLAD_ARB_shader_subroutine = GL_FALSE;\nstatic void load_GL_ARB_shader_subroutine(LOADER load) {\n\tif(!GLAD_ARB_shader_subroutine) return;\n\tfp_glGetSubroutineUniformLocation = (pfn_glGetSubroutineUniformLocation)load(\"glGetSubroutineUniformLocation\");\n\tfp_glGetSubroutineIndex = (pfn_glGetSubroutineIndex)load(\"glGetSubroutineIndex\");\n\tfp_glGetActiveSubroutineUniformiv = (pfn_glGetActiveSubroutineUniformiv)load(\"glGetActiveSubroutineUniformiv\");\n\tfp_glGetActiveSubroutineUniformName = (pfn_glGetActiveSubroutineUniformName)load(\"glGetActiveSubroutineUniformName\");\n\tfp_glGetActiveSubroutineName = (pfn_glGetActiveSubroutineName)load(\"glGetActiveSubroutineName\");\n\tfp_glUniformSubroutinesuiv = (pfn_glUniformSubroutinesuiv)load(\"glUniformSubroutinesuiv\");\n\tfp_glGetUniformSubroutineuiv = (pfn_glGetUniformSubroutineuiv)load(\"glGetUniformSubroutineuiv\");\n\tfp_glGetProgramStageiv = (pfn_glGetProgramStageiv)load(\"glGetProgramStageiv\");\n}\n\nGLboolean GLAD_ARB_shader_texture_image_samples = GL_FALSE;\nGLboolean GLAD_ARB_shader_texture_lod = GL_FALSE;\nGLboolean GLAD_ARB_shader_viewport_layer_array = GL_FALSE;\nGLboolean GLAD_ARB_shading_language_420pack = GL_FALSE;\nGLboolean GLAD_ARB_shading_language_include = GL_FALSE;\nstatic void load_GL_ARB_shading_language_include(LOADER load) {\n\tif(!GLAD_ARB_shading_language_include) return;\n\tfp_glNamedStringARB = (pfn_glNamedStringARB)load(\"glNamedStringARB\");\n\tfp_glDeleteNamedStringARB = (pfn_glDeleteNamedStringARB)load(\"glDeleteNamedStringARB\");\n\tfp_glCompileShaderIncludeARB = (pfn_glCompileShaderIncludeARB)load(\"glCompileShaderIncludeARB\");\n\tfp_glIsNamedStringARB = (pfn_glIsNamedStringARB)load(\"glIsNamedStringARB\");\n\tfp_glGetNamedStringARB = (pfn_glGetNamedStringARB)load(\"glGetNamedStringARB\");\n\tfp_glGetNamedStringivARB = (pfn_glGetNamedStringivARB)load(\"glGetNamedStringivARB\");\n}\n\nGLboolean GLAD_ARB_shading_language_packing = GL_FALSE;\nGLboolean GLAD_ARB_sparse_buffer = GL_FALSE;\nstatic void load_GL_ARB_sparse_buffer(LOADER load) {\n\tif(!GLAD_ARB_sparse_buffer) return;\n\tfp_glBufferPageCommitmentARB = (pfn_glBufferPageCommitmentARB)load(\"glBufferPageCommitmentARB\");\n\tfp_glNamedBufferPageCommitmentEXT = (pfn_glNamedBufferPageCommitmentEXT)load(\"glNamedBufferPageCommitmentEXT\");\n\tfp_glNamedBufferPageCommitmentARB = (pfn_glNamedBufferPageCommitmentARB)load(\"glNamedBufferPageCommitmentARB\");\n}\n\nGLboolean GLAD_ARB_sparse_texture = GL_FALSE;\nstatic void load_GL_ARB_sparse_texture(LOADER load) {\n\tif(!GLAD_ARB_sparse_texture) return;\n\tfp_glTexPageCommitmentARB = (pfn_glTexPageCommitmentARB)load(\"glTexPageCommitmentARB\");\n}\n\nGLboolean GLAD_ARB_sparse_texture2 = GL_FALSE;\nGLboolean GLAD_ARB_sparse_texture_clamp = GL_FALSE;\nGLboolean GLAD_ARB_stencil_texturing = GL_FALSE;\nGLboolean GLAD_ARB_sync = GL_FALSE;\nstatic void load_GL_ARB_sync(LOADER load) {\n\tif(!GLAD_ARB_sync) return;\n\tfp_glFenceSync = (pfn_glFenceSync)load(\"glFenceSync\");\n\tfp_glIsSync = (pfn_glIsSync)load(\"glIsSync\");\n\tfp_glDeleteSync = (pfn_glDeleteSync)load(\"glDeleteSync\");\n\tfp_glClientWaitSync = (pfn_glClientWaitSync)load(\"glClientWaitSync\");\n\tfp_glWaitSync = (pfn_glWaitSync)load(\"glWaitSync\");\n\tfp_glGetInteger64v = (pfn_glGetInteger64v)load(\"glGetInteger64v\");\n\tfp_glGetSynciv = (pfn_glGetSynciv)load(\"glGetSynciv\");\n}\n\nGLboolean GLAD_ARB_tessellation_shader = GL_FALSE;\nstatic void load_GL_ARB_tessellation_shader(LOADER load) {\n\tif(!GLAD_ARB_tessellation_shader) return;\n\tfp_glPatchParameteri = (pfn_glPatchParameteri)load(\"glPatchParameteri\");\n\tfp_glPatchParameterfv = (pfn_glPatchParameterfv)load(\"glPatchParameterfv\");\n}\n\nGLboolean GLAD_ARB_texture_barrier = GL_FALSE;\nstatic void load_GL_ARB_texture_barrier(LOADER load) {\n\tif(!GLAD_ARB_texture_barrier) return;\n\tfp_glTextureBarrier = (pfn_glTextureBarrier)load(\"glTextureBarrier\");\n}\n\nGLboolean GLAD_ARB_texture_buffer_object = GL_FALSE;\nstatic void load_GL_ARB_texture_buffer_object(LOADER load) {\n\tif(!GLAD_ARB_texture_buffer_object) return;\n\tfp_glTexBufferARB = (pfn_glTexBufferARB)load(\"glTexBufferARB\");\n}\n\nGLboolean GLAD_ARB_texture_buffer_object_rgb32 = GL_FALSE;\nGLboolean GLAD_ARB_texture_buffer_range = GL_FALSE;\nstatic void load_GL_ARB_texture_buffer_range(LOADER load) {\n\tif(!GLAD_ARB_texture_buffer_range) return;\n\tfp_glTexBufferRange = (pfn_glTexBufferRange)load(\"glTexBufferRange\");\n}\n\nGLboolean GLAD_ARB_texture_compression_bptc = GL_FALSE;\nGLboolean GLAD_ARB_texture_compression_rgtc = GL_FALSE;\nGLboolean GLAD_ARB_texture_cube_map_array = GL_FALSE;\nGLboolean GLAD_ARB_texture_filter_minmax = GL_FALSE;\nGLboolean GLAD_ARB_texture_float = GL_FALSE;\nGLboolean GLAD_ARB_texture_gather = GL_FALSE;\nGLboolean GLAD_ARB_texture_mirror_clamp_to_edge = GL_FALSE;\nGLboolean GLAD_ARB_texture_multisample = GL_FALSE;\nstatic void load_GL_ARB_texture_multisample(LOADER load) {\n\tif(!GLAD_ARB_texture_multisample) return;\n\tfp_glTexImage2DMultisample = (pfn_glTexImage2DMultisample)load(\"glTexImage2DMultisample\");\n\tfp_glTexImage3DMultisample = (pfn_glTexImage3DMultisample)load(\"glTexImage3DMultisample\");\n\tfp_glGetMultisamplefv = (pfn_glGetMultisamplefv)load(\"glGetMultisamplefv\");\n\tfp_glSampleMaski = (pfn_glSampleMaski)load(\"glSampleMaski\");\n}\n\nGLboolean GLAD_ARB_texture_query_levels = GL_FALSE;\nGLboolean GLAD_ARB_texture_query_lod = GL_FALSE;\nGLboolean GLAD_ARB_texture_rectangle = GL_FALSE;\nGLboolean GLAD_ARB_texture_rg = GL_FALSE;\nGLboolean GLAD_ARB_texture_rgb10_a2ui = GL_FALSE;\nGLboolean GLAD_ARB_texture_stencil8 = GL_FALSE;\nGLboolean GLAD_ARB_texture_storage = GL_FALSE;\nstatic void load_GL_ARB_texture_storage(LOADER load) {\n\tif(!GLAD_ARB_texture_storage) return;\n\tfp_glTexStorage1D = (pfn_glTexStorage1D)load(\"glTexStorage1D\");\n\tfp_glTexStorage2D = (pfn_glTexStorage2D)load(\"glTexStorage2D\");\n\tfp_glTexStorage3D = (pfn_glTexStorage3D)load(\"glTexStorage3D\");\n}\n\nGLboolean GLAD_ARB_texture_storage_multisample = GL_FALSE;\nstatic void load_GL_ARB_texture_storage_multisample(LOADER load) {\n\tif(!GLAD_ARB_texture_storage_multisample) return;\n\tfp_glTexStorage2DMultisample = (pfn_glTexStorage2DMultisample)load(\"glTexStorage2DMultisample\");\n\tfp_glTexStorage3DMultisample = (pfn_glTexStorage3DMultisample)load(\"glTexStorage3DMultisample\");\n}\n\nGLboolean GLAD_ARB_texture_swizzle = GL_FALSE;\nGLboolean GLAD_ARB_texture_view = GL_FALSE;\nstatic void load_GL_ARB_texture_view(LOADER load) {\n\tif(!GLAD_ARB_texture_view) return;\n\tfp_glTextureView = (pfn_glTextureView)load(\"glTextureView\");\n}\n\nGLboolean GLAD_ARB_timer_query = GL_FALSE;\nstatic void load_GL_ARB_timer_query(LOADER load) {\n\tif(!GLAD_ARB_timer_query) return;\n\tfp_glQueryCounter = (pfn_glQueryCounter)load(\"glQueryCounter\");\n\tfp_glGetQueryObjecti64v = (pfn_glGetQueryObjecti64v)load(\"glGetQueryObjecti64v\");\n\tfp_glGetQueryObjectui64v = (pfn_glGetQueryObjectui64v)load(\"glGetQueryObjectui64v\");\n}\n\nGLboolean GLAD_ARB_transform_feedback2 = GL_FALSE;\nstatic void load_GL_ARB_transform_feedback2(LOADER load) {\n\tif(!GLAD_ARB_transform_feedback2) return;\n\tfp_glBindTransformFeedback = (pfn_glBindTransformFeedback)load(\"glBindTransformFeedback\");\n\tfp_glDeleteTransformFeedbacks = (pfn_glDeleteTransformFeedbacks)load(\"glDeleteTransformFeedbacks\");\n\tfp_glGenTransformFeedbacks = (pfn_glGenTransformFeedbacks)load(\"glGenTransformFeedbacks\");\n\tfp_glIsTransformFeedback = (pfn_glIsTransformFeedback)load(\"glIsTransformFeedback\");\n\tfp_glPauseTransformFeedback = (pfn_glPauseTransformFeedback)load(\"glPauseTransformFeedback\");\n\tfp_glResumeTransformFeedback = (pfn_glResumeTransformFeedback)load(\"glResumeTransformFeedback\");\n\tfp_glDrawTransformFeedback = (pfn_glDrawTransformFeedback)load(\"glDrawTransformFeedback\");\n}\n\nGLboolean GLAD_ARB_transform_feedback3 = GL_FALSE;\nstatic void load_GL_ARB_transform_feedback3(LOADER load) {\n\tif(!GLAD_ARB_transform_feedback3) return;\n\tfp_glDrawTransformFeedbackStream = (pfn_glDrawTransformFeedbackStream)load(\"glDrawTransformFeedbackStream\");\n\tfp_glBeginQueryIndexed = (pfn_glBeginQueryIndexed)load(\"glBeginQueryIndexed\");\n\tfp_glEndQueryIndexed = (pfn_glEndQueryIndexed)load(\"glEndQueryIndexed\");\n\tfp_glGetQueryIndexediv = (pfn_glGetQueryIndexediv)load(\"glGetQueryIndexediv\");\n}\n\nGLboolean GLAD_ARB_transform_feedback_instanced = GL_FALSE;\nstatic void load_GL_ARB_transform_feedback_instanced(LOADER load) {\n\tif(!GLAD_ARB_transform_feedback_instanced) return;\n\tfp_glDrawTransformFeedbackInstanced = (pfn_glDrawTransformFeedbackInstanced)load(\"glDrawTransformFeedbackInstanced\");\n\tfp_glDrawTransformFeedbackStreamInstanced = (pfn_glDrawTransformFeedbackStreamInstanced)load(\"glDrawTransformFeedbackStreamInstanced\");\n}\n\nGLboolean GLAD_ARB_transform_feedback_overflow_query = GL_FALSE;\nGLboolean GLAD_ARB_uniform_buffer_object = GL_FALSE;\nstatic void load_GL_ARB_uniform_buffer_object(LOADER load) {\n\tif(!GLAD_ARB_uniform_buffer_object) return;\n\tfp_glGetUniformIndices = (pfn_glGetUniformIndices)load(\"glGetUniformIndices\");\n\tfp_glGetActiveUniformsiv = (pfn_glGetActiveUniformsiv)load(\"glGetActiveUniformsiv\");\n\tfp_glGetActiveUniformName = (pfn_glGetActiveUniformName)load(\"glGetActiveUniformName\");\n\tfp_glGetUniformBlockIndex = (pfn_glGetUniformBlockIndex)load(\"glGetUniformBlockIndex\");\n\tfp_glGetActiveUniformBlockiv = (pfn_glGetActiveUniformBlockiv)load(\"glGetActiveUniformBlockiv\");\n\tfp_glGetActiveUniformBlockName = (pfn_glGetActiveUniformBlockName)load(\"glGetActiveUniformBlockName\");\n\tfp_glUniformBlockBinding = (pfn_glUniformBlockBinding)load(\"glUniformBlockBinding\");\n\tfp_glBindBufferRange = (pfn_glBindBufferRange)load(\"glBindBufferRange\");\n\tfp_glBindBufferBase = (pfn_glBindBufferBase)load(\"glBindBufferBase\");\n\tfp_glGetIntegeri_v = (pfn_glGetIntegeri_v)load(\"glGetIntegeri_v\");\n}\n\nGLboolean GLAD_ARB_vertex_array_bgra = GL_FALSE;\nGLboolean GLAD_ARB_vertex_array_object = GL_FALSE;\nstatic void load_GL_ARB_vertex_array_object(LOADER load) {\n\tif(!GLAD_ARB_vertex_array_object) return;\n\tfp_glBindVertexArray = (pfn_glBindVertexArray)load(\"glBindVertexArray\");\n\tfp_glDeleteVertexArrays = (pfn_glDeleteVertexArrays)load(\"glDeleteVertexArrays\");\n\tfp_glGenVertexArrays = (pfn_glGenVertexArrays)load(\"glGenVertexArrays\");\n\tfp_glIsVertexArray = (pfn_glIsVertexArray)load(\"glIsVertexArray\");\n}\n\nGLboolean GLAD_ARB_vertex_attrib_64bit = GL_FALSE;\nstatic void load_GL_ARB_vertex_attrib_64bit(LOADER load) {\n\tif(!GLAD_ARB_vertex_attrib_64bit) return;\n\tfp_glVertexAttribL1d = (pfn_glVertexAttribL1d)load(\"glVertexAttribL1d\");\n\tfp_glVertexAttribL2d = (pfn_glVertexAttribL2d)load(\"glVertexAttribL2d\");\n\tfp_glVertexAttribL3d = (pfn_glVertexAttribL3d)load(\"glVertexAttribL3d\");\n\tfp_glVertexAttribL4d = (pfn_glVertexAttribL4d)load(\"glVertexAttribL4d\");\n\tfp_glVertexAttribL1dv = (pfn_glVertexAttribL1dv)load(\"glVertexAttribL1dv\");\n\tfp_glVertexAttribL2dv = (pfn_glVertexAttribL2dv)load(\"glVertexAttribL2dv\");\n\tfp_glVertexAttribL3dv = (pfn_glVertexAttribL3dv)load(\"glVertexAttribL3dv\");\n\tfp_glVertexAttribL4dv = (pfn_glVertexAttribL4dv)load(\"glVertexAttribL4dv\");\n\tfp_glVertexAttribLPointer = (pfn_glVertexAttribLPointer)load(\"glVertexAttribLPointer\");\n\tfp_glGetVertexAttribLdv = (pfn_glGetVertexAttribLdv)load(\"glGetVertexAttribLdv\");\n}\n\nGLboolean GLAD_ARB_vertex_attrib_binding = GL_FALSE;\nstatic void load_GL_ARB_vertex_attrib_binding(LOADER load) {\n\tif(!GLAD_ARB_vertex_attrib_binding) return;\n\tfp_glBindVertexBuffer = (pfn_glBindVertexBuffer)load(\"glBindVertexBuffer\");\n\tfp_glVertexAttribFormat = (pfn_glVertexAttribFormat)load(\"glVertexAttribFormat\");\n\tfp_glVertexAttribIFormat = (pfn_glVertexAttribIFormat)load(\"glVertexAttribIFormat\");\n\tfp_glVertexAttribLFormat = (pfn_glVertexAttribLFormat)load(\"glVertexAttribLFormat\");\n\tfp_glVertexAttribBinding = (pfn_glVertexAttribBinding)load(\"glVertexAttribBinding\");\n\tfp_glVertexBindingDivisor = (pfn_glVertexBindingDivisor)load(\"glVertexBindingDivisor\");\n}\n\nGLboolean GLAD_ARB_vertex_type_10f_11f_11f_rev = GL_FALSE;\nGLboolean GLAD_ARB_vertex_type_2_10_10_10_rev = GL_FALSE;\nstatic void load_GL_ARB_vertex_type_2_10_10_10_rev(LOADER load) {\n\tif(!GLAD_ARB_vertex_type_2_10_10_10_rev) return;\n\tfp_glVertexAttribP1ui = (pfn_glVertexAttribP1ui)load(\"glVertexAttribP1ui\");\n\tfp_glVertexAttribP1uiv = (pfn_glVertexAttribP1uiv)load(\"glVertexAttribP1uiv\");\n\tfp_glVertexAttribP2ui = (pfn_glVertexAttribP2ui)load(\"glVertexAttribP2ui\");\n\tfp_glVertexAttribP2uiv = (pfn_glVertexAttribP2uiv)load(\"glVertexAttribP2uiv\");\n\tfp_glVertexAttribP3ui = (pfn_glVertexAttribP3ui)load(\"glVertexAttribP3ui\");\n\tfp_glVertexAttribP3uiv = (pfn_glVertexAttribP3uiv)load(\"glVertexAttribP3uiv\");\n\tfp_glVertexAttribP4ui = (pfn_glVertexAttribP4ui)load(\"glVertexAttribP4ui\");\n\tfp_glVertexAttribP4uiv = (pfn_glVertexAttribP4uiv)load(\"glVertexAttribP4uiv\");\n\tfp_glVertexP2ui = (pfn_glVertexP2ui)load(\"glVertexP2ui\");\n\tfp_glVertexP2uiv = (pfn_glVertexP2uiv)load(\"glVertexP2uiv\");\n\tfp_glVertexP3ui = (pfn_glVertexP3ui)load(\"glVertexP3ui\");\n\tfp_glVertexP3uiv = (pfn_glVertexP3uiv)load(\"glVertexP3uiv\");\n\tfp_glVertexP4ui = (pfn_glVertexP4ui)load(\"glVertexP4ui\");\n\tfp_glVertexP4uiv = (pfn_glVertexP4uiv)load(\"glVertexP4uiv\");\n\tfp_glTexCoordP1ui = (pfn_glTexCoordP1ui)load(\"glTexCoordP1ui\");\n\tfp_glTexCoordP1uiv = (pfn_glTexCoordP1uiv)load(\"glTexCoordP1uiv\");\n\tfp_glTexCoordP2ui = (pfn_glTexCoordP2ui)load(\"glTexCoordP2ui\");\n\tfp_glTexCoordP2uiv = (pfn_glTexCoordP2uiv)load(\"glTexCoordP2uiv\");\n\tfp_glTexCoordP3ui = (pfn_glTexCoordP3ui)load(\"glTexCoordP3ui\");\n\tfp_glTexCoordP3uiv = (pfn_glTexCoordP3uiv)load(\"glTexCoordP3uiv\");\n\tfp_glTexCoordP4ui = (pfn_glTexCoordP4ui)load(\"glTexCoordP4ui\");\n\tfp_glTexCoordP4uiv = (pfn_glTexCoordP4uiv)load(\"glTexCoordP4uiv\");\n\tfp_glMultiTexCoordP1ui = (pfn_glMultiTexCoordP1ui)load(\"glMultiTexCoordP1ui\");\n\tfp_glMultiTexCoordP1uiv = (pfn_glMultiTexCoordP1uiv)load(\"glMultiTexCoordP1uiv\");\n\tfp_glMultiTexCoordP2ui = (pfn_glMultiTexCoordP2ui)load(\"glMultiTexCoordP2ui\");\n\tfp_glMultiTexCoordP2uiv = (pfn_glMultiTexCoordP2uiv)load(\"glMultiTexCoordP2uiv\");\n\tfp_glMultiTexCoordP3ui = (pfn_glMultiTexCoordP3ui)load(\"glMultiTexCoordP3ui\");\n\tfp_glMultiTexCoordP3uiv = (pfn_glMultiTexCoordP3uiv)load(\"glMultiTexCoordP3uiv\");\n\tfp_glMultiTexCoordP4ui = (pfn_glMultiTexCoordP4ui)load(\"glMultiTexCoordP4ui\");\n\tfp_glMultiTexCoordP4uiv = (pfn_glMultiTexCoordP4uiv)load(\"glMultiTexCoordP4uiv\");\n\tfp_glNormalP3ui = (pfn_glNormalP3ui)load(\"glNormalP3ui\");\n\tfp_glNormalP3uiv = (pfn_glNormalP3uiv)load(\"glNormalP3uiv\");\n\tfp_glColorP3ui = (pfn_glColorP3ui)load(\"glColorP3ui\");\n\tfp_glColorP3uiv = (pfn_glColorP3uiv)load(\"glColorP3uiv\");\n\tfp_glColorP4ui = (pfn_glColorP4ui)load(\"glColorP4ui\");\n\tfp_glColorP4uiv = (pfn_glColorP4uiv)load(\"glColorP4uiv\");\n\tfp_glSecondaryColorP3ui = (pfn_glSecondaryColorP3ui)load(\"glSecondaryColorP3ui\");\n\tfp_glSecondaryColorP3uiv = (pfn_glSecondaryColorP3uiv)load(\"glSecondaryColorP3uiv\");\n}\n\nGLboolean GLAD_ARB_viewport_array = GL_FALSE;\nstatic void load_GL_ARB_viewport_array(LOADER load) {\n\tif(!GLAD_ARB_viewport_array) return;\n\tfp_glViewportArrayv = (pfn_glViewportArrayv)load(\"glViewportArrayv\");\n\tfp_glViewportIndexedf = (pfn_glViewportIndexedf)load(\"glViewportIndexedf\");\n\tfp_glViewportIndexedfv = (pfn_glViewportIndexedfv)load(\"glViewportIndexedfv\");\n\tfp_glScissorArrayv = (pfn_glScissorArrayv)load(\"glScissorArrayv\");\n\tfp_glScissorIndexed = (pfn_glScissorIndexed)load(\"glScissorIndexed\");\n\tfp_glScissorIndexedv = (pfn_glScissorIndexedv)load(\"glScissorIndexedv\");\n\tfp_glDepthRangeArrayv = (pfn_glDepthRangeArrayv)load(\"glDepthRangeArrayv\");\n\tfp_glDepthRangeIndexed = (pfn_glDepthRangeIndexed)load(\"glDepthRangeIndexed\");\n\tfp_glGetFloati_v = (pfn_glGetFloati_v)load(\"glGetFloati_v\");\n\tfp_glGetDoublei_v = (pfn_glGetDoublei_v)load(\"glGetDoublei_v\");\n}\n\nGLboolean GLAD_EXT_base_instance = GL_FALSE;\nstatic void load_GL_EXT_base_instance(LOADER load) {\n\tif(!GLAD_EXT_base_instance) return;\n\tfp_glDrawArraysInstancedBaseInstanceEXT = (pfn_glDrawArraysInstancedBaseInstanceEXT)load(\"glDrawArraysInstancedBaseInstanceEXT\");\n\tfp_glDrawElementsInstancedBaseInstanceEXT = (pfn_glDrawElementsInstancedBaseInstanceEXT)load(\"glDrawElementsInstancedBaseInstanceEXT\");\n\tfp_glDrawElementsInstancedBaseVertexBaseInstanceEXT = (pfn_glDrawElementsInstancedBaseVertexBaseInstanceEXT)load(\"glDrawElementsInstancedBaseVertexBaseInstanceEXT\");\n}\n\nGLboolean GLAD_EXT_bgra = GL_FALSE;\nGLboolean GLAD_EXT_bindable_uniform = GL_FALSE;\nstatic void load_GL_EXT_bindable_uniform(LOADER load) {\n\tif(!GLAD_EXT_bindable_uniform) return;\n\tfp_glUniformBufferEXT = (pfn_glUniformBufferEXT)load(\"glUniformBufferEXT\");\n\tfp_glGetUniformBufferSizeEXT = (pfn_glGetUniformBufferSizeEXT)load(\"glGetUniformBufferSizeEXT\");\n\tfp_glGetUniformOffsetEXT = (pfn_glGetUniformOffsetEXT)load(\"glGetUniformOffsetEXT\");\n}\n\nGLboolean GLAD_EXT_blend_func_extended = GL_FALSE;\nstatic void load_GL_EXT_blend_func_extended(LOADER load) {\n\tif(!GLAD_EXT_blend_func_extended) return;\n\tfp_glBindFragDataLocationIndexedEXT = (pfn_glBindFragDataLocationIndexedEXT)load(\"glBindFragDataLocationIndexedEXT\");\n\tfp_glBindFragDataLocationEXT = (pfn_glBindFragDataLocationEXT)load(\"glBindFragDataLocationEXT\");\n\tfp_glGetProgramResourceLocationIndexEXT = (pfn_glGetProgramResourceLocationIndexEXT)load(\"glGetProgramResourceLocationIndexEXT\");\n\tfp_glGetFragDataIndexEXT = (pfn_glGetFragDataIndexEXT)load(\"glGetFragDataIndexEXT\");\n}\n\nGLboolean GLAD_EXT_blend_minmax = GL_FALSE;\nstatic void load_GL_EXT_blend_minmax(LOADER load) {\n\tif(!GLAD_EXT_blend_minmax) return;\n\tfp_glBlendEquationEXT = (pfn_glBlendEquationEXT)load(\"glBlendEquationEXT\");\n}\n\nGLboolean GLAD_EXT_buffer_storage = GL_FALSE;\nstatic void load_GL_EXT_buffer_storage(LOADER load) {\n\tif(!GLAD_EXT_buffer_storage) return;\n\tfp_glBufferStorageEXT = (pfn_glBufferStorageEXT)load(\"glBufferStorageEXT\");\n}\n\nGLboolean GLAD_EXT_color_buffer_float = GL_FALSE;\nGLboolean GLAD_EXT_color_buffer_half_float = GL_FALSE;\nGLboolean GLAD_EXT_copy_image = GL_FALSE;\nstatic void load_GL_EXT_copy_image(LOADER load) {\n\tif(!GLAD_EXT_copy_image) return;\n\tfp_glCopyImageSubDataEXT = (pfn_glCopyImageSubDataEXT)load(\"glCopyImageSubDataEXT\");\n}\n\nGLboolean GLAD_EXT_debug_label = GL_FALSE;\nstatic void load_GL_EXT_debug_label(LOADER load) {\n\tif(!GLAD_EXT_debug_label) return;\n\tfp_glLabelObjectEXT = (pfn_glLabelObjectEXT)load(\"glLabelObjectEXT\");\n\tfp_glGetObjectLabelEXT = (pfn_glGetObjectLabelEXT)load(\"glGetObjectLabelEXT\");\n}\n\nGLboolean GLAD_EXT_debug_marker = GL_FALSE;\nstatic void load_GL_EXT_debug_marker(LOADER load) {\n\tif(!GLAD_EXT_debug_marker) return;\n\tfp_glInsertEventMarkerEXT = (pfn_glInsertEventMarkerEXT)load(\"glInsertEventMarkerEXT\");\n\tfp_glPushGroupMarkerEXT = (pfn_glPushGroupMarkerEXT)load(\"glPushGroupMarkerEXT\");\n\tfp_glPopGroupMarkerEXT = (pfn_glPopGroupMarkerEXT)load(\"glPopGroupMarkerEXT\");\n}\n\nGLboolean GLAD_EXT_direct_state_access = GL_FALSE;\nstatic void load_GL_EXT_direct_state_access(LOADER load) {\n\tif(!GLAD_EXT_direct_state_access) return;\n\tfp_glMatrixLoadfEXT = (pfn_glMatrixLoadfEXT)load(\"glMatrixLoadfEXT\");\n\tfp_glMatrixLoaddEXT = (pfn_glMatrixLoaddEXT)load(\"glMatrixLoaddEXT\");\n\tfp_glMatrixMultfEXT = (pfn_glMatrixMultfEXT)load(\"glMatrixMultfEXT\");\n\tfp_glMatrixMultdEXT = (pfn_glMatrixMultdEXT)load(\"glMatrixMultdEXT\");\n\tfp_glMatrixLoadIdentityEXT = (pfn_glMatrixLoadIdentityEXT)load(\"glMatrixLoadIdentityEXT\");\n\tfp_glMatrixRotatefEXT = (pfn_glMatrixRotatefEXT)load(\"glMatrixRotatefEXT\");\n\tfp_glMatrixRotatedEXT = (pfn_glMatrixRotatedEXT)load(\"glMatrixRotatedEXT\");\n\tfp_glMatrixScalefEXT = (pfn_glMatrixScalefEXT)load(\"glMatrixScalefEXT\");\n\tfp_glMatrixScaledEXT = (pfn_glMatrixScaledEXT)load(\"glMatrixScaledEXT\");\n\tfp_glMatrixTranslatefEXT = (pfn_glMatrixTranslatefEXT)load(\"glMatrixTranslatefEXT\");\n\tfp_glMatrixTranslatedEXT = (pfn_glMatrixTranslatedEXT)load(\"glMatrixTranslatedEXT\");\n\tfp_glMatrixFrustumEXT = (pfn_glMatrixFrustumEXT)load(\"glMatrixFrustumEXT\");\n\tfp_glMatrixOrthoEXT = (pfn_glMatrixOrthoEXT)load(\"glMatrixOrthoEXT\");\n\tfp_glMatrixPopEXT = (pfn_glMatrixPopEXT)load(\"glMatrixPopEXT\");\n\tfp_glMatrixPushEXT = (pfn_glMatrixPushEXT)load(\"glMatrixPushEXT\");\n\tfp_glClientAttribDefaultEXT = (pfn_glClientAttribDefaultEXT)load(\"glClientAttribDefaultEXT\");\n\tfp_glPushClientAttribDefaultEXT = (pfn_glPushClientAttribDefaultEXT)load(\"glPushClientAttribDefaultEXT\");\n\tfp_glTextureParameterfEXT = (pfn_glTextureParameterfEXT)load(\"glTextureParameterfEXT\");\n\tfp_glTextureParameterfvEXT = (pfn_glTextureParameterfvEXT)load(\"glTextureParameterfvEXT\");\n\tfp_glTextureParameteriEXT = (pfn_glTextureParameteriEXT)load(\"glTextureParameteriEXT\");\n\tfp_glTextureParameterivEXT = (pfn_glTextureParameterivEXT)load(\"glTextureParameterivEXT\");\n\tfp_glTextureImage1DEXT = (pfn_glTextureImage1DEXT)load(\"glTextureImage1DEXT\");\n\tfp_glTextureImage2DEXT = (pfn_glTextureImage2DEXT)load(\"glTextureImage2DEXT\");\n\tfp_glTextureSubImage1DEXT = (pfn_glTextureSubImage1DEXT)load(\"glTextureSubImage1DEXT\");\n\tfp_glTextureSubImage2DEXT = (pfn_glTextureSubImage2DEXT)load(\"glTextureSubImage2DEXT\");\n\tfp_glCopyTextureImage1DEXT = (pfn_glCopyTextureImage1DEXT)load(\"glCopyTextureImage1DEXT\");\n\tfp_glCopyTextureImage2DEXT = (pfn_glCopyTextureImage2DEXT)load(\"glCopyTextureImage2DEXT\");\n\tfp_glCopyTextureSubImage1DEXT = (pfn_glCopyTextureSubImage1DEXT)load(\"glCopyTextureSubImage1DEXT\");\n\tfp_glCopyTextureSubImage2DEXT = (pfn_glCopyTextureSubImage2DEXT)load(\"glCopyTextureSubImage2DEXT\");\n\tfp_glGetTextureImageEXT = (pfn_glGetTextureImageEXT)load(\"glGetTextureImageEXT\");\n\tfp_glGetTextureParameterfvEXT = (pfn_glGetTextureParameterfvEXT)load(\"glGetTextureParameterfvEXT\");\n\tfp_glGetTextureParameterivEXT = (pfn_glGetTextureParameterivEXT)load(\"glGetTextureParameterivEXT\");\n\tfp_glGetTextureLevelParameterfvEXT = (pfn_glGetTextureLevelParameterfvEXT)load(\"glGetTextureLevelParameterfvEXT\");\n\tfp_glGetTextureLevelParameterivEXT = (pfn_glGetTextureLevelParameterivEXT)load(\"glGetTextureLevelParameterivEXT\");\n\tfp_glTextureImage3DEXT = (pfn_glTextureImage3DEXT)load(\"glTextureImage3DEXT\");\n\tfp_glTextureSubImage3DEXT = (pfn_glTextureSubImage3DEXT)load(\"glTextureSubImage3DEXT\");\n\tfp_glCopyTextureSubImage3DEXT = (pfn_glCopyTextureSubImage3DEXT)load(\"glCopyTextureSubImage3DEXT\");\n\tfp_glBindMultiTextureEXT = (pfn_glBindMultiTextureEXT)load(\"glBindMultiTextureEXT\");\n\tfp_glMultiTexCoordPointerEXT = (pfn_glMultiTexCoordPointerEXT)load(\"glMultiTexCoordPointerEXT\");\n\tfp_glMultiTexEnvfEXT = (pfn_glMultiTexEnvfEXT)load(\"glMultiTexEnvfEXT\");\n\tfp_glMultiTexEnvfvEXT = (pfn_glMultiTexEnvfvEXT)load(\"glMultiTexEnvfvEXT\");\n\tfp_glMultiTexEnviEXT = (pfn_glMultiTexEnviEXT)load(\"glMultiTexEnviEXT\");\n\tfp_glMultiTexEnvivEXT = (pfn_glMultiTexEnvivEXT)load(\"glMultiTexEnvivEXT\");\n\tfp_glMultiTexGendEXT = (pfn_glMultiTexGendEXT)load(\"glMultiTexGendEXT\");\n\tfp_glMultiTexGendvEXT = (pfn_glMultiTexGendvEXT)load(\"glMultiTexGendvEXT\");\n\tfp_glMultiTexGenfEXT = (pfn_glMultiTexGenfEXT)load(\"glMultiTexGenfEXT\");\n\tfp_glMultiTexGenfvEXT = (pfn_glMultiTexGenfvEXT)load(\"glMultiTexGenfvEXT\");\n\tfp_glMultiTexGeniEXT = (pfn_glMultiTexGeniEXT)load(\"glMultiTexGeniEXT\");\n\tfp_glMultiTexGenivEXT = (pfn_glMultiTexGenivEXT)load(\"glMultiTexGenivEXT\");\n\tfp_glGetMultiTexEnvfvEXT = (pfn_glGetMultiTexEnvfvEXT)load(\"glGetMultiTexEnvfvEXT\");\n\tfp_glGetMultiTexEnvivEXT = (pfn_glGetMultiTexEnvivEXT)load(\"glGetMultiTexEnvivEXT\");\n\tfp_glGetMultiTexGendvEXT = (pfn_glGetMultiTexGendvEXT)load(\"glGetMultiTexGendvEXT\");\n\tfp_glGetMultiTexGenfvEXT = (pfn_glGetMultiTexGenfvEXT)load(\"glGetMultiTexGenfvEXT\");\n\tfp_glGetMultiTexGenivEXT = (pfn_glGetMultiTexGenivEXT)load(\"glGetMultiTexGenivEXT\");\n\tfp_glMultiTexParameteriEXT = (pfn_glMultiTexParameteriEXT)load(\"glMultiTexParameteriEXT\");\n\tfp_glMultiTexParameterivEXT = (pfn_glMultiTexParameterivEXT)load(\"glMultiTexParameterivEXT\");\n\tfp_glMultiTexParameterfEXT = (pfn_glMultiTexParameterfEXT)load(\"glMultiTexParameterfEXT\");\n\tfp_glMultiTexParameterfvEXT = (pfn_glMultiTexParameterfvEXT)load(\"glMultiTexParameterfvEXT\");\n\tfp_glMultiTexImage1DEXT = (pfn_glMultiTexImage1DEXT)load(\"glMultiTexImage1DEXT\");\n\tfp_glMultiTexImage2DEXT = (pfn_glMultiTexImage2DEXT)load(\"glMultiTexImage2DEXT\");\n\tfp_glMultiTexSubImage1DEXT = (pfn_glMultiTexSubImage1DEXT)load(\"glMultiTexSubImage1DEXT\");\n\tfp_glMultiTexSubImage2DEXT = (pfn_glMultiTexSubImage2DEXT)load(\"glMultiTexSubImage2DEXT\");\n\tfp_glCopyMultiTexImage1DEXT = (pfn_glCopyMultiTexImage1DEXT)load(\"glCopyMultiTexImage1DEXT\");\n\tfp_glCopyMultiTexImage2DEXT = (pfn_glCopyMultiTexImage2DEXT)load(\"glCopyMultiTexImage2DEXT\");\n\tfp_glCopyMultiTexSubImage1DEXT = (pfn_glCopyMultiTexSubImage1DEXT)load(\"glCopyMultiTexSubImage1DEXT\");\n\tfp_glCopyMultiTexSubImage2DEXT = (pfn_glCopyMultiTexSubImage2DEXT)load(\"glCopyMultiTexSubImage2DEXT\");\n\tfp_glGetMultiTexImageEXT = (pfn_glGetMultiTexImageEXT)load(\"glGetMultiTexImageEXT\");\n\tfp_glGetMultiTexParameterfvEXT = (pfn_glGetMultiTexParameterfvEXT)load(\"glGetMultiTexParameterfvEXT\");\n\tfp_glGetMultiTexParameterivEXT = (pfn_glGetMultiTexParameterivEXT)load(\"glGetMultiTexParameterivEXT\");\n\tfp_glGetMultiTexLevelParameterfvEXT = (pfn_glGetMultiTexLevelParameterfvEXT)load(\"glGetMultiTexLevelParameterfvEXT\");\n\tfp_glGetMultiTexLevelParameterivEXT = (pfn_glGetMultiTexLevelParameterivEXT)load(\"glGetMultiTexLevelParameterivEXT\");\n\tfp_glMultiTexImage3DEXT = (pfn_glMultiTexImage3DEXT)load(\"glMultiTexImage3DEXT\");\n\tfp_glMultiTexSubImage3DEXT = (pfn_glMultiTexSubImage3DEXT)load(\"glMultiTexSubImage3DEXT\");\n\tfp_glCopyMultiTexSubImage3DEXT = (pfn_glCopyMultiTexSubImage3DEXT)load(\"glCopyMultiTexSubImage3DEXT\");\n\tfp_glEnableClientStateIndexedEXT = (pfn_glEnableClientStateIndexedEXT)load(\"glEnableClientStateIndexedEXT\");\n\tfp_glDisableClientStateIndexedEXT = (pfn_glDisableClientStateIndexedEXT)load(\"glDisableClientStateIndexedEXT\");\n\tfp_glGetFloatIndexedvEXT = (pfn_glGetFloatIndexedvEXT)load(\"glGetFloatIndexedvEXT\");\n\tfp_glGetDoubleIndexedvEXT = (pfn_glGetDoubleIndexedvEXT)load(\"glGetDoubleIndexedvEXT\");\n\tfp_glGetPointerIndexedvEXT = (pfn_glGetPointerIndexedvEXT)load(\"glGetPointerIndexedvEXT\");\n\tfp_glEnableIndexedEXT = (pfn_glEnableIndexedEXT)load(\"glEnableIndexedEXT\");\n\tfp_glDisableIndexedEXT = (pfn_glDisableIndexedEXT)load(\"glDisableIndexedEXT\");\n\tfp_glIsEnabledIndexedEXT = (pfn_glIsEnabledIndexedEXT)load(\"glIsEnabledIndexedEXT\");\n\tfp_glGetIntegerIndexedvEXT = (pfn_glGetIntegerIndexedvEXT)load(\"glGetIntegerIndexedvEXT\");\n\tfp_glGetBooleanIndexedvEXT = (pfn_glGetBooleanIndexedvEXT)load(\"glGetBooleanIndexedvEXT\");\n\tfp_glCompressedTextureImage3DEXT = (pfn_glCompressedTextureImage3DEXT)load(\"glCompressedTextureImage3DEXT\");\n\tfp_glCompressedTextureImage2DEXT = (pfn_glCompressedTextureImage2DEXT)load(\"glCompressedTextureImage2DEXT\");\n\tfp_glCompressedTextureImage1DEXT = (pfn_glCompressedTextureImage1DEXT)load(\"glCompressedTextureImage1DEXT\");\n\tfp_glCompressedTextureSubImage3DEXT = (pfn_glCompressedTextureSubImage3DEXT)load(\"glCompressedTextureSubImage3DEXT\");\n\tfp_glCompressedTextureSubImage2DEXT = (pfn_glCompressedTextureSubImage2DEXT)load(\"glCompressedTextureSubImage2DEXT\");\n\tfp_glCompressedTextureSubImage1DEXT = (pfn_glCompressedTextureSubImage1DEXT)load(\"glCompressedTextureSubImage1DEXT\");\n\tfp_glGetCompressedTextureImageEXT = (pfn_glGetCompressedTextureImageEXT)load(\"glGetCompressedTextureImageEXT\");\n\tfp_glCompressedMultiTexImage3DEXT = (pfn_glCompressedMultiTexImage3DEXT)load(\"glCompressedMultiTexImage3DEXT\");\n\tfp_glCompressedMultiTexImage2DEXT = (pfn_glCompressedMultiTexImage2DEXT)load(\"glCompressedMultiTexImage2DEXT\");\n\tfp_glCompressedMultiTexImage1DEXT = (pfn_glCompressedMultiTexImage1DEXT)load(\"glCompressedMultiTexImage1DEXT\");\n\tfp_glCompressedMultiTexSubImage3DEXT = (pfn_glCompressedMultiTexSubImage3DEXT)load(\"glCompressedMultiTexSubImage3DEXT\");\n\tfp_glCompressedMultiTexSubImage2DEXT = (pfn_glCompressedMultiTexSubImage2DEXT)load(\"glCompressedMultiTexSubImage2DEXT\");\n\tfp_glCompressedMultiTexSubImage1DEXT = (pfn_glCompressedMultiTexSubImage1DEXT)load(\"glCompressedMultiTexSubImage1DEXT\");\n\tfp_glGetCompressedMultiTexImageEXT = (pfn_glGetCompressedMultiTexImageEXT)load(\"glGetCompressedMultiTexImageEXT\");\n\tfp_glMatrixLoadTransposefEXT = (pfn_glMatrixLoadTransposefEXT)load(\"glMatrixLoadTransposefEXT\");\n\tfp_glMatrixLoadTransposedEXT = (pfn_glMatrixLoadTransposedEXT)load(\"glMatrixLoadTransposedEXT\");\n\tfp_glMatrixMultTransposefEXT = (pfn_glMatrixMultTransposefEXT)load(\"glMatrixMultTransposefEXT\");\n\tfp_glMatrixMultTransposedEXT = (pfn_glMatrixMultTransposedEXT)load(\"glMatrixMultTransposedEXT\");\n\tfp_glNamedBufferDataEXT = (pfn_glNamedBufferDataEXT)load(\"glNamedBufferDataEXT\");\n\tfp_glNamedBufferSubDataEXT = (pfn_glNamedBufferSubDataEXT)load(\"glNamedBufferSubDataEXT\");\n\tfp_glMapNamedBufferEXT = (pfn_glMapNamedBufferEXT)load(\"glMapNamedBufferEXT\");\n\tfp_glUnmapNamedBufferEXT = (pfn_glUnmapNamedBufferEXT)load(\"glUnmapNamedBufferEXT\");\n\tfp_glGetNamedBufferParameterivEXT = (pfn_glGetNamedBufferParameterivEXT)load(\"glGetNamedBufferParameterivEXT\");\n\tfp_glGetNamedBufferPointervEXT = (pfn_glGetNamedBufferPointervEXT)load(\"glGetNamedBufferPointervEXT\");\n\tfp_glGetNamedBufferSubDataEXT = (pfn_glGetNamedBufferSubDataEXT)load(\"glGetNamedBufferSubDataEXT\");\n\tfp_glProgramUniform1fEXT = (pfn_glProgramUniform1fEXT)load(\"glProgramUniform1fEXT\");\n\tfp_glProgramUniform2fEXT = (pfn_glProgramUniform2fEXT)load(\"glProgramUniform2fEXT\");\n\tfp_glProgramUniform3fEXT = (pfn_glProgramUniform3fEXT)load(\"glProgramUniform3fEXT\");\n\tfp_glProgramUniform4fEXT = (pfn_glProgramUniform4fEXT)load(\"glProgramUniform4fEXT\");\n\tfp_glProgramUniform1iEXT = (pfn_glProgramUniform1iEXT)load(\"glProgramUniform1iEXT\");\n\tfp_glProgramUniform2iEXT = (pfn_glProgramUniform2iEXT)load(\"glProgramUniform2iEXT\");\n\tfp_glProgramUniform3iEXT = (pfn_glProgramUniform3iEXT)load(\"glProgramUniform3iEXT\");\n\tfp_glProgramUniform4iEXT = (pfn_glProgramUniform4iEXT)load(\"glProgramUniform4iEXT\");\n\tfp_glProgramUniform1fvEXT = (pfn_glProgramUniform1fvEXT)load(\"glProgramUniform1fvEXT\");\n\tfp_glProgramUniform2fvEXT = (pfn_glProgramUniform2fvEXT)load(\"glProgramUniform2fvEXT\");\n\tfp_glProgramUniform3fvEXT = (pfn_glProgramUniform3fvEXT)load(\"glProgramUniform3fvEXT\");\n\tfp_glProgramUniform4fvEXT = (pfn_glProgramUniform4fvEXT)load(\"glProgramUniform4fvEXT\");\n\tfp_glProgramUniform1ivEXT = (pfn_glProgramUniform1ivEXT)load(\"glProgramUniform1ivEXT\");\n\tfp_glProgramUniform2ivEXT = (pfn_glProgramUniform2ivEXT)load(\"glProgramUniform2ivEXT\");\n\tfp_glProgramUniform3ivEXT = (pfn_glProgramUniform3ivEXT)load(\"glProgramUniform3ivEXT\");\n\tfp_glProgramUniform4ivEXT = (pfn_glProgramUniform4ivEXT)load(\"glProgramUniform4ivEXT\");\n\tfp_glProgramUniformMatrix2fvEXT = (pfn_glProgramUniformMatrix2fvEXT)load(\"glProgramUniformMatrix2fvEXT\");\n\tfp_glProgramUniformMatrix3fvEXT = (pfn_glProgramUniformMatrix3fvEXT)load(\"glProgramUniformMatrix3fvEXT\");\n\tfp_glProgramUniformMatrix4fvEXT = (pfn_glProgramUniformMatrix4fvEXT)load(\"glProgramUniformMatrix4fvEXT\");\n\tfp_glProgramUniformMatrix2x3fvEXT = (pfn_glProgramUniformMatrix2x3fvEXT)load(\"glProgramUniformMatrix2x3fvEXT\");\n\tfp_glProgramUniformMatrix3x2fvEXT = (pfn_glProgramUniformMatrix3x2fvEXT)load(\"glProgramUniformMatrix3x2fvEXT\");\n\tfp_glProgramUniformMatrix2x4fvEXT = (pfn_glProgramUniformMatrix2x4fvEXT)load(\"glProgramUniformMatrix2x4fvEXT\");\n\tfp_glProgramUniformMatrix4x2fvEXT = (pfn_glProgramUniformMatrix4x2fvEXT)load(\"glProgramUniformMatrix4x2fvEXT\");\n\tfp_glProgramUniformMatrix3x4fvEXT = (pfn_glProgramUniformMatrix3x4fvEXT)load(\"glProgramUniformMatrix3x4fvEXT\");\n\tfp_glProgramUniformMatrix4x3fvEXT = (pfn_glProgramUniformMatrix4x3fvEXT)load(\"glProgramUniformMatrix4x3fvEXT\");\n\tfp_glTextureBufferEXT = (pfn_glTextureBufferEXT)load(\"glTextureBufferEXT\");\n\tfp_glMultiTexBufferEXT = (pfn_glMultiTexBufferEXT)load(\"glMultiTexBufferEXT\");\n\tfp_glTextureParameterIivEXT = (pfn_glTextureParameterIivEXT)load(\"glTextureParameterIivEXT\");\n\tfp_glTextureParameterIuivEXT = (pfn_glTextureParameterIuivEXT)load(\"glTextureParameterIuivEXT\");\n\tfp_glGetTextureParameterIivEXT = (pfn_glGetTextureParameterIivEXT)load(\"glGetTextureParameterIivEXT\");\n\tfp_glGetTextureParameterIuivEXT = (pfn_glGetTextureParameterIuivEXT)load(\"glGetTextureParameterIuivEXT\");\n\tfp_glMultiTexParameterIivEXT = (pfn_glMultiTexParameterIivEXT)load(\"glMultiTexParameterIivEXT\");\n\tfp_glMultiTexParameterIuivEXT = (pfn_glMultiTexParameterIuivEXT)load(\"glMultiTexParameterIuivEXT\");\n\tfp_glGetMultiTexParameterIivEXT = (pfn_glGetMultiTexParameterIivEXT)load(\"glGetMultiTexParameterIivEXT\");\n\tfp_glGetMultiTexParameterIuivEXT = (pfn_glGetMultiTexParameterIuivEXT)load(\"glGetMultiTexParameterIuivEXT\");\n\tfp_glProgramUniform1uiEXT = (pfn_glProgramUniform1uiEXT)load(\"glProgramUniform1uiEXT\");\n\tfp_glProgramUniform2uiEXT = (pfn_glProgramUniform2uiEXT)load(\"glProgramUniform2uiEXT\");\n\tfp_glProgramUniform3uiEXT = (pfn_glProgramUniform3uiEXT)load(\"glProgramUniform3uiEXT\");\n\tfp_glProgramUniform4uiEXT = (pfn_glProgramUniform4uiEXT)load(\"glProgramUniform4uiEXT\");\n\tfp_glProgramUniform1uivEXT = (pfn_glProgramUniform1uivEXT)load(\"glProgramUniform1uivEXT\");\n\tfp_glProgramUniform2uivEXT = (pfn_glProgramUniform2uivEXT)load(\"glProgramUniform2uivEXT\");\n\tfp_glProgramUniform3uivEXT = (pfn_glProgramUniform3uivEXT)load(\"glProgramUniform3uivEXT\");\n\tfp_glProgramUniform4uivEXT = (pfn_glProgramUniform4uivEXT)load(\"glProgramUniform4uivEXT\");\n\tfp_glNamedProgramLocalParameters4fvEXT = (pfn_glNamedProgramLocalParameters4fvEXT)load(\"glNamedProgramLocalParameters4fvEXT\");\n\tfp_glNamedProgramLocalParameterI4iEXT = (pfn_glNamedProgramLocalParameterI4iEXT)load(\"glNamedProgramLocalParameterI4iEXT\");\n\tfp_glNamedProgramLocalParameterI4ivEXT = (pfn_glNamedProgramLocalParameterI4ivEXT)load(\"glNamedProgramLocalParameterI4ivEXT\");\n\tfp_glNamedProgramLocalParametersI4ivEXT = (pfn_glNamedProgramLocalParametersI4ivEXT)load(\"glNamedProgramLocalParametersI4ivEXT\");\n\tfp_glNamedProgramLocalParameterI4uiEXT = (pfn_glNamedProgramLocalParameterI4uiEXT)load(\"glNamedProgramLocalParameterI4uiEXT\");\n\tfp_glNamedProgramLocalParameterI4uivEXT = (pfn_glNamedProgramLocalParameterI4uivEXT)load(\"glNamedProgramLocalParameterI4uivEXT\");\n\tfp_glNamedProgramLocalParametersI4uivEXT = (pfn_glNamedProgramLocalParametersI4uivEXT)load(\"glNamedProgramLocalParametersI4uivEXT\");\n\tfp_glGetNamedProgramLocalParameterIivEXT = (pfn_glGetNamedProgramLocalParameterIivEXT)load(\"glGetNamedProgramLocalParameterIivEXT\");\n\tfp_glGetNamedProgramLocalParameterIuivEXT = (pfn_glGetNamedProgramLocalParameterIuivEXT)load(\"glGetNamedProgramLocalParameterIuivEXT\");\n\tfp_glEnableClientStateiEXT = (pfn_glEnableClientStateiEXT)load(\"glEnableClientStateiEXT\");\n\tfp_glDisableClientStateiEXT = (pfn_glDisableClientStateiEXT)load(\"glDisableClientStateiEXT\");\n\tfp_glGetFloati_vEXT = (pfn_glGetFloati_vEXT)load(\"glGetFloati_vEXT\");\n\tfp_glGetDoublei_vEXT = (pfn_glGetDoublei_vEXT)load(\"glGetDoublei_vEXT\");\n\tfp_glGetPointeri_vEXT = (pfn_glGetPointeri_vEXT)load(\"glGetPointeri_vEXT\");\n\tfp_glNamedProgramStringEXT = (pfn_glNamedProgramStringEXT)load(\"glNamedProgramStringEXT\");\n\tfp_glNamedProgramLocalParameter4dEXT = (pfn_glNamedProgramLocalParameter4dEXT)load(\"glNamedProgramLocalParameter4dEXT\");\n\tfp_glNamedProgramLocalParameter4dvEXT = (pfn_glNamedProgramLocalParameter4dvEXT)load(\"glNamedProgramLocalParameter4dvEXT\");\n\tfp_glNamedProgramLocalParameter4fEXT = (pfn_glNamedProgramLocalParameter4fEXT)load(\"glNamedProgramLocalParameter4fEXT\");\n\tfp_glNamedProgramLocalParameter4fvEXT = (pfn_glNamedProgramLocalParameter4fvEXT)load(\"glNamedProgramLocalParameter4fvEXT\");\n\tfp_glGetNamedProgramLocalParameterdvEXT = (pfn_glGetNamedProgramLocalParameterdvEXT)load(\"glGetNamedProgramLocalParameterdvEXT\");\n\tfp_glGetNamedProgramLocalParameterfvEXT = (pfn_glGetNamedProgramLocalParameterfvEXT)load(\"glGetNamedProgramLocalParameterfvEXT\");\n\tfp_glGetNamedProgramivEXT = (pfn_glGetNamedProgramivEXT)load(\"glGetNamedProgramivEXT\");\n\tfp_glGetNamedProgramStringEXT = (pfn_glGetNamedProgramStringEXT)load(\"glGetNamedProgramStringEXT\");\n\tfp_glNamedRenderbufferStorageEXT = (pfn_glNamedRenderbufferStorageEXT)load(\"glNamedRenderbufferStorageEXT\");\n\tfp_glGetNamedRenderbufferParameterivEXT = (pfn_glGetNamedRenderbufferParameterivEXT)load(\"glGetNamedRenderbufferParameterivEXT\");\n\tfp_glNamedRenderbufferStorageMultisampleEXT = (pfn_glNamedRenderbufferStorageMultisampleEXT)load(\"glNamedRenderbufferStorageMultisampleEXT\");\n\tfp_glNamedRenderbufferStorageMultisampleCoverageEXT = (pfn_glNamedRenderbufferStorageMultisampleCoverageEXT)load(\"glNamedRenderbufferStorageMultisampleCoverageEXT\");\n\tfp_glCheckNamedFramebufferStatusEXT = (pfn_glCheckNamedFramebufferStatusEXT)load(\"glCheckNamedFramebufferStatusEXT\");\n\tfp_glNamedFramebufferTexture1DEXT = (pfn_glNamedFramebufferTexture1DEXT)load(\"glNamedFramebufferTexture1DEXT\");\n\tfp_glNamedFramebufferTexture2DEXT = (pfn_glNamedFramebufferTexture2DEXT)load(\"glNamedFramebufferTexture2DEXT\");\n\tfp_glNamedFramebufferTexture3DEXT = (pfn_glNamedFramebufferTexture3DEXT)load(\"glNamedFramebufferTexture3DEXT\");\n\tfp_glNamedFramebufferRenderbufferEXT = (pfn_glNamedFramebufferRenderbufferEXT)load(\"glNamedFramebufferRenderbufferEXT\");\n\tfp_glGetNamedFramebufferAttachmentParameterivEXT = (pfn_glGetNamedFramebufferAttachmentParameterivEXT)load(\"glGetNamedFramebufferAttachmentParameterivEXT\");\n\tfp_glGenerateTextureMipmapEXT = (pfn_glGenerateTextureMipmapEXT)load(\"glGenerateTextureMipmapEXT\");\n\tfp_glGenerateMultiTexMipmapEXT = (pfn_glGenerateMultiTexMipmapEXT)load(\"glGenerateMultiTexMipmapEXT\");\n\tfp_glFramebufferDrawBufferEXT = (pfn_glFramebufferDrawBufferEXT)load(\"glFramebufferDrawBufferEXT\");\n\tfp_glFramebufferDrawBuffersEXT = (pfn_glFramebufferDrawBuffersEXT)load(\"glFramebufferDrawBuffersEXT\");\n\tfp_glFramebufferReadBufferEXT = (pfn_glFramebufferReadBufferEXT)load(\"glFramebufferReadBufferEXT\");\n\tfp_glGetFramebufferParameterivEXT = (pfn_glGetFramebufferParameterivEXT)load(\"glGetFramebufferParameterivEXT\");\n\tfp_glNamedCopyBufferSubDataEXT = (pfn_glNamedCopyBufferSubDataEXT)load(\"glNamedCopyBufferSubDataEXT\");\n\tfp_glNamedFramebufferTextureEXT = (pfn_glNamedFramebufferTextureEXT)load(\"glNamedFramebufferTextureEXT\");\n\tfp_glNamedFramebufferTextureLayerEXT = (pfn_glNamedFramebufferTextureLayerEXT)load(\"glNamedFramebufferTextureLayerEXT\");\n\tfp_glNamedFramebufferTextureFaceEXT = (pfn_glNamedFramebufferTextureFaceEXT)load(\"glNamedFramebufferTextureFaceEXT\");\n\tfp_glTextureRenderbufferEXT = (pfn_glTextureRenderbufferEXT)load(\"glTextureRenderbufferEXT\");\n\tfp_glMultiTexRenderbufferEXT = (pfn_glMultiTexRenderbufferEXT)load(\"glMultiTexRenderbufferEXT\");\n\tfp_glVertexArrayVertexOffsetEXT = (pfn_glVertexArrayVertexOffsetEXT)load(\"glVertexArrayVertexOffsetEXT\");\n\tfp_glVertexArrayColorOffsetEXT = (pfn_glVertexArrayColorOffsetEXT)load(\"glVertexArrayColorOffsetEXT\");\n\tfp_glVertexArrayEdgeFlagOffsetEXT = (pfn_glVertexArrayEdgeFlagOffsetEXT)load(\"glVertexArrayEdgeFlagOffsetEXT\");\n\tfp_glVertexArrayIndexOffsetEXT = (pfn_glVertexArrayIndexOffsetEXT)load(\"glVertexArrayIndexOffsetEXT\");\n\tfp_glVertexArrayNormalOffsetEXT = (pfn_glVertexArrayNormalOffsetEXT)load(\"glVertexArrayNormalOffsetEXT\");\n\tfp_glVertexArrayTexCoordOffsetEXT = (pfn_glVertexArrayTexCoordOffsetEXT)load(\"glVertexArrayTexCoordOffsetEXT\");\n\tfp_glVertexArrayMultiTexCoordOffsetEXT = (pfn_glVertexArrayMultiTexCoordOffsetEXT)load(\"glVertexArrayMultiTexCoordOffsetEXT\");\n\tfp_glVertexArrayFogCoordOffsetEXT = (pfn_glVertexArrayFogCoordOffsetEXT)load(\"glVertexArrayFogCoordOffsetEXT\");\n\tfp_glVertexArraySecondaryColorOffsetEXT = (pfn_glVertexArraySecondaryColorOffsetEXT)load(\"glVertexArraySecondaryColorOffsetEXT\");\n\tfp_glVertexArrayVertexAttribOffsetEXT = (pfn_glVertexArrayVertexAttribOffsetEXT)load(\"glVertexArrayVertexAttribOffsetEXT\");\n\tfp_glVertexArrayVertexAttribIOffsetEXT = (pfn_glVertexArrayVertexAttribIOffsetEXT)load(\"glVertexArrayVertexAttribIOffsetEXT\");\n\tfp_glEnableVertexArrayEXT = (pfn_glEnableVertexArrayEXT)load(\"glEnableVertexArrayEXT\");\n\tfp_glDisableVertexArrayEXT = (pfn_glDisableVertexArrayEXT)load(\"glDisableVertexArrayEXT\");\n\tfp_glEnableVertexArrayAttribEXT = (pfn_glEnableVertexArrayAttribEXT)load(\"glEnableVertexArrayAttribEXT\");\n\tfp_glDisableVertexArrayAttribEXT = (pfn_glDisableVertexArrayAttribEXT)load(\"glDisableVertexArrayAttribEXT\");\n\tfp_glGetVertexArrayIntegervEXT = (pfn_glGetVertexArrayIntegervEXT)load(\"glGetVertexArrayIntegervEXT\");\n\tfp_glGetVertexArrayPointervEXT = (pfn_glGetVertexArrayPointervEXT)load(\"glGetVertexArrayPointervEXT\");\n\tfp_glGetVertexArrayIntegeri_vEXT = (pfn_glGetVertexArrayIntegeri_vEXT)load(\"glGetVertexArrayIntegeri_vEXT\");\n\tfp_glGetVertexArrayPointeri_vEXT = (pfn_glGetVertexArrayPointeri_vEXT)load(\"glGetVertexArrayPointeri_vEXT\");\n\tfp_glMapNamedBufferRangeEXT = (pfn_glMapNamedBufferRangeEXT)load(\"glMapNamedBufferRangeEXT\");\n\tfp_glFlushMappedNamedBufferRangeEXT = (pfn_glFlushMappedNamedBufferRangeEXT)load(\"glFlushMappedNamedBufferRangeEXT\");\n\tfp_glNamedBufferStorageEXT = (pfn_glNamedBufferStorageEXT)load(\"glNamedBufferStorageEXT\");\n\tfp_glClearNamedBufferDataEXT = (pfn_glClearNamedBufferDataEXT)load(\"glClearNamedBufferDataEXT\");\n\tfp_glClearNamedBufferSubDataEXT = (pfn_glClearNamedBufferSubDataEXT)load(\"glClearNamedBufferSubDataEXT\");\n\tfp_glNamedFramebufferParameteriEXT = (pfn_glNamedFramebufferParameteriEXT)load(\"glNamedFramebufferParameteriEXT\");\n\tfp_glGetNamedFramebufferParameterivEXT = (pfn_glGetNamedFramebufferParameterivEXT)load(\"glGetNamedFramebufferParameterivEXT\");\n\tfp_glProgramUniform1dEXT = (pfn_glProgramUniform1dEXT)load(\"glProgramUniform1dEXT\");\n\tfp_glProgramUniform2dEXT = (pfn_glProgramUniform2dEXT)load(\"glProgramUniform2dEXT\");\n\tfp_glProgramUniform3dEXT = (pfn_glProgramUniform3dEXT)load(\"glProgramUniform3dEXT\");\n\tfp_glProgramUniform4dEXT = (pfn_glProgramUniform4dEXT)load(\"glProgramUniform4dEXT\");\n\tfp_glProgramUniform1dvEXT = (pfn_glProgramUniform1dvEXT)load(\"glProgramUniform1dvEXT\");\n\tfp_glProgramUniform2dvEXT = (pfn_glProgramUniform2dvEXT)load(\"glProgramUniform2dvEXT\");\n\tfp_glProgramUniform3dvEXT = (pfn_glProgramUniform3dvEXT)load(\"glProgramUniform3dvEXT\");\n\tfp_glProgramUniform4dvEXT = (pfn_glProgramUniform4dvEXT)load(\"glProgramUniform4dvEXT\");\n\tfp_glProgramUniformMatrix2dvEXT = (pfn_glProgramUniformMatrix2dvEXT)load(\"glProgramUniformMatrix2dvEXT\");\n\tfp_glProgramUniformMatrix3dvEXT = (pfn_glProgramUniformMatrix3dvEXT)load(\"glProgramUniformMatrix3dvEXT\");\n\tfp_glProgramUniformMatrix4dvEXT = (pfn_glProgramUniformMatrix4dvEXT)load(\"glProgramUniformMatrix4dvEXT\");\n\tfp_glProgramUniformMatrix2x3dvEXT = (pfn_glProgramUniformMatrix2x3dvEXT)load(\"glProgramUniformMatrix2x3dvEXT\");\n\tfp_glProgramUniformMatrix2x4dvEXT = (pfn_glProgramUniformMatrix2x4dvEXT)load(\"glProgramUniformMatrix2x4dvEXT\");\n\tfp_glProgramUniformMatrix3x2dvEXT = (pfn_glProgramUniformMatrix3x2dvEXT)load(\"glProgramUniformMatrix3x2dvEXT\");\n\tfp_glProgramUniformMatrix3x4dvEXT = (pfn_glProgramUniformMatrix3x4dvEXT)load(\"glProgramUniformMatrix3x4dvEXT\");\n\tfp_glProgramUniformMatrix4x2dvEXT = (pfn_glProgramUniformMatrix4x2dvEXT)load(\"glProgramUniformMatrix4x2dvEXT\");\n\tfp_glProgramUniformMatrix4x3dvEXT = (pfn_glProgramUniformMatrix4x3dvEXT)load(\"glProgramUniformMatrix4x3dvEXT\");\n\tfp_glTextureBufferRangeEXT = (pfn_glTextureBufferRangeEXT)load(\"glTextureBufferRangeEXT\");\n\tfp_glTextureStorage1DEXT = (pfn_glTextureStorage1DEXT)load(\"glTextureStorage1DEXT\");\n\tfp_glTextureStorage2DEXT = (pfn_glTextureStorage2DEXT)load(\"glTextureStorage2DEXT\");\n\tfp_glTextureStorage3DEXT = (pfn_glTextureStorage3DEXT)load(\"glTextureStorage3DEXT\");\n\tfp_glTextureStorage2DMultisampleEXT = (pfn_glTextureStorage2DMultisampleEXT)load(\"glTextureStorage2DMultisampleEXT\");\n\tfp_glTextureStorage3DMultisampleEXT = (pfn_glTextureStorage3DMultisampleEXT)load(\"glTextureStorage3DMultisampleEXT\");\n\tfp_glVertexArrayBindVertexBufferEXT = (pfn_glVertexArrayBindVertexBufferEXT)load(\"glVertexArrayBindVertexBufferEXT\");\n\tfp_glVertexArrayVertexAttribFormatEXT = (pfn_glVertexArrayVertexAttribFormatEXT)load(\"glVertexArrayVertexAttribFormatEXT\");\n\tfp_glVertexArrayVertexAttribIFormatEXT = (pfn_glVertexArrayVertexAttribIFormatEXT)load(\"glVertexArrayVertexAttribIFormatEXT\");\n\tfp_glVertexArrayVertexAttribLFormatEXT = (pfn_glVertexArrayVertexAttribLFormatEXT)load(\"glVertexArrayVertexAttribLFormatEXT\");\n\tfp_glVertexArrayVertexAttribBindingEXT = (pfn_glVertexArrayVertexAttribBindingEXT)load(\"glVertexArrayVertexAttribBindingEXT\");\n\tfp_glVertexArrayVertexBindingDivisorEXT = (pfn_glVertexArrayVertexBindingDivisorEXT)load(\"glVertexArrayVertexBindingDivisorEXT\");\n\tfp_glVertexArrayVertexAttribLOffsetEXT = (pfn_glVertexArrayVertexAttribLOffsetEXT)load(\"glVertexArrayVertexAttribLOffsetEXT\");\n\tfp_glTexturePageCommitmentEXT = (pfn_glTexturePageCommitmentEXT)load(\"glTexturePageCommitmentEXT\");\n\tfp_glVertexArrayVertexAttribDivisorEXT = (pfn_glVertexArrayVertexAttribDivisorEXT)load(\"glVertexArrayVertexAttribDivisorEXT\");\n}\n\nGLboolean GLAD_EXT_discard_framebuffer = GL_FALSE;\nstatic void load_GL_EXT_discard_framebuffer(LOADER load) {\n\tif(!GLAD_EXT_discard_framebuffer) return;\n\tfp_glDiscardFramebufferEXT = (pfn_glDiscardFramebufferEXT)load(\"glDiscardFramebufferEXT\");\n}\n\nGLboolean GLAD_EXT_disjoint_timer_query = GL_FALSE;\nstatic void load_GL_EXT_disjoint_timer_query(LOADER load) {\n\tif(!GLAD_EXT_disjoint_timer_query) return;\n\tfp_glGenQueriesEXT = (pfn_glGenQueriesEXT)load(\"glGenQueriesEXT\");\n\tfp_glDeleteQueriesEXT = (pfn_glDeleteQueriesEXT)load(\"glDeleteQueriesEXT\");\n\tfp_glIsQueryEXT = (pfn_glIsQueryEXT)load(\"glIsQueryEXT\");\n\tfp_glBeginQueryEXT = (pfn_glBeginQueryEXT)load(\"glBeginQueryEXT\");\n\tfp_glEndQueryEXT = (pfn_glEndQueryEXT)load(\"glEndQueryEXT\");\n\tfp_glQueryCounterEXT = (pfn_glQueryCounterEXT)load(\"glQueryCounterEXT\");\n\tfp_glGetQueryivEXT = (pfn_glGetQueryivEXT)load(\"glGetQueryivEXT\");\n\tfp_glGetQueryObjectivEXT = (pfn_glGetQueryObjectivEXT)load(\"glGetQueryObjectivEXT\");\n\tfp_glGetQueryObjectuivEXT = (pfn_glGetQueryObjectuivEXT)load(\"glGetQueryObjectuivEXT\");\n\tfp_glGetQueryObjecti64vEXT = (pfn_glGetQueryObjecti64vEXT)load(\"glGetQueryObjecti64vEXT\");\n\tfp_glGetQueryObjectui64vEXT = (pfn_glGetQueryObjectui64vEXT)load(\"glGetQueryObjectui64vEXT\");\n}\n\nGLboolean GLAD_EXT_draw_buffers = GL_FALSE;\nstatic void load_GL_EXT_draw_buffers(LOADER load) {\n\tif(!GLAD_EXT_draw_buffers) return;\n\tfp_glDrawBuffersEXT = (pfn_glDrawBuffersEXT)load(\"glDrawBuffersEXT\");\n}\n\nGLboolean GLAD_EXT_draw_buffers2 = GL_FALSE;\nstatic void load_GL_EXT_draw_buffers2(LOADER load) {\n\tif(!GLAD_EXT_draw_buffers2) return;\n\tfp_glColorMaskIndexedEXT = (pfn_glColorMaskIndexedEXT)load(\"glColorMaskIndexedEXT\");\n\tfp_glGetBooleanIndexedvEXT = (pfn_glGetBooleanIndexedvEXT)load(\"glGetBooleanIndexedvEXT\");\n\tfp_glGetIntegerIndexedvEXT = (pfn_glGetIntegerIndexedvEXT)load(\"glGetIntegerIndexedvEXT\");\n\tfp_glEnableIndexedEXT = (pfn_glEnableIndexedEXT)load(\"glEnableIndexedEXT\");\n\tfp_glDisableIndexedEXT = (pfn_glDisableIndexedEXT)load(\"glDisableIndexedEXT\");\n\tfp_glIsEnabledIndexedEXT = (pfn_glIsEnabledIndexedEXT)load(\"glIsEnabledIndexedEXT\");\n}\n\nGLboolean GLAD_EXT_draw_buffers_indexed = GL_FALSE;\nstatic void load_GL_EXT_draw_buffers_indexed(LOADER load) {\n\tif(!GLAD_EXT_draw_buffers_indexed) return;\n\tfp_glEnableiEXT = (pfn_glEnableiEXT)load(\"glEnableiEXT\");\n\tfp_glDisableiEXT = (pfn_glDisableiEXT)load(\"glDisableiEXT\");\n\tfp_glBlendEquationiEXT = (pfn_glBlendEquationiEXT)load(\"glBlendEquationiEXT\");\n\tfp_glBlendEquationSeparateiEXT = (pfn_glBlendEquationSeparateiEXT)load(\"glBlendEquationSeparateiEXT\");\n\tfp_glBlendFunciEXT = (pfn_glBlendFunciEXT)load(\"glBlendFunciEXT\");\n\tfp_glBlendFuncSeparateiEXT = (pfn_glBlendFuncSeparateiEXT)load(\"glBlendFuncSeparateiEXT\");\n\tfp_glColorMaskiEXT = (pfn_glColorMaskiEXT)load(\"glColorMaskiEXT\");\n\tfp_glIsEnablediEXT = (pfn_glIsEnablediEXT)load(\"glIsEnablediEXT\");\n}\n\nGLboolean GLAD_EXT_draw_elements_base_vertex = GL_FALSE;\nstatic void load_GL_EXT_draw_elements_base_vertex(LOADER load) {\n\tif(!GLAD_EXT_draw_elements_base_vertex) return;\n\tfp_glDrawElementsBaseVertexEXT = (pfn_glDrawElementsBaseVertexEXT)load(\"glDrawElementsBaseVertexEXT\");\n\tfp_glDrawRangeElementsBaseVertexEXT = (pfn_glDrawRangeElementsBaseVertexEXT)load(\"glDrawRangeElementsBaseVertexEXT\");\n\tfp_glDrawElementsInstancedBaseVertexEXT = (pfn_glDrawElementsInstancedBaseVertexEXT)load(\"glDrawElementsInstancedBaseVertexEXT\");\n\tfp_glMultiDrawElementsBaseVertexEXT = (pfn_glMultiDrawElementsBaseVertexEXT)load(\"glMultiDrawElementsBaseVertexEXT\");\n}\n\nGLboolean GLAD_EXT_draw_instanced = GL_FALSE;\nstatic void load_GL_EXT_draw_instanced(LOADER load) {\n\tif(!GLAD_EXT_draw_instanced) return;\n\tfp_glDrawArraysInstancedEXT = (pfn_glDrawArraysInstancedEXT)load(\"glDrawArraysInstancedEXT\");\n\tfp_glDrawElementsInstancedEXT = (pfn_glDrawElementsInstancedEXT)load(\"glDrawElementsInstancedEXT\");\n}\n\nGLboolean GLAD_EXT_float_blend = GL_FALSE;\nGLboolean GLAD_EXT_framebuffer_blit = GL_FALSE;\nstatic void load_GL_EXT_framebuffer_blit(LOADER load) {\n\tif(!GLAD_EXT_framebuffer_blit) return;\n\tfp_glBlitFramebufferEXT = (pfn_glBlitFramebufferEXT)load(\"glBlitFramebufferEXT\");\n}\n\nGLboolean GLAD_EXT_framebuffer_multisample = GL_FALSE;\nstatic void load_GL_EXT_framebuffer_multisample(LOADER load) {\n\tif(!GLAD_EXT_framebuffer_multisample) return;\n\tfp_glRenderbufferStorageMultisampleEXT = (pfn_glRenderbufferStorageMultisampleEXT)load(\"glRenderbufferStorageMultisampleEXT\");\n}\n\nGLboolean GLAD_EXT_framebuffer_multisample_blit_scaled = GL_FALSE;\nGLboolean GLAD_EXT_framebuffer_object = GL_FALSE;\nstatic void load_GL_EXT_framebuffer_object(LOADER load) {\n\tif(!GLAD_EXT_framebuffer_object) return;\n\tfp_glIsRenderbufferEXT = (pfn_glIsRenderbufferEXT)load(\"glIsRenderbufferEXT\");\n\tfp_glBindRenderbufferEXT = (pfn_glBindRenderbufferEXT)load(\"glBindRenderbufferEXT\");\n\tfp_glDeleteRenderbuffersEXT = (pfn_glDeleteRenderbuffersEXT)load(\"glDeleteRenderbuffersEXT\");\n\tfp_glGenRenderbuffersEXT = (pfn_glGenRenderbuffersEXT)load(\"glGenRenderbuffersEXT\");\n\tfp_glRenderbufferStorageEXT = (pfn_glRenderbufferStorageEXT)load(\"glRenderbufferStorageEXT\");\n\tfp_glGetRenderbufferParameterivEXT = (pfn_glGetRenderbufferParameterivEXT)load(\"glGetRenderbufferParameterivEXT\");\n\tfp_glIsFramebufferEXT = (pfn_glIsFramebufferEXT)load(\"glIsFramebufferEXT\");\n\tfp_glBindFramebufferEXT = (pfn_glBindFramebufferEXT)load(\"glBindFramebufferEXT\");\n\tfp_glDeleteFramebuffersEXT = (pfn_glDeleteFramebuffersEXT)load(\"glDeleteFramebuffersEXT\");\n\tfp_glGenFramebuffersEXT = (pfn_glGenFramebuffersEXT)load(\"glGenFramebuffersEXT\");\n\tfp_glCheckFramebufferStatusEXT = (pfn_glCheckFramebufferStatusEXT)load(\"glCheckFramebufferStatusEXT\");\n\tfp_glFramebufferTexture1DEXT = (pfn_glFramebufferTexture1DEXT)load(\"glFramebufferTexture1DEXT\");\n\tfp_glFramebufferTexture2DEXT = (pfn_glFramebufferTexture2DEXT)load(\"glFramebufferTexture2DEXT\");\n\tfp_glFramebufferTexture3DEXT = (pfn_glFramebufferTexture3DEXT)load(\"glFramebufferTexture3DEXT\");\n\tfp_glFramebufferRenderbufferEXT = (pfn_glFramebufferRenderbufferEXT)load(\"glFramebufferRenderbufferEXT\");\n\tfp_glGetFramebufferAttachmentParameterivEXT = (pfn_glGetFramebufferAttachmentParameterivEXT)load(\"glGetFramebufferAttachmentParameterivEXT\");\n\tfp_glGenerateMipmapEXT = (pfn_glGenerateMipmapEXT)load(\"glGenerateMipmapEXT\");\n}\n\nGLboolean GLAD_EXT_framebuffer_sRGB = GL_FALSE;\nGLboolean GLAD_EXT_geometry_point_size = GL_FALSE;\nGLboolean GLAD_EXT_geometry_shader = GL_FALSE;\nstatic void load_GL_EXT_geometry_shader(LOADER load) {\n\tif(!GLAD_EXT_geometry_shader) return;\n\tfp_glFramebufferTextureEXT = (pfn_glFramebufferTextureEXT)load(\"glFramebufferTextureEXT\");\n}\n\nGLboolean GLAD_EXT_geometry_shader4 = GL_FALSE;\nstatic void load_GL_EXT_geometry_shader4(LOADER load) {\n\tif(!GLAD_EXT_geometry_shader4) return;\n\tfp_glProgramParameteriEXT = (pfn_glProgramParameteriEXT)load(\"glProgramParameteriEXT\");\n}\n\nGLboolean GLAD_EXT_gpu_program_parameters = GL_FALSE;\nstatic void load_GL_EXT_gpu_program_parameters(LOADER load) {\n\tif(!GLAD_EXT_gpu_program_parameters) return;\n\tfp_glProgramEnvParameters4fvEXT = (pfn_glProgramEnvParameters4fvEXT)load(\"glProgramEnvParameters4fvEXT\");\n\tfp_glProgramLocalParameters4fvEXT = (pfn_glProgramLocalParameters4fvEXT)load(\"glProgramLocalParameters4fvEXT\");\n}\n\nGLboolean GLAD_EXT_gpu_shader4 = GL_FALSE;\nstatic void load_GL_EXT_gpu_shader4(LOADER load) {\n\tif(!GLAD_EXT_gpu_shader4) return;\n\tfp_glGetUniformuivEXT = (pfn_glGetUniformuivEXT)load(\"glGetUniformuivEXT\");\n\tfp_glBindFragDataLocationEXT = (pfn_glBindFragDataLocationEXT)load(\"glBindFragDataLocationEXT\");\n\tfp_glGetFragDataLocationEXT = (pfn_glGetFragDataLocationEXT)load(\"glGetFragDataLocationEXT\");\n\tfp_glUniform1uiEXT = (pfn_glUniform1uiEXT)load(\"glUniform1uiEXT\");\n\tfp_glUniform2uiEXT = (pfn_glUniform2uiEXT)load(\"glUniform2uiEXT\");\n\tfp_glUniform3uiEXT = (pfn_glUniform3uiEXT)load(\"glUniform3uiEXT\");\n\tfp_glUniform4uiEXT = (pfn_glUniform4uiEXT)load(\"glUniform4uiEXT\");\n\tfp_glUniform1uivEXT = (pfn_glUniform1uivEXT)load(\"glUniform1uivEXT\");\n\tfp_glUniform2uivEXT = (pfn_glUniform2uivEXT)load(\"glUniform2uivEXT\");\n\tfp_glUniform3uivEXT = (pfn_glUniform3uivEXT)load(\"glUniform3uivEXT\");\n\tfp_glUniform4uivEXT = (pfn_glUniform4uivEXT)load(\"glUniform4uivEXT\");\n}\n\nGLboolean GLAD_EXT_gpu_shader5 = GL_FALSE;\nGLboolean GLAD_EXT_instanced_arrays = GL_FALSE;\nstatic void load_GL_EXT_instanced_arrays(LOADER load) {\n\tif(!GLAD_EXT_instanced_arrays) return;\n\tfp_glDrawArraysInstancedEXT = (pfn_glDrawArraysInstancedEXT)load(\"glDrawArraysInstancedEXT\");\n\tfp_glDrawElementsInstancedEXT = (pfn_glDrawElementsInstancedEXT)load(\"glDrawElementsInstancedEXT\");\n\tfp_glVertexAttribDivisorEXT = (pfn_glVertexAttribDivisorEXT)load(\"glVertexAttribDivisorEXT\");\n}\n\nGLboolean GLAD_EXT_map_buffer_range = GL_FALSE;\nstatic void load_GL_EXT_map_buffer_range(LOADER load) {\n\tif(!GLAD_EXT_map_buffer_range) return;\n\tfp_glMapBufferRangeEXT = (pfn_glMapBufferRangeEXT)load(\"glMapBufferRangeEXT\");\n\tfp_glFlushMappedBufferRangeEXT = (pfn_glFlushMappedBufferRangeEXT)load(\"glFlushMappedBufferRangeEXT\");\n}\n\nGLboolean GLAD_EXT_multi_draw_indirect = GL_FALSE;\nstatic void load_GL_EXT_multi_draw_indirect(LOADER load) {\n\tif(!GLAD_EXT_multi_draw_indirect) return;\n\tfp_glMultiDrawArraysIndirectEXT = (pfn_glMultiDrawArraysIndirectEXT)load(\"glMultiDrawArraysIndirectEXT\");\n\tfp_glMultiDrawElementsIndirectEXT = (pfn_glMultiDrawElementsIndirectEXT)load(\"glMultiDrawElementsIndirectEXT\");\n}\n\nGLboolean GLAD_EXT_multisampled_compatibility = GL_FALSE;\nGLboolean GLAD_EXT_multisampled_render_to_texture = GL_FALSE;\nstatic void load_GL_EXT_multisampled_render_to_texture(LOADER load) {\n\tif(!GLAD_EXT_multisampled_render_to_texture) return;\n\tfp_glRenderbufferStorageMultisampleEXT = (pfn_glRenderbufferStorageMultisampleEXT)load(\"glRenderbufferStorageMultisampleEXT\");\n\tfp_glFramebufferTexture2DMultisampleEXT = (pfn_glFramebufferTexture2DMultisampleEXT)load(\"glFramebufferTexture2DMultisampleEXT\");\n}\n\nGLboolean GLAD_EXT_multiview_draw_buffers = GL_FALSE;\nstatic void load_GL_EXT_multiview_draw_buffers(LOADER load) {\n\tif(!GLAD_EXT_multiview_draw_buffers) return;\n\tfp_glReadBufferIndexedEXT = (pfn_glReadBufferIndexedEXT)load(\"glReadBufferIndexedEXT\");\n\tfp_glDrawBuffersIndexedEXT = (pfn_glDrawBuffersIndexedEXT)load(\"glDrawBuffersIndexedEXT\");\n\tfp_glGetIntegeri_vEXT = (pfn_glGetIntegeri_vEXT)load(\"glGetIntegeri_vEXT\");\n}\n\nGLboolean GLAD_EXT_occlusion_query_boolean = GL_FALSE;\nstatic void load_GL_EXT_occlusion_query_boolean(LOADER load) {\n\tif(!GLAD_EXT_occlusion_query_boolean) return;\n\tfp_glGenQueriesEXT = (pfn_glGenQueriesEXT)load(\"glGenQueriesEXT\");\n\tfp_glDeleteQueriesEXT = (pfn_glDeleteQueriesEXT)load(\"glDeleteQueriesEXT\");\n\tfp_glIsQueryEXT = (pfn_glIsQueryEXT)load(\"glIsQueryEXT\");\n\tfp_glBeginQueryEXT = (pfn_glBeginQueryEXT)load(\"glBeginQueryEXT\");\n\tfp_glEndQueryEXT = (pfn_glEndQueryEXT)load(\"glEndQueryEXT\");\n\tfp_glGetQueryivEXT = (pfn_glGetQueryivEXT)load(\"glGetQueryivEXT\");\n\tfp_glGetQueryObjectuivEXT = (pfn_glGetQueryObjectuivEXT)load(\"glGetQueryObjectuivEXT\");\n}\n\nGLboolean GLAD_EXT_packed_depth_stencil = GL_FALSE;\nGLboolean GLAD_EXT_packed_float = GL_FALSE;\nGLboolean GLAD_EXT_pixel_buffer_object = GL_FALSE;\nGLboolean GLAD_EXT_polygon_offset_clamp = GL_FALSE;\nstatic void load_GL_EXT_polygon_offset_clamp(LOADER load) {\n\tif(!GLAD_EXT_polygon_offset_clamp) return;\n\tfp_glPolygonOffsetClampEXT = (pfn_glPolygonOffsetClampEXT)load(\"glPolygonOffsetClampEXT\");\n}\n\nGLboolean GLAD_EXT_post_depth_coverage = GL_FALSE;\nGLboolean GLAD_EXT_primitive_bounding_box = GL_FALSE;\nstatic void load_GL_EXT_primitive_bounding_box(LOADER load) {\n\tif(!GLAD_EXT_primitive_bounding_box) return;\n\tfp_glPrimitiveBoundingBoxEXT = (pfn_glPrimitiveBoundingBoxEXT)load(\"glPrimitiveBoundingBoxEXT\");\n}\n\nGLboolean GLAD_EXT_provoking_vertex = GL_FALSE;\nstatic void load_GL_EXT_provoking_vertex(LOADER load) {\n\tif(!GLAD_EXT_provoking_vertex) return;\n\tfp_glProvokingVertexEXT = (pfn_glProvokingVertexEXT)load(\"glProvokingVertexEXT\");\n}\n\nGLboolean GLAD_EXT_pvrtc_sRGB = GL_FALSE;\nGLboolean GLAD_EXT_raster_multisample = GL_FALSE;\nstatic void load_GL_EXT_raster_multisample(LOADER load) {\n\tif(!GLAD_EXT_raster_multisample) return;\n\tfp_glRasterSamplesEXT = (pfn_glRasterSamplesEXT)load(\"glRasterSamplesEXT\");\n}\n\nGLboolean GLAD_EXT_read_format_bgra = GL_FALSE;\nGLboolean GLAD_EXT_render_snorm = GL_FALSE;\nGLboolean GLAD_EXT_robustness = GL_FALSE;\nstatic void load_GL_EXT_robustness(LOADER load) {\n\tif(!GLAD_EXT_robustness) return;\n\tfp_glGetGraphicsResetStatusEXT = (pfn_glGetGraphicsResetStatusEXT)load(\"glGetGraphicsResetStatusEXT\");\n\tfp_glReadnPixelsEXT = (pfn_glReadnPixelsEXT)load(\"glReadnPixelsEXT\");\n\tfp_glGetnUniformfvEXT = (pfn_glGetnUniformfvEXT)load(\"glGetnUniformfvEXT\");\n\tfp_glGetnUniformivEXT = (pfn_glGetnUniformivEXT)load(\"glGetnUniformivEXT\");\n}\n\nGLboolean GLAD_EXT_separate_shader_objects = GL_FALSE;\nstatic void load_GL_EXT_separate_shader_objects(LOADER load) {\n\tif(!GLAD_EXT_separate_shader_objects) return;\n\tfp_glUseShaderProgramEXT = (pfn_glUseShaderProgramEXT)load(\"glUseShaderProgramEXT\");\n\tfp_glActiveProgramEXT = (pfn_glActiveProgramEXT)load(\"glActiveProgramEXT\");\n\tfp_glCreateShaderProgramEXT = (pfn_glCreateShaderProgramEXT)load(\"glCreateShaderProgramEXT\");\n\tfp_glActiveShaderProgramEXT = (pfn_glActiveShaderProgramEXT)load(\"glActiveShaderProgramEXT\");\n\tfp_glBindProgramPipelineEXT = (pfn_glBindProgramPipelineEXT)load(\"glBindProgramPipelineEXT\");\n\tfp_glCreateShaderProgramvEXT = (pfn_glCreateShaderProgramvEXT)load(\"glCreateShaderProgramvEXT\");\n\tfp_glDeleteProgramPipelinesEXT = (pfn_glDeleteProgramPipelinesEXT)load(\"glDeleteProgramPipelinesEXT\");\n\tfp_glGenProgramPipelinesEXT = (pfn_glGenProgramPipelinesEXT)load(\"glGenProgramPipelinesEXT\");\n\tfp_glGetProgramPipelineInfoLogEXT = (pfn_glGetProgramPipelineInfoLogEXT)load(\"glGetProgramPipelineInfoLogEXT\");\n\tfp_glGetProgramPipelineivEXT = (pfn_glGetProgramPipelineivEXT)load(\"glGetProgramPipelineivEXT\");\n\tfp_glIsProgramPipelineEXT = (pfn_glIsProgramPipelineEXT)load(\"glIsProgramPipelineEXT\");\n\tfp_glProgramParameteriEXT = (pfn_glProgramParameteriEXT)load(\"glProgramParameteriEXT\");\n\tfp_glProgramUniform1fEXT = (pfn_glProgramUniform1fEXT)load(\"glProgramUniform1fEXT\");\n\tfp_glProgramUniform1fvEXT = (pfn_glProgramUniform1fvEXT)load(\"glProgramUniform1fvEXT\");\n\tfp_glProgramUniform1iEXT = (pfn_glProgramUniform1iEXT)load(\"glProgramUniform1iEXT\");\n\tfp_glProgramUniform1ivEXT = (pfn_glProgramUniform1ivEXT)load(\"glProgramUniform1ivEXT\");\n\tfp_glProgramUniform2fEXT = (pfn_glProgramUniform2fEXT)load(\"glProgramUniform2fEXT\");\n\tfp_glProgramUniform2fvEXT = (pfn_glProgramUniform2fvEXT)load(\"glProgramUniform2fvEXT\");\n\tfp_glProgramUniform2iEXT = (pfn_glProgramUniform2iEXT)load(\"glProgramUniform2iEXT\");\n\tfp_glProgramUniform2ivEXT = (pfn_glProgramUniform2ivEXT)load(\"glProgramUniform2ivEXT\");\n\tfp_glProgramUniform3fEXT = (pfn_glProgramUniform3fEXT)load(\"glProgramUniform3fEXT\");\n\tfp_glProgramUniform3fvEXT = (pfn_glProgramUniform3fvEXT)load(\"glProgramUniform3fvEXT\");\n\tfp_glProgramUniform3iEXT = (pfn_glProgramUniform3iEXT)load(\"glProgramUniform3iEXT\");\n\tfp_glProgramUniform3ivEXT = (pfn_glProgramUniform3ivEXT)load(\"glProgramUniform3ivEXT\");\n\tfp_glProgramUniform4fEXT = (pfn_glProgramUniform4fEXT)load(\"glProgramUniform4fEXT\");\n\tfp_glProgramUniform4fvEXT = (pfn_glProgramUniform4fvEXT)load(\"glProgramUniform4fvEXT\");\n\tfp_glProgramUniform4iEXT = (pfn_glProgramUniform4iEXT)load(\"glProgramUniform4iEXT\");\n\tfp_glProgramUniform4ivEXT = (pfn_glProgramUniform4ivEXT)load(\"glProgramUniform4ivEXT\");\n\tfp_glProgramUniformMatrix2fvEXT = (pfn_glProgramUniformMatrix2fvEXT)load(\"glProgramUniformMatrix2fvEXT\");\n\tfp_glProgramUniformMatrix3fvEXT = (pfn_glProgramUniformMatrix3fvEXT)load(\"glProgramUniformMatrix3fvEXT\");\n\tfp_glProgramUniformMatrix4fvEXT = (pfn_glProgramUniformMatrix4fvEXT)load(\"glProgramUniformMatrix4fvEXT\");\n\tfp_glUseProgramStagesEXT = (pfn_glUseProgramStagesEXT)load(\"glUseProgramStagesEXT\");\n\tfp_glValidateProgramPipelineEXT = (pfn_glValidateProgramPipelineEXT)load(\"glValidateProgramPipelineEXT\");\n\tfp_glProgramUniform1uiEXT = (pfn_glProgramUniform1uiEXT)load(\"glProgramUniform1uiEXT\");\n\tfp_glProgramUniform2uiEXT = (pfn_glProgramUniform2uiEXT)load(\"glProgramUniform2uiEXT\");\n\tfp_glProgramUniform3uiEXT = (pfn_glProgramUniform3uiEXT)load(\"glProgramUniform3uiEXT\");\n\tfp_glProgramUniform4uiEXT = (pfn_glProgramUniform4uiEXT)load(\"glProgramUniform4uiEXT\");\n\tfp_glProgramUniform1uivEXT = (pfn_glProgramUniform1uivEXT)load(\"glProgramUniform1uivEXT\");\n\tfp_glProgramUniform2uivEXT = (pfn_glProgramUniform2uivEXT)load(\"glProgramUniform2uivEXT\");\n\tfp_glProgramUniform3uivEXT = (pfn_glProgramUniform3uivEXT)load(\"glProgramUniform3uivEXT\");\n\tfp_glProgramUniform4uivEXT = (pfn_glProgramUniform4uivEXT)load(\"glProgramUniform4uivEXT\");\n\tfp_glProgramUniformMatrix4fvEXT = (pfn_glProgramUniformMatrix4fvEXT)load(\"glProgramUniformMatrix4fvEXT\");\n\tfp_glProgramUniformMatrix2x3fvEXT = (pfn_glProgramUniformMatrix2x3fvEXT)load(\"glProgramUniformMatrix2x3fvEXT\");\n\tfp_glProgramUniformMatrix3x2fvEXT = (pfn_glProgramUniformMatrix3x2fvEXT)load(\"glProgramUniformMatrix3x2fvEXT\");\n\tfp_glProgramUniformMatrix2x4fvEXT = (pfn_glProgramUniformMatrix2x4fvEXT)load(\"glProgramUniformMatrix2x4fvEXT\");\n\tfp_glProgramUniformMatrix4x2fvEXT = (pfn_glProgramUniformMatrix4x2fvEXT)load(\"glProgramUniformMatrix4x2fvEXT\");\n\tfp_glProgramUniformMatrix3x4fvEXT = (pfn_glProgramUniformMatrix3x4fvEXT)load(\"glProgramUniformMatrix3x4fvEXT\");\n\tfp_glProgramUniformMatrix4x3fvEXT = (pfn_glProgramUniformMatrix4x3fvEXT)load(\"glProgramUniformMatrix4x3fvEXT\");\n}\n\nGLboolean GLAD_EXT_shader_framebuffer_fetch = GL_FALSE;\nGLboolean GLAD_EXT_shader_image_load_formatted = GL_FALSE;\nGLboolean GLAD_EXT_shader_image_load_store = GL_FALSE;\nstatic void load_GL_EXT_shader_image_load_store(LOADER load) {\n\tif(!GLAD_EXT_shader_image_load_store) return;\n\tfp_glBindImageTextureEXT = (pfn_glBindImageTextureEXT)load(\"glBindImageTextureEXT\");\n\tfp_glMemoryBarrierEXT = (pfn_glMemoryBarrierEXT)load(\"glMemoryBarrierEXT\");\n}\n\nGLboolean GLAD_EXT_shader_implicit_conversions = GL_FALSE;\nGLboolean GLAD_EXT_shader_integer_mix = GL_FALSE;\nGLboolean GLAD_EXT_shader_io_blocks = GL_FALSE;\nGLboolean GLAD_EXT_shader_pixel_local_storage = GL_FALSE;\nGLboolean GLAD_EXT_shader_texture_lod = GL_FALSE;\nGLboolean GLAD_EXT_shadow_samplers = GL_FALSE;\nGLboolean GLAD_EXT_sparse_texture = GL_FALSE;\nstatic void load_GL_EXT_sparse_texture(LOADER load) {\n\tif(!GLAD_EXT_sparse_texture) return;\n\tfp_glTexPageCommitmentEXT = (pfn_glTexPageCommitmentEXT)load(\"glTexPageCommitmentEXT\");\n}\n\nGLboolean GLAD_EXT_sparse_texture2 = GL_FALSE;\nGLboolean GLAD_EXT_sRGB = GL_FALSE;\nGLboolean GLAD_EXT_sRGB_write_control = GL_FALSE;\nGLboolean GLAD_EXT_stencil_clear_tag = GL_FALSE;\nstatic void load_GL_EXT_stencil_clear_tag(LOADER load) {\n\tif(!GLAD_EXT_stencil_clear_tag) return;\n\tfp_glStencilClearTagEXT = (pfn_glStencilClearTagEXT)load(\"glStencilClearTagEXT\");\n}\n\nGLboolean GLAD_EXT_tessellation_point_size = GL_FALSE;\nGLboolean GLAD_EXT_tessellation_shader = GL_FALSE;\nstatic void load_GL_EXT_tessellation_shader(LOADER load) {\n\tif(!GLAD_EXT_tessellation_shader) return;\n\tfp_glPatchParameteriEXT = (pfn_glPatchParameteriEXT)load(\"glPatchParameteriEXT\");\n}\n\nGLboolean GLAD_EXT_texture_array = GL_FALSE;\nstatic void load_GL_EXT_texture_array(LOADER load) {\n\tif(!GLAD_EXT_texture_array) return;\n\tfp_glFramebufferTextureLayerEXT = (pfn_glFramebufferTextureLayerEXT)load(\"glFramebufferTextureLayerEXT\");\n}\n\nGLboolean GLAD_EXT_texture_border_clamp = GL_FALSE;\nstatic void load_GL_EXT_texture_border_clamp(LOADER load) {\n\tif(!GLAD_EXT_texture_border_clamp) return;\n\tfp_glTexParameterIivEXT = (pfn_glTexParameterIivEXT)load(\"glTexParameterIivEXT\");\n\tfp_glTexParameterIuivEXT = (pfn_glTexParameterIuivEXT)load(\"glTexParameterIuivEXT\");\n\tfp_glGetTexParameterIivEXT = (pfn_glGetTexParameterIivEXT)load(\"glGetTexParameterIivEXT\");\n\tfp_glGetTexParameterIuivEXT = (pfn_glGetTexParameterIuivEXT)load(\"glGetTexParameterIuivEXT\");\n\tfp_glSamplerParameterIivEXT = (pfn_glSamplerParameterIivEXT)load(\"glSamplerParameterIivEXT\");\n\tfp_glSamplerParameterIuivEXT = (pfn_glSamplerParameterIuivEXT)load(\"glSamplerParameterIuivEXT\");\n\tfp_glGetSamplerParameterIivEXT = (pfn_glGetSamplerParameterIivEXT)load(\"glGetSamplerParameterIivEXT\");\n\tfp_glGetSamplerParameterIuivEXT = (pfn_glGetSamplerParameterIuivEXT)load(\"glGetSamplerParameterIuivEXT\");\n}\n\nGLboolean GLAD_EXT_texture_buffer = GL_FALSE;\nstatic void load_GL_EXT_texture_buffer(LOADER load) {\n\tif(!GLAD_EXT_texture_buffer) return;\n\tfp_glTexBufferEXT = (pfn_glTexBufferEXT)load(\"glTexBufferEXT\");\n\tfp_glTexBufferRangeEXT = (pfn_glTexBufferRangeEXT)load(\"glTexBufferRangeEXT\");\n}\n\nGLboolean GLAD_EXT_texture_buffer_object = GL_FALSE;\nstatic void load_GL_EXT_texture_buffer_object(LOADER load) {\n\tif(!GLAD_EXT_texture_buffer_object) return;\n\tfp_glTexBufferEXT = (pfn_glTexBufferEXT)load(\"glTexBufferEXT\");\n}\n\nGLboolean GLAD_EXT_texture_compression_dxt1 = GL_FALSE;\nGLboolean GLAD_EXT_texture_compression_latc = GL_FALSE;\nGLboolean GLAD_EXT_texture_compression_rgtc = GL_FALSE;\nGLboolean GLAD_EXT_texture_compression_s3tc = GL_FALSE;\nGLboolean GLAD_EXT_texture_cube_map = GL_FALSE;\nGLboolean GLAD_EXT_texture_cube_map_array = GL_FALSE;\nGLboolean GLAD_EXT_texture_filter_anisotropic = GL_FALSE;\nGLboolean GLAD_EXT_texture_filter_minmax = GL_FALSE;\nstatic void load_GL_EXT_texture_filter_minmax(LOADER load) {\n\tif(!GLAD_EXT_texture_filter_minmax) return;\n\tfp_glRasterSamplesEXT = (pfn_glRasterSamplesEXT)load(\"glRasterSamplesEXT\");\n}\n\nGLboolean GLAD_EXT_texture_format_BGRA8888 = GL_FALSE;\nGLboolean GLAD_EXT_texture_integer = GL_FALSE;\nstatic void load_GL_EXT_texture_integer(LOADER load) {\n\tif(!GLAD_EXT_texture_integer) return;\n\tfp_glTexParameterIivEXT = (pfn_glTexParameterIivEXT)load(\"glTexParameterIivEXT\");\n\tfp_glTexParameterIuivEXT = (pfn_glTexParameterIuivEXT)load(\"glTexParameterIuivEXT\");\n\tfp_glGetTexParameterIivEXT = (pfn_glGetTexParameterIivEXT)load(\"glGetTexParameterIivEXT\");\n\tfp_glGetTexParameterIuivEXT = (pfn_glGetTexParameterIuivEXT)load(\"glGetTexParameterIuivEXT\");\n\tfp_glClearColorIiEXT = (pfn_glClearColorIiEXT)load(\"glClearColorIiEXT\");\n\tfp_glClearColorIuiEXT = (pfn_glClearColorIuiEXT)load(\"glClearColorIuiEXT\");\n}\n\nGLboolean GLAD_EXT_texture_norm16 = GL_FALSE;\nGLboolean GLAD_EXT_texture_rg = GL_FALSE;\nGLboolean GLAD_EXT_texture_shared_exponent = GL_FALSE;\nGLboolean GLAD_EXT_texture_snorm = GL_FALSE;\nGLboolean GLAD_EXT_texture_sRGB = GL_FALSE;\nGLboolean GLAD_EXT_texture_sRGB_decode = GL_FALSE;\nGLboolean GLAD_EXT_texture_sRGB_R8 = GL_FALSE;\nGLboolean GLAD_EXT_texture_sRGB_RG8 = GL_FALSE;\nGLboolean GLAD_EXT_texture_storage = GL_FALSE;\nstatic void load_GL_EXT_texture_storage(LOADER load) {\n\tif(!GLAD_EXT_texture_storage) return;\n\tfp_glTexStorage1DEXT = (pfn_glTexStorage1DEXT)load(\"glTexStorage1DEXT\");\n\tfp_glTexStorage2DEXT = (pfn_glTexStorage2DEXT)load(\"glTexStorage2DEXT\");\n\tfp_glTexStorage3DEXT = (pfn_glTexStorage3DEXT)load(\"glTexStorage3DEXT\");\n\tfp_glTextureStorage1DEXT = (pfn_glTextureStorage1DEXT)load(\"glTextureStorage1DEXT\");\n\tfp_glTextureStorage2DEXT = (pfn_glTextureStorage2DEXT)load(\"glTextureStorage2DEXT\");\n\tfp_glTextureStorage3DEXT = (pfn_glTextureStorage3DEXT)load(\"glTextureStorage3DEXT\");\n}\n\nGLboolean GLAD_EXT_texture_swizzle = GL_FALSE;\nGLboolean GLAD_EXT_texture_type_2_10_10_10_REV = GL_FALSE;\nGLboolean GLAD_EXT_texture_view = GL_FALSE;\nstatic void load_GL_EXT_texture_view(LOADER load) {\n\tif(!GLAD_EXT_texture_view) return;\n\tfp_glTextureViewEXT = (pfn_glTextureViewEXT)load(\"glTextureViewEXT\");\n}\n\nGLboolean GLAD_EXT_timer_query = GL_FALSE;\nstatic void load_GL_EXT_timer_query(LOADER load) {\n\tif(!GLAD_EXT_timer_query) return;\n\tfp_glGetQueryObjecti64vEXT = (pfn_glGetQueryObjecti64vEXT)load(\"glGetQueryObjecti64vEXT\");\n\tfp_glGetQueryObjectui64vEXT = (pfn_glGetQueryObjectui64vEXT)load(\"glGetQueryObjectui64vEXT\");\n}\n\nGLboolean GLAD_EXT_transform_feedback = GL_FALSE;\nstatic void load_GL_EXT_transform_feedback(LOADER load) {\n\tif(!GLAD_EXT_transform_feedback) return;\n\tfp_glBeginTransformFeedbackEXT = (pfn_glBeginTransformFeedbackEXT)load(\"glBeginTransformFeedbackEXT\");\n\tfp_glEndTransformFeedbackEXT = (pfn_glEndTransformFeedbackEXT)load(\"glEndTransformFeedbackEXT\");\n\tfp_glBindBufferRangeEXT = (pfn_glBindBufferRangeEXT)load(\"glBindBufferRangeEXT\");\n\tfp_glBindBufferOffsetEXT = (pfn_glBindBufferOffsetEXT)load(\"glBindBufferOffsetEXT\");\n\tfp_glBindBufferBaseEXT = (pfn_glBindBufferBaseEXT)load(\"glBindBufferBaseEXT\");\n\tfp_glTransformFeedbackVaryingsEXT = (pfn_glTransformFeedbackVaryingsEXT)load(\"glTransformFeedbackVaryingsEXT\");\n\tfp_glGetTransformFeedbackVaryingEXT = (pfn_glGetTransformFeedbackVaryingEXT)load(\"glGetTransformFeedbackVaryingEXT\");\n}\n\nGLboolean GLAD_EXT_unpack_subimage = GL_FALSE;\nGLboolean GLAD_EXT_vertex_array_bgra = GL_FALSE;\nGLboolean GLAD_EXT_vertex_attrib_64bit = GL_FALSE;\nstatic void load_GL_EXT_vertex_attrib_64bit(LOADER load) {\n\tif(!GLAD_EXT_vertex_attrib_64bit) return;\n\tfp_glVertexAttribL1dEXT = (pfn_glVertexAttribL1dEXT)load(\"glVertexAttribL1dEXT\");\n\tfp_glVertexAttribL2dEXT = (pfn_glVertexAttribL2dEXT)load(\"glVertexAttribL2dEXT\");\n\tfp_glVertexAttribL3dEXT = (pfn_glVertexAttribL3dEXT)load(\"glVertexAttribL3dEXT\");\n\tfp_glVertexAttribL4dEXT = (pfn_glVertexAttribL4dEXT)load(\"glVertexAttribL4dEXT\");\n\tfp_glVertexAttribL1dvEXT = (pfn_glVertexAttribL1dvEXT)load(\"glVertexAttribL1dvEXT\");\n\tfp_glVertexAttribL2dvEXT = (pfn_glVertexAttribL2dvEXT)load(\"glVertexAttribL2dvEXT\");\n\tfp_glVertexAttribL3dvEXT = (pfn_glVertexAttribL3dvEXT)load(\"glVertexAttribL3dvEXT\");\n\tfp_glVertexAttribL4dvEXT = (pfn_glVertexAttribL4dvEXT)load(\"glVertexAttribL4dvEXT\");\n\tfp_glVertexAttribLPointerEXT = (pfn_glVertexAttribLPointerEXT)load(\"glVertexAttribLPointerEXT\");\n\tfp_glGetVertexAttribLdvEXT = (pfn_glGetVertexAttribLdvEXT)load(\"glGetVertexAttribLdvEXT\");\n}\n\nGLboolean GLAD_EXT_x11_sync_object = GL_FALSE;\nstatic void load_GL_EXT_x11_sync_object(LOADER load) {\n\tif(!GLAD_EXT_x11_sync_object) return;\n\tfp_glImportSyncEXT = (pfn_glImportSyncEXT)load(\"glImportSyncEXT\");\n}\n\nGLboolean GLAD_EXT_YUV_target = GL_FALSE;\nGLboolean GLAD_OES_compressed_ETC1_RGB8_sub_texture = GL_FALSE;\nGLboolean GLAD_OES_compressed_ETC1_RGB8_texture = GL_FALSE;\nGLboolean GLAD_OES_copy_image = GL_FALSE;\nstatic void load_GL_OES_copy_image(LOADER load) {\n\tif(!GLAD_OES_copy_image) return;\n\tfp_glCopyImageSubDataOES = (pfn_glCopyImageSubDataOES)load(\"glCopyImageSubDataOES\");\n}\n\nGLboolean GLAD_OES_depth24 = GL_FALSE;\nGLboolean GLAD_OES_depth32 = GL_FALSE;\nGLboolean GLAD_OES_depth_texture = GL_FALSE;\nGLboolean GLAD_OES_draw_buffers_indexed = GL_FALSE;\nstatic void load_GL_OES_draw_buffers_indexed(LOADER load) {\n\tif(!GLAD_OES_draw_buffers_indexed) return;\n\tfp_glEnableiOES = (pfn_glEnableiOES)load(\"glEnableiOES\");\n\tfp_glDisableiOES = (pfn_glDisableiOES)load(\"glDisableiOES\");\n\tfp_glBlendEquationiOES = (pfn_glBlendEquationiOES)load(\"glBlendEquationiOES\");\n\tfp_glBlendEquationSeparateiOES = (pfn_glBlendEquationSeparateiOES)load(\"glBlendEquationSeparateiOES\");\n\tfp_glBlendFunciOES = (pfn_glBlendFunciOES)load(\"glBlendFunciOES\");\n\tfp_glBlendFuncSeparateiOES = (pfn_glBlendFuncSeparateiOES)load(\"glBlendFuncSeparateiOES\");\n\tfp_glColorMaskiOES = (pfn_glColorMaskiOES)load(\"glColorMaskiOES\");\n\tfp_glIsEnablediOES = (pfn_glIsEnablediOES)load(\"glIsEnablediOES\");\n}\n\nGLboolean GLAD_OES_draw_elements_base_vertex = GL_FALSE;\nstatic void load_GL_OES_draw_elements_base_vertex(LOADER load) {\n\tif(!GLAD_OES_draw_elements_base_vertex) return;\n\tfp_glDrawElementsBaseVertexOES = (pfn_glDrawElementsBaseVertexOES)load(\"glDrawElementsBaseVertexOES\");\n\tfp_glDrawRangeElementsBaseVertexOES = (pfn_glDrawRangeElementsBaseVertexOES)load(\"glDrawRangeElementsBaseVertexOES\");\n\tfp_glDrawElementsInstancedBaseVertexOES = (pfn_glDrawElementsInstancedBaseVertexOES)load(\"glDrawElementsInstancedBaseVertexOES\");\n\tfp_glMultiDrawElementsBaseVertexOES = (pfn_glMultiDrawElementsBaseVertexOES)load(\"glMultiDrawElementsBaseVertexOES\");\n}\n\nGLboolean GLAD_OES_EGL_image = GL_FALSE;\nstatic void load_GL_OES_EGL_image(LOADER load) {\n\tif(!GLAD_OES_EGL_image) return;\n\tfp_glEGLImageTargetTexture2DOES = (pfn_glEGLImageTargetTexture2DOES)load(\"glEGLImageTargetTexture2DOES\");\n\tfp_glEGLImageTargetRenderbufferStorageOES = (pfn_glEGLImageTargetRenderbufferStorageOES)load(\"glEGLImageTargetRenderbufferStorageOES\");\n}\n\nGLboolean GLAD_OES_EGL_image_external = GL_FALSE;\nGLboolean GLAD_OES_EGL_image_external_essl3 = GL_FALSE;\nGLboolean GLAD_OES_element_index_uint = GL_FALSE;\nGLboolean GLAD_OES_fbo_render_mipmap = GL_FALSE;\nGLboolean GLAD_OES_fragment_precision_high = GL_FALSE;\nGLboolean GLAD_OES_geometry_point_size = GL_FALSE;\nGLboolean GLAD_OES_geometry_shader = GL_FALSE;\nstatic void load_GL_OES_geometry_shader(LOADER load) {\n\tif(!GLAD_OES_geometry_shader) return;\n\tfp_glFramebufferTextureOES = (pfn_glFramebufferTextureOES)load(\"glFramebufferTextureOES\");\n}\n\nGLboolean GLAD_OES_get_program_binary = GL_FALSE;\nstatic void load_GL_OES_get_program_binary(LOADER load) {\n\tif(!GLAD_OES_get_program_binary) return;\n\tfp_glGetProgramBinaryOES = (pfn_glGetProgramBinaryOES)load(\"glGetProgramBinaryOES\");\n\tfp_glProgramBinaryOES = (pfn_glProgramBinaryOES)load(\"glProgramBinaryOES\");\n}\n\nGLboolean GLAD_OES_gpu_shader5 = GL_FALSE;\nGLboolean GLAD_OES_mapbuffer = GL_FALSE;\nstatic void load_GL_OES_mapbuffer(LOADER load) {\n\tif(!GLAD_OES_mapbuffer) return;\n\tfp_glMapBufferOES = (pfn_glMapBufferOES)load(\"glMapBufferOES\");\n\tfp_glUnmapBufferOES = (pfn_glUnmapBufferOES)load(\"glUnmapBufferOES\");\n\tfp_glGetBufferPointervOES = (pfn_glGetBufferPointervOES)load(\"glGetBufferPointervOES\");\n}\n\nGLboolean GLAD_OES_packed_depth_stencil = GL_FALSE;\nGLboolean GLAD_OES_primitive_bounding_box = GL_FALSE;\nstatic void load_GL_OES_primitive_bounding_box(LOADER load) {\n\tif(!GLAD_OES_primitive_bounding_box) return;\n\tfp_glPrimitiveBoundingBoxOES = (pfn_glPrimitiveBoundingBoxOES)load(\"glPrimitiveBoundingBoxOES\");\n}\n\nGLboolean GLAD_OES_required_internalformat = GL_FALSE;\nGLboolean GLAD_OES_rgb8_rgba8 = GL_FALSE;\nGLboolean GLAD_OES_sample_shading = GL_FALSE;\nstatic void load_GL_OES_sample_shading(LOADER load) {\n\tif(!GLAD_OES_sample_shading) return;\n\tfp_glMinSampleShadingOES = (pfn_glMinSampleShadingOES)load(\"glMinSampleShadingOES\");\n}\n\nGLboolean GLAD_OES_sample_variables = GL_FALSE;\nGLboolean GLAD_OES_shader_image_atomic = GL_FALSE;\nGLboolean GLAD_OES_shader_io_blocks = GL_FALSE;\nGLboolean GLAD_OES_shader_multisample_interpolation = GL_FALSE;\nGLboolean GLAD_OES_standard_derivatives = GL_FALSE;\nGLboolean GLAD_OES_stencil1 = GL_FALSE;\nGLboolean GLAD_OES_stencil4 = GL_FALSE;\nGLboolean GLAD_OES_surfaceless_context = GL_FALSE;\nGLboolean GLAD_OES_tessellation_point_size = GL_FALSE;\nGLboolean GLAD_OES_tessellation_shader = GL_FALSE;\nstatic void load_GL_OES_tessellation_shader(LOADER load) {\n\tif(!GLAD_OES_tessellation_shader) return;\n\tfp_glPatchParameteriOES = (pfn_glPatchParameteriOES)load(\"glPatchParameteriOES\");\n}\n\nGLboolean GLAD_OES_texture_3D = GL_FALSE;\nstatic void load_GL_OES_texture_3D(LOADER load) {\n\tif(!GLAD_OES_texture_3D) return;\n\tfp_glTexImage3DOES = (pfn_glTexImage3DOES)load(\"glTexImage3DOES\");\n\tfp_glTexSubImage3DOES = (pfn_glTexSubImage3DOES)load(\"glTexSubImage3DOES\");\n\tfp_glCopyTexSubImage3DOES = (pfn_glCopyTexSubImage3DOES)load(\"glCopyTexSubImage3DOES\");\n\tfp_glCompressedTexImage3DOES = (pfn_glCompressedTexImage3DOES)load(\"glCompressedTexImage3DOES\");\n\tfp_glCompressedTexSubImage3DOES = (pfn_glCompressedTexSubImage3DOES)load(\"glCompressedTexSubImage3DOES\");\n\tfp_glFramebufferTexture3DOES = (pfn_glFramebufferTexture3DOES)load(\"glFramebufferTexture3DOES\");\n}\n\nGLboolean GLAD_OES_texture_border_clamp = GL_FALSE;\nstatic void load_GL_OES_texture_border_clamp(LOADER load) {\n\tif(!GLAD_OES_texture_border_clamp) return;\n\tfp_glTexParameterIivOES = (pfn_glTexParameterIivOES)load(\"glTexParameterIivOES\");\n\tfp_glTexParameterIuivOES = (pfn_glTexParameterIuivOES)load(\"glTexParameterIuivOES\");\n\tfp_glGetTexParameterIivOES = (pfn_glGetTexParameterIivOES)load(\"glGetTexParameterIivOES\");\n\tfp_glGetTexParameterIuivOES = (pfn_glGetTexParameterIuivOES)load(\"glGetTexParameterIuivOES\");\n\tfp_glSamplerParameterIivOES = (pfn_glSamplerParameterIivOES)load(\"glSamplerParameterIivOES\");\n\tfp_glSamplerParameterIuivOES = (pfn_glSamplerParameterIuivOES)load(\"glSamplerParameterIuivOES\");\n\tfp_glGetSamplerParameterIivOES = (pfn_glGetSamplerParameterIivOES)load(\"glGetSamplerParameterIivOES\");\n\tfp_glGetSamplerParameterIuivOES = (pfn_glGetSamplerParameterIuivOES)load(\"glGetSamplerParameterIuivOES\");\n}\n\nGLboolean GLAD_OES_texture_buffer = GL_FALSE;\nstatic void load_GL_OES_texture_buffer(LOADER load) {\n\tif(!GLAD_OES_texture_buffer) return;\n\tfp_glTexBufferOES = (pfn_glTexBufferOES)load(\"glTexBufferOES\");\n\tfp_glTexBufferRangeOES = (pfn_glTexBufferRangeOES)load(\"glTexBufferRangeOES\");\n}\n\nGLboolean GLAD_OES_texture_compression_astc = GL_FALSE;\nGLboolean GLAD_OES_texture_cube_map_array = GL_FALSE;\nGLboolean GLAD_OES_texture_float = GL_FALSE;\nGLboolean GLAD_OES_texture_float_linear = GL_FALSE;\nGLboolean GLAD_OES_texture_half_float = GL_FALSE;\nGLboolean GLAD_OES_texture_half_float_linear = GL_FALSE;\nGLboolean GLAD_OES_texture_npot = GL_FALSE;\nGLboolean GLAD_OES_texture_stencil8 = GL_FALSE;\nGLboolean GLAD_OES_texture_storage_multisample_2d_array = GL_FALSE;\nstatic void load_GL_OES_texture_storage_multisample_2d_array(LOADER load) {\n\tif(!GLAD_OES_texture_storage_multisample_2d_array) return;\n\tfp_glTexStorage3DMultisampleOES = (pfn_glTexStorage3DMultisampleOES)load(\"glTexStorage3DMultisampleOES\");\n}\n\nGLboolean GLAD_OES_texture_view = GL_FALSE;\nstatic void load_GL_OES_texture_view(LOADER load) {\n\tif(!GLAD_OES_texture_view) return;\n\tfp_glTextureViewOES = (pfn_glTextureViewOES)load(\"glTextureViewOES\");\n}\n\nGLboolean GLAD_OES_vertex_array_object = GL_FALSE;\nstatic void load_GL_OES_vertex_array_object(LOADER load) {\n\tif(!GLAD_OES_vertex_array_object) return;\n\tfp_glBindVertexArrayOES = (pfn_glBindVertexArrayOES)load(\"glBindVertexArrayOES\");\n\tfp_glDeleteVertexArraysOES = (pfn_glDeleteVertexArraysOES)load(\"glDeleteVertexArraysOES\");\n\tfp_glGenVertexArraysOES = (pfn_glGenVertexArraysOES)load(\"glGenVertexArraysOES\");\n\tfp_glIsVertexArrayOES = (pfn_glIsVertexArrayOES)load(\"glIsVertexArrayOES\");\n}\n\nGLboolean GLAD_OES_vertex_half_float = GL_FALSE;\nGLboolean GLAD_OES_vertex_type_10_10_10_2 = GL_FALSE;\nGLboolean GLAD_AMD_blend_minmax_factor = GL_FALSE;\nGLboolean GLAD_AMD_compressed_3DC_texture = GL_FALSE;\nGLboolean GLAD_AMD_compressed_ATC_texture = GL_FALSE;\nGLboolean GLAD_AMD_conservative_depth = GL_FALSE;\nGLboolean GLAD_AMD_debug_output = GL_FALSE;\nstatic void load_GL_AMD_debug_output(LOADER load) {\n\tif(!GLAD_AMD_debug_output) return;\n\tfp_glDebugMessageEnableAMD = (pfn_glDebugMessageEnableAMD)load(\"glDebugMessageEnableAMD\");\n\tfp_glDebugMessageInsertAMD = (pfn_glDebugMessageInsertAMD)load(\"glDebugMessageInsertAMD\");\n\tfp_glDebugMessageCallbackAMD = (pfn_glDebugMessageCallbackAMD)load(\"glDebugMessageCallbackAMD\");\n\tfp_glGetDebugMessageLogAMD = (pfn_glGetDebugMessageLogAMD)load(\"glGetDebugMessageLogAMD\");\n}\n\nGLboolean GLAD_AMD_depth_clamp_separate = GL_FALSE;\nGLboolean GLAD_AMD_draw_buffers_blend = GL_FALSE;\nstatic void load_GL_AMD_draw_buffers_blend(LOADER load) {\n\tif(!GLAD_AMD_draw_buffers_blend) return;\n\tfp_glBlendFuncIndexedAMD = (pfn_glBlendFuncIndexedAMD)load(\"glBlendFuncIndexedAMD\");\n\tfp_glBlendFuncSeparateIndexedAMD = (pfn_glBlendFuncSeparateIndexedAMD)load(\"glBlendFuncSeparateIndexedAMD\");\n\tfp_glBlendEquationIndexedAMD = (pfn_glBlendEquationIndexedAMD)load(\"glBlendEquationIndexedAMD\");\n\tfp_glBlendEquationSeparateIndexedAMD = (pfn_glBlendEquationSeparateIndexedAMD)load(\"glBlendEquationSeparateIndexedAMD\");\n}\n\nGLboolean GLAD_AMD_gcn_shader = GL_FALSE;\nGLboolean GLAD_AMD_gpu_shader_int64 = GL_FALSE;\nstatic void load_GL_AMD_gpu_shader_int64(LOADER load) {\n\tif(!GLAD_AMD_gpu_shader_int64) return;\n\tfp_glUniform1i64NV = (pfn_glUniform1i64NV)load(\"glUniform1i64NV\");\n\tfp_glUniform2i64NV = (pfn_glUniform2i64NV)load(\"glUniform2i64NV\");\n\tfp_glUniform3i64NV = (pfn_glUniform3i64NV)load(\"glUniform3i64NV\");\n\tfp_glUniform4i64NV = (pfn_glUniform4i64NV)load(\"glUniform4i64NV\");\n\tfp_glUniform1i64vNV = (pfn_glUniform1i64vNV)load(\"glUniform1i64vNV\");\n\tfp_glUniform2i64vNV = (pfn_glUniform2i64vNV)load(\"glUniform2i64vNV\");\n\tfp_glUniform3i64vNV = (pfn_glUniform3i64vNV)load(\"glUniform3i64vNV\");\n\tfp_glUniform4i64vNV = (pfn_glUniform4i64vNV)load(\"glUniform4i64vNV\");\n\tfp_glUniform1ui64NV = (pfn_glUniform1ui64NV)load(\"glUniform1ui64NV\");\n\tfp_glUniform2ui64NV = (pfn_glUniform2ui64NV)load(\"glUniform2ui64NV\");\n\tfp_glUniform3ui64NV = (pfn_glUniform3ui64NV)load(\"glUniform3ui64NV\");\n\tfp_glUniform4ui64NV = (pfn_glUniform4ui64NV)load(\"glUniform4ui64NV\");\n\tfp_glUniform1ui64vNV = (pfn_glUniform1ui64vNV)load(\"glUniform1ui64vNV\");\n\tfp_glUniform2ui64vNV = (pfn_glUniform2ui64vNV)load(\"glUniform2ui64vNV\");\n\tfp_glUniform3ui64vNV = (pfn_glUniform3ui64vNV)load(\"glUniform3ui64vNV\");\n\tfp_glUniform4ui64vNV = (pfn_glUniform4ui64vNV)load(\"glUniform4ui64vNV\");\n\tfp_glGetUniformi64vNV = (pfn_glGetUniformi64vNV)load(\"glGetUniformi64vNV\");\n\tfp_glGetUniformui64vNV = (pfn_glGetUniformui64vNV)load(\"glGetUniformui64vNV\");\n\tfp_glProgramUniform1i64NV = (pfn_glProgramUniform1i64NV)load(\"glProgramUniform1i64NV\");\n\tfp_glProgramUniform2i64NV = (pfn_glProgramUniform2i64NV)load(\"glProgramUniform2i64NV\");\n\tfp_glProgramUniform3i64NV = (pfn_glProgramUniform3i64NV)load(\"glProgramUniform3i64NV\");\n\tfp_glProgramUniform4i64NV = (pfn_glProgramUniform4i64NV)load(\"glProgramUniform4i64NV\");\n\tfp_glProgramUniform1i64vNV = (pfn_glProgramUniform1i64vNV)load(\"glProgramUniform1i64vNV\");\n\tfp_glProgramUniform2i64vNV = (pfn_glProgramUniform2i64vNV)load(\"glProgramUniform2i64vNV\");\n\tfp_glProgramUniform3i64vNV = (pfn_glProgramUniform3i64vNV)load(\"glProgramUniform3i64vNV\");\n\tfp_glProgramUniform4i64vNV = (pfn_glProgramUniform4i64vNV)load(\"glProgramUniform4i64vNV\");\n\tfp_glProgramUniform1ui64NV = (pfn_glProgramUniform1ui64NV)load(\"glProgramUniform1ui64NV\");\n\tfp_glProgramUniform2ui64NV = (pfn_glProgramUniform2ui64NV)load(\"glProgramUniform2ui64NV\");\n\tfp_glProgramUniform3ui64NV = (pfn_glProgramUniform3ui64NV)load(\"glProgramUniform3ui64NV\");\n\tfp_glProgramUniform4ui64NV = (pfn_glProgramUniform4ui64NV)load(\"glProgramUniform4ui64NV\");\n\tfp_glProgramUniform1ui64vNV = (pfn_glProgramUniform1ui64vNV)load(\"glProgramUniform1ui64vNV\");\n\tfp_glProgramUniform2ui64vNV = (pfn_glProgramUniform2ui64vNV)load(\"glProgramUniform2ui64vNV\");\n\tfp_glProgramUniform3ui64vNV = (pfn_glProgramUniform3ui64vNV)load(\"glProgramUniform3ui64vNV\");\n\tfp_glProgramUniform4ui64vNV = (pfn_glProgramUniform4ui64vNV)load(\"glProgramUniform4ui64vNV\");\n}\n\nGLboolean GLAD_AMD_interleaved_elements = GL_FALSE;\nstatic void load_GL_AMD_interleaved_elements(LOADER load) {\n\tif(!GLAD_AMD_interleaved_elements) return;\n\tfp_glVertexAttribParameteriAMD = (pfn_glVertexAttribParameteriAMD)load(\"glVertexAttribParameteriAMD\");\n}\n\nGLboolean GLAD_AMD_multi_draw_indirect = GL_FALSE;\nstatic void load_GL_AMD_multi_draw_indirect(LOADER load) {\n\tif(!GLAD_AMD_multi_draw_indirect) return;\n\tfp_glMultiDrawArraysIndirectAMD = (pfn_glMultiDrawArraysIndirectAMD)load(\"glMultiDrawArraysIndirectAMD\");\n\tfp_glMultiDrawElementsIndirectAMD = (pfn_glMultiDrawElementsIndirectAMD)load(\"glMultiDrawElementsIndirectAMD\");\n}\n\nGLboolean GLAD_AMD_name_gen_delete = GL_FALSE;\nstatic void load_GL_AMD_name_gen_delete(LOADER load) {\n\tif(!GLAD_AMD_name_gen_delete) return;\n\tfp_glGenNamesAMD = (pfn_glGenNamesAMD)load(\"glGenNamesAMD\");\n\tfp_glDeleteNamesAMD = (pfn_glDeleteNamesAMD)load(\"glDeleteNamesAMD\");\n\tfp_glIsNameAMD = (pfn_glIsNameAMD)load(\"glIsNameAMD\");\n}\n\nGLboolean GLAD_AMD_occlusion_query_event = GL_FALSE;\nstatic void load_GL_AMD_occlusion_query_event(LOADER load) {\n\tif(!GLAD_AMD_occlusion_query_event) return;\n\tfp_glQueryObjectParameteruiAMD = (pfn_glQueryObjectParameteruiAMD)load(\"glQueryObjectParameteruiAMD\");\n}\n\nGLboolean GLAD_AMD_performance_monitor = GL_FALSE;\nstatic void load_GL_AMD_performance_monitor(LOADER load) {\n\tif(!GLAD_AMD_performance_monitor) return;\n\tfp_glGetPerfMonitorGroupsAMD = (pfn_glGetPerfMonitorGroupsAMD)load(\"glGetPerfMonitorGroupsAMD\");\n\tfp_glGetPerfMonitorCountersAMD = (pfn_glGetPerfMonitorCountersAMD)load(\"glGetPerfMonitorCountersAMD\");\n\tfp_glGetPerfMonitorGroupStringAMD = (pfn_glGetPerfMonitorGroupStringAMD)load(\"glGetPerfMonitorGroupStringAMD\");\n\tfp_glGetPerfMonitorCounterStringAMD = (pfn_glGetPerfMonitorCounterStringAMD)load(\"glGetPerfMonitorCounterStringAMD\");\n\tfp_glGetPerfMonitorCounterInfoAMD = (pfn_glGetPerfMonitorCounterInfoAMD)load(\"glGetPerfMonitorCounterInfoAMD\");\n\tfp_glGenPerfMonitorsAMD = (pfn_glGenPerfMonitorsAMD)load(\"glGenPerfMonitorsAMD\");\n\tfp_glDeletePerfMonitorsAMD = (pfn_glDeletePerfMonitorsAMD)load(\"glDeletePerfMonitorsAMD\");\n\tfp_glSelectPerfMonitorCountersAMD = (pfn_glSelectPerfMonitorCountersAMD)load(\"glSelectPerfMonitorCountersAMD\");\n\tfp_glBeginPerfMonitorAMD = (pfn_glBeginPerfMonitorAMD)load(\"glBeginPerfMonitorAMD\");\n\tfp_glEndPerfMonitorAMD = (pfn_glEndPerfMonitorAMD)load(\"glEndPerfMonitorAMD\");\n\tfp_glGetPerfMonitorCounterDataAMD = (pfn_glGetPerfMonitorCounterDataAMD)load(\"glGetPerfMonitorCounterDataAMD\");\n}\n\nGLboolean GLAD_AMD_pinned_memory = GL_FALSE;\nGLboolean GLAD_AMD_program_binary_Z400 = GL_FALSE;\nGLboolean GLAD_AMD_query_buffer_object = GL_FALSE;\nGLboolean GLAD_AMD_sample_positions = GL_FALSE;\nstatic void load_GL_AMD_sample_positions(LOADER load) {\n\tif(!GLAD_AMD_sample_positions) return;\n\tfp_glSetMultisamplefvAMD = (pfn_glSetMultisamplefvAMD)load(\"glSetMultisamplefvAMD\");\n}\n\nGLboolean GLAD_AMD_seamless_cubemap_per_texture = GL_FALSE;\nGLboolean GLAD_AMD_shader_atomic_counter_ops = GL_FALSE;\nGLboolean GLAD_AMD_shader_stencil_export = GL_FALSE;\nGLboolean GLAD_AMD_shader_trinary_minmax = GL_FALSE;\nGLboolean GLAD_AMD_sparse_texture = GL_FALSE;\nstatic void load_GL_AMD_sparse_texture(LOADER load) {\n\tif(!GLAD_AMD_sparse_texture) return;\n\tfp_glTexStorageSparseAMD = (pfn_glTexStorageSparseAMD)load(\"glTexStorageSparseAMD\");\n\tfp_glTextureStorageSparseAMD = (pfn_glTextureStorageSparseAMD)load(\"glTextureStorageSparseAMD\");\n}\n\nGLboolean GLAD_AMD_stencil_operation_extended = GL_FALSE;\nstatic void load_GL_AMD_stencil_operation_extended(LOADER load) {\n\tif(!GLAD_AMD_stencil_operation_extended) return;\n\tfp_glStencilOpValueAMD = (pfn_glStencilOpValueAMD)load(\"glStencilOpValueAMD\");\n}\n\nGLboolean GLAD_AMD_texture_texture4 = GL_FALSE;\nGLboolean GLAD_AMD_transform_feedback3_lines_triangles = GL_FALSE;\nGLboolean GLAD_AMD_transform_feedback4 = GL_FALSE;\nGLboolean GLAD_AMD_vertex_shader_layer = GL_FALSE;\nGLboolean GLAD_AMD_vertex_shader_tessellator = GL_FALSE;\nstatic void load_GL_AMD_vertex_shader_tessellator(LOADER load) {\n\tif(!GLAD_AMD_vertex_shader_tessellator) return;\n\tfp_glTessellationFactorAMD = (pfn_glTessellationFactorAMD)load(\"glTessellationFactorAMD\");\n\tfp_glTessellationModeAMD = (pfn_glTessellationModeAMD)load(\"glTessellationModeAMD\");\n}\n\nGLboolean GLAD_AMD_vertex_shader_viewport_index = GL_FALSE;\nGLboolean GLAD_ANDROID_extension_pack_es31a = GL_FALSE;\nGLboolean GLAD_ANGLE_depth_texture = GL_FALSE;\nGLboolean GLAD_ANGLE_framebuffer_blit = GL_FALSE;\nstatic void load_GL_ANGLE_framebuffer_blit(LOADER load) {\n\tif(!GLAD_ANGLE_framebuffer_blit) return;\n\tfp_glBlitFramebufferANGLE = (pfn_glBlitFramebufferANGLE)load(\"glBlitFramebufferANGLE\");\n}\n\nGLboolean GLAD_ANGLE_framebuffer_multisample = GL_FALSE;\nstatic void load_GL_ANGLE_framebuffer_multisample(LOADER load) {\n\tif(!GLAD_ANGLE_framebuffer_multisample) return;\n\tfp_glRenderbufferStorageMultisampleANGLE = (pfn_glRenderbufferStorageMultisampleANGLE)load(\"glRenderbufferStorageMultisampleANGLE\");\n}\n\nGLboolean GLAD_ANGLE_instanced_arrays = GL_FALSE;\nstatic void load_GL_ANGLE_instanced_arrays(LOADER load) {\n\tif(!GLAD_ANGLE_instanced_arrays) return;\n\tfp_glDrawArraysInstancedANGLE = (pfn_glDrawArraysInstancedANGLE)load(\"glDrawArraysInstancedANGLE\");\n\tfp_glDrawElementsInstancedANGLE = (pfn_glDrawElementsInstancedANGLE)load(\"glDrawElementsInstancedANGLE\");\n\tfp_glVertexAttribDivisorANGLE = (pfn_glVertexAttribDivisorANGLE)load(\"glVertexAttribDivisorANGLE\");\n}\n\nGLboolean GLAD_ANGLE_pack_reverse_row_order = GL_FALSE;\nGLboolean GLAD_ANGLE_program_binary = GL_FALSE;\nGLboolean GLAD_ANGLE_texture_compression_dxt3 = GL_FALSE;\nGLboolean GLAD_ANGLE_texture_compression_dxt5 = GL_FALSE;\nGLboolean GLAD_ANGLE_texture_usage = GL_FALSE;\nGLboolean GLAD_ANGLE_translated_shader_source = GL_FALSE;\nstatic void load_GL_ANGLE_translated_shader_source(LOADER load) {\n\tif(!GLAD_ANGLE_translated_shader_source) return;\n\tfp_glGetTranslatedShaderSourceANGLE = (pfn_glGetTranslatedShaderSourceANGLE)load(\"glGetTranslatedShaderSourceANGLE\");\n}\n\nGLboolean GLAD_APPLE_aux_depth_stencil = GL_FALSE;\nGLboolean GLAD_APPLE_client_storage = GL_FALSE;\nGLboolean GLAD_APPLE_clip_distance = GL_FALSE;\nGLboolean GLAD_APPLE_color_buffer_packed_float = GL_FALSE;\nGLboolean GLAD_APPLE_copy_texture_levels = GL_FALSE;\nstatic void load_GL_APPLE_copy_texture_levels(LOADER load) {\n\tif(!GLAD_APPLE_copy_texture_levels) return;\n\tfp_glCopyTextureLevelsAPPLE = (pfn_glCopyTextureLevelsAPPLE)load(\"glCopyTextureLevelsAPPLE\");\n}\n\nGLboolean GLAD_APPLE_element_array = GL_FALSE;\nstatic void load_GL_APPLE_element_array(LOADER load) {\n\tif(!GLAD_APPLE_element_array) return;\n\tfp_glElementPointerAPPLE = (pfn_glElementPointerAPPLE)load(\"glElementPointerAPPLE\");\n\tfp_glDrawElementArrayAPPLE = (pfn_glDrawElementArrayAPPLE)load(\"glDrawElementArrayAPPLE\");\n\tfp_glDrawRangeElementArrayAPPLE = (pfn_glDrawRangeElementArrayAPPLE)load(\"glDrawRangeElementArrayAPPLE\");\n\tfp_glMultiDrawElementArrayAPPLE = (pfn_glMultiDrawElementArrayAPPLE)load(\"glMultiDrawElementArrayAPPLE\");\n\tfp_glMultiDrawRangeElementArrayAPPLE = (pfn_glMultiDrawRangeElementArrayAPPLE)load(\"glMultiDrawRangeElementArrayAPPLE\");\n}\n\nGLboolean GLAD_APPLE_fence = GL_FALSE;\nstatic void load_GL_APPLE_fence(LOADER load) {\n\tif(!GLAD_APPLE_fence) return;\n\tfp_glGenFencesAPPLE = (pfn_glGenFencesAPPLE)load(\"glGenFencesAPPLE\");\n\tfp_glDeleteFencesAPPLE = (pfn_glDeleteFencesAPPLE)load(\"glDeleteFencesAPPLE\");\n\tfp_glSetFenceAPPLE = (pfn_glSetFenceAPPLE)load(\"glSetFenceAPPLE\");\n\tfp_glIsFenceAPPLE = (pfn_glIsFenceAPPLE)load(\"glIsFenceAPPLE\");\n\tfp_glTestFenceAPPLE = (pfn_glTestFenceAPPLE)load(\"glTestFenceAPPLE\");\n\tfp_glFinishFenceAPPLE = (pfn_glFinishFenceAPPLE)load(\"glFinishFenceAPPLE\");\n\tfp_glTestObjectAPPLE = (pfn_glTestObjectAPPLE)load(\"glTestObjectAPPLE\");\n\tfp_glFinishObjectAPPLE = (pfn_glFinishObjectAPPLE)load(\"glFinishObjectAPPLE\");\n}\n\nGLboolean GLAD_APPLE_float_pixels = GL_FALSE;\nGLboolean GLAD_APPLE_flush_buffer_range = GL_FALSE;\nstatic void load_GL_APPLE_flush_buffer_range(LOADER load) {\n\tif(!GLAD_APPLE_flush_buffer_range) return;\n\tfp_glBufferParameteriAPPLE = (pfn_glBufferParameteriAPPLE)load(\"glBufferParameteriAPPLE\");\n\tfp_glFlushMappedBufferRangeAPPLE = (pfn_glFlushMappedBufferRangeAPPLE)load(\"glFlushMappedBufferRangeAPPLE\");\n}\n\nGLboolean GLAD_APPLE_framebuffer_multisample = GL_FALSE;\nstatic void load_GL_APPLE_framebuffer_multisample(LOADER load) {\n\tif(!GLAD_APPLE_framebuffer_multisample) return;\n\tfp_glRenderbufferStorageMultisampleAPPLE = (pfn_glRenderbufferStorageMultisampleAPPLE)load(\"glRenderbufferStorageMultisampleAPPLE\");\n\tfp_glResolveMultisampleFramebufferAPPLE = (pfn_glResolveMultisampleFramebufferAPPLE)load(\"glResolveMultisampleFramebufferAPPLE\");\n}\n\nGLboolean GLAD_APPLE_object_purgeable = GL_FALSE;\nstatic void load_GL_APPLE_object_purgeable(LOADER load) {\n\tif(!GLAD_APPLE_object_purgeable) return;\n\tfp_glObjectPurgeableAPPLE = (pfn_glObjectPurgeableAPPLE)load(\"glObjectPurgeableAPPLE\");\n\tfp_glObjectUnpurgeableAPPLE = (pfn_glObjectUnpurgeableAPPLE)load(\"glObjectUnpurgeableAPPLE\");\n\tfp_glGetObjectParameterivAPPLE = (pfn_glGetObjectParameterivAPPLE)load(\"glGetObjectParameterivAPPLE\");\n}\n\nGLboolean GLAD_APPLE_rgb_422 = GL_FALSE;\nGLboolean GLAD_APPLE_row_bytes = GL_FALSE;\nGLboolean GLAD_APPLE_sync = GL_FALSE;\nstatic void load_GL_APPLE_sync(LOADER load) {\n\tif(!GLAD_APPLE_sync) return;\n\tfp_glFenceSyncAPPLE = (pfn_glFenceSyncAPPLE)load(\"glFenceSyncAPPLE\");\n\tfp_glIsSyncAPPLE = (pfn_glIsSyncAPPLE)load(\"glIsSyncAPPLE\");\n\tfp_glDeleteSyncAPPLE = (pfn_glDeleteSyncAPPLE)load(\"glDeleteSyncAPPLE\");\n\tfp_glClientWaitSyncAPPLE = (pfn_glClientWaitSyncAPPLE)load(\"glClientWaitSyncAPPLE\");\n\tfp_glWaitSyncAPPLE = (pfn_glWaitSyncAPPLE)load(\"glWaitSyncAPPLE\");\n\tfp_glGetInteger64vAPPLE = (pfn_glGetInteger64vAPPLE)load(\"glGetInteger64vAPPLE\");\n\tfp_glGetSyncivAPPLE = (pfn_glGetSyncivAPPLE)load(\"glGetSyncivAPPLE\");\n}\n\nGLboolean GLAD_APPLE_texture_format_BGRA8888 = GL_FALSE;\nGLboolean GLAD_APPLE_texture_max_level = GL_FALSE;\nGLboolean GLAD_APPLE_texture_packed_float = GL_FALSE;\nGLboolean GLAD_APPLE_texture_range = GL_FALSE;\nstatic void load_GL_APPLE_texture_range(LOADER load) {\n\tif(!GLAD_APPLE_texture_range) return;\n\tfp_glTextureRangeAPPLE = (pfn_glTextureRangeAPPLE)load(\"glTextureRangeAPPLE\");\n\tfp_glGetTexParameterPointervAPPLE = (pfn_glGetTexParameterPointervAPPLE)load(\"glGetTexParameterPointervAPPLE\");\n}\n\nGLboolean GLAD_APPLE_vertex_array_object = GL_FALSE;\nstatic void load_GL_APPLE_vertex_array_object(LOADER load) {\n\tif(!GLAD_APPLE_vertex_array_object) return;\n\tfp_glBindVertexArrayAPPLE = (pfn_glBindVertexArrayAPPLE)load(\"glBindVertexArrayAPPLE\");\n\tfp_glDeleteVertexArraysAPPLE = (pfn_glDeleteVertexArraysAPPLE)load(\"glDeleteVertexArraysAPPLE\");\n\tfp_glGenVertexArraysAPPLE = (pfn_glGenVertexArraysAPPLE)load(\"glGenVertexArraysAPPLE\");\n\tfp_glIsVertexArrayAPPLE = (pfn_glIsVertexArrayAPPLE)load(\"glIsVertexArrayAPPLE\");\n}\n\nGLboolean GLAD_APPLE_vertex_array_range = GL_FALSE;\nstatic void load_GL_APPLE_vertex_array_range(LOADER load) {\n\tif(!GLAD_APPLE_vertex_array_range) return;\n\tfp_glVertexArrayRangeAPPLE = (pfn_glVertexArrayRangeAPPLE)load(\"glVertexArrayRangeAPPLE\");\n\tfp_glFlushVertexArrayRangeAPPLE = (pfn_glFlushVertexArrayRangeAPPLE)load(\"glFlushVertexArrayRangeAPPLE\");\n\tfp_glVertexArrayParameteriAPPLE = (pfn_glVertexArrayParameteriAPPLE)load(\"glVertexArrayParameteriAPPLE\");\n}\n\nGLboolean GLAD_APPLE_vertex_program_evaluators = GL_FALSE;\nstatic void load_GL_APPLE_vertex_program_evaluators(LOADER load) {\n\tif(!GLAD_APPLE_vertex_program_evaluators) return;\n\tfp_glEnableVertexAttribAPPLE = (pfn_glEnableVertexAttribAPPLE)load(\"glEnableVertexAttribAPPLE\");\n\tfp_glDisableVertexAttribAPPLE = (pfn_glDisableVertexAttribAPPLE)load(\"glDisableVertexAttribAPPLE\");\n\tfp_glIsVertexAttribEnabledAPPLE = (pfn_glIsVertexAttribEnabledAPPLE)load(\"glIsVertexAttribEnabledAPPLE\");\n\tfp_glMapVertexAttrib1dAPPLE = (pfn_glMapVertexAttrib1dAPPLE)load(\"glMapVertexAttrib1dAPPLE\");\n\tfp_glMapVertexAttrib1fAPPLE = (pfn_glMapVertexAttrib1fAPPLE)load(\"glMapVertexAttrib1fAPPLE\");\n\tfp_glMapVertexAttrib2dAPPLE = (pfn_glMapVertexAttrib2dAPPLE)load(\"glMapVertexAttrib2dAPPLE\");\n\tfp_glMapVertexAttrib2fAPPLE = (pfn_glMapVertexAttrib2fAPPLE)load(\"glMapVertexAttrib2fAPPLE\");\n}\n\nGLboolean GLAD_APPLE_ycbcr_422 = GL_FALSE;\nGLboolean GLAD_ARM_mali_program_binary = GL_FALSE;\nGLboolean GLAD_ARM_mali_shader_binary = GL_FALSE;\nGLboolean GLAD_ARM_rgba8 = GL_FALSE;\nGLboolean GLAD_ARM_shader_framebuffer_fetch = GL_FALSE;\nGLboolean GLAD_ARM_shader_framebuffer_fetch_depth_stencil = GL_FALSE;\nGLboolean GLAD_ATI_meminfo = GL_FALSE;\nGLboolean GLAD_ATI_pixel_format_float = GL_FALSE;\nGLboolean GLAD_DMP_program_binary = GL_FALSE;\nGLboolean GLAD_DMP_shader_binary = GL_FALSE;\nGLboolean GLAD_FJ_shader_binary_GCCSO = GL_FALSE;\nGLboolean GLAD_GREMEDY_frame_terminator = GL_FALSE;\nstatic void load_GL_GREMEDY_frame_terminator(LOADER load) {\n\tif(!GLAD_GREMEDY_frame_terminator) return;\n\tfp_glFrameTerminatorGREMEDY = (pfn_glFrameTerminatorGREMEDY)load(\"glFrameTerminatorGREMEDY\");\n}\n\nGLboolean GLAD_GREMEDY_string_marker = GL_FALSE;\nstatic void load_GL_GREMEDY_string_marker(LOADER load) {\n\tif(!GLAD_GREMEDY_string_marker) return;\n\tfp_glStringMarkerGREMEDY = (pfn_glStringMarkerGREMEDY)load(\"glStringMarkerGREMEDY\");\n}\n\nGLboolean GLAD_IMG_multisampled_render_to_texture = GL_FALSE;\nstatic void load_GL_IMG_multisampled_render_to_texture(LOADER load) {\n\tif(!GLAD_IMG_multisampled_render_to_texture) return;\n\tfp_glRenderbufferStorageMultisampleIMG = (pfn_glRenderbufferStorageMultisampleIMG)load(\"glRenderbufferStorageMultisampleIMG\");\n\tfp_glFramebufferTexture2DMultisampleIMG = (pfn_glFramebufferTexture2DMultisampleIMG)load(\"glFramebufferTexture2DMultisampleIMG\");\n}\n\nGLboolean GLAD_IMG_program_binary = GL_FALSE;\nGLboolean GLAD_IMG_read_format = GL_FALSE;\nGLboolean GLAD_IMG_shader_binary = GL_FALSE;\nGLboolean GLAD_IMG_texture_compression_pvrtc = GL_FALSE;\nGLboolean GLAD_IMG_texture_compression_pvrtc2 = GL_FALSE;\nGLboolean GLAD_IMG_texture_filter_cubic = GL_FALSE;\nGLboolean GLAD_INGR_blend_func_separate = GL_FALSE;\nstatic void load_GL_INGR_blend_func_separate(LOADER load) {\n\tif(!GLAD_INGR_blend_func_separate) return;\n\tfp_glBlendFuncSeparateINGR = (pfn_glBlendFuncSeparateINGR)load(\"glBlendFuncSeparateINGR\");\n}\n\nGLboolean GLAD_INTEL_fragment_shader_ordering = GL_FALSE;\nGLboolean GLAD_INTEL_framebuffer_CMAA = GL_FALSE;\nstatic void load_GL_INTEL_framebuffer_CMAA(LOADER load) {\n\tif(!GLAD_INTEL_framebuffer_CMAA) return;\n\tfp_glApplyFramebufferAttachmentCMAAINTEL = (pfn_glApplyFramebufferAttachmentCMAAINTEL)load(\"glApplyFramebufferAttachmentCMAAINTEL\");\n}\n\nGLboolean GLAD_INTEL_map_texture = GL_FALSE;\nstatic void load_GL_INTEL_map_texture(LOADER load) {\n\tif(!GLAD_INTEL_map_texture) return;\n\tfp_glSyncTextureINTEL = (pfn_glSyncTextureINTEL)load(\"glSyncTextureINTEL\");\n\tfp_glUnmapTexture2DINTEL = (pfn_glUnmapTexture2DINTEL)load(\"glUnmapTexture2DINTEL\");\n\tfp_glMapTexture2DINTEL = (pfn_glMapTexture2DINTEL)load(\"glMapTexture2DINTEL\");\n}\n\nGLboolean GLAD_INTEL_performance_query = GL_FALSE;\nstatic void load_GL_INTEL_performance_query(LOADER load) {\n\tif(!GLAD_INTEL_performance_query) return;\n\tfp_glBeginPerfQueryINTEL = (pfn_glBeginPerfQueryINTEL)load(\"glBeginPerfQueryINTEL\");\n\tfp_glCreatePerfQueryINTEL = (pfn_glCreatePerfQueryINTEL)load(\"glCreatePerfQueryINTEL\");\n\tfp_glDeletePerfQueryINTEL = (pfn_glDeletePerfQueryINTEL)load(\"glDeletePerfQueryINTEL\");\n\tfp_glEndPerfQueryINTEL = (pfn_glEndPerfQueryINTEL)load(\"glEndPerfQueryINTEL\");\n\tfp_glGetFirstPerfQueryIdINTEL = (pfn_glGetFirstPerfQueryIdINTEL)load(\"glGetFirstPerfQueryIdINTEL\");\n\tfp_glGetNextPerfQueryIdINTEL = (pfn_glGetNextPerfQueryIdINTEL)load(\"glGetNextPerfQueryIdINTEL\");\n\tfp_glGetPerfCounterInfoINTEL = (pfn_glGetPerfCounterInfoINTEL)load(\"glGetPerfCounterInfoINTEL\");\n\tfp_glGetPerfQueryDataINTEL = (pfn_glGetPerfQueryDataINTEL)load(\"glGetPerfQueryDataINTEL\");\n\tfp_glGetPerfQueryIdByNameINTEL = (pfn_glGetPerfQueryIdByNameINTEL)load(\"glGetPerfQueryIdByNameINTEL\");\n\tfp_glGetPerfQueryInfoINTEL = (pfn_glGetPerfQueryInfoINTEL)load(\"glGetPerfQueryInfoINTEL\");\n}\n\nGLboolean GLAD_MESA_pack_invert = GL_FALSE;\nGLboolean GLAD_MESA_ycbcr_texture = GL_FALSE;\nGLboolean GLAD_MESAX_texture_stack = GL_FALSE;\nGLboolean GLAD_NV_bindless_multi_draw_indirect = GL_FALSE;\nstatic void load_GL_NV_bindless_multi_draw_indirect(LOADER load) {\n\tif(!GLAD_NV_bindless_multi_draw_indirect) return;\n\tfp_glMultiDrawArraysIndirectBindlessNV = (pfn_glMultiDrawArraysIndirectBindlessNV)load(\"glMultiDrawArraysIndirectBindlessNV\");\n\tfp_glMultiDrawElementsIndirectBindlessNV = (pfn_glMultiDrawElementsIndirectBindlessNV)load(\"glMultiDrawElementsIndirectBindlessNV\");\n}\n\nGLboolean GLAD_NV_bindless_multi_draw_indirect_count = GL_FALSE;\nstatic void load_GL_NV_bindless_multi_draw_indirect_count(LOADER load) {\n\tif(!GLAD_NV_bindless_multi_draw_indirect_count) return;\n\tfp_glMultiDrawArraysIndirectBindlessCountNV = (pfn_glMultiDrawArraysIndirectBindlessCountNV)load(\"glMultiDrawArraysIndirectBindlessCountNV\");\n\tfp_glMultiDrawElementsIndirectBindlessCountNV = (pfn_glMultiDrawElementsIndirectBindlessCountNV)load(\"glMultiDrawElementsIndirectBindlessCountNV\");\n}\n\nGLboolean GLAD_NV_bindless_texture = GL_FALSE;\nstatic void load_GL_NV_bindless_texture(LOADER load) {\n\tif(!GLAD_NV_bindless_texture) return;\n\tfp_glGetTextureHandleNV = (pfn_glGetTextureHandleNV)load(\"glGetTextureHandleNV\");\n\tfp_glGetTextureSamplerHandleNV = (pfn_glGetTextureSamplerHandleNV)load(\"glGetTextureSamplerHandleNV\");\n\tfp_glMakeTextureHandleResidentNV = (pfn_glMakeTextureHandleResidentNV)load(\"glMakeTextureHandleResidentNV\");\n\tfp_glMakeTextureHandleNonResidentNV = (pfn_glMakeTextureHandleNonResidentNV)load(\"glMakeTextureHandleNonResidentNV\");\n\tfp_glGetImageHandleNV = (pfn_glGetImageHandleNV)load(\"glGetImageHandleNV\");\n\tfp_glMakeImageHandleResidentNV = (pfn_glMakeImageHandleResidentNV)load(\"glMakeImageHandleResidentNV\");\n\tfp_glMakeImageHandleNonResidentNV = (pfn_glMakeImageHandleNonResidentNV)load(\"glMakeImageHandleNonResidentNV\");\n\tfp_glUniformHandleui64NV = (pfn_glUniformHandleui64NV)load(\"glUniformHandleui64NV\");\n\tfp_glUniformHandleui64vNV = (pfn_glUniformHandleui64vNV)load(\"glUniformHandleui64vNV\");\n\tfp_glProgramUniformHandleui64NV = (pfn_glProgramUniformHandleui64NV)load(\"glProgramUniformHandleui64NV\");\n\tfp_glProgramUniformHandleui64vNV = (pfn_glProgramUniformHandleui64vNV)load(\"glProgramUniformHandleui64vNV\");\n\tfp_glIsTextureHandleResidentNV = (pfn_glIsTextureHandleResidentNV)load(\"glIsTextureHandleResidentNV\");\n\tfp_glIsImageHandleResidentNV = (pfn_glIsImageHandleResidentNV)load(\"glIsImageHandleResidentNV\");\n}\n\nGLboolean GLAD_NV_blend_equation_advanced = GL_FALSE;\nstatic void load_GL_NV_blend_equation_advanced(LOADER load) {\n\tif(!GLAD_NV_blend_equation_advanced) return;\n\tfp_glBlendParameteriNV = (pfn_glBlendParameteriNV)load(\"glBlendParameteriNV\");\n\tfp_glBlendBarrierNV = (pfn_glBlendBarrierNV)load(\"glBlendBarrierNV\");\n}\n\nGLboolean GLAD_NV_blend_equation_advanced_coherent = GL_FALSE;\nGLboolean GLAD_NV_command_list = GL_FALSE;\nstatic void load_GL_NV_command_list(LOADER load) {\n\tif(!GLAD_NV_command_list) return;\n\tfp_glCreateStatesNV = (pfn_glCreateStatesNV)load(\"glCreateStatesNV\");\n\tfp_glDeleteStatesNV = (pfn_glDeleteStatesNV)load(\"glDeleteStatesNV\");\n\tfp_glIsStateNV = (pfn_glIsStateNV)load(\"glIsStateNV\");\n\tfp_glStateCaptureNV = (pfn_glStateCaptureNV)load(\"glStateCaptureNV\");\n\tfp_glGetCommandHeaderNV = (pfn_glGetCommandHeaderNV)load(\"glGetCommandHeaderNV\");\n\tfp_glGetStageIndexNV = (pfn_glGetStageIndexNV)load(\"glGetStageIndexNV\");\n\tfp_glDrawCommandsNV = (pfn_glDrawCommandsNV)load(\"glDrawCommandsNV\");\n\tfp_glDrawCommandsAddressNV = (pfn_glDrawCommandsAddressNV)load(\"glDrawCommandsAddressNV\");\n\tfp_glDrawCommandsStatesNV = (pfn_glDrawCommandsStatesNV)load(\"glDrawCommandsStatesNV\");\n\tfp_glDrawCommandsStatesAddressNV = (pfn_glDrawCommandsStatesAddressNV)load(\"glDrawCommandsStatesAddressNV\");\n\tfp_glCreateCommandListsNV = (pfn_glCreateCommandListsNV)load(\"glCreateCommandListsNV\");\n\tfp_glDeleteCommandListsNV = (pfn_glDeleteCommandListsNV)load(\"glDeleteCommandListsNV\");\n\tfp_glIsCommandListNV = (pfn_glIsCommandListNV)load(\"glIsCommandListNV\");\n\tfp_glListDrawCommandsStatesClientNV = (pfn_glListDrawCommandsStatesClientNV)load(\"glListDrawCommandsStatesClientNV\");\n\tfp_glCommandListSegmentsNV = (pfn_glCommandListSegmentsNV)load(\"glCommandListSegmentsNV\");\n\tfp_glCompileCommandListNV = (pfn_glCompileCommandListNV)load(\"glCompileCommandListNV\");\n\tfp_glCallCommandListNV = (pfn_glCallCommandListNV)load(\"glCallCommandListNV\");\n}\n\nGLboolean GLAD_NV_compute_program5 = GL_FALSE;\nGLboolean GLAD_NV_conditional_render = GL_FALSE;\nstatic void load_GL_NV_conditional_render(LOADER load) {\n\tif(!GLAD_NV_conditional_render) return;\n\tfp_glBeginConditionalRenderNV = (pfn_glBeginConditionalRenderNV)load(\"glBeginConditionalRenderNV\");\n\tfp_glEndConditionalRenderNV = (pfn_glEndConditionalRenderNV)load(\"glEndConditionalRenderNV\");\n}\n\nGLboolean GLAD_NV_conservative_raster = GL_FALSE;\nstatic void load_GL_NV_conservative_raster(LOADER load) {\n\tif(!GLAD_NV_conservative_raster) return;\n\tfp_glSubpixelPrecisionBiasNV = (pfn_glSubpixelPrecisionBiasNV)load(\"glSubpixelPrecisionBiasNV\");\n}\n\nGLboolean GLAD_NV_conservative_raster_dilate = GL_FALSE;\nstatic void load_GL_NV_conservative_raster_dilate(LOADER load) {\n\tif(!GLAD_NV_conservative_raster_dilate) return;\n\tfp_glConservativeRasterParameterfNV = (pfn_glConservativeRasterParameterfNV)load(\"glConservativeRasterParameterfNV\");\n}\n\nGLboolean GLAD_NV_copy_buffer = GL_FALSE;\nstatic void load_GL_NV_copy_buffer(LOADER load) {\n\tif(!GLAD_NV_copy_buffer) return;\n\tfp_glCopyBufferSubDataNV = (pfn_glCopyBufferSubDataNV)load(\"glCopyBufferSubDataNV\");\n}\n\nGLboolean GLAD_NV_copy_image = GL_FALSE;\nstatic void load_GL_NV_copy_image(LOADER load) {\n\tif(!GLAD_NV_copy_image) return;\n\tfp_glCopyImageSubDataNV = (pfn_glCopyImageSubDataNV)load(\"glCopyImageSubDataNV\");\n}\n\nGLboolean GLAD_NV_coverage_sample = GL_FALSE;\nstatic void load_GL_NV_coverage_sample(LOADER load) {\n\tif(!GLAD_NV_coverage_sample) return;\n\tfp_glCoverageMaskNV = (pfn_glCoverageMaskNV)load(\"glCoverageMaskNV\");\n\tfp_glCoverageOperationNV = (pfn_glCoverageOperationNV)load(\"glCoverageOperationNV\");\n}\n\nGLboolean GLAD_NV_deep_texture3D = GL_FALSE;\nGLboolean GLAD_NV_depth_buffer_float = GL_FALSE;\nstatic void load_GL_NV_depth_buffer_float(LOADER load) {\n\tif(!GLAD_NV_depth_buffer_float) return;\n\tfp_glDepthRangedNV = (pfn_glDepthRangedNV)load(\"glDepthRangedNV\");\n\tfp_glClearDepthdNV = (pfn_glClearDepthdNV)load(\"glClearDepthdNV\");\n\tfp_glDepthBoundsdNV = (pfn_glDepthBoundsdNV)load(\"glDepthBoundsdNV\");\n}\n\nGLboolean GLAD_NV_depth_clamp = GL_FALSE;\nGLboolean GLAD_NV_depth_nonlinear = GL_FALSE;\nGLboolean GLAD_NV_draw_buffers = GL_FALSE;\nstatic void load_GL_NV_draw_buffers(LOADER load) {\n\tif(!GLAD_NV_draw_buffers) return;\n\tfp_glDrawBuffersNV = (pfn_glDrawBuffersNV)load(\"glDrawBuffersNV\");\n}\n\nGLboolean GLAD_NV_draw_instanced = GL_FALSE;\nstatic void load_GL_NV_draw_instanced(LOADER load) {\n\tif(!GLAD_NV_draw_instanced) return;\n\tfp_glDrawArraysInstancedNV = (pfn_glDrawArraysInstancedNV)load(\"glDrawArraysInstancedNV\");\n\tfp_glDrawElementsInstancedNV = (pfn_glDrawElementsInstancedNV)load(\"glDrawElementsInstancedNV\");\n}\n\nGLboolean GLAD_NV_draw_texture = GL_FALSE;\nstatic void load_GL_NV_draw_texture(LOADER load) {\n\tif(!GLAD_NV_draw_texture) return;\n\tfp_glDrawTextureNV = (pfn_glDrawTextureNV)load(\"glDrawTextureNV\");\n}\n\nGLboolean GLAD_NV_explicit_attrib_location = GL_FALSE;\nGLboolean GLAD_NV_explicit_multisample = GL_FALSE;\nstatic void load_GL_NV_explicit_multisample(LOADER load) {\n\tif(!GLAD_NV_explicit_multisample) return;\n\tfp_glGetMultisamplefvNV = (pfn_glGetMultisamplefvNV)load(\"glGetMultisamplefvNV\");\n\tfp_glSampleMaskIndexedNV = (pfn_glSampleMaskIndexedNV)load(\"glSampleMaskIndexedNV\");\n\tfp_glTexRenderbufferNV = (pfn_glTexRenderbufferNV)load(\"glTexRenderbufferNV\");\n}\n\nGLboolean GLAD_NV_fbo_color_attachments = GL_FALSE;\nGLboolean GLAD_NV_fence = GL_FALSE;\nstatic void load_GL_NV_fence(LOADER load) {\n\tif(!GLAD_NV_fence) return;\n\tfp_glDeleteFencesNV = (pfn_glDeleteFencesNV)load(\"glDeleteFencesNV\");\n\tfp_glGenFencesNV = (pfn_glGenFencesNV)load(\"glGenFencesNV\");\n\tfp_glIsFenceNV = (pfn_glIsFenceNV)load(\"glIsFenceNV\");\n\tfp_glTestFenceNV = (pfn_glTestFenceNV)load(\"glTestFenceNV\");\n\tfp_glGetFenceivNV = (pfn_glGetFenceivNV)load(\"glGetFenceivNV\");\n\tfp_glFinishFenceNV = (pfn_glFinishFenceNV)load(\"glFinishFenceNV\");\n\tfp_glSetFenceNV = (pfn_glSetFenceNV)load(\"glSetFenceNV\");\n}\n\nGLboolean GLAD_NV_fill_rectangle = GL_FALSE;\nGLboolean GLAD_NV_float_buffer = GL_FALSE;\nGLboolean GLAD_NV_fragment_coverage_to_color = GL_FALSE;\nstatic void load_GL_NV_fragment_coverage_to_color(LOADER load) {\n\tif(!GLAD_NV_fragment_coverage_to_color) return;\n\tfp_glFragmentCoverageColorNV = (pfn_glFragmentCoverageColorNV)load(\"glFragmentCoverageColorNV\");\n}\n\nGLboolean GLAD_NV_fragment_program4 = GL_FALSE;\nGLboolean GLAD_NV_fragment_shader_interlock = GL_FALSE;\nGLboolean GLAD_NV_framebuffer_blit = GL_FALSE;\nstatic void load_GL_NV_framebuffer_blit(LOADER load) {\n\tif(!GLAD_NV_framebuffer_blit) return;\n\tfp_glBlitFramebufferNV = (pfn_glBlitFramebufferNV)load(\"glBlitFramebufferNV\");\n}\n\nGLboolean GLAD_NV_framebuffer_mixed_samples = GL_FALSE;\nstatic void load_GL_NV_framebuffer_mixed_samples(LOADER load) {\n\tif(!GLAD_NV_framebuffer_mixed_samples) return;\n\tfp_glRasterSamplesEXT = (pfn_glRasterSamplesEXT)load(\"glRasterSamplesEXT\");\n\tfp_glCoverageModulationTableNV = (pfn_glCoverageModulationTableNV)load(\"glCoverageModulationTableNV\");\n\tfp_glGetCoverageModulationTableNV = (pfn_glGetCoverageModulationTableNV)load(\"glGetCoverageModulationTableNV\");\n\tfp_glCoverageModulationNV = (pfn_glCoverageModulationNV)load(\"glCoverageModulationNV\");\n}\n\nGLboolean GLAD_NV_framebuffer_multisample = GL_FALSE;\nstatic void load_GL_NV_framebuffer_multisample(LOADER load) {\n\tif(!GLAD_NV_framebuffer_multisample) return;\n\tfp_glRenderbufferStorageMultisampleNV = (pfn_glRenderbufferStorageMultisampleNV)load(\"glRenderbufferStorageMultisampleNV\");\n}\n\nGLboolean GLAD_NV_framebuffer_multisample_coverage = GL_FALSE;\nstatic void load_GL_NV_framebuffer_multisample_coverage(LOADER load) {\n\tif(!GLAD_NV_framebuffer_multisample_coverage) return;\n\tfp_glRenderbufferStorageMultisampleCoverageNV = (pfn_glRenderbufferStorageMultisampleCoverageNV)load(\"glRenderbufferStorageMultisampleCoverageNV\");\n}\n\nGLboolean GLAD_NV_generate_mipmap_sRGB = GL_FALSE;\nGLboolean GLAD_NV_geometry_program4 = GL_FALSE;\nstatic void load_GL_NV_geometry_program4(LOADER load) {\n\tif(!GLAD_NV_geometry_program4) return;\n\tfp_glProgramVertexLimitNV = (pfn_glProgramVertexLimitNV)load(\"glProgramVertexLimitNV\");\n\tfp_glFramebufferTextureEXT = (pfn_glFramebufferTextureEXT)load(\"glFramebufferTextureEXT\");\n\tfp_glFramebufferTextureLayerEXT = (pfn_glFramebufferTextureLayerEXT)load(\"glFramebufferTextureLayerEXT\");\n\tfp_glFramebufferTextureFaceEXT = (pfn_glFramebufferTextureFaceEXT)load(\"glFramebufferTextureFaceEXT\");\n}\n\nGLboolean GLAD_NV_geometry_shader4 = GL_FALSE;\nGLboolean GLAD_NV_geometry_shader_passthrough = GL_FALSE;\nGLboolean GLAD_NV_gpu_program4 = GL_FALSE;\nstatic void load_GL_NV_gpu_program4(LOADER load) {\n\tif(!GLAD_NV_gpu_program4) return;\n\tfp_glProgramLocalParameterI4iNV = (pfn_glProgramLocalParameterI4iNV)load(\"glProgramLocalParameterI4iNV\");\n\tfp_glProgramLocalParameterI4ivNV = (pfn_glProgramLocalParameterI4ivNV)load(\"glProgramLocalParameterI4ivNV\");\n\tfp_glProgramLocalParametersI4ivNV = (pfn_glProgramLocalParametersI4ivNV)load(\"glProgramLocalParametersI4ivNV\");\n\tfp_glProgramLocalParameterI4uiNV = (pfn_glProgramLocalParameterI4uiNV)load(\"glProgramLocalParameterI4uiNV\");\n\tfp_glProgramLocalParameterI4uivNV = (pfn_glProgramLocalParameterI4uivNV)load(\"glProgramLocalParameterI4uivNV\");\n\tfp_glProgramLocalParametersI4uivNV = (pfn_glProgramLocalParametersI4uivNV)load(\"glProgramLocalParametersI4uivNV\");\n\tfp_glProgramEnvParameterI4iNV = (pfn_glProgramEnvParameterI4iNV)load(\"glProgramEnvParameterI4iNV\");\n\tfp_glProgramEnvParameterI4ivNV = (pfn_glProgramEnvParameterI4ivNV)load(\"glProgramEnvParameterI4ivNV\");\n\tfp_glProgramEnvParametersI4ivNV = (pfn_glProgramEnvParametersI4ivNV)load(\"glProgramEnvParametersI4ivNV\");\n\tfp_glProgramEnvParameterI4uiNV = (pfn_glProgramEnvParameterI4uiNV)load(\"glProgramEnvParameterI4uiNV\");\n\tfp_glProgramEnvParameterI4uivNV = (pfn_glProgramEnvParameterI4uivNV)load(\"glProgramEnvParameterI4uivNV\");\n\tfp_glProgramEnvParametersI4uivNV = (pfn_glProgramEnvParametersI4uivNV)load(\"glProgramEnvParametersI4uivNV\");\n\tfp_glGetProgramLocalParameterIivNV = (pfn_glGetProgramLocalParameterIivNV)load(\"glGetProgramLocalParameterIivNV\");\n\tfp_glGetProgramLocalParameterIuivNV = (pfn_glGetProgramLocalParameterIuivNV)load(\"glGetProgramLocalParameterIuivNV\");\n\tfp_glGetProgramEnvParameterIivNV = (pfn_glGetProgramEnvParameterIivNV)load(\"glGetProgramEnvParameterIivNV\");\n\tfp_glGetProgramEnvParameterIuivNV = (pfn_glGetProgramEnvParameterIuivNV)load(\"glGetProgramEnvParameterIuivNV\");\n}\n\nGLboolean GLAD_NV_gpu_program5 = GL_FALSE;\nstatic void load_GL_NV_gpu_program5(LOADER load) {\n\tif(!GLAD_NV_gpu_program5) return;\n\tfp_glProgramSubroutineParametersuivNV = (pfn_glProgramSubroutineParametersuivNV)load(\"glProgramSubroutineParametersuivNV\");\n\tfp_glGetProgramSubroutineParameteruivNV = (pfn_glGetProgramSubroutineParameteruivNV)load(\"glGetProgramSubroutineParameteruivNV\");\n}\n\nGLboolean GLAD_NV_gpu_program5_mem_extended = GL_FALSE;\nGLboolean GLAD_NV_gpu_shader5 = GL_FALSE;\nstatic void load_GL_NV_gpu_shader5(LOADER load) {\n\tif(!GLAD_NV_gpu_shader5) return;\n\tfp_glUniform1i64NV = (pfn_glUniform1i64NV)load(\"glUniform1i64NV\");\n\tfp_glUniform2i64NV = (pfn_glUniform2i64NV)load(\"glUniform2i64NV\");\n\tfp_glUniform3i64NV = (pfn_glUniform3i64NV)load(\"glUniform3i64NV\");\n\tfp_glUniform4i64NV = (pfn_glUniform4i64NV)load(\"glUniform4i64NV\");\n\tfp_glUniform1i64vNV = (pfn_glUniform1i64vNV)load(\"glUniform1i64vNV\");\n\tfp_glUniform2i64vNV = (pfn_glUniform2i64vNV)load(\"glUniform2i64vNV\");\n\tfp_glUniform3i64vNV = (pfn_glUniform3i64vNV)load(\"glUniform3i64vNV\");\n\tfp_glUniform4i64vNV = (pfn_glUniform4i64vNV)load(\"glUniform4i64vNV\");\n\tfp_glUniform1ui64NV = (pfn_glUniform1ui64NV)load(\"glUniform1ui64NV\");\n\tfp_glUniform2ui64NV = (pfn_glUniform2ui64NV)load(\"glUniform2ui64NV\");\n\tfp_glUniform3ui64NV = (pfn_glUniform3ui64NV)load(\"glUniform3ui64NV\");\n\tfp_glUniform4ui64NV = (pfn_glUniform4ui64NV)load(\"glUniform4ui64NV\");\n\tfp_glUniform1ui64vNV = (pfn_glUniform1ui64vNV)load(\"glUniform1ui64vNV\");\n\tfp_glUniform2ui64vNV = (pfn_glUniform2ui64vNV)load(\"glUniform2ui64vNV\");\n\tfp_glUniform3ui64vNV = (pfn_glUniform3ui64vNV)load(\"glUniform3ui64vNV\");\n\tfp_glUniform4ui64vNV = (pfn_glUniform4ui64vNV)load(\"glUniform4ui64vNV\");\n\tfp_glGetUniformi64vNV = (pfn_glGetUniformi64vNV)load(\"glGetUniformi64vNV\");\n\tfp_glProgramUniform1i64NV = (pfn_glProgramUniform1i64NV)load(\"glProgramUniform1i64NV\");\n\tfp_glProgramUniform2i64NV = (pfn_glProgramUniform2i64NV)load(\"glProgramUniform2i64NV\");\n\tfp_glProgramUniform3i64NV = (pfn_glProgramUniform3i64NV)load(\"glProgramUniform3i64NV\");\n\tfp_glProgramUniform4i64NV = (pfn_glProgramUniform4i64NV)load(\"glProgramUniform4i64NV\");\n\tfp_glProgramUniform1i64vNV = (pfn_glProgramUniform1i64vNV)load(\"glProgramUniform1i64vNV\");\n\tfp_glProgramUniform2i64vNV = (pfn_glProgramUniform2i64vNV)load(\"glProgramUniform2i64vNV\");\n\tfp_glProgramUniform3i64vNV = (pfn_glProgramUniform3i64vNV)load(\"glProgramUniform3i64vNV\");\n\tfp_glProgramUniform4i64vNV = (pfn_glProgramUniform4i64vNV)load(\"glProgramUniform4i64vNV\");\n\tfp_glProgramUniform1ui64NV = (pfn_glProgramUniform1ui64NV)load(\"glProgramUniform1ui64NV\");\n\tfp_glProgramUniform2ui64NV = (pfn_glProgramUniform2ui64NV)load(\"glProgramUniform2ui64NV\");\n\tfp_glProgramUniform3ui64NV = (pfn_glProgramUniform3ui64NV)load(\"glProgramUniform3ui64NV\");\n\tfp_glProgramUniform4ui64NV = (pfn_glProgramUniform4ui64NV)load(\"glProgramUniform4ui64NV\");\n\tfp_glProgramUniform1ui64vNV = (pfn_glProgramUniform1ui64vNV)load(\"glProgramUniform1ui64vNV\");\n\tfp_glProgramUniform2ui64vNV = (pfn_glProgramUniform2ui64vNV)load(\"glProgramUniform2ui64vNV\");\n\tfp_glProgramUniform3ui64vNV = (pfn_glProgramUniform3ui64vNV)load(\"glProgramUniform3ui64vNV\");\n\tfp_glProgramUniform4ui64vNV = (pfn_glProgramUniform4ui64vNV)load(\"glProgramUniform4ui64vNV\");\n}\n\nGLboolean GLAD_NV_half_float = GL_FALSE;\nstatic void load_GL_NV_half_float(LOADER load) {\n\tif(!GLAD_NV_half_float) return;\n\tfp_glVertex2hNV = (pfn_glVertex2hNV)load(\"glVertex2hNV\");\n\tfp_glVertex2hvNV = (pfn_glVertex2hvNV)load(\"glVertex2hvNV\");\n\tfp_glVertex3hNV = (pfn_glVertex3hNV)load(\"glVertex3hNV\");\n\tfp_glVertex3hvNV = (pfn_glVertex3hvNV)load(\"glVertex3hvNV\");\n\tfp_glVertex4hNV = (pfn_glVertex4hNV)load(\"glVertex4hNV\");\n\tfp_glVertex4hvNV = (pfn_glVertex4hvNV)load(\"glVertex4hvNV\");\n\tfp_glNormal3hNV = (pfn_glNormal3hNV)load(\"glNormal3hNV\");\n\tfp_glNormal3hvNV = (pfn_glNormal3hvNV)load(\"glNormal3hvNV\");\n\tfp_glColor3hNV = (pfn_glColor3hNV)load(\"glColor3hNV\");\n\tfp_glColor3hvNV = (pfn_glColor3hvNV)load(\"glColor3hvNV\");\n\tfp_glColor4hNV = (pfn_glColor4hNV)load(\"glColor4hNV\");\n\tfp_glColor4hvNV = (pfn_glColor4hvNV)load(\"glColor4hvNV\");\n\tfp_glTexCoord1hNV = (pfn_glTexCoord1hNV)load(\"glTexCoord1hNV\");\n\tfp_glTexCoord1hvNV = (pfn_glTexCoord1hvNV)load(\"glTexCoord1hvNV\");\n\tfp_glTexCoord2hNV = (pfn_glTexCoord2hNV)load(\"glTexCoord2hNV\");\n\tfp_glTexCoord2hvNV = (pfn_glTexCoord2hvNV)load(\"glTexCoord2hvNV\");\n\tfp_glTexCoord3hNV = (pfn_glTexCoord3hNV)load(\"glTexCoord3hNV\");\n\tfp_glTexCoord3hvNV = (pfn_glTexCoord3hvNV)load(\"glTexCoord3hvNV\");\n\tfp_glTexCoord4hNV = (pfn_glTexCoord4hNV)load(\"glTexCoord4hNV\");\n\tfp_glTexCoord4hvNV = (pfn_glTexCoord4hvNV)load(\"glTexCoord4hvNV\");\n\tfp_glMultiTexCoord1hNV = (pfn_glMultiTexCoord1hNV)load(\"glMultiTexCoord1hNV\");\n\tfp_glMultiTexCoord1hvNV = (pfn_glMultiTexCoord1hvNV)load(\"glMultiTexCoord1hvNV\");\n\tfp_glMultiTexCoord2hNV = (pfn_glMultiTexCoord2hNV)load(\"glMultiTexCoord2hNV\");\n\tfp_glMultiTexCoord2hvNV = (pfn_glMultiTexCoord2hvNV)load(\"glMultiTexCoord2hvNV\");\n\tfp_glMultiTexCoord3hNV = (pfn_glMultiTexCoord3hNV)load(\"glMultiTexCoord3hNV\");\n\tfp_glMultiTexCoord3hvNV = (pfn_glMultiTexCoord3hvNV)load(\"glMultiTexCoord3hvNV\");\n\tfp_glMultiTexCoord4hNV = (pfn_glMultiTexCoord4hNV)load(\"glMultiTexCoord4hNV\");\n\tfp_glMultiTexCoord4hvNV = (pfn_glMultiTexCoord4hvNV)load(\"glMultiTexCoord4hvNV\");\n\tfp_glFogCoordhNV = (pfn_glFogCoordhNV)load(\"glFogCoordhNV\");\n\tfp_glFogCoordhvNV = (pfn_glFogCoordhvNV)load(\"glFogCoordhvNV\");\n\tfp_glSecondaryColor3hNV = (pfn_glSecondaryColor3hNV)load(\"glSecondaryColor3hNV\");\n\tfp_glSecondaryColor3hvNV = (pfn_glSecondaryColor3hvNV)load(\"glSecondaryColor3hvNV\");\n\tfp_glVertexWeighthNV = (pfn_glVertexWeighthNV)load(\"glVertexWeighthNV\");\n\tfp_glVertexWeighthvNV = (pfn_glVertexWeighthvNV)load(\"glVertexWeighthvNV\");\n\tfp_glVertexAttrib1hNV = (pfn_glVertexAttrib1hNV)load(\"glVertexAttrib1hNV\");\n\tfp_glVertexAttrib1hvNV = (pfn_glVertexAttrib1hvNV)load(\"glVertexAttrib1hvNV\");\n\tfp_glVertexAttrib2hNV = (pfn_glVertexAttrib2hNV)load(\"glVertexAttrib2hNV\");\n\tfp_glVertexAttrib2hvNV = (pfn_glVertexAttrib2hvNV)load(\"glVertexAttrib2hvNV\");\n\tfp_glVertexAttrib3hNV = (pfn_glVertexAttrib3hNV)load(\"glVertexAttrib3hNV\");\n\tfp_glVertexAttrib3hvNV = (pfn_glVertexAttrib3hvNV)load(\"glVertexAttrib3hvNV\");\n\tfp_glVertexAttrib4hNV = (pfn_glVertexAttrib4hNV)load(\"glVertexAttrib4hNV\");\n\tfp_glVertexAttrib4hvNV = (pfn_glVertexAttrib4hvNV)load(\"glVertexAttrib4hvNV\");\n\tfp_glVertexAttribs1hvNV = (pfn_glVertexAttribs1hvNV)load(\"glVertexAttribs1hvNV\");\n\tfp_glVertexAttribs2hvNV = (pfn_glVertexAttribs2hvNV)load(\"glVertexAttribs2hvNV\");\n\tfp_glVertexAttribs3hvNV = (pfn_glVertexAttribs3hvNV)load(\"glVertexAttribs3hvNV\");\n\tfp_glVertexAttribs4hvNV = (pfn_glVertexAttribs4hvNV)load(\"glVertexAttribs4hvNV\");\n}\n\nGLboolean GLAD_NV_image_formats = GL_FALSE;\nGLboolean GLAD_NV_instanced_arrays = GL_FALSE;\nstatic void load_GL_NV_instanced_arrays(LOADER load) {\n\tif(!GLAD_NV_instanced_arrays) return;\n\tfp_glVertexAttribDivisorNV = (pfn_glVertexAttribDivisorNV)load(\"glVertexAttribDivisorNV\");\n}\n\nGLboolean GLAD_NV_internalformat_sample_query = GL_FALSE;\nstatic void load_GL_NV_internalformat_sample_query(LOADER load) {\n\tif(!GLAD_NV_internalformat_sample_query) return;\n\tfp_glGetInternalformatSampleivNV = (pfn_glGetInternalformatSampleivNV)load(\"glGetInternalformatSampleivNV\");\n}\n\nGLboolean GLAD_NV_multisample_coverage = GL_FALSE;\nGLboolean GLAD_NV_non_square_matrices = GL_FALSE;\nstatic void load_GL_NV_non_square_matrices(LOADER load) {\n\tif(!GLAD_NV_non_square_matrices) return;\n\tfp_glUniformMatrix2x3fvNV = (pfn_glUniformMatrix2x3fvNV)load(\"glUniformMatrix2x3fvNV\");\n\tfp_glUniformMatrix3x2fvNV = (pfn_glUniformMatrix3x2fvNV)load(\"glUniformMatrix3x2fvNV\");\n\tfp_glUniformMatrix2x4fvNV = (pfn_glUniformMatrix2x4fvNV)load(\"glUniformMatrix2x4fvNV\");\n\tfp_glUniformMatrix4x2fvNV = (pfn_glUniformMatrix4x2fvNV)load(\"glUniformMatrix4x2fvNV\");\n\tfp_glUniformMatrix3x4fvNV = (pfn_glUniformMatrix3x4fvNV)load(\"glUniformMatrix3x4fvNV\");\n\tfp_glUniformMatrix4x3fvNV = (pfn_glUniformMatrix4x3fvNV)load(\"glUniformMatrix4x3fvNV\");\n}\n\nGLboolean GLAD_NV_occlusion_query = GL_FALSE;\nstatic void load_GL_NV_occlusion_query(LOADER load) {\n\tif(!GLAD_NV_occlusion_query) return;\n\tfp_glGenOcclusionQueriesNV = (pfn_glGenOcclusionQueriesNV)load(\"glGenOcclusionQueriesNV\");\n\tfp_glDeleteOcclusionQueriesNV = (pfn_glDeleteOcclusionQueriesNV)load(\"glDeleteOcclusionQueriesNV\");\n\tfp_glIsOcclusionQueryNV = (pfn_glIsOcclusionQueryNV)load(\"glIsOcclusionQueryNV\");\n\tfp_glBeginOcclusionQueryNV = (pfn_glBeginOcclusionQueryNV)load(\"glBeginOcclusionQueryNV\");\n\tfp_glEndOcclusionQueryNV = (pfn_glEndOcclusionQueryNV)load(\"glEndOcclusionQueryNV\");\n\tfp_glGetOcclusionQueryivNV = (pfn_glGetOcclusionQueryivNV)load(\"glGetOcclusionQueryivNV\");\n\tfp_glGetOcclusionQueryuivNV = (pfn_glGetOcclusionQueryuivNV)load(\"glGetOcclusionQueryuivNV\");\n}\n\nGLboolean GLAD_NV_parameter_buffer_object = GL_FALSE;\nstatic void load_GL_NV_parameter_buffer_object(LOADER load) {\n\tif(!GLAD_NV_parameter_buffer_object) return;\n\tfp_glProgramBufferParametersfvNV = (pfn_glProgramBufferParametersfvNV)load(\"glProgramBufferParametersfvNV\");\n\tfp_glProgramBufferParametersIivNV = (pfn_glProgramBufferParametersIivNV)load(\"glProgramBufferParametersIivNV\");\n\tfp_glProgramBufferParametersIuivNV = (pfn_glProgramBufferParametersIuivNV)load(\"glProgramBufferParametersIuivNV\");\n}\n\nGLboolean GLAD_NV_parameter_buffer_object2 = GL_FALSE;\nGLboolean GLAD_NV_path_rendering = GL_FALSE;\nstatic void load_GL_NV_path_rendering(LOADER load) {\n\tif(!GLAD_NV_path_rendering) return;\n\tfp_glGenPathsNV = (pfn_glGenPathsNV)load(\"glGenPathsNV\");\n\tfp_glDeletePathsNV = (pfn_glDeletePathsNV)load(\"glDeletePathsNV\");\n\tfp_glIsPathNV = (pfn_glIsPathNV)load(\"glIsPathNV\");\n\tfp_glPathCommandsNV = (pfn_glPathCommandsNV)load(\"glPathCommandsNV\");\n\tfp_glPathCoordsNV = (pfn_glPathCoordsNV)load(\"glPathCoordsNV\");\n\tfp_glPathSubCommandsNV = (pfn_glPathSubCommandsNV)load(\"glPathSubCommandsNV\");\n\tfp_glPathSubCoordsNV = (pfn_glPathSubCoordsNV)load(\"glPathSubCoordsNV\");\n\tfp_glPathStringNV = (pfn_glPathStringNV)load(\"glPathStringNV\");\n\tfp_glPathGlyphsNV = (pfn_glPathGlyphsNV)load(\"glPathGlyphsNV\");\n\tfp_glPathGlyphRangeNV = (pfn_glPathGlyphRangeNV)load(\"glPathGlyphRangeNV\");\n\tfp_glWeightPathsNV = (pfn_glWeightPathsNV)load(\"glWeightPathsNV\");\n\tfp_glCopyPathNV = (pfn_glCopyPathNV)load(\"glCopyPathNV\");\n\tfp_glInterpolatePathsNV = (pfn_glInterpolatePathsNV)load(\"glInterpolatePathsNV\");\n\tfp_glTransformPathNV = (pfn_glTransformPathNV)load(\"glTransformPathNV\");\n\tfp_glPathParameterivNV = (pfn_glPathParameterivNV)load(\"glPathParameterivNV\");\n\tfp_glPathParameteriNV = (pfn_glPathParameteriNV)load(\"glPathParameteriNV\");\n\tfp_glPathParameterfvNV = (pfn_glPathParameterfvNV)load(\"glPathParameterfvNV\");\n\tfp_glPathParameterfNV = (pfn_glPathParameterfNV)load(\"glPathParameterfNV\");\n\tfp_glPathDashArrayNV = (pfn_glPathDashArrayNV)load(\"glPathDashArrayNV\");\n\tfp_glPathStencilFuncNV = (pfn_glPathStencilFuncNV)load(\"glPathStencilFuncNV\");\n\tfp_glPathStencilDepthOffsetNV = (pfn_glPathStencilDepthOffsetNV)load(\"glPathStencilDepthOffsetNV\");\n\tfp_glStencilFillPathNV = (pfn_glStencilFillPathNV)load(\"glStencilFillPathNV\");\n\tfp_glStencilStrokePathNV = (pfn_glStencilStrokePathNV)load(\"glStencilStrokePathNV\");\n\tfp_glStencilFillPathInstancedNV = (pfn_glStencilFillPathInstancedNV)load(\"glStencilFillPathInstancedNV\");\n\tfp_glStencilStrokePathInstancedNV = (pfn_glStencilStrokePathInstancedNV)load(\"glStencilStrokePathInstancedNV\");\n\tfp_glPathCoverDepthFuncNV = (pfn_glPathCoverDepthFuncNV)load(\"glPathCoverDepthFuncNV\");\n\tfp_glCoverFillPathNV = (pfn_glCoverFillPathNV)load(\"glCoverFillPathNV\");\n\tfp_glCoverStrokePathNV = (pfn_glCoverStrokePathNV)load(\"glCoverStrokePathNV\");\n\tfp_glCoverFillPathInstancedNV = (pfn_glCoverFillPathInstancedNV)load(\"glCoverFillPathInstancedNV\");\n\tfp_glCoverStrokePathInstancedNV = (pfn_glCoverStrokePathInstancedNV)load(\"glCoverStrokePathInstancedNV\");\n\tfp_glGetPathParameterivNV = (pfn_glGetPathParameterivNV)load(\"glGetPathParameterivNV\");\n\tfp_glGetPathParameterfvNV = (pfn_glGetPathParameterfvNV)load(\"glGetPathParameterfvNV\");\n\tfp_glGetPathCommandsNV = (pfn_glGetPathCommandsNV)load(\"glGetPathCommandsNV\");\n\tfp_glGetPathCoordsNV = (pfn_glGetPathCoordsNV)load(\"glGetPathCoordsNV\");\n\tfp_glGetPathDashArrayNV = (pfn_glGetPathDashArrayNV)load(\"glGetPathDashArrayNV\");\n\tfp_glGetPathMetricsNV = (pfn_glGetPathMetricsNV)load(\"glGetPathMetricsNV\");\n\tfp_glGetPathMetricRangeNV = (pfn_glGetPathMetricRangeNV)load(\"glGetPathMetricRangeNV\");\n\tfp_glGetPathSpacingNV = (pfn_glGetPathSpacingNV)load(\"glGetPathSpacingNV\");\n\tfp_glIsPointInFillPathNV = (pfn_glIsPointInFillPathNV)load(\"glIsPointInFillPathNV\");\n\tfp_glIsPointInStrokePathNV = (pfn_glIsPointInStrokePathNV)load(\"glIsPointInStrokePathNV\");\n\tfp_glGetPathLengthNV = (pfn_glGetPathLengthNV)load(\"glGetPathLengthNV\");\n\tfp_glPointAlongPathNV = (pfn_glPointAlongPathNV)load(\"glPointAlongPathNV\");\n\tfp_glMatrixLoad3x2fNV = (pfn_glMatrixLoad3x2fNV)load(\"glMatrixLoad3x2fNV\");\n\tfp_glMatrixLoad3x3fNV = (pfn_glMatrixLoad3x3fNV)load(\"glMatrixLoad3x3fNV\");\n\tfp_glMatrixLoadTranspose3x3fNV = (pfn_glMatrixLoadTranspose3x3fNV)load(\"glMatrixLoadTranspose3x3fNV\");\n\tfp_glMatrixMult3x2fNV = (pfn_glMatrixMult3x2fNV)load(\"glMatrixMult3x2fNV\");\n\tfp_glMatrixMult3x3fNV = (pfn_glMatrixMult3x3fNV)load(\"glMatrixMult3x3fNV\");\n\tfp_glMatrixMultTranspose3x3fNV = (pfn_glMatrixMultTranspose3x3fNV)load(\"glMatrixMultTranspose3x3fNV\");\n\tfp_glStencilThenCoverFillPathNV = (pfn_glStencilThenCoverFillPathNV)load(\"glStencilThenCoverFillPathNV\");\n\tfp_glStencilThenCoverStrokePathNV = (pfn_glStencilThenCoverStrokePathNV)load(\"glStencilThenCoverStrokePathNV\");\n\tfp_glStencilThenCoverFillPathInstancedNV = (pfn_glStencilThenCoverFillPathInstancedNV)load(\"glStencilThenCoverFillPathInstancedNV\");\n\tfp_glStencilThenCoverStrokePathInstancedNV = (pfn_glStencilThenCoverStrokePathInstancedNV)load(\"glStencilThenCoverStrokePathInstancedNV\");\n\tfp_glPathGlyphIndexRangeNV = (pfn_glPathGlyphIndexRangeNV)load(\"glPathGlyphIndexRangeNV\");\n\tfp_glPathGlyphIndexArrayNV = (pfn_glPathGlyphIndexArrayNV)load(\"glPathGlyphIndexArrayNV\");\n\tfp_glPathMemoryGlyphIndexArrayNV = (pfn_glPathMemoryGlyphIndexArrayNV)load(\"glPathMemoryGlyphIndexArrayNV\");\n\tfp_glProgramPathFragmentInputGenNV = (pfn_glProgramPathFragmentInputGenNV)load(\"glProgramPathFragmentInputGenNV\");\n\tfp_glGetProgramResourcefvNV = (pfn_glGetProgramResourcefvNV)load(\"glGetProgramResourcefvNV\");\n\tfp_glPathColorGenNV = (pfn_glPathColorGenNV)load(\"glPathColorGenNV\");\n\tfp_glPathTexGenNV = (pfn_glPathTexGenNV)load(\"glPathTexGenNV\");\n\tfp_glPathFogGenNV = (pfn_glPathFogGenNV)load(\"glPathFogGenNV\");\n\tfp_glGetPathColorGenivNV = (pfn_glGetPathColorGenivNV)load(\"glGetPathColorGenivNV\");\n\tfp_glGetPathColorGenfvNV = (pfn_glGetPathColorGenfvNV)load(\"glGetPathColorGenfvNV\");\n\tfp_glGetPathTexGenivNV = (pfn_glGetPathTexGenivNV)load(\"glGetPathTexGenivNV\");\n\tfp_glGetPathTexGenfvNV = (pfn_glGetPathTexGenfvNV)load(\"glGetPathTexGenfvNV\");\n}\n\nGLboolean GLAD_NV_path_rendering_shared_edge = GL_FALSE;\nGLboolean GLAD_NV_polygon_mode = GL_FALSE;\nstatic void load_GL_NV_polygon_mode(LOADER load) {\n\tif(!GLAD_NV_polygon_mode) return;\n\tfp_glPolygonModeNV = (pfn_glPolygonModeNV)load(\"glPolygonModeNV\");\n}\n\nGLboolean GLAD_NV_present_video = GL_FALSE;\nstatic void load_GL_NV_present_video(LOADER load) {\n\tif(!GLAD_NV_present_video) return;\n\tfp_glPresentFrameKeyedNV = (pfn_glPresentFrameKeyedNV)load(\"glPresentFrameKeyedNV\");\n\tfp_glPresentFrameDualFillNV = (pfn_glPresentFrameDualFillNV)load(\"glPresentFrameDualFillNV\");\n\tfp_glGetVideoivNV = (pfn_glGetVideoivNV)load(\"glGetVideoivNV\");\n\tfp_glGetVideouivNV = (pfn_glGetVideouivNV)load(\"glGetVideouivNV\");\n\tfp_glGetVideoi64vNV = (pfn_glGetVideoi64vNV)load(\"glGetVideoi64vNV\");\n\tfp_glGetVideoui64vNV = (pfn_glGetVideoui64vNV)load(\"glGetVideoui64vNV\");\n}\n\nGLboolean GLAD_NV_primitive_restart = GL_FALSE;\nstatic void load_GL_NV_primitive_restart(LOADER load) {\n\tif(!GLAD_NV_primitive_restart) return;\n\tfp_glPrimitiveRestartNV = (pfn_glPrimitiveRestartNV)load(\"glPrimitiveRestartNV\");\n\tfp_glPrimitiveRestartIndexNV = (pfn_glPrimitiveRestartIndexNV)load(\"glPrimitiveRestartIndexNV\");\n}\n\nGLboolean GLAD_NV_read_buffer = GL_FALSE;\nstatic void load_GL_NV_read_buffer(LOADER load) {\n\tif(!GLAD_NV_read_buffer) return;\n\tfp_glReadBufferNV = (pfn_glReadBufferNV)load(\"glReadBufferNV\");\n}\n\nGLboolean GLAD_NV_read_buffer_front = GL_FALSE;\nGLboolean GLAD_NV_read_depth = GL_FALSE;\nGLboolean GLAD_NV_read_depth_stencil = GL_FALSE;\nGLboolean GLAD_NV_read_stencil = GL_FALSE;\nGLboolean GLAD_NV_sample_locations = GL_FALSE;\nstatic void load_GL_NV_sample_locations(LOADER load) {\n\tif(!GLAD_NV_sample_locations) return;\n\tfp_glFramebufferSampleLocationsfvNV = (pfn_glFramebufferSampleLocationsfvNV)load(\"glFramebufferSampleLocationsfvNV\");\n\tfp_glNamedFramebufferSampleLocationsfvNV = (pfn_glNamedFramebufferSampleLocationsfvNV)load(\"glNamedFramebufferSampleLocationsfvNV\");\n\tfp_glResolveDepthValuesNV = (pfn_glResolveDepthValuesNV)load(\"glResolveDepthValuesNV\");\n}\n\nGLboolean GLAD_NV_sample_mask_override_coverage = GL_FALSE;\nGLboolean GLAD_NV_shader_atomic_counters = GL_FALSE;\nGLboolean GLAD_NV_shader_atomic_float = GL_FALSE;\nGLboolean GLAD_NV_shader_atomic_fp16_vector = GL_FALSE;\nGLboolean GLAD_NV_shader_atomic_int64 = GL_FALSE;\nGLboolean GLAD_NV_shader_buffer_load = GL_FALSE;\nstatic void load_GL_NV_shader_buffer_load(LOADER load) {\n\tif(!GLAD_NV_shader_buffer_load) return;\n\tfp_glMakeBufferResidentNV = (pfn_glMakeBufferResidentNV)load(\"glMakeBufferResidentNV\");\n\tfp_glMakeBufferNonResidentNV = (pfn_glMakeBufferNonResidentNV)load(\"glMakeBufferNonResidentNV\");\n\tfp_glIsBufferResidentNV = (pfn_glIsBufferResidentNV)load(\"glIsBufferResidentNV\");\n\tfp_glMakeNamedBufferResidentNV = (pfn_glMakeNamedBufferResidentNV)load(\"glMakeNamedBufferResidentNV\");\n\tfp_glMakeNamedBufferNonResidentNV = (pfn_glMakeNamedBufferNonResidentNV)load(\"glMakeNamedBufferNonResidentNV\");\n\tfp_glIsNamedBufferResidentNV = (pfn_glIsNamedBufferResidentNV)load(\"glIsNamedBufferResidentNV\");\n\tfp_glGetBufferParameterui64vNV = (pfn_glGetBufferParameterui64vNV)load(\"glGetBufferParameterui64vNV\");\n\tfp_glGetNamedBufferParameterui64vNV = (pfn_glGetNamedBufferParameterui64vNV)load(\"glGetNamedBufferParameterui64vNV\");\n\tfp_glGetIntegerui64vNV = (pfn_glGetIntegerui64vNV)load(\"glGetIntegerui64vNV\");\n\tfp_glUniformui64NV = (pfn_glUniformui64NV)load(\"glUniformui64NV\");\n\tfp_glUniformui64vNV = (pfn_glUniformui64vNV)load(\"glUniformui64vNV\");\n\tfp_glGetUniformui64vNV = (pfn_glGetUniformui64vNV)load(\"glGetUniformui64vNV\");\n\tfp_glProgramUniformui64NV = (pfn_glProgramUniformui64NV)load(\"glProgramUniformui64NV\");\n\tfp_glProgramUniformui64vNV = (pfn_glProgramUniformui64vNV)load(\"glProgramUniformui64vNV\");\n}\n\nGLboolean GLAD_NV_shader_buffer_store = GL_FALSE;\nGLboolean GLAD_NV_shader_noperspective_interpolation = GL_FALSE;\nGLboolean GLAD_NV_shader_storage_buffer_object = GL_FALSE;\nGLboolean GLAD_NV_shader_thread_group = GL_FALSE;\nGLboolean GLAD_NV_shader_thread_shuffle = GL_FALSE;\nGLboolean GLAD_NV_shadow_samplers_array = GL_FALSE;\nGLboolean GLAD_NV_shadow_samplers_cube = GL_FALSE;\nGLboolean GLAD_NV_sRGB_formats = GL_FALSE;\nGLboolean GLAD_NV_tessellation_program5 = GL_FALSE;\nGLboolean GLAD_NV_texture_barrier = GL_FALSE;\nstatic void load_GL_NV_texture_barrier(LOADER load) {\n\tif(!GLAD_NV_texture_barrier) return;\n\tfp_glTextureBarrierNV = (pfn_glTextureBarrierNV)load(\"glTextureBarrierNV\");\n}\n\nGLboolean GLAD_NV_texture_border_clamp = GL_FALSE;\nGLboolean GLAD_NV_texture_compression_s3tc_update = GL_FALSE;\nGLboolean GLAD_NV_texture_multisample = GL_FALSE;\nstatic void load_GL_NV_texture_multisample(LOADER load) {\n\tif(!GLAD_NV_texture_multisample) return;\n\tfp_glTexImage2DMultisampleCoverageNV = (pfn_glTexImage2DMultisampleCoverageNV)load(\"glTexImage2DMultisampleCoverageNV\");\n\tfp_glTexImage3DMultisampleCoverageNV = (pfn_glTexImage3DMultisampleCoverageNV)load(\"glTexImage3DMultisampleCoverageNV\");\n\tfp_glTextureImage2DMultisampleNV = (pfn_glTextureImage2DMultisampleNV)load(\"glTextureImage2DMultisampleNV\");\n\tfp_glTextureImage3DMultisampleNV = (pfn_glTextureImage3DMultisampleNV)load(\"glTextureImage3DMultisampleNV\");\n\tfp_glTextureImage2DMultisampleCoverageNV = (pfn_glTextureImage2DMultisampleCoverageNV)load(\"glTextureImage2DMultisampleCoverageNV\");\n\tfp_glTextureImage3DMultisampleCoverageNV = (pfn_glTextureImage3DMultisampleCoverageNV)load(\"glTextureImage3DMultisampleCoverageNV\");\n}\n\nGLboolean GLAD_NV_texture_npot_2D_mipmap = GL_FALSE;\nGLboolean GLAD_NV_transform_feedback = GL_FALSE;\nstatic void load_GL_NV_transform_feedback(LOADER load) {\n\tif(!GLAD_NV_transform_feedback) return;\n\tfp_glBeginTransformFeedbackNV = (pfn_glBeginTransformFeedbackNV)load(\"glBeginTransformFeedbackNV\");\n\tfp_glEndTransformFeedbackNV = (pfn_glEndTransformFeedbackNV)load(\"glEndTransformFeedbackNV\");\n\tfp_glTransformFeedbackAttribsNV = (pfn_glTransformFeedbackAttribsNV)load(\"glTransformFeedbackAttribsNV\");\n\tfp_glBindBufferRangeNV = (pfn_glBindBufferRangeNV)load(\"glBindBufferRangeNV\");\n\tfp_glBindBufferOffsetNV = (pfn_glBindBufferOffsetNV)load(\"glBindBufferOffsetNV\");\n\tfp_glBindBufferBaseNV = (pfn_glBindBufferBaseNV)load(\"glBindBufferBaseNV\");\n\tfp_glTransformFeedbackVaryingsNV = (pfn_glTransformFeedbackVaryingsNV)load(\"glTransformFeedbackVaryingsNV\");\n\tfp_glActiveVaryingNV = (pfn_glActiveVaryingNV)load(\"glActiveVaryingNV\");\n\tfp_glGetVaryingLocationNV = (pfn_glGetVaryingLocationNV)load(\"glGetVaryingLocationNV\");\n\tfp_glGetActiveVaryingNV = (pfn_glGetActiveVaryingNV)load(\"glGetActiveVaryingNV\");\n\tfp_glGetTransformFeedbackVaryingNV = (pfn_glGetTransformFeedbackVaryingNV)load(\"glGetTransformFeedbackVaryingNV\");\n\tfp_glTransformFeedbackStreamAttribsNV = (pfn_glTransformFeedbackStreamAttribsNV)load(\"glTransformFeedbackStreamAttribsNV\");\n}\n\nGLboolean GLAD_NV_transform_feedback2 = GL_FALSE;\nstatic void load_GL_NV_transform_feedback2(LOADER load) {\n\tif(!GLAD_NV_transform_feedback2) return;\n\tfp_glBindTransformFeedbackNV = (pfn_glBindTransformFeedbackNV)load(\"glBindTransformFeedbackNV\");\n\tfp_glDeleteTransformFeedbacksNV = (pfn_glDeleteTransformFeedbacksNV)load(\"glDeleteTransformFeedbacksNV\");\n\tfp_glGenTransformFeedbacksNV = (pfn_glGenTransformFeedbacksNV)load(\"glGenTransformFeedbacksNV\");\n\tfp_glIsTransformFeedbackNV = (pfn_glIsTransformFeedbackNV)load(\"glIsTransformFeedbackNV\");\n\tfp_glPauseTransformFeedbackNV = (pfn_glPauseTransformFeedbackNV)load(\"glPauseTransformFeedbackNV\");\n\tfp_glResumeTransformFeedbackNV = (pfn_glResumeTransformFeedbackNV)load(\"glResumeTransformFeedbackNV\");\n\tfp_glDrawTransformFeedbackNV = (pfn_glDrawTransformFeedbackNV)load(\"glDrawTransformFeedbackNV\");\n}\n\nGLboolean GLAD_NV_uniform_buffer_unified_memory = GL_FALSE;\nGLboolean GLAD_NV_vdpau_interop = GL_FALSE;\nstatic void load_GL_NV_vdpau_interop(LOADER load) {\n\tif(!GLAD_NV_vdpau_interop) return;\n\tfp_glVDPAUInitNV = (pfn_glVDPAUInitNV)load(\"glVDPAUInitNV\");\n\tfp_glVDPAUFiniNV = (pfn_glVDPAUFiniNV)load(\"glVDPAUFiniNV\");\n\tfp_glVDPAURegisterVideoSurfaceNV = (pfn_glVDPAURegisterVideoSurfaceNV)load(\"glVDPAURegisterVideoSurfaceNV\");\n\tfp_glVDPAURegisterOutputSurfaceNV = (pfn_glVDPAURegisterOutputSurfaceNV)load(\"glVDPAURegisterOutputSurfaceNV\");\n\tfp_glVDPAUIsSurfaceNV = (pfn_glVDPAUIsSurfaceNV)load(\"glVDPAUIsSurfaceNV\");\n\tfp_glVDPAUUnregisterSurfaceNV = (pfn_glVDPAUUnregisterSurfaceNV)load(\"glVDPAUUnregisterSurfaceNV\");\n\tfp_glVDPAUGetSurfaceivNV = (pfn_glVDPAUGetSurfaceivNV)load(\"glVDPAUGetSurfaceivNV\");\n\tfp_glVDPAUSurfaceAccessNV = (pfn_glVDPAUSurfaceAccessNV)load(\"glVDPAUSurfaceAccessNV\");\n\tfp_glVDPAUMapSurfacesNV = (pfn_glVDPAUMapSurfacesNV)load(\"glVDPAUMapSurfacesNV\");\n\tfp_glVDPAUUnmapSurfacesNV = (pfn_glVDPAUUnmapSurfacesNV)load(\"glVDPAUUnmapSurfacesNV\");\n}\n\nGLboolean GLAD_NV_vertex_attrib_integer_64bit = GL_FALSE;\nstatic void load_GL_NV_vertex_attrib_integer_64bit(LOADER load) {\n\tif(!GLAD_NV_vertex_attrib_integer_64bit) return;\n\tfp_glVertexAttribL1i64NV = (pfn_glVertexAttribL1i64NV)load(\"glVertexAttribL1i64NV\");\n\tfp_glVertexAttribL2i64NV = (pfn_glVertexAttribL2i64NV)load(\"glVertexAttribL2i64NV\");\n\tfp_glVertexAttribL3i64NV = (pfn_glVertexAttribL3i64NV)load(\"glVertexAttribL3i64NV\");\n\tfp_glVertexAttribL4i64NV = (pfn_glVertexAttribL4i64NV)load(\"glVertexAttribL4i64NV\");\n\tfp_glVertexAttribL1i64vNV = (pfn_glVertexAttribL1i64vNV)load(\"glVertexAttribL1i64vNV\");\n\tfp_glVertexAttribL2i64vNV = (pfn_glVertexAttribL2i64vNV)load(\"glVertexAttribL2i64vNV\");\n\tfp_glVertexAttribL3i64vNV = (pfn_glVertexAttribL3i64vNV)load(\"glVertexAttribL3i64vNV\");\n\tfp_glVertexAttribL4i64vNV = (pfn_glVertexAttribL4i64vNV)load(\"glVertexAttribL4i64vNV\");\n\tfp_glVertexAttribL1ui64NV = (pfn_glVertexAttribL1ui64NV)load(\"glVertexAttribL1ui64NV\");\n\tfp_glVertexAttribL2ui64NV = (pfn_glVertexAttribL2ui64NV)load(\"glVertexAttribL2ui64NV\");\n\tfp_glVertexAttribL3ui64NV = (pfn_glVertexAttribL3ui64NV)load(\"glVertexAttribL3ui64NV\");\n\tfp_glVertexAttribL4ui64NV = (pfn_glVertexAttribL4ui64NV)load(\"glVertexAttribL4ui64NV\");\n\tfp_glVertexAttribL1ui64vNV = (pfn_glVertexAttribL1ui64vNV)load(\"glVertexAttribL1ui64vNV\");\n\tfp_glVertexAttribL2ui64vNV = (pfn_glVertexAttribL2ui64vNV)load(\"glVertexAttribL2ui64vNV\");\n\tfp_glVertexAttribL3ui64vNV = (pfn_glVertexAttribL3ui64vNV)load(\"glVertexAttribL3ui64vNV\");\n\tfp_glVertexAttribL4ui64vNV = (pfn_glVertexAttribL4ui64vNV)load(\"glVertexAttribL4ui64vNV\");\n\tfp_glGetVertexAttribLi64vNV = (pfn_glGetVertexAttribLi64vNV)load(\"glGetVertexAttribLi64vNV\");\n\tfp_glGetVertexAttribLui64vNV = (pfn_glGetVertexAttribLui64vNV)load(\"glGetVertexAttribLui64vNV\");\n\tfp_glVertexAttribLFormatNV = (pfn_glVertexAttribLFormatNV)load(\"glVertexAttribLFormatNV\");\n}\n\nGLboolean GLAD_NV_vertex_buffer_unified_memory = GL_FALSE;\nstatic void load_GL_NV_vertex_buffer_unified_memory(LOADER load) {\n\tif(!GLAD_NV_vertex_buffer_unified_memory) return;\n\tfp_glBufferAddressRangeNV = (pfn_glBufferAddressRangeNV)load(\"glBufferAddressRangeNV\");\n\tfp_glVertexFormatNV = (pfn_glVertexFormatNV)load(\"glVertexFormatNV\");\n\tfp_glNormalFormatNV = (pfn_glNormalFormatNV)load(\"glNormalFormatNV\");\n\tfp_glColorFormatNV = (pfn_glColorFormatNV)load(\"glColorFormatNV\");\n\tfp_glIndexFormatNV = (pfn_glIndexFormatNV)load(\"glIndexFormatNV\");\n\tfp_glTexCoordFormatNV = (pfn_glTexCoordFormatNV)load(\"glTexCoordFormatNV\");\n\tfp_glEdgeFlagFormatNV = (pfn_glEdgeFlagFormatNV)load(\"glEdgeFlagFormatNV\");\n\tfp_glSecondaryColorFormatNV = (pfn_glSecondaryColorFormatNV)load(\"glSecondaryColorFormatNV\");\n\tfp_glFogCoordFormatNV = (pfn_glFogCoordFormatNV)load(\"glFogCoordFormatNV\");\n\tfp_glVertexAttribFormatNV = (pfn_glVertexAttribFormatNV)load(\"glVertexAttribFormatNV\");\n\tfp_glVertexAttribIFormatNV = (pfn_glVertexAttribIFormatNV)load(\"glVertexAttribIFormatNV\");\n\tfp_glGetIntegerui64i_vNV = (pfn_glGetIntegerui64i_vNV)load(\"glGetIntegerui64i_vNV\");\n}\n\nGLboolean GLAD_NV_vertex_program4 = GL_FALSE;\nstatic void load_GL_NV_vertex_program4(LOADER load) {\n\tif(!GLAD_NV_vertex_program4) return;\n\tfp_glVertexAttribI1iEXT = (pfn_glVertexAttribI1iEXT)load(\"glVertexAttribI1iEXT\");\n\tfp_glVertexAttribI2iEXT = (pfn_glVertexAttribI2iEXT)load(\"glVertexAttribI2iEXT\");\n\tfp_glVertexAttribI3iEXT = (pfn_glVertexAttribI3iEXT)load(\"glVertexAttribI3iEXT\");\n\tfp_glVertexAttribI4iEXT = (pfn_glVertexAttribI4iEXT)load(\"glVertexAttribI4iEXT\");\n\tfp_glVertexAttribI1uiEXT = (pfn_glVertexAttribI1uiEXT)load(\"glVertexAttribI1uiEXT\");\n\tfp_glVertexAttribI2uiEXT = (pfn_glVertexAttribI2uiEXT)load(\"glVertexAttribI2uiEXT\");\n\tfp_glVertexAttribI3uiEXT = (pfn_glVertexAttribI3uiEXT)load(\"glVertexAttribI3uiEXT\");\n\tfp_glVertexAttribI4uiEXT = (pfn_glVertexAttribI4uiEXT)load(\"glVertexAttribI4uiEXT\");\n\tfp_glVertexAttribI1ivEXT = (pfn_glVertexAttribI1ivEXT)load(\"glVertexAttribI1ivEXT\");\n\tfp_glVertexAttribI2ivEXT = (pfn_glVertexAttribI2ivEXT)load(\"glVertexAttribI2ivEXT\");\n\tfp_glVertexAttribI3ivEXT = (pfn_glVertexAttribI3ivEXT)load(\"glVertexAttribI3ivEXT\");\n\tfp_glVertexAttribI4ivEXT = (pfn_glVertexAttribI4ivEXT)load(\"glVertexAttribI4ivEXT\");\n\tfp_glVertexAttribI1uivEXT = (pfn_glVertexAttribI1uivEXT)load(\"glVertexAttribI1uivEXT\");\n\tfp_glVertexAttribI2uivEXT = (pfn_glVertexAttribI2uivEXT)load(\"glVertexAttribI2uivEXT\");\n\tfp_glVertexAttribI3uivEXT = (pfn_glVertexAttribI3uivEXT)load(\"glVertexAttribI3uivEXT\");\n\tfp_glVertexAttribI4uivEXT = (pfn_glVertexAttribI4uivEXT)load(\"glVertexAttribI4uivEXT\");\n\tfp_glVertexAttribI4bvEXT = (pfn_glVertexAttribI4bvEXT)load(\"glVertexAttribI4bvEXT\");\n\tfp_glVertexAttribI4svEXT = (pfn_glVertexAttribI4svEXT)load(\"glVertexAttribI4svEXT\");\n\tfp_glVertexAttribI4ubvEXT = (pfn_glVertexAttribI4ubvEXT)load(\"glVertexAttribI4ubvEXT\");\n\tfp_glVertexAttribI4usvEXT = (pfn_glVertexAttribI4usvEXT)load(\"glVertexAttribI4usvEXT\");\n\tfp_glVertexAttribIPointerEXT = (pfn_glVertexAttribIPointerEXT)load(\"glVertexAttribIPointerEXT\");\n\tfp_glGetVertexAttribIivEXT = (pfn_glGetVertexAttribIivEXT)load(\"glGetVertexAttribIivEXT\");\n\tfp_glGetVertexAttribIuivEXT = (pfn_glGetVertexAttribIuivEXT)load(\"glGetVertexAttribIuivEXT\");\n}\n\nGLboolean GLAD_NV_video_capture = GL_FALSE;\nstatic void load_GL_NV_video_capture(LOADER load) {\n\tif(!GLAD_NV_video_capture) return;\n\tfp_glBeginVideoCaptureNV = (pfn_glBeginVideoCaptureNV)load(\"glBeginVideoCaptureNV\");\n\tfp_glBindVideoCaptureStreamBufferNV = (pfn_glBindVideoCaptureStreamBufferNV)load(\"glBindVideoCaptureStreamBufferNV\");\n\tfp_glBindVideoCaptureStreamTextureNV = (pfn_glBindVideoCaptureStreamTextureNV)load(\"glBindVideoCaptureStreamTextureNV\");\n\tfp_glEndVideoCaptureNV = (pfn_glEndVideoCaptureNV)load(\"glEndVideoCaptureNV\");\n\tfp_glGetVideoCaptureivNV = (pfn_glGetVideoCaptureivNV)load(\"glGetVideoCaptureivNV\");\n\tfp_glGetVideoCaptureStreamivNV = (pfn_glGetVideoCaptureStreamivNV)load(\"glGetVideoCaptureStreamivNV\");\n\tfp_glGetVideoCaptureStreamfvNV = (pfn_glGetVideoCaptureStreamfvNV)load(\"glGetVideoCaptureStreamfvNV\");\n\tfp_glGetVideoCaptureStreamdvNV = (pfn_glGetVideoCaptureStreamdvNV)load(\"glGetVideoCaptureStreamdvNV\");\n\tfp_glVideoCaptureNV = (pfn_glVideoCaptureNV)load(\"glVideoCaptureNV\");\n\tfp_glVideoCaptureStreamParameterivNV = (pfn_glVideoCaptureStreamParameterivNV)load(\"glVideoCaptureStreamParameterivNV\");\n\tfp_glVideoCaptureStreamParameterfvNV = (pfn_glVideoCaptureStreamParameterfvNV)load(\"glVideoCaptureStreamParameterfvNV\");\n\tfp_glVideoCaptureStreamParameterdvNV = (pfn_glVideoCaptureStreamParameterdvNV)load(\"glVideoCaptureStreamParameterdvNV\");\n}\n\nGLboolean GLAD_NV_viewport_array = GL_FALSE;\nstatic void load_GL_NV_viewport_array(LOADER load) {\n\tif(!GLAD_NV_viewport_array) return;\n\tfp_glViewportArrayvNV = (pfn_glViewportArrayvNV)load(\"glViewportArrayvNV\");\n\tfp_glViewportIndexedfNV = (pfn_glViewportIndexedfNV)load(\"glViewportIndexedfNV\");\n\tfp_glViewportIndexedfvNV = (pfn_glViewportIndexedfvNV)load(\"glViewportIndexedfvNV\");\n\tfp_glScissorArrayvNV = (pfn_glScissorArrayvNV)load(\"glScissorArrayvNV\");\n\tfp_glScissorIndexedNV = (pfn_glScissorIndexedNV)load(\"glScissorIndexedNV\");\n\tfp_glScissorIndexedvNV = (pfn_glScissorIndexedvNV)load(\"glScissorIndexedvNV\");\n\tfp_glDepthRangeArrayfvNV = (pfn_glDepthRangeArrayfvNV)load(\"glDepthRangeArrayfvNV\");\n\tfp_glDepthRangeIndexedfNV = (pfn_glDepthRangeIndexedfNV)load(\"glDepthRangeIndexedfNV\");\n\tfp_glGetFloati_vNV = (pfn_glGetFloati_vNV)load(\"glGetFloati_vNV\");\n\tfp_glEnableiNV = (pfn_glEnableiNV)load(\"glEnableiNV\");\n\tfp_glDisableiNV = (pfn_glDisableiNV)load(\"glDisableiNV\");\n\tfp_glIsEnablediNV = (pfn_glIsEnablediNV)load(\"glIsEnablediNV\");\n}\n\nGLboolean GLAD_NV_viewport_array2 = GL_FALSE;\nGLboolean GLAD_NVX_conditional_render = GL_FALSE;\nstatic void load_GL_NVX_conditional_render(LOADER load) {\n\tif(!GLAD_NVX_conditional_render) return;\n\tfp_glBeginConditionalRenderNVX = (pfn_glBeginConditionalRenderNVX)load(\"glBeginConditionalRenderNVX\");\n\tfp_glEndConditionalRenderNVX = (pfn_glEndConditionalRenderNVX)load(\"glEndConditionalRenderNVX\");\n}\n\nGLboolean GLAD_NVX_gpu_memory_info = GL_FALSE;\nGLboolean GLAD_OVR_multiview = GL_FALSE;\nstatic void load_GL_OVR_multiview(LOADER load) {\n\tif(!GLAD_OVR_multiview) return;\n\tfp_glFramebufferTextureMultiviewOVR = (pfn_glFramebufferTextureMultiviewOVR)load(\"glFramebufferTextureMultiviewOVR\");\n}\n\nGLboolean GLAD_OVR_multiview2 = GL_FALSE;\nGLboolean GLAD_OVR_multiview_multisampled_render_to_texture = GL_FALSE;\nstatic void load_GL_OVR_multiview_multisampled_render_to_texture(LOADER load) {\n\tif(!GLAD_OVR_multiview_multisampled_render_to_texture) return;\n\tfp_glFramebufferTextureMultisampleMultiviewOVR = (pfn_glFramebufferTextureMultisampleMultiviewOVR)load(\"glFramebufferTextureMultisampleMultiviewOVR\");\n}\n\nGLboolean GLAD_QCOM_alpha_test = GL_FALSE;\nstatic void load_GL_QCOM_alpha_test(LOADER load) {\n\tif(!GLAD_QCOM_alpha_test) return;\n\tfp_glAlphaFuncQCOM = (pfn_glAlphaFuncQCOM)load(\"glAlphaFuncQCOM\");\n}\n\nGLboolean GLAD_QCOM_binning_control = GL_FALSE;\nGLboolean GLAD_QCOM_driver_control = GL_FALSE;\nstatic void load_GL_QCOM_driver_control(LOADER load) {\n\tif(!GLAD_QCOM_driver_control) return;\n\tfp_glGetDriverControlsQCOM = (pfn_glGetDriverControlsQCOM)load(\"glGetDriverControlsQCOM\");\n\tfp_glGetDriverControlStringQCOM = (pfn_glGetDriverControlStringQCOM)load(\"glGetDriverControlStringQCOM\");\n\tfp_glEnableDriverControlQCOM = (pfn_glEnableDriverControlQCOM)load(\"glEnableDriverControlQCOM\");\n\tfp_glDisableDriverControlQCOM = (pfn_glDisableDriverControlQCOM)load(\"glDisableDriverControlQCOM\");\n}\n\nGLboolean GLAD_QCOM_extended_get = GL_FALSE;\nstatic void load_GL_QCOM_extended_get(LOADER load) {\n\tif(!GLAD_QCOM_extended_get) return;\n\tfp_glExtGetTexturesQCOM = (pfn_glExtGetTexturesQCOM)load(\"glExtGetTexturesQCOM\");\n\tfp_glExtGetBuffersQCOM = (pfn_glExtGetBuffersQCOM)load(\"glExtGetBuffersQCOM\");\n\tfp_glExtGetRenderbuffersQCOM = (pfn_glExtGetRenderbuffersQCOM)load(\"glExtGetRenderbuffersQCOM\");\n\tfp_glExtGetFramebuffersQCOM = (pfn_glExtGetFramebuffersQCOM)load(\"glExtGetFramebuffersQCOM\");\n\tfp_glExtGetTexLevelParameterivQCOM = (pfn_glExtGetTexLevelParameterivQCOM)load(\"glExtGetTexLevelParameterivQCOM\");\n\tfp_glExtTexObjectStateOverrideiQCOM = (pfn_glExtTexObjectStateOverrideiQCOM)load(\"glExtTexObjectStateOverrideiQCOM\");\n\tfp_glExtGetTexSubImageQCOM = (pfn_glExtGetTexSubImageQCOM)load(\"glExtGetTexSubImageQCOM\");\n\tfp_glExtGetBufferPointervQCOM = (pfn_glExtGetBufferPointervQCOM)load(\"glExtGetBufferPointervQCOM\");\n}\n\nGLboolean GLAD_QCOM_extended_get2 = GL_FALSE;\nstatic void load_GL_QCOM_extended_get2(LOADER load) {\n\tif(!GLAD_QCOM_extended_get2) return;\n\tfp_glExtGetShadersQCOM = (pfn_glExtGetShadersQCOM)load(\"glExtGetShadersQCOM\");\n\tfp_glExtGetProgramsQCOM = (pfn_glExtGetProgramsQCOM)load(\"glExtGetProgramsQCOM\");\n\tfp_glExtIsProgramBinaryQCOM = (pfn_glExtIsProgramBinaryQCOM)load(\"glExtIsProgramBinaryQCOM\");\n\tfp_glExtGetProgramBinarySourceQCOM = (pfn_glExtGetProgramBinarySourceQCOM)load(\"glExtGetProgramBinarySourceQCOM\");\n}\n\nGLboolean GLAD_QCOM_perfmon_global_mode = GL_FALSE;\nGLboolean GLAD_QCOM_tiled_rendering = GL_FALSE;\nstatic void load_GL_QCOM_tiled_rendering(LOADER load) {\n\tif(!GLAD_QCOM_tiled_rendering) return;\n\tfp_glStartTilingQCOM = (pfn_glStartTilingQCOM)load(\"glStartTilingQCOM\");\n\tfp_glEndTilingQCOM = (pfn_glEndTilingQCOM)load(\"glEndTilingQCOM\");\n}\n\nGLboolean GLAD_QCOM_writeonly_rendering = GL_FALSE;\nGLboolean GLAD_VIV_shader_binary = GL_FALSE;\nstatic void find_extensions(void) {\n\tGLAD_KHR_blend_equation_advanced = has_ext(\"GL_KHR_blend_equation_advanced\");\n\tGLAD_KHR_blend_equation_advanced_coherent = has_ext(\"GL_KHR_blend_equation_advanced_coherent\");\n\tGLAD_KHR_context_flush_control = has_ext(\"GL_KHR_context_flush_control\");\n\tGLAD_KHR_debug = has_ext(\"GL_KHR_debug\");\n\tGLAD_KHR_no_error = has_ext(\"GL_KHR_no_error\");\n\tGLAD_KHR_robust_buffer_access_behavior = has_ext(\"GL_KHR_robust_buffer_access_behavior\");\n\tGLAD_KHR_robustness = has_ext(\"GL_KHR_robustness\");\n\tGLAD_KHR_texture_compression_astc_hdr = has_ext(\"GL_KHR_texture_compression_astc_hdr\");\n\tGLAD_KHR_texture_compression_astc_ldr = has_ext(\"GL_KHR_texture_compression_astc_ldr\");\n\tGLAD_KHR_texture_compression_astc_sliced_3d = has_ext(\"GL_KHR_texture_compression_astc_sliced_3d\");\n\tGLAD_ARB_arrays_of_arrays = has_ext(\"GL_ARB_arrays_of_arrays\");\n\tGLAD_ARB_base_instance = has_ext(\"GL_ARB_base_instance\");\n\tGLAD_ARB_bindless_texture = has_ext(\"GL_ARB_bindless_texture\");\n\tGLAD_ARB_blend_func_extended = has_ext(\"GL_ARB_blend_func_extended\");\n\tGLAD_ARB_buffer_storage = has_ext(\"GL_ARB_buffer_storage\");\n\tGLAD_ARB_cl_event = has_ext(\"GL_ARB_cl_event\");\n\tGLAD_ARB_clear_buffer_object = has_ext(\"GL_ARB_clear_buffer_object\");\n\tGLAD_ARB_clear_texture = has_ext(\"GL_ARB_clear_texture\");\n\tGLAD_ARB_clip_control = has_ext(\"GL_ARB_clip_control\");\n\tGLAD_ARB_color_buffer_float = has_ext(\"GL_ARB_color_buffer_float\");\n\tGLAD_ARB_compatibility = has_ext(\"GL_ARB_compatibility\");\n\tGLAD_ARB_compressed_texture_pixel_storage = has_ext(\"GL_ARB_compressed_texture_pixel_storage\");\n\tGLAD_ARB_compute_shader = has_ext(\"GL_ARB_compute_shader\");\n\tGLAD_ARB_compute_variable_group_size = has_ext(\"GL_ARB_compute_variable_group_size\");\n\tGLAD_ARB_conditional_render_inverted = has_ext(\"GL_ARB_conditional_render_inverted\");\n\tGLAD_ARB_conservative_depth = has_ext(\"GL_ARB_conservative_depth\");\n\tGLAD_ARB_copy_buffer = has_ext(\"GL_ARB_copy_buffer\");\n\tGLAD_ARB_copy_image = has_ext(\"GL_ARB_copy_image\");\n\tGLAD_ARB_cull_distance = has_ext(\"GL_ARB_cull_distance\");\n\tGLAD_ARB_debug_output = has_ext(\"GL_ARB_debug_output\");\n\tGLAD_ARB_depth_buffer_float = has_ext(\"GL_ARB_depth_buffer_float\");\n\tGLAD_ARB_depth_clamp = has_ext(\"GL_ARB_depth_clamp\");\n\tGLAD_ARB_derivative_control = has_ext(\"GL_ARB_derivative_control\");\n\tGLAD_ARB_direct_state_access = has_ext(\"GL_ARB_direct_state_access\");\n\tGLAD_ARB_draw_buffers_blend = has_ext(\"GL_ARB_draw_buffers_blend\");\n\tGLAD_ARB_draw_elements_base_vertex = has_ext(\"GL_ARB_draw_elements_base_vertex\");\n\tGLAD_ARB_draw_indirect = has_ext(\"GL_ARB_draw_indirect\");\n\tGLAD_ARB_draw_instanced = has_ext(\"GL_ARB_draw_instanced\");\n\tGLAD_ARB_enhanced_layouts = has_ext(\"GL_ARB_enhanced_layouts\");\n\tGLAD_ARB_ES2_compatibility = has_ext(\"GL_ARB_ES2_compatibility\");\n\tGLAD_ARB_ES3_1_compatibility = has_ext(\"GL_ARB_ES3_1_compatibility\");\n\tGLAD_ARB_ES3_2_compatibility = has_ext(\"GL_ARB_ES3_2_compatibility\");\n\tGLAD_ARB_ES3_compatibility = has_ext(\"GL_ARB_ES3_compatibility\");\n\tGLAD_ARB_explicit_attrib_location = has_ext(\"GL_ARB_explicit_attrib_location\");\n\tGLAD_ARB_explicit_uniform_location = has_ext(\"GL_ARB_explicit_uniform_location\");\n\tGLAD_ARB_fragment_coord_conventions = has_ext(\"GL_ARB_fragment_coord_conventions\");\n\tGLAD_ARB_fragment_layer_viewport = has_ext(\"GL_ARB_fragment_layer_viewport\");\n\tGLAD_ARB_fragment_shader_interlock = has_ext(\"GL_ARB_fragment_shader_interlock\");\n\tGLAD_ARB_framebuffer_no_attachments = has_ext(\"GL_ARB_framebuffer_no_attachments\");\n\tGLAD_ARB_framebuffer_object = has_ext(\"GL_ARB_framebuffer_object\");\n\tGLAD_ARB_framebuffer_sRGB = has_ext(\"GL_ARB_framebuffer_sRGB\");\n\tGLAD_ARB_geometry_shader4 = has_ext(\"GL_ARB_geometry_shader4\");\n\tGLAD_ARB_get_program_binary = has_ext(\"GL_ARB_get_program_binary\");\n\tGLAD_ARB_get_texture_sub_image = has_ext(\"GL_ARB_get_texture_sub_image\");\n\tGLAD_ARB_gpu_shader5 = has_ext(\"GL_ARB_gpu_shader5\");\n\tGLAD_ARB_gpu_shader_fp64 = has_ext(\"GL_ARB_gpu_shader_fp64\");\n\tGLAD_ARB_gpu_shader_int64 = has_ext(\"GL_ARB_gpu_shader_int64\");\n\tGLAD_ARB_half_float_pixel = has_ext(\"GL_ARB_half_float_pixel\");\n\tGLAD_ARB_half_float_vertex = has_ext(\"GL_ARB_half_float_vertex\");\n\tGLAD_ARB_indirect_parameters = has_ext(\"GL_ARB_indirect_parameters\");\n\tGLAD_ARB_instanced_arrays = has_ext(\"GL_ARB_instanced_arrays\");\n\tGLAD_ARB_internalformat_query = has_ext(\"GL_ARB_internalformat_query\");\n\tGLAD_ARB_internalformat_query2 = has_ext(\"GL_ARB_internalformat_query2\");\n\tGLAD_ARB_invalidate_subdata = has_ext(\"GL_ARB_invalidate_subdata\");\n\tGLAD_ARB_map_buffer_alignment = has_ext(\"GL_ARB_map_buffer_alignment\");\n\tGLAD_ARB_map_buffer_range = has_ext(\"GL_ARB_map_buffer_range\");\n\tGLAD_ARB_multi_bind = has_ext(\"GL_ARB_multi_bind\");\n\tGLAD_ARB_multi_draw_indirect = has_ext(\"GL_ARB_multi_draw_indirect\");\n\tGLAD_ARB_occlusion_query2 = has_ext(\"GL_ARB_occlusion_query2\");\n\tGLAD_ARB_parallel_shader_compile = has_ext(\"GL_ARB_parallel_shader_compile\");\n\tGLAD_ARB_pipeline_statistics_query = has_ext(\"GL_ARB_pipeline_statistics_query\");\n\tGLAD_ARB_pixel_buffer_object = has_ext(\"GL_ARB_pixel_buffer_object\");\n\tGLAD_ARB_post_depth_coverage = has_ext(\"GL_ARB_post_depth_coverage\");\n\tGLAD_ARB_program_interface_query = has_ext(\"GL_ARB_program_interface_query\");\n\tGLAD_ARB_provoking_vertex = has_ext(\"GL_ARB_provoking_vertex\");\n\tGLAD_ARB_query_buffer_object = has_ext(\"GL_ARB_query_buffer_object\");\n\tGLAD_ARB_robust_buffer_access_behavior = has_ext(\"GL_ARB_robust_buffer_access_behavior\");\n\tGLAD_ARB_robustness = has_ext(\"GL_ARB_robustness\");\n\tGLAD_ARB_robustness_isolation = has_ext(\"GL_ARB_robustness_isolation\");\n\tGLAD_ARB_sample_locations = has_ext(\"GL_ARB_sample_locations\");\n\tGLAD_ARB_sample_shading = has_ext(\"GL_ARB_sample_shading\");\n\tGLAD_ARB_sampler_objects = has_ext(\"GL_ARB_sampler_objects\");\n\tGLAD_ARB_seamless_cube_map = has_ext(\"GL_ARB_seamless_cube_map\");\n\tGLAD_ARB_seamless_cubemap_per_texture = has_ext(\"GL_ARB_seamless_cubemap_per_texture\");\n\tGLAD_ARB_separate_shader_objects = has_ext(\"GL_ARB_separate_shader_objects\");\n\tGLAD_ARB_shader_atomic_counter_ops = has_ext(\"GL_ARB_shader_atomic_counter_ops\");\n\tGLAD_ARB_shader_atomic_counters = has_ext(\"GL_ARB_shader_atomic_counters\");\n\tGLAD_ARB_shader_ballot = has_ext(\"GL_ARB_shader_ballot\");\n\tGLAD_ARB_shader_bit_encoding = has_ext(\"GL_ARB_shader_bit_encoding\");\n\tGLAD_ARB_shader_clock = has_ext(\"GL_ARB_shader_clock\");\n\tGLAD_ARB_shader_draw_parameters = has_ext(\"GL_ARB_shader_draw_parameters\");\n\tGLAD_ARB_shader_group_vote = has_ext(\"GL_ARB_shader_group_vote\");\n\tGLAD_ARB_shader_image_load_store = has_ext(\"GL_ARB_shader_image_load_store\");\n\tGLAD_ARB_shader_image_size = has_ext(\"GL_ARB_shader_image_size\");\n\tGLAD_ARB_shader_precision = has_ext(\"GL_ARB_shader_precision\");\n\tGLAD_ARB_shader_stencil_export = has_ext(\"GL_ARB_shader_stencil_export\");\n\tGLAD_ARB_shader_storage_buffer_object = has_ext(\"GL_ARB_shader_storage_buffer_object\");\n\tGLAD_ARB_shader_subroutine = has_ext(\"GL_ARB_shader_subroutine\");\n\tGLAD_ARB_shader_texture_image_samples = has_ext(\"GL_ARB_shader_texture_image_samples\");\n\tGLAD_ARB_shader_texture_lod = has_ext(\"GL_ARB_shader_texture_lod\");\n\tGLAD_ARB_shader_viewport_layer_array = has_ext(\"GL_ARB_shader_viewport_layer_array\");\n\tGLAD_ARB_shading_language_420pack = has_ext(\"GL_ARB_shading_language_420pack\");\n\tGLAD_ARB_shading_language_include = has_ext(\"GL_ARB_shading_language_include\");\n\tGLAD_ARB_shading_language_packing = has_ext(\"GL_ARB_shading_language_packing\");\n\tGLAD_ARB_sparse_buffer = has_ext(\"GL_ARB_sparse_buffer\");\n\tGLAD_ARB_sparse_texture = has_ext(\"GL_ARB_sparse_texture\");\n\tGLAD_ARB_sparse_texture2 = has_ext(\"GL_ARB_sparse_texture2\");\n\tGLAD_ARB_sparse_texture_clamp = has_ext(\"GL_ARB_sparse_texture_clamp\");\n\tGLAD_ARB_stencil_texturing = has_ext(\"GL_ARB_stencil_texturing\");\n\tGLAD_ARB_sync = has_ext(\"GL_ARB_sync\");\n\tGLAD_ARB_tessellation_shader = has_ext(\"GL_ARB_tessellation_shader\");\n\tGLAD_ARB_texture_barrier = has_ext(\"GL_ARB_texture_barrier\");\n\tGLAD_ARB_texture_buffer_object = has_ext(\"GL_ARB_texture_buffer_object\");\n\tGLAD_ARB_texture_buffer_object_rgb32 = has_ext(\"GL_ARB_texture_buffer_object_rgb32\");\n\tGLAD_ARB_texture_buffer_range = has_ext(\"GL_ARB_texture_buffer_range\");\n\tGLAD_ARB_texture_compression_bptc = has_ext(\"GL_ARB_texture_compression_bptc\");\n\tGLAD_ARB_texture_compression_rgtc = has_ext(\"GL_ARB_texture_compression_rgtc\");\n\tGLAD_ARB_texture_cube_map_array = has_ext(\"GL_ARB_texture_cube_map_array\");\n\tGLAD_ARB_texture_filter_minmax = has_ext(\"GL_ARB_texture_filter_minmax\");\n\tGLAD_ARB_texture_float = has_ext(\"GL_ARB_texture_float\");\n\tGLAD_ARB_texture_gather = has_ext(\"GL_ARB_texture_gather\");\n\tGLAD_ARB_texture_mirror_clamp_to_edge = has_ext(\"GL_ARB_texture_mirror_clamp_to_edge\");\n\tGLAD_ARB_texture_multisample = has_ext(\"GL_ARB_texture_multisample\");\n\tGLAD_ARB_texture_query_levels = has_ext(\"GL_ARB_texture_query_levels\");\n\tGLAD_ARB_texture_query_lod = has_ext(\"GL_ARB_texture_query_lod\");\n\tGLAD_ARB_texture_rectangle = has_ext(\"GL_ARB_texture_rectangle\");\n\tGLAD_ARB_texture_rg = has_ext(\"GL_ARB_texture_rg\");\n\tGLAD_ARB_texture_rgb10_a2ui = has_ext(\"GL_ARB_texture_rgb10_a2ui\");\n\tGLAD_ARB_texture_stencil8 = has_ext(\"GL_ARB_texture_stencil8\");\n\tGLAD_ARB_texture_storage = has_ext(\"GL_ARB_texture_storage\");\n\tGLAD_ARB_texture_storage_multisample = has_ext(\"GL_ARB_texture_storage_multisample\");\n\tGLAD_ARB_texture_swizzle = has_ext(\"GL_ARB_texture_swizzle\");\n\tGLAD_ARB_texture_view = has_ext(\"GL_ARB_texture_view\");\n\tGLAD_ARB_timer_query = has_ext(\"GL_ARB_timer_query\");\n\tGLAD_ARB_transform_feedback2 = has_ext(\"GL_ARB_transform_feedback2\");\n\tGLAD_ARB_transform_feedback3 = has_ext(\"GL_ARB_transform_feedback3\");\n\tGLAD_ARB_transform_feedback_instanced = has_ext(\"GL_ARB_transform_feedback_instanced\");\n\tGLAD_ARB_transform_feedback_overflow_query = has_ext(\"GL_ARB_transform_feedback_overflow_query\");\n\tGLAD_ARB_uniform_buffer_object = has_ext(\"GL_ARB_uniform_buffer_object\");\n\tGLAD_ARB_vertex_array_bgra = has_ext(\"GL_ARB_vertex_array_bgra\");\n\tGLAD_ARB_vertex_array_object = has_ext(\"GL_ARB_vertex_array_object\");\n\tGLAD_ARB_vertex_attrib_64bit = has_ext(\"GL_ARB_vertex_attrib_64bit\");\n\tGLAD_ARB_vertex_attrib_binding = has_ext(\"GL_ARB_vertex_attrib_binding\");\n\tGLAD_ARB_vertex_type_10f_11f_11f_rev = has_ext(\"GL_ARB_vertex_type_10f_11f_11f_rev\");\n\tGLAD_ARB_vertex_type_2_10_10_10_rev = has_ext(\"GL_ARB_vertex_type_2_10_10_10_rev\");\n\tGLAD_ARB_viewport_array = has_ext(\"GL_ARB_viewport_array\");\n\tGLAD_EXT_base_instance = has_ext(\"GL_EXT_base_instance\");\n\tGLAD_EXT_bgra = has_ext(\"GL_EXT_bgra\");\n\tGLAD_EXT_bindable_uniform = has_ext(\"GL_EXT_bindable_uniform\");\n\tGLAD_EXT_blend_func_extended = has_ext(\"GL_EXT_blend_func_extended\");\n\tGLAD_EXT_blend_minmax = has_ext(\"GL_EXT_blend_minmax\");\n\tGLAD_EXT_buffer_storage = has_ext(\"GL_EXT_buffer_storage\");\n\tGLAD_EXT_color_buffer_float = has_ext(\"GL_EXT_color_buffer_float\");\n\tGLAD_EXT_color_buffer_half_float = has_ext(\"GL_EXT_color_buffer_half_float\");\n\tGLAD_EXT_copy_image = has_ext(\"GL_EXT_copy_image\");\n\tGLAD_EXT_debug_label = has_ext(\"GL_EXT_debug_label\");\n\tGLAD_EXT_debug_marker = has_ext(\"GL_EXT_debug_marker\");\n\tGLAD_EXT_direct_state_access = has_ext(\"GL_EXT_direct_state_access\");\n\tGLAD_EXT_discard_framebuffer = has_ext(\"GL_EXT_discard_framebuffer\");\n\tGLAD_EXT_disjoint_timer_query = has_ext(\"GL_EXT_disjoint_timer_query\");\n\tGLAD_EXT_draw_buffers = has_ext(\"GL_EXT_draw_buffers\");\n\tGLAD_EXT_draw_buffers2 = has_ext(\"GL_EXT_draw_buffers2\");\n\tGLAD_EXT_draw_buffers_indexed = has_ext(\"GL_EXT_draw_buffers_indexed\");\n\tGLAD_EXT_draw_elements_base_vertex = has_ext(\"GL_EXT_draw_elements_base_vertex\");\n\tGLAD_EXT_draw_instanced = has_ext(\"GL_EXT_draw_instanced\");\n\tGLAD_EXT_float_blend = has_ext(\"GL_EXT_float_blend\");\n\tGLAD_EXT_framebuffer_blit = has_ext(\"GL_EXT_framebuffer_blit\");\n\tGLAD_EXT_framebuffer_multisample = has_ext(\"GL_EXT_framebuffer_multisample\");\n\tGLAD_EXT_framebuffer_multisample_blit_scaled = has_ext(\"GL_EXT_framebuffer_multisample_blit_scaled\");\n\tGLAD_EXT_framebuffer_object = has_ext(\"GL_EXT_framebuffer_object\");\n\tGLAD_EXT_framebuffer_sRGB = has_ext(\"GL_EXT_framebuffer_sRGB\");\n\tGLAD_EXT_geometry_point_size = has_ext(\"GL_EXT_geometry_point_size\");\n\tGLAD_EXT_geometry_shader = has_ext(\"GL_EXT_geometry_shader\");\n\tGLAD_EXT_geometry_shader4 = has_ext(\"GL_EXT_geometry_shader4\");\n\tGLAD_EXT_gpu_program_parameters = has_ext(\"GL_EXT_gpu_program_parameters\");\n\tGLAD_EXT_gpu_shader4 = has_ext(\"GL_EXT_gpu_shader4\");\n\tGLAD_EXT_gpu_shader5 = has_ext(\"GL_EXT_gpu_shader5\");\n\tGLAD_EXT_instanced_arrays = has_ext(\"GL_EXT_instanced_arrays\");\n\tGLAD_EXT_map_buffer_range = has_ext(\"GL_EXT_map_buffer_range\");\n\tGLAD_EXT_multi_draw_indirect = has_ext(\"GL_EXT_multi_draw_indirect\");\n\tGLAD_EXT_multisampled_compatibility = has_ext(\"GL_EXT_multisampled_compatibility\");\n\tGLAD_EXT_multisampled_render_to_texture = has_ext(\"GL_EXT_multisampled_render_to_texture\");\n\tGLAD_EXT_multiview_draw_buffers = has_ext(\"GL_EXT_multiview_draw_buffers\");\n\tGLAD_EXT_occlusion_query_boolean = has_ext(\"GL_EXT_occlusion_query_boolean\");\n\tGLAD_EXT_packed_depth_stencil = has_ext(\"GL_EXT_packed_depth_stencil\");\n\tGLAD_EXT_packed_float = has_ext(\"GL_EXT_packed_float\");\n\tGLAD_EXT_pixel_buffer_object = has_ext(\"GL_EXT_pixel_buffer_object\");\n\tGLAD_EXT_polygon_offset_clamp = has_ext(\"GL_EXT_polygon_offset_clamp\");\n\tGLAD_EXT_post_depth_coverage = has_ext(\"GL_EXT_post_depth_coverage\");\n\tGLAD_EXT_primitive_bounding_box = has_ext(\"GL_EXT_primitive_bounding_box\");\n\tGLAD_EXT_provoking_vertex = has_ext(\"GL_EXT_provoking_vertex\");\n\tGLAD_EXT_pvrtc_sRGB = has_ext(\"GL_EXT_pvrtc_sRGB\");\n\tGLAD_EXT_raster_multisample = has_ext(\"GL_EXT_raster_multisample\");\n\tGLAD_EXT_read_format_bgra = has_ext(\"GL_EXT_read_format_bgra\");\n\tGLAD_EXT_render_snorm = has_ext(\"GL_EXT_render_snorm\");\n\tGLAD_EXT_robustness = has_ext(\"GL_EXT_robustness\");\n\tGLAD_EXT_separate_shader_objects = has_ext(\"GL_EXT_separate_shader_objects\");\n\tGLAD_EXT_shader_framebuffer_fetch = has_ext(\"GL_EXT_shader_framebuffer_fetch\");\n\tGLAD_EXT_shader_image_load_formatted = has_ext(\"GL_EXT_shader_image_load_formatted\");\n\tGLAD_EXT_shader_image_load_store = has_ext(\"GL_EXT_shader_image_load_store\");\n\tGLAD_EXT_shader_implicit_conversions = has_ext(\"GL_EXT_shader_implicit_conversions\");\n\tGLAD_EXT_shader_integer_mix = has_ext(\"GL_EXT_shader_integer_mix\");\n\tGLAD_EXT_shader_io_blocks = has_ext(\"GL_EXT_shader_io_blocks\");\n\tGLAD_EXT_shader_pixel_local_storage = has_ext(\"GL_EXT_shader_pixel_local_storage\");\n\tGLAD_EXT_shader_texture_lod = has_ext(\"GL_EXT_shader_texture_lod\");\n\tGLAD_EXT_shadow_samplers = has_ext(\"GL_EXT_shadow_samplers\");\n\tGLAD_EXT_sparse_texture = has_ext(\"GL_EXT_sparse_texture\");\n\tGLAD_EXT_sparse_texture2 = has_ext(\"GL_EXT_sparse_texture2\");\n\tGLAD_EXT_sRGB = has_ext(\"GL_EXT_sRGB\");\n\tGLAD_EXT_sRGB_write_control = has_ext(\"GL_EXT_sRGB_write_control\");\n\tGLAD_EXT_stencil_clear_tag = has_ext(\"GL_EXT_stencil_clear_tag\");\n\tGLAD_EXT_tessellation_point_size = has_ext(\"GL_EXT_tessellation_point_size\");\n\tGLAD_EXT_tessellation_shader = has_ext(\"GL_EXT_tessellation_shader\");\n\tGLAD_EXT_texture_array = has_ext(\"GL_EXT_texture_array\");\n\tGLAD_EXT_texture_border_clamp = has_ext(\"GL_EXT_texture_border_clamp\");\n\tGLAD_EXT_texture_buffer = has_ext(\"GL_EXT_texture_buffer\");\n\tGLAD_EXT_texture_buffer_object = has_ext(\"GL_EXT_texture_buffer_object\");\n\tGLAD_EXT_texture_compression_dxt1 = has_ext(\"GL_EXT_texture_compression_dxt1\");\n\tGLAD_EXT_texture_compression_latc = has_ext(\"GL_EXT_texture_compression_latc\");\n\tGLAD_EXT_texture_compression_rgtc = has_ext(\"GL_EXT_texture_compression_rgtc\");\n\tGLAD_EXT_texture_compression_s3tc = has_ext(\"GL_EXT_texture_compression_s3tc\");\n\tGLAD_EXT_texture_cube_map = has_ext(\"GL_EXT_texture_cube_map\");\n\tGLAD_EXT_texture_cube_map_array = has_ext(\"GL_EXT_texture_cube_map_array\");\n\tGLAD_EXT_texture_filter_anisotropic = has_ext(\"GL_EXT_texture_filter_anisotropic\");\n\tGLAD_EXT_texture_filter_minmax = has_ext(\"GL_EXT_texture_filter_minmax\");\n\tGLAD_EXT_texture_format_BGRA8888 = has_ext(\"GL_EXT_texture_format_BGRA8888\");\n\tGLAD_EXT_texture_integer = has_ext(\"GL_EXT_texture_integer\");\n\tGLAD_EXT_texture_norm16 = has_ext(\"GL_EXT_texture_norm16\");\n\tGLAD_EXT_texture_rg = has_ext(\"GL_EXT_texture_rg\");\n\tGLAD_EXT_texture_shared_exponent = has_ext(\"GL_EXT_texture_shared_exponent\");\n\tGLAD_EXT_texture_snorm = has_ext(\"GL_EXT_texture_snorm\");\n\tGLAD_EXT_texture_sRGB = has_ext(\"GL_EXT_texture_sRGB\");\n\tGLAD_EXT_texture_sRGB_decode = has_ext(\"GL_EXT_texture_sRGB_decode\");\n\tGLAD_EXT_texture_sRGB_R8 = has_ext(\"GL_EXT_texture_sRGB_R8\");\n\tGLAD_EXT_texture_sRGB_RG8 = has_ext(\"GL_EXT_texture_sRGB_RG8\");\n\tGLAD_EXT_texture_storage = has_ext(\"GL_EXT_texture_storage\");\n\tGLAD_EXT_texture_swizzle = has_ext(\"GL_EXT_texture_swizzle\");\n\tGLAD_EXT_texture_type_2_10_10_10_REV = has_ext(\"GL_EXT_texture_type_2_10_10_10_REV\");\n\tGLAD_EXT_texture_view = has_ext(\"GL_EXT_texture_view\");\n\tGLAD_EXT_timer_query = has_ext(\"GL_EXT_timer_query\");\n\tGLAD_EXT_transform_feedback = has_ext(\"GL_EXT_transform_feedback\");\n\tGLAD_EXT_unpack_subimage = has_ext(\"GL_EXT_unpack_subimage\");\n\tGLAD_EXT_vertex_array_bgra = has_ext(\"GL_EXT_vertex_array_bgra\");\n\tGLAD_EXT_vertex_attrib_64bit = has_ext(\"GL_EXT_vertex_attrib_64bit\");\n\tGLAD_EXT_x11_sync_object = has_ext(\"GL_EXT_x11_sync_object\");\n\tGLAD_EXT_YUV_target = has_ext(\"GL_EXT_YUV_target\");\n\tGLAD_OES_compressed_ETC1_RGB8_sub_texture = has_ext(\"GL_OES_compressed_ETC1_RGB8_sub_texture\");\n\tGLAD_OES_compressed_ETC1_RGB8_texture = has_ext(\"GL_OES_compressed_ETC1_RGB8_texture\");\n\tGLAD_OES_copy_image = has_ext(\"GL_OES_copy_image\");\n\tGLAD_OES_depth24 = has_ext(\"GL_OES_depth24\");\n\tGLAD_OES_depth32 = has_ext(\"GL_OES_depth32\");\n\tGLAD_OES_depth_texture = has_ext(\"GL_OES_depth_texture\");\n\tGLAD_OES_draw_buffers_indexed = has_ext(\"GL_OES_draw_buffers_indexed\");\n\tGLAD_OES_draw_elements_base_vertex = has_ext(\"GL_OES_draw_elements_base_vertex\");\n\tGLAD_OES_EGL_image = has_ext(\"GL_OES_EGL_image\");\n\tGLAD_OES_EGL_image_external = has_ext(\"GL_OES_EGL_image_external\");\n\tGLAD_OES_EGL_image_external_essl3 = has_ext(\"GL_OES_EGL_image_external_essl3\");\n\tGLAD_OES_element_index_uint = has_ext(\"GL_OES_element_index_uint\");\n\tGLAD_OES_fbo_render_mipmap = has_ext(\"GL_OES_fbo_render_mipmap\");\n\tGLAD_OES_fragment_precision_high = has_ext(\"GL_OES_fragment_precision_high\");\n\tGLAD_OES_geometry_point_size = has_ext(\"GL_OES_geometry_point_size\");\n\tGLAD_OES_geometry_shader = has_ext(\"GL_OES_geometry_shader\");\n\tGLAD_OES_get_program_binary = has_ext(\"GL_OES_get_program_binary\");\n\tGLAD_OES_gpu_shader5 = has_ext(\"GL_OES_gpu_shader5\");\n\tGLAD_OES_mapbuffer = has_ext(\"GL_OES_mapbuffer\");\n\tGLAD_OES_packed_depth_stencil = has_ext(\"GL_OES_packed_depth_stencil\");\n\tGLAD_OES_primitive_bounding_box = has_ext(\"GL_OES_primitive_bounding_box\");\n\tGLAD_OES_required_internalformat = has_ext(\"GL_OES_required_internalformat\");\n\tGLAD_OES_rgb8_rgba8 = has_ext(\"GL_OES_rgb8_rgba8\");\n\tGLAD_OES_sample_shading = has_ext(\"GL_OES_sample_shading\");\n\tGLAD_OES_sample_variables = has_ext(\"GL_OES_sample_variables\");\n\tGLAD_OES_shader_image_atomic = has_ext(\"GL_OES_shader_image_atomic\");\n\tGLAD_OES_shader_io_blocks = has_ext(\"GL_OES_shader_io_blocks\");\n\tGLAD_OES_shader_multisample_interpolation = has_ext(\"GL_OES_shader_multisample_interpolation\");\n\tGLAD_OES_standard_derivatives = has_ext(\"GL_OES_standard_derivatives\");\n\tGLAD_OES_stencil1 = has_ext(\"GL_OES_stencil1\");\n\tGLAD_OES_stencil4 = has_ext(\"GL_OES_stencil4\");\n\tGLAD_OES_surfaceless_context = has_ext(\"GL_OES_surfaceless_context\");\n\tGLAD_OES_tessellation_point_size = has_ext(\"GL_OES_tessellation_point_size\");\n\tGLAD_OES_tessellation_shader = has_ext(\"GL_OES_tessellation_shader\");\n\tGLAD_OES_texture_3D = has_ext(\"GL_OES_texture_3D\");\n\tGLAD_OES_texture_border_clamp = has_ext(\"GL_OES_texture_border_clamp\");\n\tGLAD_OES_texture_buffer = has_ext(\"GL_OES_texture_buffer\");\n\tGLAD_OES_texture_compression_astc = has_ext(\"GL_OES_texture_compression_astc\");\n\tGLAD_OES_texture_cube_map_array = has_ext(\"GL_OES_texture_cube_map_array\");\n\tGLAD_OES_texture_float = has_ext(\"GL_OES_texture_float\");\n\tGLAD_OES_texture_float_linear = has_ext(\"GL_OES_texture_float_linear\");\n\tGLAD_OES_texture_half_float = has_ext(\"GL_OES_texture_half_float\");\n\tGLAD_OES_texture_half_float_linear = has_ext(\"GL_OES_texture_half_float_linear\");\n\tGLAD_OES_texture_npot = has_ext(\"GL_OES_texture_npot\");\n\tGLAD_OES_texture_stencil8 = has_ext(\"GL_OES_texture_stencil8\");\n\tGLAD_OES_texture_storage_multisample_2d_array = has_ext(\"GL_OES_texture_storage_multisample_2d_array\");\n\tGLAD_OES_texture_view = has_ext(\"GL_OES_texture_view\");\n\tGLAD_OES_vertex_array_object = has_ext(\"GL_OES_vertex_array_object\");\n\tGLAD_OES_vertex_half_float = has_ext(\"GL_OES_vertex_half_float\");\n\tGLAD_OES_vertex_type_10_10_10_2 = has_ext(\"GL_OES_vertex_type_10_10_10_2\");\n\tGLAD_AMD_blend_minmax_factor = has_ext(\"GL_AMD_blend_minmax_factor\");\n\tGLAD_AMD_compressed_3DC_texture = has_ext(\"GL_AMD_compressed_3DC_texture\");\n\tGLAD_AMD_compressed_ATC_texture = has_ext(\"GL_AMD_compressed_ATC_texture\");\n\tGLAD_AMD_conservative_depth = has_ext(\"GL_AMD_conservative_depth\");\n\tGLAD_AMD_debug_output = has_ext(\"GL_AMD_debug_output\");\n\tGLAD_AMD_depth_clamp_separate = has_ext(\"GL_AMD_depth_clamp_separate\");\n\tGLAD_AMD_draw_buffers_blend = has_ext(\"GL_AMD_draw_buffers_blend\");\n\tGLAD_AMD_gcn_shader = has_ext(\"GL_AMD_gcn_shader\");\n\tGLAD_AMD_gpu_shader_int64 = has_ext(\"GL_AMD_gpu_shader_int64\");\n\tGLAD_AMD_interleaved_elements = has_ext(\"GL_AMD_interleaved_elements\");\n\tGLAD_AMD_multi_draw_indirect = has_ext(\"GL_AMD_multi_draw_indirect\");\n\tGLAD_AMD_name_gen_delete = has_ext(\"GL_AMD_name_gen_delete\");\n\tGLAD_AMD_occlusion_query_event = has_ext(\"GL_AMD_occlusion_query_event\");\n\tGLAD_AMD_performance_monitor = has_ext(\"GL_AMD_performance_monitor\");\n\tGLAD_AMD_pinned_memory = has_ext(\"GL_AMD_pinned_memory\");\n\tGLAD_AMD_program_binary_Z400 = has_ext(\"GL_AMD_program_binary_Z400\");\n\tGLAD_AMD_query_buffer_object = has_ext(\"GL_AMD_query_buffer_object\");\n\tGLAD_AMD_sample_positions = has_ext(\"GL_AMD_sample_positions\");\n\tGLAD_AMD_seamless_cubemap_per_texture = has_ext(\"GL_AMD_seamless_cubemap_per_texture\");\n\tGLAD_AMD_shader_atomic_counter_ops = has_ext(\"GL_AMD_shader_atomic_counter_ops\");\n\tGLAD_AMD_shader_stencil_export = has_ext(\"GL_AMD_shader_stencil_export\");\n\tGLAD_AMD_shader_trinary_minmax = has_ext(\"GL_AMD_shader_trinary_minmax\");\n\tGLAD_AMD_sparse_texture = has_ext(\"GL_AMD_sparse_texture\");\n\tGLAD_AMD_stencil_operation_extended = has_ext(\"GL_AMD_stencil_operation_extended\");\n\tGLAD_AMD_texture_texture4 = has_ext(\"GL_AMD_texture_texture4\");\n\tGLAD_AMD_transform_feedback3_lines_triangles = has_ext(\"GL_AMD_transform_feedback3_lines_triangles\");\n\tGLAD_AMD_transform_feedback4 = has_ext(\"GL_AMD_transform_feedback4\");\n\tGLAD_AMD_vertex_shader_layer = has_ext(\"GL_AMD_vertex_shader_layer\");\n\tGLAD_AMD_vertex_shader_tessellator = has_ext(\"GL_AMD_vertex_shader_tessellator\");\n\tGLAD_AMD_vertex_shader_viewport_index = has_ext(\"GL_AMD_vertex_shader_viewport_index\");\n\tGLAD_ANDROID_extension_pack_es31a = has_ext(\"GL_ANDROID_extension_pack_es31a\");\n\tGLAD_ANGLE_depth_texture = has_ext(\"GL_ANGLE_depth_texture\");\n\tGLAD_ANGLE_framebuffer_blit = has_ext(\"GL_ANGLE_framebuffer_blit\");\n\tGLAD_ANGLE_framebuffer_multisample = has_ext(\"GL_ANGLE_framebuffer_multisample\");\n\tGLAD_ANGLE_instanced_arrays = has_ext(\"GL_ANGLE_instanced_arrays\");\n\tGLAD_ANGLE_pack_reverse_row_order = has_ext(\"GL_ANGLE_pack_reverse_row_order\");\n\tGLAD_ANGLE_program_binary = has_ext(\"GL_ANGLE_program_binary\");\n\tGLAD_ANGLE_texture_compression_dxt3 = has_ext(\"GL_ANGLE_texture_compression_dxt3\");\n\tGLAD_ANGLE_texture_compression_dxt5 = has_ext(\"GL_ANGLE_texture_compression_dxt5\");\n\tGLAD_ANGLE_texture_usage = has_ext(\"GL_ANGLE_texture_usage\");\n\tGLAD_ANGLE_translated_shader_source = has_ext(\"GL_ANGLE_translated_shader_source\");\n\tGLAD_APPLE_aux_depth_stencil = has_ext(\"GL_APPLE_aux_depth_stencil\");\n\tGLAD_APPLE_client_storage = has_ext(\"GL_APPLE_client_storage\");\n\tGLAD_APPLE_clip_distance = has_ext(\"GL_APPLE_clip_distance\");\n\tGLAD_APPLE_color_buffer_packed_float = has_ext(\"GL_APPLE_color_buffer_packed_float\");\n\tGLAD_APPLE_copy_texture_levels = has_ext(\"GL_APPLE_copy_texture_levels\");\n\tGLAD_APPLE_element_array = has_ext(\"GL_APPLE_element_array\");\n\tGLAD_APPLE_fence = has_ext(\"GL_APPLE_fence\");\n\tGLAD_APPLE_float_pixels = has_ext(\"GL_APPLE_float_pixels\");\n\tGLAD_APPLE_flush_buffer_range = has_ext(\"GL_APPLE_flush_buffer_range\");\n\tGLAD_APPLE_framebuffer_multisample = has_ext(\"GL_APPLE_framebuffer_multisample\");\n\tGLAD_APPLE_object_purgeable = has_ext(\"GL_APPLE_object_purgeable\");\n\tGLAD_APPLE_rgb_422 = has_ext(\"GL_APPLE_rgb_422\");\n\tGLAD_APPLE_row_bytes = has_ext(\"GL_APPLE_row_bytes\");\n\tGLAD_APPLE_sync = has_ext(\"GL_APPLE_sync\");\n\tGLAD_APPLE_texture_format_BGRA8888 = has_ext(\"GL_APPLE_texture_format_BGRA8888\");\n\tGLAD_APPLE_texture_max_level = has_ext(\"GL_APPLE_texture_max_level\");\n\tGLAD_APPLE_texture_packed_float = has_ext(\"GL_APPLE_texture_packed_float\");\n\tGLAD_APPLE_texture_range = has_ext(\"GL_APPLE_texture_range\");\n\tGLAD_APPLE_vertex_array_object = has_ext(\"GL_APPLE_vertex_array_object\");\n\tGLAD_APPLE_vertex_array_range = has_ext(\"GL_APPLE_vertex_array_range\");\n\tGLAD_APPLE_vertex_program_evaluators = has_ext(\"GL_APPLE_vertex_program_evaluators\");\n\tGLAD_APPLE_ycbcr_422 = has_ext(\"GL_APPLE_ycbcr_422\");\n\tGLAD_ARM_mali_program_binary = has_ext(\"GL_ARM_mali_program_binary\");\n\tGLAD_ARM_mali_shader_binary = has_ext(\"GL_ARM_mali_shader_binary\");\n\tGLAD_ARM_rgba8 = has_ext(\"GL_ARM_rgba8\");\n\tGLAD_ARM_shader_framebuffer_fetch = has_ext(\"GL_ARM_shader_framebuffer_fetch\");\n\tGLAD_ARM_shader_framebuffer_fetch_depth_stencil = has_ext(\"GL_ARM_shader_framebuffer_fetch_depth_stencil\");\n\tGLAD_ATI_meminfo = has_ext(\"GL_ATI_meminfo\");\n\tGLAD_ATI_pixel_format_float = has_ext(\"GL_ATI_pixel_format_float\");\n\tGLAD_DMP_program_binary = has_ext(\"GL_DMP_program_binary\");\n\tGLAD_DMP_shader_binary = has_ext(\"GL_DMP_shader_binary\");\n\tGLAD_FJ_shader_binary_GCCSO = has_ext(\"GL_FJ_shader_binary_GCCSO\");\n\tGLAD_GREMEDY_frame_terminator = has_ext(\"GL_GREMEDY_frame_terminator\");\n\tGLAD_GREMEDY_string_marker = has_ext(\"GL_GREMEDY_string_marker\");\n\tGLAD_IMG_multisampled_render_to_texture = has_ext(\"GL_IMG_multisampled_render_to_texture\");\n\tGLAD_IMG_program_binary = has_ext(\"GL_IMG_program_binary\");\n\tGLAD_IMG_read_format = has_ext(\"GL_IMG_read_format\");\n\tGLAD_IMG_shader_binary = has_ext(\"GL_IMG_shader_binary\");\n\tGLAD_IMG_texture_compression_pvrtc = has_ext(\"GL_IMG_texture_compression_pvrtc\");\n\tGLAD_IMG_texture_compression_pvrtc2 = has_ext(\"GL_IMG_texture_compression_pvrtc2\");\n\tGLAD_IMG_texture_filter_cubic = has_ext(\"GL_IMG_texture_filter_cubic\");\n\tGLAD_INGR_blend_func_separate = has_ext(\"GL_INGR_blend_func_separate\");\n\tGLAD_INTEL_fragment_shader_ordering = has_ext(\"GL_INTEL_fragment_shader_ordering\");\n\tGLAD_INTEL_framebuffer_CMAA = has_ext(\"GL_INTEL_framebuffer_CMAA\");\n\tGLAD_INTEL_map_texture = has_ext(\"GL_INTEL_map_texture\");\n\tGLAD_INTEL_performance_query = has_ext(\"GL_INTEL_performance_query\");\n\tGLAD_MESA_pack_invert = has_ext(\"GL_MESA_pack_invert\");\n\tGLAD_MESA_ycbcr_texture = has_ext(\"GL_MESA_ycbcr_texture\");\n\tGLAD_MESAX_texture_stack = has_ext(\"GL_MESAX_texture_stack\");\n\tGLAD_NV_bindless_multi_draw_indirect = has_ext(\"GL_NV_bindless_multi_draw_indirect\");\n\tGLAD_NV_bindless_multi_draw_indirect_count = has_ext(\"GL_NV_bindless_multi_draw_indirect_count\");\n\tGLAD_NV_bindless_texture = has_ext(\"GL_NV_bindless_texture\");\n\tGLAD_NV_blend_equation_advanced = has_ext(\"GL_NV_blend_equation_advanced\");\n\tGLAD_NV_blend_equation_advanced_coherent = has_ext(\"GL_NV_blend_equation_advanced_coherent\");\n\tGLAD_NV_command_list = has_ext(\"GL_NV_command_list\");\n\tGLAD_NV_compute_program5 = has_ext(\"GL_NV_compute_program5\");\n\tGLAD_NV_conditional_render = has_ext(\"GL_NV_conditional_render\");\n\tGLAD_NV_conservative_raster = has_ext(\"GL_NV_conservative_raster\");\n\tGLAD_NV_conservative_raster_dilate = has_ext(\"GL_NV_conservative_raster_dilate\");\n\tGLAD_NV_copy_buffer = has_ext(\"GL_NV_copy_buffer\");\n\tGLAD_NV_copy_image = has_ext(\"GL_NV_copy_image\");\n\tGLAD_NV_coverage_sample = has_ext(\"GL_NV_coverage_sample\");\n\tGLAD_NV_deep_texture3D = has_ext(\"GL_NV_deep_texture3D\");\n\tGLAD_NV_depth_buffer_float = has_ext(\"GL_NV_depth_buffer_float\");\n\tGLAD_NV_depth_clamp = has_ext(\"GL_NV_depth_clamp\");\n\tGLAD_NV_depth_nonlinear = has_ext(\"GL_NV_depth_nonlinear\");\n\tGLAD_NV_draw_buffers = has_ext(\"GL_NV_draw_buffers\");\n\tGLAD_NV_draw_instanced = has_ext(\"GL_NV_draw_instanced\");\n\tGLAD_NV_draw_texture = has_ext(\"GL_NV_draw_texture\");\n\tGLAD_NV_explicit_attrib_location = has_ext(\"GL_NV_explicit_attrib_location\");\n\tGLAD_NV_explicit_multisample = has_ext(\"GL_NV_explicit_multisample\");\n\tGLAD_NV_fbo_color_attachments = has_ext(\"GL_NV_fbo_color_attachments\");\n\tGLAD_NV_fence = has_ext(\"GL_NV_fence\");\n\tGLAD_NV_fill_rectangle = has_ext(\"GL_NV_fill_rectangle\");\n\tGLAD_NV_float_buffer = has_ext(\"GL_NV_float_buffer\");\n\tGLAD_NV_fragment_coverage_to_color = has_ext(\"GL_NV_fragment_coverage_to_color\");\n\tGLAD_NV_fragment_program4 = has_ext(\"GL_NV_fragment_program4\");\n\tGLAD_NV_fragment_shader_interlock = has_ext(\"GL_NV_fragment_shader_interlock\");\n\tGLAD_NV_framebuffer_blit = has_ext(\"GL_NV_framebuffer_blit\");\n\tGLAD_NV_framebuffer_mixed_samples = has_ext(\"GL_NV_framebuffer_mixed_samples\");\n\tGLAD_NV_framebuffer_multisample = has_ext(\"GL_NV_framebuffer_multisample\");\n\tGLAD_NV_framebuffer_multisample_coverage = has_ext(\"GL_NV_framebuffer_multisample_coverage\");\n\tGLAD_NV_generate_mipmap_sRGB = has_ext(\"GL_NV_generate_mipmap_sRGB\");\n\tGLAD_NV_geometry_program4 = has_ext(\"GL_NV_geometry_program4\");\n\tGLAD_NV_geometry_shader4 = has_ext(\"GL_NV_geometry_shader4\");\n\tGLAD_NV_geometry_shader_passthrough = has_ext(\"GL_NV_geometry_shader_passthrough\");\n\tGLAD_NV_gpu_program4 = has_ext(\"GL_NV_gpu_program4\");\n\tGLAD_NV_gpu_program5 = has_ext(\"GL_NV_gpu_program5\");\n\tGLAD_NV_gpu_program5_mem_extended = has_ext(\"GL_NV_gpu_program5_mem_extended\");\n\tGLAD_NV_gpu_shader5 = has_ext(\"GL_NV_gpu_shader5\");\n\tGLAD_NV_half_float = has_ext(\"GL_NV_half_float\");\n\tGLAD_NV_image_formats = has_ext(\"GL_NV_image_formats\");\n\tGLAD_NV_instanced_arrays = has_ext(\"GL_NV_instanced_arrays\");\n\tGLAD_NV_internalformat_sample_query = has_ext(\"GL_NV_internalformat_sample_query\");\n\tGLAD_NV_multisample_coverage = has_ext(\"GL_NV_multisample_coverage\");\n\tGLAD_NV_non_square_matrices = has_ext(\"GL_NV_non_square_matrices\");\n\tGLAD_NV_occlusion_query = has_ext(\"GL_NV_occlusion_query\");\n\tGLAD_NV_parameter_buffer_object = has_ext(\"GL_NV_parameter_buffer_object\");\n\tGLAD_NV_parameter_buffer_object2 = has_ext(\"GL_NV_parameter_buffer_object2\");\n\tGLAD_NV_path_rendering = has_ext(\"GL_NV_path_rendering\");\n\tGLAD_NV_path_rendering_shared_edge = has_ext(\"GL_NV_path_rendering_shared_edge\");\n\tGLAD_NV_polygon_mode = has_ext(\"GL_NV_polygon_mode\");\n\tGLAD_NV_present_video = has_ext(\"GL_NV_present_video\");\n\tGLAD_NV_primitive_restart = has_ext(\"GL_NV_primitive_restart\");\n\tGLAD_NV_read_buffer = has_ext(\"GL_NV_read_buffer\");\n\tGLAD_NV_read_buffer_front = has_ext(\"GL_NV_read_buffer_front\");\n\tGLAD_NV_read_depth = has_ext(\"GL_NV_read_depth\");\n\tGLAD_NV_read_depth_stencil = has_ext(\"GL_NV_read_depth_stencil\");\n\tGLAD_NV_read_stencil = has_ext(\"GL_NV_read_stencil\");\n\tGLAD_NV_sample_locations = has_ext(\"GL_NV_sample_locations\");\n\tGLAD_NV_sample_mask_override_coverage = has_ext(\"GL_NV_sample_mask_override_coverage\");\n\tGLAD_NV_shader_atomic_counters = has_ext(\"GL_NV_shader_atomic_counters\");\n\tGLAD_NV_shader_atomic_float = has_ext(\"GL_NV_shader_atomic_float\");\n\tGLAD_NV_shader_atomic_fp16_vector = has_ext(\"GL_NV_shader_atomic_fp16_vector\");\n\tGLAD_NV_shader_atomic_int64 = has_ext(\"GL_NV_shader_atomic_int64\");\n\tGLAD_NV_shader_buffer_load = has_ext(\"GL_NV_shader_buffer_load\");\n\tGLAD_NV_shader_buffer_store = has_ext(\"GL_NV_shader_buffer_store\");\n\tGLAD_NV_shader_noperspective_interpolation = has_ext(\"GL_NV_shader_noperspective_interpolation\");\n\tGLAD_NV_shader_storage_buffer_object = has_ext(\"GL_NV_shader_storage_buffer_object\");\n\tGLAD_NV_shader_thread_group = has_ext(\"GL_NV_shader_thread_group\");\n\tGLAD_NV_shader_thread_shuffle = has_ext(\"GL_NV_shader_thread_shuffle\");\n\tGLAD_NV_shadow_samplers_array = has_ext(\"GL_NV_shadow_samplers_array\");\n\tGLAD_NV_shadow_samplers_cube = has_ext(\"GL_NV_shadow_samplers_cube\");\n\tGLAD_NV_sRGB_formats = has_ext(\"GL_NV_sRGB_formats\");\n\tGLAD_NV_tessellation_program5 = has_ext(\"GL_NV_tessellation_program5\");\n\tGLAD_NV_texture_barrier = has_ext(\"GL_NV_texture_barrier\");\n\tGLAD_NV_texture_border_clamp = has_ext(\"GL_NV_texture_border_clamp\");\n\tGLAD_NV_texture_compression_s3tc_update = has_ext(\"GL_NV_texture_compression_s3tc_update\");\n\tGLAD_NV_texture_multisample = has_ext(\"GL_NV_texture_multisample\");\n\tGLAD_NV_texture_npot_2D_mipmap = has_ext(\"GL_NV_texture_npot_2D_mipmap\");\n\tGLAD_NV_transform_feedback = has_ext(\"GL_NV_transform_feedback\");\n\tGLAD_NV_transform_feedback2 = has_ext(\"GL_NV_transform_feedback2\");\n\tGLAD_NV_uniform_buffer_unified_memory = has_ext(\"GL_NV_uniform_buffer_unified_memory\");\n\tGLAD_NV_vdpau_interop = has_ext(\"GL_NV_vdpau_interop\");\n\tGLAD_NV_vertex_attrib_integer_64bit = has_ext(\"GL_NV_vertex_attrib_integer_64bit\");\n\tGLAD_NV_vertex_buffer_unified_memory = has_ext(\"GL_NV_vertex_buffer_unified_memory\");\n\tGLAD_NV_vertex_program4 = has_ext(\"GL_NV_vertex_program4\");\n\tGLAD_NV_video_capture = has_ext(\"GL_NV_video_capture\");\n\tGLAD_NV_viewport_array = has_ext(\"GL_NV_viewport_array\");\n\tGLAD_NV_viewport_array2 = has_ext(\"GL_NV_viewport_array2\");\n\tGLAD_NVX_conditional_render = has_ext(\"GL_NVX_conditional_render\");\n\tGLAD_NVX_gpu_memory_info = has_ext(\"GL_NVX_gpu_memory_info\");\n\tGLAD_OVR_multiview = has_ext(\"GL_OVR_multiview\");\n\tGLAD_OVR_multiview2 = has_ext(\"GL_OVR_multiview2\");\n\tGLAD_OVR_multiview_multisampled_render_to_texture = has_ext(\"GL_OVR_multiview_multisampled_render_to_texture\");\n\tGLAD_QCOM_alpha_test = has_ext(\"GL_QCOM_alpha_test\");\n\tGLAD_QCOM_binning_control = has_ext(\"GL_QCOM_binning_control\");\n\tGLAD_QCOM_driver_control = has_ext(\"GL_QCOM_driver_control\");\n\tGLAD_QCOM_extended_get = has_ext(\"GL_QCOM_extended_get\");\n\tGLAD_QCOM_extended_get2 = has_ext(\"GL_QCOM_extended_get2\");\n\tGLAD_QCOM_perfmon_global_mode = has_ext(\"GL_QCOM_perfmon_global_mode\");\n\tGLAD_QCOM_tiled_rendering = has_ext(\"GL_QCOM_tiled_rendering\");\n\tGLAD_QCOM_writeonly_rendering = has_ext(\"GL_QCOM_writeonly_rendering\");\n\tGLAD_VIV_shader_binary = has_ext(\"GL_VIV_shader_binary\");\n}\n\nstatic void find_core(void) {\n\tconst char *v = (const char *)fp_glGetString(GL_VERSION);\n\tint major = v[0] - '0', minor = v[2] - '0', gles = false;\n\tGLVersion.gles = false;\n\tif (strstr(v, \"OpenGL ES \") == v) {\n\t\tmajor = v[10] - '0'; minor = v[12] - '0'; gles = true;\n\t}\n\tGLVersion.major = major; GLVersion.minor = minor; GLVersion.gles = gles;\n\tGLAD_VERSION_1_0 = gles == 0 && ((major == 1 && minor >= 0) || major > 1);\n\tGLAD_VERSION_1_1 = gles == 0 && ((major == 1 && minor >= 1) || major > 1);\n\tGLAD_VERSION_1_2 = gles == 0 && ((major == 1 && minor >= 2) || major > 1);\n\tGLAD_VERSION_1_3 = gles == 0 && ((major == 1 && minor >= 3) || major > 1);\n\tGLAD_VERSION_1_4 = gles == 0 && ((major == 1 && minor >= 4) || major > 1);\n\tGLAD_VERSION_1_5 = gles == 0 && ((major == 1 && minor >= 5) || major > 1);\n\tGLAD_VERSION_2_0 = gles == 0 && ((major == 2 && minor >= 0) || major > 2);\n\tGLAD_VERSION_2_1 = gles == 0 && ((major == 2 && minor >= 1) || major > 2);\n\tGLAD_VERSION_3_0 = gles == 0 && ((major == 3 && minor >= 0) || major > 3);\n\tGLAD_VERSION_3_1 = gles == 0 && ((major == 3 && minor >= 1) || major > 3);\n\tGLAD_VERSION_3_2 = gles == 0 && ((major == 3 && minor >= 2) || major > 3);\n\tGLAD_VERSION_3_3 = gles == 0 && ((major == 3 && minor >= 3) || major > 3);\n\tGLAD_VERSION_4_0 = gles == 0 && ((major == 4 && minor >= 0) || major > 4);\n\tGLAD_VERSION_4_1 = gles == 0 && ((major == 4 && minor >= 1) || major > 4);\n\tGLAD_VERSION_4_2 = gles == 0 && ((major == 4 && minor >= 2) || major > 4);\n\tGLAD_VERSION_4_3 = gles == 0 && ((major == 4 && minor >= 3) || major > 4);\n\tGLAD_VERSION_4_4 = gles == 0 && ((major == 4 && minor >= 4) || major > 4);\n\tGLAD_VERSION_4_5 = gles == 0 && ((major == 4 && minor >= 5) || major > 4);\n\tGLAD_ES_VERSION_2_0 = gles == 1 && ((major == 2 && minor >= 0) || major > 2);\n\tGLAD_ES_VERSION_3_0 = gles == 1 && ((major == 3 && minor >= 0) || major > 3);\n\tGLAD_ES_VERSION_3_1 = gles == 1 && ((major == 3 && minor >= 1) || major > 3);\n\tGLAD_ES_VERSION_3_2 = gles == 1 && ((major == 3 && minor >= 2) || major > 3);\n}\n\nbool gladLoadGLLoader(LOADER load) {\n\tGLVersion.major = 0; GLVersion.minor = 0; GLVersion.gles = 0;\n\tfp_glGetString = (pfn_glGetString)load(\"glGetString\");\n\tif(fp_glGetString == NULL) return false;\n\tfind_core();\n\tload_GL_VERSION_1_0(load);\n\tload_GL_VERSION_1_1(load);\n\tload_GL_VERSION_1_2(load);\n\tload_GL_VERSION_1_3(load);\n\tload_GL_VERSION_1_4(load);\n\tload_GL_VERSION_1_5(load);\n\tload_GL_VERSION_2_0(load);\n\tload_GL_VERSION_2_1(load);\n\tload_GL_VERSION_3_0(load);\n\tload_GL_VERSION_3_1(load);\n\tload_GL_VERSION_3_2(load);\n\tload_GL_VERSION_3_3(load);\n\tload_GL_VERSION_4_0(load);\n\tload_GL_VERSION_4_1(load);\n\tload_GL_VERSION_4_2(load);\n\tload_GL_VERSION_4_3(load);\n\tload_GL_VERSION_4_4(load);\n\tload_GL_VERSION_4_5(load);\n\tload_GL_ES_VERSION_2_0(load);\n\tload_GL_ES_VERSION_3_0(load);\n\tload_GL_ES_VERSION_3_1(load);\n\tload_GL_ES_VERSION_3_2(load);\n\n\tfind_extensions();\n\tload_GL_KHR_blend_equation_advanced(load);\n\tload_GL_KHR_debug(load);\n\tload_GL_KHR_robustness(load);\n\tload_GL_ARB_base_instance(load);\n\tload_GL_ARB_bindless_texture(load);\n\tload_GL_ARB_blend_func_extended(load);\n\tload_GL_ARB_buffer_storage(load);\n\tload_GL_ARB_cl_event(load);\n\tload_GL_ARB_clear_buffer_object(load);\n\tload_GL_ARB_clear_texture(load);\n\tload_GL_ARB_clip_control(load);\n\tload_GL_ARB_color_buffer_float(load);\n\tload_GL_ARB_compute_shader(load);\n\tload_GL_ARB_compute_variable_group_size(load);\n\tload_GL_ARB_copy_buffer(load);\n\tload_GL_ARB_copy_image(load);\n\tload_GL_ARB_debug_output(load);\n\tload_GL_ARB_direct_state_access(load);\n\tload_GL_ARB_draw_buffers_blend(load);\n\tload_GL_ARB_draw_elements_base_vertex(load);\n\tload_GL_ARB_draw_indirect(load);\n\tload_GL_ARB_draw_instanced(load);\n\tload_GL_ARB_ES2_compatibility(load);\n\tload_GL_ARB_ES3_1_compatibility(load);\n\tload_GL_ARB_ES3_2_compatibility(load);\n\tload_GL_ARB_framebuffer_no_attachments(load);\n\tload_GL_ARB_framebuffer_object(load);\n\tload_GL_ARB_geometry_shader4(load);\n\tload_GL_ARB_get_program_binary(load);\n\tload_GL_ARB_get_texture_sub_image(load);\n\tload_GL_ARB_gpu_shader_fp64(load);\n\tload_GL_ARB_gpu_shader_int64(load);\n\tload_GL_ARB_indirect_parameters(load);\n\tload_GL_ARB_instanced_arrays(load);\n\tload_GL_ARB_internalformat_query(load);\n\tload_GL_ARB_internalformat_query2(load);\n\tload_GL_ARB_invalidate_subdata(load);\n\tload_GL_ARB_map_buffer_range(load);\n\tload_GL_ARB_multi_bind(load);\n\tload_GL_ARB_multi_draw_indirect(load);\n\tload_GL_ARB_parallel_shader_compile(load);\n\tload_GL_ARB_program_interface_query(load);\n\tload_GL_ARB_provoking_vertex(load);\n\tload_GL_ARB_robustness(load);\n\tload_GL_ARB_sample_locations(load);\n\tload_GL_ARB_sample_shading(load);\n\tload_GL_ARB_sampler_objects(load);\n\tload_GL_ARB_separate_shader_objects(load);\n\tload_GL_ARB_shader_atomic_counters(load);\n\tload_GL_ARB_shader_image_load_store(load);\n\tload_GL_ARB_shader_storage_buffer_object(load);\n\tload_GL_ARB_shader_subroutine(load);\n\tload_GL_ARB_shading_language_include(load);\n\tload_GL_ARB_sparse_buffer(load);\n\tload_GL_ARB_sparse_texture(load);\n\tload_GL_ARB_sync(load);\n\tload_GL_ARB_tessellation_shader(load);\n\tload_GL_ARB_texture_barrier(load);\n\tload_GL_ARB_texture_buffer_object(load);\n\tload_GL_ARB_texture_buffer_range(load);\n\tload_GL_ARB_texture_multisample(load);\n\tload_GL_ARB_texture_storage(load);\n\tload_GL_ARB_texture_storage_multisample(load);\n\tload_GL_ARB_texture_view(load);\n\tload_GL_ARB_timer_query(load);\n\tload_GL_ARB_transform_feedback2(load);\n\tload_GL_ARB_transform_feedback3(load);\n\tload_GL_ARB_transform_feedback_instanced(load);\n\tload_GL_ARB_uniform_buffer_object(load);\n\tload_GL_ARB_vertex_array_object(load);\n\tload_GL_ARB_vertex_attrib_64bit(load);\n\tload_GL_ARB_vertex_attrib_binding(load);\n\tload_GL_ARB_vertex_type_2_10_10_10_rev(load);\n\tload_GL_ARB_viewport_array(load);\n\tload_GL_EXT_base_instance(load);\n\tload_GL_EXT_bindable_uniform(load);\n\tload_GL_EXT_blend_func_extended(load);\n\tload_GL_EXT_blend_minmax(load);\n\tload_GL_EXT_buffer_storage(load);\n\tload_GL_EXT_copy_image(load);\n\tload_GL_EXT_debug_label(load);\n\tload_GL_EXT_debug_marker(load);\n\tload_GL_EXT_direct_state_access(load);\n\tload_GL_EXT_discard_framebuffer(load);\n\tload_GL_EXT_disjoint_timer_query(load);\n\tload_GL_EXT_draw_buffers(load);\n\tload_GL_EXT_draw_buffers2(load);\n\tload_GL_EXT_draw_buffers_indexed(load);\n\tload_GL_EXT_draw_elements_base_vertex(load);\n\tload_GL_EXT_draw_instanced(load);\n\tload_GL_EXT_framebuffer_blit(load);\n\tload_GL_EXT_framebuffer_multisample(load);\n\tload_GL_EXT_framebuffer_object(load);\n\tload_GL_EXT_geometry_shader(load);\n\tload_GL_EXT_geometry_shader4(load);\n\tload_GL_EXT_gpu_program_parameters(load);\n\tload_GL_EXT_gpu_shader4(load);\n\tload_GL_EXT_instanced_arrays(load);\n\tload_GL_EXT_map_buffer_range(load);\n\tload_GL_EXT_multi_draw_indirect(load);\n\tload_GL_EXT_multisampled_render_to_texture(load);\n\tload_GL_EXT_multiview_draw_buffers(load);\n\tload_GL_EXT_occlusion_query_boolean(load);\n\tload_GL_EXT_polygon_offset_clamp(load);\n\tload_GL_EXT_primitive_bounding_box(load);\n\tload_GL_EXT_provoking_vertex(load);\n\tload_GL_EXT_raster_multisample(load);\n\tload_GL_EXT_robustness(load);\n\tload_GL_EXT_separate_shader_objects(load);\n\tload_GL_EXT_shader_image_load_store(load);\n\tload_GL_EXT_sparse_texture(load);\n\tload_GL_EXT_stencil_clear_tag(load);\n\tload_GL_EXT_tessellation_shader(load);\n\tload_GL_EXT_texture_array(load);\n\tload_GL_EXT_texture_border_clamp(load);\n\tload_GL_EXT_texture_buffer(load);\n\tload_GL_EXT_texture_buffer_object(load);\n\tload_GL_EXT_texture_filter_minmax(load);\n\tload_GL_EXT_texture_integer(load);\n\tload_GL_EXT_texture_storage(load);\n\tload_GL_EXT_texture_view(load);\n\tload_GL_EXT_timer_query(load);\n\tload_GL_EXT_transform_feedback(load);\n\tload_GL_EXT_vertex_attrib_64bit(load);\n\tload_GL_EXT_x11_sync_object(load);\n\tload_GL_OES_copy_image(load);\n\tload_GL_OES_draw_buffers_indexed(load);\n\tload_GL_OES_draw_elements_base_vertex(load);\n\tload_GL_OES_EGL_image(load);\n\tload_GL_OES_geometry_shader(load);\n\tload_GL_OES_get_program_binary(load);\n\tload_GL_OES_mapbuffer(load);\n\tload_GL_OES_primitive_bounding_box(load);\n\tload_GL_OES_sample_shading(load);\n\tload_GL_OES_tessellation_shader(load);\n\tload_GL_OES_texture_3D(load);\n\tload_GL_OES_texture_border_clamp(load);\n\tload_GL_OES_texture_buffer(load);\n\tload_GL_OES_texture_storage_multisample_2d_array(load);\n\tload_GL_OES_texture_view(load);\n\tload_GL_OES_vertex_array_object(load);\n\tload_GL_AMD_debug_output(load);\n\tload_GL_AMD_draw_buffers_blend(load);\n\tload_GL_AMD_gpu_shader_int64(load);\n\tload_GL_AMD_interleaved_elements(load);\n\tload_GL_AMD_multi_draw_indirect(load);\n\tload_GL_AMD_name_gen_delete(load);\n\tload_GL_AMD_occlusion_query_event(load);\n\tload_GL_AMD_performance_monitor(load);\n\tload_GL_AMD_sample_positions(load);\n\tload_GL_AMD_sparse_texture(load);\n\tload_GL_AMD_stencil_operation_extended(load);\n\tload_GL_AMD_vertex_shader_tessellator(load);\n\tload_GL_ANGLE_framebuffer_blit(load);\n\tload_GL_ANGLE_framebuffer_multisample(load);\n\tload_GL_ANGLE_instanced_arrays(load);\n\tload_GL_ANGLE_translated_shader_source(load);\n\tload_GL_APPLE_copy_texture_levels(load);\n\tload_GL_APPLE_element_array(load);\n\tload_GL_APPLE_fence(load);\n\tload_GL_APPLE_flush_buffer_range(load);\n\tload_GL_APPLE_framebuffer_multisample(load);\n\tload_GL_APPLE_object_purgeable(load);\n\tload_GL_APPLE_sync(load);\n\tload_GL_APPLE_texture_range(load);\n\tload_GL_APPLE_vertex_array_object(load);\n\tload_GL_APPLE_vertex_array_range(load);\n\tload_GL_APPLE_vertex_program_evaluators(load);\n\tload_GL_GREMEDY_frame_terminator(load);\n\tload_GL_GREMEDY_string_marker(load);\n\tload_GL_IMG_multisampled_render_to_texture(load);\n\tload_GL_INGR_blend_func_separate(load);\n\tload_GL_INTEL_framebuffer_CMAA(load);\n\tload_GL_INTEL_map_texture(load);\n\tload_GL_INTEL_performance_query(load);\n\tload_GL_NV_bindless_multi_draw_indirect(load);\n\tload_GL_NV_bindless_multi_draw_indirect_count(load);\n\tload_GL_NV_bindless_texture(load);\n\tload_GL_NV_blend_equation_advanced(load);\n\tload_GL_NV_command_list(load);\n\tload_GL_NV_conditional_render(load);\n\tload_GL_NV_conservative_raster(load);\n\tload_GL_NV_conservative_raster_dilate(load);\n\tload_GL_NV_copy_buffer(load);\n\tload_GL_NV_copy_image(load);\n\tload_GL_NV_coverage_sample(load);\n\tload_GL_NV_depth_buffer_float(load);\n\tload_GL_NV_draw_buffers(load);\n\tload_GL_NV_draw_instanced(load);\n\tload_GL_NV_draw_texture(load);\n\tload_GL_NV_explicit_multisample(load);\n\tload_GL_NV_fence(load);\n\tload_GL_NV_fragment_coverage_to_color(load);\n\tload_GL_NV_framebuffer_blit(load);\n\tload_GL_NV_framebuffer_mixed_samples(load);\n\tload_GL_NV_framebuffer_multisample(load);\n\tload_GL_NV_framebuffer_multisample_coverage(load);\n\tload_GL_NV_geometry_program4(load);\n\tload_GL_NV_gpu_program4(load);\n\tload_GL_NV_gpu_program5(load);\n\tload_GL_NV_gpu_shader5(load);\n\tload_GL_NV_half_float(load);\n\tload_GL_NV_instanced_arrays(load);\n\tload_GL_NV_internalformat_sample_query(load);\n\tload_GL_NV_non_square_matrices(load);\n\tload_GL_NV_occlusion_query(load);\n\tload_GL_NV_parameter_buffer_object(load);\n\tload_GL_NV_path_rendering(load);\n\tload_GL_NV_polygon_mode(load);\n\tload_GL_NV_present_video(load);\n\tload_GL_NV_primitive_restart(load);\n\tload_GL_NV_read_buffer(load);\n\tload_GL_NV_sample_locations(load);\n\tload_GL_NV_shader_buffer_load(load);\n\tload_GL_NV_texture_barrier(load);\n\tload_GL_NV_texture_multisample(load);\n\tload_GL_NV_transform_feedback(load);\n\tload_GL_NV_transform_feedback2(load);\n\tload_GL_NV_vdpau_interop(load);\n\tload_GL_NV_vertex_attrib_integer_64bit(load);\n\tload_GL_NV_vertex_buffer_unified_memory(load);\n\tload_GL_NV_vertex_program4(load);\n\tload_GL_NV_video_capture(load);\n\tload_GL_NV_viewport_array(load);\n\tload_GL_NVX_conditional_render(load);\n\tload_GL_OVR_multiview(load);\n\tload_GL_OVR_multiview_multisampled_render_to_texture(load);\n\tload_GL_QCOM_alpha_test(load);\n\tload_GL_QCOM_driver_control(load);\n\tload_GL_QCOM_extended_get(load);\n\tload_GL_QCOM_extended_get2(load);\n\tload_GL_QCOM_tiled_rendering(load);\n\treturn true;\n}\n\n} /* namespace glad */\n"
  },
  {
    "path": "src/libraries/glad/glad.hpp",
    "content": "\n/**\n * The MIT License (MIT)\n * \n * Copyright (c) 2013 David Herberth, modified by Sasha Szpakowski\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n **/\n \n\n#ifndef __glad_hpp_\n\n#if defined(__gl_h_) || defined(__glext_h_) || defined(__glcorearb_h_) \\\n    || defined(__gl3_h) || defined(__gl3_ext_h)\n#error OpenGL header already included, remove this include, glad already provides it\n#endif\n\n#define __glad_hpp_\n#define __gl_h_\n\n#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN 1\n#endif\n\n#include <windows.h>\n\n#ifdef near\n#undef near\n#endif\n\n#ifdef far\n#undef far\n#endif\n\n#endif\n\n#ifndef APIENTRY\n#define APIENTRY\n#endif\n#ifndef APIENTRYP\n#define APIENTRYP APIENTRY *\n#endif\n#ifndef GLAPI\n#define GLAPI extern\n#endif\n\n#include <stddef.h>\n\n#ifndef GLEXT_64_TYPES_DEFINED\n/* This code block is duplicated in glxext.h, so must be protected */\n#define GLEXT_64_TYPES_DEFINED\n/* Define int32_t, int64_t, and uint64_t types for UST/MSC */\n/* (as used in the GL_EXT_timer_query extension). */\n#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L\n#include <inttypes.h>\n#elif defined(__sun__) || defined(__digital__)\n#include <inttypes.h>\n#if defined(__STDC__)\n#if defined(__arch64__) || defined(_LP64)\ntypedef long int int64_t;\ntypedef unsigned long int uint64_t;\n#else\ntypedef long long int int64_t;\ntypedef unsigned long long int uint64_t;\n#endif /* __arch64__ */\n#endif /* __STDC__ */\n#elif defined( __VMS ) || defined(__sgi)\n#include <inttypes.h>\n#elif defined(__SCO__) || defined(__USLC__)\n#include <stdint.h>\n#elif defined(__UNIXOS2__) || defined(__SOL64__)\ntypedef long int int32_t;\ntypedef long long int int64_t;\ntypedef unsigned long long int uint64_t;\n#elif defined(_WIN32) && defined(__GNUC__)\n#include <stdint.h>\n#elif defined(_WIN32)\ntypedef __int32 int32_t;\ntypedef __int64 int64_t;\ntypedef unsigned __int64 uint64_t;\n#else\n/* Fallback if nothing above works */\n#include <inttypes.h>\n#endif\n#endif\n\nnamespace glad {\n\nbool gladLoadGL(void);\n\ntypedef void* (* LOADER)(const char *name);\nbool gladLoadGLLoader(LOADER);\n\ntypedef unsigned int GLenum;\ntypedef unsigned char GLboolean;\ntypedef unsigned int GLbitfield;\ntypedef void GLvoid;\ntypedef signed char GLbyte;\ntypedef short GLshort;\ntypedef int GLint;\ntypedef int GLclampx;\ntypedef unsigned char GLubyte;\ntypedef unsigned short GLushort;\ntypedef unsigned int GLuint;\ntypedef int GLsizei;\ntypedef float GLfloat;\ntypedef float GLclampf;\ntypedef double GLdouble;\ntypedef double GLclampd;\ntypedef void *GLeglImageOES;\ntypedef char GLchar;\ntypedef char GLcharARB;\n#ifdef __APPLE__\ntypedef void *GLhandleARB;\n#else\ntypedef unsigned int GLhandleARB;\n#endif\ntypedef unsigned short GLhalfARB;\ntypedef unsigned short GLhalf;\ntypedef GLint GLfixed;\ntypedef ptrdiff_t GLintptr;\ntypedef ptrdiff_t GLsizeiptr;\ntypedef int64_t GLint64;\ntypedef uint64_t GLuint64;\ntypedef ptrdiff_t GLintptrARB;\ntypedef ptrdiff_t GLsizeiptrARB;\ntypedef int64_t GLint64EXT;\ntypedef uint64_t GLuint64EXT;\ntypedef struct __GLsync *GLsync;\nstruct _cl_context;\nstruct _cl_event;\ntypedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);\ntypedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);\ntypedef void (APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);\ntypedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam);\ntypedef unsigned short GLhalfNV;\ntypedef GLintptr GLvdpauSurfaceNV;\n\n /* GL_VERSION_1_0 */\nextern GLboolean GLAD_VERSION_1_0;\ntypedef void (APIENTRYP pfn_glCullFace) (GLenum);\nextern pfn_glCullFace fp_glCullFace;\ntypedef void (APIENTRYP pfn_glFrontFace) (GLenum);\nextern pfn_glFrontFace fp_glFrontFace;\ntypedef void (APIENTRYP pfn_glHint) (GLenum, GLenum);\nextern pfn_glHint fp_glHint;\ntypedef void (APIENTRYP pfn_glLineWidth) (GLfloat);\nextern pfn_glLineWidth fp_glLineWidth;\ntypedef void (APIENTRYP pfn_glPointSize) (GLfloat);\nextern pfn_glPointSize fp_glPointSize;\ntypedef void (APIENTRYP pfn_glPolygonMode) (GLenum, GLenum);\nextern pfn_glPolygonMode fp_glPolygonMode;\ntypedef void (APIENTRYP pfn_glScissor) (GLint, GLint, GLsizei, GLsizei);\nextern pfn_glScissor fp_glScissor;\ntypedef void (APIENTRYP pfn_glTexParameterf) (GLenum, GLenum, GLfloat);\nextern pfn_glTexParameterf fp_glTexParameterf;\ntypedef void (APIENTRYP pfn_glTexParameterfv) (GLenum, GLenum, const GLfloat*);\nextern pfn_glTexParameterfv fp_glTexParameterfv;\ntypedef void (APIENTRYP pfn_glTexParameteri) (GLenum, GLenum, GLint);\nextern pfn_glTexParameteri fp_glTexParameteri;\ntypedef void (APIENTRYP pfn_glTexParameteriv) (GLenum, GLenum, const GLint*);\nextern pfn_glTexParameteriv fp_glTexParameteriv;\ntypedef void (APIENTRYP pfn_glTexImage1D) (GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, const void*);\nextern pfn_glTexImage1D fp_glTexImage1D;\ntypedef void (APIENTRYP pfn_glTexImage2D) (GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const void*);\nextern pfn_glTexImage2D fp_glTexImage2D;\ntypedef void (APIENTRYP pfn_glDrawBuffer) (GLenum);\nextern pfn_glDrawBuffer fp_glDrawBuffer;\ntypedef void (APIENTRYP pfn_glClear) (GLbitfield);\nextern pfn_glClear fp_glClear;\ntypedef void (APIENTRYP pfn_glClearColor) (GLfloat, GLfloat, GLfloat, GLfloat);\nextern pfn_glClearColor fp_glClearColor;\ntypedef void (APIENTRYP pfn_glClearStencil) (GLint);\nextern pfn_glClearStencil fp_glClearStencil;\ntypedef void (APIENTRYP pfn_glClearDepth) (GLdouble);\nextern pfn_glClearDepth fp_glClearDepth;\ntypedef void (APIENTRYP pfn_glStencilMask) (GLuint);\nextern pfn_glStencilMask fp_glStencilMask;\ntypedef void (APIENTRYP pfn_glColorMask) (GLboolean, GLboolean, GLboolean, GLboolean);\nextern pfn_glColorMask fp_glColorMask;\ntypedef void (APIENTRYP pfn_glDepthMask) (GLboolean);\nextern pfn_glDepthMask fp_glDepthMask;\ntypedef void (APIENTRYP pfn_glDisable) (GLenum);\nextern pfn_glDisable fp_glDisable;\ntypedef void (APIENTRYP pfn_glEnable) (GLenum);\nextern pfn_glEnable fp_glEnable;\ntypedef void (APIENTRYP pfn_glFinish) ();\nextern pfn_glFinish fp_glFinish;\ntypedef void (APIENTRYP pfn_glFlush) ();\nextern pfn_glFlush fp_glFlush;\ntypedef void (APIENTRYP pfn_glBlendFunc) (GLenum, GLenum);\nextern pfn_glBlendFunc fp_glBlendFunc;\ntypedef void (APIENTRYP pfn_glLogicOp) (GLenum);\nextern pfn_glLogicOp fp_glLogicOp;\ntypedef void (APIENTRYP pfn_glStencilFunc) (GLenum, GLint, GLuint);\nextern pfn_glStencilFunc fp_glStencilFunc;\ntypedef void (APIENTRYP pfn_glStencilOp) (GLenum, GLenum, GLenum);\nextern pfn_glStencilOp fp_glStencilOp;\ntypedef void (APIENTRYP pfn_glDepthFunc) (GLenum);\nextern pfn_glDepthFunc fp_glDepthFunc;\ntypedef void (APIENTRYP pfn_glPixelStoref) (GLenum, GLfloat);\nextern pfn_glPixelStoref fp_glPixelStoref;\ntypedef void (APIENTRYP pfn_glPixelStorei) (GLenum, GLint);\nextern pfn_glPixelStorei fp_glPixelStorei;\ntypedef void (APIENTRYP pfn_glReadBuffer) (GLenum);\nextern pfn_glReadBuffer fp_glReadBuffer;\ntypedef void (APIENTRYP pfn_glReadPixels) (GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, void*);\nextern pfn_glReadPixels fp_glReadPixels;\ntypedef void (APIENTRYP pfn_glGetBooleanv) (GLenum, GLboolean*);\nextern pfn_glGetBooleanv fp_glGetBooleanv;\ntypedef void (APIENTRYP pfn_glGetDoublev) (GLenum, GLdouble*);\nextern pfn_glGetDoublev fp_glGetDoublev;\ntypedef GLenum (APIENTRYP pfn_glGetError) ();\nextern pfn_glGetError fp_glGetError;\ntypedef void (APIENTRYP pfn_glGetFloatv) (GLenum, GLfloat*);\nextern pfn_glGetFloatv fp_glGetFloatv;\ntypedef void (APIENTRYP pfn_glGetIntegerv) (GLenum, GLint*);\nextern pfn_glGetIntegerv fp_glGetIntegerv;\ntypedef const GLubyte* (APIENTRYP pfn_glGetString) (GLenum);\nextern pfn_glGetString fp_glGetString;\ntypedef void (APIENTRYP pfn_glGetTexImage) (GLenum, GLint, GLenum, GLenum, void*);\nextern pfn_glGetTexImage fp_glGetTexImage;\ntypedef void (APIENTRYP pfn_glGetTexParameterfv) (GLenum, GLenum, GLfloat*);\nextern pfn_glGetTexParameterfv fp_glGetTexParameterfv;\ntypedef void (APIENTRYP pfn_glGetTexParameteriv) (GLenum, GLenum, GLint*);\nextern pfn_glGetTexParameteriv fp_glGetTexParameteriv;\ntypedef void (APIENTRYP pfn_glGetTexLevelParameterfv) (GLenum, GLint, GLenum, GLfloat*);\nextern pfn_glGetTexLevelParameterfv fp_glGetTexLevelParameterfv;\ntypedef void (APIENTRYP pfn_glGetTexLevelParameteriv) (GLenum, GLint, GLenum, GLint*);\nextern pfn_glGetTexLevelParameteriv fp_glGetTexLevelParameteriv;\ntypedef GLboolean (APIENTRYP pfn_glIsEnabled) (GLenum);\nextern pfn_glIsEnabled fp_glIsEnabled;\ntypedef void (APIENTRYP pfn_glDepthRange) (GLdouble, GLdouble);\nextern pfn_glDepthRange fp_glDepthRange;\ntypedef void (APIENTRYP pfn_glViewport) (GLint, GLint, GLsizei, GLsizei);\nextern pfn_glViewport fp_glViewport;\ntypedef void (APIENTRYP pfn_glNewList) (GLuint, GLenum);\nextern pfn_glNewList fp_glNewList;\ntypedef void (APIENTRYP pfn_glEndList) ();\nextern pfn_glEndList fp_glEndList;\ntypedef void (APIENTRYP pfn_glCallList) (GLuint);\nextern pfn_glCallList fp_glCallList;\ntypedef void (APIENTRYP pfn_glCallLists) (GLsizei, GLenum, const void*);\nextern pfn_glCallLists fp_glCallLists;\ntypedef void (APIENTRYP pfn_glDeleteLists) (GLuint, GLsizei);\nextern pfn_glDeleteLists fp_glDeleteLists;\ntypedef GLuint (APIENTRYP pfn_glGenLists) (GLsizei);\nextern pfn_glGenLists fp_glGenLists;\ntypedef void (APIENTRYP pfn_glListBase) (GLuint);\nextern pfn_glListBase fp_glListBase;\ntypedef void (APIENTRYP pfn_glBegin) (GLenum);\nextern pfn_glBegin fp_glBegin;\ntypedef void (APIENTRYP pfn_glBitmap) (GLsizei, GLsizei, GLfloat, GLfloat, GLfloat, GLfloat, const GLubyte*);\nextern pfn_glBitmap fp_glBitmap;\ntypedef void (APIENTRYP pfn_glColor3b) (GLbyte, GLbyte, GLbyte);\nextern pfn_glColor3b fp_glColor3b;\ntypedef void (APIENTRYP pfn_glColor3bv) (const GLbyte*);\nextern pfn_glColor3bv fp_glColor3bv;\ntypedef void (APIENTRYP pfn_glColor3d) (GLdouble, GLdouble, GLdouble);\nextern pfn_glColor3d fp_glColor3d;\ntypedef void (APIENTRYP pfn_glColor3dv) (const GLdouble*);\nextern pfn_glColor3dv fp_glColor3dv;\ntypedef void (APIENTRYP pfn_glColor3f) (GLfloat, GLfloat, GLfloat);\nextern pfn_glColor3f fp_glColor3f;\ntypedef void (APIENTRYP pfn_glColor3fv) (const GLfloat*);\nextern pfn_glColor3fv fp_glColor3fv;\ntypedef void (APIENTRYP pfn_glColor3i) (GLint, GLint, GLint);\nextern pfn_glColor3i fp_glColor3i;\ntypedef void (APIENTRYP pfn_glColor3iv) (const GLint*);\nextern pfn_glColor3iv fp_glColor3iv;\ntypedef void (APIENTRYP pfn_glColor3s) (GLshort, GLshort, GLshort);\nextern pfn_glColor3s fp_glColor3s;\ntypedef void (APIENTRYP pfn_glColor3sv) (const GLshort*);\nextern pfn_glColor3sv fp_glColor3sv;\ntypedef void (APIENTRYP pfn_glColor3ub) (GLubyte, GLubyte, GLubyte);\nextern pfn_glColor3ub fp_glColor3ub;\ntypedef void (APIENTRYP pfn_glColor3ubv) (const GLubyte*);\nextern pfn_glColor3ubv fp_glColor3ubv;\ntypedef void (APIENTRYP pfn_glColor3ui) (GLuint, GLuint, GLuint);\nextern pfn_glColor3ui fp_glColor3ui;\ntypedef void (APIENTRYP pfn_glColor3uiv) (const GLuint*);\nextern pfn_glColor3uiv fp_glColor3uiv;\ntypedef void (APIENTRYP pfn_glColor3us) (GLushort, GLushort, GLushort);\nextern pfn_glColor3us fp_glColor3us;\ntypedef void (APIENTRYP pfn_glColor3usv) (const GLushort*);\nextern pfn_glColor3usv fp_glColor3usv;\ntypedef void (APIENTRYP pfn_glColor4b) (GLbyte, GLbyte, GLbyte, GLbyte);\nextern pfn_glColor4b fp_glColor4b;\ntypedef void (APIENTRYP pfn_glColor4bv) (const GLbyte*);\nextern pfn_glColor4bv fp_glColor4bv;\ntypedef void (APIENTRYP pfn_glColor4d) (GLdouble, GLdouble, GLdouble, GLdouble);\nextern pfn_glColor4d fp_glColor4d;\ntypedef void (APIENTRYP pfn_glColor4dv) (const GLdouble*);\nextern pfn_glColor4dv fp_glColor4dv;\ntypedef void (APIENTRYP pfn_glColor4f) (GLfloat, GLfloat, GLfloat, GLfloat);\nextern pfn_glColor4f fp_glColor4f;\ntypedef void (APIENTRYP pfn_glColor4fv) (const GLfloat*);\nextern pfn_glColor4fv fp_glColor4fv;\ntypedef void (APIENTRYP pfn_glColor4i) (GLint, GLint, GLint, GLint);\nextern pfn_glColor4i fp_glColor4i;\ntypedef void (APIENTRYP pfn_glColor4iv) (const GLint*);\nextern pfn_glColor4iv fp_glColor4iv;\ntypedef void (APIENTRYP pfn_glColor4s) (GLshort, GLshort, GLshort, GLshort);\nextern pfn_glColor4s fp_glColor4s;\ntypedef void (APIENTRYP pfn_glColor4sv) (const GLshort*);\nextern pfn_glColor4sv fp_glColor4sv;\ntypedef void (APIENTRYP pfn_glColor4ub) (GLubyte, GLubyte, GLubyte, GLubyte);\nextern pfn_glColor4ub fp_glColor4ub;\ntypedef void (APIENTRYP pfn_glColor4ubv) (const GLubyte*);\nextern pfn_glColor4ubv fp_glColor4ubv;\ntypedef void (APIENTRYP pfn_glColor4ui) (GLuint, GLuint, GLuint, GLuint);\nextern pfn_glColor4ui fp_glColor4ui;\ntypedef void (APIENTRYP pfn_glColor4uiv) (const GLuint*);\nextern pfn_glColor4uiv fp_glColor4uiv;\ntypedef void (APIENTRYP pfn_glColor4us) (GLushort, GLushort, GLushort, GLushort);\nextern pfn_glColor4us fp_glColor4us;\ntypedef void (APIENTRYP pfn_glColor4usv) (const GLushort*);\nextern pfn_glColor4usv fp_glColor4usv;\ntypedef void (APIENTRYP pfn_glEdgeFlag) (GLboolean);\nextern pfn_glEdgeFlag fp_glEdgeFlag;\ntypedef void (APIENTRYP pfn_glEdgeFlagv) (const GLboolean*);\nextern pfn_glEdgeFlagv fp_glEdgeFlagv;\ntypedef void (APIENTRYP pfn_glEnd) ();\nextern pfn_glEnd fp_glEnd;\ntypedef void (APIENTRYP pfn_glIndexd) (GLdouble);\nextern pfn_glIndexd fp_glIndexd;\ntypedef void (APIENTRYP pfn_glIndexdv) (const GLdouble*);\nextern pfn_glIndexdv fp_glIndexdv;\ntypedef void (APIENTRYP pfn_glIndexf) (GLfloat);\nextern pfn_glIndexf fp_glIndexf;\ntypedef void (APIENTRYP pfn_glIndexfv) (const GLfloat*);\nextern pfn_glIndexfv fp_glIndexfv;\ntypedef void (APIENTRYP pfn_glIndexi) (GLint);\nextern pfn_glIndexi fp_glIndexi;\ntypedef void (APIENTRYP pfn_glIndexiv) (const GLint*);\nextern pfn_glIndexiv fp_glIndexiv;\ntypedef void (APIENTRYP pfn_glIndexs) (GLshort);\nextern pfn_glIndexs fp_glIndexs;\ntypedef void (APIENTRYP pfn_glIndexsv) (const GLshort*);\nextern pfn_glIndexsv fp_glIndexsv;\ntypedef void (APIENTRYP pfn_glNormal3b) (GLbyte, GLbyte, GLbyte);\nextern pfn_glNormal3b fp_glNormal3b;\ntypedef void (APIENTRYP pfn_glNormal3bv) (const GLbyte*);\nextern pfn_glNormal3bv fp_glNormal3bv;\ntypedef void (APIENTRYP pfn_glNormal3d) (GLdouble, GLdouble, GLdouble);\nextern pfn_glNormal3d fp_glNormal3d;\ntypedef void (APIENTRYP pfn_glNormal3dv) (const GLdouble*);\nextern pfn_glNormal3dv fp_glNormal3dv;\ntypedef void (APIENTRYP pfn_glNormal3f) (GLfloat, GLfloat, GLfloat);\nextern pfn_glNormal3f fp_glNormal3f;\ntypedef void (APIENTRYP pfn_glNormal3fv) (const GLfloat*);\nextern pfn_glNormal3fv fp_glNormal3fv;\ntypedef void (APIENTRYP pfn_glNormal3i) (GLint, GLint, GLint);\nextern pfn_glNormal3i fp_glNormal3i;\ntypedef void (APIENTRYP pfn_glNormal3iv) (const GLint*);\nextern pfn_glNormal3iv fp_glNormal3iv;\ntypedef void (APIENTRYP pfn_glNormal3s) (GLshort, GLshort, GLshort);\nextern pfn_glNormal3s fp_glNormal3s;\ntypedef void (APIENTRYP pfn_glNormal3sv) (const GLshort*);\nextern pfn_glNormal3sv fp_glNormal3sv;\ntypedef void (APIENTRYP pfn_glRasterPos2d) (GLdouble, GLdouble);\nextern pfn_glRasterPos2d fp_glRasterPos2d;\ntypedef void (APIENTRYP pfn_glRasterPos2dv) (const GLdouble*);\nextern pfn_glRasterPos2dv fp_glRasterPos2dv;\ntypedef void (APIENTRYP pfn_glRasterPos2f) (GLfloat, GLfloat);\nextern pfn_glRasterPos2f fp_glRasterPos2f;\ntypedef void (APIENTRYP pfn_glRasterPos2fv) (const GLfloat*);\nextern pfn_glRasterPos2fv fp_glRasterPos2fv;\ntypedef void (APIENTRYP pfn_glRasterPos2i) (GLint, GLint);\nextern pfn_glRasterPos2i fp_glRasterPos2i;\ntypedef void (APIENTRYP pfn_glRasterPos2iv) (const GLint*);\nextern pfn_glRasterPos2iv fp_glRasterPos2iv;\ntypedef void (APIENTRYP pfn_glRasterPos2s) (GLshort, GLshort);\nextern pfn_glRasterPos2s fp_glRasterPos2s;\ntypedef void (APIENTRYP pfn_glRasterPos2sv) (const GLshort*);\nextern pfn_glRasterPos2sv fp_glRasterPos2sv;\ntypedef void (APIENTRYP pfn_glRasterPos3d) (GLdouble, GLdouble, GLdouble);\nextern pfn_glRasterPos3d fp_glRasterPos3d;\ntypedef void (APIENTRYP pfn_glRasterPos3dv) (const GLdouble*);\nextern pfn_glRasterPos3dv fp_glRasterPos3dv;\ntypedef void (APIENTRYP pfn_glRasterPos3f) (GLfloat, GLfloat, GLfloat);\nextern pfn_glRasterPos3f fp_glRasterPos3f;\ntypedef void (APIENTRYP pfn_glRasterPos3fv) (const GLfloat*);\nextern pfn_glRasterPos3fv fp_glRasterPos3fv;\ntypedef void (APIENTRYP pfn_glRasterPos3i) (GLint, GLint, GLint);\nextern pfn_glRasterPos3i fp_glRasterPos3i;\ntypedef void (APIENTRYP pfn_glRasterPos3iv) (const GLint*);\nextern pfn_glRasterPos3iv fp_glRasterPos3iv;\ntypedef void (APIENTRYP pfn_glRasterPos3s) (GLshort, GLshort, GLshort);\nextern pfn_glRasterPos3s fp_glRasterPos3s;\ntypedef void (APIENTRYP pfn_glRasterPos3sv) (const GLshort*);\nextern pfn_glRasterPos3sv fp_glRasterPos3sv;\ntypedef void (APIENTRYP pfn_glRasterPos4d) (GLdouble, GLdouble, GLdouble, GLdouble);\nextern pfn_glRasterPos4d fp_glRasterPos4d;\ntypedef void (APIENTRYP pfn_glRasterPos4dv) (const GLdouble*);\nextern pfn_glRasterPos4dv fp_glRasterPos4dv;\ntypedef void (APIENTRYP pfn_glRasterPos4f) (GLfloat, GLfloat, GLfloat, GLfloat);\nextern pfn_glRasterPos4f fp_glRasterPos4f;\ntypedef void (APIENTRYP pfn_glRasterPos4fv) (const GLfloat*);\nextern pfn_glRasterPos4fv fp_glRasterPos4fv;\ntypedef void (APIENTRYP pfn_glRasterPos4i) (GLint, GLint, GLint, GLint);\nextern pfn_glRasterPos4i fp_glRasterPos4i;\ntypedef void (APIENTRYP pfn_glRasterPos4iv) (const GLint*);\nextern pfn_glRasterPos4iv fp_glRasterPos4iv;\ntypedef void (APIENTRYP pfn_glRasterPos4s) (GLshort, GLshort, GLshort, GLshort);\nextern pfn_glRasterPos4s fp_glRasterPos4s;\ntypedef void (APIENTRYP pfn_glRasterPos4sv) (const GLshort*);\nextern pfn_glRasterPos4sv fp_glRasterPos4sv;\ntypedef void (APIENTRYP pfn_glRectd) (GLdouble, GLdouble, GLdouble, GLdouble);\nextern pfn_glRectd fp_glRectd;\ntypedef void (APIENTRYP pfn_glRectdv) (const GLdouble*, const GLdouble*);\nextern pfn_glRectdv fp_glRectdv;\ntypedef void (APIENTRYP pfn_glRectf) (GLfloat, GLfloat, GLfloat, GLfloat);\nextern pfn_glRectf fp_glRectf;\ntypedef void (APIENTRYP pfn_glRectfv) (const GLfloat*, const GLfloat*);\nextern pfn_glRectfv fp_glRectfv;\ntypedef void (APIENTRYP pfn_glRecti) (GLint, GLint, GLint, GLint);\nextern pfn_glRecti fp_glRecti;\ntypedef void (APIENTRYP pfn_glRectiv) (const GLint*, const GLint*);\nextern pfn_glRectiv fp_glRectiv;\ntypedef void (APIENTRYP pfn_glRects) (GLshort, GLshort, GLshort, GLshort);\nextern pfn_glRects fp_glRects;\ntypedef void (APIENTRYP pfn_glRectsv) (const GLshort*, const GLshort*);\nextern pfn_glRectsv fp_glRectsv;\ntypedef void (APIENTRYP pfn_glTexCoord1d) (GLdouble);\nextern pfn_glTexCoord1d fp_glTexCoord1d;\ntypedef void (APIENTRYP pfn_glTexCoord1dv) (const GLdouble*);\nextern pfn_glTexCoord1dv fp_glTexCoord1dv;\ntypedef void (APIENTRYP pfn_glTexCoord1f) (GLfloat);\nextern pfn_glTexCoord1f fp_glTexCoord1f;\ntypedef void (APIENTRYP pfn_glTexCoord1fv) (const GLfloat*);\nextern pfn_glTexCoord1fv fp_glTexCoord1fv;\ntypedef void (APIENTRYP pfn_glTexCoord1i) (GLint);\nextern pfn_glTexCoord1i fp_glTexCoord1i;\ntypedef void (APIENTRYP pfn_glTexCoord1iv) (const GLint*);\nextern pfn_glTexCoord1iv fp_glTexCoord1iv;\ntypedef void (APIENTRYP pfn_glTexCoord1s) (GLshort);\nextern pfn_glTexCoord1s fp_glTexCoord1s;\ntypedef void (APIENTRYP pfn_glTexCoord1sv) (const GLshort*);\nextern pfn_glTexCoord1sv fp_glTexCoord1sv;\ntypedef void (APIENTRYP pfn_glTexCoord2d) (GLdouble, GLdouble);\nextern pfn_glTexCoord2d fp_glTexCoord2d;\ntypedef void (APIENTRYP pfn_glTexCoord2dv) (const GLdouble*);\nextern pfn_glTexCoord2dv fp_glTexCoord2dv;\ntypedef void (APIENTRYP pfn_glTexCoord2f) (GLfloat, GLfloat);\nextern pfn_glTexCoord2f fp_glTexCoord2f;\ntypedef void (APIENTRYP pfn_glTexCoord2fv) (const GLfloat*);\nextern pfn_glTexCoord2fv fp_glTexCoord2fv;\ntypedef void (APIENTRYP pfn_glTexCoord2i) (GLint, GLint);\nextern pfn_glTexCoord2i fp_glTexCoord2i;\ntypedef void (APIENTRYP pfn_glTexCoord2iv) (const GLint*);\nextern pfn_glTexCoord2iv fp_glTexCoord2iv;\ntypedef void (APIENTRYP pfn_glTexCoord2s) (GLshort, GLshort);\nextern pfn_glTexCoord2s fp_glTexCoord2s;\ntypedef void (APIENTRYP pfn_glTexCoord2sv) (const GLshort*);\nextern pfn_glTexCoord2sv fp_glTexCoord2sv;\ntypedef void (APIENTRYP pfn_glTexCoord3d) (GLdouble, GLdouble, GLdouble);\nextern pfn_glTexCoord3d fp_glTexCoord3d;\ntypedef void (APIENTRYP pfn_glTexCoord3dv) (const GLdouble*);\nextern pfn_glTexCoord3dv fp_glTexCoord3dv;\ntypedef void (APIENTRYP pfn_glTexCoord3f) (GLfloat, GLfloat, GLfloat);\nextern pfn_glTexCoord3f fp_glTexCoord3f;\ntypedef void (APIENTRYP pfn_glTexCoord3fv) (const GLfloat*);\nextern pfn_glTexCoord3fv fp_glTexCoord3fv;\ntypedef void (APIENTRYP pfn_glTexCoord3i) (GLint, GLint, GLint);\nextern pfn_glTexCoord3i fp_glTexCoord3i;\ntypedef void (APIENTRYP pfn_glTexCoord3iv) (const GLint*);\nextern pfn_glTexCoord3iv fp_glTexCoord3iv;\ntypedef void (APIENTRYP pfn_glTexCoord3s) (GLshort, GLshort, GLshort);\nextern pfn_glTexCoord3s fp_glTexCoord3s;\ntypedef void (APIENTRYP pfn_glTexCoord3sv) (const GLshort*);\nextern pfn_glTexCoord3sv fp_glTexCoord3sv;\ntypedef void (APIENTRYP pfn_glTexCoord4d) (GLdouble, GLdouble, GLdouble, GLdouble);\nextern pfn_glTexCoord4d fp_glTexCoord4d;\ntypedef void (APIENTRYP pfn_glTexCoord4dv) (const GLdouble*);\nextern pfn_glTexCoord4dv fp_glTexCoord4dv;\ntypedef void (APIENTRYP pfn_glTexCoord4f) (GLfloat, GLfloat, GLfloat, GLfloat);\nextern pfn_glTexCoord4f fp_glTexCoord4f;\ntypedef void (APIENTRYP pfn_glTexCoord4fv) (const GLfloat*);\nextern pfn_glTexCoord4fv fp_glTexCoord4fv;\ntypedef void (APIENTRYP pfn_glTexCoord4i) (GLint, GLint, GLint, GLint);\nextern pfn_glTexCoord4i fp_glTexCoord4i;\ntypedef void (APIENTRYP pfn_glTexCoord4iv) (const GLint*);\nextern pfn_glTexCoord4iv fp_glTexCoord4iv;\ntypedef void (APIENTRYP pfn_glTexCoord4s) (GLshort, GLshort, GLshort, GLshort);\nextern pfn_glTexCoord4s fp_glTexCoord4s;\ntypedef void (APIENTRYP pfn_glTexCoord4sv) (const GLshort*);\nextern pfn_glTexCoord4sv fp_glTexCoord4sv;\ntypedef void (APIENTRYP pfn_glVertex2d) (GLdouble, GLdouble);\nextern pfn_glVertex2d fp_glVertex2d;\ntypedef void (APIENTRYP pfn_glVertex2dv) (const GLdouble*);\nextern pfn_glVertex2dv fp_glVertex2dv;\ntypedef void (APIENTRYP pfn_glVertex2f) (GLfloat, GLfloat);\nextern pfn_glVertex2f fp_glVertex2f;\ntypedef void (APIENTRYP pfn_glVertex2fv) (const GLfloat*);\nextern pfn_glVertex2fv fp_glVertex2fv;\ntypedef void (APIENTRYP pfn_glVertex2i) (GLint, GLint);\nextern pfn_glVertex2i fp_glVertex2i;\ntypedef void (APIENTRYP pfn_glVertex2iv) (const GLint*);\nextern pfn_glVertex2iv fp_glVertex2iv;\ntypedef void (APIENTRYP pfn_glVertex2s) (GLshort, GLshort);\nextern pfn_glVertex2s fp_glVertex2s;\ntypedef void (APIENTRYP pfn_glVertex2sv) (const GLshort*);\nextern pfn_glVertex2sv fp_glVertex2sv;\ntypedef void (APIENTRYP pfn_glVertex3d) (GLdouble, GLdouble, GLdouble);\nextern pfn_glVertex3d fp_glVertex3d;\ntypedef void (APIENTRYP pfn_glVertex3dv) (const GLdouble*);\nextern pfn_glVertex3dv fp_glVertex3dv;\ntypedef void (APIENTRYP pfn_glVertex3f) (GLfloat, GLfloat, GLfloat);\nextern pfn_glVertex3f fp_glVertex3f;\ntypedef void (APIENTRYP pfn_glVertex3fv) (const GLfloat*);\nextern pfn_glVertex3fv fp_glVertex3fv;\ntypedef void (APIENTRYP pfn_glVertex3i) (GLint, GLint, GLint);\nextern pfn_glVertex3i fp_glVertex3i;\ntypedef void (APIENTRYP pfn_glVertex3iv) (const GLint*);\nextern pfn_glVertex3iv fp_glVertex3iv;\ntypedef void (APIENTRYP pfn_glVertex3s) (GLshort, GLshort, GLshort);\nextern pfn_glVertex3s fp_glVertex3s;\ntypedef void (APIENTRYP pfn_glVertex3sv) (const GLshort*);\nextern pfn_glVertex3sv fp_glVertex3sv;\ntypedef void (APIENTRYP pfn_glVertex4d) (GLdouble, GLdouble, GLdouble, GLdouble);\nextern pfn_glVertex4d fp_glVertex4d;\ntypedef void (APIENTRYP pfn_glVertex4dv) (const GLdouble*);\nextern pfn_glVertex4dv fp_glVertex4dv;\ntypedef void (APIENTRYP pfn_glVertex4f) (GLfloat, GLfloat, GLfloat, GLfloat);\nextern pfn_glVertex4f fp_glVertex4f;\ntypedef void (APIENTRYP pfn_glVertex4fv) (const GLfloat*);\nextern pfn_glVertex4fv fp_glVertex4fv;\ntypedef void (APIENTRYP pfn_glVertex4i) (GLint, GLint, GLint, GLint);\nextern pfn_glVertex4i fp_glVertex4i;\ntypedef void (APIENTRYP pfn_glVertex4iv) (const GLint*);\nextern pfn_glVertex4iv fp_glVertex4iv;\ntypedef void (APIENTRYP pfn_glVertex4s) (GLshort, GLshort, GLshort, GLshort);\nextern pfn_glVertex4s fp_glVertex4s;\ntypedef void (APIENTRYP pfn_glVertex4sv) (const GLshort*);\nextern pfn_glVertex4sv fp_glVertex4sv;\ntypedef void (APIENTRYP pfn_glClipPlane) (GLenum, const GLdouble*);\nextern pfn_glClipPlane fp_glClipPlane;\ntypedef void (APIENTRYP pfn_glColorMaterial) (GLenum, GLenum);\nextern pfn_glColorMaterial fp_glColorMaterial;\ntypedef void (APIENTRYP pfn_glFogf) (GLenum, GLfloat);\nextern pfn_glFogf fp_glFogf;\ntypedef void (APIENTRYP pfn_glFogfv) (GLenum, const GLfloat*);\nextern pfn_glFogfv fp_glFogfv;\ntypedef void (APIENTRYP pfn_glFogi) (GLenum, GLint);\nextern pfn_glFogi fp_glFogi;\ntypedef void (APIENTRYP pfn_glFogiv) (GLenum, const GLint*);\nextern pfn_glFogiv fp_glFogiv;\ntypedef void (APIENTRYP pfn_glLightf) (GLenum, GLenum, GLfloat);\nextern pfn_glLightf fp_glLightf;\ntypedef void (APIENTRYP pfn_glLightfv) (GLenum, GLenum, const GLfloat*);\nextern pfn_glLightfv fp_glLightfv;\ntypedef void (APIENTRYP pfn_glLighti) (GLenum, GLenum, GLint);\nextern pfn_glLighti fp_glLighti;\ntypedef void (APIENTRYP pfn_glLightiv) (GLenum, GLenum, const GLint*);\nextern pfn_glLightiv fp_glLightiv;\ntypedef void (APIENTRYP pfn_glLightModelf) (GLenum, GLfloat);\nextern pfn_glLightModelf fp_glLightModelf;\ntypedef void (APIENTRYP pfn_glLightModelfv) (GLenum, const GLfloat*);\nextern pfn_glLightModelfv fp_glLightModelfv;\ntypedef void (APIENTRYP pfn_glLightModeli) (GLenum, GLint);\nextern pfn_glLightModeli fp_glLightModeli;\ntypedef void (APIENTRYP pfn_glLightModeliv) (GLenum, const GLint*);\nextern pfn_glLightModeliv fp_glLightModeliv;\ntypedef void (APIENTRYP pfn_glLineStipple) (GLint, GLushort);\nextern pfn_glLineStipple fp_glLineStipple;\ntypedef void (APIENTRYP pfn_glMaterialf) (GLenum, GLenum, GLfloat);\nextern pfn_glMaterialf fp_glMaterialf;\ntypedef void (APIENTRYP pfn_glMaterialfv) (GLenum, GLenum, const GLfloat*);\nextern pfn_glMaterialfv fp_glMaterialfv;\ntypedef void (APIENTRYP pfn_glMateriali) (GLenum, GLenum, GLint);\nextern pfn_glMateriali fp_glMateriali;\ntypedef void (APIENTRYP pfn_glMaterialiv) (GLenum, GLenum, const GLint*);\nextern pfn_glMaterialiv fp_glMaterialiv;\ntypedef void (APIENTRYP pfn_glPolygonStipple) (const GLubyte*);\nextern pfn_glPolygonStipple fp_glPolygonStipple;\ntypedef void (APIENTRYP pfn_glShadeModel) (GLenum);\nextern pfn_glShadeModel fp_glShadeModel;\ntypedef void (APIENTRYP pfn_glTexEnvf) (GLenum, GLenum, GLfloat);\nextern pfn_glTexEnvf fp_glTexEnvf;\ntypedef void (APIENTRYP pfn_glTexEnvfv) (GLenum, GLenum, const GLfloat*);\nextern pfn_glTexEnvfv fp_glTexEnvfv;\ntypedef void (APIENTRYP pfn_glTexEnvi) (GLenum, GLenum, GLint);\nextern pfn_glTexEnvi fp_glTexEnvi;\ntypedef void (APIENTRYP pfn_glTexEnviv) (GLenum, GLenum, const GLint*);\nextern pfn_glTexEnviv fp_glTexEnviv;\ntypedef void (APIENTRYP pfn_glTexGend) (GLenum, GLenum, GLdouble);\nextern pfn_glTexGend fp_glTexGend;\ntypedef void (APIENTRYP pfn_glTexGendv) (GLenum, GLenum, const GLdouble*);\nextern pfn_glTexGendv fp_glTexGendv;\ntypedef void (APIENTRYP pfn_glTexGenf) (GLenum, GLenum, GLfloat);\nextern pfn_glTexGenf fp_glTexGenf;\ntypedef void (APIENTRYP pfn_glTexGenfv) (GLenum, GLenum, const GLfloat*);\nextern pfn_glTexGenfv fp_glTexGenfv;\ntypedef void (APIENTRYP pfn_glTexGeni) (GLenum, GLenum, GLint);\nextern pfn_glTexGeni fp_glTexGeni;\ntypedef void (APIENTRYP pfn_glTexGeniv) (GLenum, GLenum, const GLint*);\nextern pfn_glTexGeniv fp_glTexGeniv;\ntypedef void (APIENTRYP pfn_glFeedbackBuffer) (GLsizei, GLenum, GLfloat*);\nextern pfn_glFeedbackBuffer fp_glFeedbackBuffer;\ntypedef void (APIENTRYP pfn_glSelectBuffer) (GLsizei, GLuint*);\nextern pfn_glSelectBuffer fp_glSelectBuffer;\ntypedef GLint (APIENTRYP pfn_glRenderMode) (GLenum);\nextern pfn_glRenderMode fp_glRenderMode;\ntypedef void (APIENTRYP pfn_glInitNames) ();\nextern pfn_glInitNames fp_glInitNames;\ntypedef void (APIENTRYP pfn_glLoadName) (GLuint);\nextern pfn_glLoadName fp_glLoadName;\ntypedef void (APIENTRYP pfn_glPassThrough) (GLfloat);\nextern pfn_glPassThrough fp_glPassThrough;\ntypedef void (APIENTRYP pfn_glPopName) ();\nextern pfn_glPopName fp_glPopName;\ntypedef void (APIENTRYP pfn_glPushName) (GLuint);\nextern pfn_glPushName fp_glPushName;\ntypedef void (APIENTRYP pfn_glClearAccum) (GLfloat, GLfloat, GLfloat, GLfloat);\nextern pfn_glClearAccum fp_glClearAccum;\ntypedef void (APIENTRYP pfn_glClearIndex) (GLfloat);\nextern pfn_glClearIndex fp_glClearIndex;\ntypedef void (APIENTRYP pfn_glIndexMask) (GLuint);\nextern pfn_glIndexMask fp_glIndexMask;\ntypedef void (APIENTRYP pfn_glAccum) (GLenum, GLfloat);\nextern pfn_glAccum fp_glAccum;\ntypedef void (APIENTRYP pfn_glPopAttrib) ();\nextern pfn_glPopAttrib fp_glPopAttrib;\ntypedef void (APIENTRYP pfn_glPushAttrib) (GLbitfield);\nextern pfn_glPushAttrib fp_glPushAttrib;\ntypedef void (APIENTRYP pfn_glMap1d) (GLenum, GLdouble, GLdouble, GLint, GLint, const GLdouble*);\nextern pfn_glMap1d fp_glMap1d;\ntypedef void (APIENTRYP pfn_glMap1f) (GLenum, GLfloat, GLfloat, GLint, GLint, const GLfloat*);\nextern pfn_glMap1f fp_glMap1f;\ntypedef void (APIENTRYP pfn_glMap2d) (GLenum, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, const GLdouble*);\nextern pfn_glMap2d fp_glMap2d;\ntypedef void (APIENTRYP pfn_glMap2f) (GLenum, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, const GLfloat*);\nextern pfn_glMap2f fp_glMap2f;\ntypedef void (APIENTRYP pfn_glMapGrid1d) (GLint, GLdouble, GLdouble);\nextern pfn_glMapGrid1d fp_glMapGrid1d;\ntypedef void (APIENTRYP pfn_glMapGrid1f) (GLint, GLfloat, GLfloat);\nextern pfn_glMapGrid1f fp_glMapGrid1f;\ntypedef void (APIENTRYP pfn_glMapGrid2d) (GLint, GLdouble, GLdouble, GLint, GLdouble, GLdouble);\nextern pfn_glMapGrid2d fp_glMapGrid2d;\ntypedef void (APIENTRYP pfn_glMapGrid2f) (GLint, GLfloat, GLfloat, GLint, GLfloat, GLfloat);\nextern pfn_glMapGrid2f fp_glMapGrid2f;\ntypedef void (APIENTRYP pfn_glEvalCoord1d) (GLdouble);\nextern pfn_glEvalCoord1d fp_glEvalCoord1d;\ntypedef void (APIENTRYP pfn_glEvalCoord1dv) (const GLdouble*);\nextern pfn_glEvalCoord1dv fp_glEvalCoord1dv;\ntypedef void (APIENTRYP pfn_glEvalCoord1f) (GLfloat);\nextern pfn_glEvalCoord1f fp_glEvalCoord1f;\ntypedef void (APIENTRYP pfn_glEvalCoord1fv) (const GLfloat*);\nextern pfn_glEvalCoord1fv fp_glEvalCoord1fv;\ntypedef void (APIENTRYP pfn_glEvalCoord2d) (GLdouble, GLdouble);\nextern pfn_glEvalCoord2d fp_glEvalCoord2d;\ntypedef void (APIENTRYP pfn_glEvalCoord2dv) (const GLdouble*);\nextern pfn_glEvalCoord2dv fp_glEvalCoord2dv;\ntypedef void (APIENTRYP pfn_glEvalCoord2f) (GLfloat, GLfloat);\nextern pfn_glEvalCoord2f fp_glEvalCoord2f;\ntypedef void (APIENTRYP pfn_glEvalCoord2fv) (const GLfloat*);\nextern pfn_glEvalCoord2fv fp_glEvalCoord2fv;\ntypedef void (APIENTRYP pfn_glEvalMesh1) (GLenum, GLint, GLint);\nextern pfn_glEvalMesh1 fp_glEvalMesh1;\ntypedef void (APIENTRYP pfn_glEvalPoint1) (GLint);\nextern pfn_glEvalPoint1 fp_glEvalPoint1;\ntypedef void (APIENTRYP pfn_glEvalMesh2) (GLenum, GLint, GLint, GLint, GLint);\nextern pfn_glEvalMesh2 fp_glEvalMesh2;\ntypedef void (APIENTRYP pfn_glEvalPoint2) (GLint, GLint);\nextern pfn_glEvalPoint2 fp_glEvalPoint2;\ntypedef void (APIENTRYP pfn_glAlphaFunc) (GLenum, GLfloat);\nextern pfn_glAlphaFunc fp_glAlphaFunc;\ntypedef void (APIENTRYP pfn_glPixelZoom) (GLfloat, GLfloat);\nextern pfn_glPixelZoom fp_glPixelZoom;\ntypedef void (APIENTRYP pfn_glPixelTransferf) (GLenum, GLfloat);\nextern pfn_glPixelTransferf fp_glPixelTransferf;\ntypedef void (APIENTRYP pfn_glPixelTransferi) (GLenum, GLint);\nextern pfn_glPixelTransferi fp_glPixelTransferi;\ntypedef void (APIENTRYP pfn_glPixelMapfv) (GLenum, GLsizei, const GLfloat*);\nextern pfn_glPixelMapfv fp_glPixelMapfv;\ntypedef void (APIENTRYP pfn_glPixelMapuiv) (GLenum, GLsizei, const GLuint*);\nextern pfn_glPixelMapuiv fp_glPixelMapuiv;\ntypedef void (APIENTRYP pfn_glPixelMapusv) (GLenum, GLsizei, const GLushort*);\nextern pfn_glPixelMapusv fp_glPixelMapusv;\ntypedef void (APIENTRYP pfn_glCopyPixels) (GLint, GLint, GLsizei, GLsizei, GLenum);\nextern pfn_glCopyPixels fp_glCopyPixels;\ntypedef void (APIENTRYP pfn_glDrawPixels) (GLsizei, GLsizei, GLenum, GLenum, const void*);\nextern pfn_glDrawPixels fp_glDrawPixels;\ntypedef void (APIENTRYP pfn_glGetClipPlane) (GLenum, GLdouble*);\nextern pfn_glGetClipPlane fp_glGetClipPlane;\ntypedef void (APIENTRYP pfn_glGetLightfv) (GLenum, GLenum, GLfloat*);\nextern pfn_glGetLightfv fp_glGetLightfv;\ntypedef void (APIENTRYP pfn_glGetLightiv) (GLenum, GLenum, GLint*);\nextern pfn_glGetLightiv fp_glGetLightiv;\ntypedef void (APIENTRYP pfn_glGetMapdv) (GLenum, GLenum, GLdouble*);\nextern pfn_glGetMapdv fp_glGetMapdv;\ntypedef void (APIENTRYP pfn_glGetMapfv) (GLenum, GLenum, GLfloat*);\nextern pfn_glGetMapfv fp_glGetMapfv;\ntypedef void (APIENTRYP pfn_glGetMapiv) (GLenum, GLenum, GLint*);\nextern pfn_glGetMapiv fp_glGetMapiv;\ntypedef void (APIENTRYP pfn_glGetMaterialfv) (GLenum, GLenum, GLfloat*);\nextern pfn_glGetMaterialfv fp_glGetMaterialfv;\ntypedef void (APIENTRYP pfn_glGetMaterialiv) (GLenum, GLenum, GLint*);\nextern pfn_glGetMaterialiv fp_glGetMaterialiv;\ntypedef void (APIENTRYP pfn_glGetPixelMapfv) (GLenum, GLfloat*);\nextern pfn_glGetPixelMapfv fp_glGetPixelMapfv;\ntypedef void (APIENTRYP pfn_glGetPixelMapuiv) (GLenum, GLuint*);\nextern pfn_glGetPixelMapuiv fp_glGetPixelMapuiv;\ntypedef void (APIENTRYP pfn_glGetPixelMapusv) (GLenum, GLushort*);\nextern pfn_glGetPixelMapusv fp_glGetPixelMapusv;\ntypedef void (APIENTRYP pfn_glGetPolygonStipple) (GLubyte*);\nextern pfn_glGetPolygonStipple fp_glGetPolygonStipple;\ntypedef void (APIENTRYP pfn_glGetTexEnvfv) (GLenum, GLenum, GLfloat*);\nextern pfn_glGetTexEnvfv fp_glGetTexEnvfv;\ntypedef void (APIENTRYP pfn_glGetTexEnviv) (GLenum, GLenum, GLint*);\nextern pfn_glGetTexEnviv fp_glGetTexEnviv;\ntypedef void (APIENTRYP pfn_glGetTexGendv) (GLenum, GLenum, GLdouble*);\nextern pfn_glGetTexGendv fp_glGetTexGendv;\ntypedef void (APIENTRYP pfn_glGetTexGenfv) (GLenum, GLenum, GLfloat*);\nextern pfn_glGetTexGenfv fp_glGetTexGenfv;\ntypedef void (APIENTRYP pfn_glGetTexGeniv) (GLenum, GLenum, GLint*);\nextern pfn_glGetTexGeniv fp_glGetTexGeniv;\ntypedef GLboolean (APIENTRYP pfn_glIsList) (GLuint);\nextern pfn_glIsList fp_glIsList;\ntypedef void (APIENTRYP pfn_glFrustum) (GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble);\nextern pfn_glFrustum fp_glFrustum;\ntypedef void (APIENTRYP pfn_glLoadIdentity) ();\nextern pfn_glLoadIdentity fp_glLoadIdentity;\ntypedef void (APIENTRYP pfn_glLoadMatrixf) (const GLfloat*);\nextern pfn_glLoadMatrixf fp_glLoadMatrixf;\ntypedef void (APIENTRYP pfn_glLoadMatrixd) (const GLdouble*);\nextern pfn_glLoadMatrixd fp_glLoadMatrixd;\ntypedef void (APIENTRYP pfn_glMatrixMode) (GLenum);\nextern pfn_glMatrixMode fp_glMatrixMode;\ntypedef void (APIENTRYP pfn_glMultMatrixf) (const GLfloat*);\nextern pfn_glMultMatrixf fp_glMultMatrixf;\ntypedef void (APIENTRYP pfn_glMultMatrixd) (const GLdouble*);\nextern pfn_glMultMatrixd fp_glMultMatrixd;\ntypedef void (APIENTRYP pfn_glOrtho) (GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble);\nextern pfn_glOrtho fp_glOrtho;\ntypedef void (APIENTRYP pfn_glPopMatrix) ();\nextern pfn_glPopMatrix fp_glPopMatrix;\ntypedef void (APIENTRYP pfn_glPushMatrix) ();\nextern pfn_glPushMatrix fp_glPushMatrix;\ntypedef void (APIENTRYP pfn_glRotated) (GLdouble, GLdouble, GLdouble, GLdouble);\nextern pfn_glRotated fp_glRotated;\ntypedef void (APIENTRYP pfn_glRotatef) (GLfloat, GLfloat, GLfloat, GLfloat);\nextern pfn_glRotatef fp_glRotatef;\ntypedef void (APIENTRYP pfn_glScaled) (GLdouble, GLdouble, GLdouble);\nextern pfn_glScaled fp_glScaled;\ntypedef void (APIENTRYP pfn_glScalef) (GLfloat, GLfloat, GLfloat);\nextern pfn_glScalef fp_glScalef;\ntypedef void (APIENTRYP pfn_glTranslated) (GLdouble, GLdouble, GLdouble);\nextern pfn_glTranslated fp_glTranslated;\ntypedef void (APIENTRYP pfn_glTranslatef) (GLfloat, GLfloat, GLfloat);\nextern pfn_glTranslatef fp_glTranslatef;\n\n /* GL_VERSION_1_1 */\nextern GLboolean GLAD_VERSION_1_1;\n#define GL_DEPTH_BUFFER_BIT                    0x00000100\n#define GL_STENCIL_BUFFER_BIT                  0x00000400\n#define GL_COLOR_BUFFER_BIT                    0x00004000\n#define GL_FALSE                               0\n#define GL_TRUE                                1\n#define GL_POINTS                              0x0000\n#define GL_LINES                               0x0001\n#define GL_LINE_LOOP                           0x0002\n#define GL_LINE_STRIP                          0x0003\n#define GL_TRIANGLES                           0x0004\n#define GL_TRIANGLE_STRIP                      0x0005\n#define GL_TRIANGLE_FAN                        0x0006\n#define GL_QUADS                               0x0007\n#define GL_NEVER                               0x0200\n#define GL_LESS                                0x0201\n#define GL_EQUAL                               0x0202\n#define GL_LEQUAL                              0x0203\n#define GL_GREATER                             0x0204\n#define GL_NOTEQUAL                            0x0205\n#define GL_GEQUAL                              0x0206\n#define GL_ALWAYS                              0x0207\n#define GL_ZERO                                0\n#define GL_ONE                                 1\n#define GL_SRC_COLOR                           0x0300\n#define GL_ONE_MINUS_SRC_COLOR                 0x0301\n#define GL_SRC_ALPHA                           0x0302\n#define GL_ONE_MINUS_SRC_ALPHA                 0x0303\n#define GL_DST_ALPHA                           0x0304\n#define GL_ONE_MINUS_DST_ALPHA                 0x0305\n#define GL_DST_COLOR                           0x0306\n#define GL_ONE_MINUS_DST_COLOR                 0x0307\n#define GL_SRC_ALPHA_SATURATE                  0x0308\n#define GL_NONE                                0\n#define GL_FRONT_LEFT                          0x0400\n#define GL_FRONT_RIGHT                         0x0401\n#define GL_BACK_LEFT                           0x0402\n#define GL_BACK_RIGHT                          0x0403\n#define GL_FRONT                               0x0404\n#define GL_BACK                                0x0405\n#define GL_LEFT                                0x0406\n#define GL_RIGHT                               0x0407\n#define GL_FRONT_AND_BACK                      0x0408\n#define GL_NO_ERROR                            0\n#define GL_INVALID_ENUM                        0x0500\n#define GL_INVALID_VALUE                       0x0501\n#define GL_INVALID_OPERATION                   0x0502\n#define GL_OUT_OF_MEMORY                       0x0505\n#define GL_CW                                  0x0900\n#define GL_CCW                                 0x0901\n#define GL_POINT_SIZE                          0x0B11\n#define GL_POINT_SIZE_RANGE                    0x0B12\n#define GL_POINT_SIZE_GRANULARITY              0x0B13\n#define GL_LINE_SMOOTH                         0x0B20\n#define GL_LINE_WIDTH                          0x0B21\n#define GL_LINE_WIDTH_RANGE                    0x0B22\n#define GL_LINE_WIDTH_GRANULARITY              0x0B23\n#define GL_POLYGON_MODE                        0x0B40\n#define GL_POLYGON_SMOOTH                      0x0B41\n#define GL_CULL_FACE                           0x0B44\n#define GL_CULL_FACE_MODE                      0x0B45\n#define GL_FRONT_FACE                          0x0B46\n#define GL_DEPTH_RANGE                         0x0B70\n#define GL_DEPTH_TEST                          0x0B71\n#define GL_DEPTH_WRITEMASK                     0x0B72\n#define GL_DEPTH_CLEAR_VALUE                   0x0B73\n#define GL_DEPTH_FUNC                          0x0B74\n#define GL_STENCIL_TEST                        0x0B90\n#define GL_STENCIL_CLEAR_VALUE                 0x0B91\n#define GL_STENCIL_FUNC                        0x0B92\n#define GL_STENCIL_VALUE_MASK                  0x0B93\n#define GL_STENCIL_FAIL                        0x0B94\n#define GL_STENCIL_PASS_DEPTH_FAIL             0x0B95\n#define GL_STENCIL_PASS_DEPTH_PASS             0x0B96\n#define GL_STENCIL_REF                         0x0B97\n#define GL_STENCIL_WRITEMASK                   0x0B98\n#define GL_VIEWPORT                            0x0BA2\n#define GL_DITHER                              0x0BD0\n#define GL_BLEND_DST                           0x0BE0\n#define GL_BLEND_SRC                           0x0BE1\n#define GL_BLEND                               0x0BE2\n#define GL_LOGIC_OP_MODE                       0x0BF0\n#define GL_COLOR_LOGIC_OP                      0x0BF2\n#define GL_DRAW_BUFFER                         0x0C01\n#define GL_READ_BUFFER                         0x0C02\n#define GL_SCISSOR_BOX                         0x0C10\n#define GL_SCISSOR_TEST                        0x0C11\n#define GL_COLOR_CLEAR_VALUE                   0x0C22\n#define GL_COLOR_WRITEMASK                     0x0C23\n#define GL_DOUBLEBUFFER                        0x0C32\n#define GL_STEREO                              0x0C33\n#define GL_LINE_SMOOTH_HINT                    0x0C52\n#define GL_POLYGON_SMOOTH_HINT                 0x0C53\n#define GL_UNPACK_SWAP_BYTES                   0x0CF0\n#define GL_UNPACK_LSB_FIRST                    0x0CF1\n#define GL_UNPACK_ROW_LENGTH                   0x0CF2\n#define GL_UNPACK_SKIP_ROWS                    0x0CF3\n#define GL_UNPACK_SKIP_PIXELS                  0x0CF4\n#define GL_UNPACK_ALIGNMENT                    0x0CF5\n#define GL_PACK_SWAP_BYTES                     0x0D00\n#define GL_PACK_LSB_FIRST                      0x0D01\n#define GL_PACK_ROW_LENGTH                     0x0D02\n#define GL_PACK_SKIP_ROWS                      0x0D03\n#define GL_PACK_SKIP_PIXELS                    0x0D04\n#define GL_PACK_ALIGNMENT                      0x0D05\n#define GL_MAX_TEXTURE_SIZE                    0x0D33\n#define GL_MAX_VIEWPORT_DIMS                   0x0D3A\n#define GL_SUBPIXEL_BITS                       0x0D50\n#define GL_TEXTURE_1D                          0x0DE0\n#define GL_TEXTURE_2D                          0x0DE1\n#define GL_POLYGON_OFFSET_UNITS                0x2A00\n#define GL_POLYGON_OFFSET_POINT                0x2A01\n#define GL_POLYGON_OFFSET_LINE                 0x2A02\n#define GL_POLYGON_OFFSET_FILL                 0x8037\n#define GL_POLYGON_OFFSET_FACTOR               0x8038\n#define GL_TEXTURE_BINDING_1D                  0x8068\n#define GL_TEXTURE_BINDING_2D                  0x8069\n#define GL_TEXTURE_WIDTH                       0x1000\n#define GL_TEXTURE_HEIGHT                      0x1001\n#define GL_TEXTURE_INTERNAL_FORMAT             0x1003\n#define GL_TEXTURE_BORDER_COLOR                0x1004\n#define GL_TEXTURE_RED_SIZE                    0x805C\n#define GL_TEXTURE_GREEN_SIZE                  0x805D\n#define GL_TEXTURE_BLUE_SIZE                   0x805E\n#define GL_TEXTURE_ALPHA_SIZE                  0x805F\n#define GL_DONT_CARE                           0x1100\n#define GL_FASTEST                             0x1101\n#define GL_NICEST                              0x1102\n#define GL_BYTE                                0x1400\n#define GL_UNSIGNED_BYTE                       0x1401\n#define GL_SHORT                               0x1402\n#define GL_UNSIGNED_SHORT                      0x1403\n#define GL_INT                                 0x1404\n#define GL_UNSIGNED_INT                        0x1405\n#define GL_FLOAT                               0x1406\n#define GL_DOUBLE                              0x140A\n#define GL_STACK_OVERFLOW                      0x0503\n#define GL_STACK_UNDERFLOW                     0x0504\n#define GL_CLEAR                               0x1500\n#define GL_AND                                 0x1501\n#define GL_AND_REVERSE                         0x1502\n#define GL_COPY                                0x1503\n#define GL_AND_INVERTED                        0x1504\n#define GL_NOOP                                0x1505\n#define GL_XOR                                 0x1506\n#define GL_OR                                  0x1507\n#define GL_NOR                                 0x1508\n#define GL_EQUIV                               0x1509\n#define GL_INVERT                              0x150A\n#define GL_OR_REVERSE                          0x150B\n#define GL_COPY_INVERTED                       0x150C\n#define GL_OR_INVERTED                         0x150D\n#define GL_NAND                                0x150E\n#define GL_SET                                 0x150F\n#define GL_TEXTURE                             0x1702\n#define GL_COLOR                               0x1800\n#define GL_DEPTH                               0x1801\n#define GL_STENCIL                             0x1802\n#define GL_STENCIL_INDEX                       0x1901\n#define GL_DEPTH_COMPONENT                     0x1902\n#define GL_RED                                 0x1903\n#define GL_GREEN                               0x1904\n#define GL_BLUE                                0x1905\n#define GL_ALPHA                               0x1906\n#define GL_RGB                                 0x1907\n#define GL_RGBA                                0x1908\n#define GL_POINT                               0x1B00\n#define GL_LINE                                0x1B01\n#define GL_FILL                                0x1B02\n#define GL_KEEP                                0x1E00\n#define GL_REPLACE                             0x1E01\n#define GL_INCR                                0x1E02\n#define GL_DECR                                0x1E03\n#define GL_VENDOR                              0x1F00\n#define GL_RENDERER                            0x1F01\n#define GL_VERSION                             0x1F02\n#define GL_EXTENSIONS                          0x1F03\n#define GL_NEAREST                             0x2600\n#define GL_LINEAR                              0x2601\n#define GL_NEAREST_MIPMAP_NEAREST              0x2700\n#define GL_LINEAR_MIPMAP_NEAREST               0x2701\n#define GL_NEAREST_MIPMAP_LINEAR               0x2702\n#define GL_LINEAR_MIPMAP_LINEAR                0x2703\n#define GL_TEXTURE_MAG_FILTER                  0x2800\n#define GL_TEXTURE_MIN_FILTER                  0x2801\n#define GL_TEXTURE_WRAP_S                      0x2802\n#define GL_TEXTURE_WRAP_T                      0x2803\n#define GL_PROXY_TEXTURE_1D                    0x8063\n#define GL_PROXY_TEXTURE_2D                    0x8064\n#define GL_REPEAT                              0x2901\n#define GL_R3_G3_B2                            0x2A10\n#define GL_RGB4                                0x804F\n#define GL_RGB5                                0x8050\n#define GL_RGB8                                0x8051\n#define GL_RGB10                               0x8052\n#define GL_RGB12                               0x8053\n#define GL_RGB16                               0x8054\n#define GL_RGBA2                               0x8055\n#define GL_RGBA4                               0x8056\n#define GL_RGB5_A1                             0x8057\n#define GL_RGBA8                               0x8058\n#define GL_RGB10_A2                            0x8059\n#define GL_RGBA12                              0x805A\n#define GL_RGBA16                              0x805B\n#define GL_CURRENT_BIT                         0x00000001\n#define GL_POINT_BIT                           0x00000002\n#define GL_LINE_BIT                            0x00000004\n#define GL_POLYGON_BIT                         0x00000008\n#define GL_POLYGON_STIPPLE_BIT                 0x00000010\n#define GL_PIXEL_MODE_BIT                      0x00000020\n#define GL_LIGHTING_BIT                        0x00000040\n#define GL_FOG_BIT                             0x00000080\n#define GL_ACCUM_BUFFER_BIT                    0x00000200\n#define GL_VIEWPORT_BIT                        0x00000800\n#define GL_TRANSFORM_BIT                       0x00001000\n#define GL_ENABLE_BIT                          0x00002000\n#define GL_HINT_BIT                            0x00008000\n#define GL_EVAL_BIT                            0x00010000\n#define GL_LIST_BIT                            0x00020000\n#define GL_TEXTURE_BIT                         0x00040000\n#define GL_SCISSOR_BIT                         0x00080000\n#define GL_ALL_ATTRIB_BITS                     0xFFFFFFFF\n#define GL_CLIENT_PIXEL_STORE_BIT              0x00000001\n#define GL_CLIENT_VERTEX_ARRAY_BIT             0x00000002\n#define GL_CLIENT_ALL_ATTRIB_BITS              0xFFFFFFFF\n#define GL_QUAD_STRIP                          0x0008\n#define GL_POLYGON                             0x0009\n#define GL_ACCUM                               0x0100\n#define GL_LOAD                                0x0101\n#define GL_RETURN                              0x0102\n#define GL_MULT                                0x0103\n#define GL_ADD                                 0x0104\n#define GL_AUX0                                0x0409\n#define GL_AUX1                                0x040A\n#define GL_AUX2                                0x040B\n#define GL_AUX3                                0x040C\n#define GL_2D                                  0x0600\n#define GL_3D                                  0x0601\n#define GL_3D_COLOR                            0x0602\n#define GL_3D_COLOR_TEXTURE                    0x0603\n#define GL_4D_COLOR_TEXTURE                    0x0604\n#define GL_PASS_THROUGH_TOKEN                  0x0700\n#define GL_POINT_TOKEN                         0x0701\n#define GL_LINE_TOKEN                          0x0702\n#define GL_POLYGON_TOKEN                       0x0703\n#define GL_BITMAP_TOKEN                        0x0704\n#define GL_DRAW_PIXEL_TOKEN                    0x0705\n#define GL_COPY_PIXEL_TOKEN                    0x0706\n#define GL_LINE_RESET_TOKEN                    0x0707\n#define GL_EXP                                 0x0800\n#define GL_EXP2                                0x0801\n#define GL_COEFF                               0x0A00\n#define GL_ORDER                               0x0A01\n#define GL_DOMAIN                              0x0A02\n#define GL_PIXEL_MAP_I_TO_I                    0x0C70\n#define GL_PIXEL_MAP_S_TO_S                    0x0C71\n#define GL_PIXEL_MAP_I_TO_R                    0x0C72\n#define GL_PIXEL_MAP_I_TO_G                    0x0C73\n#define GL_PIXEL_MAP_I_TO_B                    0x0C74\n#define GL_PIXEL_MAP_I_TO_A                    0x0C75\n#define GL_PIXEL_MAP_R_TO_R                    0x0C76\n#define GL_PIXEL_MAP_G_TO_G                    0x0C77\n#define GL_PIXEL_MAP_B_TO_B                    0x0C78\n#define GL_PIXEL_MAP_A_TO_A                    0x0C79\n#define GL_VERTEX_ARRAY_POINTER                0x808E\n#define GL_NORMAL_ARRAY_POINTER                0x808F\n#define GL_COLOR_ARRAY_POINTER                 0x8090\n#define GL_INDEX_ARRAY_POINTER                 0x8091\n#define GL_TEXTURE_COORD_ARRAY_POINTER         0x8092\n#define GL_EDGE_FLAG_ARRAY_POINTER             0x8093\n#define GL_FEEDBACK_BUFFER_POINTER             0x0DF0\n#define GL_SELECTION_BUFFER_POINTER            0x0DF3\n#define GL_CURRENT_COLOR                       0x0B00\n#define GL_CURRENT_INDEX                       0x0B01\n#define GL_CURRENT_NORMAL                      0x0B02\n#define GL_CURRENT_TEXTURE_COORDS              0x0B03\n#define GL_CURRENT_RASTER_COLOR                0x0B04\n#define GL_CURRENT_RASTER_INDEX                0x0B05\n#define GL_CURRENT_RASTER_TEXTURE_COORDS       0x0B06\n#define GL_CURRENT_RASTER_POSITION             0x0B07\n#define GL_CURRENT_RASTER_POSITION_VALID       0x0B08\n#define GL_CURRENT_RASTER_DISTANCE             0x0B09\n#define GL_POINT_SMOOTH                        0x0B10\n#define GL_LINE_STIPPLE                        0x0B24\n#define GL_LINE_STIPPLE_PATTERN                0x0B25\n#define GL_LINE_STIPPLE_REPEAT                 0x0B26\n#define GL_LIST_MODE                           0x0B30\n#define GL_MAX_LIST_NESTING                    0x0B31\n#define GL_LIST_BASE                           0x0B32\n#define GL_LIST_INDEX                          0x0B33\n#define GL_POLYGON_STIPPLE                     0x0B42\n#define GL_EDGE_FLAG                           0x0B43\n#define GL_LIGHTING                            0x0B50\n#define GL_LIGHT_MODEL_LOCAL_VIEWER            0x0B51\n#define GL_LIGHT_MODEL_TWO_SIDE                0x0B52\n#define GL_LIGHT_MODEL_AMBIENT                 0x0B53\n#define GL_SHADE_MODEL                         0x0B54\n#define GL_COLOR_MATERIAL_FACE                 0x0B55\n#define GL_COLOR_MATERIAL_PARAMETER            0x0B56\n#define GL_COLOR_MATERIAL                      0x0B57\n#define GL_FOG                                 0x0B60\n#define GL_FOG_INDEX                           0x0B61\n#define GL_FOG_DENSITY                         0x0B62\n#define GL_FOG_START                           0x0B63\n#define GL_FOG_END                             0x0B64\n#define GL_FOG_MODE                            0x0B65\n#define GL_FOG_COLOR                           0x0B66\n#define GL_ACCUM_CLEAR_VALUE                   0x0B80\n#define GL_MATRIX_MODE                         0x0BA0\n#define GL_NORMALIZE                           0x0BA1\n#define GL_MODELVIEW_STACK_DEPTH               0x0BA3\n#define GL_PROJECTION_STACK_DEPTH              0x0BA4\n#define GL_TEXTURE_STACK_DEPTH                 0x0BA5\n#define GL_MODELVIEW_MATRIX                    0x0BA6\n#define GL_PROJECTION_MATRIX                   0x0BA7\n#define GL_TEXTURE_MATRIX                      0x0BA8\n#define GL_ATTRIB_STACK_DEPTH                  0x0BB0\n#define GL_CLIENT_ATTRIB_STACK_DEPTH           0x0BB1\n#define GL_ALPHA_TEST                          0x0BC0\n#define GL_ALPHA_TEST_FUNC                     0x0BC1\n#define GL_ALPHA_TEST_REF                      0x0BC2\n#define GL_INDEX_LOGIC_OP                      0x0BF1\n#define GL_LOGIC_OP                            0x0BF1\n#define GL_AUX_BUFFERS                         0x0C00\n#define GL_INDEX_CLEAR_VALUE                   0x0C20\n#define GL_INDEX_WRITEMASK                     0x0C21\n#define GL_INDEX_MODE                          0x0C30\n#define GL_RGBA_MODE                           0x0C31\n#define GL_RENDER_MODE                         0x0C40\n#define GL_PERSPECTIVE_CORRECTION_HINT         0x0C50\n#define GL_POINT_SMOOTH_HINT                   0x0C51\n#define GL_FOG_HINT                            0x0C54\n#define GL_TEXTURE_GEN_S                       0x0C60\n#define GL_TEXTURE_GEN_T                       0x0C61\n#define GL_TEXTURE_GEN_R                       0x0C62\n#define GL_TEXTURE_GEN_Q                       0x0C63\n#define GL_PIXEL_MAP_I_TO_I_SIZE               0x0CB0\n#define GL_PIXEL_MAP_S_TO_S_SIZE               0x0CB1\n#define GL_PIXEL_MAP_I_TO_R_SIZE               0x0CB2\n#define GL_PIXEL_MAP_I_TO_G_SIZE               0x0CB3\n#define GL_PIXEL_MAP_I_TO_B_SIZE               0x0CB4\n#define GL_PIXEL_MAP_I_TO_A_SIZE               0x0CB5\n#define GL_PIXEL_MAP_R_TO_R_SIZE               0x0CB6\n#define GL_PIXEL_MAP_G_TO_G_SIZE               0x0CB7\n#define GL_PIXEL_MAP_B_TO_B_SIZE               0x0CB8\n#define GL_PIXEL_MAP_A_TO_A_SIZE               0x0CB9\n#define GL_MAP_COLOR                           0x0D10\n#define GL_MAP_STENCIL                         0x0D11\n#define GL_INDEX_SHIFT                         0x0D12\n#define GL_INDEX_OFFSET                        0x0D13\n#define GL_RED_SCALE                           0x0D14\n#define GL_RED_BIAS                            0x0D15\n#define GL_ZOOM_X                              0x0D16\n#define GL_ZOOM_Y                              0x0D17\n#define GL_GREEN_SCALE                         0x0D18\n#define GL_GREEN_BIAS                          0x0D19\n#define GL_BLUE_SCALE                          0x0D1A\n#define GL_BLUE_BIAS                           0x0D1B\n#define GL_ALPHA_SCALE                         0x0D1C\n#define GL_ALPHA_BIAS                          0x0D1D\n#define GL_DEPTH_SCALE                         0x0D1E\n#define GL_DEPTH_BIAS                          0x0D1F\n#define GL_MAX_EVAL_ORDER                      0x0D30\n#define GL_MAX_LIGHTS                          0x0D31\n#define GL_MAX_CLIP_PLANES                     0x0D32\n#define GL_MAX_PIXEL_MAP_TABLE                 0x0D34\n#define GL_MAX_ATTRIB_STACK_DEPTH              0x0D35\n#define GL_MAX_MODELVIEW_STACK_DEPTH           0x0D36\n#define GL_MAX_NAME_STACK_DEPTH                0x0D37\n#define GL_MAX_PROJECTION_STACK_DEPTH          0x0D38\n#define GL_MAX_TEXTURE_STACK_DEPTH             0x0D39\n#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH       0x0D3B\n#define GL_INDEX_BITS                          0x0D51\n#define GL_RED_BITS                            0x0D52\n#define GL_GREEN_BITS                          0x0D53\n#define GL_BLUE_BITS                           0x0D54\n#define GL_ALPHA_BITS                          0x0D55\n#define GL_DEPTH_BITS                          0x0D56\n#define GL_STENCIL_BITS                        0x0D57\n#define GL_ACCUM_RED_BITS                      0x0D58\n#define GL_ACCUM_GREEN_BITS                    0x0D59\n#define GL_ACCUM_BLUE_BITS                     0x0D5A\n#define GL_ACCUM_ALPHA_BITS                    0x0D5B\n#define GL_NAME_STACK_DEPTH                    0x0D70\n#define GL_AUTO_NORMAL                         0x0D80\n#define GL_MAP1_COLOR_4                        0x0D90\n#define GL_MAP1_INDEX                          0x0D91\n#define GL_MAP1_NORMAL                         0x0D92\n#define GL_MAP1_TEXTURE_COORD_1                0x0D93\n#define GL_MAP1_TEXTURE_COORD_2                0x0D94\n#define GL_MAP1_TEXTURE_COORD_3                0x0D95\n#define GL_MAP1_TEXTURE_COORD_4                0x0D96\n#define GL_MAP1_VERTEX_3                       0x0D97\n#define GL_MAP1_VERTEX_4                       0x0D98\n#define GL_MAP2_COLOR_4                        0x0DB0\n#define GL_MAP2_INDEX                          0x0DB1\n#define GL_MAP2_NORMAL                         0x0DB2\n#define GL_MAP2_TEXTURE_COORD_1                0x0DB3\n#define GL_MAP2_TEXTURE_COORD_2                0x0DB4\n#define GL_MAP2_TEXTURE_COORD_3                0x0DB5\n#define GL_MAP2_TEXTURE_COORD_4                0x0DB6\n#define GL_MAP2_VERTEX_3                       0x0DB7\n#define GL_MAP2_VERTEX_4                       0x0DB8\n#define GL_MAP1_GRID_DOMAIN                    0x0DD0\n#define GL_MAP1_GRID_SEGMENTS                  0x0DD1\n#define GL_MAP2_GRID_DOMAIN                    0x0DD2\n#define GL_MAP2_GRID_SEGMENTS                  0x0DD3\n#define GL_FEEDBACK_BUFFER_SIZE                0x0DF1\n#define GL_FEEDBACK_BUFFER_TYPE                0x0DF2\n#define GL_SELECTION_BUFFER_SIZE               0x0DF4\n#define GL_VERTEX_ARRAY                        0x8074\n#define GL_NORMAL_ARRAY                        0x8075\n#define GL_COLOR_ARRAY                         0x8076\n#define GL_INDEX_ARRAY                         0x8077\n#define GL_TEXTURE_COORD_ARRAY                 0x8078\n#define GL_EDGE_FLAG_ARRAY                     0x8079\n#define GL_VERTEX_ARRAY_SIZE                   0x807A\n#define GL_VERTEX_ARRAY_TYPE                   0x807B\n#define GL_VERTEX_ARRAY_STRIDE                 0x807C\n#define GL_NORMAL_ARRAY_TYPE                   0x807E\n#define GL_NORMAL_ARRAY_STRIDE                 0x807F\n#define GL_COLOR_ARRAY_SIZE                    0x8081\n#define GL_COLOR_ARRAY_TYPE                    0x8082\n#define GL_COLOR_ARRAY_STRIDE                  0x8083\n#define GL_INDEX_ARRAY_TYPE                    0x8085\n#define GL_INDEX_ARRAY_STRIDE                  0x8086\n#define GL_TEXTURE_COORD_ARRAY_SIZE            0x8088\n#define GL_TEXTURE_COORD_ARRAY_TYPE            0x8089\n#define GL_TEXTURE_COORD_ARRAY_STRIDE          0x808A\n#define GL_EDGE_FLAG_ARRAY_STRIDE              0x808C\n#define GL_TEXTURE_COMPONENTS                  0x1003\n#define GL_TEXTURE_BORDER                      0x1005\n#define GL_TEXTURE_LUMINANCE_SIZE              0x8060\n#define GL_TEXTURE_INTENSITY_SIZE              0x8061\n#define GL_TEXTURE_PRIORITY                    0x8066\n#define GL_TEXTURE_RESIDENT                    0x8067\n#define GL_AMBIENT                             0x1200\n#define GL_DIFFUSE                             0x1201\n#define GL_SPECULAR                            0x1202\n#define GL_POSITION                            0x1203\n#define GL_SPOT_DIRECTION                      0x1204\n#define GL_SPOT_EXPONENT                       0x1205\n#define GL_SPOT_CUTOFF                         0x1206\n#define GL_CONSTANT_ATTENUATION                0x1207\n#define GL_LINEAR_ATTENUATION                  0x1208\n#define GL_QUADRATIC_ATTENUATION               0x1209\n#define GL_COMPILE                             0x1300\n#define GL_COMPILE_AND_EXECUTE                 0x1301\n#define GL_2_BYTES                             0x1407\n#define GL_3_BYTES                             0x1408\n#define GL_4_BYTES                             0x1409\n#define GL_EMISSION                            0x1600\n#define GL_SHININESS                           0x1601\n#define GL_AMBIENT_AND_DIFFUSE                 0x1602\n#define GL_COLOR_INDEXES                       0x1603\n#define GL_MODELVIEW                           0x1700\n#define GL_PROJECTION                          0x1701\n#define GL_COLOR_INDEX                         0x1900\n#define GL_LUMINANCE                           0x1909\n#define GL_LUMINANCE_ALPHA                     0x190A\n#define GL_BITMAP                              0x1A00\n#define GL_RENDER                              0x1C00\n#define GL_FEEDBACK                            0x1C01\n#define GL_SELECT                              0x1C02\n#define GL_FLAT                                0x1D00\n#define GL_SMOOTH                              0x1D01\n#define GL_S                                   0x2000\n#define GL_T                                   0x2001\n#define GL_R                                   0x2002\n#define GL_Q                                   0x2003\n#define GL_MODULATE                            0x2100\n#define GL_DECAL                               0x2101\n#define GL_TEXTURE_ENV_MODE                    0x2200\n#define GL_TEXTURE_ENV_COLOR                   0x2201\n#define GL_TEXTURE_ENV                         0x2300\n#define GL_EYE_LINEAR                          0x2400\n#define GL_OBJECT_LINEAR                       0x2401\n#define GL_SPHERE_MAP                          0x2402\n#define GL_TEXTURE_GEN_MODE                    0x2500\n#define GL_OBJECT_PLANE                        0x2501\n#define GL_EYE_PLANE                           0x2502\n#define GL_CLAMP                               0x2900\n#define GL_ALPHA4                              0x803B\n#define GL_ALPHA8                              0x803C\n#define GL_ALPHA12                             0x803D\n#define GL_ALPHA16                             0x803E\n#define GL_LUMINANCE4                          0x803F\n#define GL_LUMINANCE8                          0x8040\n#define GL_LUMINANCE12                         0x8041\n#define GL_LUMINANCE16                         0x8042\n#define GL_LUMINANCE4_ALPHA4                   0x8043\n#define GL_LUMINANCE6_ALPHA2                   0x8044\n#define GL_LUMINANCE8_ALPHA8                   0x8045\n#define GL_LUMINANCE12_ALPHA4                  0x8046\n#define GL_LUMINANCE12_ALPHA12                 0x8047\n#define GL_LUMINANCE16_ALPHA16                 0x8048\n#define GL_INTENSITY                           0x8049\n#define GL_INTENSITY4                          0x804A\n#define GL_INTENSITY8                          0x804B\n#define GL_INTENSITY12                         0x804C\n#define GL_INTENSITY16                         0x804D\n#define GL_V2F                                 0x2A20\n#define GL_V3F                                 0x2A21\n#define GL_C4UB_V2F                            0x2A22\n#define GL_C4UB_V3F                            0x2A23\n#define GL_C3F_V3F                             0x2A24\n#define GL_N3F_V3F                             0x2A25\n#define GL_C4F_N3F_V3F                         0x2A26\n#define GL_T2F_V3F                             0x2A27\n#define GL_T4F_V4F                             0x2A28\n#define GL_T2F_C4UB_V3F                        0x2A29\n#define GL_T2F_C3F_V3F                         0x2A2A\n#define GL_T2F_N3F_V3F                         0x2A2B\n#define GL_T2F_C4F_N3F_V3F                     0x2A2C\n#define GL_T4F_C4F_N3F_V4F                     0x2A2D\n#define GL_CLIP_PLANE0                         0x3000\n#define GL_CLIP_PLANE1                         0x3001\n#define GL_CLIP_PLANE2                         0x3002\n#define GL_CLIP_PLANE3                         0x3003\n#define GL_CLIP_PLANE4                         0x3004\n#define GL_CLIP_PLANE5                         0x3005\n#define GL_LIGHT0                              0x4000\n#define GL_LIGHT1                              0x4001\n#define GL_LIGHT2                              0x4002\n#define GL_LIGHT3                              0x4003\n#define GL_LIGHT4                              0x4004\n#define GL_LIGHT5                              0x4005\n#define GL_LIGHT6                              0x4006\n#define GL_LIGHT7                              0x4007\ntypedef void (APIENTRYP pfn_glDrawArrays) (GLenum, GLint, GLsizei);\nextern pfn_glDrawArrays fp_glDrawArrays;\ntypedef void (APIENTRYP pfn_glDrawElements) (GLenum, GLsizei, GLenum, const void*);\nextern pfn_glDrawElements fp_glDrawElements;\ntypedef void (APIENTRYP pfn_glGetPointerv) (GLenum, void**);\nextern pfn_glGetPointerv fp_glGetPointerv;\ntypedef void (APIENTRYP pfn_glPolygonOffset) (GLfloat, GLfloat);\nextern pfn_glPolygonOffset fp_glPolygonOffset;\ntypedef void (APIENTRYP pfn_glCopyTexImage1D) (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint);\nextern pfn_glCopyTexImage1D fp_glCopyTexImage1D;\ntypedef void (APIENTRYP pfn_glCopyTexImage2D) (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint);\nextern pfn_glCopyTexImage2D fp_glCopyTexImage2D;\ntypedef void (APIENTRYP pfn_glCopyTexSubImage1D) (GLenum, GLint, GLint, GLint, GLint, GLsizei);\nextern pfn_glCopyTexSubImage1D fp_glCopyTexSubImage1D;\ntypedef void (APIENTRYP pfn_glCopyTexSubImage2D) (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei);\nextern pfn_glCopyTexSubImage2D fp_glCopyTexSubImage2D;\ntypedef void (APIENTRYP pfn_glTexSubImage1D) (GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const void*);\nextern pfn_glTexSubImage1D fp_glTexSubImage1D;\ntypedef void (APIENTRYP pfn_glTexSubImage2D) (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const void*);\nextern pfn_glTexSubImage2D fp_glTexSubImage2D;\ntypedef void (APIENTRYP pfn_glBindTexture) (GLenum, GLuint);\nextern pfn_glBindTexture fp_glBindTexture;\ntypedef void (APIENTRYP pfn_glDeleteTextures) (GLsizei, const GLuint*);\nextern pfn_glDeleteTextures fp_glDeleteTextures;\ntypedef void (APIENTRYP pfn_glGenTextures) (GLsizei, GLuint*);\nextern pfn_glGenTextures fp_glGenTextures;\ntypedef GLboolean (APIENTRYP pfn_glIsTexture) (GLuint);\nextern pfn_glIsTexture fp_glIsTexture;\ntypedef void (APIENTRYP pfn_glArrayElement) (GLint);\nextern pfn_glArrayElement fp_glArrayElement;\ntypedef void (APIENTRYP pfn_glColorPointer) (GLint, GLenum, GLsizei, const void*);\nextern pfn_glColorPointer fp_glColorPointer;\ntypedef void (APIENTRYP pfn_glDisableClientState) (GLenum);\nextern pfn_glDisableClientState fp_glDisableClientState;\ntypedef void (APIENTRYP pfn_glEdgeFlagPointer) (GLsizei, const void*);\nextern pfn_glEdgeFlagPointer fp_glEdgeFlagPointer;\ntypedef void (APIENTRYP pfn_glEnableClientState) (GLenum);\nextern pfn_glEnableClientState fp_glEnableClientState;\ntypedef void (APIENTRYP pfn_glIndexPointer) (GLenum, GLsizei, const void*);\nextern pfn_glIndexPointer fp_glIndexPointer;\ntypedef void (APIENTRYP pfn_glInterleavedArrays) (GLenum, GLsizei, const void*);\nextern pfn_glInterleavedArrays fp_glInterleavedArrays;\ntypedef void (APIENTRYP pfn_glNormalPointer) (GLenum, GLsizei, const void*);\nextern pfn_glNormalPointer fp_glNormalPointer;\ntypedef void (APIENTRYP pfn_glTexCoordPointer) (GLint, GLenum, GLsizei, const void*);\nextern pfn_glTexCoordPointer fp_glTexCoordPointer;\ntypedef void (APIENTRYP pfn_glVertexPointer) (GLint, GLenum, GLsizei, const void*);\nextern pfn_glVertexPointer fp_glVertexPointer;\ntypedef GLboolean (APIENTRYP pfn_glAreTexturesResident) (GLsizei, const GLuint*, GLboolean*);\nextern pfn_glAreTexturesResident fp_glAreTexturesResident;\ntypedef void (APIENTRYP pfn_glPrioritizeTextures) (GLsizei, const GLuint*, const GLfloat*);\nextern pfn_glPrioritizeTextures fp_glPrioritizeTextures;\ntypedef void (APIENTRYP pfn_glIndexub) (GLubyte);\nextern pfn_glIndexub fp_glIndexub;\ntypedef void (APIENTRYP pfn_glIndexubv) (const GLubyte*);\nextern pfn_glIndexubv fp_glIndexubv;\ntypedef void (APIENTRYP pfn_glPopClientAttrib) ();\nextern pfn_glPopClientAttrib fp_glPopClientAttrib;\ntypedef void (APIENTRYP pfn_glPushClientAttrib) (GLbitfield);\nextern pfn_glPushClientAttrib fp_glPushClientAttrib;\n\n /* GL_VERSION_1_2 */\nextern GLboolean GLAD_VERSION_1_2;\n#define GL_UNSIGNED_BYTE_3_3_2                 0x8032\n#define GL_UNSIGNED_SHORT_4_4_4_4              0x8033\n#define GL_UNSIGNED_SHORT_5_5_5_1              0x8034\n#define GL_UNSIGNED_INT_8_8_8_8                0x8035\n#define GL_UNSIGNED_INT_10_10_10_2             0x8036\n#define GL_TEXTURE_BINDING_3D                  0x806A\n#define GL_PACK_SKIP_IMAGES                    0x806B\n#define GL_PACK_IMAGE_HEIGHT                   0x806C\n#define GL_UNPACK_SKIP_IMAGES                  0x806D\n#define GL_UNPACK_IMAGE_HEIGHT                 0x806E\n#define GL_TEXTURE_3D                          0x806F\n#define GL_PROXY_TEXTURE_3D                    0x8070\n#define GL_TEXTURE_DEPTH                       0x8071\n#define GL_TEXTURE_WRAP_R                      0x8072\n#define GL_MAX_3D_TEXTURE_SIZE                 0x8073\n#define GL_UNSIGNED_BYTE_2_3_3_REV             0x8362\n#define GL_UNSIGNED_SHORT_5_6_5                0x8363\n#define GL_UNSIGNED_SHORT_5_6_5_REV            0x8364\n#define GL_UNSIGNED_SHORT_4_4_4_4_REV          0x8365\n#define GL_UNSIGNED_SHORT_1_5_5_5_REV          0x8366\n#define GL_UNSIGNED_INT_8_8_8_8_REV            0x8367\n#define GL_UNSIGNED_INT_2_10_10_10_REV         0x8368\n#define GL_BGR                                 0x80E0\n#define GL_BGRA                                0x80E1\n#define GL_MAX_ELEMENTS_VERTICES               0x80E8\n#define GL_MAX_ELEMENTS_INDICES                0x80E9\n#define GL_CLAMP_TO_EDGE                       0x812F\n#define GL_TEXTURE_MIN_LOD                     0x813A\n#define GL_TEXTURE_MAX_LOD                     0x813B\n#define GL_TEXTURE_BASE_LEVEL                  0x813C\n#define GL_TEXTURE_MAX_LEVEL                   0x813D\n#define GL_SMOOTH_POINT_SIZE_RANGE             0x0B12\n#define GL_SMOOTH_POINT_SIZE_GRANULARITY       0x0B13\n#define GL_SMOOTH_LINE_WIDTH_RANGE             0x0B22\n#define GL_SMOOTH_LINE_WIDTH_GRANULARITY       0x0B23\n#define GL_ALIASED_LINE_WIDTH_RANGE            0x846E\n#define GL_RESCALE_NORMAL                      0x803A\n#define GL_LIGHT_MODEL_COLOR_CONTROL           0x81F8\n#define GL_SINGLE_COLOR                        0x81F9\n#define GL_SEPARATE_SPECULAR_COLOR             0x81FA\n#define GL_ALIASED_POINT_SIZE_RANGE            0x846D\ntypedef void (APIENTRYP pfn_glDrawRangeElements) (GLenum, GLuint, GLuint, GLsizei, GLenum, const void*);\nextern pfn_glDrawRangeElements fp_glDrawRangeElements;\ntypedef void (APIENTRYP pfn_glTexImage3D) (GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const void*);\nextern pfn_glTexImage3D fp_glTexImage3D;\ntypedef void (APIENTRYP pfn_glTexSubImage3D) (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void*);\nextern pfn_glTexSubImage3D fp_glTexSubImage3D;\ntypedef void (APIENTRYP pfn_glCopyTexSubImage3D) (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei);\nextern pfn_glCopyTexSubImage3D fp_glCopyTexSubImage3D;\n\n /* GL_VERSION_1_3 */\nextern GLboolean GLAD_VERSION_1_3;\n#define GL_TEXTURE0                            0x84C0\n#define GL_TEXTURE1                            0x84C1\n#define GL_TEXTURE2                            0x84C2\n#define GL_TEXTURE3                            0x84C3\n#define GL_TEXTURE4                            0x84C4\n#define GL_TEXTURE5                            0x84C5\n#define GL_TEXTURE6                            0x84C6\n#define GL_TEXTURE7                            0x84C7\n#define GL_TEXTURE8                            0x84C8\n#define GL_TEXTURE9                            0x84C9\n#define GL_TEXTURE10                           0x84CA\n#define GL_TEXTURE11                           0x84CB\n#define GL_TEXTURE12                           0x84CC\n#define GL_TEXTURE13                           0x84CD\n#define GL_TEXTURE14                           0x84CE\n#define GL_TEXTURE15                           0x84CF\n#define GL_TEXTURE16                           0x84D0\n#define GL_TEXTURE17                           0x84D1\n#define GL_TEXTURE18                           0x84D2\n#define GL_TEXTURE19                           0x84D3\n#define GL_TEXTURE20                           0x84D4\n#define GL_TEXTURE21                           0x84D5\n#define GL_TEXTURE22                           0x84D6\n#define GL_TEXTURE23                           0x84D7\n#define GL_TEXTURE24                           0x84D8\n#define GL_TEXTURE25                           0x84D9\n#define GL_TEXTURE26                           0x84DA\n#define GL_TEXTURE27                           0x84DB\n#define GL_TEXTURE28                           0x84DC\n#define GL_TEXTURE29                           0x84DD\n#define GL_TEXTURE30                           0x84DE\n#define GL_TEXTURE31                           0x84DF\n#define GL_ACTIVE_TEXTURE                      0x84E0\n#define GL_MULTISAMPLE                         0x809D\n#define GL_SAMPLE_ALPHA_TO_COVERAGE            0x809E\n#define GL_SAMPLE_ALPHA_TO_ONE                 0x809F\n#define GL_SAMPLE_COVERAGE                     0x80A0\n#define GL_SAMPLE_BUFFERS                      0x80A8\n#define GL_SAMPLES                             0x80A9\n#define GL_SAMPLE_COVERAGE_VALUE               0x80AA\n#define GL_SAMPLE_COVERAGE_INVERT              0x80AB\n#define GL_TEXTURE_CUBE_MAP                    0x8513\n#define GL_TEXTURE_BINDING_CUBE_MAP            0x8514\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_X         0x8515\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X         0x8516\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y         0x8517\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y         0x8518\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z         0x8519\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z         0x851A\n#define GL_PROXY_TEXTURE_CUBE_MAP              0x851B\n#define GL_MAX_CUBE_MAP_TEXTURE_SIZE           0x851C\n#define GL_COMPRESSED_RGB                      0x84ED\n#define GL_COMPRESSED_RGBA                     0x84EE\n#define GL_TEXTURE_COMPRESSION_HINT            0x84EF\n#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE       0x86A0\n#define GL_TEXTURE_COMPRESSED                  0x86A1\n#define GL_NUM_COMPRESSED_TEXTURE_FORMATS      0x86A2\n#define GL_COMPRESSED_TEXTURE_FORMATS          0x86A3\n#define GL_CLAMP_TO_BORDER                     0x812D\n#define GL_CLIENT_ACTIVE_TEXTURE               0x84E1\n#define GL_MAX_TEXTURE_UNITS                   0x84E2\n#define GL_TRANSPOSE_MODELVIEW_MATRIX          0x84E3\n#define GL_TRANSPOSE_PROJECTION_MATRIX         0x84E4\n#define GL_TRANSPOSE_TEXTURE_MATRIX            0x84E5\n#define GL_TRANSPOSE_COLOR_MATRIX              0x84E6\n#define GL_MULTISAMPLE_BIT                     0x20000000\n#define GL_NORMAL_MAP                          0x8511\n#define GL_REFLECTION_MAP                      0x8512\n#define GL_COMPRESSED_ALPHA                    0x84E9\n#define GL_COMPRESSED_LUMINANCE                0x84EA\n#define GL_COMPRESSED_LUMINANCE_ALPHA          0x84EB\n#define GL_COMPRESSED_INTENSITY                0x84EC\n#define GL_COMBINE                             0x8570\n#define GL_COMBINE_RGB                         0x8571\n#define GL_COMBINE_ALPHA                       0x8572\n#define GL_SOURCE0_RGB                         0x8580\n#define GL_SOURCE1_RGB                         0x8581\n#define GL_SOURCE2_RGB                         0x8582\n#define GL_SOURCE0_ALPHA                       0x8588\n#define GL_SOURCE1_ALPHA                       0x8589\n#define GL_SOURCE2_ALPHA                       0x858A\n#define GL_OPERAND0_RGB                        0x8590\n#define GL_OPERAND1_RGB                        0x8591\n#define GL_OPERAND2_RGB                        0x8592\n#define GL_OPERAND0_ALPHA                      0x8598\n#define GL_OPERAND1_ALPHA                      0x8599\n#define GL_OPERAND2_ALPHA                      0x859A\n#define GL_RGB_SCALE                           0x8573\n#define GL_ADD_SIGNED                          0x8574\n#define GL_INTERPOLATE                         0x8575\n#define GL_SUBTRACT                            0x84E7\n#define GL_CONSTANT                            0x8576\n#define GL_PRIMARY_COLOR                       0x8577\n#define GL_PREVIOUS                            0x8578\n#define GL_DOT3_RGB                            0x86AE\n#define GL_DOT3_RGBA                           0x86AF\ntypedef void (APIENTRYP pfn_glActiveTexture) (GLenum);\nextern pfn_glActiveTexture fp_glActiveTexture;\ntypedef void (APIENTRYP pfn_glSampleCoverage) (GLfloat, GLboolean);\nextern pfn_glSampleCoverage fp_glSampleCoverage;\ntypedef void (APIENTRYP pfn_glCompressedTexImage3D) (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const void*);\nextern pfn_glCompressedTexImage3D fp_glCompressedTexImage3D;\ntypedef void (APIENTRYP pfn_glCompressedTexImage2D) (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const void*);\nextern pfn_glCompressedTexImage2D fp_glCompressedTexImage2D;\ntypedef void (APIENTRYP pfn_glCompressedTexImage1D) (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const void*);\nextern pfn_glCompressedTexImage1D fp_glCompressedTexImage1D;\ntypedef void (APIENTRYP pfn_glCompressedTexSubImage3D) (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const void*);\nextern pfn_glCompressedTexSubImage3D fp_glCompressedTexSubImage3D;\ntypedef void (APIENTRYP pfn_glCompressedTexSubImage2D) (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const void*);\nextern pfn_glCompressedTexSubImage2D fp_glCompressedTexSubImage2D;\ntypedef void (APIENTRYP pfn_glCompressedTexSubImage1D) (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const void*);\nextern pfn_glCompressedTexSubImage1D fp_glCompressedTexSubImage1D;\ntypedef void (APIENTRYP pfn_glGetCompressedTexImage) (GLenum, GLint, void*);\nextern pfn_glGetCompressedTexImage fp_glGetCompressedTexImage;\ntypedef void (APIENTRYP pfn_glClientActiveTexture) (GLenum);\nextern pfn_glClientActiveTexture fp_glClientActiveTexture;\ntypedef void (APIENTRYP pfn_glMultiTexCoord1d) (GLenum, GLdouble);\nextern pfn_glMultiTexCoord1d fp_glMultiTexCoord1d;\ntypedef void (APIENTRYP pfn_glMultiTexCoord1dv) (GLenum, const GLdouble*);\nextern pfn_glMultiTexCoord1dv fp_glMultiTexCoord1dv;\ntypedef void (APIENTRYP pfn_glMultiTexCoord1f) (GLenum, GLfloat);\nextern pfn_glMultiTexCoord1f fp_glMultiTexCoord1f;\ntypedef void (APIENTRYP pfn_glMultiTexCoord1fv) (GLenum, const GLfloat*);\nextern pfn_glMultiTexCoord1fv fp_glMultiTexCoord1fv;\ntypedef void (APIENTRYP pfn_glMultiTexCoord1i) (GLenum, GLint);\nextern pfn_glMultiTexCoord1i fp_glMultiTexCoord1i;\ntypedef void (APIENTRYP pfn_glMultiTexCoord1iv) (GLenum, const GLint*);\nextern pfn_glMultiTexCoord1iv fp_glMultiTexCoord1iv;\ntypedef void (APIENTRYP pfn_glMultiTexCoord1s) (GLenum, GLshort);\nextern pfn_glMultiTexCoord1s fp_glMultiTexCoord1s;\ntypedef void (APIENTRYP pfn_glMultiTexCoord1sv) (GLenum, const GLshort*);\nextern pfn_glMultiTexCoord1sv fp_glMultiTexCoord1sv;\ntypedef void (APIENTRYP pfn_glMultiTexCoord2d) (GLenum, GLdouble, GLdouble);\nextern pfn_glMultiTexCoord2d fp_glMultiTexCoord2d;\ntypedef void (APIENTRYP pfn_glMultiTexCoord2dv) (GLenum, const GLdouble*);\nextern pfn_glMultiTexCoord2dv fp_glMultiTexCoord2dv;\ntypedef void (APIENTRYP pfn_glMultiTexCoord2f) (GLenum, GLfloat, GLfloat);\nextern pfn_glMultiTexCoord2f fp_glMultiTexCoord2f;\ntypedef void (APIENTRYP pfn_glMultiTexCoord2fv) (GLenum, const GLfloat*);\nextern pfn_glMultiTexCoord2fv fp_glMultiTexCoord2fv;\ntypedef void (APIENTRYP pfn_glMultiTexCoord2i) (GLenum, GLint, GLint);\nextern pfn_glMultiTexCoord2i fp_glMultiTexCoord2i;\ntypedef void (APIENTRYP pfn_glMultiTexCoord2iv) (GLenum, const GLint*);\nextern pfn_glMultiTexCoord2iv fp_glMultiTexCoord2iv;\ntypedef void (APIENTRYP pfn_glMultiTexCoord2s) (GLenum, GLshort, GLshort);\nextern pfn_glMultiTexCoord2s fp_glMultiTexCoord2s;\ntypedef void (APIENTRYP pfn_glMultiTexCoord2sv) (GLenum, const GLshort*);\nextern pfn_glMultiTexCoord2sv fp_glMultiTexCoord2sv;\ntypedef void (APIENTRYP pfn_glMultiTexCoord3d) (GLenum, GLdouble, GLdouble, GLdouble);\nextern pfn_glMultiTexCoord3d fp_glMultiTexCoord3d;\ntypedef void (APIENTRYP pfn_glMultiTexCoord3dv) (GLenum, const GLdouble*);\nextern pfn_glMultiTexCoord3dv fp_glMultiTexCoord3dv;\ntypedef void (APIENTRYP pfn_glMultiTexCoord3f) (GLenum, GLfloat, GLfloat, GLfloat);\nextern pfn_glMultiTexCoord3f fp_glMultiTexCoord3f;\ntypedef void (APIENTRYP pfn_glMultiTexCoord3fv) (GLenum, const GLfloat*);\nextern pfn_glMultiTexCoord3fv fp_glMultiTexCoord3fv;\ntypedef void (APIENTRYP pfn_glMultiTexCoord3i) (GLenum, GLint, GLint, GLint);\nextern pfn_glMultiTexCoord3i fp_glMultiTexCoord3i;\ntypedef void (APIENTRYP pfn_glMultiTexCoord3iv) (GLenum, const GLint*);\nextern pfn_glMultiTexCoord3iv fp_glMultiTexCoord3iv;\ntypedef void (APIENTRYP pfn_glMultiTexCoord3s) (GLenum, GLshort, GLshort, GLshort);\nextern pfn_glMultiTexCoord3s fp_glMultiTexCoord3s;\ntypedef void (APIENTRYP pfn_glMultiTexCoord3sv) (GLenum, const GLshort*);\nextern pfn_glMultiTexCoord3sv fp_glMultiTexCoord3sv;\ntypedef void (APIENTRYP pfn_glMultiTexCoord4d) (GLenum, GLdouble, GLdouble, GLdouble, GLdouble);\nextern pfn_glMultiTexCoord4d fp_glMultiTexCoord4d;\ntypedef void (APIENTRYP pfn_glMultiTexCoord4dv) (GLenum, const GLdouble*);\nextern pfn_glMultiTexCoord4dv fp_glMultiTexCoord4dv;\ntypedef void (APIENTRYP pfn_glMultiTexCoord4f) (GLenum, GLfloat, GLfloat, GLfloat, GLfloat);\nextern pfn_glMultiTexCoord4f fp_glMultiTexCoord4f;\ntypedef void (APIENTRYP pfn_glMultiTexCoord4fv) (GLenum, const GLfloat*);\nextern pfn_glMultiTexCoord4fv fp_glMultiTexCoord4fv;\ntypedef void (APIENTRYP pfn_glMultiTexCoord4i) (GLenum, GLint, GLint, GLint, GLint);\nextern pfn_glMultiTexCoord4i fp_glMultiTexCoord4i;\ntypedef void (APIENTRYP pfn_glMultiTexCoord4iv) (GLenum, const GLint*);\nextern pfn_glMultiTexCoord4iv fp_glMultiTexCoord4iv;\ntypedef void (APIENTRYP pfn_glMultiTexCoord4s) (GLenum, GLshort, GLshort, GLshort, GLshort);\nextern pfn_glMultiTexCoord4s fp_glMultiTexCoord4s;\ntypedef void (APIENTRYP pfn_glMultiTexCoord4sv) (GLenum, const GLshort*);\nextern pfn_glMultiTexCoord4sv fp_glMultiTexCoord4sv;\ntypedef void (APIENTRYP pfn_glLoadTransposeMatrixf) (const GLfloat*);\nextern pfn_glLoadTransposeMatrixf fp_glLoadTransposeMatrixf;\ntypedef void (APIENTRYP pfn_glLoadTransposeMatrixd) (const GLdouble*);\nextern pfn_glLoadTransposeMatrixd fp_glLoadTransposeMatrixd;\ntypedef void (APIENTRYP pfn_glMultTransposeMatrixf) (const GLfloat*);\nextern pfn_glMultTransposeMatrixf fp_glMultTransposeMatrixf;\ntypedef void (APIENTRYP pfn_glMultTransposeMatrixd) (const GLdouble*);\nextern pfn_glMultTransposeMatrixd fp_glMultTransposeMatrixd;\n\n /* GL_VERSION_1_4 */\nextern GLboolean GLAD_VERSION_1_4;\n#define GL_BLEND_DST_RGB                       0x80C8\n#define GL_BLEND_SRC_RGB                       0x80C9\n#define GL_BLEND_DST_ALPHA                     0x80CA\n#define GL_BLEND_SRC_ALPHA                     0x80CB\n#define GL_POINT_FADE_THRESHOLD_SIZE           0x8128\n#define GL_DEPTH_COMPONENT16                   0x81A5\n#define GL_DEPTH_COMPONENT24                   0x81A6\n#define GL_DEPTH_COMPONENT32                   0x81A7\n#define GL_MIRRORED_REPEAT                     0x8370\n#define GL_MAX_TEXTURE_LOD_BIAS                0x84FD\n#define GL_TEXTURE_LOD_BIAS                    0x8501\n#define GL_INCR_WRAP                           0x8507\n#define GL_DECR_WRAP                           0x8508\n#define GL_TEXTURE_DEPTH_SIZE                  0x884A\n#define GL_TEXTURE_COMPARE_MODE                0x884C\n#define GL_TEXTURE_COMPARE_FUNC                0x884D\n#define GL_POINT_SIZE_MIN                      0x8126\n#define GL_POINT_SIZE_MAX                      0x8127\n#define GL_POINT_DISTANCE_ATTENUATION          0x8129\n#define GL_GENERATE_MIPMAP                     0x8191\n#define GL_GENERATE_MIPMAP_HINT                0x8192\n#define GL_FOG_COORDINATE_SOURCE               0x8450\n#define GL_FOG_COORDINATE                      0x8451\n#define GL_FRAGMENT_DEPTH                      0x8452\n#define GL_CURRENT_FOG_COORDINATE              0x8453\n#define GL_FOG_COORDINATE_ARRAY_TYPE           0x8454\n#define GL_FOG_COORDINATE_ARRAY_STRIDE         0x8455\n#define GL_FOG_COORDINATE_ARRAY_POINTER        0x8456\n#define GL_FOG_COORDINATE_ARRAY                0x8457\n#define GL_COLOR_SUM                           0x8458\n#define GL_CURRENT_SECONDARY_COLOR             0x8459\n#define GL_SECONDARY_COLOR_ARRAY_SIZE          0x845A\n#define GL_SECONDARY_COLOR_ARRAY_TYPE          0x845B\n#define GL_SECONDARY_COLOR_ARRAY_STRIDE        0x845C\n#define GL_SECONDARY_COLOR_ARRAY_POINTER       0x845D\n#define GL_SECONDARY_COLOR_ARRAY               0x845E\n#define GL_TEXTURE_FILTER_CONTROL              0x8500\n#define GL_DEPTH_TEXTURE_MODE                  0x884B\n#define GL_COMPARE_R_TO_TEXTURE                0x884E\n#define GL_FUNC_ADD                            0x8006\n#define GL_FUNC_SUBTRACT                       0x800A\n#define GL_FUNC_REVERSE_SUBTRACT               0x800B\n#define GL_MIN                                 0x8007\n#define GL_MAX                                 0x8008\n#define GL_CONSTANT_COLOR                      0x8001\n#define GL_ONE_MINUS_CONSTANT_COLOR            0x8002\n#define GL_CONSTANT_ALPHA                      0x8003\n#define GL_ONE_MINUS_CONSTANT_ALPHA            0x8004\ntypedef void (APIENTRYP pfn_glBlendFuncSeparate) (GLenum, GLenum, GLenum, GLenum);\nextern pfn_glBlendFuncSeparate fp_glBlendFuncSeparate;\ntypedef void (APIENTRYP pfn_glMultiDrawArrays) (GLenum, const GLint*, const GLsizei*, GLsizei);\nextern pfn_glMultiDrawArrays fp_glMultiDrawArrays;\ntypedef void (APIENTRYP pfn_glMultiDrawElements) (GLenum, const GLsizei*, GLenum, const void**, GLsizei);\nextern pfn_glMultiDrawElements fp_glMultiDrawElements;\ntypedef void (APIENTRYP pfn_glPointParameterf) (GLenum, GLfloat);\nextern pfn_glPointParameterf fp_glPointParameterf;\ntypedef void (APIENTRYP pfn_glPointParameterfv) (GLenum, const GLfloat*);\nextern pfn_glPointParameterfv fp_glPointParameterfv;\ntypedef void (APIENTRYP pfn_glPointParameteri) (GLenum, GLint);\nextern pfn_glPointParameteri fp_glPointParameteri;\ntypedef void (APIENTRYP pfn_glPointParameteriv) (GLenum, const GLint*);\nextern pfn_glPointParameteriv fp_glPointParameteriv;\ntypedef void (APIENTRYP pfn_glFogCoordf) (GLfloat);\nextern pfn_glFogCoordf fp_glFogCoordf;\ntypedef void (APIENTRYP pfn_glFogCoordfv) (const GLfloat*);\nextern pfn_glFogCoordfv fp_glFogCoordfv;\ntypedef void (APIENTRYP pfn_glFogCoordd) (GLdouble);\nextern pfn_glFogCoordd fp_glFogCoordd;\ntypedef void (APIENTRYP pfn_glFogCoorddv) (const GLdouble*);\nextern pfn_glFogCoorddv fp_glFogCoorddv;\ntypedef void (APIENTRYP pfn_glFogCoordPointer) (GLenum, GLsizei, const void*);\nextern pfn_glFogCoordPointer fp_glFogCoordPointer;\ntypedef void (APIENTRYP pfn_glSecondaryColor3b) (GLbyte, GLbyte, GLbyte);\nextern pfn_glSecondaryColor3b fp_glSecondaryColor3b;\ntypedef void (APIENTRYP pfn_glSecondaryColor3bv) (const GLbyte*);\nextern pfn_glSecondaryColor3bv fp_glSecondaryColor3bv;\ntypedef void (APIENTRYP pfn_glSecondaryColor3d) (GLdouble, GLdouble, GLdouble);\nextern pfn_glSecondaryColor3d fp_glSecondaryColor3d;\ntypedef void (APIENTRYP pfn_glSecondaryColor3dv) (const GLdouble*);\nextern pfn_glSecondaryColor3dv fp_glSecondaryColor3dv;\ntypedef void (APIENTRYP pfn_glSecondaryColor3f) (GLfloat, GLfloat, GLfloat);\nextern pfn_glSecondaryColor3f fp_glSecondaryColor3f;\ntypedef void (APIENTRYP pfn_glSecondaryColor3fv) (const GLfloat*);\nextern pfn_glSecondaryColor3fv fp_glSecondaryColor3fv;\ntypedef void (APIENTRYP pfn_glSecondaryColor3i) (GLint, GLint, GLint);\nextern pfn_glSecondaryColor3i fp_glSecondaryColor3i;\ntypedef void (APIENTRYP pfn_glSecondaryColor3iv) (const GLint*);\nextern pfn_glSecondaryColor3iv fp_glSecondaryColor3iv;\ntypedef void (APIENTRYP pfn_glSecondaryColor3s) (GLshort, GLshort, GLshort);\nextern pfn_glSecondaryColor3s fp_glSecondaryColor3s;\ntypedef void (APIENTRYP pfn_glSecondaryColor3sv) (const GLshort*);\nextern pfn_glSecondaryColor3sv fp_glSecondaryColor3sv;\ntypedef void (APIENTRYP pfn_glSecondaryColor3ub) (GLubyte, GLubyte, GLubyte);\nextern pfn_glSecondaryColor3ub fp_glSecondaryColor3ub;\ntypedef void (APIENTRYP pfn_glSecondaryColor3ubv) (const GLubyte*);\nextern pfn_glSecondaryColor3ubv fp_glSecondaryColor3ubv;\ntypedef void (APIENTRYP pfn_glSecondaryColor3ui) (GLuint, GLuint, GLuint);\nextern pfn_glSecondaryColor3ui fp_glSecondaryColor3ui;\ntypedef void (APIENTRYP pfn_glSecondaryColor3uiv) (const GLuint*);\nextern pfn_glSecondaryColor3uiv fp_glSecondaryColor3uiv;\ntypedef void (APIENTRYP pfn_glSecondaryColor3us) (GLushort, GLushort, GLushort);\nextern pfn_glSecondaryColor3us fp_glSecondaryColor3us;\ntypedef void (APIENTRYP pfn_glSecondaryColor3usv) (const GLushort*);\nextern pfn_glSecondaryColor3usv fp_glSecondaryColor3usv;\ntypedef void (APIENTRYP pfn_glSecondaryColorPointer) (GLint, GLenum, GLsizei, const void*);\nextern pfn_glSecondaryColorPointer fp_glSecondaryColorPointer;\ntypedef void (APIENTRYP pfn_glWindowPos2d) (GLdouble, GLdouble);\nextern pfn_glWindowPos2d fp_glWindowPos2d;\ntypedef void (APIENTRYP pfn_glWindowPos2dv) (const GLdouble*);\nextern pfn_glWindowPos2dv fp_glWindowPos2dv;\ntypedef void (APIENTRYP pfn_glWindowPos2f) (GLfloat, GLfloat);\nextern pfn_glWindowPos2f fp_glWindowPos2f;\ntypedef void (APIENTRYP pfn_glWindowPos2fv) (const GLfloat*);\nextern pfn_glWindowPos2fv fp_glWindowPos2fv;\ntypedef void (APIENTRYP pfn_glWindowPos2i) (GLint, GLint);\nextern pfn_glWindowPos2i fp_glWindowPos2i;\ntypedef void (APIENTRYP pfn_glWindowPos2iv) (const GLint*);\nextern pfn_glWindowPos2iv fp_glWindowPos2iv;\ntypedef void (APIENTRYP pfn_glWindowPos2s) (GLshort, GLshort);\nextern pfn_glWindowPos2s fp_glWindowPos2s;\ntypedef void (APIENTRYP pfn_glWindowPos2sv) (const GLshort*);\nextern pfn_glWindowPos2sv fp_glWindowPos2sv;\ntypedef void (APIENTRYP pfn_glWindowPos3d) (GLdouble, GLdouble, GLdouble);\nextern pfn_glWindowPos3d fp_glWindowPos3d;\ntypedef void (APIENTRYP pfn_glWindowPos3dv) (const GLdouble*);\nextern pfn_glWindowPos3dv fp_glWindowPos3dv;\ntypedef void (APIENTRYP pfn_glWindowPos3f) (GLfloat, GLfloat, GLfloat);\nextern pfn_glWindowPos3f fp_glWindowPos3f;\ntypedef void (APIENTRYP pfn_glWindowPos3fv) (const GLfloat*);\nextern pfn_glWindowPos3fv fp_glWindowPos3fv;\ntypedef void (APIENTRYP pfn_glWindowPos3i) (GLint, GLint, GLint);\nextern pfn_glWindowPos3i fp_glWindowPos3i;\ntypedef void (APIENTRYP pfn_glWindowPos3iv) (const GLint*);\nextern pfn_glWindowPos3iv fp_glWindowPos3iv;\ntypedef void (APIENTRYP pfn_glWindowPos3s) (GLshort, GLshort, GLshort);\nextern pfn_glWindowPos3s fp_glWindowPos3s;\ntypedef void (APIENTRYP pfn_glWindowPos3sv) (const GLshort*);\nextern pfn_glWindowPos3sv fp_glWindowPos3sv;\ntypedef void (APIENTRYP pfn_glBlendColor) (GLfloat, GLfloat, GLfloat, GLfloat);\nextern pfn_glBlendColor fp_glBlendColor;\ntypedef void (APIENTRYP pfn_glBlendEquation) (GLenum);\nextern pfn_glBlendEquation fp_glBlendEquation;\n\n /* GL_VERSION_1_5 */\nextern GLboolean GLAD_VERSION_1_5;\n#define GL_BUFFER_SIZE                         0x8764\n#define GL_BUFFER_USAGE                        0x8765\n#define GL_QUERY_COUNTER_BITS                  0x8864\n#define GL_CURRENT_QUERY                       0x8865\n#define GL_QUERY_RESULT                        0x8866\n#define GL_QUERY_RESULT_AVAILABLE              0x8867\n#define GL_ARRAY_BUFFER                        0x8892\n#define GL_ELEMENT_ARRAY_BUFFER                0x8893\n#define GL_ARRAY_BUFFER_BINDING                0x8894\n#define GL_ELEMENT_ARRAY_BUFFER_BINDING        0x8895\n#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING  0x889F\n#define GL_READ_ONLY                           0x88B8\n#define GL_WRITE_ONLY                          0x88B9\n#define GL_READ_WRITE                          0x88BA\n#define GL_BUFFER_ACCESS                       0x88BB\n#define GL_BUFFER_MAPPED                       0x88BC\n#define GL_BUFFER_MAP_POINTER                  0x88BD\n#define GL_STREAM_DRAW                         0x88E0\n#define GL_STREAM_READ                         0x88E1\n#define GL_STREAM_COPY                         0x88E2\n#define GL_STATIC_DRAW                         0x88E4\n#define GL_STATIC_READ                         0x88E5\n#define GL_STATIC_COPY                         0x88E6\n#define GL_DYNAMIC_DRAW                        0x88E8\n#define GL_DYNAMIC_READ                        0x88E9\n#define GL_DYNAMIC_COPY                        0x88EA\n#define GL_SAMPLES_PASSED                      0x8914\n#define GL_SRC1_ALPHA                          0x8589\n#define GL_VERTEX_ARRAY_BUFFER_BINDING         0x8896\n#define GL_NORMAL_ARRAY_BUFFER_BINDING         0x8897\n#define GL_COLOR_ARRAY_BUFFER_BINDING          0x8898\n#define GL_INDEX_ARRAY_BUFFER_BINDING          0x8899\n#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING  0x889A\n#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING      0x889B\n#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING  0x889C\n#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING  0x889D\n#define GL_WEIGHT_ARRAY_BUFFER_BINDING         0x889E\n#define GL_FOG_COORD_SRC                       0x8450\n#define GL_FOG_COORD                           0x8451\n#define GL_CURRENT_FOG_COORD                   0x8453\n#define GL_FOG_COORD_ARRAY_TYPE                0x8454\n#define GL_FOG_COORD_ARRAY_STRIDE              0x8455\n#define GL_FOG_COORD_ARRAY_POINTER             0x8456\n#define GL_FOG_COORD_ARRAY                     0x8457\n#define GL_FOG_COORD_ARRAY_BUFFER_BINDING      0x889D\n#define GL_SRC0_RGB                            0x8580\n#define GL_SRC1_RGB                            0x8581\n#define GL_SRC2_RGB                            0x8582\n#define GL_SRC0_ALPHA                          0x8588\n#define GL_SRC2_ALPHA                          0x858A\ntypedef void (APIENTRYP pfn_glGenQueries) (GLsizei, GLuint*);\nextern pfn_glGenQueries fp_glGenQueries;\ntypedef void (APIENTRYP pfn_glDeleteQueries) (GLsizei, const GLuint*);\nextern pfn_glDeleteQueries fp_glDeleteQueries;\ntypedef GLboolean (APIENTRYP pfn_glIsQuery) (GLuint);\nextern pfn_glIsQuery fp_glIsQuery;\ntypedef void (APIENTRYP pfn_glBeginQuery) (GLenum, GLuint);\nextern pfn_glBeginQuery fp_glBeginQuery;\ntypedef void (APIENTRYP pfn_glEndQuery) (GLenum);\nextern pfn_glEndQuery fp_glEndQuery;\ntypedef void (APIENTRYP pfn_glGetQueryiv) (GLenum, GLenum, GLint*);\nextern pfn_glGetQueryiv fp_glGetQueryiv;\ntypedef void (APIENTRYP pfn_glGetQueryObjectiv) (GLuint, GLenum, GLint*);\nextern pfn_glGetQueryObjectiv fp_glGetQueryObjectiv;\ntypedef void (APIENTRYP pfn_glGetQueryObjectuiv) (GLuint, GLenum, GLuint*);\nextern pfn_glGetQueryObjectuiv fp_glGetQueryObjectuiv;\ntypedef void (APIENTRYP pfn_glBindBuffer) (GLenum, GLuint);\nextern pfn_glBindBuffer fp_glBindBuffer;\ntypedef void (APIENTRYP pfn_glDeleteBuffers) (GLsizei, const GLuint*);\nextern pfn_glDeleteBuffers fp_glDeleteBuffers;\ntypedef void (APIENTRYP pfn_glGenBuffers) (GLsizei, GLuint*);\nextern pfn_glGenBuffers fp_glGenBuffers;\ntypedef GLboolean (APIENTRYP pfn_glIsBuffer) (GLuint);\nextern pfn_glIsBuffer fp_glIsBuffer;\ntypedef void (APIENTRYP pfn_glBufferData) (GLenum, GLsizeiptr, const void*, GLenum);\nextern pfn_glBufferData fp_glBufferData;\ntypedef void (APIENTRYP pfn_glBufferSubData) (GLenum, GLintptr, GLsizeiptr, const void*);\nextern pfn_glBufferSubData fp_glBufferSubData;\ntypedef void (APIENTRYP pfn_glGetBufferSubData) (GLenum, GLintptr, GLsizeiptr, void*);\nextern pfn_glGetBufferSubData fp_glGetBufferSubData;\ntypedef void* (APIENTRYP pfn_glMapBuffer) (GLenum, GLenum);\nextern pfn_glMapBuffer fp_glMapBuffer;\ntypedef GLboolean (APIENTRYP pfn_glUnmapBuffer) (GLenum);\nextern pfn_glUnmapBuffer fp_glUnmapBuffer;\ntypedef void (APIENTRYP pfn_glGetBufferParameteriv) (GLenum, GLenum, GLint*);\nextern pfn_glGetBufferParameteriv fp_glGetBufferParameteriv;\ntypedef void (APIENTRYP pfn_glGetBufferPointerv) (GLenum, GLenum, void**);\nextern pfn_glGetBufferPointerv fp_glGetBufferPointerv;\n\n /* GL_VERSION_2_0 */\nextern GLboolean GLAD_VERSION_2_0;\n#define GL_BLEND_EQUATION_RGB                  0x8009\n#define GL_VERTEX_ATTRIB_ARRAY_ENABLED         0x8622\n#define GL_VERTEX_ATTRIB_ARRAY_SIZE            0x8623\n#define GL_VERTEX_ATTRIB_ARRAY_STRIDE          0x8624\n#define GL_VERTEX_ATTRIB_ARRAY_TYPE            0x8625\n#define GL_CURRENT_VERTEX_ATTRIB               0x8626\n#define GL_VERTEX_PROGRAM_POINT_SIZE           0x8642\n#define GL_VERTEX_ATTRIB_ARRAY_POINTER         0x8645\n#define GL_STENCIL_BACK_FUNC                   0x8800\n#define GL_STENCIL_BACK_FAIL                   0x8801\n#define GL_STENCIL_BACK_PASS_DEPTH_FAIL        0x8802\n#define GL_STENCIL_BACK_PASS_DEPTH_PASS        0x8803\n#define GL_MAX_DRAW_BUFFERS                    0x8824\n#define GL_DRAW_BUFFER0                        0x8825\n#define GL_DRAW_BUFFER1                        0x8826\n#define GL_DRAW_BUFFER2                        0x8827\n#define GL_DRAW_BUFFER3                        0x8828\n#define GL_DRAW_BUFFER4                        0x8829\n#define GL_DRAW_BUFFER5                        0x882A\n#define GL_DRAW_BUFFER6                        0x882B\n#define GL_DRAW_BUFFER7                        0x882C\n#define GL_DRAW_BUFFER8                        0x882D\n#define GL_DRAW_BUFFER9                        0x882E\n#define GL_DRAW_BUFFER10                       0x882F\n#define GL_DRAW_BUFFER11                       0x8830\n#define GL_DRAW_BUFFER12                       0x8831\n#define GL_DRAW_BUFFER13                       0x8832\n#define GL_DRAW_BUFFER14                       0x8833\n#define GL_DRAW_BUFFER15                       0x8834\n#define GL_BLEND_EQUATION_ALPHA                0x883D\n#define GL_MAX_VERTEX_ATTRIBS                  0x8869\n#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED      0x886A\n#define GL_MAX_TEXTURE_IMAGE_UNITS             0x8872\n#define GL_FRAGMENT_SHADER                     0x8B30\n#define GL_VERTEX_SHADER                       0x8B31\n#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS     0x8B49\n#define GL_MAX_VERTEX_UNIFORM_COMPONENTS       0x8B4A\n#define GL_MAX_VARYING_FLOATS                  0x8B4B\n#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS      0x8B4C\n#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS    0x8B4D\n#define GL_SHADER_TYPE                         0x8B4F\n#define GL_FLOAT_VEC2                          0x8B50\n#define GL_FLOAT_VEC3                          0x8B51\n#define GL_FLOAT_VEC4                          0x8B52\n#define GL_INT_VEC2                            0x8B53\n#define GL_INT_VEC3                            0x8B54\n#define GL_INT_VEC4                            0x8B55\n#define GL_BOOL                                0x8B56\n#define GL_BOOL_VEC2                           0x8B57\n#define GL_BOOL_VEC3                           0x8B58\n#define GL_BOOL_VEC4                           0x8B59\n#define GL_FLOAT_MAT2                          0x8B5A\n#define GL_FLOAT_MAT3                          0x8B5B\n#define GL_FLOAT_MAT4                          0x8B5C\n#define GL_SAMPLER_1D                          0x8B5D\n#define GL_SAMPLER_2D                          0x8B5E\n#define GL_SAMPLER_3D                          0x8B5F\n#define GL_SAMPLER_CUBE                        0x8B60\n#define GL_SAMPLER_1D_SHADOW                   0x8B61\n#define GL_SAMPLER_2D_SHADOW                   0x8B62\n#define GL_DELETE_STATUS                       0x8B80\n#define GL_COMPILE_STATUS                      0x8B81\n#define GL_LINK_STATUS                         0x8B82\n#define GL_VALIDATE_STATUS                     0x8B83\n#define GL_INFO_LOG_LENGTH                     0x8B84\n#define GL_ATTACHED_SHADERS                    0x8B85\n#define GL_ACTIVE_UNIFORMS                     0x8B86\n#define GL_ACTIVE_UNIFORM_MAX_LENGTH           0x8B87\n#define GL_SHADER_SOURCE_LENGTH                0x8B88\n#define GL_ACTIVE_ATTRIBUTES                   0x8B89\n#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH         0x8B8A\n#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT     0x8B8B\n#define GL_SHADING_LANGUAGE_VERSION            0x8B8C\n#define GL_CURRENT_PROGRAM                     0x8B8D\n#define GL_POINT_SPRITE_COORD_ORIGIN           0x8CA0\n#define GL_LOWER_LEFT                          0x8CA1\n#define GL_UPPER_LEFT                          0x8CA2\n#define GL_STENCIL_BACK_REF                    0x8CA3\n#define GL_STENCIL_BACK_VALUE_MASK             0x8CA4\n#define GL_STENCIL_BACK_WRITEMASK              0x8CA5\n#define GL_VERTEX_PROGRAM_TWO_SIDE             0x8643\n#define GL_POINT_SPRITE                        0x8861\n#define GL_COORD_REPLACE                       0x8862\n#define GL_MAX_TEXTURE_COORDS                  0x8871\ntypedef void (APIENTRYP pfn_glBlendEquationSeparate) (GLenum, GLenum);\nextern pfn_glBlendEquationSeparate fp_glBlendEquationSeparate;\ntypedef void (APIENTRYP pfn_glDrawBuffers) (GLsizei, const GLenum*);\nextern pfn_glDrawBuffers fp_glDrawBuffers;\ntypedef void (APIENTRYP pfn_glStencilOpSeparate) (GLenum, GLenum, GLenum, GLenum);\nextern pfn_glStencilOpSeparate fp_glStencilOpSeparate;\ntypedef void (APIENTRYP pfn_glStencilFuncSeparate) (GLenum, GLenum, GLint, GLuint);\nextern pfn_glStencilFuncSeparate fp_glStencilFuncSeparate;\ntypedef void (APIENTRYP pfn_glStencilMaskSeparate) (GLenum, GLuint);\nextern pfn_glStencilMaskSeparate fp_glStencilMaskSeparate;\ntypedef void (APIENTRYP pfn_glAttachShader) (GLuint, GLuint);\nextern pfn_glAttachShader fp_glAttachShader;\ntypedef void (APIENTRYP pfn_glBindAttribLocation) (GLuint, GLuint, const GLchar*);\nextern pfn_glBindAttribLocation fp_glBindAttribLocation;\ntypedef void (APIENTRYP pfn_glCompileShader) (GLuint);\nextern pfn_glCompileShader fp_glCompileShader;\ntypedef GLuint (APIENTRYP pfn_glCreateProgram) ();\nextern pfn_glCreateProgram fp_glCreateProgram;\ntypedef GLuint (APIENTRYP pfn_glCreateShader) (GLenum);\nextern pfn_glCreateShader fp_glCreateShader;\ntypedef void (APIENTRYP pfn_glDeleteProgram) (GLuint);\nextern pfn_glDeleteProgram fp_glDeleteProgram;\ntypedef void (APIENTRYP pfn_glDeleteShader) (GLuint);\nextern pfn_glDeleteShader fp_glDeleteShader;\ntypedef void (APIENTRYP pfn_glDetachShader) (GLuint, GLuint);\nextern pfn_glDetachShader fp_glDetachShader;\ntypedef void (APIENTRYP pfn_glDisableVertexAttribArray) (GLuint);\nextern pfn_glDisableVertexAttribArray fp_glDisableVertexAttribArray;\ntypedef void (APIENTRYP pfn_glEnableVertexAttribArray) (GLuint);\nextern pfn_glEnableVertexAttribArray fp_glEnableVertexAttribArray;\ntypedef void (APIENTRYP pfn_glGetActiveAttrib) (GLuint, GLuint, GLsizei, GLsizei*, GLint*, GLenum*, GLchar*);\nextern pfn_glGetActiveAttrib fp_glGetActiveAttrib;\ntypedef void (APIENTRYP pfn_glGetActiveUniform) (GLuint, GLuint, GLsizei, GLsizei*, GLint*, GLenum*, GLchar*);\nextern pfn_glGetActiveUniform fp_glGetActiveUniform;\ntypedef void (APIENTRYP pfn_glGetAttachedShaders) (GLuint, GLsizei, GLsizei*, GLuint*);\nextern pfn_glGetAttachedShaders fp_glGetAttachedShaders;\ntypedef GLint (APIENTRYP pfn_glGetAttribLocation) (GLuint, const GLchar*);\nextern pfn_glGetAttribLocation fp_glGetAttribLocation;\ntypedef void (APIENTRYP pfn_glGetProgramiv) (GLuint, GLenum, GLint*);\nextern pfn_glGetProgramiv fp_glGetProgramiv;\ntypedef void (APIENTRYP pfn_glGetProgramInfoLog) (GLuint, GLsizei, GLsizei*, GLchar*);\nextern pfn_glGetProgramInfoLog fp_glGetProgramInfoLog;\ntypedef void (APIENTRYP pfn_glGetShaderiv) (GLuint, GLenum, GLint*);\nextern pfn_glGetShaderiv fp_glGetShaderiv;\ntypedef void (APIENTRYP pfn_glGetShaderInfoLog) (GLuint, GLsizei, GLsizei*, GLchar*);\nextern pfn_glGetShaderInfoLog fp_glGetShaderInfoLog;\ntypedef void (APIENTRYP pfn_glGetShaderSource) (GLuint, GLsizei, GLsizei*, GLchar*);\nextern pfn_glGetShaderSource fp_glGetShaderSource;\ntypedef GLint (APIENTRYP pfn_glGetUniformLocation) (GLuint, const GLchar*);\nextern pfn_glGetUniformLocation fp_glGetUniformLocation;\ntypedef void (APIENTRYP pfn_glGetUniformfv) (GLuint, GLint, GLfloat*);\nextern pfn_glGetUniformfv fp_glGetUniformfv;\ntypedef void (APIENTRYP pfn_glGetUniformiv) (GLuint, GLint, GLint*);\nextern pfn_glGetUniformiv fp_glGetUniformiv;\ntypedef void (APIENTRYP pfn_glGetVertexAttribdv) (GLuint, GLenum, GLdouble*);\nextern pfn_glGetVertexAttribdv fp_glGetVertexAttribdv;\ntypedef void (APIENTRYP pfn_glGetVertexAttribfv) (GLuint, GLenum, GLfloat*);\nextern pfn_glGetVertexAttribfv fp_glGetVertexAttribfv;\ntypedef void (APIENTRYP pfn_glGetVertexAttribiv) (GLuint, GLenum, GLint*);\nextern pfn_glGetVertexAttribiv fp_glGetVertexAttribiv;\ntypedef void (APIENTRYP pfn_glGetVertexAttribPointerv) (GLuint, GLenum, void**);\nextern pfn_glGetVertexAttribPointerv fp_glGetVertexAttribPointerv;\ntypedef GLboolean (APIENTRYP pfn_glIsProgram) (GLuint);\nextern pfn_glIsProgram fp_glIsProgram;\ntypedef GLboolean (APIENTRYP pfn_glIsShader) (GLuint);\nextern pfn_glIsShader fp_glIsShader;\ntypedef void (APIENTRYP pfn_glLinkProgram) (GLuint);\nextern pfn_glLinkProgram fp_glLinkProgram;\ntypedef void (APIENTRYP pfn_glShaderSource) (GLuint, GLsizei, const GLchar**, const GLint*);\nextern pfn_glShaderSource fp_glShaderSource;\ntypedef void (APIENTRYP pfn_glUseProgram) (GLuint);\nextern pfn_glUseProgram fp_glUseProgram;\ntypedef void (APIENTRYP pfn_glUniform1f) (GLint, GLfloat);\nextern pfn_glUniform1f fp_glUniform1f;\ntypedef void (APIENTRYP pfn_glUniform2f) (GLint, GLfloat, GLfloat);\nextern pfn_glUniform2f fp_glUniform2f;\ntypedef void (APIENTRYP pfn_glUniform3f) (GLint, GLfloat, GLfloat, GLfloat);\nextern pfn_glUniform3f fp_glUniform3f;\ntypedef void (APIENTRYP pfn_glUniform4f) (GLint, GLfloat, GLfloat, GLfloat, GLfloat);\nextern pfn_glUniform4f fp_glUniform4f;\ntypedef void (APIENTRYP pfn_glUniform1i) (GLint, GLint);\nextern pfn_glUniform1i fp_glUniform1i;\ntypedef void (APIENTRYP pfn_glUniform2i) (GLint, GLint, GLint);\nextern pfn_glUniform2i fp_glUniform2i;\ntypedef void (APIENTRYP pfn_glUniform3i) (GLint, GLint, GLint, GLint);\nextern pfn_glUniform3i fp_glUniform3i;\ntypedef void (APIENTRYP pfn_glUniform4i) (GLint, GLint, GLint, GLint, GLint);\nextern pfn_glUniform4i fp_glUniform4i;\ntypedef void (APIENTRYP pfn_glUniform1fv) (GLint, GLsizei, const GLfloat*);\nextern pfn_glUniform1fv fp_glUniform1fv;\ntypedef void (APIENTRYP pfn_glUniform2fv) (GLint, GLsizei, const GLfloat*);\nextern pfn_glUniform2fv fp_glUniform2fv;\ntypedef void (APIENTRYP pfn_glUniform3fv) (GLint, GLsizei, const GLfloat*);\nextern pfn_glUniform3fv fp_glUniform3fv;\ntypedef void (APIENTRYP pfn_glUniform4fv) (GLint, GLsizei, const GLfloat*);\nextern pfn_glUniform4fv fp_glUniform4fv;\ntypedef void (APIENTRYP pfn_glUniform1iv) (GLint, GLsizei, const GLint*);\nextern pfn_glUniform1iv fp_glUniform1iv;\ntypedef void (APIENTRYP pfn_glUniform2iv) (GLint, GLsizei, const GLint*);\nextern pfn_glUniform2iv fp_glUniform2iv;\ntypedef void (APIENTRYP pfn_glUniform3iv) (GLint, GLsizei, const GLint*);\nextern pfn_glUniform3iv fp_glUniform3iv;\ntypedef void (APIENTRYP pfn_glUniform4iv) (GLint, GLsizei, const GLint*);\nextern pfn_glUniform4iv fp_glUniform4iv;\ntypedef void (APIENTRYP pfn_glUniformMatrix2fv) (GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glUniformMatrix2fv fp_glUniformMatrix2fv;\ntypedef void (APIENTRYP pfn_glUniformMatrix3fv) (GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glUniformMatrix3fv fp_glUniformMatrix3fv;\ntypedef void (APIENTRYP pfn_glUniformMatrix4fv) (GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glUniformMatrix4fv fp_glUniformMatrix4fv;\ntypedef void (APIENTRYP pfn_glValidateProgram) (GLuint);\nextern pfn_glValidateProgram fp_glValidateProgram;\ntypedef void (APIENTRYP pfn_glVertexAttrib1d) (GLuint, GLdouble);\nextern pfn_glVertexAttrib1d fp_glVertexAttrib1d;\ntypedef void (APIENTRYP pfn_glVertexAttrib1dv) (GLuint, const GLdouble*);\nextern pfn_glVertexAttrib1dv fp_glVertexAttrib1dv;\ntypedef void (APIENTRYP pfn_glVertexAttrib1f) (GLuint, GLfloat);\nextern pfn_glVertexAttrib1f fp_glVertexAttrib1f;\ntypedef void (APIENTRYP pfn_glVertexAttrib1fv) (GLuint, const GLfloat*);\nextern pfn_glVertexAttrib1fv fp_glVertexAttrib1fv;\ntypedef void (APIENTRYP pfn_glVertexAttrib1s) (GLuint, GLshort);\nextern pfn_glVertexAttrib1s fp_glVertexAttrib1s;\ntypedef void (APIENTRYP pfn_glVertexAttrib1sv) (GLuint, const GLshort*);\nextern pfn_glVertexAttrib1sv fp_glVertexAttrib1sv;\ntypedef void (APIENTRYP pfn_glVertexAttrib2d) (GLuint, GLdouble, GLdouble);\nextern pfn_glVertexAttrib2d fp_glVertexAttrib2d;\ntypedef void (APIENTRYP pfn_glVertexAttrib2dv) (GLuint, const GLdouble*);\nextern pfn_glVertexAttrib2dv fp_glVertexAttrib2dv;\ntypedef void (APIENTRYP pfn_glVertexAttrib2f) (GLuint, GLfloat, GLfloat);\nextern pfn_glVertexAttrib2f fp_glVertexAttrib2f;\ntypedef void (APIENTRYP pfn_glVertexAttrib2fv) (GLuint, const GLfloat*);\nextern pfn_glVertexAttrib2fv fp_glVertexAttrib2fv;\ntypedef void (APIENTRYP pfn_glVertexAttrib2s) (GLuint, GLshort, GLshort);\nextern pfn_glVertexAttrib2s fp_glVertexAttrib2s;\ntypedef void (APIENTRYP pfn_glVertexAttrib2sv) (GLuint, const GLshort*);\nextern pfn_glVertexAttrib2sv fp_glVertexAttrib2sv;\ntypedef void (APIENTRYP pfn_glVertexAttrib3d) (GLuint, GLdouble, GLdouble, GLdouble);\nextern pfn_glVertexAttrib3d fp_glVertexAttrib3d;\ntypedef void (APIENTRYP pfn_glVertexAttrib3dv) (GLuint, const GLdouble*);\nextern pfn_glVertexAttrib3dv fp_glVertexAttrib3dv;\ntypedef void (APIENTRYP pfn_glVertexAttrib3f) (GLuint, GLfloat, GLfloat, GLfloat);\nextern pfn_glVertexAttrib3f fp_glVertexAttrib3f;\ntypedef void (APIENTRYP pfn_glVertexAttrib3fv) (GLuint, const GLfloat*);\nextern pfn_glVertexAttrib3fv fp_glVertexAttrib3fv;\ntypedef void (APIENTRYP pfn_glVertexAttrib3s) (GLuint, GLshort, GLshort, GLshort);\nextern pfn_glVertexAttrib3s fp_glVertexAttrib3s;\ntypedef void (APIENTRYP pfn_glVertexAttrib3sv) (GLuint, const GLshort*);\nextern pfn_glVertexAttrib3sv fp_glVertexAttrib3sv;\ntypedef void (APIENTRYP pfn_glVertexAttrib4Nbv) (GLuint, const GLbyte*);\nextern pfn_glVertexAttrib4Nbv fp_glVertexAttrib4Nbv;\ntypedef void (APIENTRYP pfn_glVertexAttrib4Niv) (GLuint, const GLint*);\nextern pfn_glVertexAttrib4Niv fp_glVertexAttrib4Niv;\ntypedef void (APIENTRYP pfn_glVertexAttrib4Nsv) (GLuint, const GLshort*);\nextern pfn_glVertexAttrib4Nsv fp_glVertexAttrib4Nsv;\ntypedef void (APIENTRYP pfn_glVertexAttrib4Nub) (GLuint, GLubyte, GLubyte, GLubyte, GLubyte);\nextern pfn_glVertexAttrib4Nub fp_glVertexAttrib4Nub;\ntypedef void (APIENTRYP pfn_glVertexAttrib4Nubv) (GLuint, const GLubyte*);\nextern pfn_glVertexAttrib4Nubv fp_glVertexAttrib4Nubv;\ntypedef void (APIENTRYP pfn_glVertexAttrib4Nuiv) (GLuint, const GLuint*);\nextern pfn_glVertexAttrib4Nuiv fp_glVertexAttrib4Nuiv;\ntypedef void (APIENTRYP pfn_glVertexAttrib4Nusv) (GLuint, const GLushort*);\nextern pfn_glVertexAttrib4Nusv fp_glVertexAttrib4Nusv;\ntypedef void (APIENTRYP pfn_glVertexAttrib4bv) (GLuint, const GLbyte*);\nextern pfn_glVertexAttrib4bv fp_glVertexAttrib4bv;\ntypedef void (APIENTRYP pfn_glVertexAttrib4d) (GLuint, GLdouble, GLdouble, GLdouble, GLdouble);\nextern pfn_glVertexAttrib4d fp_glVertexAttrib4d;\ntypedef void (APIENTRYP pfn_glVertexAttrib4dv) (GLuint, const GLdouble*);\nextern pfn_glVertexAttrib4dv fp_glVertexAttrib4dv;\ntypedef void (APIENTRYP pfn_glVertexAttrib4f) (GLuint, GLfloat, GLfloat, GLfloat, GLfloat);\nextern pfn_glVertexAttrib4f fp_glVertexAttrib4f;\ntypedef void (APIENTRYP pfn_glVertexAttrib4fv) (GLuint, const GLfloat*);\nextern pfn_glVertexAttrib4fv fp_glVertexAttrib4fv;\ntypedef void (APIENTRYP pfn_glVertexAttrib4iv) (GLuint, const GLint*);\nextern pfn_glVertexAttrib4iv fp_glVertexAttrib4iv;\ntypedef void (APIENTRYP pfn_glVertexAttrib4s) (GLuint, GLshort, GLshort, GLshort, GLshort);\nextern pfn_glVertexAttrib4s fp_glVertexAttrib4s;\ntypedef void (APIENTRYP pfn_glVertexAttrib4sv) (GLuint, const GLshort*);\nextern pfn_glVertexAttrib4sv fp_glVertexAttrib4sv;\ntypedef void (APIENTRYP pfn_glVertexAttrib4ubv) (GLuint, const GLubyte*);\nextern pfn_glVertexAttrib4ubv fp_glVertexAttrib4ubv;\ntypedef void (APIENTRYP pfn_glVertexAttrib4uiv) (GLuint, const GLuint*);\nextern pfn_glVertexAttrib4uiv fp_glVertexAttrib4uiv;\ntypedef void (APIENTRYP pfn_glVertexAttrib4usv) (GLuint, const GLushort*);\nextern pfn_glVertexAttrib4usv fp_glVertexAttrib4usv;\ntypedef void (APIENTRYP pfn_glVertexAttribPointer) (GLuint, GLint, GLenum, GLboolean, GLsizei, const void*);\nextern pfn_glVertexAttribPointer fp_glVertexAttribPointer;\n\n /* GL_VERSION_2_1 */\nextern GLboolean GLAD_VERSION_2_1;\n#define GL_PIXEL_PACK_BUFFER                   0x88EB\n#define GL_PIXEL_UNPACK_BUFFER                 0x88EC\n#define GL_PIXEL_PACK_BUFFER_BINDING           0x88ED\n#define GL_PIXEL_UNPACK_BUFFER_BINDING         0x88EF\n#define GL_FLOAT_MAT2x3                        0x8B65\n#define GL_FLOAT_MAT2x4                        0x8B66\n#define GL_FLOAT_MAT3x2                        0x8B67\n#define GL_FLOAT_MAT3x4                        0x8B68\n#define GL_FLOAT_MAT4x2                        0x8B69\n#define GL_FLOAT_MAT4x3                        0x8B6A\n#define GL_SRGB                                0x8C40\n#define GL_SRGB8                               0x8C41\n#define GL_SRGB_ALPHA                          0x8C42\n#define GL_SRGB8_ALPHA8                        0x8C43\n#define GL_COMPRESSED_SRGB                     0x8C48\n#define GL_COMPRESSED_SRGB_ALPHA               0x8C49\n#define GL_CURRENT_RASTER_SECONDARY_COLOR      0x845F\n#define GL_SLUMINANCE_ALPHA                    0x8C44\n#define GL_SLUMINANCE8_ALPHA8                  0x8C45\n#define GL_SLUMINANCE                          0x8C46\n#define GL_SLUMINANCE8                         0x8C47\n#define GL_COMPRESSED_SLUMINANCE               0x8C4A\n#define GL_COMPRESSED_SLUMINANCE_ALPHA         0x8C4B\ntypedef void (APIENTRYP pfn_glUniformMatrix2x3fv) (GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glUniformMatrix2x3fv fp_glUniformMatrix2x3fv;\ntypedef void (APIENTRYP pfn_glUniformMatrix3x2fv) (GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glUniformMatrix3x2fv fp_glUniformMatrix3x2fv;\ntypedef void (APIENTRYP pfn_glUniformMatrix2x4fv) (GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glUniformMatrix2x4fv fp_glUniformMatrix2x4fv;\ntypedef void (APIENTRYP pfn_glUniformMatrix4x2fv) (GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glUniformMatrix4x2fv fp_glUniformMatrix4x2fv;\ntypedef void (APIENTRYP pfn_glUniformMatrix3x4fv) (GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glUniformMatrix3x4fv fp_glUniformMatrix3x4fv;\ntypedef void (APIENTRYP pfn_glUniformMatrix4x3fv) (GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glUniformMatrix4x3fv fp_glUniformMatrix4x3fv;\n\n /* GL_VERSION_3_0 */\nextern GLboolean GLAD_VERSION_3_0;\n#define GL_COMPARE_REF_TO_TEXTURE              0x884E\n#define GL_CLIP_DISTANCE0                      0x3000\n#define GL_CLIP_DISTANCE1                      0x3001\n#define GL_CLIP_DISTANCE2                      0x3002\n#define GL_CLIP_DISTANCE3                      0x3003\n#define GL_CLIP_DISTANCE4                      0x3004\n#define GL_CLIP_DISTANCE5                      0x3005\n#define GL_CLIP_DISTANCE6                      0x3006\n#define GL_CLIP_DISTANCE7                      0x3007\n#define GL_MAX_CLIP_DISTANCES                  0x0D32\n#define GL_MAJOR_VERSION                       0x821B\n#define GL_MINOR_VERSION                       0x821C\n#define GL_NUM_EXTENSIONS                      0x821D\n#define GL_CONTEXT_FLAGS                       0x821E\n#define GL_COMPRESSED_RED                      0x8225\n#define GL_COMPRESSED_RG                       0x8226\n#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT  0x00000001\n#define GL_RGBA32F                             0x8814\n#define GL_RGB32F                              0x8815\n#define GL_RGBA16F                             0x881A\n#define GL_RGB16F                              0x881B\n#define GL_VERTEX_ATTRIB_ARRAY_INTEGER         0x88FD\n#define GL_MAX_ARRAY_TEXTURE_LAYERS            0x88FF\n#define GL_MIN_PROGRAM_TEXEL_OFFSET            0x8904\n#define GL_MAX_PROGRAM_TEXEL_OFFSET            0x8905\n#define GL_CLAMP_READ_COLOR                    0x891C\n#define GL_FIXED_ONLY                          0x891D\n#define GL_MAX_VARYING_COMPONENTS              0x8B4B\n#define GL_TEXTURE_1D_ARRAY                    0x8C18\n#define GL_PROXY_TEXTURE_1D_ARRAY              0x8C19\n#define GL_TEXTURE_2D_ARRAY                    0x8C1A\n#define GL_PROXY_TEXTURE_2D_ARRAY              0x8C1B\n#define GL_TEXTURE_BINDING_1D_ARRAY            0x8C1C\n#define GL_TEXTURE_BINDING_2D_ARRAY            0x8C1D\n#define GL_R11F_G11F_B10F                      0x8C3A\n#define GL_UNSIGNED_INT_10F_11F_11F_REV        0x8C3B\n#define GL_RGB9_E5                             0x8C3D\n#define GL_UNSIGNED_INT_5_9_9_9_REV            0x8C3E\n#define GL_TEXTURE_SHARED_SIZE                 0x8C3F\n#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH  0x8C76\n#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE      0x8C7F\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS  0x8C80\n#define GL_TRANSFORM_FEEDBACK_VARYINGS         0x8C83\n#define GL_TRANSFORM_FEEDBACK_BUFFER_START     0x8C84\n#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE      0x8C85\n#define GL_PRIMITIVES_GENERATED                0x8C87\n#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN  0x8C88\n#define GL_RASTERIZER_DISCARD                  0x8C89\n#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS  0x8C8A\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS  0x8C8B\n#define GL_INTERLEAVED_ATTRIBS                 0x8C8C\n#define GL_SEPARATE_ATTRIBS                    0x8C8D\n#define GL_TRANSFORM_FEEDBACK_BUFFER           0x8C8E\n#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING   0x8C8F\n#define GL_RGBA32UI                            0x8D70\n#define GL_RGB32UI                             0x8D71\n#define GL_RGBA16UI                            0x8D76\n#define GL_RGB16UI                             0x8D77\n#define GL_RGBA8UI                             0x8D7C\n#define GL_RGB8UI                              0x8D7D\n#define GL_RGBA32I                             0x8D82\n#define GL_RGB32I                              0x8D83\n#define GL_RGBA16I                             0x8D88\n#define GL_RGB16I                              0x8D89\n#define GL_RGBA8I                              0x8D8E\n#define GL_RGB8I                               0x8D8F\n#define GL_RED_INTEGER                         0x8D94\n#define GL_GREEN_INTEGER                       0x8D95\n#define GL_BLUE_INTEGER                        0x8D96\n#define GL_RGB_INTEGER                         0x8D98\n#define GL_RGBA_INTEGER                        0x8D99\n#define GL_BGR_INTEGER                         0x8D9A\n#define GL_BGRA_INTEGER                        0x8D9B\n#define GL_SAMPLER_1D_ARRAY                    0x8DC0\n#define GL_SAMPLER_2D_ARRAY                    0x8DC1\n#define GL_SAMPLER_1D_ARRAY_SHADOW             0x8DC3\n#define GL_SAMPLER_2D_ARRAY_SHADOW             0x8DC4\n#define GL_SAMPLER_CUBE_SHADOW                 0x8DC5\n#define GL_UNSIGNED_INT_VEC2                   0x8DC6\n#define GL_UNSIGNED_INT_VEC3                   0x8DC7\n#define GL_UNSIGNED_INT_VEC4                   0x8DC8\n#define GL_INT_SAMPLER_1D                      0x8DC9\n#define GL_INT_SAMPLER_2D                      0x8DCA\n#define GL_INT_SAMPLER_3D                      0x8DCB\n#define GL_INT_SAMPLER_CUBE                    0x8DCC\n#define GL_INT_SAMPLER_1D_ARRAY                0x8DCE\n#define GL_INT_SAMPLER_2D_ARRAY                0x8DCF\n#define GL_UNSIGNED_INT_SAMPLER_1D             0x8DD1\n#define GL_UNSIGNED_INT_SAMPLER_2D             0x8DD2\n#define GL_UNSIGNED_INT_SAMPLER_3D             0x8DD3\n#define GL_UNSIGNED_INT_SAMPLER_CUBE           0x8DD4\n#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY       0x8DD6\n#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY       0x8DD7\n#define GL_QUERY_WAIT                          0x8E13\n#define GL_QUERY_NO_WAIT                       0x8E14\n#define GL_QUERY_BY_REGION_WAIT                0x8E15\n#define GL_QUERY_BY_REGION_NO_WAIT             0x8E16\n#define GL_BUFFER_ACCESS_FLAGS                 0x911F\n#define GL_BUFFER_MAP_LENGTH                   0x9120\n#define GL_BUFFER_MAP_OFFSET                   0x9121\n#define GL_DEPTH_COMPONENT32F                  0x8CAC\n#define GL_DEPTH32F_STENCIL8                   0x8CAD\n#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV      0x8DAD\n#define GL_INVALID_FRAMEBUFFER_OPERATION       0x0506\n#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING  0x8210\n#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE  0x8211\n#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE     0x8212\n#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE   0x8213\n#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE    0x8214\n#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE   0x8215\n#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE   0x8216\n#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE  0x8217\n#define GL_FRAMEBUFFER_DEFAULT                 0x8218\n#define GL_FRAMEBUFFER_UNDEFINED               0x8219\n#define GL_DEPTH_STENCIL_ATTACHMENT            0x821A\n#define GL_MAX_RENDERBUFFER_SIZE               0x84E8\n#define GL_DEPTH_STENCIL                       0x84F9\n#define GL_UNSIGNED_INT_24_8                   0x84FA\n#define GL_DEPTH24_STENCIL8                    0x88F0\n#define GL_TEXTURE_STENCIL_SIZE                0x88F1\n#define GL_TEXTURE_RED_TYPE                    0x8C10\n#define GL_TEXTURE_GREEN_TYPE                  0x8C11\n#define GL_TEXTURE_BLUE_TYPE                   0x8C12\n#define GL_TEXTURE_ALPHA_TYPE                  0x8C13\n#define GL_TEXTURE_DEPTH_TYPE                  0x8C16\n#define GL_UNSIGNED_NORMALIZED                 0x8C17\n#define GL_FRAMEBUFFER_BINDING                 0x8CA6\n#define GL_DRAW_FRAMEBUFFER_BINDING            0x8CA6\n#define GL_RENDERBUFFER_BINDING                0x8CA7\n#define GL_READ_FRAMEBUFFER                    0x8CA8\n#define GL_DRAW_FRAMEBUFFER                    0x8CA9\n#define GL_READ_FRAMEBUFFER_BINDING            0x8CAA\n#define GL_RENDERBUFFER_SAMPLES                0x8CAB\n#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE  0x8CD0\n#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME  0x8CD1\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL  0x8CD2\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE  0x8CD3\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER  0x8CD4\n#define GL_FRAMEBUFFER_COMPLETE                0x8CD5\n#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT   0x8CD6\n#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT  0x8CD7\n#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER  0x8CDB\n#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER  0x8CDC\n#define GL_FRAMEBUFFER_UNSUPPORTED             0x8CDD\n#define GL_MAX_COLOR_ATTACHMENTS               0x8CDF\n#define GL_COLOR_ATTACHMENT0                   0x8CE0\n#define GL_COLOR_ATTACHMENT1                   0x8CE1\n#define GL_COLOR_ATTACHMENT2                   0x8CE2\n#define GL_COLOR_ATTACHMENT3                   0x8CE3\n#define GL_COLOR_ATTACHMENT4                   0x8CE4\n#define GL_COLOR_ATTACHMENT5                   0x8CE5\n#define GL_COLOR_ATTACHMENT6                   0x8CE6\n#define GL_COLOR_ATTACHMENT7                   0x8CE7\n#define GL_COLOR_ATTACHMENT8                   0x8CE8\n#define GL_COLOR_ATTACHMENT9                   0x8CE9\n#define GL_COLOR_ATTACHMENT10                  0x8CEA\n#define GL_COLOR_ATTACHMENT11                  0x8CEB\n#define GL_COLOR_ATTACHMENT12                  0x8CEC\n#define GL_COLOR_ATTACHMENT13                  0x8CED\n#define GL_COLOR_ATTACHMENT14                  0x8CEE\n#define GL_COLOR_ATTACHMENT15                  0x8CEF\n#define GL_COLOR_ATTACHMENT16                  0x8CF0\n#define GL_COLOR_ATTACHMENT17                  0x8CF1\n#define GL_COLOR_ATTACHMENT18                  0x8CF2\n#define GL_COLOR_ATTACHMENT19                  0x8CF3\n#define GL_COLOR_ATTACHMENT20                  0x8CF4\n#define GL_COLOR_ATTACHMENT21                  0x8CF5\n#define GL_COLOR_ATTACHMENT22                  0x8CF6\n#define GL_COLOR_ATTACHMENT23                  0x8CF7\n#define GL_COLOR_ATTACHMENT24                  0x8CF8\n#define GL_COLOR_ATTACHMENT25                  0x8CF9\n#define GL_COLOR_ATTACHMENT26                  0x8CFA\n#define GL_COLOR_ATTACHMENT27                  0x8CFB\n#define GL_COLOR_ATTACHMENT28                  0x8CFC\n#define GL_COLOR_ATTACHMENT29                  0x8CFD\n#define GL_COLOR_ATTACHMENT30                  0x8CFE\n#define GL_COLOR_ATTACHMENT31                  0x8CFF\n#define GL_DEPTH_ATTACHMENT                    0x8D00\n#define GL_STENCIL_ATTACHMENT                  0x8D20\n#define GL_FRAMEBUFFER                         0x8D40\n#define GL_RENDERBUFFER                        0x8D41\n#define GL_RENDERBUFFER_WIDTH                  0x8D42\n#define GL_RENDERBUFFER_HEIGHT                 0x8D43\n#define GL_RENDERBUFFER_INTERNAL_FORMAT        0x8D44\n#define GL_STENCIL_INDEX1                      0x8D46\n#define GL_STENCIL_INDEX4                      0x8D47\n#define GL_STENCIL_INDEX8                      0x8D48\n#define GL_STENCIL_INDEX16                     0x8D49\n#define GL_RENDERBUFFER_RED_SIZE               0x8D50\n#define GL_RENDERBUFFER_GREEN_SIZE             0x8D51\n#define GL_RENDERBUFFER_BLUE_SIZE              0x8D52\n#define GL_RENDERBUFFER_ALPHA_SIZE             0x8D53\n#define GL_RENDERBUFFER_DEPTH_SIZE             0x8D54\n#define GL_RENDERBUFFER_STENCIL_SIZE           0x8D55\n#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE  0x8D56\n#define GL_MAX_SAMPLES                         0x8D57\n#define GL_INDEX                               0x8222\n#define GL_TEXTURE_LUMINANCE_TYPE              0x8C14\n#define GL_TEXTURE_INTENSITY_TYPE              0x8C15\n#define GL_FRAMEBUFFER_SRGB                    0x8DB9\n#define GL_HALF_FLOAT                          0x140B\n#define GL_MAP_READ_BIT                        0x0001\n#define GL_MAP_WRITE_BIT                       0x0002\n#define GL_MAP_INVALIDATE_RANGE_BIT            0x0004\n#define GL_MAP_INVALIDATE_BUFFER_BIT           0x0008\n#define GL_MAP_FLUSH_EXPLICIT_BIT              0x0010\n#define GL_MAP_UNSYNCHRONIZED_BIT              0x0020\n#define GL_COMPRESSED_RED_RGTC1                0x8DBB\n#define GL_COMPRESSED_SIGNED_RED_RGTC1         0x8DBC\n#define GL_COMPRESSED_RG_RGTC2                 0x8DBD\n#define GL_COMPRESSED_SIGNED_RG_RGTC2          0x8DBE\n#define GL_RG                                  0x8227\n#define GL_RG_INTEGER                          0x8228\n#define GL_R8                                  0x8229\n#define GL_R16                                 0x822A\n#define GL_RG8                                 0x822B\n#define GL_RG16                                0x822C\n#define GL_R16F                                0x822D\n#define GL_R32F                                0x822E\n#define GL_RG16F                               0x822F\n#define GL_RG32F                               0x8230\n#define GL_R8I                                 0x8231\n#define GL_R8UI                                0x8232\n#define GL_R16I                                0x8233\n#define GL_R16UI                               0x8234\n#define GL_R32I                                0x8235\n#define GL_R32UI                               0x8236\n#define GL_RG8I                                0x8237\n#define GL_RG8UI                               0x8238\n#define GL_RG16I                               0x8239\n#define GL_RG16UI                              0x823A\n#define GL_RG32I                               0x823B\n#define GL_RG32UI                              0x823C\n#define GL_VERTEX_ARRAY_BINDING                0x85B5\n#define GL_CLAMP_VERTEX_COLOR                  0x891A\n#define GL_CLAMP_FRAGMENT_COLOR                0x891B\n#define GL_ALPHA_INTEGER                       0x8D97\ntypedef void (APIENTRYP pfn_glColorMaski) (GLuint, GLboolean, GLboolean, GLboolean, GLboolean);\nextern pfn_glColorMaski fp_glColorMaski;\ntypedef void (APIENTRYP pfn_glGetBooleani_v) (GLenum, GLuint, GLboolean*);\nextern pfn_glGetBooleani_v fp_glGetBooleani_v;\ntypedef void (APIENTRYP pfn_glGetIntegeri_v) (GLenum, GLuint, GLint*);\nextern pfn_glGetIntegeri_v fp_glGetIntegeri_v;\ntypedef void (APIENTRYP pfn_glEnablei) (GLenum, GLuint);\nextern pfn_glEnablei fp_glEnablei;\ntypedef void (APIENTRYP pfn_glDisablei) (GLenum, GLuint);\nextern pfn_glDisablei fp_glDisablei;\ntypedef GLboolean (APIENTRYP pfn_glIsEnabledi) (GLenum, GLuint);\nextern pfn_glIsEnabledi fp_glIsEnabledi;\ntypedef void (APIENTRYP pfn_glBeginTransformFeedback) (GLenum);\nextern pfn_glBeginTransformFeedback fp_glBeginTransformFeedback;\ntypedef void (APIENTRYP pfn_glEndTransformFeedback) ();\nextern pfn_glEndTransformFeedback fp_glEndTransformFeedback;\ntypedef void (APIENTRYP pfn_glBindBufferRange) (GLenum, GLuint, GLuint, GLintptr, GLsizeiptr);\nextern pfn_glBindBufferRange fp_glBindBufferRange;\ntypedef void (APIENTRYP pfn_glBindBufferBase) (GLenum, GLuint, GLuint);\nextern pfn_glBindBufferBase fp_glBindBufferBase;\ntypedef void (APIENTRYP pfn_glTransformFeedbackVaryings) (GLuint, GLsizei, const GLchar**, GLenum);\nextern pfn_glTransformFeedbackVaryings fp_glTransformFeedbackVaryings;\ntypedef void (APIENTRYP pfn_glGetTransformFeedbackVarying) (GLuint, GLuint, GLsizei, GLsizei*, GLsizei*, GLenum*, GLchar*);\nextern pfn_glGetTransformFeedbackVarying fp_glGetTransformFeedbackVarying;\ntypedef void (APIENTRYP pfn_glClampColor) (GLenum, GLenum);\nextern pfn_glClampColor fp_glClampColor;\ntypedef void (APIENTRYP pfn_glBeginConditionalRender) (GLuint, GLenum);\nextern pfn_glBeginConditionalRender fp_glBeginConditionalRender;\ntypedef void (APIENTRYP pfn_glEndConditionalRender) ();\nextern pfn_glEndConditionalRender fp_glEndConditionalRender;\ntypedef void (APIENTRYP pfn_glVertexAttribIPointer) (GLuint, GLint, GLenum, GLsizei, const void*);\nextern pfn_glVertexAttribIPointer fp_glVertexAttribIPointer;\ntypedef void (APIENTRYP pfn_glGetVertexAttribIiv) (GLuint, GLenum, GLint*);\nextern pfn_glGetVertexAttribIiv fp_glGetVertexAttribIiv;\ntypedef void (APIENTRYP pfn_glGetVertexAttribIuiv) (GLuint, GLenum, GLuint*);\nextern pfn_glGetVertexAttribIuiv fp_glGetVertexAttribIuiv;\ntypedef void (APIENTRYP pfn_glVertexAttribI1i) (GLuint, GLint);\nextern pfn_glVertexAttribI1i fp_glVertexAttribI1i;\ntypedef void (APIENTRYP pfn_glVertexAttribI2i) (GLuint, GLint, GLint);\nextern pfn_glVertexAttribI2i fp_glVertexAttribI2i;\ntypedef void (APIENTRYP pfn_glVertexAttribI3i) (GLuint, GLint, GLint, GLint);\nextern pfn_glVertexAttribI3i fp_glVertexAttribI3i;\ntypedef void (APIENTRYP pfn_glVertexAttribI4i) (GLuint, GLint, GLint, GLint, GLint);\nextern pfn_glVertexAttribI4i fp_glVertexAttribI4i;\ntypedef void (APIENTRYP pfn_glVertexAttribI1ui) (GLuint, GLuint);\nextern pfn_glVertexAttribI1ui fp_glVertexAttribI1ui;\ntypedef void (APIENTRYP pfn_glVertexAttribI2ui) (GLuint, GLuint, GLuint);\nextern pfn_glVertexAttribI2ui fp_glVertexAttribI2ui;\ntypedef void (APIENTRYP pfn_glVertexAttribI3ui) (GLuint, GLuint, GLuint, GLuint);\nextern pfn_glVertexAttribI3ui fp_glVertexAttribI3ui;\ntypedef void (APIENTRYP pfn_glVertexAttribI4ui) (GLuint, GLuint, GLuint, GLuint, GLuint);\nextern pfn_glVertexAttribI4ui fp_glVertexAttribI4ui;\ntypedef void (APIENTRYP pfn_glVertexAttribI1iv) (GLuint, const GLint*);\nextern pfn_glVertexAttribI1iv fp_glVertexAttribI1iv;\ntypedef void (APIENTRYP pfn_glVertexAttribI2iv) (GLuint, const GLint*);\nextern pfn_glVertexAttribI2iv fp_glVertexAttribI2iv;\ntypedef void (APIENTRYP pfn_glVertexAttribI3iv) (GLuint, const GLint*);\nextern pfn_glVertexAttribI3iv fp_glVertexAttribI3iv;\ntypedef void (APIENTRYP pfn_glVertexAttribI4iv) (GLuint, const GLint*);\nextern pfn_glVertexAttribI4iv fp_glVertexAttribI4iv;\ntypedef void (APIENTRYP pfn_glVertexAttribI1uiv) (GLuint, const GLuint*);\nextern pfn_glVertexAttribI1uiv fp_glVertexAttribI1uiv;\ntypedef void (APIENTRYP pfn_glVertexAttribI2uiv) (GLuint, const GLuint*);\nextern pfn_glVertexAttribI2uiv fp_glVertexAttribI2uiv;\ntypedef void (APIENTRYP pfn_glVertexAttribI3uiv) (GLuint, const GLuint*);\nextern pfn_glVertexAttribI3uiv fp_glVertexAttribI3uiv;\ntypedef void (APIENTRYP pfn_glVertexAttribI4uiv) (GLuint, const GLuint*);\nextern pfn_glVertexAttribI4uiv fp_glVertexAttribI4uiv;\ntypedef void (APIENTRYP pfn_glVertexAttribI4bv) (GLuint, const GLbyte*);\nextern pfn_glVertexAttribI4bv fp_glVertexAttribI4bv;\ntypedef void (APIENTRYP pfn_glVertexAttribI4sv) (GLuint, const GLshort*);\nextern pfn_glVertexAttribI4sv fp_glVertexAttribI4sv;\ntypedef void (APIENTRYP pfn_glVertexAttribI4ubv) (GLuint, const GLubyte*);\nextern pfn_glVertexAttribI4ubv fp_glVertexAttribI4ubv;\ntypedef void (APIENTRYP pfn_glVertexAttribI4usv) (GLuint, const GLushort*);\nextern pfn_glVertexAttribI4usv fp_glVertexAttribI4usv;\ntypedef void (APIENTRYP pfn_glGetUniformuiv) (GLuint, GLint, GLuint*);\nextern pfn_glGetUniformuiv fp_glGetUniformuiv;\ntypedef void (APIENTRYP pfn_glBindFragDataLocation) (GLuint, GLuint, const GLchar*);\nextern pfn_glBindFragDataLocation fp_glBindFragDataLocation;\ntypedef GLint (APIENTRYP pfn_glGetFragDataLocation) (GLuint, const GLchar*);\nextern pfn_glGetFragDataLocation fp_glGetFragDataLocation;\ntypedef void (APIENTRYP pfn_glUniform1ui) (GLint, GLuint);\nextern pfn_glUniform1ui fp_glUniform1ui;\ntypedef void (APIENTRYP pfn_glUniform2ui) (GLint, GLuint, GLuint);\nextern pfn_glUniform2ui fp_glUniform2ui;\ntypedef void (APIENTRYP pfn_glUniform3ui) (GLint, GLuint, GLuint, GLuint);\nextern pfn_glUniform3ui fp_glUniform3ui;\ntypedef void (APIENTRYP pfn_glUniform4ui) (GLint, GLuint, GLuint, GLuint, GLuint);\nextern pfn_glUniform4ui fp_glUniform4ui;\ntypedef void (APIENTRYP pfn_glUniform1uiv) (GLint, GLsizei, const GLuint*);\nextern pfn_glUniform1uiv fp_glUniform1uiv;\ntypedef void (APIENTRYP pfn_glUniform2uiv) (GLint, GLsizei, const GLuint*);\nextern pfn_glUniform2uiv fp_glUniform2uiv;\ntypedef void (APIENTRYP pfn_glUniform3uiv) (GLint, GLsizei, const GLuint*);\nextern pfn_glUniform3uiv fp_glUniform3uiv;\ntypedef void (APIENTRYP pfn_glUniform4uiv) (GLint, GLsizei, const GLuint*);\nextern pfn_glUniform4uiv fp_glUniform4uiv;\ntypedef void (APIENTRYP pfn_glTexParameterIiv) (GLenum, GLenum, const GLint*);\nextern pfn_glTexParameterIiv fp_glTexParameterIiv;\ntypedef void (APIENTRYP pfn_glTexParameterIuiv) (GLenum, GLenum, const GLuint*);\nextern pfn_glTexParameterIuiv fp_glTexParameterIuiv;\ntypedef void (APIENTRYP pfn_glGetTexParameterIiv) (GLenum, GLenum, GLint*);\nextern pfn_glGetTexParameterIiv fp_glGetTexParameterIiv;\ntypedef void (APIENTRYP pfn_glGetTexParameterIuiv) (GLenum, GLenum, GLuint*);\nextern pfn_glGetTexParameterIuiv fp_glGetTexParameterIuiv;\ntypedef void (APIENTRYP pfn_glClearBufferiv) (GLenum, GLint, const GLint*);\nextern pfn_glClearBufferiv fp_glClearBufferiv;\ntypedef void (APIENTRYP pfn_glClearBufferuiv) (GLenum, GLint, const GLuint*);\nextern pfn_glClearBufferuiv fp_glClearBufferuiv;\ntypedef void (APIENTRYP pfn_glClearBufferfv) (GLenum, GLint, const GLfloat*);\nextern pfn_glClearBufferfv fp_glClearBufferfv;\ntypedef void (APIENTRYP pfn_glClearBufferfi) (GLenum, GLint, GLfloat, GLint);\nextern pfn_glClearBufferfi fp_glClearBufferfi;\ntypedef const GLubyte* (APIENTRYP pfn_glGetStringi) (GLenum, GLuint);\nextern pfn_glGetStringi fp_glGetStringi;\ntypedef GLboolean (APIENTRYP pfn_glIsRenderbuffer) (GLuint);\nextern pfn_glIsRenderbuffer fp_glIsRenderbuffer;\ntypedef void (APIENTRYP pfn_glBindRenderbuffer) (GLenum, GLuint);\nextern pfn_glBindRenderbuffer fp_glBindRenderbuffer;\ntypedef void (APIENTRYP pfn_glDeleteRenderbuffers) (GLsizei, const GLuint*);\nextern pfn_glDeleteRenderbuffers fp_glDeleteRenderbuffers;\ntypedef void (APIENTRYP pfn_glGenRenderbuffers) (GLsizei, GLuint*);\nextern pfn_glGenRenderbuffers fp_glGenRenderbuffers;\ntypedef void (APIENTRYP pfn_glRenderbufferStorage) (GLenum, GLenum, GLsizei, GLsizei);\nextern pfn_glRenderbufferStorage fp_glRenderbufferStorage;\ntypedef void (APIENTRYP pfn_glGetRenderbufferParameteriv) (GLenum, GLenum, GLint*);\nextern pfn_glGetRenderbufferParameteriv fp_glGetRenderbufferParameteriv;\ntypedef GLboolean (APIENTRYP pfn_glIsFramebuffer) (GLuint);\nextern pfn_glIsFramebuffer fp_glIsFramebuffer;\ntypedef void (APIENTRYP pfn_glBindFramebuffer) (GLenum, GLuint);\nextern pfn_glBindFramebuffer fp_glBindFramebuffer;\ntypedef void (APIENTRYP pfn_glDeleteFramebuffers) (GLsizei, const GLuint*);\nextern pfn_glDeleteFramebuffers fp_glDeleteFramebuffers;\ntypedef void (APIENTRYP pfn_glGenFramebuffers) (GLsizei, GLuint*);\nextern pfn_glGenFramebuffers fp_glGenFramebuffers;\ntypedef GLenum (APIENTRYP pfn_glCheckFramebufferStatus) (GLenum);\nextern pfn_glCheckFramebufferStatus fp_glCheckFramebufferStatus;\ntypedef void (APIENTRYP pfn_glFramebufferTexture1D) (GLenum, GLenum, GLenum, GLuint, GLint);\nextern pfn_glFramebufferTexture1D fp_glFramebufferTexture1D;\ntypedef void (APIENTRYP pfn_glFramebufferTexture2D) (GLenum, GLenum, GLenum, GLuint, GLint);\nextern pfn_glFramebufferTexture2D fp_glFramebufferTexture2D;\ntypedef void (APIENTRYP pfn_glFramebufferTexture3D) (GLenum, GLenum, GLenum, GLuint, GLint, GLint);\nextern pfn_glFramebufferTexture3D fp_glFramebufferTexture3D;\ntypedef void (APIENTRYP pfn_glFramebufferRenderbuffer) (GLenum, GLenum, GLenum, GLuint);\nextern pfn_glFramebufferRenderbuffer fp_glFramebufferRenderbuffer;\ntypedef void (APIENTRYP pfn_glGetFramebufferAttachmentParameteriv) (GLenum, GLenum, GLenum, GLint*);\nextern pfn_glGetFramebufferAttachmentParameteriv fp_glGetFramebufferAttachmentParameteriv;\ntypedef void (APIENTRYP pfn_glGenerateMipmap) (GLenum);\nextern pfn_glGenerateMipmap fp_glGenerateMipmap;\ntypedef void (APIENTRYP pfn_glBlitFramebuffer) (GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum);\nextern pfn_glBlitFramebuffer fp_glBlitFramebuffer;\ntypedef void (APIENTRYP pfn_glRenderbufferStorageMultisample) (GLenum, GLsizei, GLenum, GLsizei, GLsizei);\nextern pfn_glRenderbufferStorageMultisample fp_glRenderbufferStorageMultisample;\ntypedef void (APIENTRYP pfn_glFramebufferTextureLayer) (GLenum, GLenum, GLuint, GLint, GLint);\nextern pfn_glFramebufferTextureLayer fp_glFramebufferTextureLayer;\ntypedef void* (APIENTRYP pfn_glMapBufferRange) (GLenum, GLintptr, GLsizeiptr, GLbitfield);\nextern pfn_glMapBufferRange fp_glMapBufferRange;\ntypedef void (APIENTRYP pfn_glFlushMappedBufferRange) (GLenum, GLintptr, GLsizeiptr);\nextern pfn_glFlushMappedBufferRange fp_glFlushMappedBufferRange;\ntypedef void (APIENTRYP pfn_glBindVertexArray) (GLuint);\nextern pfn_glBindVertexArray fp_glBindVertexArray;\ntypedef void (APIENTRYP pfn_glDeleteVertexArrays) (GLsizei, const GLuint*);\nextern pfn_glDeleteVertexArrays fp_glDeleteVertexArrays;\ntypedef void (APIENTRYP pfn_glGenVertexArrays) (GLsizei, GLuint*);\nextern pfn_glGenVertexArrays fp_glGenVertexArrays;\ntypedef GLboolean (APIENTRYP pfn_glIsVertexArray) (GLuint);\nextern pfn_glIsVertexArray fp_glIsVertexArray;\n\n /* GL_VERSION_3_1 */\nextern GLboolean GLAD_VERSION_3_1;\n#define GL_SAMPLER_2D_RECT                     0x8B63\n#define GL_SAMPLER_2D_RECT_SHADOW              0x8B64\n#define GL_SAMPLER_BUFFER                      0x8DC2\n#define GL_INT_SAMPLER_2D_RECT                 0x8DCD\n#define GL_INT_SAMPLER_BUFFER                  0x8DD0\n#define GL_UNSIGNED_INT_SAMPLER_2D_RECT        0x8DD5\n#define GL_UNSIGNED_INT_SAMPLER_BUFFER         0x8DD8\n#define GL_TEXTURE_BUFFER                      0x8C2A\n#define GL_MAX_TEXTURE_BUFFER_SIZE             0x8C2B\n#define GL_TEXTURE_BINDING_BUFFER              0x8C2C\n#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING   0x8C2D\n#define GL_TEXTURE_RECTANGLE                   0x84F5\n#define GL_TEXTURE_BINDING_RECTANGLE           0x84F6\n#define GL_PROXY_TEXTURE_RECTANGLE             0x84F7\n#define GL_MAX_RECTANGLE_TEXTURE_SIZE          0x84F8\n#define GL_R8_SNORM                            0x8F94\n#define GL_RG8_SNORM                           0x8F95\n#define GL_RGB8_SNORM                          0x8F96\n#define GL_RGBA8_SNORM                         0x8F97\n#define GL_R16_SNORM                           0x8F98\n#define GL_RG16_SNORM                          0x8F99\n#define GL_RGB16_SNORM                         0x8F9A\n#define GL_RGBA16_SNORM                        0x8F9B\n#define GL_SIGNED_NORMALIZED                   0x8F9C\n#define GL_PRIMITIVE_RESTART                   0x8F9D\n#define GL_PRIMITIVE_RESTART_INDEX             0x8F9E\n#define GL_COPY_READ_BUFFER                    0x8F36\n#define GL_COPY_WRITE_BUFFER                   0x8F37\n#define GL_UNIFORM_BUFFER                      0x8A11\n#define GL_UNIFORM_BUFFER_BINDING              0x8A28\n#define GL_UNIFORM_BUFFER_START                0x8A29\n#define GL_UNIFORM_BUFFER_SIZE                 0x8A2A\n#define GL_MAX_VERTEX_UNIFORM_BLOCKS           0x8A2B\n#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS         0x8A2C\n#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS         0x8A2D\n#define GL_MAX_COMBINED_UNIFORM_BLOCKS         0x8A2E\n#define GL_MAX_UNIFORM_BUFFER_BINDINGS         0x8A2F\n#define GL_MAX_UNIFORM_BLOCK_SIZE              0x8A30\n#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS  0x8A31\n#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS  0x8A32\n#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS  0x8A33\n#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT     0x8A34\n#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH  0x8A35\n#define GL_ACTIVE_UNIFORM_BLOCKS               0x8A36\n#define GL_UNIFORM_TYPE                        0x8A37\n#define GL_UNIFORM_SIZE                        0x8A38\n#define GL_UNIFORM_NAME_LENGTH                 0x8A39\n#define GL_UNIFORM_BLOCK_INDEX                 0x8A3A\n#define GL_UNIFORM_OFFSET                      0x8A3B\n#define GL_UNIFORM_ARRAY_STRIDE                0x8A3C\n#define GL_UNIFORM_MATRIX_STRIDE               0x8A3D\n#define GL_UNIFORM_IS_ROW_MAJOR                0x8A3E\n#define GL_UNIFORM_BLOCK_BINDING               0x8A3F\n#define GL_UNIFORM_BLOCK_DATA_SIZE             0x8A40\n#define GL_UNIFORM_BLOCK_NAME_LENGTH           0x8A41\n#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS       0x8A42\n#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES  0x8A43\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER  0x8A44\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER  0x8A45\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER  0x8A46\n#define GL_INVALID_INDEX                       0xFFFFFFFF\ntypedef void (APIENTRYP pfn_glDrawArraysInstanced) (GLenum, GLint, GLsizei, GLsizei);\nextern pfn_glDrawArraysInstanced fp_glDrawArraysInstanced;\ntypedef void (APIENTRYP pfn_glDrawElementsInstanced) (GLenum, GLsizei, GLenum, const void*, GLsizei);\nextern pfn_glDrawElementsInstanced fp_glDrawElementsInstanced;\ntypedef void (APIENTRYP pfn_glTexBuffer) (GLenum, GLenum, GLuint);\nextern pfn_glTexBuffer fp_glTexBuffer;\ntypedef void (APIENTRYP pfn_glPrimitiveRestartIndex) (GLuint);\nextern pfn_glPrimitiveRestartIndex fp_glPrimitiveRestartIndex;\ntypedef void (APIENTRYP pfn_glCopyBufferSubData) (GLenum, GLenum, GLintptr, GLintptr, GLsizeiptr);\nextern pfn_glCopyBufferSubData fp_glCopyBufferSubData;\ntypedef void (APIENTRYP pfn_glGetUniformIndices) (GLuint, GLsizei, const GLchar**, GLuint*);\nextern pfn_glGetUniformIndices fp_glGetUniformIndices;\ntypedef void (APIENTRYP pfn_glGetActiveUniformsiv) (GLuint, GLsizei, const GLuint*, GLenum, GLint*);\nextern pfn_glGetActiveUniformsiv fp_glGetActiveUniformsiv;\ntypedef void (APIENTRYP pfn_glGetActiveUniformName) (GLuint, GLuint, GLsizei, GLsizei*, GLchar*);\nextern pfn_glGetActiveUniformName fp_glGetActiveUniformName;\ntypedef GLuint (APIENTRYP pfn_glGetUniformBlockIndex) (GLuint, const GLchar*);\nextern pfn_glGetUniformBlockIndex fp_glGetUniformBlockIndex;\ntypedef void (APIENTRYP pfn_glGetActiveUniformBlockiv) (GLuint, GLuint, GLenum, GLint*);\nextern pfn_glGetActiveUniformBlockiv fp_glGetActiveUniformBlockiv;\ntypedef void (APIENTRYP pfn_glGetActiveUniformBlockName) (GLuint, GLuint, GLsizei, GLsizei*, GLchar*);\nextern pfn_glGetActiveUniformBlockName fp_glGetActiveUniformBlockName;\ntypedef void (APIENTRYP pfn_glUniformBlockBinding) (GLuint, GLuint, GLuint);\nextern pfn_glUniformBlockBinding fp_glUniformBlockBinding;\n\n /* GL_VERSION_3_2 */\nextern GLboolean GLAD_VERSION_3_2;\n#define GL_CONTEXT_CORE_PROFILE_BIT            0x00000001\n#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT   0x00000002\n#define GL_LINES_ADJACENCY                     0x000A\n#define GL_LINE_STRIP_ADJACENCY                0x000B\n#define GL_TRIANGLES_ADJACENCY                 0x000C\n#define GL_TRIANGLE_STRIP_ADJACENCY            0x000D\n#define GL_PROGRAM_POINT_SIZE                  0x8642\n#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS    0x8C29\n#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED      0x8DA7\n#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS  0x8DA8\n#define GL_GEOMETRY_SHADER                     0x8DD9\n#define GL_GEOMETRY_VERTICES_OUT               0x8916\n#define GL_GEOMETRY_INPUT_TYPE                 0x8917\n#define GL_GEOMETRY_OUTPUT_TYPE                0x8918\n#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS     0x8DDF\n#define GL_MAX_GEOMETRY_OUTPUT_VERTICES        0x8DE0\n#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS  0x8DE1\n#define GL_MAX_VERTEX_OUTPUT_COMPONENTS        0x9122\n#define GL_MAX_GEOMETRY_INPUT_COMPONENTS       0x9123\n#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS      0x9124\n#define GL_MAX_FRAGMENT_INPUT_COMPONENTS       0x9125\n#define GL_CONTEXT_PROFILE_MASK                0x9126\n#define GL_DEPTH_CLAMP                         0x864F\n#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION  0x8E4C\n#define GL_FIRST_VERTEX_CONVENTION             0x8E4D\n#define GL_LAST_VERTEX_CONVENTION              0x8E4E\n#define GL_PROVOKING_VERTEX                    0x8E4F\n#define GL_TEXTURE_CUBE_MAP_SEAMLESS           0x884F\n#define GL_MAX_SERVER_WAIT_TIMEOUT             0x9111\n#define GL_OBJECT_TYPE                         0x9112\n#define GL_SYNC_CONDITION                      0x9113\n#define GL_SYNC_STATUS                         0x9114\n#define GL_SYNC_FLAGS                          0x9115\n#define GL_SYNC_FENCE                          0x9116\n#define GL_SYNC_GPU_COMMANDS_COMPLETE          0x9117\n#define GL_UNSIGNALED                          0x9118\n#define GL_SIGNALED                            0x9119\n#define GL_ALREADY_SIGNALED                    0x911A\n#define GL_TIMEOUT_EXPIRED                     0x911B\n#define GL_CONDITION_SATISFIED                 0x911C\n#define GL_WAIT_FAILED                         0x911D\n#define GL_TIMEOUT_IGNORED                     0xFFFFFFFFFFFFFFFF\n#define GL_SYNC_FLUSH_COMMANDS_BIT             0x00000001\n#define GL_SAMPLE_POSITION                     0x8E50\n#define GL_SAMPLE_MASK                         0x8E51\n#define GL_SAMPLE_MASK_VALUE                   0x8E52\n#define GL_MAX_SAMPLE_MASK_WORDS               0x8E59\n#define GL_TEXTURE_2D_MULTISAMPLE              0x9100\n#define GL_PROXY_TEXTURE_2D_MULTISAMPLE        0x9101\n#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY        0x9102\n#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY  0x9103\n#define GL_TEXTURE_BINDING_2D_MULTISAMPLE      0x9104\n#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY  0x9105\n#define GL_TEXTURE_SAMPLES                     0x9106\n#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS      0x9107\n#define GL_SAMPLER_2D_MULTISAMPLE              0x9108\n#define GL_INT_SAMPLER_2D_MULTISAMPLE          0x9109\n#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE  0x910A\n#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY        0x910B\n#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY    0x910C\n#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY  0x910D\n#define GL_MAX_COLOR_TEXTURE_SAMPLES           0x910E\n#define GL_MAX_DEPTH_TEXTURE_SAMPLES           0x910F\n#define GL_MAX_INTEGER_SAMPLES                 0x9110\ntypedef void (APIENTRYP pfn_glDrawElementsBaseVertex) (GLenum, GLsizei, GLenum, const void*, GLint);\nextern pfn_glDrawElementsBaseVertex fp_glDrawElementsBaseVertex;\ntypedef void (APIENTRYP pfn_glDrawRangeElementsBaseVertex) (GLenum, GLuint, GLuint, GLsizei, GLenum, const void*, GLint);\nextern pfn_glDrawRangeElementsBaseVertex fp_glDrawRangeElementsBaseVertex;\ntypedef void (APIENTRYP pfn_glDrawElementsInstancedBaseVertex) (GLenum, GLsizei, GLenum, const void*, GLsizei, GLint);\nextern pfn_glDrawElementsInstancedBaseVertex fp_glDrawElementsInstancedBaseVertex;\ntypedef void (APIENTRYP pfn_glMultiDrawElementsBaseVertex) (GLenum, const GLsizei*, GLenum, const void**, GLsizei, const GLint*);\nextern pfn_glMultiDrawElementsBaseVertex fp_glMultiDrawElementsBaseVertex;\ntypedef void (APIENTRYP pfn_glProvokingVertex) (GLenum);\nextern pfn_glProvokingVertex fp_glProvokingVertex;\ntypedef GLsync (APIENTRYP pfn_glFenceSync) (GLenum, GLbitfield);\nextern pfn_glFenceSync fp_glFenceSync;\ntypedef GLboolean (APIENTRYP pfn_glIsSync) (GLsync);\nextern pfn_glIsSync fp_glIsSync;\ntypedef void (APIENTRYP pfn_glDeleteSync) (GLsync);\nextern pfn_glDeleteSync fp_glDeleteSync;\ntypedef GLenum (APIENTRYP pfn_glClientWaitSync) (GLsync, GLbitfield, GLuint64);\nextern pfn_glClientWaitSync fp_glClientWaitSync;\ntypedef void (APIENTRYP pfn_glWaitSync) (GLsync, GLbitfield, GLuint64);\nextern pfn_glWaitSync fp_glWaitSync;\ntypedef void (APIENTRYP pfn_glGetInteger64v) (GLenum, GLint64*);\nextern pfn_glGetInteger64v fp_glGetInteger64v;\ntypedef void (APIENTRYP pfn_glGetSynciv) (GLsync, GLenum, GLsizei, GLsizei*, GLint*);\nextern pfn_glGetSynciv fp_glGetSynciv;\ntypedef void (APIENTRYP pfn_glGetInteger64i_v) (GLenum, GLuint, GLint64*);\nextern pfn_glGetInteger64i_v fp_glGetInteger64i_v;\ntypedef void (APIENTRYP pfn_glGetBufferParameteri64v) (GLenum, GLenum, GLint64*);\nextern pfn_glGetBufferParameteri64v fp_glGetBufferParameteri64v;\ntypedef void (APIENTRYP pfn_glFramebufferTexture) (GLenum, GLenum, GLuint, GLint);\nextern pfn_glFramebufferTexture fp_glFramebufferTexture;\ntypedef void (APIENTRYP pfn_glTexImage2DMultisample) (GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLboolean);\nextern pfn_glTexImage2DMultisample fp_glTexImage2DMultisample;\ntypedef void (APIENTRYP pfn_glTexImage3DMultisample) (GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei, GLboolean);\nextern pfn_glTexImage3DMultisample fp_glTexImage3DMultisample;\ntypedef void (APIENTRYP pfn_glGetMultisamplefv) (GLenum, GLuint, GLfloat*);\nextern pfn_glGetMultisamplefv fp_glGetMultisamplefv;\ntypedef void (APIENTRYP pfn_glSampleMaski) (GLuint, GLbitfield);\nextern pfn_glSampleMaski fp_glSampleMaski;\n\n /* GL_VERSION_3_3 */\nextern GLboolean GLAD_VERSION_3_3;\n#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR         0x88FE\n#define GL_SRC1_COLOR                          0x88F9\n#define GL_ONE_MINUS_SRC1_COLOR                0x88FA\n#define GL_ONE_MINUS_SRC1_ALPHA                0x88FB\n#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS        0x88FC\n#define GL_ANY_SAMPLES_PASSED                  0x8C2F\n#define GL_SAMPLER_BINDING                     0x8919\n#define GL_RGB10_A2UI                          0x906F\n#define GL_TEXTURE_SWIZZLE_R                   0x8E42\n#define GL_TEXTURE_SWIZZLE_G                   0x8E43\n#define GL_TEXTURE_SWIZZLE_B                   0x8E44\n#define GL_TEXTURE_SWIZZLE_A                   0x8E45\n#define GL_TEXTURE_SWIZZLE_RGBA                0x8E46\n#define GL_TIME_ELAPSED                        0x88BF\n#define GL_TIMESTAMP                           0x8E28\n#define GL_INT_2_10_10_10_REV                  0x8D9F\ntypedef void (APIENTRYP pfn_glBindFragDataLocationIndexed) (GLuint, GLuint, GLuint, const GLchar*);\nextern pfn_glBindFragDataLocationIndexed fp_glBindFragDataLocationIndexed;\ntypedef GLint (APIENTRYP pfn_glGetFragDataIndex) (GLuint, const GLchar*);\nextern pfn_glGetFragDataIndex fp_glGetFragDataIndex;\ntypedef void (APIENTRYP pfn_glGenSamplers) (GLsizei, GLuint*);\nextern pfn_glGenSamplers fp_glGenSamplers;\ntypedef void (APIENTRYP pfn_glDeleteSamplers) (GLsizei, const GLuint*);\nextern pfn_glDeleteSamplers fp_glDeleteSamplers;\ntypedef GLboolean (APIENTRYP pfn_glIsSampler) (GLuint);\nextern pfn_glIsSampler fp_glIsSampler;\ntypedef void (APIENTRYP pfn_glBindSampler) (GLuint, GLuint);\nextern pfn_glBindSampler fp_glBindSampler;\ntypedef void (APIENTRYP pfn_glSamplerParameteri) (GLuint, GLenum, GLint);\nextern pfn_glSamplerParameteri fp_glSamplerParameteri;\ntypedef void (APIENTRYP pfn_glSamplerParameteriv) (GLuint, GLenum, const GLint*);\nextern pfn_glSamplerParameteriv fp_glSamplerParameteriv;\ntypedef void (APIENTRYP pfn_glSamplerParameterf) (GLuint, GLenum, GLfloat);\nextern pfn_glSamplerParameterf fp_glSamplerParameterf;\ntypedef void (APIENTRYP pfn_glSamplerParameterfv) (GLuint, GLenum, const GLfloat*);\nextern pfn_glSamplerParameterfv fp_glSamplerParameterfv;\ntypedef void (APIENTRYP pfn_glSamplerParameterIiv) (GLuint, GLenum, const GLint*);\nextern pfn_glSamplerParameterIiv fp_glSamplerParameterIiv;\ntypedef void (APIENTRYP pfn_glSamplerParameterIuiv) (GLuint, GLenum, const GLuint*);\nextern pfn_glSamplerParameterIuiv fp_glSamplerParameterIuiv;\ntypedef void (APIENTRYP pfn_glGetSamplerParameteriv) (GLuint, GLenum, GLint*);\nextern pfn_glGetSamplerParameteriv fp_glGetSamplerParameteriv;\ntypedef void (APIENTRYP pfn_glGetSamplerParameterIiv) (GLuint, GLenum, GLint*);\nextern pfn_glGetSamplerParameterIiv fp_glGetSamplerParameterIiv;\ntypedef void (APIENTRYP pfn_glGetSamplerParameterfv) (GLuint, GLenum, GLfloat*);\nextern pfn_glGetSamplerParameterfv fp_glGetSamplerParameterfv;\ntypedef void (APIENTRYP pfn_glGetSamplerParameterIuiv) (GLuint, GLenum, GLuint*);\nextern pfn_glGetSamplerParameterIuiv fp_glGetSamplerParameterIuiv;\ntypedef void (APIENTRYP pfn_glQueryCounter) (GLuint, GLenum);\nextern pfn_glQueryCounter fp_glQueryCounter;\ntypedef void (APIENTRYP pfn_glGetQueryObjecti64v) (GLuint, GLenum, GLint64*);\nextern pfn_glGetQueryObjecti64v fp_glGetQueryObjecti64v;\ntypedef void (APIENTRYP pfn_glGetQueryObjectui64v) (GLuint, GLenum, GLuint64*);\nextern pfn_glGetQueryObjectui64v fp_glGetQueryObjectui64v;\ntypedef void (APIENTRYP pfn_glVertexAttribDivisor) (GLuint, GLuint);\nextern pfn_glVertexAttribDivisor fp_glVertexAttribDivisor;\ntypedef void (APIENTRYP pfn_glVertexAttribP1ui) (GLuint, GLenum, GLboolean, GLuint);\nextern pfn_glVertexAttribP1ui fp_glVertexAttribP1ui;\ntypedef void (APIENTRYP pfn_glVertexAttribP1uiv) (GLuint, GLenum, GLboolean, const GLuint*);\nextern pfn_glVertexAttribP1uiv fp_glVertexAttribP1uiv;\ntypedef void (APIENTRYP pfn_glVertexAttribP2ui) (GLuint, GLenum, GLboolean, GLuint);\nextern pfn_glVertexAttribP2ui fp_glVertexAttribP2ui;\ntypedef void (APIENTRYP pfn_glVertexAttribP2uiv) (GLuint, GLenum, GLboolean, const GLuint*);\nextern pfn_glVertexAttribP2uiv fp_glVertexAttribP2uiv;\ntypedef void (APIENTRYP pfn_glVertexAttribP3ui) (GLuint, GLenum, GLboolean, GLuint);\nextern pfn_glVertexAttribP3ui fp_glVertexAttribP3ui;\ntypedef void (APIENTRYP pfn_glVertexAttribP3uiv) (GLuint, GLenum, GLboolean, const GLuint*);\nextern pfn_glVertexAttribP3uiv fp_glVertexAttribP3uiv;\ntypedef void (APIENTRYP pfn_glVertexAttribP4ui) (GLuint, GLenum, GLboolean, GLuint);\nextern pfn_glVertexAttribP4ui fp_glVertexAttribP4ui;\ntypedef void (APIENTRYP pfn_glVertexAttribP4uiv) (GLuint, GLenum, GLboolean, const GLuint*);\nextern pfn_glVertexAttribP4uiv fp_glVertexAttribP4uiv;\ntypedef void (APIENTRYP pfn_glVertexP2ui) (GLenum, GLuint);\nextern pfn_glVertexP2ui fp_glVertexP2ui;\ntypedef void (APIENTRYP pfn_glVertexP2uiv) (GLenum, const GLuint*);\nextern pfn_glVertexP2uiv fp_glVertexP2uiv;\ntypedef void (APIENTRYP pfn_glVertexP3ui) (GLenum, GLuint);\nextern pfn_glVertexP3ui fp_glVertexP3ui;\ntypedef void (APIENTRYP pfn_glVertexP3uiv) (GLenum, const GLuint*);\nextern pfn_glVertexP3uiv fp_glVertexP3uiv;\ntypedef void (APIENTRYP pfn_glVertexP4ui) (GLenum, GLuint);\nextern pfn_glVertexP4ui fp_glVertexP4ui;\ntypedef void (APIENTRYP pfn_glVertexP4uiv) (GLenum, const GLuint*);\nextern pfn_glVertexP4uiv fp_glVertexP4uiv;\ntypedef void (APIENTRYP pfn_glTexCoordP1ui) (GLenum, GLuint);\nextern pfn_glTexCoordP1ui fp_glTexCoordP1ui;\ntypedef void (APIENTRYP pfn_glTexCoordP1uiv) (GLenum, const GLuint*);\nextern pfn_glTexCoordP1uiv fp_glTexCoordP1uiv;\ntypedef void (APIENTRYP pfn_glTexCoordP2ui) (GLenum, GLuint);\nextern pfn_glTexCoordP2ui fp_glTexCoordP2ui;\ntypedef void (APIENTRYP pfn_glTexCoordP2uiv) (GLenum, const GLuint*);\nextern pfn_glTexCoordP2uiv fp_glTexCoordP2uiv;\ntypedef void (APIENTRYP pfn_glTexCoordP3ui) (GLenum, GLuint);\nextern pfn_glTexCoordP3ui fp_glTexCoordP3ui;\ntypedef void (APIENTRYP pfn_glTexCoordP3uiv) (GLenum, const GLuint*);\nextern pfn_glTexCoordP3uiv fp_glTexCoordP3uiv;\ntypedef void (APIENTRYP pfn_glTexCoordP4ui) (GLenum, GLuint);\nextern pfn_glTexCoordP4ui fp_glTexCoordP4ui;\ntypedef void (APIENTRYP pfn_glTexCoordP4uiv) (GLenum, const GLuint*);\nextern pfn_glTexCoordP4uiv fp_glTexCoordP4uiv;\ntypedef void (APIENTRYP pfn_glMultiTexCoordP1ui) (GLenum, GLenum, GLuint);\nextern pfn_glMultiTexCoordP1ui fp_glMultiTexCoordP1ui;\ntypedef void (APIENTRYP pfn_glMultiTexCoordP1uiv) (GLenum, GLenum, const GLuint*);\nextern pfn_glMultiTexCoordP1uiv fp_glMultiTexCoordP1uiv;\ntypedef void (APIENTRYP pfn_glMultiTexCoordP2ui) (GLenum, GLenum, GLuint);\nextern pfn_glMultiTexCoordP2ui fp_glMultiTexCoordP2ui;\ntypedef void (APIENTRYP pfn_glMultiTexCoordP2uiv) (GLenum, GLenum, const GLuint*);\nextern pfn_glMultiTexCoordP2uiv fp_glMultiTexCoordP2uiv;\ntypedef void (APIENTRYP pfn_glMultiTexCoordP3ui) (GLenum, GLenum, GLuint);\nextern pfn_glMultiTexCoordP3ui fp_glMultiTexCoordP3ui;\ntypedef void (APIENTRYP pfn_glMultiTexCoordP3uiv) (GLenum, GLenum, const GLuint*);\nextern pfn_glMultiTexCoordP3uiv fp_glMultiTexCoordP3uiv;\ntypedef void (APIENTRYP pfn_glMultiTexCoordP4ui) (GLenum, GLenum, GLuint);\nextern pfn_glMultiTexCoordP4ui fp_glMultiTexCoordP4ui;\ntypedef void (APIENTRYP pfn_glMultiTexCoordP4uiv) (GLenum, GLenum, const GLuint*);\nextern pfn_glMultiTexCoordP4uiv fp_glMultiTexCoordP4uiv;\ntypedef void (APIENTRYP pfn_glNormalP3ui) (GLenum, GLuint);\nextern pfn_glNormalP3ui fp_glNormalP3ui;\ntypedef void (APIENTRYP pfn_glNormalP3uiv) (GLenum, const GLuint*);\nextern pfn_glNormalP3uiv fp_glNormalP3uiv;\ntypedef void (APIENTRYP pfn_glColorP3ui) (GLenum, GLuint);\nextern pfn_glColorP3ui fp_glColorP3ui;\ntypedef void (APIENTRYP pfn_glColorP3uiv) (GLenum, const GLuint*);\nextern pfn_glColorP3uiv fp_glColorP3uiv;\ntypedef void (APIENTRYP pfn_glColorP4ui) (GLenum, GLuint);\nextern pfn_glColorP4ui fp_glColorP4ui;\ntypedef void (APIENTRYP pfn_glColorP4uiv) (GLenum, const GLuint*);\nextern pfn_glColorP4uiv fp_glColorP4uiv;\ntypedef void (APIENTRYP pfn_glSecondaryColorP3ui) (GLenum, GLuint);\nextern pfn_glSecondaryColorP3ui fp_glSecondaryColorP3ui;\ntypedef void (APIENTRYP pfn_glSecondaryColorP3uiv) (GLenum, const GLuint*);\nextern pfn_glSecondaryColorP3uiv fp_glSecondaryColorP3uiv;\n\n /* GL_VERSION_4_0 */\nextern GLboolean GLAD_VERSION_4_0;\n#define GL_SAMPLE_SHADING                      0x8C36\n#define GL_MIN_SAMPLE_SHADING_VALUE            0x8C37\n#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET   0x8E5E\n#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET   0x8E5F\n#define GL_TEXTURE_CUBE_MAP_ARRAY              0x9009\n#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY      0x900A\n#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY        0x900B\n#define GL_SAMPLER_CUBE_MAP_ARRAY              0x900C\n#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW       0x900D\n#define GL_INT_SAMPLER_CUBE_MAP_ARRAY          0x900E\n#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY  0x900F\n#define GL_DRAW_INDIRECT_BUFFER                0x8F3F\n#define GL_DRAW_INDIRECT_BUFFER_BINDING        0x8F43\n#define GL_GEOMETRY_SHADER_INVOCATIONS         0x887F\n#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS     0x8E5A\n#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET   0x8E5B\n#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET   0x8E5C\n#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS  0x8E5D\n#define GL_MAX_VERTEX_STREAMS                  0x8E71\n#define GL_DOUBLE_VEC2                         0x8FFC\n#define GL_DOUBLE_VEC3                         0x8FFD\n#define GL_DOUBLE_VEC4                         0x8FFE\n#define GL_DOUBLE_MAT2                         0x8F46\n#define GL_DOUBLE_MAT3                         0x8F47\n#define GL_DOUBLE_MAT4                         0x8F48\n#define GL_DOUBLE_MAT2x3                       0x8F49\n#define GL_DOUBLE_MAT2x4                       0x8F4A\n#define GL_DOUBLE_MAT3x2                       0x8F4B\n#define GL_DOUBLE_MAT3x4                       0x8F4C\n#define GL_DOUBLE_MAT4x2                       0x8F4D\n#define GL_DOUBLE_MAT4x3                       0x8F4E\n#define GL_ACTIVE_SUBROUTINES                  0x8DE5\n#define GL_ACTIVE_SUBROUTINE_UNIFORMS          0x8DE6\n#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS  0x8E47\n#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH        0x8E48\n#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH  0x8E49\n#define GL_MAX_SUBROUTINES                     0x8DE7\n#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS    0x8DE8\n#define GL_NUM_COMPATIBLE_SUBROUTINES          0x8E4A\n#define GL_COMPATIBLE_SUBROUTINES              0x8E4B\n#define GL_PATCHES                             0x000E\n#define GL_PATCH_VERTICES                      0x8E72\n#define GL_PATCH_DEFAULT_INNER_LEVEL           0x8E73\n#define GL_PATCH_DEFAULT_OUTER_LEVEL           0x8E74\n#define GL_TESS_CONTROL_OUTPUT_VERTICES        0x8E75\n#define GL_TESS_GEN_MODE                       0x8E76\n#define GL_TESS_GEN_SPACING                    0x8E77\n#define GL_TESS_GEN_VERTEX_ORDER               0x8E78\n#define GL_TESS_GEN_POINT_MODE                 0x8E79\n#define GL_ISOLINES                            0x8E7A\n#define GL_FRACTIONAL_ODD                      0x8E7B\n#define GL_FRACTIONAL_EVEN                     0x8E7C\n#define GL_MAX_PATCH_VERTICES                  0x8E7D\n#define GL_MAX_TESS_GEN_LEVEL                  0x8E7E\n#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS  0x8E7F\n#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS  0x8E80\n#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS  0x8E81\n#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS  0x8E82\n#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS  0x8E83\n#define GL_MAX_TESS_PATCH_COMPONENTS           0x8E84\n#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS  0x8E85\n#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS  0x8E86\n#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS     0x8E89\n#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS  0x8E8A\n#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS   0x886C\n#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS  0x886D\n#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS  0x8E1E\n#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS  0x8E1F\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER  0x84F0\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER  0x84F1\n#define GL_TESS_EVALUATION_SHADER              0x8E87\n#define GL_TESS_CONTROL_SHADER                 0x8E88\n#define GL_TRANSFORM_FEEDBACK                  0x8E22\n#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED    0x8E23\n#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE    0x8E24\n#define GL_TRANSFORM_FEEDBACK_BINDING          0x8E25\n#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS      0x8E70\ntypedef void (APIENTRYP pfn_glMinSampleShading) (GLfloat);\nextern pfn_glMinSampleShading fp_glMinSampleShading;\ntypedef void (APIENTRYP pfn_glBlendEquationi) (GLuint, GLenum);\nextern pfn_glBlendEquationi fp_glBlendEquationi;\ntypedef void (APIENTRYP pfn_glBlendEquationSeparatei) (GLuint, GLenum, GLenum);\nextern pfn_glBlendEquationSeparatei fp_glBlendEquationSeparatei;\ntypedef void (APIENTRYP pfn_glBlendFunci) (GLuint, GLenum, GLenum);\nextern pfn_glBlendFunci fp_glBlendFunci;\ntypedef void (APIENTRYP pfn_glBlendFuncSeparatei) (GLuint, GLenum, GLenum, GLenum, GLenum);\nextern pfn_glBlendFuncSeparatei fp_glBlendFuncSeparatei;\ntypedef void (APIENTRYP pfn_glDrawArraysIndirect) (GLenum, const void*);\nextern pfn_glDrawArraysIndirect fp_glDrawArraysIndirect;\ntypedef void (APIENTRYP pfn_glDrawElementsIndirect) (GLenum, GLenum, const void*);\nextern pfn_glDrawElementsIndirect fp_glDrawElementsIndirect;\ntypedef void (APIENTRYP pfn_glUniform1d) (GLint, GLdouble);\nextern pfn_glUniform1d fp_glUniform1d;\ntypedef void (APIENTRYP pfn_glUniform2d) (GLint, GLdouble, GLdouble);\nextern pfn_glUniform2d fp_glUniform2d;\ntypedef void (APIENTRYP pfn_glUniform3d) (GLint, GLdouble, GLdouble, GLdouble);\nextern pfn_glUniform3d fp_glUniform3d;\ntypedef void (APIENTRYP pfn_glUniform4d) (GLint, GLdouble, GLdouble, GLdouble, GLdouble);\nextern pfn_glUniform4d fp_glUniform4d;\ntypedef void (APIENTRYP pfn_glUniform1dv) (GLint, GLsizei, const GLdouble*);\nextern pfn_glUniform1dv fp_glUniform1dv;\ntypedef void (APIENTRYP pfn_glUniform2dv) (GLint, GLsizei, const GLdouble*);\nextern pfn_glUniform2dv fp_glUniform2dv;\ntypedef void (APIENTRYP pfn_glUniform3dv) (GLint, GLsizei, const GLdouble*);\nextern pfn_glUniform3dv fp_glUniform3dv;\ntypedef void (APIENTRYP pfn_glUniform4dv) (GLint, GLsizei, const GLdouble*);\nextern pfn_glUniform4dv fp_glUniform4dv;\ntypedef void (APIENTRYP pfn_glUniformMatrix2dv) (GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glUniformMatrix2dv fp_glUniformMatrix2dv;\ntypedef void (APIENTRYP pfn_glUniformMatrix3dv) (GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glUniformMatrix3dv fp_glUniformMatrix3dv;\ntypedef void (APIENTRYP pfn_glUniformMatrix4dv) (GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glUniformMatrix4dv fp_glUniformMatrix4dv;\ntypedef void (APIENTRYP pfn_glUniformMatrix2x3dv) (GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glUniformMatrix2x3dv fp_glUniformMatrix2x3dv;\ntypedef void (APIENTRYP pfn_glUniformMatrix2x4dv) (GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glUniformMatrix2x4dv fp_glUniformMatrix2x4dv;\ntypedef void (APIENTRYP pfn_glUniformMatrix3x2dv) (GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glUniformMatrix3x2dv fp_glUniformMatrix3x2dv;\ntypedef void (APIENTRYP pfn_glUniformMatrix3x4dv) (GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glUniformMatrix3x4dv fp_glUniformMatrix3x4dv;\ntypedef void (APIENTRYP pfn_glUniformMatrix4x2dv) (GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glUniformMatrix4x2dv fp_glUniformMatrix4x2dv;\ntypedef void (APIENTRYP pfn_glUniformMatrix4x3dv) (GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glUniformMatrix4x3dv fp_glUniformMatrix4x3dv;\ntypedef void (APIENTRYP pfn_glGetUniformdv) (GLuint, GLint, GLdouble*);\nextern pfn_glGetUniformdv fp_glGetUniformdv;\ntypedef GLint (APIENTRYP pfn_glGetSubroutineUniformLocation) (GLuint, GLenum, const GLchar*);\nextern pfn_glGetSubroutineUniformLocation fp_glGetSubroutineUniformLocation;\ntypedef GLuint (APIENTRYP pfn_glGetSubroutineIndex) (GLuint, GLenum, const GLchar*);\nextern pfn_glGetSubroutineIndex fp_glGetSubroutineIndex;\ntypedef void (APIENTRYP pfn_glGetActiveSubroutineUniformiv) (GLuint, GLenum, GLuint, GLenum, GLint*);\nextern pfn_glGetActiveSubroutineUniformiv fp_glGetActiveSubroutineUniformiv;\ntypedef void (APIENTRYP pfn_glGetActiveSubroutineUniformName) (GLuint, GLenum, GLuint, GLsizei, GLsizei*, GLchar*);\nextern pfn_glGetActiveSubroutineUniformName fp_glGetActiveSubroutineUniformName;\ntypedef void (APIENTRYP pfn_glGetActiveSubroutineName) (GLuint, GLenum, GLuint, GLsizei, GLsizei*, GLchar*);\nextern pfn_glGetActiveSubroutineName fp_glGetActiveSubroutineName;\ntypedef void (APIENTRYP pfn_glUniformSubroutinesuiv) (GLenum, GLsizei, const GLuint*);\nextern pfn_glUniformSubroutinesuiv fp_glUniformSubroutinesuiv;\ntypedef void (APIENTRYP pfn_glGetUniformSubroutineuiv) (GLenum, GLint, GLuint*);\nextern pfn_glGetUniformSubroutineuiv fp_glGetUniformSubroutineuiv;\ntypedef void (APIENTRYP pfn_glGetProgramStageiv) (GLuint, GLenum, GLenum, GLint*);\nextern pfn_glGetProgramStageiv fp_glGetProgramStageiv;\ntypedef void (APIENTRYP pfn_glPatchParameteri) (GLenum, GLint);\nextern pfn_glPatchParameteri fp_glPatchParameteri;\ntypedef void (APIENTRYP pfn_glPatchParameterfv) (GLenum, const GLfloat*);\nextern pfn_glPatchParameterfv fp_glPatchParameterfv;\ntypedef void (APIENTRYP pfn_glBindTransformFeedback) (GLenum, GLuint);\nextern pfn_glBindTransformFeedback fp_glBindTransformFeedback;\ntypedef void (APIENTRYP pfn_glDeleteTransformFeedbacks) (GLsizei, const GLuint*);\nextern pfn_glDeleteTransformFeedbacks fp_glDeleteTransformFeedbacks;\ntypedef void (APIENTRYP pfn_glGenTransformFeedbacks) (GLsizei, GLuint*);\nextern pfn_glGenTransformFeedbacks fp_glGenTransformFeedbacks;\ntypedef GLboolean (APIENTRYP pfn_glIsTransformFeedback) (GLuint);\nextern pfn_glIsTransformFeedback fp_glIsTransformFeedback;\ntypedef void (APIENTRYP pfn_glPauseTransformFeedback) ();\nextern pfn_glPauseTransformFeedback fp_glPauseTransformFeedback;\ntypedef void (APIENTRYP pfn_glResumeTransformFeedback) ();\nextern pfn_glResumeTransformFeedback fp_glResumeTransformFeedback;\ntypedef void (APIENTRYP pfn_glDrawTransformFeedback) (GLenum, GLuint);\nextern pfn_glDrawTransformFeedback fp_glDrawTransformFeedback;\ntypedef void (APIENTRYP pfn_glDrawTransformFeedbackStream) (GLenum, GLuint, GLuint);\nextern pfn_glDrawTransformFeedbackStream fp_glDrawTransformFeedbackStream;\ntypedef void (APIENTRYP pfn_glBeginQueryIndexed) (GLenum, GLuint, GLuint);\nextern pfn_glBeginQueryIndexed fp_glBeginQueryIndexed;\ntypedef void (APIENTRYP pfn_glEndQueryIndexed) (GLenum, GLuint);\nextern pfn_glEndQueryIndexed fp_glEndQueryIndexed;\ntypedef void (APIENTRYP pfn_glGetQueryIndexediv) (GLenum, GLuint, GLenum, GLint*);\nextern pfn_glGetQueryIndexediv fp_glGetQueryIndexediv;\n\n /* GL_VERSION_4_1 */\nextern GLboolean GLAD_VERSION_4_1;\n#define GL_FIXED                               0x140C\n#define GL_IMPLEMENTATION_COLOR_READ_TYPE      0x8B9A\n#define GL_IMPLEMENTATION_COLOR_READ_FORMAT    0x8B9B\n#define GL_LOW_FLOAT                           0x8DF0\n#define GL_MEDIUM_FLOAT                        0x8DF1\n#define GL_HIGH_FLOAT                          0x8DF2\n#define GL_LOW_INT                             0x8DF3\n#define GL_MEDIUM_INT                          0x8DF4\n#define GL_HIGH_INT                            0x8DF5\n#define GL_SHADER_COMPILER                     0x8DFA\n#define GL_SHADER_BINARY_FORMATS               0x8DF8\n#define GL_NUM_SHADER_BINARY_FORMATS           0x8DF9\n#define GL_MAX_VERTEX_UNIFORM_VECTORS          0x8DFB\n#define GL_MAX_VARYING_VECTORS                 0x8DFC\n#define GL_MAX_FRAGMENT_UNIFORM_VECTORS        0x8DFD\n#define GL_RGB565                              0x8D62\n#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT     0x8257\n#define GL_PROGRAM_BINARY_LENGTH               0x8741\n#define GL_NUM_PROGRAM_BINARY_FORMATS          0x87FE\n#define GL_PROGRAM_BINARY_FORMATS              0x87FF\n#define GL_VERTEX_SHADER_BIT                   0x00000001\n#define GL_FRAGMENT_SHADER_BIT                 0x00000002\n#define GL_GEOMETRY_SHADER_BIT                 0x00000004\n#define GL_TESS_CONTROL_SHADER_BIT             0x00000008\n#define GL_TESS_EVALUATION_SHADER_BIT          0x00000010\n#define GL_ALL_SHADER_BITS                     0xFFFFFFFF\n#define GL_PROGRAM_SEPARABLE                   0x8258\n#define GL_ACTIVE_PROGRAM                      0x8259\n#define GL_PROGRAM_PIPELINE_BINDING            0x825A\n#define GL_MAX_VIEWPORTS                       0x825B\n#define GL_VIEWPORT_SUBPIXEL_BITS              0x825C\n#define GL_VIEWPORT_BOUNDS_RANGE               0x825D\n#define GL_LAYER_PROVOKING_VERTEX              0x825E\n#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX     0x825F\n#define GL_UNDEFINED_VERTEX                    0x8260\ntypedef void (APIENTRYP pfn_glReleaseShaderCompiler) ();\nextern pfn_glReleaseShaderCompiler fp_glReleaseShaderCompiler;\ntypedef void (APIENTRYP pfn_glShaderBinary) (GLsizei, const GLuint*, GLenum, const void*, GLsizei);\nextern pfn_glShaderBinary fp_glShaderBinary;\ntypedef void (APIENTRYP pfn_glGetShaderPrecisionFormat) (GLenum, GLenum, GLint*, GLint*);\nextern pfn_glGetShaderPrecisionFormat fp_glGetShaderPrecisionFormat;\ntypedef void (APIENTRYP pfn_glDepthRangef) (GLfloat, GLfloat);\nextern pfn_glDepthRangef fp_glDepthRangef;\ntypedef void (APIENTRYP pfn_glClearDepthf) (GLfloat);\nextern pfn_glClearDepthf fp_glClearDepthf;\ntypedef void (APIENTRYP pfn_glGetProgramBinary) (GLuint, GLsizei, GLsizei*, GLenum*, void*);\nextern pfn_glGetProgramBinary fp_glGetProgramBinary;\ntypedef void (APIENTRYP pfn_glProgramBinary) (GLuint, GLenum, const void*, GLsizei);\nextern pfn_glProgramBinary fp_glProgramBinary;\ntypedef void (APIENTRYP pfn_glProgramParameteri) (GLuint, GLenum, GLint);\nextern pfn_glProgramParameteri fp_glProgramParameteri;\ntypedef void (APIENTRYP pfn_glUseProgramStages) (GLuint, GLbitfield, GLuint);\nextern pfn_glUseProgramStages fp_glUseProgramStages;\ntypedef void (APIENTRYP pfn_glActiveShaderProgram) (GLuint, GLuint);\nextern pfn_glActiveShaderProgram fp_glActiveShaderProgram;\ntypedef GLuint (APIENTRYP pfn_glCreateShaderProgramv) (GLenum, GLsizei, const GLchar**);\nextern pfn_glCreateShaderProgramv fp_glCreateShaderProgramv;\ntypedef void (APIENTRYP pfn_glBindProgramPipeline) (GLuint);\nextern pfn_glBindProgramPipeline fp_glBindProgramPipeline;\ntypedef void (APIENTRYP pfn_glDeleteProgramPipelines) (GLsizei, const GLuint*);\nextern pfn_glDeleteProgramPipelines fp_glDeleteProgramPipelines;\ntypedef void (APIENTRYP pfn_glGenProgramPipelines) (GLsizei, GLuint*);\nextern pfn_glGenProgramPipelines fp_glGenProgramPipelines;\ntypedef GLboolean (APIENTRYP pfn_glIsProgramPipeline) (GLuint);\nextern pfn_glIsProgramPipeline fp_glIsProgramPipeline;\ntypedef void (APIENTRYP pfn_glGetProgramPipelineiv) (GLuint, GLenum, GLint*);\nextern pfn_glGetProgramPipelineiv fp_glGetProgramPipelineiv;\ntypedef void (APIENTRYP pfn_glProgramUniform1i) (GLuint, GLint, GLint);\nextern pfn_glProgramUniform1i fp_glProgramUniform1i;\ntypedef void (APIENTRYP pfn_glProgramUniform1iv) (GLuint, GLint, GLsizei, const GLint*);\nextern pfn_glProgramUniform1iv fp_glProgramUniform1iv;\ntypedef void (APIENTRYP pfn_glProgramUniform1f) (GLuint, GLint, GLfloat);\nextern pfn_glProgramUniform1f fp_glProgramUniform1f;\ntypedef void (APIENTRYP pfn_glProgramUniform1fv) (GLuint, GLint, GLsizei, const GLfloat*);\nextern pfn_glProgramUniform1fv fp_glProgramUniform1fv;\ntypedef void (APIENTRYP pfn_glProgramUniform1d) (GLuint, GLint, GLdouble);\nextern pfn_glProgramUniform1d fp_glProgramUniform1d;\ntypedef void (APIENTRYP pfn_glProgramUniform1dv) (GLuint, GLint, GLsizei, const GLdouble*);\nextern pfn_glProgramUniform1dv fp_glProgramUniform1dv;\ntypedef void (APIENTRYP pfn_glProgramUniform1ui) (GLuint, GLint, GLuint);\nextern pfn_glProgramUniform1ui fp_glProgramUniform1ui;\ntypedef void (APIENTRYP pfn_glProgramUniform1uiv) (GLuint, GLint, GLsizei, const GLuint*);\nextern pfn_glProgramUniform1uiv fp_glProgramUniform1uiv;\ntypedef void (APIENTRYP pfn_glProgramUniform2i) (GLuint, GLint, GLint, GLint);\nextern pfn_glProgramUniform2i fp_glProgramUniform2i;\ntypedef void (APIENTRYP pfn_glProgramUniform2iv) (GLuint, GLint, GLsizei, const GLint*);\nextern pfn_glProgramUniform2iv fp_glProgramUniform2iv;\ntypedef void (APIENTRYP pfn_glProgramUniform2f) (GLuint, GLint, GLfloat, GLfloat);\nextern pfn_glProgramUniform2f fp_glProgramUniform2f;\ntypedef void (APIENTRYP pfn_glProgramUniform2fv) (GLuint, GLint, GLsizei, const GLfloat*);\nextern pfn_glProgramUniform2fv fp_glProgramUniform2fv;\ntypedef void (APIENTRYP pfn_glProgramUniform2d) (GLuint, GLint, GLdouble, GLdouble);\nextern pfn_glProgramUniform2d fp_glProgramUniform2d;\ntypedef void (APIENTRYP pfn_glProgramUniform2dv) (GLuint, GLint, GLsizei, const GLdouble*);\nextern pfn_glProgramUniform2dv fp_glProgramUniform2dv;\ntypedef void (APIENTRYP pfn_glProgramUniform2ui) (GLuint, GLint, GLuint, GLuint);\nextern pfn_glProgramUniform2ui fp_glProgramUniform2ui;\ntypedef void (APIENTRYP pfn_glProgramUniform2uiv) (GLuint, GLint, GLsizei, const GLuint*);\nextern pfn_glProgramUniform2uiv fp_glProgramUniform2uiv;\ntypedef void (APIENTRYP pfn_glProgramUniform3i) (GLuint, GLint, GLint, GLint, GLint);\nextern pfn_glProgramUniform3i fp_glProgramUniform3i;\ntypedef void (APIENTRYP pfn_glProgramUniform3iv) (GLuint, GLint, GLsizei, const GLint*);\nextern pfn_glProgramUniform3iv fp_glProgramUniform3iv;\ntypedef void (APIENTRYP pfn_glProgramUniform3f) (GLuint, GLint, GLfloat, GLfloat, GLfloat);\nextern pfn_glProgramUniform3f fp_glProgramUniform3f;\ntypedef void (APIENTRYP pfn_glProgramUniform3fv) (GLuint, GLint, GLsizei, const GLfloat*);\nextern pfn_glProgramUniform3fv fp_glProgramUniform3fv;\ntypedef void (APIENTRYP pfn_glProgramUniform3d) (GLuint, GLint, GLdouble, GLdouble, GLdouble);\nextern pfn_glProgramUniform3d fp_glProgramUniform3d;\ntypedef void (APIENTRYP pfn_glProgramUniform3dv) (GLuint, GLint, GLsizei, const GLdouble*);\nextern pfn_glProgramUniform3dv fp_glProgramUniform3dv;\ntypedef void (APIENTRYP pfn_glProgramUniform3ui) (GLuint, GLint, GLuint, GLuint, GLuint);\nextern pfn_glProgramUniform3ui fp_glProgramUniform3ui;\ntypedef void (APIENTRYP pfn_glProgramUniform3uiv) (GLuint, GLint, GLsizei, const GLuint*);\nextern pfn_glProgramUniform3uiv fp_glProgramUniform3uiv;\ntypedef void (APIENTRYP pfn_glProgramUniform4i) (GLuint, GLint, GLint, GLint, GLint, GLint);\nextern pfn_glProgramUniform4i fp_glProgramUniform4i;\ntypedef void (APIENTRYP pfn_glProgramUniform4iv) (GLuint, GLint, GLsizei, const GLint*);\nextern pfn_glProgramUniform4iv fp_glProgramUniform4iv;\ntypedef void (APIENTRYP pfn_glProgramUniform4f) (GLuint, GLint, GLfloat, GLfloat, GLfloat, GLfloat);\nextern pfn_glProgramUniform4f fp_glProgramUniform4f;\ntypedef void (APIENTRYP pfn_glProgramUniform4fv) (GLuint, GLint, GLsizei, const GLfloat*);\nextern pfn_glProgramUniform4fv fp_glProgramUniform4fv;\ntypedef void (APIENTRYP pfn_glProgramUniform4d) (GLuint, GLint, GLdouble, GLdouble, GLdouble, GLdouble);\nextern pfn_glProgramUniform4d fp_glProgramUniform4d;\ntypedef void (APIENTRYP pfn_glProgramUniform4dv) (GLuint, GLint, GLsizei, const GLdouble*);\nextern pfn_glProgramUniform4dv fp_glProgramUniform4dv;\ntypedef void (APIENTRYP pfn_glProgramUniform4ui) (GLuint, GLint, GLuint, GLuint, GLuint, GLuint);\nextern pfn_glProgramUniform4ui fp_glProgramUniform4ui;\ntypedef void (APIENTRYP pfn_glProgramUniform4uiv) (GLuint, GLint, GLsizei, const GLuint*);\nextern pfn_glProgramUniform4uiv fp_glProgramUniform4uiv;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix2fv) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glProgramUniformMatrix2fv fp_glProgramUniformMatrix2fv;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix3fv) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glProgramUniformMatrix3fv fp_glProgramUniformMatrix3fv;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix4fv) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glProgramUniformMatrix4fv fp_glProgramUniformMatrix4fv;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix2dv) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glProgramUniformMatrix2dv fp_glProgramUniformMatrix2dv;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix3dv) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glProgramUniformMatrix3dv fp_glProgramUniformMatrix3dv;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix4dv) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glProgramUniformMatrix4dv fp_glProgramUniformMatrix4dv;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix2x3fv) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glProgramUniformMatrix2x3fv fp_glProgramUniformMatrix2x3fv;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix3x2fv) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glProgramUniformMatrix3x2fv fp_glProgramUniformMatrix3x2fv;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix2x4fv) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glProgramUniformMatrix2x4fv fp_glProgramUniformMatrix2x4fv;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix4x2fv) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glProgramUniformMatrix4x2fv fp_glProgramUniformMatrix4x2fv;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix3x4fv) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glProgramUniformMatrix3x4fv fp_glProgramUniformMatrix3x4fv;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix4x3fv) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glProgramUniformMatrix4x3fv fp_glProgramUniformMatrix4x3fv;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix2x3dv) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glProgramUniformMatrix2x3dv fp_glProgramUniformMatrix2x3dv;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix3x2dv) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glProgramUniformMatrix3x2dv fp_glProgramUniformMatrix3x2dv;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix2x4dv) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glProgramUniformMatrix2x4dv fp_glProgramUniformMatrix2x4dv;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix4x2dv) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glProgramUniformMatrix4x2dv fp_glProgramUniformMatrix4x2dv;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix3x4dv) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glProgramUniformMatrix3x4dv fp_glProgramUniformMatrix3x4dv;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix4x3dv) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glProgramUniformMatrix4x3dv fp_glProgramUniformMatrix4x3dv;\ntypedef void (APIENTRYP pfn_glValidateProgramPipeline) (GLuint);\nextern pfn_glValidateProgramPipeline fp_glValidateProgramPipeline;\ntypedef void (APIENTRYP pfn_glGetProgramPipelineInfoLog) (GLuint, GLsizei, GLsizei*, GLchar*);\nextern pfn_glGetProgramPipelineInfoLog fp_glGetProgramPipelineInfoLog;\ntypedef void (APIENTRYP pfn_glVertexAttribL1d) (GLuint, GLdouble);\nextern pfn_glVertexAttribL1d fp_glVertexAttribL1d;\ntypedef void (APIENTRYP pfn_glVertexAttribL2d) (GLuint, GLdouble, GLdouble);\nextern pfn_glVertexAttribL2d fp_glVertexAttribL2d;\ntypedef void (APIENTRYP pfn_glVertexAttribL3d) (GLuint, GLdouble, GLdouble, GLdouble);\nextern pfn_glVertexAttribL3d fp_glVertexAttribL3d;\ntypedef void (APIENTRYP pfn_glVertexAttribL4d) (GLuint, GLdouble, GLdouble, GLdouble, GLdouble);\nextern pfn_glVertexAttribL4d fp_glVertexAttribL4d;\ntypedef void (APIENTRYP pfn_glVertexAttribL1dv) (GLuint, const GLdouble*);\nextern pfn_glVertexAttribL1dv fp_glVertexAttribL1dv;\ntypedef void (APIENTRYP pfn_glVertexAttribL2dv) (GLuint, const GLdouble*);\nextern pfn_glVertexAttribL2dv fp_glVertexAttribL2dv;\ntypedef void (APIENTRYP pfn_glVertexAttribL3dv) (GLuint, const GLdouble*);\nextern pfn_glVertexAttribL3dv fp_glVertexAttribL3dv;\ntypedef void (APIENTRYP pfn_glVertexAttribL4dv) (GLuint, const GLdouble*);\nextern pfn_glVertexAttribL4dv fp_glVertexAttribL4dv;\ntypedef void (APIENTRYP pfn_glVertexAttribLPointer) (GLuint, GLint, GLenum, GLsizei, const void*);\nextern pfn_glVertexAttribLPointer fp_glVertexAttribLPointer;\ntypedef void (APIENTRYP pfn_glGetVertexAttribLdv) (GLuint, GLenum, GLdouble*);\nextern pfn_glGetVertexAttribLdv fp_glGetVertexAttribLdv;\ntypedef void (APIENTRYP pfn_glViewportArrayv) (GLuint, GLsizei, const GLfloat*);\nextern pfn_glViewportArrayv fp_glViewportArrayv;\ntypedef void (APIENTRYP pfn_glViewportIndexedf) (GLuint, GLfloat, GLfloat, GLfloat, GLfloat);\nextern pfn_glViewportIndexedf fp_glViewportIndexedf;\ntypedef void (APIENTRYP pfn_glViewportIndexedfv) (GLuint, const GLfloat*);\nextern pfn_glViewportIndexedfv fp_glViewportIndexedfv;\ntypedef void (APIENTRYP pfn_glScissorArrayv) (GLuint, GLsizei, const GLint*);\nextern pfn_glScissorArrayv fp_glScissorArrayv;\ntypedef void (APIENTRYP pfn_glScissorIndexed) (GLuint, GLint, GLint, GLsizei, GLsizei);\nextern pfn_glScissorIndexed fp_glScissorIndexed;\ntypedef void (APIENTRYP pfn_glScissorIndexedv) (GLuint, const GLint*);\nextern pfn_glScissorIndexedv fp_glScissorIndexedv;\ntypedef void (APIENTRYP pfn_glDepthRangeArrayv) (GLuint, GLsizei, const GLdouble*);\nextern pfn_glDepthRangeArrayv fp_glDepthRangeArrayv;\ntypedef void (APIENTRYP pfn_glDepthRangeIndexed) (GLuint, GLdouble, GLdouble);\nextern pfn_glDepthRangeIndexed fp_glDepthRangeIndexed;\ntypedef void (APIENTRYP pfn_glGetFloati_v) (GLenum, GLuint, GLfloat*);\nextern pfn_glGetFloati_v fp_glGetFloati_v;\ntypedef void (APIENTRYP pfn_glGetDoublei_v) (GLenum, GLuint, GLdouble*);\nextern pfn_glGetDoublei_v fp_glGetDoublei_v;\n\n /* GL_VERSION_4_2 */\nextern GLboolean GLAD_VERSION_4_2;\n#define GL_COPY_READ_BUFFER_BINDING            0x8F36\n#define GL_COPY_WRITE_BUFFER_BINDING           0x8F37\n#define GL_TRANSFORM_FEEDBACK_ACTIVE           0x8E24\n#define GL_TRANSFORM_FEEDBACK_PAUSED           0x8E23\n#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH       0x9127\n#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT      0x9128\n#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH       0x9129\n#define GL_UNPACK_COMPRESSED_BLOCK_SIZE        0x912A\n#define GL_PACK_COMPRESSED_BLOCK_WIDTH         0x912B\n#define GL_PACK_COMPRESSED_BLOCK_HEIGHT        0x912C\n#define GL_PACK_COMPRESSED_BLOCK_DEPTH         0x912D\n#define GL_PACK_COMPRESSED_BLOCK_SIZE          0x912E\n#define GL_NUM_SAMPLE_COUNTS                   0x9380\n#define GL_MIN_MAP_BUFFER_ALIGNMENT            0x90BC\n#define GL_ATOMIC_COUNTER_BUFFER               0x92C0\n#define GL_ATOMIC_COUNTER_BUFFER_BINDING       0x92C1\n#define GL_ATOMIC_COUNTER_BUFFER_START         0x92C2\n#define GL_ATOMIC_COUNTER_BUFFER_SIZE          0x92C3\n#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE     0x92C4\n#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS  0x92C5\n#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES  0x92C6\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER  0x92C7\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER  0x92C8\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER  0x92C9\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER  0x92CA\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER  0x92CB\n#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS   0x92CC\n#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS  0x92CD\n#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS  0x92CE\n#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS  0x92CF\n#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS  0x92D0\n#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS  0x92D1\n#define GL_MAX_VERTEX_ATOMIC_COUNTERS          0x92D2\n#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS    0x92D3\n#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS  0x92D4\n#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS        0x92D5\n#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS        0x92D6\n#define GL_MAX_COMBINED_ATOMIC_COUNTERS        0x92D7\n#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE      0x92D8\n#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS  0x92DC\n#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS       0x92D9\n#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX  0x92DA\n#define GL_UNSIGNED_INT_ATOMIC_COUNTER         0x92DB\n#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT     0x00000001\n#define GL_ELEMENT_ARRAY_BARRIER_BIT           0x00000002\n#define GL_UNIFORM_BARRIER_BIT                 0x00000004\n#define GL_TEXTURE_FETCH_BARRIER_BIT           0x00000008\n#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT     0x00000020\n#define GL_COMMAND_BARRIER_BIT                 0x00000040\n#define GL_PIXEL_BUFFER_BARRIER_BIT            0x00000080\n#define GL_TEXTURE_UPDATE_BARRIER_BIT          0x00000100\n#define GL_BUFFER_UPDATE_BARRIER_BIT           0x00000200\n#define GL_FRAMEBUFFER_BARRIER_BIT             0x00000400\n#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT      0x00000800\n#define GL_ATOMIC_COUNTER_BARRIER_BIT          0x00001000\n#define GL_ALL_BARRIER_BITS                    0xFFFFFFFF\n#define GL_MAX_IMAGE_UNITS                     0x8F38\n#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS  0x8F39\n#define GL_IMAGE_BINDING_NAME                  0x8F3A\n#define GL_IMAGE_BINDING_LEVEL                 0x8F3B\n#define GL_IMAGE_BINDING_LAYERED               0x8F3C\n#define GL_IMAGE_BINDING_LAYER                 0x8F3D\n#define GL_IMAGE_BINDING_ACCESS                0x8F3E\n#define GL_IMAGE_1D                            0x904C\n#define GL_IMAGE_2D                            0x904D\n#define GL_IMAGE_3D                            0x904E\n#define GL_IMAGE_2D_RECT                       0x904F\n#define GL_IMAGE_CUBE                          0x9050\n#define GL_IMAGE_BUFFER                        0x9051\n#define GL_IMAGE_1D_ARRAY                      0x9052\n#define GL_IMAGE_2D_ARRAY                      0x9053\n#define GL_IMAGE_CUBE_MAP_ARRAY                0x9054\n#define GL_IMAGE_2D_MULTISAMPLE                0x9055\n#define GL_IMAGE_2D_MULTISAMPLE_ARRAY          0x9056\n#define GL_INT_IMAGE_1D                        0x9057\n#define GL_INT_IMAGE_2D                        0x9058\n#define GL_INT_IMAGE_3D                        0x9059\n#define GL_INT_IMAGE_2D_RECT                   0x905A\n#define GL_INT_IMAGE_CUBE                      0x905B\n#define GL_INT_IMAGE_BUFFER                    0x905C\n#define GL_INT_IMAGE_1D_ARRAY                  0x905D\n#define GL_INT_IMAGE_2D_ARRAY                  0x905E\n#define GL_INT_IMAGE_CUBE_MAP_ARRAY            0x905F\n#define GL_INT_IMAGE_2D_MULTISAMPLE            0x9060\n#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY      0x9061\n#define GL_UNSIGNED_INT_IMAGE_1D               0x9062\n#define GL_UNSIGNED_INT_IMAGE_2D               0x9063\n#define GL_UNSIGNED_INT_IMAGE_3D               0x9064\n#define GL_UNSIGNED_INT_IMAGE_2D_RECT          0x9065\n#define GL_UNSIGNED_INT_IMAGE_CUBE             0x9066\n#define GL_UNSIGNED_INT_IMAGE_BUFFER           0x9067\n#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY         0x9068\n#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY         0x9069\n#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY   0x906A\n#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE   0x906B\n#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY  0x906C\n#define GL_MAX_IMAGE_SAMPLES                   0x906D\n#define GL_IMAGE_BINDING_FORMAT                0x906E\n#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE     0x90C7\n#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE  0x90C8\n#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS  0x90C9\n#define GL_MAX_VERTEX_IMAGE_UNIFORMS           0x90CA\n#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS     0x90CB\n#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS  0x90CC\n#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS         0x90CD\n#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS         0x90CE\n#define GL_MAX_COMBINED_IMAGE_UNIFORMS         0x90CF\n#define GL_COMPRESSED_RGBA_BPTC_UNORM          0x8E8C\n#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM    0x8E8D\n#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT    0x8E8E\n#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT  0x8E8F\n#define GL_TEXTURE_IMMUTABLE_FORMAT            0x912F\ntypedef void (APIENTRYP pfn_glDrawArraysInstancedBaseInstance) (GLenum, GLint, GLsizei, GLsizei, GLuint);\nextern pfn_glDrawArraysInstancedBaseInstance fp_glDrawArraysInstancedBaseInstance;\ntypedef void (APIENTRYP pfn_glDrawElementsInstancedBaseInstance) (GLenum, GLsizei, GLenum, const void*, GLsizei, GLuint);\nextern pfn_glDrawElementsInstancedBaseInstance fp_glDrawElementsInstancedBaseInstance;\ntypedef void (APIENTRYP pfn_glDrawElementsInstancedBaseVertexBaseInstance) (GLenum, GLsizei, GLenum, const void*, GLsizei, GLint, GLuint);\nextern pfn_glDrawElementsInstancedBaseVertexBaseInstance fp_glDrawElementsInstancedBaseVertexBaseInstance;\ntypedef void (APIENTRYP pfn_glGetInternalformativ) (GLenum, GLenum, GLenum, GLsizei, GLint*);\nextern pfn_glGetInternalformativ fp_glGetInternalformativ;\ntypedef void (APIENTRYP pfn_glGetActiveAtomicCounterBufferiv) (GLuint, GLuint, GLenum, GLint*);\nextern pfn_glGetActiveAtomicCounterBufferiv fp_glGetActiveAtomicCounterBufferiv;\ntypedef void (APIENTRYP pfn_glBindImageTexture) (GLuint, GLuint, GLint, GLboolean, GLint, GLenum, GLenum);\nextern pfn_glBindImageTexture fp_glBindImageTexture;\ntypedef void (APIENTRYP pfn_glMemoryBarrier) (GLbitfield);\nextern pfn_glMemoryBarrier fp_glMemoryBarrier;\ntypedef void (APIENTRYP pfn_glTexStorage1D) (GLenum, GLsizei, GLenum, GLsizei);\nextern pfn_glTexStorage1D fp_glTexStorage1D;\ntypedef void (APIENTRYP pfn_glTexStorage2D) (GLenum, GLsizei, GLenum, GLsizei, GLsizei);\nextern pfn_glTexStorage2D fp_glTexStorage2D;\ntypedef void (APIENTRYP pfn_glTexStorage3D) (GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei);\nextern pfn_glTexStorage3D fp_glTexStorage3D;\ntypedef void (APIENTRYP pfn_glDrawTransformFeedbackInstanced) (GLenum, GLuint, GLsizei);\nextern pfn_glDrawTransformFeedbackInstanced fp_glDrawTransformFeedbackInstanced;\ntypedef void (APIENTRYP pfn_glDrawTransformFeedbackStreamInstanced) (GLenum, GLuint, GLuint, GLsizei);\nextern pfn_glDrawTransformFeedbackStreamInstanced fp_glDrawTransformFeedbackStreamInstanced;\n\n /* GL_VERSION_4_3 */\nextern GLboolean GLAD_VERSION_4_3;\n#define GL_NUM_SHADING_LANGUAGE_VERSIONS       0x82E9\n#define GL_VERTEX_ATTRIB_ARRAY_LONG            0x874E\n#define GL_COMPRESSED_RGB8_ETC2                0x9274\n#define GL_COMPRESSED_SRGB8_ETC2               0x9275\n#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2  0x9276\n#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2  0x9277\n#define GL_COMPRESSED_RGBA8_ETC2_EAC           0x9278\n#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC    0x9279\n#define GL_COMPRESSED_R11_EAC                  0x9270\n#define GL_COMPRESSED_SIGNED_R11_EAC           0x9271\n#define GL_COMPRESSED_RG11_EAC                 0x9272\n#define GL_COMPRESSED_SIGNED_RG11_EAC          0x9273\n#define GL_PRIMITIVE_RESTART_FIXED_INDEX       0x8D69\n#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE     0x8D6A\n#define GL_MAX_ELEMENT_INDEX                   0x8D6B\n#define GL_COMPUTE_SHADER                      0x91B9\n#define GL_MAX_COMPUTE_UNIFORM_BLOCKS          0x91BB\n#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS     0x91BC\n#define GL_MAX_COMPUTE_IMAGE_UNIFORMS          0x91BD\n#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE      0x8262\n#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS      0x8263\n#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS  0x8264\n#define GL_MAX_COMPUTE_ATOMIC_COUNTERS         0x8265\n#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS  0x8266\n#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS  0x90EB\n#define GL_MAX_COMPUTE_WORK_GROUP_COUNT        0x91BE\n#define GL_MAX_COMPUTE_WORK_GROUP_SIZE         0x91BF\n#define GL_COMPUTE_WORK_GROUP_SIZE             0x8267\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER  0x90EC\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER  0x90ED\n#define GL_DISPATCH_INDIRECT_BUFFER            0x90EE\n#define GL_DISPATCH_INDIRECT_BUFFER_BINDING    0x90EF\n#define GL_COMPUTE_SHADER_BIT                  0x00000020\n#define GL_DEBUG_OUTPUT_SYNCHRONOUS            0x8242\n#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH    0x8243\n#define GL_DEBUG_CALLBACK_FUNCTION             0x8244\n#define GL_DEBUG_CALLBACK_USER_PARAM           0x8245\n#define GL_DEBUG_SOURCE_API                    0x8246\n#define GL_DEBUG_SOURCE_WINDOW_SYSTEM          0x8247\n#define GL_DEBUG_SOURCE_SHADER_COMPILER        0x8248\n#define GL_DEBUG_SOURCE_THIRD_PARTY            0x8249\n#define GL_DEBUG_SOURCE_APPLICATION            0x824A\n#define GL_DEBUG_SOURCE_OTHER                  0x824B\n#define GL_DEBUG_TYPE_ERROR                    0x824C\n#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR      0x824D\n#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR       0x824E\n#define GL_DEBUG_TYPE_PORTABILITY              0x824F\n#define GL_DEBUG_TYPE_PERFORMANCE              0x8250\n#define GL_DEBUG_TYPE_OTHER                    0x8251\n#define GL_MAX_DEBUG_MESSAGE_LENGTH            0x9143\n#define GL_MAX_DEBUG_LOGGED_MESSAGES           0x9144\n#define GL_DEBUG_LOGGED_MESSAGES               0x9145\n#define GL_DEBUG_SEVERITY_HIGH                 0x9146\n#define GL_DEBUG_SEVERITY_MEDIUM               0x9147\n#define GL_DEBUG_SEVERITY_LOW                  0x9148\n#define GL_DEBUG_TYPE_MARKER                   0x8268\n#define GL_DEBUG_TYPE_PUSH_GROUP               0x8269\n#define GL_DEBUG_TYPE_POP_GROUP                0x826A\n#define GL_DEBUG_SEVERITY_NOTIFICATION         0x826B\n#define GL_MAX_DEBUG_GROUP_STACK_DEPTH         0x826C\n#define GL_DEBUG_GROUP_STACK_DEPTH             0x826D\n#define GL_BUFFER                              0x82E0\n#define GL_SHADER                              0x82E1\n#define GL_PROGRAM                             0x82E2\n#define GL_QUERY                               0x82E3\n#define GL_PROGRAM_PIPELINE                    0x82E4\n#define GL_SAMPLER                             0x82E6\n#define GL_MAX_LABEL_LENGTH                    0x82E8\n#define GL_DEBUG_OUTPUT                        0x92E0\n#define GL_CONTEXT_FLAG_DEBUG_BIT              0x00000002\n#define GL_MAX_UNIFORM_LOCATIONS               0x826E\n#define GL_FRAMEBUFFER_DEFAULT_WIDTH           0x9310\n#define GL_FRAMEBUFFER_DEFAULT_HEIGHT          0x9311\n#define GL_FRAMEBUFFER_DEFAULT_LAYERS          0x9312\n#define GL_FRAMEBUFFER_DEFAULT_SAMPLES         0x9313\n#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS  0x9314\n#define GL_MAX_FRAMEBUFFER_WIDTH               0x9315\n#define GL_MAX_FRAMEBUFFER_HEIGHT              0x9316\n#define GL_MAX_FRAMEBUFFER_LAYERS              0x9317\n#define GL_MAX_FRAMEBUFFER_SAMPLES             0x9318\n#define GL_INTERNALFORMAT_SUPPORTED            0x826F\n#define GL_INTERNALFORMAT_PREFERRED            0x8270\n#define GL_INTERNALFORMAT_RED_SIZE             0x8271\n#define GL_INTERNALFORMAT_GREEN_SIZE           0x8272\n#define GL_INTERNALFORMAT_BLUE_SIZE            0x8273\n#define GL_INTERNALFORMAT_ALPHA_SIZE           0x8274\n#define GL_INTERNALFORMAT_DEPTH_SIZE           0x8275\n#define GL_INTERNALFORMAT_STENCIL_SIZE         0x8276\n#define GL_INTERNALFORMAT_SHARED_SIZE          0x8277\n#define GL_INTERNALFORMAT_RED_TYPE             0x8278\n#define GL_INTERNALFORMAT_GREEN_TYPE           0x8279\n#define GL_INTERNALFORMAT_BLUE_TYPE            0x827A\n#define GL_INTERNALFORMAT_ALPHA_TYPE           0x827B\n#define GL_INTERNALFORMAT_DEPTH_TYPE           0x827C\n#define GL_INTERNALFORMAT_STENCIL_TYPE         0x827D\n#define GL_MAX_WIDTH                           0x827E\n#define GL_MAX_HEIGHT                          0x827F\n#define GL_MAX_DEPTH                           0x8280\n#define GL_MAX_LAYERS                          0x8281\n#define GL_MAX_COMBINED_DIMENSIONS             0x8282\n#define GL_COLOR_COMPONENTS                    0x8283\n#define GL_DEPTH_COMPONENTS                    0x8284\n#define GL_STENCIL_COMPONENTS                  0x8285\n#define GL_COLOR_RENDERABLE                    0x8286\n#define GL_DEPTH_RENDERABLE                    0x8287\n#define GL_STENCIL_RENDERABLE                  0x8288\n#define GL_FRAMEBUFFER_RENDERABLE              0x8289\n#define GL_FRAMEBUFFER_RENDERABLE_LAYERED      0x828A\n#define GL_FRAMEBUFFER_BLEND                   0x828B\n#define GL_READ_PIXELS                         0x828C\n#define GL_READ_PIXELS_FORMAT                  0x828D\n#define GL_READ_PIXELS_TYPE                    0x828E\n#define GL_TEXTURE_IMAGE_FORMAT                0x828F\n#define GL_TEXTURE_IMAGE_TYPE                  0x8290\n#define GL_GET_TEXTURE_IMAGE_FORMAT            0x8291\n#define GL_GET_TEXTURE_IMAGE_TYPE              0x8292\n#define GL_MIPMAP                              0x8293\n#define GL_MANUAL_GENERATE_MIPMAP              0x8294\n#define GL_AUTO_GENERATE_MIPMAP                0x8295\n#define GL_COLOR_ENCODING                      0x8296\n#define GL_SRGB_READ                           0x8297\n#define GL_SRGB_WRITE                          0x8298\n#define GL_FILTER                              0x829A\n#define GL_VERTEX_TEXTURE                      0x829B\n#define GL_TESS_CONTROL_TEXTURE                0x829C\n#define GL_TESS_EVALUATION_TEXTURE             0x829D\n#define GL_GEOMETRY_TEXTURE                    0x829E\n#define GL_FRAGMENT_TEXTURE                    0x829F\n#define GL_COMPUTE_TEXTURE                     0x82A0\n#define GL_TEXTURE_SHADOW                      0x82A1\n#define GL_TEXTURE_GATHER                      0x82A2\n#define GL_TEXTURE_GATHER_SHADOW               0x82A3\n#define GL_SHADER_IMAGE_LOAD                   0x82A4\n#define GL_SHADER_IMAGE_STORE                  0x82A5\n#define GL_SHADER_IMAGE_ATOMIC                 0x82A6\n#define GL_IMAGE_TEXEL_SIZE                    0x82A7\n#define GL_IMAGE_COMPATIBILITY_CLASS           0x82A8\n#define GL_IMAGE_PIXEL_FORMAT                  0x82A9\n#define GL_IMAGE_PIXEL_TYPE                    0x82AA\n#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST  0x82AC\n#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST  0x82AD\n#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE  0x82AE\n#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE  0x82AF\n#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH      0x82B1\n#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT     0x82B2\n#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE       0x82B3\n#define GL_CLEAR_BUFFER                        0x82B4\n#define GL_TEXTURE_VIEW                        0x82B5\n#define GL_VIEW_COMPATIBILITY_CLASS            0x82B6\n#define GL_FULL_SUPPORT                        0x82B7\n#define GL_CAVEAT_SUPPORT                      0x82B8\n#define GL_IMAGE_CLASS_4_X_32                  0x82B9\n#define GL_IMAGE_CLASS_2_X_32                  0x82BA\n#define GL_IMAGE_CLASS_1_X_32                  0x82BB\n#define GL_IMAGE_CLASS_4_X_16                  0x82BC\n#define GL_IMAGE_CLASS_2_X_16                  0x82BD\n#define GL_IMAGE_CLASS_1_X_16                  0x82BE\n#define GL_IMAGE_CLASS_4_X_8                   0x82BF\n#define GL_IMAGE_CLASS_2_X_8                   0x82C0\n#define GL_IMAGE_CLASS_1_X_8                   0x82C1\n#define GL_IMAGE_CLASS_11_11_10                0x82C2\n#define GL_IMAGE_CLASS_10_10_10_2              0x82C3\n#define GL_VIEW_CLASS_128_BITS                 0x82C4\n#define GL_VIEW_CLASS_96_BITS                  0x82C5\n#define GL_VIEW_CLASS_64_BITS                  0x82C6\n#define GL_VIEW_CLASS_48_BITS                  0x82C7\n#define GL_VIEW_CLASS_32_BITS                  0x82C8\n#define GL_VIEW_CLASS_24_BITS                  0x82C9\n#define GL_VIEW_CLASS_16_BITS                  0x82CA\n#define GL_VIEW_CLASS_8_BITS                   0x82CB\n#define GL_VIEW_CLASS_S3TC_DXT1_RGB            0x82CC\n#define GL_VIEW_CLASS_S3TC_DXT1_RGBA           0x82CD\n#define GL_VIEW_CLASS_S3TC_DXT3_RGBA           0x82CE\n#define GL_VIEW_CLASS_S3TC_DXT5_RGBA           0x82CF\n#define GL_VIEW_CLASS_RGTC1_RED                0x82D0\n#define GL_VIEW_CLASS_RGTC2_RG                 0x82D1\n#define GL_VIEW_CLASS_BPTC_UNORM               0x82D2\n#define GL_VIEW_CLASS_BPTC_FLOAT               0x82D3\n#define GL_UNIFORM                             0x92E1\n#define GL_UNIFORM_BLOCK                       0x92E2\n#define GL_PROGRAM_INPUT                       0x92E3\n#define GL_PROGRAM_OUTPUT                      0x92E4\n#define GL_BUFFER_VARIABLE                     0x92E5\n#define GL_SHADER_STORAGE_BLOCK                0x92E6\n#define GL_VERTEX_SUBROUTINE                   0x92E8\n#define GL_TESS_CONTROL_SUBROUTINE             0x92E9\n#define GL_TESS_EVALUATION_SUBROUTINE          0x92EA\n#define GL_GEOMETRY_SUBROUTINE                 0x92EB\n#define GL_FRAGMENT_SUBROUTINE                 0x92EC\n#define GL_COMPUTE_SUBROUTINE                  0x92ED\n#define GL_VERTEX_SUBROUTINE_UNIFORM           0x92EE\n#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM     0x92EF\n#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM  0x92F0\n#define GL_GEOMETRY_SUBROUTINE_UNIFORM         0x92F1\n#define GL_FRAGMENT_SUBROUTINE_UNIFORM         0x92F2\n#define GL_COMPUTE_SUBROUTINE_UNIFORM          0x92F3\n#define GL_TRANSFORM_FEEDBACK_VARYING          0x92F4\n#define GL_ACTIVE_RESOURCES                    0x92F5\n#define GL_MAX_NAME_LENGTH                     0x92F6\n#define GL_MAX_NUM_ACTIVE_VARIABLES            0x92F7\n#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES      0x92F8\n#define GL_NAME_LENGTH                         0x92F9\n#define GL_TYPE                                0x92FA\n#define GL_ARRAY_SIZE                          0x92FB\n#define GL_OFFSET                              0x92FC\n#define GL_BLOCK_INDEX                         0x92FD\n#define GL_ARRAY_STRIDE                        0x92FE\n#define GL_MATRIX_STRIDE                       0x92FF\n#define GL_IS_ROW_MAJOR                        0x9300\n#define GL_ATOMIC_COUNTER_BUFFER_INDEX         0x9301\n#define GL_BUFFER_BINDING                      0x9302\n#define GL_BUFFER_DATA_SIZE                    0x9303\n#define GL_NUM_ACTIVE_VARIABLES                0x9304\n#define GL_ACTIVE_VARIABLES                    0x9305\n#define GL_REFERENCED_BY_VERTEX_SHADER         0x9306\n#define GL_REFERENCED_BY_TESS_CONTROL_SHADER   0x9307\n#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER  0x9308\n#define GL_REFERENCED_BY_GEOMETRY_SHADER       0x9309\n#define GL_REFERENCED_BY_FRAGMENT_SHADER       0x930A\n#define GL_REFERENCED_BY_COMPUTE_SHADER        0x930B\n#define GL_TOP_LEVEL_ARRAY_SIZE                0x930C\n#define GL_TOP_LEVEL_ARRAY_STRIDE              0x930D\n#define GL_LOCATION                            0x930E\n#define GL_LOCATION_INDEX                      0x930F\n#define GL_IS_PER_PATCH                        0x92E7\n#define GL_SHADER_STORAGE_BUFFER               0x90D2\n#define GL_SHADER_STORAGE_BUFFER_BINDING       0x90D3\n#define GL_SHADER_STORAGE_BUFFER_START         0x90D4\n#define GL_SHADER_STORAGE_BUFFER_SIZE          0x90D5\n#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS    0x90D6\n#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS  0x90D7\n#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS  0x90D8\n#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS  0x90D9\n#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS  0x90DA\n#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS   0x90DB\n#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS  0x90DC\n#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS  0x90DD\n#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE       0x90DE\n#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT  0x90DF\n#define GL_SHADER_STORAGE_BARRIER_BIT          0x00002000\n#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES  0x8F39\n#define GL_DEPTH_STENCIL_TEXTURE_MODE          0x90EA\n#define GL_TEXTURE_BUFFER_OFFSET               0x919D\n#define GL_TEXTURE_BUFFER_SIZE                 0x919E\n#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT     0x919F\n#define GL_TEXTURE_VIEW_MIN_LEVEL              0x82DB\n#define GL_TEXTURE_VIEW_NUM_LEVELS             0x82DC\n#define GL_TEXTURE_VIEW_MIN_LAYER              0x82DD\n#define GL_TEXTURE_VIEW_NUM_LAYERS             0x82DE\n#define GL_TEXTURE_IMMUTABLE_LEVELS            0x82DF\n#define GL_VERTEX_ATTRIB_BINDING               0x82D4\n#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET       0x82D5\n#define GL_VERTEX_BINDING_DIVISOR              0x82D6\n#define GL_VERTEX_BINDING_OFFSET               0x82D7\n#define GL_VERTEX_BINDING_STRIDE               0x82D8\n#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET   0x82D9\n#define GL_MAX_VERTEX_ATTRIB_BINDINGS          0x82DA\n#define GL_VERTEX_BINDING_BUFFER               0x8F4F\n#define GL_DISPLAY_LIST                        0x82E7\ntypedef void (APIENTRYP pfn_glClearBufferData) (GLenum, GLenum, GLenum, GLenum, const void*);\nextern pfn_glClearBufferData fp_glClearBufferData;\ntypedef void (APIENTRYP pfn_glClearBufferSubData) (GLenum, GLenum, GLintptr, GLsizeiptr, GLenum, GLenum, const void*);\nextern pfn_glClearBufferSubData fp_glClearBufferSubData;\ntypedef void (APIENTRYP pfn_glDispatchCompute) (GLuint, GLuint, GLuint);\nextern pfn_glDispatchCompute fp_glDispatchCompute;\ntypedef void (APIENTRYP pfn_glDispatchComputeIndirect) (GLintptr);\nextern pfn_glDispatchComputeIndirect fp_glDispatchComputeIndirect;\ntypedef void (APIENTRYP pfn_glCopyImageSubData) (GLuint, GLenum, GLint, GLint, GLint, GLint, GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei);\nextern pfn_glCopyImageSubData fp_glCopyImageSubData;\ntypedef void (APIENTRYP pfn_glFramebufferParameteri) (GLenum, GLenum, GLint);\nextern pfn_glFramebufferParameteri fp_glFramebufferParameteri;\ntypedef void (APIENTRYP pfn_glGetFramebufferParameteriv) (GLenum, GLenum, GLint*);\nextern pfn_glGetFramebufferParameteriv fp_glGetFramebufferParameteriv;\ntypedef void (APIENTRYP pfn_glGetInternalformati64v) (GLenum, GLenum, GLenum, GLsizei, GLint64*);\nextern pfn_glGetInternalformati64v fp_glGetInternalformati64v;\ntypedef void (APIENTRYP pfn_glInvalidateTexSubImage) (GLuint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei);\nextern pfn_glInvalidateTexSubImage fp_glInvalidateTexSubImage;\ntypedef void (APIENTRYP pfn_glInvalidateTexImage) (GLuint, GLint);\nextern pfn_glInvalidateTexImage fp_glInvalidateTexImage;\ntypedef void (APIENTRYP pfn_glInvalidateBufferSubData) (GLuint, GLintptr, GLsizeiptr);\nextern pfn_glInvalidateBufferSubData fp_glInvalidateBufferSubData;\ntypedef void (APIENTRYP pfn_glInvalidateBufferData) (GLuint);\nextern pfn_glInvalidateBufferData fp_glInvalidateBufferData;\ntypedef void (APIENTRYP pfn_glInvalidateFramebuffer) (GLenum, GLsizei, const GLenum*);\nextern pfn_glInvalidateFramebuffer fp_glInvalidateFramebuffer;\ntypedef void (APIENTRYP pfn_glInvalidateSubFramebuffer) (GLenum, GLsizei, const GLenum*, GLint, GLint, GLsizei, GLsizei);\nextern pfn_glInvalidateSubFramebuffer fp_glInvalidateSubFramebuffer;\ntypedef void (APIENTRYP pfn_glMultiDrawArraysIndirect) (GLenum, const void*, GLsizei, GLsizei);\nextern pfn_glMultiDrawArraysIndirect fp_glMultiDrawArraysIndirect;\ntypedef void (APIENTRYP pfn_glMultiDrawElementsIndirect) (GLenum, GLenum, const void*, GLsizei, GLsizei);\nextern pfn_glMultiDrawElementsIndirect fp_glMultiDrawElementsIndirect;\ntypedef void (APIENTRYP pfn_glGetProgramInterfaceiv) (GLuint, GLenum, GLenum, GLint*);\nextern pfn_glGetProgramInterfaceiv fp_glGetProgramInterfaceiv;\ntypedef GLuint (APIENTRYP pfn_glGetProgramResourceIndex) (GLuint, GLenum, const GLchar*);\nextern pfn_glGetProgramResourceIndex fp_glGetProgramResourceIndex;\ntypedef void (APIENTRYP pfn_glGetProgramResourceName) (GLuint, GLenum, GLuint, GLsizei, GLsizei*, GLchar*);\nextern pfn_glGetProgramResourceName fp_glGetProgramResourceName;\ntypedef void (APIENTRYP pfn_glGetProgramResourceiv) (GLuint, GLenum, GLuint, GLsizei, const GLenum*, GLsizei, GLsizei*, GLint*);\nextern pfn_glGetProgramResourceiv fp_glGetProgramResourceiv;\ntypedef GLint (APIENTRYP pfn_glGetProgramResourceLocation) (GLuint, GLenum, const GLchar*);\nextern pfn_glGetProgramResourceLocation fp_glGetProgramResourceLocation;\ntypedef GLint (APIENTRYP pfn_glGetProgramResourceLocationIndex) (GLuint, GLenum, const GLchar*);\nextern pfn_glGetProgramResourceLocationIndex fp_glGetProgramResourceLocationIndex;\ntypedef void (APIENTRYP pfn_glShaderStorageBlockBinding) (GLuint, GLuint, GLuint);\nextern pfn_glShaderStorageBlockBinding fp_glShaderStorageBlockBinding;\ntypedef void (APIENTRYP pfn_glTexBufferRange) (GLenum, GLenum, GLuint, GLintptr, GLsizeiptr);\nextern pfn_glTexBufferRange fp_glTexBufferRange;\ntypedef void (APIENTRYP pfn_glTexStorage2DMultisample) (GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLboolean);\nextern pfn_glTexStorage2DMultisample fp_glTexStorage2DMultisample;\ntypedef void (APIENTRYP pfn_glTexStorage3DMultisample) (GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei, GLboolean);\nextern pfn_glTexStorage3DMultisample fp_glTexStorage3DMultisample;\ntypedef void (APIENTRYP pfn_glTextureView) (GLuint, GLenum, GLuint, GLenum, GLuint, GLuint, GLuint, GLuint);\nextern pfn_glTextureView fp_glTextureView;\ntypedef void (APIENTRYP pfn_glBindVertexBuffer) (GLuint, GLuint, GLintptr, GLsizei);\nextern pfn_glBindVertexBuffer fp_glBindVertexBuffer;\ntypedef void (APIENTRYP pfn_glVertexAttribFormat) (GLuint, GLint, GLenum, GLboolean, GLuint);\nextern pfn_glVertexAttribFormat fp_glVertexAttribFormat;\ntypedef void (APIENTRYP pfn_glVertexAttribIFormat) (GLuint, GLint, GLenum, GLuint);\nextern pfn_glVertexAttribIFormat fp_glVertexAttribIFormat;\ntypedef void (APIENTRYP pfn_glVertexAttribLFormat) (GLuint, GLint, GLenum, GLuint);\nextern pfn_glVertexAttribLFormat fp_glVertexAttribLFormat;\ntypedef void (APIENTRYP pfn_glVertexAttribBinding) (GLuint, GLuint);\nextern pfn_glVertexAttribBinding fp_glVertexAttribBinding;\ntypedef void (APIENTRYP pfn_glVertexBindingDivisor) (GLuint, GLuint);\nextern pfn_glVertexBindingDivisor fp_glVertexBindingDivisor;\ntypedef void (APIENTRYP pfn_glDebugMessageControl) (GLenum, GLenum, GLenum, GLsizei, const GLuint*, GLboolean);\nextern pfn_glDebugMessageControl fp_glDebugMessageControl;\ntypedef void (APIENTRYP pfn_glDebugMessageInsert) (GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*);\nextern pfn_glDebugMessageInsert fp_glDebugMessageInsert;\ntypedef void (APIENTRYP pfn_glDebugMessageCallback) (GLDEBUGPROC, const void*);\nextern pfn_glDebugMessageCallback fp_glDebugMessageCallback;\ntypedef GLuint (APIENTRYP pfn_glGetDebugMessageLog) (GLuint, GLsizei, GLenum*, GLenum*, GLuint*, GLenum*, GLsizei*, GLchar*);\nextern pfn_glGetDebugMessageLog fp_glGetDebugMessageLog;\ntypedef void (APIENTRYP pfn_glPushDebugGroup) (GLenum, GLuint, GLsizei, const GLchar*);\nextern pfn_glPushDebugGroup fp_glPushDebugGroup;\ntypedef void (APIENTRYP pfn_glPopDebugGroup) ();\nextern pfn_glPopDebugGroup fp_glPopDebugGroup;\ntypedef void (APIENTRYP pfn_glObjectLabel) (GLenum, GLuint, GLsizei, const GLchar*);\nextern pfn_glObjectLabel fp_glObjectLabel;\ntypedef void (APIENTRYP pfn_glGetObjectLabel) (GLenum, GLuint, GLsizei, GLsizei*, GLchar*);\nextern pfn_glGetObjectLabel fp_glGetObjectLabel;\ntypedef void (APIENTRYP pfn_glObjectPtrLabel) (const void*, GLsizei, const GLchar*);\nextern pfn_glObjectPtrLabel fp_glObjectPtrLabel;\ntypedef void (APIENTRYP pfn_glGetObjectPtrLabel) (const void*, GLsizei, GLsizei*, GLchar*);\nextern pfn_glGetObjectPtrLabel fp_glGetObjectPtrLabel;\n\n /* GL_VERSION_4_4 */\nextern GLboolean GLAD_VERSION_4_4;\n#define GL_MAX_VERTEX_ATTRIB_STRIDE            0x82E5\n#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED  0x8221\n#define GL_TEXTURE_BUFFER_BINDING              0x8C2A\n#define GL_MAP_PERSISTENT_BIT                  0x0040\n#define GL_MAP_COHERENT_BIT                    0x0080\n#define GL_DYNAMIC_STORAGE_BIT                 0x0100\n#define GL_CLIENT_STORAGE_BIT                  0x0200\n#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT    0x00004000\n#define GL_BUFFER_IMMUTABLE_STORAGE            0x821F\n#define GL_BUFFER_STORAGE_FLAGS                0x8220\n#define GL_CLEAR_TEXTURE                       0x9365\n#define GL_LOCATION_COMPONENT                  0x934A\n#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX     0x934B\n#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE    0x934C\n#define GL_QUERY_BUFFER                        0x9192\n#define GL_QUERY_BUFFER_BARRIER_BIT            0x00008000\n#define GL_QUERY_BUFFER_BINDING                0x9193\n#define GL_QUERY_RESULT_NO_WAIT                0x9194\n#define GL_MIRROR_CLAMP_TO_EDGE                0x8743\ntypedef void (APIENTRYP pfn_glBufferStorage) (GLenum, GLsizeiptr, const void*, GLbitfield);\nextern pfn_glBufferStorage fp_glBufferStorage;\ntypedef void (APIENTRYP pfn_glClearTexImage) (GLuint, GLint, GLenum, GLenum, const void*);\nextern pfn_glClearTexImage fp_glClearTexImage;\ntypedef void (APIENTRYP pfn_glClearTexSubImage) (GLuint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void*);\nextern pfn_glClearTexSubImage fp_glClearTexSubImage;\ntypedef void (APIENTRYP pfn_glBindBuffersBase) (GLenum, GLuint, GLsizei, const GLuint*);\nextern pfn_glBindBuffersBase fp_glBindBuffersBase;\ntypedef void (APIENTRYP pfn_glBindBuffersRange) (GLenum, GLuint, GLsizei, const GLuint*, const GLintptr*, const GLsizeiptr*);\nextern pfn_glBindBuffersRange fp_glBindBuffersRange;\ntypedef void (APIENTRYP pfn_glBindTextures) (GLuint, GLsizei, const GLuint*);\nextern pfn_glBindTextures fp_glBindTextures;\ntypedef void (APIENTRYP pfn_glBindSamplers) (GLuint, GLsizei, const GLuint*);\nextern pfn_glBindSamplers fp_glBindSamplers;\ntypedef void (APIENTRYP pfn_glBindImageTextures) (GLuint, GLsizei, const GLuint*);\nextern pfn_glBindImageTextures fp_glBindImageTextures;\ntypedef void (APIENTRYP pfn_glBindVertexBuffers) (GLuint, GLsizei, const GLuint*, const GLintptr*, const GLsizei*);\nextern pfn_glBindVertexBuffers fp_glBindVertexBuffers;\n\n /* GL_VERSION_4_5 */\nextern GLboolean GLAD_VERSION_4_5;\n#define GL_CONTEXT_LOST                        0x0507\n#define GL_NEGATIVE_ONE_TO_ONE                 0x935E\n#define GL_ZERO_TO_ONE                         0x935F\n#define GL_CLIP_ORIGIN                         0x935C\n#define GL_CLIP_DEPTH_MODE                     0x935D\n#define GL_QUERY_WAIT_INVERTED                 0x8E17\n#define GL_QUERY_NO_WAIT_INVERTED              0x8E18\n#define GL_QUERY_BY_REGION_WAIT_INVERTED       0x8E19\n#define GL_QUERY_BY_REGION_NO_WAIT_INVERTED    0x8E1A\n#define GL_MAX_CULL_DISTANCES                  0x82F9\n#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES  0x82FA\n#define GL_TEXTURE_TARGET                      0x1006\n#define GL_QUERY_TARGET                        0x82EA\n#define GL_GUILTY_CONTEXT_RESET                0x8253\n#define GL_INNOCENT_CONTEXT_RESET              0x8254\n#define GL_UNKNOWN_CONTEXT_RESET               0x8255\n#define GL_RESET_NOTIFICATION_STRATEGY         0x8256\n#define GL_LOSE_CONTEXT_ON_RESET               0x8252\n#define GL_NO_RESET_NOTIFICATION               0x8261\n#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT      0x00000004\n#define GL_CONTEXT_RELEASE_BEHAVIOR            0x82FB\n#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH      0x82FC\ntypedef void (APIENTRYP pfn_glClipControl) (GLenum, GLenum);\nextern pfn_glClipControl fp_glClipControl;\ntypedef void (APIENTRYP pfn_glCreateTransformFeedbacks) (GLsizei, GLuint*);\nextern pfn_glCreateTransformFeedbacks fp_glCreateTransformFeedbacks;\ntypedef void (APIENTRYP pfn_glTransformFeedbackBufferBase) (GLuint, GLuint, GLuint);\nextern pfn_glTransformFeedbackBufferBase fp_glTransformFeedbackBufferBase;\ntypedef void (APIENTRYP pfn_glTransformFeedbackBufferRange) (GLuint, GLuint, GLuint, GLintptr, GLsizeiptr);\nextern pfn_glTransformFeedbackBufferRange fp_glTransformFeedbackBufferRange;\ntypedef void (APIENTRYP pfn_glGetTransformFeedbackiv) (GLuint, GLenum, GLint*);\nextern pfn_glGetTransformFeedbackiv fp_glGetTransformFeedbackiv;\ntypedef void (APIENTRYP pfn_glGetTransformFeedbacki_v) (GLuint, GLenum, GLuint, GLint*);\nextern pfn_glGetTransformFeedbacki_v fp_glGetTransformFeedbacki_v;\ntypedef void (APIENTRYP pfn_glGetTransformFeedbacki64_v) (GLuint, GLenum, GLuint, GLint64*);\nextern pfn_glGetTransformFeedbacki64_v fp_glGetTransformFeedbacki64_v;\ntypedef void (APIENTRYP pfn_glCreateBuffers) (GLsizei, GLuint*);\nextern pfn_glCreateBuffers fp_glCreateBuffers;\ntypedef void (APIENTRYP pfn_glNamedBufferStorage) (GLuint, GLsizeiptr, const void*, GLbitfield);\nextern pfn_glNamedBufferStorage fp_glNamedBufferStorage;\ntypedef void (APIENTRYP pfn_glNamedBufferData) (GLuint, GLsizeiptr, const void*, GLenum);\nextern pfn_glNamedBufferData fp_glNamedBufferData;\ntypedef void (APIENTRYP pfn_glNamedBufferSubData) (GLuint, GLintptr, GLsizeiptr, const void*);\nextern pfn_glNamedBufferSubData fp_glNamedBufferSubData;\ntypedef void (APIENTRYP pfn_glCopyNamedBufferSubData) (GLuint, GLuint, GLintptr, GLintptr, GLsizeiptr);\nextern pfn_glCopyNamedBufferSubData fp_glCopyNamedBufferSubData;\ntypedef void (APIENTRYP pfn_glClearNamedBufferData) (GLuint, GLenum, GLenum, GLenum, const void*);\nextern pfn_glClearNamedBufferData fp_glClearNamedBufferData;\ntypedef void (APIENTRYP pfn_glClearNamedBufferSubData) (GLuint, GLenum, GLintptr, GLsizeiptr, GLenum, GLenum, const void*);\nextern pfn_glClearNamedBufferSubData fp_glClearNamedBufferSubData;\ntypedef void* (APIENTRYP pfn_glMapNamedBuffer) (GLuint, GLenum);\nextern pfn_glMapNamedBuffer fp_glMapNamedBuffer;\ntypedef void* (APIENTRYP pfn_glMapNamedBufferRange) (GLuint, GLintptr, GLsizeiptr, GLbitfield);\nextern pfn_glMapNamedBufferRange fp_glMapNamedBufferRange;\ntypedef GLboolean (APIENTRYP pfn_glUnmapNamedBuffer) (GLuint);\nextern pfn_glUnmapNamedBuffer fp_glUnmapNamedBuffer;\ntypedef void (APIENTRYP pfn_glFlushMappedNamedBufferRange) (GLuint, GLintptr, GLsizeiptr);\nextern pfn_glFlushMappedNamedBufferRange fp_glFlushMappedNamedBufferRange;\ntypedef void (APIENTRYP pfn_glGetNamedBufferParameteriv) (GLuint, GLenum, GLint*);\nextern pfn_glGetNamedBufferParameteriv fp_glGetNamedBufferParameteriv;\ntypedef void (APIENTRYP pfn_glGetNamedBufferParameteri64v) (GLuint, GLenum, GLint64*);\nextern pfn_glGetNamedBufferParameteri64v fp_glGetNamedBufferParameteri64v;\ntypedef void (APIENTRYP pfn_glGetNamedBufferPointerv) (GLuint, GLenum, void**);\nextern pfn_glGetNamedBufferPointerv fp_glGetNamedBufferPointerv;\ntypedef void (APIENTRYP pfn_glGetNamedBufferSubData) (GLuint, GLintptr, GLsizeiptr, void*);\nextern pfn_glGetNamedBufferSubData fp_glGetNamedBufferSubData;\ntypedef void (APIENTRYP pfn_glCreateFramebuffers) (GLsizei, GLuint*);\nextern pfn_glCreateFramebuffers fp_glCreateFramebuffers;\ntypedef void (APIENTRYP pfn_glNamedFramebufferRenderbuffer) (GLuint, GLenum, GLenum, GLuint);\nextern pfn_glNamedFramebufferRenderbuffer fp_glNamedFramebufferRenderbuffer;\ntypedef void (APIENTRYP pfn_glNamedFramebufferParameteri) (GLuint, GLenum, GLint);\nextern pfn_glNamedFramebufferParameteri fp_glNamedFramebufferParameteri;\ntypedef void (APIENTRYP pfn_glNamedFramebufferTexture) (GLuint, GLenum, GLuint, GLint);\nextern pfn_glNamedFramebufferTexture fp_glNamedFramebufferTexture;\ntypedef void (APIENTRYP pfn_glNamedFramebufferTextureLayer) (GLuint, GLenum, GLuint, GLint, GLint);\nextern pfn_glNamedFramebufferTextureLayer fp_glNamedFramebufferTextureLayer;\ntypedef void (APIENTRYP pfn_glNamedFramebufferDrawBuffer) (GLuint, GLenum);\nextern pfn_glNamedFramebufferDrawBuffer fp_glNamedFramebufferDrawBuffer;\ntypedef void (APIENTRYP pfn_glNamedFramebufferDrawBuffers) (GLuint, GLsizei, const GLenum*);\nextern pfn_glNamedFramebufferDrawBuffers fp_glNamedFramebufferDrawBuffers;\ntypedef void (APIENTRYP pfn_glNamedFramebufferReadBuffer) (GLuint, GLenum);\nextern pfn_glNamedFramebufferReadBuffer fp_glNamedFramebufferReadBuffer;\ntypedef void (APIENTRYP pfn_glInvalidateNamedFramebufferData) (GLuint, GLsizei, const GLenum*);\nextern pfn_glInvalidateNamedFramebufferData fp_glInvalidateNamedFramebufferData;\ntypedef void (APIENTRYP pfn_glInvalidateNamedFramebufferSubData) (GLuint, GLsizei, const GLenum*, GLint, GLint, GLsizei, GLsizei);\nextern pfn_glInvalidateNamedFramebufferSubData fp_glInvalidateNamedFramebufferSubData;\ntypedef void (APIENTRYP pfn_glClearNamedFramebufferiv) (GLuint, GLenum, GLint, const GLint*);\nextern pfn_glClearNamedFramebufferiv fp_glClearNamedFramebufferiv;\ntypedef void (APIENTRYP pfn_glClearNamedFramebufferuiv) (GLuint, GLenum, GLint, const GLuint*);\nextern pfn_glClearNamedFramebufferuiv fp_glClearNamedFramebufferuiv;\ntypedef void (APIENTRYP pfn_glClearNamedFramebufferfv) (GLuint, GLenum, GLint, const GLfloat*);\nextern pfn_glClearNamedFramebufferfv fp_glClearNamedFramebufferfv;\ntypedef void (APIENTRYP pfn_glClearNamedFramebufferfi) (GLuint, GLenum, GLint, GLfloat, GLint);\nextern pfn_glClearNamedFramebufferfi fp_glClearNamedFramebufferfi;\ntypedef void (APIENTRYP pfn_glBlitNamedFramebuffer) (GLuint, GLuint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum);\nextern pfn_glBlitNamedFramebuffer fp_glBlitNamedFramebuffer;\ntypedef GLenum (APIENTRYP pfn_glCheckNamedFramebufferStatus) (GLuint, GLenum);\nextern pfn_glCheckNamedFramebufferStatus fp_glCheckNamedFramebufferStatus;\ntypedef void (APIENTRYP pfn_glGetNamedFramebufferParameteriv) (GLuint, GLenum, GLint*);\nextern pfn_glGetNamedFramebufferParameteriv fp_glGetNamedFramebufferParameteriv;\ntypedef void (APIENTRYP pfn_glGetNamedFramebufferAttachmentParameteriv) (GLuint, GLenum, GLenum, GLint*);\nextern pfn_glGetNamedFramebufferAttachmentParameteriv fp_glGetNamedFramebufferAttachmentParameteriv;\ntypedef void (APIENTRYP pfn_glCreateRenderbuffers) (GLsizei, GLuint*);\nextern pfn_glCreateRenderbuffers fp_glCreateRenderbuffers;\ntypedef void (APIENTRYP pfn_glNamedRenderbufferStorage) (GLuint, GLenum, GLsizei, GLsizei);\nextern pfn_glNamedRenderbufferStorage fp_glNamedRenderbufferStorage;\ntypedef void (APIENTRYP pfn_glNamedRenderbufferStorageMultisample) (GLuint, GLsizei, GLenum, GLsizei, GLsizei);\nextern pfn_glNamedRenderbufferStorageMultisample fp_glNamedRenderbufferStorageMultisample;\ntypedef void (APIENTRYP pfn_glGetNamedRenderbufferParameteriv) (GLuint, GLenum, GLint*);\nextern pfn_glGetNamedRenderbufferParameteriv fp_glGetNamedRenderbufferParameteriv;\ntypedef void (APIENTRYP pfn_glCreateTextures) (GLenum, GLsizei, GLuint*);\nextern pfn_glCreateTextures fp_glCreateTextures;\ntypedef void (APIENTRYP pfn_glTextureBuffer) (GLuint, GLenum, GLuint);\nextern pfn_glTextureBuffer fp_glTextureBuffer;\ntypedef void (APIENTRYP pfn_glTextureBufferRange) (GLuint, GLenum, GLuint, GLintptr, GLsizeiptr);\nextern pfn_glTextureBufferRange fp_glTextureBufferRange;\ntypedef void (APIENTRYP pfn_glTextureStorage1D) (GLuint, GLsizei, GLenum, GLsizei);\nextern pfn_glTextureStorage1D fp_glTextureStorage1D;\ntypedef void (APIENTRYP pfn_glTextureStorage2D) (GLuint, GLsizei, GLenum, GLsizei, GLsizei);\nextern pfn_glTextureStorage2D fp_glTextureStorage2D;\ntypedef void (APIENTRYP pfn_glTextureStorage3D) (GLuint, GLsizei, GLenum, GLsizei, GLsizei, GLsizei);\nextern pfn_glTextureStorage3D fp_glTextureStorage3D;\ntypedef void (APIENTRYP pfn_glTextureStorage2DMultisample) (GLuint, GLsizei, GLenum, GLsizei, GLsizei, GLboolean);\nextern pfn_glTextureStorage2DMultisample fp_glTextureStorage2DMultisample;\ntypedef void (APIENTRYP pfn_glTextureStorage3DMultisample) (GLuint, GLsizei, GLenum, GLsizei, GLsizei, GLsizei, GLboolean);\nextern pfn_glTextureStorage3DMultisample fp_glTextureStorage3DMultisample;\ntypedef void (APIENTRYP pfn_glTextureSubImage1D) (GLuint, GLint, GLint, GLsizei, GLenum, GLenum, const void*);\nextern pfn_glTextureSubImage1D fp_glTextureSubImage1D;\ntypedef void (APIENTRYP pfn_glTextureSubImage2D) (GLuint, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const void*);\nextern pfn_glTextureSubImage2D fp_glTextureSubImage2D;\ntypedef void (APIENTRYP pfn_glTextureSubImage3D) (GLuint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void*);\nextern pfn_glTextureSubImage3D fp_glTextureSubImage3D;\ntypedef void (APIENTRYP pfn_glCompressedTextureSubImage1D) (GLuint, GLint, GLint, GLsizei, GLenum, GLsizei, const void*);\nextern pfn_glCompressedTextureSubImage1D fp_glCompressedTextureSubImage1D;\ntypedef void (APIENTRYP pfn_glCompressedTextureSubImage2D) (GLuint, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const void*);\nextern pfn_glCompressedTextureSubImage2D fp_glCompressedTextureSubImage2D;\ntypedef void (APIENTRYP pfn_glCompressedTextureSubImage3D) (GLuint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const void*);\nextern pfn_glCompressedTextureSubImage3D fp_glCompressedTextureSubImage3D;\ntypedef void (APIENTRYP pfn_glCopyTextureSubImage1D) (GLuint, GLint, GLint, GLint, GLint, GLsizei);\nextern pfn_glCopyTextureSubImage1D fp_glCopyTextureSubImage1D;\ntypedef void (APIENTRYP pfn_glCopyTextureSubImage2D) (GLuint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei);\nextern pfn_glCopyTextureSubImage2D fp_glCopyTextureSubImage2D;\ntypedef void (APIENTRYP pfn_glCopyTextureSubImage3D) (GLuint, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei);\nextern pfn_glCopyTextureSubImage3D fp_glCopyTextureSubImage3D;\ntypedef void (APIENTRYP pfn_glTextureParameterf) (GLuint, GLenum, GLfloat);\nextern pfn_glTextureParameterf fp_glTextureParameterf;\ntypedef void (APIENTRYP pfn_glTextureParameterfv) (GLuint, GLenum, const GLfloat*);\nextern pfn_glTextureParameterfv fp_glTextureParameterfv;\ntypedef void (APIENTRYP pfn_glTextureParameteri) (GLuint, GLenum, GLint);\nextern pfn_glTextureParameteri fp_glTextureParameteri;\ntypedef void (APIENTRYP pfn_glTextureParameterIiv) (GLuint, GLenum, const GLint*);\nextern pfn_glTextureParameterIiv fp_glTextureParameterIiv;\ntypedef void (APIENTRYP pfn_glTextureParameterIuiv) (GLuint, GLenum, const GLuint*);\nextern pfn_glTextureParameterIuiv fp_glTextureParameterIuiv;\ntypedef void (APIENTRYP pfn_glTextureParameteriv) (GLuint, GLenum, const GLint*);\nextern pfn_glTextureParameteriv fp_glTextureParameteriv;\ntypedef void (APIENTRYP pfn_glGenerateTextureMipmap) (GLuint);\nextern pfn_glGenerateTextureMipmap fp_glGenerateTextureMipmap;\ntypedef void (APIENTRYP pfn_glBindTextureUnit) (GLuint, GLuint);\nextern pfn_glBindTextureUnit fp_glBindTextureUnit;\ntypedef void (APIENTRYP pfn_glGetTextureImage) (GLuint, GLint, GLenum, GLenum, GLsizei, void*);\nextern pfn_glGetTextureImage fp_glGetTextureImage;\ntypedef void (APIENTRYP pfn_glGetCompressedTextureImage) (GLuint, GLint, GLsizei, void*);\nextern pfn_glGetCompressedTextureImage fp_glGetCompressedTextureImage;\ntypedef void (APIENTRYP pfn_glGetTextureLevelParameterfv) (GLuint, GLint, GLenum, GLfloat*);\nextern pfn_glGetTextureLevelParameterfv fp_glGetTextureLevelParameterfv;\ntypedef void (APIENTRYP pfn_glGetTextureLevelParameteriv) (GLuint, GLint, GLenum, GLint*);\nextern pfn_glGetTextureLevelParameteriv fp_glGetTextureLevelParameteriv;\ntypedef void (APIENTRYP pfn_glGetTextureParameterfv) (GLuint, GLenum, GLfloat*);\nextern pfn_glGetTextureParameterfv fp_glGetTextureParameterfv;\ntypedef void (APIENTRYP pfn_glGetTextureParameterIiv) (GLuint, GLenum, GLint*);\nextern pfn_glGetTextureParameterIiv fp_glGetTextureParameterIiv;\ntypedef void (APIENTRYP pfn_glGetTextureParameterIuiv) (GLuint, GLenum, GLuint*);\nextern pfn_glGetTextureParameterIuiv fp_glGetTextureParameterIuiv;\ntypedef void (APIENTRYP pfn_glGetTextureParameteriv) (GLuint, GLenum, GLint*);\nextern pfn_glGetTextureParameteriv fp_glGetTextureParameteriv;\ntypedef void (APIENTRYP pfn_glCreateVertexArrays) (GLsizei, GLuint*);\nextern pfn_glCreateVertexArrays fp_glCreateVertexArrays;\ntypedef void (APIENTRYP pfn_glDisableVertexArrayAttrib) (GLuint, GLuint);\nextern pfn_glDisableVertexArrayAttrib fp_glDisableVertexArrayAttrib;\ntypedef void (APIENTRYP pfn_glEnableVertexArrayAttrib) (GLuint, GLuint);\nextern pfn_glEnableVertexArrayAttrib fp_glEnableVertexArrayAttrib;\ntypedef void (APIENTRYP pfn_glVertexArrayElementBuffer) (GLuint, GLuint);\nextern pfn_glVertexArrayElementBuffer fp_glVertexArrayElementBuffer;\ntypedef void (APIENTRYP pfn_glVertexArrayVertexBuffer) (GLuint, GLuint, GLuint, GLintptr, GLsizei);\nextern pfn_glVertexArrayVertexBuffer fp_glVertexArrayVertexBuffer;\ntypedef void (APIENTRYP pfn_glVertexArrayVertexBuffers) (GLuint, GLuint, GLsizei, const GLuint*, const GLintptr*, const GLsizei*);\nextern pfn_glVertexArrayVertexBuffers fp_glVertexArrayVertexBuffers;\ntypedef void (APIENTRYP pfn_glVertexArrayAttribBinding) (GLuint, GLuint, GLuint);\nextern pfn_glVertexArrayAttribBinding fp_glVertexArrayAttribBinding;\ntypedef void (APIENTRYP pfn_glVertexArrayAttribFormat) (GLuint, GLuint, GLint, GLenum, GLboolean, GLuint);\nextern pfn_glVertexArrayAttribFormat fp_glVertexArrayAttribFormat;\ntypedef void (APIENTRYP pfn_glVertexArrayAttribIFormat) (GLuint, GLuint, GLint, GLenum, GLuint);\nextern pfn_glVertexArrayAttribIFormat fp_glVertexArrayAttribIFormat;\ntypedef void (APIENTRYP pfn_glVertexArrayAttribLFormat) (GLuint, GLuint, GLint, GLenum, GLuint);\nextern pfn_glVertexArrayAttribLFormat fp_glVertexArrayAttribLFormat;\ntypedef void (APIENTRYP pfn_glVertexArrayBindingDivisor) (GLuint, GLuint, GLuint);\nextern pfn_glVertexArrayBindingDivisor fp_glVertexArrayBindingDivisor;\ntypedef void (APIENTRYP pfn_glGetVertexArrayiv) (GLuint, GLenum, GLint*);\nextern pfn_glGetVertexArrayiv fp_glGetVertexArrayiv;\ntypedef void (APIENTRYP pfn_glGetVertexArrayIndexediv) (GLuint, GLuint, GLenum, GLint*);\nextern pfn_glGetVertexArrayIndexediv fp_glGetVertexArrayIndexediv;\ntypedef void (APIENTRYP pfn_glGetVertexArrayIndexed64iv) (GLuint, GLuint, GLenum, GLint64*);\nextern pfn_glGetVertexArrayIndexed64iv fp_glGetVertexArrayIndexed64iv;\ntypedef void (APIENTRYP pfn_glCreateSamplers) (GLsizei, GLuint*);\nextern pfn_glCreateSamplers fp_glCreateSamplers;\ntypedef void (APIENTRYP pfn_glCreateProgramPipelines) (GLsizei, GLuint*);\nextern pfn_glCreateProgramPipelines fp_glCreateProgramPipelines;\ntypedef void (APIENTRYP pfn_glCreateQueries) (GLenum, GLsizei, GLuint*);\nextern pfn_glCreateQueries fp_glCreateQueries;\ntypedef void (APIENTRYP pfn_glGetQueryBufferObjecti64v) (GLuint, GLuint, GLenum, GLintptr);\nextern pfn_glGetQueryBufferObjecti64v fp_glGetQueryBufferObjecti64v;\ntypedef void (APIENTRYP pfn_glGetQueryBufferObjectiv) (GLuint, GLuint, GLenum, GLintptr);\nextern pfn_glGetQueryBufferObjectiv fp_glGetQueryBufferObjectiv;\ntypedef void (APIENTRYP pfn_glGetQueryBufferObjectui64v) (GLuint, GLuint, GLenum, GLintptr);\nextern pfn_glGetQueryBufferObjectui64v fp_glGetQueryBufferObjectui64v;\ntypedef void (APIENTRYP pfn_glGetQueryBufferObjectuiv) (GLuint, GLuint, GLenum, GLintptr);\nextern pfn_glGetQueryBufferObjectuiv fp_glGetQueryBufferObjectuiv;\ntypedef void (APIENTRYP pfn_glMemoryBarrierByRegion) (GLbitfield);\nextern pfn_glMemoryBarrierByRegion fp_glMemoryBarrierByRegion;\ntypedef void (APIENTRYP pfn_glGetTextureSubImage) (GLuint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, GLsizei, void*);\nextern pfn_glGetTextureSubImage fp_glGetTextureSubImage;\ntypedef void (APIENTRYP pfn_glGetCompressedTextureSubImage) (GLuint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLsizei, void*);\nextern pfn_glGetCompressedTextureSubImage fp_glGetCompressedTextureSubImage;\ntypedef GLenum (APIENTRYP pfn_glGetGraphicsResetStatus) ();\nextern pfn_glGetGraphicsResetStatus fp_glGetGraphicsResetStatus;\ntypedef void (APIENTRYP pfn_glGetnCompressedTexImage) (GLenum, GLint, GLsizei, void*);\nextern pfn_glGetnCompressedTexImage fp_glGetnCompressedTexImage;\ntypedef void (APIENTRYP pfn_glGetnTexImage) (GLenum, GLint, GLenum, GLenum, GLsizei, void*);\nextern pfn_glGetnTexImage fp_glGetnTexImage;\ntypedef void (APIENTRYP pfn_glGetnUniformdv) (GLuint, GLint, GLsizei, GLdouble*);\nextern pfn_glGetnUniformdv fp_glGetnUniformdv;\ntypedef void (APIENTRYP pfn_glGetnUniformfv) (GLuint, GLint, GLsizei, GLfloat*);\nextern pfn_glGetnUniformfv fp_glGetnUniformfv;\ntypedef void (APIENTRYP pfn_glGetnUniformiv) (GLuint, GLint, GLsizei, GLint*);\nextern pfn_glGetnUniformiv fp_glGetnUniformiv;\ntypedef void (APIENTRYP pfn_glGetnUniformuiv) (GLuint, GLint, GLsizei, GLuint*);\nextern pfn_glGetnUniformuiv fp_glGetnUniformuiv;\ntypedef void (APIENTRYP pfn_glReadnPixels) (GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLsizei, void*);\nextern pfn_glReadnPixels fp_glReadnPixels;\ntypedef void (APIENTRYP pfn_glGetnMapdv) (GLenum, GLenum, GLsizei, GLdouble*);\nextern pfn_glGetnMapdv fp_glGetnMapdv;\ntypedef void (APIENTRYP pfn_glGetnMapfv) (GLenum, GLenum, GLsizei, GLfloat*);\nextern pfn_glGetnMapfv fp_glGetnMapfv;\ntypedef void (APIENTRYP pfn_glGetnMapiv) (GLenum, GLenum, GLsizei, GLint*);\nextern pfn_glGetnMapiv fp_glGetnMapiv;\ntypedef void (APIENTRYP pfn_glGetnPixelMapfv) (GLenum, GLsizei, GLfloat*);\nextern pfn_glGetnPixelMapfv fp_glGetnPixelMapfv;\ntypedef void (APIENTRYP pfn_glGetnPixelMapuiv) (GLenum, GLsizei, GLuint*);\nextern pfn_glGetnPixelMapuiv fp_glGetnPixelMapuiv;\ntypedef void (APIENTRYP pfn_glGetnPixelMapusv) (GLenum, GLsizei, GLushort*);\nextern pfn_glGetnPixelMapusv fp_glGetnPixelMapusv;\ntypedef void (APIENTRYP pfn_glGetnPolygonStipple) (GLsizei, GLubyte*);\nextern pfn_glGetnPolygonStipple fp_glGetnPolygonStipple;\ntypedef void (APIENTRYP pfn_glGetnColorTable) (GLenum, GLenum, GLenum, GLsizei, void*);\nextern pfn_glGetnColorTable fp_glGetnColorTable;\ntypedef void (APIENTRYP pfn_glGetnConvolutionFilter) (GLenum, GLenum, GLenum, GLsizei, void*);\nextern pfn_glGetnConvolutionFilter fp_glGetnConvolutionFilter;\ntypedef void (APIENTRYP pfn_glGetnSeparableFilter) (GLenum, GLenum, GLenum, GLsizei, void*, GLsizei, void*, void*);\nextern pfn_glGetnSeparableFilter fp_glGetnSeparableFilter;\ntypedef void (APIENTRYP pfn_glGetnHistogram) (GLenum, GLboolean, GLenum, GLenum, GLsizei, void*);\nextern pfn_glGetnHistogram fp_glGetnHistogram;\ntypedef void (APIENTRYP pfn_glGetnMinmax) (GLenum, GLboolean, GLenum, GLenum, GLsizei, void*);\nextern pfn_glGetnMinmax fp_glGetnMinmax;\ntypedef void (APIENTRYP pfn_glTextureBarrier) ();\nextern pfn_glTextureBarrier fp_glTextureBarrier;\n\n /* GL_ES_VERSION_2_0 */\nextern GLboolean GLAD_ES_VERSION_2_0;\n#define GL_BLEND_EQUATION                      0x8009\n#define GL_BLEND_COLOR                         0x8005\n#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS   0x8CD9\n\n /* GL_ES_VERSION_3_0 */\nextern GLboolean GLAD_ES_VERSION_3_0;\n\n /* GL_ES_VERSION_3_1 */\nextern GLboolean GLAD_ES_VERSION_3_1;\n\n /* GL_ES_VERSION_3_2 */\nextern GLboolean GLAD_ES_VERSION_3_2;\n#define GL_MULTISAMPLE_LINE_WIDTH_RANGE        0x9381\n#define GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY  0x9382\n#define GL_MULTIPLY                            0x9294\n#define GL_SCREEN                              0x9295\n#define GL_OVERLAY                             0x9296\n#define GL_DARKEN                              0x9297\n#define GL_LIGHTEN                             0x9298\n#define GL_COLORDODGE                          0x9299\n#define GL_COLORBURN                           0x929A\n#define GL_HARDLIGHT                           0x929B\n#define GL_SOFTLIGHT                           0x929C\n#define GL_DIFFERENCE                          0x929E\n#define GL_EXCLUSION                           0x92A0\n#define GL_HSL_HUE                             0x92AD\n#define GL_HSL_SATURATION                      0x92AE\n#define GL_HSL_COLOR                           0x92AF\n#define GL_HSL_LUMINOSITY                      0x92B0\n#define GL_PRIMITIVE_BOUNDING_BOX              0x92BE\n#define GL_COMPRESSED_RGBA_ASTC_4x4            0x93B0\n#define GL_COMPRESSED_RGBA_ASTC_5x4            0x93B1\n#define GL_COMPRESSED_RGBA_ASTC_5x5            0x93B2\n#define GL_COMPRESSED_RGBA_ASTC_6x5            0x93B3\n#define GL_COMPRESSED_RGBA_ASTC_6x6            0x93B4\n#define GL_COMPRESSED_RGBA_ASTC_8x5            0x93B5\n#define GL_COMPRESSED_RGBA_ASTC_8x6            0x93B6\n#define GL_COMPRESSED_RGBA_ASTC_8x8            0x93B7\n#define GL_COMPRESSED_RGBA_ASTC_10x5           0x93B8\n#define GL_COMPRESSED_RGBA_ASTC_10x6           0x93B9\n#define GL_COMPRESSED_RGBA_ASTC_10x8           0x93BA\n#define GL_COMPRESSED_RGBA_ASTC_10x10          0x93BB\n#define GL_COMPRESSED_RGBA_ASTC_12x10          0x93BC\n#define GL_COMPRESSED_RGBA_ASTC_12x12          0x93BD\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4    0x93D0\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4    0x93D1\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5    0x93D2\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5    0x93D3\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6    0x93D4\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5    0x93D5\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6    0x93D6\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8    0x93D7\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5   0x93D8\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6   0x93D9\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8   0x93DA\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10  0x93DB\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10  0x93DC\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12  0x93DD\ntypedef void (APIENTRYP pfn_glBlendBarrier) ();\nextern pfn_glBlendBarrier fp_glBlendBarrier;\ntypedef void (APIENTRYP pfn_glPrimitiveBoundingBox) (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);\nextern pfn_glPrimitiveBoundingBox fp_glPrimitiveBoundingBox;\n\n /* GL_KHR_blend_equation_advanced */\nextern GLboolean GLAD_KHR_blend_equation_advanced;\n#define GL_MULTIPLY_KHR                        0x9294\n#define GL_SCREEN_KHR                          0x9295\n#define GL_OVERLAY_KHR                         0x9296\n#define GL_DARKEN_KHR                          0x9297\n#define GL_LIGHTEN_KHR                         0x9298\n#define GL_COLORDODGE_KHR                      0x9299\n#define GL_COLORBURN_KHR                       0x929A\n#define GL_HARDLIGHT_KHR                       0x929B\n#define GL_SOFTLIGHT_KHR                       0x929C\n#define GL_DIFFERENCE_KHR                      0x929E\n#define GL_EXCLUSION_KHR                       0x92A0\n#define GL_HSL_HUE_KHR                         0x92AD\n#define GL_HSL_SATURATION_KHR                  0x92AE\n#define GL_HSL_COLOR_KHR                       0x92AF\n#define GL_HSL_LUMINOSITY_KHR                  0x92B0\ntypedef void (APIENTRYP pfn_glBlendBarrierKHR) ();\nextern pfn_glBlendBarrierKHR fp_glBlendBarrierKHR;\n\n /* GL_KHR_blend_equation_advanced_coherent */\nextern GLboolean GLAD_KHR_blend_equation_advanced_coherent;\n#define GL_BLEND_ADVANCED_COHERENT_KHR         0x9285\n\n /* GL_KHR_context_flush_control */\nextern GLboolean GLAD_KHR_context_flush_control;\n#define GL_CONTEXT_RELEASE_BEHAVIOR_KHR        0x82FB\n#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR  0x82FC\n\n /* GL_KHR_debug */\nextern GLboolean GLAD_KHR_debug;\n#define GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR        0x8242\n#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR  0x8243\n#define GL_DEBUG_CALLBACK_FUNCTION_KHR         0x8244\n#define GL_DEBUG_CALLBACK_USER_PARAM_KHR       0x8245\n#define GL_DEBUG_SOURCE_API_KHR                0x8246\n#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR      0x8247\n#define GL_DEBUG_SOURCE_SHADER_COMPILER_KHR    0x8248\n#define GL_DEBUG_SOURCE_THIRD_PARTY_KHR        0x8249\n#define GL_DEBUG_SOURCE_APPLICATION_KHR        0x824A\n#define GL_DEBUG_SOURCE_OTHER_KHR              0x824B\n#define GL_DEBUG_TYPE_ERROR_KHR                0x824C\n#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR  0x824D\n#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR   0x824E\n#define GL_DEBUG_TYPE_PORTABILITY_KHR          0x824F\n#define GL_DEBUG_TYPE_PERFORMANCE_KHR          0x8250\n#define GL_DEBUG_TYPE_OTHER_KHR                0x8251\n#define GL_DEBUG_TYPE_MARKER_KHR               0x8268\n#define GL_DEBUG_TYPE_PUSH_GROUP_KHR           0x8269\n#define GL_DEBUG_TYPE_POP_GROUP_KHR            0x826A\n#define GL_DEBUG_SEVERITY_NOTIFICATION_KHR     0x826B\n#define GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR     0x826C\n#define GL_DEBUG_GROUP_STACK_DEPTH_KHR         0x826D\n#define GL_BUFFER_KHR                          0x82E0\n#define GL_SHADER_KHR                          0x82E1\n#define GL_PROGRAM_KHR                         0x82E2\n#define GL_VERTEX_ARRAY_KHR                    0x8074\n#define GL_QUERY_KHR                           0x82E3\n#define GL_PROGRAM_PIPELINE_KHR                0x82E4\n#define GL_SAMPLER_KHR                         0x82E6\n#define GL_MAX_LABEL_LENGTH_KHR                0x82E8\n#define GL_MAX_DEBUG_MESSAGE_LENGTH_KHR        0x9143\n#define GL_MAX_DEBUG_LOGGED_MESSAGES_KHR       0x9144\n#define GL_DEBUG_LOGGED_MESSAGES_KHR           0x9145\n#define GL_DEBUG_SEVERITY_HIGH_KHR             0x9146\n#define GL_DEBUG_SEVERITY_MEDIUM_KHR           0x9147\n#define GL_DEBUG_SEVERITY_LOW_KHR              0x9148\n#define GL_DEBUG_OUTPUT_KHR                    0x92E0\n#define GL_CONTEXT_FLAG_DEBUG_BIT_KHR          0x00000002\n#define GL_STACK_OVERFLOW_KHR                  0x0503\n#define GL_STACK_UNDERFLOW_KHR                 0x0504\ntypedef void (APIENTRYP pfn_glDebugMessageControlKHR) (GLenum, GLenum, GLenum, GLsizei, const GLuint*, GLboolean);\nextern pfn_glDebugMessageControlKHR fp_glDebugMessageControlKHR;\ntypedef void (APIENTRYP pfn_glDebugMessageInsertKHR) (GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*);\nextern pfn_glDebugMessageInsertKHR fp_glDebugMessageInsertKHR;\ntypedef void (APIENTRYP pfn_glDebugMessageCallbackKHR) (GLDEBUGPROCKHR, const void*);\nextern pfn_glDebugMessageCallbackKHR fp_glDebugMessageCallbackKHR;\ntypedef GLuint (APIENTRYP pfn_glGetDebugMessageLogKHR) (GLuint, GLsizei, GLenum*, GLenum*, GLuint*, GLenum*, GLsizei*, GLchar*);\nextern pfn_glGetDebugMessageLogKHR fp_glGetDebugMessageLogKHR;\ntypedef void (APIENTRYP pfn_glPushDebugGroupKHR) (GLenum, GLuint, GLsizei, const GLchar*);\nextern pfn_glPushDebugGroupKHR fp_glPushDebugGroupKHR;\ntypedef void (APIENTRYP pfn_glPopDebugGroupKHR) ();\nextern pfn_glPopDebugGroupKHR fp_glPopDebugGroupKHR;\ntypedef void (APIENTRYP pfn_glObjectLabelKHR) (GLenum, GLuint, GLsizei, const GLchar*);\nextern pfn_glObjectLabelKHR fp_glObjectLabelKHR;\ntypedef void (APIENTRYP pfn_glGetObjectLabelKHR) (GLenum, GLuint, GLsizei, GLsizei*, GLchar*);\nextern pfn_glGetObjectLabelKHR fp_glGetObjectLabelKHR;\ntypedef void (APIENTRYP pfn_glObjectPtrLabelKHR) (const void*, GLsizei, const GLchar*);\nextern pfn_glObjectPtrLabelKHR fp_glObjectPtrLabelKHR;\ntypedef void (APIENTRYP pfn_glGetObjectPtrLabelKHR) (const void*, GLsizei, GLsizei*, GLchar*);\nextern pfn_glGetObjectPtrLabelKHR fp_glGetObjectPtrLabelKHR;\ntypedef void (APIENTRYP pfn_glGetPointervKHR) (GLenum, void**);\nextern pfn_glGetPointervKHR fp_glGetPointervKHR;\n\n /* GL_KHR_no_error */\nextern GLboolean GLAD_KHR_no_error;\n#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR       0x00000008\n\n /* GL_KHR_robust_buffer_access_behavior */\nextern GLboolean GLAD_KHR_robust_buffer_access_behavior;\n\n /* GL_KHR_robustness */\nextern GLboolean GLAD_KHR_robustness;\n#define GL_CONTEXT_ROBUST_ACCESS               0x90F3\n#define GL_CONTEXT_ROBUST_ACCESS_KHR           0x90F3\n#define GL_LOSE_CONTEXT_ON_RESET_KHR           0x8252\n#define GL_GUILTY_CONTEXT_RESET_KHR            0x8253\n#define GL_INNOCENT_CONTEXT_RESET_KHR          0x8254\n#define GL_UNKNOWN_CONTEXT_RESET_KHR           0x8255\n#define GL_RESET_NOTIFICATION_STRATEGY_KHR     0x8256\n#define GL_NO_RESET_NOTIFICATION_KHR           0x8261\n#define GL_CONTEXT_LOST_KHR                    0x0507\ntypedef GLenum (APIENTRYP pfn_glGetGraphicsResetStatusKHR) ();\nextern pfn_glGetGraphicsResetStatusKHR fp_glGetGraphicsResetStatusKHR;\ntypedef void (APIENTRYP pfn_glReadnPixelsKHR) (GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLsizei, void*);\nextern pfn_glReadnPixelsKHR fp_glReadnPixelsKHR;\ntypedef void (APIENTRYP pfn_glGetnUniformfvKHR) (GLuint, GLint, GLsizei, GLfloat*);\nextern pfn_glGetnUniformfvKHR fp_glGetnUniformfvKHR;\ntypedef void (APIENTRYP pfn_glGetnUniformivKHR) (GLuint, GLint, GLsizei, GLint*);\nextern pfn_glGetnUniformivKHR fp_glGetnUniformivKHR;\ntypedef void (APIENTRYP pfn_glGetnUniformuivKHR) (GLuint, GLint, GLsizei, GLuint*);\nextern pfn_glGetnUniformuivKHR fp_glGetnUniformuivKHR;\n\n /* GL_KHR_texture_compression_astc_hdr */\nextern GLboolean GLAD_KHR_texture_compression_astc_hdr;\n#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR        0x93B0\n#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR        0x93B1\n#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR        0x93B2\n#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR        0x93B3\n#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR        0x93B4\n#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR        0x93B5\n#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR        0x93B6\n#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR        0x93B7\n#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR       0x93B8\n#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR       0x93B9\n#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR       0x93BA\n#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR      0x93BB\n#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR      0x93BC\n#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR      0x93BD\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR  0x93D0\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR  0x93D1\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR  0x93D2\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR  0x93D3\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR  0x93D4\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR  0x93D5\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR  0x93D6\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR  0x93D7\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR  0x93D8\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR  0x93D9\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR  0x93DA\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR  0x93DB\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR  0x93DC\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR  0x93DD\n\n /* GL_KHR_texture_compression_astc_ldr */\nextern GLboolean GLAD_KHR_texture_compression_astc_ldr;\n\n /* GL_KHR_texture_compression_astc_sliced_3d */\nextern GLboolean GLAD_KHR_texture_compression_astc_sliced_3d;\n\n /* GL_ARB_arrays_of_arrays */\nextern GLboolean GLAD_ARB_arrays_of_arrays;\n\n /* GL_ARB_base_instance */\nextern GLboolean GLAD_ARB_base_instance;\n\n /* GL_ARB_bindless_texture */\nextern GLboolean GLAD_ARB_bindless_texture;\n#define GL_UNSIGNED_INT64_ARB                  0x140F\ntypedef GLuint64 (APIENTRYP pfn_glGetTextureHandleARB) (GLuint);\nextern pfn_glGetTextureHandleARB fp_glGetTextureHandleARB;\ntypedef GLuint64 (APIENTRYP pfn_glGetTextureSamplerHandleARB) (GLuint, GLuint);\nextern pfn_glGetTextureSamplerHandleARB fp_glGetTextureSamplerHandleARB;\ntypedef void (APIENTRYP pfn_glMakeTextureHandleResidentARB) (GLuint64);\nextern pfn_glMakeTextureHandleResidentARB fp_glMakeTextureHandleResidentARB;\ntypedef void (APIENTRYP pfn_glMakeTextureHandleNonResidentARB) (GLuint64);\nextern pfn_glMakeTextureHandleNonResidentARB fp_glMakeTextureHandleNonResidentARB;\ntypedef GLuint64 (APIENTRYP pfn_glGetImageHandleARB) (GLuint, GLint, GLboolean, GLint, GLenum);\nextern pfn_glGetImageHandleARB fp_glGetImageHandleARB;\ntypedef void (APIENTRYP pfn_glMakeImageHandleResidentARB) (GLuint64, GLenum);\nextern pfn_glMakeImageHandleResidentARB fp_glMakeImageHandleResidentARB;\ntypedef void (APIENTRYP pfn_glMakeImageHandleNonResidentARB) (GLuint64);\nextern pfn_glMakeImageHandleNonResidentARB fp_glMakeImageHandleNonResidentARB;\ntypedef void (APIENTRYP pfn_glUniformHandleui64ARB) (GLint, GLuint64);\nextern pfn_glUniformHandleui64ARB fp_glUniformHandleui64ARB;\ntypedef void (APIENTRYP pfn_glUniformHandleui64vARB) (GLint, GLsizei, const GLuint64*);\nextern pfn_glUniformHandleui64vARB fp_glUniformHandleui64vARB;\ntypedef void (APIENTRYP pfn_glProgramUniformHandleui64ARB) (GLuint, GLint, GLuint64);\nextern pfn_glProgramUniformHandleui64ARB fp_glProgramUniformHandleui64ARB;\ntypedef void (APIENTRYP pfn_glProgramUniformHandleui64vARB) (GLuint, GLint, GLsizei, const GLuint64*);\nextern pfn_glProgramUniformHandleui64vARB fp_glProgramUniformHandleui64vARB;\ntypedef GLboolean (APIENTRYP pfn_glIsTextureHandleResidentARB) (GLuint64);\nextern pfn_glIsTextureHandleResidentARB fp_glIsTextureHandleResidentARB;\ntypedef GLboolean (APIENTRYP pfn_glIsImageHandleResidentARB) (GLuint64);\nextern pfn_glIsImageHandleResidentARB fp_glIsImageHandleResidentARB;\ntypedef void (APIENTRYP pfn_glVertexAttribL1ui64ARB) (GLuint, GLuint64EXT);\nextern pfn_glVertexAttribL1ui64ARB fp_glVertexAttribL1ui64ARB;\ntypedef void (APIENTRYP pfn_glVertexAttribL1ui64vARB) (GLuint, const GLuint64EXT*);\nextern pfn_glVertexAttribL1ui64vARB fp_glVertexAttribL1ui64vARB;\ntypedef void (APIENTRYP pfn_glGetVertexAttribLui64vARB) (GLuint, GLenum, GLuint64EXT*);\nextern pfn_glGetVertexAttribLui64vARB fp_glGetVertexAttribLui64vARB;\n\n /* GL_ARB_blend_func_extended */\nextern GLboolean GLAD_ARB_blend_func_extended;\n\n /* GL_ARB_buffer_storage */\nextern GLboolean GLAD_ARB_buffer_storage;\n\n /* GL_ARB_cl_event */\nextern GLboolean GLAD_ARB_cl_event;\n#define GL_SYNC_CL_EVENT_ARB                   0x8240\n#define GL_SYNC_CL_EVENT_COMPLETE_ARB          0x8241\ntypedef GLsync (APIENTRYP pfn_glCreateSyncFromCLeventARB) (struct _cl_context*, struct _cl_event*, GLbitfield);\nextern pfn_glCreateSyncFromCLeventARB fp_glCreateSyncFromCLeventARB;\n\n /* GL_ARB_clear_buffer_object */\nextern GLboolean GLAD_ARB_clear_buffer_object;\n\n /* GL_ARB_clear_texture */\nextern GLboolean GLAD_ARB_clear_texture;\n\n /* GL_ARB_clip_control */\nextern GLboolean GLAD_ARB_clip_control;\n\n /* GL_ARB_color_buffer_float */\nextern GLboolean GLAD_ARB_color_buffer_float;\n#define GL_RGBA_FLOAT_MODE_ARB                 0x8820\n#define GL_CLAMP_VERTEX_COLOR_ARB              0x891A\n#define GL_CLAMP_FRAGMENT_COLOR_ARB            0x891B\n#define GL_CLAMP_READ_COLOR_ARB                0x891C\n#define GL_FIXED_ONLY_ARB                      0x891D\ntypedef void (APIENTRYP pfn_glClampColorARB) (GLenum, GLenum);\nextern pfn_glClampColorARB fp_glClampColorARB;\n\n /* GL_ARB_compatibility */\nextern GLboolean GLAD_ARB_compatibility;\n\n /* GL_ARB_compressed_texture_pixel_storage */\nextern GLboolean GLAD_ARB_compressed_texture_pixel_storage;\n\n /* GL_ARB_compute_shader */\nextern GLboolean GLAD_ARB_compute_shader;\n\n /* GL_ARB_compute_variable_group_size */\nextern GLboolean GLAD_ARB_compute_variable_group_size;\n#define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB  0x9344\n#define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB  0x90EB\n#define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB  0x9345\n#define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB    0x91BF\ntypedef void (APIENTRYP pfn_glDispatchComputeGroupSizeARB) (GLuint, GLuint, GLuint, GLuint, GLuint, GLuint);\nextern pfn_glDispatchComputeGroupSizeARB fp_glDispatchComputeGroupSizeARB;\n\n /* GL_ARB_conditional_render_inverted */\nextern GLboolean GLAD_ARB_conditional_render_inverted;\n\n /* GL_ARB_conservative_depth */\nextern GLboolean GLAD_ARB_conservative_depth;\n\n /* GL_ARB_copy_buffer */\nextern GLboolean GLAD_ARB_copy_buffer;\n\n /* GL_ARB_copy_image */\nextern GLboolean GLAD_ARB_copy_image;\n\n /* GL_ARB_cull_distance */\nextern GLboolean GLAD_ARB_cull_distance;\n\n /* GL_ARB_debug_output */\nextern GLboolean GLAD_ARB_debug_output;\n#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB        0x8242\n#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB  0x8243\n#define GL_DEBUG_CALLBACK_FUNCTION_ARB         0x8244\n#define GL_DEBUG_CALLBACK_USER_PARAM_ARB       0x8245\n#define GL_DEBUG_SOURCE_API_ARB                0x8246\n#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB      0x8247\n#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB    0x8248\n#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB        0x8249\n#define GL_DEBUG_SOURCE_APPLICATION_ARB        0x824A\n#define GL_DEBUG_SOURCE_OTHER_ARB              0x824B\n#define GL_DEBUG_TYPE_ERROR_ARB                0x824C\n#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB  0x824D\n#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB   0x824E\n#define GL_DEBUG_TYPE_PORTABILITY_ARB          0x824F\n#define GL_DEBUG_TYPE_PERFORMANCE_ARB          0x8250\n#define GL_DEBUG_TYPE_OTHER_ARB                0x8251\n#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB        0x9143\n#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB       0x9144\n#define GL_DEBUG_LOGGED_MESSAGES_ARB           0x9145\n#define GL_DEBUG_SEVERITY_HIGH_ARB             0x9146\n#define GL_DEBUG_SEVERITY_MEDIUM_ARB           0x9147\n#define GL_DEBUG_SEVERITY_LOW_ARB              0x9148\ntypedef void (APIENTRYP pfn_glDebugMessageControlARB) (GLenum, GLenum, GLenum, GLsizei, const GLuint*, GLboolean);\nextern pfn_glDebugMessageControlARB fp_glDebugMessageControlARB;\ntypedef void (APIENTRYP pfn_glDebugMessageInsertARB) (GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*);\nextern pfn_glDebugMessageInsertARB fp_glDebugMessageInsertARB;\ntypedef void (APIENTRYP pfn_glDebugMessageCallbackARB) (GLDEBUGPROCARB, const void*);\nextern pfn_glDebugMessageCallbackARB fp_glDebugMessageCallbackARB;\ntypedef GLuint (APIENTRYP pfn_glGetDebugMessageLogARB) (GLuint, GLsizei, GLenum*, GLenum*, GLuint*, GLenum*, GLsizei*, GLchar*);\nextern pfn_glGetDebugMessageLogARB fp_glGetDebugMessageLogARB;\n\n /* GL_ARB_depth_buffer_float */\nextern GLboolean GLAD_ARB_depth_buffer_float;\n\n /* GL_ARB_depth_clamp */\nextern GLboolean GLAD_ARB_depth_clamp;\n\n /* GL_ARB_derivative_control */\nextern GLboolean GLAD_ARB_derivative_control;\n\n /* GL_ARB_direct_state_access */\nextern GLboolean GLAD_ARB_direct_state_access;\n\n /* GL_ARB_draw_buffers_blend */\nextern GLboolean GLAD_ARB_draw_buffers_blend;\ntypedef void (APIENTRYP pfn_glBlendEquationiARB) (GLuint, GLenum);\nextern pfn_glBlendEquationiARB fp_glBlendEquationiARB;\ntypedef void (APIENTRYP pfn_glBlendEquationSeparateiARB) (GLuint, GLenum, GLenum);\nextern pfn_glBlendEquationSeparateiARB fp_glBlendEquationSeparateiARB;\ntypedef void (APIENTRYP pfn_glBlendFunciARB) (GLuint, GLenum, GLenum);\nextern pfn_glBlendFunciARB fp_glBlendFunciARB;\ntypedef void (APIENTRYP pfn_glBlendFuncSeparateiARB) (GLuint, GLenum, GLenum, GLenum, GLenum);\nextern pfn_glBlendFuncSeparateiARB fp_glBlendFuncSeparateiARB;\n\n /* GL_ARB_draw_elements_base_vertex */\nextern GLboolean GLAD_ARB_draw_elements_base_vertex;\n\n /* GL_ARB_draw_indirect */\nextern GLboolean GLAD_ARB_draw_indirect;\n\n /* GL_ARB_draw_instanced */\nextern GLboolean GLAD_ARB_draw_instanced;\ntypedef void (APIENTRYP pfn_glDrawArraysInstancedARB) (GLenum, GLint, GLsizei, GLsizei);\nextern pfn_glDrawArraysInstancedARB fp_glDrawArraysInstancedARB;\ntypedef void (APIENTRYP pfn_glDrawElementsInstancedARB) (GLenum, GLsizei, GLenum, const void*, GLsizei);\nextern pfn_glDrawElementsInstancedARB fp_glDrawElementsInstancedARB;\n\n /* GL_ARB_enhanced_layouts */\nextern GLboolean GLAD_ARB_enhanced_layouts;\n\n /* GL_ARB_ES2_compatibility */\nextern GLboolean GLAD_ARB_ES2_compatibility;\n\n /* GL_ARB_ES3_1_compatibility */\nextern GLboolean GLAD_ARB_ES3_1_compatibility;\n\n /* GL_ARB_ES3_2_compatibility */\nextern GLboolean GLAD_ARB_ES3_2_compatibility;\n#define GL_PRIMITIVE_BOUNDING_BOX_ARB          0x92BE\n#define GL_MULTISAMPLE_LINE_WIDTH_RANGE_ARB    0x9381\n#define GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY_ARB  0x9382\ntypedef void (APIENTRYP pfn_glPrimitiveBoundingBoxARB) (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);\nextern pfn_glPrimitiveBoundingBoxARB fp_glPrimitiveBoundingBoxARB;\n\n /* GL_ARB_ES3_compatibility */\nextern GLboolean GLAD_ARB_ES3_compatibility;\n\n /* GL_ARB_explicit_attrib_location */\nextern GLboolean GLAD_ARB_explicit_attrib_location;\n\n /* GL_ARB_explicit_uniform_location */\nextern GLboolean GLAD_ARB_explicit_uniform_location;\n\n /* GL_ARB_fragment_coord_conventions */\nextern GLboolean GLAD_ARB_fragment_coord_conventions;\n\n /* GL_ARB_fragment_layer_viewport */\nextern GLboolean GLAD_ARB_fragment_layer_viewport;\n\n /* GL_ARB_fragment_shader_interlock */\nextern GLboolean GLAD_ARB_fragment_shader_interlock;\n\n /* GL_ARB_framebuffer_no_attachments */\nextern GLboolean GLAD_ARB_framebuffer_no_attachments;\n\n /* GL_ARB_framebuffer_object */\nextern GLboolean GLAD_ARB_framebuffer_object;\n\n /* GL_ARB_framebuffer_sRGB */\nextern GLboolean GLAD_ARB_framebuffer_sRGB;\n\n /* GL_ARB_geometry_shader4 */\nextern GLboolean GLAD_ARB_geometry_shader4;\n#define GL_LINES_ADJACENCY_ARB                 0x000A\n#define GL_LINE_STRIP_ADJACENCY_ARB            0x000B\n#define GL_TRIANGLES_ADJACENCY_ARB             0x000C\n#define GL_TRIANGLE_STRIP_ADJACENCY_ARB        0x000D\n#define GL_PROGRAM_POINT_SIZE_ARB              0x8642\n#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB  0x8C29\n#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB  0x8DA7\n#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB  0x8DA8\n#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB  0x8DA9\n#define GL_GEOMETRY_SHADER_ARB                 0x8DD9\n#define GL_GEOMETRY_VERTICES_OUT_ARB           0x8DDA\n#define GL_GEOMETRY_INPUT_TYPE_ARB             0x8DDB\n#define GL_GEOMETRY_OUTPUT_TYPE_ARB            0x8DDC\n#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB  0x8DDD\n#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB   0x8DDE\n#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB  0x8DDF\n#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB    0x8DE0\n#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB  0x8DE1\ntypedef void (APIENTRYP pfn_glProgramParameteriARB) (GLuint, GLenum, GLint);\nextern pfn_glProgramParameteriARB fp_glProgramParameteriARB;\ntypedef void (APIENTRYP pfn_glFramebufferTextureARB) (GLenum, GLenum, GLuint, GLint);\nextern pfn_glFramebufferTextureARB fp_glFramebufferTextureARB;\ntypedef void (APIENTRYP pfn_glFramebufferTextureLayerARB) (GLenum, GLenum, GLuint, GLint, GLint);\nextern pfn_glFramebufferTextureLayerARB fp_glFramebufferTextureLayerARB;\ntypedef void (APIENTRYP pfn_glFramebufferTextureFaceARB) (GLenum, GLenum, GLuint, GLint, GLenum);\nextern pfn_glFramebufferTextureFaceARB fp_glFramebufferTextureFaceARB;\n\n /* GL_ARB_get_program_binary */\nextern GLboolean GLAD_ARB_get_program_binary;\n\n /* GL_ARB_get_texture_sub_image */\nextern GLboolean GLAD_ARB_get_texture_sub_image;\n\n /* GL_ARB_gpu_shader5 */\nextern GLboolean GLAD_ARB_gpu_shader5;\n\n /* GL_ARB_gpu_shader_fp64 */\nextern GLboolean GLAD_ARB_gpu_shader_fp64;\n\n /* GL_ARB_gpu_shader_int64 */\nextern GLboolean GLAD_ARB_gpu_shader_int64;\n#define GL_INT64_ARB                           0x140E\n#define GL_INT64_VEC2_ARB                      0x8FE9\n#define GL_INT64_VEC3_ARB                      0x8FEA\n#define GL_INT64_VEC4_ARB                      0x8FEB\n#define GL_UNSIGNED_INT64_VEC2_ARB             0x8FF5\n#define GL_UNSIGNED_INT64_VEC3_ARB             0x8FF6\n#define GL_UNSIGNED_INT64_VEC4_ARB             0x8FF7\ntypedef void (APIENTRYP pfn_glUniform1i64ARB) (GLint, GLint64);\nextern pfn_glUniform1i64ARB fp_glUniform1i64ARB;\ntypedef void (APIENTRYP pfn_glUniform2i64ARB) (GLint, GLint64, GLint64);\nextern pfn_glUniform2i64ARB fp_glUniform2i64ARB;\ntypedef void (APIENTRYP pfn_glUniform3i64ARB) (GLint, GLint64, GLint64, GLint64);\nextern pfn_glUniform3i64ARB fp_glUniform3i64ARB;\ntypedef void (APIENTRYP pfn_glUniform4i64ARB) (GLint, GLint64, GLint64, GLint64, GLint64);\nextern pfn_glUniform4i64ARB fp_glUniform4i64ARB;\ntypedef void (APIENTRYP pfn_glUniform1i64vARB) (GLint, GLsizei, const GLint64*);\nextern pfn_glUniform1i64vARB fp_glUniform1i64vARB;\ntypedef void (APIENTRYP pfn_glUniform2i64vARB) (GLint, GLsizei, const GLint64*);\nextern pfn_glUniform2i64vARB fp_glUniform2i64vARB;\ntypedef void (APIENTRYP pfn_glUniform3i64vARB) (GLint, GLsizei, const GLint64*);\nextern pfn_glUniform3i64vARB fp_glUniform3i64vARB;\ntypedef void (APIENTRYP pfn_glUniform4i64vARB) (GLint, GLsizei, const GLint64*);\nextern pfn_glUniform4i64vARB fp_glUniform4i64vARB;\ntypedef void (APIENTRYP pfn_glUniform1ui64ARB) (GLint, GLuint64);\nextern pfn_glUniform1ui64ARB fp_glUniform1ui64ARB;\ntypedef void (APIENTRYP pfn_glUniform2ui64ARB) (GLint, GLuint64, GLuint64);\nextern pfn_glUniform2ui64ARB fp_glUniform2ui64ARB;\ntypedef void (APIENTRYP pfn_glUniform3ui64ARB) (GLint, GLuint64, GLuint64, GLuint64);\nextern pfn_glUniform3ui64ARB fp_glUniform3ui64ARB;\ntypedef void (APIENTRYP pfn_glUniform4ui64ARB) (GLint, GLuint64, GLuint64, GLuint64, GLuint64);\nextern pfn_glUniform4ui64ARB fp_glUniform4ui64ARB;\ntypedef void (APIENTRYP pfn_glUniform1ui64vARB) (GLint, GLsizei, const GLuint64*);\nextern pfn_glUniform1ui64vARB fp_glUniform1ui64vARB;\ntypedef void (APIENTRYP pfn_glUniform2ui64vARB) (GLint, GLsizei, const GLuint64*);\nextern pfn_glUniform2ui64vARB fp_glUniform2ui64vARB;\ntypedef void (APIENTRYP pfn_glUniform3ui64vARB) (GLint, GLsizei, const GLuint64*);\nextern pfn_glUniform3ui64vARB fp_glUniform3ui64vARB;\ntypedef void (APIENTRYP pfn_glUniform4ui64vARB) (GLint, GLsizei, const GLuint64*);\nextern pfn_glUniform4ui64vARB fp_glUniform4ui64vARB;\ntypedef void (APIENTRYP pfn_glGetUniformi64vARB) (GLuint, GLint, GLint64*);\nextern pfn_glGetUniformi64vARB fp_glGetUniformi64vARB;\ntypedef void (APIENTRYP pfn_glGetUniformui64vARB) (GLuint, GLint, GLuint64*);\nextern pfn_glGetUniformui64vARB fp_glGetUniformui64vARB;\ntypedef void (APIENTRYP pfn_glGetnUniformi64vARB) (GLuint, GLint, GLsizei, GLint64*);\nextern pfn_glGetnUniformi64vARB fp_glGetnUniformi64vARB;\ntypedef void (APIENTRYP pfn_glGetnUniformui64vARB) (GLuint, GLint, GLsizei, GLuint64*);\nextern pfn_glGetnUniformui64vARB fp_glGetnUniformui64vARB;\ntypedef void (APIENTRYP pfn_glProgramUniform1i64ARB) (GLuint, GLint, GLint64);\nextern pfn_glProgramUniform1i64ARB fp_glProgramUniform1i64ARB;\ntypedef void (APIENTRYP pfn_glProgramUniform2i64ARB) (GLuint, GLint, GLint64, GLint64);\nextern pfn_glProgramUniform2i64ARB fp_glProgramUniform2i64ARB;\ntypedef void (APIENTRYP pfn_glProgramUniform3i64ARB) (GLuint, GLint, GLint64, GLint64, GLint64);\nextern pfn_glProgramUniform3i64ARB fp_glProgramUniform3i64ARB;\ntypedef void (APIENTRYP pfn_glProgramUniform4i64ARB) (GLuint, GLint, GLint64, GLint64, GLint64, GLint64);\nextern pfn_glProgramUniform4i64ARB fp_glProgramUniform4i64ARB;\ntypedef void (APIENTRYP pfn_glProgramUniform1i64vARB) (GLuint, GLint, GLsizei, const GLint64*);\nextern pfn_glProgramUniform1i64vARB fp_glProgramUniform1i64vARB;\ntypedef void (APIENTRYP pfn_glProgramUniform2i64vARB) (GLuint, GLint, GLsizei, const GLint64*);\nextern pfn_glProgramUniform2i64vARB fp_glProgramUniform2i64vARB;\ntypedef void (APIENTRYP pfn_glProgramUniform3i64vARB) (GLuint, GLint, GLsizei, const GLint64*);\nextern pfn_glProgramUniform3i64vARB fp_glProgramUniform3i64vARB;\ntypedef void (APIENTRYP pfn_glProgramUniform4i64vARB) (GLuint, GLint, GLsizei, const GLint64*);\nextern pfn_glProgramUniform4i64vARB fp_glProgramUniform4i64vARB;\ntypedef void (APIENTRYP pfn_glProgramUniform1ui64ARB) (GLuint, GLint, GLuint64);\nextern pfn_glProgramUniform1ui64ARB fp_glProgramUniform1ui64ARB;\ntypedef void (APIENTRYP pfn_glProgramUniform2ui64ARB) (GLuint, GLint, GLuint64, GLuint64);\nextern pfn_glProgramUniform2ui64ARB fp_glProgramUniform2ui64ARB;\ntypedef void (APIENTRYP pfn_glProgramUniform3ui64ARB) (GLuint, GLint, GLuint64, GLuint64, GLuint64);\nextern pfn_glProgramUniform3ui64ARB fp_glProgramUniform3ui64ARB;\ntypedef void (APIENTRYP pfn_glProgramUniform4ui64ARB) (GLuint, GLint, GLuint64, GLuint64, GLuint64, GLuint64);\nextern pfn_glProgramUniform4ui64ARB fp_glProgramUniform4ui64ARB;\ntypedef void (APIENTRYP pfn_glProgramUniform1ui64vARB) (GLuint, GLint, GLsizei, const GLuint64*);\nextern pfn_glProgramUniform1ui64vARB fp_glProgramUniform1ui64vARB;\ntypedef void (APIENTRYP pfn_glProgramUniform2ui64vARB) (GLuint, GLint, GLsizei, const GLuint64*);\nextern pfn_glProgramUniform2ui64vARB fp_glProgramUniform2ui64vARB;\ntypedef void (APIENTRYP pfn_glProgramUniform3ui64vARB) (GLuint, GLint, GLsizei, const GLuint64*);\nextern pfn_glProgramUniform3ui64vARB fp_glProgramUniform3ui64vARB;\ntypedef void (APIENTRYP pfn_glProgramUniform4ui64vARB) (GLuint, GLint, GLsizei, const GLuint64*);\nextern pfn_glProgramUniform4ui64vARB fp_glProgramUniform4ui64vARB;\n\n /* GL_ARB_half_float_pixel */\nextern GLboolean GLAD_ARB_half_float_pixel;\n#define GL_HALF_FLOAT_ARB                      0x140B\n\n /* GL_ARB_half_float_vertex */\nextern GLboolean GLAD_ARB_half_float_vertex;\n\n /* GL_ARB_indirect_parameters */\nextern GLboolean GLAD_ARB_indirect_parameters;\n#define GL_PARAMETER_BUFFER_ARB                0x80EE\n#define GL_PARAMETER_BUFFER_BINDING_ARB        0x80EF\ntypedef void (APIENTRYP pfn_glMultiDrawArraysIndirectCountARB) (GLenum, GLintptr, GLintptr, GLsizei, GLsizei);\nextern pfn_glMultiDrawArraysIndirectCountARB fp_glMultiDrawArraysIndirectCountARB;\ntypedef void (APIENTRYP pfn_glMultiDrawElementsIndirectCountARB) (GLenum, GLenum, GLintptr, GLintptr, GLsizei, GLsizei);\nextern pfn_glMultiDrawElementsIndirectCountARB fp_glMultiDrawElementsIndirectCountARB;\n\n /* GL_ARB_instanced_arrays */\nextern GLboolean GLAD_ARB_instanced_arrays;\n#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB     0x88FE\ntypedef void (APIENTRYP pfn_glVertexAttribDivisorARB) (GLuint, GLuint);\nextern pfn_glVertexAttribDivisorARB fp_glVertexAttribDivisorARB;\n\n /* GL_ARB_internalformat_query */\nextern GLboolean GLAD_ARB_internalformat_query;\n\n /* GL_ARB_internalformat_query2 */\nextern GLboolean GLAD_ARB_internalformat_query2;\n#define GL_SRGB_DECODE_ARB                     0x8299\n\n /* GL_ARB_invalidate_subdata */\nextern GLboolean GLAD_ARB_invalidate_subdata;\n\n /* GL_ARB_map_buffer_alignment */\nextern GLboolean GLAD_ARB_map_buffer_alignment;\n\n /* GL_ARB_map_buffer_range */\nextern GLboolean GLAD_ARB_map_buffer_range;\n\n /* GL_ARB_multi_bind */\nextern GLboolean GLAD_ARB_multi_bind;\n\n /* GL_ARB_multi_draw_indirect */\nextern GLboolean GLAD_ARB_multi_draw_indirect;\n\n /* GL_ARB_occlusion_query2 */\nextern GLboolean GLAD_ARB_occlusion_query2;\n\n /* GL_ARB_parallel_shader_compile */\nextern GLboolean GLAD_ARB_parallel_shader_compile;\n#define GL_MAX_SHADER_COMPILER_THREADS_ARB     0x91B0\n#define GL_COMPLETION_STATUS_ARB               0x91B1\ntypedef void (APIENTRYP pfn_glMaxShaderCompilerThreadsARB) (GLuint);\nextern pfn_glMaxShaderCompilerThreadsARB fp_glMaxShaderCompilerThreadsARB;\n\n /* GL_ARB_pipeline_statistics_query */\nextern GLboolean GLAD_ARB_pipeline_statistics_query;\n#define GL_VERTICES_SUBMITTED_ARB              0x82EE\n#define GL_PRIMITIVES_SUBMITTED_ARB            0x82EF\n#define GL_VERTEX_SHADER_INVOCATIONS_ARB       0x82F0\n#define GL_TESS_CONTROL_SHADER_PATCHES_ARB     0x82F1\n#define GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB  0x82F2\n#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB  0x82F3\n#define GL_FRAGMENT_SHADER_INVOCATIONS_ARB     0x82F4\n#define GL_COMPUTE_SHADER_INVOCATIONS_ARB      0x82F5\n#define GL_CLIPPING_INPUT_PRIMITIVES_ARB       0x82F6\n#define GL_CLIPPING_OUTPUT_PRIMITIVES_ARB      0x82F7\n\n /* GL_ARB_pixel_buffer_object */\nextern GLboolean GLAD_ARB_pixel_buffer_object;\n#define GL_PIXEL_PACK_BUFFER_ARB               0x88EB\n#define GL_PIXEL_UNPACK_BUFFER_ARB             0x88EC\n#define GL_PIXEL_PACK_BUFFER_BINDING_ARB       0x88ED\n#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB     0x88EF\n\n /* GL_ARB_post_depth_coverage */\nextern GLboolean GLAD_ARB_post_depth_coverage;\n\n /* GL_ARB_program_interface_query */\nextern GLboolean GLAD_ARB_program_interface_query;\n\n /* GL_ARB_provoking_vertex */\nextern GLboolean GLAD_ARB_provoking_vertex;\n\n /* GL_ARB_query_buffer_object */\nextern GLboolean GLAD_ARB_query_buffer_object;\n\n /* GL_ARB_robust_buffer_access_behavior */\nextern GLboolean GLAD_ARB_robust_buffer_access_behavior;\n\n /* GL_ARB_robustness */\nextern GLboolean GLAD_ARB_robustness;\n#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB  0x00000004\n#define GL_LOSE_CONTEXT_ON_RESET_ARB           0x8252\n#define GL_GUILTY_CONTEXT_RESET_ARB            0x8253\n#define GL_INNOCENT_CONTEXT_RESET_ARB          0x8254\n#define GL_UNKNOWN_CONTEXT_RESET_ARB           0x8255\n#define GL_RESET_NOTIFICATION_STRATEGY_ARB     0x8256\n#define GL_NO_RESET_NOTIFICATION_ARB           0x8261\ntypedef GLenum (APIENTRYP pfn_glGetGraphicsResetStatusARB) ();\nextern pfn_glGetGraphicsResetStatusARB fp_glGetGraphicsResetStatusARB;\ntypedef void (APIENTRYP pfn_glGetnTexImageARB) (GLenum, GLint, GLenum, GLenum, GLsizei, void*);\nextern pfn_glGetnTexImageARB fp_glGetnTexImageARB;\ntypedef void (APIENTRYP pfn_glReadnPixelsARB) (GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLsizei, void*);\nextern pfn_glReadnPixelsARB fp_glReadnPixelsARB;\ntypedef void (APIENTRYP pfn_glGetnCompressedTexImageARB) (GLenum, GLint, GLsizei, void*);\nextern pfn_glGetnCompressedTexImageARB fp_glGetnCompressedTexImageARB;\ntypedef void (APIENTRYP pfn_glGetnUniformfvARB) (GLuint, GLint, GLsizei, GLfloat*);\nextern pfn_glGetnUniformfvARB fp_glGetnUniformfvARB;\ntypedef void (APIENTRYP pfn_glGetnUniformivARB) (GLuint, GLint, GLsizei, GLint*);\nextern pfn_glGetnUniformivARB fp_glGetnUniformivARB;\ntypedef void (APIENTRYP pfn_glGetnUniformuivARB) (GLuint, GLint, GLsizei, GLuint*);\nextern pfn_glGetnUniformuivARB fp_glGetnUniformuivARB;\ntypedef void (APIENTRYP pfn_glGetnUniformdvARB) (GLuint, GLint, GLsizei, GLdouble*);\nextern pfn_glGetnUniformdvARB fp_glGetnUniformdvARB;\ntypedef void (APIENTRYP pfn_glGetnMapdvARB) (GLenum, GLenum, GLsizei, GLdouble*);\nextern pfn_glGetnMapdvARB fp_glGetnMapdvARB;\ntypedef void (APIENTRYP pfn_glGetnMapfvARB) (GLenum, GLenum, GLsizei, GLfloat*);\nextern pfn_glGetnMapfvARB fp_glGetnMapfvARB;\ntypedef void (APIENTRYP pfn_glGetnMapivARB) (GLenum, GLenum, GLsizei, GLint*);\nextern pfn_glGetnMapivARB fp_glGetnMapivARB;\ntypedef void (APIENTRYP pfn_glGetnPixelMapfvARB) (GLenum, GLsizei, GLfloat*);\nextern pfn_glGetnPixelMapfvARB fp_glGetnPixelMapfvARB;\ntypedef void (APIENTRYP pfn_glGetnPixelMapuivARB) (GLenum, GLsizei, GLuint*);\nextern pfn_glGetnPixelMapuivARB fp_glGetnPixelMapuivARB;\ntypedef void (APIENTRYP pfn_glGetnPixelMapusvARB) (GLenum, GLsizei, GLushort*);\nextern pfn_glGetnPixelMapusvARB fp_glGetnPixelMapusvARB;\ntypedef void (APIENTRYP pfn_glGetnPolygonStippleARB) (GLsizei, GLubyte*);\nextern pfn_glGetnPolygonStippleARB fp_glGetnPolygonStippleARB;\ntypedef void (APIENTRYP pfn_glGetnColorTableARB) (GLenum, GLenum, GLenum, GLsizei, void*);\nextern pfn_glGetnColorTableARB fp_glGetnColorTableARB;\ntypedef void (APIENTRYP pfn_glGetnConvolutionFilterARB) (GLenum, GLenum, GLenum, GLsizei, void*);\nextern pfn_glGetnConvolutionFilterARB fp_glGetnConvolutionFilterARB;\ntypedef void (APIENTRYP pfn_glGetnSeparableFilterARB) (GLenum, GLenum, GLenum, GLsizei, void*, GLsizei, void*, void*);\nextern pfn_glGetnSeparableFilterARB fp_glGetnSeparableFilterARB;\ntypedef void (APIENTRYP pfn_glGetnHistogramARB) (GLenum, GLboolean, GLenum, GLenum, GLsizei, void*);\nextern pfn_glGetnHistogramARB fp_glGetnHistogramARB;\ntypedef void (APIENTRYP pfn_glGetnMinmaxARB) (GLenum, GLboolean, GLenum, GLenum, GLsizei, void*);\nextern pfn_glGetnMinmaxARB fp_glGetnMinmaxARB;\n\n /* GL_ARB_robustness_isolation */\nextern GLboolean GLAD_ARB_robustness_isolation;\n\n /* GL_ARB_sample_locations */\nextern GLboolean GLAD_ARB_sample_locations;\n#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB   0x933D\n#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB  0x933E\n#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB  0x933F\n#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB  0x9340\n#define GL_SAMPLE_LOCATION_ARB                 0x8E50\n#define GL_PROGRAMMABLE_SAMPLE_LOCATION_ARB    0x9341\n#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB  0x9342\n#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB  0x9343\ntypedef void (APIENTRYP pfn_glFramebufferSampleLocationsfvARB) (GLenum, GLuint, GLsizei, const GLfloat*);\nextern pfn_glFramebufferSampleLocationsfvARB fp_glFramebufferSampleLocationsfvARB;\ntypedef void (APIENTRYP pfn_glNamedFramebufferSampleLocationsfvARB) (GLuint, GLuint, GLsizei, const GLfloat*);\nextern pfn_glNamedFramebufferSampleLocationsfvARB fp_glNamedFramebufferSampleLocationsfvARB;\ntypedef void (APIENTRYP pfn_glEvaluateDepthValuesARB) ();\nextern pfn_glEvaluateDepthValuesARB fp_glEvaluateDepthValuesARB;\n\n /* GL_ARB_sample_shading */\nextern GLboolean GLAD_ARB_sample_shading;\n#define GL_SAMPLE_SHADING_ARB                  0x8C36\n#define GL_MIN_SAMPLE_SHADING_VALUE_ARB        0x8C37\ntypedef void (APIENTRYP pfn_glMinSampleShadingARB) (GLfloat);\nextern pfn_glMinSampleShadingARB fp_glMinSampleShadingARB;\n\n /* GL_ARB_sampler_objects */\nextern GLboolean GLAD_ARB_sampler_objects;\n\n /* GL_ARB_seamless_cube_map */\nextern GLboolean GLAD_ARB_seamless_cube_map;\n\n /* GL_ARB_seamless_cubemap_per_texture */\nextern GLboolean GLAD_ARB_seamless_cubemap_per_texture;\n\n /* GL_ARB_separate_shader_objects */\nextern GLboolean GLAD_ARB_separate_shader_objects;\n\n /* GL_ARB_shader_atomic_counter_ops */\nextern GLboolean GLAD_ARB_shader_atomic_counter_ops;\n\n /* GL_ARB_shader_atomic_counters */\nextern GLboolean GLAD_ARB_shader_atomic_counters;\n\n /* GL_ARB_shader_ballot */\nextern GLboolean GLAD_ARB_shader_ballot;\n\n /* GL_ARB_shader_bit_encoding */\nextern GLboolean GLAD_ARB_shader_bit_encoding;\n\n /* GL_ARB_shader_clock */\nextern GLboolean GLAD_ARB_shader_clock;\n\n /* GL_ARB_shader_draw_parameters */\nextern GLboolean GLAD_ARB_shader_draw_parameters;\n\n /* GL_ARB_shader_group_vote */\nextern GLboolean GLAD_ARB_shader_group_vote;\n\n /* GL_ARB_shader_image_load_store */\nextern GLboolean GLAD_ARB_shader_image_load_store;\n\n /* GL_ARB_shader_image_size */\nextern GLboolean GLAD_ARB_shader_image_size;\n\n /* GL_ARB_shader_precision */\nextern GLboolean GLAD_ARB_shader_precision;\n\n /* GL_ARB_shader_stencil_export */\nextern GLboolean GLAD_ARB_shader_stencil_export;\n\n /* GL_ARB_shader_storage_buffer_object */\nextern GLboolean GLAD_ARB_shader_storage_buffer_object;\n\n /* GL_ARB_shader_subroutine */\nextern GLboolean GLAD_ARB_shader_subroutine;\n\n /* GL_ARB_shader_texture_image_samples */\nextern GLboolean GLAD_ARB_shader_texture_image_samples;\n\n /* GL_ARB_shader_texture_lod */\nextern GLboolean GLAD_ARB_shader_texture_lod;\n\n /* GL_ARB_shader_viewport_layer_array */\nextern GLboolean GLAD_ARB_shader_viewport_layer_array;\n\n /* GL_ARB_shading_language_420pack */\nextern GLboolean GLAD_ARB_shading_language_420pack;\n\n /* GL_ARB_shading_language_include */\nextern GLboolean GLAD_ARB_shading_language_include;\n#define GL_SHADER_INCLUDE_ARB                  0x8DAE\n#define GL_NAMED_STRING_LENGTH_ARB             0x8DE9\n#define GL_NAMED_STRING_TYPE_ARB               0x8DEA\ntypedef void (APIENTRYP pfn_glNamedStringARB) (GLenum, GLint, const GLchar*, GLint, const GLchar*);\nextern pfn_glNamedStringARB fp_glNamedStringARB;\ntypedef void (APIENTRYP pfn_glDeleteNamedStringARB) (GLint, const GLchar*);\nextern pfn_glDeleteNamedStringARB fp_glDeleteNamedStringARB;\ntypedef void (APIENTRYP pfn_glCompileShaderIncludeARB) (GLuint, GLsizei, const GLchar**, const GLint*);\nextern pfn_glCompileShaderIncludeARB fp_glCompileShaderIncludeARB;\ntypedef GLboolean (APIENTRYP pfn_glIsNamedStringARB) (GLint, const GLchar*);\nextern pfn_glIsNamedStringARB fp_glIsNamedStringARB;\ntypedef void (APIENTRYP pfn_glGetNamedStringARB) (GLint, const GLchar*, GLsizei, GLint*, GLchar*);\nextern pfn_glGetNamedStringARB fp_glGetNamedStringARB;\ntypedef void (APIENTRYP pfn_glGetNamedStringivARB) (GLint, const GLchar*, GLenum, GLint*);\nextern pfn_glGetNamedStringivARB fp_glGetNamedStringivARB;\n\n /* GL_ARB_shading_language_packing */\nextern GLboolean GLAD_ARB_shading_language_packing;\n\n /* GL_ARB_sparse_buffer */\nextern GLboolean GLAD_ARB_sparse_buffer;\n#define GL_SPARSE_STORAGE_BIT_ARB              0x0400\n#define GL_SPARSE_BUFFER_PAGE_SIZE_ARB         0x82F8\ntypedef void (APIENTRYP pfn_glBufferPageCommitmentARB) (GLenum, GLintptr, GLsizeiptr, GLboolean);\nextern pfn_glBufferPageCommitmentARB fp_glBufferPageCommitmentARB;\ntypedef void (APIENTRYP pfn_glNamedBufferPageCommitmentEXT) (GLuint, GLintptr, GLsizeiptr, GLboolean);\nextern pfn_glNamedBufferPageCommitmentEXT fp_glNamedBufferPageCommitmentEXT;\ntypedef void (APIENTRYP pfn_glNamedBufferPageCommitmentARB) (GLuint, GLintptr, GLsizeiptr, GLboolean);\nextern pfn_glNamedBufferPageCommitmentARB fp_glNamedBufferPageCommitmentARB;\n\n /* GL_ARB_sparse_texture */\nextern GLboolean GLAD_ARB_sparse_texture;\n#define GL_TEXTURE_SPARSE_ARB                  0x91A6\n#define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB         0x91A7\n#define GL_NUM_SPARSE_LEVELS_ARB               0x91AA\n#define GL_NUM_VIRTUAL_PAGE_SIZES_ARB          0x91A8\n#define GL_VIRTUAL_PAGE_SIZE_X_ARB             0x9195\n#define GL_VIRTUAL_PAGE_SIZE_Y_ARB             0x9196\n#define GL_VIRTUAL_PAGE_SIZE_Z_ARB             0x9197\n#define GL_MAX_SPARSE_TEXTURE_SIZE_ARB         0x9198\n#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB      0x9199\n#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB  0x919A\n#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB  0x91A9\ntypedef void (APIENTRYP pfn_glTexPageCommitmentARB) (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLboolean);\nextern pfn_glTexPageCommitmentARB fp_glTexPageCommitmentARB;\n\n /* GL_ARB_sparse_texture2 */\nextern GLboolean GLAD_ARB_sparse_texture2;\n\n /* GL_ARB_sparse_texture_clamp */\nextern GLboolean GLAD_ARB_sparse_texture_clamp;\n\n /* GL_ARB_stencil_texturing */\nextern GLboolean GLAD_ARB_stencil_texturing;\n\n /* GL_ARB_sync */\nextern GLboolean GLAD_ARB_sync;\n\n /* GL_ARB_tessellation_shader */\nextern GLboolean GLAD_ARB_tessellation_shader;\n\n /* GL_ARB_texture_barrier */\nextern GLboolean GLAD_ARB_texture_barrier;\n\n /* GL_ARB_texture_buffer_object */\nextern GLboolean GLAD_ARB_texture_buffer_object;\n#define GL_TEXTURE_BUFFER_ARB                  0x8C2A\n#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB         0x8C2B\n#define GL_TEXTURE_BINDING_BUFFER_ARB          0x8C2C\n#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB  0x8C2D\n#define GL_TEXTURE_BUFFER_FORMAT_ARB           0x8C2E\ntypedef void (APIENTRYP pfn_glTexBufferARB) (GLenum, GLenum, GLuint);\nextern pfn_glTexBufferARB fp_glTexBufferARB;\n\n /* GL_ARB_texture_buffer_object_rgb32 */\nextern GLboolean GLAD_ARB_texture_buffer_object_rgb32;\n\n /* GL_ARB_texture_buffer_range */\nextern GLboolean GLAD_ARB_texture_buffer_range;\n\n /* GL_ARB_texture_compression_bptc */\nextern GLboolean GLAD_ARB_texture_compression_bptc;\n#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB      0x8E8C\n#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB  0x8E8D\n#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB  0x8E8E\n#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB  0x8E8F\n\n /* GL_ARB_texture_compression_rgtc */\nextern GLboolean GLAD_ARB_texture_compression_rgtc;\n\n /* GL_ARB_texture_cube_map_array */\nextern GLboolean GLAD_ARB_texture_cube_map_array;\n#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB          0x9009\n#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB  0x900A\n#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB    0x900B\n#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB          0x900C\n#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB   0x900D\n#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB      0x900E\n#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB  0x900F\n\n /* GL_ARB_texture_filter_minmax */\nextern GLboolean GLAD_ARB_texture_filter_minmax;\n#define GL_TEXTURE_REDUCTION_MODE_ARB          0x9366\n#define GL_WEIGHTED_AVERAGE_ARB                0x9367\n\n /* GL_ARB_texture_float */\nextern GLboolean GLAD_ARB_texture_float;\n#define GL_TEXTURE_RED_TYPE_ARB                0x8C10\n#define GL_TEXTURE_GREEN_TYPE_ARB              0x8C11\n#define GL_TEXTURE_BLUE_TYPE_ARB               0x8C12\n#define GL_TEXTURE_ALPHA_TYPE_ARB              0x8C13\n#define GL_TEXTURE_LUMINANCE_TYPE_ARB          0x8C14\n#define GL_TEXTURE_INTENSITY_TYPE_ARB          0x8C15\n#define GL_TEXTURE_DEPTH_TYPE_ARB              0x8C16\n#define GL_UNSIGNED_NORMALIZED_ARB             0x8C17\n#define GL_RGBA32F_ARB                         0x8814\n#define GL_RGB32F_ARB                          0x8815\n#define GL_ALPHA32F_ARB                        0x8816\n#define GL_INTENSITY32F_ARB                    0x8817\n#define GL_LUMINANCE32F_ARB                    0x8818\n#define GL_LUMINANCE_ALPHA32F_ARB              0x8819\n#define GL_RGBA16F_ARB                         0x881A\n#define GL_RGB16F_ARB                          0x881B\n#define GL_ALPHA16F_ARB                        0x881C\n#define GL_INTENSITY16F_ARB                    0x881D\n#define GL_LUMINANCE16F_ARB                    0x881E\n#define GL_LUMINANCE_ALPHA16F_ARB              0x881F\n\n /* GL_ARB_texture_gather */\nextern GLboolean GLAD_ARB_texture_gather;\n#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB  0x8E5E\n#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB  0x8E5F\n#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB  0x8F9F\n\n /* GL_ARB_texture_mirror_clamp_to_edge */\nextern GLboolean GLAD_ARB_texture_mirror_clamp_to_edge;\n\n /* GL_ARB_texture_multisample */\nextern GLboolean GLAD_ARB_texture_multisample;\n\n /* GL_ARB_texture_query_levels */\nextern GLboolean GLAD_ARB_texture_query_levels;\n\n /* GL_ARB_texture_query_lod */\nextern GLboolean GLAD_ARB_texture_query_lod;\n\n /* GL_ARB_texture_rectangle */\nextern GLboolean GLAD_ARB_texture_rectangle;\n#define GL_TEXTURE_RECTANGLE_ARB               0x84F5\n#define GL_TEXTURE_BINDING_RECTANGLE_ARB       0x84F6\n#define GL_PROXY_TEXTURE_RECTANGLE_ARB         0x84F7\n#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB      0x84F8\n\n /* GL_ARB_texture_rg */\nextern GLboolean GLAD_ARB_texture_rg;\n\n /* GL_ARB_texture_rgb10_a2ui */\nextern GLboolean GLAD_ARB_texture_rgb10_a2ui;\n\n /* GL_ARB_texture_stencil8 */\nextern GLboolean GLAD_ARB_texture_stencil8;\n\n /* GL_ARB_texture_storage */\nextern GLboolean GLAD_ARB_texture_storage;\n\n /* GL_ARB_texture_storage_multisample */\nextern GLboolean GLAD_ARB_texture_storage_multisample;\n\n /* GL_ARB_texture_swizzle */\nextern GLboolean GLAD_ARB_texture_swizzle;\n\n /* GL_ARB_texture_view */\nextern GLboolean GLAD_ARB_texture_view;\n\n /* GL_ARB_timer_query */\nextern GLboolean GLAD_ARB_timer_query;\n\n /* GL_ARB_transform_feedback2 */\nextern GLboolean GLAD_ARB_transform_feedback2;\n\n /* GL_ARB_transform_feedback3 */\nextern GLboolean GLAD_ARB_transform_feedback3;\n\n /* GL_ARB_transform_feedback_instanced */\nextern GLboolean GLAD_ARB_transform_feedback_instanced;\n\n /* GL_ARB_transform_feedback_overflow_query */\nextern GLboolean GLAD_ARB_transform_feedback_overflow_query;\n#define GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB     0x82EC\n#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB  0x82ED\n\n /* GL_ARB_uniform_buffer_object */\nextern GLboolean GLAD_ARB_uniform_buffer_object;\n\n /* GL_ARB_vertex_array_bgra */\nextern GLboolean GLAD_ARB_vertex_array_bgra;\n\n /* GL_ARB_vertex_array_object */\nextern GLboolean GLAD_ARB_vertex_array_object;\n\n /* GL_ARB_vertex_attrib_64bit */\nextern GLboolean GLAD_ARB_vertex_attrib_64bit;\n\n /* GL_ARB_vertex_attrib_binding */\nextern GLboolean GLAD_ARB_vertex_attrib_binding;\n\n /* GL_ARB_vertex_type_10f_11f_11f_rev */\nextern GLboolean GLAD_ARB_vertex_type_10f_11f_11f_rev;\n\n /* GL_ARB_vertex_type_2_10_10_10_rev */\nextern GLboolean GLAD_ARB_vertex_type_2_10_10_10_rev;\n\n /* GL_ARB_viewport_array */\nextern GLboolean GLAD_ARB_viewport_array;\n\n /* GL_EXT_base_instance */\nextern GLboolean GLAD_EXT_base_instance;\ntypedef void (APIENTRYP pfn_glDrawArraysInstancedBaseInstanceEXT) (GLenum, GLint, GLsizei, GLsizei, GLuint);\nextern pfn_glDrawArraysInstancedBaseInstanceEXT fp_glDrawArraysInstancedBaseInstanceEXT;\ntypedef void (APIENTRYP pfn_glDrawElementsInstancedBaseInstanceEXT) (GLenum, GLsizei, GLenum, const void*, GLsizei, GLuint);\nextern pfn_glDrawElementsInstancedBaseInstanceEXT fp_glDrawElementsInstancedBaseInstanceEXT;\ntypedef void (APIENTRYP pfn_glDrawElementsInstancedBaseVertexBaseInstanceEXT) (GLenum, GLsizei, GLenum, const void*, GLsizei, GLint, GLuint);\nextern pfn_glDrawElementsInstancedBaseVertexBaseInstanceEXT fp_glDrawElementsInstancedBaseVertexBaseInstanceEXT;\n\n /* GL_EXT_bgra */\nextern GLboolean GLAD_EXT_bgra;\n#define GL_BGR_EXT                             0x80E0\n#define GL_BGRA_EXT                            0x80E1\n\n /* GL_EXT_bindable_uniform */\nextern GLboolean GLAD_EXT_bindable_uniform;\n#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT    0x8DE2\n#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT  0x8DE3\n#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT  0x8DE4\n#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT       0x8DED\n#define GL_UNIFORM_BUFFER_EXT                  0x8DEE\n#define GL_UNIFORM_BUFFER_BINDING_EXT          0x8DEF\ntypedef void (APIENTRYP pfn_glUniformBufferEXT) (GLuint, GLint, GLuint);\nextern pfn_glUniformBufferEXT fp_glUniformBufferEXT;\ntypedef GLint (APIENTRYP pfn_glGetUniformBufferSizeEXT) (GLuint, GLint);\nextern pfn_glGetUniformBufferSizeEXT fp_glGetUniformBufferSizeEXT;\ntypedef GLintptr (APIENTRYP pfn_glGetUniformOffsetEXT) (GLuint, GLint);\nextern pfn_glGetUniformOffsetEXT fp_glGetUniformOffsetEXT;\n\n /* GL_EXT_blend_func_extended */\nextern GLboolean GLAD_EXT_blend_func_extended;\n#define GL_SRC1_COLOR_EXT                      0x88F9\n#define GL_SRC1_ALPHA_EXT                      0x8589\n#define GL_ONE_MINUS_SRC1_COLOR_EXT            0x88FA\n#define GL_ONE_MINUS_SRC1_ALPHA_EXT            0x88FB\n#define GL_SRC_ALPHA_SATURATE_EXT              0x0308\n#define GL_LOCATION_INDEX_EXT                  0x930F\n#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT    0x88FC\ntypedef void (APIENTRYP pfn_glBindFragDataLocationIndexedEXT) (GLuint, GLuint, GLuint, const GLchar*);\nextern pfn_glBindFragDataLocationIndexedEXT fp_glBindFragDataLocationIndexedEXT;\ntypedef void (APIENTRYP pfn_glBindFragDataLocationEXT) (GLuint, GLuint, const GLchar*);\nextern pfn_glBindFragDataLocationEXT fp_glBindFragDataLocationEXT;\ntypedef GLint (APIENTRYP pfn_glGetProgramResourceLocationIndexEXT) (GLuint, GLenum, const GLchar*);\nextern pfn_glGetProgramResourceLocationIndexEXT fp_glGetProgramResourceLocationIndexEXT;\ntypedef GLint (APIENTRYP pfn_glGetFragDataIndexEXT) (GLuint, const GLchar*);\nextern pfn_glGetFragDataIndexEXT fp_glGetFragDataIndexEXT;\n\n /* GL_EXT_blend_minmax */\nextern GLboolean GLAD_EXT_blend_minmax;\n#define GL_MIN_EXT                             0x8007\n#define GL_MAX_EXT                             0x8008\n#define GL_FUNC_ADD_EXT                        0x8006\n#define GL_BLEND_EQUATION_EXT                  0x8009\ntypedef void (APIENTRYP pfn_glBlendEquationEXT) (GLenum);\nextern pfn_glBlendEquationEXT fp_glBlendEquationEXT;\n\n /* GL_EXT_buffer_storage */\nextern GLboolean GLAD_EXT_buffer_storage;\n#define GL_MAP_PERSISTENT_BIT_EXT              0x0040\n#define GL_MAP_COHERENT_BIT_EXT                0x0080\n#define GL_DYNAMIC_STORAGE_BIT_EXT             0x0100\n#define GL_CLIENT_STORAGE_BIT_EXT              0x0200\n#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT_EXT  0x00004000\n#define GL_BUFFER_IMMUTABLE_STORAGE_EXT        0x821F\n#define GL_BUFFER_STORAGE_FLAGS_EXT            0x8220\ntypedef void (APIENTRYP pfn_glBufferStorageEXT) (GLenum, GLsizeiptr, const void*, GLbitfield);\nextern pfn_glBufferStorageEXT fp_glBufferStorageEXT;\n\n /* GL_EXT_color_buffer_float */\nextern GLboolean GLAD_EXT_color_buffer_float;\n\n /* GL_EXT_color_buffer_half_float */\nextern GLboolean GLAD_EXT_color_buffer_half_float;\n#define GL_RGBA16F_EXT                         0x881A\n#define GL_RGB16F_EXT                          0x881B\n#define GL_RG16F_EXT                           0x822F\n#define GL_R16F_EXT                            0x822D\n#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT  0x8211\n#define GL_UNSIGNED_NORMALIZED_EXT             0x8C17\n\n /* GL_EXT_copy_image */\nextern GLboolean GLAD_EXT_copy_image;\ntypedef void (APIENTRYP pfn_glCopyImageSubDataEXT) (GLuint, GLenum, GLint, GLint, GLint, GLint, GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei);\nextern pfn_glCopyImageSubDataEXT fp_glCopyImageSubDataEXT;\n\n /* GL_EXT_debug_label */\nextern GLboolean GLAD_EXT_debug_label;\n#define GL_PROGRAM_PIPELINE_OBJECT_EXT         0x8A4F\n#define GL_PROGRAM_OBJECT_EXT                  0x8B40\n#define GL_SHADER_OBJECT_EXT                   0x8B48\n#define GL_BUFFER_OBJECT_EXT                   0x9151\n#define GL_QUERY_OBJECT_EXT                    0x9153\n#define GL_VERTEX_ARRAY_OBJECT_EXT             0x9154\ntypedef void (APIENTRYP pfn_glLabelObjectEXT) (GLenum, GLuint, GLsizei, const GLchar*);\nextern pfn_glLabelObjectEXT fp_glLabelObjectEXT;\ntypedef void (APIENTRYP pfn_glGetObjectLabelEXT) (GLenum, GLuint, GLsizei, GLsizei*, GLchar*);\nextern pfn_glGetObjectLabelEXT fp_glGetObjectLabelEXT;\n\n /* GL_EXT_debug_marker */\nextern GLboolean GLAD_EXT_debug_marker;\ntypedef void (APIENTRYP pfn_glInsertEventMarkerEXT) (GLsizei, const GLchar*);\nextern pfn_glInsertEventMarkerEXT fp_glInsertEventMarkerEXT;\ntypedef void (APIENTRYP pfn_glPushGroupMarkerEXT) (GLsizei, const GLchar*);\nextern pfn_glPushGroupMarkerEXT fp_glPushGroupMarkerEXT;\ntypedef void (APIENTRYP pfn_glPopGroupMarkerEXT) ();\nextern pfn_glPopGroupMarkerEXT fp_glPopGroupMarkerEXT;\n\n /* GL_EXT_direct_state_access */\nextern GLboolean GLAD_EXT_direct_state_access;\n#define GL_PROGRAM_MATRIX_EXT                  0x8E2D\n#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT        0x8E2E\n#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT      0x8E2F\ntypedef void (APIENTRYP pfn_glMatrixLoadfEXT) (GLenum, const GLfloat*);\nextern pfn_glMatrixLoadfEXT fp_glMatrixLoadfEXT;\ntypedef void (APIENTRYP pfn_glMatrixLoaddEXT) (GLenum, const GLdouble*);\nextern pfn_glMatrixLoaddEXT fp_glMatrixLoaddEXT;\ntypedef void (APIENTRYP pfn_glMatrixMultfEXT) (GLenum, const GLfloat*);\nextern pfn_glMatrixMultfEXT fp_glMatrixMultfEXT;\ntypedef void (APIENTRYP pfn_glMatrixMultdEXT) (GLenum, const GLdouble*);\nextern pfn_glMatrixMultdEXT fp_glMatrixMultdEXT;\ntypedef void (APIENTRYP pfn_glMatrixLoadIdentityEXT) (GLenum);\nextern pfn_glMatrixLoadIdentityEXT fp_glMatrixLoadIdentityEXT;\ntypedef void (APIENTRYP pfn_glMatrixRotatefEXT) (GLenum, GLfloat, GLfloat, GLfloat, GLfloat);\nextern pfn_glMatrixRotatefEXT fp_glMatrixRotatefEXT;\ntypedef void (APIENTRYP pfn_glMatrixRotatedEXT) (GLenum, GLdouble, GLdouble, GLdouble, GLdouble);\nextern pfn_glMatrixRotatedEXT fp_glMatrixRotatedEXT;\ntypedef void (APIENTRYP pfn_glMatrixScalefEXT) (GLenum, GLfloat, GLfloat, GLfloat);\nextern pfn_glMatrixScalefEXT fp_glMatrixScalefEXT;\ntypedef void (APIENTRYP pfn_glMatrixScaledEXT) (GLenum, GLdouble, GLdouble, GLdouble);\nextern pfn_glMatrixScaledEXT fp_glMatrixScaledEXT;\ntypedef void (APIENTRYP pfn_glMatrixTranslatefEXT) (GLenum, GLfloat, GLfloat, GLfloat);\nextern pfn_glMatrixTranslatefEXT fp_glMatrixTranslatefEXT;\ntypedef void (APIENTRYP pfn_glMatrixTranslatedEXT) (GLenum, GLdouble, GLdouble, GLdouble);\nextern pfn_glMatrixTranslatedEXT fp_glMatrixTranslatedEXT;\ntypedef void (APIENTRYP pfn_glMatrixFrustumEXT) (GLenum, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble);\nextern pfn_glMatrixFrustumEXT fp_glMatrixFrustumEXT;\ntypedef void (APIENTRYP pfn_glMatrixOrthoEXT) (GLenum, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble);\nextern pfn_glMatrixOrthoEXT fp_glMatrixOrthoEXT;\ntypedef void (APIENTRYP pfn_glMatrixPopEXT) (GLenum);\nextern pfn_glMatrixPopEXT fp_glMatrixPopEXT;\ntypedef void (APIENTRYP pfn_glMatrixPushEXT) (GLenum);\nextern pfn_glMatrixPushEXT fp_glMatrixPushEXT;\ntypedef void (APIENTRYP pfn_glClientAttribDefaultEXT) (GLbitfield);\nextern pfn_glClientAttribDefaultEXT fp_glClientAttribDefaultEXT;\ntypedef void (APIENTRYP pfn_glPushClientAttribDefaultEXT) (GLbitfield);\nextern pfn_glPushClientAttribDefaultEXT fp_glPushClientAttribDefaultEXT;\ntypedef void (APIENTRYP pfn_glTextureParameterfEXT) (GLuint, GLenum, GLenum, GLfloat);\nextern pfn_glTextureParameterfEXT fp_glTextureParameterfEXT;\ntypedef void (APIENTRYP pfn_glTextureParameterfvEXT) (GLuint, GLenum, GLenum, const GLfloat*);\nextern pfn_glTextureParameterfvEXT fp_glTextureParameterfvEXT;\ntypedef void (APIENTRYP pfn_glTextureParameteriEXT) (GLuint, GLenum, GLenum, GLint);\nextern pfn_glTextureParameteriEXT fp_glTextureParameteriEXT;\ntypedef void (APIENTRYP pfn_glTextureParameterivEXT) (GLuint, GLenum, GLenum, const GLint*);\nextern pfn_glTextureParameterivEXT fp_glTextureParameterivEXT;\ntypedef void (APIENTRYP pfn_glTextureImage1DEXT) (GLuint, GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, const void*);\nextern pfn_glTextureImage1DEXT fp_glTextureImage1DEXT;\ntypedef void (APIENTRYP pfn_glTextureImage2DEXT) (GLuint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const void*);\nextern pfn_glTextureImage2DEXT fp_glTextureImage2DEXT;\ntypedef void (APIENTRYP pfn_glTextureSubImage1DEXT) (GLuint, GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const void*);\nextern pfn_glTextureSubImage1DEXT fp_glTextureSubImage1DEXT;\ntypedef void (APIENTRYP pfn_glTextureSubImage2DEXT) (GLuint, GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const void*);\nextern pfn_glTextureSubImage2DEXT fp_glTextureSubImage2DEXT;\ntypedef void (APIENTRYP pfn_glCopyTextureImage1DEXT) (GLuint, GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint);\nextern pfn_glCopyTextureImage1DEXT fp_glCopyTextureImage1DEXT;\ntypedef void (APIENTRYP pfn_glCopyTextureImage2DEXT) (GLuint, GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint);\nextern pfn_glCopyTextureImage2DEXT fp_glCopyTextureImage2DEXT;\ntypedef void (APIENTRYP pfn_glCopyTextureSubImage1DEXT) (GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei);\nextern pfn_glCopyTextureSubImage1DEXT fp_glCopyTextureSubImage1DEXT;\ntypedef void (APIENTRYP pfn_glCopyTextureSubImage2DEXT) (GLuint, GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei);\nextern pfn_glCopyTextureSubImage2DEXT fp_glCopyTextureSubImage2DEXT;\ntypedef void (APIENTRYP pfn_glGetTextureImageEXT) (GLuint, GLenum, GLint, GLenum, GLenum, void*);\nextern pfn_glGetTextureImageEXT fp_glGetTextureImageEXT;\ntypedef void (APIENTRYP pfn_glGetTextureParameterfvEXT) (GLuint, GLenum, GLenum, GLfloat*);\nextern pfn_glGetTextureParameterfvEXT fp_glGetTextureParameterfvEXT;\ntypedef void (APIENTRYP pfn_glGetTextureParameterivEXT) (GLuint, GLenum, GLenum, GLint*);\nextern pfn_glGetTextureParameterivEXT fp_glGetTextureParameterivEXT;\ntypedef void (APIENTRYP pfn_glGetTextureLevelParameterfvEXT) (GLuint, GLenum, GLint, GLenum, GLfloat*);\nextern pfn_glGetTextureLevelParameterfvEXT fp_glGetTextureLevelParameterfvEXT;\ntypedef void (APIENTRYP pfn_glGetTextureLevelParameterivEXT) (GLuint, GLenum, GLint, GLenum, GLint*);\nextern pfn_glGetTextureLevelParameterivEXT fp_glGetTextureLevelParameterivEXT;\ntypedef void (APIENTRYP pfn_glTextureImage3DEXT) (GLuint, GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const void*);\nextern pfn_glTextureImage3DEXT fp_glTextureImage3DEXT;\ntypedef void (APIENTRYP pfn_glTextureSubImage3DEXT) (GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void*);\nextern pfn_glTextureSubImage3DEXT fp_glTextureSubImage3DEXT;\ntypedef void (APIENTRYP pfn_glCopyTextureSubImage3DEXT) (GLuint, GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei);\nextern pfn_glCopyTextureSubImage3DEXT fp_glCopyTextureSubImage3DEXT;\ntypedef void (APIENTRYP pfn_glBindMultiTextureEXT) (GLenum, GLenum, GLuint);\nextern pfn_glBindMultiTextureEXT fp_glBindMultiTextureEXT;\ntypedef void (APIENTRYP pfn_glMultiTexCoordPointerEXT) (GLenum, GLint, GLenum, GLsizei, const void*);\nextern pfn_glMultiTexCoordPointerEXT fp_glMultiTexCoordPointerEXT;\ntypedef void (APIENTRYP pfn_glMultiTexEnvfEXT) (GLenum, GLenum, GLenum, GLfloat);\nextern pfn_glMultiTexEnvfEXT fp_glMultiTexEnvfEXT;\ntypedef void (APIENTRYP pfn_glMultiTexEnvfvEXT) (GLenum, GLenum, GLenum, const GLfloat*);\nextern pfn_glMultiTexEnvfvEXT fp_glMultiTexEnvfvEXT;\ntypedef void (APIENTRYP pfn_glMultiTexEnviEXT) (GLenum, GLenum, GLenum, GLint);\nextern pfn_glMultiTexEnviEXT fp_glMultiTexEnviEXT;\ntypedef void (APIENTRYP pfn_glMultiTexEnvivEXT) (GLenum, GLenum, GLenum, const GLint*);\nextern pfn_glMultiTexEnvivEXT fp_glMultiTexEnvivEXT;\ntypedef void (APIENTRYP pfn_glMultiTexGendEXT) (GLenum, GLenum, GLenum, GLdouble);\nextern pfn_glMultiTexGendEXT fp_glMultiTexGendEXT;\ntypedef void (APIENTRYP pfn_glMultiTexGendvEXT) (GLenum, GLenum, GLenum, const GLdouble*);\nextern pfn_glMultiTexGendvEXT fp_glMultiTexGendvEXT;\ntypedef void (APIENTRYP pfn_glMultiTexGenfEXT) (GLenum, GLenum, GLenum, GLfloat);\nextern pfn_glMultiTexGenfEXT fp_glMultiTexGenfEXT;\ntypedef void (APIENTRYP pfn_glMultiTexGenfvEXT) (GLenum, GLenum, GLenum, const GLfloat*);\nextern pfn_glMultiTexGenfvEXT fp_glMultiTexGenfvEXT;\ntypedef void (APIENTRYP pfn_glMultiTexGeniEXT) (GLenum, GLenum, GLenum, GLint);\nextern pfn_glMultiTexGeniEXT fp_glMultiTexGeniEXT;\ntypedef void (APIENTRYP pfn_glMultiTexGenivEXT) (GLenum, GLenum, GLenum, const GLint*);\nextern pfn_glMultiTexGenivEXT fp_glMultiTexGenivEXT;\ntypedef void (APIENTRYP pfn_glGetMultiTexEnvfvEXT) (GLenum, GLenum, GLenum, GLfloat*);\nextern pfn_glGetMultiTexEnvfvEXT fp_glGetMultiTexEnvfvEXT;\ntypedef void (APIENTRYP pfn_glGetMultiTexEnvivEXT) (GLenum, GLenum, GLenum, GLint*);\nextern pfn_glGetMultiTexEnvivEXT fp_glGetMultiTexEnvivEXT;\ntypedef void (APIENTRYP pfn_glGetMultiTexGendvEXT) (GLenum, GLenum, GLenum, GLdouble*);\nextern pfn_glGetMultiTexGendvEXT fp_glGetMultiTexGendvEXT;\ntypedef void (APIENTRYP pfn_glGetMultiTexGenfvEXT) (GLenum, GLenum, GLenum, GLfloat*);\nextern pfn_glGetMultiTexGenfvEXT fp_glGetMultiTexGenfvEXT;\ntypedef void (APIENTRYP pfn_glGetMultiTexGenivEXT) (GLenum, GLenum, GLenum, GLint*);\nextern pfn_glGetMultiTexGenivEXT fp_glGetMultiTexGenivEXT;\ntypedef void (APIENTRYP pfn_glMultiTexParameteriEXT) (GLenum, GLenum, GLenum, GLint);\nextern pfn_glMultiTexParameteriEXT fp_glMultiTexParameteriEXT;\ntypedef void (APIENTRYP pfn_glMultiTexParameterivEXT) (GLenum, GLenum, GLenum, const GLint*);\nextern pfn_glMultiTexParameterivEXT fp_glMultiTexParameterivEXT;\ntypedef void (APIENTRYP pfn_glMultiTexParameterfEXT) (GLenum, GLenum, GLenum, GLfloat);\nextern pfn_glMultiTexParameterfEXT fp_glMultiTexParameterfEXT;\ntypedef void (APIENTRYP pfn_glMultiTexParameterfvEXT) (GLenum, GLenum, GLenum, const GLfloat*);\nextern pfn_glMultiTexParameterfvEXT fp_glMultiTexParameterfvEXT;\ntypedef void (APIENTRYP pfn_glMultiTexImage1DEXT) (GLenum, GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, const void*);\nextern pfn_glMultiTexImage1DEXT fp_glMultiTexImage1DEXT;\ntypedef void (APIENTRYP pfn_glMultiTexImage2DEXT) (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const void*);\nextern pfn_glMultiTexImage2DEXT fp_glMultiTexImage2DEXT;\ntypedef void (APIENTRYP pfn_glMultiTexSubImage1DEXT) (GLenum, GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const void*);\nextern pfn_glMultiTexSubImage1DEXT fp_glMultiTexSubImage1DEXT;\ntypedef void (APIENTRYP pfn_glMultiTexSubImage2DEXT) (GLenum, GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const void*);\nextern pfn_glMultiTexSubImage2DEXT fp_glMultiTexSubImage2DEXT;\ntypedef void (APIENTRYP pfn_glCopyMultiTexImage1DEXT) (GLenum, GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint);\nextern pfn_glCopyMultiTexImage1DEXT fp_glCopyMultiTexImage1DEXT;\ntypedef void (APIENTRYP pfn_glCopyMultiTexImage2DEXT) (GLenum, GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint);\nextern pfn_glCopyMultiTexImage2DEXT fp_glCopyMultiTexImage2DEXT;\ntypedef void (APIENTRYP pfn_glCopyMultiTexSubImage1DEXT) (GLenum, GLenum, GLint, GLint, GLint, GLint, GLsizei);\nextern pfn_glCopyMultiTexSubImage1DEXT fp_glCopyMultiTexSubImage1DEXT;\ntypedef void (APIENTRYP pfn_glCopyMultiTexSubImage2DEXT) (GLenum, GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei);\nextern pfn_glCopyMultiTexSubImage2DEXT fp_glCopyMultiTexSubImage2DEXT;\ntypedef void (APIENTRYP pfn_glGetMultiTexImageEXT) (GLenum, GLenum, GLint, GLenum, GLenum, void*);\nextern pfn_glGetMultiTexImageEXT fp_glGetMultiTexImageEXT;\ntypedef void (APIENTRYP pfn_glGetMultiTexParameterfvEXT) (GLenum, GLenum, GLenum, GLfloat*);\nextern pfn_glGetMultiTexParameterfvEXT fp_glGetMultiTexParameterfvEXT;\ntypedef void (APIENTRYP pfn_glGetMultiTexParameterivEXT) (GLenum, GLenum, GLenum, GLint*);\nextern pfn_glGetMultiTexParameterivEXT fp_glGetMultiTexParameterivEXT;\ntypedef void (APIENTRYP pfn_glGetMultiTexLevelParameterfvEXT) (GLenum, GLenum, GLint, GLenum, GLfloat*);\nextern pfn_glGetMultiTexLevelParameterfvEXT fp_glGetMultiTexLevelParameterfvEXT;\ntypedef void (APIENTRYP pfn_glGetMultiTexLevelParameterivEXT) (GLenum, GLenum, GLint, GLenum, GLint*);\nextern pfn_glGetMultiTexLevelParameterivEXT fp_glGetMultiTexLevelParameterivEXT;\ntypedef void (APIENTRYP pfn_glMultiTexImage3DEXT) (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const void*);\nextern pfn_glMultiTexImage3DEXT fp_glMultiTexImage3DEXT;\ntypedef void (APIENTRYP pfn_glMultiTexSubImage3DEXT) (GLenum, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void*);\nextern pfn_glMultiTexSubImage3DEXT fp_glMultiTexSubImage3DEXT;\ntypedef void (APIENTRYP pfn_glCopyMultiTexSubImage3DEXT) (GLenum, GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei);\nextern pfn_glCopyMultiTexSubImage3DEXT fp_glCopyMultiTexSubImage3DEXT;\ntypedef void (APIENTRYP pfn_glEnableClientStateIndexedEXT) (GLenum, GLuint);\nextern pfn_glEnableClientStateIndexedEXT fp_glEnableClientStateIndexedEXT;\ntypedef void (APIENTRYP pfn_glDisableClientStateIndexedEXT) (GLenum, GLuint);\nextern pfn_glDisableClientStateIndexedEXT fp_glDisableClientStateIndexedEXT;\ntypedef void (APIENTRYP pfn_glGetFloatIndexedvEXT) (GLenum, GLuint, GLfloat*);\nextern pfn_glGetFloatIndexedvEXT fp_glGetFloatIndexedvEXT;\ntypedef void (APIENTRYP pfn_glGetDoubleIndexedvEXT) (GLenum, GLuint, GLdouble*);\nextern pfn_glGetDoubleIndexedvEXT fp_glGetDoubleIndexedvEXT;\ntypedef void (APIENTRYP pfn_glGetPointerIndexedvEXT) (GLenum, GLuint, void**);\nextern pfn_glGetPointerIndexedvEXT fp_glGetPointerIndexedvEXT;\ntypedef void (APIENTRYP pfn_glEnableIndexedEXT) (GLenum, GLuint);\nextern pfn_glEnableIndexedEXT fp_glEnableIndexedEXT;\ntypedef void (APIENTRYP pfn_glDisableIndexedEXT) (GLenum, GLuint);\nextern pfn_glDisableIndexedEXT fp_glDisableIndexedEXT;\ntypedef GLboolean (APIENTRYP pfn_glIsEnabledIndexedEXT) (GLenum, GLuint);\nextern pfn_glIsEnabledIndexedEXT fp_glIsEnabledIndexedEXT;\ntypedef void (APIENTRYP pfn_glGetIntegerIndexedvEXT) (GLenum, GLuint, GLint*);\nextern pfn_glGetIntegerIndexedvEXT fp_glGetIntegerIndexedvEXT;\ntypedef void (APIENTRYP pfn_glGetBooleanIndexedvEXT) (GLenum, GLuint, GLboolean*);\nextern pfn_glGetBooleanIndexedvEXT fp_glGetBooleanIndexedvEXT;\ntypedef void (APIENTRYP pfn_glCompressedTextureImage3DEXT) (GLuint, GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const void*);\nextern pfn_glCompressedTextureImage3DEXT fp_glCompressedTextureImage3DEXT;\ntypedef void (APIENTRYP pfn_glCompressedTextureImage2DEXT) (GLuint, GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const void*);\nextern pfn_glCompressedTextureImage2DEXT fp_glCompressedTextureImage2DEXT;\ntypedef void (APIENTRYP pfn_glCompressedTextureImage1DEXT) (GLuint, GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const void*);\nextern pfn_glCompressedTextureImage1DEXT fp_glCompressedTextureImage1DEXT;\ntypedef void (APIENTRYP pfn_glCompressedTextureSubImage3DEXT) (GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const void*);\nextern pfn_glCompressedTextureSubImage3DEXT fp_glCompressedTextureSubImage3DEXT;\ntypedef void (APIENTRYP pfn_glCompressedTextureSubImage2DEXT) (GLuint, GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const void*);\nextern pfn_glCompressedTextureSubImage2DEXT fp_glCompressedTextureSubImage2DEXT;\ntypedef void (APIENTRYP pfn_glCompressedTextureSubImage1DEXT) (GLuint, GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const void*);\nextern pfn_glCompressedTextureSubImage1DEXT fp_glCompressedTextureSubImage1DEXT;\ntypedef void (APIENTRYP pfn_glGetCompressedTextureImageEXT) (GLuint, GLenum, GLint, void*);\nextern pfn_glGetCompressedTextureImageEXT fp_glGetCompressedTextureImageEXT;\ntypedef void (APIENTRYP pfn_glCompressedMultiTexImage3DEXT) (GLenum, GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const void*);\nextern pfn_glCompressedMultiTexImage3DEXT fp_glCompressedMultiTexImage3DEXT;\ntypedef void (APIENTRYP pfn_glCompressedMultiTexImage2DEXT) (GLenum, GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const void*);\nextern pfn_glCompressedMultiTexImage2DEXT fp_glCompressedMultiTexImage2DEXT;\ntypedef void (APIENTRYP pfn_glCompressedMultiTexImage1DEXT) (GLenum, GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const void*);\nextern pfn_glCompressedMultiTexImage1DEXT fp_glCompressedMultiTexImage1DEXT;\ntypedef void (APIENTRYP pfn_glCompressedMultiTexSubImage3DEXT) (GLenum, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const void*);\nextern pfn_glCompressedMultiTexSubImage3DEXT fp_glCompressedMultiTexSubImage3DEXT;\ntypedef void (APIENTRYP pfn_glCompressedMultiTexSubImage2DEXT) (GLenum, GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const void*);\nextern pfn_glCompressedMultiTexSubImage2DEXT fp_glCompressedMultiTexSubImage2DEXT;\ntypedef void (APIENTRYP pfn_glCompressedMultiTexSubImage1DEXT) (GLenum, GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const void*);\nextern pfn_glCompressedMultiTexSubImage1DEXT fp_glCompressedMultiTexSubImage1DEXT;\ntypedef void (APIENTRYP pfn_glGetCompressedMultiTexImageEXT) (GLenum, GLenum, GLint, void*);\nextern pfn_glGetCompressedMultiTexImageEXT fp_glGetCompressedMultiTexImageEXT;\ntypedef void (APIENTRYP pfn_glMatrixLoadTransposefEXT) (GLenum, const GLfloat*);\nextern pfn_glMatrixLoadTransposefEXT fp_glMatrixLoadTransposefEXT;\ntypedef void (APIENTRYP pfn_glMatrixLoadTransposedEXT) (GLenum, const GLdouble*);\nextern pfn_glMatrixLoadTransposedEXT fp_glMatrixLoadTransposedEXT;\ntypedef void (APIENTRYP pfn_glMatrixMultTransposefEXT) (GLenum, const GLfloat*);\nextern pfn_glMatrixMultTransposefEXT fp_glMatrixMultTransposefEXT;\ntypedef void (APIENTRYP pfn_glMatrixMultTransposedEXT) (GLenum, const GLdouble*);\nextern pfn_glMatrixMultTransposedEXT fp_glMatrixMultTransposedEXT;\ntypedef void (APIENTRYP pfn_glNamedBufferDataEXT) (GLuint, GLsizeiptr, const void*, GLenum);\nextern pfn_glNamedBufferDataEXT fp_glNamedBufferDataEXT;\ntypedef void (APIENTRYP pfn_glNamedBufferSubDataEXT) (GLuint, GLintptr, GLsizeiptr, const void*);\nextern pfn_glNamedBufferSubDataEXT fp_glNamedBufferSubDataEXT;\ntypedef void* (APIENTRYP pfn_glMapNamedBufferEXT) (GLuint, GLenum);\nextern pfn_glMapNamedBufferEXT fp_glMapNamedBufferEXT;\ntypedef GLboolean (APIENTRYP pfn_glUnmapNamedBufferEXT) (GLuint);\nextern pfn_glUnmapNamedBufferEXT fp_glUnmapNamedBufferEXT;\ntypedef void (APIENTRYP pfn_glGetNamedBufferParameterivEXT) (GLuint, GLenum, GLint*);\nextern pfn_glGetNamedBufferParameterivEXT fp_glGetNamedBufferParameterivEXT;\ntypedef void (APIENTRYP pfn_glGetNamedBufferPointervEXT) (GLuint, GLenum, void**);\nextern pfn_glGetNamedBufferPointervEXT fp_glGetNamedBufferPointervEXT;\ntypedef void (APIENTRYP pfn_glGetNamedBufferSubDataEXT) (GLuint, GLintptr, GLsizeiptr, void*);\nextern pfn_glGetNamedBufferSubDataEXT fp_glGetNamedBufferSubDataEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform1fEXT) (GLuint, GLint, GLfloat);\nextern pfn_glProgramUniform1fEXT fp_glProgramUniform1fEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform2fEXT) (GLuint, GLint, GLfloat, GLfloat);\nextern pfn_glProgramUniform2fEXT fp_glProgramUniform2fEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform3fEXT) (GLuint, GLint, GLfloat, GLfloat, GLfloat);\nextern pfn_glProgramUniform3fEXT fp_glProgramUniform3fEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform4fEXT) (GLuint, GLint, GLfloat, GLfloat, GLfloat, GLfloat);\nextern pfn_glProgramUniform4fEXT fp_glProgramUniform4fEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform1iEXT) (GLuint, GLint, GLint);\nextern pfn_glProgramUniform1iEXT fp_glProgramUniform1iEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform2iEXT) (GLuint, GLint, GLint, GLint);\nextern pfn_glProgramUniform2iEXT fp_glProgramUniform2iEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform3iEXT) (GLuint, GLint, GLint, GLint, GLint);\nextern pfn_glProgramUniform3iEXT fp_glProgramUniform3iEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform4iEXT) (GLuint, GLint, GLint, GLint, GLint, GLint);\nextern pfn_glProgramUniform4iEXT fp_glProgramUniform4iEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform1fvEXT) (GLuint, GLint, GLsizei, const GLfloat*);\nextern pfn_glProgramUniform1fvEXT fp_glProgramUniform1fvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform2fvEXT) (GLuint, GLint, GLsizei, const GLfloat*);\nextern pfn_glProgramUniform2fvEXT fp_glProgramUniform2fvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform3fvEXT) (GLuint, GLint, GLsizei, const GLfloat*);\nextern pfn_glProgramUniform3fvEXT fp_glProgramUniform3fvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform4fvEXT) (GLuint, GLint, GLsizei, const GLfloat*);\nextern pfn_glProgramUniform4fvEXT fp_glProgramUniform4fvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform1ivEXT) (GLuint, GLint, GLsizei, const GLint*);\nextern pfn_glProgramUniform1ivEXT fp_glProgramUniform1ivEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform2ivEXT) (GLuint, GLint, GLsizei, const GLint*);\nextern pfn_glProgramUniform2ivEXT fp_glProgramUniform2ivEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform3ivEXT) (GLuint, GLint, GLsizei, const GLint*);\nextern pfn_glProgramUniform3ivEXT fp_glProgramUniform3ivEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform4ivEXT) (GLuint, GLint, GLsizei, const GLint*);\nextern pfn_glProgramUniform4ivEXT fp_glProgramUniform4ivEXT;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix2fvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glProgramUniformMatrix2fvEXT fp_glProgramUniformMatrix2fvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix3fvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glProgramUniformMatrix3fvEXT fp_glProgramUniformMatrix3fvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix4fvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glProgramUniformMatrix4fvEXT fp_glProgramUniformMatrix4fvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix2x3fvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glProgramUniformMatrix2x3fvEXT fp_glProgramUniformMatrix2x3fvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix3x2fvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glProgramUniformMatrix3x2fvEXT fp_glProgramUniformMatrix3x2fvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix2x4fvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glProgramUniformMatrix2x4fvEXT fp_glProgramUniformMatrix2x4fvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix4x2fvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glProgramUniformMatrix4x2fvEXT fp_glProgramUniformMatrix4x2fvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix3x4fvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glProgramUniformMatrix3x4fvEXT fp_glProgramUniformMatrix3x4fvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix4x3fvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glProgramUniformMatrix4x3fvEXT fp_glProgramUniformMatrix4x3fvEXT;\ntypedef void (APIENTRYP pfn_glTextureBufferEXT) (GLuint, GLenum, GLenum, GLuint);\nextern pfn_glTextureBufferEXT fp_glTextureBufferEXT;\ntypedef void (APIENTRYP pfn_glMultiTexBufferEXT) (GLenum, GLenum, GLenum, GLuint);\nextern pfn_glMultiTexBufferEXT fp_glMultiTexBufferEXT;\ntypedef void (APIENTRYP pfn_glTextureParameterIivEXT) (GLuint, GLenum, GLenum, const GLint*);\nextern pfn_glTextureParameterIivEXT fp_glTextureParameterIivEXT;\ntypedef void (APIENTRYP pfn_glTextureParameterIuivEXT) (GLuint, GLenum, GLenum, const GLuint*);\nextern pfn_glTextureParameterIuivEXT fp_glTextureParameterIuivEXT;\ntypedef void (APIENTRYP pfn_glGetTextureParameterIivEXT) (GLuint, GLenum, GLenum, GLint*);\nextern pfn_glGetTextureParameterIivEXT fp_glGetTextureParameterIivEXT;\ntypedef void (APIENTRYP pfn_glGetTextureParameterIuivEXT) (GLuint, GLenum, GLenum, GLuint*);\nextern pfn_glGetTextureParameterIuivEXT fp_glGetTextureParameterIuivEXT;\ntypedef void (APIENTRYP pfn_glMultiTexParameterIivEXT) (GLenum, GLenum, GLenum, const GLint*);\nextern pfn_glMultiTexParameterIivEXT fp_glMultiTexParameterIivEXT;\ntypedef void (APIENTRYP pfn_glMultiTexParameterIuivEXT) (GLenum, GLenum, GLenum, const GLuint*);\nextern pfn_glMultiTexParameterIuivEXT fp_glMultiTexParameterIuivEXT;\ntypedef void (APIENTRYP pfn_glGetMultiTexParameterIivEXT) (GLenum, GLenum, GLenum, GLint*);\nextern pfn_glGetMultiTexParameterIivEXT fp_glGetMultiTexParameterIivEXT;\ntypedef void (APIENTRYP pfn_glGetMultiTexParameterIuivEXT) (GLenum, GLenum, GLenum, GLuint*);\nextern pfn_glGetMultiTexParameterIuivEXT fp_glGetMultiTexParameterIuivEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform1uiEXT) (GLuint, GLint, GLuint);\nextern pfn_glProgramUniform1uiEXT fp_glProgramUniform1uiEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform2uiEXT) (GLuint, GLint, GLuint, GLuint);\nextern pfn_glProgramUniform2uiEXT fp_glProgramUniform2uiEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform3uiEXT) (GLuint, GLint, GLuint, GLuint, GLuint);\nextern pfn_glProgramUniform3uiEXT fp_glProgramUniform3uiEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform4uiEXT) (GLuint, GLint, GLuint, GLuint, GLuint, GLuint);\nextern pfn_glProgramUniform4uiEXT fp_glProgramUniform4uiEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform1uivEXT) (GLuint, GLint, GLsizei, const GLuint*);\nextern pfn_glProgramUniform1uivEXT fp_glProgramUniform1uivEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform2uivEXT) (GLuint, GLint, GLsizei, const GLuint*);\nextern pfn_glProgramUniform2uivEXT fp_glProgramUniform2uivEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform3uivEXT) (GLuint, GLint, GLsizei, const GLuint*);\nextern pfn_glProgramUniform3uivEXT fp_glProgramUniform3uivEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform4uivEXT) (GLuint, GLint, GLsizei, const GLuint*);\nextern pfn_glProgramUniform4uivEXT fp_glProgramUniform4uivEXT;\ntypedef void (APIENTRYP pfn_glNamedProgramLocalParameters4fvEXT) (GLuint, GLenum, GLuint, GLsizei, const GLfloat*);\nextern pfn_glNamedProgramLocalParameters4fvEXT fp_glNamedProgramLocalParameters4fvEXT;\ntypedef void (APIENTRYP pfn_glNamedProgramLocalParameterI4iEXT) (GLuint, GLenum, GLuint, GLint, GLint, GLint, GLint);\nextern pfn_glNamedProgramLocalParameterI4iEXT fp_glNamedProgramLocalParameterI4iEXT;\ntypedef void (APIENTRYP pfn_glNamedProgramLocalParameterI4ivEXT) (GLuint, GLenum, GLuint, const GLint*);\nextern pfn_glNamedProgramLocalParameterI4ivEXT fp_glNamedProgramLocalParameterI4ivEXT;\ntypedef void (APIENTRYP pfn_glNamedProgramLocalParametersI4ivEXT) (GLuint, GLenum, GLuint, GLsizei, const GLint*);\nextern pfn_glNamedProgramLocalParametersI4ivEXT fp_glNamedProgramLocalParametersI4ivEXT;\ntypedef void (APIENTRYP pfn_glNamedProgramLocalParameterI4uiEXT) (GLuint, GLenum, GLuint, GLuint, GLuint, GLuint, GLuint);\nextern pfn_glNamedProgramLocalParameterI4uiEXT fp_glNamedProgramLocalParameterI4uiEXT;\ntypedef void (APIENTRYP pfn_glNamedProgramLocalParameterI4uivEXT) (GLuint, GLenum, GLuint, const GLuint*);\nextern pfn_glNamedProgramLocalParameterI4uivEXT fp_glNamedProgramLocalParameterI4uivEXT;\ntypedef void (APIENTRYP pfn_glNamedProgramLocalParametersI4uivEXT) (GLuint, GLenum, GLuint, GLsizei, const GLuint*);\nextern pfn_glNamedProgramLocalParametersI4uivEXT fp_glNamedProgramLocalParametersI4uivEXT;\ntypedef void (APIENTRYP pfn_glGetNamedProgramLocalParameterIivEXT) (GLuint, GLenum, GLuint, GLint*);\nextern pfn_glGetNamedProgramLocalParameterIivEXT fp_glGetNamedProgramLocalParameterIivEXT;\ntypedef void (APIENTRYP pfn_glGetNamedProgramLocalParameterIuivEXT) (GLuint, GLenum, GLuint, GLuint*);\nextern pfn_glGetNamedProgramLocalParameterIuivEXT fp_glGetNamedProgramLocalParameterIuivEXT;\ntypedef void (APIENTRYP pfn_glEnableClientStateiEXT) (GLenum, GLuint);\nextern pfn_glEnableClientStateiEXT fp_glEnableClientStateiEXT;\ntypedef void (APIENTRYP pfn_glDisableClientStateiEXT) (GLenum, GLuint);\nextern pfn_glDisableClientStateiEXT fp_glDisableClientStateiEXT;\ntypedef void (APIENTRYP pfn_glGetFloati_vEXT) (GLenum, GLuint, GLfloat*);\nextern pfn_glGetFloati_vEXT fp_glGetFloati_vEXT;\ntypedef void (APIENTRYP pfn_glGetDoublei_vEXT) (GLenum, GLuint, GLdouble*);\nextern pfn_glGetDoublei_vEXT fp_glGetDoublei_vEXT;\ntypedef void (APIENTRYP pfn_glGetPointeri_vEXT) (GLenum, GLuint, void**);\nextern pfn_glGetPointeri_vEXT fp_glGetPointeri_vEXT;\ntypedef void (APIENTRYP pfn_glNamedProgramStringEXT) (GLuint, GLenum, GLenum, GLsizei, const void*);\nextern pfn_glNamedProgramStringEXT fp_glNamedProgramStringEXT;\ntypedef void (APIENTRYP pfn_glNamedProgramLocalParameter4dEXT) (GLuint, GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble);\nextern pfn_glNamedProgramLocalParameter4dEXT fp_glNamedProgramLocalParameter4dEXT;\ntypedef void (APIENTRYP pfn_glNamedProgramLocalParameter4dvEXT) (GLuint, GLenum, GLuint, const GLdouble*);\nextern pfn_glNamedProgramLocalParameter4dvEXT fp_glNamedProgramLocalParameter4dvEXT;\ntypedef void (APIENTRYP pfn_glNamedProgramLocalParameter4fEXT) (GLuint, GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat);\nextern pfn_glNamedProgramLocalParameter4fEXT fp_glNamedProgramLocalParameter4fEXT;\ntypedef void (APIENTRYP pfn_glNamedProgramLocalParameter4fvEXT) (GLuint, GLenum, GLuint, const GLfloat*);\nextern pfn_glNamedProgramLocalParameter4fvEXT fp_glNamedProgramLocalParameter4fvEXT;\ntypedef void (APIENTRYP pfn_glGetNamedProgramLocalParameterdvEXT) (GLuint, GLenum, GLuint, GLdouble*);\nextern pfn_glGetNamedProgramLocalParameterdvEXT fp_glGetNamedProgramLocalParameterdvEXT;\ntypedef void (APIENTRYP pfn_glGetNamedProgramLocalParameterfvEXT) (GLuint, GLenum, GLuint, GLfloat*);\nextern pfn_glGetNamedProgramLocalParameterfvEXT fp_glGetNamedProgramLocalParameterfvEXT;\ntypedef void (APIENTRYP pfn_glGetNamedProgramivEXT) (GLuint, GLenum, GLenum, GLint*);\nextern pfn_glGetNamedProgramivEXT fp_glGetNamedProgramivEXT;\ntypedef void (APIENTRYP pfn_glGetNamedProgramStringEXT) (GLuint, GLenum, GLenum, void*);\nextern pfn_glGetNamedProgramStringEXT fp_glGetNamedProgramStringEXT;\ntypedef void (APIENTRYP pfn_glNamedRenderbufferStorageEXT) (GLuint, GLenum, GLsizei, GLsizei);\nextern pfn_glNamedRenderbufferStorageEXT fp_glNamedRenderbufferStorageEXT;\ntypedef void (APIENTRYP pfn_glGetNamedRenderbufferParameterivEXT) (GLuint, GLenum, GLint*);\nextern pfn_glGetNamedRenderbufferParameterivEXT fp_glGetNamedRenderbufferParameterivEXT;\ntypedef void (APIENTRYP pfn_glNamedRenderbufferStorageMultisampleEXT) (GLuint, GLsizei, GLenum, GLsizei, GLsizei);\nextern pfn_glNamedRenderbufferStorageMultisampleEXT fp_glNamedRenderbufferStorageMultisampleEXT;\ntypedef void (APIENTRYP pfn_glNamedRenderbufferStorageMultisampleCoverageEXT) (GLuint, GLsizei, GLsizei, GLenum, GLsizei, GLsizei);\nextern pfn_glNamedRenderbufferStorageMultisampleCoverageEXT fp_glNamedRenderbufferStorageMultisampleCoverageEXT;\ntypedef GLenum (APIENTRYP pfn_glCheckNamedFramebufferStatusEXT) (GLuint, GLenum);\nextern pfn_glCheckNamedFramebufferStatusEXT fp_glCheckNamedFramebufferStatusEXT;\ntypedef void (APIENTRYP pfn_glNamedFramebufferTexture1DEXT) (GLuint, GLenum, GLenum, GLuint, GLint);\nextern pfn_glNamedFramebufferTexture1DEXT fp_glNamedFramebufferTexture1DEXT;\ntypedef void (APIENTRYP pfn_glNamedFramebufferTexture2DEXT) (GLuint, GLenum, GLenum, GLuint, GLint);\nextern pfn_glNamedFramebufferTexture2DEXT fp_glNamedFramebufferTexture2DEXT;\ntypedef void (APIENTRYP pfn_glNamedFramebufferTexture3DEXT) (GLuint, GLenum, GLenum, GLuint, GLint, GLint);\nextern pfn_glNamedFramebufferTexture3DEXT fp_glNamedFramebufferTexture3DEXT;\ntypedef void (APIENTRYP pfn_glNamedFramebufferRenderbufferEXT) (GLuint, GLenum, GLenum, GLuint);\nextern pfn_glNamedFramebufferRenderbufferEXT fp_glNamedFramebufferRenderbufferEXT;\ntypedef void (APIENTRYP pfn_glGetNamedFramebufferAttachmentParameterivEXT) (GLuint, GLenum, GLenum, GLint*);\nextern pfn_glGetNamedFramebufferAttachmentParameterivEXT fp_glGetNamedFramebufferAttachmentParameterivEXT;\ntypedef void (APIENTRYP pfn_glGenerateTextureMipmapEXT) (GLuint, GLenum);\nextern pfn_glGenerateTextureMipmapEXT fp_glGenerateTextureMipmapEXT;\ntypedef void (APIENTRYP pfn_glGenerateMultiTexMipmapEXT) (GLenum, GLenum);\nextern pfn_glGenerateMultiTexMipmapEXT fp_glGenerateMultiTexMipmapEXT;\ntypedef void (APIENTRYP pfn_glFramebufferDrawBufferEXT) (GLuint, GLenum);\nextern pfn_glFramebufferDrawBufferEXT fp_glFramebufferDrawBufferEXT;\ntypedef void (APIENTRYP pfn_glFramebufferDrawBuffersEXT) (GLuint, GLsizei, const GLenum*);\nextern pfn_glFramebufferDrawBuffersEXT fp_glFramebufferDrawBuffersEXT;\ntypedef void (APIENTRYP pfn_glFramebufferReadBufferEXT) (GLuint, GLenum);\nextern pfn_glFramebufferReadBufferEXT fp_glFramebufferReadBufferEXT;\ntypedef void (APIENTRYP pfn_glGetFramebufferParameterivEXT) (GLuint, GLenum, GLint*);\nextern pfn_glGetFramebufferParameterivEXT fp_glGetFramebufferParameterivEXT;\ntypedef void (APIENTRYP pfn_glNamedCopyBufferSubDataEXT) (GLuint, GLuint, GLintptr, GLintptr, GLsizeiptr);\nextern pfn_glNamedCopyBufferSubDataEXT fp_glNamedCopyBufferSubDataEXT;\ntypedef void (APIENTRYP pfn_glNamedFramebufferTextureEXT) (GLuint, GLenum, GLuint, GLint);\nextern pfn_glNamedFramebufferTextureEXT fp_glNamedFramebufferTextureEXT;\ntypedef void (APIENTRYP pfn_glNamedFramebufferTextureLayerEXT) (GLuint, GLenum, GLuint, GLint, GLint);\nextern pfn_glNamedFramebufferTextureLayerEXT fp_glNamedFramebufferTextureLayerEXT;\ntypedef void (APIENTRYP pfn_glNamedFramebufferTextureFaceEXT) (GLuint, GLenum, GLuint, GLint, GLenum);\nextern pfn_glNamedFramebufferTextureFaceEXT fp_glNamedFramebufferTextureFaceEXT;\ntypedef void (APIENTRYP pfn_glTextureRenderbufferEXT) (GLuint, GLenum, GLuint);\nextern pfn_glTextureRenderbufferEXT fp_glTextureRenderbufferEXT;\ntypedef void (APIENTRYP pfn_glMultiTexRenderbufferEXT) (GLenum, GLenum, GLuint);\nextern pfn_glMultiTexRenderbufferEXT fp_glMultiTexRenderbufferEXT;\ntypedef void (APIENTRYP pfn_glVertexArrayVertexOffsetEXT) (GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr);\nextern pfn_glVertexArrayVertexOffsetEXT fp_glVertexArrayVertexOffsetEXT;\ntypedef void (APIENTRYP pfn_glVertexArrayColorOffsetEXT) (GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr);\nextern pfn_glVertexArrayColorOffsetEXT fp_glVertexArrayColorOffsetEXT;\ntypedef void (APIENTRYP pfn_glVertexArrayEdgeFlagOffsetEXT) (GLuint, GLuint, GLsizei, GLintptr);\nextern pfn_glVertexArrayEdgeFlagOffsetEXT fp_glVertexArrayEdgeFlagOffsetEXT;\ntypedef void (APIENTRYP pfn_glVertexArrayIndexOffsetEXT) (GLuint, GLuint, GLenum, GLsizei, GLintptr);\nextern pfn_glVertexArrayIndexOffsetEXT fp_glVertexArrayIndexOffsetEXT;\ntypedef void (APIENTRYP pfn_glVertexArrayNormalOffsetEXT) (GLuint, GLuint, GLenum, GLsizei, GLintptr);\nextern pfn_glVertexArrayNormalOffsetEXT fp_glVertexArrayNormalOffsetEXT;\ntypedef void (APIENTRYP pfn_glVertexArrayTexCoordOffsetEXT) (GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr);\nextern pfn_glVertexArrayTexCoordOffsetEXT fp_glVertexArrayTexCoordOffsetEXT;\ntypedef void (APIENTRYP pfn_glVertexArrayMultiTexCoordOffsetEXT) (GLuint, GLuint, GLenum, GLint, GLenum, GLsizei, GLintptr);\nextern pfn_glVertexArrayMultiTexCoordOffsetEXT fp_glVertexArrayMultiTexCoordOffsetEXT;\ntypedef void (APIENTRYP pfn_glVertexArrayFogCoordOffsetEXT) (GLuint, GLuint, GLenum, GLsizei, GLintptr);\nextern pfn_glVertexArrayFogCoordOffsetEXT fp_glVertexArrayFogCoordOffsetEXT;\ntypedef void (APIENTRYP pfn_glVertexArraySecondaryColorOffsetEXT) (GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr);\nextern pfn_glVertexArraySecondaryColorOffsetEXT fp_glVertexArraySecondaryColorOffsetEXT;\ntypedef void (APIENTRYP pfn_glVertexArrayVertexAttribOffsetEXT) (GLuint, GLuint, GLuint, GLint, GLenum, GLboolean, GLsizei, GLintptr);\nextern pfn_glVertexArrayVertexAttribOffsetEXT fp_glVertexArrayVertexAttribOffsetEXT;\ntypedef void (APIENTRYP pfn_glVertexArrayVertexAttribIOffsetEXT) (GLuint, GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr);\nextern pfn_glVertexArrayVertexAttribIOffsetEXT fp_glVertexArrayVertexAttribIOffsetEXT;\ntypedef void (APIENTRYP pfn_glEnableVertexArrayEXT) (GLuint, GLenum);\nextern pfn_glEnableVertexArrayEXT fp_glEnableVertexArrayEXT;\ntypedef void (APIENTRYP pfn_glDisableVertexArrayEXT) (GLuint, GLenum);\nextern pfn_glDisableVertexArrayEXT fp_glDisableVertexArrayEXT;\ntypedef void (APIENTRYP pfn_glEnableVertexArrayAttribEXT) (GLuint, GLuint);\nextern pfn_glEnableVertexArrayAttribEXT fp_glEnableVertexArrayAttribEXT;\ntypedef void (APIENTRYP pfn_glDisableVertexArrayAttribEXT) (GLuint, GLuint);\nextern pfn_glDisableVertexArrayAttribEXT fp_glDisableVertexArrayAttribEXT;\ntypedef void (APIENTRYP pfn_glGetVertexArrayIntegervEXT) (GLuint, GLenum, GLint*);\nextern pfn_glGetVertexArrayIntegervEXT fp_glGetVertexArrayIntegervEXT;\ntypedef void (APIENTRYP pfn_glGetVertexArrayPointervEXT) (GLuint, GLenum, void**);\nextern pfn_glGetVertexArrayPointervEXT fp_glGetVertexArrayPointervEXT;\ntypedef void (APIENTRYP pfn_glGetVertexArrayIntegeri_vEXT) (GLuint, GLuint, GLenum, GLint*);\nextern pfn_glGetVertexArrayIntegeri_vEXT fp_glGetVertexArrayIntegeri_vEXT;\ntypedef void (APIENTRYP pfn_glGetVertexArrayPointeri_vEXT) (GLuint, GLuint, GLenum, void**);\nextern pfn_glGetVertexArrayPointeri_vEXT fp_glGetVertexArrayPointeri_vEXT;\ntypedef void* (APIENTRYP pfn_glMapNamedBufferRangeEXT) (GLuint, GLintptr, GLsizeiptr, GLbitfield);\nextern pfn_glMapNamedBufferRangeEXT fp_glMapNamedBufferRangeEXT;\ntypedef void (APIENTRYP pfn_glFlushMappedNamedBufferRangeEXT) (GLuint, GLintptr, GLsizeiptr);\nextern pfn_glFlushMappedNamedBufferRangeEXT fp_glFlushMappedNamedBufferRangeEXT;\ntypedef void (APIENTRYP pfn_glNamedBufferStorageEXT) (GLuint, GLsizeiptr, const void*, GLbitfield);\nextern pfn_glNamedBufferStorageEXT fp_glNamedBufferStorageEXT;\ntypedef void (APIENTRYP pfn_glClearNamedBufferDataEXT) (GLuint, GLenum, GLenum, GLenum, const void*);\nextern pfn_glClearNamedBufferDataEXT fp_glClearNamedBufferDataEXT;\ntypedef void (APIENTRYP pfn_glClearNamedBufferSubDataEXT) (GLuint, GLenum, GLsizeiptr, GLsizeiptr, GLenum, GLenum, const void*);\nextern pfn_glClearNamedBufferSubDataEXT fp_glClearNamedBufferSubDataEXT;\ntypedef void (APIENTRYP pfn_glNamedFramebufferParameteriEXT) (GLuint, GLenum, GLint);\nextern pfn_glNamedFramebufferParameteriEXT fp_glNamedFramebufferParameteriEXT;\ntypedef void (APIENTRYP pfn_glGetNamedFramebufferParameterivEXT) (GLuint, GLenum, GLint*);\nextern pfn_glGetNamedFramebufferParameterivEXT fp_glGetNamedFramebufferParameterivEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform1dEXT) (GLuint, GLint, GLdouble);\nextern pfn_glProgramUniform1dEXT fp_glProgramUniform1dEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform2dEXT) (GLuint, GLint, GLdouble, GLdouble);\nextern pfn_glProgramUniform2dEXT fp_glProgramUniform2dEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform3dEXT) (GLuint, GLint, GLdouble, GLdouble, GLdouble);\nextern pfn_glProgramUniform3dEXT fp_glProgramUniform3dEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform4dEXT) (GLuint, GLint, GLdouble, GLdouble, GLdouble, GLdouble);\nextern pfn_glProgramUniform4dEXT fp_glProgramUniform4dEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform1dvEXT) (GLuint, GLint, GLsizei, const GLdouble*);\nextern pfn_glProgramUniform1dvEXT fp_glProgramUniform1dvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform2dvEXT) (GLuint, GLint, GLsizei, const GLdouble*);\nextern pfn_glProgramUniform2dvEXT fp_glProgramUniform2dvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform3dvEXT) (GLuint, GLint, GLsizei, const GLdouble*);\nextern pfn_glProgramUniform3dvEXT fp_glProgramUniform3dvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniform4dvEXT) (GLuint, GLint, GLsizei, const GLdouble*);\nextern pfn_glProgramUniform4dvEXT fp_glProgramUniform4dvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix2dvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glProgramUniformMatrix2dvEXT fp_glProgramUniformMatrix2dvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix3dvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glProgramUniformMatrix3dvEXT fp_glProgramUniformMatrix3dvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix4dvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glProgramUniformMatrix4dvEXT fp_glProgramUniformMatrix4dvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix2x3dvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glProgramUniformMatrix2x3dvEXT fp_glProgramUniformMatrix2x3dvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix2x4dvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glProgramUniformMatrix2x4dvEXT fp_glProgramUniformMatrix2x4dvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix3x2dvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glProgramUniformMatrix3x2dvEXT fp_glProgramUniformMatrix3x2dvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix3x4dvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glProgramUniformMatrix3x4dvEXT fp_glProgramUniformMatrix3x4dvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix4x2dvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glProgramUniformMatrix4x2dvEXT fp_glProgramUniformMatrix4x2dvEXT;\ntypedef void (APIENTRYP pfn_glProgramUniformMatrix4x3dvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*);\nextern pfn_glProgramUniformMatrix4x3dvEXT fp_glProgramUniformMatrix4x3dvEXT;\ntypedef void (APIENTRYP pfn_glTextureBufferRangeEXT) (GLuint, GLenum, GLenum, GLuint, GLintptr, GLsizeiptr);\nextern pfn_glTextureBufferRangeEXT fp_glTextureBufferRangeEXT;\ntypedef void (APIENTRYP pfn_glTextureStorage1DEXT) (GLuint, GLenum, GLsizei, GLenum, GLsizei);\nextern pfn_glTextureStorage1DEXT fp_glTextureStorage1DEXT;\ntypedef void (APIENTRYP pfn_glTextureStorage2DEXT) (GLuint, GLenum, GLsizei, GLenum, GLsizei, GLsizei);\nextern pfn_glTextureStorage2DEXT fp_glTextureStorage2DEXT;\ntypedef void (APIENTRYP pfn_glTextureStorage3DEXT) (GLuint, GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei);\nextern pfn_glTextureStorage3DEXT fp_glTextureStorage3DEXT;\ntypedef void (APIENTRYP pfn_glTextureStorage2DMultisampleEXT) (GLuint, GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLboolean);\nextern pfn_glTextureStorage2DMultisampleEXT fp_glTextureStorage2DMultisampleEXT;\ntypedef void (APIENTRYP pfn_glTextureStorage3DMultisampleEXT) (GLuint, GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei, GLboolean);\nextern pfn_glTextureStorage3DMultisampleEXT fp_glTextureStorage3DMultisampleEXT;\ntypedef void (APIENTRYP pfn_glVertexArrayBindVertexBufferEXT) (GLuint, GLuint, GLuint, GLintptr, GLsizei);\nextern pfn_glVertexArrayBindVertexBufferEXT fp_glVertexArrayBindVertexBufferEXT;\ntypedef void (APIENTRYP pfn_glVertexArrayVertexAttribFormatEXT) (GLuint, GLuint, GLint, GLenum, GLboolean, GLuint);\nextern pfn_glVertexArrayVertexAttribFormatEXT fp_glVertexArrayVertexAttribFormatEXT;\ntypedef void (APIENTRYP pfn_glVertexArrayVertexAttribIFormatEXT) (GLuint, GLuint, GLint, GLenum, GLuint);\nextern pfn_glVertexArrayVertexAttribIFormatEXT fp_glVertexArrayVertexAttribIFormatEXT;\ntypedef void (APIENTRYP pfn_glVertexArrayVertexAttribLFormatEXT) (GLuint, GLuint, GLint, GLenum, GLuint);\nextern pfn_glVertexArrayVertexAttribLFormatEXT fp_glVertexArrayVertexAttribLFormatEXT;\ntypedef void (APIENTRYP pfn_glVertexArrayVertexAttribBindingEXT) (GLuint, GLuint, GLuint);\nextern pfn_glVertexArrayVertexAttribBindingEXT fp_glVertexArrayVertexAttribBindingEXT;\ntypedef void (APIENTRYP pfn_glVertexArrayVertexBindingDivisorEXT) (GLuint, GLuint, GLuint);\nextern pfn_glVertexArrayVertexBindingDivisorEXT fp_glVertexArrayVertexBindingDivisorEXT;\ntypedef void (APIENTRYP pfn_glVertexArrayVertexAttribLOffsetEXT) (GLuint, GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr);\nextern pfn_glVertexArrayVertexAttribLOffsetEXT fp_glVertexArrayVertexAttribLOffsetEXT;\ntypedef void (APIENTRYP pfn_glTexturePageCommitmentEXT) (GLuint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLboolean);\nextern pfn_glTexturePageCommitmentEXT fp_glTexturePageCommitmentEXT;\ntypedef void (APIENTRYP pfn_glVertexArrayVertexAttribDivisorEXT) (GLuint, GLuint, GLuint);\nextern pfn_glVertexArrayVertexAttribDivisorEXT fp_glVertexArrayVertexAttribDivisorEXT;\n\n /* GL_EXT_discard_framebuffer */\nextern GLboolean GLAD_EXT_discard_framebuffer;\n#define GL_COLOR_EXT                           0x1800\n#define GL_DEPTH_EXT                           0x1801\n#define GL_STENCIL_EXT                         0x1802\ntypedef void (APIENTRYP pfn_glDiscardFramebufferEXT) (GLenum, GLsizei, const GLenum*);\nextern pfn_glDiscardFramebufferEXT fp_glDiscardFramebufferEXT;\n\n /* GL_EXT_disjoint_timer_query */\nextern GLboolean GLAD_EXT_disjoint_timer_query;\n#define GL_QUERY_COUNTER_BITS_EXT              0x8864\n#define GL_CURRENT_QUERY_EXT                   0x8865\n#define GL_QUERY_RESULT_EXT                    0x8866\n#define GL_QUERY_RESULT_AVAILABLE_EXT          0x8867\n#define GL_TIME_ELAPSED_EXT                    0x88BF\n#define GL_TIMESTAMP_EXT                       0x8E28\n#define GL_GPU_DISJOINT_EXT                    0x8FBB\ntypedef void (APIENTRYP pfn_glGenQueriesEXT) (GLsizei, GLuint*);\nextern pfn_glGenQueriesEXT fp_glGenQueriesEXT;\ntypedef void (APIENTRYP pfn_glDeleteQueriesEXT) (GLsizei, const GLuint*);\nextern pfn_glDeleteQueriesEXT fp_glDeleteQueriesEXT;\ntypedef GLboolean (APIENTRYP pfn_glIsQueryEXT) (GLuint);\nextern pfn_glIsQueryEXT fp_glIsQueryEXT;\ntypedef void (APIENTRYP pfn_glBeginQueryEXT) (GLenum, GLuint);\nextern pfn_glBeginQueryEXT fp_glBeginQueryEXT;\ntypedef void (APIENTRYP pfn_glEndQueryEXT) (GLenum);\nextern pfn_glEndQueryEXT fp_glEndQueryEXT;\ntypedef void (APIENTRYP pfn_glQueryCounterEXT) (GLuint, GLenum);\nextern pfn_glQueryCounterEXT fp_glQueryCounterEXT;\ntypedef void (APIENTRYP pfn_glGetQueryivEXT) (GLenum, GLenum, GLint*);\nextern pfn_glGetQueryivEXT fp_glGetQueryivEXT;\ntypedef void (APIENTRYP pfn_glGetQueryObjectivEXT) (GLuint, GLenum, GLint*);\nextern pfn_glGetQueryObjectivEXT fp_glGetQueryObjectivEXT;\ntypedef void (APIENTRYP pfn_glGetQueryObjectuivEXT) (GLuint, GLenum, GLuint*);\nextern pfn_glGetQueryObjectuivEXT fp_glGetQueryObjectuivEXT;\ntypedef void (APIENTRYP pfn_glGetQueryObjecti64vEXT) (GLuint, GLenum, GLint64*);\nextern pfn_glGetQueryObjecti64vEXT fp_glGetQueryObjecti64vEXT;\ntypedef void (APIENTRYP pfn_glGetQueryObjectui64vEXT) (GLuint, GLenum, GLuint64*);\nextern pfn_glGetQueryObjectui64vEXT fp_glGetQueryObjectui64vEXT;\n\n /* GL_EXT_draw_buffers */\nextern GLboolean GLAD_EXT_draw_buffers;\n#define GL_MAX_COLOR_ATTACHMENTS_EXT           0x8CDF\n#define GL_MAX_DRAW_BUFFERS_EXT                0x8824\n#define GL_DRAW_BUFFER0_EXT                    0x8825\n#define GL_DRAW_BUFFER1_EXT                    0x8826\n#define GL_DRAW_BUFFER2_EXT                    0x8827\n#define GL_DRAW_BUFFER3_EXT                    0x8828\n#define GL_DRAW_BUFFER4_EXT                    0x8829\n#define GL_DRAW_BUFFER5_EXT                    0x882A\n#define GL_DRAW_BUFFER6_EXT                    0x882B\n#define GL_DRAW_BUFFER7_EXT                    0x882C\n#define GL_DRAW_BUFFER8_EXT                    0x882D\n#define GL_DRAW_BUFFER9_EXT                    0x882E\n#define GL_DRAW_BUFFER10_EXT                   0x882F\n#define GL_DRAW_BUFFER11_EXT                   0x8830\n#define GL_DRAW_BUFFER12_EXT                   0x8831\n#define GL_DRAW_BUFFER13_EXT                   0x8832\n#define GL_DRAW_BUFFER14_EXT                   0x8833\n#define GL_DRAW_BUFFER15_EXT                   0x8834\n#define GL_COLOR_ATTACHMENT0_EXT               0x8CE0\n#define GL_COLOR_ATTACHMENT1_EXT               0x8CE1\n#define GL_COLOR_ATTACHMENT2_EXT               0x8CE2\n#define GL_COLOR_ATTACHMENT3_EXT               0x8CE3\n#define GL_COLOR_ATTACHMENT4_EXT               0x8CE4\n#define GL_COLOR_ATTACHMENT5_EXT               0x8CE5\n#define GL_COLOR_ATTACHMENT6_EXT               0x8CE6\n#define GL_COLOR_ATTACHMENT7_EXT               0x8CE7\n#define GL_COLOR_ATTACHMENT8_EXT               0x8CE8\n#define GL_COLOR_ATTACHMENT9_EXT               0x8CE9\n#define GL_COLOR_ATTACHMENT10_EXT              0x8CEA\n#define GL_COLOR_ATTACHMENT11_EXT              0x8CEB\n#define GL_COLOR_ATTACHMENT12_EXT              0x8CEC\n#define GL_COLOR_ATTACHMENT13_EXT              0x8CED\n#define GL_COLOR_ATTACHMENT14_EXT              0x8CEE\n#define GL_COLOR_ATTACHMENT15_EXT              0x8CEF\ntypedef void (APIENTRYP pfn_glDrawBuffersEXT) (GLsizei, const GLenum*);\nextern pfn_glDrawBuffersEXT fp_glDrawBuffersEXT;\n\n /* GL_EXT_draw_buffers2 */\nextern GLboolean GLAD_EXT_draw_buffers2;\ntypedef void (APIENTRYP pfn_glColorMaskIndexedEXT) (GLuint, GLboolean, GLboolean, GLboolean, GLboolean);\nextern pfn_glColorMaskIndexedEXT fp_glColorMaskIndexedEXT;\n\n /* GL_EXT_draw_buffers_indexed */\nextern GLboolean GLAD_EXT_draw_buffers_indexed;\ntypedef void (APIENTRYP pfn_glEnableiEXT) (GLenum, GLuint);\nextern pfn_glEnableiEXT fp_glEnableiEXT;\ntypedef void (APIENTRYP pfn_glDisableiEXT) (GLenum, GLuint);\nextern pfn_glDisableiEXT fp_glDisableiEXT;\ntypedef void (APIENTRYP pfn_glBlendEquationiEXT) (GLuint, GLenum);\nextern pfn_glBlendEquationiEXT fp_glBlendEquationiEXT;\ntypedef void (APIENTRYP pfn_glBlendEquationSeparateiEXT) (GLuint, GLenum, GLenum);\nextern pfn_glBlendEquationSeparateiEXT fp_glBlendEquationSeparateiEXT;\ntypedef void (APIENTRYP pfn_glBlendFunciEXT) (GLuint, GLenum, GLenum);\nextern pfn_glBlendFunciEXT fp_glBlendFunciEXT;\ntypedef void (APIENTRYP pfn_glBlendFuncSeparateiEXT) (GLuint, GLenum, GLenum, GLenum, GLenum);\nextern pfn_glBlendFuncSeparateiEXT fp_glBlendFuncSeparateiEXT;\ntypedef void (APIENTRYP pfn_glColorMaskiEXT) (GLuint, GLboolean, GLboolean, GLboolean, GLboolean);\nextern pfn_glColorMaskiEXT fp_glColorMaskiEXT;\ntypedef GLboolean (APIENTRYP pfn_glIsEnablediEXT) (GLenum, GLuint);\nextern pfn_glIsEnablediEXT fp_glIsEnablediEXT;\n\n /* GL_EXT_draw_elements_base_vertex */\nextern GLboolean GLAD_EXT_draw_elements_base_vertex;\ntypedef void (APIENTRYP pfn_glDrawElementsBaseVertexEXT) (GLenum, GLsizei, GLenum, const void*, GLint);\nextern pfn_glDrawElementsBaseVertexEXT fp_glDrawElementsBaseVertexEXT;\ntypedef void (APIENTRYP pfn_glDrawRangeElementsBaseVertexEXT) (GLenum, GLuint, GLuint, GLsizei, GLenum, const void*, GLint);\nextern pfn_glDrawRangeElementsBaseVertexEXT fp_glDrawRangeElementsBaseVertexEXT;\ntypedef void (APIENTRYP pfn_glDrawElementsInstancedBaseVertexEXT) (GLenum, GLsizei, GLenum, const void*, GLsizei, GLint);\nextern pfn_glDrawElementsInstancedBaseVertexEXT fp_glDrawElementsInstancedBaseVertexEXT;\ntypedef void (APIENTRYP pfn_glMultiDrawElementsBaseVertexEXT) (GLenum, const GLsizei*, GLenum, const void**, GLsizei, const GLint*);\nextern pfn_glMultiDrawElementsBaseVertexEXT fp_glMultiDrawElementsBaseVertexEXT;\n\n /* GL_EXT_draw_instanced */\nextern GLboolean GLAD_EXT_draw_instanced;\ntypedef void (APIENTRYP pfn_glDrawArraysInstancedEXT) (GLenum, GLint, GLsizei, GLsizei);\nextern pfn_glDrawArraysInstancedEXT fp_glDrawArraysInstancedEXT;\ntypedef void (APIENTRYP pfn_glDrawElementsInstancedEXT) (GLenum, GLsizei, GLenum, const void*, GLsizei);\nextern pfn_glDrawElementsInstancedEXT fp_glDrawElementsInstancedEXT;\n\n /* GL_EXT_float_blend */\nextern GLboolean GLAD_EXT_float_blend;\n\n /* GL_EXT_framebuffer_blit */\nextern GLboolean GLAD_EXT_framebuffer_blit;\n#define GL_READ_FRAMEBUFFER_EXT                0x8CA8\n#define GL_DRAW_FRAMEBUFFER_EXT                0x8CA9\n#define GL_DRAW_FRAMEBUFFER_BINDING_EXT        0x8CA6\n#define GL_READ_FRAMEBUFFER_BINDING_EXT        0x8CAA\ntypedef void (APIENTRYP pfn_glBlitFramebufferEXT) (GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum);\nextern pfn_glBlitFramebufferEXT fp_glBlitFramebufferEXT;\n\n /* GL_EXT_framebuffer_multisample */\nextern GLboolean GLAD_EXT_framebuffer_multisample;\n#define GL_RENDERBUFFER_SAMPLES_EXT            0x8CAB\n#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT  0x8D56\n#define GL_MAX_SAMPLES_EXT                     0x8D57\ntypedef void (APIENTRYP pfn_glRenderbufferStorageMultisampleEXT) (GLenum, GLsizei, GLenum, GLsizei, GLsizei);\nextern pfn_glRenderbufferStorageMultisampleEXT fp_glRenderbufferStorageMultisampleEXT;\n\n /* GL_EXT_framebuffer_multisample_blit_scaled */\nextern GLboolean GLAD_EXT_framebuffer_multisample_blit_scaled;\n#define GL_SCALED_RESOLVE_FASTEST_EXT          0x90BA\n#define GL_SCALED_RESOLVE_NICEST_EXT           0x90BB\n\n /* GL_EXT_framebuffer_object */\nextern GLboolean GLAD_EXT_framebuffer_object;\n#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT   0x0506\n#define GL_MAX_RENDERBUFFER_SIZE_EXT           0x84E8\n#define GL_FRAMEBUFFER_BINDING_EXT             0x8CA6\n#define GL_RENDERBUFFER_BINDING_EXT            0x8CA7\n#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT  0x8CD0\n#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT  0x8CD1\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT  0x8CD2\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT  0x8CD3\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT  0x8CD4\n#define GL_FRAMEBUFFER_COMPLETE_EXT            0x8CD5\n#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT  0x8CD6\n#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT  0x8CD7\n#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT  0x8CD9\n#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT  0x8CDA\n#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT  0x8CDB\n#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT  0x8CDC\n#define GL_FRAMEBUFFER_UNSUPPORTED_EXT         0x8CDD\n#define GL_DEPTH_ATTACHMENT_EXT                0x8D00\n#define GL_STENCIL_ATTACHMENT_EXT              0x8D20\n#define GL_FRAMEBUFFER_EXT                     0x8D40\n#define GL_RENDERBUFFER_EXT                    0x8D41\n#define GL_RENDERBUFFER_WIDTH_EXT              0x8D42\n#define GL_RENDERBUFFER_HEIGHT_EXT             0x8D43\n#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT    0x8D44\n#define GL_STENCIL_INDEX1_EXT                  0x8D46\n#define GL_STENCIL_INDEX4_EXT                  0x8D47\n#define GL_STENCIL_INDEX8_EXT                  0x8D48\n#define GL_STENCIL_INDEX16_EXT                 0x8D49\n#define GL_RENDERBUFFER_RED_SIZE_EXT           0x8D50\n#define GL_RENDERBUFFER_GREEN_SIZE_EXT         0x8D51\n#define GL_RENDERBUFFER_BLUE_SIZE_EXT          0x8D52\n#define GL_RENDERBUFFER_ALPHA_SIZE_EXT         0x8D53\n#define GL_RENDERBUFFER_DEPTH_SIZE_EXT         0x8D54\n#define GL_RENDERBUFFER_STENCIL_SIZE_EXT       0x8D55\ntypedef GLboolean (APIENTRYP pfn_glIsRenderbufferEXT) (GLuint);\nextern pfn_glIsRenderbufferEXT fp_glIsRenderbufferEXT;\ntypedef void (APIENTRYP pfn_glBindRenderbufferEXT) (GLenum, GLuint);\nextern pfn_glBindRenderbufferEXT fp_glBindRenderbufferEXT;\ntypedef void (APIENTRYP pfn_glDeleteRenderbuffersEXT) (GLsizei, const GLuint*);\nextern pfn_glDeleteRenderbuffersEXT fp_glDeleteRenderbuffersEXT;\ntypedef void (APIENTRYP pfn_glGenRenderbuffersEXT) (GLsizei, GLuint*);\nextern pfn_glGenRenderbuffersEXT fp_glGenRenderbuffersEXT;\ntypedef void (APIENTRYP pfn_glRenderbufferStorageEXT) (GLenum, GLenum, GLsizei, GLsizei);\nextern pfn_glRenderbufferStorageEXT fp_glRenderbufferStorageEXT;\ntypedef void (APIENTRYP pfn_glGetRenderbufferParameterivEXT) (GLenum, GLenum, GLint*);\nextern pfn_glGetRenderbufferParameterivEXT fp_glGetRenderbufferParameterivEXT;\ntypedef GLboolean (APIENTRYP pfn_glIsFramebufferEXT) (GLuint);\nextern pfn_glIsFramebufferEXT fp_glIsFramebufferEXT;\ntypedef void (APIENTRYP pfn_glBindFramebufferEXT) (GLenum, GLuint);\nextern pfn_glBindFramebufferEXT fp_glBindFramebufferEXT;\ntypedef void (APIENTRYP pfn_glDeleteFramebuffersEXT) (GLsizei, const GLuint*);\nextern pfn_glDeleteFramebuffersEXT fp_glDeleteFramebuffersEXT;\ntypedef void (APIENTRYP pfn_glGenFramebuffersEXT) (GLsizei, GLuint*);\nextern pfn_glGenFramebuffersEXT fp_glGenFramebuffersEXT;\ntypedef GLenum (APIENTRYP pfn_glCheckFramebufferStatusEXT) (GLenum);\nextern pfn_glCheckFramebufferStatusEXT fp_glCheckFramebufferStatusEXT;\ntypedef void (APIENTRYP pfn_glFramebufferTexture1DEXT) (GLenum, GLenum, GLenum, GLuint, GLint);\nextern pfn_glFramebufferTexture1DEXT fp_glFramebufferTexture1DEXT;\ntypedef void (APIENTRYP pfn_glFramebufferTexture2DEXT) (GLenum, GLenum, GLenum, GLuint, GLint);\nextern pfn_glFramebufferTexture2DEXT fp_glFramebufferTexture2DEXT;\ntypedef void (APIENTRYP pfn_glFramebufferTexture3DEXT) (GLenum, GLenum, GLenum, GLuint, GLint, GLint);\nextern pfn_glFramebufferTexture3DEXT fp_glFramebufferTexture3DEXT;\ntypedef void (APIENTRYP pfn_glFramebufferRenderbufferEXT) (GLenum, GLenum, GLenum, GLuint);\nextern pfn_glFramebufferRenderbufferEXT fp_glFramebufferRenderbufferEXT;\ntypedef void (APIENTRYP pfn_glGetFramebufferAttachmentParameterivEXT) (GLenum, GLenum, GLenum, GLint*);\nextern pfn_glGetFramebufferAttachmentParameterivEXT fp_glGetFramebufferAttachmentParameterivEXT;\ntypedef void (APIENTRYP pfn_glGenerateMipmapEXT) (GLenum);\nextern pfn_glGenerateMipmapEXT fp_glGenerateMipmapEXT;\n\n /* GL_EXT_framebuffer_sRGB */\nextern GLboolean GLAD_EXT_framebuffer_sRGB;\n#define GL_FRAMEBUFFER_SRGB_EXT                0x8DB9\n#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT        0x8DBA\n\n /* GL_EXT_geometry_point_size */\nextern GLboolean GLAD_EXT_geometry_point_size;\n\n /* GL_EXT_geometry_shader */\nextern GLboolean GLAD_EXT_geometry_shader;\n#define GL_GEOMETRY_SHADER_EXT                 0x8DD9\n#define GL_GEOMETRY_SHADER_BIT_EXT             0x00000004\n#define GL_GEOMETRY_LINKED_VERTICES_OUT_EXT    0x8916\n#define GL_GEOMETRY_LINKED_INPUT_TYPE_EXT      0x8917\n#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT     0x8918\n#define GL_GEOMETRY_SHADER_INVOCATIONS_EXT     0x887F\n#define GL_LAYER_PROVOKING_VERTEX_EXT          0x825E\n#define GL_LINES_ADJACENCY_EXT                 0x000A\n#define GL_LINE_STRIP_ADJACENCY_EXT            0x000B\n#define GL_TRIANGLES_ADJACENCY_EXT             0x000C\n#define GL_TRIANGLE_STRIP_ADJACENCY_EXT        0x000D\n#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT  0x8DDF\n#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT     0x8A2C\n#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT  0x8A32\n#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT   0x9123\n#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT  0x9124\n#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT    0x8DE0\n#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT  0x8DE1\n#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT  0x8E5A\n#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT  0x8C29\n#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT  0x92CF\n#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT    0x92D5\n#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT     0x90CD\n#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT  0x90D7\n#define GL_FIRST_VERTEX_CONVENTION_EXT         0x8E4D\n#define GL_LAST_VERTEX_CONVENTION_EXT          0x8E4E\n#define GL_UNDEFINED_VERTEX_EXT                0x8260\n#define GL_PRIMITIVES_GENERATED_EXT            0x8C87\n#define GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT      0x9312\n#define GL_MAX_FRAMEBUFFER_LAYERS_EXT          0x9317\n#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT  0x8DA8\n#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT  0x8DA7\n#define GL_REFERENCED_BY_GEOMETRY_SHADER_EXT   0x9309\ntypedef void (APIENTRYP pfn_glFramebufferTextureEXT) (GLenum, GLenum, GLuint, GLint);\nextern pfn_glFramebufferTextureEXT fp_glFramebufferTextureEXT;\n\n /* GL_EXT_geometry_shader4 */\nextern GLboolean GLAD_EXT_geometry_shader4;\n#define GL_GEOMETRY_VERTICES_OUT_EXT           0x8DDA\n#define GL_GEOMETRY_INPUT_TYPE_EXT             0x8DDB\n#define GL_GEOMETRY_OUTPUT_TYPE_EXT            0x8DDC\n#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT  0x8DDD\n#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT   0x8DDE\n#define GL_MAX_VARYING_COMPONENTS_EXT          0x8B4B\n#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT  0x8DA9\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT  0x8CD4\n#define GL_PROGRAM_POINT_SIZE_EXT              0x8642\ntypedef void (APIENTRYP pfn_glProgramParameteriEXT) (GLuint, GLenum, GLint);\nextern pfn_glProgramParameteriEXT fp_glProgramParameteriEXT;\n\n /* GL_EXT_gpu_program_parameters */\nextern GLboolean GLAD_EXT_gpu_program_parameters;\ntypedef void (APIENTRYP pfn_glProgramEnvParameters4fvEXT) (GLenum, GLuint, GLsizei, const GLfloat*);\nextern pfn_glProgramEnvParameters4fvEXT fp_glProgramEnvParameters4fvEXT;\ntypedef void (APIENTRYP pfn_glProgramLocalParameters4fvEXT) (GLenum, GLuint, GLsizei, const GLfloat*);\nextern pfn_glProgramLocalParameters4fvEXT fp_glProgramLocalParameters4fvEXT;\n\n /* GL_EXT_gpu_shader4 */\nextern GLboolean GLAD_EXT_gpu_shader4;\n#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT     0x88FD\n#define GL_SAMPLER_1D_ARRAY_EXT                0x8DC0\n#define GL_SAMPLER_2D_ARRAY_EXT                0x8DC1\n#define GL_SAMPLER_BUFFER_EXT                  0x8DC2\n#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT         0x8DC3\n#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT         0x8DC4\n#define GL_SAMPLER_CUBE_SHADOW_EXT             0x8DC5\n#define GL_UNSIGNED_INT_VEC2_EXT               0x8DC6\n#define GL_UNSIGNED_INT_VEC3_EXT               0x8DC7\n#define GL_UNSIGNED_INT_VEC4_EXT               0x8DC8\n#define GL_INT_SAMPLER_1D_EXT                  0x8DC9\n#define GL_INT_SAMPLER_2D_EXT                  0x8DCA\n#define GL_INT_SAMPLER_3D_EXT                  0x8DCB\n#define GL_INT_SAMPLER_CUBE_EXT                0x8DCC\n#define GL_INT_SAMPLER_2D_RECT_EXT             0x8DCD\n#define GL_INT_SAMPLER_1D_ARRAY_EXT            0x8DCE\n#define GL_INT_SAMPLER_2D_ARRAY_EXT            0x8DCF\n#define GL_INT_SAMPLER_BUFFER_EXT              0x8DD0\n#define GL_UNSIGNED_INT_SAMPLER_1D_EXT         0x8DD1\n#define GL_UNSIGNED_INT_SAMPLER_2D_EXT         0x8DD2\n#define GL_UNSIGNED_INT_SAMPLER_3D_EXT         0x8DD3\n#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT       0x8DD4\n#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT    0x8DD5\n#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT   0x8DD6\n#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT   0x8DD7\n#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT     0x8DD8\n#define GL_MIN_PROGRAM_TEXEL_OFFSET_EXT        0x8904\n#define GL_MAX_PROGRAM_TEXEL_OFFSET_EXT        0x8905\ntypedef void (APIENTRYP pfn_glGetUniformuivEXT) (GLuint, GLint, GLuint*);\nextern pfn_glGetUniformuivEXT fp_glGetUniformuivEXT;\ntypedef GLint (APIENTRYP pfn_glGetFragDataLocationEXT) (GLuint, const GLchar*);\nextern pfn_glGetFragDataLocationEXT fp_glGetFragDataLocationEXT;\ntypedef void (APIENTRYP pfn_glUniform1uiEXT) (GLint, GLuint);\nextern pfn_glUniform1uiEXT fp_glUniform1uiEXT;\ntypedef void (APIENTRYP pfn_glUniform2uiEXT) (GLint, GLuint, GLuint);\nextern pfn_glUniform2uiEXT fp_glUniform2uiEXT;\ntypedef void (APIENTRYP pfn_glUniform3uiEXT) (GLint, GLuint, GLuint, GLuint);\nextern pfn_glUniform3uiEXT fp_glUniform3uiEXT;\ntypedef void (APIENTRYP pfn_glUniform4uiEXT) (GLint, GLuint, GLuint, GLuint, GLuint);\nextern pfn_glUniform4uiEXT fp_glUniform4uiEXT;\ntypedef void (APIENTRYP pfn_glUniform1uivEXT) (GLint, GLsizei, const GLuint*);\nextern pfn_glUniform1uivEXT fp_glUniform1uivEXT;\ntypedef void (APIENTRYP pfn_glUniform2uivEXT) (GLint, GLsizei, const GLuint*);\nextern pfn_glUniform2uivEXT fp_glUniform2uivEXT;\ntypedef void (APIENTRYP pfn_glUniform3uivEXT) (GLint, GLsizei, const GLuint*);\nextern pfn_glUniform3uivEXT fp_glUniform3uivEXT;\ntypedef void (APIENTRYP pfn_glUniform4uivEXT) (GLint, GLsizei, const GLuint*);\nextern pfn_glUniform4uivEXT fp_glUniform4uivEXT;\n\n /* GL_EXT_gpu_shader5 */\nextern GLboolean GLAD_EXT_gpu_shader5;\n\n /* GL_EXT_instanced_arrays */\nextern GLboolean GLAD_EXT_instanced_arrays;\n#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_EXT     0x88FE\ntypedef void (APIENTRYP pfn_glVertexAttribDivisorEXT) (GLuint, GLuint);\nextern pfn_glVertexAttribDivisorEXT fp_glVertexAttribDivisorEXT;\n\n /* GL_EXT_map_buffer_range */\nextern GLboolean GLAD_EXT_map_buffer_range;\n#define GL_MAP_READ_BIT_EXT                    0x0001\n#define GL_MAP_WRITE_BIT_EXT                   0x0002\n#define GL_MAP_INVALIDATE_RANGE_BIT_EXT        0x0004\n#define GL_MAP_INVALIDATE_BUFFER_BIT_EXT       0x0008\n#define GL_MAP_FLUSH_EXPLICIT_BIT_EXT          0x0010\n#define GL_MAP_UNSYNCHRONIZED_BIT_EXT          0x0020\ntypedef void* (APIENTRYP pfn_glMapBufferRangeEXT) (GLenum, GLintptr, GLsizeiptr, GLbitfield);\nextern pfn_glMapBufferRangeEXT fp_glMapBufferRangeEXT;\ntypedef void (APIENTRYP pfn_glFlushMappedBufferRangeEXT) (GLenum, GLintptr, GLsizeiptr);\nextern pfn_glFlushMappedBufferRangeEXT fp_glFlushMappedBufferRangeEXT;\n\n /* GL_EXT_multi_draw_indirect */\nextern GLboolean GLAD_EXT_multi_draw_indirect;\ntypedef void (APIENTRYP pfn_glMultiDrawArraysIndirectEXT) (GLenum, const void*, GLsizei, GLsizei);\nextern pfn_glMultiDrawArraysIndirectEXT fp_glMultiDrawArraysIndirectEXT;\ntypedef void (APIENTRYP pfn_glMultiDrawElementsIndirectEXT) (GLenum, GLenum, const void*, GLsizei, GLsizei);\nextern pfn_glMultiDrawElementsIndirectEXT fp_glMultiDrawElementsIndirectEXT;\n\n /* GL_EXT_multisampled_compatibility */\nextern GLboolean GLAD_EXT_multisampled_compatibility;\n#define GL_MULTISAMPLE_EXT                     0x809D\n#define GL_SAMPLE_ALPHA_TO_ONE_EXT             0x809F\n\n /* GL_EXT_multisampled_render_to_texture */\nextern GLboolean GLAD_EXT_multisampled_render_to_texture;\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT  0x8D6C\ntypedef void (APIENTRYP pfn_glFramebufferTexture2DMultisampleEXT) (GLenum, GLenum, GLenum, GLuint, GLint, GLsizei);\nextern pfn_glFramebufferTexture2DMultisampleEXT fp_glFramebufferTexture2DMultisampleEXT;\n\n /* GL_EXT_multiview_draw_buffers */\nextern GLboolean GLAD_EXT_multiview_draw_buffers;\n#define GL_COLOR_ATTACHMENT_EXT                0x90F0\n#define GL_MULTIVIEW_EXT                       0x90F1\n#define GL_DRAW_BUFFER_EXT                     0x0C01\n#define GL_READ_BUFFER_EXT                     0x0C02\n#define GL_MAX_MULTIVIEW_BUFFERS_EXT           0x90F2\ntypedef void (APIENTRYP pfn_glReadBufferIndexedEXT) (GLenum, GLint);\nextern pfn_glReadBufferIndexedEXT fp_glReadBufferIndexedEXT;\ntypedef void (APIENTRYP pfn_glDrawBuffersIndexedEXT) (GLint, const GLenum*, const GLint*);\nextern pfn_glDrawBuffersIndexedEXT fp_glDrawBuffersIndexedEXT;\ntypedef void (APIENTRYP pfn_glGetIntegeri_vEXT) (GLenum, GLuint, GLint*);\nextern pfn_glGetIntegeri_vEXT fp_glGetIntegeri_vEXT;\n\n /* GL_EXT_occlusion_query_boolean */\nextern GLboolean GLAD_EXT_occlusion_query_boolean;\n#define GL_ANY_SAMPLES_PASSED_EXT              0x8C2F\n#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT  0x8D6A\n\n /* GL_EXT_packed_depth_stencil */\nextern GLboolean GLAD_EXT_packed_depth_stencil;\n#define GL_DEPTH_STENCIL_EXT                   0x84F9\n#define GL_UNSIGNED_INT_24_8_EXT               0x84FA\n#define GL_DEPTH24_STENCIL8_EXT                0x88F0\n#define GL_TEXTURE_STENCIL_SIZE_EXT            0x88F1\n\n /* GL_EXT_packed_float */\nextern GLboolean GLAD_EXT_packed_float;\n#define GL_R11F_G11F_B10F_EXT                  0x8C3A\n#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT    0x8C3B\n#define GL_RGBA_SIGNED_COMPONENTS_EXT          0x8C3C\n\n /* GL_EXT_pixel_buffer_object */\nextern GLboolean GLAD_EXT_pixel_buffer_object;\n#define GL_PIXEL_PACK_BUFFER_EXT               0x88EB\n#define GL_PIXEL_UNPACK_BUFFER_EXT             0x88EC\n#define GL_PIXEL_PACK_BUFFER_BINDING_EXT       0x88ED\n#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT     0x88EF\n\n /* GL_EXT_polygon_offset_clamp */\nextern GLboolean GLAD_EXT_polygon_offset_clamp;\n#define GL_POLYGON_OFFSET_CLAMP_EXT            0x8E1B\ntypedef void (APIENTRYP pfn_glPolygonOffsetClampEXT) (GLfloat, GLfloat, GLfloat);\nextern pfn_glPolygonOffsetClampEXT fp_glPolygonOffsetClampEXT;\n\n /* GL_EXT_post_depth_coverage */\nextern GLboolean GLAD_EXT_post_depth_coverage;\n\n /* GL_EXT_primitive_bounding_box */\nextern GLboolean GLAD_EXT_primitive_bounding_box;\n#define GL_PRIMITIVE_BOUNDING_BOX_EXT          0x92BE\ntypedef void (APIENTRYP pfn_glPrimitiveBoundingBoxEXT) (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);\nextern pfn_glPrimitiveBoundingBoxEXT fp_glPrimitiveBoundingBoxEXT;\n\n /* GL_EXT_provoking_vertex */\nextern GLboolean GLAD_EXT_provoking_vertex;\n#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT  0x8E4C\n#define GL_PROVOKING_VERTEX_EXT                0x8E4F\ntypedef void (APIENTRYP pfn_glProvokingVertexEXT) (GLenum);\nextern pfn_glProvokingVertexEXT fp_glProvokingVertexEXT;\n\n /* GL_EXT_pvrtc_sRGB */\nextern GLboolean GLAD_EXT_pvrtc_sRGB;\n#define GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT    0x8A54\n#define GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT    0x8A55\n#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT  0x8A56\n#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT  0x8A57\n#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG  0x93F0\n#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV2_IMG  0x93F1\n\n /* GL_EXT_raster_multisample */\nextern GLboolean GLAD_EXT_raster_multisample;\n#define GL_RASTER_MULTISAMPLE_EXT              0x9327\n#define GL_RASTER_SAMPLES_EXT                  0x9328\n#define GL_MAX_RASTER_SAMPLES_EXT              0x9329\n#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT   0x932A\n#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT  0x932B\n#define GL_EFFECTIVE_RASTER_SAMPLES_EXT        0x932C\ntypedef void (APIENTRYP pfn_glRasterSamplesEXT) (GLuint, GLboolean);\nextern pfn_glRasterSamplesEXT fp_glRasterSamplesEXT;\n\n /* GL_EXT_read_format_bgra */\nextern GLboolean GLAD_EXT_read_format_bgra;\n#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT      0x8365\n#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT      0x8366\n\n /* GL_EXT_render_snorm */\nextern GLboolean GLAD_EXT_render_snorm;\n#define GL_R16_SNORM_EXT                       0x8F98\n#define GL_RG16_SNORM_EXT                      0x8F99\n#define GL_RGBA16_SNORM_EXT                    0x8F9B\n\n /* GL_EXT_robustness */\nextern GLboolean GLAD_EXT_robustness;\n#define GL_GUILTY_CONTEXT_RESET_EXT            0x8253\n#define GL_INNOCENT_CONTEXT_RESET_EXT          0x8254\n#define GL_UNKNOWN_CONTEXT_RESET_EXT           0x8255\n#define GL_CONTEXT_ROBUST_ACCESS_EXT           0x90F3\n#define GL_RESET_NOTIFICATION_STRATEGY_EXT     0x8256\n#define GL_LOSE_CONTEXT_ON_RESET_EXT           0x8252\n#define GL_NO_RESET_NOTIFICATION_EXT           0x8261\ntypedef GLenum (APIENTRYP pfn_glGetGraphicsResetStatusEXT) ();\nextern pfn_glGetGraphicsResetStatusEXT fp_glGetGraphicsResetStatusEXT;\ntypedef void (APIENTRYP pfn_glReadnPixelsEXT) (GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLsizei, void*);\nextern pfn_glReadnPixelsEXT fp_glReadnPixelsEXT;\ntypedef void (APIENTRYP pfn_glGetnUniformfvEXT) (GLuint, GLint, GLsizei, GLfloat*);\nextern pfn_glGetnUniformfvEXT fp_glGetnUniformfvEXT;\ntypedef void (APIENTRYP pfn_glGetnUniformivEXT) (GLuint, GLint, GLsizei, GLint*);\nextern pfn_glGetnUniformivEXT fp_glGetnUniformivEXT;\n\n /* GL_EXT_separate_shader_objects */\nextern GLboolean GLAD_EXT_separate_shader_objects;\n#define GL_ACTIVE_PROGRAM_EXT                  0x8B8D\n#define GL_VERTEX_SHADER_BIT_EXT               0x00000001\n#define GL_FRAGMENT_SHADER_BIT_EXT             0x00000002\n#define GL_ALL_SHADER_BITS_EXT                 0xFFFFFFFF\n#define GL_PROGRAM_SEPARABLE_EXT               0x8258\n#define GL_PROGRAM_PIPELINE_BINDING_EXT        0x825A\ntypedef void (APIENTRYP pfn_glUseShaderProgramEXT) (GLenum, GLuint);\nextern pfn_glUseShaderProgramEXT fp_glUseShaderProgramEXT;\ntypedef void (APIENTRYP pfn_glActiveProgramEXT) (GLuint);\nextern pfn_glActiveProgramEXT fp_glActiveProgramEXT;\ntypedef GLuint (APIENTRYP pfn_glCreateShaderProgramEXT) (GLenum, const GLchar*);\nextern pfn_glCreateShaderProgramEXT fp_glCreateShaderProgramEXT;\ntypedef void (APIENTRYP pfn_glActiveShaderProgramEXT) (GLuint, GLuint);\nextern pfn_glActiveShaderProgramEXT fp_glActiveShaderProgramEXT;\ntypedef void (APIENTRYP pfn_glBindProgramPipelineEXT) (GLuint);\nextern pfn_glBindProgramPipelineEXT fp_glBindProgramPipelineEXT;\ntypedef GLuint (APIENTRYP pfn_glCreateShaderProgramvEXT) (GLenum, GLsizei, const GLchar**);\nextern pfn_glCreateShaderProgramvEXT fp_glCreateShaderProgramvEXT;\ntypedef void (APIENTRYP pfn_glDeleteProgramPipelinesEXT) (GLsizei, const GLuint*);\nextern pfn_glDeleteProgramPipelinesEXT fp_glDeleteProgramPipelinesEXT;\ntypedef void (APIENTRYP pfn_glGenProgramPipelinesEXT) (GLsizei, GLuint*);\nextern pfn_glGenProgramPipelinesEXT fp_glGenProgramPipelinesEXT;\ntypedef void (APIENTRYP pfn_glGetProgramPipelineInfoLogEXT) (GLuint, GLsizei, GLsizei*, GLchar*);\nextern pfn_glGetProgramPipelineInfoLogEXT fp_glGetProgramPipelineInfoLogEXT;\ntypedef void (APIENTRYP pfn_glGetProgramPipelineivEXT) (GLuint, GLenum, GLint*);\nextern pfn_glGetProgramPipelineivEXT fp_glGetProgramPipelineivEXT;\ntypedef GLboolean (APIENTRYP pfn_glIsProgramPipelineEXT) (GLuint);\nextern pfn_glIsProgramPipelineEXT fp_glIsProgramPipelineEXT;\ntypedef void (APIENTRYP pfn_glUseProgramStagesEXT) (GLuint, GLbitfield, GLuint);\nextern pfn_glUseProgramStagesEXT fp_glUseProgramStagesEXT;\ntypedef void (APIENTRYP pfn_glValidateProgramPipelineEXT) (GLuint);\nextern pfn_glValidateProgramPipelineEXT fp_glValidateProgramPipelineEXT;\n\n /* GL_EXT_shader_framebuffer_fetch */\nextern GLboolean GLAD_EXT_shader_framebuffer_fetch;\n#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT  0x8A52\n\n /* GL_EXT_shader_image_load_formatted */\nextern GLboolean GLAD_EXT_shader_image_load_formatted;\n\n /* GL_EXT_shader_image_load_store */\nextern GLboolean GLAD_EXT_shader_image_load_store;\n#define GL_MAX_IMAGE_UNITS_EXT                 0x8F38\n#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT  0x8F39\n#define GL_IMAGE_BINDING_NAME_EXT              0x8F3A\n#define GL_IMAGE_BINDING_LEVEL_EXT             0x8F3B\n#define GL_IMAGE_BINDING_LAYERED_EXT           0x8F3C\n#define GL_IMAGE_BINDING_LAYER_EXT             0x8F3D\n#define GL_IMAGE_BINDING_ACCESS_EXT            0x8F3E\n#define GL_IMAGE_1D_EXT                        0x904C\n#define GL_IMAGE_2D_EXT                        0x904D\n#define GL_IMAGE_3D_EXT                        0x904E\n#define GL_IMAGE_2D_RECT_EXT                   0x904F\n#define GL_IMAGE_CUBE_EXT                      0x9050\n#define GL_IMAGE_BUFFER_EXT                    0x9051\n#define GL_IMAGE_1D_ARRAY_EXT                  0x9052\n#define GL_IMAGE_2D_ARRAY_EXT                  0x9053\n#define GL_IMAGE_CUBE_MAP_ARRAY_EXT            0x9054\n#define GL_IMAGE_2D_MULTISAMPLE_EXT            0x9055\n#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT      0x9056\n#define GL_INT_IMAGE_1D_EXT                    0x9057\n#define GL_INT_IMAGE_2D_EXT                    0x9058\n#define GL_INT_IMAGE_3D_EXT                    0x9059\n#define GL_INT_IMAGE_2D_RECT_EXT               0x905A\n#define GL_INT_IMAGE_CUBE_EXT                  0x905B\n#define GL_INT_IMAGE_BUFFER_EXT                0x905C\n#define GL_INT_IMAGE_1D_ARRAY_EXT              0x905D\n#define GL_INT_IMAGE_2D_ARRAY_EXT              0x905E\n#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT        0x905F\n#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT        0x9060\n#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT  0x9061\n#define GL_UNSIGNED_INT_IMAGE_1D_EXT           0x9062\n#define GL_UNSIGNED_INT_IMAGE_2D_EXT           0x9063\n#define GL_UNSIGNED_INT_IMAGE_3D_EXT           0x9064\n#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT      0x9065\n#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT         0x9066\n#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT       0x9067\n#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT     0x9068\n#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT     0x9069\n#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT  0x906A\n#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT  0x906B\n#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT  0x906C\n#define GL_MAX_IMAGE_SAMPLES_EXT               0x906D\n#define GL_IMAGE_BINDING_FORMAT_EXT            0x906E\n#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT  0x00000001\n#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT       0x00000002\n#define GL_UNIFORM_BARRIER_BIT_EXT             0x00000004\n#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT       0x00000008\n#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT  0x00000020\n#define GL_COMMAND_BARRIER_BIT_EXT             0x00000040\n#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT        0x00000080\n#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT      0x00000100\n#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT       0x00000200\n#define GL_FRAMEBUFFER_BARRIER_BIT_EXT         0x00000400\n#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT  0x00000800\n#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT      0x00001000\n#define GL_ALL_BARRIER_BITS_EXT                0xFFFFFFFF\ntypedef void (APIENTRYP pfn_glBindImageTextureEXT) (GLuint, GLuint, GLint, GLboolean, GLint, GLenum, GLint);\nextern pfn_glBindImageTextureEXT fp_glBindImageTextureEXT;\ntypedef void (APIENTRYP pfn_glMemoryBarrierEXT) (GLbitfield);\nextern pfn_glMemoryBarrierEXT fp_glMemoryBarrierEXT;\n\n /* GL_EXT_shader_implicit_conversions */\nextern GLboolean GLAD_EXT_shader_implicit_conversions;\n\n /* GL_EXT_shader_integer_mix */\nextern GLboolean GLAD_EXT_shader_integer_mix;\n\n /* GL_EXT_shader_io_blocks */\nextern GLboolean GLAD_EXT_shader_io_blocks;\n\n /* GL_EXT_shader_pixel_local_storage */\nextern GLboolean GLAD_EXT_shader_pixel_local_storage;\n#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT  0x8F63\n#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_SIZE_EXT  0x8F67\n#define GL_SHADER_PIXEL_LOCAL_STORAGE_EXT      0x8F64\n\n /* GL_EXT_shader_texture_lod */\nextern GLboolean GLAD_EXT_shader_texture_lod;\n\n /* GL_EXT_shadow_samplers */\nextern GLboolean GLAD_EXT_shadow_samplers;\n#define GL_TEXTURE_COMPARE_MODE_EXT            0x884C\n#define GL_TEXTURE_COMPARE_FUNC_EXT            0x884D\n#define GL_COMPARE_REF_TO_TEXTURE_EXT          0x884E\n#define GL_SAMPLER_2D_SHADOW_EXT               0x8B62\n\n /* GL_EXT_sparse_texture */\nextern GLboolean GLAD_EXT_sparse_texture;\n#define GL_TEXTURE_SPARSE_EXT                  0x91A6\n#define GL_VIRTUAL_PAGE_SIZE_INDEX_EXT         0x91A7\n#define GL_NUM_SPARSE_LEVELS_EXT               0x91AA\n#define GL_NUM_VIRTUAL_PAGE_SIZES_EXT          0x91A8\n#define GL_VIRTUAL_PAGE_SIZE_X_EXT             0x9195\n#define GL_VIRTUAL_PAGE_SIZE_Y_EXT             0x9196\n#define GL_VIRTUAL_PAGE_SIZE_Z_EXT             0x9197\n#define GL_TEXTURE_CUBE_MAP_ARRAY_OES          0x9009\n#define GL_MAX_SPARSE_TEXTURE_SIZE_EXT         0x9198\n#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_EXT      0x9199\n#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_EXT  0x919A\n#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_EXT  0x91A9\ntypedef void (APIENTRYP pfn_glTexPageCommitmentEXT) (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLboolean);\nextern pfn_glTexPageCommitmentEXT fp_glTexPageCommitmentEXT;\n\n /* GL_EXT_sparse_texture2 */\nextern GLboolean GLAD_EXT_sparse_texture2;\n\n /* GL_EXT_sRGB */\nextern GLboolean GLAD_EXT_sRGB;\n#define GL_SRGB_EXT                            0x8C40\n#define GL_SRGB_ALPHA_EXT                      0x8C42\n#define GL_SRGB8_ALPHA8_EXT                    0x8C43\n#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT  0x8210\n\n /* GL_EXT_sRGB_write_control */\nextern GLboolean GLAD_EXT_sRGB_write_control;\n\n /* GL_EXT_stencil_clear_tag */\nextern GLboolean GLAD_EXT_stencil_clear_tag;\n#define GL_STENCIL_TAG_BITS_EXT                0x88F2\n#define GL_STENCIL_CLEAR_TAG_VALUE_EXT         0x88F3\ntypedef void (APIENTRYP pfn_glStencilClearTagEXT) (GLsizei, GLuint);\nextern pfn_glStencilClearTagEXT fp_glStencilClearTagEXT;\n\n /* GL_EXT_tessellation_point_size */\nextern GLboolean GLAD_EXT_tessellation_point_size;\n\n /* GL_EXT_tessellation_shader */\nextern GLboolean GLAD_EXT_tessellation_shader;\n#define GL_PATCHES_EXT                         0x000E\n#define GL_PATCH_VERTICES_EXT                  0x8E72\n#define GL_TESS_CONTROL_OUTPUT_VERTICES_EXT    0x8E75\n#define GL_TESS_GEN_MODE_EXT                   0x8E76\n#define GL_TESS_GEN_SPACING_EXT                0x8E77\n#define GL_TESS_GEN_VERTEX_ORDER_EXT           0x8E78\n#define GL_TESS_GEN_POINT_MODE_EXT             0x8E79\n#define GL_ISOLINES_EXT                        0x8E7A\n#define GL_QUADS_EXT                           0x0007\n#define GL_FRACTIONAL_ODD_EXT                  0x8E7B\n#define GL_FRACTIONAL_EVEN_EXT                 0x8E7C\n#define GL_MAX_PATCH_VERTICES_EXT              0x8E7D\n#define GL_MAX_TESS_GEN_LEVEL_EXT              0x8E7E\n#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_EXT  0x8E7F\n#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT  0x8E80\n#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_EXT  0x8E81\n#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_EXT  0x8E82\n#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_EXT  0x8E83\n#define GL_MAX_TESS_PATCH_COMPONENTS_EXT       0x8E84\n#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_EXT  0x8E85\n#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_EXT  0x8E86\n#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_EXT  0x8E89\n#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_EXT  0x8E8A\n#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_EXT  0x886C\n#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_EXT  0x886D\n#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_EXT  0x8E1E\n#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT  0x8E1F\n#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_EXT  0x92CD\n#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_EXT  0x92CE\n#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_EXT  0x92D3\n#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_EXT  0x92D4\n#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_EXT  0x90CB\n#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_EXT  0x90CC\n#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_EXT  0x90D8\n#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_EXT  0x90D9\n#define GL_IS_PER_PATCH_EXT                    0x92E7\n#define GL_REFERENCED_BY_TESS_CONTROL_SHADER_EXT  0x9307\n#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER_EXT  0x9308\n#define GL_TESS_CONTROL_SHADER_EXT             0x8E88\n#define GL_TESS_EVALUATION_SHADER_EXT          0x8E87\n#define GL_TESS_CONTROL_SHADER_BIT_EXT         0x00000008\n#define GL_TESS_EVALUATION_SHADER_BIT_EXT      0x00000010\ntypedef void (APIENTRYP pfn_glPatchParameteriEXT) (GLenum, GLint);\nextern pfn_glPatchParameteriEXT fp_glPatchParameteriEXT;\n\n /* GL_EXT_texture_array */\nextern GLboolean GLAD_EXT_texture_array;\n#define GL_TEXTURE_1D_ARRAY_EXT                0x8C18\n#define GL_PROXY_TEXTURE_1D_ARRAY_EXT          0x8C19\n#define GL_TEXTURE_2D_ARRAY_EXT                0x8C1A\n#define GL_PROXY_TEXTURE_2D_ARRAY_EXT          0x8C1B\n#define GL_TEXTURE_BINDING_1D_ARRAY_EXT        0x8C1C\n#define GL_TEXTURE_BINDING_2D_ARRAY_EXT        0x8C1D\n#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT        0x88FF\n#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT    0x884E\ntypedef void (APIENTRYP pfn_glFramebufferTextureLayerEXT) (GLenum, GLenum, GLuint, GLint, GLint);\nextern pfn_glFramebufferTextureLayerEXT fp_glFramebufferTextureLayerEXT;\n\n /* GL_EXT_texture_border_clamp */\nextern GLboolean GLAD_EXT_texture_border_clamp;\n#define GL_TEXTURE_BORDER_COLOR_EXT            0x1004\n#define GL_CLAMP_TO_BORDER_EXT                 0x812D\ntypedef void (APIENTRYP pfn_glTexParameterIivEXT) (GLenum, GLenum, const GLint*);\nextern pfn_glTexParameterIivEXT fp_glTexParameterIivEXT;\ntypedef void (APIENTRYP pfn_glTexParameterIuivEXT) (GLenum, GLenum, const GLuint*);\nextern pfn_glTexParameterIuivEXT fp_glTexParameterIuivEXT;\ntypedef void (APIENTRYP pfn_glGetTexParameterIivEXT) (GLenum, GLenum, GLint*);\nextern pfn_glGetTexParameterIivEXT fp_glGetTexParameterIivEXT;\ntypedef void (APIENTRYP pfn_glGetTexParameterIuivEXT) (GLenum, GLenum, GLuint*);\nextern pfn_glGetTexParameterIuivEXT fp_glGetTexParameterIuivEXT;\ntypedef void (APIENTRYP pfn_glSamplerParameterIivEXT) (GLuint, GLenum, const GLint*);\nextern pfn_glSamplerParameterIivEXT fp_glSamplerParameterIivEXT;\ntypedef void (APIENTRYP pfn_glSamplerParameterIuivEXT) (GLuint, GLenum, const GLuint*);\nextern pfn_glSamplerParameterIuivEXT fp_glSamplerParameterIuivEXT;\ntypedef void (APIENTRYP pfn_glGetSamplerParameterIivEXT) (GLuint, GLenum, GLint*);\nextern pfn_glGetSamplerParameterIivEXT fp_glGetSamplerParameterIivEXT;\ntypedef void (APIENTRYP pfn_glGetSamplerParameterIuivEXT) (GLuint, GLenum, GLuint*);\nextern pfn_glGetSamplerParameterIuivEXT fp_glGetSamplerParameterIuivEXT;\n\n /* GL_EXT_texture_buffer */\nextern GLboolean GLAD_EXT_texture_buffer;\n#define GL_TEXTURE_BUFFER_EXT                  0x8C2A\n#define GL_TEXTURE_BUFFER_BINDING_EXT          0x8C2A\n#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT         0x8C2B\n#define GL_TEXTURE_BINDING_BUFFER_EXT          0x8C2C\n#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT  0x8C2D\n#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_EXT  0x919F\n#define GL_TEXTURE_BUFFER_OFFSET_EXT           0x919D\n#define GL_TEXTURE_BUFFER_SIZE_EXT             0x919E\ntypedef void (APIENTRYP pfn_glTexBufferEXT) (GLenum, GLenum, GLuint);\nextern pfn_glTexBufferEXT fp_glTexBufferEXT;\ntypedef void (APIENTRYP pfn_glTexBufferRangeEXT) (GLenum, GLenum, GLuint, GLintptr, GLsizeiptr);\nextern pfn_glTexBufferRangeEXT fp_glTexBufferRangeEXT;\n\n /* GL_EXT_texture_buffer_object */\nextern GLboolean GLAD_EXT_texture_buffer_object;\n#define GL_TEXTURE_BUFFER_FORMAT_EXT           0x8C2E\n\n /* GL_EXT_texture_compression_dxt1 */\nextern GLboolean GLAD_EXT_texture_compression_dxt1;\n#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT        0x83F0\n#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT       0x83F1\n\n /* GL_EXT_texture_compression_latc */\nextern GLboolean GLAD_EXT_texture_compression_latc;\n#define GL_COMPRESSED_LUMINANCE_LATC1_EXT      0x8C70\n#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT  0x8C71\n#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT  0x8C72\n#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT  0x8C73\n\n /* GL_EXT_texture_compression_rgtc */\nextern GLboolean GLAD_EXT_texture_compression_rgtc;\n#define GL_COMPRESSED_RED_RGTC1_EXT            0x8DBB\n#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT     0x8DBC\n#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT      0x8DBD\n#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT  0x8DBE\n\n /* GL_EXT_texture_compression_s3tc */\nextern GLboolean GLAD_EXT_texture_compression_s3tc;\n#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT       0x83F2\n#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT       0x83F3\n\n /* GL_EXT_texture_cube_map */\nextern GLboolean GLAD_EXT_texture_cube_map;\n#define GL_NORMAL_MAP_EXT                      0x8511\n#define GL_REFLECTION_MAP_EXT                  0x8512\n#define GL_TEXTURE_CUBE_MAP_EXT                0x8513\n#define GL_TEXTURE_BINDING_CUBE_MAP_EXT        0x8514\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT     0x8515\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT     0x8516\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT     0x8517\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT     0x8518\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT     0x8519\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT     0x851A\n#define GL_PROXY_TEXTURE_CUBE_MAP_EXT          0x851B\n#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT       0x851C\n\n /* GL_EXT_texture_cube_map_array */\nextern GLboolean GLAD_EXT_texture_cube_map_array;\n#define GL_TEXTURE_CUBE_MAP_ARRAY_EXT          0x9009\n#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT  0x900A\n#define GL_SAMPLER_CUBE_MAP_ARRAY_EXT          0x900C\n#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT   0x900D\n#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_EXT      0x900E\n#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT  0x900F\n\n /* GL_EXT_texture_filter_anisotropic */\nextern GLboolean GLAD_EXT_texture_filter_anisotropic;\n#define GL_TEXTURE_MAX_ANISOTROPY_EXT          0x84FE\n#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT      0x84FF\n\n /* GL_EXT_texture_filter_minmax */\nextern GLboolean GLAD_EXT_texture_filter_minmax;\n\n /* GL_EXT_texture_format_BGRA8888 */\nextern GLboolean GLAD_EXT_texture_format_BGRA8888;\n\n /* GL_EXT_texture_integer */\nextern GLboolean GLAD_EXT_texture_integer;\n#define GL_RGBA32UI_EXT                        0x8D70\n#define GL_RGB32UI_EXT                         0x8D71\n#define GL_ALPHA32UI_EXT                       0x8D72\n#define GL_INTENSITY32UI_EXT                   0x8D73\n#define GL_LUMINANCE32UI_EXT                   0x8D74\n#define GL_LUMINANCE_ALPHA32UI_EXT             0x8D75\n#define GL_RGBA16UI_EXT                        0x8D76\n#define GL_RGB16UI_EXT                         0x8D77\n#define GL_ALPHA16UI_EXT                       0x8D78\n#define GL_INTENSITY16UI_EXT                   0x8D79\n#define GL_LUMINANCE16UI_EXT                   0x8D7A\n#define GL_LUMINANCE_ALPHA16UI_EXT             0x8D7B\n#define GL_RGBA8UI_EXT                         0x8D7C\n#define GL_RGB8UI_EXT                          0x8D7D\n#define GL_ALPHA8UI_EXT                        0x8D7E\n#define GL_INTENSITY8UI_EXT                    0x8D7F\n#define GL_LUMINANCE8UI_EXT                    0x8D80\n#define GL_LUMINANCE_ALPHA8UI_EXT              0x8D81\n#define GL_RGBA32I_EXT                         0x8D82\n#define GL_RGB32I_EXT                          0x8D83\n#define GL_ALPHA32I_EXT                        0x8D84\n#define GL_INTENSITY32I_EXT                    0x8D85\n#define GL_LUMINANCE32I_EXT                    0x8D86\n#define GL_LUMINANCE_ALPHA32I_EXT              0x8D87\n#define GL_RGBA16I_EXT                         0x8D88\n#define GL_RGB16I_EXT                          0x8D89\n#define GL_ALPHA16I_EXT                        0x8D8A\n#define GL_INTENSITY16I_EXT                    0x8D8B\n#define GL_LUMINANCE16I_EXT                    0x8D8C\n#define GL_LUMINANCE_ALPHA16I_EXT              0x8D8D\n#define GL_RGBA8I_EXT                          0x8D8E\n#define GL_RGB8I_EXT                           0x8D8F\n#define GL_ALPHA8I_EXT                         0x8D90\n#define GL_INTENSITY8I_EXT                     0x8D91\n#define GL_LUMINANCE8I_EXT                     0x8D92\n#define GL_LUMINANCE_ALPHA8I_EXT               0x8D93\n#define GL_RED_INTEGER_EXT                     0x8D94\n#define GL_GREEN_INTEGER_EXT                   0x8D95\n#define GL_BLUE_INTEGER_EXT                    0x8D96\n#define GL_ALPHA_INTEGER_EXT                   0x8D97\n#define GL_RGB_INTEGER_EXT                     0x8D98\n#define GL_RGBA_INTEGER_EXT                    0x8D99\n#define GL_BGR_INTEGER_EXT                     0x8D9A\n#define GL_BGRA_INTEGER_EXT                    0x8D9B\n#define GL_LUMINANCE_INTEGER_EXT               0x8D9C\n#define GL_LUMINANCE_ALPHA_INTEGER_EXT         0x8D9D\n#define GL_RGBA_INTEGER_MODE_EXT               0x8D9E\ntypedef void (APIENTRYP pfn_glClearColorIiEXT) (GLint, GLint, GLint, GLint);\nextern pfn_glClearColorIiEXT fp_glClearColorIiEXT;\ntypedef void (APIENTRYP pfn_glClearColorIuiEXT) (GLuint, GLuint, GLuint, GLuint);\nextern pfn_glClearColorIuiEXT fp_glClearColorIuiEXT;\n\n /* GL_EXT_texture_norm16 */\nextern GLboolean GLAD_EXT_texture_norm16;\n#define GL_R16_EXT                             0x822A\n#define GL_RG16_EXT                            0x822C\n#define GL_RGBA16_EXT                          0x805B\n#define GL_RGB16_EXT                           0x8054\n#define GL_RGB16_SNORM_EXT                     0x8F9A\n\n /* GL_EXT_texture_rg */\nextern GLboolean GLAD_EXT_texture_rg;\n#define GL_RED_EXT                             0x1903\n#define GL_RG_EXT                              0x8227\n#define GL_R8_EXT                              0x8229\n#define GL_RG8_EXT                             0x822B\n\n /* GL_EXT_texture_shared_exponent */\nextern GLboolean GLAD_EXT_texture_shared_exponent;\n#define GL_RGB9_E5_EXT                         0x8C3D\n#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT        0x8C3E\n#define GL_TEXTURE_SHARED_SIZE_EXT             0x8C3F\n\n /* GL_EXT_texture_snorm */\nextern GLboolean GLAD_EXT_texture_snorm;\n#define GL_ALPHA_SNORM                         0x9010\n#define GL_LUMINANCE_SNORM                     0x9011\n#define GL_LUMINANCE_ALPHA_SNORM               0x9012\n#define GL_INTENSITY_SNORM                     0x9013\n#define GL_ALPHA8_SNORM                        0x9014\n#define GL_LUMINANCE8_SNORM                    0x9015\n#define GL_LUMINANCE8_ALPHA8_SNORM             0x9016\n#define GL_INTENSITY8_SNORM                    0x9017\n#define GL_ALPHA16_SNORM                       0x9018\n#define GL_LUMINANCE16_SNORM                   0x9019\n#define GL_LUMINANCE16_ALPHA16_SNORM           0x901A\n#define GL_INTENSITY16_SNORM                   0x901B\n#define GL_RED_SNORM                           0x8F90\n#define GL_RG_SNORM                            0x8F91\n#define GL_RGB_SNORM                           0x8F92\n#define GL_RGBA_SNORM                          0x8F93\n\n /* GL_EXT_texture_sRGB */\nextern GLboolean GLAD_EXT_texture_sRGB;\n#define GL_SRGB8_EXT                           0x8C41\n#define GL_SLUMINANCE_ALPHA_EXT                0x8C44\n#define GL_SLUMINANCE8_ALPHA8_EXT              0x8C45\n#define GL_SLUMINANCE_EXT                      0x8C46\n#define GL_SLUMINANCE8_EXT                     0x8C47\n#define GL_COMPRESSED_SRGB_EXT                 0x8C48\n#define GL_COMPRESSED_SRGB_ALPHA_EXT           0x8C49\n#define GL_COMPRESSED_SLUMINANCE_EXT           0x8C4A\n#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT     0x8C4B\n#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT       0x8C4C\n#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT  0x8C4D\n#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT  0x8C4E\n#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT  0x8C4F\n\n /* GL_EXT_texture_sRGB_decode */\nextern GLboolean GLAD_EXT_texture_sRGB_decode;\n#define GL_TEXTURE_SRGB_DECODE_EXT             0x8A48\n#define GL_DECODE_EXT                          0x8A49\n#define GL_SKIP_DECODE_EXT                     0x8A4A\n\n /* GL_EXT_texture_sRGB_R8 */\nextern GLboolean GLAD_EXT_texture_sRGB_R8;\n#define GL_SR8_EXT                             0x8FBD\n\n /* GL_EXT_texture_sRGB_RG8 */\nextern GLboolean GLAD_EXT_texture_sRGB_RG8;\n#define GL_SRG8_EXT                            0x8FBE\n\n /* GL_EXT_texture_storage */\nextern GLboolean GLAD_EXT_texture_storage;\n#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT        0x912F\n#define GL_ALPHA8_EXT                          0x803C\n#define GL_LUMINANCE8_EXT                      0x8040\n#define GL_LUMINANCE8_ALPHA8_EXT               0x8045\n#define GL_RGBA32F_EXT                         0x8814\n#define GL_RGB32F_EXT                          0x8815\n#define GL_ALPHA32F_EXT                        0x8816\n#define GL_LUMINANCE32F_EXT                    0x8818\n#define GL_LUMINANCE_ALPHA32F_EXT              0x8819\n#define GL_ALPHA16F_EXT                        0x881C\n#define GL_LUMINANCE16F_EXT                    0x881E\n#define GL_LUMINANCE_ALPHA16F_EXT              0x881F\n#define GL_RGB10_A2_EXT                        0x8059\n#define GL_RGB10_EXT                           0x8052\n#define GL_BGRA8_EXT                           0x93A1\n#define GL_R32F_EXT                            0x822E\n#define GL_RG32F_EXT                           0x8230\ntypedef void (APIENTRYP pfn_glTexStorage1DEXT) (GLenum, GLsizei, GLenum, GLsizei);\nextern pfn_glTexStorage1DEXT fp_glTexStorage1DEXT;\ntypedef void (APIENTRYP pfn_glTexStorage2DEXT) (GLenum, GLsizei, GLenum, GLsizei, GLsizei);\nextern pfn_glTexStorage2DEXT fp_glTexStorage2DEXT;\ntypedef void (APIENTRYP pfn_glTexStorage3DEXT) (GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei);\nextern pfn_glTexStorage3DEXT fp_glTexStorage3DEXT;\n\n /* GL_EXT_texture_swizzle */\nextern GLboolean GLAD_EXT_texture_swizzle;\n#define GL_TEXTURE_SWIZZLE_R_EXT               0x8E42\n#define GL_TEXTURE_SWIZZLE_G_EXT               0x8E43\n#define GL_TEXTURE_SWIZZLE_B_EXT               0x8E44\n#define GL_TEXTURE_SWIZZLE_A_EXT               0x8E45\n#define GL_TEXTURE_SWIZZLE_RGBA_EXT            0x8E46\n\n /* GL_EXT_texture_type_2_10_10_10_REV */\nextern GLboolean GLAD_EXT_texture_type_2_10_10_10_REV;\n#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT     0x8368\n\n /* GL_EXT_texture_view */\nextern GLboolean GLAD_EXT_texture_view;\n#define GL_TEXTURE_VIEW_MIN_LEVEL_EXT          0x82DB\n#define GL_TEXTURE_VIEW_NUM_LEVELS_EXT         0x82DC\n#define GL_TEXTURE_VIEW_MIN_LAYER_EXT          0x82DD\n#define GL_TEXTURE_VIEW_NUM_LAYERS_EXT         0x82DE\ntypedef void (APIENTRYP pfn_glTextureViewEXT) (GLuint, GLenum, GLuint, GLenum, GLuint, GLuint, GLuint, GLuint);\nextern pfn_glTextureViewEXT fp_glTextureViewEXT;\n\n /* GL_EXT_timer_query */\nextern GLboolean GLAD_EXT_timer_query;\n\n /* GL_EXT_transform_feedback */\nextern GLboolean GLAD_EXT_transform_feedback;\n#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT       0x8C8E\n#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT  0x8C84\n#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT  0x8C85\n#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT  0x8C8F\n#define GL_INTERLEAVED_ATTRIBS_EXT             0x8C8C\n#define GL_SEPARATE_ATTRIBS_EXT                0x8C8D\n#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT  0x8C88\n#define GL_RASTERIZER_DISCARD_EXT              0x8C89\n#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT  0x8C8A\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT  0x8C8B\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT  0x8C80\n#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT     0x8C83\n#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT  0x8C7F\n#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT  0x8C76\ntypedef void (APIENTRYP pfn_glBeginTransformFeedbackEXT) (GLenum);\nextern pfn_glBeginTransformFeedbackEXT fp_glBeginTransformFeedbackEXT;\ntypedef void (APIENTRYP pfn_glEndTransformFeedbackEXT) ();\nextern pfn_glEndTransformFeedbackEXT fp_glEndTransformFeedbackEXT;\ntypedef void (APIENTRYP pfn_glBindBufferRangeEXT) (GLenum, GLuint, GLuint, GLintptr, GLsizeiptr);\nextern pfn_glBindBufferRangeEXT fp_glBindBufferRangeEXT;\ntypedef void (APIENTRYP pfn_glBindBufferOffsetEXT) (GLenum, GLuint, GLuint, GLintptr);\nextern pfn_glBindBufferOffsetEXT fp_glBindBufferOffsetEXT;\ntypedef void (APIENTRYP pfn_glBindBufferBaseEXT) (GLenum, GLuint, GLuint);\nextern pfn_glBindBufferBaseEXT fp_glBindBufferBaseEXT;\ntypedef void (APIENTRYP pfn_glTransformFeedbackVaryingsEXT) (GLuint, GLsizei, const GLchar**, GLenum);\nextern pfn_glTransformFeedbackVaryingsEXT fp_glTransformFeedbackVaryingsEXT;\ntypedef void (APIENTRYP pfn_glGetTransformFeedbackVaryingEXT) (GLuint, GLuint, GLsizei, GLsizei*, GLsizei*, GLenum*, GLchar*);\nextern pfn_glGetTransformFeedbackVaryingEXT fp_glGetTransformFeedbackVaryingEXT;\n\n /* GL_EXT_unpack_subimage */\nextern GLboolean GLAD_EXT_unpack_subimage;\n#define GL_UNPACK_ROW_LENGTH_EXT               0x0CF2\n#define GL_UNPACK_SKIP_ROWS_EXT                0x0CF3\n#define GL_UNPACK_SKIP_PIXELS_EXT              0x0CF4\n\n /* GL_EXT_vertex_array_bgra */\nextern GLboolean GLAD_EXT_vertex_array_bgra;\n\n /* GL_EXT_vertex_attrib_64bit */\nextern GLboolean GLAD_EXT_vertex_attrib_64bit;\n#define GL_DOUBLE_VEC2_EXT                     0x8FFC\n#define GL_DOUBLE_VEC3_EXT                     0x8FFD\n#define GL_DOUBLE_VEC4_EXT                     0x8FFE\n#define GL_DOUBLE_MAT2_EXT                     0x8F46\n#define GL_DOUBLE_MAT3_EXT                     0x8F47\n#define GL_DOUBLE_MAT4_EXT                     0x8F48\n#define GL_DOUBLE_MAT2x3_EXT                   0x8F49\n#define GL_DOUBLE_MAT2x4_EXT                   0x8F4A\n#define GL_DOUBLE_MAT3x2_EXT                   0x8F4B\n#define GL_DOUBLE_MAT3x4_EXT                   0x8F4C\n#define GL_DOUBLE_MAT4x2_EXT                   0x8F4D\n#define GL_DOUBLE_MAT4x3_EXT                   0x8F4E\ntypedef void (APIENTRYP pfn_glVertexAttribL1dEXT) (GLuint, GLdouble);\nextern pfn_glVertexAttribL1dEXT fp_glVertexAttribL1dEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribL2dEXT) (GLuint, GLdouble, GLdouble);\nextern pfn_glVertexAttribL2dEXT fp_glVertexAttribL2dEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribL3dEXT) (GLuint, GLdouble, GLdouble, GLdouble);\nextern pfn_glVertexAttribL3dEXT fp_glVertexAttribL3dEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribL4dEXT) (GLuint, GLdouble, GLdouble, GLdouble, GLdouble);\nextern pfn_glVertexAttribL4dEXT fp_glVertexAttribL4dEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribL1dvEXT) (GLuint, const GLdouble*);\nextern pfn_glVertexAttribL1dvEXT fp_glVertexAttribL1dvEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribL2dvEXT) (GLuint, const GLdouble*);\nextern pfn_glVertexAttribL2dvEXT fp_glVertexAttribL2dvEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribL3dvEXT) (GLuint, const GLdouble*);\nextern pfn_glVertexAttribL3dvEXT fp_glVertexAttribL3dvEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribL4dvEXT) (GLuint, const GLdouble*);\nextern pfn_glVertexAttribL4dvEXT fp_glVertexAttribL4dvEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribLPointerEXT) (GLuint, GLint, GLenum, GLsizei, const void*);\nextern pfn_glVertexAttribLPointerEXT fp_glVertexAttribLPointerEXT;\ntypedef void (APIENTRYP pfn_glGetVertexAttribLdvEXT) (GLuint, GLenum, GLdouble*);\nextern pfn_glGetVertexAttribLdvEXT fp_glGetVertexAttribLdvEXT;\n\n /* GL_EXT_x11_sync_object */\nextern GLboolean GLAD_EXT_x11_sync_object;\n#define GL_SYNC_X11_FENCE_EXT                  0x90E1\ntypedef GLsync (APIENTRYP pfn_glImportSyncEXT) (GLenum, GLintptr, GLbitfield);\nextern pfn_glImportSyncEXT fp_glImportSyncEXT;\n\n /* GL_EXT_YUV_target */\nextern GLboolean GLAD_EXT_YUV_target;\n#define GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT         0x8BE7\n#define GL_TEXTURE_EXTERNAL_OES                0x8D65\n#define GL_TEXTURE_BINDING_EXTERNAL_OES        0x8D67\n#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES    0x8D68\n\n /* GL_OES_compressed_ETC1_RGB8_sub_texture */\nextern GLboolean GLAD_OES_compressed_ETC1_RGB8_sub_texture;\n\n /* GL_OES_compressed_ETC1_RGB8_texture */\nextern GLboolean GLAD_OES_compressed_ETC1_RGB8_texture;\n#define GL_ETC1_RGB8_OES                       0x8D64\n\n /* GL_OES_copy_image */\nextern GLboolean GLAD_OES_copy_image;\ntypedef void (APIENTRYP pfn_glCopyImageSubDataOES) (GLuint, GLenum, GLint, GLint, GLint, GLint, GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei);\nextern pfn_glCopyImageSubDataOES fp_glCopyImageSubDataOES;\n\n /* GL_OES_depth24 */\nextern GLboolean GLAD_OES_depth24;\n#define GL_DEPTH_COMPONENT24_OES               0x81A6\n\n /* GL_OES_depth32 */\nextern GLboolean GLAD_OES_depth32;\n#define GL_DEPTH_COMPONENT32_OES               0x81A7\n\n /* GL_OES_depth_texture */\nextern GLboolean GLAD_OES_depth_texture;\n\n /* GL_OES_draw_buffers_indexed */\nextern GLboolean GLAD_OES_draw_buffers_indexed;\ntypedef void (APIENTRYP pfn_glEnableiOES) (GLenum, GLuint);\nextern pfn_glEnableiOES fp_glEnableiOES;\ntypedef void (APIENTRYP pfn_glDisableiOES) (GLenum, GLuint);\nextern pfn_glDisableiOES fp_glDisableiOES;\ntypedef void (APIENTRYP pfn_glBlendEquationiOES) (GLuint, GLenum);\nextern pfn_glBlendEquationiOES fp_glBlendEquationiOES;\ntypedef void (APIENTRYP pfn_glBlendEquationSeparateiOES) (GLuint, GLenum, GLenum);\nextern pfn_glBlendEquationSeparateiOES fp_glBlendEquationSeparateiOES;\ntypedef void (APIENTRYP pfn_glBlendFunciOES) (GLuint, GLenum, GLenum);\nextern pfn_glBlendFunciOES fp_glBlendFunciOES;\ntypedef void (APIENTRYP pfn_glBlendFuncSeparateiOES) (GLuint, GLenum, GLenum, GLenum, GLenum);\nextern pfn_glBlendFuncSeparateiOES fp_glBlendFuncSeparateiOES;\ntypedef void (APIENTRYP pfn_glColorMaskiOES) (GLuint, GLboolean, GLboolean, GLboolean, GLboolean);\nextern pfn_glColorMaskiOES fp_glColorMaskiOES;\ntypedef GLboolean (APIENTRYP pfn_glIsEnablediOES) (GLenum, GLuint);\nextern pfn_glIsEnablediOES fp_glIsEnablediOES;\n\n /* GL_OES_draw_elements_base_vertex */\nextern GLboolean GLAD_OES_draw_elements_base_vertex;\ntypedef void (APIENTRYP pfn_glDrawElementsBaseVertexOES) (GLenum, GLsizei, GLenum, const void*, GLint);\nextern pfn_glDrawElementsBaseVertexOES fp_glDrawElementsBaseVertexOES;\ntypedef void (APIENTRYP pfn_glDrawRangeElementsBaseVertexOES) (GLenum, GLuint, GLuint, GLsizei, GLenum, const void*, GLint);\nextern pfn_glDrawRangeElementsBaseVertexOES fp_glDrawRangeElementsBaseVertexOES;\ntypedef void (APIENTRYP pfn_glDrawElementsInstancedBaseVertexOES) (GLenum, GLsizei, GLenum, const void*, GLsizei, GLint);\nextern pfn_glDrawElementsInstancedBaseVertexOES fp_glDrawElementsInstancedBaseVertexOES;\ntypedef void (APIENTRYP pfn_glMultiDrawElementsBaseVertexOES) (GLenum, const GLsizei*, GLenum, const void**, GLsizei, const GLint*);\nextern pfn_glMultiDrawElementsBaseVertexOES fp_glMultiDrawElementsBaseVertexOES;\n\n /* GL_OES_EGL_image */\nextern GLboolean GLAD_OES_EGL_image;\ntypedef void (APIENTRYP pfn_glEGLImageTargetTexture2DOES) (GLenum, GLeglImageOES);\nextern pfn_glEGLImageTargetTexture2DOES fp_glEGLImageTargetTexture2DOES;\ntypedef void (APIENTRYP pfn_glEGLImageTargetRenderbufferStorageOES) (GLenum, GLeglImageOES);\nextern pfn_glEGLImageTargetRenderbufferStorageOES fp_glEGLImageTargetRenderbufferStorageOES;\n\n /* GL_OES_EGL_image_external */\nextern GLboolean GLAD_OES_EGL_image_external;\n#define GL_SAMPLER_EXTERNAL_OES                0x8D66\n\n /* GL_OES_EGL_image_external_essl3 */\nextern GLboolean GLAD_OES_EGL_image_external_essl3;\n\n /* GL_OES_element_index_uint */\nextern GLboolean GLAD_OES_element_index_uint;\n\n /* GL_OES_fbo_render_mipmap */\nextern GLboolean GLAD_OES_fbo_render_mipmap;\n\n /* GL_OES_fragment_precision_high */\nextern GLboolean GLAD_OES_fragment_precision_high;\n\n /* GL_OES_geometry_point_size */\nextern GLboolean GLAD_OES_geometry_point_size;\n\n /* GL_OES_geometry_shader */\nextern GLboolean GLAD_OES_geometry_shader;\n#define GL_GEOMETRY_SHADER_OES                 0x8DD9\n#define GL_GEOMETRY_SHADER_BIT_OES             0x00000004\n#define GL_GEOMETRY_LINKED_VERTICES_OUT_OES    0x8916\n#define GL_GEOMETRY_LINKED_INPUT_TYPE_OES      0x8917\n#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_OES     0x8918\n#define GL_GEOMETRY_SHADER_INVOCATIONS_OES     0x887F\n#define GL_LAYER_PROVOKING_VERTEX_OES          0x825E\n#define GL_LINES_ADJACENCY_OES                 0x000A\n#define GL_LINE_STRIP_ADJACENCY_OES            0x000B\n#define GL_TRIANGLES_ADJACENCY_OES             0x000C\n#define GL_TRIANGLE_STRIP_ADJACENCY_OES        0x000D\n#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_OES  0x8DDF\n#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_OES     0x8A2C\n#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_OES  0x8A32\n#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_OES   0x9123\n#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_OES  0x9124\n#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_OES    0x8DE0\n#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_OES  0x8DE1\n#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_OES  0x8E5A\n#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_OES  0x8C29\n#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_OES  0x92CF\n#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_OES    0x92D5\n#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_OES     0x90CD\n#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_OES  0x90D7\n#define GL_FIRST_VERTEX_CONVENTION_OES         0x8E4D\n#define GL_LAST_VERTEX_CONVENTION_OES          0x8E4E\n#define GL_UNDEFINED_VERTEX_OES                0x8260\n#define GL_PRIMITIVES_GENERATED_OES            0x8C87\n#define GL_FRAMEBUFFER_DEFAULT_LAYERS_OES      0x9312\n#define GL_MAX_FRAMEBUFFER_LAYERS_OES          0x9317\n#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_OES  0x8DA8\n#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_OES  0x8DA7\n#define GL_REFERENCED_BY_GEOMETRY_SHADER_OES   0x9309\ntypedef void (APIENTRYP pfn_glFramebufferTextureOES) (GLenum, GLenum, GLuint, GLint);\nextern pfn_glFramebufferTextureOES fp_glFramebufferTextureOES;\n\n /* GL_OES_get_program_binary */\nextern GLboolean GLAD_OES_get_program_binary;\n#define GL_PROGRAM_BINARY_LENGTH_OES           0x8741\n#define GL_NUM_PROGRAM_BINARY_FORMATS_OES      0x87FE\n#define GL_PROGRAM_BINARY_FORMATS_OES          0x87FF\ntypedef void (APIENTRYP pfn_glGetProgramBinaryOES) (GLuint, GLsizei, GLsizei*, GLenum*, void*);\nextern pfn_glGetProgramBinaryOES fp_glGetProgramBinaryOES;\ntypedef void (APIENTRYP pfn_glProgramBinaryOES) (GLuint, GLenum, const void*, GLint);\nextern pfn_glProgramBinaryOES fp_glProgramBinaryOES;\n\n /* GL_OES_gpu_shader5 */\nextern GLboolean GLAD_OES_gpu_shader5;\n\n /* GL_OES_mapbuffer */\nextern GLboolean GLAD_OES_mapbuffer;\n#define GL_WRITE_ONLY_OES                      0x88B9\n#define GL_BUFFER_ACCESS_OES                   0x88BB\n#define GL_BUFFER_MAPPED_OES                   0x88BC\n#define GL_BUFFER_MAP_POINTER_OES              0x88BD\ntypedef void* (APIENTRYP pfn_glMapBufferOES) (GLenum, GLenum);\nextern pfn_glMapBufferOES fp_glMapBufferOES;\ntypedef GLboolean (APIENTRYP pfn_glUnmapBufferOES) (GLenum);\nextern pfn_glUnmapBufferOES fp_glUnmapBufferOES;\ntypedef void (APIENTRYP pfn_glGetBufferPointervOES) (GLenum, GLenum, void**);\nextern pfn_glGetBufferPointervOES fp_glGetBufferPointervOES;\n\n /* GL_OES_packed_depth_stencil */\nextern GLboolean GLAD_OES_packed_depth_stencil;\n#define GL_DEPTH_STENCIL_OES                   0x84F9\n#define GL_UNSIGNED_INT_24_8_OES               0x84FA\n#define GL_DEPTH24_STENCIL8_OES                0x88F0\n\n /* GL_OES_primitive_bounding_box */\nextern GLboolean GLAD_OES_primitive_bounding_box;\n#define GL_PRIMITIVE_BOUNDING_BOX_OES          0x92BE\ntypedef void (APIENTRYP pfn_glPrimitiveBoundingBoxOES) (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);\nextern pfn_glPrimitiveBoundingBoxOES fp_glPrimitiveBoundingBoxOES;\n\n /* GL_OES_required_internalformat */\nextern GLboolean GLAD_OES_required_internalformat;\n#define GL_ALPHA8_OES                          0x803C\n#define GL_DEPTH_COMPONENT16_OES               0x81A5\n#define GL_LUMINANCE4_ALPHA4_OES               0x8043\n#define GL_LUMINANCE8_ALPHA8_OES               0x8045\n#define GL_LUMINANCE8_OES                      0x8040\n#define GL_RGBA4_OES                           0x8056\n#define GL_RGB5_A1_OES                         0x8057\n#define GL_RGB565_OES                          0x8D62\n#define GL_RGB8_OES                            0x8051\n#define GL_RGBA8_OES                           0x8058\n\n /* GL_OES_rgb8_rgba8 */\nextern GLboolean GLAD_OES_rgb8_rgba8;\n\n /* GL_OES_sample_shading */\nextern GLboolean GLAD_OES_sample_shading;\n#define GL_SAMPLE_SHADING_OES                  0x8C36\n#define GL_MIN_SAMPLE_SHADING_VALUE_OES        0x8C37\ntypedef void (APIENTRYP pfn_glMinSampleShadingOES) (GLfloat);\nextern pfn_glMinSampleShadingOES fp_glMinSampleShadingOES;\n\n /* GL_OES_sample_variables */\nextern GLboolean GLAD_OES_sample_variables;\n\n /* GL_OES_shader_image_atomic */\nextern GLboolean GLAD_OES_shader_image_atomic;\n\n /* GL_OES_shader_io_blocks */\nextern GLboolean GLAD_OES_shader_io_blocks;\n\n /* GL_OES_shader_multisample_interpolation */\nextern GLboolean GLAD_OES_shader_multisample_interpolation;\n#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_OES  0x8E5B\n#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_OES  0x8E5C\n#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS_OES  0x8E5D\n\n /* GL_OES_standard_derivatives */\nextern GLboolean GLAD_OES_standard_derivatives;\n#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES  0x8B8B\n\n /* GL_OES_stencil1 */\nextern GLboolean GLAD_OES_stencil1;\n#define GL_STENCIL_INDEX1_OES                  0x8D46\n\n /* GL_OES_stencil4 */\nextern GLboolean GLAD_OES_stencil4;\n#define GL_STENCIL_INDEX4_OES                  0x8D47\n\n /* GL_OES_surfaceless_context */\nextern GLboolean GLAD_OES_surfaceless_context;\n#define GL_FRAMEBUFFER_UNDEFINED_OES           0x8219\n\n /* GL_OES_tessellation_point_size */\nextern GLboolean GLAD_OES_tessellation_point_size;\n\n /* GL_OES_tessellation_shader */\nextern GLboolean GLAD_OES_tessellation_shader;\n#define GL_PATCHES_OES                         0x000E\n#define GL_PATCH_VERTICES_OES                  0x8E72\n#define GL_TESS_CONTROL_OUTPUT_VERTICES_OES    0x8E75\n#define GL_TESS_GEN_MODE_OES                   0x8E76\n#define GL_TESS_GEN_SPACING_OES                0x8E77\n#define GL_TESS_GEN_VERTEX_ORDER_OES           0x8E78\n#define GL_TESS_GEN_POINT_MODE_OES             0x8E79\n#define GL_ISOLINES_OES                        0x8E7A\n#define GL_QUADS_OES                           0x0007\n#define GL_FRACTIONAL_ODD_OES                  0x8E7B\n#define GL_FRACTIONAL_EVEN_OES                 0x8E7C\n#define GL_MAX_PATCH_VERTICES_OES              0x8E7D\n#define GL_MAX_TESS_GEN_LEVEL_OES              0x8E7E\n#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_OES  0x8E7F\n#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_OES  0x8E80\n#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_OES  0x8E81\n#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_OES  0x8E82\n#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_OES  0x8E83\n#define GL_MAX_TESS_PATCH_COMPONENTS_OES       0x8E84\n#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_OES  0x8E85\n#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_OES  0x8E86\n#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_OES  0x8E89\n#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_OES  0x8E8A\n#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_OES  0x886C\n#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_OES  0x886D\n#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_OES  0x8E1E\n#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_OES  0x8E1F\n#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_OES  0x92CD\n#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_OES  0x92CE\n#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_OES  0x92D3\n#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_OES  0x92D4\n#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_OES  0x90CB\n#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_OES  0x90CC\n#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_OES  0x90D8\n#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_OES  0x90D9\n#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED_OES  0x8221\n#define GL_IS_PER_PATCH_OES                    0x92E7\n#define GL_REFERENCED_BY_TESS_CONTROL_SHADER_OES  0x9307\n#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER_OES  0x9308\n#define GL_TESS_CONTROL_SHADER_OES             0x8E88\n#define GL_TESS_EVALUATION_SHADER_OES          0x8E87\n#define GL_TESS_CONTROL_SHADER_BIT_OES         0x00000008\n#define GL_TESS_EVALUATION_SHADER_BIT_OES      0x00000010\ntypedef void (APIENTRYP pfn_glPatchParameteriOES) (GLenum, GLint);\nextern pfn_glPatchParameteriOES fp_glPatchParameteriOES;\n\n /* GL_OES_texture_3D */\nextern GLboolean GLAD_OES_texture_3D;\n#define GL_TEXTURE_WRAP_R_OES                  0x8072\n#define GL_TEXTURE_3D_OES                      0x806F\n#define GL_TEXTURE_BINDING_3D_OES              0x806A\n#define GL_MAX_3D_TEXTURE_SIZE_OES             0x8073\n#define GL_SAMPLER_3D_OES                      0x8B5F\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES  0x8CD4\ntypedef void (APIENTRYP pfn_glTexImage3DOES) (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const void*);\nextern pfn_glTexImage3DOES fp_glTexImage3DOES;\ntypedef void (APIENTRYP pfn_glTexSubImage3DOES) (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void*);\nextern pfn_glTexSubImage3DOES fp_glTexSubImage3DOES;\ntypedef void (APIENTRYP pfn_glCopyTexSubImage3DOES) (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei);\nextern pfn_glCopyTexSubImage3DOES fp_glCopyTexSubImage3DOES;\ntypedef void (APIENTRYP pfn_glCompressedTexImage3DOES) (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const void*);\nextern pfn_glCompressedTexImage3DOES fp_glCompressedTexImage3DOES;\ntypedef void (APIENTRYP pfn_glCompressedTexSubImage3DOES) (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const void*);\nextern pfn_glCompressedTexSubImage3DOES fp_glCompressedTexSubImage3DOES;\ntypedef void (APIENTRYP pfn_glFramebufferTexture3DOES) (GLenum, GLenum, GLenum, GLuint, GLint, GLint);\nextern pfn_glFramebufferTexture3DOES fp_glFramebufferTexture3DOES;\n\n /* GL_OES_texture_border_clamp */\nextern GLboolean GLAD_OES_texture_border_clamp;\n#define GL_TEXTURE_BORDER_COLOR_OES            0x1004\n#define GL_CLAMP_TO_BORDER_OES                 0x812D\ntypedef void (APIENTRYP pfn_glTexParameterIivOES) (GLenum, GLenum, const GLint*);\nextern pfn_glTexParameterIivOES fp_glTexParameterIivOES;\ntypedef void (APIENTRYP pfn_glTexParameterIuivOES) (GLenum, GLenum, const GLuint*);\nextern pfn_glTexParameterIuivOES fp_glTexParameterIuivOES;\ntypedef void (APIENTRYP pfn_glGetTexParameterIivOES) (GLenum, GLenum, GLint*);\nextern pfn_glGetTexParameterIivOES fp_glGetTexParameterIivOES;\ntypedef void (APIENTRYP pfn_glGetTexParameterIuivOES) (GLenum, GLenum, GLuint*);\nextern pfn_glGetTexParameterIuivOES fp_glGetTexParameterIuivOES;\ntypedef void (APIENTRYP pfn_glSamplerParameterIivOES) (GLuint, GLenum, const GLint*);\nextern pfn_glSamplerParameterIivOES fp_glSamplerParameterIivOES;\ntypedef void (APIENTRYP pfn_glSamplerParameterIuivOES) (GLuint, GLenum, const GLuint*);\nextern pfn_glSamplerParameterIuivOES fp_glSamplerParameterIuivOES;\ntypedef void (APIENTRYP pfn_glGetSamplerParameterIivOES) (GLuint, GLenum, GLint*);\nextern pfn_glGetSamplerParameterIivOES fp_glGetSamplerParameterIivOES;\ntypedef void (APIENTRYP pfn_glGetSamplerParameterIuivOES) (GLuint, GLenum, GLuint*);\nextern pfn_glGetSamplerParameterIuivOES fp_glGetSamplerParameterIuivOES;\n\n /* GL_OES_texture_buffer */\nextern GLboolean GLAD_OES_texture_buffer;\n#define GL_TEXTURE_BUFFER_OES                  0x8C2A\n#define GL_TEXTURE_BUFFER_BINDING_OES          0x8C2A\n#define GL_MAX_TEXTURE_BUFFER_SIZE_OES         0x8C2B\n#define GL_TEXTURE_BINDING_BUFFER_OES          0x8C2C\n#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_OES  0x8C2D\n#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_OES  0x919F\n#define GL_SAMPLER_BUFFER_OES                  0x8DC2\n#define GL_INT_SAMPLER_BUFFER_OES              0x8DD0\n#define GL_UNSIGNED_INT_SAMPLER_BUFFER_OES     0x8DD8\n#define GL_IMAGE_BUFFER_OES                    0x9051\n#define GL_INT_IMAGE_BUFFER_OES                0x905C\n#define GL_UNSIGNED_INT_IMAGE_BUFFER_OES       0x9067\n#define GL_TEXTURE_BUFFER_OFFSET_OES           0x919D\n#define GL_TEXTURE_BUFFER_SIZE_OES             0x919E\ntypedef void (APIENTRYP pfn_glTexBufferOES) (GLenum, GLenum, GLuint);\nextern pfn_glTexBufferOES fp_glTexBufferOES;\ntypedef void (APIENTRYP pfn_glTexBufferRangeOES) (GLenum, GLenum, GLuint, GLintptr, GLsizeiptr);\nextern pfn_glTexBufferRangeOES fp_glTexBufferRangeOES;\n\n /* GL_OES_texture_compression_astc */\nextern GLboolean GLAD_OES_texture_compression_astc;\n#define GL_COMPRESSED_RGBA_ASTC_3x3x3_OES      0x93C0\n#define GL_COMPRESSED_RGBA_ASTC_4x3x3_OES      0x93C1\n#define GL_COMPRESSED_RGBA_ASTC_4x4x3_OES      0x93C2\n#define GL_COMPRESSED_RGBA_ASTC_4x4x4_OES      0x93C3\n#define GL_COMPRESSED_RGBA_ASTC_5x4x4_OES      0x93C4\n#define GL_COMPRESSED_RGBA_ASTC_5x5x4_OES      0x93C5\n#define GL_COMPRESSED_RGBA_ASTC_5x5x5_OES      0x93C6\n#define GL_COMPRESSED_RGBA_ASTC_6x5x5_OES      0x93C7\n#define GL_COMPRESSED_RGBA_ASTC_6x6x5_OES      0x93C8\n#define GL_COMPRESSED_RGBA_ASTC_6x6x6_OES      0x93C9\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES  0x93E0\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES  0x93E1\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES  0x93E2\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES  0x93E3\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES  0x93E4\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES  0x93E5\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES  0x93E6\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES  0x93E7\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES  0x93E8\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES  0x93E9\n\n /* GL_OES_texture_cube_map_array */\nextern GLboolean GLAD_OES_texture_cube_map_array;\n#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_OES  0x900A\n#define GL_SAMPLER_CUBE_MAP_ARRAY_OES          0x900C\n#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_OES   0x900D\n#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_OES      0x900E\n#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_OES  0x900F\n#define GL_IMAGE_CUBE_MAP_ARRAY_OES            0x9054\n#define GL_INT_IMAGE_CUBE_MAP_ARRAY_OES        0x905F\n#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_OES  0x906A\n\n /* GL_OES_texture_float */\nextern GLboolean GLAD_OES_texture_float;\n\n /* GL_OES_texture_float_linear */\nextern GLboolean GLAD_OES_texture_float_linear;\n\n /* GL_OES_texture_half_float */\nextern GLboolean GLAD_OES_texture_half_float;\n#define GL_HALF_FLOAT_OES                      0x8D61\n\n /* GL_OES_texture_half_float_linear */\nextern GLboolean GLAD_OES_texture_half_float_linear;\n\n /* GL_OES_texture_npot */\nextern GLboolean GLAD_OES_texture_npot;\n\n /* GL_OES_texture_stencil8 */\nextern GLboolean GLAD_OES_texture_stencil8;\n#define GL_STENCIL_INDEX_OES                   0x1901\n#define GL_STENCIL_INDEX8_OES                  0x8D48\n\n /* GL_OES_texture_storage_multisample_2d_array */\nextern GLboolean GLAD_OES_texture_storage_multisample_2d_array;\n#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES    0x9102\n#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY_OES  0x9105\n#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY_OES    0x910B\n#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES  0x910C\n#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES  0x910D\ntypedef void (APIENTRYP pfn_glTexStorage3DMultisampleOES) (GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei, GLboolean);\nextern pfn_glTexStorage3DMultisampleOES fp_glTexStorage3DMultisampleOES;\n\n /* GL_OES_texture_view */\nextern GLboolean GLAD_OES_texture_view;\n#define GL_TEXTURE_VIEW_MIN_LEVEL_OES          0x82DB\n#define GL_TEXTURE_VIEW_NUM_LEVELS_OES         0x82DC\n#define GL_TEXTURE_VIEW_MIN_LAYER_OES          0x82DD\n#define GL_TEXTURE_VIEW_NUM_LAYERS_OES         0x82DE\ntypedef void (APIENTRYP pfn_glTextureViewOES) (GLuint, GLenum, GLuint, GLenum, GLuint, GLuint, GLuint, GLuint);\nextern pfn_glTextureViewOES fp_glTextureViewOES;\n\n /* GL_OES_vertex_array_object */\nextern GLboolean GLAD_OES_vertex_array_object;\n#define GL_VERTEX_ARRAY_BINDING_OES            0x85B5\ntypedef void (APIENTRYP pfn_glBindVertexArrayOES) (GLuint);\nextern pfn_glBindVertexArrayOES fp_glBindVertexArrayOES;\ntypedef void (APIENTRYP pfn_glDeleteVertexArraysOES) (GLsizei, const GLuint*);\nextern pfn_glDeleteVertexArraysOES fp_glDeleteVertexArraysOES;\ntypedef void (APIENTRYP pfn_glGenVertexArraysOES) (GLsizei, GLuint*);\nextern pfn_glGenVertexArraysOES fp_glGenVertexArraysOES;\ntypedef GLboolean (APIENTRYP pfn_glIsVertexArrayOES) (GLuint);\nextern pfn_glIsVertexArrayOES fp_glIsVertexArrayOES;\n\n /* GL_OES_vertex_half_float */\nextern GLboolean GLAD_OES_vertex_half_float;\n\n /* GL_OES_vertex_type_10_10_10_2 */\nextern GLboolean GLAD_OES_vertex_type_10_10_10_2;\n#define GL_UNSIGNED_INT_10_10_10_2_OES         0x8DF6\n#define GL_INT_10_10_10_2_OES                  0x8DF7\n\n /* GL_AMD_blend_minmax_factor */\nextern GLboolean GLAD_AMD_blend_minmax_factor;\n#define GL_FACTOR_MIN_AMD                      0x901C\n#define GL_FACTOR_MAX_AMD                      0x901D\n\n /* GL_AMD_compressed_3DC_texture */\nextern GLboolean GLAD_AMD_compressed_3DC_texture;\n#define GL_3DC_X_AMD                           0x87F9\n#define GL_3DC_XY_AMD                          0x87FA\n\n /* GL_AMD_compressed_ATC_texture */\nextern GLboolean GLAD_AMD_compressed_ATC_texture;\n#define GL_ATC_RGB_AMD                         0x8C92\n#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD         0x8C93\n#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD     0x87EE\n\n /* GL_AMD_conservative_depth */\nextern GLboolean GLAD_AMD_conservative_depth;\n\n /* GL_AMD_debug_output */\nextern GLboolean GLAD_AMD_debug_output;\n#define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD        0x9143\n#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD       0x9144\n#define GL_DEBUG_LOGGED_MESSAGES_AMD           0x9145\n#define GL_DEBUG_SEVERITY_HIGH_AMD             0x9146\n#define GL_DEBUG_SEVERITY_MEDIUM_AMD           0x9147\n#define GL_DEBUG_SEVERITY_LOW_AMD              0x9148\n#define GL_DEBUG_CATEGORY_API_ERROR_AMD        0x9149\n#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD    0x914A\n#define GL_DEBUG_CATEGORY_DEPRECATION_AMD      0x914B\n#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD  0x914C\n#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD      0x914D\n#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD  0x914E\n#define GL_DEBUG_CATEGORY_APPLICATION_AMD      0x914F\n#define GL_DEBUG_CATEGORY_OTHER_AMD            0x9150\ntypedef void (APIENTRYP pfn_glDebugMessageEnableAMD) (GLenum, GLenum, GLsizei, const GLuint*, GLboolean);\nextern pfn_glDebugMessageEnableAMD fp_glDebugMessageEnableAMD;\ntypedef void (APIENTRYP pfn_glDebugMessageInsertAMD) (GLenum, GLenum, GLuint, GLsizei, const GLchar*);\nextern pfn_glDebugMessageInsertAMD fp_glDebugMessageInsertAMD;\ntypedef void (APIENTRYP pfn_glDebugMessageCallbackAMD) (GLDEBUGPROCAMD, void*);\nextern pfn_glDebugMessageCallbackAMD fp_glDebugMessageCallbackAMD;\ntypedef GLuint (APIENTRYP pfn_glGetDebugMessageLogAMD) (GLuint, GLsizei, GLenum*, GLuint*, GLuint*, GLsizei*, GLchar*);\nextern pfn_glGetDebugMessageLogAMD fp_glGetDebugMessageLogAMD;\n\n /* GL_AMD_depth_clamp_separate */\nextern GLboolean GLAD_AMD_depth_clamp_separate;\n#define GL_DEPTH_CLAMP_NEAR_AMD                0x901E\n#define GL_DEPTH_CLAMP_FAR_AMD                 0x901F\n\n /* GL_AMD_draw_buffers_blend */\nextern GLboolean GLAD_AMD_draw_buffers_blend;\ntypedef void (APIENTRYP pfn_glBlendFuncIndexedAMD) (GLuint, GLenum, GLenum);\nextern pfn_glBlendFuncIndexedAMD fp_glBlendFuncIndexedAMD;\ntypedef void (APIENTRYP pfn_glBlendFuncSeparateIndexedAMD) (GLuint, GLenum, GLenum, GLenum, GLenum);\nextern pfn_glBlendFuncSeparateIndexedAMD fp_glBlendFuncSeparateIndexedAMD;\ntypedef void (APIENTRYP pfn_glBlendEquationIndexedAMD) (GLuint, GLenum);\nextern pfn_glBlendEquationIndexedAMD fp_glBlendEquationIndexedAMD;\ntypedef void (APIENTRYP pfn_glBlendEquationSeparateIndexedAMD) (GLuint, GLenum, GLenum);\nextern pfn_glBlendEquationSeparateIndexedAMD fp_glBlendEquationSeparateIndexedAMD;\n\n /* GL_AMD_gcn_shader */\nextern GLboolean GLAD_AMD_gcn_shader;\n\n /* GL_AMD_gpu_shader_int64 */\nextern GLboolean GLAD_AMD_gpu_shader_int64;\n#define GL_INT64_NV                            0x140E\n#define GL_UNSIGNED_INT64_NV                   0x140F\n#define GL_INT8_NV                             0x8FE0\n#define GL_INT8_VEC2_NV                        0x8FE1\n#define GL_INT8_VEC3_NV                        0x8FE2\n#define GL_INT8_VEC4_NV                        0x8FE3\n#define GL_INT16_NV                            0x8FE4\n#define GL_INT16_VEC2_NV                       0x8FE5\n#define GL_INT16_VEC3_NV                       0x8FE6\n#define GL_INT16_VEC4_NV                       0x8FE7\n#define GL_INT64_VEC2_NV                       0x8FE9\n#define GL_INT64_VEC3_NV                       0x8FEA\n#define GL_INT64_VEC4_NV                       0x8FEB\n#define GL_UNSIGNED_INT8_NV                    0x8FEC\n#define GL_UNSIGNED_INT8_VEC2_NV               0x8FED\n#define GL_UNSIGNED_INT8_VEC3_NV               0x8FEE\n#define GL_UNSIGNED_INT8_VEC4_NV               0x8FEF\n#define GL_UNSIGNED_INT16_NV                   0x8FF0\n#define GL_UNSIGNED_INT16_VEC2_NV              0x8FF1\n#define GL_UNSIGNED_INT16_VEC3_NV              0x8FF2\n#define GL_UNSIGNED_INT16_VEC4_NV              0x8FF3\n#define GL_UNSIGNED_INT64_VEC2_NV              0x8FF5\n#define GL_UNSIGNED_INT64_VEC3_NV              0x8FF6\n#define GL_UNSIGNED_INT64_VEC4_NV              0x8FF7\n#define GL_FLOAT16_NV                          0x8FF8\n#define GL_FLOAT16_VEC2_NV                     0x8FF9\n#define GL_FLOAT16_VEC3_NV                     0x8FFA\n#define GL_FLOAT16_VEC4_NV                     0x8FFB\ntypedef void (APIENTRYP pfn_glUniform1i64NV) (GLint, GLint64EXT);\nextern pfn_glUniform1i64NV fp_glUniform1i64NV;\ntypedef void (APIENTRYP pfn_glUniform2i64NV) (GLint, GLint64EXT, GLint64EXT);\nextern pfn_glUniform2i64NV fp_glUniform2i64NV;\ntypedef void (APIENTRYP pfn_glUniform3i64NV) (GLint, GLint64EXT, GLint64EXT, GLint64EXT);\nextern pfn_glUniform3i64NV fp_glUniform3i64NV;\ntypedef void (APIENTRYP pfn_glUniform4i64NV) (GLint, GLint64EXT, GLint64EXT, GLint64EXT, GLint64EXT);\nextern pfn_glUniform4i64NV fp_glUniform4i64NV;\ntypedef void (APIENTRYP pfn_glUniform1i64vNV) (GLint, GLsizei, const GLint64EXT*);\nextern pfn_glUniform1i64vNV fp_glUniform1i64vNV;\ntypedef void (APIENTRYP pfn_glUniform2i64vNV) (GLint, GLsizei, const GLint64EXT*);\nextern pfn_glUniform2i64vNV fp_glUniform2i64vNV;\ntypedef void (APIENTRYP pfn_glUniform3i64vNV) (GLint, GLsizei, const GLint64EXT*);\nextern pfn_glUniform3i64vNV fp_glUniform3i64vNV;\ntypedef void (APIENTRYP pfn_glUniform4i64vNV) (GLint, GLsizei, const GLint64EXT*);\nextern pfn_glUniform4i64vNV fp_glUniform4i64vNV;\ntypedef void (APIENTRYP pfn_glUniform1ui64NV) (GLint, GLuint64EXT);\nextern pfn_glUniform1ui64NV fp_glUniform1ui64NV;\ntypedef void (APIENTRYP pfn_glUniform2ui64NV) (GLint, GLuint64EXT, GLuint64EXT);\nextern pfn_glUniform2ui64NV fp_glUniform2ui64NV;\ntypedef void (APIENTRYP pfn_glUniform3ui64NV) (GLint, GLuint64EXT, GLuint64EXT, GLuint64EXT);\nextern pfn_glUniform3ui64NV fp_glUniform3ui64NV;\ntypedef void (APIENTRYP pfn_glUniform4ui64NV) (GLint, GLuint64EXT, GLuint64EXT, GLuint64EXT, GLuint64EXT);\nextern pfn_glUniform4ui64NV fp_glUniform4ui64NV;\ntypedef void (APIENTRYP pfn_glUniform1ui64vNV) (GLint, GLsizei, const GLuint64EXT*);\nextern pfn_glUniform1ui64vNV fp_glUniform1ui64vNV;\ntypedef void (APIENTRYP pfn_glUniform2ui64vNV) (GLint, GLsizei, const GLuint64EXT*);\nextern pfn_glUniform2ui64vNV fp_glUniform2ui64vNV;\ntypedef void (APIENTRYP pfn_glUniform3ui64vNV) (GLint, GLsizei, const GLuint64EXT*);\nextern pfn_glUniform3ui64vNV fp_glUniform3ui64vNV;\ntypedef void (APIENTRYP pfn_glUniform4ui64vNV) (GLint, GLsizei, const GLuint64EXT*);\nextern pfn_glUniform4ui64vNV fp_glUniform4ui64vNV;\ntypedef void (APIENTRYP pfn_glGetUniformi64vNV) (GLuint, GLint, GLint64EXT*);\nextern pfn_glGetUniformi64vNV fp_glGetUniformi64vNV;\ntypedef void (APIENTRYP pfn_glGetUniformui64vNV) (GLuint, GLint, GLuint64EXT*);\nextern pfn_glGetUniformui64vNV fp_glGetUniformui64vNV;\ntypedef void (APIENTRYP pfn_glProgramUniform1i64NV) (GLuint, GLint, GLint64EXT);\nextern pfn_glProgramUniform1i64NV fp_glProgramUniform1i64NV;\ntypedef void (APIENTRYP pfn_glProgramUniform2i64NV) (GLuint, GLint, GLint64EXT, GLint64EXT);\nextern pfn_glProgramUniform2i64NV fp_glProgramUniform2i64NV;\ntypedef void (APIENTRYP pfn_glProgramUniform3i64NV) (GLuint, GLint, GLint64EXT, GLint64EXT, GLint64EXT);\nextern pfn_glProgramUniform3i64NV fp_glProgramUniform3i64NV;\ntypedef void (APIENTRYP pfn_glProgramUniform4i64NV) (GLuint, GLint, GLint64EXT, GLint64EXT, GLint64EXT, GLint64EXT);\nextern pfn_glProgramUniform4i64NV fp_glProgramUniform4i64NV;\ntypedef void (APIENTRYP pfn_glProgramUniform1i64vNV) (GLuint, GLint, GLsizei, const GLint64EXT*);\nextern pfn_glProgramUniform1i64vNV fp_glProgramUniform1i64vNV;\ntypedef void (APIENTRYP pfn_glProgramUniform2i64vNV) (GLuint, GLint, GLsizei, const GLint64EXT*);\nextern pfn_glProgramUniform2i64vNV fp_glProgramUniform2i64vNV;\ntypedef void (APIENTRYP pfn_glProgramUniform3i64vNV) (GLuint, GLint, GLsizei, const GLint64EXT*);\nextern pfn_glProgramUniform3i64vNV fp_glProgramUniform3i64vNV;\ntypedef void (APIENTRYP pfn_glProgramUniform4i64vNV) (GLuint, GLint, GLsizei, const GLint64EXT*);\nextern pfn_glProgramUniform4i64vNV fp_glProgramUniform4i64vNV;\ntypedef void (APIENTRYP pfn_glProgramUniform1ui64NV) (GLuint, GLint, GLuint64EXT);\nextern pfn_glProgramUniform1ui64NV fp_glProgramUniform1ui64NV;\ntypedef void (APIENTRYP pfn_glProgramUniform2ui64NV) (GLuint, GLint, GLuint64EXT, GLuint64EXT);\nextern pfn_glProgramUniform2ui64NV fp_glProgramUniform2ui64NV;\ntypedef void (APIENTRYP pfn_glProgramUniform3ui64NV) (GLuint, GLint, GLuint64EXT, GLuint64EXT, GLuint64EXT);\nextern pfn_glProgramUniform3ui64NV fp_glProgramUniform3ui64NV;\ntypedef void (APIENTRYP pfn_glProgramUniform4ui64NV) (GLuint, GLint, GLuint64EXT, GLuint64EXT, GLuint64EXT, GLuint64EXT);\nextern pfn_glProgramUniform4ui64NV fp_glProgramUniform4ui64NV;\ntypedef void (APIENTRYP pfn_glProgramUniform1ui64vNV) (GLuint, GLint, GLsizei, const GLuint64EXT*);\nextern pfn_glProgramUniform1ui64vNV fp_glProgramUniform1ui64vNV;\ntypedef void (APIENTRYP pfn_glProgramUniform2ui64vNV) (GLuint, GLint, GLsizei, const GLuint64EXT*);\nextern pfn_glProgramUniform2ui64vNV fp_glProgramUniform2ui64vNV;\ntypedef void (APIENTRYP pfn_glProgramUniform3ui64vNV) (GLuint, GLint, GLsizei, const GLuint64EXT*);\nextern pfn_glProgramUniform3ui64vNV fp_glProgramUniform3ui64vNV;\ntypedef void (APIENTRYP pfn_glProgramUniform4ui64vNV) (GLuint, GLint, GLsizei, const GLuint64EXT*);\nextern pfn_glProgramUniform4ui64vNV fp_glProgramUniform4ui64vNV;\n\n /* GL_AMD_interleaved_elements */\nextern GLboolean GLAD_AMD_interleaved_elements;\n#define GL_VERTEX_ELEMENT_SWIZZLE_AMD          0x91A4\n#define GL_VERTEX_ID_SWIZZLE_AMD               0x91A5\ntypedef void (APIENTRYP pfn_glVertexAttribParameteriAMD) (GLuint, GLenum, GLint);\nextern pfn_glVertexAttribParameteriAMD fp_glVertexAttribParameteriAMD;\n\n /* GL_AMD_multi_draw_indirect */\nextern GLboolean GLAD_AMD_multi_draw_indirect;\ntypedef void (APIENTRYP pfn_glMultiDrawArraysIndirectAMD) (GLenum, const void*, GLsizei, GLsizei);\nextern pfn_glMultiDrawArraysIndirectAMD fp_glMultiDrawArraysIndirectAMD;\ntypedef void (APIENTRYP pfn_glMultiDrawElementsIndirectAMD) (GLenum, GLenum, const void*, GLsizei, GLsizei);\nextern pfn_glMultiDrawElementsIndirectAMD fp_glMultiDrawElementsIndirectAMD;\n\n /* GL_AMD_name_gen_delete */\nextern GLboolean GLAD_AMD_name_gen_delete;\n#define GL_DATA_BUFFER_AMD                     0x9151\n#define GL_PERFORMANCE_MONITOR_AMD             0x9152\n#define GL_QUERY_OBJECT_AMD                    0x9153\n#define GL_VERTEX_ARRAY_OBJECT_AMD             0x9154\n#define GL_SAMPLER_OBJECT_AMD                  0x9155\ntypedef void (APIENTRYP pfn_glGenNamesAMD) (GLenum, GLuint, GLuint*);\nextern pfn_glGenNamesAMD fp_glGenNamesAMD;\ntypedef void (APIENTRYP pfn_glDeleteNamesAMD) (GLenum, GLuint, const GLuint*);\nextern pfn_glDeleteNamesAMD fp_glDeleteNamesAMD;\ntypedef GLboolean (APIENTRYP pfn_glIsNameAMD) (GLenum, GLuint);\nextern pfn_glIsNameAMD fp_glIsNameAMD;\n\n /* GL_AMD_occlusion_query_event */\nextern GLboolean GLAD_AMD_occlusion_query_event;\n#define GL_OCCLUSION_QUERY_EVENT_MASK_AMD      0x874F\n#define GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD      0x00000001\n#define GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD      0x00000002\n#define GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD    0x00000004\n#define GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD  0x00000008\n#define GL_QUERY_ALL_EVENT_BITS_AMD            0xFFFFFFFF\ntypedef void (APIENTRYP pfn_glQueryObjectParameteruiAMD) (GLenum, GLuint, GLenum, GLuint);\nextern pfn_glQueryObjectParameteruiAMD fp_glQueryObjectParameteruiAMD;\n\n /* GL_AMD_performance_monitor */\nextern GLboolean GLAD_AMD_performance_monitor;\n#define GL_COUNTER_TYPE_AMD                    0x8BC0\n#define GL_COUNTER_RANGE_AMD                   0x8BC1\n#define GL_UNSIGNED_INT64_AMD                  0x8BC2\n#define GL_PERCENTAGE_AMD                      0x8BC3\n#define GL_PERFMON_RESULT_AVAILABLE_AMD        0x8BC4\n#define GL_PERFMON_RESULT_SIZE_AMD             0x8BC5\n#define GL_PERFMON_RESULT_AMD                  0x8BC6\ntypedef void (APIENTRYP pfn_glGetPerfMonitorGroupsAMD) (GLint*, GLsizei, GLuint*);\nextern pfn_glGetPerfMonitorGroupsAMD fp_glGetPerfMonitorGroupsAMD;\ntypedef void (APIENTRYP pfn_glGetPerfMonitorCountersAMD) (GLuint, GLint*, GLint*, GLsizei, GLuint*);\nextern pfn_glGetPerfMonitorCountersAMD fp_glGetPerfMonitorCountersAMD;\ntypedef void (APIENTRYP pfn_glGetPerfMonitorGroupStringAMD) (GLuint, GLsizei, GLsizei*, GLchar*);\nextern pfn_glGetPerfMonitorGroupStringAMD fp_glGetPerfMonitorGroupStringAMD;\ntypedef void (APIENTRYP pfn_glGetPerfMonitorCounterStringAMD) (GLuint, GLuint, GLsizei, GLsizei*, GLchar*);\nextern pfn_glGetPerfMonitorCounterStringAMD fp_glGetPerfMonitorCounterStringAMD;\ntypedef void (APIENTRYP pfn_glGetPerfMonitorCounterInfoAMD) (GLuint, GLuint, GLenum, void*);\nextern pfn_glGetPerfMonitorCounterInfoAMD fp_glGetPerfMonitorCounterInfoAMD;\ntypedef void (APIENTRYP pfn_glGenPerfMonitorsAMD) (GLsizei, GLuint*);\nextern pfn_glGenPerfMonitorsAMD fp_glGenPerfMonitorsAMD;\ntypedef void (APIENTRYP pfn_glDeletePerfMonitorsAMD) (GLsizei, GLuint*);\nextern pfn_glDeletePerfMonitorsAMD fp_glDeletePerfMonitorsAMD;\ntypedef void (APIENTRYP pfn_glSelectPerfMonitorCountersAMD) (GLuint, GLboolean, GLuint, GLint, GLuint*);\nextern pfn_glSelectPerfMonitorCountersAMD fp_glSelectPerfMonitorCountersAMD;\ntypedef void (APIENTRYP pfn_glBeginPerfMonitorAMD) (GLuint);\nextern pfn_glBeginPerfMonitorAMD fp_glBeginPerfMonitorAMD;\ntypedef void (APIENTRYP pfn_glEndPerfMonitorAMD) (GLuint);\nextern pfn_glEndPerfMonitorAMD fp_glEndPerfMonitorAMD;\ntypedef void (APIENTRYP pfn_glGetPerfMonitorCounterDataAMD) (GLuint, GLenum, GLsizei, GLuint*, GLint*);\nextern pfn_glGetPerfMonitorCounterDataAMD fp_glGetPerfMonitorCounterDataAMD;\n\n /* GL_AMD_pinned_memory */\nextern GLboolean GLAD_AMD_pinned_memory;\n#define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD  0x9160\n\n /* GL_AMD_program_binary_Z400 */\nextern GLboolean GLAD_AMD_program_binary_Z400;\n#define GL_Z400_BINARY_AMD                     0x8740\n\n /* GL_AMD_query_buffer_object */\nextern GLboolean GLAD_AMD_query_buffer_object;\n#define GL_QUERY_BUFFER_AMD                    0x9192\n#define GL_QUERY_BUFFER_BINDING_AMD            0x9193\n#define GL_QUERY_RESULT_NO_WAIT_AMD            0x9194\n\n /* GL_AMD_sample_positions */\nextern GLboolean GLAD_AMD_sample_positions;\n#define GL_SUBSAMPLE_DISTANCE_AMD              0x883F\ntypedef void (APIENTRYP pfn_glSetMultisamplefvAMD) (GLenum, GLuint, const GLfloat*);\nextern pfn_glSetMultisamplefvAMD fp_glSetMultisamplefvAMD;\n\n /* GL_AMD_seamless_cubemap_per_texture */\nextern GLboolean GLAD_AMD_seamless_cubemap_per_texture;\n\n /* GL_AMD_shader_atomic_counter_ops */\nextern GLboolean GLAD_AMD_shader_atomic_counter_ops;\n\n /* GL_AMD_shader_stencil_export */\nextern GLboolean GLAD_AMD_shader_stencil_export;\n\n /* GL_AMD_shader_trinary_minmax */\nextern GLboolean GLAD_AMD_shader_trinary_minmax;\n\n /* GL_AMD_sparse_texture */\nextern GLboolean GLAD_AMD_sparse_texture;\n#define GL_VIRTUAL_PAGE_SIZE_X_AMD             0x9195\n#define GL_VIRTUAL_PAGE_SIZE_Y_AMD             0x9196\n#define GL_VIRTUAL_PAGE_SIZE_Z_AMD             0x9197\n#define GL_MAX_SPARSE_TEXTURE_SIZE_AMD         0x9198\n#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD      0x9199\n#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS     0x919A\n#define GL_MIN_SPARSE_LEVEL_AMD                0x919B\n#define GL_MIN_LOD_WARNING_AMD                 0x919C\n#define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD      0x00000001\ntypedef void (APIENTRYP pfn_glTexStorageSparseAMD) (GLenum, GLenum, GLsizei, GLsizei, GLsizei, GLsizei, GLbitfield);\nextern pfn_glTexStorageSparseAMD fp_glTexStorageSparseAMD;\ntypedef void (APIENTRYP pfn_glTextureStorageSparseAMD) (GLuint, GLenum, GLenum, GLsizei, GLsizei, GLsizei, GLsizei, GLbitfield);\nextern pfn_glTextureStorageSparseAMD fp_glTextureStorageSparseAMD;\n\n /* GL_AMD_stencil_operation_extended */\nextern GLboolean GLAD_AMD_stencil_operation_extended;\n#define GL_SET_AMD                             0x874A\n#define GL_REPLACE_VALUE_AMD                   0x874B\n#define GL_STENCIL_OP_VALUE_AMD                0x874C\n#define GL_STENCIL_BACK_OP_VALUE_AMD           0x874D\ntypedef void (APIENTRYP pfn_glStencilOpValueAMD) (GLenum, GLuint);\nextern pfn_glStencilOpValueAMD fp_glStencilOpValueAMD;\n\n /* GL_AMD_texture_texture4 */\nextern GLboolean GLAD_AMD_texture_texture4;\n\n /* GL_AMD_transform_feedback3_lines_triangles */\nextern GLboolean GLAD_AMD_transform_feedback3_lines_triangles;\n\n /* GL_AMD_transform_feedback4 */\nextern GLboolean GLAD_AMD_transform_feedback4;\n#define GL_STREAM_RASTERIZATION_AMD            0x91A0\n\n /* GL_AMD_vertex_shader_layer */\nextern GLboolean GLAD_AMD_vertex_shader_layer;\n\n /* GL_AMD_vertex_shader_tessellator */\nextern GLboolean GLAD_AMD_vertex_shader_tessellator;\n#define GL_SAMPLER_BUFFER_AMD                  0x9001\n#define GL_INT_SAMPLER_BUFFER_AMD              0x9002\n#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD     0x9003\n#define GL_TESSELLATION_MODE_AMD               0x9004\n#define GL_TESSELLATION_FACTOR_AMD             0x9005\n#define GL_DISCRETE_AMD                        0x9006\n#define GL_CONTINUOUS_AMD                      0x9007\ntypedef void (APIENTRYP pfn_glTessellationFactorAMD) (GLfloat);\nextern pfn_glTessellationFactorAMD fp_glTessellationFactorAMD;\ntypedef void (APIENTRYP pfn_glTessellationModeAMD) (GLenum);\nextern pfn_glTessellationModeAMD fp_glTessellationModeAMD;\n\n /* GL_AMD_vertex_shader_viewport_index */\nextern GLboolean GLAD_AMD_vertex_shader_viewport_index;\n\n /* GL_ANDROID_extension_pack_es31a */\nextern GLboolean GLAD_ANDROID_extension_pack_es31a;\n\n /* GL_ANGLE_depth_texture */\nextern GLboolean GLAD_ANGLE_depth_texture;\n\n /* GL_ANGLE_framebuffer_blit */\nextern GLboolean GLAD_ANGLE_framebuffer_blit;\n#define GL_READ_FRAMEBUFFER_ANGLE              0x8CA8\n#define GL_DRAW_FRAMEBUFFER_ANGLE              0x8CA9\n#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE      0x8CA6\n#define GL_READ_FRAMEBUFFER_BINDING_ANGLE      0x8CAA\ntypedef void (APIENTRYP pfn_glBlitFramebufferANGLE) (GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum);\nextern pfn_glBlitFramebufferANGLE fp_glBlitFramebufferANGLE;\n\n /* GL_ANGLE_framebuffer_multisample */\nextern GLboolean GLAD_ANGLE_framebuffer_multisample;\n#define GL_RENDERBUFFER_SAMPLES_ANGLE          0x8CAB\n#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE  0x8D56\n#define GL_MAX_SAMPLES_ANGLE                   0x8D57\ntypedef void (APIENTRYP pfn_glRenderbufferStorageMultisampleANGLE) (GLenum, GLsizei, GLenum, GLsizei, GLsizei);\nextern pfn_glRenderbufferStorageMultisampleANGLE fp_glRenderbufferStorageMultisampleANGLE;\n\n /* GL_ANGLE_instanced_arrays */\nextern GLboolean GLAD_ANGLE_instanced_arrays;\n#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE   0x88FE\ntypedef void (APIENTRYP pfn_glDrawArraysInstancedANGLE) (GLenum, GLint, GLsizei, GLsizei);\nextern pfn_glDrawArraysInstancedANGLE fp_glDrawArraysInstancedANGLE;\ntypedef void (APIENTRYP pfn_glDrawElementsInstancedANGLE) (GLenum, GLsizei, GLenum, const void*, GLsizei);\nextern pfn_glDrawElementsInstancedANGLE fp_glDrawElementsInstancedANGLE;\ntypedef void (APIENTRYP pfn_glVertexAttribDivisorANGLE) (GLuint, GLuint);\nextern pfn_glVertexAttribDivisorANGLE fp_glVertexAttribDivisorANGLE;\n\n /* GL_ANGLE_pack_reverse_row_order */\nextern GLboolean GLAD_ANGLE_pack_reverse_row_order;\n#define GL_PACK_REVERSE_ROW_ORDER_ANGLE        0x93A4\n\n /* GL_ANGLE_program_binary */\nextern GLboolean GLAD_ANGLE_program_binary;\n#define GL_PROGRAM_BINARY_ANGLE                0x93A6\n\n /* GL_ANGLE_texture_compression_dxt3 */\nextern GLboolean GLAD_ANGLE_texture_compression_dxt3;\n#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE     0x83F2\n\n /* GL_ANGLE_texture_compression_dxt5 */\nextern GLboolean GLAD_ANGLE_texture_compression_dxt5;\n#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE     0x83F3\n\n /* GL_ANGLE_texture_usage */\nextern GLboolean GLAD_ANGLE_texture_usage;\n#define GL_TEXTURE_USAGE_ANGLE                 0x93A2\n#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE        0x93A3\n\n /* GL_ANGLE_translated_shader_source */\nextern GLboolean GLAD_ANGLE_translated_shader_source;\n#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE  0x93A0\ntypedef void (APIENTRYP pfn_glGetTranslatedShaderSourceANGLE) (GLuint, GLsizei, GLsizei*, GLchar*);\nextern pfn_glGetTranslatedShaderSourceANGLE fp_glGetTranslatedShaderSourceANGLE;\n\n /* GL_APPLE_aux_depth_stencil */\nextern GLboolean GLAD_APPLE_aux_depth_stencil;\n#define GL_AUX_DEPTH_STENCIL_APPLE             0x8A14\n\n /* GL_APPLE_client_storage */\nextern GLboolean GLAD_APPLE_client_storage;\n#define GL_UNPACK_CLIENT_STORAGE_APPLE         0x85B2\n\n /* GL_APPLE_clip_distance */\nextern GLboolean GLAD_APPLE_clip_distance;\n#define GL_MAX_CLIP_DISTANCES_APPLE            0x0D32\n#define GL_CLIP_DISTANCE0_APPLE                0x3000\n#define GL_CLIP_DISTANCE1_APPLE                0x3001\n#define GL_CLIP_DISTANCE2_APPLE                0x3002\n#define GL_CLIP_DISTANCE3_APPLE                0x3003\n#define GL_CLIP_DISTANCE4_APPLE                0x3004\n#define GL_CLIP_DISTANCE5_APPLE                0x3005\n#define GL_CLIP_DISTANCE6_APPLE                0x3006\n#define GL_CLIP_DISTANCE7_APPLE                0x3007\n\n /* GL_APPLE_color_buffer_packed_float */\nextern GLboolean GLAD_APPLE_color_buffer_packed_float;\n\n /* GL_APPLE_copy_texture_levels */\nextern GLboolean GLAD_APPLE_copy_texture_levels;\ntypedef void (APIENTRYP pfn_glCopyTextureLevelsAPPLE) (GLuint, GLuint, GLint, GLsizei);\nextern pfn_glCopyTextureLevelsAPPLE fp_glCopyTextureLevelsAPPLE;\n\n /* GL_APPLE_element_array */\nextern GLboolean GLAD_APPLE_element_array;\n#define GL_ELEMENT_ARRAY_APPLE                 0x8A0C\n#define GL_ELEMENT_ARRAY_TYPE_APPLE            0x8A0D\n#define GL_ELEMENT_ARRAY_POINTER_APPLE         0x8A0E\ntypedef void (APIENTRYP pfn_glElementPointerAPPLE) (GLenum, const void*);\nextern pfn_glElementPointerAPPLE fp_glElementPointerAPPLE;\ntypedef void (APIENTRYP pfn_glDrawElementArrayAPPLE) (GLenum, GLint, GLsizei);\nextern pfn_glDrawElementArrayAPPLE fp_glDrawElementArrayAPPLE;\ntypedef void (APIENTRYP pfn_glDrawRangeElementArrayAPPLE) (GLenum, GLuint, GLuint, GLint, GLsizei);\nextern pfn_glDrawRangeElementArrayAPPLE fp_glDrawRangeElementArrayAPPLE;\ntypedef void (APIENTRYP pfn_glMultiDrawElementArrayAPPLE) (GLenum, const GLint*, const GLsizei*, GLsizei);\nextern pfn_glMultiDrawElementArrayAPPLE fp_glMultiDrawElementArrayAPPLE;\ntypedef void (APIENTRYP pfn_glMultiDrawRangeElementArrayAPPLE) (GLenum, GLuint, GLuint, const GLint*, const GLsizei*, GLsizei);\nextern pfn_glMultiDrawRangeElementArrayAPPLE fp_glMultiDrawRangeElementArrayAPPLE;\n\n /* GL_APPLE_fence */\nextern GLboolean GLAD_APPLE_fence;\n#define GL_DRAW_PIXELS_APPLE                   0x8A0A\n#define GL_FENCE_APPLE                         0x8A0B\ntypedef void (APIENTRYP pfn_glGenFencesAPPLE) (GLsizei, GLuint*);\nextern pfn_glGenFencesAPPLE fp_glGenFencesAPPLE;\ntypedef void (APIENTRYP pfn_glDeleteFencesAPPLE) (GLsizei, const GLuint*);\nextern pfn_glDeleteFencesAPPLE fp_glDeleteFencesAPPLE;\ntypedef void (APIENTRYP pfn_glSetFenceAPPLE) (GLuint);\nextern pfn_glSetFenceAPPLE fp_glSetFenceAPPLE;\ntypedef GLboolean (APIENTRYP pfn_glIsFenceAPPLE) (GLuint);\nextern pfn_glIsFenceAPPLE fp_glIsFenceAPPLE;\ntypedef GLboolean (APIENTRYP pfn_glTestFenceAPPLE) (GLuint);\nextern pfn_glTestFenceAPPLE fp_glTestFenceAPPLE;\ntypedef void (APIENTRYP pfn_glFinishFenceAPPLE) (GLuint);\nextern pfn_glFinishFenceAPPLE fp_glFinishFenceAPPLE;\ntypedef GLboolean (APIENTRYP pfn_glTestObjectAPPLE) (GLenum, GLuint);\nextern pfn_glTestObjectAPPLE fp_glTestObjectAPPLE;\ntypedef void (APIENTRYP pfn_glFinishObjectAPPLE) (GLenum, GLint);\nextern pfn_glFinishObjectAPPLE fp_glFinishObjectAPPLE;\n\n /* GL_APPLE_float_pixels */\nextern GLboolean GLAD_APPLE_float_pixels;\n#define GL_HALF_APPLE                          0x140B\n#define GL_RGBA_FLOAT32_APPLE                  0x8814\n#define GL_RGB_FLOAT32_APPLE                   0x8815\n#define GL_ALPHA_FLOAT32_APPLE                 0x8816\n#define GL_INTENSITY_FLOAT32_APPLE             0x8817\n#define GL_LUMINANCE_FLOAT32_APPLE             0x8818\n#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE       0x8819\n#define GL_RGBA_FLOAT16_APPLE                  0x881A\n#define GL_RGB_FLOAT16_APPLE                   0x881B\n#define GL_ALPHA_FLOAT16_APPLE                 0x881C\n#define GL_INTENSITY_FLOAT16_APPLE             0x881D\n#define GL_LUMINANCE_FLOAT16_APPLE             0x881E\n#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE       0x881F\n#define GL_COLOR_FLOAT_APPLE                   0x8A0F\n\n /* GL_APPLE_flush_buffer_range */\nextern GLboolean GLAD_APPLE_flush_buffer_range;\n#define GL_BUFFER_SERIALIZED_MODIFY_APPLE      0x8A12\n#define GL_BUFFER_FLUSHING_UNMAP_APPLE         0x8A13\ntypedef void (APIENTRYP pfn_glBufferParameteriAPPLE) (GLenum, GLenum, GLint);\nextern pfn_glBufferParameteriAPPLE fp_glBufferParameteriAPPLE;\ntypedef void (APIENTRYP pfn_glFlushMappedBufferRangeAPPLE) (GLenum, GLintptr, GLsizeiptr);\nextern pfn_glFlushMappedBufferRangeAPPLE fp_glFlushMappedBufferRangeAPPLE;\n\n /* GL_APPLE_framebuffer_multisample */\nextern GLboolean GLAD_APPLE_framebuffer_multisample;\n#define GL_RENDERBUFFER_SAMPLES_APPLE          0x8CAB\n#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE  0x8D56\n#define GL_MAX_SAMPLES_APPLE                   0x8D57\n#define GL_READ_FRAMEBUFFER_APPLE              0x8CA8\n#define GL_DRAW_FRAMEBUFFER_APPLE              0x8CA9\n#define GL_DRAW_FRAMEBUFFER_BINDING_APPLE      0x8CA6\n#define GL_READ_FRAMEBUFFER_BINDING_APPLE      0x8CAA\ntypedef void (APIENTRYP pfn_glRenderbufferStorageMultisampleAPPLE) (GLenum, GLsizei, GLenum, GLsizei, GLsizei);\nextern pfn_glRenderbufferStorageMultisampleAPPLE fp_glRenderbufferStorageMultisampleAPPLE;\ntypedef void (APIENTRYP pfn_glResolveMultisampleFramebufferAPPLE) ();\nextern pfn_glResolveMultisampleFramebufferAPPLE fp_glResolveMultisampleFramebufferAPPLE;\n\n /* GL_APPLE_object_purgeable */\nextern GLboolean GLAD_APPLE_object_purgeable;\n#define GL_BUFFER_OBJECT_APPLE                 0x85B3\n#define GL_RELEASED_APPLE                      0x8A19\n#define GL_VOLATILE_APPLE                      0x8A1A\n#define GL_RETAINED_APPLE                      0x8A1B\n#define GL_UNDEFINED_APPLE                     0x8A1C\n#define GL_PURGEABLE_APPLE                     0x8A1D\ntypedef GLenum (APIENTRYP pfn_glObjectPurgeableAPPLE) (GLenum, GLuint, GLenum);\nextern pfn_glObjectPurgeableAPPLE fp_glObjectPurgeableAPPLE;\ntypedef GLenum (APIENTRYP pfn_glObjectUnpurgeableAPPLE) (GLenum, GLuint, GLenum);\nextern pfn_glObjectUnpurgeableAPPLE fp_glObjectUnpurgeableAPPLE;\ntypedef void (APIENTRYP pfn_glGetObjectParameterivAPPLE) (GLenum, GLuint, GLenum, GLint*);\nextern pfn_glGetObjectParameterivAPPLE fp_glGetObjectParameterivAPPLE;\n\n /* GL_APPLE_rgb_422 */\nextern GLboolean GLAD_APPLE_rgb_422;\n#define GL_RGB_422_APPLE                       0x8A1F\n#define GL_UNSIGNED_SHORT_8_8_APPLE            0x85BA\n#define GL_UNSIGNED_SHORT_8_8_REV_APPLE        0x85BB\n#define GL_RGB_RAW_422_APPLE                   0x8A51\n\n /* GL_APPLE_row_bytes */\nextern GLboolean GLAD_APPLE_row_bytes;\n#define GL_PACK_ROW_BYTES_APPLE                0x8A15\n#define GL_UNPACK_ROW_BYTES_APPLE              0x8A16\n\n /* GL_APPLE_sync */\nextern GLboolean GLAD_APPLE_sync;\n#define GL_SYNC_OBJECT_APPLE                   0x8A53\n#define GL_MAX_SERVER_WAIT_TIMEOUT_APPLE       0x9111\n#define GL_OBJECT_TYPE_APPLE                   0x9112\n#define GL_SYNC_CONDITION_APPLE                0x9113\n#define GL_SYNC_STATUS_APPLE                   0x9114\n#define GL_SYNC_FLAGS_APPLE                    0x9115\n#define GL_SYNC_FENCE_APPLE                    0x9116\n#define GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE    0x9117\n#define GL_UNSIGNALED_APPLE                    0x9118\n#define GL_SIGNALED_APPLE                      0x9119\n#define GL_ALREADY_SIGNALED_APPLE              0x911A\n#define GL_TIMEOUT_EXPIRED_APPLE               0x911B\n#define GL_CONDITION_SATISFIED_APPLE           0x911C\n#define GL_WAIT_FAILED_APPLE                   0x911D\n#define GL_SYNC_FLUSH_COMMANDS_BIT_APPLE       0x00000001\n#define GL_TIMEOUT_IGNORED_APPLE               0xFFFFFFFFFFFFFFFF\ntypedef GLsync (APIENTRYP pfn_glFenceSyncAPPLE) (GLenum, GLbitfield);\nextern pfn_glFenceSyncAPPLE fp_glFenceSyncAPPLE;\ntypedef GLboolean (APIENTRYP pfn_glIsSyncAPPLE) (GLsync);\nextern pfn_glIsSyncAPPLE fp_glIsSyncAPPLE;\ntypedef void (APIENTRYP pfn_glDeleteSyncAPPLE) (GLsync);\nextern pfn_glDeleteSyncAPPLE fp_glDeleteSyncAPPLE;\ntypedef GLenum (APIENTRYP pfn_glClientWaitSyncAPPLE) (GLsync, GLbitfield, GLuint64);\nextern pfn_glClientWaitSyncAPPLE fp_glClientWaitSyncAPPLE;\ntypedef void (APIENTRYP pfn_glWaitSyncAPPLE) (GLsync, GLbitfield, GLuint64);\nextern pfn_glWaitSyncAPPLE fp_glWaitSyncAPPLE;\ntypedef void (APIENTRYP pfn_glGetInteger64vAPPLE) (GLenum, GLint64*);\nextern pfn_glGetInteger64vAPPLE fp_glGetInteger64vAPPLE;\ntypedef void (APIENTRYP pfn_glGetSyncivAPPLE) (GLsync, GLenum, GLsizei, GLsizei*, GLint*);\nextern pfn_glGetSyncivAPPLE fp_glGetSyncivAPPLE;\n\n /* GL_APPLE_texture_format_BGRA8888 */\nextern GLboolean GLAD_APPLE_texture_format_BGRA8888;\n\n /* GL_APPLE_texture_max_level */\nextern GLboolean GLAD_APPLE_texture_max_level;\n#define GL_TEXTURE_MAX_LEVEL_APPLE             0x813D\n\n /* GL_APPLE_texture_packed_float */\nextern GLboolean GLAD_APPLE_texture_packed_float;\n#define GL_UNSIGNED_INT_10F_11F_11F_REV_APPLE  0x8C3B\n#define GL_UNSIGNED_INT_5_9_9_9_REV_APPLE      0x8C3E\n#define GL_R11F_G11F_B10F_APPLE                0x8C3A\n#define GL_RGB9_E5_APPLE                       0x8C3D\n\n /* GL_APPLE_texture_range */\nextern GLboolean GLAD_APPLE_texture_range;\n#define GL_TEXTURE_RANGE_LENGTH_APPLE          0x85B7\n#define GL_TEXTURE_RANGE_POINTER_APPLE         0x85B8\n#define GL_TEXTURE_STORAGE_HINT_APPLE          0x85BC\n#define GL_STORAGE_PRIVATE_APPLE               0x85BD\n#define GL_STORAGE_CACHED_APPLE                0x85BE\n#define GL_STORAGE_SHARED_APPLE                0x85BF\ntypedef void (APIENTRYP pfn_glTextureRangeAPPLE) (GLenum, GLsizei, const void*);\nextern pfn_glTextureRangeAPPLE fp_glTextureRangeAPPLE;\ntypedef void (APIENTRYP pfn_glGetTexParameterPointervAPPLE) (GLenum, GLenum, void**);\nextern pfn_glGetTexParameterPointervAPPLE fp_glGetTexParameterPointervAPPLE;\n\n /* GL_APPLE_vertex_array_object */\nextern GLboolean GLAD_APPLE_vertex_array_object;\n#define GL_VERTEX_ARRAY_BINDING_APPLE          0x85B5\ntypedef void (APIENTRYP pfn_glBindVertexArrayAPPLE) (GLuint);\nextern pfn_glBindVertexArrayAPPLE fp_glBindVertexArrayAPPLE;\ntypedef void (APIENTRYP pfn_glDeleteVertexArraysAPPLE) (GLsizei, const GLuint*);\nextern pfn_glDeleteVertexArraysAPPLE fp_glDeleteVertexArraysAPPLE;\ntypedef void (APIENTRYP pfn_glGenVertexArraysAPPLE) (GLsizei, GLuint*);\nextern pfn_glGenVertexArraysAPPLE fp_glGenVertexArraysAPPLE;\ntypedef GLboolean (APIENTRYP pfn_glIsVertexArrayAPPLE) (GLuint);\nextern pfn_glIsVertexArrayAPPLE fp_glIsVertexArrayAPPLE;\n\n /* GL_APPLE_vertex_array_range */\nextern GLboolean GLAD_APPLE_vertex_array_range;\n#define GL_VERTEX_ARRAY_RANGE_APPLE            0x851D\n#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE     0x851E\n#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE     0x851F\n#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE    0x8521\n#define GL_STORAGE_CLIENT_APPLE                0x85B4\ntypedef void (APIENTRYP pfn_glVertexArrayRangeAPPLE) (GLsizei, void*);\nextern pfn_glVertexArrayRangeAPPLE fp_glVertexArrayRangeAPPLE;\ntypedef void (APIENTRYP pfn_glFlushVertexArrayRangeAPPLE) (GLsizei, void*);\nextern pfn_glFlushVertexArrayRangeAPPLE fp_glFlushVertexArrayRangeAPPLE;\ntypedef void (APIENTRYP pfn_glVertexArrayParameteriAPPLE) (GLenum, GLint);\nextern pfn_glVertexArrayParameteriAPPLE fp_glVertexArrayParameteriAPPLE;\n\n /* GL_APPLE_vertex_program_evaluators */\nextern GLboolean GLAD_APPLE_vertex_program_evaluators;\n#define GL_VERTEX_ATTRIB_MAP1_APPLE            0x8A00\n#define GL_VERTEX_ATTRIB_MAP2_APPLE            0x8A01\n#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE       0x8A02\n#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE      0x8A03\n#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE      0x8A04\n#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE     0x8A05\n#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE       0x8A06\n#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE      0x8A07\n#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE      0x8A08\n#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE     0x8A09\ntypedef void (APIENTRYP pfn_glEnableVertexAttribAPPLE) (GLuint, GLenum);\nextern pfn_glEnableVertexAttribAPPLE fp_glEnableVertexAttribAPPLE;\ntypedef void (APIENTRYP pfn_glDisableVertexAttribAPPLE) (GLuint, GLenum);\nextern pfn_glDisableVertexAttribAPPLE fp_glDisableVertexAttribAPPLE;\ntypedef GLboolean (APIENTRYP pfn_glIsVertexAttribEnabledAPPLE) (GLuint, GLenum);\nextern pfn_glIsVertexAttribEnabledAPPLE fp_glIsVertexAttribEnabledAPPLE;\ntypedef void (APIENTRYP pfn_glMapVertexAttrib1dAPPLE) (GLuint, GLuint, GLdouble, GLdouble, GLint, GLint, const GLdouble*);\nextern pfn_glMapVertexAttrib1dAPPLE fp_glMapVertexAttrib1dAPPLE;\ntypedef void (APIENTRYP pfn_glMapVertexAttrib1fAPPLE) (GLuint, GLuint, GLfloat, GLfloat, GLint, GLint, const GLfloat*);\nextern pfn_glMapVertexAttrib1fAPPLE fp_glMapVertexAttrib1fAPPLE;\ntypedef void (APIENTRYP pfn_glMapVertexAttrib2dAPPLE) (GLuint, GLuint, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, const GLdouble*);\nextern pfn_glMapVertexAttrib2dAPPLE fp_glMapVertexAttrib2dAPPLE;\ntypedef void (APIENTRYP pfn_glMapVertexAttrib2fAPPLE) (GLuint, GLuint, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, const GLfloat*);\nextern pfn_glMapVertexAttrib2fAPPLE fp_glMapVertexAttrib2fAPPLE;\n\n /* GL_APPLE_ycbcr_422 */\nextern GLboolean GLAD_APPLE_ycbcr_422;\n#define GL_YCBCR_422_APPLE                     0x85B9\n\n /* GL_ARM_mali_program_binary */\nextern GLboolean GLAD_ARM_mali_program_binary;\n#define GL_MALI_PROGRAM_BINARY_ARM             0x8F61\n\n /* GL_ARM_mali_shader_binary */\nextern GLboolean GLAD_ARM_mali_shader_binary;\n#define GL_MALI_SHADER_BINARY_ARM              0x8F60\n\n /* GL_ARM_rgba8 */\nextern GLboolean GLAD_ARM_rgba8;\n\n /* GL_ARM_shader_framebuffer_fetch */\nextern GLboolean GLAD_ARM_shader_framebuffer_fetch;\n#define GL_FETCH_PER_SAMPLE_ARM                0x8F65\n#define GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM  0x8F66\n\n /* GL_ARM_shader_framebuffer_fetch_depth_stencil */\nextern GLboolean GLAD_ARM_shader_framebuffer_fetch_depth_stencil;\n\n /* GL_ATI_meminfo */\nextern GLboolean GLAD_ATI_meminfo;\n#define GL_VBO_FREE_MEMORY_ATI                 0x87FB\n#define GL_TEXTURE_FREE_MEMORY_ATI             0x87FC\n#define GL_RENDERBUFFER_FREE_MEMORY_ATI        0x87FD\n\n /* GL_ATI_pixel_format_float */\nextern GLboolean GLAD_ATI_pixel_format_float;\n#define GL_RGBA_FLOAT_MODE_ATI                 0x8820\n#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI     0x8835\n\n /* GL_DMP_program_binary */\nextern GLboolean GLAD_DMP_program_binary;\n#define GL_SMAPHS30_PROGRAM_BINARY_DMP         0x9251\n#define GL_SMAPHS_PROGRAM_BINARY_DMP           0x9252\n#define GL_DMP_PROGRAM_BINARY_DMP              0x9253\n\n /* GL_DMP_shader_binary */\nextern GLboolean GLAD_DMP_shader_binary;\n#define GL_SHADER_BINARY_DMP                   0x9250\n\n /* GL_FJ_shader_binary_GCCSO */\nextern GLboolean GLAD_FJ_shader_binary_GCCSO;\n#define GL_GCCSO_SHADER_BINARY_FJ              0x9260\n\n /* GL_GREMEDY_frame_terminator */\nextern GLboolean GLAD_GREMEDY_frame_terminator;\ntypedef void (APIENTRYP pfn_glFrameTerminatorGREMEDY) ();\nextern pfn_glFrameTerminatorGREMEDY fp_glFrameTerminatorGREMEDY;\n\n /* GL_GREMEDY_string_marker */\nextern GLboolean GLAD_GREMEDY_string_marker;\ntypedef void (APIENTRYP pfn_glStringMarkerGREMEDY) (GLsizei, const void*);\nextern pfn_glStringMarkerGREMEDY fp_glStringMarkerGREMEDY;\n\n /* GL_IMG_multisampled_render_to_texture */\nextern GLboolean GLAD_IMG_multisampled_render_to_texture;\n#define GL_RENDERBUFFER_SAMPLES_IMG            0x9133\n#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG  0x9134\n#define GL_MAX_SAMPLES_IMG                     0x9135\n#define GL_TEXTURE_SAMPLES_IMG                 0x9136\ntypedef void (APIENTRYP pfn_glRenderbufferStorageMultisampleIMG) (GLenum, GLsizei, GLenum, GLsizei, GLsizei);\nextern pfn_glRenderbufferStorageMultisampleIMG fp_glRenderbufferStorageMultisampleIMG;\ntypedef void (APIENTRYP pfn_glFramebufferTexture2DMultisampleIMG) (GLenum, GLenum, GLenum, GLuint, GLint, GLsizei);\nextern pfn_glFramebufferTexture2DMultisampleIMG fp_glFramebufferTexture2DMultisampleIMG;\n\n /* GL_IMG_program_binary */\nextern GLboolean GLAD_IMG_program_binary;\n#define GL_SGX_PROGRAM_BINARY_IMG              0x9130\n\n /* GL_IMG_read_format */\nextern GLboolean GLAD_IMG_read_format;\n#define GL_BGRA_IMG                            0x80E1\n#define GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG      0x8365\n\n /* GL_IMG_shader_binary */\nextern GLboolean GLAD_IMG_shader_binary;\n#define GL_SGX_BINARY_IMG                      0x8C0A\n\n /* GL_IMG_texture_compression_pvrtc */\nextern GLboolean GLAD_IMG_texture_compression_pvrtc;\n#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG     0x8C00\n#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG     0x8C01\n#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG    0x8C02\n#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG    0x8C03\n\n /* GL_IMG_texture_compression_pvrtc2 */\nextern GLboolean GLAD_IMG_texture_compression_pvrtc2;\n#define GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG    0x9137\n#define GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG    0x9138\n\n /* GL_IMG_texture_filter_cubic */\nextern GLboolean GLAD_IMG_texture_filter_cubic;\n#define GL_CUBIC_IMG                           0x9139\n#define GL_CUBIC_MIPMAP_NEAREST_IMG            0x913A\n#define GL_CUBIC_MIPMAP_LINEAR_IMG             0x913B\n\n /* GL_INGR_blend_func_separate */\nextern GLboolean GLAD_INGR_blend_func_separate;\ntypedef void (APIENTRYP pfn_glBlendFuncSeparateINGR) (GLenum, GLenum, GLenum, GLenum);\nextern pfn_glBlendFuncSeparateINGR fp_glBlendFuncSeparateINGR;\n\n /* GL_INTEL_fragment_shader_ordering */\nextern GLboolean GLAD_INTEL_fragment_shader_ordering;\n\n /* GL_INTEL_framebuffer_CMAA */\nextern GLboolean GLAD_INTEL_framebuffer_CMAA;\ntypedef void (APIENTRYP pfn_glApplyFramebufferAttachmentCMAAINTEL) ();\nextern pfn_glApplyFramebufferAttachmentCMAAINTEL fp_glApplyFramebufferAttachmentCMAAINTEL;\n\n /* GL_INTEL_map_texture */\nextern GLboolean GLAD_INTEL_map_texture;\n#define GL_TEXTURE_MEMORY_LAYOUT_INTEL         0x83FF\n#define GL_LAYOUT_DEFAULT_INTEL                0\n#define GL_LAYOUT_LINEAR_INTEL                 1\n#define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL      2\ntypedef void (APIENTRYP pfn_glSyncTextureINTEL) (GLuint);\nextern pfn_glSyncTextureINTEL fp_glSyncTextureINTEL;\ntypedef void (APIENTRYP pfn_glUnmapTexture2DINTEL) (GLuint, GLint);\nextern pfn_glUnmapTexture2DINTEL fp_glUnmapTexture2DINTEL;\ntypedef void* (APIENTRYP pfn_glMapTexture2DINTEL) (GLuint, GLint, GLbitfield, GLint*, GLenum*);\nextern pfn_glMapTexture2DINTEL fp_glMapTexture2DINTEL;\n\n /* GL_INTEL_performance_query */\nextern GLboolean GLAD_INTEL_performance_query;\n#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL      0x00000000\n#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL      0x00000001\n#define GL_PERFQUERY_WAIT_INTEL                0x83FB\n#define GL_PERFQUERY_FLUSH_INTEL               0x83FA\n#define GL_PERFQUERY_DONOT_FLUSH_INTEL         0x83F9\n#define GL_PERFQUERY_COUNTER_EVENT_INTEL       0x94F0\n#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL  0x94F1\n#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL  0x94F2\n#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL  0x94F3\n#define GL_PERFQUERY_COUNTER_RAW_INTEL         0x94F4\n#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL   0x94F5\n#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL  0x94F8\n#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL  0x94F9\n#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL  0x94FA\n#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL  0x94FB\n#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL  0x94FC\n#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL  0x94FD\n#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL  0x94FE\n#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL  0x94FF\n#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL  0x9500\ntypedef void (APIENTRYP pfn_glBeginPerfQueryINTEL) (GLuint);\nextern pfn_glBeginPerfQueryINTEL fp_glBeginPerfQueryINTEL;\ntypedef void (APIENTRYP pfn_glCreatePerfQueryINTEL) (GLuint, GLuint*);\nextern pfn_glCreatePerfQueryINTEL fp_glCreatePerfQueryINTEL;\ntypedef void (APIENTRYP pfn_glDeletePerfQueryINTEL) (GLuint);\nextern pfn_glDeletePerfQueryINTEL fp_glDeletePerfQueryINTEL;\ntypedef void (APIENTRYP pfn_glEndPerfQueryINTEL) (GLuint);\nextern pfn_glEndPerfQueryINTEL fp_glEndPerfQueryINTEL;\ntypedef void (APIENTRYP pfn_glGetFirstPerfQueryIdINTEL) (GLuint*);\nextern pfn_glGetFirstPerfQueryIdINTEL fp_glGetFirstPerfQueryIdINTEL;\ntypedef void (APIENTRYP pfn_glGetNextPerfQueryIdINTEL) (GLuint, GLuint*);\nextern pfn_glGetNextPerfQueryIdINTEL fp_glGetNextPerfQueryIdINTEL;\ntypedef void (APIENTRYP pfn_glGetPerfCounterInfoINTEL) (GLuint, GLuint, GLuint, GLchar*, GLuint, GLchar*, GLuint*, GLuint*, GLuint*, GLuint*, GLuint64*);\nextern pfn_glGetPerfCounterInfoINTEL fp_glGetPerfCounterInfoINTEL;\ntypedef void (APIENTRYP pfn_glGetPerfQueryDataINTEL) (GLuint, GLuint, GLsizei, GLvoid*, GLuint*);\nextern pfn_glGetPerfQueryDataINTEL fp_glGetPerfQueryDataINTEL;\ntypedef void (APIENTRYP pfn_glGetPerfQueryIdByNameINTEL) (GLchar*, GLuint*);\nextern pfn_glGetPerfQueryIdByNameINTEL fp_glGetPerfQueryIdByNameINTEL;\ntypedef void (APIENTRYP pfn_glGetPerfQueryInfoINTEL) (GLuint, GLuint, GLchar*, GLuint*, GLuint*, GLuint*, GLuint*);\nextern pfn_glGetPerfQueryInfoINTEL fp_glGetPerfQueryInfoINTEL;\n\n /* GL_MESA_pack_invert */\nextern GLboolean GLAD_MESA_pack_invert;\n#define GL_PACK_INVERT_MESA                    0x8758\n\n /* GL_MESA_ycbcr_texture */\nextern GLboolean GLAD_MESA_ycbcr_texture;\n#define GL_UNSIGNED_SHORT_8_8_MESA             0x85BA\n#define GL_UNSIGNED_SHORT_8_8_REV_MESA         0x85BB\n#define GL_YCBCR_MESA                          0x8757\n\n /* GL_MESAX_texture_stack */\nextern GLboolean GLAD_MESAX_texture_stack;\n#define GL_TEXTURE_1D_STACK_MESAX              0x8759\n#define GL_TEXTURE_2D_STACK_MESAX              0x875A\n#define GL_PROXY_TEXTURE_1D_STACK_MESAX        0x875B\n#define GL_PROXY_TEXTURE_2D_STACK_MESAX        0x875C\n#define GL_TEXTURE_1D_STACK_BINDING_MESAX      0x875D\n#define GL_TEXTURE_2D_STACK_BINDING_MESAX      0x875E\n\n /* GL_NV_bindless_multi_draw_indirect */\nextern GLboolean GLAD_NV_bindless_multi_draw_indirect;\ntypedef void (APIENTRYP pfn_glMultiDrawArraysIndirectBindlessNV) (GLenum, const void*, GLsizei, GLsizei, GLint);\nextern pfn_glMultiDrawArraysIndirectBindlessNV fp_glMultiDrawArraysIndirectBindlessNV;\ntypedef void (APIENTRYP pfn_glMultiDrawElementsIndirectBindlessNV) (GLenum, GLenum, const void*, GLsizei, GLsizei, GLint);\nextern pfn_glMultiDrawElementsIndirectBindlessNV fp_glMultiDrawElementsIndirectBindlessNV;\n\n /* GL_NV_bindless_multi_draw_indirect_count */\nextern GLboolean GLAD_NV_bindless_multi_draw_indirect_count;\ntypedef void (APIENTRYP pfn_glMultiDrawArraysIndirectBindlessCountNV) (GLenum, const void*, GLsizei, GLsizei, GLsizei, GLint);\nextern pfn_glMultiDrawArraysIndirectBindlessCountNV fp_glMultiDrawArraysIndirectBindlessCountNV;\ntypedef void (APIENTRYP pfn_glMultiDrawElementsIndirectBindlessCountNV) (GLenum, GLenum, const void*, GLsizei, GLsizei, GLsizei, GLint);\nextern pfn_glMultiDrawElementsIndirectBindlessCountNV fp_glMultiDrawElementsIndirectBindlessCountNV;\n\n /* GL_NV_bindless_texture */\nextern GLboolean GLAD_NV_bindless_texture;\ntypedef GLuint64 (APIENTRYP pfn_glGetTextureHandleNV) (GLuint);\nextern pfn_glGetTextureHandleNV fp_glGetTextureHandleNV;\ntypedef GLuint64 (APIENTRYP pfn_glGetTextureSamplerHandleNV) (GLuint, GLuint);\nextern pfn_glGetTextureSamplerHandleNV fp_glGetTextureSamplerHandleNV;\ntypedef void (APIENTRYP pfn_glMakeTextureHandleResidentNV) (GLuint64);\nextern pfn_glMakeTextureHandleResidentNV fp_glMakeTextureHandleResidentNV;\ntypedef void (APIENTRYP pfn_glMakeTextureHandleNonResidentNV) (GLuint64);\nextern pfn_glMakeTextureHandleNonResidentNV fp_glMakeTextureHandleNonResidentNV;\ntypedef GLuint64 (APIENTRYP pfn_glGetImageHandleNV) (GLuint, GLint, GLboolean, GLint, GLenum);\nextern pfn_glGetImageHandleNV fp_glGetImageHandleNV;\ntypedef void (APIENTRYP pfn_glMakeImageHandleResidentNV) (GLuint64, GLenum);\nextern pfn_glMakeImageHandleResidentNV fp_glMakeImageHandleResidentNV;\ntypedef void (APIENTRYP pfn_glMakeImageHandleNonResidentNV) (GLuint64);\nextern pfn_glMakeImageHandleNonResidentNV fp_glMakeImageHandleNonResidentNV;\ntypedef void (APIENTRYP pfn_glUniformHandleui64NV) (GLint, GLuint64);\nextern pfn_glUniformHandleui64NV fp_glUniformHandleui64NV;\ntypedef void (APIENTRYP pfn_glUniformHandleui64vNV) (GLint, GLsizei, const GLuint64*);\nextern pfn_glUniformHandleui64vNV fp_glUniformHandleui64vNV;\ntypedef void (APIENTRYP pfn_glProgramUniformHandleui64NV) (GLuint, GLint, GLuint64);\nextern pfn_glProgramUniformHandleui64NV fp_glProgramUniformHandleui64NV;\ntypedef void (APIENTRYP pfn_glProgramUniformHandleui64vNV) (GLuint, GLint, GLsizei, const GLuint64*);\nextern pfn_glProgramUniformHandleui64vNV fp_glProgramUniformHandleui64vNV;\ntypedef GLboolean (APIENTRYP pfn_glIsTextureHandleResidentNV) (GLuint64);\nextern pfn_glIsTextureHandleResidentNV fp_glIsTextureHandleResidentNV;\ntypedef GLboolean (APIENTRYP pfn_glIsImageHandleResidentNV) (GLuint64);\nextern pfn_glIsImageHandleResidentNV fp_glIsImageHandleResidentNV;\n\n /* GL_NV_blend_equation_advanced */\nextern GLboolean GLAD_NV_blend_equation_advanced;\n#define GL_BLEND_OVERLAP_NV                    0x9281\n#define GL_BLEND_PREMULTIPLIED_SRC_NV          0x9280\n#define GL_BLUE_NV                             0x1905\n#define GL_COLORBURN_NV                        0x929A\n#define GL_COLORDODGE_NV                       0x9299\n#define GL_CONJOINT_NV                         0x9284\n#define GL_CONTRAST_NV                         0x92A1\n#define GL_DARKEN_NV                           0x9297\n#define GL_DIFFERENCE_NV                       0x929E\n#define GL_DISJOINT_NV                         0x9283\n#define GL_DST_ATOP_NV                         0x928F\n#define GL_DST_IN_NV                           0x928B\n#define GL_DST_NV                              0x9287\n#define GL_DST_OUT_NV                          0x928D\n#define GL_DST_OVER_NV                         0x9289\n#define GL_EXCLUSION_NV                        0x92A0\n#define GL_GREEN_NV                            0x1904\n#define GL_HARDLIGHT_NV                        0x929B\n#define GL_HARDMIX_NV                          0x92A9\n#define GL_HSL_COLOR_NV                        0x92AF\n#define GL_HSL_HUE_NV                          0x92AD\n#define GL_HSL_LUMINOSITY_NV                   0x92B0\n#define GL_HSL_SATURATION_NV                   0x92AE\n#define GL_INVERT_OVG_NV                       0x92B4\n#define GL_INVERT_RGB_NV                       0x92A3\n#define GL_LIGHTEN_NV                          0x9298\n#define GL_LINEARBURN_NV                       0x92A5\n#define GL_LINEARDODGE_NV                      0x92A4\n#define GL_LINEARLIGHT_NV                      0x92A7\n#define GL_MINUS_CLAMPED_NV                    0x92B3\n#define GL_MINUS_NV                            0x929F\n#define GL_MULTIPLY_NV                         0x9294\n#define GL_OVERLAY_NV                          0x9296\n#define GL_PINLIGHT_NV                         0x92A8\n#define GL_PLUS_CLAMPED_ALPHA_NV               0x92B2\n#define GL_PLUS_CLAMPED_NV                     0x92B1\n#define GL_PLUS_DARKER_NV                      0x9292\n#define GL_PLUS_NV                             0x9291\n#define GL_RED_NV                              0x1903\n#define GL_SCREEN_NV                           0x9295\n#define GL_SOFTLIGHT_NV                        0x929C\n#define GL_SRC_ATOP_NV                         0x928E\n#define GL_SRC_IN_NV                           0x928A\n#define GL_SRC_NV                              0x9286\n#define GL_SRC_OUT_NV                          0x928C\n#define GL_SRC_OVER_NV                         0x9288\n#define GL_UNCORRELATED_NV                     0x9282\n#define GL_VIVIDLIGHT_NV                       0x92A6\n#define GL_XOR_NV                              0x1506\ntypedef void (APIENTRYP pfn_glBlendParameteriNV) (GLenum, GLint);\nextern pfn_glBlendParameteriNV fp_glBlendParameteriNV;\ntypedef void (APIENTRYP pfn_glBlendBarrierNV) ();\nextern pfn_glBlendBarrierNV fp_glBlendBarrierNV;\n\n /* GL_NV_blend_equation_advanced_coherent */\nextern GLboolean GLAD_NV_blend_equation_advanced_coherent;\n#define GL_BLEND_ADVANCED_COHERENT_NV          0x9285\n\n /* GL_NV_command_list */\nextern GLboolean GLAD_NV_command_list;\n#define GL_TERMINATE_SEQUENCE_COMMAND_NV       0x0000\n#define GL_NOP_COMMAND_NV                      0x0001\n#define GL_DRAW_ELEMENTS_COMMAND_NV            0x0002\n#define GL_DRAW_ARRAYS_COMMAND_NV              0x0003\n#define GL_DRAW_ELEMENTS_STRIP_COMMAND_NV      0x0004\n#define GL_DRAW_ARRAYS_STRIP_COMMAND_NV        0x0005\n#define GL_DRAW_ELEMENTS_INSTANCED_COMMAND_NV  0x0006\n#define GL_DRAW_ARRAYS_INSTANCED_COMMAND_NV    0x0007\n#define GL_ELEMENT_ADDRESS_COMMAND_NV          0x0008\n#define GL_ATTRIBUTE_ADDRESS_COMMAND_NV        0x0009\n#define GL_UNIFORM_ADDRESS_COMMAND_NV          0x000A\n#define GL_BLEND_COLOR_COMMAND_NV              0x000B\n#define GL_STENCIL_REF_COMMAND_NV              0x000C\n#define GL_LINE_WIDTH_COMMAND_NV               0x000D\n#define GL_POLYGON_OFFSET_COMMAND_NV           0x000E\n#define GL_ALPHA_REF_COMMAND_NV                0x000F\n#define GL_VIEWPORT_COMMAND_NV                 0x0010\n#define GL_SCISSOR_COMMAND_NV                  0x0011\n#define GL_FRONT_FACE_COMMAND_NV               0x0012\ntypedef void (APIENTRYP pfn_glCreateStatesNV) (GLsizei, GLuint*);\nextern pfn_glCreateStatesNV fp_glCreateStatesNV;\ntypedef void (APIENTRYP pfn_glDeleteStatesNV) (GLsizei, const GLuint*);\nextern pfn_glDeleteStatesNV fp_glDeleteStatesNV;\ntypedef GLboolean (APIENTRYP pfn_glIsStateNV) (GLuint);\nextern pfn_glIsStateNV fp_glIsStateNV;\ntypedef void (APIENTRYP pfn_glStateCaptureNV) (GLuint, GLenum);\nextern pfn_glStateCaptureNV fp_glStateCaptureNV;\ntypedef GLuint (APIENTRYP pfn_glGetCommandHeaderNV) (GLenum, GLuint);\nextern pfn_glGetCommandHeaderNV fp_glGetCommandHeaderNV;\ntypedef GLushort (APIENTRYP pfn_glGetStageIndexNV) (GLenum);\nextern pfn_glGetStageIndexNV fp_glGetStageIndexNV;\ntypedef void (APIENTRYP pfn_glDrawCommandsNV) (GLenum, GLuint, const GLintptr*, const GLsizei*, GLuint);\nextern pfn_glDrawCommandsNV fp_glDrawCommandsNV;\ntypedef void (APIENTRYP pfn_glDrawCommandsAddressNV) (GLenum, const GLuint64*, const GLsizei*, GLuint);\nextern pfn_glDrawCommandsAddressNV fp_glDrawCommandsAddressNV;\ntypedef void (APIENTRYP pfn_glDrawCommandsStatesNV) (GLuint, const GLintptr*, const GLsizei*, const GLuint*, const GLuint*, GLuint);\nextern pfn_glDrawCommandsStatesNV fp_glDrawCommandsStatesNV;\ntypedef void (APIENTRYP pfn_glDrawCommandsStatesAddressNV) (const GLuint64*, const GLsizei*, const GLuint*, const GLuint*, GLuint);\nextern pfn_glDrawCommandsStatesAddressNV fp_glDrawCommandsStatesAddressNV;\ntypedef void (APIENTRYP pfn_glCreateCommandListsNV) (GLsizei, GLuint*);\nextern pfn_glCreateCommandListsNV fp_glCreateCommandListsNV;\ntypedef void (APIENTRYP pfn_glDeleteCommandListsNV) (GLsizei, const GLuint*);\nextern pfn_glDeleteCommandListsNV fp_glDeleteCommandListsNV;\ntypedef GLboolean (APIENTRYP pfn_glIsCommandListNV) (GLuint);\nextern pfn_glIsCommandListNV fp_glIsCommandListNV;\ntypedef void (APIENTRYP pfn_glListDrawCommandsStatesClientNV) (GLuint, GLuint, const void**, const GLsizei*, const GLuint*, const GLuint*, GLuint);\nextern pfn_glListDrawCommandsStatesClientNV fp_glListDrawCommandsStatesClientNV;\ntypedef void (APIENTRYP pfn_glCommandListSegmentsNV) (GLuint, GLuint);\nextern pfn_glCommandListSegmentsNV fp_glCommandListSegmentsNV;\ntypedef void (APIENTRYP pfn_glCompileCommandListNV) (GLuint);\nextern pfn_glCompileCommandListNV fp_glCompileCommandListNV;\ntypedef void (APIENTRYP pfn_glCallCommandListNV) (GLuint);\nextern pfn_glCallCommandListNV fp_glCallCommandListNV;\n\n /* GL_NV_compute_program5 */\nextern GLboolean GLAD_NV_compute_program5;\n#define GL_COMPUTE_PROGRAM_NV                  0x90FB\n#define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV  0x90FC\n\n /* GL_NV_conditional_render */\nextern GLboolean GLAD_NV_conditional_render;\n#define GL_QUERY_WAIT_NV                       0x8E13\n#define GL_QUERY_NO_WAIT_NV                    0x8E14\n#define GL_QUERY_BY_REGION_WAIT_NV             0x8E15\n#define GL_QUERY_BY_REGION_NO_WAIT_NV          0x8E16\ntypedef void (APIENTRYP pfn_glBeginConditionalRenderNV) (GLuint, GLenum);\nextern pfn_glBeginConditionalRenderNV fp_glBeginConditionalRenderNV;\ntypedef void (APIENTRYP pfn_glEndConditionalRenderNV) ();\nextern pfn_glEndConditionalRenderNV fp_glEndConditionalRenderNV;\n\n /* GL_NV_conservative_raster */\nextern GLboolean GLAD_NV_conservative_raster;\n#define GL_CONSERVATIVE_RASTERIZATION_NV       0x9346\n#define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV   0x9347\n#define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV   0x9348\n#define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV  0x9349\ntypedef void (APIENTRYP pfn_glSubpixelPrecisionBiasNV) (GLuint, GLuint);\nextern pfn_glSubpixelPrecisionBiasNV fp_glSubpixelPrecisionBiasNV;\n\n /* GL_NV_conservative_raster_dilate */\nextern GLboolean GLAD_NV_conservative_raster_dilate;\n#define GL_CONSERVATIVE_RASTER_DILATE_NV       0x9379\n#define GL_CONSERVATIVE_RASTER_DILATE_RANGE_NV  0x937A\n#define GL_CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV  0x937B\ntypedef void (APIENTRYP pfn_glConservativeRasterParameterfNV) (GLenum, GLfloat);\nextern pfn_glConservativeRasterParameterfNV fp_glConservativeRasterParameterfNV;\n\n /* GL_NV_copy_buffer */\nextern GLboolean GLAD_NV_copy_buffer;\n#define GL_COPY_READ_BUFFER_NV                 0x8F36\n#define GL_COPY_WRITE_BUFFER_NV                0x8F37\ntypedef void (APIENTRYP pfn_glCopyBufferSubDataNV) (GLenum, GLenum, GLintptr, GLintptr, GLsizeiptr);\nextern pfn_glCopyBufferSubDataNV fp_glCopyBufferSubDataNV;\n\n /* GL_NV_copy_image */\nextern GLboolean GLAD_NV_copy_image;\ntypedef void (APIENTRYP pfn_glCopyImageSubDataNV) (GLuint, GLenum, GLint, GLint, GLint, GLint, GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei);\nextern pfn_glCopyImageSubDataNV fp_glCopyImageSubDataNV;\n\n /* GL_NV_coverage_sample */\nextern GLboolean GLAD_NV_coverage_sample;\n#define GL_COVERAGE_COMPONENT_NV               0x8ED0\n#define GL_COVERAGE_COMPONENT4_NV              0x8ED1\n#define GL_COVERAGE_ATTACHMENT_NV              0x8ED2\n#define GL_COVERAGE_BUFFERS_NV                 0x8ED3\n#define GL_COVERAGE_SAMPLES_NV                 0x8ED4\n#define GL_COVERAGE_ALL_FRAGMENTS_NV           0x8ED5\n#define GL_COVERAGE_EDGE_FRAGMENTS_NV          0x8ED6\n#define GL_COVERAGE_AUTOMATIC_NV               0x8ED7\n#define GL_COVERAGE_BUFFER_BIT_NV              0x00008000\ntypedef void (APIENTRYP pfn_glCoverageMaskNV) (GLboolean);\nextern pfn_glCoverageMaskNV fp_glCoverageMaskNV;\ntypedef void (APIENTRYP pfn_glCoverageOperationNV) (GLenum);\nextern pfn_glCoverageOperationNV fp_glCoverageOperationNV;\n\n /* GL_NV_deep_texture3D */\nextern GLboolean GLAD_NV_deep_texture3D;\n#define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV  0x90D0\n#define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV        0x90D1\n\n /* GL_NV_depth_buffer_float */\nextern GLboolean GLAD_NV_depth_buffer_float;\n#define GL_DEPTH_COMPONENT32F_NV               0x8DAB\n#define GL_DEPTH32F_STENCIL8_NV                0x8DAC\n#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV   0x8DAD\n#define GL_DEPTH_BUFFER_FLOAT_MODE_NV          0x8DAF\ntypedef void (APIENTRYP pfn_glDepthRangedNV) (GLdouble, GLdouble);\nextern pfn_glDepthRangedNV fp_glDepthRangedNV;\ntypedef void (APIENTRYP pfn_glClearDepthdNV) (GLdouble);\nextern pfn_glClearDepthdNV fp_glClearDepthdNV;\ntypedef void (APIENTRYP pfn_glDepthBoundsdNV) (GLdouble, GLdouble);\nextern pfn_glDepthBoundsdNV fp_glDepthBoundsdNV;\n\n /* GL_NV_depth_clamp */\nextern GLboolean GLAD_NV_depth_clamp;\n#define GL_DEPTH_CLAMP_NV                      0x864F\n\n /* GL_NV_depth_nonlinear */\nextern GLboolean GLAD_NV_depth_nonlinear;\n#define GL_DEPTH_COMPONENT16_NONLINEAR_NV      0x8E2C\n\n /* GL_NV_draw_buffers */\nextern GLboolean GLAD_NV_draw_buffers;\n#define GL_MAX_DRAW_BUFFERS_NV                 0x8824\n#define GL_DRAW_BUFFER0_NV                     0x8825\n#define GL_DRAW_BUFFER1_NV                     0x8826\n#define GL_DRAW_BUFFER2_NV                     0x8827\n#define GL_DRAW_BUFFER3_NV                     0x8828\n#define GL_DRAW_BUFFER4_NV                     0x8829\n#define GL_DRAW_BUFFER5_NV                     0x882A\n#define GL_DRAW_BUFFER6_NV                     0x882B\n#define GL_DRAW_BUFFER7_NV                     0x882C\n#define GL_DRAW_BUFFER8_NV                     0x882D\n#define GL_DRAW_BUFFER9_NV                     0x882E\n#define GL_DRAW_BUFFER10_NV                    0x882F\n#define GL_DRAW_BUFFER11_NV                    0x8830\n#define GL_DRAW_BUFFER12_NV                    0x8831\n#define GL_DRAW_BUFFER13_NV                    0x8832\n#define GL_DRAW_BUFFER14_NV                    0x8833\n#define GL_DRAW_BUFFER15_NV                    0x8834\n#define GL_COLOR_ATTACHMENT0_NV                0x8CE0\n#define GL_COLOR_ATTACHMENT1_NV                0x8CE1\n#define GL_COLOR_ATTACHMENT2_NV                0x8CE2\n#define GL_COLOR_ATTACHMENT3_NV                0x8CE3\n#define GL_COLOR_ATTACHMENT4_NV                0x8CE4\n#define GL_COLOR_ATTACHMENT5_NV                0x8CE5\n#define GL_COLOR_ATTACHMENT6_NV                0x8CE6\n#define GL_COLOR_ATTACHMENT7_NV                0x8CE7\n#define GL_COLOR_ATTACHMENT8_NV                0x8CE8\n#define GL_COLOR_ATTACHMENT9_NV                0x8CE9\n#define GL_COLOR_ATTACHMENT10_NV               0x8CEA\n#define GL_COLOR_ATTACHMENT11_NV               0x8CEB\n#define GL_COLOR_ATTACHMENT12_NV               0x8CEC\n#define GL_COLOR_ATTACHMENT13_NV               0x8CED\n#define GL_COLOR_ATTACHMENT14_NV               0x8CEE\n#define GL_COLOR_ATTACHMENT15_NV               0x8CEF\ntypedef void (APIENTRYP pfn_glDrawBuffersNV) (GLsizei, const GLenum*);\nextern pfn_glDrawBuffersNV fp_glDrawBuffersNV;\n\n /* GL_NV_draw_instanced */\nextern GLboolean GLAD_NV_draw_instanced;\ntypedef void (APIENTRYP pfn_glDrawArraysInstancedNV) (GLenum, GLint, GLsizei, GLsizei);\nextern pfn_glDrawArraysInstancedNV fp_glDrawArraysInstancedNV;\ntypedef void (APIENTRYP pfn_glDrawElementsInstancedNV) (GLenum, GLsizei, GLenum, const void*, GLsizei);\nextern pfn_glDrawElementsInstancedNV fp_glDrawElementsInstancedNV;\n\n /* GL_NV_draw_texture */\nextern GLboolean GLAD_NV_draw_texture;\ntypedef void (APIENTRYP pfn_glDrawTextureNV) (GLuint, GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);\nextern pfn_glDrawTextureNV fp_glDrawTextureNV;\n\n /* GL_NV_explicit_attrib_location */\nextern GLboolean GLAD_NV_explicit_attrib_location;\n\n /* GL_NV_explicit_multisample */\nextern GLboolean GLAD_NV_explicit_multisample;\n#define GL_SAMPLE_POSITION_NV                  0x8E50\n#define GL_SAMPLE_MASK_NV                      0x8E51\n#define GL_SAMPLE_MASK_VALUE_NV                0x8E52\n#define GL_TEXTURE_BINDING_RENDERBUFFER_NV     0x8E53\n#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV  0x8E54\n#define GL_TEXTURE_RENDERBUFFER_NV             0x8E55\n#define GL_SAMPLER_RENDERBUFFER_NV             0x8E56\n#define GL_INT_SAMPLER_RENDERBUFFER_NV         0x8E57\n#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV  0x8E58\n#define GL_MAX_SAMPLE_MASK_WORDS_NV            0x8E59\ntypedef void (APIENTRYP pfn_glGetMultisamplefvNV) (GLenum, GLuint, GLfloat*);\nextern pfn_glGetMultisamplefvNV fp_glGetMultisamplefvNV;\ntypedef void (APIENTRYP pfn_glSampleMaskIndexedNV) (GLuint, GLbitfield);\nextern pfn_glSampleMaskIndexedNV fp_glSampleMaskIndexedNV;\ntypedef void (APIENTRYP pfn_glTexRenderbufferNV) (GLenum, GLuint);\nextern pfn_glTexRenderbufferNV fp_glTexRenderbufferNV;\n\n /* GL_NV_fbo_color_attachments */\nextern GLboolean GLAD_NV_fbo_color_attachments;\n#define GL_MAX_COLOR_ATTACHMENTS_NV            0x8CDF\n\n /* GL_NV_fence */\nextern GLboolean GLAD_NV_fence;\n#define GL_ALL_COMPLETED_NV                    0x84F2\n#define GL_FENCE_STATUS_NV                     0x84F3\n#define GL_FENCE_CONDITION_NV                  0x84F4\ntypedef void (APIENTRYP pfn_glDeleteFencesNV) (GLsizei, const GLuint*);\nextern pfn_glDeleteFencesNV fp_glDeleteFencesNV;\ntypedef void (APIENTRYP pfn_glGenFencesNV) (GLsizei, GLuint*);\nextern pfn_glGenFencesNV fp_glGenFencesNV;\ntypedef GLboolean (APIENTRYP pfn_glIsFenceNV) (GLuint);\nextern pfn_glIsFenceNV fp_glIsFenceNV;\ntypedef GLboolean (APIENTRYP pfn_glTestFenceNV) (GLuint);\nextern pfn_glTestFenceNV fp_glTestFenceNV;\ntypedef void (APIENTRYP pfn_glGetFenceivNV) (GLuint, GLenum, GLint*);\nextern pfn_glGetFenceivNV fp_glGetFenceivNV;\ntypedef void (APIENTRYP pfn_glFinishFenceNV) (GLuint);\nextern pfn_glFinishFenceNV fp_glFinishFenceNV;\ntypedef void (APIENTRYP pfn_glSetFenceNV) (GLuint, GLenum);\nextern pfn_glSetFenceNV fp_glSetFenceNV;\n\n /* GL_NV_fill_rectangle */\nextern GLboolean GLAD_NV_fill_rectangle;\n#define GL_FILL_RECTANGLE_NV                   0x933C\n\n /* GL_NV_float_buffer */\nextern GLboolean GLAD_NV_float_buffer;\n#define GL_FLOAT_R_NV                          0x8880\n#define GL_FLOAT_RG_NV                         0x8881\n#define GL_FLOAT_RGB_NV                        0x8882\n#define GL_FLOAT_RGBA_NV                       0x8883\n#define GL_FLOAT_R16_NV                        0x8884\n#define GL_FLOAT_R32_NV                        0x8885\n#define GL_FLOAT_RG16_NV                       0x8886\n#define GL_FLOAT_RG32_NV                       0x8887\n#define GL_FLOAT_RGB16_NV                      0x8888\n#define GL_FLOAT_RGB32_NV                      0x8889\n#define GL_FLOAT_RGBA16_NV                     0x888A\n#define GL_FLOAT_RGBA32_NV                     0x888B\n#define GL_TEXTURE_FLOAT_COMPONENTS_NV         0x888C\n#define GL_FLOAT_CLEAR_COLOR_VALUE_NV          0x888D\n#define GL_FLOAT_RGBA_MODE_NV                  0x888E\n\n /* GL_NV_fragment_coverage_to_color */\nextern GLboolean GLAD_NV_fragment_coverage_to_color;\n#define GL_FRAGMENT_COVERAGE_TO_COLOR_NV       0x92DD\n#define GL_FRAGMENT_COVERAGE_COLOR_NV          0x92DE\ntypedef void (APIENTRYP pfn_glFragmentCoverageColorNV) (GLuint);\nextern pfn_glFragmentCoverageColorNV fp_glFragmentCoverageColorNV;\n\n /* GL_NV_fragment_program4 */\nextern GLboolean GLAD_NV_fragment_program4;\n\n /* GL_NV_fragment_shader_interlock */\nextern GLboolean GLAD_NV_fragment_shader_interlock;\n\n /* GL_NV_framebuffer_blit */\nextern GLboolean GLAD_NV_framebuffer_blit;\n#define GL_READ_FRAMEBUFFER_NV                 0x8CA8\n#define GL_DRAW_FRAMEBUFFER_NV                 0x8CA9\n#define GL_DRAW_FRAMEBUFFER_BINDING_NV         0x8CA6\n#define GL_READ_FRAMEBUFFER_BINDING_NV         0x8CAA\ntypedef void (APIENTRYP pfn_glBlitFramebufferNV) (GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum);\nextern pfn_glBlitFramebufferNV fp_glBlitFramebufferNV;\n\n /* GL_NV_framebuffer_mixed_samples */\nextern GLboolean GLAD_NV_framebuffer_mixed_samples;\n#define GL_COVERAGE_MODULATION_TABLE_NV        0x9331\n#define GL_COLOR_SAMPLES_NV                    0x8E20\n#define GL_DEPTH_SAMPLES_NV                    0x932D\n#define GL_STENCIL_SAMPLES_NV                  0x932E\n#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV    0x932F\n#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV  0x9330\n#define GL_COVERAGE_MODULATION_NV              0x9332\n#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV   0x9333\ntypedef void (APIENTRYP pfn_glCoverageModulationTableNV) (GLsizei, const GLfloat*);\nextern pfn_glCoverageModulationTableNV fp_glCoverageModulationTableNV;\ntypedef void (APIENTRYP pfn_glGetCoverageModulationTableNV) (GLsizei, GLfloat*);\nextern pfn_glGetCoverageModulationTableNV fp_glGetCoverageModulationTableNV;\ntypedef void (APIENTRYP pfn_glCoverageModulationNV) (GLenum);\nextern pfn_glCoverageModulationNV fp_glCoverageModulationNV;\n\n /* GL_NV_framebuffer_multisample */\nextern GLboolean GLAD_NV_framebuffer_multisample;\n#define GL_RENDERBUFFER_SAMPLES_NV             0x8CAB\n#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV  0x8D56\n#define GL_MAX_SAMPLES_NV                      0x8D57\ntypedef void (APIENTRYP pfn_glRenderbufferStorageMultisampleNV) (GLenum, GLsizei, GLenum, GLsizei, GLsizei);\nextern pfn_glRenderbufferStorageMultisampleNV fp_glRenderbufferStorageMultisampleNV;\n\n /* GL_NV_framebuffer_multisample_coverage */\nextern GLboolean GLAD_NV_framebuffer_multisample_coverage;\n#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV    0x8CAB\n#define GL_RENDERBUFFER_COLOR_SAMPLES_NV       0x8E10\n#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV   0x8E11\n#define GL_MULTISAMPLE_COVERAGE_MODES_NV       0x8E12\ntypedef void (APIENTRYP pfn_glRenderbufferStorageMultisampleCoverageNV) (GLenum, GLsizei, GLsizei, GLenum, GLsizei, GLsizei);\nextern pfn_glRenderbufferStorageMultisampleCoverageNV fp_glRenderbufferStorageMultisampleCoverageNV;\n\n /* GL_NV_generate_mipmap_sRGB */\nextern GLboolean GLAD_NV_generate_mipmap_sRGB;\n\n /* GL_NV_geometry_program4 */\nextern GLboolean GLAD_NV_geometry_program4;\n#define GL_GEOMETRY_PROGRAM_NV                 0x8C26\n#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV      0x8C27\n#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV  0x8C28\ntypedef void (APIENTRYP pfn_glProgramVertexLimitNV) (GLenum, GLint);\nextern pfn_glProgramVertexLimitNV fp_glProgramVertexLimitNV;\ntypedef void (APIENTRYP pfn_glFramebufferTextureFaceEXT) (GLenum, GLenum, GLuint, GLint, GLenum);\nextern pfn_glFramebufferTextureFaceEXT fp_glFramebufferTextureFaceEXT;\n\n /* GL_NV_geometry_shader4 */\nextern GLboolean GLAD_NV_geometry_shader4;\n\n /* GL_NV_geometry_shader_passthrough */\nextern GLboolean GLAD_NV_geometry_shader_passthrough;\n\n /* GL_NV_gpu_program4 */\nextern GLboolean GLAD_NV_gpu_program4;\n#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV         0x8904\n#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV         0x8905\n#define GL_PROGRAM_ATTRIB_COMPONENTS_NV        0x8906\n#define GL_PROGRAM_RESULT_COMPONENTS_NV        0x8907\n#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV    0x8908\n#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV    0x8909\n#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV      0x8DA5\n#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV      0x8DA6\ntypedef void (APIENTRYP pfn_glProgramLocalParameterI4iNV) (GLenum, GLuint, GLint, GLint, GLint, GLint);\nextern pfn_glProgramLocalParameterI4iNV fp_glProgramLocalParameterI4iNV;\ntypedef void (APIENTRYP pfn_glProgramLocalParameterI4ivNV) (GLenum, GLuint, const GLint*);\nextern pfn_glProgramLocalParameterI4ivNV fp_glProgramLocalParameterI4ivNV;\ntypedef void (APIENTRYP pfn_glProgramLocalParametersI4ivNV) (GLenum, GLuint, GLsizei, const GLint*);\nextern pfn_glProgramLocalParametersI4ivNV fp_glProgramLocalParametersI4ivNV;\ntypedef void (APIENTRYP pfn_glProgramLocalParameterI4uiNV) (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint);\nextern pfn_glProgramLocalParameterI4uiNV fp_glProgramLocalParameterI4uiNV;\ntypedef void (APIENTRYP pfn_glProgramLocalParameterI4uivNV) (GLenum, GLuint, const GLuint*);\nextern pfn_glProgramLocalParameterI4uivNV fp_glProgramLocalParameterI4uivNV;\ntypedef void (APIENTRYP pfn_glProgramLocalParametersI4uivNV) (GLenum, GLuint, GLsizei, const GLuint*);\nextern pfn_glProgramLocalParametersI4uivNV fp_glProgramLocalParametersI4uivNV;\ntypedef void (APIENTRYP pfn_glProgramEnvParameterI4iNV) (GLenum, GLuint, GLint, GLint, GLint, GLint);\nextern pfn_glProgramEnvParameterI4iNV fp_glProgramEnvParameterI4iNV;\ntypedef void (APIENTRYP pfn_glProgramEnvParameterI4ivNV) (GLenum, GLuint, const GLint*);\nextern pfn_glProgramEnvParameterI4ivNV fp_glProgramEnvParameterI4ivNV;\ntypedef void (APIENTRYP pfn_glProgramEnvParametersI4ivNV) (GLenum, GLuint, GLsizei, const GLint*);\nextern pfn_glProgramEnvParametersI4ivNV fp_glProgramEnvParametersI4ivNV;\ntypedef void (APIENTRYP pfn_glProgramEnvParameterI4uiNV) (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint);\nextern pfn_glProgramEnvParameterI4uiNV fp_glProgramEnvParameterI4uiNV;\ntypedef void (APIENTRYP pfn_glProgramEnvParameterI4uivNV) (GLenum, GLuint, const GLuint*);\nextern pfn_glProgramEnvParameterI4uivNV fp_glProgramEnvParameterI4uivNV;\ntypedef void (APIENTRYP pfn_glProgramEnvParametersI4uivNV) (GLenum, GLuint, GLsizei, const GLuint*);\nextern pfn_glProgramEnvParametersI4uivNV fp_glProgramEnvParametersI4uivNV;\ntypedef void (APIENTRYP pfn_glGetProgramLocalParameterIivNV) (GLenum, GLuint, GLint*);\nextern pfn_glGetProgramLocalParameterIivNV fp_glGetProgramLocalParameterIivNV;\ntypedef void (APIENTRYP pfn_glGetProgramLocalParameterIuivNV) (GLenum, GLuint, GLuint*);\nextern pfn_glGetProgramLocalParameterIuivNV fp_glGetProgramLocalParameterIuivNV;\ntypedef void (APIENTRYP pfn_glGetProgramEnvParameterIivNV) (GLenum, GLuint, GLint*);\nextern pfn_glGetProgramEnvParameterIivNV fp_glGetProgramEnvParameterIivNV;\ntypedef void (APIENTRYP pfn_glGetProgramEnvParameterIuivNV) (GLenum, GLuint, GLuint*);\nextern pfn_glGetProgramEnvParameterIuivNV fp_glGetProgramEnvParameterIuivNV;\n\n /* GL_NV_gpu_program5 */\nextern GLboolean GLAD_NV_gpu_program5;\n#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV  0x8E5A\n#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV  0x8E5B\n#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV  0x8E5C\n#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV  0x8E5D\n#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV  0x8E5E\n#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV  0x8E5F\n#define GL_MAX_PROGRAM_SUBROUTINE_PARAMETERS_NV  0x8F44\n#define GL_MAX_PROGRAM_SUBROUTINE_NUM_NV       0x8F45\ntypedef void (APIENTRYP pfn_glProgramSubroutineParametersuivNV) (GLenum, GLsizei, const GLuint*);\nextern pfn_glProgramSubroutineParametersuivNV fp_glProgramSubroutineParametersuivNV;\ntypedef void (APIENTRYP pfn_glGetProgramSubroutineParameteruivNV) (GLenum, GLuint, GLuint*);\nextern pfn_glGetProgramSubroutineParameteruivNV fp_glGetProgramSubroutineParameteruivNV;\n\n /* GL_NV_gpu_program5_mem_extended */\nextern GLboolean GLAD_NV_gpu_program5_mem_extended;\n\n /* GL_NV_gpu_shader5 */\nextern GLboolean GLAD_NV_gpu_shader5;\n\n /* GL_NV_half_float */\nextern GLboolean GLAD_NV_half_float;\n#define GL_HALF_FLOAT_NV                       0x140B\ntypedef void (APIENTRYP pfn_glVertex2hNV) (GLhalfNV, GLhalfNV);\nextern pfn_glVertex2hNV fp_glVertex2hNV;\ntypedef void (APIENTRYP pfn_glVertex2hvNV) (const GLhalfNV*);\nextern pfn_glVertex2hvNV fp_glVertex2hvNV;\ntypedef void (APIENTRYP pfn_glVertex3hNV) (GLhalfNV, GLhalfNV, GLhalfNV);\nextern pfn_glVertex3hNV fp_glVertex3hNV;\ntypedef void (APIENTRYP pfn_glVertex3hvNV) (const GLhalfNV*);\nextern pfn_glVertex3hvNV fp_glVertex3hvNV;\ntypedef void (APIENTRYP pfn_glVertex4hNV) (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV);\nextern pfn_glVertex4hNV fp_glVertex4hNV;\ntypedef void (APIENTRYP pfn_glVertex4hvNV) (const GLhalfNV*);\nextern pfn_glVertex4hvNV fp_glVertex4hvNV;\ntypedef void (APIENTRYP pfn_glNormal3hNV) (GLhalfNV, GLhalfNV, GLhalfNV);\nextern pfn_glNormal3hNV fp_glNormal3hNV;\ntypedef void (APIENTRYP pfn_glNormal3hvNV) (const GLhalfNV*);\nextern pfn_glNormal3hvNV fp_glNormal3hvNV;\ntypedef void (APIENTRYP pfn_glColor3hNV) (GLhalfNV, GLhalfNV, GLhalfNV);\nextern pfn_glColor3hNV fp_glColor3hNV;\ntypedef void (APIENTRYP pfn_glColor3hvNV) (const GLhalfNV*);\nextern pfn_glColor3hvNV fp_glColor3hvNV;\ntypedef void (APIENTRYP pfn_glColor4hNV) (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV);\nextern pfn_glColor4hNV fp_glColor4hNV;\ntypedef void (APIENTRYP pfn_glColor4hvNV) (const GLhalfNV*);\nextern pfn_glColor4hvNV fp_glColor4hvNV;\ntypedef void (APIENTRYP pfn_glTexCoord1hNV) (GLhalfNV);\nextern pfn_glTexCoord1hNV fp_glTexCoord1hNV;\ntypedef void (APIENTRYP pfn_glTexCoord1hvNV) (const GLhalfNV*);\nextern pfn_glTexCoord1hvNV fp_glTexCoord1hvNV;\ntypedef void (APIENTRYP pfn_glTexCoord2hNV) (GLhalfNV, GLhalfNV);\nextern pfn_glTexCoord2hNV fp_glTexCoord2hNV;\ntypedef void (APIENTRYP pfn_glTexCoord2hvNV) (const GLhalfNV*);\nextern pfn_glTexCoord2hvNV fp_glTexCoord2hvNV;\ntypedef void (APIENTRYP pfn_glTexCoord3hNV) (GLhalfNV, GLhalfNV, GLhalfNV);\nextern pfn_glTexCoord3hNV fp_glTexCoord3hNV;\ntypedef void (APIENTRYP pfn_glTexCoord3hvNV) (const GLhalfNV*);\nextern pfn_glTexCoord3hvNV fp_glTexCoord3hvNV;\ntypedef void (APIENTRYP pfn_glTexCoord4hNV) (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV);\nextern pfn_glTexCoord4hNV fp_glTexCoord4hNV;\ntypedef void (APIENTRYP pfn_glTexCoord4hvNV) (const GLhalfNV*);\nextern pfn_glTexCoord4hvNV fp_glTexCoord4hvNV;\ntypedef void (APIENTRYP pfn_glMultiTexCoord1hNV) (GLenum, GLhalfNV);\nextern pfn_glMultiTexCoord1hNV fp_glMultiTexCoord1hNV;\ntypedef void (APIENTRYP pfn_glMultiTexCoord1hvNV) (GLenum, const GLhalfNV*);\nextern pfn_glMultiTexCoord1hvNV fp_glMultiTexCoord1hvNV;\ntypedef void (APIENTRYP pfn_glMultiTexCoord2hNV) (GLenum, GLhalfNV, GLhalfNV);\nextern pfn_glMultiTexCoord2hNV fp_glMultiTexCoord2hNV;\ntypedef void (APIENTRYP pfn_glMultiTexCoord2hvNV) (GLenum, const GLhalfNV*);\nextern pfn_glMultiTexCoord2hvNV fp_glMultiTexCoord2hvNV;\ntypedef void (APIENTRYP pfn_glMultiTexCoord3hNV) (GLenum, GLhalfNV, GLhalfNV, GLhalfNV);\nextern pfn_glMultiTexCoord3hNV fp_glMultiTexCoord3hNV;\ntypedef void (APIENTRYP pfn_glMultiTexCoord3hvNV) (GLenum, const GLhalfNV*);\nextern pfn_glMultiTexCoord3hvNV fp_glMultiTexCoord3hvNV;\ntypedef void (APIENTRYP pfn_glMultiTexCoord4hNV) (GLenum, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV);\nextern pfn_glMultiTexCoord4hNV fp_glMultiTexCoord4hNV;\ntypedef void (APIENTRYP pfn_glMultiTexCoord4hvNV) (GLenum, const GLhalfNV*);\nextern pfn_glMultiTexCoord4hvNV fp_glMultiTexCoord4hvNV;\ntypedef void (APIENTRYP pfn_glFogCoordhNV) (GLhalfNV);\nextern pfn_glFogCoordhNV fp_glFogCoordhNV;\ntypedef void (APIENTRYP pfn_glFogCoordhvNV) (const GLhalfNV*);\nextern pfn_glFogCoordhvNV fp_glFogCoordhvNV;\ntypedef void (APIENTRYP pfn_glSecondaryColor3hNV) (GLhalfNV, GLhalfNV, GLhalfNV);\nextern pfn_glSecondaryColor3hNV fp_glSecondaryColor3hNV;\ntypedef void (APIENTRYP pfn_glSecondaryColor3hvNV) (const GLhalfNV*);\nextern pfn_glSecondaryColor3hvNV fp_glSecondaryColor3hvNV;\ntypedef void (APIENTRYP pfn_glVertexWeighthNV) (GLhalfNV);\nextern pfn_glVertexWeighthNV fp_glVertexWeighthNV;\ntypedef void (APIENTRYP pfn_glVertexWeighthvNV) (const GLhalfNV*);\nextern pfn_glVertexWeighthvNV fp_glVertexWeighthvNV;\ntypedef void (APIENTRYP pfn_glVertexAttrib1hNV) (GLuint, GLhalfNV);\nextern pfn_glVertexAttrib1hNV fp_glVertexAttrib1hNV;\ntypedef void (APIENTRYP pfn_glVertexAttrib1hvNV) (GLuint, const GLhalfNV*);\nextern pfn_glVertexAttrib1hvNV fp_glVertexAttrib1hvNV;\ntypedef void (APIENTRYP pfn_glVertexAttrib2hNV) (GLuint, GLhalfNV, GLhalfNV);\nextern pfn_glVertexAttrib2hNV fp_glVertexAttrib2hNV;\ntypedef void (APIENTRYP pfn_glVertexAttrib2hvNV) (GLuint, const GLhalfNV*);\nextern pfn_glVertexAttrib2hvNV fp_glVertexAttrib2hvNV;\ntypedef void (APIENTRYP pfn_glVertexAttrib3hNV) (GLuint, GLhalfNV, GLhalfNV, GLhalfNV);\nextern pfn_glVertexAttrib3hNV fp_glVertexAttrib3hNV;\ntypedef void (APIENTRYP pfn_glVertexAttrib3hvNV) (GLuint, const GLhalfNV*);\nextern pfn_glVertexAttrib3hvNV fp_glVertexAttrib3hvNV;\ntypedef void (APIENTRYP pfn_glVertexAttrib4hNV) (GLuint, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV);\nextern pfn_glVertexAttrib4hNV fp_glVertexAttrib4hNV;\ntypedef void (APIENTRYP pfn_glVertexAttrib4hvNV) (GLuint, const GLhalfNV*);\nextern pfn_glVertexAttrib4hvNV fp_glVertexAttrib4hvNV;\ntypedef void (APIENTRYP pfn_glVertexAttribs1hvNV) (GLuint, GLsizei, const GLhalfNV*);\nextern pfn_glVertexAttribs1hvNV fp_glVertexAttribs1hvNV;\ntypedef void (APIENTRYP pfn_glVertexAttribs2hvNV) (GLuint, GLsizei, const GLhalfNV*);\nextern pfn_glVertexAttribs2hvNV fp_glVertexAttribs2hvNV;\ntypedef void (APIENTRYP pfn_glVertexAttribs3hvNV) (GLuint, GLsizei, const GLhalfNV*);\nextern pfn_glVertexAttribs3hvNV fp_glVertexAttribs3hvNV;\ntypedef void (APIENTRYP pfn_glVertexAttribs4hvNV) (GLuint, GLsizei, const GLhalfNV*);\nextern pfn_glVertexAttribs4hvNV fp_glVertexAttribs4hvNV;\n\n /* GL_NV_image_formats */\nextern GLboolean GLAD_NV_image_formats;\n\n /* GL_NV_instanced_arrays */\nextern GLboolean GLAD_NV_instanced_arrays;\n#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_NV      0x88FE\ntypedef void (APIENTRYP pfn_glVertexAttribDivisorNV) (GLuint, GLuint);\nextern pfn_glVertexAttribDivisorNV fp_glVertexAttribDivisorNV;\n\n /* GL_NV_internalformat_sample_query */\nextern GLboolean GLAD_NV_internalformat_sample_query;\n#define GL_MULTISAMPLES_NV                     0x9371\n#define GL_SUPERSAMPLE_SCALE_X_NV              0x9372\n#define GL_SUPERSAMPLE_SCALE_Y_NV              0x9373\n#define GL_CONFORMANT_NV                       0x9374\ntypedef void (APIENTRYP pfn_glGetInternalformatSampleivNV) (GLenum, GLenum, GLsizei, GLenum, GLsizei, GLint*);\nextern pfn_glGetInternalformatSampleivNV fp_glGetInternalformatSampleivNV;\n\n /* GL_NV_multisample_coverage */\nextern GLboolean GLAD_NV_multisample_coverage;\n#define GL_SAMPLES_ARB                         0x80A9\n\n /* GL_NV_non_square_matrices */\nextern GLboolean GLAD_NV_non_square_matrices;\n#define GL_FLOAT_MAT2x3_NV                     0x8B65\n#define GL_FLOAT_MAT2x4_NV                     0x8B66\n#define GL_FLOAT_MAT3x2_NV                     0x8B67\n#define GL_FLOAT_MAT3x4_NV                     0x8B68\n#define GL_FLOAT_MAT4x2_NV                     0x8B69\n#define GL_FLOAT_MAT4x3_NV                     0x8B6A\ntypedef void (APIENTRYP pfn_glUniformMatrix2x3fvNV) (GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glUniformMatrix2x3fvNV fp_glUniformMatrix2x3fvNV;\ntypedef void (APIENTRYP pfn_glUniformMatrix3x2fvNV) (GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glUniformMatrix3x2fvNV fp_glUniformMatrix3x2fvNV;\ntypedef void (APIENTRYP pfn_glUniformMatrix2x4fvNV) (GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glUniformMatrix2x4fvNV fp_glUniformMatrix2x4fvNV;\ntypedef void (APIENTRYP pfn_glUniformMatrix4x2fvNV) (GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glUniformMatrix4x2fvNV fp_glUniformMatrix4x2fvNV;\ntypedef void (APIENTRYP pfn_glUniformMatrix3x4fvNV) (GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glUniformMatrix3x4fvNV fp_glUniformMatrix3x4fvNV;\ntypedef void (APIENTRYP pfn_glUniformMatrix4x3fvNV) (GLint, GLsizei, GLboolean, const GLfloat*);\nextern pfn_glUniformMatrix4x3fvNV fp_glUniformMatrix4x3fvNV;\n\n /* GL_NV_occlusion_query */\nextern GLboolean GLAD_NV_occlusion_query;\n#define GL_PIXEL_COUNTER_BITS_NV               0x8864\n#define GL_CURRENT_OCCLUSION_QUERY_ID_NV       0x8865\n#define GL_PIXEL_COUNT_NV                      0x8866\n#define GL_PIXEL_COUNT_AVAILABLE_NV            0x8867\ntypedef void (APIENTRYP pfn_glGenOcclusionQueriesNV) (GLsizei, GLuint*);\nextern pfn_glGenOcclusionQueriesNV fp_glGenOcclusionQueriesNV;\ntypedef void (APIENTRYP pfn_glDeleteOcclusionQueriesNV) (GLsizei, const GLuint*);\nextern pfn_glDeleteOcclusionQueriesNV fp_glDeleteOcclusionQueriesNV;\ntypedef GLboolean (APIENTRYP pfn_glIsOcclusionQueryNV) (GLuint);\nextern pfn_glIsOcclusionQueryNV fp_glIsOcclusionQueryNV;\ntypedef void (APIENTRYP pfn_glBeginOcclusionQueryNV) (GLuint);\nextern pfn_glBeginOcclusionQueryNV fp_glBeginOcclusionQueryNV;\ntypedef void (APIENTRYP pfn_glEndOcclusionQueryNV) ();\nextern pfn_glEndOcclusionQueryNV fp_glEndOcclusionQueryNV;\ntypedef void (APIENTRYP pfn_glGetOcclusionQueryivNV) (GLuint, GLenum, GLint*);\nextern pfn_glGetOcclusionQueryivNV fp_glGetOcclusionQueryivNV;\ntypedef void (APIENTRYP pfn_glGetOcclusionQueryuivNV) (GLuint, GLenum, GLuint*);\nextern pfn_glGetOcclusionQueryuivNV fp_glGetOcclusionQueryuivNV;\n\n /* GL_NV_parameter_buffer_object */\nextern GLboolean GLAD_NV_parameter_buffer_object;\n#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV  0x8DA0\n#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV  0x8DA1\n#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV  0x8DA2\n#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV  0x8DA3\n#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV  0x8DA4\ntypedef void (APIENTRYP pfn_glProgramBufferParametersfvNV) (GLenum, GLuint, GLuint, GLsizei, const GLfloat*);\nextern pfn_glProgramBufferParametersfvNV fp_glProgramBufferParametersfvNV;\ntypedef void (APIENTRYP pfn_glProgramBufferParametersIivNV) (GLenum, GLuint, GLuint, GLsizei, const GLint*);\nextern pfn_glProgramBufferParametersIivNV fp_glProgramBufferParametersIivNV;\ntypedef void (APIENTRYP pfn_glProgramBufferParametersIuivNV) (GLenum, GLuint, GLuint, GLsizei, const GLuint*);\nextern pfn_glProgramBufferParametersIuivNV fp_glProgramBufferParametersIuivNV;\n\n /* GL_NV_parameter_buffer_object2 */\nextern GLboolean GLAD_NV_parameter_buffer_object2;\n\n /* GL_NV_path_rendering */\nextern GLboolean GLAD_NV_path_rendering;\n#define GL_PATH_FORMAT_SVG_NV                  0x9070\n#define GL_PATH_FORMAT_PS_NV                   0x9071\n#define GL_STANDARD_FONT_NAME_NV               0x9072\n#define GL_SYSTEM_FONT_NAME_NV                 0x9073\n#define GL_FILE_NAME_NV                        0x9074\n#define GL_PATH_STROKE_WIDTH_NV                0x9075\n#define GL_PATH_END_CAPS_NV                    0x9076\n#define GL_PATH_INITIAL_END_CAP_NV             0x9077\n#define GL_PATH_TERMINAL_END_CAP_NV            0x9078\n#define GL_PATH_JOIN_STYLE_NV                  0x9079\n#define GL_PATH_MITER_LIMIT_NV                 0x907A\n#define GL_PATH_DASH_CAPS_NV                   0x907B\n#define GL_PATH_INITIAL_DASH_CAP_NV            0x907C\n#define GL_PATH_TERMINAL_DASH_CAP_NV           0x907D\n#define GL_PATH_DASH_OFFSET_NV                 0x907E\n#define GL_PATH_CLIENT_LENGTH_NV               0x907F\n#define GL_PATH_FILL_MODE_NV                   0x9080\n#define GL_PATH_FILL_MASK_NV                   0x9081\n#define GL_PATH_FILL_COVER_MODE_NV             0x9082\n#define GL_PATH_STROKE_COVER_MODE_NV           0x9083\n#define GL_PATH_STROKE_MASK_NV                 0x9084\n#define GL_COUNT_UP_NV                         0x9088\n#define GL_COUNT_DOWN_NV                       0x9089\n#define GL_PATH_OBJECT_BOUNDING_BOX_NV         0x908A\n#define GL_CONVEX_HULL_NV                      0x908B\n#define GL_BOUNDING_BOX_NV                     0x908D\n#define GL_TRANSLATE_X_NV                      0x908E\n#define GL_TRANSLATE_Y_NV                      0x908F\n#define GL_TRANSLATE_2D_NV                     0x9090\n#define GL_TRANSLATE_3D_NV                     0x9091\n#define GL_AFFINE_2D_NV                        0x9092\n#define GL_AFFINE_3D_NV                        0x9094\n#define GL_TRANSPOSE_AFFINE_2D_NV              0x9096\n#define GL_TRANSPOSE_AFFINE_3D_NV              0x9098\n#define GL_UTF8_NV                             0x909A\n#define GL_UTF16_NV                            0x909B\n#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV   0x909C\n#define GL_PATH_COMMAND_COUNT_NV               0x909D\n#define GL_PATH_COORD_COUNT_NV                 0x909E\n#define GL_PATH_DASH_ARRAY_COUNT_NV            0x909F\n#define GL_PATH_COMPUTED_LENGTH_NV             0x90A0\n#define GL_PATH_FILL_BOUNDING_BOX_NV           0x90A1\n#define GL_PATH_STROKE_BOUNDING_BOX_NV         0x90A2\n#define GL_SQUARE_NV                           0x90A3\n#define GL_ROUND_NV                            0x90A4\n#define GL_TRIANGULAR_NV                       0x90A5\n#define GL_BEVEL_NV                            0x90A6\n#define GL_MITER_REVERT_NV                     0x90A7\n#define GL_MITER_TRUNCATE_NV                   0x90A8\n#define GL_SKIP_MISSING_GLYPH_NV               0x90A9\n#define GL_USE_MISSING_GLYPH_NV                0x90AA\n#define GL_PATH_ERROR_POSITION_NV              0x90AB\n#define GL_ACCUM_ADJACENT_PAIRS_NV             0x90AD\n#define GL_ADJACENT_PAIRS_NV                   0x90AE\n#define GL_FIRST_TO_REST_NV                    0x90AF\n#define GL_PATH_GEN_MODE_NV                    0x90B0\n#define GL_PATH_GEN_COEFF_NV                   0x90B1\n#define GL_PATH_GEN_COMPONENTS_NV              0x90B3\n#define GL_PATH_STENCIL_FUNC_NV                0x90B7\n#define GL_PATH_STENCIL_REF_NV                 0x90B8\n#define GL_PATH_STENCIL_VALUE_MASK_NV          0x90B9\n#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV  0x90BD\n#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV  0x90BE\n#define GL_PATH_COVER_DEPTH_FUNC_NV            0x90BF\n#define GL_PATH_DASH_OFFSET_RESET_NV           0x90B4\n#define GL_MOVE_TO_RESETS_NV                   0x90B5\n#define GL_MOVE_TO_CONTINUES_NV                0x90B6\n#define GL_CLOSE_PATH_NV                       0x00\n#define GL_MOVE_TO_NV                          0x02\n#define GL_RELATIVE_MOVE_TO_NV                 0x03\n#define GL_LINE_TO_NV                          0x04\n#define GL_RELATIVE_LINE_TO_NV                 0x05\n#define GL_HORIZONTAL_LINE_TO_NV               0x06\n#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV      0x07\n#define GL_VERTICAL_LINE_TO_NV                 0x08\n#define GL_RELATIVE_VERTICAL_LINE_TO_NV        0x09\n#define GL_QUADRATIC_CURVE_TO_NV               0x0A\n#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV      0x0B\n#define GL_CUBIC_CURVE_TO_NV                   0x0C\n#define GL_RELATIVE_CUBIC_CURVE_TO_NV          0x0D\n#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV        0x0E\n#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV  0x0F\n#define GL_SMOOTH_CUBIC_CURVE_TO_NV            0x10\n#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV   0x11\n#define GL_SMALL_CCW_ARC_TO_NV                 0x12\n#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV        0x13\n#define GL_SMALL_CW_ARC_TO_NV                  0x14\n#define GL_RELATIVE_SMALL_CW_ARC_TO_NV         0x15\n#define GL_LARGE_CCW_ARC_TO_NV                 0x16\n#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV        0x17\n#define GL_LARGE_CW_ARC_TO_NV                  0x18\n#define GL_RELATIVE_LARGE_CW_ARC_TO_NV         0x19\n#define GL_RESTART_PATH_NV                     0xF0\n#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV         0xF2\n#define GL_DUP_LAST_CUBIC_CURVE_TO_NV          0xF4\n#define GL_RECT_NV                             0xF6\n#define GL_CIRCULAR_CCW_ARC_TO_NV              0xF8\n#define GL_CIRCULAR_CW_ARC_TO_NV               0xFA\n#define GL_CIRCULAR_TANGENT_ARC_TO_NV          0xFC\n#define GL_ARC_TO_NV                           0xFE\n#define GL_RELATIVE_ARC_TO_NV                  0xFF\n#define GL_BOLD_BIT_NV                         0x01\n#define GL_ITALIC_BIT_NV                       0x02\n#define GL_GLYPH_WIDTH_BIT_NV                  0x01\n#define GL_GLYPH_HEIGHT_BIT_NV                 0x02\n#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV   0x04\n#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV   0x08\n#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV  0x10\n#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV     0x20\n#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV     0x40\n#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV  0x80\n#define GL_GLYPH_HAS_KERNING_BIT_NV            0x100\n#define GL_FONT_X_MIN_BOUNDS_BIT_NV            0x00010000\n#define GL_FONT_Y_MIN_BOUNDS_BIT_NV            0x00020000\n#define GL_FONT_X_MAX_BOUNDS_BIT_NV            0x00040000\n#define GL_FONT_Y_MAX_BOUNDS_BIT_NV            0x00080000\n#define GL_FONT_UNITS_PER_EM_BIT_NV            0x00100000\n#define GL_FONT_ASCENDER_BIT_NV                0x00200000\n#define GL_FONT_DESCENDER_BIT_NV               0x00400000\n#define GL_FONT_HEIGHT_BIT_NV                  0x00800000\n#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV       0x01000000\n#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV      0x02000000\n#define GL_FONT_UNDERLINE_POSITION_BIT_NV      0x04000000\n#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV     0x08000000\n#define GL_FONT_HAS_KERNING_BIT_NV             0x10000000\n#define GL_ROUNDED_RECT_NV                     0xE8\n#define GL_RELATIVE_ROUNDED_RECT_NV            0xE9\n#define GL_ROUNDED_RECT2_NV                    0xEA\n#define GL_RELATIVE_ROUNDED_RECT2_NV           0xEB\n#define GL_ROUNDED_RECT4_NV                    0xEC\n#define GL_RELATIVE_ROUNDED_RECT4_NV           0xED\n#define GL_ROUNDED_RECT8_NV                    0xEE\n#define GL_RELATIVE_ROUNDED_RECT8_NV           0xEF\n#define GL_RELATIVE_RECT_NV                    0xF7\n#define GL_FONT_GLYPHS_AVAILABLE_NV            0x9368\n#define GL_FONT_TARGET_UNAVAILABLE_NV          0x9369\n#define GL_FONT_UNAVAILABLE_NV                 0x936A\n#define GL_FONT_UNINTELLIGIBLE_NV              0x936B\n#define GL_CONIC_CURVE_TO_NV                   0x1A\n#define GL_RELATIVE_CONIC_CURVE_TO_NV          0x1B\n#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV       0x20000000\n#define GL_STANDARD_FONT_FORMAT_NV             0x936C\n#define GL_2_BYTES_NV                          0x1407\n#define GL_3_BYTES_NV                          0x1408\n#define GL_4_BYTES_NV                          0x1409\n#define GL_EYE_LINEAR_NV                       0x2400\n#define GL_OBJECT_LINEAR_NV                    0x2401\n#define GL_CONSTANT_NV                         0x8576\n#define GL_PATH_FOG_GEN_MODE_NV                0x90AC\n#define GL_PRIMARY_COLOR_NV                    0x852C\n#define GL_SECONDARY_COLOR_NV                  0x852D\n#define GL_PATH_GEN_COLOR_FORMAT_NV            0x90B2\n#define GL_PATH_PROJECTION_NV                  0x1701\n#define GL_PATH_MODELVIEW_NV                   0x1700\n#define GL_PATH_MODELVIEW_STACK_DEPTH_NV       0x0BA3\n#define GL_PATH_MODELVIEW_MATRIX_NV            0x0BA6\n#define GL_PATH_MAX_MODELVIEW_STACK_DEPTH_NV   0x0D36\n#define GL_PATH_TRANSPOSE_MODELVIEW_MATRIX_NV  0x84E3\n#define GL_PATH_PROJECTION_STACK_DEPTH_NV      0x0BA4\n#define GL_PATH_PROJECTION_MATRIX_NV           0x0BA7\n#define GL_PATH_MAX_PROJECTION_STACK_DEPTH_NV  0x0D38\n#define GL_PATH_TRANSPOSE_PROJECTION_MATRIX_NV  0x84E4\n#define GL_FRAGMENT_INPUT_NV                   0x936D\ntypedef GLuint (APIENTRYP pfn_glGenPathsNV) (GLsizei);\nextern pfn_glGenPathsNV fp_glGenPathsNV;\ntypedef void (APIENTRYP pfn_glDeletePathsNV) (GLuint, GLsizei);\nextern pfn_glDeletePathsNV fp_glDeletePathsNV;\ntypedef GLboolean (APIENTRYP pfn_glIsPathNV) (GLuint);\nextern pfn_glIsPathNV fp_glIsPathNV;\ntypedef void (APIENTRYP pfn_glPathCommandsNV) (GLuint, GLsizei, const GLubyte*, GLsizei, GLenum, const void*);\nextern pfn_glPathCommandsNV fp_glPathCommandsNV;\ntypedef void (APIENTRYP pfn_glPathCoordsNV) (GLuint, GLsizei, GLenum, const void*);\nextern pfn_glPathCoordsNV fp_glPathCoordsNV;\ntypedef void (APIENTRYP pfn_glPathSubCommandsNV) (GLuint, GLsizei, GLsizei, GLsizei, const GLubyte*, GLsizei, GLenum, const void*);\nextern pfn_glPathSubCommandsNV fp_glPathSubCommandsNV;\ntypedef void (APIENTRYP pfn_glPathSubCoordsNV) (GLuint, GLsizei, GLsizei, GLenum, const void*);\nextern pfn_glPathSubCoordsNV fp_glPathSubCoordsNV;\ntypedef void (APIENTRYP pfn_glPathStringNV) (GLuint, GLenum, GLsizei, const void*);\nextern pfn_glPathStringNV fp_glPathStringNV;\ntypedef void (APIENTRYP pfn_glPathGlyphsNV) (GLuint, GLenum, const void*, GLbitfield, GLsizei, GLenum, const void*, GLenum, GLuint, GLfloat);\nextern pfn_glPathGlyphsNV fp_glPathGlyphsNV;\ntypedef void (APIENTRYP pfn_glPathGlyphRangeNV) (GLuint, GLenum, const void*, GLbitfield, GLuint, GLsizei, GLenum, GLuint, GLfloat);\nextern pfn_glPathGlyphRangeNV fp_glPathGlyphRangeNV;\ntypedef void (APIENTRYP pfn_glWeightPathsNV) (GLuint, GLsizei, const GLuint*, const GLfloat*);\nextern pfn_glWeightPathsNV fp_glWeightPathsNV;\ntypedef void (APIENTRYP pfn_glCopyPathNV) (GLuint, GLuint);\nextern pfn_glCopyPathNV fp_glCopyPathNV;\ntypedef void (APIENTRYP pfn_glInterpolatePathsNV) (GLuint, GLuint, GLuint, GLfloat);\nextern pfn_glInterpolatePathsNV fp_glInterpolatePathsNV;\ntypedef void (APIENTRYP pfn_glTransformPathNV) (GLuint, GLuint, GLenum, const GLfloat*);\nextern pfn_glTransformPathNV fp_glTransformPathNV;\ntypedef void (APIENTRYP pfn_glPathParameterivNV) (GLuint, GLenum, const GLint*);\nextern pfn_glPathParameterivNV fp_glPathParameterivNV;\ntypedef void (APIENTRYP pfn_glPathParameteriNV) (GLuint, GLenum, GLint);\nextern pfn_glPathParameteriNV fp_glPathParameteriNV;\ntypedef void (APIENTRYP pfn_glPathParameterfvNV) (GLuint, GLenum, const GLfloat*);\nextern pfn_glPathParameterfvNV fp_glPathParameterfvNV;\ntypedef void (APIENTRYP pfn_glPathParameterfNV) (GLuint, GLenum, GLfloat);\nextern pfn_glPathParameterfNV fp_glPathParameterfNV;\ntypedef void (APIENTRYP pfn_glPathDashArrayNV) (GLuint, GLsizei, const GLfloat*);\nextern pfn_glPathDashArrayNV fp_glPathDashArrayNV;\ntypedef void (APIENTRYP pfn_glPathStencilFuncNV) (GLenum, GLint, GLuint);\nextern pfn_glPathStencilFuncNV fp_glPathStencilFuncNV;\ntypedef void (APIENTRYP pfn_glPathStencilDepthOffsetNV) (GLfloat, GLfloat);\nextern pfn_glPathStencilDepthOffsetNV fp_glPathStencilDepthOffsetNV;\ntypedef void (APIENTRYP pfn_glStencilFillPathNV) (GLuint, GLenum, GLuint);\nextern pfn_glStencilFillPathNV fp_glStencilFillPathNV;\ntypedef void (APIENTRYP pfn_glStencilStrokePathNV) (GLuint, GLint, GLuint);\nextern pfn_glStencilStrokePathNV fp_glStencilStrokePathNV;\ntypedef void (APIENTRYP pfn_glStencilFillPathInstancedNV) (GLsizei, GLenum, const void*, GLuint, GLenum, GLuint, GLenum, const GLfloat*);\nextern pfn_glStencilFillPathInstancedNV fp_glStencilFillPathInstancedNV;\ntypedef void (APIENTRYP pfn_glStencilStrokePathInstancedNV) (GLsizei, GLenum, const void*, GLuint, GLint, GLuint, GLenum, const GLfloat*);\nextern pfn_glStencilStrokePathInstancedNV fp_glStencilStrokePathInstancedNV;\ntypedef void (APIENTRYP pfn_glPathCoverDepthFuncNV) (GLenum);\nextern pfn_glPathCoverDepthFuncNV fp_glPathCoverDepthFuncNV;\ntypedef void (APIENTRYP pfn_glCoverFillPathNV) (GLuint, GLenum);\nextern pfn_glCoverFillPathNV fp_glCoverFillPathNV;\ntypedef void (APIENTRYP pfn_glCoverStrokePathNV) (GLuint, GLenum);\nextern pfn_glCoverStrokePathNV fp_glCoverStrokePathNV;\ntypedef void (APIENTRYP pfn_glCoverFillPathInstancedNV) (GLsizei, GLenum, const void*, GLuint, GLenum, GLenum, const GLfloat*);\nextern pfn_glCoverFillPathInstancedNV fp_glCoverFillPathInstancedNV;\ntypedef void (APIENTRYP pfn_glCoverStrokePathInstancedNV) (GLsizei, GLenum, const void*, GLuint, GLenum, GLenum, const GLfloat*);\nextern pfn_glCoverStrokePathInstancedNV fp_glCoverStrokePathInstancedNV;\ntypedef void (APIENTRYP pfn_glGetPathParameterivNV) (GLuint, GLenum, GLint*);\nextern pfn_glGetPathParameterivNV fp_glGetPathParameterivNV;\ntypedef void (APIENTRYP pfn_glGetPathParameterfvNV) (GLuint, GLenum, GLfloat*);\nextern pfn_glGetPathParameterfvNV fp_glGetPathParameterfvNV;\ntypedef void (APIENTRYP pfn_glGetPathCommandsNV) (GLuint, GLubyte*);\nextern pfn_glGetPathCommandsNV fp_glGetPathCommandsNV;\ntypedef void (APIENTRYP pfn_glGetPathCoordsNV) (GLuint, GLfloat*);\nextern pfn_glGetPathCoordsNV fp_glGetPathCoordsNV;\ntypedef void (APIENTRYP pfn_glGetPathDashArrayNV) (GLuint, GLfloat*);\nextern pfn_glGetPathDashArrayNV fp_glGetPathDashArrayNV;\ntypedef void (APIENTRYP pfn_glGetPathMetricsNV) (GLbitfield, GLsizei, GLenum, const void*, GLuint, GLsizei, GLfloat*);\nextern pfn_glGetPathMetricsNV fp_glGetPathMetricsNV;\ntypedef void (APIENTRYP pfn_glGetPathMetricRangeNV) (GLbitfield, GLuint, GLsizei, GLsizei, GLfloat*);\nextern pfn_glGetPathMetricRangeNV fp_glGetPathMetricRangeNV;\ntypedef void (APIENTRYP pfn_glGetPathSpacingNV) (GLenum, GLsizei, GLenum, const void*, GLuint, GLfloat, GLfloat, GLenum, GLfloat*);\nextern pfn_glGetPathSpacingNV fp_glGetPathSpacingNV;\ntypedef GLboolean (APIENTRYP pfn_glIsPointInFillPathNV) (GLuint, GLuint, GLfloat, GLfloat);\nextern pfn_glIsPointInFillPathNV fp_glIsPointInFillPathNV;\ntypedef GLboolean (APIENTRYP pfn_glIsPointInStrokePathNV) (GLuint, GLfloat, GLfloat);\nextern pfn_glIsPointInStrokePathNV fp_glIsPointInStrokePathNV;\ntypedef GLfloat (APIENTRYP pfn_glGetPathLengthNV) (GLuint, GLsizei, GLsizei);\nextern pfn_glGetPathLengthNV fp_glGetPathLengthNV;\ntypedef GLboolean (APIENTRYP pfn_glPointAlongPathNV) (GLuint, GLsizei, GLsizei, GLfloat, GLfloat*, GLfloat*, GLfloat*, GLfloat*);\nextern pfn_glPointAlongPathNV fp_glPointAlongPathNV;\ntypedef void (APIENTRYP pfn_glMatrixLoad3x2fNV) (GLenum, const GLfloat*);\nextern pfn_glMatrixLoad3x2fNV fp_glMatrixLoad3x2fNV;\ntypedef void (APIENTRYP pfn_glMatrixLoad3x3fNV) (GLenum, const GLfloat*);\nextern pfn_glMatrixLoad3x3fNV fp_glMatrixLoad3x3fNV;\ntypedef void (APIENTRYP pfn_glMatrixLoadTranspose3x3fNV) (GLenum, const GLfloat*);\nextern pfn_glMatrixLoadTranspose3x3fNV fp_glMatrixLoadTranspose3x3fNV;\ntypedef void (APIENTRYP pfn_glMatrixMult3x2fNV) (GLenum, const GLfloat*);\nextern pfn_glMatrixMult3x2fNV fp_glMatrixMult3x2fNV;\ntypedef void (APIENTRYP pfn_glMatrixMult3x3fNV) (GLenum, const GLfloat*);\nextern pfn_glMatrixMult3x3fNV fp_glMatrixMult3x3fNV;\ntypedef void (APIENTRYP pfn_glMatrixMultTranspose3x3fNV) (GLenum, const GLfloat*);\nextern pfn_glMatrixMultTranspose3x3fNV fp_glMatrixMultTranspose3x3fNV;\ntypedef void (APIENTRYP pfn_glStencilThenCoverFillPathNV) (GLuint, GLenum, GLuint, GLenum);\nextern pfn_glStencilThenCoverFillPathNV fp_glStencilThenCoverFillPathNV;\ntypedef void (APIENTRYP pfn_glStencilThenCoverStrokePathNV) (GLuint, GLint, GLuint, GLenum);\nextern pfn_glStencilThenCoverStrokePathNV fp_glStencilThenCoverStrokePathNV;\ntypedef void (APIENTRYP pfn_glStencilThenCoverFillPathInstancedNV) (GLsizei, GLenum, const void*, GLuint, GLenum, GLuint, GLenum, GLenum, const GLfloat*);\nextern pfn_glStencilThenCoverFillPathInstancedNV fp_glStencilThenCoverFillPathInstancedNV;\ntypedef void (APIENTRYP pfn_glStencilThenCoverStrokePathInstancedNV) (GLsizei, GLenum, const void*, GLuint, GLint, GLuint, GLenum, GLenum, const GLfloat*);\nextern pfn_glStencilThenCoverStrokePathInstancedNV fp_glStencilThenCoverStrokePathInstancedNV;\ntypedef GLenum (APIENTRYP pfn_glPathGlyphIndexRangeNV) (GLenum, const void*, GLbitfield, GLuint, GLfloat, GLuint);\nextern pfn_glPathGlyphIndexRangeNV fp_glPathGlyphIndexRangeNV;\ntypedef GLenum (APIENTRYP pfn_glPathGlyphIndexArrayNV) (GLuint, GLenum, const void*, GLbitfield, GLuint, GLsizei, GLuint, GLfloat);\nextern pfn_glPathGlyphIndexArrayNV fp_glPathGlyphIndexArrayNV;\ntypedef GLenum (APIENTRYP pfn_glPathMemoryGlyphIndexArrayNV) (GLuint, GLenum, GLsizeiptr, const void*, GLsizei, GLuint, GLsizei, GLuint, GLfloat);\nextern pfn_glPathMemoryGlyphIndexArrayNV fp_glPathMemoryGlyphIndexArrayNV;\ntypedef void (APIENTRYP pfn_glProgramPathFragmentInputGenNV) (GLuint, GLint, GLenum, GLint, const GLfloat*);\nextern pfn_glProgramPathFragmentInputGenNV fp_glProgramPathFragmentInputGenNV;\ntypedef void (APIENTRYP pfn_glGetProgramResourcefvNV) (GLuint, GLenum, GLuint, GLsizei, const GLenum*, GLsizei, GLsizei*, GLfloat*);\nextern pfn_glGetProgramResourcefvNV fp_glGetProgramResourcefvNV;\ntypedef void (APIENTRYP pfn_glPathColorGenNV) (GLenum, GLenum, GLenum, const GLfloat*);\nextern pfn_glPathColorGenNV fp_glPathColorGenNV;\ntypedef void (APIENTRYP pfn_glPathTexGenNV) (GLenum, GLenum, GLint, const GLfloat*);\nextern pfn_glPathTexGenNV fp_glPathTexGenNV;\ntypedef void (APIENTRYP pfn_glPathFogGenNV) (GLenum);\nextern pfn_glPathFogGenNV fp_glPathFogGenNV;\ntypedef void (APIENTRYP pfn_glGetPathColorGenivNV) (GLenum, GLenum, GLint*);\nextern pfn_glGetPathColorGenivNV fp_glGetPathColorGenivNV;\ntypedef void (APIENTRYP pfn_glGetPathColorGenfvNV) (GLenum, GLenum, GLfloat*);\nextern pfn_glGetPathColorGenfvNV fp_glGetPathColorGenfvNV;\ntypedef void (APIENTRYP pfn_glGetPathTexGenivNV) (GLenum, GLenum, GLint*);\nextern pfn_glGetPathTexGenivNV fp_glGetPathTexGenivNV;\ntypedef void (APIENTRYP pfn_glGetPathTexGenfvNV) (GLenum, GLenum, GLfloat*);\nextern pfn_glGetPathTexGenfvNV fp_glGetPathTexGenfvNV;\n\n /* GL_NV_path_rendering_shared_edge */\nextern GLboolean GLAD_NV_path_rendering_shared_edge;\n#define GL_SHARED_EDGE_NV                      0xC0\n\n /* GL_NV_polygon_mode */\nextern GLboolean GLAD_NV_polygon_mode;\n#define GL_POLYGON_MODE_NV                     0x0B40\n#define GL_POLYGON_OFFSET_POINT_NV             0x2A01\n#define GL_POLYGON_OFFSET_LINE_NV              0x2A02\n#define GL_POINT_NV                            0x1B00\n#define GL_LINE_NV                             0x1B01\n#define GL_FILL_NV                             0x1B02\ntypedef void (APIENTRYP pfn_glPolygonModeNV) (GLenum, GLenum);\nextern pfn_glPolygonModeNV fp_glPolygonModeNV;\n\n /* GL_NV_present_video */\nextern GLboolean GLAD_NV_present_video;\n#define GL_FRAME_NV                            0x8E26\n#define GL_FIELDS_NV                           0x8E27\n#define GL_CURRENT_TIME_NV                     0x8E28\n#define GL_NUM_FILL_STREAMS_NV                 0x8E29\n#define GL_PRESENT_TIME_NV                     0x8E2A\n#define GL_PRESENT_DURATION_NV                 0x8E2B\ntypedef void (APIENTRYP pfn_glPresentFrameKeyedNV) (GLuint, GLuint64EXT, GLuint, GLuint, GLenum, GLenum, GLuint, GLuint, GLenum, GLuint, GLuint);\nextern pfn_glPresentFrameKeyedNV fp_glPresentFrameKeyedNV;\ntypedef void (APIENTRYP pfn_glPresentFrameDualFillNV) (GLuint, GLuint64EXT, GLuint, GLuint, GLenum, GLenum, GLuint, GLenum, GLuint, GLenum, GLuint, GLenum, GLuint);\nextern pfn_glPresentFrameDualFillNV fp_glPresentFrameDualFillNV;\ntypedef void (APIENTRYP pfn_glGetVideoivNV) (GLuint, GLenum, GLint*);\nextern pfn_glGetVideoivNV fp_glGetVideoivNV;\ntypedef void (APIENTRYP pfn_glGetVideouivNV) (GLuint, GLenum, GLuint*);\nextern pfn_glGetVideouivNV fp_glGetVideouivNV;\ntypedef void (APIENTRYP pfn_glGetVideoi64vNV) (GLuint, GLenum, GLint64EXT*);\nextern pfn_glGetVideoi64vNV fp_glGetVideoi64vNV;\ntypedef void (APIENTRYP pfn_glGetVideoui64vNV) (GLuint, GLenum, GLuint64EXT*);\nextern pfn_glGetVideoui64vNV fp_glGetVideoui64vNV;\n\n /* GL_NV_primitive_restart */\nextern GLboolean GLAD_NV_primitive_restart;\n#define GL_PRIMITIVE_RESTART_NV                0x8558\n#define GL_PRIMITIVE_RESTART_INDEX_NV          0x8559\ntypedef void (APIENTRYP pfn_glPrimitiveRestartNV) ();\nextern pfn_glPrimitiveRestartNV fp_glPrimitiveRestartNV;\ntypedef void (APIENTRYP pfn_glPrimitiveRestartIndexNV) (GLuint);\nextern pfn_glPrimitiveRestartIndexNV fp_glPrimitiveRestartIndexNV;\n\n /* GL_NV_read_buffer */\nextern GLboolean GLAD_NV_read_buffer;\n#define GL_READ_BUFFER_NV                      0x0C02\ntypedef void (APIENTRYP pfn_glReadBufferNV) (GLenum);\nextern pfn_glReadBufferNV fp_glReadBufferNV;\n\n /* GL_NV_read_buffer_front */\nextern GLboolean GLAD_NV_read_buffer_front;\n\n /* GL_NV_read_depth */\nextern GLboolean GLAD_NV_read_depth;\n\n /* GL_NV_read_depth_stencil */\nextern GLboolean GLAD_NV_read_depth_stencil;\n\n /* GL_NV_read_stencil */\nextern GLboolean GLAD_NV_read_stencil;\n\n /* GL_NV_sample_locations */\nextern GLboolean GLAD_NV_sample_locations;\n#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV    0x933D\n#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV  0x933E\n#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV  0x933F\n#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV  0x9340\n#define GL_SAMPLE_LOCATION_NV                  0x8E50\n#define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV     0x9341\n#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV  0x9342\n#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV  0x9343\ntypedef void (APIENTRYP pfn_glFramebufferSampleLocationsfvNV) (GLenum, GLuint, GLsizei, const GLfloat*);\nextern pfn_glFramebufferSampleLocationsfvNV fp_glFramebufferSampleLocationsfvNV;\ntypedef void (APIENTRYP pfn_glNamedFramebufferSampleLocationsfvNV) (GLuint, GLuint, GLsizei, const GLfloat*);\nextern pfn_glNamedFramebufferSampleLocationsfvNV fp_glNamedFramebufferSampleLocationsfvNV;\ntypedef void (APIENTRYP pfn_glResolveDepthValuesNV) ();\nextern pfn_glResolveDepthValuesNV fp_glResolveDepthValuesNV;\n\n /* GL_NV_sample_mask_override_coverage */\nextern GLboolean GLAD_NV_sample_mask_override_coverage;\n\n /* GL_NV_shader_atomic_counters */\nextern GLboolean GLAD_NV_shader_atomic_counters;\n\n /* GL_NV_shader_atomic_float */\nextern GLboolean GLAD_NV_shader_atomic_float;\n\n /* GL_NV_shader_atomic_fp16_vector */\nextern GLboolean GLAD_NV_shader_atomic_fp16_vector;\n\n /* GL_NV_shader_atomic_int64 */\nextern GLboolean GLAD_NV_shader_atomic_int64;\n\n /* GL_NV_shader_buffer_load */\nextern GLboolean GLAD_NV_shader_buffer_load;\n#define GL_BUFFER_GPU_ADDRESS_NV               0x8F1D\n#define GL_GPU_ADDRESS_NV                      0x8F34\n#define GL_MAX_SHADER_BUFFER_ADDRESS_NV        0x8F35\ntypedef void (APIENTRYP pfn_glMakeBufferResidentNV) (GLenum, GLenum);\nextern pfn_glMakeBufferResidentNV fp_glMakeBufferResidentNV;\ntypedef void (APIENTRYP pfn_glMakeBufferNonResidentNV) (GLenum);\nextern pfn_glMakeBufferNonResidentNV fp_glMakeBufferNonResidentNV;\ntypedef GLboolean (APIENTRYP pfn_glIsBufferResidentNV) (GLenum);\nextern pfn_glIsBufferResidentNV fp_glIsBufferResidentNV;\ntypedef void (APIENTRYP pfn_glMakeNamedBufferResidentNV) (GLuint, GLenum);\nextern pfn_glMakeNamedBufferResidentNV fp_glMakeNamedBufferResidentNV;\ntypedef void (APIENTRYP pfn_glMakeNamedBufferNonResidentNV) (GLuint);\nextern pfn_glMakeNamedBufferNonResidentNV fp_glMakeNamedBufferNonResidentNV;\ntypedef GLboolean (APIENTRYP pfn_glIsNamedBufferResidentNV) (GLuint);\nextern pfn_glIsNamedBufferResidentNV fp_glIsNamedBufferResidentNV;\ntypedef void (APIENTRYP pfn_glGetBufferParameterui64vNV) (GLenum, GLenum, GLuint64EXT*);\nextern pfn_glGetBufferParameterui64vNV fp_glGetBufferParameterui64vNV;\ntypedef void (APIENTRYP pfn_glGetNamedBufferParameterui64vNV) (GLuint, GLenum, GLuint64EXT*);\nextern pfn_glGetNamedBufferParameterui64vNV fp_glGetNamedBufferParameterui64vNV;\ntypedef void (APIENTRYP pfn_glGetIntegerui64vNV) (GLenum, GLuint64EXT*);\nextern pfn_glGetIntegerui64vNV fp_glGetIntegerui64vNV;\ntypedef void (APIENTRYP pfn_glUniformui64NV) (GLint, GLuint64EXT);\nextern pfn_glUniformui64NV fp_glUniformui64NV;\ntypedef void (APIENTRYP pfn_glUniformui64vNV) (GLint, GLsizei, const GLuint64EXT*);\nextern pfn_glUniformui64vNV fp_glUniformui64vNV;\ntypedef void (APIENTRYP pfn_glProgramUniformui64NV) (GLuint, GLint, GLuint64EXT);\nextern pfn_glProgramUniformui64NV fp_glProgramUniformui64NV;\ntypedef void (APIENTRYP pfn_glProgramUniformui64vNV) (GLuint, GLint, GLsizei, const GLuint64EXT*);\nextern pfn_glProgramUniformui64vNV fp_glProgramUniformui64vNV;\n\n /* GL_NV_shader_buffer_store */\nextern GLboolean GLAD_NV_shader_buffer_store;\n#define GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV  0x00000010\n\n /* GL_NV_shader_noperspective_interpolation */\nextern GLboolean GLAD_NV_shader_noperspective_interpolation;\n\n /* GL_NV_shader_storage_buffer_object */\nextern GLboolean GLAD_NV_shader_storage_buffer_object;\n\n /* GL_NV_shader_thread_group */\nextern GLboolean GLAD_NV_shader_thread_group;\n#define GL_WARP_SIZE_NV                        0x9339\n#define GL_WARPS_PER_SM_NV                     0x933A\n#define GL_SM_COUNT_NV                         0x933B\n\n /* GL_NV_shader_thread_shuffle */\nextern GLboolean GLAD_NV_shader_thread_shuffle;\n\n /* GL_NV_shadow_samplers_array */\nextern GLboolean GLAD_NV_shadow_samplers_array;\n#define GL_SAMPLER_2D_ARRAY_SHADOW_NV          0x8DC4\n\n /* GL_NV_shadow_samplers_cube */\nextern GLboolean GLAD_NV_shadow_samplers_cube;\n#define GL_SAMPLER_CUBE_SHADOW_NV              0x8DC5\n\n /* GL_NV_sRGB_formats */\nextern GLboolean GLAD_NV_sRGB_formats;\n#define GL_SLUMINANCE_NV                       0x8C46\n#define GL_SLUMINANCE_ALPHA_NV                 0x8C44\n#define GL_SRGB8_NV                            0x8C41\n#define GL_SLUMINANCE8_NV                      0x8C47\n#define GL_SLUMINANCE8_ALPHA8_NV               0x8C45\n#define GL_COMPRESSED_SRGB_S3TC_DXT1_NV        0x8C4C\n#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV  0x8C4D\n#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV  0x8C4E\n#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV  0x8C4F\n#define GL_ETC1_SRGB8_NV                       0x88EE\n\n /* GL_NV_tessellation_program5 */\nextern GLboolean GLAD_NV_tessellation_program5;\n#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV        0x86D8\n#define GL_TESS_CONTROL_PROGRAM_NV             0x891E\n#define GL_TESS_EVALUATION_PROGRAM_NV          0x891F\n#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV  0x8C74\n#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV  0x8C75\n\n /* GL_NV_texture_barrier */\nextern GLboolean GLAD_NV_texture_barrier;\ntypedef void (APIENTRYP pfn_glTextureBarrierNV) ();\nextern pfn_glTextureBarrierNV fp_glTextureBarrierNV;\n\n /* GL_NV_texture_border_clamp */\nextern GLboolean GLAD_NV_texture_border_clamp;\n#define GL_TEXTURE_BORDER_COLOR_NV             0x1004\n#define GL_CLAMP_TO_BORDER_NV                  0x812D\n\n /* GL_NV_texture_compression_s3tc_update */\nextern GLboolean GLAD_NV_texture_compression_s3tc_update;\n\n /* GL_NV_texture_multisample */\nextern GLboolean GLAD_NV_texture_multisample;\n#define GL_TEXTURE_COVERAGE_SAMPLES_NV         0x9045\n#define GL_TEXTURE_COLOR_SAMPLES_NV            0x9046\ntypedef void (APIENTRYP pfn_glTexImage2DMultisampleCoverageNV) (GLenum, GLsizei, GLsizei, GLint, GLsizei, GLsizei, GLboolean);\nextern pfn_glTexImage2DMultisampleCoverageNV fp_glTexImage2DMultisampleCoverageNV;\ntypedef void (APIENTRYP pfn_glTexImage3DMultisampleCoverageNV) (GLenum, GLsizei, GLsizei, GLint, GLsizei, GLsizei, GLsizei, GLboolean);\nextern pfn_glTexImage3DMultisampleCoverageNV fp_glTexImage3DMultisampleCoverageNV;\ntypedef void (APIENTRYP pfn_glTextureImage2DMultisampleNV) (GLuint, GLenum, GLsizei, GLint, GLsizei, GLsizei, GLboolean);\nextern pfn_glTextureImage2DMultisampleNV fp_glTextureImage2DMultisampleNV;\ntypedef void (APIENTRYP pfn_glTextureImage3DMultisampleNV) (GLuint, GLenum, GLsizei, GLint, GLsizei, GLsizei, GLsizei, GLboolean);\nextern pfn_glTextureImage3DMultisampleNV fp_glTextureImage3DMultisampleNV;\ntypedef void (APIENTRYP pfn_glTextureImage2DMultisampleCoverageNV) (GLuint, GLenum, GLsizei, GLsizei, GLint, GLsizei, GLsizei, GLboolean);\nextern pfn_glTextureImage2DMultisampleCoverageNV fp_glTextureImage2DMultisampleCoverageNV;\ntypedef void (APIENTRYP pfn_glTextureImage3DMultisampleCoverageNV) (GLuint, GLenum, GLsizei, GLsizei, GLint, GLsizei, GLsizei, GLsizei, GLboolean);\nextern pfn_glTextureImage3DMultisampleCoverageNV fp_glTextureImage3DMultisampleCoverageNV;\n\n /* GL_NV_texture_npot_2D_mipmap */\nextern GLboolean GLAD_NV_texture_npot_2D_mipmap;\n\n /* GL_NV_transform_feedback */\nextern GLboolean GLAD_NV_transform_feedback;\n#define GL_BACK_PRIMARY_COLOR_NV               0x8C77\n#define GL_BACK_SECONDARY_COLOR_NV             0x8C78\n#define GL_TEXTURE_COORD_NV                    0x8C79\n#define GL_CLIP_DISTANCE_NV                    0x8C7A\n#define GL_VERTEX_ID_NV                        0x8C7B\n#define GL_PRIMITIVE_ID_NV                     0x8C7C\n#define GL_GENERIC_ATTRIB_NV                   0x8C7D\n#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV       0x8C7E\n#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV   0x8C7F\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV  0x8C80\n#define GL_ACTIVE_VARYINGS_NV                  0x8C81\n#define GL_ACTIVE_VARYING_MAX_LENGTH_NV        0x8C82\n#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV      0x8C83\n#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV  0x8C84\n#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV   0x8C85\n#define GL_TRANSFORM_FEEDBACK_RECORD_NV        0x8C86\n#define GL_PRIMITIVES_GENERATED_NV             0x8C87\n#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV  0x8C88\n#define GL_RASTERIZER_DISCARD_NV               0x8C89\n#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV  0x8C8A\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV  0x8C8B\n#define GL_INTERLEAVED_ATTRIBS_NV              0x8C8C\n#define GL_SEPARATE_ATTRIBS_NV                 0x8C8D\n#define GL_TRANSFORM_FEEDBACK_BUFFER_NV        0x8C8E\n#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV  0x8C8F\n#define GL_LAYER_NV                            0x8DAA\n#define GL_NEXT_BUFFER_NV                      -2\n#define GL_SKIP_COMPONENTS4_NV                 -3\n#define GL_SKIP_COMPONENTS3_NV                 -4\n#define GL_SKIP_COMPONENTS2_NV                 -5\n#define GL_SKIP_COMPONENTS1_NV                 -6\ntypedef void (APIENTRYP pfn_glBeginTransformFeedbackNV) (GLenum);\nextern pfn_glBeginTransformFeedbackNV fp_glBeginTransformFeedbackNV;\ntypedef void (APIENTRYP pfn_glEndTransformFeedbackNV) ();\nextern pfn_glEndTransformFeedbackNV fp_glEndTransformFeedbackNV;\ntypedef void (APIENTRYP pfn_glTransformFeedbackAttribsNV) (GLsizei, const GLint*, GLenum);\nextern pfn_glTransformFeedbackAttribsNV fp_glTransformFeedbackAttribsNV;\ntypedef void (APIENTRYP pfn_glBindBufferRangeNV) (GLenum, GLuint, GLuint, GLintptr, GLsizeiptr);\nextern pfn_glBindBufferRangeNV fp_glBindBufferRangeNV;\ntypedef void (APIENTRYP pfn_glBindBufferOffsetNV) (GLenum, GLuint, GLuint, GLintptr);\nextern pfn_glBindBufferOffsetNV fp_glBindBufferOffsetNV;\ntypedef void (APIENTRYP pfn_glBindBufferBaseNV) (GLenum, GLuint, GLuint);\nextern pfn_glBindBufferBaseNV fp_glBindBufferBaseNV;\ntypedef void (APIENTRYP pfn_glTransformFeedbackVaryingsNV) (GLuint, GLsizei, const GLint*, GLenum);\nextern pfn_glTransformFeedbackVaryingsNV fp_glTransformFeedbackVaryingsNV;\ntypedef void (APIENTRYP pfn_glActiveVaryingNV) (GLuint, const GLchar*);\nextern pfn_glActiveVaryingNV fp_glActiveVaryingNV;\ntypedef GLint (APIENTRYP pfn_glGetVaryingLocationNV) (GLuint, const GLchar*);\nextern pfn_glGetVaryingLocationNV fp_glGetVaryingLocationNV;\ntypedef void (APIENTRYP pfn_glGetActiveVaryingNV) (GLuint, GLuint, GLsizei, GLsizei*, GLsizei*, GLenum*, GLchar*);\nextern pfn_glGetActiveVaryingNV fp_glGetActiveVaryingNV;\ntypedef void (APIENTRYP pfn_glGetTransformFeedbackVaryingNV) (GLuint, GLuint, GLint*);\nextern pfn_glGetTransformFeedbackVaryingNV fp_glGetTransformFeedbackVaryingNV;\ntypedef void (APIENTRYP pfn_glTransformFeedbackStreamAttribsNV) (GLsizei, const GLint*, GLsizei, const GLint*, GLenum);\nextern pfn_glTransformFeedbackStreamAttribsNV fp_glTransformFeedbackStreamAttribsNV;\n\n /* GL_NV_transform_feedback2 */\nextern GLboolean GLAD_NV_transform_feedback2;\n#define GL_TRANSFORM_FEEDBACK_NV               0x8E22\n#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV  0x8E23\n#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV  0x8E24\n#define GL_TRANSFORM_FEEDBACK_BINDING_NV       0x8E25\ntypedef void (APIENTRYP pfn_glBindTransformFeedbackNV) (GLenum, GLuint);\nextern pfn_glBindTransformFeedbackNV fp_glBindTransformFeedbackNV;\ntypedef void (APIENTRYP pfn_glDeleteTransformFeedbacksNV) (GLsizei, const GLuint*);\nextern pfn_glDeleteTransformFeedbacksNV fp_glDeleteTransformFeedbacksNV;\ntypedef void (APIENTRYP pfn_glGenTransformFeedbacksNV) (GLsizei, GLuint*);\nextern pfn_glGenTransformFeedbacksNV fp_glGenTransformFeedbacksNV;\ntypedef GLboolean (APIENTRYP pfn_glIsTransformFeedbackNV) (GLuint);\nextern pfn_glIsTransformFeedbackNV fp_glIsTransformFeedbackNV;\ntypedef void (APIENTRYP pfn_glPauseTransformFeedbackNV) ();\nextern pfn_glPauseTransformFeedbackNV fp_glPauseTransformFeedbackNV;\ntypedef void (APIENTRYP pfn_glResumeTransformFeedbackNV) ();\nextern pfn_glResumeTransformFeedbackNV fp_glResumeTransformFeedbackNV;\ntypedef void (APIENTRYP pfn_glDrawTransformFeedbackNV) (GLenum, GLuint);\nextern pfn_glDrawTransformFeedbackNV fp_glDrawTransformFeedbackNV;\n\n /* GL_NV_uniform_buffer_unified_memory */\nextern GLboolean GLAD_NV_uniform_buffer_unified_memory;\n#define GL_UNIFORM_BUFFER_UNIFIED_NV           0x936E\n#define GL_UNIFORM_BUFFER_ADDRESS_NV           0x936F\n#define GL_UNIFORM_BUFFER_LENGTH_NV            0x9370\n\n /* GL_NV_vdpau_interop */\nextern GLboolean GLAD_NV_vdpau_interop;\n#define GL_SURFACE_STATE_NV                    0x86EB\n#define GL_SURFACE_REGISTERED_NV               0x86FD\n#define GL_SURFACE_MAPPED_NV                   0x8700\n#define GL_WRITE_DISCARD_NV                    0x88BE\ntypedef void (APIENTRYP pfn_glVDPAUInitNV) (const void*, const void*);\nextern pfn_glVDPAUInitNV fp_glVDPAUInitNV;\ntypedef void (APIENTRYP pfn_glVDPAUFiniNV) ();\nextern pfn_glVDPAUFiniNV fp_glVDPAUFiniNV;\ntypedef GLvdpauSurfaceNV (APIENTRYP pfn_glVDPAURegisterVideoSurfaceNV) (const void*, GLenum, GLsizei, const GLuint*);\nextern pfn_glVDPAURegisterVideoSurfaceNV fp_glVDPAURegisterVideoSurfaceNV;\ntypedef GLvdpauSurfaceNV (APIENTRYP pfn_glVDPAURegisterOutputSurfaceNV) (const void*, GLenum, GLsizei, const GLuint*);\nextern pfn_glVDPAURegisterOutputSurfaceNV fp_glVDPAURegisterOutputSurfaceNV;\ntypedef GLboolean (APIENTRYP pfn_glVDPAUIsSurfaceNV) (GLvdpauSurfaceNV);\nextern pfn_glVDPAUIsSurfaceNV fp_glVDPAUIsSurfaceNV;\ntypedef void (APIENTRYP pfn_glVDPAUUnregisterSurfaceNV) (GLvdpauSurfaceNV);\nextern pfn_glVDPAUUnregisterSurfaceNV fp_glVDPAUUnregisterSurfaceNV;\ntypedef void (APIENTRYP pfn_glVDPAUGetSurfaceivNV) (GLvdpauSurfaceNV, GLenum, GLsizei, GLsizei*, GLint*);\nextern pfn_glVDPAUGetSurfaceivNV fp_glVDPAUGetSurfaceivNV;\ntypedef void (APIENTRYP pfn_glVDPAUSurfaceAccessNV) (GLvdpauSurfaceNV, GLenum);\nextern pfn_glVDPAUSurfaceAccessNV fp_glVDPAUSurfaceAccessNV;\ntypedef void (APIENTRYP pfn_glVDPAUMapSurfacesNV) (GLsizei, const GLvdpauSurfaceNV*);\nextern pfn_glVDPAUMapSurfacesNV fp_glVDPAUMapSurfacesNV;\ntypedef void (APIENTRYP pfn_glVDPAUUnmapSurfacesNV) (GLsizei, const GLvdpauSurfaceNV*);\nextern pfn_glVDPAUUnmapSurfacesNV fp_glVDPAUUnmapSurfacesNV;\n\n /* GL_NV_vertex_attrib_integer_64bit */\nextern GLboolean GLAD_NV_vertex_attrib_integer_64bit;\ntypedef void (APIENTRYP pfn_glVertexAttribL1i64NV) (GLuint, GLint64EXT);\nextern pfn_glVertexAttribL1i64NV fp_glVertexAttribL1i64NV;\ntypedef void (APIENTRYP pfn_glVertexAttribL2i64NV) (GLuint, GLint64EXT, GLint64EXT);\nextern pfn_glVertexAttribL2i64NV fp_glVertexAttribL2i64NV;\ntypedef void (APIENTRYP pfn_glVertexAttribL3i64NV) (GLuint, GLint64EXT, GLint64EXT, GLint64EXT);\nextern pfn_glVertexAttribL3i64NV fp_glVertexAttribL3i64NV;\ntypedef void (APIENTRYP pfn_glVertexAttribL4i64NV) (GLuint, GLint64EXT, GLint64EXT, GLint64EXT, GLint64EXT);\nextern pfn_glVertexAttribL4i64NV fp_glVertexAttribL4i64NV;\ntypedef void (APIENTRYP pfn_glVertexAttribL1i64vNV) (GLuint, const GLint64EXT*);\nextern pfn_glVertexAttribL1i64vNV fp_glVertexAttribL1i64vNV;\ntypedef void (APIENTRYP pfn_glVertexAttribL2i64vNV) (GLuint, const GLint64EXT*);\nextern pfn_glVertexAttribL2i64vNV fp_glVertexAttribL2i64vNV;\ntypedef void (APIENTRYP pfn_glVertexAttribL3i64vNV) (GLuint, const GLint64EXT*);\nextern pfn_glVertexAttribL3i64vNV fp_glVertexAttribL3i64vNV;\ntypedef void (APIENTRYP pfn_glVertexAttribL4i64vNV) (GLuint, const GLint64EXT*);\nextern pfn_glVertexAttribL4i64vNV fp_glVertexAttribL4i64vNV;\ntypedef void (APIENTRYP pfn_glVertexAttribL1ui64NV) (GLuint, GLuint64EXT);\nextern pfn_glVertexAttribL1ui64NV fp_glVertexAttribL1ui64NV;\ntypedef void (APIENTRYP pfn_glVertexAttribL2ui64NV) (GLuint, GLuint64EXT, GLuint64EXT);\nextern pfn_glVertexAttribL2ui64NV fp_glVertexAttribL2ui64NV;\ntypedef void (APIENTRYP pfn_glVertexAttribL3ui64NV) (GLuint, GLuint64EXT, GLuint64EXT, GLuint64EXT);\nextern pfn_glVertexAttribL3ui64NV fp_glVertexAttribL3ui64NV;\ntypedef void (APIENTRYP pfn_glVertexAttribL4ui64NV) (GLuint, GLuint64EXT, GLuint64EXT, GLuint64EXT, GLuint64EXT);\nextern pfn_glVertexAttribL4ui64NV fp_glVertexAttribL4ui64NV;\ntypedef void (APIENTRYP pfn_glVertexAttribL1ui64vNV) (GLuint, const GLuint64EXT*);\nextern pfn_glVertexAttribL1ui64vNV fp_glVertexAttribL1ui64vNV;\ntypedef void (APIENTRYP pfn_glVertexAttribL2ui64vNV) (GLuint, const GLuint64EXT*);\nextern pfn_glVertexAttribL2ui64vNV fp_glVertexAttribL2ui64vNV;\ntypedef void (APIENTRYP pfn_glVertexAttribL3ui64vNV) (GLuint, const GLuint64EXT*);\nextern pfn_glVertexAttribL3ui64vNV fp_glVertexAttribL3ui64vNV;\ntypedef void (APIENTRYP pfn_glVertexAttribL4ui64vNV) (GLuint, const GLuint64EXT*);\nextern pfn_glVertexAttribL4ui64vNV fp_glVertexAttribL4ui64vNV;\ntypedef void (APIENTRYP pfn_glGetVertexAttribLi64vNV) (GLuint, GLenum, GLint64EXT*);\nextern pfn_glGetVertexAttribLi64vNV fp_glGetVertexAttribLi64vNV;\ntypedef void (APIENTRYP pfn_glGetVertexAttribLui64vNV) (GLuint, GLenum, GLuint64EXT*);\nextern pfn_glGetVertexAttribLui64vNV fp_glGetVertexAttribLui64vNV;\ntypedef void (APIENTRYP pfn_glVertexAttribLFormatNV) (GLuint, GLint, GLenum, GLsizei);\nextern pfn_glVertexAttribLFormatNV fp_glVertexAttribLFormatNV;\n\n /* GL_NV_vertex_buffer_unified_memory */\nextern GLboolean GLAD_NV_vertex_buffer_unified_memory;\n#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV      0x8F1E\n#define GL_ELEMENT_ARRAY_UNIFIED_NV            0x8F1F\n#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV      0x8F20\n#define GL_VERTEX_ARRAY_ADDRESS_NV             0x8F21\n#define GL_NORMAL_ARRAY_ADDRESS_NV             0x8F22\n#define GL_COLOR_ARRAY_ADDRESS_NV              0x8F23\n#define GL_INDEX_ARRAY_ADDRESS_NV              0x8F24\n#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV      0x8F25\n#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV          0x8F26\n#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV    0x8F27\n#define GL_FOG_COORD_ARRAY_ADDRESS_NV          0x8F28\n#define GL_ELEMENT_ARRAY_ADDRESS_NV            0x8F29\n#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV       0x8F2A\n#define GL_VERTEX_ARRAY_LENGTH_NV              0x8F2B\n#define GL_NORMAL_ARRAY_LENGTH_NV              0x8F2C\n#define GL_COLOR_ARRAY_LENGTH_NV               0x8F2D\n#define GL_INDEX_ARRAY_LENGTH_NV               0x8F2E\n#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV       0x8F2F\n#define GL_EDGE_FLAG_ARRAY_LENGTH_NV           0x8F30\n#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV     0x8F31\n#define GL_FOG_COORD_ARRAY_LENGTH_NV           0x8F32\n#define GL_ELEMENT_ARRAY_LENGTH_NV             0x8F33\n#define GL_DRAW_INDIRECT_UNIFIED_NV            0x8F40\n#define GL_DRAW_INDIRECT_ADDRESS_NV            0x8F41\n#define GL_DRAW_INDIRECT_LENGTH_NV             0x8F42\ntypedef void (APIENTRYP pfn_glBufferAddressRangeNV) (GLenum, GLuint, GLuint64EXT, GLsizeiptr);\nextern pfn_glBufferAddressRangeNV fp_glBufferAddressRangeNV;\ntypedef void (APIENTRYP pfn_glVertexFormatNV) (GLint, GLenum, GLsizei);\nextern pfn_glVertexFormatNV fp_glVertexFormatNV;\ntypedef void (APIENTRYP pfn_glNormalFormatNV) (GLenum, GLsizei);\nextern pfn_glNormalFormatNV fp_glNormalFormatNV;\ntypedef void (APIENTRYP pfn_glColorFormatNV) (GLint, GLenum, GLsizei);\nextern pfn_glColorFormatNV fp_glColorFormatNV;\ntypedef void (APIENTRYP pfn_glIndexFormatNV) (GLenum, GLsizei);\nextern pfn_glIndexFormatNV fp_glIndexFormatNV;\ntypedef void (APIENTRYP pfn_glTexCoordFormatNV) (GLint, GLenum, GLsizei);\nextern pfn_glTexCoordFormatNV fp_glTexCoordFormatNV;\ntypedef void (APIENTRYP pfn_glEdgeFlagFormatNV) (GLsizei);\nextern pfn_glEdgeFlagFormatNV fp_glEdgeFlagFormatNV;\ntypedef void (APIENTRYP pfn_glSecondaryColorFormatNV) (GLint, GLenum, GLsizei);\nextern pfn_glSecondaryColorFormatNV fp_glSecondaryColorFormatNV;\ntypedef void (APIENTRYP pfn_glFogCoordFormatNV) (GLenum, GLsizei);\nextern pfn_glFogCoordFormatNV fp_glFogCoordFormatNV;\ntypedef void (APIENTRYP pfn_glVertexAttribFormatNV) (GLuint, GLint, GLenum, GLboolean, GLsizei);\nextern pfn_glVertexAttribFormatNV fp_glVertexAttribFormatNV;\ntypedef void (APIENTRYP pfn_glVertexAttribIFormatNV) (GLuint, GLint, GLenum, GLsizei);\nextern pfn_glVertexAttribIFormatNV fp_glVertexAttribIFormatNV;\ntypedef void (APIENTRYP pfn_glGetIntegerui64i_vNV) (GLenum, GLuint, GLuint64EXT*);\nextern pfn_glGetIntegerui64i_vNV fp_glGetIntegerui64i_vNV;\n\n /* GL_NV_vertex_program4 */\nextern GLboolean GLAD_NV_vertex_program4;\n#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV      0x88FD\ntypedef void (APIENTRYP pfn_glVertexAttribI1iEXT) (GLuint, GLint);\nextern pfn_glVertexAttribI1iEXT fp_glVertexAttribI1iEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribI2iEXT) (GLuint, GLint, GLint);\nextern pfn_glVertexAttribI2iEXT fp_glVertexAttribI2iEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribI3iEXT) (GLuint, GLint, GLint, GLint);\nextern pfn_glVertexAttribI3iEXT fp_glVertexAttribI3iEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribI4iEXT) (GLuint, GLint, GLint, GLint, GLint);\nextern pfn_glVertexAttribI4iEXT fp_glVertexAttribI4iEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribI1uiEXT) (GLuint, GLuint);\nextern pfn_glVertexAttribI1uiEXT fp_glVertexAttribI1uiEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribI2uiEXT) (GLuint, GLuint, GLuint);\nextern pfn_glVertexAttribI2uiEXT fp_glVertexAttribI2uiEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribI3uiEXT) (GLuint, GLuint, GLuint, GLuint);\nextern pfn_glVertexAttribI3uiEXT fp_glVertexAttribI3uiEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribI4uiEXT) (GLuint, GLuint, GLuint, GLuint, GLuint);\nextern pfn_glVertexAttribI4uiEXT fp_glVertexAttribI4uiEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribI1ivEXT) (GLuint, const GLint*);\nextern pfn_glVertexAttribI1ivEXT fp_glVertexAttribI1ivEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribI2ivEXT) (GLuint, const GLint*);\nextern pfn_glVertexAttribI2ivEXT fp_glVertexAttribI2ivEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribI3ivEXT) (GLuint, const GLint*);\nextern pfn_glVertexAttribI3ivEXT fp_glVertexAttribI3ivEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribI4ivEXT) (GLuint, const GLint*);\nextern pfn_glVertexAttribI4ivEXT fp_glVertexAttribI4ivEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribI1uivEXT) (GLuint, const GLuint*);\nextern pfn_glVertexAttribI1uivEXT fp_glVertexAttribI1uivEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribI2uivEXT) (GLuint, const GLuint*);\nextern pfn_glVertexAttribI2uivEXT fp_glVertexAttribI2uivEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribI3uivEXT) (GLuint, const GLuint*);\nextern pfn_glVertexAttribI3uivEXT fp_glVertexAttribI3uivEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribI4uivEXT) (GLuint, const GLuint*);\nextern pfn_glVertexAttribI4uivEXT fp_glVertexAttribI4uivEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribI4bvEXT) (GLuint, const GLbyte*);\nextern pfn_glVertexAttribI4bvEXT fp_glVertexAttribI4bvEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribI4svEXT) (GLuint, const GLshort*);\nextern pfn_glVertexAttribI4svEXT fp_glVertexAttribI4svEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribI4ubvEXT) (GLuint, const GLubyte*);\nextern pfn_glVertexAttribI4ubvEXT fp_glVertexAttribI4ubvEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribI4usvEXT) (GLuint, const GLushort*);\nextern pfn_glVertexAttribI4usvEXT fp_glVertexAttribI4usvEXT;\ntypedef void (APIENTRYP pfn_glVertexAttribIPointerEXT) (GLuint, GLint, GLenum, GLsizei, const void*);\nextern pfn_glVertexAttribIPointerEXT fp_glVertexAttribIPointerEXT;\ntypedef void (APIENTRYP pfn_glGetVertexAttribIivEXT) (GLuint, GLenum, GLint*);\nextern pfn_glGetVertexAttribIivEXT fp_glGetVertexAttribIivEXT;\ntypedef void (APIENTRYP pfn_glGetVertexAttribIuivEXT) (GLuint, GLenum, GLuint*);\nextern pfn_glGetVertexAttribIuivEXT fp_glGetVertexAttribIuivEXT;\n\n /* GL_NV_video_capture */\nextern GLboolean GLAD_NV_video_capture;\n#define GL_VIDEO_BUFFER_NV                     0x9020\n#define GL_VIDEO_BUFFER_BINDING_NV             0x9021\n#define GL_FIELD_UPPER_NV                      0x9022\n#define GL_FIELD_LOWER_NV                      0x9023\n#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV        0x9024\n#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV  0x9025\n#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV   0x9026\n#define GL_LAST_VIDEO_CAPTURE_STATUS_NV        0x9027\n#define GL_VIDEO_BUFFER_PITCH_NV               0x9028\n#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV    0x9029\n#define GL_VIDEO_COLOR_CONVERSION_MAX_NV       0x902A\n#define GL_VIDEO_COLOR_CONVERSION_MIN_NV       0x902B\n#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV    0x902C\n#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV     0x902D\n#define GL_PARTIAL_SUCCESS_NV                  0x902E\n#define GL_SUCCESS_NV                          0x902F\n#define GL_FAILURE_NV                          0x9030\n#define GL_YCBYCR8_422_NV                      0x9031\n#define GL_YCBAYCR8A_4224_NV                   0x9032\n#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV       0x9033\n#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV  0x9034\n#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV       0x9035\n#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV  0x9036\n#define GL_Z4Y12Z4CB12Z4CR12_444_NV            0x9037\n#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV        0x9038\n#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV       0x9039\n#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV  0x903A\n#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV  0x903B\n#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV     0x903C\ntypedef void (APIENTRYP pfn_glBeginVideoCaptureNV) (GLuint);\nextern pfn_glBeginVideoCaptureNV fp_glBeginVideoCaptureNV;\ntypedef void (APIENTRYP pfn_glBindVideoCaptureStreamBufferNV) (GLuint, GLuint, GLenum, GLintptrARB);\nextern pfn_glBindVideoCaptureStreamBufferNV fp_glBindVideoCaptureStreamBufferNV;\ntypedef void (APIENTRYP pfn_glBindVideoCaptureStreamTextureNV) (GLuint, GLuint, GLenum, GLenum, GLuint);\nextern pfn_glBindVideoCaptureStreamTextureNV fp_glBindVideoCaptureStreamTextureNV;\ntypedef void (APIENTRYP pfn_glEndVideoCaptureNV) (GLuint);\nextern pfn_glEndVideoCaptureNV fp_glEndVideoCaptureNV;\ntypedef void (APIENTRYP pfn_glGetVideoCaptureivNV) (GLuint, GLenum, GLint*);\nextern pfn_glGetVideoCaptureivNV fp_glGetVideoCaptureivNV;\ntypedef void (APIENTRYP pfn_glGetVideoCaptureStreamivNV) (GLuint, GLuint, GLenum, GLint*);\nextern pfn_glGetVideoCaptureStreamivNV fp_glGetVideoCaptureStreamivNV;\ntypedef void (APIENTRYP pfn_glGetVideoCaptureStreamfvNV) (GLuint, GLuint, GLenum, GLfloat*);\nextern pfn_glGetVideoCaptureStreamfvNV fp_glGetVideoCaptureStreamfvNV;\ntypedef void (APIENTRYP pfn_glGetVideoCaptureStreamdvNV) (GLuint, GLuint, GLenum, GLdouble*);\nextern pfn_glGetVideoCaptureStreamdvNV fp_glGetVideoCaptureStreamdvNV;\ntypedef GLenum (APIENTRYP pfn_glVideoCaptureNV) (GLuint, GLuint*, GLuint64EXT*);\nextern pfn_glVideoCaptureNV fp_glVideoCaptureNV;\ntypedef void (APIENTRYP pfn_glVideoCaptureStreamParameterivNV) (GLuint, GLuint, GLenum, const GLint*);\nextern pfn_glVideoCaptureStreamParameterivNV fp_glVideoCaptureStreamParameterivNV;\ntypedef void (APIENTRYP pfn_glVideoCaptureStreamParameterfvNV) (GLuint, GLuint, GLenum, const GLfloat*);\nextern pfn_glVideoCaptureStreamParameterfvNV fp_glVideoCaptureStreamParameterfvNV;\ntypedef void (APIENTRYP pfn_glVideoCaptureStreamParameterdvNV) (GLuint, GLuint, GLenum, const GLdouble*);\nextern pfn_glVideoCaptureStreamParameterdvNV fp_glVideoCaptureStreamParameterdvNV;\n\n /* GL_NV_viewport_array */\nextern GLboolean GLAD_NV_viewport_array;\n#define GL_MAX_VIEWPORTS_NV                    0x825B\n#define GL_VIEWPORT_SUBPIXEL_BITS_NV           0x825C\n#define GL_VIEWPORT_BOUNDS_RANGE_NV            0x825D\n#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX_NV  0x825F\ntypedef void (APIENTRYP pfn_glViewportArrayvNV) (GLuint, GLsizei, const GLfloat*);\nextern pfn_glViewportArrayvNV fp_glViewportArrayvNV;\ntypedef void (APIENTRYP pfn_glViewportIndexedfNV) (GLuint, GLfloat, GLfloat, GLfloat, GLfloat);\nextern pfn_glViewportIndexedfNV fp_glViewportIndexedfNV;\ntypedef void (APIENTRYP pfn_glViewportIndexedfvNV) (GLuint, const GLfloat*);\nextern pfn_glViewportIndexedfvNV fp_glViewportIndexedfvNV;\ntypedef void (APIENTRYP pfn_glScissorArrayvNV) (GLuint, GLsizei, const GLint*);\nextern pfn_glScissorArrayvNV fp_glScissorArrayvNV;\ntypedef void (APIENTRYP pfn_glScissorIndexedNV) (GLuint, GLint, GLint, GLsizei, GLsizei);\nextern pfn_glScissorIndexedNV fp_glScissorIndexedNV;\ntypedef void (APIENTRYP pfn_glScissorIndexedvNV) (GLuint, const GLint*);\nextern pfn_glScissorIndexedvNV fp_glScissorIndexedvNV;\ntypedef void (APIENTRYP pfn_glDepthRangeArrayfvNV) (GLuint, GLsizei, const GLfloat*);\nextern pfn_glDepthRangeArrayfvNV fp_glDepthRangeArrayfvNV;\ntypedef void (APIENTRYP pfn_glDepthRangeIndexedfNV) (GLuint, GLfloat, GLfloat);\nextern pfn_glDepthRangeIndexedfNV fp_glDepthRangeIndexedfNV;\ntypedef void (APIENTRYP pfn_glGetFloati_vNV) (GLenum, GLuint, GLfloat*);\nextern pfn_glGetFloati_vNV fp_glGetFloati_vNV;\ntypedef void (APIENTRYP pfn_glEnableiNV) (GLenum, GLuint);\nextern pfn_glEnableiNV fp_glEnableiNV;\ntypedef void (APIENTRYP pfn_glDisableiNV) (GLenum, GLuint);\nextern pfn_glDisableiNV fp_glDisableiNV;\ntypedef GLboolean (APIENTRYP pfn_glIsEnablediNV) (GLenum, GLuint);\nextern pfn_glIsEnablediNV fp_glIsEnablediNV;\n\n /* GL_NV_viewport_array2 */\nextern GLboolean GLAD_NV_viewport_array2;\n\n /* GL_NVX_conditional_render */\nextern GLboolean GLAD_NVX_conditional_render;\ntypedef void (APIENTRYP pfn_glBeginConditionalRenderNVX) (GLuint);\nextern pfn_glBeginConditionalRenderNVX fp_glBeginConditionalRenderNVX;\ntypedef void (APIENTRYP pfn_glEndConditionalRenderNVX) ();\nextern pfn_glEndConditionalRenderNVX fp_glEndConditionalRenderNVX;\n\n /* GL_NVX_gpu_memory_info */\nextern GLboolean GLAD_NVX_gpu_memory_info;\n#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX  0x9047\n#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX  0x9048\n#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX  0x9049\n#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX  0x904A\n#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX  0x904B\n\n /* GL_OVR_multiview */\nextern GLboolean GLAD_OVR_multiview;\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR  0x9630\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR  0x9632\n#define GL_MAX_VIEWS_OVR                       0x9631\ntypedef void (APIENTRYP pfn_glFramebufferTextureMultiviewOVR) (GLenum, GLenum, GLuint, GLint, GLint, GLsizei);\nextern pfn_glFramebufferTextureMultiviewOVR fp_glFramebufferTextureMultiviewOVR;\n\n /* GL_OVR_multiview2 */\nextern GLboolean GLAD_OVR_multiview2;\n\n /* GL_OVR_multiview_multisampled_render_to_texture */\nextern GLboolean GLAD_OVR_multiview_multisampled_render_to_texture;\ntypedef void (APIENTRYP pfn_glFramebufferTextureMultisampleMultiviewOVR) (GLenum, GLenum, GLuint, GLint, GLsizei, GLint, GLsizei);\nextern pfn_glFramebufferTextureMultisampleMultiviewOVR fp_glFramebufferTextureMultisampleMultiviewOVR;\n\n /* GL_QCOM_alpha_test */\nextern GLboolean GLAD_QCOM_alpha_test;\n#define GL_ALPHA_TEST_QCOM                     0x0BC0\n#define GL_ALPHA_TEST_FUNC_QCOM                0x0BC1\n#define GL_ALPHA_TEST_REF_QCOM                 0x0BC2\ntypedef void (APIENTRYP pfn_glAlphaFuncQCOM) (GLenum, GLclampf);\nextern pfn_glAlphaFuncQCOM fp_glAlphaFuncQCOM;\n\n /* GL_QCOM_binning_control */\nextern GLboolean GLAD_QCOM_binning_control;\n#define GL_BINNING_CONTROL_HINT_QCOM           0x8FB0\n#define GL_CPU_OPTIMIZED_QCOM                  0x8FB1\n#define GL_GPU_OPTIMIZED_QCOM                  0x8FB2\n#define GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM   0x8FB3\n\n /* GL_QCOM_driver_control */\nextern GLboolean GLAD_QCOM_driver_control;\ntypedef void (APIENTRYP pfn_glGetDriverControlsQCOM) (GLint*, GLsizei, GLuint*);\nextern pfn_glGetDriverControlsQCOM fp_glGetDriverControlsQCOM;\ntypedef void (APIENTRYP pfn_glGetDriverControlStringQCOM) (GLuint, GLsizei, GLsizei*, GLchar*);\nextern pfn_glGetDriverControlStringQCOM fp_glGetDriverControlStringQCOM;\ntypedef void (APIENTRYP pfn_glEnableDriverControlQCOM) (GLuint);\nextern pfn_glEnableDriverControlQCOM fp_glEnableDriverControlQCOM;\ntypedef void (APIENTRYP pfn_glDisableDriverControlQCOM) (GLuint);\nextern pfn_glDisableDriverControlQCOM fp_glDisableDriverControlQCOM;\n\n /* GL_QCOM_extended_get */\nextern GLboolean GLAD_QCOM_extended_get;\n#define GL_TEXTURE_WIDTH_QCOM                  0x8BD2\n#define GL_TEXTURE_HEIGHT_QCOM                 0x8BD3\n#define GL_TEXTURE_DEPTH_QCOM                  0x8BD4\n#define GL_TEXTURE_INTERNAL_FORMAT_QCOM        0x8BD5\n#define GL_TEXTURE_FORMAT_QCOM                 0x8BD6\n#define GL_TEXTURE_TYPE_QCOM                   0x8BD7\n#define GL_TEXTURE_IMAGE_VALID_QCOM            0x8BD8\n#define GL_TEXTURE_NUM_LEVELS_QCOM             0x8BD9\n#define GL_TEXTURE_TARGET_QCOM                 0x8BDA\n#define GL_TEXTURE_OBJECT_VALID_QCOM           0x8BDB\n#define GL_STATE_RESTORE                       0x8BDC\ntypedef void (APIENTRYP pfn_glExtGetTexturesQCOM) (GLuint*, GLint, GLint*);\nextern pfn_glExtGetTexturesQCOM fp_glExtGetTexturesQCOM;\ntypedef void (APIENTRYP pfn_glExtGetBuffersQCOM) (GLuint*, GLint, GLint*);\nextern pfn_glExtGetBuffersQCOM fp_glExtGetBuffersQCOM;\ntypedef void (APIENTRYP pfn_glExtGetRenderbuffersQCOM) (GLuint*, GLint, GLint*);\nextern pfn_glExtGetRenderbuffersQCOM fp_glExtGetRenderbuffersQCOM;\ntypedef void (APIENTRYP pfn_glExtGetFramebuffersQCOM) (GLuint*, GLint, GLint*);\nextern pfn_glExtGetFramebuffersQCOM fp_glExtGetFramebuffersQCOM;\ntypedef void (APIENTRYP pfn_glExtGetTexLevelParameterivQCOM) (GLuint, GLenum, GLint, GLenum, GLint*);\nextern pfn_glExtGetTexLevelParameterivQCOM fp_glExtGetTexLevelParameterivQCOM;\ntypedef void (APIENTRYP pfn_glExtTexObjectStateOverrideiQCOM) (GLenum, GLenum, GLint);\nextern pfn_glExtTexObjectStateOverrideiQCOM fp_glExtTexObjectStateOverrideiQCOM;\ntypedef void (APIENTRYP pfn_glExtGetTexSubImageQCOM) (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, void*);\nextern pfn_glExtGetTexSubImageQCOM fp_glExtGetTexSubImageQCOM;\ntypedef void (APIENTRYP pfn_glExtGetBufferPointervQCOM) (GLenum, void**);\nextern pfn_glExtGetBufferPointervQCOM fp_glExtGetBufferPointervQCOM;\n\n /* GL_QCOM_extended_get2 */\nextern GLboolean GLAD_QCOM_extended_get2;\ntypedef void (APIENTRYP pfn_glExtGetShadersQCOM) (GLuint*, GLint, GLint*);\nextern pfn_glExtGetShadersQCOM fp_glExtGetShadersQCOM;\ntypedef void (APIENTRYP pfn_glExtGetProgramsQCOM) (GLuint*, GLint, GLint*);\nextern pfn_glExtGetProgramsQCOM fp_glExtGetProgramsQCOM;\ntypedef GLboolean (APIENTRYP pfn_glExtIsProgramBinaryQCOM) (GLuint);\nextern pfn_glExtIsProgramBinaryQCOM fp_glExtIsProgramBinaryQCOM;\ntypedef void (APIENTRYP pfn_glExtGetProgramBinarySourceQCOM) (GLuint, GLenum, GLchar*, GLint*);\nextern pfn_glExtGetProgramBinarySourceQCOM fp_glExtGetProgramBinarySourceQCOM;\n\n /* GL_QCOM_perfmon_global_mode */\nextern GLboolean GLAD_QCOM_perfmon_global_mode;\n#define GL_PERFMON_GLOBAL_MODE_QCOM            0x8FA0\n\n /* GL_QCOM_tiled_rendering */\nextern GLboolean GLAD_QCOM_tiled_rendering;\n#define GL_COLOR_BUFFER_BIT0_QCOM              0x00000001\n#define GL_COLOR_BUFFER_BIT1_QCOM              0x00000002\n#define GL_COLOR_BUFFER_BIT2_QCOM              0x00000004\n#define GL_COLOR_BUFFER_BIT3_QCOM              0x00000008\n#define GL_COLOR_BUFFER_BIT4_QCOM              0x00000010\n#define GL_COLOR_BUFFER_BIT5_QCOM              0x00000020\n#define GL_COLOR_BUFFER_BIT6_QCOM              0x00000040\n#define GL_COLOR_BUFFER_BIT7_QCOM              0x00000080\n#define GL_DEPTH_BUFFER_BIT0_QCOM              0x00000100\n#define GL_DEPTH_BUFFER_BIT1_QCOM              0x00000200\n#define GL_DEPTH_BUFFER_BIT2_QCOM              0x00000400\n#define GL_DEPTH_BUFFER_BIT3_QCOM              0x00000800\n#define GL_DEPTH_BUFFER_BIT4_QCOM              0x00001000\n#define GL_DEPTH_BUFFER_BIT5_QCOM              0x00002000\n#define GL_DEPTH_BUFFER_BIT6_QCOM              0x00004000\n#define GL_DEPTH_BUFFER_BIT7_QCOM              0x00008000\n#define GL_STENCIL_BUFFER_BIT0_QCOM            0x00010000\n#define GL_STENCIL_BUFFER_BIT1_QCOM            0x00020000\n#define GL_STENCIL_BUFFER_BIT2_QCOM            0x00040000\n#define GL_STENCIL_BUFFER_BIT3_QCOM            0x00080000\n#define GL_STENCIL_BUFFER_BIT4_QCOM            0x00100000\n#define GL_STENCIL_BUFFER_BIT5_QCOM            0x00200000\n#define GL_STENCIL_BUFFER_BIT6_QCOM            0x00400000\n#define GL_STENCIL_BUFFER_BIT7_QCOM            0x00800000\n#define GL_MULTISAMPLE_BUFFER_BIT0_QCOM        0x01000000\n#define GL_MULTISAMPLE_BUFFER_BIT1_QCOM        0x02000000\n#define GL_MULTISAMPLE_BUFFER_BIT2_QCOM        0x04000000\n#define GL_MULTISAMPLE_BUFFER_BIT3_QCOM        0x08000000\n#define GL_MULTISAMPLE_BUFFER_BIT4_QCOM        0x10000000\n#define GL_MULTISAMPLE_BUFFER_BIT5_QCOM        0x20000000\n#define GL_MULTISAMPLE_BUFFER_BIT6_QCOM        0x40000000\n#define GL_MULTISAMPLE_BUFFER_BIT7_QCOM        0x80000000\ntypedef void (APIENTRYP pfn_glStartTilingQCOM) (GLuint, GLuint, GLuint, GLuint, GLbitfield);\nextern pfn_glStartTilingQCOM fp_glStartTilingQCOM;\ntypedef void (APIENTRYP pfn_glEndTilingQCOM) (GLbitfield);\nextern pfn_glEndTilingQCOM fp_glEndTilingQCOM;\n\n /* GL_QCOM_writeonly_rendering */\nextern GLboolean GLAD_QCOM_writeonly_rendering;\n#define GL_WRITEONLY_RENDERING_QCOM            0x8823\n\n /* GL_VIV_shader_binary */\nextern GLboolean GLAD_VIV_shader_binary;\n#define GL_SHADER_BINARY_VIV                   0x8FC4\n\n} /* namespace glad */\n\n#endif /* __glad_hpp_ */\n"
  },
  {
    "path": "src/libraries/glad/gladfuncs.hpp",
    "content": "\n/**\n * The MIT License (MIT)\n * \n * Copyright (c) 2013 David Herberth, modified by Sasha Szpakowski\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n **/\n \n\n#ifndef __glad_funcs_hpp_\n#define __glad_funcs_hpp_\n\n#include \"glad.hpp\"\n\nnamespace glad {\n\n\n/* GL_VERSION_1_0 */\ninline void glCullFace(GLenum mode) { fp_glCullFace(mode); }\ninline void glFrontFace(GLenum mode) { fp_glFrontFace(mode); }\ninline void glHint(GLenum target, GLenum mode) { fp_glHint(target, mode); }\ninline void glLineWidth(GLfloat width) { fp_glLineWidth(width); }\ninline void glPointSize(GLfloat size) { fp_glPointSize(size); }\ninline void glPolygonMode(GLenum face, GLenum mode) { fp_glPolygonMode(face, mode); }\ninline void glScissor(GLint x, GLint y, GLsizei width, GLsizei height) { fp_glScissor(x, y, width, height); }\ninline void glTexParameterf(GLenum target, GLenum pname, GLfloat param) { fp_glTexParameterf(target, pname, param); }\ninline void glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params) { fp_glTexParameterfv(target, pname, params); }\ninline void glTexParameteri(GLenum target, GLenum pname, GLint param) { fp_glTexParameteri(target, pname, param); }\ninline void glTexParameteriv(GLenum target, GLenum pname, const GLint* params) { fp_glTexParameteriv(target, pname, params); }\ninline void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void* pixels) { fp_glTexImage1D(target, level, internalformat, width, border, format, type, pixels); }\ninline void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels) { fp_glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); }\ninline void glDrawBuffer(GLenum buf) { fp_glDrawBuffer(buf); }\ninline void glClear(GLbitfield mask) { fp_glClear(mask); }\ninline void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { fp_glClearColor(red, green, blue, alpha); }\ninline void glClearStencil(GLint s) { fp_glClearStencil(s); }\ninline void glClearDepth(GLdouble depth) { fp_glClearDepth(depth); }\ninline void glStencilMask(GLuint mask) { fp_glStencilMask(mask); }\ninline void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) { fp_glColorMask(red, green, blue, alpha); }\ninline void glDepthMask(GLboolean flag) { fp_glDepthMask(flag); }\ninline void glDisable(GLenum cap) { fp_glDisable(cap); }\ninline void glEnable(GLenum cap) { fp_glEnable(cap); }\ninline void glFinish() { fp_glFinish(); }\ninline void glFlush() { fp_glFlush(); }\ninline void glBlendFunc(GLenum sfactor, GLenum dfactor) { fp_glBlendFunc(sfactor, dfactor); }\ninline void glLogicOp(GLenum opcode) { fp_glLogicOp(opcode); }\ninline void glStencilFunc(GLenum func, GLint ref, GLuint mask) { fp_glStencilFunc(func, ref, mask); }\ninline void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass) { fp_glStencilOp(fail, zfail, zpass); }\ninline void glDepthFunc(GLenum func) { fp_glDepthFunc(func); }\ninline void glPixelStoref(GLenum pname, GLfloat param) { fp_glPixelStoref(pname, param); }\ninline void glPixelStorei(GLenum pname, GLint param) { fp_glPixelStorei(pname, param); }\ninline void glReadBuffer(GLenum src) { fp_glReadBuffer(src); }\ninline void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels) { fp_glReadPixels(x, y, width, height, format, type, pixels); }\ninline void glGetBooleanv(GLenum pname, GLboolean* data) { fp_glGetBooleanv(pname, data); }\ninline void glGetDoublev(GLenum pname, GLdouble* data) { fp_glGetDoublev(pname, data); }\ninline GLenum glGetError() { return fp_glGetError(); }\ninline void glGetFloatv(GLenum pname, GLfloat* data) { fp_glGetFloatv(pname, data); }\ninline void glGetIntegerv(GLenum pname, GLint* data) { fp_glGetIntegerv(pname, data); }\ninline const GLubyte* glGetString(GLenum name) { return fp_glGetString(name); }\ninline void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void* pixels) { fp_glGetTexImage(target, level, format, type, pixels); }\ninline void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params) { fp_glGetTexParameterfv(target, pname, params); }\ninline void glGetTexParameteriv(GLenum target, GLenum pname, GLint* params) { fp_glGetTexParameteriv(target, pname, params); }\ninline void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat* params) { fp_glGetTexLevelParameterfv(target, level, pname, params); }\ninline void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint* params) { fp_glGetTexLevelParameteriv(target, level, pname, params); }\ninline GLboolean glIsEnabled(GLenum cap) { return fp_glIsEnabled(cap); }\ninline void glDepthRange(GLdouble near, GLdouble far) { fp_glDepthRange(near, far); }\ninline void glViewport(GLint x, GLint y, GLsizei width, GLsizei height) { fp_glViewport(x, y, width, height); }\ninline void glNewList(GLuint list, GLenum mode) { fp_glNewList(list, mode); }\ninline void glEndList() { fp_glEndList(); }\ninline void glCallList(GLuint list) { fp_glCallList(list); }\ninline void glCallLists(GLsizei n, GLenum type, const void* lists) { fp_glCallLists(n, type, lists); }\ninline void glDeleteLists(GLuint list, GLsizei range) { fp_glDeleteLists(list, range); }\ninline GLuint glGenLists(GLsizei range) { return fp_glGenLists(range); }\ninline void glListBase(GLuint base) { fp_glListBase(base); }\ninline void glBegin(GLenum mode) { fp_glBegin(mode); }\ninline void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte* bitmap) { fp_glBitmap(width, height, xorig, yorig, xmove, ymove, bitmap); }\ninline void glColor3b(GLbyte red, GLbyte green, GLbyte blue) { fp_glColor3b(red, green, blue); }\ninline void glColor3bv(const GLbyte* v) { fp_glColor3bv(v); }\ninline void glColor3d(GLdouble red, GLdouble green, GLdouble blue) { fp_glColor3d(red, green, blue); }\ninline void glColor3dv(const GLdouble* v) { fp_glColor3dv(v); }\ninline void glColor3f(GLfloat red, GLfloat green, GLfloat blue) { fp_glColor3f(red, green, blue); }\ninline void glColor3fv(const GLfloat* v) { fp_glColor3fv(v); }\ninline void glColor3i(GLint red, GLint green, GLint blue) { fp_glColor3i(red, green, blue); }\ninline void glColor3iv(const GLint* v) { fp_glColor3iv(v); }\ninline void glColor3s(GLshort red, GLshort green, GLshort blue) { fp_glColor3s(red, green, blue); }\ninline void glColor3sv(const GLshort* v) { fp_glColor3sv(v); }\ninline void glColor3ub(GLubyte red, GLubyte green, GLubyte blue) { fp_glColor3ub(red, green, blue); }\ninline void glColor3ubv(const GLubyte* v) { fp_glColor3ubv(v); }\ninline void glColor3ui(GLuint red, GLuint green, GLuint blue) { fp_glColor3ui(red, green, blue); }\ninline void glColor3uiv(const GLuint* v) { fp_glColor3uiv(v); }\ninline void glColor3us(GLushort red, GLushort green, GLushort blue) { fp_glColor3us(red, green, blue); }\ninline void glColor3usv(const GLushort* v) { fp_glColor3usv(v); }\ninline void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha) { fp_glColor4b(red, green, blue, alpha); }\ninline void glColor4bv(const GLbyte* v) { fp_glColor4bv(v); }\ninline void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha) { fp_glColor4d(red, green, blue, alpha); }\ninline void glColor4dv(const GLdouble* v) { fp_glColor4dv(v); }\ninline void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { fp_glColor4f(red, green, blue, alpha); }\ninline void glColor4fv(const GLfloat* v) { fp_glColor4fv(v); }\ninline void glColor4i(GLint red, GLint green, GLint blue, GLint alpha) { fp_glColor4i(red, green, blue, alpha); }\ninline void glColor4iv(const GLint* v) { fp_glColor4iv(v); }\ninline void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha) { fp_glColor4s(red, green, blue, alpha); }\ninline void glColor4sv(const GLshort* v) { fp_glColor4sv(v); }\ninline void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha) { fp_glColor4ub(red, green, blue, alpha); }\ninline void glColor4ubv(const GLubyte* v) { fp_glColor4ubv(v); }\ninline void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha) { fp_glColor4ui(red, green, blue, alpha); }\ninline void glColor4uiv(const GLuint* v) { fp_glColor4uiv(v); }\ninline void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha) { fp_glColor4us(red, green, blue, alpha); }\ninline void glColor4usv(const GLushort* v) { fp_glColor4usv(v); }\ninline void glEdgeFlag(GLboolean flag) { fp_glEdgeFlag(flag); }\ninline void glEdgeFlagv(const GLboolean* flag) { fp_glEdgeFlagv(flag); }\ninline void glEnd() { fp_glEnd(); }\ninline void glIndexd(GLdouble c) { fp_glIndexd(c); }\ninline void glIndexdv(const GLdouble* c) { fp_glIndexdv(c); }\ninline void glIndexf(GLfloat c) { fp_glIndexf(c); }\ninline void glIndexfv(const GLfloat* c) { fp_glIndexfv(c); }\ninline void glIndexi(GLint c) { fp_glIndexi(c); }\ninline void glIndexiv(const GLint* c) { fp_glIndexiv(c); }\ninline void glIndexs(GLshort c) { fp_glIndexs(c); }\ninline void glIndexsv(const GLshort* c) { fp_glIndexsv(c); }\ninline void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz) { fp_glNormal3b(nx, ny, nz); }\ninline void glNormal3bv(const GLbyte* v) { fp_glNormal3bv(v); }\ninline void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz) { fp_glNormal3d(nx, ny, nz); }\ninline void glNormal3dv(const GLdouble* v) { fp_glNormal3dv(v); }\ninline void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz) { fp_glNormal3f(nx, ny, nz); }\ninline void glNormal3fv(const GLfloat* v) { fp_glNormal3fv(v); }\ninline void glNormal3i(GLint nx, GLint ny, GLint nz) { fp_glNormal3i(nx, ny, nz); }\ninline void glNormal3iv(const GLint* v) { fp_glNormal3iv(v); }\ninline void glNormal3s(GLshort nx, GLshort ny, GLshort nz) { fp_glNormal3s(nx, ny, nz); }\ninline void glNormal3sv(const GLshort* v) { fp_glNormal3sv(v); }\ninline void glRasterPos2d(GLdouble x, GLdouble y) { fp_glRasterPos2d(x, y); }\ninline void glRasterPos2dv(const GLdouble* v) { fp_glRasterPos2dv(v); }\ninline void glRasterPos2f(GLfloat x, GLfloat y) { fp_glRasterPos2f(x, y); }\ninline void glRasterPos2fv(const GLfloat* v) { fp_glRasterPos2fv(v); }\ninline void glRasterPos2i(GLint x, GLint y) { fp_glRasterPos2i(x, y); }\ninline void glRasterPos2iv(const GLint* v) { fp_glRasterPos2iv(v); }\ninline void glRasterPos2s(GLshort x, GLshort y) { fp_glRasterPos2s(x, y); }\ninline void glRasterPos2sv(const GLshort* v) { fp_glRasterPos2sv(v); }\ninline void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z) { fp_glRasterPos3d(x, y, z); }\ninline void glRasterPos3dv(const GLdouble* v) { fp_glRasterPos3dv(v); }\ninline void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z) { fp_glRasterPos3f(x, y, z); }\ninline void glRasterPos3fv(const GLfloat* v) { fp_glRasterPos3fv(v); }\ninline void glRasterPos3i(GLint x, GLint y, GLint z) { fp_glRasterPos3i(x, y, z); }\ninline void glRasterPos3iv(const GLint* v) { fp_glRasterPos3iv(v); }\ninline void glRasterPos3s(GLshort x, GLshort y, GLshort z) { fp_glRasterPos3s(x, y, z); }\ninline void glRasterPos3sv(const GLshort* v) { fp_glRasterPos3sv(v); }\ninline void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glRasterPos4d(x, y, z, w); }\ninline void glRasterPos4dv(const GLdouble* v) { fp_glRasterPos4dv(v); }\ninline void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glRasterPos4f(x, y, z, w); }\ninline void glRasterPos4fv(const GLfloat* v) { fp_glRasterPos4fv(v); }\ninline void glRasterPos4i(GLint x, GLint y, GLint z, GLint w) { fp_glRasterPos4i(x, y, z, w); }\ninline void glRasterPos4iv(const GLint* v) { fp_glRasterPos4iv(v); }\ninline void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w) { fp_glRasterPos4s(x, y, z, w); }\ninline void glRasterPos4sv(const GLshort* v) { fp_glRasterPos4sv(v); }\ninline void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2) { fp_glRectd(x1, y1, x2, y2); }\ninline void glRectdv(const GLdouble* v1, const GLdouble* v2) { fp_glRectdv(v1, v2); }\ninline void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) { fp_glRectf(x1, y1, x2, y2); }\ninline void glRectfv(const GLfloat* v1, const GLfloat* v2) { fp_glRectfv(v1, v2); }\ninline void glRecti(GLint x1, GLint y1, GLint x2, GLint y2) { fp_glRecti(x1, y1, x2, y2); }\ninline void glRectiv(const GLint* v1, const GLint* v2) { fp_glRectiv(v1, v2); }\ninline void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2) { fp_glRects(x1, y1, x2, y2); }\ninline void glRectsv(const GLshort* v1, const GLshort* v2) { fp_glRectsv(v1, v2); }\ninline void glTexCoord1d(GLdouble s) { fp_glTexCoord1d(s); }\ninline void glTexCoord1dv(const GLdouble* v) { fp_glTexCoord1dv(v); }\ninline void glTexCoord1f(GLfloat s) { fp_glTexCoord1f(s); }\ninline void glTexCoord1fv(const GLfloat* v) { fp_glTexCoord1fv(v); }\ninline void glTexCoord1i(GLint s) { fp_glTexCoord1i(s); }\ninline void glTexCoord1iv(const GLint* v) { fp_glTexCoord1iv(v); }\ninline void glTexCoord1s(GLshort s) { fp_glTexCoord1s(s); }\ninline void glTexCoord1sv(const GLshort* v) { fp_glTexCoord1sv(v); }\ninline void glTexCoord2d(GLdouble s, GLdouble t) { fp_glTexCoord2d(s, t); }\ninline void glTexCoord2dv(const GLdouble* v) { fp_glTexCoord2dv(v); }\ninline void glTexCoord2f(GLfloat s, GLfloat t) { fp_glTexCoord2f(s, t); }\ninline void glTexCoord2fv(const GLfloat* v) { fp_glTexCoord2fv(v); }\ninline void glTexCoord2i(GLint s, GLint t) { fp_glTexCoord2i(s, t); }\ninline void glTexCoord2iv(const GLint* v) { fp_glTexCoord2iv(v); }\ninline void glTexCoord2s(GLshort s, GLshort t) { fp_glTexCoord2s(s, t); }\ninline void glTexCoord2sv(const GLshort* v) { fp_glTexCoord2sv(v); }\ninline void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r) { fp_glTexCoord3d(s, t, r); }\ninline void glTexCoord3dv(const GLdouble* v) { fp_glTexCoord3dv(v); }\ninline void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r) { fp_glTexCoord3f(s, t, r); }\ninline void glTexCoord3fv(const GLfloat* v) { fp_glTexCoord3fv(v); }\ninline void glTexCoord3i(GLint s, GLint t, GLint r) { fp_glTexCoord3i(s, t, r); }\ninline void glTexCoord3iv(const GLint* v) { fp_glTexCoord3iv(v); }\ninline void glTexCoord3s(GLshort s, GLshort t, GLshort r) { fp_glTexCoord3s(s, t, r); }\ninline void glTexCoord3sv(const GLshort* v) { fp_glTexCoord3sv(v); }\ninline void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q) { fp_glTexCoord4d(s, t, r, q); }\ninline void glTexCoord4dv(const GLdouble* v) { fp_glTexCoord4dv(v); }\ninline void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q) { fp_glTexCoord4f(s, t, r, q); }\ninline void glTexCoord4fv(const GLfloat* v) { fp_glTexCoord4fv(v); }\ninline void glTexCoord4i(GLint s, GLint t, GLint r, GLint q) { fp_glTexCoord4i(s, t, r, q); }\ninline void glTexCoord4iv(const GLint* v) { fp_glTexCoord4iv(v); }\ninline void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q) { fp_glTexCoord4s(s, t, r, q); }\ninline void glTexCoord4sv(const GLshort* v) { fp_glTexCoord4sv(v); }\ninline void glVertex2d(GLdouble x, GLdouble y) { fp_glVertex2d(x, y); }\ninline void glVertex2dv(const GLdouble* v) { fp_glVertex2dv(v); }\ninline void glVertex2f(GLfloat x, GLfloat y) { fp_glVertex2f(x, y); }\ninline void glVertex2fv(const GLfloat* v) { fp_glVertex2fv(v); }\ninline void glVertex2i(GLint x, GLint y) { fp_glVertex2i(x, y); }\ninline void glVertex2iv(const GLint* v) { fp_glVertex2iv(v); }\ninline void glVertex2s(GLshort x, GLshort y) { fp_glVertex2s(x, y); }\ninline void glVertex2sv(const GLshort* v) { fp_glVertex2sv(v); }\ninline void glVertex3d(GLdouble x, GLdouble y, GLdouble z) { fp_glVertex3d(x, y, z); }\ninline void glVertex3dv(const GLdouble* v) { fp_glVertex3dv(v); }\ninline void glVertex3f(GLfloat x, GLfloat y, GLfloat z) { fp_glVertex3f(x, y, z); }\ninline void glVertex3fv(const GLfloat* v) { fp_glVertex3fv(v); }\ninline void glVertex3i(GLint x, GLint y, GLint z) { fp_glVertex3i(x, y, z); }\ninline void glVertex3iv(const GLint* v) { fp_glVertex3iv(v); }\ninline void glVertex3s(GLshort x, GLshort y, GLshort z) { fp_glVertex3s(x, y, z); }\ninline void glVertex3sv(const GLshort* v) { fp_glVertex3sv(v); }\ninline void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glVertex4d(x, y, z, w); }\ninline void glVertex4dv(const GLdouble* v) { fp_glVertex4dv(v); }\ninline void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glVertex4f(x, y, z, w); }\ninline void glVertex4fv(const GLfloat* v) { fp_glVertex4fv(v); }\ninline void glVertex4i(GLint x, GLint y, GLint z, GLint w) { fp_glVertex4i(x, y, z, w); }\ninline void glVertex4iv(const GLint* v) { fp_glVertex4iv(v); }\ninline void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w) { fp_glVertex4s(x, y, z, w); }\ninline void glVertex4sv(const GLshort* v) { fp_glVertex4sv(v); }\ninline void glClipPlane(GLenum plane, const GLdouble* equation) { fp_glClipPlane(plane, equation); }\ninline void glColorMaterial(GLenum face, GLenum mode) { fp_glColorMaterial(face, mode); }\ninline void glFogf(GLenum pname, GLfloat param) { fp_glFogf(pname, param); }\ninline void glFogfv(GLenum pname, const GLfloat* params) { fp_glFogfv(pname, params); }\ninline void glFogi(GLenum pname, GLint param) { fp_glFogi(pname, param); }\ninline void glFogiv(GLenum pname, const GLint* params) { fp_glFogiv(pname, params); }\ninline void glLightf(GLenum light, GLenum pname, GLfloat param) { fp_glLightf(light, pname, param); }\ninline void glLightfv(GLenum light, GLenum pname, const GLfloat* params) { fp_glLightfv(light, pname, params); }\ninline void glLighti(GLenum light, GLenum pname, GLint param) { fp_glLighti(light, pname, param); }\ninline void glLightiv(GLenum light, GLenum pname, const GLint* params) { fp_glLightiv(light, pname, params); }\ninline void glLightModelf(GLenum pname, GLfloat param) { fp_glLightModelf(pname, param); }\ninline void glLightModelfv(GLenum pname, const GLfloat* params) { fp_glLightModelfv(pname, params); }\ninline void glLightModeli(GLenum pname, GLint param) { fp_glLightModeli(pname, param); }\ninline void glLightModeliv(GLenum pname, const GLint* params) { fp_glLightModeliv(pname, params); }\ninline void glLineStipple(GLint factor, GLushort pattern) { fp_glLineStipple(factor, pattern); }\ninline void glMaterialf(GLenum face, GLenum pname, GLfloat param) { fp_glMaterialf(face, pname, param); }\ninline void glMaterialfv(GLenum face, GLenum pname, const GLfloat* params) { fp_glMaterialfv(face, pname, params); }\ninline void glMateriali(GLenum face, GLenum pname, GLint param) { fp_glMateriali(face, pname, param); }\ninline void glMaterialiv(GLenum face, GLenum pname, const GLint* params) { fp_glMaterialiv(face, pname, params); }\ninline void glPolygonStipple(const GLubyte* mask) { fp_glPolygonStipple(mask); }\ninline void glShadeModel(GLenum mode) { fp_glShadeModel(mode); }\ninline void glTexEnvf(GLenum target, GLenum pname, GLfloat param) { fp_glTexEnvf(target, pname, param); }\ninline void glTexEnvfv(GLenum target, GLenum pname, const GLfloat* params) { fp_glTexEnvfv(target, pname, params); }\ninline void glTexEnvi(GLenum target, GLenum pname, GLint param) { fp_glTexEnvi(target, pname, param); }\ninline void glTexEnviv(GLenum target, GLenum pname, const GLint* params) { fp_glTexEnviv(target, pname, params); }\ninline void glTexGend(GLenum coord, GLenum pname, GLdouble param) { fp_glTexGend(coord, pname, param); }\ninline void glTexGendv(GLenum coord, GLenum pname, const GLdouble* params) { fp_glTexGendv(coord, pname, params); }\ninline void glTexGenf(GLenum coord, GLenum pname, GLfloat param) { fp_glTexGenf(coord, pname, param); }\ninline void glTexGenfv(GLenum coord, GLenum pname, const GLfloat* params) { fp_glTexGenfv(coord, pname, params); }\ninline void glTexGeni(GLenum coord, GLenum pname, GLint param) { fp_glTexGeni(coord, pname, param); }\ninline void glTexGeniv(GLenum coord, GLenum pname, const GLint* params) { fp_glTexGeniv(coord, pname, params); }\ninline void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat* buffer) { fp_glFeedbackBuffer(size, type, buffer); }\ninline void glSelectBuffer(GLsizei size, GLuint* buffer) { fp_glSelectBuffer(size, buffer); }\ninline GLint glRenderMode(GLenum mode) { return fp_glRenderMode(mode); }\ninline void glInitNames() { fp_glInitNames(); }\ninline void glLoadName(GLuint name) { fp_glLoadName(name); }\ninline void glPassThrough(GLfloat token) { fp_glPassThrough(token); }\ninline void glPopName() { fp_glPopName(); }\ninline void glPushName(GLuint name) { fp_glPushName(name); }\ninline void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { fp_glClearAccum(red, green, blue, alpha); }\ninline void glClearIndex(GLfloat c) { fp_glClearIndex(c); }\ninline void glIndexMask(GLuint mask) { fp_glIndexMask(mask); }\ninline void glAccum(GLenum op, GLfloat value) { fp_glAccum(op, value); }\ninline void glPopAttrib() { fp_glPopAttrib(); }\ninline void glPushAttrib(GLbitfield mask) { fp_glPushAttrib(mask); }\ninline void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble* points) { fp_glMap1d(target, u1, u2, stride, order, points); }\ninline void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat* points) { fp_glMap1f(target, u1, u2, stride, order, points); }\ninline void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble* points) { fp_glMap2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points); }\ninline void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat* points) { fp_glMap2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points); }\ninline void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2) { fp_glMapGrid1d(un, u1, u2); }\ninline void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2) { fp_glMapGrid1f(un, u1, u2); }\ninline void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2) { fp_glMapGrid2d(un, u1, u2, vn, v1, v2); }\ninline void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2) { fp_glMapGrid2f(un, u1, u2, vn, v1, v2); }\ninline void glEvalCoord1d(GLdouble u) { fp_glEvalCoord1d(u); }\ninline void glEvalCoord1dv(const GLdouble* u) { fp_glEvalCoord1dv(u); }\ninline void glEvalCoord1f(GLfloat u) { fp_glEvalCoord1f(u); }\ninline void glEvalCoord1fv(const GLfloat* u) { fp_glEvalCoord1fv(u); }\ninline void glEvalCoord2d(GLdouble u, GLdouble v) { fp_glEvalCoord2d(u, v); }\ninline void glEvalCoord2dv(const GLdouble* u) { fp_glEvalCoord2dv(u); }\ninline void glEvalCoord2f(GLfloat u, GLfloat v) { fp_glEvalCoord2f(u, v); }\ninline void glEvalCoord2fv(const GLfloat* u) { fp_glEvalCoord2fv(u); }\ninline void glEvalMesh1(GLenum mode, GLint i1, GLint i2) { fp_glEvalMesh1(mode, i1, i2); }\ninline void glEvalPoint1(GLint i) { fp_glEvalPoint1(i); }\ninline void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2) { fp_glEvalMesh2(mode, i1, i2, j1, j2); }\ninline void glEvalPoint2(GLint i, GLint j) { fp_glEvalPoint2(i, j); }\ninline void glAlphaFunc(GLenum func, GLfloat ref) { fp_glAlphaFunc(func, ref); }\ninline void glPixelZoom(GLfloat xfactor, GLfloat yfactor) { fp_glPixelZoom(xfactor, yfactor); }\ninline void glPixelTransferf(GLenum pname, GLfloat param) { fp_glPixelTransferf(pname, param); }\ninline void glPixelTransferi(GLenum pname, GLint param) { fp_glPixelTransferi(pname, param); }\ninline void glPixelMapfv(GLenum map, GLsizei mapsize, const GLfloat* values) { fp_glPixelMapfv(map, mapsize, values); }\ninline void glPixelMapuiv(GLenum map, GLsizei mapsize, const GLuint* values) { fp_glPixelMapuiv(map, mapsize, values); }\ninline void glPixelMapusv(GLenum map, GLsizei mapsize, const GLushort* values) { fp_glPixelMapusv(map, mapsize, values); }\ninline void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type) { fp_glCopyPixels(x, y, width, height, type); }\ninline void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) { fp_glDrawPixels(width, height, format, type, pixels); }\ninline void glGetClipPlane(GLenum plane, GLdouble* equation) { fp_glGetClipPlane(plane, equation); }\ninline void glGetLightfv(GLenum light, GLenum pname, GLfloat* params) { fp_glGetLightfv(light, pname, params); }\ninline void glGetLightiv(GLenum light, GLenum pname, GLint* params) { fp_glGetLightiv(light, pname, params); }\ninline void glGetMapdv(GLenum target, GLenum query, GLdouble* v) { fp_glGetMapdv(target, query, v); }\ninline void glGetMapfv(GLenum target, GLenum query, GLfloat* v) { fp_glGetMapfv(target, query, v); }\ninline void glGetMapiv(GLenum target, GLenum query, GLint* v) { fp_glGetMapiv(target, query, v); }\ninline void glGetMaterialfv(GLenum face, GLenum pname, GLfloat* params) { fp_glGetMaterialfv(face, pname, params); }\ninline void glGetMaterialiv(GLenum face, GLenum pname, GLint* params) { fp_glGetMaterialiv(face, pname, params); }\ninline void glGetPixelMapfv(GLenum map, GLfloat* values) { fp_glGetPixelMapfv(map, values); }\ninline void glGetPixelMapuiv(GLenum map, GLuint* values) { fp_glGetPixelMapuiv(map, values); }\ninline void glGetPixelMapusv(GLenum map, GLushort* values) { fp_glGetPixelMapusv(map, values); }\ninline void glGetPolygonStipple(GLubyte* mask) { fp_glGetPolygonStipple(mask); }\ninline void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat* params) { fp_glGetTexEnvfv(target, pname, params); }\ninline void glGetTexEnviv(GLenum target, GLenum pname, GLint* params) { fp_glGetTexEnviv(target, pname, params); }\ninline void glGetTexGendv(GLenum coord, GLenum pname, GLdouble* params) { fp_glGetTexGendv(coord, pname, params); }\ninline void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat* params) { fp_glGetTexGenfv(coord, pname, params); }\ninline void glGetTexGeniv(GLenum coord, GLenum pname, GLint* params) { fp_glGetTexGeniv(coord, pname, params); }\ninline GLboolean glIsList(GLuint list) { return fp_glIsList(list); }\ninline void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) { fp_glFrustum(left, right, bottom, top, zNear, zFar); }\ninline void glLoadIdentity() { fp_glLoadIdentity(); }\ninline void glLoadMatrixf(const GLfloat* m) { fp_glLoadMatrixf(m); }\ninline void glLoadMatrixd(const GLdouble* m) { fp_glLoadMatrixd(m); }\ninline void glMatrixMode(GLenum mode) { fp_glMatrixMode(mode); }\ninline void glMultMatrixf(const GLfloat* m) { fp_glMultMatrixf(m); }\ninline void glMultMatrixd(const GLdouble* m) { fp_glMultMatrixd(m); }\ninline void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) { fp_glOrtho(left, right, bottom, top, zNear, zFar); }\ninline void glPopMatrix() { fp_glPopMatrix(); }\ninline void glPushMatrix() { fp_glPushMatrix(); }\ninline void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z) { fp_glRotated(angle, x, y, z); }\ninline void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) { fp_glRotatef(angle, x, y, z); }\ninline void glScaled(GLdouble x, GLdouble y, GLdouble z) { fp_glScaled(x, y, z); }\ninline void glScalef(GLfloat x, GLfloat y, GLfloat z) { fp_glScalef(x, y, z); }\ninline void glTranslated(GLdouble x, GLdouble y, GLdouble z) { fp_glTranslated(x, y, z); }\ninline void glTranslatef(GLfloat x, GLfloat y, GLfloat z) { fp_glTranslatef(x, y, z); }\n\n/* GL_VERSION_1_1 */\ninline void glDrawArrays(GLenum mode, GLint first, GLsizei count) { fp_glDrawArrays(mode, first, count); }\ninline void glDrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices) { fp_glDrawElements(mode, count, type, indices); }\ninline void glGetPointerv(GLenum pname, void** params) { fp_glGetPointerv(pname, params); }\ninline void glPolygonOffset(GLfloat factor, GLfloat units) { fp_glPolygonOffset(factor, units); }\ninline void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) { fp_glCopyTexImage1D(target, level, internalformat, x, y, width, border); }\ninline void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) { fp_glCopyTexImage2D(target, level, internalformat, x, y, width, height, border); }\ninline void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) { fp_glCopyTexSubImage1D(target, level, xoffset, x, y, width); }\ninline void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); }\ninline void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels) { fp_glTexSubImage1D(target, level, xoffset, width, format, type, pixels); }\ninline void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) { fp_glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); }\ninline void glBindTexture(GLenum target, GLuint texture) { fp_glBindTexture(target, texture); }\ninline void glDeleteTextures(GLsizei n, const GLuint* textures) { fp_glDeleteTextures(n, textures); }\ninline void glGenTextures(GLsizei n, GLuint* textures) { fp_glGenTextures(n, textures); }\ninline GLboolean glIsTexture(GLuint texture) { return fp_glIsTexture(texture); }\ninline void glArrayElement(GLint i) { fp_glArrayElement(i); }\ninline void glColorPointer(GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glColorPointer(size, type, stride, pointer); }\ninline void glDisableClientState(GLenum array) { fp_glDisableClientState(array); }\ninline void glEdgeFlagPointer(GLsizei stride, const void* pointer) { fp_glEdgeFlagPointer(stride, pointer); }\ninline void glEnableClientState(GLenum array) { fp_glEnableClientState(array); }\ninline void glIndexPointer(GLenum type, GLsizei stride, const void* pointer) { fp_glIndexPointer(type, stride, pointer); }\ninline void glInterleavedArrays(GLenum format, GLsizei stride, const void* pointer) { fp_glInterleavedArrays(format, stride, pointer); }\ninline void glNormalPointer(GLenum type, GLsizei stride, const void* pointer) { fp_glNormalPointer(type, stride, pointer); }\ninline void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glTexCoordPointer(size, type, stride, pointer); }\ninline void glVertexPointer(GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glVertexPointer(size, type, stride, pointer); }\ninline GLboolean glAreTexturesResident(GLsizei n, const GLuint* textures, GLboolean* residences) { return fp_glAreTexturesResident(n, textures, residences); }\ninline void glPrioritizeTextures(GLsizei n, const GLuint* textures, const GLfloat* priorities) { fp_glPrioritizeTextures(n, textures, priorities); }\ninline void glIndexub(GLubyte c) { fp_glIndexub(c); }\ninline void glIndexubv(const GLubyte* c) { fp_glIndexubv(c); }\ninline void glPopClientAttrib() { fp_glPopClientAttrib(); }\ninline void glPushClientAttrib(GLbitfield mask) { fp_glPushClientAttrib(mask); }\n\n/* GL_VERSION_1_2 */\ninline void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices) { fp_glDrawRangeElements(mode, start, end, count, type, indices); }\ninline void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels) { fp_glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels); }\ninline void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels) { fp_glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); }\ninline void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height); }\n\n/* GL_VERSION_1_3 */\ninline void glActiveTexture(GLenum texture) { fp_glActiveTexture(texture); }\ninline void glSampleCoverage(GLfloat value, GLboolean invert) { fp_glSampleCoverage(value, invert); }\ninline void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data) { fp_glCompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data); }\ninline void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data) { fp_glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data); }\ninline void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data) { fp_glCompressedTexImage1D(target, level, internalformat, width, border, imageSize, data); }\ninline void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data) { fp_glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); }\ninline void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data) { fp_glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data); }\ninline void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data) { fp_glCompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data); }\ninline void glGetCompressedTexImage(GLenum target, GLint level, void* img) { fp_glGetCompressedTexImage(target, level, img); }\ninline void glClientActiveTexture(GLenum texture) { fp_glClientActiveTexture(texture); }\ninline void glMultiTexCoord1d(GLenum target, GLdouble s) { fp_glMultiTexCoord1d(target, s); }\ninline void glMultiTexCoord1dv(GLenum target, const GLdouble* v) { fp_glMultiTexCoord1dv(target, v); }\ninline void glMultiTexCoord1f(GLenum target, GLfloat s) { fp_glMultiTexCoord1f(target, s); }\ninline void glMultiTexCoord1fv(GLenum target, const GLfloat* v) { fp_glMultiTexCoord1fv(target, v); }\ninline void glMultiTexCoord1i(GLenum target, GLint s) { fp_glMultiTexCoord1i(target, s); }\ninline void glMultiTexCoord1iv(GLenum target, const GLint* v) { fp_glMultiTexCoord1iv(target, v); }\ninline void glMultiTexCoord1s(GLenum target, GLshort s) { fp_glMultiTexCoord1s(target, s); }\ninline void glMultiTexCoord1sv(GLenum target, const GLshort* v) { fp_glMultiTexCoord1sv(target, v); }\ninline void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t) { fp_glMultiTexCoord2d(target, s, t); }\ninline void glMultiTexCoord2dv(GLenum target, const GLdouble* v) { fp_glMultiTexCoord2dv(target, v); }\ninline void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t) { fp_glMultiTexCoord2f(target, s, t); }\ninline void glMultiTexCoord2fv(GLenum target, const GLfloat* v) { fp_glMultiTexCoord2fv(target, v); }\ninline void glMultiTexCoord2i(GLenum target, GLint s, GLint t) { fp_glMultiTexCoord2i(target, s, t); }\ninline void glMultiTexCoord2iv(GLenum target, const GLint* v) { fp_glMultiTexCoord2iv(target, v); }\ninline void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t) { fp_glMultiTexCoord2s(target, s, t); }\ninline void glMultiTexCoord2sv(GLenum target, const GLshort* v) { fp_glMultiTexCoord2sv(target, v); }\ninline void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r) { fp_glMultiTexCoord3d(target, s, t, r); }\ninline void glMultiTexCoord3dv(GLenum target, const GLdouble* v) { fp_glMultiTexCoord3dv(target, v); }\ninline void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r) { fp_glMultiTexCoord3f(target, s, t, r); }\ninline void glMultiTexCoord3fv(GLenum target, const GLfloat* v) { fp_glMultiTexCoord3fv(target, v); }\ninline void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r) { fp_glMultiTexCoord3i(target, s, t, r); }\ninline void glMultiTexCoord3iv(GLenum target, const GLint* v) { fp_glMultiTexCoord3iv(target, v); }\ninline void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r) { fp_glMultiTexCoord3s(target, s, t, r); }\ninline void glMultiTexCoord3sv(GLenum target, const GLshort* v) { fp_glMultiTexCoord3sv(target, v); }\ninline void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q) { fp_glMultiTexCoord4d(target, s, t, r, q); }\ninline void glMultiTexCoord4dv(GLenum target, const GLdouble* v) { fp_glMultiTexCoord4dv(target, v); }\ninline void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) { fp_glMultiTexCoord4f(target, s, t, r, q); }\ninline void glMultiTexCoord4fv(GLenum target, const GLfloat* v) { fp_glMultiTexCoord4fv(target, v); }\ninline void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q) { fp_glMultiTexCoord4i(target, s, t, r, q); }\ninline void glMultiTexCoord4iv(GLenum target, const GLint* v) { fp_glMultiTexCoord4iv(target, v); }\ninline void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q) { fp_glMultiTexCoord4s(target, s, t, r, q); }\ninline void glMultiTexCoord4sv(GLenum target, const GLshort* v) { fp_glMultiTexCoord4sv(target, v); }\ninline void glLoadTransposeMatrixf(const GLfloat* m) { fp_glLoadTransposeMatrixf(m); }\ninline void glLoadTransposeMatrixd(const GLdouble* m) { fp_glLoadTransposeMatrixd(m); }\ninline void glMultTransposeMatrixf(const GLfloat* m) { fp_glMultTransposeMatrixf(m); }\ninline void glMultTransposeMatrixd(const GLdouble* m) { fp_glMultTransposeMatrixd(m); }\n\n/* GL_VERSION_1_4 */\ninline void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) { fp_glBlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); }\ninline void glMultiDrawArrays(GLenum mode, const GLint* first, const GLsizei* count, GLsizei drawcount) { fp_glMultiDrawArrays(mode, first, count, drawcount); }\ninline void glMultiDrawElements(GLenum mode, const GLsizei* count, GLenum type, const void** indices, GLsizei drawcount) { fp_glMultiDrawElements(mode, count, type, indices, drawcount); }\ninline void glPointParameterf(GLenum pname, GLfloat param) { fp_glPointParameterf(pname, param); }\ninline void glPointParameterfv(GLenum pname, const GLfloat* params) { fp_glPointParameterfv(pname, params); }\ninline void glPointParameteri(GLenum pname, GLint param) { fp_glPointParameteri(pname, param); }\ninline void glPointParameteriv(GLenum pname, const GLint* params) { fp_glPointParameteriv(pname, params); }\ninline void glFogCoordf(GLfloat coord) { fp_glFogCoordf(coord); }\ninline void glFogCoordfv(const GLfloat* coord) { fp_glFogCoordfv(coord); }\ninline void glFogCoordd(GLdouble coord) { fp_glFogCoordd(coord); }\ninline void glFogCoorddv(const GLdouble* coord) { fp_glFogCoorddv(coord); }\ninline void glFogCoordPointer(GLenum type, GLsizei stride, const void* pointer) { fp_glFogCoordPointer(type, stride, pointer); }\ninline void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue) { fp_glSecondaryColor3b(red, green, blue); }\ninline void glSecondaryColor3bv(const GLbyte* v) { fp_glSecondaryColor3bv(v); }\ninline void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue) { fp_glSecondaryColor3d(red, green, blue); }\ninline void glSecondaryColor3dv(const GLdouble* v) { fp_glSecondaryColor3dv(v); }\ninline void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue) { fp_glSecondaryColor3f(red, green, blue); }\ninline void glSecondaryColor3fv(const GLfloat* v) { fp_glSecondaryColor3fv(v); }\ninline void glSecondaryColor3i(GLint red, GLint green, GLint blue) { fp_glSecondaryColor3i(red, green, blue); }\ninline void glSecondaryColor3iv(const GLint* v) { fp_glSecondaryColor3iv(v); }\ninline void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue) { fp_glSecondaryColor3s(red, green, blue); }\ninline void glSecondaryColor3sv(const GLshort* v) { fp_glSecondaryColor3sv(v); }\ninline void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue) { fp_glSecondaryColor3ub(red, green, blue); }\ninline void glSecondaryColor3ubv(const GLubyte* v) { fp_glSecondaryColor3ubv(v); }\ninline void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue) { fp_glSecondaryColor3ui(red, green, blue); }\ninline void glSecondaryColor3uiv(const GLuint* v) { fp_glSecondaryColor3uiv(v); }\ninline void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue) { fp_glSecondaryColor3us(red, green, blue); }\ninline void glSecondaryColor3usv(const GLushort* v) { fp_glSecondaryColor3usv(v); }\ninline void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glSecondaryColorPointer(size, type, stride, pointer); }\ninline void glWindowPos2d(GLdouble x, GLdouble y) { fp_glWindowPos2d(x, y); }\ninline void glWindowPos2dv(const GLdouble* v) { fp_glWindowPos2dv(v); }\ninline void glWindowPos2f(GLfloat x, GLfloat y) { fp_glWindowPos2f(x, y); }\ninline void glWindowPos2fv(const GLfloat* v) { fp_glWindowPos2fv(v); }\ninline void glWindowPos2i(GLint x, GLint y) { fp_glWindowPos2i(x, y); }\ninline void glWindowPos2iv(const GLint* v) { fp_glWindowPos2iv(v); }\ninline void glWindowPos2s(GLshort x, GLshort y) { fp_glWindowPos2s(x, y); }\ninline void glWindowPos2sv(const GLshort* v) { fp_glWindowPos2sv(v); }\ninline void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z) { fp_glWindowPos3d(x, y, z); }\ninline void glWindowPos3dv(const GLdouble* v) { fp_glWindowPos3dv(v); }\ninline void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z) { fp_glWindowPos3f(x, y, z); }\ninline void glWindowPos3fv(const GLfloat* v) { fp_glWindowPos3fv(v); }\ninline void glWindowPos3i(GLint x, GLint y, GLint z) { fp_glWindowPos3i(x, y, z); }\ninline void glWindowPos3iv(const GLint* v) { fp_glWindowPos3iv(v); }\ninline void glWindowPos3s(GLshort x, GLshort y, GLshort z) { fp_glWindowPos3s(x, y, z); }\ninline void glWindowPos3sv(const GLshort* v) { fp_glWindowPos3sv(v); }\ninline void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { fp_glBlendColor(red, green, blue, alpha); }\ninline void glBlendEquation(GLenum mode) { fp_glBlendEquation(mode); }\n\n/* GL_VERSION_1_5 */\ninline void glGenQueries(GLsizei n, GLuint* ids) { fp_glGenQueries(n, ids); }\ninline void glDeleteQueries(GLsizei n, const GLuint* ids) { fp_glDeleteQueries(n, ids); }\ninline GLboolean glIsQuery(GLuint id) { return fp_glIsQuery(id); }\ninline void glBeginQuery(GLenum target, GLuint id) { fp_glBeginQuery(target, id); }\ninline void glEndQuery(GLenum target) { fp_glEndQuery(target); }\ninline void glGetQueryiv(GLenum target, GLenum pname, GLint* params) { fp_glGetQueryiv(target, pname, params); }\ninline void glGetQueryObjectiv(GLuint id, GLenum pname, GLint* params) { fp_glGetQueryObjectiv(id, pname, params); }\ninline void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params) { fp_glGetQueryObjectuiv(id, pname, params); }\ninline void glBindBuffer(GLenum target, GLuint buffer) { fp_glBindBuffer(target, buffer); }\ninline void glDeleteBuffers(GLsizei n, const GLuint* buffers) { fp_glDeleteBuffers(n, buffers); }\ninline void glGenBuffers(GLsizei n, GLuint* buffers) { fp_glGenBuffers(n, buffers); }\ninline GLboolean glIsBuffer(GLuint buffer) { return fp_glIsBuffer(buffer); }\ninline void glBufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage) { fp_glBufferData(target, size, data, usage); }\ninline void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data) { fp_glBufferSubData(target, offset, size, data); }\ninline void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void* data) { fp_glGetBufferSubData(target, offset, size, data); }\ninline void* glMapBuffer(GLenum target, GLenum access) { return fp_glMapBuffer(target, access); }\ninline GLboolean glUnmapBuffer(GLenum target) { return fp_glUnmapBuffer(target); }\ninline void glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params) { fp_glGetBufferParameteriv(target, pname, params); }\ninline void glGetBufferPointerv(GLenum target, GLenum pname, void** params) { fp_glGetBufferPointerv(target, pname, params); }\n\n/* GL_VERSION_2_0 */\ninline void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) { fp_glBlendEquationSeparate(modeRGB, modeAlpha); }\ninline void glDrawBuffers(GLsizei n, const GLenum* bufs) { fp_glDrawBuffers(n, bufs); }\ninline void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) { fp_glStencilOpSeparate(face, sfail, dpfail, dppass); }\ninline void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask) { fp_glStencilFuncSeparate(face, func, ref, mask); }\ninline void glStencilMaskSeparate(GLenum face, GLuint mask) { fp_glStencilMaskSeparate(face, mask); }\ninline void glAttachShader(GLuint program, GLuint shader) { fp_glAttachShader(program, shader); }\ninline void glBindAttribLocation(GLuint program, GLuint index, const GLchar* name) { fp_glBindAttribLocation(program, index, name); }\ninline void glCompileShader(GLuint shader) { fp_glCompileShader(shader); }\ninline GLuint glCreateProgram() { return fp_glCreateProgram(); }\ninline GLuint glCreateShader(GLenum type) { return fp_glCreateShader(type); }\ninline void glDeleteProgram(GLuint program) { fp_glDeleteProgram(program); }\ninline void glDeleteShader(GLuint shader) { fp_glDeleteShader(shader); }\ninline void glDetachShader(GLuint program, GLuint shader) { fp_glDetachShader(program, shader); }\ninline void glDisableVertexAttribArray(GLuint index) { fp_glDisableVertexAttribArray(index); }\ninline void glEnableVertexAttribArray(GLuint index) { fp_glEnableVertexAttribArray(index); }\ninline void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size, GLenum* type, GLchar* name) { fp_glGetActiveAttrib(program, index, bufSize, length, size, type, name); }\ninline void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size, GLenum* type, GLchar* name) { fp_glGetActiveUniform(program, index, bufSize, length, size, type, name); }\ninline void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders) { fp_glGetAttachedShaders(program, maxCount, count, shaders); }\ninline GLint glGetAttribLocation(GLuint program, const GLchar* name) { return fp_glGetAttribLocation(program, name); }\ninline void glGetProgramiv(GLuint program, GLenum pname, GLint* params) { fp_glGetProgramiv(program, pname, params); }\ninline void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog) { fp_glGetProgramInfoLog(program, bufSize, length, infoLog); }\ninline void glGetShaderiv(GLuint shader, GLenum pname, GLint* params) { fp_glGetShaderiv(shader, pname, params); }\ninline void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog) { fp_glGetShaderInfoLog(shader, bufSize, length, infoLog); }\ninline void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* source) { fp_glGetShaderSource(shader, bufSize, length, source); }\ninline GLint glGetUniformLocation(GLuint program, const GLchar* name) { return fp_glGetUniformLocation(program, name); }\ninline void glGetUniformfv(GLuint program, GLint location, GLfloat* params) { fp_glGetUniformfv(program, location, params); }\ninline void glGetUniformiv(GLuint program, GLint location, GLint* params) { fp_glGetUniformiv(program, location, params); }\ninline void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble* params) { fp_glGetVertexAttribdv(index, pname, params); }\ninline void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params) { fp_glGetVertexAttribfv(index, pname, params); }\ninline void glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params) { fp_glGetVertexAttribiv(index, pname, params); }\ninline void glGetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer) { fp_glGetVertexAttribPointerv(index, pname, pointer); }\ninline GLboolean glIsProgram(GLuint program) { return fp_glIsProgram(program); }\ninline GLboolean glIsShader(GLuint shader) { return fp_glIsShader(shader); }\ninline void glLinkProgram(GLuint program) { fp_glLinkProgram(program); }\ninline void glShaderSource(GLuint shader, GLsizei count, const GLchar** string, const GLint* length) { fp_glShaderSource(shader, count, string, length); }\ninline void glUseProgram(GLuint program) { fp_glUseProgram(program); }\ninline void glUniform1f(GLint location, GLfloat v0) { fp_glUniform1f(location, v0); }\ninline void glUniform2f(GLint location, GLfloat v0, GLfloat v1) { fp_glUniform2f(location, v0, v1); }\ninline void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2) { fp_glUniform3f(location, v0, v1, v2); }\ninline void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) { fp_glUniform4f(location, v0, v1, v2, v3); }\ninline void glUniform1i(GLint location, GLint v0) { fp_glUniform1i(location, v0); }\ninline void glUniform2i(GLint location, GLint v0, GLint v1) { fp_glUniform2i(location, v0, v1); }\ninline void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2) { fp_glUniform3i(location, v0, v1, v2); }\ninline void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3) { fp_glUniform4i(location, v0, v1, v2, v3); }\ninline void glUniform1fv(GLint location, GLsizei count, const GLfloat* value) { fp_glUniform1fv(location, count, value); }\ninline void glUniform2fv(GLint location, GLsizei count, const GLfloat* value) { fp_glUniform2fv(location, count, value); }\ninline void glUniform3fv(GLint location, GLsizei count, const GLfloat* value) { fp_glUniform3fv(location, count, value); }\ninline void glUniform4fv(GLint location, GLsizei count, const GLfloat* value) { fp_glUniform4fv(location, count, value); }\ninline void glUniform1iv(GLint location, GLsizei count, const GLint* value) { fp_glUniform1iv(location, count, value); }\ninline void glUniform2iv(GLint location, GLsizei count, const GLint* value) { fp_glUniform2iv(location, count, value); }\ninline void glUniform3iv(GLint location, GLsizei count, const GLint* value) { fp_glUniform3iv(location, count, value); }\ninline void glUniform4iv(GLint location, GLsizei count, const GLint* value) { fp_glUniform4iv(location, count, value); }\ninline void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix2fv(location, count, transpose, value); }\ninline void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix3fv(location, count, transpose, value); }\ninline void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix4fv(location, count, transpose, value); }\ninline void glValidateProgram(GLuint program) { fp_glValidateProgram(program); }\ninline void glVertexAttrib1d(GLuint index, GLdouble x) { fp_glVertexAttrib1d(index, x); }\ninline void glVertexAttrib1dv(GLuint index, const GLdouble* v) { fp_glVertexAttrib1dv(index, v); }\ninline void glVertexAttrib1f(GLuint index, GLfloat x) { fp_glVertexAttrib1f(index, x); }\ninline void glVertexAttrib1fv(GLuint index, const GLfloat* v) { fp_glVertexAttrib1fv(index, v); }\ninline void glVertexAttrib1s(GLuint index, GLshort x) { fp_glVertexAttrib1s(index, x); }\ninline void glVertexAttrib1sv(GLuint index, const GLshort* v) { fp_glVertexAttrib1sv(index, v); }\ninline void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y) { fp_glVertexAttrib2d(index, x, y); }\ninline void glVertexAttrib2dv(GLuint index, const GLdouble* v) { fp_glVertexAttrib2dv(index, v); }\ninline void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y) { fp_glVertexAttrib2f(index, x, y); }\ninline void glVertexAttrib2fv(GLuint index, const GLfloat* v) { fp_glVertexAttrib2fv(index, v); }\ninline void glVertexAttrib2s(GLuint index, GLshort x, GLshort y) { fp_glVertexAttrib2s(index, x, y); }\ninline void glVertexAttrib2sv(GLuint index, const GLshort* v) { fp_glVertexAttrib2sv(index, v); }\ninline void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z) { fp_glVertexAttrib3d(index, x, y, z); }\ninline void glVertexAttrib3dv(GLuint index, const GLdouble* v) { fp_glVertexAttrib3dv(index, v); }\ninline void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z) { fp_glVertexAttrib3f(index, x, y, z); }\ninline void glVertexAttrib3fv(GLuint index, const GLfloat* v) { fp_glVertexAttrib3fv(index, v); }\ninline void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z) { fp_glVertexAttrib3s(index, x, y, z); }\ninline void glVertexAttrib3sv(GLuint index, const GLshort* v) { fp_glVertexAttrib3sv(index, v); }\ninline void glVertexAttrib4Nbv(GLuint index, const GLbyte* v) { fp_glVertexAttrib4Nbv(index, v); }\ninline void glVertexAttrib4Niv(GLuint index, const GLint* v) { fp_glVertexAttrib4Niv(index, v); }\ninline void glVertexAttrib4Nsv(GLuint index, const GLshort* v) { fp_glVertexAttrib4Nsv(index, v); }\ninline void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w) { fp_glVertexAttrib4Nub(index, x, y, z, w); }\ninline void glVertexAttrib4Nubv(GLuint index, const GLubyte* v) { fp_glVertexAttrib4Nubv(index, v); }\ninline void glVertexAttrib4Nuiv(GLuint index, const GLuint* v) { fp_glVertexAttrib4Nuiv(index, v); }\ninline void glVertexAttrib4Nusv(GLuint index, const GLushort* v) { fp_glVertexAttrib4Nusv(index, v); }\ninline void glVertexAttrib4bv(GLuint index, const GLbyte* v) { fp_glVertexAttrib4bv(index, v); }\ninline void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glVertexAttrib4d(index, x, y, z, w); }\ninline void glVertexAttrib4dv(GLuint index, const GLdouble* v) { fp_glVertexAttrib4dv(index, v); }\ninline void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glVertexAttrib4f(index, x, y, z, w); }\ninline void glVertexAttrib4fv(GLuint index, const GLfloat* v) { fp_glVertexAttrib4fv(index, v); }\ninline void glVertexAttrib4iv(GLuint index, const GLint* v) { fp_glVertexAttrib4iv(index, v); }\ninline void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w) { fp_glVertexAttrib4s(index, x, y, z, w); }\ninline void glVertexAttrib4sv(GLuint index, const GLshort* v) { fp_glVertexAttrib4sv(index, v); }\ninline void glVertexAttrib4ubv(GLuint index, const GLubyte* v) { fp_glVertexAttrib4ubv(index, v); }\ninline void glVertexAttrib4uiv(GLuint index, const GLuint* v) { fp_glVertexAttrib4uiv(index, v); }\ninline void glVertexAttrib4usv(GLuint index, const GLushort* v) { fp_glVertexAttrib4usv(index, v); }\ninline void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer) { fp_glVertexAttribPointer(index, size, type, normalized, stride, pointer); }\n\n/* GL_VERSION_2_1 */\ninline void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix2x3fv(location, count, transpose, value); }\ninline void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix3x2fv(location, count, transpose, value); }\ninline void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix2x4fv(location, count, transpose, value); }\ninline void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix4x2fv(location, count, transpose, value); }\ninline void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix3x4fv(location, count, transpose, value); }\ninline void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix4x3fv(location, count, transpose, value); }\n\n/* GL_VERSION_3_0 */\ninline void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a) { fp_glColorMaski(index, r, g, b, a); }\ninline void glGetBooleani_v(GLenum target, GLuint index, GLboolean* data) { fp_glGetBooleani_v(target, index, data); }\ninline void glGetIntegeri_v(GLenum target, GLuint index, GLint* data) { fp_glGetIntegeri_v(target, index, data); }\ninline void glEnablei(GLenum target, GLuint index) { fp_glEnablei(target, index); }\ninline void glDisablei(GLenum target, GLuint index) { fp_glDisablei(target, index); }\ninline GLboolean glIsEnabledi(GLenum target, GLuint index) { return fp_glIsEnabledi(target, index); }\ninline void glBeginTransformFeedback(GLenum primitiveMode) { fp_glBeginTransformFeedback(primitiveMode); }\ninline void glEndTransformFeedback() { fp_glEndTransformFeedback(); }\ninline void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) { fp_glBindBufferRange(target, index, buffer, offset, size); }\ninline void glBindBufferBase(GLenum target, GLuint index, GLuint buffer) { fp_glBindBufferBase(target, index, buffer); }\ninline void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar** varyings, GLenum bufferMode) { fp_glTransformFeedbackVaryings(program, count, varyings, bufferMode); }\ninline void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name) { fp_glGetTransformFeedbackVarying(program, index, bufSize, length, size, type, name); }\ninline void glClampColor(GLenum target, GLenum clamp) { fp_glClampColor(target, clamp); }\ninline void glBeginConditionalRender(GLuint id, GLenum mode) { fp_glBeginConditionalRender(id, mode); }\ninline void glEndConditionalRender() { fp_glEndConditionalRender(); }\ninline void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glVertexAttribIPointer(index, size, type, stride, pointer); }\ninline void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params) { fp_glGetVertexAttribIiv(index, pname, params); }\ninline void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params) { fp_glGetVertexAttribIuiv(index, pname, params); }\ninline void glVertexAttribI1i(GLuint index, GLint x) { fp_glVertexAttribI1i(index, x); }\ninline void glVertexAttribI2i(GLuint index, GLint x, GLint y) { fp_glVertexAttribI2i(index, x, y); }\ninline void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z) { fp_glVertexAttribI3i(index, x, y, z); }\ninline void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w) { fp_glVertexAttribI4i(index, x, y, z, w); }\ninline void glVertexAttribI1ui(GLuint index, GLuint x) { fp_glVertexAttribI1ui(index, x); }\ninline void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y) { fp_glVertexAttribI2ui(index, x, y); }\ninline void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z) { fp_glVertexAttribI3ui(index, x, y, z); }\ninline void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) { fp_glVertexAttribI4ui(index, x, y, z, w); }\ninline void glVertexAttribI1iv(GLuint index, const GLint* v) { fp_glVertexAttribI1iv(index, v); }\ninline void glVertexAttribI2iv(GLuint index, const GLint* v) { fp_glVertexAttribI2iv(index, v); }\ninline void glVertexAttribI3iv(GLuint index, const GLint* v) { fp_glVertexAttribI3iv(index, v); }\ninline void glVertexAttribI4iv(GLuint index, const GLint* v) { fp_glVertexAttribI4iv(index, v); }\ninline void glVertexAttribI1uiv(GLuint index, const GLuint* v) { fp_glVertexAttribI1uiv(index, v); }\ninline void glVertexAttribI2uiv(GLuint index, const GLuint* v) { fp_glVertexAttribI2uiv(index, v); }\ninline void glVertexAttribI3uiv(GLuint index, const GLuint* v) { fp_glVertexAttribI3uiv(index, v); }\ninline void glVertexAttribI4uiv(GLuint index, const GLuint* v) { fp_glVertexAttribI4uiv(index, v); }\ninline void glVertexAttribI4bv(GLuint index, const GLbyte* v) { fp_glVertexAttribI4bv(index, v); }\ninline void glVertexAttribI4sv(GLuint index, const GLshort* v) { fp_glVertexAttribI4sv(index, v); }\ninline void glVertexAttribI4ubv(GLuint index, const GLubyte* v) { fp_glVertexAttribI4ubv(index, v); }\ninline void glVertexAttribI4usv(GLuint index, const GLushort* v) { fp_glVertexAttribI4usv(index, v); }\ninline void glGetUniformuiv(GLuint program, GLint location, GLuint* params) { fp_glGetUniformuiv(program, location, params); }\ninline void glBindFragDataLocation(GLuint program, GLuint color, const GLchar* name) { fp_glBindFragDataLocation(program, color, name); }\ninline GLint glGetFragDataLocation(GLuint program, const GLchar* name) { return fp_glGetFragDataLocation(program, name); }\ninline void glUniform1ui(GLint location, GLuint v0) { fp_glUniform1ui(location, v0); }\ninline void glUniform2ui(GLint location, GLuint v0, GLuint v1) { fp_glUniform2ui(location, v0, v1); }\ninline void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2) { fp_glUniform3ui(location, v0, v1, v2); }\ninline void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) { fp_glUniform4ui(location, v0, v1, v2, v3); }\ninline void glUniform1uiv(GLint location, GLsizei count, const GLuint* value) { fp_glUniform1uiv(location, count, value); }\ninline void glUniform2uiv(GLint location, GLsizei count, const GLuint* value) { fp_glUniform2uiv(location, count, value); }\ninline void glUniform3uiv(GLint location, GLsizei count, const GLuint* value) { fp_glUniform3uiv(location, count, value); }\ninline void glUniform4uiv(GLint location, GLsizei count, const GLuint* value) { fp_glUniform4uiv(location, count, value); }\ninline void glTexParameterIiv(GLenum target, GLenum pname, const GLint* params) { fp_glTexParameterIiv(target, pname, params); }\ninline void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint* params) { fp_glTexParameterIuiv(target, pname, params); }\ninline void glGetTexParameterIiv(GLenum target, GLenum pname, GLint* params) { fp_glGetTexParameterIiv(target, pname, params); }\ninline void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint* params) { fp_glGetTexParameterIuiv(target, pname, params); }\ninline void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value) { fp_glClearBufferiv(buffer, drawbuffer, value); }\ninline void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value) { fp_glClearBufferuiv(buffer, drawbuffer, value); }\ninline void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value) { fp_glClearBufferfv(buffer, drawbuffer, value); }\ninline void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) { fp_glClearBufferfi(buffer, drawbuffer, depth, stencil); }\ninline const GLubyte* glGetStringi(GLenum name, GLuint index) { return fp_glGetStringi(name, index); }\ninline GLboolean glIsRenderbuffer(GLuint renderbuffer) { return fp_glIsRenderbuffer(renderbuffer); }\ninline void glBindRenderbuffer(GLenum target, GLuint renderbuffer) { fp_glBindRenderbuffer(target, renderbuffer); }\ninline void glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers) { fp_glDeleteRenderbuffers(n, renderbuffers); }\ninline void glGenRenderbuffers(GLsizei n, GLuint* renderbuffers) { fp_glGenRenderbuffers(n, renderbuffers); }\ninline void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) { fp_glRenderbufferStorage(target, internalformat, width, height); }\ninline void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params) { fp_glGetRenderbufferParameteriv(target, pname, params); }\ninline GLboolean glIsFramebuffer(GLuint framebuffer) { return fp_glIsFramebuffer(framebuffer); }\ninline void glBindFramebuffer(GLenum target, GLuint framebuffer) { fp_glBindFramebuffer(target, framebuffer); }\ninline void glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers) { fp_glDeleteFramebuffers(n, framebuffers); }\ninline void glGenFramebuffers(GLsizei n, GLuint* framebuffers) { fp_glGenFramebuffers(n, framebuffers); }\ninline GLenum glCheckFramebufferStatus(GLenum target) { return fp_glCheckFramebufferStatus(target); }\ninline void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { fp_glFramebufferTexture1D(target, attachment, textarget, texture, level); }\ninline void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { fp_glFramebufferTexture2D(target, attachment, textarget, texture, level); }\ninline void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) { fp_glFramebufferTexture3D(target, attachment, textarget, texture, level, zoffset); }\ninline void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) { fp_glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer); }\ninline void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params) { fp_glGetFramebufferAttachmentParameteriv(target, attachment, pname, params); }\ninline void glGenerateMipmap(GLenum target) { fp_glGenerateMipmap(target); }\ninline void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { fp_glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); }\ninline void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { fp_glRenderbufferStorageMultisample(target, samples, internalformat, width, height); }\ninline void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) { fp_glFramebufferTextureLayer(target, attachment, texture, level, layer); }\ninline void* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) { return fp_glMapBufferRange(target, offset, length, access); }\ninline void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length) { fp_glFlushMappedBufferRange(target, offset, length); }\ninline void glBindVertexArray(GLuint array) { fp_glBindVertexArray(array); }\ninline void glDeleteVertexArrays(GLsizei n, const GLuint* arrays) { fp_glDeleteVertexArrays(n, arrays); }\ninline void glGenVertexArrays(GLsizei n, GLuint* arrays) { fp_glGenVertexArrays(n, arrays); }\ninline GLboolean glIsVertexArray(GLuint array) { return fp_glIsVertexArray(array); }\n\n/* GL_VERSION_3_1 */\ninline void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount) { fp_glDrawArraysInstanced(mode, first, count, instancecount); }\ninline void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount) { fp_glDrawElementsInstanced(mode, count, type, indices, instancecount); }\ninline void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer) { fp_glTexBuffer(target, internalformat, buffer); }\ninline void glPrimitiveRestartIndex(GLuint index) { fp_glPrimitiveRestartIndex(index); }\ninline void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) { fp_glCopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size); }\ninline void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar** uniformNames, GLuint* uniformIndices) { fp_glGetUniformIndices(program, uniformCount, uniformNames, uniformIndices); }\ninline void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params) { fp_glGetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params); }\ninline void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformName) { fp_glGetActiveUniformName(program, uniformIndex, bufSize, length, uniformName); }\ninline GLuint glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName) { return fp_glGetUniformBlockIndex(program, uniformBlockName); }\ninline void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params) { fp_glGetActiveUniformBlockiv(program, uniformBlockIndex, pname, params); }\ninline void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName) { fp_glGetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName); }\ninline void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding) { fp_glUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding); }\n\n/* GL_VERSION_3_2 */\ninline void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void* indices, GLint basevertex) { fp_glDrawElementsBaseVertex(mode, count, type, indices, basevertex); }\ninline void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices, GLint basevertex) { fp_glDrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex); }\ninline void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount, GLint basevertex) { fp_glDrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex); }\ninline void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei* count, GLenum type, const void** indices, GLsizei drawcount, const GLint* basevertex) { fp_glMultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex); }\ninline void glProvokingVertex(GLenum mode) { fp_glProvokingVertex(mode); }\ninline GLsync glFenceSync(GLenum condition, GLbitfield flags) { return fp_glFenceSync(condition, flags); }\ninline GLboolean glIsSync(GLsync sync) { return fp_glIsSync(sync); }\ninline void glDeleteSync(GLsync sync) { fp_glDeleteSync(sync); }\ninline GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) { return fp_glClientWaitSync(sync, flags, timeout); }\ninline void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) { fp_glWaitSync(sync, flags, timeout); }\ninline void glGetInteger64v(GLenum pname, GLint64* data) { fp_glGetInteger64v(pname, data); }\ninline void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values) { fp_glGetSynciv(sync, pname, bufSize, length, values); }\ninline void glGetInteger64i_v(GLenum target, GLuint index, GLint64* data) { fp_glGetInteger64i_v(target, index, data); }\ninline void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params) { fp_glGetBufferParameteri64v(target, pname, params); }\ninline void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level) { fp_glFramebufferTexture(target, attachment, texture, level); }\ninline void glTexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations) { fp_glTexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations); }\ninline void glTexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) { fp_glTexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations); }\ninline void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat* val) { fp_glGetMultisamplefv(pname, index, val); }\ninline void glSampleMaski(GLuint maskNumber, GLbitfield mask) { fp_glSampleMaski(maskNumber, mask); }\n\n/* GL_VERSION_3_3 */\ninline void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar* name) { fp_glBindFragDataLocationIndexed(program, colorNumber, index, name); }\ninline GLint glGetFragDataIndex(GLuint program, const GLchar* name) { return fp_glGetFragDataIndex(program, name); }\ninline void glGenSamplers(GLsizei count, GLuint* samplers) { fp_glGenSamplers(count, samplers); }\ninline void glDeleteSamplers(GLsizei count, const GLuint* samplers) { fp_glDeleteSamplers(count, samplers); }\ninline GLboolean glIsSampler(GLuint sampler) { return fp_glIsSampler(sampler); }\ninline void glBindSampler(GLuint unit, GLuint sampler) { fp_glBindSampler(unit, sampler); }\ninline void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param) { fp_glSamplerParameteri(sampler, pname, param); }\ninline void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param) { fp_glSamplerParameteriv(sampler, pname, param); }\ninline void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param) { fp_glSamplerParameterf(sampler, pname, param); }\ninline void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param) { fp_glSamplerParameterfv(sampler, pname, param); }\ninline void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint* param) { fp_glSamplerParameterIiv(sampler, pname, param); }\ninline void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint* param) { fp_glSamplerParameterIuiv(sampler, pname, param); }\ninline void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params) { fp_glGetSamplerParameteriv(sampler, pname, params); }\ninline void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint* params) { fp_glGetSamplerParameterIiv(sampler, pname, params); }\ninline void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params) { fp_glGetSamplerParameterfv(sampler, pname, params); }\ninline void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint* params) { fp_glGetSamplerParameterIuiv(sampler, pname, params); }\ninline void glQueryCounter(GLuint id, GLenum target) { fp_glQueryCounter(id, target); }\ninline void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64* params) { fp_glGetQueryObjecti64v(id, pname, params); }\ninline void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64* params) { fp_glGetQueryObjectui64v(id, pname, params); }\ninline void glVertexAttribDivisor(GLuint index, GLuint divisor) { fp_glVertexAttribDivisor(index, divisor); }\ninline void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value) { fp_glVertexAttribP1ui(index, type, normalized, value); }\ninline void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint* value) { fp_glVertexAttribP1uiv(index, type, normalized, value); }\ninline void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value) { fp_glVertexAttribP2ui(index, type, normalized, value); }\ninline void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint* value) { fp_glVertexAttribP2uiv(index, type, normalized, value); }\ninline void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value) { fp_glVertexAttribP3ui(index, type, normalized, value); }\ninline void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint* value) { fp_glVertexAttribP3uiv(index, type, normalized, value); }\ninline void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value) { fp_glVertexAttribP4ui(index, type, normalized, value); }\ninline void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint* value) { fp_glVertexAttribP4uiv(index, type, normalized, value); }\ninline void glVertexP2ui(GLenum type, GLuint value) { fp_glVertexP2ui(type, value); }\ninline void glVertexP2uiv(GLenum type, const GLuint* value) { fp_glVertexP2uiv(type, value); }\ninline void glVertexP3ui(GLenum type, GLuint value) { fp_glVertexP3ui(type, value); }\ninline void glVertexP3uiv(GLenum type, const GLuint* value) { fp_glVertexP3uiv(type, value); }\ninline void glVertexP4ui(GLenum type, GLuint value) { fp_glVertexP4ui(type, value); }\ninline void glVertexP4uiv(GLenum type, const GLuint* value) { fp_glVertexP4uiv(type, value); }\ninline void glTexCoordP1ui(GLenum type, GLuint coords) { fp_glTexCoordP1ui(type, coords); }\ninline void glTexCoordP1uiv(GLenum type, const GLuint* coords) { fp_glTexCoordP1uiv(type, coords); }\ninline void glTexCoordP2ui(GLenum type, GLuint coords) { fp_glTexCoordP2ui(type, coords); }\ninline void glTexCoordP2uiv(GLenum type, const GLuint* coords) { fp_glTexCoordP2uiv(type, coords); }\ninline void glTexCoordP3ui(GLenum type, GLuint coords) { fp_glTexCoordP3ui(type, coords); }\ninline void glTexCoordP3uiv(GLenum type, const GLuint* coords) { fp_glTexCoordP3uiv(type, coords); }\ninline void glTexCoordP4ui(GLenum type, GLuint coords) { fp_glTexCoordP4ui(type, coords); }\ninline void glTexCoordP4uiv(GLenum type, const GLuint* coords) { fp_glTexCoordP4uiv(type, coords); }\ninline void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords) { fp_glMultiTexCoordP1ui(texture, type, coords); }\ninline void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint* coords) { fp_glMultiTexCoordP1uiv(texture, type, coords); }\ninline void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords) { fp_glMultiTexCoordP2ui(texture, type, coords); }\ninline void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint* coords) { fp_glMultiTexCoordP2uiv(texture, type, coords); }\ninline void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords) { fp_glMultiTexCoordP3ui(texture, type, coords); }\ninline void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint* coords) { fp_glMultiTexCoordP3uiv(texture, type, coords); }\ninline void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords) { fp_glMultiTexCoordP4ui(texture, type, coords); }\ninline void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint* coords) { fp_glMultiTexCoordP4uiv(texture, type, coords); }\ninline void glNormalP3ui(GLenum type, GLuint coords) { fp_glNormalP3ui(type, coords); }\ninline void glNormalP3uiv(GLenum type, const GLuint* coords) { fp_glNormalP3uiv(type, coords); }\ninline void glColorP3ui(GLenum type, GLuint color) { fp_glColorP3ui(type, color); }\ninline void glColorP3uiv(GLenum type, const GLuint* color) { fp_glColorP3uiv(type, color); }\ninline void glColorP4ui(GLenum type, GLuint color) { fp_glColorP4ui(type, color); }\ninline void glColorP4uiv(GLenum type, const GLuint* color) { fp_glColorP4uiv(type, color); }\ninline void glSecondaryColorP3ui(GLenum type, GLuint color) { fp_glSecondaryColorP3ui(type, color); }\ninline void glSecondaryColorP3uiv(GLenum type, const GLuint* color) { fp_glSecondaryColorP3uiv(type, color); }\n\n/* GL_VERSION_4_0 */\ninline void glMinSampleShading(GLfloat value) { fp_glMinSampleShading(value); }\ninline void glBlendEquationi(GLuint buf, GLenum mode) { fp_glBlendEquationi(buf, mode); }\ninline void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha) { fp_glBlendEquationSeparatei(buf, modeRGB, modeAlpha); }\ninline void glBlendFunci(GLuint buf, GLenum src, GLenum dst) { fp_glBlendFunci(buf, src, dst); }\ninline void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { fp_glBlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha); }\ninline void glDrawArraysIndirect(GLenum mode, const void* indirect) { fp_glDrawArraysIndirect(mode, indirect); }\ninline void glDrawElementsIndirect(GLenum mode, GLenum type, const void* indirect) { fp_glDrawElementsIndirect(mode, type, indirect); }\ninline void glUniform1d(GLint location, GLdouble x) { fp_glUniform1d(location, x); }\ninline void glUniform2d(GLint location, GLdouble x, GLdouble y) { fp_glUniform2d(location, x, y); }\ninline void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z) { fp_glUniform3d(location, x, y, z); }\ninline void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glUniform4d(location, x, y, z, w); }\ninline void glUniform1dv(GLint location, GLsizei count, const GLdouble* value) { fp_glUniform1dv(location, count, value); }\ninline void glUniform2dv(GLint location, GLsizei count, const GLdouble* value) { fp_glUniform2dv(location, count, value); }\ninline void glUniform3dv(GLint location, GLsizei count, const GLdouble* value) { fp_glUniform3dv(location, count, value); }\ninline void glUniform4dv(GLint location, GLsizei count, const GLdouble* value) { fp_glUniform4dv(location, count, value); }\ninline void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glUniformMatrix2dv(location, count, transpose, value); }\ninline void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glUniformMatrix3dv(location, count, transpose, value); }\ninline void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glUniformMatrix4dv(location, count, transpose, value); }\ninline void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glUniformMatrix2x3dv(location, count, transpose, value); }\ninline void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glUniformMatrix2x4dv(location, count, transpose, value); }\ninline void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glUniformMatrix3x2dv(location, count, transpose, value); }\ninline void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glUniformMatrix3x4dv(location, count, transpose, value); }\ninline void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glUniformMatrix4x2dv(location, count, transpose, value); }\ninline void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glUniformMatrix4x3dv(location, count, transpose, value); }\ninline void glGetUniformdv(GLuint program, GLint location, GLdouble* params) { fp_glGetUniformdv(program, location, params); }\ninline GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar* name) { return fp_glGetSubroutineUniformLocation(program, shadertype, name); }\ninline GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar* name) { return fp_glGetSubroutineIndex(program, shadertype, name); }\ninline void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint* values) { fp_glGetActiveSubroutineUniformiv(program, shadertype, index, pname, values); }\ninline void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar* name) { fp_glGetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name); }\ninline void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar* name) { fp_glGetActiveSubroutineName(program, shadertype, index, bufsize, length, name); }\ninline void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint* indices) { fp_glUniformSubroutinesuiv(shadertype, count, indices); }\ninline void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint* params) { fp_glGetUniformSubroutineuiv(shadertype, location, params); }\ninline void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint* values) { fp_glGetProgramStageiv(program, shadertype, pname, values); }\ninline void glPatchParameteri(GLenum pname, GLint value) { fp_glPatchParameteri(pname, value); }\ninline void glPatchParameterfv(GLenum pname, const GLfloat* values) { fp_glPatchParameterfv(pname, values); }\ninline void glBindTransformFeedback(GLenum target, GLuint id) { fp_glBindTransformFeedback(target, id); }\ninline void glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids) { fp_glDeleteTransformFeedbacks(n, ids); }\ninline void glGenTransformFeedbacks(GLsizei n, GLuint* ids) { fp_glGenTransformFeedbacks(n, ids); }\ninline GLboolean glIsTransformFeedback(GLuint id) { return fp_glIsTransformFeedback(id); }\ninline void glPauseTransformFeedback() { fp_glPauseTransformFeedback(); }\ninline void glResumeTransformFeedback() { fp_glResumeTransformFeedback(); }\ninline void glDrawTransformFeedback(GLenum mode, GLuint id) { fp_glDrawTransformFeedback(mode, id); }\ninline void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream) { fp_glDrawTransformFeedbackStream(mode, id, stream); }\ninline void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id) { fp_glBeginQueryIndexed(target, index, id); }\ninline void glEndQueryIndexed(GLenum target, GLuint index) { fp_glEndQueryIndexed(target, index); }\ninline void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint* params) { fp_glGetQueryIndexediv(target, index, pname, params); }\n\n/* GL_VERSION_4_1 */\ninline void glReleaseShaderCompiler() { fp_glReleaseShaderCompiler(); }\ninline void glShaderBinary(GLsizei count, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length) { fp_glShaderBinary(count, shaders, binaryformat, binary, length); }\ninline void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) { fp_glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision); }\ninline void glDepthRangef(GLfloat n, GLfloat f) { fp_glDepthRangef(n, f); }\ninline void glClearDepthf(GLfloat d) { fp_glClearDepthf(d); }\ninline void glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, void* binary) { fp_glGetProgramBinary(program, bufSize, length, binaryFormat, binary); }\ninline void glProgramBinary(GLuint program, GLenum binaryFormat, const void* binary, GLsizei length) { fp_glProgramBinary(program, binaryFormat, binary, length); }\ninline void glProgramParameteri(GLuint program, GLenum pname, GLint value) { fp_glProgramParameteri(program, pname, value); }\ninline void glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program) { fp_glUseProgramStages(pipeline, stages, program); }\ninline void glActiveShaderProgram(GLuint pipeline, GLuint program) { fp_glActiveShaderProgram(pipeline, program); }\ninline GLuint glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar** strings) { return fp_glCreateShaderProgramv(type, count, strings); }\ninline void glBindProgramPipeline(GLuint pipeline) { fp_glBindProgramPipeline(pipeline); }\ninline void glDeleteProgramPipelines(GLsizei n, const GLuint* pipelines) { fp_glDeleteProgramPipelines(n, pipelines); }\ninline void glGenProgramPipelines(GLsizei n, GLuint* pipelines) { fp_glGenProgramPipelines(n, pipelines); }\ninline GLboolean glIsProgramPipeline(GLuint pipeline) { return fp_glIsProgramPipeline(pipeline); }\ninline void glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint* params) { fp_glGetProgramPipelineiv(pipeline, pname, params); }\ninline void glProgramUniform1i(GLuint program, GLint location, GLint v0) { fp_glProgramUniform1i(program, location, v0); }\ninline void glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint* value) { fp_glProgramUniform1iv(program, location, count, value); }\ninline void glProgramUniform1f(GLuint program, GLint location, GLfloat v0) { fp_glProgramUniform1f(program, location, v0); }\ninline void glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat* value) { fp_glProgramUniform1fv(program, location, count, value); }\ninline void glProgramUniform1d(GLuint program, GLint location, GLdouble v0) { fp_glProgramUniform1d(program, location, v0); }\ninline void glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble* value) { fp_glProgramUniform1dv(program, location, count, value); }\ninline void glProgramUniform1ui(GLuint program, GLint location, GLuint v0) { fp_glProgramUniform1ui(program, location, v0); }\ninline void glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint* value) { fp_glProgramUniform1uiv(program, location, count, value); }\ninline void glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1) { fp_glProgramUniform2i(program, location, v0, v1); }\ninline void glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint* value) { fp_glProgramUniform2iv(program, location, count, value); }\ninline void glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1) { fp_glProgramUniform2f(program, location, v0, v1); }\ninline void glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat* value) { fp_glProgramUniform2fv(program, location, count, value); }\ninline void glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1) { fp_glProgramUniform2d(program, location, v0, v1); }\ninline void glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble* value) { fp_glProgramUniform2dv(program, location, count, value); }\ninline void glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1) { fp_glProgramUniform2ui(program, location, v0, v1); }\ninline void glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint* value) { fp_glProgramUniform2uiv(program, location, count, value); }\ninline void glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2) { fp_glProgramUniform3i(program, location, v0, v1, v2); }\ninline void glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint* value) { fp_glProgramUniform3iv(program, location, count, value); }\ninline void glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2) { fp_glProgramUniform3f(program, location, v0, v1, v2); }\ninline void glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat* value) { fp_glProgramUniform3fv(program, location, count, value); }\ninline void glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2) { fp_glProgramUniform3d(program, location, v0, v1, v2); }\ninline void glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble* value) { fp_glProgramUniform3dv(program, location, count, value); }\ninline void glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2) { fp_glProgramUniform3ui(program, location, v0, v1, v2); }\ninline void glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint* value) { fp_glProgramUniform3uiv(program, location, count, value); }\ninline void glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3) { fp_glProgramUniform4i(program, location, v0, v1, v2, v3); }\ninline void glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint* value) { fp_glProgramUniform4iv(program, location, count, value); }\ninline void glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) { fp_glProgramUniform4f(program, location, v0, v1, v2, v3); }\ninline void glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat* value) { fp_glProgramUniform4fv(program, location, count, value); }\ninline void glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3) { fp_glProgramUniform4d(program, location, v0, v1, v2, v3); }\ninline void glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble* value) { fp_glProgramUniform4dv(program, location, count, value); }\ninline void glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) { fp_glProgramUniform4ui(program, location, v0, v1, v2, v3); }\ninline void glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint* value) { fp_glProgramUniform4uiv(program, location, count, value); }\ninline void glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix2fv(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix3fv(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix4fv(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix2dv(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix3dv(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix4dv(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix2x3fv(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix3x2fv(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix2x4fv(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix4x2fv(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix3x4fv(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix4x3fv(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix2x3dv(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix3x2dv(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix2x4dv(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix4x2dv(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix3x4dv(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix4x3dv(program, location, count, transpose, value); }\ninline void glValidateProgramPipeline(GLuint pipeline) { fp_glValidateProgramPipeline(pipeline); }\ninline void glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei* length, GLchar* infoLog) { fp_glGetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog); }\ninline void glVertexAttribL1d(GLuint index, GLdouble x) { fp_glVertexAttribL1d(index, x); }\ninline void glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y) { fp_glVertexAttribL2d(index, x, y); }\ninline void glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z) { fp_glVertexAttribL3d(index, x, y, z); }\ninline void glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glVertexAttribL4d(index, x, y, z, w); }\ninline void glVertexAttribL1dv(GLuint index, const GLdouble* v) { fp_glVertexAttribL1dv(index, v); }\ninline void glVertexAttribL2dv(GLuint index, const GLdouble* v) { fp_glVertexAttribL2dv(index, v); }\ninline void glVertexAttribL3dv(GLuint index, const GLdouble* v) { fp_glVertexAttribL3dv(index, v); }\ninline void glVertexAttribL4dv(GLuint index, const GLdouble* v) { fp_glVertexAttribL4dv(index, v); }\ninline void glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glVertexAttribLPointer(index, size, type, stride, pointer); }\ninline void glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble* params) { fp_glGetVertexAttribLdv(index, pname, params); }\ninline void glViewportArrayv(GLuint first, GLsizei count, const GLfloat* v) { fp_glViewportArrayv(first, count, v); }\ninline void glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h) { fp_glViewportIndexedf(index, x, y, w, h); }\ninline void glViewportIndexedfv(GLuint index, const GLfloat* v) { fp_glViewportIndexedfv(index, v); }\ninline void glScissorArrayv(GLuint first, GLsizei count, const GLint* v) { fp_glScissorArrayv(first, count, v); }\ninline void glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height) { fp_glScissorIndexed(index, left, bottom, width, height); }\ninline void glScissorIndexedv(GLuint index, const GLint* v) { fp_glScissorIndexedv(index, v); }\ninline void glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble* v) { fp_glDepthRangeArrayv(first, count, v); }\ninline void glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f) { fp_glDepthRangeIndexed(index, n, f); }\ninline void glGetFloati_v(GLenum target, GLuint index, GLfloat* data) { fp_glGetFloati_v(target, index, data); }\ninline void glGetDoublei_v(GLenum target, GLuint index, GLdouble* data) { fp_glGetDoublei_v(target, index, data); }\n\n/* GL_VERSION_4_2 */\ninline void glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance) { fp_glDrawArraysInstancedBaseInstance(mode, first, count, instancecount, baseinstance); }\ninline void glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount, GLuint baseinstance) { fp_glDrawElementsInstancedBaseInstance(mode, count, type, indices, instancecount, baseinstance); }\ninline void glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance) { fp_glDrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, instancecount, basevertex, baseinstance); }\ninline void glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params) { fp_glGetInternalformativ(target, internalformat, pname, bufSize, params); }\ninline void glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint* params) { fp_glGetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params); }\ninline void glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format) { fp_glBindImageTexture(unit, texture, level, layered, layer, access, format); }\ninline void glMemoryBarrier(GLbitfield barriers) { fp_glMemoryBarrier(barriers); }\ninline void glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width) { fp_glTexStorage1D(target, levels, internalformat, width); }\ninline void glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) { fp_glTexStorage2D(target, levels, internalformat, width, height); }\ninline void glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) { fp_glTexStorage3D(target, levels, internalformat, width, height, depth); }\ninline void glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount) { fp_glDrawTransformFeedbackInstanced(mode, id, instancecount); }\ninline void glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount) { fp_glDrawTransformFeedbackStreamInstanced(mode, id, stream, instancecount); }\n\n/* GL_VERSION_4_3 */\ninline void glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void* data) { fp_glClearBufferData(target, internalformat, format, type, data); }\ninline void glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void* data) { fp_glClearBufferSubData(target, internalformat, offset, size, format, type, data); }\ninline void glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z) { fp_glDispatchCompute(num_groups_x, num_groups_y, num_groups_z); }\ninline void glDispatchComputeIndirect(GLintptr indirect) { fp_glDispatchComputeIndirect(indirect); }\ninline void glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth) { fp_glCopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth); }\ninline void glFramebufferParameteri(GLenum target, GLenum pname, GLint param) { fp_glFramebufferParameteri(target, pname, param); }\ninline void glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint* params) { fp_glGetFramebufferParameteriv(target, pname, params); }\ninline void glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64* params) { fp_glGetInternalformati64v(target, internalformat, pname, bufSize, params); }\ninline void glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth) { fp_glInvalidateTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth); }\ninline void glInvalidateTexImage(GLuint texture, GLint level) { fp_glInvalidateTexImage(texture, level); }\ninline void glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length) { fp_glInvalidateBufferSubData(buffer, offset, length); }\ninline void glInvalidateBufferData(GLuint buffer) { fp_glInvalidateBufferData(buffer); }\ninline void glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments) { fp_glInvalidateFramebuffer(target, numAttachments, attachments); }\ninline void glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glInvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height); }\ninline void glMultiDrawArraysIndirect(GLenum mode, const void* indirect, GLsizei drawcount, GLsizei stride) { fp_glMultiDrawArraysIndirect(mode, indirect, drawcount, stride); }\ninline void glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void* indirect, GLsizei drawcount, GLsizei stride) { fp_glMultiDrawElementsIndirect(mode, type, indirect, drawcount, stride); }\ninline void glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint* params) { fp_glGetProgramInterfaceiv(program, programInterface, pname, params); }\ninline GLuint glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar* name) { return fp_glGetProgramResourceIndex(program, programInterface, name); }\ninline void glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei* length, GLchar* name) { fp_glGetProgramResourceName(program, programInterface, index, bufSize, length, name); }\ninline void glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei* length, GLint* params) { fp_glGetProgramResourceiv(program, programInterface, index, propCount, props, bufSize, length, params); }\ninline GLint glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar* name) { return fp_glGetProgramResourceLocation(program, programInterface, name); }\ninline GLint glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar* name) { return fp_glGetProgramResourceLocationIndex(program, programInterface, name); }\ninline void glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding) { fp_glShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding); }\ninline void glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size) { fp_glTexBufferRange(target, internalformat, buffer, offset, size); }\ninline void glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations) { fp_glTexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations); }\ninline void glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) { fp_glTexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations); }\ninline void glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers) { fp_glTextureView(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers); }\ninline void glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride) { fp_glBindVertexBuffer(bindingindex, buffer, offset, stride); }\ninline void glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset) { fp_glVertexAttribFormat(attribindex, size, type, normalized, relativeoffset); }\ninline void glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) { fp_glVertexAttribIFormat(attribindex, size, type, relativeoffset); }\ninline void glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) { fp_glVertexAttribLFormat(attribindex, size, type, relativeoffset); }\ninline void glVertexAttribBinding(GLuint attribindex, GLuint bindingindex) { fp_glVertexAttribBinding(attribindex, bindingindex); }\ninline void glVertexBindingDivisor(GLuint bindingindex, GLuint divisor) { fp_glVertexBindingDivisor(bindingindex, divisor); }\ninline void glDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled) { fp_glDebugMessageControl(source, type, severity, count, ids, enabled); }\ninline void glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf) { fp_glDebugMessageInsert(source, type, id, severity, length, buf); }\ninline void glDebugMessageCallback(GLDEBUGPROC callback, const void* userParam) { fp_glDebugMessageCallback(callback, userParam); }\ninline GLuint glGetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog) { return fp_glGetDebugMessageLog(count, bufSize, sources, types, ids, severities, lengths, messageLog); }\ninline void glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar* message) { fp_glPushDebugGroup(source, id, length, message); }\ninline void glPopDebugGroup() { fp_glPopDebugGroup(); }\ninline void glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar* label) { fp_glObjectLabel(identifier, name, length, label); }\ninline void glGetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei* length, GLchar* label) { fp_glGetObjectLabel(identifier, name, bufSize, length, label); }\ninline void glObjectPtrLabel(const void* ptr, GLsizei length, const GLchar* label) { fp_glObjectPtrLabel(ptr, length, label); }\ninline void glGetObjectPtrLabel(const void* ptr, GLsizei bufSize, GLsizei* length, GLchar* label) { fp_glGetObjectPtrLabel(ptr, bufSize, length, label); }\n\n/* GL_VERSION_4_4 */\ninline void glBufferStorage(GLenum target, GLsizeiptr size, const void* data, GLbitfield flags) { fp_glBufferStorage(target, size, data, flags); }\ninline void glClearTexImage(GLuint texture, GLint level, GLenum format, GLenum type, const void* data) { fp_glClearTexImage(texture, level, format, type, data); }\ninline void glClearTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* data) { fp_glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); }\ninline void glBindBuffersBase(GLenum target, GLuint first, GLsizei count, const GLuint* buffers) { fp_glBindBuffersBase(target, first, count, buffers); }\ninline void glBindBuffersRange(GLenum target, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr* offsets, const GLsizeiptr* sizes) { fp_glBindBuffersRange(target, first, count, buffers, offsets, sizes); }\ninline void glBindTextures(GLuint first, GLsizei count, const GLuint* textures) { fp_glBindTextures(first, count, textures); }\ninline void glBindSamplers(GLuint first, GLsizei count, const GLuint* samplers) { fp_glBindSamplers(first, count, samplers); }\ninline void glBindImageTextures(GLuint first, GLsizei count, const GLuint* textures) { fp_glBindImageTextures(first, count, textures); }\ninline void glBindVertexBuffers(GLuint first, GLsizei count, const GLuint* buffers, const GLintptr* offsets, const GLsizei* strides) { fp_glBindVertexBuffers(first, count, buffers, offsets, strides); }\n\n/* GL_VERSION_4_5 */\ninline void glClipControl(GLenum origin, GLenum depth) { fp_glClipControl(origin, depth); }\ninline void glCreateTransformFeedbacks(GLsizei n, GLuint* ids) { fp_glCreateTransformFeedbacks(n, ids); }\ninline void glTransformFeedbackBufferBase(GLuint xfb, GLuint index, GLuint buffer) { fp_glTransformFeedbackBufferBase(xfb, index, buffer); }\ninline void glTransformFeedbackBufferRange(GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) { fp_glTransformFeedbackBufferRange(xfb, index, buffer, offset, size); }\ninline void glGetTransformFeedbackiv(GLuint xfb, GLenum pname, GLint* param) { fp_glGetTransformFeedbackiv(xfb, pname, param); }\ninline void glGetTransformFeedbacki_v(GLuint xfb, GLenum pname, GLuint index, GLint* param) { fp_glGetTransformFeedbacki_v(xfb, pname, index, param); }\ninline void glGetTransformFeedbacki64_v(GLuint xfb, GLenum pname, GLuint index, GLint64* param) { fp_glGetTransformFeedbacki64_v(xfb, pname, index, param); }\ninline void glCreateBuffers(GLsizei n, GLuint* buffers) { fp_glCreateBuffers(n, buffers); }\ninline void glNamedBufferStorage(GLuint buffer, GLsizeiptr size, const void* data, GLbitfield flags) { fp_glNamedBufferStorage(buffer, size, data, flags); }\ninline void glNamedBufferData(GLuint buffer, GLsizeiptr size, const void* data, GLenum usage) { fp_glNamedBufferData(buffer, size, data, usage); }\ninline void glNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data) { fp_glNamedBufferSubData(buffer, offset, size, data); }\ninline void glCopyNamedBufferSubData(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) { fp_glCopyNamedBufferSubData(readBuffer, writeBuffer, readOffset, writeOffset, size); }\ninline void glClearNamedBufferData(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void* data) { fp_glClearNamedBufferData(buffer, internalformat, format, type, data); }\ninline void glClearNamedBufferSubData(GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void* data) { fp_glClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data); }\ninline void* glMapNamedBuffer(GLuint buffer, GLenum access) { return fp_glMapNamedBuffer(buffer, access); }\ninline void* glMapNamedBufferRange(GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access) { return fp_glMapNamedBufferRange(buffer, offset, length, access); }\ninline GLboolean glUnmapNamedBuffer(GLuint buffer) { return fp_glUnmapNamedBuffer(buffer); }\ninline void glFlushMappedNamedBufferRange(GLuint buffer, GLintptr offset, GLsizeiptr length) { fp_glFlushMappedNamedBufferRange(buffer, offset, length); }\ninline void glGetNamedBufferParameteriv(GLuint buffer, GLenum pname, GLint* params) { fp_glGetNamedBufferParameteriv(buffer, pname, params); }\ninline void glGetNamedBufferParameteri64v(GLuint buffer, GLenum pname, GLint64* params) { fp_glGetNamedBufferParameteri64v(buffer, pname, params); }\ninline void glGetNamedBufferPointerv(GLuint buffer, GLenum pname, void** params) { fp_glGetNamedBufferPointerv(buffer, pname, params); }\ninline void glGetNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr size, void* data) { fp_glGetNamedBufferSubData(buffer, offset, size, data); }\ninline void glCreateFramebuffers(GLsizei n, GLuint* framebuffers) { fp_glCreateFramebuffers(n, framebuffers); }\ninline void glNamedFramebufferRenderbuffer(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) { fp_glNamedFramebufferRenderbuffer(framebuffer, attachment, renderbuffertarget, renderbuffer); }\ninline void glNamedFramebufferParameteri(GLuint framebuffer, GLenum pname, GLint param) { fp_glNamedFramebufferParameteri(framebuffer, pname, param); }\ninline void glNamedFramebufferTexture(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level) { fp_glNamedFramebufferTexture(framebuffer, attachment, texture, level); }\ninline void glNamedFramebufferTextureLayer(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer) { fp_glNamedFramebufferTextureLayer(framebuffer, attachment, texture, level, layer); }\ninline void glNamedFramebufferDrawBuffer(GLuint framebuffer, GLenum buf) { fp_glNamedFramebufferDrawBuffer(framebuffer, buf); }\ninline void glNamedFramebufferDrawBuffers(GLuint framebuffer, GLsizei n, const GLenum* bufs) { fp_glNamedFramebufferDrawBuffers(framebuffer, n, bufs); }\ninline void glNamedFramebufferReadBuffer(GLuint framebuffer, GLenum src) { fp_glNamedFramebufferReadBuffer(framebuffer, src); }\ninline void glInvalidateNamedFramebufferData(GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments) { fp_glInvalidateNamedFramebufferData(framebuffer, numAttachments, attachments); }\ninline void glInvalidateNamedFramebufferSubData(GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glInvalidateNamedFramebufferSubData(framebuffer, numAttachments, attachments, x, y, width, height); }\ninline void glClearNamedFramebufferiv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint* value) { fp_glClearNamedFramebufferiv(framebuffer, buffer, drawbuffer, value); }\ninline void glClearNamedFramebufferuiv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint* value) { fp_glClearNamedFramebufferuiv(framebuffer, buffer, drawbuffer, value); }\ninline void glClearNamedFramebufferfv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat* value) { fp_glClearNamedFramebufferfv(framebuffer, buffer, drawbuffer, value); }\ninline void glClearNamedFramebufferfi(GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) { fp_glClearNamedFramebufferfi(framebuffer, buffer, drawbuffer, depth, stencil); }\ninline void glBlitNamedFramebuffer(GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { fp_glBlitNamedFramebuffer(readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); }\ninline GLenum glCheckNamedFramebufferStatus(GLuint framebuffer, GLenum target) { return fp_glCheckNamedFramebufferStatus(framebuffer, target); }\ninline void glGetNamedFramebufferParameteriv(GLuint framebuffer, GLenum pname, GLint* param) { fp_glGetNamedFramebufferParameteriv(framebuffer, pname, param); }\ninline void glGetNamedFramebufferAttachmentParameteriv(GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params) { fp_glGetNamedFramebufferAttachmentParameteriv(framebuffer, attachment, pname, params); }\ninline void glCreateRenderbuffers(GLsizei n, GLuint* renderbuffers) { fp_glCreateRenderbuffers(n, renderbuffers); }\ninline void glNamedRenderbufferStorage(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height) { fp_glNamedRenderbufferStorage(renderbuffer, internalformat, width, height); }\ninline void glNamedRenderbufferStorageMultisample(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { fp_glNamedRenderbufferStorageMultisample(renderbuffer, samples, internalformat, width, height); }\ninline void glGetNamedRenderbufferParameteriv(GLuint renderbuffer, GLenum pname, GLint* params) { fp_glGetNamedRenderbufferParameteriv(renderbuffer, pname, params); }\ninline void glCreateTextures(GLenum target, GLsizei n, GLuint* textures) { fp_glCreateTextures(target, n, textures); }\ninline void glTextureBuffer(GLuint texture, GLenum internalformat, GLuint buffer) { fp_glTextureBuffer(texture, internalformat, buffer); }\ninline void glTextureBufferRange(GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size) { fp_glTextureBufferRange(texture, internalformat, buffer, offset, size); }\ninline void glTextureStorage1D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width) { fp_glTextureStorage1D(texture, levels, internalformat, width); }\ninline void glTextureStorage2D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) { fp_glTextureStorage2D(texture, levels, internalformat, width, height); }\ninline void glTextureStorage3D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) { fp_glTextureStorage3D(texture, levels, internalformat, width, height, depth); }\ninline void glTextureStorage2DMultisample(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations) { fp_glTextureStorage2DMultisample(texture, samples, internalformat, width, height, fixedsamplelocations); }\ninline void glTextureStorage3DMultisample(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) { fp_glTextureStorage3DMultisample(texture, samples, internalformat, width, height, depth, fixedsamplelocations); }\ninline void glTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels) { fp_glTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); }\ninline void glTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) { fp_glTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); }\ninline void glTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels) { fp_glTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); }\ninline void glCompressedTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data) { fp_glCompressedTextureSubImage1D(texture, level, xoffset, width, format, imageSize, data); }\ninline void glCompressedTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data) { fp_glCompressedTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, imageSize, data); }\ninline void glCompressedTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data) { fp_glCompressedTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); }\ninline void glCopyTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) { fp_glCopyTextureSubImage1D(texture, level, xoffset, x, y, width); }\ninline void glCopyTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glCopyTextureSubImage2D(texture, level, xoffset, yoffset, x, y, width, height); }\ninline void glCopyTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glCopyTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, x, y, width, height); }\ninline void glTextureParameterf(GLuint texture, GLenum pname, GLfloat param) { fp_glTextureParameterf(texture, pname, param); }\ninline void glTextureParameterfv(GLuint texture, GLenum pname, const GLfloat* param) { fp_glTextureParameterfv(texture, pname, param); }\ninline void glTextureParameteri(GLuint texture, GLenum pname, GLint param) { fp_glTextureParameteri(texture, pname, param); }\ninline void glTextureParameterIiv(GLuint texture, GLenum pname, const GLint* params) { fp_glTextureParameterIiv(texture, pname, params); }\ninline void glTextureParameterIuiv(GLuint texture, GLenum pname, const GLuint* params) { fp_glTextureParameterIuiv(texture, pname, params); }\ninline void glTextureParameteriv(GLuint texture, GLenum pname, const GLint* param) { fp_glTextureParameteriv(texture, pname, param); }\ninline void glGenerateTextureMipmap(GLuint texture) { fp_glGenerateTextureMipmap(texture); }\ninline void glBindTextureUnit(GLuint unit, GLuint texture) { fp_glBindTextureUnit(unit, texture); }\ninline void glGetTextureImage(GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* pixels) { fp_glGetTextureImage(texture, level, format, type, bufSize, pixels); }\ninline void glGetCompressedTextureImage(GLuint texture, GLint level, GLsizei bufSize, void* pixels) { fp_glGetCompressedTextureImage(texture, level, bufSize, pixels); }\ninline void glGetTextureLevelParameterfv(GLuint texture, GLint level, GLenum pname, GLfloat* params) { fp_glGetTextureLevelParameterfv(texture, level, pname, params); }\ninline void glGetTextureLevelParameteriv(GLuint texture, GLint level, GLenum pname, GLint* params) { fp_glGetTextureLevelParameteriv(texture, level, pname, params); }\ninline void glGetTextureParameterfv(GLuint texture, GLenum pname, GLfloat* params) { fp_glGetTextureParameterfv(texture, pname, params); }\ninline void glGetTextureParameterIiv(GLuint texture, GLenum pname, GLint* params) { fp_glGetTextureParameterIiv(texture, pname, params); }\ninline void glGetTextureParameterIuiv(GLuint texture, GLenum pname, GLuint* params) { fp_glGetTextureParameterIuiv(texture, pname, params); }\ninline void glGetTextureParameteriv(GLuint texture, GLenum pname, GLint* params) { fp_glGetTextureParameteriv(texture, pname, params); }\ninline void glCreateVertexArrays(GLsizei n, GLuint* arrays) { fp_glCreateVertexArrays(n, arrays); }\ninline void glDisableVertexArrayAttrib(GLuint vaobj, GLuint index) { fp_glDisableVertexArrayAttrib(vaobj, index); }\ninline void glEnableVertexArrayAttrib(GLuint vaobj, GLuint index) { fp_glEnableVertexArrayAttrib(vaobj, index); }\ninline void glVertexArrayElementBuffer(GLuint vaobj, GLuint buffer) { fp_glVertexArrayElementBuffer(vaobj, buffer); }\ninline void glVertexArrayVertexBuffer(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride) { fp_glVertexArrayVertexBuffer(vaobj, bindingindex, buffer, offset, stride); }\ninline void glVertexArrayVertexBuffers(GLuint vaobj, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr* offsets, const GLsizei* strides) { fp_glVertexArrayVertexBuffers(vaobj, first, count, buffers, offsets, strides); }\ninline void glVertexArrayAttribBinding(GLuint vaobj, GLuint attribindex, GLuint bindingindex) { fp_glVertexArrayAttribBinding(vaobj, attribindex, bindingindex); }\ninline void glVertexArrayAttribFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset) { fp_glVertexArrayAttribFormat(vaobj, attribindex, size, type, normalized, relativeoffset); }\ninline void glVertexArrayAttribIFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) { fp_glVertexArrayAttribIFormat(vaobj, attribindex, size, type, relativeoffset); }\ninline void glVertexArrayAttribLFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) { fp_glVertexArrayAttribLFormat(vaobj, attribindex, size, type, relativeoffset); }\ninline void glVertexArrayBindingDivisor(GLuint vaobj, GLuint bindingindex, GLuint divisor) { fp_glVertexArrayBindingDivisor(vaobj, bindingindex, divisor); }\ninline void glGetVertexArrayiv(GLuint vaobj, GLenum pname, GLint* param) { fp_glGetVertexArrayiv(vaobj, pname, param); }\ninline void glGetVertexArrayIndexediv(GLuint vaobj, GLuint index, GLenum pname, GLint* param) { fp_glGetVertexArrayIndexediv(vaobj, index, pname, param); }\ninline void glGetVertexArrayIndexed64iv(GLuint vaobj, GLuint index, GLenum pname, GLint64* param) { fp_glGetVertexArrayIndexed64iv(vaobj, index, pname, param); }\ninline void glCreateSamplers(GLsizei n, GLuint* samplers) { fp_glCreateSamplers(n, samplers); }\ninline void glCreateProgramPipelines(GLsizei n, GLuint* pipelines) { fp_glCreateProgramPipelines(n, pipelines); }\ninline void glCreateQueries(GLenum target, GLsizei n, GLuint* ids) { fp_glCreateQueries(target, n, ids); }\ninline void glGetQueryBufferObjecti64v(GLuint id, GLuint buffer, GLenum pname, GLintptr offset) { fp_glGetQueryBufferObjecti64v(id, buffer, pname, offset); }\ninline void glGetQueryBufferObjectiv(GLuint id, GLuint buffer, GLenum pname, GLintptr offset) { fp_glGetQueryBufferObjectiv(id, buffer, pname, offset); }\ninline void glGetQueryBufferObjectui64v(GLuint id, GLuint buffer, GLenum pname, GLintptr offset) { fp_glGetQueryBufferObjectui64v(id, buffer, pname, offset); }\ninline void glGetQueryBufferObjectuiv(GLuint id, GLuint buffer, GLenum pname, GLintptr offset) { fp_glGetQueryBufferObjectuiv(id, buffer, pname, offset); }\ninline void glMemoryBarrierByRegion(GLbitfield barriers) { fp_glMemoryBarrierByRegion(barriers); }\ninline void glGetTextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void* pixels) { fp_glGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bufSize, pixels); }\ninline void glGetCompressedTextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void* pixels) { fp_glGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, bufSize, pixels); }\ninline GLenum glGetGraphicsResetStatus() { return fp_glGetGraphicsResetStatus(); }\ninline void glGetnCompressedTexImage(GLenum target, GLint lod, GLsizei bufSize, void* pixels) { fp_glGetnCompressedTexImage(target, lod, bufSize, pixels); }\ninline void glGetnTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* pixels) { fp_glGetnTexImage(target, level, format, type, bufSize, pixels); }\ninline void glGetnUniformdv(GLuint program, GLint location, GLsizei bufSize, GLdouble* params) { fp_glGetnUniformdv(program, location, bufSize, params); }\ninline void glGetnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat* params) { fp_glGetnUniformfv(program, location, bufSize, params); }\ninline void glGetnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint* params) { fp_glGetnUniformiv(program, location, bufSize, params); }\ninline void glGetnUniformuiv(GLuint program, GLint location, GLsizei bufSize, GLuint* params) { fp_glGetnUniformuiv(program, location, bufSize, params); }\ninline void glReadnPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data) { fp_glReadnPixels(x, y, width, height, format, type, bufSize, data); }\ninline void glGetnMapdv(GLenum target, GLenum query, GLsizei bufSize, GLdouble* v) { fp_glGetnMapdv(target, query, bufSize, v); }\ninline void glGetnMapfv(GLenum target, GLenum query, GLsizei bufSize, GLfloat* v) { fp_glGetnMapfv(target, query, bufSize, v); }\ninline void glGetnMapiv(GLenum target, GLenum query, GLsizei bufSize, GLint* v) { fp_glGetnMapiv(target, query, bufSize, v); }\ninline void glGetnPixelMapfv(GLenum map, GLsizei bufSize, GLfloat* values) { fp_glGetnPixelMapfv(map, bufSize, values); }\ninline void glGetnPixelMapuiv(GLenum map, GLsizei bufSize, GLuint* values) { fp_glGetnPixelMapuiv(map, bufSize, values); }\ninline void glGetnPixelMapusv(GLenum map, GLsizei bufSize, GLushort* values) { fp_glGetnPixelMapusv(map, bufSize, values); }\ninline void glGetnPolygonStipple(GLsizei bufSize, GLubyte* pattern) { fp_glGetnPolygonStipple(bufSize, pattern); }\ninline void glGetnColorTable(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* table) { fp_glGetnColorTable(target, format, type, bufSize, table); }\ninline void glGetnConvolutionFilter(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* image) { fp_glGetnConvolutionFilter(target, format, type, bufSize, image); }\ninline void glGetnSeparableFilter(GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void* row, GLsizei columnBufSize, void* column, void* span) { fp_glGetnSeparableFilter(target, format, type, rowBufSize, row, columnBufSize, column, span); }\ninline void glGetnHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values) { fp_glGetnHistogram(target, reset, format, type, bufSize, values); }\ninline void glGetnMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values) { fp_glGetnMinmax(target, reset, format, type, bufSize, values); }\ninline void glTextureBarrier() { fp_glTextureBarrier(); }\n\n/* GL_ES_VERSION_3_2 */\ninline void glBlendBarrier() { fp_glBlendBarrier(); }\ninline void glPrimitiveBoundingBox(GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW) { fp_glPrimitiveBoundingBox(minX, minY, minZ, minW, maxX, maxY, maxZ, maxW); }\n\n/* GL_KHR_blend_equation_advanced */\ninline void glBlendBarrierKHR() { fp_glBlendBarrierKHR(); }\n\n/* GL_KHR_debug */\ninline void glDebugMessageControlKHR(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled) { fp_glDebugMessageControlKHR(source, type, severity, count, ids, enabled); }\ninline void glDebugMessageInsertKHR(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf) { fp_glDebugMessageInsertKHR(source, type, id, severity, length, buf); }\ninline void glDebugMessageCallbackKHR(GLDEBUGPROCKHR callback, const void* userParam) { fp_glDebugMessageCallbackKHR(callback, userParam); }\ninline GLuint glGetDebugMessageLogKHR(GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog) { return fp_glGetDebugMessageLogKHR(count, bufSize, sources, types, ids, severities, lengths, messageLog); }\ninline void glPushDebugGroupKHR(GLenum source, GLuint id, GLsizei length, const GLchar* message) { fp_glPushDebugGroupKHR(source, id, length, message); }\ninline void glPopDebugGroupKHR() { fp_glPopDebugGroupKHR(); }\ninline void glObjectLabelKHR(GLenum identifier, GLuint name, GLsizei length, const GLchar* label) { fp_glObjectLabelKHR(identifier, name, length, label); }\ninline void glGetObjectLabelKHR(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei* length, GLchar* label) { fp_glGetObjectLabelKHR(identifier, name, bufSize, length, label); }\ninline void glObjectPtrLabelKHR(const void* ptr, GLsizei length, const GLchar* label) { fp_glObjectPtrLabelKHR(ptr, length, label); }\ninline void glGetObjectPtrLabelKHR(const void* ptr, GLsizei bufSize, GLsizei* length, GLchar* label) { fp_glGetObjectPtrLabelKHR(ptr, bufSize, length, label); }\ninline void glGetPointervKHR(GLenum pname, void** params) { fp_glGetPointervKHR(pname, params); }\n\n/* GL_KHR_robustness */\ninline GLenum glGetGraphicsResetStatusKHR() { return fp_glGetGraphicsResetStatusKHR(); }\ninline void glReadnPixelsKHR(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data) { fp_glReadnPixelsKHR(x, y, width, height, format, type, bufSize, data); }\ninline void glGetnUniformfvKHR(GLuint program, GLint location, GLsizei bufSize, GLfloat* params) { fp_glGetnUniformfvKHR(program, location, bufSize, params); }\ninline void glGetnUniformivKHR(GLuint program, GLint location, GLsizei bufSize, GLint* params) { fp_glGetnUniformivKHR(program, location, bufSize, params); }\ninline void glGetnUniformuivKHR(GLuint program, GLint location, GLsizei bufSize, GLuint* params) { fp_glGetnUniformuivKHR(program, location, bufSize, params); }\n\n/* GL_ARB_bindless_texture */\ninline GLuint64 glGetTextureHandleARB(GLuint texture) { return fp_glGetTextureHandleARB(texture); }\ninline GLuint64 glGetTextureSamplerHandleARB(GLuint texture, GLuint sampler) { return fp_glGetTextureSamplerHandleARB(texture, sampler); }\ninline void glMakeTextureHandleResidentARB(GLuint64 handle) { fp_glMakeTextureHandleResidentARB(handle); }\ninline void glMakeTextureHandleNonResidentARB(GLuint64 handle) { fp_glMakeTextureHandleNonResidentARB(handle); }\ninline GLuint64 glGetImageHandleARB(GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format) { return fp_glGetImageHandleARB(texture, level, layered, layer, format); }\ninline void glMakeImageHandleResidentARB(GLuint64 handle, GLenum access) { fp_glMakeImageHandleResidentARB(handle, access); }\ninline void glMakeImageHandleNonResidentARB(GLuint64 handle) { fp_glMakeImageHandleNonResidentARB(handle); }\ninline void glUniformHandleui64ARB(GLint location, GLuint64 value) { fp_glUniformHandleui64ARB(location, value); }\ninline void glUniformHandleui64vARB(GLint location, GLsizei count, const GLuint64* value) { fp_glUniformHandleui64vARB(location, count, value); }\ninline void glProgramUniformHandleui64ARB(GLuint program, GLint location, GLuint64 value) { fp_glProgramUniformHandleui64ARB(program, location, value); }\ninline void glProgramUniformHandleui64vARB(GLuint program, GLint location, GLsizei count, const GLuint64* values) { fp_glProgramUniformHandleui64vARB(program, location, count, values); }\ninline GLboolean glIsTextureHandleResidentARB(GLuint64 handle) { return fp_glIsTextureHandleResidentARB(handle); }\ninline GLboolean glIsImageHandleResidentARB(GLuint64 handle) { return fp_glIsImageHandleResidentARB(handle); }\ninline void glVertexAttribL1ui64ARB(GLuint index, GLuint64EXT x) { fp_glVertexAttribL1ui64ARB(index, x); }\ninline void glVertexAttribL1ui64vARB(GLuint index, const GLuint64EXT* v) { fp_glVertexAttribL1ui64vARB(index, v); }\ninline void glGetVertexAttribLui64vARB(GLuint index, GLenum pname, GLuint64EXT* params) { fp_glGetVertexAttribLui64vARB(index, pname, params); }\n\n/* GL_ARB_cl_event */\ninline GLsync glCreateSyncFromCLeventARB(struct _cl_context* context, struct _cl_event* event, GLbitfield flags) { return fp_glCreateSyncFromCLeventARB(context, event, flags); }\n\n/* GL_ARB_color_buffer_float */\ninline void glClampColorARB(GLenum target, GLenum clamp) { fp_glClampColorARB(target, clamp); }\n\n/* GL_ARB_compute_variable_group_size */\ninline void glDispatchComputeGroupSizeARB(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z) { fp_glDispatchComputeGroupSizeARB(num_groups_x, num_groups_y, num_groups_z, group_size_x, group_size_y, group_size_z); }\n\n/* GL_ARB_debug_output */\ninline void glDebugMessageControlARB(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled) { fp_glDebugMessageControlARB(source, type, severity, count, ids, enabled); }\ninline void glDebugMessageInsertARB(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf) { fp_glDebugMessageInsertARB(source, type, id, severity, length, buf); }\ninline void glDebugMessageCallbackARB(GLDEBUGPROCARB callback, const void* userParam) { fp_glDebugMessageCallbackARB(callback, userParam); }\ninline GLuint glGetDebugMessageLogARB(GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog) { return fp_glGetDebugMessageLogARB(count, bufSize, sources, types, ids, severities, lengths, messageLog); }\n\n/* GL_ARB_draw_buffers_blend */\ninline void glBlendEquationiARB(GLuint buf, GLenum mode) { fp_glBlendEquationiARB(buf, mode); }\ninline void glBlendEquationSeparateiARB(GLuint buf, GLenum modeRGB, GLenum modeAlpha) { fp_glBlendEquationSeparateiARB(buf, modeRGB, modeAlpha); }\ninline void glBlendFunciARB(GLuint buf, GLenum src, GLenum dst) { fp_glBlendFunciARB(buf, src, dst); }\ninline void glBlendFuncSeparateiARB(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { fp_glBlendFuncSeparateiARB(buf, srcRGB, dstRGB, srcAlpha, dstAlpha); }\n\n/* GL_ARB_draw_instanced */\ninline void glDrawArraysInstancedARB(GLenum mode, GLint first, GLsizei count, GLsizei primcount) { fp_glDrawArraysInstancedARB(mode, first, count, primcount); }\ninline void glDrawElementsInstancedARB(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount) { fp_glDrawElementsInstancedARB(mode, count, type, indices, primcount); }\n\n/* GL_ARB_ES3_2_compatibility */\ninline void glPrimitiveBoundingBoxARB(GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW) { fp_glPrimitiveBoundingBoxARB(minX, minY, minZ, minW, maxX, maxY, maxZ, maxW); }\n\n/* GL_ARB_geometry_shader4 */\ninline void glProgramParameteriARB(GLuint program, GLenum pname, GLint value) { fp_glProgramParameteriARB(program, pname, value); }\ninline void glFramebufferTextureARB(GLenum target, GLenum attachment, GLuint texture, GLint level) { fp_glFramebufferTextureARB(target, attachment, texture, level); }\ninline void glFramebufferTextureLayerARB(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) { fp_glFramebufferTextureLayerARB(target, attachment, texture, level, layer); }\ninline void glFramebufferTextureFaceARB(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face) { fp_glFramebufferTextureFaceARB(target, attachment, texture, level, face); }\n\n/* GL_ARB_gpu_shader_int64 */\ninline void glUniform1i64ARB(GLint location, GLint64 x) { fp_glUniform1i64ARB(location, x); }\ninline void glUniform2i64ARB(GLint location, GLint64 x, GLint64 y) { fp_glUniform2i64ARB(location, x, y); }\ninline void glUniform3i64ARB(GLint location, GLint64 x, GLint64 y, GLint64 z) { fp_glUniform3i64ARB(location, x, y, z); }\ninline void glUniform4i64ARB(GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w) { fp_glUniform4i64ARB(location, x, y, z, w); }\ninline void glUniform1i64vARB(GLint location, GLsizei count, const GLint64* value) { fp_glUniform1i64vARB(location, count, value); }\ninline void glUniform2i64vARB(GLint location, GLsizei count, const GLint64* value) { fp_glUniform2i64vARB(location, count, value); }\ninline void glUniform3i64vARB(GLint location, GLsizei count, const GLint64* value) { fp_glUniform3i64vARB(location, count, value); }\ninline void glUniform4i64vARB(GLint location, GLsizei count, const GLint64* value) { fp_glUniform4i64vARB(location, count, value); }\ninline void glUniform1ui64ARB(GLint location, GLuint64 x) { fp_glUniform1ui64ARB(location, x); }\ninline void glUniform2ui64ARB(GLint location, GLuint64 x, GLuint64 y) { fp_glUniform2ui64ARB(location, x, y); }\ninline void glUniform3ui64ARB(GLint location, GLuint64 x, GLuint64 y, GLuint64 z) { fp_glUniform3ui64ARB(location, x, y, z); }\ninline void glUniform4ui64ARB(GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w) { fp_glUniform4ui64ARB(location, x, y, z, w); }\ninline void glUniform1ui64vARB(GLint location, GLsizei count, const GLuint64* value) { fp_glUniform1ui64vARB(location, count, value); }\ninline void glUniform2ui64vARB(GLint location, GLsizei count, const GLuint64* value) { fp_glUniform2ui64vARB(location, count, value); }\ninline void glUniform3ui64vARB(GLint location, GLsizei count, const GLuint64* value) { fp_glUniform3ui64vARB(location, count, value); }\ninline void glUniform4ui64vARB(GLint location, GLsizei count, const GLuint64* value) { fp_glUniform4ui64vARB(location, count, value); }\ninline void glGetUniformi64vARB(GLuint program, GLint location, GLint64* params) { fp_glGetUniformi64vARB(program, location, params); }\ninline void glGetUniformui64vARB(GLuint program, GLint location, GLuint64* params) { fp_glGetUniformui64vARB(program, location, params); }\ninline void glGetnUniformi64vARB(GLuint program, GLint location, GLsizei bufSize, GLint64* params) { fp_glGetnUniformi64vARB(program, location, bufSize, params); }\ninline void glGetnUniformui64vARB(GLuint program, GLint location, GLsizei bufSize, GLuint64* params) { fp_glGetnUniformui64vARB(program, location, bufSize, params); }\ninline void glProgramUniform1i64ARB(GLuint program, GLint location, GLint64 x) { fp_glProgramUniform1i64ARB(program, location, x); }\ninline void glProgramUniform2i64ARB(GLuint program, GLint location, GLint64 x, GLint64 y) { fp_glProgramUniform2i64ARB(program, location, x, y); }\ninline void glProgramUniform3i64ARB(GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z) { fp_glProgramUniform3i64ARB(program, location, x, y, z); }\ninline void glProgramUniform4i64ARB(GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w) { fp_glProgramUniform4i64ARB(program, location, x, y, z, w); }\ninline void glProgramUniform1i64vARB(GLuint program, GLint location, GLsizei count, const GLint64* value) { fp_glProgramUniform1i64vARB(program, location, count, value); }\ninline void glProgramUniform2i64vARB(GLuint program, GLint location, GLsizei count, const GLint64* value) { fp_glProgramUniform2i64vARB(program, location, count, value); }\ninline void glProgramUniform3i64vARB(GLuint program, GLint location, GLsizei count, const GLint64* value) { fp_glProgramUniform3i64vARB(program, location, count, value); }\ninline void glProgramUniform4i64vARB(GLuint program, GLint location, GLsizei count, const GLint64* value) { fp_glProgramUniform4i64vARB(program, location, count, value); }\ninline void glProgramUniform1ui64ARB(GLuint program, GLint location, GLuint64 x) { fp_glProgramUniform1ui64ARB(program, location, x); }\ninline void glProgramUniform2ui64ARB(GLuint program, GLint location, GLuint64 x, GLuint64 y) { fp_glProgramUniform2ui64ARB(program, location, x, y); }\ninline void glProgramUniform3ui64ARB(GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z) { fp_glProgramUniform3ui64ARB(program, location, x, y, z); }\ninline void glProgramUniform4ui64ARB(GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w) { fp_glProgramUniform4ui64ARB(program, location, x, y, z, w); }\ninline void glProgramUniform1ui64vARB(GLuint program, GLint location, GLsizei count, const GLuint64* value) { fp_glProgramUniform1ui64vARB(program, location, count, value); }\ninline void glProgramUniform2ui64vARB(GLuint program, GLint location, GLsizei count, const GLuint64* value) { fp_glProgramUniform2ui64vARB(program, location, count, value); }\ninline void glProgramUniform3ui64vARB(GLuint program, GLint location, GLsizei count, const GLuint64* value) { fp_glProgramUniform3ui64vARB(program, location, count, value); }\ninline void glProgramUniform4ui64vARB(GLuint program, GLint location, GLsizei count, const GLuint64* value) { fp_glProgramUniform4ui64vARB(program, location, count, value); }\n\n/* GL_ARB_indirect_parameters */\ninline void glMultiDrawArraysIndirectCountARB(GLenum mode, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride) { fp_glMultiDrawArraysIndirectCountARB(mode, indirect, drawcount, maxdrawcount, stride); }\ninline void glMultiDrawElementsIndirectCountARB(GLenum mode, GLenum type, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride) { fp_glMultiDrawElementsIndirectCountARB(mode, type, indirect, drawcount, maxdrawcount, stride); }\n\n/* GL_ARB_instanced_arrays */\ninline void glVertexAttribDivisorARB(GLuint index, GLuint divisor) { fp_glVertexAttribDivisorARB(index, divisor); }\n\n/* GL_ARB_parallel_shader_compile */\ninline void glMaxShaderCompilerThreadsARB(GLuint count) { fp_glMaxShaderCompilerThreadsARB(count); }\n\n/* GL_ARB_robustness */\ninline GLenum glGetGraphicsResetStatusARB() { return fp_glGetGraphicsResetStatusARB(); }\ninline void glGetnTexImageARB(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* img) { fp_glGetnTexImageARB(target, level, format, type, bufSize, img); }\ninline void glReadnPixelsARB(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data) { fp_glReadnPixelsARB(x, y, width, height, format, type, bufSize, data); }\ninline void glGetnCompressedTexImageARB(GLenum target, GLint lod, GLsizei bufSize, void* img) { fp_glGetnCompressedTexImageARB(target, lod, bufSize, img); }\ninline void glGetnUniformfvARB(GLuint program, GLint location, GLsizei bufSize, GLfloat* params) { fp_glGetnUniformfvARB(program, location, bufSize, params); }\ninline void glGetnUniformivARB(GLuint program, GLint location, GLsizei bufSize, GLint* params) { fp_glGetnUniformivARB(program, location, bufSize, params); }\ninline void glGetnUniformuivARB(GLuint program, GLint location, GLsizei bufSize, GLuint* params) { fp_glGetnUniformuivARB(program, location, bufSize, params); }\ninline void glGetnUniformdvARB(GLuint program, GLint location, GLsizei bufSize, GLdouble* params) { fp_glGetnUniformdvARB(program, location, bufSize, params); }\ninline void glGetnMapdvARB(GLenum target, GLenum query, GLsizei bufSize, GLdouble* v) { fp_glGetnMapdvARB(target, query, bufSize, v); }\ninline void glGetnMapfvARB(GLenum target, GLenum query, GLsizei bufSize, GLfloat* v) { fp_glGetnMapfvARB(target, query, bufSize, v); }\ninline void glGetnMapivARB(GLenum target, GLenum query, GLsizei bufSize, GLint* v) { fp_glGetnMapivARB(target, query, bufSize, v); }\ninline void glGetnPixelMapfvARB(GLenum map, GLsizei bufSize, GLfloat* values) { fp_glGetnPixelMapfvARB(map, bufSize, values); }\ninline void glGetnPixelMapuivARB(GLenum map, GLsizei bufSize, GLuint* values) { fp_glGetnPixelMapuivARB(map, bufSize, values); }\ninline void glGetnPixelMapusvARB(GLenum map, GLsizei bufSize, GLushort* values) { fp_glGetnPixelMapusvARB(map, bufSize, values); }\ninline void glGetnPolygonStippleARB(GLsizei bufSize, GLubyte* pattern) { fp_glGetnPolygonStippleARB(bufSize, pattern); }\ninline void glGetnColorTableARB(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* table) { fp_glGetnColorTableARB(target, format, type, bufSize, table); }\ninline void glGetnConvolutionFilterARB(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* image) { fp_glGetnConvolutionFilterARB(target, format, type, bufSize, image); }\ninline void glGetnSeparableFilterARB(GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void* row, GLsizei columnBufSize, void* column, void* span) { fp_glGetnSeparableFilterARB(target, format, type, rowBufSize, row, columnBufSize, column, span); }\ninline void glGetnHistogramARB(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values) { fp_glGetnHistogramARB(target, reset, format, type, bufSize, values); }\ninline void glGetnMinmaxARB(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values) { fp_glGetnMinmaxARB(target, reset, format, type, bufSize, values); }\n\n/* GL_ARB_sample_locations */\ninline void glFramebufferSampleLocationsfvARB(GLenum target, GLuint start, GLsizei count, const GLfloat* v) { fp_glFramebufferSampleLocationsfvARB(target, start, count, v); }\ninline void glNamedFramebufferSampleLocationsfvARB(GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v) { fp_glNamedFramebufferSampleLocationsfvARB(framebuffer, start, count, v); }\ninline void glEvaluateDepthValuesARB() { fp_glEvaluateDepthValuesARB(); }\n\n/* GL_ARB_sample_shading */\ninline void glMinSampleShadingARB(GLfloat value) { fp_glMinSampleShadingARB(value); }\n\n/* GL_ARB_shading_language_include */\ninline void glNamedStringARB(GLenum type, GLint namelen, const GLchar* name, GLint stringlen, const GLchar* string) { fp_glNamedStringARB(type, namelen, name, stringlen, string); }\ninline void glDeleteNamedStringARB(GLint namelen, const GLchar* name) { fp_glDeleteNamedStringARB(namelen, name); }\ninline void glCompileShaderIncludeARB(GLuint shader, GLsizei count, const GLchar** path, const GLint* length) { fp_glCompileShaderIncludeARB(shader, count, path, length); }\ninline GLboolean glIsNamedStringARB(GLint namelen, const GLchar* name) { return fp_glIsNamedStringARB(namelen, name); }\ninline void glGetNamedStringARB(GLint namelen, const GLchar* name, GLsizei bufSize, GLint* stringlen, GLchar* string) { fp_glGetNamedStringARB(namelen, name, bufSize, stringlen, string); }\ninline void glGetNamedStringivARB(GLint namelen, const GLchar* name, GLenum pname, GLint* params) { fp_glGetNamedStringivARB(namelen, name, pname, params); }\n\n/* GL_ARB_sparse_buffer */\ninline void glBufferPageCommitmentARB(GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit) { fp_glBufferPageCommitmentARB(target, offset, size, commit); }\ninline void glNamedBufferPageCommitmentEXT(GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit) { fp_glNamedBufferPageCommitmentEXT(buffer, offset, size, commit); }\ninline void glNamedBufferPageCommitmentARB(GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit) { fp_glNamedBufferPageCommitmentARB(buffer, offset, size, commit); }\n\n/* GL_ARB_sparse_texture */\ninline void glTexPageCommitmentARB(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit) { fp_glTexPageCommitmentARB(target, level, xoffset, yoffset, zoffset, width, height, depth, commit); }\n\n/* GL_ARB_texture_buffer_object */\ninline void glTexBufferARB(GLenum target, GLenum internalformat, GLuint buffer) { fp_glTexBufferARB(target, internalformat, buffer); }\n\n/* GL_EXT_base_instance */\ninline void glDrawArraysInstancedBaseInstanceEXT(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance) { fp_glDrawArraysInstancedBaseInstanceEXT(mode, first, count, instancecount, baseinstance); }\ninline void glDrawElementsInstancedBaseInstanceEXT(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount, GLuint baseinstance) { fp_glDrawElementsInstancedBaseInstanceEXT(mode, count, type, indices, instancecount, baseinstance); }\ninline void glDrawElementsInstancedBaseVertexBaseInstanceEXT(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance) { fp_glDrawElementsInstancedBaseVertexBaseInstanceEXT(mode, count, type, indices, instancecount, basevertex, baseinstance); }\n\n/* GL_EXT_bindable_uniform */\ninline void glUniformBufferEXT(GLuint program, GLint location, GLuint buffer) { fp_glUniformBufferEXT(program, location, buffer); }\ninline GLint glGetUniformBufferSizeEXT(GLuint program, GLint location) { return fp_glGetUniformBufferSizeEXT(program, location); }\ninline GLintptr glGetUniformOffsetEXT(GLuint program, GLint location) { return fp_glGetUniformOffsetEXT(program, location); }\n\n/* GL_EXT_blend_func_extended */\ninline void glBindFragDataLocationIndexedEXT(GLuint program, GLuint colorNumber, GLuint index, const GLchar* name) { fp_glBindFragDataLocationIndexedEXT(program, colorNumber, index, name); }\ninline void glBindFragDataLocationEXT(GLuint program, GLuint color, const GLchar* name) { fp_glBindFragDataLocationEXT(program, color, name); }\ninline GLint glGetProgramResourceLocationIndexEXT(GLuint program, GLenum programInterface, const GLchar* name) { return fp_glGetProgramResourceLocationIndexEXT(program, programInterface, name); }\ninline GLint glGetFragDataIndexEXT(GLuint program, const GLchar* name) { return fp_glGetFragDataIndexEXT(program, name); }\n\n/* GL_EXT_blend_minmax */\ninline void glBlendEquationEXT(GLenum mode) { fp_glBlendEquationEXT(mode); }\n\n/* GL_EXT_buffer_storage */\ninline void glBufferStorageEXT(GLenum target, GLsizeiptr size, const void* data, GLbitfield flags) { fp_glBufferStorageEXT(target, size, data, flags); }\n\n/* GL_EXT_copy_image */\ninline void glCopyImageSubDataEXT(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth) { fp_glCopyImageSubDataEXT(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth); }\n\n/* GL_EXT_debug_label */\ninline void glLabelObjectEXT(GLenum type, GLuint object, GLsizei length, const GLchar* label) { fp_glLabelObjectEXT(type, object, length, label); }\ninline void glGetObjectLabelEXT(GLenum type, GLuint object, GLsizei bufSize, GLsizei* length, GLchar* label) { fp_glGetObjectLabelEXT(type, object, bufSize, length, label); }\n\n/* GL_EXT_debug_marker */\ninline void glInsertEventMarkerEXT(GLsizei length, const GLchar* marker) { fp_glInsertEventMarkerEXT(length, marker); }\ninline void glPushGroupMarkerEXT(GLsizei length, const GLchar* marker) { fp_glPushGroupMarkerEXT(length, marker); }\ninline void glPopGroupMarkerEXT() { fp_glPopGroupMarkerEXT(); }\n\n/* GL_EXT_direct_state_access */\ninline void glMatrixLoadfEXT(GLenum mode, const GLfloat* m) { fp_glMatrixLoadfEXT(mode, m); }\ninline void glMatrixLoaddEXT(GLenum mode, const GLdouble* m) { fp_glMatrixLoaddEXT(mode, m); }\ninline void glMatrixMultfEXT(GLenum mode, const GLfloat* m) { fp_glMatrixMultfEXT(mode, m); }\ninline void glMatrixMultdEXT(GLenum mode, const GLdouble* m) { fp_glMatrixMultdEXT(mode, m); }\ninline void glMatrixLoadIdentityEXT(GLenum mode) { fp_glMatrixLoadIdentityEXT(mode); }\ninline void glMatrixRotatefEXT(GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z) { fp_glMatrixRotatefEXT(mode, angle, x, y, z); }\ninline void glMatrixRotatedEXT(GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z) { fp_glMatrixRotatedEXT(mode, angle, x, y, z); }\ninline void glMatrixScalefEXT(GLenum mode, GLfloat x, GLfloat y, GLfloat z) { fp_glMatrixScalefEXT(mode, x, y, z); }\ninline void glMatrixScaledEXT(GLenum mode, GLdouble x, GLdouble y, GLdouble z) { fp_glMatrixScaledEXT(mode, x, y, z); }\ninline void glMatrixTranslatefEXT(GLenum mode, GLfloat x, GLfloat y, GLfloat z) { fp_glMatrixTranslatefEXT(mode, x, y, z); }\ninline void glMatrixTranslatedEXT(GLenum mode, GLdouble x, GLdouble y, GLdouble z) { fp_glMatrixTranslatedEXT(mode, x, y, z); }\ninline void glMatrixFrustumEXT(GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) { fp_glMatrixFrustumEXT(mode, left, right, bottom, top, zNear, zFar); }\ninline void glMatrixOrthoEXT(GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) { fp_glMatrixOrthoEXT(mode, left, right, bottom, top, zNear, zFar); }\ninline void glMatrixPopEXT(GLenum mode) { fp_glMatrixPopEXT(mode); }\ninline void glMatrixPushEXT(GLenum mode) { fp_glMatrixPushEXT(mode); }\ninline void glClientAttribDefaultEXT(GLbitfield mask) { fp_glClientAttribDefaultEXT(mask); }\ninline void glPushClientAttribDefaultEXT(GLbitfield mask) { fp_glPushClientAttribDefaultEXT(mask); }\ninline void glTextureParameterfEXT(GLuint texture, GLenum target, GLenum pname, GLfloat param) { fp_glTextureParameterfEXT(texture, target, pname, param); }\ninline void glTextureParameterfvEXT(GLuint texture, GLenum target, GLenum pname, const GLfloat* params) { fp_glTextureParameterfvEXT(texture, target, pname, params); }\ninline void glTextureParameteriEXT(GLuint texture, GLenum target, GLenum pname, GLint param) { fp_glTextureParameteriEXT(texture, target, pname, param); }\ninline void glTextureParameterivEXT(GLuint texture, GLenum target, GLenum pname, const GLint* params) { fp_glTextureParameterivEXT(texture, target, pname, params); }\ninline void glTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void* pixels) { fp_glTextureImage1DEXT(texture, target, level, internalformat, width, border, format, type, pixels); }\ninline void glTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels) { fp_glTextureImage2DEXT(texture, target, level, internalformat, width, height, border, format, type, pixels); }\ninline void glTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels) { fp_glTextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, pixels); }\ninline void glTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) { fp_glTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, pixels); }\ninline void glCopyTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) { fp_glCopyTextureImage1DEXT(texture, target, level, internalformat, x, y, width, border); }\ninline void glCopyTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) { fp_glCopyTextureImage2DEXT(texture, target, level, internalformat, x, y, width, height, border); }\ninline void glCopyTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) { fp_glCopyTextureSubImage1DEXT(texture, target, level, xoffset, x, y, width); }\ninline void glCopyTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glCopyTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, x, y, width, height); }\ninline void glGetTextureImageEXT(GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void* pixels) { fp_glGetTextureImageEXT(texture, target, level, format, type, pixels); }\ninline void glGetTextureParameterfvEXT(GLuint texture, GLenum target, GLenum pname, GLfloat* params) { fp_glGetTextureParameterfvEXT(texture, target, pname, params); }\ninline void glGetTextureParameterivEXT(GLuint texture, GLenum target, GLenum pname, GLint* params) { fp_glGetTextureParameterivEXT(texture, target, pname, params); }\ninline void glGetTextureLevelParameterfvEXT(GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat* params) { fp_glGetTextureLevelParameterfvEXT(texture, target, level, pname, params); }\ninline void glGetTextureLevelParameterivEXT(GLuint texture, GLenum target, GLint level, GLenum pname, GLint* params) { fp_glGetTextureLevelParameterivEXT(texture, target, level, pname, params); }\ninline void glTextureImage3DEXT(GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels) { fp_glTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, format, type, pixels); }\ninline void glTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels) { fp_glTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); }\ninline void glCopyTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glCopyTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, x, y, width, height); }\ninline void glBindMultiTextureEXT(GLenum texunit, GLenum target, GLuint texture) { fp_glBindMultiTextureEXT(texunit, target, texture); }\ninline void glMultiTexCoordPointerEXT(GLenum texunit, GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glMultiTexCoordPointerEXT(texunit, size, type, stride, pointer); }\ninline void glMultiTexEnvfEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat param) { fp_glMultiTexEnvfEXT(texunit, target, pname, param); }\ninline void glMultiTexEnvfvEXT(GLenum texunit, GLenum target, GLenum pname, const GLfloat* params) { fp_glMultiTexEnvfvEXT(texunit, target, pname, params); }\ninline void glMultiTexEnviEXT(GLenum texunit, GLenum target, GLenum pname, GLint param) { fp_glMultiTexEnviEXT(texunit, target, pname, param); }\ninline void glMultiTexEnvivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint* params) { fp_glMultiTexEnvivEXT(texunit, target, pname, params); }\ninline void glMultiTexGendEXT(GLenum texunit, GLenum coord, GLenum pname, GLdouble param) { fp_glMultiTexGendEXT(texunit, coord, pname, param); }\ninline void glMultiTexGendvEXT(GLenum texunit, GLenum coord, GLenum pname, const GLdouble* params) { fp_glMultiTexGendvEXT(texunit, coord, pname, params); }\ninline void glMultiTexGenfEXT(GLenum texunit, GLenum coord, GLenum pname, GLfloat param) { fp_glMultiTexGenfEXT(texunit, coord, pname, param); }\ninline void glMultiTexGenfvEXT(GLenum texunit, GLenum coord, GLenum pname, const GLfloat* params) { fp_glMultiTexGenfvEXT(texunit, coord, pname, params); }\ninline void glMultiTexGeniEXT(GLenum texunit, GLenum coord, GLenum pname, GLint param) { fp_glMultiTexGeniEXT(texunit, coord, pname, param); }\ninline void glMultiTexGenivEXT(GLenum texunit, GLenum coord, GLenum pname, const GLint* params) { fp_glMultiTexGenivEXT(texunit, coord, pname, params); }\ninline void glGetMultiTexEnvfvEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat* params) { fp_glGetMultiTexEnvfvEXT(texunit, target, pname, params); }\ninline void glGetMultiTexEnvivEXT(GLenum texunit, GLenum target, GLenum pname, GLint* params) { fp_glGetMultiTexEnvivEXT(texunit, target, pname, params); }\ninline void glGetMultiTexGendvEXT(GLenum texunit, GLenum coord, GLenum pname, GLdouble* params) { fp_glGetMultiTexGendvEXT(texunit, coord, pname, params); }\ninline void glGetMultiTexGenfvEXT(GLenum texunit, GLenum coord, GLenum pname, GLfloat* params) { fp_glGetMultiTexGenfvEXT(texunit, coord, pname, params); }\ninline void glGetMultiTexGenivEXT(GLenum texunit, GLenum coord, GLenum pname, GLint* params) { fp_glGetMultiTexGenivEXT(texunit, coord, pname, params); }\ninline void glMultiTexParameteriEXT(GLenum texunit, GLenum target, GLenum pname, GLint param) { fp_glMultiTexParameteriEXT(texunit, target, pname, param); }\ninline void glMultiTexParameterivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint* params) { fp_glMultiTexParameterivEXT(texunit, target, pname, params); }\ninline void glMultiTexParameterfEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat param) { fp_glMultiTexParameterfEXT(texunit, target, pname, param); }\ninline void glMultiTexParameterfvEXT(GLenum texunit, GLenum target, GLenum pname, const GLfloat* params) { fp_glMultiTexParameterfvEXT(texunit, target, pname, params); }\ninline void glMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void* pixels) { fp_glMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, format, type, pixels); }\ninline void glMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels) { fp_glMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, format, type, pixels); }\ninline void glMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels) { fp_glMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, type, pixels); }\ninline void glMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) { fp_glMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, type, pixels); }\ninline void glCopyMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) { fp_glCopyMultiTexImage1DEXT(texunit, target, level, internalformat, x, y, width, border); }\ninline void glCopyMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) { fp_glCopyMultiTexImage2DEXT(texunit, target, level, internalformat, x, y, width, height, border); }\ninline void glCopyMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) { fp_glCopyMultiTexSubImage1DEXT(texunit, target, level, xoffset, x, y, width); }\ninline void glCopyMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glCopyMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, x, y, width, height); }\ninline void glGetMultiTexImageEXT(GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void* pixels) { fp_glGetMultiTexImageEXT(texunit, target, level, format, type, pixels); }\ninline void glGetMultiTexParameterfvEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat* params) { fp_glGetMultiTexParameterfvEXT(texunit, target, pname, params); }\ninline void glGetMultiTexParameterivEXT(GLenum texunit, GLenum target, GLenum pname, GLint* params) { fp_glGetMultiTexParameterivEXT(texunit, target, pname, params); }\ninline void glGetMultiTexLevelParameterfvEXT(GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat* params) { fp_glGetMultiTexLevelParameterfvEXT(texunit, target, level, pname, params); }\ninline void glGetMultiTexLevelParameterivEXT(GLenum texunit, GLenum target, GLint level, GLenum pname, GLint* params) { fp_glGetMultiTexLevelParameterivEXT(texunit, target, level, pname, params); }\ninline void glMultiTexImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels) { fp_glMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, format, type, pixels); }\ninline void glMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels) { fp_glMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); }\ninline void glCopyMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glCopyMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, x, y, width, height); }\ninline void glEnableClientStateIndexedEXT(GLenum array, GLuint index) { fp_glEnableClientStateIndexedEXT(array, index); }\ninline void glDisableClientStateIndexedEXT(GLenum array, GLuint index) { fp_glDisableClientStateIndexedEXT(array, index); }\ninline void glGetFloatIndexedvEXT(GLenum target, GLuint index, GLfloat* data) { fp_glGetFloatIndexedvEXT(target, index, data); }\ninline void glGetDoubleIndexedvEXT(GLenum target, GLuint index, GLdouble* data) { fp_glGetDoubleIndexedvEXT(target, index, data); }\ninline void glGetPointerIndexedvEXT(GLenum target, GLuint index, void** data) { fp_glGetPointerIndexedvEXT(target, index, data); }\ninline void glEnableIndexedEXT(GLenum target, GLuint index) { fp_glEnableIndexedEXT(target, index); }\ninline void glDisableIndexedEXT(GLenum target, GLuint index) { fp_glDisableIndexedEXT(target, index); }\ninline GLboolean glIsEnabledIndexedEXT(GLenum target, GLuint index) { return fp_glIsEnabledIndexedEXT(target, index); }\ninline void glGetIntegerIndexedvEXT(GLenum target, GLuint index, GLint* data) { fp_glGetIntegerIndexedvEXT(target, index, data); }\ninline void glGetBooleanIndexedvEXT(GLenum target, GLuint index, GLboolean* data) { fp_glGetBooleanIndexedvEXT(target, index, data); }\ninline void glCompressedTextureImage3DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* bits) { fp_glCompressedTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, imageSize, bits); }\ninline void glCompressedTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* bits) { fp_glCompressedTextureImage2DEXT(texture, target, level, internalformat, width, height, border, imageSize, bits); }\ninline void glCompressedTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* bits) { fp_glCompressedTextureImage1DEXT(texture, target, level, internalformat, width, border, imageSize, bits); }\ninline void glCompressedTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* bits) { fp_glCompressedTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits); }\ninline void glCompressedTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* bits) { fp_glCompressedTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, imageSize, bits); }\ninline void glCompressedTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* bits) { fp_glCompressedTextureSubImage1DEXT(texture, target, level, xoffset, width, format, imageSize, bits); }\ninline void glGetCompressedTextureImageEXT(GLuint texture, GLenum target, GLint lod, void* img) { fp_glGetCompressedTextureImageEXT(texture, target, lod, img); }\ninline void glCompressedMultiTexImage3DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* bits) { fp_glCompressedMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, imageSize, bits); }\ninline void glCompressedMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* bits) { fp_glCompressedMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, imageSize, bits); }\ninline void glCompressedMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* bits) { fp_glCompressedMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, imageSize, bits); }\ninline void glCompressedMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* bits) { fp_glCompressedMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits); }\ninline void glCompressedMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* bits) { fp_glCompressedMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, imageSize, bits); }\ninline void glCompressedMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* bits) { fp_glCompressedMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, imageSize, bits); }\ninline void glGetCompressedMultiTexImageEXT(GLenum texunit, GLenum target, GLint lod, void* img) { fp_glGetCompressedMultiTexImageEXT(texunit, target, lod, img); }\ninline void glMatrixLoadTransposefEXT(GLenum mode, const GLfloat* m) { fp_glMatrixLoadTransposefEXT(mode, m); }\ninline void glMatrixLoadTransposedEXT(GLenum mode, const GLdouble* m) { fp_glMatrixLoadTransposedEXT(mode, m); }\ninline void glMatrixMultTransposefEXT(GLenum mode, const GLfloat* m) { fp_glMatrixMultTransposefEXT(mode, m); }\ninline void glMatrixMultTransposedEXT(GLenum mode, const GLdouble* m) { fp_glMatrixMultTransposedEXT(mode, m); }\ninline void glNamedBufferDataEXT(GLuint buffer, GLsizeiptr size, const void* data, GLenum usage) { fp_glNamedBufferDataEXT(buffer, size, data, usage); }\ninline void glNamedBufferSubDataEXT(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data) { fp_glNamedBufferSubDataEXT(buffer, offset, size, data); }\ninline void* glMapNamedBufferEXT(GLuint buffer, GLenum access) { return fp_glMapNamedBufferEXT(buffer, access); }\ninline GLboolean glUnmapNamedBufferEXT(GLuint buffer) { return fp_glUnmapNamedBufferEXT(buffer); }\ninline void glGetNamedBufferParameterivEXT(GLuint buffer, GLenum pname, GLint* params) { fp_glGetNamedBufferParameterivEXT(buffer, pname, params); }\ninline void glGetNamedBufferPointervEXT(GLuint buffer, GLenum pname, void** params) { fp_glGetNamedBufferPointervEXT(buffer, pname, params); }\ninline void glGetNamedBufferSubDataEXT(GLuint buffer, GLintptr offset, GLsizeiptr size, void* data) { fp_glGetNamedBufferSubDataEXT(buffer, offset, size, data); }\ninline void glProgramUniform1fEXT(GLuint program, GLint location, GLfloat v0) { fp_glProgramUniform1fEXT(program, location, v0); }\ninline void glProgramUniform2fEXT(GLuint program, GLint location, GLfloat v0, GLfloat v1) { fp_glProgramUniform2fEXT(program, location, v0, v1); }\ninline void glProgramUniform3fEXT(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2) { fp_glProgramUniform3fEXT(program, location, v0, v1, v2); }\ninline void glProgramUniform4fEXT(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) { fp_glProgramUniform4fEXT(program, location, v0, v1, v2, v3); }\ninline void glProgramUniform1iEXT(GLuint program, GLint location, GLint v0) { fp_glProgramUniform1iEXT(program, location, v0); }\ninline void glProgramUniform2iEXT(GLuint program, GLint location, GLint v0, GLint v1) { fp_glProgramUniform2iEXT(program, location, v0, v1); }\ninline void glProgramUniform3iEXT(GLuint program, GLint location, GLint v0, GLint v1, GLint v2) { fp_glProgramUniform3iEXT(program, location, v0, v1, v2); }\ninline void glProgramUniform4iEXT(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3) { fp_glProgramUniform4iEXT(program, location, v0, v1, v2, v3); }\ninline void glProgramUniform1fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat* value) { fp_glProgramUniform1fvEXT(program, location, count, value); }\ninline void glProgramUniform2fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat* value) { fp_glProgramUniform2fvEXT(program, location, count, value); }\ninline void glProgramUniform3fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat* value) { fp_glProgramUniform3fvEXT(program, location, count, value); }\ninline void glProgramUniform4fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat* value) { fp_glProgramUniform4fvEXT(program, location, count, value); }\ninline void glProgramUniform1ivEXT(GLuint program, GLint location, GLsizei count, const GLint* value) { fp_glProgramUniform1ivEXT(program, location, count, value); }\ninline void glProgramUniform2ivEXT(GLuint program, GLint location, GLsizei count, const GLint* value) { fp_glProgramUniform2ivEXT(program, location, count, value); }\ninline void glProgramUniform3ivEXT(GLuint program, GLint location, GLsizei count, const GLint* value) { fp_glProgramUniform3ivEXT(program, location, count, value); }\ninline void glProgramUniform4ivEXT(GLuint program, GLint location, GLsizei count, const GLint* value) { fp_glProgramUniform4ivEXT(program, location, count, value); }\ninline void glProgramUniformMatrix2fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix2fvEXT(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix3fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix3fvEXT(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix4fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix4fvEXT(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix2x3fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix2x3fvEXT(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix3x2fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix3x2fvEXT(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix2x4fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix2x4fvEXT(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix4x2fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix4x2fvEXT(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix3x4fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix3x4fvEXT(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix4x3fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix4x3fvEXT(program, location, count, transpose, value); }\ninline void glTextureBufferEXT(GLuint texture, GLenum target, GLenum internalformat, GLuint buffer) { fp_glTextureBufferEXT(texture, target, internalformat, buffer); }\ninline void glMultiTexBufferEXT(GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer) { fp_glMultiTexBufferEXT(texunit, target, internalformat, buffer); }\ninline void glTextureParameterIivEXT(GLuint texture, GLenum target, GLenum pname, const GLint* params) { fp_glTextureParameterIivEXT(texture, target, pname, params); }\ninline void glTextureParameterIuivEXT(GLuint texture, GLenum target, GLenum pname, const GLuint* params) { fp_glTextureParameterIuivEXT(texture, target, pname, params); }\ninline void glGetTextureParameterIivEXT(GLuint texture, GLenum target, GLenum pname, GLint* params) { fp_glGetTextureParameterIivEXT(texture, target, pname, params); }\ninline void glGetTextureParameterIuivEXT(GLuint texture, GLenum target, GLenum pname, GLuint* params) { fp_glGetTextureParameterIuivEXT(texture, target, pname, params); }\ninline void glMultiTexParameterIivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint* params) { fp_glMultiTexParameterIivEXT(texunit, target, pname, params); }\ninline void glMultiTexParameterIuivEXT(GLenum texunit, GLenum target, GLenum pname, const GLuint* params) { fp_glMultiTexParameterIuivEXT(texunit, target, pname, params); }\ninline void glGetMultiTexParameterIivEXT(GLenum texunit, GLenum target, GLenum pname, GLint* params) { fp_glGetMultiTexParameterIivEXT(texunit, target, pname, params); }\ninline void glGetMultiTexParameterIuivEXT(GLenum texunit, GLenum target, GLenum pname, GLuint* params) { fp_glGetMultiTexParameterIuivEXT(texunit, target, pname, params); }\ninline void glProgramUniform1uiEXT(GLuint program, GLint location, GLuint v0) { fp_glProgramUniform1uiEXT(program, location, v0); }\ninline void glProgramUniform2uiEXT(GLuint program, GLint location, GLuint v0, GLuint v1) { fp_glProgramUniform2uiEXT(program, location, v0, v1); }\ninline void glProgramUniform3uiEXT(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2) { fp_glProgramUniform3uiEXT(program, location, v0, v1, v2); }\ninline void glProgramUniform4uiEXT(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) { fp_glProgramUniform4uiEXT(program, location, v0, v1, v2, v3); }\ninline void glProgramUniform1uivEXT(GLuint program, GLint location, GLsizei count, const GLuint* value) { fp_glProgramUniform1uivEXT(program, location, count, value); }\ninline void glProgramUniform2uivEXT(GLuint program, GLint location, GLsizei count, const GLuint* value) { fp_glProgramUniform2uivEXT(program, location, count, value); }\ninline void glProgramUniform3uivEXT(GLuint program, GLint location, GLsizei count, const GLuint* value) { fp_glProgramUniform3uivEXT(program, location, count, value); }\ninline void glProgramUniform4uivEXT(GLuint program, GLint location, GLsizei count, const GLuint* value) { fp_glProgramUniform4uivEXT(program, location, count, value); }\ninline void glNamedProgramLocalParameters4fvEXT(GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat* params) { fp_glNamedProgramLocalParameters4fvEXT(program, target, index, count, params); }\ninline void glNamedProgramLocalParameterI4iEXT(GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w) { fp_glNamedProgramLocalParameterI4iEXT(program, target, index, x, y, z, w); }\ninline void glNamedProgramLocalParameterI4ivEXT(GLuint program, GLenum target, GLuint index, const GLint* params) { fp_glNamedProgramLocalParameterI4ivEXT(program, target, index, params); }\ninline void glNamedProgramLocalParametersI4ivEXT(GLuint program, GLenum target, GLuint index, GLsizei count, const GLint* params) { fp_glNamedProgramLocalParametersI4ivEXT(program, target, index, count, params); }\ninline void glNamedProgramLocalParameterI4uiEXT(GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) { fp_glNamedProgramLocalParameterI4uiEXT(program, target, index, x, y, z, w); }\ninline void glNamedProgramLocalParameterI4uivEXT(GLuint program, GLenum target, GLuint index, const GLuint* params) { fp_glNamedProgramLocalParameterI4uivEXT(program, target, index, params); }\ninline void glNamedProgramLocalParametersI4uivEXT(GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint* params) { fp_glNamedProgramLocalParametersI4uivEXT(program, target, index, count, params); }\ninline void glGetNamedProgramLocalParameterIivEXT(GLuint program, GLenum target, GLuint index, GLint* params) { fp_glGetNamedProgramLocalParameterIivEXT(program, target, index, params); }\ninline void glGetNamedProgramLocalParameterIuivEXT(GLuint program, GLenum target, GLuint index, GLuint* params) { fp_glGetNamedProgramLocalParameterIuivEXT(program, target, index, params); }\ninline void glEnableClientStateiEXT(GLenum array, GLuint index) { fp_glEnableClientStateiEXT(array, index); }\ninline void glDisableClientStateiEXT(GLenum array, GLuint index) { fp_glDisableClientStateiEXT(array, index); }\ninline void glGetFloati_vEXT(GLenum pname, GLuint index, GLfloat* params) { fp_glGetFloati_vEXT(pname, index, params); }\ninline void glGetDoublei_vEXT(GLenum pname, GLuint index, GLdouble* params) { fp_glGetDoublei_vEXT(pname, index, params); }\ninline void glGetPointeri_vEXT(GLenum pname, GLuint index, void** params) { fp_glGetPointeri_vEXT(pname, index, params); }\ninline void glNamedProgramStringEXT(GLuint program, GLenum target, GLenum format, GLsizei len, const void* string) { fp_glNamedProgramStringEXT(program, target, format, len, string); }\ninline void glNamedProgramLocalParameter4dEXT(GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glNamedProgramLocalParameter4dEXT(program, target, index, x, y, z, w); }\ninline void glNamedProgramLocalParameter4dvEXT(GLuint program, GLenum target, GLuint index, const GLdouble* params) { fp_glNamedProgramLocalParameter4dvEXT(program, target, index, params); }\ninline void glNamedProgramLocalParameter4fEXT(GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glNamedProgramLocalParameter4fEXT(program, target, index, x, y, z, w); }\ninline void glNamedProgramLocalParameter4fvEXT(GLuint program, GLenum target, GLuint index, const GLfloat* params) { fp_glNamedProgramLocalParameter4fvEXT(program, target, index, params); }\ninline void glGetNamedProgramLocalParameterdvEXT(GLuint program, GLenum target, GLuint index, GLdouble* params) { fp_glGetNamedProgramLocalParameterdvEXT(program, target, index, params); }\ninline void glGetNamedProgramLocalParameterfvEXT(GLuint program, GLenum target, GLuint index, GLfloat* params) { fp_glGetNamedProgramLocalParameterfvEXT(program, target, index, params); }\ninline void glGetNamedProgramivEXT(GLuint program, GLenum target, GLenum pname, GLint* params) { fp_glGetNamedProgramivEXT(program, target, pname, params); }\ninline void glGetNamedProgramStringEXT(GLuint program, GLenum target, GLenum pname, void* string) { fp_glGetNamedProgramStringEXT(program, target, pname, string); }\ninline void glNamedRenderbufferStorageEXT(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height) { fp_glNamedRenderbufferStorageEXT(renderbuffer, internalformat, width, height); }\ninline void glGetNamedRenderbufferParameterivEXT(GLuint renderbuffer, GLenum pname, GLint* params) { fp_glGetNamedRenderbufferParameterivEXT(renderbuffer, pname, params); }\ninline void glNamedRenderbufferStorageMultisampleEXT(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { fp_glNamedRenderbufferStorageMultisampleEXT(renderbuffer, samples, internalformat, width, height); }\ninline void glNamedRenderbufferStorageMultisampleCoverageEXT(GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height) { fp_glNamedRenderbufferStorageMultisampleCoverageEXT(renderbuffer, coverageSamples, colorSamples, internalformat, width, height); }\ninline GLenum glCheckNamedFramebufferStatusEXT(GLuint framebuffer, GLenum target) { return fp_glCheckNamedFramebufferStatusEXT(framebuffer, target); }\ninline void glNamedFramebufferTexture1DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { fp_glNamedFramebufferTexture1DEXT(framebuffer, attachment, textarget, texture, level); }\ninline void glNamedFramebufferTexture2DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { fp_glNamedFramebufferTexture2DEXT(framebuffer, attachment, textarget, texture, level); }\ninline void glNamedFramebufferTexture3DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) { fp_glNamedFramebufferTexture3DEXT(framebuffer, attachment, textarget, texture, level, zoffset); }\ninline void glNamedFramebufferRenderbufferEXT(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) { fp_glNamedFramebufferRenderbufferEXT(framebuffer, attachment, renderbuffertarget, renderbuffer); }\ninline void glGetNamedFramebufferAttachmentParameterivEXT(GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params) { fp_glGetNamedFramebufferAttachmentParameterivEXT(framebuffer, attachment, pname, params); }\ninline void glGenerateTextureMipmapEXT(GLuint texture, GLenum target) { fp_glGenerateTextureMipmapEXT(texture, target); }\ninline void glGenerateMultiTexMipmapEXT(GLenum texunit, GLenum target) { fp_glGenerateMultiTexMipmapEXT(texunit, target); }\ninline void glFramebufferDrawBufferEXT(GLuint framebuffer, GLenum mode) { fp_glFramebufferDrawBufferEXT(framebuffer, mode); }\ninline void glFramebufferDrawBuffersEXT(GLuint framebuffer, GLsizei n, const GLenum* bufs) { fp_glFramebufferDrawBuffersEXT(framebuffer, n, bufs); }\ninline void glFramebufferReadBufferEXT(GLuint framebuffer, GLenum mode) { fp_glFramebufferReadBufferEXT(framebuffer, mode); }\ninline void glGetFramebufferParameterivEXT(GLuint framebuffer, GLenum pname, GLint* params) { fp_glGetFramebufferParameterivEXT(framebuffer, pname, params); }\ninline void glNamedCopyBufferSubDataEXT(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) { fp_glNamedCopyBufferSubDataEXT(readBuffer, writeBuffer, readOffset, writeOffset, size); }\ninline void glNamedFramebufferTextureEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level) { fp_glNamedFramebufferTextureEXT(framebuffer, attachment, texture, level); }\ninline void glNamedFramebufferTextureLayerEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer) { fp_glNamedFramebufferTextureLayerEXT(framebuffer, attachment, texture, level, layer); }\ninline void glNamedFramebufferTextureFaceEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face) { fp_glNamedFramebufferTextureFaceEXT(framebuffer, attachment, texture, level, face); }\ninline void glTextureRenderbufferEXT(GLuint texture, GLenum target, GLuint renderbuffer) { fp_glTextureRenderbufferEXT(texture, target, renderbuffer); }\ninline void glMultiTexRenderbufferEXT(GLenum texunit, GLenum target, GLuint renderbuffer) { fp_glMultiTexRenderbufferEXT(texunit, target, renderbuffer); }\ninline void glVertexArrayVertexOffsetEXT(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset) { fp_glVertexArrayVertexOffsetEXT(vaobj, buffer, size, type, stride, offset); }\ninline void glVertexArrayColorOffsetEXT(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset) { fp_glVertexArrayColorOffsetEXT(vaobj, buffer, size, type, stride, offset); }\ninline void glVertexArrayEdgeFlagOffsetEXT(GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset) { fp_glVertexArrayEdgeFlagOffsetEXT(vaobj, buffer, stride, offset); }\ninline void glVertexArrayIndexOffsetEXT(GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset) { fp_glVertexArrayIndexOffsetEXT(vaobj, buffer, type, stride, offset); }\ninline void glVertexArrayNormalOffsetEXT(GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset) { fp_glVertexArrayNormalOffsetEXT(vaobj, buffer, type, stride, offset); }\ninline void glVertexArrayTexCoordOffsetEXT(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset) { fp_glVertexArrayTexCoordOffsetEXT(vaobj, buffer, size, type, stride, offset); }\ninline void glVertexArrayMultiTexCoordOffsetEXT(GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset) { fp_glVertexArrayMultiTexCoordOffsetEXT(vaobj, buffer, texunit, size, type, stride, offset); }\ninline void glVertexArrayFogCoordOffsetEXT(GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset) { fp_glVertexArrayFogCoordOffsetEXT(vaobj, buffer, type, stride, offset); }\ninline void glVertexArraySecondaryColorOffsetEXT(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset) { fp_glVertexArraySecondaryColorOffsetEXT(vaobj, buffer, size, type, stride, offset); }\ninline void glVertexArrayVertexAttribOffsetEXT(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset) { fp_glVertexArrayVertexAttribOffsetEXT(vaobj, buffer, index, size, type, normalized, stride, offset); }\ninline void glVertexArrayVertexAttribIOffsetEXT(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset) { fp_glVertexArrayVertexAttribIOffsetEXT(vaobj, buffer, index, size, type, stride, offset); }\ninline void glEnableVertexArrayEXT(GLuint vaobj, GLenum array) { fp_glEnableVertexArrayEXT(vaobj, array); }\ninline void glDisableVertexArrayEXT(GLuint vaobj, GLenum array) { fp_glDisableVertexArrayEXT(vaobj, array); }\ninline void glEnableVertexArrayAttribEXT(GLuint vaobj, GLuint index) { fp_glEnableVertexArrayAttribEXT(vaobj, index); }\ninline void glDisableVertexArrayAttribEXT(GLuint vaobj, GLuint index) { fp_glDisableVertexArrayAttribEXT(vaobj, index); }\ninline void glGetVertexArrayIntegervEXT(GLuint vaobj, GLenum pname, GLint* param) { fp_glGetVertexArrayIntegervEXT(vaobj, pname, param); }\ninline void glGetVertexArrayPointervEXT(GLuint vaobj, GLenum pname, void** param) { fp_glGetVertexArrayPointervEXT(vaobj, pname, param); }\ninline void glGetVertexArrayIntegeri_vEXT(GLuint vaobj, GLuint index, GLenum pname, GLint* param) { fp_glGetVertexArrayIntegeri_vEXT(vaobj, index, pname, param); }\ninline void glGetVertexArrayPointeri_vEXT(GLuint vaobj, GLuint index, GLenum pname, void** param) { fp_glGetVertexArrayPointeri_vEXT(vaobj, index, pname, param); }\ninline void* glMapNamedBufferRangeEXT(GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access) { return fp_glMapNamedBufferRangeEXT(buffer, offset, length, access); }\ninline void glFlushMappedNamedBufferRangeEXT(GLuint buffer, GLintptr offset, GLsizeiptr length) { fp_glFlushMappedNamedBufferRangeEXT(buffer, offset, length); }\ninline void glNamedBufferStorageEXT(GLuint buffer, GLsizeiptr size, const void* data, GLbitfield flags) { fp_glNamedBufferStorageEXT(buffer, size, data, flags); }\ninline void glClearNamedBufferDataEXT(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void* data) { fp_glClearNamedBufferDataEXT(buffer, internalformat, format, type, data); }\ninline void glClearNamedBufferSubDataEXT(GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void* data) { fp_glClearNamedBufferSubDataEXT(buffer, internalformat, offset, size, format, type, data); }\ninline void glNamedFramebufferParameteriEXT(GLuint framebuffer, GLenum pname, GLint param) { fp_glNamedFramebufferParameteriEXT(framebuffer, pname, param); }\ninline void glGetNamedFramebufferParameterivEXT(GLuint framebuffer, GLenum pname, GLint* params) { fp_glGetNamedFramebufferParameterivEXT(framebuffer, pname, params); }\ninline void glProgramUniform1dEXT(GLuint program, GLint location, GLdouble x) { fp_glProgramUniform1dEXT(program, location, x); }\ninline void glProgramUniform2dEXT(GLuint program, GLint location, GLdouble x, GLdouble y) { fp_glProgramUniform2dEXT(program, location, x, y); }\ninline void glProgramUniform3dEXT(GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z) { fp_glProgramUniform3dEXT(program, location, x, y, z); }\ninline void glProgramUniform4dEXT(GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glProgramUniform4dEXT(program, location, x, y, z, w); }\ninline void glProgramUniform1dvEXT(GLuint program, GLint location, GLsizei count, const GLdouble* value) { fp_glProgramUniform1dvEXT(program, location, count, value); }\ninline void glProgramUniform2dvEXT(GLuint program, GLint location, GLsizei count, const GLdouble* value) { fp_glProgramUniform2dvEXT(program, location, count, value); }\ninline void glProgramUniform3dvEXT(GLuint program, GLint location, GLsizei count, const GLdouble* value) { fp_glProgramUniform3dvEXT(program, location, count, value); }\ninline void glProgramUniform4dvEXT(GLuint program, GLint location, GLsizei count, const GLdouble* value) { fp_glProgramUniform4dvEXT(program, location, count, value); }\ninline void glProgramUniformMatrix2dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix2dvEXT(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix3dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix3dvEXT(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix4dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix4dvEXT(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix2x3dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix2x3dvEXT(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix2x4dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix2x4dvEXT(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix3x2dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix3x2dvEXT(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix3x4dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix3x4dvEXT(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix4x2dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix4x2dvEXT(program, location, count, transpose, value); }\ninline void glProgramUniformMatrix4x3dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix4x3dvEXT(program, location, count, transpose, value); }\ninline void glTextureBufferRangeEXT(GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size) { fp_glTextureBufferRangeEXT(texture, target, internalformat, buffer, offset, size); }\ninline void glTextureStorage1DEXT(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width) { fp_glTextureStorage1DEXT(texture, target, levels, internalformat, width); }\ninline void glTextureStorage2DEXT(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) { fp_glTextureStorage2DEXT(texture, target, levels, internalformat, width, height); }\ninline void glTextureStorage3DEXT(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) { fp_glTextureStorage3DEXT(texture, target, levels, internalformat, width, height, depth); }\ninline void glTextureStorage2DMultisampleEXT(GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations) { fp_glTextureStorage2DMultisampleEXT(texture, target, samples, internalformat, width, height, fixedsamplelocations); }\ninline void glTextureStorage3DMultisampleEXT(GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) { fp_glTextureStorage3DMultisampleEXT(texture, target, samples, internalformat, width, height, depth, fixedsamplelocations); }\ninline void glVertexArrayBindVertexBufferEXT(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride) { fp_glVertexArrayBindVertexBufferEXT(vaobj, bindingindex, buffer, offset, stride); }\ninline void glVertexArrayVertexAttribFormatEXT(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset) { fp_glVertexArrayVertexAttribFormatEXT(vaobj, attribindex, size, type, normalized, relativeoffset); }\ninline void glVertexArrayVertexAttribIFormatEXT(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) { fp_glVertexArrayVertexAttribIFormatEXT(vaobj, attribindex, size, type, relativeoffset); }\ninline void glVertexArrayVertexAttribLFormatEXT(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) { fp_glVertexArrayVertexAttribLFormatEXT(vaobj, attribindex, size, type, relativeoffset); }\ninline void glVertexArrayVertexAttribBindingEXT(GLuint vaobj, GLuint attribindex, GLuint bindingindex) { fp_glVertexArrayVertexAttribBindingEXT(vaobj, attribindex, bindingindex); }\ninline void glVertexArrayVertexBindingDivisorEXT(GLuint vaobj, GLuint bindingindex, GLuint divisor) { fp_glVertexArrayVertexBindingDivisorEXT(vaobj, bindingindex, divisor); }\ninline void glVertexArrayVertexAttribLOffsetEXT(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset) { fp_glVertexArrayVertexAttribLOffsetEXT(vaobj, buffer, index, size, type, stride, offset); }\ninline void glTexturePageCommitmentEXT(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit) { fp_glTexturePageCommitmentEXT(texture, level, xoffset, yoffset, zoffset, width, height, depth, commit); }\ninline void glVertexArrayVertexAttribDivisorEXT(GLuint vaobj, GLuint index, GLuint divisor) { fp_glVertexArrayVertexAttribDivisorEXT(vaobj, index, divisor); }\n\n/* GL_EXT_discard_framebuffer */\ninline void glDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, const GLenum* attachments) { fp_glDiscardFramebufferEXT(target, numAttachments, attachments); }\n\n/* GL_EXT_disjoint_timer_query */\ninline void glGenQueriesEXT(GLsizei n, GLuint* ids) { fp_glGenQueriesEXT(n, ids); }\ninline void glDeleteQueriesEXT(GLsizei n, const GLuint* ids) { fp_glDeleteQueriesEXT(n, ids); }\ninline GLboolean glIsQueryEXT(GLuint id) { return fp_glIsQueryEXT(id); }\ninline void glBeginQueryEXT(GLenum target, GLuint id) { fp_glBeginQueryEXT(target, id); }\ninline void glEndQueryEXT(GLenum target) { fp_glEndQueryEXT(target); }\ninline void glQueryCounterEXT(GLuint id, GLenum target) { fp_glQueryCounterEXT(id, target); }\ninline void glGetQueryivEXT(GLenum target, GLenum pname, GLint* params) { fp_glGetQueryivEXT(target, pname, params); }\ninline void glGetQueryObjectivEXT(GLuint id, GLenum pname, GLint* params) { fp_glGetQueryObjectivEXT(id, pname, params); }\ninline void glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint* params) { fp_glGetQueryObjectuivEXT(id, pname, params); }\ninline void glGetQueryObjecti64vEXT(GLuint id, GLenum pname, GLint64* params) { fp_glGetQueryObjecti64vEXT(id, pname, params); }\ninline void glGetQueryObjectui64vEXT(GLuint id, GLenum pname, GLuint64* params) { fp_glGetQueryObjectui64vEXT(id, pname, params); }\n\n/* GL_EXT_draw_buffers */\ninline void glDrawBuffersEXT(GLsizei n, const GLenum* bufs) { fp_glDrawBuffersEXT(n, bufs); }\n\n/* GL_EXT_draw_buffers2 */\ninline void glColorMaskIndexedEXT(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a) { fp_glColorMaskIndexedEXT(index, r, g, b, a); }\n\n/* GL_EXT_draw_buffers_indexed */\ninline void glEnableiEXT(GLenum target, GLuint index) { fp_glEnableiEXT(target, index); }\ninline void glDisableiEXT(GLenum target, GLuint index) { fp_glDisableiEXT(target, index); }\ninline void glBlendEquationiEXT(GLuint buf, GLenum mode) { fp_glBlendEquationiEXT(buf, mode); }\ninline void glBlendEquationSeparateiEXT(GLuint buf, GLenum modeRGB, GLenum modeAlpha) { fp_glBlendEquationSeparateiEXT(buf, modeRGB, modeAlpha); }\ninline void glBlendFunciEXT(GLuint buf, GLenum src, GLenum dst) { fp_glBlendFunciEXT(buf, src, dst); }\ninline void glBlendFuncSeparateiEXT(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { fp_glBlendFuncSeparateiEXT(buf, srcRGB, dstRGB, srcAlpha, dstAlpha); }\ninline void glColorMaskiEXT(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a) { fp_glColorMaskiEXT(index, r, g, b, a); }\ninline GLboolean glIsEnablediEXT(GLenum target, GLuint index) { return fp_glIsEnablediEXT(target, index); }\n\n/* GL_EXT_draw_elements_base_vertex */\ninline void glDrawElementsBaseVertexEXT(GLenum mode, GLsizei count, GLenum type, const void* indices, GLint basevertex) { fp_glDrawElementsBaseVertexEXT(mode, count, type, indices, basevertex); }\ninline void glDrawRangeElementsBaseVertexEXT(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices, GLint basevertex) { fp_glDrawRangeElementsBaseVertexEXT(mode, start, end, count, type, indices, basevertex); }\ninline void glDrawElementsInstancedBaseVertexEXT(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount, GLint basevertex) { fp_glDrawElementsInstancedBaseVertexEXT(mode, count, type, indices, instancecount, basevertex); }\ninline void glMultiDrawElementsBaseVertexEXT(GLenum mode, const GLsizei* count, GLenum type, const void** indices, GLsizei primcount, const GLint* basevertex) { fp_glMultiDrawElementsBaseVertexEXT(mode, count, type, indices, primcount, basevertex); }\n\n/* GL_EXT_draw_instanced */\ninline void glDrawArraysInstancedEXT(GLenum mode, GLint start, GLsizei count, GLsizei primcount) { fp_glDrawArraysInstancedEXT(mode, start, count, primcount); }\ninline void glDrawElementsInstancedEXT(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount) { fp_glDrawElementsInstancedEXT(mode, count, type, indices, primcount); }\n\n/* GL_EXT_framebuffer_blit */\ninline void glBlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { fp_glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); }\n\n/* GL_EXT_framebuffer_multisample */\ninline void glRenderbufferStorageMultisampleEXT(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { fp_glRenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height); }\n\n/* GL_EXT_framebuffer_object */\ninline GLboolean glIsRenderbufferEXT(GLuint renderbuffer) { return fp_glIsRenderbufferEXT(renderbuffer); }\ninline void glBindRenderbufferEXT(GLenum target, GLuint renderbuffer) { fp_glBindRenderbufferEXT(target, renderbuffer); }\ninline void glDeleteRenderbuffersEXT(GLsizei n, const GLuint* renderbuffers) { fp_glDeleteRenderbuffersEXT(n, renderbuffers); }\ninline void glGenRenderbuffersEXT(GLsizei n, GLuint* renderbuffers) { fp_glGenRenderbuffersEXT(n, renderbuffers); }\ninline void glRenderbufferStorageEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) { fp_glRenderbufferStorageEXT(target, internalformat, width, height); }\ninline void glGetRenderbufferParameterivEXT(GLenum target, GLenum pname, GLint* params) { fp_glGetRenderbufferParameterivEXT(target, pname, params); }\ninline GLboolean glIsFramebufferEXT(GLuint framebuffer) { return fp_glIsFramebufferEXT(framebuffer); }\ninline void glBindFramebufferEXT(GLenum target, GLuint framebuffer) { fp_glBindFramebufferEXT(target, framebuffer); }\ninline void glDeleteFramebuffersEXT(GLsizei n, const GLuint* framebuffers) { fp_glDeleteFramebuffersEXT(n, framebuffers); }\ninline void glGenFramebuffersEXT(GLsizei n, GLuint* framebuffers) { fp_glGenFramebuffersEXT(n, framebuffers); }\ninline GLenum glCheckFramebufferStatusEXT(GLenum target) { return fp_glCheckFramebufferStatusEXT(target); }\ninline void glFramebufferTexture1DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { fp_glFramebufferTexture1DEXT(target, attachment, textarget, texture, level); }\ninline void glFramebufferTexture2DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { fp_glFramebufferTexture2DEXT(target, attachment, textarget, texture, level); }\ninline void glFramebufferTexture3DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) { fp_glFramebufferTexture3DEXT(target, attachment, textarget, texture, level, zoffset); }\ninline void glFramebufferRenderbufferEXT(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) { fp_glFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, renderbuffer); }\ninline void glGetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment, GLenum pname, GLint* params) { fp_glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, params); }\ninline void glGenerateMipmapEXT(GLenum target) { fp_glGenerateMipmapEXT(target); }\n\n/* GL_EXT_geometry_shader */\ninline void glFramebufferTextureEXT(GLenum target, GLenum attachment, GLuint texture, GLint level) { fp_glFramebufferTextureEXT(target, attachment, texture, level); }\n\n/* GL_EXT_geometry_shader4 */\ninline void glProgramParameteriEXT(GLuint program, GLenum pname, GLint value) { fp_glProgramParameteriEXT(program, pname, value); }\n\n/* GL_EXT_gpu_program_parameters */\ninline void glProgramEnvParameters4fvEXT(GLenum target, GLuint index, GLsizei count, const GLfloat* params) { fp_glProgramEnvParameters4fvEXT(target, index, count, params); }\ninline void glProgramLocalParameters4fvEXT(GLenum target, GLuint index, GLsizei count, const GLfloat* params) { fp_glProgramLocalParameters4fvEXT(target, index, count, params); }\n\n/* GL_EXT_gpu_shader4 */\ninline void glGetUniformuivEXT(GLuint program, GLint location, GLuint* params) { fp_glGetUniformuivEXT(program, location, params); }\ninline GLint glGetFragDataLocationEXT(GLuint program, const GLchar* name) { return fp_glGetFragDataLocationEXT(program, name); }\ninline void glUniform1uiEXT(GLint location, GLuint v0) { fp_glUniform1uiEXT(location, v0); }\ninline void glUniform2uiEXT(GLint location, GLuint v0, GLuint v1) { fp_glUniform2uiEXT(location, v0, v1); }\ninline void glUniform3uiEXT(GLint location, GLuint v0, GLuint v1, GLuint v2) { fp_glUniform3uiEXT(location, v0, v1, v2); }\ninline void glUniform4uiEXT(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) { fp_glUniform4uiEXT(location, v0, v1, v2, v3); }\ninline void glUniform1uivEXT(GLint location, GLsizei count, const GLuint* value) { fp_glUniform1uivEXT(location, count, value); }\ninline void glUniform2uivEXT(GLint location, GLsizei count, const GLuint* value) { fp_glUniform2uivEXT(location, count, value); }\ninline void glUniform3uivEXT(GLint location, GLsizei count, const GLuint* value) { fp_glUniform3uivEXT(location, count, value); }\ninline void glUniform4uivEXT(GLint location, GLsizei count, const GLuint* value) { fp_glUniform4uivEXT(location, count, value); }\n\n/* GL_EXT_instanced_arrays */\ninline void glVertexAttribDivisorEXT(GLuint index, GLuint divisor) { fp_glVertexAttribDivisorEXT(index, divisor); }\n\n/* GL_EXT_map_buffer_range */\ninline void* glMapBufferRangeEXT(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) { return fp_glMapBufferRangeEXT(target, offset, length, access); }\ninline void glFlushMappedBufferRangeEXT(GLenum target, GLintptr offset, GLsizeiptr length) { fp_glFlushMappedBufferRangeEXT(target, offset, length); }\n\n/* GL_EXT_multi_draw_indirect */\ninline void glMultiDrawArraysIndirectEXT(GLenum mode, const void* indirect, GLsizei drawcount, GLsizei stride) { fp_glMultiDrawArraysIndirectEXT(mode, indirect, drawcount, stride); }\ninline void glMultiDrawElementsIndirectEXT(GLenum mode, GLenum type, const void* indirect, GLsizei drawcount, GLsizei stride) { fp_glMultiDrawElementsIndirectEXT(mode, type, indirect, drawcount, stride); }\n\n/* GL_EXT_multisampled_render_to_texture */\ninline void glFramebufferTexture2DMultisampleEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples) { fp_glFramebufferTexture2DMultisampleEXT(target, attachment, textarget, texture, level, samples); }\n\n/* GL_EXT_multiview_draw_buffers */\ninline void glReadBufferIndexedEXT(GLenum src, GLint index) { fp_glReadBufferIndexedEXT(src, index); }\ninline void glDrawBuffersIndexedEXT(GLint n, const GLenum* location, const GLint* indices) { fp_glDrawBuffersIndexedEXT(n, location, indices); }\ninline void glGetIntegeri_vEXT(GLenum target, GLuint index, GLint* data) { fp_glGetIntegeri_vEXT(target, index, data); }\n\n/* GL_EXT_polygon_offset_clamp */\ninline void glPolygonOffsetClampEXT(GLfloat factor, GLfloat units, GLfloat clamp) { fp_glPolygonOffsetClampEXT(factor, units, clamp); }\n\n/* GL_EXT_primitive_bounding_box */\ninline void glPrimitiveBoundingBoxEXT(GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW) { fp_glPrimitiveBoundingBoxEXT(minX, minY, minZ, minW, maxX, maxY, maxZ, maxW); }\n\n/* GL_EXT_provoking_vertex */\ninline void glProvokingVertexEXT(GLenum mode) { fp_glProvokingVertexEXT(mode); }\n\n/* GL_EXT_raster_multisample */\ninline void glRasterSamplesEXT(GLuint samples, GLboolean fixedsamplelocations) { fp_glRasterSamplesEXT(samples, fixedsamplelocations); }\n\n/* GL_EXT_robustness */\ninline GLenum glGetGraphicsResetStatusEXT() { return fp_glGetGraphicsResetStatusEXT(); }\ninline void glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data) { fp_glReadnPixelsEXT(x, y, width, height, format, type, bufSize, data); }\ninline void glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params) { fp_glGetnUniformfvEXT(program, location, bufSize, params); }\ninline void glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params) { fp_glGetnUniformivEXT(program, location, bufSize, params); }\n\n/* GL_EXT_separate_shader_objects */\ninline void glUseShaderProgramEXT(GLenum type, GLuint program) { fp_glUseShaderProgramEXT(type, program); }\ninline void glActiveProgramEXT(GLuint program) { fp_glActiveProgramEXT(program); }\ninline GLuint glCreateShaderProgramEXT(GLenum type, const GLchar* string) { return fp_glCreateShaderProgramEXT(type, string); }\ninline void glActiveShaderProgramEXT(GLuint pipeline, GLuint program) { fp_glActiveShaderProgramEXT(pipeline, program); }\ninline void glBindProgramPipelineEXT(GLuint pipeline) { fp_glBindProgramPipelineEXT(pipeline); }\ninline GLuint glCreateShaderProgramvEXT(GLenum type, GLsizei count, const GLchar** strings) { return fp_glCreateShaderProgramvEXT(type, count, strings); }\ninline void glDeleteProgramPipelinesEXT(GLsizei n, const GLuint* pipelines) { fp_glDeleteProgramPipelinesEXT(n, pipelines); }\ninline void glGenProgramPipelinesEXT(GLsizei n, GLuint* pipelines) { fp_glGenProgramPipelinesEXT(n, pipelines); }\ninline void glGetProgramPipelineInfoLogEXT(GLuint pipeline, GLsizei bufSize, GLsizei* length, GLchar* infoLog) { fp_glGetProgramPipelineInfoLogEXT(pipeline, bufSize, length, infoLog); }\ninline void glGetProgramPipelineivEXT(GLuint pipeline, GLenum pname, GLint* params) { fp_glGetProgramPipelineivEXT(pipeline, pname, params); }\ninline GLboolean glIsProgramPipelineEXT(GLuint pipeline) { return fp_glIsProgramPipelineEXT(pipeline); }\ninline void glUseProgramStagesEXT(GLuint pipeline, GLbitfield stages, GLuint program) { fp_glUseProgramStagesEXT(pipeline, stages, program); }\ninline void glValidateProgramPipelineEXT(GLuint pipeline) { fp_glValidateProgramPipelineEXT(pipeline); }\n\n/* GL_EXT_shader_image_load_store */\ninline void glBindImageTextureEXT(GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format) { fp_glBindImageTextureEXT(index, texture, level, layered, layer, access, format); }\ninline void glMemoryBarrierEXT(GLbitfield barriers) { fp_glMemoryBarrierEXT(barriers); }\n\n/* GL_EXT_sparse_texture */\ninline void glTexPageCommitmentEXT(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit) { fp_glTexPageCommitmentEXT(target, level, xoffset, yoffset, zoffset, width, height, depth, commit); }\n\n/* GL_EXT_stencil_clear_tag */\ninline void glStencilClearTagEXT(GLsizei stencilTagBits, GLuint stencilClearTag) { fp_glStencilClearTagEXT(stencilTagBits, stencilClearTag); }\n\n/* GL_EXT_tessellation_shader */\ninline void glPatchParameteriEXT(GLenum pname, GLint value) { fp_glPatchParameteriEXT(pname, value); }\n\n/* GL_EXT_texture_array */\ninline void glFramebufferTextureLayerEXT(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) { fp_glFramebufferTextureLayerEXT(target, attachment, texture, level, layer); }\n\n/* GL_EXT_texture_border_clamp */\ninline void glTexParameterIivEXT(GLenum target, GLenum pname, const GLint* params) { fp_glTexParameterIivEXT(target, pname, params); }\ninline void glTexParameterIuivEXT(GLenum target, GLenum pname, const GLuint* params) { fp_glTexParameterIuivEXT(target, pname, params); }\ninline void glGetTexParameterIivEXT(GLenum target, GLenum pname, GLint* params) { fp_glGetTexParameterIivEXT(target, pname, params); }\ninline void glGetTexParameterIuivEXT(GLenum target, GLenum pname, GLuint* params) { fp_glGetTexParameterIuivEXT(target, pname, params); }\ninline void glSamplerParameterIivEXT(GLuint sampler, GLenum pname, const GLint* param) { fp_glSamplerParameterIivEXT(sampler, pname, param); }\ninline void glSamplerParameterIuivEXT(GLuint sampler, GLenum pname, const GLuint* param) { fp_glSamplerParameterIuivEXT(sampler, pname, param); }\ninline void glGetSamplerParameterIivEXT(GLuint sampler, GLenum pname, GLint* params) { fp_glGetSamplerParameterIivEXT(sampler, pname, params); }\ninline void glGetSamplerParameterIuivEXT(GLuint sampler, GLenum pname, GLuint* params) { fp_glGetSamplerParameterIuivEXT(sampler, pname, params); }\n\n/* GL_EXT_texture_buffer */\ninline void glTexBufferEXT(GLenum target, GLenum internalformat, GLuint buffer) { fp_glTexBufferEXT(target, internalformat, buffer); }\ninline void glTexBufferRangeEXT(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size) { fp_glTexBufferRangeEXT(target, internalformat, buffer, offset, size); }\n\n/* GL_EXT_texture_integer */\ninline void glClearColorIiEXT(GLint red, GLint green, GLint blue, GLint alpha) { fp_glClearColorIiEXT(red, green, blue, alpha); }\ninline void glClearColorIuiEXT(GLuint red, GLuint green, GLuint blue, GLuint alpha) { fp_glClearColorIuiEXT(red, green, blue, alpha); }\n\n/* GL_EXT_texture_storage */\ninline void glTexStorage1DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width) { fp_glTexStorage1DEXT(target, levels, internalformat, width); }\ninline void glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) { fp_glTexStorage2DEXT(target, levels, internalformat, width, height); }\ninline void glTexStorage3DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) { fp_glTexStorage3DEXT(target, levels, internalformat, width, height, depth); }\n\n/* GL_EXT_texture_view */\ninline void glTextureViewEXT(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers) { fp_glTextureViewEXT(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers); }\n\n/* GL_EXT_transform_feedback */\ninline void glBeginTransformFeedbackEXT(GLenum primitiveMode) { fp_glBeginTransformFeedbackEXT(primitiveMode); }\ninline void glEndTransformFeedbackEXT() { fp_glEndTransformFeedbackEXT(); }\ninline void glBindBufferRangeEXT(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) { fp_glBindBufferRangeEXT(target, index, buffer, offset, size); }\ninline void glBindBufferOffsetEXT(GLenum target, GLuint index, GLuint buffer, GLintptr offset) { fp_glBindBufferOffsetEXT(target, index, buffer, offset); }\ninline void glBindBufferBaseEXT(GLenum target, GLuint index, GLuint buffer) { fp_glBindBufferBaseEXT(target, index, buffer); }\ninline void glTransformFeedbackVaryingsEXT(GLuint program, GLsizei count, const GLchar** varyings, GLenum bufferMode) { fp_glTransformFeedbackVaryingsEXT(program, count, varyings, bufferMode); }\ninline void glGetTransformFeedbackVaryingEXT(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name) { fp_glGetTransformFeedbackVaryingEXT(program, index, bufSize, length, size, type, name); }\n\n/* GL_EXT_vertex_attrib_64bit */\ninline void glVertexAttribL1dEXT(GLuint index, GLdouble x) { fp_glVertexAttribL1dEXT(index, x); }\ninline void glVertexAttribL2dEXT(GLuint index, GLdouble x, GLdouble y) { fp_glVertexAttribL2dEXT(index, x, y); }\ninline void glVertexAttribL3dEXT(GLuint index, GLdouble x, GLdouble y, GLdouble z) { fp_glVertexAttribL3dEXT(index, x, y, z); }\ninline void glVertexAttribL4dEXT(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glVertexAttribL4dEXT(index, x, y, z, w); }\ninline void glVertexAttribL1dvEXT(GLuint index, const GLdouble* v) { fp_glVertexAttribL1dvEXT(index, v); }\ninline void glVertexAttribL2dvEXT(GLuint index, const GLdouble* v) { fp_glVertexAttribL2dvEXT(index, v); }\ninline void glVertexAttribL3dvEXT(GLuint index, const GLdouble* v) { fp_glVertexAttribL3dvEXT(index, v); }\ninline void glVertexAttribL4dvEXT(GLuint index, const GLdouble* v) { fp_glVertexAttribL4dvEXT(index, v); }\ninline void glVertexAttribLPointerEXT(GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glVertexAttribLPointerEXT(index, size, type, stride, pointer); }\ninline void glGetVertexAttribLdvEXT(GLuint index, GLenum pname, GLdouble* params) { fp_glGetVertexAttribLdvEXT(index, pname, params); }\n\n/* GL_EXT_x11_sync_object */\ninline GLsync glImportSyncEXT(GLenum external_sync_type, GLintptr external_sync, GLbitfield flags) { return fp_glImportSyncEXT(external_sync_type, external_sync, flags); }\n\n/* GL_OES_copy_image */\ninline void glCopyImageSubDataOES(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth) { fp_glCopyImageSubDataOES(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth); }\n\n/* GL_OES_draw_buffers_indexed */\ninline void glEnableiOES(GLenum target, GLuint index) { fp_glEnableiOES(target, index); }\ninline void glDisableiOES(GLenum target, GLuint index) { fp_glDisableiOES(target, index); }\ninline void glBlendEquationiOES(GLuint buf, GLenum mode) { fp_glBlendEquationiOES(buf, mode); }\ninline void glBlendEquationSeparateiOES(GLuint buf, GLenum modeRGB, GLenum modeAlpha) { fp_glBlendEquationSeparateiOES(buf, modeRGB, modeAlpha); }\ninline void glBlendFunciOES(GLuint buf, GLenum src, GLenum dst) { fp_glBlendFunciOES(buf, src, dst); }\ninline void glBlendFuncSeparateiOES(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { fp_glBlendFuncSeparateiOES(buf, srcRGB, dstRGB, srcAlpha, dstAlpha); }\ninline void glColorMaskiOES(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a) { fp_glColorMaskiOES(index, r, g, b, a); }\ninline GLboolean glIsEnablediOES(GLenum target, GLuint index) { return fp_glIsEnablediOES(target, index); }\n\n/* GL_OES_draw_elements_base_vertex */\ninline void glDrawElementsBaseVertexOES(GLenum mode, GLsizei count, GLenum type, const void* indices, GLint basevertex) { fp_glDrawElementsBaseVertexOES(mode, count, type, indices, basevertex); }\ninline void glDrawRangeElementsBaseVertexOES(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices, GLint basevertex) { fp_glDrawRangeElementsBaseVertexOES(mode, start, end, count, type, indices, basevertex); }\ninline void glDrawElementsInstancedBaseVertexOES(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount, GLint basevertex) { fp_glDrawElementsInstancedBaseVertexOES(mode, count, type, indices, instancecount, basevertex); }\ninline void glMultiDrawElementsBaseVertexOES(GLenum mode, const GLsizei* count, GLenum type, const void** indices, GLsizei primcount, const GLint* basevertex) { fp_glMultiDrawElementsBaseVertexOES(mode, count, type, indices, primcount, basevertex); }\n\n/* GL_OES_EGL_image */\ninline void glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image) { fp_glEGLImageTargetTexture2DOES(target, image); }\ninline void glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image) { fp_glEGLImageTargetRenderbufferStorageOES(target, image); }\n\n/* GL_OES_geometry_shader */\ninline void glFramebufferTextureOES(GLenum target, GLenum attachment, GLuint texture, GLint level) { fp_glFramebufferTextureOES(target, attachment, texture, level); }\n\n/* GL_OES_get_program_binary */\ninline void glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, void* binary) { fp_glGetProgramBinaryOES(program, bufSize, length, binaryFormat, binary); }\ninline void glProgramBinaryOES(GLuint program, GLenum binaryFormat, const void* binary, GLint length) { fp_glProgramBinaryOES(program, binaryFormat, binary, length); }\n\n/* GL_OES_mapbuffer */\ninline void* glMapBufferOES(GLenum target, GLenum access) { return fp_glMapBufferOES(target, access); }\ninline GLboolean glUnmapBufferOES(GLenum target) { return fp_glUnmapBufferOES(target); }\ninline void glGetBufferPointervOES(GLenum target, GLenum pname, void** params) { fp_glGetBufferPointervOES(target, pname, params); }\n\n/* GL_OES_primitive_bounding_box */\ninline void glPrimitiveBoundingBoxOES(GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW) { fp_glPrimitiveBoundingBoxOES(minX, minY, minZ, minW, maxX, maxY, maxZ, maxW); }\n\n/* GL_OES_sample_shading */\ninline void glMinSampleShadingOES(GLfloat value) { fp_glMinSampleShadingOES(value); }\n\n/* GL_OES_tessellation_shader */\ninline void glPatchParameteriOES(GLenum pname, GLint value) { fp_glPatchParameteriOES(pname, value); }\n\n/* GL_OES_texture_3D */\ninline void glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels) { fp_glTexImage3DOES(target, level, internalformat, width, height, depth, border, format, type, pixels); }\ninline void glTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels) { fp_glTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); }\ninline void glCopyTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glCopyTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, x, y, width, height); }\ninline void glCompressedTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data) { fp_glCompressedTexImage3DOES(target, level, internalformat, width, height, depth, border, imageSize, data); }\ninline void glCompressedTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data) { fp_glCompressedTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); }\ninline void glFramebufferTexture3DOES(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) { fp_glFramebufferTexture3DOES(target, attachment, textarget, texture, level, zoffset); }\n\n/* GL_OES_texture_border_clamp */\ninline void glTexParameterIivOES(GLenum target, GLenum pname, const GLint* params) { fp_glTexParameterIivOES(target, pname, params); }\ninline void glTexParameterIuivOES(GLenum target, GLenum pname, const GLuint* params) { fp_glTexParameterIuivOES(target, pname, params); }\ninline void glGetTexParameterIivOES(GLenum target, GLenum pname, GLint* params) { fp_glGetTexParameterIivOES(target, pname, params); }\ninline void glGetTexParameterIuivOES(GLenum target, GLenum pname, GLuint* params) { fp_glGetTexParameterIuivOES(target, pname, params); }\ninline void glSamplerParameterIivOES(GLuint sampler, GLenum pname, const GLint* param) { fp_glSamplerParameterIivOES(sampler, pname, param); }\ninline void glSamplerParameterIuivOES(GLuint sampler, GLenum pname, const GLuint* param) { fp_glSamplerParameterIuivOES(sampler, pname, param); }\ninline void glGetSamplerParameterIivOES(GLuint sampler, GLenum pname, GLint* params) { fp_glGetSamplerParameterIivOES(sampler, pname, params); }\ninline void glGetSamplerParameterIuivOES(GLuint sampler, GLenum pname, GLuint* params) { fp_glGetSamplerParameterIuivOES(sampler, pname, params); }\n\n/* GL_OES_texture_buffer */\ninline void glTexBufferOES(GLenum target, GLenum internalformat, GLuint buffer) { fp_glTexBufferOES(target, internalformat, buffer); }\ninline void glTexBufferRangeOES(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size) { fp_glTexBufferRangeOES(target, internalformat, buffer, offset, size); }\n\n/* GL_OES_texture_storage_multisample_2d_array */\ninline void glTexStorage3DMultisampleOES(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) { fp_glTexStorage3DMultisampleOES(target, samples, internalformat, width, height, depth, fixedsamplelocations); }\n\n/* GL_OES_texture_view */\ninline void glTextureViewOES(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers) { fp_glTextureViewOES(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers); }\n\n/* GL_OES_vertex_array_object */\ninline void glBindVertexArrayOES(GLuint array) { fp_glBindVertexArrayOES(array); }\ninline void glDeleteVertexArraysOES(GLsizei n, const GLuint* arrays) { fp_glDeleteVertexArraysOES(n, arrays); }\ninline void glGenVertexArraysOES(GLsizei n, GLuint* arrays) { fp_glGenVertexArraysOES(n, arrays); }\ninline GLboolean glIsVertexArrayOES(GLuint array) { return fp_glIsVertexArrayOES(array); }\n\n/* GL_AMD_debug_output */\ninline void glDebugMessageEnableAMD(GLenum category, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled) { fp_glDebugMessageEnableAMD(category, severity, count, ids, enabled); }\ninline void glDebugMessageInsertAMD(GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar* buf) { fp_glDebugMessageInsertAMD(category, severity, id, length, buf); }\ninline void glDebugMessageCallbackAMD(GLDEBUGPROCAMD callback, void* userParam) { fp_glDebugMessageCallbackAMD(callback, userParam); }\ninline GLuint glGetDebugMessageLogAMD(GLuint count, GLsizei bufsize, GLenum* categories, GLuint* severities, GLuint* ids, GLsizei* lengths, GLchar* message) { return fp_glGetDebugMessageLogAMD(count, bufsize, categories, severities, ids, lengths, message); }\n\n/* GL_AMD_draw_buffers_blend */\ninline void glBlendFuncIndexedAMD(GLuint buf, GLenum src, GLenum dst) { fp_glBlendFuncIndexedAMD(buf, src, dst); }\ninline void glBlendFuncSeparateIndexedAMD(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { fp_glBlendFuncSeparateIndexedAMD(buf, srcRGB, dstRGB, srcAlpha, dstAlpha); }\ninline void glBlendEquationIndexedAMD(GLuint buf, GLenum mode) { fp_glBlendEquationIndexedAMD(buf, mode); }\ninline void glBlendEquationSeparateIndexedAMD(GLuint buf, GLenum modeRGB, GLenum modeAlpha) { fp_glBlendEquationSeparateIndexedAMD(buf, modeRGB, modeAlpha); }\n\n/* GL_AMD_gpu_shader_int64 */\ninline void glUniform1i64NV(GLint location, GLint64EXT x) { fp_glUniform1i64NV(location, x); }\ninline void glUniform2i64NV(GLint location, GLint64EXT x, GLint64EXT y) { fp_glUniform2i64NV(location, x, y); }\ninline void glUniform3i64NV(GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z) { fp_glUniform3i64NV(location, x, y, z); }\ninline void glUniform4i64NV(GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w) { fp_glUniform4i64NV(location, x, y, z, w); }\ninline void glUniform1i64vNV(GLint location, GLsizei count, const GLint64EXT* value) { fp_glUniform1i64vNV(location, count, value); }\ninline void glUniform2i64vNV(GLint location, GLsizei count, const GLint64EXT* value) { fp_glUniform2i64vNV(location, count, value); }\ninline void glUniform3i64vNV(GLint location, GLsizei count, const GLint64EXT* value) { fp_glUniform3i64vNV(location, count, value); }\ninline void glUniform4i64vNV(GLint location, GLsizei count, const GLint64EXT* value) { fp_glUniform4i64vNV(location, count, value); }\ninline void glUniform1ui64NV(GLint location, GLuint64EXT x) { fp_glUniform1ui64NV(location, x); }\ninline void glUniform2ui64NV(GLint location, GLuint64EXT x, GLuint64EXT y) { fp_glUniform2ui64NV(location, x, y); }\ninline void glUniform3ui64NV(GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z) { fp_glUniform3ui64NV(location, x, y, z); }\ninline void glUniform4ui64NV(GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w) { fp_glUniform4ui64NV(location, x, y, z, w); }\ninline void glUniform1ui64vNV(GLint location, GLsizei count, const GLuint64EXT* value) { fp_glUniform1ui64vNV(location, count, value); }\ninline void glUniform2ui64vNV(GLint location, GLsizei count, const GLuint64EXT* value) { fp_glUniform2ui64vNV(location, count, value); }\ninline void glUniform3ui64vNV(GLint location, GLsizei count, const GLuint64EXT* value) { fp_glUniform3ui64vNV(location, count, value); }\ninline void glUniform4ui64vNV(GLint location, GLsizei count, const GLuint64EXT* value) { fp_glUniform4ui64vNV(location, count, value); }\ninline void glGetUniformi64vNV(GLuint program, GLint location, GLint64EXT* params) { fp_glGetUniformi64vNV(program, location, params); }\ninline void glGetUniformui64vNV(GLuint program, GLint location, GLuint64EXT* params) { fp_glGetUniformui64vNV(program, location, params); }\ninline void glProgramUniform1i64NV(GLuint program, GLint location, GLint64EXT x) { fp_glProgramUniform1i64NV(program, location, x); }\ninline void glProgramUniform2i64NV(GLuint program, GLint location, GLint64EXT x, GLint64EXT y) { fp_glProgramUniform2i64NV(program, location, x, y); }\ninline void glProgramUniform3i64NV(GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z) { fp_glProgramUniform3i64NV(program, location, x, y, z); }\ninline void glProgramUniform4i64NV(GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w) { fp_glProgramUniform4i64NV(program, location, x, y, z, w); }\ninline void glProgramUniform1i64vNV(GLuint program, GLint location, GLsizei count, const GLint64EXT* value) { fp_glProgramUniform1i64vNV(program, location, count, value); }\ninline void glProgramUniform2i64vNV(GLuint program, GLint location, GLsizei count, const GLint64EXT* value) { fp_glProgramUniform2i64vNV(program, location, count, value); }\ninline void glProgramUniform3i64vNV(GLuint program, GLint location, GLsizei count, const GLint64EXT* value) { fp_glProgramUniform3i64vNV(program, location, count, value); }\ninline void glProgramUniform4i64vNV(GLuint program, GLint location, GLsizei count, const GLint64EXT* value) { fp_glProgramUniform4i64vNV(program, location, count, value); }\ninline void glProgramUniform1ui64NV(GLuint program, GLint location, GLuint64EXT x) { fp_glProgramUniform1ui64NV(program, location, x); }\ninline void glProgramUniform2ui64NV(GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y) { fp_glProgramUniform2ui64NV(program, location, x, y); }\ninline void glProgramUniform3ui64NV(GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z) { fp_glProgramUniform3ui64NV(program, location, x, y, z); }\ninline void glProgramUniform4ui64NV(GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w) { fp_glProgramUniform4ui64NV(program, location, x, y, z, w); }\ninline void glProgramUniform1ui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value) { fp_glProgramUniform1ui64vNV(program, location, count, value); }\ninline void glProgramUniform2ui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value) { fp_glProgramUniform2ui64vNV(program, location, count, value); }\ninline void glProgramUniform3ui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value) { fp_glProgramUniform3ui64vNV(program, location, count, value); }\ninline void glProgramUniform4ui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value) { fp_glProgramUniform4ui64vNV(program, location, count, value); }\n\n/* GL_AMD_interleaved_elements */\ninline void glVertexAttribParameteriAMD(GLuint index, GLenum pname, GLint param) { fp_glVertexAttribParameteriAMD(index, pname, param); }\n\n/* GL_AMD_multi_draw_indirect */\ninline void glMultiDrawArraysIndirectAMD(GLenum mode, const void* indirect, GLsizei primcount, GLsizei stride) { fp_glMultiDrawArraysIndirectAMD(mode, indirect, primcount, stride); }\ninline void glMultiDrawElementsIndirectAMD(GLenum mode, GLenum type, const void* indirect, GLsizei primcount, GLsizei stride) { fp_glMultiDrawElementsIndirectAMD(mode, type, indirect, primcount, stride); }\n\n/* GL_AMD_name_gen_delete */\ninline void glGenNamesAMD(GLenum identifier, GLuint num, GLuint* names) { fp_glGenNamesAMD(identifier, num, names); }\ninline void glDeleteNamesAMD(GLenum identifier, GLuint num, const GLuint* names) { fp_glDeleteNamesAMD(identifier, num, names); }\ninline GLboolean glIsNameAMD(GLenum identifier, GLuint name) { return fp_glIsNameAMD(identifier, name); }\n\n/* GL_AMD_occlusion_query_event */\ninline void glQueryObjectParameteruiAMD(GLenum target, GLuint id, GLenum pname, GLuint param) { fp_glQueryObjectParameteruiAMD(target, id, pname, param); }\n\n/* GL_AMD_performance_monitor */\ninline void glGetPerfMonitorGroupsAMD(GLint* numGroups, GLsizei groupsSize, GLuint* groups) { fp_glGetPerfMonitorGroupsAMD(numGroups, groupsSize, groups); }\ninline void glGetPerfMonitorCountersAMD(GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize, GLuint* counters) { fp_glGetPerfMonitorCountersAMD(group, numCounters, maxActiveCounters, counterSize, counters); }\ninline void glGetPerfMonitorGroupStringAMD(GLuint group, GLsizei bufSize, GLsizei* length, GLchar* groupString) { fp_glGetPerfMonitorGroupStringAMD(group, bufSize, length, groupString); }\ninline void glGetPerfMonitorCounterStringAMD(GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, GLchar* counterString) { fp_glGetPerfMonitorCounterStringAMD(group, counter, bufSize, length, counterString); }\ninline void glGetPerfMonitorCounterInfoAMD(GLuint group, GLuint counter, GLenum pname, void* data) { fp_glGetPerfMonitorCounterInfoAMD(group, counter, pname, data); }\ninline void glGenPerfMonitorsAMD(GLsizei n, GLuint* monitors) { fp_glGenPerfMonitorsAMD(n, monitors); }\ninline void glDeletePerfMonitorsAMD(GLsizei n, GLuint* monitors) { fp_glDeletePerfMonitorsAMD(n, monitors); }\ninline void glSelectPerfMonitorCountersAMD(GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* counterList) { fp_glSelectPerfMonitorCountersAMD(monitor, enable, group, numCounters, counterList); }\ninline void glBeginPerfMonitorAMD(GLuint monitor) { fp_glBeginPerfMonitorAMD(monitor); }\ninline void glEndPerfMonitorAMD(GLuint monitor) { fp_glEndPerfMonitorAMD(monitor); }\ninline void glGetPerfMonitorCounterDataAMD(GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint* bytesWritten) { fp_glGetPerfMonitorCounterDataAMD(monitor, pname, dataSize, data, bytesWritten); }\n\n/* GL_AMD_sample_positions */\ninline void glSetMultisamplefvAMD(GLenum pname, GLuint index, const GLfloat* val) { fp_glSetMultisamplefvAMD(pname, index, val); }\n\n/* GL_AMD_sparse_texture */\ninline void glTexStorageSparseAMD(GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags) { fp_glTexStorageSparseAMD(target, internalFormat, width, height, depth, layers, flags); }\ninline void glTextureStorageSparseAMD(GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags) { fp_glTextureStorageSparseAMD(texture, target, internalFormat, width, height, depth, layers, flags); }\n\n/* GL_AMD_stencil_operation_extended */\ninline void glStencilOpValueAMD(GLenum face, GLuint value) { fp_glStencilOpValueAMD(face, value); }\n\n/* GL_AMD_vertex_shader_tessellator */\ninline void glTessellationFactorAMD(GLfloat factor) { fp_glTessellationFactorAMD(factor); }\ninline void glTessellationModeAMD(GLenum mode) { fp_glTessellationModeAMD(mode); }\n\n/* GL_ANGLE_framebuffer_blit */\ninline void glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { fp_glBlitFramebufferANGLE(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); }\n\n/* GL_ANGLE_framebuffer_multisample */\ninline void glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { fp_glRenderbufferStorageMultisampleANGLE(target, samples, internalformat, width, height); }\n\n/* GL_ANGLE_instanced_arrays */\ninline void glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount) { fp_glDrawArraysInstancedANGLE(mode, first, count, primcount); }\ninline void glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount) { fp_glDrawElementsInstancedANGLE(mode, count, type, indices, primcount); }\ninline void glVertexAttribDivisorANGLE(GLuint index, GLuint divisor) { fp_glVertexAttribDivisorANGLE(index, divisor); }\n\n/* GL_ANGLE_translated_shader_source */\ninline void glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source) { fp_glGetTranslatedShaderSourceANGLE(shader, bufsize, length, source); }\n\n/* GL_APPLE_copy_texture_levels */\ninline void glCopyTextureLevelsAPPLE(GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount) { fp_glCopyTextureLevelsAPPLE(destinationTexture, sourceTexture, sourceBaseLevel, sourceLevelCount); }\n\n/* GL_APPLE_element_array */\ninline void glElementPointerAPPLE(GLenum type, const void* pointer) { fp_glElementPointerAPPLE(type, pointer); }\ninline void glDrawElementArrayAPPLE(GLenum mode, GLint first, GLsizei count) { fp_glDrawElementArrayAPPLE(mode, first, count); }\ninline void glDrawRangeElementArrayAPPLE(GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count) { fp_glDrawRangeElementArrayAPPLE(mode, start, end, first, count); }\ninline void glMultiDrawElementArrayAPPLE(GLenum mode, const GLint* first, const GLsizei* count, GLsizei primcount) { fp_glMultiDrawElementArrayAPPLE(mode, first, count, primcount); }\ninline void glMultiDrawRangeElementArrayAPPLE(GLenum mode, GLuint start, GLuint end, const GLint* first, const GLsizei* count, GLsizei primcount) { fp_glMultiDrawRangeElementArrayAPPLE(mode, start, end, first, count, primcount); }\n\n/* GL_APPLE_fence */\ninline void glGenFencesAPPLE(GLsizei n, GLuint* fences) { fp_glGenFencesAPPLE(n, fences); }\ninline void glDeleteFencesAPPLE(GLsizei n, const GLuint* fences) { fp_glDeleteFencesAPPLE(n, fences); }\ninline void glSetFenceAPPLE(GLuint fence) { fp_glSetFenceAPPLE(fence); }\ninline GLboolean glIsFenceAPPLE(GLuint fence) { return fp_glIsFenceAPPLE(fence); }\ninline GLboolean glTestFenceAPPLE(GLuint fence) { return fp_glTestFenceAPPLE(fence); }\ninline void glFinishFenceAPPLE(GLuint fence) { fp_glFinishFenceAPPLE(fence); }\ninline GLboolean glTestObjectAPPLE(GLenum object, GLuint name) { return fp_glTestObjectAPPLE(object, name); }\ninline void glFinishObjectAPPLE(GLenum object, GLint name) { fp_glFinishObjectAPPLE(object, name); }\n\n/* GL_APPLE_flush_buffer_range */\ninline void glBufferParameteriAPPLE(GLenum target, GLenum pname, GLint param) { fp_glBufferParameteriAPPLE(target, pname, param); }\ninline void glFlushMappedBufferRangeAPPLE(GLenum target, GLintptr offset, GLsizeiptr size) { fp_glFlushMappedBufferRangeAPPLE(target, offset, size); }\n\n/* GL_APPLE_framebuffer_multisample */\ninline void glRenderbufferStorageMultisampleAPPLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { fp_glRenderbufferStorageMultisampleAPPLE(target, samples, internalformat, width, height); }\ninline void glResolveMultisampleFramebufferAPPLE() { fp_glResolveMultisampleFramebufferAPPLE(); }\n\n/* GL_APPLE_object_purgeable */\ninline GLenum glObjectPurgeableAPPLE(GLenum objectType, GLuint name, GLenum option) { return fp_glObjectPurgeableAPPLE(objectType, name, option); }\ninline GLenum glObjectUnpurgeableAPPLE(GLenum objectType, GLuint name, GLenum option) { return fp_glObjectUnpurgeableAPPLE(objectType, name, option); }\ninline void glGetObjectParameterivAPPLE(GLenum objectType, GLuint name, GLenum pname, GLint* params) { fp_glGetObjectParameterivAPPLE(objectType, name, pname, params); }\n\n/* GL_APPLE_sync */\ninline GLsync glFenceSyncAPPLE(GLenum condition, GLbitfield flags) { return fp_glFenceSyncAPPLE(condition, flags); }\ninline GLboolean glIsSyncAPPLE(GLsync sync) { return fp_glIsSyncAPPLE(sync); }\ninline void glDeleteSyncAPPLE(GLsync sync) { fp_glDeleteSyncAPPLE(sync); }\ninline GLenum glClientWaitSyncAPPLE(GLsync sync, GLbitfield flags, GLuint64 timeout) { return fp_glClientWaitSyncAPPLE(sync, flags, timeout); }\ninline void glWaitSyncAPPLE(GLsync sync, GLbitfield flags, GLuint64 timeout) { fp_glWaitSyncAPPLE(sync, flags, timeout); }\ninline void glGetInteger64vAPPLE(GLenum pname, GLint64* params) { fp_glGetInteger64vAPPLE(pname, params); }\ninline void glGetSyncivAPPLE(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values) { fp_glGetSyncivAPPLE(sync, pname, bufSize, length, values); }\n\n/* GL_APPLE_texture_range */\ninline void glTextureRangeAPPLE(GLenum target, GLsizei length, const void* pointer) { fp_glTextureRangeAPPLE(target, length, pointer); }\ninline void glGetTexParameterPointervAPPLE(GLenum target, GLenum pname, void** params) { fp_glGetTexParameterPointervAPPLE(target, pname, params); }\n\n/* GL_APPLE_vertex_array_object */\ninline void glBindVertexArrayAPPLE(GLuint array) { fp_glBindVertexArrayAPPLE(array); }\ninline void glDeleteVertexArraysAPPLE(GLsizei n, const GLuint* arrays) { fp_glDeleteVertexArraysAPPLE(n, arrays); }\ninline void glGenVertexArraysAPPLE(GLsizei n, GLuint* arrays) { fp_glGenVertexArraysAPPLE(n, arrays); }\ninline GLboolean glIsVertexArrayAPPLE(GLuint array) { return fp_glIsVertexArrayAPPLE(array); }\n\n/* GL_APPLE_vertex_array_range */\ninline void glVertexArrayRangeAPPLE(GLsizei length, void* pointer) { fp_glVertexArrayRangeAPPLE(length, pointer); }\ninline void glFlushVertexArrayRangeAPPLE(GLsizei length, void* pointer) { fp_glFlushVertexArrayRangeAPPLE(length, pointer); }\ninline void glVertexArrayParameteriAPPLE(GLenum pname, GLint param) { fp_glVertexArrayParameteriAPPLE(pname, param); }\n\n/* GL_APPLE_vertex_program_evaluators */\ninline void glEnableVertexAttribAPPLE(GLuint index, GLenum pname) { fp_glEnableVertexAttribAPPLE(index, pname); }\ninline void glDisableVertexAttribAPPLE(GLuint index, GLenum pname) { fp_glDisableVertexAttribAPPLE(index, pname); }\ninline GLboolean glIsVertexAttribEnabledAPPLE(GLuint index, GLenum pname) { return fp_glIsVertexAttribEnabledAPPLE(index, pname); }\ninline void glMapVertexAttrib1dAPPLE(GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble* points) { fp_glMapVertexAttrib1dAPPLE(index, size, u1, u2, stride, order, points); }\ninline void glMapVertexAttrib1fAPPLE(GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat* points) { fp_glMapVertexAttrib1fAPPLE(index, size, u1, u2, stride, order, points); }\ninline void glMapVertexAttrib2dAPPLE(GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble* points) { fp_glMapVertexAttrib2dAPPLE(index, size, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points); }\ninline void glMapVertexAttrib2fAPPLE(GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat* points) { fp_glMapVertexAttrib2fAPPLE(index, size, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points); }\n\n/* GL_GREMEDY_frame_terminator */\ninline void glFrameTerminatorGREMEDY() { fp_glFrameTerminatorGREMEDY(); }\n\n/* GL_GREMEDY_string_marker */\ninline void glStringMarkerGREMEDY(GLsizei len, const void* string) { fp_glStringMarkerGREMEDY(len, string); }\n\n/* GL_IMG_multisampled_render_to_texture */\ninline void glRenderbufferStorageMultisampleIMG(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { fp_glRenderbufferStorageMultisampleIMG(target, samples, internalformat, width, height); }\ninline void glFramebufferTexture2DMultisampleIMG(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples) { fp_glFramebufferTexture2DMultisampleIMG(target, attachment, textarget, texture, level, samples); }\n\n/* GL_INGR_blend_func_separate */\ninline void glBlendFuncSeparateINGR(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) { fp_glBlendFuncSeparateINGR(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); }\n\n/* GL_INTEL_framebuffer_CMAA */\ninline void glApplyFramebufferAttachmentCMAAINTEL() { fp_glApplyFramebufferAttachmentCMAAINTEL(); }\n\n/* GL_INTEL_map_texture */\ninline void glSyncTextureINTEL(GLuint texture) { fp_glSyncTextureINTEL(texture); }\ninline void glUnmapTexture2DINTEL(GLuint texture, GLint level) { fp_glUnmapTexture2DINTEL(texture, level); }\ninline void* glMapTexture2DINTEL(GLuint texture, GLint level, GLbitfield access, GLint* stride, GLenum* layout) { return fp_glMapTexture2DINTEL(texture, level, access, stride, layout); }\n\n/* GL_INTEL_performance_query */\ninline void glBeginPerfQueryINTEL(GLuint queryHandle) { fp_glBeginPerfQueryINTEL(queryHandle); }\ninline void glCreatePerfQueryINTEL(GLuint queryId, GLuint* queryHandle) { fp_glCreatePerfQueryINTEL(queryId, queryHandle); }\ninline void glDeletePerfQueryINTEL(GLuint queryHandle) { fp_glDeletePerfQueryINTEL(queryHandle); }\ninline void glEndPerfQueryINTEL(GLuint queryHandle) { fp_glEndPerfQueryINTEL(queryHandle); }\ninline void glGetFirstPerfQueryIdINTEL(GLuint* queryId) { fp_glGetFirstPerfQueryIdINTEL(queryId); }\ninline void glGetNextPerfQueryIdINTEL(GLuint queryId, GLuint* nextQueryId) { fp_glGetNextPerfQueryIdINTEL(queryId, nextQueryId); }\ninline void glGetPerfCounterInfoINTEL(GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar* counterName, GLuint counterDescLength, GLchar* counterDesc, GLuint* counterOffset, GLuint* counterDataSize, GLuint* counterTypeEnum, GLuint* counterDataTypeEnum, GLuint64* rawCounterMaxValue) { fp_glGetPerfCounterInfoINTEL(queryId, counterId, counterNameLength, counterName, counterDescLength, counterDesc, counterOffset, counterDataSize, counterTypeEnum, counterDataTypeEnum, rawCounterMaxValue); }\ninline void glGetPerfQueryDataINTEL(GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid* data, GLuint* bytesWritten) { fp_glGetPerfQueryDataINTEL(queryHandle, flags, dataSize, data, bytesWritten); }\ninline void glGetPerfQueryIdByNameINTEL(GLchar* queryName, GLuint* queryId) { fp_glGetPerfQueryIdByNameINTEL(queryName, queryId); }\ninline void glGetPerfQueryInfoINTEL(GLuint queryId, GLuint queryNameLength, GLchar* queryName, GLuint* dataSize, GLuint* noCounters, GLuint* noInstances, GLuint* capsMask) { fp_glGetPerfQueryInfoINTEL(queryId, queryNameLength, queryName, dataSize, noCounters, noInstances, capsMask); }\n\n/* GL_NV_bindless_multi_draw_indirect */\ninline void glMultiDrawArraysIndirectBindlessNV(GLenum mode, const void* indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount) { fp_glMultiDrawArraysIndirectBindlessNV(mode, indirect, drawCount, stride, vertexBufferCount); }\ninline void glMultiDrawElementsIndirectBindlessNV(GLenum mode, GLenum type, const void* indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount) { fp_glMultiDrawElementsIndirectBindlessNV(mode, type, indirect, drawCount, stride, vertexBufferCount); }\n\n/* GL_NV_bindless_multi_draw_indirect_count */\ninline void glMultiDrawArraysIndirectBindlessCountNV(GLenum mode, const void* indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount) { fp_glMultiDrawArraysIndirectBindlessCountNV(mode, indirect, drawCount, maxDrawCount, stride, vertexBufferCount); }\ninline void glMultiDrawElementsIndirectBindlessCountNV(GLenum mode, GLenum type, const void* indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount) { fp_glMultiDrawElementsIndirectBindlessCountNV(mode, type, indirect, drawCount, maxDrawCount, stride, vertexBufferCount); }\n\n/* GL_NV_bindless_texture */\ninline GLuint64 glGetTextureHandleNV(GLuint texture) { return fp_glGetTextureHandleNV(texture); }\ninline GLuint64 glGetTextureSamplerHandleNV(GLuint texture, GLuint sampler) { return fp_glGetTextureSamplerHandleNV(texture, sampler); }\ninline void glMakeTextureHandleResidentNV(GLuint64 handle) { fp_glMakeTextureHandleResidentNV(handle); }\ninline void glMakeTextureHandleNonResidentNV(GLuint64 handle) { fp_glMakeTextureHandleNonResidentNV(handle); }\ninline GLuint64 glGetImageHandleNV(GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format) { return fp_glGetImageHandleNV(texture, level, layered, layer, format); }\ninline void glMakeImageHandleResidentNV(GLuint64 handle, GLenum access) { fp_glMakeImageHandleResidentNV(handle, access); }\ninline void glMakeImageHandleNonResidentNV(GLuint64 handle) { fp_glMakeImageHandleNonResidentNV(handle); }\ninline void glUniformHandleui64NV(GLint location, GLuint64 value) { fp_glUniformHandleui64NV(location, value); }\ninline void glUniformHandleui64vNV(GLint location, GLsizei count, const GLuint64* value) { fp_glUniformHandleui64vNV(location, count, value); }\ninline void glProgramUniformHandleui64NV(GLuint program, GLint location, GLuint64 value) { fp_glProgramUniformHandleui64NV(program, location, value); }\ninline void glProgramUniformHandleui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64* values) { fp_glProgramUniformHandleui64vNV(program, location, count, values); }\ninline GLboolean glIsTextureHandleResidentNV(GLuint64 handle) { return fp_glIsTextureHandleResidentNV(handle); }\ninline GLboolean glIsImageHandleResidentNV(GLuint64 handle) { return fp_glIsImageHandleResidentNV(handle); }\n\n/* GL_NV_blend_equation_advanced */\ninline void glBlendParameteriNV(GLenum pname, GLint value) { fp_glBlendParameteriNV(pname, value); }\ninline void glBlendBarrierNV() { fp_glBlendBarrierNV(); }\n\n/* GL_NV_command_list */\ninline void glCreateStatesNV(GLsizei n, GLuint* states) { fp_glCreateStatesNV(n, states); }\ninline void glDeleteStatesNV(GLsizei n, const GLuint* states) { fp_glDeleteStatesNV(n, states); }\ninline GLboolean glIsStateNV(GLuint state) { return fp_glIsStateNV(state); }\ninline void glStateCaptureNV(GLuint state, GLenum mode) { fp_glStateCaptureNV(state, mode); }\ninline GLuint glGetCommandHeaderNV(GLenum tokenID, GLuint size) { return fp_glGetCommandHeaderNV(tokenID, size); }\ninline GLushort glGetStageIndexNV(GLenum shadertype) { return fp_glGetStageIndexNV(shadertype); }\ninline void glDrawCommandsNV(GLenum primitiveMode, GLuint buffer, const GLintptr* indirects, const GLsizei* sizes, GLuint count) { fp_glDrawCommandsNV(primitiveMode, buffer, indirects, sizes, count); }\ninline void glDrawCommandsAddressNV(GLenum primitiveMode, const GLuint64* indirects, const GLsizei* sizes, GLuint count) { fp_glDrawCommandsAddressNV(primitiveMode, indirects, sizes, count); }\ninline void glDrawCommandsStatesNV(GLuint buffer, const GLintptr* indirects, const GLsizei* sizes, const GLuint* states, const GLuint* fbos, GLuint count) { fp_glDrawCommandsStatesNV(buffer, indirects, sizes, states, fbos, count); }\ninline void glDrawCommandsStatesAddressNV(const GLuint64* indirects, const GLsizei* sizes, const GLuint* states, const GLuint* fbos, GLuint count) { fp_glDrawCommandsStatesAddressNV(indirects, sizes, states, fbos, count); }\ninline void glCreateCommandListsNV(GLsizei n, GLuint* lists) { fp_glCreateCommandListsNV(n, lists); }\ninline void glDeleteCommandListsNV(GLsizei n, const GLuint* lists) { fp_glDeleteCommandListsNV(n, lists); }\ninline GLboolean glIsCommandListNV(GLuint list) { return fp_glIsCommandListNV(list); }\ninline void glListDrawCommandsStatesClientNV(GLuint list, GLuint segment, const void** indirects, const GLsizei* sizes, const GLuint* states, const GLuint* fbos, GLuint count) { fp_glListDrawCommandsStatesClientNV(list, segment, indirects, sizes, states, fbos, count); }\ninline void glCommandListSegmentsNV(GLuint list, GLuint segments) { fp_glCommandListSegmentsNV(list, segments); }\ninline void glCompileCommandListNV(GLuint list) { fp_glCompileCommandListNV(list); }\ninline void glCallCommandListNV(GLuint list) { fp_glCallCommandListNV(list); }\n\n/* GL_NV_conditional_render */\ninline void glBeginConditionalRenderNV(GLuint id, GLenum mode) { fp_glBeginConditionalRenderNV(id, mode); }\ninline void glEndConditionalRenderNV() { fp_glEndConditionalRenderNV(); }\n\n/* GL_NV_conservative_raster */\ninline void glSubpixelPrecisionBiasNV(GLuint xbits, GLuint ybits) { fp_glSubpixelPrecisionBiasNV(xbits, ybits); }\n\n/* GL_NV_conservative_raster_dilate */\ninline void glConservativeRasterParameterfNV(GLenum pname, GLfloat value) { fp_glConservativeRasterParameterfNV(pname, value); }\n\n/* GL_NV_copy_buffer */\ninline void glCopyBufferSubDataNV(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) { fp_glCopyBufferSubDataNV(readTarget, writeTarget, readOffset, writeOffset, size); }\n\n/* GL_NV_copy_image */\ninline void glCopyImageSubDataNV(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth) { fp_glCopyImageSubDataNV(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, width, height, depth); }\n\n/* GL_NV_coverage_sample */\ninline void glCoverageMaskNV(GLboolean mask) { fp_glCoverageMaskNV(mask); }\ninline void glCoverageOperationNV(GLenum operation) { fp_glCoverageOperationNV(operation); }\n\n/* GL_NV_depth_buffer_float */\ninline void glDepthRangedNV(GLdouble zNear, GLdouble zFar) { fp_glDepthRangedNV(zNear, zFar); }\ninline void glClearDepthdNV(GLdouble depth) { fp_glClearDepthdNV(depth); }\ninline void glDepthBoundsdNV(GLdouble zmin, GLdouble zmax) { fp_glDepthBoundsdNV(zmin, zmax); }\n\n/* GL_NV_draw_buffers */\ninline void glDrawBuffersNV(GLsizei n, const GLenum* bufs) { fp_glDrawBuffersNV(n, bufs); }\n\n/* GL_NV_draw_instanced */\ninline void glDrawArraysInstancedNV(GLenum mode, GLint first, GLsizei count, GLsizei primcount) { fp_glDrawArraysInstancedNV(mode, first, count, primcount); }\ninline void glDrawElementsInstancedNV(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount) { fp_glDrawElementsInstancedNV(mode, count, type, indices, primcount); }\n\n/* GL_NV_draw_texture */\ninline void glDrawTextureNV(GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1) { fp_glDrawTextureNV(texture, sampler, x0, y0, x1, y1, z, s0, t0, s1, t1); }\n\n/* GL_NV_explicit_multisample */\ninline void glGetMultisamplefvNV(GLenum pname, GLuint index, GLfloat* val) { fp_glGetMultisamplefvNV(pname, index, val); }\ninline void glSampleMaskIndexedNV(GLuint index, GLbitfield mask) { fp_glSampleMaskIndexedNV(index, mask); }\ninline void glTexRenderbufferNV(GLenum target, GLuint renderbuffer) { fp_glTexRenderbufferNV(target, renderbuffer); }\n\n/* GL_NV_fence */\ninline void glDeleteFencesNV(GLsizei n, const GLuint* fences) { fp_glDeleteFencesNV(n, fences); }\ninline void glGenFencesNV(GLsizei n, GLuint* fences) { fp_glGenFencesNV(n, fences); }\ninline GLboolean glIsFenceNV(GLuint fence) { return fp_glIsFenceNV(fence); }\ninline GLboolean glTestFenceNV(GLuint fence) { return fp_glTestFenceNV(fence); }\ninline void glGetFenceivNV(GLuint fence, GLenum pname, GLint* params) { fp_glGetFenceivNV(fence, pname, params); }\ninline void glFinishFenceNV(GLuint fence) { fp_glFinishFenceNV(fence); }\ninline void glSetFenceNV(GLuint fence, GLenum condition) { fp_glSetFenceNV(fence, condition); }\n\n/* GL_NV_fragment_coverage_to_color */\ninline void glFragmentCoverageColorNV(GLuint color) { fp_glFragmentCoverageColorNV(color); }\n\n/* GL_NV_framebuffer_blit */\ninline void glBlitFramebufferNV(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { fp_glBlitFramebufferNV(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); }\n\n/* GL_NV_framebuffer_mixed_samples */\ninline void glCoverageModulationTableNV(GLsizei n, const GLfloat* v) { fp_glCoverageModulationTableNV(n, v); }\ninline void glGetCoverageModulationTableNV(GLsizei bufsize, GLfloat* v) { fp_glGetCoverageModulationTableNV(bufsize, v); }\ninline void glCoverageModulationNV(GLenum components) { fp_glCoverageModulationNV(components); }\n\n/* GL_NV_framebuffer_multisample */\ninline void glRenderbufferStorageMultisampleNV(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { fp_glRenderbufferStorageMultisampleNV(target, samples, internalformat, width, height); }\n\n/* GL_NV_framebuffer_multisample_coverage */\ninline void glRenderbufferStorageMultisampleCoverageNV(GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height) { fp_glRenderbufferStorageMultisampleCoverageNV(target, coverageSamples, colorSamples, internalformat, width, height); }\n\n/* GL_NV_geometry_program4 */\ninline void glProgramVertexLimitNV(GLenum target, GLint limit) { fp_glProgramVertexLimitNV(target, limit); }\ninline void glFramebufferTextureFaceEXT(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face) { fp_glFramebufferTextureFaceEXT(target, attachment, texture, level, face); }\n\n/* GL_NV_gpu_program4 */\ninline void glProgramLocalParameterI4iNV(GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w) { fp_glProgramLocalParameterI4iNV(target, index, x, y, z, w); }\ninline void glProgramLocalParameterI4ivNV(GLenum target, GLuint index, const GLint* params) { fp_glProgramLocalParameterI4ivNV(target, index, params); }\ninline void glProgramLocalParametersI4ivNV(GLenum target, GLuint index, GLsizei count, const GLint* params) { fp_glProgramLocalParametersI4ivNV(target, index, count, params); }\ninline void glProgramLocalParameterI4uiNV(GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) { fp_glProgramLocalParameterI4uiNV(target, index, x, y, z, w); }\ninline void glProgramLocalParameterI4uivNV(GLenum target, GLuint index, const GLuint* params) { fp_glProgramLocalParameterI4uivNV(target, index, params); }\ninline void glProgramLocalParametersI4uivNV(GLenum target, GLuint index, GLsizei count, const GLuint* params) { fp_glProgramLocalParametersI4uivNV(target, index, count, params); }\ninline void glProgramEnvParameterI4iNV(GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w) { fp_glProgramEnvParameterI4iNV(target, index, x, y, z, w); }\ninline void glProgramEnvParameterI4ivNV(GLenum target, GLuint index, const GLint* params) { fp_glProgramEnvParameterI4ivNV(target, index, params); }\ninline void glProgramEnvParametersI4ivNV(GLenum target, GLuint index, GLsizei count, const GLint* params) { fp_glProgramEnvParametersI4ivNV(target, index, count, params); }\ninline void glProgramEnvParameterI4uiNV(GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) { fp_glProgramEnvParameterI4uiNV(target, index, x, y, z, w); }\ninline void glProgramEnvParameterI4uivNV(GLenum target, GLuint index, const GLuint* params) { fp_glProgramEnvParameterI4uivNV(target, index, params); }\ninline void glProgramEnvParametersI4uivNV(GLenum target, GLuint index, GLsizei count, const GLuint* params) { fp_glProgramEnvParametersI4uivNV(target, index, count, params); }\ninline void glGetProgramLocalParameterIivNV(GLenum target, GLuint index, GLint* params) { fp_glGetProgramLocalParameterIivNV(target, index, params); }\ninline void glGetProgramLocalParameterIuivNV(GLenum target, GLuint index, GLuint* params) { fp_glGetProgramLocalParameterIuivNV(target, index, params); }\ninline void glGetProgramEnvParameterIivNV(GLenum target, GLuint index, GLint* params) { fp_glGetProgramEnvParameterIivNV(target, index, params); }\ninline void glGetProgramEnvParameterIuivNV(GLenum target, GLuint index, GLuint* params) { fp_glGetProgramEnvParameterIuivNV(target, index, params); }\n\n/* GL_NV_gpu_program5 */\ninline void glProgramSubroutineParametersuivNV(GLenum target, GLsizei count, const GLuint* params) { fp_glProgramSubroutineParametersuivNV(target, count, params); }\ninline void glGetProgramSubroutineParameteruivNV(GLenum target, GLuint index, GLuint* param) { fp_glGetProgramSubroutineParameteruivNV(target, index, param); }\n\n/* GL_NV_half_float */\ninline void glVertex2hNV(GLhalfNV x, GLhalfNV y) { fp_glVertex2hNV(x, y); }\ninline void glVertex2hvNV(const GLhalfNV* v) { fp_glVertex2hvNV(v); }\ninline void glVertex3hNV(GLhalfNV x, GLhalfNV y, GLhalfNV z) { fp_glVertex3hNV(x, y, z); }\ninline void glVertex3hvNV(const GLhalfNV* v) { fp_glVertex3hvNV(v); }\ninline void glVertex4hNV(GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w) { fp_glVertex4hNV(x, y, z, w); }\ninline void glVertex4hvNV(const GLhalfNV* v) { fp_glVertex4hvNV(v); }\ninline void glNormal3hNV(GLhalfNV nx, GLhalfNV ny, GLhalfNV nz) { fp_glNormal3hNV(nx, ny, nz); }\ninline void glNormal3hvNV(const GLhalfNV* v) { fp_glNormal3hvNV(v); }\ninline void glColor3hNV(GLhalfNV red, GLhalfNV green, GLhalfNV blue) { fp_glColor3hNV(red, green, blue); }\ninline void glColor3hvNV(const GLhalfNV* v) { fp_glColor3hvNV(v); }\ninline void glColor4hNV(GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha) { fp_glColor4hNV(red, green, blue, alpha); }\ninline void glColor4hvNV(const GLhalfNV* v) { fp_glColor4hvNV(v); }\ninline void glTexCoord1hNV(GLhalfNV s) { fp_glTexCoord1hNV(s); }\ninline void glTexCoord1hvNV(const GLhalfNV* v) { fp_glTexCoord1hvNV(v); }\ninline void glTexCoord2hNV(GLhalfNV s, GLhalfNV t) { fp_glTexCoord2hNV(s, t); }\ninline void glTexCoord2hvNV(const GLhalfNV* v) { fp_glTexCoord2hvNV(v); }\ninline void glTexCoord3hNV(GLhalfNV s, GLhalfNV t, GLhalfNV r) { fp_glTexCoord3hNV(s, t, r); }\ninline void glTexCoord3hvNV(const GLhalfNV* v) { fp_glTexCoord3hvNV(v); }\ninline void glTexCoord4hNV(GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q) { fp_glTexCoord4hNV(s, t, r, q); }\ninline void glTexCoord4hvNV(const GLhalfNV* v) { fp_glTexCoord4hvNV(v); }\ninline void glMultiTexCoord1hNV(GLenum target, GLhalfNV s) { fp_glMultiTexCoord1hNV(target, s); }\ninline void glMultiTexCoord1hvNV(GLenum target, const GLhalfNV* v) { fp_glMultiTexCoord1hvNV(target, v); }\ninline void glMultiTexCoord2hNV(GLenum target, GLhalfNV s, GLhalfNV t) { fp_glMultiTexCoord2hNV(target, s, t); }\ninline void glMultiTexCoord2hvNV(GLenum target, const GLhalfNV* v) { fp_glMultiTexCoord2hvNV(target, v); }\ninline void glMultiTexCoord3hNV(GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r) { fp_glMultiTexCoord3hNV(target, s, t, r); }\ninline void glMultiTexCoord3hvNV(GLenum target, const GLhalfNV* v) { fp_glMultiTexCoord3hvNV(target, v); }\ninline void glMultiTexCoord4hNV(GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q) { fp_glMultiTexCoord4hNV(target, s, t, r, q); }\ninline void glMultiTexCoord4hvNV(GLenum target, const GLhalfNV* v) { fp_glMultiTexCoord4hvNV(target, v); }\ninline void glFogCoordhNV(GLhalfNV fog) { fp_glFogCoordhNV(fog); }\ninline void glFogCoordhvNV(const GLhalfNV* fog) { fp_glFogCoordhvNV(fog); }\ninline void glSecondaryColor3hNV(GLhalfNV red, GLhalfNV green, GLhalfNV blue) { fp_glSecondaryColor3hNV(red, green, blue); }\ninline void glSecondaryColor3hvNV(const GLhalfNV* v) { fp_glSecondaryColor3hvNV(v); }\ninline void glVertexWeighthNV(GLhalfNV weight) { fp_glVertexWeighthNV(weight); }\ninline void glVertexWeighthvNV(const GLhalfNV* weight) { fp_glVertexWeighthvNV(weight); }\ninline void glVertexAttrib1hNV(GLuint index, GLhalfNV x) { fp_glVertexAttrib1hNV(index, x); }\ninline void glVertexAttrib1hvNV(GLuint index, const GLhalfNV* v) { fp_glVertexAttrib1hvNV(index, v); }\ninline void glVertexAttrib2hNV(GLuint index, GLhalfNV x, GLhalfNV y) { fp_glVertexAttrib2hNV(index, x, y); }\ninline void glVertexAttrib2hvNV(GLuint index, const GLhalfNV* v) { fp_glVertexAttrib2hvNV(index, v); }\ninline void glVertexAttrib3hNV(GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z) { fp_glVertexAttrib3hNV(index, x, y, z); }\ninline void glVertexAttrib3hvNV(GLuint index, const GLhalfNV* v) { fp_glVertexAttrib3hvNV(index, v); }\ninline void glVertexAttrib4hNV(GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w) { fp_glVertexAttrib4hNV(index, x, y, z, w); }\ninline void glVertexAttrib4hvNV(GLuint index, const GLhalfNV* v) { fp_glVertexAttrib4hvNV(index, v); }\ninline void glVertexAttribs1hvNV(GLuint index, GLsizei n, const GLhalfNV* v) { fp_glVertexAttribs1hvNV(index, n, v); }\ninline void glVertexAttribs2hvNV(GLuint index, GLsizei n, const GLhalfNV* v) { fp_glVertexAttribs2hvNV(index, n, v); }\ninline void glVertexAttribs3hvNV(GLuint index, GLsizei n, const GLhalfNV* v) { fp_glVertexAttribs3hvNV(index, n, v); }\ninline void glVertexAttribs4hvNV(GLuint index, GLsizei n, const GLhalfNV* v) { fp_glVertexAttribs4hvNV(index, n, v); }\n\n/* GL_NV_instanced_arrays */\ninline void glVertexAttribDivisorNV(GLuint index, GLuint divisor) { fp_glVertexAttribDivisorNV(index, divisor); }\n\n/* GL_NV_internalformat_sample_query */\ninline void glGetInternalformatSampleivNV(GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint* params) { fp_glGetInternalformatSampleivNV(target, internalformat, samples, pname, bufSize, params); }\n\n/* GL_NV_non_square_matrices */\ninline void glUniformMatrix2x3fvNV(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix2x3fvNV(location, count, transpose, value); }\ninline void glUniformMatrix3x2fvNV(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix3x2fvNV(location, count, transpose, value); }\ninline void glUniformMatrix2x4fvNV(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix2x4fvNV(location, count, transpose, value); }\ninline void glUniformMatrix4x2fvNV(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix4x2fvNV(location, count, transpose, value); }\ninline void glUniformMatrix3x4fvNV(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix3x4fvNV(location, count, transpose, value); }\ninline void glUniformMatrix4x3fvNV(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix4x3fvNV(location, count, transpose, value); }\n\n/* GL_NV_occlusion_query */\ninline void glGenOcclusionQueriesNV(GLsizei n, GLuint* ids) { fp_glGenOcclusionQueriesNV(n, ids); }\ninline void glDeleteOcclusionQueriesNV(GLsizei n, const GLuint* ids) { fp_glDeleteOcclusionQueriesNV(n, ids); }\ninline GLboolean glIsOcclusionQueryNV(GLuint id) { return fp_glIsOcclusionQueryNV(id); }\ninline void glBeginOcclusionQueryNV(GLuint id) { fp_glBeginOcclusionQueryNV(id); }\ninline void glEndOcclusionQueryNV() { fp_glEndOcclusionQueryNV(); }\ninline void glGetOcclusionQueryivNV(GLuint id, GLenum pname, GLint* params) { fp_glGetOcclusionQueryivNV(id, pname, params); }\ninline void glGetOcclusionQueryuivNV(GLuint id, GLenum pname, GLuint* params) { fp_glGetOcclusionQueryuivNV(id, pname, params); }\n\n/* GL_NV_parameter_buffer_object */\ninline void glProgramBufferParametersfvNV(GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat* params) { fp_glProgramBufferParametersfvNV(target, bindingIndex, wordIndex, count, params); }\ninline void glProgramBufferParametersIivNV(GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint* params) { fp_glProgramBufferParametersIivNV(target, bindingIndex, wordIndex, count, params); }\ninline void glProgramBufferParametersIuivNV(GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint* params) { fp_glProgramBufferParametersIuivNV(target, bindingIndex, wordIndex, count, params); }\n\n/* GL_NV_path_rendering */\ninline GLuint glGenPathsNV(GLsizei range) { return fp_glGenPathsNV(range); }\ninline void glDeletePathsNV(GLuint path, GLsizei range) { fp_glDeletePathsNV(path, range); }\ninline GLboolean glIsPathNV(GLuint path) { return fp_glIsPathNV(path); }\ninline void glPathCommandsNV(GLuint path, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void* coords) { fp_glPathCommandsNV(path, numCommands, commands, numCoords, coordType, coords); }\ninline void glPathCoordsNV(GLuint path, GLsizei numCoords, GLenum coordType, const void* coords) { fp_glPathCoordsNV(path, numCoords, coordType, coords); }\ninline void glPathSubCommandsNV(GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void* coords) { fp_glPathSubCommandsNV(path, commandStart, commandsToDelete, numCommands, commands, numCoords, coordType, coords); }\ninline void glPathSubCoordsNV(GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void* coords) { fp_glPathSubCoordsNV(path, coordStart, numCoords, coordType, coords); }\ninline void glPathStringNV(GLuint path, GLenum format, GLsizei length, const void* pathString) { fp_glPathStringNV(path, format, length, pathString); }\ninline void glPathGlyphsNV(GLuint firstPathName, GLenum fontTarget, const void* fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void* charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale) { fp_glPathGlyphsNV(firstPathName, fontTarget, fontName, fontStyle, numGlyphs, type, charcodes, handleMissingGlyphs, pathParameterTemplate, emScale); }\ninline void glPathGlyphRangeNV(GLuint firstPathName, GLenum fontTarget, const void* fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale) { fp_glPathGlyphRangeNV(firstPathName, fontTarget, fontName, fontStyle, firstGlyph, numGlyphs, handleMissingGlyphs, pathParameterTemplate, emScale); }\ninline void glWeightPathsNV(GLuint resultPath, GLsizei numPaths, const GLuint* paths, const GLfloat* weights) { fp_glWeightPathsNV(resultPath, numPaths, paths, weights); }\ninline void glCopyPathNV(GLuint resultPath, GLuint srcPath) { fp_glCopyPathNV(resultPath, srcPath); }\ninline void glInterpolatePathsNV(GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight) { fp_glInterpolatePathsNV(resultPath, pathA, pathB, weight); }\ninline void glTransformPathNV(GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat* transformValues) { fp_glTransformPathNV(resultPath, srcPath, transformType, transformValues); }\ninline void glPathParameterivNV(GLuint path, GLenum pname, const GLint* value) { fp_glPathParameterivNV(path, pname, value); }\ninline void glPathParameteriNV(GLuint path, GLenum pname, GLint value) { fp_glPathParameteriNV(path, pname, value); }\ninline void glPathParameterfvNV(GLuint path, GLenum pname, const GLfloat* value) { fp_glPathParameterfvNV(path, pname, value); }\ninline void glPathParameterfNV(GLuint path, GLenum pname, GLfloat value) { fp_glPathParameterfNV(path, pname, value); }\ninline void glPathDashArrayNV(GLuint path, GLsizei dashCount, const GLfloat* dashArray) { fp_glPathDashArrayNV(path, dashCount, dashArray); }\ninline void glPathStencilFuncNV(GLenum func, GLint ref, GLuint mask) { fp_glPathStencilFuncNV(func, ref, mask); }\ninline void glPathStencilDepthOffsetNV(GLfloat factor, GLfloat units) { fp_glPathStencilDepthOffsetNV(factor, units); }\ninline void glStencilFillPathNV(GLuint path, GLenum fillMode, GLuint mask) { fp_glStencilFillPathNV(path, fillMode, mask); }\ninline void glStencilStrokePathNV(GLuint path, GLint reference, GLuint mask) { fp_glStencilStrokePathNV(path, reference, mask); }\ninline void glStencilFillPathInstancedNV(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat* transformValues) { fp_glStencilFillPathInstancedNV(numPaths, pathNameType, paths, pathBase, fillMode, mask, transformType, transformValues); }\ninline void glStencilStrokePathInstancedNV(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat* transformValues) { fp_glStencilStrokePathInstancedNV(numPaths, pathNameType, paths, pathBase, reference, mask, transformType, transformValues); }\ninline void glPathCoverDepthFuncNV(GLenum func) { fp_glPathCoverDepthFuncNV(func); }\ninline void glCoverFillPathNV(GLuint path, GLenum coverMode) { fp_glCoverFillPathNV(path, coverMode); }\ninline void glCoverStrokePathNV(GLuint path, GLenum coverMode) { fp_glCoverStrokePathNV(path, coverMode); }\ninline void glCoverFillPathInstancedNV(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat* transformValues) { fp_glCoverFillPathInstancedNV(numPaths, pathNameType, paths, pathBase, coverMode, transformType, transformValues); }\ninline void glCoverStrokePathInstancedNV(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat* transformValues) { fp_glCoverStrokePathInstancedNV(numPaths, pathNameType, paths, pathBase, coverMode, transformType, transformValues); }\ninline void glGetPathParameterivNV(GLuint path, GLenum pname, GLint* value) { fp_glGetPathParameterivNV(path, pname, value); }\ninline void glGetPathParameterfvNV(GLuint path, GLenum pname, GLfloat* value) { fp_glGetPathParameterfvNV(path, pname, value); }\ninline void glGetPathCommandsNV(GLuint path, GLubyte* commands) { fp_glGetPathCommandsNV(path, commands); }\ninline void glGetPathCoordsNV(GLuint path, GLfloat* coords) { fp_glGetPathCoordsNV(path, coords); }\ninline void glGetPathDashArrayNV(GLuint path, GLfloat* dashArray) { fp_glGetPathDashArrayNV(path, dashArray); }\ninline void glGetPathMetricsNV(GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLsizei stride, GLfloat* metrics) { fp_glGetPathMetricsNV(metricQueryMask, numPaths, pathNameType, paths, pathBase, stride, metrics); }\ninline void glGetPathMetricRangeNV(GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat* metrics) { fp_glGetPathMetricRangeNV(metricQueryMask, firstPathName, numPaths, stride, metrics); }\ninline void glGetPathSpacingNV(GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat* returnedSpacing) { fp_glGetPathSpacingNV(pathListMode, numPaths, pathNameType, paths, pathBase, advanceScale, kerningScale, transformType, returnedSpacing); }\ninline GLboolean glIsPointInFillPathNV(GLuint path, GLuint mask, GLfloat x, GLfloat y) { return fp_glIsPointInFillPathNV(path, mask, x, y); }\ninline GLboolean glIsPointInStrokePathNV(GLuint path, GLfloat x, GLfloat y) { return fp_glIsPointInStrokePathNV(path, x, y); }\ninline GLfloat glGetPathLengthNV(GLuint path, GLsizei startSegment, GLsizei numSegments) { return fp_glGetPathLengthNV(path, startSegment, numSegments); }\ninline GLboolean glPointAlongPathNV(GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat* x, GLfloat* y, GLfloat* tangentX, GLfloat* tangentY) { return fp_glPointAlongPathNV(path, startSegment, numSegments, distance, x, y, tangentX, tangentY); }\ninline void glMatrixLoad3x2fNV(GLenum matrixMode, const GLfloat* m) { fp_glMatrixLoad3x2fNV(matrixMode, m); }\ninline void glMatrixLoad3x3fNV(GLenum matrixMode, const GLfloat* m) { fp_glMatrixLoad3x3fNV(matrixMode, m); }\ninline void glMatrixLoadTranspose3x3fNV(GLenum matrixMode, const GLfloat* m) { fp_glMatrixLoadTranspose3x3fNV(matrixMode, m); }\ninline void glMatrixMult3x2fNV(GLenum matrixMode, const GLfloat* m) { fp_glMatrixMult3x2fNV(matrixMode, m); }\ninline void glMatrixMult3x3fNV(GLenum matrixMode, const GLfloat* m) { fp_glMatrixMult3x3fNV(matrixMode, m); }\ninline void glMatrixMultTranspose3x3fNV(GLenum matrixMode, const GLfloat* m) { fp_glMatrixMultTranspose3x3fNV(matrixMode, m); }\ninline void glStencilThenCoverFillPathNV(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode) { fp_glStencilThenCoverFillPathNV(path, fillMode, mask, coverMode); }\ninline void glStencilThenCoverStrokePathNV(GLuint path, GLint reference, GLuint mask, GLenum coverMode) { fp_glStencilThenCoverStrokePathNV(path, reference, mask, coverMode); }\ninline void glStencilThenCoverFillPathInstancedNV(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat* transformValues) { fp_glStencilThenCoverFillPathInstancedNV(numPaths, pathNameType, paths, pathBase, fillMode, mask, coverMode, transformType, transformValues); }\ninline void glStencilThenCoverStrokePathInstancedNV(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat* transformValues) { fp_glStencilThenCoverStrokePathInstancedNV(numPaths, pathNameType, paths, pathBase, reference, mask, coverMode, transformType, transformValues); }\ninline GLenum glPathGlyphIndexRangeNV(GLenum fontTarget, const void* fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount) { return fp_glPathGlyphIndexRangeNV(fontTarget, fontName, fontStyle, pathParameterTemplate, emScale, baseAndCount); }\ninline GLenum glPathGlyphIndexArrayNV(GLuint firstPathName, GLenum fontTarget, const void* fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale) { return fp_glPathGlyphIndexArrayNV(firstPathName, fontTarget, fontName, fontStyle, firstGlyphIndex, numGlyphs, pathParameterTemplate, emScale); }\ninline GLenum glPathMemoryGlyphIndexArrayNV(GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void* fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale) { return fp_glPathMemoryGlyphIndexArrayNV(firstPathName, fontTarget, fontSize, fontData, faceIndex, firstGlyphIndex, numGlyphs, pathParameterTemplate, emScale); }\ninline void glProgramPathFragmentInputGenNV(GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat* coeffs) { fp_glProgramPathFragmentInputGenNV(program, location, genMode, components, coeffs); }\ninline void glGetProgramResourcefvNV(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei* length, GLfloat* params) { fp_glGetProgramResourcefvNV(program, programInterface, index, propCount, props, bufSize, length, params); }\ninline void glPathColorGenNV(GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat* coeffs) { fp_glPathColorGenNV(color, genMode, colorFormat, coeffs); }\ninline void glPathTexGenNV(GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat* coeffs) { fp_glPathTexGenNV(texCoordSet, genMode, components, coeffs); }\ninline void glPathFogGenNV(GLenum genMode) { fp_glPathFogGenNV(genMode); }\ninline void glGetPathColorGenivNV(GLenum color, GLenum pname, GLint* value) { fp_glGetPathColorGenivNV(color, pname, value); }\ninline void glGetPathColorGenfvNV(GLenum color, GLenum pname, GLfloat* value) { fp_glGetPathColorGenfvNV(color, pname, value); }\ninline void glGetPathTexGenivNV(GLenum texCoordSet, GLenum pname, GLint* value) { fp_glGetPathTexGenivNV(texCoordSet, pname, value); }\ninline void glGetPathTexGenfvNV(GLenum texCoordSet, GLenum pname, GLfloat* value) { fp_glGetPathTexGenfvNV(texCoordSet, pname, value); }\n\n/* GL_NV_polygon_mode */\ninline void glPolygonModeNV(GLenum face, GLenum mode) { fp_glPolygonModeNV(face, mode); }\n\n/* GL_NV_present_video */\ninline void glPresentFrameKeyedNV(GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1) { fp_glPresentFrameKeyedNV(video_slot, minPresentTime, beginPresentTimeId, presentDurationId, type, target0, fill0, key0, target1, fill1, key1); }\ninline void glPresentFrameDualFillNV(GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3) { fp_glPresentFrameDualFillNV(video_slot, minPresentTime, beginPresentTimeId, presentDurationId, type, target0, fill0, target1, fill1, target2, fill2, target3, fill3); }\ninline void glGetVideoivNV(GLuint video_slot, GLenum pname, GLint* params) { fp_glGetVideoivNV(video_slot, pname, params); }\ninline void glGetVideouivNV(GLuint video_slot, GLenum pname, GLuint* params) { fp_glGetVideouivNV(video_slot, pname, params); }\ninline void glGetVideoi64vNV(GLuint video_slot, GLenum pname, GLint64EXT* params) { fp_glGetVideoi64vNV(video_slot, pname, params); }\ninline void glGetVideoui64vNV(GLuint video_slot, GLenum pname, GLuint64EXT* params) { fp_glGetVideoui64vNV(video_slot, pname, params); }\n\n/* GL_NV_primitive_restart */\ninline void glPrimitiveRestartNV() { fp_glPrimitiveRestartNV(); }\ninline void glPrimitiveRestartIndexNV(GLuint index) { fp_glPrimitiveRestartIndexNV(index); }\n\n/* GL_NV_read_buffer */\ninline void glReadBufferNV(GLenum mode) { fp_glReadBufferNV(mode); }\n\n/* GL_NV_sample_locations */\ninline void glFramebufferSampleLocationsfvNV(GLenum target, GLuint start, GLsizei count, const GLfloat* v) { fp_glFramebufferSampleLocationsfvNV(target, start, count, v); }\ninline void glNamedFramebufferSampleLocationsfvNV(GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v) { fp_glNamedFramebufferSampleLocationsfvNV(framebuffer, start, count, v); }\ninline void glResolveDepthValuesNV() { fp_glResolveDepthValuesNV(); }\n\n/* GL_NV_shader_buffer_load */\ninline void glMakeBufferResidentNV(GLenum target, GLenum access) { fp_glMakeBufferResidentNV(target, access); }\ninline void glMakeBufferNonResidentNV(GLenum target) { fp_glMakeBufferNonResidentNV(target); }\ninline GLboolean glIsBufferResidentNV(GLenum target) { return fp_glIsBufferResidentNV(target); }\ninline void glMakeNamedBufferResidentNV(GLuint buffer, GLenum access) { fp_glMakeNamedBufferResidentNV(buffer, access); }\ninline void glMakeNamedBufferNonResidentNV(GLuint buffer) { fp_glMakeNamedBufferNonResidentNV(buffer); }\ninline GLboolean glIsNamedBufferResidentNV(GLuint buffer) { return fp_glIsNamedBufferResidentNV(buffer); }\ninline void glGetBufferParameterui64vNV(GLenum target, GLenum pname, GLuint64EXT* params) { fp_glGetBufferParameterui64vNV(target, pname, params); }\ninline void glGetNamedBufferParameterui64vNV(GLuint buffer, GLenum pname, GLuint64EXT* params) { fp_glGetNamedBufferParameterui64vNV(buffer, pname, params); }\ninline void glGetIntegerui64vNV(GLenum value, GLuint64EXT* result) { fp_glGetIntegerui64vNV(value, result); }\ninline void glUniformui64NV(GLint location, GLuint64EXT value) { fp_glUniformui64NV(location, value); }\ninline void glUniformui64vNV(GLint location, GLsizei count, const GLuint64EXT* value) { fp_glUniformui64vNV(location, count, value); }\ninline void glProgramUniformui64NV(GLuint program, GLint location, GLuint64EXT value) { fp_glProgramUniformui64NV(program, location, value); }\ninline void glProgramUniformui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value) { fp_glProgramUniformui64vNV(program, location, count, value); }\n\n/* GL_NV_texture_barrier */\ninline void glTextureBarrierNV() { fp_glTextureBarrierNV(); }\n\n/* GL_NV_texture_multisample */\ninline void glTexImage2DMultisampleCoverageNV(GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations) { fp_glTexImage2DMultisampleCoverageNV(target, coverageSamples, colorSamples, internalFormat, width, height, fixedSampleLocations); }\ninline void glTexImage3DMultisampleCoverageNV(GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations) { fp_glTexImage3DMultisampleCoverageNV(target, coverageSamples, colorSamples, internalFormat, width, height, depth, fixedSampleLocations); }\ninline void glTextureImage2DMultisampleNV(GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations) { fp_glTextureImage2DMultisampleNV(texture, target, samples, internalFormat, width, height, fixedSampleLocations); }\ninline void glTextureImage3DMultisampleNV(GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations) { fp_glTextureImage3DMultisampleNV(texture, target, samples, internalFormat, width, height, depth, fixedSampleLocations); }\ninline void glTextureImage2DMultisampleCoverageNV(GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations) { fp_glTextureImage2DMultisampleCoverageNV(texture, target, coverageSamples, colorSamples, internalFormat, width, height, fixedSampleLocations); }\ninline void glTextureImage3DMultisampleCoverageNV(GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations) { fp_glTextureImage3DMultisampleCoverageNV(texture, target, coverageSamples, colorSamples, internalFormat, width, height, depth, fixedSampleLocations); }\n\n/* GL_NV_transform_feedback */\ninline void glBeginTransformFeedbackNV(GLenum primitiveMode) { fp_glBeginTransformFeedbackNV(primitiveMode); }\ninline void glEndTransformFeedbackNV() { fp_glEndTransformFeedbackNV(); }\ninline void glTransformFeedbackAttribsNV(GLsizei count, const GLint* attribs, GLenum bufferMode) { fp_glTransformFeedbackAttribsNV(count, attribs, bufferMode); }\ninline void glBindBufferRangeNV(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) { fp_glBindBufferRangeNV(target, index, buffer, offset, size); }\ninline void glBindBufferOffsetNV(GLenum target, GLuint index, GLuint buffer, GLintptr offset) { fp_glBindBufferOffsetNV(target, index, buffer, offset); }\ninline void glBindBufferBaseNV(GLenum target, GLuint index, GLuint buffer) { fp_glBindBufferBaseNV(target, index, buffer); }\ninline void glTransformFeedbackVaryingsNV(GLuint program, GLsizei count, const GLint* locations, GLenum bufferMode) { fp_glTransformFeedbackVaryingsNV(program, count, locations, bufferMode); }\ninline void glActiveVaryingNV(GLuint program, const GLchar* name) { fp_glActiveVaryingNV(program, name); }\ninline GLint glGetVaryingLocationNV(GLuint program, const GLchar* name) { return fp_glGetVaryingLocationNV(program, name); }\ninline void glGetActiveVaryingNV(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name) { fp_glGetActiveVaryingNV(program, index, bufSize, length, size, type, name); }\ninline void glGetTransformFeedbackVaryingNV(GLuint program, GLuint index, GLint* location) { fp_glGetTransformFeedbackVaryingNV(program, index, location); }\ninline void glTransformFeedbackStreamAttribsNV(GLsizei count, const GLint* attribs, GLsizei nbuffers, const GLint* bufstreams, GLenum bufferMode) { fp_glTransformFeedbackStreamAttribsNV(count, attribs, nbuffers, bufstreams, bufferMode); }\n\n/* GL_NV_transform_feedback2 */\ninline void glBindTransformFeedbackNV(GLenum target, GLuint id) { fp_glBindTransformFeedbackNV(target, id); }\ninline void glDeleteTransformFeedbacksNV(GLsizei n, const GLuint* ids) { fp_glDeleteTransformFeedbacksNV(n, ids); }\ninline void glGenTransformFeedbacksNV(GLsizei n, GLuint* ids) { fp_glGenTransformFeedbacksNV(n, ids); }\ninline GLboolean glIsTransformFeedbackNV(GLuint id) { return fp_glIsTransformFeedbackNV(id); }\ninline void glPauseTransformFeedbackNV() { fp_glPauseTransformFeedbackNV(); }\ninline void glResumeTransformFeedbackNV() { fp_glResumeTransformFeedbackNV(); }\ninline void glDrawTransformFeedbackNV(GLenum mode, GLuint id) { fp_glDrawTransformFeedbackNV(mode, id); }\n\n/* GL_NV_vdpau_interop */\ninline void glVDPAUInitNV(const void* vdpDevice, const void* getProcAddress) { fp_glVDPAUInitNV(vdpDevice, getProcAddress); }\ninline void glVDPAUFiniNV() { fp_glVDPAUFiniNV(); }\ninline GLvdpauSurfaceNV glVDPAURegisterVideoSurfaceNV(const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint* textureNames) { return fp_glVDPAURegisterVideoSurfaceNV(vdpSurface, target, numTextureNames, textureNames); }\ninline GLvdpauSurfaceNV glVDPAURegisterOutputSurfaceNV(const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint* textureNames) { return fp_glVDPAURegisterOutputSurfaceNV(vdpSurface, target, numTextureNames, textureNames); }\ninline GLboolean glVDPAUIsSurfaceNV(GLvdpauSurfaceNV surface) { return fp_glVDPAUIsSurfaceNV(surface); }\ninline void glVDPAUUnregisterSurfaceNV(GLvdpauSurfaceNV surface) { fp_glVDPAUUnregisterSurfaceNV(surface); }\ninline void glVDPAUGetSurfaceivNV(GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values) { fp_glVDPAUGetSurfaceivNV(surface, pname, bufSize, length, values); }\ninline void glVDPAUSurfaceAccessNV(GLvdpauSurfaceNV surface, GLenum access) { fp_glVDPAUSurfaceAccessNV(surface, access); }\ninline void glVDPAUMapSurfacesNV(GLsizei numSurfaces, const GLvdpauSurfaceNV* surfaces) { fp_glVDPAUMapSurfacesNV(numSurfaces, surfaces); }\ninline void glVDPAUUnmapSurfacesNV(GLsizei numSurface, const GLvdpauSurfaceNV* surfaces) { fp_glVDPAUUnmapSurfacesNV(numSurface, surfaces); }\n\n/* GL_NV_vertex_attrib_integer_64bit */\ninline void glVertexAttribL1i64NV(GLuint index, GLint64EXT x) { fp_glVertexAttribL1i64NV(index, x); }\ninline void glVertexAttribL2i64NV(GLuint index, GLint64EXT x, GLint64EXT y) { fp_glVertexAttribL2i64NV(index, x, y); }\ninline void glVertexAttribL3i64NV(GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z) { fp_glVertexAttribL3i64NV(index, x, y, z); }\ninline void glVertexAttribL4i64NV(GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w) { fp_glVertexAttribL4i64NV(index, x, y, z, w); }\ninline void glVertexAttribL1i64vNV(GLuint index, const GLint64EXT* v) { fp_glVertexAttribL1i64vNV(index, v); }\ninline void glVertexAttribL2i64vNV(GLuint index, const GLint64EXT* v) { fp_glVertexAttribL2i64vNV(index, v); }\ninline void glVertexAttribL3i64vNV(GLuint index, const GLint64EXT* v) { fp_glVertexAttribL3i64vNV(index, v); }\ninline void glVertexAttribL4i64vNV(GLuint index, const GLint64EXT* v) { fp_glVertexAttribL4i64vNV(index, v); }\ninline void glVertexAttribL1ui64NV(GLuint index, GLuint64EXT x) { fp_glVertexAttribL1ui64NV(index, x); }\ninline void glVertexAttribL2ui64NV(GLuint index, GLuint64EXT x, GLuint64EXT y) { fp_glVertexAttribL2ui64NV(index, x, y); }\ninline void glVertexAttribL3ui64NV(GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z) { fp_glVertexAttribL3ui64NV(index, x, y, z); }\ninline void glVertexAttribL4ui64NV(GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w) { fp_glVertexAttribL4ui64NV(index, x, y, z, w); }\ninline void glVertexAttribL1ui64vNV(GLuint index, const GLuint64EXT* v) { fp_glVertexAttribL1ui64vNV(index, v); }\ninline void glVertexAttribL2ui64vNV(GLuint index, const GLuint64EXT* v) { fp_glVertexAttribL2ui64vNV(index, v); }\ninline void glVertexAttribL3ui64vNV(GLuint index, const GLuint64EXT* v) { fp_glVertexAttribL3ui64vNV(index, v); }\ninline void glVertexAttribL4ui64vNV(GLuint index, const GLuint64EXT* v) { fp_glVertexAttribL4ui64vNV(index, v); }\ninline void glGetVertexAttribLi64vNV(GLuint index, GLenum pname, GLint64EXT* params) { fp_glGetVertexAttribLi64vNV(index, pname, params); }\ninline void glGetVertexAttribLui64vNV(GLuint index, GLenum pname, GLuint64EXT* params) { fp_glGetVertexAttribLui64vNV(index, pname, params); }\ninline void glVertexAttribLFormatNV(GLuint index, GLint size, GLenum type, GLsizei stride) { fp_glVertexAttribLFormatNV(index, size, type, stride); }\n\n/* GL_NV_vertex_buffer_unified_memory */\ninline void glBufferAddressRangeNV(GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length) { fp_glBufferAddressRangeNV(pname, index, address, length); }\ninline void glVertexFormatNV(GLint size, GLenum type, GLsizei stride) { fp_glVertexFormatNV(size, type, stride); }\ninline void glNormalFormatNV(GLenum type, GLsizei stride) { fp_glNormalFormatNV(type, stride); }\ninline void glColorFormatNV(GLint size, GLenum type, GLsizei stride) { fp_glColorFormatNV(size, type, stride); }\ninline void glIndexFormatNV(GLenum type, GLsizei stride) { fp_glIndexFormatNV(type, stride); }\ninline void glTexCoordFormatNV(GLint size, GLenum type, GLsizei stride) { fp_glTexCoordFormatNV(size, type, stride); }\ninline void glEdgeFlagFormatNV(GLsizei stride) { fp_glEdgeFlagFormatNV(stride); }\ninline void glSecondaryColorFormatNV(GLint size, GLenum type, GLsizei stride) { fp_glSecondaryColorFormatNV(size, type, stride); }\ninline void glFogCoordFormatNV(GLenum type, GLsizei stride) { fp_glFogCoordFormatNV(type, stride); }\ninline void glVertexAttribFormatNV(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride) { fp_glVertexAttribFormatNV(index, size, type, normalized, stride); }\ninline void glVertexAttribIFormatNV(GLuint index, GLint size, GLenum type, GLsizei stride) { fp_glVertexAttribIFormatNV(index, size, type, stride); }\ninline void glGetIntegerui64i_vNV(GLenum value, GLuint index, GLuint64EXT* result) { fp_glGetIntegerui64i_vNV(value, index, result); }\n\n/* GL_NV_vertex_program4 */\ninline void glVertexAttribI1iEXT(GLuint index, GLint x) { fp_glVertexAttribI1iEXT(index, x); }\ninline void glVertexAttribI2iEXT(GLuint index, GLint x, GLint y) { fp_glVertexAttribI2iEXT(index, x, y); }\ninline void glVertexAttribI3iEXT(GLuint index, GLint x, GLint y, GLint z) { fp_glVertexAttribI3iEXT(index, x, y, z); }\ninline void glVertexAttribI4iEXT(GLuint index, GLint x, GLint y, GLint z, GLint w) { fp_glVertexAttribI4iEXT(index, x, y, z, w); }\ninline void glVertexAttribI1uiEXT(GLuint index, GLuint x) { fp_glVertexAttribI1uiEXT(index, x); }\ninline void glVertexAttribI2uiEXT(GLuint index, GLuint x, GLuint y) { fp_glVertexAttribI2uiEXT(index, x, y); }\ninline void glVertexAttribI3uiEXT(GLuint index, GLuint x, GLuint y, GLuint z) { fp_glVertexAttribI3uiEXT(index, x, y, z); }\ninline void glVertexAttribI4uiEXT(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) { fp_glVertexAttribI4uiEXT(index, x, y, z, w); }\ninline void glVertexAttribI1ivEXT(GLuint index, const GLint* v) { fp_glVertexAttribI1ivEXT(index, v); }\ninline void glVertexAttribI2ivEXT(GLuint index, const GLint* v) { fp_glVertexAttribI2ivEXT(index, v); }\ninline void glVertexAttribI3ivEXT(GLuint index, const GLint* v) { fp_glVertexAttribI3ivEXT(index, v); }\ninline void glVertexAttribI4ivEXT(GLuint index, const GLint* v) { fp_glVertexAttribI4ivEXT(index, v); }\ninline void glVertexAttribI1uivEXT(GLuint index, const GLuint* v) { fp_glVertexAttribI1uivEXT(index, v); }\ninline void glVertexAttribI2uivEXT(GLuint index, const GLuint* v) { fp_glVertexAttribI2uivEXT(index, v); }\ninline void glVertexAttribI3uivEXT(GLuint index, const GLuint* v) { fp_glVertexAttribI3uivEXT(index, v); }\ninline void glVertexAttribI4uivEXT(GLuint index, const GLuint* v) { fp_glVertexAttribI4uivEXT(index, v); }\ninline void glVertexAttribI4bvEXT(GLuint index, const GLbyte* v) { fp_glVertexAttribI4bvEXT(index, v); }\ninline void glVertexAttribI4svEXT(GLuint index, const GLshort* v) { fp_glVertexAttribI4svEXT(index, v); }\ninline void glVertexAttribI4ubvEXT(GLuint index, const GLubyte* v) { fp_glVertexAttribI4ubvEXT(index, v); }\ninline void glVertexAttribI4usvEXT(GLuint index, const GLushort* v) { fp_glVertexAttribI4usvEXT(index, v); }\ninline void glVertexAttribIPointerEXT(GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glVertexAttribIPointerEXT(index, size, type, stride, pointer); }\ninline void glGetVertexAttribIivEXT(GLuint index, GLenum pname, GLint* params) { fp_glGetVertexAttribIivEXT(index, pname, params); }\ninline void glGetVertexAttribIuivEXT(GLuint index, GLenum pname, GLuint* params) { fp_glGetVertexAttribIuivEXT(index, pname, params); }\n\n/* GL_NV_video_capture */\ninline void glBeginVideoCaptureNV(GLuint video_capture_slot) { fp_glBeginVideoCaptureNV(video_capture_slot); }\ninline void glBindVideoCaptureStreamBufferNV(GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset) { fp_glBindVideoCaptureStreamBufferNV(video_capture_slot, stream, frame_region, offset); }\ninline void glBindVideoCaptureStreamTextureNV(GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture) { fp_glBindVideoCaptureStreamTextureNV(video_capture_slot, stream, frame_region, target, texture); }\ninline void glEndVideoCaptureNV(GLuint video_capture_slot) { fp_glEndVideoCaptureNV(video_capture_slot); }\ninline void glGetVideoCaptureivNV(GLuint video_capture_slot, GLenum pname, GLint* params) { fp_glGetVideoCaptureivNV(video_capture_slot, pname, params); }\ninline void glGetVideoCaptureStreamivNV(GLuint video_capture_slot, GLuint stream, GLenum pname, GLint* params) { fp_glGetVideoCaptureStreamivNV(video_capture_slot, stream, pname, params); }\ninline void glGetVideoCaptureStreamfvNV(GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat* params) { fp_glGetVideoCaptureStreamfvNV(video_capture_slot, stream, pname, params); }\ninline void glGetVideoCaptureStreamdvNV(GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble* params) { fp_glGetVideoCaptureStreamdvNV(video_capture_slot, stream, pname, params); }\ninline GLenum glVideoCaptureNV(GLuint video_capture_slot, GLuint* sequence_num, GLuint64EXT* capture_time) { return fp_glVideoCaptureNV(video_capture_slot, sequence_num, capture_time); }\ninline void glVideoCaptureStreamParameterivNV(GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint* params) { fp_glVideoCaptureStreamParameterivNV(video_capture_slot, stream, pname, params); }\ninline void glVideoCaptureStreamParameterfvNV(GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat* params) { fp_glVideoCaptureStreamParameterfvNV(video_capture_slot, stream, pname, params); }\ninline void glVideoCaptureStreamParameterdvNV(GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble* params) { fp_glVideoCaptureStreamParameterdvNV(video_capture_slot, stream, pname, params); }\n\n/* GL_NV_viewport_array */\ninline void glViewportArrayvNV(GLuint first, GLsizei count, const GLfloat* v) { fp_glViewportArrayvNV(first, count, v); }\ninline void glViewportIndexedfNV(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h) { fp_glViewportIndexedfNV(index, x, y, w, h); }\ninline void glViewportIndexedfvNV(GLuint index, const GLfloat* v) { fp_glViewportIndexedfvNV(index, v); }\ninline void glScissorArrayvNV(GLuint first, GLsizei count, const GLint* v) { fp_glScissorArrayvNV(first, count, v); }\ninline void glScissorIndexedNV(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height) { fp_glScissorIndexedNV(index, left, bottom, width, height); }\ninline void glScissorIndexedvNV(GLuint index, const GLint* v) { fp_glScissorIndexedvNV(index, v); }\ninline void glDepthRangeArrayfvNV(GLuint first, GLsizei count, const GLfloat* v) { fp_glDepthRangeArrayfvNV(first, count, v); }\ninline void glDepthRangeIndexedfNV(GLuint index, GLfloat n, GLfloat f) { fp_glDepthRangeIndexedfNV(index, n, f); }\ninline void glGetFloati_vNV(GLenum target, GLuint index, GLfloat* data) { fp_glGetFloati_vNV(target, index, data); }\ninline void glEnableiNV(GLenum target, GLuint index) { fp_glEnableiNV(target, index); }\ninline void glDisableiNV(GLenum target, GLuint index) { fp_glDisableiNV(target, index); }\ninline GLboolean glIsEnablediNV(GLenum target, GLuint index) { return fp_glIsEnablediNV(target, index); }\n\n/* GL_NVX_conditional_render */\ninline void glBeginConditionalRenderNVX(GLuint id) { fp_glBeginConditionalRenderNVX(id); }\ninline void glEndConditionalRenderNVX() { fp_glEndConditionalRenderNVX(); }\n\n/* GL_OVR_multiview */\ninline void glFramebufferTextureMultiviewOVR(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews) { fp_glFramebufferTextureMultiviewOVR(target, attachment, texture, level, baseViewIndex, numViews); }\n\n/* GL_OVR_multiview_multisampled_render_to_texture */\ninline void glFramebufferTextureMultisampleMultiviewOVR(GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews) { fp_glFramebufferTextureMultisampleMultiviewOVR(target, attachment, texture, level, samples, baseViewIndex, numViews); }\n\n/* GL_QCOM_alpha_test */\ninline void glAlphaFuncQCOM(GLenum func, GLclampf ref) { fp_glAlphaFuncQCOM(func, ref); }\n\n/* GL_QCOM_driver_control */\ninline void glGetDriverControlsQCOM(GLint* num, GLsizei size, GLuint* driverControls) { fp_glGetDriverControlsQCOM(num, size, driverControls); }\ninline void glGetDriverControlStringQCOM(GLuint driverControl, GLsizei bufSize, GLsizei* length, GLchar* driverControlString) { fp_glGetDriverControlStringQCOM(driverControl, bufSize, length, driverControlString); }\ninline void glEnableDriverControlQCOM(GLuint driverControl) { fp_glEnableDriverControlQCOM(driverControl); }\ninline void glDisableDriverControlQCOM(GLuint driverControl) { fp_glDisableDriverControlQCOM(driverControl); }\n\n/* GL_QCOM_extended_get */\ninline void glExtGetTexturesQCOM(GLuint* textures, GLint maxTextures, GLint* numTextures) { fp_glExtGetTexturesQCOM(textures, maxTextures, numTextures); }\ninline void glExtGetBuffersQCOM(GLuint* buffers, GLint maxBuffers, GLint* numBuffers) { fp_glExtGetBuffersQCOM(buffers, maxBuffers, numBuffers); }\ninline void glExtGetRenderbuffersQCOM(GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers) { fp_glExtGetRenderbuffersQCOM(renderbuffers, maxRenderbuffers, numRenderbuffers); }\ninline void glExtGetFramebuffersQCOM(GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers) { fp_glExtGetFramebuffersQCOM(framebuffers, maxFramebuffers, numFramebuffers); }\ninline void glExtGetTexLevelParameterivQCOM(GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params) { fp_glExtGetTexLevelParameterivQCOM(texture, face, level, pname, params); }\ninline void glExtTexObjectStateOverrideiQCOM(GLenum target, GLenum pname, GLint param) { fp_glExtTexObjectStateOverrideiQCOM(target, pname, param); }\ninline void glExtGetTexSubImageQCOM(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void* texels) { fp_glExtGetTexSubImageQCOM(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, texels); }\ninline void glExtGetBufferPointervQCOM(GLenum target, void** params) { fp_glExtGetBufferPointervQCOM(target, params); }\n\n/* GL_QCOM_extended_get2 */\ninline void glExtGetShadersQCOM(GLuint* shaders, GLint maxShaders, GLint* numShaders) { fp_glExtGetShadersQCOM(shaders, maxShaders, numShaders); }\ninline void glExtGetProgramsQCOM(GLuint* programs, GLint maxPrograms, GLint* numPrograms) { fp_glExtGetProgramsQCOM(programs, maxPrograms, numPrograms); }\ninline GLboolean glExtIsProgramBinaryQCOM(GLuint program) { return fp_glExtIsProgramBinaryQCOM(program); }\ninline void glExtGetProgramBinarySourceQCOM(GLuint program, GLenum shadertype, GLchar* source, GLint* length) { fp_glExtGetProgramBinarySourceQCOM(program, shadertype, source, length); }\n\n/* GL_QCOM_tiled_rendering */\ninline void glStartTilingQCOM(GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask) { fp_glStartTilingQCOM(x, y, width, height, preserveMask); }\ninline void glEndTilingQCOM(GLbitfield preserveMask) { fp_glEndTilingQCOM(preserveMask); }\n\n} /* namespace glad */\n\n#endif /* __glad_funcs_hpp_ */\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/GLSL.ext.AMD.h",
    "content": "/*\n** Copyright (c) 2014-2016 The Khronos Group Inc.\n**\n** Permission is hereby granted, free of charge, to any person obtaining a copy\n** of this software and/or associated documentation files (the \"Materials\"),\n** to deal in the Materials without restriction, including without limitation\n** the rights to use, copy, modify, merge, publish, distribute, sublicense,\n** and/or sell copies of the Materials, and to permit persons to whom the\n** Materials are furnished to do so, subject to the following conditions:\n**\n** The above copyright notice and this permission notice shall be included in\n** all copies or substantial portions of the Materials.\n**\n** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS\n** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND\n** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/\n**\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS\n** IN THE MATERIALS.\n*/\n\n#ifndef GLSLextAMD_H\n#define GLSLextAMD_H\n\nstatic const int GLSLextAMDVersion = 100;\nstatic const int GLSLextAMDRevision = 7;\n\n// SPV_AMD_shader_ballot\nstatic const char* const E_SPV_AMD_shader_ballot = \"SPV_AMD_shader_ballot\";\n\nenum ShaderBallotAMD {\n    ShaderBallotBadAMD = 0, // Don't use\n\n    SwizzleInvocationsAMD = 1,\n    SwizzleInvocationsMaskedAMD = 2,\n    WriteInvocationAMD = 3,\n    MbcntAMD = 4,\n\n    ShaderBallotCountAMD\n};\n\n// SPV_AMD_shader_trinary_minmax\nstatic const char* const E_SPV_AMD_shader_trinary_minmax = \"SPV_AMD_shader_trinary_minmax\";\n\nenum ShaderTrinaryMinMaxAMD {\n    ShaderTrinaryMinMaxBadAMD = 0, // Don't use\n\n    FMin3AMD = 1,\n    UMin3AMD = 2,\n    SMin3AMD = 3,\n    FMax3AMD = 4,\n    UMax3AMD = 5,\n    SMax3AMD = 6,\n    FMid3AMD = 7,\n    UMid3AMD = 8,\n    SMid3AMD = 9,\n\n    ShaderTrinaryMinMaxCountAMD\n};\n\n// SPV_AMD_shader_explicit_vertex_parameter\nstatic const char* const E_SPV_AMD_shader_explicit_vertex_parameter = \"SPV_AMD_shader_explicit_vertex_parameter\";\n\nenum ShaderExplicitVertexParameterAMD {\n    ShaderExplicitVertexParameterBadAMD = 0, // Don't use\n\n    InterpolateAtVertexAMD = 1,\n\n    ShaderExplicitVertexParameterCountAMD\n};\n\n// SPV_AMD_gcn_shader\nstatic const char* const E_SPV_AMD_gcn_shader = \"SPV_AMD_gcn_shader\";\n\nenum GcnShaderAMD {\n    GcnShaderBadAMD = 0, // Don't use\n\n    CubeFaceIndexAMD = 1,\n    CubeFaceCoordAMD = 2,\n    TimeAMD = 3,\n\n    GcnShaderCountAMD\n};\n\n// SPV_AMD_gpu_shader_half_float\nstatic const char* const E_SPV_AMD_gpu_shader_half_float = \"SPV_AMD_gpu_shader_half_float\";\n\n// SPV_AMD_texture_gather_bias_lod\nstatic const char* const E_SPV_AMD_texture_gather_bias_lod = \"SPV_AMD_texture_gather_bias_lod\";\n\n// SPV_AMD_gpu_shader_int16\nstatic const char* const E_SPV_AMD_gpu_shader_int16 = \"SPV_AMD_gpu_shader_int16\";\n\n// SPV_AMD_shader_image_load_store_lod\nstatic const char* const E_SPV_AMD_shader_image_load_store_lod = \"SPV_AMD_shader_image_load_store_lod\";\n\n// SPV_AMD_shader_fragment_mask\nstatic const char* const E_SPV_AMD_shader_fragment_mask = \"SPV_AMD_shader_fragment_mask\";\n\n// SPV_AMD_gpu_shader_half_float_fetch\nstatic const char* const E_SPV_AMD_gpu_shader_half_float_fetch = \"SPV_AMD_gpu_shader_half_float_fetch\";\n\n#endif  // #ifndef GLSLextAMD_H\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/GLSL.ext.ARM.h",
    "content": "/*\n** Copyright (c) 2022 ARM Limited\n**\n** Permission is hereby granted, free of charge, to any person obtaining a copy\n** of this software and/or associated documentation files (the \"Materials\"),\n** to deal in the Materials without restriction, including without limitation\n** the rights to use, copy, modify, merge, publish, distribute, sublicense,\n** and/or sell copies of the Materials, and to permit persons to whom the\n** Materials are furnished to do so, subject to the following conditions:\n**\n** The above copyright notice and this permission notice shall be included in\n** all copies or substantial portions of the Materials.\n**\n** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS\n** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND\n** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/\n**\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS\n** IN THE MATERIALS.\n*/\n\n#ifndef GLSLextARM_H\n#define GLSLextARM_H\n\nstatic const int GLSLextARMVersion = 100;\nstatic const int GLSLextARMRevision = 1;\n\nstatic const char * const E_SPV_ARM_core_builtins = \"SPV_ARM_core_builtins\";\n\n#endif  // #ifndef GLSLextARM_H\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/GLSL.ext.EXT.h",
    "content": "/*\n** Copyright (c) 2014-2016 The Khronos Group Inc.\n**\n** Permission is hereby granted, free of charge, to any person obtaining a copy\n** of this software and/or associated documentation files (the \"Materials\"),\n** to deal in the Materials without restriction, including without limitation\n** the rights to use, copy, modify, merge, publish, distribute, sublicense,\n** and/or sell copies of the Materials, and to permit persons to whom the\n** Materials are furnished to do so, subject to the following conditions:\n**\n** The above copyright notice and this permission notice shall be included in\n** all copies or substantial portions of the Materials.\n**\n** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS\n** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND\n** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/\n**\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS\n** IN THE MATERIALS.\n*/\n\n#ifndef GLSLextEXT_H\n#define GLSLextEXT_H\n\nstatic const int GLSLextEXTVersion = 100;\nstatic const int GLSLextEXTRevision = 2;\n\nstatic const char* const E_SPV_EXT_shader_stencil_export        = \"SPV_EXT_shader_stencil_export\";\nstatic const char* const E_SPV_EXT_shader_viewport_index_layer  = \"SPV_EXT_shader_viewport_index_layer\";\nstatic const char* const E_SPV_EXT_fragment_fully_covered = \"SPV_EXT_fragment_fully_covered\";\nstatic const char* const E_SPV_EXT_fragment_invocation_density = \"SPV_EXT_fragment_invocation_density\";\nstatic const char* const E_SPV_EXT_demote_to_helper_invocation = \"SPV_EXT_demote_to_helper_invocation\";\nstatic const char* const E_SPV_EXT_shader_atomic_float_add = \"SPV_EXT_shader_atomic_float_add\";\nstatic const char* const E_SPV_EXT_shader_atomic_float16_add = \"SPV_EXT_shader_atomic_float16_add\";\nstatic const char* const E_SPV_EXT_shader_atomic_float_min_max = \"SPV_EXT_shader_atomic_float_min_max\";\nstatic const char* const E_SPV_EXT_shader_image_int64 = \"SPV_EXT_shader_image_int64\";\nstatic const char* const E_SPV_EXT_shader_tile_image = \"SPV_EXT_shader_tile_image\";\nstatic const char* const E_SPV_EXT_mesh_shader = \"SPV_EXT_mesh_shader\";\nstatic const char* const E_SPV_ARM_cooperative_matrix_layouts = \"SPV_ARM_cooperative_matrix_layouts\";\nstatic const char* const E_SPV_EXT_float8 = \"SPV_EXT_float8\";\n\n#endif  // #ifndef GLSLextEXT_H\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/GLSL.ext.KHR.h",
    "content": "/*\n** Copyright (c) 2014-2020 The Khronos Group Inc.\n** Copyright (C) 2022-2024 Arm Limited.\n** Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.\n**\n** Permission is hereby granted, free of charge, to any person obtaining a copy\n** of this software and/or associated documentation files (the \"Materials\"),\n** to deal in the Materials without restriction, including without limitation\n** the rights to use, copy, modify, merge, publish, distribute, sublicense,\n** and/or sell copies of the Materials, and to permit persons to whom the\n** Materials are furnished to do so, subject to the following conditions:\n**\n** The above copyright notice and this permission notice shall be included in\n** all copies or substantial portions of the Materials.\n**\n** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS\n** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND\n** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/\n**\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS\n** IN THE MATERIALS.\n*/\n\n#ifndef GLSLextKHR_H\n#define GLSLextKHR_H\n\nstatic const int GLSLextKHRVersion = 100;\nstatic const int GLSLextKHRRevision = 3;\n\nstatic const char* const E_SPV_KHR_shader_ballot                = \"SPV_KHR_shader_ballot\";\nstatic const char* const E_SPV_KHR_subgroup_vote                = \"SPV_KHR_subgroup_vote\";\nstatic const char* const E_SPV_KHR_device_group                 = \"SPV_KHR_device_group\";\nstatic const char* const E_SPV_KHR_multiview                    = \"SPV_KHR_multiview\";\nstatic const char* const E_SPV_KHR_shader_draw_parameters       = \"SPV_KHR_shader_draw_parameters\";\nstatic const char* const E_SPV_KHR_16bit_storage                = \"SPV_KHR_16bit_storage\";\nstatic const char* const E_SPV_KHR_8bit_storage                 = \"SPV_KHR_8bit_storage\";\nstatic const char* const E_SPV_KHR_storage_buffer_storage_class = \"SPV_KHR_storage_buffer_storage_class\";\nstatic const char* const E_SPV_KHR_post_depth_coverage          = \"SPV_KHR_post_depth_coverage\";\nstatic const char* const E_SPV_KHR_vulkan_memory_model          = \"SPV_KHR_vulkan_memory_model\";\nstatic const char* const E_SPV_EXT_physical_storage_buffer      = \"SPV_EXT_physical_storage_buffer\";\nstatic const char* const E_SPV_KHR_physical_storage_buffer      = \"SPV_KHR_physical_storage_buffer\";\nstatic const char* const E_SPV_EXT_fragment_shader_interlock    = \"SPV_EXT_fragment_shader_interlock\";\nstatic const char* const E_SPV_KHR_shader_clock                 = \"SPV_KHR_shader_clock\";\nstatic const char* const E_SPV_KHR_non_semantic_info            = \"SPV_KHR_non_semantic_info\";\nstatic const char* const E_SPV_KHR_ray_tracing                  = \"SPV_KHR_ray_tracing\";\nstatic const char* const E_SPV_KHR_ray_query                    = \"SPV_KHR_ray_query\";\nstatic const char* const E_SPV_KHR_fragment_shading_rate        = \"SPV_KHR_fragment_shading_rate\";\nstatic const char* const E_SPV_KHR_terminate_invocation         = \"SPV_KHR_terminate_invocation\";\nstatic const char* const E_SPV_KHR_workgroup_memory_explicit_layout = \"SPV_KHR_workgroup_memory_explicit_layout\";\nstatic const char* const E_SPV_KHR_subgroup_uniform_control_flow = \"SPV_KHR_subgroup_uniform_control_flow\";\nstatic const char* const E_SPV_KHR_fragment_shader_barycentric = \"SPV_KHR_fragment_shader_barycentric\";\nstatic const char* const E_SPV_KHR_quad_control                = \"SPV_KHR_quad_control\";\nstatic const char* const E_SPV_AMD_shader_early_and_late_fragment_tests = \"SPV_AMD_shader_early_and_late_fragment_tests\";\nstatic const char* const E_SPV_KHR_ray_tracing_position_fetch   = \"SPV_KHR_ray_tracing_position_fetch\";\nstatic const char* const E_SPV_KHR_cooperative_matrix           = \"SPV_KHR_cooperative_matrix\";\nstatic const char* const E_SPV_KHR_maximal_reconvergence        = \"SPV_KHR_maximal_reconvergence\";\nstatic const char* const E_SPV_KHR_subgroup_rotate              = \"SPV_KHR_subgroup_rotate\";\nstatic const char* const E_SPV_KHR_expect_assume                = \"SPV_KHR_expect_assume\";\nstatic const char* const E_SPV_EXT_replicated_composites        = \"SPV_EXT_replicated_composites\";\nstatic const char* const E_SPV_KHR_relaxed_extended_instruction = \"SPV_KHR_relaxed_extended_instruction\";\nstatic const char* const E_SPV_KHR_integer_dot_product          = \"SPV_KHR_integer_dot_product\";\nstatic const char* const E_SPV_NV_cooperative_vector            = \"SPV_NV_cooperative_vector\";\nstatic const char* const E_SPV_KHR_bfloat16                     = \"SPV_KHR_bfloat16\";\n\n#endif  // #ifndef GLSLextKHR_H\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/GLSL.ext.NV.h",
    "content": "/*\n** Copyright (c) 2014-2017 The Khronos Group Inc.\n**\n** Permission is hereby granted, free of charge, to any person obtaining a copy\n** of this software and/or associated documentation files (the \"Materials\"),\n** to deal in the Materials without restriction, including without limitation\n** the rights to use, copy, modify, merge, publish, distribute, sublicense,\n** and/or sell copies of the Materials, and to permit persons to whom the\n** Materials are furnished to do so, subject to the following conditions:\n**\n** The above copyright notice and this permission notice shall be included in\n** all copies or substantial portions of the Materials.\n**\n** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS\n** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND\n** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/\n**\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS\n** IN THE MATERIALS.\n*/\n\n#ifndef GLSLextNV_H\n#define GLSLextNV_H\n\nenum class BuiltIn : unsigned;\nenum class Decoration : unsigned;\nenum class Op : unsigned;\nenum class Capability : unsigned;\n\nstatic const int GLSLextNVVersion = 100;\nstatic const int GLSLextNVRevision = 11;\n\n//SPV_NV_sample_mask_override_coverage\nconst char* const E_SPV_NV_sample_mask_override_coverage = \"SPV_NV_sample_mask_override_coverage\";\n\n//SPV_NV_geometry_shader_passthrough\nconst char* const E_SPV_NV_geometry_shader_passthrough = \"SPV_NV_geometry_shader_passthrough\";\n\n//SPV_NV_viewport_array2\nconst char* const E_SPV_NV_viewport_array2 = \"SPV_NV_viewport_array2\";\nconst char* const E_ARB_shader_viewport_layer_array = \"SPV_ARB_shader_viewport_layer_array\";\n\n//SPV_NV_stereo_view_rendering\nconst char* const E_SPV_NV_stereo_view_rendering = \"SPV_NV_stereo_view_rendering\";\n\n//SPV_NVX_multiview_per_view_attributes\nconst char* const E_SPV_NVX_multiview_per_view_attributes = \"SPV_NVX_multiview_per_view_attributes\";\n\n//SPV_NV_shader_subgroup_partitioned\nconst char* const E_SPV_NV_shader_subgroup_partitioned = \"SPV_NV_shader_subgroup_partitioned\";\n\n//SPV_NV_fragment_shader_barycentric\nconst char* const E_SPV_NV_fragment_shader_barycentric = \"SPV_NV_fragment_shader_barycentric\";\n\n//SPV_NV_compute_shader_derivatives\nconst char* const E_SPV_NV_compute_shader_derivatives = \"SPV_NV_compute_shader_derivatives\";\n\n//SPV_NV_shader_image_footprint\nconst char* const E_SPV_NV_shader_image_footprint = \"SPV_NV_shader_image_footprint\";\n\n//SPV_NV_mesh_shader\nconst char* const E_SPV_NV_mesh_shader = \"SPV_NV_mesh_shader\";\n\n//SPV_NV_raytracing\nconst char* const E_SPV_NV_ray_tracing = \"SPV_NV_ray_tracing\";\n\n//SPV_NV_ray_tracing_motion_blur\nconst char* const E_SPV_NV_ray_tracing_motion_blur = \"SPV_NV_ray_tracing_motion_blur\";\n\n//SPV_NV_shading_rate\nconst char* const E_SPV_NV_shading_rate = \"SPV_NV_shading_rate\";\n\n//SPV_NV_cooperative_matrix\nconst char* const E_SPV_NV_cooperative_matrix = \"SPV_NV_cooperative_matrix\";\n\n//SPV_NV_shader_sm_builtins\nconst char* const E_SPV_NV_shader_sm_builtins = \"SPV_NV_shader_sm_builtins\";\n\n//SPV_NV_shader_execution_reorder\nconst char* const E_SPV_NV_shader_invocation_reorder = \"SPV_NV_shader_invocation_reorder\";\n\n//SPV_NV_displacement_micromap\nconst char* const E_SPV_NV_displacement_micromap = \"SPV_NV_displacement_micromap\";\n\n//SPV_NV_shader_atomic_fp16_vector\nconst char* const E_SPV_NV_shader_atomic_fp16_vector = \"SPV_NV_shader_atomic_fp16_vector\";\n\n//SPV_NV_tensor_addressing\nconst char* const E_SPV_NV_tensor_addressing = \"SPV_NV_tensor_addressing\";\n\n//SPV_NV_cooperative_matrix2\nconst char* const E_SPV_NV_cooperative_matrix2 = \"SPV_NV_cooperative_matrix2\";\n\n//SPV_NV_cluster_acceleration_structure\nconst char* const E_SPV_NV_cluster_acceleration_structure = \"SPV_NV_cluster_acceleration_structure\";\n\n//SPV_NV_linear_swept_spheres\nconst char* const E_SPV_NV_linear_swept_spheres = \"SPV_NV_linear_swept_spheres\";\n#endif  // #ifndef GLSLextNV_H\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/GLSL.ext.QCOM.h",
    "content": "/*\n** Copyright (c) 2021 The Khronos Group Inc.\n**\n** Permission is hereby granted, free of charge, to any person obtaining a copy\n** of this software and/or associated documentation files (the \"Materials\"),\n** to deal in the Materials without restriction, including without limitation\n** the rights to use, copy, modify, merge, publish, distribute, sublicense,\n** and/or sell copies of the Materials, and to permit persons to whom the\n** Materials are furnished to do so, subject to the following conditions:\n**\n** The above copyright notice and this permission notice shall be included in\n** all copies or substantial portions of the Materials.\n**\n** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS\n** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND\n** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/\n**\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS\n** IN THE MATERIALS.\n*/\n\n#ifndef GLSLextQCOM_H\n#define GLSLextQCOM_H\n\nenum class BuiltIn : unsigned;\nenum class Decoration : unsigned;\nenum class Op : unsigned;\nenum class Capability : unsigned;\n\nstatic const int GLSLextQCOMVersion = 100;\nstatic const int GLSLextQCOMRevision = 1;\n\n//SPV_QCOM_image_processing\nconst char* const E_SPV_QCOM_image_processing = \"SPV_QCOM_image_processing\";\n//SPV_QCOM_image_processing2\nconst char* const E_SPV_QCOM_image_processing2 = \"SPV_QCOM_image_processing2\";\n\n//SPV_QCOM_tile_shading\nconst char* const E_SPV_QCOM_tile_shading = \"SPV_QCOM_tile_shading\";\n\n#endif  // #ifndef GLSLextQCOM_H\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/GLSL.std.450.h",
    "content": "/*\n** Copyright (c) 2014-2016 The Khronos Group Inc.\n**\n** Permission is hereby granted, free of charge, to any person obtaining a copy\n** of this software and/or associated documentation files (the \"Materials\"),\n** to deal in the Materials without restriction, including without limitation\n** the rights to use, copy, modify, merge, publish, distribute, sublicense,\n** and/or sell copies of the Materials, and to permit persons to whom the\n** Materials are furnished to do so, subject to the following conditions:\n**\n** The above copyright notice and this permission notice shall be included in\n** all copies or substantial portions of the Materials.\n**\n** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS\n** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND\n** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/\n**\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS\n** IN THE MATERIALS.\n*/\n\n#ifndef GLSLstd450_H\n#define GLSLstd450_H\n\nstatic const int GLSLstd450Version = 100;\nstatic const int GLSLstd450Revision = 1;\n\nenum GLSLstd450 {\n    GLSLstd450Bad = 0,              // Don't use\n\n    GLSLstd450Round = 1,\n    GLSLstd450RoundEven = 2,\n    GLSLstd450Trunc = 3,\n    GLSLstd450FAbs = 4,\n    GLSLstd450SAbs = 5,\n    GLSLstd450FSign = 6,\n    GLSLstd450SSign = 7,\n    GLSLstd450Floor = 8,\n    GLSLstd450Ceil = 9,\n    GLSLstd450Fract = 10,\n\n    GLSLstd450Radians = 11,\n    GLSLstd450Degrees = 12,\n    GLSLstd450Sin = 13,\n    GLSLstd450Cos = 14,\n    GLSLstd450Tan = 15,\n    GLSLstd450Asin = 16,\n    GLSLstd450Acos = 17,\n    GLSLstd450Atan = 18,\n    GLSLstd450Sinh = 19,\n    GLSLstd450Cosh = 20,\n    GLSLstd450Tanh = 21,\n    GLSLstd450Asinh = 22,\n    GLSLstd450Acosh = 23,\n    GLSLstd450Atanh = 24,\n    GLSLstd450Atan2 = 25,\n\n    GLSLstd450Pow = 26,\n    GLSLstd450Exp = 27,\n    GLSLstd450Log = 28,\n    GLSLstd450Exp2 = 29,\n    GLSLstd450Log2 = 30,\n    GLSLstd450Sqrt = 31,\n    GLSLstd450InverseSqrt = 32,\n\n    GLSLstd450Determinant = 33,\n    GLSLstd450MatrixInverse = 34,\n\n    GLSLstd450Modf = 35,            // second operand needs an OpVariable to write to\n    GLSLstd450ModfStruct = 36,      // no OpVariable operand\n    GLSLstd450FMin = 37,\n    GLSLstd450UMin = 38,\n    GLSLstd450SMin = 39,\n    GLSLstd450FMax = 40,\n    GLSLstd450UMax = 41,\n    GLSLstd450SMax = 42,\n    GLSLstd450FClamp = 43,\n    GLSLstd450UClamp = 44,\n    GLSLstd450SClamp = 45,\n    GLSLstd450FMix = 46,\n    GLSLstd450IMix = 47,            // Reserved\n    GLSLstd450Step = 48,\n    GLSLstd450SmoothStep = 49,\n\n    GLSLstd450Fma = 50,\n    GLSLstd450Frexp = 51,            // second operand needs an OpVariable to write to\n    GLSLstd450FrexpStruct = 52,      // no OpVariable operand\n    GLSLstd450Ldexp = 53,\n\n    GLSLstd450PackSnorm4x8 = 54,\n    GLSLstd450PackUnorm4x8 = 55,\n    GLSLstd450PackSnorm2x16 = 56,\n    GLSLstd450PackUnorm2x16 = 57,\n    GLSLstd450PackHalf2x16 = 58,\n    GLSLstd450PackDouble2x32 = 59,\n    GLSLstd450UnpackSnorm2x16 = 60,\n    GLSLstd450UnpackUnorm2x16 = 61,\n    GLSLstd450UnpackHalf2x16 = 62,\n    GLSLstd450UnpackSnorm4x8 = 63,\n    GLSLstd450UnpackUnorm4x8 = 64,\n    GLSLstd450UnpackDouble2x32 = 65,\n\n    GLSLstd450Length = 66,\n    GLSLstd450Distance = 67,\n    GLSLstd450Cross = 68,\n    GLSLstd450Normalize = 69,\n    GLSLstd450FaceForward = 70,\n    GLSLstd450Reflect = 71,\n    GLSLstd450Refract = 72,\n\n    GLSLstd450FindILsb = 73,\n    GLSLstd450FindSMsb = 74,\n    GLSLstd450FindUMsb = 75,\n\n    GLSLstd450InterpolateAtCentroid = 76,\n    GLSLstd450InterpolateAtSample = 77,\n    GLSLstd450InterpolateAtOffset = 78,\n\n    GLSLstd450NMin = 79,\n    GLSLstd450NMax = 80,\n    GLSLstd450NClamp = 81,\n\n    GLSLstd450Count\n};\n\n#endif  // #ifndef GLSLstd450_H\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/GlslangToSpv.cpp",
    "content": "//\n// Copyright (C) 2014-2016 LunarG, Inc.\n// Copyright (C) 2015-2020 Google, Inc.\n// Copyright (C) 2017, 2022-2025 Arm Limited.\n// Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Visit the nodes in the glslang intermediate tree representation to\n// translate them to SPIR-V.\n//\n\n#include \"spirv.hpp11\"\n#include \"GlslangToSpv.h\"\n#include \"SpvBuilder.h\"\n#include \"SpvTools.h\"\n#include \"spvUtil.h\"\n\nnamespace spv {\n    #include \"GLSL.std.450.h\"\n    #include \"GLSL.ext.KHR.h\"\n    #include \"GLSL.ext.EXT.h\"\n    #include \"GLSL.ext.AMD.h\"\n    #include \"GLSL.ext.NV.h\"\n    #include \"GLSL.ext.ARM.h\"\n    #include \"GLSL.ext.QCOM.h\"\n    #include \"NonSemanticDebugPrintf.h\"\n}\n\n// Glslang includes\n#include \"../glslang/MachineIndependent/localintermediate.h\"\n#include \"../glslang/MachineIndependent/SymbolTable.h\"\n#include \"../glslang/Include/Common.h\"\n\n// Build-time generated includes\n#include \"../glslang/build_info.h\"\n\n#include <fstream>\n#include <iomanip>\n#include <list>\n#include <map>\n#include <optional>\n#include <stack>\n#include <string>\n#include <vector>\n\nnamespace {\n\nnamespace {\nclass SpecConstantOpModeGuard {\npublic:\n    SpecConstantOpModeGuard(spv::Builder* builder)\n        : builder_(builder) {\n        previous_flag_ = builder->isInSpecConstCodeGenMode();\n    }\n    ~SpecConstantOpModeGuard() {\n        previous_flag_ ? builder_->setToSpecConstCodeGenMode()\n                       : builder_->setToNormalCodeGenMode();\n    }\n    void turnOnSpecConstantOpMode() {\n        builder_->setToSpecConstCodeGenMode();\n    }\n\nprivate:\n    spv::Builder* builder_;\n    bool previous_flag_;\n};\n\nstruct OpDecorations {\n    public:\n        OpDecorations(spv::Decoration precision, spv::Decoration noContraction, spv::Decoration nonUniform) :\n            precision(precision)\n            ,\n            noContraction(noContraction),\n            nonUniform(nonUniform)\n        { }\n\n    spv::Decoration precision;\n\n        void addNoContraction(spv::Builder& builder, spv::Id t) { builder.addDecoration(t, noContraction); }\n        void addNonUniform(spv::Builder& builder, spv::Id t)  { builder.addDecoration(t, nonUniform); }\n    protected:\n        spv::Decoration noContraction;\n        spv::Decoration nonUniform;\n};\n\n} // namespace\n\n//\n// The main holder of information for translating glslang to SPIR-V.\n//\n// Derives from the AST walking base class.\n//\nclass TGlslangToSpvTraverser : public glslang::TIntermTraverser {\npublic:\n    TGlslangToSpvTraverser(unsigned int spvVersion, const glslang::TIntermediate*, spv::SpvBuildLogger* logger,\n        glslang::SpvOptions& options);\n    virtual ~TGlslangToSpvTraverser() { }\n\n    bool visitAggregate(glslang::TVisit, glslang::TIntermAggregate*);\n    bool visitBinary(glslang::TVisit, glslang::TIntermBinary*);\n    void visitConstantUnion(glslang::TIntermConstantUnion*);\n    bool visitSelection(glslang::TVisit, glslang::TIntermSelection*);\n    bool visitSwitch(glslang::TVisit, glslang::TIntermSwitch*);\n    void visitSymbol(glslang::TIntermSymbol* symbol);\n    bool visitUnary(glslang::TVisit, glslang::TIntermUnary*);\n    bool visitLoop(glslang::TVisit, glslang::TIntermLoop*);\n    bool visitBranch(glslang::TVisit visit, glslang::TIntermBranch*);\n\n    void finishSpv(bool compileOnly);\n    void dumpSpv(std::vector<unsigned int>& out);\n\nprotected:\n    TGlslangToSpvTraverser(TGlslangToSpvTraverser&);\n    TGlslangToSpvTraverser& operator=(TGlslangToSpvTraverser&);\n\n    spv::Decoration TranslateInterpolationDecoration(const glslang::TQualifier& qualifier);\n    spv::Decoration TranslateAuxiliaryStorageDecoration(const glslang::TQualifier& qualifier);\n    spv::Decoration TranslateNonUniformDecoration(const glslang::TQualifier& qualifier);\n    spv::Decoration TranslateNonUniformDecoration(const spv::Builder::AccessChain::CoherentFlags& coherentFlags);\n    spv::Builder::AccessChain::CoherentFlags TranslateCoherent(const glslang::TType& type);\n    spv::MemoryAccessMask TranslateMemoryAccess(const spv::Builder::AccessChain::CoherentFlags &coherentFlags);\n    spv::ImageOperandsMask TranslateImageOperands(const spv::Builder::AccessChain::CoherentFlags &coherentFlags);\n    spv::Scope TranslateMemoryScope(const spv::Builder::AccessChain::CoherentFlags &coherentFlags);\n    spv::BuiltIn TranslateBuiltInDecoration(glslang::TBuiltInVariable, bool memberDeclaration);\n    spv::ImageFormat TranslateImageFormat(const glslang::TType& type);\n    spv::SelectionControlMask TranslateSelectionControl(const glslang::TIntermSelection&) const;\n    spv::SelectionControlMask TranslateSwitchControl(const glslang::TIntermSwitch&) const;\n    spv::LoopControlMask TranslateLoopControl(const glslang::TIntermLoop&, std::vector<unsigned int>& operands) const;\n    spv::StorageClass TranslateStorageClass(const glslang::TType&);\n    void TranslateLiterals(const glslang::TVector<const glslang::TIntermConstantUnion*>&, std::vector<unsigned>&) const;\n    void addIndirectionIndexCapabilities(const glslang::TType& baseType, const glslang::TType& indexType);\n    spv::Id createSpvVariable(const glslang::TIntermSymbol*, spv::Id forcedType);\n    spv::Id getSampledType(const glslang::TSampler&);\n    spv::Id getInvertedSwizzleType(const glslang::TIntermTyped&);\n    spv::Id createInvertedSwizzle(spv::Decoration precision, const glslang::TIntermTyped&, spv::Id parentResult);\n    void convertSwizzle(const glslang::TIntermAggregate&, std::vector<unsigned>& swizzle);\n    spv::Id convertGlslangToSpvType(const glslang::TType& type, bool forwardReferenceOnly = false);\n    spv::Id convertGlslangToSpvType(const glslang::TType& type, glslang::TLayoutPacking, const glslang::TQualifier&,\n        bool lastBufferBlockMember, bool forwardReferenceOnly = false);\n    void applySpirvDecorate(const glslang::TType& type, spv::Id id, std::optional<int> member);\n    bool filterMember(const glslang::TType& member);\n    spv::Id convertGlslangStructToSpvType(const glslang::TType&, const glslang::TTypeList* glslangStruct,\n                                          glslang::TLayoutPacking, const glslang::TQualifier&);\n    spv::LinkageType convertGlslangLinkageToSpv(glslang::TLinkType glslangLinkType);\n    void decorateStructType(const glslang::TType&, const glslang::TTypeList* glslangStruct, glslang::TLayoutPacking,\n                            const glslang::TQualifier&, spv::Id, const std::vector<spv::Id>& spvMembers);\n    spv::Id makeArraySizeId(const glslang::TArraySizes&, int dim, bool allowZero = false, bool boolType = false);\n    spv::Id accessChainLoad(const glslang::TType& type);\n    void    accessChainStore(const glslang::TType& type, spv::Id rvalue);\n    void multiTypeStore(const glslang::TType&, spv::Id rValue);\n    spv::Id convertLoadedBoolInUniformToUint(const glslang::TType& type, spv::Id nominalTypeId, spv::Id loadedId);\n    glslang::TLayoutPacking getExplicitLayout(const glslang::TType& type) const;\n    int getArrayStride(const glslang::TType& arrayType, glslang::TLayoutPacking, glslang::TLayoutMatrix);\n    int getMatrixStride(const glslang::TType& matrixType, glslang::TLayoutPacking, glslang::TLayoutMatrix);\n    void updateMemberOffset(const glslang::TType& structType, const glslang::TType& memberType, int& currentOffset,\n                            int& nextOffset, glslang::TLayoutPacking, glslang::TLayoutMatrix);\n    void declareUseOfStructMember(const glslang::TTypeList& members, int glslangMember);\n\n    bool isShaderEntryPoint(const glslang::TIntermAggregate* node);\n    bool writableParam(glslang::TStorageQualifier) const;\n    bool originalParam(glslang::TStorageQualifier, const glslang::TType&, bool implicitThisParam);\n    void makeFunctions(const glslang::TIntermSequence&);\n    void makeGlobalInitializers(const glslang::TIntermSequence&);\n    void collectRayTracingLinkerObjects();\n    void visitFunctions(const glslang::TIntermSequence&);\n    void handleFunctionEntry(const glslang::TIntermAggregate* node);\n    void translateArguments(const glslang::TIntermAggregate& node, std::vector<spv::Id>& arguments,\n        spv::Builder::AccessChain::CoherentFlags &lvalueCoherentFlags);\n    void translateArguments(glslang::TIntermUnary& node, std::vector<spv::Id>& arguments);\n    spv::Id createImageTextureFunctionCall(glslang::TIntermOperator* node);\n    spv::Id handleUserFunctionCall(const glslang::TIntermAggregate*);\n\n    spv::Id createBinaryOperation(glslang::TOperator op, OpDecorations&, spv::Id typeId, spv::Id left, spv::Id right,\n                                  glslang::TBasicType typeProxy, bool reduceComparison = true);\n    spv::Id createBinaryMatrixOperation(spv::Op, OpDecorations&, spv::Id typeId, spv::Id left, spv::Id right);\n    spv::Id createUnaryOperation(glslang::TOperator op, OpDecorations&, spv::Id typeId, spv::Id operand,\n                                 glslang::TBasicType typeProxy,\n                                 const spv::Builder::AccessChain::CoherentFlags &lvalueCoherentFlags,\n                                 const glslang::TType &opType);\n    spv::Id createUnaryMatrixOperation(spv::Op op, OpDecorations&, spv::Id typeId, spv::Id operand,\n                                       glslang::TBasicType typeProxy);\n    spv::Id createConversion(glslang::TOperator op, OpDecorations&, spv::Id destTypeId, spv::Id operand,\n                             glslang::TBasicType resultBasicType, glslang::TBasicType operandBasicType);\n    spv::Id createIntWidthConversion(spv::Id operand, int vectorSize, spv::Id destType,\n                                     glslang::TBasicType resultBasicType, glslang::TBasicType operandBasicType);\n    spv::Id makeSmearedConstant(spv::Id constant, int vectorSize);\n    spv::Id createAtomicOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId,\n        std::vector<spv::Id>& operands, glslang::TBasicType typeProxy,\n        const spv::Builder::AccessChain::CoherentFlags &lvalueCoherentFlags,\n        const glslang::TType &opType);\n    spv::Id createInvocationsOperation(glslang::TOperator op, spv::Id typeId, std::vector<spv::Id>& operands,\n        glslang::TBasicType typeProxy);\n    spv::Id CreateInvocationsVectorOperation(spv::Op op, spv::GroupOperation groupOperation,\n        spv::Id typeId, std::vector<spv::Id>& operands);\n    spv::Id createSubgroupOperation(glslang::TOperator op, spv::Id typeId, std::vector<spv::Id>& operands,\n        glslang::TBasicType typeProxy);\n    spv::Id createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId,\n        std::vector<spv::Id>& operands, glslang::TBasicType typeProxy);\n    spv::Id createNoArgOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId);\n    spv::Id getSymbolId(const glslang::TIntermSymbol* node);\n    void addMeshNVDecoration(spv::Id id, int member, const glslang::TQualifier & qualifier);\n    bool hasQCOMImageProceessingDecoration(spv::Id id, spv::Decoration decor);\n    void addImageProcessingQCOMDecoration(spv::Id id, spv::Decoration decor);\n    void addImageProcessing2QCOMDecoration(spv::Id id, bool isForGather);\n    spv::Id createSpvConstant(const glslang::TIntermTyped&);\n    spv::Id createSpvConstantFromConstUnionArray(const glslang::TType& type, const glslang::TConstUnionArray&,\n        int& nextConst, bool specConstant);\n    bool isTrivialLeaf(const glslang::TIntermTyped* node);\n    bool isTrivial(const glslang::TIntermTyped* node);\n    spv::Id createShortCircuit(glslang::TOperator, glslang::TIntermTyped& left, glslang::TIntermTyped& right);\n    spv::Id getExtBuiltins(const char* name);\n    std::pair<spv::Id, spv::Id> getForcedType(glslang::TBuiltInVariable builtIn, const glslang::TType&);\n    spv::Id translateForcedType(spv::Id object);\n    spv::Id createCompositeConstruct(spv::Id typeId, std::vector<spv::Id> constituents);\n\n    glslang::SpvOptions& options;\n    spv::Function* shaderEntry;\n    spv::Function* currentFunction;\n    spv::Instruction* entryPoint;\n    int sequenceDepth;\n\n    spv::SpvBuildLogger* logger;\n\n    // There is a 1:1 mapping between a spv builder and a module; this is thread safe\n    spv::Builder builder;\n    bool inEntryPoint;\n    bool entryPointTerminated;\n    bool linkageOnly;                  // true when visiting the set of objects in the AST present only for\n                                       // establishing interface, whether or not they were statically used\n    std::set<spv::Id> iOSet;           // all input/output variables from either static use or declaration of interface\n    const glslang::TIntermediate* glslangIntermediate;\n    bool nanMinMaxClamp;               // true if use NMin/NMax/NClamp instead of FMin/FMax/FClamp\n    spv::Id stdBuiltins;\n    spv::Id nonSemanticDebugPrintf;\n    std::unordered_map<std::string, spv::Id> extBuiltinMap;\n\n    std::unordered_map<long long, spv::Id> symbolValues;\n    std::unordered_map<uint32_t, spv::Id> builtInVariableIds;\n    std::unordered_set<long long> rValueParameters;  // set of formal function parameters passed as rValues,\n                                               // rather than a pointer\n    std::unordered_map<std::string, spv::Function*> functionMap;\n    std::unordered_map<const glslang::TTypeList*, spv::Id> structMap[glslang::ElpCount][glslang::ElmCount];\n    // for mapping glslang block indices to spv indices (e.g., due to hidden members):\n    std::unordered_map<long long, std::vector<int>> memberRemapper;\n    // for mapping glslang symbol struct to symbol Id\n    std::unordered_map<const glslang::TTypeList*, long long> glslangTypeToIdMap;\n    std::stack<bool> breakForLoop;  // false means break for switch\n    std::unordered_map<std::string, const glslang::TIntermSymbol*> counterOriginator;\n    // Map pointee types for EbtReference to their forward pointers\n    std::map<const glslang::TType *, spv::Id> forwardPointers;\n    // Type forcing, for when SPIR-V wants a different type than the AST,\n    // requiring local translation to and from SPIR-V type on every access.\n    // Maps <builtin-variable-id -> AST-required-type-id>\n    std::unordered_map<spv::Id, spv::Id> forceType;\n    // Used by Task shader while generating opearnds for OpEmitMeshTasksEXT\n    spv::Id taskPayloadID;\n    // Used later for generating OpTraceKHR/OpExecuteCallableKHR/OpHitObjectRecordHit*/OpHitObjectGetShaderBindingTableData\n    std::unordered_map<unsigned int, glslang::TIntermSymbol *> locationToSymbol[4];\n    std::unordered_map<spv::Id, std::vector<spv::Decoration> > idToQCOMDecorations;\n};\n\n//\n// Helper functions for translating glslang representations to SPIR-V enumerants.\n//\n\n// Translate glslang profile to SPIR-V source language.\nspv::SourceLanguage TranslateSourceLanguage(glslang::EShSource source, EProfile profile)\n{\n    switch (source) {\n    case glslang::EShSourceGlsl:\n        switch (profile) {\n        case ENoProfile:\n        case ECoreProfile:\n        case ECompatibilityProfile:\n            return spv::SourceLanguage::GLSL;\n        case EEsProfile:\n            return spv::SourceLanguage::ESSL;\n        default:\n            return spv::SourceLanguage::Unknown;\n        }\n    case glslang::EShSourceHlsl:\n        return spv::SourceLanguage::HLSL;\n    default:\n        return spv::SourceLanguage::Unknown;\n    }\n}\n\n// Translate glslang language (stage) to SPIR-V execution model.\nspv::ExecutionModel TranslateExecutionModel(EShLanguage stage, bool isMeshShaderEXT = false)\n{\n    switch (stage) {\n    case EShLangVertex:           return spv::ExecutionModel::Vertex;\n    case EShLangFragment:         return spv::ExecutionModel::Fragment;\n    case EShLangCompute:          return spv::ExecutionModel::GLCompute;\n    case EShLangTessControl:      return spv::ExecutionModel::TessellationControl;\n    case EShLangTessEvaluation:   return spv::ExecutionModel::TessellationEvaluation;\n    case EShLangGeometry:         return spv::ExecutionModel::Geometry;\n    case EShLangRayGen:           return spv::ExecutionModel::RayGenerationKHR;\n    case EShLangIntersect:        return spv::ExecutionModel::IntersectionKHR;\n    case EShLangAnyHit:           return spv::ExecutionModel::AnyHitKHR;\n    case EShLangClosestHit:       return spv::ExecutionModel::ClosestHitKHR;\n    case EShLangMiss:             return spv::ExecutionModel::MissKHR;\n    case EShLangCallable:         return spv::ExecutionModel::CallableKHR;\n    case EShLangTask:             return (isMeshShaderEXT)? spv::ExecutionModel::TaskEXT : spv::ExecutionModel::TaskNV;\n    case EShLangMesh:             return (isMeshShaderEXT)? spv::ExecutionModel::MeshEXT : spv::ExecutionModel::MeshNV;\n    default:\n        assert(0);\n        return spv::ExecutionModel::Fragment;\n    }\n}\n\n// Translate glslang sampler type to SPIR-V dimensionality.\nspv::Dim TranslateDimensionality(const glslang::TSampler& sampler)\n{\n    switch (sampler.dim) {\n    case glslang::Esd1D:      return spv::Dim::Dim1D;\n    case glslang::Esd2D:      return spv::Dim::Dim2D;\n    case glslang::Esd3D:      return spv::Dim::Dim3D;\n    case glslang::EsdCube:    return spv::Dim::Cube;\n    case glslang::EsdRect:    return spv::Dim::Rect;\n    case glslang::EsdBuffer:  return spv::Dim::Buffer;\n    case glslang::EsdSubpass: return spv::Dim::SubpassData;\n    case glslang::EsdAttachmentEXT: return spv::Dim::TileImageDataEXT;\n    default:\n        assert(0);\n        return spv::Dim::Dim2D;\n    }\n}\n\n// Translate glslang precision to SPIR-V precision decorations.\nspv::Decoration TranslatePrecisionDecoration(glslang::TPrecisionQualifier glslangPrecision)\n{\n    switch (glslangPrecision) {\n    case glslang::EpqLow:    return spv::Decoration::RelaxedPrecision;\n    case glslang::EpqMedium: return spv::Decoration::RelaxedPrecision;\n    default:\n        return spv::NoPrecision;\n    }\n}\n\n// Translate glslang type to SPIR-V precision decorations.\nspv::Decoration TranslatePrecisionDecoration(const glslang::TType& type)\n{\n    return TranslatePrecisionDecoration(type.getQualifier().precision);\n}\n\n// Translate glslang type to SPIR-V block decorations.\nspv::Decoration TranslateBlockDecoration(const glslang::TStorageQualifier storage, bool useStorageBuffer)\n{\n    switch (storage) {\n    case glslang::EvqUniform:      return spv::Decoration::Block;\n    case glslang::EvqBuffer:       return useStorageBuffer ? spv::Decoration::Block : spv::Decoration::BufferBlock;\n    case glslang::EvqVaryingIn:    return spv::Decoration::Block;\n    case glslang::EvqVaryingOut:   return spv::Decoration::Block;\n    case glslang::EvqShared:       return spv::Decoration::Block;\n    case glslang::EvqPayload:      return spv::Decoration::Block;\n    case glslang::EvqPayloadIn:    return spv::Decoration::Block;\n    case glslang::EvqHitAttr:      return spv::Decoration::Block;\n    case glslang::EvqCallableData:   return spv::Decoration::Block;\n    case glslang::EvqCallableDataIn: return spv::Decoration::Block;\n    case glslang::EvqHitObjectAttrNV: return spv::Decoration::Block;\n    default:\n        assert(0);\n        break;\n    }\n\n    return spv::Decoration::Max;\n}\n\n// Translate glslang type to SPIR-V memory decorations.\nvoid TranslateMemoryDecoration(const glslang::TQualifier& qualifier, std::vector<spv::Decoration>& memory,\n    bool useVulkanMemoryModel)\n{\n    if (!useVulkanMemoryModel) {\n        if (qualifier.isVolatile()) {\n            memory.push_back(spv::Decoration::Volatile);\n            memory.push_back(spv::Decoration::Coherent);\n        } else if (qualifier.isCoherent()) {\n            memory.push_back(spv::Decoration::Coherent);\n        }\n    }\n    if (qualifier.isRestrict())\n        memory.push_back(spv::Decoration::Restrict);\n    if (qualifier.isReadOnly())\n        memory.push_back(spv::Decoration::NonWritable);\n    if (qualifier.isWriteOnly())\n        memory.push_back(spv::Decoration::NonReadable);\n}\n\n// Translate glslang type to SPIR-V layout decorations.\nspv::Decoration TranslateLayoutDecoration(const glslang::TType& type, glslang::TLayoutMatrix matrixLayout)\n{\n    if (type.isMatrix()) {\n        switch (matrixLayout) {\n        case glslang::ElmRowMajor:\n            return spv::Decoration::RowMajor;\n        case glslang::ElmColumnMajor:\n            return spv::Decoration::ColMajor;\n        default:\n            // opaque layouts don't need a majorness\n            return spv::Decoration::Max;\n        }\n    } else {\n        switch (type.getBasicType()) {\n        default:\n            return spv::Decoration::Max;\n            break;\n        case glslang::EbtBlock:\n            switch (type.getQualifier().storage) {\n            case glslang::EvqShared:\n            case glslang::EvqUniform:\n            case glslang::EvqBuffer:\n                switch (type.getQualifier().layoutPacking) {\n                case glslang::ElpShared:  return spv::Decoration::GLSLShared;\n                case glslang::ElpPacked:  return spv::Decoration::GLSLPacked;\n                default:\n                    return spv::Decoration::Max;\n                }\n            case glslang::EvqVaryingIn:\n            case glslang::EvqVaryingOut:\n                if (type.getQualifier().isTaskMemory()) {\n                    switch (type.getQualifier().layoutPacking) {\n                    case glslang::ElpShared:  return spv::Decoration::GLSLShared;\n                    case glslang::ElpPacked:  return spv::Decoration::GLSLPacked;\n                    default: break;\n                    }\n                } else {\n                    assert(type.getQualifier().layoutPacking == glslang::ElpNone);\n                }\n                return spv::Decoration::Max;\n            case glslang::EvqPayload:\n            case glslang::EvqPayloadIn:\n            case glslang::EvqHitAttr:\n            case glslang::EvqCallableData:\n            case glslang::EvqCallableDataIn:\n            case glslang::EvqHitObjectAttrNV:\n                return spv::Decoration::Max;\n            default:\n                assert(0);\n                return spv::Decoration::Max;\n            }\n        }\n    }\n}\n\n// Translate glslang type to SPIR-V interpolation decorations.\n// Returns spv::Decoration::Max when no decoration\n// should be applied.\nspv::Decoration TGlslangToSpvTraverser::TranslateInterpolationDecoration(const glslang::TQualifier& qualifier)\n{\n    if (qualifier.smooth)\n        // Smooth decoration doesn't exist in SPIR-V 1.0\n        return spv::Decoration::Max;\n    else if (qualifier.isNonPerspective())\n        return spv::Decoration::NoPerspective;\n    else if (qualifier.flat)\n        return spv::Decoration::Flat;\n    else if (qualifier.isExplicitInterpolation()) {\n        builder.addExtension(spv::E_SPV_AMD_shader_explicit_vertex_parameter);\n        return spv::Decoration::ExplicitInterpAMD;\n    }\n    else\n        return spv::Decoration::Max;\n}\n\n// Translate glslang type to SPIR-V auxiliary storage decorations.\n// Returns spv::Decoration::Max when no decoration\n// should be applied.\nspv::Decoration TGlslangToSpvTraverser::TranslateAuxiliaryStorageDecoration(const glslang::TQualifier& qualifier)\n{\n    if (qualifier.centroid)\n        return spv::Decoration::Centroid;\n    else if (qualifier.patch)\n        return spv::Decoration::Patch;\n    else if (qualifier.sample) {\n        builder.addCapability(spv::Capability::SampleRateShading);\n        return spv::Decoration::Sample;\n    }\n\n    return spv::Decoration::Max;\n}\n\n// If glslang type is invariant, return SPIR-V invariant decoration.\nspv::Decoration TranslateInvariantDecoration(const glslang::TQualifier& qualifier)\n{\n    if (qualifier.invariant)\n        return spv::Decoration::Invariant;\n    else\n        return spv::Decoration::Max;\n}\n\n// If glslang type is noContraction, return SPIR-V NoContraction decoration.\nspv::Decoration TranslateNoContractionDecoration(const glslang::TQualifier& qualifier)\n{\n    if (qualifier.isNoContraction())\n        return spv::Decoration::NoContraction;\n    else\n        return spv::Decoration::Max;\n}\n\n// If glslang type is nonUniform, return SPIR-V NonUniform decoration.\nspv::Decoration TGlslangToSpvTraverser::TranslateNonUniformDecoration(const glslang::TQualifier& qualifier)\n{\n    if (qualifier.isNonUniform()) {\n        builder.addIncorporatedExtension(\"SPV_EXT_descriptor_indexing\", spv::Spv_1_5);\n        builder.addCapability(spv::Capability::ShaderNonUniformEXT);\n        return spv::Decoration::NonUniformEXT;\n    } else\n        return spv::Decoration::Max;\n}\n\n// If lvalue flags contains nonUniform, return SPIR-V NonUniform decoration.\nspv::Decoration TGlslangToSpvTraverser::TranslateNonUniformDecoration(\n    const spv::Builder::AccessChain::CoherentFlags& coherentFlags)\n{\n    if (coherentFlags.isNonUniform()) {\n        builder.addIncorporatedExtension(\"SPV_EXT_descriptor_indexing\", spv::Spv_1_5);\n        builder.addCapability(spv::Capability::ShaderNonUniformEXT);\n        return spv::Decoration::NonUniformEXT;\n    } else\n        return spv::Decoration::Max;\n}\n\nspv::MemoryAccessMask TGlslangToSpvTraverser::TranslateMemoryAccess(\n    const spv::Builder::AccessChain::CoherentFlags &coherentFlags)\n{\n    spv::MemoryAccessMask mask = spv::MemoryAccessMask::MaskNone;\n\n    if (!glslangIntermediate->usingVulkanMemoryModel() || coherentFlags.isImage)\n        return mask;\n\n    if (coherentFlags.isVolatile() || coherentFlags.anyCoherent()) {\n        mask = mask | spv::MemoryAccessMask::MakePointerAvailableKHR | \n                      spv::MemoryAccessMask::MakePointerVisibleKHR;\n    }\n\n    if (coherentFlags.nonprivate) {\n        mask = mask | spv::MemoryAccessMask::NonPrivatePointerKHR;\n    }\n    if (coherentFlags.volatil) {\n        mask = mask | spv::MemoryAccessMask::Volatile;\n    }\n    if (coherentFlags.nontemporal) {\n        mask = mask | spv::MemoryAccessMask::Nontemporal;\n    }\n    if (mask != spv::MemoryAccessMask::MaskNone) {\n        builder.addCapability(spv::Capability::VulkanMemoryModelKHR);\n    }\n\n    return mask;\n}\n\nspv::ImageOperandsMask TGlslangToSpvTraverser::TranslateImageOperands(\n    const spv::Builder::AccessChain::CoherentFlags &coherentFlags)\n{\n    spv::ImageOperandsMask mask = spv::ImageOperandsMask::MaskNone;\n\n    if (!glslangIntermediate->usingVulkanMemoryModel())\n        return mask;\n\n    if (coherentFlags.volatil ||\n        coherentFlags.anyCoherent()) {\n        mask = mask | spv::ImageOperandsMask::MakeTexelAvailableKHR |\n                      spv::ImageOperandsMask::MakeTexelVisibleKHR;\n    }\n    if (coherentFlags.nonprivate) {\n        mask = mask | spv::ImageOperandsMask::NonPrivateTexelKHR;\n    }\n    if (coherentFlags.volatil) {\n        mask = mask | spv::ImageOperandsMask::VolatileTexelKHR;\n    }\n    if (coherentFlags.nontemporal && builder.getSpvVersion() >= spv::Spv_1_6) {\n        mask = mask | spv::ImageOperandsMask::Nontemporal;\n    }\n    if (mask != spv::ImageOperandsMask::MaskNone) {\n        builder.addCapability(spv::Capability::VulkanMemoryModelKHR);\n    }\n\n    return mask;\n}\n\nspv::Builder::AccessChain::CoherentFlags TGlslangToSpvTraverser::TranslateCoherent(const glslang::TType& type)\n{\n    spv::Builder::AccessChain::CoherentFlags flags = {};\n    flags.coherent = type.getQualifier().coherent;\n    flags.devicecoherent = type.getQualifier().devicecoherent;\n    flags.queuefamilycoherent = type.getQualifier().queuefamilycoherent;\n    // shared variables are implicitly workgroupcoherent in GLSL.\n    flags.workgroupcoherent = type.getQualifier().workgroupcoherent ||\n                              type.getQualifier().storage == glslang::EvqShared;\n    flags.subgroupcoherent = type.getQualifier().subgroupcoherent;\n    flags.shadercallcoherent = type.getQualifier().shadercallcoherent;\n    flags.volatil = type.getQualifier().volatil;\n    flags.nontemporal = type.getQualifier().nontemporal;\n    // *coherent variables are implicitly nonprivate in GLSL\n    flags.nonprivate = type.getQualifier().nonprivate ||\n                       flags.anyCoherent() ||\n                       flags.volatil;\n    flags.isImage = type.getBasicType() == glslang::EbtSampler;\n    flags.nonUniform = type.getQualifier().nonUniform;\n    return flags;\n}\n\nspv::Scope TGlslangToSpvTraverser::TranslateMemoryScope(\n    const spv::Builder::AccessChain::CoherentFlags &coherentFlags)\n{\n    spv::Scope scope = spv::Scope::Max;\n\n    if (coherentFlags.volatil || coherentFlags.coherent) {\n        // coherent defaults to Device scope in the old model, QueueFamilyKHR scope in the new model\n        scope = glslangIntermediate->usingVulkanMemoryModel() ? spv::Scope::QueueFamilyKHR : spv::Scope::Device;\n    } else if (coherentFlags.devicecoherent) {\n        scope = spv::Scope::Device;\n    } else if (coherentFlags.queuefamilycoherent) {\n        scope = spv::Scope::QueueFamilyKHR;\n    } else if (coherentFlags.workgroupcoherent) {\n        scope = spv::Scope::Workgroup;\n    } else if (coherentFlags.subgroupcoherent) {\n        scope = spv::Scope::Subgroup;\n    } else if (coherentFlags.shadercallcoherent) {\n        scope = spv::Scope::ShaderCallKHR;\n    }\n    if (glslangIntermediate->usingVulkanMemoryModel() && scope == spv::Scope::Device) {\n        builder.addCapability(spv::Capability::VulkanMemoryModelDeviceScopeKHR);\n    }\n\n    return scope;\n}\n\n// Translate a glslang built-in variable to a SPIR-V built in decoration.  Also generate\n// associated capabilities when required.  For some built-in variables, a capability\n// is generated only when using the variable in an executable instruction, but not when\n// just declaring a struct member variable with it.  This is true for PointSize,\n// ClipDistance, and CullDistance.\nspv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltInVariable builtIn,\n    bool memberDeclaration)\n{\n    switch (builtIn) {\n    case glslang::EbvPointSize:\n        // Defer adding the capability until the built-in is actually used.\n        if (! memberDeclaration) {\n            switch (glslangIntermediate->getStage()) {\n            case EShLangGeometry:\n                builder.addCapability(spv::Capability::GeometryPointSize);\n                break;\n            case EShLangTessControl:\n            case EShLangTessEvaluation:\n                builder.addCapability(spv::Capability::TessellationPointSize);\n                break;\n            default:\n                break;\n            }\n        }\n        return spv::BuiltIn::PointSize;\n\n    case glslang::EbvPosition:             return spv::BuiltIn::Position;\n    case glslang::EbvVertexId:             return spv::BuiltIn::VertexId;\n    case glslang::EbvInstanceId:           return spv::BuiltIn::InstanceId;\n    case glslang::EbvVertexIndex:          return spv::BuiltIn::VertexIndex;\n    case glslang::EbvInstanceIndex:        return spv::BuiltIn::InstanceIndex;\n\n    case glslang::EbvFragCoord:            return spv::BuiltIn::FragCoord;\n    case glslang::EbvPointCoord:           return spv::BuiltIn::PointCoord;\n    case glslang::EbvFace:                 return spv::BuiltIn::FrontFacing;\n    case glslang::EbvFragDepth:            return spv::BuiltIn::FragDepth;\n\n    case glslang::EbvNumWorkGroups:        return spv::BuiltIn::NumWorkgroups;\n    case glslang::EbvWorkGroupSize:        return spv::BuiltIn::WorkgroupSize;\n    case glslang::EbvWorkGroupId:          return spv::BuiltIn::WorkgroupId;\n    case glslang::EbvLocalInvocationId:    return spv::BuiltIn::LocalInvocationId;\n    case glslang::EbvLocalInvocationIndex: return spv::BuiltIn::LocalInvocationIndex;\n    case glslang::EbvGlobalInvocationId:   return spv::BuiltIn::GlobalInvocationId;\n\n    // These *Distance capabilities logically belong here, but if the member is declared and\n    // then never used, consumers of SPIR-V prefer the capability not be declared.\n    // They are now generated when used, rather than here when declared.\n    // Potentially, the specification should be more clear what the minimum\n    // use needed is to trigger the capability.\n    //\n    case glslang::EbvClipDistance:\n        if (!memberDeclaration)\n            builder.addCapability(spv::Capability::ClipDistance);\n        return spv::BuiltIn::ClipDistance;\n\n    case glslang::EbvCullDistance:\n        if (!memberDeclaration)\n            builder.addCapability(spv::Capability::CullDistance);\n        return spv::BuiltIn::CullDistance;\n\n    case glslang::EbvViewportIndex:\n        if (glslangIntermediate->getStage() == EShLangGeometry ||\n            glslangIntermediate->getStage() == EShLangFragment) {\n            builder.addCapability(spv::Capability::MultiViewport);\n        }\n        if (glslangIntermediate->getStage() == EShLangVertex ||\n            glslangIntermediate->getStage() == EShLangTessControl ||\n            glslangIntermediate->getStage() == EShLangTessEvaluation) {\n\n            if (builder.getSpvVersion() < spv::Spv_1_5) {\n                builder.addIncorporatedExtension(spv::E_SPV_EXT_shader_viewport_index_layer, spv::Spv_1_5);\n                builder.addCapability(spv::Capability::ShaderViewportIndexLayerEXT);\n            }\n            else\n                builder.addCapability(spv::Capability::ShaderViewportIndex);\n        }\n        return spv::BuiltIn::ViewportIndex;\n\n    case glslang::EbvSampleId:\n        builder.addCapability(spv::Capability::SampleRateShading);\n        return spv::BuiltIn::SampleId;\n\n    case glslang::EbvSamplePosition:\n        builder.addCapability(spv::Capability::SampleRateShading);\n        return spv::BuiltIn::SamplePosition;\n\n    case glslang::EbvSampleMask:\n        return spv::BuiltIn::SampleMask;\n\n    case glslang::EbvLayer:\n        if (glslangIntermediate->getStage() == EShLangMesh) {\n            return spv::BuiltIn::Layer;\n        }\n        if (glslangIntermediate->getStage() == EShLangGeometry ||\n            glslangIntermediate->getStage() == EShLangFragment) {\n            builder.addCapability(spv::Capability::Geometry);\n        }\n        if (glslangIntermediate->getStage() == EShLangVertex ||\n            glslangIntermediate->getStage() == EShLangTessControl ||\n            glslangIntermediate->getStage() == EShLangTessEvaluation) {\n\n            if (builder.getSpvVersion() < spv::Spv_1_5) {\n                builder.addIncorporatedExtension(spv::E_SPV_EXT_shader_viewport_index_layer, spv::Spv_1_5);\n                builder.addCapability(spv::Capability::ShaderViewportIndexLayerEXT);\n            } else\n                builder.addCapability(spv::Capability::ShaderLayer);\n        }\n        return spv::BuiltIn::Layer;\n\n    case glslang::EbvBaseVertex:\n        builder.addIncorporatedExtension(spv::E_SPV_KHR_shader_draw_parameters, spv::Spv_1_3);\n        builder.addCapability(spv::Capability::DrawParameters);\n        return spv::BuiltIn::BaseVertex;\n\n    case glslang::EbvBaseInstance:\n        builder.addIncorporatedExtension(spv::E_SPV_KHR_shader_draw_parameters, spv::Spv_1_3);\n        builder.addCapability(spv::Capability::DrawParameters);\n        return spv::BuiltIn::BaseInstance;\n\n    case glslang::EbvDrawId:\n        builder.addIncorporatedExtension(spv::E_SPV_KHR_shader_draw_parameters, spv::Spv_1_3);\n        builder.addCapability(spv::Capability::DrawParameters);\n        return spv::BuiltIn::DrawIndex;\n\n    case glslang::EbvPrimitiveId:\n        if (glslangIntermediate->getStage() == EShLangFragment)\n            builder.addCapability(spv::Capability::Geometry);\n        return spv::BuiltIn::PrimitiveId;\n\n    case glslang::EbvFragStencilRef:\n        builder.addExtension(spv::E_SPV_EXT_shader_stencil_export);\n        builder.addCapability(spv::Capability::StencilExportEXT);\n        return spv::BuiltIn::FragStencilRefEXT;\n\n    case glslang::EbvShadingRateKHR:\n        builder.addExtension(spv::E_SPV_KHR_fragment_shading_rate);\n        builder.addCapability(spv::Capability::FragmentShadingRateKHR);\n        return spv::BuiltIn::ShadingRateKHR;\n\n    case glslang::EbvPrimitiveShadingRateKHR:\n        builder.addExtension(spv::E_SPV_KHR_fragment_shading_rate);\n        builder.addCapability(spv::Capability::FragmentShadingRateKHR);\n        return spv::BuiltIn::PrimitiveShadingRateKHR;\n\n    case glslang::EbvInvocationId:         return spv::BuiltIn::InvocationId;\n    case glslang::EbvTessLevelInner:       return spv::BuiltIn::TessLevelInner;\n    case glslang::EbvTessLevelOuter:       return spv::BuiltIn::TessLevelOuter;\n    case glslang::EbvTessCoord:            return spv::BuiltIn::TessCoord;\n    case glslang::EbvPatchVertices:        return spv::BuiltIn::PatchVertices;\n    case glslang::EbvHelperInvocation:     return spv::BuiltIn::HelperInvocation;\n\n    case glslang::EbvSubGroupSize:\n        builder.addExtension(spv::E_SPV_KHR_shader_ballot);\n        builder.addCapability(spv::Capability::SubgroupBallotKHR);\n        return spv::BuiltIn::SubgroupSize;\n\n    case glslang::EbvSubGroupInvocation:\n        builder.addExtension(spv::E_SPV_KHR_shader_ballot);\n        builder.addCapability(spv::Capability::SubgroupBallotKHR);\n        return spv::BuiltIn::SubgroupLocalInvocationId;\n\n    case glslang::EbvSubGroupEqMask:\n        builder.addExtension(spv::E_SPV_KHR_shader_ballot);\n        builder.addCapability(spv::Capability::SubgroupBallotKHR);\n        return spv::BuiltIn::SubgroupEqMask;\n\n    case glslang::EbvSubGroupGeMask:\n        builder.addExtension(spv::E_SPV_KHR_shader_ballot);\n        builder.addCapability(spv::Capability::SubgroupBallotKHR);\n        return spv::BuiltIn::SubgroupGeMask;\n\n    case glslang::EbvSubGroupGtMask:\n        builder.addExtension(spv::E_SPV_KHR_shader_ballot);\n        builder.addCapability(spv::Capability::SubgroupBallotKHR);\n        return spv::BuiltIn::SubgroupGtMask;\n\n    case glslang::EbvSubGroupLeMask:\n        builder.addExtension(spv::E_SPV_KHR_shader_ballot);\n        builder.addCapability(spv::Capability::SubgroupBallotKHR);\n        return spv::BuiltIn::SubgroupLeMask;\n\n    case glslang::EbvSubGroupLtMask:\n        builder.addExtension(spv::E_SPV_KHR_shader_ballot);\n        builder.addCapability(spv::Capability::SubgroupBallotKHR);\n        return spv::BuiltIn::SubgroupLtMask;\n\n    case glslang::EbvNumSubgroups:\n        builder.addCapability(spv::Capability::GroupNonUniform);\n        return spv::BuiltIn::NumSubgroups;\n\n    case glslang::EbvSubgroupID:\n        builder.addCapability(spv::Capability::GroupNonUniform);\n        return spv::BuiltIn::SubgroupId;\n\n    case glslang::EbvSubgroupSize2:\n        builder.addCapability(spv::Capability::GroupNonUniform);\n        return spv::BuiltIn::SubgroupSize;\n\n    case glslang::EbvSubgroupInvocation2:\n        builder.addCapability(spv::Capability::GroupNonUniform);\n        return spv::BuiltIn::SubgroupLocalInvocationId;\n\n    case glslang::EbvSubgroupEqMask2:\n        builder.addCapability(spv::Capability::GroupNonUniform);\n        builder.addCapability(spv::Capability::GroupNonUniformBallot);\n        return spv::BuiltIn::SubgroupEqMask;\n\n    case glslang::EbvSubgroupGeMask2:\n        builder.addCapability(spv::Capability::GroupNonUniform);\n        builder.addCapability(spv::Capability::GroupNonUniformBallot);\n        return spv::BuiltIn::SubgroupGeMask;\n\n    case glslang::EbvSubgroupGtMask2:\n        builder.addCapability(spv::Capability::GroupNonUniform);\n        builder.addCapability(spv::Capability::GroupNonUniformBallot);\n        return spv::BuiltIn::SubgroupGtMask;\n\n    case glslang::EbvSubgroupLeMask2:\n        builder.addCapability(spv::Capability::GroupNonUniform);\n        builder.addCapability(spv::Capability::GroupNonUniformBallot);\n        return spv::BuiltIn::SubgroupLeMask;\n\n    case glslang::EbvSubgroupLtMask2:\n        builder.addCapability(spv::Capability::GroupNonUniform);\n        builder.addCapability(spv::Capability::GroupNonUniformBallot);\n        return spv::BuiltIn::SubgroupLtMask;\n\n    case glslang::EbvBaryCoordNoPersp:\n        builder.addExtension(spv::E_SPV_AMD_shader_explicit_vertex_parameter);\n        return spv::BuiltIn::BaryCoordNoPerspAMD;\n\n    case glslang::EbvBaryCoordNoPerspCentroid:\n        builder.addExtension(spv::E_SPV_AMD_shader_explicit_vertex_parameter);\n        return spv::BuiltIn::BaryCoordNoPerspCentroidAMD;\n\n    case glslang::EbvBaryCoordNoPerspSample:\n        builder.addExtension(spv::E_SPV_AMD_shader_explicit_vertex_parameter);\n        return spv::BuiltIn::BaryCoordNoPerspSampleAMD;\n\n    case glslang::EbvBaryCoordSmooth:\n        builder.addExtension(spv::E_SPV_AMD_shader_explicit_vertex_parameter);\n        return spv::BuiltIn::BaryCoordSmoothAMD;\n\n    case glslang::EbvBaryCoordSmoothCentroid:\n        builder.addExtension(spv::E_SPV_AMD_shader_explicit_vertex_parameter);\n        return spv::BuiltIn::BaryCoordSmoothCentroidAMD;\n\n    case glslang::EbvBaryCoordSmoothSample:\n        builder.addExtension(spv::E_SPV_AMD_shader_explicit_vertex_parameter);\n        return spv::BuiltIn::BaryCoordSmoothSampleAMD;\n\n    case glslang::EbvBaryCoordPullModel:\n        builder.addExtension(spv::E_SPV_AMD_shader_explicit_vertex_parameter);\n        return spv::BuiltIn::BaryCoordPullModelAMD;\n\n    case glslang::EbvDeviceIndex:\n        builder.addIncorporatedExtension(spv::E_SPV_KHR_device_group, spv::Spv_1_3);\n        builder.addCapability(spv::Capability::DeviceGroup);\n        return spv::BuiltIn::DeviceIndex;\n\n    case glslang::EbvViewIndex:\n        builder.addIncorporatedExtension(spv::E_SPV_KHR_multiview, spv::Spv_1_3);\n        builder.addCapability(spv::Capability::MultiView);\n        return spv::BuiltIn::ViewIndex;\n\n    case glslang::EbvFragSizeEXT:\n        builder.addExtension(spv::E_SPV_EXT_fragment_invocation_density);\n        builder.addCapability(spv::Capability::FragmentDensityEXT);\n        return spv::BuiltIn::FragSizeEXT;\n\n    case glslang::EbvFragInvocationCountEXT:\n        builder.addExtension(spv::E_SPV_EXT_fragment_invocation_density);\n        builder.addCapability(spv::Capability::FragmentDensityEXT);\n        return spv::BuiltIn::FragInvocationCountEXT;\n\n    case glslang::EbvViewportMaskNV:\n        if (!memberDeclaration) {\n            builder.addExtension(spv::E_SPV_NV_viewport_array2);\n            builder.addCapability(spv::Capability::ShaderViewportMaskNV);\n        }\n        return spv::BuiltIn::ViewportMaskNV;\n    case glslang::EbvSecondaryPositionNV:\n        if (!memberDeclaration) {\n            builder.addExtension(spv::E_SPV_NV_stereo_view_rendering);\n            builder.addCapability(spv::Capability::ShaderStereoViewNV);\n        }\n        return spv::BuiltIn::SecondaryPositionNV;\n    case glslang::EbvSecondaryViewportMaskNV:\n        if (!memberDeclaration) {\n            builder.addExtension(spv::E_SPV_NV_stereo_view_rendering);\n            builder.addCapability(spv::Capability::ShaderStereoViewNV);\n        }\n        return spv::BuiltIn::SecondaryViewportMaskNV;\n    case glslang::EbvPositionPerViewNV:\n        if (!memberDeclaration) {\n            builder.addExtension(spv::E_SPV_NVX_multiview_per_view_attributes);\n            builder.addCapability(spv::Capability::PerViewAttributesNV);\n        }\n        return spv::BuiltIn::PositionPerViewNV;\n    case glslang::EbvViewportMaskPerViewNV:\n        if (!memberDeclaration) {\n            builder.addExtension(spv::E_SPV_NVX_multiview_per_view_attributes);\n            builder.addCapability(spv::Capability::PerViewAttributesNV);\n        }\n        return spv::BuiltIn::ViewportMaskPerViewNV;\n    case glslang::EbvFragFullyCoveredNV:\n        builder.addExtension(spv::E_SPV_EXT_fragment_fully_covered);\n        builder.addCapability(spv::Capability::FragmentFullyCoveredEXT);\n        return spv::BuiltIn::FullyCoveredEXT;\n    case glslang::EbvFragmentSizeNV:\n        builder.addExtension(spv::E_SPV_NV_shading_rate);\n        builder.addCapability(spv::Capability::ShadingRateNV);\n        return spv::BuiltIn::FragmentSizeNV;\n    case glslang::EbvInvocationsPerPixelNV:\n        builder.addExtension(spv::E_SPV_NV_shading_rate);\n        builder.addCapability(spv::Capability::ShadingRateNV);\n        return spv::BuiltIn::InvocationsPerPixelNV;\n\n    // ray tracing\n    case glslang::EbvLaunchId:\n        return spv::BuiltIn::LaunchIdKHR;\n    case glslang::EbvLaunchSize:\n        return spv::BuiltIn::LaunchSizeKHR;\n    case glslang::EbvWorldRayOrigin:\n        return spv::BuiltIn::WorldRayOriginKHR;\n    case glslang::EbvWorldRayDirection:\n        return spv::BuiltIn::WorldRayDirectionKHR;\n    case glslang::EbvObjectRayOrigin:\n        return spv::BuiltIn::ObjectRayOriginKHR;\n    case glslang::EbvObjectRayDirection:\n        return spv::BuiltIn::ObjectRayDirectionKHR;\n    case glslang::EbvRayTmin:\n        return spv::BuiltIn::RayTminKHR;\n    case glslang::EbvRayTmax:\n        return spv::BuiltIn::RayTmaxKHR;\n    case glslang::EbvCullMask:\n        return spv::BuiltIn::CullMaskKHR;\n    case glslang::EbvPositionFetch:\n        return spv::BuiltIn::HitTriangleVertexPositionsKHR;\n    case glslang::EbvInstanceCustomIndex:\n        return spv::BuiltIn::InstanceCustomIndexKHR;\n    case glslang::EbvHitKind:\n        return spv::BuiltIn::HitKindKHR;\n    case glslang::EbvObjectToWorld:\n    case glslang::EbvObjectToWorld3x4:\n        return spv::BuiltIn::ObjectToWorldKHR;\n    case glslang::EbvWorldToObject:\n    case glslang::EbvWorldToObject3x4:\n        return spv::BuiltIn::WorldToObjectKHR;\n    case glslang::EbvIncomingRayFlags:\n        return spv::BuiltIn::IncomingRayFlagsKHR;\n    case glslang::EbvGeometryIndex:\n        return spv::BuiltIn::RayGeometryIndexKHR;\n    case glslang::EbvCurrentRayTimeNV:\n        builder.addExtension(spv::E_SPV_NV_ray_tracing_motion_blur);\n        builder.addCapability(spv::Capability::RayTracingMotionBlurNV);\n        return spv::BuiltIn::CurrentRayTimeNV;\n    case glslang::EbvMicroTrianglePositionNV:\n        builder.addCapability(spv::Capability::RayTracingDisplacementMicromapNV);\n        builder.addExtension(\"SPV_NV_displacement_micromap\");\n        return spv::BuiltIn::HitMicroTriangleVertexPositionsNV;\n    case glslang::EbvMicroTriangleBaryNV:\n        builder.addCapability(spv::Capability::RayTracingDisplacementMicromapNV);\n        builder.addExtension(\"SPV_NV_displacement_micromap\");\n        return spv::BuiltIn::HitMicroTriangleVertexBarycentricsNV;\n    case glslang::EbvHitKindFrontFacingMicroTriangleNV:\n        builder.addCapability(spv::Capability::RayTracingDisplacementMicromapNV);\n        builder.addExtension(\"SPV_NV_displacement_micromap\");\n        return spv::BuiltIn::HitKindFrontFacingMicroTriangleNV;\n    case glslang::EbvHitKindBackFacingMicroTriangleNV:\n        builder.addCapability(spv::Capability::RayTracingDisplacementMicromapNV);\n        builder.addExtension(\"SPV_NV_displacement_micromap\");\n        return spv::BuiltIn::HitKindBackFacingMicroTriangleNV;\n    case glslang::EbvClusterIDNV:\n        builder.addCapability(spv::Capability::RayTracingClusterAccelerationStructureNV);\n        builder.addExtension(\"SPV_NV_cluster_acceleration_structure\");\n        return spv::BuiltIn::ClusterIDNV;\n    case glslang::EbvHitIsSphereNV:\n        builder.addCapability(spv::Capability::RayTracingSpheresGeometryNV);\n        builder.addExtension(\"SPV_NV_linear_swept_spheres\");\n        return spv::BuiltIn::HitIsSphereNV;\n    case glslang::EbvHitIsLSSNV:\n        builder.addCapability(spv::Capability::RayTracingLinearSweptSpheresGeometryNV);\n        builder.addExtension(\"SPV_NV_linear_swept_spheres\");\n        return spv::BuiltIn::HitIsLSSNV;\n    case glslang::EbvHitSpherePositionNV:\n        builder.addCapability(spv::Capability::RayTracingSpheresGeometryNV);\n        builder.addExtension(\"SPV_NV_linear_swept_spheres\");\n        return spv::BuiltIn::HitSpherePositionNV;\n    case glslang::EbvHitSphereRadiusNV:\n        builder.addCapability(spv::Capability::RayTracingSpheresGeometryNV);\n        builder.addExtension(\"SPV_NV_linear_swept_spheres\");\n        return spv::BuiltIn::HitSphereRadiusNV;\n    case glslang::EbvHitLSSPositionsNV:\n        builder.addCapability(spv::Capability::RayTracingLinearSweptSpheresGeometryNV);\n        builder.addExtension(\"SPV_NV_linear_swept_spheres\");\n        return spv::BuiltIn::HitLSSPositionsNV;\n    case glslang::EbvHitLSSRadiiNV:\n        builder.addCapability(spv::Capability::RayTracingLinearSweptSpheresGeometryNV);\n        builder.addExtension(\"SPV_NV_linear_swept_spheres\");\n        return spv::BuiltIn::HitLSSRadiiNV;\n\n    // barycentrics\n    case glslang::EbvBaryCoordNV:\n        builder.addExtension(spv::E_SPV_NV_fragment_shader_barycentric);\n        builder.addCapability(spv::Capability::FragmentBarycentricNV);\n        return spv::BuiltIn::BaryCoordNV;\n    case glslang::EbvBaryCoordNoPerspNV:\n        builder.addExtension(spv::E_SPV_NV_fragment_shader_barycentric);\n        builder.addCapability(spv::Capability::FragmentBarycentricNV);\n        return spv::BuiltIn::BaryCoordNoPerspNV;\n\n    case glslang::EbvBaryCoordEXT:\n        builder.addExtension(spv::E_SPV_KHR_fragment_shader_barycentric);\n        builder.addCapability(spv::Capability::FragmentBarycentricKHR);\n        return spv::BuiltIn::BaryCoordKHR;\n    case glslang::EbvBaryCoordNoPerspEXT:\n        builder.addExtension(spv::E_SPV_KHR_fragment_shader_barycentric);\n        builder.addCapability(spv::Capability::FragmentBarycentricKHR);\n        return spv::BuiltIn::BaryCoordNoPerspKHR;\n\n    // mesh shaders\n    case glslang::EbvTaskCountNV:\n        return spv::BuiltIn::TaskCountNV;\n    case glslang::EbvPrimitiveCountNV:\n        return spv::BuiltIn::PrimitiveCountNV;\n    case glslang::EbvPrimitiveIndicesNV:\n        return spv::BuiltIn::PrimitiveIndicesNV;\n    case glslang::EbvClipDistancePerViewNV:\n        return spv::BuiltIn::ClipDistancePerViewNV;\n    case glslang::EbvCullDistancePerViewNV:\n        return spv::BuiltIn::CullDistancePerViewNV;\n    case glslang::EbvLayerPerViewNV:\n        return spv::BuiltIn::LayerPerViewNV;\n    case glslang::EbvMeshViewCountNV:\n        return spv::BuiltIn::MeshViewCountNV;\n    case glslang::EbvMeshViewIndicesNV:\n        return spv::BuiltIn::MeshViewIndicesNV;\n\n    // SPV_EXT_mesh_shader\n    case glslang::EbvPrimitivePointIndicesEXT:\n        return spv::BuiltIn::PrimitivePointIndicesEXT;\n    case glslang::EbvPrimitiveLineIndicesEXT:\n        return spv::BuiltIn::PrimitiveLineIndicesEXT;\n    case glslang::EbvPrimitiveTriangleIndicesEXT:\n        return spv::BuiltIn::PrimitiveTriangleIndicesEXT;\n    case glslang::EbvCullPrimitiveEXT:\n        return spv::BuiltIn::CullPrimitiveEXT;\n\n    // sm builtins\n    case glslang::EbvWarpsPerSM:\n        builder.addExtension(spv::E_SPV_NV_shader_sm_builtins);\n        builder.addCapability(spv::Capability::ShaderSMBuiltinsNV);\n        return spv::BuiltIn::WarpsPerSMNV;\n    case glslang::EbvSMCount:\n        builder.addExtension(spv::E_SPV_NV_shader_sm_builtins);\n        builder.addCapability(spv::Capability::ShaderSMBuiltinsNV);\n        return spv::BuiltIn::SMCountNV;\n    case glslang::EbvWarpID:\n        builder.addExtension(spv::E_SPV_NV_shader_sm_builtins);\n        builder.addCapability(spv::Capability::ShaderSMBuiltinsNV);\n        return spv::BuiltIn::WarpIDNV;\n    case glslang::EbvSMID:\n        builder.addExtension(spv::E_SPV_NV_shader_sm_builtins);\n        builder.addCapability(spv::Capability::ShaderSMBuiltinsNV);\n        return spv::BuiltIn::SMIDNV;\n\n   // ARM builtins\n    case glslang::EbvCoreCountARM:\n        builder.addExtension(spv::E_SPV_ARM_core_builtins);\n        builder.addCapability(spv::Capability::CoreBuiltinsARM);\n        return spv::BuiltIn::CoreCountARM;\n    case glslang::EbvCoreIDARM:\n        builder.addExtension(spv::E_SPV_ARM_core_builtins);\n        builder.addCapability(spv::Capability::CoreBuiltinsARM);\n        return spv::BuiltIn::CoreIDARM;\n    case glslang::EbvCoreMaxIDARM:\n        builder.addExtension(spv::E_SPV_ARM_core_builtins);\n        builder.addCapability(spv::Capability::CoreBuiltinsARM);\n        return spv::BuiltIn::CoreMaxIDARM;\n    case glslang::EbvWarpIDARM:\n        builder.addExtension(spv::E_SPV_ARM_core_builtins);\n        builder.addCapability(spv::Capability::CoreBuiltinsARM);\n        return spv::BuiltIn::WarpIDARM;\n    case glslang::EbvWarpMaxIDARM:\n        builder.addExtension(spv::E_SPV_ARM_core_builtins);\n        builder.addCapability(spv::Capability::CoreBuiltinsARM);\n        return spv::BuiltIn::WarpMaxIDARM;\n\n    // QCOM builtins\n    case glslang::EbvTileOffsetQCOM:\n        builder.addExtension(spv::E_SPV_QCOM_tile_shading);\n        return spv::BuiltIn::TileOffsetQCOM;\n    case glslang::EbvTileDimensionQCOM:\n        builder.addExtension(spv::E_SPV_QCOM_tile_shading);\n        return spv::BuiltIn::TileDimensionQCOM;\n    case glslang::EbvTileApronSizeQCOM:\n        builder.addExtension(spv::E_SPV_QCOM_tile_shading);\n        return spv::BuiltIn::TileApronSizeQCOM;\n\n    default:\n        return spv::BuiltIn::Max;\n    }\n}\n\n// Translate glslang image layout format to SPIR-V image format.\nspv::ImageFormat TGlslangToSpvTraverser::TranslateImageFormat(const glslang::TType& type)\n{\n    assert(type.getBasicType() == glslang::EbtSampler);\n\n    // Check for capabilities\n    switch (type.getQualifier().getFormat()) {\n    case glslang::ElfRg32f:\n    case glslang::ElfRg16f:\n    case glslang::ElfR11fG11fB10f:\n    case glslang::ElfR16f:\n    case glslang::ElfRgba16:\n    case glslang::ElfRgb10A2:\n    case glslang::ElfRg16:\n    case glslang::ElfRg8:\n    case glslang::ElfR16:\n    case glslang::ElfR8:\n    case glslang::ElfRgba16Snorm:\n    case glslang::ElfRg16Snorm:\n    case glslang::ElfRg8Snorm:\n    case glslang::ElfR16Snorm:\n    case glslang::ElfR8Snorm:\n\n    case glslang::ElfRg32i:\n    case glslang::ElfRg16i:\n    case glslang::ElfRg8i:\n    case glslang::ElfR16i:\n    case glslang::ElfR8i:\n\n    case glslang::ElfRgb10a2ui:\n    case glslang::ElfRg32ui:\n    case glslang::ElfRg16ui:\n    case glslang::ElfRg8ui:\n    case glslang::ElfR16ui:\n    case glslang::ElfR8ui:\n        builder.addCapability(spv::Capability::StorageImageExtendedFormats);\n        break;\n\n    case glslang::ElfR64ui:\n    case glslang::ElfR64i:\n        builder.addExtension(spv::E_SPV_EXT_shader_image_int64);\n        builder.addCapability(spv::Capability::Int64ImageEXT);\n        break;\n    default:\n        break;\n    }\n\n    // do the translation\n    switch (type.getQualifier().getFormat()) {\n    case glslang::ElfNone:          return spv::ImageFormat::Unknown;\n    case glslang::ElfRgba32f:       return spv::ImageFormat::Rgba32f;\n    case glslang::ElfRgba16f:       return spv::ImageFormat::Rgba16f;\n    case glslang::ElfR32f:          return spv::ImageFormat::R32f;\n    case glslang::ElfRgba8:         return spv::ImageFormat::Rgba8;\n    case glslang::ElfRgba8Snorm:    return spv::ImageFormat::Rgba8Snorm;\n    case glslang::ElfRg32f:         return spv::ImageFormat::Rg32f;\n    case glslang::ElfRg16f:         return spv::ImageFormat::Rg16f;\n    case glslang::ElfR11fG11fB10f:  return spv::ImageFormat::R11fG11fB10f;\n    case glslang::ElfR16f:          return spv::ImageFormat::R16f;\n    case glslang::ElfRgba16:        return spv::ImageFormat::Rgba16;\n    case glslang::ElfRgb10A2:       return spv::ImageFormat::Rgb10A2;\n    case glslang::ElfRg16:          return spv::ImageFormat::Rg16;\n    case glslang::ElfRg8:           return spv::ImageFormat::Rg8;\n    case glslang::ElfR16:           return spv::ImageFormat::R16;\n    case glslang::ElfR8:            return spv::ImageFormat::R8;\n    case glslang::ElfRgba16Snorm:   return spv::ImageFormat::Rgba16Snorm;\n    case glslang::ElfRg16Snorm:     return spv::ImageFormat::Rg16Snorm;\n    case glslang::ElfRg8Snorm:      return spv::ImageFormat::Rg8Snorm;\n    case glslang::ElfR16Snorm:      return spv::ImageFormat::R16Snorm;\n    case glslang::ElfR8Snorm:       return spv::ImageFormat::R8Snorm;\n    case glslang::ElfRgba32i:       return spv::ImageFormat::Rgba32i;\n    case glslang::ElfRgba16i:       return spv::ImageFormat::Rgba16i;\n    case glslang::ElfRgba8i:        return spv::ImageFormat::Rgba8i;\n    case glslang::ElfR32i:          return spv::ImageFormat::R32i;\n    case glslang::ElfRg32i:         return spv::ImageFormat::Rg32i;\n    case glslang::ElfRg16i:         return spv::ImageFormat::Rg16i;\n    case glslang::ElfRg8i:          return spv::ImageFormat::Rg8i;\n    case glslang::ElfR16i:          return spv::ImageFormat::R16i;\n    case glslang::ElfR8i:           return spv::ImageFormat::R8i;\n    case glslang::ElfRgba32ui:      return spv::ImageFormat::Rgba32ui;\n    case glslang::ElfRgba16ui:      return spv::ImageFormat::Rgba16ui;\n    case glslang::ElfRgba8ui:       return spv::ImageFormat::Rgba8ui;\n    case glslang::ElfR32ui:         return spv::ImageFormat::R32ui;\n    case glslang::ElfRg32ui:        return spv::ImageFormat::Rg32ui;\n    case glslang::ElfRg16ui:        return spv::ImageFormat::Rg16ui;\n    case glslang::ElfRgb10a2ui:     return spv::ImageFormat::Rgb10a2ui;\n    case glslang::ElfRg8ui:         return spv::ImageFormat::Rg8ui;\n    case glslang::ElfR16ui:         return spv::ImageFormat::R16ui;\n    case glslang::ElfR8ui:          return spv::ImageFormat::R8ui;\n    case glslang::ElfR64ui:         return spv::ImageFormat::R64ui;\n    case glslang::ElfR64i:          return spv::ImageFormat::R64i;\n    default:                        return spv::ImageFormat::Max;\n    }\n}\n\nspv::SelectionControlMask TGlslangToSpvTraverser::TranslateSelectionControl(\n    const glslang::TIntermSelection& selectionNode) const\n{\n    if (selectionNode.getFlatten())\n        return spv::SelectionControlMask::Flatten;\n    if (selectionNode.getDontFlatten())\n        return spv::SelectionControlMask::DontFlatten;\n    return spv::SelectionControlMask::MaskNone;\n}\n\nspv::SelectionControlMask TGlslangToSpvTraverser::TranslateSwitchControl(const glslang::TIntermSwitch& switchNode)\n    const\n{\n    if (switchNode.getFlatten())\n        return spv::SelectionControlMask::Flatten;\n    if (switchNode.getDontFlatten())\n        return spv::SelectionControlMask::DontFlatten;\n    return spv::SelectionControlMask::MaskNone;\n}\n\n// return a non-0 dependency if the dependency argument must be set\nspv::LoopControlMask TGlslangToSpvTraverser::TranslateLoopControl(const glslang::TIntermLoop& loopNode,\n    std::vector<unsigned int>& operands) const\n{\n    spv::LoopControlMask control = spv::LoopControlMask::MaskNone;\n\n    if (loopNode.getDontUnroll())\n        control = control | spv::LoopControlMask::DontUnroll;\n    if (loopNode.getUnroll())\n        control = control | spv::LoopControlMask::Unroll;\n    if (unsigned(loopNode.getLoopDependency()) == glslang::TIntermLoop::dependencyInfinite)\n        control = control | spv::LoopControlMask::DependencyInfinite;\n    else if (loopNode.getLoopDependency() > 0) {\n        control = control | spv::LoopControlMask::DependencyLength;\n        operands.push_back((unsigned int)loopNode.getLoopDependency());\n    }\n    if (glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_4) {\n        if (loopNode.getMinIterations() > 0) {\n            control = control | spv::LoopControlMask::MinIterations;\n            operands.push_back(loopNode.getMinIterations());\n        }\n        if (loopNode.getMaxIterations() < glslang::TIntermLoop::iterationsInfinite) {\n            control = control | spv::LoopControlMask::MaxIterations;\n            operands.push_back(loopNode.getMaxIterations());\n        }\n        if (loopNode.getIterationMultiple() > 1) {\n            control = control | spv::LoopControlMask::IterationMultiple;\n            operands.push_back(loopNode.getIterationMultiple());\n        }\n        if (loopNode.getPeelCount() > 0) {\n            control = control | spv::LoopControlMask::PeelCount;\n            operands.push_back(loopNode.getPeelCount());\n        }\n        if (loopNode.getPartialCount() > 0) {\n            control = control | spv::LoopControlMask::PartialCount;\n            operands.push_back(loopNode.getPartialCount());\n        }\n    }\n\n    return control;\n}\n\n// Translate glslang type to SPIR-V storage class.\nspv::StorageClass TGlslangToSpvTraverser::TranslateStorageClass(const glslang::TType& type)\n{\n    if (type.getBasicType() == glslang::EbtRayQuery || type.getBasicType() == glslang::EbtHitObjectNV)\n        return spv::StorageClass::Private;\n    if (type.getQualifier().isSpirvByReference()) {\n        if (type.getQualifier().isParamInput() || type.getQualifier().isParamOutput())\n            return spv::StorageClass::Function;\n    }\n    if (type.getQualifier().isPipeInput())\n        return spv::StorageClass::Input;\n    if (type.getQualifier().isPipeOutput())\n        return spv::StorageClass::Output;\n    if (type.getQualifier().storage == glslang::EvqTileImageEXT || type.isAttachmentEXT()) {\n        builder.addExtension(spv::E_SPV_EXT_shader_tile_image);\n        builder.addCapability(spv::Capability::TileImageColorReadAccessEXT);\n        return spv::StorageClass::TileImageEXT;\n    }\n\n    if (type.getQualifier().isTileAttachmentQCOM()) {\n        builder.addExtension(spv::E_SPV_QCOM_tile_shading);\n        builder.addCapability(spv::Capability::TileShadingQCOM);\n        return spv::StorageClass::TileAttachmentQCOM;\n    }\n\n    if (glslangIntermediate->getSource() != glslang::EShSourceHlsl ||\n            type.getQualifier().storage == glslang::EvqUniform) {\n        if (type.isAtomic())\n            return spv::StorageClass::AtomicCounter;\n        if (type.containsOpaque() && !glslangIntermediate->getBindlessMode())\n            return spv::StorageClass::UniformConstant;\n    }\n\n    if (type.getQualifier().isUniformOrBuffer() &&\n        type.getQualifier().isShaderRecord()) {\n        return spv::StorageClass::ShaderRecordBufferKHR;\n    }\n\n    if (glslangIntermediate->usingStorageBuffer() && type.getQualifier().storage == glslang::EvqBuffer) {\n        builder.addIncorporatedExtension(spv::E_SPV_KHR_storage_buffer_storage_class, spv::Spv_1_3);\n        return spv::StorageClass::StorageBuffer;\n    }\n\n    if (type.getQualifier().isUniformOrBuffer()) {\n        if (type.getQualifier().isPushConstant())\n            return spv::StorageClass::PushConstant;\n        if (type.getBasicType() == glslang::EbtBlock)\n            return spv::StorageClass::Uniform;\n        return spv::StorageClass::UniformConstant;\n    }\n\n    if (type.getQualifier().storage == glslang::EvqShared && type.getBasicType() == glslang::EbtBlock) {\n        builder.addExtension(spv::E_SPV_KHR_workgroup_memory_explicit_layout);\n        builder.addCapability(spv::Capability::WorkgroupMemoryExplicitLayoutKHR);\n        return spv::StorageClass::Workgroup;\n    }\n\n    switch (type.getQualifier().storage) {\n    case glslang::EvqGlobal:        return spv::StorageClass::Private;\n    case glslang::EvqConstReadOnly: return spv::StorageClass::Function;\n    case glslang::EvqTemporary:     return spv::StorageClass::Function;\n    case glslang::EvqShared:           return spv::StorageClass::Workgroup;\n    case glslang::EvqPayload:        return spv::StorageClass::RayPayloadKHR;\n    case glslang::EvqPayloadIn:      return spv::StorageClass::IncomingRayPayloadKHR;\n    case glslang::EvqHitAttr:        return spv::StorageClass::HitAttributeKHR;\n    case glslang::EvqCallableData:   return spv::StorageClass::CallableDataKHR;\n    case glslang::EvqCallableDataIn: return spv::StorageClass::IncomingCallableDataKHR;\n    case glslang::EvqtaskPayloadSharedEXT : return spv::StorageClass::TaskPayloadWorkgroupEXT;\n    case glslang::EvqHitObjectAttrNV: return spv::StorageClass::HitObjectAttributeNV;\n    case glslang::EvqSpirvStorageClass: return static_cast<spv::StorageClass>(type.getQualifier().spirvStorageClass);\n    default:\n        assert(0);\n        break;\n    }\n\n    return spv::StorageClass::Function;\n}\n\n// Translate glslang constants to SPIR-V literals\nvoid TGlslangToSpvTraverser::TranslateLiterals(const glslang::TVector<const glslang::TIntermConstantUnion*>& constants,\n                                               std::vector<unsigned>& literals) const\n{\n    for (auto constant : constants) {\n        if (constant->getBasicType() == glslang::EbtFloat) {\n            float floatValue = static_cast<float>(constant->getConstArray()[0].getDConst());\n            unsigned literal;\n            static_assert(sizeof(literal) == sizeof(floatValue), \"sizeof(unsigned) != sizeof(float)\");\n            memcpy(&literal, &floatValue, sizeof(literal));\n            literals.push_back(literal);\n        } else if (constant->getBasicType() == glslang::EbtInt) {\n            unsigned literal = constant->getConstArray()[0].getIConst();\n            literals.push_back(literal);\n        } else if (constant->getBasicType() == glslang::EbtUint) {\n            unsigned literal = constant->getConstArray()[0].getUConst();\n            literals.push_back(literal);\n        } else if (constant->getBasicType() == glslang::EbtBool) {\n            unsigned literal = constant->getConstArray()[0].getBConst();\n            literals.push_back(literal);\n        } else if (constant->getBasicType() == glslang::EbtString) {\n            auto str = constant->getConstArray()[0].getSConst()->c_str();\n            unsigned literal = 0;\n            char* literalPtr = reinterpret_cast<char*>(&literal);\n            unsigned charCount = 0;\n            char ch = 0;\n            do {\n                ch = *(str++);\n                *(literalPtr++) = ch;\n                ++charCount;\n                if (charCount == 4) {\n                    literals.push_back(literal);\n                    literalPtr = reinterpret_cast<char*>(&literal);\n                    charCount = 0;\n                }\n            } while (ch != 0);\n\n            // Partial literal is padded with 0\n            if (charCount > 0) {\n                for (; charCount < 4; ++charCount)\n                    *(literalPtr++) = 0;\n                literals.push_back(literal);\n            }\n        } else\n            assert(0); // Unexpected type\n    }\n}\n\n// Add capabilities pertaining to how an array is indexed.\nvoid TGlslangToSpvTraverser::addIndirectionIndexCapabilities(const glslang::TType& baseType,\n                                                             const glslang::TType& indexType)\n{\n    if (indexType.getQualifier().isNonUniform()) {\n        // deal with an asserted non-uniform index\n        // SPV_EXT_descriptor_indexing already added in TranslateNonUniformDecoration\n        if (baseType.getBasicType() == glslang::EbtSampler) {\n            if (baseType.getQualifier().hasAttachment())\n                builder.addCapability(spv::Capability::InputAttachmentArrayNonUniformIndexingEXT);\n            else if (baseType.isImage() && baseType.getSampler().isBuffer())\n                builder.addCapability(spv::Capability::StorageTexelBufferArrayNonUniformIndexingEXT);\n            else if (baseType.isTexture() && baseType.getSampler().isBuffer())\n                builder.addCapability(spv::Capability::UniformTexelBufferArrayNonUniformIndexingEXT);\n            else if (baseType.isImage())\n                builder.addCapability(spv::Capability::StorageImageArrayNonUniformIndexingEXT);\n            else if (baseType.isTexture())\n                builder.addCapability(spv::Capability::SampledImageArrayNonUniformIndexingEXT);\n        } else if (baseType.getBasicType() == glslang::EbtBlock) {\n            if (baseType.getQualifier().storage == glslang::EvqBuffer)\n                builder.addCapability(spv::Capability::StorageBufferArrayNonUniformIndexingEXT);\n            else if (baseType.getQualifier().storage == glslang::EvqUniform)\n                builder.addCapability(spv::Capability::UniformBufferArrayNonUniformIndexingEXT);\n        }\n    } else {\n        // assume a dynamically uniform index\n        if (baseType.getBasicType() == glslang::EbtSampler) {\n            if (baseType.getQualifier().hasAttachment()) {\n                builder.addIncorporatedExtension(\"SPV_EXT_descriptor_indexing\", spv::Spv_1_5);\n                builder.addCapability(spv::Capability::InputAttachmentArrayDynamicIndexingEXT);\n            } else if (baseType.isImage() && baseType.getSampler().isBuffer()) {\n                builder.addIncorporatedExtension(\"SPV_EXT_descriptor_indexing\", spv::Spv_1_5);\n                builder.addCapability(spv::Capability::StorageTexelBufferArrayDynamicIndexingEXT);\n            } else if (baseType.isTexture() && baseType.getSampler().isBuffer()) {\n                builder.addIncorporatedExtension(\"SPV_EXT_descriptor_indexing\", spv::Spv_1_5);\n                builder.addCapability(spv::Capability::UniformTexelBufferArrayDynamicIndexingEXT);\n            }\n        }\n    }\n}\n\n// Return whether or not the given type is something that should be tied to a\n// descriptor set.\nbool IsDescriptorResource(const glslang::TType& type)\n{\n    // uniform and buffer blocks are included, unless it is a push_constant\n    if (type.getBasicType() == glslang::EbtBlock)\n        return type.getQualifier().isUniformOrBuffer() &&\n        ! type.getQualifier().isShaderRecord() &&\n        ! type.getQualifier().isPushConstant();\n\n    // non block...\n    // basically samplerXXX/subpass/sampler/texture are all included\n    // if they are the global-scope-class, not the function parameter\n    // (or local, if they ever exist) class.\n    if (type.getBasicType() == glslang::EbtSampler ||\n        type.getBasicType() == glslang::EbtAccStruct)\n        return type.getQualifier().isUniformOrBuffer();\n\n    // None of the above.\n    return false;\n}\n\nvoid InheritQualifiers(glslang::TQualifier& child, const glslang::TQualifier& parent)\n{\n    if (child.layoutMatrix == glslang::ElmNone)\n        child.layoutMatrix = parent.layoutMatrix;\n\n    if (parent.invariant)\n        child.invariant = true;\n    if (parent.flat)\n        child.flat = true;\n    if (parent.centroid)\n        child.centroid = true;\n    if (parent.nopersp)\n        child.nopersp = true;\n    if (parent.explicitInterp)\n        child.explicitInterp = true;\n    if (parent.perPrimitiveNV)\n        child.perPrimitiveNV = true;\n    if (parent.perViewNV)\n        child.perViewNV = true;\n    if (parent.perTaskNV)\n        child.perTaskNV = true;\n    if (parent.storage == glslang::EvqtaskPayloadSharedEXT)\n        child.storage = glslang::EvqtaskPayloadSharedEXT;\n    if (parent.patch)\n        child.patch = true;\n    if (parent.sample)\n        child.sample = true;\n    if (parent.coherent)\n        child.coherent = true;\n    if (parent.devicecoherent)\n        child.devicecoherent = true;\n    if (parent.queuefamilycoherent)\n        child.queuefamilycoherent = true;\n    if (parent.workgroupcoherent)\n        child.workgroupcoherent = true;\n    if (parent.subgroupcoherent)\n        child.subgroupcoherent = true;\n    if (parent.shadercallcoherent)\n        child.shadercallcoherent = true;\n    if (parent.nonprivate)\n        child.nonprivate = true;\n    if (parent.volatil)\n        child.volatil = true;\n    if (parent.nontemporal)\n        child.nontemporal = true;\n    if (parent.restrict)\n        child.restrict = true;\n    if (parent.readonly)\n        child.readonly = true;\n    if (parent.writeonly)\n        child.writeonly = true;\n    if (parent.nonUniform)\n        child.nonUniform = true;\n}\n\nbool HasNonLayoutQualifiers(const glslang::TType& type, const glslang::TQualifier& qualifier)\n{\n    // This should list qualifiers that simultaneous satisfy:\n    // - struct members might inherit from a struct declaration\n    //     (note that non-block structs don't explicitly inherit,\n    //      only implicitly, meaning no decoration involved)\n    // - affect decorations on the struct members\n    //     (note smooth does not, and expecting something like volatile\n    //      to effect the whole object)\n    // - are not part of the offset/st430/etc or row/column-major layout\n    return qualifier.invariant || (qualifier.hasLocation() && type.getBasicType() == glslang::EbtBlock);\n}\n\n//\n// Implement the TGlslangToSpvTraverser class.\n//\n\nTGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion,\n    const glslang::TIntermediate* glslangIntermediate,\n    spv::SpvBuildLogger* buildLogger, glslang::SpvOptions& options) :\n        TIntermTraverser(true, false, true),\n        options(options),\n        shaderEntry(nullptr), currentFunction(nullptr),\n        sequenceDepth(0), logger(buildLogger),\n        builder(spvVersion, (glslang::GetKhronosToolId() << 16) | glslang::GetSpirvGeneratorVersion(), logger),\n        inEntryPoint(false), entryPointTerminated(false), linkageOnly(false),\n        glslangIntermediate(glslangIntermediate),\n        nanMinMaxClamp(glslangIntermediate->getNanMinMaxClamp()),\n        nonSemanticDebugPrintf(0),\n        taskPayloadID(0)\n{\n    bool isMeshShaderExt = (glslangIntermediate->getRequestedExtensions().find(glslang::E_GL_EXT_mesh_shader) !=\n                            glslangIntermediate->getRequestedExtensions().end());\n    spv::ExecutionModel executionModel = TranslateExecutionModel(glslangIntermediate->getStage(), isMeshShaderExt);\n\n    builder.clearAccessChain();\n    builder.setSource(TranslateSourceLanguage(glslangIntermediate->getSource(), glslangIntermediate->getProfile()),\n                      glslangIntermediate->getVersion());\n\n    if (options.emitNonSemanticShaderDebugSource)\n            this->options.emitNonSemanticShaderDebugInfo = true;\n    if (options.emitNonSemanticShaderDebugInfo)\n            this->options.generateDebugInfo = true;\n\n    if (this->options.generateDebugInfo) {\n        if (this->options.emitNonSemanticShaderDebugInfo) {\n            builder.setEmitNonSemanticShaderDebugInfo(this->options.emitNonSemanticShaderDebugSource);\n        }\n        else {\n            builder.setEmitSpirvDebugInfo();\n        }\n        builder.setDebugMainSourceFile(glslangIntermediate->getSourceFile());\n\n        // Set the source shader's text. If for SPV version 1.0, include\n        // a preamble in comments stating the OpModuleProcessed instructions.\n        // Otherwise, emit those as actual instructions.\n        std::string text;\n        const std::vector<std::string>& processes = glslangIntermediate->getProcesses();\n        for (int p = 0; p < (int)processes.size(); ++p) {\n            if (glslangIntermediate->getSpv().spv < glslang::EShTargetSpv_1_1) {\n                text.append(\"// OpModuleProcessed \");\n                text.append(processes[p]);\n                text.append(\"\\n\");\n            } else\n                builder.addModuleProcessed(processes[p]);\n        }\n        if (glslangIntermediate->getSpv().spv < glslang::EShTargetSpv_1_1 && (int)processes.size() > 0)\n            text.append(\"#line 1\\n\");\n        text.append(glslangIntermediate->getSourceText());\n        builder.setSourceText(text);\n        // Pass name and text for all included files\n        const std::map<std::string, std::string>& include_txt = glslangIntermediate->getIncludeText();\n        for (auto iItr = include_txt.begin(); iItr != include_txt.end(); ++iItr)\n            builder.addInclude(iItr->first, iItr->second);\n    }\n\n    builder.setUseReplicatedComposites(glslangIntermediate->usingReplicatedComposites());\n\n    stdBuiltins = builder.import(\"GLSL.std.450\");\n\n    spv::AddressingModel addressingModel = spv::AddressingModel::Logical;\n    spv::MemoryModel memoryModel = spv::MemoryModel::GLSL450;\n\n    if (glslangIntermediate->usingPhysicalStorageBuffer()) {\n        addressingModel = spv::AddressingModel::PhysicalStorageBuffer64EXT;\n        builder.addIncorporatedExtension(spv::E_SPV_KHR_physical_storage_buffer, spv::Spv_1_5);\n        builder.addCapability(spv::Capability::PhysicalStorageBufferAddressesEXT);\n    }\n    if (glslangIntermediate->usingVulkanMemoryModel()) {\n        memoryModel = spv::MemoryModel::VulkanKHR;\n        builder.addCapability(spv::Capability::VulkanMemoryModelKHR);\n        builder.addIncorporatedExtension(spv::E_SPV_KHR_vulkan_memory_model, spv::Spv_1_5);\n    }\n    builder.setMemoryModel(addressingModel, memoryModel);\n\n    if (glslangIntermediate->usingVariablePointers()) {\n        builder.addCapability(spv::Capability::VariablePointers);\n    }\n\n    // If not linking, there is no entry point\n    if (!options.compileOnly) {\n        shaderEntry = builder.makeEntryPoint(glslangIntermediate->getEntryPointName().c_str());\n        entryPoint =\n            builder.addEntryPoint(executionModel, shaderEntry, glslangIntermediate->getEntryPointName().c_str());\n    }\n\n    // Add the source extensions\n    const auto& sourceExtensions = glslangIntermediate->getRequestedExtensions();\n    for (auto it = sourceExtensions.begin(); it != sourceExtensions.end(); ++it)\n        builder.addSourceExtension(it->c_str());\n\n    // Add the top-level modes for this shader.\n\n    if (glslangIntermediate->getXfbMode()) {\n        builder.addCapability(spv::Capability::TransformFeedback);\n        builder.addExecutionMode(shaderEntry, spv::ExecutionMode::Xfb);\n    }\n\n    if (glslangIntermediate->getLayoutPrimitiveCulling()) {\n        builder.addCapability(spv::Capability::RayTraversalPrimitiveCullingKHR);\n    }\n\n    if (glslangIntermediate->getSubgroupUniformControlFlow()) {\n        builder.addExtension(spv::E_SPV_KHR_subgroup_uniform_control_flow);\n        builder.addExecutionMode(shaderEntry, spv::ExecutionMode::SubgroupUniformControlFlowKHR);\n    }\n    if (glslangIntermediate->getMaximallyReconverges()) {\n        builder.addExtension(spv::E_SPV_KHR_maximal_reconvergence);\n        builder.addExecutionMode(shaderEntry, spv::ExecutionMode::MaximallyReconvergesKHR);\n    }\n\n    if (glslangIntermediate->getQuadDerivMode())\n    {\n        builder.addCapability(spv::Capability::QuadControlKHR);\n        builder.addExtension(spv::E_SPV_KHR_quad_control);\n        builder.addExecutionMode(shaderEntry, spv::ExecutionMode::QuadDerivativesKHR);\n    }\n\n    if (glslangIntermediate->getReqFullQuadsMode())\n    {\n        builder.addCapability(spv::Capability::QuadControlKHR);\n        builder.addExtension(spv::E_SPV_KHR_quad_control);\n        builder.addExecutionMode(shaderEntry, spv::ExecutionMode::RequireFullQuadsKHR);\n    }\n\n    spv::ExecutionMode mode;\n    switch (glslangIntermediate->getStage()) {\n    case EShLangVertex:\n        builder.addCapability(spv::Capability::Shader);\n        break;\n\n    case EShLangFragment:\n        builder.addCapability(spv::Capability::Shader);\n        if (glslangIntermediate->getPixelCenterInteger())\n            builder.addExecutionMode(shaderEntry, spv::ExecutionMode::PixelCenterInteger);\n\n        if (glslangIntermediate->getOriginUpperLeft())\n            builder.addExecutionMode(shaderEntry, spv::ExecutionMode::OriginUpperLeft);\n        else\n            builder.addExecutionMode(shaderEntry, spv::ExecutionMode::OriginLowerLeft);\n\n        if (glslangIntermediate->getEarlyFragmentTests())\n            builder.addExecutionMode(shaderEntry, spv::ExecutionMode::EarlyFragmentTests);\n\n        if (glslangIntermediate->getEarlyAndLateFragmentTestsAMD())\n        {\n            builder.addExecutionMode(shaderEntry, spv::ExecutionMode::EarlyAndLateFragmentTestsAMD);\n            builder.addExtension(spv::E_SPV_AMD_shader_early_and_late_fragment_tests);\n        }\n\n        if (glslangIntermediate->getPostDepthCoverage()) {\n            builder.addCapability(spv::Capability::SampleMaskPostDepthCoverage);\n            builder.addExecutionMode(shaderEntry, spv::ExecutionMode::PostDepthCoverage);\n            builder.addExtension(spv::E_SPV_KHR_post_depth_coverage);\n        }\n\n        if (glslangIntermediate->getNonCoherentColorAttachmentReadEXT()) {\n            builder.addCapability(spv::Capability::TileImageColorReadAccessEXT);\n            builder.addExecutionMode(shaderEntry, spv::ExecutionMode::NonCoherentColorAttachmentReadEXT);\n            builder.addExtension(spv::E_SPV_EXT_shader_tile_image);\n        }\n\n        if (glslangIntermediate->getNonCoherentDepthAttachmentReadEXT()) {\n            builder.addCapability(spv::Capability::TileImageDepthReadAccessEXT);\n            builder.addExecutionMode(shaderEntry, spv::ExecutionMode::NonCoherentDepthAttachmentReadEXT);\n            builder.addExtension(spv::E_SPV_EXT_shader_tile_image);\n        }\n\n        if (glslangIntermediate->getNonCoherentStencilAttachmentReadEXT()) {\n            builder.addCapability(spv::Capability::TileImageStencilReadAccessEXT);\n            builder.addExecutionMode(shaderEntry, spv::ExecutionMode::NonCoherentStencilAttachmentReadEXT);\n            builder.addExtension(spv::E_SPV_EXT_shader_tile_image);\n        }\n\n        if (glslangIntermediate->getNonCoherentTileAttachmentReadQCOM()) {\n            builder.addCapability(spv::Capability::TileShadingQCOM);\n            builder.addExecutionMode(shaderEntry, spv::ExecutionMode::NonCoherentTileAttachmentReadQCOM);\n            builder.addExtension(spv::E_SPV_QCOM_tile_shading);\n        }\n\n        if (glslangIntermediate->isDepthReplacing())\n            builder.addExecutionMode(shaderEntry, spv::ExecutionMode::DepthReplacing);\n\n        if (glslangIntermediate->isStencilReplacing())\n            builder.addExecutionMode(shaderEntry, spv::ExecutionMode::StencilRefReplacingEXT);\n\n        switch(glslangIntermediate->getDepth()) {\n        case glslang::EldGreater:   mode = spv::ExecutionMode::DepthGreater;   break;\n        case glslang::EldLess:      mode = spv::ExecutionMode::DepthLess;      break;\n        case glslang::EldUnchanged: mode = spv::ExecutionMode::DepthUnchanged; break;\n        default:                    mode = spv::ExecutionMode::Max;            break;\n        }\n\n        if (mode != spv::ExecutionMode::Max)\n            builder.addExecutionMode(shaderEntry, mode);\n\n        switch (glslangIntermediate->getStencil()) {\n        case glslang::ElsRefUnchangedFrontAMD:  mode = spv::ExecutionMode::StencilRefUnchangedFrontAMD; break;\n        case glslang::ElsRefGreaterFrontAMD:    mode = spv::ExecutionMode::StencilRefGreaterFrontAMD;   break;\n        case glslang::ElsRefLessFrontAMD:       mode = spv::ExecutionMode::StencilRefLessFrontAMD;      break;\n        case glslang::ElsRefUnchangedBackAMD:   mode = spv::ExecutionMode::StencilRefUnchangedBackAMD;  break;\n        case glslang::ElsRefGreaterBackAMD:     mode = spv::ExecutionMode::StencilRefGreaterBackAMD;    break;\n        case glslang::ElsRefLessBackAMD:        mode = spv::ExecutionMode::StencilRefLessBackAMD;       break;\n        default:                       mode = spv::ExecutionMode::Max;                         break;\n        }\n\n        if (mode != spv::ExecutionMode::Max)\n            builder.addExecutionMode(shaderEntry, (spv::ExecutionMode)mode);\n        switch (glslangIntermediate->getInterlockOrdering()) {\n        case glslang::EioPixelInterlockOrdered:         mode = spv::ExecutionMode::PixelInterlockOrderedEXT;\n            break;\n        case glslang::EioPixelInterlockUnordered:       mode = spv::ExecutionMode::PixelInterlockUnorderedEXT;\n            break;\n        case glslang::EioSampleInterlockOrdered:        mode = spv::ExecutionMode::SampleInterlockOrderedEXT;\n            break;\n        case glslang::EioSampleInterlockUnordered:      mode = spv::ExecutionMode::SampleInterlockUnorderedEXT;\n            break;\n        case glslang::EioShadingRateInterlockOrdered:   mode = spv::ExecutionMode::ShadingRateInterlockOrderedEXT;\n            break;\n        case glslang::EioShadingRateInterlockUnordered: mode = spv::ExecutionMode::ShadingRateInterlockUnorderedEXT;\n            break;\n        default:                                        mode = spv::ExecutionMode::Max;\n            break;\n        }\n        if (mode != spv::ExecutionMode::Max) {\n            builder.addExecutionMode(shaderEntry, (spv::ExecutionMode)mode);\n            if (mode == spv::ExecutionMode::ShadingRateInterlockOrderedEXT ||\n                mode == spv::ExecutionMode::ShadingRateInterlockUnorderedEXT) {\n                builder.addCapability(spv::Capability::FragmentShaderShadingRateInterlockEXT);\n            } else if (mode == spv::ExecutionMode::PixelInterlockOrderedEXT ||\n                       mode == spv::ExecutionMode::PixelInterlockUnorderedEXT) {\n                builder.addCapability(spv::Capability::FragmentShaderPixelInterlockEXT);\n            } else {\n                builder.addCapability(spv::Capability::FragmentShaderSampleInterlockEXT);\n            }\n            builder.addExtension(spv::E_SPV_EXT_fragment_shader_interlock);\n        }\n    break;\n\n    case EShLangCompute: {\n        builder.addCapability(spv::Capability::Shader);\n        bool needSizeId = false;\n        for (int dim = 0; dim < 3; ++dim) {\n            if ((glslangIntermediate->getLocalSizeSpecId(dim) != glslang::TQualifier::layoutNotSet)) {\n                needSizeId = true;\n                break;\n            }\n        }\n        if (glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_6 && needSizeId) {\n            std::vector<spv::Id> dimConstId;\n            for (int dim = 0; dim < 3; ++dim) {\n                bool specConst = (glslangIntermediate->getLocalSizeSpecId(dim) != glslang::TQualifier::layoutNotSet);\n                dimConstId.push_back(builder.makeUintConstant(glslangIntermediate->getLocalSize(dim), specConst));\n                if (specConst) {\n                    builder.addDecoration(dimConstId.back(), spv::Decoration::SpecId,\n                                          glslangIntermediate->getLocalSizeSpecId(dim));\n                    needSizeId = true;\n                }\n            }\n            builder.addExecutionModeId(shaderEntry, spv::ExecutionMode::LocalSizeId, dimConstId);\n        } else {\n            if (glslangIntermediate->getTileShadingRateQCOM(0) >= 1 || glslangIntermediate->getTileShadingRateQCOM(1) >= 1 || glslangIntermediate->getTileShadingRateQCOM(2) >= 1) {\n                auto rate_x = glslangIntermediate->getTileShadingRateQCOM(0);\n                auto rate_y = glslangIntermediate->getTileShadingRateQCOM(1);\n                auto rate_z = glslangIntermediate->getTileShadingRateQCOM(2);\n                rate_x = ( rate_x == 0 ? 1 : rate_x );\n                rate_y = ( rate_y == 0 ? 1 : rate_y );\n                rate_z = ( rate_z == 0 ? 1 : rate_z );\n                builder.addExecutionMode(shaderEntry, spv::ExecutionMode::TileShadingRateQCOM, rate_x, rate_y, rate_z);\n            } else {\n                builder.addExecutionMode(shaderEntry, spv::ExecutionMode::LocalSize, glslangIntermediate->getLocalSize(0),\n                                                                                   glslangIntermediate->getLocalSize(1),\n                                                                                   glslangIntermediate->getLocalSize(2));\n            }\n        }\n        if (glslangIntermediate->getLayoutDerivativeModeNone() == glslang::LayoutDerivativeGroupQuads) {\n            builder.addCapability(spv::Capability::ComputeDerivativeGroupQuadsNV);\n            builder.addExecutionMode(shaderEntry, spv::ExecutionMode::DerivativeGroupQuadsNV);\n            builder.addExtension(spv::E_SPV_NV_compute_shader_derivatives);\n        } else if (glslangIntermediate->getLayoutDerivativeModeNone() == glslang::LayoutDerivativeGroupLinear) {\n            builder.addCapability(spv::Capability::ComputeDerivativeGroupLinearNV);\n            builder.addExecutionMode(shaderEntry, spv::ExecutionMode::DerivativeGroupLinearNV);\n            builder.addExtension(spv::E_SPV_NV_compute_shader_derivatives);\n        }\n\n        if (glslangIntermediate->getNonCoherentTileAttachmentReadQCOM()) {\n            builder.addCapability(spv::Capability::TileShadingQCOM);\n            builder.addExecutionMode(shaderEntry, spv::ExecutionMode::NonCoherentTileAttachmentReadQCOM);\n            builder.addExtension(spv::E_SPV_QCOM_tile_shading);\n        }\n\n        break;\n    }\n    case EShLangTessEvaluation:\n    case EShLangTessControl:\n        builder.addCapability(spv::Capability::Tessellation);\n\n        glslang::TLayoutGeometry primitive;\n\n        if (glslangIntermediate->getStage() == EShLangTessControl) {\n            builder.addExecutionMode(shaderEntry, spv::ExecutionMode::OutputVertices,\n                glslangIntermediate->getVertices());\n            primitive = glslangIntermediate->getOutputPrimitive();\n        } else {\n            primitive = glslangIntermediate->getInputPrimitive();\n        }\n\n        switch (primitive) {\n        case glslang::ElgTriangles:           mode = spv::ExecutionMode::Triangles;     break;\n        case glslang::ElgQuads:               mode = spv::ExecutionMode::Quads;         break;\n        case glslang::ElgIsolines:            mode = spv::ExecutionMode::Isolines;      break;\n        default:                              mode = spv::ExecutionMode::Max;           break;\n        }\n        if (mode != spv::ExecutionMode::Max)\n            builder.addExecutionMode(shaderEntry, mode);\n\n        switch (glslangIntermediate->getVertexSpacing()) {\n        case glslang::EvsEqual:            mode = spv::ExecutionMode::SpacingEqual;          break;\n        case glslang::EvsFractionalEven:   mode = spv::ExecutionMode::SpacingFractionalEven; break;\n        case glslang::EvsFractionalOdd:    mode = spv::ExecutionMode::SpacingFractionalOdd;  break;\n        default:                           mode = spv::ExecutionMode::Max;                   break;\n        }\n        if (mode != spv::ExecutionMode::Max)\n            builder.addExecutionMode(shaderEntry, mode);\n\n        switch (glslangIntermediate->getVertexOrder()) {\n        case glslang::EvoCw:     mode = spv::ExecutionMode::VertexOrderCw;  break;\n        case glslang::EvoCcw:    mode = spv::ExecutionMode::VertexOrderCcw; break;\n        default:                 mode = spv::ExecutionMode::Max;            break;\n        }\n        if (mode != spv::ExecutionMode::Max)\n            builder.addExecutionMode(shaderEntry, mode);\n\n        if (glslangIntermediate->getPointMode())\n            builder.addExecutionMode(shaderEntry, spv::ExecutionMode::PointMode);\n        break;\n\n    case EShLangGeometry:\n        builder.addCapability(spv::Capability::Geometry);\n        switch (glslangIntermediate->getInputPrimitive()) {\n        case glslang::ElgPoints:             mode = spv::ExecutionMode::InputPoints;             break;\n        case glslang::ElgLines:              mode = spv::ExecutionMode::InputLines;              break;\n        case glslang::ElgLinesAdjacency:     mode = spv::ExecutionMode::InputLinesAdjacency;     break;\n        case glslang::ElgTriangles:          mode = spv::ExecutionMode::Triangles;               break;\n        case glslang::ElgTrianglesAdjacency: mode = spv::ExecutionMode::InputTrianglesAdjacency; break;\n        default:                             mode = spv::ExecutionMode::Max;                     break;\n        }\n        if (mode != spv::ExecutionMode::Max)\n            builder.addExecutionMode(shaderEntry, mode);\n\n        builder.addExecutionMode(shaderEntry, spv::ExecutionMode::Invocations, glslangIntermediate->getInvocations());\n\n        switch (glslangIntermediate->getOutputPrimitive()) {\n        case glslang::ElgPoints:        mode = spv::ExecutionMode::OutputPoints;                 break;\n        case glslang::ElgLineStrip:     mode = spv::ExecutionMode::OutputLineStrip;              break;\n        case glslang::ElgTriangleStrip: mode = spv::ExecutionMode::OutputTriangleStrip;          break;\n        default:                        mode = spv::ExecutionMode::Max;                          break;\n        }\n        if (mode != spv::ExecutionMode::Max)\n            builder.addExecutionMode(shaderEntry, mode);\n        builder.addExecutionMode(shaderEntry, spv::ExecutionMode::OutputVertices, glslangIntermediate->getVertices());\n        break;\n\n    case EShLangRayGen:\n    case EShLangIntersect:\n    case EShLangAnyHit:\n    case EShLangClosestHit:\n    case EShLangMiss:\n    case EShLangCallable:\n    {\n        auto& extensions = glslangIntermediate->getRequestedExtensions();\n        if (extensions.find(\"GL_EXT_opacity_micromap\") != extensions.end()) {\n            builder.addCapability(spv::Capability::RayTracingOpacityMicromapEXT);\n            builder.addExtension(\"SPV_EXT_opacity_micromap\");\n        }\n        if (extensions.find(\"GL_NV_ray_tracing\") == extensions.end()) {\n            builder.addCapability(spv::Capability::RayTracingKHR);\n            builder.addExtension(\"SPV_KHR_ray_tracing\");\n        }\n        else {\n            builder.addCapability(spv::Capability::RayTracingNV);\n            builder.addExtension(\"SPV_NV_ray_tracing\");\n        }\n        if (glslangIntermediate->getStage() != EShLangRayGen && glslangIntermediate->getStage() != EShLangCallable) {\n            if (extensions.find(\"GL_EXT_ray_cull_mask\") != extensions.end()) {\n                builder.addCapability(spv::Capability::RayCullMaskKHR);\n                builder.addExtension(\"SPV_KHR_ray_cull_mask\");\n            }\n            if (extensions.find(\"GL_EXT_ray_tracing_position_fetch\") != extensions.end()) {\n                builder.addCapability(spv::Capability::RayTracingPositionFetchKHR);\n                builder.addExtension(\"SPV_KHR_ray_tracing_position_fetch\");\n            }\n        }\n        break;\n    }\n    case EShLangTask:\n    case EShLangMesh:\n        if(isMeshShaderExt) {\n            builder.addCapability(spv::Capability::MeshShadingEXT);\n            builder.addExtension(spv::E_SPV_EXT_mesh_shader);\n        } else {\n            builder.addCapability(spv::Capability::MeshShadingNV);\n            builder.addExtension(spv::E_SPV_NV_mesh_shader);\n        }\n        if (glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_6) {\n            std::vector<spv::Id> dimConstId;\n            for (int dim = 0; dim < 3; ++dim) {\n                bool specConst = (glslangIntermediate->getLocalSizeSpecId(dim) != glslang::TQualifier::layoutNotSet);\n                dimConstId.push_back(builder.makeUintConstant(glslangIntermediate->getLocalSize(dim), specConst));\n                if (specConst) {\n                    builder.addDecoration(dimConstId.back(), spv::Decoration::SpecId,\n                                          glslangIntermediate->getLocalSizeSpecId(dim));\n                }\n            }\n            builder.addExecutionModeId(shaderEntry, spv::ExecutionMode::LocalSizeId, dimConstId);\n        } else {\n            builder.addExecutionMode(shaderEntry, spv::ExecutionMode::LocalSize, glslangIntermediate->getLocalSize(0),\n                                                                               glslangIntermediate->getLocalSize(1),\n                                                                               glslangIntermediate->getLocalSize(2));\n        }\n        if (glslangIntermediate->getStage() == EShLangMesh) {\n            builder.addExecutionMode(shaderEntry, spv::ExecutionMode::OutputVertices,\n                glslangIntermediate->getVertices());\n            builder.addExecutionMode(shaderEntry, spv::ExecutionMode::OutputPrimitivesNV,\n                glslangIntermediate->getPrimitives());\n\n            switch (glslangIntermediate->getOutputPrimitive()) {\n            case glslang::ElgPoints:        mode = spv::ExecutionMode::OutputPoints;      break;\n            case glslang::ElgLines:         mode = spv::ExecutionMode::OutputLinesNV;     break;\n            case glslang::ElgTriangles:     mode = spv::ExecutionMode::OutputTrianglesNV; break;\n            default:                        mode = spv::ExecutionMode::Max;               break;\n            }\n            if (mode != spv::ExecutionMode::Max)\n                builder.addExecutionMode(shaderEntry, (spv::ExecutionMode)mode);\n        }\n        break;\n\n    default:\n        break;\n    }\n\n    //\n    // Add SPIR-V requirements (GL_EXT_spirv_intrinsics)\n    //\n    if (glslangIntermediate->hasSpirvRequirement()) {\n        const glslang::TSpirvRequirement& spirvRequirement = glslangIntermediate->getSpirvRequirement();\n\n        // Add SPIR-V extension requirement\n        for (auto& extension : spirvRequirement.extensions)\n            builder.addExtension(extension.c_str());\n\n        // Add SPIR-V capability requirement\n        for (auto capability : spirvRequirement.capabilities)\n            builder.addCapability(static_cast<spv::Capability>(capability));\n    }\n\n    //\n    // Add SPIR-V execution mode qualifiers (GL_EXT_spirv_intrinsics)\n    //\n    if (glslangIntermediate->hasSpirvExecutionMode()) {\n        const glslang::TSpirvExecutionMode spirvExecutionMode = glslangIntermediate->getSpirvExecutionMode();\n\n        // Add spirv_execution_mode\n        for (auto& mode : spirvExecutionMode.modes) {\n            if (!mode.second.empty()) {\n                std::vector<unsigned> literals;\n                TranslateLiterals(mode.second, literals);\n                builder.addExecutionMode(shaderEntry, static_cast<spv::ExecutionMode>(mode.first), literals);\n            } else\n                builder.addExecutionMode(shaderEntry, static_cast<spv::ExecutionMode>(mode.first));\n        }\n\n        // Add spirv_execution_mode_id\n        for (auto& modeId : spirvExecutionMode.modeIds) {\n            std::vector<spv::Id> operandIds;\n            assert(!modeId.second.empty());\n            for (auto extraOperand : modeId.second) {\n                if (extraOperand->getType().getQualifier().isSpecConstant())\n                    operandIds.push_back(getSymbolId(extraOperand->getAsSymbolNode()));\n                else\n                    operandIds.push_back(createSpvConstant(*extraOperand));\n            }\n            builder.addExecutionModeId(shaderEntry, static_cast<spv::ExecutionMode>(modeId.first), operandIds);\n        }\n    }\n}\n\n// Finish creating SPV, after the traversal is complete.\nvoid TGlslangToSpvTraverser::finishSpv(bool compileOnly)\n{\n    // If not linking, an entry point is not expected\n    if (!compileOnly) {\n        // Finish the entry point function\n        if (!entryPointTerminated) {\n            builder.setBuildPoint(shaderEntry->getLastBlock());\n            builder.leaveFunction();\n        }\n\n        // finish off the entry-point SPV instruction by adding the Input/Output <id>\n        entryPoint->reserveOperands(iOSet.size());\n        for (auto id : iOSet)\n            entryPoint->addIdOperand(id);\n    }\n\n    // Add capabilities, extensions, remove unneeded decorations, etc.,\n    // based on the resulting SPIR-V.\n    // Note: WebGPU code generation must have the opportunity to aggressively\n    // prune unreachable merge blocks and continue targets.\n    builder.postProcess(compileOnly);\n}\n\n// Write the SPV into 'out'.\nvoid TGlslangToSpvTraverser::dumpSpv(std::vector<unsigned int>& out)\n{\n    builder.dump(out);\n}\n\n//\n// Implement the traversal functions.\n//\n// Return true from interior nodes to have the external traversal\n// continue on to children.  Return false if children were\n// already processed.\n//\n\n//\n// Symbols can turn into\n//  - uniform/input reads\n//  - output writes\n//  - complex lvalue base setups:  foo.bar[3]....  , where we see foo and start up an access chain\n//  - something simple that degenerates into the last bullet\n//\nvoid TGlslangToSpvTraverser::visitSymbol(glslang::TIntermSymbol* symbol)\n{\n    // We update the line information even though no code might be generated here\n    // This is helpful to yield correct lines for control flow instructions\n    if (!linkageOnly) {\n        builder.setDebugSourceLocation(symbol->getLoc().line, symbol->getLoc().getFilename());\n    }\n\n    if (symbol->getBasicType() == glslang::EbtFunction) {\n        return;\n    }\n\n    SpecConstantOpModeGuard spec_constant_op_mode_setter(&builder);\n    if (symbol->getType().isStruct())\n        glslangTypeToIdMap[symbol->getType().getStruct()] = symbol->getId();\n\n    if (symbol->getType().getQualifier().isSpecConstant())\n        spec_constant_op_mode_setter.turnOnSpecConstantOpMode();\n#ifdef ENABLE_HLSL\n    // Skip symbol handling if it is string-typed\n    if (symbol->getBasicType() == glslang::EbtString)\n        return;\n#endif\n\n    // getSymbolId() will set up all the IO decorations on the first call.\n    // Formal function parameters were mapped during makeFunctions().\n    spv::Id id = getSymbolId(symbol);\n\n    if (symbol->getType().getQualifier().isTaskPayload())\n        taskPayloadID = id; // cache the taskPayloadID to be used it as operand for OpEmitMeshTasksEXT\n\n    if (builder.isPointer(id)) {\n        if (!symbol->getType().getQualifier().isParamInput() &&\n            !symbol->getType().getQualifier().isParamOutput()) {\n            // Include all \"static use\" and \"linkage only\" interface variables on the OpEntryPoint instruction\n            // Consider adding to the OpEntryPoint interface list.\n            // Only looking at structures if they have at least one member.\n            if (!symbol->getType().isStruct() || symbol->getType().getStruct()->size() > 0) {\n                spv::StorageClass sc = builder.getStorageClass(id);\n                // Before SPIR-V 1.4, we only want to include Input and Output.\n                // Starting with SPIR-V 1.4, we want all globals.\n                if ((glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_4 && builder.isGlobalVariable(id)) ||\n                    (sc == spv::StorageClass::Input || sc == spv::StorageClass::Output)) {\n                    iOSet.insert(id);\n                }\n            }\n        }\n\n        // If the SPIR-V type is required to be different than the AST type\n        // (for ex SubgroupMasks or 3x4 ObjectToWorld/WorldToObject matrices),\n        // translate now from the SPIR-V type to the AST type, for the consuming\n        // operation.\n        // Note this turns it from an l-value to an r-value.\n        // Currently, all symbols needing this are inputs; avoid the map lookup when non-input.\n        if (symbol->getType().getQualifier().storage == glslang::EvqVaryingIn)\n            id = translateForcedType(id);\n    }\n\n    // Only process non-linkage-only nodes for generating actual static uses\n    if (! linkageOnly || symbol->getQualifier().isSpecConstant()) {\n        // Prepare to generate code for the access\n\n        // L-value chains will be computed left to right.  We're on the symbol now,\n        // which is the left-most part of the access chain, so now is \"clear\" time,\n        // followed by setting the base.\n        builder.clearAccessChain();\n\n        // For now, we consider all user variables as being in memory, so they are pointers,\n        // except for\n        // A) R-Value arguments to a function, which are an intermediate object.\n        //    See comments in handleUserFunctionCall().\n        // B) Specialization constants (normal constants don't even come in as a variable),\n        //    These are also pure R-values.\n        // C) R-Values from type translation, see above call to translateForcedType()\n        glslang::TQualifier qualifier = symbol->getQualifier();\n        if (qualifier.isSpecConstant() || rValueParameters.find(symbol->getId()) != rValueParameters.end() ||\n            !builder.isPointerType(builder.getTypeId(id)))\n            builder.setAccessChainRValue(id);\n        else\n            builder.setAccessChainLValue(id);\n    }\n\n#ifdef ENABLE_HLSL\n    // Process linkage-only nodes for any special additional interface work.\n    if (linkageOnly) {\n        if (glslangIntermediate->getHlslFunctionality1()) {\n            // Map implicit counter buffers to their originating buffers, which should have been\n            // seen by now, given earlier pruning of unused counters, and preservation of order\n            // of declaration.\n            if (symbol->getType().getQualifier().isUniformOrBuffer()) {\n                if (!glslangIntermediate->hasCounterBufferName(symbol->getName())) {\n                    // Save possible originating buffers for counter buffers, keyed by\n                    // making the potential counter-buffer name.\n                    std::string keyName = symbol->getName().c_str();\n                    keyName = glslangIntermediate->addCounterBufferName(keyName);\n                    counterOriginator[keyName] = symbol;\n                } else {\n                    // Handle a counter buffer, by finding the saved originating buffer.\n                    std::string keyName = symbol->getName().c_str();\n                    auto it = counterOriginator.find(keyName);\n                    if (it != counterOriginator.end()) {\n                        id = getSymbolId(it->second);\n                        if (id != spv::NoResult) {\n                            spv::Id counterId = getSymbolId(symbol);\n                            if (counterId != spv::NoResult) {\n                                builder.addExtension(\"SPV_GOOGLE_hlsl_functionality1\");\n                                builder.addDecorationId(id, spv::Decoration::HlslCounterBufferGOOGLE, counterId);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n#endif\n}\n\nbool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::TIntermBinary* node)\n{\n    builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename());\n    if (node->getLeft()->getAsSymbolNode() != nullptr && node->getLeft()->getType().isStruct()) {\n        glslangTypeToIdMap[node->getLeft()->getType().getStruct()] = node->getLeft()->getAsSymbolNode()->getId();\n    }\n    if (node->getRight()->getAsSymbolNode() != nullptr && node->getRight()->getType().isStruct()) {\n        glslangTypeToIdMap[node->getRight()->getType().getStruct()] = node->getRight()->getAsSymbolNode()->getId();\n    }\n\n    SpecConstantOpModeGuard spec_constant_op_mode_setter(&builder);\n    if (node->getType().getQualifier().isSpecConstant())\n        spec_constant_op_mode_setter.turnOnSpecConstantOpMode();\n\n    // First, handle special cases\n    switch (node->getOp()) {\n    case glslang::EOpAssign:\n    case glslang::EOpAddAssign:\n    case glslang::EOpSubAssign:\n    case glslang::EOpMulAssign:\n    case glslang::EOpVectorTimesMatrixAssign:\n    case glslang::EOpVectorTimesScalarAssign:\n    case glslang::EOpMatrixTimesScalarAssign:\n    case glslang::EOpMatrixTimesMatrixAssign:\n    case glslang::EOpDivAssign:\n    case glslang::EOpModAssign:\n    case glslang::EOpAndAssign:\n    case glslang::EOpInclusiveOrAssign:\n    case glslang::EOpExclusiveOrAssign:\n    case glslang::EOpLeftShiftAssign:\n    case glslang::EOpRightShiftAssign:\n        // A bin-op assign \"a += b\" means the same thing as \"a = a + b\"\n        // where a is evaluated before b. For a simple assignment, GLSL\n        // says to evaluate the left before the right.  So, always, left\n        // node then right node.\n        {\n            // get the left l-value, save it away\n            builder.clearAccessChain();\n            node->getLeft()->traverse(this);\n            spv::Builder::AccessChain lValue = builder.getAccessChain();\n\n            // evaluate the right\n            builder.clearAccessChain();\n            node->getRight()->traverse(this);\n            spv::Id rValue = accessChainLoad(node->getRight()->getType());\n\n            // reset line number for assignment\n            builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename());\n\n            if (node->getOp() != glslang::EOpAssign) {\n                // the left is also an r-value\n                builder.setAccessChain(lValue);\n                spv::Id leftRValue = accessChainLoad(node->getLeft()->getType());\n\n                // do the operation\n                spv::Builder::AccessChain::CoherentFlags coherentFlags = TranslateCoherent(node->getLeft()->getType());\n                coherentFlags |= TranslateCoherent(node->getRight()->getType());\n                OpDecorations decorations = { TranslatePrecisionDecoration(node->getOperationPrecision()),\n                                              TranslateNoContractionDecoration(node->getType().getQualifier()),\n                                              TranslateNonUniformDecoration(coherentFlags) };\n                rValue = createBinaryOperation(node->getOp(), decorations,\n                                               convertGlslangToSpvType(node->getType()), leftRValue, rValue,\n                                               node->getType().getBasicType());\n\n                // these all need their counterparts in createBinaryOperation()\n                assert(rValue != spv::NoResult);\n            }\n\n            // store the result\n            builder.setAccessChain(lValue);\n            multiTypeStore(node->getLeft()->getType(), rValue);\n\n            // assignments are expressions having an rValue after they are evaluated...\n            builder.clearAccessChain();\n            builder.setAccessChainRValue(rValue);\n        }\n        return false;\n    case glslang::EOpIndexDirect:\n    case glslang::EOpIndexDirectStruct:\n        {\n            // Structure, array, matrix, or vector indirection with statically known index.\n            // Get the left part of the access chain.\n            node->getLeft()->traverse(this);\n\n            // Add the next element in the chain\n\n            const int glslangIndex = node->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst();\n            if (! node->getLeft()->getType().isArray() &&\n                node->getLeft()->getType().isVector() &&\n                node->getOp() == glslang::EOpIndexDirect) {\n                // Swizzle is uniform so propagate uniform into access chain\n                spv::Builder::AccessChain::CoherentFlags coherentFlags = TranslateCoherent(node->getLeft()->getType());\n                coherentFlags.nonUniform = 0;\n                // This is essentially a hard-coded vector swizzle of size 1,\n                // so short circuit the access-chain stuff with a swizzle.\n                std::vector<unsigned> swizzle;\n                swizzle.push_back(glslangIndex);\n                int dummySize;\n                builder.accessChainPushSwizzle(swizzle, convertGlslangToSpvType(node->getLeft()->getType()),\n                                               coherentFlags,\n                                               glslangIntermediate->getBaseAlignmentScalar(\n                                                   node->getLeft()->getType(), dummySize));\n            } else {\n\n                // Load through a block reference is performed with a dot operator that\n                // is mapped to EOpIndexDirectStruct. When we get to the actual reference,\n                // do a load and reset the access chain.\n                if (node->getLeft()->isReference() &&\n                    !node->getLeft()->getType().isArray() &&\n                    node->getOp() == glslang::EOpIndexDirectStruct)\n                {\n                    spv::Id left = accessChainLoad(node->getLeft()->getType());\n                    builder.clearAccessChain();\n                    builder.setAccessChainLValue(left);\n                }\n\n                int spvIndex = glslangIndex;\n                if (node->getLeft()->getBasicType() == glslang::EbtBlock &&\n                    node->getOp() == glslang::EOpIndexDirectStruct)\n                {\n                    // This may be, e.g., an anonymous block-member selection, which generally need\n                    // index remapping due to hidden members in anonymous blocks.\n                    long long glslangId = glslangTypeToIdMap[node->getLeft()->getType().getStruct()];\n                    if (memberRemapper.find(glslangId) != memberRemapper.end()) {\n                        std::vector<int>& remapper = memberRemapper[glslangId];\n                        assert(remapper.size() > 0);\n                        spvIndex = remapper[glslangIndex];\n                    }\n                }\n\n                // Struct reference propagates uniform lvalue\n                spv::Builder::AccessChain::CoherentFlags coherentFlags =\n                        TranslateCoherent(node->getLeft()->getType());\n                coherentFlags.nonUniform = 0;\n\n                // normal case for indexing array or structure or block\n                builder.accessChainPush(builder.makeIntConstant(spvIndex),\n                        coherentFlags,\n                        node->getLeft()->getType().getBufferReferenceAlignment());\n\n                // Add capabilities here for accessing PointSize and clip/cull distance.\n                // We have deferred generation of associated capabilities until now.\n                if (node->getLeft()->getType().isStruct() && ! node->getLeft()->getType().isArray())\n                    declareUseOfStructMember(*(node->getLeft()->getType().getStruct()), glslangIndex);\n            }\n        }\n        return false;\n    case glslang::EOpIndexIndirect:\n        {\n            // Array, matrix, or vector indirection with variable index.\n            // Will use native SPIR-V access-chain for and array indirection;\n            // matrices are arrays of vectors, so will also work for a matrix.\n            // Will use the access chain's 'component' for variable index into a vector.\n\n            // This adapter is building access chains left to right.\n            // Set up the access chain to the left.\n            node->getLeft()->traverse(this);\n\n            // save it so that computing the right side doesn't trash it\n            spv::Builder::AccessChain partial = builder.getAccessChain();\n\n            // compute the next index in the chain\n            builder.clearAccessChain();\n            node->getRight()->traverse(this);\n            spv::Id index = accessChainLoad(node->getRight()->getType());\n\n            addIndirectionIndexCapabilities(node->getLeft()->getType(), node->getRight()->getType());\n\n            // restore the saved access chain\n            builder.setAccessChain(partial);\n\n            // Only if index is nonUniform should we propagate nonUniform into access chain\n            spv::Builder::AccessChain::CoherentFlags index_flags = TranslateCoherent(node->getRight()->getType());\n            spv::Builder::AccessChain::CoherentFlags coherent_flags = TranslateCoherent(node->getLeft()->getType());\n            coherent_flags.nonUniform = index_flags.nonUniform;\n\n            if (! node->getLeft()->getType().isArray() && node->getLeft()->getType().isVector()) {\n                int dummySize;\n                builder.accessChainPushComponent(\n                    index, convertGlslangToSpvType(node->getLeft()->getType()), coherent_flags,\n                                                glslangIntermediate->getBaseAlignmentScalar(node->getLeft()->getType(),\n                                                dummySize));\n            } else\n                builder.accessChainPush(index, coherent_flags,\n                                        node->getLeft()->getType().getBufferReferenceAlignment());\n        }\n        return false;\n    case glslang::EOpVectorSwizzle:\n        {\n            node->getLeft()->traverse(this);\n            std::vector<unsigned> swizzle;\n            convertSwizzle(*node->getRight()->getAsAggregate(), swizzle);\n            int dummySize;\n            builder.accessChainPushSwizzle(swizzle, convertGlslangToSpvType(node->getLeft()->getType()),\n                                           TranslateCoherent(node->getLeft()->getType()),\n                                           glslangIntermediate->getBaseAlignmentScalar(node->getLeft()->getType(),\n                                               dummySize));\n        }\n        return false;\n    case glslang::EOpMatrixSwizzle:\n        logger->missingFunctionality(\"matrix swizzle\");\n        return true;\n    case glslang::EOpLogicalOr:\n    case glslang::EOpLogicalAnd:\n        {\n\n            // These may require short circuiting, but can sometimes be done as straight\n            // binary operations.  The right operand must be short circuited if it has\n            // side effects, and should probably be if it is complex.\n            if (isTrivial(node->getRight()->getAsTyped()))\n                break; // handle below as a normal binary operation\n            // otherwise, we need to do dynamic short circuiting on the right operand\n            spv::Id result = createShortCircuit(node->getOp(), *node->getLeft()->getAsTyped(),\n                *node->getRight()->getAsTyped());\n            builder.clearAccessChain();\n            builder.setAccessChainRValue(result);\n        }\n        return false;\n    default:\n        break;\n    }\n\n    // Assume generic binary op...\n\n    // get right operand\n    builder.clearAccessChain();\n    node->getLeft()->traverse(this);\n    spv::Id left = accessChainLoad(node->getLeft()->getType());\n\n    // get left operand\n    builder.clearAccessChain();\n    node->getRight()->traverse(this);\n    spv::Id right = accessChainLoad(node->getRight()->getType());\n\n    // get result\n    OpDecorations decorations = { TranslatePrecisionDecoration(node->getOperationPrecision()),\n                                  TranslateNoContractionDecoration(node->getType().getQualifier()),\n                                  TranslateNonUniformDecoration(node->getType().getQualifier()) };\n    spv::Id result = createBinaryOperation(node->getOp(), decorations,\n                                           convertGlslangToSpvType(node->getType()), left, right,\n                                           node->getLeft()->getType().getBasicType());\n\n    builder.clearAccessChain();\n    if (! result) {\n        logger->missingFunctionality(\"unknown glslang binary operation\");\n        return true;  // pick up a child as the place-holder result\n    } else {\n        builder.setAccessChainRValue(result);\n        return false;\n    }\n}\n\nspv::Id TGlslangToSpvTraverser::convertLoadedBoolInUniformToUint(const glslang::TType& type,\n                                                                 spv::Id nominalTypeId,\n                                                                 spv::Id loadedId)\n{\n    if (builder.isScalarType(nominalTypeId)) {\n        // Conversion for bool\n        spv::Id boolType = builder.makeBoolType();\n        if (nominalTypeId != boolType)\n            return builder.createBinOp(spv::Op::OpINotEqual, boolType, loadedId, builder.makeUintConstant(0));\n    } else if (builder.isVectorType(nominalTypeId)) {\n        // Conversion for bvec\n        int vecSize = builder.getNumTypeComponents(nominalTypeId);\n        spv::Id bvecType = builder.makeVectorType(builder.makeBoolType(), vecSize);\n        if (nominalTypeId != bvecType)\n            loadedId = builder.createBinOp(spv::Op::OpINotEqual, bvecType, loadedId,\n                makeSmearedConstant(builder.makeUintConstant(0), vecSize));\n    } else if (builder.isArrayType(nominalTypeId)) {\n        // Conversion for bool array\n        spv::Id boolArrayTypeId = convertGlslangToSpvType(type);\n        if (nominalTypeId != boolArrayTypeId)\n        {\n            // Use OpCopyLogical from SPIR-V 1.4 if available.\n            if (glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_4)\n                return builder.createUnaryOp(spv::Op::OpCopyLogical, boolArrayTypeId, loadedId);\n\n            glslang::TType glslangElementType(type, 0);\n            spv::Id elementNominalTypeId = builder.getContainedTypeId(nominalTypeId);\n            std::vector<spv::Id> constituents;\n            for (int index = 0; index < type.getOuterArraySize(); ++index) {\n                // get the element\n                spv::Id elementValue = builder.createCompositeExtract(loadedId, elementNominalTypeId, index);\n\n                // recursively convert it\n                spv::Id elementConvertedValue = convertLoadedBoolInUniformToUint(glslangElementType, elementNominalTypeId, elementValue);\n                constituents.push_back(elementConvertedValue);\n            }\n            return builder.createCompositeConstruct(boolArrayTypeId, constituents);\n        }\n    }\n\n    return loadedId;\n}\n\n// Figure out what, if any, type changes are needed when accessing a specific built-in.\n// Returns <the type SPIR-V requires for declarion, the type to translate to on use>.\n// Also see comment for 'forceType', regarding tracking SPIR-V-required types.\nstd::pair<spv::Id, spv::Id> TGlslangToSpvTraverser::getForcedType(glslang::TBuiltInVariable glslangBuiltIn,\n    const glslang::TType& glslangType)\n{\n    switch(glslangBuiltIn)\n    {\n        case glslang::EbvSubGroupEqMask:\n        case glslang::EbvSubGroupGeMask:\n        case glslang::EbvSubGroupGtMask:\n        case glslang::EbvSubGroupLeMask:\n        case glslang::EbvSubGroupLtMask: {\n            // these require changing a 64-bit scaler -> a vector of 32-bit components\n            if (glslangType.isVector())\n                break;\n            spv::Id ivec4_type = builder.makeVectorType(builder.makeUintType(32), 4);\n            spv::Id uint64_type = builder.makeUintType(64);\n            std::pair<spv::Id, spv::Id> ret(ivec4_type, uint64_type);\n            return ret;\n        }\n        // There are no SPIR-V builtins defined for these and map onto original non-transposed\n        // builtins. During visitBinary we insert a transpose\n        case glslang::EbvWorldToObject3x4:\n        case glslang::EbvObjectToWorld3x4: {\n            spv::Id mat43 = builder.makeMatrixType(builder.makeFloatType(32), 4, 3);\n            spv::Id mat34 = builder.makeMatrixType(builder.makeFloatType(32), 3, 4);\n            std::pair<spv::Id, spv::Id> ret(mat43, mat34);\n            return ret;\n        }\n        default:\n            break;\n    }\n\n    std::pair<spv::Id, spv::Id> ret(spv::NoType, spv::NoType);\n    return ret;\n}\n\n// For an object previously identified (see getForcedType() and forceType)\n// as needing type translations, do the translation needed for a load, turning\n// an L-value into in R-value.\nspv::Id TGlslangToSpvTraverser::translateForcedType(spv::Id object)\n{\n    const auto forceIt = forceType.find(object);\n    if (forceIt == forceType.end())\n        return object;\n\n    spv::Id desiredTypeId = forceIt->second;\n    spv::Id objectTypeId = builder.getTypeId(object);\n    assert(builder.isPointerType(objectTypeId));\n    objectTypeId = builder.getContainedTypeId(objectTypeId);\n    if (builder.isVectorType(objectTypeId) &&\n        builder.getScalarTypeWidth(builder.getContainedTypeId(objectTypeId)) == 32) {\n        if (builder.getScalarTypeWidth(desiredTypeId) == 64) {\n            // handle 32-bit v.xy* -> 64-bit\n            builder.clearAccessChain();\n            builder.setAccessChainLValue(object);\n            object = builder.accessChainLoad(spv::NoPrecision, spv::Decoration::Max, spv::Decoration::Max, objectTypeId);\n            std::vector<spv::Id> components;\n            components.push_back(builder.createCompositeExtract(object, builder.getContainedTypeId(objectTypeId), 0));\n            components.push_back(builder.createCompositeExtract(object, builder.getContainedTypeId(objectTypeId), 1));\n\n            spv::Id vecType = builder.makeVectorType(builder.getContainedTypeId(objectTypeId), 2);\n            return builder.createUnaryOp(spv::Op::OpBitcast, desiredTypeId,\n                                         builder.createCompositeConstruct(vecType, components));\n        } else {\n            logger->missingFunctionality(\"forcing 32-bit vector type to non 64-bit scalar\");\n        }\n    } else if (builder.isMatrixType(objectTypeId)) {\n            // There are no SPIR-V builtins defined for 3x4 variants of ObjectToWorld/WorldToObject\n            // and we insert a transpose after loading the original non-transposed builtins\n            builder.clearAccessChain();\n            builder.setAccessChainLValue(object);\n            object = builder.accessChainLoad(spv::NoPrecision, spv::Decoration::Max, spv::Decoration::Max, objectTypeId);\n            return builder.createUnaryOp(spv::Op::OpTranspose, desiredTypeId, object);\n\n    } else  {\n        logger->missingFunctionality(\"forcing non 32-bit vector type\");\n    }\n\n    return object;\n}\n\nbool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TIntermUnary* node)\n{\n    builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename());\n\n    SpecConstantOpModeGuard spec_constant_op_mode_setter(&builder);\n    if (node->getType().getQualifier().isSpecConstant())\n        spec_constant_op_mode_setter.turnOnSpecConstantOpMode();\n\n    spv::Id result = spv::NoResult;\n\n    // try texturing first\n    result = createImageTextureFunctionCall(node);\n    if (result != spv::NoResult) {\n        builder.clearAccessChain();\n        builder.setAccessChainRValue(result);\n\n        return false; // done with this node\n    }\n\n    // Non-texturing.\n\n    if (node->getOp() == glslang::EOpArrayLength) {\n        // Quite special; won't want to evaluate the operand.\n\n        // Currently, the front-end does not allow .length() on an array until it is sized,\n        // except for the last block membeor of an SSBO.\n        // TODO: If this changes, link-time sized arrays might show up here, and need their\n        // size extracted.\n\n        // Normal .length() would have been constant folded by the front-end.\n        // So, this has to be block.lastMember.length().\n        // SPV wants \"block\" and member number as the operands, go get them.\n\n        spv::Id length;\n        if (node->getOperand()->getType().isCoopMat()) {\n            spv::Id typeId = convertGlslangToSpvType(node->getOperand()->getType());\n            assert(builder.isCooperativeMatrixType(typeId));\n\n            if (node->getOperand()->getType().isCoopMatKHR()) {\n                length = builder.createCooperativeMatrixLengthKHR(typeId);\n            } else {\n                spec_constant_op_mode_setter.turnOnSpecConstantOpMode();\n                length = builder.createCooperativeMatrixLengthNV(typeId);\n            }\n        } else if (node->getOperand()->getType().isCoopVecNV()) {\n            spv::Id typeId = convertGlslangToSpvType(node->getOperand()->getType());\n            length = builder.getCooperativeVectorNumComponents(typeId);\n        } else {\n            glslang::TIntermTyped* block = node->getOperand()->getAsBinaryNode()->getLeft();\n            block->traverse(this);\n            unsigned int member = node->getOperand()->getAsBinaryNode()->getRight()->getAsConstantUnion()\n                ->getConstArray()[0].getUConst();\n            length = builder.createArrayLength(builder.accessChainGetLValue(), member);\n        }\n\n        // GLSL semantics say the result of .length() is an int, while SPIR-V says\n        // signedness must be 0. So, convert from SPIR-V unsigned back to GLSL's\n        // AST expectation of a signed result.\n        if (glslangIntermediate->getSource() == glslang::EShSourceGlsl) {\n            if (builder.isInSpecConstCodeGenMode()) {\n                length = builder.createBinOp(spv::Op::OpIAdd, builder.makeIntType(32), length, builder.makeIntConstant(0));\n            } else {\n                length = builder.createUnaryOp(spv::Op::OpBitcast, builder.makeIntType(32), length);\n            }\n        }\n\n        builder.clearAccessChain();\n        builder.setAccessChainRValue(length);\n\n        return false;\n    }\n\n    // Force variable declaration - Debug Mode Only\n    if (node->getOp() == glslang::EOpDeclare) {\n        builder.clearAccessChain();\n        node->getOperand()->traverse(this);\n        builder.clearAccessChain();\n        return false;\n    }\n\n    // Start by evaluating the operand\n\n    // Does it need a swizzle inversion?  If so, evaluation is inverted;\n    // operate first on the swizzle base, then apply the swizzle.\n    spv::Id invertedType = spv::NoType;\n    auto resultType = [&invertedType, &node, this](){ return invertedType != spv::NoType ?\n        invertedType : convertGlslangToSpvType(node->getType()); };\n    if (node->getOp() == glslang::EOpInterpolateAtCentroid)\n        invertedType = getInvertedSwizzleType(*node->getOperand());\n\n    builder.clearAccessChain();\n    TIntermNode *operandNode;\n    if (invertedType != spv::NoType)\n        operandNode = node->getOperand()->getAsBinaryNode()->getLeft();\n    else\n        operandNode = node->getOperand();\n\n    operandNode->traverse(this);\n\n    spv::Id operand = spv::NoResult;\n\n    spv::Builder::AccessChain::CoherentFlags lvalueCoherentFlags;\n\n    const auto hitObjectOpsWithLvalue = [](glslang::TOperator op) {\n        switch(op) {\n            case glslang::EOpReorderThreadNV:\n            case glslang::EOpHitObjectGetCurrentTimeNV:\n            case glslang::EOpHitObjectGetHitKindNV:\n            case glslang::EOpHitObjectGetPrimitiveIndexNV:\n            case glslang::EOpHitObjectGetGeometryIndexNV:\n            case glslang::EOpHitObjectGetInstanceIdNV:\n            case glslang::EOpHitObjectGetInstanceCustomIndexNV:\n            case glslang::EOpHitObjectGetObjectRayDirectionNV:\n            case glslang::EOpHitObjectGetObjectRayOriginNV:\n            case glslang::EOpHitObjectGetWorldRayDirectionNV:\n            case glslang::EOpHitObjectGetWorldRayOriginNV:\n            case glslang::EOpHitObjectGetWorldToObjectNV:\n            case glslang::EOpHitObjectGetObjectToWorldNV:\n            case glslang::EOpHitObjectGetRayTMaxNV:\n            case glslang::EOpHitObjectGetRayTMinNV:\n            case glslang::EOpHitObjectIsEmptyNV:\n            case glslang::EOpHitObjectIsHitNV:\n            case glslang::EOpHitObjectIsMissNV:\n            case glslang::EOpHitObjectRecordEmptyNV:\n            case glslang::EOpHitObjectGetShaderBindingTableRecordIndexNV:\n            case glslang::EOpHitObjectGetShaderRecordBufferHandleNV:\n            case glslang::EOpHitObjectGetClusterIdNV:\n            case glslang::EOpHitObjectGetSpherePositionNV:\n            case glslang::EOpHitObjectGetSphereRadiusNV:\n            case glslang::EOpHitObjectIsSphereHitNV:\n            case glslang::EOpHitObjectIsLSSHitNV:\n                return true;\n            default:\n                return false;\n        }\n    };\n\n    if (node->getOp() == glslang::EOpAtomicCounterIncrement ||\n        node->getOp() == glslang::EOpAtomicCounterDecrement ||\n        node->getOp() == glslang::EOpAtomicCounter          ||\n        (node->getOp() == glslang::EOpInterpolateAtCentroid &&\n          glslangIntermediate->getSource() != glslang::EShSourceHlsl)  ||\n        node->getOp() == glslang::EOpRayQueryProceed        ||\n        node->getOp() == glslang::EOpRayQueryGetRayTMin     ||\n        node->getOp() == glslang::EOpRayQueryGetRayFlags    ||\n        node->getOp() == glslang::EOpRayQueryGetWorldRayOrigin ||\n        node->getOp() == glslang::EOpRayQueryGetWorldRayDirection ||\n        node->getOp() == glslang::EOpRayQueryGetIntersectionCandidateAABBOpaque ||\n        node->getOp() == glslang::EOpRayQueryTerminate ||\n        node->getOp() == glslang::EOpRayQueryConfirmIntersection ||\n        (node->getOp() == glslang::EOpSpirvInst && operandNode->getAsTyped()->getQualifier().isSpirvByReference()) ||\n        hitObjectOpsWithLvalue(node->getOp())) {\n        operand = builder.accessChainGetLValue(); // Special case l-value operands\n        lvalueCoherentFlags = builder.getAccessChain().coherentFlags;\n        lvalueCoherentFlags |= TranslateCoherent(operandNode->getAsTyped()->getType());\n    } else if (operandNode->getAsTyped()->getQualifier().isSpirvLiteral()) {\n        // Will be translated to a literal value, make a placeholder here\n        operand = spv::NoResult;\n    } else {\n        operand = accessChainLoad(node->getOperand()->getType());\n    }\n\n    OpDecorations decorations = { TranslatePrecisionDecoration(node->getOperationPrecision()),\n                                  TranslateNoContractionDecoration(node->getType().getQualifier()),\n                                  TranslateNonUniformDecoration(node->getType().getQualifier()) };\n\n    // it could be a conversion\n    if (! result) {\n        result = createConversion(node->getOp(), decorations, resultType(), operand,\n            node->getType().getBasicType(), node->getOperand()->getBasicType());\n        if (result) {\n            if (node->getType().isCoopMatKHR() && node->getOperand()->getAsTyped()->getType().isCoopMatKHR() &&\n                !node->getAsTyped()->getType().sameCoopMatUse(node->getOperand()->getAsTyped()->getType())) {\n                // Conversions that change use need CapabilityCooperativeMatrixConversionsNV\n                builder.addCapability(spv::Capability::CooperativeMatrixConversionsNV);\n                builder.addExtension(spv::E_SPV_NV_cooperative_matrix2);\n            }\n        }\n    }\n\n    // if not, then possibly an operation\n    if (! result)\n        result = createUnaryOperation(node->getOp(), decorations, resultType(), operand,\n            node->getOperand()->getBasicType(), lvalueCoherentFlags, node->getType());\n\n    // it could be attached to a SPIR-V intruction\n    if (!result) {\n        if (node->getOp() == glslang::EOpSpirvInst) {\n            const auto& spirvInst = node->getSpirvInstruction();\n            if (spirvInst.set == \"\") {\n                spv::IdImmediate idImmOp = {true, operand};\n                if (operandNode->getAsTyped()->getQualifier().isSpirvLiteral()) {\n                    // Translate the constant to a literal value\n                    std::vector<unsigned> literals;\n                    glslang::TVector<const glslang::TIntermConstantUnion*> constants;\n                    constants.push_back(operandNode->getAsConstantUnion());\n                    TranslateLiterals(constants, literals);\n                    idImmOp = {false, literals[0]};\n                }\n\n                if (node->getBasicType() == glslang::EbtVoid)\n                    builder.createNoResultOp(static_cast<spv::Op>(spirvInst.id), {idImmOp});\n                else\n                    result = builder.createOp(static_cast<spv::Op>(spirvInst.id), resultType(), {idImmOp});\n            } else {\n                result = builder.createBuiltinCall(\n                    resultType(), spirvInst.set == \"GLSL.std.450\" ? stdBuiltins : getExtBuiltins(spirvInst.set.c_str()),\n                    spirvInst.id, {operand});\n            }\n\n            if (node->getBasicType() == glslang::EbtVoid)\n                return false; // done with this node\n        }\n    }\n\n    if (result) {\n        if (invertedType) {\n            result = createInvertedSwizzle(decorations.precision, *node->getOperand(), result);\n            decorations.addNonUniform(builder, result);\n        }\n\n        builder.clearAccessChain();\n        builder.setAccessChainRValue(result);\n\n        return false; // done with this node\n    }\n\n    // it must be a special case, check...\n    switch (node->getOp()) {\n    case glslang::EOpPostIncrement:\n    case glslang::EOpPostDecrement:\n    case glslang::EOpPreIncrement:\n    case glslang::EOpPreDecrement:\n        {\n            // we need the integer value \"1\" or the floating point \"1.0\" to add/subtract\n            spv::Id one = 0;\n            if (node->getBasicType() == glslang::EbtFloat)\n                one = builder.makeFloatConstant(1.0F);\n            else if (node->getBasicType() == glslang::EbtDouble)\n                one = builder.makeDoubleConstant(1.0);\n            else if (node->getBasicType() == glslang::EbtFloat16)\n                one = builder.makeFloat16Constant(1.0F);\n            else if (node->getBasicType() == glslang::EbtBFloat16)\n                one = builder.makeBFloat16Constant(1.0F);\n            else if (node->getBasicType() == glslang::EbtFloatE5M2)\n                one = builder.makeFloatE5M2Constant(1.0F);\n            else if (node->getBasicType() == glslang::EbtFloatE4M3)\n                one = builder.makeFloatE4M3Constant(1.0F);\n            else if (node->getBasicType() == glslang::EbtInt8  || node->getBasicType() == glslang::EbtUint8)\n                one = builder.makeInt8Constant(1);\n            else if (node->getBasicType() == glslang::EbtInt16 || node->getBasicType() == glslang::EbtUint16)\n                one = builder.makeInt16Constant(1);\n            else if (node->getBasicType() == glslang::EbtInt64 || node->getBasicType() == glslang::EbtUint64)\n                one = builder.makeInt64Constant(1);\n            else\n                one = builder.makeIntConstant(1);\n            glslang::TOperator op;\n            if (node->getOp() == glslang::EOpPreIncrement ||\n                node->getOp() == glslang::EOpPostIncrement)\n                op = glslang::EOpAdd;\n            else\n                op = glslang::EOpSub;\n\n            spv::Id result = createBinaryOperation(op, decorations,\n                                                   convertGlslangToSpvType(node->getType()), operand, one,\n                                                   node->getType().getBasicType());\n            assert(result != spv::NoResult);\n\n            // The result of operation is always stored, but conditionally the\n            // consumed result.  The consumed result is always an r-value.\n            builder.accessChainStore(result,\n                                     TranslateNonUniformDecoration(builder.getAccessChain().coherentFlags));\n            builder.clearAccessChain();\n            if (node->getOp() == glslang::EOpPreIncrement ||\n                node->getOp() == glslang::EOpPreDecrement)\n                builder.setAccessChainRValue(result);\n            else\n                builder.setAccessChainRValue(operand);\n        }\n\n        return false;\n\n    case glslang::EOpAssumeEXT:\n        builder.addCapability(spv::Capability::ExpectAssumeKHR);\n        builder.addExtension(spv::E_SPV_KHR_expect_assume);\n        builder.createNoResultOp(spv::Op::OpAssumeTrueKHR, operand);\n        return false;\n    case glslang::EOpEmitStreamVertex:\n        builder.createNoResultOp(spv::Op::OpEmitStreamVertex, operand);\n        return false;\n    case glslang::EOpEndStreamPrimitive:\n        builder.createNoResultOp(spv::Op::OpEndStreamPrimitive, operand);\n        return false;\n    case glslang::EOpRayQueryTerminate:\n        builder.createNoResultOp(spv::Op::OpRayQueryTerminateKHR, operand);\n        return false;\n    case glslang::EOpRayQueryConfirmIntersection:\n        builder.createNoResultOp(spv::Op::OpRayQueryConfirmIntersectionKHR, operand);\n        return false;\n    case glslang::EOpReorderThreadNV:\n        builder.createNoResultOp(spv::Op::OpReorderThreadWithHitObjectNV, operand);\n        return false;\n    case glslang::EOpHitObjectRecordEmptyNV:\n        builder.createNoResultOp(spv::Op::OpHitObjectRecordEmptyNV, operand);\n        return false;\n\n    case glslang::EOpCreateTensorLayoutNV:\n        result = builder.createOp(spv::Op::OpCreateTensorLayoutNV, resultType(), std::vector<spv::Id>{});\n        builder.clearAccessChain();\n        builder.setAccessChainRValue(result);\n        return false;\n\n    case glslang::EOpCreateTensorViewNV:\n        result = builder.createOp(spv::Op::OpCreateTensorViewNV, resultType(), std::vector<spv::Id>{});\n        builder.clearAccessChain();\n        builder.setAccessChainRValue(result);\n        return false;\n\n    default:\n        logger->missingFunctionality(\"unknown glslang unary\");\n        return true;  // pick up operand as placeholder result\n    }\n}\n\n// Construct a composite object, recursively copying members if their types don't match\nspv::Id TGlslangToSpvTraverser::createCompositeConstruct(spv::Id resultTypeId, std::vector<spv::Id> constituents)\n{\n    for (int c = 0; c < (int)constituents.size(); ++c) {\n        spv::Id& constituent = constituents[c];\n        spv::Id lType = builder.getContainedTypeId(resultTypeId, c);\n        spv::Id rType = builder.getTypeId(constituent);\n        if (lType != rType) {\n            if (glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_4) {\n                constituent = builder.createUnaryOp(spv::Op::OpCopyLogical, lType, constituent);\n            } else if (builder.isStructType(rType)) {\n                std::vector<spv::Id> rTypeConstituents;\n                int numrTypeConstituents = builder.getNumTypeConstituents(rType);\n                for (int i = 0; i < numrTypeConstituents; ++i) {\n                    rTypeConstituents.push_back(builder.createCompositeExtract(constituent,\n                        builder.getContainedTypeId(rType, i), i));\n                }\n                constituents[c] = createCompositeConstruct(lType, rTypeConstituents);\n            } else {\n                assert(builder.isArrayType(rType));\n                std::vector<spv::Id> rTypeConstituents;\n                int numrTypeConstituents = builder.getNumTypeConstituents(rType);\n\n                spv::Id elementRType = builder.getContainedTypeId(rType);\n                for (int i = 0; i < numrTypeConstituents; ++i) {\n                    rTypeConstituents.push_back(builder.createCompositeExtract(constituent, elementRType, i));\n                }\n                constituents[c] = createCompositeConstruct(lType, rTypeConstituents);\n            }\n        }\n    }\n    return builder.createCompositeConstruct(resultTypeId, constituents);\n}\n\nbool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TIntermAggregate* node)\n{\n    SpecConstantOpModeGuard spec_constant_op_mode_setter(&builder);\n    if (node->getType().getQualifier().isSpecConstant())\n        spec_constant_op_mode_setter.turnOnSpecConstantOpMode();\n\n    spv::Id result = spv::NoResult;\n    spv::Id invertedType = spv::NoType;                     // to use to override the natural type of the node\n    std::vector<spv::Builder::AccessChain> complexLvalues;  // for holding swizzling l-values too complex for\n                                                            // SPIR-V, for an out parameter\n    std::vector<spv::Id> temporaryLvalues;                  // temporaries to pass, as proxies for complexLValues\n\n    auto resultType = [&invertedType, &node, this](){\n        if (invertedType != spv::NoType) {\n            return invertedType;\n        } else {\n            auto ret = convertGlslangToSpvType(node->getType());\n            // convertGlslangToSpvType may clobber the debug location, reset it\n            builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename());\n            return ret;\n        }\n    };\n\n    // try texturing\n    result = createImageTextureFunctionCall(node);\n    if (result != spv::NoResult) {\n        builder.clearAccessChain();\n        builder.setAccessChainRValue(result);\n\n        return false;\n    } else if (node->getOp() == glslang::EOpImageStore ||\n        node->getOp() == glslang::EOpImageStoreLod ||\n        node->getOp() == glslang::EOpImageAtomicStore) {\n        // \"imageStore\" is a special case, which has no result\n        return false;\n    }\n\n    glslang::TOperator binOp = glslang::EOpNull;\n    bool reduceComparison = true;\n    bool isMatrix = false;\n    bool noReturnValue = false;\n    bool atomic = false;\n\n    spv::Builder::AccessChain::CoherentFlags lvalueCoherentFlags;\n\n    assert(node->getOp());\n\n    spv::Decoration precision = TranslatePrecisionDecoration(node->getOperationPrecision());\n\n    switch (node->getOp()) {\n    case glslang::EOpScope:\n    case glslang::EOpSequence:\n    {\n        if (visit == glslang::EvPreVisit) {\n            ++sequenceDepth;\n            if (sequenceDepth == 1) {\n                // If this is the parent node of all the functions, we want to see them\n                // early, so all call points have actual SPIR-V functions to reference.\n                // In all cases, still let the traverser visit the children for us.\n                makeFunctions(node->getAsAggregate()->getSequence());\n\n                // Global initializers is specific to the shader entry point, which does not exist in compile-only mode\n                if (!options.compileOnly) {\n                    // Also, we want all globals initializers to go into the beginning of the entry point, before\n                    // anything else gets there, so visit out of order, doing them all now.\n                    makeGlobalInitializers(node->getAsAggregate()->getSequence());\n                }\n\n                //Pre process linker objects for ray tracing stages\n                if (glslangIntermediate->isRayTracingStage())\n                  collectRayTracingLinkerObjects();\n\n                // Initializers are done, don't want to visit again, but functions and link objects need to be processed,\n                // so do them manually.\n                visitFunctions(node->getAsAggregate()->getSequence());\n\n                return false;\n            } else {\n                if (node->getOp() == glslang::EOpScope) {\n                    auto loc = node->getLoc();\n                    builder.enterLexicalBlock(loc.line, loc.column);\n                }\n            }\n        } else {\n            if (sequenceDepth > 1 && node->getOp() == glslang::EOpScope)\n                builder.leaveLexicalBlock();\n            --sequenceDepth;\n        }\n\n        return true;\n    }\n    case glslang::EOpLinkerObjects:\n    {\n        if (visit == glslang::EvPreVisit)\n            linkageOnly = true;\n        else\n            linkageOnly = false;\n\n        return true;\n    }\n    case glslang::EOpComma:\n    {\n        // processing from left to right naturally leaves the right-most\n        // lying around in the access chain\n        glslang::TIntermSequence& glslangOperands = node->getSequence();\n        for (int i = 0; i < (int)glslangOperands.size(); ++i)\n            glslangOperands[i]->traverse(this);\n\n        return false;\n    }\n    case glslang::EOpFunction:\n        if (visit == glslang::EvPreVisit) {\n            if (options.generateDebugInfo) {\n                builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename());\n            }\n            if (isShaderEntryPoint(node)) {\n                inEntryPoint = true;\n                builder.setBuildPoint(shaderEntry->getLastBlock());\n                builder.enterFunction(shaderEntry);\n                currentFunction = shaderEntry;\n            } else {\n                handleFunctionEntry(node);\n            }\n            if (options.generateDebugInfo && !options.emitNonSemanticShaderDebugInfo) {\n                const auto& loc = node->getLoc();\n                const char* sourceFileName = loc.getFilename();\n                spv::Id sourceFileId = sourceFileName ? builder.getStringId(sourceFileName) : builder.getMainFileId();\n                currentFunction->setDebugLineInfo(sourceFileId, loc.line, loc.column);\n            }\n        } else {\n            if (options.generateDebugInfo) {\n                if (glslangIntermediate->getSource() == glslang::EShSourceGlsl && node->getSequence().size() > 1) {\n                    auto endLoc = node->getSequence()[1]->getAsAggregate()->getEndLoc();\n                    builder.setDebugSourceLocation(endLoc.line, endLoc.getFilename());\n                }\n            }\n            if (inEntryPoint)\n                entryPointTerminated = true;\n            builder.leaveFunction();\n            inEntryPoint = false;\n        }\n\n        return true;\n    case glslang::EOpParameters:\n        // Parameters will have been consumed by EOpFunction processing, but not\n        // the body, so we still visited the function node's children, making this\n        // child redundant.\n        return false;\n    case glslang::EOpFunctionCall:\n    {\n        builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename());\n        if (node->isUserDefined())\n            result = handleUserFunctionCall(node);\n        if (result) {\n            builder.clearAccessChain();\n            builder.setAccessChainRValue(result);\n        } else\n            logger->missingFunctionality(\"missing user function; linker needs to catch that\");\n\n        return false;\n    }\n    case glslang::EOpConstructMat2x2:\n    case glslang::EOpConstructMat2x3:\n    case glslang::EOpConstructMat2x4:\n    case glslang::EOpConstructMat3x2:\n    case glslang::EOpConstructMat3x3:\n    case glslang::EOpConstructMat3x4:\n    case glslang::EOpConstructMat4x2:\n    case glslang::EOpConstructMat4x3:\n    case glslang::EOpConstructMat4x4:\n    case glslang::EOpConstructDMat2x2:\n    case glslang::EOpConstructDMat2x3:\n    case glslang::EOpConstructDMat2x4:\n    case glslang::EOpConstructDMat3x2:\n    case glslang::EOpConstructDMat3x3:\n    case glslang::EOpConstructDMat3x4:\n    case glslang::EOpConstructDMat4x2:\n    case glslang::EOpConstructDMat4x3:\n    case glslang::EOpConstructDMat4x4:\n    case glslang::EOpConstructIMat2x2:\n    case glslang::EOpConstructIMat2x3:\n    case glslang::EOpConstructIMat2x4:\n    case glslang::EOpConstructIMat3x2:\n    case glslang::EOpConstructIMat3x3:\n    case glslang::EOpConstructIMat3x4:\n    case glslang::EOpConstructIMat4x2:\n    case glslang::EOpConstructIMat4x3:\n    case glslang::EOpConstructIMat4x4:\n    case glslang::EOpConstructUMat2x2:\n    case glslang::EOpConstructUMat2x3:\n    case glslang::EOpConstructUMat2x4:\n    case glslang::EOpConstructUMat3x2:\n    case glslang::EOpConstructUMat3x3:\n    case glslang::EOpConstructUMat3x4:\n    case glslang::EOpConstructUMat4x2:\n    case glslang::EOpConstructUMat4x3:\n    case glslang::EOpConstructUMat4x4:\n    case glslang::EOpConstructBMat2x2:\n    case glslang::EOpConstructBMat2x3:\n    case glslang::EOpConstructBMat2x4:\n    case glslang::EOpConstructBMat3x2:\n    case glslang::EOpConstructBMat3x3:\n    case glslang::EOpConstructBMat3x4:\n    case glslang::EOpConstructBMat4x2:\n    case glslang::EOpConstructBMat4x3:\n    case glslang::EOpConstructBMat4x4:\n    case glslang::EOpConstructF16Mat2x2:\n    case glslang::EOpConstructF16Mat2x3:\n    case glslang::EOpConstructF16Mat2x4:\n    case glslang::EOpConstructF16Mat3x2:\n    case glslang::EOpConstructF16Mat3x3:\n    case glslang::EOpConstructF16Mat3x4:\n    case glslang::EOpConstructF16Mat4x2:\n    case glslang::EOpConstructF16Mat4x3:\n    case glslang::EOpConstructF16Mat4x4:\n        isMatrix = true;\n        [[fallthrough]];\n    case glslang::EOpConstructFloat:\n    case glslang::EOpConstructVec2:\n    case glslang::EOpConstructVec3:\n    case glslang::EOpConstructVec4:\n    case glslang::EOpConstructDouble:\n    case glslang::EOpConstructDVec2:\n    case glslang::EOpConstructDVec3:\n    case glslang::EOpConstructDVec4:\n    case glslang::EOpConstructFloat16:\n    case glslang::EOpConstructF16Vec2:\n    case glslang::EOpConstructF16Vec3:\n    case glslang::EOpConstructF16Vec4:\n    case glslang::EOpConstructBFloat16:\n    case glslang::EOpConstructBF16Vec2:\n    case glslang::EOpConstructBF16Vec3:\n    case glslang::EOpConstructBF16Vec4:\n    case glslang::EOpConstructFloatE5M2:\n    case glslang::EOpConstructFloatE5M2Vec2:\n    case glslang::EOpConstructFloatE5M2Vec3:\n    case glslang::EOpConstructFloatE5M2Vec4:\n    case glslang::EOpConstructFloatE4M3:\n    case glslang::EOpConstructFloatE4M3Vec2:\n    case glslang::EOpConstructFloatE4M3Vec3:\n    case glslang::EOpConstructFloatE4M3Vec4:\n    case glslang::EOpConstructBool:\n    case glslang::EOpConstructBVec2:\n    case glslang::EOpConstructBVec3:\n    case glslang::EOpConstructBVec4:\n    case glslang::EOpConstructInt8:\n    case glslang::EOpConstructI8Vec2:\n    case glslang::EOpConstructI8Vec3:\n    case glslang::EOpConstructI8Vec4:\n    case glslang::EOpConstructUint8:\n    case glslang::EOpConstructU8Vec2:\n    case glslang::EOpConstructU8Vec3:\n    case glslang::EOpConstructU8Vec4:\n    case glslang::EOpConstructInt16:\n    case glslang::EOpConstructI16Vec2:\n    case glslang::EOpConstructI16Vec3:\n    case glslang::EOpConstructI16Vec4:\n    case glslang::EOpConstructUint16:\n    case glslang::EOpConstructU16Vec2:\n    case glslang::EOpConstructU16Vec3:\n    case glslang::EOpConstructU16Vec4:\n    case glslang::EOpConstructInt:\n    case glslang::EOpConstructIVec2:\n    case glslang::EOpConstructIVec3:\n    case glslang::EOpConstructIVec4:\n    case glslang::EOpConstructUint:\n    case glslang::EOpConstructUVec2:\n    case glslang::EOpConstructUVec3:\n    case glslang::EOpConstructUVec4:\n    case glslang::EOpConstructInt64:\n    case glslang::EOpConstructI64Vec2:\n    case glslang::EOpConstructI64Vec3:\n    case glslang::EOpConstructI64Vec4:\n    case glslang::EOpConstructUint64:\n    case glslang::EOpConstructU64Vec2:\n    case glslang::EOpConstructU64Vec3:\n    case glslang::EOpConstructU64Vec4:\n    case glslang::EOpConstructStruct:\n    case glslang::EOpConstructTextureSampler:\n    case glslang::EOpConstructReference:\n    case glslang::EOpConstructCooperativeMatrixNV:\n    case glslang::EOpConstructCooperativeMatrixKHR:\n    case glslang::EOpConstructCooperativeVectorNV:\n    case glslang::EOpConstructSaturated:\n    {\n        builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename());\n        std::vector<spv::Id> arguments;\n        translateArguments(*node, arguments, lvalueCoherentFlags);\n        spv::Id constructed;\n        if (node->getOp() == glslang::EOpConstructTextureSampler) {\n            const glslang::TType& texType = node->getSequence()[0]->getAsTyped()->getType();\n            if (glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_6 &&\n                texType.getSampler().isBuffer()) {\n                // SamplerBuffer is not supported in spirv1.6 so\n                // `samplerBuffer(textureBuffer, sampler)` is a no-op\n                // and textureBuffer is the result going forward\n                constructed = arguments[0];\n            } else\n                constructed = builder.createOp(spv::Op::OpSampledImage, resultType(), arguments);\n        } else if (node->getOp() == glslang::EOpConstructCooperativeMatrixKHR &&\n                   node->getType().isCoopMatKHR() && node->getSequence()[0]->getAsTyped()->getType().isCoopMatKHR()) {\n            builder.addCapability(spv::Capability::CooperativeMatrixConversionsNV);\n            builder.addExtension(spv::E_SPV_NV_cooperative_matrix2);\n            constructed = builder.createCooperativeMatrixConversion(resultType(), arguments[0]);\n        } else if (node->getOp() == glslang::EOpConstructCooperativeVectorNV &&\n                   arguments.size() == 1 &&\n                   builder.getTypeId(arguments[0]) == resultType()) {\n            constructed = arguments[0];\n        } else if (node->getOp() == glslang::EOpConstructStruct ||\n                 node->getOp() == glslang::EOpConstructCooperativeMatrixNV ||\n                 node->getOp() == glslang::EOpConstructCooperativeMatrixKHR ||\n                 node->getType().isArray() ||\n                 // Handle constructing coopvec from one component here, to avoid the component\n                 // getting smeared\n                 (node->getOp() == glslang::EOpConstructCooperativeVectorNV && arguments.size() == 1 && builder.isScalar(arguments[0]))) {\n            std::vector<spv::Id> constituents;\n            for (int c = 0; c < (int)arguments.size(); ++c)\n                constituents.push_back(arguments[c]);\n            constructed = createCompositeConstruct(resultType(), constituents);\n        } else if (isMatrix)\n            constructed = builder.createMatrixConstructor(precision, arguments, resultType());\n        else if (node->getOp() == glslang::EOpConstructSaturated) {\n            OpDecorations decorations = { TranslatePrecisionDecoration(node->getOperationPrecision()),\n                                          TranslateNoContractionDecoration(node->getType().getQualifier()),\n                                          TranslateNonUniformDecoration(lvalueCoherentFlags) };\n\n            constructed = createConversion(node->getOp(), decorations, resultType(), arguments[1],\n                                           node->getType().getBasicType(), node->getSequence()[1]->getAsTyped()->getBasicType());\n            builder.addDecoration(constructed, spv::Decoration::SaturatedToLargestFloat8NormalConversionEXT);\n            builder.createStore(constructed, arguments[0]);\n        }\n        else\n            constructed = builder.createConstructor(precision, arguments, resultType());\n\n        if (node->getType().getQualifier().isNonUniform()) {\n            builder.addDecoration(constructed, spv::Decoration::NonUniformEXT);\n        }\n\n        builder.clearAccessChain();\n        builder.setAccessChainRValue(constructed);\n\n        return false;\n    }\n\n    // These six are component-wise compares with component-wise results.\n    // Forward on to createBinaryOperation(), requesting a vector result.\n    case glslang::EOpLessThan:\n    case glslang::EOpGreaterThan:\n    case glslang::EOpLessThanEqual:\n    case glslang::EOpGreaterThanEqual:\n    case glslang::EOpVectorEqual:\n    case glslang::EOpVectorNotEqual:\n    {\n        // Map the operation to a binary\n        binOp = node->getOp();\n        reduceComparison = false;\n        switch (node->getOp()) {\n        case glslang::EOpVectorEqual:     binOp = glslang::EOpVectorEqual;      break;\n        case glslang::EOpVectorNotEqual:  binOp = glslang::EOpVectorNotEqual;   break;\n        default:                          binOp = node->getOp();                break;\n        }\n\n        break;\n    }\n    case glslang::EOpMul:\n        // component-wise matrix multiply\n        binOp = glslang::EOpMul;\n        break;\n    case glslang::EOpOuterProduct:\n        // two vectors multiplied to make a matrix\n        binOp = glslang::EOpOuterProduct;\n        break;\n    case glslang::EOpDot:\n    {\n        // for scalar dot product, use multiply\n        glslang::TIntermSequence& glslangOperands = node->getSequence();\n        if (glslangOperands[0]->getAsTyped()->getVectorSize() == 1)\n            binOp = glslang::EOpMul;\n        break;\n    }\n    case glslang::EOpMod:\n        // when an aggregate, this is the floating-point mod built-in function,\n        // which can be emitted by the one in createBinaryOperation()\n        binOp = glslang::EOpMod;\n        break;\n\n    case glslang::EOpEmitVertex:\n    case glslang::EOpEndPrimitive:\n    case glslang::EOpBarrier:\n    case glslang::EOpMemoryBarrier:\n    case glslang::EOpMemoryBarrierAtomicCounter:\n    case glslang::EOpMemoryBarrierBuffer:\n    case glslang::EOpMemoryBarrierImage:\n    case glslang::EOpMemoryBarrierShared:\n    case glslang::EOpGroupMemoryBarrier:\n    case glslang::EOpDeviceMemoryBarrier:\n    case glslang::EOpAllMemoryBarrierWithGroupSync:\n    case glslang::EOpDeviceMemoryBarrierWithGroupSync:\n    case glslang::EOpWorkgroupMemoryBarrier:\n    case glslang::EOpWorkgroupMemoryBarrierWithGroupSync:\n    case glslang::EOpSubgroupBarrier:\n    case glslang::EOpSubgroupMemoryBarrier:\n    case glslang::EOpSubgroupMemoryBarrierBuffer:\n    case glslang::EOpSubgroupMemoryBarrierImage:\n    case glslang::EOpSubgroupMemoryBarrierShared:\n        noReturnValue = true;\n        // These all have 0 operands and will naturally finish up in the code below for 0 operands\n        break;\n\n    case glslang::EOpAtomicAdd:\n    case glslang::EOpAtomicSubtract:\n    case glslang::EOpAtomicMin:\n    case glslang::EOpAtomicMax:\n    case glslang::EOpAtomicAnd:\n    case glslang::EOpAtomicOr:\n    case glslang::EOpAtomicXor:\n    case glslang::EOpAtomicExchange:\n    case glslang::EOpAtomicCompSwap:\n        atomic = true;\n        break;\n\n    case glslang::EOpAtomicStore:\n        noReturnValue = true;\n        [[fallthrough]];\n    case glslang::EOpAtomicLoad:\n        atomic = true;\n        break;\n\n    case glslang::EOpAtomicCounterAdd:\n    case glslang::EOpAtomicCounterSubtract:\n    case glslang::EOpAtomicCounterMin:\n    case glslang::EOpAtomicCounterMax:\n    case glslang::EOpAtomicCounterAnd:\n    case glslang::EOpAtomicCounterOr:\n    case glslang::EOpAtomicCounterXor:\n    case glslang::EOpAtomicCounterExchange:\n    case glslang::EOpAtomicCounterCompSwap:\n        builder.addExtension(\"SPV_KHR_shader_atomic_counter_ops\");\n        builder.addCapability(spv::Capability::AtomicStorageOps);\n        atomic = true;\n        break;\n\n    case glslang::EOpAbsDifference:\n    case glslang::EOpAddSaturate:\n    case glslang::EOpSubSaturate:\n    case glslang::EOpAverage:\n    case glslang::EOpAverageRounded:\n    case glslang::EOpMul32x16:\n        builder.addCapability(spv::Capability::IntegerFunctions2INTEL);\n        builder.addExtension(\"SPV_INTEL_shader_integer_functions2\");\n        binOp = node->getOp();\n        break;\n\n    case glslang::EOpExpectEXT:\n        builder.addCapability(spv::Capability::ExpectAssumeKHR);\n        builder.addExtension(spv::E_SPV_KHR_expect_assume);\n        binOp = node->getOp();\n        break;\n\n    case glslang::EOpIgnoreIntersectionNV:\n    case glslang::EOpTerminateRayNV:\n    case glslang::EOpTraceNV:\n    case glslang::EOpTraceRayMotionNV:\n    case glslang::EOpTraceKHR:\n    case glslang::EOpExecuteCallableNV:\n    case glslang::EOpExecuteCallableKHR:\n    case glslang::EOpWritePackedPrimitiveIndices4x8NV:\n    case glslang::EOpEmitMeshTasksEXT:\n    case glslang::EOpSetMeshOutputsEXT:\n        noReturnValue = true;\n        break;\n    case glslang::EOpRayQueryInitialize:\n    case glslang::EOpRayQueryTerminate:\n    case glslang::EOpRayQueryGenerateIntersection:\n    case glslang::EOpRayQueryConfirmIntersection:\n        builder.addExtension(\"SPV_KHR_ray_query\");\n        builder.addCapability(spv::Capability::RayQueryKHR);\n        noReturnValue = true;\n        break;\n    case glslang::EOpRayQueryProceed:\n    case glslang::EOpRayQueryGetIntersectionType:\n    case glslang::EOpRayQueryGetRayTMin:\n    case glslang::EOpRayQueryGetRayFlags:\n    case glslang::EOpRayQueryGetIntersectionT:\n    case glslang::EOpRayQueryGetIntersectionInstanceCustomIndex:\n    case glslang::EOpRayQueryGetIntersectionInstanceId:\n    case glslang::EOpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffset:\n    case glslang::EOpRayQueryGetIntersectionGeometryIndex:\n    case glslang::EOpRayQueryGetIntersectionPrimitiveIndex:\n    case glslang::EOpRayQueryGetIntersectionBarycentrics:\n    case glslang::EOpRayQueryGetIntersectionFrontFace:\n    case glslang::EOpRayQueryGetIntersectionCandidateAABBOpaque:\n    case glslang::EOpRayQueryGetIntersectionObjectRayDirection:\n    case glslang::EOpRayQueryGetIntersectionObjectRayOrigin:\n    case glslang::EOpRayQueryGetWorldRayDirection:\n    case glslang::EOpRayQueryGetWorldRayOrigin:\n    case glslang::EOpRayQueryGetIntersectionObjectToWorld:\n    case glslang::EOpRayQueryGetIntersectionWorldToObject:\n        builder.addExtension(\"SPV_KHR_ray_query\");\n        builder.addCapability(spv::Capability::RayQueryKHR);\n        break;\n    case glslang::EOpCooperativeMatrixLoad:\n    case glslang::EOpCooperativeMatrixStore:\n    case glslang::EOpCooperativeMatrixLoadNV:\n    case glslang::EOpCooperativeMatrixStoreNV:\n    case glslang::EOpCooperativeMatrixLoadTensorNV:\n    case glslang::EOpCooperativeMatrixStoreTensorNV:\n    case glslang::EOpCooperativeMatrixReduceNV:\n    case glslang::EOpCooperativeMatrixPerElementOpNV:\n    case glslang::EOpCooperativeMatrixTransposeNV:\n    case glslang::EOpCooperativeVectorMatMulNV:\n    case glslang::EOpCooperativeVectorMatMulAddNV:\n    case glslang::EOpCooperativeVectorLoadNV:\n    case glslang::EOpCooperativeVectorStoreNV:\n    case glslang::EOpCooperativeVectorOuterProductAccumulateNV:\n    case glslang::EOpCooperativeVectorReduceSumAccumulateNV:\n        noReturnValue = true;\n        break;\n    case glslang::EOpBeginInvocationInterlock:\n    case glslang::EOpEndInvocationInterlock:\n        builder.addExtension(spv::E_SPV_EXT_fragment_shader_interlock);\n        noReturnValue = true;\n        break;\n\n    case glslang::EOpHitObjectTraceRayNV:\n    case glslang::EOpHitObjectTraceRayMotionNV:\n    case glslang::EOpHitObjectGetAttributesNV:\n    case glslang::EOpHitObjectExecuteShaderNV:\n    case glslang::EOpHitObjectRecordEmptyNV:\n    case glslang::EOpHitObjectRecordMissNV:\n    case glslang::EOpHitObjectRecordMissMotionNV:\n    case glslang::EOpHitObjectRecordHitNV:\n    case glslang::EOpHitObjectRecordHitMotionNV:\n    case glslang::EOpHitObjectRecordHitWithIndexNV:\n    case glslang::EOpHitObjectRecordHitWithIndexMotionNV:\n    case glslang::EOpReorderThreadNV:\n        noReturnValue = true;\n        [[fallthrough]];\n    case glslang::EOpHitObjectIsEmptyNV:\n    case glslang::EOpHitObjectIsMissNV:\n    case glslang::EOpHitObjectIsHitNV:\n    case glslang::EOpHitObjectGetRayTMinNV:\n    case glslang::EOpHitObjectGetRayTMaxNV:\n    case glslang::EOpHitObjectGetObjectRayOriginNV:\n    case glslang::EOpHitObjectGetObjectRayDirectionNV:\n    case glslang::EOpHitObjectGetWorldRayOriginNV:\n    case glslang::EOpHitObjectGetWorldRayDirectionNV:\n    case glslang::EOpHitObjectGetObjectToWorldNV:\n    case glslang::EOpHitObjectGetWorldToObjectNV:\n    case glslang::EOpHitObjectGetInstanceCustomIndexNV:\n    case glslang::EOpHitObjectGetInstanceIdNV:\n    case glslang::EOpHitObjectGetGeometryIndexNV:\n    case glslang::EOpHitObjectGetPrimitiveIndexNV:\n    case glslang::EOpHitObjectGetHitKindNV:\n    case glslang::EOpHitObjectGetCurrentTimeNV:\n    case glslang::EOpHitObjectGetShaderBindingTableRecordIndexNV:\n    case glslang::EOpHitObjectGetShaderRecordBufferHandleNV:\n        builder.addExtension(spv::E_SPV_NV_shader_invocation_reorder);\n        builder.addCapability(spv::Capability::ShaderInvocationReorderNV);\n        break;\n\n    case glslang::EOpHitObjectGetLSSPositionsNV:\n    case glslang::EOpHitObjectGetLSSRadiiNV:\n        builder.addExtension(spv::E_SPV_NV_linear_swept_spheres);\n        builder.addCapability(spv::Capability::ShaderInvocationReorderNV);\n        builder.addCapability(spv::Capability::RayTracingLinearSweptSpheresGeometryNV);\n        noReturnValue = true;\n        break;\n\n    case glslang::EOpRayQueryGetIntersectionLSSPositionsNV:\n    case glslang::EOpRayQueryGetIntersectionLSSRadiiNV:\n        builder.addExtension(spv::E_SPV_NV_linear_swept_spheres);\n        builder.addCapability(spv::Capability::RayQueryKHR);\n        builder.addCapability(spv::Capability::RayTracingLinearSweptSpheresGeometryNV);\n        noReturnValue = true;\n        break;\n\n    case glslang::EOpRayQueryGetIntersectionSpherePositionNV:\n    case glslang::EOpRayQueryGetIntersectionSphereRadiusNV:\n    case glslang::EOpRayQueryIsSphereHitNV:\n        builder.addExtension(spv::E_SPV_NV_linear_swept_spheres);\n        builder.addCapability(spv::Capability::RayQueryKHR);\n        builder.addCapability(spv::Capability::RayTracingSpheresGeometryNV);\n        builder.addCapability(spv::Capability::RayTracingLinearSweptSpheresGeometryNV);\n        break;\n\n    case glslang::EOpRayQueryGetIntersectionLSSHitValueNV:\n    case glslang::EOpRayQueryIsLSSHitNV:\n        builder.addExtension(spv::E_SPV_NV_linear_swept_spheres);\n        builder.addCapability(spv::Capability::RayQueryKHR);\n        builder.addCapability(spv::Capability::RayTracingLinearSweptSpheresGeometryNV);\n        break;\n\n    case glslang::EOpRayQueryGetIntersectionTriangleVertexPositionsEXT:\n        builder.addExtension(spv::E_SPV_KHR_ray_tracing_position_fetch);\n        builder.addCapability(spv::Capability::RayQueryPositionFetchKHR);\n        noReturnValue = true;\n        break;\n    case glslang::EOpImageSampleWeightedQCOM:\n        builder.addCapability(spv::Capability::TextureSampleWeightedQCOM);\n        builder.addExtension(spv::E_SPV_QCOM_image_processing);\n        break;\n    case glslang::EOpImageBoxFilterQCOM:\n        builder.addCapability(spv::Capability::TextureBoxFilterQCOM);\n        builder.addExtension(spv::E_SPV_QCOM_image_processing);\n        break;\n    case glslang::EOpImageBlockMatchSADQCOM:\n    case glslang::EOpImageBlockMatchSSDQCOM:\n        builder.addCapability(spv::Capability::TextureBlockMatchQCOM);\n        builder.addExtension(spv::E_SPV_QCOM_image_processing);\n        break;\n\n    case glslang::EOpImageBlockMatchWindowSSDQCOM:\n    case glslang::EOpImageBlockMatchWindowSADQCOM:\n        builder.addCapability(spv::Capability::TextureBlockMatchQCOM);\n        builder.addExtension(spv::E_SPV_QCOM_image_processing);\n        builder.addCapability(spv::Capability::TextureBlockMatch2QCOM);\n        builder.addExtension(spv::E_SPV_QCOM_image_processing2);\n        break;\n\n    case glslang::EOpImageBlockMatchGatherSSDQCOM:\n    case glslang::EOpImageBlockMatchGatherSADQCOM:\n        builder.addCapability(spv::Capability::TextureBlockMatchQCOM);\n        builder.addExtension(spv::E_SPV_QCOM_image_processing);\n        builder.addCapability(spv::Capability::TextureBlockMatch2QCOM);\n        builder.addExtension(spv::E_SPV_QCOM_image_processing2);\n        break;\n\n    case glslang::EOpFetchMicroTriangleVertexPositionNV:\n    case glslang::EOpFetchMicroTriangleVertexBarycentricNV:\n        builder.addExtension(spv::E_SPV_NV_displacement_micromap);\n        builder.addCapability(spv::Capability::DisplacementMicromapNV);\n        break;\n\n    case glslang::EOpRayQueryGetIntersectionClusterIdNV:\n        builder.addExtension(spv::E_SPV_NV_cluster_acceleration_structure);\n        builder.addCapability(spv::Capability::RayQueryKHR);\n        builder.addCapability(spv::Capability::RayTracingClusterAccelerationStructureNV);\n        break;\n\n    case glslang::EOpDebugPrintf:\n        noReturnValue = true;\n        break;\n\n    default:\n        break;\n    }\n\n    //\n    // See if it maps to a regular operation.\n    //\n    if (binOp != glslang::EOpNull) {\n        glslang::TIntermTyped* left = node->getSequence()[0]->getAsTyped();\n        glslang::TIntermTyped* right = node->getSequence()[1]->getAsTyped();\n        assert(left && right);\n\n        builder.clearAccessChain();\n        left->traverse(this);\n        spv::Id leftId = accessChainLoad(left->getType());\n\n        builder.clearAccessChain();\n        right->traverse(this);\n        spv::Id rightId = accessChainLoad(right->getType());\n\n        builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename());\n        OpDecorations decorations = { precision,\n                                      TranslateNoContractionDecoration(node->getType().getQualifier()),\n                                      TranslateNonUniformDecoration(node->getType().getQualifier()) };\n        result = createBinaryOperation(binOp, decorations,\n                                       resultType(), leftId, rightId,\n                                       left->getType().getBasicType(), reduceComparison);\n\n        // code above should only make binOp that exists in createBinaryOperation\n        assert(result != spv::NoResult);\n        builder.clearAccessChain();\n        builder.setAccessChainRValue(result);\n\n        return false;\n    }\n\n    //\n    // Create the list of operands.\n    //\n    glslang::TIntermSequence& glslangOperands = node->getSequence();\n    std::vector<spv::Id> operands;\n    std::vector<spv::IdImmediate> memoryAccessOperands;\n    for (int arg = 0; arg < (int)glslangOperands.size(); ++arg) {\n        // special case l-value operands; there are just a few\n        bool lvalue = false;\n        switch (node->getOp()) {\n        case glslang::EOpModf:\n            if (arg == 1)\n                lvalue = true;\n            break;\n\n\n\n        case glslang::EOpHitObjectRecordHitNV:\n        case glslang::EOpHitObjectRecordHitMotionNV:\n        case glslang::EOpHitObjectRecordHitWithIndexNV:\n        case glslang::EOpHitObjectRecordHitWithIndexMotionNV:\n        case glslang::EOpHitObjectTraceRayNV:\n        case glslang::EOpHitObjectTraceRayMotionNV:\n        case glslang::EOpHitObjectExecuteShaderNV:\n        case glslang::EOpHitObjectRecordMissNV:\n        case glslang::EOpHitObjectRecordMissMotionNV:\n        case glslang::EOpHitObjectGetAttributesNV:\n        case glslang::EOpHitObjectGetClusterIdNV:\n            if (arg == 0)\n                lvalue = true;\n            break;\n\n        case glslang::EOpHitObjectGetLSSPositionsNV:\n        case glslang::EOpHitObjectGetLSSRadiiNV:\n            lvalue = true;\n            break;\n\n        case glslang::EOpRayQueryInitialize:\n        case glslang::EOpRayQueryTerminate:\n        case glslang::EOpRayQueryConfirmIntersection:\n        case glslang::EOpRayQueryProceed:\n        case glslang::EOpRayQueryGenerateIntersection:\n        case glslang::EOpRayQueryGetIntersectionType:\n        case glslang::EOpRayQueryGetIntersectionT:\n        case glslang::EOpRayQueryGetIntersectionInstanceCustomIndex:\n        case glslang::EOpRayQueryGetIntersectionInstanceId:\n        case glslang::EOpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffset:\n        case glslang::EOpRayQueryGetIntersectionGeometryIndex:\n        case glslang::EOpRayQueryGetIntersectionPrimitiveIndex:\n        case glslang::EOpRayQueryGetIntersectionBarycentrics:\n        case glslang::EOpRayQueryGetIntersectionFrontFace:\n        case glslang::EOpRayQueryGetIntersectionObjectRayDirection:\n        case glslang::EOpRayQueryGetIntersectionObjectRayOrigin:\n        case glslang::EOpRayQueryGetIntersectionObjectToWorld:\n        case glslang::EOpRayQueryGetIntersectionWorldToObject:\n        case glslang::EOpRayQueryGetIntersectionClusterIdNV:\n        case glslang::EOpRayQueryGetIntersectionSpherePositionNV:\n        case glslang::EOpRayQueryGetIntersectionSphereRadiusNV:\n        case glslang::EOpRayQueryGetIntersectionLSSHitValueNV:\n        case glslang::EOpRayQueryIsSphereHitNV:\n        case glslang::EOpRayQueryIsLSSHitNV:\n            if (arg == 0)\n                lvalue = true;\n            break;\n\n        case glslang::EOpAtomicAdd:\n        case glslang::EOpAtomicSubtract:\n        case glslang::EOpAtomicMin:\n        case glslang::EOpAtomicMax:\n        case glslang::EOpAtomicAnd:\n        case glslang::EOpAtomicOr:\n        case glslang::EOpAtomicXor:\n        case glslang::EOpAtomicExchange:\n        case glslang::EOpAtomicCompSwap:\n            if (arg == 0)\n                lvalue = true;\n            break;\n\n        case glslang::EOpFrexp:\n            if (arg == 1)\n                lvalue = true;\n            break;\n        case glslang::EOpInterpolateAtSample:\n        case glslang::EOpInterpolateAtOffset:\n        case glslang::EOpInterpolateAtVertex:\n            if (arg == 0) {\n                // If GLSL, use the address of the interpolant argument.\n                // If HLSL, use an internal version of OpInterolates that takes\n                // the rvalue of the interpolant. A fixup pass in spirv-opt\n                // legalization will remove the OpLoad and convert to an lvalue.\n                // Had to do this because legalization will only propagate a\n                // builtin into an rvalue.\n                lvalue = glslangIntermediate->getSource() != glslang::EShSourceHlsl;\n\n                // Does it need a swizzle inversion?  If so, evaluation is inverted;\n                // operate first on the swizzle base, then apply the swizzle.\n                // That is, we transform\n                //\n                //    interpolate(v.zy)  ->  interpolate(v).zy\n                //\n                if (glslangOperands[0]->getAsOperator() &&\n                    glslangOperands[0]->getAsOperator()->getOp() == glslang::EOpVectorSwizzle)\n                    invertedType = convertGlslangToSpvType(\n                        glslangOperands[0]->getAsBinaryNode()->getLeft()->getType());\n            }\n            break;\n        case glslang::EOpAtomicLoad:\n        case glslang::EOpAtomicStore:\n        case glslang::EOpAtomicCounterAdd:\n        case glslang::EOpAtomicCounterSubtract:\n        case glslang::EOpAtomicCounterMin:\n        case glslang::EOpAtomicCounterMax:\n        case glslang::EOpAtomicCounterAnd:\n        case glslang::EOpAtomicCounterOr:\n        case glslang::EOpAtomicCounterXor:\n        case glslang::EOpAtomicCounterExchange:\n        case glslang::EOpAtomicCounterCompSwap:\n            if (arg == 0)\n                lvalue = true;\n            break;\n        case glslang::EOpAddCarry:\n        case glslang::EOpSubBorrow:\n            if (arg == 2)\n                lvalue = true;\n            break;\n        case glslang::EOpUMulExtended:\n        case glslang::EOpIMulExtended:\n            if (arg >= 2)\n                lvalue = true;\n            break;\n        case glslang::EOpCooperativeMatrixLoad:\n        case glslang::EOpCooperativeMatrixLoadNV:\n        case glslang::EOpCooperativeMatrixLoadTensorNV:\n        case glslang::EOpCooperativeVectorLoadNV:\n            if (arg == 0 || arg == 1)\n                lvalue = true;\n            break;\n        case glslang::EOpCooperativeMatrixStore:\n        case glslang::EOpCooperativeMatrixStoreNV:\n        case glslang::EOpCooperativeMatrixStoreTensorNV:\n        case glslang::EOpCooperativeVectorStoreNV:\n            if (arg == 1)\n                lvalue = true;\n            break;\n        case glslang::EOpCooperativeVectorMatMulNV:\n            if (arg == 0 || arg == 3)\n                lvalue = true;\n            break;\n        case glslang::EOpCooperativeVectorMatMulAddNV:\n            if (arg == 0 || arg == 3 || arg == 6)\n                lvalue = true;\n            break;\n        case glslang::EOpCooperativeVectorOuterProductAccumulateNV:\n            if (arg == 2)\n                lvalue = true;\n            break;\n        case glslang::EOpCooperativeVectorReduceSumAccumulateNV:\n            if (arg == 1)\n                lvalue = true;\n            break;\n        case glslang::EOpCooperativeMatrixReduceNV:\n        case glslang::EOpCooperativeMatrixPerElementOpNV:\n        case glslang::EOpCooperativeMatrixTransposeNV:\n            if (arg == 0)\n                lvalue = true;\n            break;\n        case glslang::EOpSpirvInst:\n            if (glslangOperands[arg]->getAsTyped()->getQualifier().isSpirvByReference())\n                lvalue = true;\n            break;\n        case glslang::EOpReorderThreadNV:\n            //Three variants of reorderThreadNV, two of them use hitObjectNV\n            if (arg == 0 && glslangOperands.size() != 2)\n                lvalue = true;\n            break;\n        case glslang::EOpRayQueryGetIntersectionTriangleVertexPositionsEXT:\n        case glslang::EOpRayQueryGetIntersectionLSSPositionsNV:\n        case glslang::EOpRayQueryGetIntersectionLSSRadiiNV:\n            if (arg == 0 || arg == 2)\n                lvalue = true;\n            break;\n        default:\n            break;\n        }\n        builder.clearAccessChain();\n        if (invertedType != spv::NoType && arg == 0)\n            glslangOperands[0]->getAsBinaryNode()->getLeft()->traverse(this);\n        else\n            glslangOperands[arg]->traverse(this);\n\n        bool isCoopMat = node->getOp() == glslang::EOpCooperativeMatrixLoad ||\n                         node->getOp() == glslang::EOpCooperativeMatrixStore ||\n                         node->getOp() == glslang::EOpCooperativeMatrixLoadNV ||\n                         node->getOp() == glslang::EOpCooperativeMatrixStoreNV ||\n                         node->getOp() == glslang::EOpCooperativeMatrixLoadTensorNV ||\n                         node->getOp() == glslang::EOpCooperativeMatrixStoreTensorNV;\n        bool isCoopVec = node->getOp() == glslang::EOpCooperativeVectorLoadNV ||\n                         node->getOp() == glslang::EOpCooperativeVectorStoreNV;\n        if (isCoopMat || isCoopVec) {\n\n            if (arg == 1) {\n                spv::Builder::AccessChain::CoherentFlags coherentFlags {};\n                unsigned int alignment {};\n                if (isCoopMat) {\n                    // fold \"element\" parameter into the access chain\n                    spv::Builder::AccessChain save = builder.getAccessChain();\n                    builder.clearAccessChain();\n                    glslangOperands[2]->traverse(this);\n\n                    spv::Id elementId = accessChainLoad(glslangOperands[2]->getAsTyped()->getType());\n\n                    builder.setAccessChain(save);\n\n                    // Point to the first element of the array.\n                    builder.accessChainPush(elementId,\n                        TranslateCoherent(glslangOperands[arg]->getAsTyped()->getType()),\n                                          glslangOperands[arg]->getAsTyped()->getType().getBufferReferenceAlignment());\n                    coherentFlags = builder.getAccessChain().coherentFlags;\n                    alignment = builder.getAccessChain().alignment;\n                } else {\n                    coherentFlags = builder.getAccessChain().coherentFlags;\n                    coherentFlags |= TranslateCoherent(glslangOperands[arg]->getAsTyped()->getType());\n                    alignment = 16;\n                }\n\n                spv::MemoryAccessMask memoryAccess = TranslateMemoryAccess(coherentFlags);\n                if (node->getOp() == glslang::EOpCooperativeMatrixLoad ||\n                    node->getOp() == glslang::EOpCooperativeMatrixLoadNV ||\n                    node->getOp() == glslang::EOpCooperativeMatrixLoadTensorNV ||\n                    node->getOp() == glslang::EOpCooperativeVectorLoadNV)\n                    memoryAccess = (memoryAccess & ~spv::MemoryAccessMask::MakePointerAvailableKHR);\n                if (node->getOp() == glslang::EOpCooperativeMatrixStore ||\n                    node->getOp() == glslang::EOpCooperativeMatrixStoreNV ||\n                    node->getOp() == glslang::EOpCooperativeMatrixStoreTensorNV ||\n                    node->getOp() == glslang::EOpCooperativeVectorStoreNV)\n                    memoryAccess = (memoryAccess & ~spv::MemoryAccessMask::MakePointerVisibleKHR);\n                if (builder.getStorageClass(builder.getAccessChain().base) ==\n                    spv::StorageClass::PhysicalStorageBufferEXT) {\n                    memoryAccess = (spv::MemoryAccessMask)(memoryAccess | spv::MemoryAccessMask::Aligned);\n                }\n\n                memoryAccessOperands.push_back(spv::IdImmediate(false, memoryAccess));\n\n                if (anySet(memoryAccess, spv::MemoryAccessMask::Aligned)) {\n                    memoryAccessOperands.push_back(spv::IdImmediate(false, alignment));\n                }\n\n                if (anySet(memoryAccess,\n                    spv::MemoryAccessMask::MakePointerAvailableKHR | spv::MemoryAccessMask::MakePointerVisibleKHR)) {\n                    memoryAccessOperands.push_back(spv::IdImmediate(true,\n                        builder.makeUintConstant(TranslateMemoryScope(coherentFlags))));\n                }\n            } else if (isCoopMat && arg == 2) {\n                continue;\n            }\n        }\n\n        // for l-values, pass the address, for r-values, pass the value\n        if (lvalue) {\n            if (invertedType == spv::NoType && !builder.isSpvLvalue()) {\n                // SPIR-V cannot represent an l-value containing a swizzle that doesn't\n                // reduce to a simple access chain.  So, we need a temporary vector to\n                // receive the result, and must later swizzle that into the original\n                // l-value.\n                complexLvalues.push_back(builder.getAccessChain());\n                temporaryLvalues.push_back(builder.createVariable(\n                    spv::NoPrecision, spv::StorageClass::Function,\n                    builder.accessChainGetInferredType(), \"swizzleTemp\"));\n                operands.push_back(temporaryLvalues.back());\n            } else {\n                operands.push_back(builder.accessChainGetLValue());\n            }\n            lvalueCoherentFlags = builder.getAccessChain().coherentFlags;\n            lvalueCoherentFlags |= TranslateCoherent(glslangOperands[arg]->getAsTyped()->getType());\n        } else {\n            builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename());\n            glslang::TOperator glslangOp = node->getOp();\n            if (arg == 1 &&\n                (glslangOp == glslang::EOpRayQueryGetIntersectionType ||\n                 glslangOp == glslang::EOpRayQueryGetIntersectionT ||\n                 glslangOp == glslang::EOpRayQueryGetIntersectionInstanceCustomIndex ||\n                 glslangOp == glslang::EOpRayQueryGetIntersectionInstanceId ||\n                 glslangOp == glslang::EOpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffset ||\n                 glslangOp == glslang::EOpRayQueryGetIntersectionGeometryIndex ||\n                 glslangOp == glslang::EOpRayQueryGetIntersectionPrimitiveIndex ||\n                 glslangOp == glslang::EOpRayQueryGetIntersectionBarycentrics ||\n                 glslangOp == glslang::EOpRayQueryGetIntersectionFrontFace ||\n                 glslangOp == glslang::EOpRayQueryGetIntersectionObjectRayDirection ||\n                 glslangOp == glslang::EOpRayQueryGetIntersectionObjectRayOrigin ||\n                 glslangOp == glslang::EOpRayQueryGetIntersectionObjectToWorld ||\n                 glslangOp == glslang::EOpRayQueryGetIntersectionWorldToObject ||\n                 glslangOp == glslang::EOpRayQueryGetIntersectionTriangleVertexPositionsEXT ||\n                 glslangOp == glslang::EOpRayQueryGetIntersectionClusterIdNV ||\n                 glslangOp == glslang::EOpRayQueryGetIntersectionSpherePositionNV ||\n                 glslangOp == glslang::EOpRayQueryGetIntersectionSphereRadiusNV ||\n                 glslangOp == glslang::EOpRayQueryGetIntersectionLSSHitValueNV ||\n                 glslangOp == glslang::EOpRayQueryGetIntersectionLSSPositionsNV ||\n                 glslangOp == glslang::EOpRayQueryGetIntersectionLSSRadiiNV ||\n                 glslangOp == glslang::EOpRayQueryIsLSSHitNV ||\n                 glslangOp == glslang::EOpRayQueryIsSphereHitNV\n                    )) {\n                bool cond = glslangOperands[arg]->getAsConstantUnion()->getConstArray()[0].getBConst();\n                operands.push_back(builder.makeIntConstant(cond ? 1 : 0));\n            } else if ((arg == 10 && glslangOp == glslang::EOpTraceKHR) ||\n                       (arg == 11 && glslangOp == glslang::EOpTraceRayMotionNV) ||\n                       (arg == 1  && glslangOp == glslang::EOpExecuteCallableKHR) ||\n                       (arg == 1  && glslangOp == glslang::EOpHitObjectExecuteShaderNV) ||\n                       (arg == 11 && glslangOp == glslang::EOpHitObjectTraceRayNV) ||\n                       (arg == 12 && glslangOp == glslang::EOpHitObjectTraceRayMotionNV)) {\n                const int set = glslangOp == glslang::EOpExecuteCallableKHR ? 1 : 0;\n                const int location = glslangOperands[arg]->getAsConstantUnion()->getConstArray()[0].getUConst();\n                auto itNode = locationToSymbol[set].find(location);\n                visitSymbol(itNode->second);\n                spv::Id symId = getSymbolId(itNode->second);\n                operands.push_back(symId);\n            } else if ((arg == 12 && glslangOp == glslang::EOpHitObjectRecordHitNV) ||\n                       (arg == 13 && glslangOp == glslang::EOpHitObjectRecordHitMotionNV) ||\n                       (arg == 11 && glslangOp == glslang::EOpHitObjectRecordHitWithIndexNV) ||\n                       (arg == 12 && glslangOp == glslang::EOpHitObjectRecordHitWithIndexMotionNV) ||\n                       (arg == 1  && glslangOp == glslang::EOpHitObjectGetAttributesNV)) {\n                 const int location = glslangOperands[arg]->getAsConstantUnion()->getConstArray()[0].getUConst();\n                 const int set = 2;\n                 auto itNode = locationToSymbol[set].find(location);\n                 visitSymbol(itNode->second);\n                 spv::Id symId = getSymbolId(itNode->second);\n                 operands.push_back(symId);\n            } else if (glslangOperands[arg]->getAsTyped()->getQualifier().isSpirvLiteral()) {\n                // Will be translated to a literal value, make a placeholder here\n                operands.push_back(spv::NoResult);\n            } else if (glslangOperands[arg]->getAsTyped()->getBasicType() == glslang::EbtFunction) {\n                spv::Function* function = functionMap[glslangOperands[arg]->getAsSymbolNode()->getMangledName().c_str()];\n                assert(function);\n                operands.push_back(function->getId());\n            } else  {\n               operands.push_back(accessChainLoad(glslangOperands[arg]->getAsTyped()->getType()));\n            }\n        }\n    }\n\n    builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename());\n    if (node->getOp() == glslang::EOpCooperativeMatrixLoadTensorNV) {\n        std::vector<spv::IdImmediate> idImmOps;\n\n        builder.addCapability(spv::Capability::CooperativeMatrixTensorAddressingNV);\n        builder.addExtension(spv::E_SPV_NV_cooperative_matrix2);\n\n        spv::Id object = builder.createLoad(operands[0], spv::NoPrecision);\n\n        idImmOps.push_back(spv::IdImmediate(true, operands[1])); // Pointer\n        idImmOps.push_back(spv::IdImmediate(true, object)); // Object\n        idImmOps.push_back(spv::IdImmediate(true, operands[2])); // tensorLayout\n\n        idImmOps.insert(idImmOps.end(), memoryAccessOperands.begin(), memoryAccessOperands.end()); // memoryaccess\n\n        // initialize tensor operands to zero, then OR in flags based on the operands\n        size_t tensorOpIdx = idImmOps.size();\n        idImmOps.push_back(spv::IdImmediate(false, 0));\n\n        for (uint32_t i = 3; i < operands.size(); ++i) {\n            if (builder.isTensorView(operands[i])) {\n                addMask(idImmOps[tensorOpIdx].word, spv::TensorAddressingOperandsMask::TensorView);\n            } else {\n                // must be the decode func\n                addMask(idImmOps[tensorOpIdx].word, spv::TensorAddressingOperandsMask::DecodeFunc);\n                builder.addCapability(spv::Capability::CooperativeMatrixBlockLoadsNV);\n            }\n            idImmOps.push_back(spv::IdImmediate(true, operands[i])); // tensorView or decodeFunc\n        }\n\n        // get the pointee type\n        spv::Id typeId = builder.getContainedTypeId(builder.getTypeId(operands[0]));\n        assert(builder.isCooperativeMatrixType(typeId));\n        // do the op\n        spv::Id result = builder.createOp(spv::Op::OpCooperativeMatrixLoadTensorNV, typeId, idImmOps);\n        // store the result to the pointer (out param 'm')\n        builder.createStore(result, operands[0]);\n        result = 0;\n    } else if (node->getOp() == glslang::EOpCooperativeMatrixLoad ||\n               node->getOp() == glslang::EOpCooperativeMatrixLoadNV) {\n        std::vector<spv::IdImmediate> idImmOps;\n\n        idImmOps.push_back(spv::IdImmediate(true, operands[1])); // buf\n        if (node->getOp() == glslang::EOpCooperativeMatrixLoad) {\n            idImmOps.push_back(spv::IdImmediate(true, operands[3])); // matrixLayout\n            auto layout = (spv::CooperativeMatrixLayout)builder.getConstantScalar(operands[3]);\n            if (layout == spv::CooperativeMatrixLayout::RowBlockedInterleavedARM ||\n                layout == spv::CooperativeMatrixLayout::ColumnBlockedInterleavedARM) {\n                builder.addExtension(spv::E_SPV_ARM_cooperative_matrix_layouts);\n                builder.addCapability(spv::Capability::CooperativeMatrixLayoutsARM);\n            }\n            idImmOps.push_back(spv::IdImmediate(true, operands[2])); // stride\n        } else {\n            idImmOps.push_back(spv::IdImmediate(true, operands[2])); // stride\n            idImmOps.push_back(spv::IdImmediate(true, operands[3])); // colMajor\n        }\n        idImmOps.insert(idImmOps.end(), memoryAccessOperands.begin(), memoryAccessOperands.end());\n        // get the pointee type\n        spv::Id typeId = builder.getContainedTypeId(builder.getTypeId(operands[0]));\n        assert(builder.isCooperativeMatrixType(typeId));\n        // do the op\n        spv::Id result = node->getOp() == glslang::EOpCooperativeMatrixLoad\n                       ? builder.createOp(spv::Op::OpCooperativeMatrixLoadKHR, typeId, idImmOps)\n                       : builder.createOp(spv::Op::OpCooperativeMatrixLoadNV, typeId, idImmOps);\n        // store the result to the pointer (out param 'm')\n        builder.createStore(result, operands[0]);\n        result = 0;\n    } else if (node->getOp() == glslang::EOpCooperativeMatrixStoreTensorNV) {\n        std::vector<spv::IdImmediate> idImmOps;\n\n        idImmOps.push_back(spv::IdImmediate(true, operands[1])); // buf\n        idImmOps.push_back(spv::IdImmediate(true, operands[0])); // object\n\n        builder.addCapability(spv::Capability::CooperativeMatrixTensorAddressingNV);\n        builder.addExtension(spv::E_SPV_NV_cooperative_matrix2);\n\n        idImmOps.push_back(spv::IdImmediate(true, operands[2])); // tensorLayout\n\n        idImmOps.insert(idImmOps.end(), memoryAccessOperands.begin(), memoryAccessOperands.end()); // memoryaccess\n\n        if (operands.size() > 3) {\n            idImmOps.push_back(spv::IdImmediate(false, spv::TensorAddressingOperandsMask::TensorView));\n            idImmOps.push_back(spv::IdImmediate(true, operands[3])); // tensorView\n        } else {\n            idImmOps.push_back(spv::IdImmediate(false, 0));\n        }\n\n        builder.createNoResultOp(spv::Op::OpCooperativeMatrixStoreTensorNV, idImmOps);\n        result = 0;\n    } else if (node->getOp() == glslang::EOpCooperativeMatrixStore ||\n               node->getOp() == glslang::EOpCooperativeMatrixStoreNV) {\n        std::vector<spv::IdImmediate> idImmOps;\n\n        idImmOps.push_back(spv::IdImmediate(true, operands[1])); // buf\n        idImmOps.push_back(spv::IdImmediate(true, operands[0])); // object\n        if (node->getOp() == glslang::EOpCooperativeMatrixStore) {\n            idImmOps.push_back(spv::IdImmediate(true, operands[3])); // matrixLayout\n            auto layout = (spv::CooperativeMatrixLayout)builder.getConstantScalar(operands[3]);\n            if (layout == spv::CooperativeMatrixLayout::RowBlockedInterleavedARM ||\n                layout == spv::CooperativeMatrixLayout::ColumnBlockedInterleavedARM) {\n                builder.addExtension(spv::E_SPV_ARM_cooperative_matrix_layouts);\n                builder.addCapability(spv::Capability::CooperativeMatrixLayoutsARM);\n            }\n            idImmOps.push_back(spv::IdImmediate(true, operands[2])); // stride\n        } else {\n            idImmOps.push_back(spv::IdImmediate(true, operands[2])); // stride\n            idImmOps.push_back(spv::IdImmediate(true, operands[3])); // colMajor\n        }\n        idImmOps.insert(idImmOps.end(), memoryAccessOperands.begin(), memoryAccessOperands.end());\n\n        if (node->getOp() == glslang::EOpCooperativeMatrixStore)\n            builder.createNoResultOp(spv::Op::OpCooperativeMatrixStoreKHR, idImmOps);\n        else\n            builder.createNoResultOp(spv::Op::OpCooperativeMatrixStoreNV, idImmOps);\n        result = 0;\n    } else if (node->getOp() == glslang::EOpRayQueryGetIntersectionTriangleVertexPositionsEXT) {\n        std::vector<spv::IdImmediate> idImmOps;\n\n        idImmOps.push_back(spv::IdImmediate(true, operands[0])); // q\n        idImmOps.push_back(spv::IdImmediate(true, operands[1])); // committed\n\n        spv::Id typeId = builder.makeArrayType(builder.makeVectorType(builder.makeFloatType(32), 3),\n                                               builder.makeUintConstant(3), 0);\n        // do the op\n\n        spv::Op spvOp = spv::Op::OpRayQueryGetIntersectionTriangleVertexPositionsKHR;\n\n        spv::Id result = builder.createOp(spvOp, typeId, idImmOps);\n        // store the result to the pointer (out param 'm')\n        builder.createStore(result, operands[2]);\n        result = 0;\n    } else if (node->getOp() == glslang::EOpRayQueryGetIntersectionLSSPositionsNV) {\n        std::vector<spv::IdImmediate> idImmOps;\n\n        idImmOps.push_back(spv::IdImmediate(true, operands[0])); // q\n        idImmOps.push_back(spv::IdImmediate(true, operands[1])); // committed\n\n        spv::Id typeId = builder.makeArrayType(builder.makeVectorType(builder.makeFloatType(32), 3),\n                                               builder.makeUintConstant(2), 0);\n        // do the op\n\n        spv::Op spvOp = spv::Op::OpRayQueryGetIntersectionLSSPositionsNV;\n\n        spv::Id result = builder.createOp(spvOp, typeId, idImmOps);\n        // store the result to the pointer (out param 'm')\n        builder.createStore(result, operands[2]);\n        result = 0;\n    } else if (node->getOp() == glslang::EOpRayQueryGetIntersectionLSSRadiiNV) {\n        std::vector<spv::IdImmediate> idImmOps;\n\n        idImmOps.push_back(spv::IdImmediate(true, operands[0])); // q\n        idImmOps.push_back(spv::IdImmediate(true, operands[1])); // committed\n\n        spv::Id typeId = builder.makeArrayType(builder.makeFloatType(32),\n                                               builder.makeUintConstant(2), 0);\n        // do the op\n\n        spv::Op spvOp = spv::Op::OpRayQueryGetIntersectionLSSRadiiNV;\n\n        spv::Id result = builder.createOp(spvOp, typeId, idImmOps);\n        // store the result to the pointer (out param 'm')\n        builder.createStore(result, operands[2]);\n        result = 0;\n    } else if (node->getOp() == glslang::EOpHitObjectGetLSSPositionsNV) {\n        std::vector<spv::IdImmediate> idImmOps;\n\n        idImmOps.push_back(spv::IdImmediate(true, operands[0])); // hitObject\n\n        spv::Op spvOp = spv::Op::OpHitObjectGetLSSPositionsNV;\n        spv::Id typeId = builder.makeArrayType(builder.makeVectorType(builder.makeFloatType(32), 3),\n                                               builder.makeUintConstant(2), 0);\n\n        spv::Id result = builder.createOp(spvOp, typeId, idImmOps);\n        // store the result to the pointer (out param 'm')\n        builder.createStore(result, operands[1]);\n        result = 0;\n    } else if (node->getOp() == glslang::EOpHitObjectGetLSSRadiiNV) {\n        std::vector<spv::IdImmediate> idImmOps;\n\n        idImmOps.push_back(spv::IdImmediate(true, operands[0])); // hitObject\n\n        spv::Op spvOp = spv::Op::OpHitObjectGetLSSRadiiNV;\n        spv::Id typeId = builder.makeArrayType(builder.makeFloatType(32),\n                                               builder.makeUintConstant(2), 0);\n\n        spv::Id result = builder.createOp(spvOp, typeId, idImmOps);\n        // store the result to the pointer (out param 'm')\n        builder.createStore(result, operands[1]);\n        result = 0;\n\n    } else if (node->getOp() == glslang::EOpCooperativeMatrixMulAdd) {\n        auto matrixOperands = spv::CooperativeMatrixOperandsMask::MaskNone;\n\n        // If the optional operand is present, initialize matrixOperands to that value.\n        if (glslangOperands.size() == 4 && glslangOperands[3]->getAsConstantUnion()) {\n            matrixOperands = (spv::CooperativeMatrixOperandsMask)glslangOperands[3]->getAsConstantUnion()->getConstArray()[0].getIConst();\n        }\n\n        // Determine Cooperative Matrix Operands bits from the signedness of the types.\n        if (isTypeSignedInt(glslangOperands[0]->getAsTyped()->getBasicType()))\n            addMask(matrixOperands, spv::CooperativeMatrixOperandsMask::MatrixASignedComponentsKHR);\n        if (isTypeSignedInt(glslangOperands[1]->getAsTyped()->getBasicType()))\n            addMask(matrixOperands, spv::CooperativeMatrixOperandsMask::MatrixBSignedComponentsKHR);\n        if (isTypeSignedInt(glslangOperands[2]->getAsTyped()->getBasicType()))\n            addMask(matrixOperands, spv::CooperativeMatrixOperandsMask::MatrixCSignedComponentsKHR);\n        if (isTypeSignedInt(node->getBasicType()))\n            addMask(matrixOperands, spv::CooperativeMatrixOperandsMask::MatrixResultSignedComponentsKHR);\n\n        std::vector<spv::IdImmediate> idImmOps;\n        idImmOps.push_back(spv::IdImmediate(true, operands[0]));\n        idImmOps.push_back(spv::IdImmediate(true, operands[1]));\n        idImmOps.push_back(spv::IdImmediate(true, operands[2]));\n        if (matrixOperands != spv::CooperativeMatrixOperandsMask::MaskNone)\n            idImmOps.push_back(spv::IdImmediate(false, matrixOperands));\n\n        result = builder.createOp(spv::Op::OpCooperativeMatrixMulAddKHR, resultType(), idImmOps);\n    } else if (node->getOp() == glslang::EOpCooperativeMatrixReduceNV) {\n        builder.addCapability(spv::Capability::CooperativeMatrixReductionsNV);\n        builder.addExtension(spv::E_SPV_NV_cooperative_matrix2);\n\n        spv::Op opcode = spv::Op::OpCooperativeMatrixReduceNV;\n        unsigned mask = glslangOperands[2]->getAsConstantUnion()->getConstArray()[0].getUConst();\n\n        spv::Id typeId = builder.getContainedTypeId(builder.getTypeId(operands[0]));\n        assert(builder.isCooperativeMatrixType(typeId));\n\n        result = builder.createCooperativeMatrixReduce(opcode, typeId, operands[1], mask, operands[3]);\n        // store the result to the pointer (out param 'm')\n        builder.createStore(result, operands[0]);\n        result = 0;\n    } else if (node->getOp() == glslang::EOpCooperativeMatrixPerElementOpNV) {\n        builder.addCapability(spv::Capability::CooperativeMatrixPerElementOperationsNV);\n        builder.addExtension(spv::E_SPV_NV_cooperative_matrix2);\n\n        spv::Id typeId = builder.getContainedTypeId(builder.getTypeId(operands[0]));\n        assert(builder.isCooperativeMatrixType(typeId));\n\n        result = builder.createCooperativeMatrixPerElementOp(typeId, operands);\n        // store the result to the pointer\n        builder.createStore(result, operands[0]);\n        result = 0;\n    } else if (node->getOp() == glslang::EOpCooperativeMatrixTransposeNV) {\n\n        builder.addCapability(spv::Capability::CooperativeMatrixConversionsNV);\n        builder.addExtension(spv::E_SPV_NV_cooperative_matrix2);\n\n        spv::Id typeId = builder.getContainedTypeId(builder.getTypeId(operands[0]));\n        assert(builder.isCooperativeMatrixType(typeId));\n\n        result = builder.createUnaryOp(spv::Op::OpCooperativeMatrixTransposeNV, typeId, operands[1]);\n        // store the result to the pointer\n        builder.createStore(result, operands[0]);\n        result = 0;\n    } else if (node->getOp() == glslang::EOpCooperativeVectorMatMulNV ||\n               node->getOp() == glslang::EOpCooperativeVectorMatMulAddNV) {\n        auto matrixOperands = spv::CooperativeMatrixOperandsMask::MaskNone;\n\n        bool isMulAdd = node->getOp() == glslang::EOpCooperativeVectorMatMulAddNV;\n\n        // Determine Cooperative Matrix Operands bits from the signedness of the types.\n\n        if (isTypeSignedInt(glslangOperands[1]->getAsTyped()->getBasicType()))\n            addMask(matrixOperands, spv::CooperativeMatrixOperandsMask::MatrixBSignedComponentsKHR);\n        if (isTypeSignedInt(glslangOperands[0]->getAsTyped()->getBasicType()))\n            addMask(matrixOperands, spv::CooperativeMatrixOperandsMask::MatrixResultSignedComponentsKHR);\n\n        uint32_t opIdx = 1;\n        std::vector<spv::IdImmediate> idImmOps;\n        idImmOps.push_back(spv::IdImmediate(true, operands[opIdx++])); // Input\n        idImmOps.push_back(spv::IdImmediate(true, operands[opIdx++])); // InputInterpretation\n        idImmOps.push_back(spv::IdImmediate(true, operands[opIdx++])); // Matrix\n        idImmOps.push_back(spv::IdImmediate(true, operands[opIdx++])); // MatrixOffset\n        idImmOps.push_back(spv::IdImmediate(true, operands[opIdx++])); // MatrixInterpretation\n        if (isMulAdd) {\n            idImmOps.push_back(spv::IdImmediate(true, operands[opIdx++])); // Bias\n            idImmOps.push_back(spv::IdImmediate(true, operands[opIdx++])); // BiasOffset\n            idImmOps.push_back(spv::IdImmediate(true, operands[opIdx++])); // BiasInterpretation\n        }\n        idImmOps.push_back(spv::IdImmediate(true, operands[opIdx++])); // M\n        idImmOps.push_back(spv::IdImmediate(true, operands[opIdx++])); // K\n        idImmOps.push_back(spv::IdImmediate(true, operands[opIdx++])); // MemoryLayout\n        idImmOps.push_back(spv::IdImmediate(true, operands[opIdx++])); // Transpose\n        idImmOps.push_back(spv::IdImmediate(true, operands[opIdx++])); // MatrixStride\n        if (matrixOperands != spv::CooperativeMatrixOperandsMask::MaskNone)\n            idImmOps.push_back(spv::IdImmediate(false, matrixOperands));  // Cooperative Matrix Operands\n\n        // get the pointee type\n        spv::Id typeId = builder.getContainedTypeId(builder.getTypeId(operands[0]));\n        assert(builder.isCooperativeVectorType(typeId));\n        // do the op\n        spv::Id result = builder.createOp(isMulAdd ? spv::Op::OpCooperativeVectorMatrixMulAddNV : spv::Op::OpCooperativeVectorMatrixMulNV, typeId, idImmOps);\n        // store the result to the pointer (out param 'res')\n        builder.createStore(result, operands[0]);\n        result = 0;\n    } else if (node->getOp() == glslang::EOpCooperativeVectorLoadNV) {\n        std::vector<spv::IdImmediate> idImmOps;\n\n        idImmOps.push_back(spv::IdImmediate(true, operands[1])); // buf\n        idImmOps.push_back(spv::IdImmediate(true, operands[2])); // offset\n        idImmOps.insert(idImmOps.end(), memoryAccessOperands.begin(), memoryAccessOperands.end());\n        // get the pointee type\n        spv::Id typeId = builder.getContainedTypeId(builder.getTypeId(operands[0]));\n        assert(builder.isCooperativeVectorType(typeId));\n        // do the op\n        spv::Id result = builder.createOp(spv::Op::OpCooperativeVectorLoadNV, typeId, idImmOps);\n        // store the result to the pointer (out param 'v')\n        builder.createStore(result, operands[0]);\n        result = 0;\n    } else if (node->getOp() == glslang::EOpCooperativeVectorStoreNV) {\n        std::vector<spv::IdImmediate> idImmOps;\n\n        idImmOps.push_back(spv::IdImmediate(true, operands[1])); // buf\n        idImmOps.push_back(spv::IdImmediate(true, operands[2])); // offset\n        idImmOps.push_back(spv::IdImmediate(true, operands[0])); // object\n        idImmOps.insert(idImmOps.end(), memoryAccessOperands.begin(), memoryAccessOperands.end());\n        builder.createNoResultOp(spv::Op::OpCooperativeVectorStoreNV, idImmOps);\n        result = 0;\n    } else if (node->getOp() == glslang::EOpCooperativeVectorOuterProductAccumulateNV) {\n        builder.addCapability(spv::Capability::CooperativeVectorTrainingNV);\n        builder.addExtension(spv::E_SPV_NV_cooperative_vector);\n\n        std::vector<spv::IdImmediate> idImmOps;\n\n        idImmOps.push_back(spv::IdImmediate(true, operands[2])); // Matrix\n        idImmOps.push_back(spv::IdImmediate(true, operands[3])); // Offset\n        idImmOps.push_back(spv::IdImmediate(true, operands[0])); // A\n        idImmOps.push_back(spv::IdImmediate(true, operands[1])); // B\n        idImmOps.push_back(spv::IdImmediate(true, operands[5])); // MemoryLayout\n        idImmOps.push_back(spv::IdImmediate(true, operands[6])); // MatrixInterpretation\n        idImmOps.push_back(spv::IdImmediate(true, operands[4])); // Stride\n        builder.createNoResultOp(spv::Op::OpCooperativeVectorOuterProductAccumulateNV, idImmOps);\n        result = 0;\n    } else if (node->getOp() == glslang::EOpCooperativeVectorReduceSumAccumulateNV) {\n        builder.addCapability(spv::Capability::CooperativeVectorTrainingNV);\n        builder.addExtension(spv::E_SPV_NV_cooperative_vector);\n\n        std::vector<spv::IdImmediate> idImmOps;\n\n        idImmOps.push_back(spv::IdImmediate(true, operands[1])); // Buf\n        idImmOps.push_back(spv::IdImmediate(true, operands[2])); // Offset\n        idImmOps.push_back(spv::IdImmediate(true, operands[0])); // A\n        builder.createNoResultOp(spv::Op::OpCooperativeVectorReduceSumAccumulateNV, idImmOps);\n        result = 0;\n    } else if (atomic) {\n        // Handle all atomics\n        glslang::TBasicType typeProxy = (node->getOp() == glslang::EOpAtomicStore)\n            ? node->getSequence()[0]->getAsTyped()->getBasicType() : node->getBasicType();\n        result = createAtomicOperation(node->getOp(), precision, resultType(), operands, typeProxy,\n            lvalueCoherentFlags, node->getType());\n    } else if (node->getOp() == glslang::EOpSpirvInst) {\n        const auto& spirvInst = node->getSpirvInstruction();\n        if (spirvInst.set == \"\") {\n            std::vector<spv::IdImmediate> idImmOps;\n            for (unsigned int i = 0; i < glslangOperands.size(); ++i) {\n                if (glslangOperands[i]->getAsTyped()->getQualifier().isSpirvLiteral()) {\n                    // Translate the constant to a literal value\n                    std::vector<unsigned> literals;\n                    glslang::TVector<const glslang::TIntermConstantUnion*> constants;\n                    constants.push_back(glslangOperands[i]->getAsConstantUnion());\n                    TranslateLiterals(constants, literals);\n                    idImmOps.push_back({false, literals[0]});\n                } else\n                    idImmOps.push_back({true, operands[i]});\n            }\n\n            if (node->getBasicType() == glslang::EbtVoid)\n                builder.createNoResultOp(static_cast<spv::Op>(spirvInst.id), idImmOps);\n            else\n                result = builder.createOp(static_cast<spv::Op>(spirvInst.id), resultType(), idImmOps);\n        } else {\n            result = builder.createBuiltinCall(\n                resultType(), spirvInst.set == \"GLSL.std.450\" ? stdBuiltins : getExtBuiltins(spirvInst.set.c_str()),\n                spirvInst.id, operands);\n        }\n        noReturnValue = node->getBasicType() == glslang::EbtVoid;\n    } else if (node->getOp() == glslang::EOpDebugPrintf) {\n        if (!nonSemanticDebugPrintf) {\n            nonSemanticDebugPrintf = builder.import(\"NonSemantic.DebugPrintf\");\n        }\n        result = builder.createBuiltinCall(builder.makeVoidType(), nonSemanticDebugPrintf, spv::NonSemanticDebugPrintfDebugPrintf, operands);\n        builder.addExtension(spv::E_SPV_KHR_non_semantic_info);\n    } else {\n        // Pass through to generic operations.\n        switch (glslangOperands.size()) {\n        case 0:\n            result = createNoArgOperation(node->getOp(), precision, resultType());\n            break;\n        case 1:\n            {\n                OpDecorations decorations = { precision,\n                                              TranslateNoContractionDecoration(node->getType().getQualifier()),\n                                              TranslateNonUniformDecoration(node->getType().getQualifier()) };\n                result = createUnaryOperation(\n                    node->getOp(), decorations,\n                    resultType(), operands.front(),\n                    glslangOperands[0]->getAsTyped()->getBasicType(), lvalueCoherentFlags, node->getType());\n            }\n            break;\n        default:\n            result = createMiscOperation(node->getOp(), precision, resultType(), operands, node->getBasicType());\n            break;\n        }\n\n        if (invertedType != spv::NoResult)\n            result = createInvertedSwizzle(precision, *glslangOperands[0]->getAsBinaryNode(), result);\n\n        for (unsigned int i = 0; i < temporaryLvalues.size(); ++i) {\n            builder.setAccessChain(complexLvalues[i]);\n            builder.accessChainStore(builder.createLoad(temporaryLvalues[i], spv::NoPrecision),\n                TranslateNonUniformDecoration(complexLvalues[i].coherentFlags));\n        }\n    }\n\n    if (noReturnValue)\n        return false;\n\n    if (! result) {\n        logger->missingFunctionality(\"unknown glslang aggregate\");\n        return true;  // pick up a child as a placeholder operand\n    } else {\n        builder.clearAccessChain();\n        builder.setAccessChainRValue(result);\n        return false;\n    }\n}\n\n// This path handles both if-then-else and ?:\n// The if-then-else has a node type of void, while\n// ?: has either a void or a non-void node type\n//\n// Leaving the result, when not void:\n// GLSL only has r-values as the result of a :?, but\n// if we have an l-value, that can be more efficient if it will\n// become the base of a complex r-value expression, because the\n// next layer copies r-values into memory to use the access-chain mechanism\nbool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang::TIntermSelection* node)\n{\n    // see if OpSelect can handle it\n    const auto isOpSelectable = [&]() {\n        if (node->getBasicType() == glslang::EbtVoid)\n            return false;\n        // OpSelect can do all other types starting with SPV 1.4\n        if (glslangIntermediate->getSpv().spv < glslang::EShTargetSpv_1_4) {\n            // pre-1.4, only scalars and vectors can be handled\n            if ((!node->getType().isScalar() && !node->getType().isVector()))\n                return false;\n        }\n        return true;\n    };\n\n    // See if it simple and safe, or required, to execute both sides.\n    // Crucially, side effects must be either semantically required or avoided,\n    // and there are performance trade-offs.\n    // Return true if required or a good idea (and safe) to execute both sides,\n    // false otherwise.\n    const auto bothSidesPolicy = [&]() -> bool {\n        // do we have both sides?\n        if (node->getTrueBlock()  == nullptr ||\n            node->getFalseBlock() == nullptr)\n            return false;\n\n        // required? (unless we write additional code to look for side effects\n        // and make performance trade-offs if none are present)\n        if (!node->getShortCircuit())\n            return true;\n\n        // if not required to execute both, decide based on performance/practicality...\n\n        if (!isOpSelectable())\n            return false;\n\n        assert(node->getType() == node->getTrueBlock() ->getAsTyped()->getType() &&\n               node->getType() == node->getFalseBlock()->getAsTyped()->getType());\n\n        // return true if a single operand to ? : is okay for OpSelect\n        const auto operandOkay = [](glslang::TIntermTyped* node) {\n            return node->getAsSymbolNode() || node->getType().getQualifier().isConstant();\n        };\n\n        return operandOkay(node->getTrueBlock() ->getAsTyped()) &&\n               operandOkay(node->getFalseBlock()->getAsTyped());\n    };\n\n    spv::Id result = spv::NoResult; // upcoming result selecting between trueValue and falseValue\n    // emit the condition before doing anything with selection\n    node->getCondition()->traverse(this);\n    spv::Id condition = accessChainLoad(node->getCondition()->getType());\n\n    // Find a way of executing both sides and selecting the right result.\n    const auto executeBothSides = [&]() -> void {\n        // execute both sides\n        spv::Id resultType = convertGlslangToSpvType(node->getType());\n        node->getTrueBlock()->traverse(this);\n        spv::Id trueValue = accessChainLoad(node->getTrueBlock()->getAsTyped()->getType());\n        node->getFalseBlock()->traverse(this);\n        spv::Id falseValue = accessChainLoad(node->getFalseBlock()->getAsTyped()->getType());\n\n        builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename());\n\n        // done if void\n        if (node->getBasicType() == glslang::EbtVoid)\n            return;\n\n        // emit code to select between trueValue and falseValue\n        // see if OpSelect can handle the result type, and that the SPIR-V types\n        // of the inputs match the result type.\n        if (isOpSelectable()) {\n            // Emit OpSelect for this selection.\n\n            // smear condition to vector, if necessary (AST is always scalar)\n            // Before 1.4, smear like for mix(), starting with 1.4, keep it scalar\n            if (glslangIntermediate->getSpv().spv < glslang::EShTargetSpv_1_4 && builder.isVector(trueValue)) {\n                condition = builder.smearScalar(spv::NoPrecision, condition,\n                                                builder.makeVectorType(builder.makeBoolType(),\n                                                                       builder.getNumComponents(trueValue)));\n            }\n\n            // If the types do not match, it is because of mismatched decorations on aggregates.\n            // Since isOpSelectable only lets us get here for SPIR-V >= 1.4, we can use OpCopyObject\n            // to get matching types.\n            if (builder.getTypeId(trueValue) != resultType) {\n                trueValue = builder.createUnaryOp(spv::Op::OpCopyLogical, resultType, trueValue);\n            }\n            if (builder.getTypeId(falseValue) != resultType) {\n                falseValue = builder.createUnaryOp(spv::Op::OpCopyLogical, resultType, falseValue);\n            }\n\n            // OpSelect\n            result = builder.createTriOp(spv::Op::OpSelect, resultType, condition, trueValue, falseValue);\n\n            builder.clearAccessChain();\n            builder.setAccessChainRValue(result);\n        } else {\n            // We need control flow to select the result.\n            // TODO: Once SPIR-V OpSelect allows arbitrary types, eliminate this path.\n            result = builder.createVariable(TranslatePrecisionDecoration(node->getType()),\n                spv::StorageClass::Function, resultType);\n\n            // Selection control:\n            const spv::SelectionControlMask control = TranslateSelectionControl(*node);\n\n            // make an \"if\" based on the value created by the condition\n            spv::Builder::If ifBuilder(condition, control, builder);\n\n            // emit the \"then\" statement\n            builder.clearAccessChain();\n            builder.setAccessChainLValue(result);\n            multiTypeStore(node->getType(), trueValue);\n\n            ifBuilder.makeBeginElse();\n            // emit the \"else\" statement\n            builder.clearAccessChain();\n            builder.setAccessChainLValue(result);\n            multiTypeStore(node->getType(), falseValue);\n\n            // finish off the control flow\n            ifBuilder.makeEndIf();\n\n            builder.clearAccessChain();\n            builder.setAccessChainLValue(result);\n        }\n    };\n\n    // Execute the one side needed, as per the condition\n    const auto executeOneSide = [&]() {\n        // Always emit control flow.\n        if (node->getBasicType() != glslang::EbtVoid) {\n            result = builder.createVariable(TranslatePrecisionDecoration(node->getType()), spv::StorageClass::Function,\n                convertGlslangToSpvType(node->getType()));\n        }\n\n        // Selection control:\n        const spv::SelectionControlMask control = TranslateSelectionControl(*node);\n\n        // make an \"if\" based on the value created by the condition\n        spv::Builder::If ifBuilder(condition, control, builder);\n\n        // emit the \"then\" statement\n        if (node->getTrueBlock() != nullptr) {\n            node->getTrueBlock()->traverse(this);\n            if (result != spv::NoResult) {\n                spv::Id load = accessChainLoad(node->getTrueBlock()->getAsTyped()->getType());\n\n                builder.clearAccessChain();\n                builder.setAccessChainLValue(result);\n                multiTypeStore(node->getType(), load);\n            }\n        }\n\n        if (node->getFalseBlock() != nullptr) {\n            ifBuilder.makeBeginElse();\n            // emit the \"else\" statement\n            node->getFalseBlock()->traverse(this);\n            if (result != spv::NoResult) {\n                spv::Id load = accessChainLoad(node->getFalseBlock()->getAsTyped()->getType());\n\n                builder.clearAccessChain();\n                builder.setAccessChainLValue(result);\n                multiTypeStore(node->getType(), load);\n            }\n        }\n\n        // finish off the control flow\n        ifBuilder.makeEndIf();\n\n        if (result != spv::NoResult) {\n            builder.clearAccessChain();\n            builder.setAccessChainLValue(result);\n        }\n    };\n\n    // Try for OpSelect (or a requirement to execute both sides)\n    if (bothSidesPolicy()) {\n        SpecConstantOpModeGuard spec_constant_op_mode_setter(&builder);\n        if (node->getType().getQualifier().isSpecConstant())\n            spec_constant_op_mode_setter.turnOnSpecConstantOpMode();\n        executeBothSides();\n    } else\n        executeOneSide();\n\n    return false;\n}\n\nbool TGlslangToSpvTraverser::visitSwitch(glslang::TVisit /* visit */, glslang::TIntermSwitch* node)\n{\n    // emit and get the condition before doing anything with switch\n    node->getCondition()->traverse(this);\n    spv::Id selector = accessChainLoad(node->getCondition()->getAsTyped()->getType());\n\n    // Selection control:\n    const spv::SelectionControlMask control = TranslateSwitchControl(*node);\n\n    // browse the children to sort out code segments\n    int defaultSegment = -1;\n    std::vector<TIntermNode*> codeSegments;\n    glslang::TIntermSequence& sequence = node->getBody()->getSequence();\n    std::vector<int> caseValues;\n    std::vector<int> valueIndexToSegment(sequence.size());  // note: probably not all are used, it is an overestimate\n    for (glslang::TIntermSequence::iterator c = sequence.begin(); c != sequence.end(); ++c) {\n        TIntermNode* child = *c;\n        if (child->getAsBranchNode() && child->getAsBranchNode()->getFlowOp() == glslang::EOpDefault)\n            defaultSegment = (int)codeSegments.size();\n        else if (child->getAsBranchNode() && child->getAsBranchNode()->getFlowOp() == glslang::EOpCase) {\n            valueIndexToSegment[caseValues.size()] = (int)codeSegments.size();\n            caseValues.push_back(child->getAsBranchNode()->getExpression()->getAsConstantUnion()\n                ->getConstArray()[0].getIConst());\n        } else\n            codeSegments.push_back(child);\n    }\n\n    // handle the case where the last code segment is missing, due to no code\n    // statements between the last case and the end of the switch statement\n    if ((caseValues.size() && (int)codeSegments.size() == valueIndexToSegment[caseValues.size() - 1]) ||\n        (int)codeSegments.size() == defaultSegment)\n        codeSegments.push_back(nullptr);\n\n    // make the switch statement\n    std::vector<spv::Block*> segmentBlocks; // returned, as the blocks allocated in the call\n    builder.makeSwitch(selector, control, (int)codeSegments.size(), caseValues, valueIndexToSegment, defaultSegment,\n        segmentBlocks);\n\n    // emit all the code in the segments\n    breakForLoop.push(false);\n    for (unsigned int s = 0; s < codeSegments.size(); ++s) {\n        builder.nextSwitchSegment(segmentBlocks, s);\n        if (codeSegments[s])\n            codeSegments[s]->traverse(this);\n        else\n            builder.addSwitchBreak(true);\n    }\n    breakForLoop.pop();\n\n    builder.endSwitch(segmentBlocks);\n\n    return false;\n}\n\nvoid TGlslangToSpvTraverser::visitConstantUnion(glslang::TIntermConstantUnion* node)\n{\n    if (node->getQualifier().isSpirvLiteral())\n        return; // Translated to a literal value, skip further processing\n\n    int nextConst = 0;\n    spv::Id constant = createSpvConstantFromConstUnionArray(node->getType(), node->getConstArray(), nextConst, false);\n\n    builder.clearAccessChain();\n    builder.setAccessChainRValue(constant);\n}\n\nbool TGlslangToSpvTraverser::visitLoop(glslang::TVisit /* visit */, glslang::TIntermLoop* node)\n{\n    auto blocks = builder.makeNewLoop();\n    builder.createBranch(true, &blocks.head);\n\n    // Loop control:\n    std::vector<unsigned int> operands;\n    const spv::LoopControlMask control = TranslateLoopControl(*node, operands);\n\n    // Spec requires back edges to target header blocks, and every header block\n    // must dominate its merge block.  Make a header block first to ensure these\n    // conditions are met.  By definition, it will contain OpLoopMerge, followed\n    // by a block-ending branch.  But we don't want to put any other body/test\n    // instructions in it, since the body/test may have arbitrary instructions,\n    // including merges of its own.\n    builder.setBuildPoint(&blocks.head);\n    builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename());\n    builder.createLoopMerge(&blocks.merge, &blocks.continue_target, control, operands);\n    if (node->testFirst() && node->getTest()) {\n        spv::Block& test = builder.makeNewBlock();\n        builder.createBranch(true, &test);\n\n        builder.setBuildPoint(&test);\n        node->getTest()->traverse(this);\n        spv::Id condition = accessChainLoad(node->getTest()->getType());\n        builder.createConditionalBranch(condition, &blocks.body, &blocks.merge);\n\n        builder.setBuildPoint(&blocks.body);\n        breakForLoop.push(true);\n        if (node->getBody())\n            node->getBody()->traverse(this);\n        builder.createBranch(true, &blocks.continue_target);\n        breakForLoop.pop();\n\n        builder.setBuildPoint(&blocks.continue_target);\n        if (node->getTerminal())\n            node->getTerminal()->traverse(this);\n        builder.createBranch(true, &blocks.head);\n    } else {\n        builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename());\n        builder.createBranch(true, &blocks.body);\n\n        breakForLoop.push(true);\n        builder.setBuildPoint(&blocks.body);\n        if (node->getBody())\n            node->getBody()->traverse(this);\n        builder.createBranch(true, &blocks.continue_target);\n        breakForLoop.pop();\n\n        builder.setBuildPoint(&blocks.continue_target);\n        if (node->getTerminal())\n            node->getTerminal()->traverse(this);\n        if (node->getTest()) {\n            node->getTest()->traverse(this);\n            spv::Id condition =\n                accessChainLoad(node->getTest()->getType());\n            builder.createConditionalBranch(condition, &blocks.head, &blocks.merge);\n        } else {\n            // TODO: unless there was a break/return/discard instruction\n            // somewhere in the body, this is an infinite loop, so we should\n            // issue a warning.\n            builder.createBranch(true, &blocks.head);\n        }\n    }\n    builder.setBuildPoint(&blocks.merge);\n    builder.closeLoop();\n    return false;\n}\n\nbool TGlslangToSpvTraverser::visitBranch(glslang::TVisit /* visit */, glslang::TIntermBranch* node)\n{\n    if (node->getExpression())\n        node->getExpression()->traverse(this);\n\n    builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename());\n\n    switch (node->getFlowOp()) {\n    case glslang::EOpKill:\n        if (glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_6) {\n            builder.addCapability(spv::Capability::DemoteToHelperInvocation);\n            builder.createNoResultOp(spv::Op::OpDemoteToHelperInvocationEXT);\n        } else {\n            builder.makeStatementTerminator(spv::Op::OpKill, \"post-discard\");\n        }\n        break;\n    case glslang::EOpTerminateInvocation:\n        builder.addExtension(spv::E_SPV_KHR_terminate_invocation);\n        builder.makeStatementTerminator(spv::Op::OpTerminateInvocation, \"post-terminate-invocation\");\n        break;\n    case glslang::EOpBreak:\n        if (breakForLoop.top())\n            builder.createLoopExit();\n        else\n            builder.addSwitchBreak(false);\n        break;\n    case glslang::EOpContinue:\n        builder.createLoopContinue();\n        break;\n    case glslang::EOpReturn:\n        if (node->getExpression() != nullptr) {\n            const glslang::TType& glslangReturnType = node->getExpression()->getType();\n            spv::Id returnId = accessChainLoad(glslangReturnType);\n            if (builder.getTypeId(returnId) != currentFunction->getReturnType() ||\n                TranslatePrecisionDecoration(glslangReturnType) != currentFunction->getReturnPrecision()) {\n                builder.clearAccessChain();\n                spv::Id copyId = builder.createVariable(currentFunction->getReturnPrecision(),\n                    spv::StorageClass::Function, currentFunction->getReturnType());\n                builder.setAccessChainLValue(copyId);\n                multiTypeStore(glslangReturnType, returnId);\n                returnId = builder.createLoad(copyId, currentFunction->getReturnPrecision());\n            }\n            builder.makeReturn(false, returnId);\n        } else\n            builder.makeReturn(false);\n\n        builder.clearAccessChain();\n        break;\n\n    case glslang::EOpDemote:\n        builder.createNoResultOp(spv::Op::OpDemoteToHelperInvocationEXT);\n        builder.addExtension(spv::E_SPV_EXT_demote_to_helper_invocation);\n        builder.addCapability(spv::Capability::DemoteToHelperInvocationEXT);\n        break;\n    case glslang::EOpTerminateRayKHR:\n        builder.makeStatementTerminator(spv::Op::OpTerminateRayKHR, \"post-terminateRayKHR\");\n        break;\n    case glslang::EOpIgnoreIntersectionKHR:\n        builder.makeStatementTerminator(spv::Op::OpIgnoreIntersectionKHR, \"post-ignoreIntersectionKHR\");\n        break;\n\n    default:\n        assert(0);\n        break;\n    }\n\n    return false;\n}\n\nspv::Id TGlslangToSpvTraverser::createSpvVariable(const glslang::TIntermSymbol* node, spv::Id forcedType)\n{\n    // First, steer off constants, which are not SPIR-V variables, but\n    // can still have a mapping to a SPIR-V Id.\n    // This includes specialization constants.\n    if (node->getQualifier().isConstant()) {\n        spv::Id result = createSpvConstant(*node);\n        if (result != spv::NoResult)\n            return result;\n    }\n\n    // Now, handle actual variables\n    spv::StorageClass storageClass = TranslateStorageClass(node->getType());\n    spv::Id spvType = forcedType == spv::NoType ? convertGlslangToSpvType(node->getType())\n                                                : forcedType;\n\n    const bool contains16BitType = node->getType().contains16BitFloat() ||\n                                   node->getType().contains16BitInt();\n    if (contains16BitType) {\n        switch (storageClass) {\n        case spv::StorageClass::Input:\n        case spv::StorageClass::Output:\n            builder.addIncorporatedExtension(spv::E_SPV_KHR_16bit_storage, spv::Spv_1_3);\n            builder.addCapability(spv::Capability::StorageInputOutput16);\n            break;\n        case spv::StorageClass::Uniform:\n            builder.addIncorporatedExtension(spv::E_SPV_KHR_16bit_storage, spv::Spv_1_3);\n            if (node->getType().getQualifier().storage == glslang::EvqBuffer)\n                builder.addCapability(spv::Capability::StorageUniformBufferBlock16);\n            else\n                builder.addCapability(spv::Capability::StorageUniform16);\n            break;\n        case spv::StorageClass::PushConstant:\n            builder.addIncorporatedExtension(spv::E_SPV_KHR_16bit_storage, spv::Spv_1_3);\n            builder.addCapability(spv::Capability::StoragePushConstant16);\n            break;\n        case spv::StorageClass::StorageBuffer:\n        case spv::StorageClass::PhysicalStorageBufferEXT:\n            builder.addIncorporatedExtension(spv::E_SPV_KHR_16bit_storage, spv::Spv_1_3);\n            builder.addCapability(spv::Capability::StorageUniformBufferBlock16);\n            break;\n        case spv::StorageClass::TileAttachmentQCOM:\n            builder.addCapability(spv::Capability::TileShadingQCOM);\n            break;\n        default:\n            if (storageClass == spv::StorageClass::Workgroup &&\n                node->getType().getBasicType() == glslang::EbtBlock) {\n                builder.addCapability(spv::Capability::WorkgroupMemoryExplicitLayout16BitAccessKHR);\n                break;\n            }\n            if (node->getType().contains16BitFloat())\n                builder.addCapability(spv::Capability::Float16);\n            if (node->getType().contains16BitInt())\n                builder.addCapability(spv::Capability::Int16);\n            break;\n        }\n    }\n\n    if (node->getType().contains8BitInt()) {\n        if (storageClass == spv::StorageClass::PushConstant) {\n            builder.addIncorporatedExtension(spv::E_SPV_KHR_8bit_storage, spv::Spv_1_5);\n            builder.addCapability(spv::Capability::StoragePushConstant8);\n        } else if (storageClass == spv::StorageClass::Uniform) {\n            builder.addIncorporatedExtension(spv::E_SPV_KHR_8bit_storage, spv::Spv_1_5);\n            builder.addCapability(spv::Capability::UniformAndStorageBuffer8BitAccess);\n        } else if (storageClass == spv::StorageClass::StorageBuffer) {\n            builder.addIncorporatedExtension(spv::E_SPV_KHR_8bit_storage, spv::Spv_1_5);\n            builder.addCapability(spv::Capability::StorageBuffer8BitAccess);\n        } else if (storageClass == spv::StorageClass::Workgroup &&\n                   node->getType().getBasicType() == glslang::EbtBlock) {\n            builder.addCapability(spv::Capability::WorkgroupMemoryExplicitLayout8BitAccessKHR);\n        } else {\n            builder.addCapability(spv::Capability::Int8);\n        }\n    }\n\n    const char* name = node->getName().c_str();\n    if (glslang::IsAnonymous(name))\n        name = \"\";\n\n    spv::Id initializer = spv::NoResult;\n\n    if (node->getType().getQualifier().storage == glslang::EvqUniform && !node->getConstArray().empty()) {\n        int nextConst = 0;\n        initializer = createSpvConstantFromConstUnionArray(node->getType(),\n                                                           node->getConstArray(),\n                                                           nextConst,\n                                                           false /* specConst */);\n    } else if (node->getType().getQualifier().isNullInit()) {\n        initializer = builder.makeNullConstant(spvType);\n    }\n\n    spv::Id var = builder.createVariable(spv::NoPrecision, storageClass, spvType, name, initializer, false);\n    std::vector<spv::Decoration> topLevelDecorations;\n    glslang::TQualifier typeQualifier = node->getType().getQualifier();\n    TranslateMemoryDecoration(typeQualifier, topLevelDecorations, glslangIntermediate->usingVulkanMemoryModel());\n    for (auto deco : topLevelDecorations) {\n        builder.addDecoration(var, deco);\n    }\n    return var;\n}\n\n// Return type Id of the sampled type.\nspv::Id TGlslangToSpvTraverser::getSampledType(const glslang::TSampler& sampler)\n{\n    switch (sampler.type) {\n        case glslang::EbtInt:      return builder.makeIntType(32);\n        case glslang::EbtUint:     return builder.makeUintType(32);\n        case glslang::EbtFloat:    return builder.makeFloatType(32);\n        case glslang::EbtFloat16:\n            builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float_fetch);\n            builder.addCapability(spv::Capability::Float16ImageAMD);\n            return builder.makeFloatType(16);\n        case glslang::EbtInt64:\n            builder.addExtension(spv::E_SPV_EXT_shader_image_int64);\n            builder.addCapability(spv::Capability::Int64ImageEXT);\n            return builder.makeIntType(64);\n        case glslang::EbtUint64:\n            builder.addExtension(spv::E_SPV_EXT_shader_image_int64);\n            builder.addCapability(spv::Capability::Int64ImageEXT);\n            return builder.makeUintType(64);\n        default:\n            assert(0);\n            return builder.makeFloatType(32);\n    }\n}\n\n// If node is a swizzle operation, return the type that should be used if\n// the swizzle base is first consumed by another operation, before the swizzle\n// is applied.\nspv::Id TGlslangToSpvTraverser::getInvertedSwizzleType(const glslang::TIntermTyped& node)\n{\n    if (node.getAsOperator() &&\n        node.getAsOperator()->getOp() == glslang::EOpVectorSwizzle)\n        return convertGlslangToSpvType(node.getAsBinaryNode()->getLeft()->getType());\n    else\n        return spv::NoType;\n}\n\n// When inverting a swizzle with a parent op, this function\n// will apply the swizzle operation to a completed parent operation.\nspv::Id TGlslangToSpvTraverser::createInvertedSwizzle(spv::Decoration precision, const glslang::TIntermTyped& node,\n    spv::Id parentResult)\n{\n    std::vector<unsigned> swizzle;\n    convertSwizzle(*node.getAsBinaryNode()->getRight()->getAsAggregate(), swizzle);\n    return builder.createRvalueSwizzle(precision, convertGlslangToSpvType(node.getType()), parentResult, swizzle);\n}\n\n// Convert a glslang AST swizzle node to a swizzle vector for building SPIR-V.\nvoid TGlslangToSpvTraverser::convertSwizzle(const glslang::TIntermAggregate& node, std::vector<unsigned>& swizzle)\n{\n    const glslang::TIntermSequence& swizzleSequence = node.getSequence();\n    for (int i = 0; i < (int)swizzleSequence.size(); ++i)\n        swizzle.push_back(swizzleSequence[i]->getAsConstantUnion()->getConstArray()[0].getIConst());\n}\n\n// Convert from a glslang type to an SPV type, by calling into a\n// recursive version of this function. This establishes the inherited\n// layout state rooted from the top-level type.\nspv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& type, bool forwardReferenceOnly)\n{\n    return convertGlslangToSpvType(type, getExplicitLayout(type), type.getQualifier(), false, forwardReferenceOnly);\n}\n\nspv::LinkageType TGlslangToSpvTraverser::convertGlslangLinkageToSpv(glslang::TLinkType linkType)\n{\n    switch (linkType) {\n    case glslang::ELinkExport:\n        return spv::LinkageType::Export;\n    default:\n        return spv::LinkageType::Max;\n    }\n}\n\n// Do full recursive conversion of an arbitrary glslang type to a SPIR-V Id.\n// explicitLayout can be kept the same throughout the hierarchical recursive walk.\n// Mutually recursive with convertGlslangStructToSpvType().\nspv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& type,\n    glslang::TLayoutPacking explicitLayout, const glslang::TQualifier& qualifier,\n    bool lastBufferBlockMember, bool forwardReferenceOnly)\n{\n    spv::Id spvType = spv::NoResult;\n\n    switch (type.getBasicType()) {\n    case glslang::EbtVoid:\n        spvType = builder.makeVoidType();\n        assert (! type.isArray());\n        break;\n    case glslang::EbtBool:\n        // \"transparent\" bool doesn't exist in SPIR-V.  The GLSL convention is\n        // a 32-bit int where non-0 means true.\n        if (explicitLayout != glslang::ElpNone)\n            spvType = builder.makeUintType(32);\n        else\n            spvType = builder.makeBoolType();\n        break;\n    case glslang::EbtInt:\n        spvType = builder.makeIntType(32);\n        break;\n    case glslang::EbtUint:\n        spvType = builder.makeUintType(32);\n        break;\n    case glslang::EbtFloat:\n        spvType = builder.makeFloatType(32);\n        break;\n    case glslang::EbtDouble:\n        spvType = builder.makeFloatType(64);\n        break;\n    case glslang::EbtFloat16:\n        spvType = builder.makeFloatType(16);\n        break;\n    case glslang::EbtBFloat16:\n        spvType = builder.makeBFloat16Type();\n        break;\n    case glslang::EbtFloatE5M2:\n        spvType = builder.makeFloatE5M2Type();\n        break;\n    case glslang::EbtFloatE4M3:\n        spvType = builder.makeFloatE4M3Type();\n        break;\n    case glslang::EbtInt8:\n        spvType = builder.makeIntType(8);\n        break;\n    case glslang::EbtUint8:\n        spvType = builder.makeUintType(8);\n        break;\n    case glslang::EbtInt16:\n        spvType = builder.makeIntType(16);\n        break;\n    case glslang::EbtUint16:\n        spvType = builder.makeUintType(16);\n        break;\n    case glslang::EbtInt64:\n        spvType = builder.makeIntType(64);\n        break;\n    case glslang::EbtUint64:\n        spvType = builder.makeUintType(64);\n        break;\n    case glslang::EbtAtomicUint:\n        builder.addCapability(spv::Capability::AtomicStorage);\n        spvType = builder.makeUintType(32);\n        break;\n    case glslang::EbtAccStruct:\n        switch (glslangIntermediate->getStage()) {\n        case EShLangRayGen:\n        case EShLangIntersect:\n        case EShLangAnyHit:\n        case EShLangClosestHit:\n        case EShLangMiss:\n        case EShLangCallable:\n            // these all should have the RayTracingNV/KHR capability already\n            break;\n        default:\n            {\n                auto& extensions = glslangIntermediate->getRequestedExtensions();\n                if (extensions.find(\"GL_EXT_ray_query\") != extensions.end()) {\n                    builder.addExtension(spv::E_SPV_KHR_ray_query);\n                    builder.addCapability(spv::Capability::RayQueryKHR);\n                }\n            }\n            break;\n        }\n        spvType = builder.makeAccelerationStructureType();\n        break;\n    case glslang::EbtRayQuery:\n        {\n            auto& extensions = glslangIntermediate->getRequestedExtensions();\n            if (extensions.find(\"GL_EXT_ray_query\") != extensions.end()) {\n                builder.addExtension(spv::E_SPV_KHR_ray_query);\n                builder.addCapability(spv::Capability::RayQueryKHR);\n            }\n            spvType = builder.makeRayQueryType();\n        }\n        break;\n    case glslang::EbtReference:\n        {\n            // Make the forward pointer, then recurse to convert the structure type, then\n            // patch up the forward pointer with a real pointer type.\n            if (forwardPointers.find(type.getReferentType()) == forwardPointers.end()) {\n                spv::Id forwardId = builder.makeForwardPointer(spv::StorageClass::PhysicalStorageBufferEXT);\n                forwardPointers[type.getReferentType()] = forwardId;\n            }\n            spvType = forwardPointers[type.getReferentType()];\n            if (!forwardReferenceOnly) {\n                spv::Id referentType = convertGlslangToSpvType(*type.getReferentType());\n                builder.makePointerFromForwardPointer(spv::StorageClass::PhysicalStorageBufferEXT,\n                                                      forwardPointers[type.getReferentType()],\n                                                      referentType);\n            }\n        }\n        break;\n    case glslang::EbtSampler:\n        {\n            const glslang::TSampler& sampler = type.getSampler();\n            if (sampler.isPureSampler()) {\n                spvType = builder.makeSamplerType();\n            } else {\n                // an image is present, make its type\n                spvType = builder.makeImageType(getSampledType(sampler), TranslateDimensionality(sampler),\n                                                sampler.isShadow(), sampler.isArrayed(), sampler.isMultiSample(),\n                                                sampler.isImageClass() ? 2 : 1, TranslateImageFormat(type));\n                if (sampler.isCombined() &&\n                    (!sampler.isBuffer() || glslangIntermediate->getSpv().spv < glslang::EShTargetSpv_1_6)) {\n                    // Already has both image and sampler, make the combined type. Only combine sampler to\n                    // buffer if before SPIR-V 1.6.\n                    spvType = builder.makeSampledImageType(spvType);\n                }\n            }\n        }\n        break;\n    case glslang::EbtStruct:\n    case glslang::EbtBlock:\n        {\n            // If we've seen this struct type, return it\n            const glslang::TTypeList* glslangMembers = type.getStruct();\n\n            // Try to share structs for different layouts, but not yet for other\n            // kinds of qualification (primarily not yet including interpolant qualification).\n            if (! HasNonLayoutQualifiers(type, qualifier))\n                spvType = structMap[explicitLayout][qualifier.layoutMatrix][glslangMembers];\n            if (spvType != spv::NoResult)\n                break;\n\n            // else, we haven't seen it...\n            if (type.getBasicType() == glslang::EbtBlock)\n                memberRemapper[glslangTypeToIdMap[glslangMembers]].resize(glslangMembers->size());\n            spvType = convertGlslangStructToSpvType(type, glslangMembers, explicitLayout, qualifier);\n        }\n        break;\n    case glslang::EbtString:\n        // no type used for OpString\n        return 0;\n\n    case glslang::EbtHitObjectNV: {\n        builder.addExtension(spv::E_SPV_NV_shader_invocation_reorder);\n        builder.addCapability(spv::Capability::ShaderInvocationReorderNV);\n        spvType = builder.makeHitObjectNVType();\n    }\n    break;\n    case glslang::EbtSpirvType: {\n        // GL_EXT_spirv_intrinsics\n        const auto& spirvType = type.getSpirvType();\n        const auto& spirvInst = spirvType.spirvInst;\n\n        std::vector<spv::IdImmediate> operands;\n        for (const auto& typeParam : spirvType.typeParams) {\n            if (typeParam.getAsConstant() != nullptr) {\n                // Constant expression\n                auto constant = typeParam.getAsConstant();\n                if (constant->isLiteral()) {\n                    if (constant->getBasicType() == glslang::EbtFloat) {\n                        float floatValue = static_cast<float>(constant->getConstArray()[0].getDConst());\n                        unsigned literal;\n                        static_assert(sizeof(literal) == sizeof(floatValue), \"sizeof(unsigned) != sizeof(float)\");\n                        memcpy(&literal, &floatValue, sizeof(literal));\n                        operands.push_back({false, literal});\n                    } else if (constant->getBasicType() == glslang::EbtInt) {\n                        unsigned literal = constant->getConstArray()[0].getIConst();\n                        operands.push_back({false, literal});\n                    } else if (constant->getBasicType() == glslang::EbtUint) {\n                        unsigned literal = constant->getConstArray()[0].getUConst();\n                        operands.push_back({false, literal});\n                    } else if (constant->getBasicType() == glslang::EbtBool) {\n                        unsigned literal = constant->getConstArray()[0].getBConst();\n                        operands.push_back({false, literal});\n                    } else if (constant->getBasicType() == glslang::EbtString) {\n                        auto str = constant->getConstArray()[0].getSConst()->c_str();\n                        unsigned literal = 0;\n                        char* literalPtr = reinterpret_cast<char*>(&literal);\n                        unsigned charCount = 0;\n                        char ch = 0;\n                        do {\n                            ch = *(str++);\n                            *(literalPtr++) = ch;\n                            ++charCount;\n                            if (charCount == 4) {\n                                operands.push_back({false, literal});\n                                literalPtr = reinterpret_cast<char*>(&literal);\n                                charCount = 0;\n                            }\n                        } while (ch != 0);\n\n                        // Partial literal is padded with 0\n                        if (charCount > 0) {\n                            for (; charCount < 4; ++charCount)\n                                *(literalPtr++) = 0;\n                            operands.push_back({false, literal});\n                        }\n                    } else\n                        assert(0); // Unexpected type\n                } else\n                    operands.push_back({true, createSpvConstant(*constant)});\n            } else {\n                // Type specifier\n                assert(typeParam.getAsType() != nullptr);\n                operands.push_back({true, convertGlslangToSpvType(*typeParam.getAsType())});\n            }\n        }\n\n        assert(spirvInst.set == \"\"); // Currently, couldn't be extended instructions.\n        spvType = builder.makeGenericType(static_cast<spv::Op>(spirvInst.id), operands);\n\n        break;\n    }\n    case glslang::EbtTensorLayoutNV:\n    {\n        builder.addCapability(spv::Capability::TensorAddressingNV);\n        builder.addExtension(spv::E_SPV_NV_tensor_addressing);\n\n        std::vector<spv::IdImmediate> operands;\n        for (uint32_t i = 0; i < 2; ++i) {\n            operands.push_back({true, makeArraySizeId(*type.getTypeParameters()->arraySizes, i, true)});\n        }\n        spvType = builder.makeGenericType(spv::Op::OpTypeTensorLayoutNV, operands);\n        break;\n    }\n    case glslang::EbtTensorViewNV:\n    {\n        builder.addCapability(spv::Capability::TensorAddressingNV);\n        builder.addExtension(spv::E_SPV_NV_tensor_addressing);\n\n        uint32_t dim = type.getTypeParameters()->arraySizes->getDimSize(0);\n        assert(dim >= 1 && dim <= 5);\n        std::vector<spv::IdImmediate> operands;\n        for (uint32_t i = 0; i < dim + 2; ++i) {\n            operands.push_back({true, makeArraySizeId(*type.getTypeParameters()->arraySizes, i, true, i==1)});\n        }\n        spvType = builder.makeGenericType(spv::Op::OpTypeTensorViewNV, operands);\n        break;\n    }\n    default:\n        assert(0);\n        break;\n    }\n\n    if (type.isMatrix())\n        spvType = builder.makeMatrixType(spvType, type.getMatrixCols(), type.getMatrixRows());\n    else {\n        // If this variable has a vector element count greater than 1, create a SPIR-V vector\n        if (type.getVectorSize() > 1)\n            spvType = builder.makeVectorType(spvType, type.getVectorSize());\n    }\n\n    if (type.isCoopMatNV()) {\n        builder.addCapability(spv::Capability::CooperativeMatrixNV);\n        builder.addExtension(spv::E_SPV_NV_cooperative_matrix);\n\n        if (type.getBasicType() == glslang::EbtFloat16)\n            builder.addCapability(spv::Capability::Float16);\n        if (type.getBasicType() == glslang::EbtUint8 ||\n            type.getBasicType() == glslang::EbtInt8) {\n            builder.addCapability(spv::Capability::Int8);\n        }\n\n        spv::Id scope = makeArraySizeId(*type.getTypeParameters()->arraySizes, 1);\n        spv::Id rows = makeArraySizeId(*type.getTypeParameters()->arraySizes, 2);\n        spv::Id cols = makeArraySizeId(*type.getTypeParameters()->arraySizes, 3);\n\n        spvType = builder.makeCooperativeMatrixTypeNV(spvType, scope, rows, cols);\n    }\n\n    if (type.isCoopMatKHR()) {\n        builder.addCapability(spv::Capability::CooperativeMatrixKHR);\n        builder.addExtension(spv::E_SPV_KHR_cooperative_matrix);\n\n        if (type.getBasicType() == glslang::EbtBFloat16) {\n            builder.addExtension(spv::E_SPV_KHR_bfloat16);\n            builder.addCapability(spv::Capability::BFloat16CooperativeMatrixKHR);\n        }\n\n        if (type.getBasicType() == glslang::EbtFloatE5M2 || type.getBasicType() == glslang::EbtFloatE4M3) {\n            builder.addExtension(spv::E_SPV_EXT_float8);\n            builder.addCapability(spv::Capability::Float8CooperativeMatrixEXT);\n        }\n\n        if (type.getBasicType() == glslang::EbtFloat16)\n            builder.addCapability(spv::Capability::Float16);\n        if (type.getBasicType() == glslang::EbtUint8 || type.getBasicType() == glslang::EbtInt8) {\n            builder.addCapability(spv::Capability::Int8);\n        }\n\n        spv::Id scope = makeArraySizeId(*type.getTypeParameters()->arraySizes, 0);\n        spv::Id rows = makeArraySizeId(*type.getTypeParameters()->arraySizes, 1);\n        spv::Id cols = makeArraySizeId(*type.getTypeParameters()->arraySizes, 2);\n        spv::Id use = builder.makeUintConstant(type.getCoopMatKHRuse());\n\n        spvType = builder.makeCooperativeMatrixTypeKHR(spvType, scope, rows, cols, use);\n    }\n\n    if (type.isCoopVecNV()) {\n        builder.addCapability(spv::Capability::CooperativeVectorNV);\n        builder.addExtension(spv::E_SPV_NV_cooperative_vector);\n\n        if (type.getBasicType() == glslang::EbtFloat16)\n            builder.addCapability(spv::Capability::Float16);\n        if (type.getBasicType() == glslang::EbtUint8 || type.getBasicType() == glslang::EbtInt8) {\n            builder.addCapability(spv::Capability::Int8);\n        }\n\n        spv::Id components = makeArraySizeId(*type.getTypeParameters()->arraySizes, 0);\n\n        spvType = builder.makeCooperativeVectorTypeNV(spvType, components);\n    }\n\n    if (type.isArray()) {\n        int stride = 0;  // keep this 0 unless doing an explicit layout; 0 will mean no decoration, no stride\n\n        // Do all but the outer dimension\n        if (type.getArraySizes()->getNumDims() > 1) {\n            // We need to decorate array strides for types needing explicit layout, except blocks.\n            if (explicitLayout != glslang::ElpNone && type.getBasicType() != glslang::EbtBlock) {\n                // Use a dummy glslang type for querying internal strides of\n                // arrays of arrays, but using just a one-dimensional array.\n                glslang::TType simpleArrayType(type, 0); // deference type of the array\n                while (simpleArrayType.getArraySizes()->getNumDims() > 1)\n                    simpleArrayType.getArraySizes()->dereference();\n\n                // Will compute the higher-order strides here, rather than making a whole\n                // pile of types and doing repetitive recursion on their contents.\n                stride = getArrayStride(simpleArrayType, explicitLayout, qualifier.layoutMatrix);\n            }\n\n            // make the arrays\n            for (int dim = type.getArraySizes()->getNumDims() - 1; dim > 0; --dim) {\n                spvType = builder.makeArrayType(spvType, makeArraySizeId(*type.getArraySizes(), dim), stride);\n                if (stride > 0)\n                    builder.addDecoration(spvType, spv::Decoration::ArrayStride, stride);\n                stride *= type.getArraySizes()->getDimSize(dim);\n            }\n        } else {\n            // single-dimensional array, and don't yet have stride\n\n            // We need to decorate array strides for types needing explicit layout, except blocks.\n            if (explicitLayout != glslang::ElpNone && type.getBasicType() != glslang::EbtBlock)\n                stride = getArrayStride(type, explicitLayout, qualifier.layoutMatrix);\n        }\n\n        // Do the outer dimension, which might not be known for a runtime-sized array.\n        // (Unsized arrays that survive through linking will be runtime-sized arrays)\n        if (type.isSizedArray())\n            spvType = builder.makeArrayType(spvType, makeArraySizeId(*type.getArraySizes(), 0), stride);\n        else {\n            if (!lastBufferBlockMember) {\n                builder.addIncorporatedExtension(\"SPV_EXT_descriptor_indexing\", spv::Spv_1_5);\n                builder.addCapability(spv::Capability::RuntimeDescriptorArrayEXT);\n            }\n            spvType = builder.makeRuntimeArray(spvType);\n        }\n        if (stride > 0)\n            builder.addDecoration(spvType, spv::Decoration::ArrayStride, stride);\n    }\n\n    return spvType;\n}\n\n// Apply SPIR-V decorations to the SPIR-V object (provided by SPIR-V ID). If member index is provided, the\n// decorations are applied to this member.\nvoid TGlslangToSpvTraverser::applySpirvDecorate(const glslang::TType& type, spv::Id id, std::optional<int> member)\n{\n    assert(type.getQualifier().hasSpirvDecorate());\n\n    const glslang::TSpirvDecorate& spirvDecorate = type.getQualifier().getSpirvDecorate();\n\n    // Add spirv_decorate\n    for (auto& decorate : spirvDecorate.decorates) {\n        if (!decorate.second.empty()) {\n            std::vector<unsigned> literals;\n            TranslateLiterals(decorate.second, literals);\n            if (member.has_value())\n                builder.addMemberDecoration(id, *member, static_cast<spv::Decoration>(decorate.first), literals);\n            else\n                builder.addDecoration(id, static_cast<spv::Decoration>(decorate.first), literals);\n        } else {\n            if (member.has_value())\n                builder.addMemberDecoration(id, *member, static_cast<spv::Decoration>(decorate.first));\n            else\n                builder.addDecoration(id, static_cast<spv::Decoration>(decorate.first));\n        }\n    }\n\n    // Add spirv_decorate_id\n    if (member.has_value()) {\n        // spirv_decorate_id not applied to members\n        assert(spirvDecorate.decorateIds.empty());\n    } else {\n        for (auto& decorateId : spirvDecorate.decorateIds) {\n            std::vector<spv::Id> operandIds;\n            assert(!decorateId.second.empty());\n            for (auto extraOperand : decorateId.second) {\n                if (extraOperand->getQualifier().isFrontEndConstant())\n                    operandIds.push_back(createSpvConstant(*extraOperand));\n                else\n                    operandIds.push_back(getSymbolId(extraOperand->getAsSymbolNode()));\n            }\n            builder.addDecorationId(id, static_cast<spv::Decoration>(decorateId.first), operandIds);\n        }\n    }\n\n    // Add spirv_decorate_string\n    for (auto& decorateString : spirvDecorate.decorateStrings) {\n        std::vector<const char*> strings;\n        assert(!decorateString.second.empty());\n        for (auto extraOperand : decorateString.second) {\n            const char* string = extraOperand->getConstArray()[0].getSConst()->c_str();\n            strings.push_back(string);\n        }\n        if (member.has_value())\n            builder.addMemberDecoration(id, *member, static_cast<spv::Decoration>(decorateString.first), strings);\n        else\n            builder.addDecoration(id, static_cast<spv::Decoration>(decorateString.first), strings);\n    }\n}\n\n// TODO: this functionality should exist at a higher level, in creating the AST\n//\n// Identify interface members that don't have their required extension turned on.\n//\nbool TGlslangToSpvTraverser::filterMember(const glslang::TType& member)\n{\n    auto& extensions = glslangIntermediate->getRequestedExtensions();\n\n    if (member.getFieldName() == \"gl_SecondaryViewportMaskNV\" &&\n        extensions.find(\"GL_NV_stereo_view_rendering\") == extensions.end())\n        return true;\n    if (member.getFieldName() == \"gl_SecondaryPositionNV\" &&\n        extensions.find(\"GL_NV_stereo_view_rendering\") == extensions.end())\n        return true;\n\n    if (glslangIntermediate->getStage() == EShLangMesh) {\n        if (member.getFieldName() == \"gl_PrimitiveShadingRateEXT\" &&\n            extensions.find(\"GL_EXT_fragment_shading_rate\") == extensions.end())\n            return true;\n    }\n\n    if (glslangIntermediate->getStage() != EShLangMesh) {\n        if (member.getFieldName() == \"gl_ViewportMask\" &&\n            extensions.find(\"GL_NV_viewport_array2\") == extensions.end())\n            return true;\n        if (member.getFieldName() == \"gl_PositionPerViewNV\" &&\n            extensions.find(\"GL_NVX_multiview_per_view_attributes\") == extensions.end())\n            return true;\n        if (member.getFieldName() == \"gl_ViewportMaskPerViewNV\" &&\n            extensions.find(\"GL_NVX_multiview_per_view_attributes\") == extensions.end())\n            return true;\n    }\n\n    return false;\n}\n\n// Do full recursive conversion of a glslang structure (or block) type to a SPIR-V Id.\n// explicitLayout can be kept the same throughout the hierarchical recursive walk.\n// Mutually recursive with convertGlslangToSpvType().\nspv::Id TGlslangToSpvTraverser::convertGlslangStructToSpvType(const glslang::TType& type,\n                                                              const glslang::TTypeList* glslangMembers,\n                                                              glslang::TLayoutPacking explicitLayout,\n                                                              const glslang::TQualifier& qualifier)\n{\n    // Create a vector of struct types for SPIR-V to consume\n    std::vector<spv::Id> spvMembers;\n    int memberDelta = 0;  // how much the member's index changes from glslang to SPIR-V, normally 0,\n                          // except sometimes for blocks\n    std::vector<std::pair<glslang::TType*, glslang::TQualifier> > deferredForwardPointers;\n    for (int i = 0; i < (int)glslangMembers->size(); i++) {\n        auto& glslangMember = (*glslangMembers)[i];\n        if (glslangMember.type->hiddenMember()) {\n            ++memberDelta;\n            if (type.getBasicType() == glslang::EbtBlock)\n                memberRemapper[glslangTypeToIdMap[glslangMembers]][i] = -1;\n        } else {\n            if (type.getBasicType() == glslang::EbtBlock) {\n                if (filterMember(*glslangMember.type)) {\n                    memberDelta++;\n                    memberRemapper[glslangTypeToIdMap[glslangMembers]][i] = -1;\n                    continue;\n                }\n                memberRemapper[glslangTypeToIdMap[glslangMembers]][i] = i - memberDelta;\n            }\n            // modify just this child's view of the qualifier\n            glslang::TQualifier memberQualifier = glslangMember.type->getQualifier();\n            InheritQualifiers(memberQualifier, qualifier);\n\n            // manually inherit location\n            if (! memberQualifier.hasLocation() && qualifier.hasLocation())\n                memberQualifier.layoutLocation = qualifier.layoutLocation;\n\n            // recurse\n            bool lastBufferBlockMember = qualifier.storage == glslang::EvqBuffer &&\n                                         i == (int)glslangMembers->size() - 1;\n\n            // Make forward pointers for any pointer members.\n            if (glslangMember.type->isReference() &&\n                forwardPointers.find(glslangMember.type->getReferentType()) == forwardPointers.end()) {\n                deferredForwardPointers.push_back(std::make_pair(glslangMember.type, memberQualifier));\n            }\n\n            // Create the member type.\n            auto const spvMember = convertGlslangToSpvType(*glslangMember.type, explicitLayout, memberQualifier, lastBufferBlockMember,\n                glslangMember.type->isReference());\n            spvMembers.push_back(spvMember);\n\n            // Update the builder with the type's location so that we can create debug types for the structure members.\n            // There doesn't exist a \"clean\" entry point for this information to be passed along to the builder so, for now,\n            // it is stored in the builder and consumed during the construction of composite debug types.\n            // TODO: This probably warrants further investigation. This approach was decided to be the least ugly of the\n            // quick and dirty approaches that were tried.\n            // Advantages of this approach:\n            //  + Relatively clean. No direct calls into debug type system.\n            //  + Handles nested recursive structures.\n            // Disadvantages of this approach:\n            //  + Not as clean as desired. Traverser queries/sets persistent state. This is fragile.\n            //  + Table lookup during creation of composite debug types. This really shouldn't be necessary.\n            if(options.emitNonSemanticShaderDebugInfo) {\n                builder.debugTypeLocs[spvMember].name = glslangMember.type->getFieldName().c_str();\n                builder.debugTypeLocs[spvMember].line = glslangMember.loc.line;\n                builder.debugTypeLocs[spvMember].column = glslangMember.loc.column;\n            }\n        }\n    }\n\n    // Make the SPIR-V type\n    spv::Id spvType = builder.makeStructType(spvMembers, type.getTypeName().c_str(), false);\n    if (! HasNonLayoutQualifiers(type, qualifier))\n        structMap[explicitLayout][qualifier.layoutMatrix][glslangMembers] = spvType;\n\n    // Decorate it\n    decorateStructType(type, glslangMembers, explicitLayout, qualifier, spvType, spvMembers);\n\n    for (int i = 0; i < (int)deferredForwardPointers.size(); ++i) {\n        auto it = deferredForwardPointers[i];\n        convertGlslangToSpvType(*it.first, explicitLayout, it.second, false);\n    }\n\n    return spvType;\n}\n\nvoid TGlslangToSpvTraverser::decorateStructType(const glslang::TType& type,\n                                                const glslang::TTypeList* glslangMembers,\n                                                glslang::TLayoutPacking explicitLayout,\n                                                const glslang::TQualifier& qualifier,\n                                                spv::Id spvType,\n                                                const std::vector<spv::Id>& spvMembers)\n{\n    // Name and decorate the non-hidden members\n    int offset = -1;\n    bool memberLocationInvalid = type.isArrayOfArrays() ||\n        (type.isArray() && (type.getQualifier().isArrayedIo(glslangIntermediate->getStage()) == false));\n    for (int i = 0; i < (int)glslangMembers->size(); i++) {\n        glslang::TType& glslangMember = *(*glslangMembers)[i].type;\n        int member = i;\n        if (type.getBasicType() == glslang::EbtBlock) {\n            member = memberRemapper[glslangTypeToIdMap[glslangMembers]][i];\n            if (filterMember(glslangMember))\n                continue;\n        }\n\n        // modify just this child's view of the qualifier\n        glslang::TQualifier memberQualifier = glslangMember.getQualifier();\n        InheritQualifiers(memberQualifier, qualifier);\n\n        // using -1 above to indicate a hidden member\n        if (member < 0)\n            continue;\n\n        builder.addMemberName(spvType, member, glslangMember.getFieldName().c_str());\n        builder.addMemberDecoration(spvType, member,\n                                    TranslateLayoutDecoration(glslangMember, memberQualifier.layoutMatrix));\n        builder.addMemberDecoration(spvType, member, TranslatePrecisionDecoration(glslangMember));\n        // Add interpolation and auxiliary storage decorations only to\n        // top-level members of Input and Output storage classes\n        if (type.getQualifier().storage == glslang::EvqVaryingIn ||\n            type.getQualifier().storage == glslang::EvqVaryingOut) {\n            if (type.getBasicType() == glslang::EbtBlock ||\n                glslangIntermediate->getSource() == glslang::EShSourceHlsl) {\n                builder.addMemberDecoration(spvType, member, TranslateInterpolationDecoration(memberQualifier));\n                builder.addMemberDecoration(spvType, member, TranslateAuxiliaryStorageDecoration(memberQualifier));\n                addMeshNVDecoration(spvType, member, memberQualifier);\n            }\n        }\n        builder.addMemberDecoration(spvType, member, TranslateInvariantDecoration(memberQualifier));\n\n        if (type.getBasicType() == glslang::EbtBlock &&\n            qualifier.storage == glslang::EvqBuffer) {\n            // Add memory decorations only to top-level members of shader storage block\n            std::vector<spv::Decoration> memory;\n            TranslateMemoryDecoration(memberQualifier, memory, glslangIntermediate->usingVulkanMemoryModel());\n            for (unsigned int i = 0; i < memory.size(); ++i)\n                builder.addMemberDecoration(spvType, member, memory[i]);\n        }\n\n        // Location assignment was already completed correctly by the front end,\n        // just track whether a member needs to be decorated.\n        // Ignore member locations if the container is an array, as that's\n        // ill-specified and decisions have been made to not allow this.\n        if (!memberLocationInvalid && memberQualifier.hasLocation())\n            builder.addMemberDecoration(spvType, member, spv::Decoration::Location, memberQualifier.layoutLocation);\n\n        // component, XFB, others\n        if (glslangMember.getQualifier().hasComponent())\n            builder.addMemberDecoration(spvType, member, spv::Decoration::Component,\n                                        glslangMember.getQualifier().layoutComponent);\n        if (glslangMember.getQualifier().hasXfbOffset())\n            builder.addMemberDecoration(spvType, member, spv::Decoration::Offset,\n                                        glslangMember.getQualifier().layoutXfbOffset);\n        else if (explicitLayout != glslang::ElpNone) {\n            // figure out what to do with offset, which is accumulating\n            int nextOffset;\n            updateMemberOffset(type, glslangMember, offset, nextOffset, explicitLayout, memberQualifier.layoutMatrix);\n            if (offset >= 0)\n                builder.addMemberDecoration(spvType, member, spv::Decoration::Offset, offset);\n            offset = nextOffset;\n        }\n\n        if (glslangMember.isMatrix() && explicitLayout != glslang::ElpNone)\n            builder.addMemberDecoration(spvType, member, spv::Decoration::MatrixStride,\n                                        getMatrixStride(glslangMember, explicitLayout, memberQualifier.layoutMatrix));\n\n        // built-in variable decorations\n        spv::BuiltIn builtIn = TranslateBuiltInDecoration(glslangMember.getQualifier().builtIn, true);\n        if (builtIn != spv::BuiltIn::Max)\n            builder.addMemberDecoration(spvType, member, spv::Decoration::BuiltIn, (int)builtIn);\n\n        // nonuniform\n        builder.addMemberDecoration(spvType, member, TranslateNonUniformDecoration(glslangMember.getQualifier()));\n\n        if (glslangIntermediate->getHlslFunctionality1() && memberQualifier.semanticName != nullptr) {\n            builder.addExtension(\"SPV_GOOGLE_hlsl_functionality1\");\n            builder.addMemberDecoration(spvType, member, spv::Decoration::HlslSemanticGOOGLE,\n                                        memberQualifier.semanticName);\n        }\n\n        if (builtIn == spv::BuiltIn::Layer) {\n            // SPV_NV_viewport_array2 extension\n            if (glslangMember.getQualifier().layoutViewportRelative){\n                builder.addMemberDecoration(spvType, member, spv::Decoration::ViewportRelativeNV);\n                builder.addCapability(spv::Capability::ShaderViewportMaskNV);\n                builder.addExtension(spv::E_SPV_NV_viewport_array2);\n            }\n            if (glslangMember.getQualifier().layoutSecondaryViewportRelativeOffset != -2048){\n                builder.addMemberDecoration(spvType, member,\n                                            spv::Decoration::SecondaryViewportRelativeNV,\n                                            glslangMember.getQualifier().layoutSecondaryViewportRelativeOffset);\n                builder.addCapability(spv::Capability::ShaderStereoViewNV);\n                builder.addExtension(spv::E_SPV_NV_stereo_view_rendering);\n            }\n        }\n        if (glslangMember.getQualifier().layoutPassthrough) {\n            builder.addMemberDecoration(spvType, member, spv::Decoration::PassthroughNV);\n            builder.addCapability(spv::Capability::GeometryShaderPassthroughNV);\n            builder.addExtension(spv::E_SPV_NV_geometry_shader_passthrough);\n        }\n\n        // Add SPIR-V decorations (GL_EXT_spirv_intrinsics)\n        if (glslangMember.getQualifier().hasSpirvDecorate())\n            applySpirvDecorate(glslangMember, spvType, member);\n    }\n\n    // Decorate the structure\n    builder.addDecoration(spvType, TranslateLayoutDecoration(type, qualifier.layoutMatrix));\n    const auto basicType = type.getBasicType();\n    const auto typeStorageQualifier = type.getQualifier().storage;\n    if (basicType == glslang::EbtBlock) {\n        builder.addDecoration(spvType, TranslateBlockDecoration(typeStorageQualifier, glslangIntermediate->usingStorageBuffer()));\n    } else if (basicType == glslang::EbtStruct && glslangIntermediate->getSpv().vulkan > 0) {\n        const auto hasRuntimeArray = !spvMembers.empty() && builder.getOpCode(spvMembers.back()) == spv::Op::OpTypeRuntimeArray;\n        if (hasRuntimeArray) {\n            builder.addDecoration(spvType, TranslateBlockDecoration(typeStorageQualifier, glslangIntermediate->usingStorageBuffer()));\n        }\n    }\n\n    if (qualifier.hasHitObjectShaderRecordNV())\n        builder.addDecoration(spvType, spv::Decoration::HitObjectShaderRecordBufferNV);\n}\n\n// Turn the expression forming the array size into an id.\n// This is not quite trivial, because of specialization constants.\n// Sometimes, a raw constant is turned into an Id, and sometimes\n// a specialization constant expression is.\nspv::Id TGlslangToSpvTraverser::makeArraySizeId(const glslang::TArraySizes& arraySizes, int dim, bool allowZero, bool boolType)\n{\n    // First, see if this is sized with a node, meaning a specialization constant:\n    glslang::TIntermTyped* specNode = arraySizes.getDimNode(dim);\n    if (specNode != nullptr) {\n        builder.clearAccessChain();\n        SpecConstantOpModeGuard spec_constant_op_mode_setter(&builder);\n        spec_constant_op_mode_setter.turnOnSpecConstantOpMode();\n        specNode->traverse(this);\n        return accessChainLoad(specNode->getAsTyped()->getType());\n    }\n\n    // Otherwise, need a compile-time (front end) size, get it:\n    int size = arraySizes.getDimSize(dim);\n\n    if (!allowZero)\n        assert(size > 0);\n\n    if (boolType) {\n        return builder.makeBoolConstant(size);\n    } else {\n        return builder.makeUintConstant(size);\n    }\n}\n\n// Wrap the builder's accessChainLoad to:\n//  - localize handling of RelaxedPrecision\n//  - use the SPIR-V inferred type instead of another conversion of the glslang type\n//    (avoids unnecessary work and possible type punning for structures)\n//  - do conversion of concrete to abstract type\nspv::Id TGlslangToSpvTraverser::accessChainLoad(const glslang::TType& type)\n{\n    spv::Id nominalTypeId = builder.accessChainGetInferredType();\n\n    spv::Builder::AccessChain::CoherentFlags coherentFlags = builder.getAccessChain().coherentFlags;\n    coherentFlags |= TranslateCoherent(type);\n\n    spv::MemoryAccessMask accessMask = spv::MemoryAccessMask(TranslateMemoryAccess(coherentFlags) & ~spv::MemoryAccessMask::MakePointerAvailableKHR);\n    // If the value being loaded is HelperInvocation, SPIR-V 1.6 is being generated (so that\n    // SPV_EXT_demote_to_helper_invocation is in core) and the memory model is in use, add\n    // the Volatile MemoryAccess semantic.\n    if (type.getQualifier().builtIn == glslang::EbvHelperInvocation &&\n        glslangIntermediate->usingVulkanMemoryModel() &&\n        glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_6) {\n        accessMask = spv::MemoryAccessMask(accessMask | spv::MemoryAccessMask::Volatile);\n    }\n\n    unsigned int alignment = builder.getAccessChain().alignment;\n    alignment |= type.getBufferReferenceAlignment();\n\n    spv::Id loadedId = builder.accessChainLoad(TranslatePrecisionDecoration(type),\n        TranslateNonUniformDecoration(builder.getAccessChain().coherentFlags),\n        TranslateNonUniformDecoration(type.getQualifier()),\n        nominalTypeId,\n        accessMask,\n        TranslateMemoryScope(coherentFlags),\n        alignment);\n\n    // Need to convert to abstract types when necessary\n    if (type.getBasicType() == glslang::EbtBool) {\n        loadedId = convertLoadedBoolInUniformToUint(type, nominalTypeId, loadedId);\n    }\n\n    return loadedId;\n}\n\n// Wrap the builder's accessChainStore to:\n//  - do conversion of concrete to abstract type\n//\n// Implicitly uses the existing builder.accessChain as the storage target.\nvoid TGlslangToSpvTraverser::accessChainStore(const glslang::TType& type, spv::Id rvalue)\n{\n    // Need to convert to abstract types when necessary\n    if (type.getBasicType() == glslang::EbtBool) {\n        spv::Id nominalTypeId = builder.accessChainGetInferredType();\n\n        if (builder.isScalarType(nominalTypeId)) {\n            // Conversion for bool\n            spv::Id boolType = builder.makeBoolType();\n            if (nominalTypeId != boolType) {\n                // keep these outside arguments, for determinant order-of-evaluation\n                spv::Id one = builder.makeUintConstant(1);\n                spv::Id zero = builder.makeUintConstant(0);\n                rvalue = builder.createTriOp(spv::Op::OpSelect, nominalTypeId, rvalue, one, zero);\n            } else if (builder.getTypeId(rvalue) != boolType)\n                rvalue = builder.createBinOp(spv::Op::OpINotEqual, boolType, rvalue, builder.makeUintConstant(0));\n        } else if (builder.isVectorType(nominalTypeId)) {\n            // Conversion for bvec\n            int vecSize = builder.getNumTypeComponents(nominalTypeId);\n            spv::Id bvecType = builder.makeVectorType(builder.makeBoolType(), vecSize);\n            if (nominalTypeId != bvecType) {\n                // keep these outside arguments, for determinant order-of-evaluation\n                spv::Id one = makeSmearedConstant(builder.makeUintConstant(1), vecSize);\n                spv::Id zero = makeSmearedConstant(builder.makeUintConstant(0), vecSize);\n                rvalue = builder.createTriOp(spv::Op::OpSelect, nominalTypeId, rvalue, one, zero);\n            } else if (builder.getTypeId(rvalue) != bvecType)\n                rvalue = builder.createBinOp(spv::Op::OpINotEqual, bvecType, rvalue,\n                                             makeSmearedConstant(builder.makeUintConstant(0), vecSize));\n        }\n    }\n\n    spv::Builder::AccessChain::CoherentFlags coherentFlags = builder.getAccessChain().coherentFlags;\n    coherentFlags |= TranslateCoherent(type);\n\n    unsigned int alignment = builder.getAccessChain().alignment;\n    alignment |= type.getBufferReferenceAlignment();\n\n    builder.accessChainStore(rvalue, TranslateNonUniformDecoration(builder.getAccessChain().coherentFlags),\n                             spv::MemoryAccessMask(TranslateMemoryAccess(coherentFlags) &\n                                ~spv::MemoryAccessMask::MakePointerVisibleKHR),\n                             TranslateMemoryScope(coherentFlags), alignment);\n}\n\n// For storing when types match at the glslang level, but not might match at the\n// SPIR-V level.\n//\n// This especially happens when a single glslang type expands to multiple\n// SPIR-V types, like a struct that is used in a member-undecorated way as well\n// as in a member-decorated way.\n//\n// NOTE: This function can handle any store request; if it's not special it\n// simplifies to a simple OpStore.\n//\n// Implicitly uses the existing builder.accessChain as the storage target.\nvoid TGlslangToSpvTraverser::multiTypeStore(const glslang::TType& type, spv::Id rValue)\n{\n    // we only do the complex path here if it's an aggregate\n    if (! type.isStruct() && ! type.isArray()) {\n        accessChainStore(type, rValue);\n        return;\n    }\n\n    // and, it has to be a case of type aliasing\n    spv::Id rType = builder.getTypeId(rValue);\n    spv::Id lValue = builder.accessChainGetLValue();\n    spv::Id lType = builder.getContainedTypeId(builder.getTypeId(lValue));\n    if (lType == rType) {\n        accessChainStore(type, rValue);\n        return;\n    }\n\n    // Recursively (as needed) copy an aggregate type to a different aggregate type,\n    // where the two types were the same type in GLSL. This requires member\n    // by member copy, recursively.\n\n    // SPIR-V 1.4 added an instruction to do help do this.\n    if (glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_4) {\n        // However, bool in uniform space is changed to int, so\n        // OpCopyLogical does not work for that.\n        // TODO: It would be more robust to do a full recursive verification of the types satisfying SPIR-V rules.\n        bool rBool = builder.containsType(builder.getTypeId(rValue), spv::Op::OpTypeBool, 0);\n        bool lBool = builder.containsType(lType, spv::Op::OpTypeBool, 0);\n        if (lBool == rBool) {\n            spv::Id logicalCopy = builder.createUnaryOp(spv::Op::OpCopyLogical, lType, rValue);\n            accessChainStore(type, logicalCopy);\n            return;\n        }\n    }\n\n    // If an array, copy element by element.\n    if (type.isArray()) {\n        glslang::TType glslangElementType(type, 0);\n        spv::Id elementRType = builder.getContainedTypeId(rType);\n        for (int index = 0; index < type.getOuterArraySize(); ++index) {\n            // get the source member\n            spv::Id elementRValue = builder.createCompositeExtract(rValue, elementRType, index);\n\n            // set up the target storage\n            builder.clearAccessChain();\n            builder.setAccessChainLValue(lValue);\n            builder.accessChainPush(builder.makeIntConstant(index), TranslateCoherent(type),\n                type.getBufferReferenceAlignment());\n\n            // store the member\n            multiTypeStore(glslangElementType, elementRValue);\n        }\n    } else {\n        assert(type.isStruct());\n\n        // loop over structure members\n        const glslang::TTypeList& members = *type.getStruct();\n        for (int m = 0; m < (int)members.size(); ++m) {\n            const glslang::TType& glslangMemberType = *members[m].type;\n\n            // get the source member\n            spv::Id memberRType = builder.getContainedTypeId(rType, m);\n            spv::Id memberRValue = builder.createCompositeExtract(rValue, memberRType, m);\n\n            // set up the target storage\n            builder.clearAccessChain();\n            builder.setAccessChainLValue(lValue);\n            builder.accessChainPush(builder.makeIntConstant(m), TranslateCoherent(type),\n                type.getBufferReferenceAlignment());\n\n            // store the member\n            multiTypeStore(glslangMemberType, memberRValue);\n        }\n    }\n}\n\n// Decide whether or not this type should be\n// decorated with offsets and strides, and if so\n// whether std140 or std430 rules should be applied.\nglslang::TLayoutPacking TGlslangToSpvTraverser::getExplicitLayout(const glslang::TType& type) const\n{\n    // has to be a block\n    if (type.getBasicType() != glslang::EbtBlock)\n        return glslang::ElpNone;\n\n    // has to be a uniform or buffer block or task in/out blocks\n    if (type.getQualifier().storage != glslang::EvqUniform &&\n        type.getQualifier().storage != glslang::EvqBuffer &&\n        type.getQualifier().storage != glslang::EvqShared &&\n        !type.getQualifier().isTaskMemory())\n        return glslang::ElpNone;\n\n    // return the layout to use\n    switch (type.getQualifier().layoutPacking) {\n    case glslang::ElpStd140:\n    case glslang::ElpStd430:\n    case glslang::ElpScalar:\n        return type.getQualifier().layoutPacking;\n    default:\n        return glslang::ElpNone;\n    }\n}\n\n// Given an array type, returns the integer stride required for that array\nint TGlslangToSpvTraverser::getArrayStride(const glslang::TType& arrayType, glslang::TLayoutPacking explicitLayout,\n    glslang::TLayoutMatrix matrixLayout)\n{\n    int size;\n    int stride;\n    glslangIntermediate->getMemberAlignment(arrayType, size, stride, explicitLayout,\n        matrixLayout == glslang::ElmRowMajor);\n\n    return stride;\n}\n\n// Given a matrix type, or array (of array) of matrixes type, returns the integer stride required for that matrix\n// when used as a member of an interface block\nint TGlslangToSpvTraverser::getMatrixStride(const glslang::TType& matrixType, glslang::TLayoutPacking explicitLayout,\n    glslang::TLayoutMatrix matrixLayout)\n{\n    glslang::TType elementType;\n    elementType.shallowCopy(matrixType);\n    elementType.clearArraySizes();\n\n    int size;\n    int stride;\n    glslangIntermediate->getMemberAlignment(elementType, size, stride, explicitLayout,\n        matrixLayout == glslang::ElmRowMajor);\n\n    return stride;\n}\n\n// Given a member type of a struct, realign the current offset for it, and compute\n// the next (not yet aligned) offset for the next member, which will get aligned\n// on the next call.\n// 'currentOffset' should be passed in already initialized, ready to modify, and reflecting\n// the migration of data from nextOffset -> currentOffset.  It should be -1 on the first call.\n// -1 means a non-forced member offset (no decoration needed).\nvoid TGlslangToSpvTraverser::updateMemberOffset(const glslang::TType& structType, const glslang::TType& memberType,\n    int& currentOffset, int& nextOffset, glslang::TLayoutPacking explicitLayout, glslang::TLayoutMatrix matrixLayout)\n{\n    // this will get a positive value when deemed necessary\n    nextOffset = -1;\n\n    // override anything in currentOffset with user-set offset\n    if (memberType.getQualifier().hasOffset())\n        currentOffset = memberType.getQualifier().layoutOffset;\n\n    // It could be that current linker usage in glslang updated all the layoutOffset,\n    // in which case the following code does not matter.  But, that's not quite right\n    // once cross-compilation unit GLSL validation is done, as the original user\n    // settings are needed in layoutOffset, and then the following will come into play.\n\n    if (explicitLayout == glslang::ElpNone) {\n        if (! memberType.getQualifier().hasOffset())\n            currentOffset = -1;\n\n        return;\n    }\n\n    // Getting this far means we need explicit offsets\n    if (currentOffset < 0)\n        currentOffset = 0;\n\n    // Now, currentOffset is valid (either 0, or from a previous nextOffset),\n    // but possibly not yet correctly aligned.\n\n    int memberSize;\n    int dummyStride;\n    int memberAlignment = glslangIntermediate->getMemberAlignment(memberType, memberSize, dummyStride, explicitLayout,\n        matrixLayout == glslang::ElmRowMajor);\n\n    bool isVectorLike = memberType.isVector();\n    if (memberType.isMatrix()) {\n        if (matrixLayout == glslang::ElmRowMajor)\n            isVectorLike = memberType.getMatrixRows() == 1;\n        else\n            isVectorLike = memberType.getMatrixCols() == 1;\n    }\n\n    // Adjust alignment for HLSL rules\n    // TODO: make this consistent in early phases of code:\n    //       adjusting this late means inconsistencies with earlier code, which for reflection is an issue\n    // Until reflection is brought in sync with these adjustments, don't apply to $Global,\n    // which is the most likely to rely on reflection, and least likely to rely implicit layouts\n    if (glslangIntermediate->usingHlslOffsets() &&\n        ! memberType.isStruct() && structType.getTypeName().compare(\"$Global\") != 0) {\n        int componentSize;\n        int componentAlignment = glslangIntermediate->getBaseAlignmentScalar(memberType, componentSize);\n        if (! memberType.isArray() && isVectorLike && componentAlignment <= 4)\n            memberAlignment = componentAlignment;\n\n        // Don't add unnecessary padding after this member\n        // (undo std140 bumping size to a mutliple of vec4)\n        if (explicitLayout == glslang::ElpStd140) {\n            if (memberType.isMatrix()) {\n                if (matrixLayout == glslang::ElmRowMajor)\n                    memberSize -= componentSize * (4 - memberType.getMatrixCols());\n                else\n                    memberSize -= componentSize * (4 - memberType.getMatrixRows());\n            } else if (memberType.isArray())\n                memberSize -= componentSize * (4 - memberType.getVectorSize());\n        }\n    }\n\n    // Bump up to member alignment\n    glslang::RoundToPow2(currentOffset, memberAlignment);\n\n    // Bump up to vec4 if there is a bad straddle\n    if (explicitLayout != glslang::ElpScalar && glslangIntermediate->improperStraddle(memberType, memberSize,\n        currentOffset, isVectorLike))\n        glslang::RoundToPow2(currentOffset, 16);\n\n    nextOffset = currentOffset + memberSize;\n}\n\nvoid TGlslangToSpvTraverser::declareUseOfStructMember(const glslang::TTypeList& members, int glslangMember)\n{\n    const glslang::TBuiltInVariable glslangBuiltIn = members[glslangMember].type->getQualifier().builtIn;\n    switch (glslangBuiltIn)\n    {\n    case glslang::EbvPointSize:\n    case glslang::EbvClipDistance:\n    case glslang::EbvCullDistance:\n    case glslang::EbvViewportMaskNV:\n    case glslang::EbvSecondaryPositionNV:\n    case glslang::EbvSecondaryViewportMaskNV:\n    case glslang::EbvPositionPerViewNV:\n    case glslang::EbvViewportMaskPerViewNV:\n    case glslang::EbvTaskCountNV:\n    case glslang::EbvPrimitiveCountNV:\n    case glslang::EbvPrimitiveIndicesNV:\n    case glslang::EbvClipDistancePerViewNV:\n    case glslang::EbvCullDistancePerViewNV:\n    case glslang::EbvLayerPerViewNV:\n    case glslang::EbvMeshViewCountNV:\n    case glslang::EbvMeshViewIndicesNV:\n        // Generate the associated capability.  Delegate to TranslateBuiltInDecoration.\n        // Alternately, we could just call this for any glslang built-in, since the\n        // capability already guards against duplicates.\n        TranslateBuiltInDecoration(glslangBuiltIn, false);\n        break;\n    default:\n        // Capabilities were already generated when the struct was declared.\n        break;\n    }\n}\n\nbool TGlslangToSpvTraverser::isShaderEntryPoint(const glslang::TIntermAggregate* node)\n{\n    return node->getName().compare(glslangIntermediate->getEntryPointMangledName().c_str()) == 0;\n}\n\n// Does parameter need a place to keep writes, separate from the original?\n// Assumes called after originalParam(), which filters out block/buffer/opaque-based\n// qualifiers such that we should have only in/out/inout/constreadonly here.\nbool TGlslangToSpvTraverser::writableParam(glslang::TStorageQualifier qualifier) const\n{\n    assert(qualifier == glslang::EvqIn ||\n           qualifier == glslang::EvqOut ||\n           qualifier == glslang::EvqInOut ||\n           qualifier == glslang::EvqUniform ||\n           qualifier == glslang::EvqConstReadOnly);\n    return qualifier != glslang::EvqConstReadOnly &&\n           qualifier != glslang::EvqUniform;\n}\n\n// Is parameter pass-by-original?\nbool TGlslangToSpvTraverser::originalParam(glslang::TStorageQualifier qualifier, const glslang::TType& paramType,\n                                           bool implicitThisParam)\n{\n    if (implicitThisParam)                                                                     // implicit this\n        return true;\n    if (glslangIntermediate->getSource() == glslang::EShSourceHlsl)\n        return paramType.getBasicType() == glslang::EbtBlock;\n    return (paramType.containsOpaque() && !glslangIntermediate->getBindlessMode()) ||       // sampler, etc.\n           paramType.getQualifier().isSpirvByReference() ||                                    // spirv_by_reference\n           (paramType.getBasicType() == glslang::EbtBlock && qualifier == glslang::EvqBuffer); // SSBO\n}\n\n// Make all the functions, skeletally, without actually visiting their bodies.\nvoid TGlslangToSpvTraverser::makeFunctions(const glslang::TIntermSequence& glslFunctions)\n{\n    const auto getParamDecorations = [&](std::vector<spv::Decoration>& decorations, const glslang::TType& type,\n        bool useVulkanMemoryModel) {\n        spv::Decoration paramPrecision = TranslatePrecisionDecoration(type);\n        if (paramPrecision != spv::NoPrecision)\n            decorations.push_back(paramPrecision);\n        TranslateMemoryDecoration(type.getQualifier(), decorations, useVulkanMemoryModel);\n        if (type.isReference()) {\n            // Original and non-writable params pass the pointer directly and\n            // use restrict/aliased, others are stored to a pointer in Function\n            // memory and use RestrictPointer/AliasedPointer.\n            if (originalParam(type.getQualifier().storage, type, false) ||\n                !writableParam(type.getQualifier().storage)) {\n                // TranslateMemoryDecoration added Restrict decoration already.\n                if (!type.getQualifier().isRestrict()) {\n                    decorations.push_back(spv::Decoration::Aliased);\n                }\n            } else {\n                decorations.push_back(type.getQualifier().isRestrict() ? spv::Decoration::RestrictPointerEXT :\n                                                                         spv::Decoration::AliasedPointerEXT);\n            }\n        }\n    };\n\n    for (int f = 0; f < (int)glslFunctions.size(); ++f) {\n        glslang::TIntermAggregate* glslFunction = glslFunctions[f]->getAsAggregate();\n        if (! glslFunction || glslFunction->getOp() != glslang::EOpFunction)\n            continue;\n\n        builder.setDebugSourceLocation(glslFunction->getLoc().line, glslFunction->getLoc().getFilename());\n\n        if (isShaderEntryPoint(glslFunction)) {\n            // For HLSL, the entry function is actually a compiler generated function to resolve the difference of\n            // entry function signature between HLSL and SPIR-V. So we don't emit debug information for that.\n            if (glslangIntermediate->getSource() != glslang::EShSourceHlsl) {\n                builder.setupFunctionDebugInfo(shaderEntry, glslangIntermediate->getEntryPointMangledName().c_str(),\n                                               std::vector<spv::Id>(), // main function has no param\n                                               std::vector<char const*>());\n            }\n            continue;\n        }\n        // We're on a user function.  Set up the basic interface for the function now,\n        // so that it's available to call.  Translating the body will happen later.\n        //\n        // Typically (except for a \"const in\" parameter), an address will be passed to the\n        // function.  What it is an address of varies:\n        //\n        // - \"in\" parameters not marked as \"const\" can be written to without modifying the calling\n        //   argument so that write needs to be to a copy, hence the address of a copy works.\n        //\n        // - \"const in\" parameters can just be the r-value, as no writes need occur.\n        //\n        // - \"out\" and \"inout\" arguments can't be done as pointers to the calling argument, because\n        //   GLSL has copy-in/copy-out semantics.  They can be handled though with a pointer to a copy.\n\n        std::vector<spv::Id> paramTypes;\n        std::vector<char const*> paramNames;\n        std::vector<std::vector<spv::Decoration>> paramDecorations; // list of decorations per parameter\n        glslang::TIntermSequence& parameters = glslFunction->getSequence()[0]->getAsAggregate()->getSequence();\n\n#ifdef ENABLE_HLSL\n        bool implicitThis = (int)parameters.size() > 0 && parameters[0]->getAsSymbolNode()->getName() ==\n                                                          glslangIntermediate->implicitThisName;\n#else\n        bool implicitThis = false;\n#endif\n\n        paramDecorations.resize(parameters.size());\n        for (int p = 0; p < (int)parameters.size(); ++p) {\n            const glslang::TType& paramType = parameters[p]->getAsTyped()->getType();\n            spv::Id typeId = convertGlslangToSpvType(paramType);\n            if (originalParam(paramType.getQualifier().storage, paramType, implicitThis && p == 0))\n                typeId = builder.makePointer(TranslateStorageClass(paramType), typeId);\n            else if (writableParam(paramType.getQualifier().storage))\n                typeId = builder.makePointer(spv::StorageClass::Function, typeId);\n            else\n                rValueParameters.insert(parameters[p]->getAsSymbolNode()->getId());\n            getParamDecorations(paramDecorations[p], paramType, glslangIntermediate->usingVulkanMemoryModel());\n            paramTypes.push_back(typeId);\n        }\n\n        for (auto const parameter:parameters) {\n            paramNames.push_back(parameter->getAsSymbolNode()->getName().c_str());\n        }\n\n        spv::Block* functionBlock;\n        spv::Function* function = builder.makeFunctionEntry(\n            TranslatePrecisionDecoration(glslFunction->getType()), convertGlslangToSpvType(glslFunction->getType()),\n            glslFunction->getName().c_str(), convertGlslangLinkageToSpv(glslFunction->getLinkType()), paramTypes,\n            paramDecorations, &functionBlock);\n        builder.setupFunctionDebugInfo(function, glslFunction->getName().c_str(), paramTypes, paramNames);\n        if (implicitThis)\n            function->setImplicitThis();\n\n        // Track function to emit/call later\n        functionMap[glslFunction->getName().c_str()] = function;\n\n        // Set the parameter id's\n        for (int p = 0; p < (int)parameters.size(); ++p) {\n            symbolValues[parameters[p]->getAsSymbolNode()->getId()] = function->getParamId(p);\n            // give a name too\n            builder.addName(function->getParamId(p), parameters[p]->getAsSymbolNode()->getName().c_str());\n\n            const glslang::TType& paramType = parameters[p]->getAsTyped()->getType();\n            if (paramType.contains8BitInt())\n                builder.addCapability(spv::Capability::Int8);\n            if (paramType.contains16BitInt())\n                builder.addCapability(spv::Capability::Int16);\n            if (paramType.contains16BitFloat())\n                builder.addCapability(spv::Capability::Float16);\n        }\n    }\n}\n\n// Process all the initializers, while skipping the functions and link objects\nvoid TGlslangToSpvTraverser::makeGlobalInitializers(const glslang::TIntermSequence& initializers)\n{\n    builder.setBuildPoint(shaderEntry->getLastBlock());\n    for (int i = 0; i < (int)initializers.size(); ++i) {\n        glslang::TIntermAggregate* initializer = initializers[i]->getAsAggregate();\n        if (initializer && initializer->getOp() != glslang::EOpFunction && initializer->getOp() !=\n            glslang::EOpLinkerObjects) {\n\n            // We're on a top-level node that's not a function.  Treat as an initializer, whose\n            // code goes into the beginning of the entry point.\n            initializer->traverse(this);\n        }\n    }\n}\n// Walk over all linker objects to create a map for payload and callable data linker objects\n// and their location to be used during codegen for OpTraceKHR and OpExecuteCallableKHR\n// This is done here since it is possible that these linker objects are not be referenced in the AST\nvoid TGlslangToSpvTraverser::collectRayTracingLinkerObjects()\n{\n    glslang::TIntermAggregate* linkerObjects = glslangIntermediate->findLinkerObjects();\n    for (auto& objSeq : linkerObjects->getSequence()) {\n        auto objNode = objSeq->getAsSymbolNode();\n        if (objNode != nullptr) {\n            if (objNode->getQualifier().hasLocation()) {\n                unsigned int location = objNode->getQualifier().layoutLocation;\n                auto st = objNode->getQualifier().storage;\n                int set;\n                switch (st)\n                {\n                case glslang::EvqPayload:\n                case glslang::EvqPayloadIn:\n                    set = 0;\n                    break;\n                case glslang::EvqCallableData:\n                case glslang::EvqCallableDataIn:\n                    set = 1;\n                    break;\n\n                case glslang::EvqHitObjectAttrNV:\n                    set = 2;\n                    break;\n\n                default:\n                    set = -1;\n                }\n                if (set != -1)\n                    locationToSymbol[set].insert(std::make_pair(location, objNode));\n            }\n        }\n    }\n}\n// Process all the functions, while skipping initializers.\nvoid TGlslangToSpvTraverser::visitFunctions(const glslang::TIntermSequence& glslFunctions)\n{\n    for (int f = 0; f < (int)glslFunctions.size(); ++f) {\n        glslang::TIntermAggregate* node = glslFunctions[f]->getAsAggregate();\n        if (node && (node->getOp() == glslang::EOpFunction || node->getOp() == glslang::EOpLinkerObjects))\n            node->traverse(this);\n    }\n}\n\nvoid TGlslangToSpvTraverser::handleFunctionEntry(const glslang::TIntermAggregate* node)\n{\n    // SPIR-V functions should already be in the functionMap from the prepass\n    // that called makeFunctions().\n    currentFunction = functionMap[node->getName().c_str()];\n    spv::Block* functionBlock = currentFunction->getEntryBlock();\n    builder.setBuildPoint(functionBlock);\n    builder.enterFunction(currentFunction);\n}\n\nvoid TGlslangToSpvTraverser::translateArguments(const glslang::TIntermAggregate& node, std::vector<spv::Id>& arguments,\n    spv::Builder::AccessChain::CoherentFlags &lvalueCoherentFlags)\n{\n    const glslang::TIntermSequence& glslangArguments = node.getSequence();\n\n    glslang::TSampler sampler = {};\n    bool cubeCompare = false;\n    bool f16ShadowCompare = false;\n    if (node.isTexture() || node.isImage()) {\n        sampler = glslangArguments[0]->getAsTyped()->getType().getSampler();\n        cubeCompare = sampler.dim == glslang::EsdCube && sampler.arrayed && sampler.shadow;\n        f16ShadowCompare = sampler.shadow &&\n            glslangArguments[1]->getAsTyped()->getType().getBasicType() == glslang::EbtFloat16;\n    }\n\n    for (int i = 0; i < (int)glslangArguments.size(); ++i) {\n        builder.clearAccessChain();\n        glslangArguments[i]->traverse(this);\n\n        // Special case l-value operands\n        bool lvalue = false;\n        switch (node.getOp()) {\n        case glslang::EOpImageAtomicAdd:\n        case glslang::EOpImageAtomicMin:\n        case glslang::EOpImageAtomicMax:\n        case glslang::EOpImageAtomicAnd:\n        case glslang::EOpImageAtomicOr:\n        case glslang::EOpImageAtomicXor:\n        case glslang::EOpImageAtomicExchange:\n        case glslang::EOpImageAtomicCompSwap:\n        case glslang::EOpImageAtomicLoad:\n        case glslang::EOpImageAtomicStore:\n            if (i == 0)\n                lvalue = true;\n            break;\n        case glslang::EOpSparseImageLoad:\n            if ((sampler.ms && i == 3) || (! sampler.ms && i == 2))\n                lvalue = true;\n            break;\n        case glslang::EOpSparseTexture:\n            if (((cubeCompare || f16ShadowCompare) && i == 3) || (! (cubeCompare || f16ShadowCompare) && i == 2))\n                lvalue = true;\n            break;\n        case glslang::EOpSparseTextureClamp:\n            if (((cubeCompare || f16ShadowCompare) && i == 4) || (! (cubeCompare || f16ShadowCompare) && i == 3))\n                lvalue = true;\n            break;\n        case glslang::EOpSparseTextureLod:\n        case glslang::EOpSparseTextureOffset:\n            if  ((f16ShadowCompare && i == 4) || (! f16ShadowCompare && i == 3))\n                lvalue = true;\n            break;\n        case glslang::EOpSparseTextureFetch:\n            if ((sampler.dim != glslang::EsdRect && i == 3) || (sampler.dim == glslang::EsdRect && i == 2))\n                lvalue = true;\n            break;\n        case glslang::EOpSparseTextureFetchOffset:\n            if ((sampler.dim != glslang::EsdRect && i == 4) || (sampler.dim == glslang::EsdRect && i == 3))\n                lvalue = true;\n            break;\n        case glslang::EOpSparseTextureLodOffset:\n        case glslang::EOpSparseTextureGrad:\n        case glslang::EOpSparseTextureOffsetClamp:\n            if ((f16ShadowCompare && i == 5) || (! f16ShadowCompare && i == 4))\n                lvalue = true;\n            break;\n        case glslang::EOpSparseTextureGradOffset:\n        case glslang::EOpSparseTextureGradClamp:\n            if ((f16ShadowCompare && i == 6) || (! f16ShadowCompare && i == 5))\n                lvalue = true;\n            break;\n        case glslang::EOpSparseTextureGradOffsetClamp:\n            if ((f16ShadowCompare && i == 7) || (! f16ShadowCompare && i == 6))\n                lvalue = true;\n            break;\n        case glslang::EOpSparseTextureGather:\n            if ((sampler.shadow && i == 3) || (! sampler.shadow && i == 2))\n                lvalue = true;\n            break;\n        case glslang::EOpSparseTextureGatherOffset:\n        case glslang::EOpSparseTextureGatherOffsets:\n            if ((sampler.shadow && i == 4) || (! sampler.shadow && i == 3))\n                lvalue = true;\n            break;\n        case glslang::EOpSparseTextureGatherLod:\n            if (i == 3)\n                lvalue = true;\n            break;\n        case glslang::EOpSparseTextureGatherLodOffset:\n        case glslang::EOpSparseTextureGatherLodOffsets:\n            if (i == 4)\n                lvalue = true;\n            break;\n        case glslang::EOpSparseImageLoadLod:\n            if (i == 3)\n                lvalue = true;\n            break;\n        case glslang::EOpImageSampleFootprintNV:\n            if (i == 4)\n                lvalue = true;\n            break;\n        case glslang::EOpImageSampleFootprintClampNV:\n        case glslang::EOpImageSampleFootprintLodNV:\n            if (i == 5)\n                lvalue = true;\n            break;\n        case glslang::EOpImageSampleFootprintGradNV:\n            if (i == 6)\n                lvalue = true;\n            break;\n        case glslang::EOpImageSampleFootprintGradClampNV:\n            if (i == 7)\n                lvalue = true;\n            break;\n        case glslang::EOpRayQueryGetIntersectionTriangleVertexPositionsEXT:\n        case glslang::EOpRayQueryGetIntersectionLSSPositionsNV:\n        case glslang::EOpRayQueryGetIntersectionLSSRadiiNV:\n            if (i == 2)\n                lvalue = true;\n            break;\n        case glslang::EOpConstructSaturated:\n            if (i == 0)\n                lvalue = true;\n            break;\n        default:\n            break;\n        }\n\n        if (lvalue) {\n            spv::Id lvalue_id = builder.accessChainGetLValue();\n            arguments.push_back(lvalue_id);\n            lvalueCoherentFlags = builder.getAccessChain().coherentFlags;\n            builder.addDecoration(lvalue_id, TranslateNonUniformDecoration(lvalueCoherentFlags));\n            lvalueCoherentFlags |= TranslateCoherent(glslangArguments[i]->getAsTyped()->getType());\n        } else {\n            if (i > 0 &&\n                glslangArguments[i]->getAsSymbolNode() && glslangArguments[i-1]->getAsSymbolNode() &&\n                glslangArguments[i]->getAsSymbolNode()->getId() == glslangArguments[i-1]->getAsSymbolNode()->getId()) {\n                // Reuse the id if possible\n                arguments.push_back(arguments[i-1]);\n            } else {\n                arguments.push_back(accessChainLoad(glslangArguments[i]->getAsTyped()->getType()));\n            }\n        }\n    }\n}\n\nvoid TGlslangToSpvTraverser::translateArguments(glslang::TIntermUnary& node, std::vector<spv::Id>& arguments)\n{\n    builder.clearAccessChain();\n    node.getOperand()->traverse(this);\n    arguments.push_back(accessChainLoad(node.getOperand()->getType()));\n}\n\nspv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermOperator* node)\n{\n    if (! node->isImage() && ! node->isTexture())\n        return spv::NoResult;\n\n    builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename());\n\n    // Process a GLSL texturing op (will be SPV image)\n\n    const glslang::TType &imageType = node->getAsAggregate()\n                                        ? node->getAsAggregate()->getSequence()[0]->getAsTyped()->getType()\n                                        : node->getAsUnaryNode()->getOperand()->getAsTyped()->getType();\n    const glslang::TSampler sampler = imageType.getSampler();\n    bool f16ShadowCompare = (sampler.shadow && node->getAsAggregate())\n            ? node->getAsAggregate()->getSequence()[1]->getAsTyped()->getType().getBasicType() == glslang::EbtFloat16\n            : false;\n\n    const auto signExtensionMask = [&]() {\n        if (builder.getSpvVersion() >= spv::Spv_1_4) {\n            if (sampler.type == glslang::EbtUint)\n                return spv::ImageOperandsMask::ZeroExtend;\n            else if (sampler.type == glslang::EbtInt)\n                return spv::ImageOperandsMask::SignExtend;\n        }\n        return spv::ImageOperandsMask::MaskNone;\n    };\n\n    spv::Builder::AccessChain::CoherentFlags lvalueCoherentFlags;\n\n    std::vector<spv::Id> arguments;\n    if (node->getAsAggregate())\n        translateArguments(*node->getAsAggregate(), arguments, lvalueCoherentFlags);\n    else\n        translateArguments(*node->getAsUnaryNode(), arguments);\n    spv::Decoration precision = TranslatePrecisionDecoration(node->getType());\n\n    spv::Builder::TextureParameters params = { };\n    params.sampler = arguments[0];\n\n    glslang::TCrackedTextureOp cracked;\n    node->crackTexture(sampler, cracked);\n\n    const bool isUnsignedResult = node->getType().getBasicType() == glslang::EbtUint;\n\n    if (builder.isSampledImage(params.sampler) &&\n        ((cracked.query && node->getOp() != glslang::EOpTextureQueryLod) || cracked.fragMask || cracked.fetch)) {\n        params.sampler = builder.createUnaryOp(spv::Op::OpImage, builder.getImageType(params.sampler), params.sampler);\n        if (imageType.getQualifier().isNonUniform()) {\n            builder.addDecoration(params.sampler, spv::Decoration::NonUniformEXT);\n        }\n    }\n    // Check for queries\n    if (cracked.query) {\n        switch (node->getOp()) {\n        case glslang::EOpImageQuerySize:\n        case glslang::EOpTextureQuerySize:\n            if (arguments.size() > 1) {\n                params.lod = arguments[1];\n                return builder.createTextureQueryCall(spv::Op::OpImageQuerySizeLod, params, isUnsignedResult);\n            } else\n                return builder.createTextureQueryCall(spv::Op::OpImageQuerySize, params, isUnsignedResult);\n        case glslang::EOpImageQuerySamples:\n        case glslang::EOpTextureQuerySamples:\n            return builder.createTextureQueryCall(spv::Op::OpImageQuerySamples, params, isUnsignedResult);\n        case glslang::EOpTextureQueryLod:\n            params.coords = arguments[1];\n            return builder.createTextureQueryCall(spv::Op::OpImageQueryLod, params, isUnsignedResult);\n        case glslang::EOpTextureQueryLevels:\n            return builder.createTextureQueryCall(spv::Op::OpImageQueryLevels, params, isUnsignedResult);\n        case glslang::EOpSparseTexelsResident:\n            return builder.createUnaryOp(spv::Op::OpImageSparseTexelsResident, builder.makeBoolType(), arguments[0]);\n        default:\n            assert(0);\n            break;\n        }\n    }\n\n    int components = node->getType().getVectorSize();\n\n    if (node->getOp() == glslang::EOpImageLoad ||\n        node->getOp() == glslang::EOpImageLoadLod ||\n        node->getOp() == glslang::EOpTextureFetch ||\n        node->getOp() == glslang::EOpTextureFetchOffset) {\n        // These must produce 4 components, per SPIR-V spec.  We'll add a conversion constructor if needed.\n        // This will only happen through the HLSL path for operator[], so we do not have to handle e.g.\n        // the EOpTexture/Proj/Lod/etc family.  It would be harmless to do so, but would need more logic\n        // here around e.g. which ones return scalars or other types.\n        components = 4;\n    }\n\n    glslang::TType returnType(node->getType().getBasicType(), glslang::EvqTemporary, components);\n\n    auto resultType = [&returnType,this]{ return convertGlslangToSpvType(returnType); };\n\n    // Check for image functions other than queries\n    if (node->isImage()) {\n        std::vector<spv::IdImmediate> operands;\n        auto opIt = arguments.begin();\n        spv::IdImmediate image = { true, *(opIt++) };\n        operands.push_back(image);\n\n        // Handle subpass operations\n        // TODO: GLSL should change to have the \"MS\" only on the type rather than the\n        // built-in function.\n        if (cracked.subpass) {\n            // add on the (0,0) coordinate\n            spv::Id zero = builder.makeIntConstant(0);\n            std::vector<spv::Id> comps;\n            comps.push_back(zero);\n            comps.push_back(zero);\n            spv::IdImmediate coord = { true,\n                builder.makeCompositeConstant(builder.makeVectorType(builder.makeIntType(32), 2), comps) };\n            operands.push_back(coord);\n            spv::IdImmediate imageOperands = { false, spv::ImageOperandsMask::MaskNone };\n            imageOperands.word = imageOperands.word | (unsigned)signExtensionMask();\n            if (sampler.isMultiSample()) {\n                imageOperands.word = imageOperands.word | (unsigned)spv::ImageOperandsMask::Sample;\n            }\n            if (imageOperands.word != (unsigned)spv::ImageOperandsMask::MaskNone) {\n                operands.push_back(imageOperands);\n                if (sampler.isMultiSample()) {\n                    spv::IdImmediate imageOperand = { true, *(opIt++) };\n                    operands.push_back(imageOperand);\n                }\n            }\n            spv::Id result = builder.createOp(spv::Op::OpImageRead, resultType(), operands);\n            builder.setPrecision(result, precision);\n            return result;\n        }\n\n        if (cracked.attachmentEXT) {\n            if (opIt != arguments.end()) {\n                spv::IdImmediate sample = { true, *opIt };\n                operands.push_back(sample);\n            }\n            spv::Id result = builder.createOp(spv::Op::OpColorAttachmentReadEXT, resultType(), operands);\n            builder.addExtension(spv::E_SPV_EXT_shader_tile_image);\n            builder.setPrecision(result, precision);\n            return result;\n        }\n\n        spv::IdImmediate coord = { true, *(opIt++) };\n        operands.push_back(coord);\n        if (node->getOp() == glslang::EOpImageLoad || node->getOp() == glslang::EOpImageLoadLod) {\n            spv::ImageOperandsMask mask = spv::ImageOperandsMask::MaskNone;\n            if (sampler.isMultiSample()) {\n                mask = mask | spv::ImageOperandsMask::Sample;\n            }\n            if (cracked.lod) {\n                builder.addExtension(spv::E_SPV_AMD_shader_image_load_store_lod);\n                builder.addCapability(spv::Capability::ImageReadWriteLodAMD);\n                mask = mask | spv::ImageOperandsMask::Lod;\n            }\n            mask = mask | TranslateImageOperands(TranslateCoherent(imageType));\n            mask = (spv::ImageOperandsMask)(mask & ~spv::ImageOperandsMask::MakeTexelAvailableKHR);\n            mask = mask | signExtensionMask();\n            if (mask != spv::ImageOperandsMask::MaskNone) {\n                spv::IdImmediate imageOperands = { false, (unsigned int)mask };\n                operands.push_back(imageOperands);\n            }\n            if (anySet(mask, spv::ImageOperandsMask::Sample)) {\n                spv::IdImmediate imageOperand = { true, *opIt++ };\n                operands.push_back(imageOperand);\n            }\n            if (anySet(mask, spv::ImageOperandsMask::Lod)) {\n                spv::IdImmediate imageOperand = { true, *opIt++ };\n                operands.push_back(imageOperand);\n            }\n            if (anySet(mask, spv::ImageOperandsMask::MakeTexelVisibleKHR)) {\n                spv::IdImmediate imageOperand = { true,\n                                    builder.makeUintConstant(TranslateMemoryScope(TranslateCoherent(imageType))) };\n                operands.push_back(imageOperand);\n            }\n\n            if (builder.getImageTypeFormat(builder.getImageType(operands.front().word)) == spv::ImageFormat::Unknown)\n                builder.addCapability(spv::Capability::StorageImageReadWithoutFormat);\n\n            std::vector<spv::Id> result(1, builder.createOp(spv::Op::OpImageRead, resultType(), operands));\n            builder.setPrecision(result[0], precision);\n\n            // If needed, add a conversion constructor to the proper size.\n            if (components != node->getType().getVectorSize())\n                result[0] = builder.createConstructor(precision, result, convertGlslangToSpvType(node->getType()));\n\n            return result[0];\n        } else if (node->getOp() == glslang::EOpImageStore || node->getOp() == glslang::EOpImageStoreLod) {\n\n            // Push the texel value before the operands\n            if (sampler.isMultiSample() || cracked.lod) {\n                spv::IdImmediate texel = { true, *(opIt + 1) };\n                operands.push_back(texel);\n            } else {\n                spv::IdImmediate texel = { true, *opIt };\n                operands.push_back(texel);\n            }\n\n            spv::ImageOperandsMask mask = spv::ImageOperandsMask::MaskNone;\n            if (sampler.isMultiSample()) {\n                mask = mask | spv::ImageOperandsMask::Sample;\n            }\n            if (cracked.lod) {\n                builder.addExtension(spv::E_SPV_AMD_shader_image_load_store_lod);\n                builder.addCapability(spv::Capability::ImageReadWriteLodAMD);\n                mask = mask | spv::ImageOperandsMask::Lod;\n            }\n            mask = mask | TranslateImageOperands(TranslateCoherent(imageType));\n            mask = (spv::ImageOperandsMask)(mask & ~spv::ImageOperandsMask::MakeTexelVisibleKHR);\n            mask = mask | signExtensionMask();\n            if (mask != spv::ImageOperandsMask::MaskNone) {\n                spv::IdImmediate imageOperands = { false, (unsigned int)mask };\n                operands.push_back(imageOperands);\n            }\n            if (anySet(mask, spv::ImageOperandsMask::Sample)) {\n                spv::IdImmediate imageOperand = { true, *opIt++ };\n                operands.push_back(imageOperand);\n            }\n            if (anySet(mask, spv::ImageOperandsMask::Lod)) {\n                spv::IdImmediate imageOperand = { true, *opIt++ };\n                operands.push_back(imageOperand);\n            }\n            if (anySet(mask, spv::ImageOperandsMask::MakeTexelAvailableKHR)) {\n                spv::IdImmediate imageOperand = { true,\n                    builder.makeUintConstant(TranslateMemoryScope(TranslateCoherent(imageType))) };\n                operands.push_back(imageOperand);\n            }\n\n            builder.createNoResultOp(spv::Op::OpImageWrite, operands);\n            if (builder.getImageTypeFormat(builder.getImageType(operands.front().word)) == spv::ImageFormat::Unknown)\n                builder.addCapability(spv::Capability::StorageImageWriteWithoutFormat);\n            return spv::NoResult;\n        } else if (node->getOp() == glslang::EOpSparseImageLoad ||\n                   node->getOp() == glslang::EOpSparseImageLoadLod) {\n            builder.addCapability(spv::Capability::SparseResidency);\n            if (builder.getImageTypeFormat(builder.getImageType(operands.front().word)) == spv::ImageFormat::Unknown)\n                builder.addCapability(spv::Capability::StorageImageReadWithoutFormat);\n\n            spv::ImageOperandsMask mask = spv::ImageOperandsMask::MaskNone;\n            if (sampler.isMultiSample()) {\n                mask = mask | spv::ImageOperandsMask::Sample;\n            }\n            if (cracked.lod) {\n                builder.addExtension(spv::E_SPV_AMD_shader_image_load_store_lod);\n                builder.addCapability(spv::Capability::ImageReadWriteLodAMD);\n\n                mask = mask | spv::ImageOperandsMask::Lod;\n            }\n            mask = mask | TranslateImageOperands(TranslateCoherent(imageType));\n            mask = (spv::ImageOperandsMask)(mask & ~spv::ImageOperandsMask::MakeTexelAvailableKHR);\n            mask = mask | signExtensionMask();\n            if (mask != spv::ImageOperandsMask::MaskNone) {\n                spv::IdImmediate imageOperands = { false, (unsigned int)mask };\n                operands.push_back(imageOperands);\n            }\n            if (anySet(mask, spv::ImageOperandsMask::Sample)) {\n                spv::IdImmediate imageOperand = { true, *opIt++ };\n                operands.push_back(imageOperand);\n            }\n            if (anySet(mask, spv::ImageOperandsMask::Lod)) {\n                spv::IdImmediate imageOperand = { true, *opIt++ };\n                operands.push_back(imageOperand);\n            }\n            if (anySet(mask, spv::ImageOperandsMask::MakeTexelVisibleKHR)) {\n                spv::IdImmediate imageOperand = { true, builder.makeUintConstant(TranslateMemoryScope(\n                    TranslateCoherent(imageType))) };\n                operands.push_back(imageOperand);\n            }\n\n            // Create the return type that was a special structure\n            spv::Id texelOut = *opIt;\n            spv::Id typeId0 = resultType();\n            spv::Id typeId1 = builder.getDerefTypeId(texelOut);\n            spv::Id resultTypeId = builder.makeStructResultType(typeId0, typeId1);\n\n            spv::Id resultId = builder.createOp(spv::Op::OpImageSparseRead, resultTypeId, operands);\n\n            // Decode the return type\n            builder.createStore(builder.createCompositeExtract(resultId, typeId1, 1), texelOut);\n            return builder.createCompositeExtract(resultId, typeId0, 0);\n        } else {\n            // Process image atomic operations\n\n            // GLSL \"IMAGE_PARAMS\" will involve in constructing an image texel pointer and this pointer,\n            // as the first source operand, is required by SPIR-V atomic operations.\n            // For non-MS, the sample value should be 0\n            spv::IdImmediate sample = { true, sampler.isMultiSample() ? *(opIt++) : builder.makeUintConstant(0) };\n            operands.push_back(sample);\n\n            spv::Id resultTypeId;\n            glslang::TBasicType typeProxy = node->getBasicType();\n            // imageAtomicStore has a void return type so base the pointer type on\n            // the type of the value operand.\n            if (node->getOp() == glslang::EOpImageAtomicStore) {\n                resultTypeId = builder.makePointer(spv::StorageClass::Image, builder.getTypeId(*opIt));\n                typeProxy = node->getAsAggregate()->getSequence()[0]->getAsTyped()->getType().getSampler().type;\n            } else {\n                resultTypeId = builder.makePointer(spv::StorageClass::Image, resultType());\n            }\n            spv::Id pointer = builder.createOp(spv::Op::OpImageTexelPointer, resultTypeId, operands);\n            if (imageType.getQualifier().nonUniform) {\n                builder.addDecoration(pointer, spv::Decoration::NonUniformEXT);\n            }\n\n            std::vector<spv::Id> operands;\n            operands.push_back(pointer);\n            for (; opIt != arguments.end(); ++opIt)\n                operands.push_back(*opIt);\n\n            return createAtomicOperation(node->getOp(), precision, resultType(), operands, typeProxy,\n                lvalueCoherentFlags, node->getType());\n        }\n    }\n\n    // Check for fragment mask functions other than queries\n    if (cracked.fragMask) {\n        assert(sampler.ms);\n\n        auto opIt = arguments.begin();\n        std::vector<spv::Id> operands;\n\n        operands.push_back(params.sampler);\n        ++opIt;\n\n        if (sampler.isSubpass()) {\n            // add on the (0,0) coordinate\n            spv::Id zero = builder.makeIntConstant(0);\n            std::vector<spv::Id> comps;\n            comps.push_back(zero);\n            comps.push_back(zero);\n            operands.push_back(builder.makeCompositeConstant(\n                builder.makeVectorType(builder.makeIntType(32), 2), comps));\n        }\n\n        for (; opIt != arguments.end(); ++opIt)\n            operands.push_back(*opIt);\n\n        spv::Op fragMaskOp = spv::Op::OpNop;\n        if (node->getOp() == glslang::EOpFragmentMaskFetch)\n            fragMaskOp = spv::Op::OpFragmentMaskFetchAMD;\n        else if (node->getOp() == glslang::EOpFragmentFetch)\n            fragMaskOp = spv::Op::OpFragmentFetchAMD;\n\n        builder.addExtension(spv::E_SPV_AMD_shader_fragment_mask);\n        builder.addCapability(spv::Capability::FragmentMaskAMD);\n        return builder.createOp(fragMaskOp, resultType(), operands);\n    }\n\n    // Check for texture functions other than queries\n    bool sparse = node->isSparseTexture();\n    bool imageFootprint = node->isImageFootprint();\n    bool cubeCompare = sampler.dim == glslang::EsdCube && sampler.isArrayed() && sampler.isShadow();\n\n    // check for bias argument\n    bool bias = false;\n    if (! cracked.lod && ! cracked.grad && ! cracked.fetch && ! cubeCompare) {\n        int nonBiasArgCount = 2;\n        if (cracked.gather)\n            ++nonBiasArgCount; // comp argument should be present when bias argument is present\n\n        if (f16ShadowCompare)\n            ++nonBiasArgCount;\n        if (cracked.offset)\n            ++nonBiasArgCount;\n        else if (cracked.offsets)\n            ++nonBiasArgCount;\n        if (cracked.grad)\n            nonBiasArgCount += 2;\n        if (cracked.lodClamp)\n            ++nonBiasArgCount;\n        if (sparse)\n            ++nonBiasArgCount;\n        if (imageFootprint)\n            //Following three extra arguments\n            // int granularity, bool coarse, out gl_TextureFootprint2DNV footprint\n            nonBiasArgCount += 3;\n        if ((int)arguments.size() > nonBiasArgCount)\n            bias = true;\n    }\n\n    if (cracked.gather) {\n        const auto& sourceExtensions = glslangIntermediate->getRequestedExtensions();\n        if (bias || cracked.lod ||\n            sourceExtensions.find(glslang::E_GL_AMD_texture_gather_bias_lod) != sourceExtensions.end()) {\n            builder.addExtension(spv::E_SPV_AMD_texture_gather_bias_lod);\n            builder.addCapability(spv::Capability::ImageGatherBiasLodAMD);\n        }\n    }\n\n    // set the rest of the arguments\n\n    params.coords = arguments[1];\n    int extraArgs = 0;\n    bool noImplicitLod = false;\n\n    // sort out where Dref is coming from\n    if (cubeCompare || f16ShadowCompare) {\n        params.Dref = arguments[2];\n        ++extraArgs;\n    } else if (sampler.shadow && cracked.gather) {\n        params.Dref = arguments[2];\n        ++extraArgs;\n    } else if (sampler.shadow) {\n        std::vector<spv::Id> indexes;\n        int dRefComp;\n        if (cracked.proj)\n            dRefComp = 2;  // \"The resulting 3rd component of P in the shadow forms is used as Dref\"\n        else\n            dRefComp = builder.getNumComponents(params.coords) - 1;\n        indexes.push_back(dRefComp);\n        params.Dref = builder.createCompositeExtract(params.coords,\n            builder.getScalarTypeId(builder.getTypeId(params.coords)), indexes);\n    }\n\n    // lod\n    if (cracked.lod) {\n        params.lod = arguments[2 + extraArgs];\n        ++extraArgs;\n    } else if (glslangIntermediate->getStage() != EShLangFragment &&\n               !(glslangIntermediate->getStage() == EShLangCompute &&\n                 glslangIntermediate->hasLayoutDerivativeModeNone())) {\n        // we need to invent the default lod for an explicit lod instruction for a non-fragment stage\n        noImplicitLod = true;\n    }\n\n    // multisample\n    if (sampler.isMultiSample()) {\n        params.sample = arguments[2 + extraArgs]; // For MS, \"sample\" should be specified\n        ++extraArgs;\n    }\n\n    // gradient\n    if (cracked.grad) {\n        params.gradX = arguments[2 + extraArgs];\n        params.gradY = arguments[3 + extraArgs];\n        extraArgs += 2;\n    }\n\n    // offset and offsets\n    if (cracked.offset) {\n        params.offset = arguments[2 + extraArgs];\n        ++extraArgs;\n    } else if (cracked.offsets) {\n        params.offsets = arguments[2 + extraArgs];\n        ++extraArgs;\n    }\n\n    // lod clamp\n    if (cracked.lodClamp) {\n        params.lodClamp = arguments[2 + extraArgs];\n        ++extraArgs;\n    }\n    // sparse\n    if (sparse) {\n        params.texelOut = arguments[2 + extraArgs];\n        ++extraArgs;\n    }\n    // gather component\n    if (cracked.gather && ! sampler.shadow) {\n        // default component is 0, if missing, otherwise an argument\n        if (2 + extraArgs < (int)arguments.size()) {\n            params.component = arguments[2 + extraArgs];\n            ++extraArgs;\n        } else\n            params.component = builder.makeIntConstant(0);\n    }\n    spv::Id  resultStruct = spv::NoResult;\n    if (imageFootprint) {\n        //Following three extra arguments\n        // int granularity, bool coarse, out gl_TextureFootprint2DNV footprint\n        params.granularity = arguments[2 + extraArgs];\n        params.coarse = arguments[3 + extraArgs];\n        resultStruct = arguments[4 + extraArgs];\n        extraArgs += 3;\n    }\n\n    // bias\n    if (bias) {\n        params.bias = arguments[2 + extraArgs];\n        ++extraArgs;\n    }\n\n    if (imageFootprint) {\n        builder.addExtension(spv::E_SPV_NV_shader_image_footprint);\n        builder.addCapability(spv::Capability::ImageFootprintNV);\n\n\n        //resultStructType(OpenGL type) contains 5 elements:\n        //struct gl_TextureFootprint2DNV {\n        //    uvec2 anchor;\n        //    uvec2 offset;\n        //    uvec2 mask;\n        //    uint  lod;\n        //    uint  granularity;\n        //};\n        //or\n        //struct gl_TextureFootprint3DNV {\n        //    uvec3 anchor;\n        //    uvec3 offset;\n        //    uvec2 mask;\n        //    uint  lod;\n        //    uint  granularity;\n        //};\n        spv::Id resultStructType = builder.getContainedTypeId(builder.getTypeId(resultStruct));\n        assert(builder.isStructType(resultStructType));\n\n        //resType (SPIR-V type) contains 6 elements:\n        //Member 0 must be a Boolean type scalar(LOD),\n        //Member 1 must be a vector of integer type, whose Signedness operand is 0(anchor),\n        //Member 2 must be a vector of integer type, whose Signedness operand is 0(offset),\n        //Member 3 must be a vector of integer type, whose Signedness operand is 0(mask),\n        //Member 4 must be a scalar of integer type, whose Signedness operand is 0(lod),\n        //Member 5 must be a scalar of integer type, whose Signedness operand is 0(granularity).\n        std::vector<spv::Id> members;\n        members.push_back(resultType());\n        for (int i = 0; i < 5; i++) {\n            members.push_back(builder.getContainedTypeId(resultStructType, i));\n        }\n        spv::Id resType = builder.makeStructType(members, \"ResType\");\n\n        //call ImageFootprintNV\n        spv::Id res = builder.createTextureCall(precision, resType, sparse, cracked.fetch, cracked.proj,\n                                                cracked.gather, noImplicitLod, params, signExtensionMask());\n\n        //copy resType (SPIR-V type) to resultStructType(OpenGL type)\n        for (int i = 0; i < 5; i++) {\n            builder.clearAccessChain();\n            builder.setAccessChainLValue(resultStruct);\n\n            //Accessing to a struct we created, no coherent flag is set\n            spv::Builder::AccessChain::CoherentFlags flags;\n            flags.clear();\n\n            builder.accessChainPush(builder.makeIntConstant(i), flags, 0);\n            builder.accessChainStore(builder.createCompositeExtract(res, builder.getContainedTypeId(resType, i+1),\n                i+1), TranslateNonUniformDecoration(imageType.getQualifier()));\n        }\n        return builder.createCompositeExtract(res, resultType(), 0);\n    }\n\n    // projective component (might not to move)\n    // GLSL: \"The texture coordinates consumed from P, not including the last component of P,\n    //       are divided by the last component of P.\"\n    // SPIR-V:  \"... (u [, v] [, w], q)... It may be a vector larger than needed, but all\n    //          unused components will appear after all used components.\"\n    if (cracked.proj) {\n        int projSourceComp = builder.getNumComponents(params.coords) - 1;\n        int projTargetComp;\n        switch (sampler.dim) {\n        case glslang::Esd1D:   projTargetComp = 1;              break;\n        case glslang::Esd2D:   projTargetComp = 2;              break;\n        case glslang::EsdRect: projTargetComp = 2;              break;\n        default:               projTargetComp = projSourceComp; break;\n        }\n        // copy the projective coordinate if we have to\n        if (projTargetComp != projSourceComp) {\n            spv::Id projComp = builder.createCompositeExtract(params.coords,\n                                    builder.getScalarTypeId(builder.getTypeId(params.coords)), projSourceComp);\n            params.coords = builder.createCompositeInsert(projComp, params.coords,\n                                    builder.getTypeId(params.coords), projTargetComp);\n        }\n    }\n\n    // nonprivate\n    if (imageType.getQualifier().nonprivate) {\n        params.nonprivate = true;\n    }\n\n    // volatile\n    if (imageType.getQualifier().volatil) {\n        params.volatil = true;\n    }\n\n    if (imageType.getQualifier().nontemporal) {\n        params.nontemporal = true;\n    }\n\n    std::vector<spv::Id> result( 1,\n        builder.createTextureCall(precision, resultType(), sparse, cracked.fetch, cracked.proj, cracked.gather,\n                                  noImplicitLod, params, signExtensionMask())\n    );\n\n    if (components != node->getType().getVectorSize())\n        result[0] = builder.createConstructor(precision, result, convertGlslangToSpvType(node->getType()));\n\n    return result[0];\n}\n\nspv::Id TGlslangToSpvTraverser::handleUserFunctionCall(const glslang::TIntermAggregate* node)\n{\n    // Grab the function's pointer from the previously created function\n    spv::Function* function = functionMap[node->getName().c_str()];\n    if (! function)\n        return 0;\n\n    const glslang::TIntermSequence& glslangArgs = node->getSequence();\n    const glslang::TQualifierList& qualifiers = node->getQualifierList();\n\n    //  See comments in makeFunctions() for details about the semantics for parameter passing.\n    //\n    // These imply we need a four step process:\n    // 1. Evaluate the arguments\n    // 2. Allocate and make copies of in, out, and inout arguments\n    // 3. Make the call\n    // 4. Copy back the results\n\n    // 1. Evaluate the arguments and their types\n    std::vector<spv::Builder::AccessChain> lValues;\n    std::vector<spv::Id> rValues;\n    std::vector<const glslang::TType*> argTypes;\n    for (int a = 0; a < (int)glslangArgs.size(); ++a) {\n        argTypes.push_back(&glslangArgs[a]->getAsTyped()->getType());\n        // build l-value\n        builder.clearAccessChain();\n        glslangArgs[a]->traverse(this);\n        // keep outputs and pass-by-originals as l-values, evaluate others as r-values\n        if (originalParam(qualifiers[a], *argTypes[a], function->hasImplicitThis() && a == 0) ||\n            writableParam(qualifiers[a])) {\n            // save l-value\n            lValues.push_back(builder.getAccessChain());\n        } else {\n            // process r-value\n            rValues.push_back(accessChainLoad(*argTypes.back()));\n        }\n    }\n\n    // Reset source location to the function call location after argument evaluation\n    builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename());\n\n    // 2. Allocate space for anything needing a copy, and if it's \"in\" or \"inout\"\n    // copy the original into that space.\n    //\n    // Also, build up the list of actual arguments to pass in for the call\n    int lValueCount = 0;\n    int rValueCount = 0;\n    std::vector<spv::Id> spvArgs;\n    for (int a = 0; a < (int)glslangArgs.size(); ++a) {\n        spv::Id arg;\n        if (originalParam(qualifiers[a], *argTypes[a], function->hasImplicitThis() && a == 0)) {\n            builder.setAccessChain(lValues[lValueCount]);\n            arg = builder.accessChainGetLValue();\n            ++lValueCount;\n        } else if (writableParam(qualifiers[a])) {\n            // need space to hold the copy\n            arg = builder.createVariable(function->getParamPrecision(a), spv::StorageClass::Function,\n                builder.getContainedTypeId(function->getParamType(a)), \"param\");\n            if (qualifiers[a] == glslang::EvqIn || qualifiers[a] == glslang::EvqInOut) {\n                // need to copy the input into output space\n                builder.setAccessChain(lValues[lValueCount]);\n                spv::Id copy = accessChainLoad(*argTypes[a]);\n                builder.clearAccessChain();\n                builder.setAccessChainLValue(arg);\n                multiTypeStore(*argTypes[a], copy);\n            }\n            ++lValueCount;\n        } else {\n            // process r-value, which involves a copy for a type mismatch\n            if (function->getParamType(a) != builder.getTypeId(rValues[rValueCount]) ||\n                TranslatePrecisionDecoration(*argTypes[a]) != function->getParamPrecision(a))\n            {\n                spv::Id argCopy = builder.createVariable(function->getParamPrecision(a), spv::StorageClass::Function, function->getParamType(a), \"arg\");\n                builder.clearAccessChain();\n                builder.setAccessChainLValue(argCopy);\n                multiTypeStore(*argTypes[a], rValues[rValueCount]);\n                arg = builder.createLoad(argCopy, function->getParamPrecision(a));\n            } else\n                arg = rValues[rValueCount];\n            ++rValueCount;\n        }\n        spvArgs.push_back(arg);\n    }\n\n    // 3. Make the call.\n    spv::Id result = builder.createFunctionCall(function, spvArgs);\n    builder.setPrecision(result, TranslatePrecisionDecoration(node->getType()));\n    builder.addDecoration(result, TranslateNonUniformDecoration(node->getType().getQualifier()));\n\n    // 4. Copy back out an \"out\" arguments.\n    lValueCount = 0;\n    for (int a = 0; a < (int)glslangArgs.size(); ++a) {\n        if (originalParam(qualifiers[a], *argTypes[a], function->hasImplicitThis() && a == 0))\n            ++lValueCount;\n        else if (writableParam(qualifiers[a])) {\n            if (qualifiers[a] == glslang::EvqOut || qualifiers[a] == glslang::EvqInOut) {\n                spv::Id copy = builder.createLoad(spvArgs[a], spv::NoPrecision);\n                builder.addDecoration(copy, TranslateNonUniformDecoration(argTypes[a]->getQualifier()));\n                builder.setAccessChain(lValues[lValueCount]);\n                multiTypeStore(*argTypes[a], copy);\n            }\n            ++lValueCount;\n        }\n    }\n\n    return result;\n}\n\n// Translate AST operation to SPV operation, already having SPV-based operands/types.\nspv::Id TGlslangToSpvTraverser::createBinaryOperation(glslang::TOperator op, OpDecorations& decorations,\n                                                      spv::Id typeId, spv::Id left, spv::Id right,\n                                                      glslang::TBasicType typeProxy, bool reduceComparison)\n{\n    bool isUnsigned = isTypeUnsignedInt(typeProxy);\n    bool isFloat = isTypeFloat(typeProxy);\n    bool isBool = typeProxy == glslang::EbtBool;\n\n    spv::Op binOp = spv::Op::OpNop;\n    bool needMatchingVectors = true;  // for non-matrix ops, would a scalar need to smear to match a vector?\n    bool comparison = false;\n\n    switch (op) {\n    case glslang::EOpAdd:\n    case glslang::EOpAddAssign:\n        if (isFloat)\n            binOp = spv::Op::OpFAdd;\n        else\n            binOp = spv::Op::OpIAdd;\n        break;\n    case glslang::EOpSub:\n    case glslang::EOpSubAssign:\n        if (isFloat)\n            binOp = spv::Op::OpFSub;\n        else\n            binOp = spv::Op::OpISub;\n        break;\n    case glslang::EOpMul:\n    case glslang::EOpMulAssign:\n        if (isFloat)\n            binOp = spv::Op::OpFMul;\n        else\n            binOp = spv::Op::OpIMul;\n        break;\n    case glslang::EOpVectorTimesScalar:\n    case glslang::EOpVectorTimesScalarAssign:\n        if (isFloat && (builder.isVector(left) || builder.isVector(right) || builder.isCooperativeVector(left) || builder.isCooperativeVector(right))) {\n            if (builder.isVector(right) || builder.isCooperativeVector(right))\n                std::swap(left, right);\n            assert(builder.isScalar(right));\n            needMatchingVectors = false;\n            binOp = spv::Op::OpVectorTimesScalar;\n        } else if (isFloat) {\n            binOp = spv::Op::OpFMul;\n        } else if (builder.isCooperativeVector(left) || builder.isCooperativeVector(right)) {\n            if (builder.isCooperativeVector(right))\n                std::swap(left, right);\n            assert(builder.isScalar(right));\n            // Construct a cooperative vector from the scalar\n            right = builder.createCompositeConstruct(builder.getTypeId(left), { right });\n            binOp = spv::Op::OpIMul;\n        } else {\n            binOp = spv::Op::OpIMul;\n        }\n        break;\n    case glslang::EOpVectorTimesMatrix:\n    case glslang::EOpVectorTimesMatrixAssign:\n        binOp = spv::Op::OpVectorTimesMatrix;\n        break;\n    case glslang::EOpMatrixTimesVector:\n        binOp = spv::Op::OpMatrixTimesVector;\n        break;\n    case glslang::EOpMatrixTimesScalar:\n    case glslang::EOpMatrixTimesScalarAssign:\n        binOp = spv::Op::OpMatrixTimesScalar;\n        break;\n    case glslang::EOpMatrixTimesMatrix:\n    case glslang::EOpMatrixTimesMatrixAssign:\n        binOp = spv::Op::OpMatrixTimesMatrix;\n        break;\n    case glslang::EOpOuterProduct:\n        binOp = spv::Op::OpOuterProduct;\n        needMatchingVectors = false;\n        break;\n\n    case glslang::EOpDiv:\n    case glslang::EOpDivAssign:\n        if (isFloat)\n            binOp = spv::Op::OpFDiv;\n        else if (isUnsigned)\n            binOp = spv::Op::OpUDiv;\n        else\n            binOp = spv::Op::OpSDiv;\n        break;\n    case glslang::EOpMod:\n    case glslang::EOpModAssign:\n        if (isFloat)\n            binOp = spv::Op::OpFMod;\n        else if (isUnsigned)\n            binOp = spv::Op::OpUMod;\n        else\n            binOp = spv::Op::OpSMod;\n        break;\n    case glslang::EOpRightShift:\n    case glslang::EOpRightShiftAssign:\n        if (isUnsigned)\n            binOp = spv::Op::OpShiftRightLogical;\n        else\n            binOp = spv::Op::OpShiftRightArithmetic;\n        break;\n    case glslang::EOpLeftShift:\n    case glslang::EOpLeftShiftAssign:\n        binOp = spv::Op::OpShiftLeftLogical;\n        break;\n    case glslang::EOpAnd:\n    case glslang::EOpAndAssign:\n        binOp = spv::Op::OpBitwiseAnd;\n        break;\n    case glslang::EOpLogicalAnd:\n        needMatchingVectors = false;\n        binOp = spv::Op::OpLogicalAnd;\n        break;\n    case glslang::EOpInclusiveOr:\n    case glslang::EOpInclusiveOrAssign:\n        binOp = spv::Op::OpBitwiseOr;\n        break;\n    case glslang::EOpLogicalOr:\n        needMatchingVectors = false;\n        binOp = spv::Op::OpLogicalOr;\n        break;\n    case glslang::EOpExclusiveOr:\n    case glslang::EOpExclusiveOrAssign:\n        binOp = spv::Op::OpBitwiseXor;\n        break;\n    case glslang::EOpLogicalXor:\n        needMatchingVectors = false;\n        binOp = spv::Op::OpLogicalNotEqual;\n        break;\n\n    case glslang::EOpAbsDifference:\n        binOp = isUnsigned ? spv::Op::OpAbsUSubINTEL : spv::Op::OpAbsISubINTEL;\n        break;\n\n    case glslang::EOpAddSaturate:\n        binOp = isUnsigned ? spv::Op::OpUAddSatINTEL : spv::Op::OpIAddSatINTEL;\n        break;\n\n    case glslang::EOpSubSaturate:\n        binOp = isUnsigned ? spv::Op::OpUSubSatINTEL : spv::Op::OpISubSatINTEL;\n        break;\n\n    case glslang::EOpAverage:\n        binOp = isUnsigned ? spv::Op::OpUAverageINTEL : spv::Op::OpIAverageINTEL;\n        break;\n\n    case glslang::EOpAverageRounded:\n        binOp = isUnsigned ? spv::Op::OpUAverageRoundedINTEL : spv::Op::OpIAverageRoundedINTEL;\n        break;\n\n    case glslang::EOpMul32x16:\n        binOp = isUnsigned ? spv::Op::OpUMul32x16INTEL : spv::Op::OpIMul32x16INTEL;\n        break;\n\n    case glslang::EOpExpectEXT:\n        binOp = spv::Op::OpExpectKHR;\n        break;\n\n    case glslang::EOpLessThan:\n    case glslang::EOpGreaterThan:\n    case glslang::EOpLessThanEqual:\n    case glslang::EOpGreaterThanEqual:\n    case glslang::EOpEqual:\n    case glslang::EOpNotEqual:\n    case glslang::EOpVectorEqual:\n    case glslang::EOpVectorNotEqual:\n        comparison = true;\n        break;\n    default:\n        break;\n    }\n\n    // handle mapped binary operations (should be non-comparison)\n    if (binOp != spv::Op::OpNop) {\n        assert(comparison == false);\n        if (builder.isMatrix(left) || builder.isMatrix(right) ||\n            builder.isCooperativeMatrix(left) || builder.isCooperativeMatrix(right))\n            return createBinaryMatrixOperation(binOp, decorations, typeId, left, right);\n\n        // No matrix involved; make both operands be the same number of components, if needed\n        if (needMatchingVectors)\n            builder.promoteScalar(decorations.precision, left, right);\n\n        spv::Id result = builder.createBinOp(binOp, typeId, left, right);\n        decorations.addNoContraction(builder, result);\n        decorations.addNonUniform(builder, result);\n        return builder.setPrecision(result, decorations.precision);\n    }\n\n    if (! comparison)\n        return 0;\n\n    // Handle comparison instructions\n\n    if (reduceComparison && (op == glslang::EOpEqual || op == glslang::EOpNotEqual)\n                         && (builder.isVector(left) || builder.isMatrix(left) || builder.isAggregate(left))) {\n        spv::Id result = builder.createCompositeCompare(decorations.precision, left, right, op == glslang::EOpEqual);\n        decorations.addNonUniform(builder, result);\n        return result;\n    }\n\n    switch (op) {\n    case glslang::EOpLessThan:\n        if (isFloat)\n            binOp = spv::Op::OpFOrdLessThan;\n        else if (isUnsigned)\n            binOp = spv::Op::OpULessThan;\n        else\n            binOp = spv::Op::OpSLessThan;\n        break;\n    case glslang::EOpGreaterThan:\n        if (isFloat)\n            binOp = spv::Op::OpFOrdGreaterThan;\n        else if (isUnsigned)\n            binOp = spv::Op::OpUGreaterThan;\n        else\n            binOp = spv::Op::OpSGreaterThan;\n        break;\n    case glslang::EOpLessThanEqual:\n        if (isFloat)\n            binOp = spv::Op::OpFOrdLessThanEqual;\n        else if (isUnsigned)\n            binOp = spv::Op::OpULessThanEqual;\n        else\n            binOp = spv::Op::OpSLessThanEqual;\n        break;\n    case glslang::EOpGreaterThanEqual:\n        if (isFloat)\n            binOp = spv::Op::OpFOrdGreaterThanEqual;\n        else if (isUnsigned)\n            binOp = spv::Op::OpUGreaterThanEqual;\n        else\n            binOp = spv::Op::OpSGreaterThanEqual;\n        break;\n    case glslang::EOpEqual:\n    case glslang::EOpVectorEqual:\n        if (isFloat)\n            binOp = spv::Op::OpFOrdEqual;\n        else if (isBool)\n            binOp = spv::Op::OpLogicalEqual;\n        else\n            binOp = spv::Op::OpIEqual;\n        break;\n    case glslang::EOpNotEqual:\n    case glslang::EOpVectorNotEqual:\n        if (isFloat)\n            binOp = spv::Op::OpFUnordNotEqual;\n        else if (isBool)\n            binOp = spv::Op::OpLogicalNotEqual;\n        else\n            binOp = spv::Op::OpINotEqual;\n        break;\n    default:\n        break;\n    }\n\n    if (binOp != spv::Op::OpNop) {\n        spv::Id result = builder.createBinOp(binOp, typeId, left, right);\n        decorations.addNoContraction(builder, result);\n        decorations.addNonUniform(builder, result);\n        return builder.setPrecision(result, decorations.precision);\n    }\n\n    return 0;\n}\n\n//\n// Translate AST matrix operation to SPV operation, already having SPV-based operands/types.\n// These can be any of:\n//\n//   matrix * scalar\n//   scalar * matrix\n//   matrix * matrix     linear algebraic\n//   matrix * vector\n//   vector * matrix\n//   matrix * matrix     componentwise\n//   matrix op matrix    op in {+, -, /}\n//   matrix op scalar    op in {+, -, /}\n//   scalar op matrix    op in {+, -, /}\n//\nspv::Id TGlslangToSpvTraverser::createBinaryMatrixOperation(spv::Op op, OpDecorations& decorations, spv::Id typeId,\n                                                            spv::Id left, spv::Id right)\n{\n    bool firstClass = true;\n\n    // First, handle first-class matrix operations (* and matrix/scalar)\n    switch (op) {\n    case spv::Op::OpFDiv:\n        if (builder.isMatrix(left) && builder.isScalar(right)) {\n            // turn matrix / scalar into a multiply...\n            spv::Id resultType = builder.getTypeId(right);\n            right = builder.createBinOp(spv::Op::OpFDiv, resultType, builder.makeFpConstant(resultType, 1.0), right);\n            op = spv::Op::OpMatrixTimesScalar;\n        } else\n            firstClass = false;\n        break;\n    case spv::Op::OpMatrixTimesScalar:\n        if (builder.isMatrix(right) || builder.isCooperativeMatrix(right))\n            std::swap(left, right);\n        assert(builder.isScalar(right));\n        break;\n    case spv::Op::OpVectorTimesMatrix:\n        assert(builder.isVector(left));\n        assert(builder.isMatrix(right));\n        break;\n    case spv::Op::OpMatrixTimesVector:\n        assert(builder.isMatrix(left));\n        assert(builder.isVector(right));\n        break;\n    case spv::Op::OpMatrixTimesMatrix:\n        assert(builder.isMatrix(left));\n        assert(builder.isMatrix(right));\n        break;\n    default:\n        firstClass = false;\n        break;\n    }\n\n    if (builder.isCooperativeMatrix(left) || builder.isCooperativeMatrix(right))\n        firstClass = true;\n\n    if (firstClass) {\n        spv::Id result = builder.createBinOp(op, typeId, left, right);\n        decorations.addNoContraction(builder, result);\n        decorations.addNonUniform(builder, result);\n        return builder.setPrecision(result, decorations.precision);\n    }\n\n    // Handle component-wise +, -, *, %, and / for all combinations of type.\n    // The result type of all of them is the same type as the (a) matrix operand.\n    // The algorithm is to:\n    //   - break the matrix(es) into vectors\n    //   - smear any scalar to a vector\n    //   - do vector operations\n    //   - make a matrix out the vector results\n    switch (op) {\n    case spv::Op::OpFAdd:\n    case spv::Op::OpFSub:\n    case spv::Op::OpFDiv:\n    case spv::Op::OpFMod:\n    case spv::Op::OpFMul:\n    {\n        // one time set up...\n        bool  leftMat = builder.isMatrix(left);\n        bool rightMat = builder.isMatrix(right);\n        unsigned int numCols = leftMat ? builder.getNumColumns(left) : builder.getNumColumns(right);\n        int numRows = leftMat ? builder.getNumRows(left) : builder.getNumRows(right);\n        spv::Id scalarType = builder.getScalarTypeId(typeId);\n        spv::Id vecType = builder.makeVectorType(scalarType, numRows);\n        std::vector<spv::Id> results;\n        spv::Id smearVec = spv::NoResult;\n        if (builder.isScalar(left))\n            smearVec = builder.smearScalar(decorations.precision, left, vecType);\n        else if (builder.isScalar(right))\n            smearVec = builder.smearScalar(decorations.precision, right, vecType);\n\n        // do each vector op\n        for (unsigned int c = 0; c < numCols; ++c) {\n            std::vector<unsigned int> indexes;\n            indexes.push_back(c);\n            spv::Id  leftVec =  leftMat ? builder.createCompositeExtract( left, vecType, indexes) : smearVec;\n            spv::Id rightVec = rightMat ? builder.createCompositeExtract(right, vecType, indexes) : smearVec;\n            spv::Id result = builder.createBinOp(op, vecType, leftVec, rightVec);\n            decorations.addNoContraction(builder, result);\n            decorations.addNonUniform(builder, result);\n            results.push_back(builder.setPrecision(result, decorations.precision));\n        }\n\n        // put the pieces together\n        spv::Id result = builder.setPrecision(builder.createCompositeConstruct(typeId, results), decorations.precision);\n        decorations.addNonUniform(builder, result);\n        return result;\n    }\n    default:\n        assert(0);\n        return spv::NoResult;\n    }\n}\n\nspv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, OpDecorations& decorations, spv::Id typeId,\n    spv::Id operand, glslang::TBasicType typeProxy, const spv::Builder::AccessChain::CoherentFlags &lvalueCoherentFlags,\n    const glslang::TType &opType)\n{\n    spv::Op unaryOp = spv::Op::OpNop;\n    int extBuiltins = -1;\n    int libCall = -1;\n    bool isUnsigned = isTypeUnsignedInt(typeProxy);\n    bool isFloat = isTypeFloat(typeProxy);\n\n    switch (op) {\n    case glslang::EOpNegative:\n        if (isFloat) {\n            unaryOp = spv::Op::OpFNegate;\n            if (builder.isMatrixType(typeId))\n                return createUnaryMatrixOperation(unaryOp, decorations, typeId, operand, typeProxy);\n        } else\n            unaryOp = spv::Op::OpSNegate;\n        break;\n\n    case glslang::EOpLogicalNot:\n    case glslang::EOpVectorLogicalNot:\n        unaryOp = spv::Op::OpLogicalNot;\n        break;\n    case glslang::EOpBitwiseNot:\n        unaryOp = spv::Op::OpNot;\n        break;\n\n    case glslang::EOpDeterminant:\n        libCall = spv::GLSLstd450Determinant;\n        break;\n    case glslang::EOpMatrixInverse:\n        libCall = spv::GLSLstd450MatrixInverse;\n        break;\n    case glslang::EOpTranspose:\n        unaryOp = spv::Op::OpTranspose;\n        break;\n\n    case glslang::EOpRadians:\n        libCall = spv::GLSLstd450Radians;\n        break;\n    case glslang::EOpDegrees:\n        libCall = spv::GLSLstd450Degrees;\n        break;\n    case glslang::EOpSin:\n        libCall = spv::GLSLstd450Sin;\n        break;\n    case glslang::EOpCos:\n        libCall = spv::GLSLstd450Cos;\n        break;\n    case glslang::EOpTan:\n        libCall = spv::GLSLstd450Tan;\n        break;\n    case glslang::EOpAcos:\n        libCall = spv::GLSLstd450Acos;\n        break;\n    case glslang::EOpAsin:\n        libCall = spv::GLSLstd450Asin;\n        break;\n    case glslang::EOpAtan:\n        libCall = spv::GLSLstd450Atan;\n        break;\n\n    case glslang::EOpAcosh:\n        libCall = spv::GLSLstd450Acosh;\n        break;\n    case glslang::EOpAsinh:\n        libCall = spv::GLSLstd450Asinh;\n        break;\n    case glslang::EOpAtanh:\n        libCall = spv::GLSLstd450Atanh;\n        break;\n    case glslang::EOpTanh:\n        libCall = spv::GLSLstd450Tanh;\n        break;\n    case glslang::EOpCosh:\n        libCall = spv::GLSLstd450Cosh;\n        break;\n    case glslang::EOpSinh:\n        libCall = spv::GLSLstd450Sinh;\n        break;\n\n    case glslang::EOpLength:\n        libCall = spv::GLSLstd450Length;\n        break;\n    case glslang::EOpNormalize:\n        libCall = spv::GLSLstd450Normalize;\n        break;\n\n    case glslang::EOpExp:\n        libCall = spv::GLSLstd450Exp;\n        break;\n    case glslang::EOpLog:\n        libCall = spv::GLSLstd450Log;\n        break;\n    case glslang::EOpExp2:\n        libCall = spv::GLSLstd450Exp2;\n        break;\n    case glslang::EOpLog2:\n        libCall = spv::GLSLstd450Log2;\n        break;\n    case glslang::EOpSqrt:\n        libCall = spv::GLSLstd450Sqrt;\n        break;\n    case glslang::EOpInverseSqrt:\n        libCall = spv::GLSLstd450InverseSqrt;\n        break;\n\n    case glslang::EOpFloor:\n        libCall = spv::GLSLstd450Floor;\n        break;\n    case glslang::EOpTrunc:\n        libCall = spv::GLSLstd450Trunc;\n        break;\n    case glslang::EOpRound:\n        libCall = spv::GLSLstd450Round;\n        break;\n    case glslang::EOpRoundEven:\n        libCall = spv::GLSLstd450RoundEven;\n        break;\n    case glslang::EOpCeil:\n        libCall = spv::GLSLstd450Ceil;\n        break;\n    case glslang::EOpFract:\n        libCall = spv::GLSLstd450Fract;\n        break;\n\n    case glslang::EOpIsNan:\n        unaryOp = spv::Op::OpIsNan;\n        break;\n    case glslang::EOpIsInf:\n        unaryOp = spv::Op::OpIsInf;\n        break;\n    case glslang::EOpIsFinite:\n        unaryOp = spv::Op::OpIsFinite;\n        break;\n\n    case glslang::EOpFloatBitsToInt:\n    case glslang::EOpFloatBitsToUint:\n    case glslang::EOpIntBitsToFloat:\n    case glslang::EOpUintBitsToFloat:\n    case glslang::EOpDoubleBitsToInt64:\n    case glslang::EOpDoubleBitsToUint64:\n    case glslang::EOpInt64BitsToDouble:\n    case glslang::EOpUint64BitsToDouble:\n    case glslang::EOpFloat16BitsToInt16:\n    case glslang::EOpFloat16BitsToUint16:\n    case glslang::EOpInt16BitsToFloat16:\n    case glslang::EOpUint16BitsToFloat16:\n        unaryOp = spv::Op::OpBitcast;\n        break;\n\n    case glslang::EOpPackSnorm2x16:\n        libCall = spv::GLSLstd450PackSnorm2x16;\n        break;\n    case glslang::EOpUnpackSnorm2x16:\n        libCall = spv::GLSLstd450UnpackSnorm2x16;\n        break;\n    case glslang::EOpPackUnorm2x16:\n        libCall = spv::GLSLstd450PackUnorm2x16;\n        break;\n    case glslang::EOpUnpackUnorm2x16:\n        libCall = spv::GLSLstd450UnpackUnorm2x16;\n        break;\n    case glslang::EOpPackHalf2x16:\n        libCall = spv::GLSLstd450PackHalf2x16;\n        break;\n    case glslang::EOpUnpackHalf2x16:\n        libCall = spv::GLSLstd450UnpackHalf2x16;\n        break;\n    case glslang::EOpPackSnorm4x8:\n        libCall = spv::GLSLstd450PackSnorm4x8;\n        break;\n    case glslang::EOpUnpackSnorm4x8:\n        libCall = spv::GLSLstd450UnpackSnorm4x8;\n        break;\n    case glslang::EOpPackUnorm4x8:\n        libCall = spv::GLSLstd450PackUnorm4x8;\n        break;\n    case glslang::EOpUnpackUnorm4x8:\n        libCall = spv::GLSLstd450UnpackUnorm4x8;\n        break;\n    case glslang::EOpPackDouble2x32:\n        libCall = spv::GLSLstd450PackDouble2x32;\n        break;\n    case glslang::EOpUnpackDouble2x32:\n        libCall = spv::GLSLstd450UnpackDouble2x32;\n        break;\n\n    case glslang::EOpPackInt2x32:\n    case glslang::EOpUnpackInt2x32:\n    case glslang::EOpPackUint2x32:\n    case glslang::EOpUnpackUint2x32:\n    case glslang::EOpPack16:\n    case glslang::EOpPack32:\n    case glslang::EOpPack64:\n    case glslang::EOpUnpack32:\n    case glslang::EOpUnpack16:\n    case glslang::EOpUnpack8:\n    case glslang::EOpPackInt2x16:\n    case glslang::EOpUnpackInt2x16:\n    case glslang::EOpPackUint2x16:\n    case glslang::EOpUnpackUint2x16:\n    case glslang::EOpPackInt4x16:\n    case glslang::EOpUnpackInt4x16:\n    case glslang::EOpPackUint4x16:\n    case glslang::EOpUnpackUint4x16:\n    case glslang::EOpPackFloat2x16:\n    case glslang::EOpUnpackFloat2x16:\n        unaryOp = spv::Op::OpBitcast;\n        break;\n\n    case glslang::EOpDPdx:\n        unaryOp = spv::Op::OpDPdx;\n        break;\n    case glslang::EOpDPdy:\n        unaryOp = spv::Op::OpDPdy;\n        break;\n    case glslang::EOpFwidth:\n        unaryOp = spv::Op::OpFwidth;\n        break;\n\n    case glslang::EOpAny:\n        unaryOp = spv::Op::OpAny;\n        break;\n    case glslang::EOpAll:\n        unaryOp = spv::Op::OpAll;\n        break;\n\n    case glslang::EOpAbs:\n        if (isFloat)\n            libCall = spv::GLSLstd450FAbs;\n        else\n            libCall = spv::GLSLstd450SAbs;\n        break;\n    case glslang::EOpSign:\n        if (isFloat)\n            libCall = spv::GLSLstd450FSign;\n        else\n            libCall = spv::GLSLstd450SSign;\n        break;\n\n    case glslang::EOpDPdxFine:\n        unaryOp = spv::Op::OpDPdxFine;\n        break;\n    case glslang::EOpDPdyFine:\n        unaryOp = spv::Op::OpDPdyFine;\n        break;\n    case glslang::EOpFwidthFine:\n        unaryOp = spv::Op::OpFwidthFine;\n        break;\n    case glslang::EOpDPdxCoarse:\n        unaryOp = spv::Op::OpDPdxCoarse;\n        break;\n    case glslang::EOpDPdyCoarse:\n        unaryOp = spv::Op::OpDPdyCoarse;\n        break;\n    case glslang::EOpFwidthCoarse:\n        unaryOp = spv::Op::OpFwidthCoarse;\n        break;\n    case glslang::EOpRayQueryProceed:\n        unaryOp = spv::Op::OpRayQueryProceedKHR;\n        break;\n    case glslang::EOpRayQueryGetRayTMin:\n        unaryOp = spv::Op::OpRayQueryGetRayTMinKHR;\n        break;\n    case glslang::EOpRayQueryGetRayFlags:\n        unaryOp = spv::Op::OpRayQueryGetRayFlagsKHR;\n        break;\n    case glslang::EOpRayQueryGetWorldRayOrigin:\n        unaryOp = spv::Op::OpRayQueryGetWorldRayOriginKHR;\n        break;\n    case glslang::EOpRayQueryGetWorldRayDirection:\n        unaryOp = spv::Op::OpRayQueryGetWorldRayDirectionKHR;\n        break;\n    case glslang::EOpRayQueryGetIntersectionCandidateAABBOpaque:\n        unaryOp = spv::Op::OpRayQueryGetIntersectionCandidateAABBOpaqueKHR;\n        break;\n    case glslang::EOpInterpolateAtCentroid:\n        if (typeProxy == glslang::EbtFloat16)\n            builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float);\n        libCall = spv::GLSLstd450InterpolateAtCentroid;\n        break;\n    case glslang::EOpAtomicCounterIncrement:\n    case glslang::EOpAtomicCounterDecrement:\n    case glslang::EOpAtomicCounter:\n    {\n        // Handle all of the atomics in one place, in createAtomicOperation()\n        std::vector<spv::Id> operands;\n        operands.push_back(operand);\n        return createAtomicOperation(op, decorations.precision, typeId, operands, typeProxy, lvalueCoherentFlags, opType);\n    }\n\n    case glslang::EOpBitFieldReverse:\n        unaryOp = spv::Op::OpBitReverse;\n        break;\n    case glslang::EOpBitCount:\n        unaryOp = spv::Op::OpBitCount;\n        break;\n    case glslang::EOpFindLSB:\n        libCall = spv::GLSLstd450FindILsb;\n        break;\n    case glslang::EOpFindMSB:\n        if (isUnsigned)\n            libCall = spv::GLSLstd450FindUMsb;\n        else\n            libCall = spv::GLSLstd450FindSMsb;\n        break;\n\n    case glslang::EOpCountLeadingZeros:\n        builder.addCapability(spv::Capability::IntegerFunctions2INTEL);\n        builder.addExtension(\"SPV_INTEL_shader_integer_functions2\");\n        unaryOp = spv::Op::OpUCountLeadingZerosINTEL;\n        break;\n\n    case glslang::EOpCountTrailingZeros:\n        builder.addCapability(spv::Capability::IntegerFunctions2INTEL);\n        builder.addExtension(\"SPV_INTEL_shader_integer_functions2\");\n        unaryOp = spv::Op::OpUCountTrailingZerosINTEL;\n        break;\n\n    case glslang::EOpBallot:\n    case glslang::EOpReadFirstInvocation:\n    case glslang::EOpAnyInvocation:\n    case glslang::EOpAllInvocations:\n    case glslang::EOpAllInvocationsEqual:\n    case glslang::EOpMinInvocations:\n    case glslang::EOpMaxInvocations:\n    case glslang::EOpAddInvocations:\n    case glslang::EOpMinInvocationsNonUniform:\n    case glslang::EOpMaxInvocationsNonUniform:\n    case glslang::EOpAddInvocationsNonUniform:\n    case glslang::EOpMinInvocationsInclusiveScan:\n    case glslang::EOpMaxInvocationsInclusiveScan:\n    case glslang::EOpAddInvocationsInclusiveScan:\n    case glslang::EOpMinInvocationsInclusiveScanNonUniform:\n    case glslang::EOpMaxInvocationsInclusiveScanNonUniform:\n    case glslang::EOpAddInvocationsInclusiveScanNonUniform:\n    case glslang::EOpMinInvocationsExclusiveScan:\n    case glslang::EOpMaxInvocationsExclusiveScan:\n    case glslang::EOpAddInvocationsExclusiveScan:\n    case glslang::EOpMinInvocationsExclusiveScanNonUniform:\n    case glslang::EOpMaxInvocationsExclusiveScanNonUniform:\n    case glslang::EOpAddInvocationsExclusiveScanNonUniform:\n    {\n        std::vector<spv::Id> operands;\n        operands.push_back(operand);\n        return createInvocationsOperation(op, typeId, operands, typeProxy);\n    }\n    case glslang::EOpSubgroupAll:\n    case glslang::EOpSubgroupAny:\n    case glslang::EOpSubgroupAllEqual:\n    case glslang::EOpSubgroupBroadcastFirst:\n    case glslang::EOpSubgroupBallot:\n    case glslang::EOpSubgroupInverseBallot:\n    case glslang::EOpSubgroupBallotBitCount:\n    case glslang::EOpSubgroupBallotInclusiveBitCount:\n    case glslang::EOpSubgroupBallotExclusiveBitCount:\n    case glslang::EOpSubgroupBallotFindLSB:\n    case glslang::EOpSubgroupBallotFindMSB:\n    case glslang::EOpSubgroupAdd:\n    case glslang::EOpSubgroupMul:\n    case glslang::EOpSubgroupMin:\n    case glslang::EOpSubgroupMax:\n    case glslang::EOpSubgroupAnd:\n    case glslang::EOpSubgroupOr:\n    case glslang::EOpSubgroupXor:\n    case glslang::EOpSubgroupInclusiveAdd:\n    case glslang::EOpSubgroupInclusiveMul:\n    case glslang::EOpSubgroupInclusiveMin:\n    case glslang::EOpSubgroupInclusiveMax:\n    case glslang::EOpSubgroupInclusiveAnd:\n    case glslang::EOpSubgroupInclusiveOr:\n    case glslang::EOpSubgroupInclusiveXor:\n    case glslang::EOpSubgroupExclusiveAdd:\n    case glslang::EOpSubgroupExclusiveMul:\n    case glslang::EOpSubgroupExclusiveMin:\n    case glslang::EOpSubgroupExclusiveMax:\n    case glslang::EOpSubgroupExclusiveAnd:\n    case glslang::EOpSubgroupExclusiveOr:\n    case glslang::EOpSubgroupExclusiveXor:\n    case glslang::EOpSubgroupQuadSwapHorizontal:\n    case glslang::EOpSubgroupQuadSwapVertical:\n    case glslang::EOpSubgroupQuadSwapDiagonal:\n    case glslang::EOpSubgroupQuadAll:\n    case glslang::EOpSubgroupQuadAny: {\n        std::vector<spv::Id> operands;\n        operands.push_back(operand);\n        return createSubgroupOperation(op, typeId, operands, typeProxy);\n    }\n    case glslang::EOpMbcnt:\n        extBuiltins = getExtBuiltins(spv::E_SPV_AMD_shader_ballot);\n        libCall = spv::MbcntAMD;\n        break;\n\n    case glslang::EOpCubeFaceIndex:\n        extBuiltins = getExtBuiltins(spv::E_SPV_AMD_gcn_shader);\n        libCall = spv::CubeFaceIndexAMD;\n        break;\n\n    case glslang::EOpCubeFaceCoord:\n        extBuiltins = getExtBuiltins(spv::E_SPV_AMD_gcn_shader);\n        libCall = spv::CubeFaceCoordAMD;\n        break;\n    case glslang::EOpSubgroupPartition:\n        unaryOp = spv::Op::OpGroupNonUniformPartitionNV;\n        break;\n    case glslang::EOpConstructReference:\n        unaryOp = spv::Op::OpBitcast;\n        break;\n\n    case glslang::EOpConvUint64ToAccStruct:\n    case glslang::EOpConvUvec2ToAccStruct:\n        unaryOp = spv::Op::OpConvertUToAccelerationStructureKHR;\n        break;\n\n    case glslang::EOpHitObjectIsEmptyNV:\n        unaryOp = spv::Op::OpHitObjectIsEmptyNV;\n        break;\n\n    case glslang::EOpHitObjectIsMissNV:\n        unaryOp = spv::Op::OpHitObjectIsMissNV;\n        break;\n\n    case glslang::EOpHitObjectIsHitNV:\n        unaryOp = spv::Op::OpHitObjectIsHitNV;\n        break;\n\n    case glslang::EOpHitObjectGetObjectRayOriginNV:\n        unaryOp = spv::Op::OpHitObjectGetObjectRayOriginNV;\n        break;\n\n    case glslang::EOpHitObjectGetObjectRayDirectionNV:\n        unaryOp = spv::Op::OpHitObjectGetObjectRayDirectionNV;\n        break;\n\n    case glslang::EOpHitObjectGetWorldRayOriginNV:\n        unaryOp = spv::Op::OpHitObjectGetWorldRayOriginNV;\n        break;\n\n    case glslang::EOpHitObjectGetWorldRayDirectionNV:\n        unaryOp = spv::Op::OpHitObjectGetWorldRayDirectionNV;\n        break;\n\n    case glslang::EOpHitObjectGetObjectToWorldNV:\n        unaryOp = spv::Op::OpHitObjectGetObjectToWorldNV;\n        break;\n\n    case glslang::EOpHitObjectGetWorldToObjectNV:\n        unaryOp = spv::Op::OpHitObjectGetWorldToObjectNV;\n        break;\n\n    case glslang::EOpHitObjectGetRayTMinNV:\n        unaryOp = spv::Op::OpHitObjectGetRayTMinNV;\n        break;\n\n    case glslang::EOpHitObjectGetRayTMaxNV:\n        unaryOp = spv::Op::OpHitObjectGetRayTMaxNV;\n        break;\n\n    case glslang::EOpHitObjectGetPrimitiveIndexNV:\n        unaryOp = spv::Op::OpHitObjectGetPrimitiveIndexNV;\n        break;\n\n    case glslang::EOpHitObjectGetInstanceIdNV:\n        unaryOp = spv::Op::OpHitObjectGetInstanceIdNV;\n        break;\n\n    case glslang::EOpHitObjectGetInstanceCustomIndexNV:\n        unaryOp = spv::Op::OpHitObjectGetInstanceCustomIndexNV;\n        break;\n\n    case glslang::EOpHitObjectGetGeometryIndexNV:\n        unaryOp = spv::Op::OpHitObjectGetGeometryIndexNV;\n        break;\n\n    case glslang::EOpHitObjectGetHitKindNV:\n        unaryOp = spv::Op::OpHitObjectGetHitKindNV;\n        break;\n\n    case glslang::EOpHitObjectGetCurrentTimeNV:\n        unaryOp = spv::Op::OpHitObjectGetCurrentTimeNV;\n        break;\n\n    case glslang::EOpHitObjectGetShaderBindingTableRecordIndexNV:\n        unaryOp = spv::Op::OpHitObjectGetShaderBindingTableRecordIndexNV;\n        break;\n\n    case glslang::EOpHitObjectGetShaderRecordBufferHandleNV:\n        unaryOp = spv::Op::OpHitObjectGetShaderRecordBufferHandleNV;\n        break;\n\n    case glslang::EOpHitObjectGetClusterIdNV:\n        unaryOp = spv::Op::OpHitObjectGetClusterIdNV;\n        builder.addExtension(spv::E_SPV_NV_cluster_acceleration_structure);\n        builder.addCapability(spv::Capability::ShaderInvocationReorderNV);\n        builder.addCapability(spv::Capability::RayTracingClusterAccelerationStructureNV);\n        break;\n\n    case glslang::EOpHitObjectGetSpherePositionNV:\n        unaryOp = spv::Op::OpHitObjectGetSpherePositionNV;\n        builder.addExtension(spv::E_SPV_NV_linear_swept_spheres);\n        builder.addCapability(spv::Capability::ShaderInvocationReorderNV);\n        builder.addCapability(spv::Capability::RayTracingSpheresGeometryNV);\n        break;\n\n    case glslang::EOpHitObjectGetSphereRadiusNV:\n        unaryOp = spv::Op::OpHitObjectGetSphereRadiusNV;\n        builder.addExtension(spv::E_SPV_NV_linear_swept_spheres);\n        builder.addCapability(spv::Capability::ShaderInvocationReorderNV);\n        builder.addCapability(spv::Capability::RayTracingSpheresGeometryNV);\n        break;\n\n    case glslang::EOpHitObjectIsSphereHitNV:\n        unaryOp = spv::Op::OpHitObjectIsSphereHitNV;\n        builder.addExtension(spv::E_SPV_NV_linear_swept_spheres);\n        builder.addCapability(spv::Capability::ShaderInvocationReorderNV);\n        builder.addCapability(spv::Capability::RayTracingSpheresGeometryNV);\n        break;\n\n    case glslang::EOpHitObjectIsLSSHitNV:\n        unaryOp = spv::Op::OpHitObjectIsLSSHitNV;\n        builder.addExtension(spv::E_SPV_NV_linear_swept_spheres);\n        builder.addCapability(spv::Capability::ShaderInvocationReorderNV);\n        builder.addCapability(spv::Capability::RayTracingLinearSweptSpheresGeometryNV);\n        break;\n\n    case glslang::EOpFetchMicroTriangleVertexPositionNV:\n        unaryOp = spv::Op::OpFetchMicroTriangleVertexPositionNV;\n        break;\n\n    case glslang::EOpFetchMicroTriangleVertexBarycentricNV:\n        unaryOp = spv::Op::OpFetchMicroTriangleVertexBarycentricNV;\n        break;\n\n    case glslang::EOpCopyObject:\n        unaryOp = spv::Op::OpCopyObject;\n        break;\n\n    case glslang::EOpDepthAttachmentReadEXT:\n        builder.addExtension(spv::E_SPV_EXT_shader_tile_image);\n        builder.addCapability(spv::Capability::TileImageDepthReadAccessEXT);\n        unaryOp = spv::Op::OpDepthAttachmentReadEXT;\n        decorations.precision = spv::NoPrecision;\n        break;\n    case glslang::EOpStencilAttachmentReadEXT:\n        builder.addExtension(spv::E_SPV_EXT_shader_tile_image);\n        builder.addCapability(spv::Capability::TileImageStencilReadAccessEXT);\n        unaryOp = spv::Op::OpStencilAttachmentReadEXT;\n        decorations.precision = spv::Decoration::RelaxedPrecision;\n        break;\n\n    default:\n        return 0;\n    }\n\n    spv::Id id;\n    if (libCall >= 0) {\n        std::vector<spv::Id> args;\n        args.push_back(operand);\n        id = builder.createBuiltinCall(typeId, extBuiltins >= 0 ? extBuiltins : stdBuiltins, libCall, args);\n    } else {\n        id = builder.createUnaryOp(unaryOp, typeId, operand);\n    }\n\n    decorations.addNoContraction(builder, id);\n    decorations.addNonUniform(builder, id);\n    return builder.setPrecision(id, decorations.precision);\n}\n\n// Create a unary operation on a matrix\nspv::Id TGlslangToSpvTraverser::createUnaryMatrixOperation(spv::Op op, OpDecorations& decorations, spv::Id typeId,\n                                                           spv::Id operand, glslang::TBasicType /* typeProxy */)\n{\n    // Handle unary operations vector by vector.\n    // The result type is the same type as the original type.\n    // The algorithm is to:\n    //   - break the matrix into vectors\n    //   - apply the operation to each vector\n    //   - make a matrix out the vector results\n\n    // get the types sorted out\n    int numCols = builder.getNumColumns(operand);\n    int numRows = builder.getNumRows(operand);\n    spv::Id srcVecType  = builder.makeVectorType(builder.getScalarTypeId(builder.getTypeId(operand)), numRows);\n    spv::Id destVecType = builder.makeVectorType(builder.getScalarTypeId(typeId), numRows);\n    std::vector<spv::Id> results;\n\n    // do each vector op\n    for (int c = 0; c < numCols; ++c) {\n        std::vector<unsigned int> indexes;\n        indexes.push_back(c);\n        spv::Id srcVec  = builder.createCompositeExtract(operand, srcVecType, indexes);\n        spv::Id destVec = builder.createUnaryOp(op, destVecType, srcVec);\n        decorations.addNoContraction(builder, destVec);\n        decorations.addNonUniform(builder, destVec);\n        results.push_back(builder.setPrecision(destVec, decorations.precision));\n    }\n\n    // put the pieces together\n    spv::Id result = builder.setPrecision(builder.createCompositeConstruct(typeId, results), decorations.precision);\n    decorations.addNonUniform(builder, result);\n    return result;\n}\n\n// For converting integers where both the bitwidth and the signedness could\n// change, but only do the width change here. The caller is still responsible\n// for the signedness conversion.\n// destType is the final type that will be converted to, but this function\n// may only be doing part of that conversion.\nspv::Id TGlslangToSpvTraverser::createIntWidthConversion(spv::Id operand, int vectorSize, spv::Id destType,\n                                                         glslang::TBasicType resultBasicType, glslang::TBasicType operandBasicType)\n{\n    // Get the result type width, based on the type to convert to.\n    int width = GetNumBits(resultBasicType);\n\n    // Get the conversion operation and result type,\n    // based on the target width, but the source type.\n    spv::Id type = spv::NoType;\n    spv::Op convOp = spv::Op::OpNop;\n    if (isTypeSignedInt(operandBasicType)) {\n        convOp = spv::Op::OpSConvert;\n        type = builder.makeIntType(width);\n    } else {\n        convOp = spv::Op::OpUConvert;\n        type = builder.makeUintType(width);\n    }\n\n    if (builder.getOpCode(destType) == spv::Op::OpTypeCooperativeVectorNV) {\n        type = builder.makeCooperativeVectorTypeNV(type, builder.getCooperativeVectorNumComponents(destType));\n    } else if (vectorSize > 0)\n        type = builder.makeVectorType(type, vectorSize);\n    else if (builder.getOpCode(destType) == spv::Op::OpTypeCooperativeMatrixKHR ||\n             builder.getOpCode(destType) == spv::Op::OpTypeCooperativeMatrixNV) {\n\n        type = builder.makeCooperativeMatrixTypeWithSameShape(type, destType);\n    }\n\n    return builder.createUnaryOp(convOp, type, operand);\n}\n\nspv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, OpDecorations& decorations, spv::Id destType,\n                                                 spv::Id operand, glslang::TBasicType resultBasicType, glslang::TBasicType operandBasicType)\n{\n    spv::Op convOp = spv::Op::OpNop;\n    spv::Id zero = 0;\n    spv::Id one = 0;\n\n    int vectorSize = builder.isVectorType(destType) ? builder.getNumTypeComponents(destType) : 0;\n\n    if (IsOpNumericConv(op) || op == glslang::EOpConstructSaturated) {\n        if (isTypeSignedInt(operandBasicType) && isTypeFloat(resultBasicType)) {\n            convOp = spv::Op::OpConvertSToF;\n        }\n        if (isTypeUnsignedInt(operandBasicType) && isTypeFloat(resultBasicType)) {\n            convOp = spv::Op::OpConvertUToF;\n        }\n        if (isTypeFloat(operandBasicType) && isTypeSignedInt(resultBasicType)) {\n            convOp = spv::Op::OpConvertFToS;\n        }\n        if (isTypeFloat(operandBasicType) && isTypeUnsignedInt(resultBasicType)) {\n            convOp = spv::Op::OpConvertFToU;\n        }\n        if (isTypeSignedInt(operandBasicType) && isTypeSignedInt(resultBasicType)) {\n            convOp = spv::Op::OpSConvert;\n        }\n        if (isTypeUnsignedInt(operandBasicType) && isTypeUnsignedInt(resultBasicType)) {\n            convOp = spv::Op::OpUConvert;\n        }\n        if (isTypeFloat(operandBasicType) && isTypeFloat(resultBasicType)) {\n            convOp = spv::Op::OpFConvert;\n            if (builder.isMatrixType(destType))\n                return createUnaryMatrixOperation(convOp, decorations, destType, operand, operandBasicType);\n        }\n        if (isTypeInt(operandBasicType) && isTypeInt(resultBasicType) &&\n            isTypeUnsignedInt(operandBasicType) != isTypeUnsignedInt(resultBasicType)) {\n\n            if (GetNumBits(operandBasicType) != GetNumBits(resultBasicType)) {\n                // OpSConvert/OpUConvert + OpBitCast\n                operand = createIntWidthConversion(operand, vectorSize, destType, resultBasicType, operandBasicType);\n            }\n\n            if (builder.isInSpecConstCodeGenMode()) {\n                uint32_t bits = GetNumBits(resultBasicType);\n                spv::Id zeroType = builder.makeUintType(bits);\n                if (bits == 64) {\n                    zero = builder.makeInt64Constant(zeroType, 0, false);\n                } else {\n                    zero = builder.makeIntConstant(zeroType, 0, false);\n                }\n                zero = makeSmearedConstant(zero, vectorSize);\n                // Use OpIAdd, instead of OpBitcast to do the conversion when\n                // generating for OpSpecConstantOp instruction.\n                return builder.createBinOp(spv::Op::OpIAdd, destType, operand, zero);\n            }\n            // For normal run-time conversion instruction, use OpBitcast.\n            convOp = spv::Op::OpBitcast;\n        }\n        if (resultBasicType == glslang::EbtBool) {\n            uint32_t bits = GetNumBits(operandBasicType);\n            if (isTypeInt(operandBasicType)) {\n                spv::Id zeroType = builder.makeUintType(bits);\n                if (bits == 64) {\n                    zero = builder.makeInt64Constant(zeroType, 0, false);\n                } else {\n                    zero = builder.makeIntConstant(zeroType, 0, false);\n                }\n                zero = makeSmearedConstant(zero, vectorSize);\n                return builder.createBinOp(spv::Op::OpINotEqual, destType, operand, zero);\n            } else {\n                assert(isTypeFloat(operandBasicType));\n                if (bits == 64) {\n                    zero = builder.makeDoubleConstant(0.0);\n                } else if (bits == 32) {\n                    zero = builder.makeFloatConstant(0.0);\n                } else {\n                    assert(bits == 16);\n                    zero = builder.makeFloat16Constant(0.0);\n                }\n                zero = makeSmearedConstant(zero, vectorSize);\n                return builder.createBinOp(spv::Op::OpFUnordNotEqual, destType, operand, zero);\n            }\n        }\n        if (operandBasicType == glslang::EbtBool) {\n            uint32_t bits = GetNumBits(resultBasicType);\n            convOp = spv::Op::OpSelect;\n            if (isTypeInt(resultBasicType)) {\n                spv::Id zeroType = isTypeSignedInt(resultBasicType) ? builder.makeIntType(bits) : builder.makeUintType(bits);\n                if (bits == 64) {\n                    zero = builder.makeInt64Constant(zeroType, 0, false);\n                    one = builder.makeInt64Constant(zeroType, 1, false);\n                } else {\n                    zero = builder.makeIntConstant(zeroType, 0, false);\n                    one = builder.makeIntConstant(zeroType, 1, false);\n                }\n            } else {\n                assert(isTypeFloat(resultBasicType));\n                if (bits == 64) {\n                    zero = builder.makeDoubleConstant(0.0);\n                    one = builder.makeDoubleConstant(1.0);\n                } else if (bits == 32) {\n                    zero = builder.makeFloatConstant(0.0);\n                    one = builder.makeFloatConstant(1.0);\n                } else {\n                    assert(bits == 16);\n                    zero = builder.makeFloat16Constant(0.0);\n                    one = builder.makeFloat16Constant(1.0);\n                }\n            }\n        }\n    }\n\n    if (convOp == spv::Op::OpNop) {\n        switch (op) {\n        case glslang::EOpConvUint64ToPtr:\n            convOp = spv::Op::OpConvertUToPtr;\n            break;\n        case glslang::EOpConvPtrToUint64:\n            convOp = spv::Op::OpConvertPtrToU;\n            break;\n        case glslang::EOpConvPtrToUvec2:\n        case glslang::EOpConvUvec2ToPtr:\n            convOp = spv::Op::OpBitcast;\n            break;\n\n        default:\n            break;\n        }\n    }\n\n    spv::Id result = 0;\n    if (convOp == spv::Op::OpNop)\n        return result;\n\n    if (convOp == spv::Op::OpSelect) {\n        zero = makeSmearedConstant(zero, vectorSize);\n        one  = makeSmearedConstant(one, vectorSize);\n        result = builder.createTriOp(convOp, destType, operand, one, zero);\n    } else\n        result = builder.createUnaryOp(convOp, destType, operand);\n\n    result = builder.setPrecision(result, decorations.precision);\n    decorations.addNonUniform(builder, result);\n    return result;\n}\n\nspv::Id TGlslangToSpvTraverser::makeSmearedConstant(spv::Id constant, int vectorSize)\n{\n    if (vectorSize == 0)\n        return constant;\n\n    spv::Id vectorTypeId = builder.makeVectorType(builder.getTypeId(constant), vectorSize);\n    std::vector<spv::Id> components;\n    for (int c = 0; c < vectorSize; ++c)\n        components.push_back(constant);\n    return builder.makeCompositeConstant(vectorTypeId, components);\n}\n\n// For glslang ops that map to SPV atomic opCodes\nspv::Id TGlslangToSpvTraverser::createAtomicOperation(glslang::TOperator op, spv::Decoration /*precision*/,\n    spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy,\n    const spv::Builder::AccessChain::CoherentFlags &lvalueCoherentFlags, const glslang::TType &opType)\n{\n    spv::Op opCode = spv::Op::OpNop;\n\n    switch (op) {\n    case glslang::EOpAtomicAdd:\n    case glslang::EOpImageAtomicAdd:\n    case glslang::EOpAtomicCounterAdd:\n        opCode = spv::Op::OpAtomicIAdd;\n        if (typeProxy == glslang::EbtFloat16 || typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble) {\n            opCode = spv::Op::OpAtomicFAddEXT;\n            if (typeProxy == glslang::EbtFloat16 &&\n                (opType.getVectorSize() == 2 || opType.getVectorSize() == 4)) {\n                builder.addExtension(spv::E_SPV_NV_shader_atomic_fp16_vector);\n                builder.addCapability(spv::Capability::AtomicFloat16VectorNV);\n            } else {\n                builder.addExtension(spv::E_SPV_EXT_shader_atomic_float_add);\n                if (typeProxy == glslang::EbtFloat16) {\n                    builder.addExtension(spv::E_SPV_EXT_shader_atomic_float16_add);\n                    builder.addCapability(spv::Capability::AtomicFloat16AddEXT);\n                } else if (typeProxy == glslang::EbtFloat) {\n                    builder.addCapability(spv::Capability::AtomicFloat32AddEXT);\n                } else {\n                    builder.addCapability(spv::Capability::AtomicFloat64AddEXT);\n                }\n            }\n        }\n        break;\n    case glslang::EOpAtomicSubtract:\n    case glslang::EOpAtomicCounterSubtract:\n        opCode = spv::Op::OpAtomicISub;\n        break;\n    case glslang::EOpAtomicMin:\n    case glslang::EOpImageAtomicMin:\n    case glslang::EOpAtomicCounterMin:\n        if (typeProxy == glslang::EbtFloat16 || typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble) {\n            opCode = spv::Op::OpAtomicFMinEXT;\n            if (typeProxy == glslang::EbtFloat16 &&\n                (opType.getVectorSize() == 2 || opType.getVectorSize() == 4)) {\n                builder.addExtension(spv::E_SPV_NV_shader_atomic_fp16_vector);\n                builder.addCapability(spv::Capability::AtomicFloat16VectorNV);\n            } else {\n                builder.addExtension(spv::E_SPV_EXT_shader_atomic_float_min_max);\n                if (typeProxy == glslang::EbtFloat16)\n                    builder.addCapability(spv::Capability::AtomicFloat16MinMaxEXT);\n                else if (typeProxy == glslang::EbtFloat)\n                    builder.addCapability(spv::Capability::AtomicFloat32MinMaxEXT);\n                else\n                    builder.addCapability(spv::Capability::AtomicFloat64MinMaxEXT);\n            }\n        } else if (typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64) {\n            opCode = spv::Op::OpAtomicUMin;\n        } else {\n            opCode = spv::Op::OpAtomicSMin;\n        }\n        break;\n    case glslang::EOpAtomicMax:\n    case glslang::EOpImageAtomicMax:\n    case glslang::EOpAtomicCounterMax:\n        if (typeProxy == glslang::EbtFloat16 || typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble) {\n            opCode = spv::Op::OpAtomicFMaxEXT;\n            if (typeProxy == glslang::EbtFloat16 &&\n                (opType.getVectorSize() == 2 || opType.getVectorSize() == 4)) {\n                builder.addExtension(spv::E_SPV_NV_shader_atomic_fp16_vector);\n                builder.addCapability(spv::Capability::AtomicFloat16VectorNV);\n            } else {\n                builder.addExtension(spv::E_SPV_EXT_shader_atomic_float_min_max);\n                if (typeProxy == glslang::EbtFloat16)\n                    builder.addCapability(spv::Capability::AtomicFloat16MinMaxEXT);\n                else if (typeProxy == glslang::EbtFloat)\n                    builder.addCapability(spv::Capability::AtomicFloat32MinMaxEXT);\n                else\n                    builder.addCapability(spv::Capability::AtomicFloat64MinMaxEXT);\n            }\n        } else if (typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64) {\n            opCode = spv::Op::OpAtomicUMax;\n        } else {\n            opCode = spv::Op::OpAtomicSMax;\n        }\n        break;\n    case glslang::EOpAtomicAnd:\n    case glslang::EOpImageAtomicAnd:\n    case glslang::EOpAtomicCounterAnd:\n        opCode = spv::Op::OpAtomicAnd;\n        break;\n    case glslang::EOpAtomicOr:\n    case glslang::EOpImageAtomicOr:\n    case glslang::EOpAtomicCounterOr:\n        opCode = spv::Op::OpAtomicOr;\n        break;\n    case glslang::EOpAtomicXor:\n    case glslang::EOpImageAtomicXor:\n    case glslang::EOpAtomicCounterXor:\n        opCode = spv::Op::OpAtomicXor;\n        break;\n    case glslang::EOpAtomicExchange:\n    case glslang::EOpImageAtomicExchange:\n    case glslang::EOpAtomicCounterExchange:\n        if ((typeProxy == glslang::EbtFloat16) && \n            (opType.getVectorSize() == 2 || opType.getVectorSize() == 4)) {\n                builder.addExtension(spv::E_SPV_NV_shader_atomic_fp16_vector);\n                builder.addCapability(spv::Capability::AtomicFloat16VectorNV);\n        }\n\n        opCode = spv::Op::OpAtomicExchange;\n        break;\n    case glslang::EOpAtomicCompSwap:\n    case glslang::EOpImageAtomicCompSwap:\n    case glslang::EOpAtomicCounterCompSwap:\n        opCode = spv::Op::OpAtomicCompareExchange;\n        break;\n    case glslang::EOpAtomicCounterIncrement:\n        opCode = spv::Op::OpAtomicIIncrement;\n        break;\n    case glslang::EOpAtomicCounterDecrement:\n        opCode = spv::Op::OpAtomicIDecrement;\n        break;\n    case glslang::EOpAtomicCounter:\n    case glslang::EOpImageAtomicLoad:\n    case glslang::EOpAtomicLoad:\n        opCode = spv::Op::OpAtomicLoad;\n        break;\n    case glslang::EOpAtomicStore:\n    case glslang::EOpImageAtomicStore:\n        opCode = spv::Op::OpAtomicStore;\n        break;\n    default:\n        assert(0);\n        break;\n    }\n\n    if (typeProxy == glslang::EbtInt64 || typeProxy == glslang::EbtUint64)\n        builder.addCapability(spv::Capability::Int64Atomics);\n\n    // Sort out the operands\n    //  - mapping from glslang -> SPV\n    //  - there are extra SPV operands that are optional in glslang\n    //  - compare-exchange swaps the value and comparator\n    //  - compare-exchange has an extra memory semantics\n    //  - EOpAtomicCounterDecrement needs a post decrement\n    spv::Id pointerId = 0, compareId = 0, valueId = 0;\n    // scope defaults to Device in the old model, QueueFamilyKHR in the new model\n    spv::Id scopeId;\n    if (glslangIntermediate->usingVulkanMemoryModel()) {\n        scopeId = builder.makeUintConstant(spv::Scope::QueueFamilyKHR);\n    } else {\n        scopeId = builder.makeUintConstant(spv::Scope::Device);\n    }\n    // semantics default to relaxed\n    spv::Id semanticsId = builder.makeUintConstant(lvalueCoherentFlags.isVolatile() &&\n        glslangIntermediate->usingVulkanMemoryModel() ?\n                                                    spv::MemorySemanticsMask::Volatile :\n                                                    spv::MemorySemanticsMask::MaskNone);\n    spv::Id semanticsId2 = semanticsId;\n\n    pointerId = operands[0];\n    if (opCode == spv::Op::OpAtomicIIncrement || opCode == spv::Op::OpAtomicIDecrement) {\n        // no additional operands\n    } else if (opCode == spv::Op::OpAtomicCompareExchange) {\n        compareId = operands[1];\n        valueId = operands[2];\n        if (operands.size() > 3) {\n            scopeId = operands[3];\n            semanticsId = builder.makeUintConstant(\n                builder.getConstantScalar(operands[4]) | builder.getConstantScalar(operands[5]));\n            semanticsId2 = builder.makeUintConstant(\n                builder.getConstantScalar(operands[6]) | builder.getConstantScalar(operands[7]));\n        }\n    } else if (opCode == spv::Op::OpAtomicLoad) {\n        if (operands.size() > 1) {\n            scopeId = operands[1];\n            semanticsId = builder.makeUintConstant(\n                builder.getConstantScalar(operands[2]) | builder.getConstantScalar(operands[3]));\n        }\n    } else {\n        // atomic store or RMW\n        valueId = operands[1];\n        if (operands.size() > 2) {\n            scopeId = operands[2];\n            semanticsId = builder.makeUintConstant\n                (builder.getConstantScalar(operands[3]) | builder.getConstantScalar(operands[4]));\n        }\n    }\n\n    // Check for capabilities\n    auto const semanticsImmediate = (spv::MemorySemanticsMask)(builder.getConstantScalar(semanticsId) | builder.getConstantScalar(semanticsId2));\n    if (anySet(semanticsImmediate, spv::MemorySemanticsMask::MakeAvailableKHR |\n                                   spv::MemorySemanticsMask::MakeVisibleKHR |\n                                   spv::MemorySemanticsMask::OutputMemoryKHR |\n                                   spv::MemorySemanticsMask::Volatile)) {\n        builder.addCapability(spv::Capability::VulkanMemoryModelKHR);\n    }\n\n    auto const scope = (spv::Scope)builder.getConstantScalar(scopeId);\n    if (scope == spv::Scope::QueueFamily) {\n        builder.addCapability(spv::Capability::VulkanMemoryModelKHR);\n    }\n\n    if (glslangIntermediate->usingVulkanMemoryModel() && scope == spv::Scope::Device) {\n        builder.addCapability(spv::Capability::VulkanMemoryModelDeviceScopeKHR);\n    }\n\n    std::vector<spv::Id> spvAtomicOperands;  // hold the spv operands\n    spvAtomicOperands.reserve(6);\n    spvAtomicOperands.push_back(pointerId);\n    spvAtomicOperands.push_back(scopeId);\n    spvAtomicOperands.push_back(semanticsId);\n    if (opCode == spv::Op::OpAtomicCompareExchange) {\n        spvAtomicOperands.push_back(semanticsId2);\n        spvAtomicOperands.push_back(valueId);\n        spvAtomicOperands.push_back(compareId);\n    } else if (opCode != spv::Op::OpAtomicLoad && opCode != spv::Op::OpAtomicIIncrement && opCode != spv::Op::OpAtomicIDecrement) {\n        spvAtomicOperands.push_back(valueId);\n    }\n\n    if (opCode == spv::Op::OpAtomicStore) {\n        builder.createNoResultOp(opCode, spvAtomicOperands);\n        return 0;\n    } else {\n        spv::Id resultId = builder.createOp(opCode, typeId, spvAtomicOperands);\n\n        // GLSL and HLSL atomic-counter decrement return post-decrement value,\n        // while SPIR-V returns pre-decrement value. Translate between these semantics.\n        if (op == glslang::EOpAtomicCounterDecrement)\n            resultId = builder.createBinOp(spv::Op::OpISub, typeId, resultId, builder.makeIntConstant(1));\n\n        return resultId;\n    }\n}\n\n// Create group invocation operations.\nspv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op, spv::Id typeId,\n    std::vector<spv::Id>& operands, glslang::TBasicType typeProxy)\n{\n    bool isUnsigned = isTypeUnsignedInt(typeProxy);\n    bool isFloat = isTypeFloat(typeProxy);\n\n    spv::Op opCode = spv::Op::OpNop;\n    std::vector<spv::IdImmediate> spvGroupOperands;\n    spv::GroupOperation groupOperation = spv::GroupOperation::Max;\n\n    if (op == glslang::EOpBallot || op == glslang::EOpReadFirstInvocation ||\n        op == glslang::EOpReadInvocation) {\n        builder.addExtension(spv::E_SPV_KHR_shader_ballot);\n        builder.addCapability(spv::Capability::SubgroupBallotKHR);\n    } else if (op == glslang::EOpAnyInvocation ||\n        op == glslang::EOpAllInvocations ||\n        op == glslang::EOpAllInvocationsEqual) {\n        builder.addExtension(spv::E_SPV_KHR_subgroup_vote);\n        builder.addCapability(spv::Capability::SubgroupVoteKHR);\n    } else {\n        builder.addCapability(spv::Capability::Groups);\n        if (op == glslang::EOpMinInvocationsNonUniform ||\n            op == glslang::EOpMaxInvocationsNonUniform ||\n            op == glslang::EOpAddInvocationsNonUniform ||\n            op == glslang::EOpMinInvocationsInclusiveScanNonUniform ||\n            op == glslang::EOpMaxInvocationsInclusiveScanNonUniform ||\n            op == glslang::EOpAddInvocationsInclusiveScanNonUniform ||\n            op == glslang::EOpMinInvocationsExclusiveScanNonUniform ||\n            op == glslang::EOpMaxInvocationsExclusiveScanNonUniform ||\n            op == glslang::EOpAddInvocationsExclusiveScanNonUniform)\n            builder.addExtension(spv::E_SPV_AMD_shader_ballot);\n\n        switch (op) {\n        case glslang::EOpMinInvocations:\n        case glslang::EOpMaxInvocations:\n        case glslang::EOpAddInvocations:\n        case glslang::EOpMinInvocationsNonUniform:\n        case glslang::EOpMaxInvocationsNonUniform:\n        case glslang::EOpAddInvocationsNonUniform:\n            groupOperation = spv::GroupOperation::Reduce;\n            break;\n        case glslang::EOpMinInvocationsInclusiveScan:\n        case glslang::EOpMaxInvocationsInclusiveScan:\n        case glslang::EOpAddInvocationsInclusiveScan:\n        case glslang::EOpMinInvocationsInclusiveScanNonUniform:\n        case glslang::EOpMaxInvocationsInclusiveScanNonUniform:\n        case glslang::EOpAddInvocationsInclusiveScanNonUniform:\n            groupOperation = spv::GroupOperation::InclusiveScan;\n            break;\n        case glslang::EOpMinInvocationsExclusiveScan:\n        case glslang::EOpMaxInvocationsExclusiveScan:\n        case glslang::EOpAddInvocationsExclusiveScan:\n        case glslang::EOpMinInvocationsExclusiveScanNonUniform:\n        case glslang::EOpMaxInvocationsExclusiveScanNonUniform:\n        case glslang::EOpAddInvocationsExclusiveScanNonUniform:\n            groupOperation = spv::GroupOperation::ExclusiveScan;\n            break;\n        default:\n            break;\n        }\n        spv::IdImmediate scope = { true, builder.makeUintConstant(spv::Scope::Subgroup) };\n        spvGroupOperands.push_back(scope);\n        if (groupOperation != spv::GroupOperation::Max) {\n            spv::IdImmediate groupOp = { false, (unsigned)groupOperation };\n            spvGroupOperands.push_back(groupOp);\n        }\n    }\n\n    for (auto opIt = operands.begin(); opIt != operands.end(); ++opIt) {\n        spv::IdImmediate op = { true, *opIt };\n        spvGroupOperands.push_back(op);\n    }\n\n    switch (op) {\n    case glslang::EOpAnyInvocation:\n        opCode = spv::Op::OpSubgroupAnyKHR;\n        break;\n    case glslang::EOpAllInvocations:\n        opCode = spv::Op::OpSubgroupAllKHR;\n        break;\n    case glslang::EOpAllInvocationsEqual:\n        opCode = spv::Op::OpSubgroupAllEqualKHR;\n        break;\n    case glslang::EOpReadInvocation:\n        opCode = spv::Op::OpSubgroupReadInvocationKHR;\n        if (builder.isVectorType(typeId))\n            return CreateInvocationsVectorOperation(opCode, groupOperation, typeId, operands);\n        break;\n    case glslang::EOpReadFirstInvocation:\n        opCode = spv::Op::OpSubgroupFirstInvocationKHR;\n        if (builder.isVectorType(typeId))\n            return CreateInvocationsVectorOperation(opCode, groupOperation, typeId, operands);\n        break;\n    case glslang::EOpBallot:\n    {\n        // NOTE: According to the spec, the result type of \"OpSubgroupBallotKHR\" must be a 4 component vector of 32\n        // bit integer types. The GLSL built-in function \"ballotARB()\" assumes the maximum number of invocations in\n        // a subgroup is 64. Thus, we have to convert uvec4.xy to uint64_t as follow:\n        //\n        //     result = Bitcast(SubgroupBallotKHR(Predicate).xy)\n        //\n        spv::Id uintType  = builder.makeUintType(32);\n        spv::Id uvec4Type = builder.makeVectorType(uintType, 4);\n        spv::Id result = builder.createOp(spv::Op::OpSubgroupBallotKHR, uvec4Type, spvGroupOperands);\n\n        std::vector<spv::Id> components;\n        components.push_back(builder.createCompositeExtract(result, uintType, 0));\n        components.push_back(builder.createCompositeExtract(result, uintType, 1));\n\n        spv::Id uvec2Type = builder.makeVectorType(uintType, 2);\n        return builder.createUnaryOp(spv::Op::OpBitcast, typeId,\n                                     builder.createCompositeConstruct(uvec2Type, components));\n    }\n\n    case glslang::EOpMinInvocations:\n    case glslang::EOpMaxInvocations:\n    case glslang::EOpAddInvocations:\n    case glslang::EOpMinInvocationsInclusiveScan:\n    case glslang::EOpMaxInvocationsInclusiveScan:\n    case glslang::EOpAddInvocationsInclusiveScan:\n    case glslang::EOpMinInvocationsExclusiveScan:\n    case glslang::EOpMaxInvocationsExclusiveScan:\n    case glslang::EOpAddInvocationsExclusiveScan:\n        if (op == glslang::EOpMinInvocations ||\n            op == glslang::EOpMinInvocationsInclusiveScan ||\n            op == glslang::EOpMinInvocationsExclusiveScan) {\n            if (isFloat)\n                opCode = spv::Op::OpGroupFMin;\n            else {\n                if (isUnsigned)\n                    opCode = spv::Op::OpGroupUMin;\n                else\n                    opCode = spv::Op::OpGroupSMin;\n            }\n        } else if (op == glslang::EOpMaxInvocations ||\n                   op == glslang::EOpMaxInvocationsInclusiveScan ||\n                   op == glslang::EOpMaxInvocationsExclusiveScan) {\n            if (isFloat)\n                opCode = spv::Op::OpGroupFMax;\n            else {\n                if (isUnsigned)\n                    opCode = spv::Op::OpGroupUMax;\n                else\n                    opCode = spv::Op::OpGroupSMax;\n            }\n        } else {\n            if (isFloat)\n                opCode = spv::Op::OpGroupFAdd;\n            else\n                opCode = spv::Op::OpGroupIAdd;\n        }\n\n        if (builder.isVectorType(typeId))\n            return CreateInvocationsVectorOperation(opCode, groupOperation, typeId, operands);\n\n        break;\n    case glslang::EOpMinInvocationsNonUniform:\n    case glslang::EOpMaxInvocationsNonUniform:\n    case glslang::EOpAddInvocationsNonUniform:\n    case glslang::EOpMinInvocationsInclusiveScanNonUniform:\n    case glslang::EOpMaxInvocationsInclusiveScanNonUniform:\n    case glslang::EOpAddInvocationsInclusiveScanNonUniform:\n    case glslang::EOpMinInvocationsExclusiveScanNonUniform:\n    case glslang::EOpMaxInvocationsExclusiveScanNonUniform:\n    case glslang::EOpAddInvocationsExclusiveScanNonUniform:\n        if (op == glslang::EOpMinInvocationsNonUniform ||\n            op == glslang::EOpMinInvocationsInclusiveScanNonUniform ||\n            op == glslang::EOpMinInvocationsExclusiveScanNonUniform) {\n            if (isFloat)\n                opCode = spv::Op::OpGroupFMinNonUniformAMD;\n            else {\n                if (isUnsigned)\n                    opCode = spv::Op::OpGroupUMinNonUniformAMD;\n                else\n                    opCode = spv::Op::OpGroupSMinNonUniformAMD;\n            }\n        }\n        else if (op == glslang::EOpMaxInvocationsNonUniform ||\n                 op == glslang::EOpMaxInvocationsInclusiveScanNonUniform ||\n                 op == glslang::EOpMaxInvocationsExclusiveScanNonUniform) {\n            if (isFloat)\n                opCode = spv::Op::OpGroupFMaxNonUniformAMD;\n            else {\n                if (isUnsigned)\n                    opCode = spv::Op::OpGroupUMaxNonUniformAMD;\n                else\n                    opCode = spv::Op::OpGroupSMaxNonUniformAMD;\n            }\n        }\n        else {\n            if (isFloat)\n                opCode = spv::Op::OpGroupFAddNonUniformAMD;\n            else\n                opCode = spv::Op::OpGroupIAddNonUniformAMD;\n        }\n\n        if (builder.isVectorType(typeId))\n            return CreateInvocationsVectorOperation(opCode, groupOperation, typeId, operands);\n\n        break;\n    default:\n        logger->missingFunctionality(\"invocation operation\");\n        return spv::NoResult;\n    }\n\n    assert(opCode != spv::Op::OpNop);\n    return builder.createOp(opCode, typeId, spvGroupOperands);\n}\n\n// Create group invocation operations on a vector\nspv::Id TGlslangToSpvTraverser::CreateInvocationsVectorOperation(spv::Op op, spv::GroupOperation groupOperation,\n    spv::Id typeId, std::vector<spv::Id>& operands)\n{\n    assert(op == spv::Op::OpGroupFMin || op == spv::Op::OpGroupUMin || op == spv::Op::OpGroupSMin ||\n           op == spv::Op::OpGroupFMax || op == spv::Op::OpGroupUMax || op == spv::Op::OpGroupSMax ||\n           op == spv::Op::OpGroupFAdd || op == spv::Op::OpGroupIAdd || op == spv::Op::OpGroupBroadcast ||\n           op == spv::Op::OpSubgroupReadInvocationKHR || op == spv::Op::OpSubgroupFirstInvocationKHR ||\n           op == spv::Op::OpGroupFMinNonUniformAMD || op == spv::Op::OpGroupUMinNonUniformAMD ||\n           op == spv::Op::OpGroupSMinNonUniformAMD ||\n           op == spv::Op::OpGroupFMaxNonUniformAMD || op == spv::Op::OpGroupUMaxNonUniformAMD ||\n           op == spv::Op::OpGroupSMaxNonUniformAMD ||\n           op == spv::Op::OpGroupFAddNonUniformAMD || op == spv::Op::OpGroupIAddNonUniformAMD);\n\n    // Handle group invocation operations scalar by scalar.\n    // The result type is the same type as the original type.\n    // The algorithm is to:\n    //   - break the vector into scalars\n    //   - apply the operation to each scalar\n    //   - make a vector out the scalar results\n\n    // get the types sorted out\n    int numComponents = builder.getNumComponents(operands[0]);\n    spv::Id scalarType = builder.getScalarTypeId(builder.getTypeId(operands[0]));\n    std::vector<spv::Id> results;\n\n    // do each scalar op\n    for (int comp = 0; comp < numComponents; ++comp) {\n        std::vector<unsigned int> indexes;\n        indexes.push_back(comp);\n        spv::IdImmediate scalar = { true, builder.createCompositeExtract(operands[0], scalarType, indexes) };\n        std::vector<spv::IdImmediate> spvGroupOperands;\n        if (op == spv::Op::OpSubgroupReadInvocationKHR) {\n            spvGroupOperands.push_back(scalar);\n            spv::IdImmediate operand = { true, operands[1] };\n            spvGroupOperands.push_back(operand);\n        } else if (op == spv::Op::OpSubgroupFirstInvocationKHR) {\n            spvGroupOperands.push_back(scalar);\n        } else if (op == spv::Op::OpGroupBroadcast) {\n            spv::IdImmediate scope = { true, builder.makeUintConstant(spv::Scope::Subgroup) };\n            spvGroupOperands.push_back(scope);\n            spvGroupOperands.push_back(scalar);\n            spv::IdImmediate operand = { true, operands[1] };\n            spvGroupOperands.push_back(operand);\n        } else {\n            spv::IdImmediate scope = { true, builder.makeUintConstant(spv::Scope::Subgroup) };\n            spvGroupOperands.push_back(scope);\n            spv::IdImmediate groupOp = { false, (unsigned)groupOperation };\n            spvGroupOperands.push_back(groupOp);\n            spvGroupOperands.push_back(scalar);\n        }\n\n        results.push_back(builder.createOp(op, scalarType, spvGroupOperands));\n    }\n\n    // put the pieces together\n    return builder.createCompositeConstruct(typeId, results);\n}\n\n// Create subgroup invocation operations.\nspv::Id TGlslangToSpvTraverser::createSubgroupOperation(glslang::TOperator op, spv::Id typeId,\n    std::vector<spv::Id>& operands, glslang::TBasicType typeProxy)\n{\n    // Add the required capabilities.\n    switch (op) {\n    case glslang::EOpSubgroupElect:\n        builder.addCapability(spv::Capability::GroupNonUniform);\n        break;\n    case glslang::EOpSubgroupQuadAll:\n    case glslang::EOpSubgroupQuadAny:\n        builder.addExtension(spv::E_SPV_KHR_quad_control);\n        builder.addCapability(spv::Capability::QuadControlKHR);\n        [[fallthrough]];\n    case glslang::EOpSubgroupAll:\n    case glslang::EOpSubgroupAny:\n    case glslang::EOpSubgroupAllEqual:\n        builder.addCapability(spv::Capability::GroupNonUniform);\n        builder.addCapability(spv::Capability::GroupNonUniformVote);\n        break;\n    case glslang::EOpSubgroupBroadcast:\n    case glslang::EOpSubgroupBroadcastFirst:\n    case glslang::EOpSubgroupBallot:\n    case glslang::EOpSubgroupInverseBallot:\n    case glslang::EOpSubgroupBallotBitExtract:\n    case glslang::EOpSubgroupBallotBitCount:\n    case glslang::EOpSubgroupBallotInclusiveBitCount:\n    case glslang::EOpSubgroupBallotExclusiveBitCount:\n    case glslang::EOpSubgroupBallotFindLSB:\n    case glslang::EOpSubgroupBallotFindMSB:\n        builder.addCapability(spv::Capability::GroupNonUniform);\n        builder.addCapability(spv::Capability::GroupNonUniformBallot);\n        break;\n    case glslang::EOpSubgroupRotate:\n    case glslang::EOpSubgroupClusteredRotate:\n        builder.addExtension(spv::E_SPV_KHR_subgroup_rotate);\n        builder.addCapability(spv::Capability::GroupNonUniformRotateKHR);\n        break;\n    case glslang::EOpSubgroupShuffle:\n    case glslang::EOpSubgroupShuffleXor:\n        builder.addCapability(spv::Capability::GroupNonUniform);\n        builder.addCapability(spv::Capability::GroupNonUniformShuffle);\n        break;\n    case glslang::EOpSubgroupShuffleUp:\n    case glslang::EOpSubgroupShuffleDown:\n        builder.addCapability(spv::Capability::GroupNonUniform);\n        builder.addCapability(spv::Capability::GroupNonUniformShuffleRelative);\n        break;\n    case glslang::EOpSubgroupAdd:\n    case glslang::EOpSubgroupMul:\n    case glslang::EOpSubgroupMin:\n    case glslang::EOpSubgroupMax:\n    case glslang::EOpSubgroupAnd:\n    case glslang::EOpSubgroupOr:\n    case glslang::EOpSubgroupXor:\n    case glslang::EOpSubgroupInclusiveAdd:\n    case glslang::EOpSubgroupInclusiveMul:\n    case glslang::EOpSubgroupInclusiveMin:\n    case glslang::EOpSubgroupInclusiveMax:\n    case glslang::EOpSubgroupInclusiveAnd:\n    case glslang::EOpSubgroupInclusiveOr:\n    case glslang::EOpSubgroupInclusiveXor:\n    case glslang::EOpSubgroupExclusiveAdd:\n    case glslang::EOpSubgroupExclusiveMul:\n    case glslang::EOpSubgroupExclusiveMin:\n    case glslang::EOpSubgroupExclusiveMax:\n    case glslang::EOpSubgroupExclusiveAnd:\n    case glslang::EOpSubgroupExclusiveOr:\n    case glslang::EOpSubgroupExclusiveXor:\n        builder.addCapability(spv::Capability::GroupNonUniform);\n        builder.addCapability(spv::Capability::GroupNonUniformArithmetic);\n        break;\n    case glslang::EOpSubgroupClusteredAdd:\n    case glslang::EOpSubgroupClusteredMul:\n    case glslang::EOpSubgroupClusteredMin:\n    case glslang::EOpSubgroupClusteredMax:\n    case glslang::EOpSubgroupClusteredAnd:\n    case glslang::EOpSubgroupClusteredOr:\n    case glslang::EOpSubgroupClusteredXor:\n        builder.addCapability(spv::Capability::GroupNonUniform);\n        builder.addCapability(spv::Capability::GroupNonUniformClustered);\n        break;\n    case glslang::EOpSubgroupQuadBroadcast:\n    case glslang::EOpSubgroupQuadSwapHorizontal:\n    case glslang::EOpSubgroupQuadSwapVertical:\n    case glslang::EOpSubgroupQuadSwapDiagonal:\n        builder.addCapability(spv::Capability::GroupNonUniform);\n        builder.addCapability(spv::Capability::GroupNonUniformQuad);\n        break;\n    case glslang::EOpSubgroupPartitionedAdd:\n    case glslang::EOpSubgroupPartitionedMul:\n    case glslang::EOpSubgroupPartitionedMin:\n    case glslang::EOpSubgroupPartitionedMax:\n    case glslang::EOpSubgroupPartitionedAnd:\n    case glslang::EOpSubgroupPartitionedOr:\n    case glslang::EOpSubgroupPartitionedXor:\n    case glslang::EOpSubgroupPartitionedInclusiveAdd:\n    case glslang::EOpSubgroupPartitionedInclusiveMul:\n    case glslang::EOpSubgroupPartitionedInclusiveMin:\n    case glslang::EOpSubgroupPartitionedInclusiveMax:\n    case glslang::EOpSubgroupPartitionedInclusiveAnd:\n    case glslang::EOpSubgroupPartitionedInclusiveOr:\n    case glslang::EOpSubgroupPartitionedInclusiveXor:\n    case glslang::EOpSubgroupPartitionedExclusiveAdd:\n    case glslang::EOpSubgroupPartitionedExclusiveMul:\n    case glslang::EOpSubgroupPartitionedExclusiveMin:\n    case glslang::EOpSubgroupPartitionedExclusiveMax:\n    case glslang::EOpSubgroupPartitionedExclusiveAnd:\n    case glslang::EOpSubgroupPartitionedExclusiveOr:\n    case glslang::EOpSubgroupPartitionedExclusiveXor:\n        builder.addExtension(spv::E_SPV_NV_shader_subgroup_partitioned);\n        builder.addCapability(spv::Capability::GroupNonUniformPartitionedNV);\n        break;\n    default: assert(0 && \"Unhandled subgroup operation!\");\n    }\n\n\n    const bool isUnsigned = isTypeUnsignedInt(typeProxy);\n    const bool isFloat = isTypeFloat(typeProxy);\n    const bool isBool = typeProxy == glslang::EbtBool;\n\n    spv::Op opCode = spv::Op::OpNop;\n\n    // Figure out which opcode to use.\n    switch (op) {\n    case glslang::EOpSubgroupElect:                   opCode = spv::Op::OpGroupNonUniformElect; break;\n    case glslang::EOpSubgroupQuadAll:                 opCode = spv::Op::OpGroupNonUniformQuadAllKHR; break;\n    case glslang::EOpSubgroupAll:                     opCode = spv::Op::OpGroupNonUniformAll; break;\n    case glslang::EOpSubgroupQuadAny:                 opCode = spv::Op::OpGroupNonUniformQuadAnyKHR; break;\n    case glslang::EOpSubgroupAny:                     opCode = spv::Op::OpGroupNonUniformAny; break;\n    case glslang::EOpSubgroupAllEqual:                opCode = spv::Op::OpGroupNonUniformAllEqual; break;\n    case glslang::EOpSubgroupBroadcast:               opCode = spv::Op::OpGroupNonUniformBroadcast; break;\n    case glslang::EOpSubgroupBroadcastFirst:          opCode = spv::Op::OpGroupNonUniformBroadcastFirst; break;\n    case glslang::EOpSubgroupBallot:                  opCode = spv::Op::OpGroupNonUniformBallot; break;\n    case glslang::EOpSubgroupInverseBallot:           opCode = spv::Op::OpGroupNonUniformInverseBallot; break;\n    case glslang::EOpSubgroupBallotBitExtract:        opCode = spv::Op::OpGroupNonUniformBallotBitExtract; break;\n    case glslang::EOpSubgroupBallotBitCount:\n    case glslang::EOpSubgroupBallotInclusiveBitCount:\n    case glslang::EOpSubgroupBallotExclusiveBitCount: opCode = spv::Op::OpGroupNonUniformBallotBitCount; break;\n    case glslang::EOpSubgroupBallotFindLSB:           opCode = spv::Op::OpGroupNonUniformBallotFindLSB; break;\n    case glslang::EOpSubgroupBallotFindMSB:           opCode = spv::Op::OpGroupNonUniformBallotFindMSB; break;\n    case glslang::EOpSubgroupShuffle:                 opCode = spv::Op::OpGroupNonUniformShuffle; break;\n    case glslang::EOpSubgroupShuffleXor:              opCode = spv::Op::OpGroupNonUniformShuffleXor; break;\n    case glslang::EOpSubgroupShuffleUp:               opCode = spv::Op::OpGroupNonUniformShuffleUp; break;\n    case glslang::EOpSubgroupShuffleDown:             opCode = spv::Op::OpGroupNonUniformShuffleDown; break;\n    case glslang::EOpSubgroupRotate:\n    case glslang::EOpSubgroupClusteredRotate:         opCode = spv::Op::OpGroupNonUniformRotateKHR; break;\n    case glslang::EOpSubgroupAdd:\n    case glslang::EOpSubgroupInclusiveAdd:\n    case glslang::EOpSubgroupExclusiveAdd:\n    case glslang::EOpSubgroupClusteredAdd:\n    case glslang::EOpSubgroupPartitionedAdd:\n    case glslang::EOpSubgroupPartitionedInclusiveAdd:\n    case glslang::EOpSubgroupPartitionedExclusiveAdd:\n        if (isFloat) {\n            opCode = spv::Op::OpGroupNonUniformFAdd;\n        } else {\n            opCode = spv::Op::OpGroupNonUniformIAdd;\n        }\n        break;\n    case glslang::EOpSubgroupMul:\n    case glslang::EOpSubgroupInclusiveMul:\n    case glslang::EOpSubgroupExclusiveMul:\n    case glslang::EOpSubgroupClusteredMul:\n    case glslang::EOpSubgroupPartitionedMul:\n    case glslang::EOpSubgroupPartitionedInclusiveMul:\n    case glslang::EOpSubgroupPartitionedExclusiveMul:\n        if (isFloat) {\n            opCode = spv::Op::OpGroupNonUniformFMul;\n        } else {\n            opCode = spv::Op::OpGroupNonUniformIMul;\n        }\n        break;\n    case glslang::EOpSubgroupMin:\n    case glslang::EOpSubgroupInclusiveMin:\n    case glslang::EOpSubgroupExclusiveMin:\n    case glslang::EOpSubgroupClusteredMin:\n    case glslang::EOpSubgroupPartitionedMin:\n    case glslang::EOpSubgroupPartitionedInclusiveMin:\n    case glslang::EOpSubgroupPartitionedExclusiveMin:\n        if (isFloat) {\n            opCode = spv::Op::OpGroupNonUniformFMin;\n        } else if (isUnsigned) {\n            opCode = spv::Op::OpGroupNonUniformUMin;\n        } else {\n            opCode = spv::Op::OpGroupNonUniformSMin;\n        }\n        break;\n    case glslang::EOpSubgroupMax:\n    case glslang::EOpSubgroupInclusiveMax:\n    case glslang::EOpSubgroupExclusiveMax:\n    case glslang::EOpSubgroupClusteredMax:\n    case glslang::EOpSubgroupPartitionedMax:\n    case glslang::EOpSubgroupPartitionedInclusiveMax:\n    case glslang::EOpSubgroupPartitionedExclusiveMax:\n        if (isFloat) {\n            opCode = spv::Op::OpGroupNonUniformFMax;\n        } else if (isUnsigned) {\n            opCode = spv::Op::OpGroupNonUniformUMax;\n        } else {\n            opCode = spv::Op::OpGroupNonUniformSMax;\n        }\n        break;\n    case glslang::EOpSubgroupAnd:\n    case glslang::EOpSubgroupInclusiveAnd:\n    case glslang::EOpSubgroupExclusiveAnd:\n    case glslang::EOpSubgroupClusteredAnd:\n    case glslang::EOpSubgroupPartitionedAnd:\n    case glslang::EOpSubgroupPartitionedInclusiveAnd:\n    case glslang::EOpSubgroupPartitionedExclusiveAnd:\n        if (isBool) {\n            opCode = spv::Op::OpGroupNonUniformLogicalAnd;\n        } else {\n            opCode = spv::Op::OpGroupNonUniformBitwiseAnd;\n        }\n        break;\n    case glslang::EOpSubgroupOr:\n    case glslang::EOpSubgroupInclusiveOr:\n    case glslang::EOpSubgroupExclusiveOr:\n    case glslang::EOpSubgroupClusteredOr:\n    case glslang::EOpSubgroupPartitionedOr:\n    case glslang::EOpSubgroupPartitionedInclusiveOr:\n    case glslang::EOpSubgroupPartitionedExclusiveOr:\n        if (isBool) {\n            opCode = spv::Op::OpGroupNonUniformLogicalOr;\n        } else {\n            opCode = spv::Op::OpGroupNonUniformBitwiseOr;\n        }\n        break;\n    case glslang::EOpSubgroupXor:\n    case glslang::EOpSubgroupInclusiveXor:\n    case glslang::EOpSubgroupExclusiveXor:\n    case glslang::EOpSubgroupClusteredXor:\n    case glslang::EOpSubgroupPartitionedXor:\n    case glslang::EOpSubgroupPartitionedInclusiveXor:\n    case glslang::EOpSubgroupPartitionedExclusiveXor:\n        if (isBool) {\n            opCode = spv::Op::OpGroupNonUniformLogicalXor;\n        } else {\n            opCode = spv::Op::OpGroupNonUniformBitwiseXor;\n        }\n        break;\n    case glslang::EOpSubgroupQuadBroadcast:      opCode = spv::Op::OpGroupNonUniformQuadBroadcast; break;\n    case glslang::EOpSubgroupQuadSwapHorizontal:\n    case glslang::EOpSubgroupQuadSwapVertical:\n    case glslang::EOpSubgroupQuadSwapDiagonal:   opCode = spv::Op::OpGroupNonUniformQuadSwap; break;\n    default: assert(0 && \"Unhandled subgroup operation!\");\n    }\n\n    // get the right Group Operation\n    spv::GroupOperation groupOperation = spv::GroupOperation::Max;\n    switch (op) {\n    default:\n        break;\n    case glslang::EOpSubgroupBallotBitCount:\n    case glslang::EOpSubgroupAdd:\n    case glslang::EOpSubgroupMul:\n    case glslang::EOpSubgroupMin:\n    case glslang::EOpSubgroupMax:\n    case glslang::EOpSubgroupAnd:\n    case glslang::EOpSubgroupOr:\n    case glslang::EOpSubgroupXor:\n        groupOperation = spv::GroupOperation::Reduce;\n        break;\n    case glslang::EOpSubgroupBallotInclusiveBitCount:\n    case glslang::EOpSubgroupInclusiveAdd:\n    case glslang::EOpSubgroupInclusiveMul:\n    case glslang::EOpSubgroupInclusiveMin:\n    case glslang::EOpSubgroupInclusiveMax:\n    case glslang::EOpSubgroupInclusiveAnd:\n    case glslang::EOpSubgroupInclusiveOr:\n    case glslang::EOpSubgroupInclusiveXor:\n        groupOperation = spv::GroupOperation::InclusiveScan;\n        break;\n    case glslang::EOpSubgroupBallotExclusiveBitCount:\n    case glslang::EOpSubgroupExclusiveAdd:\n    case glslang::EOpSubgroupExclusiveMul:\n    case glslang::EOpSubgroupExclusiveMin:\n    case glslang::EOpSubgroupExclusiveMax:\n    case glslang::EOpSubgroupExclusiveAnd:\n    case glslang::EOpSubgroupExclusiveOr:\n    case glslang::EOpSubgroupExclusiveXor:\n        groupOperation = spv::GroupOperation::ExclusiveScan;\n        break;\n    case glslang::EOpSubgroupClusteredAdd:\n    case glslang::EOpSubgroupClusteredMul:\n    case glslang::EOpSubgroupClusteredMin:\n    case glslang::EOpSubgroupClusteredMax:\n    case glslang::EOpSubgroupClusteredAnd:\n    case glslang::EOpSubgroupClusteredOr:\n    case glslang::EOpSubgroupClusteredXor:\n        groupOperation = spv::GroupOperation::ClusteredReduce;\n        break;\n    case glslang::EOpSubgroupPartitionedAdd:\n    case glslang::EOpSubgroupPartitionedMul:\n    case glslang::EOpSubgroupPartitionedMin:\n    case glslang::EOpSubgroupPartitionedMax:\n    case glslang::EOpSubgroupPartitionedAnd:\n    case glslang::EOpSubgroupPartitionedOr:\n    case glslang::EOpSubgroupPartitionedXor:\n        groupOperation = spv::GroupOperation::PartitionedReduceNV;\n        break;\n    case glslang::EOpSubgroupPartitionedInclusiveAdd:\n    case glslang::EOpSubgroupPartitionedInclusiveMul:\n    case glslang::EOpSubgroupPartitionedInclusiveMin:\n    case glslang::EOpSubgroupPartitionedInclusiveMax:\n    case glslang::EOpSubgroupPartitionedInclusiveAnd:\n    case glslang::EOpSubgroupPartitionedInclusiveOr:\n    case glslang::EOpSubgroupPartitionedInclusiveXor:\n        groupOperation = spv::GroupOperation::PartitionedInclusiveScanNV;\n        break;\n    case glslang::EOpSubgroupPartitionedExclusiveAdd:\n    case glslang::EOpSubgroupPartitionedExclusiveMul:\n    case glslang::EOpSubgroupPartitionedExclusiveMin:\n    case glslang::EOpSubgroupPartitionedExclusiveMax:\n    case glslang::EOpSubgroupPartitionedExclusiveAnd:\n    case glslang::EOpSubgroupPartitionedExclusiveOr:\n    case glslang::EOpSubgroupPartitionedExclusiveXor:\n        groupOperation = spv::GroupOperation::PartitionedExclusiveScanNV;\n        break;\n    }\n\n    // build the instruction\n    std::vector<spv::IdImmediate> spvGroupOperands;\n\n    // Every operation begins with the Execution Scope operand.\n    spv::IdImmediate executionScope = { true, builder.makeUintConstant(spv::Scope::Subgroup) };\n    // All other ops need the execution scope. Quad Control Ops don't need scope, it's always Quad.\n    if (opCode != spv::Op::OpGroupNonUniformQuadAllKHR && opCode != spv::Op::OpGroupNonUniformQuadAnyKHR) {\n        spvGroupOperands.push_back(executionScope);\n    }\n\n    // Next, for all operations that use a Group Operation, push that as an operand.\n    if (groupOperation != spv::GroupOperation::Max) {\n        spv::IdImmediate groupOperand = { false, (unsigned)groupOperation };\n        spvGroupOperands.push_back(groupOperand);\n    }\n\n    // Push back the operands next.\n    for (auto opIt = operands.cbegin(); opIt != operands.cend(); ++opIt) {\n        spv::IdImmediate operand = { true, *opIt };\n        spvGroupOperands.push_back(operand);\n    }\n\n    // Some opcodes have additional operands.\n    spv::Id directionId = spv::NoResult;\n    switch (op) {\n    default: break;\n    case glslang::EOpSubgroupQuadSwapHorizontal: directionId = builder.makeUintConstant(0); break;\n    case glslang::EOpSubgroupQuadSwapVertical:   directionId = builder.makeUintConstant(1); break;\n    case glslang::EOpSubgroupQuadSwapDiagonal:   directionId = builder.makeUintConstant(2); break;\n    }\n    if (directionId != spv::NoResult) {\n        spv::IdImmediate direction = { true, directionId };\n        spvGroupOperands.push_back(direction);\n    }\n\n    return builder.createOp(opCode, typeId, spvGroupOperands);\n}\n\nspv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::Decoration precision,\n    spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy)\n{\n    bool isUnsigned = isTypeUnsignedInt(typeProxy);\n    bool isFloat = isTypeFloat(typeProxy);\n\n    spv::Op opCode = spv::Op::OpNop;\n    int extBuiltins = -1;\n    int libCall = -1;\n    size_t consumedOperands = operands.size();\n    spv::Id typeId0 = 0;\n    if (consumedOperands > 0)\n        typeId0 = builder.getTypeId(operands[0]);\n    spv::Id typeId1 = 0;\n    if (consumedOperands > 1)\n        typeId1 = builder.getTypeId(operands[1]);\n    spv::Id frexpIntType = 0;\n\n    switch (op) {\n    case glslang::EOpMin:\n        if (isFloat)\n            libCall = nanMinMaxClamp ? spv::GLSLstd450NMin : spv::GLSLstd450FMin;\n        else if (isUnsigned)\n            libCall = spv::GLSLstd450UMin;\n        else\n            libCall = spv::GLSLstd450SMin;\n        builder.promoteScalar(precision, operands.front(), operands.back());\n        break;\n    case glslang::EOpModf:\n        {\n            libCall = spv::GLSLstd450ModfStruct;\n            assert(builder.isFloatType(builder.getScalarTypeId(typeId0)));\n            // The returned struct has two members of the same type as the first argument\n            typeId = builder.makeStructResultType(typeId0, typeId0);\n            consumedOperands = 1;\n        }\n        break;\n    case glslang::EOpMax:\n        if (isFloat)\n            libCall = nanMinMaxClamp ? spv::GLSLstd450NMax : spv::GLSLstd450FMax;\n        else if (isUnsigned)\n            libCall = spv::GLSLstd450UMax;\n        else\n            libCall = spv::GLSLstd450SMax;\n        builder.promoteScalar(precision, operands.front(), operands.back());\n        break;\n    case glslang::EOpPow:\n        libCall = spv::GLSLstd450Pow;\n        break;\n    case glslang::EOpDot:\n    case glslang::EOpDotPackedEXT:\n    case glslang::EOpDotAccSatEXT:\n    case glslang::EOpDotPackedAccSatEXT:\n        {\n            if (builder.isFloatType(builder.getScalarTypeId(typeId0)) ||\n                // HLSL supports dot(int,int) which is just a multiply\n                glslangIntermediate->getSource() == glslang::EShSourceHlsl) {\n                if (typeProxy == glslang::EbtBFloat16) {\n                    builder.addExtension(spv::E_SPV_KHR_bfloat16);\n                    builder.addCapability(spv::Capability::BFloat16DotProductKHR);\n                }\n                opCode = spv::Op::OpDot;\n            } else {\n                builder.addExtension(spv::E_SPV_KHR_integer_dot_product);\n                builder.addCapability(spv::Capability::DotProductKHR);\n                const unsigned int vectorSize = builder.getNumComponents(operands[0]);\n                if (op == glslang::EOpDotPackedEXT || op == glslang::EOpDotPackedAccSatEXT) {\n                    builder.addCapability(spv::Capability::DotProductInput4x8BitPackedKHR);\n                } else if (vectorSize == 4 && builder.getScalarTypeWidth(typeId0) == 8) {\n                    builder.addCapability(spv::Capability::DotProductInput4x8BitKHR);\n                } else {\n                    builder.addCapability(spv::Capability::DotProductInputAllKHR);\n                }\n                const bool type0isSigned = builder.isIntType(builder.getScalarTypeId(typeId0));\n                const bool type1isSigned = builder.isIntType(builder.getScalarTypeId(typeId1));\n                const bool accSat = (op == glslang::EOpDotAccSatEXT || op == glslang::EOpDotPackedAccSatEXT);\n                if (!type0isSigned && !type1isSigned) {\n                    opCode = accSat ? spv::Op::OpUDotAccSatKHR : spv::Op::OpUDotKHR;\n                } else if (type0isSigned && type1isSigned) {\n                    opCode = accSat ? spv::Op::OpSDotAccSatKHR : spv::Op::OpSDotKHR;\n                } else {\n                    opCode = accSat ? spv::Op::OpSUDotAccSatKHR : spv::Op::OpSUDotKHR;\n                    // the spir-v opcode assumes the operands to be \"signed, unsigned\" in that order, so swap if needed\n                    if (type1isSigned) {\n                        std::swap(operands[0], operands[1]);\n                    }\n                }\n                std::vector<spv::IdImmediate> operands2;\n                for (auto &o : operands) {\n                    operands2.push_back({true, o});\n                }\n                if (op == glslang::EOpDotPackedEXT || op == glslang::EOpDotPackedAccSatEXT) {\n                    operands2.push_back({false, 0});\n                }\n                return builder.createOp(opCode, typeId, operands2);\n            }\n        }\n        break;\n    case glslang::EOpAtan:\n        libCall = spv::GLSLstd450Atan2;\n        break;\n\n    case glslang::EOpClamp:\n        if (isFloat)\n            libCall = nanMinMaxClamp ? spv::GLSLstd450NClamp : spv::GLSLstd450FClamp;\n        else if (isUnsigned)\n            libCall = spv::GLSLstd450UClamp;\n        else\n            libCall = spv::GLSLstd450SClamp;\n        builder.promoteScalar(precision, operands.front(), operands[1]);\n        builder.promoteScalar(precision, operands.front(), operands[2]);\n        break;\n    case glslang::EOpMix:\n        if (! builder.isBoolType(builder.getScalarTypeId(builder.getTypeId(operands.back())))) {\n            assert(isFloat);\n            libCall = spv::GLSLstd450FMix;\n        } else {\n            opCode = spv::Op::OpSelect;\n            std::swap(operands.front(), operands.back());\n        }\n        builder.promoteScalar(precision, operands.front(), operands.back());\n        break;\n    case glslang::EOpStep:\n        libCall = spv::GLSLstd450Step;\n        builder.promoteScalar(precision, operands.front(), operands.back());\n        break;\n    case glslang::EOpSmoothStep:\n        libCall = spv::GLSLstd450SmoothStep;\n        builder.promoteScalar(precision, operands[0], operands[2]);\n        builder.promoteScalar(precision, operands[1], operands[2]);\n        break;\n\n    case glslang::EOpDistance:\n        libCall = spv::GLSLstd450Distance;\n        break;\n    case glslang::EOpCross:\n        libCall = spv::GLSLstd450Cross;\n        break;\n    case glslang::EOpFaceForward:\n        libCall = spv::GLSLstd450FaceForward;\n        break;\n    case glslang::EOpReflect:\n        libCall = spv::GLSLstd450Reflect;\n        break;\n    case glslang::EOpRefract:\n        libCall = spv::GLSLstd450Refract;\n        break;\n    case glslang::EOpBarrier:\n        {\n            // This is for the extended controlBarrier function, with four operands.\n            // The unextended barrier() goes through createNoArgOperation.\n            assert(operands.size() == 4);\n            auto const executionScope = (spv::Scope)builder.getConstantScalar(operands[0]);\n            auto const memoryScope = (spv::Scope)builder.getConstantScalar(operands[1]);\n            auto const semantics = (spv::MemorySemanticsMask)(builder.getConstantScalar(operands[2]) | builder.getConstantScalar(operands[3]));\n            builder.createControlBarrier(executionScope, memoryScope,\n                semantics);\n            if (anySet(semantics, spv::MemorySemanticsMask::MakeAvailableKHR |\n                                  spv::MemorySemanticsMask::MakeVisibleKHR |\n                                  spv::MemorySemanticsMask::OutputMemoryKHR |\n                                  spv::MemorySemanticsMask::Volatile)) {\n                builder.addCapability(spv::Capability::VulkanMemoryModelKHR);\n            }\n            if (glslangIntermediate->usingVulkanMemoryModel() && (executionScope == spv::Scope::Device ||\n                memoryScope == spv::Scope::Device)) {\n                builder.addCapability(spv::Capability::VulkanMemoryModelDeviceScopeKHR);\n            }\n            return 0;\n        }\n        break;\n    case glslang::EOpMemoryBarrier:\n        {\n            // This is for the extended memoryBarrier function, with three operands.\n            // The unextended memoryBarrier() goes through createNoArgOperation.\n            assert(operands.size() == 3);\n            auto const memoryScope = (spv::Scope)builder.getConstantScalar(operands[0]);\n            auto const semantics = (spv::MemorySemanticsMask)(builder.getConstantScalar(operands[1]) | builder.getConstantScalar(operands[2]));\n            builder.createMemoryBarrier(memoryScope, semantics);\n            if (anySet(semantics, spv::MemorySemanticsMask::MakeAvailableKHR |\n                                  spv::MemorySemanticsMask::MakeVisibleKHR |\n                                  spv::MemorySemanticsMask::OutputMemoryKHR |\n                                  spv::MemorySemanticsMask::Volatile)) {\n                builder.addCapability(spv::Capability::VulkanMemoryModelKHR);\n            }\n            if (glslangIntermediate->usingVulkanMemoryModel() && memoryScope == spv::Scope::Device) {\n                builder.addCapability(spv::Capability::VulkanMemoryModelDeviceScopeKHR);\n            }\n            return 0;\n        }\n        break;\n\n    case glslang::EOpInterpolateAtSample:\n        if (typeProxy == glslang::EbtFloat16)\n            builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float);\n        libCall = spv::GLSLstd450InterpolateAtSample;\n        break;\n    case glslang::EOpInterpolateAtOffset:\n        if (typeProxy == glslang::EbtFloat16)\n            builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float);\n        libCall = spv::GLSLstd450InterpolateAtOffset;\n        break;\n    case glslang::EOpAddCarry:\n        opCode = spv::Op::OpIAddCarry;\n        typeId = builder.makeStructResultType(typeId0, typeId0);\n        consumedOperands = 2;\n        break;\n    case glslang::EOpSubBorrow:\n        opCode = spv::Op::OpISubBorrow;\n        typeId = builder.makeStructResultType(typeId0, typeId0);\n        consumedOperands = 2;\n        break;\n    case glslang::EOpUMulExtended:\n        opCode = spv::Op::OpUMulExtended;\n        typeId = builder.makeStructResultType(typeId0, typeId0);\n        consumedOperands = 2;\n        break;\n    case glslang::EOpIMulExtended:\n        opCode = spv::Op::OpSMulExtended;\n        typeId = builder.makeStructResultType(typeId0, typeId0);\n        consumedOperands = 2;\n        break;\n    case glslang::EOpBitfieldExtract:\n        if (isUnsigned)\n            opCode = spv::Op::OpBitFieldUExtract;\n        else\n            opCode = spv::Op::OpBitFieldSExtract;\n        break;\n    case glslang::EOpBitfieldInsert:\n        opCode = spv::Op::OpBitFieldInsert;\n        break;\n\n    case glslang::EOpFma:\n        libCall = spv::GLSLstd450Fma;\n        break;\n    case glslang::EOpFrexp:\n        {\n            libCall = spv::GLSLstd450FrexpStruct;\n            assert(builder.isPointerType(typeId1));\n            typeId1 = builder.getContainedTypeId(typeId1);\n            int width = builder.getScalarTypeWidth(typeId1);\n            if (width == 16)\n                // Using 16-bit exp operand, enable extension SPV_AMD_gpu_shader_int16\n                builder.addExtension(spv::E_SPV_AMD_gpu_shader_int16);\n            if (builder.getNumComponents(operands[0]) == 1)\n                frexpIntType = builder.makeIntegerType(width, true);\n            else\n                frexpIntType = builder.makeVectorType(builder.makeIntegerType(width, true),\n                    builder.getNumComponents(operands[0]));\n            typeId = builder.makeStructResultType(typeId0, frexpIntType);\n            consumedOperands = 1;\n        }\n        break;\n    case glslang::EOpLdexp:\n        libCall = spv::GLSLstd450Ldexp;\n        break;\n\n    case glslang::EOpReadInvocation:\n        return createInvocationsOperation(op, typeId, operands, typeProxy);\n\n    case glslang::EOpSubgroupBroadcast:\n    case glslang::EOpSubgroupBallotBitExtract:\n    case glslang::EOpSubgroupShuffle:\n    case glslang::EOpSubgroupShuffleXor:\n    case glslang::EOpSubgroupShuffleUp:\n    case glslang::EOpSubgroupShuffleDown:\n    case glslang::EOpSubgroupRotate:\n    case glslang::EOpSubgroupClusteredRotate:\n    case glslang::EOpSubgroupClusteredAdd:\n    case glslang::EOpSubgroupClusteredMul:\n    case glslang::EOpSubgroupClusteredMin:\n    case glslang::EOpSubgroupClusteredMax:\n    case glslang::EOpSubgroupClusteredAnd:\n    case glslang::EOpSubgroupClusteredOr:\n    case glslang::EOpSubgroupClusteredXor:\n    case glslang::EOpSubgroupQuadBroadcast:\n    case glslang::EOpSubgroupPartitionedAdd:\n    case glslang::EOpSubgroupPartitionedMul:\n    case glslang::EOpSubgroupPartitionedMin:\n    case glslang::EOpSubgroupPartitionedMax:\n    case glslang::EOpSubgroupPartitionedAnd:\n    case glslang::EOpSubgroupPartitionedOr:\n    case glslang::EOpSubgroupPartitionedXor:\n    case glslang::EOpSubgroupPartitionedInclusiveAdd:\n    case glslang::EOpSubgroupPartitionedInclusiveMul:\n    case glslang::EOpSubgroupPartitionedInclusiveMin:\n    case glslang::EOpSubgroupPartitionedInclusiveMax:\n    case glslang::EOpSubgroupPartitionedInclusiveAnd:\n    case glslang::EOpSubgroupPartitionedInclusiveOr:\n    case glslang::EOpSubgroupPartitionedInclusiveXor:\n    case glslang::EOpSubgroupPartitionedExclusiveAdd:\n    case glslang::EOpSubgroupPartitionedExclusiveMul:\n    case glslang::EOpSubgroupPartitionedExclusiveMin:\n    case glslang::EOpSubgroupPartitionedExclusiveMax:\n    case glslang::EOpSubgroupPartitionedExclusiveAnd:\n    case glslang::EOpSubgroupPartitionedExclusiveOr:\n    case glslang::EOpSubgroupPartitionedExclusiveXor:\n        return createSubgroupOperation(op, typeId, operands, typeProxy);\n\n    case glslang::EOpSwizzleInvocations:\n        extBuiltins = getExtBuiltins(spv::E_SPV_AMD_shader_ballot);\n        libCall = spv::SwizzleInvocationsAMD;\n        break;\n    case glslang::EOpSwizzleInvocationsMasked:\n        extBuiltins = getExtBuiltins(spv::E_SPV_AMD_shader_ballot);\n        libCall = spv::SwizzleInvocationsMaskedAMD;\n        break;\n    case glslang::EOpWriteInvocation:\n        extBuiltins = getExtBuiltins(spv::E_SPV_AMD_shader_ballot);\n        libCall = spv::WriteInvocationAMD;\n        break;\n\n    case glslang::EOpMin3:\n        extBuiltins = getExtBuiltins(spv::E_SPV_AMD_shader_trinary_minmax);\n        if (isFloat)\n            libCall = spv::FMin3AMD;\n        else {\n            if (isUnsigned)\n                libCall = spv::UMin3AMD;\n            else\n                libCall = spv::SMin3AMD;\n        }\n        break;\n    case glslang::EOpMax3:\n        extBuiltins = getExtBuiltins(spv::E_SPV_AMD_shader_trinary_minmax);\n        if (isFloat)\n            libCall = spv::FMax3AMD;\n        else {\n            if (isUnsigned)\n                libCall = spv::UMax3AMD;\n            else\n                libCall = spv::SMax3AMD;\n        }\n        break;\n    case glslang::EOpMid3:\n        extBuiltins = getExtBuiltins(spv::E_SPV_AMD_shader_trinary_minmax);\n        if (isFloat)\n            libCall = spv::FMid3AMD;\n        else {\n            if (isUnsigned)\n                libCall = spv::UMid3AMD;\n            else\n                libCall = spv::SMid3AMD;\n        }\n        break;\n\n    case glslang::EOpInterpolateAtVertex:\n        if (typeProxy == glslang::EbtFloat16)\n            builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float);\n        extBuiltins = getExtBuiltins(spv::E_SPV_AMD_shader_explicit_vertex_parameter);\n        libCall = spv::InterpolateAtVertexAMD;\n        break;\n\n    case glslang::EOpReportIntersection:\n        typeId = builder.makeBoolType();\n        opCode = spv::Op::OpReportIntersectionKHR;\n        break;\n    case glslang::EOpTraceNV:\n        builder.createNoResultOp(spv::Op::OpTraceNV, operands);\n        return 0;\n    case glslang::EOpTraceRayMotionNV:\n        builder.addExtension(spv::E_SPV_NV_ray_tracing_motion_blur);\n        builder.addCapability(spv::Capability::RayTracingMotionBlurNV);\n        builder.createNoResultOp(spv::Op::OpTraceRayMotionNV, operands);\n        return 0;\n    case glslang::EOpTraceKHR:\n        builder.createNoResultOp(spv::Op::OpTraceRayKHR, operands);\n        return 0;\n    case glslang::EOpExecuteCallableNV:\n        builder.createNoResultOp(spv::Op::OpExecuteCallableNV, operands);\n        return 0;\n    case glslang::EOpExecuteCallableKHR:\n        builder.createNoResultOp(spv::Op::OpExecuteCallableKHR, operands);\n        return 0;\n\n    case glslang::EOpRayQueryInitialize:\n        builder.createNoResultOp(spv::Op::OpRayQueryInitializeKHR, operands);\n        return 0;\n    case glslang::EOpRayQueryTerminate:\n        builder.createNoResultOp(spv::Op::OpRayQueryTerminateKHR, operands);\n        return 0;\n    case glslang::EOpRayQueryGenerateIntersection:\n        builder.createNoResultOp(spv::Op::OpRayQueryGenerateIntersectionKHR, operands);\n        return 0;\n    case glslang::EOpRayQueryConfirmIntersection:\n        builder.createNoResultOp(spv::Op::OpRayQueryConfirmIntersectionKHR, operands);\n        return 0;\n    case glslang::EOpRayQueryProceed:\n        typeId = builder.makeBoolType();\n        opCode = spv::Op::OpRayQueryProceedKHR;\n        break;\n    case glslang::EOpRayQueryGetIntersectionType:\n        typeId = builder.makeUintType(32);\n        opCode = spv::Op::OpRayQueryGetIntersectionTypeKHR;\n        break;\n    case glslang::EOpRayQueryGetRayTMin:\n        typeId = builder.makeFloatType(32);\n        opCode = spv::Op::OpRayQueryGetRayTMinKHR;\n        break;\n    case glslang::EOpRayQueryGetRayFlags:\n        typeId = builder.makeIntType(32);\n        opCode = spv::Op::OpRayQueryGetRayFlagsKHR;\n        break;\n    case glslang::EOpRayQueryGetIntersectionT:\n        typeId = builder.makeFloatType(32);\n        opCode = spv::Op::OpRayQueryGetIntersectionTKHR;\n        break;\n    case glslang::EOpRayQueryGetIntersectionInstanceCustomIndex:\n        typeId = builder.makeIntType(32);\n        opCode = spv::Op::OpRayQueryGetIntersectionInstanceCustomIndexKHR;\n        break;\n    case glslang::EOpRayQueryGetIntersectionInstanceId:\n        typeId = builder.makeIntType(32);\n        opCode = spv::Op::OpRayQueryGetIntersectionInstanceIdKHR;\n        break;\n    case glslang::EOpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffset:\n        typeId = builder.makeUintType(32);\n        opCode = spv::Op::OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR;\n        break;\n    case glslang::EOpRayQueryGetIntersectionGeometryIndex:\n        typeId = builder.makeIntType(32);\n        opCode = spv::Op::OpRayQueryGetIntersectionGeometryIndexKHR;\n        break;\n    case glslang::EOpRayQueryGetIntersectionPrimitiveIndex:\n        typeId = builder.makeIntType(32);\n        opCode = spv::Op::OpRayQueryGetIntersectionPrimitiveIndexKHR;\n        break;\n    case glslang::EOpRayQueryGetIntersectionBarycentrics:\n        typeId = builder.makeVectorType(builder.makeFloatType(32), 2);\n        opCode = spv::Op::OpRayQueryGetIntersectionBarycentricsKHR;\n        break;\n    case glslang::EOpRayQueryGetIntersectionFrontFace:\n        typeId = builder.makeBoolType();\n        opCode = spv::Op::OpRayQueryGetIntersectionFrontFaceKHR;\n        break;\n    case glslang::EOpRayQueryGetIntersectionCandidateAABBOpaque:\n        typeId = builder.makeBoolType();\n        opCode = spv::Op::OpRayQueryGetIntersectionCandidateAABBOpaqueKHR;\n        break;\n    case glslang::EOpRayQueryGetIntersectionObjectRayDirection:\n        typeId = builder.makeVectorType(builder.makeFloatType(32), 3);\n        opCode = spv::Op::OpRayQueryGetIntersectionObjectRayDirectionKHR;\n        break;\n    case glslang::EOpRayQueryGetIntersectionObjectRayOrigin:\n        typeId = builder.makeVectorType(builder.makeFloatType(32), 3);\n        opCode = spv::Op::OpRayQueryGetIntersectionObjectRayOriginKHR;\n        break;\n    case glslang::EOpRayQueryGetWorldRayDirection:\n        typeId = builder.makeVectorType(builder.makeFloatType(32), 3);\n        opCode = spv::Op::OpRayQueryGetWorldRayDirectionKHR;\n        break;\n    case glslang::EOpRayQueryGetWorldRayOrigin:\n        typeId = builder.makeVectorType(builder.makeFloatType(32), 3);\n        opCode = spv::Op::OpRayQueryGetWorldRayOriginKHR;\n        break;\n    case glslang::EOpRayQueryGetIntersectionObjectToWorld:\n        typeId = builder.makeMatrixType(builder.makeFloatType(32), 4, 3);\n        opCode = spv::Op::OpRayQueryGetIntersectionObjectToWorldKHR;\n        break;\n    case glslang::EOpRayQueryGetIntersectionClusterIdNV:\n        typeId = builder.makeIntegerType(32, 1);\n        opCode = spv::Op::OpRayQueryGetClusterIdNV;\n        break;\n    case glslang::EOpRayQueryGetIntersectionWorldToObject:\n        typeId = builder.makeMatrixType(builder.makeFloatType(32), 4, 3);\n        opCode = spv::Op::OpRayQueryGetIntersectionWorldToObjectKHR;\n        break;\n    case glslang::EOpRayQueryGetIntersectionSpherePositionNV:\n        typeId = builder.makeVectorType(builder.makeFloatType(32), 3);\n        opCode = spv::Op::OpRayQueryGetIntersectionSpherePositionNV;\n        break;\n    case glslang::EOpRayQueryGetIntersectionSphereRadiusNV:\n        typeId = builder.makeFloatType(32);\n        opCode = spv::Op::OpRayQueryGetIntersectionSphereRadiusNV;\n        break;\n    case glslang::EOpRayQueryGetIntersectionLSSHitValueNV:\n        typeId = builder.makeFloatType(32);\n        opCode = spv::Op::OpRayQueryGetIntersectionLSSHitValueNV;\n        break;\n    case glslang::EOpRayQueryIsSphereHitNV:\n        typeId = builder.makeBoolType();\n        opCode = spv::Op::OpRayQueryIsSphereHitNV;\n        break;\n    case glslang::EOpRayQueryIsLSSHitNV:\n        typeId = builder.makeBoolType();\n        opCode = spv::Op::OpRayQueryIsLSSHitNV;\n        break;\n    case glslang::EOpWritePackedPrimitiveIndices4x8NV:\n        builder.createNoResultOp(spv::Op::OpWritePackedPrimitiveIndices4x8NV, operands);\n        return 0;\n    case glslang::EOpEmitMeshTasksEXT:\n        if (taskPayloadID)\n            operands.push_back(taskPayloadID);\n        // As per SPV_EXT_mesh_shader make it a terminating instruction in the current block\n        builder.makeStatementTerminator(spv::Op::OpEmitMeshTasksEXT, operands, \"post-OpEmitMeshTasksEXT\");\n        return 0;\n    case glslang::EOpSetMeshOutputsEXT:\n        builder.createNoResultOp(spv::Op::OpSetMeshOutputsEXT, operands);\n        return 0;\n    case glslang::EOpCooperativeMatrixMulAddNV:\n        opCode = spv::Op::OpCooperativeMatrixMulAddNV;\n        break;\n    case glslang::EOpHitObjectTraceRayNV:\n        builder.createNoResultOp(spv::Op::OpHitObjectTraceRayNV, operands);\n        return 0;\n    case glslang::EOpHitObjectTraceRayMotionNV:\n        builder.createNoResultOp(spv::Op::OpHitObjectTraceRayMotionNV, operands);\n        return 0;\n    case glslang::EOpHitObjectRecordHitNV:\n        builder.createNoResultOp(spv::Op::OpHitObjectRecordHitNV, operands);\n        return 0;\n    case glslang::EOpHitObjectRecordHitMotionNV:\n        builder.createNoResultOp(spv::Op::OpHitObjectRecordHitMotionNV, operands);\n        return 0;\n    case glslang::EOpHitObjectRecordHitWithIndexNV:\n        builder.createNoResultOp(spv::Op::OpHitObjectRecordHitWithIndexNV, operands);\n        return 0;\n    case glslang::EOpHitObjectRecordHitWithIndexMotionNV:\n        builder.createNoResultOp(spv::Op::OpHitObjectRecordHitWithIndexMotionNV, operands);\n        return 0;\n    case glslang::EOpHitObjectRecordMissNV:\n        builder.createNoResultOp(spv::Op::OpHitObjectRecordMissNV, operands);\n        return 0;\n    case glslang::EOpHitObjectRecordMissMotionNV:\n        builder.createNoResultOp(spv::Op::OpHitObjectRecordMissMotionNV, operands);\n        return 0;\n    case glslang::EOpHitObjectExecuteShaderNV:\n        builder.createNoResultOp(spv::Op::OpHitObjectExecuteShaderNV, operands);\n        return 0;\n    case glslang::EOpHitObjectIsEmptyNV:\n        typeId = builder.makeBoolType();\n        opCode = spv::Op::OpHitObjectIsEmptyNV;\n        break;\n    case glslang::EOpHitObjectIsMissNV:\n        typeId = builder.makeBoolType();\n        opCode = spv::Op::OpHitObjectIsMissNV;\n        break;\n    case glslang::EOpHitObjectIsHitNV:\n        typeId = builder.makeBoolType();\n        opCode = spv::Op::OpHitObjectIsHitNV;\n        break;\n    case glslang::EOpHitObjectIsSphereHitNV:\n        typeId = builder.makeBoolType();\n        opCode = spv::Op::OpHitObjectIsSphereHitNV;\n        break;\n    case glslang::EOpHitObjectIsLSSHitNV:\n        typeId = builder.makeBoolType();\n        opCode = spv::Op::OpHitObjectIsLSSHitNV;\n        break;\n    case glslang::EOpHitObjectGetRayTMinNV:\n        typeId = builder.makeFloatType(32);\n        opCode = spv::Op::OpHitObjectGetRayTMinNV;\n        break;\n    case glslang::EOpHitObjectGetRayTMaxNV:\n        typeId = builder.makeFloatType(32);\n        opCode = spv::Op::OpHitObjectGetRayTMaxNV;\n        break;\n    case glslang::EOpHitObjectGetObjectRayOriginNV:\n        typeId = builder.makeVectorType(builder.makeFloatType(32), 3);\n        opCode = spv::Op::OpHitObjectGetObjectRayOriginNV;\n        break;\n    case glslang::EOpHitObjectGetObjectRayDirectionNV:\n        typeId = builder.makeVectorType(builder.makeFloatType(32), 3);\n        opCode = spv::Op::OpHitObjectGetObjectRayDirectionNV;\n        break;\n    case glslang::EOpHitObjectGetWorldRayOriginNV:\n        typeId = builder.makeVectorType(builder.makeFloatType(32), 3);\n        opCode = spv::Op::OpHitObjectGetWorldRayOriginNV;\n        break;\n    case glslang::EOpHitObjectGetWorldRayDirectionNV:\n        typeId = builder.makeVectorType(builder.makeFloatType(32), 3);\n        opCode = spv::Op::OpHitObjectGetWorldRayDirectionNV;\n        break;\n    case glslang::EOpHitObjectGetWorldToObjectNV:\n        typeId = builder.makeMatrixType(builder.makeFloatType(32), 4, 3);\n        opCode = spv::Op::OpHitObjectGetWorldToObjectNV;\n        break;\n    case glslang::EOpHitObjectGetObjectToWorldNV:\n        typeId = builder.makeMatrixType(builder.makeFloatType(32), 4, 3);\n        opCode = spv::Op::OpHitObjectGetObjectToWorldNV;\n        break;\n    case glslang::EOpHitObjectGetInstanceCustomIndexNV:\n        typeId = builder.makeIntegerType(32, 1);\n        opCode = spv::Op::OpHitObjectGetInstanceCustomIndexNV;\n        break;\n    case glslang::EOpHitObjectGetInstanceIdNV:\n        typeId = builder.makeIntegerType(32, 1);\n        opCode = spv::Op::OpHitObjectGetInstanceIdNV;\n        break;\n    case glslang::EOpHitObjectGetGeometryIndexNV:\n        typeId = builder.makeIntegerType(32, 1);\n        opCode = spv::Op::OpHitObjectGetGeometryIndexNV;\n        break;\n    case glslang::EOpHitObjectGetPrimitiveIndexNV:\n        typeId = builder.makeIntegerType(32, 1);\n        opCode = spv::Op::OpHitObjectGetPrimitiveIndexNV;\n        break;\n    case glslang::EOpHitObjectGetHitKindNV:\n        typeId = builder.makeIntegerType(32, 0);\n        opCode = spv::Op::OpHitObjectGetHitKindNV;\n        break;\n    case glslang::EOpHitObjectGetCurrentTimeNV:\n        typeId = builder.makeFloatType(32);\n        opCode = spv::Op::OpHitObjectGetCurrentTimeNV;\n        break;\n    case glslang::EOpHitObjectGetShaderBindingTableRecordIndexNV:\n        typeId = builder.makeIntegerType(32, 0);\n        opCode = spv::Op::OpHitObjectGetShaderBindingTableRecordIndexNV;\n        return 0;\n    case glslang::EOpHitObjectGetAttributesNV:\n        builder.createNoResultOp(spv::Op::OpHitObjectGetAttributesNV, operands);\n        return 0;\n    case glslang::EOpHitObjectGetShaderRecordBufferHandleNV:\n        typeId = builder.makeVectorType(builder.makeUintType(32), 2);\n        opCode = spv::Op::OpHitObjectGetShaderRecordBufferHandleNV;\n        break;\n    case glslang::EOpHitObjectGetClusterIdNV:\n        typeId = builder.makeIntegerType(32, 1);\n        opCode = spv::Op::OpHitObjectGetClusterIdNV;\n        break;\n    case glslang::EOpReorderThreadNV: {\n        if (operands.size() == 2) {\n            builder.createNoResultOp(spv::Op::OpReorderThreadWithHintNV, operands);\n        } else {\n            builder.createNoResultOp(spv::Op::OpReorderThreadWithHitObjectNV, operands);\n        }\n        return 0;\n\n    }\n\n    case glslang::EOpImageSampleWeightedQCOM:\n        typeId = builder.makeVectorType(builder.makeFloatType(32), 4);\n        opCode = spv::Op::OpImageSampleWeightedQCOM;\n        addImageProcessingQCOMDecoration(operands[2], spv::Decoration::WeightTextureQCOM);\n        break;\n    case glslang::EOpImageBoxFilterQCOM:\n        typeId = builder.makeVectorType(builder.makeFloatType(32), 4);\n        opCode = spv::Op::OpImageBoxFilterQCOM;\n        break;\n    case glslang::EOpImageBlockMatchSADQCOM:\n        typeId = builder.makeVectorType(builder.makeFloatType(32), 4);\n        opCode = spv::Op::OpImageBlockMatchSADQCOM;\n        addImageProcessingQCOMDecoration(operands[0], spv::Decoration::BlockMatchTextureQCOM);\n        addImageProcessingQCOMDecoration(operands[2], spv::Decoration::BlockMatchTextureQCOM);\n        break;\n    case glslang::EOpImageBlockMatchSSDQCOM:\n        typeId = builder.makeVectorType(builder.makeFloatType(32), 4);\n        opCode = spv::Op::OpImageBlockMatchSSDQCOM;\n        addImageProcessingQCOMDecoration(operands[0], spv::Decoration::BlockMatchTextureQCOM);\n        addImageProcessingQCOMDecoration(operands[2], spv::Decoration::BlockMatchTextureQCOM);\n        break;\n\n    case glslang::EOpFetchMicroTriangleVertexBarycentricNV:\n        typeId = builder.makeVectorType(builder.makeFloatType(32), 2);\n        opCode = spv::Op::OpFetchMicroTriangleVertexBarycentricNV;\n        break;\n\n    case glslang::EOpFetchMicroTriangleVertexPositionNV:\n        typeId = builder.makeVectorType(builder.makeFloatType(32), 3);\n        opCode = spv::Op::OpFetchMicroTriangleVertexPositionNV;\n        break;\n\n    case glslang::EOpImageBlockMatchWindowSSDQCOM:\n        typeId = builder.makeVectorType(builder.makeFloatType(32), 4);\n        opCode = spv::Op::OpImageBlockMatchWindowSSDQCOM;\n        addImageProcessing2QCOMDecoration(operands[0], false);\n        addImageProcessing2QCOMDecoration(operands[2], false);\n        break;\n    case glslang::EOpImageBlockMatchWindowSADQCOM:\n        typeId = builder.makeVectorType(builder.makeFloatType(32), 4);\n        opCode = spv::Op::OpImageBlockMatchWindowSADQCOM;\n        addImageProcessing2QCOMDecoration(operands[0], false);\n        addImageProcessing2QCOMDecoration(operands[2], false);\n        break;\n    case glslang::EOpImageBlockMatchGatherSSDQCOM:\n        typeId = builder.makeVectorType(builder.makeFloatType(32), 4);\n        opCode = spv::Op::OpImageBlockMatchGatherSSDQCOM;\n        addImageProcessing2QCOMDecoration(operands[0], true);\n        addImageProcessing2QCOMDecoration(operands[2], true);\n        break;\n    case glslang::EOpImageBlockMatchGatherSADQCOM:\n        typeId = builder.makeVectorType(builder.makeFloatType(32), 4);\n        opCode = spv::Op::OpImageBlockMatchGatherSADQCOM;\n        addImageProcessing2QCOMDecoration(operands[0], true);\n        addImageProcessing2QCOMDecoration(operands[2], true);\n        break;\n    case glslang::EOpCreateTensorLayoutNV:\n        return builder.createOp(spv::Op::OpCreateTensorLayoutNV, typeId, std::vector<spv::Id>{});\n    case glslang::EOpCreateTensorViewNV:\n        return builder.createOp(spv::Op::OpCreateTensorViewNV, typeId, std::vector<spv::Id>{});\n    case glslang::EOpTensorLayoutSetBlockSizeNV:\n        opCode = spv::Op::OpTensorLayoutSetBlockSizeNV;\n        break;\n    case glslang::EOpTensorLayoutSetDimensionNV:\n        opCode = spv::Op::OpTensorLayoutSetDimensionNV;\n        break;\n    case glslang::EOpTensorLayoutSetStrideNV:\n        opCode = spv::Op::OpTensorLayoutSetStrideNV;\n        break;\n    case glslang::EOpTensorLayoutSliceNV:\n        opCode = spv::Op::OpTensorLayoutSliceNV;\n        break;\n    case glslang::EOpTensorLayoutSetClampValueNV:\n        opCode = spv::Op::OpTensorLayoutSetClampValueNV;\n        break;\n    case glslang::EOpTensorViewSetDimensionNV:\n        opCode = spv::Op::OpTensorViewSetDimensionNV;\n        break;\n    case glslang::EOpTensorViewSetStrideNV:\n        opCode = spv::Op::OpTensorViewSetStrideNV;\n        break;\n    case glslang::EOpTensorViewSetClipNV:\n        opCode = spv::Op::OpTensorViewSetClipNV;\n        break;\n    default:\n        return 0;\n    }\n\n    spv::Id id = 0;\n    if (libCall >= 0) {\n        // Use an extended instruction from the standard library.\n        // Construct the call arguments, without modifying the original operands vector.\n        // We might need the remaining arguments, e.g. in the EOpFrexp case.\n        std::vector<spv::Id> callArguments(operands.begin(), operands.begin() + consumedOperands);\n        id = builder.createBuiltinCall(typeId, extBuiltins >= 0 ? extBuiltins : stdBuiltins, libCall, callArguments);\n    } else if (opCode == spv::Op::OpDot && !isFloat) {\n        // int dot(int, int)\n        // NOTE: never called for scalar/vector1, this is turned into simple mul before this can be reached\n        const int componentCount = builder.getNumComponents(operands[0]);\n        spv::Id mulOp = builder.createBinOp(spv::Op::OpIMul, builder.getTypeId(operands[0]), operands[0], operands[1]);\n        builder.setPrecision(mulOp, precision);\n        id = builder.createCompositeExtract(mulOp, typeId, 0);\n        for (int i = 1; i < componentCount; ++i) {\n            builder.setPrecision(id, precision);\n            id = builder.createBinOp(spv::Op::OpIAdd, typeId, id, builder.createCompositeExtract(mulOp, typeId, i));\n        }\n    } else {\n        switch (consumedOperands) {\n        case 0:\n            // should all be handled by visitAggregate and createNoArgOperation\n            assert(0);\n            return 0;\n        case 1:\n            // should all be handled by createUnaryOperation\n            assert(0);\n            return 0;\n        case 2:\n            id = builder.createBinOp(opCode, typeId, operands[0], operands[1]);\n            break;\n        default:\n            // anything 3 or over doesn't have l-value operands, so all should be consumed\n            assert(consumedOperands == operands.size());\n            id = builder.createOp(opCode, typeId, operands);\n            break;\n        }\n    }\n\n    // Decode the return types that were structures\n    switch (op) {\n    case glslang::EOpAddCarry:\n    case glslang::EOpSubBorrow:\n        builder.createStore(builder.createCompositeExtract(id, typeId0, 1), operands[2]);\n        id = builder.createCompositeExtract(id, typeId0, 0);\n        break;\n    case glslang::EOpUMulExtended:\n    case glslang::EOpIMulExtended:\n        builder.createStore(builder.createCompositeExtract(id, typeId0, 0), operands[3]);\n        builder.createStore(builder.createCompositeExtract(id, typeId0, 1), operands[2]);\n        break;\n    case glslang::EOpModf:\n        {\n            assert(operands.size() == 2);\n            builder.createStore(builder.createCompositeExtract(id, typeId0, 1), operands[1]);\n            id = builder.createCompositeExtract(id, typeId0, 0);\n        }\n        break;\n    case glslang::EOpFrexp:\n        {\n            assert(operands.size() == 2);\n            if (builder.isFloatType(builder.getScalarTypeId(typeId1))) {\n                // \"exp\" is floating-point type (from HLSL intrinsic)\n                spv::Id member1 = builder.createCompositeExtract(id, frexpIntType, 1);\n                member1 = builder.createUnaryOp(spv::Op::OpConvertSToF, typeId1, member1);\n                builder.createStore(member1, operands[1]);\n            } else\n                // \"exp\" is integer type (from GLSL built-in function)\n                builder.createStore(builder.createCompositeExtract(id, frexpIntType, 1), operands[1]);\n            id = builder.createCompositeExtract(id, typeId0, 0);\n        }\n        break;\n    default:\n        break;\n    }\n\n    return builder.setPrecision(id, precision);\n}\n\n// Intrinsics with no arguments (or no return value, and no precision).\nspv::Id TGlslangToSpvTraverser::createNoArgOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId)\n{\n    // GLSL memory barriers use queuefamily scope in new model, device scope in old model\n    spv::Scope memoryBarrierScope = glslangIntermediate->usingVulkanMemoryModel() ?\n        spv::Scope::QueueFamilyKHR : spv::Scope::Device;\n\n    switch (op) {\n    case glslang::EOpBarrier:\n        if (glslangIntermediate->getStage() == EShLangTessControl) {\n            if (glslangIntermediate->usingVulkanMemoryModel()) {\n                builder.createControlBarrier(spv::Scope::Workgroup, spv::Scope::Workgroup,\n                                             spv::MemorySemanticsMask::OutputMemoryKHR |\n                                             spv::MemorySemanticsMask::AcquireRelease);\n                builder.addCapability(spv::Capability::VulkanMemoryModelKHR);\n            } else {\n                builder.createControlBarrier(spv::Scope::Workgroup, spv::Scope::Invocation, spv::MemorySemanticsMask::MaskNone);\n            }\n        } else {\n            builder.createControlBarrier(spv::Scope::Workgroup, spv::Scope::Workgroup,\n                                            spv::MemorySemanticsMask::WorkgroupMemory |\n                                            spv::MemorySemanticsMask::AcquireRelease);\n        }\n        return 0;\n    case glslang::EOpMemoryBarrier:\n        builder.createMemoryBarrier(memoryBarrierScope, spv::MemorySemanticsAllMemory |\n                                                        spv::MemorySemanticsMask::AcquireRelease);\n        return 0;\n    case glslang::EOpMemoryBarrierBuffer:\n        builder.createMemoryBarrier(memoryBarrierScope, spv::MemorySemanticsMask::UniformMemory |\n                                                        spv::MemorySemanticsMask::AcquireRelease);\n        return 0;\n    case glslang::EOpMemoryBarrierShared:\n        builder.createMemoryBarrier(memoryBarrierScope, spv::MemorySemanticsMask::WorkgroupMemory |\n                                                        spv::MemorySemanticsMask::AcquireRelease);\n        return 0;\n    case glslang::EOpGroupMemoryBarrier:\n        builder.createMemoryBarrier(spv::Scope::Workgroup, spv::MemorySemanticsAllMemory |\n                                                           spv::MemorySemanticsMask::AcquireRelease);\n        return 0;\n    case glslang::EOpMemoryBarrierAtomicCounter:\n        builder.createMemoryBarrier(memoryBarrierScope, spv::MemorySemanticsMask::AtomicCounterMemory |\n                                                        spv::MemorySemanticsMask::AcquireRelease);\n        return 0;\n    case glslang::EOpMemoryBarrierImage:\n        builder.createMemoryBarrier(memoryBarrierScope, spv::MemorySemanticsMask::ImageMemory |\n                                                        spv::MemorySemanticsMask::AcquireRelease);\n        return 0;\n    case glslang::EOpAllMemoryBarrierWithGroupSync:\n        builder.createControlBarrier(spv::Scope::Workgroup, spv::Scope::Device,\n                                        spv::MemorySemanticsAllMemory |\n                                        spv::MemorySemanticsMask::AcquireRelease);\n        return 0;\n    case glslang::EOpDeviceMemoryBarrier:\n        builder.createMemoryBarrier(spv::Scope::Device, spv::MemorySemanticsMask::UniformMemory |\n                                                        spv::MemorySemanticsMask::ImageMemory |\n                                                        spv::MemorySemanticsMask::AcquireRelease);\n        return 0;\n    case glslang::EOpDeviceMemoryBarrierWithGroupSync:\n        builder.createControlBarrier(spv::Scope::Workgroup, spv::Scope::Device, spv::MemorySemanticsMask::UniformMemory |\n                                                                                spv::MemorySemanticsMask::ImageMemory |\n                                                                                spv::MemorySemanticsMask::AcquireRelease);\n        return 0;\n    case glslang::EOpWorkgroupMemoryBarrier:\n        builder.createMemoryBarrier(spv::Scope::Workgroup, spv::MemorySemanticsMask::WorkgroupMemory |\n                                                           spv::MemorySemanticsMask::AcquireRelease);\n        return 0;\n    case glslang::EOpWorkgroupMemoryBarrierWithGroupSync:\n        builder.createControlBarrier(spv::Scope::Workgroup, spv::Scope::Workgroup,\n                                        spv::MemorySemanticsMask::WorkgroupMemory |\n                                        spv::MemorySemanticsMask::AcquireRelease);\n        return 0;\n    case glslang::EOpSubgroupBarrier:\n        builder.createControlBarrier(spv::Scope::Subgroup, spv::Scope::Subgroup, spv::MemorySemanticsAllMemory |\n                                                                                 spv::MemorySemanticsMask::AcquireRelease);\n        return spv::NoResult;\n    case glslang::EOpSubgroupMemoryBarrier:\n        builder.createMemoryBarrier(spv::Scope::Subgroup, spv::MemorySemanticsAllMemory |\n                                                          spv::MemorySemanticsMask::AcquireRelease);\n        return spv::NoResult;\n    case glslang::EOpSubgroupMemoryBarrierBuffer:\n        builder.createMemoryBarrier(spv::Scope::Subgroup, spv::MemorySemanticsMask::UniformMemory |\n                                                          spv::MemorySemanticsMask::AcquireRelease);\n        return spv::NoResult;\n    case glslang::EOpSubgroupMemoryBarrierImage:\n        builder.createMemoryBarrier(spv::Scope::Subgroup, spv::MemorySemanticsMask::ImageMemory |\n                                                          spv::MemorySemanticsMask::AcquireRelease);\n        return spv::NoResult;\n    case glslang::EOpSubgroupMemoryBarrierShared:\n        builder.createMemoryBarrier(spv::Scope::Subgroup, spv::MemorySemanticsMask::WorkgroupMemory |\n                                                          spv::MemorySemanticsMask::AcquireRelease);\n        return spv::NoResult;\n\n    case glslang::EOpEmitVertex:\n        builder.createNoResultOp(spv::Op::OpEmitVertex);\n        return 0;\n    case glslang::EOpEndPrimitive:\n        builder.createNoResultOp(spv::Op::OpEndPrimitive);\n        return 0;\n\n    case glslang::EOpSubgroupElect: {\n        std::vector<spv::Id> operands;\n        return createSubgroupOperation(op, typeId, operands, glslang::EbtVoid);\n    }\n    case glslang::EOpTime:\n    {\n        std::vector<spv::Id> args; // Dummy arguments\n        spv::Id id = builder.createBuiltinCall(typeId, getExtBuiltins(spv::E_SPV_AMD_gcn_shader), spv::TimeAMD, args);\n        return builder.setPrecision(id, precision);\n    }\n    case glslang::EOpIgnoreIntersectionNV:\n        builder.createNoResultOp(spv::Op::OpIgnoreIntersectionNV);\n        return 0;\n    case glslang::EOpTerminateRayNV:\n        builder.createNoResultOp(spv::Op::OpTerminateRayNV);\n        return 0;\n    case glslang::EOpRayQueryInitialize:\n        builder.createNoResultOp(spv::Op::OpRayQueryInitializeKHR);\n        return 0;\n    case glslang::EOpRayQueryTerminate:\n        builder.createNoResultOp(spv::Op::OpRayQueryTerminateKHR);\n        return 0;\n    case glslang::EOpRayQueryGenerateIntersection:\n        builder.createNoResultOp(spv::Op::OpRayQueryGenerateIntersectionKHR);\n        return 0;\n    case glslang::EOpRayQueryConfirmIntersection:\n        builder.createNoResultOp(spv::Op::OpRayQueryConfirmIntersectionKHR);\n        return 0;\n    case glslang::EOpBeginInvocationInterlock:\n        builder.createNoResultOp(spv::Op::OpBeginInvocationInterlockEXT);\n        return 0;\n    case glslang::EOpEndInvocationInterlock:\n        builder.createNoResultOp(spv::Op::OpEndInvocationInterlockEXT);\n        return 0;\n\n    case glslang::EOpIsHelperInvocation:\n    {\n        std::vector<spv::Id> args; // Dummy arguments\n        builder.addExtension(spv::E_SPV_EXT_demote_to_helper_invocation);\n        builder.addCapability(spv::Capability::DemoteToHelperInvocationEXT);\n        return builder.createOp(spv::Op::OpIsHelperInvocationEXT, typeId, args);\n    }\n\n    case glslang::EOpReadClockSubgroupKHR: {\n        std::vector<spv::Id> args;\n        args.push_back(builder.makeUintConstant(spv::Scope::Subgroup));\n        builder.addExtension(spv::E_SPV_KHR_shader_clock);\n        builder.addCapability(spv::Capability::ShaderClockKHR);\n        return builder.createOp(spv::Op::OpReadClockKHR, typeId, args);\n    }\n\n    case glslang::EOpReadClockDeviceKHR: {\n        std::vector<spv::Id> args;\n        args.push_back(builder.makeUintConstant(spv::Scope::Device));\n        builder.addExtension(spv::E_SPV_KHR_shader_clock);\n        builder.addCapability(spv::Capability::ShaderClockKHR);\n        return builder.createOp(spv::Op::OpReadClockKHR, typeId, args);\n    }\n    case glslang::EOpStencilAttachmentReadEXT:\n    case glslang::EOpDepthAttachmentReadEXT:\n    {\n        builder.addExtension(spv::E_SPV_EXT_shader_tile_image);\n\n        spv::Decoration precision;\n        spv::Op spv_op;\n        if (op == glslang::EOpStencilAttachmentReadEXT)\n        {\n            precision = spv::Decoration::RelaxedPrecision;\n            spv_op = spv::Op::OpStencilAttachmentReadEXT;\n            builder.addCapability(spv::Capability::TileImageStencilReadAccessEXT);\n        }\n        else\n        {\n            precision = spv::NoPrecision;\n            spv_op = spv::Op::OpDepthAttachmentReadEXT;\n            builder.addCapability(spv::Capability::TileImageDepthReadAccessEXT);\n        }\n\n        std::vector<spv::Id> args; // Dummy args\n        spv::Id result = builder.createOp(spv_op, typeId, args);\n        return builder.setPrecision(result, precision);\n    }\n    default:\n        break;\n    }\n\n    logger->missingFunctionality(\"unknown operation with no arguments\");\n\n    return 0;\n}\n\nspv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol)\n{\n    auto iter = symbolValues.find(symbol->getId());\n    spv::Id id;\n    if (symbolValues.end() != iter) {\n        id = iter->second;\n        return id;\n    }\n\n    // it was not found, create it\n    spv::BuiltIn builtIn = TranslateBuiltInDecoration(symbol->getQualifier().builtIn, false);\n    auto forcedType = getForcedType(symbol->getQualifier().builtIn, symbol->getType());\n\n    // There are pairs of symbols that map to the same SPIR-V built-in:\n    // gl_ObjectToWorldEXT and gl_ObjectToWorld3x4EXT, and gl_WorldToObjectEXT\n    // and gl_WorldToObject3x4EXT. SPIR-V forbids having two OpVariables\n    // with the same BuiltIn in the same storage class, so we must re-use one.\n    const bool mayNeedToReuseBuiltIn =\n        builtIn == spv::BuiltIn::ObjectToWorldKHR ||\n        builtIn == spv::BuiltIn::WorldToObjectKHR;\n\n    if (mayNeedToReuseBuiltIn) {\n        auto iter = builtInVariableIds.find(uint32_t(builtIn));\n        if (builtInVariableIds.end() != iter) {\n            id = iter->second;\n            symbolValues[symbol->getId()] = id;\n            if (forcedType.second != spv::NoType)\n                forceType[id] = forcedType.second;\n            return id;\n        }\n    }\n\n    if (symbol->getBasicType() == glslang::EbtFunction) {\n        return 0;\n    }\n\n    id = createSpvVariable(symbol, forcedType.first);\n\n    if (mayNeedToReuseBuiltIn) {\n        builtInVariableIds.insert({uint32_t(builtIn), id});\n    }\n\n    symbolValues[symbol->getId()] = id;\n    if (forcedType.second != spv::NoType)\n        forceType[id] = forcedType.second;\n\n    if (symbol->getBasicType() != glslang::EbtBlock) {\n        builder.addDecoration(id, TranslatePrecisionDecoration(symbol->getType()));\n        builder.addDecoration(id, TranslateInterpolationDecoration(symbol->getType().getQualifier()));\n        builder.addDecoration(id, TranslateAuxiliaryStorageDecoration(symbol->getType().getQualifier()));\n        addMeshNVDecoration(id, /*member*/ -1, symbol->getType().getQualifier());\n        if (symbol->getQualifier().hasComponent())\n            builder.addDecoration(id, spv::Decoration::Component, symbol->getQualifier().layoutComponent);\n        if (symbol->getQualifier().hasIndex())\n            builder.addDecoration(id, spv::Decoration::Index, symbol->getQualifier().layoutIndex);\n        if (symbol->getType().getQualifier().hasSpecConstantId())\n            builder.addDecoration(id, spv::Decoration::SpecId, symbol->getType().getQualifier().layoutSpecConstantId);\n        // atomic counters use this:\n        if (symbol->getQualifier().hasOffset())\n            builder.addDecoration(id, spv::Decoration::Offset, symbol->getQualifier().layoutOffset);\n    }\n\n    if (symbol->getQualifier().hasLocation()) {\n        if (!(glslangIntermediate->isRayTracingStage() &&\n              (glslangIntermediate->IsRequestedExtension(glslang::E_GL_EXT_ray_tracing) ||\n               glslangIntermediate->IsRequestedExtension(glslang::E_GL_NV_shader_invocation_reorder))\n              && (builder.getStorageClass(id) == spv::StorageClass::RayPayloadKHR ||\n                  builder.getStorageClass(id) == spv::StorageClass::IncomingRayPayloadKHR ||\n                  builder.getStorageClass(id) == spv::StorageClass::CallableDataKHR ||\n                  builder.getStorageClass(id) == spv::StorageClass::IncomingCallableDataKHR ||\n                  builder.getStorageClass(id) == spv::StorageClass::HitObjectAttributeNV))) {\n            // Location values are used to link TraceRayKHR/ExecuteCallableKHR/HitObjectGetAttributesNV\n            // to corresponding variables but are not valid in SPIRV since they are supported only\n            // for Input/Output Storage classes.\n            builder.addDecoration(id, spv::Decoration::Location, symbol->getQualifier().layoutLocation);\n        }\n    }\n\n    builder.addDecoration(id, TranslateInvariantDecoration(symbol->getType().getQualifier()));\n    if (symbol->getQualifier().hasStream() && glslangIntermediate->isMultiStream()) {\n        builder.addCapability(spv::Capability::GeometryStreams);\n        builder.addDecoration(id, spv::Decoration::Stream, symbol->getQualifier().layoutStream);\n    }\n    if (symbol->getQualifier().hasSet())\n        builder.addDecoration(id, spv::Decoration::DescriptorSet, symbol->getQualifier().layoutSet);\n    else if (IsDescriptorResource(symbol->getType())) {\n        // default to 0\n        builder.addDecoration(id, spv::Decoration::DescriptorSet, 0);\n    }\n    if (symbol->getQualifier().hasBinding())\n        builder.addDecoration(id, spv::Decoration::Binding, symbol->getQualifier().layoutBinding);\n    else if (IsDescriptorResource(symbol->getType())) {\n        // default to 0\n        builder.addDecoration(id, spv::Decoration::Binding, 0);\n    }\n    if (symbol->getQualifier().hasAttachment())\n        builder.addDecoration(id, spv::Decoration::InputAttachmentIndex, symbol->getQualifier().layoutAttachment);\n    if (glslangIntermediate->getXfbMode()) {\n        builder.addCapability(spv::Capability::TransformFeedback);\n        if (symbol->getQualifier().hasXfbBuffer()) {\n            builder.addDecoration(id, spv::Decoration::XfbBuffer, symbol->getQualifier().layoutXfbBuffer);\n            unsigned stride = glslangIntermediate->getXfbStride(symbol->getQualifier().layoutXfbBuffer);\n            if (stride != glslang::TQualifier::layoutXfbStrideEnd)\n                builder.addDecoration(id, spv::Decoration::XfbStride, stride);\n        }\n        if (symbol->getQualifier().hasXfbOffset())\n            builder.addDecoration(id, spv::Decoration::Offset, symbol->getQualifier().layoutXfbOffset);\n    }\n\n    // add built-in variable decoration\n    if (builtIn != spv::BuiltIn::Max) {\n        // WorkgroupSize deprecated in spirv1.6\n        if (glslangIntermediate->getSpv().spv < glslang::EShTargetSpv_1_6 ||\n            builtIn != spv::BuiltIn::WorkgroupSize)\n            builder.addDecoration(id, spv::Decoration::BuiltIn, (int)builtIn);\n    }\n\n    // Add volatile decoration to HelperInvocation for spirv1.6 and beyond\n    if (builtIn == spv::BuiltIn::HelperInvocation &&\n        !glslangIntermediate->usingVulkanMemoryModel() &&\n        glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_6) {\n        builder.addDecoration(id, spv::Decoration::Volatile);\n    }\n\n    // Subgroup builtins which have input storage class are volatile for ray tracing stages.\n    if (symbol->getType().isImage() || symbol->getQualifier().isPipeInput()) {\n        std::vector<spv::Decoration> memory;\n        TranslateMemoryDecoration(symbol->getType().getQualifier(), memory,\n            glslangIntermediate->usingVulkanMemoryModel());\n        for (unsigned int i = 0; i < memory.size(); ++i)\n            builder.addDecoration(id, memory[i]);\n    }\n\n    if (builtIn == spv::BuiltIn::SampleMask) {\n          spv::Decoration decoration;\n          // GL_NV_sample_mask_override_coverage extension\n          if (glslangIntermediate->getLayoutOverrideCoverage())\n              decoration = spv::Decoration::OverrideCoverageNV;\n          else\n              decoration = spv::Decoration::Max;\n        builder.addDecoration(id, decoration);\n        if (decoration != spv::Decoration::Max) {\n            builder.addCapability(spv::Capability::SampleMaskOverrideCoverageNV);\n            builder.addExtension(spv::E_SPV_NV_sample_mask_override_coverage);\n        }\n    }\n    else if (builtIn == spv::BuiltIn::Layer) {\n        // SPV_NV_viewport_array2 extension\n        if (symbol->getQualifier().layoutViewportRelative) {\n            builder.addDecoration(id, spv::Decoration::ViewportRelativeNV);\n            builder.addCapability(spv::Capability::ShaderViewportMaskNV);\n            builder.addExtension(spv::E_SPV_NV_viewport_array2);\n        }\n        if (symbol->getQualifier().layoutSecondaryViewportRelativeOffset != -2048) {\n            builder.addDecoration(id, spv::Decoration::SecondaryViewportRelativeNV,\n                                  symbol->getQualifier().layoutSecondaryViewportRelativeOffset);\n            builder.addCapability(spv::Capability::ShaderStereoViewNV);\n            builder.addExtension(spv::E_SPV_NV_stereo_view_rendering);\n        }\n    }\n\n    if (symbol->getQualifier().layoutPassthrough) {\n        builder.addDecoration(id, spv::Decoration::PassthroughNV);\n        builder.addCapability(spv::Capability::GeometryShaderPassthroughNV);\n        builder.addExtension(spv::E_SPV_NV_geometry_shader_passthrough);\n    }\n    if (symbol->getQualifier().pervertexNV) {\n        builder.addDecoration(id, spv::Decoration::PerVertexNV);\n        builder.addCapability(spv::Capability::FragmentBarycentricNV);\n        builder.addExtension(spv::E_SPV_NV_fragment_shader_barycentric);\n    }\n\n    if (symbol->getQualifier().pervertexEXT) {\n        builder.addDecoration(id, spv::Decoration::PerVertexKHR);\n        builder.addCapability(spv::Capability::FragmentBarycentricKHR);\n        builder.addExtension(spv::E_SPV_KHR_fragment_shader_barycentric);\n    }\n\n    if (glslangIntermediate->getHlslFunctionality1() && symbol->getType().getQualifier().semanticName != nullptr) {\n        builder.addExtension(\"SPV_GOOGLE_hlsl_functionality1\");\n        builder.addDecoration(id, spv::Decoration::HlslSemanticGOOGLE,\n                              symbol->getType().getQualifier().semanticName);\n    }\n\n    if (symbol->isReference()) {\n        builder.addDecoration(id, symbol->getType().getQualifier().restrict ?\n            spv::Decoration::RestrictPointerEXT : spv::Decoration::AliasedPointerEXT);\n    }\n\n    // Add SPIR-V decorations (GL_EXT_spirv_intrinsics)\n    if (symbol->getType().getQualifier().hasSpirvDecorate())\n        applySpirvDecorate(symbol->getType(), id, {});\n\n    return id;\n}\n\n// add per-primitive, per-view. per-task decorations to a struct member (member >= 0) or an object\nvoid TGlslangToSpvTraverser::addMeshNVDecoration(spv::Id id, int member, const glslang::TQualifier& qualifier)\n{\n    bool isMeshShaderExt = (glslangIntermediate->getRequestedExtensions().find(glslang::E_GL_EXT_mesh_shader) !=\n                            glslangIntermediate->getRequestedExtensions().end());\n\n    if (member >= 0) {\n        if (qualifier.perPrimitiveNV) {\n            // Need to add capability/extension for fragment shader.\n            // Mesh shader already adds this by default.\n            if (glslangIntermediate->getStage() == EShLangFragment) {\n                if(isMeshShaderExt) {\n                    builder.addCapability(spv::Capability::MeshShadingEXT);\n                    builder.addExtension(spv::E_SPV_EXT_mesh_shader);\n                } else {\n                    builder.addCapability(spv::Capability::MeshShadingNV);\n                    builder.addExtension(spv::E_SPV_NV_mesh_shader);\n                }\n            }\n            builder.addMemberDecoration(id, (unsigned)member, spv::Decoration::PerPrimitiveNV);\n        }\n        if (qualifier.perViewNV)\n            builder.addMemberDecoration(id, (unsigned)member, spv::Decoration::PerViewNV);\n        if (qualifier.perTaskNV)\n            builder.addMemberDecoration(id, (unsigned)member, spv::Decoration::PerTaskNV);\n    } else {\n        if (qualifier.perPrimitiveNV) {\n            // Need to add capability/extension for fragment shader.\n            // Mesh shader already adds this by default.\n            if (glslangIntermediate->getStage() == EShLangFragment) {\n                if(isMeshShaderExt) {\n                    builder.addCapability(spv::Capability::MeshShadingEXT);\n                    builder.addExtension(spv::E_SPV_EXT_mesh_shader);\n                } else {\n                    builder.addCapability(spv::Capability::MeshShadingNV);\n                    builder.addExtension(spv::E_SPV_NV_mesh_shader);\n                }\n            }\n            builder.addDecoration(id, spv::Decoration::PerPrimitiveNV);\n        }\n        if (qualifier.perViewNV)\n            builder.addDecoration(id, spv::Decoration::PerViewNV);\n        if (qualifier.perTaskNV)\n            builder.addDecoration(id, spv::Decoration::PerTaskNV);\n    }\n}\n\nbool TGlslangToSpvTraverser::hasQCOMImageProceessingDecoration(spv::Id id, spv::Decoration decor)\n{\n  std::vector<spv::Decoration> &decoVec = idToQCOMDecorations[id];\n  for ( auto d : decoVec ) {\n    if ( d == decor )\n      return true;\n  }\n  return false;\n}\n\nvoid TGlslangToSpvTraverser::addImageProcessingQCOMDecoration(spv::Id id, spv::Decoration decor)\n{\n  spv::Op opc = builder.getOpCode(id);\n  if (opc == spv::Op::OpSampledImage) {\n    id  = builder.getIdOperand(id, 0);\n    opc = builder.getOpCode(id);\n  }\n\n  if (opc == spv::Op::OpLoad) {\n    spv::Id texid = builder.getIdOperand(id, 0);\n    if (!hasQCOMImageProceessingDecoration(texid, decor)) {//\n      builder.addDecoration(texid, decor);\n      idToQCOMDecorations[texid].push_back(decor);\n    }\n  }\n}\n\nvoid TGlslangToSpvTraverser::addImageProcessing2QCOMDecoration(spv::Id id, bool isForGather)\n{\n  if (isForGather) {\n    return addImageProcessingQCOMDecoration(id, spv::Decoration::BlockMatchTextureQCOM);\n  }\n\n  auto addDecor =\n    [this](spv::Id id, spv::Decoration decor) {\n      spv::Op tsopc = this->builder.getOpCode(id);\n      if (tsopc == spv::Op::OpLoad) {\n        spv::Id tsid = this->builder.getIdOperand(id, 0);\n        if (this->glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_4) {\n          assert(iOSet.count(tsid) > 0);\n        }\n        if (!hasQCOMImageProceessingDecoration(tsid, decor)) {\n          this->builder.addDecoration(tsid, decor);\n          idToQCOMDecorations[tsid].push_back(decor);\n        }\n      }\n    };\n\n  spv::Op opc = builder.getOpCode(id);\n  bool isInterfaceObject = (opc != spv::Op::OpSampledImage);\n\n  if (!isInterfaceObject) {\n    addDecor(builder.getIdOperand(id, 0), spv::Decoration::BlockMatchTextureQCOM);\n    addDecor(builder.getIdOperand(id, 1), spv::Decoration::BlockMatchSamplerQCOM);\n  } else {\n    addDecor(id, spv::Decoration::BlockMatchTextureQCOM);\n    addDecor(id, spv::Decoration::BlockMatchSamplerQCOM);\n  }\n}\n\n// Make a full tree of instructions to build a SPIR-V specialization constant,\n// or regular constant if possible.\n//\n// TBD: this is not yet done, nor verified to be the best design, it does do the leaf symbols though\n//\n// Recursively walk the nodes.  The nodes form a tree whose leaves are\n// regular constants, which themselves are trees that createSpvConstant()\n// recursively walks.  So, this function walks the \"top\" of the tree:\n//  - emit specialization constant-building instructions for specConstant\n//  - when running into a non-spec-constant, switch to createSpvConstant()\nspv::Id TGlslangToSpvTraverser::createSpvConstant(const glslang::TIntermTyped& node)\n{\n    assert(node.getQualifier().isConstant());\n\n    // Handle front-end constants first (non-specialization constants).\n    if (! node.getQualifier().specConstant) {\n        // hand off to the non-spec-constant path\n        assert(node.getAsConstantUnion() != nullptr || node.getAsSymbolNode() != nullptr);\n        int nextConst = 0;\n        return createSpvConstantFromConstUnionArray(node.getType(), node.getAsConstantUnion() ?\n            node.getAsConstantUnion()->getConstArray() : node.getAsSymbolNode()->getConstArray(),\n            nextConst, false);\n    }\n\n    // We now know we have a specialization constant to build\n\n    // Extra capabilities may be needed.\n    if (node.getType().contains8BitInt())\n        builder.addCapability(spv::Capability::Int8);\n    if (node.getType().contains16BitFloat())\n        builder.addCapability(spv::Capability::Float16);\n    if (node.getType().contains16BitInt())\n        builder.addCapability(spv::Capability::Int16);\n    if (node.getType().contains64BitInt())\n        builder.addCapability(spv::Capability::Int64);\n    if (node.getType().containsDouble())\n        builder.addCapability(spv::Capability::Float64);\n\n    // gl_WorkGroupSize is a special case until the front-end handles hierarchical specialization constants,\n    // even then, it's specialization ids are handled by special case syntax in GLSL: layout(local_size_x = ...\n    if (node.getType().getQualifier().builtIn == glslang::EbvWorkGroupSize) {\n        std::vector<spv::Id> dimConstId;\n        for (int dim = 0; dim < 3; ++dim) {\n            bool specConst = (glslangIntermediate->getLocalSizeSpecId(dim) != glslang::TQualifier::layoutNotSet);\n            dimConstId.push_back(builder.makeUintConstant(glslangIntermediate->getLocalSize(dim), specConst));\n            if (specConst) {\n                builder.addDecoration(dimConstId.back(), spv::Decoration::SpecId,\n                                      glslangIntermediate->getLocalSizeSpecId(dim));\n            }\n        }\n        return builder.makeCompositeConstant(builder.makeVectorType(builder.makeUintType(32), 3), dimConstId, true);\n    }\n\n    // An AST node labelled as specialization constant should be a symbol node.\n    // Its initializer should either be a sub tree with constant nodes, or a constant union array.\n    if (auto* sn = node.getAsSymbolNode()) {\n        spv::Id result;\n        if (auto* sub_tree = sn->getConstSubtree()) {\n            // Traverse the constant constructor sub tree like generating normal run-time instructions.\n            // During the AST traversal, if the node is marked as 'specConstant', SpecConstantOpModeGuard\n            // will set the builder into spec constant op instruction generating mode.\n            sub_tree->traverse(this);\n            result = accessChainLoad(sub_tree->getType());\n        } else if (auto* const_union_array = &sn->getConstArray()) {\n            int nextConst = 0;\n            result = createSpvConstantFromConstUnionArray(sn->getType(), *const_union_array, nextConst, true);\n        } else {\n            logger->missingFunctionality(\"Invalid initializer for spec onstant.\");\n            return spv::NoResult;\n        }\n        builder.addName(result, sn->getName().c_str());\n        return result;\n    }\n\n    // Neither a front-end constant node, nor a specialization constant node with constant union array or\n    // constant sub tree as initializer.\n    logger->missingFunctionality(\"Neither a front-end constant nor a spec constant.\");\n    return spv::NoResult;\n}\n\n// Use 'consts' as the flattened glslang source of scalar constants to recursively\n// build the aggregate SPIR-V constant.\n//\n// If there are not enough elements present in 'consts', 0 will be substituted;\n// an empty 'consts' can be used to create a fully zeroed SPIR-V constant.\n//\nspv::Id TGlslangToSpvTraverser::createSpvConstantFromConstUnionArray(const glslang::TType& glslangType,\n    const glslang::TConstUnionArray& consts, int& nextConst, bool specConstant)\n{\n    // vector of constants for SPIR-V\n    std::vector<spv::Id> spvConsts;\n\n    // Type is used for struct and array constants\n    spv::Id typeId = convertGlslangToSpvType(glslangType);\n\n    if (glslangType.isArray()) {\n        glslang::TType elementType(glslangType, 0);\n        for (int i = 0; i < glslangType.getOuterArraySize(); ++i)\n            spvConsts.push_back(createSpvConstantFromConstUnionArray(elementType, consts, nextConst, false));\n    } else if (glslangType.isMatrix()) {\n        glslang::TType vectorType(glslangType, 0);\n        for (int col = 0; col < glslangType.getMatrixCols(); ++col)\n            spvConsts.push_back(createSpvConstantFromConstUnionArray(vectorType, consts, nextConst, false));\n    } else if (glslangType.isCoopMat()) {\n        glslang::TType componentType(glslangType.getBasicType());\n        spvConsts.push_back(createSpvConstantFromConstUnionArray(componentType, consts, nextConst, false));\n    } else if (glslangType.isStruct()) {\n        glslang::TVector<glslang::TTypeLoc>::const_iterator iter;\n        for (iter = glslangType.getStruct()->begin(); iter != glslangType.getStruct()->end(); ++iter)\n            spvConsts.push_back(createSpvConstantFromConstUnionArray(*iter->type, consts, nextConst, false));\n    } else if (glslangType.getVectorSize() > 1 || glslangType.isCoopVecNV()) {\n        unsigned int numComponents = glslangType.isCoopVecNV() ? glslangType.getTypeParameters()->arraySizes->getDimSize(0) : glslangType.getVectorSize();\n        for (unsigned int i = 0; i < numComponents; ++i) {\n            bool zero = nextConst >= consts.size();\n            switch (glslangType.getBasicType()) {\n            case glslang::EbtInt:\n                spvConsts.push_back(builder.makeIntConstant(zero ? 0 : consts[nextConst].getIConst()));\n                break;\n            case glslang::EbtUint:\n                spvConsts.push_back(builder.makeUintConstant(zero ? 0 : consts[nextConst].getUConst()));\n                break;\n            case glslang::EbtFloat:\n                spvConsts.push_back(builder.makeFloatConstant(zero ? 0.0F : (float)consts[nextConst].getDConst()));\n                break;\n            case glslang::EbtBool:\n                spvConsts.push_back(builder.makeBoolConstant(zero ? false : consts[nextConst].getBConst()));\n                break;\n            case glslang::EbtInt8:\n                builder.addCapability(spv::Capability::Int8);\n                spvConsts.push_back(builder.makeInt8Constant(zero ? 0 : consts[nextConst].getI8Const()));\n                break;\n            case glslang::EbtUint8:\n                builder.addCapability(spv::Capability::Int8);\n                spvConsts.push_back(builder.makeUint8Constant(zero ? 0 : consts[nextConst].getU8Const()));\n                break;\n            case glslang::EbtInt16:\n                builder.addCapability(spv::Capability::Int16);\n                spvConsts.push_back(builder.makeInt16Constant(zero ? 0 : consts[nextConst].getI16Const()));\n                break;\n            case glslang::EbtUint16:\n                builder.addCapability(spv::Capability::Int16);\n                spvConsts.push_back(builder.makeUint16Constant(zero ? 0 : consts[nextConst].getU16Const()));\n                break;\n            case glslang::EbtInt64:\n                spvConsts.push_back(builder.makeInt64Constant(zero ? 0 : consts[nextConst].getI64Const()));\n                break;\n            case glslang::EbtUint64:\n                spvConsts.push_back(builder.makeUint64Constant(zero ? 0 : consts[nextConst].getU64Const()));\n                break;\n            case glslang::EbtDouble:\n                spvConsts.push_back(builder.makeDoubleConstant(zero ? 0.0 : consts[nextConst].getDConst()));\n                break;\n            case glslang::EbtFloat16:\n                builder.addCapability(spv::Capability::Float16);\n                spvConsts.push_back(builder.makeFloat16Constant(zero ? 0.0F : (float)consts[nextConst].getDConst()));\n                break;\n            case glslang::EbtBFloat16:\n                spvConsts.push_back(builder.makeBFloat16Constant(zero ? 0.0F : (float)consts[nextConst].getDConst()));\n                break;\n            case glslang::EbtFloatE5M2:\n                spvConsts.push_back(builder.makeFloatE5M2Constant(zero ? 0.0F : (float)consts[nextConst].getDConst()));\n                break;\n            case glslang::EbtFloatE4M3:\n                spvConsts.push_back(builder.makeFloatE4M3Constant(zero ? 0.0F : (float)consts[nextConst].getDConst()));\n                break;\n            default:\n                assert(0);\n                break;\n            }\n            ++nextConst;\n        }\n    } else {\n        // we have a non-aggregate (scalar) constant\n        bool zero = nextConst >= consts.size();\n        spv::Id scalar = 0;\n        switch (glslangType.getBasicType()) {\n        case glslang::EbtInt:\n            scalar = builder.makeIntConstant(zero ? 0 : consts[nextConst].getIConst(), specConstant);\n            break;\n        case glslang::EbtUint:\n            scalar = builder.makeUintConstant(zero ? 0 : consts[nextConst].getUConst(), specConstant);\n            break;\n        case glslang::EbtFloat:\n            scalar = builder.makeFloatConstant(zero ? 0.0F : (float)consts[nextConst].getDConst(), specConstant);\n            break;\n        case glslang::EbtBool:\n            scalar = builder.makeBoolConstant(zero ? false : consts[nextConst].getBConst(), specConstant);\n            break;\n        case glslang::EbtInt8:\n            builder.addCapability(spv::Capability::Int8);\n            scalar = builder.makeInt8Constant(zero ? 0 : consts[nextConst].getI8Const(), specConstant);\n            break;\n        case glslang::EbtUint8:\n            builder.addCapability(spv::Capability::Int8);\n            scalar = builder.makeUint8Constant(zero ? 0 : consts[nextConst].getU8Const(), specConstant);\n            break;\n        case glslang::EbtInt16:\n            builder.addCapability(spv::Capability::Int16);\n            scalar = builder.makeInt16Constant(zero ? 0 : consts[nextConst].getI16Const(), specConstant);\n            break;\n        case glslang::EbtUint16:\n            builder.addCapability(spv::Capability::Int16);\n            scalar = builder.makeUint16Constant(zero ? 0 : consts[nextConst].getU16Const(), specConstant);\n            break;\n        case glslang::EbtInt64:\n            scalar = builder.makeInt64Constant(zero ? 0 : consts[nextConst].getI64Const(), specConstant);\n            break;\n        case glslang::EbtUint64:\n            scalar = builder.makeUint64Constant(zero ? 0 : consts[nextConst].getU64Const(), specConstant);\n            break;\n        case glslang::EbtDouble:\n            scalar = builder.makeDoubleConstant(zero ? 0.0 : consts[nextConst].getDConst(), specConstant);\n            break;\n        case glslang::EbtFloat16:\n            builder.addCapability(spv::Capability::Float16);\n            scalar = builder.makeFloat16Constant(zero ? 0.0F : (float)consts[nextConst].getDConst(), specConstant);\n            break;\n        case glslang::EbtBFloat16:\n            scalar = builder.makeBFloat16Constant(zero ? 0.0F : (float)consts[nextConst].getDConst(), specConstant);\n            break;\n        case glslang::EbtFloatE5M2:\n            scalar = builder.makeFloatE5M2Constant(zero ? 0.0F : (float)consts[nextConst].getDConst(), specConstant);\n            break;\n        case glslang::EbtFloatE4M3:\n            scalar = builder.makeFloatE4M3Constant(zero ? 0.0F : (float)consts[nextConst].getDConst(), specConstant);\n            break;\n        case glslang::EbtReference:\n            scalar = builder.makeUint64Constant(zero ? 0 : consts[nextConst].getU64Const(), specConstant);\n            scalar = builder.createUnaryOp(spv::Op::OpBitcast, typeId, scalar);\n            break;\n        case glslang::EbtString:\n            scalar = builder.getStringId(consts[nextConst].getSConst()->c_str());\n            break;\n        default:\n            assert(0);\n            break;\n        }\n        ++nextConst;\n        return scalar;\n    }\n\n    return builder.makeCompositeConstant(typeId, spvConsts);\n}\n\n// Return true if the node is a constant or symbol whose reading has no\n// non-trivial observable cost or effect.\nbool TGlslangToSpvTraverser::isTrivialLeaf(const glslang::TIntermTyped* node)\n{\n    // don't know what this is\n    if (node == nullptr)\n        return false;\n\n    // a constant is safe\n    if (node->getAsConstantUnion() != nullptr)\n        return true;\n\n    // not a symbol means non-trivial\n    if (node->getAsSymbolNode() == nullptr)\n        return false;\n\n    // a symbol, depends on what's being read\n    switch (node->getType().getQualifier().storage) {\n    case glslang::EvqTemporary:\n    case glslang::EvqGlobal:\n    case glslang::EvqIn:\n    case glslang::EvqInOut:\n    case glslang::EvqConst:\n    case glslang::EvqConstReadOnly:\n    case glslang::EvqUniform:\n        return true;\n    default:\n        return false;\n    }\n}\n\n// A node is trivial if it is a single operation with no side effects.\n// HLSL (and/or vectors) are always trivial, as it does not short circuit.\n// Otherwise, error on the side of saying non-trivial.\n// Return true if trivial.\nbool TGlslangToSpvTraverser::isTrivial(const glslang::TIntermTyped* node)\n{\n    if (node == nullptr)\n        return false;\n\n    // count non scalars as trivial, as well as anything coming from HLSL\n    if (! node->getType().isScalarOrVec1() || glslangIntermediate->getSource() == glslang::EShSourceHlsl)\n        return true;\n\n    // symbols and constants are trivial\n    if (isTrivialLeaf(node))\n        return true;\n\n    // otherwise, it needs to be a simple operation or one or two leaf nodes\n\n    // not a simple operation\n    const glslang::TIntermBinary* binaryNode = node->getAsBinaryNode();\n    const glslang::TIntermUnary* unaryNode = node->getAsUnaryNode();\n    if (binaryNode == nullptr && unaryNode == nullptr)\n        return false;\n\n    // not on leaf nodes\n    if (binaryNode && (! isTrivialLeaf(binaryNode->getLeft()) || ! isTrivialLeaf(binaryNode->getRight())))\n        return false;\n\n    if (unaryNode && ! isTrivialLeaf(unaryNode->getOperand())) {\n        return false;\n    }\n\n    if (IsOpNumericConv(node->getAsOperator()->getOp()) &&\n        node->getType().getBasicType() == glslang::EbtBool) {\n        return true;\n    }\n\n    switch (node->getAsOperator()->getOp()) {\n    case glslang::EOpLogicalNot:\n    case glslang::EOpEqual:\n    case glslang::EOpNotEqual:\n    case glslang::EOpLessThan:\n    case glslang::EOpGreaterThan:\n    case glslang::EOpLessThanEqual:\n    case glslang::EOpGreaterThanEqual:\n    case glslang::EOpIndexDirect:\n    case glslang::EOpIndexDirectStruct:\n    case glslang::EOpLogicalXor:\n    case glslang::EOpAny:\n    case glslang::EOpAll:\n        return true;\n    default:\n        return false;\n    }\n}\n\n// Emit short-circuiting code, where 'right' is never evaluated unless\n// the left side is true (for &&) or false (for ||).\nspv::Id TGlslangToSpvTraverser::createShortCircuit(glslang::TOperator op, glslang::TIntermTyped& left,\n    glslang::TIntermTyped& right)\n{\n    spv::Id boolTypeId = builder.makeBoolType();\n\n    // emit left operand\n    builder.clearAccessChain();\n    left.traverse(this);\n    spv::Id leftId = accessChainLoad(left.getType());\n\n    // Operands to accumulate OpPhi operands\n    std::vector<spv::Id> phiOperands;\n    phiOperands.reserve(4);\n    // accumulate left operand's phi information\n    phiOperands.push_back(leftId);\n    phiOperands.push_back(builder.getBuildPoint()->getId());\n\n    // Make the two kinds of operation symmetric with a \"!\"\n    //   || => emit \"if (! left) result = right\"\n    //   && => emit \"if (  left) result = right\"\n    //\n    // TODO: this runtime \"not\" for || could be avoided by adding functionality\n    // to 'builder' to have an \"else\" without an \"then\"\n    if (op == glslang::EOpLogicalOr)\n        leftId = builder.createUnaryOp(spv::Op::OpLogicalNot, boolTypeId, leftId);\n\n    // make an \"if\" based on the left value\n    spv::Builder::If ifBuilder(leftId, spv::SelectionControlMask::MaskNone, builder);\n\n    // emit right operand as the \"then\" part of the \"if\"\n    builder.clearAccessChain();\n    right.traverse(this);\n    spv::Id rightId = accessChainLoad(right.getType());\n\n    // accumulate left operand's phi information\n    phiOperands.push_back(rightId);\n    phiOperands.push_back(builder.getBuildPoint()->getId());\n\n    // finish the \"if\"\n    ifBuilder.makeEndIf();\n\n    // phi together the two results\n    return builder.createOp(spv::Op::OpPhi, boolTypeId, phiOperands);\n}\n\n// Return type Id of the imported set of extended instructions corresponds to the name.\n// Import this set if it has not been imported yet.\nspv::Id TGlslangToSpvTraverser::getExtBuiltins(const char* name)\n{\n    if (extBuiltinMap.find(name) != extBuiltinMap.end())\n        return extBuiltinMap[name];\n    else {\n        spv::Id extBuiltins = builder.import(name);\n        extBuiltinMap[name] = extBuiltins;\n        return extBuiltins;\n    }\n}\n\n} // end anonymous namespace\n\nnamespace glslang {\n\nvoid GetSpirvVersion(std::string& version)\n{\n    const int bufSize = 100;\n    char buf[bufSize];\n    snprintf(buf, bufSize, \"0x%08x, Revision %d\", spv::Version, spv::Revision);\n    version = buf;\n}\n\n// For low-order part of the generator's magic number. Bump up\n// when there is a change in the style (e.g., if SSA form changes,\n// or a different instruction sequence to do something gets used).\nint GetSpirvGeneratorVersion()\n{\n    // return 1; // start\n    // return 2; // EOpAtomicCounterDecrement gets a post decrement, to map between GLSL -> SPIR-V\n    // return 3; // change/correct barrier-instruction operands, to match memory model group decisions\n    // return 4; // some deeper access chains: for dynamic vector component, and local Boolean component\n    // return 5; // make OpArrayLength result type be an int with signedness of 0\n    // return 6; // revert version 5 change, which makes a different (new) kind of incorrect code,\n                 // versions 4 and 6 each generate OpArrayLength as it has long been done\n    // return 7; // GLSL volatile keyword maps to both SPIR-V decorations Volatile and Coherent\n    // return 8; // switch to new dead block eliminator; use OpUnreachable\n    // return 9; // don't include opaque function parameters in OpEntryPoint global's operand list\n    // return 10; // Generate OpFUnordNotEqual for != comparisons\n    return 11; // Make OpEmitMeshTasksEXT a terminal instruction\n}\n\n// Write SPIR-V out to a binary file\nbool OutputSpvBin(const std::vector<unsigned int>& spirv, const char* baseName)\n{\n    std::ofstream out;\n    out.open(baseName, std::ios::binary | std::ios::out);\n    if (out.fail()) {\n        printf(\"ERROR: Failed to open file: %s\\n\", baseName);\n        return false;\n    }\n    for (int i = 0; i < (int)spirv.size(); ++i) {\n        unsigned int word = spirv[i];\n        out.write((const char*)&word, 4);\n    }\n    out.close();\n    return true;\n}\n\n// Write SPIR-V out to a text file with 32-bit hexadecimal words\nbool OutputSpvHex(const std::vector<unsigned int>& spirv, const char* baseName, const char* varName)\n{\n    std::ofstream out;\n    out.open(baseName, std::ios::binary | std::ios::out);\n    if (out.fail()) {\n        printf(\"ERROR: Failed to open file: %s\\n\", baseName);\n        return false;\n    }\n    out << \"\\t// \" <<\n        GetSpirvGeneratorVersion() <<\n        GLSLANG_VERSION_MAJOR << \".\" << GLSLANG_VERSION_MINOR << \".\" << GLSLANG_VERSION_PATCH <<\n        GLSLANG_VERSION_FLAVOR << std::endl;\n    if (varName != nullptr) {\n        out << \"\\t #pragma once\" << std::endl;\n        out << \"const uint32_t \" << varName << \"[] = {\" << std::endl;\n    }\n    const int WORDS_PER_LINE = 8;\n    for (int i = 0; i < (int)spirv.size(); i += WORDS_PER_LINE) {\n        out << \"\\t\";\n        for (int j = 0; j < WORDS_PER_LINE && i + j < (int)spirv.size(); ++j) {\n            const unsigned int word = spirv[i + j];\n            out << \"0x\" << std::hex << std::setw(8) << std::setfill('0') << word;\n            if (i + j + 1 < (int)spirv.size()) {\n                out << \",\";\n            }\n        }\n        out << std::endl;\n    }\n    if (varName != nullptr) {\n        out << \"};\";\n        out << std::endl;\n    }\n    out.close();\n    return true;\n}\n\n//\n// Set up the glslang traversal\n//\nvoid GlslangToSpv(const TIntermediate& intermediate, std::vector<unsigned int>& spirv, SpvOptions* options)\n{\n    spv::SpvBuildLogger logger;\n    GlslangToSpv(intermediate, spirv, &logger, options);\n}\n\nvoid GlslangToSpv(const TIntermediate& intermediate, std::vector<unsigned int>& spirv,\n                  spv::SpvBuildLogger* logger, SpvOptions* options)\n{\n    TIntermNode* root = intermediate.getTreeRoot();\n\n    if (root == nullptr)\n        return;\n\n    SpvOptions defaultOptions;\n    if (options == nullptr)\n        options = &defaultOptions;\n\n    GetThreadPoolAllocator().push();\n\n    TGlslangToSpvTraverser it(intermediate.getSpv().spv, &intermediate, logger, *options);\n    root->traverse(&it);\n    it.finishSpv(options->compileOnly);\n    it.dumpSpv(spirv);\n\n#if ENABLE_OPT\n    // If from HLSL, run spirv-opt to \"legalize\" the SPIR-V for Vulkan\n    // eg. forward and remove memory writes of opaque types.\n    bool prelegalization = intermediate.getSource() == EShSourceHlsl;\n    if ((prelegalization || options->optimizeSize) && !options->disableOptimizer) {\n        SpirvToolsTransform(intermediate, spirv, logger, options);\n        prelegalization = false;\n    }\n    else if (options->stripDebugInfo) {\n        // Strip debug info even if optimization is disabled.\n        SpirvToolsStripDebugInfo(intermediate, spirv, logger);\n    }\n\n    if (options->validate)\n        SpirvToolsValidate(intermediate, spirv, logger, prelegalization);\n\n    if (options->disassemble)\n        SpirvToolsDisassemble(std::cout, spirv);\n\n#endif\n\n    GetThreadPoolAllocator().pop();\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/GlslangToSpv.h",
    "content": "//\n// Copyright (C) 2014 LunarG, Inc.\n// Copyright (C) 2015-2018 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\n#pragma once\n\n#include <string>\n#include <vector>\n\n#include \"Logger.h\"\n#include \"../glslang/Include/visibility.h\"\n\nnamespace glslang {\nclass TIntermediate;\n\nstruct SpvOptions {\n    bool generateDebugInfo {false};\n    bool stripDebugInfo {false};\n    bool disableOptimizer {true};\n    bool optimizeSize {false};\n    bool disassemble {false};\n    bool validate {false};\n    bool emitNonSemanticShaderDebugInfo {false};\n    bool emitNonSemanticShaderDebugSource{ false };\n    bool compileOnly{false};\n    bool optimizerAllowExpandedIDBound{false};\n};\n\nGLSLANG_EXPORT void GetSpirvVersion(std::string&);\nGLSLANG_EXPORT int GetSpirvGeneratorVersion();\nGLSLANG_EXPORT void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,\n                                 SpvOptions* options = nullptr);\nGLSLANG_EXPORT void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,\n                                 spv::SpvBuildLogger* logger, SpvOptions* options = nullptr);\nGLSLANG_EXPORT bool OutputSpvBin(const std::vector<unsigned int>& spirv, const char* baseName);\nGLSLANG_EXPORT bool OutputSpvHex(const std::vector<unsigned int>& spirv, const char* baseName, const char* varName);\n\n}\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/InReadableOrder.cpp",
    "content": "//\n// Copyright (C) 2016 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\n// The SPIR-V spec requires code blocks to appear in an order satisfying the\n// dominator-tree direction (ie, dominator before the dominated).  This is,\n// actually, easy to achieve: any pre-order CFG traversal algorithm will do it.\n// Because such algorithms visit a block only after traversing some path to it\n// from the root, they necessarily visit the block's idom first.\n//\n// But not every graph-traversal algorithm outputs blocks in an order that\n// appears logical to human readers.  The problem is that unrelated branches may\n// be interspersed with each other, and merge blocks may come before some of the\n// branches being merged.\n//\n// A good, human-readable order of blocks may be achieved by performing\n// depth-first search but delaying merge nodes until after all their branches\n// have been visited.  This is implemented below by the inReadableOrder()\n// function.\n\n#include \"spvIR.h\"\n\n#include <cassert>\n#include <unordered_set>\n\nusing spv::Block;\nusing spv::Id;\n\nnamespace {\n// Traverses CFG in a readable order, invoking a pre-set callback on each block.\n// Use by calling visit() on the root block.\nclass ReadableOrderTraverser {\npublic:\n    ReadableOrderTraverser(std::function<void(Block*, spv::ReachReason, Block*)> callback)\n      : callback_(callback) {}\n    // Visits the block if it hasn't been visited already and isn't currently\n    // being delayed.  Invokes callback(block, why, header), then descends into its\n    // successors.  Delays merge-block and continue-block processing until all\n    // the branches have been completed.  If |block| is an unreachable merge block or\n    // an unreachable continue target, then |header| is the corresponding header block.\n    void visit(Block* block, spv::ReachReason why, Block* header)\n    {\n        assert(block);\n        if (why == spv::ReachViaControlFlow) {\n            reachableViaControlFlow_.insert(block);\n        }\n        if (visited_.count(block) || delayed_.count(block))\n            return;\n        callback_(block, why, header);\n        visited_.insert(block);\n        Block* mergeBlock = nullptr;\n        Block* continueBlock = nullptr;\n        auto mergeInst = block->getMergeInstruction();\n        if (mergeInst) {\n            Id mergeId = mergeInst->getIdOperand(0);\n            mergeBlock = block->getParent().getParent().getInstruction(mergeId)->getBlock();\n            delayed_.insert(mergeBlock);\n            if (mergeInst->getOpCode() == spv::Op::OpLoopMerge) {\n                Id continueId = mergeInst->getIdOperand(1);\n                continueBlock =\n                    block->getParent().getParent().getInstruction(continueId)->getBlock();\n                delayed_.insert(continueBlock);\n            }\n        }\n        if (why == spv::ReachViaControlFlow) {\n            const auto& successors = block->getSuccessors();\n            for (auto it = successors.cbegin(); it != successors.cend(); ++it)\n                visit(*it, why, nullptr);\n        }\n        if (continueBlock) {\n            const spv::ReachReason continueWhy =\n                (reachableViaControlFlow_.count(continueBlock) > 0)\n                    ? spv::ReachViaControlFlow\n                    : spv::ReachDeadContinue;\n            delayed_.erase(continueBlock);\n            visit(continueBlock, continueWhy, block);\n        }\n        if (mergeBlock) {\n            const spv::ReachReason mergeWhy =\n                (reachableViaControlFlow_.count(mergeBlock) > 0)\n                    ? spv::ReachViaControlFlow\n                    : spv::ReachDeadMerge;\n            delayed_.erase(mergeBlock);\n            visit(mergeBlock, mergeWhy, block);\n        }\n    }\n\nprivate:\n    std::function<void(Block*, spv::ReachReason, Block*)> callback_;\n    // Whether a block has already been visited or is being delayed.\n    std::unordered_set<Block *> visited_, delayed_;\n\n    // The set of blocks that actually are reached via control flow.\n    std::unordered_set<Block *> reachableViaControlFlow_;\n};\n}\n\nvoid spv::inReadableOrder(Block* root, std::function<void(Block*, spv::ReachReason, Block*)> callback)\n{\n    ReadableOrderTraverser(callback).visit(root, spv::ReachViaControlFlow, nullptr);\n}\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/Logger.cpp",
    "content": "//\n// Copyright (C) 2016 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of Google Inc. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\n#include \"Logger.h\"\n\n#include <algorithm>\n#include <iterator>\n#include <sstream>\n\nnamespace spv {\n\nvoid SpvBuildLogger::tbdFunctionality(const std::string& f)\n{\n    if (std::find(std::begin(tbdFeatures), std::end(tbdFeatures), f) == std::end(tbdFeatures))\n        tbdFeatures.push_back(f);\n}\n\nvoid SpvBuildLogger::missingFunctionality(const std::string& f)\n{\n    if (std::find(std::begin(missingFeatures), std::end(missingFeatures), f) == std::end(missingFeatures))\n        missingFeatures.push_back(f);\n}\n\nstd::string SpvBuildLogger::getAllMessages() const {\n    std::ostringstream messages;\n    for (auto it = tbdFeatures.cbegin(); it != tbdFeatures.cend(); ++it)\n        messages << \"TBD functionality: \" << *it << \"\\n\";\n    for (auto it = missingFeatures.cbegin(); it != missingFeatures.cend(); ++it)\n        messages << \"Missing functionality: \" << *it << \"\\n\";\n    for (auto it = warnings.cbegin(); it != warnings.cend(); ++it)\n        messages << \"warning: \" << *it << \"\\n\";\n    for (auto it = errors.cbegin(); it != errors.cend(); ++it)\n        messages << \"error: \" << *it << \"\\n\";\n    return messages.str();\n}\n\n} // end spv namespace\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/Logger.h",
    "content": "//\n// Copyright (C) 2016 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of Google Inc. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef GLSLANG_SPIRV_LOGGER_H\n#define GLSLANG_SPIRV_LOGGER_H\n\n#include <string>\n#include <vector>\n#include \"../glslang/Include/visibility.h\"\n\nnamespace spv {\n\n// A class for holding all SPIR-V build status messages, including\n// missing/TBD functionalities, warnings, and errors.\nclass GLSLANG_EXPORT SpvBuildLogger {\npublic:\n    SpvBuildLogger() {}\n\n    // Registers a TBD functionality.\n    void tbdFunctionality(const std::string& f);\n    // Registers a missing functionality.\n    void missingFunctionality(const std::string& f);\n\n    // Logs a warning.\n    void warning(const std::string& w) { warnings.push_back(w); }\n    // Logs an error.\n    void error(const std::string& e) { errors.push_back(e); }\n\n    // Returns all messages accumulated in the order of:\n    // TBD functionalities, missing functionalities, warnings, errors.\n    std::string getAllMessages() const;\n\nprivate:\n    SpvBuildLogger(const SpvBuildLogger&);\n\n    std::vector<std::string> tbdFeatures;\n    std::vector<std::string> missingFeatures;\n    std::vector<std::string> warnings;\n    std::vector<std::string> errors;\n};\n\n} // end spv namespace\n\n#endif // GLSLANG_SPIRV_LOGGER_H\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/NonSemanticDebugPrintf.h",
    "content": "// Copyright (c) 2020 The Khronos Group Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and/or associated documentation files (the\n// \"Materials\"), to deal in the Materials without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Materials, and to\n// permit persons to whom the Materials are furnished to do so, subject to\n// the following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Materials.\n//\n// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS\n// KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS\n// SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT\n//    https://www.khronos.org/registry/\n//\n// THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\n//\n\n#ifndef SPIRV_UNIFIED1_NonSemanticDebugPrintf_H_\n#define SPIRV_UNIFIED1_NonSemanticDebugPrintf_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nenum {\n    NonSemanticDebugPrintfRevision = 1,\n    NonSemanticDebugPrintfRevision_BitWidthPadding = 0x7fffffff\n};\n\nenum NonSemanticDebugPrintfInstructions {\n    NonSemanticDebugPrintfDebugPrintf = 1,\n    NonSemanticDebugPrintfInstructionsMax = 0x7fffffff\n};\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // SPIRV_UNIFIED1_NonSemanticDebugPrintf_H_\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/NonSemanticShaderDebugInfo100.h",
    "content": "// Copyright (c) 2018 The Khronos Group Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and/or associated documentation files (the \"Materials\"),\n// to deal in the Materials without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Materials, and to permit persons to whom the\n// Materials are furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Materials.\n//\n// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS\n// STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND\n// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/\n//\n// THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS\n// IN THE MATERIALS.\n\n#ifndef SPIRV_UNIFIED1_NonSemanticShaderDebugInfo100_H_\n#define SPIRV_UNIFIED1_NonSemanticShaderDebugInfo100_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nenum {\n    NonSemanticShaderDebugInfo100Version = 100,\n    NonSemanticShaderDebugInfo100Version_BitWidthPadding = 0x7fffffff\n};\nenum {\n    NonSemanticShaderDebugInfo100Revision = 6,\n    NonSemanticShaderDebugInfo100Revision_BitWidthPadding = 0x7fffffff\n};\n\nenum NonSemanticShaderDebugInfo100Instructions {\n    NonSemanticShaderDebugInfo100DebugInfoNone = 0,\n    NonSemanticShaderDebugInfo100DebugCompilationUnit = 1,\n    NonSemanticShaderDebugInfo100DebugTypeBasic = 2,\n    NonSemanticShaderDebugInfo100DebugTypePointer = 3,\n    NonSemanticShaderDebugInfo100DebugTypeQualifier = 4,\n    NonSemanticShaderDebugInfo100DebugTypeArray = 5,\n    NonSemanticShaderDebugInfo100DebugTypeVector = 6,\n    NonSemanticShaderDebugInfo100DebugTypedef = 7,\n    NonSemanticShaderDebugInfo100DebugTypeFunction = 8,\n    NonSemanticShaderDebugInfo100DebugTypeEnum = 9,\n    NonSemanticShaderDebugInfo100DebugTypeComposite = 10,\n    NonSemanticShaderDebugInfo100DebugTypeMember = 11,\n    NonSemanticShaderDebugInfo100DebugTypeInheritance = 12,\n    NonSemanticShaderDebugInfo100DebugTypePtrToMember = 13,\n    NonSemanticShaderDebugInfo100DebugTypeTemplate = 14,\n    NonSemanticShaderDebugInfo100DebugTypeTemplateParameter = 15,\n    NonSemanticShaderDebugInfo100DebugTypeTemplateTemplateParameter = 16,\n    NonSemanticShaderDebugInfo100DebugTypeTemplateParameterPack = 17,\n    NonSemanticShaderDebugInfo100DebugGlobalVariable = 18,\n    NonSemanticShaderDebugInfo100DebugFunctionDeclaration = 19,\n    NonSemanticShaderDebugInfo100DebugFunction = 20,\n    NonSemanticShaderDebugInfo100DebugLexicalBlock = 21,\n    NonSemanticShaderDebugInfo100DebugLexicalBlockDiscriminator = 22,\n    NonSemanticShaderDebugInfo100DebugScope = 23,\n    NonSemanticShaderDebugInfo100DebugNoScope = 24,\n    NonSemanticShaderDebugInfo100DebugInlinedAt = 25,\n    NonSemanticShaderDebugInfo100DebugLocalVariable = 26,\n    NonSemanticShaderDebugInfo100DebugInlinedVariable = 27,\n    NonSemanticShaderDebugInfo100DebugDeclare = 28,\n    NonSemanticShaderDebugInfo100DebugValue = 29,\n    NonSemanticShaderDebugInfo100DebugOperation = 30,\n    NonSemanticShaderDebugInfo100DebugExpression = 31,\n    NonSemanticShaderDebugInfo100DebugMacroDef = 32,\n    NonSemanticShaderDebugInfo100DebugMacroUndef = 33,\n    NonSemanticShaderDebugInfo100DebugImportedEntity = 34,\n    NonSemanticShaderDebugInfo100DebugSource = 35,\n    NonSemanticShaderDebugInfo100DebugFunctionDefinition = 101,\n    NonSemanticShaderDebugInfo100DebugSourceContinued = 102,\n    NonSemanticShaderDebugInfo100DebugLine = 103,\n    NonSemanticShaderDebugInfo100DebugNoLine = 104,\n    NonSemanticShaderDebugInfo100DebugBuildIdentifier = 105,\n    NonSemanticShaderDebugInfo100DebugStoragePath = 106,\n    NonSemanticShaderDebugInfo100DebugEntryPoint = 107,\n    NonSemanticShaderDebugInfo100DebugTypeMatrix = 108,\n    NonSemanticShaderDebugInfo100InstructionsMax = 0x7fffffff\n};\n\n\nenum NonSemanticShaderDebugInfo100DebugInfoFlags {\n    NonSemanticShaderDebugInfo100None = 0x0000,\n    NonSemanticShaderDebugInfo100FlagIsProtected = 0x01,\n    NonSemanticShaderDebugInfo100FlagIsPrivate = 0x02,\n    NonSemanticShaderDebugInfo100FlagIsPublic = 0x03,\n    NonSemanticShaderDebugInfo100FlagIsLocal = 0x04,\n    NonSemanticShaderDebugInfo100FlagIsDefinition = 0x08,\n    NonSemanticShaderDebugInfo100FlagFwdDecl = 0x10,\n    NonSemanticShaderDebugInfo100FlagArtificial = 0x20,\n    NonSemanticShaderDebugInfo100FlagExplicit = 0x40,\n    NonSemanticShaderDebugInfo100FlagPrototyped = 0x80,\n    NonSemanticShaderDebugInfo100FlagObjectPointer = 0x100,\n    NonSemanticShaderDebugInfo100FlagStaticMember = 0x200,\n    NonSemanticShaderDebugInfo100FlagIndirectVariable = 0x400,\n    NonSemanticShaderDebugInfo100FlagLValueReference = 0x800,\n    NonSemanticShaderDebugInfo100FlagRValueReference = 0x1000,\n    NonSemanticShaderDebugInfo100FlagIsOptimized = 0x2000,\n    NonSemanticShaderDebugInfo100FlagIsEnumClass = 0x4000,\n    NonSemanticShaderDebugInfo100FlagTypePassByValue = 0x8000,\n    NonSemanticShaderDebugInfo100FlagTypePassByReference = 0x10000,\n    NonSemanticShaderDebugInfo100FlagUnknownPhysicalLayout = 0x20000,\n    NonSemanticShaderDebugInfo100DebugInfoFlagsMax = 0x7fffffff\n};\n\nenum NonSemanticShaderDebugInfo100BuildIdentifierFlags {\n    NonSemanticShaderDebugInfo100IdentifierPossibleDuplicates = 0x01,\n    NonSemanticShaderDebugInfo100BuildIdentifierFlagsMax = 0x7fffffff\n};\n\nenum NonSemanticShaderDebugInfo100DebugBaseTypeAttributeEncoding {\n    NonSemanticShaderDebugInfo100Unspecified = 0,\n    NonSemanticShaderDebugInfo100Address = 1,\n    NonSemanticShaderDebugInfo100Boolean = 2,\n    NonSemanticShaderDebugInfo100Float = 3,\n    NonSemanticShaderDebugInfo100Signed = 4,\n    NonSemanticShaderDebugInfo100SignedChar = 5,\n    NonSemanticShaderDebugInfo100Unsigned = 6,\n    NonSemanticShaderDebugInfo100UnsignedChar = 7,\n    NonSemanticShaderDebugInfo100DebugBaseTypeAttributeEncodingMax = 0x7fffffff\n};\n\nenum NonSemanticShaderDebugInfo100DebugCompositeType {\n    NonSemanticShaderDebugInfo100Class = 0,\n    NonSemanticShaderDebugInfo100Structure = 1,\n    NonSemanticShaderDebugInfo100Union = 2,\n    NonSemanticShaderDebugInfo100DebugCompositeTypeMax = 0x7fffffff\n};\n\nenum NonSemanticShaderDebugInfo100DebugTypeQualifier {\n    NonSemanticShaderDebugInfo100ConstType = 0,\n    NonSemanticShaderDebugInfo100VolatileType = 1,\n    NonSemanticShaderDebugInfo100RestrictType = 2,\n    NonSemanticShaderDebugInfo100AtomicType = 3,\n    NonSemanticShaderDebugInfo100DebugTypeQualifierMax = 0x7fffffff\n};\n\nenum NonSemanticShaderDebugInfo100DebugOperation {\n    NonSemanticShaderDebugInfo100Deref = 0,\n    NonSemanticShaderDebugInfo100Plus = 1,\n    NonSemanticShaderDebugInfo100Minus = 2,\n    NonSemanticShaderDebugInfo100PlusUconst = 3,\n    NonSemanticShaderDebugInfo100BitPiece = 4,\n    NonSemanticShaderDebugInfo100Swap = 5,\n    NonSemanticShaderDebugInfo100Xderef = 6,\n    NonSemanticShaderDebugInfo100StackValue = 7,\n    NonSemanticShaderDebugInfo100Constu = 8,\n    NonSemanticShaderDebugInfo100Fragment = 9,\n    NonSemanticShaderDebugInfo100DebugOperationMax = 0x7fffffff\n};\n\nenum NonSemanticShaderDebugInfo100DebugImportedEntity {\n    NonSemanticShaderDebugInfo100ImportedModule = 0,\n    NonSemanticShaderDebugInfo100ImportedDeclaration = 1,\n    NonSemanticShaderDebugInfo100DebugImportedEntityMax = 0x7fffffff\n};\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // SPIRV_UNIFIED1_NonSemanticShaderDebugInfo100_H_\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/SPVRemapper.cpp",
    "content": "//\n// Copyright (C) 2015 LunarG, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#include \"SPVRemapper.h\"\n#include \"doc.h\"\n#include \"spvUtil.h\"\n\n#include <algorithm>\n#include <cassert>\n\nnamespace spv {\n\n    // By default, just abort on error.  Can be overridden via RegisterErrorHandler\n    spirvbin_t::errorfn_t spirvbin_t::errorHandler = [](const std::string&) { exit(5); };\n    // By default, eat log messages.  Can be overridden via RegisterLogHandler\n    spirvbin_t::logfn_t   spirvbin_t::logHandler   = [](const std::string&) { };\n\n    // This can be overridden to provide other message behavior if needed\n    void spirvbin_t::msg(int minVerbosity, int indent, const std::string& txt) const\n    {\n        if (verbose >= minVerbosity)\n            logHandler(std::string(indent, ' ') + txt);\n    }\n\n    // hash opcode, with special handling for OpExtInst\n    std::uint32_t spirvbin_t::asOpCodeHash(unsigned word)\n    {\n        const spv::Op opCode = asOpCode(word);\n\n        std::uint32_t offset = 0;\n\n        switch (opCode) {\n        case spv::Op::OpExtInst:\n            offset += asId(word + 4); break;\n        default:\n            break;\n        }\n\n        return ((unsigned)opCode) * 19 + offset; // 19 = small prime\n    }\n\n    spirvbin_t::range_t spirvbin_t::literalRange(spv::Op opCode) const\n    {\n        static const int maxCount = 1<<30;\n\n        switch (opCode) {\n        case spv::Op::OpTypeFloat:    // fall through...\n        case spv::Op::OpTypePointer:  return range_t(2, 3);\n        case spv::Op::OpTypeInt:      return range_t(2, 4);\n        // TODO: case spv::OpTypeImage:\n        // TODO: case spv::OpTypeSampledImage:\n        case spv::Op::OpTypeSampler:  return range_t(3, 8);\n        case spv::Op::OpTypeVector:   // fall through\n        case spv::Op::OpTypeMatrix:   // ...\n        case spv::Op::OpTypePipe:     return range_t(3, 4);\n        case spv::Op::OpConstant:     return range_t(3, maxCount);\n        default:                      return range_t(0, 0);\n        }\n    }\n\n    spirvbin_t::range_t spirvbin_t::typeRange(spv::Op opCode) const\n    {\n        static const int maxCount = 1<<30;\n\n        if (isConstOp(opCode))\n            return range_t(1, 2);\n\n        switch (opCode) {\n        case spv::Op::OpTypeVector:       // fall through\n        case spv::Op::OpTypeMatrix:       // ...\n        case spv::Op::OpTypeSampler:      // ...\n        case spv::Op::OpTypeArray:        // ...\n        case spv::Op::OpTypeRuntimeArray: // ...\n        case spv::Op::OpTypePipe:         return range_t(2, 3);\n        case spv::Op::OpTypeStruct:       // fall through\n        case spv::Op::OpTypeFunction:     return range_t(2, maxCount);\n        case spv::Op::OpTypePointer:      return range_t(3, 4);\n        default:                      return range_t(0, 0);\n        }\n    }\n\n    spirvbin_t::range_t spirvbin_t::constRange(spv::Op opCode) const\n    {\n        static const int maxCount = 1<<30;\n\n        switch (opCode) {\n        case spv::Op::OpTypeArray:         // fall through...\n        case spv::Op::OpTypeRuntimeArray:  return range_t(3, 4);\n        case spv::Op::OpConstantComposite: return range_t(3, maxCount);\n        default:                       return range_t(0, 0);\n        }\n    }\n\n    // Return the size of a type in 32-bit words.  This currently only\n    // handles ints and floats, and is only invoked by queries which must be\n    // integer types.  If ever needed, it can be generalized.\n    unsigned spirvbin_t::typeSizeInWords(spv::Id id) const\n    {\n        const unsigned typeStart = idPos(id);\n        const spv::Op  opCode    = asOpCode(typeStart);\n\n        if (errorLatch)\n            return 0;\n\n        switch (opCode) {\n        case spv::Op::OpTypeInt:   // fall through...\n        case spv::Op::OpTypeFloat: return (spv[typeStart + 2] + 31) / 32;\n        default:\n            return 0;\n        }\n    }\n\n    // Looks up the type of a given const or variable ID, and\n    // returns its size in 32-bit words.\n    unsigned spirvbin_t::idTypeSizeInWords(spv::Id id) const\n    {\n        const auto tid_it = idTypeSizeMap.find(id);\n        if (tid_it == idTypeSizeMap.end()) {\n            error(\"type size for ID not found\");\n            return 0;\n        }\n\n        return tid_it->second;\n    }\n\n    // Is this an opcode we should remove when using --strip?\n    bool spirvbin_t::isStripOp(spv::Op opCode, unsigned start) const\n    {\n        switch (opCode) {\n        case spv::Op::OpSource:\n        case spv::Op::OpSourceExtension:\n        case spv::Op::OpName:\n        case spv::Op::OpMemberName:\n        case spv::Op::OpLine:\n        {\n            const std::string name = literalString(start + 2);\n\n            std::vector<std::string>::const_iterator it;\n            for (it = stripWhiteList.begin(); it < stripWhiteList.end(); it++)\n            {\n                if (name.find(*it) != std::string::npos) {\n                    return false;\n                }\n            }\n\n            return true;\n        }\n        default :\n            return false;\n        }\n    }\n\n    // Return true if this opcode is flow control\n    bool spirvbin_t::isFlowCtrl(spv::Op opCode) const\n    {\n        switch (opCode) {\n        case spv::Op::OpBranchConditional:\n        case spv::Op::OpBranch:\n        case spv::Op::OpSwitch:\n        case spv::Op::OpLoopMerge:\n        case spv::Op::OpSelectionMerge:\n        case spv::Op::OpLabel:\n        case spv::Op::OpFunction:\n        case spv::Op::OpFunctionEnd: return true;\n        default:                     return false;\n        }\n    }\n\n    // Return true if this opcode defines a type\n    bool spirvbin_t::isTypeOp(spv::Op opCode) const\n    {\n        switch (opCode) {\n        case spv::Op::OpTypeVoid:\n        case spv::Op::OpTypeBool:\n        case spv::Op::OpTypeInt:\n        case spv::Op::OpTypeFloat:\n        case spv::Op::OpTypeVector:\n        case spv::Op::OpTypeMatrix:\n        case spv::Op::OpTypeImage:\n        case spv::Op::OpTypeSampler:\n        case spv::Op::OpTypeArray:\n        case spv::Op::OpTypeRuntimeArray:\n        case spv::Op::OpTypeStruct:\n        case spv::Op::OpTypeOpaque:\n        case spv::Op::OpTypePointer:\n        case spv::Op::OpTypeFunction:\n        case spv::Op::OpTypeEvent:\n        case spv::Op::OpTypeDeviceEvent:\n        case spv::Op::OpTypeReserveId:\n        case spv::Op::OpTypeQueue:\n        case spv::Op::OpTypeSampledImage:\n        case spv::Op::OpTypePipe:         return true;\n        default:                          return false;\n        }\n    }\n\n    // Return true if this opcode defines a constant\n    bool spirvbin_t::isConstOp(spv::Op opCode) const\n    {\n        switch (opCode) {\n        case spv::Op::OpConstantSampler:\n            error(\"unimplemented constant type\");\n            return true;\n\n        case spv::Op::OpConstantNull:\n        case spv::Op::OpConstantTrue:\n        case spv::Op::OpConstantFalse:\n        case spv::Op::OpConstantComposite:\n        case spv::Op::OpConstant:\n            return true;\n\n        default:\n            return false;\n        }\n    }\n\n    const auto inst_fn_nop = [](spv::Op, unsigned) { return false; };\n    const auto op_fn_nop   = [](spv::Id&)          { };\n\n    // g++ doesn't like these defined in the class proper in an anonymous namespace.\n    // Dunno why.  Also MSVC doesn't like the constexpr keyword.  Also dunno why.\n    // Defining them externally seems to please both compilers, so, here they are.\n    const spv::Id spirvbin_t::unmapped    = spv::Id(-10000);\n    const spv::Id spirvbin_t::unused      = spv::Id(-10001);\n    const int     spirvbin_t::header_size = 5;\n\n    spv::Id spirvbin_t::nextUnusedId(spv::Id id)\n    {\n        while (isNewIdMapped(id))  // search for an unused ID\n            ++id;\n\n        return id;\n    }\n\n    spv::Id spirvbin_t::localId(spv::Id id, spv::Id newId)\n    {\n        //assert(id != spv::NoResult && newId != spv::NoResult);\n\n        if (id > bound()) {\n            error(std::string(\"ID out of range: \") + std::to_string(id));\n            return spirvbin_t::unused;\n        }\n\n        if (id >= idMapL.size())\n            idMapL.resize(id+1, unused);\n\n        if (newId != unmapped && newId != unused) {\n            if (isOldIdUnused(id)) {\n                error(std::string(\"ID unused in module: \") + std::to_string(id));\n                return spirvbin_t::unused;\n            }\n\n            if (!isOldIdUnmapped(id)) {\n                error(std::string(\"ID already mapped: \") + std::to_string(id) + \" -> \"\n                        + std::to_string(localId(id)));\n\n                return spirvbin_t::unused;\n            }\n\n            if (isNewIdMapped(newId)) {\n                error(std::string(\"ID already used in module: \") + std::to_string(newId));\n                return spirvbin_t::unused;\n            }\n\n            msg(4, 4, std::string(\"map: \") + std::to_string(id) + \" -> \" + std::to_string(newId));\n            setMapped(newId);\n            largestNewId = std::max(largestNewId, newId);\n        }\n\n        return idMapL[id] = newId;\n    }\n\n    // Parse a literal string from the SPIR binary and return it as an std::string\n    // Due to C++11 RValue references, this doesn't copy the result string.\n    std::string spirvbin_t::literalString(unsigned word) const\n    {\n        std::string literal;\n        const spirword_t * pos = spv.data() + word;\n\n        literal.reserve(16);\n\n        do {\n            spirword_t word = *pos;\n            for (int i = 0; i < 4; i++) {\n                char c = word & 0xff;\n                if (c == '\\0')\n                    return literal;\n                literal += c;\n                word >>= 8;\n            }\n            pos++;\n        } while (true);\n    }\n\n    void spirvbin_t::applyMap()\n    {\n        msg(3, 2, std::string(\"Applying map: \"));\n\n        // Map local IDs through the ID map\n        process(inst_fn_nop, // ignore instructions\n            [this](spv::Id& id) {\n                id = localId(id);\n\n                if (errorLatch)\n                    return;\n\n                assert(id != unused && id != unmapped);\n            }\n        );\n    }\n\n    // Find free IDs for anything we haven't mapped\n    void spirvbin_t::mapRemainder()\n    {\n        msg(3, 2, std::string(\"Remapping remainder: \"));\n\n        spv::Id     unusedId  = 1;  // can't use 0: that's NoResult\n        spirword_t  maxBound  = 0;\n\n        for (spv::Id id = 0; id < idMapL.size(); ++id) {\n            if (isOldIdUnused(id))\n                continue;\n\n            // Find a new mapping for any used but unmapped IDs\n            if (isOldIdUnmapped(id)) {\n                localId(id, unusedId = nextUnusedId(unusedId));\n                if (errorLatch)\n                    return;\n            }\n\n            if (isOldIdUnmapped(id)) {\n                error(std::string(\"old ID not mapped: \") + std::to_string(id));\n                return;\n            }\n\n            // Track max bound\n            maxBound = std::max(maxBound, localId(id) + 1);\n\n            if (errorLatch)\n                return;\n        }\n\n        bound(maxBound); // reset header ID bound to as big as it now needs to be\n    }\n\n    // Mark debug instructions for stripping\n    void spirvbin_t::stripDebug()\n    {\n        // Strip instructions in the stripOp set: debug info.\n        process(\n            [&](spv::Op opCode, unsigned start) {\n                // remember opcodes we want to strip later\n                if (isStripOp(opCode, start))\n                    stripInst(start);\n                return true;\n            },\n            op_fn_nop);\n    }\n\n    // Mark instructions that refer to now-removed IDs for stripping\n    void spirvbin_t::stripDeadRefs()\n    {\n        process(\n            [&](spv::Op opCode, unsigned start) {\n                // strip opcodes pointing to removed data\n                switch (opCode) {\n                case spv::Op::OpName:\n                case spv::Op::OpMemberName:\n                case spv::Op::OpDecorate:\n                case spv::Op::OpMemberDecorate:\n                    if (idPosR.find(asId(start+1)) == idPosR.end())\n                        stripInst(start);\n                    break;\n                default:\n                    break; // leave it alone\n                }\n\n                return true;\n            },\n            op_fn_nop);\n\n        strip();\n    }\n\n    // Update local maps of ID, type, etc positions\n    void spirvbin_t::buildLocalMaps()\n    {\n        msg(2, 2, std::string(\"build local maps: \"));\n\n        mapped.clear();\n        idMapL.clear();\n//      preserve nameMap, so we don't clear that.\n        fnPos.clear();\n        fnCalls.clear();\n        typeConstPos.clear();\n        idPosR.clear();\n        entryPoint = spv::NoResult;\n        largestNewId = 0;\n\n        idMapL.resize(bound(), unused);\n\n        int         fnStart = 0;\n        spv::Id     fnRes   = spv::NoResult;\n\n        // build local Id and name maps\n        process(\n            [&](spv::Op opCode, unsigned start) {\n                unsigned word = start+1;\n                spv::Id  typeId = spv::NoResult;\n\n                if (spv::InstructionDesc[enumCast(opCode)].hasType())\n                    typeId = asId(word++);\n\n                // If there's a result ID, remember the size of its type\n                if (spv::InstructionDesc[enumCast(opCode)].hasResult()) {\n                    const spv::Id resultId = asId(word++);\n                    idPosR[resultId] = start;\n\n                    if (typeId != spv::NoResult) {\n                        const unsigned idTypeSize = typeSizeInWords(typeId);\n\n                        if (errorLatch)\n                            return false;\n\n                        if (idTypeSize != 0)\n                            idTypeSizeMap[resultId] = idTypeSize;\n                    }\n                }\n\n                if (opCode == spv::Op::OpName) {\n                    const spv::Id    target = asId(start+1);\n                    const std::string  name = literalString(start+2);\n                    nameMap[name] = target;\n\n                } else if (opCode == spv::Op::OpFunctionCall) {\n                    ++fnCalls[asId(start + 3)];\n                } else if (opCode == spv::Op::OpEntryPoint) {\n                    entryPoint = asId(start + 2);\n                } else if (opCode == spv::Op::OpFunction) {\n                    if (fnStart != 0) {\n                        error(\"nested function found\");\n                        return false;\n                    }\n\n                    fnStart = start;\n                    fnRes   = asId(start + 2);\n                } else if (opCode == spv::Op::OpFunctionEnd) {\n                    assert(fnRes != spv::NoResult);\n                    if (fnStart == 0) {\n                        error(\"function end without function start\");\n                        return false;\n                    }\n\n                    fnPos[fnRes] = range_t(fnStart, start + asWordCount(start));\n                    fnStart = 0;\n                } else if (isConstOp(opCode)) {\n                    if (errorLatch)\n                        return false;\n\n                    assert(asId(start + 2) != spv::NoResult);\n                    typeConstPos.insert(start);\n                } else if (isTypeOp(opCode)) {\n                    assert(asId(start + 1) != spv::NoResult);\n                    typeConstPos.insert(start);\n                }\n\n                return false;\n            },\n\n            [this](spv::Id& id) { localId(id, unmapped); }\n        );\n    }\n\n    // Validate the SPIR header\n    void spirvbin_t::validate() const\n    {\n        msg(2, 2, std::string(\"validating: \"));\n\n        if (spv.size() < header_size) {\n            error(\"file too short: \");\n            return;\n        }\n\n        if (magic() != spv::MagicNumber) {\n            error(\"bad magic number\");\n            return;\n        }\n\n        // field 1 = version\n        // field 2 = generator magic\n        // field 3 = result <id> bound\n\n        if (schemaNum() != 0) {\n            error(\"bad schema, must be 0\");\n            return;\n        }\n    }\n\n    int spirvbin_t::processInstruction(unsigned word, instfn_t instFn, idfn_t idFn)\n    {\n        const auto     instructionStart = word;\n        const unsigned wordCount = asWordCount(instructionStart);\n        const int      nextInst  = word++ + wordCount;\n        spv::Op  opCode    = asOpCode(instructionStart);\n\n        if (nextInst > int(spv.size())) {\n            error(\"spir instruction terminated too early\");\n            return -1;\n        }\n\n        // Base for computing number of operands; will be updated as more is learned\n        unsigned numOperands = wordCount - 1;\n\n        if (instFn(opCode, instructionStart))\n            return nextInst;\n\n        // Read type and result ID from instruction desc table\n        if (spv::InstructionDesc[enumCast(opCode)].hasType()) {\n            idFn(asId(word++));\n            --numOperands;\n        }\n\n        if (spv::InstructionDesc[enumCast(opCode)].hasResult()) {\n            idFn(asId(word++));\n            --numOperands;\n        }\n\n        // Extended instructions: currently, assume everything is an ID.\n        // TODO: add whatever data we need for exceptions to that\n        if (opCode == spv::Op::OpExtInst) {\n\n            idFn(asId(word)); // Instruction set is an ID that also needs to be mapped\n\n            word        += 2; // instruction set, and instruction from set\n            numOperands -= 2;\n\n            for (unsigned op=0; op < numOperands; ++op)\n                idFn(asId(word++)); // ID\n\n            return nextInst;\n        }\n\n        // Circular buffer so we can look back at previous unmapped values during the mapping pass.\n        static const unsigned idBufferSize = 4;\n        spv::Id idBuffer[idBufferSize];\n        unsigned idBufferPos = 0;\n\n        // Store IDs from instruction in our map\n        for (int op = 0; numOperands > 0; ++op, --numOperands) {\n            // SpecConstantOp is special: it includes the operands of another opcode which is\n            // given as a literal in the 3rd word.  We will switch over to pretending that the\n            // opcode being processed is the literal opcode value of the SpecConstantOp.  See the\n            // SPIRV spec for details.  This way we will handle IDs and literals as appropriate for\n            // the embedded op.\n            if (opCode == spv::Op::OpSpecConstantOp) {\n                if (op == 0) {\n                    opCode = asOpCode(word++);  // this is the opcode embedded in the SpecConstantOp.\n                    --numOperands;\n                }\n            }\n\n            switch (spv::InstructionDesc[enumCast(opCode)].operands.getClass(op)) {\n            case spv::OperandId:\n            case spv::OperandScope:\n            case spv::OperandMemorySemantics:\n                idBuffer[idBufferPos] = asId(word);\n                idBufferPos = (idBufferPos + 1) % idBufferSize;\n                idFn(asId(word++));\n                break;\n\n            case spv::OperandVariableIds:\n                for (unsigned i = 0; i < numOperands; ++i)\n                    idFn(asId(word++));\n                return nextInst;\n\n            case spv::OperandVariableLiterals:\n                // for clarity\n                // if (opCode == spv::OpDecorate && asDecoration(word - 1) == spv::DecorationBuiltIn) {\n                //     ++word;\n                //     --numOperands;\n                // }\n                // word += numOperands;\n                return nextInst;\n\n            case spv::OperandVariableLiteralId: {\n                if (opCode == Op::OpSwitch) {\n                    // word-2 is the position of the selector ID.  OpSwitch Literals match its type.\n                    // In case the IDs are currently being remapped, we get the word[-2] ID from\n                    // the circular idBuffer.\n                    const unsigned literalSizePos = (idBufferPos+idBufferSize-2) % idBufferSize;\n                    const unsigned literalSize = idTypeSizeInWords(idBuffer[literalSizePos]);\n                    const unsigned numLiteralIdPairs = (nextInst-word) / (1+literalSize);\n\n                    if (errorLatch)\n                        return -1;\n\n                    for (unsigned arg=0; arg<numLiteralIdPairs; ++arg) {\n                        word += literalSize;  // literal\n                        idFn(asId(word++));   // label\n                    }\n                } else {\n                    assert(0); // currentely, only OpSwitch uses OperandVariableLiteralId\n                }\n\n                return nextInst;\n            }\n\n            case spv::OperandLiteralString: {\n                const int stringWordCount = literalStringWords(literalString(word));\n                word += stringWordCount;\n                numOperands -= (stringWordCount-1); // -1 because for() header post-decrements\n                break;\n            }\n\n            case spv::OperandVariableLiteralStrings:\n                return nextInst;\n\n            // Execution mode might have extra literal operands.  Skip them.\n            case spv::OperandExecutionMode:\n                return nextInst;\n\n            case spv::OperandMemoryAccess:\n                {\n                    uint32_t mask = spv[word];\n                    if (mask & uint32_t(spv::MemoryAccessMask::Aligned)) {\n                        ++word;\n                        --numOperands;\n                    }\n                    if (mask & uint32_t(spv::MemoryAccessMask::MakePointerAvailable |\n                                        spv::MemoryAccessMask::MakePointerVisible)) {\n                        idFn(asId(word+1));\n                        ++word;\n                        --numOperands;\n                    }\n                    ++word;\n                }\n                break;\n\n            case spv::OperandTensorAddressingOperands:\n                {\n                    uint32_t mask = spv[word];\n                    if (mask & uint32_t(spv::TensorAddressingOperandsMask::TensorView)) {\n                        idFn(asId(word+1));\n                        ++word;\n                        --numOperands;\n                    }\n                    if (mask & uint32_t(spv::TensorAddressingOperandsMask::DecodeFunc)) {\n                        idFn(asId(word+1));\n                        ++word;\n                        --numOperands;\n                    }\n                    ++word;\n                }\n                break;\n\n            // Single word operands we simply ignore, as they hold no IDs\n            case spv::OperandLiteralNumber:\n            case spv::OperandOptionalLiteral:\n            case spv::OperandSource:\n            case spv::OperandExecutionModel:\n            case spv::OperandAddressing:\n            case spv::OperandMemory:\n            case spv::OperandStorage:\n            case spv::OperandDimensionality:\n            case spv::OperandSamplerAddressingMode:\n            case spv::OperandSamplerFilterMode:\n            case spv::OperandSamplerImageFormat:\n            case spv::OperandImageChannelOrder:\n            case spv::OperandImageChannelDataType:\n            case spv::OperandImageOperands:\n            case spv::OperandFPFastMath:\n            case spv::OperandFPRoundingMode:\n            case spv::OperandLinkageType:\n            case spv::OperandAccessQualifier:\n            case spv::OperandFuncParamAttr:\n            case spv::OperandDecoration:\n            case spv::OperandBuiltIn:\n            case spv::OperandSelect:\n            case spv::OperandLoop:\n            case spv::OperandFunction:\n            case spv::OperandGroupOperation:\n            case spv::OperandKernelEnqueueFlags:\n            case spv::OperandKernelProfilingInfo:\n            case spv::OperandCapability:\n            case spv::OperandCooperativeMatrixOperands:\n                ++word;\n                break;\n\n            default:\n                assert(0 && \"Unhandled Operand Class\");\n                break;\n            }\n        }\n\n        return nextInst;\n    }\n\n    // Make a pass over all the instructions and process them given appropriate functions\n    spirvbin_t& spirvbin_t::process(instfn_t instFn, idfn_t idFn, unsigned begin, unsigned end)\n    {\n        // For efficiency, reserve name map space.  It can grow if needed.\n        nameMap.reserve(32);\n\n        // If begin or end == 0, use defaults\n        begin = (begin == 0 ? header_size          : begin);\n        end   = (end   == 0 ? unsigned(spv.size()) : end);\n\n        // basic parsing and InstructionDesc table borrowed from SpvDisassemble.cpp...\n        unsigned nextInst = unsigned(spv.size());\n\n        for (unsigned word = begin; word < end; word = nextInst) {\n            nextInst = processInstruction(word, instFn, idFn);\n\n            if (errorLatch)\n                return *this;\n        }\n\n        return *this;\n    }\n\n    // Apply global name mapping to a single module\n    void spirvbin_t::mapNames()\n    {\n        static const std::uint32_t softTypeIdLimit = 3011;  // small prime.  TODO: get from options\n        static const std::uint32_t firstMappedID   = 3019;  // offset into ID space\n\n        for (const auto& name : nameMap) {\n            std::uint32_t hashval = 1911;\n            for (const char c : name.first)\n                hashval = hashval * 1009 + c;\n\n            if (isOldIdUnmapped(name.second)) {\n                localId(name.second, nextUnusedId(hashval % softTypeIdLimit + firstMappedID));\n                if (errorLatch)\n                    return;\n            }\n        }\n    }\n\n    // Map fn contents to IDs of similar functions in other modules\n    void spirvbin_t::mapFnBodies()\n    {\n        static const std::uint32_t softTypeIdLimit = 19071;  // small prime.  TODO: get from options\n        static const std::uint32_t firstMappedID   =  6203;  // offset into ID space\n\n        // Initial approach: go through some high priority opcodes first and assign them\n        // hash values.\n\n        spv::Id               fnId       = spv::NoResult;\n        std::vector<unsigned> instPos;\n        instPos.reserve(unsigned(spv.size()) / 16); // initial estimate; can grow if needed.\n\n        // Build local table of instruction start positions\n        process(\n            [&](spv::Op, unsigned start) { instPos.push_back(start); return true; },\n            op_fn_nop);\n\n        if (errorLatch)\n            return;\n\n        // Window size for context-sensitive canonicalization values\n        // Empirical best size from a single data set.  TODO: Would be a good tunable.\n        // We essentially perform a little convolution around each instruction,\n        // to capture the flavor of nearby code, to hopefully match to similar\n        // code in other modules.\n        static const unsigned windowSize = 2;\n\n        for (unsigned entry = 0; entry < unsigned(instPos.size()); ++entry) {\n            const unsigned start  = instPos[entry];\n            const spv::Op  opCode = asOpCode(start);\n\n            if (opCode == spv::Op::OpFunction)\n                fnId   = asId(start + 2);\n\n            if (opCode == spv::Op::OpFunctionEnd)\n                fnId = spv::NoResult;\n\n            if (fnId != spv::NoResult) { // if inside a function\n                if (spv::InstructionDesc[enumCast(opCode)].hasResult()) {\n                    const unsigned word    = start + (spv::InstructionDesc[enumCast(opCode)].hasType() ? 2 : 1);\n                    const spv::Id  resId   = asId(word);\n                    std::uint32_t  hashval = fnId * 17; // small prime\n\n                    for (unsigned i = entry-1; i >= entry-windowSize; --i) {\n                        if (asOpCode(instPos[i]) == spv::Op::OpFunction)\n                            break;\n                        hashval = hashval * 30103 + asOpCodeHash(instPos[i]); // 30103 = semiarbitrary prime\n                    }\n\n                    for (unsigned i = entry; i <= entry + windowSize; ++i) {\n                        if (asOpCode(instPos[i]) == spv::Op::OpFunctionEnd)\n                            break;\n                        hashval = hashval * 30103 + asOpCodeHash(instPos[i]); // 30103 = semiarbitrary prime\n                    }\n\n                    if (isOldIdUnmapped(resId)) {\n                        localId(resId, nextUnusedId(hashval % softTypeIdLimit + firstMappedID));\n                        if (errorLatch)\n                            return;\n                    }\n\n                }\n            }\n        }\n\n        spv::Op thisOpCode(spv::Op::OpNop);\n        std::unordered_map<int, int> opCounter;\n        int              idCounter(0);\n        fnId = spv::NoResult;\n\n        process(\n            [&](spv::Op opCode, unsigned start) {\n                switch (opCode) {\n                case spv::Op::OpFunction:\n                    // Reset counters at each function\n                    idCounter = 0;\n                    opCounter.clear();\n                    fnId = asId(start + 2);\n                    break;\n\n                case spv::Op::OpImageSampleImplicitLod:\n                case spv::Op::OpImageSampleExplicitLod:\n                case spv::Op::OpImageSampleDrefImplicitLod:\n                case spv::Op::OpImageSampleDrefExplicitLod:\n                case spv::Op::OpImageSampleProjImplicitLod:\n                case spv::Op::OpImageSampleProjExplicitLod:\n                case spv::Op::OpImageSampleProjDrefImplicitLod:\n                case spv::Op::OpImageSampleProjDrefExplicitLod:\n                case spv::Op::OpDot:\n                case spv::Op::OpCompositeExtract:\n                case spv::Op::OpCompositeInsert:\n                case spv::Op::OpVectorShuffle:\n                case spv::Op::OpLabel:\n                case spv::Op::OpVariable:\n\n                case spv::Op::OpAccessChain:\n                case spv::Op::OpLoad:\n                case spv::Op::OpStore:\n                case spv::Op::OpCompositeConstruct:\n                case spv::Op::OpFunctionCall:\n                    ++opCounter[enumCast(opCode)];\n                    idCounter = 0;\n                    thisOpCode = opCode;\n                    break;\n                default:\n                    thisOpCode = spv::Op::OpNop;\n                }\n\n                return false;\n            },\n\n            [&](spv::Id& id) {\n                if (thisOpCode != spv::Op::OpNop) {\n                    ++idCounter;\n                    const std::uint32_t hashval =\n                        // Explicitly cast operands to unsigned int to avoid integer\n                        // promotion to signed int followed by integer overflow,\n                        // which would result in undefined behavior.\n                        static_cast<unsigned int>(opCounter[enumCast(thisOpCode)])\n                        * enumCast(thisOpCode)\n                        * 50047\n                        + idCounter\n                        + static_cast<unsigned int>(fnId) * 117;\n\n                    if (isOldIdUnmapped(id))\n                        localId(id, nextUnusedId(hashval % softTypeIdLimit + firstMappedID));\n                }\n            });\n    }\n\n    // EXPERIMENTAL: forward IO and uniform load/stores into operands\n    // This produces invalid Schema-0 SPIRV\n    void spirvbin_t::forwardLoadStores()\n    {\n        idset_t fnLocalVars; // set of function local vars\n        idmap_t idMap;       // Map of load result IDs to what they load\n\n        // EXPERIMENTAL: Forward input and access chain loads into consumptions\n        process(\n            [&](spv::Op opCode, unsigned start) {\n                // Add inputs and uniforms to the map\n                if ((opCode == spv::Op::OpVariable && asWordCount(start) == 4) &&\n                    (spv[start+3] == (unsigned)spv::StorageClass::Uniform ||\n                    spv[start+3] == (unsigned)spv::StorageClass::UniformConstant ||\n                    spv[start+3] == (unsigned)spv::StorageClass::Input))\n                    fnLocalVars.insert(asId(start+2));\n\n                if (opCode == spv::Op::OpAccessChain && fnLocalVars.count(asId(start+3)) > 0)\n                    fnLocalVars.insert(asId(start+2));\n\n                if (opCode == spv::Op::OpLoad && fnLocalVars.count(asId(start+3)) > 0) {\n                    idMap[asId(start+2)] = asId(start+3);\n                    stripInst(start);\n                }\n\n                return false;\n            },\n\n            [&](spv::Id& id) { if (idMap.find(id) != idMap.end()) id = idMap[id]; }\n        );\n\n        if (errorLatch)\n            return;\n\n        // EXPERIMENTAL: Implicit output stores\n        fnLocalVars.clear();\n        idMap.clear();\n\n        process(\n            [&](spv::Op opCode, unsigned start) {\n                // Add inputs and uniforms to the map\n                if ((opCode == spv::Op::OpVariable && asWordCount(start) == 4) &&\n                    (spv[start+3] == (int)spv::StorageClass::Output))\n                    fnLocalVars.insert(asId(start+2));\n\n                if (opCode == spv::Op::OpStore && fnLocalVars.count(asId(start+1)) > 0) {\n                    idMap[asId(start+2)] = asId(start+1);\n                    stripInst(start);\n                }\n\n                return false;\n            },\n            op_fn_nop);\n\n        if (errorLatch)\n            return;\n\n        process(\n            inst_fn_nop,\n            [&](spv::Id& id) { if (idMap.find(id) != idMap.end()) id = idMap[id]; }\n        );\n\n        if (errorLatch)\n            return;\n\n        strip();          // strip out data we decided to eliminate\n    }\n\n    // optimize loads and stores\n    void spirvbin_t::optLoadStore()\n    {\n        idset_t    fnLocalVars;  // candidates for removal (only locals)\n        idmap_t    idMap;        // Map of load result IDs to what they load\n        blockmap_t blockMap;     // Map of IDs to blocks they first appear in\n        int        blockNum = 0; // block count, to avoid crossing flow control\n\n        // Find all the function local pointers stored at most once, and not via access chains\n        process(\n            [&](spv::Op opCode, unsigned start) {\n                const int wordCount = asWordCount(start);\n\n                // Count blocks, so we can avoid crossing flow control\n                if (isFlowCtrl(opCode))\n                    ++blockNum;\n\n                // Add local variables to the map\n                if ((opCode == spv::Op::OpVariable && spv[start+3] == (unsigned)spv::StorageClass::Function && asWordCount(start) == 4)) {\n                    fnLocalVars.insert(asId(start+2));\n                    return true;\n                }\n\n                // Ignore process vars referenced via access chain\n                if ((opCode == spv::Op::OpAccessChain || opCode == spv::Op::OpInBoundsAccessChain) && fnLocalVars.count(asId(start+3)) > 0) {\n                    fnLocalVars.erase(asId(start+3));\n                    idMap.erase(asId(start+3));\n                    return true;\n                }\n\n                if (opCode == spv::Op::OpLoad && fnLocalVars.count(asId(start + 3)) > 0) {\n                    const spv::Id varId = asId(start+3);\n\n                    // Avoid loads before stores\n                    if (idMap.find(varId) == idMap.end()) {\n                        fnLocalVars.erase(varId);\n                        idMap.erase(varId);\n                    }\n\n                    // don't do for volatile references\n                    if (wordCount > 4 && (spv[start+4] & spv::MemoryAccessMask::Volatile)) {\n                        fnLocalVars.erase(varId);\n                        idMap.erase(varId);\n                    }\n\n                    // Handle flow control\n                    if (blockMap.find(varId) == blockMap.end()) {\n                        blockMap[varId] = blockNum;  // track block we found it in.\n                    } else if (blockMap[varId] != blockNum) {\n                        fnLocalVars.erase(varId);  // Ignore if crosses flow control\n                        idMap.erase(varId);\n                    }\n\n                    return true;\n                }\n\n                if (opCode == spv::Op::OpStore && fnLocalVars.count(asId(start+1)) > 0) {\n                    const spv::Id varId = asId(start+1);\n\n                    if (idMap.find(varId) == idMap.end()) {\n                        idMap[varId] = asId(start+2);\n                    } else {\n                        // Remove if it has more than one store to the same pointer\n                        fnLocalVars.erase(varId);\n                        idMap.erase(varId);\n                    }\n\n                    // don't do for volatile references\n                    if (wordCount > 3 && (spv[start+3] & spv::MemoryAccessMask::Volatile)) {\n                        fnLocalVars.erase(asId(start+3));\n                        idMap.erase(asId(start+3));\n                    }\n\n                    // Handle flow control\n                    if (blockMap.find(varId) == blockMap.end()) {\n                        blockMap[varId] = blockNum;  // track block we found it in.\n                    } else if (blockMap[varId] != blockNum) {\n                        fnLocalVars.erase(varId);  // Ignore if crosses flow control\n                        idMap.erase(varId);\n                    }\n\n                    return true;\n                }\n\n                return false;\n            },\n\n            // If local var id used anywhere else, don't eliminate\n            [&](spv::Id& id) {\n                if (fnLocalVars.count(id) > 0) {\n                    fnLocalVars.erase(id);\n                    idMap.erase(id);\n                }\n            }\n        );\n\n        if (errorLatch)\n            return;\n\n        process(\n            [&](spv::Op opCode, unsigned start) {\n                if (opCode == spv::Op::OpLoad && fnLocalVars.count(asId(start+3)) > 0)\n                    idMap[asId(start+2)] = idMap[asId(start+3)];\n                return false;\n            },\n            op_fn_nop);\n\n        if (errorLatch)\n            return;\n\n        // Chase replacements to their origins, in case there is a chain such as:\n        //   2 = store 1\n        //   3 = load 2\n        //   4 = store 3\n        //   5 = load 4\n        // We want to replace uses of 5 with 1.\n        for (const auto& idPair : idMap) {\n            spv::Id id = idPair.first;\n            while (idMap.find(id) != idMap.end())  // Chase to end of chain\n                id = idMap[id];\n\n            idMap[idPair.first] = id;              // replace with final result\n        }\n\n        // Remove the load/store/variables for the ones we've discovered\n        process(\n            [&](spv::Op opCode, unsigned start) {\n                if ((opCode == spv::Op::OpLoad && fnLocalVars.count(asId(start+3)) > 0) ||\n                    (opCode == spv::Op::OpStore && fnLocalVars.count(asId(start+1)) > 0) ||\n                    (opCode == spv::Op::OpVariable && fnLocalVars.count(asId(start+2)) > 0)) {\n\n                    stripInst(start);\n                    return true;\n                }\n\n                return false;\n            },\n\n            [&](spv::Id& id) {\n                if (idMap.find(id) != idMap.end()) id = idMap[id];\n            }\n        );\n\n        if (errorLatch)\n            return;\n\n        strip();          // strip out data we decided to eliminate\n    }\n\n    // remove bodies of uncalled functions\n    void spirvbin_t::dceFuncs()\n    {\n        msg(3, 2, std::string(\"Removing Dead Functions: \"));\n\n        // TODO: There are more efficient ways to do this.\n        bool changed = true;\n\n        while (changed) {\n            changed = false;\n\n            for (auto fn = fnPos.begin(); fn != fnPos.end(); ) {\n                if (fn->first == entryPoint) { // don't DCE away the entry point!\n                    ++fn;\n                    continue;\n                }\n\n                const auto call_it = fnCalls.find(fn->first);\n\n                if (call_it == fnCalls.end() || call_it->second == 0) {\n                    changed = true;\n                    stripRange.push_back(fn->second);\n\n                    // decrease counts of called functions\n                    process(\n                        [&](spv::Op opCode, unsigned start) {\n                            if (opCode == spv::Op::OpFunctionCall) {\n                                const auto call_it = fnCalls.find(asId(start + 3));\n                                if (call_it != fnCalls.end()) {\n                                    if (--call_it->second <= 0)\n                                        fnCalls.erase(call_it);\n                                }\n                            }\n\n                            return true;\n                        },\n                        op_fn_nop,\n                        fn->second.first,\n                        fn->second.second);\n\n                    if (errorLatch)\n                        return;\n\n                    fn = fnPos.erase(fn);\n                } else ++fn;\n            }\n        }\n    }\n\n    // remove unused function variables + decorations\n    void spirvbin_t::dceVars()\n    {\n        msg(3, 2, std::string(\"DCE Vars: \"));\n\n        std::unordered_map<spv::Id, int> varUseCount;\n\n        // Count function variable use\n        process(\n            [&](spv::Op opCode, unsigned start) {\n                if (opCode == spv::Op::OpVariable) {\n                    ++varUseCount[asId(start+2)];\n                    return true;\n                } else if (opCode == spv::Op::OpEntryPoint) {\n                    const int wordCount = asWordCount(start);\n                    for (int i = 4; i < wordCount; i++) {\n                        ++varUseCount[asId(start+i)];\n                    }\n                    return true;\n                } else\n                    return false;\n            },\n\n            [&](spv::Id& id) { if (varUseCount[id]) ++varUseCount[id]; }\n        );\n\n        if (errorLatch)\n            return;\n\n        // Remove single-use function variables + associated decorations and names\n        process(\n            [&](spv::Op opCode, unsigned start) {\n                spv::Id id = spv::NoResult;\n                if (opCode == spv::Op::OpVariable)\n                    id = asId(start+2);\n                if (opCode == spv::Op::OpDecorate || opCode == spv::Op::OpName)\n                    id = asId(start+1);\n\n                if (id != spv::NoResult && varUseCount[id] == 1)\n                    stripInst(start);\n\n                return true;\n            },\n            op_fn_nop);\n    }\n\n    // remove unused types\n    void spirvbin_t::dceTypes()\n    {\n        std::vector<bool> isType(bound(), false);\n\n        // for speed, make O(1) way to get to type query (map is log(n))\n        for (const auto typeStart : typeConstPos)\n            isType[asTypeConstId(typeStart)] = true;\n\n        std::unordered_map<spv::Id, int> typeUseCount;\n\n        // This is not the most efficient algorithm, but this is an offline tool, and\n        // it's easy to write this way.  Can be improved opportunistically if needed.\n        bool changed = true;\n        while (changed) {\n            changed = false;\n            strip();\n            typeUseCount.clear();\n\n            // Count total type usage\n            process(inst_fn_nop,\n                    [&](spv::Id& id) { if (isType[id]) ++typeUseCount[id]; }\n                    );\n\n            if (errorLatch)\n                return;\n\n            // Remove single reference types\n            for (const auto typeStart : typeConstPos) {\n                const spv::Id typeId = asTypeConstId(typeStart);\n                if (typeUseCount[typeId] == 1) {\n                    changed = true;\n                    --typeUseCount[typeId];\n                    stripInst(typeStart);\n                }\n            }\n\n            if (errorLatch)\n                return;\n        }\n    }\n\n#ifdef NOTDEF\n    bool spirvbin_t::matchType(const spirvbin_t::globaltypes_t& globalTypes, spv::Id lt, spv::Id gt) const\n    {\n        // Find the local type id \"lt\" and global type id \"gt\"\n        const auto lt_it = typeConstPosR.find(lt);\n        if (lt_it == typeConstPosR.end())\n            return false;\n\n        const auto typeStart = lt_it->second;\n\n        // Search for entry in global table\n        const auto gtype = globalTypes.find(gt);\n        if (gtype == globalTypes.end())\n            return false;\n\n        const auto& gdata = gtype->second;\n\n        // local wordcount and opcode\n        const int     wordCount   = asWordCount(typeStart);\n        const spv::Op opCode      = asOpCode(typeStart);\n\n        // no type match if opcodes don't match, or operand count doesn't match\n        if (opCode != opOpCode(gdata[0]) || wordCount != opWordCount(gdata[0]))\n            return false;\n\n        const unsigned numOperands = wordCount - 2; // all types have a result\n\n        const auto cmpIdRange = [&](range_t range) {\n            for (int x=range.first; x<std::min(range.second, wordCount); ++x)\n                if (!matchType(globalTypes, asId(typeStart+x), gdata[x]))\n                    return false;\n            return true;\n        };\n\n        const auto cmpConst   = [&]() { return cmpIdRange(constRange(opCode)); };\n        const auto cmpSubType = [&]() { return cmpIdRange(typeRange(opCode));  };\n\n        // Compare literals in range [start,end)\n        const auto cmpLiteral = [&]() {\n            const auto range = literalRange(opCode);\n            return std::equal(spir.begin() + typeStart + range.first,\n                spir.begin() + typeStart + std::min(range.second, wordCount),\n                gdata.begin() + range.first);\n        };\n\n        assert(isTypeOp(opCode) || isConstOp(opCode));\n\n        switch (opCode) {\n        case spv::OpTypeOpaque:       // TODO: disable until we compare the literal strings.\n        case spv::OpTypeQueue:        return false;\n        case spv::OpTypeEvent:        // fall through...\n        case spv::OpTypeDeviceEvent:  // ...\n        case spv::OpTypeReserveId:    return false;\n            // for samplers, we don't handle the optional parameters yet\n        case spv::OpTypeSampler:      return cmpLiteral() && cmpConst() && cmpSubType() && wordCount == 8;\n        default:                      return cmpLiteral() && cmpConst() && cmpSubType();\n        }\n    }\n\n    // Look for an equivalent type in the globalTypes map\n    spv::Id spirvbin_t::findType(const spirvbin_t::globaltypes_t& globalTypes, spv::Id lt) const\n    {\n        // Try a recursive type match on each in turn, and return a match if we find one\n        for (const auto& gt : globalTypes)\n            if (matchType(globalTypes, lt, gt.first))\n                return gt.first;\n\n        return spv::NoType;\n    }\n#endif // NOTDEF\n\n    // Return start position in SPV of given Id.  error if not found.\n    unsigned spirvbin_t::idPos(spv::Id id) const\n    {\n        const auto tid_it = idPosR.find(id);\n        if (tid_it == idPosR.end()) {\n            error(\"ID not found\");\n            return 0;\n        }\n\n        return tid_it->second;\n    }\n\n    // Hash types to canonical values.  This can return ID collisions (it's a bit\n    // inevitable): it's up to the caller to handle that gracefully.\n    std::uint32_t spirvbin_t::hashType(unsigned typeStart) const\n    {\n        const unsigned wordCount   = asWordCount(typeStart);\n        const spv::Op  opCode      = asOpCode(typeStart);\n\n        switch (opCode) {\n        case spv::Op::OpTypeVoid:         return 0;\n        case spv::Op::OpTypeBool:         return 1;\n        case spv::Op::OpTypeInt:          return 3 + (spv[typeStart+3]);\n        case spv::Op::OpTypeFloat:        return 5;\n        case spv::Op::OpTypeVector:\n            return 6 + hashType(idPos(spv[typeStart+2])) * (spv[typeStart+3] - 1);\n        case spv::Op::OpTypeMatrix:\n            return 30 + hashType(idPos(spv[typeStart+2])) * (spv[typeStart+3] - 1);\n        case spv::Op::OpTypeImage:\n            return 120 + hashType(idPos(spv[typeStart+2])) +\n                spv[typeStart+3] +            // dimensionality\n                spv[typeStart+4] * 8 * 16 +   // depth\n                spv[typeStart+5] * 4 * 16 +   // arrayed\n                spv[typeStart+6] * 2 * 16 +   // multisampled\n                spv[typeStart+7] * 1 * 16;    // format\n        case spv::Op::OpTypeSampler:\n            return 500;\n        case spv::Op::OpTypeSampledImage:\n            return 502;\n        case spv::Op::OpTypeArray:\n            return 501 + hashType(idPos(spv[typeStart+2])) * spv[typeStart+3];\n        case spv::Op::OpTypeRuntimeArray:\n            return 5000  + hashType(idPos(spv[typeStart+2]));\n        case spv::Op::OpTypeStruct:\n            {\n                std::uint32_t hash = 10000;\n                for (unsigned w=2; w < wordCount; ++w)\n                    hash += w * hashType(idPos(spv[typeStart+w]));\n                return hash;\n            }\n\n        case spv::Op::OpTypeOpaque:         return 6000 + spv[typeStart+2];\n        case spv::Op::OpTypePointer:        return 100000  + hashType(idPos(spv[typeStart+3]));\n        case spv::Op::OpTypeFunction:\n            {\n                std::uint32_t hash = 200000;\n                for (unsigned w=2; w < wordCount; ++w)\n                    hash += w * hashType(idPos(spv[typeStart+w]));\n                return hash;\n            }\n\n        case spv::Op::OpTypeEvent:                      return 300000;\n        case spv::Op::OpTypeDeviceEvent:                return 300001;\n        case spv::Op::OpTypeReserveId:                  return 300002;\n        case spv::Op::OpTypeQueue:                      return 300003;\n        case spv::Op::OpTypePipe:                       return 300004;\n        case spv::Op::OpConstantTrue:                   return 300007;\n        case spv::Op::OpConstantFalse:                  return 300008;\n        case spv::Op::OpTypeRayQueryKHR:                return 300009;\n        case spv::Op::OpTypeAccelerationStructureKHR:   return 300010;\n        case spv::Op::OpConstantComposite:\n            {\n                std::uint32_t hash = 300011 + hashType(idPos(spv[typeStart+1]));\n                for (unsigned w=3; w < wordCount; ++w)\n                    hash += w * hashType(idPos(spv[typeStart+w]));\n                return hash;\n            }\n        case spv::Op::OpConstant:\n            {\n                std::uint32_t hash = 400011 + hashType(idPos(spv[typeStart+1]));\n                for (unsigned w=3; w < wordCount; ++w)\n                    hash += w * spv[typeStart+w];\n                return hash;\n            }\n        case spv::Op::OpConstantNull:\n            {\n                std::uint32_t hash = 500009 + hashType(idPos(spv[typeStart+1]));\n                return hash;\n            }\n        case spv::Op::OpConstantSampler:\n            {\n                std::uint32_t hash = 600011 + hashType(idPos(spv[typeStart+1]));\n                for (unsigned w=3; w < wordCount; ++w)\n                    hash += w * spv[typeStart+w];\n                return hash;\n            }\n\n        default:\n            error(\"unknown type opcode\");\n            return 0;\n        }\n    }\n\n    void spirvbin_t::mapTypeConst()\n    {\n        globaltypes_t globalTypeMap;\n\n        msg(3, 2, std::string(\"Remapping Consts & Types: \"));\n\n        static const std::uint32_t softTypeIdLimit = 3011; // small prime.  TODO: get from options\n        static const std::uint32_t firstMappedID   = 8;    // offset into ID space\n\n        for (auto& typeStart : typeConstPos) {\n            const spv::Id       resId     = asTypeConstId(typeStart);\n            const std::uint32_t hashval   = hashType(typeStart);\n\n            if (errorLatch)\n                return;\n\n            if (isOldIdUnmapped(resId)) {\n                localId(resId, nextUnusedId(hashval % softTypeIdLimit + firstMappedID));\n                if (errorLatch)\n                    return;\n            }\n        }\n    }\n\n    // Strip a single binary by removing ranges given in stripRange\n    void spirvbin_t::strip()\n    {\n        if (stripRange.empty()) // nothing to do\n            return;\n\n        // Sort strip ranges in order of traversal\n        std::sort(stripRange.begin(), stripRange.end());\n\n        // Allocate a new binary big enough to hold old binary\n        // We'll step this iterator through the strip ranges as we go through the binary\n        auto strip_it = stripRange.begin();\n\n        int strippedPos = 0;\n        for (unsigned word = 0; word < unsigned(spv.size()); ++word) {\n            while (strip_it != stripRange.end() && word >= strip_it->second)\n                ++strip_it;\n\n            if (strip_it == stripRange.end() || word < strip_it->first || word >= strip_it->second)\n                spv[strippedPos++] = spv[word];\n        }\n\n        spv.resize(strippedPos);\n        stripRange.clear();\n\n        buildLocalMaps();\n    }\n\n    // Strip a single binary by removing ranges given in stripRange\n    void spirvbin_t::remap(std::uint32_t opts)\n    {\n        options = opts;\n\n        // Set up opcode tables from SpvDoc\n        spv::Parameterize();\n\n        validate();       // validate header\n        buildLocalMaps(); // build ID maps\n\n        msg(3, 4, std::string(\"ID bound: \") + std::to_string(bound()));\n\n        if (options & STRIP)         stripDebug();\n        if (errorLatch) return;\n\n        strip();        // strip out data we decided to eliminate\n        if (errorLatch) return;\n\n        if (options & OPT_LOADSTORE) optLoadStore();\n        if (errorLatch) return;\n\n        if (options & OPT_FWD_LS)    forwardLoadStores();\n        if (errorLatch) return;\n\n        if (options & DCE_FUNCS)     dceFuncs();\n        if (errorLatch) return;\n\n        if (options & DCE_VARS)      dceVars();\n        if (errorLatch) return;\n\n        if (options & DCE_TYPES)     dceTypes();\n        if (errorLatch) return;\n\n        strip();         // strip out data we decided to eliminate\n        if (errorLatch) return;\n\n        stripDeadRefs(); // remove references to things we DCEed\n        if (errorLatch) return;\n\n        // after the last strip, we must clean any debug info referring to now-deleted data\n\n        if (options & MAP_TYPES)     mapTypeConst();\n        if (errorLatch) return;\n\n        if (options & MAP_NAMES)     mapNames();\n        if (errorLatch) return;\n\n        if (options & MAP_FUNCS)     mapFnBodies();\n        if (errorLatch) return;\n\n        if (options & MAP_ALL) {\n            mapRemainder(); // map any unmapped IDs\n            if (errorLatch) return;\n\n            applyMap();     // Now remap each shader to the new IDs we've come up with\n            if (errorLatch) return;\n        }\n    }\n\n    // remap from a memory image\n    void spirvbin_t::remap(std::vector<std::uint32_t>& in_spv, const std::vector<std::string>& whiteListStrings,\n                           std::uint32_t opts)\n    {\n        stripWhiteList = whiteListStrings;\n        spv.swap(in_spv);\n        remap(opts);\n        spv.swap(in_spv);\n    }\n\n    // remap from a memory image - legacy interface without white list\n    void spirvbin_t::remap(std::vector<std::uint32_t>& in_spv, std::uint32_t opts)\n    {\n      stripWhiteList.clear();\n      spv.swap(in_spv);\n      remap(opts);\n      spv.swap(in_spv);\n    }\n\n} // namespace SPV\n\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/SPVRemapper.h",
    "content": "//\n// Copyright (C) 2015 LunarG, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#ifndef SPIRVREMAPPER_H\n#define SPIRVREMAPPER_H\n\n#include <string>\n#include <vector>\n#include <cstdlib>\n#include <exception>\n\n#ifdef GLSLANG_IS_SHARED_LIBRARY\n    #ifdef _WIN32\n        #ifdef GLSLANG_EXPORTING\n            #define GLSLANG_EXPORT __declspec(dllexport)\n        #else\n            #define GLSLANG_EXPORT __declspec(dllimport)\n        #endif\n    #elif __GNUC__ >= 4\n        #define GLSLANG_EXPORT __attribute__((visibility(\"default\")))\n    #endif\n#endif // GLSLANG_IS_SHARED_LIBRARY\n#ifndef GLSLANG_EXPORT\n#define GLSLANG_EXPORT\n#endif\n\nnamespace spv {\n\nclass spirvbin_base_t\n{\npublic:\n   enum Options {\n      NONE          = 0,\n      STRIP         = (1<<0),\n      MAP_TYPES     = (1<<1),\n      MAP_NAMES     = (1<<2),\n      MAP_FUNCS     = (1<<3),\n      DCE_FUNCS     = (1<<4),\n      DCE_VARS      = (1<<5),\n      DCE_TYPES     = (1<<6),\n      OPT_LOADSTORE = (1<<7),\n      OPT_FWD_LS    = (1<<8), // EXPERIMENTAL: PRODUCES INVALID SCHEMA-0 SPIRV\n      MAP_ALL       = (MAP_TYPES | MAP_NAMES | MAP_FUNCS),\n      DCE_ALL       = (DCE_FUNCS | DCE_VARS | DCE_TYPES),\n      OPT_ALL       = (OPT_LOADSTORE),\n\n      ALL_BUT_STRIP = (MAP_ALL | DCE_ALL | OPT_ALL),\n      DO_EVERYTHING = (STRIP | ALL_BUT_STRIP)\n   };\n};\n\n} // namespace SPV\n\n#include <functional>\n#include <cstdint>\n#include <unordered_map>\n#include <unordered_set>\n#include <map>\n#include <set>\n#include <cassert>\n\n#include \"spirv.hpp11\"\n\nnamespace spv {\n\nstatic inline constexpr Id NoResult = 0;\n\n// class to hold SPIR-V binary data for remapping, DCE, and debug stripping\nclass GLSLANG_EXPORT spirvbin_t : public spirvbin_base_t\n{\npublic:\n   spirvbin_t(int verbose = 0) : entryPoint(spv::NoResult), largestNewId(0), verbose(verbose), errorLatch(false)\n   { }\n\n   virtual ~spirvbin_t() { }\n\n   // remap on an existing binary in memory\n   void remap(std::vector<std::uint32_t>& spv, const std::vector<std::string>& whiteListStrings,\n              std::uint32_t opts = DO_EVERYTHING);\n\n   // remap on an existing binary in memory - legacy interface without white list\n   void remap(std::vector<std::uint32_t>& spv, std::uint32_t opts = DO_EVERYTHING);\n\n   // Type for error/log handler functions\n   typedef std::function<void(const std::string&)> errorfn_t;\n   typedef std::function<void(const std::string&)> logfn_t;\n\n   // Register error/log handling functions (can be lambda fn / functor / etc)\n   static void registerErrorHandler(errorfn_t handler) { errorHandler = handler; }\n   static void registerLogHandler(logfn_t handler)     { logHandler   = handler; }\n\nprotected:\n   // This can be overridden to provide other message behavior if needed\n   virtual void msg(int minVerbosity, int indent, const std::string& txt) const;\n\nprivate:\n   // Local to global, or global to local ID map\n   typedef std::unordered_map<spv::Id, spv::Id> idmap_t;\n   typedef std::unordered_set<spv::Id>          idset_t;\n   typedef std::unordered_map<spv::Id, int>     blockmap_t;\n\n   void remap(std::uint32_t opts = DO_EVERYTHING);\n\n   // Map of names to IDs\n   typedef std::unordered_map<std::string, spv::Id> namemap_t;\n\n   typedef std::uint32_t spirword_t;\n\n   typedef std::pair<unsigned, unsigned> range_t;\n   typedef std::function<void(spv::Id&)>                idfn_t;\n   typedef std::function<bool(spv::Op, unsigned start)> instfn_t;\n\n   // Special Values for ID map:\n   static const spv::Id unmapped;     // unchanged from default value\n   static const spv::Id unused;       // unused ID\n   static const int     header_size;  // SPIR header = 5 words\n\n   class id_iterator_t;\n\n   // For mapping type entries between different shaders\n   typedef std::vector<spirword_t>        typeentry_t;\n   typedef std::map<spv::Id, typeentry_t> globaltypes_t;\n\n   // A set that preserves position order, and a reverse map\n   typedef std::set<int>                    posmap_t;\n   typedef std::unordered_map<spv::Id, int> posmap_rev_t;\n\n   // Maps and ID to the size of its base type, if known.\n   typedef std::unordered_map<spv::Id, unsigned> typesize_map_t;\n\n   // handle error\n   void error(const std::string& txt) const { errorLatch = true; errorHandler(txt); }\n\n   bool     isConstOp(spv::Op opCode)      const;\n   bool     isTypeOp(spv::Op opCode)       const;\n   bool     isStripOp(spv::Op opCode)      const;\n   bool     isFlowCtrl(spv::Op opCode)     const;\n   range_t  literalRange(spv::Op opCode)   const;\n   range_t  typeRange(spv::Op opCode)      const;\n   range_t  constRange(spv::Op opCode)     const;\n   unsigned typeSizeInWords(spv::Id id)    const;\n   unsigned idTypeSizeInWords(spv::Id id)  const;\n\n   bool isStripOp(spv::Op opCode, unsigned start) const;\n\n   spv::Id&        asId(unsigned word)                { return spv[word]; }\n   const spv::Id&  asId(unsigned word)          const { return spv[word]; }\n   spv::Op         asOpCode(unsigned word)      const { return opOpCode(spv[word]); }\n   std::uint32_t   asOpCodeHash(unsigned word);\n   spv::Decoration asDecoration(unsigned word)  const { return spv::Decoration(spv[word]); }\n   unsigned        asWordCount(unsigned word)   const { return opWordCount(spv[word]); }\n   spv::Id         asTypeConstId(unsigned word) const { return asId(word + (isTypeOp(asOpCode(word)) ? 1 : 2)); }\n   unsigned        idPos(spv::Id id)            const;\n\n   static unsigned opWordCount(spirword_t data) { return data >> spv::WordCountShift; }\n   static spv::Op  opOpCode(spirword_t data)    { return spv::Op(data & spv::OpCodeMask); }\n\n   // Header access & set methods\n   spirword_t  magic()    const       { return spv[0]; } // return magic number\n   spirword_t  bound()    const       { return spv[3]; } // return Id bound from header\n   spirword_t  bound(spirword_t b)    { return spv[3] = b; }\n   spirword_t  genmagic() const       { return spv[2]; } // generator magic\n   spirword_t  genmagic(spirword_t m) { return spv[2] = m; }\n   spirword_t  schemaNum() const      { return spv[4]; } // schema number from header\n\n   // Mapping fns: get\n   spv::Id     localId(spv::Id id) const { return idMapL[id]; }\n\n   // Mapping fns: set\n   inline spv::Id   localId(spv::Id id, spv::Id newId);\n   void             countIds(spv::Id id);\n\n   // Return next unused new local ID.\n   // NOTE: boost::dynamic_bitset would be more efficient due to find_next(),\n   // which std::vector<bool> doens't have.\n   inline spv::Id   nextUnusedId(spv::Id id);\n\n   void buildLocalMaps();\n   std::string literalString(unsigned word) const; // Return literal as a std::string\n   int literalStringWords(const std::string& str) const { return (int(str.size())+4)/4; }\n\n   bool isNewIdMapped(spv::Id newId)   const { return isMapped(newId);            }\n   bool isOldIdUnmapped(spv::Id oldId) const { return localId(oldId) == unmapped; }\n   bool isOldIdUnused(spv::Id oldId)   const { return localId(oldId) == unused;   }\n   bool isOldIdMapped(spv::Id oldId)   const { return !isOldIdUnused(oldId) && !isOldIdUnmapped(oldId); }\n   bool isFunction(spv::Id oldId)      const { return fnPos.find(oldId) != fnPos.end(); }\n\n   // bool    matchType(const globaltypes_t& globalTypes, spv::Id lt, spv::Id gt) const;\n   // spv::Id findType(const globaltypes_t& globalTypes, spv::Id lt) const;\n   std::uint32_t hashType(unsigned typeStart) const;\n\n   spirvbin_t& process(instfn_t, idfn_t, unsigned begin = 0, unsigned end = 0);\n   int         processInstruction(unsigned word, instfn_t, idfn_t);\n\n   void        validate() const;\n   void        mapTypeConst();\n   void        mapFnBodies();\n   void        optLoadStore();\n   void        dceFuncs();\n   void        dceVars();\n   void        dceTypes();\n   void        mapNames();\n   void        foldIds();  // fold IDs to smallest space\n   void        forwardLoadStores(); // load store forwarding (EXPERIMENTAL)\n   void        offsetIds(); // create relative offset IDs\n\n   void        applyMap();            // remap per local name map\n   void        mapRemainder();        // map any IDs we haven't touched yet\n   void        stripDebug();          // strip all debug info\n   void        stripDeadRefs();       // strips debug info for now-dead references after DCE\n   void        strip();               // remove debug symbols\n\n   std::vector<spirword_t> spv;      // SPIR words\n\n   std::vector<std::string> stripWhiteList;\n\n   namemap_t               nameMap;  // ID names from OpName\n\n   // Since we want to also do binary ops, we can't use std::vector<bool>.  we could use\n   // boost::dynamic_bitset, but we're trying to avoid a boost dependency.\n   typedef std::uint64_t bits_t;\n   std::vector<bits_t> mapped; // which new IDs have been mapped\n   static const int mBits = sizeof(bits_t) * 4;\n\n   bool isMapped(spv::Id id) const  { return id < maxMappedId() && ((mapped[id/mBits] & (1LL<<(id%mBits))) != 0); }\n   void setMapped(spv::Id id) { resizeMapped(id); mapped[id/mBits] |= (1LL<<(id%mBits)); }\n   void resizeMapped(spv::Id id) { if (id >= maxMappedId()) mapped.resize(id/mBits+1, 0); }\n   size_t maxMappedId() const { return mapped.size() * mBits; }\n\n   // Add a strip range for a given instruction starting at 'start'\n   // Note: avoiding brace initializers to please older versions os MSVC.\n   void stripInst(unsigned start) { stripRange.push_back(range_t(start, start + asWordCount(start))); }\n\n   // Function start and end.  use unordered_map because we'll have\n   // many fewer functions than IDs.\n   std::unordered_map<spv::Id, range_t> fnPos;\n\n   // Which functions are called, anywhere in the module, with a call count\n   std::unordered_map<spv::Id, int> fnCalls;\n\n   posmap_t       typeConstPos;  // word positions that define types & consts (ordered)\n   posmap_rev_t   idPosR;        // reverse map from IDs to positions\n   typesize_map_t idTypeSizeMap; // maps each ID to its type size, if known.\n\n   std::vector<spv::Id>  idMapL;   // ID {M}ap from {L}ocal to {G}lobal IDs\n\n   spv::Id entryPoint;      // module entry point\n   spv::Id largestNewId;    // biggest new ID we have mapped anything to\n\n   // Sections of the binary to strip, given as [begin,end)\n   std::vector<range_t> stripRange;\n\n   // processing options:\n   std::uint32_t options;\n   int           verbose;     // verbosity level\n\n   // Error latch: this is set if the error handler is ever executed.  It would be better to\n   // use a try/catch block and throw, but that's not desired for certain environments, so\n   // this is the alternative.\n   mutable bool errorLatch;\n\n   static errorfn_t errorHandler;\n   static logfn_t   logHandler;\n};\n\n} // namespace SPV\n\n#endif // SPIRVREMAPPER_H\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/SpvBuilder.cpp",
    "content": "//\n// Copyright (C) 2014-2015 LunarG, Inc.\n// Copyright (C) 2015-2018 Google, Inc.\n// Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Helper for making SPIR-V IR.  Generally, this is documented in the header\n// SpvBuilder.h.\n//\n\n#include <cassert>\n#include <cstdlib>\n\n#include <unordered_set>\n#include <algorithm>\n\n#include \"SpvBuilder.h\"\n#include \"spvUtil.h\"\n#include \"hex_float.h\"\n\n#ifndef _WIN32\n    #include <cstdio>\n#endif\n\nnamespace spv {\n\nBuilder::Builder(unsigned int spvVersion, unsigned int magicNumber, SpvBuildLogger* buildLogger) :\n    spvVersion(spvVersion),\n    sourceLang(SourceLanguage::Unknown),\n    sourceVersion(0),\n    addressModel(AddressingModel::Logical),\n    memoryModel(MemoryModel::GLSL450),\n    builderNumber(magicNumber),\n    buildPoint(nullptr),\n    uniqueId(0),\n    entryPointFunction(nullptr),\n    generatingOpCodeForSpecConst(false),\n    logger(buildLogger)\n{\n    clearAccessChain();\n}\n\nBuilder::~Builder()\n{\n}\n\nId Builder::import(const char* name)\n{\n    Instruction* import = new Instruction(getUniqueId(), NoType, Op::OpExtInstImport);\n    import->addStringOperand(name);\n    module.mapInstruction(import);\n\n    imports.push_back(std::unique_ptr<Instruction>(import));\n    return import->getResultId();\n}\n\n// For creating new groupedTypes (will return old type if the requested one was already made).\nId Builder::makeVoidType()\n{\n    Instruction* type;\n    if (groupedTypes[enumCast(Op::OpTypeVoid)].size() == 0) {\n        Id typeId = getUniqueId();\n        type = new Instruction(typeId, NoType, Op::OpTypeVoid);\n        groupedTypes[enumCast(Op::OpTypeVoid)].push_back(type);\n        constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n        module.mapInstruction(type);\n        // Core OpTypeVoid used for debug void type\n        if (emitNonSemanticShaderDebugInfo)\n            debugId[typeId] = typeId;\n    } else\n        type = groupedTypes[enumCast(Op::OpTypeVoid)].back();\n\n    return type->getResultId();\n}\n\nId Builder::makeBoolType()\n{\n    Instruction* type;\n    if (groupedTypes[enumCast(Op::OpTypeBool)].size() == 0) {\n        type = new Instruction(getUniqueId(), NoType, Op::OpTypeBool);\n        groupedTypes[enumCast(Op::OpTypeBool)].push_back(type);\n        constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n        module.mapInstruction(type);\n\n        if (emitNonSemanticShaderDebugInfo) {\n            auto const debugResultId = makeBoolDebugType(32);\n            debugId[type->getResultId()] = debugResultId;\n        }\n\n    } else\n        type = groupedTypes[enumCast(Op::OpTypeBool)].back();\n\n\n    return type->getResultId();\n}\n\nId Builder::makeSamplerType()\n{\n    Instruction* type;\n    if (groupedTypes[enumCast(Op::OpTypeSampler)].size() == 0) {\n        type = new Instruction(getUniqueId(), NoType, Op::OpTypeSampler);\n        groupedTypes[enumCast(Op::OpTypeSampler)].push_back(type);\n        constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n        module.mapInstruction(type);\n    } else\n        type = groupedTypes[enumCast(Op::OpTypeSampler)].back();\n\n    if (emitNonSemanticShaderDebugInfo)\n    {\n        auto const debugResultId = makeCompositeDebugType({}, \"type.sampler\", NonSemanticShaderDebugInfo100Structure, true);\n        debugId[type->getResultId()] = debugResultId;\n    }\n\n    return type->getResultId();\n}\n\nId Builder::makePointer(StorageClass storageClass, Id pointee)\n{\n    // try to find it\n    Instruction* type;\n    for (int t = 0; t < (int)groupedTypes[enumCast(Op::OpTypePointer)].size(); ++t) {\n        type = groupedTypes[enumCast(Op::OpTypePointer)][t];\n        if (type->getImmediateOperand(0) == (unsigned)storageClass &&\n            type->getIdOperand(1) == pointee)\n            return type->getResultId();\n    }\n\n    // not found, make it\n    type = new Instruction(getUniqueId(), NoType, Op::OpTypePointer);\n    type->reserveOperands(2);\n    type->addImmediateOperand(storageClass);\n    type->addIdOperand(pointee);\n    groupedTypes[enumCast(Op::OpTypePointer)].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    if (emitNonSemanticShaderDebugInfo) {\n        const Id debugResultId = makePointerDebugType(storageClass, pointee);\n        debugId[type->getResultId()] = debugResultId;\n    }\n\n    return type->getResultId();\n}\n\nId Builder::makeForwardPointer(StorageClass storageClass)\n{\n    // Caching/uniquifying doesn't work here, because we don't know the\n    // pointee type and there can be multiple forward pointers of the same\n    // storage type. Somebody higher up in the stack must keep track.\n    Instruction* type = new Instruction(getUniqueId(), NoType, Op::OpTypeForwardPointer);\n    type->addImmediateOperand(storageClass);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    if (emitNonSemanticShaderDebugInfo) {\n        const Id debugResultId = makeForwardPointerDebugType(storageClass);\n        debugId[type->getResultId()] = debugResultId;\n    }\n    return type->getResultId();\n}\n\nId Builder::makePointerFromForwardPointer(StorageClass storageClass, Id forwardPointerType, Id pointee)\n{\n    // try to find it\n    Instruction* type;\n    for (int t = 0; t < (int)groupedTypes[enumCast(Op::OpTypePointer)].size(); ++t) {\n        type = groupedTypes[enumCast(Op::OpTypePointer)][t];\n        if (type->getImmediateOperand(0) == (unsigned)storageClass &&\n            type->getIdOperand(1) == pointee)\n            return type->getResultId();\n    }\n\n    type = new Instruction(forwardPointerType, NoType, Op::OpTypePointer);\n    type->reserveOperands(2);\n    type->addImmediateOperand(storageClass);\n    type->addIdOperand(pointee);\n    groupedTypes[enumCast(Op::OpTypePointer)].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    // If we are emitting nonsemantic debuginfo, we need to patch the debug pointer type\n    // that was emitted alongside the forward pointer, now that we have a pointee debug\n    // type for it to point to.\n    if (emitNonSemanticShaderDebugInfo) {\n        Instruction *debugForwardPointer = module.getInstruction(debugId[forwardPointerType]);\n        assert(debugId[pointee]);\n        debugForwardPointer->setIdOperand(2, debugId[pointee]);\n    }\n\n    return type->getResultId();\n}\n\nId Builder::makeIntegerType(int width, bool hasSign)\n{\n    // try to find it\n    Instruction* type;\n    for (int t = 0; t < (int)groupedTypes[enumCast(Op::OpTypeInt)].size(); ++t) {\n        type = groupedTypes[enumCast(Op::OpTypeInt)][t];\n        if (type->getImmediateOperand(0) == (unsigned)width &&\n            type->getImmediateOperand(1) == (hasSign ? 1u : 0u))\n            return type->getResultId();\n    }\n\n    // not found, make it\n    type = new Instruction(getUniqueId(), NoType, Op::OpTypeInt);\n    type->reserveOperands(2);\n    type->addImmediateOperand(width);\n    type->addImmediateOperand(hasSign ? 1 : 0);\n    groupedTypes[enumCast(Op::OpTypeInt)].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    // deal with capabilities\n    switch (width) {\n    case 8:\n    case 16:\n        // these are currently handled by storage-type declarations and post processing\n        break;\n    case 64:\n        addCapability(Capability::Int64);\n        break;\n    default:\n        break;\n    }\n\n    if (emitNonSemanticShaderDebugInfo)\n    {\n        auto const debugResultId = makeIntegerDebugType(width, hasSign);\n        debugId[type->getResultId()] = debugResultId;\n    }\n\n    return type->getResultId();\n}\n\nId Builder::makeFloatType(int width)\n{\n    // try to find it\n    Instruction* type;\n    for (int t = 0; t < (int)groupedTypes[enumCast(Op::OpTypeFloat)].size(); ++t) {\n        type = groupedTypes[enumCast(Op::OpTypeFloat)][t];\n        if (type->getNumOperands() != 1) {\n            continue;\n        }\n        if (type->getImmediateOperand(0) == (unsigned)width)\n            return type->getResultId();\n    }\n\n    // not found, make it\n    type = new Instruction(getUniqueId(), NoType, Op::OpTypeFloat);\n    type->addImmediateOperand(width);\n    groupedTypes[enumCast(Op::OpTypeFloat)].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    // deal with capabilities\n    switch (width) {\n    case 16:\n        // currently handled by storage-type declarations and post processing\n        break;\n    case 64:\n        addCapability(Capability::Float64);\n        break;\n    default:\n        break;\n    }\n\n    if (emitNonSemanticShaderDebugInfo)\n    {\n        auto const debugResultId = makeFloatDebugType(width);\n        debugId[type->getResultId()] = debugResultId;\n    }\n\n    return type->getResultId();\n}\n\nId Builder::makeBFloat16Type()\n{\n    // try to find it\n    Instruction* type;\n    for (int t = 0; t < (int)groupedTypes[enumCast(Op::OpTypeFloat)].size(); ++t) {\n        type = groupedTypes[enumCast(Op::OpTypeFloat)][t];\n        if (type->getNumOperands() != 2) {\n            continue;\n        }\n        if (type->getImmediateOperand(0) == (unsigned)16 &&\n            type->getImmediateOperand(1) == FPEncoding::BFloat16KHR)\n            return type->getResultId();\n    }\n\n    // not found, make it\n    type = new Instruction(getUniqueId(), NoType, Op::OpTypeFloat);\n    type->addImmediateOperand(16);\n    type->addImmediateOperand(FPEncoding::BFloat16KHR);\n    groupedTypes[enumCast(Op::OpTypeFloat)].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    addExtension(spv::E_SPV_KHR_bfloat16);\n    addCapability(Capability::BFloat16TypeKHR);\n\n#if 0\n    // XXX not supported\n    if (emitNonSemanticShaderDebugInfo)\n    {\n        auto const debugResultId = makeFloatDebugType(width);\n        debugId[type->getResultId()] = debugResultId;\n    }\n#endif\n\n    return type->getResultId();\n}\n\nId Builder::makeFloatE5M2Type()\n{\n    // try to find it\n    Instruction* type;\n    for (int t = 0; t < (int)groupedTypes[enumCast(Op::OpTypeFloat)].size(); ++t) {\n        type = groupedTypes[enumCast(Op::OpTypeFloat)][t];\n        if (type->getNumOperands() != 2) {\n            continue;\n        }\n        if (type->getImmediateOperand(0) == (unsigned)8 &&\n            type->getImmediateOperand(1) == FPEncoding::Float8E5M2EXT)\n            return type->getResultId();\n    }\n\n    // not found, make it\n    type = new Instruction(getUniqueId(), NoType, Op::OpTypeFloat);\n    type->addImmediateOperand(8);\n    type->addImmediateOperand(FPEncoding::Float8E5M2EXT);\n    groupedTypes[enumCast(Op::OpTypeFloat)].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    addExtension(spv::E_SPV_EXT_float8);\n    addCapability(Capability::Float8EXT);\n\n#if 0\n    // XXX not supported\n    if (emitNonSemanticShaderDebugInfo)\n    {\n        auto const debugResultId = makeFloatDebugType(width);\n        debugId[type->getResultId()] = debugResultId;\n    }\n#endif\n\n    return type->getResultId();\n}\n\nId Builder::makeFloatE4M3Type()\n{\n    // try to find it\n    Instruction* type;\n    for (int t = 0; t < (int)groupedTypes[enumCast(Op::OpTypeFloat)].size(); ++t) {\n        type = groupedTypes[enumCast(Op::OpTypeFloat)][t];\n        if (type->getNumOperands() != 2) {\n            continue;\n        }\n        if (type->getImmediateOperand(0) == (unsigned)8 &&\n            type->getImmediateOperand(1) == FPEncoding::Float8E4M3EXT)\n            return type->getResultId();\n    }\n\n    // not found, make it\n    type = new Instruction(getUniqueId(), NoType, Op::OpTypeFloat);\n    type->addImmediateOperand(8);\n    type->addImmediateOperand(FPEncoding::Float8E4M3EXT);\n    groupedTypes[enumCast(Op::OpTypeFloat)].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    addExtension(spv::E_SPV_EXT_float8);\n    addCapability(Capability::Float8EXT);\n\n#if 0\n    // XXX not supported\n    if (emitNonSemanticShaderDebugInfo)\n    {\n        auto const debugResultId = makeFloatDebugType(width);\n        debugId[type->getResultId()] = debugResultId;\n    }\n#endif\n\n    return type->getResultId();\n}\n\n// Make a struct without checking for duplication.\n// See makeStructResultType() for non-decorated structs\n// needed as the result of some instructions, which does\n// check for duplicates.\nId Builder::makeStructType(const std::vector<Id>& members, const char* name, bool const compilerGenerated)\n{\n    // Don't look for previous one, because in the general case,\n    // structs can be duplicated except for decorations.\n\n    // not found, make it\n    Instruction* type = new Instruction(getUniqueId(), NoType, Op::OpTypeStruct);\n    for (int op = 0; op < (int)members.size(); ++op)\n        type->addIdOperand(members[op]);\n    groupedTypes[enumCast(Op::OpTypeStruct)].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n    addName(type->getResultId(), name);\n\n    if (emitNonSemanticShaderDebugInfo && !compilerGenerated)\n    {\n        auto const debugResultId = makeCompositeDebugType(members, name, NonSemanticShaderDebugInfo100Structure);\n        debugId[type->getResultId()] = debugResultId;\n    }\n\n    return type->getResultId();\n}\n\n// Make a struct for the simple results of several instructions,\n// checking for duplication.\nId Builder::makeStructResultType(Id type0, Id type1)\n{\n    // try to find it\n    Instruction* type;\n    for (int t = 0; t < (int)groupedTypes[enumCast(Op::OpTypeStruct)].size(); ++t) {\n        type = groupedTypes[enumCast(Op::OpTypeStruct)][t];\n        if (type->getNumOperands() != 2)\n            continue;\n        if (type->getIdOperand(0) != type0 ||\n            type->getIdOperand(1) != type1)\n            continue;\n        return type->getResultId();\n    }\n\n    // not found, make it\n    std::vector<spv::Id> members;\n    members.push_back(type0);\n    members.push_back(type1);\n\n    return makeStructType(members, \"ResType\");\n}\n\nId Builder::makeVectorType(Id component, int size)\n{\n    // try to find it\n    Instruction* type;\n    for (int t = 0; t < (int)groupedTypes[enumCast(Op::OpTypeVector)].size(); ++t) {\n        type = groupedTypes[enumCast(Op::OpTypeVector)][t];\n        if (type->getIdOperand(0) == component &&\n            type->getImmediateOperand(1) == (unsigned)size)\n            return type->getResultId();\n    }\n\n    // not found, make it\n    type = new Instruction(getUniqueId(), NoType, Op::OpTypeVector);\n    type->reserveOperands(2);\n    type->addIdOperand(component);\n    type->addImmediateOperand(size);\n    groupedTypes[enumCast(Op::OpTypeVector)].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    if (emitNonSemanticShaderDebugInfo)\n    {\n        auto const debugResultId = makeVectorDebugType(component, size);\n        debugId[type->getResultId()] = debugResultId;\n    }\n\n    return type->getResultId();\n}\n\nId Builder::makeMatrixType(Id component, int cols, int rows)\n{\n    assert(cols <= maxMatrixSize && rows <= maxMatrixSize);\n\n    Id column = makeVectorType(component, rows);\n\n    // try to find it\n    Instruction* type;\n    for (int t = 0; t < (int)groupedTypes[enumCast(Op::OpTypeMatrix)].size(); ++t) {\n        type = groupedTypes[enumCast(Op::OpTypeMatrix)][t];\n        if (type->getIdOperand(0) == column &&\n            type->getImmediateOperand(1) == (unsigned)cols)\n            return type->getResultId();\n    }\n\n    // not found, make it\n    type = new Instruction(getUniqueId(), NoType, Op::OpTypeMatrix);\n    type->reserveOperands(2);\n    type->addIdOperand(column);\n    type->addImmediateOperand(cols);\n    groupedTypes[enumCast(Op::OpTypeMatrix)].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    if (emitNonSemanticShaderDebugInfo)\n    {\n        auto const debugResultId = makeMatrixDebugType(column, cols);\n        debugId[type->getResultId()] = debugResultId;\n    }\n\n    return type->getResultId();\n}\n\nId Builder::makeCooperativeMatrixTypeKHR(Id component, Id scope, Id rows, Id cols, Id use)\n{\n    // try to find it\n    Instruction* type;\n    for (int t = 0; t < (int)groupedTypes[enumCast(Op::OpTypeCooperativeMatrixKHR)].size(); ++t) {\n        type = groupedTypes[enumCast(Op::OpTypeCooperativeMatrixKHR)][t];\n        if (type->getIdOperand(0) == component &&\n            type->getIdOperand(1) == scope &&\n            type->getIdOperand(2) == rows &&\n            type->getIdOperand(3) == cols &&\n            type->getIdOperand(4) == use)\n            return type->getResultId();\n    }\n\n    // not found, make it\n    type = new Instruction(getUniqueId(), NoType, Op::OpTypeCooperativeMatrixKHR);\n    type->reserveOperands(5);\n    type->addIdOperand(component);\n    type->addIdOperand(scope);\n    type->addIdOperand(rows);\n    type->addIdOperand(cols);\n    type->addIdOperand(use);\n    groupedTypes[enumCast(Op::OpTypeCooperativeMatrixKHR)].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    if (emitNonSemanticShaderDebugInfo)\n    {\n        // Find a name for one of the parameters. It can either come from debuginfo for another\n        // type, or an OpName from a constant.\n        auto const findName = [&](Id id) {\n            Id id2 = debugId[id];\n            for (auto &t : groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeBasic]) {\n                if (t->getResultId() == id2) {\n                    for (auto &s : strings) {\n                        if (s->getResultId() == t->getIdOperand(2)) {\n                            return s->getNameString();\n                        }\n                    }\n                }\n            }\n            for (auto &t : names) {\n                if (t->getIdOperand(0) == id) {\n                    return t->getNameString();\n                }\n            }\n            return \"unknown\";\n        };\n        std::string debugName = \"coopmat<\";\n        debugName += std::string(findName(component)) + \", \";\n        if (isConstantScalar(scope)) {\n            debugName += std::string(\"gl_Scope\") + std::string(spv::ScopeToString((spv::Scope)getConstantScalar(scope))) + \", \";\n        } else {\n            debugName += std::string(findName(scope)) + \", \";\n        }\n        debugName += std::string(findName(rows)) + \", \";\n        debugName += std::string(findName(cols)) + \">\";\n        // There's no nonsemantic debug info instruction for cooperative matrix types,\n        // use opaque composite instead.\n        auto const debugResultId = makeCompositeDebugType({}, debugName.c_str(), NonSemanticShaderDebugInfo100Structure, true);\n        debugId[type->getResultId()] = debugResultId;\n    }\n\n    return type->getResultId();\n}\n\nId Builder::makeCooperativeMatrixTypeNV(Id component, Id scope, Id rows, Id cols)\n{\n    // try to find it\n    Instruction* type;\n    for (int t = 0; t < (int)groupedTypes[enumCast(Op::OpTypeCooperativeMatrixNV)].size(); ++t) {\n        type = groupedTypes[enumCast(Op::OpTypeCooperativeMatrixNV)][t];\n        if (type->getIdOperand(0) == component && type->getIdOperand(1) == scope && type->getIdOperand(2) == rows &&\n            type->getIdOperand(3) == cols)\n            return type->getResultId();\n    }\n\n    // not found, make it\n    type = new Instruction(getUniqueId(), NoType, Op::OpTypeCooperativeMatrixNV);\n    type->reserveOperands(4);\n    type->addIdOperand(component);\n    type->addIdOperand(scope);\n    type->addIdOperand(rows);\n    type->addIdOperand(cols);\n    groupedTypes[enumCast(Op::OpTypeCooperativeMatrixNV)].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    return type->getResultId();\n}\n\nId Builder::makeCooperativeMatrixTypeWithSameShape(Id component, Id otherType)\n{\n    Instruction* instr = module.getInstruction(otherType);\n    if (instr->getOpCode() == Op::OpTypeCooperativeMatrixNV) {\n        return makeCooperativeMatrixTypeNV(component, instr->getIdOperand(1), instr->getIdOperand(2), instr->getIdOperand(3));\n    } else {\n        assert(instr->getOpCode() == Op::OpTypeCooperativeMatrixKHR);\n        return makeCooperativeMatrixTypeKHR(component, instr->getIdOperand(1), instr->getIdOperand(2), instr->getIdOperand(3), instr->getIdOperand(4));\n    }\n}\n\nId Builder::makeCooperativeVectorTypeNV(Id componentType, Id components)\n{\n    // try to find it\n    Instruction* type;\n    for (int t = 0; t < (int)groupedTypes[enumCast(Op::OpTypeCooperativeVectorNV)].size(); ++t) {\n        type = groupedTypes[enumCast(Op::OpTypeCooperativeVectorNV)][t];\n        if (type->getIdOperand(0) == componentType &&\n            type->getIdOperand(1) == components)\n            return type->getResultId();\n    }\n\n    // not found, make it\n    type = new Instruction(getUniqueId(), NoType, Op::OpTypeCooperativeVectorNV);\n    type->addIdOperand(componentType);\n    type->addIdOperand(components);\n    groupedTypes[enumCast(Op::OpTypeCooperativeVectorNV)].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    return type->getResultId();\n}\n\nId Builder::makeGenericType(spv::Op opcode, std::vector<spv::IdImmediate>& operands)\n{\n    // try to find it\n    Instruction* type;\n    for (int t = 0; t < (int)groupedTypes[enumCast(opcode)].size(); ++t) {\n        type = groupedTypes[enumCast(opcode)][t];\n        if (static_cast<size_t>(type->getNumOperands()) != operands.size())\n            continue; // Number mismatch, find next\n\n        bool match = true;\n        for (int op = 0; match && op < (int)operands.size(); ++op) {\n            match = (operands[op].isId ? type->getIdOperand(op) : type->getImmediateOperand(op)) == operands[op].word;\n        }\n        if (match)\n            return type->getResultId();\n    }\n\n    // not found, make it\n    type = new Instruction(getUniqueId(), NoType, opcode);\n    type->reserveOperands(operands.size());\n    for (size_t op = 0; op < operands.size(); ++op) {\n        if (operands[op].isId)\n            type->addIdOperand(operands[op].word);\n        else\n            type->addImmediateOperand(operands[op].word);\n    }\n    groupedTypes[enumCast(opcode)].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    return type->getResultId();\n}\n\n// TODO: performance: track arrays per stride\n// If a stride is supplied (non-zero) make an array.\n// If no stride (0), reuse previous array types.\n// 'size' is an Id of a constant or specialization constant of the array size\nId Builder::makeArrayType(Id element, Id sizeId, int stride)\n{\n    Instruction* type;\n    if (stride == 0) {\n        // try to find existing type\n        for (int t = 0; t < (int)groupedTypes[enumCast(Op::OpTypeArray)].size(); ++t) {\n            type = groupedTypes[enumCast(Op::OpTypeArray)][t];\n            if (type->getIdOperand(0) == element &&\n                type->getIdOperand(1) == sizeId &&\n                explicitlyLaidOut.find(type->getResultId()) == explicitlyLaidOut.end())\n                return type->getResultId();\n        }\n    }\n\n    // not found, make it\n    type = new Instruction(getUniqueId(), NoType, Op::OpTypeArray);\n    type->reserveOperands(2);\n    type->addIdOperand(element);\n    type->addIdOperand(sizeId);\n    groupedTypes[enumCast(Op::OpTypeArray)].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    if (stride != 0) {\n        explicitlyLaidOut.insert(type->getResultId());\n    }\n\n    if (emitNonSemanticShaderDebugInfo)\n    {\n        auto const debugResultId = makeArrayDebugType(element, sizeId);\n        debugId[type->getResultId()] = debugResultId;\n    }\n\n    return type->getResultId();\n}\n\nId Builder::makeRuntimeArray(Id element)\n{\n    Instruction* type = new Instruction(getUniqueId(), NoType, Op::OpTypeRuntimeArray);\n    type->addIdOperand(element);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    if (emitNonSemanticShaderDebugInfo)\n    {\n        auto const debugResultId = makeArrayDebugType(element, makeUintConstant(0));\n        debugId[type->getResultId()] = debugResultId;\n    }\n\n    return type->getResultId();\n}\n\nId Builder::makeFunctionType(Id returnType, const std::vector<Id>& paramTypes)\n{\n    // try to find it\n    Instruction* type;\n    for (int t = 0; t < (int)groupedTypes[enumCast(Op::OpTypeFunction)].size(); ++t) {\n        type = groupedTypes[enumCast(Op::OpTypeFunction)][t];\n        if (type->getIdOperand(0) != returnType || (int)paramTypes.size() != type->getNumOperands() - 1)\n            continue;\n        bool mismatch = false;\n        for (int p = 0; p < (int)paramTypes.size(); ++p) {\n            if (paramTypes[p] != type->getIdOperand(p + 1)) {\n                mismatch = true;\n                break;\n            }\n        }\n        if (! mismatch)\n        {\n            // If compiling HLSL, glslang will create a wrapper function around the entrypoint. Accordingly, a void(void)\n            // function type is created for the wrapper function. However, nonsemantic shader debug information is disabled\n            // while creating the HLSL wrapper. Consequently, if we encounter another void(void) function, we need to create\n            // the associated debug function type if it hasn't been created yet.\n            if(emitNonSemanticShaderDebugInfo && debugId[type->getResultId()] == 0) {\n                assert(sourceLang == spv::SourceLanguage::HLSL);\n                assert(getTypeClass(returnType) == Op::OpTypeVoid && paramTypes.size() == 0);\n\n                Id debugTypeId = makeDebugFunctionType(returnType, {});\n                debugId[type->getResultId()] = debugTypeId;\n            }\n            return type->getResultId();\n        }\n    }\n\n    // not found, make it\n    Id typeId = getUniqueId();\n    type = new Instruction(typeId, NoType, Op::OpTypeFunction);\n    type->reserveOperands(paramTypes.size() + 1);\n    type->addIdOperand(returnType);\n    for (int p = 0; p < (int)paramTypes.size(); ++p)\n        type->addIdOperand(paramTypes[p]);\n    groupedTypes[enumCast(Op::OpTypeFunction)].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    // make debug type and map it\n    if (emitNonSemanticShaderDebugInfo) {\n        Id debugTypeId = makeDebugFunctionType(returnType, paramTypes);\n        debugId[typeId] = debugTypeId;\n    }\n\n    return type->getResultId();\n}\n\nId Builder::makeDebugFunctionType(Id returnType, const std::vector<Id>& paramTypes)\n{\n    assert(debugId[returnType] != 0);\n\n    Id typeId = getUniqueId();\n    auto type = new Instruction(typeId, makeVoidType(), Op::OpExtInst);\n    type->reserveOperands(paramTypes.size() + 4);\n    type->addIdOperand(nonSemanticShaderDebugInfo);\n    type->addImmediateOperand(NonSemanticShaderDebugInfo100DebugTypeFunction);\n    type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100FlagIsPublic));\n    type->addIdOperand(debugId[returnType]);\n    for (auto const paramType : paramTypes) {\n        if (isPointerType(paramType) || isArrayType(paramType)) {\n            type->addIdOperand(debugId[getContainedTypeId(paramType)]);\n        }\n        else {\n            type->addIdOperand(debugId[paramType]);\n        }\n    }\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n    return typeId;\n}\n\nId Builder::makeImageType(Id sampledType, Dim dim, bool depth, bool arrayed, bool ms, unsigned sampled,\n    ImageFormat format)\n{\n    assert(sampled == 1 || sampled == 2);\n\n    // try to find it\n    Instruction* type;\n    for (int t = 0; t < (int)groupedTypes[enumCast(Op::OpTypeImage)].size(); ++t) {\n        type = groupedTypes[enumCast(Op::OpTypeImage)][t];\n        if (type->getIdOperand(0) == sampledType &&\n            type->getImmediateOperand(1) == (unsigned int)dim &&\n            type->getImmediateOperand(2) == (  depth ? 1u : 0u) &&\n            type->getImmediateOperand(3) == (arrayed ? 1u : 0u) &&\n            type->getImmediateOperand(4) == (     ms ? 1u : 0u) &&\n            type->getImmediateOperand(5) == sampled &&\n            type->getImmediateOperand(6) == (unsigned int)format)\n            return type->getResultId();\n    }\n\n    // not found, make it\n    type = new Instruction(getUniqueId(), NoType, Op::OpTypeImage);\n    type->reserveOperands(7);\n    type->addIdOperand(sampledType);\n    type->addImmediateOperand(   dim);\n    type->addImmediateOperand(  depth ? 1 : 0);\n    type->addImmediateOperand(arrayed ? 1 : 0);\n    type->addImmediateOperand(     ms ? 1 : 0);\n    type->addImmediateOperand(sampled);\n    type->addImmediateOperand((unsigned int)format);\n\n    groupedTypes[enumCast(Op::OpTypeImage)].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    // deal with capabilities\n    switch (dim) {\n    case Dim::Buffer:\n        if (sampled == 1)\n            addCapability(Capability::SampledBuffer);\n        else\n            addCapability(Capability::ImageBuffer);\n        break;\n    case Dim::Dim1D:\n        if (sampled == 1)\n            addCapability(Capability::Sampled1D);\n        else\n            addCapability(Capability::Image1D);\n        break;\n    case Dim::Cube:\n        if (arrayed) {\n            if (sampled == 1)\n                addCapability(Capability::SampledCubeArray);\n            else\n                addCapability(Capability::ImageCubeArray);\n        }\n        break;\n    case Dim::Rect:\n        if (sampled == 1)\n            addCapability(Capability::SampledRect);\n        else\n            addCapability(Capability::ImageRect);\n        break;\n    case Dim::SubpassData:\n        addCapability(Capability::InputAttachment);\n        break;\n    default:\n        break;\n    }\n\n    if (ms) {\n        if (sampled == 2) {\n            // Images used with subpass data are not storage\n            // images, so don't require the capability for them.\n            if (dim != Dim::SubpassData)\n                addCapability(Capability::StorageImageMultisample);\n            if (arrayed)\n                addCapability(Capability::ImageMSArray);\n        }\n    }\n\n    if (emitNonSemanticShaderDebugInfo)\n    {\n        auto TypeName = [&dim]() -> char const* {\n            switch (dim) {\n                case Dim::Dim1D: return \"type.1d.image\";\n                case Dim::Dim2D: return \"type.2d.image\";\n                case Dim::Dim3D: return \"type.3d.image\";\n                case Dim::Cube:  return \"type.cube.image\";\n                default: return \"type.image\";\n            }\n        };\n\n        auto const debugResultId = makeCompositeDebugType({}, TypeName(), NonSemanticShaderDebugInfo100Class, true);\n        debugId[type->getResultId()] = debugResultId;\n    }\n\n    return type->getResultId();\n}\n\nId Builder::makeSampledImageType(Id imageType)\n{\n    // try to find it\n    Instruction* type;\n    for (int t = 0; t < (int)groupedTypes[enumCast(Op::OpTypeSampledImage)].size(); ++t) {\n        type = groupedTypes[enumCast(Op::OpTypeSampledImage)][t];\n        if (type->getIdOperand(0) == imageType)\n            return type->getResultId();\n    }\n\n    // not found, make it\n    type = new Instruction(getUniqueId(), NoType, Op::OpTypeSampledImage);\n    type->addIdOperand(imageType);\n\n    groupedTypes[enumCast(Op::OpTypeSampledImage)].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    if (emitNonSemanticShaderDebugInfo)\n    {\n        auto const debugResultId = makeCompositeDebugType({}, \"type.sampled.image\", NonSemanticShaderDebugInfo100Class, true);\n        debugId[type->getResultId()] = debugResultId;\n    }\n\n    return type->getResultId();\n}\n\nId Builder::makeDebugInfoNone()\n{\n    if (debugInfoNone != 0)\n        return debugInfoNone;\n\n    Instruction* inst = new Instruction(getUniqueId(), makeVoidType(), Op::OpExtInst);\n    inst->reserveOperands(2);\n    inst->addIdOperand(nonSemanticShaderDebugInfo);\n    inst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugInfoNone);\n\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(inst));\n    module.mapInstruction(inst);\n\n    debugInfoNone = inst->getResultId();\n\n    return debugInfoNone;\n}\n\nId Builder::makeBoolDebugType(int const size)\n{\n    // try to find it\n    Instruction* type;\n    for (int t = 0; t < (int)groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeBasic].size(); ++t) {\n        type = groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeBasic][t];\n        if (type->getIdOperand(0) == getStringId(\"bool\") &&\n            type->getIdOperand(1) == static_cast<unsigned int>(size) &&\n            type->getIdOperand(2) == NonSemanticShaderDebugInfo100Boolean)\n            return type->getResultId();\n    }\n\n    type = new Instruction(getUniqueId(), makeVoidType(), Op::OpExtInst);\n    type->reserveOperands(6);\n    type->addIdOperand(nonSemanticShaderDebugInfo);\n    type->addImmediateOperand(NonSemanticShaderDebugInfo100DebugTypeBasic);\n\n    type->addIdOperand(getStringId(\"bool\")); // name id\n    type->addIdOperand(makeUintConstant(size)); // size id\n    type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100Boolean)); // encoding id\n    type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100None)); // flags id\n\n    groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeBasic].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    return type->getResultId();\n}\n\nId Builder::makeIntegerDebugType(int const width, bool const hasSign)\n{\n    const char* typeName = nullptr;\n    switch (width) {\n        case 8:  typeName = hasSign ? \"int8_t\" : \"uint8_t\"; break;\n        case 16: typeName = hasSign ? \"int16_t\" : \"uint16_t\"; break;\n        case 64: typeName = hasSign ? \"int64_t\" : \"uint64_t\"; break;\n        default: typeName = hasSign ? \"int\" : \"uint\";\n    }\n    auto nameId = getStringId(typeName);\n    // try to find it\n    Instruction* type;\n    for (int t = 0; t < (int)groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeBasic].size(); ++t) {\n        type = groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeBasic][t];\n        if (type->getIdOperand(0) == nameId &&\n            type->getIdOperand(1) == static_cast<unsigned int>(width) &&\n            type->getIdOperand(2) == (hasSign ? NonSemanticShaderDebugInfo100Signed : NonSemanticShaderDebugInfo100Unsigned))\n            return type->getResultId();\n    }\n\n    // not found, make it\n    type = new Instruction(getUniqueId(), makeVoidType(), Op::OpExtInst);\n    type->reserveOperands(6);\n    type->addIdOperand(nonSemanticShaderDebugInfo);\n    type->addImmediateOperand(NonSemanticShaderDebugInfo100DebugTypeBasic);\n    type->addIdOperand(nameId); // name id\n    type->addIdOperand(makeUintConstant(width)); // size id\n    if(hasSign == true) {\n        type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100Signed)); // encoding id\n    } else {\n        type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100Unsigned)); // encoding id\n    }\n    type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100None)); // flags id\n\n    groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeBasic].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    return type->getResultId();\n}\n\nId Builder::makeFloatDebugType(int const width)\n{\n    const char* typeName = nullptr;\n    switch (width) {\n        case 16: typeName = \"float16_t\"; break;\n        case 64: typeName = \"double\"; break;\n        default: typeName = \"float\"; break;\n    }\n    auto nameId = getStringId(typeName);\n    // try to find it\n    Instruction* type;\n    for (int t = 0; t < (int)groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeBasic].size(); ++t) {\n        type = groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeBasic][t];\n        if (type->getIdOperand(0) == nameId &&\n            type->getIdOperand(1) == static_cast<unsigned int>(width) &&\n            type->getIdOperand(2) == NonSemanticShaderDebugInfo100Float)\n            return type->getResultId();\n    }\n\n    // not found, make it\n    type = new Instruction(getUniqueId(), makeVoidType(), Op::OpExtInst);\n    type->reserveOperands(6);\n    type->addIdOperand(nonSemanticShaderDebugInfo);\n    type->addImmediateOperand(NonSemanticShaderDebugInfo100DebugTypeBasic);\n    type->addIdOperand(nameId); // name id\n    type->addIdOperand(makeUintConstant(width)); // size id\n    type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100Float)); // encoding id\n    type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100None)); // flags id\n\n    groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeBasic].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    return type->getResultId();\n}\n\nId Builder::makeSequentialDebugType(Id const baseType, Id const componentCount, NonSemanticShaderDebugInfo100Instructions const sequenceType)\n{\n    assert(sequenceType == NonSemanticShaderDebugInfo100DebugTypeArray ||\n        sequenceType == NonSemanticShaderDebugInfo100DebugTypeVector);\n\n    // try to find it\n    Instruction* type;\n    for (int t = 0; t < (int)groupedDebugTypes[sequenceType].size(); ++t) {\n        type = groupedDebugTypes[sequenceType][t];\n        if (type->getIdOperand(0) == baseType &&\n            type->getIdOperand(1) == makeUintConstant(componentCount))\n            return type->getResultId();\n    }\n\n    // not found, make it\n    type = new Instruction(getUniqueId(), makeVoidType(), Op::OpExtInst);\n    type->reserveOperands(4);\n    type->addIdOperand(nonSemanticShaderDebugInfo);\n    type->addImmediateOperand(sequenceType);\n    type->addIdOperand(debugId[baseType]); // base type\n    type->addIdOperand(componentCount); // component count\n\n    groupedDebugTypes[sequenceType].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    return type->getResultId();\n}\n\nId Builder::makeArrayDebugType(Id const baseType, Id const componentCount)\n{\n    return makeSequentialDebugType(baseType, componentCount, NonSemanticShaderDebugInfo100DebugTypeArray);\n}\n\nId Builder::makeVectorDebugType(Id const baseType, int const componentCount)\n{\n    return makeSequentialDebugType(baseType, makeUintConstant(componentCount), NonSemanticShaderDebugInfo100DebugTypeVector);\n}\n\nId Builder::makeMatrixDebugType(Id const vectorType, int const vectorCount, bool columnMajor)\n{\n    // try to find it\n    Instruction* type;\n    for (int t = 0; t < (int)groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeMatrix].size(); ++t) {\n        type = groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeMatrix][t];\n        if (type->getIdOperand(0) == vectorType &&\n            type->getIdOperand(1) == makeUintConstant(vectorCount))\n            return type->getResultId();\n    }\n\n    // not found, make it\n    type = new Instruction(getUniqueId(), makeVoidType(), Op::OpExtInst);\n    type->reserveOperands(5);\n    type->addIdOperand(nonSemanticShaderDebugInfo);\n    type->addImmediateOperand(NonSemanticShaderDebugInfo100DebugTypeMatrix);\n    type->addIdOperand(debugId[vectorType]); // vector type id\n    type->addIdOperand(makeUintConstant(vectorCount)); // component count id\n    type->addIdOperand(makeBoolConstant(columnMajor)); // column-major id\n\n    groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeMatrix].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    return type->getResultId();\n}\n\nId Builder::makeMemberDebugType(Id const memberType, DebugTypeLoc const& debugTypeLoc)\n{\n    assert(debugId[memberType] != 0);\n\n    Instruction* type = new Instruction(getUniqueId(), makeVoidType(), Op::OpExtInst);\n    type->reserveOperands(10);\n    type->addIdOperand(nonSemanticShaderDebugInfo);\n    type->addImmediateOperand(NonSemanticShaderDebugInfo100DebugTypeMember);\n    type->addIdOperand(getStringId(debugTypeLoc.name)); // name id\n    type->addIdOperand(debugId[memberType]); // type id\n    type->addIdOperand(makeDebugSource(currentFileId)); // source id\n    type->addIdOperand(makeUintConstant(debugTypeLoc.line)); // line id TODO: currentLine is always zero\n    type->addIdOperand(makeUintConstant(debugTypeLoc.column)); // TODO: column id\n    type->addIdOperand(makeUintConstant(0)); // TODO: offset id\n    type->addIdOperand(makeUintConstant(0)); // TODO: size id\n    type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100FlagIsPublic)); // flags id\n\n    groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeMember].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    return type->getResultId();\n}\n\n// Note: To represent a source language opaque type, this instruction must have no Members operands, Size operand must be\n// DebugInfoNone, and Name must start with @ to avoid clashes with user defined names.\nId Builder::makeCompositeDebugType(std::vector<Id> const& memberTypes, char const*const name,\n    NonSemanticShaderDebugInfo100DebugCompositeType const tag, bool const isOpaqueType)\n{\n    // Create the debug member types.\n    std::vector<Id> memberDebugTypes;\n    for(auto const memberType : memberTypes) {\n        assert(debugTypeLocs.find(memberType) != debugTypeLocs.end());\n\n        // There _should_ be debug types for all the member types but currently buffer references\n        // do not have member debug info generated.\n        if (debugId[memberType])\n            memberDebugTypes.emplace_back(makeMemberDebugType(memberType, debugTypeLocs[memberType]));\n\n        // TODO: Need to rethink this method of passing location information.\n        // debugTypeLocs.erase(memberType);\n    }\n\n    // Create The structure debug type.\n    Instruction* type = new Instruction(getUniqueId(), makeVoidType(), Op::OpExtInst);\n    type->reserveOperands(memberDebugTypes.size() + 11);\n    type->addIdOperand(nonSemanticShaderDebugInfo);\n    type->addImmediateOperand(NonSemanticShaderDebugInfo100DebugTypeComposite);\n    type->addIdOperand(getStringId(name)); // name id\n    type->addIdOperand(makeUintConstant(tag)); // tag id\n    type->addIdOperand(makeDebugSource(currentFileId)); // source id\n    type->addIdOperand(makeUintConstant(currentLine)); // line id TODO: currentLine always zero?\n    type->addIdOperand(makeUintConstant(0)); // TODO: column id\n    type->addIdOperand(makeDebugCompilationUnit()); // scope id\n    if(isOpaqueType == true) {\n        // Prepend '@' to opaque types.\n        type->addIdOperand(getStringId('@' + std::string(name))); // linkage name id\n        type->addIdOperand(makeDebugInfoNone()); // size id\n    } else {\n        type->addIdOperand(getStringId(name)); // linkage name id\n        type->addIdOperand(makeUintConstant(0)); // TODO: size id\n    }\n    type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100FlagIsPublic)); // flags id\n    assert(isOpaqueType == false || (isOpaqueType == true && memberDebugTypes.empty()));\n    for(auto const memberDebugType : memberDebugTypes) {\n        type->addIdOperand(memberDebugType);\n    }\n\n    groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeComposite].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    return type->getResultId();\n}\n\nId Builder::makePointerDebugType(StorageClass storageClass, Id const baseType)\n{\n    const Id debugBaseType = debugId[baseType];\n    if (!debugBaseType) {\n        return makeDebugInfoNone();\n    }\n    const Id scID = makeUintConstant(storageClass);\n    for (Instruction* otherType : groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypePointer]) {\n        if (otherType->getIdOperand(2) == debugBaseType &&\n            otherType->getIdOperand(3) == scID) {\n            return otherType->getResultId();\n        }\n    }\n\n    Instruction* type = new Instruction(getUniqueId(), makeVoidType(), Op::OpExtInst);\n    type->reserveOperands(5);\n    type->addIdOperand(nonSemanticShaderDebugInfo);\n    type->addImmediateOperand(NonSemanticShaderDebugInfo100DebugTypePointer);\n    type->addIdOperand(debugBaseType);\n    type->addIdOperand(scID);\n    type->addIdOperand(makeUintConstant(0));\n\n    groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypePointer].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    return type->getResultId();\n}\n\n// Emit a OpExtInstWithForwardRefsKHR nonsemantic instruction for a pointer debug type\n// where we don't have the pointee yet. Since we don't have the pointee yet, it just\n// points to itself and we rely on patching it later.\nId Builder::makeForwardPointerDebugType(StorageClass storageClass)\n{\n    const Id scID = makeUintConstant(storageClass);\n\n    this->addExtension(spv::E_SPV_KHR_relaxed_extended_instruction);\n\n    Instruction *type = new Instruction(getUniqueId(), makeVoidType(), Op::OpExtInstWithForwardRefsKHR);\n    type->addIdOperand(nonSemanticShaderDebugInfo);\n    type->addImmediateOperand(NonSemanticShaderDebugInfo100DebugTypePointer);\n    type->addIdOperand(type->getResultId());\n    type->addIdOperand(scID);\n    type->addIdOperand(makeUintConstant(0));\n\n    groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypePointer].push_back(type);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n\n    return type->getResultId();\n}\n\nId Builder::makeDebugSource(const Id fileName) {\n    if (debugSourceId.find(fileName) != debugSourceId.end())\n        return debugSourceId[fileName];\n    spv::Id resultId = getUniqueId();\n    Instruction* sourceInst = new Instruction(resultId, makeVoidType(), Op::OpExtInst);\n    sourceInst->reserveOperands(3);\n    sourceInst->addIdOperand(nonSemanticShaderDebugInfo);\n    sourceInst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugSource);\n    sourceInst->addIdOperand(fileName);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(sourceInst));\n    module.mapInstruction(sourceInst);\n    if (emitNonSemanticShaderDebugSource) {\n        const int maxWordCount = 0xFFFF;\n        const int opSourceWordCount = 4;\n        const int nonNullBytesPerInstruction = 4 * (maxWordCount - opSourceWordCount) - 1;\n        auto processDebugSource = [&](std::string source) {\n            if (source.size() > 0) {\n                int nextByte = 0;\n                while ((int)source.size() - nextByte > 0) {\n                    auto subString = source.substr(nextByte, nonNullBytesPerInstruction);\n                    auto sourceId = getStringId(subString);\n                    if (nextByte == 0) {\n                        // DebugSource\n                        sourceInst->addIdOperand(sourceId);\n                    } else {\n                        // DebugSourceContinued\n                        Instruction* sourceContinuedInst = new Instruction(getUniqueId(), makeVoidType(), Op::OpExtInst);\n                        sourceContinuedInst->reserveOperands(2);\n                        sourceContinuedInst->addIdOperand(nonSemanticShaderDebugInfo);\n                        sourceContinuedInst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugSourceContinued);\n                        sourceContinuedInst->addIdOperand(sourceId);\n                        constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(sourceContinuedInst));\n                        module.mapInstruction(sourceContinuedInst);\n                    }\n                    nextByte += nonNullBytesPerInstruction;\n                }\n            } else {\n                auto sourceId = getStringId(source);\n                sourceInst->addIdOperand(sourceId);\n            }\n        };\n        if (fileName == mainFileId) {\n            processDebugSource(sourceText);\n        } else {\n            auto incItr = includeFiles.find(fileName);\n            if (incItr != includeFiles.end()) {\n                processDebugSource(*incItr->second);\n            } else {\n                // We omit the optional source text item if not available in glslang\n            }\n        }\n    }\n    debugSourceId[fileName] = resultId;\n    return resultId;\n}\n\nId Builder::makeDebugCompilationUnit() {\n    if (nonSemanticShaderCompilationUnitId != 0)\n        return nonSemanticShaderCompilationUnitId;\n    spv::Id resultId = getUniqueId();\n    Instruction* sourceInst = new Instruction(resultId, makeVoidType(), Op::OpExtInst);\n    sourceInst->reserveOperands(6);\n    sourceInst->addIdOperand(nonSemanticShaderDebugInfo);\n    sourceInst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugCompilationUnit);\n    sourceInst->addIdOperand(makeUintConstant(1)); // TODO(greg-lunarg): Get rid of magic number\n    sourceInst->addIdOperand(makeUintConstant(4)); // TODO(greg-lunarg): Get rid of magic number\n    sourceInst->addIdOperand(makeDebugSource(mainFileId));\n    sourceInst->addIdOperand(makeUintConstant(sourceLang));\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(sourceInst));\n    module.mapInstruction(sourceInst);\n    nonSemanticShaderCompilationUnitId = resultId;\n\n    // We can reasonably assume that makeDebugCompilationUnit will be called before any of\n    // debug-scope stack. Function scopes and lexical scopes will occur afterward.\n    assert(currentDebugScopeId.empty());\n    currentDebugScopeId.push(nonSemanticShaderCompilationUnitId);\n\n    return resultId;\n}\n\nId Builder::createDebugGlobalVariable(Id const type, char const*const name, Id const variable)\n{\n    assert(type != 0);\n\n    Instruction* inst = new Instruction(getUniqueId(), makeVoidType(), Op::OpExtInst);\n    inst->reserveOperands(11);\n    inst->addIdOperand(nonSemanticShaderDebugInfo);\n    inst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugGlobalVariable);\n    inst->addIdOperand(getStringId(name)); // name id\n    inst->addIdOperand(type); // type id\n    inst->addIdOperand(makeDebugSource(currentFileId)); // source id\n    inst->addIdOperand(makeUintConstant(currentLine)); // line id TODO: currentLine always zero?\n    inst->addIdOperand(makeUintConstant(0)); // TODO: column id\n    inst->addIdOperand(makeDebugCompilationUnit()); // scope id\n    inst->addIdOperand(getStringId(name)); // linkage name id\n    inst->addIdOperand(variable); // variable id\n    inst->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100FlagIsDefinition)); // flags id\n\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(inst));\n    module.mapInstruction(inst);\n\n    return inst->getResultId();\n}\n\nId Builder::createDebugLocalVariable(Id type, char const*const name, size_t const argNumber)\n{\n    assert(name != nullptr);\n    assert(!currentDebugScopeId.empty());\n\n    Instruction* inst = new Instruction(getUniqueId(), makeVoidType(), Op::OpExtInst);\n    inst->reserveOperands(9);\n    inst->addIdOperand(nonSemanticShaderDebugInfo);\n    inst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugLocalVariable);\n    inst->addIdOperand(getStringId(name)); // name id\n    inst->addIdOperand(type); // type id\n    inst->addIdOperand(makeDebugSource(currentFileId)); // source id\n    inst->addIdOperand(makeUintConstant(currentLine)); // line id\n    inst->addIdOperand(makeUintConstant(0)); // TODO: column id\n    inst->addIdOperand(currentDebugScopeId.top()); // scope id\n    inst->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100FlagIsLocal)); // flags id\n    if(argNumber != 0) {\n        inst->addIdOperand(makeUintConstant(argNumber));\n    }\n\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(inst));\n    module.mapInstruction(inst);\n\n    return inst->getResultId();\n}\n\nId Builder::makeDebugExpression()\n{\n    if (debugExpression != 0)\n        return debugExpression;\n\n    Instruction* inst = new Instruction(getUniqueId(), makeVoidType(), Op::OpExtInst);\n    inst->reserveOperands(2);\n    inst->addIdOperand(nonSemanticShaderDebugInfo);\n    inst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugExpression);\n\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(inst));\n    module.mapInstruction(inst);\n\n    debugExpression = inst->getResultId();\n\n    return debugExpression;\n}\n\nId Builder::makeDebugDeclare(Id const debugLocalVariable, Id const pointer)\n{\n    Instruction* inst = new Instruction(getUniqueId(), makeVoidType(), Op::OpExtInst);\n    inst->reserveOperands(5);\n    inst->addIdOperand(nonSemanticShaderDebugInfo);\n    inst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugDeclare);\n    inst->addIdOperand(debugLocalVariable); // debug local variable id\n    inst->addIdOperand(pointer); // pointer to local variable id\n    inst->addIdOperand(makeDebugExpression()); // expression id\n    addInstruction(std::unique_ptr<Instruction>(inst));\n\n    return inst->getResultId();\n}\n\nId Builder::makeDebugValue(Id const debugLocalVariable, Id const value)\n{\n    Instruction* inst = new Instruction(getUniqueId(), makeVoidType(), Op::OpExtInst);\n    inst->reserveOperands(5);\n    inst->addIdOperand(nonSemanticShaderDebugInfo);\n    inst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugValue);\n    inst->addIdOperand(debugLocalVariable); // debug local variable id\n    inst->addIdOperand(value); // value of local variable id\n    inst->addIdOperand(makeDebugExpression()); // expression id\n    addInstruction(std::unique_ptr<Instruction>(inst));\n\n    return inst->getResultId();\n}\n\nId Builder::makeAccelerationStructureType()\n{\n    Instruction *type;\n    if (groupedTypes[enumCast(Op::OpTypeAccelerationStructureKHR)].size() == 0) {\n        type = new Instruction(getUniqueId(), NoType, Op::OpTypeAccelerationStructureKHR);\n        groupedTypes[enumCast(Op::OpTypeAccelerationStructureKHR)].push_back(type);\n        constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n        module.mapInstruction(type);\n        if (emitNonSemanticShaderDebugInfo) {\n            spv::Id debugType = makeCompositeDebugType({}, \"accelerationStructure\", NonSemanticShaderDebugInfo100Structure, true);\n            debugId[type->getResultId()] = debugType;\n        }\n    } else {\n        type = groupedTypes[enumCast(Op::OpTypeAccelerationStructureKHR)].back();\n    }\n\n    return type->getResultId();\n}\n\nId Builder::makeRayQueryType()\n{\n    Instruction *type;\n    if (groupedTypes[enumCast(Op::OpTypeRayQueryKHR)].size() == 0) {\n        type = new Instruction(getUniqueId(), NoType, Op::OpTypeRayQueryKHR);\n        groupedTypes[enumCast(Op::OpTypeRayQueryKHR)].push_back(type);\n        constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n        module.mapInstruction(type);\n        if (emitNonSemanticShaderDebugInfo) {\n            spv::Id debugType = makeCompositeDebugType({}, \"rayQuery\", NonSemanticShaderDebugInfo100Structure, true);\n            debugId[type->getResultId()] = debugType;\n        }\n    } else {\n        type = groupedTypes[enumCast(Op::OpTypeRayQueryKHR)].back();\n    }\n\n    return type->getResultId();\n}\n\nId Builder::makeHitObjectNVType()\n{\n    Instruction *type;\n    if (groupedTypes[enumCast(Op::OpTypeHitObjectNV)].size() == 0) {\n        type = new Instruction(getUniqueId(), NoType, Op::OpTypeHitObjectNV);\n        groupedTypes[enumCast(Op::OpTypeHitObjectNV)].push_back(type);\n        constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n        module.mapInstruction(type);\n    } else {\n        type = groupedTypes[enumCast(Op::OpTypeHitObjectNV)].back();\n    }\n\n    return type->getResultId();\n}\n\nId Builder::getDerefTypeId(Id resultId) const\n{\n    Id typeId = getTypeId(resultId);\n    assert(isPointerType(typeId));\n\n    return module.getInstruction(typeId)->getIdOperand(1);\n}\n\nOp Builder::getMostBasicTypeClass(Id typeId) const\n{\n    Instruction* instr = module.getInstruction(typeId);\n\n    Op typeClass = instr->getOpCode();\n    switch (typeClass)\n    {\n    case Op::OpTypeVector:\n    case Op::OpTypeMatrix:\n    case Op::OpTypeArray:\n    case Op::OpTypeRuntimeArray:\n        return getMostBasicTypeClass(instr->getIdOperand(0));\n    case Op::OpTypePointer:\n        return getMostBasicTypeClass(instr->getIdOperand(1));\n    default:\n        return typeClass;\n    }\n}\n\nunsigned int Builder::getNumTypeConstituents(Id typeId) const\n{\n    Instruction* instr = module.getInstruction(typeId);\n\n    switch (instr->getOpCode())\n    {\n    case Op::OpTypeBool:\n    case Op::OpTypeInt:\n    case Op::OpTypeFloat:\n    case Op::OpTypePointer:\n        return 1;\n    case Op::OpTypeVector:\n    case Op::OpTypeMatrix:\n        return instr->getImmediateOperand(1);\n    case Op::OpTypeCooperativeVectorNV:\n    case Op::OpTypeArray:\n    {\n        Id lengthId = instr->getIdOperand(1);\n        return module.getInstruction(lengthId)->getImmediateOperand(0);\n    }\n    case Op::OpTypeStruct:\n        return instr->getNumOperands();\n    case Op::OpTypeCooperativeMatrixKHR:\n    case Op::OpTypeCooperativeMatrixNV:\n        // has only one constituent when used with OpCompositeConstruct.\n        return 1;\n    default:\n        assert(0);\n        return 1;\n    }\n}\n\n// Return the lowest-level type of scalar that an homogeneous composite is made out of.\n// Typically, this is just to find out if something is made out of ints or floats.\n// However, it includes returning a structure, if say, it is an array of structure.\nId Builder::getScalarTypeId(Id typeId) const\n{\n    Instruction* instr = module.getInstruction(typeId);\n\n    Op typeClass = instr->getOpCode();\n    switch (typeClass)\n    {\n    case Op::OpTypeVoid:\n    case Op::OpTypeBool:\n    case Op::OpTypeInt:\n    case Op::OpTypeFloat:\n    case Op::OpTypeStruct:\n        return instr->getResultId();\n    case Op::OpTypeVector:\n    case Op::OpTypeMatrix:\n    case Op::OpTypeArray:\n    case Op::OpTypeRuntimeArray:\n    case Op::OpTypePointer:\n    case Op::OpTypeCooperativeVectorNV:\n        return getScalarTypeId(getContainedTypeId(typeId));\n    default:\n        assert(0);\n        return NoResult;\n    }\n}\n\n// Return the type of 'member' of a composite.\nId Builder::getContainedTypeId(Id typeId, int member) const\n{\n    Instruction* instr = module.getInstruction(typeId);\n\n    Op typeClass = instr->getOpCode();\n    switch (typeClass)\n    {\n    case Op::OpTypeVector:\n    case Op::OpTypeMatrix:\n    case Op::OpTypeArray:\n    case Op::OpTypeRuntimeArray:\n    case Op::OpTypeCooperativeMatrixKHR:\n    case Op::OpTypeCooperativeMatrixNV:\n    case Op::OpTypeCooperativeVectorNV:\n        return instr->getIdOperand(0);\n    case Op::OpTypePointer:\n        return instr->getIdOperand(1);\n    case Op::OpTypeStruct:\n        return instr->getIdOperand(member);\n    default:\n        assert(0);\n        return NoResult;\n    }\n}\n\n// Figure out the final resulting type of the access chain.\nId Builder::getResultingAccessChainType() const\n{\n    assert(accessChain.base != NoResult);\n    Id typeId = getTypeId(accessChain.base);\n\n    assert(isPointerType(typeId));\n    typeId = getContainedTypeId(typeId);\n\n    for (int i = 0; i < (int)accessChain.indexChain.size(); ++i) {\n        if (isStructType(typeId)) {\n            assert(isConstantScalar(accessChain.indexChain[i]));\n            typeId = getContainedTypeId(typeId, getConstantScalar(accessChain.indexChain[i]));\n        } else\n            typeId = getContainedTypeId(typeId, accessChain.indexChain[i]);\n    }\n\n    return typeId;\n}\n\n// Return the immediately contained type of a given composite type.\nId Builder::getContainedTypeId(Id typeId) const\n{\n    return getContainedTypeId(typeId, 0);\n}\n\n// Returns true if 'typeId' is or contains a scalar type declared with 'typeOp'\n// of width 'width'. The 'width' is only consumed for int and float types.\n// Returns false otherwise.\nbool Builder::containsType(Id typeId, spv::Op typeOp, unsigned int width) const\n{\n    const Instruction& instr = *module.getInstruction(typeId);\n\n    Op typeClass = instr.getOpCode();\n    switch (typeClass)\n    {\n    case Op::OpTypeInt:\n    case Op::OpTypeFloat:\n        return typeClass == typeOp && instr.getImmediateOperand(0) == width;\n    case Op::OpTypeStruct:\n        for (int m = 0; m < instr.getNumOperands(); ++m) {\n            if (containsType(instr.getIdOperand(m), typeOp, width))\n                return true;\n        }\n        return false;\n    case Op::OpTypePointer:\n        return false;\n    case Op::OpTypeVector:\n    case Op::OpTypeMatrix:\n    case Op::OpTypeArray:\n    case Op::OpTypeRuntimeArray:\n        return containsType(getContainedTypeId(typeId), typeOp, width);\n    default:\n        return typeClass == typeOp;\n    }\n}\n\n// return true if the type is a pointer to PhysicalStorageBufferEXT or an\n// contains such a pointer. These require restrict/aliased decorations.\nbool Builder::containsPhysicalStorageBufferOrArray(Id typeId) const\n{\n    const Instruction& instr = *module.getInstruction(typeId);\n\n    Op typeClass = instr.getOpCode();\n    switch (typeClass)\n    {\n    case Op::OpTypePointer:\n        return getTypeStorageClass(typeId) == StorageClass::PhysicalStorageBufferEXT;\n    case Op::OpTypeArray:\n        return containsPhysicalStorageBufferOrArray(getContainedTypeId(typeId));\n    case Op::OpTypeStruct:\n        for (int m = 0; m < instr.getNumOperands(); ++m) {\n            if (containsPhysicalStorageBufferOrArray(instr.getIdOperand(m)))\n                return true;\n        }\n        return false;\n    default:\n        return false;\n    }\n}\n\n// See if a scalar constant of this type has already been created, so it\n// can be reused rather than duplicated.  (Required by the specification).\nId Builder::findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned value)\n{\n    Instruction* constant;\n    for (int i = 0; i < (int)groupedConstants[enumCast(typeClass)].size(); ++i) {\n        constant = groupedConstants[enumCast(typeClass)][i];\n        if (constant->getOpCode() == opcode &&\n            constant->getTypeId() == typeId &&\n            constant->getImmediateOperand(0) == value)\n            return constant->getResultId();\n    }\n\n    return 0;\n}\n\n// Version of findScalarConstant (see above) for scalars that take two operands (e.g. a 'double' or 'int64').\nId Builder::findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned v1, unsigned v2)\n{\n    Instruction* constant;\n    for (int i = 0; i < (int)groupedConstants[enumCast(typeClass)].size(); ++i) {\n        constant = groupedConstants[enumCast(typeClass)][i];\n        if (constant->getOpCode() == opcode &&\n            constant->getTypeId() == typeId &&\n            constant->getImmediateOperand(0) == v1 &&\n            constant->getImmediateOperand(1) == v2)\n            return constant->getResultId();\n    }\n\n    return 0;\n}\n\n// Return true if consuming 'opcode' means consuming a constant.\n// \"constant\" here means after final transform to executable code,\n// the value consumed will be a constant, so includes specialization.\nbool Builder::isConstantOpCode(Op opcode) const\n{\n    switch (opcode) {\n    case Op::OpUndef:\n    case Op::OpConstantTrue:\n    case Op::OpConstantFalse:\n    case Op::OpConstant:\n    case Op::OpConstantComposite:\n    case Op::OpConstantCompositeReplicateEXT:\n    case Op::OpConstantSampler:\n    case Op::OpConstantNull:\n    case Op::OpSpecConstantTrue:\n    case Op::OpSpecConstantFalse:\n    case Op::OpSpecConstant:\n    case Op::OpSpecConstantComposite:\n    case Op::OpSpecConstantCompositeReplicateEXT:\n    case Op::OpSpecConstantOp:\n        return true;\n    default:\n        return false;\n    }\n}\n\n// Return true if consuming 'opcode' means consuming a specialization constant.\nbool Builder::isSpecConstantOpCode(Op opcode) const\n{\n    switch (opcode) {\n    case Op::OpSpecConstantTrue:\n    case Op::OpSpecConstantFalse:\n    case Op::OpSpecConstant:\n    case Op::OpSpecConstantComposite:\n    case Op::OpSpecConstantOp:\n    case Op::OpSpecConstantCompositeReplicateEXT:\n        return true;\n    default:\n        return false;\n    }\n}\n\nId Builder::makeNullConstant(Id typeId)\n{\n    Instruction* constant;\n\n    // See if we already made it.\n    Id existing = NoResult;\n    for (int i = 0; i < (int)nullConstants.size(); ++i) {\n        constant = nullConstants[i];\n        if (constant->getTypeId() == typeId)\n            existing = constant->getResultId();\n    }\n\n    if (existing != NoResult)\n        return existing;\n\n    // Make it\n    Instruction* c = new Instruction(getUniqueId(), typeId, Op::OpConstantNull);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(c));\n    nullConstants.push_back(c);\n    module.mapInstruction(c);\n\n    return c->getResultId();\n}\n\nId Builder::makeBoolConstant(bool b, bool specConstant)\n{\n    Id typeId = makeBoolType();\n    Instruction* constant;\n    Op opcode = specConstant ? (b ? Op::OpSpecConstantTrue : Op::OpSpecConstantFalse) : (b ? Op::OpConstantTrue : Op::OpConstantFalse);\n\n    // See if we already made it. Applies only to regular constants, because specialization constants\n    // must remain distinct for the purpose of applying a SpecId decoration.\n    if (! specConstant) {\n        Id existing = 0;\n        for (int i = 0; i < (int)groupedConstants[enumCast(Op::OpTypeBool)].size(); ++i) {\n            constant = groupedConstants[enumCast(Op::OpTypeBool)][i];\n            if (constant->getTypeId() == typeId && constant->getOpCode() == opcode)\n                existing = constant->getResultId();\n        }\n\n        if (existing)\n            return existing;\n    }\n\n    // Make it\n    Instruction* c = new Instruction(getUniqueId(), typeId, opcode);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(c));\n    groupedConstants[enumCast(Op::OpTypeBool)].push_back(c);\n    module.mapInstruction(c);\n\n    return c->getResultId();\n}\n\nId Builder::makeIntConstant(Id typeId, unsigned value, bool specConstant)\n{\n    Op opcode = specConstant ? Op::OpSpecConstant : Op::OpConstant;\n\n    // See if we already made it. Applies only to regular constants, because specialization constants\n    // must remain distinct for the purpose of applying a SpecId decoration.\n    if (! specConstant) {\n        Id existing = findScalarConstant(Op::OpTypeInt, opcode, typeId, value);\n        if (existing)\n            return existing;\n    }\n\n    Instruction* c = new Instruction(getUniqueId(), typeId, opcode);\n    c->addImmediateOperand(value);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(c));\n    groupedConstants[enumCast(Op::OpTypeInt)].push_back(c);\n    module.mapInstruction(c);\n\n    return c->getResultId();\n}\n\nId Builder::makeInt64Constant(Id typeId, unsigned long long value, bool specConstant)\n{\n    Op opcode = specConstant ? Op::OpSpecConstant : Op::OpConstant;\n\n    unsigned op1 = value & 0xFFFFFFFF;\n    unsigned op2 = value >> 32;\n\n    // See if we already made it. Applies only to regular constants, because specialization constants\n    // must remain distinct for the purpose of applying a SpecId decoration.\n    if (! specConstant) {\n        Id existing = findScalarConstant(Op::OpTypeInt, opcode, typeId, op1, op2);\n        if (existing)\n            return existing;\n    }\n\n    Instruction* c = new Instruction(getUniqueId(), typeId, opcode);\n    c->reserveOperands(2);\n    c->addImmediateOperand(op1);\n    c->addImmediateOperand(op2);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(c));\n    groupedConstants[enumCast(Op::OpTypeInt)].push_back(c);\n    module.mapInstruction(c);\n\n    return c->getResultId();\n}\n\nId Builder::makeFloatConstant(float f, bool specConstant)\n{\n    Op opcode = specConstant ? Op::OpSpecConstant : Op::OpConstant;\n    Id typeId = makeFloatType(32);\n    union { float fl; unsigned int ui; } u;\n    u.fl = f;\n    unsigned value = u.ui;\n\n    // See if we already made it. Applies only to regular constants, because specialization constants\n    // must remain distinct for the purpose of applying a SpecId decoration.\n    if (! specConstant) {\n        Id existing = findScalarConstant(Op::OpTypeFloat, opcode, typeId, value);\n        if (existing)\n            return existing;\n    }\n\n    Instruction* c = new Instruction(getUniqueId(), typeId, opcode);\n    c->addImmediateOperand(value);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(c));\n    groupedConstants[enumCast(Op::OpTypeFloat)].push_back(c);\n    module.mapInstruction(c);\n\n    return c->getResultId();\n}\n\nId Builder::makeDoubleConstant(double d, bool specConstant)\n{\n    Op opcode = specConstant ? Op::OpSpecConstant : Op::OpConstant;\n    Id typeId = makeFloatType(64);\n    union { double db; unsigned long long ull; } u;\n    u.db = d;\n    unsigned long long value = u.ull;\n    unsigned op1 = value & 0xFFFFFFFF;\n    unsigned op2 = value >> 32;\n\n    // See if we already made it. Applies only to regular constants, because specialization constants\n    // must remain distinct for the purpose of applying a SpecId decoration.\n    if (! specConstant) {\n        Id existing = findScalarConstant(Op::OpTypeFloat, opcode, typeId, op1, op2);\n        if (existing)\n            return existing;\n    }\n\n    Instruction* c = new Instruction(getUniqueId(), typeId, opcode);\n    c->reserveOperands(2);\n    c->addImmediateOperand(op1);\n    c->addImmediateOperand(op2);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(c));\n    groupedConstants[enumCast(Op::OpTypeFloat)].push_back(c);\n    module.mapInstruction(c);\n\n    return c->getResultId();\n}\n\nId Builder::makeFloat16Constant(float f16, bool specConstant)\n{\n    Op opcode = specConstant ? Op::OpSpecConstant : Op::OpConstant;\n    Id typeId = makeFloatType(16);\n\n    spvutils::HexFloat<spvutils::FloatProxy<float>> fVal(f16);\n    spvutils::HexFloat<spvutils::FloatProxy<spvutils::Float16>> f16Val(0);\n    fVal.castTo(f16Val, spvutils::kRoundToZero);\n\n    unsigned value = f16Val.value().getAsFloat().get_value();\n\n    // See if we already made it. Applies only to regular constants, because specialization constants\n    // must remain distinct for the purpose of applying a SpecId decoration.\n    if (!specConstant) {\n        Id existing = findScalarConstant(Op::OpTypeFloat, opcode, typeId, value);\n        if (existing)\n            return existing;\n    }\n\n    Instruction* c = new Instruction(getUniqueId(), typeId, opcode);\n    c->addImmediateOperand(value);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(c));\n    groupedConstants[enumCast(Op::OpTypeFloat)].push_back(c);\n    module.mapInstruction(c);\n\n    return c->getResultId();\n}\n\nId Builder::makeBFloat16Constant(float bf16, bool specConstant)\n{\n    Op opcode = specConstant ? Op::OpSpecConstant : Op::OpConstant;\n    Id typeId = makeBFloat16Type();\n\n    union {\n        float f;\n        uint32_t u;\n    } un;\n    un.f = bf16;\n\n    // take high 16b of fp32 value. This is effectively round-to-zero, other than certain NaNs.\n    unsigned value = un.u >> 16;\n\n    // See if we already made it. Applies only to regular constants, because specialization constants\n    // must remain distinct for the purpose of applying a SpecId decoration.\n    if (!specConstant) {\n        Id existing = findScalarConstant(Op::OpTypeFloat, opcode, typeId, value);\n        if (existing)\n            return existing;\n    }\n\n    Instruction* c = new Instruction(getUniqueId(), typeId, opcode);\n    c->addImmediateOperand(value);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(c));\n    groupedConstants[enumCast(Op::OpTypeFloat)].push_back(c);\n    module.mapInstruction(c);\n\n    return c->getResultId();\n}\n\nId Builder::makeFloatE5M2Constant(float fe5m2, bool specConstant)\n{\n    Op opcode = specConstant ? Op::OpSpecConstant : Op::OpConstant;\n    Id typeId = makeFloatE5M2Type();\n\n    spvutils::HexFloat<spvutils::FloatProxy<float>> fVal(fe5m2);\n    spvutils::HexFloat<spvutils::FloatProxy<spvutils::FloatE5M2>> fe5m2Val(0);\n    fVal.castTo(fe5m2Val, spvutils::kRoundToZero);\n\n    unsigned value = fe5m2Val.value().getAsFloat().get_value();\n\n    // See if we already made it. Applies only to regular constants, because specialization constants\n    // must remain distinct for the purpose of applying a SpecId decoration.\n    if (!specConstant) {\n        Id existing = findScalarConstant(Op::OpTypeFloat, opcode, typeId, value);\n        if (existing)\n            return existing;\n    }\n\n    Instruction* c = new Instruction(getUniqueId(), typeId, opcode);\n    c->addImmediateOperand(value);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(c));\n    groupedConstants[enumCast(Op::OpTypeFloat)].push_back(c);\n    module.mapInstruction(c);\n\n    return c->getResultId();\n}\n\nId Builder::makeFloatE4M3Constant(float fe4m3, bool specConstant)\n{\n    Op opcode = specConstant ? Op::OpSpecConstant : Op::OpConstant;\n    Id typeId = makeFloatE4M3Type();\n\n    spvutils::HexFloat<spvutils::FloatProxy<float>> fVal(fe4m3);\n    spvutils::HexFloat<spvutils::FloatProxy<spvutils::FloatE4M3>> fe4m3Val(0);\n    fVal.castTo(fe4m3Val, spvutils::kRoundToZero);\n\n    unsigned value = fe4m3Val.value().getAsFloat().get_value();\n\n    // See if we already made it. Applies only to regular constants, because specialization constants\n    // must remain distinct for the purpose of applying a SpecId decoration.\n    if (!specConstant) {\n        Id existing = findScalarConstant(Op::OpTypeFloat, opcode, typeId, value);\n        if (existing)\n            return existing;\n    }\n\n    Instruction* c = new Instruction(getUniqueId(), typeId, opcode);\n    c->addImmediateOperand(value);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(c));\n    groupedConstants[enumCast(Op::OpTypeFloat)].push_back(c);\n    module.mapInstruction(c);\n\n    return c->getResultId();\n}\n\nId Builder::makeFpConstant(Id type, double d, bool specConstant)\n{\n    const int width = getScalarTypeWidth(type);\n\n    assert(isFloatType(type));\n\n    switch (width) {\n    case 16:\n            return makeFloat16Constant((float)d, specConstant);\n    case 32:\n            return makeFloatConstant((float)d, specConstant);\n    case 64:\n            return makeDoubleConstant(d, specConstant);\n    default:\n            break;\n    }\n\n    assert(false);\n    return NoResult;\n}\n\nId Builder::importNonSemanticShaderDebugInfoInstructions()\n{\n    assert(emitNonSemanticShaderDebugInfo == true);\n\n    if(nonSemanticShaderDebugInfo == 0)\n    {\n        this->addExtension(spv::E_SPV_KHR_non_semantic_info);\n        nonSemanticShaderDebugInfo = this->import(\"NonSemantic.Shader.DebugInfo.100\");\n    }\n\n    return nonSemanticShaderDebugInfo;\n}\n\nId Builder::findCompositeConstant(Op typeClass, Op opcode, Id typeId, const std::vector<Id>& comps, size_t numMembers)\n{\n    Instruction* constant = nullptr;\n    bool found = false;\n    for (int i = 0; i < (int)groupedConstants[enumCast(typeClass)].size(); ++i) {\n        constant = groupedConstants[enumCast(typeClass)][i];\n\n        if (constant->getTypeId() != typeId)\n            continue;\n\n        if (constant->getOpCode() != opcode) {\n            continue;\n        }\n\n        if (constant->getNumOperands() != (int)numMembers)\n            continue;\n\n        // same contents?\n        bool mismatch = false;\n        for (int op = 0; op < constant->getNumOperands(); ++op) {\n            if (constant->getIdOperand(op) != comps[op]) {\n                mismatch = true;\n                break;\n            }\n        }\n        if (! mismatch) {\n            found = true;\n            break;\n        }\n    }\n\n    return found ? constant->getResultId() : NoResult;\n}\n\nId Builder::findStructConstant(Id typeId, const std::vector<Id>& comps)\n{\n    Instruction* constant = nullptr;\n    bool found = false;\n    for (int i = 0; i < (int)groupedStructConstants[typeId].size(); ++i) {\n        constant = groupedStructConstants[typeId][i];\n\n        // same contents?\n        bool mismatch = false;\n        for (int op = 0; op < constant->getNumOperands(); ++op) {\n            if (constant->getIdOperand(op) != comps[op]) {\n                mismatch = true;\n                break;\n            }\n        }\n        if (! mismatch) {\n            found = true;\n            break;\n        }\n    }\n\n    return found ? constant->getResultId() : NoResult;\n}\n\n// Comments in header\nId Builder::makeCompositeConstant(Id typeId, const std::vector<Id>& members, bool specConstant)\n{\n    assert(typeId);\n    Op typeClass = getTypeClass(typeId);\n\n    bool replicate = false;\n    size_t numMembers = members.size();\n    if (useReplicatedComposites || typeClass == Op::OpTypeCooperativeVectorNV) {\n        // use replicate if all members are the same\n        replicate = numMembers > 0 &&\n            std::equal(members.begin() + 1, members.end(), members.begin());\n\n        if (replicate) {\n            numMembers = 1;\n            addCapability(spv::Capability::ReplicatedCompositesEXT);\n            addExtension(spv::E_SPV_EXT_replicated_composites);\n        }\n    }\n\n    Op opcode = replicate ?\n        (specConstant ? Op::OpSpecConstantCompositeReplicateEXT : Op::OpConstantCompositeReplicateEXT) :\n        (specConstant ? Op::OpSpecConstantComposite : Op::OpConstantComposite);\n\n    switch (typeClass) {\n    case Op::OpTypeVector:\n    case Op::OpTypeArray:\n    case Op::OpTypeMatrix:\n    case Op::OpTypeCooperativeMatrixKHR:\n    case Op::OpTypeCooperativeMatrixNV:\n    case Op::OpTypeCooperativeVectorNV:\n        if (! specConstant) {\n            Id existing = findCompositeConstant(typeClass, opcode, typeId, members, numMembers);\n            if (existing)\n                return existing;\n        }\n        break;\n    case Op::OpTypeStruct:\n        if (! specConstant) {\n            Id existing = findStructConstant(typeId, members);\n            if (existing)\n                return existing;\n        }\n        break;\n    default:\n        assert(0);\n        return makeFloatConstant(0.0);\n    }\n\n    Instruction* c = new Instruction(getUniqueId(), typeId, opcode);\n    c->reserveOperands(members.size());\n    for (size_t op = 0; op < numMembers; ++op)\n        c->addIdOperand(members[op]);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(c));\n    if (typeClass == Op::OpTypeStruct)\n        groupedStructConstants[typeId].push_back(c);\n    else\n        groupedConstants[enumCast(typeClass)].push_back(c);\n    module.mapInstruction(c);\n\n    return c->getResultId();\n}\n\nInstruction* Builder::addEntryPoint(ExecutionModel model, Function* function, const char* name)\n{\n    Instruction* entryPoint = new Instruction(Op::OpEntryPoint);\n    entryPoint->reserveOperands(3);\n    entryPoint->addImmediateOperand(model);\n    entryPoint->addIdOperand(function->getId());\n    entryPoint->addStringOperand(name);\n\n    entryPoints.push_back(std::unique_ptr<Instruction>(entryPoint));\n\n    return entryPoint;\n}\n\n// Currently relying on the fact that all 'value' of interest are small non-negative values.\nvoid Builder::addExecutionMode(Function* entryPoint, ExecutionMode mode, int value1, int value2, int value3)\n{\n    // entryPoint can be null if we are in compile-only mode\n    if (!entryPoint)\n        return;\n\n    Instruction* instr = new Instruction(Op::OpExecutionMode);\n    instr->reserveOperands(3);\n    instr->addIdOperand(entryPoint->getId());\n    instr->addImmediateOperand(mode);\n    if (value1 >= 0)\n        instr->addImmediateOperand(value1);\n    if (value2 >= 0)\n        instr->addImmediateOperand(value2);\n    if (value3 >= 0)\n        instr->addImmediateOperand(value3);\n\n    executionModes.push_back(std::unique_ptr<Instruction>(instr));\n}\n\nvoid Builder::addExecutionMode(Function* entryPoint, ExecutionMode mode, const std::vector<unsigned>& literals)\n{\n    // entryPoint can be null if we are in compile-only mode\n    if (!entryPoint)\n        return;\n\n    Instruction* instr = new Instruction(Op::OpExecutionMode);\n    instr->reserveOperands(literals.size() + 2);\n    instr->addIdOperand(entryPoint->getId());\n    instr->addImmediateOperand(mode);\n    for (auto literal : literals)\n        instr->addImmediateOperand(literal);\n\n    executionModes.push_back(std::unique_ptr<Instruction>(instr));\n}\n\nvoid Builder::addExecutionModeId(Function* entryPoint, ExecutionMode mode, const std::vector<Id>& operandIds)\n{\n    // entryPoint can be null if we are in compile-only mode\n    if (!entryPoint)\n        return;\n\n    Instruction* instr = new Instruction(Op::OpExecutionModeId);\n    instr->reserveOperands(operandIds.size() + 2);\n    instr->addIdOperand(entryPoint->getId());\n    instr->addImmediateOperand(mode);\n    for (auto operandId : operandIds)\n        instr->addIdOperand(operandId);\n\n    executionModes.push_back(std::unique_ptr<Instruction>(instr));\n}\n\nvoid Builder::addName(Id id, const char* string)\n{\n    Instruction* name = new Instruction(Op::OpName);\n    name->reserveOperands(2);\n    name->addIdOperand(id);\n    name->addStringOperand(string);\n\n    names.push_back(std::unique_ptr<Instruction>(name));\n}\n\nvoid Builder::addMemberName(Id id, int memberNumber, const char* string)\n{\n    Instruction* name = new Instruction(Op::OpMemberName);\n    name->reserveOperands(3);\n    name->addIdOperand(id);\n    name->addImmediateOperand(memberNumber);\n    name->addStringOperand(string);\n\n    names.push_back(std::unique_ptr<Instruction>(name));\n}\n\nvoid Builder::addDecoration(Id id, Decoration decoration, int num)\n{\n    if (decoration == spv::Decoration::Max)\n        return;\n\n    Instruction* dec = new Instruction(Op::OpDecorate);\n    dec->reserveOperands(2);\n    dec->addIdOperand(id);\n    dec->addImmediateOperand(decoration);\n    if (num >= 0)\n        dec->addImmediateOperand(num);\n\n    decorations.insert(std::unique_ptr<Instruction>(dec));\n}\n\nvoid Builder::addDecoration(Id id, Decoration decoration, const char* s)\n{\n    if (decoration == spv::Decoration::Max)\n        return;\n\n    Instruction* dec = new Instruction(Op::OpDecorateString);\n    dec->reserveOperands(3);\n    dec->addIdOperand(id);\n    dec->addImmediateOperand(decoration);\n    dec->addStringOperand(s);\n\n    decorations.insert(std::unique_ptr<Instruction>(dec));\n}\n\nvoid Builder::addDecoration(Id id, Decoration decoration, const std::vector<unsigned>& literals)\n{\n    if (decoration == spv::Decoration::Max)\n        return;\n\n    Instruction* dec = new Instruction(Op::OpDecorate);\n    dec->reserveOperands(literals.size() + 2);\n    dec->addIdOperand(id);\n    dec->addImmediateOperand(decoration);\n    for (auto literal : literals)\n        dec->addImmediateOperand(literal);\n\n    decorations.insert(std::unique_ptr<Instruction>(dec));\n}\n\nvoid Builder::addDecoration(Id id, Decoration decoration, const std::vector<const char*>& strings)\n{\n    if (decoration == spv::Decoration::Max)\n        return;\n\n    Instruction* dec = new Instruction(Op::OpDecorateString);\n    dec->reserveOperands(strings.size() + 2);\n    dec->addIdOperand(id);\n    dec->addImmediateOperand(decoration);\n    for (auto string : strings)\n        dec->addStringOperand(string);\n\n    decorations.insert(std::unique_ptr<Instruction>(dec));\n}\n\nvoid Builder::addLinkageDecoration(Id id, const char* name, spv::LinkageType linkType) {\n    Instruction* dec = new Instruction(Op::OpDecorate);\n    dec->reserveOperands(4);\n    dec->addIdOperand(id);\n    dec->addImmediateOperand(spv::Decoration::LinkageAttributes);\n    dec->addStringOperand(name);\n    dec->addImmediateOperand(linkType);\n\n    decorations.insert(std::unique_ptr<Instruction>(dec));\n}\n\nvoid Builder::addDecorationId(Id id, Decoration decoration, Id idDecoration)\n{\n    if (decoration == spv::Decoration::Max)\n        return;\n\n    Instruction* dec = new Instruction(Op::OpDecorateId);\n    dec->reserveOperands(3);\n    dec->addIdOperand(id);\n    dec->addImmediateOperand(decoration);\n    dec->addIdOperand(idDecoration);\n\n    decorations.insert(std::unique_ptr<Instruction>(dec));\n}\n\nvoid Builder::addDecorationId(Id id, Decoration decoration, const std::vector<Id>& operandIds)\n{\n    if(decoration == spv::Decoration::Max)\n        return;\n\n    Instruction* dec = new Instruction(Op::OpDecorateId);\n    dec->reserveOperands(operandIds.size() + 2);\n    dec->addIdOperand(id);\n    dec->addImmediateOperand(decoration);\n\n    for (auto operandId : operandIds)\n        dec->addIdOperand(operandId);\n\n    decorations.insert(std::unique_ptr<Instruction>(dec));\n}\n\nvoid Builder::addMemberDecoration(Id id, unsigned int member, Decoration decoration, int num)\n{\n    if (decoration == spv::Decoration::Max)\n        return;\n\n    Instruction* dec = new Instruction(Op::OpMemberDecorate);\n    dec->reserveOperands(3);\n    dec->addIdOperand(id);\n    dec->addImmediateOperand(member);\n    dec->addImmediateOperand(decoration);\n    if (num >= 0)\n        dec->addImmediateOperand(num);\n\n    decorations.insert(std::unique_ptr<Instruction>(dec));\n}\n\nvoid Builder::addMemberDecoration(Id id, unsigned int member, Decoration decoration, const char *s)\n{\n    if (decoration == spv::Decoration::Max)\n        return;\n\n    Instruction* dec = new Instruction(Op::OpMemberDecorateStringGOOGLE);\n    dec->reserveOperands(4);\n    dec->addIdOperand(id);\n    dec->addImmediateOperand(member);\n    dec->addImmediateOperand(decoration);\n    dec->addStringOperand(s);\n\n    decorations.insert(std::unique_ptr<Instruction>(dec));\n}\n\nvoid Builder::addMemberDecoration(Id id, unsigned int member, Decoration decoration, const std::vector<unsigned>& literals)\n{\n    if (decoration == spv::Decoration::Max)\n        return;\n\n    Instruction* dec = new Instruction(Op::OpMemberDecorate);\n    dec->reserveOperands(literals.size() + 3);\n    dec->addIdOperand(id);\n    dec->addImmediateOperand(member);\n    dec->addImmediateOperand(decoration);\n    for (auto literal : literals)\n        dec->addImmediateOperand(literal);\n\n    decorations.insert(std::unique_ptr<Instruction>(dec));\n}\n\nvoid Builder::addMemberDecoration(Id id, unsigned int member, Decoration decoration, const std::vector<const char*>& strings)\n{\n    if (decoration == spv::Decoration::Max)\n        return;\n\n    Instruction* dec = new Instruction(Op::OpMemberDecorateString);\n    dec->reserveOperands(strings.size() + 3);\n    dec->addIdOperand(id);\n    dec->addImmediateOperand(member);\n    dec->addImmediateOperand(decoration);\n    for (auto string : strings)\n        dec->addStringOperand(string);\n\n    decorations.insert(std::unique_ptr<Instruction>(dec));\n}\n\nvoid Builder::addInstruction(std::unique_ptr<Instruction> inst) {\n    // Phis must appear first in their block, don't insert line tracking instructions\n    // in front of them, just add the OpPhi and return.\n    if (inst->getOpCode() == Op::OpPhi) {\n        buildPoint->addInstruction(std::move(inst));\n        return;\n    }\n    // Optionally insert OpDebugScope\n    if (emitNonSemanticShaderDebugInfo && dirtyScopeTracker) {\n        if (buildPoint->updateDebugScope(currentDebugScopeId.top())) {\n            auto scopeInst = std::make_unique<Instruction>(getUniqueId(), makeVoidType(), Op::OpExtInst);\n            scopeInst->reserveOperands(3);\n            scopeInst->addIdOperand(nonSemanticShaderDebugInfo);\n            scopeInst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugScope);\n            scopeInst->addIdOperand(currentDebugScopeId.top());\n            buildPoint->addInstruction(std::move(scopeInst));\n        }\n\n        dirtyScopeTracker = false;\n    }\n\n    // Insert OpLine/OpDebugLine if the debug source location has changed\n    if (trackDebugInfo && dirtyLineTracker) {\n        if (buildPoint->updateDebugSourceLocation(currentLine, 0, currentFileId)) {\n            if (emitSpirvDebugInfo) {\n                auto lineInst = std::make_unique<Instruction>(Op::OpLine);\n                lineInst->reserveOperands(3);\n                lineInst->addIdOperand(currentFileId);\n                lineInst->addImmediateOperand(currentLine);\n                lineInst->addImmediateOperand(0);\n                buildPoint->addInstruction(std::move(lineInst));\n            }\n            if (emitNonSemanticShaderDebugInfo) {\n                auto lineInst = std::make_unique<Instruction>(getUniqueId(), makeVoidType(), Op::OpExtInst);\n                lineInst->reserveOperands(7);\n                lineInst->addIdOperand(nonSemanticShaderDebugInfo);\n                lineInst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugLine);\n                lineInst->addIdOperand(makeDebugSource(currentFileId));\n                lineInst->addIdOperand(makeUintConstant(currentLine));\n                lineInst->addIdOperand(makeUintConstant(currentLine));\n                lineInst->addIdOperand(makeUintConstant(0));\n                lineInst->addIdOperand(makeUintConstant(0));\n                buildPoint->addInstruction(std::move(lineInst));\n            }\n        }\n\n        dirtyLineTracker = false;\n    }\n\n    buildPoint->addInstruction(std::move(inst));\n}\n\nvoid Builder::addInstructionNoDebugInfo(std::unique_ptr<Instruction> inst) {\n    buildPoint->addInstruction(std::move(inst));\n}\n\n// Comments in header\nFunction* Builder::makeEntryPoint(const char* entryPoint)\n{\n    assert(! entryPointFunction);\n\n    auto const returnType = makeVoidType();\n\n    restoreNonSemanticShaderDebugInfo = emitNonSemanticShaderDebugInfo;\n    if(sourceLang == spv::SourceLanguage::HLSL) {\n        emitNonSemanticShaderDebugInfo = false;\n    }\n\n    Block* entry = nullptr;\n    entryPointFunction = makeFunctionEntry(NoPrecision, returnType, entryPoint, LinkageType::Max, {}, {}, &entry);\n\n    emitNonSemanticShaderDebugInfo = restoreNonSemanticShaderDebugInfo;\n\n    return entryPointFunction;\n}\n\n// Comments in header\nFunction* Builder::makeFunctionEntry(Decoration precision, Id returnType, const char* name, LinkageType linkType,\n                                     const std::vector<Id>& paramTypes,\n                                     const std::vector<std::vector<Decoration>>& decorations, Block** entry)\n{\n    // Make the function and initial instructions in it\n    Id typeId = makeFunctionType(returnType, paramTypes);\n    Id firstParamId = paramTypes.size() == 0 ? 0 : getUniqueIds((int)paramTypes.size());\n    Id funcId = getUniqueId();\n    Function* function = new Function(funcId, returnType, typeId, firstParamId, linkType, name, module);\n\n    // Set up the precisions\n    setPrecision(function->getId(), precision);\n    function->setReturnPrecision(precision);\n    for (unsigned p = 0; p < (unsigned)decorations.size(); ++p) {\n        for (int d = 0; d < (int)decorations[p].size(); ++d) {\n            addDecoration(firstParamId + p, decorations[p][d]);\n            function->addParamPrecision(p, decorations[p][d]);\n        }\n    }\n\n    // reset last debug scope\n    if (emitNonSemanticShaderDebugInfo) {\n        dirtyScopeTracker = true;\n    }\n\n    // CFG\n    assert(entry != nullptr);\n    *entry = new Block(getUniqueId(), *function);\n    function->addBlock(*entry);\n    setBuildPoint(*entry);\n\n    if (name)\n        addName(function->getId(), name);\n\n    functions.push_back(std::unique_ptr<Function>(function));\n\n    return function;\n}\n\nvoid Builder::setupFunctionDebugInfo(Function* function, const char* name, const std::vector<Id>& paramTypes,\n                                     const std::vector<char const*>& paramNames)\n{\n\n    if (!emitNonSemanticShaderDebugInfo)\n        return;\n\n    Id nameId = getStringId(unmangleFunctionName(name));\n    Id funcTypeId = function->getFuncTypeId();\n    assert(debugId[funcTypeId] != 0);\n    Id funcId = function->getId();\n\n    assert(funcId != 0);\n\n    // Make the debug function instruction\n    Id debugFuncId = makeDebugFunction(function, nameId, funcTypeId);\n    debugId[funcId] = debugFuncId;\n    currentDebugScopeId.push(debugFuncId);\n\n    // DebugScope and DebugLine for parameter DebugDeclares\n    assert(paramTypes.size() == paramNames.size());\n    if ((int)paramTypes.size() > 0) {\n        Id firstParamId = function->getParamId(0);\n\n        for (size_t p = 0; p < paramTypes.size(); ++p) {\n            bool passByRef = false;\n            Id paramTypeId = paramTypes[p];\n\n            // For pointer-typed parameters, they are actually passed by reference and we need unwrap the pointer to get the actual parameter type.\n            if (isPointerType(paramTypeId) || isArrayType(paramTypeId)) {\n                passByRef = true;\n                paramTypeId = getContainedTypeId(paramTypeId);\n            }\n\n            auto const& paramName = paramNames[p];\n            auto const debugLocalVariableId = createDebugLocalVariable(debugId[paramTypeId], paramName, p + 1);\n            auto const paramId = static_cast<Id>(firstParamId + p);\n            debugId[paramId] = debugLocalVariableId;\n\n            if (passByRef) {\n                makeDebugDeclare(debugLocalVariableId, paramId);\n            } else {\n                makeDebugValue(debugLocalVariableId, paramId);\n            }\n        }\n    }\n\n    // Clear debug scope stack\n    if (emitNonSemanticShaderDebugInfo)\n        currentDebugScopeId.pop();\n}\n\nId Builder::makeDebugFunction([[maybe_unused]] Function* function, Id nameId, Id funcTypeId)\n{\n    assert(function != nullptr);\n    assert(nameId != 0);\n    assert(funcTypeId != 0);\n    assert(debugId[funcTypeId] != 0);\n\n    Id funcId = getUniqueId();\n    auto type = new Instruction(funcId, makeVoidType(), Op::OpExtInst);\n    type->reserveOperands(11);\n    type->addIdOperand(nonSemanticShaderDebugInfo);\n    type->addImmediateOperand(NonSemanticShaderDebugInfo100DebugFunction);\n    type->addIdOperand(nameId);\n    type->addIdOperand(debugId[funcTypeId]);\n    type->addIdOperand(makeDebugSource(currentFileId)); // TODO: This points to file of definition instead of declaration\n    type->addIdOperand(makeUintConstant(currentLine)); // TODO: This points to line of definition instead of declaration\n    type->addIdOperand(makeUintConstant(0)); // column\n    type->addIdOperand(makeDebugCompilationUnit()); // scope\n    type->addIdOperand(nameId); // linkage name\n    type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100FlagIsPublic));\n    type->addIdOperand(makeUintConstant(currentLine)); \n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));\n    module.mapInstruction(type);\n    return funcId;\n}\n\nId Builder::makeDebugLexicalBlock(uint32_t line, uint32_t column) {\n    assert(!currentDebugScopeId.empty());\n\n    Id lexId = getUniqueId();\n    auto lex = new Instruction(lexId, makeVoidType(), Op::OpExtInst);\n    lex->reserveOperands(6);\n    lex->addIdOperand(nonSemanticShaderDebugInfo);\n    lex->addImmediateOperand(NonSemanticShaderDebugInfo100DebugLexicalBlock);\n    lex->addIdOperand(makeDebugSource(currentFileId));\n    lex->addIdOperand(makeUintConstant(line));\n    lex->addIdOperand(makeUintConstant(column)); // column\n    lex->addIdOperand(currentDebugScopeId.top()); // scope\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(lex));\n    module.mapInstruction(lex);\n    return lexId;\n}\n\nstd::string Builder::unmangleFunctionName(std::string const& name) const\n{\n    assert(name.length() > 0);\n\n    if(name.rfind('(') != std::string::npos) {\n        return name.substr(0, name.rfind('('));\n    } else {\n        return name;\n    }\n}\n\n// Comments in header\nvoid Builder::makeReturn(bool implicit, Id retVal)\n{\n    if (retVal) {\n        Instruction* inst = new Instruction(NoResult, NoType, Op::OpReturnValue);\n        inst->addIdOperand(retVal);\n        addInstruction(std::unique_ptr<Instruction>(inst));\n    } else\n        addInstruction(std::unique_ptr<Instruction>(new Instruction(NoResult, NoType, Op::OpReturn)));\n\n    if (! implicit)\n        createAndSetNoPredecessorBlock(\"post-return\");\n}\n\n// Comments in header\nvoid Builder::enterLexicalBlock(uint32_t line, uint32_t column)\n{\n    if (!emitNonSemanticShaderDebugInfo) {\n        return;\n    }\n\n    // Generate new lexical scope debug instruction\n    Id lexId = makeDebugLexicalBlock(line, column);\n    currentDebugScopeId.push(lexId);\n    dirtyScopeTracker = true;\n}\n\n// Comments in header\nvoid Builder::leaveLexicalBlock()\n{\n    if (!emitNonSemanticShaderDebugInfo) {\n        return;\n    }\n\n    // Pop current scope from stack and clear current scope\n    currentDebugScopeId.pop();\n    dirtyScopeTracker = true;\n}\n\n// Comments in header\nvoid Builder::enterFunction(Function const* function)\n{\n    // Save and disable debugInfo for HLSL entry point function. It is a wrapper\n    // function with no user code in it.\n    restoreNonSemanticShaderDebugInfo = emitNonSemanticShaderDebugInfo;\n    if (sourceLang == spv::SourceLanguage::HLSL && function == entryPointFunction) {\n        emitNonSemanticShaderDebugInfo = false;\n    }\n\n    if (emitNonSemanticShaderDebugInfo) {\n        // Initialize scope state\n        Id funcId = function->getFuncId();\n        currentDebugScopeId.push(debugId[funcId]);\n        // Create DebugFunctionDefinition\n        spv::Id resultId = getUniqueId();\n        Instruction* defInst = new Instruction(resultId, makeVoidType(), Op::OpExtInst);\n        defInst->reserveOperands(4);\n        defInst->addIdOperand(nonSemanticShaderDebugInfo);\n        defInst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugFunctionDefinition);\n        defInst->addIdOperand(debugId[funcId]);\n        defInst->addIdOperand(funcId);\n        addInstruction(std::unique_ptr<Instruction>(defInst));\n    }\n\n    if (auto linkType = function->getLinkType(); linkType != LinkageType::Max) {\n        Id funcId = function->getFuncId();\n        addCapability(Capability::Linkage);\n        addLinkageDecoration(funcId, function->getExportName(), linkType);\n    }\n}\n\n// Comments in header\nvoid Builder::leaveFunction()\n{\n    Block* block = buildPoint;\n    Function& function = buildPoint->getParent();\n    assert(block);\n\n    // If our function did not contain a return, add a return void now.\n    if (! block->isTerminated()) {\n        if (function.getReturnType() == makeVoidType())\n            makeReturn(true);\n        else {\n            makeReturn(true, createUndefined(function.getReturnType()));\n        }\n    }\n\n    // Clear function scope from debug scope stack\n    if (emitNonSemanticShaderDebugInfo)\n        currentDebugScopeId.pop();\n\n    emitNonSemanticShaderDebugInfo = restoreNonSemanticShaderDebugInfo;\n}\n\n// Comments in header\nvoid Builder::makeStatementTerminator(spv::Op opcode, const char *name)\n{\n    addInstruction(std::unique_ptr<Instruction>(new Instruction(opcode)));\n    createAndSetNoPredecessorBlock(name);\n}\n\n// Comments in header\nvoid Builder::makeStatementTerminator(spv::Op opcode, const std::vector<Id>& operands, const char* name)\n{\n    // It's assumed that the terminator instruction is always of void return type\n    // However in future if there is a need for non void return type, new helper\n    // methods can be created.\n    createNoResultOp(opcode, operands);\n    createAndSetNoPredecessorBlock(name);\n}\n\n// Comments in header\nId Builder::createVariable(Decoration precision, StorageClass storageClass, Id type, const char* name, Id initializer,\n    bool const compilerGenerated)\n{\n    Id pointerType = makePointer(storageClass, type);\n    Instruction* inst = new Instruction(getUniqueId(), pointerType, Op::OpVariable);\n    inst->addImmediateOperand(storageClass);\n    if (initializer != NoResult)\n        inst->addIdOperand(initializer);\n\n    switch (storageClass) {\n    case StorageClass::Function:\n        // Validation rules require the declaration in the entry block\n        buildPoint->getParent().addLocalVariable(std::unique_ptr<Instruction>(inst));\n\n        if (emitNonSemanticShaderDebugInfo && !compilerGenerated)\n        {\n            auto const debugLocalVariableId = createDebugLocalVariable(debugId[type], name);\n            debugId[inst->getResultId()] = debugLocalVariableId;\n\n            makeDebugDeclare(debugLocalVariableId, inst->getResultId());\n        }\n\n        break;\n\n    default:\n        constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(inst));\n        module.mapInstruction(inst);\n\n        if (emitNonSemanticShaderDebugInfo)\n        {\n            auto const debugResultId = createDebugGlobalVariable(debugId[type], name, inst->getResultId());\n            debugId[inst->getResultId()] = debugResultId;\n        }\n        break;\n    }\n\n    if (name)\n        addName(inst->getResultId(), name);\n    setPrecision(inst->getResultId(), precision);\n\n    return inst->getResultId();\n}\n\n// Comments in header\nId Builder::createUndefined(Id type)\n{\n  Instruction* inst = new Instruction(getUniqueId(), type, Op::OpUndef);\n  addInstruction(std::unique_ptr<Instruction>(inst));\n  return inst->getResultId();\n}\n\n// av/vis/nonprivate are unnecessary and illegal for some storage classes.\nspv::MemoryAccessMask Builder::sanitizeMemoryAccessForStorageClass(spv::MemoryAccessMask memoryAccess, StorageClass sc)\n    const\n{\n    switch (sc) {\n    case spv::StorageClass::Uniform:\n    case spv::StorageClass::Workgroup:\n    case spv::StorageClass::StorageBuffer:\n    case spv::StorageClass::PhysicalStorageBufferEXT:\n        break;\n    default:\n        memoryAccess = spv::MemoryAccessMask(memoryAccess &\n                        ~(spv::MemoryAccessMask::MakePointerAvailableKHR |\n                          spv::MemoryAccessMask::MakePointerVisibleKHR |\n                          spv::MemoryAccessMask::NonPrivatePointerKHR));\n        break;\n    }\n    return memoryAccess;\n}\n\n// Comments in header\nvoid Builder::createStore(Id rValue, Id lValue, spv::MemoryAccessMask memoryAccess, spv::Scope scope,\n    unsigned int alignment)\n{\n    Instruction* store = new Instruction(Op::OpStore);\n    store->reserveOperands(2);\n    store->addIdOperand(lValue);\n    store->addIdOperand(rValue);\n\n    memoryAccess = sanitizeMemoryAccessForStorageClass(memoryAccess, getStorageClass(lValue));\n\n    if (memoryAccess != MemoryAccessMask::MaskNone) {\n        store->addImmediateOperand(memoryAccess);\n        if (anySet(memoryAccess, spv::MemoryAccessMask::Aligned)) {\n            store->addImmediateOperand(alignment);\n        }\n        if (anySet(memoryAccess, spv::MemoryAccessMask::MakePointerAvailableKHR)) {\n            store->addIdOperand(makeUintConstant(scope));\n        }\n    }\n\n    addInstruction(std::unique_ptr<Instruction>(store));\n}\n\n// Comments in header\nId Builder::createLoad(Id lValue, spv::Decoration precision, spv::MemoryAccessMask memoryAccess,\n    spv::Scope scope, unsigned int alignment)\n{\n    Instruction* load = new Instruction(getUniqueId(), getDerefTypeId(lValue), Op::OpLoad);\n    load->addIdOperand(lValue);\n\n    memoryAccess = sanitizeMemoryAccessForStorageClass(memoryAccess, getStorageClass(lValue));\n\n    if (memoryAccess != MemoryAccessMask::MaskNone) {\n        load->addImmediateOperand(memoryAccess);\n        if (anySet(memoryAccess, spv::MemoryAccessMask::Aligned)) {\n            load->addImmediateOperand(alignment);\n        }\n        if (anySet(memoryAccess, spv::MemoryAccessMask::MakePointerVisibleKHR)) {\n            load->addIdOperand(makeUintConstant(scope));\n        }\n    }\n\n    addInstruction(std::unique_ptr<Instruction>(load));\n    setPrecision(load->getResultId(), precision);\n\n    return load->getResultId();\n}\n\n// Comments in header\nId Builder::createAccessChain(StorageClass storageClass, Id base, const std::vector<Id>& offsets)\n{\n    // Figure out the final resulting type.\n    Id typeId = getResultingAccessChainType();\n    typeId = makePointer(storageClass, typeId);\n\n    // Make the instruction\n    Instruction* chain = new Instruction(getUniqueId(), typeId, Op::OpAccessChain);\n    chain->reserveOperands(offsets.size() + 1);\n    chain->addIdOperand(base);\n    for (int i = 0; i < (int)offsets.size(); ++i)\n        chain->addIdOperand(offsets[i]);\n    addInstruction(std::unique_ptr<Instruction>(chain));\n\n    return chain->getResultId();\n}\n\nId Builder::createArrayLength(Id base, unsigned int member)\n{\n    spv::Id intType = makeUintType(32);\n    Instruction* length = new Instruction(getUniqueId(), intType, Op::OpArrayLength);\n    length->reserveOperands(2);\n    length->addIdOperand(base);\n    length->addImmediateOperand(member);\n    addInstruction(std::unique_ptr<Instruction>(length));\n\n    return length->getResultId();\n}\n\nId Builder::createCooperativeMatrixLengthKHR(Id type)\n{\n    spv::Id intType = makeUintType(32);\n\n    // Generate code for spec constants if in spec constant operation\n    // generation mode.\n    if (generatingOpCodeForSpecConst) {\n        return createSpecConstantOp(Op::OpCooperativeMatrixLengthKHR, intType, std::vector<Id>(1, type), std::vector<Id>());\n    }\n\n    Instruction* length = new Instruction(getUniqueId(), intType, Op::OpCooperativeMatrixLengthKHR);\n    length->addIdOperand(type);\n    addInstruction(std::unique_ptr<Instruction>(length));\n\n    return length->getResultId();\n}\n\nId Builder::createCooperativeMatrixLengthNV(Id type)\n{\n    spv::Id intType = makeUintType(32);\n\n    // Generate code for spec constants if in spec constant operation\n    // generation mode.\n    if (generatingOpCodeForSpecConst) {\n        return createSpecConstantOp(Op::OpCooperativeMatrixLengthNV, intType, std::vector<Id>(1, type), std::vector<Id>());\n    }\n\n    Instruction* length = new Instruction(getUniqueId(), intType, Op::OpCooperativeMatrixLengthNV);\n    length->addIdOperand(type);\n    addInstruction(std::unique_ptr<Instruction>(length));\n\n    return length->getResultId();\n}\n\nId Builder::createCompositeExtract(Id composite, Id typeId, unsigned index)\n{\n    // Generate code for spec constants if in spec constant operation\n    // generation mode.\n    if (generatingOpCodeForSpecConst) {\n        return createSpecConstantOp(Op::OpCompositeExtract, typeId, std::vector<Id>(1, composite),\n            std::vector<Id>(1, index));\n    }\n    Instruction* extract = new Instruction(getUniqueId(), typeId, Op::OpCompositeExtract);\n    extract->reserveOperands(2);\n    extract->addIdOperand(composite);\n    extract->addImmediateOperand(index);\n    addInstruction(std::unique_ptr<Instruction>(extract));\n\n    return extract->getResultId();\n}\n\nId Builder::createCompositeExtract(Id composite, Id typeId, const std::vector<unsigned>& indexes)\n{\n    // Generate code for spec constants if in spec constant operation\n    // generation mode.\n    if (generatingOpCodeForSpecConst) {\n        return createSpecConstantOp(Op::OpCompositeExtract, typeId, std::vector<Id>(1, composite), indexes);\n    }\n    Instruction* extract = new Instruction(getUniqueId(), typeId, Op::OpCompositeExtract);\n    extract->reserveOperands(indexes.size() + 1);\n    extract->addIdOperand(composite);\n    for (int i = 0; i < (int)indexes.size(); ++i)\n        extract->addImmediateOperand(indexes[i]);\n    addInstruction(std::unique_ptr<Instruction>(extract));\n\n    return extract->getResultId();\n}\n\nId Builder::createCompositeInsert(Id object, Id composite, Id typeId, unsigned index)\n{\n    Instruction* insert = new Instruction(getUniqueId(), typeId, Op::OpCompositeInsert);\n    insert->reserveOperands(3);\n    insert->addIdOperand(object);\n    insert->addIdOperand(composite);\n    insert->addImmediateOperand(index);\n    addInstruction(std::unique_ptr<Instruction>(insert));\n\n    return insert->getResultId();\n}\n\nId Builder::createCompositeInsert(Id object, Id composite, Id typeId, const std::vector<unsigned>& indexes)\n{\n    Instruction* insert = new Instruction(getUniqueId(), typeId, Op::OpCompositeInsert);\n    insert->reserveOperands(indexes.size() + 2);\n    insert->addIdOperand(object);\n    insert->addIdOperand(composite);\n    for (int i = 0; i < (int)indexes.size(); ++i)\n        insert->addImmediateOperand(indexes[i]);\n    addInstruction(std::unique_ptr<Instruction>(insert));\n\n    return insert->getResultId();\n}\n\nId Builder::createVectorExtractDynamic(Id vector, Id typeId, Id componentIndex)\n{\n    Instruction* extract = new Instruction(getUniqueId(), typeId, Op::OpVectorExtractDynamic);\n    extract->reserveOperands(2);\n    extract->addIdOperand(vector);\n    extract->addIdOperand(componentIndex);\n    addInstruction(std::unique_ptr<Instruction>(extract));\n\n    return extract->getResultId();\n}\n\nId Builder::createVectorInsertDynamic(Id vector, Id typeId, Id component, Id componentIndex)\n{\n    Instruction* insert = new Instruction(getUniqueId(), typeId, Op::OpVectorInsertDynamic);\n    insert->reserveOperands(3);\n    insert->addIdOperand(vector);\n    insert->addIdOperand(component);\n    insert->addIdOperand(componentIndex);\n    addInstruction(std::unique_ptr<Instruction>(insert));\n\n    return insert->getResultId();\n}\n\n// An opcode that has no operands, no result id, and no type\nvoid Builder::createNoResultOp(Op opCode)\n{\n    Instruction* op = new Instruction(opCode);\n    addInstruction(std::unique_ptr<Instruction>(op));\n}\n\n// An opcode that has one id operand, no result id, and no type\nvoid Builder::createNoResultOp(Op opCode, Id operand)\n{\n    Instruction* op = new Instruction(opCode);\n    op->addIdOperand(operand);\n    addInstruction(std::unique_ptr<Instruction>(op));\n}\n\n// An opcode that has one or more operands, no result id, and no type\nvoid Builder::createNoResultOp(Op opCode, const std::vector<Id>& operands)\n{\n    Instruction* op = new Instruction(opCode);\n    op->reserveOperands(operands.size());\n    for (auto id : operands) {\n        op->addIdOperand(id);\n    }\n    addInstruction(std::unique_ptr<Instruction>(op));\n}\n\n// An opcode that has multiple operands, no result id, and no type\nvoid Builder::createNoResultOp(Op opCode, const std::vector<IdImmediate>& operands)\n{\n    Instruction* op = new Instruction(opCode);\n    op->reserveOperands(operands.size());\n    for (auto it = operands.cbegin(); it != operands.cend(); ++it) {\n        if (it->isId)\n            op->addIdOperand(it->word);\n        else\n            op->addImmediateOperand(it->word);\n    }\n    addInstruction(std::unique_ptr<Instruction>(op));\n}\n\nvoid Builder::createControlBarrier(Scope execution, Scope memory, MemorySemanticsMask semantics)\n{\n    Instruction* op = new Instruction(Op::OpControlBarrier);\n    op->reserveOperands(3);\n    op->addIdOperand(makeUintConstant(execution));\n    op->addIdOperand(makeUintConstant(memory));\n    op->addIdOperand(makeUintConstant(semantics));\n    addInstruction(std::unique_ptr<Instruction>(op));\n}\n\nvoid Builder::createMemoryBarrier(Scope executionScope, MemorySemanticsMask memorySemantics)\n{\n    Instruction* op = new Instruction(Op::OpMemoryBarrier);\n    op->reserveOperands(2);\n    op->addIdOperand(makeUintConstant((unsigned)executionScope));\n    op->addIdOperand(makeUintConstant((unsigned)memorySemantics));\n    addInstruction(std::unique_ptr<Instruction>(op));\n}\n\n// An opcode that has one operands, a result id, and a type\nId Builder::createUnaryOp(Op opCode, Id typeId, Id operand)\n{\n    // Generate code for spec constants if in spec constant operation\n    // generation mode.\n    if (generatingOpCodeForSpecConst) {\n        return createSpecConstantOp(opCode, typeId, std::vector<Id>(1, operand), std::vector<Id>());\n    }\n    Instruction* op = new Instruction(getUniqueId(), typeId, opCode);\n    op->addIdOperand(operand);\n    addInstruction(std::unique_ptr<Instruction>(op));\n\n    return op->getResultId();\n}\n\nId Builder::createBinOp(Op opCode, Id typeId, Id left, Id right)\n{\n    // Generate code for spec constants if in spec constant operation\n    // generation mode.\n    if (generatingOpCodeForSpecConst) {\n        std::vector<Id> operands(2);\n        operands[0] = left; operands[1] = right;\n        return createSpecConstantOp(opCode, typeId, operands, std::vector<Id>());\n    }\n    Instruction* op = new Instruction(getUniqueId(), typeId, opCode);\n    op->reserveOperands(2);\n    op->addIdOperand(left);\n    op->addIdOperand(right);\n    addInstruction(std::unique_ptr<Instruction>(op));\n\n    return op->getResultId();\n}\n\nId Builder::createTriOp(Op opCode, Id typeId, Id op1, Id op2, Id op3)\n{\n    // Generate code for spec constants if in spec constant operation\n    // generation mode.\n    if (generatingOpCodeForSpecConst) {\n        std::vector<Id> operands(3);\n        operands[0] = op1;\n        operands[1] = op2;\n        operands[2] = op3;\n        return createSpecConstantOp(\n            opCode, typeId, operands, std::vector<Id>());\n    }\n    Instruction* op = new Instruction(getUniqueId(), typeId, opCode);\n    op->reserveOperands(3);\n    op->addIdOperand(op1);\n    op->addIdOperand(op2);\n    op->addIdOperand(op3);\n    addInstruction(std::unique_ptr<Instruction>(op));\n\n    return op->getResultId();\n}\n\nId Builder::createOp(Op opCode, Id typeId, const std::vector<Id>& operands)\n{\n    Instruction* op = new Instruction(getUniqueId(), typeId, opCode);\n    op->reserveOperands(operands.size());\n    for (auto id : operands)\n        op->addIdOperand(id);\n    addInstruction(std::unique_ptr<Instruction>(op));\n\n    return op->getResultId();\n}\n\nId Builder::createOp(Op opCode, Id typeId, const std::vector<IdImmediate>& operands)\n{\n    Instruction* op = new Instruction(getUniqueId(), typeId, opCode);\n    op->reserveOperands(operands.size());\n    for (auto it = operands.cbegin(); it != operands.cend(); ++it) {\n        if (it->isId)\n            op->addIdOperand(it->word);\n        else\n            op->addImmediateOperand(it->word);\n    }\n    addInstruction(std::unique_ptr<Instruction>(op));\n\n    return op->getResultId();\n}\n\nId Builder::createSpecConstantOp(Op opCode, Id typeId, const std::vector<Id>& operands,\n    const std::vector<unsigned>& literals)\n{\n    Instruction* op = new Instruction(getUniqueId(), typeId, Op::OpSpecConstantOp);\n    op->reserveOperands(operands.size() + literals.size() + 1);\n    op->addImmediateOperand((unsigned) opCode);\n    for (auto it = operands.cbegin(); it != operands.cend(); ++it)\n        op->addIdOperand(*it);\n    for (auto it = literals.cbegin(); it != literals.cend(); ++it)\n        op->addImmediateOperand(*it);\n    module.mapInstruction(op);\n    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(op));\n\n    // OpSpecConstantOp's using 8 or 16 bit types require the associated capability\n    if (containsType(typeId, Op::OpTypeInt, 8))\n        addCapability(Capability::Int8);\n    if (containsType(typeId, Op::OpTypeInt, 16))\n        addCapability(Capability::Int16);\n    if (containsType(typeId, Op::OpTypeFloat, 16))\n        addCapability(Capability::Float16);\n\n    return op->getResultId();\n}\n\nId Builder::createFunctionCall(spv::Function* function, const std::vector<spv::Id>& args)\n{\n    Instruction* op = new Instruction(getUniqueId(), function->getReturnType(), Op::OpFunctionCall);\n    op->reserveOperands(args.size() + 1);\n    op->addIdOperand(function->getId());\n    for (int a = 0; a < (int)args.size(); ++a)\n        op->addIdOperand(args[a]);\n    addInstruction(std::unique_ptr<Instruction>(op));\n\n    return op->getResultId();\n}\n\n// Comments in header\nId Builder::createRvalueSwizzle(Decoration precision, Id typeId, Id source, const std::vector<unsigned>& channels)\n{\n    if (channels.size() == 1)\n        return setPrecision(createCompositeExtract(source, typeId, channels.front()), precision);\n\n    if (generatingOpCodeForSpecConst) {\n        std::vector<Id> operands(2);\n        operands[0] = operands[1] = source;\n        return setPrecision(createSpecConstantOp(Op::OpVectorShuffle, typeId, operands, channels), precision);\n    }\n    Instruction* swizzle = new Instruction(getUniqueId(), typeId, Op::OpVectorShuffle);\n    assert(isVector(source));\n    swizzle->reserveOperands(channels.size() + 2);\n    swizzle->addIdOperand(source);\n    swizzle->addIdOperand(source);\n    for (int i = 0; i < (int)channels.size(); ++i)\n        swizzle->addImmediateOperand(channels[i]);\n    addInstruction(std::unique_ptr<Instruction>(swizzle));\n\n    return setPrecision(swizzle->getResultId(), precision);\n}\n\n// Comments in header\nId Builder::createLvalueSwizzle(Id typeId, Id target, Id source, const std::vector<unsigned>& channels)\n{\n    if (channels.size() == 1 && getNumComponents(source) == 1)\n        return createCompositeInsert(source, target, typeId, channels.front());\n\n    Instruction* swizzle = new Instruction(getUniqueId(), typeId, Op::OpVectorShuffle);\n\n    assert(isVector(target));\n    swizzle->reserveOperands(2);\n    swizzle->addIdOperand(target);\n\n    assert(getNumComponents(source) == channels.size());\n    assert(isVector(source));\n    swizzle->addIdOperand(source);\n\n    // Set up an identity shuffle from the base value to the result value\n    unsigned int components[4];\n    int numTargetComponents = getNumComponents(target);\n    for (int i = 0; i < numTargetComponents; ++i)\n        components[i] = i;\n\n    // Punch in the l-value swizzle\n    for (int i = 0; i < (int)channels.size(); ++i)\n        components[channels[i]] = numTargetComponents + i;\n\n    // finish the instruction with these components selectors\n    swizzle->reserveOperands(numTargetComponents);\n    for (int i = 0; i < numTargetComponents; ++i)\n        swizzle->addImmediateOperand(components[i]);\n    addInstruction(std::unique_ptr<Instruction>(swizzle));\n\n    return swizzle->getResultId();\n}\n\n// Comments in header\nvoid Builder::promoteScalar(Decoration precision, Id& left, Id& right)\n{\n    int direction = getNumComponents(right) - getNumComponents(left);\n\n    if (direction > 0)\n        left = smearScalar(precision, left, makeVectorType(getTypeId(left), getNumComponents(right)));\n    else if (direction < 0)\n        right = smearScalar(precision, right, makeVectorType(getTypeId(right), getNumComponents(left)));\n\n    return;\n}\n\n// Comments in header\nId Builder::smearScalar(Decoration precision, Id scalar, Id vectorType)\n{\n    assert(getNumComponents(scalar) == 1);\n    assert(getTypeId(scalar) == getScalarTypeId(vectorType));\n\n    int numComponents = getNumTypeComponents(vectorType);\n    if (numComponents == 1 && !isCooperativeVectorType(vectorType))\n        return scalar;\n\n    Instruction* smear = nullptr;\n    if (generatingOpCodeForSpecConst) {\n        auto members = std::vector<spv::Id>(numComponents, scalar);\n        // Sometime even in spec-constant-op mode, the temporary vector created by\n        // promoting a scalar might not be a spec constant. This should depend on\n        // the scalar.\n        // e.g.:\n        //  const vec2 spec_const_result = a_spec_const_vec2 + a_front_end_const_scalar;\n        // In such cases, the temporary vector created from a_front_end_const_scalar\n        // is not a spec constant vector, even though the binary operation node is marked\n        // as 'specConstant' and we are in spec-constant-op mode.\n        auto result_id = makeCompositeConstant(vectorType, members, isSpecConstant(scalar));\n        smear = module.getInstruction(result_id);\n    } else {\n        bool replicate = (useReplicatedComposites || isCooperativeVectorType(vectorType)) && (numComponents > 0);\n\n        if (replicate) {\n            numComponents = 1;\n            addCapability(spv::Capability::ReplicatedCompositesEXT);\n            addExtension(spv::E_SPV_EXT_replicated_composites);\n        }\n\n        Op opcode = replicate ? Op::OpCompositeConstructReplicateEXT : Op::OpCompositeConstruct;\n\n        smear = new Instruction(getUniqueId(), vectorType, opcode);\n        smear->reserveOperands(numComponents);\n        for (int c = 0; c < numComponents; ++c)\n            smear->addIdOperand(scalar);\n        addInstruction(std::unique_ptr<Instruction>(smear));\n    }\n\n    return setPrecision(smear->getResultId(), precision);\n}\n\n// Comments in header\nId Builder::createBuiltinCall(Id resultType, Id builtins, int entryPoint, const std::vector<Id>& args)\n{\n    Instruction* inst = new Instruction(getUniqueId(), resultType, Op::OpExtInst);\n    inst->reserveOperands(args.size() + 2);\n    inst->addIdOperand(builtins);\n    inst->addImmediateOperand(entryPoint);\n    for (int arg = 0; arg < (int)args.size(); ++arg)\n        inst->addIdOperand(args[arg]);\n\n    addInstruction(std::unique_ptr<Instruction>(inst));\n\n    return inst->getResultId();\n}\n\n// Accept all parameters needed to create a texture instruction.\n// Create the correct instruction based on the inputs, and make the call.\nId Builder::createTextureCall(Decoration precision, Id resultType, bool sparse, bool fetch, bool proj, bool gather,\n    bool noImplicitLod, const TextureParameters& parameters, ImageOperandsMask signExtensionMask)\n{\n    std::vector<Id> texArgs;\n\n    //\n    // Set up the fixed arguments\n    //\n    bool explicitLod = false;\n    texArgs.push_back(parameters.sampler);\n    texArgs.push_back(parameters.coords);\n    if (parameters.Dref != NoResult)\n        texArgs.push_back(parameters.Dref);\n    if (parameters.component != NoResult)\n        texArgs.push_back(parameters.component);\n\n    if (parameters.granularity != NoResult)\n        texArgs.push_back(parameters.granularity);\n    if (parameters.coarse != NoResult)\n        texArgs.push_back(parameters.coarse);\n\n    //\n    // Set up the optional arguments\n    //\n    size_t optArgNum = texArgs.size(); // the position of the mask for the optional arguments, if any.\n    ImageOperandsMask mask = ImageOperandsMask::MaskNone; // the mask operand\n    if (parameters.bias) {\n        mask = (ImageOperandsMask)(mask | ImageOperandsMask::Bias);\n        texArgs.push_back(parameters.bias);\n    }\n    if (parameters.lod) {\n        mask = (ImageOperandsMask)(mask | ImageOperandsMask::Lod);\n        texArgs.push_back(parameters.lod);\n        explicitLod = true;\n    } else if (parameters.gradX) {\n        mask = (ImageOperandsMask)(mask | ImageOperandsMask::Grad);\n        texArgs.push_back(parameters.gradX);\n        texArgs.push_back(parameters.gradY);\n        explicitLod = true;\n    } else if (noImplicitLod && ! fetch && ! gather) {\n        // have to explicitly use lod of 0 if not allowed to have them be implicit, and\n        // we would otherwise be about to issue an implicit instruction\n        mask = (ImageOperandsMask)(mask | ImageOperandsMask::Lod);\n        texArgs.push_back(makeFloatConstant(0.0));\n        explicitLod = true;\n    }\n    if (parameters.offset) {\n        if (isConstant(parameters.offset))\n            mask = (ImageOperandsMask)(mask | ImageOperandsMask::ConstOffset);\n        else {\n            addCapability(Capability::ImageGatherExtended);\n            mask = (ImageOperandsMask)(mask | ImageOperandsMask::Offset);\n        }\n        texArgs.push_back(parameters.offset);\n    }\n    if (parameters.offsets) {\n        if (!isConstant(parameters.offsets) && sourceLang == spv::SourceLanguage::GLSL) {\n            mask = (ImageOperandsMask)(mask | ImageOperandsMask::Offsets);\n        } else {\n            addCapability(Capability::ImageGatherExtended);\n            mask = (ImageOperandsMask)(mask | ImageOperandsMask::ConstOffsets);\n        }\n        texArgs.push_back(parameters.offsets);\n    }\n    if (parameters.sample) {\n        mask = (ImageOperandsMask)(mask | ImageOperandsMask::Sample);\n        texArgs.push_back(parameters.sample);\n    }\n    if (parameters.lodClamp) {\n        // capability if this bit is used\n        addCapability(Capability::MinLod);\n\n        mask = (ImageOperandsMask)(mask | ImageOperandsMask::MinLod);\n        texArgs.push_back(parameters.lodClamp);\n    }\n    if (parameters.nonprivate) {\n        mask = mask | ImageOperandsMask::NonPrivateTexelKHR;\n    }\n    if (parameters.volatil) {\n        mask = mask | ImageOperandsMask::VolatileTexelKHR;\n    }\n    if (parameters.nontemporal) {\n        mask = mask | ImageOperandsMask::Nontemporal;\n    }\n    mask = mask | signExtensionMask;\n    // insert the operand for the mask, if any bits were set.\n    if (mask != ImageOperandsMask::MaskNone)\n        texArgs.insert(texArgs.begin() + optArgNum, (Id)mask);\n\n    //\n    // Set up the instruction\n    //\n    Op opCode = Op::OpNop;  // All paths below need to set this\n    if (fetch) {\n        if (sparse)\n            opCode = Op::OpImageSparseFetch;\n        else\n            opCode = Op::OpImageFetch;\n    } else if (parameters.granularity && parameters.coarse) {\n        opCode = Op::OpImageSampleFootprintNV;\n    } else if (gather) {\n        if (parameters.Dref)\n            if (sparse)\n                opCode = Op::OpImageSparseDrefGather;\n            else\n                opCode = Op::OpImageDrefGather;\n        else\n            if (sparse)\n                opCode = Op::OpImageSparseGather;\n            else\n                opCode = Op::OpImageGather;\n    } else if (explicitLod) {\n        if (parameters.Dref) {\n            if (proj)\n                if (sparse)\n                    opCode = Op::OpImageSparseSampleProjDrefExplicitLod;\n                else\n                    opCode = Op::OpImageSampleProjDrefExplicitLod;\n            else\n                if (sparse)\n                    opCode = Op::OpImageSparseSampleDrefExplicitLod;\n                else\n                    opCode = Op::OpImageSampleDrefExplicitLod;\n        } else {\n            if (proj)\n                if (sparse)\n                    opCode = Op::OpImageSparseSampleProjExplicitLod;\n                else\n                    opCode = Op::OpImageSampleProjExplicitLod;\n            else\n                if (sparse)\n                    opCode = Op::OpImageSparseSampleExplicitLod;\n                else\n                    opCode = Op::OpImageSampleExplicitLod;\n        }\n    } else {\n        if (parameters.Dref) {\n            if (proj)\n                if (sparse)\n                    opCode = Op::OpImageSparseSampleProjDrefImplicitLod;\n                else\n                    opCode = Op::OpImageSampleProjDrefImplicitLod;\n            else\n                if (sparse)\n                    opCode = Op::OpImageSparseSampleDrefImplicitLod;\n                else\n                    opCode = Op::OpImageSampleDrefImplicitLod;\n        } else {\n            if (proj)\n                if (sparse)\n                    opCode = Op::OpImageSparseSampleProjImplicitLod;\n                else\n                    opCode = Op::OpImageSampleProjImplicitLod;\n            else\n                if (sparse)\n                    opCode = Op::OpImageSparseSampleImplicitLod;\n                else\n                    opCode = Op::OpImageSampleImplicitLod;\n        }\n    }\n\n    // See if the result type is expecting a smeared result.\n    // This happens when a legacy shadow*() call is made, which\n    // gets a vec4 back instead of a float.\n    Id smearedType = resultType;\n    if (! isScalarType(resultType)) {\n        switch (opCode) {\n        case Op::OpImageSampleDrefImplicitLod:\n        case Op::OpImageSampleDrefExplicitLod:\n        case Op::OpImageSampleProjDrefImplicitLod:\n        case Op::OpImageSampleProjDrefExplicitLod:\n            resultType = getScalarTypeId(resultType);\n            break;\n        default:\n            break;\n        }\n    }\n\n    Id typeId0 = 0;\n    Id typeId1 = 0;\n\n    if (sparse) {\n        typeId0 = resultType;\n        typeId1 = getDerefTypeId(parameters.texelOut);\n        resultType = makeStructResultType(typeId0, typeId1);\n    }\n\n    // Build the SPIR-V instruction\n    Instruction* textureInst = new Instruction(getUniqueId(), resultType, opCode);\n    textureInst->reserveOperands(optArgNum + (texArgs.size() - (optArgNum + 1)));\n    for (size_t op = 0; op < optArgNum; ++op)\n        textureInst->addIdOperand(texArgs[op]);\n    if (optArgNum < texArgs.size())\n        textureInst->addImmediateOperand(texArgs[optArgNum]);\n    for (size_t op = optArgNum + 1; op < texArgs.size(); ++op)\n        textureInst->addIdOperand(texArgs[op]);\n    setPrecision(textureInst->getResultId(), precision);\n    addInstruction(std::unique_ptr<Instruction>(textureInst));\n\n    Id resultId = textureInst->getResultId();\n\n    if (sparse) {\n        // set capability\n        addCapability(Capability::SparseResidency);\n\n        // Decode the return type that was a special structure\n        createStore(createCompositeExtract(resultId, typeId1, 1), parameters.texelOut);\n        resultId = createCompositeExtract(resultId, typeId0, 0);\n        setPrecision(resultId, precision);\n    } else {\n        // When a smear is needed, do it, as per what was computed\n        // above when resultType was changed to a scalar type.\n        if (resultType != smearedType)\n            resultId = smearScalar(precision, resultId, smearedType);\n    }\n\n    return resultId;\n}\n\n// Comments in header\nId Builder::createTextureQueryCall(Op opCode, const TextureParameters& parameters, bool isUnsignedResult)\n{\n    // Figure out the result type\n    Id resultType = 0;\n    switch (opCode) {\n    case Op::OpImageQuerySize:\n    case Op::OpImageQuerySizeLod:\n    {\n        int numComponents = 0;\n        switch (getTypeDimensionality(getImageType(parameters.sampler))) {\n        case Dim::Dim1D:\n        case Dim::Buffer:\n            numComponents = 1;\n            break;\n        case Dim::Dim2D:\n        case Dim::Cube:\n        case Dim::Rect:\n        case Dim::SubpassData:\n            numComponents = 2;\n            break;\n        case Dim::Dim3D:\n            numComponents = 3;\n            break;\n\n        default:\n            assert(0);\n            break;\n        }\n        if (isArrayedImageType(getImageType(parameters.sampler)))\n            ++numComponents;\n\n        Id intType = isUnsignedResult ? makeUintType(32) : makeIntType(32);\n        if (numComponents == 1)\n            resultType = intType;\n        else\n            resultType = makeVectorType(intType, numComponents);\n\n        break;\n    }\n    case Op::OpImageQueryLod:\n        resultType = makeVectorType(getScalarTypeId(getTypeId(parameters.coords)), 2);\n        break;\n    case Op::OpImageQueryLevels:\n    case Op::OpImageQuerySamples:\n        resultType = isUnsignedResult ? makeUintType(32) : makeIntType(32);\n        break;\n    default:\n        assert(0);\n        break;\n    }\n\n    Instruction* query = new Instruction(getUniqueId(), resultType, opCode);\n    query->addIdOperand(parameters.sampler);\n    if (parameters.coords)\n        query->addIdOperand(parameters.coords);\n    if (parameters.lod)\n        query->addIdOperand(parameters.lod);\n    addInstruction(std::unique_ptr<Instruction>(query));\n    addCapability(Capability::ImageQuery);\n\n    return query->getResultId();\n}\n\n// External comments in header.\n// Operates recursively to visit the composite's hierarchy.\nId Builder::createCompositeCompare(Decoration precision, Id value1, Id value2, bool equal)\n{\n    Id boolType = makeBoolType();\n    Id valueType = getTypeId(value1);\n\n    Id resultId = NoResult;\n\n    int numConstituents = getNumTypeConstituents(valueType);\n\n    // Scalars and Vectors\n\n    if (isScalarType(valueType) || isVectorType(valueType)) {\n        assert(valueType == getTypeId(value2));\n        // These just need a single comparison, just have\n        // to figure out what it is.\n        Op op;\n        switch (getMostBasicTypeClass(valueType)) {\n        case Op::OpTypeFloat:\n            op = equal ? Op::OpFOrdEqual : Op::OpFUnordNotEqual;\n            break;\n        case Op::OpTypeInt:\n        default:\n            op = equal ? Op::OpIEqual : Op::OpINotEqual;\n            break;\n        case Op::OpTypeBool:\n            op = equal ? Op::OpLogicalEqual : Op::OpLogicalNotEqual;\n            precision = NoPrecision;\n            break;\n        }\n\n        if (isScalarType(valueType)) {\n            // scalar\n            resultId = createBinOp(op, boolType, value1, value2);\n        } else {\n            // vector\n            resultId = createBinOp(op, makeVectorType(boolType, numConstituents), value1, value2);\n            setPrecision(resultId, precision);\n            // reduce vector compares...\n            resultId = createUnaryOp(equal ? Op::OpAll : Op::OpAny, boolType, resultId);\n        }\n\n        return setPrecision(resultId, precision);\n    }\n\n    // Only structs, arrays, and matrices should be left.\n    // They share in common the reduction operation across their constituents.\n    assert(isAggregateType(valueType) || isMatrixType(valueType));\n\n    // Compare each pair of constituents\n    for (int constituent = 0; constituent < numConstituents; ++constituent) {\n        std::vector<unsigned> indexes(1, constituent);\n        Id constituentType1 = getContainedTypeId(getTypeId(value1), constituent);\n        Id constituentType2 = getContainedTypeId(getTypeId(value2), constituent);\n        Id constituent1 = createCompositeExtract(value1, constituentType1, indexes);\n        Id constituent2 = createCompositeExtract(value2, constituentType2, indexes);\n\n        Id subResultId = createCompositeCompare(precision, constituent1, constituent2, equal);\n\n        if (constituent == 0)\n            resultId = subResultId;\n        else\n            resultId = setPrecision(createBinOp(equal ? Op::OpLogicalAnd : Op::OpLogicalOr, boolType, resultId, subResultId),\n                                    precision);\n    }\n\n    return resultId;\n}\n\n// OpCompositeConstruct\nId Builder::createCompositeConstruct(Id typeId, const std::vector<Id>& constituents)\n{\n    assert(isAggregateType(typeId) || (getNumTypeConstituents(typeId) > 1 &&\n           getNumTypeConstituents(typeId) == constituents.size()) ||\n           (isCooperativeVectorType(typeId) && constituents.size() == 1));\n\n    if (generatingOpCodeForSpecConst) {\n        // Sometime, even in spec-constant-op mode, the constant composite to be\n        // constructed may not be a specialization constant.\n        // e.g.:\n        //  const mat2 m2 = mat2(a_spec_const, a_front_end_const, another_front_end_const, third_front_end_const);\n        // The first column vector should be a spec constant one, as a_spec_const is a spec constant.\n        // The second column vector should NOT be spec constant, as it does not contain any spec constants.\n        // To handle such cases, we check the constituents of the constant vector to determine whether this\n        // vector should be created as a spec constant.\n        return makeCompositeConstant(typeId, constituents,\n                                     std::any_of(constituents.begin(), constituents.end(),\n                                                 [&](spv::Id id) { return isSpecConstant(id); }));\n    }\n\n    bool replicate = false;\n    size_t numConstituents = constituents.size();\n\n    if (useReplicatedComposites || isCooperativeVectorType(typeId)) {\n        replicate = numConstituents > 0 &&\n            std::equal(constituents.begin() + 1, constituents.end(), constituents.begin());\n    }\n\n    if (replicate) {\n        numConstituents = 1;\n        addCapability(spv::Capability::ReplicatedCompositesEXT);\n        addExtension(spv::E_SPV_EXT_replicated_composites);\n    }\n\n    Op opcode = replicate ? Op::OpCompositeConstructReplicateEXT : Op::OpCompositeConstruct;\n\n    Instruction* op = new Instruction(getUniqueId(), typeId, opcode);\n    op->reserveOperands(constituents.size());\n    for (size_t c = 0; c < numConstituents; ++c)\n        op->addIdOperand(constituents[c]);\n    addInstruction(std::unique_ptr<Instruction>(op));\n\n    return op->getResultId();\n}\n\n// coopmat conversion\nId Builder::createCooperativeMatrixConversion(Id typeId, Id source)\n{\n    Instruction* op = new Instruction(getUniqueId(), typeId, Op::OpCooperativeMatrixConvertNV);\n    op->addIdOperand(source);\n    addInstruction(std::unique_ptr<Instruction>(op));\n\n    return op->getResultId();\n}\n\n// coopmat reduce\nId Builder::createCooperativeMatrixReduce(Op opcode, Id typeId, Id source, unsigned int mask, Id func)\n{\n    Instruction* op = new Instruction(getUniqueId(), typeId, opcode);\n    op->addIdOperand(source);\n    op->addImmediateOperand(mask);\n    op->addIdOperand(func);\n    addInstruction(std::unique_ptr<Instruction>(op));\n\n    return op->getResultId();\n}\n\n// coopmat per-element operation\nId Builder::createCooperativeMatrixPerElementOp(Id typeId, const std::vector<Id>& operands)\n{\n    Instruction* op = new Instruction(getUniqueId(), typeId, spv::Op::OpCooperativeMatrixPerElementOpNV);\n    // skip operand[0], which is where the result is stored\n    for (uint32_t i = 1; i < operands.size(); ++i) {\n        op->addIdOperand(operands[i]);\n    }\n    addInstruction(std::unique_ptr<Instruction>(op));\n\n    return op->getResultId();\n}\n\n// Vector or scalar constructor\nId Builder::createConstructor(Decoration precision, const std::vector<Id>& sources, Id resultTypeId)\n{\n    Id result = NoResult;\n    unsigned int numTargetComponents = getNumTypeComponents(resultTypeId);\n    unsigned int targetComponent = 0;\n\n    // Special case: when calling a vector constructor with a single scalar\n    // argument, smear the scalar\n    if (sources.size() == 1 && isScalar(sources[0]) && (numTargetComponents > 1 || isCooperativeVectorType(resultTypeId)))\n        return smearScalar(precision, sources[0], resultTypeId);\n\n    // Special case: 2 vectors of equal size\n    if (sources.size() == 1 && isVector(sources[0]) && numTargetComponents == getNumComponents(sources[0])) {\n        assert(resultTypeId == getTypeId(sources[0]));\n        return sources[0];\n    }\n\n    // accumulate the arguments for OpCompositeConstruct\n    std::vector<Id> constituents;\n    Id scalarTypeId = getScalarTypeId(resultTypeId);\n\n    // lambda to store the result of visiting an argument component\n    const auto latchResult = [&](Id comp) {\n        if (numTargetComponents > 1)\n            constituents.push_back(comp);\n        else\n            result = comp;\n        ++targetComponent;\n    };\n\n    // lambda to visit a vector argument's components\n    const auto accumulateVectorConstituents = [&](Id sourceArg) {\n        unsigned int sourceSize = getNumComponents(sourceArg);\n        unsigned int sourcesToUse = sourceSize;\n        if (sourcesToUse + targetComponent > numTargetComponents)\n            sourcesToUse = numTargetComponents - targetComponent;\n\n        for (unsigned int s = 0; s < sourcesToUse; ++s) {\n            std::vector<unsigned> swiz;\n            swiz.push_back(s);\n            latchResult(createRvalueSwizzle(precision, scalarTypeId, sourceArg, swiz));\n        }\n    };\n\n    // lambda to visit a matrix argument's components\n    const auto accumulateMatrixConstituents = [&](Id sourceArg) {\n        unsigned int sourceSize = getNumColumns(sourceArg) * getNumRows(sourceArg);\n        unsigned int sourcesToUse = sourceSize;\n        if (sourcesToUse + targetComponent > numTargetComponents)\n            sourcesToUse = numTargetComponents - targetComponent;\n\n        unsigned int col = 0;\n        unsigned int row = 0;\n        for (unsigned int s = 0; s < sourcesToUse; ++s) {\n            if (row >= getNumRows(sourceArg)) {\n                row = 0;\n                col++;\n            }\n            std::vector<Id> indexes;\n            indexes.push_back(col);\n            indexes.push_back(row);\n            latchResult(createCompositeExtract(sourceArg, scalarTypeId, indexes));\n            row++;\n        }\n    };\n\n    // Go through the source arguments, each one could have either\n    // a single or multiple components to contribute.\n    for (unsigned int i = 0; i < sources.size(); ++i) {\n\n        if (isScalar(sources[i]) || isPointer(sources[i]))\n            latchResult(sources[i]);\n        else if (isVector(sources[i]) || isCooperativeVector(sources[i]))\n            accumulateVectorConstituents(sources[i]);\n        else if (isMatrix(sources[i]))\n            accumulateMatrixConstituents(sources[i]);\n        else\n            assert(0);\n\n        if (targetComponent >= numTargetComponents)\n            break;\n    }\n\n    // If the result is a vector, make it from the gathered constituents.\n    if (constituents.size() > 0) {\n        result = createCompositeConstruct(resultTypeId, constituents);\n        return setPrecision(result, precision);\n    } else {\n      // Precision was set when generating this component.\n      return result;\n    }\n}\n\n// Comments in header\nId Builder::createMatrixConstructor(Decoration precision, const std::vector<Id>& sources, Id resultTypeId)\n{\n    Id componentTypeId = getScalarTypeId(resultTypeId);\n    unsigned int numCols = getTypeNumColumns(resultTypeId);\n    unsigned int numRows = getTypeNumRows(resultTypeId);\n\n    Instruction* instr = module.getInstruction(componentTypeId);\n    const unsigned bitCount = instr->getImmediateOperand(0);\n\n    // Optimize matrix constructed from a bigger matrix\n    if (isMatrix(sources[0]) && getNumColumns(sources[0]) >= numCols && getNumRows(sources[0]) >= numRows) {\n        // To truncate the matrix to a smaller number of rows/columns, we need to:\n        // 1. For each column, extract the column and truncate it to the required size using shuffle\n        // 2. Assemble the resulting matrix from all columns\n        Id matrix = sources[0];\n        Id columnTypeId = getContainedTypeId(resultTypeId);\n        Id sourceColumnTypeId = getContainedTypeId(getTypeId(matrix));\n\n        std::vector<unsigned> channels;\n        for (unsigned int row = 0; row < numRows; ++row)\n            channels.push_back(row);\n\n        std::vector<Id> matrixColumns;\n        for (unsigned int col = 0; col < numCols; ++col) {\n            std::vector<unsigned> indexes;\n            indexes.push_back(col);\n            Id colv = createCompositeExtract(matrix, sourceColumnTypeId, indexes);\n            setPrecision(colv, precision);\n\n            if (numRows != getNumRows(matrix)) {\n                matrixColumns.push_back(createRvalueSwizzle(precision, columnTypeId, colv, channels));\n            } else {\n                matrixColumns.push_back(colv);\n            }\n        }\n\n        return setPrecision(createCompositeConstruct(resultTypeId, matrixColumns), precision);\n    }\n\n    // Detect a matrix being constructed from a repeated vector of the correct size.\n    // Create the composite directly from it.\n    if (sources.size() == numCols && isVector(sources[0]) && getNumComponents(sources[0]) == numRows &&\n        std::equal(sources.begin() + 1, sources.end(), sources.begin())) {\n        return setPrecision(createCompositeConstruct(resultTypeId, sources), precision);\n    }\n\n    // Otherwise, will use a two step process\n    // 1. make a compile-time 2D array of values\n    // 2. construct a matrix from that array\n\n    // Step 1.\n\n    // initialize the array to the identity matrix\n    Id ids[maxMatrixSize][maxMatrixSize];\n    Id  one = (bitCount == 64 ? makeDoubleConstant(1.0) : makeFloatConstant(1.0));\n    Id zero = (bitCount == 64 ? makeDoubleConstant(0.0) : makeFloatConstant(0.0));\n    for (int col = 0; col < 4; ++col) {\n        for (int row = 0; row < 4; ++row) {\n            if (col == row)\n                ids[col][row] = one;\n            else\n                ids[col][row] = zero;\n        }\n    }\n\n    // modify components as dictated by the arguments\n    if (sources.size() == 1 && isScalar(sources[0])) {\n        // a single scalar; resets the diagonals\n        for (int col = 0; col < 4; ++col)\n            ids[col][col] = sources[0];\n    } else if (isMatrix(sources[0])) {\n        // constructing from another matrix; copy over the parts that exist in both the argument and constructee\n        Id matrix = sources[0];\n        unsigned int minCols = std::min(numCols, getNumColumns(matrix));\n        unsigned int minRows = std::min(numRows, getNumRows(matrix));\n        for (unsigned int col = 0; col < minCols; ++col) {\n            std::vector<unsigned> indexes;\n            indexes.push_back(col);\n            for (unsigned int row = 0; row < minRows; ++row) {\n                indexes.push_back(row);\n                ids[col][row] = createCompositeExtract(matrix, componentTypeId, indexes);\n                indexes.pop_back();\n                setPrecision(ids[col][row], precision);\n            }\n        }\n    } else {\n        // fill in the matrix in column-major order with whatever argument components are available\n        unsigned int row = 0;\n        unsigned int col = 0;\n\n        for (unsigned int arg = 0; arg < sources.size() && col < numCols; ++arg) {\n            Id argComp = sources[arg];\n            for (unsigned int comp = 0; comp < getNumComponents(sources[arg]); ++comp) {\n                if (getNumComponents(sources[arg]) > 1) {\n                    argComp = createCompositeExtract(sources[arg], componentTypeId, comp);\n                    setPrecision(argComp, precision);\n                }\n                ids[col][row++] = argComp;\n                if (row == numRows) {\n                    row = 0;\n                    col++;\n                }\n                if (col == numCols) {\n                    // If more components are provided than fit the matrix, discard the rest.\n                    break;\n                }\n            }\n        }\n    }\n\n    // Step 2:  Construct a matrix from that array.\n    // First make the column vectors, then make the matrix.\n\n    // make the column vectors\n    Id columnTypeId = getContainedTypeId(resultTypeId);\n    std::vector<Id> matrixColumns;\n    for (unsigned int col = 0; col < numCols; ++col) {\n        std::vector<Id> vectorComponents;\n        for (unsigned int row = 0; row < numRows; ++row)\n            vectorComponents.push_back(ids[col][row]);\n        Id column = createCompositeConstruct(columnTypeId, vectorComponents);\n        setPrecision(column, precision);\n        matrixColumns.push_back(column);\n    }\n\n    // make the matrix\n    return setPrecision(createCompositeConstruct(resultTypeId, matrixColumns), precision);\n}\n\n// Comments in header\nBuilder::If::If(Id cond, SelectionControlMask ctrl, Builder& gb) :\n    builder(gb),\n    condition(cond),\n    control(ctrl),\n    elseBlock(nullptr)\n{\n    function = &builder.getBuildPoint()->getParent();\n\n    // make the blocks, but only put the then-block into the function,\n    // the else-block and merge-block will be added later, in order, after\n    // earlier code is emitted\n    thenBlock = new Block(builder.getUniqueId(), *function);\n    mergeBlock = new Block(builder.getUniqueId(), *function);\n\n    // Save the current block, so that we can add in the flow control split when\n    // makeEndIf is called.\n    headerBlock = builder.getBuildPoint();\n    builder.createSelectionMerge(mergeBlock, control);\n\n    function->addBlock(thenBlock);\n    builder.setBuildPoint(thenBlock);\n}\n\n// Comments in header\nvoid Builder::If::makeBeginElse()\n{\n    // Close out the \"then\" by having it jump to the mergeBlock\n    builder.createBranch(true, mergeBlock);\n\n    // Make the first else block and add it to the function\n    elseBlock = new Block(builder.getUniqueId(), *function);\n    function->addBlock(elseBlock);\n\n    // Start building the else block\n    builder.setBuildPoint(elseBlock);\n}\n\n// Comments in header\nvoid Builder::If::makeEndIf()\n{\n    // jump to the merge block\n    builder.createBranch(true, mergeBlock);\n\n    // Go back to the headerBlock and make the flow control split\n    builder.setBuildPoint(headerBlock);\n    if (elseBlock)\n        builder.createConditionalBranch(condition, thenBlock, elseBlock);\n    else\n        builder.createConditionalBranch(condition, thenBlock, mergeBlock);\n\n    // add the merge block to the function\n    function->addBlock(mergeBlock);\n    builder.setBuildPoint(mergeBlock);\n}\n\n// Comments in header\nvoid Builder::makeSwitch(Id selector, SelectionControlMask control, int numSegments, const std::vector<int>& caseValues,\n                         const std::vector<int>& valueIndexToSegment, int defaultSegment,\n                         std::vector<Block*>& segmentBlocks)\n{\n    Function& function = buildPoint->getParent();\n\n    // make all the blocks\n    for (int s = 0; s < numSegments; ++s)\n        segmentBlocks.push_back(new Block(getUniqueId(), function));\n\n    Block* mergeBlock = new Block(getUniqueId(), function);\n\n    // make and insert the switch's selection-merge instruction\n    createSelectionMerge(mergeBlock, control);\n\n    // make the switch instruction\n    Instruction* switchInst = new Instruction(NoResult, NoType, Op::OpSwitch);\n    switchInst->reserveOperands((caseValues.size() * 2) + 2);\n    switchInst->addIdOperand(selector);\n    auto defaultOrMerge = (defaultSegment >= 0) ? segmentBlocks[defaultSegment] : mergeBlock;\n    switchInst->addIdOperand(defaultOrMerge->getId());\n    defaultOrMerge->addPredecessor(buildPoint);\n    for (int i = 0; i < (int)caseValues.size(); ++i) {\n        switchInst->addImmediateOperand(caseValues[i]);\n        switchInst->addIdOperand(segmentBlocks[valueIndexToSegment[i]]->getId());\n        segmentBlocks[valueIndexToSegment[i]]->addPredecessor(buildPoint);\n    }\n    addInstruction(std::unique_ptr<Instruction>(switchInst));\n\n    // push the merge block\n    switchMerges.push(mergeBlock);\n}\n\n// Comments in header\nvoid Builder::addSwitchBreak(bool implicit)\n{\n    // branch to the top of the merge block stack\n    createBranch(implicit, switchMerges.top());\n    createAndSetNoPredecessorBlock(\"post-switch-break\");\n}\n\n// Comments in header\nvoid Builder::nextSwitchSegment(std::vector<Block*>& segmentBlock, int nextSegment)\n{\n    int lastSegment = nextSegment - 1;\n    if (lastSegment >= 0) {\n        // Close out previous segment by jumping, if necessary, to next segment\n        if (! buildPoint->isTerminated())\n            createBranch(true, segmentBlock[nextSegment]);\n    }\n    Block* block = segmentBlock[nextSegment];\n    block->getParent().addBlock(block);\n    setBuildPoint(block);\n}\n\n// Comments in header\nvoid Builder::endSwitch(std::vector<Block*>& /*segmentBlock*/)\n{\n    // Close out previous segment by jumping, if necessary, to next segment\n    if (! buildPoint->isTerminated())\n        addSwitchBreak(true);\n\n    switchMerges.top()->getParent().addBlock(switchMerges.top());\n    setBuildPoint(switchMerges.top());\n\n    switchMerges.pop();\n}\n\nBlock& Builder::makeNewBlock()\n{\n    Function& function = buildPoint->getParent();\n    auto block = new Block(getUniqueId(), function);\n    function.addBlock(block);\n    return *block;\n}\n\nBuilder::LoopBlocks& Builder::makeNewLoop()\n{\n    // This verbosity is needed to simultaneously get the same behavior\n    // everywhere (id's in the same order), have a syntax that works\n    // across lots of versions of C++, have no warnings from pedantic\n    // compilation modes, and leave the rest of the code alone.\n    Block& head            = makeNewBlock();\n    Block& body            = makeNewBlock();\n    Block& merge           = makeNewBlock();\n    Block& continue_target = makeNewBlock();\n    LoopBlocks blocks(head, body, merge, continue_target);\n    loops.push(blocks);\n    return loops.top();\n}\n\nvoid Builder::createLoopContinue()\n{\n    createBranch(false, &loops.top().continue_target);\n    // Set up a block for dead code.\n    createAndSetNoPredecessorBlock(\"post-loop-continue\");\n}\n\nvoid Builder::createLoopExit()\n{\n    createBranch(false, &loops.top().merge);\n    // Set up a block for dead code.\n    createAndSetNoPredecessorBlock(\"post-loop-break\");\n}\n\nvoid Builder::closeLoop()\n{\n    loops.pop();\n}\n\nvoid Builder::clearAccessChain()\n{\n    accessChain.base = NoResult;\n    accessChain.indexChain.clear();\n    accessChain.instr = NoResult;\n    accessChain.swizzle.clear();\n    accessChain.component = NoResult;\n    accessChain.preSwizzleBaseType = NoType;\n    accessChain.isRValue = false;\n    accessChain.coherentFlags.clear();\n    accessChain.alignment = 0;\n}\n\n// Comments in header\nvoid Builder::accessChainPushSwizzle(std::vector<unsigned>& swizzle, Id preSwizzleBaseType,\n    AccessChain::CoherentFlags coherentFlags, unsigned int alignment)\n{\n    accessChain.coherentFlags |= coherentFlags;\n    accessChain.alignment |= alignment;\n\n    // swizzles can be stacked in GLSL, but simplified to a single\n    // one here; the base type doesn't change\n    if (accessChain.preSwizzleBaseType == NoType)\n        accessChain.preSwizzleBaseType = preSwizzleBaseType;\n\n    // if needed, propagate the swizzle for the current access chain\n    if (accessChain.swizzle.size() > 0) {\n        std::vector<unsigned> oldSwizzle = accessChain.swizzle;\n        accessChain.swizzle.resize(0);\n        for (unsigned int i = 0; i < swizzle.size(); ++i) {\n            assert(swizzle[i] < oldSwizzle.size());\n            accessChain.swizzle.push_back(oldSwizzle[swizzle[i]]);\n        }\n    } else\n        accessChain.swizzle = swizzle;\n\n    // determine if we need to track this swizzle anymore\n    simplifyAccessChainSwizzle();\n}\n\n// Comments in header\nvoid Builder::accessChainStore(Id rvalue, Decoration nonUniform, spv::MemoryAccessMask memoryAccess, spv::Scope scope, unsigned int alignment)\n{\n    assert(accessChain.isRValue == false);\n\n    transferAccessChainSwizzle(true);\n\n    // If a swizzle exists and is not full and is not dynamic, then the swizzle will be broken into individual stores.\n    if (accessChain.swizzle.size() > 0 &&\n        getNumTypeComponents(getResultingAccessChainType()) != accessChain.swizzle.size() &&\n        accessChain.component == NoResult) {\n        for (unsigned int i = 0; i < accessChain.swizzle.size(); ++i) {\n            accessChain.indexChain.push_back(makeUintConstant(accessChain.swizzle[i]));\n            accessChain.instr = NoResult;\n\n            Id base = collapseAccessChain();\n            addDecoration(base, nonUniform);\n\n            accessChain.indexChain.pop_back();\n            accessChain.instr = NoResult;\n\n            // dynamic component should be gone\n            assert(accessChain.component == NoResult);\n\n            Id source = createCompositeExtract(rvalue, getContainedTypeId(getTypeId(rvalue)), i);\n\n            // take LSB of alignment\n            alignment = alignment & ~(alignment & (alignment-1));\n            if (getStorageClass(base) == StorageClass::PhysicalStorageBufferEXT) {\n                memoryAccess = (spv::MemoryAccessMask)(memoryAccess | spv::MemoryAccessMask::Aligned);\n            }\n\n            createStore(source, base, memoryAccess, scope, alignment);\n        }\n    }\n    else {\n        Id base = collapseAccessChain();\n        addDecoration(base, nonUniform);\n\n        Id source = rvalue;\n\n        // dynamic component should be gone\n        assert(accessChain.component == NoResult);\n\n        // If swizzle still exists, it may be out-of-order, we must load the target vector,\n        // extract and insert elements to perform writeMask and/or swizzle.\n        if (accessChain.swizzle.size() > 0) {\n            Id tempBaseId = createLoad(base, spv::NoPrecision);\n            source = createLvalueSwizzle(getTypeId(tempBaseId), tempBaseId, source, accessChain.swizzle);\n        }\n\n        // take LSB of alignment\n        alignment = alignment & ~(alignment & (alignment-1));\n        if (getStorageClass(base) == StorageClass::PhysicalStorageBufferEXT) {\n            memoryAccess = (spv::MemoryAccessMask)(memoryAccess | spv::MemoryAccessMask::Aligned);\n        }\n\n        createStore(source, base, memoryAccess, scope, alignment);\n    }\n}\n\n// Comments in header\nId Builder::accessChainLoad(Decoration precision, Decoration l_nonUniform,\n    Decoration r_nonUniform, Id resultType, spv::MemoryAccessMask memoryAccess,\n    spv::Scope scope, unsigned int alignment)\n{\n    Id id;\n\n    if (accessChain.isRValue) {\n        // transfer access chain, but try to stay in registers\n        transferAccessChainSwizzle(false);\n        if (accessChain.indexChain.size() > 0) {\n            Id swizzleBase = accessChain.preSwizzleBaseType != NoType ? accessChain.preSwizzleBaseType : resultType;\n\n            // if all the accesses are constants, we can use OpCompositeExtract\n            std::vector<unsigned> indexes;\n            bool constant = true;\n            for (int i = 0; i < (int)accessChain.indexChain.size(); ++i) {\n                if (isConstantScalar(accessChain.indexChain[i]))\n                    indexes.push_back(getConstantScalar(accessChain.indexChain[i]));\n                else {\n                    constant = false;\n                    break;\n                }\n            }\n\n            if (constant) {\n                id = createCompositeExtract(accessChain.base, swizzleBase, indexes);\n                setPrecision(id, precision);\n            } else if (isCooperativeVector(accessChain.base)) {\n                assert(accessChain.indexChain.size() == 1);\n                id = createVectorExtractDynamic(accessChain.base, resultType, accessChain.indexChain[0]);\n            } else {\n                Id lValue = NoResult;\n                if (spvVersion >= Spv_1_4 && isValidInitializer(accessChain.base)) {\n                    // make a new function variable for this r-value, using an initializer,\n                    // and mark it as NonWritable so that downstream it can be detected as a lookup\n                    // table\n                    lValue = createVariable(NoPrecision, StorageClass::Function, getTypeId(accessChain.base),\n                        \"indexable\", accessChain.base);\n                    addDecoration(lValue, Decoration::NonWritable);\n                } else {\n                    lValue = createVariable(NoPrecision, StorageClass::Function, getTypeId(accessChain.base),\n                        \"indexable\");\n                    // store into it\n                    createStore(accessChain.base, lValue);\n                }\n                // move base to the new variable\n                accessChain.base = lValue;\n                accessChain.isRValue = false;\n\n                // load through the access chain\n                id = createLoad(collapseAccessChain(), precision);\n            }\n        } else\n            id = accessChain.base;  // no precision, it was set when this was defined\n    } else {\n        transferAccessChainSwizzle(true);\n\n        // take LSB of alignment\n        alignment = alignment & ~(alignment & (alignment-1));\n        if (getStorageClass(accessChain.base) == StorageClass::PhysicalStorageBufferEXT) {\n            memoryAccess = (spv::MemoryAccessMask)(memoryAccess | spv::MemoryAccessMask::Aligned);\n        }\n\n        // load through the access chain\n        id = collapseAccessChain();\n        // Apply nonuniform both to the access chain and the loaded value.\n        // Buffer accesses need the access chain decorated, and this is where\n        // loaded image types get decorated. TODO: This should maybe move to\n        // createImageTextureFunctionCall.\n        addDecoration(id, l_nonUniform);\n        id = createLoad(id, precision, memoryAccess, scope, alignment);\n        addDecoration(id, r_nonUniform);\n    }\n\n    // Done, unless there are swizzles to do\n    if (accessChain.swizzle.size() == 0 && accessChain.component == NoResult)\n        return id;\n\n    // Do remaining swizzling\n\n    // Do the basic swizzle\n    if (accessChain.swizzle.size() > 0) {\n        Id swizzledType = getScalarTypeId(getTypeId(id));\n        if (accessChain.swizzle.size() > 1)\n            swizzledType = makeVectorType(swizzledType, (int)accessChain.swizzle.size());\n        id = createRvalueSwizzle(precision, swizzledType, id, accessChain.swizzle);\n    }\n\n    // Do the dynamic component\n    if (accessChain.component != NoResult)\n        id = setPrecision(createVectorExtractDynamic(id, resultType, accessChain.component), precision);\n\n    addDecoration(id, r_nonUniform);\n    return id;\n}\n\nId Builder::accessChainGetLValue()\n{\n    assert(accessChain.isRValue == false);\n\n    transferAccessChainSwizzle(true);\n    Id lvalue = collapseAccessChain();\n\n    // If swizzle exists, it is out-of-order or not full, we must load the target vector,\n    // extract and insert elements to perform writeMask and/or swizzle.  This does not\n    // go with getting a direct l-value pointer.\n    assert(accessChain.swizzle.size() == 0);\n    assert(accessChain.component == NoResult);\n\n    return lvalue;\n}\n\n// comment in header\nId Builder::accessChainGetInferredType()\n{\n    // anything to operate on?\n    if (accessChain.base == NoResult)\n        return NoType;\n    Id type = getTypeId(accessChain.base);\n\n    // do initial dereference\n    if (! accessChain.isRValue)\n        type = getContainedTypeId(type);\n\n    // dereference each index\n    for (auto it = accessChain.indexChain.cbegin(); it != accessChain.indexChain.cend(); ++it) {\n        if (isStructType(type))\n            type = getContainedTypeId(type, getConstantScalar(*it));\n        else\n            type = getContainedTypeId(type);\n    }\n\n    // dereference swizzle\n    if (accessChain.swizzle.size() == 1)\n        type = getContainedTypeId(type);\n    else if (accessChain.swizzle.size() > 1)\n        type = makeVectorType(getContainedTypeId(type), (int)accessChain.swizzle.size());\n\n    // dereference component selection\n    if (accessChain.component)\n        type = getContainedTypeId(type);\n\n    return type;\n}\n\nvoid Builder::dump(std::vector<unsigned int>& out) const\n{\n    // Header, before first instructions:\n    out.push_back(MagicNumber);\n    out.push_back(spvVersion);\n    out.push_back(builderNumber);\n    out.push_back(uniqueId + 1);\n    out.push_back(0);\n\n    // Capabilities\n    for (auto it = capabilities.cbegin(); it != capabilities.cend(); ++it) {\n        Instruction capInst(0, 0, Op::OpCapability);\n        capInst.addImmediateOperand(*it);\n        capInst.dump(out);\n    }\n\n    for (auto it = extensions.cbegin(); it != extensions.cend(); ++it) {\n        Instruction extInst(0, 0, Op::OpExtension);\n        extInst.addStringOperand(it->c_str());\n        extInst.dump(out);\n    }\n\n    dumpInstructions(out, imports);\n    Instruction memInst(0, 0, Op::OpMemoryModel);\n    memInst.addImmediateOperand(addressModel);\n    memInst.addImmediateOperand(memoryModel);\n    memInst.dump(out);\n\n    // Instructions saved up while building:\n    dumpInstructions(out, entryPoints);\n    dumpInstructions(out, executionModes);\n\n    // Debug instructions\n    dumpInstructions(out, strings);\n    dumpSourceInstructions(out);\n    for (int e = 0; e < (int)sourceExtensions.size(); ++e) {\n        Instruction sourceExtInst(0, 0, Op::OpSourceExtension);\n        sourceExtInst.addStringOperand(sourceExtensions[e]);\n        sourceExtInst.dump(out);\n    }\n    dumpInstructions(out, names);\n    dumpModuleProcesses(out);\n\n    // Annotation instructions\n    dumpInstructions(out, decorations);\n\n    dumpInstructions(out, constantsTypesGlobals);\n    dumpInstructions(out, externals);\n\n    // The functions\n    module.dump(out);\n}\n\n//\n// Protected methods.\n//\n\n// Turn the described access chain in 'accessChain' into an instruction(s)\n// computing its address.  This *cannot* include complex swizzles, which must\n// be handled after this is called.\n//\n// Can generate code.\nId Builder::collapseAccessChain()\n{\n    assert(accessChain.isRValue == false);\n\n    // did we already emit an access chain for this?\n    if (accessChain.instr != NoResult)\n        return accessChain.instr;\n\n    // If we have a dynamic component, we can still transfer\n    // that into a final operand to the access chain.  We need to remap the\n    // dynamic component through the swizzle to get a new dynamic component to\n    // update.\n    //\n    // This was not done in transferAccessChainSwizzle() because it might\n    // generate code.\n    remapDynamicSwizzle();\n    if (accessChain.component != NoResult) {\n        // transfer the dynamic component to the access chain\n        accessChain.indexChain.push_back(accessChain.component);\n        accessChain.component = NoResult;\n    }\n\n    // note that non-trivial swizzling is left pending\n\n    // do we have an access chain?\n    if (accessChain.indexChain.size() == 0)\n        return accessChain.base;\n\n    // emit the access chain\n    StorageClass storageClass = (StorageClass)module.getStorageClass(getTypeId(accessChain.base));\n    accessChain.instr = createAccessChain(storageClass, accessChain.base, accessChain.indexChain);\n\n    return accessChain.instr;\n}\n\n// For a dynamic component selection of a swizzle.\n//\n// Turn the swizzle and dynamic component into just a dynamic component.\n//\n// Generates code.\nvoid Builder::remapDynamicSwizzle()\n{\n    // do we have a swizzle to remap a dynamic component through?\n    if (accessChain.component != NoResult && accessChain.swizzle.size() > 1) {\n        // build a vector of the swizzle for the component to map into\n        std::vector<Id> components;\n        for (int c = 0; c < (int)accessChain.swizzle.size(); ++c)\n            components.push_back(makeUintConstant(accessChain.swizzle[c]));\n        Id mapType = makeVectorType(makeUintType(32), (int)accessChain.swizzle.size());\n        Id map = makeCompositeConstant(mapType, components);\n\n        // use it\n        accessChain.component = createVectorExtractDynamic(map, makeUintType(32), accessChain.component);\n        accessChain.swizzle.clear();\n    }\n}\n\n// clear out swizzle if it is redundant, that is reselecting the same components\n// that would be present without the swizzle.\nvoid Builder::simplifyAccessChainSwizzle()\n{\n    // If the swizzle has fewer components than the vector, it is subsetting, and must stay\n    // to preserve that fact.\n    if (getNumTypeComponents(accessChain.preSwizzleBaseType) > accessChain.swizzle.size())\n        return;\n\n    // if components are out of order, it is a swizzle\n    for (unsigned int i = 0; i < accessChain.swizzle.size(); ++i) {\n        if (i != accessChain.swizzle[i])\n            return;\n    }\n\n    // otherwise, there is no need to track this swizzle\n    accessChain.swizzle.clear();\n    if (accessChain.component == NoResult)\n        accessChain.preSwizzleBaseType = NoType;\n}\n\n// To the extent any swizzling can become part of the chain\n// of accesses instead of a post operation, make it so.\n// If 'dynamic' is true, include transferring the dynamic component,\n// otherwise, leave it pending.\n//\n// Does not generate code. just updates the access chain.\nvoid Builder::transferAccessChainSwizzle(bool dynamic)\n{\n    // non existent?\n    if (accessChain.swizzle.size() == 0 && accessChain.component == NoResult)\n        return;\n\n    // too complex?\n    // (this requires either a swizzle, or generating code for a dynamic component)\n    if (accessChain.swizzle.size() > 1)\n        return;\n\n    // single component, either in the swizzle and/or dynamic component\n    if (accessChain.swizzle.size() == 1) {\n        assert(accessChain.component == NoResult);\n        // handle static component selection\n        accessChain.indexChain.push_back(makeUintConstant(accessChain.swizzle.front()));\n        accessChain.swizzle.clear();\n        accessChain.preSwizzleBaseType = NoType;\n    } else if (dynamic && accessChain.component != NoResult) {\n        assert(accessChain.swizzle.size() == 0);\n        // handle dynamic component\n        accessChain.indexChain.push_back(accessChain.component);\n        accessChain.preSwizzleBaseType = NoType;\n        accessChain.component = NoResult;\n    }\n}\n\n// Utility method for creating a new block and setting the insert point to\n// be in it. This is useful for flow-control operations that need a \"dummy\"\n// block proceeding them (e.g. instructions after a discard, etc).\nvoid Builder::createAndSetNoPredecessorBlock(const char* /*name*/)\n{\n    Block* block = new Block(getUniqueId(), buildPoint->getParent());\n    block->setUnreachable();\n    buildPoint->getParent().addBlock(block);\n    setBuildPoint(block);\n\n    // if (name)\n    //    addName(block->getId(), name);\n}\n\n// Comments in header\nvoid Builder::createBranch(bool implicit, Block* block)\n{\n    Instruction* branch = new Instruction(Op::OpBranch);\n    branch->addIdOperand(block->getId());\n    if (implicit) {\n        addInstructionNoDebugInfo(std::unique_ptr<Instruction>(branch));\n    }\n    else {\n        addInstruction(std::unique_ptr<Instruction>(branch));\n    }\n    block->addPredecessor(buildPoint);\n}\n\nvoid Builder::createSelectionMerge(Block* mergeBlock, SelectionControlMask control)\n{\n    Instruction* merge = new Instruction(Op::OpSelectionMerge);\n    merge->reserveOperands(2);\n    merge->addIdOperand(mergeBlock->getId());\n    merge->addImmediateOperand(control);\n    addInstruction(std::unique_ptr<Instruction>(merge));\n}\n\nvoid Builder::createLoopMerge(Block* mergeBlock, Block* continueBlock, LoopControlMask control,\n                              const std::vector<unsigned int>& operands)\n{\n    Instruction* merge = new Instruction(Op::OpLoopMerge);\n    merge->reserveOperands(operands.size() + 3);\n    merge->addIdOperand(mergeBlock->getId());\n    merge->addIdOperand(continueBlock->getId());\n    merge->addImmediateOperand(control);\n    for (int op = 0; op < (int)operands.size(); ++op)\n        merge->addImmediateOperand(operands[op]);\n    addInstruction(std::unique_ptr<Instruction>(merge));\n}\n\nvoid Builder::createConditionalBranch(Id condition, Block* thenBlock, Block* elseBlock)\n{\n    Instruction* branch = new Instruction(Op::OpBranchConditional);\n    branch->reserveOperands(3);\n    branch->addIdOperand(condition);\n    branch->addIdOperand(thenBlock->getId());\n    branch->addIdOperand(elseBlock->getId());\n\n    // A conditional branch is always attached to a condition expression\n    addInstructionNoDebugInfo(std::unique_ptr<Instruction>(branch));\n\n    thenBlock->addPredecessor(buildPoint);\n    elseBlock->addPredecessor(buildPoint);\n}\n\n// OpSource\n// [OpSourceContinued]\n// ...\nvoid Builder::dumpSourceInstructions(const spv::Id fileId, const std::string& text,\n                                     std::vector<unsigned int>& out) const\n{\n    const int maxWordCount = 0xFFFF;\n    const int opSourceWordCount = 4;\n    const int nonNullBytesPerInstruction = 4 * (maxWordCount - opSourceWordCount) - 1;\n\n    if (sourceLang != SourceLanguage::Unknown) {\n        // OpSource Language Version File Source\n        Instruction sourceInst(NoResult, NoType, Op::OpSource);\n        sourceInst.reserveOperands(3);\n        sourceInst.addImmediateOperand(sourceLang);\n        sourceInst.addImmediateOperand(sourceVersion);\n        // File operand\n        if (fileId != NoResult) {\n            sourceInst.addIdOperand(fileId);\n            // Source operand\n            if (text.size() > 0) {\n                int nextByte = 0;\n                std::string subString;\n                while ((int)text.size() - nextByte > 0) {\n                    subString = text.substr(nextByte, nonNullBytesPerInstruction);\n                    if (nextByte == 0) {\n                        // OpSource\n                        sourceInst.addStringOperand(subString.c_str());\n                        sourceInst.dump(out);\n                    } else {\n                        // OpSourcContinued\n                        Instruction sourceContinuedInst(Op::OpSourceContinued);\n                        sourceContinuedInst.addStringOperand(subString.c_str());\n                        sourceContinuedInst.dump(out);\n                    }\n                    nextByte += nonNullBytesPerInstruction;\n                }\n            } else\n                sourceInst.dump(out);\n        } else\n            sourceInst.dump(out);\n    }\n}\n\n// Dump an OpSource[Continued] sequence for the source and every include file\nvoid Builder::dumpSourceInstructions(std::vector<unsigned int>& out) const\n{\n    if (emitNonSemanticShaderDebugInfo) return;\n    dumpSourceInstructions(mainFileId, sourceText, out);\n    for (auto iItr = includeFiles.begin(); iItr != includeFiles.end(); ++iItr)\n        dumpSourceInstructions(iItr->first, *iItr->second, out);\n}\n\ntemplate <class Range> void Builder::dumpInstructions(std::vector<unsigned int>& out, const Range& instructions) const\n{\n    for (const auto& inst : instructions) {\n        inst->dump(out);\n    }\n}\n\nvoid Builder::dumpModuleProcesses(std::vector<unsigned int>& out) const\n{\n    for (int i = 0; i < (int)moduleProcesses.size(); ++i) {\n        Instruction moduleProcessed(Op::OpModuleProcessed);\n        moduleProcessed.addStringOperand(moduleProcesses[i]);\n        moduleProcessed.dump(out);\n    }\n}\n\nbool Builder::DecorationInstructionLessThan::operator()(const std::unique_ptr<Instruction>& lhs,\n                                                        const std::unique_ptr<Instruction>& rhs) const\n{\n    // Order by the id to which the decoration applies first. This is more intuitive.\n    assert(lhs->isIdOperand(0) && rhs->isIdOperand(0));\n    if (lhs->getIdOperand(0) != rhs->getIdOperand(0)) {\n        return lhs->getIdOperand(0) < rhs->getIdOperand(0);\n    }\n\n    if (lhs->getOpCode() != rhs->getOpCode())\n        return lhs->getOpCode() < rhs->getOpCode();\n\n    // Now compare the operands.\n    int minSize = std::min(lhs->getNumOperands(), rhs->getNumOperands());\n    for (int i = 1; i < minSize; ++i) {\n        if (lhs->isIdOperand(i) != rhs->isIdOperand(i)) {\n            return lhs->isIdOperand(i) < rhs->isIdOperand(i);\n        }\n\n        if (lhs->isIdOperand(i)) {\n            if (lhs->getIdOperand(i) != rhs->getIdOperand(i)) {\n                return lhs->getIdOperand(i) < rhs->getIdOperand(i);\n            }\n        } else {\n            if (lhs->getImmediateOperand(i) != rhs->getImmediateOperand(i)) {\n                return lhs->getImmediateOperand(i) < rhs->getImmediateOperand(i);\n            }\n        }\n    }\n\n    if (lhs->getNumOperands() != rhs->getNumOperands())\n        return lhs->getNumOperands() < rhs->getNumOperands();\n\n    // In this case they are equal.\n    return false;\n}\n} // end spv namespace\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/SpvBuilder.h",
    "content": "//\n// Copyright (C) 2014-2015 LunarG, Inc.\n// Copyright (C) 2015-2020 Google, Inc.\n// Copyright (C) 2017 ARM Limited.\n// Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\n//\n// \"Builder\" is an interface to fully build SPIR-V IR.   Allocate one of\n// these to build (a thread safe) internal SPIR-V representation (IR),\n// and then dump it as a binary stream according to the SPIR-V specification.\n//\n// A Builder has a 1:1 relationship with a SPIR-V module.\n//\n\n#pragma once\n#ifndef SpvBuilder_H\n#define SpvBuilder_H\n\n#include \"Logger.h\"\n#define SPV_ENABLE_UTILITY_CODE\n#include \"spirv.hpp11\"\n#include \"spvIR.h\"\n#include \"spvUtil.h\"\n\nnamespace spv {\n    #include \"GLSL.ext.KHR.h\"\n    #include \"GLSL.ext.EXT.h\"\n    #include \"NonSemanticShaderDebugInfo100.h\"\n}\n\n#include <algorithm>\n#include <cstdint>\n#include <map>\n#include <memory>\n#include <set>\n#include <sstream>\n#include <stack>\n#include <unordered_map>\n#include <unordered_set>\n#include <map>\n\nnamespace spv {\n\ntypedef enum {\n    Spv_1_0 = (1 << 16),\n    Spv_1_1 = (1 << 16) | (1 << 8),\n    Spv_1_2 = (1 << 16) | (2 << 8),\n    Spv_1_3 = (1 << 16) | (3 << 8),\n    Spv_1_4 = (1 << 16) | (4 << 8),\n    Spv_1_5 = (1 << 16) | (5 << 8),\n    Spv_1_6 = (1 << 16) | (6 << 8),\n} SpvVersion;\n\nclass Builder {\npublic:\n    Builder(unsigned int spvVersion, unsigned int userNumber, SpvBuildLogger* logger);\n    virtual ~Builder();\n\n    static const int maxMatrixSize = 4;\n\n    unsigned int getSpvVersion() const { return spvVersion; }\n\n    void setSource(spv::SourceLanguage lang, int version)\n    {\n        sourceLang = lang;\n        sourceVersion = version;\n    }\n    spv::Id getStringId(const std::string& str)\n    {\n        auto sItr = stringIds.find(str);\n        if (sItr != stringIds.end())\n            return sItr->second;\n        spv::Id strId = getUniqueId();\n        Instruction* fileString = new Instruction(strId, NoType, Op::OpString);\n        const char* file_c_str = str.c_str();\n        fileString->addStringOperand(file_c_str);\n        strings.push_back(std::unique_ptr<Instruction>(fileString));\n        module.mapInstruction(fileString);\n        stringIds[file_c_str] = strId;\n        return strId;\n    }\n\n    spv::Id getMainFileId() const { return mainFileId; }\n\n    // Initialize the main source file name\n    void setDebugMainSourceFile(const std::string& file)\n    {\n        if (trackDebugInfo) {\n            dirtyLineTracker = true;\n            mainFileId = getStringId(file);\n            currentFileId = mainFileId;\n        }\n    }\n\n    // Set the debug source location tracker in the builder.\n    // The upcoming instructions in basic blocks will be associated to this location.\n    void setDebugSourceLocation(int line, const char* filename)\n    {\n        if (trackDebugInfo) {\n            dirtyLineTracker = true;\n            if (line != 0) {\n                // TODO: This is special handling of some AST nodes having (untracked) line 0. \n                //       But they should have a valid line number.\n                currentLine = line;\n                if (filename) {\n                    currentFileId = getStringId(filename);\n                }\n            }\n        }\n    }\n\n    void setSourceText(const std::string& text) { sourceText = text; }\n    void addSourceExtension(const char* ext) { sourceExtensions.push_back(ext); }\n    void addModuleProcessed(const std::string& p) { moduleProcesses.push_back(p.c_str()); }\n    void setEmitSpirvDebugInfo()\n    {\n        trackDebugInfo = true;\n        emitSpirvDebugInfo = true;\n    }\n    void setEmitNonSemanticShaderDebugInfo(bool emitSourceText)\n    {\n        trackDebugInfo = true;\n        emitNonSemanticShaderDebugInfo = true;\n        importNonSemanticShaderDebugInfoInstructions();\n\n        if (emitSourceText) {\n            emitNonSemanticShaderDebugSource = emitSourceText;\n        }\n    }\n    void addExtension(const char* ext) { extensions.insert(ext); }\n    void removeExtension(const char* ext)\n    {\n        extensions.erase(ext);\n    }\n    void addIncorporatedExtension(const char* ext, SpvVersion incorporatedVersion)\n    {\n        if (getSpvVersion() < static_cast<unsigned>(incorporatedVersion))\n            addExtension(ext);\n    }\n    void promoteIncorporatedExtension(const char* baseExt, const char* promoExt, SpvVersion incorporatedVersion)\n    {\n        removeExtension(baseExt);\n        addIncorporatedExtension(promoExt, incorporatedVersion);\n    }\n    void addInclude(const std::string& name, const std::string& text)\n    {\n        spv::Id incId = getStringId(name);\n        includeFiles[incId] = &text;\n    }\n    Id import(const char*);\n    void setMemoryModel(spv::AddressingModel addr, spv::MemoryModel mem)\n    {\n        addressModel = addr;\n        memoryModel = mem;\n    }\n\n    void addCapability(spv::Capability cap) { capabilities.insert(cap); }\n\n    // To get a new <id> for anything needing a new one.\n    Id getUniqueId() { return ++uniqueId; }\n\n    // To get a set of new <id>s, e.g., for a set of function parameters\n    Id getUniqueIds(int numIds)\n    {\n        Id id = uniqueId + 1;\n        uniqueId += numIds;\n        return id;\n    }\n\n    // For creating new types (will return old type if the requested one was already made).\n    Id makeVoidType();\n    Id makeBoolType();\n    Id makePointer(StorageClass, Id pointee);\n    Id makeForwardPointer(StorageClass);\n    Id makePointerFromForwardPointer(StorageClass, Id forwardPointerType, Id pointee);\n    Id makeIntegerType(int width, bool hasSign);   // generic\n    Id makeIntType(int width) { return makeIntegerType(width, true); }\n    Id makeUintType(int width) { return makeIntegerType(width, false); }\n    Id makeFloatType(int width);\n    Id makeBFloat16Type();\n    Id makeFloatE5M2Type();\n    Id makeFloatE4M3Type();\n    Id makeStructType(const std::vector<Id>& members, const char* name, bool const compilerGenerated = true);\n    Id makeStructResultType(Id type0, Id type1);\n    Id makeVectorType(Id component, int size);\n    Id makeMatrixType(Id component, int cols, int rows);\n    Id makeArrayType(Id element, Id sizeId, int stride);  // 0 stride means no stride decoration\n    Id makeRuntimeArray(Id element);\n    Id makeFunctionType(Id returnType, const std::vector<Id>& paramTypes);\n    Id makeImageType(Id sampledType, Dim, bool depth, bool arrayed, bool ms, unsigned sampled, ImageFormat format);\n    Id makeSamplerType();\n    Id makeSampledImageType(Id imageType);\n    Id makeCooperativeMatrixTypeKHR(Id component, Id scope, Id rows, Id cols, Id use);\n    Id makeCooperativeMatrixTypeNV(Id component, Id scope, Id rows, Id cols);\n    Id makeCooperativeMatrixTypeWithSameShape(Id component, Id otherType);\n    Id makeCooperativeVectorTypeNV(Id componentType, Id components);\n    Id makeGenericType(spv::Op opcode, std::vector<spv::IdImmediate>& operands);\n\n    // SPIR-V NonSemantic Shader DebugInfo Instructions\n    struct DebugTypeLoc {\n        std::string name {};\n        int line {0};\n        int column {0};\n    };\n    std::unordered_map<Id, DebugTypeLoc> debugTypeLocs;\n    Id makeDebugInfoNone();\n    Id makeBoolDebugType(int const size);\n    Id makeIntegerDebugType(int const width, bool const hasSign);\n    Id makeFloatDebugType(int const width);\n    Id makeSequentialDebugType(Id const baseType, Id const componentCount, NonSemanticShaderDebugInfo100Instructions const sequenceType);\n    Id makeArrayDebugType(Id const baseType, Id const componentCount);\n    Id makeVectorDebugType(Id const baseType, int const componentCount);\n    Id makeMatrixDebugType(Id const vectorType, int const vectorCount, bool columnMajor = true);\n    Id makeMemberDebugType(Id const memberType, DebugTypeLoc const& debugTypeLoc);\n    Id makeCompositeDebugType(std::vector<Id> const& memberTypes, char const*const name,\n        NonSemanticShaderDebugInfo100DebugCompositeType const tag, bool const isOpaqueType = false);\n    Id makePointerDebugType(StorageClass storageClass, Id const baseType);\n    Id makeForwardPointerDebugType(StorageClass storageClass);\n    Id makeDebugSource(const Id fileName);\n    Id makeDebugCompilationUnit();\n    Id createDebugGlobalVariable(Id const type, char const*const name, Id const variable);\n    Id createDebugLocalVariable(Id type, char const*const name, size_t const argNumber = 0);\n    Id makeDebugExpression();\n    Id makeDebugDeclare(Id const debugLocalVariable, Id const pointer);\n    Id makeDebugValue(Id const debugLocalVariable, Id const value);\n    Id makeDebugFunctionType(Id returnType, const std::vector<Id>& paramTypes);\n    Id makeDebugFunction(Function* function, Id nameId, Id funcTypeId);\n    Id makeDebugLexicalBlock(uint32_t line, uint32_t column);\n    std::string unmangleFunctionName(std::string const& name) const;\n\n    // Initialize non-semantic debug information for a function, including those of:\n    // - The function definition\n    // - The function parameters\n    void setupFunctionDebugInfo(Function* function, const char* name, const std::vector<Id>& paramTypes,\n                                const std::vector<char const*>& paramNames);\n\n    // accelerationStructureNV type\n    Id makeAccelerationStructureType();\n    // rayQueryEXT type\n    Id makeRayQueryType();\n    // hitObjectNV type\n    Id makeHitObjectNVType();\n\n    // For querying about types.\n    Id getTypeId(Id resultId) const { return module.getTypeId(resultId); }\n    Id getDerefTypeId(Id resultId) const;\n    Op getOpCode(Id id) const { return module.getInstruction(id)->getOpCode(); }\n    Op getTypeClass(Id typeId) const { return getOpCode(typeId); }\n    Op getMostBasicTypeClass(Id typeId) const;\n    unsigned int getNumComponents(Id resultId) const { return getNumTypeComponents(getTypeId(resultId)); }\n    unsigned int getNumTypeConstituents(Id typeId) const;\n    unsigned int getNumTypeComponents(Id typeId) const { return getNumTypeConstituents(typeId); }\n    Id getScalarTypeId(Id typeId) const;\n    Id getContainedTypeId(Id typeId) const;\n    Id getContainedTypeId(Id typeId, int) const;\n    StorageClass getTypeStorageClass(Id typeId) const { return module.getStorageClass(typeId); }\n    ImageFormat getImageTypeFormat(Id typeId) const\n        { return (ImageFormat)module.getInstruction(typeId)->getImmediateOperand(6); }\n    Id getResultingAccessChainType() const;\n    Id getIdOperand(Id resultId, int idx) { return module.getInstruction(resultId)->getIdOperand(idx); }\n    Id getCooperativeVectorNumComponents(Id typeId) const { return module.getInstruction(typeId)->getIdOperand(1); }\n\n    bool isPointer(Id resultId)      const { return isPointerType(getTypeId(resultId)); }\n    bool isScalar(Id resultId)       const { return isScalarType(getTypeId(resultId)); }\n    bool isVector(Id resultId)       const { return isVectorType(getTypeId(resultId)); }\n    bool isMatrix(Id resultId)       const { return isMatrixType(getTypeId(resultId)); }\n    bool isCooperativeMatrix(Id resultId)const { return isCooperativeMatrixType(getTypeId(resultId)); }\n    bool isCooperativeVector(Id resultId)const { return isCooperativeVectorType(getTypeId(resultId)); }\n    bool isAggregate(Id resultId)    const { return isAggregateType(getTypeId(resultId)); }\n    bool isSampledImage(Id resultId) const { return isSampledImageType(getTypeId(resultId)); }\n    bool isTensorView(Id resultId)const { return isTensorViewType(getTypeId(resultId)); }\n\n    bool isBoolType(Id typeId)\n        { return groupedTypes[enumCast(Op::OpTypeBool)].size() > 0 && typeId == groupedTypes[enumCast(Op::OpTypeBool)].back()->getResultId(); }\n    bool isIntType(Id typeId)          const\n        { return getTypeClass(typeId) == Op::OpTypeInt && module.getInstruction(typeId)->getImmediateOperand(1) != 0; }\n    bool isUintType(Id typeId)         const\n        { return getTypeClass(typeId) == Op::OpTypeInt && module.getInstruction(typeId)->getImmediateOperand(1) == 0; }\n    bool isFloatType(Id typeId)        const { return getTypeClass(typeId) == Op::OpTypeFloat; }\n    bool isPointerType(Id typeId)      const { return getTypeClass(typeId) == Op::OpTypePointer; }\n    bool isScalarType(Id typeId)       const\n        { return getTypeClass(typeId) == Op::OpTypeFloat || getTypeClass(typeId) == Op::OpTypeInt ||\n          getTypeClass(typeId) == Op::OpTypeBool; }\n    bool isVectorType(Id typeId)       const { return getTypeClass(typeId) == Op::OpTypeVector; }\n    bool isMatrixType(Id typeId)       const { return getTypeClass(typeId) == Op::OpTypeMatrix; }\n    bool isStructType(Id typeId)       const { return getTypeClass(typeId) == Op::OpTypeStruct; }\n    bool isArrayType(Id typeId)        const { return getTypeClass(typeId) == Op::OpTypeArray; }\n    bool isCooperativeMatrixType(Id typeId)const\n    {\n        return getTypeClass(typeId) == Op::OpTypeCooperativeMatrixKHR || getTypeClass(typeId) == Op::OpTypeCooperativeMatrixNV;\n    }\n    bool isTensorViewType(Id typeId) const { return getTypeClass(typeId) == Op::OpTypeTensorViewNV; }\n    bool isCooperativeVectorType(Id typeId) const { return getTypeClass(typeId) == Op::OpTypeCooperativeVectorNV; }\n    bool isAggregateType(Id typeId)    const\n        { return isArrayType(typeId) || isStructType(typeId) || isCooperativeMatrixType(typeId); }\n    bool isImageType(Id typeId)        const { return getTypeClass(typeId) == Op::OpTypeImage; }\n    bool isSamplerType(Id typeId)      const { return getTypeClass(typeId) == Op::OpTypeSampler; }\n    bool isSampledImageType(Id typeId) const { return getTypeClass(typeId) == Op::OpTypeSampledImage; }\n    bool containsType(Id typeId, Op typeOp, unsigned int width) const;\n    bool containsPhysicalStorageBufferOrArray(Id typeId) const;\n\n    bool isConstantOpCode(Op opcode) const;\n    bool isSpecConstantOpCode(Op opcode) const;\n    bool isConstant(Id resultId) const { return isConstantOpCode(getOpCode(resultId)); }\n    bool isConstantScalar(Id resultId) const { return getOpCode(resultId) == Op::OpConstant; }\n    bool isSpecConstant(Id resultId) const { return isSpecConstantOpCode(getOpCode(resultId)); }\n    unsigned int getConstantScalar(Id resultId) const\n        { return module.getInstruction(resultId)->getImmediateOperand(0); }\n    StorageClass getStorageClass(Id resultId) const { return getTypeStorageClass(getTypeId(resultId)); }\n\n    bool isVariableOpCode(Op opcode) const { return opcode == Op::OpVariable; }\n    bool isVariable(Id resultId) const { return isVariableOpCode(getOpCode(resultId)); }\n    bool isGlobalStorage(Id resultId) const { return getStorageClass(resultId) != StorageClass::Function; }\n    bool isGlobalVariable(Id resultId) const { return isVariable(resultId) && isGlobalStorage(resultId); }\n    // See if a resultId is valid for use as an initializer.\n    bool isValidInitializer(Id resultId) const { return isConstant(resultId) || isGlobalVariable(resultId); }\n\n    int getScalarTypeWidth(Id typeId) const\n    {\n        Id scalarTypeId = getScalarTypeId(typeId);\n        assert(getTypeClass(scalarTypeId) == Op::OpTypeInt || getTypeClass(scalarTypeId) == Op::OpTypeFloat);\n        return module.getInstruction(scalarTypeId)->getImmediateOperand(0);\n    }\n\n    unsigned int getTypeNumColumns(Id typeId) const\n    {\n        assert(isMatrixType(typeId));\n        return getNumTypeConstituents(typeId);\n    }\n    unsigned int getNumColumns(Id resultId) const { return getTypeNumColumns(getTypeId(resultId)); }\n    unsigned int getTypeNumRows(Id typeId) const\n    {\n        assert(isMatrixType(typeId));\n        return getNumTypeComponents(getContainedTypeId(typeId));\n    }\n    unsigned int getNumRows(Id resultId) const { return getTypeNumRows(getTypeId(resultId)); }\n\n    Dim getTypeDimensionality(Id typeId) const\n    {\n        assert(isImageType(typeId));\n        return (Dim)module.getInstruction(typeId)->getImmediateOperand(1);\n    }\n    Id getImageType(Id resultId) const\n    {\n        Id typeId = getTypeId(resultId);\n        assert(isImageType(typeId) || isSampledImageType(typeId));\n        return isSampledImageType(typeId) ? module.getInstruction(typeId)->getIdOperand(0) : typeId;\n    }\n    bool isArrayedImageType(Id typeId) const\n    {\n        assert(isImageType(typeId));\n        return module.getInstruction(typeId)->getImmediateOperand(3) != 0;\n    }\n\n    // For making new constants (will return old constant if the requested one was already made).\n    Id makeNullConstant(Id typeId);\n    Id makeBoolConstant(bool b, bool specConstant = false);\n    Id makeIntConstant(Id typeId, unsigned value, bool specConstant);\n    Id makeInt64Constant(Id typeId, unsigned long long value, bool specConstant);\n    Id makeInt8Constant(int i, bool specConstant = false)\n        { return makeIntConstant(makeIntType(8),  (unsigned)i, specConstant); }\n    Id makeUint8Constant(unsigned u, bool specConstant = false)\n        { return makeIntConstant(makeUintType(8),           u, specConstant); }\n    Id makeInt16Constant(int i, bool specConstant = false)\n        { return makeIntConstant(makeIntType(16),  (unsigned)i, specConstant); }\n    Id makeUint16Constant(unsigned u, bool specConstant = false)\n        { return makeIntConstant(makeUintType(16),           u, specConstant); }\n    Id makeIntConstant(int i, bool specConstant = false)\n        { return makeIntConstant(makeIntType(32),  (unsigned)i, specConstant); }\n    Id makeUintConstant(unsigned u, bool specConstant = false)\n        { return makeIntConstant(makeUintType(32),           u, specConstant); }\n    Id makeUintConstant(Scope u, bool specConstant = false)\n        { return makeUintConstant((unsigned)u, specConstant); }\n    Id makeUintConstant(StorageClass u, bool specConstant = false)\n        { return makeUintConstant((unsigned)u, specConstant); }\n    Id makeUintConstant(MemorySemanticsMask u, bool specConstant = false)\n        { return makeUintConstant((unsigned)u, specConstant); }\n    Id makeUintConstant(SourceLanguage u, bool specConstant = false)\n        { return makeUintConstant((unsigned)u, specConstant); }\n    Id makeInt64Constant(long long i, bool specConstant = false)\n        { return makeInt64Constant(makeIntType(64),  (unsigned long long)i, specConstant); }\n    Id makeUint64Constant(unsigned long long u, bool specConstant = false)\n        { return makeInt64Constant(makeUintType(64),                     u, specConstant); }\n    Id makeFloatConstant(float f, bool specConstant = false);\n    Id makeDoubleConstant(double d, bool specConstant = false);\n    Id makeFloat16Constant(float f16, bool specConstant = false);\n    Id makeBFloat16Constant(float bf16, bool specConstant = false);\n    Id makeFloatE5M2Constant(float fe5m2, bool specConstant = false);\n    Id makeFloatE4M3Constant(float fe4m3, bool specConstant = false);\n    Id makeFpConstant(Id type, double d, bool specConstant = false);\n\n    Id importNonSemanticShaderDebugInfoInstructions();\n\n    // Turn the array of constants into a proper spv constant of the requested type.\n    Id makeCompositeConstant(Id type, const std::vector<Id>& comps, bool specConst = false);\n\n    // Methods for adding information outside the CFG.\n    Instruction* addEntryPoint(ExecutionModel, Function*, const char* name);\n    void addExecutionMode(Function*, ExecutionMode mode, int value1 = -1, int value2 = -1, int value3 = -1);\n    void addExecutionMode(Function*, ExecutionMode mode, const std::vector<unsigned>& literals);\n    void addExecutionModeId(Function*, ExecutionMode mode, const std::vector<Id>& operandIds);\n    void addName(Id, const char* name);\n    void addMemberName(Id, int member, const char* name);\n    void addDecoration(Id, Decoration, int num = -1);\n    void addDecoration(Id, Decoration, const char*);\n    void addDecoration(Id, Decoration, const std::vector<unsigned>& literals);\n    void addDecoration(Id, Decoration, const std::vector<const char*>& strings);\n    void addLinkageDecoration(Id id, const char* name, spv::LinkageType linkType);\n    void addDecorationId(Id id, Decoration, Id idDecoration);\n    void addDecorationId(Id id, Decoration, const std::vector<Id>& operandIds);\n    void addMemberDecoration(Id, unsigned int member, Decoration, int num = -1);\n    void addMemberDecoration(Id, unsigned int member, Decoration, const char*);\n    void addMemberDecoration(Id, unsigned int member, Decoration, const std::vector<unsigned>& literals);\n    void addMemberDecoration(Id, unsigned int member, Decoration, const std::vector<const char*>& strings);\n\n    // At the end of what block do the next create*() instructions go?\n    // Also reset current last DebugScope and current source line to unknown\n    void setBuildPoint(Block* bp) {\n        buildPoint = bp;\n        dirtyLineTracker = true;\n        dirtyScopeTracker = true;\n    }\n    Block* getBuildPoint() const { return buildPoint; }\n\n    // Append an instruction to the end of the current build point.\n    // Optionally, additional debug info instructions may also be prepended.\n    void addInstruction(std::unique_ptr<Instruction> inst);\n\n    // Append an instruction to the end of the current build point without prepending any debug instructions.\n    // This is useful for insertion of some debug info instructions themselves or some control flow instructions\n    // that are attached to its predecessor instruction.\n    void addInstructionNoDebugInfo(std::unique_ptr<Instruction> inst);\n\n    // Make the entry-point function. The returned pointer is only valid\n    // for the lifetime of this builder.\n    Function* makeEntryPoint(const char*);\n\n    // Make a shader-style function, and create its entry block if entry is non-zero.\n    // Return the function, pass back the entry.\n    // The returned pointer is only valid for the lifetime of this builder.\n    Function* makeFunctionEntry(Decoration precision, Id returnType, const char* name, LinkageType linkType,\n                                const std::vector<Id>& paramTypes,\n                                const std::vector<std::vector<Decoration>>& precisions, Block** entry = nullptr);\n\n    // Create a return. An 'implicit' return is one not appearing in the source\n    // code.  In the case of an implicit return, no post-return block is inserted.\n    void makeReturn(bool implicit, Id retVal = 0);\n\n    // Initialize state and generate instructions for new lexical scope\n    void enterLexicalBlock(uint32_t line, uint32_t column);\n\n    // Set state and generate instructions to exit current lexical scope\n    void leaveLexicalBlock();\n\n    // Prepare builder for generation of instructions for a function.\n    void enterFunction(Function const* function);\n\n    // Generate all the code needed to finish up a function.\n    void leaveFunction();\n\n    // Create block terminator instruction for certain statements like\n    // discard, terminate-invocation, terminateRayEXT, or ignoreIntersectionEXT\n    void makeStatementTerminator(spv::Op opcode, const char *name);\n\n    // Create block terminator instruction for statements that have input operands\n    // such as OpEmitMeshTasksEXT\n    void makeStatementTerminator(spv::Op opcode, const std::vector<Id>& operands, const char* name);\n\n    // Create a global or function local or IO variable.\n    Id createVariable(Decoration precision, StorageClass storageClass, Id type, const char* name = nullptr,\n        Id initializer = NoResult, bool const compilerGenerated = true);\n\n    // Create an intermediate with an undefined value.\n    Id createUndefined(Id type);\n\n    // Store into an Id and return the l-value\n    void createStore(Id rValue, Id lValue, spv::MemoryAccessMask memoryAccess = spv::MemoryAccessMask::MaskNone,\n        spv::Scope scope = spv::Scope::Max, unsigned int alignment = 0);\n\n    // Load from an Id and return it\n    Id createLoad(Id lValue, spv::Decoration precision,\n        spv::MemoryAccessMask memoryAccess = spv::MemoryAccessMask::MaskNone,\n        spv::Scope scope = spv::Scope::Max, unsigned int alignment = 0);\n\n    // Create an OpAccessChain instruction\n    Id createAccessChain(StorageClass, Id base, const std::vector<Id>& offsets);\n\n    // Create an OpArrayLength instruction\n    Id createArrayLength(Id base, unsigned int member);\n\n    // Create an OpCooperativeMatrixLengthKHR instruction\n    Id createCooperativeMatrixLengthKHR(Id type);\n    // Create an OpCooperativeMatrixLengthNV instruction\n    Id createCooperativeMatrixLengthNV(Id type);\n\n    // Create an OpCompositeExtract instruction\n    Id createCompositeExtract(Id composite, Id typeId, unsigned index);\n    Id createCompositeExtract(Id composite, Id typeId, const std::vector<unsigned>& indexes);\n    Id createCompositeInsert(Id object, Id composite, Id typeId, unsigned index);\n    Id createCompositeInsert(Id object, Id composite, Id typeId, const std::vector<unsigned>& indexes);\n\n    Id createVectorExtractDynamic(Id vector, Id typeId, Id componentIndex);\n    Id createVectorInsertDynamic(Id vector, Id typeId, Id component, Id componentIndex);\n\n    void createNoResultOp(Op);\n    void createNoResultOp(Op, Id operand);\n    void createNoResultOp(Op, const std::vector<Id>& operands);\n    void createNoResultOp(Op, const std::vector<IdImmediate>& operands);\n    void createControlBarrier(Scope execution, Scope memory, MemorySemanticsMask);\n    void createMemoryBarrier(Scope executionScope, MemorySemanticsMask memorySemantics);\n    Id createUnaryOp(Op, Id typeId, Id operand);\n    Id createBinOp(Op, Id typeId, Id operand1, Id operand2);\n    Id createTriOp(Op, Id typeId, Id operand1, Id operand2, Id operand3);\n    Id createOp(Op, Id typeId, const std::vector<Id>& operands);\n    Id createOp(Op, Id typeId, const std::vector<IdImmediate>& operands);\n    Id createFunctionCall(spv::Function*, const std::vector<spv::Id>&);\n    Id createSpecConstantOp(Op, Id typeId, const std::vector<spv::Id>& operands, const std::vector<unsigned>& literals);\n\n    // Take an rvalue (source) and a set of channels to extract from it to\n    // make a new rvalue, which is returned.\n    Id createRvalueSwizzle(Decoration precision, Id typeId, Id source, const std::vector<unsigned>& channels);\n\n    // Take a copy of an lvalue (target) and a source of components, and set the\n    // source components into the lvalue where the 'channels' say to put them.\n    // An updated version of the target is returned.\n    // (No true lvalue or stores are used.)\n    Id createLvalueSwizzle(Id typeId, Id target, Id source, const std::vector<unsigned>& channels);\n\n    // If both the id and precision are valid, the id\n    // gets tagged with the requested precision.\n    // The passed in id is always the returned id, to simplify use patterns.\n    Id setPrecision(Id id, Decoration precision)\n    {\n        if (precision != NoPrecision && id != NoResult)\n            addDecoration(id, precision);\n\n        return id;\n    }\n\n    // Can smear a scalar to a vector for the following forms:\n    //   - promoteScalar(scalar, vector)  // smear scalar to width of vector\n    //   - promoteScalar(vector, scalar)  // smear scalar to width of vector\n    //   - promoteScalar(pointer, scalar) // smear scalar to width of what pointer points to\n    //   - promoteScalar(scalar, scalar)  // do nothing\n    // Other forms are not allowed.\n    //\n    // Generally, the type of 'scalar' does not need to be the same type as the components in 'vector'.\n    // The type of the created vector is a vector of components of the same type as the scalar.\n    //\n    // Note: One of the arguments will change, with the result coming back that way rather than\n    // through the return value.\n    void promoteScalar(Decoration precision, Id& left, Id& right);\n\n    // Make a value by smearing the scalar to fill the type.\n    // vectorType should be the correct type for making a vector of scalarVal.\n    // (No conversions are done.)\n    Id smearScalar(Decoration precision, Id scalarVal, Id vectorType);\n\n    // Create a call to a built-in function.\n    Id createBuiltinCall(Id resultType, Id builtins, int entryPoint, const std::vector<Id>& args);\n\n    // List of parameters used to create a texture operation\n    struct TextureParameters {\n        Id sampler;\n        Id coords;\n        Id bias;\n        Id lod;\n        Id Dref;\n        Id offset;\n        Id offsets;\n        Id gradX;\n        Id gradY;\n        Id sample;\n        Id component;\n        Id texelOut;\n        Id lodClamp;\n        Id granularity;\n        Id coarse;\n        bool nonprivate;\n        bool volatil;\n        bool nontemporal;\n    };\n\n    // Select the correct texture operation based on all inputs, and emit the correct instruction\n    Id createTextureCall(Decoration precision, Id resultType, bool sparse, bool fetch, bool proj, bool gather,\n        bool noImplicit, const TextureParameters&, ImageOperandsMask);\n\n    // Emit the OpTextureQuery* instruction that was passed in.\n    // Figure out the right return value and type, and return it.\n    Id createTextureQueryCall(Op, const TextureParameters&, bool isUnsignedResult);\n\n    Id createSamplePositionCall(Decoration precision, Id, Id);\n\n    Id createBitFieldExtractCall(Decoration precision, Id, Id, Id, bool isSigned);\n    Id createBitFieldInsertCall(Decoration precision, Id, Id, Id, Id);\n\n    // Reduction comparison for composites:  For equal and not-equal resulting in a scalar.\n    Id createCompositeCompare(Decoration precision, Id, Id, bool /* true if for equal, false if for not-equal */);\n\n    // OpCompositeConstruct\n    Id createCompositeConstruct(Id typeId, const std::vector<Id>& constituents);\n\n    // vector or scalar constructor\n    Id createConstructor(Decoration precision, const std::vector<Id>& sources, Id resultTypeId);\n\n    // matrix constructor\n    Id createMatrixConstructor(Decoration precision, const std::vector<Id>& sources, Id constructee);\n\n    // coopmat conversion\n    Id createCooperativeMatrixConversion(Id typeId, Id source);\n    Id createCooperativeMatrixReduce(Op opcode, Id typeId, Id source, unsigned int mask, Id func);\n    Id createCooperativeMatrixPerElementOp(Id typeId, const std::vector<Id>& operands);\n\n    // Helper to use for building nested control flow with if-then-else.\n    class If {\n    public:\n        If(Id condition, SelectionControlMask ctrl, Builder& builder);\n        ~If() {}\n\n        void makeBeginElse();\n        void makeEndIf();\n\n    private:\n        If(const If&);\n        If& operator=(If&);\n\n        Builder& builder;\n        Id condition;\n        SelectionControlMask control;\n        Function* function;\n        Block* headerBlock;\n        Block* thenBlock;\n        Block* elseBlock;\n        Block* mergeBlock;\n    };\n\n    // Make a switch statement.  A switch has 'numSegments' of pieces of code, not containing\n    // any case/default labels, all separated by one or more case/default labels.  Each possible\n    // case value v is a jump to the caseValues[v] segment.  The defaultSegment is also in this\n    // number space.  How to compute the value is given by 'condition', as in switch(condition).\n    //\n    // The SPIR-V Builder will maintain the stack of post-switch merge blocks for nested switches.\n    //\n    // Use a defaultSegment < 0 if there is no default segment (to branch to post switch).\n    //\n    // Returns the right set of basic blocks to start each code segment with, so that the caller's\n    // recursion stack can hold the memory for it.\n    //\n    void makeSwitch(Id condition, SelectionControlMask control, int numSegments, const std::vector<int>& caseValues,\n                    const std::vector<int>& valueToSegment, int defaultSegment, std::vector<Block*>& segmentBB);\n\n    // Add a branch to the innermost switch's merge block.\n    void addSwitchBreak(bool implicit);\n\n    // Move to the next code segment, passing in the return argument in makeSwitch()\n    void nextSwitchSegment(std::vector<Block*>& segmentBB, int segment);\n\n    // Finish off the innermost switch.\n    void endSwitch(std::vector<Block*>& segmentBB);\n\n    struct LoopBlocks {\n        LoopBlocks(Block& head, Block& body, Block& merge, Block& continue_target) :\n            head(head), body(body), merge(merge), continue_target(continue_target) { }\n        Block &head, &body, &merge, &continue_target;\n    private:\n        LoopBlocks();\n        LoopBlocks& operator=(const LoopBlocks&) = delete;\n    };\n\n    // Start a new loop and prepare the builder to generate code for it.  Until\n    // closeLoop() is called for this loop, createLoopContinue() and\n    // createLoopExit() will target its corresponding blocks.\n    LoopBlocks& makeNewLoop();\n\n    // Create a new block in the function containing the build point.  Memory is\n    // owned by the function object.\n    Block& makeNewBlock();\n\n    // Add a branch to the continue_target of the current (innermost) loop.\n    void createLoopContinue();\n\n    // Add an exit (e.g. \"break\") from the innermost loop that we're currently\n    // in.\n    void createLoopExit();\n\n    // Close the innermost loop that you're in\n    void closeLoop();\n\n    //\n    // Access chain design for an R-Value vs. L-Value:\n    //\n    // There is a single access chain the builder is building at\n    // any particular time.  Such a chain can be used to either to a load or\n    // a store, when desired.\n    //\n    // Expressions can be r-values, l-values, or both, or only r-values:\n    //    a[b.c].d = ....  // l-value\n    //    ... = a[b.c].d;  // r-value, that also looks like an l-value\n    //    ++a[b.c].d;      // r-value and l-value\n    //    (x + y)[2];      // r-value only, can't possibly be l-value\n    //\n    // Computing an r-value means generating code.  Hence,\n    // r-values should only be computed when they are needed, not speculatively.\n    //\n    // Computing an l-value means saving away information for later use in the compiler,\n    // no code is generated until the l-value is later dereferenced.  It is okay\n    // to speculatively generate an l-value, just not okay to speculatively dereference it.\n    //\n    // The base of the access chain (the left-most variable or expression\n    // from which everything is based) can be set either as an l-value\n    // or as an r-value.  Most efficient would be to set an l-value if one\n    // is available.  If an expression was evaluated, the resulting r-value\n    // can be set as the chain base.\n    //\n    // The users of this single access chain can save and restore if they\n    // want to nest or manage multiple chains.\n    //\n\n    struct AccessChain {\n        Id base;                       // for l-values, pointer to the base object, for r-values, the base object\n        std::vector<Id> indexChain;\n        Id instr;                      // cache the instruction that generates this access chain\n        std::vector<unsigned> swizzle; // each std::vector element selects the next GLSL component number\n        Id component;                  // a dynamic component index, can coexist with a swizzle,\n                                       // done after the swizzle, NoResult if not present\n        Id preSwizzleBaseType;         // dereferenced type, before swizzle or component is applied;\n                                       // NoType unless a swizzle or component is present\n        bool isRValue;                 // true if 'base' is an r-value, otherwise, base is an l-value\n        unsigned int alignment;        // bitwise OR of alignment values passed in. Accumulates worst alignment.\n                                       // Only tracks base and (optional) component selection alignment.\n\n        // Accumulate whether anything in the chain of structures has coherent decorations.\n        struct CoherentFlags {\n            CoherentFlags() { clear(); }\n            bool isVolatile() const { return volatil; }\n            bool isNonUniform() const { return nonUniform; }\n            bool anyCoherent() const {\n                return coherent || devicecoherent || queuefamilycoherent || workgroupcoherent ||\n                    subgroupcoherent || shadercallcoherent;\n            }\n\n            unsigned coherent : 1;\n            unsigned devicecoherent : 1;\n            unsigned queuefamilycoherent : 1;\n            unsigned workgroupcoherent : 1;\n            unsigned subgroupcoherent : 1;\n            unsigned shadercallcoherent : 1;\n            unsigned nonprivate : 1;\n            unsigned volatil : 1;\n            unsigned nontemporal : 1;\n            unsigned isImage : 1;\n            unsigned nonUniform : 1;\n\n            void clear() {\n                coherent = 0;\n                devicecoherent = 0;\n                queuefamilycoherent = 0;\n                workgroupcoherent = 0;\n                subgroupcoherent = 0;\n                shadercallcoherent = 0;\n                nonprivate = 0;\n                volatil = 0;\n                nontemporal = 0;\n                isImage = 0;\n                nonUniform = 0;\n            }\n\n            CoherentFlags operator |=(const CoherentFlags &other) {\n                coherent |= other.coherent;\n                devicecoherent |= other.devicecoherent;\n                queuefamilycoherent |= other.queuefamilycoherent;\n                workgroupcoherent |= other.workgroupcoherent;\n                subgroupcoherent |= other.subgroupcoherent;\n                shadercallcoherent |= other.shadercallcoherent;\n                nonprivate |= other.nonprivate;\n                volatil |= other.volatil;\n                nontemporal = other.nontemporal;\n                isImage |= other.isImage;\n                nonUniform |= other.nonUniform;\n                return *this;\n            }\n        };\n        CoherentFlags coherentFlags;\n    };\n\n    //\n    // the SPIR-V builder maintains a single active chain that\n    // the following methods operate on\n    //\n\n    // for external save and restore\n    AccessChain getAccessChain() { return accessChain; }\n    void setAccessChain(AccessChain newChain) { accessChain = newChain; }\n\n    // clear accessChain\n    void clearAccessChain();\n\n    // set new base as an l-value base\n    void setAccessChainLValue(Id lValue)\n    {\n        assert(isPointer(lValue));\n        accessChain.base = lValue;\n    }\n\n    // set new base value as an r-value\n    void setAccessChainRValue(Id rValue)\n    {\n        accessChain.isRValue = true;\n        accessChain.base = rValue;\n    }\n\n    // push offset onto the end of the chain\n    void accessChainPush(Id offset, AccessChain::CoherentFlags coherentFlags, unsigned int alignment)\n    {\n        accessChain.indexChain.push_back(offset);\n        accessChain.coherentFlags |= coherentFlags;\n        accessChain.alignment |= alignment;\n    }\n\n    // push new swizzle onto the end of any existing swizzle, merging into a single swizzle\n    void accessChainPushSwizzle(std::vector<unsigned>& swizzle, Id preSwizzleBaseType,\n        AccessChain::CoherentFlags coherentFlags, unsigned int alignment);\n\n    // push a dynamic component selection onto the access chain, only applicable with a\n    // non-trivial swizzle or no swizzle\n    void accessChainPushComponent(Id component, Id preSwizzleBaseType, AccessChain::CoherentFlags coherentFlags,\n        unsigned int alignment)\n    {\n        if (accessChain.swizzle.size() != 1) {\n            accessChain.component = component;\n            if (accessChain.preSwizzleBaseType == NoType)\n                accessChain.preSwizzleBaseType = preSwizzleBaseType;\n        }\n        accessChain.coherentFlags |= coherentFlags;\n        accessChain.alignment |= alignment;\n    }\n\n    // use accessChain and swizzle to store value\n    void accessChainStore(Id rvalue, Decoration nonUniform,\n        spv::MemoryAccessMask memoryAccess = spv::MemoryAccessMask::MaskNone,\n        spv::Scope scope = spv::Scope::Max, unsigned int alignment = 0);\n\n    // use accessChain and swizzle to load an r-value\n    Id accessChainLoad(Decoration precision, Decoration l_nonUniform, Decoration r_nonUniform, Id ResultType,\n        spv::MemoryAccessMask memoryAccess = spv::MemoryAccessMask::MaskNone, spv::Scope scope = spv::Scope::Max,\n            unsigned int alignment = 0);\n\n    // Return whether or not the access chain can be represented in SPIR-V\n    // as an l-value.\n    // E.g., a[3].yx cannot be, while a[3].y and a[3].y[x] can be.\n    bool isSpvLvalue() const { return accessChain.swizzle.size() <= 1; }\n\n    // get the direct pointer for an l-value\n    Id accessChainGetLValue();\n\n    // Get the inferred SPIR-V type of the result of the current access chain,\n    // based on the type of the base and the chain of dereferences.\n    Id accessChainGetInferredType();\n\n    // Add capabilities, extensions, remove unneeded decorations, etc.,\n    // based on the resulting SPIR-V.\n    void postProcess(bool compileOnly);\n\n    // Prune unreachable blocks in the CFG and remove unneeded decorations.\n    void postProcessCFG();\n\n    // Add capabilities, extensions based on instructions in the module.\n    void postProcessFeatures();\n    // Hook to visit each instruction in a block in a function\n    void postProcess(Instruction&);\n    // Hook to visit each non-32-bit sized float/int operation in a block.\n    void postProcessType(const Instruction&, spv::Id typeId);\n    // move OpSampledImage instructions to be next to their users.\n    void postProcessSamplers();\n\n    void dump(std::vector<unsigned int>&) const;\n\n    // Add a branch to the target block.\n    // If set implicit, the branch instruction shouldn't have debug source location.\n    void createBranch(bool implicit, Block* block);\n    void createConditionalBranch(Id condition, Block* thenBlock, Block* elseBlock);\n    void createLoopMerge(Block* mergeBlock, Block* continueBlock, LoopControlMask control,\n        const std::vector<unsigned int>& operands);\n\n    // Sets to generate opcode for specialization constants.\n    void setToSpecConstCodeGenMode() { generatingOpCodeForSpecConst = true; }\n    // Sets to generate opcode for non-specialization constants (normal mode).\n    void setToNormalCodeGenMode() { generatingOpCodeForSpecConst = false; }\n    // Check if the builder is generating code for spec constants.\n    bool isInSpecConstCodeGenMode() { return generatingOpCodeForSpecConst; }\n\n    void setUseReplicatedComposites(bool use) { useReplicatedComposites = use; }\n\n protected:\n    Id findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned value);\n    Id findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned v1, unsigned v2);\n    Id findCompositeConstant(Op typeClass, Op opcode, Id typeId, const std::vector<Id>& comps, size_t numMembers);\n    Id findStructConstant(Id typeId, const std::vector<Id>& comps);\n    Id collapseAccessChain();\n    void remapDynamicSwizzle();\n    void transferAccessChainSwizzle(bool dynamic);\n    void simplifyAccessChainSwizzle();\n    void createAndSetNoPredecessorBlock(const char*);\n    void createSelectionMerge(Block* mergeBlock, SelectionControlMask control);\n    void dumpSourceInstructions(std::vector<unsigned int>&) const;\n    void dumpSourceInstructions(const spv::Id fileId, const std::string& text, std::vector<unsigned int>&) const;\n    template <class Range> void dumpInstructions(std::vector<unsigned int>& out, const Range& instructions) const;\n    void dumpModuleProcesses(std::vector<unsigned int>&) const;\n    spv::MemoryAccessMask sanitizeMemoryAccessForStorageClass(spv::MemoryAccessMask memoryAccess, StorageClass sc)\n        const;\n    struct DecorationInstructionLessThan {\n        bool operator()(const std::unique_ptr<Instruction>& lhs, const std::unique_ptr<Instruction>& rhs) const;\n    };\n\n    unsigned int spvVersion;     // the version of SPIR-V to emit in the header\n    SourceLanguage sourceLang;\n    int sourceVersion;\n    spv::Id nonSemanticShaderCompilationUnitId {0};\n    spv::Id nonSemanticShaderDebugInfo {0};\n    spv::Id debugInfoNone {0};\n    spv::Id debugExpression {0}; // Debug expression with zero operations.\n    std::string sourceText;\n\n    // True if an new OpLine/OpDebugLine may need to be inserted. Either:\n    // 1. The current debug location changed\n    // 2. The current build point changed\n    bool dirtyLineTracker;\n    int currentLine = 0;\n    // OpString id of the current file name. Always 0 if debug info is off.\n    spv::Id currentFileId = 0;\n    // OpString id of the main file name. Always 0 if debug info is off.\n    spv::Id mainFileId = 0;\n\n    // True if an new OpDebugScope may need to be inserted. Either:\n    // 1. A new lexical block is pushed\n    // 2. The current build point changed\n    bool dirtyScopeTracker;\n    std::stack<spv::Id> currentDebugScopeId;\n\n    // This flag toggles tracking of debug info while building the SPIR-V.\n    bool trackDebugInfo = false;\n    // This flag toggles emission of SPIR-V debug instructions, like OpLine and OpSource.\n    bool emitSpirvDebugInfo = false;\n    // This flag toggles emission of Non-Semantic Debug extension debug instructions.\n    bool emitNonSemanticShaderDebugInfo = false;\n    bool restoreNonSemanticShaderDebugInfo = false;\n    bool emitNonSemanticShaderDebugSource = false;\n\n    std::set<std::string> extensions;\n    std::vector<const char*> sourceExtensions;\n    std::vector<const char*> moduleProcesses;\n    AddressingModel addressModel;\n    MemoryModel memoryModel;\n    std::set<spv::Capability> capabilities;\n    int builderNumber;\n    Module module;\n    Block* buildPoint;\n    Id uniqueId;\n    Function* entryPointFunction;\n    bool generatingOpCodeForSpecConst;\n    bool useReplicatedComposites { false };\n    AccessChain accessChain;\n\n    // special blocks of instructions for output\n    std::vector<std::unique_ptr<Instruction> > strings;\n    std::vector<std::unique_ptr<Instruction> > imports;\n    std::vector<std::unique_ptr<Instruction> > entryPoints;\n    std::vector<std::unique_ptr<Instruction> > executionModes;\n    std::vector<std::unique_ptr<Instruction> > names;\n    std::set<std::unique_ptr<Instruction>, DecorationInstructionLessThan> decorations;\n    std::vector<std::unique_ptr<Instruction> > constantsTypesGlobals;\n    std::vector<std::unique_ptr<Instruction> > externals;\n    std::vector<std::unique_ptr<Function> > functions;\n\n    // not output, internally used for quick & dirty canonical (unique) creation\n\n    // map type opcodes to constant inst.\n    std::unordered_map<unsigned int, std::vector<Instruction*>> groupedConstants;\n    // map struct-id to constant instructions\n    std::unordered_map<unsigned int, std::vector<Instruction*>> groupedStructConstants;\n    // map type opcodes to type instructions\n    std::unordered_map<unsigned int, std::vector<Instruction*>> groupedTypes;\n    // map type opcodes to debug type instructions\n    std::unordered_map<unsigned int, std::vector<Instruction*>> groupedDebugTypes;\n    // list of OpConstantNull instructions\n    std::vector<Instruction*> nullConstants;\n\n    // Track which types have explicit layouts, to avoid reusing in storage classes without layout.\n    // Currently only tracks array types.\n    std::unordered_set<unsigned int> explicitlyLaidOut;\n\n    // stack of switches\n    std::stack<Block*> switchMerges;\n\n    // Our loop stack.\n    std::stack<LoopBlocks> loops;\n\n    // map from strings to their string ids\n    std::unordered_map<std::string, spv::Id> stringIds;\n\n    // map from include file name ids to their contents\n    std::map<spv::Id, const std::string*> includeFiles;\n\n    // map from core id to debug id\n    std::map <spv::Id, spv::Id> debugId;\n\n    // map from file name string id to DebugSource id\n    std::unordered_map<spv::Id, spv::Id> debugSourceId;\n\n    // The stream for outputting warnings and errors.\n    SpvBuildLogger* logger;\n};  // end Builder class\n\n} // end spv namespace\n\n#endif // SpvBuilder_H\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/SpvPostProcess.cpp",
    "content": "//\n// Copyright (C) 2018 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Post-processing for SPIR-V IR, in internal form, not standard binary form.\n//\n\n#include <cassert>\n#include <cstdlib>\n\n#include <unordered_map>\n#include <unordered_set>\n#include <algorithm>\n\n#include \"SpvBuilder.h\"\n#include \"spirv.hpp11\"\n#include \"spvUtil.h\"\n\nnamespace spv {\n    #include \"GLSL.std.450.h\"\n    #include \"GLSL.ext.KHR.h\"\n    #include \"GLSL.ext.EXT.h\"\n    #include \"GLSL.ext.AMD.h\"\n    #include \"GLSL.ext.NV.h\"\n    #include \"GLSL.ext.ARM.h\"\n    #include \"GLSL.ext.QCOM.h\"\n}\n\nnamespace spv {\n\n// Hook to visit each operand type and result type of an instruction.\n// Will be called multiple times for one instruction, once for each typed\n// operand and the result.\nvoid Builder::postProcessType(const Instruction& inst, Id typeId)\n{\n    // Characterize the type being questioned\n    Op basicTypeOp = getMostBasicTypeClass(typeId);\n    int width = 0;\n    if (basicTypeOp == Op::OpTypeFloat || basicTypeOp == Op::OpTypeInt)\n        width = getScalarTypeWidth(typeId);\n\n    // Do opcode-specific checks\n    switch (inst.getOpCode()) {\n    case Op::OpLoad:\n    case Op::OpStore:\n        if (basicTypeOp == Op::OpTypeStruct) {\n            if (containsType(typeId, Op::OpTypeInt, 8))\n                addCapability(Capability::Int8);\n            if (containsType(typeId, Op::OpTypeInt, 16))\n                addCapability(Capability::Int16);\n            if (containsType(typeId, Op::OpTypeFloat, 16))\n                addCapability(Capability::Float16);\n        } else {\n            StorageClass storageClass = getStorageClass(inst.getIdOperand(0));\n            if (width == 8) {\n                switch (storageClass) {\n                case StorageClass::PhysicalStorageBufferEXT:\n                case StorageClass::Uniform:\n                case StorageClass::StorageBuffer:\n                case StorageClass::PushConstant:\n                    break;\n                default:\n                    addCapability(Capability::Int8);\n                    break;\n                }\n            } else if (width == 16) {\n                switch (storageClass) {\n                case StorageClass::PhysicalStorageBufferEXT:\n                case StorageClass::Uniform:\n                case StorageClass::StorageBuffer:\n                case StorageClass::PushConstant:\n                case StorageClass::Input:\n                case StorageClass::Output:\n                    break;\n                default:\n                    if (basicTypeOp == Op::OpTypeInt)\n                        addCapability(Capability::Int16);\n                    if (basicTypeOp == Op::OpTypeFloat)\n                        addCapability(Capability::Float16);\n                    break;\n                }\n            }\n        }\n        break;\n    case Op::OpCopyObject:\n        break;\n    case Op::OpFConvert:\n    case Op::OpSConvert:\n    case Op::OpUConvert:\n        // Look for any 8/16-bit storage capabilities. If there are none, assume that\n        // the convert instruction requires the Float16/Int8/16 capability.\n        if (containsType(typeId, Op::OpTypeFloat, 16) || containsType(typeId, Op::OpTypeInt, 16)) {\n            bool foundStorage = false;\n            for (auto it = capabilities.begin(); it != capabilities.end(); ++it) {\n                spv::Capability cap = *it;\n                if (cap == spv::Capability::StorageInputOutput16 ||\n                    cap == spv::Capability::StoragePushConstant16 ||\n                    cap == spv::Capability::StorageUniformBufferBlock16 ||\n                    cap == spv::Capability::StorageUniform16) {\n                    foundStorage = true;\n                    break;\n                }\n            }\n            if (!foundStorage) {\n                if (containsType(typeId, Op::OpTypeFloat, 16))\n                    addCapability(Capability::Float16);\n                if (containsType(typeId, Op::OpTypeInt, 16))\n                    addCapability(Capability::Int16);\n            }\n        }\n        if (containsType(typeId, Op::OpTypeInt, 8)) {\n            bool foundStorage = false;\n            for (auto it = capabilities.begin(); it != capabilities.end(); ++it) {\n                spv::Capability cap = *it;\n                if (cap == spv::Capability::StoragePushConstant8 ||\n                    cap == spv::Capability::UniformAndStorageBuffer8BitAccess ||\n                    cap == spv::Capability::StorageBuffer8BitAccess) {\n                    foundStorage = true;\n                    break;\n                }\n            }\n            if (!foundStorage) {\n                addCapability(Capability::Int8);\n            }\n        }\n        break;\n    case Op::OpExtInst:\n        switch (inst.getImmediateOperand(1)) {\n        case GLSLstd450Frexp:\n        case GLSLstd450FrexpStruct:\n            if (getSpvVersion() < spv::Spv_1_3 && containsType(typeId, Op::OpTypeInt, 16))\n                addExtension(spv::E_SPV_AMD_gpu_shader_int16);\n            break;\n        case GLSLstd450InterpolateAtCentroid:\n        case GLSLstd450InterpolateAtSample:\n        case GLSLstd450InterpolateAtOffset:\n            if (getSpvVersion() < spv::Spv_1_3 && containsType(typeId, Op::OpTypeFloat, 16))\n                addExtension(spv::E_SPV_AMD_gpu_shader_half_float);\n            break;\n        default:\n            break;\n        }\n        break;\n    case Op::OpAccessChain:\n    case Op::OpPtrAccessChain:\n        if (isPointerType(typeId))\n            break;\n        if (basicTypeOp == Op::OpTypeInt) {\n            if (width == 16)\n                addCapability(Capability::Int16);\n            else if (width == 8)\n                addCapability(Capability::Int8);\n        }\n        break;\n    default:\n        if (basicTypeOp == Op::OpTypeInt) {\n            if (width == 16)\n                addCapability(Capability::Int16);\n            else if (width == 8)\n                addCapability(Capability::Int8);\n            else if (width == 64)\n                addCapability(Capability::Int64);\n        } else if (basicTypeOp == Op::OpTypeFloat) {\n            if (width == 16)\n                addCapability(Capability::Float16);\n            else if (width == 64)\n                addCapability(Capability::Float64);\n        }\n        break;\n    }\n}\n\n// Called for each instruction that resides in a block.\nvoid Builder::postProcess(Instruction& inst)\n{\n    // Add capabilities based simply on the opcode.\n    switch (inst.getOpCode()) {\n    case Op::OpExtInst:\n        switch (inst.getImmediateOperand(1)) {\n        case GLSLstd450InterpolateAtCentroid:\n        case GLSLstd450InterpolateAtSample:\n        case GLSLstd450InterpolateAtOffset:\n            addCapability(Capability::InterpolationFunction);\n            break;\n        default:\n            break;\n        }\n        break;\n    case Op::OpDPdxFine:\n    case Op::OpDPdyFine:\n    case Op::OpFwidthFine:\n    case Op::OpDPdxCoarse:\n    case Op::OpDPdyCoarse:\n    case Op::OpFwidthCoarse:\n        addCapability(Capability::DerivativeControl);\n        break;\n\n    case Op::OpImageQueryLod:\n    case Op::OpImageQuerySize:\n    case Op::OpImageQuerySizeLod:\n    case Op::OpImageQuerySamples:\n    case Op::OpImageQueryLevels:\n        addCapability(Capability::ImageQuery);\n        break;\n\n    case Op::OpGroupNonUniformPartitionNV:\n        addExtension(E_SPV_NV_shader_subgroup_partitioned);\n        addCapability(Capability::GroupNonUniformPartitionedNV);\n        break;\n\n    case Op::OpLoad:\n    case Op::OpStore:\n        {\n            // For any load/store to a PhysicalStorageBufferEXT, walk the accesschain\n            // index list to compute the misalignment. The pre-existing alignment value\n            // (set via Builder::AccessChain::alignment) only accounts for the base of\n            // the reference type and any scalar component selection in the accesschain,\n            // and this function computes the rest from the SPIR-V Offset decorations.\n            Instruction *accessChain = module.getInstruction(inst.getIdOperand(0));\n            if (accessChain->getOpCode() == Op::OpAccessChain) {\n                Instruction *base = module.getInstruction(accessChain->getIdOperand(0));\n                // Get the type of the base of the access chain. It must be a pointer type.\n                Id typeId = base->getTypeId();\n                Instruction *type = module.getInstruction(typeId);\n                assert(type->getOpCode() == Op::OpTypePointer);\n                if (type->getImmediateOperand(0) != StorageClass::PhysicalStorageBufferEXT) {\n                    break;\n                }\n                // Get the pointee type.\n                typeId = type->getIdOperand(1);\n                type = module.getInstruction(typeId);\n                // Walk the index list for the access chain. For each index, find any\n                // misalignment that can apply when accessing the member/element via\n                // Offset/ArrayStride/MatrixStride decorations, and bitwise OR them all\n                // together.\n                int alignment = 0;\n                for (int i = 1; i < accessChain->getNumOperands(); ++i) {\n                    Instruction *idx = module.getInstruction(accessChain->getIdOperand(i));\n                    if (type->getOpCode() == Op::OpTypeStruct) {\n                        assert(idx->getOpCode() == Op::OpConstant);\n                        unsigned int c = idx->getImmediateOperand(0);\n\n                        const auto function = [&](const std::unique_ptr<Instruction>& decoration) {\n                            if (decoration.get()->getOpCode() == Op::OpMemberDecorate &&\n                                decoration.get()->getIdOperand(0) == typeId &&\n                                decoration.get()->getImmediateOperand(1) == c &&\n                                (decoration.get()->getImmediateOperand(2) == Decoration::Offset ||\n                                 decoration.get()->getImmediateOperand(2) == Decoration::MatrixStride)) {\n                                alignment |= decoration.get()->getImmediateOperand(3);\n                            }\n                        };\n                        std::for_each(decorations.begin(), decorations.end(), function);\n                        // get the next member type\n                        typeId = type->getIdOperand(c);\n                        type = module.getInstruction(typeId);\n                    } else if (type->getOpCode() == Op::OpTypeArray ||\n                               type->getOpCode() == Op::OpTypeRuntimeArray) {\n                        const auto function = [&](const std::unique_ptr<Instruction>& decoration) {\n                            if (decoration.get()->getOpCode() == Op::OpDecorate &&\n                                decoration.get()->getIdOperand(0) == typeId &&\n                                decoration.get()->getImmediateOperand(1) == Decoration::ArrayStride) {\n                                alignment |= decoration.get()->getImmediateOperand(2);\n                            }\n                        };\n                        std::for_each(decorations.begin(), decorations.end(), function);\n                        // Get the element type\n                        typeId = type->getIdOperand(0);\n                        type = module.getInstruction(typeId);\n                    } else {\n                        // Once we get to any non-aggregate type, we're done.\n                        break;\n                    }\n                }\n                assert(inst.getNumOperands() >= 3);\n                auto const memoryAccess = (MemoryAccessMask)inst.getImmediateOperand((inst.getOpCode() == Op::OpStore) ? 2 : 1);\n                assert(anySet(memoryAccess, MemoryAccessMask::Aligned));\n                static_cast<void>(memoryAccess);\n                // Compute the index of the alignment operand.\n                int alignmentIdx = 2;\n                if (inst.getOpCode() == Op::OpStore)\n                    alignmentIdx++;\n                // Merge new and old (mis)alignment\n                alignment |= inst.getImmediateOperand(alignmentIdx);\n                // Pick the LSB\n                alignment = alignment & ~(alignment & (alignment-1));\n                // update the Aligned operand\n                inst.setImmediateOperand(alignmentIdx, alignment);\n            }\n            break;\n        }\n\n    default:\n        break;\n    }\n\n    // Checks based on type\n    if (inst.getTypeId() != NoType)\n        postProcessType(inst, inst.getTypeId());\n    for (int op = 0; op < inst.getNumOperands(); ++op) {\n        if (inst.isIdOperand(op)) {\n            // In blocks, these are always result ids, but we are relying on\n            // getTypeId() to return NoType for things like OpLabel.\n            if (getTypeId(inst.getIdOperand(op)) != NoType)\n                postProcessType(inst, getTypeId(inst.getIdOperand(op)));\n        }\n    }\n}\n\n// comment in header\nvoid Builder::postProcessCFG()\n{\n    // reachableBlocks is the set of blockss reached via control flow, or which are\n    // unreachable continue targert or unreachable merge.\n    std::unordered_set<const Block*> reachableBlocks;\n    std::unordered_map<Block*, Block*> headerForUnreachableContinue;\n    std::unordered_set<Block*> unreachableMerges;\n    std::unordered_set<Id> unreachableDefinitions;\n    // Collect IDs defined in unreachable blocks. For each function, label the\n    // reachable blocks first. Then for each unreachable block, collect the\n    // result IDs of the instructions in it.\n    for (auto fi = module.getFunctions().cbegin(); fi != module.getFunctions().cend(); fi++) {\n        Function* f = *fi;\n        Block* entry = f->getEntryBlock();\n        inReadableOrder(entry,\n            [&reachableBlocks, &unreachableMerges, &headerForUnreachableContinue]\n            (Block* b, ReachReason why, Block* header) {\n               reachableBlocks.insert(b);\n               if (why == ReachDeadContinue) headerForUnreachableContinue[b] = header;\n               if (why == ReachDeadMerge) unreachableMerges.insert(b);\n            });\n        for (auto bi = f->getBlocks().cbegin(); bi != f->getBlocks().cend(); bi++) {\n            Block* b = *bi;\n            if (unreachableMerges.count(b) != 0 || headerForUnreachableContinue.count(b) != 0) {\n                auto ii = b->getInstructions().cbegin();\n                ++ii; // Keep potential decorations on the label.\n                for (; ii != b->getInstructions().cend(); ++ii)\n                    unreachableDefinitions.insert(ii->get()->getResultId());\n            } else if (reachableBlocks.count(b) == 0) {\n                // The normal case for unreachable code.  All definitions are considered dead.\n                for (auto ii = b->getInstructions().cbegin(); ii != b->getInstructions().cend(); ++ii)\n                    unreachableDefinitions.insert(ii->get()->getResultId());\n            }\n        }\n    }\n\n    // Modify unreachable merge blocks and unreachable continue targets.\n    // Delete their contents.\n    for (auto mergeIter = unreachableMerges.begin(); mergeIter != unreachableMerges.end(); ++mergeIter) {\n        (*mergeIter)->rewriteAsCanonicalUnreachableMerge();\n    }\n    for (auto continueIter = headerForUnreachableContinue.begin();\n         continueIter != headerForUnreachableContinue.end();\n         ++continueIter) {\n        Block* continue_target = continueIter->first;\n        Block* header = continueIter->second;\n        continue_target->rewriteAsCanonicalUnreachableContinue(header);\n    }\n\n    // Remove unneeded decorations, for unreachable instructions\n    for (auto decorationIter = decorations.begin(); decorationIter != decorations.end();) {\n        Id decorationId = (*decorationIter)->getIdOperand(0);\n        if (unreachableDefinitions.count(decorationId) != 0) {\n            decorationIter = decorations.erase(decorationIter);\n        } else {\n            ++decorationIter;\n        }\n    }\n}\n\n// comment in header\nvoid Builder::postProcessFeatures() {\n    // Add per-instruction capabilities, extensions, etc.,\n\n    // Look for any 8/16 bit type in physical storage buffer class, and set the\n    // appropriate capability. This happens in createSpvVariable for other storage\n    // classes, but there isn't always a variable for physical storage buffer.\n    for (int t = 0; t < (int)groupedTypes[enumCast(Op::OpTypePointer)].size(); ++t) {\n        Instruction* type = groupedTypes[enumCast(Op::OpTypePointer)][t];\n        if (type->getImmediateOperand(0) == (unsigned)StorageClass::PhysicalStorageBufferEXT) {\n            if (containsType(type->getIdOperand(1), Op::OpTypeInt, 8)) {\n                addIncorporatedExtension(spv::E_SPV_KHR_8bit_storage, spv::Spv_1_5);\n                addCapability(spv::Capability::StorageBuffer8BitAccess);\n            }\n            if (containsType(type->getIdOperand(1), Op::OpTypeInt, 16) ||\n                containsType(type->getIdOperand(1), Op::OpTypeFloat, 16)) {\n                addIncorporatedExtension(spv::E_SPV_KHR_16bit_storage, spv::Spv_1_3);\n                addCapability(spv::Capability::StorageBuffer16BitAccess);\n            }\n        }\n    }\n\n    // process all block-contained instructions\n    for (auto fi = module.getFunctions().cbegin(); fi != module.getFunctions().cend(); fi++) {\n        Function* f = *fi;\n        for (auto bi = f->getBlocks().cbegin(); bi != f->getBlocks().cend(); bi++) {\n            Block* b = *bi;\n            for (auto ii = b->getInstructions().cbegin(); ii != b->getInstructions().cend(); ii++)\n                postProcess(*ii->get());\n\n            // For all local variables that contain pointers to PhysicalStorageBufferEXT, check whether\n            // there is an existing restrict/aliased decoration. If we don't find one, add Aliased as the\n            // default.\n            for (auto vi = b->getLocalVariables().cbegin(); vi != b->getLocalVariables().cend(); vi++) {\n                const Instruction& inst = *vi->get();\n                Id resultId = inst.getResultId();\n                if (containsPhysicalStorageBufferOrArray(getDerefTypeId(resultId))) {\n                    bool foundDecoration = false;\n                    const auto function = [&](const std::unique_ptr<Instruction>& decoration) {\n                        if (decoration.get()->getIdOperand(0) == resultId &&\n                            decoration.get()->getOpCode() == Op::OpDecorate &&\n                            (decoration.get()->getImmediateOperand(1) == spv::Decoration::AliasedPointerEXT ||\n                             decoration.get()->getImmediateOperand(1) == spv::Decoration::RestrictPointerEXT)) {\n                            foundDecoration = true;\n                        }\n                    };\n                    std::for_each(decorations.begin(), decorations.end(), function);\n                    if (!foundDecoration) {\n                        addDecoration(resultId, spv::Decoration::AliasedPointerEXT);\n                    }\n                }\n            }\n        }\n    }\n\n    // If any Vulkan memory model-specific functionality is used, update the\n    // OpMemoryModel to match.\n    if (capabilities.find(spv::Capability::VulkanMemoryModelKHR) != capabilities.end()) {\n        memoryModel = spv::MemoryModel::VulkanKHR;\n        addIncorporatedExtension(spv::E_SPV_KHR_vulkan_memory_model, spv::Spv_1_5);\n    }\n\n    // Add Aliased decoration if there's more than one Workgroup Block variable.\n    if (capabilities.find(spv::Capability::WorkgroupMemoryExplicitLayoutKHR) != capabilities.end()) {\n        assert(entryPoints.size() == 1);\n        auto &ep = entryPoints[0];\n\n        std::vector<Id> workgroup_variables;\n        for (int i = 0; i < (int)ep->getNumOperands(); i++) {\n            if (!ep->isIdOperand(i))\n                continue;\n\n            const Id id = ep->getIdOperand(i);\n            const Instruction *instr = module.getInstruction(id);\n            if (instr->getOpCode() != spv::Op::OpVariable)\n                continue;\n\n            if (instr->getImmediateOperand(0) == spv::StorageClass::Workgroup)\n                workgroup_variables.push_back(id);\n        }\n\n        if (workgroup_variables.size() > 1) {\n            for (size_t i = 0; i < workgroup_variables.size(); i++)\n                addDecoration(workgroup_variables[i], spv::Decoration::Aliased);\n        }\n    }\n}\n\n// SPIR-V requires that any instruction consuming the result of an OpSampledImage\n// be in the same block as the OpSampledImage instruction. This pass goes finds\n// uses of OpSampledImage where that is not the case and duplicates the\n// OpSampledImage to be immediately before the instruction that consumes it.\n// The old OpSampledImage is left in place, potentially with no users.\nvoid Builder::postProcessSamplers()\n{\n    // first, find all OpSampledImage instructions and store them in a map.\n    std::map<Id, Instruction*> sampledImageInstrs;\n    for (auto f: module.getFunctions()) {\n\tfor (auto b: f->getBlocks()) {\n\t    for (auto &i: b->getInstructions()) {\n        if (i->getOpCode() == spv::Op::OpSampledImage) {\n\t\t    sampledImageInstrs[i->getResultId()] = i.get();\n\t\t}\n\t    }\n\t}\n    }\n    // next find all uses of the given ids and rewrite them if needed.\n    for (auto f: module.getFunctions()) {\n\tfor (auto b: f->getBlocks()) {\n            auto &instrs = b->getInstructions();\n            for (size_t idx = 0; idx < instrs.size(); idx++) {\n                Instruction *i = instrs[idx].get();\n                for (int opnum = 0; opnum < i->getNumOperands(); opnum++) {\n                    // Is this operand of the current instruction the result of an OpSampledImage?\n                    if (i->isIdOperand(opnum) &&\n                        sampledImageInstrs.count(i->getIdOperand(opnum)))\n                    {\n                        Instruction *opSampImg = sampledImageInstrs[i->getIdOperand(opnum)];\n                        if (i->getBlock() != opSampImg->getBlock()) {\n                            Instruction *newInstr = new Instruction(getUniqueId(),\n                                                                    opSampImg->getTypeId(),\n                                                                    spv::Op::OpSampledImage);\n                            newInstr->addIdOperand(opSampImg->getIdOperand(0));\n                            newInstr->addIdOperand(opSampImg->getIdOperand(1));\n                            newInstr->setBlock(b);\n\n                            // rewrite the user of the OpSampledImage to use the new instruction.\n                            i->setIdOperand(opnum, newInstr->getResultId());\n                            // insert the new OpSampledImage right before the current instruction.\n                            instrs.insert(instrs.begin() + idx,\n                                    std::unique_ptr<Instruction>(newInstr));\n                            idx++;\n                        }\n                    }\n                }\n            }\n\t}\n    }\n}\n\n// comment in header\nvoid Builder::postProcess(bool compileOnly)\n{\n    // postProcessCFG needs an entrypoint to determine what is reachable, but if we are not creating an \"executable\" shader, we don't have an entrypoint\n    if (!compileOnly)\n        postProcessCFG();\n\n    postProcessFeatures();\n    postProcessSamplers();\n}\n\n} // end spv namespace\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/SpvTools.cpp",
    "content": "//\n// Copyright (C) 2014-2016 LunarG, Inc.\n// Copyright (C) 2018-2020 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Call into SPIRV-Tools to disassemble, validate, and optimize.\n//\n\n#if ENABLE_OPT\n\n#include <cstdio>\n#include <iostream>\n\n#include \"SpvTools.h\"\n#include \"spirv-tools/optimizer.hpp\"\n#include \"../glslang/MachineIndependent/localintermediate.h\"\n\nnamespace glslang {\n\n// Translate glslang's view of target versioning to what SPIRV-Tools uses.\nspv_target_env MapToSpirvToolsEnv(const SpvVersion& spvVersion, spv::SpvBuildLogger* logger)\n{\n    switch (spvVersion.vulkan) {\n    case glslang::EShTargetVulkan_1_0:\n        return spv_target_env::SPV_ENV_VULKAN_1_0;\n    case glslang::EShTargetVulkan_1_1:\n        switch (spvVersion.spv) {\n        case EShTargetSpv_1_0:\n        case EShTargetSpv_1_1:\n        case EShTargetSpv_1_2:\n        case EShTargetSpv_1_3:\n            return spv_target_env::SPV_ENV_VULKAN_1_1;\n        case EShTargetSpv_1_4:\n            return spv_target_env::SPV_ENV_VULKAN_1_1_SPIRV_1_4;\n        default:\n            logger->missingFunctionality(\"Target version for SPIRV-Tools validator\");\n            return spv_target_env::SPV_ENV_VULKAN_1_1;\n        }\n    case glslang::EShTargetVulkan_1_2:\n        return spv_target_env::SPV_ENV_VULKAN_1_2;\n    case glslang::EShTargetVulkan_1_3:\n        return spv_target_env::SPV_ENV_VULKAN_1_3;\n    case glslang::EShTargetVulkan_1_4:\n        return spv_target_env::SPV_ENV_VULKAN_1_4;\n    default:\n        break;\n    }\n\n    if (spvVersion.openGl > 0)\n        return spv_target_env::SPV_ENV_OPENGL_4_5;\n\n    logger->missingFunctionality(\"Target version for SPIRV-Tools validator\");\n    return spv_target_env::SPV_ENV_UNIVERSAL_1_0;\n}\n\nspv_target_env MapToSpirvToolsEnv(const glslang::TIntermediate& intermediate, spv::SpvBuildLogger* logger)\n{\n    return MapToSpirvToolsEnv(intermediate.getSpv(), logger);\n}\n\n// Callback passed to spvtools::Optimizer::SetMessageConsumer\nvoid OptimizerMesssageConsumer(spv_message_level_t level, const char *source,\n        const spv_position_t &position, const char *message)\n{\n    auto &out = std::cerr;\n    switch (level)\n    {\n    case SPV_MSG_FATAL:\n    case SPV_MSG_INTERNAL_ERROR:\n    case SPV_MSG_ERROR:\n        out << \"error: \";\n        break;\n    case SPV_MSG_WARNING:\n        out << \"warning: \";\n        break;\n    case SPV_MSG_INFO:\n    case SPV_MSG_DEBUG:\n        out << \"info: \";\n        break;\n    default:\n        break;\n    }\n    if (source)\n    {\n        out << source << \":\";\n    }\n    out << position.line << \":\" << position.column << \":\" << position.index << \":\";\n    if (message)\n    {\n        out << \" \" << message;\n    }\n    out << std::endl;\n}\n\n// Use the SPIRV-Tools disassembler to print SPIR-V using a SPV_ENV_UNIVERSAL_1_3 environment.\nvoid SpirvToolsDisassemble(std::ostream& out, const std::vector<unsigned int>& spirv)\n{\n    SpirvToolsDisassemble(out, spirv, spv_target_env::SPV_ENV_UNIVERSAL_1_3);\n}\n\n// Use the SPIRV-Tools disassembler to print SPIR-V with a provided SPIR-V environment.\nvoid SpirvToolsDisassemble(std::ostream& out, const std::vector<unsigned int>& spirv,\n                           spv_target_env requested_context)\n{\n    // disassemble\n    spv_context context = spvContextCreate(requested_context);\n    spv_text text;\n    spv_diagnostic diagnostic = nullptr;\n    spvBinaryToText(context, spirv.data(), spirv.size(),\n        SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES | SPV_BINARY_TO_TEXT_OPTION_INDENT,\n        &text, &diagnostic);\n\n    // dump\n    if (diagnostic == nullptr)\n        out << text->str;\n    else\n        spvDiagnosticPrint(diagnostic);\n\n    // teardown\n    spvDiagnosticDestroy(diagnostic);\n    spvContextDestroy(context);\n}\n\n// Apply the SPIRV-Tools validator to generated SPIR-V.\nvoid SpirvToolsValidate(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,\n                        spv::SpvBuildLogger* logger, bool prelegalization)\n{\n    // validate\n    spv_context context = spvContextCreate(MapToSpirvToolsEnv(intermediate.getSpv(), logger));\n    spv_const_binary_t binary = { spirv.data(), spirv.size() };\n    spv_diagnostic diagnostic = nullptr;\n    spv_validator_options options = spvValidatorOptionsCreate();\n    spvValidatorOptionsSetRelaxBlockLayout(options, intermediate.usingHlslOffsets());\n    spvValidatorOptionsSetBeforeHlslLegalization(options, prelegalization);\n    spvValidatorOptionsSetScalarBlockLayout(options, intermediate.usingScalarBlockLayout());\n    spvValidatorOptionsSetWorkgroupScalarBlockLayout(options, intermediate.usingScalarBlockLayout());\n    spvValidatorOptionsSetAllowOffsetTextureOperand(options, intermediate.usingTextureOffsetNonConst());\n    spvValidateWithOptions(context, options, &binary, &diagnostic);\n\n    // report\n    if (diagnostic != nullptr) {\n        logger->error(\"SPIRV-Tools Validation Errors\");\n        logger->error(diagnostic->error);\n    }\n\n    // tear down\n    spvValidatorOptionsDestroy(options);\n    spvDiagnosticDestroy(diagnostic);\n    spvContextDestroy(context);\n}\n\n// Apply the SPIRV-Tools optimizer to generated SPIR-V.  HLSL SPIR-V is legalized in the process.\nvoid SpirvToolsTransform(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,\n                         spv::SpvBuildLogger* logger, const SpvOptions* options)\n{\n    spv_target_env target_env = MapToSpirvToolsEnv(intermediate.getSpv(), logger);\n\n    spvtools::Optimizer optimizer(target_env);\n    optimizer.SetMessageConsumer(OptimizerMesssageConsumer);\n\n    // If debug (specifically source line info) is being generated, propagate\n    // line information into all SPIR-V instructions. This avoids loss of\n    // information when instructions are deleted or moved. Later, remove\n    // redundant information to minimize final SPRIR-V size.\n    if (options->stripDebugInfo) {\n        optimizer.RegisterPass(spvtools::CreateStripDebugInfoPass());\n    }\n    optimizer.RegisterPass(spvtools::CreateWrapOpKillPass());\n    optimizer.RegisterPass(spvtools::CreateDeadBranchElimPass());\n    optimizer.RegisterPass(spvtools::CreateMergeReturnPass());\n    optimizer.RegisterPass(spvtools::CreateInlineExhaustivePass());\n    optimizer.RegisterPass(spvtools::CreateEliminateDeadFunctionsPass());\n    optimizer.RegisterPass(spvtools::CreateScalarReplacementPass());\n    optimizer.RegisterPass(spvtools::CreateLocalAccessChainConvertPass());\n    optimizer.RegisterPass(spvtools::CreateLocalSingleBlockLoadStoreElimPass());\n    optimizer.RegisterPass(spvtools::CreateLocalSingleStoreElimPass());\n    optimizer.RegisterPass(spvtools::CreateSimplificationPass());\n    optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());\n    optimizer.RegisterPass(spvtools::CreateVectorDCEPass());\n    optimizer.RegisterPass(spvtools::CreateDeadInsertElimPass());\n    optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());\n    optimizer.RegisterPass(spvtools::CreateDeadBranchElimPass());\n    optimizer.RegisterPass(spvtools::CreateBlockMergePass());\n    optimizer.RegisterPass(spvtools::CreateLocalMultiStoreElimPass());\n    optimizer.RegisterPass(spvtools::CreateIfConversionPass());\n    optimizer.RegisterPass(spvtools::CreateSimplificationPass());\n    optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());\n    optimizer.RegisterPass(spvtools::CreateVectorDCEPass());\n    optimizer.RegisterPass(spvtools::CreateDeadInsertElimPass());\n    optimizer.RegisterPass(spvtools::CreateInterpolateFixupPass());\n    if (options->optimizeSize) {\n        optimizer.RegisterPass(spvtools::CreateRedundancyEliminationPass());\n        optimizer.RegisterPass(spvtools::CreateEliminateDeadInputComponentsSafePass());\n    }\n    optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());\n    optimizer.RegisterPass(spvtools::CreateCFGCleanupPass());\n\n    spvtools::OptimizerOptions spvOptOptions;\n    if (options->optimizerAllowExpandedIDBound)\n        spvOptOptions.set_max_id_bound(0x3FFFFFFF);\n    optimizer.SetTargetEnv(MapToSpirvToolsEnv(intermediate.getSpv(), logger));\n    spvOptOptions.set_run_validator(false); // The validator may run as a separate step later on\n    optimizer.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions);\n\n    if (options->optimizerAllowExpandedIDBound) {\n        if (spirv.size() > 3 && spirv[3] > kDefaultMaxIdBound) {\n            spvtools::Optimizer optimizer2(target_env);\n            optimizer2.SetMessageConsumer(OptimizerMesssageConsumer);\n            optimizer2.RegisterPass(spvtools::CreateCompactIdsPass());\n            optimizer2.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions);\n        }\n    }\n}\n\nbool SpirvToolsAnalyzeDeadOutputStores(spv_target_env target_env, std::vector<unsigned int>& spirv,\n                                       std::unordered_set<uint32_t>* live_locs,\n                                       std::unordered_set<uint32_t>* live_builtins,\n                                       spv::SpvBuildLogger*)\n{\n  spvtools::Optimizer optimizer(target_env);\n  optimizer.SetMessageConsumer(OptimizerMesssageConsumer);\n\n  optimizer.RegisterPass(spvtools::CreateAnalyzeLiveInputPass(live_locs, live_builtins));\n\n  spvtools::OptimizerOptions spvOptOptions;\n  optimizer.SetTargetEnv(target_env);\n  spvOptOptions.set_run_validator(false);\n  return optimizer.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions);\n}\n\nvoid SpirvToolsEliminateDeadOutputStores(spv_target_env target_env, std::vector<unsigned int>& spirv,\n                                         std::unordered_set<uint32_t>* live_locs,\n                                         std::unordered_set<uint32_t>* live_builtins,\n                                         spv::SpvBuildLogger*)\n{\n  spvtools::Optimizer optimizer(target_env);\n  optimizer.SetMessageConsumer(OptimizerMesssageConsumer);\n\n  optimizer.RegisterPass(spvtools::CreateEliminateDeadOutputStoresPass(live_locs, live_builtins));\n  optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass(false, true));\n  optimizer.RegisterPass(spvtools::CreateEliminateDeadOutputComponentsPass());\n  optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass(false, true));\n\n  spvtools::OptimizerOptions spvOptOptions;\n  optimizer.SetTargetEnv(target_env);\n  spvOptOptions.set_run_validator(false);\n  optimizer.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions);\n}\n\nvoid SpirvToolsEliminateDeadInputComponents(spv_target_env target_env, std::vector<unsigned int>& spirv,\n                                            spv::SpvBuildLogger*)\n{\n  spvtools::Optimizer optimizer(target_env);\n  optimizer.SetMessageConsumer(OptimizerMesssageConsumer);\n\n  optimizer.RegisterPass(spvtools::CreateEliminateDeadInputComponentsPass());\n  optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());\n\n  spvtools::OptimizerOptions spvOptOptions;\n  optimizer.SetTargetEnv(target_env);\n  spvOptOptions.set_run_validator(false);\n  optimizer.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions);\n}\n\n// Apply the SPIRV-Tools optimizer to strip debug info from SPIR-V.  This is implicitly done by\n// SpirvToolsTransform if spvOptions->stripDebugInfo is set, but can be called separately if\n// optimization is disabled.\nvoid SpirvToolsStripDebugInfo(const glslang::TIntermediate& intermediate,\n        std::vector<unsigned int>& spirv, spv::SpvBuildLogger* logger)\n{\n    spv_target_env target_env = MapToSpirvToolsEnv(intermediate.getSpv(), logger);\n\n    spvtools::Optimizer optimizer(target_env);\n    optimizer.SetMessageConsumer(OptimizerMesssageConsumer);\n\n    optimizer.RegisterPass(spvtools::CreateStripDebugInfoPass());\n\n    spvtools::OptimizerOptions spvOptOptions;\n    optimizer.SetTargetEnv(MapToSpirvToolsEnv(intermediate.getSpv(), logger));\n    spvOptOptions.set_run_validator(false); // The validator may run as a separate step later on\n    optimizer.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions);\n}\n\n} // end namespace glslang\n\n#endif\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/SpvTools.h",
    "content": "//\n// Copyright (C) 2014-2016 LunarG, Inc.\n// Copyright (C) 2018 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Call into SPIRV-Tools to disassemble, validate, and optimize.\n//\n\n#pragma once\n#ifndef GLSLANG_SPV_TOOLS_H\n#define GLSLANG_SPV_TOOLS_H\n\n#if ENABLE_OPT\n#include <vector>\n#include <ostream>\n#include <unordered_set>\n#include \"spirv-tools/libspirv.h\"\n#endif\n\n#include \"../glslang/MachineIndependent/Versions.h\"\n#include \"../glslang/Include/visibility.h\"\n#include \"GlslangToSpv.h\"\n#include \"Logger.h\"\n\nnamespace glslang {\n\n#if ENABLE_OPT\n\nclass TIntermediate;\n\n// Translate glslang's view of target versioning to what SPIRV-Tools uses.\nGLSLANG_EXPORT spv_target_env MapToSpirvToolsEnv(const SpvVersion& spvVersion, spv::SpvBuildLogger* logger);\nGLSLANG_EXPORT spv_target_env MapToSpirvToolsEnv(const glslang::TIntermediate& intermediate, spv::SpvBuildLogger* logger);\n\n// Use the SPIRV-Tools disassembler to print SPIR-V using a SPV_ENV_UNIVERSAL_1_3 environment.\nGLSLANG_EXPORT void SpirvToolsDisassemble(std::ostream& out, const std::vector<unsigned int>& spirv);\n\n// Use the SPIRV-Tools disassembler to print SPIR-V with a provided SPIR-V environment.\nGLSLANG_EXPORT void SpirvToolsDisassemble(std::ostream& out, const std::vector<unsigned int>& spirv,\n                                          spv_target_env requested_context);\n\n// Apply the SPIRV-Tools validator to generated SPIR-V.\nGLSLANG_EXPORT void SpirvToolsValidate(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,\n                                       spv::SpvBuildLogger*, bool prelegalization);\n\n// Apply the SPIRV-Tools optimizer to generated SPIR-V.  HLSL SPIR-V is legalized in the process.\nGLSLANG_EXPORT void SpirvToolsTransform(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,\n                                        spv::SpvBuildLogger*, const SpvOptions*);\n\n// Apply the SPIRV-Tools EliminateDeadInputComponents pass to generated SPIR-V. Put result in |spirv|.\nGLSLANG_EXPORT void SpirvToolsEliminateDeadInputComponents(spv_target_env target_env, std::vector<unsigned int>& spirv,\n                                                           spv::SpvBuildLogger*);\n\n// Apply the SPIRV-Tools AnalyzeDeadOutputStores pass to generated SPIR-V. Put result in |live_locs|.\n// Return true if the result is valid.\nGLSLANG_EXPORT bool SpirvToolsAnalyzeDeadOutputStores(spv_target_env target_env, std::vector<unsigned int>& spirv,\n                                                      std::unordered_set<uint32_t>* live_locs,\n                                                      std::unordered_set<uint32_t>* live_builtins,\n                                                      spv::SpvBuildLogger*);\n\n// Apply the SPIRV-Tools EliminateDeadOutputStores and AggressiveDeadCodeElimination passes to generated SPIR-V using\n// |live_locs|. Put result in |spirv|.\nGLSLANG_EXPORT void SpirvToolsEliminateDeadOutputStores(spv_target_env target_env, std::vector<unsigned int>& spirv,\n                                                        std::unordered_set<uint32_t>* live_locs,\n                                                        std::unordered_set<uint32_t>* live_builtins,\n                                                        spv::SpvBuildLogger*);\n\n// Apply the SPIRV-Tools optimizer to strip debug info from SPIR-V.  This is implicitly done by\n// SpirvToolsTransform if spvOptions->stripDebugInfo is set, but can be called separately if\n// optimization is disabled.\nGLSLANG_EXPORT void SpirvToolsStripDebugInfo(const glslang::TIntermediate& intermediate,\n                                             std::vector<unsigned int>& spirv, spv::SpvBuildLogger*);\n\n#endif\n\n} // end namespace glslang\n\n#endif // GLSLANG_SPV_TOOLS_H\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/bitutils.h",
    "content": "// Copyright (c) 2015-2016 The Khronos Group Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#ifndef LIBSPIRV_UTIL_BITUTILS_H_\n#define LIBSPIRV_UTIL_BITUTILS_H_\n\n#include <cstdint>\n#include <cstring>\n\nnamespace spvutils {\n\n// Performs a bitwise copy of source to the destination type Dest.\ntemplate <typename Dest, typename Src>\nDest BitwiseCast(Src source) {\n  Dest dest;\n  static_assert(sizeof(source) == sizeof(dest),\n                \"BitwiseCast: Source and destination must have the same size\");\n  std::memcpy(static_cast<void*>(&dest), &source, sizeof(dest));\n  return dest;\n}\n\n// SetBits<T, First, Num> returns an integer of type <T> with bits set\n// for position <First> through <First + Num - 1>, counting from the least\n// significant bit. In particular when Num == 0, no positions are set to 1.\n// A static assert will be triggered if First + Num > sizeof(T) * 8, that is,\n// a bit that will not fit in the underlying type is set.\ntemplate <typename T, size_t First = 0, size_t Num = 0>\nstruct SetBits {\n  static_assert(First < sizeof(T) * 8,\n                \"Tried to set a bit that is shifted too far.\");\n  const static T get = (T(1) << First) | SetBits<T, First + 1, Num - 1>::get;\n};\n\ntemplate <typename T, size_t Last>\nstruct SetBits<T, Last, 0> {\n  const static T get = T(0);\n};\n\n// This is all compile-time so we can put our tests right here.\nstatic_assert(SetBits<uint32_t, 0, 0>::get == uint32_t(0x00000000),\n              \"SetBits failed\");\nstatic_assert(SetBits<uint32_t, 0, 1>::get == uint32_t(0x00000001),\n              \"SetBits failed\");\nstatic_assert(SetBits<uint32_t, 31, 1>::get == uint32_t(0x80000000),\n              \"SetBits failed\");\nstatic_assert(SetBits<uint32_t, 1, 2>::get == uint32_t(0x00000006),\n              \"SetBits failed\");\nstatic_assert(SetBits<uint32_t, 30, 2>::get == uint32_t(0xc0000000),\n              \"SetBits failed\");\nstatic_assert(SetBits<uint32_t, 0, 31>::get == uint32_t(0x7FFFFFFF),\n              \"SetBits failed\");\nstatic_assert(SetBits<uint32_t, 0, 32>::get == uint32_t(0xFFFFFFFF),\n              \"SetBits failed\");\nstatic_assert(SetBits<uint32_t, 16, 16>::get == uint32_t(0xFFFF0000),\n              \"SetBits failed\");\n\nstatic_assert(SetBits<uint64_t, 0, 1>::get == uint64_t(0x0000000000000001LL),\n              \"SetBits failed\");\nstatic_assert(SetBits<uint64_t, 63, 1>::get == uint64_t(0x8000000000000000LL),\n              \"SetBits failed\");\nstatic_assert(SetBits<uint64_t, 62, 2>::get == uint64_t(0xc000000000000000LL),\n              \"SetBits failed\");\nstatic_assert(SetBits<uint64_t, 31, 1>::get == uint64_t(0x0000000080000000LL),\n              \"SetBits failed\");\nstatic_assert(SetBits<uint64_t, 16, 16>::get == uint64_t(0x00000000FFFF0000LL),\n              \"SetBits failed\");\n\n}  // namespace spvutils\n\n#endif  // LIBSPIRV_UTIL_BITUTILS_H_\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/disassemble.cpp",
    "content": "//\n// Copyright (C) 2014-2015 LunarG, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Disassembler for SPIR-V.\n//\n\n#include <cstdint>\n#include <cstdlib>\n#include <cstring>\n#include <cassert>\n#include <iomanip>\n#include <stack>\n#include <sstream>\n#include <cstring>\n#include <utility>\n\n#include \"disassemble.h\"\n#include \"doc.h\"\n#include \"spvUtil.h\"\n\nnamespace spv {\n    extern \"C\" {\n        // Include C-based headers that don't have a namespace\n        #include \"GLSL.std.450.h\"\n        #include \"GLSL.ext.AMD.h\"\n        #include \"GLSL.ext.NV.h\"\n        #include \"GLSL.ext.ARM.h\"\n        #include \"NonSemanticShaderDebugInfo100.h\"\n        #include \"GLSL.ext.QCOM.h\"\n    }\n}\nconst char* GlslStd450DebugNames[spv::GLSLstd450Count];\n\nnamespace spv {\n\nstatic const char* GLSLextAMDGetDebugNames(const char*, unsigned);\nstatic const char* GLSLextNVGetDebugNames(const char*, unsigned);\nstatic const char* NonSemanticShaderDebugInfo100GetDebugNames(unsigned);\n\nstatic void Kill(std::ostream& out, const char* message)\n{\n    out << std::endl << \"Disassembly failed: \" << message << std::endl;\n    exit(1);\n}\n\n// used to identify the extended instruction library imported when printing\nenum ExtInstSet {\n    GLSL450Inst,\n    GLSLextAMDInst,\n    GLSLextNVInst,\n    OpenCLExtInst,\n    NonSemanticDebugPrintfExtInst,\n    NonSemanticDebugBreakExtInst,\n    NonSemanticShaderDebugInfo100\n};\n\n// Container class for a single instance of a SPIR-V stream, with methods for disassembly.\nclass SpirvStream {\npublic:\n    SpirvStream(std::ostream& out, const std::vector<unsigned int>& stream) : out(out), stream(stream), word(0), nextNestedControl(0) { }\n    virtual ~SpirvStream() { }\n\n    void validate();\n    void processInstructions();\n\nprotected:\n    SpirvStream(const SpirvStream&);\n    SpirvStream& operator=(const SpirvStream&);\n    Op getOpCode(int id) const { return idInstruction[id] ? (Op)(stream[idInstruction[id]] & OpCodeMask) : Op::OpNop; }\n\n    // Output methods\n    void outputIndent();\n    void formatId(Id id, std::stringstream&);\n    void outputResultId(Id id);\n    void outputTypeId(Id id);\n    void outputId(Id id);\n    void outputMask(OperandClass operandClass, unsigned mask);\n    void disassembleImmediates(int numOperands);\n    void disassembleIds(int numOperands);\n    std::pair<int, std::string> decodeString();\n    int disassembleString();\n    void disassembleInstruction(Id resultId, Id typeId, Op opCode, int numOperands);\n\n    // Data\n    std::ostream& out;                       // where to write the disassembly\n    const std::vector<unsigned int>& stream; // the actual word stream\n    int size;                                // the size of the word stream\n    int word;                                // the next word of the stream to read\n\n    // map each <id> to the instruction that created it\n    Id bound;\n    std::vector<unsigned int> idInstruction;  // the word offset into the stream where the instruction for result [id] starts; 0 if not yet seen (forward reference or function parameter)\n\n    std::vector<std::string> idDescriptor;    // the best text string known for explaining the <id>\n\n    // schema\n    unsigned int schema;\n\n    // stack of structured-merge points\n    std::stack<Id> nestedControl;\n    Id nextNestedControl;         // need a slight delay for when we are nested\n};\n\nvoid SpirvStream::validate()\n{\n    size = (int)stream.size();\n    if (size < 4)\n        Kill(out, \"stream is too short\");\n\n    // Magic number\n    if (stream[word++] != MagicNumber) {\n        out << \"Bad magic number\";\n        return;\n    }\n\n    // Version\n    out << \"// Module Version \" << std::hex << stream[word++] << std::endl;\n\n    // Generator's magic number\n    out << \"// Generated by (magic number): \" << std::hex << stream[word++] << std::dec << std::endl;\n\n    // Result <id> bound\n    bound = stream[word++];\n    idInstruction.resize(bound);\n    idDescriptor.resize(bound);\n    out << \"// Id's are bound by \" << bound << std::endl;\n    out << std::endl;\n\n    // Reserved schema, must be 0 for now\n    schema = stream[word++];\n    if (schema != 0)\n        Kill(out, \"bad schema, must be 0\");\n}\n\n// Loop over all the instructions, in order, processing each.\n// Boiler plate for each is handled here directly, the rest is dispatched.\nvoid SpirvStream::processInstructions()\n{\n    // Instructions\n    while (word < size) {\n        int instructionStart = word;\n\n        // Instruction wordCount and opcode\n        unsigned int firstWord = stream[word];\n        unsigned wordCount = firstWord >> WordCountShift;\n        Op opCode = (Op)(firstWord & OpCodeMask);\n        int nextInst = word + wordCount;\n        ++word;\n\n        // Presence of full instruction\n        if (nextInst > size)\n            Kill(out, \"stream instruction terminated too early\");\n\n        // Base for computing number of operands; will be updated as more is learned\n        unsigned numOperands = wordCount - 1;\n\n        // Type <id>\n        Id typeId = 0;\n        if (InstructionDesc[enumCast(opCode)].hasType()) {\n            typeId = stream[word++];\n            --numOperands;\n        }\n\n        // Result <id>\n        Id resultId = 0;\n        if (InstructionDesc[enumCast(opCode)].hasResult()) {\n            resultId = stream[word++];\n            --numOperands;\n\n            // save instruction for future reference\n            idInstruction[resultId] = instructionStart;\n        }\n\n        outputResultId(resultId);\n        outputTypeId(typeId);\n        outputIndent();\n\n        // Hand off the Op and all its operands\n        disassembleInstruction(resultId, typeId, opCode, numOperands);\n        if (word != nextInst) {\n            out << \" ERROR, incorrect number of operands consumed.  At \" << word << \" instead of \" << nextInst << \" instruction start was \" << instructionStart;\n            word = nextInst;\n        }\n        out << std::endl;\n    }\n}\n\nvoid SpirvStream::outputIndent()\n{\n    for (int i = 0; i < (int)nestedControl.size(); ++i)\n        out << \"  \";\n}\n\nvoid SpirvStream::formatId(Id id, std::stringstream& idStream)\n{\n    if (id != 0) {\n        // On instructions with no IDs, this is called with \"0\", which does not\n        // have to be within ID bounds on null shaders.\n        if (id >= bound)\n            Kill(out, \"Bad <id>\");\n\n        idStream << id;\n        if (idDescriptor[id].size() > 0)\n            idStream << \"(\" << idDescriptor[id] << \")\";\n    }\n}\n\nvoid SpirvStream::outputResultId(Id id)\n{\n    const int width = 16;\n    std::stringstream idStream;\n    formatId(id, idStream);\n    out << std::setw(width) << std::right << idStream.str();\n    if (id != 0)\n        out << \":\";\n    else\n        out << \" \";\n\n    if (nestedControl.size() && id == nestedControl.top())\n        nestedControl.pop();\n}\n\nvoid SpirvStream::outputTypeId(Id id)\n{\n    const int width = 12;\n    std::stringstream idStream;\n    formatId(id, idStream);\n    out << std::setw(width) << std::right << idStream.str() << \" \";\n}\n\nvoid SpirvStream::outputId(Id id)\n{\n    if (id >= bound)\n        Kill(out, \"Bad <id>\");\n\n    out << id;\n    if (idDescriptor[id].size() > 0)\n        out << \"(\" << idDescriptor[id] << \")\";\n}\n\nvoid SpirvStream::outputMask(OperandClass operandClass, unsigned mask)\n{\n    if (mask == 0)\n        out << \"None\";\n    else {\n        for (int m = 0; m < OperandClassParams[operandClass].ceiling; ++m) {\n            if (mask & (1 << m))\n                out << OperandClassParams[operandClass].getName(m) << \" \";\n        }\n    }\n}\n\nvoid SpirvStream::disassembleImmediates(int numOperands)\n{\n    for (int i = 0; i < numOperands; ++i) {\n        out << stream[word++];\n        if (i < numOperands - 1)\n            out << \" \";\n    }\n}\n\nvoid SpirvStream::disassembleIds(int numOperands)\n{\n    for (int i = 0; i < numOperands; ++i) {\n        outputId(stream[word++]);\n        if (i < numOperands - 1)\n            out << \" \";\n    }\n}\n\n// decode string from words at current position (non-consuming)\nstd::pair<int, std::string> SpirvStream::decodeString()\n{\n    std::string res;\n    int wordPos = word;\n    char c;\n    bool done = false;\n\n    do {\n        unsigned int content = stream[wordPos];\n        for (int charCount = 0; charCount < 4; ++charCount) {\n            c = content & 0xff;\n            content >>= 8;\n            if (c == '\\0') {\n                done = true;\n                break;\n            }\n            res += c;\n        }\n        ++wordPos;\n    } while(! done);\n\n    return std::make_pair(wordPos - word, res);\n}\n\n// return the number of operands consumed by the string\nint SpirvStream::disassembleString()\n{\n    out << \" \\\"\";\n\n    std::pair<int, std::string> decoderes = decodeString();\n\n    out << decoderes.second;\n    out << \"\\\"\";\n\n    word += decoderes.first;\n\n    return decoderes.first;\n}\n\nstatic uint32_t popcount(uint32_t mask)\n{\n    uint32_t count = 0;\n    while (mask) {\n        if (mask & 1) {\n            count++;\n        }\n        mask >>= 1;\n    }\n    return count;\n}\n\nvoid SpirvStream::disassembleInstruction(Id resultId, Id /*typeId*/, Op opCode, int numOperands)\n{\n    // Process the opcode\n\n    out << (OpcodeString((int)opCode) + 2);  // leave out the \"Op\"\n\n    if (opCode == Op::OpLoopMerge || opCode == Op::OpSelectionMerge)\n        nextNestedControl = stream[word];\n    else if (opCode == Op::OpBranchConditional || opCode == Op::OpSwitch) {\n        if (nextNestedControl) {\n            nestedControl.push(nextNestedControl);\n            nextNestedControl = 0;\n        }\n    } else if (opCode == Op::OpExtInstImport) {\n        idDescriptor[resultId] = decodeString().second;\n    }\n    else {\n        if (resultId != 0 && idDescriptor[resultId].size() == 0) {\n            switch (opCode) {\n            case Op::OpTypeInt:\n                switch (stream[word]) {\n                case 8:  idDescriptor[resultId] = \"int8_t\"; break;\n                case 16: idDescriptor[resultId] = \"int16_t\"; break;\n                default: assert(0); [[fallthrough]];\n                case 32: idDescriptor[resultId] = \"int\"; break;\n                case 64: idDescriptor[resultId] = \"int64_t\"; break;\n                }\n                break;\n            case Op::OpTypeFloat:\n                switch (stream[word]) {\n                case 8:\n                case 16:\n                    if (numOperands > 1) {\n                        switch (stream[word+1]) {\n                        default:\n                            assert(0); [[fallthrough]];\n                        case (int)spv::FPEncoding::BFloat16KHR:\n                            idDescriptor[resultId] = \"bfloat16_t\";\n                            break;\n                        case (int)spv::FPEncoding::Float8E4M3EXT:\n                            idDescriptor[resultId] = \"floate4m3_t\";\n                            break;\n                        case (int)spv::FPEncoding::Float8E5M2EXT:\n                            idDescriptor[resultId] = \"floate5m2_t\";\n                            break;\n                        }\n                    } else {\n                        idDescriptor[resultId] = \"float16_t\";\n                    }\n                    break;\n                default: assert(0); [[fallthrough]];\n                case 32: idDescriptor[resultId] = \"float\"; break;\n                case 64: idDescriptor[resultId] = \"float64_t\"; break;\n                }\n                break;\n            case Op::OpTypeBool:\n                idDescriptor[resultId] = \"bool\";\n                break;\n            case Op::OpTypeStruct:\n                idDescriptor[resultId] = \"struct\";\n                break;\n            case Op::OpTypePointer:\n                idDescriptor[resultId] = \"ptr\";\n                break;\n            case Op::OpTypeVector:\n                if (idDescriptor[stream[word]].size() > 0) {\n                    if (idDescriptor[stream[word]].substr(0,2) == \"bf\") {\n                        idDescriptor[resultId].append(idDescriptor[stream[word]].begin(), idDescriptor[stream[word]].begin() + 2);\n                    } else {\n                        idDescriptor[resultId].append(idDescriptor[stream[word]].begin(), idDescriptor[stream[word]].begin() + 1);\n                    }\n                    if (strstr(idDescriptor[stream[word]].c_str(), \"8\")) {\n                        idDescriptor[resultId].append(\"8\");\n                    }\n                    if (strstr(idDescriptor[stream[word]].c_str(), \"16\")) {\n                        idDescriptor[resultId].append(\"16\");\n                    }\n                    if (strstr(idDescriptor[stream[word]].c_str(), \"64\")) {\n                        idDescriptor[resultId].append(\"64\");\n                    }\n                }\n                idDescriptor[resultId].append(\"vec\");\n                switch (stream[word + 1]) {\n                case 2:   idDescriptor[resultId].append(\"2\");   break;\n                case 3:   idDescriptor[resultId].append(\"3\");   break;\n                case 4:   idDescriptor[resultId].append(\"4\");   break;\n                case 8:   idDescriptor[resultId].append(\"8\");   break;\n                case 16:  idDescriptor[resultId].append(\"16\");  break;\n                case 32:  idDescriptor[resultId].append(\"32\");  break;\n                default: break;\n                }\n                break;\n            default:\n                break;\n            }\n        }\n    }\n\n    // Process the operands.  Note, a new context-dependent set could be\n    // swapped in mid-traversal.\n\n    // Handle images specially, so can put out helpful strings.\n    if (opCode == Op::OpTypeImage) {\n        out << \" \";\n        disassembleIds(1);\n        out << \" \" << DimensionString((int)(Dim)stream[word++]);\n        out << (stream[word++] != 0 ? \" depth\" : \"\");\n        out << (stream[word++] != 0 ? \" array\" : \"\");\n        out << (stream[word++] != 0 ? \" multi-sampled\" : \"\");\n        switch (stream[word++]) {\n        case 0: out << \" runtime\";    break;\n        case 1: out << \" sampled\";    break;\n        case 2: out << \" nonsampled\"; break;\n        }\n        out << \" format:\" << ImageFormatString((int)(ImageFormat)stream[word++]);\n\n        if (numOperands == 8) {\n            out << \" \" << AccessQualifierString(stream[word++]);\n        }\n        return;\n    }\n\n    // Handle all the parameterized operands\n    for (int op = 0; op < InstructionDesc[enumCast(opCode)].operands.getNum() && numOperands > 0; ++op) {\n        out << \" \";\n        OperandClass operandClass = InstructionDesc[enumCast(opCode)].operands.getClass(op);\n        switch (operandClass) {\n        case OperandId:\n        case OperandScope:\n        case OperandMemorySemantics:\n            disassembleIds(1);\n            --numOperands;\n            // Get names for printing \"(XXX)\" for readability, *after* this id\n            if (opCode == Op::OpName)\n                idDescriptor[stream[word - 1]] = decodeString().second;\n            break;\n        case OperandVariableIds:\n            disassembleIds(numOperands);\n            return;\n        case OperandImageOperands:\n            outputMask(OperandImageOperands, stream[word++]);\n            --numOperands;\n            disassembleIds(numOperands);\n            return;\n        case OperandOptionalLiteral:\n        case OperandVariableLiterals:\n            if ((opCode == Op::OpDecorate && stream[word - 1] == Decoration::BuiltIn) ||\n                (opCode == Op::OpMemberDecorate && stream[word - 1] == Decoration::BuiltIn)) {\n                out << BuiltInString(stream[word++]);\n                --numOperands;\n                ++op;\n            }\n            disassembleImmediates(numOperands);\n            return;\n        case OperandVariableIdLiteral:\n            while (numOperands > 0) {\n                out << std::endl;\n                outputResultId(0);\n                outputTypeId(0);\n                outputIndent();\n                out << \"     Type \";\n                disassembleIds(1);\n                out << \", member \";\n                disassembleImmediates(1);\n                numOperands -= 2;\n            }\n            return;\n        case OperandVariableLiteralId:\n            while (numOperands > 0) {\n                out << std::endl;\n                outputResultId(0);\n                outputTypeId(0);\n                outputIndent();\n                out << \"     case \";\n                disassembleImmediates(1);\n                out << \": \";\n                disassembleIds(1);\n                numOperands -= 2;\n            }\n            return;\n        case OperandLiteralNumber:\n            disassembleImmediates(1);\n            --numOperands;\n            if (opCode == Op::OpExtInst) {\n                ExtInstSet extInstSet = GLSL450Inst;\n                const char* name = idDescriptor[stream[word - 2]].c_str();\n                if (strcmp(\"OpenCL.std\", name) == 0) {\n                    extInstSet = OpenCLExtInst;\n                } else if (strcmp(\"OpenCL.DebugInfo.100\", name) == 0) {\n                    extInstSet = OpenCLExtInst;\n                } else if (strcmp(\"NonSemantic.DebugPrintf\", name) == 0) {\n                    extInstSet = NonSemanticDebugPrintfExtInst;\n                } else if (strcmp(\"NonSemantic.DebugBreak\", name) == 0) {\n                    extInstSet = NonSemanticDebugBreakExtInst;\n                } else if (strcmp(\"NonSemantic.Shader.DebugInfo.100\", name) == 0) {\n                    extInstSet = NonSemanticShaderDebugInfo100;\n                } else if (strcmp(spv::E_SPV_AMD_shader_ballot, name) == 0 ||\n                           strcmp(spv::E_SPV_AMD_shader_trinary_minmax, name) == 0 ||\n                           strcmp(spv::E_SPV_AMD_shader_explicit_vertex_parameter, name) == 0 ||\n                           strcmp(spv::E_SPV_AMD_gcn_shader, name) == 0) {\n                    extInstSet = GLSLextAMDInst;\n                } else if (strcmp(spv::E_SPV_NV_sample_mask_override_coverage, name) == 0 ||\n                          strcmp(spv::E_SPV_NV_geometry_shader_passthrough, name) == 0 ||\n                          strcmp(spv::E_SPV_NV_viewport_array2, name) == 0 ||\n                          strcmp(spv::E_SPV_NVX_multiview_per_view_attributes, name) == 0 ||\n                          strcmp(spv::E_SPV_NV_fragment_shader_barycentric, name) == 0 ||\n                          strcmp(spv::E_SPV_NV_mesh_shader, name) == 0) {\n                    extInstSet = GLSLextNVInst;\n                }\n                unsigned entrypoint = stream[word - 1];\n                if (extInstSet == GLSL450Inst) {\n                    if (entrypoint < GLSLstd450Count) {\n                        out << \"(\" << GlslStd450DebugNames[entrypoint] << \")\";\n                    }\n                } else if (extInstSet == GLSLextAMDInst) {\n                    out << \"(\" << GLSLextAMDGetDebugNames(name, entrypoint) << \")\";\n                }\n                else if (extInstSet == GLSLextNVInst) {\n                    out << \"(\" << GLSLextNVGetDebugNames(name, entrypoint) << \")\";\n                } else if (extInstSet == NonSemanticDebugPrintfExtInst) {\n                    out << \"(DebugPrintf)\";\n                } else if (extInstSet == NonSemanticDebugBreakExtInst) {\n                    out << \"(DebugBreak)\";\n                } else if (extInstSet == NonSemanticShaderDebugInfo100) {\n                    out << \"(\" << NonSemanticShaderDebugInfo100GetDebugNames(entrypoint) << \")\";\n                }\n            }\n            break;\n        case OperandOptionalLiteralString:\n        case OperandLiteralString:\n            numOperands -= disassembleString();\n            break;\n        case OperandVariableLiteralStrings:\n            while (numOperands > 0)\n                numOperands -= disassembleString();\n            return;\n        case OperandMemoryAccess:\n            {\n                outputMask(OperandMemoryAccess, stream[word++]);\n                --numOperands;\n                // Put a space after \"None\" if there are any remaining operands\n                if (numOperands && stream[word-1] == 0) {\n                    out << \" \";\n                }\n                uint32_t mask = stream[word-1];\n                // Aligned is the only memory access operand that uses an immediate\n                // value, and it is also the first operand that uses a value at all.\n                if (mask & (uint32_t)MemoryAccessMask::Aligned) {\n                    disassembleImmediates(1);\n                    numOperands--;\n                    if (numOperands)\n                        out << \" \";\n                }\n\n                uint32_t bitCount = popcount(mask & (uint32_t)(MemoryAccessMask::MakePointerAvailable | MemoryAccessMask::MakePointerVisible));\n                disassembleIds(bitCount);\n                numOperands -= bitCount;\n            }\n            break;\n        case OperandTensorAddressingOperands:\n            {\n                outputMask(OperandTensorAddressingOperands, stream[word++]);\n                --numOperands;\n                // Put a space after \"None\" if there are any remaining operands\n                if (numOperands && stream[word-1] == 0) {\n                    out << \" \";\n                }\n                uint32_t bitCount = popcount(stream[word-1]);\n                disassembleIds(bitCount);\n                numOperands -= bitCount;\n            }\n            break;\n        default:\n            assert(operandClass >= OperandSource && operandClass < OperandOpcode);\n\n            if (OperandClassParams[operandClass].bitmask)\n                outputMask(operandClass, stream[word++]);\n            else\n                out << OperandClassParams[operandClass].getName(stream[word++]);\n            --numOperands;\n\n            break;\n        }\n    }\n\n    return;\n}\n\nstatic void GLSLstd450GetDebugNames(const char** names)\n{\n    for (int i = 0; i < GLSLstd450Count; ++i)\n        names[i] = \"Unknown\";\n\n    names[GLSLstd450Round]                   = \"Round\";\n    names[GLSLstd450RoundEven]               = \"RoundEven\";\n    names[GLSLstd450Trunc]                   = \"Trunc\";\n    names[GLSLstd450FAbs]                    = \"FAbs\";\n    names[GLSLstd450SAbs]                    = \"SAbs\";\n    names[GLSLstd450FSign]                   = \"FSign\";\n    names[GLSLstd450SSign]                   = \"SSign\";\n    names[GLSLstd450Floor]                   = \"Floor\";\n    names[GLSLstd450Ceil]                    = \"Ceil\";\n    names[GLSLstd450Fract]                   = \"Fract\";\n    names[GLSLstd450Radians]                 = \"Radians\";\n    names[GLSLstd450Degrees]                 = \"Degrees\";\n    names[GLSLstd450Sin]                     = \"Sin\";\n    names[GLSLstd450Cos]                     = \"Cos\";\n    names[GLSLstd450Tan]                     = \"Tan\";\n    names[GLSLstd450Asin]                    = \"Asin\";\n    names[GLSLstd450Acos]                    = \"Acos\";\n    names[GLSLstd450Atan]                    = \"Atan\";\n    names[GLSLstd450Sinh]                    = \"Sinh\";\n    names[GLSLstd450Cosh]                    = \"Cosh\";\n    names[GLSLstd450Tanh]                    = \"Tanh\";\n    names[GLSLstd450Asinh]                   = \"Asinh\";\n    names[GLSLstd450Acosh]                   = \"Acosh\";\n    names[GLSLstd450Atanh]                   = \"Atanh\";\n    names[GLSLstd450Atan2]                   = \"Atan2\";\n    names[GLSLstd450Pow]                     = \"Pow\";\n    names[GLSLstd450Exp]                     = \"Exp\";\n    names[GLSLstd450Log]                     = \"Log\";\n    names[GLSLstd450Exp2]                    = \"Exp2\";\n    names[GLSLstd450Log2]                    = \"Log2\";\n    names[GLSLstd450Sqrt]                    = \"Sqrt\";\n    names[GLSLstd450InverseSqrt]             = \"InverseSqrt\";\n    names[GLSLstd450Determinant]             = \"Determinant\";\n    names[GLSLstd450MatrixInverse]           = \"MatrixInverse\";\n    names[GLSLstd450Modf]                    = \"Modf\";\n    names[GLSLstd450ModfStruct]              = \"ModfStruct\";\n    names[GLSLstd450FMin]                    = \"FMin\";\n    names[GLSLstd450SMin]                    = \"SMin\";\n    names[GLSLstd450UMin]                    = \"UMin\";\n    names[GLSLstd450FMax]                    = \"FMax\";\n    names[GLSLstd450SMax]                    = \"SMax\";\n    names[GLSLstd450UMax]                    = \"UMax\";\n    names[GLSLstd450FClamp]                  = \"FClamp\";\n    names[GLSLstd450SClamp]                  = \"SClamp\";\n    names[GLSLstd450UClamp]                  = \"UClamp\";\n    names[GLSLstd450FMix]                    = \"FMix\";\n    names[GLSLstd450Step]                    = \"Step\";\n    names[GLSLstd450SmoothStep]              = \"SmoothStep\";\n    names[GLSLstd450Fma]                     = \"Fma\";\n    names[GLSLstd450Frexp]                   = \"Frexp\";\n    names[GLSLstd450FrexpStruct]             = \"FrexpStruct\";\n    names[GLSLstd450Ldexp]                   = \"Ldexp\";\n    names[GLSLstd450PackSnorm4x8]            = \"PackSnorm4x8\";\n    names[GLSLstd450PackUnorm4x8]            = \"PackUnorm4x8\";\n    names[GLSLstd450PackSnorm2x16]           = \"PackSnorm2x16\";\n    names[GLSLstd450PackUnorm2x16]           = \"PackUnorm2x16\";\n    names[GLSLstd450PackHalf2x16]            = \"PackHalf2x16\";\n    names[GLSLstd450PackDouble2x32]          = \"PackDouble2x32\";\n    names[GLSLstd450UnpackSnorm2x16]         = \"UnpackSnorm2x16\";\n    names[GLSLstd450UnpackUnorm2x16]         = \"UnpackUnorm2x16\";\n    names[GLSLstd450UnpackHalf2x16]          = \"UnpackHalf2x16\";\n    names[GLSLstd450UnpackSnorm4x8]          = \"UnpackSnorm4x8\";\n    names[GLSLstd450UnpackUnorm4x8]          = \"UnpackUnorm4x8\";\n    names[GLSLstd450UnpackDouble2x32]        = \"UnpackDouble2x32\";\n    names[GLSLstd450Length]                  = \"Length\";\n    names[GLSLstd450Distance]                = \"Distance\";\n    names[GLSLstd450Cross]                   = \"Cross\";\n    names[GLSLstd450Normalize]               = \"Normalize\";\n    names[GLSLstd450FaceForward]             = \"FaceForward\";\n    names[GLSLstd450Reflect]                 = \"Reflect\";\n    names[GLSLstd450Refract]                 = \"Refract\";\n    names[GLSLstd450FindILsb]                = \"FindILsb\";\n    names[GLSLstd450FindSMsb]                = \"FindSMsb\";\n    names[GLSLstd450FindUMsb]                = \"FindUMsb\";\n    names[GLSLstd450InterpolateAtCentroid]   = \"InterpolateAtCentroid\";\n    names[GLSLstd450InterpolateAtSample]     = \"InterpolateAtSample\";\n    names[GLSLstd450InterpolateAtOffset]     = \"InterpolateAtOffset\";\n    names[GLSLstd450NMin]                    = \"NMin\";\n    names[GLSLstd450NMax]                    = \"NMax\";\n    names[GLSLstd450NClamp]                  = \"NClamp\";\n}\n\nstatic const char* GLSLextAMDGetDebugNames(const char* name, unsigned entrypoint)\n{\n    if (strcmp(name, spv::E_SPV_AMD_shader_ballot) == 0) {\n        switch (entrypoint) {\n        case SwizzleInvocationsAMD:         return \"SwizzleInvocationsAMD\";\n        case SwizzleInvocationsMaskedAMD:   return \"SwizzleInvocationsMaskedAMD\";\n        case WriteInvocationAMD:            return \"WriteInvocationAMD\";\n        case MbcntAMD:                      return \"MbcntAMD\";\n        default:                            return \"Bad\";\n        }\n    } else if (strcmp(name, spv::E_SPV_AMD_shader_trinary_minmax) == 0) {\n        switch (entrypoint) {\n        case FMin3AMD:      return \"FMin3AMD\";\n        case UMin3AMD:      return \"UMin3AMD\";\n        case SMin3AMD:      return \"SMin3AMD\";\n        case FMax3AMD:      return \"FMax3AMD\";\n        case UMax3AMD:      return \"UMax3AMD\";\n        case SMax3AMD:      return \"SMax3AMD\";\n        case FMid3AMD:      return \"FMid3AMD\";\n        case UMid3AMD:      return \"UMid3AMD\";\n        case SMid3AMD:      return \"SMid3AMD\";\n        default:            return \"Bad\";\n        }\n    } else if (strcmp(name, spv::E_SPV_AMD_shader_explicit_vertex_parameter) == 0) {\n        switch (entrypoint) {\n        case InterpolateAtVertexAMD:    return \"InterpolateAtVertexAMD\";\n        default:                        return \"Bad\";\n        }\n    }\n    else if (strcmp(name, spv::E_SPV_AMD_gcn_shader) == 0) {\n        switch (entrypoint) {\n        case CubeFaceIndexAMD:      return \"CubeFaceIndexAMD\";\n        case CubeFaceCoordAMD:      return \"CubeFaceCoordAMD\";\n        case TimeAMD:               return \"TimeAMD\";\n        default:\n            break;\n        }\n    }\n\n    return \"Bad\";\n}\n\nstatic const char* GLSLextNVGetDebugNames(const char* name, unsigned entrypoint)\n{\n    if (strcmp(name, spv::E_SPV_NV_sample_mask_override_coverage) == 0 ||\n        strcmp(name, spv::E_SPV_NV_geometry_shader_passthrough) == 0 ||\n        strcmp(name, spv::E_ARB_shader_viewport_layer_array) == 0 ||\n        strcmp(name, spv::E_SPV_NV_viewport_array2) == 0 ||\n        strcmp(name, spv::E_SPV_NVX_multiview_per_view_attributes) == 0 ||\n        strcmp(name, spv::E_SPV_NV_fragment_shader_barycentric) == 0 ||\n        strcmp(name, spv::E_SPV_NV_mesh_shader) == 0 ||\n        strcmp(name, spv::E_SPV_NV_shader_image_footprint) == 0) {\n        switch (entrypoint) {\n        // NV builtins\n        case (unsigned)BuiltIn::ViewportMaskNV:                 return \"ViewportMaskNV\";\n        case (unsigned)BuiltIn::SecondaryPositionNV:            return \"SecondaryPositionNV\";\n        case (unsigned)BuiltIn::SecondaryViewportMaskNV:        return \"SecondaryViewportMaskNV\";\n        case (unsigned)BuiltIn::PositionPerViewNV:              return \"PositionPerViewNV\";\n        case (unsigned)BuiltIn::ViewportMaskPerViewNV:          return \"ViewportMaskPerViewNV\";\n        case (unsigned)BuiltIn::BaryCoordNV:                    return \"BaryCoordNV\";\n        case (unsigned)BuiltIn::BaryCoordNoPerspNV:             return \"BaryCoordNoPerspNV\";\n        case (unsigned)BuiltIn::TaskCountNV:                    return \"TaskCountNV\";\n        case (unsigned)BuiltIn::PrimitiveCountNV:               return \"PrimitiveCountNV\";\n        case (unsigned)BuiltIn::PrimitiveIndicesNV:             return \"PrimitiveIndicesNV\";\n        case (unsigned)BuiltIn::ClipDistancePerViewNV:          return \"ClipDistancePerViewNV\";\n        case (unsigned)BuiltIn::CullDistancePerViewNV:          return \"CullDistancePerViewNV\";\n        case (unsigned)BuiltIn::LayerPerViewNV:                 return \"LayerPerViewNV\";\n        case (unsigned)BuiltIn::MeshViewCountNV:                return \"MeshViewCountNV\";\n        case (unsigned)BuiltIn::MeshViewIndicesNV:              return \"MeshViewIndicesNV\";\n\n        // NV Capabilities\n        case (unsigned)Capability::GeometryShaderPassthroughNV: return \"GeometryShaderPassthroughNV\";\n        case (unsigned)Capability::ShaderViewportMaskNV:        return \"ShaderViewportMaskNV\";\n        case (unsigned)Capability::ShaderStereoViewNV:          return \"ShaderStereoViewNV\";\n        case (unsigned)Capability::PerViewAttributesNV:         return \"PerViewAttributesNV\";\n        case (unsigned)Capability::FragmentBarycentricNV:       return \"FragmentBarycentricNV\";\n        case (unsigned)Capability::MeshShadingNV:               return \"MeshShadingNV\";\n        case (unsigned)Capability::ImageFootprintNV:            return \"ImageFootprintNV\";\n        case (unsigned)Capability::SampleMaskOverrideCoverageNV:return \"SampleMaskOverrideCoverageNV\";\n\n        // NV Decorations\n        case (unsigned)Decoration::OverrideCoverageNV:          return \"OverrideCoverageNV\";\n        case (unsigned)Decoration::PassthroughNV:               return \"PassthroughNV\";\n        case (unsigned)Decoration::ViewportRelativeNV:          return \"ViewportRelativeNV\";\n        case (unsigned)Decoration::SecondaryViewportRelativeNV: return \"SecondaryViewportRelativeNV\";\n        case (unsigned)Decoration::PerVertexNV:                 return \"PerVertexNV\";\n        case (unsigned)Decoration::PerPrimitiveNV:              return \"PerPrimitiveNV\";\n        case (unsigned)Decoration::PerViewNV:                   return \"PerViewNV\";\n        case (unsigned)Decoration::PerTaskNV:                   return \"PerTaskNV\";\n\n        default:                                    return \"Bad\";\n        }\n    }\n    return \"Bad\";\n}\n\nstatic const char* NonSemanticShaderDebugInfo100GetDebugNames(unsigned entrypoint)\n{\n    switch (entrypoint) {\n        case NonSemanticShaderDebugInfo100DebugInfoNone:                        return \"DebugInfoNone\";\n        case NonSemanticShaderDebugInfo100DebugCompilationUnit:                 return \"DebugCompilationUnit\";\n        case NonSemanticShaderDebugInfo100DebugTypeBasic:                       return \"DebugTypeBasic\";\n        case NonSemanticShaderDebugInfo100DebugTypePointer:                     return \"DebugTypePointer\";\n        case NonSemanticShaderDebugInfo100DebugTypeQualifier:                   return \"DebugTypeQualifier\";\n        case NonSemanticShaderDebugInfo100DebugTypeArray:                       return \"DebugTypeArray\";\n        case NonSemanticShaderDebugInfo100DebugTypeVector:                      return \"DebugTypeVector\";\n        case NonSemanticShaderDebugInfo100DebugTypedef:                         return \"DebugTypedef\";\n        case NonSemanticShaderDebugInfo100DebugTypeFunction:                    return \"DebugTypeFunction\";\n        case NonSemanticShaderDebugInfo100DebugTypeEnum:                        return \"DebugTypeEnum\";\n        case NonSemanticShaderDebugInfo100DebugTypeComposite:                   return \"DebugTypeComposite\";\n        case NonSemanticShaderDebugInfo100DebugTypeMember:                      return \"DebugTypeMember\";\n        case NonSemanticShaderDebugInfo100DebugTypeInheritance:                 return \"DebugTypeInheritance\";\n        case NonSemanticShaderDebugInfo100DebugTypePtrToMember:                 return \"DebugTypePtrToMember\";\n        case NonSemanticShaderDebugInfo100DebugTypeTemplate:                    return \"DebugTypeTemplate\";\n        case NonSemanticShaderDebugInfo100DebugTypeTemplateParameter:           return \"DebugTypeTemplateParameter\";\n        case NonSemanticShaderDebugInfo100DebugTypeTemplateTemplateParameter:   return \"DebugTypeTemplateTemplateParameter\";\n        case NonSemanticShaderDebugInfo100DebugTypeTemplateParameterPack:       return \"DebugTypeTemplateParameterPack\";\n        case NonSemanticShaderDebugInfo100DebugGlobalVariable:                  return \"DebugGlobalVariable\";\n        case NonSemanticShaderDebugInfo100DebugFunctionDeclaration:             return \"DebugFunctionDeclaration\";\n        case NonSemanticShaderDebugInfo100DebugFunction:                        return \"DebugFunction\";\n        case NonSemanticShaderDebugInfo100DebugLexicalBlock:                    return \"DebugLexicalBlock\";\n        case NonSemanticShaderDebugInfo100DebugLexicalBlockDiscriminator:       return \"DebugLexicalBlockDiscriminator\";\n        case NonSemanticShaderDebugInfo100DebugScope:                           return \"DebugScope\";\n        case NonSemanticShaderDebugInfo100DebugNoScope:                         return \"DebugNoScope\";\n        case NonSemanticShaderDebugInfo100DebugInlinedAt:                       return \"DebugInlinedAt\";\n        case NonSemanticShaderDebugInfo100DebugLocalVariable:                   return \"DebugLocalVariable\";\n        case NonSemanticShaderDebugInfo100DebugInlinedVariable:                 return \"DebugInlinedVariable\";\n        case NonSemanticShaderDebugInfo100DebugDeclare:                         return \"DebugDeclare\";\n        case NonSemanticShaderDebugInfo100DebugValue:                           return \"DebugValue\";\n        case NonSemanticShaderDebugInfo100DebugOperation:                       return \"DebugOperation\";\n        case NonSemanticShaderDebugInfo100DebugExpression:                      return \"DebugExpression\";\n        case NonSemanticShaderDebugInfo100DebugMacroDef:                        return \"DebugMacroDef\";\n        case NonSemanticShaderDebugInfo100DebugMacroUndef:                      return \"DebugMacroUndef\";\n        case NonSemanticShaderDebugInfo100DebugImportedEntity:                  return \"DebugImportedEntity\";\n        case NonSemanticShaderDebugInfo100DebugSource:                          return \"DebugSource\";\n        case NonSemanticShaderDebugInfo100DebugFunctionDefinition:              return \"DebugFunctionDefinition\";\n        case NonSemanticShaderDebugInfo100DebugSourceContinued:                 return \"DebugSourceContinued\";\n        case NonSemanticShaderDebugInfo100DebugLine:                            return \"DebugLine\";\n        case NonSemanticShaderDebugInfo100DebugNoLine:                          return \"DebugNoLine\";\n        case NonSemanticShaderDebugInfo100DebugBuildIdentifier:                 return \"DebugBuildIdentifier\";\n        case NonSemanticShaderDebugInfo100DebugStoragePath:                     return \"DebugStoragePath\";\n        case NonSemanticShaderDebugInfo100DebugEntryPoint:                      return \"DebugEntryPoint\";\n        case NonSemanticShaderDebugInfo100DebugTypeMatrix:                      return \"DebugTypeMatrix\";\n        default:                                                                return \"Bad\";\n    }\n\n    return \"Bad\";\n}\n\nvoid Disassemble(std::ostream& out, const std::vector<unsigned int>& stream)\n{\n    SpirvStream SpirvStream(out, stream);\n    spv::Parameterize();\n    GLSLstd450GetDebugNames(GlslStd450DebugNames);\n    SpirvStream.validate();\n    SpirvStream.processInstructions();\n}\n\n} // end namespace spv\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/disassemble.h",
    "content": "//\n// Copyright (C) 2014-2015 LunarG, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Disassembler for SPIR-V.\n//\n\n#pragma once\n#ifndef disassembler_H\n#define disassembler_H\n\n#include <iostream>\n#include <vector>\n\n#include \"../glslang/Include/visibility.h\"\n\nnamespace spv {\n\n    // disassemble with glslang custom disassembler\n    GLSLANG_EXPORT void Disassemble(std::ostream& out, const std::vector<unsigned int>&);\n\n}  // end namespace spv\n\n#endif // disassembler_H\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/doc.cpp",
    "content": "//\n// Copyright (C) 2014-2015 LunarG, Inc.\n// Copyright (C) 2022-2025 Arm Limited.\n// Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\n//\n// 1) Programmatically fill in instruction/operand information.\n//    This can be used for disassembly, printing documentation, etc.\n//\n// 2) Print documentation from this parameterization.\n//\n\n#include \"doc.h\"\n#include \"spvUtil.h\"\n\n#include <cstdio>\n#include <cstring>\n#include <algorithm>\n#include <mutex>\n\nnamespace spv {\n    extern \"C\" {\n        // Include C-based headers that don't have a namespace\n        #include \"GLSL.ext.KHR.h\"\n        #include \"GLSL.ext.EXT.h\"\n        #include \"GLSL.ext.AMD.h\"\n        #include \"GLSL.ext.NV.h\"\n        #include \"GLSL.ext.ARM.h\"\n        #include \"GLSL.ext.QCOM.h\"\n    }\n}\n\nnamespace spv {\n\n//\n// Whole set of functions that translate enumerants to their text strings for\n// the specification (or their sanitized versions for auto-generating the\n// spirv headers.\n//\n// Also, for masks the ceilings are declared next to these, to help keep them in sync.\n// Ceilings should be\n//  - one more than the maximum value an enumerant takes on, for non-mask enumerants\n//    (for non-sparse enums, this is the number of enumerants)\n//  - the number of bits consumed by the set of masks\n//    (for non-sparse mask enums, this is the number of enumerants)\n//\n\nconst char* SourceString(int source)\n{\n    switch (source) {\n    case 0:  return \"Unknown\";\n    case 1:  return \"ESSL\";\n    case 2:  return \"GLSL\";\n    case 3:  return \"OpenCL_C\";\n    case 4:  return \"OpenCL_CPP\";\n    case 5:  return \"HLSL\";\n\n    default: return \"Bad\";\n    }\n}\n\nconst char* ExecutionModelString(int model)\n{\n    switch (model) {\n    case 0:  return \"Vertex\";\n    case 1:  return \"TessellationControl\";\n    case 2:  return \"TessellationEvaluation\";\n    case 3:  return \"Geometry\";\n    case 4:  return \"Fragment\";\n    case 5:  return \"GLCompute\";\n    case 6:  return \"Kernel\";\n    case (int)ExecutionModel::TaskNV: return \"TaskNV\";\n    case (int)ExecutionModel::MeshNV: return \"MeshNV\";\n    case (int)ExecutionModel::TaskEXT: return \"TaskEXT\";\n    case (int)ExecutionModel::MeshEXT: return \"MeshEXT\";\n\n    default: return \"Bad\";\n\n    case (int)ExecutionModel::RayGenerationKHR: return \"RayGenerationKHR\";\n    case (int)ExecutionModel::IntersectionKHR:  return \"IntersectionKHR\";\n    case (int)ExecutionModel::AnyHitKHR:        return \"AnyHitKHR\";\n    case (int)ExecutionModel::ClosestHitKHR:    return \"ClosestHitKHR\";\n    case (int)ExecutionModel::MissKHR:          return \"MissKHR\";\n    case (int)ExecutionModel::CallableKHR:      return \"CallableKHR\";\n    }\n}\n\nconst char* AddressingString(int addr)\n{\n    switch (addr) {\n    case 0:  return \"Logical\";\n    case 1:  return \"Physical32\";\n    case 2:  return \"Physical64\";\n\n    case (int)AddressingModel::PhysicalStorageBuffer64EXT: return \"PhysicalStorageBuffer64EXT\";\n\n    default: return \"Bad\";\n    }\n}\n\nconst char* MemoryString(int mem)\n{\n    switch (mem) {\n    case (int)MemoryModel::Simple:     return \"Simple\";\n    case (int)MemoryModel::GLSL450:    return \"GLSL450\";\n    case (int)MemoryModel::OpenCL:     return \"OpenCL\";\n    case (int)MemoryModel::VulkanKHR:  return \"VulkanKHR\";\n\n    default: return \"Bad\";\n    }\n}\n\nconst int ExecutionModeCeiling = 40;\n\nconst char* ExecutionModeString(int mode)\n{\n    switch (mode) {\n    case 0:  return \"Invocations\";\n    case 1:  return \"SpacingEqual\";\n    case 2:  return \"SpacingFractionalEven\";\n    case 3:  return \"SpacingFractionalOdd\";\n    case 4:  return \"VertexOrderCw\";\n    case 5:  return \"VertexOrderCcw\";\n    case 6:  return \"PixelCenterInteger\";\n    case 7:  return \"OriginUpperLeft\";\n    case 8:  return \"OriginLowerLeft\";\n    case 9:  return \"EarlyFragmentTests\";\n    case 10: return \"PointMode\";\n    case 11: return \"Xfb\";\n    case 12: return \"DepthReplacing\";\n    case 13: return \"Bad\";\n    case 14: return \"DepthGreater\";\n    case 15: return \"DepthLess\";\n    case 16: return \"DepthUnchanged\";\n    case 17: return \"LocalSize\";\n    case 18: return \"LocalSizeHint\";\n    case 19: return \"InputPoints\";\n    case 20: return \"InputLines\";\n    case 21: return \"InputLinesAdjacency\";\n    case 22: return \"Triangles\";\n    case 23: return \"InputTrianglesAdjacency\";\n    case 24: return \"Quads\";\n    case 25: return \"Isolines\";\n    case 26: return \"OutputVertices\";\n    case 27: return \"OutputPoints\";\n    case 28: return \"OutputLineStrip\";\n    case 29: return \"OutputTriangleStrip\";\n    case 30: return \"VecTypeHint\";\n    case 31: return \"ContractionOff\";\n    case 32: return \"Bad\";\n\n    case (int)ExecutionMode::Initializer:                   return \"Initializer\";\n    case (int)ExecutionMode::Finalizer:                     return \"Finalizer\";\n    case (int)ExecutionMode::SubgroupSize:                  return \"SubgroupSize\";\n    case (int)ExecutionMode::SubgroupsPerWorkgroup:         return \"SubgroupsPerWorkgroup\";\n    case (int)ExecutionMode::SubgroupsPerWorkgroupId:       return \"SubgroupsPerWorkgroupId\";\n    case (int)ExecutionMode::LocalSizeId:                   return \"LocalSizeId\";\n    case (int)ExecutionMode::LocalSizeHintId:               return \"LocalSizeHintId\";\n\n    case (int)ExecutionMode::PostDepthCoverage:             return \"PostDepthCoverage\";\n    case (int)ExecutionMode::DenormPreserve:                return \"DenormPreserve\";\n    case (int)ExecutionMode::DenormFlushToZero:             return \"DenormFlushToZero\";\n    case (int)ExecutionMode::SignedZeroInfNanPreserve:      return \"SignedZeroInfNanPreserve\";\n    case (int)ExecutionMode::RoundingModeRTE:               return \"RoundingModeRTE\";\n    case (int)ExecutionMode::RoundingModeRTZ:               return \"RoundingModeRTZ\";\n\n    case (int)ExecutionMode::NonCoherentTileAttachmentReadQCOM: return \"NonCoherentTileAttachmentReadQCOM\";\n    case (int)ExecutionMode::TileShadingRateQCOM:               return \"TileShadingRateQCOM\";\n\n    case (int)ExecutionMode::EarlyAndLateFragmentTestsAMD:  return \"EarlyAndLateFragmentTestsAMD\";\n    case (int)ExecutionMode::StencilRefUnchangedFrontAMD:   return \"StencilRefUnchangedFrontAMD\";\n    case (int)ExecutionMode::StencilRefLessFrontAMD:        return \"StencilRefLessFrontAMD\";\n    case (int)ExecutionMode::StencilRefGreaterBackAMD:      return \"StencilRefGreaterBackAMD\";\n    case (int)ExecutionMode::StencilRefReplacingEXT:        return \"StencilRefReplacingEXT\";\n    case (int)ExecutionMode::SubgroupUniformControlFlowKHR: return \"SubgroupUniformControlFlow\";\n    case (int)ExecutionMode::MaximallyReconvergesKHR:       return \"MaximallyReconverges\";\n\n    case (int)ExecutionMode::OutputLinesNV:                 return \"OutputLinesNV\";\n    case (int)ExecutionMode::OutputPrimitivesNV:            return \"OutputPrimitivesNV\";\n    case (int)ExecutionMode::OutputTrianglesNV:             return \"OutputTrianglesNV\";\n    case (int)ExecutionMode::DerivativeGroupQuadsNV:        return \"DerivativeGroupQuadsNV\";\n    case (int)ExecutionMode::DerivativeGroupLinearNV:       return \"DerivativeGroupLinearNV\";\n\n    case (int)ExecutionMode::PixelInterlockOrderedEXT:         return \"PixelInterlockOrderedEXT\";\n    case (int)ExecutionMode::PixelInterlockUnorderedEXT:       return \"PixelInterlockUnorderedEXT\";\n    case (int)ExecutionMode::SampleInterlockOrderedEXT:        return \"SampleInterlockOrderedEXT\";\n    case (int)ExecutionMode::SampleInterlockUnorderedEXT:      return \"SampleInterlockUnorderedEXT\";\n    case (int)ExecutionMode::ShadingRateInterlockOrderedEXT:   return \"ShadingRateInterlockOrderedEXT\";\n    case (int)ExecutionMode::ShadingRateInterlockUnorderedEXT: return \"ShadingRateInterlockUnorderedEXT\";\n\n    case (int)ExecutionMode::MaxWorkgroupSizeINTEL:    return \"MaxWorkgroupSizeINTEL\";\n    case (int)ExecutionMode::MaxWorkDimINTEL:          return \"MaxWorkDimINTEL\";\n    case (int)ExecutionMode::NoGlobalOffsetINTEL:      return \"NoGlobalOffsetINTEL\";\n    case (int)ExecutionMode::NumSIMDWorkitemsINTEL:    return \"NumSIMDWorkitemsINTEL\";\n\n    case (int)ExecutionMode::RequireFullQuadsKHR:      return \"RequireFullQuadsKHR\";\n    case (int)ExecutionMode::QuadDerivativesKHR:       return \"QuadDerivativesKHR\";\n\n    case (int)ExecutionMode::NonCoherentColorAttachmentReadEXT:        return \"NonCoherentColorAttachmentReadEXT\";\n    case (int)ExecutionMode::NonCoherentDepthAttachmentReadEXT:        return \"NonCoherentDepthAttachmentReadEXT\";\n    case (int)ExecutionMode::NonCoherentStencilAttachmentReadEXT:      return \"NonCoherentStencilAttachmentReadEXT\";\n\n    case ExecutionModeCeiling:\n    default: return \"Bad\";\n    }\n}\n\nconst char* StorageClassString(int StorageClass)\n{\n    switch (StorageClass) {\n    case 0:  return \"UniformConstant\";\n    case 1:  return \"Input\";\n    case 2:  return \"Uniform\";\n    case 3:  return \"Output\";\n    case 4:  return \"Workgroup\";\n    case 5:  return \"CrossWorkgroup\";\n    case 6:  return \"Private\";\n    case 7:  return \"Function\";\n    case 8:  return \"Generic\";\n    case 9:  return \"PushConstant\";\n    case 10: return \"AtomicCounter\";\n    case 11: return \"Image\";\n    case 12: return \"StorageBuffer\";\n\n    case (int)StorageClass::TileAttachmentQCOM:       return \"TileAttachmentQCOM\";\n    case (int)StorageClass::RayPayloadKHR:            return \"RayPayloadKHR\";\n    case (int)StorageClass::HitAttributeKHR:          return \"HitAttributeKHR\";\n    case (int)StorageClass::IncomingRayPayloadKHR:    return \"IncomingRayPayloadKHR\";\n    case (int)StorageClass::ShaderRecordBufferKHR:    return \"ShaderRecordBufferKHR\";\n    case (int)StorageClass::CallableDataKHR:          return \"CallableDataKHR\";\n    case (int)StorageClass::IncomingCallableDataKHR:  return \"IncomingCallableDataKHR\";\n\n    case (int)StorageClass::PhysicalStorageBufferEXT: return \"PhysicalStorageBufferEXT\";\n    case (int)StorageClass::TaskPayloadWorkgroupEXT:  return \"TaskPayloadWorkgroupEXT\";\n    case (int)StorageClass::HitObjectAttributeNV:     return \"HitObjectAttributeNV\";\n    case (int)StorageClass::TileImageEXT:             return \"TileImageEXT\";\n    default: return \"Bad\";\n    }\n}\n\nconst int DecorationCeiling = 45;\n\nconst char* DecorationString(int decoration)\n{\n    switch (decoration) {\n    case 0:  return \"RelaxedPrecision\";\n    case 1:  return \"SpecId\";\n    case 2:  return \"Block\";\n    case 3:  return \"BufferBlock\";\n    case 4:  return \"RowMajor\";\n    case 5:  return \"ColMajor\";\n    case 6:  return \"ArrayStride\";\n    case 7:  return \"MatrixStride\";\n    case 8:  return \"GLSLShared\";\n    case 9:  return \"GLSLPacked\";\n    case 10: return \"CPacked\";\n    case 11: return \"BuiltIn\";\n    case 12: return \"Bad\";\n    case 13: return \"NoPerspective\";\n    case 14: return \"Flat\";\n    case 15: return \"Patch\";\n    case 16: return \"Centroid\";\n    case 17: return \"Sample\";\n    case 18: return \"Invariant\";\n    case 19: return \"Restrict\";\n    case 20: return \"Aliased\";\n    case 21: return \"Volatile\";\n    case 22: return \"Constant\";\n    case 23: return \"Coherent\";\n    case 24: return \"NonWritable\";\n    case 25: return \"NonReadable\";\n    case 26: return \"Uniform\";\n    case 27: return \"Bad\";\n    case 28: return \"SaturatedConversion\";\n    case 29: return \"Stream\";\n    case 30: return \"Location\";\n    case 31: return \"Component\";\n    case 32: return \"Index\";\n    case 33: return \"Binding\";\n    case 34: return \"DescriptorSet\";\n    case 35: return \"Offset\";\n    case 36: return \"XfbBuffer\";\n    case 37: return \"XfbStride\";\n    case 38: return \"FuncParamAttr\";\n    case 39: return \"FP Rounding Mode\";\n    case 40: return \"FP Fast Math Mode\";\n    case 41: return \"Linkage Attributes\";\n    case 42: return \"NoContraction\";\n    case 43: return \"InputAttachmentIndex\";\n    case 44: return \"Alignment\";\n\n    case DecorationCeiling:\n    default:  return \"Bad\";\n\n    case (int)Decoration::WeightTextureQCOM:           return \"DecorationWeightTextureQCOM\";\n    case (int)Decoration::BlockMatchTextureQCOM:       return \"DecorationBlockMatchTextureQCOM\";\n    case (int)Decoration::BlockMatchSamplerQCOM:       return \"DecorationBlockMatchSamplerQCOM\";\n    case (int)Decoration::ExplicitInterpAMD:           return \"ExplicitInterpAMD\";\n    case (int)Decoration::OverrideCoverageNV:          return \"OverrideCoverageNV\";\n    case (int)Decoration::PassthroughNV:               return \"PassthroughNV\";\n    case (int)Decoration::ViewportRelativeNV:          return \"ViewportRelativeNV\";\n    case (int)Decoration::SecondaryViewportRelativeNV: return \"SecondaryViewportRelativeNV\";\n    case (int)Decoration::PerPrimitiveNV:              return \"PerPrimitiveNV\";\n    case (int)Decoration::PerViewNV:                   return \"PerViewNV\";\n    case (int)Decoration::PerTaskNV:                   return \"PerTaskNV\";\n\n    case (int)Decoration::PerVertexKHR:                return \"PerVertexKHR\";\n\n    case (int)Decoration::NonUniformEXT:           return \"DecorationNonUniformEXT\";\n    case (int)Decoration::HlslCounterBufferGOOGLE: return \"DecorationHlslCounterBufferGOOGLE\";\n    case (int)Decoration::HlslSemanticGOOGLE:      return \"DecorationHlslSemanticGOOGLE\";\n    case (int)Decoration::RestrictPointerEXT:      return \"DecorationRestrictPointerEXT\";\n    case (int)Decoration::AliasedPointerEXT:       return \"DecorationAliasedPointerEXT\";\n\n    case (int)Decoration::HitObjectShaderRecordBufferNV:  return \"DecorationHitObjectShaderRecordBufferNV\";\n\n    case (int)Decoration::SaturatedToLargestFloat8NormalConversionEXT: return \"DecorationSaturatedToLargestFloat8NormalConversionEXT\";\n    }\n}\n\nconst char* BuiltInString(int builtIn)\n{\n    switch (builtIn) {\n    case 0:  return \"Position\";\n    case 1:  return \"PointSize\";\n    case 2:  return \"Bad\";\n    case 3:  return \"ClipDistance\";\n    case 4:  return \"CullDistance\";\n    case 5:  return \"VertexId\";\n    case 6:  return \"InstanceId\";\n    case 7:  return \"PrimitiveId\";\n    case 8:  return \"InvocationId\";\n    case 9:  return \"Layer\";\n    case 10: return \"ViewportIndex\";\n    case 11: return \"TessLevelOuter\";\n    case 12: return \"TessLevelInner\";\n    case 13: return \"TessCoord\";\n    case 14: return \"PatchVertices\";\n    case 15: return \"FragCoord\";\n    case 16: return \"PointCoord\";\n    case 17: return \"FrontFacing\";\n    case 18: return \"SampleId\";\n    case 19: return \"SamplePosition\";\n    case 20: return \"SampleMask\";\n    case 21: return \"Bad\";\n    case 22: return \"FragDepth\";\n    case 23: return \"HelperInvocation\";\n    case 24: return \"NumWorkgroups\";\n    case 25: return \"WorkgroupSize\";\n    case 26: return \"WorkgroupId\";\n    case 27: return \"LocalInvocationId\";\n    case 28: return \"GlobalInvocationId\";\n    case 29: return \"LocalInvocationIndex\";\n    case 30: return \"WorkDim\";\n    case 31: return \"GlobalSize\";\n    case 32: return \"EnqueuedWorkgroupSize\";\n    case 33: return \"GlobalOffset\";\n    case 34: return \"GlobalLinearId\";\n    case 35: return \"Bad\";\n    case 36: return \"SubgroupSize\";\n    case 37: return \"SubgroupMaxSize\";\n    case 38: return \"NumSubgroups\";\n    case 39: return \"NumEnqueuedSubgroups\";\n    case 40: return \"SubgroupId\";\n    case 41: return \"SubgroupLocalInvocationId\";\n    case 42: return \"VertexIndex\";                 // TBD: put next to VertexId?\n    case 43: return \"InstanceIndex\";               // TBD: put next to InstanceId?\n\n    case 4416: return \"SubgroupEqMaskKHR\";\n    case 4417: return \"SubgroupGeMaskKHR\";\n    case 4418: return \"SubgroupGtMaskKHR\";\n    case 4419: return \"SubgroupLeMaskKHR\";\n    case 4420: return \"SubgroupLtMaskKHR\";\n    case 4438: return \"DeviceIndex\";\n    case 4440: return \"ViewIndex\";\n    case 4424: return \"BaseVertex\";\n    case 4425: return \"BaseInstance\";\n    case 4426: return \"DrawIndex\";\n    case 4432: return \"PrimitiveShadingRateKHR\";\n    case 4444: return \"ShadingRateKHR\";\n    case 5014: return \"FragStencilRefEXT\";\n\n    case (int)BuiltIn::TileOffsetQCOM:     return \"TileOffsetQCOM\";\n    case (int)BuiltIn::TileDimensionQCOM:  return \"TileDimensionQCOM\";\n    case (int)BuiltIn::TileApronSizeQCOM:  return \"TileApronSizeQCOM\";\n\n    case 4992: return \"BaryCoordNoPerspAMD\";\n    case 4993: return \"BaryCoordNoPerspCentroidAMD\";\n    case 4994: return \"BaryCoordNoPerspSampleAMD\";\n    case 4995: return \"BaryCoordSmoothAMD\";\n    case 4996: return \"BaryCoordSmoothCentroidAMD\";\n    case 4997: return \"BaryCoordSmoothSampleAMD\";\n    case 4998: return \"BaryCoordPullModelAMD\";\n    case (int)BuiltIn::LaunchIdKHR:                 return \"LaunchIdKHR\";\n    case (int)BuiltIn::LaunchSizeKHR:               return \"LaunchSizeKHR\";\n    case (int)BuiltIn::WorldRayOriginKHR:           return \"WorldRayOriginKHR\";\n    case (int)BuiltIn::WorldRayDirectionKHR:        return \"WorldRayDirectionKHR\";\n    case (int)BuiltIn::ObjectRayOriginKHR:          return \"ObjectRayOriginKHR\";\n    case (int)BuiltIn::ObjectRayDirectionKHR:       return \"ObjectRayDirectionKHR\";\n    case (int)BuiltIn::RayTminKHR:                  return \"RayTminKHR\";\n    case (int)BuiltIn::RayTmaxKHR:                  return \"RayTmaxKHR\";\n    case (int)BuiltIn::CullMaskKHR:                 return \"CullMaskKHR\";\n    case (int)BuiltIn::HitTriangleVertexPositionsKHR: return \"HitTriangleVertexPositionsKHR\";\n    case (int)BuiltIn::HitMicroTriangleVertexPositionsNV: return \"HitMicroTriangleVertexPositionsNV\";\n    case (int)BuiltIn::HitMicroTriangleVertexBarycentricsNV: return \"HitMicroTriangleVertexBarycentricsNV\";\n    case (int)BuiltIn::HitKindFrontFacingMicroTriangleNV: return \"HitKindFrontFacingMicroTriangleNV\";\n    case (int)BuiltIn::HitKindBackFacingMicroTriangleNV: return \"HitKindBackFacingMicroTriangleNV\";\n    case (int)BuiltIn::HitIsSphereNV:               return \"HitIsSphereNV\";\n    case (int)BuiltIn::HitIsLSSNV:                  return \"HitIsLSSNV\";\n    case (int)BuiltIn::HitSpherePositionNV:         return \"HitSpherePositionNV\";\n    case (int)BuiltIn::HitSphereRadiusNV:           return \"HitSphereRadiusNV\";\n    case (int)BuiltIn::HitLSSPositionsNV:           return \"HitLSSPositionsNV\";\n    case (int)BuiltIn::HitLSSRadiiNV:               return \"HitLLSSRadiiNV\";\n    case (int)BuiltIn::InstanceCustomIndexKHR:      return \"InstanceCustomIndexKHR\";\n    case (int)BuiltIn::RayGeometryIndexKHR:         return \"RayGeometryIndexKHR\";\n    case (int)BuiltIn::ObjectToWorldKHR:            return \"ObjectToWorldKHR\";\n    case (int)BuiltIn::WorldToObjectKHR:            return \"WorldToObjectKHR\";\n    case (int)BuiltIn::HitTNV:                      return \"HitTNV\";\n    case (int)BuiltIn::HitKindKHR:                  return \"HitKindKHR\";\n    case (int)BuiltIn::IncomingRayFlagsKHR:         return \"IncomingRayFlagsKHR\";\n    case (int)BuiltIn::ViewportMaskNV:              return \"ViewportMaskNV\";\n    case (int)BuiltIn::SecondaryPositionNV:         return \"SecondaryPositionNV\";\n    case (int)BuiltIn::SecondaryViewportMaskNV:     return \"SecondaryViewportMaskNV\";\n    case (int)BuiltIn::PositionPerViewNV:           return \"PositionPerViewNV\";\n    case (int)BuiltIn::ViewportMaskPerViewNV:       return \"ViewportMaskPerViewNV\";\n//    case (int)BuiltIn::FragmentSizeNV:             return \"FragmentSizeNV\";        // superseded by BuiltInFragSizeEXT\n//    case (int)BuiltIn::InvocationsPerPixelNV:      return \"InvocationsPerPixelNV\"; // superseded by BuiltInFragInvocationCountEXT\n    case (int)BuiltIn::BaryCoordKHR:                return \"BaryCoordKHR\";\n    case (int)BuiltIn::BaryCoordNoPerspKHR:         return \"BaryCoordNoPerspKHR\";\n    case (int)BuiltIn::ClusterIDNV:                 return \"ClusterIDNV\";\n\n    case (int)BuiltIn::FragSizeEXT:                 return \"FragSizeEXT\";\n    case (int)BuiltIn::FragInvocationCountEXT:      return \"FragInvocationCountEXT\";\n\n    case 5264: return \"FullyCoveredEXT\";\n\n    case (int)BuiltIn::TaskCountNV:           return \"TaskCountNV\";\n    case (int)BuiltIn::PrimitiveCountNV:      return \"PrimitiveCountNV\";\n    case (int)BuiltIn::PrimitiveIndicesNV:    return \"PrimitiveIndicesNV\";\n    case (int)BuiltIn::ClipDistancePerViewNV: return \"ClipDistancePerViewNV\";\n    case (int)BuiltIn::CullDistancePerViewNV: return \"CullDistancePerViewNV\";\n    case (int)BuiltIn::LayerPerViewNV:        return \"LayerPerViewNV\";\n    case (int)BuiltIn::MeshViewCountNV:       return \"MeshViewCountNV\";\n    case (int)BuiltIn::MeshViewIndicesNV:     return \"MeshViewIndicesNV\";\n    case (int)BuiltIn::WarpsPerSMNV:           return \"WarpsPerSMNV\";\n    case (int)BuiltIn::SMCountNV:              return \"SMCountNV\";\n    case (int)BuiltIn::WarpIDNV:               return \"WarpIDNV\";\n    case (int)BuiltIn::SMIDNV:                 return \"SMIDNV\";\n    case (int)BuiltIn::CurrentRayTimeNV:       return \"CurrentRayTimeNV\";\n    case (int)BuiltIn::PrimitivePointIndicesEXT:        return \"PrimitivePointIndicesEXT\";\n    case (int)BuiltIn::PrimitiveLineIndicesEXT:         return \"PrimitiveLineIndicesEXT\";\n    case (int)BuiltIn::PrimitiveTriangleIndicesEXT:     return \"PrimitiveTriangleIndicesEXT\";\n    case (int)BuiltIn::CullPrimitiveEXT:                return \"CullPrimitiveEXT\";\n    case (int)BuiltIn::CoreCountARM:           return \"CoreCountARM\";\n    case (int)BuiltIn::CoreIDARM:              return \"CoreIDARM\";\n    case (int)BuiltIn::CoreMaxIDARM:           return \"CoreMaxIDARM\";\n    case (int)BuiltIn::WarpIDARM:              return \"WarpIDARM\";\n    case (int)BuiltIn::WarpMaxIDARM:           return \"BuiltInWarpMaxIDARM\";\n\n    default: return \"Bad\";\n    }\n}\n\nconst char* DimensionString(int dim)\n{\n    switch (dim) {\n    case 0:  return \"1D\";\n    case 1:  return \"2D\";\n    case 2:  return \"3D\";\n    case 3:  return \"Cube\";\n    case 4:  return \"Rect\";\n    case 5:  return \"Buffer\";\n    case 6:  return \"SubpassData\";\n    case (int)Dim::TileImageDataEXT:  return \"TileImageDataEXT\";\n\n    default: return \"Bad\";\n    }\n}\n\nconst char* SamplerAddressingModeString(int mode)\n{\n    switch (mode) {\n    case 0:  return \"None\";\n    case 1:  return \"ClampToEdge\";\n    case 2:  return \"Clamp\";\n    case 3:  return \"Repeat\";\n    case 4:  return \"RepeatMirrored\";\n\n    default: return \"Bad\";\n    }\n}\n\nconst char* SamplerFilterModeString(int mode)\n{\n    switch (mode) {\n    case 0: return \"Nearest\";\n    case 1: return \"Linear\";\n\n    default: return \"Bad\";\n    }\n}\n\nconst char* ImageFormatString(int format)\n{\n    switch (format) {\n    case  0: return \"Unknown\";\n\n    // ES/Desktop float\n    case  1: return \"Rgba32f\";\n    case  2: return \"Rgba16f\";\n    case  3: return \"R32f\";\n    case  4: return \"Rgba8\";\n    case  5: return \"Rgba8Snorm\";\n\n    // Desktop float\n    case  6: return \"Rg32f\";\n    case  7: return \"Rg16f\";\n    case  8: return \"R11fG11fB10f\";\n    case  9: return \"R16f\";\n    case 10: return \"Rgba16\";\n    case 11: return \"Rgb10A2\";\n    case 12: return \"Rg16\";\n    case 13: return \"Rg8\";\n    case 14: return \"R16\";\n    case 15: return \"R8\";\n    case 16: return \"Rgba16Snorm\";\n    case 17: return \"Rg16Snorm\";\n    case 18: return \"Rg8Snorm\";\n    case 19: return \"R16Snorm\";\n    case 20: return \"R8Snorm\";\n\n    // ES/Desktop int\n    case 21: return \"Rgba32i\";\n    case 22: return \"Rgba16i\";\n    case 23: return \"Rgba8i\";\n    case 24: return \"R32i\";\n\n    // Desktop int\n    case 25: return \"Rg32i\";\n    case 26: return \"Rg16i\";\n    case 27: return \"Rg8i\";\n    case 28: return \"R16i\";\n    case 29: return \"R8i\";\n\n    // ES/Desktop uint\n    case 30: return \"Rgba32ui\";\n    case 31: return \"Rgba16ui\";\n    case 32: return \"Rgba8ui\";\n    case 33: return \"R32ui\";\n\n    // Desktop uint\n    case 34: return \"Rgb10a2ui\";\n    case 35: return \"Rg32ui\";\n    case 36: return \"Rg16ui\";\n    case 37: return \"Rg8ui\";\n    case 38: return \"R16ui\";\n    case 39: return \"R8ui\";\n    case 40: return \"R64ui\";\n    case 41: return \"R64i\";\n\n    default:\n        return \"Bad\";\n    }\n}\n\nconst char* ImageChannelOrderString(int format)\n{\n    switch (format) {\n    case 0:  return \"R\";\n    case 1:  return \"A\";\n    case 2:  return \"RG\";\n    case 3:  return \"RA\";\n    case 4:  return \"RGB\";\n    case 5:  return \"RGBA\";\n    case 6:  return \"BGRA\";\n    case 7:  return \"ARGB\";\n    case 8:  return \"Intensity\";\n    case 9:  return \"Luminance\";\n    case 10: return \"Rx\";\n    case 11: return \"RGx\";\n    case 12: return \"RGBx\";\n    case 13: return \"Depth\";\n    case 14: return \"DepthStencil\";\n    case 15: return \"sRGB\";\n    case 16: return \"sRGBx\";\n    case 17: return \"sRGBA\";\n    case 18: return \"sBGRA\";\n\n    default:\n        return \"Bad\";\n    }\n}\n\nconst char* ImageChannelDataTypeString(int type)\n{\n    switch (type)\n    {\n    case 0: return \"SnormInt8\";\n    case 1: return \"SnormInt16\";\n    case 2: return \"UnormInt8\";\n    case 3: return \"UnormInt16\";\n    case 4: return \"UnormShort565\";\n    case 5: return \"UnormShort555\";\n    case 6: return \"UnormInt101010\";\n    case 7: return \"SignedInt8\";\n    case 8: return \"SignedInt16\";\n    case 9: return \"SignedInt32\";\n    case 10: return \"UnsignedInt8\";\n    case 11: return \"UnsignedInt16\";\n    case 12: return \"UnsignedInt32\";\n    case 13: return \"HalfFloat\";\n    case 14: return \"Float\";\n    case 15: return \"UnormInt24\";\n    case 16: return \"UnormInt101010_2\";\n\n    default:\n        return \"Bad\";\n    }\n}\n\nconst int ImageOperandsCeiling = 17;\n\nconst char* ImageOperandsString(int format)\n{\n    switch (format) {\n    case (int)ImageOperandsShift::Bias:                    return \"Bias\";\n    case (int)ImageOperandsShift::Lod:                     return \"Lod\";\n    case (int)ImageOperandsShift::Grad:                    return \"Grad\";\n    case (int)ImageOperandsShift::ConstOffset:             return \"ConstOffset\";\n    case (int)ImageOperandsShift::Offset:                  return \"Offset\";\n    case (int)ImageOperandsShift::ConstOffsets:            return \"ConstOffsets\";\n    case (int)ImageOperandsShift::Sample:                  return \"Sample\";\n    case (int)ImageOperandsShift::MinLod:                  return \"MinLod\";\n    case (int)ImageOperandsShift::MakeTexelAvailableKHR:   return \"MakeTexelAvailableKHR\";\n    case (int)ImageOperandsShift::MakeTexelVisibleKHR:     return \"MakeTexelVisibleKHR\";\n    case (int)ImageOperandsShift::NonPrivateTexelKHR:      return \"NonPrivateTexelKHR\";\n    case (int)ImageOperandsShift::VolatileTexelKHR:        return \"VolatileTexelKHR\";\n    case (int)ImageOperandsShift::SignExtend:              return \"SignExtend\";\n    case (int)ImageOperandsShift::ZeroExtend:              return \"ZeroExtend\";\n    case (int)ImageOperandsShift::Nontemporal:             return \"Nontemporal\";\n    case (int)ImageOperandsShift::Offsets:                 return \"Offsets\";\n\n    case ImageOperandsCeiling:\n    default:\n        return \"Bad\";\n    }\n}\n\nconst char* FPFastMathString(int mode)\n{\n    switch (mode) {\n    case 0: return \"NotNaN\";\n    case 1: return \"NotInf\";\n    case 2: return \"NSZ\";\n    case 3: return \"AllowRecip\";\n    case 4: return \"Fast\";\n\n    default:     return \"Bad\";\n    }\n}\n\nconst char* FPRoundingModeString(int mode)\n{\n    switch (mode) {\n    case 0:  return \"RTE\";\n    case 1:  return \"RTZ\";\n    case 2:  return \"RTP\";\n    case 3:  return \"RTN\";\n\n    default: return \"Bad\";\n    }\n}\n\nconst char* LinkageTypeString(int type)\n{\n    switch (type) {\n    case 0:  return \"Export\";\n    case 1:  return \"Import\";\n\n    default: return \"Bad\";\n    }\n}\n\nconst char* FuncParamAttrString(int attr)\n{\n    switch (attr) {\n    case 0:  return \"Zext\";\n    case 1:  return \"Sext\";\n    case 2:  return \"ByVal\";\n    case 3:  return \"Sret\";\n    case 4:  return \"NoAlias\";\n    case 5:  return \"NoCapture\";\n    case 6:  return \"NoWrite\";\n    case 7:  return \"NoReadWrite\";\n\n    default: return \"Bad\";\n    }\n}\n\nconst char* AccessQualifierString(int attr)\n{\n    switch (attr) {\n    case 0:  return \"ReadOnly\";\n    case 1:  return \"WriteOnly\";\n    case 2:  return \"ReadWrite\";\n\n    default: return \"Bad\";\n    }\n}\n\nconst int SelectControlCeiling = 2;\n\nconst char* SelectControlString(int cont)\n{\n    switch (cont) {\n    case 0:  return \"Flatten\";\n    case 1:  return \"DontFlatten\";\n\n    case SelectControlCeiling:\n    default: return \"Bad\";\n    }\n}\n\nconst int LoopControlCeiling = (int)LoopControlShift::PartialCount + 1;\n\nconst char* LoopControlString(int cont)\n{\n    switch (cont) {\n    case (int)LoopControlShift::Unroll:             return \"Unroll\";\n    case (int)LoopControlShift::DontUnroll:         return \"DontUnroll\";\n    case (int)LoopControlShift::DependencyInfinite: return \"DependencyInfinite\";\n    case (int)LoopControlShift::DependencyLength:   return \"DependencyLength\";\n    case (int)LoopControlShift::MinIterations:      return \"MinIterations\";\n    case (int)LoopControlShift::MaxIterations:      return \"MaxIterations\";\n    case (int)LoopControlShift::IterationMultiple:  return \"IterationMultiple\";\n    case (int)LoopControlShift::PeelCount:          return \"PeelCount\";\n    case (int)LoopControlShift::PartialCount:       return \"PartialCount\";\n\n    case LoopControlCeiling:\n    default: return \"Bad\";\n    }\n}\n\nconst int FunctionControlCeiling = 4;\n\nconst char* FunctionControlString(int cont)\n{\n    switch (cont) {\n    case 0:  return \"Inline\";\n    case 1:  return \"DontInline\";\n    case 2:  return \"Pure\";\n    case 3:  return \"Const\";\n\n    case FunctionControlCeiling:\n    default: return \"Bad\";\n    }\n}\n\nconst char* MemorySemanticsString(int mem)\n{\n    // Note: No bits set (None) means \"Relaxed\"\n    switch (mem) {\n    case 0: return \"Bad\"; // Note: this is a placeholder for 'Consume'\n    case 1: return \"Acquire\";\n    case 2: return \"Release\";\n    case 3: return \"AcquireRelease\";\n    case 4: return \"SequentiallyConsistent\";\n    case 5: return \"Bad\"; // Note: reserved for future expansion\n    case 6: return \"UniformMemory\";\n    case 7: return \"SubgroupMemory\";\n    case 8: return \"WorkgroupMemory\";\n    case 9: return \"CrossWorkgroupMemory\";\n    case 10: return \"AtomicCounterMemory\";\n    case 11: return \"ImageMemory\";\n\n    default:     return \"Bad\";\n    }\n}\n\nconst int MemoryAccessCeiling = 6;\n\nconst char* MemoryAccessString(int mem)\n{\n    switch (mem) {\n    case (int)MemoryAccessShift::Volatile:                 return \"Volatile\";\n    case (int)MemoryAccessShift::Aligned:                  return \"Aligned\";\n    case (int)MemoryAccessShift::Nontemporal:              return \"Nontemporal\";\n    case (int)MemoryAccessShift::MakePointerAvailableKHR:  return \"MakePointerAvailableKHR\";\n    case (int)MemoryAccessShift::MakePointerVisibleKHR:    return \"MakePointerVisibleKHR\";\n    case (int)MemoryAccessShift::NonPrivatePointerKHR:     return \"NonPrivatePointerKHR\";\n\n    default: return \"Bad\";\n    }\n}\n\nconst int CooperativeMatrixOperandsCeiling = 6;\n\nconst char* CooperativeMatrixOperandsString(int op)\n{\n    switch (op) {\n    case (int)CooperativeMatrixOperandsShift::MatrixASignedComponentsKHR:  return \"ASignedComponentsKHR\";\n    case (int)CooperativeMatrixOperandsShift::MatrixBSignedComponentsKHR:  return \"BSignedComponentsKHR\";\n    case (int)CooperativeMatrixOperandsShift::MatrixCSignedComponentsKHR:  return \"CSignedComponentsKHR\";\n    case (int)CooperativeMatrixOperandsShift::MatrixResultSignedComponentsKHR:  return \"ResultSignedComponentsKHR\";\n    case (int)CooperativeMatrixOperandsShift::SaturatingAccumulationKHR:   return \"SaturatingAccumulationKHR\";\n\n    default: return \"Bad\";\n    }\n}\n\nconst int TensorAddressingOperandsCeiling = 3;\n\nconst char* TensorAddressingOperandsString(int op)\n{\n    switch (op) {\n    case (int)TensorAddressingOperandsShift::TensorView:  return \"TensorView\";\n    case (int)TensorAddressingOperandsShift::DecodeFunc:  return \"DecodeFunc\";\n\n    default: return \"Bad\";\n    }\n}\n\nconst char* ScopeString(int mem)\n{\n    switch (mem) {\n    case 0:  return \"CrossDevice\";\n    case 1:  return \"Device\";\n    case 2:  return \"Workgroup\";\n    case 3:  return \"Subgroup\";\n    case 4:  return \"Invocation\";\n\n    default: return \"Bad\";\n    }\n}\n\nconst char* GroupOperationString(int gop)\n{\n\n    switch (gop)\n    {\n    case (int)GroupOperation::Reduce:  return \"Reduce\";\n    case (int)GroupOperation::InclusiveScan:  return \"InclusiveScan\";\n    case (int)GroupOperation::ExclusiveScan:  return \"ExclusiveScan\";\n    case (int)GroupOperation::ClusteredReduce:  return \"ClusteredReduce\";\n    case (int)GroupOperation::PartitionedReduceNV:  return \"PartitionedReduceNV\";\n    case (int)GroupOperation::PartitionedInclusiveScanNV:  return \"PartitionedInclusiveScanNV\";\n    case (int)GroupOperation::PartitionedExclusiveScanNV:  return \"PartitionedExclusiveScanNV\";\n\n    default: return \"Bad\";\n    }\n}\n\nconst char* KernelEnqueueFlagsString(int flag)\n{\n    switch (flag)\n    {\n    case 0:  return \"NoWait\";\n    case 1:  return \"WaitKernel\";\n    case 2:  return \"WaitWorkGroup\";\n\n    default: return \"Bad\";\n    }\n}\n\nconst char* KernelProfilingInfoString(int info)\n{\n    switch (info)\n    {\n    case 0:  return \"CmdExecTime\";\n\n    default: return \"Bad\";\n    }\n}\n\nconst char* CapabilityString(int info)\n{\n    switch (info)\n    {\n    case 0:  return \"Matrix\";\n    case 1:  return \"Shader\";\n    case 2:  return \"Geometry\";\n    case 3:  return \"Tessellation\";\n    case 4:  return \"Addresses\";\n    case 5:  return \"Linkage\";\n    case 6:  return \"Kernel\";\n    case 7:  return \"Vector16\";\n    case 8:  return \"Float16Buffer\";\n    case 9:  return \"Float16\";\n    case 10: return \"Float64\";\n    case 11: return \"Int64\";\n    case 12: return \"Int64Atomics\";\n    case 13: return \"ImageBasic\";\n    case 14: return \"ImageReadWrite\";\n    case 15: return \"ImageMipmap\";\n    case 16: return \"Bad\";\n    case 17: return \"Pipes\";\n    case 18: return \"Groups\";\n    case 19: return \"DeviceEnqueue\";\n    case 20: return \"LiteralSampler\";\n    case 21: return \"AtomicStorage\";\n    case 22: return \"Int16\";\n    case 23: return \"TessellationPointSize\";\n    case 24: return \"GeometryPointSize\";\n    case 25: return \"ImageGatherExtended\";\n    case 26: return \"Bad\";\n    case 27: return \"StorageImageMultisample\";\n    case 28: return \"UniformBufferArrayDynamicIndexing\";\n    case 29: return \"SampledImageArrayDynamicIndexing\";\n    case 30: return \"StorageBufferArrayDynamicIndexing\";\n    case 31: return \"StorageImageArrayDynamicIndexing\";\n    case 32: return \"ClipDistance\";\n    case 33: return \"CullDistance\";\n    case 34: return \"ImageCubeArray\";\n    case 35: return \"SampleRateShading\";\n    case 36: return \"ImageRect\";\n    case 37: return \"SampledRect\";\n    case 38: return \"GenericPointer\";\n    case 39: return \"Int8\";\n    case 40: return \"InputAttachment\";\n    case 41: return \"SparseResidency\";\n    case 42: return \"MinLod\";\n    case 43: return \"Sampled1D\";\n    case 44: return \"Image1D\";\n    case 45: return \"SampledCubeArray\";\n    case 46: return \"SampledBuffer\";\n    case 47: return \"ImageBuffer\";\n    case 48: return \"ImageMSArray\";\n    case 49: return \"StorageImageExtendedFormats\";\n    case 50: return \"ImageQuery\";\n    case 51: return \"DerivativeControl\";\n    case 52: return \"InterpolationFunction\";\n    case 53: return \"TransformFeedback\";\n    case 54: return \"GeometryStreams\";\n    case 55: return \"StorageImageReadWithoutFormat\";\n    case 56: return \"StorageImageWriteWithoutFormat\";\n    case 57: return \"MultiViewport\";\n    case 61: return \"GroupNonUniform\";\n    case 62: return \"GroupNonUniformVote\";\n    case 63: return \"GroupNonUniformArithmetic\";\n    case 64: return \"GroupNonUniformBallot\";\n    case 65: return \"GroupNonUniformShuffle\";\n    case 66: return \"GroupNonUniformShuffleRelative\";\n    case 67: return \"GroupNonUniformClustered\";\n    case 68: return \"GroupNonUniformQuad\";\n\n    case (int)Capability::SubgroupBallotKHR: return \"SubgroupBallotKHR\";\n    case (int)Capability::DrawParameters:    return \"DrawParameters\";\n    case (int)Capability::SubgroupVoteKHR:   return \"SubgroupVoteKHR\";\n    case (int)Capability::GroupNonUniformRotateKHR: return \"CapabilityGroupNonUniformRotateKHR\";\n\n    case (int)Capability::StorageUniformBufferBlock16: return \"StorageUniformBufferBlock16\";\n    case (int)Capability::StorageUniform16:            return \"StorageUniform16\";\n    case (int)Capability::StoragePushConstant16:       return \"StoragePushConstant16\";\n    case (int)Capability::StorageInputOutput16:        return \"StorageInputOutput16\";\n\n    case (int)Capability::StorageBuffer8BitAccess:             return \"StorageBuffer8BitAccess\";\n    case (int)Capability::UniformAndStorageBuffer8BitAccess:   return \"UniformAndStorageBuffer8BitAccess\";\n    case (int)Capability::StoragePushConstant8:                return \"StoragePushConstant8\";\n\n    case (int)Capability::DeviceGroup: return \"DeviceGroup\";\n    case (int)Capability::MultiView:   return \"MultiView\";\n\n    case (int)Capability::DenormPreserve:           return \"DenormPreserve\";\n    case (int)Capability::DenormFlushToZero:        return \"DenormFlushToZero\";\n    case (int)Capability::SignedZeroInfNanPreserve: return \"SignedZeroInfNanPreserve\";\n    case (int)Capability::RoundingModeRTE:          return \"RoundingModeRTE\";\n    case (int)Capability::RoundingModeRTZ:          return \"RoundingModeRTZ\";\n\n    case (int)Capability::StencilExportEXT: return \"StencilExportEXT\";\n\n    case (int)Capability::Float16ImageAMD:       return \"Float16ImageAMD\";\n    case (int)Capability::ImageGatherBiasLodAMD: return \"ImageGatherBiasLodAMD\";\n    case (int)Capability::FragmentMaskAMD:       return \"FragmentMaskAMD\";\n    case (int)Capability::ImageReadWriteLodAMD:  return \"ImageReadWriteLodAMD\";\n\n    case (int)Capability::AtomicStorageOps:             return \"AtomicStorageOps\";\n\n    case (int)Capability::SampleMaskPostDepthCoverage:  return \"SampleMaskPostDepthCoverage\";\n    case (int)Capability::GeometryShaderPassthroughNV:     return \"GeometryShaderPassthroughNV\";\n    case (int)Capability::ShaderViewportIndexLayerNV:      return \"ShaderViewportIndexLayerNV\";\n    case (int)Capability::ShaderViewportMaskNV:            return \"ShaderViewportMaskNV\";\n    case (int)Capability::ShaderStereoViewNV:              return \"ShaderStereoViewNV\";\n    case (int)Capability::PerViewAttributesNV:             return \"PerViewAttributesNV\";\n    case (int)Capability::GroupNonUniformPartitionedNV:    return \"GroupNonUniformPartitionedNV\";\n    case (int)Capability::RayTracingNV:                    return \"RayTracingNV\";\n    case (int)Capability::RayTracingMotionBlurNV:          return \"RayTracingMotionBlurNV\";\n    case (int)Capability::RayTracingKHR:                   return \"RayTracingKHR\";\n    case (int)Capability::RayCullMaskKHR:                  return \"RayCullMaskKHR\";\n    case (int)Capability::RayQueryKHR:                     return \"RayQueryKHR\";\n    case (int)Capability::RayTracingProvisionalKHR:        return \"RayTracingProvisionalKHR\";\n    case (int)Capability::RayTraversalPrimitiveCullingKHR: return \"RayTraversalPrimitiveCullingKHR\";\n    case (int)Capability::RayTracingPositionFetchKHR:      return \"RayTracingPositionFetchKHR\";\n    case (int)Capability::DisplacementMicromapNV:           return \"DisplacementMicromapNV\";\n    case (int)Capability::RayTracingOpacityMicromapEXT:    return \"RayTracingOpacityMicromapEXT\";\n    case (int)Capability::RayTracingDisplacementMicromapNV: return \"CapabilityRayTracingDisplacementMicromapNV\";\n    case (int)Capability::RayQueryPositionFetchKHR:        return \"RayQueryPositionFetchKHR\";\n    case (int)Capability::ComputeDerivativeGroupQuadsNV:   return \"ComputeDerivativeGroupQuadsNV\";\n    case (int)Capability::ComputeDerivativeGroupLinearNV:  return \"ComputeDerivativeGroupLinearNV\";\n    case (int)Capability::FragmentBarycentricKHR:          return \"FragmentBarycentricKHR\";\n    case (int)Capability::MeshShadingNV:                   return \"MeshShadingNV\";\n    case (int)Capability::ImageFootprintNV:                return \"ImageFootprintNV\";\n    case (int)Capability::MeshShadingEXT:                  return \"MeshShadingEXT\";\n//    case (int)Capability::ShadingRateNV:                   return \"ShadingRateNV\";  // superseded by FragmentDensityEXT\n    case (int)Capability::SampleMaskOverrideCoverageNV:    return \"SampleMaskOverrideCoverageNV\";\n    case (int)Capability::FragmentDensityEXT:              return \"FragmentDensityEXT\";\n\n    case (int)Capability::FragmentFullyCoveredEXT: return \"FragmentFullyCoveredEXT\";\n\n    case (int)Capability::ShaderNonUniformEXT:                          return \"ShaderNonUniformEXT\";\n    case (int)Capability::RuntimeDescriptorArrayEXT:                    return \"RuntimeDescriptorArrayEXT\";\n    case (int)Capability::InputAttachmentArrayDynamicIndexingEXT:       return \"InputAttachmentArrayDynamicIndexingEXT\";\n    case (int)Capability::UniformTexelBufferArrayDynamicIndexingEXT:    return \"UniformTexelBufferArrayDynamicIndexingEXT\";\n    case (int)Capability::StorageTexelBufferArrayDynamicIndexingEXT:    return \"StorageTexelBufferArrayDynamicIndexingEXT\";\n    case (int)Capability::UniformBufferArrayNonUniformIndexingEXT:      return \"UniformBufferArrayNonUniformIndexingEXT\";\n    case (int)Capability::SampledImageArrayNonUniformIndexingEXT:       return \"SampledImageArrayNonUniformIndexingEXT\";\n    case (int)Capability::StorageBufferArrayNonUniformIndexingEXT:      return \"StorageBufferArrayNonUniformIndexingEXT\";\n    case (int)Capability::StorageImageArrayNonUniformIndexingEXT:       return \"StorageImageArrayNonUniformIndexingEXT\";\n    case (int)Capability::InputAttachmentArrayNonUniformIndexingEXT:    return \"InputAttachmentArrayNonUniformIndexingEXT\";\n    case (int)Capability::UniformTexelBufferArrayNonUniformIndexingEXT: return \"UniformTexelBufferArrayNonUniformIndexingEXT\";\n    case (int)Capability::StorageTexelBufferArrayNonUniformIndexingEXT: return \"StorageTexelBufferArrayNonUniformIndexingEXT\";\n\n    case (int)Capability::VulkanMemoryModelKHR:                return \"VulkanMemoryModelKHR\";\n    case (int)Capability::VulkanMemoryModelDeviceScopeKHR:     return \"VulkanMemoryModelDeviceScopeKHR\";\n\n    case (int)Capability::PhysicalStorageBufferAddressesEXT:   return \"PhysicalStorageBufferAddressesEXT\";\n\n    case (int)Capability::VariablePointers:                    return \"VariablePointers\";\n\n    case (int)Capability::CooperativeMatrixNV:     return \"CooperativeMatrixNV\";\n    case (int)Capability::CooperativeMatrixKHR:    return \"CooperativeMatrixKHR\";\n    case (int)Capability::CooperativeMatrixReductionsNV:           return \"CooperativeMatrixReductionsNV\";\n    case (int)Capability::CooperativeMatrixConversionsNV:          return \"CooperativeMatrixConversionsNV\";\n    case (int)Capability::CooperativeMatrixPerElementOperationsNV: return \"CooperativeMatrixPerElementOperationsNV\";\n    case (int)Capability::CooperativeMatrixTensorAddressingNV:     return \"CooperativeMatrixTensorAddressingNV\";\n    case (int)Capability::CooperativeMatrixBlockLoadsNV:           return \"CooperativeMatrixBlockLoadsNV\";\n    case (int)Capability::TensorAddressingNV:                      return \"TensorAddressingNV\";\n\n    case (int)Capability::ShaderSMBuiltinsNV:      return \"ShaderSMBuiltinsNV\";\n\n    case (int)Capability::CooperativeVectorNV:                     return \"CooperativeVectorNV\";\n    case (int)Capability::CooperativeVectorTrainingNV:             return \"CooperativeVectorTrainingNV\";\n\n    case (int)Capability::FragmentShaderSampleInterlockEXT:        return \"CapabilityFragmentShaderSampleInterlockEXT\";\n    case (int)Capability::FragmentShaderPixelInterlockEXT:         return \"CapabilityFragmentShaderPixelInterlockEXT\";\n    case (int)Capability::FragmentShaderShadingRateInterlockEXT:   return \"CapabilityFragmentShaderShadingRateInterlockEXT\";\n\n    case (int)Capability::TileImageColorReadAccessEXT:           return \"TileImageColorReadAccessEXT\";\n    case (int)Capability::TileImageDepthReadAccessEXT:           return \"TileImageDepthReadAccessEXT\";\n    case (int)Capability::TileImageStencilReadAccessEXT:         return \"TileImageStencilReadAccessEXT\";\n\n    case (int)Capability::CooperativeMatrixLayoutsARM:             return \"CooperativeMatrixLayoutsARM\";\n\n    case (int)Capability::FragmentShadingRateKHR:                  return \"FragmentShadingRateKHR\";\n\n    case (int)Capability::DemoteToHelperInvocationEXT:             return \"DemoteToHelperInvocationEXT\";\n    case (int)Capability::AtomicFloat16VectorNV:                   return \"AtomicFloat16VectorNV\";\n    case (int)Capability::ShaderClockKHR:                          return \"ShaderClockKHR\";\n    case (int)Capability::QuadControlKHR:                          return \"QuadControlKHR\";\n    case (int)Capability::Int64ImageEXT:                           return \"Int64ImageEXT\";\n\n    case (int)Capability::IntegerFunctions2INTEL:              return \"CapabilityIntegerFunctions2INTEL\";\n\n    case (int)Capability::ExpectAssumeKHR:                         return \"ExpectAssumeKHR\";\n\n    case (int)Capability::AtomicFloat16AddEXT:                     return \"AtomicFloat16AddEXT\";\n    case (int)Capability::AtomicFloat32AddEXT:                     return \"AtomicFloat32AddEXT\";\n    case (int)Capability::AtomicFloat64AddEXT:                     return \"AtomicFloat64AddEXT\";\n    case (int)Capability::AtomicFloat16MinMaxEXT:                  return \"AtomicFloat16MinMaxEXT\";\n    case (int)Capability::AtomicFloat32MinMaxEXT:                  return \"AtomicFloat32MinMaxEXT\";\n    case (int)Capability::AtomicFloat64MinMaxEXT:                  return \"AtomicFloat64MinMaxEXT\";\n\n    case (int)Capability::WorkgroupMemoryExplicitLayoutKHR:            return \"CapabilityWorkgroupMemoryExplicitLayoutKHR\";\n    case (int)Capability::WorkgroupMemoryExplicitLayout8BitAccessKHR:  return \"CapabilityWorkgroupMemoryExplicitLayout8BitAccessKHR\";\n    case (int)Capability::WorkgroupMemoryExplicitLayout16BitAccessKHR: return \"CapabilityWorkgroupMemoryExplicitLayout16BitAccessKHR\";\n    case (int)Capability::CoreBuiltinsARM:                             return \"CoreBuiltinsARM\";\n\n    case (int)Capability::ShaderInvocationReorderNV:                return \"ShaderInvocationReorderNV\";\n\n    case (int)Capability::TextureSampleWeightedQCOM:           return \"TextureSampleWeightedQCOM\";\n    case (int)Capability::TextureBoxFilterQCOM:                return \"TextureBoxFilterQCOM\";\n    case (int)Capability::TextureBlockMatchQCOM:               return \"TextureBlockMatchQCOM\";\n    case (int)Capability::TileShadingQCOM:                     return \"TileShadingQCOM\";\n    case (int)Capability::TextureBlockMatch2QCOM:              return \"TextureBlockMatch2QCOM\";\n\n    case (int)Capability::ReplicatedCompositesEXT:             return \"CapabilityReplicatedCompositesEXT\";\n\n    case (int)Capability::DotProductKHR:                       return \"DotProductKHR\";\n    case (int)Capability::DotProductInputAllKHR:               return \"DotProductInputAllKHR\";\n    case (int)Capability::DotProductInput4x8BitKHR:            return \"DotProductInput4x8BitKHR\";\n    case (int)Capability::DotProductInput4x8BitPackedKHR:      return \"DotProductInput4x8BitPackedKHR\";\n\n    case (int)Capability::RayTracingClusterAccelerationStructureNV:   return \"RayTracingClusterAccelerationStructureNV\";\n\n    case (int)Capability::RayTracingSpheresGeometryNV:             return \"RayTracingSpheresGeometryNV\";\n    case (int)Capability::RayTracingLinearSweptSpheresGeometryNV:  return \"RayTracingLinearSweptSpheresGeometryNV\";\n\n    case (int)Capability::BFloat16TypeKHR:                     return \"CapabilityBFloat16TypeKHR\";\n    case (int)Capability::BFloat16DotProductKHR:               return \"CapabilityBFloat16DotProductKHR\";\n    case (int)Capability::BFloat16CooperativeMatrixKHR:        return \"CapabilityBFloat16CooperativeMatrixKHR\";\n\n    case (int)Capability::Float8EXT:                           return \"CapabilityFloat8EXT\";\n    case (int)Capability::Float8CooperativeMatrixEXT:          return \"CapabilityFloat8CooperativeMatrixEXT\";\n\n    default: return \"Bad\";\n    }\n}\n\nconst char* OpcodeString(int op)\n{\n    switch (op) {\n    case 0:   return \"OpNop\";\n    case 1:   return \"OpUndef\";\n    case 2:   return \"OpSourceContinued\";\n    case 3:   return \"OpSource\";\n    case 4:   return \"OpSourceExtension\";\n    case 5:   return \"OpName\";\n    case 6:   return \"OpMemberName\";\n    case 7:   return \"OpString\";\n    case 8:   return \"OpLine\";\n    case 9:   return \"Bad\";\n    case 10:  return \"OpExtension\";\n    case 11:  return \"OpExtInstImport\";\n    case 12:  return \"OpExtInst\";\n    case 13:  return \"Bad\";\n    case 14:  return \"OpMemoryModel\";\n    case 15:  return \"OpEntryPoint\";\n    case 16:  return \"OpExecutionMode\";\n    case 17:  return \"OpCapability\";\n    case 18:  return \"Bad\";\n    case 19:  return \"OpTypeVoid\";\n    case 20:  return \"OpTypeBool\";\n    case 21:  return \"OpTypeInt\";\n    case 22:  return \"OpTypeFloat\";\n    case 23:  return \"OpTypeVector\";\n    case 24:  return \"OpTypeMatrix\";\n    case 25:  return \"OpTypeImage\";\n    case 26:  return \"OpTypeSampler\";\n    case 27:  return \"OpTypeSampledImage\";\n    case 28:  return \"OpTypeArray\";\n    case 29:  return \"OpTypeRuntimeArray\";\n    case 30:  return \"OpTypeStruct\";\n    case 31:  return \"OpTypeOpaque\";\n    case 32:  return \"OpTypePointer\";\n    case 33:  return \"OpTypeFunction\";\n    case 34:  return \"OpTypeEvent\";\n    case 35:  return \"OpTypeDeviceEvent\";\n    case 36:  return \"OpTypeReserveId\";\n    case 37:  return \"OpTypeQueue\";\n    case 38:  return \"OpTypePipe\";\n    case 39:  return \"OpTypeForwardPointer\";\n    case 40:  return \"Bad\";\n    case 41:  return \"OpConstantTrue\";\n    case 42:  return \"OpConstantFalse\";\n    case 43:  return \"OpConstant\";\n    case 44:  return \"OpConstantComposite\";\n    case 45:  return \"OpConstantSampler\";\n    case 46:  return \"OpConstantNull\";\n    case 47:  return \"Bad\";\n    case 48:  return \"OpSpecConstantTrue\";\n    case 49:  return \"OpSpecConstantFalse\";\n    case 50:  return \"OpSpecConstant\";\n    case 51:  return \"OpSpecConstantComposite\";\n    case 52:  return \"OpSpecConstantOp\";\n    case 53:  return \"Bad\";\n    case 54:  return \"OpFunction\";\n    case 55:  return \"OpFunctionParameter\";\n    case 56:  return \"OpFunctionEnd\";\n    case 57:  return \"OpFunctionCall\";\n    case 58:  return \"Bad\";\n    case 59:  return \"OpVariable\";\n    case 60:  return \"OpImageTexelPointer\";\n    case 61:  return \"OpLoad\";\n    case 62:  return \"OpStore\";\n    case 63:  return \"OpCopyMemory\";\n    case 64:  return \"OpCopyMemorySized\";\n    case 65:  return \"OpAccessChain\";\n    case 66:  return \"OpInBoundsAccessChain\";\n    case 67:  return \"OpPtrAccessChain\";\n    case 68:  return \"OpArrayLength\";\n    case 69:  return \"OpGenericPtrMemSemantics\";\n    case 70:  return \"OpInBoundsPtrAccessChain\";\n    case 71:  return \"OpDecorate\";\n    case 72:  return \"OpMemberDecorate\";\n    case 73:  return \"OpDecorationGroup\";\n    case 74:  return \"OpGroupDecorate\";\n    case 75:  return \"OpGroupMemberDecorate\";\n    case 76:  return \"Bad\";\n    case 77:  return \"OpVectorExtractDynamic\";\n    case 78:  return \"OpVectorInsertDynamic\";\n    case 79:  return \"OpVectorShuffle\";\n    case 80:  return \"OpCompositeConstruct\";\n    case 81:  return \"OpCompositeExtract\";\n    case 82:  return \"OpCompositeInsert\";\n    case 83:  return \"OpCopyObject\";\n    case 84:  return \"OpTranspose\";\n    case (int)Op::OpCopyLogical: return \"OpCopyLogical\";\n    case 85:  return \"Bad\";\n    case 86:  return \"OpSampledImage\";\n    case 87:  return \"OpImageSampleImplicitLod\";\n    case 88:  return \"OpImageSampleExplicitLod\";\n    case 89:  return \"OpImageSampleDrefImplicitLod\";\n    case 90:  return \"OpImageSampleDrefExplicitLod\";\n    case 91:  return \"OpImageSampleProjImplicitLod\";\n    case 92:  return \"OpImageSampleProjExplicitLod\";\n    case 93:  return \"OpImageSampleProjDrefImplicitLod\";\n    case 94:  return \"OpImageSampleProjDrefExplicitLod\";\n    case 95:  return \"OpImageFetch\";\n    case 96:  return \"OpImageGather\";\n    case 97:  return \"OpImageDrefGather\";\n    case 98:  return \"OpImageRead\";\n    case 99:  return \"OpImageWrite\";\n    case 100: return \"OpImage\";\n    case 101: return \"OpImageQueryFormat\";\n    case 102: return \"OpImageQueryOrder\";\n    case 103: return \"OpImageQuerySizeLod\";\n    case 104: return \"OpImageQuerySize\";\n    case 105: return \"OpImageQueryLod\";\n    case 106: return \"OpImageQueryLevels\";\n    case 107: return \"OpImageQuerySamples\";\n    case 108: return \"Bad\";\n    case 109: return \"OpConvertFToU\";\n    case 110: return \"OpConvertFToS\";\n    case 111: return \"OpConvertSToF\";\n    case 112: return \"OpConvertUToF\";\n    case 113: return \"OpUConvert\";\n    case 114: return \"OpSConvert\";\n    case 115: return \"OpFConvert\";\n    case 116: return \"OpQuantizeToF16\";\n    case 117: return \"OpConvertPtrToU\";\n    case 118: return \"OpSatConvertSToU\";\n    case 119: return \"OpSatConvertUToS\";\n    case 120: return \"OpConvertUToPtr\";\n    case 121: return \"OpPtrCastToGeneric\";\n    case 122: return \"OpGenericCastToPtr\";\n    case 123: return \"OpGenericCastToPtrExplicit\";\n    case 124: return \"OpBitcast\";\n    case 125: return \"Bad\";\n    case 126: return \"OpSNegate\";\n    case 127: return \"OpFNegate\";\n    case 128: return \"OpIAdd\";\n    case 129: return \"OpFAdd\";\n    case 130: return \"OpISub\";\n    case 131: return \"OpFSub\";\n    case 132: return \"OpIMul\";\n    case 133: return \"OpFMul\";\n    case 134: return \"OpUDiv\";\n    case 135: return \"OpSDiv\";\n    case 136: return \"OpFDiv\";\n    case 137: return \"OpUMod\";\n    case 138: return \"OpSRem\";\n    case 139: return \"OpSMod\";\n    case 140: return \"OpFRem\";\n    case 141: return \"OpFMod\";\n    case 142: return \"OpVectorTimesScalar\";\n    case 143: return \"OpMatrixTimesScalar\";\n    case 144: return \"OpVectorTimesMatrix\";\n    case 145: return \"OpMatrixTimesVector\";\n    case 146: return \"OpMatrixTimesMatrix\";\n    case 147: return \"OpOuterProduct\";\n    case 148: return \"OpDot\";\n    case 149: return \"OpIAddCarry\";\n    case 150: return \"OpISubBorrow\";\n    case 151: return \"OpUMulExtended\";\n    case 152: return \"OpSMulExtended\";\n    case 153: return \"Bad\";\n    case 154: return \"OpAny\";\n    case 155: return \"OpAll\";\n    case 156: return \"OpIsNan\";\n    case 157: return \"OpIsInf\";\n    case 158: return \"OpIsFinite\";\n    case 159: return \"OpIsNormal\";\n    case 160: return \"OpSignBitSet\";\n    case 161: return \"OpLessOrGreater\";\n    case 162: return \"OpOrdered\";\n    case 163: return \"OpUnordered\";\n    case 164: return \"OpLogicalEqual\";\n    case 165: return \"OpLogicalNotEqual\";\n    case 166: return \"OpLogicalOr\";\n    case 167: return \"OpLogicalAnd\";\n    case 168: return \"OpLogicalNot\";\n    case 169: return \"OpSelect\";\n    case 170: return \"OpIEqual\";\n    case 171: return \"OpINotEqual\";\n    case 172: return \"OpUGreaterThan\";\n    case 173: return \"OpSGreaterThan\";\n    case 174: return \"OpUGreaterThanEqual\";\n    case 175: return \"OpSGreaterThanEqual\";\n    case 176: return \"OpULessThan\";\n    case 177: return \"OpSLessThan\";\n    case 178: return \"OpULessThanEqual\";\n    case 179: return \"OpSLessThanEqual\";\n    case 180: return \"OpFOrdEqual\";\n    case 181: return \"OpFUnordEqual\";\n    case 182: return \"OpFOrdNotEqual\";\n    case 183: return \"OpFUnordNotEqual\";\n    case 184: return \"OpFOrdLessThan\";\n    case 185: return \"OpFUnordLessThan\";\n    case 186: return \"OpFOrdGreaterThan\";\n    case 187: return \"OpFUnordGreaterThan\";\n    case 188: return \"OpFOrdLessThanEqual\";\n    case 189: return \"OpFUnordLessThanEqual\";\n    case 190: return \"OpFOrdGreaterThanEqual\";\n    case 191: return \"OpFUnordGreaterThanEqual\";\n    case 192: return \"Bad\";\n    case 193: return \"Bad\";\n    case 194: return \"OpShiftRightLogical\";\n    case 195: return \"OpShiftRightArithmetic\";\n    case 196: return \"OpShiftLeftLogical\";\n    case 197: return \"OpBitwiseOr\";\n    case 198: return \"OpBitwiseXor\";\n    case 199: return \"OpBitwiseAnd\";\n    case 200: return \"OpNot\";\n    case 201: return \"OpBitFieldInsert\";\n    case 202: return \"OpBitFieldSExtract\";\n    case 203: return \"OpBitFieldUExtract\";\n    case 204: return \"OpBitReverse\";\n    case 205: return \"OpBitCount\";\n    case 206: return \"Bad\";\n    case 207: return \"OpDPdx\";\n    case 208: return \"OpDPdy\";\n    case 209: return \"OpFwidth\";\n    case 210: return \"OpDPdxFine\";\n    case 211: return \"OpDPdyFine\";\n    case 212: return \"OpFwidthFine\";\n    case 213: return \"OpDPdxCoarse\";\n    case 214: return \"OpDPdyCoarse\";\n    case 215: return \"OpFwidthCoarse\";\n    case 216: return \"Bad\";\n    case 217: return \"Bad\";\n    case 218: return \"OpEmitVertex\";\n    case 219: return \"OpEndPrimitive\";\n    case 220: return \"OpEmitStreamVertex\";\n    case 221: return \"OpEndStreamPrimitive\";\n    case 222: return \"Bad\";\n    case 223: return \"Bad\";\n    case 224: return \"OpControlBarrier\";\n    case 225: return \"OpMemoryBarrier\";\n    case 226: return \"Bad\";\n    case 227: return \"OpAtomicLoad\";\n    case 228: return \"OpAtomicStore\";\n    case 229: return \"OpAtomicExchange\";\n    case 230: return \"OpAtomicCompareExchange\";\n    case 231: return \"OpAtomicCompareExchangeWeak\";\n    case 232: return \"OpAtomicIIncrement\";\n    case 233: return \"OpAtomicIDecrement\";\n    case 234: return \"OpAtomicIAdd\";\n    case 235: return \"OpAtomicISub\";\n    case 236: return \"OpAtomicSMin\";\n    case 237: return \"OpAtomicUMin\";\n    case 238: return \"OpAtomicSMax\";\n    case 239: return \"OpAtomicUMax\";\n    case 240: return \"OpAtomicAnd\";\n    case 241: return \"OpAtomicOr\";\n    case 242: return \"OpAtomicXor\";\n    case 243: return \"Bad\";\n    case 244: return \"Bad\";\n    case 245: return \"OpPhi\";\n    case 246: return \"OpLoopMerge\";\n    case 247: return \"OpSelectionMerge\";\n    case 248: return \"OpLabel\";\n    case 249: return \"OpBranch\";\n    case 250: return \"OpBranchConditional\";\n    case 251: return \"OpSwitch\";\n    case 252: return \"OpKill\";\n    case 253: return \"OpReturn\";\n    case 254: return \"OpReturnValue\";\n    case 255: return \"OpUnreachable\";\n    case 256: return \"OpLifetimeStart\";\n    case 257: return \"OpLifetimeStop\";\n    case 258: return \"Bad\";\n    case 259: return \"OpGroupAsyncCopy\";\n    case 260: return \"OpGroupWaitEvents\";\n    case 261: return \"OpGroupAll\";\n    case 262: return \"OpGroupAny\";\n    case 263: return \"OpGroupBroadcast\";\n    case 264: return \"OpGroupIAdd\";\n    case 265: return \"OpGroupFAdd\";\n    case 266: return \"OpGroupFMin\";\n    case 267: return \"OpGroupUMin\";\n    case 268: return \"OpGroupSMin\";\n    case 269: return \"OpGroupFMax\";\n    case 270: return \"OpGroupUMax\";\n    case 271: return \"OpGroupSMax\";\n    case 272: return \"Bad\";\n    case 273: return \"Bad\";\n    case 274: return \"OpReadPipe\";\n    case 275: return \"OpWritePipe\";\n    case 276: return \"OpReservedReadPipe\";\n    case 277: return \"OpReservedWritePipe\";\n    case 278: return \"OpReserveReadPipePackets\";\n    case 279: return \"OpReserveWritePipePackets\";\n    case 280: return \"OpCommitReadPipe\";\n    case 281: return \"OpCommitWritePipe\";\n    case 282: return \"OpIsValidReserveId\";\n    case 283: return \"OpGetNumPipePackets\";\n    case 284: return \"OpGetMaxPipePackets\";\n    case 285: return \"OpGroupReserveReadPipePackets\";\n    case 286: return \"OpGroupReserveWritePipePackets\";\n    case 287: return \"OpGroupCommitReadPipe\";\n    case 288: return \"OpGroupCommitWritePipe\";\n    case 289: return \"Bad\";\n    case 290: return \"Bad\";\n    case 291: return \"OpEnqueueMarker\";\n    case 292: return \"OpEnqueueKernel\";\n    case 293: return \"OpGetKernelNDrangeSubGroupCount\";\n    case 294: return \"OpGetKernelNDrangeMaxSubGroupSize\";\n    case 295: return \"OpGetKernelWorkGroupSize\";\n    case 296: return \"OpGetKernelPreferredWorkGroupSizeMultiple\";\n    case 297: return \"OpRetainEvent\";\n    case 298: return \"OpReleaseEvent\";\n    case 299: return \"OpCreateUserEvent\";\n    case 300: return \"OpIsValidEvent\";\n    case 301: return \"OpSetUserEventStatus\";\n    case 302: return \"OpCaptureEventProfilingInfo\";\n    case 303: return \"OpGetDefaultQueue\";\n    case 304: return \"OpBuildNDRange\";\n    case 305: return \"OpImageSparseSampleImplicitLod\";\n    case 306: return \"OpImageSparseSampleExplicitLod\";\n    case 307: return \"OpImageSparseSampleDrefImplicitLod\";\n    case 308: return \"OpImageSparseSampleDrefExplicitLod\";\n    case 309: return \"OpImageSparseSampleProjImplicitLod\";\n    case 310: return \"OpImageSparseSampleProjExplicitLod\";\n    case 311: return \"OpImageSparseSampleProjDrefImplicitLod\";\n    case 312: return \"OpImageSparseSampleProjDrefExplicitLod\";\n    case 313: return \"OpImageSparseFetch\";\n    case 314: return \"OpImageSparseGather\";\n    case 315: return \"OpImageSparseDrefGather\";\n    case 316: return \"OpImageSparseTexelsResident\";\n    case 317: return \"OpNoLine\";\n    case 318: return \"OpAtomicFlagTestAndSet\";\n    case 319: return \"OpAtomicFlagClear\";\n    case 320: return \"OpImageSparseRead\";\n\n    case (int)Op::OpModuleProcessed: return \"OpModuleProcessed\";\n    case (int)Op::OpExecutionModeId: return \"OpExecutionModeId\";\n    case (int)Op::OpDecorateId:      return \"OpDecorateId\";\n\n    case 333: return \"OpGroupNonUniformElect\";\n    case 334: return \"OpGroupNonUniformAll\";\n    case 335: return \"OpGroupNonUniformAny\";\n    case 336: return \"OpGroupNonUniformAllEqual\";\n    case 337: return \"OpGroupNonUniformBroadcast\";\n    case 338: return \"OpGroupNonUniformBroadcastFirst\";\n    case 339: return \"OpGroupNonUniformBallot\";\n    case 340: return \"OpGroupNonUniformInverseBallot\";\n    case 341: return \"OpGroupNonUniformBallotBitExtract\";\n    case 342: return \"OpGroupNonUniformBallotBitCount\";\n    case 343: return \"OpGroupNonUniformBallotFindLSB\";\n    case 344: return \"OpGroupNonUniformBallotFindMSB\";\n    case 345: return \"OpGroupNonUniformShuffle\";\n    case 346: return \"OpGroupNonUniformShuffleXor\";\n    case 347: return \"OpGroupNonUniformShuffleUp\";\n    case 348: return \"OpGroupNonUniformShuffleDown\";\n    case 349: return \"OpGroupNonUniformIAdd\";\n    case 350: return \"OpGroupNonUniformFAdd\";\n    case 351: return \"OpGroupNonUniformIMul\";\n    case 352: return \"OpGroupNonUniformFMul\";\n    case 353: return \"OpGroupNonUniformSMin\";\n    case 354: return \"OpGroupNonUniformUMin\";\n    case 355: return \"OpGroupNonUniformFMin\";\n    case 356: return \"OpGroupNonUniformSMax\";\n    case 357: return \"OpGroupNonUniformUMax\";\n    case 358: return \"OpGroupNonUniformFMax\";\n    case 359: return \"OpGroupNonUniformBitwiseAnd\";\n    case 360: return \"OpGroupNonUniformBitwiseOr\";\n    case 361: return \"OpGroupNonUniformBitwiseXor\";\n    case 362: return \"OpGroupNonUniformLogicalAnd\";\n    case 363: return \"OpGroupNonUniformLogicalOr\";\n    case 364: return \"OpGroupNonUniformLogicalXor\";\n    case 365: return \"OpGroupNonUniformQuadBroadcast\";\n    case 366: return \"OpGroupNonUniformQuadSwap\";\n\n    case (int)Op::OpTerminateInvocation: return \"OpTerminateInvocation\";\n\n    case 4421: return \"OpSubgroupBallotKHR\";\n    case 4422: return \"OpSubgroupFirstInvocationKHR\";\n    case 4428: return \"OpSubgroupAllKHR\";\n    case 4429: return \"OpSubgroupAnyKHR\";\n    case 4430: return \"OpSubgroupAllEqualKHR\";\n    case 4432: return \"OpSubgroupReadInvocationKHR\";\n    case 4433: return \"OpExtInstWithForwardRefsKHR\";\n\n    case (int)Op::OpGroupNonUniformQuadAllKHR: return \"OpGroupNonUniformQuadAllKHR\";\n    case (int)Op::OpGroupNonUniformQuadAnyKHR: return \"OpGroupNonUniformQuadAnyKHR\";\n\n    case (int)Op::OpAtomicFAddEXT: return \"OpAtomicFAddEXT\";\n    case (int)Op::OpAtomicFMinEXT: return \"OpAtomicFMinEXT\";\n    case (int)Op::OpAtomicFMaxEXT: return \"OpAtomicFMaxEXT\";\n\n    case (int)Op::OpAssumeTrueKHR: return \"OpAssumeTrueKHR\";\n    case (int)Op::OpExpectKHR: return \"OpExpectKHR\";\n\n    case 5000: return \"OpGroupIAddNonUniformAMD\";\n    case 5001: return \"OpGroupFAddNonUniformAMD\";\n    case 5002: return \"OpGroupFMinNonUniformAMD\";\n    case 5003: return \"OpGroupUMinNonUniformAMD\";\n    case 5004: return \"OpGroupSMinNonUniformAMD\";\n    case 5005: return \"OpGroupFMaxNonUniformAMD\";\n    case 5006: return \"OpGroupUMaxNonUniformAMD\";\n    case 5007: return \"OpGroupSMaxNonUniformAMD\";\n\n    case 5011: return \"OpFragmentMaskFetchAMD\";\n    case 5012: return \"OpFragmentFetchAMD\";\n\n    case (int)Op::OpReadClockKHR:               return \"OpReadClockKHR\";\n\n    case (int)Op::OpDecorateStringGOOGLE:       return \"OpDecorateStringGOOGLE\";\n    case (int)Op::OpMemberDecorateStringGOOGLE: return \"OpMemberDecorateStringGOOGLE\";\n\n    case (int)Op::OpReportIntersectionKHR:             return \"OpReportIntersectionKHR\";\n    case (int)Op::OpIgnoreIntersectionNV:              return \"OpIgnoreIntersectionNV\";\n    case (int)Op::OpIgnoreIntersectionKHR:             return \"OpIgnoreIntersectionKHR\";\n    case (int)Op::OpTerminateRayNV:                    return \"OpTerminateRayNV\";\n    case (int)Op::OpTerminateRayKHR:                   return \"OpTerminateRayKHR\";\n    case (int)Op::OpTraceNV:                           return \"OpTraceNV\";\n    case (int)Op::OpTraceRayMotionNV:                  return \"OpTraceRayMotionNV\";\n    case (int)Op::OpTraceRayKHR:                       return \"OpTraceRayKHR\";\n    case (int)Op::OpTypeAccelerationStructureKHR:      return \"OpTypeAccelerationStructureKHR\";\n    case (int)Op::OpExecuteCallableNV:                 return \"OpExecuteCallableNV\";\n    case (int)Op::OpExecuteCallableKHR:                return \"OpExecuteCallableKHR\";\n    case (int)Op::OpConvertUToAccelerationStructureKHR: return \"OpConvertUToAccelerationStructureKHR\";\n\n    case (int)Op::OpGroupNonUniformPartitionNV:       return \"OpGroupNonUniformPartitionNV\";\n    case (int)Op::OpImageSampleFootprintNV:           return \"OpImageSampleFootprintNV\";\n    case (int)Op::OpWritePackedPrimitiveIndices4x8NV: return \"OpWritePackedPrimitiveIndices4x8NV\";\n    case (int)Op::OpEmitMeshTasksEXT:                 return \"OpEmitMeshTasksEXT\";\n    case (int)Op::OpSetMeshOutputsEXT:                return \"OpSetMeshOutputsEXT\";\n\n    case (int)Op::OpGroupNonUniformRotateKHR:         return \"OpGroupNonUniformRotateKHR\";\n\n    case (int)Op::OpTypeRayQueryKHR:                                                   return \"OpTypeRayQueryKHR\";\n    case (int)Op::OpRayQueryInitializeKHR:                                             return \"OpRayQueryInitializeKHR\";\n    case (int)Op::OpRayQueryTerminateKHR:                                              return \"OpRayQueryTerminateKHR\";\n    case (int)Op::OpRayQueryGenerateIntersectionKHR:                                   return \"OpRayQueryGenerateIntersectionKHR\";\n    case (int)Op::OpRayQueryConfirmIntersectionKHR:                                    return \"OpRayQueryConfirmIntersectionKHR\";\n    case (int)Op::OpRayQueryProceedKHR:                                                return \"OpRayQueryProceedKHR\";\n    case (int)Op::OpRayQueryGetIntersectionTypeKHR:                                    return \"OpRayQueryGetIntersectionTypeKHR\";\n    case (int)Op::OpRayQueryGetRayTMinKHR:                                             return \"OpRayQueryGetRayTMinKHR\";\n    case (int)Op::OpRayQueryGetRayFlagsKHR:                                            return \"OpRayQueryGetRayFlagsKHR\";\n    case (int)Op::OpRayQueryGetIntersectionTKHR:                                       return \"OpRayQueryGetIntersectionTKHR\";\n    case (int)Op::OpRayQueryGetIntersectionInstanceCustomIndexKHR:                     return \"OpRayQueryGetIntersectionInstanceCustomIndexKHR\";\n    case (int)Op::OpRayQueryGetIntersectionInstanceIdKHR:                              return \"OpRayQueryGetIntersectionInstanceIdKHR\";\n    case (int)Op::OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR:  return \"OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR\";\n    case (int)Op::OpRayQueryGetIntersectionGeometryIndexKHR:                           return \"OpRayQueryGetIntersectionGeometryIndexKHR\";\n    case (int)Op::OpRayQueryGetIntersectionPrimitiveIndexKHR:                          return \"OpRayQueryGetIntersectionPrimitiveIndexKHR\";\n    case (int)Op::OpRayQueryGetIntersectionBarycentricsKHR:                            return \"OpRayQueryGetIntersectionBarycentricsKHR\";\n    case (int)Op::OpRayQueryGetIntersectionFrontFaceKHR:                               return \"OpRayQueryGetIntersectionFrontFaceKHR\";\n    case (int)Op::OpRayQueryGetIntersectionCandidateAABBOpaqueKHR:                     return \"OpRayQueryGetIntersectionCandidateAABBOpaqueKHR\";\n    case (int)Op::OpRayQueryGetIntersectionObjectRayDirectionKHR:                      return \"OpRayQueryGetIntersectionObjectRayDirectionKHR\";\n    case (int)Op::OpRayQueryGetIntersectionObjectRayOriginKHR:                         return \"OpRayQueryGetIntersectionObjectRayOriginKHR\";\n    case (int)Op::OpRayQueryGetWorldRayDirectionKHR:                                   return \"OpRayQueryGetWorldRayDirectionKHR\";\n    case (int)Op::OpRayQueryGetWorldRayOriginKHR:                                      return \"OpRayQueryGetWorldRayOriginKHR\";\n    case (int)Op::OpRayQueryGetIntersectionObjectToWorldKHR:                           return \"OpRayQueryGetIntersectionObjectToWorldKHR\";\n    case (int)Op::OpRayQueryGetIntersectionWorldToObjectKHR:                           return \"OpRayQueryGetIntersectionWorldToObjectKHR\";\n    case (int)Op::OpRayQueryGetIntersectionTriangleVertexPositionsKHR:                 return \"OpRayQueryGetIntersectionTriangleVertexPositionsKHR\";\n    case (int)Op::OpRayQueryGetClusterIdNV:                                            return \"OpRayQueryGetIntersectionClusterIdNV\";\n\n    case (int)Op::OpRayQueryGetIntersectionSpherePositionNV:                           return \"OpRayQueryGetIntersectionSpherePositionNV\";\n    case (int)Op::OpRayQueryGetIntersectionSphereRadiusNV:                             return \"OpRayQueryGetIntersectionSphereRadiusNV\";\n    case (int)Op::OpRayQueryGetIntersectionLSSHitValueNV:                              return \"OpRayQueryGetIntersectionLSSHitValueNV\";\n    case (int)Op::OpRayQueryGetIntersectionLSSPositionsNV:                             return \"OpRayQueryGetIntersectionLSSPositionsNV\";\n    case (int)Op::OpRayQueryGetIntersectionLSSRadiiNV:                                 return \"OpRayQueryGetIntersectionLSSRadiiNV\";\n    case (int)Op::OpRayQueryIsSphereHitNV:                                             return \"OpRayQueryIsSphereHitNV\";\n    case (int)Op::OpRayQueryIsLSSHitNV:                                                return \"OpRayQueryIsLSSHitNV\";\n\n    case (int)Op::OpTypeCooperativeMatrixNV:         return \"OpTypeCooperativeMatrixNV\";\n    case (int)Op::OpCooperativeMatrixLoadNV:         return \"OpCooperativeMatrixLoadNV\";\n    case (int)Op::OpCooperativeMatrixStoreNV:        return \"OpCooperativeMatrixStoreNV\";\n    case (int)Op::OpCooperativeMatrixMulAddNV:       return \"OpCooperativeMatrixMulAddNV\";\n    case (int)Op::OpCooperativeMatrixLengthNV:       return \"OpCooperativeMatrixLengthNV\";\n    case (int)Op::OpTypeCooperativeMatrixKHR:        return \"OpTypeCooperativeMatrixKHR\";\n    case (int)Op::OpCooperativeMatrixLoadKHR:        return \"OpCooperativeMatrixLoadKHR\";\n    case (int)Op::OpCooperativeMatrixStoreKHR:       return \"OpCooperativeMatrixStoreKHR\";\n    case (int)Op::OpCooperativeMatrixMulAddKHR:      return \"OpCooperativeMatrixMulAddKHR\";\n    case (int)Op::OpCooperativeMatrixLengthKHR:      return \"OpCooperativeMatrixLengthKHR\";\n    case (int)Op::OpDemoteToHelperInvocationEXT:     return \"OpDemoteToHelperInvocationEXT\";\n    case (int)Op::OpIsHelperInvocationEXT:           return \"OpIsHelperInvocationEXT\";\n\n    case (int)Op::OpCooperativeMatrixConvertNV:      return \"OpCooperativeMatrixConvertNV\";\n    case (int)Op::OpCooperativeMatrixTransposeNV:    return \"OpCooperativeMatrixTransposeNV\";\n    case (int)Op::OpCooperativeMatrixReduceNV:       return \"OpCooperativeMatrixReduceNV\";\n    case (int)Op::OpCooperativeMatrixLoadTensorNV:   return \"OpCooperativeMatrixLoadTensorNV\";\n    case (int)Op::OpCooperativeMatrixStoreTensorNV:  return \"OpCooperativeMatrixStoreTensorNV\";\n    case (int)Op::OpCooperativeMatrixPerElementOpNV: return \"OpCooperativeMatrixPerElementOpNV\";\n    case (int)Op::OpTypeTensorLayoutNV:              return \"OpTypeTensorLayoutNV\";\n    case (int)Op::OpTypeTensorViewNV:                return \"OpTypeTensorViewNV\";\n    case (int)Op::OpCreateTensorLayoutNV:            return \"OpCreateTensorLayoutNV\";\n    case (int)Op::OpTensorLayoutSetBlockSizeNV:      return \"OpTensorLayoutSetBlockSizeNV\";\n    case (int)Op::OpTensorLayoutSetDimensionNV:      return \"OpTensorLayoutSetDimensionNV\";\n    case (int)Op::OpTensorLayoutSetStrideNV:         return \"OpTensorLayoutSetStrideNV\";\n    case (int)Op::OpTensorLayoutSliceNV:             return \"OpTensorLayoutSliceNV\";\n    case (int)Op::OpTensorLayoutSetClampValueNV:     return \"OpTensorLayoutSetClampValueNV\";\n    case (int)Op::OpCreateTensorViewNV:              return \"OpCreateTensorViewNV\";\n    case (int)Op::OpTensorViewSetDimensionNV:        return \"OpTensorViewSetDimensionNV\";\n    case (int)Op::OpTensorViewSetStrideNV:           return \"OpTensorViewSetStrideNV\";\n    case (int)Op::OpTensorViewSetClipNV:             return \"OpTensorViewSetClipNV\";\n\n    case (int)Op::OpTypeCooperativeVectorNV:         return \"OpTypeCooperativeVectorNV\";\n    case (int)Op::OpCooperativeVectorMatrixMulNV:    return \"OpCooperativeVectorMatrixMulNV\";\n    case (int)Op::OpCooperativeVectorMatrixMulAddNV: return \"OpCooperativeVectorMatrixMulAddNV\";\n    case (int)Op::OpCooperativeVectorLoadNV:         return \"OpCooperativeVectorLoadNV\";\n    case (int)Op::OpCooperativeVectorStoreNV:        return \"OpCooperativeVectorStoreNV\";\n    case (int)Op::OpCooperativeVectorOuterProductAccumulateNV:   return \"OpCooperativeVectorOuterProductAccumulateNV\";\n    case (int)Op::OpCooperativeVectorReduceSumAccumulateNV:      return \"OpCooperativeVectorReduceSumAccumulateNV\";\n\n    case (int)Op::OpBeginInvocationInterlockEXT:     return \"OpBeginInvocationInterlockEXT\";\n    case (int)Op::OpEndInvocationInterlockEXT:       return \"OpEndInvocationInterlockEXT\";\n\n    case (int)Op::OpTypeHitObjectNV:                     return \"OpTypeHitObjectNV\";\n    case (int)Op::OpHitObjectTraceRayNV:                 return \"OpHitObjectTraceRayNV\";\n    case (int)Op::OpHitObjectTraceRayMotionNV:           return \"OpHitObjectTraceRayMotionNV\";\n    case (int)Op::OpHitObjectRecordHitNV:                return \"OpHitObjectRecordHitNV\";\n    case (int)Op::OpHitObjectRecordHitMotionNV:          return \"OpHitObjectRecordHitMotionNV\";\n    case (int)Op::OpHitObjectRecordHitWithIndexNV:       return \"OpHitObjectRecordHitWithIndexNV\";\n    case (int)Op::OpHitObjectRecordHitWithIndexMotionNV: return \"OpHitObjectRecordHitWithIndexMotionNV\";\n    case (int)Op::OpHitObjectRecordMissNV:               return \"OpHitObjectRecordMissNV\";\n    case (int)Op::OpHitObjectRecordMissMotionNV:         return \"OpHitObjectRecordMissMotionNV\";\n    case (int)Op::OpHitObjectRecordEmptyNV:              return \"OpHitObjectRecordEmptyNV\";\n    case (int)Op::OpHitObjectExecuteShaderNV:            return \"OpHitObjectExecuteShaderNV\";\n    case (int)Op::OpReorderThreadWithHintNV:             return \"OpReorderThreadWithHintNV\";\n    case (int)Op::OpReorderThreadWithHitObjectNV:        return \"OpReorderThreadWithHitObjectNV\";\n    case (int)Op::OpHitObjectGetCurrentTimeNV:           return \"OpHitObjectGetCurrentTimeNV\";\n    case (int)Op::OpHitObjectGetAttributesNV:            return \"OpHitObjectGetAttributesNV\";\n    case (int)Op::OpHitObjectGetHitKindNV:               return \"OpHitObjectGetFrontFaceNV\";\n    case (int)Op::OpHitObjectGetPrimitiveIndexNV:        return \"OpHitObjectGetPrimitiveIndexNV\";\n    case (int)Op::OpHitObjectGetGeometryIndexNV:         return \"OpHitObjectGetGeometryIndexNV\";\n    case (int)Op::OpHitObjectGetInstanceIdNV:            return \"OpHitObjectGetInstanceIdNV\";\n    case (int)Op::OpHitObjectGetInstanceCustomIndexNV:   return \"OpHitObjectGetInstanceCustomIndexNV\";\n    case (int)Op::OpHitObjectGetObjectRayDirectionNV:    return \"OpHitObjectGetObjectRayDirectionNV\";\n    case (int)Op::OpHitObjectGetObjectRayOriginNV:       return \"OpHitObjectGetObjectRayOriginNV\";\n    case (int)Op::OpHitObjectGetWorldRayDirectionNV:     return \"OpHitObjectGetWorldRayDirectionNV\";\n    case (int)Op::OpHitObjectGetWorldRayOriginNV:        return \"OpHitObjectGetWorldRayOriginNV\";\n    case (int)Op::OpHitObjectGetWorldToObjectNV:         return \"OpHitObjectGetWorldToObjectNV\";\n    case (int)Op::OpHitObjectGetObjectToWorldNV:         return \"OpHitObjectGetObjectToWorldNV\";\n    case (int)Op::OpHitObjectGetRayTMaxNV:               return \"OpHitObjectGetRayTMaxNV\";\n    case (int)Op::OpHitObjectGetRayTMinNV:               return \"OpHitObjectGetRayTMinNV\";\n    case (int)Op::OpHitObjectIsEmptyNV:                  return \"OpHitObjectIsEmptyNV\";\n    case (int)Op::OpHitObjectIsHitNV:                    return \"OpHitObjectIsHitNV\";\n    case (int)Op::OpHitObjectIsMissNV:                   return \"OpHitObjectIsMissNV\";\n    case (int)Op::OpHitObjectGetShaderBindingTableRecordIndexNV: return \"OpHitObjectGetShaderBindingTableRecordIndexNV\";\n    case (int)Op::OpHitObjectGetShaderRecordBufferHandleNV:   return \"OpHitObjectGetShaderRecordBufferHandleNV\";\n    case (int)Op::OpHitObjectGetClusterIdNV:             return \"OpHitObjectGetClusterIdNV\";\n    case (int)Op::OpHitObjectGetSpherePositionNV:        return \"OpHitObjectGetSpherePositionNV\";\n    case (int)Op::OpHitObjectGetSphereRadiusNV:          return \"OpHitObjectGetSphereRadiusNV\";\n    case (int)Op::OpHitObjectGetLSSPositionsNV:          return \"OpHitObjectGetLSSPositionsNV\";\n    case (int)Op::OpHitObjectGetLSSRadiiNV:              return \"OpHitObjectGetLSSRadiiNV\";\n    case (int)Op::OpHitObjectIsSphereHitNV:              return \"OpHitObjectIsSphereHitNV\";\n    case (int)Op::OpHitObjectIsLSSHitNV:                 return \"OpHitObjectIsLSSHitNV\";\n\n    case (int)Op::OpFetchMicroTriangleVertexBarycentricNV:       return \"OpFetchMicroTriangleVertexBarycentricNV\";\n    case (int)Op::OpFetchMicroTriangleVertexPositionNV:    return \"OpFetchMicroTriangleVertexPositionNV\";\n\n    case (int)Op::OpColorAttachmentReadEXT:          return \"OpColorAttachmentReadEXT\";\n    case (int)Op::OpDepthAttachmentReadEXT:          return \"OpDepthAttachmentReadEXT\";\n    case (int)Op::OpStencilAttachmentReadEXT:        return \"OpStencilAttachmentReadEXT\";\n\n    case (int)Op::OpImageSampleWeightedQCOM:         return \"OpImageSampleWeightedQCOM\";\n    case (int)Op::OpImageBoxFilterQCOM:              return \"OpImageBoxFilterQCOM\";\n    case (int)Op::OpImageBlockMatchSADQCOM:          return \"OpImageBlockMatchSADQCOM\";\n    case (int)Op::OpImageBlockMatchSSDQCOM:          return \"OpImageBlockMatchSSDQCOM\";\n    case (int)Op::OpImageBlockMatchWindowSSDQCOM:    return \"OpImageBlockMatchWindowSSDQCOM\";\n    case (int)Op::OpImageBlockMatchWindowSADQCOM:    return \"OpImageBlockMatchWindowSADQCOM\";\n    case (int)Op::OpImageBlockMatchGatherSSDQCOM:    return \"OpImageBlockMatchGatherSSDQCOM\";\n    case (int)Op::OpImageBlockMatchGatherSADQCOM:    return \"OpImageBlockMatchGatherSADQCOM\";\n\n    case (int)Op::OpConstantCompositeReplicateEXT: return \"OpConstantCompositeReplicateEXT\";\n    case (int)Op::OpSpecConstantCompositeReplicateEXT: return \"OpSpecConstantCompositeReplicateEXT\";\n    case (int)Op::OpCompositeConstructReplicateEXT: return \"OpCompositeConstructReplicateEXT\";\n\n    case (int)Op::OpSDotKHR: return \"OpSDotKHR\";\n    case (int)Op::OpUDotKHR: return \"OpUDotKHR\";\n    case (int)Op::OpSUDotKHR: return \"OpSUDotKHR\";\n    case (int)Op::OpSDotAccSatKHR: return \"OpSDotAccSatKHR\";\n    case (int)Op::OpUDotAccSatKHR: return \"OpUDotAccSatKHR\";\n    case (int)Op::OpSUDotAccSatKHR: return \"OpSUDotAccSatKHR\";\n\n    default:\n        return \"Bad\";\n    }\n}\n\n// The set of objects that hold all the instruction/operand\n// parameterization information.\nInstructionParameters InstructionDesc[OpCodeMask + 1];\nOperandParameters ExecutionModeOperands[ExecutionModeCeiling];\nOperandParameters DecorationOperands[DecorationCeiling];\n\nEnumDefinition OperandClassParams[OperandCount];\nEnumParameters ExecutionModeParams[ExecutionModeCeiling];\nEnumParameters ImageOperandsParams[ImageOperandsCeiling];\nEnumParameters DecorationParams[DecorationCeiling];\nEnumParameters LoopControlParams[FunctionControlCeiling];\nEnumParameters SelectionControlParams[SelectControlCeiling];\nEnumParameters FunctionControlParams[FunctionControlCeiling];\nEnumParameters MemoryAccessParams[MemoryAccessCeiling];\nEnumParameters CooperativeMatrixOperandsParams[CooperativeMatrixOperandsCeiling];\nEnumParameters TensorAddressingOperandsParams[TensorAddressingOperandsCeiling];\n\n// Set up all the parameterizing descriptions of the opcodes, operands, etc.\nvoid Parameterize()\n{\n    // only do this once.\n    static std::once_flag initialized;\n    std::call_once(initialized, [](){\n\n        // Exceptions to having a result <id> and a resulting type <id>.\n        // (Everything is initialized to have both).\n\n        InstructionDesc[enumCast(Op::OpNop)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpSource)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpSourceContinued)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpSourceExtension)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpExtension)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpExtInstImport)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpCapability)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpMemoryModel)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpEntryPoint)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpExecutionMode)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpExecutionModeId)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpTypeVoid)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpTypeBool)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpTypeInt)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpTypeFloat)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpTypeVector)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpTypeMatrix)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpTypeImage)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpTypeSampler)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpTypeSampledImage)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpTypeArray)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpTypeRuntimeArray)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpTypeStruct)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpTypeOpaque)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpTypePointer)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpTypeForwardPointer)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpTypeFunction)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpTypeEvent)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpTypeDeviceEvent)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpTypeReserveId)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpTypeQueue)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpTypePipe)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpFunctionEnd)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpStore)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpImageWrite)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpDecorationGroup)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpDecorate)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpDecorateId)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpDecorateStringGOOGLE)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpMemberDecorate)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpMemberDecorateStringGOOGLE)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpGroupDecorate)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpGroupMemberDecorate)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpName)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpMemberName)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpString)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpLine)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpNoLine)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpCopyMemory)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpCopyMemorySized)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpEmitVertex)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpEndPrimitive)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpEmitStreamVertex)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpEndStreamPrimitive)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpControlBarrier)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpMemoryBarrier)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpAtomicStore)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpLoopMerge)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpSelectionMerge)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpLabel)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpBranch)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpBranchConditional)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpSwitch)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpKill)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpTerminateInvocation)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpReturn)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpReturnValue)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpUnreachable)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpLifetimeStart)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpLifetimeStop)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpCommitReadPipe)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpCommitWritePipe)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpGroupCommitWritePipe)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpGroupCommitReadPipe)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpCaptureEventProfilingInfo)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpSetUserEventStatus)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpRetainEvent)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpReleaseEvent)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpGroupWaitEvents)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpAtomicFlagClear)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpModuleProcessed)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpTypeCooperativeMatrixNV)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixStoreNV)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpTypeCooperativeMatrixKHR)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixStoreKHR)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpBeginInvocationInterlockEXT)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpEndInvocationInterlockEXT)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpAssumeTrueKHR)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpTypeTensorLayoutNV)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpTypeTensorViewNV)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixStoreTensorNV)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpTypeCooperativeVectorNV)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpCooperativeVectorStoreNV)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpCooperativeVectorOuterProductAccumulateNV)].setResultAndType(false, false);\n        InstructionDesc[enumCast(Op::OpCooperativeVectorReduceSumAccumulateNV)].setResultAndType(false, false);\n\n        // Specific additional context-dependent operands\n\n        ExecutionModeOperands[enumCast(ExecutionMode::Invocations)].push(OperandLiteralNumber, \"'Number of <<Invocation,invocations>>'\");\n\n        ExecutionModeOperands[enumCast(ExecutionMode::LocalSize)].push(OperandLiteralNumber, \"'x size'\");\n        ExecutionModeOperands[enumCast(ExecutionMode::LocalSize)].push(OperandLiteralNumber, \"'y size'\");\n        ExecutionModeOperands[enumCast(ExecutionMode::LocalSize)].push(OperandLiteralNumber, \"'z size'\");\n\n        ExecutionModeOperands[enumCast(ExecutionMode::LocalSizeHint)].push(OperandLiteralNumber, \"'x size'\");\n        ExecutionModeOperands[enumCast(ExecutionMode::LocalSizeHint)].push(OperandLiteralNumber, \"'y size'\");\n        ExecutionModeOperands[enumCast(ExecutionMode::LocalSizeHint)].push(OperandLiteralNumber, \"'z size'\");\n\n        ExecutionModeOperands[enumCast(ExecutionMode::OutputVertices)].push(OperandLiteralNumber, \"'Vertex count'\");\n        ExecutionModeOperands[enumCast(ExecutionMode::VecTypeHint)].push(OperandLiteralNumber, \"'Vector type'\");\n\n        DecorationOperands[enumCast(Decoration::Stream)].push(OperandLiteralNumber, \"'Stream Number'\");\n        DecorationOperands[enumCast(Decoration::Location)].push(OperandLiteralNumber, \"'Location'\");\n        DecorationOperands[enumCast(Decoration::Component)].push(OperandLiteralNumber, \"'Component'\");\n        DecorationOperands[enumCast(Decoration::Index)].push(OperandLiteralNumber, \"'Index'\");\n        DecorationOperands[enumCast(Decoration::Binding)].push(OperandLiteralNumber, \"'Binding Point'\");\n        DecorationOperands[enumCast(Decoration::DescriptorSet)].push(OperandLiteralNumber, \"'Descriptor Set'\");\n        DecorationOperands[enumCast(Decoration::Offset)].push(OperandLiteralNumber, \"'Byte Offset'\");\n        DecorationOperands[enumCast(Decoration::XfbBuffer)].push(OperandLiteralNumber, \"'XFB Buffer Number'\");\n        DecorationOperands[enumCast(Decoration::XfbStride)].push(OperandLiteralNumber, \"'XFB Stride'\");\n        DecorationOperands[enumCast(Decoration::ArrayStride)].push(OperandLiteralNumber, \"'Array Stride'\");\n        DecorationOperands[enumCast(Decoration::MatrixStride)].push(OperandLiteralNumber, \"'Matrix Stride'\");\n        DecorationOperands[enumCast(Decoration::BuiltIn)].push(OperandLiteralNumber, \"See <<BuiltIn,*BuiltIn*>>\");\n        DecorationOperands[enumCast(Decoration::FPRoundingMode)].push(OperandFPRoundingMode, \"'Floating-Point Rounding Mode'\");\n        DecorationOperands[enumCast(Decoration::FPFastMathMode)].push(OperandFPFastMath, \"'Fast-Math Mode'\");\n        DecorationOperands[enumCast(Decoration::LinkageAttributes)].push(OperandLiteralString, \"'Name'\");\n        DecorationOperands[enumCast(Decoration::LinkageAttributes)].push(OperandLinkageType, \"'Linkage Type'\");\n        DecorationOperands[enumCast(Decoration::FuncParamAttr)].push(OperandFuncParamAttr, \"'Function Parameter Attribute'\");\n        DecorationOperands[enumCast(Decoration::SpecId)].push(OperandLiteralNumber, \"'Specialization Constant ID'\");\n        DecorationOperands[enumCast(Decoration::InputAttachmentIndex)].push(OperandLiteralNumber, \"'Attachment Index'\");\n        DecorationOperands[enumCast(Decoration::Alignment)].push(OperandLiteralNumber, \"'Alignment'\");\n\n        OperandClassParams[OperandSource].set(0, SourceString, nullptr);\n        OperandClassParams[OperandExecutionModel].set(0, ExecutionModelString, nullptr);\n        OperandClassParams[OperandAddressing].set(0, AddressingString, nullptr);\n        OperandClassParams[OperandMemory].set(0, MemoryString, nullptr);\n        OperandClassParams[OperandExecutionMode].set(ExecutionModeCeiling, ExecutionModeString, ExecutionModeParams);\n        OperandClassParams[OperandExecutionMode].setOperands(ExecutionModeOperands);\n        OperandClassParams[OperandStorage].set(0, StorageClassString, nullptr);\n        OperandClassParams[OperandDimensionality].set(0, DimensionString, nullptr);\n        OperandClassParams[OperandSamplerAddressingMode].set(0, SamplerAddressingModeString, nullptr);\n        OperandClassParams[OperandSamplerFilterMode].set(0, SamplerFilterModeString, nullptr);\n        OperandClassParams[OperandSamplerImageFormat].set(0, ImageFormatString, nullptr);\n        OperandClassParams[OperandImageChannelOrder].set(0, ImageChannelOrderString, nullptr);\n        OperandClassParams[OperandImageChannelDataType].set(0, ImageChannelDataTypeString, nullptr);\n        OperandClassParams[OperandImageOperands].set(ImageOperandsCeiling, ImageOperandsString, ImageOperandsParams, true);\n        OperandClassParams[OperandFPFastMath].set(0, FPFastMathString, nullptr, true);\n        OperandClassParams[OperandFPRoundingMode].set(0, FPRoundingModeString, nullptr);\n        OperandClassParams[OperandLinkageType].set(0, LinkageTypeString, nullptr);\n        OperandClassParams[OperandFuncParamAttr].set(0, FuncParamAttrString, nullptr);\n        OperandClassParams[OperandAccessQualifier].set(0, AccessQualifierString, nullptr);\n        OperandClassParams[OperandDecoration].set(DecorationCeiling, DecorationString, DecorationParams);\n        OperandClassParams[OperandDecoration].setOperands(DecorationOperands);\n        OperandClassParams[OperandBuiltIn].set(0, BuiltInString, nullptr);\n        OperandClassParams[OperandSelect].set(SelectControlCeiling, SelectControlString, SelectionControlParams, true);\n        OperandClassParams[OperandLoop].set(LoopControlCeiling, LoopControlString, LoopControlParams, true);\n        OperandClassParams[OperandFunction].set(FunctionControlCeiling, FunctionControlString, FunctionControlParams, true);\n        OperandClassParams[OperandMemorySemantics].set(0, MemorySemanticsString, nullptr, true);\n        OperandClassParams[OperandMemoryAccess].set(MemoryAccessCeiling, MemoryAccessString, MemoryAccessParams, true);\n        OperandClassParams[OperandScope].set(0, ScopeString, nullptr);\n        OperandClassParams[OperandGroupOperation].set(0, GroupOperationString, nullptr);\n        OperandClassParams[OperandKernelEnqueueFlags].set(0, KernelEnqueueFlagsString, nullptr);\n        OperandClassParams[OperandKernelProfilingInfo].set(0, KernelProfilingInfoString, nullptr, true);\n        OperandClassParams[OperandCapability].set(0, CapabilityString, nullptr);\n        OperandClassParams[OperandCooperativeMatrixOperands].set(CooperativeMatrixOperandsCeiling, CooperativeMatrixOperandsString, CooperativeMatrixOperandsParams, true);\n        OperandClassParams[OperandTensorAddressingOperands].set(TensorAddressingOperandsCeiling, TensorAddressingOperandsString, TensorAddressingOperandsParams, true);\n        OperandClassParams[OperandOpcode].set(OpCodeMask + 1, OpcodeString, nullptr);\n\n        // set name of operator, an initial set of <id> style operands, and the description\n\n        InstructionDesc[enumCast(Op::OpSource)].operands.push(OperandSource, \"\");\n        InstructionDesc[enumCast(Op::OpSource)].operands.push(OperandLiteralNumber, \"'Version'\");\n        InstructionDesc[enumCast(Op::OpSource)].operands.push(OperandId, \"'File'\", true);\n        InstructionDesc[enumCast(Op::OpSource)].operands.push(OperandLiteralString, \"'Source'\", true);\n\n        InstructionDesc[enumCast(Op::OpSourceContinued)].operands.push(OperandLiteralString, \"'Continued Source'\");\n\n        InstructionDesc[enumCast(Op::OpSourceExtension)].operands.push(OperandLiteralString, \"'Extension'\");\n\n        InstructionDesc[enumCast(Op::OpName)].operands.push(OperandId, \"'Target'\");\n        InstructionDesc[enumCast(Op::OpName)].operands.push(OperandLiteralString, \"'Name'\");\n\n        InstructionDesc[enumCast(Op::OpMemberName)].operands.push(OperandId, \"'Type'\");\n        InstructionDesc[enumCast(Op::OpMemberName)].operands.push(OperandLiteralNumber, \"'Member'\");\n        InstructionDesc[enumCast(Op::OpMemberName)].operands.push(OperandLiteralString, \"'Name'\");\n\n        InstructionDesc[enumCast(Op::OpString)].operands.push(OperandLiteralString, \"'String'\");\n\n        InstructionDesc[enumCast(Op::OpLine)].operands.push(OperandId, \"'File'\");\n        InstructionDesc[enumCast(Op::OpLine)].operands.push(OperandLiteralNumber, \"'Line'\");\n        InstructionDesc[enumCast(Op::OpLine)].operands.push(OperandLiteralNumber, \"'Column'\");\n\n        InstructionDesc[enumCast(Op::OpExtension)].operands.push(OperandLiteralString, \"'Name'\");\n\n        InstructionDesc[enumCast(Op::OpExtInstImport)].operands.push(OperandLiteralString, \"'Name'\");\n\n        InstructionDesc[enumCast(Op::OpCapability)].operands.push(OperandCapability, \"'Capability'\");\n\n        InstructionDesc[enumCast(Op::OpMemoryModel)].operands.push(OperandAddressing, \"\");\n        InstructionDesc[enumCast(Op::OpMemoryModel)].operands.push(OperandMemory, \"\");\n\n        InstructionDesc[enumCast(Op::OpEntryPoint)].operands.push(OperandExecutionModel, \"\");\n        InstructionDesc[enumCast(Op::OpEntryPoint)].operands.push(OperandId, \"'Entry Point'\");\n        InstructionDesc[enumCast(Op::OpEntryPoint)].operands.push(OperandLiteralString, \"'Name'\");\n        InstructionDesc[enumCast(Op::OpEntryPoint)].operands.push(OperandVariableIds, \"'Interface'\");\n\n        InstructionDesc[enumCast(Op::OpExecutionMode)].operands.push(OperandId, \"'Entry Point'\");\n        InstructionDesc[enumCast(Op::OpExecutionMode)].operands.push(OperandExecutionMode, \"'Mode'\");\n        InstructionDesc[enumCast(Op::OpExecutionMode)].operands.push(OperandOptionalLiteral, \"See <<Execution_Mode,Execution Mode>>\");\n\n        InstructionDesc[enumCast(Op::OpExecutionModeId)].operands.push(OperandId, \"'Entry Point'\");\n        InstructionDesc[enumCast(Op::OpExecutionModeId)].operands.push(OperandExecutionMode, \"'Mode'\");\n        InstructionDesc[enumCast(Op::OpExecutionModeId)].operands.push(OperandVariableIds, \"See <<Execution_Mode,Execution Mode>>\");\n\n        InstructionDesc[enumCast(Op::OpTypeInt)].operands.push(OperandLiteralNumber, \"'Width'\");\n        InstructionDesc[enumCast(Op::OpTypeInt)].operands.push(OperandLiteralNumber, \"'Signedness'\");\n\n        InstructionDesc[enumCast(Op::OpTypeFloat)].operands.push(OperandLiteralNumber, \"'Width'\");\n        InstructionDesc[enumCast(Op::OpTypeFloat)].operands.push(OperandOptionalLiteral, \"'FP Encoding'\");\n\n        InstructionDesc[enumCast(Op::OpTypeVector)].operands.push(OperandId, \"'Component Type'\");\n        InstructionDesc[enumCast(Op::OpTypeVector)].operands.push(OperandLiteralNumber, \"'Component Count'\");\n\n        InstructionDesc[enumCast(Op::OpTypeMatrix)].operands.push(OperandId, \"'Column Type'\");\n        InstructionDesc[enumCast(Op::OpTypeMatrix)].operands.push(OperandLiteralNumber, \"'Column Count'\");\n\n        InstructionDesc[enumCast(Op::OpTypeImage)].operands.push(OperandId, \"'Sampled Type'\");\n        InstructionDesc[enumCast(Op::OpTypeImage)].operands.push(OperandDimensionality, \"\");\n        InstructionDesc[enumCast(Op::OpTypeImage)].operands.push(OperandLiteralNumber, \"'Depth'\");\n        InstructionDesc[enumCast(Op::OpTypeImage)].operands.push(OperandLiteralNumber, \"'Arrayed'\");\n        InstructionDesc[enumCast(Op::OpTypeImage)].operands.push(OperandLiteralNumber, \"'MS'\");\n        InstructionDesc[enumCast(Op::OpTypeImage)].operands.push(OperandLiteralNumber, \"'Sampled'\");\n        InstructionDesc[enumCast(Op::OpTypeImage)].operands.push(OperandSamplerImageFormat, \"\");\n        InstructionDesc[enumCast(Op::OpTypeImage)].operands.push(OperandAccessQualifier, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpTypeSampledImage)].operands.push(OperandId, \"'Image Type'\");\n\n        InstructionDesc[enumCast(Op::OpTypeArray)].operands.push(OperandId, \"'Element Type'\");\n        InstructionDesc[enumCast(Op::OpTypeArray)].operands.push(OperandId, \"'Length'\");\n\n        InstructionDesc[enumCast(Op::OpTypeRuntimeArray)].operands.push(OperandId, \"'Element Type'\");\n\n        InstructionDesc[enumCast(Op::OpTypeStruct)].operands.push(OperandVariableIds, \"'Member 0 type', +\\n'member 1 type', +\\n...\");\n\n        InstructionDesc[enumCast(Op::OpTypeOpaque)].operands.push(OperandLiteralString, \"The name of the opaque type.\");\n\n        InstructionDesc[enumCast(Op::OpTypePointer)].operands.push(OperandStorage, \"\");\n        InstructionDesc[enumCast(Op::OpTypePointer)].operands.push(OperandId, \"'Type'\");\n\n        InstructionDesc[enumCast(Op::OpTypeForwardPointer)].operands.push(OperandId, \"'Pointer Type'\");\n        InstructionDesc[enumCast(Op::OpTypeForwardPointer)].operands.push(OperandStorage, \"\");\n\n        InstructionDesc[enumCast(Op::OpTypePipe)].operands.push(OperandAccessQualifier, \"'Qualifier'\");\n\n        InstructionDesc[enumCast(Op::OpTypeFunction)].operands.push(OperandId, \"'Return Type'\");\n        InstructionDesc[enumCast(Op::OpTypeFunction)].operands.push(OperandVariableIds, \"'Parameter 0 Type', +\\n'Parameter 1 Type', +\\n...\");\n\n        InstructionDesc[enumCast(Op::OpConstant)].operands.push(OperandVariableLiterals, \"'Value'\");\n\n        InstructionDesc[enumCast(Op::OpConstantComposite)].operands.push(OperandVariableIds, \"'Constituents'\");\n\n        InstructionDesc[enumCast(Op::OpConstantSampler)].operands.push(OperandSamplerAddressingMode, \"\");\n        InstructionDesc[enumCast(Op::OpConstantSampler)].operands.push(OperandLiteralNumber, \"'Param'\");\n        InstructionDesc[enumCast(Op::OpConstantSampler)].operands.push(OperandSamplerFilterMode, \"\");\n\n        InstructionDesc[enumCast(Op::OpSpecConstant)].operands.push(OperandVariableLiterals, \"'Value'\");\n\n        InstructionDesc[enumCast(Op::OpSpecConstantComposite)].operands.push(OperandVariableIds, \"'Constituents'\");\n\n        InstructionDesc[enumCast(Op::OpSpecConstantOp)].operands.push(OperandLiteralNumber, \"'Opcode'\");\n        InstructionDesc[enumCast(Op::OpSpecConstantOp)].operands.push(OperandVariableIds, \"'Operands'\");\n\n        InstructionDesc[enumCast(Op::OpVariable)].operands.push(OperandStorage, \"\");\n        InstructionDesc[enumCast(Op::OpVariable)].operands.push(OperandId, \"'Initializer'\", true);\n\n        InstructionDesc[enumCast(Op::OpFunction)].operands.push(OperandFunction, \"\");\n        InstructionDesc[enumCast(Op::OpFunction)].operands.push(OperandId, \"'Function Type'\");\n\n        InstructionDesc[enumCast(Op::OpFunctionCall)].operands.push(OperandId, \"'Function'\");\n        InstructionDesc[enumCast(Op::OpFunctionCall)].operands.push(OperandVariableIds, \"'Argument 0', +\\n'Argument 1', +\\n...\");\n\n        InstructionDesc[enumCast(Op::OpExtInst)].operands.push(OperandId, \"'Set'\");\n        InstructionDesc[enumCast(Op::OpExtInst)].operands.push(OperandLiteralNumber, \"'Instruction'\");\n        InstructionDesc[enumCast(Op::OpExtInst)].operands.push(OperandVariableIds, \"'Operand 1', +\\n'Operand 2', +\\n...\");\n\n        InstructionDesc[enumCast(Op::OpExtInstWithForwardRefsKHR)].operands.push(OperandId, \"'Set'\");\n        InstructionDesc[enumCast(Op::OpExtInstWithForwardRefsKHR)].operands.push(OperandLiteralNumber, \"'Instruction'\");\n        InstructionDesc[enumCast(Op::OpExtInstWithForwardRefsKHR)].operands.push(OperandVariableIds, \"'Operand 1', +\\n'Operand 2', +\\n...\");\n\n        InstructionDesc[enumCast(Op::OpLoad)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpLoad)].operands.push(OperandMemoryAccess, \"\", true);\n        InstructionDesc[enumCast(Op::OpLoad)].operands.push(OperandLiteralNumber, \"\", true);\n        InstructionDesc[enumCast(Op::OpLoad)].operands.push(OperandId, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpStore)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpStore)].operands.push(OperandId, \"'Object'\");\n        InstructionDesc[enumCast(Op::OpStore)].operands.push(OperandMemoryAccess, \"\", true);\n        InstructionDesc[enumCast(Op::OpStore)].operands.push(OperandLiteralNumber, \"\", true);\n        InstructionDesc[enumCast(Op::OpStore)].operands.push(OperandId, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpPhi)].operands.push(OperandVariableIds, \"'Variable, Parent, ...'\");\n\n        InstructionDesc[enumCast(Op::OpDecorate)].operands.push(OperandId, \"'Target'\");\n        InstructionDesc[enumCast(Op::OpDecorate)].operands.push(OperandDecoration, \"\");\n        InstructionDesc[enumCast(Op::OpDecorate)].operands.push(OperandVariableLiterals, \"See <<Decoration,'Decoration'>>.\");\n\n        InstructionDesc[enumCast(Op::OpDecorateId)].operands.push(OperandId, \"'Target'\");\n        InstructionDesc[enumCast(Op::OpDecorateId)].operands.push(OperandDecoration, \"\");\n        InstructionDesc[enumCast(Op::OpDecorateId)].operands.push(OperandVariableIds, \"See <<Decoration,'Decoration'>>.\");\n\n        InstructionDesc[enumCast(Op::OpDecorateStringGOOGLE)].operands.push(OperandId, \"'Target'\");\n        InstructionDesc[enumCast(Op::OpDecorateStringGOOGLE)].operands.push(OperandDecoration, \"\");\n        InstructionDesc[enumCast(Op::OpDecorateStringGOOGLE)].operands.push(OperandVariableLiteralStrings, \"'Literal Strings'\");\n\n        InstructionDesc[enumCast(Op::OpMemberDecorate)].operands.push(OperandId, \"'Structure Type'\");\n        InstructionDesc[enumCast(Op::OpMemberDecorate)].operands.push(OperandLiteralNumber, \"'Member'\");\n        InstructionDesc[enumCast(Op::OpMemberDecorate)].operands.push(OperandDecoration, \"\");\n        InstructionDesc[enumCast(Op::OpMemberDecorate)].operands.push(OperandVariableLiterals, \"See <<Decoration,'Decoration'>>.\");\n\n        InstructionDesc[enumCast(Op::OpMemberDecorateStringGOOGLE)].operands.push(OperandId, \"'Structure Type'\");\n        InstructionDesc[enumCast(Op::OpMemberDecorateStringGOOGLE)].operands.push(OperandLiteralNumber, \"'Member'\");\n        InstructionDesc[enumCast(Op::OpMemberDecorateStringGOOGLE)].operands.push(OperandDecoration, \"\");\n        InstructionDesc[enumCast(Op::OpMemberDecorateStringGOOGLE)].operands.push(OperandVariableLiteralStrings, \"'Literal Strings'\");\n\n        InstructionDesc[enumCast(Op::OpGroupDecorate)].operands.push(OperandId, \"'Decoration Group'\");\n        InstructionDesc[enumCast(Op::OpGroupDecorate)].operands.push(OperandVariableIds, \"'Targets'\");\n\n        InstructionDesc[enumCast(Op::OpGroupMemberDecorate)].operands.push(OperandId, \"'Decoration Group'\");\n        InstructionDesc[enumCast(Op::OpGroupMemberDecorate)].operands.push(OperandVariableIdLiteral, \"'Targets'\");\n\n        InstructionDesc[enumCast(Op::OpVectorExtractDynamic)].operands.push(OperandId, \"'Vector'\");\n        InstructionDesc[enumCast(Op::OpVectorExtractDynamic)].operands.push(OperandId, \"'Index'\");\n\n        InstructionDesc[enumCast(Op::OpVectorInsertDynamic)].operands.push(OperandId, \"'Vector'\");\n        InstructionDesc[enumCast(Op::OpVectorInsertDynamic)].operands.push(OperandId, \"'Component'\");\n        InstructionDesc[enumCast(Op::OpVectorInsertDynamic)].operands.push(OperandId, \"'Index'\");\n\n        InstructionDesc[enumCast(Op::OpVectorShuffle)].operands.push(OperandId, \"'Vector 1'\");\n        InstructionDesc[enumCast(Op::OpVectorShuffle)].operands.push(OperandId, \"'Vector 2'\");\n        InstructionDesc[enumCast(Op::OpVectorShuffle)].operands.push(OperandVariableLiterals, \"'Components'\");\n\n        InstructionDesc[enumCast(Op::OpCompositeConstruct)].operands.push(OperandVariableIds, \"'Constituents'\");\n\n        InstructionDesc[enumCast(Op::OpCompositeExtract)].operands.push(OperandId, \"'Composite'\");\n        InstructionDesc[enumCast(Op::OpCompositeExtract)].operands.push(OperandVariableLiterals, \"'Indexes'\");\n\n        InstructionDesc[enumCast(Op::OpCompositeInsert)].operands.push(OperandId, \"'Object'\");\n        InstructionDesc[enumCast(Op::OpCompositeInsert)].operands.push(OperandId, \"'Composite'\");\n        InstructionDesc[enumCast(Op::OpCompositeInsert)].operands.push(OperandVariableLiterals, \"'Indexes'\");\n\n        InstructionDesc[enumCast(Op::OpCopyObject)].operands.push(OperandId, \"'Operand'\");\n\n        InstructionDesc[enumCast(Op::OpCopyMemory)].operands.push(OperandId, \"'Target'\");\n        InstructionDesc[enumCast(Op::OpCopyMemory)].operands.push(OperandId, \"'Source'\");\n        InstructionDesc[enumCast(Op::OpCopyMemory)].operands.push(OperandMemoryAccess, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpCopyMemorySized)].operands.push(OperandId, \"'Target'\");\n        InstructionDesc[enumCast(Op::OpCopyMemorySized)].operands.push(OperandId, \"'Source'\");\n        InstructionDesc[enumCast(Op::OpCopyMemorySized)].operands.push(OperandId, \"'Size'\");\n        InstructionDesc[enumCast(Op::OpCopyMemorySized)].operands.push(OperandMemoryAccess, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpSampledImage)].operands.push(OperandId, \"'Image'\");\n        InstructionDesc[enumCast(Op::OpSampledImage)].operands.push(OperandId, \"'Sampler'\");\n\n        InstructionDesc[enumCast(Op::OpImage)].operands.push(OperandId, \"'Sampled Image'\");\n\n        InstructionDesc[enumCast(Op::OpImageRead)].operands.push(OperandId, \"'Image'\");\n        InstructionDesc[enumCast(Op::OpImageRead)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageRead)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageRead)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageWrite)].operands.push(OperandId, \"'Image'\");\n        InstructionDesc[enumCast(Op::OpImageWrite)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageWrite)].operands.push(OperandId, \"'Texel'\");\n        InstructionDesc[enumCast(Op::OpImageWrite)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageWrite)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageSampleImplicitLod)].operands.push(OperandId, \"'Sampled Image'\");\n        InstructionDesc[enumCast(Op::OpImageSampleImplicitLod)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageSampleImplicitLod)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageSampleImplicitLod)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageSampleExplicitLod)].operands.push(OperandId, \"'Sampled Image'\");\n        InstructionDesc[enumCast(Op::OpImageSampleExplicitLod)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageSampleExplicitLod)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageSampleExplicitLod)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageSampleDrefImplicitLod)].operands.push(OperandId, \"'Sampled Image'\");\n        InstructionDesc[enumCast(Op::OpImageSampleDrefImplicitLod)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageSampleDrefImplicitLod)].operands.push(OperandId, \"'D~ref~'\");\n        InstructionDesc[enumCast(Op::OpImageSampleDrefImplicitLod)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageSampleDrefImplicitLod)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageSampleDrefExplicitLod)].operands.push(OperandId, \"'Sampled Image'\");\n        InstructionDesc[enumCast(Op::OpImageSampleDrefExplicitLod)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageSampleDrefExplicitLod)].operands.push(OperandId, \"'D~ref~'\");\n        InstructionDesc[enumCast(Op::OpImageSampleDrefExplicitLod)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageSampleDrefExplicitLod)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageSampleProjImplicitLod)].operands.push(OperandId, \"'Sampled Image'\");\n        InstructionDesc[enumCast(Op::OpImageSampleProjImplicitLod)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageSampleProjImplicitLod)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageSampleProjImplicitLod)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageSampleProjExplicitLod)].operands.push(OperandId, \"'Sampled Image'\");\n        InstructionDesc[enumCast(Op::OpImageSampleProjExplicitLod)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageSampleProjExplicitLod)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageSampleProjExplicitLod)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageSampleProjDrefImplicitLod)].operands.push(OperandId, \"'Sampled Image'\");\n        InstructionDesc[enumCast(Op::OpImageSampleProjDrefImplicitLod)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageSampleProjDrefImplicitLod)].operands.push(OperandId, \"'D~ref~'\");\n        InstructionDesc[enumCast(Op::OpImageSampleProjDrefImplicitLod)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageSampleProjDrefImplicitLod)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageSampleProjDrefExplicitLod)].operands.push(OperandId, \"'Sampled Image'\");\n        InstructionDesc[enumCast(Op::OpImageSampleProjDrefExplicitLod)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageSampleProjDrefExplicitLod)].operands.push(OperandId, \"'D~ref~'\");\n        InstructionDesc[enumCast(Op::OpImageSampleProjDrefExplicitLod)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageSampleProjDrefExplicitLod)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageFetch)].operands.push(OperandId, \"'Image'\");\n        InstructionDesc[enumCast(Op::OpImageFetch)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageFetch)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageFetch)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageGather)].operands.push(OperandId, \"'Sampled Image'\");\n        InstructionDesc[enumCast(Op::OpImageGather)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageGather)].operands.push(OperandId, \"'Component'\");\n        InstructionDesc[enumCast(Op::OpImageGather)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageGather)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageDrefGather)].operands.push(OperandId, \"'Sampled Image'\");\n        InstructionDesc[enumCast(Op::OpImageDrefGather)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageDrefGather)].operands.push(OperandId, \"'D~ref~'\");\n        InstructionDesc[enumCast(Op::OpImageDrefGather)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageDrefGather)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageSparseSampleImplicitLod)].operands.push(OperandId, \"'Sampled Image'\");\n        InstructionDesc[enumCast(Op::OpImageSparseSampleImplicitLod)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageSparseSampleImplicitLod)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageSparseSampleImplicitLod)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageSparseSampleExplicitLod)].operands.push(OperandId, \"'Sampled Image'\");\n        InstructionDesc[enumCast(Op::OpImageSparseSampleExplicitLod)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageSparseSampleExplicitLod)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageSparseSampleExplicitLod)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageSparseSampleDrefImplicitLod)].operands.push(OperandId, \"'Sampled Image'\");\n        InstructionDesc[enumCast(Op::OpImageSparseSampleDrefImplicitLod)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageSparseSampleDrefImplicitLod)].operands.push(OperandId, \"'D~ref~'\");\n        InstructionDesc[enumCast(Op::OpImageSparseSampleDrefImplicitLod)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageSparseSampleDrefImplicitLod)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageSparseSampleDrefExplicitLod)].operands.push(OperandId, \"'Sampled Image'\");\n        InstructionDesc[enumCast(Op::OpImageSparseSampleDrefExplicitLod)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageSparseSampleDrefExplicitLod)].operands.push(OperandId, \"'D~ref~'\");\n        InstructionDesc[enumCast(Op::OpImageSparseSampleDrefExplicitLod)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageSparseSampleDrefExplicitLod)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageSparseSampleProjImplicitLod)].operands.push(OperandId, \"'Sampled Image'\");\n        InstructionDesc[enumCast(Op::OpImageSparseSampleProjImplicitLod)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageSparseSampleProjImplicitLod)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageSparseSampleProjImplicitLod)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageSparseSampleProjExplicitLod)].operands.push(OperandId, \"'Sampled Image'\");\n        InstructionDesc[enumCast(Op::OpImageSparseSampleProjExplicitLod)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageSparseSampleProjExplicitLod)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageSparseSampleProjExplicitLod)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageSparseSampleProjDrefImplicitLod)].operands.push(OperandId, \"'Sampled Image'\");\n        InstructionDesc[enumCast(Op::OpImageSparseSampleProjDrefImplicitLod)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageSparseSampleProjDrefImplicitLod)].operands.push(OperandId, \"'D~ref~'\");\n        InstructionDesc[enumCast(Op::OpImageSparseSampleProjDrefImplicitLod)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageSparseSampleProjDrefImplicitLod)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageSparseSampleProjDrefExplicitLod)].operands.push(OperandId, \"'Sampled Image'\");\n        InstructionDesc[enumCast(Op::OpImageSparseSampleProjDrefExplicitLod)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageSparseSampleProjDrefExplicitLod)].operands.push(OperandId, \"'D~ref~'\");\n        InstructionDesc[enumCast(Op::OpImageSparseSampleProjDrefExplicitLod)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageSparseSampleProjDrefExplicitLod)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageSparseFetch)].operands.push(OperandId, \"'Image'\");\n        InstructionDesc[enumCast(Op::OpImageSparseFetch)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageSparseFetch)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageSparseFetch)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageSparseGather)].operands.push(OperandId, \"'Sampled Image'\");\n        InstructionDesc[enumCast(Op::OpImageSparseGather)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageSparseGather)].operands.push(OperandId, \"'Component'\");\n        InstructionDesc[enumCast(Op::OpImageSparseGather)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageSparseGather)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageSparseDrefGather)].operands.push(OperandId, \"'Sampled Image'\");\n        InstructionDesc[enumCast(Op::OpImageSparseDrefGather)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageSparseDrefGather)].operands.push(OperandId, \"'D~ref~'\");\n        InstructionDesc[enumCast(Op::OpImageSparseDrefGather)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageSparseDrefGather)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageSparseRead)].operands.push(OperandId, \"'Image'\");\n        InstructionDesc[enumCast(Op::OpImageSparseRead)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageSparseRead)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageSparseRead)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpImageSparseTexelsResident)].operands.push(OperandId, \"'Resident Code'\");\n\n        InstructionDesc[enumCast(Op::OpImageQuerySizeLod)].operands.push(OperandId, \"'Image'\");\n        InstructionDesc[enumCast(Op::OpImageQuerySizeLod)].operands.push(OperandId, \"'Level of Detail'\");\n\n        InstructionDesc[enumCast(Op::OpImageQuerySize)].operands.push(OperandId, \"'Image'\");\n\n        InstructionDesc[enumCast(Op::OpImageQueryLod)].operands.push(OperandId, \"'Image'\");\n        InstructionDesc[enumCast(Op::OpImageQueryLod)].operands.push(OperandId, \"'Coordinate'\");\n\n        InstructionDesc[enumCast(Op::OpImageQueryLevels)].operands.push(OperandId, \"'Image'\");\n\n        InstructionDesc[enumCast(Op::OpImageQuerySamples)].operands.push(OperandId, \"'Image'\");\n\n        InstructionDesc[enumCast(Op::OpImageQueryFormat)].operands.push(OperandId, \"'Image'\");\n\n        InstructionDesc[enumCast(Op::OpImageQueryOrder)].operands.push(OperandId, \"'Image'\");\n\n        InstructionDesc[enumCast(Op::OpAccessChain)].operands.push(OperandId, \"'Base'\");\n        InstructionDesc[enumCast(Op::OpAccessChain)].operands.push(OperandVariableIds, \"'Indexes'\");\n\n        InstructionDesc[enumCast(Op::OpInBoundsAccessChain)].operands.push(OperandId, \"'Base'\");\n        InstructionDesc[enumCast(Op::OpInBoundsAccessChain)].operands.push(OperandVariableIds, \"'Indexes'\");\n\n        InstructionDesc[enumCast(Op::OpPtrAccessChain)].operands.push(OperandId, \"'Base'\");\n        InstructionDesc[enumCast(Op::OpPtrAccessChain)].operands.push(OperandId, \"'Element'\");\n        InstructionDesc[enumCast(Op::OpPtrAccessChain)].operands.push(OperandVariableIds, \"'Indexes'\");\n\n        InstructionDesc[enumCast(Op::OpInBoundsPtrAccessChain)].operands.push(OperandId, \"'Base'\");\n        InstructionDesc[enumCast(Op::OpInBoundsPtrAccessChain)].operands.push(OperandId, \"'Element'\");\n        InstructionDesc[enumCast(Op::OpInBoundsPtrAccessChain)].operands.push(OperandVariableIds, \"'Indexes'\");\n\n        InstructionDesc[enumCast(Op::OpSNegate)].operands.push(OperandId, \"'Operand'\");\n\n        InstructionDesc[enumCast(Op::OpFNegate)].operands.push(OperandId, \"'Operand'\");\n\n        InstructionDesc[enumCast(Op::OpNot)].operands.push(OperandId, \"'Operand'\");\n\n        InstructionDesc[enumCast(Op::OpAny)].operands.push(OperandId, \"'Vector'\");\n\n        InstructionDesc[enumCast(Op::OpAll)].operands.push(OperandId, \"'Vector'\");\n\n        InstructionDesc[enumCast(Op::OpConvertFToU)].operands.push(OperandId, \"'Float Value'\");\n\n        InstructionDesc[enumCast(Op::OpConvertFToS)].operands.push(OperandId, \"'Float Value'\");\n\n        InstructionDesc[enumCast(Op::OpConvertSToF)].operands.push(OperandId, \"'Signed Value'\");\n\n        InstructionDesc[enumCast(Op::OpConvertUToF)].operands.push(OperandId, \"'Unsigned Value'\");\n\n        InstructionDesc[enumCast(Op::OpUConvert)].operands.push(OperandId, \"'Unsigned Value'\");\n\n        InstructionDesc[enumCast(Op::OpSConvert)].operands.push(OperandId, \"'Signed Value'\");\n\n        InstructionDesc[enumCast(Op::OpFConvert)].operands.push(OperandId, \"'Float Value'\");\n\n        InstructionDesc[enumCast(Op::OpSatConvertSToU)].operands.push(OperandId, \"'Signed Value'\");\n\n        InstructionDesc[enumCast(Op::OpSatConvertUToS)].operands.push(OperandId, \"'Unsigned Value'\");\n\n        InstructionDesc[enumCast(Op::OpConvertPtrToU)].operands.push(OperandId, \"'Pointer'\");\n\n        InstructionDesc[enumCast(Op::OpConvertUToPtr)].operands.push(OperandId, \"'Integer Value'\");\n\n        InstructionDesc[enumCast(Op::OpPtrCastToGeneric)].operands.push(OperandId, \"'Pointer'\");\n\n        InstructionDesc[enumCast(Op::OpGenericCastToPtr)].operands.push(OperandId, \"'Pointer'\");\n\n        InstructionDesc[enumCast(Op::OpGenericCastToPtrExplicit)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpGenericCastToPtrExplicit)].operands.push(OperandStorage, \"'Storage'\");\n\n        InstructionDesc[enumCast(Op::OpGenericPtrMemSemantics)].operands.push(OperandId, \"'Pointer'\");\n\n        InstructionDesc[enumCast(Op::OpBitcast)].operands.push(OperandId, \"'Operand'\");\n\n        InstructionDesc[enumCast(Op::OpQuantizeToF16)].operands.push(OperandId, \"'Value'\");\n\n        InstructionDesc[enumCast(Op::OpTranspose)].operands.push(OperandId, \"'Matrix'\");\n\n        InstructionDesc[enumCast(Op::OpCopyLogical)].operands.push(OperandId, \"'Operand'\");\n\n        InstructionDesc[enumCast(Op::OpIsNan)].operands.push(OperandId, \"'x'\");\n\n        InstructionDesc[enumCast(Op::OpIsInf)].operands.push(OperandId, \"'x'\");\n\n        InstructionDesc[enumCast(Op::OpIsFinite)].operands.push(OperandId, \"'x'\");\n\n        InstructionDesc[enumCast(Op::OpIsNormal)].operands.push(OperandId, \"'x'\");\n\n        InstructionDesc[enumCast(Op::OpSignBitSet)].operands.push(OperandId, \"'x'\");\n\n        InstructionDesc[enumCast(Op::OpLessOrGreater)].operands.push(OperandId, \"'x'\");\n        InstructionDesc[enumCast(Op::OpLessOrGreater)].operands.push(OperandId, \"'y'\");\n\n        InstructionDesc[enumCast(Op::OpOrdered)].operands.push(OperandId, \"'x'\");\n        InstructionDesc[enumCast(Op::OpOrdered)].operands.push(OperandId, \"'y'\");\n\n        InstructionDesc[enumCast(Op::OpUnordered)].operands.push(OperandId, \"'x'\");\n        InstructionDesc[enumCast(Op::OpUnordered)].operands.push(OperandId, \"'y'\");\n\n        InstructionDesc[enumCast(Op::OpArrayLength)].operands.push(OperandId, \"'Structure'\");\n        InstructionDesc[enumCast(Op::OpArrayLength)].operands.push(OperandLiteralNumber, \"'Array member'\");\n\n        InstructionDesc[enumCast(Op::OpIAdd)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpIAdd)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpFAdd)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpFAdd)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpISub)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpISub)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpFSub)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpFSub)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpIMul)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpIMul)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpFMul)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpFMul)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpUDiv)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpUDiv)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpSDiv)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpSDiv)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpFDiv)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpFDiv)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpUMod)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpUMod)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpSRem)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpSRem)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpSMod)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpSMod)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpFRem)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpFRem)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpFMod)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpFMod)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpVectorTimesScalar)].operands.push(OperandId, \"'Vector'\");\n        InstructionDesc[enumCast(Op::OpVectorTimesScalar)].operands.push(OperandId, \"'Scalar'\");\n\n        InstructionDesc[enumCast(Op::OpMatrixTimesScalar)].operands.push(OperandId, \"'Matrix'\");\n        InstructionDesc[enumCast(Op::OpMatrixTimesScalar)].operands.push(OperandId, \"'Scalar'\");\n\n        InstructionDesc[enumCast(Op::OpVectorTimesMatrix)].operands.push(OperandId, \"'Vector'\");\n        InstructionDesc[enumCast(Op::OpVectorTimesMatrix)].operands.push(OperandId, \"'Matrix'\");\n\n        InstructionDesc[enumCast(Op::OpMatrixTimesVector)].operands.push(OperandId, \"'Matrix'\");\n        InstructionDesc[enumCast(Op::OpMatrixTimesVector)].operands.push(OperandId, \"'Vector'\");\n\n        InstructionDesc[enumCast(Op::OpMatrixTimesMatrix)].operands.push(OperandId, \"'LeftMatrix'\");\n        InstructionDesc[enumCast(Op::OpMatrixTimesMatrix)].operands.push(OperandId, \"'RightMatrix'\");\n\n        InstructionDesc[enumCast(Op::OpOuterProduct)].operands.push(OperandId, \"'Vector 1'\");\n        InstructionDesc[enumCast(Op::OpOuterProduct)].operands.push(OperandId, \"'Vector 2'\");\n\n        InstructionDesc[enumCast(Op::OpDot)].operands.push(OperandId, \"'Vector 1'\");\n        InstructionDesc[enumCast(Op::OpDot)].operands.push(OperandId, \"'Vector 2'\");\n\n        InstructionDesc[enumCast(Op::OpIAddCarry)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpIAddCarry)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpISubBorrow)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpISubBorrow)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpUMulExtended)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpUMulExtended)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpSMulExtended)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpSMulExtended)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpShiftRightLogical)].operands.push(OperandId, \"'Base'\");\n        InstructionDesc[enumCast(Op::OpShiftRightLogical)].operands.push(OperandId, \"'Shift'\");\n\n        InstructionDesc[enumCast(Op::OpShiftRightArithmetic)].operands.push(OperandId, \"'Base'\");\n        InstructionDesc[enumCast(Op::OpShiftRightArithmetic)].operands.push(OperandId, \"'Shift'\");\n\n        InstructionDesc[enumCast(Op::OpShiftLeftLogical)].operands.push(OperandId, \"'Base'\");\n        InstructionDesc[enumCast(Op::OpShiftLeftLogical)].operands.push(OperandId, \"'Shift'\");\n\n        InstructionDesc[enumCast(Op::OpLogicalOr)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpLogicalOr)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpLogicalAnd)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpLogicalAnd)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpLogicalEqual)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpLogicalEqual)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpLogicalNotEqual)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpLogicalNotEqual)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpLogicalNot)].operands.push(OperandId, \"'Operand'\");\n\n        InstructionDesc[enumCast(Op::OpBitwiseOr)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpBitwiseOr)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpBitwiseXor)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpBitwiseXor)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpBitwiseAnd)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpBitwiseAnd)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpBitFieldInsert)].operands.push(OperandId, \"'Base'\");\n        InstructionDesc[enumCast(Op::OpBitFieldInsert)].operands.push(OperandId, \"'Insert'\");\n        InstructionDesc[enumCast(Op::OpBitFieldInsert)].operands.push(OperandId, \"'Offset'\");\n        InstructionDesc[enumCast(Op::OpBitFieldInsert)].operands.push(OperandId, \"'Count'\");\n\n        InstructionDesc[enumCast(Op::OpBitFieldSExtract)].operands.push(OperandId, \"'Base'\");\n        InstructionDesc[enumCast(Op::OpBitFieldSExtract)].operands.push(OperandId, \"'Offset'\");\n        InstructionDesc[enumCast(Op::OpBitFieldSExtract)].operands.push(OperandId, \"'Count'\");\n\n        InstructionDesc[enumCast(Op::OpBitFieldUExtract)].operands.push(OperandId, \"'Base'\");\n        InstructionDesc[enumCast(Op::OpBitFieldUExtract)].operands.push(OperandId, \"'Offset'\");\n        InstructionDesc[enumCast(Op::OpBitFieldUExtract)].operands.push(OperandId, \"'Count'\");\n\n        InstructionDesc[enumCast(Op::OpBitReverse)].operands.push(OperandId, \"'Base'\");\n\n        InstructionDesc[enumCast(Op::OpBitCount)].operands.push(OperandId, \"'Base'\");\n\n        InstructionDesc[enumCast(Op::OpSelect)].operands.push(OperandId, \"'Condition'\");\n        InstructionDesc[enumCast(Op::OpSelect)].operands.push(OperandId, \"'Object 1'\");\n        InstructionDesc[enumCast(Op::OpSelect)].operands.push(OperandId, \"'Object 2'\");\n\n        InstructionDesc[enumCast(Op::OpIEqual)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpIEqual)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpFOrdEqual)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpFOrdEqual)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpFUnordEqual)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpFUnordEqual)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpINotEqual)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpINotEqual)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpFOrdNotEqual)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpFOrdNotEqual)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpFUnordNotEqual)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpFUnordNotEqual)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpULessThan)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpULessThan)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpSLessThan)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpSLessThan)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpFOrdLessThan)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpFOrdLessThan)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpFUnordLessThan)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpFUnordLessThan)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpUGreaterThan)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpUGreaterThan)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpSGreaterThan)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpSGreaterThan)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpFOrdGreaterThan)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpFOrdGreaterThan)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpFUnordGreaterThan)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpFUnordGreaterThan)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpULessThanEqual)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpULessThanEqual)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpSLessThanEqual)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpSLessThanEqual)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpFOrdLessThanEqual)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpFOrdLessThanEqual)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpFUnordLessThanEqual)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpFUnordLessThanEqual)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpUGreaterThanEqual)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpUGreaterThanEqual)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpSGreaterThanEqual)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpSGreaterThanEqual)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpFOrdGreaterThanEqual)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpFOrdGreaterThanEqual)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpFUnordGreaterThanEqual)].operands.push(OperandId, \"'Operand 1'\");\n        InstructionDesc[enumCast(Op::OpFUnordGreaterThanEqual)].operands.push(OperandId, \"'Operand 2'\");\n\n        InstructionDesc[enumCast(Op::OpDPdx)].operands.push(OperandId, \"'P'\");\n\n        InstructionDesc[enumCast(Op::OpDPdy)].operands.push(OperandId, \"'P'\");\n\n        InstructionDesc[enumCast(Op::OpFwidth)].operands.push(OperandId, \"'P'\");\n\n        InstructionDesc[enumCast(Op::OpDPdxFine)].operands.push(OperandId, \"'P'\");\n\n        InstructionDesc[enumCast(Op::OpDPdyFine)].operands.push(OperandId, \"'P'\");\n\n        InstructionDesc[enumCast(Op::OpFwidthFine)].operands.push(OperandId, \"'P'\");\n\n        InstructionDesc[enumCast(Op::OpDPdxCoarse)].operands.push(OperandId, \"'P'\");\n\n        InstructionDesc[enumCast(Op::OpDPdyCoarse)].operands.push(OperandId, \"'P'\");\n\n        InstructionDesc[enumCast(Op::OpFwidthCoarse)].operands.push(OperandId, \"'P'\");\n\n        InstructionDesc[enumCast(Op::OpEmitStreamVertex)].operands.push(OperandId, \"'Stream'\");\n\n        InstructionDesc[enumCast(Op::OpEndStreamPrimitive)].operands.push(OperandId, \"'Stream'\");\n\n        InstructionDesc[enumCast(Op::OpControlBarrier)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpControlBarrier)].operands.push(OperandScope, \"'Memory'\");\n        InstructionDesc[enumCast(Op::OpControlBarrier)].operands.push(OperandMemorySemantics, \"'Semantics'\");\n\n        InstructionDesc[enumCast(Op::OpMemoryBarrier)].operands.push(OperandScope, \"'Memory'\");\n        InstructionDesc[enumCast(Op::OpMemoryBarrier)].operands.push(OperandMemorySemantics, \"'Semantics'\");\n\n        InstructionDesc[enumCast(Op::OpImageTexelPointer)].operands.push(OperandId, \"'Image'\");\n        InstructionDesc[enumCast(Op::OpImageTexelPointer)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageTexelPointer)].operands.push(OperandId, \"'Sample'\");\n\n        InstructionDesc[enumCast(Op::OpAtomicLoad)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpAtomicLoad)].operands.push(OperandScope, \"'Scope'\");\n        InstructionDesc[enumCast(Op::OpAtomicLoad)].operands.push(OperandMemorySemantics, \"'Semantics'\");\n\n        InstructionDesc[enumCast(Op::OpAtomicStore)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpAtomicStore)].operands.push(OperandScope, \"'Scope'\");\n        InstructionDesc[enumCast(Op::OpAtomicStore)].operands.push(OperandMemorySemantics, \"'Semantics'\");\n        InstructionDesc[enumCast(Op::OpAtomicStore)].operands.push(OperandId, \"'Value'\");\n\n        InstructionDesc[enumCast(Op::OpAtomicExchange)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpAtomicExchange)].operands.push(OperandScope, \"'Scope'\");\n        InstructionDesc[enumCast(Op::OpAtomicExchange)].operands.push(OperandMemorySemantics, \"'Semantics'\");\n        InstructionDesc[enumCast(Op::OpAtomicExchange)].operands.push(OperandId, \"'Value'\");\n\n        InstructionDesc[enumCast(Op::OpAtomicCompareExchange)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpAtomicCompareExchange)].operands.push(OperandScope, \"'Scope'\");\n        InstructionDesc[enumCast(Op::OpAtomicCompareExchange)].operands.push(OperandMemorySemantics, \"'Equal'\");\n        InstructionDesc[enumCast(Op::OpAtomicCompareExchange)].operands.push(OperandMemorySemantics, \"'Unequal'\");\n        InstructionDesc[enumCast(Op::OpAtomicCompareExchange)].operands.push(OperandId, \"'Value'\");\n        InstructionDesc[enumCast(Op::OpAtomicCompareExchange)].operands.push(OperandId, \"'Comparator'\");\n\n        InstructionDesc[enumCast(Op::OpAtomicCompareExchangeWeak)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpAtomicCompareExchangeWeak)].operands.push(OperandScope, \"'Scope'\");\n        InstructionDesc[enumCast(Op::OpAtomicCompareExchangeWeak)].operands.push(OperandMemorySemantics, \"'Equal'\");\n        InstructionDesc[enumCast(Op::OpAtomicCompareExchangeWeak)].operands.push(OperandMemorySemantics, \"'Unequal'\");\n        InstructionDesc[enumCast(Op::OpAtomicCompareExchangeWeak)].operands.push(OperandId, \"'Value'\");\n        InstructionDesc[enumCast(Op::OpAtomicCompareExchangeWeak)].operands.push(OperandId, \"'Comparator'\");\n\n        InstructionDesc[enumCast(Op::OpAtomicIIncrement)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpAtomicIIncrement)].operands.push(OperandScope, \"'Scope'\");\n        InstructionDesc[enumCast(Op::OpAtomicIIncrement)].operands.push(OperandMemorySemantics, \"'Semantics'\");\n\n        InstructionDesc[enumCast(Op::OpAtomicIDecrement)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpAtomicIDecrement)].operands.push(OperandScope, \"'Scope'\");\n        InstructionDesc[enumCast(Op::OpAtomicIDecrement)].operands.push(OperandMemorySemantics, \"'Semantics'\");\n\n        InstructionDesc[enumCast(Op::OpAtomicIAdd)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpAtomicIAdd)].operands.push(OperandScope, \"'Scope'\");\n        InstructionDesc[enumCast(Op::OpAtomicIAdd)].operands.push(OperandMemorySemantics, \"'Semantics'\");\n        InstructionDesc[enumCast(Op::OpAtomicIAdd)].operands.push(OperandId, \"'Value'\");\n\n        InstructionDesc[enumCast(Op::OpAtomicFAddEXT)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpAtomicFAddEXT)].operands.push(OperandScope, \"'Scope'\");\n        InstructionDesc[enumCast(Op::OpAtomicFAddEXT)].operands.push(OperandMemorySemantics, \"'Semantics'\");\n        InstructionDesc[enumCast(Op::OpAtomicFAddEXT)].operands.push(OperandId, \"'Value'\");\n\n        InstructionDesc[enumCast(Op::OpAssumeTrueKHR)].operands.push(OperandId, \"'Condition'\");\n\n        InstructionDesc[enumCast(Op::OpExpectKHR)].operands.push(OperandId, \"'Value'\");\n        InstructionDesc[enumCast(Op::OpExpectKHR)].operands.push(OperandId, \"'ExpectedValue'\");\n\n        InstructionDesc[enumCast(Op::OpAtomicISub)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpAtomicISub)].operands.push(OperandScope, \"'Scope'\");\n        InstructionDesc[enumCast(Op::OpAtomicISub)].operands.push(OperandMemorySemantics, \"'Semantics'\");\n        InstructionDesc[enumCast(Op::OpAtomicISub)].operands.push(OperandId, \"'Value'\");\n\n        InstructionDesc[enumCast(Op::OpAtomicUMin)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpAtomicUMin)].operands.push(OperandScope, \"'Scope'\");\n        InstructionDesc[enumCast(Op::OpAtomicUMin)].operands.push(OperandMemorySemantics, \"'Semantics'\");\n        InstructionDesc[enumCast(Op::OpAtomicUMin)].operands.push(OperandId, \"'Value'\");\n\n        InstructionDesc[enumCast(Op::OpAtomicUMax)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpAtomicUMax)].operands.push(OperandScope, \"'Scope'\");\n        InstructionDesc[enumCast(Op::OpAtomicUMax)].operands.push(OperandMemorySemantics, \"'Semantics'\");\n        InstructionDesc[enumCast(Op::OpAtomicUMax)].operands.push(OperandId, \"'Value'\");\n\n        InstructionDesc[enumCast(Op::OpAtomicSMin)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpAtomicSMin)].operands.push(OperandScope, \"'Scope'\");\n        InstructionDesc[enumCast(Op::OpAtomicSMin)].operands.push(OperandMemorySemantics, \"'Semantics'\");\n        InstructionDesc[enumCast(Op::OpAtomicSMin)].operands.push(OperandId, \"'Value'\");\n\n        InstructionDesc[enumCast(Op::OpAtomicSMax)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpAtomicSMax)].operands.push(OperandScope, \"'Scope'\");\n        InstructionDesc[enumCast(Op::OpAtomicSMax)].operands.push(OperandMemorySemantics, \"'Semantics'\");\n        InstructionDesc[enumCast(Op::OpAtomicSMax)].operands.push(OperandId, \"'Value'\");\n\n        InstructionDesc[enumCast(Op::OpAtomicFMinEXT)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpAtomicFMinEXT)].operands.push(OperandScope, \"'Scope'\");\n        InstructionDesc[enumCast(Op::OpAtomicFMinEXT)].operands.push(OperandMemorySemantics, \"'Semantics'\");\n        InstructionDesc[enumCast(Op::OpAtomicFMinEXT)].operands.push(OperandId, \"'Value'\");\n\n        InstructionDesc[enumCast(Op::OpAtomicFMaxEXT)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpAtomicFMaxEXT)].operands.push(OperandScope, \"'Scope'\");\n        InstructionDesc[enumCast(Op::OpAtomicFMaxEXT)].operands.push(OperandMemorySemantics, \"'Semantics'\");\n        InstructionDesc[enumCast(Op::OpAtomicFMaxEXT)].operands.push(OperandId, \"'Value'\");\n\n        InstructionDesc[enumCast(Op::OpAtomicAnd)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpAtomicAnd)].operands.push(OperandScope, \"'Scope'\");\n        InstructionDesc[enumCast(Op::OpAtomicAnd)].operands.push(OperandMemorySemantics, \"'Semantics'\");\n        InstructionDesc[enumCast(Op::OpAtomicAnd)].operands.push(OperandId, \"'Value'\");\n\n        InstructionDesc[enumCast(Op::OpAtomicOr)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpAtomicOr)].operands.push(OperandScope, \"'Scope'\");\n        InstructionDesc[enumCast(Op::OpAtomicOr)].operands.push(OperandMemorySemantics, \"'Semantics'\");\n        InstructionDesc[enumCast(Op::OpAtomicOr)].operands.push(OperandId, \"'Value'\");\n\n        InstructionDesc[enumCast(Op::OpAtomicXor)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpAtomicXor)].operands.push(OperandScope, \"'Scope'\");\n        InstructionDesc[enumCast(Op::OpAtomicXor)].operands.push(OperandMemorySemantics, \"'Semantics'\");\n        InstructionDesc[enumCast(Op::OpAtomicXor)].operands.push(OperandId, \"'Value'\");\n\n        InstructionDesc[enumCast(Op::OpAtomicFlagTestAndSet)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpAtomicFlagTestAndSet)].operands.push(OperandScope, \"'Scope'\");\n        InstructionDesc[enumCast(Op::OpAtomicFlagTestAndSet)].operands.push(OperandMemorySemantics, \"'Semantics'\");\n\n        InstructionDesc[enumCast(Op::OpAtomicFlagClear)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpAtomicFlagClear)].operands.push(OperandScope, \"'Scope'\");\n        InstructionDesc[enumCast(Op::OpAtomicFlagClear)].operands.push(OperandMemorySemantics, \"'Semantics'\");\n\n        InstructionDesc[enumCast(Op::OpLoopMerge)].operands.push(OperandId, \"'Merge Block'\");\n        InstructionDesc[enumCast(Op::OpLoopMerge)].operands.push(OperandId, \"'Continue Target'\");\n        InstructionDesc[enumCast(Op::OpLoopMerge)].operands.push(OperandLoop, \"\");\n        InstructionDesc[enumCast(Op::OpLoopMerge)].operands.push(OperandOptionalLiteral, \"\");\n\n        InstructionDesc[enumCast(Op::OpSelectionMerge)].operands.push(OperandId, \"'Merge Block'\");\n        InstructionDesc[enumCast(Op::OpSelectionMerge)].operands.push(OperandSelect, \"\");\n\n        InstructionDesc[enumCast(Op::OpBranch)].operands.push(OperandId, \"'Target Label'\");\n\n        InstructionDesc[enumCast(Op::OpBranchConditional)].operands.push(OperandId, \"'Condition'\");\n        InstructionDesc[enumCast(Op::OpBranchConditional)].operands.push(OperandId, \"'True Label'\");\n        InstructionDesc[enumCast(Op::OpBranchConditional)].operands.push(OperandId, \"'False Label'\");\n        InstructionDesc[enumCast(Op::OpBranchConditional)].operands.push(OperandVariableLiterals, \"'Branch weights'\");\n\n        InstructionDesc[enumCast(Op::OpSwitch)].operands.push(OperandId, \"'Selector'\");\n        InstructionDesc[enumCast(Op::OpSwitch)].operands.push(OperandId, \"'Default'\");\n        InstructionDesc[enumCast(Op::OpSwitch)].operands.push(OperandVariableLiteralId, \"'Target'\");\n\n\n        InstructionDesc[enumCast(Op::OpReturnValue)].operands.push(OperandId, \"'Value'\");\n\n        InstructionDesc[enumCast(Op::OpLifetimeStart)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpLifetimeStart)].operands.push(OperandLiteralNumber, \"'Size'\");\n\n        InstructionDesc[enumCast(Op::OpLifetimeStop)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpLifetimeStop)].operands.push(OperandLiteralNumber, \"'Size'\");\n\n        InstructionDesc[enumCast(Op::OpGroupAsyncCopy)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupAsyncCopy)].operands.push(OperandId, \"'Destination'\");\n        InstructionDesc[enumCast(Op::OpGroupAsyncCopy)].operands.push(OperandId, \"'Source'\");\n        InstructionDesc[enumCast(Op::OpGroupAsyncCopy)].operands.push(OperandId, \"'Num Elements'\");\n        InstructionDesc[enumCast(Op::OpGroupAsyncCopy)].operands.push(OperandId, \"'Stride'\");\n        InstructionDesc[enumCast(Op::OpGroupAsyncCopy)].operands.push(OperandId, \"'Event'\");\n\n        InstructionDesc[enumCast(Op::OpGroupWaitEvents)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupWaitEvents)].operands.push(OperandId, \"'Num Events'\");\n        InstructionDesc[enumCast(Op::OpGroupWaitEvents)].operands.push(OperandId, \"'Events List'\");\n\n        InstructionDesc[enumCast(Op::OpGroupAll)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupAll)].operands.push(OperandId, \"'Predicate'\");\n\n        InstructionDesc[enumCast(Op::OpGroupAny)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupAny)].operands.push(OperandId, \"'Predicate'\");\n\n        InstructionDesc[enumCast(Op::OpGroupBroadcast)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupBroadcast)].operands.push(OperandId, \"'Value'\");\n        InstructionDesc[enumCast(Op::OpGroupBroadcast)].operands.push(OperandId, \"'LocalId'\");\n\n        InstructionDesc[enumCast(Op::OpGroupIAdd)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupIAdd)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupIAdd)].operands.push(OperandId, \"'X'\");\n\n        InstructionDesc[enumCast(Op::OpGroupFAdd)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupFAdd)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupFAdd)].operands.push(OperandId, \"'X'\");\n\n        InstructionDesc[enumCast(Op::OpGroupUMin)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupUMin)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupUMin)].operands.push(OperandId, \"'X'\");\n\n        InstructionDesc[enumCast(Op::OpGroupSMin)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupSMin)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupSMin)].operands.push(OperandId, \"X\");\n\n        InstructionDesc[enumCast(Op::OpGroupFMin)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupFMin)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupFMin)].operands.push(OperandId, \"X\");\n\n        InstructionDesc[enumCast(Op::OpGroupUMax)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupUMax)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupUMax)].operands.push(OperandId, \"X\");\n\n        InstructionDesc[enumCast(Op::OpGroupSMax)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupSMax)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupSMax)].operands.push(OperandId, \"X\");\n\n        InstructionDesc[enumCast(Op::OpGroupFMax)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupFMax)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupFMax)].operands.push(OperandId, \"X\");\n\n        InstructionDesc[enumCast(Op::OpReadPipe)].operands.push(OperandId, \"'Pipe'\");\n        InstructionDesc[enumCast(Op::OpReadPipe)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpReadPipe)].operands.push(OperandId, \"'Packet Size'\");\n        InstructionDesc[enumCast(Op::OpReadPipe)].operands.push(OperandId, \"'Packet Alignment'\");\n\n        InstructionDesc[enumCast(Op::OpWritePipe)].operands.push(OperandId, \"'Pipe'\");\n        InstructionDesc[enumCast(Op::OpWritePipe)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpWritePipe)].operands.push(OperandId, \"'Packet Size'\");\n        InstructionDesc[enumCast(Op::OpWritePipe)].operands.push(OperandId, \"'Packet Alignment'\");\n\n        InstructionDesc[enumCast(Op::OpReservedReadPipe)].operands.push(OperandId, \"'Pipe'\");\n        InstructionDesc[enumCast(Op::OpReservedReadPipe)].operands.push(OperandId, \"'Reserve Id'\");\n        InstructionDesc[enumCast(Op::OpReservedReadPipe)].operands.push(OperandId, \"'Index'\");\n        InstructionDesc[enumCast(Op::OpReservedReadPipe)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpReservedReadPipe)].operands.push(OperandId, \"'Packet Size'\");\n        InstructionDesc[enumCast(Op::OpReservedReadPipe)].operands.push(OperandId, \"'Packet Alignment'\");\n\n        InstructionDesc[enumCast(Op::OpReservedWritePipe)].operands.push(OperandId, \"'Pipe'\");\n        InstructionDesc[enumCast(Op::OpReservedWritePipe)].operands.push(OperandId, \"'Reserve Id'\");\n        InstructionDesc[enumCast(Op::OpReservedWritePipe)].operands.push(OperandId, \"'Index'\");\n        InstructionDesc[enumCast(Op::OpReservedWritePipe)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpReservedWritePipe)].operands.push(OperandId, \"'Packet Size'\");\n        InstructionDesc[enumCast(Op::OpReservedWritePipe)].operands.push(OperandId, \"'Packet Alignment'\");\n\n        InstructionDesc[enumCast(Op::OpReserveReadPipePackets)].operands.push(OperandId, \"'Pipe'\");\n        InstructionDesc[enumCast(Op::OpReserveReadPipePackets)].operands.push(OperandId, \"'Num Packets'\");\n        InstructionDesc[enumCast(Op::OpReserveReadPipePackets)].operands.push(OperandId, \"'Packet Size'\");\n        InstructionDesc[enumCast(Op::OpReserveReadPipePackets)].operands.push(OperandId, \"'Packet Alignment'\");\n\n        InstructionDesc[enumCast(Op::OpReserveWritePipePackets)].operands.push(OperandId, \"'Pipe'\");\n        InstructionDesc[enumCast(Op::OpReserveWritePipePackets)].operands.push(OperandId, \"'Num Packets'\");\n        InstructionDesc[enumCast(Op::OpReserveWritePipePackets)].operands.push(OperandId, \"'Packet Size'\");\n        InstructionDesc[enumCast(Op::OpReserveWritePipePackets)].operands.push(OperandId, \"'Packet Alignment'\");\n\n        InstructionDesc[enumCast(Op::OpCommitReadPipe)].operands.push(OperandId, \"'Pipe'\");\n        InstructionDesc[enumCast(Op::OpCommitReadPipe)].operands.push(OperandId, \"'Reserve Id'\");\n        InstructionDesc[enumCast(Op::OpCommitReadPipe)].operands.push(OperandId, \"'Packet Size'\");\n        InstructionDesc[enumCast(Op::OpCommitReadPipe)].operands.push(OperandId, \"'Packet Alignment'\");\n\n        InstructionDesc[enumCast(Op::OpCommitWritePipe)].operands.push(OperandId, \"'Pipe'\");\n        InstructionDesc[enumCast(Op::OpCommitWritePipe)].operands.push(OperandId, \"'Reserve Id'\");\n        InstructionDesc[enumCast(Op::OpCommitWritePipe)].operands.push(OperandId, \"'Packet Size'\");\n        InstructionDesc[enumCast(Op::OpCommitWritePipe)].operands.push(OperandId, \"'Packet Alignment'\");\n\n        InstructionDesc[enumCast(Op::OpIsValidReserveId)].operands.push(OperandId, \"'Reserve Id'\");\n\n        InstructionDesc[enumCast(Op::OpGetNumPipePackets)].operands.push(OperandId, \"'Pipe'\");\n        InstructionDesc[enumCast(Op::OpGetNumPipePackets)].operands.push(OperandId, \"'Packet Size'\");\n        InstructionDesc[enumCast(Op::OpGetNumPipePackets)].operands.push(OperandId, \"'Packet Alignment'\");\n\n        InstructionDesc[enumCast(Op::OpGetMaxPipePackets)].operands.push(OperandId, \"'Pipe'\");\n        InstructionDesc[enumCast(Op::OpGetMaxPipePackets)].operands.push(OperandId, \"'Packet Size'\");\n        InstructionDesc[enumCast(Op::OpGetMaxPipePackets)].operands.push(OperandId, \"'Packet Alignment'\");\n\n        InstructionDesc[enumCast(Op::OpGroupReserveReadPipePackets)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupReserveReadPipePackets)].operands.push(OperandId, \"'Pipe'\");\n        InstructionDesc[enumCast(Op::OpGroupReserveReadPipePackets)].operands.push(OperandId, \"'Num Packets'\");\n        InstructionDesc[enumCast(Op::OpGroupReserveReadPipePackets)].operands.push(OperandId, \"'Packet Size'\");\n        InstructionDesc[enumCast(Op::OpGroupReserveReadPipePackets)].operands.push(OperandId, \"'Packet Alignment'\");\n\n        InstructionDesc[enumCast(Op::OpGroupReserveWritePipePackets)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupReserveWritePipePackets)].operands.push(OperandId, \"'Pipe'\");\n        InstructionDesc[enumCast(Op::OpGroupReserveWritePipePackets)].operands.push(OperandId, \"'Num Packets'\");\n        InstructionDesc[enumCast(Op::OpGroupReserveWritePipePackets)].operands.push(OperandId, \"'Packet Size'\");\n        InstructionDesc[enumCast(Op::OpGroupReserveWritePipePackets)].operands.push(OperandId, \"'Packet Alignment'\");\n\n        InstructionDesc[enumCast(Op::OpGroupCommitReadPipe)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupCommitReadPipe)].operands.push(OperandId, \"'Pipe'\");\n        InstructionDesc[enumCast(Op::OpGroupCommitReadPipe)].operands.push(OperandId, \"'Reserve Id'\");\n        InstructionDesc[enumCast(Op::OpGroupCommitReadPipe)].operands.push(OperandId, \"'Packet Size'\");\n        InstructionDesc[enumCast(Op::OpGroupCommitReadPipe)].operands.push(OperandId, \"'Packet Alignment'\");\n\n        InstructionDesc[enumCast(Op::OpGroupCommitWritePipe)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupCommitWritePipe)].operands.push(OperandId, \"'Pipe'\");\n        InstructionDesc[enumCast(Op::OpGroupCommitWritePipe)].operands.push(OperandId, \"'Reserve Id'\");\n        InstructionDesc[enumCast(Op::OpGroupCommitWritePipe)].operands.push(OperandId, \"'Packet Size'\");\n        InstructionDesc[enumCast(Op::OpGroupCommitWritePipe)].operands.push(OperandId, \"'Packet Alignment'\");\n\n        InstructionDesc[enumCast(Op::OpBuildNDRange)].operands.push(OperandId, \"'GlobalWorkSize'\");\n        InstructionDesc[enumCast(Op::OpBuildNDRange)].operands.push(OperandId, \"'LocalWorkSize'\");\n        InstructionDesc[enumCast(Op::OpBuildNDRange)].operands.push(OperandId, \"'GlobalWorkOffset'\");\n\n        InstructionDesc[enumCast(Op::OpCaptureEventProfilingInfo)].operands.push(OperandId, \"'Event'\");\n        InstructionDesc[enumCast(Op::OpCaptureEventProfilingInfo)].operands.push(OperandId, \"'Profiling Info'\");\n        InstructionDesc[enumCast(Op::OpCaptureEventProfilingInfo)].operands.push(OperandId, \"'Value'\");\n\n        InstructionDesc[enumCast(Op::OpSetUserEventStatus)].operands.push(OperandId, \"'Event'\");\n        InstructionDesc[enumCast(Op::OpSetUserEventStatus)].operands.push(OperandId, \"'Status'\");\n\n        InstructionDesc[enumCast(Op::OpIsValidEvent)].operands.push(OperandId, \"'Event'\");\n\n        InstructionDesc[enumCast(Op::OpRetainEvent)].operands.push(OperandId, \"'Event'\");\n\n        InstructionDesc[enumCast(Op::OpReleaseEvent)].operands.push(OperandId, \"'Event'\");\n\n        InstructionDesc[enumCast(Op::OpGetKernelWorkGroupSize)].operands.push(OperandId, \"'Invoke'\");\n        InstructionDesc[enumCast(Op::OpGetKernelWorkGroupSize)].operands.push(OperandId, \"'Param'\");\n        InstructionDesc[enumCast(Op::OpGetKernelWorkGroupSize)].operands.push(OperandId, \"'Param Size'\");\n        InstructionDesc[enumCast(Op::OpGetKernelWorkGroupSize)].operands.push(OperandId, \"'Param Align'\");\n\n        InstructionDesc[enumCast(Op::OpGetKernelPreferredWorkGroupSizeMultiple)].operands.push(OperandId, \"'Invoke'\");\n        InstructionDesc[enumCast(Op::OpGetKernelPreferredWorkGroupSizeMultiple)].operands.push(OperandId, \"'Param'\");\n        InstructionDesc[enumCast(Op::OpGetKernelPreferredWorkGroupSizeMultiple)].operands.push(OperandId, \"'Param Size'\");\n        InstructionDesc[enumCast(Op::OpGetKernelPreferredWorkGroupSizeMultiple)].operands.push(OperandId, \"'Param Align'\");\n\n        InstructionDesc[enumCast(Op::OpGetKernelNDrangeSubGroupCount)].operands.push(OperandId, \"'ND Range'\");\n        InstructionDesc[enumCast(Op::OpGetKernelNDrangeSubGroupCount)].operands.push(OperandId, \"'Invoke'\");\n        InstructionDesc[enumCast(Op::OpGetKernelNDrangeSubGroupCount)].operands.push(OperandId, \"'Param'\");\n        InstructionDesc[enumCast(Op::OpGetKernelNDrangeSubGroupCount)].operands.push(OperandId, \"'Param Size'\");\n        InstructionDesc[enumCast(Op::OpGetKernelNDrangeSubGroupCount)].operands.push(OperandId, \"'Param Align'\");\n\n        InstructionDesc[enumCast(Op::OpGetKernelNDrangeMaxSubGroupSize)].operands.push(OperandId, \"'ND Range'\");\n        InstructionDesc[enumCast(Op::OpGetKernelNDrangeMaxSubGroupSize)].operands.push(OperandId, \"'Invoke'\");\n        InstructionDesc[enumCast(Op::OpGetKernelNDrangeMaxSubGroupSize)].operands.push(OperandId, \"'Param'\");\n        InstructionDesc[enumCast(Op::OpGetKernelNDrangeMaxSubGroupSize)].operands.push(OperandId, \"'Param Size'\");\n        InstructionDesc[enumCast(Op::OpGetKernelNDrangeMaxSubGroupSize)].operands.push(OperandId, \"'Param Align'\");\n\n        InstructionDesc[enumCast(Op::OpEnqueueKernel)].operands.push(OperandId, \"'Queue'\");\n        InstructionDesc[enumCast(Op::OpEnqueueKernel)].operands.push(OperandId, \"'Flags'\");\n        InstructionDesc[enumCast(Op::OpEnqueueKernel)].operands.push(OperandId, \"'ND Range'\");\n        InstructionDesc[enumCast(Op::OpEnqueueKernel)].operands.push(OperandId, \"'Num Events'\");\n        InstructionDesc[enumCast(Op::OpEnqueueKernel)].operands.push(OperandId, \"'Wait Events'\");\n        InstructionDesc[enumCast(Op::OpEnqueueKernel)].operands.push(OperandId, \"'Ret Event'\");\n        InstructionDesc[enumCast(Op::OpEnqueueKernel)].operands.push(OperandId, \"'Invoke'\");\n        InstructionDesc[enumCast(Op::OpEnqueueKernel)].operands.push(OperandId, \"'Param'\");\n        InstructionDesc[enumCast(Op::OpEnqueueKernel)].operands.push(OperandId, \"'Param Size'\");\n        InstructionDesc[enumCast(Op::OpEnqueueKernel)].operands.push(OperandId, \"'Param Align'\");\n        InstructionDesc[enumCast(Op::OpEnqueueKernel)].operands.push(OperandVariableIds, \"'Local Size'\");\n\n        InstructionDesc[enumCast(Op::OpEnqueueMarker)].operands.push(OperandId, \"'Queue'\");\n        InstructionDesc[enumCast(Op::OpEnqueueMarker)].operands.push(OperandId, \"'Num Events'\");\n        InstructionDesc[enumCast(Op::OpEnqueueMarker)].operands.push(OperandId, \"'Wait Events'\");\n        InstructionDesc[enumCast(Op::OpEnqueueMarker)].operands.push(OperandId, \"'Ret Event'\");\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformElect)].operands.push(OperandScope, \"'Execution'\");\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformAll)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformAll)].operands.push(OperandId, \"X\");\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformAny)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformAny)].operands.push(OperandId, \"X\");\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformAllEqual)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformAllEqual)].operands.push(OperandId, \"X\");\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBroadcast)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBroadcast)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBroadcast)].operands.push(OperandId, \"ID\");\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBroadcastFirst)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBroadcastFirst)].operands.push(OperandId, \"X\");\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBallot)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBallot)].operands.push(OperandId, \"X\");\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformInverseBallot)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformInverseBallot)].operands.push(OperandId, \"X\");\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBallotBitExtract)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBallotBitExtract)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBallotBitExtract)].operands.push(OperandId, \"Bit\");\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBallotBitCount)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBallotBitCount)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBallotBitCount)].operands.push(OperandId, \"X\");\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBallotFindLSB)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBallotFindLSB)].operands.push(OperandId, \"X\");\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBallotFindMSB)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBallotFindMSB)].operands.push(OperandId, \"X\");\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformShuffle)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformShuffle)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformShuffle)].operands.push(OperandId, \"'Id'\");\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformShuffleXor)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformShuffleXor)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformShuffleXor)].operands.push(OperandId, \"Mask\");\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformShuffleUp)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformShuffleUp)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformShuffleUp)].operands.push(OperandId, \"Offset\");\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformShuffleDown)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformShuffleDown)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformShuffleDown)].operands.push(OperandId, \"Offset\");\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformIAdd)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformIAdd)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformIAdd)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformIAdd)].operands.push(OperandId, \"'ClusterSize'\", true);\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformFAdd)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformFAdd)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformFAdd)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformFAdd)].operands.push(OperandId, \"'ClusterSize'\", true);\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformIMul)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformIMul)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformIMul)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformIMul)].operands.push(OperandId, \"'ClusterSize'\", true);\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformFMul)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformFMul)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformFMul)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformFMul)].operands.push(OperandId, \"'ClusterSize'\", true);\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformSMin)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformSMin)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformSMin)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformSMin)].operands.push(OperandId, \"'ClusterSize'\", true);\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformUMin)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformUMin)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformUMin)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformUMin)].operands.push(OperandId, \"'ClusterSize'\", true);\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformFMin)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformFMin)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformFMin)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformFMin)].operands.push(OperandId, \"'ClusterSize'\", true);\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformSMax)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformSMax)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformSMax)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformSMax)].operands.push(OperandId, \"'ClusterSize'\", true);\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformUMax)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformUMax)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformUMax)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformUMax)].operands.push(OperandId, \"'ClusterSize'\", true);\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformFMax)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformFMax)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformFMax)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformFMax)].operands.push(OperandId, \"'ClusterSize'\", true);\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBitwiseAnd)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBitwiseAnd)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBitwiseAnd)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBitwiseAnd)].operands.push(OperandId, \"'ClusterSize'\", true);\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBitwiseOr)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBitwiseOr)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBitwiseOr)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBitwiseOr)].operands.push(OperandId, \"'ClusterSize'\", true);\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBitwiseXor)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBitwiseXor)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBitwiseXor)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformBitwiseXor)].operands.push(OperandId, \"'ClusterSize'\", true);\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformLogicalAnd)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformLogicalAnd)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformLogicalAnd)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformLogicalAnd)].operands.push(OperandId, \"'ClusterSize'\", true);\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformLogicalOr)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformLogicalOr)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformLogicalOr)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformLogicalOr)].operands.push(OperandId, \"'ClusterSize'\", true);\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformLogicalXor)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformLogicalXor)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformLogicalXor)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformLogicalXor)].operands.push(OperandId, \"'ClusterSize'\", true);\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformQuadBroadcast)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformQuadBroadcast)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformQuadBroadcast)].operands.push(OperandId, \"'Id'\");\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformQuadSwap)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformQuadSwap)].operands.push(OperandId, \"X\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformQuadSwap)].operands.push(OperandId, \"'Direction'\");\n\n        InstructionDesc[enumCast(Op::OpSubgroupBallotKHR)].operands.push(OperandId, \"'Predicate'\");\n\n        InstructionDesc[enumCast(Op::OpSubgroupFirstInvocationKHR)].operands.push(OperandId, \"'Value'\");\n\n        InstructionDesc[enumCast(Op::OpSubgroupAnyKHR)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpSubgroupAnyKHR)].operands.push(OperandId, \"'Predicate'\");\n\n        InstructionDesc[enumCast(Op::OpSubgroupAllKHR)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpSubgroupAllKHR)].operands.push(OperandId, \"'Predicate'\");\n\n        InstructionDesc[enumCast(Op::OpSubgroupAllEqualKHR)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpSubgroupAllEqualKHR)].operands.push(OperandId, \"'Predicate'\");\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformRotateKHR)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformRotateKHR)].operands.push(OperandId, \"'X'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformRotateKHR)].operands.push(OperandId, \"'Delta'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformRotateKHR)].operands.push(OperandId, \"'ClusterSize'\", true);\n\n        InstructionDesc[enumCast(Op::OpSubgroupReadInvocationKHR)].operands.push(OperandId, \"'Value'\");\n        InstructionDesc[enumCast(Op::OpSubgroupReadInvocationKHR)].operands.push(OperandId, \"'Index'\");\n\n        InstructionDesc[enumCast(Op::OpModuleProcessed)].operands.push(OperandLiteralString, \"'process'\");\n\n        InstructionDesc[enumCast(Op::OpGroupIAddNonUniformAMD)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupIAddNonUniformAMD)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupIAddNonUniformAMD)].operands.push(OperandId, \"'X'\");\n\n        InstructionDesc[enumCast(Op::OpGroupFAddNonUniformAMD)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupFAddNonUniformAMD)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupFAddNonUniformAMD)].operands.push(OperandId, \"'X'\");\n\n        InstructionDesc[enumCast(Op::OpGroupUMinNonUniformAMD)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupUMinNonUniformAMD)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupUMinNonUniformAMD)].operands.push(OperandId, \"'X'\");\n\n        InstructionDesc[enumCast(Op::OpGroupSMinNonUniformAMD)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupSMinNonUniformAMD)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupSMinNonUniformAMD)].operands.push(OperandId, \"X\");\n\n        InstructionDesc[enumCast(Op::OpGroupFMinNonUniformAMD)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupFMinNonUniformAMD)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupFMinNonUniformAMD)].operands.push(OperandId, \"X\");\n\n        InstructionDesc[enumCast(Op::OpGroupUMaxNonUniformAMD)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupUMaxNonUniformAMD)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupUMaxNonUniformAMD)].operands.push(OperandId, \"X\");\n\n        InstructionDesc[enumCast(Op::OpGroupSMaxNonUniformAMD)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupSMaxNonUniformAMD)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupSMaxNonUniformAMD)].operands.push(OperandId, \"X\");\n\n        InstructionDesc[enumCast(Op::OpGroupFMaxNonUniformAMD)].operands.push(OperandScope, \"'Execution'\");\n        InstructionDesc[enumCast(Op::OpGroupFMaxNonUniformAMD)].operands.push(OperandGroupOperation, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpGroupFMaxNonUniformAMD)].operands.push(OperandId, \"X\");\n\n        InstructionDesc[enumCast(Op::OpFragmentMaskFetchAMD)].operands.push(OperandId, \"'Image'\");\n        InstructionDesc[enumCast(Op::OpFragmentMaskFetchAMD)].operands.push(OperandId, \"'Coordinate'\");\n\n        InstructionDesc[enumCast(Op::OpFragmentFetchAMD)].operands.push(OperandId, \"'Image'\");\n        InstructionDesc[enumCast(Op::OpFragmentFetchAMD)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpFragmentFetchAMD)].operands.push(OperandId, \"'Fragment Index'\");\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformPartitionNV)].operands.push(OperandId, \"X\");\n\n        InstructionDesc[enumCast(Op::OpGroupNonUniformQuadAllKHR)].operands.push(OperandId, \"'Predicate'\");\n        InstructionDesc[enumCast(Op::OpGroupNonUniformQuadAnyKHR)].operands.push(OperandId, \"'Predicate'\");\n        InstructionDesc[enumCast(Op::OpTypeAccelerationStructureKHR)].setResultAndType(true, false);\n\n        InstructionDesc[enumCast(Op::OpTraceNV)].operands.push(OperandId, \"'Acceleration Structure'\");\n        InstructionDesc[enumCast(Op::OpTraceNV)].operands.push(OperandId, \"'Ray Flags'\");\n        InstructionDesc[enumCast(Op::OpTraceNV)].operands.push(OperandId, \"'Cull Mask'\");\n        InstructionDesc[enumCast(Op::OpTraceNV)].operands.push(OperandId, \"'SBT Record Offset'\");\n        InstructionDesc[enumCast(Op::OpTraceNV)].operands.push(OperandId, \"'SBT Record Stride'\");\n        InstructionDesc[enumCast(Op::OpTraceNV)].operands.push(OperandId, \"'Miss Index'\");\n        InstructionDesc[enumCast(Op::OpTraceNV)].operands.push(OperandId, \"'Ray Origin'\");\n        InstructionDesc[enumCast(Op::OpTraceNV)].operands.push(OperandId, \"'TMin'\");\n        InstructionDesc[enumCast(Op::OpTraceNV)].operands.push(OperandId, \"'Ray Direction'\");\n        InstructionDesc[enumCast(Op::OpTraceNV)].operands.push(OperandId, \"'TMax'\");\n        InstructionDesc[enumCast(Op::OpTraceNV)].operands.push(OperandId, \"'Payload'\");\n        InstructionDesc[enumCast(Op::OpTraceNV)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpTraceRayMotionNV)].operands.push(OperandId, \"'Acceleration Structure'\");\n        InstructionDesc[enumCast(Op::OpTraceRayMotionNV)].operands.push(OperandId, \"'Ray Flags'\");\n        InstructionDesc[enumCast(Op::OpTraceRayMotionNV)].operands.push(OperandId, \"'Cull Mask'\");\n        InstructionDesc[enumCast(Op::OpTraceRayMotionNV)].operands.push(OperandId, \"'SBT Record Offset'\");\n        InstructionDesc[enumCast(Op::OpTraceRayMotionNV)].operands.push(OperandId, \"'SBT Record Stride'\");\n        InstructionDesc[enumCast(Op::OpTraceRayMotionNV)].operands.push(OperandId, \"'Miss Index'\");\n        InstructionDesc[enumCast(Op::OpTraceRayMotionNV)].operands.push(OperandId, \"'Ray Origin'\");\n        InstructionDesc[enumCast(Op::OpTraceRayMotionNV)].operands.push(OperandId, \"'TMin'\");\n        InstructionDesc[enumCast(Op::OpTraceRayMotionNV)].operands.push(OperandId, \"'Ray Direction'\");\n        InstructionDesc[enumCast(Op::OpTraceRayMotionNV)].operands.push(OperandId, \"'TMax'\");\n        InstructionDesc[enumCast(Op::OpTraceRayMotionNV)].operands.push(OperandId, \"'Time'\");\n        InstructionDesc[enumCast(Op::OpTraceRayMotionNV)].operands.push(OperandId, \"'Payload'\");\n        InstructionDesc[enumCast(Op::OpTraceRayMotionNV)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpTraceRayKHR)].operands.push(OperandId, \"'Acceleration Structure'\");\n        InstructionDesc[enumCast(Op::OpTraceRayKHR)].operands.push(OperandId, \"'Ray Flags'\");\n        InstructionDesc[enumCast(Op::OpTraceRayKHR)].operands.push(OperandId, \"'Cull Mask'\");\n        InstructionDesc[enumCast(Op::OpTraceRayKHR)].operands.push(OperandId, \"'SBT Record Offset'\");\n        InstructionDesc[enumCast(Op::OpTraceRayKHR)].operands.push(OperandId, \"'SBT Record Stride'\");\n        InstructionDesc[enumCast(Op::OpTraceRayKHR)].operands.push(OperandId, \"'Miss Index'\");\n        InstructionDesc[enumCast(Op::OpTraceRayKHR)].operands.push(OperandId, \"'Ray Origin'\");\n        InstructionDesc[enumCast(Op::OpTraceRayKHR)].operands.push(OperandId, \"'TMin'\");\n        InstructionDesc[enumCast(Op::OpTraceRayKHR)].operands.push(OperandId, \"'Ray Direction'\");\n        InstructionDesc[enumCast(Op::OpTraceRayKHR)].operands.push(OperandId, \"'TMax'\");\n        InstructionDesc[enumCast(Op::OpTraceRayKHR)].operands.push(OperandId, \"'Payload'\");\n        InstructionDesc[enumCast(Op::OpTraceRayKHR)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpReportIntersectionKHR)].operands.push(OperandId, \"'Hit Parameter'\");\n        InstructionDesc[enumCast(Op::OpReportIntersectionKHR)].operands.push(OperandId, \"'Hit Kind'\");\n\n        InstructionDesc[enumCast(Op::OpIgnoreIntersectionNV)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpIgnoreIntersectionKHR)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpTerminateRayNV)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpTerminateRayKHR)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpExecuteCallableNV)].operands.push(OperandId, \"SBT Record Index\");\n        InstructionDesc[enumCast(Op::OpExecuteCallableNV)].operands.push(OperandId, \"CallableData ID\");\n        InstructionDesc[enumCast(Op::OpExecuteCallableNV)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpExecuteCallableKHR)].operands.push(OperandId, \"SBT Record Index\");\n        InstructionDesc[enumCast(Op::OpExecuteCallableKHR)].operands.push(OperandId, \"CallableData\");\n        InstructionDesc[enumCast(Op::OpExecuteCallableKHR)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpConvertUToAccelerationStructureKHR)].operands.push(OperandId, \"Value\");\n        InstructionDesc[enumCast(Op::OpConvertUToAccelerationStructureKHR)].setResultAndType(true, true);\n\n        // Ray Query\n        InstructionDesc[enumCast(Op::OpTypeAccelerationStructureKHR)].setResultAndType(true, false);\n        InstructionDesc[enumCast(Op::OpTypeRayQueryKHR)].setResultAndType(true, false);\n\n        InstructionDesc[enumCast(Op::OpRayQueryInitializeKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryInitializeKHR)].operands.push(OperandId, \"'AccelerationS'\");\n        InstructionDesc[enumCast(Op::OpRayQueryInitializeKHR)].operands.push(OperandId, \"'RayFlags'\");\n        InstructionDesc[enumCast(Op::OpRayQueryInitializeKHR)].operands.push(OperandId, \"'CullMask'\");\n        InstructionDesc[enumCast(Op::OpRayQueryInitializeKHR)].operands.push(OperandId, \"'Origin'\");\n        InstructionDesc[enumCast(Op::OpRayQueryInitializeKHR)].operands.push(OperandId, \"'Tmin'\");\n        InstructionDesc[enumCast(Op::OpRayQueryInitializeKHR)].operands.push(OperandId, \"'Direction'\");\n        InstructionDesc[enumCast(Op::OpRayQueryInitializeKHR)].operands.push(OperandId, \"'Tmax'\");\n        InstructionDesc[enumCast(Op::OpRayQueryInitializeKHR)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpRayQueryTerminateKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryTerminateKHR)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGenerateIntersectionKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGenerateIntersectionKHR)].operands.push(OperandId, \"'THit'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGenerateIntersectionKHR)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpRayQueryConfirmIntersectionKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryConfirmIntersectionKHR)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpRayQueryProceedKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryProceedKHR)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionTypeKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionTypeKHR)].operands.push(OperandId, \"'Committed'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionTypeKHR)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetRayTMinKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetRayTMinKHR)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetRayFlagsKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetRayFlagsKHR)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionTKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionTKHR)].operands.push(OperandId, \"'Committed'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionTKHR)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionInstanceCustomIndexKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionInstanceCustomIndexKHR)].operands.push(OperandId, \"'Committed'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionInstanceCustomIndexKHR)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionInstanceIdKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionInstanceIdKHR)].operands.push(OperandId, \"'Committed'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionInstanceIdKHR)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR)].operands.push(OperandId, \"'Committed'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionGeometryIndexKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionGeometryIndexKHR)].operands.push(OperandId, \"'Committed'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionGeometryIndexKHR)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionPrimitiveIndexKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionPrimitiveIndexKHR)].operands.push(OperandId, \"'Committed'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionPrimitiveIndexKHR)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionBarycentricsKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionBarycentricsKHR)].operands.push(OperandId, \"'Committed'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionBarycentricsKHR)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionFrontFaceKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionFrontFaceKHR)].operands.push(OperandId, \"'Committed'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionFrontFaceKHR)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionCandidateAABBOpaqueKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionCandidateAABBOpaqueKHR)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionObjectRayDirectionKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionObjectRayDirectionKHR)].operands.push(OperandId, \"'Committed'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionObjectRayDirectionKHR)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionObjectRayOriginKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionObjectRayOriginKHR)].operands.push(OperandId, \"'Committed'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionObjectRayOriginKHR)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetWorldRayDirectionKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetWorldRayDirectionKHR)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetWorldRayOriginKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetWorldRayOriginKHR)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionObjectToWorldKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionObjectToWorldKHR)].operands.push(OperandId, \"'Committed'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionObjectToWorldKHR)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionWorldToObjectKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionWorldToObjectKHR)].operands.push(OperandId, \"'Committed'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionWorldToObjectKHR)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionTriangleVertexPositionsKHR)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionTriangleVertexPositionsKHR)].operands.push(OperandId, \"'Committed'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionTriangleVertexPositionsKHR)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetClusterIdNV)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetClusterIdNV)].operands.push(OperandId, \"'Committed'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetClusterIdNV)].setResultAndType(true, true);\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionSpherePositionNV)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionSpherePositionNV)].operands.push(OperandId, \"'Committed'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionSpherePositionNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionSphereRadiusNV)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionSphereRadiusNV)].operands.push(OperandId, \"'Committed'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionSphereRadiusNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionLSSHitValueNV)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionLSSHitValueNV)].operands.push(OperandId, \"'Committed'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionLSSHitValueNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionLSSPositionsNV)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionLSSPositionsNV)].operands.push(OperandId, \"'Committed'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionLSSPositionsNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionLSSRadiiNV)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionLSSRadiiNV)].operands.push(OperandId, \"'Committed'\");\n        InstructionDesc[enumCast(Op::OpRayQueryGetIntersectionLSSRadiiNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryIsSphereHitNV)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryIsSphereHitNV)].operands.push(OperandId, \"'Committed'\");\n        InstructionDesc[enumCast(Op::OpRayQueryIsSphereHitNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpRayQueryIsLSSHitNV)].operands.push(OperandId, \"'RayQuery'\");\n        InstructionDesc[enumCast(Op::OpRayQueryIsLSSHitNV)].operands.push(OperandId, \"'Committed'\");\n        InstructionDesc[enumCast(Op::OpRayQueryIsLSSHitNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpImageSampleFootprintNV)].operands.push(OperandId, \"'Sampled Image'\");\n        InstructionDesc[enumCast(Op::OpImageSampleFootprintNV)].operands.push(OperandId, \"'Coordinate'\");\n        InstructionDesc[enumCast(Op::OpImageSampleFootprintNV)].operands.push(OperandId, \"'Granularity'\");\n        InstructionDesc[enumCast(Op::OpImageSampleFootprintNV)].operands.push(OperandId, \"'Coarse'\");\n        InstructionDesc[enumCast(Op::OpImageSampleFootprintNV)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageSampleFootprintNV)].operands.push(OperandVariableIds, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpWritePackedPrimitiveIndices4x8NV)].operands.push(OperandId, \"'Index Offset'\");\n        InstructionDesc[enumCast(Op::OpWritePackedPrimitiveIndices4x8NV)].operands.push(OperandId, \"'Packed Indices'\");\n\n        InstructionDesc[enumCast(Op::OpEmitMeshTasksEXT)].operands.push(OperandId, \"'groupCountX'\");\n        InstructionDesc[enumCast(Op::OpEmitMeshTasksEXT)].operands.push(OperandId, \"'groupCountY'\");\n        InstructionDesc[enumCast(Op::OpEmitMeshTasksEXT)].operands.push(OperandId, \"'groupCountZ'\");\n        InstructionDesc[enumCast(Op::OpEmitMeshTasksEXT)].operands.push(OperandId, \"'Payload'\");\n        InstructionDesc[enumCast(Op::OpEmitMeshTasksEXT)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpSetMeshOutputsEXT)].operands.push(OperandId, \"'vertexCount'\");\n        InstructionDesc[enumCast(Op::OpSetMeshOutputsEXT)].operands.push(OperandId, \"'primitiveCount'\");\n        InstructionDesc[enumCast(Op::OpSetMeshOutputsEXT)].setResultAndType(false, false);\n\n\n        InstructionDesc[enumCast(Op::OpTypeCooperativeMatrixNV)].operands.push(OperandId, \"'Component Type'\");\n        InstructionDesc[enumCast(Op::OpTypeCooperativeMatrixNV)].operands.push(OperandId, \"'Scope'\");\n        InstructionDesc[enumCast(Op::OpTypeCooperativeMatrixNV)].operands.push(OperandId, \"'Rows'\");\n        InstructionDesc[enumCast(Op::OpTypeCooperativeMatrixNV)].operands.push(OperandId, \"'Columns'\");\n\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixLoadNV)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixLoadNV)].operands.push(OperandId, \"'Stride'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixLoadNV)].operands.push(OperandId, \"'Column Major'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixLoadNV)].operands.push(OperandMemoryAccess, \"'Memory Access'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixLoadNV)].operands.push(OperandLiteralNumber, \"\", true);\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixLoadNV)].operands.push(OperandId, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixStoreNV)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixStoreNV)].operands.push(OperandId, \"'Object'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixStoreNV)].operands.push(OperandId, \"'Stride'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixStoreNV)].operands.push(OperandId, \"'Column Major'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixStoreNV)].operands.push(OperandMemoryAccess, \"'Memory Access'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixStoreNV)].operands.push(OperandLiteralNumber, \"\", true);\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixStoreNV)].operands.push(OperandId, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixMulAddNV)].operands.push(OperandId, \"'A'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixMulAddNV)].operands.push(OperandId, \"'B'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixMulAddNV)].operands.push(OperandId, \"'C'\");\n\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixLengthNV)].operands.push(OperandId, \"'Type'\");\n\n        InstructionDesc[enumCast(Op::OpTypeCooperativeMatrixKHR)].operands.push(OperandId, \"'Component Type'\");\n        InstructionDesc[enumCast(Op::OpTypeCooperativeMatrixKHR)].operands.push(OperandId, \"'Scope'\");\n        InstructionDesc[enumCast(Op::OpTypeCooperativeMatrixKHR)].operands.push(OperandId, \"'Rows'\");\n        InstructionDesc[enumCast(Op::OpTypeCooperativeMatrixKHR)].operands.push(OperandId, \"'Columns'\");\n        InstructionDesc[enumCast(Op::OpTypeCooperativeMatrixKHR)].operands.push(OperandId, \"'Use'\");\n\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixLoadKHR)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixLoadKHR)].operands.push(OperandId, \"'Memory Layout'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixLoadKHR)].operands.push(OperandId, \"'Stride'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixLoadKHR)].operands.push(OperandMemoryAccess, \"'Memory Access'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixLoadKHR)].operands.push(OperandLiteralNumber, \"\", true);\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixLoadKHR)].operands.push(OperandId, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixStoreKHR)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixStoreKHR)].operands.push(OperandId, \"'Object'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixStoreKHR)].operands.push(OperandId, \"'Memory Layout'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixStoreKHR)].operands.push(OperandId, \"'Stride'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixStoreKHR)].operands.push(OperandMemoryAccess, \"'Memory Access'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixStoreKHR)].operands.push(OperandLiteralNumber, \"\", true);\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixStoreKHR)].operands.push(OperandId, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixMulAddKHR)].operands.push(OperandId, \"'A'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixMulAddKHR)].operands.push(OperandId, \"'B'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixMulAddKHR)].operands.push(OperandId, \"'C'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixMulAddKHR)].operands.push(OperandCooperativeMatrixOperands, \"'Cooperative Matrix Operands'\", true);\n\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixLengthKHR)].operands.push(OperandId, \"'Type'\");\n\n        InstructionDesc[enumCast(Op::OpTypeCooperativeVectorNV)].operands.push(OperandId, \"'Component Type'\");\n        InstructionDesc[enumCast(Op::OpTypeCooperativeVectorNV)].operands.push(OperandId, \"'Components'\");\n\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulNV)].operands.push(OperandId, \"'Input'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulNV)].operands.push(OperandId, \"'InputInterpretation'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulNV)].operands.push(OperandId, \"'Matrix'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulNV)].operands.push(OperandId, \"'MatrixOffset'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulNV)].operands.push(OperandId, \"'MatrixInterpretation'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulNV)].operands.push(OperandId, \"'M'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulNV)].operands.push(OperandId, \"'K'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulNV)].operands.push(OperandId, \"'MemoryLayout'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulNV)].operands.push(OperandId, \"'Transpose'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulNV)].operands.push(OperandId, \"'MatrixStride'\", true);\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulNV)].operands.push(OperandCooperativeMatrixOperands, \"'Cooperative Matrix Operands'\", true);\n\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulAddNV)].operands.push(OperandId, \"'Input'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulAddNV)].operands.push(OperandId, \"'InputInterpretation'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulAddNV)].operands.push(OperandId, \"'Matrix'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulAddNV)].operands.push(OperandId, \"'MatrixOffset'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulAddNV)].operands.push(OperandId, \"'MatrixInterpretation'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulAddNV)].operands.push(OperandId, \"'Bias'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulAddNV)].operands.push(OperandId, \"'BiasOffset'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulAddNV)].operands.push(OperandId, \"'BiasInterpretation'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulAddNV)].operands.push(OperandId, \"'M'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulAddNV)].operands.push(OperandId, \"'K'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulAddNV)].operands.push(OperandId, \"'MemoryLayout'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulAddNV)].operands.push(OperandId, \"'Transpose'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulAddNV)].operands.push(OperandId, \"'MatrixStride'\", true);\n        InstructionDesc[enumCast(Op::OpCooperativeVectorMatrixMulAddNV)].operands.push(OperandCooperativeMatrixOperands, \"'Cooperative Matrix Operands'\", true);\n\n        InstructionDesc[enumCast(Op::OpCooperativeVectorLoadNV)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorLoadNV)].operands.push(OperandId, \"'Offset'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorLoadNV)].operands.push(OperandMemoryAccess, \"'Memory Access'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorLoadNV)].operands.push(OperandLiteralNumber, \"\", true);\n        InstructionDesc[enumCast(Op::OpCooperativeVectorLoadNV)].operands.push(OperandId, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpCooperativeVectorStoreNV)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorStoreNV)].operands.push(OperandId, \"'Offset'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorStoreNV)].operands.push(OperandId, \"'Object'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorStoreNV)].operands.push(OperandMemoryAccess, \"'Memory Access'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorStoreNV)].operands.push(OperandLiteralNumber, \"\", true);\n        InstructionDesc[enumCast(Op::OpCooperativeVectorStoreNV)].operands.push(OperandId, \"\", true);\n\n        InstructionDesc[enumCast(Op::OpCooperativeVectorOuterProductAccumulateNV)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorOuterProductAccumulateNV)].operands.push(OperandId, \"'Offset'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorOuterProductAccumulateNV)].operands.push(OperandId, \"'A'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorOuterProductAccumulateNV)].operands.push(OperandId, \"'B'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorOuterProductAccumulateNV)].operands.push(OperandId, \"'MemoryLayout'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorOuterProductAccumulateNV)].operands.push(OperandId, \"'MatrixInterpretation'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorOuterProductAccumulateNV)].operands.push(OperandId, \"'MatrixStride'\", true);\n\n        InstructionDesc[enumCast(Op::OpCooperativeVectorReduceSumAccumulateNV)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorReduceSumAccumulateNV)].operands.push(OperandId, \"'Offset'\");\n        InstructionDesc[enumCast(Op::OpCooperativeVectorReduceSumAccumulateNV)].operands.push(OperandId, \"'V'\");\n\n        InstructionDesc[enumCast(Op::OpDemoteToHelperInvocationEXT)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpReadClockKHR)].operands.push(OperandScope, \"'Scope'\");\n\n        InstructionDesc[enumCast(Op::OpTypeHitObjectNV)].setResultAndType(true, false);\n\n        InstructionDesc[enumCast(Op::OpHitObjectGetShaderRecordBufferHandleNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectGetShaderRecordBufferHandleNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpReorderThreadWithHintNV)].operands.push(OperandId, \"'Hint'\");\n        InstructionDesc[enumCast(Op::OpReorderThreadWithHintNV)].operands.push(OperandId, \"'Bits'\");\n        InstructionDesc[enumCast(Op::OpReorderThreadWithHintNV)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpReorderThreadWithHitObjectNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpReorderThreadWithHitObjectNV)].operands.push(OperandId, \"'Hint'\");\n        InstructionDesc[enumCast(Op::OpReorderThreadWithHitObjectNV)].operands.push(OperandId, \"'Bits'\");\n        InstructionDesc[enumCast(Op::OpReorderThreadWithHitObjectNV)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpHitObjectGetCurrentTimeNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectGetCurrentTimeNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpHitObjectGetHitKindNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectGetHitKindNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpHitObjectGetPrimitiveIndexNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectGetPrimitiveIndexNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpHitObjectGetGeometryIndexNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectGetGeometryIndexNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpHitObjectGetInstanceIdNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectGetInstanceIdNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpHitObjectGetInstanceCustomIndexNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectGetInstanceCustomIndexNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpHitObjectGetObjectRayDirectionNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectGetObjectRayDirectionNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpHitObjectGetObjectRayOriginNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectGetObjectRayOriginNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpHitObjectGetWorldRayDirectionNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectGetWorldRayDirectionNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpHitObjectGetWorldRayOriginNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectGetWorldRayOriginNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpHitObjectGetWorldToObjectNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectGetWorldToObjectNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpHitObjectGetObjectToWorldNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectGetObjectToWorldNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpHitObjectGetRayTMaxNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectGetRayTMaxNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpHitObjectGetRayTMinNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectGetRayTMinNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpHitObjectGetShaderBindingTableRecordIndexNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectGetShaderBindingTableRecordIndexNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpHitObjectIsEmptyNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectIsEmptyNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpHitObjectIsHitNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectIsHitNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpHitObjectIsMissNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectIsMissNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpHitObjectGetAttributesNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectGetAttributesNV)].operands.push(OperandId, \"'HitObjectAttribute'\");\n        InstructionDesc[enumCast(Op::OpHitObjectGetAttributesNV)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpHitObjectExecuteShaderNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectExecuteShaderNV)].operands.push(OperandId, \"'Payload'\");\n        InstructionDesc[enumCast(Op::OpHitObjectExecuteShaderNV)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitNV)].operands.push(OperandId, \"'Acceleration Structure'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitNV)].operands.push(OperandId, \"'InstanceId'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitNV)].operands.push(OperandId, \"'PrimitiveId'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitNV)].operands.push(OperandId, \"'GeometryIndex'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitNV)].operands.push(OperandId, \"'HitKind'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitNV)].operands.push(OperandId, \"'SBT Record Offset'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitNV)].operands.push(OperandId, \"'SBT Record Stride'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitNV)].operands.push(OperandId, \"'Origin'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitNV)].operands.push(OperandId, \"'TMin'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitNV)].operands.push(OperandId, \"'Direction'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitNV)].operands.push(OperandId, \"'TMax'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitNV)].operands.push(OperandId, \"'HitObject Attribute'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitNV)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitMotionNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitMotionNV)].operands.push(OperandId, \"'Acceleration Structure'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitMotionNV)].operands.push(OperandId, \"'InstanceId'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitMotionNV)].operands.push(OperandId, \"'PrimitiveId'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitMotionNV)].operands.push(OperandId, \"'GeometryIndex'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitMotionNV)].operands.push(OperandId, \"'HitKind'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitMotionNV)].operands.push(OperandId, \"'SBT Record Offset'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitMotionNV)].operands.push(OperandId, \"'SBT Record Stride'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitMotionNV)].operands.push(OperandId, \"'Origin'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitMotionNV)].operands.push(OperandId, \"'TMin'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitMotionNV)].operands.push(OperandId, \"'Direction'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitMotionNV)].operands.push(OperandId, \"'TMax'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitMotionNV)].operands.push(OperandId, \"'Current Time'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitMotionNV)].operands.push(OperandId, \"'HitObject Attribute'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitMotionNV)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexNV)].operands.push(OperandId, \"'Acceleration Structure'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexNV)].operands.push(OperandId, \"'InstanceId'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexNV)].operands.push(OperandId, \"'PrimitiveId'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexNV)].operands.push(OperandId, \"'GeometryIndex'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexNV)].operands.push(OperandId, \"'HitKind'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexNV)].operands.push(OperandId, \"'SBT Record Index'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexNV)].operands.push(OperandId, \"'Origin'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexNV)].operands.push(OperandId, \"'TMin'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexNV)].operands.push(OperandId, \"'Direction'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexNV)].operands.push(OperandId, \"'TMax'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexNV)].operands.push(OperandId, \"'HitObject Attribute'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexNV)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexMotionNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexMotionNV)].operands.push(OperandId, \"'Acceleration Structure'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexMotionNV)].operands.push(OperandId, \"'InstanceId'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexMotionNV)].operands.push(OperandId, \"'PrimitiveId'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexMotionNV)].operands.push(OperandId, \"'GeometryIndex'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexMotionNV)].operands.push(OperandId, \"'HitKind'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexMotionNV)].operands.push(OperandId, \"'SBT Record Index'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexMotionNV)].operands.push(OperandId, \"'Origin'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexMotionNV)].operands.push(OperandId, \"'TMin'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexMotionNV)].operands.push(OperandId, \"'Direction'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexMotionNV)].operands.push(OperandId, \"'TMax'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexMotionNV)].operands.push(OperandId, \"'Current Time'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexMotionNV)].operands.push(OperandId, \"'HitObject Attribute'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordHitWithIndexMotionNV)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpHitObjectRecordMissNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordMissNV)].operands.push(OperandId, \"'SBT Index'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordMissNV)].operands.push(OperandId, \"'Origin'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordMissNV)].operands.push(OperandId, \"'TMin'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordMissNV)].operands.push(OperandId, \"'Direction'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordMissNV)].operands.push(OperandId, \"'TMax'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordMissNV)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpHitObjectRecordMissMotionNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordMissMotionNV)].operands.push(OperandId, \"'SBT Index'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordMissMotionNV)].operands.push(OperandId, \"'Origin'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordMissMotionNV)].operands.push(OperandId, \"'TMin'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordMissMotionNV)].operands.push(OperandId, \"'Direction'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordMissMotionNV)].operands.push(OperandId, \"'TMax'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordMissMotionNV)].operands.push(OperandId, \"'Current Time'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordMissMotionNV)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpHitObjectRecordEmptyNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectRecordEmptyNV)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayNV)].operands.push(OperandId, \"'Acceleration Structure'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayNV)].operands.push(OperandId, \"'RayFlags'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayNV)].operands.push(OperandId, \"'Cullmask'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayNV)].operands.push(OperandId, \"'SBT Record Offset'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayNV)].operands.push(OperandId, \"'SBT Record Stride'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayNV)].operands.push(OperandId, \"'Miss Index'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayNV)].operands.push(OperandId, \"'Origin'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayNV)].operands.push(OperandId, \"'TMin'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayNV)].operands.push(OperandId, \"'Direction'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayNV)].operands.push(OperandId, \"'TMax'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayNV)].operands.push(OperandId, \"'Payload'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayNV)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayMotionNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayMotionNV)].operands.push(OperandId, \"'Acceleration Structure'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayMotionNV)].operands.push(OperandId, \"'RayFlags'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayMotionNV)].operands.push(OperandId, \"'Cullmask'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayMotionNV)].operands.push(OperandId, \"'SBT Record Offset'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayMotionNV)].operands.push(OperandId, \"'SBT Record Stride'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayMotionNV)].operands.push(OperandId, \"'Miss Index'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayMotionNV)].operands.push(OperandId, \"'Origin'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayMotionNV)].operands.push(OperandId, \"'TMin'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayMotionNV)].operands.push(OperandId, \"'Direction'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayMotionNV)].operands.push(OperandId, \"'TMax'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayMotionNV)].operands.push(OperandId, \"'Time'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayMotionNV)].operands.push(OperandId, \"'Payload'\");\n        InstructionDesc[enumCast(Op::OpHitObjectTraceRayMotionNV)].setResultAndType(false, false);\n\n        InstructionDesc[enumCast(Op::OpHitObjectGetClusterIdNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectGetClusterIdNV)].setResultAndType(true, true);\n        InstructionDesc[enumCast(Op::OpHitObjectGetSpherePositionNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectGetSpherePositionNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpHitObjectGetSphereRadiusNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectGetSphereRadiusNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpHitObjectGetLSSPositionsNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectGetLSSPositionsNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpHitObjectGetLSSRadiiNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectGetLSSRadiiNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpHitObjectIsSphereHitNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectIsSphereHitNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpHitObjectIsLSSHitNV)].operands.push(OperandId, \"'HitObject'\");\n        InstructionDesc[enumCast(Op::OpHitObjectIsLSSHitNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpFetchMicroTriangleVertexBarycentricNV)].operands.push(OperandId, \"'Acceleration Structure'\");\n        InstructionDesc[enumCast(Op::OpFetchMicroTriangleVertexBarycentricNV)].operands.push(OperandId, \"'Instance ID'\");\n        InstructionDesc[enumCast(Op::OpFetchMicroTriangleVertexBarycentricNV)].operands.push(OperandId, \"'Geometry Index'\");\n        InstructionDesc[enumCast(Op::OpFetchMicroTriangleVertexBarycentricNV)].operands.push(OperandId, \"'Primitive Index'\");\n        InstructionDesc[enumCast(Op::OpFetchMicroTriangleVertexBarycentricNV)].operands.push(OperandId, \"'Barycentrics'\");\n        InstructionDesc[enumCast(Op::OpFetchMicroTriangleVertexBarycentricNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpFetchMicroTriangleVertexPositionNV)].operands.push(OperandId, \"'Acceleration Structure'\");\n        InstructionDesc[enumCast(Op::OpFetchMicroTriangleVertexPositionNV)].operands.push(OperandId, \"'Instance ID'\");\n        InstructionDesc[enumCast(Op::OpFetchMicroTriangleVertexPositionNV)].operands.push(OperandId, \"'Geometry Index'\");\n        InstructionDesc[enumCast(Op::OpFetchMicroTriangleVertexPositionNV)].operands.push(OperandId, \"'Primitive Index'\");\n        InstructionDesc[enumCast(Op::OpFetchMicroTriangleVertexPositionNV)].operands.push(OperandId, \"'Barycentrics'\");\n        InstructionDesc[enumCast(Op::OpFetchMicroTriangleVertexPositionNV)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpColorAttachmentReadEXT)].operands.push(OperandId, \"'Attachment'\");\n        InstructionDesc[enumCast(Op::OpColorAttachmentReadEXT)].operands.push(OperandId, \"'Sample'\", true);\n        InstructionDesc[enumCast(Op::OpStencilAttachmentReadEXT)].operands.push(OperandId, \"'Sample'\", true);\n        InstructionDesc[enumCast(Op::OpDepthAttachmentReadEXT)].operands.push(OperandId, \"'Sample'\", true);\n\n        InstructionDesc[enumCast(Op::OpImageSampleWeightedQCOM)].operands.push(OperandId, \"'source texture'\");\n        InstructionDesc[enumCast(Op::OpImageSampleWeightedQCOM)].operands.push(OperandId, \"'texture coordinates'\");\n        InstructionDesc[enumCast(Op::OpImageSampleWeightedQCOM)].operands.push(OperandId, \"'weights texture'\");\n        InstructionDesc[enumCast(Op::OpImageSampleWeightedQCOM)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageSampleWeightedQCOM)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpImageBoxFilterQCOM)].operands.push(OperandId, \"'source texture'\");\n        InstructionDesc[enumCast(Op::OpImageBoxFilterQCOM)].operands.push(OperandId, \"'texture coordinates'\");\n        InstructionDesc[enumCast(Op::OpImageBoxFilterQCOM)].operands.push(OperandId, \"'box size'\");\n        InstructionDesc[enumCast(Op::OpImageBoxFilterQCOM)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageBoxFilterQCOM)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpImageBlockMatchSADQCOM)].operands.push(OperandId, \"'target texture'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchSADQCOM)].operands.push(OperandId, \"'target coordinates'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchSADQCOM)].operands.push(OperandId, \"'reference texture'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchSADQCOM)].operands.push(OperandId, \"'reference coordinates'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchSADQCOM)].operands.push(OperandId, \"'block size'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchSADQCOM)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageBlockMatchSADQCOM)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpImageBlockMatchSSDQCOM)].operands.push(OperandId, \"'target texture'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchSSDQCOM)].operands.push(OperandId, \"'target coordinates'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchSSDQCOM)].operands.push(OperandId, \"'reference texture'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchSSDQCOM)].operands.push(OperandId, \"'reference coordinates'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchSSDQCOM)].operands.push(OperandId, \"'block size'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchSSDQCOM)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageBlockMatchSSDQCOM)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpImageBlockMatchWindowSSDQCOM)].operands.push(OperandId, \"'target texture'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchWindowSSDQCOM)].operands.push(OperandId, \"'target coordinates'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchWindowSSDQCOM)].operands.push(OperandId, \"'reference texture'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchWindowSSDQCOM)].operands.push(OperandId, \"'reference coordinates'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchWindowSSDQCOM)].operands.push(OperandId, \"'block size'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchWindowSSDQCOM)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageBlockMatchWindowSSDQCOM)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpImageBlockMatchWindowSADQCOM)].operands.push(OperandId, \"'target texture'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchWindowSADQCOM)].operands.push(OperandId, \"'target coordinates'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchWindowSADQCOM)].operands.push(OperandId, \"'reference texture'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchWindowSADQCOM)].operands.push(OperandId, \"'reference coordinates'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchWindowSADQCOM)].operands.push(OperandId, \"'block size'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchWindowSADQCOM)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageBlockMatchWindowSADQCOM)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpImageBlockMatchGatherSSDQCOM)].operands.push(OperandId, \"'target texture'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchGatherSSDQCOM)].operands.push(OperandId, \"'target coordinates'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchGatherSSDQCOM)].operands.push(OperandId, \"'reference texture'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchGatherSSDQCOM)].operands.push(OperandId, \"'reference coordinates'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchGatherSSDQCOM)].operands.push(OperandId, \"'block size'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchGatherSSDQCOM)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageBlockMatchGatherSSDQCOM)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpImageBlockMatchGatherSADQCOM)].operands.push(OperandId, \"'target texture'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchGatherSADQCOM)].operands.push(OperandId, \"'target coordinates'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchGatherSADQCOM)].operands.push(OperandId, \"'reference texture'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchGatherSADQCOM)].operands.push(OperandId, \"'reference coordinates'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchGatherSADQCOM)].operands.push(OperandId, \"'block size'\");\n        InstructionDesc[enumCast(Op::OpImageBlockMatchGatherSADQCOM)].operands.push(OperandImageOperands, \"\", true);\n        InstructionDesc[enumCast(Op::OpImageBlockMatchGatherSADQCOM)].setResultAndType(true, true);\n\n        InstructionDesc[enumCast(Op::OpConstantCompositeReplicateEXT)].operands.push(OperandId, \"'Value'\");\n        InstructionDesc[enumCast(Op::OpSpecConstantCompositeReplicateEXT)].operands.push(OperandId, \"'Value'\");\n        InstructionDesc[enumCast(Op::OpCompositeConstructReplicateEXT)].operands.push(OperandId, \"'Value'\");\n\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixConvertNV)].operands.push(OperandId, \"'Value'\");\n\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixTransposeNV)].operands.push(OperandId, \"'Matrix'\");\n\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixReduceNV)].operands.push(OperandId, \"'Matrix'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixReduceNV)].operands.push(OperandLiteralNumber, \"'ReduceMask'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixReduceNV)].operands.push(OperandId, \"'CombineFunc'\");\n\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixPerElementOpNV)].operands.push(OperandId, \"'Matrix'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixPerElementOpNV)].operands.push(OperandId, \"'Operation'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixPerElementOpNV)].operands.push(OperandVariableIds, \"'Operands'\");\n\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixLoadTensorNV)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixLoadTensorNV)].operands.push(OperandId, \"'Object'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixLoadTensorNV)].operands.push(OperandId, \"'TensorLayout'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixLoadTensorNV)].operands.push(OperandMemoryAccess, \"'Memory Access'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixLoadTensorNV)].operands.push(OperandTensorAddressingOperands, \"'Tensor Addressing Operands'\");\n\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixStoreTensorNV)].operands.push(OperandId, \"'Pointer'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixStoreTensorNV)].operands.push(OperandId, \"'Object'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixStoreTensorNV)].operands.push(OperandId, \"'TensorLayout'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixStoreTensorNV)].operands.push(OperandMemoryAccess, \"'Memory Access'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixStoreTensorNV)].operands.push(OperandTensorAddressingOperands, \"'Tensor Addressing Operands'\");\n\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixReduceNV)].operands.push(OperandId, \"'Matrix'\");\n        InstructionDesc[enumCast(Op::OpCooperativeMatrixReduceNV)].operands.push(OperandLiteralNumber, \"'ReduceMask'\");\n\n        InstructionDesc[enumCast(Op::OpTypeTensorLayoutNV)].operands.push(OperandId, \"'Dim'\");\n        InstructionDesc[enumCast(Op::OpTypeTensorLayoutNV)].operands.push(OperandId, \"'ClampMode'\");\n\n        InstructionDesc[enumCast(Op::OpTypeTensorViewNV)].operands.push(OperandId, \"'Dim'\");\n        InstructionDesc[enumCast(Op::OpTypeTensorViewNV)].operands.push(OperandId, \"'HasDimensions'\");\n        InstructionDesc[enumCast(Op::OpTypeTensorViewNV)].operands.push(OperandVariableIds, \"'p'\");\n\n        InstructionDesc[enumCast(Op::OpTensorLayoutSetBlockSizeNV)].operands.push(OperandId, \"'TensorLayout'\");\n        InstructionDesc[enumCast(Op::OpTensorLayoutSetBlockSizeNV)].operands.push(OperandVariableIds, \"'BlockSize'\");\n\n        InstructionDesc[enumCast(Op::OpTensorLayoutSetDimensionNV)].operands.push(OperandId, \"'TensorLayout'\");\n        InstructionDesc[enumCast(Op::OpTensorLayoutSetDimensionNV)].operands.push(OperandVariableIds, \"'Dim'\");\n\n        InstructionDesc[enumCast(Op::OpTensorLayoutSetStrideNV)].operands.push(OperandId, \"'TensorLayout'\");\n        InstructionDesc[enumCast(Op::OpTensorLayoutSetStrideNV)].operands.push(OperandVariableIds, \"'Stride'\");\n\n        InstructionDesc[enumCast(Op::OpTensorLayoutSliceNV)].operands.push(OperandId, \"'TensorLayout'\");\n        InstructionDesc[enumCast(Op::OpTensorLayoutSliceNV)].operands.push(OperandVariableIds, \"'Operands'\");\n\n        InstructionDesc[enumCast(Op::OpTensorLayoutSetClampValueNV)].operands.push(OperandId, \"'TensorLayout'\");\n        InstructionDesc[enumCast(Op::OpTensorLayoutSetClampValueNV)].operands.push(OperandId, \"'Value'\");\n\n        InstructionDesc[enumCast(Op::OpTensorViewSetDimensionNV)].operands.push(OperandId, \"'TensorView'\");\n        InstructionDesc[enumCast(Op::OpTensorViewSetDimensionNV)].operands.push(OperandVariableIds, \"'Dim'\");\n\n        InstructionDesc[enumCast(Op::OpTensorViewSetStrideNV)].operands.push(OperandId, \"'TensorView'\");\n        InstructionDesc[enumCast(Op::OpTensorViewSetStrideNV)].operands.push(OperandVariableIds, \"'Stride'\");\n\n        InstructionDesc[enumCast(Op::OpTensorViewSetClipNV)].operands.push(OperandId, \"'TensorView'\");\n        InstructionDesc[enumCast(Op::OpTensorViewSetClipNV)].operands.push(OperandId, \"'ClipRowOffset'\");\n        InstructionDesc[enumCast(Op::OpTensorViewSetClipNV)].operands.push(OperandId, \"'ClipRowSpan'\");\n        InstructionDesc[enumCast(Op::OpTensorViewSetClipNV)].operands.push(OperandId, \"'ClipColOffset'\");\n        InstructionDesc[enumCast(Op::OpTensorViewSetClipNV)].operands.push(OperandId, \"'ClipColSpan'\");\n\n        InstructionDesc[enumCast(Op::OpSDotKHR)].operands.push(OperandId, \"'Vector1'\");\n        InstructionDesc[enumCast(Op::OpSDotKHR)].operands.push(OperandId, \"'Vector2'\");\n        InstructionDesc[enumCast(Op::OpSDotKHR)].operands.push(OperandLiteralNumber, \"'PackedVectorFormat'\");\n\n        InstructionDesc[enumCast(Op::OpUDotKHR)].operands.push(OperandId, \"'Vector1'\");\n        InstructionDesc[enumCast(Op::OpUDotKHR)].operands.push(OperandId, \"'Vector2'\");\n        InstructionDesc[enumCast(Op::OpUDotKHR)].operands.push(OperandLiteralNumber, \"'PackedVectorFormat'\");\n\n        InstructionDesc[enumCast(Op::OpSUDotKHR)].operands.push(OperandId, \"'Vector1'\");\n        InstructionDesc[enumCast(Op::OpSUDotKHR)].operands.push(OperandId, \"'Vector2'\");\n        InstructionDesc[enumCast(Op::OpSUDotKHR)].operands.push(OperandLiteralNumber, \"'PackedVectorFormat'\");\n\n        InstructionDesc[enumCast(Op::OpSDotAccSatKHR)].operands.push(OperandId, \"'Vector1'\");\n        InstructionDesc[enumCast(Op::OpSDotAccSatKHR)].operands.push(OperandId, \"'Vector2'\");\n        InstructionDesc[enumCast(Op::OpSDotAccSatKHR)].operands.push(OperandId, \"'Accumulator'\");\n        InstructionDesc[enumCast(Op::OpSDotAccSatKHR)].operands.push(OperandLiteralNumber, \"'PackedVectorFormat'\");\n\n        InstructionDesc[enumCast(Op::OpUDotAccSatKHR)].operands.push(OperandId, \"'Vector1'\");\n        InstructionDesc[enumCast(Op::OpUDotAccSatKHR)].operands.push(OperandId, \"'Vector2'\");\n        InstructionDesc[enumCast(Op::OpUDotAccSatKHR)].operands.push(OperandId, \"'Accumulator'\");\n        InstructionDesc[enumCast(Op::OpUDotAccSatKHR)].operands.push(OperandLiteralNumber, \"'PackedVectorFormat'\");\n\n        InstructionDesc[enumCast(Op::OpSUDotAccSatKHR)].operands.push(OperandId, \"'Vector1'\");\n        InstructionDesc[enumCast(Op::OpSUDotAccSatKHR)].operands.push(OperandId, \"'Vector2'\");\n        InstructionDesc[enumCast(Op::OpSUDotAccSatKHR)].operands.push(OperandId, \"'Accumulator'\");\n        InstructionDesc[enumCast(Op::OpSUDotAccSatKHR)].operands.push(OperandLiteralNumber, \"'PackedVectorFormat'\");\n    });\n}\n\n} // end spv namespace\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/doc.h",
    "content": "//\n// Copyright (C) 2014-2015 LunarG, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Parameterize the SPIR-V enumerants.\n//\n\n#pragma once\n\n#include \"spirv.hpp11\"\n\n#include <vector>\n\nnamespace spv {\n\n// Fill in all the parameters\nvoid Parameterize();\n\n// Return the English names of all the enums.\nconst char* SourceString(int);\nconst char* AddressingString(int);\nconst char* MemoryString(int);\nconst char* ExecutionModelString(int);\nconst char* ExecutionModeString(int);\nconst char* StorageClassString(int);\nconst char* DecorationString(int);\nconst char* BuiltInString(int);\nconst char* DimensionString(int);\nconst char* SelectControlString(int);\nconst char* LoopControlString(int);\nconst char* FunctionControlString(int);\nconst char* SamplerAddressingModeString(int);\nconst char* SamplerFilterModeString(int);\nconst char* ImageFormatString(int);\nconst char* ImageChannelOrderString(int);\nconst char* ImageChannelTypeString(int);\nconst char* ImageChannelDataTypeString(int type);\nconst char* ImageOperandsString(int format);\nconst char* ImageOperands(int);\nconst char* FPFastMathString(int);\nconst char* FPRoundingModeString(int);\nconst char* LinkageTypeString(int);\nconst char* FuncParamAttrString(int);\nconst char* AccessQualifierString(int);\nconst char* MemorySemanticsString(int);\nconst char* MemoryAccessString(int);\nconst char* ExecutionScopeString(int);\nconst char* GroupOperationString(int);\nconst char* KernelEnqueueFlagsString(int);\nconst char* KernelProfilingInfoString(int);\nconst char* CapabilityString(int);\nconst char* OpcodeString(int);\nconst char* ScopeString(int mem);\n\n// For grouping opcodes into subsections\nenum OpcodeClass {\n    OpClassMisc,\n    OpClassDebug,\n    OpClassAnnotate,\n    OpClassExtension,\n    OpClassMode,\n    OpClassType,\n    OpClassConstant,\n    OpClassMemory,\n    OpClassFunction,\n    OpClassImage,\n    OpClassConvert,\n    OpClassComposite,\n    OpClassArithmetic,\n    OpClassBit,\n    OpClassRelationalLogical,\n    OpClassDerivative,\n    OpClassFlowControl,\n    OpClassAtomic,\n    OpClassPrimitive,\n    OpClassBarrier,\n    OpClassGroup,\n    OpClassDeviceSideEnqueue,\n    OpClassPipe,\n\n    OpClassCount,\n    OpClassMissing             // all instructions start out as missing\n};\n\n// For parameterizing operands.\nenum OperandClass {\n    OperandNone,\n    OperandId,\n    OperandVariableIds,\n    OperandOptionalLiteral,\n    OperandOptionalLiteralString,\n    OperandVariableLiterals,\n    OperandVariableIdLiteral,\n    OperandVariableLiteralId,\n    OperandLiteralNumber,\n    OperandLiteralString,\n    OperandVariableLiteralStrings,\n    OperandSource,\n    OperandExecutionModel,\n    OperandAddressing,\n    OperandMemory,\n    OperandExecutionMode,\n    OperandStorage,\n    OperandDimensionality,\n    OperandSamplerAddressingMode,\n    OperandSamplerFilterMode,\n    OperandSamplerImageFormat,\n    OperandImageChannelOrder,\n    OperandImageChannelDataType,\n    OperandImageOperands,\n    OperandFPFastMath,\n    OperandFPRoundingMode,\n    OperandLinkageType,\n    OperandAccessQualifier,\n    OperandFuncParamAttr,\n    OperandDecoration,\n    OperandBuiltIn,\n    OperandSelect,\n    OperandLoop,\n    OperandFunction,\n    OperandMemorySemantics,\n    OperandMemoryAccess,\n    OperandScope,\n    OperandGroupOperation,\n    OperandKernelEnqueueFlags,\n    OperandKernelProfilingInfo,\n    OperandCapability,\n    OperandCooperativeMatrixOperands,\n    OperandTensorAddressingOperands,\n\n    OperandOpcode,\n\n    OperandCount\n};\n\n// Any specific enum can have a set of capabilities that allow it:\ntypedef std::vector<Capability> EnumCaps;\n\n// Parameterize a set of operands with their OperandClass(es) and descriptions.\nclass OperandParameters {\npublic:\n    OperandParameters() { }\n    void push(OperandClass oc, const char* d, bool opt = false)\n    {\n        opClass.push_back(oc);\n        desc.push_back(d);\n        optional.push_back(opt);\n    }\n    void setOptional();\n    OperandClass getClass(int op) const { return opClass[op]; }\n    const char* getDesc(int op) const { return desc[op]; }\n    bool isOptional(int op) const { return optional[op]; }\n    int getNum() const { return (int)opClass.size(); }\n\nprotected:\n    std::vector<OperandClass> opClass;\n    std::vector<const char*> desc;\n    std::vector<bool> optional;\n};\n\n// Parameterize an enumerant\nclass EnumParameters {\npublic:\n    EnumParameters() : desc(nullptr) { }\n    const char* desc;\n};\n\n// Parameterize a set of enumerants that form an enum\nclass EnumDefinition : public EnumParameters {\npublic:\n    EnumDefinition() :\n        ceiling(0), bitmask(false), getName(nullptr), enumParams(nullptr), operandParams(nullptr) { }\n    void set(int ceil, const char* (*name)(int), EnumParameters* ep, bool mask = false)\n    {\n        ceiling = ceil;\n        getName = name;\n        bitmask = mask;\n        enumParams = ep;\n    }\n    void setOperands(OperandParameters* op) { operandParams = op; }\n    int ceiling;   // ceiling of enumerants\n    bool bitmask;  // true if these enumerants combine into a bitmask\n    const char* (*getName)(int);      // a function that returns the name for each enumerant value (or shift)\n    EnumParameters* enumParams;       // parameters for each individual enumerant\n    OperandParameters* operandParams; // sets of operands\n};\n\n// Parameterize an instruction's logical format, including its known set of operands,\n// per OperandParameters above.\nclass InstructionParameters {\npublic:\n    InstructionParameters() :\n        opDesc(\"TBD\"),\n        opClass(OpClassMissing),\n        typePresent(true),         // most normal, only exceptions have to be spelled out\n        resultPresent(true)        // most normal, only exceptions have to be spelled out\n    { }\n\n    void setResultAndType(bool r, bool t)\n    {\n        resultPresent = r;\n        typePresent = t;\n    }\n\n    bool hasResult() const { return resultPresent != 0; }\n    bool hasType()   const { return typePresent != 0; }\n\n    const char* opDesc;\n    OpcodeClass opClass;\n    OperandParameters operands;\n\nprotected:\n    bool typePresent   : 1;\n    bool resultPresent : 1;\n};\n\n// The set of objects that hold all the instruction/operand\n// parameterization information.\nextern InstructionParameters InstructionDesc[];\n\n// These hold definitions of the enumerants used for operands\nextern EnumDefinition OperandClassParams[];\n\nconst char* GetOperandDesc(OperandClass operand);\nvoid PrintImmediateRow(int imm, const char* name, const EnumParameters* enumParams, bool caps, bool hex = false);\nconst char* AccessQualifierString(int attr);\n\nvoid PrintOperands(const OperandParameters& operands, int reservedOperands);\n\n}  // end namespace spv\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/hex_float.h",
    "content": "// Copyright (c) 2015-2016 The Khronos Group Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#ifndef LIBSPIRV_UTIL_HEX_FLOAT_H_\n#define LIBSPIRV_UTIL_HEX_FLOAT_H_\n\n#include <cassert>\n#include <cctype>\n#include <cmath>\n#include <cstdint>\n#include <iomanip>\n#include <limits>\n#include <sstream>\n\n#include \"bitutils.h\"\n\nnamespace spvutils {\n\nclass Float16 {\n public:\n  Float16(uint16_t v) : val(v) {}\n  Float16() {}\n  static bool isNan(const Float16& val) {\n    return ((val.val & 0x7C00) == 0x7C00) && ((val.val & 0x3FF) != 0);\n  }\n  // Returns true if the given value is any kind of infinity.\n  static bool isInfinity(const Float16& val) {\n    return ((val.val & 0x7C00) == 0x7C00) && ((val.val & 0x3FF) == 0);\n  }\n  Float16(const Float16& other) { val = other.val; }\n  uint16_t get_value() const { return val; }\n\n  // Returns the maximum normal value.\n  static Float16 max() { return Float16(0x7bff); }\n  // Returns the lowest normal value.\n  static Float16 lowest() { return Float16(0xfbff); }\n\n private:\n  uint16_t val;\n};\n\nclass FloatE5M2 {\n public:\n  FloatE5M2(uint8_t v) : val(v) {}\n  FloatE5M2() {}\n  static bool isNan(const FloatE5M2& val) {\n    return ((val.val & 0x7C) == 0x7C) && ((val.val & 0x3) != 0);\n  }\n  // Returns true if the given value is any kind of infinity.\n  static bool isInfinity(const FloatE5M2& val) {\n    return ((val.val & 0x7C) == 0x7C) && ((val.val & 0x3) == 0);\n  }\n  FloatE5M2(const FloatE5M2& other) { val = other.val; }\n  uint8_t get_value() const { return val; }\n\n  // Returns the maximum normal value.\n  static FloatE5M2 max() { return FloatE5M2(0x7B); }\n  // Returns the lowest normal value.\n  static FloatE5M2 lowest() { return FloatE5M2(0xFB); }\n\n private:\n  uint8_t val;\n};\n\nclass FloatE4M3 {\n public:\n  FloatE4M3(uint8_t v) : val(v) {}\n  FloatE4M3() {}\n  static bool isNan(const FloatE4M3& val) {\n    return (val.val & 0x7F) == 0x7F;\n  }\n  // Returns true if the given value is any kind of infinity.\n  static bool isInfinity(const FloatE4M3&) {\n    return false;\n  }\n  FloatE4M3(const FloatE4M3& other) { val = other.val; }\n  uint8_t get_value() const { return val; }\n\n  // Returns the maximum normal value.\n  static FloatE4M3 max() { return FloatE4M3(0x7E); }\n  // Returns the lowest normal value.\n  static FloatE4M3 lowest() { return FloatE4M3(0xFE); }\n\n private:\n  uint8_t val;\n};\n\n// To specialize this type, you must override uint_type to define\n// an unsigned integer that can fit your floating point type.\n// You must also add a isNan function that returns true if\n// a value is Nan.\ntemplate <typename T>\nstruct FloatProxyTraits {\n  typedef void uint_type;\n};\n\ntemplate <>\nstruct FloatProxyTraits<float> {\n  typedef uint32_t uint_type;\n  static bool isNan(float f) { return std::isnan(f); }\n  // Returns true if the given value is any kind of infinity.\n  static bool isInfinity(float f) { return std::isinf(f); }\n  // Returns the maximum normal value.\n  static float max() { return std::numeric_limits<float>::max(); }\n  // Returns the lowest normal value.\n  static float lowest() { return std::numeric_limits<float>::lowest(); }\n};\n\ntemplate <>\nstruct FloatProxyTraits<double> {\n  typedef uint64_t uint_type;\n  static bool isNan(double f) { return std::isnan(f); }\n  // Returns true if the given value is any kind of infinity.\n  static bool isInfinity(double f) { return std::isinf(f); }\n  // Returns the maximum normal value.\n  static double max() { return std::numeric_limits<double>::max(); }\n  // Returns the lowest normal value.\n  static double lowest() { return std::numeric_limits<double>::lowest(); }\n};\n\ntemplate <>\nstruct FloatProxyTraits<Float16> {\n  typedef uint16_t uint_type;\n  static bool isNan(Float16 f) { return Float16::isNan(f); }\n  // Returns true if the given value is any kind of infinity.\n  static bool isInfinity(Float16 f) { return Float16::isInfinity(f); }\n  // Returns the maximum normal value.\n  static Float16 max() { return Float16::max(); }\n  // Returns the lowest normal value.\n  static Float16 lowest() { return Float16::lowest(); }\n};\n\ntemplate <>\nstruct FloatProxyTraits<FloatE5M2> {\n  typedef uint8_t uint_type;\n  static bool isNan(FloatE5M2 f) { return FloatE5M2::isNan(f); }\n  // Returns true if the given value is any kind of infinity.\n  static bool isInfinity(FloatE5M2 f) { return FloatE5M2::isInfinity(f); }\n  // Returns the maximum normal value.\n  static FloatE5M2 max() { return FloatE5M2::max(); }\n  // Returns the lowest normal value.\n  static FloatE5M2 lowest() { return FloatE5M2::lowest(); }\n};\n\ntemplate <>\nstruct FloatProxyTraits<FloatE4M3> {\n  typedef uint8_t uint_type;\n  static bool isNan(FloatE4M3 f) { return FloatE4M3::isNan(f); }\n  // Returns true if the given value is any kind of infinity.\n  static bool isInfinity(FloatE4M3 f) { return FloatE4M3::isInfinity(f); }\n  // Returns the maximum normal value.\n  static FloatE4M3 max() { return FloatE4M3::max(); }\n  // Returns the lowest normal value.\n  static FloatE4M3 lowest() { return FloatE4M3::lowest(); }\n};\n\n// Since copying a floating point number (especially if it is NaN)\n// does not guarantee that bits are preserved, this class lets us\n// store the type and use it as a float when necessary.\ntemplate <typename T>\nclass FloatProxy {\n public:\n  typedef typename FloatProxyTraits<T>::uint_type uint_type;\n\n  // Since this is to act similar to the normal floats,\n  // do not initialize the data by default.\n  FloatProxy() {}\n\n  // Intentionally non-explicit. This is a proxy type so\n  // implicit conversions allow us to use it more transparently.\n  FloatProxy(T val) { data_ = BitwiseCast<uint_type>(val); }\n\n  // Intentionally non-explicit. This is a proxy type so\n  // implicit conversions allow us to use it more transparently.\n  FloatProxy(uint_type val) { data_ = val; }\n\n  // This is helpful to have and is guaranteed not to stomp bits.\n  FloatProxy<T> operator-() const {\n    return static_cast<uint_type>(data_ ^\n                                  (uint_type(0x1) << (sizeof(T) * 8 - 1)));\n  }\n\n  // Returns the data as a floating point value.\n  T getAsFloat() const { return BitwiseCast<T>(data_); }\n\n  // Returns the raw data.\n  uint_type data() const { return data_; }\n\n  // Returns true if the value represents any type of NaN.\n  bool isNan() { return FloatProxyTraits<T>::isNan(getAsFloat()); }\n  // Returns true if the value represents any type of infinity.\n  bool isInfinity() { return FloatProxyTraits<T>::isInfinity(getAsFloat()); }\n\n  // Returns the maximum normal value.\n  static FloatProxy<T> max() {\n    return FloatProxy<T>(FloatProxyTraits<T>::max());\n  }\n  // Returns the lowest normal value.\n  static FloatProxy<T> lowest() {\n    return FloatProxy<T>(FloatProxyTraits<T>::lowest());\n  }\n\n private:\n  uint_type data_;\n};\n\ntemplate <typename T>\nbool operator==(const FloatProxy<T>& first, const FloatProxy<T>& second) {\n  return first.data() == second.data();\n}\n\n// Reads a FloatProxy value as a normal float from a stream.\ntemplate <typename T>\nstd::istream& operator>>(std::istream& is, FloatProxy<T>& value) {\n  T float_val;\n  is >> float_val;\n  value = FloatProxy<T>(float_val);\n  return is;\n}\n\n// This is an example traits. It is not meant to be used in practice, but will\n// be the default for any non-specialized type.\ntemplate <typename T>\nstruct HexFloatTraits {\n  // Integer type that can store this hex-float.\n  typedef void uint_type;\n  // Signed integer type that can store this hex-float.\n  typedef void int_type;\n  // The numerical type that this HexFloat represents.\n  typedef void underlying_type;\n  // The type needed to construct the underlying type.\n  typedef void native_type;\n  // The number of bits that are actually relevant in the uint_type.\n  // This allows us to deal with, for example, 24-bit values in a 32-bit\n  // integer.\n  static const uint32_t num_used_bits = 0;\n  // Number of bits that represent the exponent.\n  static const uint32_t num_exponent_bits = 0;\n  // Number of bits that represent the fractional part.\n  static const uint32_t num_fraction_bits = 0;\n  // The bias of the exponent. (How much we need to subtract from the stored\n  // value to get the correct value.)\n  static const uint32_t exponent_bias = 0;\n};\n\n// Traits for IEEE float.\n// 1 sign bit, 8 exponent bits, 23 fractional bits.\ntemplate <>\nstruct HexFloatTraits<FloatProxy<float>> {\n  typedef uint32_t uint_type;\n  typedef int32_t int_type;\n  typedef FloatProxy<float> underlying_type;\n  typedef float native_type;\n  static const uint_type num_used_bits = 32;\n  static const uint_type num_exponent_bits = 8;\n  static const uint_type num_fraction_bits = 23;\n  static const uint_type exponent_bias = 127;\n};\n\n// Traits for IEEE double.\n// 1 sign bit, 11 exponent bits, 52 fractional bits.\ntemplate <>\nstruct HexFloatTraits<FloatProxy<double>> {\n  typedef uint64_t uint_type;\n  typedef int64_t int_type;\n  typedef FloatProxy<double> underlying_type;\n  typedef double native_type;\n  static const uint_type num_used_bits = 64;\n  static const uint_type num_exponent_bits = 11;\n  static const uint_type num_fraction_bits = 52;\n  static const uint_type exponent_bias = 1023;\n};\n\n// Traits for IEEE half.\n// 1 sign bit, 5 exponent bits, 10 fractional bits.\ntemplate <>\nstruct HexFloatTraits<FloatProxy<Float16>> {\n  typedef uint16_t uint_type;\n  typedef int16_t int_type;\n  typedef uint16_t underlying_type;\n  typedef uint16_t native_type;\n  static const uint_type num_used_bits = 16;\n  static const uint_type num_exponent_bits = 5;\n  static const uint_type num_fraction_bits = 10;\n  static const uint_type exponent_bias = 15;\n};\n\ntemplate <>\nstruct HexFloatTraits<FloatProxy<FloatE5M2>> {\n  typedef uint8_t uint_type;\n  typedef int8_t int_type;\n  typedef uint8_t underlying_type;\n  typedef uint8_t native_type;\n  static const uint_type num_used_bits = 8;\n  static const uint_type num_exponent_bits = 5;\n  static const uint_type num_fraction_bits = 2;\n  static const uint_type exponent_bias = 15;\n};\n\ntemplate <>\nstruct HexFloatTraits<FloatProxy<FloatE4M3>> {\n  typedef uint8_t uint_type;\n  typedef int8_t int_type;\n  typedef uint8_t underlying_type;\n  typedef uint8_t native_type;\n  static const uint_type num_used_bits = 8;\n  static const uint_type num_exponent_bits = 4;\n  static const uint_type num_fraction_bits = 3;\n  static const uint_type exponent_bias = 7;\n};\n\nenum round_direction {\n  kRoundToZero,\n  kRoundToNearestEven,\n  kRoundToPositiveInfinity,\n  kRoundToNegativeInfinity\n};\n\n// Template class that houses a floating pointer number.\n// It exposes a number of constants based on the provided traits to\n// assist in interpreting the bits of the value.\ntemplate <typename T, typename Traits = HexFloatTraits<T>>\nclass HexFloat {\n public:\n  typedef typename Traits::uint_type uint_type;\n  typedef typename Traits::int_type int_type;\n  typedef typename Traits::underlying_type underlying_type;\n  typedef typename Traits::native_type native_type;\n\n  explicit HexFloat(T f) : value_(f) {}\n\n  T value() const { return value_; }\n  void set_value(T f) { value_ = f; }\n\n  // These are all written like this because it is convenient to have\n  // compile-time constants for all of these values.\n\n  // Pass-through values to save typing.\n  static const uint32_t num_used_bits = Traits::num_used_bits;\n  static const uint32_t exponent_bias = Traits::exponent_bias;\n  static const uint32_t num_exponent_bits = Traits::num_exponent_bits;\n  static const uint32_t num_fraction_bits = Traits::num_fraction_bits;\n\n  // Number of bits to shift left to set the highest relevant bit.\n  static const uint32_t top_bit_left_shift = num_used_bits - 1;\n  // How many nibbles (hex characters) the fractional part takes up.\n  static const uint32_t fraction_nibbles = (num_fraction_bits + 3) / 4;\n  // If the fractional part does not fit evenly into a hex character (4-bits)\n  // then we have to left-shift to get rid of leading 0s. This is the amount\n  // we have to shift (might be 0).\n  static const uint32_t num_overflow_bits =\n      fraction_nibbles * 4 - num_fraction_bits;\n\n  // The representation of the fraction, not the actual bits. This\n  // includes the leading bit that is usually implicit.\n  static const uint_type fraction_represent_mask =\n      spvutils::SetBits<uint_type, 0,\n                        num_fraction_bits + num_overflow_bits>::get;\n\n  // The topmost bit in the nibble-aligned fraction.\n  static const uint_type fraction_top_bit =\n      uint_type(1) << (num_fraction_bits + num_overflow_bits - 1);\n\n  // The least significant bit in the exponent, which is also the bit\n  // immediately to the left of the significand.\n  static const uint_type first_exponent_bit = uint_type(1)\n                                              << (num_fraction_bits);\n\n  // The mask for the encoded fraction. It does not include the\n  // implicit bit.\n  static const uint_type fraction_encode_mask =\n      spvutils::SetBits<uint_type, 0, num_fraction_bits>::get;\n\n  // The bit that is used as a sign.\n  static const uint_type sign_mask = uint_type(1) << top_bit_left_shift;\n\n  // The bits that represent the exponent.\n  static const uint_type exponent_mask =\n      spvutils::SetBits<uint_type, num_fraction_bits, num_exponent_bits>::get;\n\n  // How far left the exponent is shifted.\n  static const uint32_t exponent_left_shift = num_fraction_bits;\n\n  // How far from the right edge the fraction is shifted.\n  static const uint32_t fraction_right_shift =\n      static_cast<uint32_t>(sizeof(uint_type) * 8) - num_fraction_bits;\n\n  // The maximum representable unbiased exponent.\n  static const int_type max_exponent =\n      (exponent_mask >> num_fraction_bits) - exponent_bias;\n  // The minimum representable exponent for normalized numbers.\n  static const int_type min_exponent = -static_cast<int_type>(exponent_bias);\n\n  // Returns the bits associated with the value.\n  uint_type getBits() const { return spvutils::BitwiseCast<uint_type>(value_); }\n\n  // Returns the bits associated with the value, without the leading sign bit.\n  uint_type getUnsignedBits() const {\n    return static_cast<uint_type>(spvutils::BitwiseCast<uint_type>(value_) &\n                                  ~sign_mask);\n  }\n\n  // Returns the bits associated with the exponent, shifted to start at the\n  // lsb of the type.\n  const uint_type getExponentBits() const {\n    return static_cast<uint_type>((getBits() & exponent_mask) >>\n                                  num_fraction_bits);\n  }\n\n  // Returns the exponent in unbiased form. This is the exponent in the\n  // human-friendly form.\n  const int_type getUnbiasedExponent() const {\n    return static_cast<int_type>(getExponentBits() - exponent_bias);\n  }\n\n  // Returns just the significand bits from the value.\n  const uint_type getSignificandBits() const {\n    return getBits() & fraction_encode_mask;\n  }\n\n  // If the number was normalized, returns the unbiased exponent.\n  // If the number was denormal, normalize the exponent first.\n  const int_type getUnbiasedNormalizedExponent() const {\n    if ((getBits() & ~sign_mask) == 0) {  // special case if everything is 0\n      return 0;\n    }\n    int_type exp = getUnbiasedExponent();\n    if (exp == min_exponent) {  // We are in denorm land.\n      uint_type significand_bits = getSignificandBits();\n      while ((significand_bits & (first_exponent_bit >> 1)) == 0) {\n        significand_bits = static_cast<uint_type>(significand_bits << 1);\n        exp = static_cast<int_type>(exp - 1);\n      }\n      significand_bits &= fraction_encode_mask;\n    }\n    return exp;\n  }\n\n  // Returns the signficand after it has been normalized.\n  const uint_type getNormalizedSignificand() const {\n    int_type unbiased_exponent = getUnbiasedNormalizedExponent();\n    uint_type significand = getSignificandBits();\n    for (int_type i = unbiased_exponent; i <= min_exponent; ++i) {\n      significand = static_cast<uint_type>(significand << 1);\n    }\n    significand &= fraction_encode_mask;\n    return significand;\n  }\n\n  // Returns true if this number represents a negative value.\n  bool isNegative() const { return (getBits() & sign_mask) != 0; }\n\n  // Sets this HexFloat from the individual components.\n  // Note this assumes EVERY significand is normalized, and has an implicit\n  // leading one. This means that the only way that this method will set 0,\n  // is if you set a number so denormalized that it underflows.\n  // Do not use this method with raw bits extracted from a subnormal number,\n  // since subnormals do not have an implicit leading 1 in the significand.\n  // The significand is also expected to be in the\n  // lowest-most num_fraction_bits of the uint_type.\n  // The exponent is expected to be unbiased, meaning an exponent of\n  // 0 actually means 0.\n  // If underflow_round_up is set, then on underflow, if a number is non-0\n  // and would underflow, we round up to the smallest denorm.\n  void setFromSignUnbiasedExponentAndNormalizedSignificand(\n      bool negative, int_type exponent, uint_type significand,\n      bool round_denorm_up) {\n    bool significand_is_zero = significand == 0;\n\n    if (exponent <= min_exponent) {\n      // If this was denormalized, then we have to shift the bit on, meaning\n      // the significand is not zero.\n      significand_is_zero = false;\n      significand |= first_exponent_bit;\n      significand = static_cast<uint_type>(significand >> 1);\n    }\n\n    while (exponent < min_exponent) {\n      significand = static_cast<uint_type>(significand >> 1);\n      ++exponent;\n    }\n\n    if (exponent == min_exponent) {\n      if (significand == 0 && !significand_is_zero && round_denorm_up) {\n        significand = static_cast<uint_type>(0x1);\n      }\n    }\n\n    uint_type new_value = 0;\n    if (negative) {\n      new_value = static_cast<uint_type>(new_value | sign_mask);\n    }\n    exponent = static_cast<int_type>(exponent + exponent_bias);\n    assert(exponent >= 0);\n\n    // put it all together\n    exponent = static_cast<uint_type>((exponent << exponent_left_shift) &\n                                      exponent_mask);\n    significand = static_cast<uint_type>(significand & fraction_encode_mask);\n    new_value = static_cast<uint_type>(new_value | (exponent | significand));\n    value_ = BitwiseCast<T>(new_value);\n  }\n\n  // Increments the significand of this number by the given amount.\n  // If this would spill the significand into the implicit bit,\n  // carry is set to true and the significand is shifted to fit into\n  // the correct location, otherwise carry is set to false.\n  // All significands and to_increment are assumed to be within the bounds\n  // for a valid significand.\n  static uint_type incrementSignificand(uint_type significand,\n                                        uint_type to_increment, bool* carry) {\n    significand = static_cast<uint_type>(significand + to_increment);\n    *carry = false;\n    if (significand & first_exponent_bit) {\n      *carry = true;\n      // The implicit 1-bit will have carried, so we should zero-out the\n      // top bit and shift back.\n      significand = static_cast<uint_type>(significand & ~first_exponent_bit);\n      significand = static_cast<uint_type>(significand >> 1);\n    }\n    return significand;\n  }\n\n  // These exist because MSVC throws warnings on negative right-shifts\n  // even if they are not going to be executed. Eg:\n  // constant_number < 0? 0: constant_number\n  // These convert the negative left-shifts into right shifts.\n\n  template <typename int_type>\n  uint_type negatable_left_shift(int_type N, uint_type val)\n  {\n    if(N >= 0)\n      return val << N;\n\n    return val >> -N;\n  }\n\n  template <typename int_type>\n  uint_type negatable_right_shift(int_type N, uint_type val)\n  {\n    if(N >= 0)\n      return val >> N;\n\n    return val << -N;\n  }\n\n  // Returns the significand, rounded to fit in a significand in\n  // other_T. This is shifted so that the most significant\n  // bit of the rounded number lines up with the most significant bit\n  // of the returned significand.\n  template <typename other_T>\n  typename other_T::uint_type getRoundedNormalizedSignificand(\n      round_direction dir, bool* carry_bit) {\n    typedef typename other_T::uint_type other_uint_type;\n    static const int_type num_throwaway_bits =\n        static_cast<int_type>(num_fraction_bits) -\n        static_cast<int_type>(other_T::num_fraction_bits);\n\n    static const uint_type last_significant_bit =\n        (num_throwaway_bits < 0)\n            ? 0\n            : negatable_left_shift(num_throwaway_bits, 1u);\n    static const uint_type first_rounded_bit =\n        (num_throwaway_bits < 1)\n            ? 0\n            : negatable_left_shift(num_throwaway_bits - 1, 1u);\n\n    static const uint_type throwaway_mask_bits =\n        num_throwaway_bits > 0 ? num_throwaway_bits : 0;\n    static const uint_type throwaway_mask =\n        spvutils::SetBits<uint_type, 0, throwaway_mask_bits>::get;\n\n    *carry_bit = false;\n    other_uint_type out_val = 0;\n    uint_type significand = getNormalizedSignificand();\n    // If we are up-casting, then we just have to shift to the right location.\n    if (num_throwaway_bits <= 0) {\n      out_val = static_cast<other_uint_type>(significand);\n      uint_type shift_amount = static_cast<uint_type>(-num_throwaway_bits);\n      out_val = static_cast<other_uint_type>(out_val << shift_amount);\n      return out_val;\n    }\n\n    // If every non-representable bit is 0, then we don't have any casting to\n    // do.\n    if ((significand & throwaway_mask) == 0) {\n      return static_cast<other_uint_type>(\n          negatable_right_shift(num_throwaway_bits, significand));\n    }\n\n    bool round_away_from_zero = false;\n    // We actually have to narrow the significand here, so we have to follow the\n    // rounding rules.\n    switch (dir) {\n      case kRoundToZero:\n        break;\n      case kRoundToPositiveInfinity:\n        round_away_from_zero = !isNegative();\n        break;\n      case kRoundToNegativeInfinity:\n        round_away_from_zero = isNegative();\n        break;\n      case kRoundToNearestEven:\n        // Have to round down, round bit is 0\n        if ((first_rounded_bit & significand) == 0) {\n          break;\n        }\n        if (((significand & throwaway_mask) & ~first_rounded_bit) != 0) {\n          // If any subsequent bit of the rounded portion is non-0 then we round\n          // up.\n          round_away_from_zero = true;\n          break;\n        }\n        // We are exactly half-way between 2 numbers, pick even.\n        if ((significand & last_significant_bit) != 0) {\n          // 1 for our last bit, round up.\n          round_away_from_zero = true;\n          break;\n        }\n        break;\n    }\n\n    if (round_away_from_zero) {\n      return static_cast<other_uint_type>(\n          negatable_right_shift(num_throwaway_bits, incrementSignificand(\n              significand, last_significant_bit, carry_bit)));\n    } else {\n      return static_cast<other_uint_type>(\n          negatable_right_shift(num_throwaway_bits, significand));\n    }\n  }\n\n  // Casts this value to another HexFloat. If the cast is widening,\n  // then round_dir is ignored. If the cast is narrowing, then\n  // the result is rounded in the direction specified.\n  // This number will retain Nan and Inf values.\n  // It will also saturate to Inf if the number overflows, and\n  // underflow to (0 or min depending on rounding) if the number underflows.\n  template <typename other_T>\n  void castTo(other_T& other, round_direction round_dir) {\n    other = other_T(static_cast<typename other_T::native_type>(0));\n    bool negate = isNegative();\n    if (getUnsignedBits() == 0) {\n      if (negate) {\n        other.set_value(-other.value());\n      }\n      return;\n    }\n    uint_type significand = getSignificandBits();\n    bool carried = false;\n    typename other_T::uint_type rounded_significand =\n        getRoundedNormalizedSignificand<other_T>(round_dir, &carried);\n\n    int_type exponent = getUnbiasedExponent();\n    if (exponent == min_exponent) {\n      // If we are denormal, normalize the exponent, so that we can encode\n      // easily.\n      exponent = static_cast<int_type>(exponent + 1);\n      for (uint_type check_bit = first_exponent_bit >> 1; check_bit != 0;\n           check_bit = static_cast<uint_type>(check_bit >> 1)) {\n        exponent = static_cast<int_type>(exponent - 1);\n        if (check_bit & significand) break;\n      }\n    }\n\n    bool is_nan =\n        (getBits() & exponent_mask) == exponent_mask && significand != 0;\n    bool is_inf =\n        !is_nan &&\n        ((exponent + carried) > static_cast<int_type>(other_T::exponent_bias) ||\n         (significand == 0 && (getBits() & exponent_mask) == exponent_mask));\n\n    // If we are Nan or Inf we should pass that through.\n    if (is_inf) {\n      other.set_value(BitwiseCast<typename other_T::underlying_type>(\n          static_cast<typename other_T::uint_type>(\n              (negate ? other_T::sign_mask : 0) | other_T::exponent_mask)));\n      return;\n    }\n    if (is_nan) {\n      typename other_T::uint_type shifted_significand;\n      shifted_significand = static_cast<typename other_T::uint_type>(\n          negatable_left_shift(\n              static_cast<int_type>(other_T::num_fraction_bits) -\n              static_cast<int_type>(num_fraction_bits), significand));\n\n      // We are some sort of Nan. We try to keep the bit-pattern of the Nan\n      // as close as possible. If we had to shift off bits so we are 0, then we\n      // just set the last bit.\n      other.set_value(BitwiseCast<typename other_T::underlying_type>(\n          static_cast<typename other_T::uint_type>(\n              (negate ? other_T::sign_mask : 0) | other_T::exponent_mask |\n              (shifted_significand == 0 ? 0x1 : shifted_significand))));\n      return;\n    }\n\n    bool round_underflow_up =\n        isNegative() ? round_dir == kRoundToNegativeInfinity\n                     : round_dir == kRoundToPositiveInfinity;\n    typedef typename other_T::int_type other_int_type;\n    // setFromSignUnbiasedExponentAndNormalizedSignificand will\n    // zero out any underflowing value (but retain the sign).\n    other.setFromSignUnbiasedExponentAndNormalizedSignificand(\n        negate, static_cast<other_int_type>(exponent), rounded_significand,\n        round_underflow_up);\n    return;\n  }\n\n private:\n  T value_;\n\n  static_assert(num_used_bits ==\n                    Traits::num_exponent_bits + Traits::num_fraction_bits + 1,\n                \"The number of bits do not fit\");\n  static_assert(sizeof(T) == sizeof(uint_type), \"The type sizes do not match\");\n};\n\n// Returns 4 bits represented by the hex character.\ninline uint8_t get_nibble_from_character(int character) {\n  const char* dec = \"0123456789\";\n  const char* lower = \"abcdef\";\n  const char* upper = \"ABCDEF\";\n  const char* p = nullptr;\n  if ((p = strchr(dec, character))) {\n    return static_cast<uint8_t>(p - dec);\n  } else if ((p = strchr(lower, character))) {\n    return static_cast<uint8_t>(p - lower + 0xa);\n  } else if ((p = strchr(upper, character))) {\n    return static_cast<uint8_t>(p - upper + 0xa);\n  }\n\n  assert(false && \"This was called with a non-hex character\");\n  return 0;\n}\n\n// Outputs the given HexFloat to the stream.\ntemplate <typename T, typename Traits>\nstd::ostream& operator<<(std::ostream& os, const HexFloat<T, Traits>& value) {\n  typedef HexFloat<T, Traits> HF;\n  typedef typename HF::uint_type uint_type;\n  typedef typename HF::int_type int_type;\n\n  static_assert(HF::num_used_bits != 0,\n                \"num_used_bits must be non-zero for a valid float\");\n  static_assert(HF::num_exponent_bits != 0,\n                \"num_exponent_bits must be non-zero for a valid float\");\n  static_assert(HF::num_fraction_bits != 0,\n                \"num_fractin_bits must be non-zero for a valid float\");\n\n  const uint_type bits = spvutils::BitwiseCast<uint_type>(value.value());\n  const char* const sign = (bits & HF::sign_mask) ? \"-\" : \"\";\n  const uint_type exponent = static_cast<uint_type>(\n      (bits & HF::exponent_mask) >> HF::num_fraction_bits);\n\n  uint_type fraction = static_cast<uint_type>((bits & HF::fraction_encode_mask)\n                                              << HF::num_overflow_bits);\n\n  const bool is_zero = exponent == 0 && fraction == 0;\n  const bool is_denorm = exponent == 0 && !is_zero;\n\n  // exponent contains the biased exponent we have to convert it back into\n  // the normal range.\n  int_type int_exponent = static_cast<int_type>(exponent - HF::exponent_bias);\n  // If the number is all zeros, then we actually have to NOT shift the\n  // exponent.\n  int_exponent = is_zero ? 0 : int_exponent;\n\n  // If we are denorm, then start shifting, and decreasing the exponent until\n  // our leading bit is 1.\n\n  if (is_denorm) {\n    while ((fraction & HF::fraction_top_bit) == 0) {\n      fraction = static_cast<uint_type>(fraction << 1);\n      int_exponent = static_cast<int_type>(int_exponent - 1);\n    }\n    // Since this is denormalized, we have to consume the leading 1 since it\n    // will end up being implicit.\n    fraction = static_cast<uint_type>(fraction << 1);  // eat the leading 1\n    fraction &= HF::fraction_represent_mask;\n  }\n\n  uint_type fraction_nibbles = HF::fraction_nibbles;\n  // We do not have to display any trailing 0s, since this represents the\n  // fractional part.\n  while (fraction_nibbles > 0 && (fraction & 0xF) == 0) {\n    // Shift off any trailing values;\n    fraction = static_cast<uint_type>(fraction >> 4);\n    --fraction_nibbles;\n  }\n\n  const auto saved_flags = os.flags();\n  const auto saved_fill = os.fill();\n\n  os << sign << \"0x\" << (is_zero ? '0' : '1');\n  if (fraction_nibbles) {\n    // Make sure to keep the leading 0s in place, since this is the fractional\n    // part.\n    os << \".\" << std::setw(static_cast<int>(fraction_nibbles))\n       << std::setfill('0') << std::hex << fraction;\n  }\n  os << \"p\" << std::dec << (int_exponent >= 0 ? \"+\" : \"\") << int_exponent;\n\n  os.flags(saved_flags);\n  os.fill(saved_fill);\n\n  return os;\n}\n\n// Returns true if negate_value is true and the next character on the\n// input stream is a plus or minus sign.  In that case we also set the fail bit\n// on the stream and set the value to the zero value for its type.\ntemplate <typename T, typename Traits>\ninline bool RejectParseDueToLeadingSign(std::istream& is, bool negate_value,\n                                        HexFloat<T, Traits>& value) {\n  if (negate_value) {\n    auto next_char = is.peek();\n    if (next_char == '-' || next_char == '+') {\n      // Fail the parse.  Emulate standard behaviour by setting the value to\n      // the zero value, and set the fail bit on the stream.\n      value = HexFloat<T, Traits>(typename HexFloat<T, Traits>::uint_type(0));\n      is.setstate(std::ios_base::failbit);\n      return true;\n    }\n  }\n  return false;\n}\n\n// Parses a floating point number from the given stream and stores it into the\n// value parameter.\n// If negate_value is true then the number may not have a leading minus or\n// plus, and if it successfully parses, then the number is negated before\n// being stored into the value parameter.\n// If the value cannot be correctly parsed or overflows the target floating\n// point type, then set the fail bit on the stream.\n// TODO(dneto): Promise C++11 standard behavior in how the value is set in\n// the error case, but only after all target platforms implement it correctly.\n// In particular, the Microsoft C++ runtime appears to be out of spec.\ntemplate <typename T, typename Traits>\ninline std::istream& ParseNormalFloat(std::istream& is, bool negate_value,\n                                      HexFloat<T, Traits>& value) {\n  if (RejectParseDueToLeadingSign(is, negate_value, value)) {\n    return is;\n  }\n  T val;\n  is >> val;\n  if (negate_value) {\n    val = -val;\n  }\n  value.set_value(val);\n  // In the failure case, map -0.0 to 0.0.\n  if (is.fail() && value.getUnsignedBits() == 0u) {\n    value = HexFloat<T, Traits>(typename HexFloat<T, Traits>::uint_type(0));\n  }\n  if (val.isInfinity()) {\n    // Fail the parse.  Emulate standard behaviour by setting the value to\n    // the closest normal value, and set the fail bit on the stream.\n    value.set_value((value.isNegative() || negate_value) ? T::lowest()\n                                                         : T::max());\n    is.setstate(std::ios_base::failbit);\n  }\n  return is;\n}\n\n// Specialization of ParseNormalFloat for FloatProxy<Float16> values.\n// This will parse the float as it were a 32-bit floating point number,\n// and then round it down to fit into a Float16 value.\n// The number is rounded towards zero.\n// If negate_value is true then the number may not have a leading minus or\n// plus, and if it successfully parses, then the number is negated before\n// being stored into the value parameter.\n// If the value cannot be correctly parsed or overflows the target floating\n// point type, then set the fail bit on the stream.\n// TODO(dneto): Promise C++11 standard behavior in how the value is set in\n// the error case, but only after all target platforms implement it correctly.\n// In particular, the Microsoft C++ runtime appears to be out of spec.\ntemplate <>\ninline std::istream&\nParseNormalFloat<FloatProxy<Float16>, HexFloatTraits<FloatProxy<Float16>>>(\n    std::istream& is, bool negate_value,\n    HexFloat<FloatProxy<Float16>, HexFloatTraits<FloatProxy<Float16>>>& value) {\n  // First parse as a 32-bit float.\n  HexFloat<FloatProxy<float>> float_val(0.0f);\n  ParseNormalFloat(is, negate_value, float_val);\n\n  // Then convert to 16-bit float, saturating at infinities, and\n  // rounding toward zero.\n  float_val.castTo(value, kRoundToZero);\n\n  // Overflow on 16-bit behaves the same as for 32- and 64-bit: set the\n  // fail bit and set the lowest or highest value.\n  if (Float16::isInfinity(value.value().getAsFloat())) {\n    value.set_value(value.isNegative() ? Float16::lowest() : Float16::max());\n    is.setstate(std::ios_base::failbit);\n  }\n  return is;\n}\n\n// Reads a HexFloat from the given stream.\n// If the float is not encoded as a hex-float then it will be parsed\n// as a regular float.\n// This may fail if your stream does not support at least one unget.\n// Nan values can be encoded with \"0x1.<not zero>p+exponent_bias\".\n// This would normally overflow a float and round to\n// infinity but this special pattern is the exact representation for a NaN,\n// and therefore is actually encoded as the correct NaN. To encode inf,\n// either 0x0p+exponent_bias can be specified or any exponent greater than\n// exponent_bias.\n// Examples using IEEE 32-bit float encoding.\n//    0x1.0p+128 (+inf)\n//    -0x1.0p-128 (-inf)\n//\n//    0x1.1p+128 (+Nan)\n//    -0x1.1p+128 (-Nan)\n//\n//    0x1p+129 (+inf)\n//    -0x1p+129 (-inf)\ntemplate <typename T, typename Traits>\nstd::istream& operator>>(std::istream& is, HexFloat<T, Traits>& value) {\n  using HF = HexFloat<T, Traits>;\n  using uint_type = typename HF::uint_type;\n  using int_type = typename HF::int_type;\n\n  value.set_value(static_cast<typename HF::native_type>(0.f));\n\n  if (is.flags() & std::ios::skipws) {\n    // If the user wants to skip whitespace , then we should obey that.\n    while (std::isspace(is.peek())) {\n      is.get();\n    }\n  }\n\n  auto next_char = is.peek();\n  bool negate_value = false;\n\n  if (next_char != '-' && next_char != '0') {\n    return ParseNormalFloat(is, negate_value, value);\n  }\n\n  if (next_char == '-') {\n    negate_value = true;\n    is.get();\n    next_char = is.peek();\n  }\n\n  if (next_char == '0') {\n    is.get();  // We may have to unget this.\n    auto maybe_hex_start = is.peek();\n    if (maybe_hex_start != 'x' && maybe_hex_start != 'X') {\n      is.unget();\n      return ParseNormalFloat(is, negate_value, value);\n    } else {\n      is.get();  // Throw away the 'x';\n    }\n  } else {\n    return ParseNormalFloat(is, negate_value, value);\n  }\n\n  // This \"looks\" like a hex-float so treat it as one.\n  bool seen_p = false;\n  bool seen_dot = false;\n  uint_type fraction_index = 0;\n\n  uint_type fraction = 0;\n  int_type exponent = HF::exponent_bias;\n\n  // Strip off leading zeros so we don't have to special-case them later.\n  while ((next_char = is.peek()) == '0') {\n    is.get();\n  }\n\n  bool is_denorm =\n      true;  // Assume denorm \"representation\" until we hear otherwise.\n             // NB: This does not mean the value is actually denorm,\n             // it just means that it was written 0.\n  bool bits_written = false;  // Stays false until we write a bit.\n  while (!seen_p && !seen_dot) {\n    // Handle characters that are left of the fractional part.\n    if (next_char == '.') {\n      seen_dot = true;\n    } else if (next_char == 'p') {\n      seen_p = true;\n    } else if (::isxdigit(next_char)) {\n      // We know this is not denormalized since we have stripped all leading\n      // zeroes and we are not a \".\".\n      is_denorm = false;\n      int number = get_nibble_from_character(next_char);\n      for (int i = 0; i < 4; ++i, number <<= 1) {\n        uint_type write_bit = (number & 0x8) ? 0x1 : 0x0;\n        if (bits_written) {\n          // If we are here the bits represented belong in the fractional\n          // part of the float, and we have to adjust the exponent accordingly.\n          fraction = static_cast<uint_type>(\n              fraction |\n              static_cast<uint_type>(\n                  write_bit << (HF::top_bit_left_shift - fraction_index++)));\n          exponent = static_cast<int_type>(exponent + 1);\n        }\n        bits_written |= write_bit != 0;\n      }\n    } else {\n      // We have not found our exponent yet, so we have to fail.\n      is.setstate(std::ios::failbit);\n      return is;\n    }\n    is.get();\n    next_char = is.peek();\n  }\n  bits_written = false;\n  while (seen_dot && !seen_p) {\n    // Handle only fractional parts now.\n    if (next_char == 'p') {\n      seen_p = true;\n    } else if (::isxdigit(next_char)) {\n      int number = get_nibble_from_character(next_char);\n      for (int i = 0; i < 4; ++i, number <<= 1) {\n        uint_type write_bit = (number & 0x8) ? 0x01 : 0x00;\n        bits_written |= write_bit != 0;\n        if (is_denorm && !bits_written) {\n          // Handle modifying the exponent here this way we can handle\n          // an arbitrary number of hex values without overflowing our\n          // integer.\n          exponent = static_cast<int_type>(exponent - 1);\n        } else {\n          fraction = static_cast<uint_type>(\n              fraction |\n              static_cast<uint_type>(\n                  write_bit << (HF::top_bit_left_shift - fraction_index++)));\n        }\n      }\n    } else {\n      // We still have not found our 'p' exponent yet, so this is not a valid\n      // hex-float.\n      is.setstate(std::ios::failbit);\n      return is;\n    }\n    is.get();\n    next_char = is.peek();\n  }\n\n  bool seen_sign = false;\n  int8_t exponent_sign = 1;\n  int_type written_exponent = 0;\n  while (true) {\n    if ((next_char == '-' || next_char == '+')) {\n      if (seen_sign) {\n        is.setstate(std::ios::failbit);\n        return is;\n      }\n      seen_sign = true;\n      exponent_sign = (next_char == '-') ? -1 : 1;\n    } else if (::isdigit(next_char)) {\n      // Hex-floats express their exponent as decimal.\n      written_exponent = static_cast<int_type>(written_exponent * 10);\n      written_exponent =\n          static_cast<int_type>(written_exponent + (next_char - '0'));\n    } else {\n      break;\n    }\n    is.get();\n    next_char = is.peek();\n  }\n\n  written_exponent = static_cast<int_type>(written_exponent * exponent_sign);\n  exponent = static_cast<int_type>(exponent + written_exponent);\n\n  bool is_zero = is_denorm && (fraction == 0);\n  if (is_denorm && !is_zero) {\n    fraction = static_cast<uint_type>(fraction << 1);\n    exponent = static_cast<int_type>(exponent - 1);\n  } else if (is_zero) {\n    exponent = 0;\n  }\n\n  if (exponent <= 0 && !is_zero) {\n    fraction = static_cast<uint_type>(fraction >> 1);\n    fraction |= static_cast<uint_type>(1) << HF::top_bit_left_shift;\n  }\n\n  fraction = (fraction >> HF::fraction_right_shift) & HF::fraction_encode_mask;\n\n  const int_type max_exponent =\n      SetBits<uint_type, 0, HF::num_exponent_bits>::get;\n\n  // Handle actual denorm numbers\n  while (exponent < 0 && !is_zero) {\n    fraction = static_cast<uint_type>(fraction >> 1);\n    exponent = static_cast<int_type>(exponent + 1);\n\n    fraction &= HF::fraction_encode_mask;\n    if (fraction == 0) {\n      // We have underflowed our fraction. We should clamp to zero.\n      is_zero = true;\n      exponent = 0;\n    }\n  }\n\n  // We have overflowed so we should be inf/-inf.\n  if (exponent > max_exponent) {\n    exponent = max_exponent;\n    fraction = 0;\n  }\n\n  uint_type output_bits = static_cast<uint_type>(\n      static_cast<uint_type>(negate_value ? 1 : 0) << HF::top_bit_left_shift);\n  output_bits |= fraction;\n\n  uint_type shifted_exponent = static_cast<uint_type>(\n      static_cast<uint_type>(exponent << HF::exponent_left_shift) &\n      HF::exponent_mask);\n  output_bits |= shifted_exponent;\n\n  T output_float = spvutils::BitwiseCast<T>(output_bits);\n  value.set_value(output_float);\n\n  return is;\n}\n\n// Writes a FloatProxy value to a stream.\n// Zero and normal numbers are printed in the usual notation, but with\n// enough digits to fully reproduce the value.  Other values (subnormal,\n// NaN, and infinity) are printed as a hex float.\ntemplate <typename T>\nstd::ostream& operator<<(std::ostream& os, const FloatProxy<T>& value) {\n  auto float_val = value.getAsFloat();\n  switch (std::fpclassify(float_val)) {\n    case FP_ZERO:\n    case FP_NORMAL: {\n      auto saved_precision = os.precision();\n      os.precision(std::numeric_limits<T>::digits10);\n      os << float_val;\n      os.precision(saved_precision);\n    } break;\n    default:\n      os << HexFloat<FloatProxy<T>>(value);\n      break;\n  }\n  return os;\n}\n\ntemplate <>\ninline std::ostream& operator<<<Float16>(std::ostream& os,\n                                         const FloatProxy<Float16>& value) {\n  os << HexFloat<FloatProxy<Float16>>(value);\n  return os;\n}\n}\n\n#endif  // LIBSPIRV_UTIL_HEX_FLOAT_H_\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/spirv.hpp11",
    "content": "// Copyright (c) 2014-2024 The Khronos Group Inc.\n// \n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and/or associated documentation files (the \"Materials\"),\n// to deal in the Materials without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Materials, and to permit persons to whom the\n// Materials are furnished to do so, subject to the following conditions:\n// \n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Materials.\n// \n// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS\n// STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND\n// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/\n// \n// THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS\n// IN THE MATERIALS.\n\n// This header is automatically generated by the same tool that creates\n// the Binary Section of the SPIR-V specification.\n\n// Enumeration tokens for SPIR-V, in various styles:\n//   C, C++, C++11, JSON, Lua, Python, C#, D, Beef\n// \n// - C will have tokens with a \"Spv\" prefix, e.g.: SpvSourceLanguageGLSL\n// - C++ will have tokens in the \"spv\" name space, e.g.: spv::SourceLanguageGLSL\n// - C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL\n// - Lua will use tables, e.g.: spv.SourceLanguage.GLSL\n// - Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL']\n// - C# will use enum classes in the Specification class located in the \"Spv\" namespace,\n//     e.g.: Spv.Specification.SourceLanguage.GLSL\n// - D will have tokens under the \"spv\" module, e.g: spv.SourceLanguage.GLSL\n// - Beef will use enum classes in the Specification class located in the \"Spv\" namespace,\n//     e.g.: Spv.Specification.SourceLanguage.GLSL\n// \n// Some tokens act like mask values, which can be OR'd together,\n// while others are mutually exclusive.  The mask-like ones have\n// \"Mask\" in their name, and a parallel enum that has the shift\n// amount (1 << x) for each corresponding enumerant.\n\n#ifndef spirv_HPP\n#define spirv_HPP\n\nnamespace spv {\n\ntypedef unsigned int Id;\n\n#define SPV_VERSION 0x10600\n#define SPV_REVISION 1\n\nstatic const unsigned int MagicNumber = 0x07230203;\nstatic const unsigned int Version = 0x00010600;\nstatic const unsigned int Revision = 1;\nstatic const unsigned int OpCodeMask = 0xffff;\nstatic const unsigned int WordCountShift = 16;\n\nenum class SourceLanguage : unsigned {\n    Unknown = 0,\n    ESSL = 1,\n    GLSL = 2,\n    OpenCL_C = 3,\n    OpenCL_CPP = 4,\n    HLSL = 5,\n    CPP_for_OpenCL = 6,\n    SYCL = 7,\n    HERO_C = 8,\n    NZSL = 9,\n    WGSL = 10,\n    Slang = 11,\n    Zig = 12,\n    Rust = 13,\n    Max = 0x7fffffff,\n};\n\nenum class ExecutionModel : unsigned {\n    Vertex = 0,\n    TessellationControl = 1,\n    TessellationEvaluation = 2,\n    Geometry = 3,\n    Fragment = 4,\n    GLCompute = 5,\n    Kernel = 6,\n    TaskNV = 5267,\n    MeshNV = 5268,\n    RayGenerationKHR = 5313,\n    RayGenerationNV = 5313,\n    IntersectionKHR = 5314,\n    IntersectionNV = 5314,\n    AnyHitKHR = 5315,\n    AnyHitNV = 5315,\n    ClosestHitKHR = 5316,\n    ClosestHitNV = 5316,\n    MissKHR = 5317,\n    MissNV = 5317,\n    CallableKHR = 5318,\n    CallableNV = 5318,\n    TaskEXT = 5364,\n    MeshEXT = 5365,\n    Max = 0x7fffffff,\n};\n\nenum class AddressingModel : unsigned {\n    Logical = 0,\n    Physical32 = 1,\n    Physical64 = 2,\n    PhysicalStorageBuffer64 = 5348,\n    PhysicalStorageBuffer64EXT = 5348,\n    Max = 0x7fffffff,\n};\n\nenum class MemoryModel : unsigned {\n    Simple = 0,\n    GLSL450 = 1,\n    OpenCL = 2,\n    Vulkan = 3,\n    VulkanKHR = 3,\n    Max = 0x7fffffff,\n};\n\nenum class ExecutionMode : unsigned {\n    Invocations = 0,\n    SpacingEqual = 1,\n    SpacingFractionalEven = 2,\n    SpacingFractionalOdd = 3,\n    VertexOrderCw = 4,\n    VertexOrderCcw = 5,\n    PixelCenterInteger = 6,\n    OriginUpperLeft = 7,\n    OriginLowerLeft = 8,\n    EarlyFragmentTests = 9,\n    PointMode = 10,\n    Xfb = 11,\n    DepthReplacing = 12,\n    DepthGreater = 14,\n    DepthLess = 15,\n    DepthUnchanged = 16,\n    LocalSize = 17,\n    LocalSizeHint = 18,\n    InputPoints = 19,\n    InputLines = 20,\n    InputLinesAdjacency = 21,\n    Triangles = 22,\n    InputTrianglesAdjacency = 23,\n    Quads = 24,\n    Isolines = 25,\n    OutputVertices = 26,\n    OutputPoints = 27,\n    OutputLineStrip = 28,\n    OutputTriangleStrip = 29,\n    VecTypeHint = 30,\n    ContractionOff = 31,\n    Initializer = 33,\n    Finalizer = 34,\n    SubgroupSize = 35,\n    SubgroupsPerWorkgroup = 36,\n    SubgroupsPerWorkgroupId = 37,\n    LocalSizeId = 38,\n    LocalSizeHintId = 39,\n    NonCoherentColorAttachmentReadEXT = 4169,\n    NonCoherentDepthAttachmentReadEXT = 4170,\n    NonCoherentStencilAttachmentReadEXT = 4171,\n    SubgroupUniformControlFlowKHR = 4421,\n    PostDepthCoverage = 4446,\n    DenormPreserve = 4459,\n    DenormFlushToZero = 4460,\n    SignedZeroInfNanPreserve = 4461,\n    RoundingModeRTE = 4462,\n    RoundingModeRTZ = 4463,\n    NonCoherentTileAttachmentReadQCOM = 4489,\n    TileShadingRateQCOM = 4490,\n    EarlyAndLateFragmentTestsAMD = 5017,\n    StencilRefReplacingEXT = 5027,\n    CoalescingAMDX = 5069,\n    IsApiEntryAMDX = 5070,\n    MaxNodeRecursionAMDX = 5071,\n    StaticNumWorkgroupsAMDX = 5072,\n    ShaderIndexAMDX = 5073,\n    MaxNumWorkgroupsAMDX = 5077,\n    StencilRefUnchangedFrontAMD = 5079,\n    StencilRefGreaterFrontAMD = 5080,\n    StencilRefLessFrontAMD = 5081,\n    StencilRefUnchangedBackAMD = 5082,\n    StencilRefGreaterBackAMD = 5083,\n    StencilRefLessBackAMD = 5084,\n    QuadDerivativesKHR = 5088,\n    RequireFullQuadsKHR = 5089,\n    SharesInputWithAMDX = 5102,\n    OutputLinesEXT = 5269,\n    OutputLinesNV = 5269,\n    OutputPrimitivesEXT = 5270,\n    OutputPrimitivesNV = 5270,\n    DerivativeGroupQuadsKHR = 5289,\n    DerivativeGroupQuadsNV = 5289,\n    DerivativeGroupLinearKHR = 5290,\n    DerivativeGroupLinearNV = 5290,\n    OutputTrianglesEXT = 5298,\n    OutputTrianglesNV = 5298,\n    PixelInterlockOrderedEXT = 5366,\n    PixelInterlockUnorderedEXT = 5367,\n    SampleInterlockOrderedEXT = 5368,\n    SampleInterlockUnorderedEXT = 5369,\n    ShadingRateInterlockOrderedEXT = 5370,\n    ShadingRateInterlockUnorderedEXT = 5371,\n    SharedLocalMemorySizeINTEL = 5618,\n    RoundingModeRTPINTEL = 5620,\n    RoundingModeRTNINTEL = 5621,\n    FloatingPointModeALTINTEL = 5622,\n    FloatingPointModeIEEEINTEL = 5623,\n    MaxWorkgroupSizeINTEL = 5893,\n    MaxWorkDimINTEL = 5894,\n    NoGlobalOffsetINTEL = 5895,\n    NumSIMDWorkitemsINTEL = 5896,\n    SchedulerTargetFmaxMhzINTEL = 5903,\n    MaximallyReconvergesKHR = 6023,\n    FPFastMathDefault = 6028,\n    StreamingInterfaceINTEL = 6154,\n    RegisterMapInterfaceINTEL = 6160,\n    NamedBarrierCountINTEL = 6417,\n    MaximumRegistersINTEL = 6461,\n    MaximumRegistersIdINTEL = 6462,\n    NamedMaximumRegistersINTEL = 6463,\n    Max = 0x7fffffff,\n};\n\nenum class StorageClass : unsigned {\n    UniformConstant = 0,\n    Input = 1,\n    Uniform = 2,\n    Output = 3,\n    Workgroup = 4,\n    CrossWorkgroup = 5,\n    Private = 6,\n    Function = 7,\n    Generic = 8,\n    PushConstant = 9,\n    AtomicCounter = 10,\n    Image = 11,\n    StorageBuffer = 12,\n    TileImageEXT = 4172,\n    TileAttachmentQCOM = 4491,\n    NodePayloadAMDX = 5068,\n    CallableDataKHR = 5328,\n    CallableDataNV = 5328,\n    IncomingCallableDataKHR = 5329,\n    IncomingCallableDataNV = 5329,\n    RayPayloadKHR = 5338,\n    RayPayloadNV = 5338,\n    HitAttributeKHR = 5339,\n    HitAttributeNV = 5339,\n    IncomingRayPayloadKHR = 5342,\n    IncomingRayPayloadNV = 5342,\n    ShaderRecordBufferKHR = 5343,\n    ShaderRecordBufferNV = 5343,\n    PhysicalStorageBuffer = 5349,\n    PhysicalStorageBufferEXT = 5349,\n    HitObjectAttributeNV = 5385,\n    TaskPayloadWorkgroupEXT = 5402,\n    CodeSectionINTEL = 5605,\n    DeviceOnlyINTEL = 5936,\n    HostOnlyINTEL = 5937,\n    Max = 0x7fffffff,\n};\n\nenum class Dim : unsigned {\n    Dim1D = 0,\n    Dim2D = 1,\n    Dim3D = 2,\n    Cube = 3,\n    Rect = 4,\n    Buffer = 5,\n    SubpassData = 6,\n    TileImageDataEXT = 4173,\n    Max = 0x7fffffff,\n};\n\nenum class SamplerAddressingMode : unsigned {\n    None = 0,\n    ClampToEdge = 1,\n    Clamp = 2,\n    Repeat = 3,\n    RepeatMirrored = 4,\n    Max = 0x7fffffff,\n};\n\nenum class SamplerFilterMode : unsigned {\n    Nearest = 0,\n    Linear = 1,\n    Max = 0x7fffffff,\n};\n\nenum class ImageFormat : unsigned {\n    Unknown = 0,\n    Rgba32f = 1,\n    Rgba16f = 2,\n    R32f = 3,\n    Rgba8 = 4,\n    Rgba8Snorm = 5,\n    Rg32f = 6,\n    Rg16f = 7,\n    R11fG11fB10f = 8,\n    R16f = 9,\n    Rgba16 = 10,\n    Rgb10A2 = 11,\n    Rg16 = 12,\n    Rg8 = 13,\n    R16 = 14,\n    R8 = 15,\n    Rgba16Snorm = 16,\n    Rg16Snorm = 17,\n    Rg8Snorm = 18,\n    R16Snorm = 19,\n    R8Snorm = 20,\n    Rgba32i = 21,\n    Rgba16i = 22,\n    Rgba8i = 23,\n    R32i = 24,\n    Rg32i = 25,\n    Rg16i = 26,\n    Rg8i = 27,\n    R16i = 28,\n    R8i = 29,\n    Rgba32ui = 30,\n    Rgba16ui = 31,\n    Rgba8ui = 32,\n    R32ui = 33,\n    Rgb10a2ui = 34,\n    Rg32ui = 35,\n    Rg16ui = 36,\n    Rg8ui = 37,\n    R16ui = 38,\n    R8ui = 39,\n    R64ui = 40,\n    R64i = 41,\n    Max = 0x7fffffff,\n};\n\nenum class ImageChannelOrder : unsigned {\n    R = 0,\n    A = 1,\n    RG = 2,\n    RA = 3,\n    RGB = 4,\n    RGBA = 5,\n    BGRA = 6,\n    ARGB = 7,\n    Intensity = 8,\n    Luminance = 9,\n    Rx = 10,\n    RGx = 11,\n    RGBx = 12,\n    Depth = 13,\n    DepthStencil = 14,\n    sRGB = 15,\n    sRGBx = 16,\n    sRGBA = 17,\n    sBGRA = 18,\n    ABGR = 19,\n    Max = 0x7fffffff,\n};\n\nenum class ImageChannelDataType : unsigned {\n    SnormInt8 = 0,\n    SnormInt16 = 1,\n    UnormInt8 = 2,\n    UnormInt16 = 3,\n    UnormShort565 = 4,\n    UnormShort555 = 5,\n    UnormInt101010 = 6,\n    SignedInt8 = 7,\n    SignedInt16 = 8,\n    SignedInt32 = 9,\n    UnsignedInt8 = 10,\n    UnsignedInt16 = 11,\n    UnsignedInt32 = 12,\n    HalfFloat = 13,\n    Float = 14,\n    UnormInt24 = 15,\n    UnormInt101010_2 = 16,\n    UnsignedIntRaw10EXT = 19,\n    UnsignedIntRaw12EXT = 20,\n    UnormInt2_101010EXT = 21,\n    Max = 0x7fffffff,\n};\n\nenum class ImageOperandsShift : unsigned {\n    Bias = 0,\n    Lod = 1,\n    Grad = 2,\n    ConstOffset = 3,\n    Offset = 4,\n    ConstOffsets = 5,\n    Sample = 6,\n    MinLod = 7,\n    MakeTexelAvailable = 8,\n    MakeTexelAvailableKHR = 8,\n    MakeTexelVisible = 9,\n    MakeTexelVisibleKHR = 9,\n    NonPrivateTexel = 10,\n    NonPrivateTexelKHR = 10,\n    VolatileTexel = 11,\n    VolatileTexelKHR = 11,\n    SignExtend = 12,\n    ZeroExtend = 13,\n    Nontemporal = 14,\n    Offsets = 16,\n    Max = 0x7fffffff,\n};\n\nenum class ImageOperandsMask : unsigned {\n    MaskNone = 0,\n    Bias = 0x00000001,\n    Lod = 0x00000002,\n    Grad = 0x00000004,\n    ConstOffset = 0x00000008,\n    Offset = 0x00000010,\n    ConstOffsets = 0x00000020,\n    Sample = 0x00000040,\n    MinLod = 0x00000080,\n    MakeTexelAvailable = 0x00000100,\n    MakeTexelAvailableKHR = 0x00000100,\n    MakeTexelVisible = 0x00000200,\n    MakeTexelVisibleKHR = 0x00000200,\n    NonPrivateTexel = 0x00000400,\n    NonPrivateTexelKHR = 0x00000400,\n    VolatileTexel = 0x00000800,\n    VolatileTexelKHR = 0x00000800,\n    SignExtend = 0x00001000,\n    ZeroExtend = 0x00002000,\n    Nontemporal = 0x00004000,\n    Offsets = 0x00010000,\n};\n\nenum class FPFastMathModeShift : unsigned {\n    NotNaN = 0,\n    NotInf = 1,\n    NSZ = 2,\n    AllowRecip = 3,\n    Fast = 4,\n    AllowContract = 16,\n    AllowContractFastINTEL = 16,\n    AllowReassoc = 17,\n    AllowReassocINTEL = 17,\n    AllowTransform = 18,\n    Max = 0x7fffffff,\n};\n\nenum class FPFastMathModeMask : unsigned {\n    MaskNone = 0,\n    NotNaN = 0x00000001,\n    NotInf = 0x00000002,\n    NSZ = 0x00000004,\n    AllowRecip = 0x00000008,\n    Fast = 0x00000010,\n    AllowContract = 0x00010000,\n    AllowContractFastINTEL = 0x00010000,\n    AllowReassoc = 0x00020000,\n    AllowReassocINTEL = 0x00020000,\n    AllowTransform = 0x00040000,\n};\n\nenum class FPRoundingMode : unsigned {\n    RTE = 0,\n    RTZ = 1,\n    RTP = 2,\n    RTN = 3,\n    Max = 0x7fffffff,\n};\n\nenum class LinkageType : unsigned {\n    Export = 0,\n    Import = 1,\n    LinkOnceODR = 2,\n    Max = 0x7fffffff,\n};\n\nenum class AccessQualifier : unsigned {\n    ReadOnly = 0,\n    WriteOnly = 1,\n    ReadWrite = 2,\n    Max = 0x7fffffff,\n};\n\nenum class FunctionParameterAttribute : unsigned {\n    Zext = 0,\n    Sext = 1,\n    ByVal = 2,\n    Sret = 3,\n    NoAlias = 4,\n    NoCapture = 5,\n    NoWrite = 6,\n    NoReadWrite = 7,\n    RuntimeAlignedINTEL = 5940,\n    Max = 0x7fffffff,\n};\n\nenum class Decoration : unsigned {\n    RelaxedPrecision = 0,\n    SpecId = 1,\n    Block = 2,\n    BufferBlock = 3,\n    RowMajor = 4,\n    ColMajor = 5,\n    ArrayStride = 6,\n    MatrixStride = 7,\n    GLSLShared = 8,\n    GLSLPacked = 9,\n    CPacked = 10,\n    BuiltIn = 11,\n    NoPerspective = 13,\n    Flat = 14,\n    Patch = 15,\n    Centroid = 16,\n    Sample = 17,\n    Invariant = 18,\n    Restrict = 19,\n    Aliased = 20,\n    Volatile = 21,\n    Constant = 22,\n    Coherent = 23,\n    NonWritable = 24,\n    NonReadable = 25,\n    Uniform = 26,\n    UniformId = 27,\n    SaturatedConversion = 28,\n    Stream = 29,\n    Location = 30,\n    Component = 31,\n    Index = 32,\n    Binding = 33,\n    DescriptorSet = 34,\n    Offset = 35,\n    XfbBuffer = 36,\n    XfbStride = 37,\n    FuncParamAttr = 38,\n    FPRoundingMode = 39,\n    FPFastMathMode = 40,\n    LinkageAttributes = 41,\n    NoContraction = 42,\n    InputAttachmentIndex = 43,\n    Alignment = 44,\n    MaxByteOffset = 45,\n    AlignmentId = 46,\n    MaxByteOffsetId = 47,\r\n    SaturatedToLargestFloat8NormalConversionEXT = 4216,\n    NoSignedWrap = 4469,\n    NoUnsignedWrap = 4470,\n    WeightTextureQCOM = 4487,\n    BlockMatchTextureQCOM = 4488,\n    BlockMatchSamplerQCOM = 4499,\n    ExplicitInterpAMD = 4999,\n    NodeSharesPayloadLimitsWithAMDX = 5019,\n    NodeMaxPayloadsAMDX = 5020,\n    TrackFinishWritingAMDX = 5078,\n    PayloadNodeNameAMDX = 5091,\n    PayloadNodeBaseIndexAMDX = 5098,\n    PayloadNodeSparseArrayAMDX = 5099,\n    PayloadNodeArraySizeAMDX = 5100,\n    PayloadDispatchIndirectAMDX = 5105,\n    OverrideCoverageNV = 5248,\n    PassthroughNV = 5250,\n    ViewportRelativeNV = 5252,\n    SecondaryViewportRelativeNV = 5256,\n    PerPrimitiveEXT = 5271,\n    PerPrimitiveNV = 5271,\n    PerViewNV = 5272,\n    PerTaskNV = 5273,\n    PerVertexKHR = 5285,\n    PerVertexNV = 5285,\n    NonUniform = 5300,\n    NonUniformEXT = 5300,\n    RestrictPointer = 5355,\n    RestrictPointerEXT = 5355,\n    AliasedPointer = 5356,\n    AliasedPointerEXT = 5356,\n    HitObjectShaderRecordBufferNV = 5386,\n    BindlessSamplerNV = 5398,\n    BindlessImageNV = 5399,\n    BoundSamplerNV = 5400,\n    BoundImageNV = 5401,\n    SIMTCallINTEL = 5599,\n    ReferencedIndirectlyINTEL = 5602,\n    ClobberINTEL = 5607,\n    SideEffectsINTEL = 5608,\n    VectorComputeVariableINTEL = 5624,\n    FuncParamIOKindINTEL = 5625,\n    VectorComputeFunctionINTEL = 5626,\n    StackCallINTEL = 5627,\n    GlobalVariableOffsetINTEL = 5628,\n    CounterBuffer = 5634,\n    HlslCounterBufferGOOGLE = 5634,\n    HlslSemanticGOOGLE = 5635,\n    UserSemantic = 5635,\n    UserTypeGOOGLE = 5636,\n    FunctionRoundingModeINTEL = 5822,\n    FunctionDenormModeINTEL = 5823,\n    RegisterINTEL = 5825,\n    MemoryINTEL = 5826,\n    NumbanksINTEL = 5827,\n    BankwidthINTEL = 5828,\n    MaxPrivateCopiesINTEL = 5829,\n    SinglepumpINTEL = 5830,\n    DoublepumpINTEL = 5831,\n    MaxReplicatesINTEL = 5832,\n    SimpleDualPortINTEL = 5833,\n    MergeINTEL = 5834,\n    BankBitsINTEL = 5835,\n    ForcePow2DepthINTEL = 5836,\n    StridesizeINTEL = 5883,\n    WordsizeINTEL = 5884,\n    TrueDualPortINTEL = 5885,\n    BurstCoalesceINTEL = 5899,\n    CacheSizeINTEL = 5900,\n    DontStaticallyCoalesceINTEL = 5901,\n    PrefetchINTEL = 5902,\n    StallEnableINTEL = 5905,\n    FuseLoopsInFunctionINTEL = 5907,\n    MathOpDSPModeINTEL = 5909,\n    AliasScopeINTEL = 5914,\n    NoAliasINTEL = 5915,\n    InitiationIntervalINTEL = 5917,\n    MaxConcurrencyINTEL = 5918,\n    PipelineEnableINTEL = 5919,\n    BufferLocationINTEL = 5921,\n    IOPipeStorageINTEL = 5944,\n    FunctionFloatingPointModeINTEL = 6080,\n    SingleElementVectorINTEL = 6085,\n    VectorComputeCallableFunctionINTEL = 6087,\n    MediaBlockIOINTEL = 6140,\n    StallFreeINTEL = 6151,\n    FPMaxErrorDecorationINTEL = 6170,\n    LatencyControlLabelINTEL = 6172,\n    LatencyControlConstraintINTEL = 6173,\n    ConduitKernelArgumentINTEL = 6175,\n    RegisterMapKernelArgumentINTEL = 6176,\n    MMHostInterfaceAddressWidthINTEL = 6177,\n    MMHostInterfaceDataWidthINTEL = 6178,\n    MMHostInterfaceLatencyINTEL = 6179,\n    MMHostInterfaceReadWriteModeINTEL = 6180,\n    MMHostInterfaceMaxBurstINTEL = 6181,\n    MMHostInterfaceWaitRequestINTEL = 6182,\n    StableKernelArgumentINTEL = 6183,\n    HostAccessINTEL = 6188,\n    InitModeINTEL = 6190,\n    ImplementInRegisterMapINTEL = 6191,\n    CacheControlLoadINTEL = 6442,\n    CacheControlStoreINTEL = 6443,\n    Max = 0x7fffffff,\n};\n\nenum class BuiltIn : unsigned {\n    Position = 0,\n    PointSize = 1,\n    ClipDistance = 3,\n    CullDistance = 4,\n    VertexId = 5,\n    InstanceId = 6,\n    PrimitiveId = 7,\n    InvocationId = 8,\n    Layer = 9,\n    ViewportIndex = 10,\n    TessLevelOuter = 11,\n    TessLevelInner = 12,\n    TessCoord = 13,\n    PatchVertices = 14,\n    FragCoord = 15,\n    PointCoord = 16,\n    FrontFacing = 17,\n    SampleId = 18,\n    SamplePosition = 19,\n    SampleMask = 20,\n    FragDepth = 22,\n    HelperInvocation = 23,\n    NumWorkgroups = 24,\n    WorkgroupSize = 25,\n    WorkgroupId = 26,\n    LocalInvocationId = 27,\n    GlobalInvocationId = 28,\n    LocalInvocationIndex = 29,\n    WorkDim = 30,\n    GlobalSize = 31,\n    EnqueuedWorkgroupSize = 32,\n    GlobalOffset = 33,\n    GlobalLinearId = 34,\n    SubgroupSize = 36,\n    SubgroupMaxSize = 37,\n    NumSubgroups = 38,\n    NumEnqueuedSubgroups = 39,\n    SubgroupId = 40,\n    SubgroupLocalInvocationId = 41,\n    VertexIndex = 42,\n    InstanceIndex = 43,\n    CoreIDARM = 4160,\n    CoreCountARM = 4161,\n    CoreMaxIDARM = 4162,\n    WarpIDARM = 4163,\n    WarpMaxIDARM = 4164,\n    SubgroupEqMask = 4416,\n    SubgroupEqMaskKHR = 4416,\n    SubgroupGeMask = 4417,\n    SubgroupGeMaskKHR = 4417,\n    SubgroupGtMask = 4418,\n    SubgroupGtMaskKHR = 4418,\n    SubgroupLeMask = 4419,\n    SubgroupLeMaskKHR = 4419,\n    SubgroupLtMask = 4420,\n    SubgroupLtMaskKHR = 4420,\n    BaseVertex = 4424,\n    BaseInstance = 4425,\n    DrawIndex = 4426,\n    PrimitiveShadingRateKHR = 4432,\n    DeviceIndex = 4438,\n    ViewIndex = 4440,\n    ShadingRateKHR = 4444,\n    TileOffsetQCOM = 4492,\n    TileDimensionQCOM = 4493,\n    TileApronSizeQCOM = 4494,\n    BaryCoordNoPerspAMD = 4992,\n    BaryCoordNoPerspCentroidAMD = 4993,\n    BaryCoordNoPerspSampleAMD = 4994,\n    BaryCoordSmoothAMD = 4995,\n    BaryCoordSmoothCentroidAMD = 4996,\n    BaryCoordSmoothSampleAMD = 4997,\n    BaryCoordPullModelAMD = 4998,\n    FragStencilRefEXT = 5014,\n    RemainingRecursionLevelsAMDX = 5021,\n    ShaderIndexAMDX = 5073,\n    ViewportMaskNV = 5253,\n    SecondaryPositionNV = 5257,\n    SecondaryViewportMaskNV = 5258,\n    PositionPerViewNV = 5261,\n    ViewportMaskPerViewNV = 5262,\n    FullyCoveredEXT = 5264,\n    TaskCountNV = 5274,\n    PrimitiveCountNV = 5275,\n    PrimitiveIndicesNV = 5276,\n    ClipDistancePerViewNV = 5277,\n    CullDistancePerViewNV = 5278,\n    LayerPerViewNV = 5279,\n    MeshViewCountNV = 5280,\n    MeshViewIndicesNV = 5281,\n    BaryCoordKHR = 5286,\n    BaryCoordNV = 5286,\n    BaryCoordNoPerspKHR = 5287,\n    BaryCoordNoPerspNV = 5287,\n    FragSizeEXT = 5292,\n    FragmentSizeNV = 5292,\n    FragInvocationCountEXT = 5293,\n    InvocationsPerPixelNV = 5293,\n    PrimitivePointIndicesEXT = 5294,\n    PrimitiveLineIndicesEXT = 5295,\n    PrimitiveTriangleIndicesEXT = 5296,\n    CullPrimitiveEXT = 5299,\n    LaunchIdKHR = 5319,\n    LaunchIdNV = 5319,\n    LaunchSizeKHR = 5320,\n    LaunchSizeNV = 5320,\n    WorldRayOriginKHR = 5321,\n    WorldRayOriginNV = 5321,\n    WorldRayDirectionKHR = 5322,\n    WorldRayDirectionNV = 5322,\n    ObjectRayOriginKHR = 5323,\n    ObjectRayOriginNV = 5323,\n    ObjectRayDirectionKHR = 5324,\n    ObjectRayDirectionNV = 5324,\n    RayTminKHR = 5325,\n    RayTminNV = 5325,\n    RayTmaxKHR = 5326,\n    RayTmaxNV = 5326,\n    InstanceCustomIndexKHR = 5327,\n    InstanceCustomIndexNV = 5327,\n    ObjectToWorldKHR = 5330,\n    ObjectToWorldNV = 5330,\n    WorldToObjectKHR = 5331,\n    WorldToObjectNV = 5331,\n    HitTNV = 5332,\n    HitKindKHR = 5333,\n    HitKindNV = 5333,\n    CurrentRayTimeNV = 5334,\n    HitTriangleVertexPositionsKHR = 5335,\n    HitMicroTriangleVertexPositionsNV = 5337,\n    HitMicroTriangleVertexBarycentricsNV = 5344,\n    IncomingRayFlagsKHR = 5351,\n    IncomingRayFlagsNV = 5351,\n    RayGeometryIndexKHR = 5352,\n    HitIsSphereNV = 5359,\n    HitIsLSSNV = 5360,\n    HitSpherePositionNV = 5361,\n    WarpsPerSMNV = 5374,\n    SMCountNV = 5375,\n    WarpIDNV = 5376,\n    SMIDNV = 5377,\n    HitLSSPositionsNV = 5396,\n    HitKindFrontFacingMicroTriangleNV = 5405,\n    HitKindBackFacingMicroTriangleNV = 5406,\n    HitSphereRadiusNV = 5420,\n    HitLSSRadiiNV = 5421,\n    ClusterIDNV = 5436,\n    CullMaskKHR = 6021,\n    Max = 0x7fffffff,\n};\n\nenum class SelectionControlShift : unsigned {\n    Flatten = 0,\n    DontFlatten = 1,\n    Max = 0x7fffffff,\n};\n\nenum class SelectionControlMask : unsigned {\n    MaskNone = 0,\n    Flatten = 0x00000001,\n    DontFlatten = 0x00000002,\n};\n\nenum class LoopControlShift : unsigned {\n    Unroll = 0,\n    DontUnroll = 1,\n    DependencyInfinite = 2,\n    DependencyLength = 3,\n    MinIterations = 4,\n    MaxIterations = 5,\n    IterationMultiple = 6,\n    PeelCount = 7,\n    PartialCount = 8,\n    InitiationIntervalINTEL = 16,\n    MaxConcurrencyINTEL = 17,\n    DependencyArrayINTEL = 18,\n    PipelineEnableINTEL = 19,\n    LoopCoalesceINTEL = 20,\n    MaxInterleavingINTEL = 21,\n    SpeculatedIterationsINTEL = 22,\n    NoFusionINTEL = 23,\n    LoopCountINTEL = 24,\n    MaxReinvocationDelayINTEL = 25,\n    Max = 0x7fffffff,\n};\n\nenum class LoopControlMask : unsigned {\n    MaskNone = 0,\n    Unroll = 0x00000001,\n    DontUnroll = 0x00000002,\n    DependencyInfinite = 0x00000004,\n    DependencyLength = 0x00000008,\n    MinIterations = 0x00000010,\n    MaxIterations = 0x00000020,\n    IterationMultiple = 0x00000040,\n    PeelCount = 0x00000080,\n    PartialCount = 0x00000100,\n    InitiationIntervalINTEL = 0x00010000,\n    MaxConcurrencyINTEL = 0x00020000,\n    DependencyArrayINTEL = 0x00040000,\n    PipelineEnableINTEL = 0x00080000,\n    LoopCoalesceINTEL = 0x00100000,\n    MaxInterleavingINTEL = 0x00200000,\n    SpeculatedIterationsINTEL = 0x00400000,\n    NoFusionINTEL = 0x00800000,\n    LoopCountINTEL = 0x01000000,\n    MaxReinvocationDelayINTEL = 0x02000000,\n};\n\nenum class FunctionControlShift : unsigned {\n    Inline = 0,\n    DontInline = 1,\n    Pure = 2,\n    Const = 3,\n    OptNoneEXT = 16,\n    OptNoneINTEL = 16,\n    Max = 0x7fffffff,\n};\n\nenum class FunctionControlMask : unsigned {\n    MaskNone = 0,\n    Inline = 0x00000001,\n    DontInline = 0x00000002,\n    Pure = 0x00000004,\n    Const = 0x00000008,\n    OptNoneEXT = 0x00010000,\n    OptNoneINTEL = 0x00010000,\n};\n\nenum class MemorySemanticsShift : unsigned {\n    Acquire = 1,\n    Release = 2,\n    AcquireRelease = 3,\n    SequentiallyConsistent = 4,\n    UniformMemory = 6,\n    SubgroupMemory = 7,\n    WorkgroupMemory = 8,\n    CrossWorkgroupMemory = 9,\n    AtomicCounterMemory = 10,\n    ImageMemory = 11,\n    OutputMemory = 12,\n    OutputMemoryKHR = 12,\n    MakeAvailable = 13,\n    MakeAvailableKHR = 13,\n    MakeVisible = 14,\n    MakeVisibleKHR = 14,\n    Volatile = 15,\n    Max = 0x7fffffff,\n};\n\nenum class MemorySemanticsMask : unsigned {\n    MaskNone = 0,\n    Acquire = 0x00000002,\n    Release = 0x00000004,\n    AcquireRelease = 0x00000008,\n    SequentiallyConsistent = 0x00000010,\n    UniformMemory = 0x00000040,\n    SubgroupMemory = 0x00000080,\n    WorkgroupMemory = 0x00000100,\n    CrossWorkgroupMemory = 0x00000200,\n    AtomicCounterMemory = 0x00000400,\n    ImageMemory = 0x00000800,\n    OutputMemory = 0x00001000,\n    OutputMemoryKHR = 0x00001000,\n    MakeAvailable = 0x00002000,\n    MakeAvailableKHR = 0x00002000,\n    MakeVisible = 0x00004000,\n    MakeVisibleKHR = 0x00004000,\n    Volatile = 0x00008000,\n};\n\nenum class MemoryAccessShift : unsigned {\n    Volatile = 0,\n    Aligned = 1,\n    Nontemporal = 2,\n    MakePointerAvailable = 3,\n    MakePointerAvailableKHR = 3,\n    MakePointerVisible = 4,\n    MakePointerVisibleKHR = 4,\n    NonPrivatePointer = 5,\n    NonPrivatePointerKHR = 5,\n    AliasScopeINTELMask = 16,\n    NoAliasINTELMask = 17,\n    Max = 0x7fffffff,\n};\n\nenum class MemoryAccessMask : unsigned {\n    MaskNone = 0,\n    Volatile = 0x00000001,\n    Aligned = 0x00000002,\n    Nontemporal = 0x00000004,\n    MakePointerAvailable = 0x00000008,\n    MakePointerAvailableKHR = 0x00000008,\n    MakePointerVisible = 0x00000010,\n    MakePointerVisibleKHR = 0x00000010,\n    NonPrivatePointer = 0x00000020,\n    NonPrivatePointerKHR = 0x00000020,\n    AliasScopeINTELMask = 0x00010000,\n    NoAliasINTELMask = 0x00020000,\n};\n\nenum class Scope : unsigned {\n    CrossDevice = 0,\n    Device = 1,\n    Workgroup = 2,\n    Subgroup = 3,\n    Invocation = 4,\n    QueueFamily = 5,\n    QueueFamilyKHR = 5,\n    ShaderCallKHR = 6,\n    Max = 0x7fffffff,\n};\n\nenum class GroupOperation : unsigned {\n    Reduce = 0,\n    InclusiveScan = 1,\n    ExclusiveScan = 2,\n    ClusteredReduce = 3,\n    PartitionedReduceNV = 6,\n    PartitionedInclusiveScanNV = 7,\n    PartitionedExclusiveScanNV = 8,\n    Max = 0x7fffffff,\n};\n\nenum class KernelEnqueueFlags : unsigned {\n    NoWait = 0,\n    WaitKernel = 1,\n    WaitWorkGroup = 2,\n    Max = 0x7fffffff,\n};\n\nenum class KernelProfilingInfoShift : unsigned {\n    CmdExecTime = 0,\n    Max = 0x7fffffff,\n};\n\nenum class KernelProfilingInfoMask : unsigned {\n    MaskNone = 0,\n    CmdExecTime = 0x00000001,\n};\n\nenum class Capability : unsigned {\n    Matrix = 0,\n    Shader = 1,\n    Geometry = 2,\n    Tessellation = 3,\n    Addresses = 4,\n    Linkage = 5,\n    Kernel = 6,\n    Vector16 = 7,\n    Float16Buffer = 8,\n    Float16 = 9,\n    Float64 = 10,\n    Int64 = 11,\n    Int64Atomics = 12,\n    ImageBasic = 13,\n    ImageReadWrite = 14,\n    ImageMipmap = 15,\n    Pipes = 17,\n    Groups = 18,\n    DeviceEnqueue = 19,\n    LiteralSampler = 20,\n    AtomicStorage = 21,\n    Int16 = 22,\n    TessellationPointSize = 23,\n    GeometryPointSize = 24,\n    ImageGatherExtended = 25,\n    StorageImageMultisample = 27,\n    UniformBufferArrayDynamicIndexing = 28,\n    SampledImageArrayDynamicIndexing = 29,\n    StorageBufferArrayDynamicIndexing = 30,\n    StorageImageArrayDynamicIndexing = 31,\n    ClipDistance = 32,\n    CullDistance = 33,\n    ImageCubeArray = 34,\n    SampleRateShading = 35,\n    ImageRect = 36,\n    SampledRect = 37,\n    GenericPointer = 38,\n    Int8 = 39,\n    InputAttachment = 40,\n    SparseResidency = 41,\n    MinLod = 42,\n    Sampled1D = 43,\n    Image1D = 44,\n    SampledCubeArray = 45,\n    SampledBuffer = 46,\n    ImageBuffer = 47,\n    ImageMSArray = 48,\n    StorageImageExtendedFormats = 49,\n    ImageQuery = 50,\n    DerivativeControl = 51,\n    InterpolationFunction = 52,\n    TransformFeedback = 53,\n    GeometryStreams = 54,\n    StorageImageReadWithoutFormat = 55,\n    StorageImageWriteWithoutFormat = 56,\n    MultiViewport = 57,\n    SubgroupDispatch = 58,\n    NamedBarrier = 59,\n    PipeStorage = 60,\n    GroupNonUniform = 61,\n    GroupNonUniformVote = 62,\n    GroupNonUniformArithmetic = 63,\n    GroupNonUniformBallot = 64,\n    GroupNonUniformShuffle = 65,\n    GroupNonUniformShuffleRelative = 66,\n    GroupNonUniformClustered = 67,\n    GroupNonUniformQuad = 68,\n    ShaderLayer = 69,\n    ShaderViewportIndex = 70,\n    UniformDecoration = 71,\n    CoreBuiltinsARM = 4165,\n    TileImageColorReadAccessEXT = 4166,\n    TileImageDepthReadAccessEXT = 4167,\n    TileImageStencilReadAccessEXT = 4168,\n    CooperativeMatrixLayoutsARM = 4201,\r\n    Float8EXT = 4212,\r\n    Float8CooperativeMatrixEXT = 4213,\n    FragmentShadingRateKHR = 4422,\n    SubgroupBallotKHR = 4423,\n    DrawParameters = 4427,\n    WorkgroupMemoryExplicitLayoutKHR = 4428,\n    WorkgroupMemoryExplicitLayout8BitAccessKHR = 4429,\n    WorkgroupMemoryExplicitLayout16BitAccessKHR = 4430,\n    SubgroupVoteKHR = 4431,\n    StorageBuffer16BitAccess = 4433,\n    StorageUniformBufferBlock16 = 4433,\n    StorageUniform16 = 4434,\n    UniformAndStorageBuffer16BitAccess = 4434,\n    StoragePushConstant16 = 4435,\n    StorageInputOutput16 = 4436,\n    DeviceGroup = 4437,\n    MultiView = 4439,\n    VariablePointersStorageBuffer = 4441,\n    VariablePointers = 4442,\n    AtomicStorageOps = 4445,\n    SampleMaskPostDepthCoverage = 4447,\n    StorageBuffer8BitAccess = 4448,\n    UniformAndStorageBuffer8BitAccess = 4449,\n    StoragePushConstant8 = 4450,\n    DenormPreserve = 4464,\n    DenormFlushToZero = 4465,\n    SignedZeroInfNanPreserve = 4466,\n    RoundingModeRTE = 4467,\n    RoundingModeRTZ = 4468,\n    RayQueryProvisionalKHR = 4471,\n    RayQueryKHR = 4472,\n    UntypedPointersKHR = 4473,\n    RayTraversalPrimitiveCullingKHR = 4478,\n    RayTracingKHR = 4479,\n    TextureSampleWeightedQCOM = 4484,\n    TextureBoxFilterQCOM = 4485,\n    TextureBlockMatchQCOM = 4486,\n    TileShadingQCOM = 4495,\n    TextureBlockMatch2QCOM = 4498,\n    Float16ImageAMD = 5008,\n    ImageGatherBiasLodAMD = 5009,\n    FragmentMaskAMD = 5010,\n    StencilExportEXT = 5013,\n    ImageReadWriteLodAMD = 5015,\n    Int64ImageEXT = 5016,\n    ShaderClockKHR = 5055,\n    ShaderEnqueueAMDX = 5067,\n    QuadControlKHR = 5087,\n    BFloat16TypeKHR = 5116,\n    BFloat16DotProductKHR = 5117,\n    BFloat16CooperativeMatrixKHR = 5118,\n    SampleMaskOverrideCoverageNV = 5249,\n    GeometryShaderPassthroughNV = 5251,\n    ShaderViewportIndexLayerEXT = 5254,\n    ShaderViewportIndexLayerNV = 5254,\n    ShaderViewportMaskNV = 5255,\n    ShaderStereoViewNV = 5259,\n    PerViewAttributesNV = 5260,\n    FragmentFullyCoveredEXT = 5265,\n    MeshShadingNV = 5266,\n    ImageFootprintNV = 5282,\n    MeshShadingEXT = 5283,\n    FragmentBarycentricKHR = 5284,\n    FragmentBarycentricNV = 5284,\n    ComputeDerivativeGroupQuadsKHR = 5288,\n    ComputeDerivativeGroupQuadsNV = 5288,\n    FragmentDensityEXT = 5291,\n    ShadingRateNV = 5291,\n    GroupNonUniformPartitionedNV = 5297,\n    ShaderNonUniform = 5301,\n    ShaderNonUniformEXT = 5301,\n    RuntimeDescriptorArray = 5302,\n    RuntimeDescriptorArrayEXT = 5302,\n    InputAttachmentArrayDynamicIndexing = 5303,\n    InputAttachmentArrayDynamicIndexingEXT = 5303,\n    UniformTexelBufferArrayDynamicIndexing = 5304,\n    UniformTexelBufferArrayDynamicIndexingEXT = 5304,\n    StorageTexelBufferArrayDynamicIndexing = 5305,\n    StorageTexelBufferArrayDynamicIndexingEXT = 5305,\n    UniformBufferArrayNonUniformIndexing = 5306,\n    UniformBufferArrayNonUniformIndexingEXT = 5306,\n    SampledImageArrayNonUniformIndexing = 5307,\n    SampledImageArrayNonUniformIndexingEXT = 5307,\n    StorageBufferArrayNonUniformIndexing = 5308,\n    StorageBufferArrayNonUniformIndexingEXT = 5308,\n    StorageImageArrayNonUniformIndexing = 5309,\n    StorageImageArrayNonUniformIndexingEXT = 5309,\n    InputAttachmentArrayNonUniformIndexing = 5310,\n    InputAttachmentArrayNonUniformIndexingEXT = 5310,\n    UniformTexelBufferArrayNonUniformIndexing = 5311,\n    UniformTexelBufferArrayNonUniformIndexingEXT = 5311,\n    StorageTexelBufferArrayNonUniformIndexing = 5312,\n    StorageTexelBufferArrayNonUniformIndexingEXT = 5312,\n    RayTracingPositionFetchKHR = 5336,\n    RayTracingNV = 5340,\n    RayTracingMotionBlurNV = 5341,\n    VulkanMemoryModel = 5345,\n    VulkanMemoryModelKHR = 5345,\n    VulkanMemoryModelDeviceScope = 5346,\n    VulkanMemoryModelDeviceScopeKHR = 5346,\n    PhysicalStorageBufferAddresses = 5347,\n    PhysicalStorageBufferAddressesEXT = 5347,\n    ComputeDerivativeGroupLinearKHR = 5350,\n    ComputeDerivativeGroupLinearNV = 5350,\n    RayTracingProvisionalKHR = 5353,\n    CooperativeMatrixNV = 5357,\n    FragmentShaderSampleInterlockEXT = 5363,\n    FragmentShaderShadingRateInterlockEXT = 5372,\n    ShaderSMBuiltinsNV = 5373,\n    FragmentShaderPixelInterlockEXT = 5378,\n    DemoteToHelperInvocation = 5379,\n    DemoteToHelperInvocationEXT = 5379,\n    DisplacementMicromapNV = 5380,\n    RayTracingOpacityMicromapEXT = 5381,\n    ShaderInvocationReorderNV = 5383,\n    BindlessTextureNV = 5390,\n    RayQueryPositionFetchKHR = 5391,\n    CooperativeVectorNV = 5394,\n    AtomicFloat16VectorNV = 5404,\n    RayTracingDisplacementMicromapNV = 5409,\n    RawAccessChainsNV = 5414,\n    RayTracingSpheresGeometryNV = 5418,\n    RayTracingLinearSweptSpheresGeometryNV = 5419,\n    CooperativeMatrixReductionsNV = 5430,\n    CooperativeMatrixConversionsNV = 5431,\n    CooperativeMatrixPerElementOperationsNV = 5432,\n    CooperativeMatrixTensorAddressingNV = 5433,\n    CooperativeMatrixBlockLoadsNV = 5434,\n    CooperativeVectorTrainingNV = 5435,\n    RayTracingClusterAccelerationStructureNV = 5437,\n    TensorAddressingNV = 5439,\n    SubgroupShuffleINTEL = 5568,\n    SubgroupBufferBlockIOINTEL = 5569,\n    SubgroupImageBlockIOINTEL = 5570,\n    SubgroupImageMediaBlockIOINTEL = 5579,\n    RoundToInfinityINTEL = 5582,\n    FloatingPointModeINTEL = 5583,\n    IntegerFunctions2INTEL = 5584,\n    FunctionPointersINTEL = 5603,\n    IndirectReferencesINTEL = 5604,\n    AsmINTEL = 5606,\n    AtomicFloat32MinMaxEXT = 5612,\n    AtomicFloat64MinMaxEXT = 5613,\n    AtomicFloat16MinMaxEXT = 5616,\n    VectorComputeINTEL = 5617,\n    VectorAnyINTEL = 5619,\n    ExpectAssumeKHR = 5629,\n    SubgroupAvcMotionEstimationINTEL = 5696,\n    SubgroupAvcMotionEstimationIntraINTEL = 5697,\n    SubgroupAvcMotionEstimationChromaINTEL = 5698,\n    VariableLengthArrayINTEL = 5817,\n    FunctionFloatControlINTEL = 5821,\n    FPGAMemoryAttributesINTEL = 5824,\n    FPFastMathModeINTEL = 5837,\n    ArbitraryPrecisionIntegersINTEL = 5844,\n    ArbitraryPrecisionFloatingPointINTEL = 5845,\n    UnstructuredLoopControlsINTEL = 5886,\n    FPGALoopControlsINTEL = 5888,\n    KernelAttributesINTEL = 5892,\n    FPGAKernelAttributesINTEL = 5897,\n    FPGAMemoryAccessesINTEL = 5898,\n    FPGAClusterAttributesINTEL = 5904,\n    LoopFuseINTEL = 5906,\n    FPGADSPControlINTEL = 5908,\n    MemoryAccessAliasingINTEL = 5910,\n    FPGAInvocationPipeliningAttributesINTEL = 5916,\n    FPGABufferLocationINTEL = 5920,\n    ArbitraryPrecisionFixedPointINTEL = 5922,\n    USMStorageClassesINTEL = 5935,\n    RuntimeAlignedAttributeINTEL = 5939,\n    IOPipesINTEL = 5943,\n    BlockingPipesINTEL = 5945,\n    FPGARegINTEL = 5948,\n    DotProductInputAll = 6016,\n    DotProductInputAllKHR = 6016,\n    DotProductInput4x8Bit = 6017,\n    DotProductInput4x8BitKHR = 6017,\n    DotProductInput4x8BitPacked = 6018,\n    DotProductInput4x8BitPackedKHR = 6018,\n    DotProduct = 6019,\n    DotProductKHR = 6019,\n    RayCullMaskKHR = 6020,\n    CooperativeMatrixKHR = 6022,\n    ReplicatedCompositesEXT = 6024,\n    BitInstructions = 6025,\n    GroupNonUniformRotateKHR = 6026,\n    FloatControls2 = 6029,\n    AtomicFloat32AddEXT = 6033,\n    AtomicFloat64AddEXT = 6034,\n    LongCompositesINTEL = 6089,\n    OptNoneEXT = 6094,\n    OptNoneINTEL = 6094,\n    AtomicFloat16AddEXT = 6095,\n    DebugInfoModuleINTEL = 6114,\n    BFloat16ConversionINTEL = 6115,\n    SplitBarrierINTEL = 6141,\n    ArithmeticFenceEXT = 6144,\n    FPGAClusterAttributesV2INTEL = 6150,\n    FPGAKernelAttributesv2INTEL = 6161,\n    FPMaxErrorINTEL = 6169,\n    FPGALatencyControlINTEL = 6171,\n    FPGAArgumentInterfacesINTEL = 6174,\n    GlobalVariableHostAccessINTEL = 6187,\n    GlobalVariableFPGADecorationsINTEL = 6189,\n    SubgroupBufferPrefetchINTEL = 6220,\n    Subgroup2DBlockIOINTEL = 6228,\n    Subgroup2DBlockTransformINTEL = 6229,\n    Subgroup2DBlockTransposeINTEL = 6230,\n    SubgroupMatrixMultiplyAccumulateINTEL = 6236,\n    GroupUniformArithmeticKHR = 6400,\n    MaskedGatherScatterINTEL = 6427,\n    CacheControlsINTEL = 6441,\n    RegisterLimitsINTEL = 6460,\n    Max = 0x7fffffff,\n};\n\nenum class RayFlagsShift : unsigned {\n    OpaqueKHR = 0,\n    NoOpaqueKHR = 1,\n    TerminateOnFirstHitKHR = 2,\n    SkipClosestHitShaderKHR = 3,\n    CullBackFacingTrianglesKHR = 4,\n    CullFrontFacingTrianglesKHR = 5,\n    CullOpaqueKHR = 6,\n    CullNoOpaqueKHR = 7,\n    SkipBuiltinPrimitivesNV = 8,\n    SkipTrianglesKHR = 8,\n    SkipAABBsKHR = 9,\n    ForceOpacityMicromap2StateEXT = 10,\n    Max = 0x7fffffff,\n};\n\nenum class RayFlagsMask : unsigned {\n    MaskNone = 0,\n    OpaqueKHR = 0x00000001,\n    NoOpaqueKHR = 0x00000002,\n    TerminateOnFirstHitKHR = 0x00000004,\n    SkipClosestHitShaderKHR = 0x00000008,\n    CullBackFacingTrianglesKHR = 0x00000010,\n    CullFrontFacingTrianglesKHR = 0x00000020,\n    CullOpaqueKHR = 0x00000040,\n    CullNoOpaqueKHR = 0x00000080,\n    SkipBuiltinPrimitivesNV = 0x00000100,\n    SkipTrianglesKHR = 0x00000100,\n    SkipAABBsKHR = 0x00000200,\n    ForceOpacityMicromap2StateEXT = 0x00000400,\n};\n\nenum class RayQueryIntersection : unsigned {\n    RayQueryCandidateIntersectionKHR = 0,\n    RayQueryCommittedIntersectionKHR = 1,\n    Max = 0x7fffffff,\n};\n\nenum class RayQueryCommittedIntersectionType : unsigned {\n    RayQueryCommittedIntersectionNoneKHR = 0,\n    RayQueryCommittedIntersectionTriangleKHR = 1,\n    RayQueryCommittedIntersectionGeneratedKHR = 2,\n    Max = 0x7fffffff,\n};\n\nenum class RayQueryCandidateIntersectionType : unsigned {\n    RayQueryCandidateIntersectionTriangleKHR = 0,\n    RayQueryCandidateIntersectionAABBKHR = 1,\n    Max = 0x7fffffff,\n};\n\nenum class FragmentShadingRateShift : unsigned {\n    Vertical2Pixels = 0,\n    Vertical4Pixels = 1,\n    Horizontal2Pixels = 2,\n    Horizontal4Pixels = 3,\n    Max = 0x7fffffff,\n};\n\nenum class FragmentShadingRateMask : unsigned {\n    MaskNone = 0,\n    Vertical2Pixels = 0x00000001,\n    Vertical4Pixels = 0x00000002,\n    Horizontal2Pixels = 0x00000004,\n    Horizontal4Pixels = 0x00000008,\n};\n\nenum class FPDenormMode : unsigned {\n    Preserve = 0,\n    FlushToZero = 1,\n    Max = 0x7fffffff,\n};\n\nenum class FPOperationMode : unsigned {\n    IEEE = 0,\n    ALT = 1,\n    Max = 0x7fffffff,\n};\n\nenum class QuantizationModes : unsigned {\n    TRN = 0,\n    TRN_ZERO = 1,\n    RND = 2,\n    RND_ZERO = 3,\n    RND_INF = 4,\n    RND_MIN_INF = 5,\n    RND_CONV = 6,\n    RND_CONV_ODD = 7,\n    Max = 0x7fffffff,\n};\n\nenum class OverflowModes : unsigned {\n    WRAP = 0,\n    SAT = 1,\n    SAT_ZERO = 2,\n    SAT_SYM = 3,\n    Max = 0x7fffffff,\n};\n\nenum class PackedVectorFormat : unsigned {\n    PackedVectorFormat4x8Bit = 0,\n    PackedVectorFormat4x8BitKHR = 0,\n    Max = 0x7fffffff,\n};\n\nenum class CooperativeMatrixOperandsShift : unsigned {\n    MatrixASignedComponentsKHR = 0,\n    MatrixBSignedComponentsKHR = 1,\n    MatrixCSignedComponentsKHR = 2,\n    MatrixResultSignedComponentsKHR = 3,\n    SaturatingAccumulationKHR = 4,\n    Max = 0x7fffffff,\n};\n\nenum class CooperativeMatrixOperandsMask : unsigned {\n    MaskNone = 0,\n    MatrixASignedComponentsKHR = 0x00000001,\n    MatrixBSignedComponentsKHR = 0x00000002,\n    MatrixCSignedComponentsKHR = 0x00000004,\n    MatrixResultSignedComponentsKHR = 0x00000008,\n    SaturatingAccumulationKHR = 0x00000010,\n};\n\nenum class CooperativeMatrixLayout : unsigned {\n    RowMajorKHR = 0,\n    ColumnMajorKHR = 1,\n    RowBlockedInterleavedARM = 4202,\n    ColumnBlockedInterleavedARM = 4203,\n    Max = 0x7fffffff,\n};\n\nenum class CooperativeMatrixUse : unsigned {\n    MatrixAKHR = 0,\n    MatrixBKHR = 1,\n    MatrixAccumulatorKHR = 2,\n    Max = 0x7fffffff,\n};\n\nenum class CooperativeMatrixReduceShift : unsigned {\n    Row = 0,\n    Column = 1,\n    CooperativeMatrixReduce2x2 = 2,\n    Max = 0x7fffffff,\n};\n\nenum class CooperativeMatrixReduceMask : unsigned {\n    MaskNone = 0,\n    Row = 0x00000001,\n    Column = 0x00000002,\n    CooperativeMatrixReduce2x2 = 0x00000004,\n};\n\nenum class TensorClampMode : unsigned {\n    Undefined = 0,\n    Constant = 1,\n    ClampToEdge = 2,\n    Repeat = 3,\n    RepeatMirrored = 4,\n    Max = 0x7fffffff,\n};\n\nenum class TensorAddressingOperandsShift : unsigned {\n    TensorView = 0,\n    DecodeFunc = 1,\n    Max = 0x7fffffff,\n};\n\nenum class TensorAddressingOperandsMask : unsigned {\n    MaskNone = 0,\n    TensorView = 0x00000001,\n    DecodeFunc = 0x00000002,\n};\n\nenum class InitializationModeQualifier : unsigned {\n    InitOnDeviceReprogramINTEL = 0,\n    InitOnDeviceResetINTEL = 1,\n    Max = 0x7fffffff,\n};\n\nenum class HostAccessQualifier : unsigned {\n    NoneINTEL = 0,\n    ReadINTEL = 1,\n    WriteINTEL = 2,\n    ReadWriteINTEL = 3,\n    Max = 0x7fffffff,\n};\n\nenum class LoadCacheControl : unsigned {\n    UncachedINTEL = 0,\n    CachedINTEL = 1,\n    StreamingINTEL = 2,\n    InvalidateAfterReadINTEL = 3,\n    ConstCachedINTEL = 4,\n    Max = 0x7fffffff,\n};\n\nenum class StoreCacheControl : unsigned {\n    UncachedINTEL = 0,\n    WriteThroughINTEL = 1,\n    WriteBackINTEL = 2,\n    StreamingINTEL = 3,\n    Max = 0x7fffffff,\n};\n\nenum class NamedMaximumNumberOfRegisters : unsigned {\n    AutoINTEL = 0,\n    Max = 0x7fffffff,\n};\n\nenum class MatrixMultiplyAccumulateOperandsShift : unsigned {\n    MatrixASignedComponentsINTEL = 0,\n    MatrixBSignedComponentsINTEL = 1,\n    MatrixCBFloat16INTEL = 2,\n    MatrixResultBFloat16INTEL = 3,\n    MatrixAPackedInt8INTEL = 4,\n    MatrixBPackedInt8INTEL = 5,\n    MatrixAPackedInt4INTEL = 6,\n    MatrixBPackedInt4INTEL = 7,\n    MatrixATF32INTEL = 8,\n    MatrixBTF32INTEL = 9,\n    MatrixAPackedFloat16INTEL = 10,\n    MatrixBPackedFloat16INTEL = 11,\n    MatrixAPackedBFloat16INTEL = 12,\n    MatrixBPackedBFloat16INTEL = 13,\n    Max = 0x7fffffff,\n};\n\nenum class MatrixMultiplyAccumulateOperandsMask : unsigned {\n    MaskNone = 0,\n    MatrixASignedComponentsINTEL = 0x00000001,\n    MatrixBSignedComponentsINTEL = 0x00000002,\n    MatrixCBFloat16INTEL = 0x00000004,\n    MatrixResultBFloat16INTEL = 0x00000008,\n    MatrixAPackedInt8INTEL = 0x00000010,\n    MatrixBPackedInt8INTEL = 0x00000020,\n    MatrixAPackedInt4INTEL = 0x00000040,\n    MatrixBPackedInt4INTEL = 0x00000080,\n    MatrixATF32INTEL = 0x00000100,\n    MatrixBTF32INTEL = 0x00000200,\n    MatrixAPackedFloat16INTEL = 0x00000400,\n    MatrixBPackedFloat16INTEL = 0x00000800,\n    MatrixAPackedBFloat16INTEL = 0x00001000,\n    MatrixBPackedBFloat16INTEL = 0x00002000,\n};\n\nenum class RawAccessChainOperandsShift : unsigned {\n    RobustnessPerComponentNV = 0,\n    RobustnessPerElementNV = 1,\n    Max = 0x7fffffff,\n};\n\nenum class RawAccessChainOperandsMask : unsigned {\n    MaskNone = 0,\n    RobustnessPerComponentNV = 0x00000001,\n    RobustnessPerElementNV = 0x00000002,\n};\n\nenum class FPEncoding : unsigned {\n    BFloat16KHR = 0,\n    Float8E4M3EXT = 4214,\r\n    Float8E5M2EXT = 4215,\r\n    Max = 0x7fffffff,\n};\n\nenum class CooperativeVectorMatrixLayout : unsigned {\n    RowMajorNV = 0,\n    ColumnMajorNV = 1,\n    InferencingOptimalNV = 2,\n    TrainingOptimalNV = 3,\n    Max = 0x7fffffff,\n};\n\nenum class ComponentType : unsigned {\n    Float16NV = 0,\n    Float32NV = 1,\n    Float64NV = 2,\n    SignedInt8NV = 3,\n    SignedInt16NV = 4,\n    SignedInt32NV = 5,\n    SignedInt64NV = 6,\n    UnsignedInt8NV = 7,\n    UnsignedInt16NV = 8,\n    UnsignedInt32NV = 9,\n    UnsignedInt64NV = 10,\n    SignedInt8PackedNV = 1000491000,\n    UnsignedInt8PackedNV = 1000491001,\n    FloatE4M3NV = 1000491002,\n    FloatE5M2NV = 1000491003,\n    Max = 0x7fffffff,\n};\n\nenum class Op : unsigned {\n    OpNop = 0,\n    OpUndef = 1,\n    OpSourceContinued = 2,\n    OpSource = 3,\n    OpSourceExtension = 4,\n    OpName = 5,\n    OpMemberName = 6,\n    OpString = 7,\n    OpLine = 8,\n    OpExtension = 10,\n    OpExtInstImport = 11,\n    OpExtInst = 12,\n    OpMemoryModel = 14,\n    OpEntryPoint = 15,\n    OpExecutionMode = 16,\n    OpCapability = 17,\n    OpTypeVoid = 19,\n    OpTypeBool = 20,\n    OpTypeInt = 21,\n    OpTypeFloat = 22,\n    OpTypeVector = 23,\n    OpTypeMatrix = 24,\n    OpTypeImage = 25,\n    OpTypeSampler = 26,\n    OpTypeSampledImage = 27,\n    OpTypeArray = 28,\n    OpTypeRuntimeArray = 29,\n    OpTypeStruct = 30,\n    OpTypeOpaque = 31,\n    OpTypePointer = 32,\n    OpTypeFunction = 33,\n    OpTypeEvent = 34,\n    OpTypeDeviceEvent = 35,\n    OpTypeReserveId = 36,\n    OpTypeQueue = 37,\n    OpTypePipe = 38,\n    OpTypeForwardPointer = 39,\n    OpConstantTrue = 41,\n    OpConstantFalse = 42,\n    OpConstant = 43,\n    OpConstantComposite = 44,\n    OpConstantSampler = 45,\n    OpConstantNull = 46,\n    OpSpecConstantTrue = 48,\n    OpSpecConstantFalse = 49,\n    OpSpecConstant = 50,\n    OpSpecConstantComposite = 51,\n    OpSpecConstantOp = 52,\n    OpFunction = 54,\n    OpFunctionParameter = 55,\n    OpFunctionEnd = 56,\n    OpFunctionCall = 57,\n    OpVariable = 59,\n    OpImageTexelPointer = 60,\n    OpLoad = 61,\n    OpStore = 62,\n    OpCopyMemory = 63,\n    OpCopyMemorySized = 64,\n    OpAccessChain = 65,\n    OpInBoundsAccessChain = 66,\n    OpPtrAccessChain = 67,\n    OpArrayLength = 68,\n    OpGenericPtrMemSemantics = 69,\n    OpInBoundsPtrAccessChain = 70,\n    OpDecorate = 71,\n    OpMemberDecorate = 72,\n    OpDecorationGroup = 73,\n    OpGroupDecorate = 74,\n    OpGroupMemberDecorate = 75,\n    OpVectorExtractDynamic = 77,\n    OpVectorInsertDynamic = 78,\n    OpVectorShuffle = 79,\n    OpCompositeConstruct = 80,\n    OpCompositeExtract = 81,\n    OpCompositeInsert = 82,\n    OpCopyObject = 83,\n    OpTranspose = 84,\n    OpSampledImage = 86,\n    OpImageSampleImplicitLod = 87,\n    OpImageSampleExplicitLod = 88,\n    OpImageSampleDrefImplicitLod = 89,\n    OpImageSampleDrefExplicitLod = 90,\n    OpImageSampleProjImplicitLod = 91,\n    OpImageSampleProjExplicitLod = 92,\n    OpImageSampleProjDrefImplicitLod = 93,\n    OpImageSampleProjDrefExplicitLod = 94,\n    OpImageFetch = 95,\n    OpImageGather = 96,\n    OpImageDrefGather = 97,\n    OpImageRead = 98,\n    OpImageWrite = 99,\n    OpImage = 100,\n    OpImageQueryFormat = 101,\n    OpImageQueryOrder = 102,\n    OpImageQuerySizeLod = 103,\n    OpImageQuerySize = 104,\n    OpImageQueryLod = 105,\n    OpImageQueryLevels = 106,\n    OpImageQuerySamples = 107,\n    OpConvertFToU = 109,\n    OpConvertFToS = 110,\n    OpConvertSToF = 111,\n    OpConvertUToF = 112,\n    OpUConvert = 113,\n    OpSConvert = 114,\n    OpFConvert = 115,\n    OpQuantizeToF16 = 116,\n    OpConvertPtrToU = 117,\n    OpSatConvertSToU = 118,\n    OpSatConvertUToS = 119,\n    OpConvertUToPtr = 120,\n    OpPtrCastToGeneric = 121,\n    OpGenericCastToPtr = 122,\n    OpGenericCastToPtrExplicit = 123,\n    OpBitcast = 124,\n    OpSNegate = 126,\n    OpFNegate = 127,\n    OpIAdd = 128,\n    OpFAdd = 129,\n    OpISub = 130,\n    OpFSub = 131,\n    OpIMul = 132,\n    OpFMul = 133,\n    OpUDiv = 134,\n    OpSDiv = 135,\n    OpFDiv = 136,\n    OpUMod = 137,\n    OpSRem = 138,\n    OpSMod = 139,\n    OpFRem = 140,\n    OpFMod = 141,\n    OpVectorTimesScalar = 142,\n    OpMatrixTimesScalar = 143,\n    OpVectorTimesMatrix = 144,\n    OpMatrixTimesVector = 145,\n    OpMatrixTimesMatrix = 146,\n    OpOuterProduct = 147,\n    OpDot = 148,\n    OpIAddCarry = 149,\n    OpISubBorrow = 150,\n    OpUMulExtended = 151,\n    OpSMulExtended = 152,\n    OpAny = 154,\n    OpAll = 155,\n    OpIsNan = 156,\n    OpIsInf = 157,\n    OpIsFinite = 158,\n    OpIsNormal = 159,\n    OpSignBitSet = 160,\n    OpLessOrGreater = 161,\n    OpOrdered = 162,\n    OpUnordered = 163,\n    OpLogicalEqual = 164,\n    OpLogicalNotEqual = 165,\n    OpLogicalOr = 166,\n    OpLogicalAnd = 167,\n    OpLogicalNot = 168,\n    OpSelect = 169,\n    OpIEqual = 170,\n    OpINotEqual = 171,\n    OpUGreaterThan = 172,\n    OpSGreaterThan = 173,\n    OpUGreaterThanEqual = 174,\n    OpSGreaterThanEqual = 175,\n    OpULessThan = 176,\n    OpSLessThan = 177,\n    OpULessThanEqual = 178,\n    OpSLessThanEqual = 179,\n    OpFOrdEqual = 180,\n    OpFUnordEqual = 181,\n    OpFOrdNotEqual = 182,\n    OpFUnordNotEqual = 183,\n    OpFOrdLessThan = 184,\n    OpFUnordLessThan = 185,\n    OpFOrdGreaterThan = 186,\n    OpFUnordGreaterThan = 187,\n    OpFOrdLessThanEqual = 188,\n    OpFUnordLessThanEqual = 189,\n    OpFOrdGreaterThanEqual = 190,\n    OpFUnordGreaterThanEqual = 191,\n    OpShiftRightLogical = 194,\n    OpShiftRightArithmetic = 195,\n    OpShiftLeftLogical = 196,\n    OpBitwiseOr = 197,\n    OpBitwiseXor = 198,\n    OpBitwiseAnd = 199,\n    OpNot = 200,\n    OpBitFieldInsert = 201,\n    OpBitFieldSExtract = 202,\n    OpBitFieldUExtract = 203,\n    OpBitReverse = 204,\n    OpBitCount = 205,\n    OpDPdx = 207,\n    OpDPdy = 208,\n    OpFwidth = 209,\n    OpDPdxFine = 210,\n    OpDPdyFine = 211,\n    OpFwidthFine = 212,\n    OpDPdxCoarse = 213,\n    OpDPdyCoarse = 214,\n    OpFwidthCoarse = 215,\n    OpEmitVertex = 218,\n    OpEndPrimitive = 219,\n    OpEmitStreamVertex = 220,\n    OpEndStreamPrimitive = 221,\n    OpControlBarrier = 224,\n    OpMemoryBarrier = 225,\n    OpAtomicLoad = 227,\n    OpAtomicStore = 228,\n    OpAtomicExchange = 229,\n    OpAtomicCompareExchange = 230,\n    OpAtomicCompareExchangeWeak = 231,\n    OpAtomicIIncrement = 232,\n    OpAtomicIDecrement = 233,\n    OpAtomicIAdd = 234,\n    OpAtomicISub = 235,\n    OpAtomicSMin = 236,\n    OpAtomicUMin = 237,\n    OpAtomicSMax = 238,\n    OpAtomicUMax = 239,\n    OpAtomicAnd = 240,\n    OpAtomicOr = 241,\n    OpAtomicXor = 242,\n    OpPhi = 245,\n    OpLoopMerge = 246,\n    OpSelectionMerge = 247,\n    OpLabel = 248,\n    OpBranch = 249,\n    OpBranchConditional = 250,\n    OpSwitch = 251,\n    OpKill = 252,\n    OpReturn = 253,\n    OpReturnValue = 254,\n    OpUnreachable = 255,\n    OpLifetimeStart = 256,\n    OpLifetimeStop = 257,\n    OpGroupAsyncCopy = 259,\n    OpGroupWaitEvents = 260,\n    OpGroupAll = 261,\n    OpGroupAny = 262,\n    OpGroupBroadcast = 263,\n    OpGroupIAdd = 264,\n    OpGroupFAdd = 265,\n    OpGroupFMin = 266,\n    OpGroupUMin = 267,\n    OpGroupSMin = 268,\n    OpGroupFMax = 269,\n    OpGroupUMax = 270,\n    OpGroupSMax = 271,\n    OpReadPipe = 274,\n    OpWritePipe = 275,\n    OpReservedReadPipe = 276,\n    OpReservedWritePipe = 277,\n    OpReserveReadPipePackets = 278,\n    OpReserveWritePipePackets = 279,\n    OpCommitReadPipe = 280,\n    OpCommitWritePipe = 281,\n    OpIsValidReserveId = 282,\n    OpGetNumPipePackets = 283,\n    OpGetMaxPipePackets = 284,\n    OpGroupReserveReadPipePackets = 285,\n    OpGroupReserveWritePipePackets = 286,\n    OpGroupCommitReadPipe = 287,\n    OpGroupCommitWritePipe = 288,\n    OpEnqueueMarker = 291,\n    OpEnqueueKernel = 292,\n    OpGetKernelNDrangeSubGroupCount = 293,\n    OpGetKernelNDrangeMaxSubGroupSize = 294,\n    OpGetKernelWorkGroupSize = 295,\n    OpGetKernelPreferredWorkGroupSizeMultiple = 296,\n    OpRetainEvent = 297,\n    OpReleaseEvent = 298,\n    OpCreateUserEvent = 299,\n    OpIsValidEvent = 300,\n    OpSetUserEventStatus = 301,\n    OpCaptureEventProfilingInfo = 302,\n    OpGetDefaultQueue = 303,\n    OpBuildNDRange = 304,\n    OpImageSparseSampleImplicitLod = 305,\n    OpImageSparseSampleExplicitLod = 306,\n    OpImageSparseSampleDrefImplicitLod = 307,\n    OpImageSparseSampleDrefExplicitLod = 308,\n    OpImageSparseSampleProjImplicitLod = 309,\n    OpImageSparseSampleProjExplicitLod = 310,\n    OpImageSparseSampleProjDrefImplicitLod = 311,\n    OpImageSparseSampleProjDrefExplicitLod = 312,\n    OpImageSparseFetch = 313,\n    OpImageSparseGather = 314,\n    OpImageSparseDrefGather = 315,\n    OpImageSparseTexelsResident = 316,\n    OpNoLine = 317,\n    OpAtomicFlagTestAndSet = 318,\n    OpAtomicFlagClear = 319,\n    OpImageSparseRead = 320,\n    OpSizeOf = 321,\n    OpTypePipeStorage = 322,\n    OpConstantPipeStorage = 323,\n    OpCreatePipeFromPipeStorage = 324,\n    OpGetKernelLocalSizeForSubgroupCount = 325,\n    OpGetKernelMaxNumSubgroups = 326,\n    OpTypeNamedBarrier = 327,\n    OpNamedBarrierInitialize = 328,\n    OpMemoryNamedBarrier = 329,\n    OpModuleProcessed = 330,\n    OpExecutionModeId = 331,\n    OpDecorateId = 332,\n    OpGroupNonUniformElect = 333,\n    OpGroupNonUniformAll = 334,\n    OpGroupNonUniformAny = 335,\n    OpGroupNonUniformAllEqual = 336,\n    OpGroupNonUniformBroadcast = 337,\n    OpGroupNonUniformBroadcastFirst = 338,\n    OpGroupNonUniformBallot = 339,\n    OpGroupNonUniformInverseBallot = 340,\n    OpGroupNonUniformBallotBitExtract = 341,\n    OpGroupNonUniformBallotBitCount = 342,\n    OpGroupNonUniformBallotFindLSB = 343,\n    OpGroupNonUniformBallotFindMSB = 344,\n    OpGroupNonUniformShuffle = 345,\n    OpGroupNonUniformShuffleXor = 346,\n    OpGroupNonUniformShuffleUp = 347,\n    OpGroupNonUniformShuffleDown = 348,\n    OpGroupNonUniformIAdd = 349,\n    OpGroupNonUniformFAdd = 350,\n    OpGroupNonUniformIMul = 351,\n    OpGroupNonUniformFMul = 352,\n    OpGroupNonUniformSMin = 353,\n    OpGroupNonUniformUMin = 354,\n    OpGroupNonUniformFMin = 355,\n    OpGroupNonUniformSMax = 356,\n    OpGroupNonUniformUMax = 357,\n    OpGroupNonUniformFMax = 358,\n    OpGroupNonUniformBitwiseAnd = 359,\n    OpGroupNonUniformBitwiseOr = 360,\n    OpGroupNonUniformBitwiseXor = 361,\n    OpGroupNonUniformLogicalAnd = 362,\n    OpGroupNonUniformLogicalOr = 363,\n    OpGroupNonUniformLogicalXor = 364,\n    OpGroupNonUniformQuadBroadcast = 365,\n    OpGroupNonUniformQuadSwap = 366,\n    OpCopyLogical = 400,\n    OpPtrEqual = 401,\n    OpPtrNotEqual = 402,\n    OpPtrDiff = 403,\n    OpColorAttachmentReadEXT = 4160,\n    OpDepthAttachmentReadEXT = 4161,\n    OpStencilAttachmentReadEXT = 4162,\n    OpTerminateInvocation = 4416,\n    OpTypeUntypedPointerKHR = 4417,\n    OpUntypedVariableKHR = 4418,\n    OpUntypedAccessChainKHR = 4419,\n    OpUntypedInBoundsAccessChainKHR = 4420,\n    OpSubgroupBallotKHR = 4421,\n    OpSubgroupFirstInvocationKHR = 4422,\n    OpUntypedPtrAccessChainKHR = 4423,\n    OpUntypedInBoundsPtrAccessChainKHR = 4424,\n    OpUntypedArrayLengthKHR = 4425,\n    OpUntypedPrefetchKHR = 4426,\n    OpSubgroupAllKHR = 4428,\n    OpSubgroupAnyKHR = 4429,\n    OpSubgroupAllEqualKHR = 4430,\n    OpGroupNonUniformRotateKHR = 4431,\n    OpSubgroupReadInvocationKHR = 4432,\n    OpExtInstWithForwardRefsKHR = 4433,\n    OpTraceRayKHR = 4445,\n    OpExecuteCallableKHR = 4446,\n    OpConvertUToAccelerationStructureKHR = 4447,\n    OpIgnoreIntersectionKHR = 4448,\n    OpTerminateRayKHR = 4449,\n    OpSDot = 4450,\n    OpSDotKHR = 4450,\n    OpUDot = 4451,\n    OpUDotKHR = 4451,\n    OpSUDot = 4452,\n    OpSUDotKHR = 4452,\n    OpSDotAccSat = 4453,\n    OpSDotAccSatKHR = 4453,\n    OpUDotAccSat = 4454,\n    OpUDotAccSatKHR = 4454,\n    OpSUDotAccSat = 4455,\n    OpSUDotAccSatKHR = 4455,\n    OpTypeCooperativeMatrixKHR = 4456,\n    OpCooperativeMatrixLoadKHR = 4457,\n    OpCooperativeMatrixStoreKHR = 4458,\n    OpCooperativeMatrixMulAddKHR = 4459,\n    OpCooperativeMatrixLengthKHR = 4460,\n    OpConstantCompositeReplicateEXT = 4461,\n    OpSpecConstantCompositeReplicateEXT = 4462,\n    OpCompositeConstructReplicateEXT = 4463,\n    OpTypeRayQueryKHR = 4472,\n    OpRayQueryInitializeKHR = 4473,\n    OpRayQueryTerminateKHR = 4474,\n    OpRayQueryGenerateIntersectionKHR = 4475,\n    OpRayQueryConfirmIntersectionKHR = 4476,\n    OpRayQueryProceedKHR = 4477,\n    OpRayQueryGetIntersectionTypeKHR = 4479,\n    OpImageSampleWeightedQCOM = 4480,\n    OpImageBoxFilterQCOM = 4481,\n    OpImageBlockMatchSSDQCOM = 4482,\n    OpImageBlockMatchSADQCOM = 4483,\n    OpImageBlockMatchWindowSSDQCOM = 4500,\n    OpImageBlockMatchWindowSADQCOM = 4501,\n    OpImageBlockMatchGatherSSDQCOM = 4502,\n    OpImageBlockMatchGatherSADQCOM = 4503,\n    OpGroupIAddNonUniformAMD = 5000,\n    OpGroupFAddNonUniformAMD = 5001,\n    OpGroupFMinNonUniformAMD = 5002,\n    OpGroupUMinNonUniformAMD = 5003,\n    OpGroupSMinNonUniformAMD = 5004,\n    OpGroupFMaxNonUniformAMD = 5005,\n    OpGroupUMaxNonUniformAMD = 5006,\n    OpGroupSMaxNonUniformAMD = 5007,\n    OpFragmentMaskFetchAMD = 5011,\n    OpFragmentFetchAMD = 5012,\n    OpReadClockKHR = 5056,\n    OpAllocateNodePayloadsAMDX = 5074,\n    OpEnqueueNodePayloadsAMDX = 5075,\n    OpTypeNodePayloadArrayAMDX = 5076,\n    OpFinishWritingNodePayloadAMDX = 5078,\n    OpNodePayloadArrayLengthAMDX = 5090,\n    OpIsNodePayloadValidAMDX = 5101,\n    OpConstantStringAMDX = 5103,\n    OpSpecConstantStringAMDX = 5104,\n    OpGroupNonUniformQuadAllKHR = 5110,\n    OpGroupNonUniformQuadAnyKHR = 5111,\n    OpHitObjectRecordHitMotionNV = 5249,\n    OpHitObjectRecordHitWithIndexMotionNV = 5250,\n    OpHitObjectRecordMissMotionNV = 5251,\n    OpHitObjectGetWorldToObjectNV = 5252,\n    OpHitObjectGetObjectToWorldNV = 5253,\n    OpHitObjectGetObjectRayDirectionNV = 5254,\n    OpHitObjectGetObjectRayOriginNV = 5255,\n    OpHitObjectTraceRayMotionNV = 5256,\n    OpHitObjectGetShaderRecordBufferHandleNV = 5257,\n    OpHitObjectGetShaderBindingTableRecordIndexNV = 5258,\n    OpHitObjectRecordEmptyNV = 5259,\n    OpHitObjectTraceRayNV = 5260,\n    OpHitObjectRecordHitNV = 5261,\n    OpHitObjectRecordHitWithIndexNV = 5262,\n    OpHitObjectRecordMissNV = 5263,\n    OpHitObjectExecuteShaderNV = 5264,\n    OpHitObjectGetCurrentTimeNV = 5265,\n    OpHitObjectGetAttributesNV = 5266,\n    OpHitObjectGetHitKindNV = 5267,\n    OpHitObjectGetPrimitiveIndexNV = 5268,\n    OpHitObjectGetGeometryIndexNV = 5269,\n    OpHitObjectGetInstanceIdNV = 5270,\n    OpHitObjectGetInstanceCustomIndexNV = 5271,\n    OpHitObjectGetWorldRayDirectionNV = 5272,\n    OpHitObjectGetWorldRayOriginNV = 5273,\n    OpHitObjectGetRayTMaxNV = 5274,\n    OpHitObjectGetRayTMinNV = 5275,\n    OpHitObjectIsEmptyNV = 5276,\n    OpHitObjectIsHitNV = 5277,\n    OpHitObjectIsMissNV = 5278,\n    OpReorderThreadWithHitObjectNV = 5279,\n    OpReorderThreadWithHintNV = 5280,\n    OpTypeHitObjectNV = 5281,\n    OpImageSampleFootprintNV = 5283,\n    OpTypeCooperativeVectorNV = 5288,\n    OpCooperativeVectorMatrixMulNV = 5289,\n    OpCooperativeVectorOuterProductAccumulateNV = 5290,\n    OpCooperativeVectorReduceSumAccumulateNV = 5291,\n    OpCooperativeVectorMatrixMulAddNV = 5292,\n    OpCooperativeMatrixConvertNV = 5293,\n    OpEmitMeshTasksEXT = 5294,\n    OpSetMeshOutputsEXT = 5295,\n    OpGroupNonUniformPartitionNV = 5296,\n    OpWritePackedPrimitiveIndices4x8NV = 5299,\n    OpFetchMicroTriangleVertexPositionNV = 5300,\n    OpFetchMicroTriangleVertexBarycentricNV = 5301,\n    OpCooperativeVectorLoadNV = 5302,\n    OpCooperativeVectorStoreNV = 5303,\n    OpReportIntersectionKHR = 5334,\n    OpReportIntersectionNV = 5334,\n    OpIgnoreIntersectionNV = 5335,\n    OpTerminateRayNV = 5336,\n    OpTraceNV = 5337,\n    OpTraceMotionNV = 5338,\n    OpTraceRayMotionNV = 5339,\n    OpRayQueryGetIntersectionTriangleVertexPositionsKHR = 5340,\n    OpTypeAccelerationStructureKHR = 5341,\n    OpTypeAccelerationStructureNV = 5341,\n    OpExecuteCallableNV = 5344,\n    OpRayQueryGetClusterIdNV = 5345,\n    OpHitObjectGetClusterIdNV = 5346,\n    OpTypeCooperativeMatrixNV = 5358,\n    OpCooperativeMatrixLoadNV = 5359,\n    OpCooperativeMatrixStoreNV = 5360,\n    OpCooperativeMatrixMulAddNV = 5361,\n    OpCooperativeMatrixLengthNV = 5362,\n    OpBeginInvocationInterlockEXT = 5364,\n    OpEndInvocationInterlockEXT = 5365,\n    OpCooperativeMatrixReduceNV = 5366,\n    OpCooperativeMatrixLoadTensorNV = 5367,\n    OpCooperativeMatrixStoreTensorNV = 5368,\n    OpCooperativeMatrixPerElementOpNV = 5369,\n    OpTypeTensorLayoutNV = 5370,\n    OpTypeTensorViewNV = 5371,\n    OpCreateTensorLayoutNV = 5372,\n    OpTensorLayoutSetDimensionNV = 5373,\n    OpTensorLayoutSetStrideNV = 5374,\n    OpTensorLayoutSliceNV = 5375,\n    OpTensorLayoutSetClampValueNV = 5376,\n    OpCreateTensorViewNV = 5377,\n    OpTensorViewSetDimensionNV = 5378,\n    OpTensorViewSetStrideNV = 5379,\n    OpDemoteToHelperInvocation = 5380,\n    OpDemoteToHelperInvocationEXT = 5380,\n    OpIsHelperInvocationEXT = 5381,\n    OpTensorViewSetClipNV = 5382,\n    OpTensorLayoutSetBlockSizeNV = 5384,\n    OpCooperativeMatrixTransposeNV = 5390,\n    OpConvertUToImageNV = 5391,\n    OpConvertUToSamplerNV = 5392,\n    OpConvertImageToUNV = 5393,\n    OpConvertSamplerToUNV = 5394,\n    OpConvertUToSampledImageNV = 5395,\n    OpConvertSampledImageToUNV = 5396,\n    OpSamplerImageAddressingModeNV = 5397,\n    OpRawAccessChainNV = 5398,\n    OpRayQueryGetIntersectionSpherePositionNV = 5427,\n    OpRayQueryGetIntersectionSphereRadiusNV = 5428,\n    OpRayQueryGetIntersectionLSSPositionsNV = 5429,\n    OpRayQueryGetIntersectionLSSRadiiNV = 5430,\n    OpRayQueryGetIntersectionLSSHitValueNV = 5431,\n    OpHitObjectGetSpherePositionNV = 5432,\n    OpHitObjectGetSphereRadiusNV = 5433,\n    OpHitObjectGetLSSPositionsNV = 5434,\n    OpHitObjectGetLSSRadiiNV = 5435,\n    OpHitObjectIsSphereHitNV = 5436,\n    OpHitObjectIsLSSHitNV = 5437,\n    OpRayQueryIsSphereHitNV = 5438,\n    OpRayQueryIsLSSHitNV = 5439,\n    OpSubgroupShuffleINTEL = 5571,\n    OpSubgroupShuffleDownINTEL = 5572,\n    OpSubgroupShuffleUpINTEL = 5573,\n    OpSubgroupShuffleXorINTEL = 5574,\n    OpSubgroupBlockReadINTEL = 5575,\n    OpSubgroupBlockWriteINTEL = 5576,\n    OpSubgroupImageBlockReadINTEL = 5577,\n    OpSubgroupImageBlockWriteINTEL = 5578,\n    OpSubgroupImageMediaBlockReadINTEL = 5580,\n    OpSubgroupImageMediaBlockWriteINTEL = 5581,\n    OpUCountLeadingZerosINTEL = 5585,\n    OpUCountTrailingZerosINTEL = 5586,\n    OpAbsISubINTEL = 5587,\n    OpAbsUSubINTEL = 5588,\n    OpIAddSatINTEL = 5589,\n    OpUAddSatINTEL = 5590,\n    OpIAverageINTEL = 5591,\n    OpUAverageINTEL = 5592,\n    OpIAverageRoundedINTEL = 5593,\n    OpUAverageRoundedINTEL = 5594,\n    OpISubSatINTEL = 5595,\n    OpUSubSatINTEL = 5596,\n    OpIMul32x16INTEL = 5597,\n    OpUMul32x16INTEL = 5598,\n    OpConstantFunctionPointerINTEL = 5600,\n    OpFunctionPointerCallINTEL = 5601,\n    OpAsmTargetINTEL = 5609,\n    OpAsmINTEL = 5610,\n    OpAsmCallINTEL = 5611,\n    OpAtomicFMinEXT = 5614,\n    OpAtomicFMaxEXT = 5615,\n    OpAssumeTrueKHR = 5630,\n    OpExpectKHR = 5631,\n    OpDecorateString = 5632,\n    OpDecorateStringGOOGLE = 5632,\n    OpMemberDecorateString = 5633,\n    OpMemberDecorateStringGOOGLE = 5633,\n    OpVmeImageINTEL = 5699,\n    OpTypeVmeImageINTEL = 5700,\n    OpTypeAvcImePayloadINTEL = 5701,\n    OpTypeAvcRefPayloadINTEL = 5702,\n    OpTypeAvcSicPayloadINTEL = 5703,\n    OpTypeAvcMcePayloadINTEL = 5704,\n    OpTypeAvcMceResultINTEL = 5705,\n    OpTypeAvcImeResultINTEL = 5706,\n    OpTypeAvcImeResultSingleReferenceStreamoutINTEL = 5707,\n    OpTypeAvcImeResultDualReferenceStreamoutINTEL = 5708,\n    OpTypeAvcImeSingleReferenceStreaminINTEL = 5709,\n    OpTypeAvcImeDualReferenceStreaminINTEL = 5710,\n    OpTypeAvcRefResultINTEL = 5711,\n    OpTypeAvcSicResultINTEL = 5712,\n    OpSubgroupAvcMceGetDefaultInterBaseMultiReferencePenaltyINTEL = 5713,\n    OpSubgroupAvcMceSetInterBaseMultiReferencePenaltyINTEL = 5714,\n    OpSubgroupAvcMceGetDefaultInterShapePenaltyINTEL = 5715,\n    OpSubgroupAvcMceSetInterShapePenaltyINTEL = 5716,\n    OpSubgroupAvcMceGetDefaultInterDirectionPenaltyINTEL = 5717,\n    OpSubgroupAvcMceSetInterDirectionPenaltyINTEL = 5718,\n    OpSubgroupAvcMceGetDefaultIntraLumaShapePenaltyINTEL = 5719,\n    OpSubgroupAvcMceGetDefaultInterMotionVectorCostTableINTEL = 5720,\n    OpSubgroupAvcMceGetDefaultHighPenaltyCostTableINTEL = 5721,\n    OpSubgroupAvcMceGetDefaultMediumPenaltyCostTableINTEL = 5722,\n    OpSubgroupAvcMceGetDefaultLowPenaltyCostTableINTEL = 5723,\n    OpSubgroupAvcMceSetMotionVectorCostFunctionINTEL = 5724,\n    OpSubgroupAvcMceGetDefaultIntraLumaModePenaltyINTEL = 5725,\n    OpSubgroupAvcMceGetDefaultNonDcLumaIntraPenaltyINTEL = 5726,\n    OpSubgroupAvcMceGetDefaultIntraChromaModeBasePenaltyINTEL = 5727,\n    OpSubgroupAvcMceSetAcOnlyHaarINTEL = 5728,\n    OpSubgroupAvcMceSetSourceInterlacedFieldPolarityINTEL = 5729,\n    OpSubgroupAvcMceSetSingleReferenceInterlacedFieldPolarityINTEL = 5730,\n    OpSubgroupAvcMceSetDualReferenceInterlacedFieldPolaritiesINTEL = 5731,\n    OpSubgroupAvcMceConvertToImePayloadINTEL = 5732,\n    OpSubgroupAvcMceConvertToImeResultINTEL = 5733,\n    OpSubgroupAvcMceConvertToRefPayloadINTEL = 5734,\n    OpSubgroupAvcMceConvertToRefResultINTEL = 5735,\n    OpSubgroupAvcMceConvertToSicPayloadINTEL = 5736,\n    OpSubgroupAvcMceConvertToSicResultINTEL = 5737,\n    OpSubgroupAvcMceGetMotionVectorsINTEL = 5738,\n    OpSubgroupAvcMceGetInterDistortionsINTEL = 5739,\n    OpSubgroupAvcMceGetBestInterDistortionsINTEL = 5740,\n    OpSubgroupAvcMceGetInterMajorShapeINTEL = 5741,\n    OpSubgroupAvcMceGetInterMinorShapeINTEL = 5742,\n    OpSubgroupAvcMceGetInterDirectionsINTEL = 5743,\n    OpSubgroupAvcMceGetInterMotionVectorCountINTEL = 5744,\n    OpSubgroupAvcMceGetInterReferenceIdsINTEL = 5745,\n    OpSubgroupAvcMceGetInterReferenceInterlacedFieldPolaritiesINTEL = 5746,\n    OpSubgroupAvcImeInitializeINTEL = 5747,\n    OpSubgroupAvcImeSetSingleReferenceINTEL = 5748,\n    OpSubgroupAvcImeSetDualReferenceINTEL = 5749,\n    OpSubgroupAvcImeRefWindowSizeINTEL = 5750,\n    OpSubgroupAvcImeAdjustRefOffsetINTEL = 5751,\n    OpSubgroupAvcImeConvertToMcePayloadINTEL = 5752,\n    OpSubgroupAvcImeSetMaxMotionVectorCountINTEL = 5753,\n    OpSubgroupAvcImeSetUnidirectionalMixDisableINTEL = 5754,\n    OpSubgroupAvcImeSetEarlySearchTerminationThresholdINTEL = 5755,\n    OpSubgroupAvcImeSetWeightedSadINTEL = 5756,\n    OpSubgroupAvcImeEvaluateWithSingleReferenceINTEL = 5757,\n    OpSubgroupAvcImeEvaluateWithDualReferenceINTEL = 5758,\n    OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminINTEL = 5759,\n    OpSubgroupAvcImeEvaluateWithDualReferenceStreaminINTEL = 5760,\n    OpSubgroupAvcImeEvaluateWithSingleReferenceStreamoutINTEL = 5761,\n    OpSubgroupAvcImeEvaluateWithDualReferenceStreamoutINTEL = 5762,\n    OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminoutINTEL = 5763,\n    OpSubgroupAvcImeEvaluateWithDualReferenceStreaminoutINTEL = 5764,\n    OpSubgroupAvcImeConvertToMceResultINTEL = 5765,\n    OpSubgroupAvcImeGetSingleReferenceStreaminINTEL = 5766,\n    OpSubgroupAvcImeGetDualReferenceStreaminINTEL = 5767,\n    OpSubgroupAvcImeStripSingleReferenceStreamoutINTEL = 5768,\n    OpSubgroupAvcImeStripDualReferenceStreamoutINTEL = 5769,\n    OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeMotionVectorsINTEL = 5770,\n    OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeDistortionsINTEL = 5771,\n    OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeReferenceIdsINTEL = 5772,\n    OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeMotionVectorsINTEL = 5773,\n    OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeDistortionsINTEL = 5774,\n    OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeReferenceIdsINTEL = 5775,\n    OpSubgroupAvcImeGetBorderReachedINTEL = 5776,\n    OpSubgroupAvcImeGetTruncatedSearchIndicationINTEL = 5777,\n    OpSubgroupAvcImeGetUnidirectionalEarlySearchTerminationINTEL = 5778,\n    OpSubgroupAvcImeGetWeightingPatternMinimumMotionVectorINTEL = 5779,\n    OpSubgroupAvcImeGetWeightingPatternMinimumDistortionINTEL = 5780,\n    OpSubgroupAvcFmeInitializeINTEL = 5781,\n    OpSubgroupAvcBmeInitializeINTEL = 5782,\n    OpSubgroupAvcRefConvertToMcePayloadINTEL = 5783,\n    OpSubgroupAvcRefSetBidirectionalMixDisableINTEL = 5784,\n    OpSubgroupAvcRefSetBilinearFilterEnableINTEL = 5785,\n    OpSubgroupAvcRefEvaluateWithSingleReferenceINTEL = 5786,\n    OpSubgroupAvcRefEvaluateWithDualReferenceINTEL = 5787,\n    OpSubgroupAvcRefEvaluateWithMultiReferenceINTEL = 5788,\n    OpSubgroupAvcRefEvaluateWithMultiReferenceInterlacedINTEL = 5789,\n    OpSubgroupAvcRefConvertToMceResultINTEL = 5790,\n    OpSubgroupAvcSicInitializeINTEL = 5791,\n    OpSubgroupAvcSicConfigureSkcINTEL = 5792,\n    OpSubgroupAvcSicConfigureIpeLumaINTEL = 5793,\n    OpSubgroupAvcSicConfigureIpeLumaChromaINTEL = 5794,\n    OpSubgroupAvcSicGetMotionVectorMaskINTEL = 5795,\n    OpSubgroupAvcSicConvertToMcePayloadINTEL = 5796,\n    OpSubgroupAvcSicSetIntraLumaShapePenaltyINTEL = 5797,\n    OpSubgroupAvcSicSetIntraLumaModeCostFunctionINTEL = 5798,\n    OpSubgroupAvcSicSetIntraChromaModeCostFunctionINTEL = 5799,\n    OpSubgroupAvcSicSetBilinearFilterEnableINTEL = 5800,\n    OpSubgroupAvcSicSetSkcForwardTransformEnableINTEL = 5801,\n    OpSubgroupAvcSicSetBlockBasedRawSkipSadINTEL = 5802,\n    OpSubgroupAvcSicEvaluateIpeINTEL = 5803,\n    OpSubgroupAvcSicEvaluateWithSingleReferenceINTEL = 5804,\n    OpSubgroupAvcSicEvaluateWithDualReferenceINTEL = 5805,\n    OpSubgroupAvcSicEvaluateWithMultiReferenceINTEL = 5806,\n    OpSubgroupAvcSicEvaluateWithMultiReferenceInterlacedINTEL = 5807,\n    OpSubgroupAvcSicConvertToMceResultINTEL = 5808,\n    OpSubgroupAvcSicGetIpeLumaShapeINTEL = 5809,\n    OpSubgroupAvcSicGetBestIpeLumaDistortionINTEL = 5810,\n    OpSubgroupAvcSicGetBestIpeChromaDistortionINTEL = 5811,\n    OpSubgroupAvcSicGetPackedIpeLumaModesINTEL = 5812,\n    OpSubgroupAvcSicGetIpeChromaModeINTEL = 5813,\n    OpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL = 5814,\n    OpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL = 5815,\n    OpSubgroupAvcSicGetInterRawSadsINTEL = 5816,\n    OpVariableLengthArrayINTEL = 5818,\n    OpSaveMemoryINTEL = 5819,\n    OpRestoreMemoryINTEL = 5820,\n    OpArbitraryFloatSinCosPiINTEL = 5840,\n    OpArbitraryFloatCastINTEL = 5841,\n    OpArbitraryFloatCastFromIntINTEL = 5842,\n    OpArbitraryFloatCastToIntINTEL = 5843,\n    OpArbitraryFloatAddINTEL = 5846,\n    OpArbitraryFloatSubINTEL = 5847,\n    OpArbitraryFloatMulINTEL = 5848,\n    OpArbitraryFloatDivINTEL = 5849,\n    OpArbitraryFloatGTINTEL = 5850,\n    OpArbitraryFloatGEINTEL = 5851,\n    OpArbitraryFloatLTINTEL = 5852,\n    OpArbitraryFloatLEINTEL = 5853,\n    OpArbitraryFloatEQINTEL = 5854,\n    OpArbitraryFloatRecipINTEL = 5855,\n    OpArbitraryFloatRSqrtINTEL = 5856,\n    OpArbitraryFloatCbrtINTEL = 5857,\n    OpArbitraryFloatHypotINTEL = 5858,\n    OpArbitraryFloatSqrtINTEL = 5859,\n    OpArbitraryFloatLogINTEL = 5860,\n    OpArbitraryFloatLog2INTEL = 5861,\n    OpArbitraryFloatLog10INTEL = 5862,\n    OpArbitraryFloatLog1pINTEL = 5863,\n    OpArbitraryFloatExpINTEL = 5864,\n    OpArbitraryFloatExp2INTEL = 5865,\n    OpArbitraryFloatExp10INTEL = 5866,\n    OpArbitraryFloatExpm1INTEL = 5867,\n    OpArbitraryFloatSinINTEL = 5868,\n    OpArbitraryFloatCosINTEL = 5869,\n    OpArbitraryFloatSinCosINTEL = 5870,\n    OpArbitraryFloatSinPiINTEL = 5871,\n    OpArbitraryFloatCosPiINTEL = 5872,\n    OpArbitraryFloatASinINTEL = 5873,\n    OpArbitraryFloatASinPiINTEL = 5874,\n    OpArbitraryFloatACosINTEL = 5875,\n    OpArbitraryFloatACosPiINTEL = 5876,\n    OpArbitraryFloatATanINTEL = 5877,\n    OpArbitraryFloatATanPiINTEL = 5878,\n    OpArbitraryFloatATan2INTEL = 5879,\n    OpArbitraryFloatPowINTEL = 5880,\n    OpArbitraryFloatPowRINTEL = 5881,\n    OpArbitraryFloatPowNINTEL = 5882,\n    OpLoopControlINTEL = 5887,\n    OpAliasDomainDeclINTEL = 5911,\n    OpAliasScopeDeclINTEL = 5912,\n    OpAliasScopeListDeclINTEL = 5913,\n    OpFixedSqrtINTEL = 5923,\n    OpFixedRecipINTEL = 5924,\n    OpFixedRsqrtINTEL = 5925,\n    OpFixedSinINTEL = 5926,\n    OpFixedCosINTEL = 5927,\n    OpFixedSinCosINTEL = 5928,\n    OpFixedSinPiINTEL = 5929,\n    OpFixedCosPiINTEL = 5930,\n    OpFixedSinCosPiINTEL = 5931,\n    OpFixedLogINTEL = 5932,\n    OpFixedExpINTEL = 5933,\n    OpPtrCastToCrossWorkgroupINTEL = 5934,\n    OpCrossWorkgroupCastToPtrINTEL = 5938,\n    OpReadPipeBlockingINTEL = 5946,\n    OpWritePipeBlockingINTEL = 5947,\n    OpFPGARegINTEL = 5949,\n    OpRayQueryGetRayTMinKHR = 6016,\n    OpRayQueryGetRayFlagsKHR = 6017,\n    OpRayQueryGetIntersectionTKHR = 6018,\n    OpRayQueryGetIntersectionInstanceCustomIndexKHR = 6019,\n    OpRayQueryGetIntersectionInstanceIdKHR = 6020,\n    OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR = 6021,\n    OpRayQueryGetIntersectionGeometryIndexKHR = 6022,\n    OpRayQueryGetIntersectionPrimitiveIndexKHR = 6023,\n    OpRayQueryGetIntersectionBarycentricsKHR = 6024,\n    OpRayQueryGetIntersectionFrontFaceKHR = 6025,\n    OpRayQueryGetIntersectionCandidateAABBOpaqueKHR = 6026,\n    OpRayQueryGetIntersectionObjectRayDirectionKHR = 6027,\n    OpRayQueryGetIntersectionObjectRayOriginKHR = 6028,\n    OpRayQueryGetWorldRayDirectionKHR = 6029,\n    OpRayQueryGetWorldRayOriginKHR = 6030,\n    OpRayQueryGetIntersectionObjectToWorldKHR = 6031,\n    OpRayQueryGetIntersectionWorldToObjectKHR = 6032,\n    OpAtomicFAddEXT = 6035,\n    OpTypeBufferSurfaceINTEL = 6086,\n    OpTypeStructContinuedINTEL = 6090,\n    OpConstantCompositeContinuedINTEL = 6091,\n    OpSpecConstantCompositeContinuedINTEL = 6092,\n    OpCompositeConstructContinuedINTEL = 6096,\n    OpConvertFToBF16INTEL = 6116,\n    OpConvertBF16ToFINTEL = 6117,\n    OpControlBarrierArriveINTEL = 6142,\n    OpControlBarrierWaitINTEL = 6143,\n    OpArithmeticFenceEXT = 6145,\n    OpSubgroupBlockPrefetchINTEL = 6221,\n    OpSubgroup2DBlockLoadINTEL = 6231,\n    OpSubgroup2DBlockLoadTransformINTEL = 6232,\n    OpSubgroup2DBlockLoadTransposeINTEL = 6233,\n    OpSubgroup2DBlockPrefetchINTEL = 6234,\n    OpSubgroup2DBlockStoreINTEL = 6235,\n    OpSubgroupMatrixMultiplyAccumulateINTEL = 6237,\n    OpGroupIMulKHR = 6401,\n    OpGroupFMulKHR = 6402,\n    OpGroupBitwiseAndKHR = 6403,\n    OpGroupBitwiseOrKHR = 6404,\n    OpGroupBitwiseXorKHR = 6405,\n    OpGroupLogicalAndKHR = 6406,\n    OpGroupLogicalOrKHR = 6407,\n    OpGroupLogicalXorKHR = 6408,\n    OpMaskedGatherINTEL = 6428,\n    OpMaskedScatterINTEL = 6429,\n    Max = 0x7fffffff,\n};\n\n#ifdef SPV_ENABLE_UTILITY_CODE\n#ifndef __cplusplus\n#include <stdbool.h>\n#endif\ninline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) {\n    *hasResult = *hasResultType = false;\n    switch (opcode) {\n    default: /* unknown opcode */ break;\n    case Op::OpNop: *hasResult = false; *hasResultType = false; break;\n    case Op::OpUndef: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSourceContinued: *hasResult = false; *hasResultType = false; break;\n    case Op::OpSource: *hasResult = false; *hasResultType = false; break;\n    case Op::OpSourceExtension: *hasResult = false; *hasResultType = false; break;\n    case Op::OpName: *hasResult = false; *hasResultType = false; break;\n    case Op::OpMemberName: *hasResult = false; *hasResultType = false; break;\n    case Op::OpString: *hasResult = true; *hasResultType = false; break;\n    case Op::OpLine: *hasResult = false; *hasResultType = false; break;\n    case Op::OpExtension: *hasResult = false; *hasResultType = false; break;\n    case Op::OpExtInstImport: *hasResult = true; *hasResultType = false; break;\n    case Op::OpExtInst: *hasResult = true; *hasResultType = true; break;\n    case Op::OpMemoryModel: *hasResult = false; *hasResultType = false; break;\n    case Op::OpEntryPoint: *hasResult = false; *hasResultType = false; break;\n    case Op::OpExecutionMode: *hasResult = false; *hasResultType = false; break;\n    case Op::OpCapability: *hasResult = false; *hasResultType = false; break;\n    case Op::OpTypeVoid: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeBool: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeInt: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeFloat: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeVector: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeMatrix: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeImage: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeSampler: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeSampledImage: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeArray: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeRuntimeArray: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeStruct: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeOpaque: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypePointer: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeFunction: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeEvent: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeDeviceEvent: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeReserveId: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeQueue: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypePipe: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeForwardPointer: *hasResult = false; *hasResultType = false; break;\n    case Op::OpConstantTrue: *hasResult = true; *hasResultType = true; break;\n    case Op::OpConstantFalse: *hasResult = true; *hasResultType = true; break;\n    case Op::OpConstant: *hasResult = true; *hasResultType = true; break;\n    case Op::OpConstantComposite: *hasResult = true; *hasResultType = true; break;\n    case Op::OpConstantSampler: *hasResult = true; *hasResultType = true; break;\n    case Op::OpConstantNull: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSpecConstantTrue: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSpecConstantFalse: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSpecConstant: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSpecConstantComposite: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSpecConstantOp: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFunction: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFunctionParameter: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFunctionEnd: *hasResult = false; *hasResultType = false; break;\n    case Op::OpFunctionCall: *hasResult = true; *hasResultType = true; break;\n    case Op::OpVariable: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageTexelPointer: *hasResult = true; *hasResultType = true; break;\n    case Op::OpLoad: *hasResult = true; *hasResultType = true; break;\n    case Op::OpStore: *hasResult = false; *hasResultType = false; break;\n    case Op::OpCopyMemory: *hasResult = false; *hasResultType = false; break;\n    case Op::OpCopyMemorySized: *hasResult = false; *hasResultType = false; break;\n    case Op::OpAccessChain: *hasResult = true; *hasResultType = true; break;\n    case Op::OpInBoundsAccessChain: *hasResult = true; *hasResultType = true; break;\n    case Op::OpPtrAccessChain: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArrayLength: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGenericPtrMemSemantics: *hasResult = true; *hasResultType = true; break;\n    case Op::OpInBoundsPtrAccessChain: *hasResult = true; *hasResultType = true; break;\n    case Op::OpDecorate: *hasResult = false; *hasResultType = false; break;\n    case Op::OpMemberDecorate: *hasResult = false; *hasResultType = false; break;\n    case Op::OpDecorationGroup: *hasResult = true; *hasResultType = false; break;\n    case Op::OpGroupDecorate: *hasResult = false; *hasResultType = false; break;\n    case Op::OpGroupMemberDecorate: *hasResult = false; *hasResultType = false; break;\n    case Op::OpVectorExtractDynamic: *hasResult = true; *hasResultType = true; break;\n    case Op::OpVectorInsertDynamic: *hasResult = true; *hasResultType = true; break;\n    case Op::OpVectorShuffle: *hasResult = true; *hasResultType = true; break;\n    case Op::OpCompositeConstruct: *hasResult = true; *hasResultType = true; break;\n    case Op::OpCompositeExtract: *hasResult = true; *hasResultType = true; break;\n    case Op::OpCompositeInsert: *hasResult = true; *hasResultType = true; break;\n    case Op::OpCopyObject: *hasResult = true; *hasResultType = true; break;\n    case Op::OpTranspose: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSampledImage: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageSampleImplicitLod: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageSampleExplicitLod: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageSampleDrefImplicitLod: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageSampleDrefExplicitLod: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageSampleProjImplicitLod: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageSampleProjExplicitLod: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageSampleProjDrefImplicitLod: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageSampleProjDrefExplicitLod: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageFetch: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageGather: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageDrefGather: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageRead: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageWrite: *hasResult = false; *hasResultType = false; break;\n    case Op::OpImage: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageQueryFormat: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageQueryOrder: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageQuerySizeLod: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageQuerySize: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageQueryLod: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageQueryLevels: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageQuerySamples: *hasResult = true; *hasResultType = true; break;\n    case Op::OpConvertFToU: *hasResult = true; *hasResultType = true; break;\n    case Op::OpConvertFToS: *hasResult = true; *hasResultType = true; break;\n    case Op::OpConvertSToF: *hasResult = true; *hasResultType = true; break;\n    case Op::OpConvertUToF: *hasResult = true; *hasResultType = true; break;\n    case Op::OpUConvert: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSConvert: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFConvert: *hasResult = true; *hasResultType = true; break;\n    case Op::OpQuantizeToF16: *hasResult = true; *hasResultType = true; break;\n    case Op::OpConvertPtrToU: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSatConvertSToU: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSatConvertUToS: *hasResult = true; *hasResultType = true; break;\n    case Op::OpConvertUToPtr: *hasResult = true; *hasResultType = true; break;\n    case Op::OpPtrCastToGeneric: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGenericCastToPtr: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGenericCastToPtrExplicit: *hasResult = true; *hasResultType = true; break;\n    case Op::OpBitcast: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSNegate: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFNegate: *hasResult = true; *hasResultType = true; break;\n    case Op::OpIAdd: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFAdd: *hasResult = true; *hasResultType = true; break;\n    case Op::OpISub: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFSub: *hasResult = true; *hasResultType = true; break;\n    case Op::OpIMul: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFMul: *hasResult = true; *hasResultType = true; break;\n    case Op::OpUDiv: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSDiv: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFDiv: *hasResult = true; *hasResultType = true; break;\n    case Op::OpUMod: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSRem: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSMod: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFRem: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFMod: *hasResult = true; *hasResultType = true; break;\n    case Op::OpVectorTimesScalar: *hasResult = true; *hasResultType = true; break;\n    case Op::OpMatrixTimesScalar: *hasResult = true; *hasResultType = true; break;\n    case Op::OpVectorTimesMatrix: *hasResult = true; *hasResultType = true; break;\n    case Op::OpMatrixTimesVector: *hasResult = true; *hasResultType = true; break;\n    case Op::OpMatrixTimesMatrix: *hasResult = true; *hasResultType = true; break;\n    case Op::OpOuterProduct: *hasResult = true; *hasResultType = true; break;\n    case Op::OpDot: *hasResult = true; *hasResultType = true; break;\n    case Op::OpIAddCarry: *hasResult = true; *hasResultType = true; break;\n    case Op::OpISubBorrow: *hasResult = true; *hasResultType = true; break;\n    case Op::OpUMulExtended: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSMulExtended: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAny: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAll: *hasResult = true; *hasResultType = true; break;\n    case Op::OpIsNan: *hasResult = true; *hasResultType = true; break;\n    case Op::OpIsInf: *hasResult = true; *hasResultType = true; break;\n    case Op::OpIsFinite: *hasResult = true; *hasResultType = true; break;\n    case Op::OpIsNormal: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSignBitSet: *hasResult = true; *hasResultType = true; break;\n    case Op::OpLessOrGreater: *hasResult = true; *hasResultType = true; break;\n    case Op::OpOrdered: *hasResult = true; *hasResultType = true; break;\n    case Op::OpUnordered: *hasResult = true; *hasResultType = true; break;\n    case Op::OpLogicalEqual: *hasResult = true; *hasResultType = true; break;\n    case Op::OpLogicalNotEqual: *hasResult = true; *hasResultType = true; break;\n    case Op::OpLogicalOr: *hasResult = true; *hasResultType = true; break;\n    case Op::OpLogicalAnd: *hasResult = true; *hasResultType = true; break;\n    case Op::OpLogicalNot: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSelect: *hasResult = true; *hasResultType = true; break;\n    case Op::OpIEqual: *hasResult = true; *hasResultType = true; break;\n    case Op::OpINotEqual: *hasResult = true; *hasResultType = true; break;\n    case Op::OpUGreaterThan: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSGreaterThan: *hasResult = true; *hasResultType = true; break;\n    case Op::OpUGreaterThanEqual: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSGreaterThanEqual: *hasResult = true; *hasResultType = true; break;\n    case Op::OpULessThan: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSLessThan: *hasResult = true; *hasResultType = true; break;\n    case Op::OpULessThanEqual: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSLessThanEqual: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFOrdEqual: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFUnordEqual: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFOrdNotEqual: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFUnordNotEqual: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFOrdLessThan: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFUnordLessThan: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFOrdGreaterThan: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFUnordGreaterThan: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFOrdLessThanEqual: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFUnordLessThanEqual: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFOrdGreaterThanEqual: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFUnordGreaterThanEqual: *hasResult = true; *hasResultType = true; break;\n    case Op::OpShiftRightLogical: *hasResult = true; *hasResultType = true; break;\n    case Op::OpShiftRightArithmetic: *hasResult = true; *hasResultType = true; break;\n    case Op::OpShiftLeftLogical: *hasResult = true; *hasResultType = true; break;\n    case Op::OpBitwiseOr: *hasResult = true; *hasResultType = true; break;\n    case Op::OpBitwiseXor: *hasResult = true; *hasResultType = true; break;\n    case Op::OpBitwiseAnd: *hasResult = true; *hasResultType = true; break;\n    case Op::OpNot: *hasResult = true; *hasResultType = true; break;\n    case Op::OpBitFieldInsert: *hasResult = true; *hasResultType = true; break;\n    case Op::OpBitFieldSExtract: *hasResult = true; *hasResultType = true; break;\n    case Op::OpBitFieldUExtract: *hasResult = true; *hasResultType = true; break;\n    case Op::OpBitReverse: *hasResult = true; *hasResultType = true; break;\n    case Op::OpBitCount: *hasResult = true; *hasResultType = true; break;\n    case Op::OpDPdx: *hasResult = true; *hasResultType = true; break;\n    case Op::OpDPdy: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFwidth: *hasResult = true; *hasResultType = true; break;\n    case Op::OpDPdxFine: *hasResult = true; *hasResultType = true; break;\n    case Op::OpDPdyFine: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFwidthFine: *hasResult = true; *hasResultType = true; break;\n    case Op::OpDPdxCoarse: *hasResult = true; *hasResultType = true; break;\n    case Op::OpDPdyCoarse: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFwidthCoarse: *hasResult = true; *hasResultType = true; break;\n    case Op::OpEmitVertex: *hasResult = false; *hasResultType = false; break;\n    case Op::OpEndPrimitive: *hasResult = false; *hasResultType = false; break;\n    case Op::OpEmitStreamVertex: *hasResult = false; *hasResultType = false; break;\n    case Op::OpEndStreamPrimitive: *hasResult = false; *hasResultType = false; break;\n    case Op::OpControlBarrier: *hasResult = false; *hasResultType = false; break;\n    case Op::OpMemoryBarrier: *hasResult = false; *hasResultType = false; break;\n    case Op::OpAtomicLoad: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAtomicStore: *hasResult = false; *hasResultType = false; break;\n    case Op::OpAtomicExchange: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAtomicCompareExchange: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAtomicCompareExchangeWeak: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAtomicIIncrement: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAtomicIDecrement: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAtomicIAdd: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAtomicISub: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAtomicSMin: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAtomicUMin: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAtomicSMax: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAtomicUMax: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAtomicAnd: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAtomicOr: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAtomicXor: *hasResult = true; *hasResultType = true; break;\n    case Op::OpPhi: *hasResult = true; *hasResultType = true; break;\n    case Op::OpLoopMerge: *hasResult = false; *hasResultType = false; break;\n    case Op::OpSelectionMerge: *hasResult = false; *hasResultType = false; break;\n    case Op::OpLabel: *hasResult = true; *hasResultType = false; break;\n    case Op::OpBranch: *hasResult = false; *hasResultType = false; break;\n    case Op::OpBranchConditional: *hasResult = false; *hasResultType = false; break;\n    case Op::OpSwitch: *hasResult = false; *hasResultType = false; break;\n    case Op::OpKill: *hasResult = false; *hasResultType = false; break;\n    case Op::OpReturn: *hasResult = false; *hasResultType = false; break;\n    case Op::OpReturnValue: *hasResult = false; *hasResultType = false; break;\n    case Op::OpUnreachable: *hasResult = false; *hasResultType = false; break;\n    case Op::OpLifetimeStart: *hasResult = false; *hasResultType = false; break;\n    case Op::OpLifetimeStop: *hasResult = false; *hasResultType = false; break;\n    case Op::OpGroupAsyncCopy: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupWaitEvents: *hasResult = false; *hasResultType = false; break;\n    case Op::OpGroupAll: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupAny: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupBroadcast: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupIAdd: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupFAdd: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupFMin: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupUMin: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupSMin: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupFMax: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupUMax: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupSMax: *hasResult = true; *hasResultType = true; break;\n    case Op::OpReadPipe: *hasResult = true; *hasResultType = true; break;\n    case Op::OpWritePipe: *hasResult = true; *hasResultType = true; break;\n    case Op::OpReservedReadPipe: *hasResult = true; *hasResultType = true; break;\n    case Op::OpReservedWritePipe: *hasResult = true; *hasResultType = true; break;\n    case Op::OpReserveReadPipePackets: *hasResult = true; *hasResultType = true; break;\n    case Op::OpReserveWritePipePackets: *hasResult = true; *hasResultType = true; break;\n    case Op::OpCommitReadPipe: *hasResult = false; *hasResultType = false; break;\n    case Op::OpCommitWritePipe: *hasResult = false; *hasResultType = false; break;\n    case Op::OpIsValidReserveId: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGetNumPipePackets: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGetMaxPipePackets: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupReserveReadPipePackets: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupReserveWritePipePackets: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupCommitReadPipe: *hasResult = false; *hasResultType = false; break;\n    case Op::OpGroupCommitWritePipe: *hasResult = false; *hasResultType = false; break;\n    case Op::OpEnqueueMarker: *hasResult = true; *hasResultType = true; break;\n    case Op::OpEnqueueKernel: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGetKernelNDrangeSubGroupCount: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGetKernelNDrangeMaxSubGroupSize: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGetKernelWorkGroupSize: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGetKernelPreferredWorkGroupSizeMultiple: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRetainEvent: *hasResult = false; *hasResultType = false; break;\n    case Op::OpReleaseEvent: *hasResult = false; *hasResultType = false; break;\n    case Op::OpCreateUserEvent: *hasResult = true; *hasResultType = true; break;\n    case Op::OpIsValidEvent: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSetUserEventStatus: *hasResult = false; *hasResultType = false; break;\n    case Op::OpCaptureEventProfilingInfo: *hasResult = false; *hasResultType = false; break;\n    case Op::OpGetDefaultQueue: *hasResult = true; *hasResultType = true; break;\n    case Op::OpBuildNDRange: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageSparseSampleImplicitLod: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageSparseSampleExplicitLod: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageSparseSampleDrefImplicitLod: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageSparseSampleDrefExplicitLod: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageSparseSampleProjImplicitLod: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageSparseSampleProjExplicitLod: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageSparseSampleProjDrefImplicitLod: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageSparseSampleProjDrefExplicitLod: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageSparseFetch: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageSparseGather: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageSparseDrefGather: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageSparseTexelsResident: *hasResult = true; *hasResultType = true; break;\n    case Op::OpNoLine: *hasResult = false; *hasResultType = false; break;\n    case Op::OpAtomicFlagTestAndSet: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAtomicFlagClear: *hasResult = false; *hasResultType = false; break;\n    case Op::OpImageSparseRead: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSizeOf: *hasResult = true; *hasResultType = true; break;\n    case Op::OpTypePipeStorage: *hasResult = true; *hasResultType = false; break;\n    case Op::OpConstantPipeStorage: *hasResult = true; *hasResultType = true; break;\n    case Op::OpCreatePipeFromPipeStorage: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGetKernelLocalSizeForSubgroupCount: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGetKernelMaxNumSubgroups: *hasResult = true; *hasResultType = true; break;\n    case Op::OpTypeNamedBarrier: *hasResult = true; *hasResultType = false; break;\n    case Op::OpNamedBarrierInitialize: *hasResult = true; *hasResultType = true; break;\n    case Op::OpMemoryNamedBarrier: *hasResult = false; *hasResultType = false; break;\n    case Op::OpModuleProcessed: *hasResult = false; *hasResultType = false; break;\n    case Op::OpExecutionModeId: *hasResult = false; *hasResultType = false; break;\n    case Op::OpDecorateId: *hasResult = false; *hasResultType = false; break;\n    case Op::OpGroupNonUniformElect: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformAll: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformAny: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformAllEqual: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformBroadcast: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformBroadcastFirst: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformBallot: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformInverseBallot: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformBallotBitExtract: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformBallotBitCount: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformBallotFindLSB: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformBallotFindMSB: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformShuffle: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformShuffleXor: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformShuffleUp: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformShuffleDown: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformIAdd: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformFAdd: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformIMul: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformFMul: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformSMin: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformUMin: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformFMin: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformSMax: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformUMax: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformFMax: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformBitwiseAnd: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformBitwiseOr: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformBitwiseXor: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformLogicalAnd: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformLogicalOr: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformLogicalXor: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformQuadBroadcast: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformQuadSwap: *hasResult = true; *hasResultType = true; break;\n    case Op::OpCopyLogical: *hasResult = true; *hasResultType = true; break;\n    case Op::OpPtrEqual: *hasResult = true; *hasResultType = true; break;\n    case Op::OpPtrNotEqual: *hasResult = true; *hasResultType = true; break;\n    case Op::OpPtrDiff: *hasResult = true; *hasResultType = true; break;\n    case Op::OpColorAttachmentReadEXT: *hasResult = true; *hasResultType = true; break;\n    case Op::OpDepthAttachmentReadEXT: *hasResult = true; *hasResultType = true; break;\n    case Op::OpStencilAttachmentReadEXT: *hasResult = true; *hasResultType = true; break;\n    case Op::OpTerminateInvocation: *hasResult = false; *hasResultType = false; break;\n    case Op::OpTypeUntypedPointerKHR: *hasResult = true; *hasResultType = false; break;\n    case Op::OpUntypedVariableKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpUntypedAccessChainKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpUntypedInBoundsAccessChainKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupBallotKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupFirstInvocationKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpUntypedPtrAccessChainKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpUntypedInBoundsPtrAccessChainKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpUntypedArrayLengthKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpUntypedPrefetchKHR: *hasResult = false; *hasResultType = false; break;\n    case Op::OpSubgroupAllKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAnyKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAllEqualKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformRotateKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupReadInvocationKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpExtInstWithForwardRefsKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpTraceRayKHR: *hasResult = false; *hasResultType = false; break;\n    case Op::OpExecuteCallableKHR: *hasResult = false; *hasResultType = false; break;\n    case Op::OpConvertUToAccelerationStructureKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpIgnoreIntersectionKHR: *hasResult = false; *hasResultType = false; break;\n    case Op::OpTerminateRayKHR: *hasResult = false; *hasResultType = false; break;\n    case Op::OpSDot: *hasResult = true; *hasResultType = true; break;\n    case Op::OpUDot: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSUDot: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSDotAccSat: *hasResult = true; *hasResultType = true; break;\n    case Op::OpUDotAccSat: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSUDotAccSat: *hasResult = true; *hasResultType = true; break;\n    case Op::OpTypeCooperativeMatrixKHR: *hasResult = true; *hasResultType = false; break;\n    case Op::OpCooperativeMatrixLoadKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpCooperativeMatrixStoreKHR: *hasResult = false; *hasResultType = false; break;\n    case Op::OpCooperativeMatrixMulAddKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpCooperativeMatrixLengthKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpConstantCompositeReplicateEXT: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSpecConstantCompositeReplicateEXT: *hasResult = true; *hasResultType = true; break;\n    case Op::OpCompositeConstructReplicateEXT: *hasResult = true; *hasResultType = true; break;\n    case Op::OpTypeRayQueryKHR: *hasResult = true; *hasResultType = false; break;\n    case Op::OpRayQueryInitializeKHR: *hasResult = false; *hasResultType = false; break;\n    case Op::OpRayQueryTerminateKHR: *hasResult = false; *hasResultType = false; break;\n    case Op::OpRayQueryGenerateIntersectionKHR: *hasResult = false; *hasResultType = false; break;\n    case Op::OpRayQueryConfirmIntersectionKHR: *hasResult = false; *hasResultType = false; break;\n    case Op::OpRayQueryProceedKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryGetIntersectionTypeKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageSampleWeightedQCOM: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageBoxFilterQCOM: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageBlockMatchSSDQCOM: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageBlockMatchSADQCOM: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageBlockMatchWindowSSDQCOM: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageBlockMatchWindowSADQCOM: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageBlockMatchGatherSSDQCOM: *hasResult = true; *hasResultType = true; break;\n    case Op::OpImageBlockMatchGatherSADQCOM: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupIAddNonUniformAMD: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupFAddNonUniformAMD: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupFMinNonUniformAMD: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupUMinNonUniformAMD: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupSMinNonUniformAMD: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupFMaxNonUniformAMD: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupUMaxNonUniformAMD: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupSMaxNonUniformAMD: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFragmentMaskFetchAMD: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFragmentFetchAMD: *hasResult = true; *hasResultType = true; break;\n    case Op::OpReadClockKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAllocateNodePayloadsAMDX: *hasResult = true; *hasResultType = true; break;\n    case Op::OpEnqueueNodePayloadsAMDX: *hasResult = false; *hasResultType = false; break;\n    case Op::OpTypeNodePayloadArrayAMDX: *hasResult = true; *hasResultType = false; break;\n    case Op::OpFinishWritingNodePayloadAMDX: *hasResult = true; *hasResultType = true; break;\n    case Op::OpNodePayloadArrayLengthAMDX: *hasResult = true; *hasResultType = true; break;\n    case Op::OpIsNodePayloadValidAMDX: *hasResult = true; *hasResultType = true; break;\n    case Op::OpConstantStringAMDX: *hasResult = true; *hasResultType = false; break;\n    case Op::OpSpecConstantStringAMDX: *hasResult = true; *hasResultType = false; break;\n    case Op::OpGroupNonUniformQuadAllKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupNonUniformQuadAnyKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectRecordHitMotionNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpHitObjectRecordHitWithIndexMotionNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpHitObjectRecordMissMotionNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpHitObjectGetWorldToObjectNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectGetObjectToWorldNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectGetObjectRayDirectionNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectGetObjectRayOriginNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectTraceRayMotionNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpHitObjectGetShaderRecordBufferHandleNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectGetShaderBindingTableRecordIndexNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectRecordEmptyNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpHitObjectTraceRayNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpHitObjectRecordHitNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpHitObjectRecordHitWithIndexNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpHitObjectRecordMissNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpHitObjectExecuteShaderNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpHitObjectGetCurrentTimeNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectGetAttributesNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpHitObjectGetHitKindNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectGetPrimitiveIndexNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectGetGeometryIndexNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectGetInstanceIdNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectGetInstanceCustomIndexNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectGetWorldRayDirectionNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectGetWorldRayOriginNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectGetRayTMaxNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectGetRayTMinNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectIsEmptyNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectIsHitNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectIsMissNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpReorderThreadWithHitObjectNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpReorderThreadWithHintNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpTypeHitObjectNV: *hasResult = true; *hasResultType = false; break;\n    case Op::OpImageSampleFootprintNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpTypeCooperativeVectorNV: *hasResult = true; *hasResultType = false; break;\n    case Op::OpCooperativeVectorMatrixMulNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpCooperativeVectorOuterProductAccumulateNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpCooperativeVectorReduceSumAccumulateNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpCooperativeVectorMatrixMulAddNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpCooperativeMatrixConvertNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpEmitMeshTasksEXT: *hasResult = false; *hasResultType = false; break;\n    case Op::OpSetMeshOutputsEXT: *hasResult = false; *hasResultType = false; break;\n    case Op::OpGroupNonUniformPartitionNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpWritePackedPrimitiveIndices4x8NV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpFetchMicroTriangleVertexPositionNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFetchMicroTriangleVertexBarycentricNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpCooperativeVectorLoadNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpCooperativeVectorStoreNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpReportIntersectionKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpIgnoreIntersectionNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpTerminateRayNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpTraceNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpTraceMotionNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpTraceRayMotionNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpRayQueryGetIntersectionTriangleVertexPositionsKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpTypeAccelerationStructureKHR: *hasResult = true; *hasResultType = false; break;\n    case Op::OpExecuteCallableNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpRayQueryGetClusterIdNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectGetClusterIdNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpTypeCooperativeMatrixNV: *hasResult = true; *hasResultType = false; break;\n    case Op::OpCooperativeMatrixLoadNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpCooperativeMatrixStoreNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpCooperativeMatrixMulAddNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpCooperativeMatrixLengthNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpBeginInvocationInterlockEXT: *hasResult = false; *hasResultType = false; break;\n    case Op::OpEndInvocationInterlockEXT: *hasResult = false; *hasResultType = false; break;\n    case Op::OpCooperativeMatrixReduceNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpCooperativeMatrixLoadTensorNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpCooperativeMatrixStoreTensorNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpCooperativeMatrixPerElementOpNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpTypeTensorLayoutNV: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeTensorViewNV: *hasResult = true; *hasResultType = false; break;\n    case Op::OpCreateTensorLayoutNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpTensorLayoutSetDimensionNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpTensorLayoutSetStrideNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpTensorLayoutSliceNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpTensorLayoutSetClampValueNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpCreateTensorViewNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpTensorViewSetDimensionNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpTensorViewSetStrideNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpDemoteToHelperInvocation: *hasResult = false; *hasResultType = false; break;\n    case Op::OpIsHelperInvocationEXT: *hasResult = true; *hasResultType = true; break;\n    case Op::OpTensorViewSetClipNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpTensorLayoutSetBlockSizeNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpCooperativeMatrixTransposeNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpConvertUToImageNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpConvertUToSamplerNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpConvertImageToUNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpConvertSamplerToUNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpConvertUToSampledImageNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpConvertSampledImageToUNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSamplerImageAddressingModeNV: *hasResult = false; *hasResultType = false; break;\n    case Op::OpRawAccessChainNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryGetIntersectionSpherePositionNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryGetIntersectionSphereRadiusNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryGetIntersectionLSSPositionsNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryGetIntersectionLSSRadiiNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryGetIntersectionLSSHitValueNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectGetSpherePositionNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectGetSphereRadiusNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectGetLSSPositionsNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectGetLSSRadiiNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectIsSphereHitNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpHitObjectIsLSSHitNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryIsSphereHitNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryIsLSSHitNV: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupShuffleINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupShuffleDownINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupShuffleUpINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupShuffleXorINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupBlockReadINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupBlockWriteINTEL: *hasResult = false; *hasResultType = false; break;\n    case Op::OpSubgroupImageBlockReadINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupImageBlockWriteINTEL: *hasResult = false; *hasResultType = false; break;\n    case Op::OpSubgroupImageMediaBlockReadINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupImageMediaBlockWriteINTEL: *hasResult = false; *hasResultType = false; break;\n    case Op::OpUCountLeadingZerosINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpUCountTrailingZerosINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAbsISubINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAbsUSubINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpIAddSatINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpUAddSatINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpIAverageINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpUAverageINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpIAverageRoundedINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpUAverageRoundedINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpISubSatINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpUSubSatINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpIMul32x16INTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpUMul32x16INTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpConstantFunctionPointerINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFunctionPointerCallINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAsmTargetINTEL: *hasResult = true; *hasResultType = false; break;\n    case Op::OpAsmINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAsmCallINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAtomicFMinEXT: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAtomicFMaxEXT: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAssumeTrueKHR: *hasResult = false; *hasResultType = false; break;\n    case Op::OpExpectKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpDecorateString: *hasResult = false; *hasResultType = false; break;\n    case Op::OpMemberDecorateString: *hasResult = false; *hasResultType = false; break;\n    case Op::OpVmeImageINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpTypeVmeImageINTEL: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeAvcImePayloadINTEL: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeAvcRefPayloadINTEL: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeAvcSicPayloadINTEL: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeAvcMcePayloadINTEL: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeAvcMceResultINTEL: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeAvcImeResultINTEL: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeAvcImeResultSingleReferenceStreamoutINTEL: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeAvcImeResultDualReferenceStreamoutINTEL: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeAvcImeSingleReferenceStreaminINTEL: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeAvcImeDualReferenceStreaminINTEL: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeAvcRefResultINTEL: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeAvcSicResultINTEL: *hasResult = true; *hasResultType = false; break;\n    case Op::OpSubgroupAvcMceGetDefaultInterBaseMultiReferencePenaltyINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceSetInterBaseMultiReferencePenaltyINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceGetDefaultInterShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceSetInterShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceGetDefaultInterDirectionPenaltyINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceSetInterDirectionPenaltyINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceGetDefaultIntraLumaShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceGetDefaultInterMotionVectorCostTableINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceGetDefaultHighPenaltyCostTableINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceGetDefaultMediumPenaltyCostTableINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceGetDefaultLowPenaltyCostTableINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceSetMotionVectorCostFunctionINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceGetDefaultIntraLumaModePenaltyINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceGetDefaultNonDcLumaIntraPenaltyINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceGetDefaultIntraChromaModeBasePenaltyINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceSetAcOnlyHaarINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceSetSourceInterlacedFieldPolarityINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceSetSingleReferenceInterlacedFieldPolarityINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceSetDualReferenceInterlacedFieldPolaritiesINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceConvertToImePayloadINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceConvertToImeResultINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceConvertToRefPayloadINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceConvertToRefResultINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceConvertToSicPayloadINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceConvertToSicResultINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceGetMotionVectorsINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceGetInterDistortionsINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceGetBestInterDistortionsINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceGetInterMajorShapeINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceGetInterMinorShapeINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceGetInterDirectionsINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceGetInterMotionVectorCountINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceGetInterReferenceIdsINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcMceGetInterReferenceInterlacedFieldPolaritiesINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeInitializeINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeSetSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeSetDualReferenceINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeRefWindowSizeINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeAdjustRefOffsetINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeConvertToMcePayloadINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeSetMaxMotionVectorCountINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeSetUnidirectionalMixDisableINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeSetEarlySearchTerminationThresholdINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeSetWeightedSadINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeEvaluateWithSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeEvaluateWithDualReferenceINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeEvaluateWithDualReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeEvaluateWithSingleReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeEvaluateWithDualReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminoutINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeEvaluateWithDualReferenceStreaminoutINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeConvertToMceResultINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeGetSingleReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeGetDualReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeStripSingleReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeStripDualReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeMotionVectorsINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeDistortionsINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeReferenceIdsINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeMotionVectorsINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeDistortionsINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeReferenceIdsINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeGetBorderReachedINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeGetTruncatedSearchIndicationINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeGetUnidirectionalEarlySearchTerminationINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeGetWeightingPatternMinimumMotionVectorINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcImeGetWeightingPatternMinimumDistortionINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcFmeInitializeINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcBmeInitializeINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcRefConvertToMcePayloadINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcRefSetBidirectionalMixDisableINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcRefSetBilinearFilterEnableINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcRefEvaluateWithSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcRefEvaluateWithDualReferenceINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcRefEvaluateWithMultiReferenceINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcRefEvaluateWithMultiReferenceInterlacedINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcRefConvertToMceResultINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicInitializeINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicConfigureSkcINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicConfigureIpeLumaINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicConfigureIpeLumaChromaINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicGetMotionVectorMaskINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicConvertToMcePayloadINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicSetIntraLumaShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicSetIntraLumaModeCostFunctionINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicSetIntraChromaModeCostFunctionINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicSetBilinearFilterEnableINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicSetSkcForwardTransformEnableINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicSetBlockBasedRawSkipSadINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicEvaluateIpeINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicEvaluateWithSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicEvaluateWithDualReferenceINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicEvaluateWithMultiReferenceINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicEvaluateWithMultiReferenceInterlacedINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicConvertToMceResultINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicGetIpeLumaShapeINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicGetBestIpeLumaDistortionINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicGetBestIpeChromaDistortionINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicGetPackedIpeLumaModesINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicGetIpeChromaModeINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupAvcSicGetInterRawSadsINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpVariableLengthArrayINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSaveMemoryINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRestoreMemoryINTEL: *hasResult = false; *hasResultType = false; break;\n    case Op::OpArbitraryFloatSinCosPiINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatCastINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatCastFromIntINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatCastToIntINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatAddINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatSubINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatMulINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatDivINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatGTINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatGEINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatLTINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatLEINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatEQINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatRecipINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatRSqrtINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatCbrtINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatHypotINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatSqrtINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatLogINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatLog2INTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatLog10INTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatLog1pINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatExpINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatExp2INTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatExp10INTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatExpm1INTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatSinINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatCosINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatSinCosINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatSinPiINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatCosPiINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatASinINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatASinPiINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatACosINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatACosPiINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatATanINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatATanPiINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatATan2INTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatPowINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatPowRINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpArbitraryFloatPowNINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpLoopControlINTEL: *hasResult = false; *hasResultType = false; break;\n    case Op::OpAliasDomainDeclINTEL: *hasResult = true; *hasResultType = false; break;\n    case Op::OpAliasScopeDeclINTEL: *hasResult = true; *hasResultType = false; break;\n    case Op::OpAliasScopeListDeclINTEL: *hasResult = true; *hasResultType = false; break;\n    case Op::OpFixedSqrtINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFixedRecipINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFixedRsqrtINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFixedSinINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFixedCosINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFixedSinCosINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFixedSinPiINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFixedCosPiINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFixedSinCosPiINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFixedLogINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFixedExpINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpPtrCastToCrossWorkgroupINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpCrossWorkgroupCastToPtrINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpReadPipeBlockingINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpWritePipeBlockingINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpFPGARegINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryGetRayTMinKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryGetRayFlagsKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryGetIntersectionTKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryGetIntersectionInstanceCustomIndexKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryGetIntersectionInstanceIdKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryGetIntersectionGeometryIndexKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryGetIntersectionPrimitiveIndexKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryGetIntersectionBarycentricsKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryGetIntersectionFrontFaceKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryGetIntersectionCandidateAABBOpaqueKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryGetIntersectionObjectRayDirectionKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryGetIntersectionObjectRayOriginKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryGetWorldRayDirectionKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryGetWorldRayOriginKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryGetIntersectionObjectToWorldKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpRayQueryGetIntersectionWorldToObjectKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpAtomicFAddEXT: *hasResult = true; *hasResultType = true; break;\n    case Op::OpTypeBufferSurfaceINTEL: *hasResult = true; *hasResultType = false; break;\n    case Op::OpTypeStructContinuedINTEL: *hasResult = false; *hasResultType = false; break;\n    case Op::OpConstantCompositeContinuedINTEL: *hasResult = false; *hasResultType = false; break;\n    case Op::OpSpecConstantCompositeContinuedINTEL: *hasResult = false; *hasResultType = false; break;\n    case Op::OpCompositeConstructContinuedINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpConvertFToBF16INTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpConvertBF16ToFINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpControlBarrierArriveINTEL: *hasResult = false; *hasResultType = false; break;\n    case Op::OpControlBarrierWaitINTEL: *hasResult = false; *hasResultType = false; break;\n    case Op::OpArithmeticFenceEXT: *hasResult = true; *hasResultType = true; break;\n    case Op::OpSubgroupBlockPrefetchINTEL: *hasResult = false; *hasResultType = false; break;\n    case Op::OpSubgroup2DBlockLoadINTEL: *hasResult = false; *hasResultType = false; break;\n    case Op::OpSubgroup2DBlockLoadTransformINTEL: *hasResult = false; *hasResultType = false; break;\n    case Op::OpSubgroup2DBlockLoadTransposeINTEL: *hasResult = false; *hasResultType = false; break;\n    case Op::OpSubgroup2DBlockPrefetchINTEL: *hasResult = false; *hasResultType = false; break;\n    case Op::OpSubgroup2DBlockStoreINTEL: *hasResult = false; *hasResultType = false; break;\n    case Op::OpSubgroupMatrixMultiplyAccumulateINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupIMulKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupFMulKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupBitwiseAndKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupBitwiseOrKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupBitwiseXorKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupLogicalAndKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupLogicalOrKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpGroupLogicalXorKHR: *hasResult = true; *hasResultType = true; break;\n    case Op::OpMaskedGatherINTEL: *hasResult = true; *hasResultType = true; break;\n    case Op::OpMaskedScatterINTEL: *hasResult = false; *hasResultType = false; break;\n    }\n}\ninline const char* SourceLanguageToString(SourceLanguage value) {\n    switch (value) {\n    case SourceLanguage::Unknown: return \"Unknown\";\n    case SourceLanguage::ESSL: return \"ESSL\";\n    case SourceLanguage::GLSL: return \"GLSL\";\n    case SourceLanguage::OpenCL_C: return \"OpenCL_C\";\n    case SourceLanguage::OpenCL_CPP: return \"OpenCL_CPP\";\n    case SourceLanguage::HLSL: return \"HLSL\";\n    case SourceLanguage::CPP_for_OpenCL: return \"CPP_for_OpenCL\";\n    case SourceLanguage::SYCL: return \"SYCL\";\n    case SourceLanguage::HERO_C: return \"HERO_C\";\n    case SourceLanguage::NZSL: return \"NZSL\";\n    case SourceLanguage::WGSL: return \"WGSL\";\n    case SourceLanguage::Slang: return \"Slang\";\n    case SourceLanguage::Zig: return \"Zig\";\n    case SourceLanguage::Rust: return \"Rust\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* ExecutionModelToString(ExecutionModel value) {\n    switch (value) {\n    case ExecutionModel::Vertex: return \"Vertex\";\n    case ExecutionModel::TessellationControl: return \"TessellationControl\";\n    case ExecutionModel::TessellationEvaluation: return \"TessellationEvaluation\";\n    case ExecutionModel::Geometry: return \"Geometry\";\n    case ExecutionModel::Fragment: return \"Fragment\";\n    case ExecutionModel::GLCompute: return \"GLCompute\";\n    case ExecutionModel::Kernel: return \"Kernel\";\n    case ExecutionModel::TaskNV: return \"TaskNV\";\n    case ExecutionModel::MeshNV: return \"MeshNV\";\n    case ExecutionModel::RayGenerationKHR: return \"RayGenerationKHR\";\n    case ExecutionModel::IntersectionKHR: return \"IntersectionKHR\";\n    case ExecutionModel::AnyHitKHR: return \"AnyHitKHR\";\n    case ExecutionModel::ClosestHitKHR: return \"ClosestHitKHR\";\n    case ExecutionModel::MissKHR: return \"MissKHR\";\n    case ExecutionModel::CallableKHR: return \"CallableKHR\";\n    case ExecutionModel::TaskEXT: return \"TaskEXT\";\n    case ExecutionModel::MeshEXT: return \"MeshEXT\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* AddressingModelToString(AddressingModel value) {\n    switch (value) {\n    case AddressingModel::Logical: return \"Logical\";\n    case AddressingModel::Physical32: return \"Physical32\";\n    case AddressingModel::Physical64: return \"Physical64\";\n    case AddressingModel::PhysicalStorageBuffer64: return \"PhysicalStorageBuffer64\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* MemoryModelToString(MemoryModel value) {\n    switch (value) {\n    case MemoryModel::Simple: return \"Simple\";\n    case MemoryModel::GLSL450: return \"GLSL450\";\n    case MemoryModel::OpenCL: return \"OpenCL\";\n    case MemoryModel::Vulkan: return \"Vulkan\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* ExecutionModeToString(ExecutionMode value) {\n    switch (value) {\n    case ExecutionMode::Invocations: return \"Invocations\";\n    case ExecutionMode::SpacingEqual: return \"SpacingEqual\";\n    case ExecutionMode::SpacingFractionalEven: return \"SpacingFractionalEven\";\n    case ExecutionMode::SpacingFractionalOdd: return \"SpacingFractionalOdd\";\n    case ExecutionMode::VertexOrderCw: return \"VertexOrderCw\";\n    case ExecutionMode::VertexOrderCcw: return \"VertexOrderCcw\";\n    case ExecutionMode::PixelCenterInteger: return \"PixelCenterInteger\";\n    case ExecutionMode::OriginUpperLeft: return \"OriginUpperLeft\";\n    case ExecutionMode::OriginLowerLeft: return \"OriginLowerLeft\";\n    case ExecutionMode::EarlyFragmentTests: return \"EarlyFragmentTests\";\n    case ExecutionMode::PointMode: return \"PointMode\";\n    case ExecutionMode::Xfb: return \"Xfb\";\n    case ExecutionMode::DepthReplacing: return \"DepthReplacing\";\n    case ExecutionMode::DepthGreater: return \"DepthGreater\";\n    case ExecutionMode::DepthLess: return \"DepthLess\";\n    case ExecutionMode::DepthUnchanged: return \"DepthUnchanged\";\n    case ExecutionMode::LocalSize: return \"LocalSize\";\n    case ExecutionMode::LocalSizeHint: return \"LocalSizeHint\";\n    case ExecutionMode::InputPoints: return \"InputPoints\";\n    case ExecutionMode::InputLines: return \"InputLines\";\n    case ExecutionMode::InputLinesAdjacency: return \"InputLinesAdjacency\";\n    case ExecutionMode::Triangles: return \"Triangles\";\n    case ExecutionMode::InputTrianglesAdjacency: return \"InputTrianglesAdjacency\";\n    case ExecutionMode::Quads: return \"Quads\";\n    case ExecutionMode::Isolines: return \"Isolines\";\n    case ExecutionMode::OutputVertices: return \"OutputVertices\";\n    case ExecutionMode::OutputPoints: return \"OutputPoints\";\n    case ExecutionMode::OutputLineStrip: return \"OutputLineStrip\";\n    case ExecutionMode::OutputTriangleStrip: return \"OutputTriangleStrip\";\n    case ExecutionMode::VecTypeHint: return \"VecTypeHint\";\n    case ExecutionMode::ContractionOff: return \"ContractionOff\";\n    case ExecutionMode::Initializer: return \"Initializer\";\n    case ExecutionMode::Finalizer: return \"Finalizer\";\n    case ExecutionMode::SubgroupSize: return \"SubgroupSize\";\n    case ExecutionMode::SubgroupsPerWorkgroup: return \"SubgroupsPerWorkgroup\";\n    case ExecutionMode::SubgroupsPerWorkgroupId: return \"SubgroupsPerWorkgroupId\";\n    case ExecutionMode::LocalSizeId: return \"LocalSizeId\";\n    case ExecutionMode::LocalSizeHintId: return \"LocalSizeHintId\";\n    case ExecutionMode::NonCoherentColorAttachmentReadEXT: return \"NonCoherentColorAttachmentReadEXT\";\n    case ExecutionMode::NonCoherentDepthAttachmentReadEXT: return \"NonCoherentDepthAttachmentReadEXT\";\n    case ExecutionMode::NonCoherentStencilAttachmentReadEXT: return \"NonCoherentStencilAttachmentReadEXT\";\n    case ExecutionMode::SubgroupUniformControlFlowKHR: return \"SubgroupUniformControlFlowKHR\";\n    case ExecutionMode::PostDepthCoverage: return \"PostDepthCoverage\";\n    case ExecutionMode::DenormPreserve: return \"DenormPreserve\";\n    case ExecutionMode::DenormFlushToZero: return \"DenormFlushToZero\";\n    case ExecutionMode::SignedZeroInfNanPreserve: return \"SignedZeroInfNanPreserve\";\n    case ExecutionMode::RoundingModeRTE: return \"RoundingModeRTE\";\n    case ExecutionMode::RoundingModeRTZ: return \"RoundingModeRTZ\";\n    case ExecutionMode::NonCoherentTileAttachmentReadQCOM: return \"NonCoherentTileAttachmentReadQCOM\";\n    case ExecutionMode::TileShadingRateQCOM: return \"TileShadingRateQCOM\";\n    case ExecutionMode::EarlyAndLateFragmentTestsAMD: return \"EarlyAndLateFragmentTestsAMD\";\n    case ExecutionMode::StencilRefReplacingEXT: return \"StencilRefReplacingEXT\";\n    case ExecutionMode::CoalescingAMDX: return \"CoalescingAMDX\";\n    case ExecutionMode::IsApiEntryAMDX: return \"IsApiEntryAMDX\";\n    case ExecutionMode::MaxNodeRecursionAMDX: return \"MaxNodeRecursionAMDX\";\n    case ExecutionMode::StaticNumWorkgroupsAMDX: return \"StaticNumWorkgroupsAMDX\";\n    case ExecutionMode::ShaderIndexAMDX: return \"ShaderIndexAMDX\";\n    case ExecutionMode::MaxNumWorkgroupsAMDX: return \"MaxNumWorkgroupsAMDX\";\n    case ExecutionMode::StencilRefUnchangedFrontAMD: return \"StencilRefUnchangedFrontAMD\";\n    case ExecutionMode::StencilRefGreaterFrontAMD: return \"StencilRefGreaterFrontAMD\";\n    case ExecutionMode::StencilRefLessFrontAMD: return \"StencilRefLessFrontAMD\";\n    case ExecutionMode::StencilRefUnchangedBackAMD: return \"StencilRefUnchangedBackAMD\";\n    case ExecutionMode::StencilRefGreaterBackAMD: return \"StencilRefGreaterBackAMD\";\n    case ExecutionMode::StencilRefLessBackAMD: return \"StencilRefLessBackAMD\";\n    case ExecutionMode::QuadDerivativesKHR: return \"QuadDerivativesKHR\";\n    case ExecutionMode::RequireFullQuadsKHR: return \"RequireFullQuadsKHR\";\n    case ExecutionMode::SharesInputWithAMDX: return \"SharesInputWithAMDX\";\n    case ExecutionMode::OutputLinesEXT: return \"OutputLinesEXT\";\n    case ExecutionMode::OutputPrimitivesEXT: return \"OutputPrimitivesEXT\";\n    case ExecutionMode::DerivativeGroupQuadsKHR: return \"DerivativeGroupQuadsKHR\";\n    case ExecutionMode::DerivativeGroupLinearKHR: return \"DerivativeGroupLinearKHR\";\n    case ExecutionMode::OutputTrianglesEXT: return \"OutputTrianglesEXT\";\n    case ExecutionMode::PixelInterlockOrderedEXT: return \"PixelInterlockOrderedEXT\";\n    case ExecutionMode::PixelInterlockUnorderedEXT: return \"PixelInterlockUnorderedEXT\";\n    case ExecutionMode::SampleInterlockOrderedEXT: return \"SampleInterlockOrderedEXT\";\n    case ExecutionMode::SampleInterlockUnorderedEXT: return \"SampleInterlockUnorderedEXT\";\n    case ExecutionMode::ShadingRateInterlockOrderedEXT: return \"ShadingRateInterlockOrderedEXT\";\n    case ExecutionMode::ShadingRateInterlockUnorderedEXT: return \"ShadingRateInterlockUnorderedEXT\";\n    case ExecutionMode::SharedLocalMemorySizeINTEL: return \"SharedLocalMemorySizeINTEL\";\n    case ExecutionMode::RoundingModeRTPINTEL: return \"RoundingModeRTPINTEL\";\n    case ExecutionMode::RoundingModeRTNINTEL: return \"RoundingModeRTNINTEL\";\n    case ExecutionMode::FloatingPointModeALTINTEL: return \"FloatingPointModeALTINTEL\";\n    case ExecutionMode::FloatingPointModeIEEEINTEL: return \"FloatingPointModeIEEEINTEL\";\n    case ExecutionMode::MaxWorkgroupSizeINTEL: return \"MaxWorkgroupSizeINTEL\";\n    case ExecutionMode::MaxWorkDimINTEL: return \"MaxWorkDimINTEL\";\n    case ExecutionMode::NoGlobalOffsetINTEL: return \"NoGlobalOffsetINTEL\";\n    case ExecutionMode::NumSIMDWorkitemsINTEL: return \"NumSIMDWorkitemsINTEL\";\n    case ExecutionMode::SchedulerTargetFmaxMhzINTEL: return \"SchedulerTargetFmaxMhzINTEL\";\n    case ExecutionMode::MaximallyReconvergesKHR: return \"MaximallyReconvergesKHR\";\n    case ExecutionMode::FPFastMathDefault: return \"FPFastMathDefault\";\n    case ExecutionMode::StreamingInterfaceINTEL: return \"StreamingInterfaceINTEL\";\n    case ExecutionMode::RegisterMapInterfaceINTEL: return \"RegisterMapInterfaceINTEL\";\n    case ExecutionMode::NamedBarrierCountINTEL: return \"NamedBarrierCountINTEL\";\n    case ExecutionMode::MaximumRegistersINTEL: return \"MaximumRegistersINTEL\";\n    case ExecutionMode::MaximumRegistersIdINTEL: return \"MaximumRegistersIdINTEL\";\n    case ExecutionMode::NamedMaximumRegistersINTEL: return \"NamedMaximumRegistersINTEL\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* StorageClassToString(StorageClass value) {\n    switch (value) {\n    case StorageClass::UniformConstant: return \"UniformConstant\";\n    case StorageClass::Input: return \"Input\";\n    case StorageClass::Uniform: return \"Uniform\";\n    case StorageClass::Output: return \"Output\";\n    case StorageClass::Workgroup: return \"Workgroup\";\n    case StorageClass::CrossWorkgroup: return \"CrossWorkgroup\";\n    case StorageClass::Private: return \"Private\";\n    case StorageClass::Function: return \"Function\";\n    case StorageClass::Generic: return \"Generic\";\n    case StorageClass::PushConstant: return \"PushConstant\";\n    case StorageClass::AtomicCounter: return \"AtomicCounter\";\n    case StorageClass::Image: return \"Image\";\n    case StorageClass::StorageBuffer: return \"StorageBuffer\";\n    case StorageClass::TileImageEXT: return \"TileImageEXT\";\n    case StorageClass::TileAttachmentQCOM: return \"TileAttachmentQCOM\";\n    case StorageClass::NodePayloadAMDX: return \"NodePayloadAMDX\";\n    case StorageClass::CallableDataKHR: return \"CallableDataKHR\";\n    case StorageClass::IncomingCallableDataKHR: return \"IncomingCallableDataKHR\";\n    case StorageClass::RayPayloadKHR: return \"RayPayloadKHR\";\n    case StorageClass::HitAttributeKHR: return \"HitAttributeKHR\";\n    case StorageClass::IncomingRayPayloadKHR: return \"IncomingRayPayloadKHR\";\n    case StorageClass::ShaderRecordBufferKHR: return \"ShaderRecordBufferKHR\";\n    case StorageClass::PhysicalStorageBuffer: return \"PhysicalStorageBuffer\";\n    case StorageClass::HitObjectAttributeNV: return \"HitObjectAttributeNV\";\n    case StorageClass::TaskPayloadWorkgroupEXT: return \"TaskPayloadWorkgroupEXT\";\n    case StorageClass::CodeSectionINTEL: return \"CodeSectionINTEL\";\n    case StorageClass::DeviceOnlyINTEL: return \"DeviceOnlyINTEL\";\n    case StorageClass::HostOnlyINTEL: return \"HostOnlyINTEL\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* DimToString(Dim value) {\n    switch (value) {\n    case Dim::Dim1D: return \"1D\";\n    case Dim::Dim2D: return \"2D\";\n    case Dim::Dim3D: return \"3D\";\n    case Dim::Cube: return \"Cube\";\n    case Dim::Rect: return \"Rect\";\n    case Dim::Buffer: return \"Buffer\";\n    case Dim::SubpassData: return \"SubpassData\";\n    case Dim::TileImageDataEXT: return \"TileImageDataEXT\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* SamplerAddressingModeToString(SamplerAddressingMode value) {\n    switch (value) {\n    case SamplerAddressingMode::None: return \"None\";\n    case SamplerAddressingMode::ClampToEdge: return \"ClampToEdge\";\n    case SamplerAddressingMode::Clamp: return \"Clamp\";\n    case SamplerAddressingMode::Repeat: return \"Repeat\";\n    case SamplerAddressingMode::RepeatMirrored: return \"RepeatMirrored\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* SamplerFilterModeToString(SamplerFilterMode value) {\n    switch (value) {\n    case SamplerFilterMode::Nearest: return \"Nearest\";\n    case SamplerFilterMode::Linear: return \"Linear\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* ImageFormatToString(ImageFormat value) {\n    switch (value) {\n    case ImageFormat::Unknown: return \"Unknown\";\n    case ImageFormat::Rgba32f: return \"Rgba32f\";\n    case ImageFormat::Rgba16f: return \"Rgba16f\";\n    case ImageFormat::R32f: return \"R32f\";\n    case ImageFormat::Rgba8: return \"Rgba8\";\n    case ImageFormat::Rgba8Snorm: return \"Rgba8Snorm\";\n    case ImageFormat::Rg32f: return \"Rg32f\";\n    case ImageFormat::Rg16f: return \"Rg16f\";\n    case ImageFormat::R11fG11fB10f: return \"R11fG11fB10f\";\n    case ImageFormat::R16f: return \"R16f\";\n    case ImageFormat::Rgba16: return \"Rgba16\";\n    case ImageFormat::Rgb10A2: return \"Rgb10A2\";\n    case ImageFormat::Rg16: return \"Rg16\";\n    case ImageFormat::Rg8: return \"Rg8\";\n    case ImageFormat::R16: return \"R16\";\n    case ImageFormat::R8: return \"R8\";\n    case ImageFormat::Rgba16Snorm: return \"Rgba16Snorm\";\n    case ImageFormat::Rg16Snorm: return \"Rg16Snorm\";\n    case ImageFormat::Rg8Snorm: return \"Rg8Snorm\";\n    case ImageFormat::R16Snorm: return \"R16Snorm\";\n    case ImageFormat::R8Snorm: return \"R8Snorm\";\n    case ImageFormat::Rgba32i: return \"Rgba32i\";\n    case ImageFormat::Rgba16i: return \"Rgba16i\";\n    case ImageFormat::Rgba8i: return \"Rgba8i\";\n    case ImageFormat::R32i: return \"R32i\";\n    case ImageFormat::Rg32i: return \"Rg32i\";\n    case ImageFormat::Rg16i: return \"Rg16i\";\n    case ImageFormat::Rg8i: return \"Rg8i\";\n    case ImageFormat::R16i: return \"R16i\";\n    case ImageFormat::R8i: return \"R8i\";\n    case ImageFormat::Rgba32ui: return \"Rgba32ui\";\n    case ImageFormat::Rgba16ui: return \"Rgba16ui\";\n    case ImageFormat::Rgba8ui: return \"Rgba8ui\";\n    case ImageFormat::R32ui: return \"R32ui\";\n    case ImageFormat::Rgb10a2ui: return \"Rgb10a2ui\";\n    case ImageFormat::Rg32ui: return \"Rg32ui\";\n    case ImageFormat::Rg16ui: return \"Rg16ui\";\n    case ImageFormat::Rg8ui: return \"Rg8ui\";\n    case ImageFormat::R16ui: return \"R16ui\";\n    case ImageFormat::R8ui: return \"R8ui\";\n    case ImageFormat::R64ui: return \"R64ui\";\n    case ImageFormat::R64i: return \"R64i\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* ImageChannelOrderToString(ImageChannelOrder value) {\n    switch (value) {\n    case ImageChannelOrder::R: return \"R\";\n    case ImageChannelOrder::A: return \"A\";\n    case ImageChannelOrder::RG: return \"RG\";\n    case ImageChannelOrder::RA: return \"RA\";\n    case ImageChannelOrder::RGB: return \"RGB\";\n    case ImageChannelOrder::RGBA: return \"RGBA\";\n    case ImageChannelOrder::BGRA: return \"BGRA\";\n    case ImageChannelOrder::ARGB: return \"ARGB\";\n    case ImageChannelOrder::Intensity: return \"Intensity\";\n    case ImageChannelOrder::Luminance: return \"Luminance\";\n    case ImageChannelOrder::Rx: return \"Rx\";\n    case ImageChannelOrder::RGx: return \"RGx\";\n    case ImageChannelOrder::RGBx: return \"RGBx\";\n    case ImageChannelOrder::Depth: return \"Depth\";\n    case ImageChannelOrder::DepthStencil: return \"DepthStencil\";\n    case ImageChannelOrder::sRGB: return \"sRGB\";\n    case ImageChannelOrder::sRGBx: return \"sRGBx\";\n    case ImageChannelOrder::sRGBA: return \"sRGBA\";\n    case ImageChannelOrder::sBGRA: return \"sBGRA\";\n    case ImageChannelOrder::ABGR: return \"ABGR\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* ImageChannelDataTypeToString(ImageChannelDataType value) {\n    switch (value) {\n    case ImageChannelDataType::SnormInt8: return \"SnormInt8\";\n    case ImageChannelDataType::SnormInt16: return \"SnormInt16\";\n    case ImageChannelDataType::UnormInt8: return \"UnormInt8\";\n    case ImageChannelDataType::UnormInt16: return \"UnormInt16\";\n    case ImageChannelDataType::UnormShort565: return \"UnormShort565\";\n    case ImageChannelDataType::UnormShort555: return \"UnormShort555\";\n    case ImageChannelDataType::UnormInt101010: return \"UnormInt101010\";\n    case ImageChannelDataType::SignedInt8: return \"SignedInt8\";\n    case ImageChannelDataType::SignedInt16: return \"SignedInt16\";\n    case ImageChannelDataType::SignedInt32: return \"SignedInt32\";\n    case ImageChannelDataType::UnsignedInt8: return \"UnsignedInt8\";\n    case ImageChannelDataType::UnsignedInt16: return \"UnsignedInt16\";\n    case ImageChannelDataType::UnsignedInt32: return \"UnsignedInt32\";\n    case ImageChannelDataType::HalfFloat: return \"HalfFloat\";\n    case ImageChannelDataType::Float: return \"Float\";\n    case ImageChannelDataType::UnormInt24: return \"UnormInt24\";\n    case ImageChannelDataType::UnormInt101010_2: return \"UnormInt101010_2\";\n    case ImageChannelDataType::UnsignedIntRaw10EXT: return \"UnsignedIntRaw10EXT\";\n    case ImageChannelDataType::UnsignedIntRaw12EXT: return \"UnsignedIntRaw12EXT\";\n    case ImageChannelDataType::UnormInt2_101010EXT: return \"UnormInt2_101010EXT\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* FPRoundingModeToString(FPRoundingMode value) {\n    switch (value) {\n    case FPRoundingMode::RTE: return \"RTE\";\n    case FPRoundingMode::RTZ: return \"RTZ\";\n    case FPRoundingMode::RTP: return \"RTP\";\n    case FPRoundingMode::RTN: return \"RTN\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* LinkageTypeToString(LinkageType value) {\n    switch (value) {\n    case LinkageType::Export: return \"Export\";\n    case LinkageType::Import: return \"Import\";\n    case LinkageType::LinkOnceODR: return \"LinkOnceODR\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* AccessQualifierToString(AccessQualifier value) {\n    switch (value) {\n    case AccessQualifier::ReadOnly: return \"ReadOnly\";\n    case AccessQualifier::WriteOnly: return \"WriteOnly\";\n    case AccessQualifier::ReadWrite: return \"ReadWrite\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* FunctionParameterAttributeToString(FunctionParameterAttribute value) {\n    switch (value) {\n    case FunctionParameterAttribute::Zext: return \"Zext\";\n    case FunctionParameterAttribute::Sext: return \"Sext\";\n    case FunctionParameterAttribute::ByVal: return \"ByVal\";\n    case FunctionParameterAttribute::Sret: return \"Sret\";\n    case FunctionParameterAttribute::NoAlias: return \"NoAlias\";\n    case FunctionParameterAttribute::NoCapture: return \"NoCapture\";\n    case FunctionParameterAttribute::NoWrite: return \"NoWrite\";\n    case FunctionParameterAttribute::NoReadWrite: return \"NoReadWrite\";\n    case FunctionParameterAttribute::RuntimeAlignedINTEL: return \"RuntimeAlignedINTEL\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* DecorationToString(Decoration value) {\n    switch (value) {\n    case Decoration::RelaxedPrecision: return \"RelaxedPrecision\";\n    case Decoration::SpecId: return \"SpecId\";\n    case Decoration::Block: return \"Block\";\n    case Decoration::BufferBlock: return \"BufferBlock\";\n    case Decoration::RowMajor: return \"RowMajor\";\n    case Decoration::ColMajor: return \"ColMajor\";\n    case Decoration::ArrayStride: return \"ArrayStride\";\n    case Decoration::MatrixStride: return \"MatrixStride\";\n    case Decoration::GLSLShared: return \"GLSLShared\";\n    case Decoration::GLSLPacked: return \"GLSLPacked\";\n    case Decoration::CPacked: return \"CPacked\";\n    case Decoration::BuiltIn: return \"BuiltIn\";\n    case Decoration::NoPerspective: return \"NoPerspective\";\n    case Decoration::Flat: return \"Flat\";\n    case Decoration::Patch: return \"Patch\";\n    case Decoration::Centroid: return \"Centroid\";\n    case Decoration::Sample: return \"Sample\";\n    case Decoration::Invariant: return \"Invariant\";\n    case Decoration::Restrict: return \"Restrict\";\n    case Decoration::Aliased: return \"Aliased\";\n    case Decoration::Volatile: return \"Volatile\";\n    case Decoration::Constant: return \"Constant\";\n    case Decoration::Coherent: return \"Coherent\";\n    case Decoration::NonWritable: return \"NonWritable\";\n    case Decoration::NonReadable: return \"NonReadable\";\n    case Decoration::Uniform: return \"Uniform\";\n    case Decoration::UniformId: return \"UniformId\";\n    case Decoration::SaturatedConversion: return \"SaturatedConversion\";\n    case Decoration::Stream: return \"Stream\";\n    case Decoration::Location: return \"Location\";\n    case Decoration::Component: return \"Component\";\n    case Decoration::Index: return \"Index\";\n    case Decoration::Binding: return \"Binding\";\n    case Decoration::DescriptorSet: return \"DescriptorSet\";\n    case Decoration::Offset: return \"Offset\";\n    case Decoration::XfbBuffer: return \"XfbBuffer\";\n    case Decoration::XfbStride: return \"XfbStride\";\n    case Decoration::FuncParamAttr: return \"FuncParamAttr\";\n    case Decoration::FPRoundingMode: return \"FPRoundingMode\";\n    case Decoration::FPFastMathMode: return \"FPFastMathMode\";\n    case Decoration::LinkageAttributes: return \"LinkageAttributes\";\n    case Decoration::NoContraction: return \"NoContraction\";\n    case Decoration::InputAttachmentIndex: return \"InputAttachmentIndex\";\n    case Decoration::Alignment: return \"Alignment\";\n    case Decoration::MaxByteOffset: return \"MaxByteOffset\";\n    case Decoration::AlignmentId: return \"AlignmentId\";\n    case Decoration::MaxByteOffsetId: return \"MaxByteOffsetId\";\r\n    case Decoration::SaturatedToLargestFloat8NormalConversionEXT: return \"SaturatedToLargestFloat8NormalConversionEXT\";\n    case Decoration::NoSignedWrap: return \"NoSignedWrap\";\n    case Decoration::NoUnsignedWrap: return \"NoUnsignedWrap\";\n    case Decoration::WeightTextureQCOM: return \"WeightTextureQCOM\";\n    case Decoration::BlockMatchTextureQCOM: return \"BlockMatchTextureQCOM\";\n    case Decoration::BlockMatchSamplerQCOM: return \"BlockMatchSamplerQCOM\";\n    case Decoration::ExplicitInterpAMD: return \"ExplicitInterpAMD\";\n    case Decoration::NodeSharesPayloadLimitsWithAMDX: return \"NodeSharesPayloadLimitsWithAMDX\";\n    case Decoration::NodeMaxPayloadsAMDX: return \"NodeMaxPayloadsAMDX\";\n    case Decoration::TrackFinishWritingAMDX: return \"TrackFinishWritingAMDX\";\n    case Decoration::PayloadNodeNameAMDX: return \"PayloadNodeNameAMDX\";\n    case Decoration::PayloadNodeBaseIndexAMDX: return \"PayloadNodeBaseIndexAMDX\";\n    case Decoration::PayloadNodeSparseArrayAMDX: return \"PayloadNodeSparseArrayAMDX\";\n    case Decoration::PayloadNodeArraySizeAMDX: return \"PayloadNodeArraySizeAMDX\";\n    case Decoration::PayloadDispatchIndirectAMDX: return \"PayloadDispatchIndirectAMDX\";\n    case Decoration::OverrideCoverageNV: return \"OverrideCoverageNV\";\n    case Decoration::PassthroughNV: return \"PassthroughNV\";\n    case Decoration::ViewportRelativeNV: return \"ViewportRelativeNV\";\n    case Decoration::SecondaryViewportRelativeNV: return \"SecondaryViewportRelativeNV\";\n    case Decoration::PerPrimitiveEXT: return \"PerPrimitiveEXT\";\n    case Decoration::PerViewNV: return \"PerViewNV\";\n    case Decoration::PerTaskNV: return \"PerTaskNV\";\n    case Decoration::PerVertexKHR: return \"PerVertexKHR\";\n    case Decoration::NonUniform: return \"NonUniform\";\n    case Decoration::RestrictPointer: return \"RestrictPointer\";\n    case Decoration::AliasedPointer: return \"AliasedPointer\";\n    case Decoration::HitObjectShaderRecordBufferNV: return \"HitObjectShaderRecordBufferNV\";\n    case Decoration::BindlessSamplerNV: return \"BindlessSamplerNV\";\n    case Decoration::BindlessImageNV: return \"BindlessImageNV\";\n    case Decoration::BoundSamplerNV: return \"BoundSamplerNV\";\n    case Decoration::BoundImageNV: return \"BoundImageNV\";\n    case Decoration::SIMTCallINTEL: return \"SIMTCallINTEL\";\n    case Decoration::ReferencedIndirectlyINTEL: return \"ReferencedIndirectlyINTEL\";\n    case Decoration::ClobberINTEL: return \"ClobberINTEL\";\n    case Decoration::SideEffectsINTEL: return \"SideEffectsINTEL\";\n    case Decoration::VectorComputeVariableINTEL: return \"VectorComputeVariableINTEL\";\n    case Decoration::FuncParamIOKindINTEL: return \"FuncParamIOKindINTEL\";\n    case Decoration::VectorComputeFunctionINTEL: return \"VectorComputeFunctionINTEL\";\n    case Decoration::StackCallINTEL: return \"StackCallINTEL\";\n    case Decoration::GlobalVariableOffsetINTEL: return \"GlobalVariableOffsetINTEL\";\n    case Decoration::CounterBuffer: return \"CounterBuffer\";\n    case Decoration::HlslSemanticGOOGLE: return \"HlslSemanticGOOGLE\";\n    case Decoration::UserTypeGOOGLE: return \"UserTypeGOOGLE\";\n    case Decoration::FunctionRoundingModeINTEL: return \"FunctionRoundingModeINTEL\";\n    case Decoration::FunctionDenormModeINTEL: return \"FunctionDenormModeINTEL\";\n    case Decoration::RegisterINTEL: return \"RegisterINTEL\";\n    case Decoration::MemoryINTEL: return \"MemoryINTEL\";\n    case Decoration::NumbanksINTEL: return \"NumbanksINTEL\";\n    case Decoration::BankwidthINTEL: return \"BankwidthINTEL\";\n    case Decoration::MaxPrivateCopiesINTEL: return \"MaxPrivateCopiesINTEL\";\n    case Decoration::SinglepumpINTEL: return \"SinglepumpINTEL\";\n    case Decoration::DoublepumpINTEL: return \"DoublepumpINTEL\";\n    case Decoration::MaxReplicatesINTEL: return \"MaxReplicatesINTEL\";\n    case Decoration::SimpleDualPortINTEL: return \"SimpleDualPortINTEL\";\n    case Decoration::MergeINTEL: return \"MergeINTEL\";\n    case Decoration::BankBitsINTEL: return \"BankBitsINTEL\";\n    case Decoration::ForcePow2DepthINTEL: return \"ForcePow2DepthINTEL\";\n    case Decoration::StridesizeINTEL: return \"StridesizeINTEL\";\n    case Decoration::WordsizeINTEL: return \"WordsizeINTEL\";\n    case Decoration::TrueDualPortINTEL: return \"TrueDualPortINTEL\";\n    case Decoration::BurstCoalesceINTEL: return \"BurstCoalesceINTEL\";\n    case Decoration::CacheSizeINTEL: return \"CacheSizeINTEL\";\n    case Decoration::DontStaticallyCoalesceINTEL: return \"DontStaticallyCoalesceINTEL\";\n    case Decoration::PrefetchINTEL: return \"PrefetchINTEL\";\n    case Decoration::StallEnableINTEL: return \"StallEnableINTEL\";\n    case Decoration::FuseLoopsInFunctionINTEL: return \"FuseLoopsInFunctionINTEL\";\n    case Decoration::MathOpDSPModeINTEL: return \"MathOpDSPModeINTEL\";\n    case Decoration::AliasScopeINTEL: return \"AliasScopeINTEL\";\n    case Decoration::NoAliasINTEL: return \"NoAliasINTEL\";\n    case Decoration::InitiationIntervalINTEL: return \"InitiationIntervalINTEL\";\n    case Decoration::MaxConcurrencyINTEL: return \"MaxConcurrencyINTEL\";\n    case Decoration::PipelineEnableINTEL: return \"PipelineEnableINTEL\";\n    case Decoration::BufferLocationINTEL: return \"BufferLocationINTEL\";\n    case Decoration::IOPipeStorageINTEL: return \"IOPipeStorageINTEL\";\n    case Decoration::FunctionFloatingPointModeINTEL: return \"FunctionFloatingPointModeINTEL\";\n    case Decoration::SingleElementVectorINTEL: return \"SingleElementVectorINTEL\";\n    case Decoration::VectorComputeCallableFunctionINTEL: return \"VectorComputeCallableFunctionINTEL\";\n    case Decoration::MediaBlockIOINTEL: return \"MediaBlockIOINTEL\";\n    case Decoration::StallFreeINTEL: return \"StallFreeINTEL\";\n    case Decoration::FPMaxErrorDecorationINTEL: return \"FPMaxErrorDecorationINTEL\";\n    case Decoration::LatencyControlLabelINTEL: return \"LatencyControlLabelINTEL\";\n    case Decoration::LatencyControlConstraintINTEL: return \"LatencyControlConstraintINTEL\";\n    case Decoration::ConduitKernelArgumentINTEL: return \"ConduitKernelArgumentINTEL\";\n    case Decoration::RegisterMapKernelArgumentINTEL: return \"RegisterMapKernelArgumentINTEL\";\n    case Decoration::MMHostInterfaceAddressWidthINTEL: return \"MMHostInterfaceAddressWidthINTEL\";\n    case Decoration::MMHostInterfaceDataWidthINTEL: return \"MMHostInterfaceDataWidthINTEL\";\n    case Decoration::MMHostInterfaceLatencyINTEL: return \"MMHostInterfaceLatencyINTEL\";\n    case Decoration::MMHostInterfaceReadWriteModeINTEL: return \"MMHostInterfaceReadWriteModeINTEL\";\n    case Decoration::MMHostInterfaceMaxBurstINTEL: return \"MMHostInterfaceMaxBurstINTEL\";\n    case Decoration::MMHostInterfaceWaitRequestINTEL: return \"MMHostInterfaceWaitRequestINTEL\";\n    case Decoration::StableKernelArgumentINTEL: return \"StableKernelArgumentINTEL\";\n    case Decoration::HostAccessINTEL: return \"HostAccessINTEL\";\n    case Decoration::InitModeINTEL: return \"InitModeINTEL\";\n    case Decoration::ImplementInRegisterMapINTEL: return \"ImplementInRegisterMapINTEL\";\n    case Decoration::CacheControlLoadINTEL: return \"CacheControlLoadINTEL\";\n    case Decoration::CacheControlStoreINTEL: return \"CacheControlStoreINTEL\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* BuiltInToString(BuiltIn value) {\n    switch (value) {\n    case BuiltIn::Position: return \"Position\";\n    case BuiltIn::PointSize: return \"PointSize\";\n    case BuiltIn::ClipDistance: return \"ClipDistance\";\n    case BuiltIn::CullDistance: return \"CullDistance\";\n    case BuiltIn::VertexId: return \"VertexId\";\n    case BuiltIn::InstanceId: return \"InstanceId\";\n    case BuiltIn::PrimitiveId: return \"PrimitiveId\";\n    case BuiltIn::InvocationId: return \"InvocationId\";\n    case BuiltIn::Layer: return \"Layer\";\n    case BuiltIn::ViewportIndex: return \"ViewportIndex\";\n    case BuiltIn::TessLevelOuter: return \"TessLevelOuter\";\n    case BuiltIn::TessLevelInner: return \"TessLevelInner\";\n    case BuiltIn::TessCoord: return \"TessCoord\";\n    case BuiltIn::PatchVertices: return \"PatchVertices\";\n    case BuiltIn::FragCoord: return \"FragCoord\";\n    case BuiltIn::PointCoord: return \"PointCoord\";\n    case BuiltIn::FrontFacing: return \"FrontFacing\";\n    case BuiltIn::SampleId: return \"SampleId\";\n    case BuiltIn::SamplePosition: return \"SamplePosition\";\n    case BuiltIn::SampleMask: return \"SampleMask\";\n    case BuiltIn::FragDepth: return \"FragDepth\";\n    case BuiltIn::HelperInvocation: return \"HelperInvocation\";\n    case BuiltIn::NumWorkgroups: return \"NumWorkgroups\";\n    case BuiltIn::WorkgroupSize: return \"WorkgroupSize\";\n    case BuiltIn::WorkgroupId: return \"WorkgroupId\";\n    case BuiltIn::LocalInvocationId: return \"LocalInvocationId\";\n    case BuiltIn::GlobalInvocationId: return \"GlobalInvocationId\";\n    case BuiltIn::LocalInvocationIndex: return \"LocalInvocationIndex\";\n    case BuiltIn::WorkDim: return \"WorkDim\";\n    case BuiltIn::GlobalSize: return \"GlobalSize\";\n    case BuiltIn::EnqueuedWorkgroupSize: return \"EnqueuedWorkgroupSize\";\n    case BuiltIn::GlobalOffset: return \"GlobalOffset\";\n    case BuiltIn::GlobalLinearId: return \"GlobalLinearId\";\n    case BuiltIn::SubgroupSize: return \"SubgroupSize\";\n    case BuiltIn::SubgroupMaxSize: return \"SubgroupMaxSize\";\n    case BuiltIn::NumSubgroups: return \"NumSubgroups\";\n    case BuiltIn::NumEnqueuedSubgroups: return \"NumEnqueuedSubgroups\";\n    case BuiltIn::SubgroupId: return \"SubgroupId\";\n    case BuiltIn::SubgroupLocalInvocationId: return \"SubgroupLocalInvocationId\";\n    case BuiltIn::VertexIndex: return \"VertexIndex\";\n    case BuiltIn::InstanceIndex: return \"InstanceIndex\";\n    case BuiltIn::CoreIDARM: return \"CoreIDARM\";\n    case BuiltIn::CoreCountARM: return \"CoreCountARM\";\n    case BuiltIn::CoreMaxIDARM: return \"CoreMaxIDARM\";\n    case BuiltIn::WarpIDARM: return \"WarpIDARM\";\n    case BuiltIn::WarpMaxIDARM: return \"WarpMaxIDARM\";\n    case BuiltIn::SubgroupEqMask: return \"SubgroupEqMask\";\n    case BuiltIn::SubgroupGeMask: return \"SubgroupGeMask\";\n    case BuiltIn::SubgroupGtMask: return \"SubgroupGtMask\";\n    case BuiltIn::SubgroupLeMask: return \"SubgroupLeMask\";\n    case BuiltIn::SubgroupLtMask: return \"SubgroupLtMask\";\n    case BuiltIn::BaseVertex: return \"BaseVertex\";\n    case BuiltIn::BaseInstance: return \"BaseInstance\";\n    case BuiltIn::DrawIndex: return \"DrawIndex\";\n    case BuiltIn::PrimitiveShadingRateKHR: return \"PrimitiveShadingRateKHR\";\n    case BuiltIn::DeviceIndex: return \"DeviceIndex\";\n    case BuiltIn::ViewIndex: return \"ViewIndex\";\n    case BuiltIn::ShadingRateKHR: return \"ShadingRateKHR\";\n    case BuiltIn::TileOffsetQCOM: return \"TileOffsetQCOM\";\n    case BuiltIn::TileDimensionQCOM: return \"TileDimensionQCOM\";\n    case BuiltIn::TileApronSizeQCOM: return \"TileApronSizeQCOM\";\n    case BuiltIn::BaryCoordNoPerspAMD: return \"BaryCoordNoPerspAMD\";\n    case BuiltIn::BaryCoordNoPerspCentroidAMD: return \"BaryCoordNoPerspCentroidAMD\";\n    case BuiltIn::BaryCoordNoPerspSampleAMD: return \"BaryCoordNoPerspSampleAMD\";\n    case BuiltIn::BaryCoordSmoothAMD: return \"BaryCoordSmoothAMD\";\n    case BuiltIn::BaryCoordSmoothCentroidAMD: return \"BaryCoordSmoothCentroidAMD\";\n    case BuiltIn::BaryCoordSmoothSampleAMD: return \"BaryCoordSmoothSampleAMD\";\n    case BuiltIn::BaryCoordPullModelAMD: return \"BaryCoordPullModelAMD\";\n    case BuiltIn::FragStencilRefEXT: return \"FragStencilRefEXT\";\n    case BuiltIn::RemainingRecursionLevelsAMDX: return \"RemainingRecursionLevelsAMDX\";\n    case BuiltIn::ShaderIndexAMDX: return \"ShaderIndexAMDX\";\n    case BuiltIn::ViewportMaskNV: return \"ViewportMaskNV\";\n    case BuiltIn::SecondaryPositionNV: return \"SecondaryPositionNV\";\n    case BuiltIn::SecondaryViewportMaskNV: return \"SecondaryViewportMaskNV\";\n    case BuiltIn::PositionPerViewNV: return \"PositionPerViewNV\";\n    case BuiltIn::ViewportMaskPerViewNV: return \"ViewportMaskPerViewNV\";\n    case BuiltIn::FullyCoveredEXT: return \"FullyCoveredEXT\";\n    case BuiltIn::TaskCountNV: return \"TaskCountNV\";\n    case BuiltIn::PrimitiveCountNV: return \"PrimitiveCountNV\";\n    case BuiltIn::PrimitiveIndicesNV: return \"PrimitiveIndicesNV\";\n    case BuiltIn::ClipDistancePerViewNV: return \"ClipDistancePerViewNV\";\n    case BuiltIn::CullDistancePerViewNV: return \"CullDistancePerViewNV\";\n    case BuiltIn::LayerPerViewNV: return \"LayerPerViewNV\";\n    case BuiltIn::MeshViewCountNV: return \"MeshViewCountNV\";\n    case BuiltIn::MeshViewIndicesNV: return \"MeshViewIndicesNV\";\n    case BuiltIn::BaryCoordKHR: return \"BaryCoordKHR\";\n    case BuiltIn::BaryCoordNoPerspKHR: return \"BaryCoordNoPerspKHR\";\n    case BuiltIn::FragSizeEXT: return \"FragSizeEXT\";\n    case BuiltIn::FragInvocationCountEXT: return \"FragInvocationCountEXT\";\n    case BuiltIn::PrimitivePointIndicesEXT: return \"PrimitivePointIndicesEXT\";\n    case BuiltIn::PrimitiveLineIndicesEXT: return \"PrimitiveLineIndicesEXT\";\n    case BuiltIn::PrimitiveTriangleIndicesEXT: return \"PrimitiveTriangleIndicesEXT\";\n    case BuiltIn::CullPrimitiveEXT: return \"CullPrimitiveEXT\";\n    case BuiltIn::LaunchIdKHR: return \"LaunchIdKHR\";\n    case BuiltIn::LaunchSizeKHR: return \"LaunchSizeKHR\";\n    case BuiltIn::WorldRayOriginKHR: return \"WorldRayOriginKHR\";\n    case BuiltIn::WorldRayDirectionKHR: return \"WorldRayDirectionKHR\";\n    case BuiltIn::ObjectRayOriginKHR: return \"ObjectRayOriginKHR\";\n    case BuiltIn::ObjectRayDirectionKHR: return \"ObjectRayDirectionKHR\";\n    case BuiltIn::RayTminKHR: return \"RayTminKHR\";\n    case BuiltIn::RayTmaxKHR: return \"RayTmaxKHR\";\n    case BuiltIn::InstanceCustomIndexKHR: return \"InstanceCustomIndexKHR\";\n    case BuiltIn::ObjectToWorldKHR: return \"ObjectToWorldKHR\";\n    case BuiltIn::WorldToObjectKHR: return \"WorldToObjectKHR\";\n    case BuiltIn::HitTNV: return \"HitTNV\";\n    case BuiltIn::HitKindKHR: return \"HitKindKHR\";\n    case BuiltIn::CurrentRayTimeNV: return \"CurrentRayTimeNV\";\n    case BuiltIn::HitTriangleVertexPositionsKHR: return \"HitTriangleVertexPositionsKHR\";\n    case BuiltIn::HitMicroTriangleVertexPositionsNV: return \"HitMicroTriangleVertexPositionsNV\";\n    case BuiltIn::HitMicroTriangleVertexBarycentricsNV: return \"HitMicroTriangleVertexBarycentricsNV\";\n    case BuiltIn::IncomingRayFlagsKHR: return \"IncomingRayFlagsKHR\";\n    case BuiltIn::RayGeometryIndexKHR: return \"RayGeometryIndexKHR\";\n    case BuiltIn::HitIsSphereNV: return \"HitIsSphereNV\";\n    case BuiltIn::HitIsLSSNV: return \"HitIsLSSNV\";\n    case BuiltIn::HitSpherePositionNV: return \"HitSpherePositionNV\";\n    case BuiltIn::WarpsPerSMNV: return \"WarpsPerSMNV\";\n    case BuiltIn::SMCountNV: return \"SMCountNV\";\n    case BuiltIn::WarpIDNV: return \"WarpIDNV\";\n    case BuiltIn::SMIDNV: return \"SMIDNV\";\n    case BuiltIn::HitLSSPositionsNV: return \"HitLSSPositionsNV\";\n    case BuiltIn::HitKindFrontFacingMicroTriangleNV: return \"HitKindFrontFacingMicroTriangleNV\";\n    case BuiltIn::HitKindBackFacingMicroTriangleNV: return \"HitKindBackFacingMicroTriangleNV\";\n    case BuiltIn::HitSphereRadiusNV: return \"HitSphereRadiusNV\";\n    case BuiltIn::HitLSSRadiiNV: return \"HitLSSRadiiNV\";\n    case BuiltIn::ClusterIDNV: return \"ClusterIDNV\";\n    case BuiltIn::CullMaskKHR: return \"CullMaskKHR\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* ScopeToString(Scope value) {\n    switch (value) {\n    case Scope::CrossDevice: return \"CrossDevice\";\n    case Scope::Device: return \"Device\";\n    case Scope::Workgroup: return \"Workgroup\";\n    case Scope::Subgroup: return \"Subgroup\";\n    case Scope::Invocation: return \"Invocation\";\n    case Scope::QueueFamily: return \"QueueFamily\";\n    case Scope::ShaderCallKHR: return \"ShaderCallKHR\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* GroupOperationToString(GroupOperation value) {\n    switch (value) {\n    case GroupOperation::Reduce: return \"Reduce\";\n    case GroupOperation::InclusiveScan: return \"InclusiveScan\";\n    case GroupOperation::ExclusiveScan: return \"ExclusiveScan\";\n    case GroupOperation::ClusteredReduce: return \"ClusteredReduce\";\n    case GroupOperation::PartitionedReduceNV: return \"PartitionedReduceNV\";\n    case GroupOperation::PartitionedInclusiveScanNV: return \"PartitionedInclusiveScanNV\";\n    case GroupOperation::PartitionedExclusiveScanNV: return \"PartitionedExclusiveScanNV\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* KernelEnqueueFlagsToString(KernelEnqueueFlags value) {\n    switch (value) {\n    case KernelEnqueueFlags::NoWait: return \"NoWait\";\n    case KernelEnqueueFlags::WaitKernel: return \"WaitKernel\";\n    case KernelEnqueueFlags::WaitWorkGroup: return \"WaitWorkGroup\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* CapabilityToString(Capability value) {\n    switch (value) {\n    case Capability::Matrix: return \"Matrix\";\n    case Capability::Shader: return \"Shader\";\n    case Capability::Geometry: return \"Geometry\";\n    case Capability::Tessellation: return \"Tessellation\";\n    case Capability::Addresses: return \"Addresses\";\n    case Capability::Linkage: return \"Linkage\";\n    case Capability::Kernel: return \"Kernel\";\n    case Capability::Vector16: return \"Vector16\";\n    case Capability::Float16Buffer: return \"Float16Buffer\";\n    case Capability::Float16: return \"Float16\";\n    case Capability::Float64: return \"Float64\";\n    case Capability::Int64: return \"Int64\";\n    case Capability::Int64Atomics: return \"Int64Atomics\";\n    case Capability::ImageBasic: return \"ImageBasic\";\n    case Capability::ImageReadWrite: return \"ImageReadWrite\";\n    case Capability::ImageMipmap: return \"ImageMipmap\";\n    case Capability::Pipes: return \"Pipes\";\n    case Capability::Groups: return \"Groups\";\n    case Capability::DeviceEnqueue: return \"DeviceEnqueue\";\n    case Capability::LiteralSampler: return \"LiteralSampler\";\n    case Capability::AtomicStorage: return \"AtomicStorage\";\n    case Capability::Int16: return \"Int16\";\n    case Capability::TessellationPointSize: return \"TessellationPointSize\";\n    case Capability::GeometryPointSize: return \"GeometryPointSize\";\n    case Capability::ImageGatherExtended: return \"ImageGatherExtended\";\n    case Capability::StorageImageMultisample: return \"StorageImageMultisample\";\n    case Capability::UniformBufferArrayDynamicIndexing: return \"UniformBufferArrayDynamicIndexing\";\n    case Capability::SampledImageArrayDynamicIndexing: return \"SampledImageArrayDynamicIndexing\";\n    case Capability::StorageBufferArrayDynamicIndexing: return \"StorageBufferArrayDynamicIndexing\";\n    case Capability::StorageImageArrayDynamicIndexing: return \"StorageImageArrayDynamicIndexing\";\n    case Capability::ClipDistance: return \"ClipDistance\";\n    case Capability::CullDistance: return \"CullDistance\";\n    case Capability::ImageCubeArray: return \"ImageCubeArray\";\n    case Capability::SampleRateShading: return \"SampleRateShading\";\n    case Capability::ImageRect: return \"ImageRect\";\n    case Capability::SampledRect: return \"SampledRect\";\n    case Capability::GenericPointer: return \"GenericPointer\";\n    case Capability::Int8: return \"Int8\";\n    case Capability::InputAttachment: return \"InputAttachment\";\n    case Capability::SparseResidency: return \"SparseResidency\";\n    case Capability::MinLod: return \"MinLod\";\n    case Capability::Sampled1D: return \"Sampled1D\";\n    case Capability::Image1D: return \"Image1D\";\n    case Capability::SampledCubeArray: return \"SampledCubeArray\";\n    case Capability::SampledBuffer: return \"SampledBuffer\";\n    case Capability::ImageBuffer: return \"ImageBuffer\";\n    case Capability::ImageMSArray: return \"ImageMSArray\";\n    case Capability::StorageImageExtendedFormats: return \"StorageImageExtendedFormats\";\n    case Capability::ImageQuery: return \"ImageQuery\";\n    case Capability::DerivativeControl: return \"DerivativeControl\";\n    case Capability::InterpolationFunction: return \"InterpolationFunction\";\n    case Capability::TransformFeedback: return \"TransformFeedback\";\n    case Capability::GeometryStreams: return \"GeometryStreams\";\n    case Capability::StorageImageReadWithoutFormat: return \"StorageImageReadWithoutFormat\";\n    case Capability::StorageImageWriteWithoutFormat: return \"StorageImageWriteWithoutFormat\";\n    case Capability::MultiViewport: return \"MultiViewport\";\n    case Capability::SubgroupDispatch: return \"SubgroupDispatch\";\n    case Capability::NamedBarrier: return \"NamedBarrier\";\n    case Capability::PipeStorage: return \"PipeStorage\";\n    case Capability::GroupNonUniform: return \"GroupNonUniform\";\n    case Capability::GroupNonUniformVote: return \"GroupNonUniformVote\";\n    case Capability::GroupNonUniformArithmetic: return \"GroupNonUniformArithmetic\";\n    case Capability::GroupNonUniformBallot: return \"GroupNonUniformBallot\";\n    case Capability::GroupNonUniformShuffle: return \"GroupNonUniformShuffle\";\n    case Capability::GroupNonUniformShuffleRelative: return \"GroupNonUniformShuffleRelative\";\n    case Capability::GroupNonUniformClustered: return \"GroupNonUniformClustered\";\n    case Capability::GroupNonUniformQuad: return \"GroupNonUniformQuad\";\n    case Capability::ShaderLayer: return \"ShaderLayer\";\n    case Capability::ShaderViewportIndex: return \"ShaderViewportIndex\";\n    case Capability::UniformDecoration: return \"UniformDecoration\";\n    case Capability::CoreBuiltinsARM: return \"CoreBuiltinsARM\";\n    case Capability::TileImageColorReadAccessEXT: return \"TileImageColorReadAccessEXT\";\n    case Capability::TileImageDepthReadAccessEXT: return \"TileImageDepthReadAccessEXT\";\n    case Capability::TileImageStencilReadAccessEXT: return \"TileImageStencilReadAccessEXT\";\n    case Capability::CooperativeMatrixLayoutsARM: return \"CooperativeMatrixLayoutsARM\";\n    case Capability::Float8EXT: return \"Float8EXT\";\r\n    case Capability::Float8CooperativeMatrixEXT: return \"Float8CooperativeMatrixEXT\";\r\n    case Capability::FragmentShadingRateKHR: return \"FragmentShadingRateKHR\";\n    case Capability::SubgroupBallotKHR: return \"SubgroupBallotKHR\";\n    case Capability::DrawParameters: return \"DrawParameters\";\n    case Capability::WorkgroupMemoryExplicitLayoutKHR: return \"WorkgroupMemoryExplicitLayoutKHR\";\n    case Capability::WorkgroupMemoryExplicitLayout8BitAccessKHR: return \"WorkgroupMemoryExplicitLayout8BitAccessKHR\";\n    case Capability::WorkgroupMemoryExplicitLayout16BitAccessKHR: return \"WorkgroupMemoryExplicitLayout16BitAccessKHR\";\n    case Capability::SubgroupVoteKHR: return \"SubgroupVoteKHR\";\n    case Capability::StorageBuffer16BitAccess: return \"StorageBuffer16BitAccess\";\n    case Capability::StorageUniform16: return \"StorageUniform16\";\n    case Capability::StoragePushConstant16: return \"StoragePushConstant16\";\n    case Capability::StorageInputOutput16: return \"StorageInputOutput16\";\n    case Capability::DeviceGroup: return \"DeviceGroup\";\n    case Capability::MultiView: return \"MultiView\";\n    case Capability::VariablePointersStorageBuffer: return \"VariablePointersStorageBuffer\";\n    case Capability::VariablePointers: return \"VariablePointers\";\n    case Capability::AtomicStorageOps: return \"AtomicStorageOps\";\n    case Capability::SampleMaskPostDepthCoverage: return \"SampleMaskPostDepthCoverage\";\n    case Capability::StorageBuffer8BitAccess: return \"StorageBuffer8BitAccess\";\n    case Capability::UniformAndStorageBuffer8BitAccess: return \"UniformAndStorageBuffer8BitAccess\";\n    case Capability::StoragePushConstant8: return \"StoragePushConstant8\";\n    case Capability::DenormPreserve: return \"DenormPreserve\";\n    case Capability::DenormFlushToZero: return \"DenormFlushToZero\";\n    case Capability::SignedZeroInfNanPreserve: return \"SignedZeroInfNanPreserve\";\n    case Capability::RoundingModeRTE: return \"RoundingModeRTE\";\n    case Capability::RoundingModeRTZ: return \"RoundingModeRTZ\";\n    case Capability::RayQueryProvisionalKHR: return \"RayQueryProvisionalKHR\";\n    case Capability::RayQueryKHR: return \"RayQueryKHR\";\n    case Capability::UntypedPointersKHR: return \"UntypedPointersKHR\";\n    case Capability::RayTraversalPrimitiveCullingKHR: return \"RayTraversalPrimitiveCullingKHR\";\n    case Capability::RayTracingKHR: return \"RayTracingKHR\";\n    case Capability::TextureSampleWeightedQCOM: return \"TextureSampleWeightedQCOM\";\n    case Capability::TextureBoxFilterQCOM: return \"TextureBoxFilterQCOM\";\n    case Capability::TextureBlockMatchQCOM: return \"TextureBlockMatchQCOM\";\n    case Capability::TileShadingQCOM: return \"TileShadingQCOM\";\n    case Capability::TextureBlockMatch2QCOM: return \"TextureBlockMatch2QCOM\";\n    case Capability::Float16ImageAMD: return \"Float16ImageAMD\";\n    case Capability::ImageGatherBiasLodAMD: return \"ImageGatherBiasLodAMD\";\n    case Capability::FragmentMaskAMD: return \"FragmentMaskAMD\";\n    case Capability::StencilExportEXT: return \"StencilExportEXT\";\n    case Capability::ImageReadWriteLodAMD: return \"ImageReadWriteLodAMD\";\n    case Capability::Int64ImageEXT: return \"Int64ImageEXT\";\n    case Capability::ShaderClockKHR: return \"ShaderClockKHR\";\n    case Capability::ShaderEnqueueAMDX: return \"ShaderEnqueueAMDX\";\n    case Capability::QuadControlKHR: return \"QuadControlKHR\";\n    case Capability::BFloat16TypeKHR: return \"BFloat16TypeKHR\";\n    case Capability::BFloat16DotProductKHR: return \"BFloat16DotProductKHR\";\n    case Capability::BFloat16CooperativeMatrixKHR: return \"BFloat16CooperativeMatrixKHR\";\n    case Capability::SampleMaskOverrideCoverageNV: return \"SampleMaskOverrideCoverageNV\";\n    case Capability::GeometryShaderPassthroughNV: return \"GeometryShaderPassthroughNV\";\n    case Capability::ShaderViewportIndexLayerEXT: return \"ShaderViewportIndexLayerEXT\";\n    case Capability::ShaderViewportMaskNV: return \"ShaderViewportMaskNV\";\n    case Capability::ShaderStereoViewNV: return \"ShaderStereoViewNV\";\n    case Capability::PerViewAttributesNV: return \"PerViewAttributesNV\";\n    case Capability::FragmentFullyCoveredEXT: return \"FragmentFullyCoveredEXT\";\n    case Capability::MeshShadingNV: return \"MeshShadingNV\";\n    case Capability::ImageFootprintNV: return \"ImageFootprintNV\";\n    case Capability::MeshShadingEXT: return \"MeshShadingEXT\";\n    case Capability::FragmentBarycentricKHR: return \"FragmentBarycentricKHR\";\n    case Capability::ComputeDerivativeGroupQuadsKHR: return \"ComputeDerivativeGroupQuadsKHR\";\n    case Capability::FragmentDensityEXT: return \"FragmentDensityEXT\";\n    case Capability::GroupNonUniformPartitionedNV: return \"GroupNonUniformPartitionedNV\";\n    case Capability::ShaderNonUniform: return \"ShaderNonUniform\";\n    case Capability::RuntimeDescriptorArray: return \"RuntimeDescriptorArray\";\n    case Capability::InputAttachmentArrayDynamicIndexing: return \"InputAttachmentArrayDynamicIndexing\";\n    case Capability::UniformTexelBufferArrayDynamicIndexing: return \"UniformTexelBufferArrayDynamicIndexing\";\n    case Capability::StorageTexelBufferArrayDynamicIndexing: return \"StorageTexelBufferArrayDynamicIndexing\";\n    case Capability::UniformBufferArrayNonUniformIndexing: return \"UniformBufferArrayNonUniformIndexing\";\n    case Capability::SampledImageArrayNonUniformIndexing: return \"SampledImageArrayNonUniformIndexing\";\n    case Capability::StorageBufferArrayNonUniformIndexing: return \"StorageBufferArrayNonUniformIndexing\";\n    case Capability::StorageImageArrayNonUniformIndexing: return \"StorageImageArrayNonUniformIndexing\";\n    case Capability::InputAttachmentArrayNonUniformIndexing: return \"InputAttachmentArrayNonUniformIndexing\";\n    case Capability::UniformTexelBufferArrayNonUniformIndexing: return \"UniformTexelBufferArrayNonUniformIndexing\";\n    case Capability::StorageTexelBufferArrayNonUniformIndexing: return \"StorageTexelBufferArrayNonUniformIndexing\";\n    case Capability::RayTracingPositionFetchKHR: return \"RayTracingPositionFetchKHR\";\n    case Capability::RayTracingNV: return \"RayTracingNV\";\n    case Capability::RayTracingMotionBlurNV: return \"RayTracingMotionBlurNV\";\n    case Capability::VulkanMemoryModel: return \"VulkanMemoryModel\";\n    case Capability::VulkanMemoryModelDeviceScope: return \"VulkanMemoryModelDeviceScope\";\n    case Capability::PhysicalStorageBufferAddresses: return \"PhysicalStorageBufferAddresses\";\n    case Capability::ComputeDerivativeGroupLinearKHR: return \"ComputeDerivativeGroupLinearKHR\";\n    case Capability::RayTracingProvisionalKHR: return \"RayTracingProvisionalKHR\";\n    case Capability::CooperativeMatrixNV: return \"CooperativeMatrixNV\";\n    case Capability::FragmentShaderSampleInterlockEXT: return \"FragmentShaderSampleInterlockEXT\";\n    case Capability::FragmentShaderShadingRateInterlockEXT: return \"FragmentShaderShadingRateInterlockEXT\";\n    case Capability::ShaderSMBuiltinsNV: return \"ShaderSMBuiltinsNV\";\n    case Capability::FragmentShaderPixelInterlockEXT: return \"FragmentShaderPixelInterlockEXT\";\n    case Capability::DemoteToHelperInvocation: return \"DemoteToHelperInvocation\";\n    case Capability::DisplacementMicromapNV: return \"DisplacementMicromapNV\";\n    case Capability::RayTracingOpacityMicromapEXT: return \"RayTracingOpacityMicromapEXT\";\n    case Capability::ShaderInvocationReorderNV: return \"ShaderInvocationReorderNV\";\n    case Capability::BindlessTextureNV: return \"BindlessTextureNV\";\n    case Capability::RayQueryPositionFetchKHR: return \"RayQueryPositionFetchKHR\";\n    case Capability::CooperativeVectorNV: return \"CooperativeVectorNV\";\n    case Capability::AtomicFloat16VectorNV: return \"AtomicFloat16VectorNV\";\n    case Capability::RayTracingDisplacementMicromapNV: return \"RayTracingDisplacementMicromapNV\";\n    case Capability::RawAccessChainsNV: return \"RawAccessChainsNV\";\n    case Capability::RayTracingSpheresGeometryNV: return \"RayTracingSpheresGeometryNV\";\n    case Capability::RayTracingLinearSweptSpheresGeometryNV: return \"RayTracingLinearSweptSpheresGeometryNV\";\n    case Capability::CooperativeMatrixReductionsNV: return \"CooperativeMatrixReductionsNV\";\n    case Capability::CooperativeMatrixConversionsNV: return \"CooperativeMatrixConversionsNV\";\n    case Capability::CooperativeMatrixPerElementOperationsNV: return \"CooperativeMatrixPerElementOperationsNV\";\n    case Capability::CooperativeMatrixTensorAddressingNV: return \"CooperativeMatrixTensorAddressingNV\";\n    case Capability::CooperativeMatrixBlockLoadsNV: return \"CooperativeMatrixBlockLoadsNV\";\n    case Capability::CooperativeVectorTrainingNV: return \"CooperativeVectorTrainingNV\";\n    case Capability::RayTracingClusterAccelerationStructureNV: return \"RayTracingClusterAccelerationStructureNV\";\n    case Capability::TensorAddressingNV: return \"TensorAddressingNV\";\n    case Capability::SubgroupShuffleINTEL: return \"SubgroupShuffleINTEL\";\n    case Capability::SubgroupBufferBlockIOINTEL: return \"SubgroupBufferBlockIOINTEL\";\n    case Capability::SubgroupImageBlockIOINTEL: return \"SubgroupImageBlockIOINTEL\";\n    case Capability::SubgroupImageMediaBlockIOINTEL: return \"SubgroupImageMediaBlockIOINTEL\";\n    case Capability::RoundToInfinityINTEL: return \"RoundToInfinityINTEL\";\n    case Capability::FloatingPointModeINTEL: return \"FloatingPointModeINTEL\";\n    case Capability::IntegerFunctions2INTEL: return \"IntegerFunctions2INTEL\";\n    case Capability::FunctionPointersINTEL: return \"FunctionPointersINTEL\";\n    case Capability::IndirectReferencesINTEL: return \"IndirectReferencesINTEL\";\n    case Capability::AsmINTEL: return \"AsmINTEL\";\n    case Capability::AtomicFloat32MinMaxEXT: return \"AtomicFloat32MinMaxEXT\";\n    case Capability::AtomicFloat64MinMaxEXT: return \"AtomicFloat64MinMaxEXT\";\n    case Capability::AtomicFloat16MinMaxEXT: return \"AtomicFloat16MinMaxEXT\";\n    case Capability::VectorComputeINTEL: return \"VectorComputeINTEL\";\n    case Capability::VectorAnyINTEL: return \"VectorAnyINTEL\";\n    case Capability::ExpectAssumeKHR: return \"ExpectAssumeKHR\";\n    case Capability::SubgroupAvcMotionEstimationINTEL: return \"SubgroupAvcMotionEstimationINTEL\";\n    case Capability::SubgroupAvcMotionEstimationIntraINTEL: return \"SubgroupAvcMotionEstimationIntraINTEL\";\n    case Capability::SubgroupAvcMotionEstimationChromaINTEL: return \"SubgroupAvcMotionEstimationChromaINTEL\";\n    case Capability::VariableLengthArrayINTEL: return \"VariableLengthArrayINTEL\";\n    case Capability::FunctionFloatControlINTEL: return \"FunctionFloatControlINTEL\";\n    case Capability::FPGAMemoryAttributesINTEL: return \"FPGAMemoryAttributesINTEL\";\n    case Capability::FPFastMathModeINTEL: return \"FPFastMathModeINTEL\";\n    case Capability::ArbitraryPrecisionIntegersINTEL: return \"ArbitraryPrecisionIntegersINTEL\";\n    case Capability::ArbitraryPrecisionFloatingPointINTEL: return \"ArbitraryPrecisionFloatingPointINTEL\";\n    case Capability::UnstructuredLoopControlsINTEL: return \"UnstructuredLoopControlsINTEL\";\n    case Capability::FPGALoopControlsINTEL: return \"FPGALoopControlsINTEL\";\n    case Capability::KernelAttributesINTEL: return \"KernelAttributesINTEL\";\n    case Capability::FPGAKernelAttributesINTEL: return \"FPGAKernelAttributesINTEL\";\n    case Capability::FPGAMemoryAccessesINTEL: return \"FPGAMemoryAccessesINTEL\";\n    case Capability::FPGAClusterAttributesINTEL: return \"FPGAClusterAttributesINTEL\";\n    case Capability::LoopFuseINTEL: return \"LoopFuseINTEL\";\n    case Capability::FPGADSPControlINTEL: return \"FPGADSPControlINTEL\";\n    case Capability::MemoryAccessAliasingINTEL: return \"MemoryAccessAliasingINTEL\";\n    case Capability::FPGAInvocationPipeliningAttributesINTEL: return \"FPGAInvocationPipeliningAttributesINTEL\";\n    case Capability::FPGABufferLocationINTEL: return \"FPGABufferLocationINTEL\";\n    case Capability::ArbitraryPrecisionFixedPointINTEL: return \"ArbitraryPrecisionFixedPointINTEL\";\n    case Capability::USMStorageClassesINTEL: return \"USMStorageClassesINTEL\";\n    case Capability::RuntimeAlignedAttributeINTEL: return \"RuntimeAlignedAttributeINTEL\";\n    case Capability::IOPipesINTEL: return \"IOPipesINTEL\";\n    case Capability::BlockingPipesINTEL: return \"BlockingPipesINTEL\";\n    case Capability::FPGARegINTEL: return \"FPGARegINTEL\";\n    case Capability::DotProductInputAll: return \"DotProductInputAll\";\n    case Capability::DotProductInput4x8Bit: return \"DotProductInput4x8Bit\";\n    case Capability::DotProductInput4x8BitPacked: return \"DotProductInput4x8BitPacked\";\n    case Capability::DotProduct: return \"DotProduct\";\n    case Capability::RayCullMaskKHR: return \"RayCullMaskKHR\";\n    case Capability::CooperativeMatrixKHR: return \"CooperativeMatrixKHR\";\n    case Capability::ReplicatedCompositesEXT: return \"ReplicatedCompositesEXT\";\n    case Capability::BitInstructions: return \"BitInstructions\";\n    case Capability::GroupNonUniformRotateKHR: return \"GroupNonUniformRotateKHR\";\n    case Capability::FloatControls2: return \"FloatControls2\";\n    case Capability::AtomicFloat32AddEXT: return \"AtomicFloat32AddEXT\";\n    case Capability::AtomicFloat64AddEXT: return \"AtomicFloat64AddEXT\";\n    case Capability::LongCompositesINTEL: return \"LongCompositesINTEL\";\n    case Capability::OptNoneEXT: return \"OptNoneEXT\";\n    case Capability::AtomicFloat16AddEXT: return \"AtomicFloat16AddEXT\";\n    case Capability::DebugInfoModuleINTEL: return \"DebugInfoModuleINTEL\";\n    case Capability::BFloat16ConversionINTEL: return \"BFloat16ConversionINTEL\";\n    case Capability::SplitBarrierINTEL: return \"SplitBarrierINTEL\";\n    case Capability::ArithmeticFenceEXT: return \"ArithmeticFenceEXT\";\n    case Capability::FPGAClusterAttributesV2INTEL: return \"FPGAClusterAttributesV2INTEL\";\n    case Capability::FPGAKernelAttributesv2INTEL: return \"FPGAKernelAttributesv2INTEL\";\n    case Capability::FPMaxErrorINTEL: return \"FPMaxErrorINTEL\";\n    case Capability::FPGALatencyControlINTEL: return \"FPGALatencyControlINTEL\";\n    case Capability::FPGAArgumentInterfacesINTEL: return \"FPGAArgumentInterfacesINTEL\";\n    case Capability::GlobalVariableHostAccessINTEL: return \"GlobalVariableHostAccessINTEL\";\n    case Capability::GlobalVariableFPGADecorationsINTEL: return \"GlobalVariableFPGADecorationsINTEL\";\n    case Capability::SubgroupBufferPrefetchINTEL: return \"SubgroupBufferPrefetchINTEL\";\n    case Capability::Subgroup2DBlockIOINTEL: return \"Subgroup2DBlockIOINTEL\";\n    case Capability::Subgroup2DBlockTransformINTEL: return \"Subgroup2DBlockTransformINTEL\";\n    case Capability::Subgroup2DBlockTransposeINTEL: return \"Subgroup2DBlockTransposeINTEL\";\n    case Capability::SubgroupMatrixMultiplyAccumulateINTEL: return \"SubgroupMatrixMultiplyAccumulateINTEL\";\n    case Capability::GroupUniformArithmeticKHR: return \"GroupUniformArithmeticKHR\";\n    case Capability::MaskedGatherScatterINTEL: return \"MaskedGatherScatterINTEL\";\n    case Capability::CacheControlsINTEL: return \"CacheControlsINTEL\";\n    case Capability::RegisterLimitsINTEL: return \"RegisterLimitsINTEL\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* RayQueryIntersectionToString(RayQueryIntersection value) {\n    switch (value) {\n    case RayQueryIntersection::RayQueryCandidateIntersectionKHR: return \"RayQueryCandidateIntersectionKHR\";\n    case RayQueryIntersection::RayQueryCommittedIntersectionKHR: return \"RayQueryCommittedIntersectionKHR\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* RayQueryCommittedIntersectionTypeToString(RayQueryCommittedIntersectionType value) {\n    switch (value) {\n    case RayQueryCommittedIntersectionType::RayQueryCommittedIntersectionNoneKHR: return \"RayQueryCommittedIntersectionNoneKHR\";\n    case RayQueryCommittedIntersectionType::RayQueryCommittedIntersectionTriangleKHR: return \"RayQueryCommittedIntersectionTriangleKHR\";\n    case RayQueryCommittedIntersectionType::RayQueryCommittedIntersectionGeneratedKHR: return \"RayQueryCommittedIntersectionGeneratedKHR\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* RayQueryCandidateIntersectionTypeToString(RayQueryCandidateIntersectionType value) {\n    switch (value) {\n    case RayQueryCandidateIntersectionType::RayQueryCandidateIntersectionTriangleKHR: return \"RayQueryCandidateIntersectionTriangleKHR\";\n    case RayQueryCandidateIntersectionType::RayQueryCandidateIntersectionAABBKHR: return \"RayQueryCandidateIntersectionAABBKHR\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* FPDenormModeToString(FPDenormMode value) {\n    switch (value) {\n    case FPDenormMode::Preserve: return \"Preserve\";\n    case FPDenormMode::FlushToZero: return \"FlushToZero\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* FPOperationModeToString(FPOperationMode value) {\n    switch (value) {\n    case FPOperationMode::IEEE: return \"IEEE\";\n    case FPOperationMode::ALT: return \"ALT\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* QuantizationModesToString(QuantizationModes value) {\n    switch (value) {\n    case QuantizationModes::TRN: return \"TRN\";\n    case QuantizationModes::TRN_ZERO: return \"TRN_ZERO\";\n    case QuantizationModes::RND: return \"RND\";\n    case QuantizationModes::RND_ZERO: return \"RND_ZERO\";\n    case QuantizationModes::RND_INF: return \"RND_INF\";\n    case QuantizationModes::RND_MIN_INF: return \"RND_MIN_INF\";\n    case QuantizationModes::RND_CONV: return \"RND_CONV\";\n    case QuantizationModes::RND_CONV_ODD: return \"RND_CONV_ODD\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* OverflowModesToString(OverflowModes value) {\n    switch (value) {\n    case OverflowModes::WRAP: return \"WRAP\";\n    case OverflowModes::SAT: return \"SAT\";\n    case OverflowModes::SAT_ZERO: return \"SAT_ZERO\";\n    case OverflowModes::SAT_SYM: return \"SAT_SYM\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* PackedVectorFormatToString(PackedVectorFormat value) {\n    switch (value) {\n    case PackedVectorFormat::PackedVectorFormat4x8Bit: return \"PackedVectorFormat4x8Bit\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* CooperativeMatrixLayoutToString(CooperativeMatrixLayout value) {\n    switch (value) {\n    case CooperativeMatrixLayout::RowMajorKHR: return \"RowMajorKHR\";\n    case CooperativeMatrixLayout::ColumnMajorKHR: return \"ColumnMajorKHR\";\n    case CooperativeMatrixLayout::RowBlockedInterleavedARM: return \"RowBlockedInterleavedARM\";\n    case CooperativeMatrixLayout::ColumnBlockedInterleavedARM: return \"ColumnBlockedInterleavedARM\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* CooperativeMatrixUseToString(CooperativeMatrixUse value) {\n    switch (value) {\n    case CooperativeMatrixUse::MatrixAKHR: return \"MatrixAKHR\";\n    case CooperativeMatrixUse::MatrixBKHR: return \"MatrixBKHR\";\n    case CooperativeMatrixUse::MatrixAccumulatorKHR: return \"MatrixAccumulatorKHR\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* TensorClampModeToString(TensorClampMode value) {\n    switch (value) {\n    case TensorClampMode::Undefined: return \"Undefined\";\n    case TensorClampMode::Constant: return \"Constant\";\n    case TensorClampMode::ClampToEdge: return \"ClampToEdge\";\n    case TensorClampMode::Repeat: return \"Repeat\";\n    case TensorClampMode::RepeatMirrored: return \"RepeatMirrored\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* InitializationModeQualifierToString(InitializationModeQualifier value) {\n    switch (value) {\n    case InitializationModeQualifier::InitOnDeviceReprogramINTEL: return \"InitOnDeviceReprogramINTEL\";\n    case InitializationModeQualifier::InitOnDeviceResetINTEL: return \"InitOnDeviceResetINTEL\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* HostAccessQualifierToString(HostAccessQualifier value) {\n    switch (value) {\n    case HostAccessQualifier::NoneINTEL: return \"NoneINTEL\";\n    case HostAccessQualifier::ReadINTEL: return \"ReadINTEL\";\n    case HostAccessQualifier::WriteINTEL: return \"WriteINTEL\";\n    case HostAccessQualifier::ReadWriteINTEL: return \"ReadWriteINTEL\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* LoadCacheControlToString(LoadCacheControl value) {\n    switch (value) {\n    case LoadCacheControl::UncachedINTEL: return \"UncachedINTEL\";\n    case LoadCacheControl::CachedINTEL: return \"CachedINTEL\";\n    case LoadCacheControl::StreamingINTEL: return \"StreamingINTEL\";\n    case LoadCacheControl::InvalidateAfterReadINTEL: return \"InvalidateAfterReadINTEL\";\n    case LoadCacheControl::ConstCachedINTEL: return \"ConstCachedINTEL\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* StoreCacheControlToString(StoreCacheControl value) {\n    switch (value) {\n    case StoreCacheControl::UncachedINTEL: return \"UncachedINTEL\";\n    case StoreCacheControl::WriteThroughINTEL: return \"WriteThroughINTEL\";\n    case StoreCacheControl::WriteBackINTEL: return \"WriteBackINTEL\";\n    case StoreCacheControl::StreamingINTEL: return \"StreamingINTEL\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* NamedMaximumNumberOfRegistersToString(NamedMaximumNumberOfRegisters value) {\n    switch (value) {\n    case NamedMaximumNumberOfRegisters::AutoINTEL: return \"AutoINTEL\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* FPEncodingToString(FPEncoding value) {\n    switch (value) {\n    case FPEncoding::BFloat16KHR: return \"BFloat16KHR\";\n    case FPEncoding::Float8E4M3EXT: return \"Float8E4M3EXT\";\r\n    case FPEncoding::Float8E5M2EXT: return \"Float8E5M2EXT\";\r\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* CooperativeVectorMatrixLayoutToString(CooperativeVectorMatrixLayout value) {\n    switch (value) {\n    case CooperativeVectorMatrixLayout::RowMajorNV: return \"RowMajorNV\";\n    case CooperativeVectorMatrixLayout::ColumnMajorNV: return \"ColumnMajorNV\";\n    case CooperativeVectorMatrixLayout::InferencingOptimalNV: return \"InferencingOptimalNV\";\n    case CooperativeVectorMatrixLayout::TrainingOptimalNV: return \"TrainingOptimalNV\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* ComponentTypeToString(ComponentType value) {\n    switch (value) {\n    case ComponentType::Float16NV: return \"Float16NV\";\n    case ComponentType::Float32NV: return \"Float32NV\";\n    case ComponentType::Float64NV: return \"Float64NV\";\n    case ComponentType::SignedInt8NV: return \"SignedInt8NV\";\n    case ComponentType::SignedInt16NV: return \"SignedInt16NV\";\n    case ComponentType::SignedInt32NV: return \"SignedInt32NV\";\n    case ComponentType::SignedInt64NV: return \"SignedInt64NV\";\n    case ComponentType::UnsignedInt8NV: return \"UnsignedInt8NV\";\n    case ComponentType::UnsignedInt16NV: return \"UnsignedInt16NV\";\n    case ComponentType::UnsignedInt32NV: return \"UnsignedInt32NV\";\n    case ComponentType::UnsignedInt64NV: return \"UnsignedInt64NV\";\n    case ComponentType::SignedInt8PackedNV: return \"SignedInt8PackedNV\";\n    case ComponentType::UnsignedInt8PackedNV: return \"UnsignedInt8PackedNV\";\n    case ComponentType::FloatE4M3NV: return \"FloatE4M3NV\";\n    case ComponentType::FloatE5M2NV: return \"FloatE5M2NV\";\n    default: return \"Unknown\";\n    }\n}\n\ninline const char* OpToString(Op value) {\n    switch (value) {\n    case Op::OpNop: return \"OpNop\";\n    case Op::OpUndef: return \"OpUndef\";\n    case Op::OpSourceContinued: return \"OpSourceContinued\";\n    case Op::OpSource: return \"OpSource\";\n    case Op::OpSourceExtension: return \"OpSourceExtension\";\n    case Op::OpName: return \"OpName\";\n    case Op::OpMemberName: return \"OpMemberName\";\n    case Op::OpString: return \"OpString\";\n    case Op::OpLine: return \"OpLine\";\n    case Op::OpExtension: return \"OpExtension\";\n    case Op::OpExtInstImport: return \"OpExtInstImport\";\n    case Op::OpExtInst: return \"OpExtInst\";\n    case Op::OpMemoryModel: return \"OpMemoryModel\";\n    case Op::OpEntryPoint: return \"OpEntryPoint\";\n    case Op::OpExecutionMode: return \"OpExecutionMode\";\n    case Op::OpCapability: return \"OpCapability\";\n    case Op::OpTypeVoid: return \"OpTypeVoid\";\n    case Op::OpTypeBool: return \"OpTypeBool\";\n    case Op::OpTypeInt: return \"OpTypeInt\";\n    case Op::OpTypeFloat: return \"OpTypeFloat\";\n    case Op::OpTypeVector: return \"OpTypeVector\";\n    case Op::OpTypeMatrix: return \"OpTypeMatrix\";\n    case Op::OpTypeImage: return \"OpTypeImage\";\n    case Op::OpTypeSampler: return \"OpTypeSampler\";\n    case Op::OpTypeSampledImage: return \"OpTypeSampledImage\";\n    case Op::OpTypeArray: return \"OpTypeArray\";\n    case Op::OpTypeRuntimeArray: return \"OpTypeRuntimeArray\";\n    case Op::OpTypeStruct: return \"OpTypeStruct\";\n    case Op::OpTypeOpaque: return \"OpTypeOpaque\";\n    case Op::OpTypePointer: return \"OpTypePointer\";\n    case Op::OpTypeFunction: return \"OpTypeFunction\";\n    case Op::OpTypeEvent: return \"OpTypeEvent\";\n    case Op::OpTypeDeviceEvent: return \"OpTypeDeviceEvent\";\n    case Op::OpTypeReserveId: return \"OpTypeReserveId\";\n    case Op::OpTypeQueue: return \"OpTypeQueue\";\n    case Op::OpTypePipe: return \"OpTypePipe\";\n    case Op::OpTypeForwardPointer: return \"OpTypeForwardPointer\";\n    case Op::OpConstantTrue: return \"OpConstantTrue\";\n    case Op::OpConstantFalse: return \"OpConstantFalse\";\n    case Op::OpConstant: return \"OpConstant\";\n    case Op::OpConstantComposite: return \"OpConstantComposite\";\n    case Op::OpConstantSampler: return \"OpConstantSampler\";\n    case Op::OpConstantNull: return \"OpConstantNull\";\n    case Op::OpSpecConstantTrue: return \"OpSpecConstantTrue\";\n    case Op::OpSpecConstantFalse: return \"OpSpecConstantFalse\";\n    case Op::OpSpecConstant: return \"OpSpecConstant\";\n    case Op::OpSpecConstantComposite: return \"OpSpecConstantComposite\";\n    case Op::OpSpecConstantOp: return \"OpSpecConstantOp\";\n    case Op::OpFunction: return \"OpFunction\";\n    case Op::OpFunctionParameter: return \"OpFunctionParameter\";\n    case Op::OpFunctionEnd: return \"OpFunctionEnd\";\n    case Op::OpFunctionCall: return \"OpFunctionCall\";\n    case Op::OpVariable: return \"OpVariable\";\n    case Op::OpImageTexelPointer: return \"OpImageTexelPointer\";\n    case Op::OpLoad: return \"OpLoad\";\n    case Op::OpStore: return \"OpStore\";\n    case Op::OpCopyMemory: return \"OpCopyMemory\";\n    case Op::OpCopyMemorySized: return \"OpCopyMemorySized\";\n    case Op::OpAccessChain: return \"OpAccessChain\";\n    case Op::OpInBoundsAccessChain: return \"OpInBoundsAccessChain\";\n    case Op::OpPtrAccessChain: return \"OpPtrAccessChain\";\n    case Op::OpArrayLength: return \"OpArrayLength\";\n    case Op::OpGenericPtrMemSemantics: return \"OpGenericPtrMemSemantics\";\n    case Op::OpInBoundsPtrAccessChain: return \"OpInBoundsPtrAccessChain\";\n    case Op::OpDecorate: return \"OpDecorate\";\n    case Op::OpMemberDecorate: return \"OpMemberDecorate\";\n    case Op::OpDecorationGroup: return \"OpDecorationGroup\";\n    case Op::OpGroupDecorate: return \"OpGroupDecorate\";\n    case Op::OpGroupMemberDecorate: return \"OpGroupMemberDecorate\";\n    case Op::OpVectorExtractDynamic: return \"OpVectorExtractDynamic\";\n    case Op::OpVectorInsertDynamic: return \"OpVectorInsertDynamic\";\n    case Op::OpVectorShuffle: return \"OpVectorShuffle\";\n    case Op::OpCompositeConstruct: return \"OpCompositeConstruct\";\n    case Op::OpCompositeExtract: return \"OpCompositeExtract\";\n    case Op::OpCompositeInsert: return \"OpCompositeInsert\";\n    case Op::OpCopyObject: return \"OpCopyObject\";\n    case Op::OpTranspose: return \"OpTranspose\";\n    case Op::OpSampledImage: return \"OpSampledImage\";\n    case Op::OpImageSampleImplicitLod: return \"OpImageSampleImplicitLod\";\n    case Op::OpImageSampleExplicitLod: return \"OpImageSampleExplicitLod\";\n    case Op::OpImageSampleDrefImplicitLod: return \"OpImageSampleDrefImplicitLod\";\n    case Op::OpImageSampleDrefExplicitLod: return \"OpImageSampleDrefExplicitLod\";\n    case Op::OpImageSampleProjImplicitLod: return \"OpImageSampleProjImplicitLod\";\n    case Op::OpImageSampleProjExplicitLod: return \"OpImageSampleProjExplicitLod\";\n    case Op::OpImageSampleProjDrefImplicitLod: return \"OpImageSampleProjDrefImplicitLod\";\n    case Op::OpImageSampleProjDrefExplicitLod: return \"OpImageSampleProjDrefExplicitLod\";\n    case Op::OpImageFetch: return \"OpImageFetch\";\n    case Op::OpImageGather: return \"OpImageGather\";\n    case Op::OpImageDrefGather: return \"OpImageDrefGather\";\n    case Op::OpImageRead: return \"OpImageRead\";\n    case Op::OpImageWrite: return \"OpImageWrite\";\n    case Op::OpImage: return \"OpImage\";\n    case Op::OpImageQueryFormat: return \"OpImageQueryFormat\";\n    case Op::OpImageQueryOrder: return \"OpImageQueryOrder\";\n    case Op::OpImageQuerySizeLod: return \"OpImageQuerySizeLod\";\n    case Op::OpImageQuerySize: return \"OpImageQuerySize\";\n    case Op::OpImageQueryLod: return \"OpImageQueryLod\";\n    case Op::OpImageQueryLevels: return \"OpImageQueryLevels\";\n    case Op::OpImageQuerySamples: return \"OpImageQuerySamples\";\n    case Op::OpConvertFToU: return \"OpConvertFToU\";\n    case Op::OpConvertFToS: return \"OpConvertFToS\";\n    case Op::OpConvertSToF: return \"OpConvertSToF\";\n    case Op::OpConvertUToF: return \"OpConvertUToF\";\n    case Op::OpUConvert: return \"OpUConvert\";\n    case Op::OpSConvert: return \"OpSConvert\";\n    case Op::OpFConvert: return \"OpFConvert\";\n    case Op::OpQuantizeToF16: return \"OpQuantizeToF16\";\n    case Op::OpConvertPtrToU: return \"OpConvertPtrToU\";\n    case Op::OpSatConvertSToU: return \"OpSatConvertSToU\";\n    case Op::OpSatConvertUToS: return \"OpSatConvertUToS\";\n    case Op::OpConvertUToPtr: return \"OpConvertUToPtr\";\n    case Op::OpPtrCastToGeneric: return \"OpPtrCastToGeneric\";\n    case Op::OpGenericCastToPtr: return \"OpGenericCastToPtr\";\n    case Op::OpGenericCastToPtrExplicit: return \"OpGenericCastToPtrExplicit\";\n    case Op::OpBitcast: return \"OpBitcast\";\n    case Op::OpSNegate: return \"OpSNegate\";\n    case Op::OpFNegate: return \"OpFNegate\";\n    case Op::OpIAdd: return \"OpIAdd\";\n    case Op::OpFAdd: return \"OpFAdd\";\n    case Op::OpISub: return \"OpISub\";\n    case Op::OpFSub: return \"OpFSub\";\n    case Op::OpIMul: return \"OpIMul\";\n    case Op::OpFMul: return \"OpFMul\";\n    case Op::OpUDiv: return \"OpUDiv\";\n    case Op::OpSDiv: return \"OpSDiv\";\n    case Op::OpFDiv: return \"OpFDiv\";\n    case Op::OpUMod: return \"OpUMod\";\n    case Op::OpSRem: return \"OpSRem\";\n    case Op::OpSMod: return \"OpSMod\";\n    case Op::OpFRem: return \"OpFRem\";\n    case Op::OpFMod: return \"OpFMod\";\n    case Op::OpVectorTimesScalar: return \"OpVectorTimesScalar\";\n    case Op::OpMatrixTimesScalar: return \"OpMatrixTimesScalar\";\n    case Op::OpVectorTimesMatrix: return \"OpVectorTimesMatrix\";\n    case Op::OpMatrixTimesVector: return \"OpMatrixTimesVector\";\n    case Op::OpMatrixTimesMatrix: return \"OpMatrixTimesMatrix\";\n    case Op::OpOuterProduct: return \"OpOuterProduct\";\n    case Op::OpDot: return \"OpDot\";\n    case Op::OpIAddCarry: return \"OpIAddCarry\";\n    case Op::OpISubBorrow: return \"OpISubBorrow\";\n    case Op::OpUMulExtended: return \"OpUMulExtended\";\n    case Op::OpSMulExtended: return \"OpSMulExtended\";\n    case Op::OpAny: return \"OpAny\";\n    case Op::OpAll: return \"OpAll\";\n    case Op::OpIsNan: return \"OpIsNan\";\n    case Op::OpIsInf: return \"OpIsInf\";\n    case Op::OpIsFinite: return \"OpIsFinite\";\n    case Op::OpIsNormal: return \"OpIsNormal\";\n    case Op::OpSignBitSet: return \"OpSignBitSet\";\n    case Op::OpLessOrGreater: return \"OpLessOrGreater\";\n    case Op::OpOrdered: return \"OpOrdered\";\n    case Op::OpUnordered: return \"OpUnordered\";\n    case Op::OpLogicalEqual: return \"OpLogicalEqual\";\n    case Op::OpLogicalNotEqual: return \"OpLogicalNotEqual\";\n    case Op::OpLogicalOr: return \"OpLogicalOr\";\n    case Op::OpLogicalAnd: return \"OpLogicalAnd\";\n    case Op::OpLogicalNot: return \"OpLogicalNot\";\n    case Op::OpSelect: return \"OpSelect\";\n    case Op::OpIEqual: return \"OpIEqual\";\n    case Op::OpINotEqual: return \"OpINotEqual\";\n    case Op::OpUGreaterThan: return \"OpUGreaterThan\";\n    case Op::OpSGreaterThan: return \"OpSGreaterThan\";\n    case Op::OpUGreaterThanEqual: return \"OpUGreaterThanEqual\";\n    case Op::OpSGreaterThanEqual: return \"OpSGreaterThanEqual\";\n    case Op::OpULessThan: return \"OpULessThan\";\n    case Op::OpSLessThan: return \"OpSLessThan\";\n    case Op::OpULessThanEqual: return \"OpULessThanEqual\";\n    case Op::OpSLessThanEqual: return \"OpSLessThanEqual\";\n    case Op::OpFOrdEqual: return \"OpFOrdEqual\";\n    case Op::OpFUnordEqual: return \"OpFUnordEqual\";\n    case Op::OpFOrdNotEqual: return \"OpFOrdNotEqual\";\n    case Op::OpFUnordNotEqual: return \"OpFUnordNotEqual\";\n    case Op::OpFOrdLessThan: return \"OpFOrdLessThan\";\n    case Op::OpFUnordLessThan: return \"OpFUnordLessThan\";\n    case Op::OpFOrdGreaterThan: return \"OpFOrdGreaterThan\";\n    case Op::OpFUnordGreaterThan: return \"OpFUnordGreaterThan\";\n    case Op::OpFOrdLessThanEqual: return \"OpFOrdLessThanEqual\";\n    case Op::OpFUnordLessThanEqual: return \"OpFUnordLessThanEqual\";\n    case Op::OpFOrdGreaterThanEqual: return \"OpFOrdGreaterThanEqual\";\n    case Op::OpFUnordGreaterThanEqual: return \"OpFUnordGreaterThanEqual\";\n    case Op::OpShiftRightLogical: return \"OpShiftRightLogical\";\n    case Op::OpShiftRightArithmetic: return \"OpShiftRightArithmetic\";\n    case Op::OpShiftLeftLogical: return \"OpShiftLeftLogical\";\n    case Op::OpBitwiseOr: return \"OpBitwiseOr\";\n    case Op::OpBitwiseXor: return \"OpBitwiseXor\";\n    case Op::OpBitwiseAnd: return \"OpBitwiseAnd\";\n    case Op::OpNot: return \"OpNot\";\n    case Op::OpBitFieldInsert: return \"OpBitFieldInsert\";\n    case Op::OpBitFieldSExtract: return \"OpBitFieldSExtract\";\n    case Op::OpBitFieldUExtract: return \"OpBitFieldUExtract\";\n    case Op::OpBitReverse: return \"OpBitReverse\";\n    case Op::OpBitCount: return \"OpBitCount\";\n    case Op::OpDPdx: return \"OpDPdx\";\n    case Op::OpDPdy: return \"OpDPdy\";\n    case Op::OpFwidth: return \"OpFwidth\";\n    case Op::OpDPdxFine: return \"OpDPdxFine\";\n    case Op::OpDPdyFine: return \"OpDPdyFine\";\n    case Op::OpFwidthFine: return \"OpFwidthFine\";\n    case Op::OpDPdxCoarse: return \"OpDPdxCoarse\";\n    case Op::OpDPdyCoarse: return \"OpDPdyCoarse\";\n    case Op::OpFwidthCoarse: return \"OpFwidthCoarse\";\n    case Op::OpEmitVertex: return \"OpEmitVertex\";\n    case Op::OpEndPrimitive: return \"OpEndPrimitive\";\n    case Op::OpEmitStreamVertex: return \"OpEmitStreamVertex\";\n    case Op::OpEndStreamPrimitive: return \"OpEndStreamPrimitive\";\n    case Op::OpControlBarrier: return \"OpControlBarrier\";\n    case Op::OpMemoryBarrier: return \"OpMemoryBarrier\";\n    case Op::OpAtomicLoad: return \"OpAtomicLoad\";\n    case Op::OpAtomicStore: return \"OpAtomicStore\";\n    case Op::OpAtomicExchange: return \"OpAtomicExchange\";\n    case Op::OpAtomicCompareExchange: return \"OpAtomicCompareExchange\";\n    case Op::OpAtomicCompareExchangeWeak: return \"OpAtomicCompareExchangeWeak\";\n    case Op::OpAtomicIIncrement: return \"OpAtomicIIncrement\";\n    case Op::OpAtomicIDecrement: return \"OpAtomicIDecrement\";\n    case Op::OpAtomicIAdd: return \"OpAtomicIAdd\";\n    case Op::OpAtomicISub: return \"OpAtomicISub\";\n    case Op::OpAtomicSMin: return \"OpAtomicSMin\";\n    case Op::OpAtomicUMin: return \"OpAtomicUMin\";\n    case Op::OpAtomicSMax: return \"OpAtomicSMax\";\n    case Op::OpAtomicUMax: return \"OpAtomicUMax\";\n    case Op::OpAtomicAnd: return \"OpAtomicAnd\";\n    case Op::OpAtomicOr: return \"OpAtomicOr\";\n    case Op::OpAtomicXor: return \"OpAtomicXor\";\n    case Op::OpPhi: return \"OpPhi\";\n    case Op::OpLoopMerge: return \"OpLoopMerge\";\n    case Op::OpSelectionMerge: return \"OpSelectionMerge\";\n    case Op::OpLabel: return \"OpLabel\";\n    case Op::OpBranch: return \"OpBranch\";\n    case Op::OpBranchConditional: return \"OpBranchConditional\";\n    case Op::OpSwitch: return \"OpSwitch\";\n    case Op::OpKill: return \"OpKill\";\n    case Op::OpReturn: return \"OpReturn\";\n    case Op::OpReturnValue: return \"OpReturnValue\";\n    case Op::OpUnreachable: return \"OpUnreachable\";\n    case Op::OpLifetimeStart: return \"OpLifetimeStart\";\n    case Op::OpLifetimeStop: return \"OpLifetimeStop\";\n    case Op::OpGroupAsyncCopy: return \"OpGroupAsyncCopy\";\n    case Op::OpGroupWaitEvents: return \"OpGroupWaitEvents\";\n    case Op::OpGroupAll: return \"OpGroupAll\";\n    case Op::OpGroupAny: return \"OpGroupAny\";\n    case Op::OpGroupBroadcast: return \"OpGroupBroadcast\";\n    case Op::OpGroupIAdd: return \"OpGroupIAdd\";\n    case Op::OpGroupFAdd: return \"OpGroupFAdd\";\n    case Op::OpGroupFMin: return \"OpGroupFMin\";\n    case Op::OpGroupUMin: return \"OpGroupUMin\";\n    case Op::OpGroupSMin: return \"OpGroupSMin\";\n    case Op::OpGroupFMax: return \"OpGroupFMax\";\n    case Op::OpGroupUMax: return \"OpGroupUMax\";\n    case Op::OpGroupSMax: return \"OpGroupSMax\";\n    case Op::OpReadPipe: return \"OpReadPipe\";\n    case Op::OpWritePipe: return \"OpWritePipe\";\n    case Op::OpReservedReadPipe: return \"OpReservedReadPipe\";\n    case Op::OpReservedWritePipe: return \"OpReservedWritePipe\";\n    case Op::OpReserveReadPipePackets: return \"OpReserveReadPipePackets\";\n    case Op::OpReserveWritePipePackets: return \"OpReserveWritePipePackets\";\n    case Op::OpCommitReadPipe: return \"OpCommitReadPipe\";\n    case Op::OpCommitWritePipe: return \"OpCommitWritePipe\";\n    case Op::OpIsValidReserveId: return \"OpIsValidReserveId\";\n    case Op::OpGetNumPipePackets: return \"OpGetNumPipePackets\";\n    case Op::OpGetMaxPipePackets: return \"OpGetMaxPipePackets\";\n    case Op::OpGroupReserveReadPipePackets: return \"OpGroupReserveReadPipePackets\";\n    case Op::OpGroupReserveWritePipePackets: return \"OpGroupReserveWritePipePackets\";\n    case Op::OpGroupCommitReadPipe: return \"OpGroupCommitReadPipe\";\n    case Op::OpGroupCommitWritePipe: return \"OpGroupCommitWritePipe\";\n    case Op::OpEnqueueMarker: return \"OpEnqueueMarker\";\n    case Op::OpEnqueueKernel: return \"OpEnqueueKernel\";\n    case Op::OpGetKernelNDrangeSubGroupCount: return \"OpGetKernelNDrangeSubGroupCount\";\n    case Op::OpGetKernelNDrangeMaxSubGroupSize: return \"OpGetKernelNDrangeMaxSubGroupSize\";\n    case Op::OpGetKernelWorkGroupSize: return \"OpGetKernelWorkGroupSize\";\n    case Op::OpGetKernelPreferredWorkGroupSizeMultiple: return \"OpGetKernelPreferredWorkGroupSizeMultiple\";\n    case Op::OpRetainEvent: return \"OpRetainEvent\";\n    case Op::OpReleaseEvent: return \"OpReleaseEvent\";\n    case Op::OpCreateUserEvent: return \"OpCreateUserEvent\";\n    case Op::OpIsValidEvent: return \"OpIsValidEvent\";\n    case Op::OpSetUserEventStatus: return \"OpSetUserEventStatus\";\n    case Op::OpCaptureEventProfilingInfo: return \"OpCaptureEventProfilingInfo\";\n    case Op::OpGetDefaultQueue: return \"OpGetDefaultQueue\";\n    case Op::OpBuildNDRange: return \"OpBuildNDRange\";\n    case Op::OpImageSparseSampleImplicitLod: return \"OpImageSparseSampleImplicitLod\";\n    case Op::OpImageSparseSampleExplicitLod: return \"OpImageSparseSampleExplicitLod\";\n    case Op::OpImageSparseSampleDrefImplicitLod: return \"OpImageSparseSampleDrefImplicitLod\";\n    case Op::OpImageSparseSampleDrefExplicitLod: return \"OpImageSparseSampleDrefExplicitLod\";\n    case Op::OpImageSparseSampleProjImplicitLod: return \"OpImageSparseSampleProjImplicitLod\";\n    case Op::OpImageSparseSampleProjExplicitLod: return \"OpImageSparseSampleProjExplicitLod\";\n    case Op::OpImageSparseSampleProjDrefImplicitLod: return \"OpImageSparseSampleProjDrefImplicitLod\";\n    case Op::OpImageSparseSampleProjDrefExplicitLod: return \"OpImageSparseSampleProjDrefExplicitLod\";\n    case Op::OpImageSparseFetch: return \"OpImageSparseFetch\";\n    case Op::OpImageSparseGather: return \"OpImageSparseGather\";\n    case Op::OpImageSparseDrefGather: return \"OpImageSparseDrefGather\";\n    case Op::OpImageSparseTexelsResident: return \"OpImageSparseTexelsResident\";\n    case Op::OpNoLine: return \"OpNoLine\";\n    case Op::OpAtomicFlagTestAndSet: return \"OpAtomicFlagTestAndSet\";\n    case Op::OpAtomicFlagClear: return \"OpAtomicFlagClear\";\n    case Op::OpImageSparseRead: return \"OpImageSparseRead\";\n    case Op::OpSizeOf: return \"OpSizeOf\";\n    case Op::OpTypePipeStorage: return \"OpTypePipeStorage\";\n    case Op::OpConstantPipeStorage: return \"OpConstantPipeStorage\";\n    case Op::OpCreatePipeFromPipeStorage: return \"OpCreatePipeFromPipeStorage\";\n    case Op::OpGetKernelLocalSizeForSubgroupCount: return \"OpGetKernelLocalSizeForSubgroupCount\";\n    case Op::OpGetKernelMaxNumSubgroups: return \"OpGetKernelMaxNumSubgroups\";\n    case Op::OpTypeNamedBarrier: return \"OpTypeNamedBarrier\";\n    case Op::OpNamedBarrierInitialize: return \"OpNamedBarrierInitialize\";\n    case Op::OpMemoryNamedBarrier: return \"OpMemoryNamedBarrier\";\n    case Op::OpModuleProcessed: return \"OpModuleProcessed\";\n    case Op::OpExecutionModeId: return \"OpExecutionModeId\";\n    case Op::OpDecorateId: return \"OpDecorateId\";\n    case Op::OpGroupNonUniformElect: return \"OpGroupNonUniformElect\";\n    case Op::OpGroupNonUniformAll: return \"OpGroupNonUniformAll\";\n    case Op::OpGroupNonUniformAny: return \"OpGroupNonUniformAny\";\n    case Op::OpGroupNonUniformAllEqual: return \"OpGroupNonUniformAllEqual\";\n    case Op::OpGroupNonUniformBroadcast: return \"OpGroupNonUniformBroadcast\";\n    case Op::OpGroupNonUniformBroadcastFirst: return \"OpGroupNonUniformBroadcastFirst\";\n    case Op::OpGroupNonUniformBallot: return \"OpGroupNonUniformBallot\";\n    case Op::OpGroupNonUniformInverseBallot: return \"OpGroupNonUniformInverseBallot\";\n    case Op::OpGroupNonUniformBallotBitExtract: return \"OpGroupNonUniformBallotBitExtract\";\n    case Op::OpGroupNonUniformBallotBitCount: return \"OpGroupNonUniformBallotBitCount\";\n    case Op::OpGroupNonUniformBallotFindLSB: return \"OpGroupNonUniformBallotFindLSB\";\n    case Op::OpGroupNonUniformBallotFindMSB: return \"OpGroupNonUniformBallotFindMSB\";\n    case Op::OpGroupNonUniformShuffle: return \"OpGroupNonUniformShuffle\";\n    case Op::OpGroupNonUniformShuffleXor: return \"OpGroupNonUniformShuffleXor\";\n    case Op::OpGroupNonUniformShuffleUp: return \"OpGroupNonUniformShuffleUp\";\n    case Op::OpGroupNonUniformShuffleDown: return \"OpGroupNonUniformShuffleDown\";\n    case Op::OpGroupNonUniformIAdd: return \"OpGroupNonUniformIAdd\";\n    case Op::OpGroupNonUniformFAdd: return \"OpGroupNonUniformFAdd\";\n    case Op::OpGroupNonUniformIMul: return \"OpGroupNonUniformIMul\";\n    case Op::OpGroupNonUniformFMul: return \"OpGroupNonUniformFMul\";\n    case Op::OpGroupNonUniformSMin: return \"OpGroupNonUniformSMin\";\n    case Op::OpGroupNonUniformUMin: return \"OpGroupNonUniformUMin\";\n    case Op::OpGroupNonUniformFMin: return \"OpGroupNonUniformFMin\";\n    case Op::OpGroupNonUniformSMax: return \"OpGroupNonUniformSMax\";\n    case Op::OpGroupNonUniformUMax: return \"OpGroupNonUniformUMax\";\n    case Op::OpGroupNonUniformFMax: return \"OpGroupNonUniformFMax\";\n    case Op::OpGroupNonUniformBitwiseAnd: return \"OpGroupNonUniformBitwiseAnd\";\n    case Op::OpGroupNonUniformBitwiseOr: return \"OpGroupNonUniformBitwiseOr\";\n    case Op::OpGroupNonUniformBitwiseXor: return \"OpGroupNonUniformBitwiseXor\";\n    case Op::OpGroupNonUniformLogicalAnd: return \"OpGroupNonUniformLogicalAnd\";\n    case Op::OpGroupNonUniformLogicalOr: return \"OpGroupNonUniformLogicalOr\";\n    case Op::OpGroupNonUniformLogicalXor: return \"OpGroupNonUniformLogicalXor\";\n    case Op::OpGroupNonUniformQuadBroadcast: return \"OpGroupNonUniformQuadBroadcast\";\n    case Op::OpGroupNonUniformQuadSwap: return \"OpGroupNonUniformQuadSwap\";\n    case Op::OpCopyLogical: return \"OpCopyLogical\";\n    case Op::OpPtrEqual: return \"OpPtrEqual\";\n    case Op::OpPtrNotEqual: return \"OpPtrNotEqual\";\n    case Op::OpPtrDiff: return \"OpPtrDiff\";\n    case Op::OpColorAttachmentReadEXT: return \"OpColorAttachmentReadEXT\";\n    case Op::OpDepthAttachmentReadEXT: return \"OpDepthAttachmentReadEXT\";\n    case Op::OpStencilAttachmentReadEXT: return \"OpStencilAttachmentReadEXT\";\n    case Op::OpTerminateInvocation: return \"OpTerminateInvocation\";\n    case Op::OpTypeUntypedPointerKHR: return \"OpTypeUntypedPointerKHR\";\n    case Op::OpUntypedVariableKHR: return \"OpUntypedVariableKHR\";\n    case Op::OpUntypedAccessChainKHR: return \"OpUntypedAccessChainKHR\";\n    case Op::OpUntypedInBoundsAccessChainKHR: return \"OpUntypedInBoundsAccessChainKHR\";\n    case Op::OpSubgroupBallotKHR: return \"OpSubgroupBallotKHR\";\n    case Op::OpSubgroupFirstInvocationKHR: return \"OpSubgroupFirstInvocationKHR\";\n    case Op::OpUntypedPtrAccessChainKHR: return \"OpUntypedPtrAccessChainKHR\";\n    case Op::OpUntypedInBoundsPtrAccessChainKHR: return \"OpUntypedInBoundsPtrAccessChainKHR\";\n    case Op::OpUntypedArrayLengthKHR: return \"OpUntypedArrayLengthKHR\";\n    case Op::OpUntypedPrefetchKHR: return \"OpUntypedPrefetchKHR\";\n    case Op::OpSubgroupAllKHR: return \"OpSubgroupAllKHR\";\n    case Op::OpSubgroupAnyKHR: return \"OpSubgroupAnyKHR\";\n    case Op::OpSubgroupAllEqualKHR: return \"OpSubgroupAllEqualKHR\";\n    case Op::OpGroupNonUniformRotateKHR: return \"OpGroupNonUniformRotateKHR\";\n    case Op::OpSubgroupReadInvocationKHR: return \"OpSubgroupReadInvocationKHR\";\n    case Op::OpExtInstWithForwardRefsKHR: return \"OpExtInstWithForwardRefsKHR\";\n    case Op::OpTraceRayKHR: return \"OpTraceRayKHR\";\n    case Op::OpExecuteCallableKHR: return \"OpExecuteCallableKHR\";\n    case Op::OpConvertUToAccelerationStructureKHR: return \"OpConvertUToAccelerationStructureKHR\";\n    case Op::OpIgnoreIntersectionKHR: return \"OpIgnoreIntersectionKHR\";\n    case Op::OpTerminateRayKHR: return \"OpTerminateRayKHR\";\n    case Op::OpSDot: return \"OpSDot\";\n    case Op::OpUDot: return \"OpUDot\";\n    case Op::OpSUDot: return \"OpSUDot\";\n    case Op::OpSDotAccSat: return \"OpSDotAccSat\";\n    case Op::OpUDotAccSat: return \"OpUDotAccSat\";\n    case Op::OpSUDotAccSat: return \"OpSUDotAccSat\";\n    case Op::OpTypeCooperativeMatrixKHR: return \"OpTypeCooperativeMatrixKHR\";\n    case Op::OpCooperativeMatrixLoadKHR: return \"OpCooperativeMatrixLoadKHR\";\n    case Op::OpCooperativeMatrixStoreKHR: return \"OpCooperativeMatrixStoreKHR\";\n    case Op::OpCooperativeMatrixMulAddKHR: return \"OpCooperativeMatrixMulAddKHR\";\n    case Op::OpCooperativeMatrixLengthKHR: return \"OpCooperativeMatrixLengthKHR\";\n    case Op::OpConstantCompositeReplicateEXT: return \"OpConstantCompositeReplicateEXT\";\n    case Op::OpSpecConstantCompositeReplicateEXT: return \"OpSpecConstantCompositeReplicateEXT\";\n    case Op::OpCompositeConstructReplicateEXT: return \"OpCompositeConstructReplicateEXT\";\n    case Op::OpTypeRayQueryKHR: return \"OpTypeRayQueryKHR\";\n    case Op::OpRayQueryInitializeKHR: return \"OpRayQueryInitializeKHR\";\n    case Op::OpRayQueryTerminateKHR: return \"OpRayQueryTerminateKHR\";\n    case Op::OpRayQueryGenerateIntersectionKHR: return \"OpRayQueryGenerateIntersectionKHR\";\n    case Op::OpRayQueryConfirmIntersectionKHR: return \"OpRayQueryConfirmIntersectionKHR\";\n    case Op::OpRayQueryProceedKHR: return \"OpRayQueryProceedKHR\";\n    case Op::OpRayQueryGetIntersectionTypeKHR: return \"OpRayQueryGetIntersectionTypeKHR\";\n    case Op::OpImageSampleWeightedQCOM: return \"OpImageSampleWeightedQCOM\";\n    case Op::OpImageBoxFilterQCOM: return \"OpImageBoxFilterQCOM\";\n    case Op::OpImageBlockMatchSSDQCOM: return \"OpImageBlockMatchSSDQCOM\";\n    case Op::OpImageBlockMatchSADQCOM: return \"OpImageBlockMatchSADQCOM\";\n    case Op::OpImageBlockMatchWindowSSDQCOM: return \"OpImageBlockMatchWindowSSDQCOM\";\n    case Op::OpImageBlockMatchWindowSADQCOM: return \"OpImageBlockMatchWindowSADQCOM\";\n    case Op::OpImageBlockMatchGatherSSDQCOM: return \"OpImageBlockMatchGatherSSDQCOM\";\n    case Op::OpImageBlockMatchGatherSADQCOM: return \"OpImageBlockMatchGatherSADQCOM\";\n    case Op::OpGroupIAddNonUniformAMD: return \"OpGroupIAddNonUniformAMD\";\n    case Op::OpGroupFAddNonUniformAMD: return \"OpGroupFAddNonUniformAMD\";\n    case Op::OpGroupFMinNonUniformAMD: return \"OpGroupFMinNonUniformAMD\";\n    case Op::OpGroupUMinNonUniformAMD: return \"OpGroupUMinNonUniformAMD\";\n    case Op::OpGroupSMinNonUniformAMD: return \"OpGroupSMinNonUniformAMD\";\n    case Op::OpGroupFMaxNonUniformAMD: return \"OpGroupFMaxNonUniformAMD\";\n    case Op::OpGroupUMaxNonUniformAMD: return \"OpGroupUMaxNonUniformAMD\";\n    case Op::OpGroupSMaxNonUniformAMD: return \"OpGroupSMaxNonUniformAMD\";\n    case Op::OpFragmentMaskFetchAMD: return \"OpFragmentMaskFetchAMD\";\n    case Op::OpFragmentFetchAMD: return \"OpFragmentFetchAMD\";\n    case Op::OpReadClockKHR: return \"OpReadClockKHR\";\n    case Op::OpAllocateNodePayloadsAMDX: return \"OpAllocateNodePayloadsAMDX\";\n    case Op::OpEnqueueNodePayloadsAMDX: return \"OpEnqueueNodePayloadsAMDX\";\n    case Op::OpTypeNodePayloadArrayAMDX: return \"OpTypeNodePayloadArrayAMDX\";\n    case Op::OpFinishWritingNodePayloadAMDX: return \"OpFinishWritingNodePayloadAMDX\";\n    case Op::OpNodePayloadArrayLengthAMDX: return \"OpNodePayloadArrayLengthAMDX\";\n    case Op::OpIsNodePayloadValidAMDX: return \"OpIsNodePayloadValidAMDX\";\n    case Op::OpConstantStringAMDX: return \"OpConstantStringAMDX\";\n    case Op::OpSpecConstantStringAMDX: return \"OpSpecConstantStringAMDX\";\n    case Op::OpGroupNonUniformQuadAllKHR: return \"OpGroupNonUniformQuadAllKHR\";\n    case Op::OpGroupNonUniformQuadAnyKHR: return \"OpGroupNonUniformQuadAnyKHR\";\n    case Op::OpHitObjectRecordHitMotionNV: return \"OpHitObjectRecordHitMotionNV\";\n    case Op::OpHitObjectRecordHitWithIndexMotionNV: return \"OpHitObjectRecordHitWithIndexMotionNV\";\n    case Op::OpHitObjectRecordMissMotionNV: return \"OpHitObjectRecordMissMotionNV\";\n    case Op::OpHitObjectGetWorldToObjectNV: return \"OpHitObjectGetWorldToObjectNV\";\n    case Op::OpHitObjectGetObjectToWorldNV: return \"OpHitObjectGetObjectToWorldNV\";\n    case Op::OpHitObjectGetObjectRayDirectionNV: return \"OpHitObjectGetObjectRayDirectionNV\";\n    case Op::OpHitObjectGetObjectRayOriginNV: return \"OpHitObjectGetObjectRayOriginNV\";\n    case Op::OpHitObjectTraceRayMotionNV: return \"OpHitObjectTraceRayMotionNV\";\n    case Op::OpHitObjectGetShaderRecordBufferHandleNV: return \"OpHitObjectGetShaderRecordBufferHandleNV\";\n    case Op::OpHitObjectGetShaderBindingTableRecordIndexNV: return \"OpHitObjectGetShaderBindingTableRecordIndexNV\";\n    case Op::OpHitObjectRecordEmptyNV: return \"OpHitObjectRecordEmptyNV\";\n    case Op::OpHitObjectTraceRayNV: return \"OpHitObjectTraceRayNV\";\n    case Op::OpHitObjectRecordHitNV: return \"OpHitObjectRecordHitNV\";\n    case Op::OpHitObjectRecordHitWithIndexNV: return \"OpHitObjectRecordHitWithIndexNV\";\n    case Op::OpHitObjectRecordMissNV: return \"OpHitObjectRecordMissNV\";\n    case Op::OpHitObjectExecuteShaderNV: return \"OpHitObjectExecuteShaderNV\";\n    case Op::OpHitObjectGetCurrentTimeNV: return \"OpHitObjectGetCurrentTimeNV\";\n    case Op::OpHitObjectGetAttributesNV: return \"OpHitObjectGetAttributesNV\";\n    case Op::OpHitObjectGetHitKindNV: return \"OpHitObjectGetHitKindNV\";\n    case Op::OpHitObjectGetPrimitiveIndexNV: return \"OpHitObjectGetPrimitiveIndexNV\";\n    case Op::OpHitObjectGetGeometryIndexNV: return \"OpHitObjectGetGeometryIndexNV\";\n    case Op::OpHitObjectGetInstanceIdNV: return \"OpHitObjectGetInstanceIdNV\";\n    case Op::OpHitObjectGetInstanceCustomIndexNV: return \"OpHitObjectGetInstanceCustomIndexNV\";\n    case Op::OpHitObjectGetWorldRayDirectionNV: return \"OpHitObjectGetWorldRayDirectionNV\";\n    case Op::OpHitObjectGetWorldRayOriginNV: return \"OpHitObjectGetWorldRayOriginNV\";\n    case Op::OpHitObjectGetRayTMaxNV: return \"OpHitObjectGetRayTMaxNV\";\n    case Op::OpHitObjectGetRayTMinNV: return \"OpHitObjectGetRayTMinNV\";\n    case Op::OpHitObjectIsEmptyNV: return \"OpHitObjectIsEmptyNV\";\n    case Op::OpHitObjectIsHitNV: return \"OpHitObjectIsHitNV\";\n    case Op::OpHitObjectIsMissNV: return \"OpHitObjectIsMissNV\";\n    case Op::OpReorderThreadWithHitObjectNV: return \"OpReorderThreadWithHitObjectNV\";\n    case Op::OpReorderThreadWithHintNV: return \"OpReorderThreadWithHintNV\";\n    case Op::OpTypeHitObjectNV: return \"OpTypeHitObjectNV\";\n    case Op::OpImageSampleFootprintNV: return \"OpImageSampleFootprintNV\";\n    case Op::OpTypeCooperativeVectorNV: return \"OpTypeCooperativeVectorNV\";\n    case Op::OpCooperativeVectorMatrixMulNV: return \"OpCooperativeVectorMatrixMulNV\";\n    case Op::OpCooperativeVectorOuterProductAccumulateNV: return \"OpCooperativeVectorOuterProductAccumulateNV\";\n    case Op::OpCooperativeVectorReduceSumAccumulateNV: return \"OpCooperativeVectorReduceSumAccumulateNV\";\n    case Op::OpCooperativeVectorMatrixMulAddNV: return \"OpCooperativeVectorMatrixMulAddNV\";\n    case Op::OpCooperativeMatrixConvertNV: return \"OpCooperativeMatrixConvertNV\";\n    case Op::OpEmitMeshTasksEXT: return \"OpEmitMeshTasksEXT\";\n    case Op::OpSetMeshOutputsEXT: return \"OpSetMeshOutputsEXT\";\n    case Op::OpGroupNonUniformPartitionNV: return \"OpGroupNonUniformPartitionNV\";\n    case Op::OpWritePackedPrimitiveIndices4x8NV: return \"OpWritePackedPrimitiveIndices4x8NV\";\n    case Op::OpFetchMicroTriangleVertexPositionNV: return \"OpFetchMicroTriangleVertexPositionNV\";\n    case Op::OpFetchMicroTriangleVertexBarycentricNV: return \"OpFetchMicroTriangleVertexBarycentricNV\";\n    case Op::OpCooperativeVectorLoadNV: return \"OpCooperativeVectorLoadNV\";\n    case Op::OpCooperativeVectorStoreNV: return \"OpCooperativeVectorStoreNV\";\n    case Op::OpReportIntersectionKHR: return \"OpReportIntersectionKHR\";\n    case Op::OpIgnoreIntersectionNV: return \"OpIgnoreIntersectionNV\";\n    case Op::OpTerminateRayNV: return \"OpTerminateRayNV\";\n    case Op::OpTraceNV: return \"OpTraceNV\";\n    case Op::OpTraceMotionNV: return \"OpTraceMotionNV\";\n    case Op::OpTraceRayMotionNV: return \"OpTraceRayMotionNV\";\n    case Op::OpRayQueryGetIntersectionTriangleVertexPositionsKHR: return \"OpRayQueryGetIntersectionTriangleVertexPositionsKHR\";\n    case Op::OpTypeAccelerationStructureKHR: return \"OpTypeAccelerationStructureKHR\";\n    case Op::OpExecuteCallableNV: return \"OpExecuteCallableNV\";\n    case Op::OpRayQueryGetClusterIdNV: return \"OpRayQueryGetClusterIdNV\";\n    case Op::OpHitObjectGetClusterIdNV: return \"OpHitObjectGetClusterIdNV\";\n    case Op::OpTypeCooperativeMatrixNV: return \"OpTypeCooperativeMatrixNV\";\n    case Op::OpCooperativeMatrixLoadNV: return \"OpCooperativeMatrixLoadNV\";\n    case Op::OpCooperativeMatrixStoreNV: return \"OpCooperativeMatrixStoreNV\";\n    case Op::OpCooperativeMatrixMulAddNV: return \"OpCooperativeMatrixMulAddNV\";\n    case Op::OpCooperativeMatrixLengthNV: return \"OpCooperativeMatrixLengthNV\";\n    case Op::OpBeginInvocationInterlockEXT: return \"OpBeginInvocationInterlockEXT\";\n    case Op::OpEndInvocationInterlockEXT: return \"OpEndInvocationInterlockEXT\";\n    case Op::OpCooperativeMatrixReduceNV: return \"OpCooperativeMatrixReduceNV\";\n    case Op::OpCooperativeMatrixLoadTensorNV: return \"OpCooperativeMatrixLoadTensorNV\";\n    case Op::OpCooperativeMatrixStoreTensorNV: return \"OpCooperativeMatrixStoreTensorNV\";\n    case Op::OpCooperativeMatrixPerElementOpNV: return \"OpCooperativeMatrixPerElementOpNV\";\n    case Op::OpTypeTensorLayoutNV: return \"OpTypeTensorLayoutNV\";\n    case Op::OpTypeTensorViewNV: return \"OpTypeTensorViewNV\";\n    case Op::OpCreateTensorLayoutNV: return \"OpCreateTensorLayoutNV\";\n    case Op::OpTensorLayoutSetDimensionNV: return \"OpTensorLayoutSetDimensionNV\";\n    case Op::OpTensorLayoutSetStrideNV: return \"OpTensorLayoutSetStrideNV\";\n    case Op::OpTensorLayoutSliceNV: return \"OpTensorLayoutSliceNV\";\n    case Op::OpTensorLayoutSetClampValueNV: return \"OpTensorLayoutSetClampValueNV\";\n    case Op::OpCreateTensorViewNV: return \"OpCreateTensorViewNV\";\n    case Op::OpTensorViewSetDimensionNV: return \"OpTensorViewSetDimensionNV\";\n    case Op::OpTensorViewSetStrideNV: return \"OpTensorViewSetStrideNV\";\n    case Op::OpDemoteToHelperInvocation: return \"OpDemoteToHelperInvocation\";\n    case Op::OpIsHelperInvocationEXT: return \"OpIsHelperInvocationEXT\";\n    case Op::OpTensorViewSetClipNV: return \"OpTensorViewSetClipNV\";\n    case Op::OpTensorLayoutSetBlockSizeNV: return \"OpTensorLayoutSetBlockSizeNV\";\n    case Op::OpCooperativeMatrixTransposeNV: return \"OpCooperativeMatrixTransposeNV\";\n    case Op::OpConvertUToImageNV: return \"OpConvertUToImageNV\";\n    case Op::OpConvertUToSamplerNV: return \"OpConvertUToSamplerNV\";\n    case Op::OpConvertImageToUNV: return \"OpConvertImageToUNV\";\n    case Op::OpConvertSamplerToUNV: return \"OpConvertSamplerToUNV\";\n    case Op::OpConvertUToSampledImageNV: return \"OpConvertUToSampledImageNV\";\n    case Op::OpConvertSampledImageToUNV: return \"OpConvertSampledImageToUNV\";\n    case Op::OpSamplerImageAddressingModeNV: return \"OpSamplerImageAddressingModeNV\";\n    case Op::OpRawAccessChainNV: return \"OpRawAccessChainNV\";\n    case Op::OpRayQueryGetIntersectionSpherePositionNV: return \"OpRayQueryGetIntersectionSpherePositionNV\";\n    case Op::OpRayQueryGetIntersectionSphereRadiusNV: return \"OpRayQueryGetIntersectionSphereRadiusNV\";\n    case Op::OpRayQueryGetIntersectionLSSPositionsNV: return \"OpRayQueryGetIntersectionLSSPositionsNV\";\n    case Op::OpRayQueryGetIntersectionLSSRadiiNV: return \"OpRayQueryGetIntersectionLSSRadiiNV\";\n    case Op::OpRayQueryGetIntersectionLSSHitValueNV: return \"OpRayQueryGetIntersectionLSSHitValueNV\";\n    case Op::OpHitObjectGetSpherePositionNV: return \"OpHitObjectGetSpherePositionNV\";\n    case Op::OpHitObjectGetSphereRadiusNV: return \"OpHitObjectGetSphereRadiusNV\";\n    case Op::OpHitObjectGetLSSPositionsNV: return \"OpHitObjectGetLSSPositionsNV\";\n    case Op::OpHitObjectGetLSSRadiiNV: return \"OpHitObjectGetLSSRadiiNV\";\n    case Op::OpHitObjectIsSphereHitNV: return \"OpHitObjectIsSphereHitNV\";\n    case Op::OpHitObjectIsLSSHitNV: return \"OpHitObjectIsLSSHitNV\";\n    case Op::OpRayQueryIsSphereHitNV: return \"OpRayQueryIsSphereHitNV\";\n    case Op::OpRayQueryIsLSSHitNV: return \"OpRayQueryIsLSSHitNV\";\n    case Op::OpSubgroupShuffleINTEL: return \"OpSubgroupShuffleINTEL\";\n    case Op::OpSubgroupShuffleDownINTEL: return \"OpSubgroupShuffleDownINTEL\";\n    case Op::OpSubgroupShuffleUpINTEL: return \"OpSubgroupShuffleUpINTEL\";\n    case Op::OpSubgroupShuffleXorINTEL: return \"OpSubgroupShuffleXorINTEL\";\n    case Op::OpSubgroupBlockReadINTEL: return \"OpSubgroupBlockReadINTEL\";\n    case Op::OpSubgroupBlockWriteINTEL: return \"OpSubgroupBlockWriteINTEL\";\n    case Op::OpSubgroupImageBlockReadINTEL: return \"OpSubgroupImageBlockReadINTEL\";\n    case Op::OpSubgroupImageBlockWriteINTEL: return \"OpSubgroupImageBlockWriteINTEL\";\n    case Op::OpSubgroupImageMediaBlockReadINTEL: return \"OpSubgroupImageMediaBlockReadINTEL\";\n    case Op::OpSubgroupImageMediaBlockWriteINTEL: return \"OpSubgroupImageMediaBlockWriteINTEL\";\n    case Op::OpUCountLeadingZerosINTEL: return \"OpUCountLeadingZerosINTEL\";\n    case Op::OpUCountTrailingZerosINTEL: return \"OpUCountTrailingZerosINTEL\";\n    case Op::OpAbsISubINTEL: return \"OpAbsISubINTEL\";\n    case Op::OpAbsUSubINTEL: return \"OpAbsUSubINTEL\";\n    case Op::OpIAddSatINTEL: return \"OpIAddSatINTEL\";\n    case Op::OpUAddSatINTEL: return \"OpUAddSatINTEL\";\n    case Op::OpIAverageINTEL: return \"OpIAverageINTEL\";\n    case Op::OpUAverageINTEL: return \"OpUAverageINTEL\";\n    case Op::OpIAverageRoundedINTEL: return \"OpIAverageRoundedINTEL\";\n    case Op::OpUAverageRoundedINTEL: return \"OpUAverageRoundedINTEL\";\n    case Op::OpISubSatINTEL: return \"OpISubSatINTEL\";\n    case Op::OpUSubSatINTEL: return \"OpUSubSatINTEL\";\n    case Op::OpIMul32x16INTEL: return \"OpIMul32x16INTEL\";\n    case Op::OpUMul32x16INTEL: return \"OpUMul32x16INTEL\";\n    case Op::OpConstantFunctionPointerINTEL: return \"OpConstantFunctionPointerINTEL\";\n    case Op::OpFunctionPointerCallINTEL: return \"OpFunctionPointerCallINTEL\";\n    case Op::OpAsmTargetINTEL: return \"OpAsmTargetINTEL\";\n    case Op::OpAsmINTEL: return \"OpAsmINTEL\";\n    case Op::OpAsmCallINTEL: return \"OpAsmCallINTEL\";\n    case Op::OpAtomicFMinEXT: return \"OpAtomicFMinEXT\";\n    case Op::OpAtomicFMaxEXT: return \"OpAtomicFMaxEXT\";\n    case Op::OpAssumeTrueKHR: return \"OpAssumeTrueKHR\";\n    case Op::OpExpectKHR: return \"OpExpectKHR\";\n    case Op::OpDecorateString: return \"OpDecorateString\";\n    case Op::OpMemberDecorateString: return \"OpMemberDecorateString\";\n    case Op::OpVmeImageINTEL: return \"OpVmeImageINTEL\";\n    case Op::OpTypeVmeImageINTEL: return \"OpTypeVmeImageINTEL\";\n    case Op::OpTypeAvcImePayloadINTEL: return \"OpTypeAvcImePayloadINTEL\";\n    case Op::OpTypeAvcRefPayloadINTEL: return \"OpTypeAvcRefPayloadINTEL\";\n    case Op::OpTypeAvcSicPayloadINTEL: return \"OpTypeAvcSicPayloadINTEL\";\n    case Op::OpTypeAvcMcePayloadINTEL: return \"OpTypeAvcMcePayloadINTEL\";\n    case Op::OpTypeAvcMceResultINTEL: return \"OpTypeAvcMceResultINTEL\";\n    case Op::OpTypeAvcImeResultINTEL: return \"OpTypeAvcImeResultINTEL\";\n    case Op::OpTypeAvcImeResultSingleReferenceStreamoutINTEL: return \"OpTypeAvcImeResultSingleReferenceStreamoutINTEL\";\n    case Op::OpTypeAvcImeResultDualReferenceStreamoutINTEL: return \"OpTypeAvcImeResultDualReferenceStreamoutINTEL\";\n    case Op::OpTypeAvcImeSingleReferenceStreaminINTEL: return \"OpTypeAvcImeSingleReferenceStreaminINTEL\";\n    case Op::OpTypeAvcImeDualReferenceStreaminINTEL: return \"OpTypeAvcImeDualReferenceStreaminINTEL\";\n    case Op::OpTypeAvcRefResultINTEL: return \"OpTypeAvcRefResultINTEL\";\n    case Op::OpTypeAvcSicResultINTEL: return \"OpTypeAvcSicResultINTEL\";\n    case Op::OpSubgroupAvcMceGetDefaultInterBaseMultiReferencePenaltyINTEL: return \"OpSubgroupAvcMceGetDefaultInterBaseMultiReferencePenaltyINTEL\";\n    case Op::OpSubgroupAvcMceSetInterBaseMultiReferencePenaltyINTEL: return \"OpSubgroupAvcMceSetInterBaseMultiReferencePenaltyINTEL\";\n    case Op::OpSubgroupAvcMceGetDefaultInterShapePenaltyINTEL: return \"OpSubgroupAvcMceGetDefaultInterShapePenaltyINTEL\";\n    case Op::OpSubgroupAvcMceSetInterShapePenaltyINTEL: return \"OpSubgroupAvcMceSetInterShapePenaltyINTEL\";\n    case Op::OpSubgroupAvcMceGetDefaultInterDirectionPenaltyINTEL: return \"OpSubgroupAvcMceGetDefaultInterDirectionPenaltyINTEL\";\n    case Op::OpSubgroupAvcMceSetInterDirectionPenaltyINTEL: return \"OpSubgroupAvcMceSetInterDirectionPenaltyINTEL\";\n    case Op::OpSubgroupAvcMceGetDefaultIntraLumaShapePenaltyINTEL: return \"OpSubgroupAvcMceGetDefaultIntraLumaShapePenaltyINTEL\";\n    case Op::OpSubgroupAvcMceGetDefaultInterMotionVectorCostTableINTEL: return \"OpSubgroupAvcMceGetDefaultInterMotionVectorCostTableINTEL\";\n    case Op::OpSubgroupAvcMceGetDefaultHighPenaltyCostTableINTEL: return \"OpSubgroupAvcMceGetDefaultHighPenaltyCostTableINTEL\";\n    case Op::OpSubgroupAvcMceGetDefaultMediumPenaltyCostTableINTEL: return \"OpSubgroupAvcMceGetDefaultMediumPenaltyCostTableINTEL\";\n    case Op::OpSubgroupAvcMceGetDefaultLowPenaltyCostTableINTEL: return \"OpSubgroupAvcMceGetDefaultLowPenaltyCostTableINTEL\";\n    case Op::OpSubgroupAvcMceSetMotionVectorCostFunctionINTEL: return \"OpSubgroupAvcMceSetMotionVectorCostFunctionINTEL\";\n    case Op::OpSubgroupAvcMceGetDefaultIntraLumaModePenaltyINTEL: return \"OpSubgroupAvcMceGetDefaultIntraLumaModePenaltyINTEL\";\n    case Op::OpSubgroupAvcMceGetDefaultNonDcLumaIntraPenaltyINTEL: return \"OpSubgroupAvcMceGetDefaultNonDcLumaIntraPenaltyINTEL\";\n    case Op::OpSubgroupAvcMceGetDefaultIntraChromaModeBasePenaltyINTEL: return \"OpSubgroupAvcMceGetDefaultIntraChromaModeBasePenaltyINTEL\";\n    case Op::OpSubgroupAvcMceSetAcOnlyHaarINTEL: return \"OpSubgroupAvcMceSetAcOnlyHaarINTEL\";\n    case Op::OpSubgroupAvcMceSetSourceInterlacedFieldPolarityINTEL: return \"OpSubgroupAvcMceSetSourceInterlacedFieldPolarityINTEL\";\n    case Op::OpSubgroupAvcMceSetSingleReferenceInterlacedFieldPolarityINTEL: return \"OpSubgroupAvcMceSetSingleReferenceInterlacedFieldPolarityINTEL\";\n    case Op::OpSubgroupAvcMceSetDualReferenceInterlacedFieldPolaritiesINTEL: return \"OpSubgroupAvcMceSetDualReferenceInterlacedFieldPolaritiesINTEL\";\n    case Op::OpSubgroupAvcMceConvertToImePayloadINTEL: return \"OpSubgroupAvcMceConvertToImePayloadINTEL\";\n    case Op::OpSubgroupAvcMceConvertToImeResultINTEL: return \"OpSubgroupAvcMceConvertToImeResultINTEL\";\n    case Op::OpSubgroupAvcMceConvertToRefPayloadINTEL: return \"OpSubgroupAvcMceConvertToRefPayloadINTEL\";\n    case Op::OpSubgroupAvcMceConvertToRefResultINTEL: return \"OpSubgroupAvcMceConvertToRefResultINTEL\";\n    case Op::OpSubgroupAvcMceConvertToSicPayloadINTEL: return \"OpSubgroupAvcMceConvertToSicPayloadINTEL\";\n    case Op::OpSubgroupAvcMceConvertToSicResultINTEL: return \"OpSubgroupAvcMceConvertToSicResultINTEL\";\n    case Op::OpSubgroupAvcMceGetMotionVectorsINTEL: return \"OpSubgroupAvcMceGetMotionVectorsINTEL\";\n    case Op::OpSubgroupAvcMceGetInterDistortionsINTEL: return \"OpSubgroupAvcMceGetInterDistortionsINTEL\";\n    case Op::OpSubgroupAvcMceGetBestInterDistortionsINTEL: return \"OpSubgroupAvcMceGetBestInterDistortionsINTEL\";\n    case Op::OpSubgroupAvcMceGetInterMajorShapeINTEL: return \"OpSubgroupAvcMceGetInterMajorShapeINTEL\";\n    case Op::OpSubgroupAvcMceGetInterMinorShapeINTEL: return \"OpSubgroupAvcMceGetInterMinorShapeINTEL\";\n    case Op::OpSubgroupAvcMceGetInterDirectionsINTEL: return \"OpSubgroupAvcMceGetInterDirectionsINTEL\";\n    case Op::OpSubgroupAvcMceGetInterMotionVectorCountINTEL: return \"OpSubgroupAvcMceGetInterMotionVectorCountINTEL\";\n    case Op::OpSubgroupAvcMceGetInterReferenceIdsINTEL: return \"OpSubgroupAvcMceGetInterReferenceIdsINTEL\";\n    case Op::OpSubgroupAvcMceGetInterReferenceInterlacedFieldPolaritiesINTEL: return \"OpSubgroupAvcMceGetInterReferenceInterlacedFieldPolaritiesINTEL\";\n    case Op::OpSubgroupAvcImeInitializeINTEL: return \"OpSubgroupAvcImeInitializeINTEL\";\n    case Op::OpSubgroupAvcImeSetSingleReferenceINTEL: return \"OpSubgroupAvcImeSetSingleReferenceINTEL\";\n    case Op::OpSubgroupAvcImeSetDualReferenceINTEL: return \"OpSubgroupAvcImeSetDualReferenceINTEL\";\n    case Op::OpSubgroupAvcImeRefWindowSizeINTEL: return \"OpSubgroupAvcImeRefWindowSizeINTEL\";\n    case Op::OpSubgroupAvcImeAdjustRefOffsetINTEL: return \"OpSubgroupAvcImeAdjustRefOffsetINTEL\";\n    case Op::OpSubgroupAvcImeConvertToMcePayloadINTEL: return \"OpSubgroupAvcImeConvertToMcePayloadINTEL\";\n    case Op::OpSubgroupAvcImeSetMaxMotionVectorCountINTEL: return \"OpSubgroupAvcImeSetMaxMotionVectorCountINTEL\";\n    case Op::OpSubgroupAvcImeSetUnidirectionalMixDisableINTEL: return \"OpSubgroupAvcImeSetUnidirectionalMixDisableINTEL\";\n    case Op::OpSubgroupAvcImeSetEarlySearchTerminationThresholdINTEL: return \"OpSubgroupAvcImeSetEarlySearchTerminationThresholdINTEL\";\n    case Op::OpSubgroupAvcImeSetWeightedSadINTEL: return \"OpSubgroupAvcImeSetWeightedSadINTEL\";\n    case Op::OpSubgroupAvcImeEvaluateWithSingleReferenceINTEL: return \"OpSubgroupAvcImeEvaluateWithSingleReferenceINTEL\";\n    case Op::OpSubgroupAvcImeEvaluateWithDualReferenceINTEL: return \"OpSubgroupAvcImeEvaluateWithDualReferenceINTEL\";\n    case Op::OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminINTEL: return \"OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminINTEL\";\n    case Op::OpSubgroupAvcImeEvaluateWithDualReferenceStreaminINTEL: return \"OpSubgroupAvcImeEvaluateWithDualReferenceStreaminINTEL\";\n    case Op::OpSubgroupAvcImeEvaluateWithSingleReferenceStreamoutINTEL: return \"OpSubgroupAvcImeEvaluateWithSingleReferenceStreamoutINTEL\";\n    case Op::OpSubgroupAvcImeEvaluateWithDualReferenceStreamoutINTEL: return \"OpSubgroupAvcImeEvaluateWithDualReferenceStreamoutINTEL\";\n    case Op::OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminoutINTEL: return \"OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminoutINTEL\";\n    case Op::OpSubgroupAvcImeEvaluateWithDualReferenceStreaminoutINTEL: return \"OpSubgroupAvcImeEvaluateWithDualReferenceStreaminoutINTEL\";\n    case Op::OpSubgroupAvcImeConvertToMceResultINTEL: return \"OpSubgroupAvcImeConvertToMceResultINTEL\";\n    case Op::OpSubgroupAvcImeGetSingleReferenceStreaminINTEL: return \"OpSubgroupAvcImeGetSingleReferenceStreaminINTEL\";\n    case Op::OpSubgroupAvcImeGetDualReferenceStreaminINTEL: return \"OpSubgroupAvcImeGetDualReferenceStreaminINTEL\";\n    case Op::OpSubgroupAvcImeStripSingleReferenceStreamoutINTEL: return \"OpSubgroupAvcImeStripSingleReferenceStreamoutINTEL\";\n    case Op::OpSubgroupAvcImeStripDualReferenceStreamoutINTEL: return \"OpSubgroupAvcImeStripDualReferenceStreamoutINTEL\";\n    case Op::OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeMotionVectorsINTEL: return \"OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeMotionVectorsINTEL\";\n    case Op::OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeDistortionsINTEL: return \"OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeDistortionsINTEL\";\n    case Op::OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeReferenceIdsINTEL: return \"OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeReferenceIdsINTEL\";\n    case Op::OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeMotionVectorsINTEL: return \"OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeMotionVectorsINTEL\";\n    case Op::OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeDistortionsINTEL: return \"OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeDistortionsINTEL\";\n    case Op::OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeReferenceIdsINTEL: return \"OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeReferenceIdsINTEL\";\n    case Op::OpSubgroupAvcImeGetBorderReachedINTEL: return \"OpSubgroupAvcImeGetBorderReachedINTEL\";\n    case Op::OpSubgroupAvcImeGetTruncatedSearchIndicationINTEL: return \"OpSubgroupAvcImeGetTruncatedSearchIndicationINTEL\";\n    case Op::OpSubgroupAvcImeGetUnidirectionalEarlySearchTerminationINTEL: return \"OpSubgroupAvcImeGetUnidirectionalEarlySearchTerminationINTEL\";\n    case Op::OpSubgroupAvcImeGetWeightingPatternMinimumMotionVectorINTEL: return \"OpSubgroupAvcImeGetWeightingPatternMinimumMotionVectorINTEL\";\n    case Op::OpSubgroupAvcImeGetWeightingPatternMinimumDistortionINTEL: return \"OpSubgroupAvcImeGetWeightingPatternMinimumDistortionINTEL\";\n    case Op::OpSubgroupAvcFmeInitializeINTEL: return \"OpSubgroupAvcFmeInitializeINTEL\";\n    case Op::OpSubgroupAvcBmeInitializeINTEL: return \"OpSubgroupAvcBmeInitializeINTEL\";\n    case Op::OpSubgroupAvcRefConvertToMcePayloadINTEL: return \"OpSubgroupAvcRefConvertToMcePayloadINTEL\";\n    case Op::OpSubgroupAvcRefSetBidirectionalMixDisableINTEL: return \"OpSubgroupAvcRefSetBidirectionalMixDisableINTEL\";\n    case Op::OpSubgroupAvcRefSetBilinearFilterEnableINTEL: return \"OpSubgroupAvcRefSetBilinearFilterEnableINTEL\";\n    case Op::OpSubgroupAvcRefEvaluateWithSingleReferenceINTEL: return \"OpSubgroupAvcRefEvaluateWithSingleReferenceINTEL\";\n    case Op::OpSubgroupAvcRefEvaluateWithDualReferenceINTEL: return \"OpSubgroupAvcRefEvaluateWithDualReferenceINTEL\";\n    case Op::OpSubgroupAvcRefEvaluateWithMultiReferenceINTEL: return \"OpSubgroupAvcRefEvaluateWithMultiReferenceINTEL\";\n    case Op::OpSubgroupAvcRefEvaluateWithMultiReferenceInterlacedINTEL: return \"OpSubgroupAvcRefEvaluateWithMultiReferenceInterlacedINTEL\";\n    case Op::OpSubgroupAvcRefConvertToMceResultINTEL: return \"OpSubgroupAvcRefConvertToMceResultINTEL\";\n    case Op::OpSubgroupAvcSicInitializeINTEL: return \"OpSubgroupAvcSicInitializeINTEL\";\n    case Op::OpSubgroupAvcSicConfigureSkcINTEL: return \"OpSubgroupAvcSicConfigureSkcINTEL\";\n    case Op::OpSubgroupAvcSicConfigureIpeLumaINTEL: return \"OpSubgroupAvcSicConfigureIpeLumaINTEL\";\n    case Op::OpSubgroupAvcSicConfigureIpeLumaChromaINTEL: return \"OpSubgroupAvcSicConfigureIpeLumaChromaINTEL\";\n    case Op::OpSubgroupAvcSicGetMotionVectorMaskINTEL: return \"OpSubgroupAvcSicGetMotionVectorMaskINTEL\";\n    case Op::OpSubgroupAvcSicConvertToMcePayloadINTEL: return \"OpSubgroupAvcSicConvertToMcePayloadINTEL\";\n    case Op::OpSubgroupAvcSicSetIntraLumaShapePenaltyINTEL: return \"OpSubgroupAvcSicSetIntraLumaShapePenaltyINTEL\";\n    case Op::OpSubgroupAvcSicSetIntraLumaModeCostFunctionINTEL: return \"OpSubgroupAvcSicSetIntraLumaModeCostFunctionINTEL\";\n    case Op::OpSubgroupAvcSicSetIntraChromaModeCostFunctionINTEL: return \"OpSubgroupAvcSicSetIntraChromaModeCostFunctionINTEL\";\n    case Op::OpSubgroupAvcSicSetBilinearFilterEnableINTEL: return \"OpSubgroupAvcSicSetBilinearFilterEnableINTEL\";\n    case Op::OpSubgroupAvcSicSetSkcForwardTransformEnableINTEL: return \"OpSubgroupAvcSicSetSkcForwardTransformEnableINTEL\";\n    case Op::OpSubgroupAvcSicSetBlockBasedRawSkipSadINTEL: return \"OpSubgroupAvcSicSetBlockBasedRawSkipSadINTEL\";\n    case Op::OpSubgroupAvcSicEvaluateIpeINTEL: return \"OpSubgroupAvcSicEvaluateIpeINTEL\";\n    case Op::OpSubgroupAvcSicEvaluateWithSingleReferenceINTEL: return \"OpSubgroupAvcSicEvaluateWithSingleReferenceINTEL\";\n    case Op::OpSubgroupAvcSicEvaluateWithDualReferenceINTEL: return \"OpSubgroupAvcSicEvaluateWithDualReferenceINTEL\";\n    case Op::OpSubgroupAvcSicEvaluateWithMultiReferenceINTEL: return \"OpSubgroupAvcSicEvaluateWithMultiReferenceINTEL\";\n    case Op::OpSubgroupAvcSicEvaluateWithMultiReferenceInterlacedINTEL: return \"OpSubgroupAvcSicEvaluateWithMultiReferenceInterlacedINTEL\";\n    case Op::OpSubgroupAvcSicConvertToMceResultINTEL: return \"OpSubgroupAvcSicConvertToMceResultINTEL\";\n    case Op::OpSubgroupAvcSicGetIpeLumaShapeINTEL: return \"OpSubgroupAvcSicGetIpeLumaShapeINTEL\";\n    case Op::OpSubgroupAvcSicGetBestIpeLumaDistortionINTEL: return \"OpSubgroupAvcSicGetBestIpeLumaDistortionINTEL\";\n    case Op::OpSubgroupAvcSicGetBestIpeChromaDistortionINTEL: return \"OpSubgroupAvcSicGetBestIpeChromaDistortionINTEL\";\n    case Op::OpSubgroupAvcSicGetPackedIpeLumaModesINTEL: return \"OpSubgroupAvcSicGetPackedIpeLumaModesINTEL\";\n    case Op::OpSubgroupAvcSicGetIpeChromaModeINTEL: return \"OpSubgroupAvcSicGetIpeChromaModeINTEL\";\n    case Op::OpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL: return \"OpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL\";\n    case Op::OpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL: return \"OpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL\";\n    case Op::OpSubgroupAvcSicGetInterRawSadsINTEL: return \"OpSubgroupAvcSicGetInterRawSadsINTEL\";\n    case Op::OpVariableLengthArrayINTEL: return \"OpVariableLengthArrayINTEL\";\n    case Op::OpSaveMemoryINTEL: return \"OpSaveMemoryINTEL\";\n    case Op::OpRestoreMemoryINTEL: return \"OpRestoreMemoryINTEL\";\n    case Op::OpArbitraryFloatSinCosPiINTEL: return \"OpArbitraryFloatSinCosPiINTEL\";\n    case Op::OpArbitraryFloatCastINTEL: return \"OpArbitraryFloatCastINTEL\";\n    case Op::OpArbitraryFloatCastFromIntINTEL: return \"OpArbitraryFloatCastFromIntINTEL\";\n    case Op::OpArbitraryFloatCastToIntINTEL: return \"OpArbitraryFloatCastToIntINTEL\";\n    case Op::OpArbitraryFloatAddINTEL: return \"OpArbitraryFloatAddINTEL\";\n    case Op::OpArbitraryFloatSubINTEL: return \"OpArbitraryFloatSubINTEL\";\n    case Op::OpArbitraryFloatMulINTEL: return \"OpArbitraryFloatMulINTEL\";\n    case Op::OpArbitraryFloatDivINTEL: return \"OpArbitraryFloatDivINTEL\";\n    case Op::OpArbitraryFloatGTINTEL: return \"OpArbitraryFloatGTINTEL\";\n    case Op::OpArbitraryFloatGEINTEL: return \"OpArbitraryFloatGEINTEL\";\n    case Op::OpArbitraryFloatLTINTEL: return \"OpArbitraryFloatLTINTEL\";\n    case Op::OpArbitraryFloatLEINTEL: return \"OpArbitraryFloatLEINTEL\";\n    case Op::OpArbitraryFloatEQINTEL: return \"OpArbitraryFloatEQINTEL\";\n    case Op::OpArbitraryFloatRecipINTEL: return \"OpArbitraryFloatRecipINTEL\";\n    case Op::OpArbitraryFloatRSqrtINTEL: return \"OpArbitraryFloatRSqrtINTEL\";\n    case Op::OpArbitraryFloatCbrtINTEL: return \"OpArbitraryFloatCbrtINTEL\";\n    case Op::OpArbitraryFloatHypotINTEL: return \"OpArbitraryFloatHypotINTEL\";\n    case Op::OpArbitraryFloatSqrtINTEL: return \"OpArbitraryFloatSqrtINTEL\";\n    case Op::OpArbitraryFloatLogINTEL: return \"OpArbitraryFloatLogINTEL\";\n    case Op::OpArbitraryFloatLog2INTEL: return \"OpArbitraryFloatLog2INTEL\";\n    case Op::OpArbitraryFloatLog10INTEL: return \"OpArbitraryFloatLog10INTEL\";\n    case Op::OpArbitraryFloatLog1pINTEL: return \"OpArbitraryFloatLog1pINTEL\";\n    case Op::OpArbitraryFloatExpINTEL: return \"OpArbitraryFloatExpINTEL\";\n    case Op::OpArbitraryFloatExp2INTEL: return \"OpArbitraryFloatExp2INTEL\";\n    case Op::OpArbitraryFloatExp10INTEL: return \"OpArbitraryFloatExp10INTEL\";\n    case Op::OpArbitraryFloatExpm1INTEL: return \"OpArbitraryFloatExpm1INTEL\";\n    case Op::OpArbitraryFloatSinINTEL: return \"OpArbitraryFloatSinINTEL\";\n    case Op::OpArbitraryFloatCosINTEL: return \"OpArbitraryFloatCosINTEL\";\n    case Op::OpArbitraryFloatSinCosINTEL: return \"OpArbitraryFloatSinCosINTEL\";\n    case Op::OpArbitraryFloatSinPiINTEL: return \"OpArbitraryFloatSinPiINTEL\";\n    case Op::OpArbitraryFloatCosPiINTEL: return \"OpArbitraryFloatCosPiINTEL\";\n    case Op::OpArbitraryFloatASinINTEL: return \"OpArbitraryFloatASinINTEL\";\n    case Op::OpArbitraryFloatASinPiINTEL: return \"OpArbitraryFloatASinPiINTEL\";\n    case Op::OpArbitraryFloatACosINTEL: return \"OpArbitraryFloatACosINTEL\";\n    case Op::OpArbitraryFloatACosPiINTEL: return \"OpArbitraryFloatACosPiINTEL\";\n    case Op::OpArbitraryFloatATanINTEL: return \"OpArbitraryFloatATanINTEL\";\n    case Op::OpArbitraryFloatATanPiINTEL: return \"OpArbitraryFloatATanPiINTEL\";\n    case Op::OpArbitraryFloatATan2INTEL: return \"OpArbitraryFloatATan2INTEL\";\n    case Op::OpArbitraryFloatPowINTEL: return \"OpArbitraryFloatPowINTEL\";\n    case Op::OpArbitraryFloatPowRINTEL: return \"OpArbitraryFloatPowRINTEL\";\n    case Op::OpArbitraryFloatPowNINTEL: return \"OpArbitraryFloatPowNINTEL\";\n    case Op::OpLoopControlINTEL: return \"OpLoopControlINTEL\";\n    case Op::OpAliasDomainDeclINTEL: return \"OpAliasDomainDeclINTEL\";\n    case Op::OpAliasScopeDeclINTEL: return \"OpAliasScopeDeclINTEL\";\n    case Op::OpAliasScopeListDeclINTEL: return \"OpAliasScopeListDeclINTEL\";\n    case Op::OpFixedSqrtINTEL: return \"OpFixedSqrtINTEL\";\n    case Op::OpFixedRecipINTEL: return \"OpFixedRecipINTEL\";\n    case Op::OpFixedRsqrtINTEL: return \"OpFixedRsqrtINTEL\";\n    case Op::OpFixedSinINTEL: return \"OpFixedSinINTEL\";\n    case Op::OpFixedCosINTEL: return \"OpFixedCosINTEL\";\n    case Op::OpFixedSinCosINTEL: return \"OpFixedSinCosINTEL\";\n    case Op::OpFixedSinPiINTEL: return \"OpFixedSinPiINTEL\";\n    case Op::OpFixedCosPiINTEL: return \"OpFixedCosPiINTEL\";\n    case Op::OpFixedSinCosPiINTEL: return \"OpFixedSinCosPiINTEL\";\n    case Op::OpFixedLogINTEL: return \"OpFixedLogINTEL\";\n    case Op::OpFixedExpINTEL: return \"OpFixedExpINTEL\";\n    case Op::OpPtrCastToCrossWorkgroupINTEL: return \"OpPtrCastToCrossWorkgroupINTEL\";\n    case Op::OpCrossWorkgroupCastToPtrINTEL: return \"OpCrossWorkgroupCastToPtrINTEL\";\n    case Op::OpReadPipeBlockingINTEL: return \"OpReadPipeBlockingINTEL\";\n    case Op::OpWritePipeBlockingINTEL: return \"OpWritePipeBlockingINTEL\";\n    case Op::OpFPGARegINTEL: return \"OpFPGARegINTEL\";\n    case Op::OpRayQueryGetRayTMinKHR: return \"OpRayQueryGetRayTMinKHR\";\n    case Op::OpRayQueryGetRayFlagsKHR: return \"OpRayQueryGetRayFlagsKHR\";\n    case Op::OpRayQueryGetIntersectionTKHR: return \"OpRayQueryGetIntersectionTKHR\";\n    case Op::OpRayQueryGetIntersectionInstanceCustomIndexKHR: return \"OpRayQueryGetIntersectionInstanceCustomIndexKHR\";\n    case Op::OpRayQueryGetIntersectionInstanceIdKHR: return \"OpRayQueryGetIntersectionInstanceIdKHR\";\n    case Op::OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR: return \"OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR\";\n    case Op::OpRayQueryGetIntersectionGeometryIndexKHR: return \"OpRayQueryGetIntersectionGeometryIndexKHR\";\n    case Op::OpRayQueryGetIntersectionPrimitiveIndexKHR: return \"OpRayQueryGetIntersectionPrimitiveIndexKHR\";\n    case Op::OpRayQueryGetIntersectionBarycentricsKHR: return \"OpRayQueryGetIntersectionBarycentricsKHR\";\n    case Op::OpRayQueryGetIntersectionFrontFaceKHR: return \"OpRayQueryGetIntersectionFrontFaceKHR\";\n    case Op::OpRayQueryGetIntersectionCandidateAABBOpaqueKHR: return \"OpRayQueryGetIntersectionCandidateAABBOpaqueKHR\";\n    case Op::OpRayQueryGetIntersectionObjectRayDirectionKHR: return \"OpRayQueryGetIntersectionObjectRayDirectionKHR\";\n    case Op::OpRayQueryGetIntersectionObjectRayOriginKHR: return \"OpRayQueryGetIntersectionObjectRayOriginKHR\";\n    case Op::OpRayQueryGetWorldRayDirectionKHR: return \"OpRayQueryGetWorldRayDirectionKHR\";\n    case Op::OpRayQueryGetWorldRayOriginKHR: return \"OpRayQueryGetWorldRayOriginKHR\";\n    case Op::OpRayQueryGetIntersectionObjectToWorldKHR: return \"OpRayQueryGetIntersectionObjectToWorldKHR\";\n    case Op::OpRayQueryGetIntersectionWorldToObjectKHR: return \"OpRayQueryGetIntersectionWorldToObjectKHR\";\n    case Op::OpAtomicFAddEXT: return \"OpAtomicFAddEXT\";\n    case Op::OpTypeBufferSurfaceINTEL: return \"OpTypeBufferSurfaceINTEL\";\n    case Op::OpTypeStructContinuedINTEL: return \"OpTypeStructContinuedINTEL\";\n    case Op::OpConstantCompositeContinuedINTEL: return \"OpConstantCompositeContinuedINTEL\";\n    case Op::OpSpecConstantCompositeContinuedINTEL: return \"OpSpecConstantCompositeContinuedINTEL\";\n    case Op::OpCompositeConstructContinuedINTEL: return \"OpCompositeConstructContinuedINTEL\";\n    case Op::OpConvertFToBF16INTEL: return \"OpConvertFToBF16INTEL\";\n    case Op::OpConvertBF16ToFINTEL: return \"OpConvertBF16ToFINTEL\";\n    case Op::OpControlBarrierArriveINTEL: return \"OpControlBarrierArriveINTEL\";\n    case Op::OpControlBarrierWaitINTEL: return \"OpControlBarrierWaitINTEL\";\n    case Op::OpArithmeticFenceEXT: return \"OpArithmeticFenceEXT\";\n    case Op::OpSubgroupBlockPrefetchINTEL: return \"OpSubgroupBlockPrefetchINTEL\";\n    case Op::OpSubgroup2DBlockLoadINTEL: return \"OpSubgroup2DBlockLoadINTEL\";\n    case Op::OpSubgroup2DBlockLoadTransformINTEL: return \"OpSubgroup2DBlockLoadTransformINTEL\";\n    case Op::OpSubgroup2DBlockLoadTransposeINTEL: return \"OpSubgroup2DBlockLoadTransposeINTEL\";\n    case Op::OpSubgroup2DBlockPrefetchINTEL: return \"OpSubgroup2DBlockPrefetchINTEL\";\n    case Op::OpSubgroup2DBlockStoreINTEL: return \"OpSubgroup2DBlockStoreINTEL\";\n    case Op::OpSubgroupMatrixMultiplyAccumulateINTEL: return \"OpSubgroupMatrixMultiplyAccumulateINTEL\";\n    case Op::OpGroupIMulKHR: return \"OpGroupIMulKHR\";\n    case Op::OpGroupFMulKHR: return \"OpGroupFMulKHR\";\n    case Op::OpGroupBitwiseAndKHR: return \"OpGroupBitwiseAndKHR\";\n    case Op::OpGroupBitwiseOrKHR: return \"OpGroupBitwiseOrKHR\";\n    case Op::OpGroupBitwiseXorKHR: return \"OpGroupBitwiseXorKHR\";\n    case Op::OpGroupLogicalAndKHR: return \"OpGroupLogicalAndKHR\";\n    case Op::OpGroupLogicalOrKHR: return \"OpGroupLogicalOrKHR\";\n    case Op::OpGroupLogicalXorKHR: return \"OpGroupLogicalXorKHR\";\n    case Op::OpMaskedGatherINTEL: return \"OpMaskedGatherINTEL\";\n    case Op::OpMaskedScatterINTEL: return \"OpMaskedScatterINTEL\";\n    default: return \"Unknown\";\n    }\n}\n\n#endif /* SPV_ENABLE_UTILITY_CODE */\n\n// Overload bitwise operators for mask bit combining\n\nconstexpr ImageOperandsMask operator|(ImageOperandsMask a, ImageOperandsMask b) { return ImageOperandsMask(unsigned(a) | unsigned(b)); }\nconstexpr ImageOperandsMask operator&(ImageOperandsMask a, ImageOperandsMask b) { return ImageOperandsMask(unsigned(a) & unsigned(b)); }\nconstexpr ImageOperandsMask operator^(ImageOperandsMask a, ImageOperandsMask b) { return ImageOperandsMask(unsigned(a) ^ unsigned(b)); }\nconstexpr ImageOperandsMask operator~(ImageOperandsMask a) { return ImageOperandsMask(~unsigned(a)); }\nconstexpr FPFastMathModeMask operator|(FPFastMathModeMask a, FPFastMathModeMask b) { return FPFastMathModeMask(unsigned(a) | unsigned(b)); }\nconstexpr FPFastMathModeMask operator&(FPFastMathModeMask a, FPFastMathModeMask b) { return FPFastMathModeMask(unsigned(a) & unsigned(b)); }\nconstexpr FPFastMathModeMask operator^(FPFastMathModeMask a, FPFastMathModeMask b) { return FPFastMathModeMask(unsigned(a) ^ unsigned(b)); }\nconstexpr FPFastMathModeMask operator~(FPFastMathModeMask a) { return FPFastMathModeMask(~unsigned(a)); }\nconstexpr SelectionControlMask operator|(SelectionControlMask a, SelectionControlMask b) { return SelectionControlMask(unsigned(a) | unsigned(b)); }\nconstexpr SelectionControlMask operator&(SelectionControlMask a, SelectionControlMask b) { return SelectionControlMask(unsigned(a) & unsigned(b)); }\nconstexpr SelectionControlMask operator^(SelectionControlMask a, SelectionControlMask b) { return SelectionControlMask(unsigned(a) ^ unsigned(b)); }\nconstexpr SelectionControlMask operator~(SelectionControlMask a) { return SelectionControlMask(~unsigned(a)); }\nconstexpr LoopControlMask operator|(LoopControlMask a, LoopControlMask b) { return LoopControlMask(unsigned(a) | unsigned(b)); }\nconstexpr LoopControlMask operator&(LoopControlMask a, LoopControlMask b) { return LoopControlMask(unsigned(a) & unsigned(b)); }\nconstexpr LoopControlMask operator^(LoopControlMask a, LoopControlMask b) { return LoopControlMask(unsigned(a) ^ unsigned(b)); }\nconstexpr LoopControlMask operator~(LoopControlMask a) { return LoopControlMask(~unsigned(a)); }\nconstexpr FunctionControlMask operator|(FunctionControlMask a, FunctionControlMask b) { return FunctionControlMask(unsigned(a) | unsigned(b)); }\nconstexpr FunctionControlMask operator&(FunctionControlMask a, FunctionControlMask b) { return FunctionControlMask(unsigned(a) & unsigned(b)); }\nconstexpr FunctionControlMask operator^(FunctionControlMask a, FunctionControlMask b) { return FunctionControlMask(unsigned(a) ^ unsigned(b)); }\nconstexpr FunctionControlMask operator~(FunctionControlMask a) { return FunctionControlMask(~unsigned(a)); }\nconstexpr MemorySemanticsMask operator|(MemorySemanticsMask a, MemorySemanticsMask b) { return MemorySemanticsMask(unsigned(a) | unsigned(b)); }\nconstexpr MemorySemanticsMask operator&(MemorySemanticsMask a, MemorySemanticsMask b) { return MemorySemanticsMask(unsigned(a) & unsigned(b)); }\nconstexpr MemorySemanticsMask operator^(MemorySemanticsMask a, MemorySemanticsMask b) { return MemorySemanticsMask(unsigned(a) ^ unsigned(b)); }\nconstexpr MemorySemanticsMask operator~(MemorySemanticsMask a) { return MemorySemanticsMask(~unsigned(a)); }\nconstexpr MemoryAccessMask operator|(MemoryAccessMask a, MemoryAccessMask b) { return MemoryAccessMask(unsigned(a) | unsigned(b)); }\nconstexpr MemoryAccessMask operator&(MemoryAccessMask a, MemoryAccessMask b) { return MemoryAccessMask(unsigned(a) & unsigned(b)); }\nconstexpr MemoryAccessMask operator^(MemoryAccessMask a, MemoryAccessMask b) { return MemoryAccessMask(unsigned(a) ^ unsigned(b)); }\nconstexpr MemoryAccessMask operator~(MemoryAccessMask a) { return MemoryAccessMask(~unsigned(a)); }\nconstexpr KernelProfilingInfoMask operator|(KernelProfilingInfoMask a, KernelProfilingInfoMask b) { return KernelProfilingInfoMask(unsigned(a) | unsigned(b)); }\nconstexpr KernelProfilingInfoMask operator&(KernelProfilingInfoMask a, KernelProfilingInfoMask b) { return KernelProfilingInfoMask(unsigned(a) & unsigned(b)); }\nconstexpr KernelProfilingInfoMask operator^(KernelProfilingInfoMask a, KernelProfilingInfoMask b) { return KernelProfilingInfoMask(unsigned(a) ^ unsigned(b)); }\nconstexpr KernelProfilingInfoMask operator~(KernelProfilingInfoMask a) { return KernelProfilingInfoMask(~unsigned(a)); }\nconstexpr RayFlagsMask operator|(RayFlagsMask a, RayFlagsMask b) { return RayFlagsMask(unsigned(a) | unsigned(b)); }\nconstexpr RayFlagsMask operator&(RayFlagsMask a, RayFlagsMask b) { return RayFlagsMask(unsigned(a) & unsigned(b)); }\nconstexpr RayFlagsMask operator^(RayFlagsMask a, RayFlagsMask b) { return RayFlagsMask(unsigned(a) ^ unsigned(b)); }\nconstexpr RayFlagsMask operator~(RayFlagsMask a) { return RayFlagsMask(~unsigned(a)); }\nconstexpr FragmentShadingRateMask operator|(FragmentShadingRateMask a, FragmentShadingRateMask b) { return FragmentShadingRateMask(unsigned(a) | unsigned(b)); }\nconstexpr FragmentShadingRateMask operator&(FragmentShadingRateMask a, FragmentShadingRateMask b) { return FragmentShadingRateMask(unsigned(a) & unsigned(b)); }\nconstexpr FragmentShadingRateMask operator^(FragmentShadingRateMask a, FragmentShadingRateMask b) { return FragmentShadingRateMask(unsigned(a) ^ unsigned(b)); }\nconstexpr FragmentShadingRateMask operator~(FragmentShadingRateMask a) { return FragmentShadingRateMask(~unsigned(a)); }\nconstexpr CooperativeMatrixOperandsMask operator|(CooperativeMatrixOperandsMask a, CooperativeMatrixOperandsMask b) { return CooperativeMatrixOperandsMask(unsigned(a) | unsigned(b)); }\nconstexpr CooperativeMatrixOperandsMask operator&(CooperativeMatrixOperandsMask a, CooperativeMatrixOperandsMask b) { return CooperativeMatrixOperandsMask(unsigned(a) & unsigned(b)); }\nconstexpr CooperativeMatrixOperandsMask operator^(CooperativeMatrixOperandsMask a, CooperativeMatrixOperandsMask b) { return CooperativeMatrixOperandsMask(unsigned(a) ^ unsigned(b)); }\nconstexpr CooperativeMatrixOperandsMask operator~(CooperativeMatrixOperandsMask a) { return CooperativeMatrixOperandsMask(~unsigned(a)); }\nconstexpr CooperativeMatrixReduceMask operator|(CooperativeMatrixReduceMask a, CooperativeMatrixReduceMask b) { return CooperativeMatrixReduceMask(unsigned(a) | unsigned(b)); }\nconstexpr CooperativeMatrixReduceMask operator&(CooperativeMatrixReduceMask a, CooperativeMatrixReduceMask b) { return CooperativeMatrixReduceMask(unsigned(a) & unsigned(b)); }\nconstexpr CooperativeMatrixReduceMask operator^(CooperativeMatrixReduceMask a, CooperativeMatrixReduceMask b) { return CooperativeMatrixReduceMask(unsigned(a) ^ unsigned(b)); }\nconstexpr CooperativeMatrixReduceMask operator~(CooperativeMatrixReduceMask a) { return CooperativeMatrixReduceMask(~unsigned(a)); }\nconstexpr TensorAddressingOperandsMask operator|(TensorAddressingOperandsMask a, TensorAddressingOperandsMask b) { return TensorAddressingOperandsMask(unsigned(a) | unsigned(b)); }\nconstexpr TensorAddressingOperandsMask operator&(TensorAddressingOperandsMask a, TensorAddressingOperandsMask b) { return TensorAddressingOperandsMask(unsigned(a) & unsigned(b)); }\nconstexpr TensorAddressingOperandsMask operator^(TensorAddressingOperandsMask a, TensorAddressingOperandsMask b) { return TensorAddressingOperandsMask(unsigned(a) ^ unsigned(b)); }\nconstexpr TensorAddressingOperandsMask operator~(TensorAddressingOperandsMask a) { return TensorAddressingOperandsMask(~unsigned(a)); }\nconstexpr MatrixMultiplyAccumulateOperandsMask operator|(MatrixMultiplyAccumulateOperandsMask a, MatrixMultiplyAccumulateOperandsMask b) { return MatrixMultiplyAccumulateOperandsMask(unsigned(a) | unsigned(b)); }\nconstexpr MatrixMultiplyAccumulateOperandsMask operator&(MatrixMultiplyAccumulateOperandsMask a, MatrixMultiplyAccumulateOperandsMask b) { return MatrixMultiplyAccumulateOperandsMask(unsigned(a) & unsigned(b)); }\nconstexpr MatrixMultiplyAccumulateOperandsMask operator^(MatrixMultiplyAccumulateOperandsMask a, MatrixMultiplyAccumulateOperandsMask b) { return MatrixMultiplyAccumulateOperandsMask(unsigned(a) ^ unsigned(b)); }\nconstexpr MatrixMultiplyAccumulateOperandsMask operator~(MatrixMultiplyAccumulateOperandsMask a) { return MatrixMultiplyAccumulateOperandsMask(~unsigned(a)); }\nconstexpr RawAccessChainOperandsMask operator|(RawAccessChainOperandsMask a, RawAccessChainOperandsMask b) { return RawAccessChainOperandsMask(unsigned(a) | unsigned(b)); }\nconstexpr RawAccessChainOperandsMask operator&(RawAccessChainOperandsMask a, RawAccessChainOperandsMask b) { return RawAccessChainOperandsMask(unsigned(a) & unsigned(b)); }\nconstexpr RawAccessChainOperandsMask operator^(RawAccessChainOperandsMask a, RawAccessChainOperandsMask b) { return RawAccessChainOperandsMask(unsigned(a) ^ unsigned(b)); }\nconstexpr RawAccessChainOperandsMask operator~(RawAccessChainOperandsMask a) { return RawAccessChainOperandsMask(~unsigned(a)); }\n\n}  // end namespace spv\n\n#endif  // #ifndef spirv_HPP\n\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/spvIR.h",
    "content": "//\n// Copyright (C) 2014 LunarG, Inc.\n// Copyright (C) 2015-2018 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\n// SPIRV-IR\n//\n// Simple in-memory representation (IR) of SPIRV.  Just for holding\n// Each function's CFG of blocks.  Has this hierarchy:\n//  - Module, which is a list of\n//    - Function, which is a list of\n//      - Block, which is a list of\n//        - Instruction\n//\n\n#pragma once\n#ifndef spvIR_H\n#define spvIR_H\n\n#include \"spirv.hpp11\"\n\n#include <algorithm>\n#include <cassert>\n#include <functional>\n#include <iostream>\n#include <memory>\n#include <vector>\n#include <set>\n#include <optional>\n\nnamespace spv {\n\nclass Block;\nclass Function;\nclass Module;\n\nconst Id NoResult = 0;\nconst Id NoType = 0;\n\nconst Decoration NoPrecision = Decoration::Max;\n\n#ifdef __GNUC__\n#   define POTENTIALLY_UNUSED __attribute__((unused))\n#else\n#   define POTENTIALLY_UNUSED\n#endif\n\nPOTENTIALLY_UNUSED\nconst MemorySemanticsMask MemorySemanticsAllMemory =\n                (MemorySemanticsMask)(MemorySemanticsMask::UniformMemory |\n                                      MemorySemanticsMask::WorkgroupMemory |\n                                      MemorySemanticsMask::AtomicCounterMemory | \n                                      MemorySemanticsMask::ImageMemory);\n\nstruct IdImmediate {\n    bool isId;      // true if word is an Id, false if word is an immediate\n    unsigned word;\n    IdImmediate(bool i, unsigned w) : isId(i), word(w) {}\n    IdImmediate(bool i, spv::MemoryAccessMask w) : isId(i), word((unsigned)w) {}\n    IdImmediate(bool i, spv::TensorAddressingOperandsMask w) : isId(i), word((unsigned)w) {}\n    IdImmediate(bool i, spv::ImageOperandsMask w) : isId(i), word((unsigned)w) {}\n    IdImmediate(bool i, spv::CooperativeMatrixOperandsMask w) : isId(i), word((unsigned)w) {}\n};\n\n//\n// SPIR-V IR instruction.\n//\n\nclass Instruction {\npublic:\n    Instruction(Id resultId, Id typeId, Op opCode) : resultId(resultId), typeId(typeId), opCode(opCode), block(nullptr) { }\n    explicit Instruction(Op opCode) : resultId(NoResult), typeId(NoType), opCode(opCode), block(nullptr) { }\n    virtual ~Instruction() {}\n    void reserveOperands(size_t count) {\n        operands.reserve(count);\n        idOperand.reserve(count);\n    }\n    void addIdOperand(Id id) {\n        // ids can't be 0\n        assert(id);\n        operands.push_back(id);\n        idOperand.push_back(true);\n    }\n    // This method is potentially dangerous as it can break assumptions\n    // about SSA and lack of forward references.\n    void setIdOperand(unsigned idx, Id id) {\n        assert(id);\n        assert(idOperand[idx]);\n        operands[idx] = id;\n    }\n\n    void addImmediateOperand(unsigned int immediate) {\n        operands.push_back(immediate);\n        idOperand.push_back(false);\n    }\n\n    void addImmediateOperand(spv::StorageClass immediate) {\n        addImmediateOperand((unsigned)immediate);\n    }\n\n    void addImmediateOperand(spv::ExecutionMode immediate) {\n        addImmediateOperand((unsigned)immediate);\n    }\n\n    void addImmediateOperand(spv::ExecutionModel immediate) {\n        addImmediateOperand((unsigned)immediate);\n    }\n\n    void addImmediateOperand(spv::Decoration immediate) {\n        addImmediateOperand((unsigned)immediate);\n    }\n\n    void addImmediateOperand(spv::LinkageType immediate) {\n        addImmediateOperand((unsigned)immediate);\n    }\n\n    void addImmediateOperand(spv::MemoryAccessMask immediate) {\n        addImmediateOperand((unsigned)immediate);\n    }\n\n    void addImmediateOperand(spv::Capability immediate) {\n        addImmediateOperand((unsigned)immediate);\n    }\n\n    void addImmediateOperand(spv::AddressingModel immediate) {\n        addImmediateOperand((unsigned)immediate);\n    }\n\n    void addImmediateOperand(spv::MemoryModel immediate) {\n        addImmediateOperand((unsigned)immediate);\n    }\n\n    void addImmediateOperand(spv::FPEncoding immediate) {\n        addImmediateOperand((unsigned)immediate);\n    }\n\n    void addImmediateOperand(spv::SourceLanguage immediate) {\n        addImmediateOperand((unsigned)immediate);\n    }\n\n    void addImmediateOperand(spv::Dim immediate) {\n        addImmediateOperand((unsigned)immediate);\n    }\n\n    void addImmediateOperand(spv::FunctionControlMask immediate){\n        addImmediateOperand((unsigned)immediate);\n    }\n\n    void addImmediateOperand(spv::SelectionControlMask immediate) {\n        addImmediateOperand((unsigned)immediate);\n    }\n\n    void addImmediateOperand(spv::LoopControlMask immediate) {\n        addImmediateOperand((unsigned)immediate);\n    }\n\n    void setImmediateOperand(unsigned idx, unsigned int immediate) {\n        assert(!idOperand[idx]);\n        operands[idx] = immediate;\n    }\n\n    void addStringOperand(const char* str)\n    {\n        unsigned int word = 0;\n        unsigned int shiftAmount = 0;\n        unsigned char c;\n\n        do {\n            c = *(str++);\n            word |= ((unsigned int)c) << shiftAmount;\n            shiftAmount += 8;\n            if (shiftAmount == 32) {\n                addImmediateOperand(word);\n                word = 0;\n                shiftAmount = 0;\n            }\n        } while (c != 0);\n\n        // deal with partial last word\n        if (shiftAmount > 0) {\n            addImmediateOperand(word);\n        }\n    }\n    bool isIdOperand(int op) const { return idOperand[op]; }\n    void setBlock(Block* b) { block = b; }\n    Block* getBlock() const { return block; }\n    Op getOpCode() const { return opCode; }\n    int getNumOperands() const\n    {\n        assert(operands.size() == idOperand.size());\n        return (int)operands.size();\n    }\n    Id getResultId() const { return resultId; }\n    Id getTypeId() const { return typeId; }\n    Id getIdOperand(int op) const {\n        assert(idOperand[op]);\n        return operands[op];\n    }\n    unsigned int getImmediateOperand(int op) const {\n        assert(!idOperand[op]);\n        return operands[op];\n    }\n\n    // Write out the binary form.\n    void dump(std::vector<unsigned int>& out) const\n    {\n        // Compute the wordCount\n        unsigned int wordCount = 1;\n        if (typeId)\n            ++wordCount;\n        if (resultId)\n            ++wordCount;\n        wordCount += (unsigned int)operands.size();\n\n        // Write out the beginning of the instruction\n        out.push_back(((wordCount) << WordCountShift) | (unsigned)opCode);\n        if (typeId)\n            out.push_back(typeId);\n        if (resultId)\n            out.push_back(resultId);\n\n        // Write out the operands\n        for (int op = 0; op < (int)operands.size(); ++op)\n            out.push_back(operands[op]);\n    }\n\n    const char *getNameString() const {\n        if (opCode == Op::OpString) {\n            return (const char *)&operands[0];\n        } else {\n            assert(opCode == Op::OpName);\n            return (const char *)&operands[1];\n        }\n    }\n\nprotected:\n    Instruction(const Instruction&);\n    Id resultId;\n    Id typeId;\n    Op opCode;\n    std::vector<Id> operands;     // operands, both <id> and immediates (both are unsigned int)\n    std::vector<bool> idOperand;  // true for operands that are <id>, false for immediates\n    Block* block;\n};\n\n//\n// SPIR-V IR block.\n//\n\nstruct DebugSourceLocation {\n    int line;\n    int column;\n    spv::Id fileId;\n};\n\nclass Block {\npublic:\n    Block(Id id, Function& parent);\n    virtual ~Block()\n    {\n    }\n\n    Id getId() { return instructions.front()->getResultId(); }\n\n    Function& getParent() const { return parent; }\n    // Returns true if the source location is actually updated.\n    // Note we still need the builder to insert the line marker instruction. This is just a tracker.\n    bool updateDebugSourceLocation(int line, int column, spv::Id fileId) {\n        if (currentSourceLoc && currentSourceLoc->line == line && currentSourceLoc->column == column &&\n            currentSourceLoc->fileId == fileId) {\n            return false;\n        }\n\n        currentSourceLoc = DebugSourceLocation{line, column, fileId};\n        return true;\n    }\n    // Returns true if the scope is actually updated.\n    // Note we still need the builder to insert the debug scope instruction. This is just a tracker.\n    bool updateDebugScope(spv::Id scopeId) {\n        assert(scopeId);\n        if (currentDebugScope && *currentDebugScope == scopeId) {\n            return false;\n        }\n\n        currentDebugScope = scopeId;\n        return true;\n    }\n    void addInstruction(std::unique_ptr<Instruction> inst);\n    void addPredecessor(Block* pred) { predecessors.push_back(pred); pred->successors.push_back(this);}\n    void addLocalVariable(std::unique_ptr<Instruction> inst) { localVariables.push_back(std::move(inst)); }\n    const std::vector<Block*>& getPredecessors() const { return predecessors; }\n    const std::vector<Block*>& getSuccessors() const { return successors; }\n    std::vector<std::unique_ptr<Instruction> >& getInstructions() {\n        return instructions;\n    }\n    const std::vector<std::unique_ptr<Instruction> >& getLocalVariables() const { return localVariables; }\n    void setUnreachable() { unreachable = true; }\n    bool isUnreachable() const { return unreachable; }\n    // Returns the block's merge instruction, if one exists (otherwise null).\n    const Instruction* getMergeInstruction() const {\n        if (instructions.size() < 2) return nullptr;\n        const Instruction* nextToLast = (instructions.cend() - 2)->get();\n        switch (nextToLast->getOpCode()) {\n            case Op::OpSelectionMerge:\n            case Op::OpLoopMerge:\n                return nextToLast;\n            default:\n                return nullptr;\n        }\n        return nullptr;\n    }\n\n    // Change this block into a canonical dead merge block.  Delete instructions\n    // as necessary.  A canonical dead merge block has only an OpLabel and an\n    // OpUnreachable.\n    void rewriteAsCanonicalUnreachableMerge() {\n        assert(localVariables.empty());\n        // Delete all instructions except for the label.\n        assert(instructions.size() > 0);\n        instructions.resize(1);\n        successors.clear();\n        addInstruction(std::unique_ptr<Instruction>(new Instruction(Op::OpUnreachable)));\n    }\n    // Change this block into a canonical dead continue target branching to the\n    // given header ID.  Delete instructions as necessary.  A canonical dead continue\n    // target has only an OpLabel and an unconditional branch back to the corresponding\n    // header.\n    void rewriteAsCanonicalUnreachableContinue(Block* header) {\n        assert(localVariables.empty());\n        // Delete all instructions except for the label.\n        assert(instructions.size() > 0);\n        instructions.resize(1);\n        successors.clear();\n        // Add OpBranch back to the header.\n        assert(header != nullptr);\n        Instruction* branch = new Instruction(Op::OpBranch);\n        branch->addIdOperand(header->getId());\n        addInstruction(std::unique_ptr<Instruction>(branch));\n        successors.push_back(header);\n    }\n\n    bool isTerminated() const\n    {\n        switch (instructions.back()->getOpCode()) {\n        case Op::OpBranch:\n        case Op::OpBranchConditional:\n        case Op::OpSwitch:\n        case Op::OpKill:\n        case Op::OpTerminateInvocation:\n        case Op::OpReturn:\n        case Op::OpReturnValue:\n        case Op::OpUnreachable:\n            return true;\n        default:\n            return false;\n        }\n    }\n\n    void dump(std::vector<unsigned int>& out) const\n    {\n        instructions[0]->dump(out);\n        for (int i = 0; i < (int)localVariables.size(); ++i)\n            localVariables[i]->dump(out);\n        for (int i = 1; i < (int)instructions.size(); ++i)\n            instructions[i]->dump(out);\n    }\n\nprotected:\n    Block(const Block&);\n    Block& operator=(Block&);\n\n    // To enforce keeping parent and ownership in sync:\n    friend Function;\n\n    std::vector<std::unique_ptr<Instruction> > instructions;\n    std::vector<Block*> predecessors, successors;\n    std::vector<std::unique_ptr<Instruction> > localVariables;\n    Function& parent;\n\n    // Track source location of the last source location marker instruction.\n    std::optional<DebugSourceLocation> currentSourceLoc;\n\n    // Track scope of the last debug scope instruction.\n    std::optional<spv::Id> currentDebugScope;\n\n    // track whether this block is known to be uncreachable (not necessarily\n    // true for all unreachable blocks, but should be set at least\n    // for the extraneous ones introduced by the builder).\n    bool unreachable;\n};\n\n// The different reasons for reaching a block in the inReadableOrder traversal.\nenum ReachReason {\n    // Reachable from the entry block via transfers of control, i.e. branches.\n    ReachViaControlFlow = 0,\n    // A continue target that is not reachable via control flow.\n    ReachDeadContinue,\n    // A merge block that is not reachable via control flow.\n    ReachDeadMerge\n};\n\n// Traverses the control-flow graph rooted at root in an order suited for\n// readable code generation.  Invokes callback at every node in the traversal\n// order.  The callback arguments are:\n// - the block,\n// - the reason we reached the block,\n// - if the reason was that block is an unreachable continue or unreachable merge block\n//   then the last parameter is the corresponding header block.\nvoid inReadableOrder(Block* root, std::function<void(Block*, ReachReason, Block* header)> callback);\n\n//\n// SPIR-V IR Function.\n//\n\nclass Function {\npublic:\n    Function(Id id, Id resultType, Id functionType, Id firstParam, LinkageType linkage, const std::string& name, Module& parent);\n    virtual ~Function()\n    {\n        for (int i = 0; i < (int)parameterInstructions.size(); ++i)\n            delete parameterInstructions[i];\n\n        for (int i = 0; i < (int)blocks.size(); ++i)\n            delete blocks[i];\n    }\n    Id getId() const { return functionInstruction.getResultId(); }\n    Id getParamId(int p) const { return parameterInstructions[p]->getResultId(); }\n    Id getParamType(int p) const { return parameterInstructions[p]->getTypeId(); }\n\n    void addBlock(Block* block) { blocks.push_back(block); }\n    void removeBlock(Block* block)\n    {\n        auto found = find(blocks.begin(), blocks.end(), block);\n        assert(found != blocks.end());\n        blocks.erase(found);\n        delete block;\n    }\n\n    Module& getParent() const { return parent; }\n    Block* getEntryBlock() const { return blocks.front(); }\n    Block* getLastBlock() const { return blocks.back(); }\n    const std::vector<Block*>& getBlocks() const { return blocks; }\n    void addLocalVariable(std::unique_ptr<Instruction> inst);\n    Id getReturnType() const { return functionInstruction.getTypeId(); }\n    Id getFuncId() const { return functionInstruction.getResultId(); }\n    Id getFuncTypeId() const { return functionInstruction.getIdOperand(1); }\n    void setReturnPrecision(Decoration precision)\n    {\n        if (precision == Decoration::RelaxedPrecision)\n            reducedPrecisionReturn = true;\n    }\n    Decoration getReturnPrecision() const\n        { return reducedPrecisionReturn ? Decoration::RelaxedPrecision : NoPrecision; }\n\n    void setDebugLineInfo(Id fileName, int line, int column) {\n        lineInstruction = std::unique_ptr<Instruction>{new Instruction(Op::OpLine)};\n        lineInstruction->reserveOperands(3);\n        lineInstruction->addIdOperand(fileName);\n        lineInstruction->addImmediateOperand(line);\n        lineInstruction->addImmediateOperand(column);\n    }\n    bool hasDebugLineInfo() const { return lineInstruction != nullptr; }\n\n    void setImplicitThis() { implicitThis = true; }\n    bool hasImplicitThis() const { return implicitThis; }\n\n    void addParamPrecision(unsigned param, Decoration precision)\n    {\n        if (precision == Decoration::RelaxedPrecision)\n            reducedPrecisionParams.insert(param);\n    }\n    Decoration getParamPrecision(unsigned param) const\n    {\n        return reducedPrecisionParams.find(param) != reducedPrecisionParams.end() ?\n            Decoration::RelaxedPrecision : NoPrecision;\n    }\n\n    void dump(std::vector<unsigned int>& out) const\n    {\n        // OpLine\n        if (lineInstruction != nullptr) {\n            lineInstruction->dump(out);\n        }\n\n        // OpFunction\n        functionInstruction.dump(out);\n\n        // OpFunctionParameter\n        for (int p = 0; p < (int)parameterInstructions.size(); ++p)\n            parameterInstructions[p]->dump(out);\n\n        // Blocks\n        inReadableOrder(blocks[0], [&out](const Block* b, ReachReason, Block*) { b->dump(out); });\n        Instruction end(0, 0, Op::OpFunctionEnd);\n        end.dump(out);\n    }\n\n    LinkageType getLinkType() const { return linkType; }\n    const char* getExportName() const { return exportName.c_str(); }\n\nprotected:\n    Function(const Function&);\n    Function& operator=(Function&);\n\n    Module& parent;\n    std::unique_ptr<Instruction> lineInstruction;\n    Instruction functionInstruction;\n    std::vector<Instruction*> parameterInstructions;\n    std::vector<Block*> blocks;\n    bool implicitThis;  // true if this is a member function expecting to be passed a 'this' as the first argument\n    bool reducedPrecisionReturn;\n    std::set<int> reducedPrecisionParams;  // list of parameter indexes that need a relaxed precision arg\n    LinkageType linkType;\n    std::string exportName;\n};\n\n//\n// SPIR-V IR Module.\n//\n\nclass Module {\npublic:\n    Module() {}\n    virtual ~Module()\n    {\n        // TODO delete things\n    }\n\n    void addFunction(Function *fun) { functions.push_back(fun); }\n\n    void mapInstruction(Instruction *instruction)\n    {\n        spv::Id resultId = instruction->getResultId();\n        // map the instruction's result id\n        if (resultId >= idToInstruction.size())\n            idToInstruction.resize(resultId + 16);\n        idToInstruction[resultId] = instruction;\n    }\n\n    Instruction* getInstruction(Id id) const { return idToInstruction[id]; }\n    const std::vector<Function*>& getFunctions() const { return functions; }\n    spv::Id getTypeId(Id resultId) const {\n        return idToInstruction[resultId] == nullptr ? NoType : idToInstruction[resultId]->getTypeId();\n    }\n    StorageClass getStorageClass(Id typeId) const\n    {\n        assert(idToInstruction[typeId]->getOpCode() == spv::Op::OpTypePointer);\n        return (StorageClass)idToInstruction[typeId]->getImmediateOperand(0);\n    }\n\n    void dump(std::vector<unsigned int>& out) const\n    {\n        for (int f = 0; f < (int)functions.size(); ++f)\n            functions[f]->dump(out);\n    }\n\nprotected:\n    Module(const Module&);\n    std::vector<Function*> functions;\n\n    // map from result id to instruction having that result id\n    std::vector<Instruction*> idToInstruction;\n\n    // map from a result id to its type id\n};\n\n//\n// Implementation (it's here due to circular type definitions).\n//\n\n// Add both\n// - the OpFunction instruction\n// - all the OpFunctionParameter instructions\n__inline Function::Function(Id id, Id resultType, Id functionType, Id firstParamId, LinkageType linkage, const std::string& name, Module& parent)\n    : parent(parent), lineInstruction(nullptr),\n      functionInstruction(id, resultType, Op::OpFunction), implicitThis(false),\n      reducedPrecisionReturn(false),\n      linkType(linkage)\n{\n    // OpFunction\n    functionInstruction.reserveOperands(2);\n    functionInstruction.addImmediateOperand(FunctionControlMask::MaskNone);\n    functionInstruction.addIdOperand(functionType);\n    parent.mapInstruction(&functionInstruction);\n    parent.addFunction(this);\n\n    // OpFunctionParameter\n    Instruction* typeInst = parent.getInstruction(functionType);\n    int numParams = typeInst->getNumOperands() - 1;\n    for (int p = 0; p < numParams; ++p) {\n        Instruction* param = new Instruction(firstParamId + p, typeInst->getIdOperand(p + 1), Op::OpFunctionParameter);\n        parent.mapInstruction(param);\n        parameterInstructions.push_back(param);\n    }\n\n    // If importing/exporting, save the function name (without the mangled parameters) for the linkage decoration\n    if (linkType != LinkageType::Max) {\n        exportName = name.substr(0, name.find_first_of('('));\n    }\n}\n\n__inline void Function::addLocalVariable(std::unique_ptr<Instruction> inst)\n{\n    Instruction* raw_instruction = inst.get();\n    blocks[0]->addLocalVariable(std::move(inst));\n    parent.mapInstruction(raw_instruction);\n}\n\n__inline Block::Block(Id id, Function& parent) : parent(parent), unreachable(false)\n{\n    instructions.push_back(std::unique_ptr<Instruction>(new Instruction(id, NoType, Op::OpLabel)));\n    instructions.back()->setBlock(this);\n    parent.getParent().mapInstruction(instructions.back().get());\n}\n\n__inline void Block::addInstruction(std::unique_ptr<Instruction> inst)\n{\n    Instruction* raw_instruction = inst.get();\n    instructions.push_back(std::move(inst));\n    raw_instruction->setBlock(this);\n    if (raw_instruction->getResultId())\n        parent.getParent().mapInstruction(raw_instruction);\n}\n\n}  // end spv namespace\n\n#endif // spvIR_H\n"
  },
  {
    "path": "src/libraries/glslang/SPIRV/spvUtil.h",
    "content": "//\n// Copyright (C) 2025 Jan Kelemen\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n#pragma once\n#ifndef spvUtil_H\n#define spvUtil_H\n\n#include <cstdint>\n#include <type_traits>\n\n#include \"spirv.hpp11\"\n\nnamespace spv {\n__inline uint32_t operator&(uint32_t value, spv::MemoryAccessMask mask) { return value & (unsigned)mask; }\n\n__inline bool operator==(uint32_t word, spv::FPEncoding encoding) { return word == (unsigned)encoding; }\n__inline bool operator!=(uint32_t word, spv::FPEncoding encoding) { return !(word == encoding); }\n\n__inline bool operator==(uint32_t word, spv::Decoration decoration) { return word == (unsigned)decoration; }\n__inline bool operator!=(uint32_t word, spv::Decoration decoration) { return !(word == decoration); }\n\n__inline bool operator==(uint32_t word, spv::Op op) { return word == (unsigned)op; }\n__inline bool operator!=(uint32_t word, spv::Op op) { return !(word == op); }\n\n__inline bool operator==(uint32_t word, spv::StorageClass storage) { return word == (unsigned)storage; }\n__inline bool operator!=(uint32_t word, spv::StorageClass storage) { return !(word == storage); }\n\n__inline bool anySet(spv::MemoryAccessMask value, spv::MemoryAccessMask mask)\n{\n    return (value & mask) != spv::MemoryAccessMask::MaskNone;\n}\n\n__inline bool anySet(spv::ImageOperandsMask value, spv::ImageOperandsMask mask)\n{\n    return (value & mask) != spv::ImageOperandsMask::MaskNone;\n}\n\n__inline bool anySet(spv::MemorySemanticsMask value, spv::MemorySemanticsMask mask)\n{\n    return (value & mask) != spv::MemorySemanticsMask::MaskNone;\n}\n\n__inline void addMask(uint32_t& word, spv::TensorAddressingOperandsMask mask) { word |= (unsigned)mask; }\n\n__inline void addMask(spv::CooperativeMatrixOperandsMask& word, spv::CooperativeMatrixOperandsMask mask)\n{\n    word = word | mask;\n}\n\ntemplate<typename Enum, typename To = std::underlying_type_t<Enum>>\n__inline To enumCast(Enum value)\n{\n    return static_cast<To>(value);\n}\n}\n\n#endif // spvUtil_H\n"
  },
  {
    "path": "src/libraries/glslang/glslang/ExtensionHeaders/GL_EXT_shader_realtime_clock.glsl",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2013-2016 LunarG, Inc.\n// Copyright (C) 2016-2020 Google, Inc.\n// Modifications Copyright(C) 2021 Advanced Micro Devices, Inc.All rights reserved.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n"
  },
  {
    "path": "src/libraries/glslang/glslang/GenericCodeGen/CodeGen.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#include \"../Include/Common.h\"\n#include \"../Include/ShHandle.h\"\n#include \"../MachineIndependent/Versions.h\"\n\n//\n// Here is where real machine specific high-level data would be defined.\n//\nclass TGenericCompiler : public TCompiler {\npublic:\n    TGenericCompiler(EShLanguage l) : TCompiler(l, infoSink) {}\n    virtual bool compile(TIntermNode* root, int version = 0, EProfile profile = ENoProfile);\n    TInfoSink infoSink;\n};\n\n//\n// This function must be provided to create the actual\n// compile object used by higher level code.  It returns\n// a subclass of TCompiler.\n//\nTCompiler* ConstructCompiler(EShLanguage language, int) { return new TGenericCompiler(language); }\n\n//\n// Delete the compiler made by ConstructCompiler\n//\nvoid DeleteCompiler(TCompiler* compiler)\n{\n    delete compiler;\n}\n\n//\n//  Generate code from the given parse tree\n//\nbool TGenericCompiler::compile(TIntermNode* /*root*/, int /*version*/, EProfile /*profile*/)\n{\n    haveValidObjectCode = true;\n\n    return haveValidObjectCode;\n}\n"
  },
  {
    "path": "src/libraries/glslang/glslang/GenericCodeGen/Link.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n//\n// The top level algorithms for linking multiple\n// shaders together.\n//\n#include \"../Include/Common.h\"\n#include \"../Include/ShHandle.h\"\n\n//\n// Actual link object, derived from the shader handle base classes.\n//\nclass TGenericLinker : public TLinker {\npublic:\n    TGenericLinker(EShExecutable e) : TLinker(e, infoSink) {}\n    bool link(TCompilerList&, TUniformMap*) { return true; }\n    void getAttributeBindings(ShBindingTable const **) const { }\n    TInfoSink infoSink;\n};\n\n//\n// The internal view of a uniform/float object exchanged with the driver.\n//\nclass TUniformLinkedMap : public TUniformMap {\npublic:\n    TUniformLinkedMap() { }\n    virtual int getLocation(const char*) { return 0; }\n};\n\nTShHandleBase* ConstructLinker(EShExecutable executable, int) { return new TGenericLinker(executable); }\n\nvoid DeleteLinker(TShHandleBase* linker)\n{\n    delete linker;\n}\n\nTUniformMap* ConstructUniformMap()\n{\n    return new TUniformLinkedMap();\n}\n\nvoid DeleteUniformMap(TUniformMap* map)\n{\n    delete map;\n}\n\nTShHandleBase* ConstructBindings()\n{\n    return nullptr;\n}\n\nvoid DeleteBindingList(TShHandleBase* bindingList)\n{\n    delete bindingList;\n}\n"
  },
  {
    "path": "src/libraries/glslang/glslang/Include/BaseTypes.h",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2012-2013 LunarG, Inc.\n// Copyright (C) 2017 ARM Limited.\n// Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#ifndef _BASICTYPES_INCLUDED_\n#define _BASICTYPES_INCLUDED_\n\nnamespace glslang {\n\n//\n// Basic type.  Arrays, vectors, sampler details, etc., are orthogonal to this.\n//\nenum TBasicType {\n    EbtVoid,\n    EbtFloat,\n    EbtDouble,\n    EbtFloat16,\n    EbtBFloat16,\n    EbtFloatE5M2,\n    EbtFloatE4M3,\n    EbtInt8,\n    EbtUint8,\n    EbtInt16,\n    EbtUint16,\n    EbtInt,\n    EbtUint,\n    EbtInt64,\n    EbtUint64,\n    EbtBool,\n    EbtAtomicUint,\n    EbtSampler,\n    EbtStruct,\n    EbtBlock,\n    EbtAccStruct,\n    EbtReference,\n    EbtRayQuery,\n    EbtHitObjectNV,\n    EbtCoopmat,\n    EbtFunction,\n    EbtTensorLayoutNV,\n    EbtTensorViewNV,\n    EbtCoopvecNV,\n    // SPIR-V type defined by spirv_type\n    EbtSpirvType,\n\n    // HLSL types that live only temporarily.\n    EbtString,\n\n    EbtNumTypes\n};\n\n//\n// Storage qualifiers.  Should align with different kinds of storage or\n// resource or GLSL storage qualifier.  Expansion is deprecated.\n//\n// N.B.: You probably DON'T want to add anything here, but rather just add it\n// to the built-in variables.  See the comment above TBuiltInVariable.\n//\n// A new built-in variable will normally be an existing qualifier, like 'in', 'out', etc.\n// DO NOT follow the design pattern of, say EvqInstanceId, etc.\n//\nenum TStorageQualifier {\n    EvqTemporary,     // For temporaries (within a function), read/write\n    EvqGlobal,        // For globals read/write\n    EvqConst,         // User-defined constant values, will be semantically constant and constant folded\n    EvqVaryingIn,     // pipeline input, read only, also supercategory for all built-ins not included in this enum (see TBuiltInVariable)\n    EvqVaryingOut,    // pipeline output, read/write, also supercategory for all built-ins not included in this enum (see TBuiltInVariable)\n    EvqUniform,       // read only, shared with app\n    EvqBuffer,        // read/write, shared with app\n    EvqShared,        // compute shader's read/write 'shared' qualifier\n    EvqSpirvStorageClass, // spirv_storage_class\n\n    EvqPayload,\n    EvqPayloadIn,\n    EvqHitAttr,\n    EvqCallableData,\n    EvqCallableDataIn,\n    EvqHitObjectAttrNV,\n\n    EvqtaskPayloadSharedEXT,\n\n    // parameters\n    EvqIn,            // also, for 'in' in the grammar before we know if it's a pipeline input or an 'in' parameter\n    EvqOut,           // also, for 'out' in the grammar before we know if it's a pipeline output or an 'out' parameter\n    EvqInOut,\n    EvqConstReadOnly, // input; also other read-only types having neither a constant value nor constant-value semantics\n\n    // built-ins read by vertex shader\n    EvqVertexId,\n    EvqInstanceId,\n\n    // built-ins written by vertex shader\n    EvqPosition,\n    EvqPointSize,\n    EvqClipVertex,\n\n    // built-ins read by fragment shader\n    EvqFace,\n    EvqFragCoord,\n    EvqPointCoord,\n\n    // built-ins written by fragment shader\n    EvqFragColor,\n    EvqFragDepth,\n    EvqFragStencil,\n\n    EvqTileImageEXT,\n\n    // end of list\n    EvqLast\n};\n\n//\n// Subcategories of the TStorageQualifier, simply to give a direct mapping\n// between built-in variable names and an numerical value (the enum).\n//\n// For backward compatibility, there is some redundancy between the\n// TStorageQualifier and these.  Existing members should both be maintained accurately.\n// However, any new built-in variable (and any existing non-redundant one)\n// must follow the pattern that the specific built-in is here, and only its\n// general qualifier is in TStorageQualifier.\n//\n// Something like gl_Position, which is sometimes 'in' and sometimes 'out'\n// shows up as two different built-in variables in a single stage, but\n// only has a single enum in TBuiltInVariable, so both the\n// TStorageQualifier and the TBuitinVariable are needed to distinguish\n// between them.\n//\nenum TBuiltInVariable {\n    EbvNone,\n    EbvNumWorkGroups,\n    EbvWorkGroupSize,\n    EbvWorkGroupId,\n    EbvLocalInvocationId,\n    EbvGlobalInvocationId,\n    EbvLocalInvocationIndex,\n    EbvNumSubgroups,\n    EbvSubgroupID,\n    EbvSubGroupSize,\n    EbvSubGroupInvocation,\n    EbvSubGroupEqMask,\n    EbvSubGroupGeMask,\n    EbvSubGroupGtMask,\n    EbvSubGroupLeMask,\n    EbvSubGroupLtMask,\n    EbvSubgroupSize2,\n    EbvSubgroupInvocation2,\n    EbvSubgroupEqMask2,\n    EbvSubgroupGeMask2,\n    EbvSubgroupGtMask2,\n    EbvSubgroupLeMask2,\n    EbvSubgroupLtMask2,\n    EbvVertexId,\n    EbvInstanceId,\n    EbvVertexIndex,\n    EbvInstanceIndex,\n    EbvBaseVertex,\n    EbvBaseInstance,\n    EbvDrawId,\n    EbvPosition,\n    EbvPointSize,\n    EbvClipVertex,\n    EbvClipDistance,\n    EbvCullDistance,\n    EbvNormal,\n    EbvVertex,\n    EbvMultiTexCoord0,\n    EbvMultiTexCoord1,\n    EbvMultiTexCoord2,\n    EbvMultiTexCoord3,\n    EbvMultiTexCoord4,\n    EbvMultiTexCoord5,\n    EbvMultiTexCoord6,\n    EbvMultiTexCoord7,\n    EbvFrontColor,\n    EbvBackColor,\n    EbvFrontSecondaryColor,\n    EbvBackSecondaryColor,\n    EbvTexCoord,\n    EbvFogFragCoord,\n    EbvInvocationId,\n    EbvPrimitiveId,\n    EbvLayer,\n    EbvViewportIndex,\n    EbvPatchVertices,\n    EbvTessLevelOuter,\n    EbvTessLevelInner,\n    EbvBoundingBox,\n    EbvTessCoord,\n    EbvColor,\n    EbvSecondaryColor,\n    EbvFace,\n    EbvFragCoord,\n    EbvPointCoord,\n    EbvFragColor,\n    EbvFragData,\n    EbvFragDepth,\n    EbvFragStencilRef,\n    EbvSampleId,\n    EbvSamplePosition,\n    EbvSampleMask,\n    EbvHelperInvocation,\n\n    EbvBaryCoordNoPersp,\n    EbvBaryCoordNoPerspCentroid,\n    EbvBaryCoordNoPerspSample,\n    EbvBaryCoordSmooth,\n    EbvBaryCoordSmoothCentroid,\n    EbvBaryCoordSmoothSample,\n    EbvBaryCoordPullModel,\n\n    EbvViewIndex,\n    EbvDeviceIndex,\n\n    EbvShadingRateKHR,\n    EbvPrimitiveShadingRateKHR,\n\n    EbvFragSizeEXT,\n    EbvFragInvocationCountEXT,\n\n    EbvSecondaryFragDataEXT,\n    EbvSecondaryFragColorEXT,\n\n    EbvViewportMaskNV,\n    EbvSecondaryPositionNV,\n    EbvSecondaryViewportMaskNV,\n    EbvPositionPerViewNV,\n    EbvViewportMaskPerViewNV,\n    EbvFragFullyCoveredNV,\n    EbvFragmentSizeNV,\n    EbvInvocationsPerPixelNV,\n    // ray tracing\n    EbvLaunchId,\n    EbvLaunchSize,\n    EbvInstanceCustomIndex,\n    EbvGeometryIndex,\n    EbvWorldRayOrigin,\n    EbvWorldRayDirection,\n    EbvObjectRayOrigin,\n    EbvObjectRayDirection,\n    EbvRayTmin,\n    EbvRayTmax,\n    EbvCullMask,\n    EbvHitKind,\n    EbvObjectToWorld,\n    EbvObjectToWorld3x4,\n    EbvWorldToObject,\n    EbvWorldToObject3x4,\n    EbvIncomingRayFlags,\n    EbvCurrentRayTimeNV,\n    EbvClusterIDNV,\n    // barycentrics\n    EbvBaryCoordNV,\n    EbvBaryCoordNoPerspNV,\n    EbvBaryCoordEXT,\n    EbvBaryCoordNoPerspEXT,\n    // mesh shaders\n    EbvTaskCountNV,\n    EbvPrimitiveCountNV,\n    EbvPrimitiveIndicesNV,\n    EbvClipDistancePerViewNV,\n    EbvCullDistancePerViewNV,\n    EbvLayerPerViewNV,\n    EbvMeshViewCountNV,\n    EbvMeshViewIndicesNV,\n\n    EbvMicroTrianglePositionNV,\n    EbvMicroTriangleBaryNV,\n    EbvHitKindFrontFacingMicroTriangleNV,\n    EbvHitKindBackFacingMicroTriangleNV,\n\n    EbvHitIsSphereNV,\n    EbvHitIsLSSNV,\n    EbvHitSpherePositionNV,\n    EbvHitSphereRadiusNV,\n    EbvHitLSSPositionsNV,\n    EbvHitLSSRadiiNV,\n\n    //GL_EXT_mesh_shader\n    EbvPrimitivePointIndicesEXT,\n    EbvPrimitiveLineIndicesEXT,\n    EbvPrimitiveTriangleIndicesEXT,\n    EbvCullPrimitiveEXT,\n\n    // sm builtins\n    EbvWarpsPerSM,\n    EbvSMCount,\n    EbvWarpID,\n    EbvSMID,\n\n    // HLSL built-ins that live only temporarily, until they get remapped\n    // to one of the above.\n    EbvFragDepthGreater,\n    EbvFragDepthLesser,\n    EbvGsOutputStream,\n    EbvOutputPatch,\n    EbvInputPatch,\n\n    // structbuffer types\n    EbvAppendConsume, // no need to differentiate append and consume\n    EbvRWStructuredBuffer,\n    EbvStructuredBuffer,\n    EbvByteAddressBuffer,\n    EbvRWByteAddressBuffer,\n\n    // ARM specific core builtins\n    EbvCoreCountARM,\n    EbvCoreIDARM,\n    EbvCoreMaxIDARM,\n    EbvWarpIDARM,\n    EbvWarpMaxIDARM,\n\n    EbvPositionFetch,\n\n    // SPV_QCOM_tile_shading\n    EbvTileOffsetQCOM,\n    EbvTileDimensionQCOM,\n    EbvTileApronSizeQCOM,\n\n    EbvLast\n};\n\n// In this enum, order matters; users can assume higher precision is a bigger value\n// and EpqNone is 0.\nenum TPrecisionQualifier {\n    EpqNone = 0,\n    EpqLow,\n    EpqMedium,\n    EpqHigh\n};\n\n// These will show up in error messages\n__inline const char* GetStorageQualifierString(TStorageQualifier q)\n{\n    switch (q) {\n    case EvqTemporary:      return \"temp\";           break;\n    case EvqGlobal:         return \"global\";         break;\n    case EvqConst:          return \"const\";          break;\n    case EvqConstReadOnly:  return \"const (read only)\"; break;\n    case EvqSpirvStorageClass: return \"spirv_storage_class\"; break;\n    case EvqVaryingIn:      return \"in\";             break;\n    case EvqVaryingOut:     return \"out\";            break;\n    case EvqUniform:        return \"uniform\";        break;\n    case EvqBuffer:         return \"buffer\";         break;\n    case EvqShared:         return \"shared\";         break;\n    case EvqIn:             return \"in\";             break;\n    case EvqOut:            return \"out\";            break;\n    case EvqInOut:          return \"inout\";          break;\n    case EvqVertexId:       return \"gl_VertexId\";    break;\n    case EvqInstanceId:     return \"gl_InstanceId\";  break;\n    case EvqPosition:       return \"gl_Position\";    break;\n    case EvqPointSize:      return \"gl_PointSize\";   break;\n    case EvqClipVertex:     return \"gl_ClipVertex\";  break;\n    case EvqFace:           return \"gl_FrontFacing\"; break;\n    case EvqFragCoord:      return \"gl_FragCoord\";   break;\n    case EvqPointCoord:     return \"gl_PointCoord\";  break;\n    case EvqFragColor:      return \"fragColor\";      break;\n    case EvqFragDepth:      return \"gl_FragDepth\";   break;\n    case EvqFragStencil:    return \"gl_FragStencilRefARB\"; break;\n    case EvqPayload:        return \"rayPayloadNV\";     break;\n    case EvqPayloadIn:      return \"rayPayloadInNV\";   break;\n    case EvqHitAttr:        return \"hitAttributeNV\";   break;\n    case EvqCallableData:   return \"callableDataNV\";   break;\n    case EvqCallableDataIn: return \"callableDataInNV\"; break;\n    case EvqtaskPayloadSharedEXT: return \"taskPayloadSharedEXT\"; break;\n    case EvqHitObjectAttrNV:return \"hitObjectAttributeNV\"; break;\n    default:                return \"unknown qualifier\";\n    }\n}\n\n__inline const char* GetBuiltInVariableString(TBuiltInVariable v)\n{\n    switch (v) {\n    case EbvNone:                 return \"\";\n    case EbvNumWorkGroups:        return \"NumWorkGroups\";\n    case EbvWorkGroupSize:        return \"WorkGroupSize\";\n    case EbvWorkGroupId:          return \"WorkGroupID\";\n    case EbvLocalInvocationId:    return \"LocalInvocationID\";\n    case EbvGlobalInvocationId:   return \"GlobalInvocationID\";\n    case EbvLocalInvocationIndex: return \"LocalInvocationIndex\";\n    case EbvNumSubgroups:         return \"NumSubgroups\";\n    case EbvSubgroupID:           return \"SubgroupID\";\n    case EbvSubGroupSize:         return \"SubGroupSize\";\n    case EbvSubGroupInvocation:   return \"SubGroupInvocation\";\n    case EbvSubGroupEqMask:       return \"SubGroupEqMask\";\n    case EbvSubGroupGeMask:       return \"SubGroupGeMask\";\n    case EbvSubGroupGtMask:       return \"SubGroupGtMask\";\n    case EbvSubGroupLeMask:       return \"SubGroupLeMask\";\n    case EbvSubGroupLtMask:       return \"SubGroupLtMask\";\n    case EbvSubgroupSize2:        return \"SubgroupSize\";\n    case EbvSubgroupInvocation2:  return \"SubgroupInvocationID\";\n    case EbvSubgroupEqMask2:      return \"SubgroupEqMask\";\n    case EbvSubgroupGeMask2:      return \"SubgroupGeMask\";\n    case EbvSubgroupGtMask2:      return \"SubgroupGtMask\";\n    case EbvSubgroupLeMask2:      return \"SubgroupLeMask\";\n    case EbvSubgroupLtMask2:      return \"SubgroupLtMask\";\n    case EbvVertexId:             return \"VertexId\";\n    case EbvInstanceId:           return \"InstanceId\";\n    case EbvVertexIndex:          return \"VertexIndex\";\n    case EbvInstanceIndex:        return \"InstanceIndex\";\n    case EbvBaseVertex:           return \"BaseVertex\";\n    case EbvBaseInstance:         return \"BaseInstance\";\n    case EbvDrawId:               return \"DrawId\";\n    case EbvPosition:             return \"Position\";\n    case EbvPointSize:            return \"PointSize\";\n    case EbvClipVertex:           return \"ClipVertex\";\n    case EbvClipDistance:         return \"ClipDistance\";\n    case EbvCullDistance:         return \"CullDistance\";\n    case EbvNormal:               return \"Normal\";\n    case EbvVertex:               return \"Vertex\";\n    case EbvMultiTexCoord0:       return \"MultiTexCoord0\";\n    case EbvMultiTexCoord1:       return \"MultiTexCoord1\";\n    case EbvMultiTexCoord2:       return \"MultiTexCoord2\";\n    case EbvMultiTexCoord3:       return \"MultiTexCoord3\";\n    case EbvMultiTexCoord4:       return \"MultiTexCoord4\";\n    case EbvMultiTexCoord5:       return \"MultiTexCoord5\";\n    case EbvMultiTexCoord6:       return \"MultiTexCoord6\";\n    case EbvMultiTexCoord7:       return \"MultiTexCoord7\";\n    case EbvFrontColor:           return \"FrontColor\";\n    case EbvBackColor:            return \"BackColor\";\n    case EbvFrontSecondaryColor:  return \"FrontSecondaryColor\";\n    case EbvBackSecondaryColor:   return \"BackSecondaryColor\";\n    case EbvTexCoord:             return \"TexCoord\";\n    case EbvFogFragCoord:         return \"FogFragCoord\";\n    case EbvInvocationId:         return \"InvocationID\";\n    case EbvPrimitiveId:          return \"PrimitiveID\";\n    case EbvLayer:                return \"Layer\";\n    case EbvViewportIndex:        return \"ViewportIndex\";\n    case EbvPatchVertices:        return \"PatchVertices\";\n    case EbvTessLevelOuter:       return \"TessLevelOuter\";\n    case EbvTessLevelInner:       return \"TessLevelInner\";\n    case EbvBoundingBox:          return \"BoundingBox\";\n    case EbvTessCoord:            return \"TessCoord\";\n    case EbvColor:                return \"Color\";\n    case EbvSecondaryColor:       return \"SecondaryColor\";\n    case EbvFace:                 return \"Face\";\n    case EbvFragCoord:            return \"FragCoord\";\n    case EbvPointCoord:           return \"PointCoord\";\n    case EbvFragColor:            return \"FragColor\";\n    case EbvFragData:             return \"FragData\";\n    case EbvFragDepth:            return \"FragDepth\";\n    case EbvFragStencilRef:       return \"FragStencilRef\";\n    case EbvSampleId:             return \"SampleId\";\n    case EbvSamplePosition:       return \"SamplePosition\";\n    case EbvSampleMask:           return \"SampleMaskIn\";\n    case EbvHelperInvocation:     return \"HelperInvocation\";\n\n    case EbvBaryCoordNoPersp:           return \"BaryCoordNoPersp\";\n    case EbvBaryCoordNoPerspCentroid:   return \"BaryCoordNoPerspCentroid\";\n    case EbvBaryCoordNoPerspSample:     return \"BaryCoordNoPerspSample\";\n    case EbvBaryCoordSmooth:            return \"BaryCoordSmooth\";\n    case EbvBaryCoordSmoothCentroid:    return \"BaryCoordSmoothCentroid\";\n    case EbvBaryCoordSmoothSample:      return \"BaryCoordSmoothSample\";\n    case EbvBaryCoordPullModel:         return \"BaryCoordPullModel\";\n\n    case EbvViewIndex:                  return \"ViewIndex\";\n    case EbvDeviceIndex:                return \"DeviceIndex\";\n\n    case EbvFragSizeEXT:                return \"FragSizeEXT\";\n    case EbvFragInvocationCountEXT:     return \"FragInvocationCountEXT\";\n\n    case EbvSecondaryFragDataEXT:       return \"SecondaryFragDataEXT\";\n    case EbvSecondaryFragColorEXT:      return \"SecondaryFragColorEXT\";\n\n    case EbvViewportMaskNV:             return \"ViewportMaskNV\";\n    case EbvSecondaryPositionNV:        return \"SecondaryPositionNV\";\n    case EbvSecondaryViewportMaskNV:    return \"SecondaryViewportMaskNV\";\n    case EbvPositionPerViewNV:          return \"PositionPerViewNV\";\n    case EbvViewportMaskPerViewNV:      return \"ViewportMaskPerViewNV\";\n    case EbvFragFullyCoveredNV:         return \"FragFullyCoveredNV\";\n    case EbvFragmentSizeNV:             return \"FragmentSizeNV\";\n    case EbvInvocationsPerPixelNV:      return \"InvocationsPerPixelNV\";\n    case EbvLaunchId:                   return \"LaunchIdNV\";\n    case EbvLaunchSize:                 return \"LaunchSizeNV\";\n    case EbvInstanceCustomIndex:        return \"InstanceCustomIndexNV\";\n    case EbvGeometryIndex:              return \"GeometryIndexEXT\";\n    case EbvWorldRayOrigin:             return \"WorldRayOriginNV\";\n    case EbvWorldRayDirection:          return \"WorldRayDirectionNV\";\n    case EbvObjectRayOrigin:            return \"ObjectRayOriginNV\";\n    case EbvObjectRayDirection:         return \"ObjectRayDirectionNV\";\n    case EbvRayTmin:                    return \"ObjectRayTminNV\";\n    case EbvRayTmax:                    return \"ObjectRayTmaxNV\";\n    case EbvHitKind:                    return \"HitKindNV\";\n    case EbvIncomingRayFlags:           return \"IncomingRayFlagsNV\";\n    case EbvObjectToWorld:              return \"ObjectToWorldNV\";\n    case EbvWorldToObject:              return \"WorldToObjectNV\";\n    case EbvCurrentRayTimeNV:           return \"CurrentRayTimeNV\";\n    case EbvClusterIDNV:                return \"ClusterIDNV\";\n\n    case EbvBaryCoordEXT:\n    case EbvBaryCoordNV:                return \"BaryCoordKHR\";\n    case EbvBaryCoordNoPerspEXT:\n    case EbvBaryCoordNoPerspNV:         return \"BaryCoordNoPerspKHR\";\n\n    case EbvTaskCountNV:                return \"TaskCountNV\";\n    case EbvPrimitiveCountNV:           return \"PrimitiveCountNV\";\n    case EbvPrimitiveIndicesNV:         return \"PrimitiveIndicesNV\";\n    case EbvClipDistancePerViewNV:      return \"ClipDistancePerViewNV\";\n    case EbvCullDistancePerViewNV:      return \"CullDistancePerViewNV\";\n    case EbvLayerPerViewNV:             return \"LayerPerViewNV\";\n    case EbvMeshViewCountNV:            return \"MeshViewCountNV\";\n    case EbvMeshViewIndicesNV:          return \"MeshViewIndicesNV\";\n    // GL_EXT_mesh_shader\n    case EbvPrimitivePointIndicesEXT:    return \"PrimitivePointIndicesEXT\";\n    case EbvPrimitiveLineIndicesEXT:     return \"PrimitiveLineIndicesEXT\";\n    case EbvPrimitiveTriangleIndicesEXT: return \"PrimitiveTriangleIndicesEXT\";\n    case EbvCullPrimitiveEXT:            return \"CullPrimitiveEXT\";\n\n    case EbvWarpsPerSM:                 return \"WarpsPerSMNV\";\n    case EbvSMCount:                    return \"SMCountNV\";\n    case EbvWarpID:                     return \"WarpIDNV\";\n    case EbvSMID:                       return \"SMIDNV\";\n\n    case EbvShadingRateKHR:             return \"ShadingRateKHR\";\n    case EbvPrimitiveShadingRateKHR:    return \"PrimitiveShadingRateKHR\";\n\n    case EbvHitKindFrontFacingMicroTriangleNV: return \"HitKindFrontFacingMicroTriangleNV\";\n    case EbvHitKindBackFacingMicroTriangleNV:  return \"HitKindBackFacingMicroTriangleNV\";\n\n    case EbvHitIsSphereNV:              return \"HitIsSphereNV\";\n    case EbvHitIsLSSNV:                 return \"HitIsLSSNV\";\n    case EbvHitSpherePositionNV:        return \"HitSpherePositionNV\";\n    case EbvHitSphereRadiusNV:          return \"HitSphereRadiusNV\";\n    case EbvHitLSSPositionsNV:          return \"HitSpherePositionsNV\";\n    case EbvHitLSSRadiiNV:              return \"HitLSSRadiiNV\";\n\n    default:                      return \"unknown built-in variable\";\n    }\n}\n\n__inline const char* GetPrecisionQualifierString(TPrecisionQualifier p)\n{\n    switch (p) {\n    case EpqNone:   return \"\";        break;\n    case EpqLow:    return \"lowp\";    break;\n    case EpqMedium: return \"mediump\"; break;\n    case EpqHigh:   return \"highp\";   break;\n    default:        return \"unknown precision qualifier\";\n    }\n}\n\n__inline bool isTypeSignedInt(TBasicType type)\n{\n    switch (type) {\n    case EbtInt8:\n    case EbtInt16:\n    case EbtInt:\n    case EbtInt64:\n        return true;\n    default:\n        return false;\n    }\n}\n\n__inline bool isTypeUnsignedInt(TBasicType type)\n{\n    switch (type) {\n    case EbtUint8:\n    case EbtUint16:\n    case EbtUint:\n    case EbtUint64:\n        return true;\n    default:\n        return false;\n    }\n}\n\n__inline bool isTypeInt(TBasicType type)\n{\n    return isTypeSignedInt(type) || isTypeUnsignedInt(type);\n}\n\n__inline bool isTypeFloat(TBasicType type)\n{\n    switch (type) {\n    case EbtFloat:\n    case EbtDouble:\n    case EbtFloat16:\n    case EbtBFloat16:\n    case EbtFloatE5M2:\n    case EbtFloatE4M3:\n        return true;\n    default:\n        return false;\n    }\n}\n\n__inline uint32_t GetNumBits(TBasicType type)\n{\n    switch (type) {\n    case EbtInt8:\n    case EbtUint8:\n    case EbtFloatE5M2:\n    case EbtFloatE4M3:\n        return 8;\n    case EbtBFloat16:\n    case EbtFloat16:\n    case EbtInt16:\n    case EbtUint16:\n        return 16;\n    case EbtInt:\n    case EbtUint:\n    case EbtFloat:\n        return 32;\n    case EbtDouble:\n    case EbtInt64:\n    case EbtUint64:\n        return 64;\n    default:\n        assert(false);\n        return 0;\n    }\n}\n\n__inline int getTypeRank(TBasicType type)\n{\n    int res = -1;\n    switch(type) {\n    case EbtInt8:\n    case EbtUint8:\n        res = 0;\n        break;\n    case EbtInt16:\n    case EbtUint16:\n        res = 1;\n        break;\n    case EbtInt:\n    case EbtUint:\n        res = 2;\n        break;\n    case EbtInt64:\n    case EbtUint64:\n        res = 3;\n        break;\n    default:\n        assert(false);\n        break;\n    }\n    return res;\n}\n\n} // end namespace glslang\n\n#endif // _BASICTYPES_INCLUDED_\n"
  },
  {
    "path": "src/libraries/glslang/glslang/Include/Common.h",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2012-2013 LunarG, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#ifndef _COMMON_INCLUDED_\n#define _COMMON_INCLUDED_\n\n#include <algorithm>\n#include <cassert>\n#ifdef _MSC_VER\n#include <cfloat>\n#else\n#include <cmath>\n#endif\n#include <cstdint>\n#include <cstdio>\n#include <cstdlib>\n#include <list>\n#include <map>\n#include <set>\n#include <string>\n#include <unordered_map>\n#include <unordered_set>\n#include <vector>\n\n#if defined(__ANDROID__)\n#include <sstream>\nnamespace std {\ntemplate<typename T>\nstd::string to_string(const T& val) {\n  std::ostringstream os;\n  os << val;\n  return os.str();\n}\n}\n#endif\n\n#if defined(MINGW_HAS_SECURE_API) && MINGW_HAS_SECURE_API\n    #include <basetsd.h>\n    #ifndef snprintf\n    #define snprintf sprintf_s\n    #endif\n    #define safe_vsprintf(buf,max,format,args) vsnprintf_s((buf), (max), (max), (format), (args))\n#elif defined (solaris)\n    #define safe_vsprintf(buf,max,format,args) vsnprintf((buf), (max), (format), (args))\n    #include <sys/int_types.h>\n    #define UINT_PTR uintptr_t\n#else\n    #define safe_vsprintf(buf,max,format,args) vsnprintf((buf), (max), (format), (args))\n    #include <stdint.h>\n    #define UINT_PTR uintptr_t\n#endif\n\n#if defined(_MSC_VER)\n#define strdup _strdup\n#endif\n\n/* windows only pragma */\n#ifdef _MSC_VER\n    #pragma warning(disable : 4786) // Don't warn about too long identifiers\n    #pragma warning(disable : 4514) // unused inline method\n    #pragma warning(disable : 4201) // nameless union\n#endif\n\n// Allow compilation to WASI which does not support threads yet.\n#ifdef __wasi__ \n#define DISABLE_THREAD_SUPPORT\n#endif\n\n#include \"PoolAlloc.h\"\n\n//\n// Put POOL_ALLOCATOR_NEW_DELETE in base classes to make them use this scheme.\n//\n#define POOL_ALLOCATOR_NEW_DELETE(A)                                  \\\n    void* operator new(size_t s) { return (A).allocate(s); }          \\\n    void* operator new(size_t, void *_Where) { return (_Where); }     \\\n    void operator delete(void*) { }                                   \\\n    void operator delete(void *, void *) { }                          \\\n    void* operator new[](size_t s) { return (A).allocate(s); }        \\\n    void* operator new[](size_t, void *_Where) { return (_Where); }   \\\n    void operator delete[](void*) { }                                 \\\n    void operator delete[](void *, void *) { }\n\nnamespace glslang {\n\n    //\n    // Pool version of string.\n    //\n    typedef pool_allocator<char> TStringAllocator;\n    typedef std::basic_string <char, std::char_traits<char>, TStringAllocator> TString;\n\n} // end namespace glslang\n\n// Repackage the std::hash for use by unordered map/set with a TString key.\nnamespace std {\n\n    template<> struct hash<glslang::TString> {\n        std::size_t operator()(const glslang::TString& s) const\n        {\n            const unsigned _FNV_offset_basis = 2166136261U;\n            const unsigned _FNV_prime = 16777619U;\n            unsigned _Val = _FNV_offset_basis;\n            size_t _Count = s.size();\n            const char* _First = s.c_str();\n            for (size_t _Next = 0; _Next < _Count; ++_Next)\n            {\n                _Val ^= (unsigned)_First[_Next];\n                _Val *= _FNV_prime;\n            }\n\n            return _Val;\n        }\n    };\n}\n\nnamespace glslang {\n\ninline TString* NewPoolTString(const char* s)\n{\n    void* memory = GetThreadPoolAllocator().allocate(sizeof(TString));\n    return new(memory) TString(s);\n}\n\ntemplate<class T> inline T* NewPoolObject(T*)\n{\n    return new(GetThreadPoolAllocator().allocate(sizeof(T))) T;\n}\n\ntemplate<class T> inline T* NewPoolObject(T, int instances)\n{\n    return new(GetThreadPoolAllocator().allocate(instances * sizeof(T))) T[instances];\n}\n\ninline bool StartsWith(TString const &str, const char *prefix)\n{\n    return str.compare(0, strlen(prefix), prefix) == 0;\n}\n\n//\n// Pool allocator versions of vectors, lists, and maps\n//\ntemplate <class T> class TVector : public std::vector<T, pool_allocator<T> > {\npublic:\n    POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())\n\n    typedef typename std::vector<T, pool_allocator<T> >::size_type size_type;\n    TVector() : std::vector<T, pool_allocator<T> >() {}\n    TVector(const pool_allocator<T>& a) : std::vector<T, pool_allocator<T> >(a) {}\n    TVector(size_type i) : std::vector<T, pool_allocator<T> >(i) {}\n    TVector(size_type i, const T& val) : std::vector<T, pool_allocator<T> >(i, val) {}\n};\n\ntemplate <class T> class TList  : public std::list<T, pool_allocator<T> > {\n};\n\ntemplate <class K, class D, class CMP = std::less<K> >\nclass TMap : public std::map<K, D, CMP, pool_allocator<std::pair<K const, D> > > {\n};\n\ntemplate <class K, class D, class HASH = std::hash<K>, class PRED = std::equal_to<K> >\nclass TUnorderedMap : public std::unordered_map<K, D, HASH, PRED, pool_allocator<std::pair<K const, D> > > {\n};\n\ntemplate <class K, class CMP = std::less<K> >\nclass TSet : public std::set<K, CMP, pool_allocator<K> > {\n};\n\n//\n// Persistent string memory.  Should only be used for strings that survive\n// across compiles/links.\n//\ntypedef std::basic_string<char> TPersistString;\n\n//\n// templatized min and max functions.\n//\ntemplate <class T> T Min(const T a, const T b) { return a < b ? a : b; }\ntemplate <class T> T Max(const T a, const T b) { return a > b ? a : b; }\n\n//\n// Create a TString object from an integer.\n//\n#if defined(_MSC_VER) || (defined(MINGW_HAS_SECURE_API) && MINGW_HAS_SECURE_API)\ninline const TString String(const int i, const int base = 10)\n{\n    char text[16];     // 32 bit ints are at most 10 digits in base 10\n    _itoa_s(i, text, sizeof(text), base);\n    return text;\n}\n#else\ninline const TString String(const int i, const int /*base*/ = 10)\n{\n    char text[16];     // 32 bit ints are at most 10 digits in base 10\n\n    // we assume base 10 for all cases\n    snprintf(text, sizeof(text), \"%d\", i);\n\n    return text;\n}\n#endif\n\nstruct TSourceLoc {\n    void init()\n    {\n        name = nullptr; string = 0; line = 0; column = 0;\n    }\n    void init(int stringNum) { init(); string = stringNum; }\n    // Returns the name if it exists. Otherwise, returns the string number.\n    std::string getStringNameOrNum(bool quoteStringName = true) const\n    {\n        if (name != nullptr) {\n            TString qstr = quoteStringName ? (\"\\\"\" + *name + \"\\\"\") : *name;\n            std::string ret_str(qstr.c_str());\n            return ret_str;\n        }\n        return std::to_string((long long)string);\n    }\n    const char* getFilename() const\n    {\n        if (name == nullptr)\n            return nullptr;\n        return name->c_str();\n    }\n    const char* getFilenameStr() const { return name == nullptr ? \"\" : name->c_str(); }\n    TString* name; // descriptive name for this string, when a textual name is available, otherwise nullptr\n    int string;\n    int line;\n    int column;\n};\n\nclass TPragmaTable : public TMap<TString, TString> {\npublic:\n    POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())\n};\n\nconst int MaxTokenLength = 1024;\n\ntemplate <class T> bool IsPow2(T powerOf2)\n{\n    if (powerOf2 <= 0)\n        return false;\n\n    return (powerOf2 & (powerOf2 - 1)) == 0;\n}\n\n// Round number up to a multiple of the given powerOf2, which is not\n// a power, just a number that must be a power of 2.\ntemplate <class T> void RoundToPow2(T& number, int powerOf2)\n{\n    assert(IsPow2(powerOf2));\n    number = (number + powerOf2 - 1) & ~(powerOf2 - 1);\n}\n\ntemplate <class T> bool IsMultipleOfPow2(T number, int powerOf2)\n{\n    assert(IsPow2(powerOf2));\n    return ! (number & (powerOf2 - 1));\n}\n\n// Returns log2 of an integer power of 2.\n// T should be integral.\ntemplate <class T> int IntLog2(T n)\n{\n    assert(IsPow2(n));\n    int result = 0;\n    while ((T(1) << result) != n) {\n      result++;\n    }\n    return result;\n}\n\n} // end namespace glslang\n\n#endif // _COMMON_INCLUDED_\n"
  },
  {
    "path": "src/libraries/glslang/glslang/Include/ConstantUnion.h",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2013 LunarG, Inc.\n// Copyright (C) 2017 ARM Limited.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#ifndef _CONSTANT_UNION_INCLUDED_\n#define _CONSTANT_UNION_INCLUDED_\n\n#include \"../Include/Common.h\"\n#include \"../Include/BaseTypes.h\"\n\nnamespace glslang {\n\nclass TConstUnion {\npublic:\n    POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())\n\n    TConstUnion() : iConst(0), type(EbtInt) { }\n\n    void setI8Const(signed char i)\n    {\n       i8Const = i;\n       type = EbtInt8;\n    }\n\n    void setU8Const(unsigned char u)\n    {\n       u8Const = u;\n       type = EbtUint8;\n    }\n\n    void setI16Const(signed short i)\n    {\n       i16Const = i;\n       type = EbtInt16;\n    }\n\n    void setU16Const(unsigned short u)\n    {\n       u16Const = u;\n       type = EbtUint16;\n    }\n\n    void setIConst(int i)\n    {\n        iConst = i;\n        type = EbtInt;\n    }\n\n    void setUConst(unsigned int u)\n    {\n        uConst = u;\n        type = EbtUint;\n    }\n\n    void setI64Const(long long i64)\n    {\n        i64Const = i64;\n        type = EbtInt64;\n    }\n\n    void setU64Const(unsigned long long u64)\n    {\n        u64Const = u64;\n        type = EbtUint64;\n    }\n\n    void setDConst(double d)\n    {\n        dConst = d;\n        type = EbtDouble;\n    }\n\n    void setBConst(bool b)\n    {\n        bConst = b;\n        type = EbtBool;\n    }\n\n    void setSConst(const TString* s)\n    {\n        sConst = s;\n        type = EbtString;\n    }\n\n    signed char        getI8Const() const  { return i8Const; }\n    unsigned char      getU8Const() const  { return u8Const; }\n    signed short       getI16Const() const { return i16Const; }\n    unsigned short     getU16Const() const { return u16Const; }\n    int                getIConst() const   { return iConst; }\n    unsigned int       getUConst() const   { return uConst; }\n    long long          getI64Const() const { return i64Const; }\n    unsigned long long getU64Const() const { return u64Const; }\n    double             getDConst() const   { return dConst; }\n    bool               getBConst() const   { return bConst; }\n    const TString*     getSConst() const   { return sConst; }\n\n    bool operator==(const signed char i) const\n    {\n        if (i == i8Const)\n            return true;\n\n        return false;\n    }\n\n    bool operator==(const unsigned char u) const\n    {\n        if (u == u8Const)\n            return true;\n\n        return false;\n    }\n\n   bool operator==(const signed short i) const\n    {\n        if (i == i16Const)\n            return true;\n\n        return false;\n    }\n\n    bool operator==(const unsigned short u) const\n    {\n        if (u == u16Const)\n            return true;\n\n        return false;\n    }\n\n    bool operator==(const int i) const\n    {\n        if (i == iConst)\n            return true;\n\n        return false;\n    }\n\n    bool operator==(const unsigned int u) const\n    {\n        if (u == uConst)\n            return true;\n\n        return false;\n    }\n\n    bool operator==(const long long i64) const\n    {\n        if (i64 == i64Const)\n            return true;\n\n        return false;\n    }\n\n    bool operator==(const unsigned long long u64) const\n    {\n        if (u64 == u64Const)\n            return true;\n\n        return false;\n    }\n\n    bool operator==(const double d) const\n    {\n        if (d == dConst)\n            return true;\n\n        return false;\n    }\n\n    bool operator==(const bool b) const\n    {\n        if (b == bConst)\n            return true;\n\n        return false;\n    }\n\n    bool operator==(const TConstUnion& constant) const\n    {\n        if (constant.type != type)\n            return false;\n\n        switch (type) {\n        case EbtInt:\n            if (constant.iConst == iConst)\n                return true;\n\n            break;\n        case EbtUint:\n            if (constant.uConst == uConst)\n                return true;\n\n            break;\n        case EbtBool:\n            if (constant.bConst == bConst)\n                return true;\n\n            break;\n        case EbtDouble:\n            if (constant.dConst == dConst)\n                return true;\n\n            break;\n\n        case EbtInt16:\n            if (constant.i16Const == i16Const)\n                return true;\n\n            break;\n         case EbtUint16:\n            if (constant.u16Const == u16Const)\n                return true;\n\n            break;\n        case EbtInt8:\n            if (constant.i8Const == i8Const)\n                return true;\n\n            break;\n         case EbtUint8:\n            if (constant.u8Const == u8Const)\n                return true;\n\n            break;\n        case EbtInt64:\n            if (constant.i64Const == i64Const)\n                return true;\n\n            break;\n        case EbtUint64:\n            if (constant.u64Const == u64Const)\n                return true;\n\n            break;\n        default:\n            assert(false && \"Default missing\");\n        }\n\n        return false;\n    }\n\n    bool operator!=(const signed char i) const\n    {\n        return !operator==(i);\n    }\n\n    bool operator!=(const unsigned char u) const\n    {\n        return !operator==(u);\n    }\n\n    bool operator!=(const signed short i) const\n    {\n        return !operator==(i);\n    }\n\n    bool operator!=(const unsigned short u) const\n    {\n        return !operator==(u);\n    }\n\n    bool operator!=(const int i) const\n    {\n        return !operator==(i);\n    }\n\n    bool operator!=(const unsigned int u) const\n    {\n        return !operator==(u);\n    }\n\n    bool operator!=(const long long i) const\n    {\n        return !operator==(i);\n    }\n\n    bool operator!=(const unsigned long long u) const\n    {\n        return !operator==(u);\n    }\n\n    bool operator!=(const float f) const\n    {\n        return !operator==(f);\n    }\n\n    bool operator!=(const bool b) const\n    {\n        return !operator==(b);\n    }\n\n    bool operator!=(const TConstUnion& constant) const\n    {\n        return !operator==(constant);\n    }\n\n    bool operator>(const TConstUnion& constant) const\n    {\n        assert(type == constant.type);\n        switch (type) {\n        case EbtInt:\n            if (iConst > constant.iConst)\n                return true;\n\n            return false;\n        case EbtUint:\n            if (uConst > constant.uConst)\n                return true;\n\n            return false;\n        case EbtDouble:\n            if (dConst > constant.dConst)\n                return true;\n\n            return false;\n        case EbtInt8:\n            if (i8Const > constant.i8Const)\n                return true;\n\n            return false;\n        case EbtUint8:\n            if (u8Const > constant.u8Const)\n                return true;\n\n            return false;\n        case EbtInt16:\n            if (i16Const > constant.i16Const)\n                return true;\n\n            return false;\n        case EbtUint16:\n            if (u16Const > constant.u16Const)\n                return true;\n\n            return false;\n        case EbtInt64:\n            if (i64Const > constant.i64Const)\n                return true;\n\n            return false;\n        case EbtUint64:\n            if (u64Const > constant.u64Const)\n                return true;\n\n            return false;\n        default:\n            assert(false && \"Default missing\");\n            return false;\n        }\n    }\n\n    bool operator<(const TConstUnion& constant) const\n    {\n        assert(type == constant.type);\n        switch (type) {\n        case EbtInt8:\n            if (i8Const < constant.i8Const)\n                return true;\n\n            return false;\n        case EbtUint8:\n            if (u8Const < constant.u8Const)\n                return true;\n\n            return false;\n        case EbtInt16:\n            if (i16Const < constant.i16Const)\n                return true;\n\n            return false;\n        case EbtUint16:\n            if (u16Const < constant.u16Const)\n                return true;\n            return false;\n        case EbtInt64:\n            if (i64Const < constant.i64Const)\n                return true;\n\n            return false;\n        case EbtUint64:\n            if (u64Const < constant.u64Const)\n                return true;\n\n            return false;\n        case EbtDouble:\n            if (dConst < constant.dConst)\n                return true;\n\n            return false;\n        case EbtInt:\n            if (iConst < constant.iConst)\n                return true;\n\n            return false;\n        case EbtUint:\n            if (uConst < constant.uConst)\n                return true;\n\n            return false;\n        default:\n            assert(false && \"Default missing\");\n            return false;\n        }\n    }\n\n    TConstUnion operator+(const TConstUnion& constant) const\n    {\n        TConstUnion returnValue;\n        assert(type == constant.type);\n        switch (type) {\n        case EbtInt:    returnValue.setIConst(iConst + constant.iConst); break;\n        case EbtUint:   returnValue.setUConst(uConst + constant.uConst); break;\n        case EbtDouble: returnValue.setDConst(dConst + constant.dConst); break;\n        case EbtInt8:   returnValue.setI8Const(i8Const + constant.i8Const); break;\n        case EbtInt16:  returnValue.setI16Const(i16Const + constant.i16Const); break;\n        case EbtInt64:  returnValue.setI64Const(i64Const + constant.i64Const); break;\n        case EbtUint8:  returnValue.setU8Const(u8Const + constant.u8Const); break;\n        case EbtUint16: returnValue.setU16Const(u16Const + constant.u16Const); break;\n        case EbtUint64: returnValue.setU64Const(u64Const + constant.u64Const); break;\n        default: assert(false && \"Default missing\");\n        }\n\n        return returnValue;\n    }\n\n    TConstUnion operator-(const TConstUnion& constant) const\n    {\n        TConstUnion returnValue;\n        assert(type == constant.type);\n        switch (type) {\n        case EbtInt:    returnValue.setIConst(iConst - constant.iConst); break;\n        case EbtUint:   returnValue.setUConst(uConst - constant.uConst); break;\n        case EbtDouble: returnValue.setDConst(dConst - constant.dConst); break;\n        case EbtInt8:   returnValue.setI8Const(i8Const - constant.i8Const); break;\n        case EbtInt16:  returnValue.setI16Const(i16Const - constant.i16Const); break;\n        case EbtInt64:  returnValue.setI64Const(i64Const - constant.i64Const); break;\n        case EbtUint8:  returnValue.setU8Const(u8Const - constant.u8Const); break;\n        case EbtUint16: returnValue.setU16Const(u16Const - constant.u16Const); break;\n        case EbtUint64: returnValue.setU64Const(u64Const - constant.u64Const); break;\n        default: assert(false && \"Default missing\");\n        }\n\n        return returnValue;\n    }\n\n    TConstUnion operator*(const TConstUnion& constant) const\n    {\n        TConstUnion returnValue;\n        assert(type == constant.type);\n        switch (type) {\n        case EbtInt:    returnValue.setIConst(iConst * constant.iConst); break;\n        case EbtUint:   returnValue.setUConst(uConst * constant.uConst); break;\n        case EbtDouble: returnValue.setDConst(dConst * constant.dConst); break;\n        case EbtInt8:   returnValue.setI8Const(i8Const * constant.i8Const); break;\n        case EbtInt16:  returnValue.setI16Const(i16Const * constant.i16Const); break;\n        case EbtInt64:  returnValue.setI64Const(i64Const * constant.i64Const); break;\n        case EbtUint8:  returnValue.setU8Const(u8Const * constant.u8Const); break;\n        case EbtUint16: returnValue.setU16Const(u16Const * constant.u16Const); break;\n        case EbtUint64: returnValue.setU64Const(u64Const * constant.u64Const); break;\n        default: assert(false && \"Default missing\");\n        }\n\n        return returnValue;\n    }\n\n    TConstUnion operator%(const TConstUnion& constant) const\n    {\n        TConstUnion returnValue;\n        assert(type == constant.type);\n        switch (type) {\n        case EbtInt:    returnValue.setIConst(iConst % constant.iConst); break;\n        case EbtUint:   returnValue.setUConst(uConst % constant.uConst); break;\n        case EbtInt8:   returnValue.setI8Const(i8Const % constant.i8Const); break;\n        case EbtInt16:  returnValue.setI16Const(i16Const % constant.i16Const); break;\n        case EbtInt64:  returnValue.setI64Const(i64Const % constant.i64Const); break;\n        case EbtUint8:  returnValue.setU8Const(u8Const % constant.u8Const); break;\n        case EbtUint16: returnValue.setU16Const(u16Const % constant.u16Const); break;\n        case EbtUint64: returnValue.setU64Const(u64Const % constant.u64Const); break;\n        default:     assert(false && \"Default missing\");\n        }\n\n        return returnValue;\n    }\n\n    TConstUnion operator>>(const TConstUnion& constant) const\n    {\n        TConstUnion returnValue;\n        switch (type) {\n        case EbtInt8:\n            switch (constant.type) {\n            case EbtInt8:   returnValue.setI8Const(i8Const >> constant.i8Const);  break;\n            case EbtUint8:  returnValue.setI8Const(i8Const >> constant.u8Const);  break;\n            case EbtInt16:  returnValue.setI8Const(i8Const >> constant.i16Const); break;\n            case EbtUint16: returnValue.setI8Const(i8Const >> constant.u16Const); break;\n            case EbtInt:    returnValue.setI8Const(i8Const >> constant.iConst);   break;\n            case EbtUint:   returnValue.setI8Const(i8Const >> constant.uConst);   break;\n            case EbtInt64:  returnValue.setI8Const(i8Const >> constant.i64Const); break;\n            case EbtUint64: returnValue.setI8Const(i8Const >> constant.u64Const); break;\n            default:       assert(false && \"Default missing\");\n            }\n            break;\n        case EbtUint8:\n            switch (constant.type) {\n            case EbtInt8:   returnValue.setU8Const(u8Const >> constant.i8Const);  break;\n            case EbtUint8:  returnValue.setU8Const(u8Const >> constant.u8Const);  break;\n            case EbtInt16:  returnValue.setU8Const(u8Const >> constant.i16Const); break;\n            case EbtUint16: returnValue.setU8Const(u8Const >> constant.u16Const); break;\n            case EbtInt:    returnValue.setU8Const(u8Const >> constant.iConst);   break;\n            case EbtUint:   returnValue.setU8Const(u8Const >> constant.uConst);   break;\n            case EbtInt64:  returnValue.setU8Const(u8Const >> constant.i64Const); break;\n            case EbtUint64: returnValue.setU8Const(u8Const >> constant.u64Const); break;\n            default:       assert(false && \"Default missing\");\n            }\n            break;\n        case EbtInt16:\n            switch (constant.type) {\n            case EbtInt8:   returnValue.setI16Const(i16Const >> constant.i8Const);  break;\n            case EbtUint8:  returnValue.setI16Const(i16Const >> constant.u8Const);  break;\n            case EbtInt16:  returnValue.setI16Const(i16Const >> constant.i16Const); break;\n            case EbtUint16: returnValue.setI16Const(i16Const >> constant.u16Const); break;\n            case EbtInt:    returnValue.setI16Const(i16Const >> constant.iConst);   break;\n            case EbtUint:   returnValue.setI16Const(i16Const >> constant.uConst);   break;\n            case EbtInt64:  returnValue.setI16Const(i16Const >> constant.i64Const); break;\n            case EbtUint64: returnValue.setI16Const(i16Const >> constant.u64Const); break;\n            default:       assert(false && \"Default missing\");\n            }\n            break;\n        case EbtUint16:\n            switch (constant.type) {\n            case EbtInt8:   returnValue.setU16Const(u16Const >> constant.i8Const);  break;\n            case EbtUint8:  returnValue.setU16Const(u16Const >> constant.u8Const);  break;\n            case EbtInt16:  returnValue.setU16Const(u16Const >> constant.i16Const); break;\n            case EbtUint16: returnValue.setU16Const(u16Const >> constant.u16Const); break;\n            case EbtInt:    returnValue.setU16Const(u16Const >> constant.iConst);   break;\n            case EbtUint:   returnValue.setU16Const(u16Const >> constant.uConst);   break;\n            case EbtInt64:  returnValue.setU16Const(u16Const >> constant.i64Const); break;\n            case EbtUint64: returnValue.setU16Const(u16Const >> constant.u64Const); break;\n            default:       assert(false && \"Default missing\");\n            }\n            break;\n        case EbtInt:\n            switch (constant.type) {\n            case EbtInt:    returnValue.setIConst(iConst >> constant.iConst);   break;\n            case EbtUint:   returnValue.setIConst(iConst >> constant.uConst);   break;\n            case EbtInt8:   returnValue.setIConst(iConst >> constant.i8Const);  break;\n            case EbtUint8:  returnValue.setIConst(iConst >> constant.u8Const);  break;\n            case EbtInt16:  returnValue.setIConst(iConst >> constant.i16Const); break;\n            case EbtUint16: returnValue.setIConst(iConst >> constant.u16Const); break;\n            case EbtInt64:  returnValue.setIConst(iConst >> constant.i64Const); break;\n            case EbtUint64: returnValue.setIConst(iConst >> constant.u64Const); break;\n            default:       assert(false && \"Default missing\");\n            }\n            break;\n        case EbtUint:\n            switch (constant.type) {\n            case EbtInt:    returnValue.setUConst(uConst >> constant.iConst);   break;\n            case EbtUint:   returnValue.setUConst(uConst >> constant.uConst);   break;\n            case EbtInt8:   returnValue.setUConst(uConst >> constant.i8Const);  break;\n            case EbtUint8:  returnValue.setUConst(uConst >> constant.u8Const);  break;\n            case EbtInt16:  returnValue.setUConst(uConst >> constant.i16Const); break;\n            case EbtUint16: returnValue.setUConst(uConst >> constant.u16Const); break;\n            case EbtInt64:  returnValue.setUConst(uConst >> constant.i64Const); break;\n            case EbtUint64: returnValue.setUConst(uConst >> constant.u64Const); break;\n            default:       assert(false && \"Default missing\");\n            }\n            break;\n         case EbtInt64:\n            switch (constant.type) {\n            case EbtInt8:   returnValue.setI64Const(i64Const >> constant.i8Const);  break;\n            case EbtUint8:  returnValue.setI64Const(i64Const >> constant.u8Const);  break;\n            case EbtInt16:  returnValue.setI64Const(i64Const >> constant.i16Const); break;\n            case EbtUint16: returnValue.setI64Const(i64Const >> constant.u16Const); break;\n            case EbtInt:    returnValue.setI64Const(i64Const >> constant.iConst);   break;\n            case EbtUint:   returnValue.setI64Const(i64Const >> constant.uConst);   break;\n            case EbtInt64:  returnValue.setI64Const(i64Const >> constant.i64Const); break;\n            case EbtUint64: returnValue.setI64Const(i64Const >> constant.u64Const); break;\n            default:       assert(false && \"Default missing\");\n            }\n            break;\n        case EbtUint64:\n            switch (constant.type) {\n            case EbtInt8:   returnValue.setU64Const(u64Const >> constant.i8Const);  break;\n            case EbtUint8:  returnValue.setU64Const(u64Const >> constant.u8Const);  break;\n            case EbtInt16:  returnValue.setU64Const(u64Const >> constant.i16Const); break;\n            case EbtUint16: returnValue.setU64Const(u64Const >> constant.u16Const); break;\n            case EbtInt:    returnValue.setU64Const(u64Const >> constant.iConst);   break;\n            case EbtUint:   returnValue.setU64Const(u64Const >> constant.uConst);   break;\n            case EbtInt64:  returnValue.setU64Const(u64Const >> constant.i64Const); break;\n            case EbtUint64: returnValue.setU64Const(u64Const >> constant.u64Const); break;\n            default:       assert(false && \"Default missing\");\n            }\n            break;\n        default:     assert(false && \"Default missing\");\n        }\n\n        return returnValue;\n    }\n\n    TConstUnion operator<<(const TConstUnion& constant) const\n    {\n        TConstUnion returnValue;\n        switch (type) {\n        case EbtInt8:\n            switch (constant.type) {\n            case EbtInt8:   returnValue.setI8Const(i8Const << constant.i8Const);  break;\n            case EbtUint8:  returnValue.setI8Const(i8Const << constant.u8Const);  break;\n            case EbtInt16:  returnValue.setI8Const(i8Const << constant.i16Const); break;\n            case EbtUint16: returnValue.setI8Const(i8Const << constant.u16Const); break;\n            case EbtInt:    returnValue.setI8Const(i8Const << constant.iConst);   break;\n            case EbtUint:   returnValue.setI8Const(i8Const << constant.uConst);   break;\n            case EbtInt64:  returnValue.setI8Const(i8Const << constant.i64Const); break;\n            case EbtUint64: returnValue.setI8Const(i8Const << constant.u64Const); break;\n            default:       assert(false && \"Default missing\");\n            }\n            break;\n        case EbtUint8:\n            switch (constant.type) {\n            case EbtInt8:   returnValue.setU8Const(u8Const << constant.i8Const);  break;\n            case EbtUint8:  returnValue.setU8Const(u8Const << constant.u8Const);  break;\n            case EbtInt16:  returnValue.setU8Const(u8Const << constant.i16Const); break;\n            case EbtUint16: returnValue.setU8Const(u8Const << constant.u16Const); break;\n            case EbtInt:    returnValue.setU8Const(u8Const << constant.iConst);   break;\n            case EbtUint:   returnValue.setU8Const(u8Const << constant.uConst);   break;\n            case EbtInt64:  returnValue.setU8Const(u8Const << constant.i64Const); break;\n            case EbtUint64: returnValue.setU8Const(u8Const << constant.u64Const); break;\n            default:       assert(false && \"Default missing\");\n            }\n            break;\n        case EbtInt16:\n            switch (constant.type) {\n            case EbtInt8:   returnValue.setI16Const(i16Const << constant.i8Const);  break;\n            case EbtUint8:  returnValue.setI16Const(i16Const << constant.u8Const);  break;\n            case EbtInt16:  returnValue.setI16Const(i16Const << constant.i16Const); break;\n            case EbtUint16: returnValue.setI16Const(i16Const << constant.u16Const); break;\n            case EbtInt:    returnValue.setI16Const(i16Const << constant.iConst);   break;\n            case EbtUint:   returnValue.setI16Const(i16Const << constant.uConst);   break;\n            case EbtInt64:  returnValue.setI16Const(i16Const << constant.i64Const); break;\n            case EbtUint64: returnValue.setI16Const(i16Const << constant.u64Const); break;\n            default:       assert(false && \"Default missing\");\n            }\n            break;\n        case EbtUint16:\n            switch (constant.type) {\n            case EbtInt8:   returnValue.setU16Const(u16Const << constant.i8Const);  break;\n            case EbtUint8:  returnValue.setU16Const(u16Const << constant.u8Const);  break;\n            case EbtInt16:  returnValue.setU16Const(u16Const << constant.i16Const); break;\n            case EbtUint16: returnValue.setU16Const(u16Const << constant.u16Const); break;\n            case EbtInt:    returnValue.setU16Const(u16Const << constant.iConst);   break;\n            case EbtUint:   returnValue.setU16Const(u16Const << constant.uConst);   break;\n            case EbtInt64:  returnValue.setU16Const(u16Const << constant.i64Const); break;\n            case EbtUint64: returnValue.setU16Const(u16Const << constant.u64Const); break;\n            default:       assert(false && \"Default missing\");\n            }\n            break;\n         case EbtInt64:\n            switch (constant.type) {\n            case EbtInt8:   returnValue.setI64Const(i64Const << constant.i8Const);  break;\n            case EbtUint8:  returnValue.setI64Const(i64Const << constant.u8Const);  break;\n            case EbtInt16:  returnValue.setI64Const(i64Const << constant.i16Const); break;\n            case EbtUint16: returnValue.setI64Const(i64Const << constant.u16Const); break;\n            case EbtInt:    returnValue.setI64Const(i64Const << constant.iConst);   break;\n            case EbtUint:   returnValue.setI64Const(i64Const << constant.uConst);   break;\n            case EbtInt64:  returnValue.setI64Const(i64Const << constant.i64Const); break;\n            case EbtUint64: returnValue.setI64Const(i64Const << constant.u64Const); break;\n            default:       assert(false && \"Default missing\");\n            }\n            break;\n        case EbtUint64:\n            switch (constant.type) {\n            case EbtInt8:   returnValue.setU64Const(u64Const << constant.i8Const);  break;\n            case EbtUint8:  returnValue.setU64Const(u64Const << constant.u8Const);  break;\n            case EbtInt16:  returnValue.setU64Const(u64Const << constant.i16Const); break;\n            case EbtUint16: returnValue.setU64Const(u64Const << constant.u16Const); break;\n            case EbtInt:    returnValue.setU64Const(u64Const << constant.iConst);   break;\n            case EbtUint:   returnValue.setU64Const(u64Const << constant.uConst);   break;\n            case EbtInt64:  returnValue.setU64Const(u64Const << constant.i64Const); break;\n            case EbtUint64: returnValue.setU64Const(u64Const << constant.u64Const); break;\n            default:       assert(false && \"Default missing\");\n            }\n            break;\n        case EbtInt:\n            switch (constant.type) {\n            case EbtInt:    returnValue.setIConst(iConst << constant.iConst);   break;\n            case EbtUint:   returnValue.setIConst(iConst << constant.uConst);   break;\n            case EbtInt8:   returnValue.setIConst(iConst << constant.i8Const);  break;\n            case EbtUint8:  returnValue.setIConst(iConst << constant.u8Const);  break;\n            case EbtInt16:  returnValue.setIConst(iConst << constant.i16Const); break;\n            case EbtUint16: returnValue.setIConst(iConst << constant.u16Const); break;\n            case EbtInt64:  returnValue.setIConst(iConst << constant.i64Const); break;\n            case EbtUint64: returnValue.setIConst(iConst << constant.u64Const); break;\n            default:       assert(false && \"Default missing\");\n            }\n            break;\n        case EbtUint:\n            switch (constant.type) {\n            case EbtInt:    returnValue.setUConst(uConst << constant.iConst);   break;\n            case EbtUint:   returnValue.setUConst(uConst << constant.uConst);   break;\n            case EbtInt8:   returnValue.setUConst(uConst << constant.i8Const);  break;\n            case EbtUint8:  returnValue.setUConst(uConst << constant.u8Const);  break;\n            case EbtInt16:  returnValue.setUConst(uConst << constant.i16Const); break;\n            case EbtUint16: returnValue.setUConst(uConst << constant.u16Const); break;\n            case EbtInt64:  returnValue.setUConst(uConst << constant.i64Const); break;\n            case EbtUint64: returnValue.setUConst(uConst << constant.u64Const); break;\n            default:       assert(false && \"Default missing\");\n            }\n            break;\n        default:     assert(false && \"Default missing\");\n        }\n\n        return returnValue;\n    }\n\n    TConstUnion operator&(const TConstUnion& constant) const\n    {\n        TConstUnion returnValue;\n        assert(type == constant.type);\n        switch (type) {\n        case EbtInt:    returnValue.setIConst(iConst & constant.iConst); break;\n        case EbtUint:   returnValue.setUConst(uConst & constant.uConst); break;\n        case EbtInt8:   returnValue.setI8Const(i8Const & constant.i8Const); break;\n        case EbtUint8:  returnValue.setU8Const(u8Const & constant.u8Const); break;\n        case EbtInt16:  returnValue.setI16Const(i16Const & constant.i16Const); break;\n        case EbtUint16: returnValue.setU16Const(u16Const & constant.u16Const); break;\n        case EbtInt64:  returnValue.setI64Const(i64Const & constant.i64Const); break;\n        case EbtUint64: returnValue.setU64Const(u64Const & constant.u64Const); break;\n        default:     assert(false && \"Default missing\");\n        }\n\n        return returnValue;\n    }\n\n    TConstUnion operator|(const TConstUnion& constant) const\n    {\n        TConstUnion returnValue;\n        assert(type == constant.type);\n        switch (type) {\n        case EbtInt:    returnValue.setIConst(iConst | constant.iConst); break;\n        case EbtUint:   returnValue.setUConst(uConst | constant.uConst); break;\n        case EbtInt8:   returnValue.setI8Const(i8Const | constant.i8Const); break;\n        case EbtUint8:  returnValue.setU8Const(u8Const | constant.u8Const); break;\n        case EbtInt16:  returnValue.setI16Const(i16Const | constant.i16Const); break;\n        case EbtUint16: returnValue.setU16Const(u16Const | constant.u16Const); break;\n        case EbtInt64:  returnValue.setI64Const(i64Const | constant.i64Const); break;\n        case EbtUint64: returnValue.setU64Const(u64Const | constant.u64Const); break;\n        default:     assert(false && \"Default missing\");\n        }\n\n        return returnValue;\n    }\n\n    TConstUnion operator^(const TConstUnion& constant) const\n    {\n        TConstUnion returnValue;\n        assert(type == constant.type);\n        switch (type) {\n        case EbtInt:    returnValue.setIConst(iConst ^ constant.iConst); break;\n        case EbtUint:   returnValue.setUConst(uConst ^ constant.uConst); break;\n        case EbtInt8:   returnValue.setI8Const(i8Const ^ constant.i8Const); break;\n        case EbtUint8:  returnValue.setU8Const(u8Const ^ constant.u8Const); break;\n        case EbtInt16:  returnValue.setI16Const(i16Const ^ constant.i16Const); break;\n        case EbtUint16: returnValue.setU16Const(u16Const ^ constant.u16Const); break;\n        case EbtInt64:  returnValue.setI64Const(i64Const ^ constant.i64Const); break;\n        case EbtUint64: returnValue.setU64Const(u64Const ^ constant.u64Const); break;\n        default:     assert(false && \"Default missing\");\n        }\n\n        return returnValue;\n    }\n\n    TConstUnion operator~() const\n    {\n        TConstUnion returnValue;\n        switch (type) {\n        case EbtInt:    returnValue.setIConst(~iConst); break;\n        case EbtUint:   returnValue.setUConst(~uConst); break;\n        case EbtInt8:   returnValue.setI8Const(~i8Const); break;\n        case EbtUint8:  returnValue.setU8Const(~u8Const); break;\n        case EbtInt16:  returnValue.setI16Const(~i16Const); break;\n        case EbtUint16: returnValue.setU16Const(~u16Const); break;\n        case EbtInt64:  returnValue.setI64Const(~i64Const); break;\n        case EbtUint64: returnValue.setU64Const(~u64Const); break;\n        default:     assert(false && \"Default missing\");\n        }\n\n        return returnValue;\n    }\n\n    TConstUnion operator&&(const TConstUnion& constant) const\n    {\n        TConstUnion returnValue;\n        assert(type == constant.type);\n        switch (type) {\n        case EbtBool: returnValue.setBConst(bConst && constant.bConst); break;\n        default:     assert(false && \"Default missing\");\n        }\n\n        return returnValue;\n    }\n\n    TConstUnion operator||(const TConstUnion& constant) const\n    {\n        TConstUnion returnValue;\n        assert(type == constant.type);\n        switch (type) {\n        case EbtBool: returnValue.setBConst(bConst || constant.bConst); break;\n        default:     assert(false && \"Default missing\");\n        }\n\n        return returnValue;\n    }\n\n    TBasicType getType() const { return type; }\n\nprivate:\n    union  {\n        signed char        i8Const;     // used for i8vec, scalar int8s\n        unsigned char      u8Const;     // used for u8vec, scalar uint8s\n        signed short       i16Const;    // used for i16vec, scalar int16s\n        unsigned short     u16Const;    // used for u16vec, scalar uint16s\n        int                iConst;      // used for ivec, scalar ints\n        unsigned int       uConst;      // used for uvec, scalar uints\n        long long          i64Const;    // used for i64vec, scalar int64s\n        unsigned long long u64Const;    // used for u64vec, scalar uint64s\n        bool               bConst;      // used for bvec, scalar bools\n        double             dConst;      // used for vec, dvec, mat, dmat, scalar floats and doubles\n        const TString*     sConst;      // string constant\n    };\n\n    TBasicType type;\n};\n\n// Encapsulate having a pointer to an array of TConstUnion,\n// which only needs to be allocated if its size is going to be\n// bigger than 0.\n//\n// One convenience is being able to use [] to go inside the array, instead\n// of C++ assuming it as an array of pointers to vectors.\n//\n// General usage is that the size is known up front, and it is\n// created once with the proper size.\n//\nclass TConstUnionArray {\npublic:\n    POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())\n\n    TConstUnionArray() : unionArray(nullptr) { }\n    virtual ~TConstUnionArray() { }\n\n    explicit TConstUnionArray(int size)\n    {\n        if (size == 0)\n            unionArray = nullptr;\n        else\n            unionArray =  new TConstUnionVector(size);\n    }\n    TConstUnionArray(const TConstUnionArray& a) = default;\n    TConstUnionArray(const TConstUnionArray& a, int start, int size)\n    {\n        unionArray = new TConstUnionVector(size);\n        for (int i = 0; i < size; ++i)\n            (*unionArray)[i] = a[start + i];\n    }\n\n    // Use this constructor for a smear operation\n    TConstUnionArray(int size, const TConstUnion& val)\n    {\n        unionArray = new TConstUnionVector(size, val);\n    }\n\n    int size() const { return unionArray ? (int)unionArray->size() : 0; }\n    TConstUnion& operator[](size_t index) { return (*unionArray)[index]; }\n    const TConstUnion& operator[](size_t index) const { return (*unionArray)[index]; }\n    bool operator==(const TConstUnionArray& rhs) const\n    {\n        // this includes the case that both are unallocated\n        if (unionArray == rhs.unionArray)\n            return true;\n\n        if (! unionArray || ! rhs.unionArray)\n            return false;\n\n        return *unionArray == *rhs.unionArray;\n    }\n    bool operator!=(const TConstUnionArray& rhs) const { return ! operator==(rhs); }\n\n    double dot(const TConstUnionArray& rhs)\n    {\n        assert(rhs.unionArray->size() == unionArray->size());\n        double sum = 0.0;\n\n        for (size_t comp = 0; comp < unionArray->size(); ++comp)\n            sum += (*this)[comp].getDConst() * rhs[comp].getDConst();\n\n        return sum;\n    }\n\n    bool empty() const { return unionArray == nullptr; }\n\nprotected:\n    typedef TVector<TConstUnion> TConstUnionVector;\n    TConstUnionVector* unionArray;\n};\n\n} // end namespace glslang\n\n#endif // _CONSTANT_UNION_INCLUDED_\n"
  },
  {
    "path": "src/libraries/glslang/glslang/Include/InfoSink.h",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#ifndef _INFOSINK_INCLUDED_\n#define _INFOSINK_INCLUDED_\n\n#include \"../Include/Common.h\"\n#include <filesystem>\n#include <cmath>\n\nnamespace glslang {\n\n//\n// TPrefixType is used to centralize how info log messages start.\n// See below.\n//\nenum TPrefixType {\n    EPrefixNone,\n    EPrefixWarning,\n    EPrefixError,\n    EPrefixInternalError,\n    EPrefixUnimplemented,\n    EPrefixNote\n};\n\nenum TOutputStream {\n    ENull = 0,\n    EDebugger = 0x01,\n    EStdOut = 0x02,\n    EString = 0x04,\n};\n//\n// Encapsulate info logs for all objects that have them.\n//\n// The methods are a general set of tools for getting a variety of\n// messages and types inserted into the log.\n//\nclass TInfoSinkBase {\npublic:\n    TInfoSinkBase() : outputStream(4), shaderFileName(nullptr) {}\n    void erase() { sink.erase(); }\n    TInfoSinkBase& operator<<(const TPersistString& t) { append(t); return *this; }\n    TInfoSinkBase& operator<<(char c)                  { append(1, c); return *this; }\n    TInfoSinkBase& operator<<(const char* s)           { append(s); return *this; }\n    TInfoSinkBase& operator<<(int n)                   { append(String(n)); return *this; }\n    TInfoSinkBase& operator<<(unsigned int n)          { append(String(n)); return *this; }\n    TInfoSinkBase& operator<<(float n)                 { const int size = 40; char buf[size];\n                                                         snprintf(buf, size, (fabs(n) > 1e-8 && fabs(n) < 1e8) || n == 0.0f ? \"%f\" : \"%g\", n);\n                                                         append(buf);\n                                                         return *this; }\n    TInfoSinkBase& operator+(const TPersistString& t)  { append(t); return *this; }\n    TInfoSinkBase& operator+(const TString& t)         { append(t); return *this; }\n    TInfoSinkBase& operator<<(const TString& t)        { append(t); return *this; }\n    TInfoSinkBase& operator+(const char* s)            { append(s); return *this; }\n    const char* c_str() const { return sink.c_str(); }\n    void prefix(TPrefixType message) {\n        switch(message) {\n        case EPrefixNone:                                      break;\n        case EPrefixWarning:       append(\"WARNING: \");        break;\n        case EPrefixError:         append(\"ERROR: \");          break;\n        case EPrefixInternalError: append(\"INTERNAL ERROR: \"); break;\n        case EPrefixUnimplemented: append(\"UNIMPLEMENTED: \");  break;\n        case EPrefixNote:          append(\"NOTE: \");           break;\n        default:                   append(\"UNKNOWN ERROR: \");   break;\n        }\n    }\n    void location(const TSourceLoc& loc, bool absolute = false, bool displayColumn = false) {\n        const int maxSize = 24;\n        char locText[maxSize];\n        if (displayColumn) {\n            snprintf(locText, maxSize, \":%d:%d\", loc.line, loc.column);\n        } else {\n            snprintf(locText, maxSize, \":%d\", loc.line);\n        }\n\n        if(loc.getFilename() == nullptr && shaderFileName != nullptr && absolute) {\n            append(std::filesystem::absolute(shaderFileName).string());\n        } else {\n            std::string location = loc.getStringNameOrNum(false);\n            if (absolute) {\n                append(std::filesystem::absolute(location).string());\n            } else {\n                append(location);\n            }\n        }\n\n        append(locText);\n        append(\": \");\n    }\n    void message(TPrefixType message, const char* s) {\n        prefix(message);\n        append(s);\n        append(\"\\n\");\n    }\n    void message(TPrefixType message, const char* s, const TSourceLoc& loc, bool absolute = false,\n                 bool displayColumn = false)\n    {\n        prefix(message);\n        location(loc, absolute, displayColumn);\n        append(s);\n        append(\"\\n\");\n    }\n\n    void setOutputStream(int output = 4)\n    {\n        outputStream = output;\n    }\n\n    void setShaderFileName(const char* file = nullptr)\n    {\n        shaderFileName = file;\n    }\n\nprotected:\n    void append(const char* s);\n\n    void append(int count, char c);\n    void append(const TPersistString& t);\n    void append(const TString& t);\n\n    void checkMem(size_t growth) { if (sink.capacity() < sink.size() + growth + 2)\n                                       sink.reserve(sink.capacity() +  sink.capacity() / 2); }\n    void appendToStream(const char* s);\n    TPersistString sink;\n    int outputStream;\n    const char* shaderFileName;\n};\n\n} // end namespace glslang\n\nclass TInfoSink {\npublic:\n    glslang::TInfoSinkBase info;\n    glslang::TInfoSinkBase debug;\n};\n\n#endif // _INFOSINK_INCLUDED_\n"
  },
  {
    "path": "src/libraries/glslang/glslang/Include/InitializeGlobals.h",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#ifndef __INITIALIZE_GLOBALS_INCLUDED_\n#define __INITIALIZE_GLOBALS_INCLUDED_\n\nnamespace glslang {\n\ninline bool InitializePoolIndex() { return true; } // DEPRECATED: No need to call\n\n} // end namespace glslang\n\n#endif // __INITIALIZE_GLOBALS_INCLUDED_\n"
  },
  {
    "path": "src/libraries/glslang/glslang/Include/PoolAlloc.h",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2012-2013 LunarG, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#ifndef _POOLALLOC_INCLUDED_\n#define _POOLALLOC_INCLUDED_\n\n#ifndef NDEBUG\n#  define GUARD_BLOCKS  // define to enable guard block sanity checking\n#endif\n\n//\n// This header defines an allocator that can be used to efficiently\n// allocate a large number of small requests for heap memory, with the\n// intention that they are not individually deallocated, but rather\n// collectively deallocated at one time.\n//\n// This simultaneously\n//\n// * Makes each individual allocation much more efficient; the\n//     typical allocation is trivial.\n// * Completely avoids the cost of doing individual deallocation.\n// * Saves the trouble of tracking down and plugging a large class of leaks.\n//\n// Individual classes can use this allocator by supplying their own\n// new and delete methods.\n//\n// STL containers can use this allocator by using the pool_allocator\n// class as the allocator (second) template argument.\n//\n\n#include \"visibility.h\"\n\n#include <cstddef>\n#include <cstring>\n#include <vector>\n\nnamespace glslang {\n\n// If we are using guard blocks, we must track each individual\n// allocation.  If we aren't using guard blocks, these\n// never get instantiated, so won't have any impact.\n//\n\nclass TAllocation {\npublic:\n    TAllocation(size_t size, unsigned char* mem, TAllocation* prev = nullptr) :\n        size(size), mem(mem), prevAlloc(prev) {\n        // Allocations are bracketed:\n        //    [allocationHeader][initialGuardBlock][userData][finalGuardBlock]\n        // This would be cleaner with if (guardBlockSize)..., but that\n        // makes the compiler print warnings about 0 length memsets,\n        // even with the if() protecting them.\n#       ifdef GUARD_BLOCKS\n            memset(preGuard(),  guardBlockBeginVal, guardBlockSize);\n            memset(data(),      userDataFill,       size);\n            memset(postGuard(), guardBlockEndVal,   guardBlockSize);\n#       endif\n    }\n\n    void check() const {\n        checkGuardBlock(preGuard(),  guardBlockBeginVal, \"before\");\n        checkGuardBlock(postGuard(), guardBlockEndVal,   \"after\");\n    }\n\n    void checkAllocList() const;\n\n    // Return total size needed to accommodate user buffer of 'size',\n    // plus our tracking data.\n    inline static size_t allocationSize(size_t size) {\n        return size + 2 * guardBlockSize + headerSize();\n    }\n\n    // Offset from surrounding buffer to get to user data buffer.\n    inline static unsigned char* offsetAllocation(unsigned char* m) {\n        return m + guardBlockSize + headerSize();\n    }\n\nprivate:\n    void checkGuardBlock(unsigned char* blockMem, unsigned char val, const char* locText) const;\n\n    // Find offsets to pre and post guard blocks, and user data buffer\n    unsigned char* preGuard()  const { return mem + headerSize(); }\n    unsigned char* data()      const { return preGuard() + guardBlockSize; }\n    unsigned char* postGuard() const { return data() + size; }\n\n    size_t size;                  // size of the user data area\n    unsigned char* mem;           // beginning of our allocation (pts to header)\n    TAllocation* prevAlloc;       // prior allocation in the chain\n\n    static inline constexpr unsigned char guardBlockBeginVal = 0xfb;\n    static inline constexpr unsigned char guardBlockEndVal = 0xfe;\n    static inline constexpr unsigned char userDataFill = 0xcd;\n\n#   ifdef GUARD_BLOCKS\n    static inline constexpr size_t guardBlockSize = 16;\n#   else\n    static inline constexpr size_t guardBlockSize = 0;\n#   endif\n\n#   ifdef GUARD_BLOCKS\n    inline static size_t headerSize() { return sizeof(TAllocation); }\n#   else\n    inline static size_t headerSize() { return 0; }\n#   endif\n};\n\n//\n// There are several stacks.  One is to track the pushing and popping\n// of the user, and not yet implemented.  The others are simply a\n// repositories of free pages or used pages.\n//\n// Page stacks are linked together with a simple header at the beginning\n// of each allocation obtained from the underlying OS.  Multi-page allocations\n// are returned to the OS.  Individual page allocations are kept for future\n// re-use.\n//\n// The \"page size\" used is not, nor must it match, the underlying OS\n// page size.  But, having it be about that size or equal to a set of\n// pages is likely most optimal.\n//\nclass TPoolAllocator {\npublic:\n    TPoolAllocator(int growthIncrement = 8*1024, int allocationAlignment = 16);\n\n    //\n    // Don't call the destructor just to free up the memory, call pop()\n    //\n    ~TPoolAllocator();\n\n    //\n    // Call push() to establish a new place to pop memory too.  Does not\n    // have to be called to get things started.\n    //\n    void push();\n\n    //\n    // Call pop() to free all memory allocated since the last call to push(),\n    // or if no last call to push, frees all memory since first allocation.\n    //\n    void pop();\n\n    //\n    // Call popAll() to free all memory allocated.\n    //\n    void popAll();\n\n    //\n    // Call allocate() to actually acquire memory.  Returns nullptr if no memory\n    // available, otherwise a properly aligned pointer to 'numBytes' of memory.\n    //\n    GLSLANG_EXPORT_FOR_TESTS\n    void* allocate(size_t numBytes);\n\n    //\n    // There is no deallocate.  The point of this class is that\n    // deallocation can be skipped by the user of it, as the model\n    // of use is to simultaneously deallocate everything at once\n    // by calling pop(), and to not have to solve memory leak problems.\n    //\n\nprotected:\n    friend struct tHeader;\n\n    struct tHeader {\n        tHeader(tHeader* nextPage, size_t pageCount) :\n#ifdef GUARD_BLOCKS\n        lastAllocation(nullptr),\n#endif\n        nextPage(nextPage), pageCount(pageCount) { }\n\n        ~tHeader() {\n#ifdef GUARD_BLOCKS\n            if (lastAllocation)\n                lastAllocation->checkAllocList();\n#endif\n        }\n\n#ifdef GUARD_BLOCKS\n        TAllocation* lastAllocation;\n#endif\n        tHeader* nextPage;\n        size_t pageCount;\n    };\n\n    struct tAllocState {\n        size_t offset;\n        tHeader* page;\n    };\n    typedef std::vector<tAllocState> tAllocStack;\n\n    // Track allocations if and only if we're using guard blocks\n#ifndef GUARD_BLOCKS\n    void* initializeAllocation(tHeader*, unsigned char* memory, size_t) {\n#else\n    void* initializeAllocation(tHeader* block, unsigned char* memory, size_t numBytes) {\n        new(memory) TAllocation(numBytes, memory, block->lastAllocation);\n        block->lastAllocation = reinterpret_cast<TAllocation*>(memory);\n#endif\n\n        // This is optimized entirely away if GUARD_BLOCKS is not defined.\n        return TAllocation::offsetAllocation(memory);\n    }\n\n    size_t pageSize;        // granularity of allocation from the OS\n    size_t alignment;       // all returned allocations will be aligned at\n                            //      this granularity, which will be a power of 2\n    size_t alignmentMask;\n    size_t headerSkip;      // amount of memory to skip to make room for the\n                            //      header (basically, size of header, rounded\n                            //      up to make it aligned\n    size_t currentPageOffset;  // next offset in top of inUseList to allocate from\n    tHeader* freeList;      // list of popped memory\n    tHeader* inUseList;     // list of all memory currently being used\n    tAllocStack stack;      // stack of where to allocate from, to partition pool\n\n    int numCalls;           // just an interesting statistic\n    size_t totalBytes;      // just an interesting statistic\nprivate:\n    TPoolAllocator& operator=(const TPoolAllocator&);  // don't allow assignment operator\n    TPoolAllocator(const TPoolAllocator&);  // don't allow default copy constructor\n};\n\n//\n// There could potentially be many pools with pops happening at\n// different times.  But a simple use is to have a global pop\n// with everyone using the same global allocator.\n//\nGLSLANG_EXPORT_FOR_TESTS\nextern TPoolAllocator& GetThreadPoolAllocator();\nvoid SetThreadPoolAllocator(TPoolAllocator* poolAllocator);\n\n//\n// This STL compatible allocator is intended to be used as the allocator\n// parameter to templatized STL containers, like vector and map.\n//\n// It will use the pools for allocation, and not\n// do any deallocation, but will still do destruction.\n//\ntemplate<class T>\nclass pool_allocator {\npublic:\n    typedef size_t size_type;\n    typedef ptrdiff_t difference_type;\n    typedef T *pointer;\n    typedef const T *const_pointer;\n    typedef T& reference;\n    typedef const T& const_reference;\n    typedef T value_type;\n    template<class Other>\n        struct rebind {\n            typedef pool_allocator<Other> other;\n        };\n    pointer address(reference x) const { return &x; }\n    const_pointer address(const_reference x) const { return &x; }\n\n    pool_allocator() : allocator(GetThreadPoolAllocator()) { }\n    pool_allocator(TPoolAllocator& a) : allocator(a) { }\n    pool_allocator(const pool_allocator<T>& p) : allocator(p.allocator) { }\n\n    template<class Other>\n        pool_allocator(const pool_allocator<Other>& p) : allocator(p.getAllocator()) { }\n\n    GLSLANG_EXPORT_FOR_TESTS\n    pointer allocate(size_type n) {\n        return reinterpret_cast<pointer>(getAllocator().allocate(n * sizeof(T))); }\n    pointer allocate(size_type n, const void*) {\n        return reinterpret_cast<pointer>(getAllocator().allocate(n * sizeof(T))); }\n\n    void deallocate(void*, size_type) { }\n    void deallocate(pointer, size_type) { }\n\n    pointer _Charalloc(size_t n) {\n        return reinterpret_cast<pointer>(getAllocator().allocate(n)); }\n\n    void construct(pointer p, const T& val) { new ((void *)p) T(val); }\n    void destroy(pointer p) { p->T::~T(); }\n\n    bool operator==(const pool_allocator& rhs) const { return &getAllocator() == &rhs.getAllocator(); }\n    bool operator!=(const pool_allocator& rhs) const { return &getAllocator() != &rhs.getAllocator(); }\n\n    size_type max_size() const { return static_cast<size_type>(-1) / sizeof(T); }\n    size_type max_size(int size) const { return static_cast<size_type>(-1) / size; }\n\n    TPoolAllocator& getAllocator() const { return allocator; }\n\n    pool_allocator select_on_container_copy_construction() const { return pool_allocator{}; }\n\nprotected:\n    pool_allocator& operator=(const pool_allocator&) { return *this; }\n    TPoolAllocator& allocator;\n};\n\n} // end namespace glslang\n\n#endif // _POOLALLOC_INCLUDED_\n"
  },
  {
    "path": "src/libraries/glslang/glslang/Include/ResourceLimits.h",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2013 LunarG, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#ifndef _RESOURCE_LIMITS_INCLUDED_\n#define _RESOURCE_LIMITS_INCLUDED_\n\nstruct TLimits {\n    bool nonInductiveForLoops;\n    bool whileLoops;\n    bool doWhileLoops;\n    bool generalUniformIndexing;\n    bool generalAttributeMatrixVectorIndexing;\n    bool generalVaryingIndexing;\n    bool generalSamplerIndexing;\n    bool generalVariableIndexing;\n    bool generalConstantMatrixVectorIndexing;\n};\n\nstruct TBuiltInResource {\n    int maxLights;\n    int maxClipPlanes;\n    int maxTextureUnits;\n    int maxTextureCoords;\n    int maxVertexAttribs;\n    int maxVertexUniformComponents;\n    int maxVaryingFloats;\n    int maxVertexTextureImageUnits;\n    int maxCombinedTextureImageUnits;\n    int maxTextureImageUnits;\n    int maxFragmentUniformComponents;\n    int maxDrawBuffers;\n    int maxVertexUniformVectors;\n    int maxVaryingVectors;\n    int maxFragmentUniformVectors;\n    int maxVertexOutputVectors;\n    int maxFragmentInputVectors;\n    int minProgramTexelOffset;\n    int maxProgramTexelOffset;\n    int maxClipDistances;\n    int maxComputeWorkGroupCountX;\n    int maxComputeWorkGroupCountY;\n    int maxComputeWorkGroupCountZ;\n    int maxComputeWorkGroupSizeX;\n    int maxComputeWorkGroupSizeY;\n    int maxComputeWorkGroupSizeZ;\n    int maxComputeUniformComponents;\n    int maxComputeTextureImageUnits;\n    int maxComputeImageUniforms;\n    int maxComputeAtomicCounters;\n    int maxComputeAtomicCounterBuffers;\n    int maxVaryingComponents;\n    int maxVertexOutputComponents;\n    int maxGeometryInputComponents;\n    int maxGeometryOutputComponents;\n    int maxFragmentInputComponents;\n    int maxImageUnits;\n    int maxCombinedImageUnitsAndFragmentOutputs;\n    int maxCombinedShaderOutputResources;\n    int maxImageSamples;\n    int maxVertexImageUniforms;\n    int maxTessControlImageUniforms;\n    int maxTessEvaluationImageUniforms;\n    int maxGeometryImageUniforms;\n    int maxFragmentImageUniforms;\n    int maxCombinedImageUniforms;\n    int maxGeometryTextureImageUnits;\n    int maxGeometryOutputVertices;\n    int maxGeometryTotalOutputComponents;\n    int maxGeometryUniformComponents;\n    int maxGeometryVaryingComponents;\n    int maxTessControlInputComponents;\n    int maxTessControlOutputComponents;\n    int maxTessControlTextureImageUnits;\n    int maxTessControlUniformComponents;\n    int maxTessControlTotalOutputComponents;\n    int maxTessEvaluationInputComponents;\n    int maxTessEvaluationOutputComponents;\n    int maxTessEvaluationTextureImageUnits;\n    int maxTessEvaluationUniformComponents;\n    int maxTessPatchComponents;\n    int maxPatchVertices;\n    int maxTessGenLevel;\n    int maxViewports;\n    int maxVertexAtomicCounters;\n    int maxTessControlAtomicCounters;\n    int maxTessEvaluationAtomicCounters;\n    int maxGeometryAtomicCounters;\n    int maxFragmentAtomicCounters;\n    int maxCombinedAtomicCounters;\n    int maxAtomicCounterBindings;\n    int maxVertexAtomicCounterBuffers;\n    int maxTessControlAtomicCounterBuffers;\n    int maxTessEvaluationAtomicCounterBuffers;\n    int maxGeometryAtomicCounterBuffers;\n    int maxFragmentAtomicCounterBuffers;\n    int maxCombinedAtomicCounterBuffers;\n    int maxAtomicCounterBufferSize;\n    int maxTransformFeedbackBuffers;\n    int maxTransformFeedbackInterleavedComponents;\n    int maxCullDistances;\n    int maxCombinedClipAndCullDistances;\n    int maxSamples;\n    int maxMeshOutputVerticesNV;\n    int maxMeshOutputPrimitivesNV;\n    int maxMeshWorkGroupSizeX_NV;\n    int maxMeshWorkGroupSizeY_NV;\n    int maxMeshWorkGroupSizeZ_NV;\n    int maxTaskWorkGroupSizeX_NV;\n    int maxTaskWorkGroupSizeY_NV;\n    int maxTaskWorkGroupSizeZ_NV;\n    int maxMeshViewCountNV;\n    int maxMeshOutputVerticesEXT;\n    int maxMeshOutputPrimitivesEXT;\n    int maxMeshWorkGroupSizeX_EXT;\n    int maxMeshWorkGroupSizeY_EXT;\n    int maxMeshWorkGroupSizeZ_EXT;\n    int maxTaskWorkGroupSizeX_EXT;\n    int maxTaskWorkGroupSizeY_EXT;\n    int maxTaskWorkGroupSizeZ_EXT;\n    int maxMeshViewCountEXT;\n    int maxDualSourceDrawBuffersEXT;\n\n    TLimits limits;\n};\n\n#endif // _RESOURCE_LIMITS_INCLUDED_\n"
  },
  {
    "path": "src/libraries/glslang/glslang/Include/ShHandle.h",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#ifndef _SHHANDLE_INCLUDED_\n#define _SHHANDLE_INCLUDED_\n\n//\n// Machine independent part of the compiler private objects\n// sent as ShHandle to the driver.\n//\n// This should not be included by driver code.\n//\n\n#define SH_EXPORTING\n#include \"../Public/ShaderLang.h\"\n#include \"../MachineIndependent/Versions.h\"\n#include \"InfoSink.h\"\n\nclass TCompiler;\nclass TLinker;\nclass TUniformMap;\n\n//\n// The base class used to back handles returned to the driver.\n//\nclass TShHandleBase {\npublic:\n    TShHandleBase() { pool = new glslang::TPoolAllocator; }\n    virtual ~TShHandleBase() { delete pool; }\n    virtual TCompiler* getAsCompiler() { return nullptr; }\n    virtual TLinker* getAsLinker() { return nullptr; }\n    virtual TUniformMap* getAsUniformMap() { return nullptr; }\n    virtual glslang::TPoolAllocator* getPool() const { return pool; }\nprivate:\n    glslang::TPoolAllocator* pool;\n};\n\n//\n// The base class for the machine dependent linker to derive from\n// for managing where uniforms live.\n//\nclass TUniformMap : public TShHandleBase {\npublic:\n    TUniformMap() { }\n    virtual ~TUniformMap() { }\n    virtual TUniformMap* getAsUniformMap() { return this; }\n    virtual int getLocation(const char* name) = 0;\n    virtual TInfoSink& getInfoSink() { return infoSink; }\n    TInfoSink infoSink;\n};\n\nclass TIntermNode;\n\n//\n// The base class for the machine dependent compiler to derive from\n// for managing object code from the compile.\n//\nclass TCompiler : public TShHandleBase {\npublic:\n    TCompiler(EShLanguage l, TInfoSink& sink) : infoSink(sink) , language(l), haveValidObjectCode(false) { }\n    virtual ~TCompiler() { }\n    EShLanguage getLanguage() { return language; }\n    virtual TInfoSink& getInfoSink() { return infoSink; }\n\n    virtual bool compile(TIntermNode* root, int version = 0, EProfile profile = ENoProfile) = 0;\n\n    virtual TCompiler* getAsCompiler() { return this; }\n    virtual bool linkable() { return haveValidObjectCode; }\n\n    TInfoSink& infoSink;\nprotected:\n    TCompiler& operator=(TCompiler&);\n\n    EShLanguage language;\n    bool haveValidObjectCode;\n};\n\n//\n// Link operations are based on a list of compile results...\n//\ntypedef glslang::TVector<TCompiler*> TCompilerList;\ntypedef glslang::TVector<TShHandleBase*> THandleList;\n\n//\n// The base class for the machine dependent linker to derive from\n// to manage the resulting executable.\n//\n\nclass TLinker : public TShHandleBase {\npublic:\n    TLinker(EShExecutable e, TInfoSink& iSink) :\n        infoSink(iSink),\n        executable(e),\n        haveReturnableObjectCode(false),\n        appAttributeBindings(nullptr),\n        fixedAttributeBindings(nullptr),\n        excludedAttributes(nullptr),\n        excludedCount(0),\n        uniformBindings(nullptr) { }\n    virtual TLinker* getAsLinker() { return this; }\n    virtual ~TLinker() { }\n    virtual bool link(TCompilerList&, TUniformMap*) = 0;\n    virtual bool link(THandleList&) { return false; }\n    virtual void setAppAttributeBindings(const ShBindingTable* t)   { appAttributeBindings = t; }\n    virtual void setFixedAttributeBindings(const ShBindingTable* t) { fixedAttributeBindings = t; }\n    virtual void getAttributeBindings(ShBindingTable const **t) const = 0;\n    virtual void setExcludedAttributes(const int* attributes, int count) { excludedAttributes = attributes; excludedCount = count; }\n    virtual ShBindingTable* getUniformBindings() const  { return uniformBindings; }\n    virtual const void* getObjectCode() const { return nullptr; } // a real compiler would be returning object code here\n    virtual TInfoSink& getInfoSink() { return infoSink; }\n    TInfoSink& infoSink;\nprotected:\n    TLinker& operator=(TLinker&);\n    EShExecutable executable;\n    bool haveReturnableObjectCode;  // true when objectCode is acceptable to send to driver\n\n    const ShBindingTable* appAttributeBindings;\n    const ShBindingTable* fixedAttributeBindings;\n    const int* excludedAttributes;\n    int excludedCount;\n    ShBindingTable* uniformBindings;                // created by the linker\n};\n\n//\n// This is the interface between the machine independent code\n// and the machine dependent code.\n//\n// The machine dependent code should derive from the classes\n// above. Then Construct*() and Delete*() will create and\n// destroy the machine dependent objects, which contain the\n// above machine independent information.\n//\nTCompiler* ConstructCompiler(EShLanguage, int);\n\nTShHandleBase* ConstructLinker(EShExecutable, int);\nTShHandleBase* ConstructBindings();\nvoid DeleteLinker(TShHandleBase*);\nvoid DeleteBindingList(TShHandleBase* bindingList);\n\nTUniformMap* ConstructUniformMap();\nvoid DeleteCompiler(TCompiler*);\n\nvoid DeleteUniformMap(TUniformMap*);\n\n#endif // _SHHANDLE_INCLUDED_\n"
  },
  {
    "path": "src/libraries/glslang/glslang/Include/SpirvIntrinsics.h",
    "content": "//\n// Copyright(C) 2021 Advanced Micro Devices, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#pragma once\n\n//\n// GL_EXT_spirv_intrinsics\n//\n#include \"Common.h\"\n#include <variant>\n\nnamespace glslang {\n\nclass TIntermTyped;\nclass TIntermConstantUnion;\nclass TType;\n\n// SPIR-V requirements\nstruct TSpirvRequirement {\n    POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())\n\n    // capability = [..]\n    TSet<TString> extensions;\n    // extension = [..]\n    TSet<int> capabilities;\n};\n\n// SPIR-V execution modes\nstruct TSpirvExecutionMode {\n    POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())\n\n    // spirv_execution_mode\n    TMap<int, TVector<const TIntermConstantUnion*>> modes;\n    // spirv_execution_mode_id\n    TMap<int, TVector<const TIntermTyped*> > modeIds;\n};\n\n// SPIR-V decorations\nstruct TSpirvDecorate {\n    POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())\n\n    // spirv_decorate\n    TMap<int, TVector<const TIntermConstantUnion*> > decorates;\n    // spirv_decorate_id\n    TMap<int, TVector<const TIntermTyped*>> decorateIds;\n    // spirv_decorate_string\n    TMap<int, TVector<const TIntermConstantUnion*> > decorateStrings;\n};\n\n// SPIR-V instruction\nstruct TSpirvInstruction {\n    POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())\n\n    TSpirvInstruction() { set = \"\"; id = -1; }\n\n    bool operator==(const TSpirvInstruction& rhs) const { return set == rhs.set && id == rhs.id; }\n    bool operator!=(const TSpirvInstruction& rhs) const { return !operator==(rhs); }\n\n    // spirv_instruction\n    TString set;\n    int     id;\n};\n\n// SPIR-V type parameter\nstruct TSpirvTypeParameter {\n    POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())\n\n    TSpirvTypeParameter(const TIntermConstantUnion* arg) { value = arg; }\n    TSpirvTypeParameter(const TType* arg) { value = arg; }\n\n    const TIntermConstantUnion* getAsConstant() const\n    {\n        if (value.index() == 0)\n            return std::get<const TIntermConstantUnion*>(value);\n        return nullptr;\n    }\n    const TType* getAsType() const\n    {\n        if (value.index() == 1)\n            return std::get<const TType*>(value);\n        return nullptr;\n    }\n\n    bool operator==(const TSpirvTypeParameter& rhs) const;\n    bool operator!=(const TSpirvTypeParameter& rhs) const { return !operator==(rhs); }\n\n    // Parameter value: constant expression or type specifier\n    std::variant<const TIntermConstantUnion*, const TType*> value;\n};\n\ntypedef TVector<TSpirvTypeParameter> TSpirvTypeParameters;\n\n// SPIR-V type\nstruct TSpirvType {\n    POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())\n\n    bool operator==(const TSpirvType& rhs) const\n    {\n        return spirvInst == rhs.spirvInst && typeParams == rhs.typeParams;\n    }\n    bool operator!=(const TSpirvType& rhs) const { return !operator==(rhs); }\n\n    // spirv_type\n    TSpirvInstruction spirvInst;\n    TSpirvTypeParameters typeParams;\n};\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/Include/Types.h",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2012-2016 LunarG, Inc.\n// Copyright (C) 2015-2016 Google, Inc.\n// Copyright (C) 2017 ARM Limited.\n// Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#ifndef _TYPES_INCLUDED\n#define _TYPES_INCLUDED\n\n#include \"../Include/Common.h\"\n#include \"../Include/BaseTypes.h\"\n#include \"../Public/ShaderLang.h\"\n#include \"arrays.h\"\n#include \"SpirvIntrinsics.h\"\n\n#include <algorithm>\n\nnamespace glslang {\n\nclass TIntermAggregate;\n\nconst int GlslangMaxTypeLength = 200;  // TODO: need to print block/struct one member per line, so this can stay bounded\n\nconst char* const AnonymousPrefix = \"anon@\"; // for something like a block whose members can be directly accessed\ninline bool IsAnonymous(const TString& name)\n{\n    return name.compare(0, 5, AnonymousPrefix) == 0;\n}\n\n//\n// Details within a sampler type\n//\nenum TSamplerDim {\n    EsdNone,\n    Esd1D,\n    Esd2D,\n    Esd3D,\n    EsdCube,\n    EsdRect,\n    EsdBuffer,\n    EsdSubpass,  // goes only with non-sampled image (image is true)\n    EsdAttachmentEXT,\n    EsdNumDims\n};\n\nstruct TSampler {   // misnomer now; includes images, textures without sampler, and textures with sampler\n    TBasicType type : 8;  // type returned by sampler\n    TSamplerDim dim : 8;\n    bool    arrayed : 1;\n    bool     shadow : 1;\n    bool         ms : 1;\n    bool      image : 1;  // image, combined should be false\n    bool   combined : 1;  // true means texture is combined with a sampler, false means texture with no sampler\n    bool    sampler : 1;  // true means a pure sampler, other fields should be clear()\n    bool   tileQCOM : 1;  // is tile shading attachment \n\n    unsigned int vectorSize : 3;  // vector return type size.\n    // Some languages support structures as sample results.  Storing the whole structure in the\n    // TSampler is too large, so there is an index to a separate table.\n    static const unsigned structReturnIndexBits = 4;                        // number of index bits to use.\n    static const unsigned structReturnSlots = (1<<structReturnIndexBits)-1; // number of valid values\n    static const unsigned noReturnStruct = structReturnSlots;               // value if no return struct type.\n    // Index into a language specific table of texture return structures.\n    unsigned int structReturnIndex : structReturnIndexBits;\n\n    bool   external : 1;  // GL_OES_EGL_image_external\n    bool        yuv : 1;  // GL_EXT_YUV_target\n\n#ifdef ENABLE_HLSL\n    unsigned int getVectorSize() const { return vectorSize; }\n    void clearReturnStruct() { structReturnIndex = noReturnStruct; }\n    bool hasReturnStruct() const { return structReturnIndex != noReturnStruct; }\n    unsigned getStructReturnIndex() const { return structReturnIndex; }\n#endif\n\n    bool is1D()          const { return dim == Esd1D; }\n    bool is2D()          const { return dim == Esd2D; }\n    bool isBuffer()      const { return dim == EsdBuffer; }\n    bool isRect()        const { return dim == EsdRect; }\n    bool isSubpass()     const { return dim == EsdSubpass; }\n    bool isAttachmentEXT()  const { return dim == EsdAttachmentEXT; }\n    bool isCombined()    const { return combined; }\n    bool isImage()       const { return image && !isSubpass() && !isAttachmentEXT();}\n    bool isImageClass()  const { return image; }\n    bool isMultiSample() const { return ms; }\n    bool isExternal()    const { return external; }\n    void setExternal(bool e) { external = e; }\n    bool isYuv()         const { return yuv; }\n    bool isTexture()     const { return !sampler && !image; }\n    bool isPureSampler() const { return sampler; }\n\n    void setCombined(bool c) { combined = c; }\n    void setBasicType(TBasicType t) { type = t; }\n    TBasicType getBasicType()  const { return type; }\n    bool isShadow()      const { return shadow; }\n    bool isArrayed()     const { return arrayed; }\n\n    bool isTileAttachmentQCOM() const { return tileQCOM; }\n\n    void clear()\n    {\n        type = EbtVoid;\n        dim = EsdNone;\n        arrayed = false;\n        shadow = false;\n        ms = false;\n        image = false;\n        combined = false;\n        sampler = false;\n        external = false;\n        yuv = false;\n        tileQCOM = false;\n\n#ifdef ENABLE_HLSL\n        clearReturnStruct();\n        // by default, returns a single vec4;\n        vectorSize = 4;\n#endif\n    }\n\n    // make a combined sampler and texture\n    void set(TBasicType t, TSamplerDim d, bool a = false, bool s = false, bool m = false)\n    {\n        clear();\n        type = t;\n        dim = d;\n        arrayed = a;\n        shadow = s;\n        ms = m;\n        combined = true;\n    }\n\n    // make an image\n    void setImage(TBasicType t, TSamplerDim d, bool a = false, bool s = false, bool m = false)\n    {\n        clear();\n        type = t;\n        dim = d;\n        arrayed = a;\n        shadow = s;\n        ms = m;\n        image = true;\n    }\n\n    // make a texture with no sampler\n    void setTexture(TBasicType t, TSamplerDim d, bool a = false, bool s = false, bool m = false)\n    {\n        clear();\n        type = t;\n        dim = d;\n        arrayed = a;\n        shadow = s;\n        ms = m;\n    }\n\n    // make a pure sampler, no texture, no image, nothing combined, the 'sampler' keyword\n    void setPureSampler(bool s)\n    {\n        clear();\n        sampler = true;\n        shadow = s;\n    }\n\n    // make a subpass input attachment\n    void setSubpass(TBasicType t, bool m = false)\n    {\n        clear();\n        type = t;\n        image = true;\n        dim = EsdSubpass;\n        ms = m;\n    }\n\n    // make an AttachmentEXT\n    void setAttachmentEXT(TBasicType t)\n    {\n        clear();\n        type = t;\n        image = true;\n        dim = EsdAttachmentEXT;\n    }\n\n    bool operator==(const TSampler& right) const\n    {\n        return      type == right.type &&\n                     dim == right.dim &&\n                 arrayed == right.arrayed &&\n                  shadow == right.shadow &&\n         isMultiSample() == right.isMultiSample() &&\n          isImageClass() == right.isImageClass() &&\n            isCombined() == right.isCombined() &&\n         isPureSampler() == right.isPureSampler() &&\n            isExternal() == right.isExternal() &&\n                 isYuv() == right.isYuv() &&\n  isTileAttachmentQCOM() == right.isTileAttachmentQCOM()\n#ifdef ENABLE_HLSL\n      && getVectorSize() == right.getVectorSize() &&\n  getStructReturnIndex() == right.getStructReturnIndex()\n#endif\n        ;\n    }\n\n    bool operator!=(const TSampler& right) const\n    {\n        return ! operator==(right);\n    }\n\n    TString getString() const\n    {\n        TString s;\n\n        if (isPureSampler()) {\n            s.append(\"sampler\");\n            return s;\n        }\n\n        switch (type) {\n        case EbtInt:    s.append(\"i\");   break;\n        case EbtUint:   s.append(\"u\");   break;\n        case EbtFloat16: s.append(\"f16\"); break;\n        case EbtBFloat16: s.append(\"bf16\"); break;\n        case EbtFloatE5M2: s.append(\"fe5m2\"); break;\n        case EbtFloatE4M3: s.append(\"fe4m3\"); break;\n        case EbtInt8:   s.append(\"i8\");  break;\n        case EbtUint16: s.append(\"u8\");  break;\n        case EbtInt16:  s.append(\"i16\"); break;\n        case EbtUint8:  s.append(\"u16\"); break;\n        case EbtInt64:  s.append(\"i64\"); break;\n        case EbtUint64: s.append(\"u64\"); break;\n        default:  break;\n        }\n        if (isImageClass()) {\n            if (isAttachmentEXT())\n                s.append(\"attachmentEXT\");\n            else if (isSubpass())\n                s.append(\"subpass\");\n            else if (isTileAttachmentQCOM())\n                s.append(\"attachmentQCOM\");\n            else\n                s.append(\"image\");\n        } else if (isCombined()) {\n            s.append(\"sampler\");\n        } else {\n            s.append(\"texture\");\n        }\n        if (isExternal()) {\n            s.append(\"ExternalOES\");\n            return s;\n        }\n        if (isYuv()) {\n            return \"__\" + s + \"External2DY2YEXT\";\n        }\n        switch (dim) {\n        case Esd2D:      s.append(\"2D\");      break;\n        case Esd3D:      s.append(\"3D\");      break;\n        case EsdCube:    s.append(\"Cube\");    break;\n        case Esd1D:         s.append(\"1D\");      break;\n        case EsdRect:       s.append(\"2DRect\");  break;\n        case EsdBuffer:     s.append(\"Buffer\");  break;\n        case EsdSubpass:    s.append(\"Input\"); break;\n        case EsdAttachmentEXT: s.append(\"\"); break;\n        default:  break;  // some compilers want this\n        }\n        if (isMultiSample())\n            s.append(\"MS\");\n        if (arrayed)\n            s.append(\"Array\");\n        if (shadow)\n            s.append(\"Shadow\");\n\n        return s;\n    }\n};\n\n//\n// Need to have association of line numbers to types in a list for building structs.\n//\nclass TType;\nstruct TTypeLoc {\n    TType* type;\n    TSourceLoc loc;\n};\ntypedef TVector<TTypeLoc> TTypeList;\n\ntypedef TVector<TString*> TIdentifierList;\n\nenum TLayoutMatrix {\n    ElmNone,\n    ElmRowMajor,\n    ElmColumnMajor, // default, but different than saying nothing\n    ElmCount        // If expanding, see bitfield width below\n};\n\n// Union of geometry shader and tessellation shader geometry types.\n// They don't go into TType, but rather have current state per shader or\n// active parser type (TPublicType).\nenum TLayoutGeometry {\n    ElgNone,\n    ElgPoints,\n    ElgLines,\n    ElgLinesAdjacency,\n    ElgLineStrip,\n    ElgTriangles,\n    ElgTrianglesAdjacency,\n    ElgTriangleStrip,\n    ElgQuads,\n    ElgIsolines,\n};\n\nenum TVertexSpacing {\n    EvsNone,\n    EvsEqual,\n    EvsFractionalEven,\n    EvsFractionalOdd\n};\n\nenum TVertexOrder {\n    EvoNone,\n    EvoCw,\n    EvoCcw\n};\n\n// Note: order matters, as type of format is done by comparison.\nenum TLayoutFormat {\n    ElfNone,\n\n    // Float image\n    ElfRgba32f,\n    ElfRgba16f,\n    ElfR32f,\n    ElfRgba8,\n    ElfRgba8Snorm,\n\n    ElfEsFloatGuard,    // to help with comparisons\n\n    ElfRg32f,\n    ElfRg16f,\n    ElfR11fG11fB10f,\n    ElfR16f,\n    ElfRgba16,\n    ElfRgb10A2,\n    ElfRg16,\n    ElfRg8,\n    ElfR16,\n    ElfR8,\n    ElfRgba16Snorm,\n    ElfRg16Snorm,\n    ElfRg8Snorm,\n    ElfR16Snorm,\n    ElfR8Snorm,\n\n    ElfFloatGuard,      // to help with comparisons\n\n    // Int image\n    ElfRgba32i,\n    ElfRgba16i,\n    ElfRgba8i,\n    ElfR32i,\n\n    ElfEsIntGuard,     // to help with comparisons\n\n    ElfRg32i,\n    ElfRg16i,\n    ElfRg8i,\n    ElfR16i,\n    ElfR8i,\n    ElfR64i,\n\n    ElfIntGuard,       // to help with comparisons\n\n    // Uint image\n    ElfRgba32ui,\n    ElfRgba16ui,\n    ElfRgba8ui,\n    ElfR32ui,\n\n    ElfEsUintGuard,    // to help with comparisons\n\n    ElfRg32ui,\n    ElfRg16ui,\n    ElfRgb10a2ui,\n    ElfRg8ui,\n    ElfR16ui,\n    ElfR8ui,\n    ElfR64ui,\n    ElfExtSizeGuard,   // to help with comparisons\n    ElfSize1x8,\n    ElfSize1x16,\n    ElfSize1x32,\n    ElfSize2x32,\n    ElfSize4x32,\n\n    ElfCount\n};\n\nenum TLayoutDepth {\n    EldNone,\n    EldAny,\n    EldGreater,\n    EldLess,\n    EldUnchanged,\n\n    EldCount\n};\n\nenum TLayoutStencil {\n    ElsNone,\n    ElsRefUnchangedFrontAMD,\n    ElsRefGreaterFrontAMD,\n    ElsRefLessFrontAMD,\n    ElsRefUnchangedBackAMD,\n    ElsRefGreaterBackAMD,\n    ElsRefLessBackAMD,\n\n    ElsCount\n};\n\nenum TBlendEquationShift {\n    // No 'EBlendNone':\n    // These are used as bit-shift amounts.  A mask of such shifts will have type 'int',\n    // and in that space, 0 means no bits set, or none.  In this enum, 0 means (1 << 0), a bit is set.\n    EBlendMultiply,\n    EBlendScreen,\n    EBlendOverlay,\n    EBlendDarken,\n    EBlendLighten,\n    EBlendColordodge,\n    EBlendColorburn,\n    EBlendHardlight,\n    EBlendSoftlight,\n    EBlendDifference,\n    EBlendExclusion,\n    EBlendHslHue,\n    EBlendHslSaturation,\n    EBlendHslColor,\n    EBlendHslLuminosity,\n    EBlendAllEquations,\n\n    EBlendCount\n};\n\nenum TInterlockOrdering {\n    EioNone,\n    EioPixelInterlockOrdered,\n    EioPixelInterlockUnordered,\n    EioSampleInterlockOrdered,\n    EioSampleInterlockUnordered,\n    EioShadingRateInterlockOrdered,\n    EioShadingRateInterlockUnordered,\n\n    EioCount,\n};\n\nenum TShaderInterface\n{\n    // Includes both uniform blocks and buffer blocks\n    EsiUniform = 0,\n    EsiInput,\n    EsiOutput,\n    EsiNone,\n\n    EsiCount\n};\n\nclass TQualifier {\npublic:\n    static const int layoutNotSet = -1;\n\n    void clear()\n    {\n        precision = EpqNone;\n        invariant = false;\n        makeTemporary();\n        declaredBuiltIn = EbvNone;\n        noContraction = false;\n        nullInit = false;\n        spirvByReference = false;\n        spirvLiteral = false;\n        defaultBlock = false;\n    }\n\n    // drop qualifiers that don't belong in a temporary variable\n    void makeTemporary()\n    {\n        semanticName = nullptr;\n        storage = EvqTemporary;\n        builtIn = EbvNone;\n        clearInterstage();\n        clearMemory();\n        specConstant = false;\n        nonUniform = false;\n        nullInit = false;\n        defaultBlock = false;\n        clearLayout();\n        spirvStorageClass = -1;\n        spirvDecorate = nullptr;\n        spirvByReference = false;\n        spirvLiteral = false;\n    }\n\n    void clearInterstage()\n    {\n        clearInterpolation();\n        patch = false;\n        sample = false;\n    }\n\n    void clearInterpolation()\n    {\n        centroid     = false;\n        smooth       = false;\n        flat         = false;\n        nopersp      = false;\n        explicitInterp = false;\n        pervertexNV = false;\n        perPrimitiveNV = false;\n        perViewNV = false;\n        perTaskNV = false;\n        pervertexEXT = false;\n    }\n\n    void clearMemory()\n    {\n        coherent     = false;\n        devicecoherent = false;\n        queuefamilycoherent = false;\n        workgroupcoherent = false;\n        subgroupcoherent  = false;\n        shadercallcoherent = false;\n        nonprivate = false;\n        volatil      = false;\n        nontemporal = false;\n        restrict     = false;\n        readonly     = false;\n        writeonly    = false;\n    }\n\n    const char*         semanticName;\n    TStorageQualifier   storage   : 7;\n    static_assert(EvqLast < 64, \"need to increase size of TStorageQualifier bitfields!\");\n    TBuiltInVariable    builtIn   : 9;\n    TBuiltInVariable    declaredBuiltIn : 9;\n    static_assert(EbvLast < 256, \"need to increase size of TBuiltInVariable bitfields!\");\n    TPrecisionQualifier precision : 3;\n    bool invariant    : 1; // require canonical treatment for cross-shader invariance\n    bool centroid     : 1;\n    bool smooth       : 1;\n    bool flat         : 1;\n    // having a constant_id is not sufficient: expressions have no id, but are still specConstant\n    bool specConstant : 1;\n    bool nonUniform   : 1;\n    bool explicitOffset   : 1;\n    bool defaultBlock : 1; // default blocks with matching names have structures merged when linking\n\n    bool noContraction: 1; // prevent contraction and reassociation, e.g., for 'precise' keyword, and expressions it affects\n    bool nopersp      : 1;\n    bool explicitInterp : 1;\n    bool pervertexNV  : 1;\n    bool pervertexEXT : 1;\n    bool perPrimitiveNV : 1;\n    bool perViewNV : 1;\n    bool perTaskNV : 1;\n    bool patch        : 1;\n    bool sample       : 1;\n    bool restrict     : 1;\n    bool readonly     : 1;\n    bool writeonly    : 1;\n    bool coherent     : 1;\n    bool volatil      : 1;\n    bool nontemporal  : 1;\n    bool devicecoherent : 1;\n    bool queuefamilycoherent : 1;\n    bool workgroupcoherent : 1;\n    bool subgroupcoherent  : 1;\n    bool shadercallcoherent : 1;\n    bool nonprivate   : 1;\n    bool nullInit : 1;\n    bool spirvByReference : 1;\n    bool spirvLiteral : 1;\n    bool isWriteOnly() const { return writeonly; }\n    bool isReadOnly() const { return readonly; }\n    bool isRestrict() const { return restrict; }\n    bool isCoherent() const { return coherent; }\n    bool isVolatile() const { return volatil; }\n    bool isNonTemporal() const { return nontemporal; }\n    bool isSample() const { return sample; }\n    bool isMemory() const\n    {\n        return shadercallcoherent || subgroupcoherent || workgroupcoherent || queuefamilycoherent || devicecoherent || coherent || volatil || nontemporal || restrict || readonly || writeonly || nonprivate;\n    }\n    bool isMemoryQualifierImageAndSSBOOnly() const\n    {\n        return shadercallcoherent || subgroupcoherent || workgroupcoherent || queuefamilycoherent || devicecoherent || coherent || volatil || nontemporal || restrict || readonly || writeonly;\n    }\n    bool bufferReferenceNeedsVulkanMemoryModel() const\n    {\n        // include qualifiers that map to load/store availability/visibility/nonprivate memory access operands\n        return subgroupcoherent || workgroupcoherent || queuefamilycoherent || devicecoherent || coherent || nonprivate;\n    }\n    bool isInterpolation() const\n    {\n        return flat || smooth || nopersp || explicitInterp;\n    }\n    bool isExplicitInterpolation() const\n    {\n        return explicitInterp;\n    }\n    bool isAuxiliary() const\n    {\n        return centroid || patch || sample || pervertexNV || pervertexEXT;\n    }\n    bool isPatch() const { return patch; }\n    bool isNoContraction() const { return noContraction; }\n    void setNoContraction() { noContraction = true; }\n    bool isPervertexNV() const { return pervertexNV; }\n    bool isPervertexEXT() const { return pervertexEXT; }\n    void setNullInit() { nullInit = true; }\n    bool isNullInit() const { return nullInit; }\n    void setSpirvByReference() { spirvByReference = true; }\n    bool isSpirvByReference() const { return spirvByReference; }\n    void setSpirvLiteral() { spirvLiteral = true; }\n    bool isSpirvLiteral() const { return spirvLiteral; }\n\n    bool isPipeInput() const\n    {\n        switch (storage) {\n        case EvqVaryingIn:\n        case EvqFragCoord:\n        case EvqPointCoord:\n        case EvqFace:\n        case EvqVertexId:\n        case EvqInstanceId:\n            return true;\n        default:\n            return false;\n        }\n    }\n\n    bool isPipeOutput() const\n    {\n        switch (storage) {\n        case EvqPosition:\n        case EvqPointSize:\n        case EvqClipVertex:\n        case EvqVaryingOut:\n        case EvqFragColor:\n        case EvqFragDepth:\n        case EvqFragStencil:\n            return true;\n        default:\n            return false;\n        }\n    }\n\n    bool isParamInput() const\n    {\n        switch (storage) {\n        case EvqIn:\n        case EvqInOut:\n        case EvqConstReadOnly:\n            return true;\n        default:\n            return false;\n        }\n    }\n\n    bool isParamOutput() const\n    {\n        switch (storage) {\n        case EvqOut:\n        case EvqInOut:\n            return true;\n        default:\n            return false;\n        }\n    }\n\n    bool isUniformOrBuffer() const\n    {\n        switch (storage) {\n        case EvqUniform:\n        case EvqBuffer:\n            return true;\n        default:\n            return false;\n        }\n    }\n\n    bool isUniform() const\n    {\n        switch (storage) {\n        case EvqUniform:\n            return true;\n        default:\n            return false;\n        }\n    }\n\n    bool isIo() const\n    {\n        switch (storage) {\n        case EvqUniform:\n        case EvqBuffer:\n        case EvqVaryingIn:\n        case EvqFragCoord:\n        case EvqPointCoord:\n        case EvqFace:\n        case EvqVertexId:\n        case EvqInstanceId:\n        case EvqPosition:\n        case EvqPointSize:\n        case EvqClipVertex:\n        case EvqVaryingOut:\n        case EvqFragColor:\n        case EvqFragDepth:\n        case EvqFragStencil:\n            return true;\n        default:\n            return false;\n        }\n    }\n\n    // non-built-in symbols that might link between compilation units\n    bool isLinkable() const\n    {\n        switch (storage) {\n        case EvqGlobal:\n        case EvqVaryingIn:\n        case EvqVaryingOut:\n        case EvqUniform:\n        case EvqBuffer:\n        case EvqShared:\n            return true;\n        default:\n            return false;\n        }\n    }\n\n    TBlockStorageClass getBlockStorage() const {\n        if (storage == EvqUniform && !isPushConstant()) {\n            return EbsUniform;\n        }\n        else if (storage == EvqUniform) {\n            return EbsPushConstant;\n        }\n        else if (storage == EvqBuffer) {\n            return EbsStorageBuffer;\n        }\n        return EbsNone;\n    }\n\n    void setBlockStorage(TBlockStorageClass newBacking) {\n        layoutPushConstant = (newBacking == EbsPushConstant);\n        switch (newBacking) {\n        case EbsUniform :\n            if (layoutPacking == ElpStd430) {\n                // std430 would not be valid\n                layoutPacking = ElpStd140;\n            }\n            storage = EvqUniform;\n            break;\n        case EbsStorageBuffer :\n            storage = EvqBuffer;\n            break;\n        case EbsPushConstant :\n            storage = EvqUniform;\n            layoutSet = TQualifier::layoutSetEnd;\n            layoutBinding = TQualifier::layoutBindingEnd;\n            break;\n        default:\n            break;\n        }\n    }\n\n    bool isPerPrimitive() const { return perPrimitiveNV; }\n    bool isPerView() const { return perViewNV; }\n    bool isTaskMemory() const { return perTaskNV; }\n    bool isTaskPayload() const { return storage == EvqtaskPayloadSharedEXT; }\n    bool isAnyPayload() const {\n        return storage == EvqPayload || storage == EvqPayloadIn;\n    }\n    bool isAnyCallable() const {\n        return storage == EvqCallableData || storage == EvqCallableDataIn;\n    }\n    bool isHitObjectAttrNV() const {\n        return storage == EvqHitObjectAttrNV;\n    }\n\n    // True if this type of IO is supposed to be arrayed with extra level for per-vertex data\n    bool isArrayedIo(EShLanguage language) const\n    {\n        switch (language) {\n        case EShLangGeometry:\n            return isPipeInput();\n        case EShLangTessControl:\n            return ! patch && (isPipeInput() || isPipeOutput());\n        case EShLangTessEvaluation:\n            return ! patch && isPipeInput();\n        case EShLangFragment:\n            return (pervertexNV || pervertexEXT) && isPipeInput();\n        case EShLangMesh:\n            return ! perTaskNV && isPipeOutput();\n\n        default:\n            return false;\n        }\n    }\n\n    // Implementing an embedded layout-qualifier class here, since C++ can't have a real class bitfield\n    void clearLayout()  // all layout\n    {\n        clearUniformLayout();\n\n        layoutPushConstant = false;\n        layoutBufferReference = false;\n        layoutPassthrough = false;\n        layoutViewportRelative = false;\n        // -2048 as the default value indicating layoutSecondaryViewportRelative is not set\n        layoutSecondaryViewportRelativeOffset = -2048;\n        layoutShaderRecord = false;\n        layoutFullQuads = false;\n        layoutQuadDeriv = false;\n        layoutHitObjectShaderRecordNV = false;\n        layoutBindlessSampler = false;\n        layoutBindlessImage = false;\n        layoutBufferReferenceAlign = layoutBufferReferenceAlignEnd;\n        layoutFormat = ElfNone;\n\n        layoutTileAttachmentQCOM = false;\n\n        clearInterstageLayout();\n\n        layoutSpecConstantId = layoutSpecConstantIdEnd;\n    }\n    void clearInterstageLayout()\n    {\n        layoutLocation = layoutLocationEnd;\n        layoutComponent = layoutComponentEnd;\n        layoutIndex = layoutIndexEnd;\n        clearStreamLayout();\n        clearXfbLayout();\n    }\n\n    void clearStreamLayout()\n    {\n        layoutStream = layoutStreamEnd;\n    }\n    void clearXfbLayout()\n    {\n        layoutXfbBuffer = layoutXfbBufferEnd;\n        layoutXfbStride = layoutXfbStrideEnd;\n        layoutXfbOffset = layoutXfbOffsetEnd;\n    }\n\n    bool hasNonXfbLayout() const\n    {\n        return hasUniformLayout() ||\n               hasAnyLocation() ||\n               hasStream() ||\n               hasFormat() ||\n               isShaderRecord() ||\n               isPushConstant() ||\n               hasBufferReference();\n    }\n    bool hasLayout() const\n    {\n        return hasNonXfbLayout() ||\n               hasXfb();\n    }\n\n    TLayoutMatrix  layoutMatrix  : 3;\n    TLayoutPacking layoutPacking : 4;\n    int layoutOffset;\n    int layoutAlign;\n\n                 unsigned int layoutLocation             : 12;\n    static const unsigned int layoutLocationEnd      =  0xFFF;\n\n                 unsigned int layoutComponent            :  3;\n    static const unsigned int layoutComponentEnd      =     4;\n\n                 unsigned int layoutSet                  :  7;\n    static const unsigned int layoutSetEnd           =   0x3F;\n\n                 unsigned int layoutBinding              : 16;\n    static const unsigned int layoutBindingEnd      =  0xFFFF;\n\n                 unsigned int layoutIndex                :  8;\n    static const unsigned int layoutIndexEnd      =      0xFF;\n\n                 unsigned int layoutStream               :  8;\n    static const unsigned int layoutStreamEnd      =     0xFF;\n\n                 unsigned int layoutXfbBuffer            :  4;\n    static const unsigned int layoutXfbBufferEnd      =   0xF;\n\n                 unsigned int layoutXfbStride            : 14;\n    static const unsigned int layoutXfbStrideEnd     = 0x3FFF;\n\n                 unsigned int layoutXfbOffset            : 13;\n    static const unsigned int layoutXfbOffsetEnd     = 0x1FFF;\n\n                 unsigned int layoutAttachment           :  8;  // for input_attachment_index\n    static const unsigned int layoutAttachmentEnd      = 0XFF;\n\n                 unsigned int layoutSpecConstantId       : 11;\n    static const unsigned int layoutSpecConstantIdEnd = 0x7FF;\n\n    // stored as log2 of the actual alignment value\n                 unsigned int layoutBufferReferenceAlign :  6;\n    static const unsigned int layoutBufferReferenceAlignEnd = 0x3F;\n\n    TLayoutFormat layoutFormat                           :  8;\n\n    bool layoutPushConstant;\n    bool layoutBufferReference;\n    bool layoutPassthrough;\n    bool layoutViewportRelative;\n    int layoutSecondaryViewportRelativeOffset;\n    bool layoutShaderRecord;\n    bool layoutFullQuads;\n    bool layoutQuadDeriv;\n    bool layoutHitObjectShaderRecordNV;\n\n    // GL_EXT_spirv_intrinsics\n    int spirvStorageClass;\n    TSpirvDecorate* spirvDecorate;\n\n    bool layoutBindlessSampler;\n    bool layoutBindlessImage;\n\n    bool layoutTileAttachmentQCOM;\n\n    bool hasUniformLayout() const\n    {\n        return hasMatrix() ||\n               hasPacking() ||\n               hasOffset() ||\n               hasBinding() ||\n               hasSet() ||\n               hasAlign();\n    }\n    void clearUniformLayout() // only uniform specific\n    {\n        layoutMatrix = ElmNone;\n        layoutPacking = ElpNone;\n        layoutOffset = layoutNotSet;\n        layoutAlign = layoutNotSet;\n\n        layoutSet = layoutSetEnd;\n        layoutBinding = layoutBindingEnd;\n        layoutAttachment = layoutAttachmentEnd;\n    }\n\n    bool hasMatrix() const\n    {\n        return layoutMatrix != ElmNone;\n    }\n    bool hasPacking() const\n    {\n        return layoutPacking != ElpNone;\n    }\n    bool hasAlign() const\n    {\n        return layoutAlign != layoutNotSet;\n    }\n    bool hasAnyLocation() const\n    {\n        return hasLocation() ||\n               hasComponent() ||\n               hasIndex();\n    }\n    bool hasLocation() const\n    {\n        return layoutLocation != layoutLocationEnd;\n    }\n    bool hasSet() const\n    {\n        return layoutSet != layoutSetEnd;\n    }\n    bool hasBinding() const\n    {\n        return layoutBinding != layoutBindingEnd;\n    }\n    bool hasOffset() const\n    {\n        return layoutOffset != layoutNotSet;\n    }\n    bool isNonPerspective() const { return nopersp; }\n    bool hasIndex() const\n    {\n        return layoutIndex != layoutIndexEnd;\n    }\n    unsigned getIndex() const { return layoutIndex; }\n    bool hasComponent() const\n    {\n        return layoutComponent != layoutComponentEnd;\n    }\n    bool hasStream() const\n    {\n        return layoutStream != layoutStreamEnd;\n    }\n    bool hasFormat() const\n    {\n        return layoutFormat != ElfNone;\n    }\n    bool hasXfb() const\n    {\n        return hasXfbBuffer() ||\n               hasXfbStride() ||\n               hasXfbOffset();\n    }\n    bool hasXfbBuffer() const\n    {\n        return layoutXfbBuffer != layoutXfbBufferEnd;\n    }\n    bool hasXfbStride() const\n    {\n        return layoutXfbStride != layoutXfbStrideEnd;\n    }\n    bool hasXfbOffset() const\n    {\n        return layoutXfbOffset != layoutXfbOffsetEnd;\n    }\n    bool hasAttachment() const\n    {\n        return layoutAttachment != layoutAttachmentEnd;\n    }\n    TLayoutFormat getFormat() const { return layoutFormat; }\n    bool isPushConstant() const { return layoutPushConstant; }\n    bool isShaderRecord() const { return layoutShaderRecord; }\n    bool isFullQuads() const { return layoutFullQuads; }\n    bool isQuadDeriv() const { return layoutQuadDeriv; }\n    bool hasHitObjectShaderRecordNV() const { return layoutHitObjectShaderRecordNV; }\n    bool hasBufferReference() const { return layoutBufferReference; }\n    bool hasBufferReferenceAlign() const\n    {\n        return layoutBufferReferenceAlign != layoutBufferReferenceAlignEnd;\n    }\n    bool isNonUniform() const\n    {\n        return nonUniform;\n    }\n    bool isBindlessSampler() const\n    {\n        return layoutBindlessSampler;\n    }\n    bool isBindlessImage() const\n    {\n        return layoutBindlessImage;\n    }\n    bool isTileAttachmentQCOM() const\n    {\n        return layoutTileAttachmentQCOM;\n    }\n\n    // GL_EXT_spirv_intrinsics\n    bool hasSpirvDecorate() const { return spirvDecorate != nullptr; }\n    void setSpirvDecorate(int decoration, const TIntermAggregate* args = nullptr);\n    void setSpirvDecorateId(int decoration, const TIntermAggregate* args);\n    void setSpirvDecorateString(int decoration, const TIntermAggregate* args);\n    const TSpirvDecorate& getSpirvDecorate() const { assert(spirvDecorate); return *spirvDecorate; }\n    TSpirvDecorate& getSpirvDecorate() { assert(spirvDecorate); return *spirvDecorate; }\n    TString getSpirvDecorateQualifierString() const;\n\n    bool hasSpecConstantId() const\n    {\n        // Not the same thing as being a specialization constant, this\n        // is just whether or not it was declared with an ID.\n        return layoutSpecConstantId != layoutSpecConstantIdEnd;\n    }\n    bool isSpecConstant() const\n    {\n        // True if type is a specialization constant, whether or not it\n        // had a specialization-constant ID, and false if it is not a\n        // true front-end constant.\n        return specConstant;\n    }\n    bool isFrontEndConstant() const\n    {\n        // True if the front-end knows the final constant value.\n        // This allows front-end constant folding.\n        return storage == EvqConst && ! specConstant;\n    }\n    bool isConstant() const\n    {\n        // True if is either kind of constant; specialization or regular.\n        return isFrontEndConstant() || isSpecConstant();\n    }\n    void makeSpecConstant()\n    {\n        storage = EvqConst;\n        specConstant = true;\n    }\n    static const char* getLayoutPackingString(TLayoutPacking packing)\n    {\n        switch (packing) {\n        case ElpStd140:   return \"std140\";\n        case ElpPacked:   return \"packed\";\n        case ElpShared:   return \"shared\";\n        case ElpStd430:   return \"std430\";\n        case ElpScalar:   return \"scalar\";\n        default:          return \"none\";\n        }\n    }\n    static const char* getLayoutMatrixString(TLayoutMatrix m)\n    {\n        switch (m) {\n        case ElmColumnMajor: return \"column_major\";\n        case ElmRowMajor:    return \"row_major\";\n        default:             return \"none\";\n        }\n    }\n    static const char* getLayoutFormatString(TLayoutFormat f)\n    {\n        switch (f) {\n        case ElfRgba32f:      return \"rgba32f\";\n        case ElfRgba16f:      return \"rgba16f\";\n        case ElfRg32f:        return \"rg32f\";\n        case ElfRg16f:        return \"rg16f\";\n        case ElfR11fG11fB10f: return \"r11f_g11f_b10f\";\n        case ElfR32f:         return \"r32f\";\n        case ElfR16f:         return \"r16f\";\n        case ElfRgba16:       return \"rgba16\";\n        case ElfRgb10A2:      return \"rgb10_a2\";\n        case ElfRgba8:        return \"rgba8\";\n        case ElfRg16:         return \"rg16\";\n        case ElfRg8:          return \"rg8\";\n        case ElfR16:          return \"r16\";\n        case ElfR8:           return \"r8\";\n        case ElfRgba16Snorm:  return \"rgba16_snorm\";\n        case ElfRgba8Snorm:   return \"rgba8_snorm\";\n        case ElfRg16Snorm:    return \"rg16_snorm\";\n        case ElfRg8Snorm:     return \"rg8_snorm\";\n        case ElfR16Snorm:     return \"r16_snorm\";\n        case ElfR8Snorm:      return \"r8_snorm\";\n\n        case ElfRgba32i:      return \"rgba32i\";\n        case ElfRgba16i:      return \"rgba16i\";\n        case ElfRgba8i:       return \"rgba8i\";\n        case ElfRg32i:        return \"rg32i\";\n        case ElfRg16i:        return \"rg16i\";\n        case ElfRg8i:         return \"rg8i\";\n        case ElfR32i:         return \"r32i\";\n        case ElfR16i:         return \"r16i\";\n        case ElfR8i:          return \"r8i\";\n\n        case ElfRgba32ui:     return \"rgba32ui\";\n        case ElfRgba16ui:     return \"rgba16ui\";\n        case ElfRgba8ui:      return \"rgba8ui\";\n        case ElfRg32ui:       return \"rg32ui\";\n        case ElfRg16ui:       return \"rg16ui\";\n        case ElfRgb10a2ui:    return \"rgb10_a2ui\";\n        case ElfRg8ui:        return \"rg8ui\";\n        case ElfR32ui:        return \"r32ui\";\n        case ElfR16ui:        return \"r16ui\";\n        case ElfR8ui:         return \"r8ui\";\n        case ElfR64ui:        return \"r64ui\";\n        case ElfR64i:         return \"r64i\";\n        case ElfSize1x8:      return \"size1x8\";\n        case ElfSize1x16:     return \"size1x16\";\n        case ElfSize1x32:     return \"size1x32\";\n        case ElfSize2x32:     return \"size2x32\";\n        case ElfSize4x32:     return \"size4x32\";\n        default:              return \"none\";\n        }\n    }\n    static const char* getLayoutDepthString(TLayoutDepth d)\n    {\n        switch (d) {\n        case EldAny:       return \"depth_any\";\n        case EldGreater:   return \"depth_greater\";\n        case EldLess:      return \"depth_less\";\n        case EldUnchanged: return \"depth_unchanged\";\n        default:           return \"none\";\n        }\n    }\n    static const char* getLayoutStencilString(TLayoutStencil s)\n    {\n        switch (s) {\n        case ElsRefUnchangedFrontAMD: return \"stencil_ref_unchanged_front_amd\";\n        case ElsRefGreaterFrontAMD:   return \"stencil_ref_greater_front_amd\";\n        case ElsRefLessFrontAMD:      return \"stencil_ref_less_front_amd\";\n        case ElsRefUnchangedBackAMD:  return \"stencil_ref_unchanged_back_amd\";\n        case ElsRefGreaterBackAMD:    return \"stencil_ref_greater_back_amd\";\n        case ElsRefLessBackAMD:       return \"stencil_ref_less_back_amd\";\n        default:                      return \"none\";\n        }\n    }\n    static const char* getBlendEquationString(TBlendEquationShift e)\n    {\n        switch (e) {\n        case EBlendMultiply:      return \"blend_support_multiply\";\n        case EBlendScreen:        return \"blend_support_screen\";\n        case EBlendOverlay:       return \"blend_support_overlay\";\n        case EBlendDarken:        return \"blend_support_darken\";\n        case EBlendLighten:       return \"blend_support_lighten\";\n        case EBlendColordodge:    return \"blend_support_colordodge\";\n        case EBlendColorburn:     return \"blend_support_colorburn\";\n        case EBlendHardlight:     return \"blend_support_hardlight\";\n        case EBlendSoftlight:     return \"blend_support_softlight\";\n        case EBlendDifference:    return \"blend_support_difference\";\n        case EBlendExclusion:     return \"blend_support_exclusion\";\n        case EBlendHslHue:        return \"blend_support_hsl_hue\";\n        case EBlendHslSaturation: return \"blend_support_hsl_saturation\";\n        case EBlendHslColor:      return \"blend_support_hsl_color\";\n        case EBlendHslLuminosity: return \"blend_support_hsl_luminosity\";\n        case EBlendAllEquations:  return \"blend_support_all_equations\";\n        default:                  return \"unknown\";\n        }\n    }\n    static const char* getGeometryString(TLayoutGeometry geometry)\n    {\n        switch (geometry) {\n        case ElgPoints:             return \"points\";\n        case ElgLines:              return \"lines\";\n        case ElgLinesAdjacency:     return \"lines_adjacency\";\n        case ElgLineStrip:          return \"line_strip\";\n        case ElgTriangles:          return \"triangles\";\n        case ElgTrianglesAdjacency: return \"triangles_adjacency\";\n        case ElgTriangleStrip:      return \"triangle_strip\";\n        case ElgQuads:              return \"quads\";\n        case ElgIsolines:           return \"isolines\";\n        default:                    return \"none\";\n        }\n    }\n    static const char* getVertexSpacingString(TVertexSpacing spacing)\n    {\n        switch (spacing) {\n        case EvsEqual:              return \"equal_spacing\";\n        case EvsFractionalEven:     return \"fractional_even_spacing\";\n        case EvsFractionalOdd:      return \"fractional_odd_spacing\";\n        default:                    return \"none\";\n        }\n    }\n    static const char* getVertexOrderString(TVertexOrder order)\n    {\n        switch (order) {\n        case EvoCw:                 return \"cw\";\n        case EvoCcw:                return \"ccw\";\n        default:                    return \"none\";\n        }\n    }\n    static int mapGeometryToSize(TLayoutGeometry geometry)\n    {\n        switch (geometry) {\n        case ElgPoints:             return 1;\n        case ElgLines:              return 2;\n        case ElgLinesAdjacency:     return 4;\n        case ElgTriangles:          return 3;\n        case ElgTrianglesAdjacency: return 6;\n        default:                    return 0;\n        }\n    }\n    static const char* getInterlockOrderingString(TInterlockOrdering order)\n    {\n        switch (order) {\n        case EioPixelInterlockOrdered:          return \"pixel_interlock_ordered\";\n        case EioPixelInterlockUnordered:        return \"pixel_interlock_unordered\";\n        case EioSampleInterlockOrdered:         return \"sample_interlock_ordered\";\n        case EioSampleInterlockUnordered:       return \"sample_interlock_unordered\";\n        case EioShadingRateInterlockOrdered:    return \"shading_rate_interlock_ordered\";\n        case EioShadingRateInterlockUnordered:  return \"shading_rate_interlock_unordered\";\n        default:                                return \"none\";\n        }\n    }\n};\n\n// Qualifiers that don't need to be kept per object.  They have shader scope, not object scope.\n// So, they will not be part of TType, TQualifier, etc.\nstruct TShaderQualifiers {\n    TLayoutGeometry geometry; // geometry/tessellation shader in/out primitives\n    bool pixelCenterInteger;  // fragment shader\n    bool originUpperLeft;     // fragment shader\n    int invocations;\n    int vertices;             // for tessellation \"vertices\", geometry & mesh \"max_vertices\"\n    TVertexSpacing spacing;\n    TVertexOrder order;\n    bool pointMode;\n    int localSize[3];         // compute shader\n    bool localSizeNotDefault[3];        // compute shader\n    int localSizeSpecId[3];   // compute shader specialization id for gl_WorkGroupSize\n    bool earlyFragmentTests;  // fragment input\n    bool postDepthCoverage;   // fragment input\n    bool earlyAndLateFragmentTestsAMD; //fragment input\n    bool nonCoherentColorAttachmentReadEXT;    // fragment input\n    bool nonCoherentDepthAttachmentReadEXT;    // fragment input\n    bool nonCoherentStencilAttachmentReadEXT;  // fragment input\n    TLayoutDepth layoutDepth;\n    TLayoutStencil layoutStencil;\n    bool blendEquation;       // true if any blend equation was specified\n    int numViews;             // multiview extenstions\n    TInterlockOrdering interlockOrdering;\n    bool layoutOverrideCoverage;        // true if layout override_coverage set\n    bool layoutDerivativeGroupQuads;    // true if layout derivative_group_quadsNV set\n    bool layoutDerivativeGroupLinear;   // true if layout derivative_group_linearNV set\n    int primitives;                     // mesh shader \"max_primitives\"DerivativeGroupLinear;   // true if layout derivative_group_linearNV set\n    bool layoutPrimitiveCulling;        // true if layout primitive_culling set\n    bool layoutNonCoherentTileAttachmentReadQCOM; // fragment shaders -- per object\n    int  layoutTileShadingRateQCOM[3];  // compute shader\n    bool layoutTileShadingRateQCOMNotDefault[3];  // compute shader\n    TLayoutDepth getDepth() const { return layoutDepth; }\n    TLayoutStencil getStencil() const { return layoutStencil; }\n\n    void init()\n    {\n        geometry = ElgNone;\n        originUpperLeft = false;\n        pixelCenterInteger = false;\n        invocations = TQualifier::layoutNotSet;\n        vertices = TQualifier::layoutNotSet;\n        spacing = EvsNone;\n        order = EvoNone;\n        pointMode = false;\n        localSize[0] = 1;\n        localSize[1] = 1;\n        localSize[2] = 1;\n        localSizeNotDefault[0] = false;\n        localSizeNotDefault[1] = false;\n        localSizeNotDefault[2] = false;\n        localSizeSpecId[0] = TQualifier::layoutNotSet;\n        localSizeSpecId[1] = TQualifier::layoutNotSet;\n        localSizeSpecId[2] = TQualifier::layoutNotSet;\n        earlyFragmentTests = false;\n        earlyAndLateFragmentTestsAMD = false;\n        postDepthCoverage = false;\n        nonCoherentColorAttachmentReadEXT = false;\n        nonCoherentDepthAttachmentReadEXT = false;\n        nonCoherentStencilAttachmentReadEXT = false;\n        layoutDepth = EldNone;\n        layoutStencil = ElsNone;\n        blendEquation = false;\n        numViews = TQualifier::layoutNotSet;\n        layoutOverrideCoverage      = false;\n        layoutDerivativeGroupQuads  = false;\n        layoutDerivativeGroupLinear = false;\n        layoutPrimitiveCulling      = false;\n        layoutNonCoherentTileAttachmentReadQCOM = false;\n        layoutTileShadingRateQCOM[0] = 0;\n        layoutTileShadingRateQCOM[1] = 0;\n        layoutTileShadingRateQCOM[2] = 0;\n        layoutTileShadingRateQCOMNotDefault[0] = false;\n        layoutTileShadingRateQCOMNotDefault[1] = false;\n        layoutTileShadingRateQCOMNotDefault[2] = false;\n        primitives                  = TQualifier::layoutNotSet;\n        interlockOrdering = EioNone;\n    }\n\n    bool hasBlendEquation() const { return blendEquation; }\n\n    // Merge in characteristics from the 'src' qualifier.  They can override when\n    // set, but never erase when not set.\n    void merge(const TShaderQualifiers& src)\n    {\n        if (src.geometry != ElgNone)\n            geometry = src.geometry;\n        if (src.pixelCenterInteger)\n            pixelCenterInteger = src.pixelCenterInteger;\n        if (src.originUpperLeft)\n            originUpperLeft = src.originUpperLeft;\n        if (src.invocations != TQualifier::layoutNotSet)\n            invocations = src.invocations;\n        if (src.vertices != TQualifier::layoutNotSet)\n            vertices = src.vertices;\n        if (src.spacing != EvsNone)\n            spacing = src.spacing;\n        if (src.order != EvoNone)\n            order = src.order;\n        if (src.pointMode)\n            pointMode = true;\n        for (int i = 0; i < 3; ++i) {\n            if (src.localSize[i] > 1)\n                localSize[i] = src.localSize[i];\n        }\n        for (int i = 0; i < 3; ++i) {\n            localSizeNotDefault[i] = src.localSizeNotDefault[i] || localSizeNotDefault[i];\n        }\n        for (int i = 0; i < 3; ++i) {\n            if (src.localSizeSpecId[i] != TQualifier::layoutNotSet)\n                localSizeSpecId[i] = src.localSizeSpecId[i];\n        }\n        if (src.earlyFragmentTests)\n            earlyFragmentTests = true;\n        if (src.earlyAndLateFragmentTestsAMD)\n            earlyAndLateFragmentTestsAMD = true;\n        if (src.postDepthCoverage)\n            postDepthCoverage = true;\n        if (src.nonCoherentColorAttachmentReadEXT)\n            nonCoherentColorAttachmentReadEXT = true;\n        if (src.nonCoherentDepthAttachmentReadEXT)\n            nonCoherentDepthAttachmentReadEXT = true;\n        if (src.nonCoherentStencilAttachmentReadEXT)\n            nonCoherentStencilAttachmentReadEXT = true;\n        if (src.layoutDepth)\n            layoutDepth = src.layoutDepth;\n        if (src.layoutStencil)\n            layoutStencil = src.layoutStencil;\n        if (src.blendEquation)\n            blendEquation = src.blendEquation;\n        if (src.numViews != TQualifier::layoutNotSet)\n            numViews = src.numViews;\n        if (src.layoutOverrideCoverage)\n            layoutOverrideCoverage = src.layoutOverrideCoverage;\n        if (src.layoutDerivativeGroupQuads)\n            layoutDerivativeGroupQuads = src.layoutDerivativeGroupQuads;\n        if (src.layoutDerivativeGroupLinear)\n            layoutDerivativeGroupLinear = src.layoutDerivativeGroupLinear;\n        if (src.primitives != TQualifier::layoutNotSet)\n            primitives = src.primitives;\n        if (src.interlockOrdering != EioNone)\n            interlockOrdering = src.interlockOrdering;\n        if (src.layoutPrimitiveCulling)\n            layoutPrimitiveCulling = src.layoutPrimitiveCulling;\n        if (src.layoutNonCoherentTileAttachmentReadQCOM)\n            layoutNonCoherentTileAttachmentReadQCOM = src.layoutNonCoherentTileAttachmentReadQCOM;\n        for (int i = 0; i < 3; ++i) {\n            if (src.layoutTileShadingRateQCOM[i] > 1)\n                layoutTileShadingRateQCOM[i] = src.layoutTileShadingRateQCOM[i];\n        }\n        for (int i = 0; i < 3; ++i) {\n            layoutTileShadingRateQCOMNotDefault[i] = src.layoutTileShadingRateQCOMNotDefault[i] || layoutTileShadingRateQCOMNotDefault[i];\n        }\n    }\n};\n\nclass TTypeParameters {\npublic:\n    POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())\n\n    TTypeParameters() : basicType(EbtVoid), arraySizes(nullptr), spirvType(nullptr) {}\n\n    TBasicType basicType;\n    TArraySizes *arraySizes;\n    TSpirvType *spirvType;\n\n    bool operator==(const TTypeParameters& rhs) const\n    {\n        bool same = basicType == rhs.basicType && *arraySizes == *rhs.arraySizes;\n        if (same && basicType == EbtSpirvType) {\n            assert(spirvType && rhs.spirvType);\n            return *spirvType == *rhs.spirvType;\n        }\n        return same;\n    }\n    bool operator!=(const TTypeParameters& rhs) const\n    {\n        return !(*this == rhs);\n    }\n};\n\n//\n// TPublicType is just temporarily used while parsing and not quite the same\n// information kept per node in TType.  Due to the bison stack, it can't have\n// types that it thinks have non-trivial constructors.  It should\n// just be used while recognizing the grammar, not anything else.\n// Once enough is known about the situation, the proper information\n// moved into a TType, or the parse context, etc.\n//\nclass TPublicType {\npublic:\n    TBasicType basicType;\n    TSampler sampler;\n    TQualifier qualifier;\n    TShaderQualifiers shaderQualifiers;\n    uint32_t vectorSize  : 4;\n    uint32_t matrixCols  : 4;\n    uint32_t matrixRows  : 4;\n    bool coopmatNV  : 1;\n    bool coopmatKHR : 1;\n    bool coopvecNV  : 1;\n    bool tileAttachmentQCOM: 1;\n    TArraySizes* arraySizes;\n    const TType* userDef;\n    TSourceLoc loc;\n    TTypeParameters* typeParameters;\n    // SPIR-V type defined by spirv_type directive\n    TSpirvType* spirvType;\n\n    bool isCoopmat() const { return coopmatNV || coopmatKHR; }\n    bool isCoopmatNV() const { return coopmatNV; }\n    bool isCoopmatKHR() const { return coopmatKHR; }\n    bool isCoopvecNV() const { return coopvecNV; }\n    bool isCoopmatOrvec() const { return isCoopmat() || isCoopvecNV(); }\n\n    bool isTensorLayoutNV() const { return basicType == EbtTensorLayoutNV; }\n    bool isTensorViewNV() const { return basicType == EbtTensorViewNV; }\n\n    void initType(const TSourceLoc& l)\n    {\n        basicType = EbtVoid;\n        vectorSize = 1u;\n        matrixRows = 0;\n        matrixCols = 0;\n        arraySizes = nullptr;\n        userDef = nullptr;\n        loc = l;\n        typeParameters = nullptr;\n        coopmatNV = false;\n        coopmatKHR = false;\n        coopvecNV = false;\n        tileAttachmentQCOM = false;\n        spirvType = nullptr;\n    }\n\n    void initQualifiers(bool global = false)\n    {\n        qualifier.clear();\n        if (global)\n            qualifier.storage = EvqGlobal;\n    }\n\n    void init(const TSourceLoc& l, bool global = false)\n    {\n        initType(l);\n        sampler.clear();\n        initQualifiers(global);\n        shaderQualifiers.init();\n    }\n\n    void setVector(int s)\n    {\n        matrixRows = 0;\n        matrixCols = 0;\n        assert(s >= 0);\n        vectorSize = static_cast<uint32_t>(s) & 0b1111;\n    }\n\n    void setMatrix(int c, int r)\n    {\n        assert(r >= 0);\n        matrixRows = static_cast<uint32_t>(r) & 0b1111;\n        assert(c >= 0);\n        matrixCols = static_cast<uint32_t>(c) & 0b1111;\n        vectorSize = 0;\n    }\n\n    bool isScalar() const\n    {\n        return matrixCols == 0u && vectorSize == 1u && arraySizes == nullptr && userDef == nullptr;\n    }\n\n    // GL_EXT_spirv_intrinsics\n    void setSpirvType(const TSpirvInstruction& spirvInst, const TSpirvTypeParameters* typeParams = nullptr);\n\n    // \"Image\" is a superset of \"Subpass\"\n    bool isImage()      const { return basicType == EbtSampler && sampler.isImage(); }\n    bool isSubpass()    const { return basicType == EbtSampler && sampler.isSubpass(); }\n    bool isAttachmentEXT() const { return basicType == EbtSampler && sampler.isAttachmentEXT(); }\n};\n\n//\n// Base class for things that have a type.\n//\nclass TType {\npublic:\n    POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())\n\n    // for \"empty\" type (no args) or simple scalar/vector/matrix\n    explicit TType(TBasicType t = EbtVoid, TStorageQualifier q = EvqTemporary, int vs = 1, int mc = 0, int mr = 0,\n                   bool isVector = false) :\n                            basicType(t), vectorSize(static_cast<uint32_t>(vs) & 0b1111), matrixCols(static_cast<uint32_t>(mc) & 0b1111), matrixRows(static_cast<uint32_t>(mr) & 0b1111), vector1(isVector && vs == 1), coopmatNV(false), coopmatKHR(false), coopmatKHRuse(0), coopmatKHRUseValid(false), coopvecNV(false),\n                            tileAttachmentQCOM(false), arraySizes(nullptr), structure(nullptr), fieldName(nullptr), typeName(nullptr), typeParameters(nullptr),\n                            spirvType(nullptr)\n                            {\n                                assert(vs >= 0);\n                                assert(mc >= 0);\n                                assert(mr >= 0);\n\n                                sampler.clear();\n                                qualifier.clear();\n                                qualifier.storage = q;\n                                assert(!(isMatrix() && vectorSize != 0));  // prevent vectorSize != 0 on matrices\n                            }\n    // for explicit precision qualifier\n    TType(TBasicType t, TStorageQualifier q, TPrecisionQualifier p, int vs = 1, int mc = 0, int mr = 0,\n          bool isVector = false) :\n                            basicType(t), vectorSize(static_cast<uint32_t>(vs) & 0b1111), matrixCols(static_cast<uint32_t>(mc) & 0b1111), matrixRows(static_cast<uint32_t>(mr) & 0b1111), vector1(isVector && vs == 1), coopmatNV(false), coopmatKHR(false), coopmatKHRuse(0), coopmatKHRUseValid(false), coopvecNV(false),\n                            tileAttachmentQCOM(false), arraySizes(nullptr), structure(nullptr), fieldName(nullptr), typeName(nullptr), typeParameters(nullptr),\n                            spirvType(nullptr)\n                            {\n                                assert(vs >= 0);\n                                assert(mc >= 0);\n                                assert(mr >= 0);\n\n                                sampler.clear();\n                                qualifier.clear();\n                                qualifier.storage = q;\n                                qualifier.precision = p;\n                                assert(p >= EpqNone && p <= EpqHigh);\n                                assert(!(isMatrix() && vectorSize != 0));  // prevent vectorSize != 0 on matrices\n                            }\n    // for turning a TPublicType into a TType, using a shallow copy\n    explicit TType(const TPublicType& p) :\n                            basicType(p.basicType),\n                            vectorSize(p.vectorSize), matrixCols(p.matrixCols), matrixRows(p.matrixRows), vector1(false), coopmatNV(p.coopmatNV), coopmatKHR(p.coopmatKHR), coopmatKHRuse(0), coopmatKHRUseValid(false), coopvecNV(p.coopvecNV),\n                            tileAttachmentQCOM(p.tileAttachmentQCOM), arraySizes(p.arraySizes), structure(nullptr), fieldName(nullptr), typeName(nullptr), typeParameters(p.typeParameters),\n                            spirvType(p.spirvType)\n                            {\n                                if (basicType == EbtSampler)\n                                    sampler = p.sampler;\n                                else\n                                    sampler.clear();\n                                qualifier = p.qualifier;\n                                if (p.userDef) {\n                                    if (p.userDef->basicType == EbtReference) {\n                                        basicType = EbtReference;\n                                        referentType = p.userDef->referentType;\n                                    } else {\n                                        structure = p.userDef->getWritableStruct();  // public type is short-lived; there are no sharing issues\n                                    }\n                                    typeName = NewPoolTString(p.userDef->getTypeName().c_str());\n                                }\n                                if (p.isCoopmatNV() && p.typeParameters && p.typeParameters->arraySizes->getNumDims() > 0) {\n                                    int numBits = p.typeParameters->arraySizes->getDimSize(0);\n                                    if (p.basicType == EbtFloat && numBits == 16) {\n                                        basicType = EbtFloat16;\n                                        qualifier.precision = EpqNone;\n                                    } else if (p.basicType == EbtUint && numBits == 8) {\n                                        basicType = EbtUint8;\n                                        qualifier.precision = EpqNone;\n                                    } else if (p.basicType == EbtUint && numBits == 16) {\n                                        basicType = EbtUint16;\n                                        qualifier.precision = EpqNone;\n                                    } else if (p.basicType == EbtInt && numBits == 8) {\n                                        basicType = EbtInt8;\n                                        qualifier.precision = EpqNone;\n                                    } else if (p.basicType == EbtInt && numBits == 16) {\n                                        basicType = EbtInt16;\n                                        qualifier.precision = EpqNone;\n                                    }\n                                }\n                                if (p.isCoopmatKHR() && p.typeParameters && p.typeParameters->arraySizes->getNumDims() > 0) {\n                                    basicType = p.typeParameters->basicType;\n                                    if (isSpirvType()) {\n                                        assert(p.typeParameters->spirvType);\n                                        spirvType = p.typeParameters->spirvType;\n                                    }\n\n                                    if (p.typeParameters->arraySizes->getNumDims() == 4) {\n                                        const int dimSize = p.typeParameters->arraySizes->getDimSize(3);\n                                        assert(dimSize >= 0);\n                                        coopmatKHRuse = static_cast<uint32_t>(dimSize) & 0b111;\n                                        coopmatKHRUseValid = true;\n                                    }\n                                }\n                                if (p.isCoopvecNV() && p.typeParameters) {\n                                    basicType = p.typeParameters->basicType;\n                                }\n                            }\n    // for construction of sampler types\n    TType(const TSampler& sampler, TStorageQualifier q = EvqUniform, TArraySizes* as = nullptr) :\n        basicType(EbtSampler), vectorSize(1u), matrixCols(0u), matrixRows(0u), vector1(false), coopmatNV(false), coopmatKHR(false), coopmatKHRuse(0), coopmatKHRUseValid(false), coopvecNV(false),\n        tileAttachmentQCOM(false), arraySizes(as), structure(nullptr), fieldName(nullptr), typeName(nullptr),\n        sampler(sampler), typeParameters(nullptr), spirvType(nullptr)\n    {\n        qualifier.clear();\n        qualifier.storage = q;\n    }\n    // to efficiently make a dereferenced type\n    // without ever duplicating the outer structure that will be thrown away\n    // and using only shallow copy\n    TType(const TType& type, int derefIndex, bool rowMajor = false)\n                            {\n                                if (type.isArray()) {\n                                    shallowCopy(type);\n                                    if (type.getArraySizes()->getNumDims() == 1) {\n                                        arraySizes = nullptr;\n                                    } else {\n                                        // want our own copy of the array, so we can edit it\n                                        arraySizes = new TArraySizes;\n                                        arraySizes->copyDereferenced(*type.arraySizes);\n                                    }\n                                } else if (type.basicType == EbtStruct || type.basicType == EbtBlock) {\n                                    // do a structure dereference\n                                    const TTypeList& memberList = *type.getStruct();\n                                    shallowCopy(*memberList[derefIndex].type);\n                                    return;\n                                } else {\n                                    // do a vector/matrix dereference\n                                    shallowCopy(type);\n                                    if (matrixCols > 0) {\n                                        // dereference from matrix to vector\n                                        if (rowMajor)\n                                            vectorSize = matrixCols;\n                                        else\n                                            vectorSize = matrixRows;\n                                        matrixCols = 0;\n                                        matrixRows = 0;\n                                        if (vectorSize == 1)\n                                            vector1 = true;\n                                    } else if (isVector()) {\n                                        // dereference from vector to scalar\n                                        vectorSize = 1;\n                                        vector1 = false;\n                                    } else if (isCoopMat() || isCoopVecNV()) {\n                                        coopmatNV = false;\n                                        coopmatKHR = false;\n                                        coopmatKHRuse = 0;\n                                        coopmatKHRUseValid = false;\n                                        coopvecNV = false;\n                                        typeParameters = nullptr;\n                                    } else if (isTileAttachmentQCOM()) {\n                                        tileAttachmentQCOM = false;\n                                        typeParameters = nullptr;\n                                    }\n                                }\n                            }\n    // for making structures, ...\n    TType(TTypeList* userDef, const TString& n) :\n                            basicType(EbtStruct), vectorSize(1), matrixCols(0), matrixRows(0), vector1(false), coopmatNV(false), coopmatKHR(false), coopmatKHRuse(0), coopmatKHRUseValid(false), coopvecNV(false),\n                            tileAttachmentQCOM(false), arraySizes(nullptr), structure(userDef), fieldName(nullptr), typeParameters(nullptr),\n                            spirvType(nullptr)\n                            {\n                                sampler.clear();\n                                qualifier.clear();\n                                typeName = NewPoolTString(n.c_str());\n                            }\n    // For interface blocks\n    TType(TTypeList* userDef, const TString& n, const TQualifier& q) :\n                            basicType(EbtBlock), vectorSize(1), matrixCols(0), matrixRows(0), vector1(false), coopmatNV(false), coopmatKHR(false), coopmatKHRuse(0), coopmatKHRUseValid(false), coopvecNV(false),\n                            tileAttachmentQCOM(false), qualifier(q), arraySizes(nullptr), structure(userDef), fieldName(nullptr), typeParameters(nullptr),\n                            spirvType(nullptr)\n                            {\n                                sampler.clear();\n                                typeName = NewPoolTString(n.c_str());\n                            }\n    // for block reference (first parameter must be EbtReference)\n    explicit TType(TBasicType t, const TType &p, const TString& n) :\n                            basicType(t), vectorSize(1), matrixCols(0), matrixRows(0), vector1(false), coopmatNV(false), coopmatKHR(false), coopmatKHRuse(0), coopmatKHRUseValid(false),\n                            tileAttachmentQCOM(false), arraySizes(nullptr), structure(nullptr), fieldName(nullptr), typeName(nullptr), typeParameters(nullptr),\n                            spirvType(nullptr)\n                            {\n                                assert(t == EbtReference);\n                                typeName = NewPoolTString(n.c_str());\n                                sampler.clear();\n                                qualifier.clear();\n                                qualifier.storage = p.qualifier.storage;\n                                referentType = p.clone();\n                            }\n    virtual ~TType() {}\n\n    // Not for use across pool pops; it will cause multiple instances of TType to point to the same information.\n    // This only works if that information (like a structure's list of types) does not change and\n    // the instances are sharing the same pool.\n    void shallowCopy(const TType& copyOf)\n    {\n        basicType = copyOf.basicType;\n        sampler = copyOf.sampler;\n        qualifier = copyOf.qualifier;\n        vectorSize = copyOf.vectorSize;\n        matrixCols = copyOf.matrixCols;\n        matrixRows = copyOf.matrixRows;\n        vector1 = copyOf.vector1;\n        arraySizes = copyOf.arraySizes;  // copying the pointer only, not the contents\n        fieldName = copyOf.fieldName;\n        typeName = copyOf.typeName;\n        if (isStruct()) {\n            structure = copyOf.structure;\n        } else {\n            referentType = copyOf.referentType;\n        }\n        typeParameters = copyOf.typeParameters;\n        spirvType = copyOf.spirvType;\n        coopmatNV = copyOf.isCoopMatNV();\n        coopmatKHR = copyOf.isCoopMatKHR();\n        coopmatKHRuse = copyOf.coopmatKHRuse;\n        coopmatKHRUseValid = copyOf.coopmatKHRUseValid;\n        coopvecNV = copyOf.isCoopVecNV();\n        tileAttachmentQCOM = copyOf.tileAttachmentQCOM;\n    }\n\n    // Make complete copy of the whole type graph rooted at 'copyOf'.\n    void deepCopy(const TType& copyOf)\n    {\n        TMap<TTypeList*,TTypeList*> copied;  // to enable copying a type graph as a graph, not a tree\n        deepCopy(copyOf, copied);\n    }\n\n    // Recursively make temporary\n    void makeTemporary()\n    {\n        getQualifier().makeTemporary();\n\n        if (isStruct())\n            for (unsigned int i = 0; i < structure->size(); ++i)\n                (*structure)[i].type->makeTemporary();\n    }\n\n    TType* clone() const\n    {\n        TType *newType = new TType();\n        newType->deepCopy(*this);\n\n        return newType;\n    }\n\n    void makeVector() { vector1 = true; }\n\n    virtual void hideMember() { basicType = EbtVoid; vectorSize = 1u; }\n    virtual bool hiddenMember() const { return basicType == EbtVoid; }\n\n    virtual void setFieldName(const TString& n) { fieldName = NewPoolTString(n.c_str()); }\n    virtual const TString& getTypeName() const\n    {\n        assert(typeName);\n        return *typeName;\n    }\n\n    virtual const TString& getFieldName() const\n    {\n        assert(fieldName);\n        return *fieldName;\n    }\n    TShaderInterface getShaderInterface() const\n    {\n        if (basicType != EbtBlock)\n            return EsiNone;\n\n        switch (qualifier.storage) {\n        default:\n            return EsiNone;\n        case EvqVaryingIn:\n            return EsiInput;\n        case EvqVaryingOut:\n            return EsiOutput;\n        case EvqUniform:\n        case EvqBuffer:\n            return EsiUniform;\n        }\n    }\n\n    virtual TBasicType getBasicType() const { return basicType; }\n    virtual const TSampler& getSampler() const { return sampler; }\n    virtual TSampler& getSampler() { return sampler; }\n\n    virtual       TQualifier& getQualifier()       { return qualifier; }\n    virtual const TQualifier& getQualifier() const { return qualifier; }\n\n    virtual int getVectorSize() const { return static_cast<int>(vectorSize); }  // returns 1 for either scalar or vector of size 1, valid for both\n    virtual int getMatrixCols() const { return static_cast<int>(matrixCols); }\n    virtual int getMatrixRows() const { return static_cast<int>(matrixRows); }\n    virtual int getOuterArraySize()  const { return arraySizes->getOuterSize(); }\n    virtual TIntermTyped*  getOuterArrayNode() const { return arraySizes->getOuterNode(); }\n    virtual int getCumulativeArraySize()  const { return arraySizes->getCumulativeSize(); }\n    bool isArrayOfArrays() const { return arraySizes != nullptr && arraySizes->getNumDims() > 1; }\n    virtual int getImplicitArraySize() const { return arraySizes->getImplicitSize(); }\n    virtual const TArraySizes* getArraySizes() const { return arraySizes; }\n    virtual       TArraySizes* getArraySizes()       { return arraySizes; }\n    virtual TType* getReferentType() const { return referentType; }\n    virtual const TTypeParameters* getTypeParameters() const { return typeParameters; }\n    virtual       TTypeParameters* getTypeParameters()       { return typeParameters; }\n\n    virtual bool isScalar() const { return ! isVector() && ! isMatrix() && ! isStruct() && ! isArray() && ! isCoopVecNV(); }\n    virtual bool isScalarOrVec1() const { return isScalar() || vector1; }\n    virtual bool isScalarOrVector() const { return !isMatrix() && !isStruct() && !isArray(); }\n    virtual bool isVector() const { return vectorSize > 1u || vector1; }\n    virtual bool isMatrix() const { return matrixCols ? true : false; }\n    virtual bool isArray()  const { return arraySizes != nullptr; }\n    virtual bool isSizedArray() const { return isArray() && arraySizes->isSized(); }\n    virtual bool isUnsizedArray() const { return isArray() && !arraySizes->isSized(); }\n    virtual bool isImplicitlySizedArray() const { return isArray() && arraySizes->isImplicitlySized(); }\n    virtual bool isArrayVariablyIndexed() const { assert(isArray()); return arraySizes->isVariablyIndexed(); }\n    virtual void setArrayVariablyIndexed() { assert(isArray()); arraySizes->setVariablyIndexed(); }\n    virtual void updateImplicitArraySize(int size) { assert(isArray()); arraySizes->updateImplicitSize(size); }\n    virtual void setImplicitlySized(bool isImplicitSized) { arraySizes->setImplicitlySized(isImplicitSized); }\n    virtual bool isStruct() const { return basicType == EbtStruct || basicType == EbtBlock; }\n    virtual bool isFloatingDomain() const { return basicType == EbtFloat || basicType == EbtDouble || basicType == EbtFloat16 ||\n                                                   basicType == EbtBFloat16 || basicType == EbtFloatE5M2 || basicType == EbtFloatE4M3; }\n    virtual bool isIntegerDomain() const\n    {\n        switch (basicType) {\n        case EbtInt8:\n        case EbtUint8:\n        case EbtInt16:\n        case EbtUint16:\n        case EbtInt:\n        case EbtUint:\n        case EbtInt64:\n        case EbtUint64:\n        case EbtAtomicUint:\n            return true;\n        default:\n            break;\n        }\n        return false;\n    }\n    virtual bool isOpaque() const { return basicType == EbtSampler\n            || basicType == EbtAtomicUint || basicType == EbtAccStruct || basicType == EbtRayQuery\n            || basicType == EbtHitObjectNV || isTileAttachmentQCOM(); }\n    virtual bool isBuiltIn() const { return getQualifier().builtIn != EbvNone; }\n\n    virtual bool isAttachmentEXT() const { return basicType == EbtSampler && getSampler().isAttachmentEXT(); }\n    virtual bool isImage() const { return basicType == EbtSampler && getSampler().isImage(); }\n    virtual bool isSubpass() const { return basicType == EbtSampler && getSampler().isSubpass(); }\n    virtual bool isTexture() const { return basicType == EbtSampler && getSampler().isTexture(); }\n    virtual bool isBindlessImage() const { return isImage() && qualifier.layoutBindlessImage; }\n    virtual bool isBindlessTexture() const { return isTexture() && qualifier.layoutBindlessSampler; }\n    // Check the block-name convention of creating a block without populating it's members:\n    virtual bool isUnusableName() const { return isStruct() && structure == nullptr; }\n    virtual bool isParameterized()  const { return typeParameters != nullptr; }\n    bool isAtomic() const { return basicType == EbtAtomicUint; }\n    bool isCoopMat() const { return coopmatNV || coopmatKHR; }\n    bool isCoopMatNV() const { return coopmatNV; }\n    bool isCoopMatKHR() const { return coopmatKHR; }\n    bool isCoopVecNV() const { return coopvecNV; }\n    bool isCoopMatOrVec() const { return isCoopMat() || isCoopVecNV(); }\n    bool isTileAttachmentQCOM() const { return tileAttachmentQCOM; }\n    bool isReference() const { return getBasicType() == EbtReference; }\n    bool isSpirvType() const { return getBasicType() == EbtSpirvType; }\n    int getCoopMatKHRuse() const { return static_cast<int>(coopmatKHRuse); }\n\n    bool isTensorLayoutNV() const { return getBasicType() == EbtTensorLayoutNV; }\n    bool isTensorViewNV() const { return getBasicType() == EbtTensorViewNV; }\n\n    // return true if this type contains any subtype which satisfies the given predicate.\n    template <typename P>\n    bool contains(P predicate) const\n    {\n        if (predicate(this))\n            return true;\n\n        const auto hasa = [predicate](const TTypeLoc& tl) { return tl.type->contains(predicate); };\n\n        return isStruct() && std::any_of(structure->begin(), structure->end(), hasa);\n    }\n\n    // Recursively checks if the type contains the given basic type\n    virtual bool containsBasicType(TBasicType checkType) const\n    {\n        return contains([checkType](const TType* t) { return t->basicType == checkType; } );\n    }\n\n    // Recursively check the structure for any arrays, needed for some error checks\n    virtual bool containsArray() const\n    {\n        return contains([](const TType* t) { return t->isArray(); } );\n    }\n\n    // Check the structure for any structures, needed for some error checks\n    virtual bool containsStructure() const\n    {\n        return contains([this](const TType* t) { return t != this && t->isStruct(); } );\n    }\n\n    // Recursively check the structure for any unsized arrays, needed for triggering a copyUp().\n    virtual bool containsUnsizedArray() const\n    {\n        return contains([](const TType* t) { return t->isUnsizedArray(); } );\n    }\n\n    virtual bool containsOpaque() const\n    {\n        return contains([](const TType* t) { return t->isOpaque(); } );\n    }\n\n    virtual bool containsSampler() const\n    {\n        return contains([](const TType* t) { return t->isTexture() || t->isImage(); });\n    }\n\n    // Recursively checks if the type contains a built-in variable\n    virtual bool containsBuiltIn() const\n    {\n        return contains([](const TType* t) { return t->isBuiltIn(); } );\n    }\n\n    virtual bool containsNonOpaque() const\n    {\n        const auto nonOpaque = [](const TType* t) {\n            switch (t->basicType) {\n            case EbtVoid:\n            case EbtFloat:\n            case EbtDouble:\n            case EbtFloat16:\n            case EbtBFloat16:\n            case EbtFloatE5M2:\n            case EbtFloatE4M3:\n            case EbtInt8:\n            case EbtUint8:\n            case EbtInt16:\n            case EbtUint16:\n            case EbtInt:\n            case EbtUint:\n            case EbtInt64:\n            case EbtUint64:\n            case EbtBool:\n            case EbtReference:\n                return true;\n            default:\n                return false;\n            }\n        };\n\n        return contains(nonOpaque);\n    }\n\n    virtual bool containsSpecializationSize() const\n    {\n        return contains([](const TType* t) { return t->isArray() && t->arraySizes->isOuterSpecialization(); } );\n    }\n\n    bool containsDouble() const\n    {\n        return containsBasicType(EbtDouble);\n    }\n    bool contains16BitFloat() const\n    {\n        return containsBasicType(EbtFloat16);\n    }\n    bool containsBFloat16() const\n    {\n        return containsBasicType(EbtBFloat16);\n    }\n    bool contains64BitInt() const\n    {\n        return containsBasicType(EbtInt64) || containsBasicType(EbtUint64);\n    }\n    bool contains16BitInt() const\n    {\n        return containsBasicType(EbtInt16) || containsBasicType(EbtUint16);\n    }\n    bool contains8BitInt() const\n    {\n        return containsBasicType(EbtInt8) || containsBasicType(EbtUint8);\n    }\n    bool containsCoopMat() const\n    {\n        return contains([](const TType* t) { return t->coopmatNV || t->coopmatKHR; } );\n    }\n    bool containsCoopVec() const\n    {\n        return contains([](const TType* t) { return t->coopvecNV; } );\n    }\n    bool containsReference() const\n    {\n        return containsBasicType(EbtReference);\n    }\n\n    // Array editing methods.  Array descriptors can be shared across\n    // type instances.  This allows all uses of the same array\n    // to be updated at once.  E.g., all nodes can be explicitly sized\n    // by tracking and correcting one implicit size.  Or, all nodes\n    // can get the explicit size on a redeclaration that gives size.\n    //\n    // N.B.:  Don't share with the shared symbol tables (symbols are\n    // marked as isReadOnly().  Such symbols with arrays that will be\n    // edited need to copyUp() on first use, so that\n    // A) the edits don't effect the shared symbol table, and\n    // B) the edits are shared across all users.\n    void updateArraySizes(const TType& type)\n    {\n        // For when we may already be sharing existing array descriptors,\n        // keeping the pointers the same, just updating the contents.\n        assert(arraySizes != nullptr);\n        assert(type.arraySizes != nullptr);\n        *arraySizes = *type.arraySizes;\n    }\n    void copyArraySizes(const TArraySizes& s)\n    {\n        // For setting a fresh new set of array sizes, not yet worrying about sharing.\n        arraySizes = new TArraySizes;\n        *arraySizes = s;\n    }\n    void transferArraySizes(TArraySizes* s)\n    {\n        // For setting an already allocated set of sizes that this type can use\n        // (no copy made).\n        arraySizes = s;\n    }\n    void clearArraySizes()\n    {\n        arraySizes = nullptr;\n    }\n\n    // Add inner array sizes, to any existing sizes, via copy; the\n    // sizes passed in can still be reused for other purposes.\n    void copyArrayInnerSizes(const TArraySizes* s)\n    {\n        if (s != nullptr) {\n            if (arraySizes == nullptr)\n                copyArraySizes(*s);\n            else\n                arraySizes->addInnerSizes(*s);\n        }\n    }\n    void changeOuterArraySize(int s) { arraySizes->changeOuterSize(s); }\n\n    // Recursively make the implicit array size the explicit array size.\n    // Expicit arrays are compile-time or link-time sized, never run-time sized.\n    // Sometimes, policy calls for an array to be run-time sized even if it was\n    // never variably indexed: Don't turn a 'skipNonvariablyIndexed' array into\n    // an explicit array.\n    void adoptImplicitArraySizes(bool skipNonvariablyIndexed)\n    {\n        if (isUnsizedArray() &&\n            (qualifier.builtIn == EbvSampleMask ||\n                !(skipNonvariablyIndexed || isArrayVariablyIndexed()))) {\n            changeOuterArraySize(getImplicitArraySize());\n            setImplicitlySized(true);\n        }\n        // For multi-dim per-view arrays, set unsized inner dimension size to 1\n        if (qualifier.isPerView() && arraySizes && arraySizes->isInnerUnsized())\n            arraySizes->clearInnerUnsized();\n        if (isStruct() && structure->size() > 0) {\n            int lastMember = (int)structure->size() - 1;\n            for (int i = 0; i < lastMember; ++i)\n                (*structure)[i].type->adoptImplicitArraySizes(false);\n            // implement the \"last member of an SSBO\" policy\n            (*structure)[lastMember].type->adoptImplicitArraySizes(getQualifier().storage == EvqBuffer);\n        }\n    }\n\n    void copyTypeParameters(const TTypeParameters& s)\n    {\n        // For setting a fresh new set of type parameters, not yet worrying about sharing.\n        typeParameters = new TTypeParameters;\n        *typeParameters = s;\n    }\n\n    const char* getBasicString() const\n    {\n        return TType::getBasicString(basicType);\n    }\n\n    static const char* getBasicString(TBasicType t)\n    {\n        switch (t) {\n        case EbtFloat:             return \"float\";\n        case EbtInt:               return \"int\";\n        case EbtUint:              return \"uint\";\n        case EbtSampler:           return \"sampler/image\";\n        case EbtVoid:              return \"void\";\n        case EbtDouble:            return \"double\";\n        case EbtFloat16:           return \"float16_t\";\n        case EbtBFloat16:          return \"bfloat16_t\";\n        case EbtFloatE5M2:         return \"floate5m2_t\";\n        case EbtFloatE4M3:         return \"floate4m3_t\";\n        case EbtInt8:              return \"int8_t\";\n        case EbtUint8:             return \"uint8_t\";\n        case EbtInt16:             return \"int16_t\";\n        case EbtUint16:            return \"uint16_t\";\n        case EbtInt64:             return \"int64_t\";\n        case EbtUint64:            return \"uint64_t\";\n        case EbtBool:              return \"bool\";\n        case EbtAtomicUint:        return \"atomic_uint\";\n        case EbtStruct:            return \"structure\";\n        case EbtBlock:             return \"block\";\n        case EbtAccStruct:         return \"accelerationStructureNV\";\n        case EbtRayQuery:          return \"rayQueryEXT\";\n        case EbtReference:         return \"reference\";\n        case EbtString:            return \"string\";\n        case EbtSpirvType:         return \"spirv_type\";\n        case EbtCoopmat:           return \"coopmat\";\n        case EbtTensorLayoutNV:    return \"tensorLayoutNV\";\n        case EbtTensorViewNV:      return \"tensorViewNV\";\n        case EbtCoopvecNV:         return \"coopvecNV\";\n        default:                   return \"unknown type\";\n        }\n    }\n\n    TString getCompleteString(bool syntactic = false, bool getQualifiers = true, bool getPrecision = true,\n                              bool getType = true, TString name = \"\", TString structName = \"\") const\n    {\n        TString typeString;\n\n        const auto appendStr  = [&](const char* s)  { typeString.append(s); };\n        const auto appendUint = [&](unsigned int u) { typeString.append(std::to_string(u).c_str()); };\n        const auto appendInt  = [&](int i)          { typeString.append(std::to_string(i).c_str()); };\n\n        if (getQualifiers) {\n          if (qualifier.hasSpirvDecorate())\n            appendStr(qualifier.getSpirvDecorateQualifierString().c_str());\n\n          if (qualifier.hasLayout()) {\n            // To reduce noise, skip this if the only layout is an xfb_buffer\n            // with no triggering xfb_offset.\n            TQualifier noXfbBuffer = qualifier;\n            noXfbBuffer.layoutXfbBuffer = TQualifier::layoutXfbBufferEnd;\n            if (noXfbBuffer.hasLayout()) {\n              appendStr(\"layout(\");\n              if (qualifier.hasAnyLocation()) {\n                appendStr(\" location=\");\n                appendUint(qualifier.layoutLocation);\n                if (qualifier.hasComponent()) {\n                  appendStr(\" component=\");\n                  appendUint(qualifier.layoutComponent);\n                }\n                if (qualifier.hasIndex()) {\n                  appendStr(\" index=\");\n                  appendUint(qualifier.layoutIndex);\n                }\n              }\n              if (qualifier.hasSet()) {\n                appendStr(\" set=\");\n                appendUint(qualifier.layoutSet);\n              }\n              if (qualifier.hasBinding()) {\n                appendStr(\" binding=\");\n                appendUint(qualifier.layoutBinding);\n              }\n              if (qualifier.hasStream()) {\n                appendStr(\" stream=\");\n                appendUint(qualifier.layoutStream);\n              }\n              if (qualifier.hasMatrix()) {\n                appendStr(\" \");\n                appendStr(TQualifier::getLayoutMatrixString(qualifier.layoutMatrix));\n              }\n              if (qualifier.hasPacking()) {\n                appendStr(\" \");\n                appendStr(TQualifier::getLayoutPackingString(qualifier.layoutPacking));\n              }\n              if (qualifier.hasOffset()) {\n                appendStr(\" offset=\");\n                appendInt(qualifier.layoutOffset);\n              }\n              if (qualifier.hasAlign()) {\n                appendStr(\" align=\");\n                appendInt(qualifier.layoutAlign);\n              }\n              if (qualifier.hasFormat()) {\n                appendStr(\" \");\n                appendStr(TQualifier::getLayoutFormatString(qualifier.layoutFormat));\n              }\n              if (qualifier.hasXfbBuffer() && qualifier.hasXfbOffset()) {\n                appendStr(\" xfb_buffer=\");\n                appendUint(qualifier.layoutXfbBuffer);\n              }\n              if (qualifier.hasXfbOffset()) {\n                appendStr(\" xfb_offset=\");\n                appendUint(qualifier.layoutXfbOffset);\n              }\n              if (qualifier.hasXfbStride()) {\n                appendStr(\" xfb_stride=\");\n                appendUint(qualifier.layoutXfbStride);\n              }\n              if (qualifier.hasAttachment()) {\n                appendStr(\" input_attachment_index=\");\n                appendUint(qualifier.layoutAttachment);\n              }\n              if (qualifier.hasSpecConstantId()) {\n                appendStr(\" constant_id=\");\n                appendUint(qualifier.layoutSpecConstantId);\n              }\n              if (qualifier.layoutPushConstant)\n                appendStr(\" push_constant\");\n              if (qualifier.layoutBufferReference)\n                appendStr(\" buffer_reference\");\n              if (qualifier.hasBufferReferenceAlign()) {\n                appendStr(\" buffer_reference_align=\");\n                appendUint(1u << qualifier.layoutBufferReferenceAlign);\n              }\n\n              if (qualifier.layoutPassthrough)\n                appendStr(\" passthrough\");\n              if (qualifier.layoutViewportRelative)\n                appendStr(\" layoutViewportRelative\");\n              if (qualifier.layoutSecondaryViewportRelativeOffset != -2048) {\n                appendStr(\" layoutSecondaryViewportRelativeOffset=\");\n                appendInt(qualifier.layoutSecondaryViewportRelativeOffset);\n              }\n\n              if (qualifier.layoutShaderRecord)\n                appendStr(\" shaderRecordNV\");\n              if (qualifier.layoutFullQuads)\n                appendStr(\" full_quads\");\n              if (qualifier.layoutQuadDeriv)\n                appendStr(\" quad_derivatives\");\n              if (qualifier.layoutHitObjectShaderRecordNV)\n                appendStr(\" hitobjectshaderrecordnv\");\n\n              if (qualifier.layoutBindlessSampler)\n                  appendStr(\" layoutBindlessSampler\");\n              if (qualifier.layoutBindlessImage)\n                  appendStr(\" layoutBindlessImage\");\n\n              appendStr(\")\");\n            }\n          }\n\n          if (qualifier.invariant)\n            appendStr(\" invariant\");\n          if (qualifier.noContraction)\n            appendStr(\" noContraction\");\n          if (qualifier.centroid)\n            appendStr(\" centroid\");\n          if (qualifier.smooth)\n            appendStr(\" smooth\");\n          if (qualifier.flat)\n            appendStr(\" flat\");\n          if (qualifier.nopersp)\n            appendStr(\" noperspective\");\n          if (qualifier.explicitInterp)\n            appendStr(\" __explicitInterpAMD\");\n          if (qualifier.pervertexNV)\n            appendStr(\" pervertexNV\");\n          if (qualifier.pervertexEXT)\n              appendStr(\" pervertexEXT\");\n          if (qualifier.perPrimitiveNV)\n            appendStr(\" perprimitiveNV\");\n          if (qualifier.perViewNV)\n            appendStr(\" perviewNV\");\n          if (qualifier.perTaskNV)\n            appendStr(\" taskNV\");\n          if (qualifier.patch)\n            appendStr(\" patch\");\n          if (qualifier.sample)\n            appendStr(\" sample\");\n          if (qualifier.coherent)\n            appendStr(\" coherent\");\n          if (qualifier.devicecoherent)\n            appendStr(\" devicecoherent\");\n          if (qualifier.queuefamilycoherent)\n            appendStr(\" queuefamilycoherent\");\n          if (qualifier.workgroupcoherent)\n            appendStr(\" workgroupcoherent\");\n          if (qualifier.subgroupcoherent)\n            appendStr(\" subgroupcoherent\");\n          if (qualifier.shadercallcoherent)\n            appendStr(\" shadercallcoherent\");\n          if (qualifier.nonprivate)\n            appendStr(\" nonprivate\");\n          if (qualifier.volatil)\n            appendStr(\" volatile\");\n          if (qualifier.nontemporal)\n            appendStr(\" nontemporal\");\n          if (qualifier.restrict)\n            appendStr(\" restrict\");\n          if (qualifier.readonly)\n            appendStr(\" readonly\");\n          if (qualifier.writeonly)\n            appendStr(\" writeonly\");\n          if (qualifier.specConstant)\n            appendStr(\" specialization-constant\");\n          if (qualifier.nonUniform)\n            appendStr(\" nonuniform\");\n          if (qualifier.isNullInit())\n            appendStr(\" null-init\");\n          if (qualifier.isSpirvByReference())\n            appendStr(\" spirv_by_reference\");\n          if (qualifier.isSpirvLiteral())\n            appendStr(\" spirv_literal\");\n          appendStr(\" \");\n          appendStr(getStorageQualifierString());\n        }\n        if (getType) {\n          if (syntactic) {\n            if (getPrecision && qualifier.precision != EpqNone) {\n              appendStr(\" \");\n              appendStr(getPrecisionQualifierString());\n            }\n            if (isVector() || isMatrix()) {\n              appendStr(\" \");\n              switch (basicType) {\n              case EbtDouble:\n                appendStr(\"d\");\n                break;\n              case EbtInt:\n                appendStr(\"i\");\n                break;\n              case EbtUint:\n                appendStr(\"u\");\n                break;\n              case EbtBool:\n                appendStr(\"b\");\n                break;\n              case EbtFloat:\n              default:\n                break;\n              }\n              if (isVector()) {\n                appendStr(\"vec\");\n                appendInt(vectorSize);\n              } else {\n                appendStr(\"mat\");\n                appendInt(matrixCols);\n                appendStr(\"x\");\n                appendInt(matrixRows);\n              }\n            } else if (isStruct() && structure) {\n                appendStr(\" \");\n                appendStr(structName.c_str());\n                appendStr(\"{\");\n                bool hasHiddenMember = true;\n                for (size_t i = 0; i < structure->size(); ++i) {\n                  if (!(*structure)[i].type->hiddenMember()) {\n                    if (!hasHiddenMember)\n                      appendStr(\", \");\n                    typeString.append((*structure)[i].type->getCompleteString(syntactic, getQualifiers, getPrecision, getType, (*structure)[i].type->getFieldName()));\n                    hasHiddenMember = false;\n                  }\n                }\n                appendStr(\"}\");\n            } else {\n                appendStr(\" \");\n                switch (basicType) {\n                case EbtDouble:\n                  appendStr(\"double\");\n                  break;\n                case EbtInt:\n                  appendStr(\"int\");\n                  break;\n                case EbtUint:\n                  appendStr(\"uint\");\n                  break;\n                case EbtBool:\n                  appendStr(\"bool\");\n                  break;\n                case EbtFloat:\n                  appendStr(\"float\");\n                  break;\n                default:\n                  appendStr(\"unexpected\");\n                  break;\n                }\n            }\n            if (name.length() > 0) {\n              appendStr(\" \");\n              appendStr(name.c_str());\n            }\n            if (isArray()) {\n              for (int i = 0; i < (int)arraySizes->getNumDims(); ++i) {\n                int size = arraySizes->getDimSize(i);\n                if (size == UnsizedArraySize && i == 0 && arraySizes->isVariablyIndexed())\n                  appendStr(\"[]\");\n                else {\n                  if (size == UnsizedArraySize) {\n                    appendStr(\"[\");\n                    if (i == 0)\n                      appendInt(arraySizes->getImplicitSize());\n                    appendStr(\"]\");\n                  }\n                  else {\n                    appendStr(\"[\");\n                    appendInt(arraySizes->getDimSize(i));\n                    appendStr(\"]\");\n                  }\n                }\n              }\n            }\n          }\n          else {\n            if (isArray()) {\n              for (int i = 0; i < (int)arraySizes->getNumDims(); ++i) {\n                int size = arraySizes->getDimSize(i);\n                if (size == UnsizedArraySize && i == 0 && arraySizes->isVariablyIndexed())\n                  appendStr(\" runtime-sized array of\");\n                else {\n                  if (size == UnsizedArraySize) {\n                    appendStr(\" unsized\");\n                    if (i == 0) {\n                      appendStr(\" \");\n                      appendInt(arraySizes->getImplicitSize());\n                    }\n                  }\n                  else {\n                    appendStr(\" \");\n                    appendInt(arraySizes->getDimSize(i));\n                  }\n                  appendStr(\"-element array of\");\n                }\n              }\n            }\n            if (isParameterized()) {\n              if (isCoopMatKHR()) {\n                appendStr(\" \");\n                appendStr(\"coopmat\");\n              }\n              if (isTensorLayoutNV()) {\n                appendStr(\" \");\n                appendStr(\"tensorLayoutNV\");\n              }\n              if (isTensorViewNV()) {\n                appendStr(\" \");\n                appendStr(\"tensorViewNV\");\n              }\n              if (isCoopVecNV()) {\n                appendStr(\" \");\n                appendStr(\"coopvecNV\");\n              }\n\n              appendStr(\"<\");\n              for (int i = 0; i < (int)typeParameters->arraySizes->getNumDims(); ++i) {\n                appendInt(typeParameters->arraySizes->getDimSize(i));\n                if (i != (int)typeParameters->arraySizes->getNumDims() - 1)\n                  appendStr(\", \");\n              }\n              appendStr(\">\");\n            }\n            if (getPrecision && qualifier.precision != EpqNone) {\n              appendStr(\" \");\n              appendStr(getPrecisionQualifierString());\n            }\n            if (isMatrix()) {\n              appendStr(\" \");\n              appendInt(matrixCols);\n              appendStr(\"X\");\n              appendInt(matrixRows);\n              appendStr(\" matrix of\");\n            }\n            else if (isVector()) {\n              appendStr(\" \");\n              appendInt(vectorSize);\n              appendStr(\"-component vector of\");\n            }\n\n            appendStr(\" \");\n            typeString.append(getBasicTypeString());\n\n            if (qualifier.builtIn != EbvNone) {\n              appendStr(\" \");\n              appendStr(getBuiltInVariableString());\n            }\n\n            // Add struct/block members\n            if (isStruct() && structure) {\n              appendStr(\"{\");\n              bool hasHiddenMember = true;\n              for (size_t i = 0; i < structure->size(); ++i) {\n                if (!(*structure)[i].type->hiddenMember()) {\n                  if (!hasHiddenMember)\n                    appendStr(\", \");\n                  typeString.append((*structure)[i].type->getCompleteString());\n                  typeString.append(\" \");\n                  typeString.append((*structure)[i].type->getFieldName());\n                  hasHiddenMember = false;\n                }\n              }\n              appendStr(\"}\");\n            }\n          }\n        }\n\n        return typeString;\n    }\n\n    TString getBasicTypeString() const\n    {\n        if (basicType == EbtSampler)\n            return sampler.getString();\n        else\n            return getBasicString();\n    }\n\n    const char* getStorageQualifierString() const { return GetStorageQualifierString(qualifier.storage); }\n    const char* getBuiltInVariableString() const { return GetBuiltInVariableString(qualifier.builtIn); }\n    const char* getPrecisionQualifierString() const { return GetPrecisionQualifierString(qualifier.precision); }\n\n    const TTypeList* getStruct() const { assert(isStruct()); return structure; }\n    void setStruct(TTypeList* s) { assert(isStruct()); structure = s; }\n    TTypeList* getWritableStruct() const { assert(isStruct()); return structure; }  // This should only be used when known to not be sharing with other threads\n    void setBasicType(const TBasicType& t) { basicType = t; }\n    void setVectorSize(int s) {\n        assert(s >= 0);\n        vectorSize = static_cast<uint32_t>(s) & 0b1111;\n    }\n\n    int computeNumComponents() const\n    {\n        uint32_t components = 0;\n\n        if (isCoopVecNV()) {\n            components = typeParameters->arraySizes->getDimSize(0);\n        } else if (getBasicType() == EbtStruct || getBasicType() == EbtBlock) {\n            for (TTypeList::const_iterator tl = getStruct()->begin(); tl != getStruct()->end(); tl++)\n                components += ((*tl).type)->computeNumComponents();\n        } else if (matrixCols)\n            components = matrixCols * matrixRows;\n        else\n            components = vectorSize;\n\n        if (arraySizes != nullptr) {\n            components *= arraySizes->getCumulativeSize();\n        }\n\n        return static_cast<int>(components);\n    }\n\n    // append this type's mangled name to the passed in 'name'\n    void appendMangledName(TString& name) const\n    {\n        buildMangledName(name);\n        name += ';' ;\n    }\n\n    // These variables are inconsistently declared inside and outside of gl_PerVertex in glslang right now.\n    // They are declared inside of 'in gl_PerVertex', but sitting as standalone when they are 'out'puts.\n    bool isInconsistentGLPerVertexMember(const TString& name) const\n    {\n        if (name == \"gl_SecondaryPositionNV\" ||\n            name == \"gl_PositionPerViewNV\")\n            return true;\n        return false;\n    }\n\n\n    // Do two structure types match?  They could be declared independently,\n    // in different places, but still might satisfy the definition of matching.\n    // From the spec:\n    //\n    // \"Structures must have the same name, sequence of type names, and\n    //  type definitions, and member names to be considered the same type.\n    //  This rule applies recursively for nested or embedded types.\"\n    //\n    // If type mismatch in structure, return member indices through lpidx and rpidx.\n    // If matching members for either block are exhausted, return -1 for exhausted\n    // block and the index of the unmatched member. Otherwise return {-1,-1}.\n    //\n    bool sameStructType(const TType& right, int* lpidx = nullptr, int* rpidx = nullptr) const\n    {\n        // Initialize error to general type mismatch.\n        if (lpidx != nullptr) {\n            *lpidx = -1;\n            *rpidx = -1;\n        }\n\n        // Most commonly, they are both nullptr, or the same pointer to the same actual structure\n        // TODO: Why return true when neither types are structures?\n        if ((!isStruct() && !right.isStruct()) ||\n            (isStruct() && right.isStruct() && structure == right.structure))\n            return true;\n\n        if (!isStruct() || !right.isStruct())\n            return false;\n\n        // Structure names have to match\n        if (*typeName != *right.typeName)\n            return false;\n\n        // There are inconsistencies with how gl_PerVertex is setup. For now ignore those as errors if they\n        // are known inconsistencies.\n        bool isGLPerVertex = *typeName == \"gl_PerVertex\";\n\n        // Both being nullptr was caught above, now they both have to be structures of the same number of elements\n        if (lpidx == nullptr &&\n            (structure->size() != right.structure->size() && !isGLPerVertex)) {\n            return false;\n        }\n\n        // Compare the names and types of all the members, which have to match\n        for (size_t li = 0, ri = 0; li < structure->size() || ri < right.structure->size(); ++li, ++ri) {\n            if (lpidx != nullptr) {\n                *lpidx = static_cast<int>(li);\n                *rpidx = static_cast<int>(ri);\n            }\n            if (li < structure->size() && ri < right.structure->size()) {\n                if ((*structure)[li].type->getFieldName() == (*right.structure)[ri].type->getFieldName()) {\n                    if (*(*structure)[li].type != *(*right.structure)[ri].type)\n                        return false;\n                } else {\n                    // Skip hidden members\n                    if ((*structure)[li].type->hiddenMember()) {\n                        ri--;\n                        continue;\n                    } else if ((*right.structure)[ri].type->hiddenMember()) {\n                        li--;\n                        continue;\n                    }\n                    // If one of the members is something that's inconsistently declared, skip over it\n                    // for now.\n                    if (isGLPerVertex) {\n                        if (isInconsistentGLPerVertexMember((*structure)[li].type->getFieldName())) {\n                            ri--;\n                            continue;\n                        } else if (isInconsistentGLPerVertexMember((*right.structure)[ri].type->getFieldName())) {\n                            li--;\n                            continue;\n                        }\n                    } else {\n                        return false;\n                    }\n                }\n            // If we get here, then there should only be inconsistently declared members left\n            } else if (li < structure->size()) {\n                if (!(*structure)[li].type->hiddenMember() && !isInconsistentGLPerVertexMember((*structure)[li].type->getFieldName())) {\n                    if (lpidx != nullptr) {\n                        *rpidx = -1;\n                    }\n                    return false;\n                }\n            } else {\n                if (!(*right.structure)[ri].type->hiddenMember() && !isInconsistentGLPerVertexMember((*right.structure)[ri].type->getFieldName())) {\n                    if (lpidx != nullptr) {\n                        *lpidx = -1;\n                    }\n                    return false;\n                }\n            }\n        }\n\n        return true;\n    }\n\n     bool sameReferenceType(const TType& right) const\n    {\n        if (isReference() != right.isReference())\n            return false;\n\n        if (!isReference() && !right.isReference())\n            return true;\n\n        assert(referentType != nullptr);\n        assert(right.referentType != nullptr);\n\n        if (referentType == right.referentType)\n            return true;\n\n        return *referentType == *right.referentType;\n    }\n\n    // See if two types match, in all aspects except arrayness\n    // If mismatch in structure members, return member indices in lpidx and rpidx.\n    bool sameElementType(const TType& right, int* lpidx = nullptr, int* rpidx = nullptr) const\n    {\n        if (lpidx != nullptr) {\n            *lpidx = -1;\n            *rpidx = -1;\n        }\n        return basicType == right.basicType && sameElementShape(right, lpidx, rpidx);\n    }\n\n    // See if two type's arrayness match\n    bool sameArrayness(const TType& right) const\n    {\n        return ((arraySizes == nullptr && right.arraySizes == nullptr) ||\n                (arraySizes != nullptr && right.arraySizes != nullptr &&\n                 (*arraySizes == *right.arraySizes ||\n                  (arraySizes->isImplicitlySized() && right.arraySizes->isDefaultImplicitlySized()) ||\n                  (right.arraySizes->isImplicitlySized() && arraySizes->isDefaultImplicitlySized()))));\n    }\n\n    // See if two type's arrayness match in everything except their outer dimension\n    bool sameInnerArrayness(const TType& right) const\n    {\n        assert(arraySizes != nullptr && right.arraySizes != nullptr);\n        return arraySizes->sameInnerArrayness(*right.arraySizes);\n    }\n\n    // See if two type's parameters match\n    bool sameTypeParameters(const TType& right) const\n    {\n        return ((typeParameters == nullptr && right.typeParameters == nullptr) ||\n                (typeParameters != nullptr && right.typeParameters != nullptr && *typeParameters == *right.typeParameters));\n    }\n\n    // See if two type's SPIR-V type contents match\n    bool sameSpirvType(const TType& right) const\n    {\n        return ((spirvType == nullptr && right.spirvType == nullptr) ||\n                (spirvType != nullptr && right.spirvType != nullptr && *spirvType == *right.spirvType));\n    }\n\n    // See if two type's elements match in all ways except basic type\n    // If mismatch in structure members, return member indices in lpidx and rpidx.\n    bool sameElementShape(const TType& right, int* lpidx = nullptr, int* rpidx = nullptr) const\n    {\n        if (lpidx != nullptr) {\n            *lpidx = -1;\n            *rpidx = -1;\n        }\n        return ((basicType != EbtSampler && right.basicType != EbtSampler) || sampler == right.sampler) &&\n               vectorSize == right.vectorSize &&\n               matrixCols == right.matrixCols &&\n               matrixRows == right.matrixRows &&\n                  vector1 == right.vector1    &&\n              isCoopMatNV() == right.isCoopMatNV() &&\n              isCoopMatKHR() == right.isCoopMatKHR() &&\n              isCoopVecNV() == right.isCoopVecNV() &&\n               sameStructType(right, lpidx, rpidx) &&\n               sameReferenceType(right);\n    }\n\n    // See if a cooperative matrix type parameter with unspecified parameters is\n    // an OK function parameter\n    bool coopMatParameterOK(const TType& right) const\n    {\n        if (isCoopMatNV()) {\n            return right.isCoopMatNV() && (getBasicType() == right.getBasicType()) && typeParameters == nullptr &&\n                   right.typeParameters != nullptr;\n        }\n        if (isCoopMatKHR() && right.isCoopMatKHR()) {\n            return ((getBasicType() == right.getBasicType()) || (getBasicType() == EbtCoopmat) ||\n                    (right.getBasicType() == EbtCoopmat)) &&\n                   ((typeParameters == nullptr && right.typeParameters != nullptr) ||\n                    (typeParameters != nullptr && right.typeParameters == nullptr));\n        }\n        return false;\n    }\n\n    // See if a cooperative vector type parameter with unspecified parameters is\n    // an OK function parameter\n    bool coopVecParameterOK(const TType& right) const\n    {\n        if (isCoopVecNV() && right.isCoopVecNV()) {\n            return ((getBasicType() == right.getBasicType()) || (getBasicType() == EbtCoopvecNV) ||\n                    (right.getBasicType() == EbtCoopvecNV)) &&\n                   typeParameters == nullptr && right.typeParameters != nullptr;\n        }\n        return false;\n    }\n\n    bool sameCoopMatBaseType(const TType &right) const {\n        bool rv = false;\n\n        if (isCoopMatNV()) {\n            rv = isCoopMatNV() && right.isCoopMatNV();\n            if (getBasicType() == EbtFloat || getBasicType() == EbtFloat16)\n                rv = right.getBasicType() == EbtFloat || right.getBasicType() == EbtFloat16;\n            else if (getBasicType() == EbtUint || getBasicType() == EbtUint8 || getBasicType() == EbtUint16)\n                rv = right.getBasicType() == EbtUint || right.getBasicType() == EbtUint8 || right.getBasicType() == EbtUint16;\n            else if (getBasicType() == EbtInt || getBasicType() == EbtInt8 || getBasicType() == EbtInt16)\n                rv = right.getBasicType() == EbtInt || right.getBasicType() == EbtInt8 || right.getBasicType() == EbtInt16;\n            else\n                rv = false;\n        } else if (isCoopMatKHR() && right.isCoopMatKHR()) {\n            if (isFloatingDomain())\n                rv = right.isFloatingDomain() || right.getBasicType() == EbtCoopmat;\n            else if (getBasicType() == EbtUint || getBasicType() == EbtUint8 || getBasicType() == EbtUint16)\n                rv = right.getBasicType() == EbtUint || right.getBasicType() == EbtUint8 || right.getBasicType() == EbtUint16 || right.getBasicType() == EbtCoopmat;\n            else if (getBasicType() == EbtInt || getBasicType() == EbtInt8 || getBasicType() == EbtInt16)\n                rv = right.getBasicType() == EbtInt || right.getBasicType() == EbtInt8 || right.getBasicType() == EbtInt16 || right.getBasicType() == EbtCoopmat;\n            else\n                rv = false;\n        }\n        return rv;\n    }\n\n    bool tensorParameterOK(const TType& right) const\n    {\n        if (isTensorLayoutNV()) {\n            return right.isTensorLayoutNV() && right.typeParameters == nullptr && typeParameters != nullptr;\n        }\n        if (isTensorViewNV()) {\n            return right.isTensorViewNV() && right.typeParameters == nullptr && typeParameters != nullptr;\n        }\n        return false;\n    }\n\n    bool sameCoopVecBaseType(const TType &right) const {\n        bool rv = false;\n\n        if (isCoopVecNV() && right.isCoopVecNV()) {\n            if (getBasicType() == EbtFloat || getBasicType() == EbtFloat16)\n                rv = right.getBasicType() == EbtFloat || right.getBasicType() == EbtFloat16 || right.getBasicType() == EbtCoopvecNV;\n            else if (getBasicType() == EbtUint || getBasicType() == EbtUint8 || getBasicType() == EbtUint16)\n                rv = right.getBasicType() == EbtUint || right.getBasicType() == EbtUint8 || right.getBasicType() == EbtUint16 || right.getBasicType() == EbtCoopvecNV;\n            else if (getBasicType() == EbtInt || getBasicType() == EbtInt8 || getBasicType() == EbtInt16)\n                rv = right.getBasicType() == EbtInt || right.getBasicType() == EbtInt8 || right.getBasicType() == EbtInt16 || right.getBasicType() == EbtCoopvecNV;\n            else\n                rv = false;\n        }\n        return rv;\n    }\n\n    bool sameCoopMatUse(const TType &right) const {\n        return coopmatKHRuse == right.coopmatKHRuse;\n    }\n\n    bool sameCoopMatShape(const TType &right) const\n    {\n        if (!isCoopMat() || !right.isCoopMat() || isCoopMatKHR() != right.isCoopMatKHR())\n            return false;\n\n        // Skip bit width type parameter (first array size) for coopmatNV\n        int firstArrayDimToCompare = isCoopMatNV() ? 1 : 0;\n        int lastArrayDimToCompare = typeParameters->arraySizes->getNumDims() - (isCoopMatKHR() ? 1 : 0);\n        for (int i = firstArrayDimToCompare; i < lastArrayDimToCompare; ++i) {\n            if (typeParameters->arraySizes->getDimSize(i) != right.typeParameters->arraySizes->getDimSize(i))\n                return false;\n        }\n        return true;\n    }\n\n    bool sameCoopMatShapeAndUse(const TType &right) const\n    {\n        if (!sameCoopMatShape(right))\n            return false;\n\n        if (coopmatKHRuse != right.coopmatKHRuse)\n            return false;\n\n        return true;\n    }\n\n    // See if two types match in all ways (just the actual type, not qualification)\n    bool operator==(const TType& right) const\n    {\n        return sameElementType(right) && sameArrayness(right) && sameTypeParameters(right) && sameCoopMatUse(right) && sameSpirvType(right);\n    }\n\n    bool operator!=(const TType& right) const\n    {\n        return ! operator==(right);\n    }\n\n    unsigned int getBufferReferenceAlignment() const\n    {\n        if (getBasicType() == glslang::EbtReference) {\n            return getReferentType()->getQualifier().hasBufferReferenceAlign() ?\n                        (1u << getReferentType()->getQualifier().layoutBufferReferenceAlign) : 16u;\n        }\n        return 0;\n    }\n\n    const TSpirvType& getSpirvType() const { assert(spirvType); return *spirvType; }\n\nprotected:\n    // Require consumer to pick between deep copy and shallow copy.\n    TType(const TType& type);\n    TType& operator=(const TType& type);\n\n    // Recursively copy a type graph, while preserving the graph-like\n    // quality. That is, don't make more than one copy of a structure that\n    // gets reused multiple times in the type graph.\n    void deepCopy(const TType& copyOf, TMap<TTypeList*,TTypeList*>& copiedMap)\n    {\n        shallowCopy(copyOf);\n\n        // GL_EXT_spirv_intrinsics\n        if (copyOf.qualifier.spirvDecorate) {\n            qualifier.spirvDecorate = new TSpirvDecorate;\n            *qualifier.spirvDecorate = *copyOf.qualifier.spirvDecorate;\n        }\n\n        if (copyOf.spirvType) {\n            spirvType = new TSpirvType;\n            *spirvType = *copyOf.spirvType;\n        }\n\n        if (copyOf.arraySizes) {\n            arraySizes = new TArraySizes;\n            *arraySizes = *copyOf.arraySizes;\n        }\n\n        if (copyOf.typeParameters) {\n            typeParameters = new TTypeParameters;\n            typeParameters->arraySizes = new TArraySizes;\n            *typeParameters->arraySizes = *copyOf.typeParameters->arraySizes;\n            if (copyOf.typeParameters->spirvType) {\n                *typeParameters->spirvType = *copyOf.typeParameters->spirvType;\n            }\n            typeParameters->basicType = copyOf.basicType;\n        }\n\n        if (copyOf.isStruct() && copyOf.structure) {\n            auto prevCopy = copiedMap.find(copyOf.structure);\n            if (prevCopy != copiedMap.end())\n                structure = prevCopy->second;\n            else {\n                structure = new TTypeList;\n                copiedMap[copyOf.structure] = structure;\n                for (unsigned int i = 0; i < copyOf.structure->size(); ++i) {\n                    TTypeLoc typeLoc;\n                    typeLoc.loc = (*copyOf.structure)[i].loc;\n                    typeLoc.type = new TType();\n                    typeLoc.type->deepCopy(*(*copyOf.structure)[i].type, copiedMap);\n                    structure->push_back(typeLoc);\n                }\n            }\n        }\n\n        if (copyOf.fieldName)\n            fieldName = NewPoolTString(copyOf.fieldName->c_str());\n        if (copyOf.typeName)\n            typeName = NewPoolTString(copyOf.typeName->c_str());\n    }\n\n\n    void buildMangledName(TString&) const;\n\n    TBasicType basicType : 8;\n    uint32_t vectorSize       : 4;  // 1 means either scalar or 1-component vector; see vector1 to disambiguate.\n    uint32_t matrixCols       : 4;\n    uint32_t matrixRows       : 4;\n    bool vector1         : 1;  // Backward-compatible tracking of a 1-component vector distinguished from a scalar.\n                               // GLSL 4.5 never has a 1-component vector; so this will always be false until such\n                               // functionality is added.\n                               // HLSL does have a 1-component vectors, so this will be true to disambiguate\n                               // from a scalar.\n    bool coopmatNV       : 1;\n    bool coopmatKHR      : 1;\n    uint32_t coopmatKHRuse    : 3;  // Accepts one of three values: 0, 1, 2 (gl_MatrixUseA, gl_MatrixUseB, gl_MatrixUseAccumulator)\n    bool coopmatKHRUseValid   : 1;  // True if coopmatKHRuse has been set\n    bool coopvecNV       : 1;\n    bool tileAttachmentQCOM : 1;\n    TQualifier qualifier;\n\n    TArraySizes* arraySizes;    // nullptr unless an array; can be shared across types\n    // A type can't be both a structure (EbtStruct/EbtBlock) and a reference (EbtReference), so\n    // conserve space by making these a union\n    union {\n        TTypeList* structure;       // invalid unless this is a struct; can be shared across types\n        TType *referentType;        // invalid unless this is an EbtReference\n    };\n    TString *fieldName;         // for structure field names\n    TString *typeName;          // for structure type name\n    TSampler sampler;\n    TTypeParameters *typeParameters;// nullptr unless a parameterized type; can be shared across types\n    TSpirvType* spirvType;  // SPIR-V type defined by spirv_type directive\n};\n\n} // end namespace glslang\n\n#endif // _TYPES_INCLUDED_\n"
  },
  {
    "path": "src/libraries/glslang/glslang/Include/arrays.h",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2012-2013 LunarG, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n//\n// Implement types for tracking GLSL arrays, arrays of arrays, etc.\n//\n\n#ifndef _ARRAYS_INCLUDED\n#define _ARRAYS_INCLUDED\n\n#include <algorithm>\n\nnamespace glslang {\n\n// This is used to mean there is no size yet (unsized), it is waiting to get a size from somewhere else.\nconst int UnsizedArraySize = 0;\n\nclass TIntermTyped;\nextern bool SameSpecializationConstants(TIntermTyped*, TIntermTyped*);\n\n// Specialization constants need both a nominal size and a node that defines\n// the specialization constant being used.  Array types are the same when their\n// size and specialization constant nodes are the same.\nstruct TArraySize {\n    unsigned int size;\n    TIntermTyped* node;  // nullptr means no specialization constant node\n    bool operator==(const TArraySize& rhs) const\n    {\n        if (size != rhs.size)\n            return false;\n        if (node == nullptr || rhs.node == nullptr)\n            return node == rhs.node;\n\n        return SameSpecializationConstants(node, rhs.node);\n    }\n};\n\n//\n// TSmallArrayVector is used as the container for the set of sizes in TArraySizes.\n// It has generic-container semantics, while TArraySizes has array-of-array semantics.\n// That is, TSmallArrayVector should be more focused on mechanism and TArraySizes on policy.\n//\nstruct TSmallArrayVector {\n    //\n    // TODO: memory: TSmallArrayVector is intended to be smaller.\n    // Almost all arrays could be handled by two sizes each fitting\n    // in 16 bits, needing a real vector only in the cases where there\n    // are more than 3 sizes or a size needing more than 16 bits.\n    //\n    POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())\n\n    TSmallArrayVector() : sizes(nullptr) { }\n    virtual ~TSmallArrayVector() { dealloc(); }\n\n    // For breaking into two non-shared copies, independently modifiable.\n    TSmallArrayVector& operator=(const TSmallArrayVector& from)\n    {\n        if (from.sizes == nullptr)\n            sizes = nullptr;\n        else {\n            alloc();\n            *sizes = *from.sizes;\n        }\n\n        return *this;\n    }\n\n    int size() const\n    {\n        if (sizes == nullptr)\n            return 0;\n        return (int)sizes->size();\n    }\n\n    unsigned int frontSize() const\n    {\n        assert(sizes != nullptr && sizes->size() > 0);\n        return sizes->front().size;\n    }\n\n    TIntermTyped* frontNode() const\n    {\n        assert(sizes != nullptr && sizes->size() > 0);\n        return sizes->front().node;\n    }\n\n    void changeFront(unsigned int s)\n    {\n        assert(sizes != nullptr);\n        // this should only happen for implicitly sized arrays, not specialization constants\n        assert(sizes->front().node == nullptr);\n        sizes->front().size = s;\n    }\n\n    void push_back(unsigned int e, TIntermTyped* n)\n    {\n        alloc();\n        TArraySize pair = { e, n };\n        sizes->push_back(pair);\n    }\n\n    void push_back(const TSmallArrayVector& newDims)\n    {\n        alloc();\n        sizes->insert(sizes->end(), newDims.sizes->begin(), newDims.sizes->end());\n    }\n\n    void pop_front()\n    {\n        assert(sizes != nullptr && sizes->size() > 0);\n        if (sizes->size() == 1)\n            dealloc();\n        else\n            sizes->erase(sizes->begin());\n    }\n\n    void pop_back()\n    {\n        assert(sizes != nullptr && sizes->size() > 0);\n        if (sizes->size() == 1)\n            dealloc();\n        else\n            sizes->resize(sizes->size() - 1);\n    }\n\n    // 'this' should currently not be holding anything, and copyNonFront\n    // will make it hold a copy of all but the first element of rhs.\n    // (This would be useful for making a type that is dereferenced by\n    // one dimension.)\n    void copyNonFront(const TSmallArrayVector& rhs)\n    {\n        assert(sizes == nullptr);\n        if (rhs.size() > 1) {\n            alloc();\n            sizes->insert(sizes->begin(), rhs.sizes->begin() + 1, rhs.sizes->end());\n        }\n    }\n\n    unsigned int getDimSize(int i) const\n    {\n        assert(sizes != nullptr && (int)sizes->size() > i);\n        return (*sizes)[i].size;\n    }\n\n    void setDimSize(int i, unsigned int size) const\n    {\n        assert(sizes != nullptr && (int)sizes->size() > i);\n        assert((*sizes)[i].node == nullptr);\n        (*sizes)[i].size = size;\n    }\n\n    TIntermTyped* getDimNode(int i) const\n    {\n        assert(sizes != nullptr && (int)sizes->size() > i);\n        return (*sizes)[i].node;\n    }\n\n    bool operator==(const TSmallArrayVector& rhs) const\n    {\n        if (sizes == nullptr && rhs.sizes == nullptr)\n            return true;\n        if (sizes == nullptr || rhs.sizes == nullptr)\n            return false;\n        return *sizes == *rhs.sizes;\n    }\n    bool operator!=(const TSmallArrayVector& rhs) const { return ! operator==(rhs); }\n\nprotected:\n    TSmallArrayVector(const TSmallArrayVector&);\n\n    void alloc()\n    {\n        if (sizes == nullptr)\n            sizes = new TVector<TArraySize>;\n    }\n    void dealloc()\n    {\n        delete sizes;\n        sizes = nullptr;\n    }\n\n    TVector<TArraySize>* sizes; // will either hold such a pointer, or in the future, hold the two array sizes\n};\n\n//\n// Represent an array, or array of arrays, to arbitrary depth.  This is not\n// done through a hierarchy of types in a type tree, rather all contiguous arrayness\n// in the type hierarchy is localized into this single cumulative object.\n//\n// The arrayness in TTtype is a pointer, so that it can be non-allocated and zero\n// for the vast majority of types that are non-array types.\n//\n// Order Policy: these are all identical:\n//  - left to right order within a contiguous set of ...[..][..][..]... in the source language\n//  - index order 0, 1, 2, ... within the 'sizes' member below\n//  - outer-most to inner-most\n//\nstruct TArraySizes {\n    POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())\n\n    TArraySizes() : implicitArraySize(0), implicitlySized(true), variablyIndexed(false){ }\n\n    // For breaking into two non-shared copies, independently modifiable.\n    TArraySizes& operator=(const TArraySizes& from)\n    {\n        implicitArraySize = from.implicitArraySize;\n        variablyIndexed = from.variablyIndexed;\n        sizes = from.sizes;\n        implicitlySized = from.implicitlySized;\n\n        return *this;\n    }\n\n    // translate from array-of-array semantics to container semantics\n    int getNumDims() const { return sizes.size(); }\n    int getDimSize(int dim) const { return sizes.getDimSize(dim); }\n    TIntermTyped* getDimNode(int dim) const { return sizes.getDimNode(dim); }\n    void setDimSize(int dim, int size) { sizes.setDimSize(dim, size); }\n    int getOuterSize() const { return sizes.frontSize(); }\n    TIntermTyped* getOuterNode() const { return sizes.frontNode(); }\n    int getCumulativeSize() const\n    {\n        int size = 1;\n        for (int d = 0; d < sizes.size(); ++d) {\n            // this only makes sense in paths that have a known array size\n            assert(sizes.getDimSize(d) != UnsizedArraySize);\n            size *= sizes.getDimSize(d);\n        }\n        return size;\n    }\n    void addInnerSize() { addInnerSize((unsigned)UnsizedArraySize); }\n    void addInnerSize(int s) { addInnerSize((unsigned)s, nullptr); }\n    void addInnerSize(int s, TIntermTyped* n) { sizes.push_back((unsigned)s, n); }\n    void addInnerSize(TArraySize pair) {\n        sizes.push_back(pair.size, pair.node);\n        implicitlySized = false;\n    }\n    void addInnerSizes(const TArraySizes& s) { sizes.push_back(s.sizes); }\n    void changeOuterSize(int s) {\n        sizes.changeFront((unsigned)s);\n        implicitlySized = false;\n    }\n    int getImplicitSize() const { return implicitArraySize > 0 ? implicitArraySize : 1; }\n    void updateImplicitSize(int s) {\n        implicitArraySize = (std::max)(implicitArraySize, s);\n    }\n    bool isInnerUnsized() const\n    {\n        for (int d = 1; d < sizes.size(); ++d) {\n            if (sizes.getDimSize(d) == (unsigned)UnsizedArraySize)\n                return true;\n        }\n\n        return false;\n    }\n    bool clearInnerUnsized()\n    {\n        for (int d = 1; d < sizes.size(); ++d) {\n            if (sizes.getDimSize(d) == (unsigned)UnsizedArraySize)\n                setDimSize(d, 1);\n        }\n\n        return false;\n    }\n    bool isInnerSpecialization() const\n    {\n        for (int d = 1; d < sizes.size(); ++d) {\n            if (sizes.getDimNode(d) != nullptr)\n                return true;\n        }\n\n        return false;\n    }\n    bool isOuterSpecialization()\n    {\n        return sizes.getDimNode(0) != nullptr;\n    }\n\n    bool hasUnsized() const { return getOuterSize() == UnsizedArraySize || isInnerUnsized(); }\n    bool isSized() const { return getOuterSize() != UnsizedArraySize; }\n    bool isImplicitlySized() const { return implicitlySized; }\n    bool isDefaultImplicitlySized() const { return implicitlySized && implicitArraySize == 0; }\n    void setImplicitlySized(bool isImplicitSizing) { implicitlySized = isImplicitSizing; }\n    void dereference() { sizes.pop_front(); }\n    void removeLastSize() { sizes.pop_back(); }\n    void copyDereferenced(const TArraySizes& rhs)\n    {\n        assert(sizes.size() == 0);\n        if (rhs.sizes.size() > 1)\n            sizes.copyNonFront(rhs.sizes);\n    }\n\n    bool sameInnerArrayness(const TArraySizes& rhs) const\n    {\n        if (sizes.size() != rhs.sizes.size())\n            return false;\n\n        for (int d = 1; d < sizes.size(); ++d) {\n            if (sizes.getDimSize(d) != rhs.sizes.getDimSize(d) ||\n                sizes.getDimNode(d) != rhs.sizes.getDimNode(d))\n                return false;\n        }\n\n        return true;\n    }\n\n    void setVariablyIndexed() { variablyIndexed = true; }\n    bool isVariablyIndexed() const { return variablyIndexed; }\n\n    bool operator==(const TArraySizes& rhs) const { return sizes == rhs.sizes; }\n    bool operator!=(const TArraySizes& rhs) const { return sizes != rhs.sizes; }\n\nprotected:\n    TSmallArrayVector sizes;\n\n    TArraySizes(const TArraySizes&);\n\n    // For tracking maximum referenced compile-time constant index.\n    // Applies only to the outer-most dimension. Potentially becomes\n    // the implicit size of the array, if not variably indexed and\n    // otherwise legal.\n    int implicitArraySize;\n    bool implicitlySized;\n    bool variablyIndexed;  // true if array is indexed with a non compile-time constant\n};\n\n} // end namespace glslang\n\n#endif // _ARRAYS_INCLUDED_\n"
  },
  {
    "path": "src/libraries/glslang/glslang/Include/intermediate.h",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2012-2016 LunarG, Inc.\n// Copyright (C) 2017, 2022-2024 Arm Limited.\n// Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n//\n// Definition of the in-memory high-level intermediate representation\n// of shaders.  This is a tree that parser creates.\n//\n// Nodes in the tree are defined as a hierarchy of classes derived from\n// TIntermNode. Each is a node in a tree.  There is no preset branching factor;\n// each node can have it's own type of list of children.\n//\n\n#ifndef __INTERMEDIATE_H\n#define __INTERMEDIATE_H\n\n#include \"Common.h\"\n#include \"Types.h\"\n#include \"ConstantUnion.h\"\n\nnamespace glslang {\n\nclass TIntermediate;\n\n//\n// Operators used by the high-level (parse tree) representation.\n//\nenum TOperator {\n    EOpNull,            // if in a node, should only mean a node is still being built\n    EOpSequence,        // denotes a list of statements, or parameters, etc.\n    EOpScope,           // Used by debugging to denote a scoped list of statements\n    EOpLinkerObjects,   // for aggregate node of objects the linker may need, if not reference by the rest of the AST\n    EOpFunctionCall,\n    EOpFunction,        // For function definition\n    EOpParameters,      // an aggregate listing the parameters to a function\n    EOpSpirvInst,\n\n    //\n    // Unary operators\n    //\n\n    EOpNegative,\n    EOpLogicalNot,\n    EOpVectorLogicalNot,\n    EOpBitwiseNot,\n\n    EOpPostIncrement,\n    EOpPostDecrement,\n    EOpPreIncrement,\n    EOpPreDecrement,\n\n    EOpCopyObject,\n\n    EOpDeclare,        // Used by debugging to force declaration of variable in correct scope\n\n    // Operator used to represent all conversions between int, float, and bool.\n    // The specific types are inferred from TBasicType.\n    EOpConvNumeric,\n\n    // uint64_t <-> pointer\n    EOpConvUint64ToPtr,\n    EOpConvPtrToUint64,\n\n    // uvec2 <-> pointer\n    EOpConvUvec2ToPtr,\n    EOpConvPtrToUvec2,\n\n    // uint64_t -> accelerationStructureEXT\n    EOpConvUint64ToAccStruct,\n\n    // uvec2 -> accelerationStructureEXT\n    EOpConvUvec2ToAccStruct,\n\n    //\n    // binary operations\n    //\n\n    EOpAdd,\n    EOpSub,\n    EOpMul,\n    EOpDiv,\n    EOpMod,\n    EOpRightShift,\n    EOpLeftShift,\n    EOpAnd,\n    EOpInclusiveOr,\n    EOpExclusiveOr,\n    EOpEqual,\n    EOpNotEqual,\n    EOpVectorEqual,\n    EOpVectorNotEqual,\n    EOpLessThan,\n    EOpGreaterThan,\n    EOpLessThanEqual,\n    EOpGreaterThanEqual,\n    EOpComma,\n\n    EOpVectorTimesScalar,\n    EOpVectorTimesMatrix,\n    EOpMatrixTimesVector,\n    EOpMatrixTimesScalar,\n\n    EOpLogicalOr,\n    EOpLogicalXor,\n    EOpLogicalAnd,\n\n    EOpIndexDirect,\n    EOpIndexIndirect,\n    EOpIndexDirectStruct,\n\n    EOpVectorSwizzle,\n\n    EOpMethod,\n    EOpScoping,\n\n    //\n    // Built-in functions mapped to operators\n    //\n\n    EOpRadians,\n    EOpDegrees,\n    EOpSin,\n    EOpCos,\n    EOpTan,\n    EOpAsin,\n    EOpAcos,\n    EOpAtan,\n    EOpSinh,\n    EOpCosh,\n    EOpTanh,\n    EOpAsinh,\n    EOpAcosh,\n    EOpAtanh,\n\n    EOpPow,\n    EOpExp,\n    EOpLog,\n    EOpExp2,\n    EOpLog2,\n    EOpSqrt,\n    EOpInverseSqrt,\n\n    EOpAbs,\n    EOpSign,\n    EOpFloor,\n    EOpTrunc,\n    EOpRound,\n    EOpRoundEven,\n    EOpCeil,\n    EOpFract,\n    EOpModf,\n    EOpMin,\n    EOpMax,\n    EOpClamp,\n    EOpMix,\n    EOpStep,\n    EOpSmoothStep,\n\n    EOpIsNan,\n    EOpIsInf,\n\n    EOpFma,\n\n    EOpFrexp,\n    EOpLdexp,\n\n    EOpFloatBitsToInt,\n    EOpFloatBitsToUint,\n    EOpIntBitsToFloat,\n    EOpUintBitsToFloat,\n    EOpDoubleBitsToInt64,\n    EOpDoubleBitsToUint64,\n    EOpInt64BitsToDouble,\n    EOpUint64BitsToDouble,\n    EOpFloat16BitsToInt16,\n    EOpFloat16BitsToUint16,\n    EOpInt16BitsToFloat16,\n    EOpUint16BitsToFloat16,\n    EOpPackSnorm2x16,\n    EOpUnpackSnorm2x16,\n    EOpPackUnorm2x16,\n    EOpUnpackUnorm2x16,\n    EOpPackSnorm4x8,\n    EOpUnpackSnorm4x8,\n    EOpPackUnorm4x8,\n    EOpUnpackUnorm4x8,\n    EOpPackHalf2x16,\n    EOpUnpackHalf2x16,\n    EOpPackDouble2x32,\n    EOpUnpackDouble2x32,\n    EOpPackInt2x32,\n    EOpUnpackInt2x32,\n    EOpPackUint2x32,\n    EOpUnpackUint2x32,\n    EOpPackFloat2x16,\n    EOpUnpackFloat2x16,\n    EOpPackInt2x16,\n    EOpUnpackInt2x16,\n    EOpPackUint2x16,\n    EOpUnpackUint2x16,\n    EOpPackInt4x16,\n    EOpUnpackInt4x16,\n    EOpPackUint4x16,\n    EOpUnpackUint4x16,\n    EOpPack16,\n    EOpPack32,\n    EOpPack64,\n    EOpUnpack32,\n    EOpUnpack16,\n    EOpUnpack8,\n\n    EOpLength,\n    EOpDistance,\n    EOpDot,\n    EOpCross,\n    EOpNormalize,\n    EOpFaceForward,\n    EOpReflect,\n    EOpRefract,\n\n    EOpMin3,\n    EOpMax3,\n    EOpMid3,\n\n    EOpDPdx,            // Fragment only\n    EOpDPdy,            // Fragment only\n    EOpFwidth,          // Fragment only\n    EOpDPdxFine,        // Fragment only\n    EOpDPdyFine,        // Fragment only\n    EOpFwidthFine,      // Fragment only\n    EOpDPdxCoarse,      // Fragment only\n    EOpDPdyCoarse,      // Fragment only\n    EOpFwidthCoarse,    // Fragment only\n\n    EOpInterpolateAtCentroid, // Fragment only\n    EOpInterpolateAtSample,   // Fragment only\n    EOpInterpolateAtOffset,   // Fragment only\n    EOpInterpolateAtVertex,\n\n    EOpMatrixTimesMatrix,\n    EOpOuterProduct,\n    EOpDeterminant,\n    EOpMatrixInverse,\n    EOpTranspose,\n\n    EOpFtransform,\n\n    EOpNoise,\n\n    EOpEmitVertex,           // geometry only\n    EOpEndPrimitive,         // geometry only\n    EOpEmitStreamVertex,     // geometry only\n    EOpEndStreamPrimitive,   // geometry only\n\n    EOpBarrier,\n    EOpMemoryBarrier,\n    EOpMemoryBarrierAtomicCounter,\n    EOpMemoryBarrierBuffer,\n    EOpMemoryBarrierImage,\n    EOpMemoryBarrierShared,  // compute only\n    EOpGroupMemoryBarrier,   // compute only\n\n    EOpBallot,\n    EOpReadInvocation,\n    EOpReadFirstInvocation,\n\n    EOpAnyInvocation,\n    EOpAllInvocations,\n    EOpAllInvocationsEqual,\n\n    EOpSubgroupGuardStart,\n    EOpSubgroupBarrier,\n    EOpSubgroupMemoryBarrier,\n    EOpSubgroupMemoryBarrierBuffer,\n    EOpSubgroupMemoryBarrierImage,\n    EOpSubgroupMemoryBarrierShared, // compute only\n    EOpSubgroupElect,\n    EOpSubgroupAll,\n    EOpSubgroupAny,\n    EOpSubgroupAllEqual,\n    EOpSubgroupBroadcast,\n    EOpSubgroupBroadcastFirst,\n    EOpSubgroupBallot,\n    EOpSubgroupInverseBallot,\n    EOpSubgroupBallotBitExtract,\n    EOpSubgroupBallotBitCount,\n    EOpSubgroupBallotInclusiveBitCount,\n    EOpSubgroupBallotExclusiveBitCount,\n    EOpSubgroupBallotFindLSB,\n    EOpSubgroupBallotFindMSB,\n    EOpSubgroupShuffle,\n    EOpSubgroupShuffleXor,\n    EOpSubgroupShuffleUp,\n    EOpSubgroupShuffleDown,\n    EOpSubgroupRotate,\n    EOpSubgroupClusteredRotate,\n    EOpSubgroupAdd,\n    EOpSubgroupMul,\n    EOpSubgroupMin,\n    EOpSubgroupMax,\n    EOpSubgroupAnd,\n    EOpSubgroupOr,\n    EOpSubgroupXor,\n    EOpSubgroupInclusiveAdd,\n    EOpSubgroupInclusiveMul,\n    EOpSubgroupInclusiveMin,\n    EOpSubgroupInclusiveMax,\n    EOpSubgroupInclusiveAnd,\n    EOpSubgroupInclusiveOr,\n    EOpSubgroupInclusiveXor,\n    EOpSubgroupExclusiveAdd,\n    EOpSubgroupExclusiveMul,\n    EOpSubgroupExclusiveMin,\n    EOpSubgroupExclusiveMax,\n    EOpSubgroupExclusiveAnd,\n    EOpSubgroupExclusiveOr,\n    EOpSubgroupExclusiveXor,\n    EOpSubgroupClusteredAdd,\n    EOpSubgroupClusteredMul,\n    EOpSubgroupClusteredMin,\n    EOpSubgroupClusteredMax,\n    EOpSubgroupClusteredAnd,\n    EOpSubgroupClusteredOr,\n    EOpSubgroupClusteredXor,\n    EOpSubgroupQuadBroadcast,\n    EOpSubgroupQuadSwapHorizontal,\n    EOpSubgroupQuadSwapVertical,\n    EOpSubgroupQuadSwapDiagonal,\n    EOpSubgroupQuadAll,\n    EOpSubgroupQuadAny,\n\n    EOpSubgroupPartition,\n    EOpSubgroupPartitionedAdd,\n    EOpSubgroupPartitionedMul,\n    EOpSubgroupPartitionedMin,\n    EOpSubgroupPartitionedMax,\n    EOpSubgroupPartitionedAnd,\n    EOpSubgroupPartitionedOr,\n    EOpSubgroupPartitionedXor,\n    EOpSubgroupPartitionedInclusiveAdd,\n    EOpSubgroupPartitionedInclusiveMul,\n    EOpSubgroupPartitionedInclusiveMin,\n    EOpSubgroupPartitionedInclusiveMax,\n    EOpSubgroupPartitionedInclusiveAnd,\n    EOpSubgroupPartitionedInclusiveOr,\n    EOpSubgroupPartitionedInclusiveXor,\n    EOpSubgroupPartitionedExclusiveAdd,\n    EOpSubgroupPartitionedExclusiveMul,\n    EOpSubgroupPartitionedExclusiveMin,\n    EOpSubgroupPartitionedExclusiveMax,\n    EOpSubgroupPartitionedExclusiveAnd,\n    EOpSubgroupPartitionedExclusiveOr,\n    EOpSubgroupPartitionedExclusiveXor,\n\n    EOpSubgroupGuardStop,\n    \n    // Integer dot product\n    EOpDotPackedEXT,\n    EOpDotAccSatEXT,\n    EOpDotPackedAccSatEXT,\n\n    EOpMinInvocations,\n    EOpMaxInvocations,\n    EOpAddInvocations,\n    EOpMinInvocationsNonUniform,\n    EOpMaxInvocationsNonUniform,\n    EOpAddInvocationsNonUniform,\n    EOpMinInvocationsInclusiveScan,\n    EOpMaxInvocationsInclusiveScan,\n    EOpAddInvocationsInclusiveScan,\n    EOpMinInvocationsInclusiveScanNonUniform,\n    EOpMaxInvocationsInclusiveScanNonUniform,\n    EOpAddInvocationsInclusiveScanNonUniform,\n    EOpMinInvocationsExclusiveScan,\n    EOpMaxInvocationsExclusiveScan,\n    EOpAddInvocationsExclusiveScan,\n    EOpMinInvocationsExclusiveScanNonUniform,\n    EOpMaxInvocationsExclusiveScanNonUniform,\n    EOpAddInvocationsExclusiveScanNonUniform,\n    EOpSwizzleInvocations,\n    EOpSwizzleInvocationsMasked,\n    EOpWriteInvocation,\n    EOpMbcnt,\n\n    EOpCubeFaceIndex,\n    EOpCubeFaceCoord,\n    EOpTime,\n\n    EOpAtomicAdd,\n    EOpAtomicSubtract,\n    EOpAtomicMin,\n    EOpAtomicMax,\n    EOpAtomicAnd,\n    EOpAtomicOr,\n    EOpAtomicXor,\n    EOpAtomicExchange,\n    EOpAtomicCompSwap,\n    EOpAtomicLoad,\n    EOpAtomicStore,\n\n    EOpAtomicCounterIncrement, // results in pre-increment value\n    EOpAtomicCounterDecrement, // results in post-decrement value\n    EOpAtomicCounter,\n    EOpAtomicCounterAdd,\n    EOpAtomicCounterSubtract,\n    EOpAtomicCounterMin,\n    EOpAtomicCounterMax,\n    EOpAtomicCounterAnd,\n    EOpAtomicCounterOr,\n    EOpAtomicCounterXor,\n    EOpAtomicCounterExchange,\n    EOpAtomicCounterCompSwap,\n\n    EOpAny,\n    EOpAll,\n\n    EOpCooperativeMatrixLoad,\n    EOpCooperativeMatrixStore,\n    EOpCooperativeMatrixMulAdd,\n    EOpCooperativeMatrixLoadNV,\n    EOpCooperativeMatrixStoreNV,\n    EOpCooperativeMatrixLoadTensorNV,\n    EOpCooperativeMatrixStoreTensorNV,\n    EOpCooperativeMatrixMulAddNV,\n    EOpCooperativeMatrixReduceNV,\n    EOpCooperativeMatrixPerElementOpNV,\n    EOpCooperativeMatrixTransposeNV,\n\n    EOpCreateTensorLayoutNV,\n    EOpTensorLayoutSetBlockSizeNV,\n    EOpTensorLayoutSetDimensionNV,\n    EOpTensorLayoutSetStrideNV,\n    EOpTensorLayoutSliceNV,\n    EOpTensorLayoutSetClampValueNV,\n\n    EOpCreateTensorViewNV,\n    EOpTensorViewSetDimensionNV,\n    EOpTensorViewSetStrideNV,\n    EOpTensorViewSetClipNV,\n\n    EOpCooperativeVectorMatMulNV,\n    EOpCooperativeVectorMatMulAddNV,\n    EOpCooperativeVectorLoadNV,\n    EOpCooperativeVectorStoreNV,\n    EOpCooperativeVectorOuterProductAccumulateNV,\n    EOpCooperativeVectorReduceSumAccumulateNV,\n\n    EOpBeginInvocationInterlock, // Fragment only\n    EOpEndInvocationInterlock, // Fragment only\n\n    EOpIsHelperInvocation,\n\n    EOpDebugPrintf,\n\n    //\n    // Branch\n    //\n\n    EOpKill,                // Fragment only\n    EOpTerminateInvocation, // Fragment only\n    EOpDemote,              // Fragment only\n    EOpTerminateRayKHR,         // Any-hit only\n    EOpIgnoreIntersectionKHR,   // Any-hit only\n    EOpReturn,\n    EOpBreak,\n    EOpContinue,\n    EOpCase,\n    EOpDefault,\n\n    //\n    // Constructors\n    //\n\n    EOpConstructGuardStart,\n    EOpConstructInt,          // these first scalar forms also identify what implicit conversion is needed\n    EOpConstructUint,\n    EOpConstructInt8,\n    EOpConstructUint8,\n    EOpConstructInt16,\n    EOpConstructUint16,\n    EOpConstructInt64,\n    EOpConstructUint64,\n    EOpConstructBool,\n    EOpConstructFloat,\n    EOpConstructDouble,\n    // Keep vector and matrix constructors in a consistent relative order for\n    // TParseContext::constructBuiltIn, which converts between 8/16/32 bit\n    // vector constructors\n    EOpConstructVec2,\n    EOpConstructVec3,\n    EOpConstructVec4,\n    EOpConstructMat2x2,\n    EOpConstructMat2x3,\n    EOpConstructMat2x4,\n    EOpConstructMat3x2,\n    EOpConstructMat3x3,\n    EOpConstructMat3x4,\n    EOpConstructMat4x2,\n    EOpConstructMat4x3,\n    EOpConstructMat4x4,\n    EOpConstructDVec2,\n    EOpConstructDVec3,\n    EOpConstructDVec4,\n    EOpConstructBVec2,\n    EOpConstructBVec3,\n    EOpConstructBVec4,\n    EOpConstructI8Vec2,\n    EOpConstructI8Vec3,\n    EOpConstructI8Vec4,\n    EOpConstructU8Vec2,\n    EOpConstructU8Vec3,\n    EOpConstructU8Vec4,\n    EOpConstructI16Vec2,\n    EOpConstructI16Vec3,\n    EOpConstructI16Vec4,\n    EOpConstructU16Vec2,\n    EOpConstructU16Vec3,\n    EOpConstructU16Vec4,\n    EOpConstructIVec2,\n    EOpConstructIVec3,\n    EOpConstructIVec4,\n    EOpConstructUVec2,\n    EOpConstructUVec3,\n    EOpConstructUVec4,\n    EOpConstructI64Vec2,\n    EOpConstructI64Vec3,\n    EOpConstructI64Vec4,\n    EOpConstructU64Vec2,\n    EOpConstructU64Vec3,\n    EOpConstructU64Vec4,\n    EOpConstructDMat2x2,\n    EOpConstructDMat2x3,\n    EOpConstructDMat2x4,\n    EOpConstructDMat3x2,\n    EOpConstructDMat3x3,\n    EOpConstructDMat3x4,\n    EOpConstructDMat4x2,\n    EOpConstructDMat4x3,\n    EOpConstructDMat4x4,\n    EOpConstructIMat2x2,\n    EOpConstructIMat2x3,\n    EOpConstructIMat2x4,\n    EOpConstructIMat3x2,\n    EOpConstructIMat3x3,\n    EOpConstructIMat3x4,\n    EOpConstructIMat4x2,\n    EOpConstructIMat4x3,\n    EOpConstructIMat4x4,\n    EOpConstructUMat2x2,\n    EOpConstructUMat2x3,\n    EOpConstructUMat2x4,\n    EOpConstructUMat3x2,\n    EOpConstructUMat3x3,\n    EOpConstructUMat3x4,\n    EOpConstructUMat4x2,\n    EOpConstructUMat4x3,\n    EOpConstructUMat4x4,\n    EOpConstructBMat2x2,\n    EOpConstructBMat2x3,\n    EOpConstructBMat2x4,\n    EOpConstructBMat3x2,\n    EOpConstructBMat3x3,\n    EOpConstructBMat3x4,\n    EOpConstructBMat4x2,\n    EOpConstructBMat4x3,\n    EOpConstructBMat4x4,\n    EOpConstructFloat16,\n    EOpConstructF16Vec2,\n    EOpConstructF16Vec3,\n    EOpConstructF16Vec4,\n    EOpConstructF16Mat2x2,\n    EOpConstructF16Mat2x3,\n    EOpConstructF16Mat2x4,\n    EOpConstructF16Mat3x2,\n    EOpConstructF16Mat3x3,\n    EOpConstructF16Mat3x4,\n    EOpConstructF16Mat4x2,\n    EOpConstructF16Mat4x3,\n    EOpConstructF16Mat4x4,\n    EOpConstructBFloat16,\n    EOpConstructBF16Vec2,\n    EOpConstructBF16Vec3,\n    EOpConstructBF16Vec4,\n    EOpConstructFloatE5M2,\n    EOpConstructFloatE5M2Vec2,\n    EOpConstructFloatE5M2Vec3,\n    EOpConstructFloatE5M2Vec4,\n    EOpConstructFloatE4M3,\n    EOpConstructFloatE4M3Vec2,\n    EOpConstructFloatE4M3Vec3,\n    EOpConstructFloatE4M3Vec4,\n    EOpConstructStruct,\n    EOpConstructTextureSampler,\n    EOpConstructNonuniform,     // expected to be transformed away, not present in final AST\n    EOpConstructReference,\n    EOpConstructCooperativeMatrixNV,\n    EOpConstructCooperativeMatrixKHR,\n    EOpConstructCooperativeVectorNV,\n    EOpConstructAccStruct,\n    EOpConstructSaturated,\n    EOpConstructGuardEnd,\n\n    //\n    // moves\n    //\n\n    EOpAssign,\n    EOpAddAssign,\n    EOpSubAssign,\n    EOpMulAssign,\n    EOpVectorTimesMatrixAssign,\n    EOpVectorTimesScalarAssign,\n    EOpMatrixTimesScalarAssign,\n    EOpMatrixTimesMatrixAssign,\n    EOpDivAssign,\n    EOpModAssign,\n    EOpAndAssign,\n    EOpInclusiveOrAssign,\n    EOpExclusiveOrAssign,\n    EOpLeftShiftAssign,\n    EOpRightShiftAssign,\n\n    //\n    // Array operators\n    //\n\n    // Can apply to arrays, vectors, or matrices.\n    // Can be decomposed to a constant at compile time, but this does not always happen,\n    // due to link-time effects. So, consumer can expect either a link-time sized or\n    // run-time sized array.\n    EOpArrayLength,\n\n    //\n    // Image operations\n    //\n\n    EOpImageGuardBegin,\n\n    EOpImageQuerySize,\n    EOpImageQuerySamples,\n    EOpImageLoad,\n    EOpImageStore,\n    EOpImageLoadLod,\n    EOpImageStoreLod,\n    EOpImageAtomicAdd,\n    EOpImageAtomicMin,\n    EOpImageAtomicMax,\n    EOpImageAtomicAnd,\n    EOpImageAtomicOr,\n    EOpImageAtomicXor,\n    EOpImageAtomicExchange,\n    EOpImageAtomicCompSwap,\n    EOpImageAtomicLoad,\n    EOpImageAtomicStore,\n\n    EOpSubpassLoad,\n    EOpSubpassLoadMS,\n    EOpSparseImageLoad,\n    EOpSparseImageLoadLod,\n    EOpColorAttachmentReadEXT, // Fragment only\n\n    EOpImageGuardEnd,\n\n    //\n    // Texture operations\n    //\n\n    EOpTextureGuardBegin,\n\n    EOpTextureQuerySize,\n    EOpTextureQueryLod,\n    EOpTextureQueryLevels,\n    EOpTextureQuerySamples,\n\n    EOpSamplingGuardBegin,\n\n    EOpTexture,\n    EOpTextureProj,\n    EOpTextureLod,\n    EOpTextureOffset,\n    EOpTextureFetch,\n    EOpTextureFetchOffset,\n    EOpTextureProjOffset,\n    EOpTextureLodOffset,\n    EOpTextureProjLod,\n    EOpTextureProjLodOffset,\n    EOpTextureGrad,\n    EOpTextureGradOffset,\n    EOpTextureProjGrad,\n    EOpTextureProjGradOffset,\n    EOpTextureGather,\n    EOpTextureGatherOffset,\n    EOpTextureGatherOffsets,\n    EOpTextureClamp,\n    EOpTextureOffsetClamp,\n    EOpTextureGradClamp,\n    EOpTextureGradOffsetClamp,\n    EOpTextureGatherLod,\n    EOpTextureGatherLodOffset,\n    EOpTextureGatherLodOffsets,\n    EOpFragmentMaskFetch,\n    EOpFragmentFetch,\n\n    EOpSparseTextureGuardBegin,\n\n    EOpSparseTexture,\n    EOpSparseTextureLod,\n    EOpSparseTextureOffset,\n    EOpSparseTextureFetch,\n    EOpSparseTextureFetchOffset,\n    EOpSparseTextureLodOffset,\n    EOpSparseTextureGrad,\n    EOpSparseTextureGradOffset,\n    EOpSparseTextureGather,\n    EOpSparseTextureGatherOffset,\n    EOpSparseTextureGatherOffsets,\n    EOpSparseTexelsResident,\n    EOpSparseTextureClamp,\n    EOpSparseTextureOffsetClamp,\n    EOpSparseTextureGradClamp,\n    EOpSparseTextureGradOffsetClamp,\n    EOpSparseTextureGatherLod,\n    EOpSparseTextureGatherLodOffset,\n    EOpSparseTextureGatherLodOffsets,\n\n    EOpSparseTextureGuardEnd,\n\n    EOpImageFootprintGuardBegin,\n    EOpImageSampleFootprintNV,\n    EOpImageSampleFootprintClampNV,\n    EOpImageSampleFootprintLodNV,\n    EOpImageSampleFootprintGradNV,\n    EOpImageSampleFootprintGradClampNV,\n    EOpImageFootprintGuardEnd,\n    EOpSamplingGuardEnd,\n    EOpTextureGuardEnd,\n\n    //\n    // Integer operations\n    //\n\n    EOpAddCarry,\n    EOpSubBorrow,\n    EOpUMulExtended,\n    EOpIMulExtended,\n    EOpBitfieldExtract,\n    EOpBitfieldInsert,\n    EOpBitFieldReverse,\n    EOpBitCount,\n    EOpFindLSB,\n    EOpFindMSB,\n\n    EOpCountLeadingZeros,\n    EOpCountTrailingZeros,\n    EOpAbsDifference,\n    EOpAddSaturate,\n    EOpSubSaturate,\n    EOpAverage,\n    EOpAverageRounded,\n    EOpMul32x16,\n\n    EOpTraceNV,\n    EOpTraceRayMotionNV,\n    EOpTraceKHR,\n    EOpReportIntersection,\n    EOpIgnoreIntersectionNV,\n    EOpTerminateRayNV,\n    EOpExecuteCallableNV,\n    EOpExecuteCallableKHR,\n    EOpWritePackedPrimitiveIndices4x8NV,\n    EOpEmitMeshTasksEXT,\n    EOpSetMeshOutputsEXT,\n\n    //\n    // GL_EXT_ray_query operations\n    //\n\n    EOpRayQueryInitialize,\n    EOpRayQueryTerminate,\n    EOpRayQueryGenerateIntersection,\n    EOpRayQueryConfirmIntersection,\n    EOpRayQueryProceed,\n    EOpRayQueryGetIntersectionType,\n    EOpRayQueryGetRayTMin,\n    EOpRayQueryGetRayFlags,\n    EOpRayQueryGetIntersectionT,\n    EOpRayQueryGetIntersectionInstanceCustomIndex,\n    EOpRayQueryGetIntersectionInstanceId,\n    EOpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffset,\n    EOpRayQueryGetIntersectionGeometryIndex,\n    EOpRayQueryGetIntersectionPrimitiveIndex,\n    EOpRayQueryGetIntersectionBarycentrics,\n    EOpRayQueryGetIntersectionFrontFace,\n    EOpRayQueryGetIntersectionCandidateAABBOpaque,\n    EOpRayQueryGetIntersectionObjectRayDirection,\n    EOpRayQueryGetIntersectionObjectRayOrigin,\n    EOpRayQueryGetWorldRayDirection,\n    EOpRayQueryGetWorldRayOrigin,\n    EOpRayQueryGetIntersectionObjectToWorld,\n    EOpRayQueryGetIntersectionWorldToObject,\n\n    // \n    // GL_NV_shader_invocation_reorder\n    //\n\n    EOpHitObjectTraceRayNV,\n    EOpHitObjectTraceRayMotionNV,\n    EOpHitObjectRecordHitNV,\n    EOpHitObjectRecordHitMotionNV,\n    EOpHitObjectRecordHitWithIndexNV,\n    EOpHitObjectRecordHitWithIndexMotionNV,\n    EOpHitObjectRecordMissNV,\n    EOpHitObjectRecordMissMotionNV,\n    EOpHitObjectRecordEmptyNV,\n    EOpHitObjectExecuteShaderNV,\n    EOpHitObjectIsEmptyNV,\n    EOpHitObjectIsMissNV,\n    EOpHitObjectIsHitNV,\n    EOpHitObjectGetRayTMinNV,\n    EOpHitObjectGetRayTMaxNV,\n    EOpHitObjectGetObjectRayOriginNV,\n    EOpHitObjectGetObjectRayDirectionNV,\n    EOpHitObjectGetWorldRayOriginNV,\n    EOpHitObjectGetWorldRayDirectionNV,\n    EOpHitObjectGetWorldToObjectNV,\n    EOpHitObjectGetObjectToWorldNV,\n    EOpHitObjectGetInstanceCustomIndexNV,\n    EOpHitObjectGetInstanceIdNV,\n    EOpHitObjectGetGeometryIndexNV,\n    EOpHitObjectGetPrimitiveIndexNV,\n    EOpHitObjectGetHitKindNV,\n    EOpHitObjectGetShaderBindingTableRecordIndexNV,\n    EOpHitObjectGetShaderRecordBufferHandleNV,\n    EOpHitObjectGetAttributesNV,\n    EOpHitObjectGetCurrentTimeNV,\n    EOpReorderThreadNV,\n    EOpFetchMicroTriangleVertexPositionNV,\n    EOpFetchMicroTriangleVertexBarycentricNV,\n\n    // HLSL operations\n    //\n\n    EOpClip,                // discard if input value < 0\n    EOpIsFinite,\n    EOpLog10,               // base 10 log\n    EOpRcp,                 // 1/x\n    EOpSaturate,            // clamp from 0 to 1\n    EOpSinCos,              // sin and cos in out parameters\n    EOpGenMul,              // mul(x,y) on any of mat/vec/scalars\n    EOpDst,                 // x = 1, y=src0.y * src1.y, z=src0.z, w=src1.w\n    EOpInterlockedAdd,      // atomic ops, but uses [optional] out arg instead of return\n    EOpInterlockedAnd,      // ...\n    EOpInterlockedCompareExchange, // ...\n    EOpInterlockedCompareStore,    // ...\n    EOpInterlockedExchange, // ...\n    EOpInterlockedMax,      // ...\n    EOpInterlockedMin,      // ...\n    EOpInterlockedOr,       // ...\n    EOpInterlockedXor,      // ...\n    EOpAllMemoryBarrierWithGroupSync,    // memory barriers without non-hlsl AST equivalents\n    EOpDeviceMemoryBarrier,              // ...\n    EOpDeviceMemoryBarrierWithGroupSync, // ...\n    EOpWorkgroupMemoryBarrier,           // ...\n    EOpWorkgroupMemoryBarrierWithGroupSync, // ...\n    EOpEvaluateAttributeSnapped,         // InterpolateAtOffset with int position on 16x16 grid\n    EOpF32tof16,                         // HLSL conversion: half of a PackHalf2x16\n    EOpF16tof32,                         // HLSL conversion: half of an UnpackHalf2x16\n    EOpLit,                              // HLSL lighting coefficient vector\n    EOpTextureBias,                      // HLSL texture bias: will be lowered to EOpTexture\n    EOpAsDouble,                         // slightly different from EOpUint64BitsToDouble\n    EOpD3DCOLORtoUBYTE4,                 // convert and swizzle 4-component color to UBYTE4 range\n\n    EOpMethodSample,                     // Texture object methods.  These are translated to existing\n    EOpMethodSampleBias,                 // AST methods, and exist to represent HLSL semantics until that\n    EOpMethodSampleCmp,                  // translation is performed.  See HlslParseContext::decomposeSampleMethods().\n    EOpMethodSampleCmpLevelZero,         // ...\n    EOpMethodSampleGrad,                 // ...\n    EOpMethodSampleLevel,                // ...\n    EOpMethodLoad,                       // ...\n    EOpMethodGetDimensions,              // ...\n    EOpMethodGetSamplePosition,          // ...\n    EOpMethodGather,                     // ...\n    EOpMethodCalculateLevelOfDetail,     // ...\n    EOpMethodCalculateLevelOfDetailUnclamped,     // ...\n\n    // Load already defined above for textures\n    EOpMethodLoad2,                      // Structure buffer object methods.  These are translated to existing\n    EOpMethodLoad3,                      // AST methods, and exist to represent HLSL semantics until that\n    EOpMethodLoad4,                      // translation is performed.  See HlslParseContext::decomposeSampleMethods().\n    EOpMethodStore,                      // ...\n    EOpMethodStore2,                     // ...\n    EOpMethodStore3,                     // ...\n    EOpMethodStore4,                     // ...\n    EOpMethodIncrementCounter,           // ...\n    EOpMethodDecrementCounter,           // ...\n    // EOpMethodAppend is defined for geo shaders below\n    EOpMethodConsume,\n\n    // SM5 texture methods\n    EOpMethodGatherRed,                  // These are covered under the above EOpMethodSample comment about\n    EOpMethodGatherGreen,                // translation to existing AST opcodes.  They exist temporarily\n    EOpMethodGatherBlue,                 // because HLSL arguments are slightly different.\n    EOpMethodGatherAlpha,                // ...\n    EOpMethodGatherCmp,                  // ...\n    EOpMethodGatherCmpRed,               // ...\n    EOpMethodGatherCmpGreen,             // ...\n    EOpMethodGatherCmpBlue,              // ...\n    EOpMethodGatherCmpAlpha,             // ...\n\n    // geometry methods\n    EOpMethodAppend,                     // Geometry shader methods\n    EOpMethodRestartStrip,               // ...\n\n    // matrix\n    EOpMatrixSwizzle,                    // select multiple matrix components (non-column)\n\n    // SM6 wave ops\n    EOpWaveGetLaneCount,                 // Will decompose to gl_SubgroupSize.\n    EOpWaveGetLaneIndex,                 // Will decompose to gl_SubgroupInvocationID.\n    EOpWaveActiveCountBits,              // Will decompose to subgroupBallotBitCount(subgroupBallot()).\n    EOpWavePrefixCountBits,              // Will decompose to subgroupBallotInclusiveBitCount(subgroupBallot()).\n\n    // GL_EXT_expect_assume\n    EOpAssumeEXT,\n    EOpExpectEXT,\n\n    // Shader Clock Ops\n    EOpReadClockSubgroupKHR,\n    EOpReadClockDeviceKHR,\n\n    // GL_EXT_ray_tracing_position_fetch\n    EOpRayQueryGetIntersectionTriangleVertexPositionsEXT,\n\n    // Shader tile image ops\n    EOpStencilAttachmentReadEXT, // Fragment only\n    EOpDepthAttachmentReadEXT, // Fragment only\n\n    // Image processing\n    EOpImageSampleWeightedQCOM,\n    EOpImageBoxFilterQCOM,\n    EOpImageBlockMatchSADQCOM,\n    EOpImageBlockMatchSSDQCOM,\n\n    // Image processing2\n    EOpImageBlockMatchWindowSSDQCOM,\n    EOpImageBlockMatchWindowSADQCOM,\n    EOpImageBlockMatchGatherSSDQCOM,\n    EOpImageBlockMatchGatherSADQCOM,\n\n    // GL_NV_cluster_acceleration_structure\n    EOpRayQueryGetIntersectionClusterIdNV,\n    EOpHitObjectGetClusterIdNV,\n\n    // GL_NV_linear_swept_spheres\n    EOpRayQueryGetIntersectionSpherePositionNV,\n    EOpRayQueryGetIntersectionSphereRadiusNV,\n    EOpRayQueryGetIntersectionLSSHitValueNV,\n    EOpRayQueryGetIntersectionLSSPositionsNV,\n    EOpRayQueryGetIntersectionLSSRadiiNV,\n    EOpRayQueryIsSphereHitNV,\n    EOpRayQueryIsLSSHitNV,\n    EOpHitObjectGetSpherePositionNV,\n    EOpHitObjectGetSphereRadiusNV,\n    EOpHitObjectGetLSSPositionsNV,\n    EOpHitObjectGetLSSRadiiNV,\n    EOpHitObjectIsSphereHitNV,\n    EOpHitObjectIsLSSHitNV,\n};\n\ninline bool IsOpNumericConv(const TOperator op) {\n    return op == EOpConvNumeric;\n}\n\nenum TLinkType {\n    ELinkNone,\n    ELinkExport,\n};\n\nclass TIntermTraverser;\nclass TIntermOperator;\nclass TIntermAggregate;\nclass TIntermUnary;\nclass TIntermBinary;\nclass TIntermConstantUnion;\nclass TIntermSelection;\nclass TIntermSwitch;\nclass TIntermBranch;\nclass TIntermTyped;\nclass TIntermMethod;\nclass TIntermSymbol;\nclass TIntermLoop;\n\n} // end namespace glslang\n\n//\n// Base class for the tree nodes\n//\n// (Put outside the glslang namespace, as it's used as part of the external interface.)\n//\nclass TIntermNode {\npublic:\n    POOL_ALLOCATOR_NEW_DELETE(glslang::GetThreadPoolAllocator())\n\n    TIntermNode() { loc.init(); }\n    virtual const glslang::TSourceLoc& getLoc() const { return loc; }\n    virtual void setLoc(const glslang::TSourceLoc& l) { loc = l; }\n    virtual void traverse(glslang::TIntermTraverser*) = 0;\n    virtual       glslang::TIntermTyped*         getAsTyped()               { return nullptr; }\n    virtual       glslang::TIntermOperator*      getAsOperator()            { return nullptr; }\n    virtual       glslang::TIntermConstantUnion* getAsConstantUnion()       { return nullptr; }\n    virtual       glslang::TIntermAggregate*     getAsAggregate()           { return nullptr; }\n    virtual       glslang::TIntermUnary*         getAsUnaryNode()           { return nullptr; }\n    virtual       glslang::TIntermBinary*        getAsBinaryNode()          { return nullptr; }\n    virtual       glslang::TIntermSelection*     getAsSelectionNode()       { return nullptr; }\n    virtual       glslang::TIntermSwitch*        getAsSwitchNode()          { return nullptr; }\n    virtual       glslang::TIntermMethod*        getAsMethodNode()          { return nullptr; }\n    virtual       glslang::TIntermSymbol*        getAsSymbolNode()          { return nullptr; }\n    virtual       glslang::TIntermBranch*        getAsBranchNode()          { return nullptr; }\n    virtual       glslang::TIntermLoop*          getAsLoopNode()            { return nullptr; }\n\n    virtual const glslang::TIntermTyped*         getAsTyped()         const { return nullptr; }\n    virtual const glslang::TIntermOperator*      getAsOperator()      const { return nullptr; }\n    virtual const glslang::TIntermConstantUnion* getAsConstantUnion() const { return nullptr; }\n    virtual const glslang::TIntermAggregate*     getAsAggregate()     const { return nullptr; }\n    virtual const glslang::TIntermUnary*         getAsUnaryNode()     const { return nullptr; }\n    virtual const glslang::TIntermBinary*        getAsBinaryNode()    const { return nullptr; }\n    virtual const glslang::TIntermSelection*     getAsSelectionNode() const { return nullptr; }\n    virtual const glslang::TIntermSwitch*        getAsSwitchNode()    const { return nullptr; }\n    virtual const glslang::TIntermMethod*        getAsMethodNode()    const { return nullptr; }\n    virtual const glslang::TIntermSymbol*        getAsSymbolNode()    const { return nullptr; }\n    virtual const glslang::TIntermBranch*        getAsBranchNode()    const { return nullptr; }\n    virtual const glslang::TIntermLoop*          getAsLoopNode()      const { return nullptr; }\n    virtual ~TIntermNode() { }\n\nprotected:\n    TIntermNode(const TIntermNode&);\n    TIntermNode& operator=(const TIntermNode&);\n    glslang::TSourceLoc loc;\n};\n\nnamespace glslang {\n\n//\n// This is just to help yacc.\n//\nstruct TIntermNodePair {\n    TIntermNode* node1;\n    TIntermNode* node2;\n};\n\n//\n// Intermediate class for nodes that have a type.\n//\nclass TIntermTyped : public TIntermNode {\npublic:\n    TIntermTyped(const TType& t) { type.shallowCopy(t); }\n    TIntermTyped(TBasicType basicType) { TType bt(basicType); type.shallowCopy(bt); }\n    virtual       TIntermTyped* getAsTyped()       { return this; }\n    virtual const TIntermTyped* getAsTyped() const { return this; }\n    virtual void setType(const TType& t) { type.shallowCopy(t); }\n    virtual const TType& getType() const { return type; }\n    virtual TType& getWritableType() { return type; }\n\n    virtual TBasicType getBasicType() const { return type.getBasicType(); }\n    virtual TQualifier& getQualifier() { return type.getQualifier(); }\n    virtual const TQualifier& getQualifier() const { return type.getQualifier(); }\n    virtual TArraySizes* getArraySizes() { return type.getArraySizes(); }\n    virtual const TArraySizes* getArraySizes() const { return type.getArraySizes(); }\n    virtual void propagatePrecision(TPrecisionQualifier);\n    virtual int getVectorSize() const { return type.getVectorSize(); }\n    virtual int getMatrixCols() const { return type.getMatrixCols(); }\n    virtual int getMatrixRows() const { return type.getMatrixRows(); }\n    virtual bool isMatrix() const { return type.isMatrix(); }\n    virtual bool isArray()  const { return type.isArray(); }\n    virtual bool isVector() const { return type.isVector(); }\n    virtual bool isScalar() const { return type.isScalar(); }\n    virtual bool isStruct() const { return type.isStruct(); }\n    virtual bool isFloatingDomain() const { return type.isFloatingDomain(); }\n    virtual bool isIntegerDomain() const { return type.isIntegerDomain(); }\n    bool isAtomic() const { return type.isAtomic(); }\n    bool isReference() const { return type.isReference(); }\n    TString getCompleteString(bool enhanced = false) const { return type.getCompleteString(enhanced); }\n\nprotected:\n    TIntermTyped& operator=(const TIntermTyped&);\n    TType type;\n};\n\n//\n// Handle for, do-while, and while loops.\n//\nclass TIntermLoop : public TIntermNode {\npublic:\n    TIntermLoop(TIntermNode* aBody, TIntermTyped* aTest, TIntermTyped* aTerminal, bool testFirst) :\n        body(aBody),\n        test(aTest),\n        terminal(aTerminal),\n        first(testFirst),\n        unroll(false),\n        dontUnroll(false),\n        dependency(0),\n        minIterations(0),\n        maxIterations(iterationsInfinite),\n        iterationMultiple(1),\n        peelCount(0),\n        partialCount(0)\n    { }\n\n    virtual       TIntermLoop* getAsLoopNode() { return this; }\n    virtual const TIntermLoop* getAsLoopNode() const { return this; }\n    virtual void traverse(TIntermTraverser*);\n    TIntermNode*  getBody() const { return body; }\n    TIntermTyped* getTest() const { return test; }\n    TIntermTyped* getTerminal() const { return terminal; }\n    bool testFirst() const { return first; }\n\n    void setUnroll()     { unroll = true; }\n    void setDontUnroll() {\n        dontUnroll = true;\n        peelCount = 0;\n        partialCount = 0;\n    }\n    bool getUnroll()     const { return unroll; }\n    bool getDontUnroll() const { return dontUnroll; }\n\n    static const unsigned int dependencyInfinite = 0xFFFFFFFF;\n    static const unsigned int iterationsInfinite = 0xFFFFFFFF;\n    void setLoopDependency(int d) { dependency = d; }\n    int getLoopDependency() const { return dependency; }\n\n    void setMinIterations(unsigned int v) { minIterations = v; }\n    unsigned int getMinIterations() const { return minIterations; }\n    void setMaxIterations(unsigned int v) { maxIterations = v; }\n    unsigned int getMaxIterations() const { return maxIterations; }\n    void setIterationMultiple(unsigned int v) { iterationMultiple = v; }\n    unsigned int getIterationMultiple() const { return iterationMultiple; }\n    void setPeelCount(unsigned int v) {\n        peelCount = v;\n        dontUnroll = false;\n    }\n    unsigned int getPeelCount() const { return peelCount; }\n    void setPartialCount(unsigned int v) {\n        partialCount = v;\n        dontUnroll = false;\n    }\n    unsigned int getPartialCount() const { return partialCount; }\n\nprotected:\n    TIntermNode* body;       // code to loop over\n    TIntermTyped* test;      // exit condition associated with loop, could be 0 for 'for' loops\n    TIntermTyped* terminal;  // exists for for-loops\n    bool first;              // true for while and for, not for do-while\n    bool unroll;             // true if unroll requested\n    bool dontUnroll;         // true if request to not unroll\n    unsigned int dependency; // loop dependency hint; 0 means not set or unknown\n    unsigned int minIterations;      // as per the SPIR-V specification\n    unsigned int maxIterations;      // as per the SPIR-V specification\n    unsigned int iterationMultiple;  // as per the SPIR-V specification\n    unsigned int peelCount;          // as per the SPIR-V specification\n    unsigned int partialCount;       // as per the SPIR-V specification\n};\n\n//\n// Handle case, break, continue, return, and kill.\n//\nclass TIntermBranch : public TIntermNode {\npublic:\n    TIntermBranch(TOperator op, TIntermTyped* e) :\n        flowOp(op),\n        expression(e) { }\n    virtual       TIntermBranch* getAsBranchNode()       { return this; }\n    virtual const TIntermBranch* getAsBranchNode() const { return this; }\n    virtual void traverse(TIntermTraverser*);\n    TOperator getFlowOp() const { return flowOp; }\n    TIntermTyped* getExpression() const { return expression; }\n    void setExpression(TIntermTyped* pExpression) { expression = pExpression; }\n    void updatePrecision(TPrecisionQualifier parentPrecision);\nprotected:\n    TOperator flowOp;\n    TIntermTyped* expression;\n};\n\n//\n// Represent method names before seeing their calling signature\n// or resolving them to operations.  Just an expression as the base object\n// and a textural name.\n//\nclass TIntermMethod : public TIntermTyped {\npublic:\n    TIntermMethod(TIntermTyped* o, const TType& t, const TString& m) : TIntermTyped(t), object(o), method(m) { }\n    virtual       TIntermMethod* getAsMethodNode()       { return this; }\n    virtual const TIntermMethod* getAsMethodNode() const { return this; }\n    virtual const TString& getMethodName() const { return method; }\n    virtual TIntermTyped* getObject() const { return object; }\n    virtual void traverse(TIntermTraverser*);\n    void setExport() { linkType = ELinkExport; }\nprotected:\n    TIntermTyped* object;\n    TString method;\n    TLinkType linkType;\n};\n\n//\n// Nodes that correspond to symbols or constants in the source code.\n//\nclass TIntermSymbol : public TIntermTyped {\npublic:\n    // if symbol is initialized as symbol(sym), the memory comes from the pool allocator of sym. If sym comes from\n    // per process threadPoolAllocator, then it causes increased memory usage per compile\n    // it is essential to use \"symbol = sym\" to assign to symbol\n    TIntermSymbol(long long i, const TString& n, EShLanguage s, const TType& t, const TString* mn = nullptr)\n        : TIntermTyped(t), id(i), flattenSubset(-1), stage(s), constSubtree(nullptr) { \n        name = n;\n        if (mn) {\n            mangledName = *mn;\n        } else {\n            mangledName = n;\n        }\n    }\n    virtual long long getId() const { return id; }\n    virtual void changeId(long long i) { id = i; }\n    virtual const TString& getName() const { return name; }\n    virtual const TString& getMangledName() const { return mangledName; }\n    virtual void traverse(TIntermTraverser*);\n    virtual       TIntermSymbol* getAsSymbolNode()       { return this; }\n    virtual const TIntermSymbol* getAsSymbolNode() const { return this; }\n    void setConstArray(const TConstUnionArray& c) { constArray = c; }\n    const TConstUnionArray& getConstArray() const { return constArray; }\n    void setConstSubtree(TIntermTyped* subtree) { constSubtree = subtree; }\n    TIntermTyped* getConstSubtree() const { return constSubtree; }\n    void setFlattenSubset(int subset) { flattenSubset = subset; }\n    virtual const TString& getAccessName() const;\n\n    int getFlattenSubset() const { return flattenSubset; } // -1 means full object\n\n    // This is meant for cases where a node has already been constructed, and\n    // later on, it becomes necessary to switch to a different symbol.\n    virtual void switchId(long long newId) { id = newId; }\n    EShLanguage getStage() const { return stage; }\n\nprotected:\n    long long id;                // the unique id of the symbol this node represents\n    int flattenSubset;           // how deeply the flattened object rooted at id has been dereferenced\n    TString name;                // the name of the symbol this node represents\n    EShLanguage stage;\n    TString mangledName;         // mangled function name, or a copy of name if not a function\n    TConstUnionArray constArray; // if the symbol is a front-end compile-time constant, this is its value\n    TIntermTyped* constSubtree;\n};\n\nclass TIntermConstantUnion : public TIntermTyped {\npublic:\n    TIntermConstantUnion(const TConstUnionArray& ua, const TType& t) : TIntermTyped(t), constArray(ua), literal(false) { }\n    const TConstUnionArray& getConstArray() const { return constArray; }\n    virtual       TIntermConstantUnion* getAsConstantUnion()       { return this; }\n    virtual const TIntermConstantUnion* getAsConstantUnion() const { return this; }\n    virtual void traverse(TIntermTraverser*);\n    virtual TIntermTyped* fold(TOperator, const TIntermTyped*) const;\n    virtual TIntermTyped* fold(TOperator, const TType&) const;\n    void setLiteral() { literal = true; }\n    void setExpression() { literal = false; }\n    bool isLiteral() const { return literal; }\n\nprotected:\n    TIntermConstantUnion& operator=(const TIntermConstantUnion&);\n\n    const TConstUnionArray constArray;\n    bool literal;  // true if node represents a literal in the source code\n};\n\n// Represent the independent aspects of a texturing TOperator\nstruct TCrackedTextureOp {\n    bool query;\n    bool proj;\n    bool lod;\n    bool fetch;\n    bool offset;\n    bool offsets;\n    bool gather;\n    bool grad;\n    bool subpass;\n    bool lodClamp;\n    bool fragMask;\n    bool attachmentEXT;\n};\n\n//\n// Intermediate class for node types that hold operators.\n//\nclass TIntermOperator : public TIntermTyped {\npublic:\n    virtual       TIntermOperator* getAsOperator()       { return this; }\n    virtual const TIntermOperator* getAsOperator() const { return this; }\n    TOperator getOp() const { return op; }\n    void setOp(TOperator newOp) { op = newOp; }\n    bool modifiesState() const;\n    bool isConstructor() const;\n    bool isTexture()  const { return op > EOpTextureGuardBegin  && op < EOpTextureGuardEnd; }\n    bool isSampling() const { return op > EOpSamplingGuardBegin && op < EOpSamplingGuardEnd; }\n    bool isImage()    const { return op > EOpImageGuardBegin    && op < EOpImageGuardEnd; }\n    bool isSparseTexture() const { return op > EOpSparseTextureGuardBegin && op < EOpSparseTextureGuardEnd; }\n    bool isImageFootprint() const { return op > EOpImageFootprintGuardBegin && op < EOpImageFootprintGuardEnd; }\n    bool isSparseImage()   const { return op == EOpSparseImageLoad; }\n    bool isSubgroup() const { return op > EOpSubgroupGuardStart && op < EOpSubgroupGuardStop; }\n\n    void setOperationPrecision(TPrecisionQualifier p) { operationPrecision = p; }\n    TPrecisionQualifier getOperationPrecision() const { return operationPrecision != EpqNone ?\n                                                                                     operationPrecision :\n                                                                                     type.getQualifier().precision; }\n    TString getCompleteString() const\n    {\n        TString cs = type.getCompleteString();\n        if (getOperationPrecision() != type.getQualifier().precision) {\n            cs += \", operation at \";\n            cs += GetPrecisionQualifierString(getOperationPrecision());\n        }\n\n        return cs;\n    }\n\n    // Crack the op into the individual dimensions of texturing operation.\n    void crackTexture(TSampler sampler, TCrackedTextureOp& cracked) const\n    {\n        cracked.query = false;\n        cracked.proj = false;\n        cracked.lod = false;\n        cracked.fetch = false;\n        cracked.offset = false;\n        cracked.offsets = false;\n        cracked.gather = false;\n        cracked.grad = false;\n        cracked.subpass = false;\n        cracked.attachmentEXT = false;\n        cracked.lodClamp = false;\n        cracked.fragMask = false;\n\n        switch (op) {\n        case EOpImageQuerySize:\n        case EOpImageQuerySamples:\n        case EOpTextureQuerySize:\n        case EOpTextureQueryLod:\n        case EOpTextureQueryLevels:\n        case EOpTextureQuerySamples:\n        case EOpSparseTexelsResident:\n            cracked.query = true;\n            break;\n        case EOpTexture:\n        case EOpSparseTexture:\n            break;\n        case EOpTextureProj:\n            cracked.proj = true;\n            break;\n        case EOpTextureLod:\n        case EOpSparseTextureLod:\n            cracked.lod = true;\n            break;\n        case EOpTextureOffset:\n        case EOpSparseTextureOffset:\n            cracked.offset = true;\n            break;\n        case EOpTextureFetch:\n        case EOpSparseTextureFetch:\n            cracked.fetch = true;\n            if (sampler.is1D() || (sampler.dim == Esd2D && ! sampler.isMultiSample()) || sampler.dim == Esd3D)\n                cracked.lod = true;\n            break;\n        case EOpTextureFetchOffset:\n        case EOpSparseTextureFetchOffset:\n            cracked.fetch = true;\n            cracked.offset = true;\n            if (sampler.is1D() || (sampler.dim == Esd2D && ! sampler.isMultiSample()) || sampler.dim == Esd3D)\n                cracked.lod = true;\n            break;\n        case EOpTextureProjOffset:\n            cracked.offset = true;\n            cracked.proj = true;\n            break;\n        case EOpTextureLodOffset:\n        case EOpSparseTextureLodOffset:\n            cracked.offset = true;\n            cracked.lod = true;\n            break;\n        case EOpTextureProjLod:\n            cracked.lod = true;\n            cracked.proj = true;\n            break;\n        case EOpTextureProjLodOffset:\n            cracked.offset = true;\n            cracked.lod = true;\n            cracked.proj = true;\n            break;\n        case EOpTextureGrad:\n        case EOpSparseTextureGrad:\n            cracked.grad = true;\n            break;\n        case EOpTextureGradOffset:\n        case EOpSparseTextureGradOffset:\n            cracked.grad = true;\n            cracked.offset = true;\n            break;\n        case EOpTextureProjGrad:\n            cracked.grad = true;\n            cracked.proj = true;\n            break;\n        case EOpTextureProjGradOffset:\n            cracked.grad = true;\n            cracked.offset = true;\n            cracked.proj = true;\n            break;\n        case EOpTextureClamp:\n        case EOpSparseTextureClamp:\n            cracked.lodClamp = true;\n            break;\n        case EOpTextureOffsetClamp:\n        case EOpSparseTextureOffsetClamp:\n            cracked.offset = true;\n            cracked.lodClamp = true;\n            break;\n        case EOpTextureGradClamp:\n        case EOpSparseTextureGradClamp:\n            cracked.grad = true;\n            cracked.lodClamp = true;\n            break;\n        case EOpTextureGradOffsetClamp:\n        case EOpSparseTextureGradOffsetClamp:\n            cracked.grad = true;\n            cracked.offset = true;\n            cracked.lodClamp = true;\n            break;\n        case EOpTextureGather:\n        case EOpSparseTextureGather:\n            cracked.gather = true;\n            break;\n        case EOpTextureGatherOffset:\n        case EOpSparseTextureGatherOffset:\n            cracked.gather = true;\n            cracked.offset = true;\n            break;\n        case EOpTextureGatherOffsets:\n        case EOpSparseTextureGatherOffsets:\n            cracked.gather = true;\n            cracked.offsets = true;\n            break;\n        case EOpTextureGatherLod:\n        case EOpSparseTextureGatherLod:\n            cracked.gather = true;\n            cracked.lod    = true;\n            break;\n        case EOpTextureGatherLodOffset:\n        case EOpSparseTextureGatherLodOffset:\n            cracked.gather = true;\n            cracked.offset = true;\n            cracked.lod    = true;\n            break;\n        case EOpTextureGatherLodOffsets:\n        case EOpSparseTextureGatherLodOffsets:\n            cracked.gather  = true;\n            cracked.offsets = true;\n            cracked.lod     = true;\n            break;\n        case EOpImageLoadLod:\n        case EOpImageStoreLod:\n        case EOpSparseImageLoadLod:\n            cracked.lod = true;\n            break;\n        case EOpFragmentMaskFetch:\n            cracked.subpass = sampler.dim == EsdSubpass;\n            cracked.fragMask = true;\n            break;\n        case EOpFragmentFetch:\n            cracked.subpass = sampler.dim == EsdSubpass;\n            cracked.fragMask = true;\n            break;\n        case EOpImageSampleFootprintNV:\n            break;\n        case EOpImageSampleFootprintClampNV:\n            cracked.lodClamp = true;\n            break;\n        case EOpImageSampleFootprintLodNV:\n            cracked.lod = true;\n            break;\n        case EOpImageSampleFootprintGradNV:\n            cracked.grad = true;\n            break;\n        case EOpImageSampleFootprintGradClampNV:\n            cracked.lodClamp = true;\n            cracked.grad = true;\n            break;\n        case EOpSubpassLoad:\n        case EOpSubpassLoadMS:\n            cracked.subpass = true;\n            break;\n        case EOpColorAttachmentReadEXT:\n            cracked.attachmentEXT = true;\n            break;\n        default:\n            break;\n        }\n    }\n\nprotected:\n    TIntermOperator(TOperator o) : TIntermTyped(EbtFloat), op(o), operationPrecision(EpqNone) {}\n    TIntermOperator(TOperator o, TType& t) : TIntermTyped(t), op(o), operationPrecision(EpqNone) {}\n    TOperator op;\n    // The result precision is in the inherited TType, and is usually meant to be both\n    // the operation precision and the result precision. However, some more complex things,\n    // like built-in function calls, distinguish between the two, in which case non-EqpNone\n    // 'operationPrecision' overrides the result precision as far as operation precision\n    // is concerned.\n    TPrecisionQualifier operationPrecision;\n};\n\n//\n// Nodes for all the basic binary math operators.\n//\nclass TIntermBinary : public TIntermOperator {\npublic:\n    TIntermBinary(TOperator o) : TIntermOperator(o) {}\n    virtual void traverse(TIntermTraverser*);\n    virtual void setLeft(TIntermTyped* n) { left = n; }\n    virtual void setRight(TIntermTyped* n) { right = n; }\n    virtual TIntermTyped* getLeft() const { return left; }\n    virtual TIntermTyped* getRight() const { return right; }\n    virtual       TIntermBinary* getAsBinaryNode()       { return this; }\n    virtual const TIntermBinary* getAsBinaryNode() const { return this; }\n    virtual void updatePrecision();\nprotected:\n    TIntermTyped* left;\n    TIntermTyped* right;\n};\n\n//\n// Nodes for unary math operators.\n//\nclass TIntermUnary : public TIntermOperator {\npublic:\n    TIntermUnary(TOperator o, TType& t) : TIntermOperator(o, t), operand(nullptr) {}\n    TIntermUnary(TOperator o) : TIntermOperator(o), operand(nullptr) {}\n    virtual void traverse(TIntermTraverser*);\n    virtual void setOperand(TIntermTyped* o) { operand = o; }\n    virtual       TIntermTyped* getOperand() { return operand; }\n    virtual const TIntermTyped* getOperand() const { return operand; }\n    virtual       TIntermUnary* getAsUnaryNode()       { return this; }\n    virtual const TIntermUnary* getAsUnaryNode() const { return this; }\n    virtual void updatePrecision();\n    void setSpirvInstruction(const TSpirvInstruction& inst) { spirvInst = inst; }\n    const TSpirvInstruction& getSpirvInstruction() const { return spirvInst; }\nprotected:\n    TIntermTyped* operand;\n    TSpirvInstruction spirvInst;\n};\n\ntypedef TVector<TIntermNode*> TIntermSequence;\ntypedef TVector<TStorageQualifier> TQualifierList;\n//\n// Nodes that operate on an arbitrary sized set of children.\n//\nclass TIntermAggregate : public TIntermOperator {\npublic:\n    TIntermAggregate() : TIntermOperator(EOpNull), userDefined(false), pragmaTable(nullptr) { \n        endLoc.init();\n    }\n    TIntermAggregate(TOperator o) : TIntermOperator(o), pragmaTable(nullptr) {\n        endLoc.init();\n    }\n    ~TIntermAggregate() { delete pragmaTable; }\n    virtual       TIntermAggregate* getAsAggregate()       { return this; }\n    virtual const TIntermAggregate* getAsAggregate() const { return this; }\n    virtual void updatePrecision();\n    virtual void setOperator(TOperator o) { op = o; }\n    virtual       TIntermSequence& getSequence()       { return sequence; }\n    virtual const TIntermSequence& getSequence() const { return sequence; }\n    virtual void setName(const TString& n) { name = n; }\n    virtual const TString& getName() const { return name; }\n    virtual void traverse(TIntermTraverser*);\n    virtual void setUserDefined() { userDefined = true; }\n    virtual bool isUserDefined() { return userDefined; }\n    virtual TQualifierList& getQualifierList() { return qualifier; }\n    virtual const TQualifierList& getQualifierList() const { return qualifier; }\n    void setOptimize(bool o) { optimize = o; }\n    void setDebug(bool d) { debug = d; }\n    bool getOptimize() const { return optimize; }\n    bool getDebug() const { return debug; }\n    void setPragmaTable(const TPragmaTable& pTable);\n    const TPragmaTable& getPragmaTable() const { return *pragmaTable; }\n    void setSpirvInstruction(const TSpirvInstruction& inst) { spirvInst = inst; }\n    const TSpirvInstruction& getSpirvInstruction() const { return spirvInst; }\n\n    void setEndLoc(TSourceLoc loc) { endLoc = loc; }\n    TSourceLoc getEndLoc() const { return endLoc; }\n\n    void setLinkType(TLinkType l) { linkType = l; }\n    TLinkType getLinkType() const { return linkType; }\nprotected:\n    TIntermAggregate(const TIntermAggregate&); // disallow copy constructor\n    TIntermAggregate& operator=(const TIntermAggregate&); // disallow assignment operator\n    TIntermSequence sequence;\n    TQualifierList qualifier;\n    TString name;\n    bool userDefined; // used for user defined function names\n    bool optimize;\n    bool debug;\n    TPragmaTable* pragmaTable;\n    TSpirvInstruction spirvInst;\n    TLinkType linkType = ELinkNone;\n\n    // Marking the end source location of the aggregate.\n    // This is currently only set for a compound statement or a function body, pointing to '}'.\n    TSourceLoc endLoc;\n};\n\n//\n// For if tests.\n//\nclass TIntermSelection : public TIntermTyped {\npublic:\n    TIntermSelection(TIntermTyped* cond, TIntermNode* trueB, TIntermNode* falseB) :\n        TIntermTyped(EbtVoid), condition(cond), trueBlock(trueB), falseBlock(falseB),\n        shortCircuit(true),\n        flatten(false), dontFlatten(false) {}\n    TIntermSelection(TIntermTyped* cond, TIntermNode* trueB, TIntermNode* falseB, const TType& type) :\n        TIntermTyped(type), condition(cond), trueBlock(trueB), falseBlock(falseB),\n        shortCircuit(true),\n        flatten(false), dontFlatten(false) {}\n    virtual void traverse(TIntermTraverser*);\n    virtual TIntermTyped* getCondition() const { return condition; }\n    virtual void setCondition(TIntermTyped* c) { condition = c; }\n    virtual TIntermNode* getTrueBlock() const { return trueBlock; }\n    virtual void setTrueBlock(TIntermTyped* tb) { trueBlock = tb; }\n    virtual TIntermNode* getFalseBlock() const { return falseBlock; }\n    virtual void setFalseBlock(TIntermTyped* fb) { falseBlock = fb; }\n    virtual       TIntermSelection* getAsSelectionNode()       { return this; }\n    virtual const TIntermSelection* getAsSelectionNode() const { return this; }\n\n    void setNoShortCircuit() { shortCircuit = false; }\n    bool getShortCircuit() const { return shortCircuit; }\n\n    void setFlatten()     { flatten = true; }\n    void setDontFlatten() { dontFlatten = true; }\n    bool getFlatten()     const { return flatten; }\n    bool getDontFlatten() const { return dontFlatten; }\n\nprotected:\n    TIntermTyped* condition;\n    TIntermNode* trueBlock;\n    TIntermNode* falseBlock;\n    bool shortCircuit; // normally all if-then-else and all GLSL ?: short-circuit, but HLSL ?: does not\n    bool flatten;      // true if flatten requested\n    bool dontFlatten;  // true if requested to not flatten\n};\n\n//\n// For switch statements.  Designed use is that a switch will have sequence of nodes\n// that are either case/default nodes or a *single* node that represents all the code\n// in between (if any) consecutive case/defaults.  So, a traversal need only deal with\n// 0 or 1 nodes per case/default statement.\n//\nclass TIntermSwitch : public TIntermNode {\npublic:\n    TIntermSwitch(TIntermTyped* cond, TIntermAggregate* b) : condition(cond), body(b),\n        flatten(false), dontFlatten(false) {}\n    virtual void traverse(TIntermTraverser*);\n    virtual TIntermNode* getCondition() const { return condition; }\n    virtual TIntermAggregate* getBody() const { return body; }\n    virtual       TIntermSwitch* getAsSwitchNode()       { return this; }\n    virtual const TIntermSwitch* getAsSwitchNode() const { return this; }\n\n    void setFlatten()     { flatten = true; }\n    void setDontFlatten() { dontFlatten = true; }\n    bool getFlatten()     const { return flatten; }\n    bool getDontFlatten() const { return dontFlatten; }\n\nprotected:\n    TIntermTyped* condition;\n    TIntermAggregate* body;\n    bool flatten;     // true if flatten requested\n    bool dontFlatten; // true if requested to not flatten\n};\n\nenum TVisit\n{\n    EvPreVisit,\n    EvInVisit,\n    EvPostVisit\n};\n\n//\n// For traversing the tree.  User should derive from this,\n// put their traversal specific data in it, and then pass\n// it to a Traverse method.\n//\n// When using this, just fill in the methods for nodes you want visited.\n// Return false from a pre-visit to skip visiting that node's subtree.\n//\n// Explicitly set postVisit to true if you want post visiting, otherwise,\n// filled in methods will only be called at pre-visit time (before processing\n// the subtree).  Similarly for inVisit for in-order visiting of nodes with\n// multiple children.\n//\n// If you only want post-visits, explicitly turn off preVisit (and inVisit)\n// and turn on postVisit.\n//\n// In general, for the visit*() methods, return true from interior nodes\n// to have the traversal continue on to children.\n//\n// If you process children yourself, or don't want them processed, return false.\n//\nclass TIntermTraverser {\npublic:\n    POOL_ALLOCATOR_NEW_DELETE(glslang::GetThreadPoolAllocator())\n    TIntermTraverser(bool preVisit = true, bool inVisit = false, bool postVisit = false, bool rightToLeft = false) :\n            preVisit(preVisit),\n            inVisit(inVisit),\n            postVisit(postVisit),\n            rightToLeft(rightToLeft),\n            depth(0),\n            maxDepth(0) { }\n    virtual ~TIntermTraverser() { }\n\n    virtual void visitSymbol(TIntermSymbol*)               { }\n    virtual void visitConstantUnion(TIntermConstantUnion*) { }\n    virtual bool visitBinary(TVisit, TIntermBinary*)       { return true; }\n    virtual bool visitUnary(TVisit, TIntermUnary*)         { return true; }\n    virtual bool visitSelection(TVisit, TIntermSelection*) { return true; }\n    virtual bool visitAggregate(TVisit, TIntermAggregate*) { return true; }\n    virtual bool visitLoop(TVisit, TIntermLoop*)           { return true; }\n    virtual bool visitBranch(TVisit, TIntermBranch*)       { return true; }\n    virtual bool visitSwitch(TVisit, TIntermSwitch*)       { return true; }\n\n    int getMaxDepth() const { return maxDepth; }\n\n    void incrementDepth(TIntermNode *current)\n    {\n        depth++;\n        maxDepth = (std::max)(maxDepth, depth);\n        path.push_back(current);\n    }\n\n    void decrementDepth()\n    {\n        depth--;\n        path.pop_back();\n    }\n\n    TIntermNode *getParentNode()\n    {\n        return path.size() == 0 ? nullptr : path.back();\n    }\n\n    const bool preVisit;\n    const bool inVisit;\n    const bool postVisit;\n    const bool rightToLeft;\n\nprotected:\n    TIntermTraverser& operator=(TIntermTraverser&);\n\n    int depth;\n    int maxDepth;\n\n    // All the nodes from root to the current node's parent during traversing.\n    TVector<TIntermNode *> path;\n};\n\n// KHR_vulkan_glsl says \"Two arrays sized with specialization constants are the same type only if\n// sized with the same symbol, involving no operations\"\ninline bool SameSpecializationConstants(TIntermTyped* node1, TIntermTyped* node2)\n{\n    return node1->getAsSymbolNode() && node2->getAsSymbolNode() &&\n           node1->getAsSymbolNode()->getId() == node2->getAsSymbolNode()->getId();\n}\n\n} // end namespace glslang\n\n#endif // __INTERMEDIATE_H\n"
  },
  {
    "path": "src/libraries/glslang/glslang/Include/visibility.h",
    "content": "//\n// Copyright (C) 2023 LunarG, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n#ifdef GLSLANG_IS_SHARED_LIBRARY\n    #ifdef _WIN32\n        #ifdef GLSLANG_EXPORTING\n            #define GLSLANG_EXPORT __declspec(dllexport)\n        #else\n            #define GLSLANG_EXPORT __declspec(dllimport)\n        #endif\n    #elif __GNUC__ >= 4\n        #define GLSLANG_EXPORT __attribute__((visibility(\"default\")))\n    #endif\n#endif // GLSLANG_IS_SHARED_LIBRARY\n\n#ifndef GLSLANG_EXPORT\n#define GLSLANG_EXPORT\n#endif\n\n// Symbols marked with this macro are only meant for public use by the test suite\n// and do not appear in publicly installed headers. They are not considered to be\n// part of the glslang library ABI.\n#define GLSLANG_EXPORT_FOR_TESTS GLSLANG_EXPORT\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/Constant.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2012-2013 LunarG, Inc.\n// Copyright (C) 2017 ARM Limited.\n// Copyright (C) 2018-2020 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#include \"localintermediate.h\"\n#include <cmath>\n#include <cfloat>\n#include <cstdlib>\n#include <climits>\n\nnamespace {\n\nusing namespace glslang;\n\nconst double pi = 3.1415926535897932384626433832795;\n\n} // end anonymous namespace\n\n\nnamespace glslang {\n\n//\n// The fold functions see if an operation on a constant can be done in place,\n// without generating run-time code.\n//\n// Returns the node to keep using, which may or may not be the node passed in.\n//\n// Note: As of version 1.2, all constant operations must be folded.  It is\n// not opportunistic, but rather a semantic requirement.\n//\n\n//\n// Do folding between a pair of nodes.\n// 'this' is the left-hand operand and 'rightConstantNode' is the right-hand operand.\n//\n// Returns a new node representing the result.\n//\nTIntermTyped* TIntermConstantUnion::fold(TOperator op, const TIntermTyped* rightConstantNode) const\n{\n    // For most cases, the return type matches the argument type, so set that\n    // up and just code to exceptions below.\n    TType returnType;\n    returnType.shallowCopy(getType());\n\n    //\n    // A pair of nodes is to be folded together\n    //\n\n    const TIntermConstantUnion *rightNode = rightConstantNode->getAsConstantUnion();\n    TConstUnionArray leftUnionArray = getConstArray();\n    TConstUnionArray rightUnionArray = rightNode->getConstArray();\n\n    // Figure out the size of the result\n    int newComps;\n    int constComps;\n    switch(op) {\n    case EOpMatrixTimesMatrix:\n        newComps = rightNode->getMatrixCols() * getMatrixRows();\n        break;\n    case EOpMatrixTimesVector:\n        newComps = getMatrixRows();\n        break;\n    case EOpVectorTimesMatrix:\n        newComps = rightNode->getMatrixCols();\n        break;\n    default:\n        newComps = getType().computeNumComponents();\n        constComps = rightConstantNode->getType().computeNumComponents();\n        if (constComps == 1 && newComps > 1) {\n            // for a case like vec4 f = vec4(2,3,4,5) + 1.2;\n            TConstUnionArray smearedArray(newComps, rightNode->getConstArray()[0]);\n            rightUnionArray = smearedArray;\n        } else if (constComps > 1 && newComps == 1) {\n            // for a case like vec4 f = 1.2 + vec4(2,3,4,5);\n            newComps = constComps;\n            rightUnionArray = rightNode->getConstArray();\n            TConstUnionArray smearedArray(newComps, getConstArray()[0]);\n            leftUnionArray = smearedArray;\n            returnType.shallowCopy(rightNode->getType());\n        }\n        break;\n    }\n\n    TConstUnionArray newConstArray(newComps);\n    TType constBool(EbtBool, EvqConst);\n\n    switch(op) {\n    case EOpAdd:\n        for (int i = 0; i < newComps; i++)\n            newConstArray[i] = leftUnionArray[i] + rightUnionArray[i];\n        break;\n    case EOpSub:\n        for (int i = 0; i < newComps; i++)\n            newConstArray[i] = leftUnionArray[i] - rightUnionArray[i];\n        break;\n\n    case EOpMul:\n    case EOpVectorTimesScalar:\n    case EOpMatrixTimesScalar:\n        for (int i = 0; i < newComps; i++)\n            newConstArray[i] = leftUnionArray[i] * rightUnionArray[i];\n        break;\n    case EOpMatrixTimesMatrix:\n        for (int row = 0; row < getMatrixRows(); row++) {\n            for (int column = 0; column < rightNode->getMatrixCols(); column++) {\n                double sum = 0.0f;\n                for (int i = 0; i < rightNode->getMatrixRows(); i++)\n                    sum += leftUnionArray[i * getMatrixRows() + row].getDConst() * rightUnionArray[column * rightNode->getMatrixRows() + i].getDConst();\n                newConstArray[column * getMatrixRows() + row].setDConst(sum);\n            }\n        }\n        returnType.shallowCopy(TType(getType().getBasicType(), EvqConst, 0, rightNode->getMatrixCols(), getMatrixRows()));\n        break;\n    case EOpDiv:\n        for (int i = 0; i < newComps; i++) {\n            switch (getType().getBasicType()) {\n            case EbtDouble:\n            case EbtFloat:\n            case EbtFloat16:\n            case EbtBFloat16:\n            case EbtFloatE5M2:\n            case EbtFloatE4M3:\n                if (rightUnionArray[i].getDConst() != 0.0)\n                    newConstArray[i].setDConst(leftUnionArray[i].getDConst() / rightUnionArray[i].getDConst());\n                else if (leftUnionArray[i].getDConst() > 0.0)\n                    newConstArray[i].setDConst((double)INFINITY);\n                else if (leftUnionArray[i].getDConst() < 0.0)\n                    newConstArray[i].setDConst(-(double)INFINITY);\n                else\n                    newConstArray[i].setDConst((double)NAN);\n                break;\n\n            case EbtInt:\n                if (rightUnionArray[i] == 0)\n                    newConstArray[i].setIConst(0x7FFFFFFF);\n                else if (rightUnionArray[i].getIConst() == -1 && leftUnionArray[i].getIConst() == (int)-0x80000000ll)\n                    newConstArray[i].setIConst((int)-0x80000000ll);\n                else\n                    newConstArray[i].setIConst(leftUnionArray[i].getIConst() / rightUnionArray[i].getIConst());\n                break;\n\n            case EbtUint:\n                if (rightUnionArray[i] == 0u)\n                    newConstArray[i].setUConst(0xFFFFFFFFu);\n                else\n                    newConstArray[i].setUConst(leftUnionArray[i].getUConst() / rightUnionArray[i].getUConst());\n                break;\n\n            case EbtInt8:\n                if (rightUnionArray[i] == (signed char)0)\n                    newConstArray[i].setI8Const((signed char)0x7F);\n                else if (rightUnionArray[i].getI8Const() == (signed char)-1 && leftUnionArray[i].getI8Const() == (signed char)-0x80)\n                    newConstArray[i].setI8Const((signed char)-0x80);\n                else\n                    newConstArray[i].setI8Const(leftUnionArray[i].getI8Const() / rightUnionArray[i].getI8Const());\n                break;\n\n            case EbtUint8:\n                if (rightUnionArray[i] == (unsigned char)0u)\n                    newConstArray[i].setU8Const((unsigned char)0xFFu);\n                else\n                    newConstArray[i].setU8Const(leftUnionArray[i].getU8Const() / rightUnionArray[i].getU8Const());\n                break;\n\n           case EbtInt16:\n                if (rightUnionArray[i] == (signed short)0)\n                    newConstArray[i].setI16Const((signed short)0x7FFF);\n                else if (rightUnionArray[i].getI16Const() == (signed short)-1 && leftUnionArray[i].getI16Const() == (signed short)-0x8000)\n                    newConstArray[i].setI16Const((signed short)-0x8000);\n                else\n                    newConstArray[i].setI16Const(leftUnionArray[i].getI16Const() / rightUnionArray[i].getI16Const());\n                break;\n\n            case EbtUint16:\n                if (rightUnionArray[i] == (unsigned short)0u)\n                    newConstArray[i].setU16Const((unsigned short)0xFFFFu);\n                else\n                    newConstArray[i].setU16Const(leftUnionArray[i].getU16Const() / rightUnionArray[i].getU16Const());\n                break;\n\n            case EbtInt64:\n                if (rightUnionArray[i] == 0ll)\n                    newConstArray[i].setI64Const(LLONG_MAX);\n                else if (rightUnionArray[i].getI64Const() == -1 && leftUnionArray[i].getI64Const() == LLONG_MIN)\n                    newConstArray[i].setI64Const(LLONG_MIN);\n                else\n                    newConstArray[i].setI64Const(leftUnionArray[i].getI64Const() / rightUnionArray[i].getI64Const());\n                break;\n\n            case EbtUint64:\n                if (rightUnionArray[i] == 0ull)\n                    newConstArray[i].setU64Const(0xFFFFFFFFFFFFFFFFull);\n                else\n                    newConstArray[i].setU64Const(leftUnionArray[i].getU64Const() / rightUnionArray[i].getU64Const());\n                break;\n            default:\n                return nullptr;\n            }\n        }\n        break;\n\n    case EOpMatrixTimesVector:\n        for (int i = 0; i < getMatrixRows(); i++) {\n            double sum = 0.0f;\n            for (int j = 0; j < rightNode->getVectorSize(); j++) {\n                sum += leftUnionArray[j*getMatrixRows() + i].getDConst() * rightUnionArray[j].getDConst();\n            }\n            newConstArray[i].setDConst(sum);\n        }\n\n        returnType.shallowCopy(TType(getBasicType(), EvqConst, getMatrixRows()));\n        break;\n\n    case EOpVectorTimesMatrix:\n        for (int i = 0; i < rightNode->getMatrixCols(); i++) {\n            double sum = 0.0f;\n            for (int j = 0; j < getVectorSize(); j++)\n                sum += leftUnionArray[j].getDConst() * rightUnionArray[i*rightNode->getMatrixRows() + j].getDConst();\n            newConstArray[i].setDConst(sum);\n        }\n\n        returnType.shallowCopy(TType(getBasicType(), EvqConst, rightNode->getMatrixCols()));\n        break;\n\n    case EOpMod:\n        for (int i = 0; i < newComps; i++) {\n            if (rightUnionArray[i] == 0)\n                newConstArray[i] = leftUnionArray[i];\n            else {\n                switch (getType().getBasicType()) {\n                case EbtInt:\n                    if (rightUnionArray[i].getIConst() == -1 && leftUnionArray[i].getIConst() == INT_MIN) {\n                        newConstArray[i].setIConst(0);\n                        break;\n                    } else goto modulo_default;\n                case EbtInt64:\n                    if (rightUnionArray[i].getI64Const() == -1 && leftUnionArray[i].getI64Const() == LLONG_MIN) {\n                        newConstArray[i].setI64Const(0);\n                        break;\n                    } else goto modulo_default;\n                case EbtInt16:\n                    if (rightUnionArray[i].getIConst() == -1 && leftUnionArray[i].getIConst() == SHRT_MIN) {\n                        newConstArray[i].setIConst(0);\n                        break;\n                    } else goto modulo_default;\n                default:\n                modulo_default:\n                    newConstArray[i] = leftUnionArray[i] % rightUnionArray[i];\n                }\n            }\n        }\n        break;\n\n    case EOpRightShift:\n        for (int i = 0; i < newComps; i++)\n            newConstArray[i] = leftUnionArray[i] >> rightUnionArray[i];\n        break;\n\n    case EOpLeftShift:\n        for (int i = 0; i < newComps; i++)\n            newConstArray[i] = leftUnionArray[i] << rightUnionArray[i];\n        break;\n\n    case EOpAnd:\n        for (int i = 0; i < newComps; i++)\n            newConstArray[i] = leftUnionArray[i] & rightUnionArray[i];\n        break;\n    case EOpInclusiveOr:\n        for (int i = 0; i < newComps; i++)\n            newConstArray[i] = leftUnionArray[i] | rightUnionArray[i];\n        break;\n    case EOpExclusiveOr:\n        for (int i = 0; i < newComps; i++)\n            newConstArray[i] = leftUnionArray[i] ^ rightUnionArray[i];\n        break;\n\n    case EOpLogicalAnd: // this code is written for possible future use, will not get executed currently\n        for (int i = 0; i < newComps; i++)\n            newConstArray[i] = leftUnionArray[i] && rightUnionArray[i];\n        break;\n\n    case EOpLogicalOr: // this code is written for possible future use, will not get executed currently\n        for (int i = 0; i < newComps; i++)\n            newConstArray[i] = leftUnionArray[i] || rightUnionArray[i];\n        break;\n\n    case EOpLogicalXor:\n        for (int i = 0; i < newComps; i++) {\n            switch (getType().getBasicType()) {\n            case EbtBool: newConstArray[i].setBConst((leftUnionArray[i] == rightUnionArray[i]) ? false : true); break;\n            default: assert(false && \"Default missing\");\n            }\n        }\n        break;\n\n    case EOpLessThan:\n        newConstArray[0].setBConst(leftUnionArray[0] < rightUnionArray[0]);\n        returnType.shallowCopy(constBool);\n        break;\n    case EOpGreaterThan:\n        newConstArray[0].setBConst(leftUnionArray[0] > rightUnionArray[0]);\n        returnType.shallowCopy(constBool);\n        break;\n    case EOpLessThanEqual:\n        newConstArray[0].setBConst(! (leftUnionArray[0] > rightUnionArray[0]));\n        returnType.shallowCopy(constBool);\n        break;\n    case EOpGreaterThanEqual:\n        newConstArray[0].setBConst(! (leftUnionArray[0] < rightUnionArray[0]));\n        returnType.shallowCopy(constBool);\n        break;\n    case EOpEqual:\n        newConstArray[0].setBConst(rightNode->getConstArray() == leftUnionArray);\n        returnType.shallowCopy(constBool);\n        break;\n    case EOpNotEqual:\n        newConstArray[0].setBConst(rightNode->getConstArray() != leftUnionArray);\n        returnType.shallowCopy(constBool);\n        break;\n\n    default:\n        return nullptr;\n    }\n\n    TIntermConstantUnion *newNode = new TIntermConstantUnion(newConstArray, returnType);\n    newNode->setLoc(getLoc());\n\n    return newNode;\n}\n\n//\n// Do single unary node folding\n//\n// Returns a new node representing the result.\n//\nTIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType) const\n{\n    // First, size the result, which is mostly the same as the argument's size,\n    // but not always, and classify what is componentwise.\n    // Also, eliminate cases that can't be compile-time constant.\n    int resultSize;\n    bool componentWise = true;\n\n    int objectSize = getType().computeNumComponents();\n    switch (op) {\n    case EOpDeterminant:\n    case EOpAny:\n    case EOpAll:\n    case EOpLength:\n        componentWise = false;\n        resultSize = 1;\n        break;\n\n    case EOpEmitStreamVertex:\n    case EOpEndStreamPrimitive:\n        // These don't fold\n        return nullptr;\n\n    case EOpPackSnorm2x16:\n    case EOpPackUnorm2x16:\n    case EOpPackHalf2x16:\n        componentWise = false;\n        resultSize = 1;\n        break;\n\n    case EOpUnpackSnorm2x16:\n    case EOpUnpackUnorm2x16:\n    case EOpUnpackHalf2x16:\n        componentWise = false;\n        resultSize = 2;\n        break;\n\n    case EOpPack16:\n    case EOpPack32:\n    case EOpPack64:\n    case EOpUnpack32:\n    case EOpUnpack16:\n    case EOpUnpack8:\n    case EOpNormalize:\n        componentWise = false;\n        resultSize = objectSize;\n        break;\n\n    default:\n        resultSize = objectSize;\n        break;\n    }\n\n    // Set up for processing\n    TConstUnionArray newConstArray(resultSize);\n    const TConstUnionArray& unionArray = getConstArray();\n\n    // Process non-component-wise operations\n    switch (op) {\n    case EOpLength:\n    case EOpNormalize:\n    {\n        double sum = 0;\n        for (int i = 0; i < objectSize; i++)\n            sum += unionArray[i].getDConst() * unionArray[i].getDConst();\n        double length = sqrt(sum);\n        if (op == EOpLength)\n            newConstArray[0].setDConst(length);\n        else {\n            for (int i = 0; i < objectSize; i++)\n                newConstArray[i].setDConst(unionArray[i].getDConst() / length);\n        }\n        break;\n    }\n\n    case EOpAny:\n    {\n        bool result = false;\n        for (int i = 0; i < objectSize; i++) {\n            if (unionArray[i].getBConst())\n                result = true;\n        }\n        newConstArray[0].setBConst(result);\n        break;\n    }\n    case EOpAll:\n    {\n        bool result = true;\n        for (int i = 0; i < objectSize; i++) {\n            if (! unionArray[i].getBConst())\n                result = false;\n        }\n        newConstArray[0].setBConst(result);\n        break;\n    }\n\n    case EOpPackSnorm2x16:\n    case EOpPackUnorm2x16:\n    case EOpPackHalf2x16:\n    case EOpPack16:\n    case EOpPack32:\n    case EOpPack64:\n    case EOpUnpack32:\n    case EOpUnpack16:\n    case EOpUnpack8:\n\n    case EOpUnpackSnorm2x16:\n    case EOpUnpackUnorm2x16:\n    case EOpUnpackHalf2x16:\n\n    case EOpDeterminant:\n    case EOpMatrixInverse:\n    case EOpTranspose:\n        return nullptr;\n\n    default:\n        assert(componentWise);\n        break;\n    }\n\n    // Turn off the componentwise loop\n    if (! componentWise)\n        objectSize = 0;\n\n    // Process component-wise operations\n    for (int i = 0; i < objectSize; i++) {\n        // First read the value and convert to i64/u64/f64/bool, then convert\n        // to the destination type (still 64b), then convert down to the\n        // destination size.\n        if (IsOpNumericConv(op)) {\n            enum ConvType { CONV_FLOAT, CONV_INT, CONV_UINT, CONV_BOOL };\n            ConvType srcType = CONV_UINT, dstType = CONV_UINT;\n            double valf = 0.0;\n            uint64_t valu = 0;\n            int64_t vali = 0;\n            bool valb = false;\n            switch (getType().getBasicType()) {\n            case EbtDouble:\n            case EbtFloat16:\n            case EbtBFloat16:\n            case EbtFloatE5M2:\n            case EbtFloatE4M3:\n            case EbtFloat:\n                valf = unionArray[i].getDConst();\n                srcType = CONV_FLOAT;\n                break;\n            case EbtInt8:\n                vali = unionArray[i].getI8Const();\n                srcType = CONV_INT;\n                break;\n            case EbtInt16:\n                vali = unionArray[i].getI16Const();\n                srcType = CONV_INT;\n                break;\n            case EbtInt:\n                vali = unionArray[i].getIConst();\n                srcType = CONV_INT;\n                break;\n            case EbtInt64:\n                vali = unionArray[i].getI64Const();\n                srcType = CONV_INT;\n                break;\n            case EbtUint8:\n                valu = unionArray[i].getU8Const();\n                srcType = CONV_UINT;\n                break;\n            case EbtUint16:\n                valu = unionArray[i].getU16Const();\n                srcType = CONV_UINT;\n                break;\n            case EbtUint:\n                valu = unionArray[i].getUConst();\n                srcType = CONV_UINT;\n                break;\n            case EbtUint64:\n                valu = unionArray[i].getU64Const();\n                srcType = CONV_UINT;\n                break;\n            case EbtBool:\n                valb = unionArray[i].getBConst();\n                srcType = CONV_BOOL;\n                break;\n            default:\n                assert(0);\n                break;\n            }\n\n            switch (returnType.getBasicType()) {\n            case EbtDouble:\n            case EbtFloat16:\n            case EbtBFloat16:\n            case EbtFloatE5M2:\n            case EbtFloatE4M3:\n            case EbtFloat:\n                dstType = CONV_FLOAT;\n                break;\n            case EbtInt8:\n            case EbtInt16:\n            case EbtInt:\n            case EbtInt64:\n                dstType = CONV_INT;\n                break;\n            case EbtUint8:\n            case EbtUint16:\n            case EbtUint:\n            case EbtUint64:\n                dstType = CONV_UINT;\n                break;\n            case EbtBool:\n                dstType = CONV_BOOL;\n                break;\n            default:\n                assert(0);\n                break;\n            }\n            if (dstType == CONV_BOOL) {\n                switch (srcType) {\n                case CONV_FLOAT:\n                    valb = (valf != 0.0); break;\n                case CONV_INT:\n                    valb = (vali != 0.0); break;\n                case CONV_UINT:\n                    valb = (valu != 0.0); break;\n                default:\n                    break;\n                }\n            } else if (dstType == CONV_FLOAT) {\n                switch (srcType) {\n                case CONV_BOOL:\n                    valf = (double)valb; break;\n                case CONV_INT:\n                    valf = (double)vali; break;\n                case CONV_UINT:\n                    valf = (double)valu; break;\n                default:\n                    break;\n                }\n            } else if (dstType == CONV_INT) {\n                switch (srcType) {\n                case CONV_BOOL:\n                    vali = (int64_t)valb; break;\n                case CONV_FLOAT:\n                    vali = (int64_t)valf; break;\n                case CONV_UINT:\n                    vali = (int64_t)valu; break;\n                default:\n                    break;\n                }\n            } else if (dstType == CONV_UINT) {\n                switch (srcType) {\n                case CONV_BOOL:\n                    valu = (uint64_t)valb; break;\n                case CONV_FLOAT:\n                    valu = (uint64_t)valf; break;\n                case CONV_INT:\n                    valu = (uint64_t)vali; break;\n                default:\n                    break;\n                }\n            }\n            switch (returnType.getBasicType()) {\n            case EbtDouble:\n            case EbtFloat16:\n            case EbtBFloat16:\n            case EbtFloatE5M2:\n            case EbtFloatE4M3:\n            case EbtFloat:\n                newConstArray[i].setDConst(valf); break;\n            case EbtInt8:\n                newConstArray[i].setI8Const(static_cast<int8_t>(vali)); break;\n            case EbtInt16:\n                newConstArray[i].setI16Const(static_cast<int16_t>(vali)); break;\n            case EbtInt:\n                newConstArray[i].setIConst(static_cast<int32_t>(vali)); break;\n            case EbtInt64:\n                newConstArray[i].setI64Const(vali); break;\n            case EbtUint8:\n                newConstArray[i].setU8Const(static_cast<uint8_t>(valu)); break;\n            case EbtUint16:\n                newConstArray[i].setU16Const(static_cast<uint16_t>(valu)); break;\n            case EbtUint:\n                newConstArray[i].setUConst(static_cast<uint32_t>(valu)); break;\n            case EbtUint64:\n                newConstArray[i].setU64Const(valu); break;\n            case EbtBool:\n                newConstArray[i].setBConst(valb); break;\n            default:\n                assert(0);\n                break;\n            }\n            continue;\n        }\n        switch (op) {\n        case EOpNegative:\n            switch (getType().getBasicType()) {\n            case EbtDouble:\n            case EbtFloat16:\n            case EbtBFloat16:\n            case EbtFloatE5M2:\n            case EbtFloatE4M3:\n            case EbtFloat: newConstArray[i].setDConst(-unionArray[i].getDConst()); break;\n            // Note: avoid UBSAN error regarding negating 0x80000000\n            case EbtInt:   newConstArray[i].setIConst(\n                                static_cast<unsigned int>(unionArray[i].getIConst()) == 0x80000000\n                                    ? -0x7FFFFFFF - 1\n                                    : -unionArray[i].getIConst());\n                           break;\n            case EbtUint:  newConstArray[i].setUConst(static_cast<unsigned int>(-static_cast<int>(unionArray[i].getUConst())));  break;\n            case EbtInt8:  newConstArray[i].setI8Const(-unionArray[i].getI8Const()); break;\n            case EbtUint8: newConstArray[i].setU8Const(static_cast<unsigned int>(-static_cast<signed int>(unionArray[i].getU8Const())));  break;\n            case EbtInt16: newConstArray[i].setI16Const(-unionArray[i].getI16Const()); break;\n            case EbtUint16:newConstArray[i].setU16Const(static_cast<unsigned int>(-static_cast<signed int>(unionArray[i].getU16Const())));  break;\n            case EbtInt64: {\n                int64_t i64val = unionArray[i].getI64Const();\n                newConstArray[i].setI64Const(i64val == INT64_MIN ? INT64_MIN : -i64val);\n                break;\n            }\n            case EbtUint64: newConstArray[i].setU64Const(static_cast<unsigned long long>(-static_cast<long long>(unionArray[i].getU64Const())));  break;\n            default:\n                return nullptr;\n            }\n            break;\n        case EOpLogicalNot:\n        case EOpVectorLogicalNot:\n            switch (getType().getBasicType()) {\n            case EbtBool:  newConstArray[i].setBConst(!unionArray[i].getBConst()); break;\n            default:\n                return nullptr;\n            }\n            break;\n        case EOpBitwiseNot:\n            newConstArray[i] = ~unionArray[i];\n            break;\n        case EOpRadians:\n            newConstArray[i].setDConst(unionArray[i].getDConst() * pi / 180.0);\n            break;\n        case EOpDegrees:\n            newConstArray[i].setDConst(unionArray[i].getDConst() * 180.0 / pi);\n            break;\n        case EOpSin:\n            newConstArray[i].setDConst(sin(unionArray[i].getDConst()));\n            break;\n        case EOpCos:\n            newConstArray[i].setDConst(cos(unionArray[i].getDConst()));\n            break;\n        case EOpTan:\n            newConstArray[i].setDConst(tan(unionArray[i].getDConst()));\n            break;\n        case EOpAsin:\n            newConstArray[i].setDConst(asin(unionArray[i].getDConst()));\n            break;\n        case EOpAcos:\n            newConstArray[i].setDConst(acos(unionArray[i].getDConst()));\n            break;\n        case EOpAtan:\n            newConstArray[i].setDConst(atan(unionArray[i].getDConst()));\n            break;\n\n        case EOpDPdx:\n        case EOpDPdy:\n        case EOpFwidth:\n        case EOpDPdxFine:\n        case EOpDPdyFine:\n        case EOpFwidthFine:\n        case EOpDPdxCoarse:\n        case EOpDPdyCoarse:\n        case EOpFwidthCoarse:\n            // The derivatives are all mandated to create a constant 0.\n            newConstArray[i].setDConst(0.0);\n            break;\n\n        case EOpExp:\n            newConstArray[i].setDConst(exp(unionArray[i].getDConst()));\n            break;\n        case EOpLog:\n            newConstArray[i].setDConst(log(unionArray[i].getDConst()));\n            break;\n        case EOpExp2:\n            newConstArray[i].setDConst(exp2(unionArray[i].getDConst()));\n            break;\n        case EOpLog2:\n            newConstArray[i].setDConst(log2(unionArray[i].getDConst()));\n            break;\n        case EOpSqrt:\n            newConstArray[i].setDConst(sqrt(unionArray[i].getDConst()));\n            break;\n        case EOpInverseSqrt:\n            newConstArray[i].setDConst(1.0 / sqrt(unionArray[i].getDConst()));\n            break;\n\n        case EOpAbs:\n            if (unionArray[i].getType() == EbtDouble)\n                newConstArray[i].setDConst(fabs(unionArray[i].getDConst()));\n            else if (unionArray[i].getType() == EbtInt)\n                newConstArray[i].setIConst(abs(unionArray[i].getIConst()));\n            else\n                newConstArray[i] = unionArray[i];\n            break;\n        case EOpSign:\n            #define SIGN(X) (X == 0 ? 0 : (X < 0 ? -1 : 1))\n            if (unionArray[i].getType() == EbtDouble)\n                newConstArray[i].setDConst(SIGN(unionArray[i].getDConst()));\n            else\n                newConstArray[i].setIConst(SIGN(unionArray[i].getIConst()));\n            break;\n        case EOpFloor:\n            newConstArray[i].setDConst(floor(unionArray[i].getDConst()));\n            break;\n        case EOpTrunc:\n            if (unionArray[i].getDConst() > 0)\n                newConstArray[i].setDConst(floor(unionArray[i].getDConst()));\n            else\n                newConstArray[i].setDConst(ceil(unionArray[i].getDConst()));\n            break;\n        case EOpRound:\n            newConstArray[i].setDConst(floor(0.5 + unionArray[i].getDConst()));\n            break;\n        case EOpRoundEven:\n        {\n            double flr = floor(unionArray[i].getDConst());\n            bool even = flr / 2.0 == floor(flr / 2.0);\n            double rounded = even ? ceil(unionArray[i].getDConst() - 0.5) : floor(unionArray[i].getDConst() + 0.5);\n            newConstArray[i].setDConst(rounded);\n            break;\n        }\n        case EOpCeil:\n            newConstArray[i].setDConst(ceil(unionArray[i].getDConst()));\n            break;\n        case EOpFract:\n        {\n            double x = unionArray[i].getDConst();\n            newConstArray[i].setDConst(x - floor(x));\n            break;\n        }\n\n        case EOpIsNan:\n        {\n            newConstArray[i].setBConst(std::isnan(unionArray[i].getDConst()));\n            break;\n        }\n        case EOpIsInf:\n        {\n            newConstArray[i].setBConst(std::isinf(unionArray[i].getDConst()));\n            break;\n        }\n\n        case EOpConvPtrToUint64:\n        case EOpConvUint64ToPtr:\n        case EOpConstructReference:\n            newConstArray[i].setU64Const(unionArray[i].getU64Const()); break;\n\n        // TODO: 3.0 Functionality: unary constant folding: the rest of the ops have to be fleshed out\n\n        case EOpSinh:\n        case EOpCosh:\n        case EOpTanh:\n        case EOpAsinh:\n        case EOpAcosh:\n        case EOpAtanh:\n\n        case EOpFloatBitsToInt:\n        case EOpFloatBitsToUint:\n        case EOpIntBitsToFloat:\n        case EOpUintBitsToFloat:\n        case EOpDoubleBitsToInt64:\n        case EOpDoubleBitsToUint64:\n        case EOpInt64BitsToDouble:\n        case EOpUint64BitsToDouble:\n        case EOpFloat16BitsToInt16:\n        case EOpFloat16BitsToUint16:\n        case EOpInt16BitsToFloat16:\n        case EOpUint16BitsToFloat16:\n        default:\n            return nullptr;\n        }\n    }\n\n    TIntermConstantUnion *newNode = new TIntermConstantUnion(newConstArray, returnType);\n    newNode->getWritableType().getQualifier().storage = EvqConst;\n    newNode->setLoc(getLoc());\n\n    return newNode;\n}\n\n//\n// Do constant folding for an aggregate node that has all its children\n// as constants and an operator that requires constant folding.\n//\nTIntermTyped* TIntermediate::fold(TIntermAggregate* aggrNode)\n{\n    if (aggrNode == nullptr)\n        return aggrNode;\n\n    if (! areAllChildConst(aggrNode))\n        return aggrNode;\n\n    if (aggrNode->isConstructor())\n        return foldConstructor(aggrNode);\n\n    TIntermSequence& children = aggrNode->getSequence();\n\n    // First, see if this is an operation to constant fold, kick out if not,\n    // see what size the result is if so.\n\n    bool componentwise = false;  // will also say componentwise if a scalar argument gets repeated to make per-component results\n    int objectSize;\n    switch (aggrNode->getOp()) {\n    case EOpAtan:\n    case EOpPow:\n    case EOpMin:\n    case EOpMax:\n    case EOpMix:\n    case EOpMod:\n    case EOpClamp:\n    case EOpLessThan:\n    case EOpGreaterThan:\n    case EOpLessThanEqual:\n    case EOpGreaterThanEqual:\n    case EOpVectorEqual:\n    case EOpVectorNotEqual:\n        componentwise = true;\n        objectSize = children[0]->getAsConstantUnion()->getType().computeNumComponents();\n        break;\n    case EOpCross:\n    case EOpReflect:\n    case EOpRefract:\n    case EOpFaceForward:\n        objectSize = children[0]->getAsConstantUnion()->getType().computeNumComponents();\n        break;\n    case EOpDistance:\n    case EOpDot:\n        objectSize = 1;\n        break;\n    case EOpOuterProduct:\n        objectSize = children[0]->getAsTyped()->getType().getVectorSize() *\n                     children[1]->getAsTyped()->getType().getVectorSize();\n        break;\n    case EOpStep:\n        componentwise = true;\n        objectSize = std::max(children[0]->getAsTyped()->getType().getVectorSize(),\n                              children[1]->getAsTyped()->getType().getVectorSize());\n        break;\n    case EOpSmoothStep:\n        componentwise = true;\n        objectSize = std::max(children[0]->getAsTyped()->getType().getVectorSize(),\n                              children[2]->getAsTyped()->getType().getVectorSize());\n        break;\n    case EOpMul:\n        {\n        TIntermConstantUnion* left = children[0]->getAsConstantUnion();\n        TIntermConstantUnion* right = children[1]->getAsConstantUnion();\n        return left->fold(EOpMul, right);\n        }\n    default:\n        return aggrNode;\n    }\n    TConstUnionArray newConstArray(objectSize);\n\n    TVector<TConstUnionArray> childConstUnions;\n    for (unsigned int arg = 0; arg < children.size(); ++arg)\n        childConstUnions.push_back(children[arg]->getAsConstantUnion()->getConstArray());\n\n    if (componentwise) {\n        for (int comp = 0; comp < objectSize; comp++) {\n\n            // some arguments are scalars instead of matching vectors; simulate a smear\n            int arg0comp = std::min(comp, children[0]->getAsTyped()->getType().getVectorSize() - 1);\n            int arg1comp = 0;\n            if (children.size() > 1)\n                arg1comp = std::min(comp, children[1]->getAsTyped()->getType().getVectorSize() - 1);\n            int arg2comp = 0;\n            if (children.size() > 2)\n                arg2comp = std::min(comp, children[2]->getAsTyped()->getType().getVectorSize() - 1);\n\n            switch (aggrNode->getOp()) {\n            case EOpAtan:\n                newConstArray[comp].setDConst(atan2(childConstUnions[0][arg0comp].getDConst(), childConstUnions[1][arg1comp].getDConst()));\n                break;\n            case EOpPow:\n                newConstArray[comp].setDConst(pow(childConstUnions[0][arg0comp].getDConst(), childConstUnions[1][arg1comp].getDConst()));\n                break;\n            case EOpMod:\n            {\n                double arg0 = childConstUnions[0][arg0comp].getDConst();\n                double arg1 = childConstUnions[1][arg1comp].getDConst();\n                double result = arg0 - arg1 * floor(arg0 / arg1);\n                newConstArray[comp].setDConst(result);\n                break;\n            }\n            case EOpMin:\n                switch(children[0]->getAsTyped()->getBasicType()) {\n                case EbtFloat16:\n                case EbtBFloat16:\n                case EbtFloatE5M2:\n                case EbtFloatE4M3:\n                case EbtFloat:\n                case EbtDouble:\n                    newConstArray[comp].setDConst(std::min(childConstUnions[0][arg0comp].getDConst(), childConstUnions[1][arg1comp].getDConst()));\n                    break;\n                case EbtInt:\n                    newConstArray[comp].setIConst(std::min(childConstUnions[0][arg0comp].getIConst(), childConstUnions[1][arg1comp].getIConst()));\n                    break;\n                case EbtUint:\n                    newConstArray[comp].setUConst(std::min(childConstUnions[0][arg0comp].getUConst(), childConstUnions[1][arg1comp].getUConst()));\n                    break;\n                case EbtInt8:\n                    newConstArray[comp].setI8Const(std::min(childConstUnions[0][arg0comp].getI8Const(), childConstUnions[1][arg1comp].getI8Const()));\n                    break;\n                case EbtUint8:\n                    newConstArray[comp].setU8Const(std::min(childConstUnions[0][arg0comp].getU8Const(), childConstUnions[1][arg1comp].getU8Const()));\n                    break;\n                case EbtInt16:\n                    newConstArray[comp].setI16Const(std::min(childConstUnions[0][arg0comp].getI16Const(), childConstUnions[1][arg1comp].getI16Const()));\n                    break;\n                case EbtUint16:\n                    newConstArray[comp].setU16Const(std::min(childConstUnions[0][arg0comp].getU16Const(), childConstUnions[1][arg1comp].getU16Const()));\n                    break;\n                case EbtInt64:\n                    newConstArray[comp].setI64Const(std::min(childConstUnions[0][arg0comp].getI64Const(), childConstUnions[1][arg1comp].getI64Const()));\n                    break;\n                case EbtUint64:\n                    newConstArray[comp].setU64Const(std::min(childConstUnions[0][arg0comp].getU64Const(), childConstUnions[1][arg1comp].getU64Const()));\n                    break;\n                default: assert(false && \"Default missing\");\n                }\n                break;\n            case EOpMax:\n                switch(children[0]->getAsTyped()->getBasicType()) {\n                case EbtFloat16:\n                case EbtBFloat16:\n                case EbtFloatE5M2:\n                case EbtFloatE4M3:\n                case EbtFloat:\n                case EbtDouble:\n                    newConstArray[comp].setDConst(std::max(childConstUnions[0][arg0comp].getDConst(), childConstUnions[1][arg1comp].getDConst()));\n                    break;\n                case EbtInt:\n                    newConstArray[comp].setIConst(std::max(childConstUnions[0][arg0comp].getIConst(), childConstUnions[1][arg1comp].getIConst()));\n                    break;\n                case EbtUint:\n                    newConstArray[comp].setUConst(std::max(childConstUnions[0][arg0comp].getUConst(), childConstUnions[1][arg1comp].getUConst()));\n                    break;\n                case EbtInt8:\n                    newConstArray[comp].setI8Const(std::max(childConstUnions[0][arg0comp].getI8Const(), childConstUnions[1][arg1comp].getI8Const()));\n                    break;\n                case EbtUint8:\n                    newConstArray[comp].setU8Const(std::max(childConstUnions[0][arg0comp].getU8Const(), childConstUnions[1][arg1comp].getU8Const()));\n                    break;\n                case EbtInt16:\n                    newConstArray[comp].setI16Const(std::max(childConstUnions[0][arg0comp].getI16Const(), childConstUnions[1][arg1comp].getI16Const()));\n                    break;\n                case EbtUint16:\n                    newConstArray[comp].setU16Const(std::max(childConstUnions[0][arg0comp].getU16Const(), childConstUnions[1][arg1comp].getU16Const()));\n                    break;\n                case EbtInt64:\n                    newConstArray[comp].setI64Const(std::max(childConstUnions[0][arg0comp].getI64Const(), childConstUnions[1][arg1comp].getI64Const()));\n                    break;\n                case EbtUint64:\n                    newConstArray[comp].setU64Const(std::max(childConstUnions[0][arg0comp].getU64Const(), childConstUnions[1][arg1comp].getU64Const()));\n                    break;\n                default: assert(false && \"Default missing\");\n                }\n                break;\n            case EOpClamp:\n                switch(children[0]->getAsTyped()->getBasicType()) {\n                case EbtFloat16:\n                case EbtBFloat16:\n                case EbtFloatE5M2:\n                case EbtFloatE4M3:\n                case EbtFloat:\n                case EbtDouble:\n                    newConstArray[comp].setDConst(std::min(std::max(childConstUnions[0][arg0comp].getDConst(), childConstUnions[1][arg1comp].getDConst()),\n                                                                                                               childConstUnions[2][arg2comp].getDConst()));\n                    break;\n                case EbtUint:\n                    newConstArray[comp].setUConst(std::min(std::max(childConstUnions[0][arg0comp].getUConst(), childConstUnions[1][arg1comp].getUConst()),\n                                                                                                                   childConstUnions[2][arg2comp].getUConst()));\n                    break;\n                case EbtInt8:\n                    newConstArray[comp].setI8Const(std::min(std::max(childConstUnions[0][arg0comp].getI8Const(), childConstUnions[1][arg1comp].getI8Const()),\n                                                                                                                   childConstUnions[2][arg2comp].getI8Const()));\n                    break;\n                case EbtUint8:\n                     newConstArray[comp].setU8Const(std::min(std::max(childConstUnions[0][arg0comp].getU8Const(), childConstUnions[1][arg1comp].getU8Const()),\n                                                                                                                   childConstUnions[2][arg2comp].getU8Const()));\n                    break;\n                case EbtInt16:\n                    newConstArray[comp].setI16Const(std::min(std::max(childConstUnions[0][arg0comp].getI16Const(), childConstUnions[1][arg1comp].getI16Const()),\n                                                                                                                   childConstUnions[2][arg2comp].getI16Const()));\n                    break;\n                case EbtUint16:\n                    newConstArray[comp].setU16Const(std::min(std::max(childConstUnions[0][arg0comp].getU16Const(), childConstUnions[1][arg1comp].getU16Const()),\n                                                                                                                   childConstUnions[2][arg2comp].getU16Const()));\n                    break;\n                case EbtInt:\n                    newConstArray[comp].setIConst(std::min(std::max(childConstUnions[0][arg0comp].getIConst(), childConstUnions[1][arg1comp].getIConst()),\n                                                                                                                   childConstUnions[2][arg2comp].getIConst()));\n                    break;\n                case EbtInt64:\n                    newConstArray[comp].setI64Const(std::min(std::max(childConstUnions[0][arg0comp].getI64Const(), childConstUnions[1][arg1comp].getI64Const()),\n                                                                                                                       childConstUnions[2][arg2comp].getI64Const()));\n                    break;\n                case EbtUint64:\n                    newConstArray[comp].setU64Const(std::min(std::max(childConstUnions[0][arg0comp].getU64Const(), childConstUnions[1][arg1comp].getU64Const()),\n                                                                                                                       childConstUnions[2][arg2comp].getU64Const()));\n                    break;\n                default: assert(false && \"Default missing\");\n                }\n                break;\n            case EOpLessThan:\n                newConstArray[comp].setBConst(childConstUnions[0][arg0comp] < childConstUnions[1][arg1comp]);\n                break;\n            case EOpGreaterThan:\n                newConstArray[comp].setBConst(childConstUnions[0][arg0comp] > childConstUnions[1][arg1comp]);\n                break;\n            case EOpLessThanEqual:\n                newConstArray[comp].setBConst(! (childConstUnions[0][arg0comp] > childConstUnions[1][arg1comp]));\n                break;\n            case EOpGreaterThanEqual:\n                newConstArray[comp].setBConst(! (childConstUnions[0][arg0comp] < childConstUnions[1][arg1comp]));\n                break;\n            case EOpVectorEqual:\n                newConstArray[comp].setBConst(childConstUnions[0][arg0comp] == childConstUnions[1][arg1comp]);\n                break;\n            case EOpVectorNotEqual:\n                newConstArray[comp].setBConst(childConstUnions[0][arg0comp] != childConstUnions[1][arg1comp]);\n                break;\n            case EOpMix:\n                if (!children[0]->getAsTyped()->isFloatingDomain())\n                    return aggrNode;\n                if (children[2]->getAsTyped()->getBasicType() == EbtBool) {\n                    newConstArray[comp].setDConst(childConstUnions[2][arg2comp].getBConst()\n                        ? childConstUnions[1][arg1comp].getDConst()\n                        : childConstUnions[0][arg0comp].getDConst());\n                } else {\n                    newConstArray[comp].setDConst(\n                        childConstUnions[0][arg0comp].getDConst() * (1.0 - childConstUnions[2][arg2comp].getDConst()) +\n                        childConstUnions[1][arg1comp].getDConst() *        childConstUnions[2][arg2comp].getDConst());\n                }\n                break;\n            case EOpStep:\n                newConstArray[comp].setDConst(childConstUnions[1][arg1comp].getDConst() < childConstUnions[0][arg0comp].getDConst() ? 0.0 : 1.0);\n                break;\n            case EOpSmoothStep:\n            {\n                double t = (childConstUnions[2][arg2comp].getDConst() - childConstUnions[0][arg0comp].getDConst()) /\n                           (childConstUnions[1][arg1comp].getDConst() - childConstUnions[0][arg0comp].getDConst());\n                if (t < 0.0)\n                    t = 0.0;\n                if (t > 1.0)\n                    t = 1.0;\n                newConstArray[comp].setDConst(t * t * (3.0 - 2.0 * t));\n                break;\n            }\n            default:\n                return aggrNode;\n            }\n        }\n    } else {\n        // Non-componentwise...\n\n        int numComps = children[0]->getAsConstantUnion()->getType().computeNumComponents();\n        double dot;\n\n        switch (aggrNode->getOp()) {\n        case EOpDistance:\n        {\n            double sum = 0.0;\n            for (int comp = 0; comp < numComps; ++comp) {\n                double diff = childConstUnions[1][comp].getDConst() - childConstUnions[0][comp].getDConst();\n                sum += diff * diff;\n            }\n            newConstArray[0].setDConst(sqrt(sum));\n            break;\n        }\n        case EOpDot:\n            if (!children[0]->getAsTyped()->isFloatingDomain()) {\n                return aggrNode;\n            }\n            newConstArray[0].setDConst(childConstUnions[0].dot(childConstUnions[1]));\n            break;\n        case EOpCross:\n            newConstArray[0] = childConstUnions[0][1] * childConstUnions[1][2] - childConstUnions[0][2] * childConstUnions[1][1];\n            newConstArray[1] = childConstUnions[0][2] * childConstUnions[1][0] - childConstUnions[0][0] * childConstUnions[1][2];\n            newConstArray[2] = childConstUnions[0][0] * childConstUnions[1][1] - childConstUnions[0][1] * childConstUnions[1][0];\n            break;\n        case EOpFaceForward:\n            // If dot(Nref, I) < 0 return N, otherwise return -N:  Arguments are (N, I, Nref).\n            dot = childConstUnions[1].dot(childConstUnions[2]);\n            for (int comp = 0; comp < numComps; ++comp) {\n                if (dot < 0.0)\n                    newConstArray[comp] = childConstUnions[0][comp];\n                else\n                    newConstArray[comp].setDConst(-childConstUnions[0][comp].getDConst());\n            }\n            break;\n        case EOpReflect:\n            // I - 2 * dot(N, I) * N:  Arguments are (I, N).\n            dot = childConstUnions[0].dot(childConstUnions[1]);\n            dot *= 2.0;\n            for (int comp = 0; comp < numComps; ++comp)\n                newConstArray[comp].setDConst(childConstUnions[0][comp].getDConst() - dot * childConstUnions[1][comp].getDConst());\n            break;\n        case EOpRefract:\n        {\n            // Arguments are (I, N, eta).\n            // k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I))\n            // if (k < 0.0)\n            //     return dvec(0.0)\n            // else\n            //     return eta * I - (eta * dot(N, I) + sqrt(k)) * N\n            dot = childConstUnions[0].dot(childConstUnions[1]);\n            double eta = childConstUnions[2][0].getDConst();\n            double k = 1.0 - eta * eta * (1.0 - dot * dot);\n            if (k < 0.0) {\n                for (int comp = 0; comp < numComps; ++comp)\n                    newConstArray[comp].setDConst(0.0);\n            } else {\n                for (int comp = 0; comp < numComps; ++comp)\n                    newConstArray[comp].setDConst(eta * childConstUnions[0][comp].getDConst() - (eta * dot + sqrt(k)) * childConstUnions[1][comp].getDConst());\n            }\n            break;\n        }\n        case EOpOuterProduct:\n        {\n            int numRows = numComps;\n            int numCols = children[1]->getAsConstantUnion()->getType().computeNumComponents();\n            for (int row = 0; row < numRows; ++row)\n                for (int col = 0; col < numCols; ++col)\n                    newConstArray[col * numRows + row] = childConstUnions[0][row] * childConstUnions[1][col];\n            break;\n        }\n        default:\n            return aggrNode;\n        }\n    }\n\n    TIntermConstantUnion *newNode = new TIntermConstantUnion(newConstArray, aggrNode->getType());\n    newNode->getWritableType().getQualifier().storage = EvqConst;\n    newNode->setLoc(aggrNode->getLoc());\n\n    return newNode;\n}\n\nbool TIntermediate::areAllChildConst(TIntermAggregate* aggrNode)\n{\n    bool allConstant = true;\n\n    // check if all the child nodes are constants so that they can be inserted into\n    // the parent node\n    if (aggrNode) {\n        TIntermSequence& childSequenceVector = aggrNode->getSequence();\n        for (TIntermSequence::iterator p  = childSequenceVector.begin();\n                                       p != childSequenceVector.end(); p++) {\n            if (!(*p)->getAsTyped()->getAsConstantUnion())\n                return false;\n        }\n    }\n\n    return allConstant;\n}\n\nTIntermTyped* TIntermediate::foldConstructor(TIntermAggregate* aggrNode)\n{\n    bool error = false;\n\n    TConstUnionArray unionArray(aggrNode->getType().computeNumComponents());\n    if (aggrNode->getSequence().size() == 1)\n        error = parseConstTree(aggrNode, unionArray, aggrNode->getOp(), aggrNode->getType(), true);\n    else\n        error = parseConstTree(aggrNode, unionArray, aggrNode->getOp(), aggrNode->getType());\n\n    if (error)\n        return aggrNode;\n\n    return addConstantUnion(unionArray, aggrNode->getType(), aggrNode->getLoc());\n}\n\n//\n// Constant folding of a bracket (array-style) dereference or struct-like dot\n// dereference.  Can handle anything except a multi-character swizzle, though\n// all swizzles may go to foldSwizzle().\n//\nTIntermTyped* TIntermediate::foldDereference(TIntermTyped* node, int index, const TSourceLoc& loc)\n{\n    TType dereferencedType(node->getType(), index);\n    dereferencedType.getQualifier().storage = EvqConst;\n    TIntermTyped* result = nullptr;\n    int size = dereferencedType.computeNumComponents();\n\n    // arrays, vectors, matrices, all use simple multiplicative math\n    // while structures need to add up heterogeneous members\n    int start;\n    if (node->getType().isCoopMat())\n        start = 0;\n    else if (node->isArray() || ! node->isStruct())\n        start = size * index;\n    else {\n        // it is a structure\n        assert(node->isStruct());\n        start = 0;\n        for (int i = 0; i < index; ++i)\n            start += (*node->getType().getStruct())[i].type->computeNumComponents();\n    }\n\n    result = addConstantUnion(TConstUnionArray(node->getAsConstantUnion()->getConstArray(), start, size), node->getType(), loc);\n\n    if (result == nullptr)\n        result = node;\n    else\n        result->setType(dereferencedType);\n\n    return result;\n}\n\n//\n// Make a constant vector node or constant scalar node, representing a given\n// constant vector and constant swizzle into it.\n//\nTIntermTyped* TIntermediate::foldSwizzle(TIntermTyped* node, TSwizzleSelectors<TVectorSelector>& selectors, const TSourceLoc& loc)\n{\n    const TConstUnionArray& unionArray = node->getAsConstantUnion()->getConstArray();\n    TConstUnionArray constArray(selectors.size());\n\n    for (int i = 0; i < selectors.size(); i++)\n        constArray[i] = unionArray[selectors[i]];\n\n    TIntermTyped* result = addConstantUnion(constArray, node->getType(), loc);\n\n    if (result == nullptr)\n        result = node;\n    else\n        result->setType(TType(node->getBasicType(), EvqConst, selectors.size()));\n\n    return result;\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/InfoSink.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#include \"../Include/InfoSink.h\"\n\n#include <cstring>\n\nnamespace glslang {\n\nvoid TInfoSinkBase::append(const char* s)\n{\n    if (outputStream & EString) {\n        if (s == nullptr)\n            sink.append(\"(null)\");\n        else {\n            checkMem(strlen(s));\n            sink.append(s);\n        }\n    }\n\n//#ifdef _WIN32\n//    if (outputStream & EDebugger)\n//        OutputDebugString(s);\n//#endif\n\n    if (outputStream & EStdOut)\n        fprintf(stdout, \"%s\", s);\n}\n\nvoid TInfoSinkBase::append(int count, char c)\n{\n    if (outputStream & EString) {\n        checkMem(count);\n        sink.append(count, c);\n    }\n\n//#ifdef _WIN32\n//    if (outputStream & EDebugger) {\n//        char str[2];\n//        str[0] = c;\n//        str[1] = '\\0';\n//        OutputDebugString(str);\n//    }\n//#endif\n\n    if (outputStream & EStdOut)\n        fprintf(stdout, \"%c\", c);\n}\n\nvoid TInfoSinkBase::append(const TPersistString& t)\n{\n    if (outputStream & EString) {\n        checkMem(t.size());\n        sink.append(t);\n    }\n\n//#ifdef _WIN32\n//    if (outputStream & EDebugger)\n//        OutputDebugString(t.c_str());\n//#endif\n\n    if (outputStream & EStdOut)\n        fprintf(stdout, \"%s\", t.c_str());\n}\n\nvoid TInfoSinkBase::append(const TString& t)\n{\n    if (outputStream & EString) {\n        checkMem(t.size());\n        sink.append(t.c_str());\n    }\n\n//#ifdef _WIN32\n//    if (outputStream & EDebugger)\n//        OutputDebugString(t.c_str());\n//#endif\n\n    if (outputStream & EStdOut)\n        fprintf(stdout, \"%s\", t.c_str());\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/Initialize.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2012-2016 LunarG, Inc.\n// Copyright (C) 2015-2020 Google, Inc.\n// Copyright (C) 2017, 2022-2024 Arm Limited.\n// Modifications Copyright (C) 2020-2021 Advanced Micro Devices, Inc. All rights reserved.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n//\n// Create strings that declare built-in definitions, add built-ins programmatically\n// that cannot be expressed in the strings, and establish mappings between\n// built-in functions and operators.\n//\n// Where to put a built-in:\n//   TBuiltIns::initialize(version,profile)       context-independent textual built-ins; add them to the right string\n//   TBuiltIns::initialize(resources,...)         context-dependent textual built-ins; add them to the right string\n//   TBuiltIns::identifyBuiltIns(...,symbolTable) context-independent programmatic additions/mappings to the symbol table,\n//                                                including identifying what extensions are needed if a version does not allow a symbol\n//   TBuiltIns::identifyBuiltIns(...,symbolTable, resources) context-dependent programmatic additions/mappings to the symbol table,\n//                                                including identifying what extensions are needed if a version does not allow a symbol\n//\n\n#include <array>\n#include <sstream>\n#include \"Initialize.h\"\n#include \"span.h\"\n\nnamespace glslang {\n\n// TODO: ARB_Compatability: do full extension support\nconst bool ARBCompatibility = false;\n\nconst bool ForwardCompatibility = true;\n\nnamespace {\n\n//\n// A set of definitions for tabling of the built-in functions.\n//\n\n// Order matters here, as does correlation with the subsequent\n// \"const int ...\" declarations and the ArgType enumerants.\nconst char* TypeString[] = {\n   \"bool\",  \"bvec2\", \"bvec3\", \"bvec4\",\n   \"float\",  \"vec2\",  \"vec3\",  \"vec4\",\n   \"int\",   \"ivec2\", \"ivec3\", \"ivec4\",\n   \"uint\",  \"uvec2\", \"uvec3\", \"uvec4\",\n};\nconst int TypeStringCount = sizeof(TypeString) / sizeof(char*); // number of entries in 'TypeString'\nconst int TypeStringRowShift = 2;                               // shift amount to go downe one row in 'TypeString'\nconst int TypeStringColumnMask = (1 << TypeStringRowShift) - 1; // reduce type to its column number in 'TypeString'\nconst int TypeStringScalarMask = ~TypeStringColumnMask;         // take type to its scalar column in 'TypeString'\n\nenum ArgType {\n    // numbers hardcoded to correspond to 'TypeString'; order and value matter\n    TypeB    = 1 << 0,  // Boolean\n    TypeF    = 1 << 1,  // float 32\n    TypeI    = 1 << 2,  // int 32\n    TypeU    = 1 << 3,  // uint 32\n    TypeF16  = 1 << 4,  // float 16\n    TypeF64  = 1 << 5,  // float 64\n    TypeI8   = 1 << 6,  // int 8\n    TypeI16  = 1 << 7,  // int 16\n    TypeI64  = 1 << 8,  // int 64\n    TypeU8   = 1 << 9,  // uint 8\n    TypeU16  = 1 << 10, // uint 16\n    TypeU64  = 1 << 11, // uint 64\n};\n// Mixtures of the above, to help the function tables\nconst ArgType TypeFI  = static_cast<ArgType>(TypeF | TypeI);\nconst ArgType TypeFIB = static_cast<ArgType>(TypeF | TypeI | TypeB);\nconst ArgType TypeIU  = static_cast<ArgType>(TypeI | TypeU);\n\n// The relationships between arguments and return type, whether anything is\n// output, or other unusual situations.\nenum ArgClass {\n    ClassRegular     = 0,  // nothing special, just all vector widths with matching return type; traditional arithmetic\n    ClassLS     = 1 << 0,  // the last argument is also held fixed as a (type-matched) scalar while the others cycle\n    ClassXLS    = 1 << 1,  // the last argument is exclusively a (type-matched) scalar while the others cycle\n    ClassLS2    = 1 << 2,  // the last two arguments are held fixed as a (type-matched) scalar while the others cycle\n    ClassFS     = 1 << 3,  // the first argument is held fixed as a (type-matched) scalar while the others cycle\n    ClassFS2    = 1 << 4,  // the first two arguments are held fixed as a (type-matched) scalar while the others cycle\n    ClassLO     = 1 << 5,  // the last argument is an output\n    ClassB      = 1 << 6,  // return type cycles through only bool/bvec, matching vector width of args\n    ClassLB     = 1 << 7,  // last argument cycles through only bool/bvec, matching vector width of args\n    ClassV1     = 1 << 8,  // scalar only\n    ClassFIO    = 1 << 9,  // first argument is inout\n    ClassRS     = 1 << 10, // the return is held scalar as the arguments cycle\n    ClassNS     = 1 << 11, // no scalar prototype\n    ClassCVN    = 1 << 12, // first argument is 'coherent volatile nontemporal'\n    ClassFO     = 1 << 13, // first argument is output\n    ClassV3     = 1 << 14, // vec3 only\n};\n// Mixtures of the above, to help the function tables\nconst ArgClass ClassV1FIOCVN = (ArgClass)(ClassV1 | ClassFIO | ClassCVN);\nconst ArgClass ClassBNS     = (ArgClass)(ClassB  | ClassNS);\nconst ArgClass ClassRSNS    = (ArgClass)(ClassRS | ClassNS);\n\n// A descriptor, for a single profile, of when something is available.\n// If the current profile does not match 'profile' mask below, the other fields\n// do not apply (nor validate).\n// profiles == EBadProfile is the end of an array of these\nstruct Versioning {\n    EProfile profiles;       // the profile(s) (mask) that the following fields are valid for\n    int minExtendedVersion;  // earliest version when extensions are enabled; ignored if numExtensions is 0\n    int minCoreVersion;      // earliest version function is in core; 0 means never\n    int numExtensions;       // how many extensions are in the 'extensions' list\n    const char** extensions; // list of extension names enabling the function\n};\n\nEProfile EDesktopProfile = static_cast<EProfile>(ENoProfile | ECoreProfile | ECompatibilityProfile);\n\n// Declare pointers to put into the table for versioning.\n    const std::array Es300Desktop130Version = { Versioning{ EEsProfile,      0, 300, 0, nullptr },\n                                                Versioning{ EDesktopProfile, 0, 130, 0, nullptr },\n                                              };\n\n    const std::array Es310Desktop400Version = { Versioning{ EEsProfile,      0, 310, 0, nullptr },\n                                                Versioning{ EDesktopProfile, 0, 400, 0, nullptr },\n                                              };\n\n    const std::array Es310Desktop450Version = { Versioning{ EEsProfile,      0, 310, 0, nullptr },\n                                                Versioning{ EDesktopProfile, 0, 450, 0, nullptr },\n                                              };\n\n// The main descriptor of what a set of function prototypes can look like, and\n// a pointer to extra versioning information, when needed.\nstruct BuiltInFunction {\n    TOperator op;                 // operator to map the name to\n    const char* name;             // function name\n    int numArguments;             // number of arguments (overloads with varying arguments need different entries)\n    ArgType types;                // ArgType mask\n    ArgClass classes;             // the ways this particular function entry manifests\n    const span<const Versioning> versioning; // An empty span means always a valid version\n};\n\n// The tables can have the same built-in function name more than one time,\n// but the exact same prototype must be indicated at most once.\n// The prototypes that get declared are the union of all those indicated.\n// This is important when different releases add new prototypes for the same name.\n// It also also congnitively simpler tiling of the prototype space.\n// In practice, most names can be fully represented with one entry.\n//\n// Table is terminated by an OpNull TOperator.\n\nconst std::array BaseFunctions = {\n//    TOperator,           name,       arg-count,   ArgType,   ArgClass,     versioning\n//    ---------            ----        ---------    -------    --------      ----------\n    BuiltInFunction{ EOpRadians,          \"radians\",          1,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpDegrees,          \"degrees\",          1,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpSin,              \"sin\",              1,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpCos,              \"cos\",              1,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpTan,              \"tan\",              1,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpAsin,             \"asin\",             1,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpAcos,             \"acos\",             1,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpAtan,             \"atan\",             2,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpAtan,             \"atan\",             1,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpPow,              \"pow\",              2,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpExp,              \"exp\",              1,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpLog,              \"log\",              1,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpExp2,             \"exp2\",             1,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpLog2,             \"log2\",             1,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpSqrt,             \"sqrt\",             1,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpInverseSqrt,      \"inversesqrt\",      1,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpAbs,              \"abs\",              1,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpSign,             \"sign\",             1,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpFloor,            \"floor\",            1,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpCeil,             \"ceil\",             1,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpFract,            \"fract\",            1,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpMod,              \"mod\",              2,   TypeF,     ClassLS,      {} },\n    BuiltInFunction{ EOpMin,              \"min\",              2,   TypeF,     ClassLS,      {} },\n    BuiltInFunction{ EOpMax,              \"max\",              2,   TypeF,     ClassLS,      {} },\n    BuiltInFunction{ EOpClamp,            \"clamp\",            3,   TypeF,     ClassLS2,     {} },\n    BuiltInFunction{ EOpMix,              \"mix\",              3,   TypeF,     ClassLS,      {} },\n    BuiltInFunction{ EOpStep,             \"step\",             2,   TypeF,     ClassFS,      {} },\n    BuiltInFunction{ EOpSmoothStep,       \"smoothstep\",       3,   TypeF,     ClassFS2,     {} },\n    BuiltInFunction{ EOpNormalize,        \"normalize\",        1,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpFaceForward,      \"faceforward\",      3,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpReflect,          \"reflect\",          2,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpRefract,          \"refract\",          3,   TypeF,     ClassXLS,     {} },\n    BuiltInFunction{ EOpLength,           \"length\",           1,   TypeF,     ClassRS,      {} },\n    BuiltInFunction{ EOpDistance,         \"distance\",         2,   TypeF,     ClassRS,      {} },\n    BuiltInFunction{ EOpDot,              \"dot\",              2,   TypeF,     ClassRS,      {} },\n    BuiltInFunction{ EOpCross,            \"cross\",            2,   TypeF,     ClassV3,      {} },\n    BuiltInFunction{ EOpLessThan,         \"lessThan\",         2,   TypeFI,    ClassBNS,     {} },\n    BuiltInFunction{ EOpLessThanEqual,    \"lessThanEqual\",    2,   TypeFI,    ClassBNS,     {} },\n    BuiltInFunction{ EOpGreaterThan,      \"greaterThan\",      2,   TypeFI,    ClassBNS,     {} },\n    BuiltInFunction{ EOpGreaterThanEqual, \"greaterThanEqual\", 2,   TypeFI,    ClassBNS,     {} },\n    BuiltInFunction{ EOpVectorEqual,      \"equal\",            2,   TypeFIB,   ClassBNS,     {} },\n    BuiltInFunction{ EOpVectorNotEqual,   \"notEqual\",         2,   TypeFIB,   ClassBNS,     {} },\n    BuiltInFunction{ EOpAny,              \"any\",              1,   TypeB,     ClassRSNS,    {} },\n    BuiltInFunction{ EOpAll,              \"all\",              1,   TypeB,     ClassRSNS,    {} },\n    BuiltInFunction{ EOpVectorLogicalNot, \"not\",              1,   TypeB,     ClassNS,      {} },\n    BuiltInFunction{ EOpSinh,             \"sinh\",             1,   TypeF,     ClassRegular, {Es300Desktop130Version} },\n    BuiltInFunction{ EOpCosh,             \"cosh\",             1,   TypeF,     ClassRegular, {Es300Desktop130Version} },\n    BuiltInFunction{ EOpTanh,             \"tanh\",             1,   TypeF,     ClassRegular, {Es300Desktop130Version} },\n    BuiltInFunction{ EOpAsinh,            \"asinh\",            1,   TypeF,     ClassRegular, {Es300Desktop130Version} },\n    BuiltInFunction{ EOpAcosh,            \"acosh\",            1,   TypeF,     ClassRegular, {Es300Desktop130Version} },\n    BuiltInFunction{ EOpAtanh,            \"atanh\",            1,   TypeF,     ClassRegular, {Es300Desktop130Version} },\n    BuiltInFunction{ EOpAbs,              \"abs\",              1,   TypeI,     ClassRegular, {Es300Desktop130Version} },\n    BuiltInFunction{ EOpSign,             \"sign\",             1,   TypeI,     ClassRegular, {Es300Desktop130Version} },\n    BuiltInFunction{ EOpTrunc,            \"trunc\",            1,   TypeF,     ClassRegular, {Es300Desktop130Version} },\n    BuiltInFunction{ EOpRound,            \"round\",            1,   TypeF,     ClassRegular, {Es300Desktop130Version} },\n    BuiltInFunction{ EOpRoundEven,        \"roundEven\",        1,   TypeF,     ClassRegular, {Es300Desktop130Version} },\n    BuiltInFunction{ EOpModf,             \"modf\",             2,   TypeF,     ClassLO,      {Es300Desktop130Version} },\n    BuiltInFunction{ EOpMin,              \"min\",              2,   TypeIU,    ClassLS,      {Es300Desktop130Version} },\n    BuiltInFunction{ EOpMax,              \"max\",              2,   TypeIU,    ClassLS,      {Es300Desktop130Version} },\n    BuiltInFunction{ EOpClamp,            \"clamp\",            3,   TypeIU,    ClassLS2,     {Es300Desktop130Version} },\n    BuiltInFunction{ EOpMix,              \"mix\",              3,   TypeF,     ClassLB,      {Es300Desktop130Version} },\n    BuiltInFunction{ EOpIsInf,            \"isinf\",            1,   TypeF,     ClassB,       {Es300Desktop130Version} },\n    BuiltInFunction{ EOpIsNan,            \"isnan\",            1,   TypeF,     ClassB,       {Es300Desktop130Version} },\n    BuiltInFunction{ EOpLessThan,         \"lessThan\",         2,   TypeU,     ClassBNS,     {Es300Desktop130Version} },\n    BuiltInFunction{ EOpLessThanEqual,    \"lessThanEqual\",    2,   TypeU,     ClassBNS,     {Es300Desktop130Version} },\n    BuiltInFunction{ EOpGreaterThan,      \"greaterThan\",      2,   TypeU,     ClassBNS,     {Es300Desktop130Version} },\n    BuiltInFunction{ EOpGreaterThanEqual, \"greaterThanEqual\", 2,   TypeU,     ClassBNS,     {Es300Desktop130Version} },\n    BuiltInFunction{ EOpVectorEqual,      \"equal\",            2,   TypeU,     ClassBNS,     {Es300Desktop130Version} },\n    BuiltInFunction{ EOpVectorNotEqual,   \"notEqual\",         2,   TypeU,     ClassBNS,     {Es300Desktop130Version} },\n    BuiltInFunction{ EOpAtomicAdd,        \"atomicAdd\",        2,   TypeIU,    ClassV1FIOCVN, {Es310Desktop400Version} },\n    BuiltInFunction{ EOpAtomicMin,        \"atomicMin\",        2,   TypeIU,    ClassV1FIOCVN, {Es310Desktop400Version} },\n    BuiltInFunction{ EOpAtomicMax,        \"atomicMax\",        2,   TypeIU,    ClassV1FIOCVN, {Es310Desktop400Version} },\n    BuiltInFunction{ EOpAtomicAnd,        \"atomicAnd\",        2,   TypeIU,    ClassV1FIOCVN, {Es310Desktop400Version} },\n    BuiltInFunction{ EOpAtomicOr,         \"atomicOr\",         2,   TypeIU,    ClassV1FIOCVN, {Es310Desktop400Version} },\n    BuiltInFunction{ EOpAtomicXor,        \"atomicXor\",        2,   TypeIU,    ClassV1FIOCVN, {Es310Desktop400Version} },\n    BuiltInFunction{ EOpAtomicExchange,   \"atomicExchange\",   2,   TypeIU,    ClassV1FIOCVN, {Es310Desktop400Version} },\n    BuiltInFunction{ EOpAtomicCompSwap,   \"atomicCompSwap\",   3,   TypeIU,    ClassV1FIOCVN, {Es310Desktop400Version} },\n    BuiltInFunction{ EOpMix,              \"mix\",              3,   TypeB,     ClassRegular, {Es310Desktop450Version} },\n    BuiltInFunction{ EOpMix,              \"mix\",              3,   TypeIU,    ClassLB,      {Es310Desktop450Version} },\n};\n\nconst std::array DerivativeFunctions = {\n    BuiltInFunction{ EOpDPdx,             \"dFdx\",             1,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpDPdy,             \"dFdy\",             1,   TypeF,     ClassRegular, {} },\n    BuiltInFunction{ EOpFwidth,           \"fwidth\",           1,   TypeF,     ClassRegular, {} },\n};\n\n// For functions declared some other way, but still use the table to relate to operator.\nstruct CustomFunction {\n    TOperator op;                 // operator to map the name to\n    const char* name;             // function name\n    const span<const Versioning> versioning; // An empty span means always a valid version\n};\n\nconst CustomFunction CustomFunctions[] = {\n    { EOpBarrier,             \"barrier\",             {} },\n    { EOpMemoryBarrierShared, \"memoryBarrierShared\", {} },\n    { EOpGroupMemoryBarrier,  \"groupMemoryBarrier\",  {} },\n    { EOpMemoryBarrier,       \"memoryBarrier\",       {} },\n    { EOpMemoryBarrierBuffer, \"memoryBarrierBuffer\", {} },\n\n    { EOpPackSnorm2x16,       \"packSnorm2x16\",       {} },\n    { EOpUnpackSnorm2x16,     \"unpackSnorm2x16\",     {} },\n    { EOpPackUnorm2x16,       \"packUnorm2x16\",       {} },\n    { EOpUnpackUnorm2x16,     \"unpackUnorm2x16\",     {} },\n    { EOpPackHalf2x16,        \"packHalf2x16\",        {} },\n    { EOpUnpackHalf2x16,      \"unpackHalf2x16\",      {} },\n\n    { EOpMul,                 \"matrixCompMult\",      {} },\n    { EOpOuterProduct,        \"outerProduct\",        {} },\n    { EOpTranspose,           \"transpose\",           {} },\n    { EOpDeterminant,         \"determinant\",         {} },\n    { EOpMatrixInverse,       \"inverse\",             {} },\n    { EOpFloatBitsToInt,      \"floatBitsToInt\",      {} },\n    { EOpFloatBitsToUint,     \"floatBitsToUint\",     {} },\n    { EOpIntBitsToFloat,      \"intBitsToFloat\",      {} },\n    { EOpUintBitsToFloat,     \"uintBitsToFloat\",     {} },\n\n    { EOpTextureQuerySize,      \"textureSize\",           {} },\n    { EOpTextureQueryLod,       \"textureQueryLod\",       {} },\n    { EOpTextureQueryLod,       \"textureQueryLOD\",       {} }, // extension GL_ARB_texture_query_lod\n    { EOpTextureQueryLevels,    \"textureQueryLevels\",    {} },\n    { EOpTextureQuerySamples,   \"textureSamples\",        {} },\n    { EOpTexture,               \"texture\",               {} },\n    { EOpTextureProj,           \"textureProj\",           {} },\n    { EOpTextureLod,            \"textureLod\",            {} },\n    { EOpTextureOffset,         \"textureOffset\",         {} },\n    { EOpTextureFetch,          \"texelFetch\",            {} },\n    { EOpTextureFetchOffset,    \"texelFetchOffset\",      {} },\n    { EOpTextureProjOffset,     \"textureProjOffset\",     {} },\n    { EOpTextureLodOffset,      \"textureLodOffset\",      {} },\n    { EOpTextureProjLod,        \"textureProjLod\",        {} },\n    { EOpTextureProjLodOffset,  \"textureProjLodOffset\",  {} },\n    { EOpTextureGrad,           \"textureGrad\",           {} },\n    { EOpTextureGradOffset,     \"textureGradOffset\",     {} },\n    { EOpTextureProjGrad,       \"textureProjGrad\",       {} },\n    { EOpTextureProjGradOffset, \"textureProjGradOffset\", {} },\n};\n\n// For the given table of functions, add all the indicated prototypes for each\n// one, to be returned in the passed in decls.\nvoid AddTabledBuiltin(TString& decls, const BuiltInFunction& function)\n{\n    const auto isScalarType = [](int type) { return (type & TypeStringColumnMask) == 0; };\n\n    // loop across these two:\n    //  0: the varying arg set, and\n    //  1: the fixed scalar args\n    const ArgClass ClassFixed = (ArgClass)(ClassLS | ClassXLS | ClassLS2 | ClassFS | ClassFS2);\n    for (int fixed = 0; fixed < ((function.classes & ClassFixed) > 0 ? 2 : 1); ++fixed) {\n\n        if (fixed == 0 && (function.classes & ClassXLS))\n            continue;\n\n        // walk the type strings in TypeString[]\n        for (int type = 0; type < TypeStringCount; ++type) {\n            // skip types not selected: go from type to row number to type bit\n            if ((function.types & (1 << (type >> TypeStringRowShift))) == 0)\n                continue;\n\n            // if we aren't on a scalar, and should be, skip\n            if ((function.classes & ClassV1) && !isScalarType(type))\n                continue;\n\n            // if we aren't on a 3-vector, and should be, skip\n            if ((function.classes & ClassV3) && (type & TypeStringColumnMask) != 2)\n                continue;\n\n            // skip replication of all arg scalars between the varying arg set and the fixed args\n            if (fixed == 1 && type == (type & TypeStringScalarMask) && (function.classes & ClassXLS) == 0)\n                continue;\n\n            // skip scalars when we are told to\n            if ((function.classes & ClassNS) && isScalarType(type))\n                continue;\n\n            // return type\n            if (function.classes & ClassB)\n                decls.append(TypeString[type & TypeStringColumnMask]);\n            else if (function.classes & ClassRS)\n                decls.append(TypeString[type & TypeStringScalarMask]);\n            else\n                decls.append(TypeString[type]);\n            decls.append(\" \");\n            decls.append(function.name);\n            decls.append(\"(\");\n\n            // arguments\n            for (int arg = 0; arg < function.numArguments; ++arg) {\n                if (arg == function.numArguments - 1 && (function.classes & ClassLO))\n                    decls.append(\"out \");\n                if (arg == 0) {\n                    if (function.classes & ClassCVN)\n                        decls.append(\"coherent volatile nontemporal \");\n                    if (function.classes & ClassFIO)\n                        decls.append(\"inout \");\n                    if (function.classes & ClassFO)\n                        decls.append(\"out \");\n                }\n                if ((function.classes & ClassLB) && arg == function.numArguments - 1)\n                    decls.append(TypeString[type & TypeStringColumnMask]);\n                else if (fixed && ((arg == function.numArguments - 1 && (function.classes & (ClassLS | ClassXLS |\n                                                                                                       ClassLS2))) ||\n                                   (arg == function.numArguments - 2 && (function.classes & ClassLS2))             ||\n                                   (arg == 0                         && (function.classes & (ClassFS | ClassFS2))) ||\n                                   (arg == 1                         && (function.classes & ClassFS2))))\n                    decls.append(TypeString[type & TypeStringScalarMask]);\n                else\n                    decls.append(TypeString[type]);\n                if (arg < function.numArguments - 1)\n                    decls.append(\",\");\n            }\n            decls.append(\");\\n\");\n        }\n    }\n}\n\n// See if the tabled versioning information allows the current version.\nbool ValidVersion(const BuiltInFunction& function, int version, EProfile profile, const SpvVersion& /* spVersion */)\n{\n    // nullptr means always valid\n    if (function.versioning.empty())\n        return true;\n\n    // check for what is said about our current profile\n    for (const auto& v : function.versioning) {\n        if ((v.profiles & profile) != 0) {\n            if (v.minCoreVersion <= version || (v.numExtensions > 0 && v.minExtendedVersion <= version))\n                return true;\n        }\n    }\n\n    return false;\n}\n\n// Relate a single table of built-ins to their AST operator.\n// This can get called redundantly (especially for the common built-ins, when\n// called once per stage). This is a performance issue only, not a correctness\n// concern.  It is done for quality arising from simplicity, as there are subtleties\n// to get correct if instead trying to do it surgically.\ntemplate<class FunctionContainer>\nvoid RelateTabledBuiltins(const FunctionContainer& functions, TSymbolTable& symbolTable)\n{\n    for (const auto& fn : functions) {\n        symbolTable.relateToOperator(fn.name, fn.op);\n    }\n}\n\n} // end anonymous namespace\n\n// Add declarations for all tables of built-in functions.\nvoid TBuiltIns::addTabledBuiltins(int version, EProfile profile, const SpvVersion& spvVersion)\n{\n    const auto forEachFunction = [&](TString& decls, const span<const BuiltInFunction>& functions) {\n        for (const auto& fn : functions) {\n            if (ValidVersion(fn, version, profile, spvVersion))\n                AddTabledBuiltin(decls, fn);\n        }\n    };\n\n    forEachFunction(commonBuiltins, BaseFunctions);\n    forEachFunction(stageBuiltins[EShLangFragment], DerivativeFunctions);\n\n    if ((profile == EEsProfile && version >= 320) || (profile != EEsProfile && version >= 450))\n        forEachFunction(stageBuiltins[EShLangCompute], DerivativeFunctions);\n}\n\n// Relate all tables of built-ins to the AST operators.\nvoid TBuiltIns::relateTabledBuiltins(int /* version */, EProfile /* profile */, const SpvVersion& /* spvVersion */, EShLanguage /* stage */, TSymbolTable& symbolTable)\n{\n    RelateTabledBuiltins(BaseFunctions, symbolTable);\n    RelateTabledBuiltins(DerivativeFunctions, symbolTable);\n    RelateTabledBuiltins(CustomFunctions, symbolTable);\n}\n\ninline bool IncludeLegacy(int version, EProfile profile, const SpvVersion& spvVersion)\n{\n    return profile != EEsProfile && (version <= 130 || (spvVersion.spv == 0 && version == 140 && ARBCompatibility) ||\n           profile == ECompatibilityProfile);\n}\n\n// Construct TBuiltInParseables base class.  This can be used for language-common constructs.\nTBuiltInParseables::TBuiltInParseables()\n{\n}\n\n// Destroy TBuiltInParseables.\nTBuiltInParseables::~TBuiltInParseables()\n{\n}\n\nTBuiltIns::TBuiltIns()\n{\n    // Set up textual representations for making all the permutations\n    // of texturing/imaging functions.\n    prefixes[EbtFloat] =  \"\";\n    prefixes[EbtInt]   = \"i\";\n    prefixes[EbtUint]  = \"u\";\n    prefixes[EbtFloat16] = \"f16\";\n    prefixes[EbtInt8]  = \"i8\";\n    prefixes[EbtUint8] = \"u8\";\n    prefixes[EbtInt16]  = \"i16\";\n    prefixes[EbtUint16] = \"u16\";\n    prefixes[EbtInt64]  = \"i64\";\n    prefixes[EbtUint64] = \"u64\";\n\n    postfixes[2] = \"2\";\n    postfixes[3] = \"3\";\n    postfixes[4] = \"4\";\n\n    // Map from symbolic class of texturing dimension to numeric dimensions.\n    dimMap[Esd2D] = 2;\n    dimMap[Esd3D] = 3;\n    dimMap[EsdCube] = 3;\n    dimMap[Esd1D] = 1;\n    dimMap[EsdRect] = 2;\n    dimMap[EsdBuffer] = 1;\n    dimMap[EsdSubpass] = 2;  // potentially unused for now\n    dimMap[EsdAttachmentEXT] = 2;  // potentially unused for now\n}\n\nTBuiltIns::~TBuiltIns()\n{\n}\n\n\n//\n// Add all context-independent built-in functions and variables that are present\n// for the given version and profile.  Share common ones across stages, otherwise\n// make stage-specific entries.\n//\n// Most built-ins variables can be added as simple text strings.  Some need to\n// be added programmatically, which is done later in IdentifyBuiltIns() below.\n//\nvoid TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvVersion)\n{\n    addTabledBuiltins(version, profile, spvVersion);\n\n    //============================================================================\n    //\n    // Prototypes for built-in functions used repeatly by different shaders\n    //\n    //============================================================================\n\n    //\n    // Derivatives Functions.\n    //\n    TString derivativeControls (\n        \"float dFdxFine(float p);\"\n        \"vec2  dFdxFine(vec2  p);\"\n        \"vec3  dFdxFine(vec3  p);\"\n        \"vec4  dFdxFine(vec4  p);\"\n\n        \"float dFdyFine(float p);\"\n        \"vec2  dFdyFine(vec2  p);\"\n        \"vec3  dFdyFine(vec3  p);\"\n        \"vec4  dFdyFine(vec4  p);\"\n\n        \"float fwidthFine(float p);\"\n        \"vec2  fwidthFine(vec2  p);\"\n        \"vec3  fwidthFine(vec3  p);\"\n        \"vec4  fwidthFine(vec4  p);\"\n\n        \"float dFdxCoarse(float p);\"\n        \"vec2  dFdxCoarse(vec2  p);\"\n        \"vec3  dFdxCoarse(vec3  p);\"\n        \"vec4  dFdxCoarse(vec4  p);\"\n\n        \"float dFdyCoarse(float p);\"\n        \"vec2  dFdyCoarse(vec2  p);\"\n        \"vec3  dFdyCoarse(vec3  p);\"\n        \"vec4  dFdyCoarse(vec4  p);\"\n\n        \"float fwidthCoarse(float p);\"\n        \"vec2  fwidthCoarse(vec2  p);\"\n        \"vec3  fwidthCoarse(vec3  p);\"\n        \"vec4  fwidthCoarse(vec4  p);\"\n    );\n\n    TString derivativesAndControl16bits (\n        \"float16_t dFdx(float16_t);\"\n        \"f16vec2   dFdx(f16vec2);\"\n        \"f16vec3   dFdx(f16vec3);\"\n        \"f16vec4   dFdx(f16vec4);\"\n\n        \"float16_t dFdy(float16_t);\"\n        \"f16vec2   dFdy(f16vec2);\"\n        \"f16vec3   dFdy(f16vec3);\"\n        \"f16vec4   dFdy(f16vec4);\"\n\n        \"float16_t dFdxFine(float16_t);\"\n        \"f16vec2   dFdxFine(f16vec2);\"\n        \"f16vec3   dFdxFine(f16vec3);\"\n        \"f16vec4   dFdxFine(f16vec4);\"\n\n        \"float16_t dFdyFine(float16_t);\"\n        \"f16vec2   dFdyFine(f16vec2);\"\n        \"f16vec3   dFdyFine(f16vec3);\"\n        \"f16vec4   dFdyFine(f16vec4);\"\n\n        \"float16_t dFdxCoarse(float16_t);\"\n        \"f16vec2   dFdxCoarse(f16vec2);\"\n        \"f16vec3   dFdxCoarse(f16vec3);\"\n        \"f16vec4   dFdxCoarse(f16vec4);\"\n\n        \"float16_t dFdyCoarse(float16_t);\"\n        \"f16vec2   dFdyCoarse(f16vec2);\"\n        \"f16vec3   dFdyCoarse(f16vec3);\"\n        \"f16vec4   dFdyCoarse(f16vec4);\"\n\n        \"float16_t fwidth(float16_t);\"\n        \"f16vec2   fwidth(f16vec2);\"\n        \"f16vec3   fwidth(f16vec3);\"\n        \"f16vec4   fwidth(f16vec4);\"\n\n        \"float16_t fwidthFine(float16_t);\"\n        \"f16vec2   fwidthFine(f16vec2);\"\n        \"f16vec3   fwidthFine(f16vec3);\"\n        \"f16vec4   fwidthFine(f16vec4);\"\n\n        \"float16_t fwidthCoarse(float16_t);\"\n        \"f16vec2   fwidthCoarse(f16vec2);\"\n        \"f16vec3   fwidthCoarse(f16vec3);\"\n        \"f16vec4   fwidthCoarse(f16vec4);\"\n    );\n\n    TString derivativesAndControl64bits (\n        \"float64_t dFdx(float64_t);\"\n        \"f64vec2   dFdx(f64vec2);\"\n        \"f64vec3   dFdx(f64vec3);\"\n        \"f64vec4   dFdx(f64vec4);\"\n\n        \"float64_t dFdy(float64_t);\"\n        \"f64vec2   dFdy(f64vec2);\"\n        \"f64vec3   dFdy(f64vec3);\"\n        \"f64vec4   dFdy(f64vec4);\"\n\n        \"float64_t dFdxFine(float64_t);\"\n        \"f64vec2   dFdxFine(f64vec2);\"\n        \"f64vec3   dFdxFine(f64vec3);\"\n        \"f64vec4   dFdxFine(f64vec4);\"\n\n        \"float64_t dFdyFine(float64_t);\"\n        \"f64vec2   dFdyFine(f64vec2);\"\n        \"f64vec3   dFdyFine(f64vec3);\"\n        \"f64vec4   dFdyFine(f64vec4);\"\n\n        \"float64_t dFdxCoarse(float64_t);\"\n        \"f64vec2   dFdxCoarse(f64vec2);\"\n        \"f64vec3   dFdxCoarse(f64vec3);\"\n        \"f64vec4   dFdxCoarse(f64vec4);\"\n\n        \"float64_t dFdyCoarse(float64_t);\"\n        \"f64vec2   dFdyCoarse(f64vec2);\"\n        \"f64vec3   dFdyCoarse(f64vec3);\"\n        \"f64vec4   dFdyCoarse(f64vec4);\"\n\n        \"float64_t fwidth(float64_t);\"\n        \"f64vec2   fwidth(f64vec2);\"\n        \"f64vec3   fwidth(f64vec3);\"\n        \"f64vec4   fwidth(f64vec4);\"\n\n        \"float64_t fwidthFine(float64_t);\"\n        \"f64vec2   fwidthFine(f64vec2);\"\n        \"f64vec3   fwidthFine(f64vec3);\"\n        \"f64vec4   fwidthFine(f64vec4);\"\n\n        \"float64_t fwidthCoarse(float64_t);\"\n        \"f64vec2   fwidthCoarse(f64vec2);\"\n        \"f64vec3   fwidthCoarse(f64vec3);\"\n        \"f64vec4   fwidthCoarse(f64vec4);\"\n    );\n\n    //============================================================================\n    //\n    // Prototypes for built-in functions seen by both vertex and fragment shaders.\n    //\n    //============================================================================\n\n    //\n    // double functions added to desktop 4.00, but not fma, frexp, ldexp, or pack/unpack\n    //\n    if (profile != EEsProfile && version >= 150) {  // ARB_gpu_shader_fp64\n        commonBuiltins.append(\n\n            \"double sqrt(double);\"\n            \"dvec2  sqrt(dvec2);\"\n            \"dvec3  sqrt(dvec3);\"\n            \"dvec4  sqrt(dvec4);\"\n\n            \"double inversesqrt(double);\"\n            \"dvec2  inversesqrt(dvec2);\"\n            \"dvec3  inversesqrt(dvec3);\"\n            \"dvec4  inversesqrt(dvec4);\"\n\n            \"double abs(double);\"\n            \"dvec2  abs(dvec2);\"\n            \"dvec3  abs(dvec3);\"\n            \"dvec4  abs(dvec4);\"\n\n            \"double sign(double);\"\n            \"dvec2  sign(dvec2);\"\n            \"dvec3  sign(dvec3);\"\n            \"dvec4  sign(dvec4);\"\n\n            \"double floor(double);\"\n            \"dvec2  floor(dvec2);\"\n            \"dvec3  floor(dvec3);\"\n            \"dvec4  floor(dvec4);\"\n\n            \"double trunc(double);\"\n            \"dvec2  trunc(dvec2);\"\n            \"dvec3  trunc(dvec3);\"\n            \"dvec4  trunc(dvec4);\"\n\n            \"double round(double);\"\n            \"dvec2  round(dvec2);\"\n            \"dvec3  round(dvec3);\"\n            \"dvec4  round(dvec4);\"\n\n            \"double roundEven(double);\"\n            \"dvec2  roundEven(dvec2);\"\n            \"dvec3  roundEven(dvec3);\"\n            \"dvec4  roundEven(dvec4);\"\n\n            \"double ceil(double);\"\n            \"dvec2  ceil(dvec2);\"\n            \"dvec3  ceil(dvec3);\"\n            \"dvec4  ceil(dvec4);\"\n\n            \"double fract(double);\"\n            \"dvec2  fract(dvec2);\"\n            \"dvec3  fract(dvec3);\"\n            \"dvec4  fract(dvec4);\"\n\n            \"double mod(double, double);\"\n            \"dvec2  mod(dvec2 , double);\"\n            \"dvec3  mod(dvec3 , double);\"\n            \"dvec4  mod(dvec4 , double);\"\n            \"dvec2  mod(dvec2 , dvec2);\"\n            \"dvec3  mod(dvec3 , dvec3);\"\n            \"dvec4  mod(dvec4 , dvec4);\"\n\n            \"double modf(double, out double);\"\n            \"dvec2  modf(dvec2,  out dvec2);\"\n            \"dvec3  modf(dvec3,  out dvec3);\"\n            \"dvec4  modf(dvec4,  out dvec4);\"\n\n            \"double min(double, double);\"\n            \"dvec2  min(dvec2,  double);\"\n            \"dvec3  min(dvec3,  double);\"\n            \"dvec4  min(dvec4,  double);\"\n            \"dvec2  min(dvec2,  dvec2);\"\n            \"dvec3  min(dvec3,  dvec3);\"\n            \"dvec4  min(dvec4,  dvec4);\"\n\n            \"double max(double, double);\"\n            \"dvec2  max(dvec2 , double);\"\n            \"dvec3  max(dvec3 , double);\"\n            \"dvec4  max(dvec4 , double);\"\n            \"dvec2  max(dvec2 , dvec2);\"\n            \"dvec3  max(dvec3 , dvec3);\"\n            \"dvec4  max(dvec4 , dvec4);\"\n\n            \"double clamp(double, double, double);\"\n            \"dvec2  clamp(dvec2 , double, double);\"\n            \"dvec3  clamp(dvec3 , double, double);\"\n            \"dvec4  clamp(dvec4 , double, double);\"\n            \"dvec2  clamp(dvec2 , dvec2 , dvec2);\"\n            \"dvec3  clamp(dvec3 , dvec3 , dvec3);\"\n            \"dvec4  clamp(dvec4 , dvec4 , dvec4);\"\n\n            \"double mix(double, double, double);\"\n            \"dvec2  mix(dvec2,  dvec2,  double);\"\n            \"dvec3  mix(dvec3,  dvec3,  double);\"\n            \"dvec4  mix(dvec4,  dvec4,  double);\"\n            \"dvec2  mix(dvec2,  dvec2,  dvec2);\"\n            \"dvec3  mix(dvec3,  dvec3,  dvec3);\"\n            \"dvec4  mix(dvec4,  dvec4,  dvec4);\"\n            \"double mix(double, double, bool);\"\n            \"dvec2  mix(dvec2,  dvec2,  bvec2);\"\n            \"dvec3  mix(dvec3,  dvec3,  bvec3);\"\n            \"dvec4  mix(dvec4,  dvec4,  bvec4);\"\n\n            \"double step(double, double);\"\n            \"dvec2  step(dvec2 , dvec2);\"\n            \"dvec3  step(dvec3 , dvec3);\"\n            \"dvec4  step(dvec4 , dvec4);\"\n            \"dvec2  step(double, dvec2);\"\n            \"dvec3  step(double, dvec3);\"\n            \"dvec4  step(double, dvec4);\"\n\n            \"double smoothstep(double, double, double);\"\n            \"dvec2  smoothstep(dvec2 , dvec2 , dvec2);\"\n            \"dvec3  smoothstep(dvec3 , dvec3 , dvec3);\"\n            \"dvec4  smoothstep(dvec4 , dvec4 , dvec4);\"\n            \"dvec2  smoothstep(double, double, dvec2);\"\n            \"dvec3  smoothstep(double, double, dvec3);\"\n            \"dvec4  smoothstep(double, double, dvec4);\"\n\n            \"bool  isnan(double);\"\n            \"bvec2 isnan(dvec2);\"\n            \"bvec3 isnan(dvec3);\"\n            \"bvec4 isnan(dvec4);\"\n\n            \"bool  isinf(double);\"\n            \"bvec2 isinf(dvec2);\"\n            \"bvec3 isinf(dvec3);\"\n            \"bvec4 isinf(dvec4);\"\n\n            \"double length(double);\"\n            \"double length(dvec2);\"\n            \"double length(dvec3);\"\n            \"double length(dvec4);\"\n\n            \"double distance(double, double);\"\n            \"double distance(dvec2 , dvec2);\"\n            \"double distance(dvec3 , dvec3);\"\n            \"double distance(dvec4 , dvec4);\"\n\n            \"double dot(double, double);\"\n            \"double dot(dvec2 , dvec2);\"\n            \"double dot(dvec3 , dvec3);\"\n            \"double dot(dvec4 , dvec4);\"\n\n            \"dvec3 cross(dvec3, dvec3);\"\n\n            \"double normalize(double);\"\n            \"dvec2  normalize(dvec2);\"\n            \"dvec3  normalize(dvec3);\"\n            \"dvec4  normalize(dvec4);\"\n\n            \"double faceforward(double, double, double);\"\n            \"dvec2  faceforward(dvec2,  dvec2,  dvec2);\"\n            \"dvec3  faceforward(dvec3,  dvec3,  dvec3);\"\n            \"dvec4  faceforward(dvec4,  dvec4,  dvec4);\"\n\n            \"double reflect(double, double);\"\n            \"dvec2  reflect(dvec2 , dvec2 );\"\n            \"dvec3  reflect(dvec3 , dvec3 );\"\n            \"dvec4  reflect(dvec4 , dvec4 );\"\n\n            \"double refract(double, double, double);\"\n            \"dvec2  refract(dvec2 , dvec2 , double);\"\n            \"dvec3  refract(dvec3 , dvec3 , double);\"\n            \"dvec4  refract(dvec4 , dvec4 , double);\"\n\n            \"dmat2 matrixCompMult(dmat2, dmat2);\"\n            \"dmat3 matrixCompMult(dmat3, dmat3);\"\n            \"dmat4 matrixCompMult(dmat4, dmat4);\"\n            \"dmat2x3 matrixCompMult(dmat2x3, dmat2x3);\"\n            \"dmat2x4 matrixCompMult(dmat2x4, dmat2x4);\"\n            \"dmat3x2 matrixCompMult(dmat3x2, dmat3x2);\"\n            \"dmat3x4 matrixCompMult(dmat3x4, dmat3x4);\"\n            \"dmat4x2 matrixCompMult(dmat4x2, dmat4x2);\"\n            \"dmat4x3 matrixCompMult(dmat4x3, dmat4x3);\"\n\n            \"dmat2   outerProduct(dvec2, dvec2);\"\n            \"dmat3   outerProduct(dvec3, dvec3);\"\n            \"dmat4   outerProduct(dvec4, dvec4);\"\n            \"dmat2x3 outerProduct(dvec3, dvec2);\"\n            \"dmat3x2 outerProduct(dvec2, dvec3);\"\n            \"dmat2x4 outerProduct(dvec4, dvec2);\"\n            \"dmat4x2 outerProduct(dvec2, dvec4);\"\n            \"dmat3x4 outerProduct(dvec4, dvec3);\"\n            \"dmat4x3 outerProduct(dvec3, dvec4);\"\n\n            \"dmat2   transpose(dmat2);\"\n            \"dmat3   transpose(dmat3);\"\n            \"dmat4   transpose(dmat4);\"\n            \"dmat2x3 transpose(dmat3x2);\"\n            \"dmat3x2 transpose(dmat2x3);\"\n            \"dmat2x4 transpose(dmat4x2);\"\n            \"dmat4x2 transpose(dmat2x4);\"\n            \"dmat3x4 transpose(dmat4x3);\"\n            \"dmat4x3 transpose(dmat3x4);\"\n\n            \"double determinant(dmat2);\"\n            \"double determinant(dmat3);\"\n            \"double determinant(dmat4);\"\n\n            \"dmat2 inverse(dmat2);\"\n            \"dmat3 inverse(dmat3);\"\n            \"dmat4 inverse(dmat4);\"\n\n            \"bvec2 lessThan(dvec2, dvec2);\"\n            \"bvec3 lessThan(dvec3, dvec3);\"\n            \"bvec4 lessThan(dvec4, dvec4);\"\n\n            \"bvec2 lessThanEqual(dvec2, dvec2);\"\n            \"bvec3 lessThanEqual(dvec3, dvec3);\"\n            \"bvec4 lessThanEqual(dvec4, dvec4);\"\n\n            \"bvec2 greaterThan(dvec2, dvec2);\"\n            \"bvec3 greaterThan(dvec3, dvec3);\"\n            \"bvec4 greaterThan(dvec4, dvec4);\"\n\n            \"bvec2 greaterThanEqual(dvec2, dvec2);\"\n            \"bvec3 greaterThanEqual(dvec3, dvec3);\"\n            \"bvec4 greaterThanEqual(dvec4, dvec4);\"\n\n            \"bvec2 equal(dvec2, dvec2);\"\n            \"bvec3 equal(dvec3, dvec3);\"\n            \"bvec4 equal(dvec4, dvec4);\"\n\n            \"bvec2 notEqual(dvec2, dvec2);\"\n            \"bvec3 notEqual(dvec3, dvec3);\"\n            \"bvec4 notEqual(dvec4, dvec4);\"\n\n            \"\\n\");\n    }\n\n    if (profile == EEsProfile && version >= 310) {  // Explicit Types\n      commonBuiltins.append(\n\n        \"float64_t sqrt(float64_t);\"\n        \"f64vec2  sqrt(f64vec2);\"\n        \"f64vec3  sqrt(f64vec3);\"\n        \"f64vec4  sqrt(f64vec4);\"\n\n        \"float64_t inversesqrt(float64_t);\"\n        \"f64vec2  inversesqrt(f64vec2);\"\n        \"f64vec3  inversesqrt(f64vec3);\"\n        \"f64vec4  inversesqrt(f64vec4);\"\n\n        \"float64_t abs(float64_t);\"\n        \"f64vec2  abs(f64vec2);\"\n        \"f64vec3  abs(f64vec3);\"\n        \"f64vec4  abs(f64vec4);\"\n\n        \"float64_t sign(float64_t);\"\n        \"f64vec2  sign(f64vec2);\"\n        \"f64vec3  sign(f64vec3);\"\n        \"f64vec4  sign(f64vec4);\"\n\n        \"float64_t floor(float64_t);\"\n        \"f64vec2  floor(f64vec2);\"\n        \"f64vec3  floor(f64vec3);\"\n        \"f64vec4  floor(f64vec4);\"\n\n        \"float64_t trunc(float64_t);\"\n        \"f64vec2  trunc(f64vec2);\"\n        \"f64vec3  trunc(f64vec3);\"\n        \"f64vec4  trunc(f64vec4);\"\n\n        \"float64_t round(float64_t);\"\n        \"f64vec2  round(f64vec2);\"\n        \"f64vec3  round(f64vec3);\"\n        \"f64vec4  round(f64vec4);\"\n\n        \"float64_t roundEven(float64_t);\"\n        \"f64vec2  roundEven(f64vec2);\"\n        \"f64vec3  roundEven(f64vec3);\"\n        \"f64vec4  roundEven(f64vec4);\"\n\n        \"float64_t ceil(float64_t);\"\n        \"f64vec2  ceil(f64vec2);\"\n        \"f64vec3  ceil(f64vec3);\"\n        \"f64vec4  ceil(f64vec4);\"\n\n        \"float64_t fract(float64_t);\"\n        \"f64vec2  fract(f64vec2);\"\n        \"f64vec3  fract(f64vec3);\"\n        \"f64vec4  fract(f64vec4);\"\n\n        \"float64_t mod(float64_t, float64_t);\"\n        \"f64vec2  mod(f64vec2 , float64_t);\"\n        \"f64vec3  mod(f64vec3 , float64_t);\"\n        \"f64vec4  mod(f64vec4 , float64_t);\"\n        \"f64vec2  mod(f64vec2 , f64vec2);\"\n        \"f64vec3  mod(f64vec3 , f64vec3);\"\n        \"f64vec4  mod(f64vec4 , f64vec4);\"\n\n        \"float64_t modf(float64_t, out float64_t);\"\n        \"f64vec2  modf(f64vec2,  out f64vec2);\"\n        \"f64vec3  modf(f64vec3,  out f64vec3);\"\n        \"f64vec4  modf(f64vec4,  out f64vec4);\"\n\n        \"float64_t min(float64_t, float64_t);\"\n        \"f64vec2  min(f64vec2,  float64_t);\"\n        \"f64vec3  min(f64vec3,  float64_t);\"\n        \"f64vec4  min(f64vec4,  float64_t);\"\n        \"f64vec2  min(f64vec2,  f64vec2);\"\n        \"f64vec3  min(f64vec3,  f64vec3);\"\n        \"f64vec4  min(f64vec4,  f64vec4);\"\n\n        \"float64_t max(float64_t, float64_t);\"\n        \"f64vec2  max(f64vec2 , float64_t);\"\n        \"f64vec3  max(f64vec3 , float64_t);\"\n        \"f64vec4  max(f64vec4 , float64_t);\"\n        \"f64vec2  max(f64vec2 , f64vec2);\"\n        \"f64vec3  max(f64vec3 , f64vec3);\"\n        \"f64vec4  max(f64vec4 , f64vec4);\"\n\n        \"float64_t clamp(float64_t, float64_t, float64_t);\"\n        \"f64vec2  clamp(f64vec2 , float64_t, float64_t);\"\n        \"f64vec3  clamp(f64vec3 , float64_t, float64_t);\"\n        \"f64vec4  clamp(f64vec4 , float64_t, float64_t);\"\n        \"f64vec2  clamp(f64vec2 , f64vec2 , f64vec2);\"\n        \"f64vec3  clamp(f64vec3 , f64vec3 , f64vec3);\"\n        \"f64vec4  clamp(f64vec4 , f64vec4 , f64vec4);\"\n\n        \"float64_t mix(float64_t, float64_t, float64_t);\"\n        \"f64vec2  mix(f64vec2,  f64vec2,  float64_t);\"\n        \"f64vec3  mix(f64vec3,  f64vec3,  float64_t);\"\n        \"f64vec4  mix(f64vec4,  f64vec4,  float64_t);\"\n        \"f64vec2  mix(f64vec2,  f64vec2,  f64vec2);\"\n        \"f64vec3  mix(f64vec3,  f64vec3,  f64vec3);\"\n        \"f64vec4  mix(f64vec4,  f64vec4,  f64vec4);\"\n        \"float64_t mix(float64_t, float64_t, bool);\"\n        \"f64vec2  mix(f64vec2,  f64vec2,  bvec2);\"\n        \"f64vec3  mix(f64vec3,  f64vec3,  bvec3);\"\n        \"f64vec4  mix(f64vec4,  f64vec4,  bvec4);\"\n\n        \"float64_t step(float64_t, float64_t);\"\n        \"f64vec2  step(f64vec2 , f64vec2);\"\n        \"f64vec3  step(f64vec3 , f64vec3);\"\n        \"f64vec4  step(f64vec4 , f64vec4);\"\n        \"f64vec2  step(float64_t, f64vec2);\"\n        \"f64vec3  step(float64_t, f64vec3);\"\n        \"f64vec4  step(float64_t, f64vec4);\"\n\n        \"float64_t smoothstep(float64_t, float64_t, float64_t);\"\n        \"f64vec2  smoothstep(f64vec2 , f64vec2 , f64vec2);\"\n        \"f64vec3  smoothstep(f64vec3 , f64vec3 , f64vec3);\"\n        \"f64vec4  smoothstep(f64vec4 , f64vec4 , f64vec4);\"\n        \"f64vec2  smoothstep(float64_t, float64_t, f64vec2);\"\n        \"f64vec3  smoothstep(float64_t, float64_t, f64vec3);\"\n        \"f64vec4  smoothstep(float64_t, float64_t, f64vec4);\"\n\n        \"float64_t length(float64_t);\"\n        \"float64_t length(f64vec2);\"\n        \"float64_t length(f64vec3);\"\n        \"float64_t length(f64vec4);\"\n\n        \"float64_t distance(float64_t, float64_t);\"\n        \"float64_t distance(f64vec2 , f64vec2);\"\n        \"float64_t distance(f64vec3 , f64vec3);\"\n        \"float64_t distance(f64vec4 , f64vec4);\"\n\n        \"float64_t dot(float64_t, float64_t);\"\n        \"float64_t dot(f64vec2 , f64vec2);\"\n        \"float64_t dot(f64vec3 , f64vec3);\"\n        \"float64_t dot(f64vec4 , f64vec4);\"\n\n        \"f64vec3 cross(f64vec3, f64vec3);\"\n\n        \"float64_t normalize(float64_t);\"\n        \"f64vec2  normalize(f64vec2);\"\n        \"f64vec3  normalize(f64vec3);\"\n        \"f64vec4  normalize(f64vec4);\"\n\n        \"float64_t faceforward(float64_t, float64_t, float64_t);\"\n        \"f64vec2  faceforward(f64vec2,  f64vec2,  f64vec2);\"\n        \"f64vec3  faceforward(f64vec3,  f64vec3,  f64vec3);\"\n        \"f64vec4  faceforward(f64vec4,  f64vec4,  f64vec4);\"\n\n        \"float64_t reflect(float64_t, float64_t);\"\n        \"f64vec2  reflect(f64vec2 , f64vec2 );\"\n        \"f64vec3  reflect(f64vec3 , f64vec3 );\"\n        \"f64vec4  reflect(f64vec4 , f64vec4 );\"\n\n        \"float64_t refract(float64_t, float64_t, float64_t);\"\n        \"f64vec2  refract(f64vec2 , f64vec2 , float64_t);\"\n        \"f64vec3  refract(f64vec3 , f64vec3 , float64_t);\"\n        \"f64vec4  refract(f64vec4 , f64vec4 , float64_t);\"\n\n        \"f64mat2 matrixCompMult(f64mat2, f64mat2);\"\n        \"f64mat3 matrixCompMult(f64mat3, f64mat3);\"\n        \"f64mat4 matrixCompMult(f64mat4, f64mat4);\"\n        \"f64mat2x3 matrixCompMult(f64mat2x3, f64mat2x3);\"\n        \"f64mat2x4 matrixCompMult(f64mat2x4, f64mat2x4);\"\n        \"f64mat3x2 matrixCompMult(f64mat3x2, f64mat3x2);\"\n        \"f64mat3x4 matrixCompMult(f64mat3x4, f64mat3x4);\"\n        \"f64mat4x2 matrixCompMult(f64mat4x2, f64mat4x2);\"\n        \"f64mat4x3 matrixCompMult(f64mat4x3, f64mat4x3);\"\n\n        \"f64mat2   outerProduct(f64vec2, f64vec2);\"\n        \"f64mat3   outerProduct(f64vec3, f64vec3);\"\n        \"f64mat4   outerProduct(f64vec4, f64vec4);\"\n        \"f64mat2x3 outerProduct(f64vec3, f64vec2);\"\n        \"f64mat3x2 outerProduct(f64vec2, f64vec3);\"\n        \"f64mat2x4 outerProduct(f64vec4, f64vec2);\"\n        \"f64mat4x2 outerProduct(f64vec2, f64vec4);\"\n        \"f64mat3x4 outerProduct(f64vec4, f64vec3);\"\n        \"f64mat4x3 outerProduct(f64vec3, f64vec4);\"\n\n        \"f64mat2   transpose(f64mat2);\"\n        \"f64mat3   transpose(f64mat3);\"\n        \"f64mat4   transpose(f64mat4);\"\n        \"f64mat2x3 transpose(f64mat3x2);\"\n        \"f64mat3x2 transpose(f64mat2x3);\"\n        \"f64mat2x4 transpose(f64mat4x2);\"\n        \"f64mat4x2 transpose(f64mat2x4);\"\n        \"f64mat3x4 transpose(f64mat4x3);\"\n        \"f64mat4x3 transpose(f64mat3x4);\"\n\n        \"float64_t determinant(f64mat2);\"\n        \"float64_t determinant(f64mat3);\"\n        \"float64_t determinant(f64mat4);\"\n\n        \"f64mat2 inverse(f64mat2);\"\n        \"f64mat3 inverse(f64mat3);\"\n        \"f64mat4 inverse(f64mat4);\"\n\n        \"\\n\");\n    }\n\n    if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 310)) {\n        commonBuiltins.append(\n\n            \"int64_t abs(int64_t);\"\n            \"i64vec2 abs(i64vec2);\"\n            \"i64vec3 abs(i64vec3);\"\n            \"i64vec4 abs(i64vec4);\"\n\n            \"int64_t sign(int64_t);\"\n            \"i64vec2 sign(i64vec2);\"\n            \"i64vec3 sign(i64vec3);\"\n            \"i64vec4 sign(i64vec4);\"\n\n            \"int64_t  min(int64_t,  int64_t);\"\n            \"i64vec2  min(i64vec2,  int64_t);\"\n            \"i64vec3  min(i64vec3,  int64_t);\"\n            \"i64vec4  min(i64vec4,  int64_t);\"\n            \"i64vec2  min(i64vec2,  i64vec2);\"\n            \"i64vec3  min(i64vec3,  i64vec3);\"\n            \"i64vec4  min(i64vec4,  i64vec4);\"\n            \"uint64_t min(uint64_t, uint64_t);\"\n            \"u64vec2  min(u64vec2,  uint64_t);\"\n            \"u64vec3  min(u64vec3,  uint64_t);\"\n            \"u64vec4  min(u64vec4,  uint64_t);\"\n            \"u64vec2  min(u64vec2,  u64vec2);\"\n            \"u64vec3  min(u64vec3,  u64vec3);\"\n            \"u64vec4  min(u64vec4,  u64vec4);\"\n\n            \"int64_t  max(int64_t,  int64_t);\"\n            \"i64vec2  max(i64vec2,  int64_t);\"\n            \"i64vec3  max(i64vec3,  int64_t);\"\n            \"i64vec4  max(i64vec4,  int64_t);\"\n            \"i64vec2  max(i64vec2,  i64vec2);\"\n            \"i64vec3  max(i64vec3,  i64vec3);\"\n            \"i64vec4  max(i64vec4,  i64vec4);\"\n            \"uint64_t max(uint64_t, uint64_t);\"\n            \"u64vec2  max(u64vec2,  uint64_t);\"\n            \"u64vec3  max(u64vec3,  uint64_t);\"\n            \"u64vec4  max(u64vec4,  uint64_t);\"\n            \"u64vec2  max(u64vec2,  u64vec2);\"\n            \"u64vec3  max(u64vec3,  u64vec3);\"\n            \"u64vec4  max(u64vec4,  u64vec4);\"\n\n            \"int64_t  clamp(int64_t,  int64_t,  int64_t);\"\n            \"i64vec2  clamp(i64vec2,  int64_t,  int64_t);\"\n            \"i64vec3  clamp(i64vec3,  int64_t,  int64_t);\"\n            \"i64vec4  clamp(i64vec4,  int64_t,  int64_t);\"\n            \"i64vec2  clamp(i64vec2,  i64vec2,  i64vec2);\"\n            \"i64vec3  clamp(i64vec3,  i64vec3,  i64vec3);\"\n            \"i64vec4  clamp(i64vec4,  i64vec4,  i64vec4);\"\n            \"uint64_t clamp(uint64_t, uint64_t, uint64_t);\"\n            \"u64vec2  clamp(u64vec2,  uint64_t, uint64_t);\"\n            \"u64vec3  clamp(u64vec3,  uint64_t, uint64_t);\"\n            \"u64vec4  clamp(u64vec4,  uint64_t, uint64_t);\"\n            \"u64vec2  clamp(u64vec2,  u64vec2,  u64vec2);\"\n            \"u64vec3  clamp(u64vec3,  u64vec3,  u64vec3);\"\n            \"u64vec4  clamp(u64vec4,  u64vec4,  u64vec4);\"\n\n            \"int64_t  mix(int64_t,  int64_t,  bool);\"\n            \"i64vec2  mix(i64vec2,  i64vec2,  bvec2);\"\n            \"i64vec3  mix(i64vec3,  i64vec3,  bvec3);\"\n            \"i64vec4  mix(i64vec4,  i64vec4,  bvec4);\"\n            \"uint64_t mix(uint64_t, uint64_t, bool);\"\n            \"u64vec2  mix(u64vec2,  u64vec2,  bvec2);\"\n            \"u64vec3  mix(u64vec3,  u64vec3,  bvec3);\"\n            \"u64vec4  mix(u64vec4,  u64vec4,  bvec4);\"\n\n            \"int64_t doubleBitsToInt64(float64_t);\"\n            \"i64vec2 doubleBitsToInt64(f64vec2);\"\n            \"i64vec3 doubleBitsToInt64(f64vec3);\"\n            \"i64vec4 doubleBitsToInt64(f64vec4);\"\n\n            \"uint64_t doubleBitsToUint64(float64_t);\"\n            \"u64vec2  doubleBitsToUint64(f64vec2);\"\n            \"u64vec3  doubleBitsToUint64(f64vec3);\"\n            \"u64vec4  doubleBitsToUint64(f64vec4);\"\n\n            \"float64_t int64BitsToDouble(int64_t);\"\n            \"f64vec2  int64BitsToDouble(i64vec2);\"\n            \"f64vec3  int64BitsToDouble(i64vec3);\"\n            \"f64vec4  int64BitsToDouble(i64vec4);\"\n\n            \"float64_t uint64BitsToDouble(uint64_t);\"\n            \"f64vec2  uint64BitsToDouble(u64vec2);\"\n            \"f64vec3  uint64BitsToDouble(u64vec3);\"\n            \"f64vec4  uint64BitsToDouble(u64vec4);\"\n\n            \"int64_t  packInt2x32(ivec2);\"\n            \"uint64_t packUint2x32(uvec2);\"\n            \"ivec2    unpackInt2x32(int64_t);\"\n            \"uvec2    unpackUint2x32(uint64_t);\"\n\n            \"bvec2 lessThan(i64vec2, i64vec2);\"\n            \"bvec3 lessThan(i64vec3, i64vec3);\"\n            \"bvec4 lessThan(i64vec4, i64vec4);\"\n            \"bvec2 lessThan(u64vec2, u64vec2);\"\n            \"bvec3 lessThan(u64vec3, u64vec3);\"\n            \"bvec4 lessThan(u64vec4, u64vec4);\"\n\n            \"bvec2 lessThanEqual(i64vec2, i64vec2);\"\n            \"bvec3 lessThanEqual(i64vec3, i64vec3);\"\n            \"bvec4 lessThanEqual(i64vec4, i64vec4);\"\n            \"bvec2 lessThanEqual(u64vec2, u64vec2);\"\n            \"bvec3 lessThanEqual(u64vec3, u64vec3);\"\n            \"bvec4 lessThanEqual(u64vec4, u64vec4);\"\n\n            \"bvec2 greaterThan(i64vec2, i64vec2);\"\n            \"bvec3 greaterThan(i64vec3, i64vec3);\"\n            \"bvec4 greaterThan(i64vec4, i64vec4);\"\n            \"bvec2 greaterThan(u64vec2, u64vec2);\"\n            \"bvec3 greaterThan(u64vec3, u64vec3);\"\n            \"bvec4 greaterThan(u64vec4, u64vec4);\"\n\n            \"bvec2 greaterThanEqual(i64vec2, i64vec2);\"\n            \"bvec3 greaterThanEqual(i64vec3, i64vec3);\"\n            \"bvec4 greaterThanEqual(i64vec4, i64vec4);\"\n            \"bvec2 greaterThanEqual(u64vec2, u64vec2);\"\n            \"bvec3 greaterThanEqual(u64vec3, u64vec3);\"\n            \"bvec4 greaterThanEqual(u64vec4, u64vec4);\"\n\n            \"bvec2 equal(i64vec2, i64vec2);\"\n            \"bvec3 equal(i64vec3, i64vec3);\"\n            \"bvec4 equal(i64vec4, i64vec4);\"\n            \"bvec2 equal(u64vec2, u64vec2);\"\n            \"bvec3 equal(u64vec3, u64vec3);\"\n            \"bvec4 equal(u64vec4, u64vec4);\"\n\n            \"bvec2 notEqual(i64vec2, i64vec2);\"\n            \"bvec3 notEqual(i64vec3, i64vec3);\"\n            \"bvec4 notEqual(i64vec4, i64vec4);\"\n            \"bvec2 notEqual(u64vec2, u64vec2);\"\n            \"bvec3 notEqual(u64vec3, u64vec3);\"\n            \"bvec4 notEqual(u64vec4, u64vec4);\"\n\n            \"int64_t bitCount(int64_t);\"\n            \"i64vec2 bitCount(i64vec2);\"\n            \"i64vec3 bitCount(i64vec3);\"\n            \"i64vec4 bitCount(i64vec4);\"\n\n            \"int64_t bitCount(uint64_t);\"\n            \"i64vec2 bitCount(u64vec2);\"\n            \"i64vec3 bitCount(u64vec3);\"\n            \"i64vec4 bitCount(u64vec4);\"\n\n            \"int64_t findLSB(int64_t);\"\n            \"i64vec2 findLSB(i64vec2);\"\n            \"i64vec3 findLSB(i64vec3);\"\n            \"i64vec4 findLSB(i64vec4);\"\n\n            \"int64_t findLSB(uint64_t);\"\n            \"i64vec2 findLSB(u64vec2);\"\n            \"i64vec3 findLSB(u64vec3);\"\n            \"i64vec4 findLSB(u64vec4);\"\n\n            \"int64_t findMSB(int64_t);\"\n            \"i64vec2 findMSB(i64vec2);\"\n            \"i64vec3 findMSB(i64vec3);\"\n            \"i64vec4 findMSB(i64vec4);\"\n\n            \"int64_t findMSB(uint64_t);\"\n            \"i64vec2 findMSB(u64vec2);\"\n            \"i64vec3 findMSB(u64vec3);\"\n            \"i64vec4 findMSB(u64vec4);\"\n\n            \"\\n\"\n        );\n    }\n\n    // GL_AMD_shader_trinary_minmax\n    if (profile != EEsProfile && version >= 430) {\n        commonBuiltins.append(\n            \"float min3(float, float, float);\"\n            \"vec2  min3(vec2,  vec2,  vec2);\"\n            \"vec3  min3(vec3,  vec3,  vec3);\"\n            \"vec4  min3(vec4,  vec4,  vec4);\"\n\n            \"int   min3(int,   int,   int);\"\n            \"ivec2 min3(ivec2, ivec2, ivec2);\"\n            \"ivec3 min3(ivec3, ivec3, ivec3);\"\n            \"ivec4 min3(ivec4, ivec4, ivec4);\"\n\n            \"uint  min3(uint,  uint,  uint);\"\n            \"uvec2 min3(uvec2, uvec2, uvec2);\"\n            \"uvec3 min3(uvec3, uvec3, uvec3);\"\n            \"uvec4 min3(uvec4, uvec4, uvec4);\"\n\n            \"float max3(float, float, float);\"\n            \"vec2  max3(vec2,  vec2,  vec2);\"\n            \"vec3  max3(vec3,  vec3,  vec3);\"\n            \"vec4  max3(vec4,  vec4,  vec4);\"\n\n            \"int   max3(int,   int,   int);\"\n            \"ivec2 max3(ivec2, ivec2, ivec2);\"\n            \"ivec3 max3(ivec3, ivec3, ivec3);\"\n            \"ivec4 max3(ivec4, ivec4, ivec4);\"\n\n            \"uint  max3(uint,  uint,  uint);\"\n            \"uvec2 max3(uvec2, uvec2, uvec2);\"\n            \"uvec3 max3(uvec3, uvec3, uvec3);\"\n            \"uvec4 max3(uvec4, uvec4, uvec4);\"\n\n            \"float mid3(float, float, float);\"\n            \"vec2  mid3(vec2,  vec2,  vec2);\"\n            \"vec3  mid3(vec3,  vec3,  vec3);\"\n            \"vec4  mid3(vec4,  vec4,  vec4);\"\n\n            \"int   mid3(int,   int,   int);\"\n            \"ivec2 mid3(ivec2, ivec2, ivec2);\"\n            \"ivec3 mid3(ivec3, ivec3, ivec3);\"\n            \"ivec4 mid3(ivec4, ivec4, ivec4);\"\n\n            \"uint  mid3(uint,  uint,  uint);\"\n            \"uvec2 mid3(uvec2, uvec2, uvec2);\"\n            \"uvec3 mid3(uvec3, uvec3, uvec3);\"\n            \"uvec4 mid3(uvec4, uvec4, uvec4);\"\n\n            \"float16_t min3(float16_t, float16_t, float16_t);\"\n            \"f16vec2   min3(f16vec2,   f16vec2,   f16vec2);\"\n            \"f16vec3   min3(f16vec3,   f16vec3,   f16vec3);\"\n            \"f16vec4   min3(f16vec4,   f16vec4,   f16vec4);\"\n\n            \"float16_t max3(float16_t, float16_t, float16_t);\"\n            \"f16vec2   max3(f16vec2,   f16vec2,   f16vec2);\"\n            \"f16vec3   max3(f16vec3,   f16vec3,   f16vec3);\"\n            \"f16vec4   max3(f16vec4,   f16vec4,   f16vec4);\"\n\n            \"float16_t mid3(float16_t, float16_t, float16_t);\"\n            \"f16vec2   mid3(f16vec2,   f16vec2,   f16vec2);\"\n            \"f16vec3   mid3(f16vec3,   f16vec3,   f16vec3);\"\n            \"f16vec4   mid3(f16vec4,   f16vec4,   f16vec4);\"\n\n            \"int16_t   min3(int16_t,   int16_t,   int16_t);\"\n            \"i16vec2   min3(i16vec2,   i16vec2,   i16vec2);\"\n            \"i16vec3   min3(i16vec3,   i16vec3,   i16vec3);\"\n            \"i16vec4   min3(i16vec4,   i16vec4,   i16vec4);\"\n\n            \"int16_t   max3(int16_t,   int16_t,   int16_t);\"\n            \"i16vec2   max3(i16vec2,   i16vec2,   i16vec2);\"\n            \"i16vec3   max3(i16vec3,   i16vec3,   i16vec3);\"\n            \"i16vec4   max3(i16vec4,   i16vec4,   i16vec4);\"\n\n            \"int16_t   mid3(int16_t,   int16_t,   int16_t);\"\n            \"i16vec2   mid3(i16vec2,   i16vec2,   i16vec2);\"\n            \"i16vec3   mid3(i16vec3,   i16vec3,   i16vec3);\"\n            \"i16vec4   mid3(i16vec4,   i16vec4,   i16vec4);\"\n\n            \"uint16_t  min3(uint16_t,  uint16_t,  uint16_t);\"\n            \"u16vec2   min3(u16vec2,   u16vec2,   u16vec2);\"\n            \"u16vec3   min3(u16vec3,   u16vec3,   u16vec3);\"\n            \"u16vec4   min3(u16vec4,   u16vec4,   u16vec4);\"\n\n            \"uint16_t  max3(uint16_t,  uint16_t,  uint16_t);\"\n            \"u16vec2   max3(u16vec2,   u16vec2,   u16vec2);\"\n            \"u16vec3   max3(u16vec3,   u16vec3,   u16vec3);\"\n            \"u16vec4   max3(u16vec4,   u16vec4,   u16vec4);\"\n\n            \"uint16_t  mid3(uint16_t,  uint16_t,  uint16_t);\"\n            \"u16vec2   mid3(u16vec2,   u16vec2,   u16vec2);\"\n            \"u16vec3   mid3(u16vec3,   u16vec3,   u16vec3);\"\n            \"u16vec4   mid3(u16vec4,   u16vec4,   u16vec4);\"\n\n            \"\\n\"\n        );\n    }\n\n    if ((profile == EEsProfile && version >= 310) ||\n        (profile != EEsProfile && version >= 430)) {\n        commonBuiltins.append(\n            \"uint atomicAdd(coherent volatile nontemporal inout uint, uint, int, int, int);\"\n            \" int atomicAdd(coherent volatile nontemporal inout  int,  int, int, int, int);\"\n\n            \"uint atomicMin(coherent volatile nontemporal inout uint, uint, int, int, int);\"\n            \" int atomicMin(coherent volatile nontemporal inout  int,  int, int, int, int);\"\n\n            \"uint atomicMax(coherent volatile nontemporal inout uint, uint, int, int, int);\"\n            \" int atomicMax(coherent volatile nontemporal inout  int,  int, int, int, int);\"\n\n            \"uint atomicAnd(coherent volatile nontemporal inout uint, uint, int, int, int);\"\n            \" int atomicAnd(coherent volatile nontemporal inout  int,  int, int, int, int);\"\n\n            \"uint atomicOr (coherent volatile nontemporal inout uint, uint, int, int, int);\"\n            \" int atomicOr (coherent volatile nontemporal inout  int,  int, int, int, int);\"\n\n            \"uint atomicXor(coherent volatile nontemporal inout uint, uint, int, int, int);\"\n            \" int atomicXor(coherent volatile nontemporal inout  int,  int, int, int, int);\"\n\n            \"uint atomicExchange(coherent volatile nontemporal inout uint, uint, int, int, int);\"\n            \" int atomicExchange(coherent volatile nontemporal inout  int,  int, int, int, int);\"\n\n            \"uint atomicCompSwap(coherent volatile nontemporal inout uint, uint, uint, int, int, int, int, int);\"\n            \" int atomicCompSwap(coherent volatile nontemporal inout  int,  int,  int, int, int, int, int, int);\"\n\n            \"uint atomicLoad(coherent volatile nontemporal in uint, int, int, int);\"\n            \" int atomicLoad(coherent volatile nontemporal in  int, int, int, int);\"\n\n            \"void atomicStore(coherent volatile nontemporal out uint, uint, int, int, int);\"\n            \"void atomicStore(coherent volatile nontemporal out  int,  int, int, int, int);\"\n\n            \"\\n\");\n    }\n\n    if (profile != EEsProfile && version >= 440) {\n        commonBuiltins.append(\n            \"uint64_t atomicMin(coherent volatile nontemporal inout uint64_t, uint64_t);\"\n            \" int64_t atomicMin(coherent volatile nontemporal inout  int64_t,  int64_t);\"\n            \"uint64_t atomicMin(coherent volatile nontemporal inout uint64_t, uint64_t, int, int, int);\"\n            \" int64_t atomicMin(coherent volatile nontemporal inout  int64_t,  int64_t, int, int, int);\"\n            \"float16_t atomicMin(coherent volatile nontemporal inout float16_t, float16_t);\"\n            \"float16_t atomicMin(coherent volatile nontemporal inout float16_t, float16_t, int, int, int);\"\n            \"   float atomicMin(coherent volatile nontemporal inout float, float);\"\n            \"   float atomicMin(coherent volatile nontemporal inout float, float, int, int, int);\"\n            \"  double atomicMin(coherent volatile nontemporal inout double, double);\"\n            \"  double atomicMin(coherent volatile nontemporal inout double, double, int, int, int);\"\n\n            \"uint64_t atomicMax(coherent volatile nontemporal inout uint64_t, uint64_t);\"\n            \" int64_t atomicMax(coherent volatile nontemporal inout  int64_t,  int64_t);\"\n            \"uint64_t atomicMax(coherent volatile nontemporal inout uint64_t, uint64_t, int, int, int);\"\n            \" int64_t atomicMax(coherent volatile nontemporal inout  int64_t,  int64_t, int, int, int);\"\n            \"float16_t atomicMax(coherent volatile nontemporal inout float16_t, float16_t);\"\n            \"float16_t atomicMax(coherent volatile nontemporal inout float16_t, float16_t, int, int, int);\"\n            \"   float atomicMax(coherent volatile nontemporal inout float, float);\"\n            \"   float atomicMax(coherent volatile nontemporal inout float, float, int, int, int);\"\n            \"  double atomicMax(coherent volatile nontemporal inout double, double);\"\n            \"  double atomicMax(coherent volatile nontemporal inout double, double, int, int, int);\"\n\n            \"uint64_t atomicAnd(coherent volatile nontemporal inout uint64_t, uint64_t);\"\n            \" int64_t atomicAnd(coherent volatile nontemporal inout  int64_t,  int64_t);\"\n            \"uint64_t atomicAnd(coherent volatile nontemporal inout uint64_t, uint64_t, int, int, int);\"\n            \" int64_t atomicAnd(coherent volatile nontemporal inout  int64_t,  int64_t, int, int, int);\"\n\n            \"uint64_t atomicOr (coherent volatile nontemporal inout uint64_t, uint64_t);\"\n            \" int64_t atomicOr (coherent volatile nontemporal inout  int64_t,  int64_t);\"\n            \"uint64_t atomicOr (coherent volatile nontemporal inout uint64_t, uint64_t, int, int, int);\"\n            \" int64_t atomicOr (coherent volatile nontemporal inout  int64_t,  int64_t, int, int, int);\"\n\n            \"uint64_t atomicXor(coherent volatile nontemporal inout uint64_t, uint64_t);\"\n            \" int64_t atomicXor(coherent volatile nontemporal inout  int64_t,  int64_t);\"\n            \"uint64_t atomicXor(coherent volatile nontemporal inout uint64_t, uint64_t, int, int, int);\"\n            \" int64_t atomicXor(coherent volatile nontemporal inout  int64_t,  int64_t, int, int, int);\"\n\n            \"uint64_t atomicAdd(coherent volatile nontemporal inout uint64_t, uint64_t);\"\n            \" int64_t atomicAdd(coherent volatile nontemporal inout  int64_t,  int64_t);\"\n            \"uint64_t atomicAdd(coherent volatile nontemporal inout uint64_t, uint64_t, int, int, int);\"\n            \" int64_t atomicAdd(coherent volatile nontemporal inout  int64_t,  int64_t, int, int, int);\"\n            \"float16_t atomicAdd(coherent volatile nontemporal inout float16_t, float16_t);\"\n            \"float16_t atomicAdd(coherent volatile nontemporal inout float16_t, float16_t, int, int, int);\"\n            \"   float atomicAdd(coherent volatile nontemporal inout float, float);\"\n            \"   float atomicAdd(coherent volatile nontemporal inout float, float, int, int, int);\"\n            \"  double atomicAdd(coherent volatile nontemporal inout double, double);\"\n            \"  double atomicAdd(coherent volatile nontemporal inout double, double, int, int, int);\"\n\n            \"uint64_t atomicExchange(coherent volatile nontemporal inout uint64_t, uint64_t);\"\n            \" int64_t atomicExchange(coherent volatile nontemporal inout  int64_t,  int64_t);\"\n            \"uint64_t atomicExchange(coherent volatile nontemporal inout uint64_t, uint64_t, int, int, int);\"\n            \" int64_t atomicExchange(coherent volatile nontemporal inout  int64_t,  int64_t, int, int, int);\"\n            \"float16_t atomicExchange(coherent volatile nontemporal inout float16_t, float16_t);\"\n            \"float16_t atomicExchange(coherent volatile nontemporal inout float16_t, float16_t, int, int, int);\"\n            \"   float atomicExchange(coherent volatile nontemporal inout float, float);\"\n            \"   float atomicExchange(coherent volatile nontemporal inout float, float, int, int, int);\"\n            \"  double atomicExchange(coherent volatile nontemporal inout double, double);\"\n            \"  double atomicExchange(coherent volatile nontemporal inout double, double, int, int, int);\"\n\n            \"uint64_t atomicCompSwap(coherent volatile nontemporal inout uint64_t, uint64_t, uint64_t);\"\n            \" int64_t atomicCompSwap(coherent volatile nontemporal inout  int64_t,  int64_t,  int64_t);\"\n            \"uint64_t atomicCompSwap(coherent volatile nontemporal inout uint64_t, uint64_t, uint64_t, int, int, int, int, int);\"\n            \" int64_t atomicCompSwap(coherent volatile nontemporal inout  int64_t,  int64_t,  int64_t, int, int, int, int, int);\"\n\n            \"uint64_t atomicLoad(coherent volatile nontemporal in uint64_t, int, int, int);\"\n            \" int64_t atomicLoad(coherent volatile nontemporal in  int64_t, int, int, int);\"\n            \"float16_t atomicLoad(coherent volatile nontemporal in float16_t, int, int, int);\"\n            \"   float atomicLoad(coherent volatile nontemporal in float, int, int, int);\"\n            \"  double atomicLoad(coherent volatile nontemporal in double, int, int, int);\"\n\n            \"void atomicStore(coherent volatile nontemporal out uint64_t, uint64_t, int, int, int);\"\n            \"void atomicStore(coherent volatile nontemporal out  int64_t,  int64_t, int, int, int);\"\n            \"void atomicStore(coherent volatile nontemporal out float16_t, float16_t, int, int, int);\"\n            \"void atomicStore(coherent volatile nontemporal out float, float, int, int, int);\"\n            \"void atomicStore(coherent volatile nontemporal out double, double, int, int, int);\"\n            \"\\n\");\n    }\n\n    // NV_shader_atomic_fp16_vector\n    if (profile != EEsProfile && version >= 430) {\n        commonBuiltins.append(\n            \"f16vec2 atomicAdd(coherent volatile nontemporal inout f16vec2, f16vec2);\"\n            \"f16vec4 atomicAdd(coherent volatile nontemporal inout f16vec4, f16vec4);\"\n            \"f16vec2 atomicMin(coherent volatile nontemporal inout f16vec2, f16vec2);\"\n            \"f16vec4 atomicMin(coherent volatile nontemporal inout f16vec4, f16vec4);\"\n            \"f16vec2 atomicMax(coherent volatile nontemporal inout f16vec2, f16vec2);\"\n            \"f16vec4 atomicMax(coherent volatile nontemporal inout f16vec4, f16vec4);\"\n            \"f16vec2 atomicExchange(coherent volatile nontemporal inout f16vec2, f16vec2);\"\n            \"f16vec4 atomicExchange(coherent volatile nontemporal inout f16vec4, f16vec4);\"\n            \"\\n\");\n    }\n\n    if ((profile == EEsProfile && version >= 300) ||\n        (profile != EEsProfile && version >= 150)) { // GL_ARB_shader_bit_encoding\n        commonBuiltins.append(\n            \"int   floatBitsToInt(highp float value);\"\n            \"ivec2 floatBitsToInt(highp vec2  value);\"\n            \"ivec3 floatBitsToInt(highp vec3  value);\"\n            \"ivec4 floatBitsToInt(highp vec4  value);\"\n\n            \"uint  floatBitsToUint(highp float value);\"\n            \"uvec2 floatBitsToUint(highp vec2  value);\"\n            \"uvec3 floatBitsToUint(highp vec3  value);\"\n            \"uvec4 floatBitsToUint(highp vec4  value);\"\n\n            \"float intBitsToFloat(highp int   value);\"\n            \"vec2  intBitsToFloat(highp ivec2 value);\"\n            \"vec3  intBitsToFloat(highp ivec3 value);\"\n            \"vec4  intBitsToFloat(highp ivec4 value);\"\n\n            \"float uintBitsToFloat(highp uint  value);\"\n            \"vec2  uintBitsToFloat(highp uvec2 value);\"\n            \"vec3  uintBitsToFloat(highp uvec3 value);\"\n            \"vec4  uintBitsToFloat(highp uvec4 value);\"\n\n            \"\\n\");\n    }\n\n    if ((profile != EEsProfile && version >= 150) || // GL_NV_gpu_shader5\n        (profile == EEsProfile && version >= 310)) {    // GL_OES_gpu_shader5\n\n        commonBuiltins.append(\n            \"float  fma(float,  float,  float );\"\n            \"vec2   fma(vec2,   vec2,   vec2  );\"\n            \"vec3   fma(vec3,   vec3,   vec3  );\"\n            \"vec4   fma(vec4,   vec4,   vec4  );\"\n            \"\\n\");\n    }\n\n    if (profile != EEsProfile && version >= 150) {  // ARB_gpu_shader_fp64\n            commonBuiltins.append(\n                \"double fma(double, double, double);\"\n                \"dvec2  fma(dvec2,  dvec2,  dvec2 );\"\n                \"dvec3  fma(dvec3,  dvec3,  dvec3 );\"\n                \"dvec4  fma(dvec4,  dvec4,  dvec4 );\"\n                \"\\n\");\n    }\n\n    if (profile == EEsProfile && version >= 310) {  // ARB_gpu_shader_fp64\n            commonBuiltins.append(\n                \"float64_t fma(float64_t, float64_t, float64_t);\"\n                \"f64vec2  fma(f64vec2,  f64vec2,  f64vec2 );\"\n                \"f64vec3  fma(f64vec3,  f64vec3,  f64vec3 );\"\n                \"f64vec4  fma(f64vec4,  f64vec4,  f64vec4 );\"\n                \"\\n\");\n    }\n\n    if ((profile == EEsProfile && version >= 310) ||\n        (profile != EEsProfile && version >= 150)) { // GL_NV_gpu_shader5\n        commonBuiltins.append(\n            \"float frexp(highp float, out highp int);\"\n            \"vec2  frexp(highp vec2,  out highp ivec2);\"\n            \"vec3  frexp(highp vec3,  out highp ivec3);\"\n            \"vec4  frexp(highp vec4,  out highp ivec4);\"\n\n            \"float ldexp(highp float, highp int);\"\n            \"vec2  ldexp(highp vec2,  highp ivec2);\"\n            \"vec3  ldexp(highp vec3,  highp ivec3);\"\n            \"vec4  ldexp(highp vec4,  highp ivec4);\"\n\n            \"\\n\");\n    }\n\n    if (profile != EEsProfile && version >= 150) { // ARB_gpu_shader_fp64\n        commonBuiltins.append(\n            \"double frexp(double, out int);\"\n            \"dvec2  frexp( dvec2, out ivec2);\"\n            \"dvec3  frexp( dvec3, out ivec3);\"\n            \"dvec4  frexp( dvec4, out ivec4);\"\n\n            \"double ldexp(double, int);\"\n            \"dvec2  ldexp( dvec2, ivec2);\"\n            \"dvec3  ldexp( dvec3, ivec3);\"\n            \"dvec4  ldexp( dvec4, ivec4);\"\n\n            \"double packDouble2x32(uvec2);\"\n            \"uvec2 unpackDouble2x32(double);\"\n\n            \"\\n\");\n    }\n\n    if (profile == EEsProfile && version >= 310) { // ARB_gpu_shader_fp64\n        commonBuiltins.append(\n            \"float64_t frexp(float64_t, out int);\"\n            \"f64vec2  frexp( f64vec2, out ivec2);\"\n            \"f64vec3  frexp( f64vec3, out ivec3);\"\n            \"f64vec4  frexp( f64vec4, out ivec4);\"\n\n            \"float64_t ldexp(float64_t, int);\"\n            \"f64vec2  ldexp( f64vec2, ivec2);\"\n            \"f64vec3  ldexp( f64vec3, ivec3);\"\n            \"f64vec4  ldexp( f64vec4, ivec4);\"\n\n            \"\\n\");\n    }\n\n    if ((profile == EEsProfile && version >= 300) ||\n        (profile != EEsProfile && version >= 150)) {\n        commonBuiltins.append(\n            \"highp uint packUnorm2x16(vec2);\"\n                  \"vec2 unpackUnorm2x16(highp uint);\"\n            \"\\n\");\n    }\n\n    if ((profile == EEsProfile && version >= 300) ||\n        (profile != EEsProfile && version >= 150)) {\n        commonBuiltins.append(\n            \"highp uint packSnorm2x16(vec2);\"\n            \"      vec2 unpackSnorm2x16(highp uint);\"\n            \"highp uint packHalf2x16(vec2);\"\n            \"\\n\");\n    }\n\n    if (profile == EEsProfile && version >= 300) {\n        commonBuiltins.append(\n            \"mediump vec2 unpackHalf2x16(highp uint);\"\n            \"\\n\");\n    } else if (profile != EEsProfile && version >= 150) {\n        commonBuiltins.append(\n            \"        vec2 unpackHalf2x16(highp uint);\"\n            \"\\n\");\n    }\n\n    if ((profile == EEsProfile && version >= 310) ||\n        (profile != EEsProfile && version >= 150)) {\n        commonBuiltins.append(\n            \"highp uint packSnorm4x8(vec4);\"\n            \"highp uint packUnorm4x8(vec4);\"\n            \"\\n\");\n    }\n\n    if (profile == EEsProfile && version >= 310) {\n        commonBuiltins.append(\n            \"mediump vec4 unpackSnorm4x8(highp uint);\"\n            \"mediump vec4 unpackUnorm4x8(highp uint);\"\n            \"\\n\");\n    } else if (profile != EEsProfile && version >= 150) {\n        commonBuiltins.append(\n                    \"vec4 unpackSnorm4x8(highp uint);\"\n                    \"vec4 unpackUnorm4x8(highp uint);\"\n            \"\\n\");\n    }\n\n    //\n    // Matrix Functions.\n    //\n    commonBuiltins.append(\n        \"mat2 matrixCompMult(mat2 x, mat2 y);\"\n        \"mat3 matrixCompMult(mat3 x, mat3 y);\"\n        \"mat4 matrixCompMult(mat4 x, mat4 y);\"\n\n        \"\\n\");\n\n    // 120 is correct for both ES and desktop\n    if (version >= 120) {\n        commonBuiltins.append(\n            \"mat2   outerProduct(vec2 c, vec2 r);\"\n            \"mat3   outerProduct(vec3 c, vec3 r);\"\n            \"mat4   outerProduct(vec4 c, vec4 r);\"\n            \"mat2x3 outerProduct(vec3 c, vec2 r);\"\n            \"mat3x2 outerProduct(vec2 c, vec3 r);\"\n            \"mat2x4 outerProduct(vec4 c, vec2 r);\"\n            \"mat4x2 outerProduct(vec2 c, vec4 r);\"\n            \"mat3x4 outerProduct(vec4 c, vec3 r);\"\n            \"mat4x3 outerProduct(vec3 c, vec4 r);\"\n\n            \"mat2   transpose(mat2   m);\"\n            \"mat3   transpose(mat3   m);\"\n            \"mat4   transpose(mat4   m);\"\n            \"mat2x3 transpose(mat3x2 m);\"\n            \"mat3x2 transpose(mat2x3 m);\"\n            \"mat2x4 transpose(mat4x2 m);\"\n            \"mat4x2 transpose(mat2x4 m);\"\n            \"mat3x4 transpose(mat4x3 m);\"\n            \"mat4x3 transpose(mat3x4 m);\"\n\n            \"mat2x3 matrixCompMult(mat2x3, mat2x3);\"\n            \"mat2x4 matrixCompMult(mat2x4, mat2x4);\"\n            \"mat3x2 matrixCompMult(mat3x2, mat3x2);\"\n            \"mat3x4 matrixCompMult(mat3x4, mat3x4);\"\n            \"mat4x2 matrixCompMult(mat4x2, mat4x2);\"\n            \"mat4x3 matrixCompMult(mat4x3, mat4x3);\"\n\n            \"\\n\");\n\n        // 150 is correct for both ES and desktop\n        if (version >= 150) {\n            commonBuiltins.append(\n                \"float determinant(mat2 m);\"\n                \"float determinant(mat3 m);\"\n                \"float determinant(mat4 m);\"\n\n                \"mat2 inverse(mat2 m);\"\n                \"mat3 inverse(mat3 m);\"\n                \"mat4 inverse(mat4 m);\"\n\n                \"\\n\");\n        }\n    }\n\n    //\n    // Original-style texture functions existing in all stages.\n    // (Per-stage functions below.)\n    //\n    if ((profile == EEsProfile && version == 100) ||\n         profile == ECompatibilityProfile ||\n        (profile == ECoreProfile && version < 420) ||\n         profile == ENoProfile) {\n        if (spvVersion.spv == 0) {\n            commonBuiltins.append(\n                \"vec4 texture2D(sampler2D, vec2);\"\n\n                \"vec4 texture2DProj(sampler2D, vec3);\"\n                \"vec4 texture2DProj(sampler2D, vec4);\"\n\n                \"vec4 texture3D(sampler3D, vec3);\"     // OES_texture_3D, but caught by keyword check\n                \"vec4 texture3DProj(sampler3D, vec4);\" // OES_texture_3D, but caught by keyword check\n\n                \"vec4 textureCube(samplerCube, vec3);\"\n\n                \"\\n\");\n        }\n    }\n\n    if ( profile == ECompatibilityProfile ||\n        (profile == ECoreProfile && version < 420) ||\n         profile == ENoProfile) {\n        if (spvVersion.spv == 0) {\n            commonBuiltins.append(\n                \"vec4 texture1D(sampler1D, float);\"\n\n                \"vec4 texture1DProj(sampler1D, vec2);\"\n                \"vec4 texture1DProj(sampler1D, vec4);\"\n\n                \"vec4 shadow1D(sampler1DShadow, vec3);\"\n                \"vec4 shadow2D(sampler2DShadow, vec3);\"\n                \"vec4 shadow1DProj(sampler1DShadow, vec4);\"\n                \"vec4 shadow2DProj(sampler2DShadow, vec4);\"\n\n                \"vec4 texture2DRect(sampler2DRect, vec2);\"          // GL_ARB_texture_rectangle, caught by keyword check\n                \"vec4 texture2DRectProj(sampler2DRect, vec3);\"      // GL_ARB_texture_rectangle, caught by keyword check\n                \"vec4 texture2DRectProj(sampler2DRect, vec4);\"      // GL_ARB_texture_rectangle, caught by keyword check\n                \"vec4 shadow2DRect(sampler2DRectShadow, vec3);\"     // GL_ARB_texture_rectangle, caught by keyword check\n                \"vec4 shadow2DRectProj(sampler2DRectShadow, vec4);\" // GL_ARB_texture_rectangle, caught by keyword check\n\n                \"vec4 texture1DArray(sampler1DArray, vec2);\"      // GL_EXT_texture_array\n                \"vec4 texture2DArray(sampler2DArray, vec3);\"      // GL_EXT_texture_array\n                \"vec4 shadow1DArray(sampler1DArrayShadow, vec3);\" // GL_EXT_texture_array\n                \"vec4 shadow2DArray(sampler2DArrayShadow, vec4);\" // GL_EXT_texture_array\n                \"vec4 texture1DArray(sampler1DArray, vec2, float);\"                // GL_EXT_texture_array\n                \"vec4 texture2DArray(sampler2DArray, vec3, float);\"                // GL_EXT_texture_array\n                \"vec4 shadow1DArray(sampler1DArrayShadow, vec3, float);\"           // GL_EXT_texture_array\n                \"vec4 texture1DArrayLod(sampler1DArray, vec2, float);\"      // GL_EXT_texture_array\n                \"vec4 texture2DArrayLod(sampler2DArray, vec3, float);\"      // GL_EXT_texture_array\n                \"vec4 shadow1DArrayLod(sampler1DArrayShadow, vec3, float);\" // GL_EXT_texture_array\n                \"\\n\");\n        }\n    }\n\n    if (profile == EEsProfile) {\n        if (spvVersion.spv == 0) {\n            if (version < 300) {\n                commonBuiltins.append(\n                    \"vec4 texture2D(samplerExternalOES, vec2 coord);\" // GL_OES_EGL_image_external\n                    \"vec4 texture2DProj(samplerExternalOES, vec3);\"   // GL_OES_EGL_image_external\n                    \"vec4 texture2DProj(samplerExternalOES, vec4);\"   // GL_OES_EGL_image_external\n                \"\\n\");\n            } else {\n                commonBuiltins.append(\n                    \"highp ivec2 textureSize(samplerExternalOES, int lod);\"   // GL_OES_EGL_image_external_essl3\n                    \"vec4 texture(samplerExternalOES, vec2);\"                 // GL_OES_EGL_image_external_essl3\n                    \"vec4 texture(samplerExternalOES, vec2, float bias);\"     // GL_OES_EGL_image_external_essl3\n                    \"vec4 textureProj(samplerExternalOES, vec3);\"             // GL_OES_EGL_image_external_essl3\n                    \"vec4 textureProj(samplerExternalOES, vec3, float bias);\" // GL_OES_EGL_image_external_essl3\n                    \"vec4 textureProj(samplerExternalOES, vec4);\"             // GL_OES_EGL_image_external_essl3\n                    \"vec4 textureProj(samplerExternalOES, vec4, float bias);\" // GL_OES_EGL_image_external_essl3\n                    \"vec4 texelFetch(samplerExternalOES, ivec2, int lod);\"    // GL_OES_EGL_image_external_essl3\n                \"\\n\");\n            }\n            commonBuiltins.append(\n                \"highp ivec2 textureSize(__samplerExternal2DY2YEXT, int lod);\" // GL_EXT_YUV_target\n                \"vec4 texture(__samplerExternal2DY2YEXT, vec2);\"               // GL_EXT_YUV_target\n                \"vec4 texture(__samplerExternal2DY2YEXT, vec2, float bias);\"   // GL_EXT_YUV_target\n                \"vec4 textureProj(__samplerExternal2DY2YEXT, vec3);\"           // GL_EXT_YUV_target\n                \"vec4 textureProj(__samplerExternal2DY2YEXT, vec3, float bias);\" // GL_EXT_YUV_target\n                \"vec4 textureProj(__samplerExternal2DY2YEXT, vec4);\"           // GL_EXT_YUV_target\n                \"vec4 textureProj(__samplerExternal2DY2YEXT, vec4, float bias);\" // GL_EXT_YUV_target\n                \"vec4 texelFetch(__samplerExternal2DY2YEXT sampler, ivec2, int lod);\" // GL_EXT_YUV_target\n                \"\\n\");\n            commonBuiltins.append(\n                \"vec4 texture2DGradEXT(sampler2D, vec2, vec2, vec2);\"      // GL_EXT_shader_texture_lod\n                \"vec4 texture2DProjGradEXT(sampler2D, vec3, vec2, vec2);\"  // GL_EXT_shader_texture_lod\n                \"vec4 texture2DProjGradEXT(sampler2D, vec4, vec2, vec2);\"  // GL_EXT_shader_texture_lod\n                \"vec4 textureCubeGradEXT(samplerCube, vec3, vec3, vec3);\"  // GL_EXT_shader_texture_lod\n\n                \"float shadow2DEXT(sampler2DShadow, vec3);\"     // GL_EXT_shadow_samplers\n                \"float shadow2DProjEXT(sampler2DShadow, vec4);\" // GL_EXT_shadow_samplers\n\n                \"\\n\");\n        }\n    }\n\n    //\n    // Noise functions.\n    //\n    if (spvVersion.spv == 0 && profile != EEsProfile) {\n        commonBuiltins.append(\n            \"float noise1(float x);\"\n            \"float noise1(vec2  x);\"\n            \"float noise1(vec3  x);\"\n            \"float noise1(vec4  x);\"\n\n            \"vec2 noise2(float x);\"\n            \"vec2 noise2(vec2  x);\"\n            \"vec2 noise2(vec3  x);\"\n            \"vec2 noise2(vec4  x);\"\n\n            \"vec3 noise3(float x);\"\n            \"vec3 noise3(vec2  x);\"\n            \"vec3 noise3(vec3  x);\"\n            \"vec3 noise3(vec4  x);\"\n\n            \"vec4 noise4(float x);\"\n            \"vec4 noise4(vec2  x);\"\n            \"vec4 noise4(vec3  x);\"\n            \"vec4 noise4(vec4  x);\"\n\n            \"\\n\");\n    }\n\n    if (spvVersion.vulkan == 0) {\n        //\n        // Atomic counter functions.\n        //\n        if ((profile != EEsProfile && version >= 300) ||\n            (profile == EEsProfile && version >= 310)) {\n            commonBuiltins.append(\n                \"uint atomicCounterIncrement(atomic_uint);\"\n                \"uint atomicCounterDecrement(atomic_uint);\"\n                \"uint atomicCounter(atomic_uint);\"\n\n                \"\\n\");\n        }\n        if (profile != EEsProfile && version == 450) {\n            commonBuiltins.append(\n                \"uint atomicCounterAddARB(atomic_uint, uint);\"\n                \"uint atomicCounterSubtractARB(atomic_uint, uint);\"\n                \"uint atomicCounterMinARB(atomic_uint, uint);\"\n                \"uint atomicCounterMaxARB(atomic_uint, uint);\"\n                \"uint atomicCounterAndARB(atomic_uint, uint);\"\n                \"uint atomicCounterOrARB(atomic_uint, uint);\"\n                \"uint atomicCounterXorARB(atomic_uint, uint);\"\n                \"uint atomicCounterExchangeARB(atomic_uint, uint);\"\n                \"uint atomicCounterCompSwapARB(atomic_uint, uint, uint);\"\n\n                \"\\n\");\n        }\n\n\n        if (profile != EEsProfile && version >= 460) {\n            commonBuiltins.append(\n                \"uint atomicCounterAdd(atomic_uint, uint);\"\n                \"uint atomicCounterSubtract(atomic_uint, uint);\"\n                \"uint atomicCounterMin(atomic_uint, uint);\"\n                \"uint atomicCounterMax(atomic_uint, uint);\"\n                \"uint atomicCounterAnd(atomic_uint, uint);\"\n                \"uint atomicCounterOr(atomic_uint, uint);\"\n                \"uint atomicCounterXor(atomic_uint, uint);\"\n                \"uint atomicCounterExchange(atomic_uint, uint);\"\n                \"uint atomicCounterCompSwap(atomic_uint, uint, uint);\"\n\n                \"\\n\");\n        }\n    }\n    else if (spvVersion.vulkanRelaxed) {\n        //\n        // Atomic counter functions act as aliases to normal atomic functions.\n        // replace definitions to take 'volatile coherent nontemporal uint' instead of 'atomic_uint'\n        // and map to equivalent non-counter atomic op\n        //\n        if ((profile != EEsProfile && version >= 300) ||\n            (profile == EEsProfile && version >= 310)) {\n            commonBuiltins.append(\n                \"uint atomicCounterIncrement(volatile coherent nontemporal uint);\"\n                \"uint atomicCounterDecrement(volatile coherent nontemporal uint);\"\n                \"uint atomicCounter(volatile coherent nontemporal uint);\"\n\n                \"\\n\");\n        }\n        if (profile != EEsProfile && version >= 460) {\n            commonBuiltins.append(\n                \"uint atomicCounterAdd(volatile coherent nontemporal uint, uint);\"\n                \"uint atomicCounterSubtract(volatile coherent nontemporal uint, uint);\"\n                \"uint atomicCounterMin(volatile coherent nontemporal uint, uint);\"\n                \"uint atomicCounterMax(volatile coherent nontemporal uint, uint);\"\n                \"uint atomicCounterAnd(volatile coherent nontemporal uint, uint);\"\n                \"uint atomicCounterOr(volatile coherent nontemporal uint, uint);\"\n                \"uint atomicCounterXor(volatile coherent nontemporal uint, uint);\"\n                \"uint atomicCounterExchange(volatile coherent nontemporal uint, uint);\"\n                \"uint atomicCounterCompSwap(volatile coherent nontemporal uint, uint, uint);\"\n\n                \"\\n\");\n        }\n    }\n\n    // Bitfield\n    if ((profile == EEsProfile && version >= 310) ||\n        (profile != EEsProfile && version >= 150)) { // ARB_gpu_shader5/NV_gpu_shader5\n        commonBuiltins.append(\n            \"  int bitfieldExtract(  int, int, int);\"\n            \"ivec2 bitfieldExtract(ivec2, int, int);\"\n            \"ivec3 bitfieldExtract(ivec3, int, int);\"\n            \"ivec4 bitfieldExtract(ivec4, int, int);\"\n\n            \" uint bitfieldExtract( uint, int, int);\"\n            \"uvec2 bitfieldExtract(uvec2, int, int);\"\n            \"uvec3 bitfieldExtract(uvec3, int, int);\"\n            \"uvec4 bitfieldExtract(uvec4, int, int);\"\n\n            \"  int bitfieldInsert(  int base,   int, int, int);\"\n            \"ivec2 bitfieldInsert(ivec2 base, ivec2, int, int);\"\n            \"ivec3 bitfieldInsert(ivec3 base, ivec3, int, int);\"\n            \"ivec4 bitfieldInsert(ivec4 base, ivec4, int, int);\"\n\n            \" uint bitfieldInsert( uint base,  uint, int, int);\"\n            \"uvec2 bitfieldInsert(uvec2 base, uvec2, int, int);\"\n            \"uvec3 bitfieldInsert(uvec3 base, uvec3, int, int);\"\n            \"uvec4 bitfieldInsert(uvec4 base, uvec4, int, int);\"\n\n            \"\\n\");\n    }\n\n    if (profile != EEsProfile && version >= 150) { //GL_ARB_gpu_shader5/GL_NV_gpu_shader5\n        commonBuiltins.append(\n            \"  int findLSB(  int);\"\n            \"ivec2 findLSB(ivec2);\"\n            \"ivec3 findLSB(ivec3);\"\n            \"ivec4 findLSB(ivec4);\"\n\n            \"  int findLSB( uint);\"\n            \"ivec2 findLSB(uvec2);\"\n            \"ivec3 findLSB(uvec3);\"\n            \"ivec4 findLSB(uvec4);\"\n\n            \"\\n\");\n    } else if (profile == EEsProfile && version >= 310) {\n        commonBuiltins.append(\n            \"lowp   int findLSB(  int);\"\n            \"lowp ivec2 findLSB(ivec2);\"\n            \"lowp ivec3 findLSB(ivec3);\"\n            \"lowp ivec4 findLSB(ivec4);\"\n\n            \"lowp   int findLSB( uint);\"\n            \"lowp ivec2 findLSB(uvec2);\"\n            \"lowp ivec3 findLSB(uvec3);\"\n            \"lowp ivec4 findLSB(uvec4);\"\n\n            \"\\n\");\n    }\n\n    if (profile != EEsProfile && version >= 150) { //GL_ARB_gpu_shader5/GL_NV_gpu_shader5\n        commonBuiltins.append(\n            \"  int bitCount(  int);\"\n            \"ivec2 bitCount(ivec2);\"\n            \"ivec3 bitCount(ivec3);\"\n            \"ivec4 bitCount(ivec4);\"\n\n            \"  int bitCount( uint);\"\n            \"ivec2 bitCount(uvec2);\"\n            \"ivec3 bitCount(uvec3);\"\n            \"ivec4 bitCount(uvec4);\"\n\n            \"  int findMSB(highp   int);\"\n            \"ivec2 findMSB(highp ivec2);\"\n            \"ivec3 findMSB(highp ivec3);\"\n            \"ivec4 findMSB(highp ivec4);\"\n\n            \"  int findMSB(highp  uint);\"\n            \"ivec2 findMSB(highp uvec2);\"\n            \"ivec3 findMSB(highp uvec3);\"\n            \"ivec4 findMSB(highp uvec4);\"\n            \"\\n\");\n    }\n\n    if (profile != EEsProfile && version >= 150 && version < 450) { //GL_NV_gpu_shader5\n        commonBuiltins.append(\n            \"int64_t  packInt2x32(ivec2);\"\n            \"uint64_t packUint2x32(uvec2);\"\n            \"ivec2    unpackInt2x32(int64_t);\"\n            \"uvec2    unpackUint2x32(uint64_t);\"\n\n            \"uint     packFloat2x16(f16vec2);\"\n            \"f16vec2  unpackFloat2x16(uint);\"\n\n            \"int64_t doubleBitsToInt64(double);\"\n            \"i64vec2 doubleBitsToInt64(dvec2);\"\n            \"i64vec3 doubleBitsToInt64(dvec3);\"\n            \"i64vec4 doubleBitsToInt64(dvec4);\"\n\n            \"uint64_t doubleBitsToUint64(double);\"\n            \"u64vec2  doubleBitsToUint64(dvec2);\"\n            \"u64vec3  doubleBitsToUint64(dvec3);\"\n            \"u64vec4  doubleBitsToUint64(dvec4);\"\n\n            \"double int64BitsToDouble(int64_t);\"\n            \"dvec2  int64BitsToDouble(i64vec2);\"\n            \"dvec3  int64BitsToDouble(i64vec3);\"\n            \"dvec4  int64BitsToDouble(i64vec4);\"\n\n            \"double uint64BitsToDouble(uint64_t);\"\n            \"dvec2  uint64BitsToDouble(u64vec2);\"\n            \"dvec3  uint64BitsToDouble(u64vec3);\"\n            \"dvec4  uint64BitsToDouble(u64vec4);\"\n            // Modifications to Vector Relational Functions\n            // Introduction of explicitly sized types\n            \"bvec2 lessThan(i64vec2, i64vec2);\"\n            \"bvec3 lessThan(i64vec3, i64vec3);\"\n            \"bvec4 lessThan(i64vec4, i64vec4);\"\n            \"bvec2 lessThan(u64vec2, u64vec2);\"\n            \"bvec3 lessThan(u64vec3, u64vec3);\"\n            \"bvec4 lessThan(u64vec4, u64vec4);\"\n\n            \"bvec2 lessThanEqual(i64vec2, i64vec2);\"\n            \"bvec3 lessThanEqual(i64vec3, i64vec3);\"\n            \"bvec4 lessThanEqual(i64vec4, i64vec4);\"\n            \"bvec2 lessThanEqual(u64vec2, u64vec2);\"\n            \"bvec3 lessThanEqual(u64vec3, u64vec3);\"\n            \"bvec4 lessThanEqual(u64vec4, u64vec4);\"\n\n            \"bvec2 greaterThan(i64vec2, i64vec2);\"\n            \"bvec3 greaterThan(i64vec3, i64vec3);\"\n            \"bvec4 greaterThan(i64vec4, i64vec4);\"\n            \"bvec2 greaterThan(u64vec2, u64vec2);\"\n            \"bvec3 greaterThan(u64vec3, u64vec3);\"\n            \"bvec4 greaterThan(u64vec4, u64vec4);\"\n\n            \"bvec2 greaterThanEqual(i64vec2, i64vec2);\"\n            \"bvec3 greaterThanEqual(i64vec3, i64vec3);\"\n            \"bvec4 greaterThanEqual(i64vec4, i64vec4);\"\n            \"bvec2 greaterThanEqual(u64vec2, u64vec2);\"\n            \"bvec3 greaterThanEqual(u64vec3, u64vec3);\"\n            \"bvec4 greaterThanEqual(u64vec4, u64vec4);\"\n\n            \"bvec2 equal(i64vec2, i64vec2);\"\n            \"bvec3 equal(i64vec3, i64vec3);\"\n            \"bvec4 equal(i64vec4, i64vec4);\"\n            \"bvec2 equal(u64vec2, u64vec2);\"\n            \"bvec3 equal(u64vec3, u64vec3);\"\n            \"bvec4 equal(u64vec4, u64vec4);\"\n\n            \"bvec2 notEqual(i64vec2, i64vec2);\"\n            \"bvec3 notEqual(i64vec3, i64vec3);\"\n            \"bvec4 notEqual(i64vec4, i64vec4);\"\n            \"bvec2 notEqual(u64vec2, u64vec2);\"\n            \"bvec3 notEqual(u64vec3, u64vec3);\"\n            \"bvec4 notEqual(u64vec4, u64vec4);\"\n\n            \"bvec2 lessThan(f16vec2, f16vec2);\"\n            \"bvec3 lessThan(f16vec3, f16vec3);\"\n            \"bvec4 lessThan(f16vec4, f16vec4);\"\n\n            \"bvec2 lessThanEqual(f16vec2, f16vec2);\"\n            \"bvec3 lessThanEqual(f16vec3, f16vec3);\"\n            \"bvec4 lessThanEqual(f16vec4, f16vec4);\"\n\n            \"bvec2 greaterThan(f16vec2, f16vec2);\"\n            \"bvec3 greaterThan(f16vec3, f16vec3);\"\n            \"bvec4 greaterThan(f16vec4, f16vec4);\"\n\n            \"bvec2 greaterThanEqual(f16vec2, f16vec2);\"\n            \"bvec3 greaterThanEqual(f16vec3, f16vec3);\"\n            \"bvec4 greaterThanEqual(f16vec4, f16vec4);\"\n\n            \"bvec2 equal(f16vec2, f16vec2);\"\n            \"bvec3 equal(f16vec3, f16vec3);\"\n            \"bvec4 equal(f16vec4, f16vec4);\"\n\n            \"bvec2 notEqual(f16vec2, f16vec2);\"\n            \"bvec3 notEqual(f16vec3, f16vec3);\"\n            \"bvec4 notEqual(f16vec4, f16vec4);\"\n\n            // Dependency on GL_ARB_gpu_shader_fp64\n            \"bvec2 lessThan(dvec2, dvec2);\"\n            \"bvec3 lessThan(dvec3, dvec3);\"\n            \"bvec4 lessThan(dvec4, dvec4);\"\n\n            \"bvec2 lessThanEqual(dvec2, dvec2);\"\n            \"bvec3 lessThanEqual(dvec3, dvec3);\"\n            \"bvec4 lessThanEqual(dvec4, dvec4);\"\n\n            \"bvec2 greaterThan(dvec2, dvec2);\"\n            \"bvec3 greaterThan(dvec3, dvec3);\"\n            \"bvec4 greaterThan(dvec4, dvec4);\"\n\n            \"bvec2 greaterThanEqual(dvec2, dvec2);\"\n            \"bvec3 greaterThanEqual(dvec3, dvec3);\"\n            \"bvec4 greaterThanEqual(dvec4, dvec4);\"\n\n            \"bvec2 equal(dvec2, dvec2);\"\n            \"bvec3 equal(dvec3, dvec3);\"\n            \"bvec4 equal(dvec4, dvec4);\"\n\n            \"bvec2 notEqual(dvec2, dvec2);\"\n            \"bvec3 notEqual(dvec3, dvec3);\"\n            \"bvec4 notEqual(dvec4, dvec4);\"\n\n            \"\\n\");\n    }\n\n\n    if (profile != EEsProfile && version >= 150) {\n        commonBuiltins.append(\n            \"bool anyThreadNV(bool);\"\n            \"bool allThreadsNV(bool);\"\n            \"bool allThreadsEqualNV(bool);\"\n\n            \"\\n\");\n    }\n\n    if ((profile == EEsProfile && version >= 310) ||\n        (profile != EEsProfile && version >= 150)) { // NV_gpu_shader5\n        commonBuiltins.append(\n            \" uint uaddCarry(highp  uint, highp  uint, out lowp  uint carry);\"\n            \"uvec2 uaddCarry(highp uvec2, highp uvec2, out lowp uvec2 carry);\"\n            \"uvec3 uaddCarry(highp uvec3, highp uvec3, out lowp uvec3 carry);\"\n            \"uvec4 uaddCarry(highp uvec4, highp uvec4, out lowp uvec4 carry);\"\n\n            \" uint usubBorrow(highp  uint, highp  uint, out lowp  uint borrow);\"\n            \"uvec2 usubBorrow(highp uvec2, highp uvec2, out lowp uvec2 borrow);\"\n            \"uvec3 usubBorrow(highp uvec3, highp uvec3, out lowp uvec3 borrow);\"\n            \"uvec4 usubBorrow(highp uvec4, highp uvec4, out lowp uvec4 borrow);\"\n\n            \"void umulExtended(highp  uint, highp  uint, out highp  uint, out highp  uint lsb);\"\n            \"void umulExtended(highp uvec2, highp uvec2, out highp uvec2, out highp uvec2 lsb);\"\n            \"void umulExtended(highp uvec3, highp uvec3, out highp uvec3, out highp uvec3 lsb);\"\n            \"void umulExtended(highp uvec4, highp uvec4, out highp uvec4, out highp uvec4 lsb);\"\n\n            \"void imulExtended(highp   int, highp   int, out highp   int, out highp   int lsb);\"\n            \"void imulExtended(highp ivec2, highp ivec2, out highp ivec2, out highp ivec2 lsb);\"\n            \"void imulExtended(highp ivec3, highp ivec3, out highp ivec3, out highp ivec3 lsb);\"\n            \"void imulExtended(highp ivec4, highp ivec4, out highp ivec4, out highp ivec4 lsb);\"\n\n            \"  int bitfieldReverse(highp   int);\"\n            \"ivec2 bitfieldReverse(highp ivec2);\"\n            \"ivec3 bitfieldReverse(highp ivec3);\"\n            \"ivec4 bitfieldReverse(highp ivec4);\"\n\n            \" uint bitfieldReverse(highp  uint);\"\n            \"uvec2 bitfieldReverse(highp uvec2);\"\n            \"uvec3 bitfieldReverse(highp uvec3);\"\n            \"uvec4 bitfieldReverse(highp uvec4);\"\n\n            \"\\n\");\n    }\n\n    if (profile == EEsProfile && version >= 310) {\n        commonBuiltins.append(\n            \"lowp   int bitCount(  int);\"\n            \"lowp ivec2 bitCount(ivec2);\"\n            \"lowp ivec3 bitCount(ivec3);\"\n            \"lowp ivec4 bitCount(ivec4);\"\n\n            \"lowp   int bitCount( uint);\"\n            \"lowp ivec2 bitCount(uvec2);\"\n            \"lowp ivec3 bitCount(uvec3);\"\n            \"lowp ivec4 bitCount(uvec4);\"\n\n            \"lowp   int findMSB(highp   int);\"\n            \"lowp ivec2 findMSB(highp ivec2);\"\n            \"lowp ivec3 findMSB(highp ivec3);\"\n            \"lowp ivec4 findMSB(highp ivec4);\"\n\n            \"lowp   int findMSB(highp  uint);\"\n            \"lowp ivec2 findMSB(highp uvec2);\"\n            \"lowp ivec3 findMSB(highp uvec3);\"\n            \"lowp ivec4 findMSB(highp uvec4);\"\n\n            \"\\n\");\n    }\n\n    // GL_ARB_shader_ballot\n    if (profile != EEsProfile && version >= 450) {\n        commonBuiltins.append(\n            \"uint64_t ballotARB(bool);\"\n\n            \"float readInvocationARB(float, uint);\"\n            \"vec2  readInvocationARB(vec2,  uint);\"\n            \"vec3  readInvocationARB(vec3,  uint);\"\n            \"vec4  readInvocationARB(vec4,  uint);\"\n\n            \"int   readInvocationARB(int,   uint);\"\n            \"ivec2 readInvocationARB(ivec2, uint);\"\n            \"ivec3 readInvocationARB(ivec3, uint);\"\n            \"ivec4 readInvocationARB(ivec4, uint);\"\n\n            \"uint  readInvocationARB(uint,  uint);\"\n            \"uvec2 readInvocationARB(uvec2, uint);\"\n            \"uvec3 readInvocationARB(uvec3, uint);\"\n            \"uvec4 readInvocationARB(uvec4, uint);\"\n\n            \"float readFirstInvocationARB(float);\"\n            \"vec2  readFirstInvocationARB(vec2);\"\n            \"vec3  readFirstInvocationARB(vec3);\"\n            \"vec4  readFirstInvocationARB(vec4);\"\n\n            \"int   readFirstInvocationARB(int);\"\n            \"ivec2 readFirstInvocationARB(ivec2);\"\n            \"ivec3 readFirstInvocationARB(ivec3);\"\n            \"ivec4 readFirstInvocationARB(ivec4);\"\n\n            \"uint  readFirstInvocationARB(uint);\"\n            \"uvec2 readFirstInvocationARB(uvec2);\"\n            \"uvec3 readFirstInvocationARB(uvec3);\"\n            \"uvec4 readFirstInvocationARB(uvec4);\"\n\n            \"\\n\");\n    }\n\n    // GL_ARB_shader_group_vote\n    if (profile != EEsProfile && version >= 430) {\n        commonBuiltins.append(\n            \"bool anyInvocationARB(bool);\"\n            \"bool allInvocationsARB(bool);\"\n            \"bool allInvocationsEqualARB(bool);\"\n\n            \"\\n\");\n    }\n\n    // GL_EXT_integer_dot_product\n    if ((profile == EEsProfile && version >= 300) ||\n        (profile != EEsProfile && version >= 450)) {\n        commonBuiltins.append(\n\n            \"uint dotEXT(uvec2 a, uvec2 b);\"\n            \"int dotEXT(ivec2 a, ivec2 b);\"\n            \"int dotEXT(ivec2 a, uvec2 b);\"\n            \"int dotEXT(uvec2 a, ivec2 b);\"\n\n            \"uint dotEXT(uvec3 a, uvec3 b);\"\n            \"int dotEXT(ivec3 a, ivec3 b);\"\n            \"int dotEXT(ivec3 a, uvec3 b);\"\n            \"int dotEXT(uvec3 a, ivec3 b);\"\n\n            \"uint dotEXT(uvec4 a, uvec4 b);\"\n            \"int dotEXT(ivec4 a, ivec4 b);\"\n            \"int dotEXT(ivec4 a, uvec4 b);\"\n            \"int dotEXT(uvec4 a, ivec4 b);\"\n\n            \"uint dotPacked4x8EXT(uint a, uint b);\"\n            \"int dotPacked4x8EXT(int a, uint b);\"\n            \"int dotPacked4x8EXT(uint a, int b);\"\n            \"int dotPacked4x8EXT(int a, int b);\"\n\n            \"uint dotEXT(u8vec2 a, u8vec2 b);\"\n            \"int dotEXT(i8vec2 a, u8vec2 b);\"\n            \"int dotEXT(u8vec2 a, i8vec2 b);\"\n            \"int dotEXT(i8vec2 a, i8vec2 b);\"\n\n            \"uint dotEXT(u8vec3 a, u8vec3 b);\"\n            \"int dotEXT(i8vec3 a, u8vec3 b);\"\n            \"int dotEXT(u8vec3 a, i8vec3 b);\"\n            \"int dotEXT(i8vec3 a, i8vec3 b);\"\n\n            \"uint dotEXT(u8vec4 a, u8vec4 b);\"\n            \"int dotEXT(i8vec4 a, u8vec4 b);\"\n            \"int dotEXT(u8vec4 a, i8vec4 b);\"\n            \"int dotEXT(i8vec4 a, i8vec4 b);\"\n\n            \"uint dotEXT(u16vec2 a, u16vec2 b);\"\n            \"int dotEXT(i16vec2 a, u16vec2 b);\"\n            \"int dotEXT(u16vec2 a, i16vec2 b);\"\n            \"int dotEXT(i16vec2 a, i16vec2 b);\"\n\n            \"uint dotEXT(u16vec3 a, u16vec3 b);\"\n            \"int dotEXT(i16vec3 a, u16vec3 b);\"\n            \"int dotEXT(u16vec3 a, i16vec3 b);\"\n            \"int dotEXT(i16vec3 a, i16vec3 b);\"\n\n            \"uint dotEXT(u16vec4 a, u16vec4 b);\"\n            \"int dotEXT(i16vec4 a, u16vec4 b);\"\n            \"int dotEXT(u16vec4 a, i16vec4 b);\"\n            \"int dotEXT(i16vec4 a, i16vec4 b);\"\n\n            \"uint64_t dotEXT(u64vec2 a, u64vec2 b);\"\n            \"int64_t dotEXT(i64vec2 a, u64vec2 b);\"\n            \"int64_t dotEXT(u64vec2 a, i64vec2 b);\"\n            \"int64_t dotEXT(i64vec2 a, i64vec2 b);\"\n\n            \"uint64_t dotEXT(u64vec3 a, u64vec3 b);\"\n            \"int64_t dotEXT(i64vec3 a, u64vec3 b);\"\n            \"int64_t dotEXT(u64vec3 a, i64vec3 b);\"\n            \"int64_t dotEXT(i64vec3 a, i64vec3 b);\"\n\n            \"uint64_t dotEXT(u64vec4 a, u64vec4 b);\"\n            \"int64_t dotEXT(i64vec4 a, u64vec4 b);\"\n            \"int64_t dotEXT(u64vec4 a, i64vec4 b);\"\n            \"int64_t dotEXT(i64vec4 a, i64vec4 b);\"\n\n            \"uint dotAccSatEXT(uvec2 a, uvec2 b, uint c);\"\n            \"int dotAccSatEXT(ivec2 a, uvec2 b, int c);\"\n            \"int dotAccSatEXT(uvec2 a, ivec2 b, int c);\"\n            \"int dotAccSatEXT(ivec2 a, ivec2 b, int c);\"\n\n            \"uint dotAccSatEXT(uvec3 a, uvec3 b, uint c);\"\n            \"int dotAccSatEXT(ivec3 a, uvec3 b, int c);\"\n            \"int dotAccSatEXT(uvec3 a, ivec3 b, int c);\"\n            \"int dotAccSatEXT(ivec3 a, ivec3 b, int c);\"\n\n            \"uint dotAccSatEXT(uvec4 a, uvec4 b, uint c);\"\n            \"int dotAccSatEXT(ivec4 a, uvec4 b, int c);\"\n            \"int dotAccSatEXT(uvec4 a, ivec4 b, int c);\"\n            \"int dotAccSatEXT(ivec4 a, ivec4 b, int c);\"\n\n            \"uint dotPacked4x8AccSatEXT(uint a, uint b, uint c);\"\n            \"int dotPacked4x8AccSatEXT(int a, uint b, int c);\"\n            \"int dotPacked4x8AccSatEXT(uint a, int b, int c);\"\n            \"int dotPacked4x8AccSatEXT(int a, int b, int c);\"\n\n            \"uint dotAccSatEXT(u8vec2 a, u8vec2 b, uint c);\"\n            \"int dotAccSatEXT(i8vec2 a, u8vec2 b, int c);\"\n            \"int dotAccSatEXT(u8vec2 a, i8vec2 b, int c);\"\n            \"int dotAccSatEXT(i8vec2 a, i8vec2 b, int c);\"\n\n            \"uint dotAccSatEXT(u8vec3 a, u8vec3 b, uint c);\"\n            \"int dotAccSatEXT(i8vec3 a, u8vec3 b, int c);\"\n            \"int dotAccSatEXT(u8vec3 a, i8vec3 b, int c);\"\n            \"int dotAccSatEXT(i8vec3 a, i8vec3 b, int c);\"\n\n            \"uint dotAccSatEXT(u8vec4 a, u8vec4 b, uint c);\"\n            \"int dotAccSatEXT(i8vec4 a, u8vec4 b, int c);\"\n            \"int dotAccSatEXT(u8vec4 a, i8vec4 b, int c);\"\n            \"int dotAccSatEXT(i8vec4 a, i8vec4 b, int c);\"\n\n            \"uint dotAccSatEXT(u16vec2 a, u16vec2 b, uint c);\"\n            \"int dotAccSatEXT(i16vec2 a, u16vec2 b, int c);\"\n            \"int dotAccSatEXT(u16vec2 a, i16vec2 b, int c);\"\n            \"int dotAccSatEXT(i16vec2 a, i16vec2 b, int c);\"\n\n            \"uint dotAccSatEXT(u16vec3 a, u16vec3 b, uint c);\"\n            \"int dotAccSatEXT(i16vec3 a, u16vec3 b, int c);\"\n            \"int dotAccSatEXT(u16vec3 a, i16vec3 b, int c);\"\n            \"int dotAccSatEXT(i16vec3 a, i16vec3 b, int c);\"\n\n            \"uint dotAccSatEXT(u16vec4 a, u16vec4 b, uint c);\"\n            \"int dotAccSatEXT(i16vec4 a, u16vec4 b, int c);\"\n            \"int dotAccSatEXT(u16vec4 a, i16vec4 b, int c);\"\n            \"int dotAccSatEXT(i16vec4 a, i16vec4 b, int c);\"\n\n            \"uint64_t dotAccSatEXT(u64vec2 a, u64vec2 b, uint64_t c);\"\n            \"int64_t dotAccSatEXT(i64vec2 a, u64vec2 b, int64_t c);\"\n            \"int64_t dotAccSatEXT(u64vec2 a, i64vec2 b, int64_t c);\"\n            \"int64_t dotAccSatEXT(i64vec2 a, i64vec2 b, int64_t c);\"\n\n            \"uint64_t dotAccSatEXT(u64vec3 a, u64vec3 b, uint64_t c);\"\n            \"int64_t dotAccSatEXT(i64vec3 a, u64vec3 b, int64_t c);\"\n            \"int64_t dotAccSatEXT(u64vec3 a, i64vec3 b, int64_t c);\"\n            \"int64_t dotAccSatEXT(i64vec3 a, i64vec3 b, int64_t c);\"\n\n            \"uint64_t dotAccSatEXT(u64vec4 a, u64vec4 b, uint64_t c);\"\n            \"int64_t dotAccSatEXT(i64vec4 a, u64vec4 b, int64_t c);\"\n            \"int64_t dotAccSatEXT(u64vec4 a, i64vec4 b, int64_t c);\"\n            \"int64_t dotAccSatEXT(i64vec4 a, i64vec4 b, int64_t c);\"\n            \"\\n\");\n    }\n\n    // GL_KHR_shader_subgroup\n    if ((profile == EEsProfile && version >= 310) ||\n        (profile != EEsProfile && version >= 140)) {\n        commonBuiltins.append(\n            \"void subgroupBarrier();\"\n            \"void subgroupMemoryBarrier();\"\n            \"void subgroupMemoryBarrierBuffer();\"\n            \"void subgroupMemoryBarrierImage();\"\n            \"bool subgroupElect();\"\n\n            \"bool   subgroupAll(bool);\\n\"\n            \"bool   subgroupAny(bool);\\n\"\n            \"uvec4  subgroupBallot(bool);\\n\"\n            \"bool   subgroupInverseBallot(uvec4);\\n\"\n            \"bool   subgroupBallotBitExtract(uvec4, uint);\\n\"\n            \"uint   subgroupBallotBitCount(uvec4);\\n\"\n            \"uint   subgroupBallotInclusiveBitCount(uvec4);\\n\"\n            \"uint   subgroupBallotExclusiveBitCount(uvec4);\\n\"\n            \"uint   subgroupBallotFindLSB(uvec4);\\n\"\n            \"uint   subgroupBallotFindMSB(uvec4);\\n\"\n            );\n\n        // Generate all flavors of subgroup ops.\n        static const char *subgroupOps[] = \n        {\n            \"bool   subgroupAllEqual(%s);\\n\",\n            \"%s     subgroupBroadcast(%s, uint);\\n\",\n            \"%s     subgroupBroadcastFirst(%s);\\n\",\n            \"%s     subgroupShuffle(%s, uint);\\n\",\n            \"%s     subgroupShuffleXor(%s, uint);\\n\",\n            \"%s     subgroupShuffleUp(%s, uint delta);\\n\",\n            \"%s     subgroupShuffleDown(%s, uint delta);\\n\",\n            \"%s     subgroupRotate(%s, uint);\\n\",\n            \"%s     subgroupClusteredRotate(%s, uint, uint);\\n\",\n            \"%s     subgroupAdd(%s);\\n\",\n            \"%s     subgroupMul(%s);\\n\",\n            \"%s     subgroupMin(%s);\\n\",\n            \"%s     subgroupMax(%s);\\n\",\n            \"%s     subgroupAnd(%s);\\n\",\n            \"%s     subgroupOr(%s);\\n\",\n            \"%s     subgroupXor(%s);\\n\",\n            \"%s     subgroupInclusiveAdd(%s);\\n\",\n            \"%s     subgroupInclusiveMul(%s);\\n\",\n            \"%s     subgroupInclusiveMin(%s);\\n\",\n            \"%s     subgroupInclusiveMax(%s);\\n\",\n            \"%s     subgroupInclusiveAnd(%s);\\n\",\n            \"%s     subgroupInclusiveOr(%s);\\n\",\n            \"%s     subgroupInclusiveXor(%s);\\n\",\n            \"%s     subgroupExclusiveAdd(%s);\\n\",\n            \"%s     subgroupExclusiveMul(%s);\\n\",\n            \"%s     subgroupExclusiveMin(%s);\\n\",\n            \"%s     subgroupExclusiveMax(%s);\\n\",\n            \"%s     subgroupExclusiveAnd(%s);\\n\",\n            \"%s     subgroupExclusiveOr(%s);\\n\",\n            \"%s     subgroupExclusiveXor(%s);\\n\",\n            \"%s     subgroupClusteredAdd(%s, uint);\\n\",\n            \"%s     subgroupClusteredMul(%s, uint);\\n\",\n            \"%s     subgroupClusteredMin(%s, uint);\\n\",\n            \"%s     subgroupClusteredMax(%s, uint);\\n\",\n            \"%s     subgroupClusteredAnd(%s, uint);\\n\",\n            \"%s     subgroupClusteredOr(%s, uint);\\n\",\n            \"%s     subgroupClusteredXor(%s, uint);\\n\",\n            \"%s     subgroupQuadBroadcast(%s, uint);\\n\",\n            \"%s     subgroupQuadSwapHorizontal(%s);\\n\",\n            \"%s     subgroupQuadSwapVertical(%s);\\n\",\n            \"%s     subgroupQuadSwapDiagonal(%s);\\n\",\n            \"uvec4  subgroupPartitionNV(%s);\\n\",\n            \"%s     subgroupPartitionedAddNV(%s, uvec4 ballot);\\n\",\n            \"%s     subgroupPartitionedMulNV(%s, uvec4 ballot);\\n\",\n            \"%s     subgroupPartitionedMinNV(%s, uvec4 ballot);\\n\",\n            \"%s     subgroupPartitionedMaxNV(%s, uvec4 ballot);\\n\",\n            \"%s     subgroupPartitionedAndNV(%s, uvec4 ballot);\\n\",\n            \"%s     subgroupPartitionedOrNV(%s, uvec4 ballot);\\n\",\n            \"%s     subgroupPartitionedXorNV(%s, uvec4 ballot);\\n\",\n            \"%s     subgroupPartitionedInclusiveAddNV(%s, uvec4 ballot);\\n\",\n            \"%s     subgroupPartitionedInclusiveMulNV(%s, uvec4 ballot);\\n\",\n            \"%s     subgroupPartitionedInclusiveMinNV(%s, uvec4 ballot);\\n\",\n            \"%s     subgroupPartitionedInclusiveMaxNV(%s, uvec4 ballot);\\n\",\n            \"%s     subgroupPartitionedInclusiveAndNV(%s, uvec4 ballot);\\n\",\n            \"%s     subgroupPartitionedInclusiveOrNV(%s, uvec4 ballot);\\n\",\n            \"%s     subgroupPartitionedInclusiveXorNV(%s, uvec4 ballot);\\n\",\n            \"%s     subgroupPartitionedExclusiveAddNV(%s, uvec4 ballot);\\n\",\n            \"%s     subgroupPartitionedExclusiveMulNV(%s, uvec4 ballot);\\n\",\n            \"%s     subgroupPartitionedExclusiveMinNV(%s, uvec4 ballot);\\n\",\n            \"%s     subgroupPartitionedExclusiveMaxNV(%s, uvec4 ballot);\\n\",\n            \"%s     subgroupPartitionedExclusiveAndNV(%s, uvec4 ballot);\\n\",\n            \"%s     subgroupPartitionedExclusiveOrNV(%s, uvec4 ballot);\\n\",\n            \"%s     subgroupPartitionedExclusiveXorNV(%s, uvec4 ballot);\\n\",\n        };\n\n        static const char *floatTypes[] = { \n            \"float\", \"vec2\", \"vec3\", \"vec4\", \n            \"float16_t\", \"f16vec2\", \"f16vec3\", \"f16vec4\", \n        };\n        static const char *doubleTypes[] = { \n            \"double\", \"dvec2\", \"dvec3\", \"dvec4\", \n        };\n        static const char *intTypes[] = { \n            \"int8_t\", \"i8vec2\", \"i8vec3\", \"i8vec4\", \n            \"int16_t\", \"i16vec2\", \"i16vec3\", \"i16vec4\", \n            \"int\", \"ivec2\", \"ivec3\", \"ivec4\", \n            \"int64_t\", \"i64vec2\", \"i64vec3\", \"i64vec4\", \n            \"uint8_t\", \"u8vec2\", \"u8vec3\", \"u8vec4\", \n            \"uint16_t\", \"u16vec2\", \"u16vec3\", \"u16vec4\", \n            \"uint\", \"uvec2\", \"uvec3\", \"uvec4\", \n            \"uint64_t\", \"u64vec2\", \"u64vec3\", \"u64vec4\", \n        };\n        static const char *boolTypes[] = { \n            \"bool\", \"bvec2\", \"bvec3\", \"bvec4\", \n        };\n\n        for (size_t i = 0; i < sizeof(subgroupOps)/sizeof(subgroupOps[0]); ++i) {\n            const char *op = subgroupOps[i];\n\n            // Logical operations don't support float\n            bool logicalOp = strstr(op, \"Or\") || strstr(op, \"And\") ||\n                             (strstr(op, \"Xor\") && !strstr(op, \"ShuffleXor\"));\n            // Math operations don't support bool\n            bool mathOp = strstr(op, \"Add\") || strstr(op, \"Mul\") || strstr(op, \"Min\") || strstr(op, \"Max\");\n\n            const int bufSize = 256;\n            char buf[bufSize];\n\n            if (!logicalOp) {\n                for (size_t j = 0; j < sizeof(floatTypes)/sizeof(floatTypes[0]); ++j) {\n                    snprintf(buf, bufSize, op, floatTypes[j], floatTypes[j]);\n                    commonBuiltins.append(buf);\n                }\n                if (profile != EEsProfile && version >= 400) {\n                    for (size_t j = 0; j < sizeof(doubleTypes)/sizeof(doubleTypes[0]); ++j) {\n                        snprintf(buf, bufSize, op, doubleTypes[j], doubleTypes[j]);\n                        commonBuiltins.append(buf);\n                    }\n                }\n            }\n            if (!mathOp) {\n                for (size_t j = 0; j < sizeof(boolTypes)/sizeof(boolTypes[0]); ++j) {\n                    snprintf(buf, bufSize, op, boolTypes[j], boolTypes[j]);\n                    commonBuiltins.append(buf);\n                }\n            }\n            for (size_t j = 0; j < sizeof(intTypes)/sizeof(intTypes[0]); ++j) {\n                snprintf(buf, bufSize, op, intTypes[j], intTypes[j]);\n                commonBuiltins.append(buf);\n            }\n        }\n\n        stageBuiltins[EShLangCompute].append(\n            \"void subgroupMemoryBarrierShared();\"\n\n            \"\\n\"\n            );\n        stageBuiltins[EShLangMesh].append(\n            \"void subgroupMemoryBarrierShared();\"\n            \"\\n\"\n            );\n        stageBuiltins[EShLangTask].append(\n            \"void subgroupMemoryBarrierShared();\"\n            \"\\n\"\n            );\n    }\n\n    // GL_EXT_shader_quad_control\n    if ((profile == EEsProfile && version >= 310) ||\n        (profile != EEsProfile && version >= 140)) {\n        commonBuiltins.append(\n            \"bool subgroupQuadAll(bool);\\n\"\n            \"bool subgroupQuadAny(bool);\\n\"\n            );\n    }\n\n    if (profile != EEsProfile && version >= 460) {\n        commonBuiltins.append(\n            \"bool anyInvocation(bool);\"\n            \"bool allInvocations(bool);\"\n            \"bool allInvocationsEqual(bool);\"\n\n            \"\\n\");\n    }\n\n    // GL_AMD_shader_ballot\n    if (profile != EEsProfile && version >= 450) {\n        commonBuiltins.append(\n            \"float minInvocationsAMD(float);\"\n            \"vec2  minInvocationsAMD(vec2);\"\n            \"vec3  minInvocationsAMD(vec3);\"\n            \"vec4  minInvocationsAMD(vec4);\"\n\n            \"int   minInvocationsAMD(int);\"\n            \"ivec2 minInvocationsAMD(ivec2);\"\n            \"ivec3 minInvocationsAMD(ivec3);\"\n            \"ivec4 minInvocationsAMD(ivec4);\"\n\n            \"uint  minInvocationsAMD(uint);\"\n            \"uvec2 minInvocationsAMD(uvec2);\"\n            \"uvec3 minInvocationsAMD(uvec3);\"\n            \"uvec4 minInvocationsAMD(uvec4);\"\n\n            \"double minInvocationsAMD(double);\"\n            \"dvec2  minInvocationsAMD(dvec2);\"\n            \"dvec3  minInvocationsAMD(dvec3);\"\n            \"dvec4  minInvocationsAMD(dvec4);\"\n\n            \"int64_t minInvocationsAMD(int64_t);\"\n            \"i64vec2 minInvocationsAMD(i64vec2);\"\n            \"i64vec3 minInvocationsAMD(i64vec3);\"\n            \"i64vec4 minInvocationsAMD(i64vec4);\"\n\n            \"uint64_t minInvocationsAMD(uint64_t);\"\n            \"u64vec2  minInvocationsAMD(u64vec2);\"\n            \"u64vec3  minInvocationsAMD(u64vec3);\"\n            \"u64vec4  minInvocationsAMD(u64vec4);\"\n\n            \"float16_t minInvocationsAMD(float16_t);\"\n            \"f16vec2   minInvocationsAMD(f16vec2);\"\n            \"f16vec3   minInvocationsAMD(f16vec3);\"\n            \"f16vec4   minInvocationsAMD(f16vec4);\"\n\n            \"int16_t minInvocationsAMD(int16_t);\"\n            \"i16vec2 minInvocationsAMD(i16vec2);\"\n            \"i16vec3 minInvocationsAMD(i16vec3);\"\n            \"i16vec4 minInvocationsAMD(i16vec4);\"\n\n            \"uint16_t minInvocationsAMD(uint16_t);\"\n            \"u16vec2  minInvocationsAMD(u16vec2);\"\n            \"u16vec3  minInvocationsAMD(u16vec3);\"\n            \"u16vec4  minInvocationsAMD(u16vec4);\"\n\n            \"float minInvocationsInclusiveScanAMD(float);\"\n            \"vec2  minInvocationsInclusiveScanAMD(vec2);\"\n            \"vec3  minInvocationsInclusiveScanAMD(vec3);\"\n            \"vec4  minInvocationsInclusiveScanAMD(vec4);\"\n\n            \"int   minInvocationsInclusiveScanAMD(int);\"\n            \"ivec2 minInvocationsInclusiveScanAMD(ivec2);\"\n            \"ivec3 minInvocationsInclusiveScanAMD(ivec3);\"\n            \"ivec4 minInvocationsInclusiveScanAMD(ivec4);\"\n\n            \"uint  minInvocationsInclusiveScanAMD(uint);\"\n            \"uvec2 minInvocationsInclusiveScanAMD(uvec2);\"\n            \"uvec3 minInvocationsInclusiveScanAMD(uvec3);\"\n            \"uvec4 minInvocationsInclusiveScanAMD(uvec4);\"\n\n            \"double minInvocationsInclusiveScanAMD(double);\"\n            \"dvec2  minInvocationsInclusiveScanAMD(dvec2);\"\n            \"dvec3  minInvocationsInclusiveScanAMD(dvec3);\"\n            \"dvec4  minInvocationsInclusiveScanAMD(dvec4);\"\n\n            \"int64_t minInvocationsInclusiveScanAMD(int64_t);\"\n            \"i64vec2 minInvocationsInclusiveScanAMD(i64vec2);\"\n            \"i64vec3 minInvocationsInclusiveScanAMD(i64vec3);\"\n            \"i64vec4 minInvocationsInclusiveScanAMD(i64vec4);\"\n\n            \"uint64_t minInvocationsInclusiveScanAMD(uint64_t);\"\n            \"u64vec2  minInvocationsInclusiveScanAMD(u64vec2);\"\n            \"u64vec3  minInvocationsInclusiveScanAMD(u64vec3);\"\n            \"u64vec4  minInvocationsInclusiveScanAMD(u64vec4);\"\n\n            \"float16_t minInvocationsInclusiveScanAMD(float16_t);\"\n            \"f16vec2   minInvocationsInclusiveScanAMD(f16vec2);\"\n            \"f16vec3   minInvocationsInclusiveScanAMD(f16vec3);\"\n            \"f16vec4   minInvocationsInclusiveScanAMD(f16vec4);\"\n\n            \"int16_t minInvocationsInclusiveScanAMD(int16_t);\"\n            \"i16vec2 minInvocationsInclusiveScanAMD(i16vec2);\"\n            \"i16vec3 minInvocationsInclusiveScanAMD(i16vec3);\"\n            \"i16vec4 minInvocationsInclusiveScanAMD(i16vec4);\"\n\n            \"uint16_t minInvocationsInclusiveScanAMD(uint16_t);\"\n            \"u16vec2  minInvocationsInclusiveScanAMD(u16vec2);\"\n            \"u16vec3  minInvocationsInclusiveScanAMD(u16vec3);\"\n            \"u16vec4  minInvocationsInclusiveScanAMD(u16vec4);\"\n\n            \"float minInvocationsExclusiveScanAMD(float);\"\n            \"vec2  minInvocationsExclusiveScanAMD(vec2);\"\n            \"vec3  minInvocationsExclusiveScanAMD(vec3);\"\n            \"vec4  minInvocationsExclusiveScanAMD(vec4);\"\n\n            \"int   minInvocationsExclusiveScanAMD(int);\"\n            \"ivec2 minInvocationsExclusiveScanAMD(ivec2);\"\n            \"ivec3 minInvocationsExclusiveScanAMD(ivec3);\"\n            \"ivec4 minInvocationsExclusiveScanAMD(ivec4);\"\n\n            \"uint  minInvocationsExclusiveScanAMD(uint);\"\n            \"uvec2 minInvocationsExclusiveScanAMD(uvec2);\"\n            \"uvec3 minInvocationsExclusiveScanAMD(uvec3);\"\n            \"uvec4 minInvocationsExclusiveScanAMD(uvec4);\"\n\n            \"double minInvocationsExclusiveScanAMD(double);\"\n            \"dvec2  minInvocationsExclusiveScanAMD(dvec2);\"\n            \"dvec3  minInvocationsExclusiveScanAMD(dvec3);\"\n            \"dvec4  minInvocationsExclusiveScanAMD(dvec4);\"\n\n            \"int64_t minInvocationsExclusiveScanAMD(int64_t);\"\n            \"i64vec2 minInvocationsExclusiveScanAMD(i64vec2);\"\n            \"i64vec3 minInvocationsExclusiveScanAMD(i64vec3);\"\n            \"i64vec4 minInvocationsExclusiveScanAMD(i64vec4);\"\n\n            \"uint64_t minInvocationsExclusiveScanAMD(uint64_t);\"\n            \"u64vec2  minInvocationsExclusiveScanAMD(u64vec2);\"\n            \"u64vec3  minInvocationsExclusiveScanAMD(u64vec3);\"\n            \"u64vec4  minInvocationsExclusiveScanAMD(u64vec4);\"\n\n            \"float16_t minInvocationsExclusiveScanAMD(float16_t);\"\n            \"f16vec2   minInvocationsExclusiveScanAMD(f16vec2);\"\n            \"f16vec3   minInvocationsExclusiveScanAMD(f16vec3);\"\n            \"f16vec4   minInvocationsExclusiveScanAMD(f16vec4);\"\n\n            \"int16_t minInvocationsExclusiveScanAMD(int16_t);\"\n            \"i16vec2 minInvocationsExclusiveScanAMD(i16vec2);\"\n            \"i16vec3 minInvocationsExclusiveScanAMD(i16vec3);\"\n            \"i16vec4 minInvocationsExclusiveScanAMD(i16vec4);\"\n\n            \"uint16_t minInvocationsExclusiveScanAMD(uint16_t);\"\n            \"u16vec2  minInvocationsExclusiveScanAMD(u16vec2);\"\n            \"u16vec3  minInvocationsExclusiveScanAMD(u16vec3);\"\n            \"u16vec4  minInvocationsExclusiveScanAMD(u16vec4);\"\n\n            \"float maxInvocationsAMD(float);\"\n            \"vec2  maxInvocationsAMD(vec2);\"\n            \"vec3  maxInvocationsAMD(vec3);\"\n            \"vec4  maxInvocationsAMD(vec4);\"\n\n            \"int   maxInvocationsAMD(int);\"\n            \"ivec2 maxInvocationsAMD(ivec2);\"\n            \"ivec3 maxInvocationsAMD(ivec3);\"\n            \"ivec4 maxInvocationsAMD(ivec4);\"\n\n            \"uint  maxInvocationsAMD(uint);\"\n            \"uvec2 maxInvocationsAMD(uvec2);\"\n            \"uvec3 maxInvocationsAMD(uvec3);\"\n            \"uvec4 maxInvocationsAMD(uvec4);\"\n\n            \"double maxInvocationsAMD(double);\"\n            \"dvec2  maxInvocationsAMD(dvec2);\"\n            \"dvec3  maxInvocationsAMD(dvec3);\"\n            \"dvec4  maxInvocationsAMD(dvec4);\"\n\n            \"int64_t maxInvocationsAMD(int64_t);\"\n            \"i64vec2 maxInvocationsAMD(i64vec2);\"\n            \"i64vec3 maxInvocationsAMD(i64vec3);\"\n            \"i64vec4 maxInvocationsAMD(i64vec4);\"\n\n            \"uint64_t maxInvocationsAMD(uint64_t);\"\n            \"u64vec2  maxInvocationsAMD(u64vec2);\"\n            \"u64vec3  maxInvocationsAMD(u64vec3);\"\n            \"u64vec4  maxInvocationsAMD(u64vec4);\"\n\n            \"float16_t maxInvocationsAMD(float16_t);\"\n            \"f16vec2   maxInvocationsAMD(f16vec2);\"\n            \"f16vec3   maxInvocationsAMD(f16vec3);\"\n            \"f16vec4   maxInvocationsAMD(f16vec4);\"\n\n            \"int16_t maxInvocationsAMD(int16_t);\"\n            \"i16vec2 maxInvocationsAMD(i16vec2);\"\n            \"i16vec3 maxInvocationsAMD(i16vec3);\"\n            \"i16vec4 maxInvocationsAMD(i16vec4);\"\n\n            \"uint16_t maxInvocationsAMD(uint16_t);\"\n            \"u16vec2  maxInvocationsAMD(u16vec2);\"\n            \"u16vec3  maxInvocationsAMD(u16vec3);\"\n            \"u16vec4  maxInvocationsAMD(u16vec4);\"\n\n            \"float maxInvocationsInclusiveScanAMD(float);\"\n            \"vec2  maxInvocationsInclusiveScanAMD(vec2);\"\n            \"vec3  maxInvocationsInclusiveScanAMD(vec3);\"\n            \"vec4  maxInvocationsInclusiveScanAMD(vec4);\"\n\n            \"int   maxInvocationsInclusiveScanAMD(int);\"\n            \"ivec2 maxInvocationsInclusiveScanAMD(ivec2);\"\n            \"ivec3 maxInvocationsInclusiveScanAMD(ivec3);\"\n            \"ivec4 maxInvocationsInclusiveScanAMD(ivec4);\"\n\n            \"uint  maxInvocationsInclusiveScanAMD(uint);\"\n            \"uvec2 maxInvocationsInclusiveScanAMD(uvec2);\"\n            \"uvec3 maxInvocationsInclusiveScanAMD(uvec3);\"\n            \"uvec4 maxInvocationsInclusiveScanAMD(uvec4);\"\n\n            \"double maxInvocationsInclusiveScanAMD(double);\"\n            \"dvec2  maxInvocationsInclusiveScanAMD(dvec2);\"\n            \"dvec3  maxInvocationsInclusiveScanAMD(dvec3);\"\n            \"dvec4  maxInvocationsInclusiveScanAMD(dvec4);\"\n\n            \"int64_t maxInvocationsInclusiveScanAMD(int64_t);\"\n            \"i64vec2 maxInvocationsInclusiveScanAMD(i64vec2);\"\n            \"i64vec3 maxInvocationsInclusiveScanAMD(i64vec3);\"\n            \"i64vec4 maxInvocationsInclusiveScanAMD(i64vec4);\"\n\n            \"uint64_t maxInvocationsInclusiveScanAMD(uint64_t);\"\n            \"u64vec2  maxInvocationsInclusiveScanAMD(u64vec2);\"\n            \"u64vec3  maxInvocationsInclusiveScanAMD(u64vec3);\"\n            \"u64vec4  maxInvocationsInclusiveScanAMD(u64vec4);\"\n\n            \"float16_t maxInvocationsInclusiveScanAMD(float16_t);\"\n            \"f16vec2   maxInvocationsInclusiveScanAMD(f16vec2);\"\n            \"f16vec3   maxInvocationsInclusiveScanAMD(f16vec3);\"\n            \"f16vec4   maxInvocationsInclusiveScanAMD(f16vec4);\"\n\n            \"int16_t maxInvocationsInclusiveScanAMD(int16_t);\"\n            \"i16vec2 maxInvocationsInclusiveScanAMD(i16vec2);\"\n            \"i16vec3 maxInvocationsInclusiveScanAMD(i16vec3);\"\n            \"i16vec4 maxInvocationsInclusiveScanAMD(i16vec4);\"\n\n            \"uint16_t maxInvocationsInclusiveScanAMD(uint16_t);\"\n            \"u16vec2  maxInvocationsInclusiveScanAMD(u16vec2);\"\n            \"u16vec3  maxInvocationsInclusiveScanAMD(u16vec3);\"\n            \"u16vec4  maxInvocationsInclusiveScanAMD(u16vec4);\"\n\n            \"float maxInvocationsExclusiveScanAMD(float);\"\n            \"vec2  maxInvocationsExclusiveScanAMD(vec2);\"\n            \"vec3  maxInvocationsExclusiveScanAMD(vec3);\"\n            \"vec4  maxInvocationsExclusiveScanAMD(vec4);\"\n\n            \"int   maxInvocationsExclusiveScanAMD(int);\"\n            \"ivec2 maxInvocationsExclusiveScanAMD(ivec2);\"\n            \"ivec3 maxInvocationsExclusiveScanAMD(ivec3);\"\n            \"ivec4 maxInvocationsExclusiveScanAMD(ivec4);\"\n\n            \"uint  maxInvocationsExclusiveScanAMD(uint);\"\n            \"uvec2 maxInvocationsExclusiveScanAMD(uvec2);\"\n            \"uvec3 maxInvocationsExclusiveScanAMD(uvec3);\"\n            \"uvec4 maxInvocationsExclusiveScanAMD(uvec4);\"\n\n            \"double maxInvocationsExclusiveScanAMD(double);\"\n            \"dvec2  maxInvocationsExclusiveScanAMD(dvec2);\"\n            \"dvec3  maxInvocationsExclusiveScanAMD(dvec3);\"\n            \"dvec4  maxInvocationsExclusiveScanAMD(dvec4);\"\n\n            \"int64_t maxInvocationsExclusiveScanAMD(int64_t);\"\n            \"i64vec2 maxInvocationsExclusiveScanAMD(i64vec2);\"\n            \"i64vec3 maxInvocationsExclusiveScanAMD(i64vec3);\"\n            \"i64vec4 maxInvocationsExclusiveScanAMD(i64vec4);\"\n\n            \"uint64_t maxInvocationsExclusiveScanAMD(uint64_t);\"\n            \"u64vec2  maxInvocationsExclusiveScanAMD(u64vec2);\"\n            \"u64vec3  maxInvocationsExclusiveScanAMD(u64vec3);\"\n            \"u64vec4  maxInvocationsExclusiveScanAMD(u64vec4);\"\n\n            \"float16_t maxInvocationsExclusiveScanAMD(float16_t);\"\n            \"f16vec2   maxInvocationsExclusiveScanAMD(f16vec2);\"\n            \"f16vec3   maxInvocationsExclusiveScanAMD(f16vec3);\"\n            \"f16vec4   maxInvocationsExclusiveScanAMD(f16vec4);\"\n\n            \"int16_t maxInvocationsExclusiveScanAMD(int16_t);\"\n            \"i16vec2 maxInvocationsExclusiveScanAMD(i16vec2);\"\n            \"i16vec3 maxInvocationsExclusiveScanAMD(i16vec3);\"\n            \"i16vec4 maxInvocationsExclusiveScanAMD(i16vec4);\"\n\n            \"uint16_t maxInvocationsExclusiveScanAMD(uint16_t);\"\n            \"u16vec2  maxInvocationsExclusiveScanAMD(u16vec2);\"\n            \"u16vec3  maxInvocationsExclusiveScanAMD(u16vec3);\"\n            \"u16vec4  maxInvocationsExclusiveScanAMD(u16vec4);\"\n\n            \"float addInvocationsAMD(float);\"\n            \"vec2  addInvocationsAMD(vec2);\"\n            \"vec3  addInvocationsAMD(vec3);\"\n            \"vec4  addInvocationsAMD(vec4);\"\n\n            \"int   addInvocationsAMD(int);\"\n            \"ivec2 addInvocationsAMD(ivec2);\"\n            \"ivec3 addInvocationsAMD(ivec3);\"\n            \"ivec4 addInvocationsAMD(ivec4);\"\n\n            \"uint  addInvocationsAMD(uint);\"\n            \"uvec2 addInvocationsAMD(uvec2);\"\n            \"uvec3 addInvocationsAMD(uvec3);\"\n            \"uvec4 addInvocationsAMD(uvec4);\"\n\n            \"double  addInvocationsAMD(double);\"\n            \"dvec2   addInvocationsAMD(dvec2);\"\n            \"dvec3   addInvocationsAMD(dvec3);\"\n            \"dvec4   addInvocationsAMD(dvec4);\"\n\n            \"int64_t addInvocationsAMD(int64_t);\"\n            \"i64vec2 addInvocationsAMD(i64vec2);\"\n            \"i64vec3 addInvocationsAMD(i64vec3);\"\n            \"i64vec4 addInvocationsAMD(i64vec4);\"\n\n            \"uint64_t addInvocationsAMD(uint64_t);\"\n            \"u64vec2  addInvocationsAMD(u64vec2);\"\n            \"u64vec3  addInvocationsAMD(u64vec3);\"\n            \"u64vec4  addInvocationsAMD(u64vec4);\"\n\n            \"float16_t addInvocationsAMD(float16_t);\"\n            \"f16vec2   addInvocationsAMD(f16vec2);\"\n            \"f16vec3   addInvocationsAMD(f16vec3);\"\n            \"f16vec4   addInvocationsAMD(f16vec4);\"\n\n            \"int16_t addInvocationsAMD(int16_t);\"\n            \"i16vec2 addInvocationsAMD(i16vec2);\"\n            \"i16vec3 addInvocationsAMD(i16vec3);\"\n            \"i16vec4 addInvocationsAMD(i16vec4);\"\n\n            \"uint16_t addInvocationsAMD(uint16_t);\"\n            \"u16vec2  addInvocationsAMD(u16vec2);\"\n            \"u16vec3  addInvocationsAMD(u16vec3);\"\n            \"u16vec4  addInvocationsAMD(u16vec4);\"\n\n            \"float addInvocationsInclusiveScanAMD(float);\"\n            \"vec2  addInvocationsInclusiveScanAMD(vec2);\"\n            \"vec3  addInvocationsInclusiveScanAMD(vec3);\"\n            \"vec4  addInvocationsInclusiveScanAMD(vec4);\"\n\n            \"int   addInvocationsInclusiveScanAMD(int);\"\n            \"ivec2 addInvocationsInclusiveScanAMD(ivec2);\"\n            \"ivec3 addInvocationsInclusiveScanAMD(ivec3);\"\n            \"ivec4 addInvocationsInclusiveScanAMD(ivec4);\"\n\n            \"uint  addInvocationsInclusiveScanAMD(uint);\"\n            \"uvec2 addInvocationsInclusiveScanAMD(uvec2);\"\n            \"uvec3 addInvocationsInclusiveScanAMD(uvec3);\"\n            \"uvec4 addInvocationsInclusiveScanAMD(uvec4);\"\n\n            \"double  addInvocationsInclusiveScanAMD(double);\"\n            \"dvec2   addInvocationsInclusiveScanAMD(dvec2);\"\n            \"dvec3   addInvocationsInclusiveScanAMD(dvec3);\"\n            \"dvec4   addInvocationsInclusiveScanAMD(dvec4);\"\n\n            \"int64_t addInvocationsInclusiveScanAMD(int64_t);\"\n            \"i64vec2 addInvocationsInclusiveScanAMD(i64vec2);\"\n            \"i64vec3 addInvocationsInclusiveScanAMD(i64vec3);\"\n            \"i64vec4 addInvocationsInclusiveScanAMD(i64vec4);\"\n\n            \"uint64_t addInvocationsInclusiveScanAMD(uint64_t);\"\n            \"u64vec2  addInvocationsInclusiveScanAMD(u64vec2);\"\n            \"u64vec3  addInvocationsInclusiveScanAMD(u64vec3);\"\n            \"u64vec4  addInvocationsInclusiveScanAMD(u64vec4);\"\n\n            \"float16_t addInvocationsInclusiveScanAMD(float16_t);\"\n            \"f16vec2   addInvocationsInclusiveScanAMD(f16vec2);\"\n            \"f16vec3   addInvocationsInclusiveScanAMD(f16vec3);\"\n            \"f16vec4   addInvocationsInclusiveScanAMD(f16vec4);\"\n\n            \"int16_t addInvocationsInclusiveScanAMD(int16_t);\"\n            \"i16vec2 addInvocationsInclusiveScanAMD(i16vec2);\"\n            \"i16vec3 addInvocationsInclusiveScanAMD(i16vec3);\"\n            \"i16vec4 addInvocationsInclusiveScanAMD(i16vec4);\"\n\n            \"uint16_t addInvocationsInclusiveScanAMD(uint16_t);\"\n            \"u16vec2  addInvocationsInclusiveScanAMD(u16vec2);\"\n            \"u16vec3  addInvocationsInclusiveScanAMD(u16vec3);\"\n            \"u16vec4  addInvocationsInclusiveScanAMD(u16vec4);\"\n\n            \"float addInvocationsExclusiveScanAMD(float);\"\n            \"vec2  addInvocationsExclusiveScanAMD(vec2);\"\n            \"vec3  addInvocationsExclusiveScanAMD(vec3);\"\n            \"vec4  addInvocationsExclusiveScanAMD(vec4);\"\n\n            \"int   addInvocationsExclusiveScanAMD(int);\"\n            \"ivec2 addInvocationsExclusiveScanAMD(ivec2);\"\n            \"ivec3 addInvocationsExclusiveScanAMD(ivec3);\"\n            \"ivec4 addInvocationsExclusiveScanAMD(ivec4);\"\n\n            \"uint  addInvocationsExclusiveScanAMD(uint);\"\n            \"uvec2 addInvocationsExclusiveScanAMD(uvec2);\"\n            \"uvec3 addInvocationsExclusiveScanAMD(uvec3);\"\n            \"uvec4 addInvocationsExclusiveScanAMD(uvec4);\"\n\n            \"double  addInvocationsExclusiveScanAMD(double);\"\n            \"dvec2   addInvocationsExclusiveScanAMD(dvec2);\"\n            \"dvec3   addInvocationsExclusiveScanAMD(dvec3);\"\n            \"dvec4   addInvocationsExclusiveScanAMD(dvec4);\"\n\n            \"int64_t addInvocationsExclusiveScanAMD(int64_t);\"\n            \"i64vec2 addInvocationsExclusiveScanAMD(i64vec2);\"\n            \"i64vec3 addInvocationsExclusiveScanAMD(i64vec3);\"\n            \"i64vec4 addInvocationsExclusiveScanAMD(i64vec4);\"\n\n            \"uint64_t addInvocationsExclusiveScanAMD(uint64_t);\"\n            \"u64vec2  addInvocationsExclusiveScanAMD(u64vec2);\"\n            \"u64vec3  addInvocationsExclusiveScanAMD(u64vec3);\"\n            \"u64vec4  addInvocationsExclusiveScanAMD(u64vec4);\"\n\n            \"float16_t addInvocationsExclusiveScanAMD(float16_t);\"\n            \"f16vec2   addInvocationsExclusiveScanAMD(f16vec2);\"\n            \"f16vec3   addInvocationsExclusiveScanAMD(f16vec3);\"\n            \"f16vec4   addInvocationsExclusiveScanAMD(f16vec4);\"\n\n            \"int16_t addInvocationsExclusiveScanAMD(int16_t);\"\n            \"i16vec2 addInvocationsExclusiveScanAMD(i16vec2);\"\n            \"i16vec3 addInvocationsExclusiveScanAMD(i16vec3);\"\n            \"i16vec4 addInvocationsExclusiveScanAMD(i16vec4);\"\n\n            \"uint16_t addInvocationsExclusiveScanAMD(uint16_t);\"\n            \"u16vec2  addInvocationsExclusiveScanAMD(u16vec2);\"\n            \"u16vec3  addInvocationsExclusiveScanAMD(u16vec3);\"\n            \"u16vec4  addInvocationsExclusiveScanAMD(u16vec4);\"\n\n            \"float minInvocationsNonUniformAMD(float);\"\n            \"vec2  minInvocationsNonUniformAMD(vec2);\"\n            \"vec3  minInvocationsNonUniformAMD(vec3);\"\n            \"vec4  minInvocationsNonUniformAMD(vec4);\"\n\n            \"int   minInvocationsNonUniformAMD(int);\"\n            \"ivec2 minInvocationsNonUniformAMD(ivec2);\"\n            \"ivec3 minInvocationsNonUniformAMD(ivec3);\"\n            \"ivec4 minInvocationsNonUniformAMD(ivec4);\"\n\n            \"uint  minInvocationsNonUniformAMD(uint);\"\n            \"uvec2 minInvocationsNonUniformAMD(uvec2);\"\n            \"uvec3 minInvocationsNonUniformAMD(uvec3);\"\n            \"uvec4 minInvocationsNonUniformAMD(uvec4);\"\n\n            \"double minInvocationsNonUniformAMD(double);\"\n            \"dvec2  minInvocationsNonUniformAMD(dvec2);\"\n            \"dvec3  minInvocationsNonUniformAMD(dvec3);\"\n            \"dvec4  minInvocationsNonUniformAMD(dvec4);\"\n\n            \"int64_t minInvocationsNonUniformAMD(int64_t);\"\n            \"i64vec2 minInvocationsNonUniformAMD(i64vec2);\"\n            \"i64vec3 minInvocationsNonUniformAMD(i64vec3);\"\n            \"i64vec4 minInvocationsNonUniformAMD(i64vec4);\"\n\n            \"uint64_t minInvocationsNonUniformAMD(uint64_t);\"\n            \"u64vec2  minInvocationsNonUniformAMD(u64vec2);\"\n            \"u64vec3  minInvocationsNonUniformAMD(u64vec3);\"\n            \"u64vec4  minInvocationsNonUniformAMD(u64vec4);\"\n\n            \"float16_t minInvocationsNonUniformAMD(float16_t);\"\n            \"f16vec2   minInvocationsNonUniformAMD(f16vec2);\"\n            \"f16vec3   minInvocationsNonUniformAMD(f16vec3);\"\n            \"f16vec4   minInvocationsNonUniformAMD(f16vec4);\"\n\n            \"int16_t minInvocationsNonUniformAMD(int16_t);\"\n            \"i16vec2 minInvocationsNonUniformAMD(i16vec2);\"\n            \"i16vec3 minInvocationsNonUniformAMD(i16vec3);\"\n            \"i16vec4 minInvocationsNonUniformAMD(i16vec4);\"\n\n            \"uint16_t minInvocationsNonUniformAMD(uint16_t);\"\n            \"u16vec2  minInvocationsNonUniformAMD(u16vec2);\"\n            \"u16vec3  minInvocationsNonUniformAMD(u16vec3);\"\n            \"u16vec4  minInvocationsNonUniformAMD(u16vec4);\"\n\n            \"float minInvocationsInclusiveScanNonUniformAMD(float);\"\n            \"vec2  minInvocationsInclusiveScanNonUniformAMD(vec2);\"\n            \"vec3  minInvocationsInclusiveScanNonUniformAMD(vec3);\"\n            \"vec4  minInvocationsInclusiveScanNonUniformAMD(vec4);\"\n\n            \"int   minInvocationsInclusiveScanNonUniformAMD(int);\"\n            \"ivec2 minInvocationsInclusiveScanNonUniformAMD(ivec2);\"\n            \"ivec3 minInvocationsInclusiveScanNonUniformAMD(ivec3);\"\n            \"ivec4 minInvocationsInclusiveScanNonUniformAMD(ivec4);\"\n\n            \"uint  minInvocationsInclusiveScanNonUniformAMD(uint);\"\n            \"uvec2 minInvocationsInclusiveScanNonUniformAMD(uvec2);\"\n            \"uvec3 minInvocationsInclusiveScanNonUniformAMD(uvec3);\"\n            \"uvec4 minInvocationsInclusiveScanNonUniformAMD(uvec4);\"\n\n            \"double minInvocationsInclusiveScanNonUniformAMD(double);\"\n            \"dvec2  minInvocationsInclusiveScanNonUniformAMD(dvec2);\"\n            \"dvec3  minInvocationsInclusiveScanNonUniformAMD(dvec3);\"\n            \"dvec4  minInvocationsInclusiveScanNonUniformAMD(dvec4);\"\n\n            \"int64_t minInvocationsInclusiveScanNonUniformAMD(int64_t);\"\n            \"i64vec2 minInvocationsInclusiveScanNonUniformAMD(i64vec2);\"\n            \"i64vec3 minInvocationsInclusiveScanNonUniformAMD(i64vec3);\"\n            \"i64vec4 minInvocationsInclusiveScanNonUniformAMD(i64vec4);\"\n\n            \"uint64_t minInvocationsInclusiveScanNonUniformAMD(uint64_t);\"\n            \"u64vec2  minInvocationsInclusiveScanNonUniformAMD(u64vec2);\"\n            \"u64vec3  minInvocationsInclusiveScanNonUniformAMD(u64vec3);\"\n            \"u64vec4  minInvocationsInclusiveScanNonUniformAMD(u64vec4);\"\n\n            \"float16_t minInvocationsInclusiveScanNonUniformAMD(float16_t);\"\n            \"f16vec2   minInvocationsInclusiveScanNonUniformAMD(f16vec2);\"\n            \"f16vec3   minInvocationsInclusiveScanNonUniformAMD(f16vec3);\"\n            \"f16vec4   minInvocationsInclusiveScanNonUniformAMD(f16vec4);\"\n\n            \"int16_t minInvocationsInclusiveScanNonUniformAMD(int16_t);\"\n            \"i16vec2 minInvocationsInclusiveScanNonUniformAMD(i16vec2);\"\n            \"i16vec3 minInvocationsInclusiveScanNonUniformAMD(i16vec3);\"\n            \"i16vec4 minInvocationsInclusiveScanNonUniformAMD(i16vec4);\"\n\n            \"uint16_t minInvocationsInclusiveScanNonUniformAMD(uint16_t);\"\n            \"u16vec2  minInvocationsInclusiveScanNonUniformAMD(u16vec2);\"\n            \"u16vec3  minInvocationsInclusiveScanNonUniformAMD(u16vec3);\"\n            \"u16vec4  minInvocationsInclusiveScanNonUniformAMD(u16vec4);\"\n\n            \"float minInvocationsExclusiveScanNonUniformAMD(float);\"\n            \"vec2  minInvocationsExclusiveScanNonUniformAMD(vec2);\"\n            \"vec3  minInvocationsExclusiveScanNonUniformAMD(vec3);\"\n            \"vec4  minInvocationsExclusiveScanNonUniformAMD(vec4);\"\n\n            \"int   minInvocationsExclusiveScanNonUniformAMD(int);\"\n            \"ivec2 minInvocationsExclusiveScanNonUniformAMD(ivec2);\"\n            \"ivec3 minInvocationsExclusiveScanNonUniformAMD(ivec3);\"\n            \"ivec4 minInvocationsExclusiveScanNonUniformAMD(ivec4);\"\n\n            \"uint  minInvocationsExclusiveScanNonUniformAMD(uint);\"\n            \"uvec2 minInvocationsExclusiveScanNonUniformAMD(uvec2);\"\n            \"uvec3 minInvocationsExclusiveScanNonUniformAMD(uvec3);\"\n            \"uvec4 minInvocationsExclusiveScanNonUniformAMD(uvec4);\"\n\n            \"double minInvocationsExclusiveScanNonUniformAMD(double);\"\n            \"dvec2  minInvocationsExclusiveScanNonUniformAMD(dvec2);\"\n            \"dvec3  minInvocationsExclusiveScanNonUniformAMD(dvec3);\"\n            \"dvec4  minInvocationsExclusiveScanNonUniformAMD(dvec4);\"\n\n            \"int64_t minInvocationsExclusiveScanNonUniformAMD(int64_t);\"\n            \"i64vec2 minInvocationsExclusiveScanNonUniformAMD(i64vec2);\"\n            \"i64vec3 minInvocationsExclusiveScanNonUniformAMD(i64vec3);\"\n            \"i64vec4 minInvocationsExclusiveScanNonUniformAMD(i64vec4);\"\n\n            \"uint64_t minInvocationsExclusiveScanNonUniformAMD(uint64_t);\"\n            \"u64vec2  minInvocationsExclusiveScanNonUniformAMD(u64vec2);\"\n            \"u64vec3  minInvocationsExclusiveScanNonUniformAMD(u64vec3);\"\n            \"u64vec4  minInvocationsExclusiveScanNonUniformAMD(u64vec4);\"\n\n            \"float16_t minInvocationsExclusiveScanNonUniformAMD(float16_t);\"\n            \"f16vec2   minInvocationsExclusiveScanNonUniformAMD(f16vec2);\"\n            \"f16vec3   minInvocationsExclusiveScanNonUniformAMD(f16vec3);\"\n            \"f16vec4   minInvocationsExclusiveScanNonUniformAMD(f16vec4);\"\n\n            \"int16_t minInvocationsExclusiveScanNonUniformAMD(int16_t);\"\n            \"i16vec2 minInvocationsExclusiveScanNonUniformAMD(i16vec2);\"\n            \"i16vec3 minInvocationsExclusiveScanNonUniformAMD(i16vec3);\"\n            \"i16vec4 minInvocationsExclusiveScanNonUniformAMD(i16vec4);\"\n\n            \"uint16_t minInvocationsExclusiveScanNonUniformAMD(uint16_t);\"\n            \"u16vec2  minInvocationsExclusiveScanNonUniformAMD(u16vec2);\"\n            \"u16vec3  minInvocationsExclusiveScanNonUniformAMD(u16vec3);\"\n            \"u16vec4  minInvocationsExclusiveScanNonUniformAMD(u16vec4);\"\n\n            \"float maxInvocationsNonUniformAMD(float);\"\n            \"vec2  maxInvocationsNonUniformAMD(vec2);\"\n            \"vec3  maxInvocationsNonUniformAMD(vec3);\"\n            \"vec4  maxInvocationsNonUniformAMD(vec4);\"\n\n            \"int   maxInvocationsNonUniformAMD(int);\"\n            \"ivec2 maxInvocationsNonUniformAMD(ivec2);\"\n            \"ivec3 maxInvocationsNonUniformAMD(ivec3);\"\n            \"ivec4 maxInvocationsNonUniformAMD(ivec4);\"\n\n            \"uint  maxInvocationsNonUniformAMD(uint);\"\n            \"uvec2 maxInvocationsNonUniformAMD(uvec2);\"\n            \"uvec3 maxInvocationsNonUniformAMD(uvec3);\"\n            \"uvec4 maxInvocationsNonUniformAMD(uvec4);\"\n\n            \"double maxInvocationsNonUniformAMD(double);\"\n            \"dvec2  maxInvocationsNonUniformAMD(dvec2);\"\n            \"dvec3  maxInvocationsNonUniformAMD(dvec3);\"\n            \"dvec4  maxInvocationsNonUniformAMD(dvec4);\"\n\n            \"int64_t maxInvocationsNonUniformAMD(int64_t);\"\n            \"i64vec2 maxInvocationsNonUniformAMD(i64vec2);\"\n            \"i64vec3 maxInvocationsNonUniformAMD(i64vec3);\"\n            \"i64vec4 maxInvocationsNonUniformAMD(i64vec4);\"\n\n            \"uint64_t maxInvocationsNonUniformAMD(uint64_t);\"\n            \"u64vec2  maxInvocationsNonUniformAMD(u64vec2);\"\n            \"u64vec3  maxInvocationsNonUniformAMD(u64vec3);\"\n            \"u64vec4  maxInvocationsNonUniformAMD(u64vec4);\"\n\n            \"float16_t maxInvocationsNonUniformAMD(float16_t);\"\n            \"f16vec2   maxInvocationsNonUniformAMD(f16vec2);\"\n            \"f16vec3   maxInvocationsNonUniformAMD(f16vec3);\"\n            \"f16vec4   maxInvocationsNonUniformAMD(f16vec4);\"\n\n            \"int16_t maxInvocationsNonUniformAMD(int16_t);\"\n            \"i16vec2 maxInvocationsNonUniformAMD(i16vec2);\"\n            \"i16vec3 maxInvocationsNonUniformAMD(i16vec3);\"\n            \"i16vec4 maxInvocationsNonUniformAMD(i16vec4);\"\n\n            \"uint16_t maxInvocationsNonUniformAMD(uint16_t);\"\n            \"u16vec2  maxInvocationsNonUniformAMD(u16vec2);\"\n            \"u16vec3  maxInvocationsNonUniformAMD(u16vec3);\"\n            \"u16vec4  maxInvocationsNonUniformAMD(u16vec4);\"\n\n            \"float maxInvocationsInclusiveScanNonUniformAMD(float);\"\n            \"vec2  maxInvocationsInclusiveScanNonUniformAMD(vec2);\"\n            \"vec3  maxInvocationsInclusiveScanNonUniformAMD(vec3);\"\n            \"vec4  maxInvocationsInclusiveScanNonUniformAMD(vec4);\"\n\n            \"int   maxInvocationsInclusiveScanNonUniformAMD(int);\"\n            \"ivec2 maxInvocationsInclusiveScanNonUniformAMD(ivec2);\"\n            \"ivec3 maxInvocationsInclusiveScanNonUniformAMD(ivec3);\"\n            \"ivec4 maxInvocationsInclusiveScanNonUniformAMD(ivec4);\"\n\n            \"uint  maxInvocationsInclusiveScanNonUniformAMD(uint);\"\n            \"uvec2 maxInvocationsInclusiveScanNonUniformAMD(uvec2);\"\n            \"uvec3 maxInvocationsInclusiveScanNonUniformAMD(uvec3);\"\n            \"uvec4 maxInvocationsInclusiveScanNonUniformAMD(uvec4);\"\n\n            \"double maxInvocationsInclusiveScanNonUniformAMD(double);\"\n            \"dvec2  maxInvocationsInclusiveScanNonUniformAMD(dvec2);\"\n            \"dvec3  maxInvocationsInclusiveScanNonUniformAMD(dvec3);\"\n            \"dvec4  maxInvocationsInclusiveScanNonUniformAMD(dvec4);\"\n\n            \"int64_t maxInvocationsInclusiveScanNonUniformAMD(int64_t);\"\n            \"i64vec2 maxInvocationsInclusiveScanNonUniformAMD(i64vec2);\"\n            \"i64vec3 maxInvocationsInclusiveScanNonUniformAMD(i64vec3);\"\n            \"i64vec4 maxInvocationsInclusiveScanNonUniformAMD(i64vec4);\"\n\n            \"uint64_t maxInvocationsInclusiveScanNonUniformAMD(uint64_t);\"\n            \"u64vec2  maxInvocationsInclusiveScanNonUniformAMD(u64vec2);\"\n            \"u64vec3  maxInvocationsInclusiveScanNonUniformAMD(u64vec3);\"\n            \"u64vec4  maxInvocationsInclusiveScanNonUniformAMD(u64vec4);\"\n\n            \"float16_t maxInvocationsInclusiveScanNonUniformAMD(float16_t);\"\n            \"f16vec2   maxInvocationsInclusiveScanNonUniformAMD(f16vec2);\"\n            \"f16vec3   maxInvocationsInclusiveScanNonUniformAMD(f16vec3);\"\n            \"f16vec4   maxInvocationsInclusiveScanNonUniformAMD(f16vec4);\"\n\n            \"int16_t maxInvocationsInclusiveScanNonUniformAMD(int16_t);\"\n            \"i16vec2 maxInvocationsInclusiveScanNonUniformAMD(i16vec2);\"\n            \"i16vec3 maxInvocationsInclusiveScanNonUniformAMD(i16vec3);\"\n            \"i16vec4 maxInvocationsInclusiveScanNonUniformAMD(i16vec4);\"\n\n            \"uint16_t maxInvocationsInclusiveScanNonUniformAMD(uint16_t);\"\n            \"u16vec2  maxInvocationsInclusiveScanNonUniformAMD(u16vec2);\"\n            \"u16vec3  maxInvocationsInclusiveScanNonUniformAMD(u16vec3);\"\n            \"u16vec4  maxInvocationsInclusiveScanNonUniformAMD(u16vec4);\"\n\n            \"float maxInvocationsExclusiveScanNonUniformAMD(float);\"\n            \"vec2  maxInvocationsExclusiveScanNonUniformAMD(vec2);\"\n            \"vec3  maxInvocationsExclusiveScanNonUniformAMD(vec3);\"\n            \"vec4  maxInvocationsExclusiveScanNonUniformAMD(vec4);\"\n\n            \"int   maxInvocationsExclusiveScanNonUniformAMD(int);\"\n            \"ivec2 maxInvocationsExclusiveScanNonUniformAMD(ivec2);\"\n            \"ivec3 maxInvocationsExclusiveScanNonUniformAMD(ivec3);\"\n            \"ivec4 maxInvocationsExclusiveScanNonUniformAMD(ivec4);\"\n\n            \"uint  maxInvocationsExclusiveScanNonUniformAMD(uint);\"\n            \"uvec2 maxInvocationsExclusiveScanNonUniformAMD(uvec2);\"\n            \"uvec3 maxInvocationsExclusiveScanNonUniformAMD(uvec3);\"\n            \"uvec4 maxInvocationsExclusiveScanNonUniformAMD(uvec4);\"\n\n            \"double maxInvocationsExclusiveScanNonUniformAMD(double);\"\n            \"dvec2  maxInvocationsExclusiveScanNonUniformAMD(dvec2);\"\n            \"dvec3  maxInvocationsExclusiveScanNonUniformAMD(dvec3);\"\n            \"dvec4  maxInvocationsExclusiveScanNonUniformAMD(dvec4);\"\n\n            \"int64_t maxInvocationsExclusiveScanNonUniformAMD(int64_t);\"\n            \"i64vec2 maxInvocationsExclusiveScanNonUniformAMD(i64vec2);\"\n            \"i64vec3 maxInvocationsExclusiveScanNonUniformAMD(i64vec3);\"\n            \"i64vec4 maxInvocationsExclusiveScanNonUniformAMD(i64vec4);\"\n\n            \"uint64_t maxInvocationsExclusiveScanNonUniformAMD(uint64_t);\"\n            \"u64vec2  maxInvocationsExclusiveScanNonUniformAMD(u64vec2);\"\n            \"u64vec3  maxInvocationsExclusiveScanNonUniformAMD(u64vec3);\"\n            \"u64vec4  maxInvocationsExclusiveScanNonUniformAMD(u64vec4);\"\n\n            \"float16_t maxInvocationsExclusiveScanNonUniformAMD(float16_t);\"\n            \"f16vec2   maxInvocationsExclusiveScanNonUniformAMD(f16vec2);\"\n            \"f16vec3   maxInvocationsExclusiveScanNonUniformAMD(f16vec3);\"\n            \"f16vec4   maxInvocationsExclusiveScanNonUniformAMD(f16vec4);\"\n\n            \"int16_t maxInvocationsExclusiveScanNonUniformAMD(int16_t);\"\n            \"i16vec2 maxInvocationsExclusiveScanNonUniformAMD(i16vec2);\"\n            \"i16vec3 maxInvocationsExclusiveScanNonUniformAMD(i16vec3);\"\n            \"i16vec4 maxInvocationsExclusiveScanNonUniformAMD(i16vec4);\"\n\n            \"uint16_t maxInvocationsExclusiveScanNonUniformAMD(uint16_t);\"\n            \"u16vec2  maxInvocationsExclusiveScanNonUniformAMD(u16vec2);\"\n            \"u16vec3  maxInvocationsExclusiveScanNonUniformAMD(u16vec3);\"\n            \"u16vec4  maxInvocationsExclusiveScanNonUniformAMD(u16vec4);\"\n\n            \"float addInvocationsNonUniformAMD(float);\"\n            \"vec2  addInvocationsNonUniformAMD(vec2);\"\n            \"vec3  addInvocationsNonUniformAMD(vec3);\"\n            \"vec4  addInvocationsNonUniformAMD(vec4);\"\n\n            \"int   addInvocationsNonUniformAMD(int);\"\n            \"ivec2 addInvocationsNonUniformAMD(ivec2);\"\n            \"ivec3 addInvocationsNonUniformAMD(ivec3);\"\n            \"ivec4 addInvocationsNonUniformAMD(ivec4);\"\n\n            \"uint  addInvocationsNonUniformAMD(uint);\"\n            \"uvec2 addInvocationsNonUniformAMD(uvec2);\"\n            \"uvec3 addInvocationsNonUniformAMD(uvec3);\"\n            \"uvec4 addInvocationsNonUniformAMD(uvec4);\"\n\n            \"double addInvocationsNonUniformAMD(double);\"\n            \"dvec2  addInvocationsNonUniformAMD(dvec2);\"\n            \"dvec3  addInvocationsNonUniformAMD(dvec3);\"\n            \"dvec4  addInvocationsNonUniformAMD(dvec4);\"\n\n            \"int64_t addInvocationsNonUniformAMD(int64_t);\"\n            \"i64vec2 addInvocationsNonUniformAMD(i64vec2);\"\n            \"i64vec3 addInvocationsNonUniformAMD(i64vec3);\"\n            \"i64vec4 addInvocationsNonUniformAMD(i64vec4);\"\n\n            \"uint64_t addInvocationsNonUniformAMD(uint64_t);\"\n            \"u64vec2  addInvocationsNonUniformAMD(u64vec2);\"\n            \"u64vec3  addInvocationsNonUniformAMD(u64vec3);\"\n            \"u64vec4  addInvocationsNonUniformAMD(u64vec4);\"\n\n            \"float16_t addInvocationsNonUniformAMD(float16_t);\"\n            \"f16vec2   addInvocationsNonUniformAMD(f16vec2);\"\n            \"f16vec3   addInvocationsNonUniformAMD(f16vec3);\"\n            \"f16vec4   addInvocationsNonUniformAMD(f16vec4);\"\n\n            \"int16_t addInvocationsNonUniformAMD(int16_t);\"\n            \"i16vec2 addInvocationsNonUniformAMD(i16vec2);\"\n            \"i16vec3 addInvocationsNonUniformAMD(i16vec3);\"\n            \"i16vec4 addInvocationsNonUniformAMD(i16vec4);\"\n\n            \"uint16_t addInvocationsNonUniformAMD(uint16_t);\"\n            \"u16vec2  addInvocationsNonUniformAMD(u16vec2);\"\n            \"u16vec3  addInvocationsNonUniformAMD(u16vec3);\"\n            \"u16vec4  addInvocationsNonUniformAMD(u16vec4);\"\n\n            \"float addInvocationsInclusiveScanNonUniformAMD(float);\"\n            \"vec2  addInvocationsInclusiveScanNonUniformAMD(vec2);\"\n            \"vec3  addInvocationsInclusiveScanNonUniformAMD(vec3);\"\n            \"vec4  addInvocationsInclusiveScanNonUniformAMD(vec4);\"\n\n            \"int   addInvocationsInclusiveScanNonUniformAMD(int);\"\n            \"ivec2 addInvocationsInclusiveScanNonUniformAMD(ivec2);\"\n            \"ivec3 addInvocationsInclusiveScanNonUniformAMD(ivec3);\"\n            \"ivec4 addInvocationsInclusiveScanNonUniformAMD(ivec4);\"\n\n            \"uint  addInvocationsInclusiveScanNonUniformAMD(uint);\"\n            \"uvec2 addInvocationsInclusiveScanNonUniformAMD(uvec2);\"\n            \"uvec3 addInvocationsInclusiveScanNonUniformAMD(uvec3);\"\n            \"uvec4 addInvocationsInclusiveScanNonUniformAMD(uvec4);\"\n\n            \"double addInvocationsInclusiveScanNonUniformAMD(double);\"\n            \"dvec2  addInvocationsInclusiveScanNonUniformAMD(dvec2);\"\n            \"dvec3  addInvocationsInclusiveScanNonUniformAMD(dvec3);\"\n            \"dvec4  addInvocationsInclusiveScanNonUniformAMD(dvec4);\"\n\n            \"int64_t addInvocationsInclusiveScanNonUniformAMD(int64_t);\"\n            \"i64vec2 addInvocationsInclusiveScanNonUniformAMD(i64vec2);\"\n            \"i64vec3 addInvocationsInclusiveScanNonUniformAMD(i64vec3);\"\n            \"i64vec4 addInvocationsInclusiveScanNonUniformAMD(i64vec4);\"\n\n            \"uint64_t addInvocationsInclusiveScanNonUniformAMD(uint64_t);\"\n            \"u64vec2  addInvocationsInclusiveScanNonUniformAMD(u64vec2);\"\n            \"u64vec3  addInvocationsInclusiveScanNonUniformAMD(u64vec3);\"\n            \"u64vec4  addInvocationsInclusiveScanNonUniformAMD(u64vec4);\"\n\n            \"float16_t addInvocationsInclusiveScanNonUniformAMD(float16_t);\"\n            \"f16vec2   addInvocationsInclusiveScanNonUniformAMD(f16vec2);\"\n            \"f16vec3   addInvocationsInclusiveScanNonUniformAMD(f16vec3);\"\n            \"f16vec4   addInvocationsInclusiveScanNonUniformAMD(f16vec4);\"\n\n            \"int16_t addInvocationsInclusiveScanNonUniformAMD(int16_t);\"\n            \"i16vec2 addInvocationsInclusiveScanNonUniformAMD(i16vec2);\"\n            \"i16vec3 addInvocationsInclusiveScanNonUniformAMD(i16vec3);\"\n            \"i16vec4 addInvocationsInclusiveScanNonUniformAMD(i16vec4);\"\n\n            \"uint16_t addInvocationsInclusiveScanNonUniformAMD(uint16_t);\"\n            \"u16vec2  addInvocationsInclusiveScanNonUniformAMD(u16vec2);\"\n            \"u16vec3  addInvocationsInclusiveScanNonUniformAMD(u16vec3);\"\n            \"u16vec4  addInvocationsInclusiveScanNonUniformAMD(u16vec4);\"\n\n            \"float addInvocationsExclusiveScanNonUniformAMD(float);\"\n            \"vec2  addInvocationsExclusiveScanNonUniformAMD(vec2);\"\n            \"vec3  addInvocationsExclusiveScanNonUniformAMD(vec3);\"\n            \"vec4  addInvocationsExclusiveScanNonUniformAMD(vec4);\"\n\n            \"int   addInvocationsExclusiveScanNonUniformAMD(int);\"\n            \"ivec2 addInvocationsExclusiveScanNonUniformAMD(ivec2);\"\n            \"ivec3 addInvocationsExclusiveScanNonUniformAMD(ivec3);\"\n            \"ivec4 addInvocationsExclusiveScanNonUniformAMD(ivec4);\"\n\n            \"uint  addInvocationsExclusiveScanNonUniformAMD(uint);\"\n            \"uvec2 addInvocationsExclusiveScanNonUniformAMD(uvec2);\"\n            \"uvec3 addInvocationsExclusiveScanNonUniformAMD(uvec3);\"\n            \"uvec4 addInvocationsExclusiveScanNonUniformAMD(uvec4);\"\n\n            \"double addInvocationsExclusiveScanNonUniformAMD(double);\"\n            \"dvec2  addInvocationsExclusiveScanNonUniformAMD(dvec2);\"\n            \"dvec3  addInvocationsExclusiveScanNonUniformAMD(dvec3);\"\n            \"dvec4  addInvocationsExclusiveScanNonUniformAMD(dvec4);\"\n\n            \"int64_t addInvocationsExclusiveScanNonUniformAMD(int64_t);\"\n            \"i64vec2 addInvocationsExclusiveScanNonUniformAMD(i64vec2);\"\n            \"i64vec3 addInvocationsExclusiveScanNonUniformAMD(i64vec3);\"\n            \"i64vec4 addInvocationsExclusiveScanNonUniformAMD(i64vec4);\"\n\n            \"uint64_t addInvocationsExclusiveScanNonUniformAMD(uint64_t);\"\n            \"u64vec2  addInvocationsExclusiveScanNonUniformAMD(u64vec2);\"\n            \"u64vec3  addInvocationsExclusiveScanNonUniformAMD(u64vec3);\"\n            \"u64vec4  addInvocationsExclusiveScanNonUniformAMD(u64vec4);\"\n\n            \"float16_t addInvocationsExclusiveScanNonUniformAMD(float16_t);\"\n            \"f16vec2   addInvocationsExclusiveScanNonUniformAMD(f16vec2);\"\n            \"f16vec3   addInvocationsExclusiveScanNonUniformAMD(f16vec3);\"\n            \"f16vec4   addInvocationsExclusiveScanNonUniformAMD(f16vec4);\"\n\n            \"int16_t addInvocationsExclusiveScanNonUniformAMD(int16_t);\"\n            \"i16vec2 addInvocationsExclusiveScanNonUniformAMD(i16vec2);\"\n            \"i16vec3 addInvocationsExclusiveScanNonUniformAMD(i16vec3);\"\n            \"i16vec4 addInvocationsExclusiveScanNonUniformAMD(i16vec4);\"\n\n            \"uint16_t addInvocationsExclusiveScanNonUniformAMD(uint16_t);\"\n            \"u16vec2  addInvocationsExclusiveScanNonUniformAMD(u16vec2);\"\n            \"u16vec3  addInvocationsExclusiveScanNonUniformAMD(u16vec3);\"\n            \"u16vec4  addInvocationsExclusiveScanNonUniformAMD(u16vec4);\"\n\n            \"float swizzleInvocationsAMD(float, uvec4);\"\n            \"vec2  swizzleInvocationsAMD(vec2,  uvec4);\"\n            \"vec3  swizzleInvocationsAMD(vec3,  uvec4);\"\n            \"vec4  swizzleInvocationsAMD(vec4,  uvec4);\"\n\n            \"int   swizzleInvocationsAMD(int,   uvec4);\"\n            \"ivec2 swizzleInvocationsAMD(ivec2, uvec4);\"\n            \"ivec3 swizzleInvocationsAMD(ivec3, uvec4);\"\n            \"ivec4 swizzleInvocationsAMD(ivec4, uvec4);\"\n\n            \"uint  swizzleInvocationsAMD(uint,  uvec4);\"\n            \"uvec2 swizzleInvocationsAMD(uvec2, uvec4);\"\n            \"uvec3 swizzleInvocationsAMD(uvec3, uvec4);\"\n            \"uvec4 swizzleInvocationsAMD(uvec4, uvec4);\"\n\n            \"float swizzleInvocationsMaskedAMD(float, uvec3);\"\n            \"vec2  swizzleInvocationsMaskedAMD(vec2,  uvec3);\"\n            \"vec3  swizzleInvocationsMaskedAMD(vec3,  uvec3);\"\n            \"vec4  swizzleInvocationsMaskedAMD(vec4,  uvec3);\"\n\n            \"int   swizzleInvocationsMaskedAMD(int,   uvec3);\"\n            \"ivec2 swizzleInvocationsMaskedAMD(ivec2, uvec3);\"\n            \"ivec3 swizzleInvocationsMaskedAMD(ivec3, uvec3);\"\n            \"ivec4 swizzleInvocationsMaskedAMD(ivec4, uvec3);\"\n\n            \"uint  swizzleInvocationsMaskedAMD(uint,  uvec3);\"\n            \"uvec2 swizzleInvocationsMaskedAMD(uvec2, uvec3);\"\n            \"uvec3 swizzleInvocationsMaskedAMD(uvec3, uvec3);\"\n            \"uvec4 swizzleInvocationsMaskedAMD(uvec4, uvec3);\"\n\n            \"float writeInvocationAMD(float, float, uint);\"\n            \"vec2  writeInvocationAMD(vec2,  vec2,  uint);\"\n            \"vec3  writeInvocationAMD(vec3,  vec3,  uint);\"\n            \"vec4  writeInvocationAMD(vec4,  vec4,  uint);\"\n\n            \"int   writeInvocationAMD(int,   int,   uint);\"\n            \"ivec2 writeInvocationAMD(ivec2, ivec2, uint);\"\n            \"ivec3 writeInvocationAMD(ivec3, ivec3, uint);\"\n            \"ivec4 writeInvocationAMD(ivec4, ivec4, uint);\"\n\n            \"uint  writeInvocationAMD(uint,  uint,  uint);\"\n            \"uvec2 writeInvocationAMD(uvec2, uvec2, uint);\"\n            \"uvec3 writeInvocationAMD(uvec3, uvec3, uint);\"\n            \"uvec4 writeInvocationAMD(uvec4, uvec4, uint);\"\n\n            \"uint mbcntAMD(uint64_t);\"\n\n            \"\\n\");\n    }\n\n    // GL_AMD_gcn_shader\n    if (profile != EEsProfile && version >= 440) {\n        commonBuiltins.append(\n            \"float cubeFaceIndexAMD(vec3);\"\n            \"vec2  cubeFaceCoordAMD(vec3);\"\n            \"uint64_t timeAMD();\"\n\n            \"in int gl_SIMDGroupSizeAMD;\"\n            \"\\n\");\n    }\n\n    // GL_AMD_shader_fragment_mask\n    if (profile != EEsProfile && version >= 450) {\n        commonBuiltins.append(\n            \"uint fragmentMaskFetchAMD(sampler2DMS,       ivec2);\"\n            \"uint fragmentMaskFetchAMD(isampler2DMS,      ivec2);\"\n            \"uint fragmentMaskFetchAMD(usampler2DMS,      ivec2);\"\n\n            \"uint fragmentMaskFetchAMD(sampler2DMSArray,  ivec3);\"\n            \"uint fragmentMaskFetchAMD(isampler2DMSArray, ivec3);\"\n            \"uint fragmentMaskFetchAMD(usampler2DMSArray, ivec3);\"\n\n            \"vec4  fragmentFetchAMD(sampler2DMS,       ivec2, uint);\"\n            \"ivec4 fragmentFetchAMD(isampler2DMS,      ivec2, uint);\"\n            \"uvec4 fragmentFetchAMD(usampler2DMS,      ivec2, uint);\"\n\n            \"vec4  fragmentFetchAMD(sampler2DMSArray,  ivec3, uint);\"\n            \"ivec4 fragmentFetchAMD(isampler2DMSArray, ivec3, uint);\"\n            \"uvec4 fragmentFetchAMD(usampler2DMSArray, ivec3, uint);\"\n\n            \"\\n\");\n    }\n\n    if ((profile != EEsProfile && version >= 130) ||\n        (profile == EEsProfile && version >= 300)) {\n        commonBuiltins.append(\n            \"uint countLeadingZeros(uint);\"\n            \"uvec2 countLeadingZeros(uvec2);\"\n            \"uvec3 countLeadingZeros(uvec3);\"\n            \"uvec4 countLeadingZeros(uvec4);\"\n\n            \"uint countTrailingZeros(uint);\"\n            \"uvec2 countTrailingZeros(uvec2);\"\n            \"uvec3 countTrailingZeros(uvec3);\"\n            \"uvec4 countTrailingZeros(uvec4);\"\n\n            \"uint absoluteDifference(int, int);\"\n            \"uvec2 absoluteDifference(ivec2, ivec2);\"\n            \"uvec3 absoluteDifference(ivec3, ivec3);\"\n            \"uvec4 absoluteDifference(ivec4, ivec4);\"\n\n            \"uint16_t absoluteDifference(int16_t, int16_t);\"\n            \"u16vec2 absoluteDifference(i16vec2, i16vec2);\"\n            \"u16vec3 absoluteDifference(i16vec3, i16vec3);\"\n            \"u16vec4 absoluteDifference(i16vec4, i16vec4);\"\n\n            \"uint64_t absoluteDifference(int64_t, int64_t);\"\n            \"u64vec2 absoluteDifference(i64vec2, i64vec2);\"\n            \"u64vec3 absoluteDifference(i64vec3, i64vec3);\"\n            \"u64vec4 absoluteDifference(i64vec4, i64vec4);\"\n\n            \"uint absoluteDifference(uint, uint);\"\n            \"uvec2 absoluteDifference(uvec2, uvec2);\"\n            \"uvec3 absoluteDifference(uvec3, uvec3);\"\n            \"uvec4 absoluteDifference(uvec4, uvec4);\"\n\n            \"uint16_t absoluteDifference(uint16_t, uint16_t);\"\n            \"u16vec2 absoluteDifference(u16vec2, u16vec2);\"\n            \"u16vec3 absoluteDifference(u16vec3, u16vec3);\"\n            \"u16vec4 absoluteDifference(u16vec4, u16vec4);\"\n\n            \"uint64_t absoluteDifference(uint64_t, uint64_t);\"\n            \"u64vec2 absoluteDifference(u64vec2, u64vec2);\"\n            \"u64vec3 absoluteDifference(u64vec3, u64vec3);\"\n            \"u64vec4 absoluteDifference(u64vec4, u64vec4);\"\n\n            \"int addSaturate(int, int);\"\n            \"ivec2 addSaturate(ivec2, ivec2);\"\n            \"ivec3 addSaturate(ivec3, ivec3);\"\n            \"ivec4 addSaturate(ivec4, ivec4);\"\n\n            \"int16_t addSaturate(int16_t, int16_t);\"\n            \"i16vec2 addSaturate(i16vec2, i16vec2);\"\n            \"i16vec3 addSaturate(i16vec3, i16vec3);\"\n            \"i16vec4 addSaturate(i16vec4, i16vec4);\"\n\n            \"int64_t addSaturate(int64_t, int64_t);\"\n            \"i64vec2 addSaturate(i64vec2, i64vec2);\"\n            \"i64vec3 addSaturate(i64vec3, i64vec3);\"\n            \"i64vec4 addSaturate(i64vec4, i64vec4);\"\n\n            \"uint addSaturate(uint, uint);\"\n            \"uvec2 addSaturate(uvec2, uvec2);\"\n            \"uvec3 addSaturate(uvec3, uvec3);\"\n            \"uvec4 addSaturate(uvec4, uvec4);\"\n\n            \"uint16_t addSaturate(uint16_t, uint16_t);\"\n            \"u16vec2 addSaturate(u16vec2, u16vec2);\"\n            \"u16vec3 addSaturate(u16vec3, u16vec3);\"\n            \"u16vec4 addSaturate(u16vec4, u16vec4);\"\n\n            \"uint64_t addSaturate(uint64_t, uint64_t);\"\n            \"u64vec2 addSaturate(u64vec2, u64vec2);\"\n            \"u64vec3 addSaturate(u64vec3, u64vec3);\"\n            \"u64vec4 addSaturate(u64vec4, u64vec4);\"\n\n            \"int subtractSaturate(int, int);\"\n            \"ivec2 subtractSaturate(ivec2, ivec2);\"\n            \"ivec3 subtractSaturate(ivec3, ivec3);\"\n            \"ivec4 subtractSaturate(ivec4, ivec4);\"\n\n            \"int16_t subtractSaturate(int16_t, int16_t);\"\n            \"i16vec2 subtractSaturate(i16vec2, i16vec2);\"\n            \"i16vec3 subtractSaturate(i16vec3, i16vec3);\"\n            \"i16vec4 subtractSaturate(i16vec4, i16vec4);\"\n\n            \"int64_t subtractSaturate(int64_t, int64_t);\"\n            \"i64vec2 subtractSaturate(i64vec2, i64vec2);\"\n            \"i64vec3 subtractSaturate(i64vec3, i64vec3);\"\n            \"i64vec4 subtractSaturate(i64vec4, i64vec4);\"\n\n            \"uint subtractSaturate(uint, uint);\"\n            \"uvec2 subtractSaturate(uvec2, uvec2);\"\n            \"uvec3 subtractSaturate(uvec3, uvec3);\"\n            \"uvec4 subtractSaturate(uvec4, uvec4);\"\n\n            \"uint16_t subtractSaturate(uint16_t, uint16_t);\"\n            \"u16vec2 subtractSaturate(u16vec2, u16vec2);\"\n            \"u16vec3 subtractSaturate(u16vec3, u16vec3);\"\n            \"u16vec4 subtractSaturate(u16vec4, u16vec4);\"\n\n            \"uint64_t subtractSaturate(uint64_t, uint64_t);\"\n            \"u64vec2 subtractSaturate(u64vec2, u64vec2);\"\n            \"u64vec3 subtractSaturate(u64vec3, u64vec3);\"\n            \"u64vec4 subtractSaturate(u64vec4, u64vec4);\"\n\n            \"int average(int, int);\"\n            \"ivec2 average(ivec2, ivec2);\"\n            \"ivec3 average(ivec3, ivec3);\"\n            \"ivec4 average(ivec4, ivec4);\"\n\n            \"int16_t average(int16_t, int16_t);\"\n            \"i16vec2 average(i16vec2, i16vec2);\"\n            \"i16vec3 average(i16vec3, i16vec3);\"\n            \"i16vec4 average(i16vec4, i16vec4);\"\n\n            \"int64_t average(int64_t, int64_t);\"\n            \"i64vec2 average(i64vec2, i64vec2);\"\n            \"i64vec3 average(i64vec3, i64vec3);\"\n            \"i64vec4 average(i64vec4, i64vec4);\"\n\n            \"uint average(uint, uint);\"\n            \"uvec2 average(uvec2, uvec2);\"\n            \"uvec3 average(uvec3, uvec3);\"\n            \"uvec4 average(uvec4, uvec4);\"\n\n            \"uint16_t average(uint16_t, uint16_t);\"\n            \"u16vec2 average(u16vec2, u16vec2);\"\n            \"u16vec3 average(u16vec3, u16vec3);\"\n            \"u16vec4 average(u16vec4, u16vec4);\"\n\n            \"uint64_t average(uint64_t, uint64_t);\"\n            \"u64vec2 average(u64vec2, u64vec2);\"\n            \"u64vec3 average(u64vec3, u64vec3);\"\n            \"u64vec4 average(u64vec4, u64vec4);\"\n\n            \"int averageRounded(int, int);\"\n            \"ivec2 averageRounded(ivec2, ivec2);\"\n            \"ivec3 averageRounded(ivec3, ivec3);\"\n            \"ivec4 averageRounded(ivec4, ivec4);\"\n\n            \"int16_t averageRounded(int16_t, int16_t);\"\n            \"i16vec2 averageRounded(i16vec2, i16vec2);\"\n            \"i16vec3 averageRounded(i16vec3, i16vec3);\"\n            \"i16vec4 averageRounded(i16vec4, i16vec4);\"\n\n            \"int64_t averageRounded(int64_t, int64_t);\"\n            \"i64vec2 averageRounded(i64vec2, i64vec2);\"\n            \"i64vec3 averageRounded(i64vec3, i64vec3);\"\n            \"i64vec4 averageRounded(i64vec4, i64vec4);\"\n\n            \"uint averageRounded(uint, uint);\"\n            \"uvec2 averageRounded(uvec2, uvec2);\"\n            \"uvec3 averageRounded(uvec3, uvec3);\"\n            \"uvec4 averageRounded(uvec4, uvec4);\"\n\n            \"uint16_t averageRounded(uint16_t, uint16_t);\"\n            \"u16vec2 averageRounded(u16vec2, u16vec2);\"\n            \"u16vec3 averageRounded(u16vec3, u16vec3);\"\n            \"u16vec4 averageRounded(u16vec4, u16vec4);\"\n\n            \"uint64_t averageRounded(uint64_t, uint64_t);\"\n            \"u64vec2 averageRounded(u64vec2, u64vec2);\"\n            \"u64vec3 averageRounded(u64vec3, u64vec3);\"\n            \"u64vec4 averageRounded(u64vec4, u64vec4);\"\n\n            \"int multiply32x16(int, int);\"\n            \"ivec2 multiply32x16(ivec2, ivec2);\"\n            \"ivec3 multiply32x16(ivec3, ivec3);\"\n            \"ivec4 multiply32x16(ivec4, ivec4);\"\n\n            \"uint multiply32x16(uint, uint);\"\n            \"uvec2 multiply32x16(uvec2, uvec2);\"\n            \"uvec3 multiply32x16(uvec3, uvec3);\"\n            \"uvec4 multiply32x16(uvec4, uvec4);\"\n            \"\\n\");\n    }\n\n    if ((profile != EEsProfile && version >= 450) ||\n        (profile == EEsProfile && version >= 320)) {\n        commonBuiltins.append(\n            \"struct gl_TextureFootprint2DNV {\"\n                \"uvec2 anchor;\"\n                \"uvec2 offset;\"\n                \"uvec2 mask;\"\n                \"uint lod;\"\n                \"uint granularity;\"\n            \"};\"\n\n            \"struct gl_TextureFootprint3DNV {\"\n                \"uvec3 anchor;\"\n                \"uvec3 offset;\"\n                \"uvec2 mask;\"\n                \"uint lod;\"\n                \"uint granularity;\"\n            \"};\"\n            \"bool textureFootprintNV(sampler2D, vec2, int, bool, out gl_TextureFootprint2DNV);\"\n            \"bool textureFootprintNV(sampler3D, vec3, int, bool, out gl_TextureFootprint3DNV);\"\n            \"bool textureFootprintNV(sampler2D, vec2, int, bool, out gl_TextureFootprint2DNV, float);\"\n            \"bool textureFootprintNV(sampler3D, vec3, int, bool, out gl_TextureFootprint3DNV, float);\"\n            \"bool textureFootprintClampNV(sampler2D, vec2, float, int, bool, out gl_TextureFootprint2DNV);\"\n            \"bool textureFootprintClampNV(sampler3D, vec3, float, int, bool, out gl_TextureFootprint3DNV);\"\n            \"bool textureFootprintClampNV(sampler2D, vec2, float, int, bool, out gl_TextureFootprint2DNV, float);\"\n            \"bool textureFootprintClampNV(sampler3D, vec3, float, int, bool, out gl_TextureFootprint3DNV, float);\"\n            \"bool textureFootprintLodNV(sampler2D, vec2, float, int, bool, out gl_TextureFootprint2DNV);\"\n            \"bool textureFootprintLodNV(sampler3D, vec3, float, int, bool, out gl_TextureFootprint3DNV);\"\n            \"bool textureFootprintGradNV(sampler2D, vec2, vec2, vec2, int, bool, out gl_TextureFootprint2DNV);\"\n            \"bool textureFootprintGradClampNV(sampler2D, vec2, vec2, vec2, float, int, bool, out gl_TextureFootprint2DNV);\"\n            \"\\n\");\n    }\n\n    if ((profile == EEsProfile && version >= 300 && version < 310) ||\n        (profile != EEsProfile && version >= 150 && version < 450)) { // GL_EXT_shader_integer_mix\n        commonBuiltins.append(\"int mix(int, int, bool);\"\n                              \"ivec2 mix(ivec2, ivec2, bvec2);\"\n                              \"ivec3 mix(ivec3, ivec3, bvec3);\"\n                              \"ivec4 mix(ivec4, ivec4, bvec4);\"\n                              \"uint  mix(uint,  uint,  bool );\"\n                              \"uvec2 mix(uvec2, uvec2, bvec2);\"\n                              \"uvec3 mix(uvec3, uvec3, bvec3);\"\n                              \"uvec4 mix(uvec4, uvec4, bvec4);\"\n                              \"bool  mix(bool,  bool,  bool );\"\n                              \"bvec2 mix(bvec2, bvec2, bvec2);\"\n                              \"bvec3 mix(bvec3, bvec3, bvec3);\"\n                              \"bvec4 mix(bvec4, bvec4, bvec4);\"\n\n                              \"\\n\");\n    }\n\n    // GL_AMD_gpu_shader_half_float/Explicit types\n    if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 310)) {\n        commonBuiltins.append(\n            \"float16_t radians(float16_t);\"\n            \"f16vec2   radians(f16vec2);\"\n            \"f16vec3   radians(f16vec3);\"\n            \"f16vec4   radians(f16vec4);\"\n\n            \"float16_t degrees(float16_t);\"\n            \"f16vec2   degrees(f16vec2);\"\n            \"f16vec3   degrees(f16vec3);\"\n            \"f16vec4   degrees(f16vec4);\"\n\n            \"float16_t sin(float16_t);\"\n            \"f16vec2   sin(f16vec2);\"\n            \"f16vec3   sin(f16vec3);\"\n            \"f16vec4   sin(f16vec4);\"\n\n            \"float16_t cos(float16_t);\"\n            \"f16vec2   cos(f16vec2);\"\n            \"f16vec3   cos(f16vec3);\"\n            \"f16vec4   cos(f16vec4);\"\n\n            \"float16_t tan(float16_t);\"\n            \"f16vec2   tan(f16vec2);\"\n            \"f16vec3   tan(f16vec3);\"\n            \"f16vec4   tan(f16vec4);\"\n\n            \"float16_t asin(float16_t);\"\n            \"f16vec2   asin(f16vec2);\"\n            \"f16vec3   asin(f16vec3);\"\n            \"f16vec4   asin(f16vec4);\"\n\n            \"float16_t acos(float16_t);\"\n            \"f16vec2   acos(f16vec2);\"\n            \"f16vec3   acos(f16vec3);\"\n            \"f16vec4   acos(f16vec4);\"\n\n            \"float16_t atan(float16_t, float16_t);\"\n            \"f16vec2   atan(f16vec2,   f16vec2);\"\n            \"f16vec3   atan(f16vec3,   f16vec3);\"\n            \"f16vec4   atan(f16vec4,   f16vec4);\"\n\n            \"float16_t atan(float16_t);\"\n            \"f16vec2   atan(f16vec2);\"\n            \"f16vec3   atan(f16vec3);\"\n            \"f16vec4   atan(f16vec4);\"\n\n            \"float16_t sinh(float16_t);\"\n            \"f16vec2   sinh(f16vec2);\"\n            \"f16vec3   sinh(f16vec3);\"\n            \"f16vec4   sinh(f16vec4);\"\n\n            \"float16_t cosh(float16_t);\"\n            \"f16vec2   cosh(f16vec2);\"\n            \"f16vec3   cosh(f16vec3);\"\n            \"f16vec4   cosh(f16vec4);\"\n\n            \"float16_t tanh(float16_t);\"\n            \"f16vec2   tanh(f16vec2);\"\n            \"f16vec3   tanh(f16vec3);\"\n            \"f16vec4   tanh(f16vec4);\"\n\n            \"float16_t asinh(float16_t);\"\n            \"f16vec2   asinh(f16vec2);\"\n            \"f16vec3   asinh(f16vec3);\"\n            \"f16vec4   asinh(f16vec4);\"\n\n            \"float16_t acosh(float16_t);\"\n            \"f16vec2   acosh(f16vec2);\"\n            \"f16vec3   acosh(f16vec3);\"\n            \"f16vec4   acosh(f16vec4);\"\n\n            \"float16_t atanh(float16_t);\"\n            \"f16vec2   atanh(f16vec2);\"\n            \"f16vec3   atanh(f16vec3);\"\n            \"f16vec4   atanh(f16vec4);\"\n\n            \"float16_t pow(float16_t, float16_t);\"\n            \"f16vec2   pow(f16vec2,   f16vec2);\"\n            \"f16vec3   pow(f16vec3,   f16vec3);\"\n            \"f16vec4   pow(f16vec4,   f16vec4);\"\n\n            \"float16_t exp(float16_t);\"\n            \"f16vec2   exp(f16vec2);\"\n            \"f16vec3   exp(f16vec3);\"\n            \"f16vec4   exp(f16vec4);\"\n\n            \"float16_t log(float16_t);\"\n            \"f16vec2   log(f16vec2);\"\n            \"f16vec3   log(f16vec3);\"\n            \"f16vec4   log(f16vec4);\"\n\n            \"float16_t exp2(float16_t);\"\n            \"f16vec2   exp2(f16vec2);\"\n            \"f16vec3   exp2(f16vec3);\"\n            \"f16vec4   exp2(f16vec4);\"\n\n            \"float16_t log2(float16_t);\"\n            \"f16vec2   log2(f16vec2);\"\n            \"f16vec3   log2(f16vec3);\"\n            \"f16vec4   log2(f16vec4);\"\n\n            \"float16_t sqrt(float16_t);\"\n            \"f16vec2   sqrt(f16vec2);\"\n            \"f16vec3   sqrt(f16vec3);\"\n            \"f16vec4   sqrt(f16vec4);\"\n\n            \"float16_t inversesqrt(float16_t);\"\n            \"f16vec2   inversesqrt(f16vec2);\"\n            \"f16vec3   inversesqrt(f16vec3);\"\n            \"f16vec4   inversesqrt(f16vec4);\"\n\n            \"float16_t abs(float16_t);\"\n            \"f16vec2   abs(f16vec2);\"\n            \"f16vec3   abs(f16vec3);\"\n            \"f16vec4   abs(f16vec4);\"\n\n            \"float16_t sign(float16_t);\"\n            \"f16vec2   sign(f16vec2);\"\n            \"f16vec3   sign(f16vec3);\"\n            \"f16vec4   sign(f16vec4);\"\n\n            \"float16_t floor(float16_t);\"\n            \"f16vec2   floor(f16vec2);\"\n            \"f16vec3   floor(f16vec3);\"\n            \"f16vec4   floor(f16vec4);\"\n\n            \"float16_t trunc(float16_t);\"\n            \"f16vec2   trunc(f16vec2);\"\n            \"f16vec3   trunc(f16vec3);\"\n            \"f16vec4   trunc(f16vec4);\"\n\n            \"float16_t round(float16_t);\"\n            \"f16vec2   round(f16vec2);\"\n            \"f16vec3   round(f16vec3);\"\n            \"f16vec4   round(f16vec4);\"\n\n            \"float16_t roundEven(float16_t);\"\n            \"f16vec2   roundEven(f16vec2);\"\n            \"f16vec3   roundEven(f16vec3);\"\n            \"f16vec4   roundEven(f16vec4);\"\n\n            \"float16_t ceil(float16_t);\"\n            \"f16vec2   ceil(f16vec2);\"\n            \"f16vec3   ceil(f16vec3);\"\n            \"f16vec4   ceil(f16vec4);\"\n\n            \"float16_t fract(float16_t);\"\n            \"f16vec2   fract(f16vec2);\"\n            \"f16vec3   fract(f16vec3);\"\n            \"f16vec4   fract(f16vec4);\"\n\n            \"float16_t mod(float16_t, float16_t);\"\n            \"f16vec2   mod(f16vec2,   float16_t);\"\n            \"f16vec3   mod(f16vec3,   float16_t);\"\n            \"f16vec4   mod(f16vec4,   float16_t);\"\n            \"f16vec2   mod(f16vec2,   f16vec2);\"\n            \"f16vec3   mod(f16vec3,   f16vec3);\"\n            \"f16vec4   mod(f16vec4,   f16vec4);\"\n\n            \"float16_t modf(float16_t, out float16_t);\"\n            \"f16vec2   modf(f16vec2,   out f16vec2);\"\n            \"f16vec3   modf(f16vec3,   out f16vec3);\"\n            \"f16vec4   modf(f16vec4,   out f16vec4);\"\n\n            \"float16_t min(float16_t, float16_t);\"\n            \"f16vec2   min(f16vec2,   float16_t);\"\n            \"f16vec3   min(f16vec3,   float16_t);\"\n            \"f16vec4   min(f16vec4,   float16_t);\"\n            \"f16vec2   min(f16vec2,   f16vec2);\"\n            \"f16vec3   min(f16vec3,   f16vec3);\"\n            \"f16vec4   min(f16vec4,   f16vec4);\"\n\n            \"float16_t max(float16_t, float16_t);\"\n            \"f16vec2   max(f16vec2,   float16_t);\"\n            \"f16vec3   max(f16vec3,   float16_t);\"\n            \"f16vec4   max(f16vec4,   float16_t);\"\n            \"f16vec2   max(f16vec2,   f16vec2);\"\n            \"f16vec3   max(f16vec3,   f16vec3);\"\n            \"f16vec4   max(f16vec4,   f16vec4);\"\n\n            \"float16_t clamp(float16_t, float16_t, float16_t);\"\n            \"f16vec2   clamp(f16vec2,   float16_t, float16_t);\"\n            \"f16vec3   clamp(f16vec3,   float16_t, float16_t);\"\n            \"f16vec4   clamp(f16vec4,   float16_t, float16_t);\"\n            \"f16vec2   clamp(f16vec2,   f16vec2,   f16vec2);\"\n            \"f16vec3   clamp(f16vec3,   f16vec3,   f16vec3);\"\n            \"f16vec4   clamp(f16vec4,   f16vec4,   f16vec4);\"\n\n            \"float16_t mix(float16_t, float16_t, float16_t);\"\n            \"f16vec2   mix(f16vec2,   f16vec2,   float16_t);\"\n            \"f16vec3   mix(f16vec3,   f16vec3,   float16_t);\"\n            \"f16vec4   mix(f16vec4,   f16vec4,   float16_t);\"\n            \"f16vec2   mix(f16vec2,   f16vec2,   f16vec2);\"\n            \"f16vec3   mix(f16vec3,   f16vec3,   f16vec3);\"\n            \"f16vec4   mix(f16vec4,   f16vec4,   f16vec4);\"\n            \"float16_t mix(float16_t, float16_t, bool);\"\n            \"f16vec2   mix(f16vec2,   f16vec2,   bvec2);\"\n            \"f16vec3   mix(f16vec3,   f16vec3,   bvec3);\"\n            \"f16vec4   mix(f16vec4,   f16vec4,   bvec4);\"\n\n            \"float16_t step(float16_t, float16_t);\"\n            \"f16vec2   step(f16vec2,   f16vec2);\"\n            \"f16vec3   step(f16vec3,   f16vec3);\"\n            \"f16vec4   step(f16vec4,   f16vec4);\"\n            \"f16vec2   step(float16_t, f16vec2);\"\n            \"f16vec3   step(float16_t, f16vec3);\"\n            \"f16vec4   step(float16_t, f16vec4);\"\n\n            \"float16_t smoothstep(float16_t, float16_t, float16_t);\"\n            \"f16vec2   smoothstep(f16vec2,   f16vec2,   f16vec2);\"\n            \"f16vec3   smoothstep(f16vec3,   f16vec3,   f16vec3);\"\n            \"f16vec4   smoothstep(f16vec4,   f16vec4,   f16vec4);\"\n            \"f16vec2   smoothstep(float16_t, float16_t, f16vec2);\"\n            \"f16vec3   smoothstep(float16_t, float16_t, f16vec3);\"\n            \"f16vec4   smoothstep(float16_t, float16_t, f16vec4);\"\n\n            \"bool  isnan(float16_t);\"\n            \"bvec2 isnan(f16vec2);\"\n            \"bvec3 isnan(f16vec3);\"\n            \"bvec4 isnan(f16vec4);\"\n\n            \"bool  isinf(float16_t);\"\n            \"bvec2 isinf(f16vec2);\"\n            \"bvec3 isinf(f16vec3);\"\n            \"bvec4 isinf(f16vec4);\"\n\n            \"float16_t fma(float16_t, float16_t, float16_t);\"\n            \"f16vec2   fma(f16vec2,   f16vec2,   f16vec2);\"\n            \"f16vec3   fma(f16vec3,   f16vec3,   f16vec3);\"\n            \"f16vec4   fma(f16vec4,   f16vec4,   f16vec4);\"\n\n            \"float16_t frexp(float16_t, out int);\"\n            \"f16vec2   frexp(f16vec2,   out ivec2);\"\n            \"f16vec3   frexp(f16vec3,   out ivec3);\"\n            \"f16vec4   frexp(f16vec4,   out ivec4);\"\n\n            \"float16_t ldexp(float16_t, in int);\"\n            \"f16vec2   ldexp(f16vec2,   in ivec2);\"\n            \"f16vec3   ldexp(f16vec3,   in ivec3);\"\n            \"f16vec4   ldexp(f16vec4,   in ivec4);\"\n\n            \"uint    packFloat2x16(f16vec2);\"\n            \"f16vec2 unpackFloat2x16(uint);\"\n\n            \"float16_t length(float16_t);\"\n            \"float16_t length(f16vec2);\"\n            \"float16_t length(f16vec3);\"\n            \"float16_t length(f16vec4);\"\n\n            \"float16_t distance(float16_t, float16_t);\"\n            \"float16_t distance(f16vec2,   f16vec2);\"\n            \"float16_t distance(f16vec3,   f16vec3);\"\n            \"float16_t distance(f16vec4,   f16vec4);\"\n\n            \"float16_t dot(float16_t, float16_t);\"\n            \"float16_t dot(f16vec2,   f16vec2);\"\n            \"float16_t dot(f16vec3,   f16vec3);\"\n            \"float16_t dot(f16vec4,   f16vec4);\"\n\n            \"f16vec3 cross(f16vec3, f16vec3);\"\n\n            \"float16_t normalize(float16_t);\"\n            \"f16vec2   normalize(f16vec2);\"\n            \"f16vec3   normalize(f16vec3);\"\n            \"f16vec4   normalize(f16vec4);\"\n\n            \"float16_t faceforward(float16_t, float16_t, float16_t);\"\n            \"f16vec2   faceforward(f16vec2,   f16vec2,   f16vec2);\"\n            \"f16vec3   faceforward(f16vec3,   f16vec3,   f16vec3);\"\n            \"f16vec4   faceforward(f16vec4,   f16vec4,   f16vec4);\"\n\n            \"float16_t reflect(float16_t, float16_t);\"\n            \"f16vec2   reflect(f16vec2,   f16vec2);\"\n            \"f16vec3   reflect(f16vec3,   f16vec3);\"\n            \"f16vec4   reflect(f16vec4,   f16vec4);\"\n\n            \"float16_t refract(float16_t, float16_t, float16_t);\"\n            \"f16vec2   refract(f16vec2,   f16vec2,   float16_t);\"\n            \"f16vec3   refract(f16vec3,   f16vec3,   float16_t);\"\n            \"f16vec4   refract(f16vec4,   f16vec4,   float16_t);\"\n\n            \"f16mat2   matrixCompMult(f16mat2,   f16mat2);\"\n            \"f16mat3   matrixCompMult(f16mat3,   f16mat3);\"\n            \"f16mat4   matrixCompMult(f16mat4,   f16mat4);\"\n            \"f16mat2x3 matrixCompMult(f16mat2x3, f16mat2x3);\"\n            \"f16mat2x4 matrixCompMult(f16mat2x4, f16mat2x4);\"\n            \"f16mat3x2 matrixCompMult(f16mat3x2, f16mat3x2);\"\n            \"f16mat3x4 matrixCompMult(f16mat3x4, f16mat3x4);\"\n            \"f16mat4x2 matrixCompMult(f16mat4x2, f16mat4x2);\"\n            \"f16mat4x3 matrixCompMult(f16mat4x3, f16mat4x3);\"\n\n            \"f16mat2   outerProduct(f16vec2, f16vec2);\"\n            \"f16mat3   outerProduct(f16vec3, f16vec3);\"\n            \"f16mat4   outerProduct(f16vec4, f16vec4);\"\n            \"f16mat2x3 outerProduct(f16vec3, f16vec2);\"\n            \"f16mat3x2 outerProduct(f16vec2, f16vec3);\"\n            \"f16mat2x4 outerProduct(f16vec4, f16vec2);\"\n            \"f16mat4x2 outerProduct(f16vec2, f16vec4);\"\n            \"f16mat3x4 outerProduct(f16vec4, f16vec3);\"\n            \"f16mat4x3 outerProduct(f16vec3, f16vec4);\"\n\n            \"f16mat2   transpose(f16mat2);\"\n            \"f16mat3   transpose(f16mat3);\"\n            \"f16mat4   transpose(f16mat4);\"\n            \"f16mat2x3 transpose(f16mat3x2);\"\n            \"f16mat3x2 transpose(f16mat2x3);\"\n            \"f16mat2x4 transpose(f16mat4x2);\"\n            \"f16mat4x2 transpose(f16mat2x4);\"\n            \"f16mat3x4 transpose(f16mat4x3);\"\n            \"f16mat4x3 transpose(f16mat3x4);\"\n\n            \"float16_t determinant(f16mat2);\"\n            \"float16_t determinant(f16mat3);\"\n            \"float16_t determinant(f16mat4);\"\n\n            \"f16mat2 inverse(f16mat2);\"\n            \"f16mat3 inverse(f16mat3);\"\n            \"f16mat4 inverse(f16mat4);\"\n\n            \"bvec2 lessThan(f16vec2, f16vec2);\"\n            \"bvec3 lessThan(f16vec3, f16vec3);\"\n            \"bvec4 lessThan(f16vec4, f16vec4);\"\n\n            \"bvec2 lessThanEqual(f16vec2, f16vec2);\"\n            \"bvec3 lessThanEqual(f16vec3, f16vec3);\"\n            \"bvec4 lessThanEqual(f16vec4, f16vec4);\"\n\n            \"bvec2 greaterThan(f16vec2, f16vec2);\"\n            \"bvec3 greaterThan(f16vec3, f16vec3);\"\n            \"bvec4 greaterThan(f16vec4, f16vec4);\"\n\n            \"bvec2 greaterThanEqual(f16vec2, f16vec2);\"\n            \"bvec3 greaterThanEqual(f16vec3, f16vec3);\"\n            \"bvec4 greaterThanEqual(f16vec4, f16vec4);\"\n\n            \"bvec2 equal(f16vec2, f16vec2);\"\n            \"bvec3 equal(f16vec3, f16vec3);\"\n            \"bvec4 equal(f16vec4, f16vec4);\"\n\n            \"bvec2 notEqual(f16vec2, f16vec2);\"\n            \"bvec3 notEqual(f16vec3, f16vec3);\"\n            \"bvec4 notEqual(f16vec4, f16vec4);\"\n\n            \"bfloat16_t dot(bfloat16_t, bfloat16_t);\"\n            \"bfloat16_t dot(bf16vec2,   bf16vec2);\"\n            \"bfloat16_t dot(bf16vec3,   bf16vec3);\"\n            \"bfloat16_t dot(bf16vec4,   bf16vec4);\"\n\n            \"int16_t  bfloat16BitsToIntEXT(bfloat16_t value);\"\n            \"i16vec2  bfloat16BitsToIntEXT(bf16vec2 value);\"\n            \"i16vec3  bfloat16BitsToIntEXT(bf16vec3 value);\"\n            \"i16vec4  bfloat16BitsToIntEXT(bf16vec4 value);\"\n\n            \"uint16_t bfloat16BitsToUintEXT(bfloat16_t value);\"\n            \"u16vec2  bfloat16BitsToUintEXT(bf16vec2 value);\"\n            \"u16vec3  bfloat16BitsToUintEXT(bf16vec3 value);\"\n            \"u16vec4  bfloat16BitsToUintEXT(bf16vec4 value);\"\n\n            \"bfloat16_t intBitsToBFloat16EXT(int16_t value);\"\n            \"bf16vec2   intBitsToBFloat16EXT(i16vec2 value);\"\n            \"bf16vec3   intBitsToBFloat16EXT(i16vec3 value);\"\n            \"bf16vec4   intBitsToBFloat16EXT(i16vec4 value);\"\n\n            \"bfloat16_t uintBitsToBFloat16EXT(uint16_t value);\"\n            \"bf16vec2   uintBitsToBFloat16EXT(u16vec2 value);\"\n            \"bf16vec3   uintBitsToBFloat16EXT(u16vec3 value);\"\n            \"bf16vec4   uintBitsToBFloat16EXT(u16vec4 value);\"\n\n            \"int8_t  floate5m2BitsToIntEXT(floate5m2_t value);\"\n            \"i8vec2  floate5m2BitsToIntEXT(fe5m2vec2 value);\"\n            \"i8vec3  floate5m2BitsToIntEXT(fe5m2vec3 value);\"\n            \"i8vec4  floate5m2BitsToIntEXT(fe5m2vec4 value);\"\n\n            \"uint8_t floate5m2BitsToUintEXT(floate5m2_t value);\"\n            \"u8vec2  floate5m2BitsToUintEXT(fe5m2vec2 value);\"\n            \"u8vec3  floate5m2BitsToUintEXT(fe5m2vec3 value);\"\n            \"u8vec4  floate5m2BitsToUintEXT(fe5m2vec4 value);\"\n\n            \"floate5m2_t intBitsToFloate5m2EXT(int8_t value);\"\n            \"fe5m2vec2   intBitsToFloate5m2EXT(i8vec2 value);\"\n            \"fe5m2vec3   intBitsToFloate5m2EXT(i8vec3 value);\"\n            \"fe5m2vec4   intBitsToFloate5m2EXT(i8vec4 value);\"\n\n            \"floate5m2_t uintBitsToFloate5m2EXT(uint8_t value);\"\n            \"fe5m2vec2   uintBitsToFloate5m2EXT(u8vec2 value);\"\n            \"fe5m2vec3   uintBitsToFloate5m2EXT(u8vec3 value);\"\n            \"fe5m2vec4   uintBitsToFloate5m2EXT(u8vec4 value);\"\n\n            \"int8_t  floate4m3BitsToIntEXT(floate4m3_t value);\"\n            \"i8vec2  floate4m3BitsToIntEXT(fe4m3vec2 value);\"\n            \"i8vec3  floate4m3BitsToIntEXT(fe4m3vec3 value);\"\n            \"i8vec4  floate4m3BitsToIntEXT(fe4m3vec4 value);\"\n\n            \"uint8_t floate4m3BitsToUintEXT(floate4m3_t value);\"\n            \"u8vec2  floate4m3BitsToUintEXT(fe4m3vec2 value);\"\n            \"u8vec3  floate4m3BitsToUintEXT(fe4m3vec3 value);\"\n            \"u8vec4  floate4m3BitsToUintEXT(fe4m3vec4 value);\"\n\n            \"floate4m3_t intBitsToFloate4m3EXT(int8_t value);\"\n            \"fe4m3vec2   intBitsToFloate4m3EXT(i8vec2 value);\"\n            \"fe4m3vec3   intBitsToFloate4m3EXT(i8vec3 value);\"\n            \"fe4m3vec4   intBitsToFloate4m3EXT(i8vec4 value);\"\n\n            \"floate4m3_t uintBitsToFloate4m3EXT(uint8_t value);\"\n            \"fe4m3vec2   uintBitsToFloate4m3EXT(u8vec2 value);\"\n            \"fe4m3vec3   uintBitsToFloate4m3EXT(u8vec3 value);\"\n            \"fe4m3vec4   uintBitsToFloate4m3EXT(u8vec4 value);\"\n\n            \"void saturatedConvertEXT();\"\n            \"\\n\");\n    }\n\n    // Explicit types\n    if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 310)) {\n        commonBuiltins.append(\n            \"int8_t abs(int8_t);\"\n            \"i8vec2 abs(i8vec2);\"\n            \"i8vec3 abs(i8vec3);\"\n            \"i8vec4 abs(i8vec4);\"\n\n            \"int8_t sign(int8_t);\"\n            \"i8vec2 sign(i8vec2);\"\n            \"i8vec3 sign(i8vec3);\"\n            \"i8vec4 sign(i8vec4);\"\n\n            \"int8_t min(int8_t x, int8_t y);\"\n            \"i8vec2 min(i8vec2 x, int8_t y);\"\n            \"i8vec3 min(i8vec3 x, int8_t y);\"\n            \"i8vec4 min(i8vec4 x, int8_t y);\"\n            \"i8vec2 min(i8vec2 x, i8vec2 y);\"\n            \"i8vec3 min(i8vec3 x, i8vec3 y);\"\n            \"i8vec4 min(i8vec4 x, i8vec4 y);\"\n\n            \"uint8_t min(uint8_t x, uint8_t y);\"\n            \"u8vec2 min(u8vec2 x, uint8_t y);\"\n            \"u8vec3 min(u8vec3 x, uint8_t y);\"\n            \"u8vec4 min(u8vec4 x, uint8_t y);\"\n            \"u8vec2 min(u8vec2 x, u8vec2 y);\"\n            \"u8vec3 min(u8vec3 x, u8vec3 y);\"\n            \"u8vec4 min(u8vec4 x, u8vec4 y);\"\n\n            \"int8_t max(int8_t x, int8_t y);\"\n            \"i8vec2 max(i8vec2 x, int8_t y);\"\n            \"i8vec3 max(i8vec3 x, int8_t y);\"\n            \"i8vec4 max(i8vec4 x, int8_t y);\"\n            \"i8vec2 max(i8vec2 x, i8vec2 y);\"\n            \"i8vec3 max(i8vec3 x, i8vec3 y);\"\n            \"i8vec4 max(i8vec4 x, i8vec4 y);\"\n\n            \"uint8_t max(uint8_t x, uint8_t y);\"\n            \"u8vec2 max(u8vec2 x, uint8_t y);\"\n            \"u8vec3 max(u8vec3 x, uint8_t y);\"\n            \"u8vec4 max(u8vec4 x, uint8_t y);\"\n            \"u8vec2 max(u8vec2 x, u8vec2 y);\"\n            \"u8vec3 max(u8vec3 x, u8vec3 y);\"\n            \"u8vec4 max(u8vec4 x, u8vec4 y);\"\n\n            \"int8_t    clamp(int8_t x, int8_t minVal, int8_t maxVal);\"\n            \"i8vec2  clamp(i8vec2  x, int8_t minVal, int8_t maxVal);\"\n            \"i8vec3  clamp(i8vec3  x, int8_t minVal, int8_t maxVal);\"\n            \"i8vec4  clamp(i8vec4  x, int8_t minVal, int8_t maxVal);\"\n            \"i8vec2  clamp(i8vec2  x, i8vec2  minVal, i8vec2  maxVal);\"\n            \"i8vec3  clamp(i8vec3  x, i8vec3  minVal, i8vec3  maxVal);\"\n            \"i8vec4  clamp(i8vec4  x, i8vec4  minVal, i8vec4  maxVal);\"\n\n            \"uint8_t   clamp(uint8_t x, uint8_t minVal, uint8_t maxVal);\"\n            \"u8vec2  clamp(u8vec2  x, uint8_t minVal, uint8_t maxVal);\"\n            \"u8vec3  clamp(u8vec3  x, uint8_t minVal, uint8_t maxVal);\"\n            \"u8vec4  clamp(u8vec4  x, uint8_t minVal, uint8_t maxVal);\"\n            \"u8vec2  clamp(u8vec2  x, u8vec2  minVal, u8vec2  maxVal);\"\n            \"u8vec3  clamp(u8vec3  x, u8vec3  minVal, u8vec3  maxVal);\"\n            \"u8vec4  clamp(u8vec4  x, u8vec4  minVal, u8vec4  maxVal);\"\n\n            \"int8_t  mix(int8_t,  int8_t,  bool);\"\n            \"i8vec2  mix(i8vec2,  i8vec2,  bvec2);\"\n            \"i8vec3  mix(i8vec3,  i8vec3,  bvec3);\"\n            \"i8vec4  mix(i8vec4,  i8vec4,  bvec4);\"\n            \"uint8_t mix(uint8_t, uint8_t, bool);\"\n            \"u8vec2  mix(u8vec2,  u8vec2,  bvec2);\"\n            \"u8vec3  mix(u8vec3,  u8vec3,  bvec3);\"\n            \"u8vec4  mix(u8vec4,  u8vec4,  bvec4);\"\n\n            \"bvec2 lessThan(i8vec2, i8vec2);\"\n            \"bvec3 lessThan(i8vec3, i8vec3);\"\n            \"bvec4 lessThan(i8vec4, i8vec4);\"\n            \"bvec2 lessThan(u8vec2, u8vec2);\"\n            \"bvec3 lessThan(u8vec3, u8vec3);\"\n            \"bvec4 lessThan(u8vec4, u8vec4);\"\n\n            \"bvec2 lessThanEqual(i8vec2, i8vec2);\"\n            \"bvec3 lessThanEqual(i8vec3, i8vec3);\"\n            \"bvec4 lessThanEqual(i8vec4, i8vec4);\"\n            \"bvec2 lessThanEqual(u8vec2, u8vec2);\"\n            \"bvec3 lessThanEqual(u8vec3, u8vec3);\"\n            \"bvec4 lessThanEqual(u8vec4, u8vec4);\"\n\n            \"bvec2 greaterThan(i8vec2, i8vec2);\"\n            \"bvec3 greaterThan(i8vec3, i8vec3);\"\n            \"bvec4 greaterThan(i8vec4, i8vec4);\"\n            \"bvec2 greaterThan(u8vec2, u8vec2);\"\n            \"bvec3 greaterThan(u8vec3, u8vec3);\"\n            \"bvec4 greaterThan(u8vec4, u8vec4);\"\n\n            \"bvec2 greaterThanEqual(i8vec2, i8vec2);\"\n            \"bvec3 greaterThanEqual(i8vec3, i8vec3);\"\n            \"bvec4 greaterThanEqual(i8vec4, i8vec4);\"\n            \"bvec2 greaterThanEqual(u8vec2, u8vec2);\"\n            \"bvec3 greaterThanEqual(u8vec3, u8vec3);\"\n            \"bvec4 greaterThanEqual(u8vec4, u8vec4);\"\n\n            \"bvec2 equal(i8vec2, i8vec2);\"\n            \"bvec3 equal(i8vec3, i8vec3);\"\n            \"bvec4 equal(i8vec4, i8vec4);\"\n            \"bvec2 equal(u8vec2, u8vec2);\"\n            \"bvec3 equal(u8vec3, u8vec3);\"\n            \"bvec4 equal(u8vec4, u8vec4);\"\n\n            \"bvec2 notEqual(i8vec2, i8vec2);\"\n            \"bvec3 notEqual(i8vec3, i8vec3);\"\n            \"bvec4 notEqual(i8vec4, i8vec4);\"\n            \"bvec2 notEqual(u8vec2, u8vec2);\"\n            \"bvec3 notEqual(u8vec3, u8vec3);\"\n            \"bvec4 notEqual(u8vec4, u8vec4);\"\n\n            \"  int8_t bitfieldExtract(  int8_t, int8_t, int8_t);\"\n            \"i8vec2 bitfieldExtract(i8vec2, int8_t, int8_t);\"\n            \"i8vec3 bitfieldExtract(i8vec3, int8_t, int8_t);\"\n            \"i8vec4 bitfieldExtract(i8vec4, int8_t, int8_t);\"\n\n            \" uint8_t bitfieldExtract( uint8_t, int8_t, int8_t);\"\n            \"u8vec2 bitfieldExtract(u8vec2, int8_t, int8_t);\"\n            \"u8vec3 bitfieldExtract(u8vec3, int8_t, int8_t);\"\n            \"u8vec4 bitfieldExtract(u8vec4, int8_t, int8_t);\"\n\n            \"  int8_t bitfieldInsert(  int8_t base,   int8_t, int8_t, int8_t);\"\n            \"i8vec2 bitfieldInsert(i8vec2 base, i8vec2, int8_t, int8_t);\"\n            \"i8vec3 bitfieldInsert(i8vec3 base, i8vec3, int8_t, int8_t);\"\n            \"i8vec4 bitfieldInsert(i8vec4 base, i8vec4, int8_t, int8_t);\"\n\n            \" uint8_t bitfieldInsert( uint8_t base,  uint8_t, int8_t, int8_t);\"\n            \"u8vec2 bitfieldInsert(u8vec2 base, u8vec2, int8_t, int8_t);\"\n            \"u8vec3 bitfieldInsert(u8vec3 base, u8vec3, int8_t, int8_t);\"\n            \"u8vec4 bitfieldInsert(u8vec4 base, u8vec4, int8_t, int8_t);\"\n\n            \"  int8_t bitCount(  int8_t);\"\n            \"i8vec2 bitCount(i8vec2);\"\n            \"i8vec3 bitCount(i8vec3);\"\n            \"i8vec4 bitCount(i8vec4);\"\n\n            \"  int8_t bitCount( uint8_t);\"\n            \"i8vec2 bitCount(u8vec2);\"\n            \"i8vec3 bitCount(u8vec3);\"\n            \"i8vec4 bitCount(u8vec4);\"\n\n            \"  int8_t findLSB(  int8_t);\"\n            \"i8vec2 findLSB(i8vec2);\"\n            \"i8vec3 findLSB(i8vec3);\"\n            \"i8vec4 findLSB(i8vec4);\"\n\n            \"  int8_t findLSB( uint8_t);\"\n            \"i8vec2 findLSB(u8vec2);\"\n            \"i8vec3 findLSB(u8vec3);\"\n            \"i8vec4 findLSB(u8vec4);\"\n\n            \"  int8_t findMSB(  int8_t);\"\n            \"i8vec2 findMSB(i8vec2);\"\n            \"i8vec3 findMSB(i8vec3);\"\n            \"i8vec4 findMSB(i8vec4);\"\n\n            \"  int8_t findMSB( uint8_t);\"\n            \"i8vec2 findMSB(u8vec2);\"\n            \"i8vec3 findMSB(u8vec3);\"\n            \"i8vec4 findMSB(u8vec4);\"\n\n            \"int16_t abs(int16_t);\"\n            \"i16vec2 abs(i16vec2);\"\n            \"i16vec3 abs(i16vec3);\"\n            \"i16vec4 abs(i16vec4);\"\n\n            \"int16_t sign(int16_t);\"\n            \"i16vec2 sign(i16vec2);\"\n            \"i16vec3 sign(i16vec3);\"\n            \"i16vec4 sign(i16vec4);\"\n\n            \"int16_t min(int16_t x, int16_t y);\"\n            \"i16vec2 min(i16vec2 x, int16_t y);\"\n            \"i16vec3 min(i16vec3 x, int16_t y);\"\n            \"i16vec4 min(i16vec4 x, int16_t y);\"\n            \"i16vec2 min(i16vec2 x, i16vec2 y);\"\n            \"i16vec3 min(i16vec3 x, i16vec3 y);\"\n            \"i16vec4 min(i16vec4 x, i16vec4 y);\"\n\n            \"uint16_t min(uint16_t x, uint16_t y);\"\n            \"u16vec2 min(u16vec2 x, uint16_t y);\"\n            \"u16vec3 min(u16vec3 x, uint16_t y);\"\n            \"u16vec4 min(u16vec4 x, uint16_t y);\"\n            \"u16vec2 min(u16vec2 x, u16vec2 y);\"\n            \"u16vec3 min(u16vec3 x, u16vec3 y);\"\n            \"u16vec4 min(u16vec4 x, u16vec4 y);\"\n\n            \"int16_t max(int16_t x, int16_t y);\"\n            \"i16vec2 max(i16vec2 x, int16_t y);\"\n            \"i16vec3 max(i16vec3 x, int16_t y);\"\n            \"i16vec4 max(i16vec4 x, int16_t y);\"\n            \"i16vec2 max(i16vec2 x, i16vec2 y);\"\n            \"i16vec3 max(i16vec3 x, i16vec3 y);\"\n            \"i16vec4 max(i16vec4 x, i16vec4 y);\"\n\n            \"uint16_t max(uint16_t x, uint16_t y);\"\n            \"u16vec2 max(u16vec2 x, uint16_t y);\"\n            \"u16vec3 max(u16vec3 x, uint16_t y);\"\n            \"u16vec4 max(u16vec4 x, uint16_t y);\"\n            \"u16vec2 max(u16vec2 x, u16vec2 y);\"\n            \"u16vec3 max(u16vec3 x, u16vec3 y);\"\n            \"u16vec4 max(u16vec4 x, u16vec4 y);\"\n\n            \"int16_t    clamp(int16_t x, int16_t minVal, int16_t maxVal);\"\n            \"i16vec2  clamp(i16vec2  x, int16_t minVal, int16_t maxVal);\"\n            \"i16vec3  clamp(i16vec3  x, int16_t minVal, int16_t maxVal);\"\n            \"i16vec4  clamp(i16vec4  x, int16_t minVal, int16_t maxVal);\"\n            \"i16vec2  clamp(i16vec2  x, i16vec2  minVal, i16vec2  maxVal);\"\n            \"i16vec3  clamp(i16vec3  x, i16vec3  minVal, i16vec3  maxVal);\"\n            \"i16vec4  clamp(i16vec4  x, i16vec4  minVal, i16vec4  maxVal);\"\n\n            \"uint16_t   clamp(uint16_t x, uint16_t minVal, uint16_t maxVal);\"\n            \"u16vec2  clamp(u16vec2  x, uint16_t minVal, uint16_t maxVal);\"\n            \"u16vec3  clamp(u16vec3  x, uint16_t minVal, uint16_t maxVal);\"\n            \"u16vec4  clamp(u16vec4  x, uint16_t minVal, uint16_t maxVal);\"\n            \"u16vec2  clamp(u16vec2  x, u16vec2  minVal, u16vec2  maxVal);\"\n            \"u16vec3  clamp(u16vec3  x, u16vec3  minVal, u16vec3  maxVal);\"\n            \"u16vec4  clamp(u16vec4  x, u16vec4  minVal, u16vec4  maxVal);\"\n\n            \"int16_t  mix(int16_t,  int16_t,  bool);\"\n            \"i16vec2  mix(i16vec2,  i16vec2,  bvec2);\"\n            \"i16vec3  mix(i16vec3,  i16vec3,  bvec3);\"\n            \"i16vec4  mix(i16vec4,  i16vec4,  bvec4);\"\n            \"uint16_t mix(uint16_t, uint16_t, bool);\"\n            \"u16vec2  mix(u16vec2,  u16vec2,  bvec2);\"\n            \"u16vec3  mix(u16vec3,  u16vec3,  bvec3);\"\n            \"u16vec4  mix(u16vec4,  u16vec4,  bvec4);\"\n\n            \"float16_t frexp(float16_t, out int16_t);\"\n            \"f16vec2   frexp(f16vec2,   out i16vec2);\"\n            \"f16vec3   frexp(f16vec3,   out i16vec3);\"\n            \"f16vec4   frexp(f16vec4,   out i16vec4);\"\n\n            \"float16_t ldexp(float16_t, int16_t);\"\n            \"f16vec2   ldexp(f16vec2,   i16vec2);\"\n            \"f16vec3   ldexp(f16vec3,   i16vec3);\"\n            \"f16vec4   ldexp(f16vec4,   i16vec4);\"\n\n            \"int16_t halfBitsToInt16(float16_t);\"\n            \"i16vec2 halfBitsToInt16(f16vec2);\"\n            \"i16vec3 halhBitsToInt16(f16vec3);\"\n            \"i16vec4 halfBitsToInt16(f16vec4);\"\n\n            \"uint16_t halfBitsToUint16(float16_t);\"\n            \"u16vec2  halfBitsToUint16(f16vec2);\"\n            \"u16vec3  halfBitsToUint16(f16vec3);\"\n            \"u16vec4  halfBitsToUint16(f16vec4);\"\n\n            \"int16_t float16BitsToInt16(float16_t);\"\n            \"i16vec2 float16BitsToInt16(f16vec2);\"\n            \"i16vec3 float16BitsToInt16(f16vec3);\"\n            \"i16vec4 float16BitsToInt16(f16vec4);\"\n\n            \"uint16_t float16BitsToUint16(float16_t);\"\n            \"u16vec2  float16BitsToUint16(f16vec2);\"\n            \"u16vec3  float16BitsToUint16(f16vec3);\"\n            \"u16vec4  float16BitsToUint16(f16vec4);\"\n\n            \"float16_t int16BitsToFloat16(int16_t);\"\n            \"f16vec2   int16BitsToFloat16(i16vec2);\"\n            \"f16vec3   int16BitsToFloat16(i16vec3);\"\n            \"f16vec4   int16BitsToFloat16(i16vec4);\"\n\n            \"float16_t uint16BitsToFloat16(uint16_t);\"\n            \"f16vec2   uint16BitsToFloat16(u16vec2);\"\n            \"f16vec3   uint16BitsToFloat16(u16vec3);\"\n            \"f16vec4   uint16BitsToFloat16(u16vec4);\"\n\n            \"float16_t int16BitsToHalf(int16_t);\"\n            \"f16vec2   int16BitsToHalf(i16vec2);\"\n            \"f16vec3   int16BitsToHalf(i16vec3);\"\n            \"f16vec4   int16BitsToHalf(i16vec4);\"\n\n            \"float16_t uint16BitsToHalf(uint16_t);\"\n            \"f16vec2   uint16BitsToHalf(u16vec2);\"\n            \"f16vec3   uint16BitsToHalf(u16vec3);\"\n            \"f16vec4   uint16BitsToHalf(u16vec4);\"\n\n            \"int      packInt2x16(i16vec2);\"\n            \"uint     packUint2x16(u16vec2);\"\n            \"int64_t  packInt4x16(i16vec4);\"\n            \"uint64_t packUint4x16(u16vec4);\"\n            \"i16vec2  unpackInt2x16(int);\"\n            \"u16vec2  unpackUint2x16(uint);\"\n            \"i16vec4  unpackInt4x16(int64_t);\"\n            \"u16vec4  unpackUint4x16(uint64_t);\"\n\n            \"bvec2 lessThan(i16vec2, i16vec2);\"\n            \"bvec3 lessThan(i16vec3, i16vec3);\"\n            \"bvec4 lessThan(i16vec4, i16vec4);\"\n            \"bvec2 lessThan(u16vec2, u16vec2);\"\n            \"bvec3 lessThan(u16vec3, u16vec3);\"\n            \"bvec4 lessThan(u16vec4, u16vec4);\"\n\n            \"bvec2 lessThanEqual(i16vec2, i16vec2);\"\n            \"bvec3 lessThanEqual(i16vec3, i16vec3);\"\n            \"bvec4 lessThanEqual(i16vec4, i16vec4);\"\n            \"bvec2 lessThanEqual(u16vec2, u16vec2);\"\n            \"bvec3 lessThanEqual(u16vec3, u16vec3);\"\n            \"bvec4 lessThanEqual(u16vec4, u16vec4);\"\n\n            \"bvec2 greaterThan(i16vec2, i16vec2);\"\n            \"bvec3 greaterThan(i16vec3, i16vec3);\"\n            \"bvec4 greaterThan(i16vec4, i16vec4);\"\n            \"bvec2 greaterThan(u16vec2, u16vec2);\"\n            \"bvec3 greaterThan(u16vec3, u16vec3);\"\n            \"bvec4 greaterThan(u16vec4, u16vec4);\"\n\n            \"bvec2 greaterThanEqual(i16vec2, i16vec2);\"\n            \"bvec3 greaterThanEqual(i16vec3, i16vec3);\"\n            \"bvec4 greaterThanEqual(i16vec4, i16vec4);\"\n            \"bvec2 greaterThanEqual(u16vec2, u16vec2);\"\n            \"bvec3 greaterThanEqual(u16vec3, u16vec3);\"\n            \"bvec4 greaterThanEqual(u16vec4, u16vec4);\"\n\n            \"bvec2 equal(i16vec2, i16vec2);\"\n            \"bvec3 equal(i16vec3, i16vec3);\"\n            \"bvec4 equal(i16vec4, i16vec4);\"\n            \"bvec2 equal(u16vec2, u16vec2);\"\n            \"bvec3 equal(u16vec3, u16vec3);\"\n            \"bvec4 equal(u16vec4, u16vec4);\"\n\n            \"bvec2 notEqual(i16vec2, i16vec2);\"\n            \"bvec3 notEqual(i16vec3, i16vec3);\"\n            \"bvec4 notEqual(i16vec4, i16vec4);\"\n            \"bvec2 notEqual(u16vec2, u16vec2);\"\n            \"bvec3 notEqual(u16vec3, u16vec3);\"\n            \"bvec4 notEqual(u16vec4, u16vec4);\"\n\n            \"  int16_t bitfieldExtract(  int16_t, int16_t, int16_t);\"\n            \"i16vec2 bitfieldExtract(i16vec2, int16_t, int16_t);\"\n            \"i16vec3 bitfieldExtract(i16vec3, int16_t, int16_t);\"\n            \"i16vec4 bitfieldExtract(i16vec4, int16_t, int16_t);\"\n\n            \" uint16_t bitfieldExtract( uint16_t, int16_t, int16_t);\"\n            \"u16vec2 bitfieldExtract(u16vec2, int16_t, int16_t);\"\n            \"u16vec3 bitfieldExtract(u16vec3, int16_t, int16_t);\"\n            \"u16vec4 bitfieldExtract(u16vec4, int16_t, int16_t);\"\n\n            \"  int16_t bitfieldInsert(  int16_t base,   int16_t, int16_t, int16_t);\"\n            \"i16vec2 bitfieldInsert(i16vec2 base, i16vec2, int16_t, int16_t);\"\n            \"i16vec3 bitfieldInsert(i16vec3 base, i16vec3, int16_t, int16_t);\"\n            \"i16vec4 bitfieldInsert(i16vec4 base, i16vec4, int16_t, int16_t);\"\n\n            \" uint16_t bitfieldInsert( uint16_t base,  uint16_t, int16_t, int16_t);\"\n            \"u16vec2 bitfieldInsert(u16vec2 base, u16vec2, int16_t, int16_t);\"\n            \"u16vec3 bitfieldInsert(u16vec3 base, u16vec3, int16_t, int16_t);\"\n            \"u16vec4 bitfieldInsert(u16vec4 base, u16vec4, int16_t, int16_t);\"\n\n            \"  int16_t bitCount(  int16_t);\"\n            \"i16vec2 bitCount(i16vec2);\"\n            \"i16vec3 bitCount(i16vec3);\"\n            \"i16vec4 bitCount(i16vec4);\"\n\n            \"  int16_t bitCount( uint16_t);\"\n            \"i16vec2 bitCount(u16vec2);\"\n            \"i16vec3 bitCount(u16vec3);\"\n            \"i16vec4 bitCount(u16vec4);\"\n\n            \"  int16_t findLSB(  int16_t);\"\n            \"i16vec2 findLSB(i16vec2);\"\n            \"i16vec3 findLSB(i16vec3);\"\n            \"i16vec4 findLSB(i16vec4);\"\n\n            \"  int16_t findLSB( uint16_t);\"\n            \"i16vec2 findLSB(u16vec2);\"\n            \"i16vec3 findLSB(u16vec3);\"\n            \"i16vec4 findLSB(u16vec4);\"\n\n            \"  int16_t findMSB(  int16_t);\"\n            \"i16vec2 findMSB(i16vec2);\"\n            \"i16vec3 findMSB(i16vec3);\"\n            \"i16vec4 findMSB(i16vec4);\"\n\n            \"  int16_t findMSB( uint16_t);\"\n            \"i16vec2 findMSB(u16vec2);\"\n            \"i16vec3 findMSB(u16vec3);\"\n            \"i16vec4 findMSB(u16vec4);\"\n\n            \"int16_t  pack16(i8vec2);\"\n            \"uint16_t pack16(u8vec2);\"\n            \"int32_t  pack32(i8vec4);\"\n            \"uint32_t pack32(u8vec4);\"\n            \"int32_t  pack32(i16vec2);\"\n            \"uint32_t pack32(u16vec2);\"\n            \"int64_t  pack64(i16vec4);\"\n            \"uint64_t pack64(u16vec4);\"\n            \"int64_t  pack64(i32vec2);\"\n            \"uint64_t pack64(u32vec2);\"\n\n            \"i8vec2   unpack8(int16_t);\"\n            \"u8vec2   unpack8(uint16_t);\"\n            \"i8vec4   unpack8(int32_t);\"\n            \"u8vec4   unpack8(uint32_t);\"\n            \"i16vec2  unpack16(int32_t);\"\n            \"u16vec2  unpack16(uint32_t);\"\n            \"i16vec4  unpack16(int64_t);\"\n            \"u16vec4  unpack16(uint64_t);\"\n            \"i32vec2  unpack32(int64_t);\"\n            \"u32vec2  unpack32(uint64_t);\"\n\n            // GL_EXT_expect_assume\n            \"int8_t expectEXT(int8_t, int8_t);\"\n            \"i8vec2 expectEXT(i8vec2, i8vec2);\"\n            \"i8vec3 expectEXT(i8vec3, i8vec3);\"\n            \"i8vec4 expectEXT(i8vec4, i8vec4);\"\n\n            \"uint8_t expectEXT(uint8_t, uint8_t);\"\n            \"u8vec2 expectEXT(u8vec2, u8vec2);\"\n            \"u8vec3 expectEXT(u8vec3, u8vec3);\"\n            \"u8vec4 expectEXT(u8vec4, u8vec4);\"\n\n            \"int16_t expectEXT(int16_t, int16_t);\"\n            \"i16vec2 expectEXT(i16vec2, i16vec2);\"\n            \"i16vec3 expectEXT(i16vec3, i16vec3);\"\n            \"i16vec4 expectEXT(i16vec4, i16vec4);\"\n\n            \"uint16_t expectEXT(uint16_t, uint16_t);\"\n            \"u16vec2 expectEXT(u16vec2, u16vec2);\"\n            \"u16vec3 expectEXT(u16vec3, u16vec3);\"\n            \"u16vec4 expectEXT(u16vec4, u16vec4);\"\n\n            \"int64_t expectEXT(int64_t, int64_t);\"\n            \"i64vec2 expectEXT(i64vec2, i64vec2);\"\n            \"i64vec3 expectEXT(i64vec3, i64vec3);\"\n            \"i64vec4 expectEXT(i64vec4, i64vec4);\"\n\n            \"uint64_t expectEXT(uint64_t, uint64_t);\"\n            \"u64vec2 expectEXT(u64vec2, u64vec2);\"\n            \"u64vec3 expectEXT(u64vec3, u64vec3);\"\n            \"u64vec4 expectEXT(u64vec4, u64vec4);\"\n            \"\\n\");\n    }\n\n    // Builtins for GL_EXT_texture_shadow_lod\n    if ((profile == EEsProfile && version >= 300) || ((profile != EEsProfile && version >= 130))) { \n        commonBuiltins.append(\n            \"float texture(sampler2DArrayShadow, vec4, float);\"\n            \"float texture(samplerCubeArrayShadow, vec4, float, float);\"\n            \"float textureLod(sampler2DArrayShadow, vec4, float);\"\n            \"float textureLod(samplerCubeShadow, vec4, float);\"\n            \"float textureLod(samplerCubeArrayShadow, vec4, float, float);\"\n            \"float textureLodOffset(sampler2DArrayShadow, vec4, float, ivec2);\"\n            \"float textureOffset(sampler2DArrayShadow, vec4 , ivec2, float);\"\n            \"\\n\");\n    }\n\n    if (profile != EEsProfile && version >= 450) {\n        stageBuiltins[EShLangFragment].append(derivativesAndControl64bits);\n        stageBuiltins[EShLangFragment].append(\n            \"float64_t interpolateAtCentroid(float64_t);\"\n            \"f64vec2   interpolateAtCentroid(f64vec2);\"\n            \"f64vec3   interpolateAtCentroid(f64vec3);\"\n            \"f64vec4   interpolateAtCentroid(f64vec4);\"\n\n            \"float64_t interpolateAtSample(float64_t, int);\"\n            \"f64vec2   interpolateAtSample(f64vec2,   int);\"\n            \"f64vec3   interpolateAtSample(f64vec3,   int);\"\n            \"f64vec4   interpolateAtSample(f64vec4,   int);\"\n\n            \"float64_t interpolateAtOffset(float64_t, f64vec2);\"\n            \"f64vec2   interpolateAtOffset(f64vec2,   f64vec2);\"\n            \"f64vec3   interpolateAtOffset(f64vec3,   f64vec2);\"\n            \"f64vec4   interpolateAtOffset(f64vec4,   f64vec2);\"\n\n            \"\\n\");\n\n    }\n\n    // GL_EXT_expect_assume\n    if ((profile == EEsProfile && version >= 310) ||\n         ((profile != EEsProfile && version >= 140))) {\n        commonBuiltins.append(\n            \"void assumeEXT(bool);\"\n\n            \"bool expectEXT(bool, bool);\"\n            \"bvec2 expectEXT(bvec2, bvec2);\"\n            \"bvec3 expectEXT(bvec3, bvec3);\"\n            \"bvec4 expectEXT(bvec4, bvec4);\"\n\n            \"int expectEXT(int, int);\"\n            \"ivec2 expectEXT(ivec2, ivec2);\"\n            \"ivec3 expectEXT(ivec3, ivec3);\"\n            \"ivec4 expectEXT(ivec4, ivec4);\"\n\n            \"uint expectEXT(uint, uint);\"\n            \"uvec2 expectEXT(uvec2, uvec2);\"\n            \"uvec3 expectEXT(uvec3, uvec3);\"\n            \"uvec4 expectEXT(uvec4, uvec4);\"\n            \"\\n\");\n    }\n\n    // QCOM_image_processing\n    if ((profile == EEsProfile && version >= 310) ||\n         (profile != EEsProfile && version >= 140)) {\n        commonBuiltins.append(\n           \"vec4 textureWeightedQCOM(sampler2D, vec2, sampler2DArray);\"\n           \"vec4 textureWeightedQCOM(sampler2D, vec2, sampler1DArray);\"\n           \"vec4 textureBoxFilterQCOM(sampler2D, vec2, vec2);\"\n           \"vec4 textureBlockMatchSADQCOM(sampler2D, uvec2, sampler2D, uvec2, uvec2);\"\n           \"vec4 textureBlockMatchSSDQCOM(sampler2D, uvec2, sampler2D, uvec2, uvec2);\"\n\n           \"vec4 textureBlockMatchWindowSSDQCOM(sampler2D, uvec2, sampler2D, uvec2, uvec2);\"\n           \"vec4 textureBlockMatchWindowSADQCOM(sampler2D, uvec2, sampler2D, uvec2, uvec2);\"\n           \"vec4 textureBlockMatchGatherSSDQCOM(sampler2D, uvec2, sampler2D, uvec2, uvec2);\"\n           \"vec4 textureBlockMatchGatherSADQCOM(sampler2D, uvec2, sampler2D, uvec2, uvec2);\"\n           \"\\n\");\n    }\n\n    //============================================================================\n    //\n    // Prototypes for built-in functions seen by vertex shaders only.\n    // (Except legacy lod functions, where it depends which release they are\n    // vertex only.)\n    //\n    //============================================================================\n\n    //\n    // Geometric Functions.\n    //\n    if (spvVersion.vulkan == 0 && IncludeLegacy(version, profile, spvVersion))\n        stageBuiltins[EShLangVertex].append(\"vec4 ftransform();\");\n\n    //\n    // Original-style texture Functions with lod.\n    //\n    TString* s;\n    if (version == 100)\n        s = &stageBuiltins[EShLangVertex];\n    else\n        s = &commonBuiltins;\n    if ((profile == EEsProfile && version == 100) ||\n         profile == ECompatibilityProfile ||\n        (profile == ECoreProfile && version < 420) ||\n         profile == ENoProfile) {\n        if (spvVersion.spv == 0) {\n            s->append(\n                \"vec4 texture2DLod(sampler2D, vec2, float);\"         // GL_ARB_shader_texture_lod\n                \"vec4 texture2DProjLod(sampler2D, vec3, float);\"     // GL_ARB_shader_texture_lod\n                \"vec4 texture2DProjLod(sampler2D, vec4, float);\"     // GL_ARB_shader_texture_lod\n                \"vec4 texture3DLod(sampler3D, vec3, float);\"         // GL_ARB_shader_texture_lod  // OES_texture_3D, but caught by keyword check\n                \"vec4 texture3DProjLod(sampler3D, vec4, float);\"     // GL_ARB_shader_texture_lod  // OES_texture_3D, but caught by keyword check\n                \"vec4 textureCubeLod(samplerCube, vec3, float);\"     // GL_ARB_shader_texture_lod\n\n                \"\\n\");\n        }\n    }\n    if ( profile == ECompatibilityProfile ||\n        (profile == ECoreProfile && version < 420) ||\n         profile == ENoProfile) {\n        if (spvVersion.spv == 0) {\n            s->append(\n                \"vec4 texture1DLod(sampler1D, float, float);\"                          // GL_ARB_shader_texture_lod\n                \"vec4 texture1DProjLod(sampler1D, vec2, float);\"                       // GL_ARB_shader_texture_lod\n                \"vec4 texture1DProjLod(sampler1D, vec4, float);\"                       // GL_ARB_shader_texture_lod\n                \"vec4 shadow1DLod(sampler1DShadow, vec3, float);\"                      // GL_ARB_shader_texture_lod\n                \"vec4 shadow2DLod(sampler2DShadow, vec3, float);\"                      // GL_ARB_shader_texture_lod\n                \"vec4 shadow1DProjLod(sampler1DShadow, vec4, float);\"                  // GL_ARB_shader_texture_lod\n                \"vec4 shadow2DProjLod(sampler2DShadow, vec4, float);\"                  // GL_ARB_shader_texture_lod\n\n                \"vec4 texture1DGradARB(sampler1D, float, float, float);\"               // GL_ARB_shader_texture_lod\n                \"vec4 texture1DProjGradARB(sampler1D, vec2, float, float);\"            // GL_ARB_shader_texture_lod\n                \"vec4 texture1DProjGradARB(sampler1D, vec4, float, float);\"            // GL_ARB_shader_texture_lod\n                \"vec4 texture2DGradARB(sampler2D, vec2, vec2, vec2);\"                  // GL_ARB_shader_texture_lod\n                \"vec4 texture2DProjGradARB(sampler2D, vec3, vec2, vec2);\"              // GL_ARB_shader_texture_lod\n                \"vec4 texture2DProjGradARB(sampler2D, vec4, vec2, vec2);\"              // GL_ARB_shader_texture_lod\n                \"vec4 texture3DGradARB(sampler3D, vec3, vec3, vec3);\"                  // GL_ARB_shader_texture_lod\n                \"vec4 texture3DProjGradARB(sampler3D, vec4, vec3, vec3);\"              // GL_ARB_shader_texture_lod\n                \"vec4 textureCubeGradARB(samplerCube, vec3, vec3, vec3);\"              // GL_ARB_shader_texture_lod\n                \"vec4 shadow1DGradARB(sampler1DShadow, vec3, float, float);\"           // GL_ARB_shader_texture_lod\n                \"vec4 shadow1DProjGradARB( sampler1DShadow, vec4, float, float);\"      // GL_ARB_shader_texture_lod\n                \"vec4 shadow2DGradARB(sampler2DShadow, vec3, vec2, vec2);\"             // GL_ARB_shader_texture_lod\n                \"vec4 shadow2DProjGradARB( sampler2DShadow, vec4, vec2, vec2);\"        // GL_ARB_shader_texture_lod\n                \"vec4 texture2DRectGradARB(sampler2DRect, vec2, vec2, vec2);\"          // GL_ARB_shader_texture_lod\n                \"vec4 texture2DRectProjGradARB( sampler2DRect, vec3, vec2, vec2);\"     // GL_ARB_shader_texture_lod\n                \"vec4 texture2DRectProjGradARB( sampler2DRect, vec4, vec2, vec2);\"     // GL_ARB_shader_texture_lod\n                \"vec4 shadow2DRectGradARB( sampler2DRectShadow, vec3, vec2, vec2);\"    // GL_ARB_shader_texture_lod\n                \"vec4 shadow2DRectProjGradARB(sampler2DRectShadow, vec4, vec2, vec2);\" // GL_ARB_shader_texture_lod\n\n                \"\\n\");\n        }\n    }\n\n    if ((profile != EEsProfile && version >= 150) ||\n        (profile == EEsProfile && version >= 310)) {\n        //============================================================================\n        //\n        // Prototypes for built-in functions seen by geometry shaders only.\n        //\n        //============================================================================\n        if (profile != EEsProfile && version >= 150) {\n            stageBuiltins[EShLangGeometry].append(\n                \"void EmitStreamVertex(int);\"\n                \"void EndStreamPrimitive(int);\"\n                );\n        }\n        stageBuiltins[EShLangGeometry].append(\n            \"void EmitVertex();\"\n            \"void EndPrimitive();\"\n            \"\\n\");\n    }\n\n    //============================================================================\n    //\n    // Prototypes for all control functions.\n    //\n    //============================================================================\n    bool esBarrier = (profile == EEsProfile && version >= 310);\n    if ((profile != EEsProfile && version >= 150) || esBarrier)\n        stageBuiltins[EShLangTessControl].append(\n            \"void barrier();\"\n            );\n    if ((profile != EEsProfile && version >= 420) || esBarrier)\n        stageBuiltins[EShLangCompute].append(\n            \"void barrier();\"\n            );\n    if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {\n        stageBuiltins[EShLangMesh].append(\n            \"void barrier();\"\n            );\n        stageBuiltins[EShLangTask].append(\n            \"void barrier();\"\n            );\n    }\n    if ((profile != EEsProfile && version >= 130) || esBarrier)\n        commonBuiltins.append(\n            \"void memoryBarrier();\"\n            );\n    if ((profile != EEsProfile && version >= 420) || esBarrier) {\n        commonBuiltins.append(\n            \"void memoryBarrierBuffer();\"\n            );\n        stageBuiltins[EShLangCompute].append(\n            \"void memoryBarrierShared();\"\n            \"void groupMemoryBarrier();\"\n            );\n    }\n    if ((profile != EEsProfile && version >= 420) || esBarrier) {\n        if (spvVersion.vulkan == 0 || spvVersion.vulkanRelaxed) {\n            commonBuiltins.append(\"void memoryBarrierAtomicCounter();\");\n        }\n        commonBuiltins.append(\"void memoryBarrierImage();\");\n    }\n    if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {\n        stageBuiltins[EShLangMesh].append(\n            \"void memoryBarrierShared();\"\n            \"void groupMemoryBarrier();\"\n        );\n        stageBuiltins[EShLangTask].append(\n            \"void memoryBarrierShared();\"\n            \"void groupMemoryBarrier();\"\n        );\n    }\n\n    commonBuiltins.append(\"void controlBarrier(int, int, int, int);\\n\"\n                          \"void memoryBarrier(int, int, int);\\n\");\n\n    commonBuiltins.append(\"void debugPrintfEXT();\\n\");\n\n    if (profile != EEsProfile && version >= 450) {\n        // coopMatStoreNV perhaps ought to have \"out\" on the buf parameter, but\n        // adding it introduces undesirable tempArgs on the stack. What we want\n        // is more like \"buf\" thought of as a pointer value being an in parameter.\n        stageBuiltins[EShLangCompute].append(\n            \"void coopMatLoadNV(out fcoopmatNV m, volatile coherent nontemporal float16_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out fcoopmatNV m, volatile coherent nontemporal float[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out fcoopmatNV m, volatile coherent nontemporal uint8_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out fcoopmatNV m, volatile coherent nontemporal uint16_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out fcoopmatNV m, volatile coherent nontemporal uint[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out fcoopmatNV m, volatile coherent nontemporal uint64_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out fcoopmatNV m, volatile coherent nontemporal uvec2[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out fcoopmatNV m, volatile coherent nontemporal uvec4[] buf, uint element, uint stride, bool colMajor);\\n\"\n\n            \"void coopMatStoreNV(fcoopmatNV m, volatile coherent nontemporal float16_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(fcoopmatNV m, volatile coherent nontemporal float[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(fcoopmatNV m, volatile coherent nontemporal float64_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(fcoopmatNV m, volatile coherent nontemporal uint8_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(fcoopmatNV m, volatile coherent nontemporal uint16_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(fcoopmatNV m, volatile coherent nontemporal uint[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(fcoopmatNV m, volatile coherent nontemporal uint64_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(fcoopmatNV m, volatile coherent nontemporal uvec2[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(fcoopmatNV m, volatile coherent nontemporal uvec4[] buf, uint element, uint stride, bool colMajor);\\n\"\n\n            \"fcoopmatNV coopMatMulAddNV(fcoopmatNV A, fcoopmatNV B, fcoopmatNV C);\\n\"\n            \"void coopMatLoadNV(out icoopmatNV m, volatile coherent nontemporal int8_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out icoopmatNV m, volatile coherent nontemporal int16_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out icoopmatNV m, volatile coherent nontemporal int[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out icoopmatNV m, volatile coherent nontemporal int64_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out icoopmatNV m, volatile coherent nontemporal ivec2[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out icoopmatNV m, volatile coherent nontemporal ivec4[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out icoopmatNV m, volatile coherent nontemporal uint8_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out icoopmatNV m, volatile coherent nontemporal uint16_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out icoopmatNV m, volatile coherent nontemporal uint[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out icoopmatNV m, volatile coherent nontemporal uint64_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out icoopmatNV m, volatile coherent nontemporal uvec2[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out icoopmatNV m, volatile coherent nontemporal uvec4[] buf, uint element, uint stride, bool colMajor);\\n\"\n\n            \"void coopMatLoadNV(out ucoopmatNV m, volatile coherent nontemporal int8_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out ucoopmatNV m, volatile coherent nontemporal int16_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out ucoopmatNV m, volatile coherent nontemporal int[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out ucoopmatNV m, volatile coherent nontemporal int64_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out ucoopmatNV m, volatile coherent nontemporal ivec2[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out ucoopmatNV m, volatile coherent nontemporal ivec4[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out ucoopmatNV m, volatile coherent nontemporal uint8_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out ucoopmatNV m, volatile coherent nontemporal uint16_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out ucoopmatNV m, volatile coherent nontemporal uint[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out ucoopmatNV m, volatile coherent nontemporal uint64_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out ucoopmatNV m, volatile coherent nontemporal uvec2[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatLoadNV(out ucoopmatNV m, volatile coherent nontemporal uvec4[] buf, uint element, uint stride, bool colMajor);\\n\"\n\n            \"void coopMatStoreNV(icoopmatNV m, volatile coherent nontemporal int8_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(icoopmatNV m, volatile coherent nontemporal int16_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(icoopmatNV m, volatile coherent nontemporal int[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(icoopmatNV m, volatile coherent nontemporal int64_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(icoopmatNV m, volatile coherent nontemporal ivec2[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(icoopmatNV m, volatile coherent nontemporal ivec4[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(icoopmatNV m, volatile coherent nontemporal uint8_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(icoopmatNV m, volatile coherent nontemporal uint16_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(icoopmatNV m, volatile coherent nontemporal uint[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(icoopmatNV m, volatile coherent nontemporal uint64_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(icoopmatNV m, volatile coherent nontemporal uvec2[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(icoopmatNV m, volatile coherent nontemporal uvec4[] buf, uint element, uint stride, bool colMajor);\\n\"\n\n            \"void coopMatStoreNV(ucoopmatNV m, volatile coherent nontemporal int8_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(ucoopmatNV m, volatile coherent nontemporal int16_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(ucoopmatNV m, volatile coherent nontemporal int[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(ucoopmatNV m, volatile coherent nontemporal int64_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(ucoopmatNV m, volatile coherent nontemporal ivec2[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(ucoopmatNV m, volatile coherent nontemporal ivec4[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(ucoopmatNV m, volatile coherent nontemporal uint8_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(ucoopmatNV m, volatile coherent nontemporal uint16_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(ucoopmatNV m, volatile coherent nontemporal uint[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(ucoopmatNV m, volatile coherent nontemporal uint64_t[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(ucoopmatNV m, volatile coherent nontemporal uvec2[] buf, uint element, uint stride, bool colMajor);\\n\"\n            \"void coopMatStoreNV(ucoopmatNV m, volatile coherent nontemporal uvec4[] buf, uint element, uint stride, bool colMajor);\\n\"\n\n            \"icoopmatNV coopMatMulAddNV(icoopmatNV A, icoopmatNV B, icoopmatNV C);\\n\"\n            \"ucoopmatNV coopMatMulAddNV(ucoopmatNV A, ucoopmatNV B, ucoopmatNV C);\\n\"\n            );\n\n        std::stringstream cooperativeMatrixFuncs;\n\n        {\n            static const char *allTypes[] =\n            {\n                \"float\", \"vec2\", \"vec4\",\n                \"float16_t\", \"f16vec2\", \"f16vec4\",\n                \"bfloat16_t\", \"bf16vec2\", \"bf16vec4\",\n                \"floate5m2_t\", \"fe5m2vec2\", \"fe5m2vec4\",\n                \"floate4m3_t\", \"fe4m3vec2\", \"fe4m3vec4\",\n                \"double\", \"dvec2\", \"dvec4\",\n                \"int8_t\", \"i8vec2\", \"i8vec4\",\n                \"int16_t\", \"i16vec2\", \"i16vec4\",\n                \"int\", \"ivec2\", \"ivec4\",\n                \"int64_t\", \"i64vec2\", \"i64vec4\",\n                \"uint8_t\", \"u8vec2\", \"u8vec4\",\n                \"uint16_t\", \"u16vec2\", \"u16vec4\",\n                \"uint\", \"uvec2\", \"uvec4\",\n                \"uint64_t\", \"u64vec2\", \"u64vec4\",\n            };\n            for (auto t : allTypes) {\n                cooperativeMatrixFuncs << \"void coopMatLoad(out coopmat m, volatile coherent nontemporal \" << t << \"[] buf, uint element, uint stride, int matrixLayout);\\n\";\n                cooperativeMatrixFuncs << \"void coopMatStore(coopmat m, volatile coherent nontemporal \" << t << \"[] buf, uint element, uint stride, int matrixLayout);\\n\";\n            }\n            // Just use uint8_t for buffer type, we have special matching rules to allow any conversion\n            cooperativeMatrixFuncs << \"void coopMatLoadTensorNV(inout coopmat m, volatile coherent nontemporal uint8_t[] buf, uint element, tensorLayoutNV t);\\n\";\n            cooperativeMatrixFuncs << \"void coopMatLoadTensorNV(inout coopmat m, volatile coherent nontemporal uint8_t[] buf, uint element, tensorLayoutNV t, tensorViewNV v);\\n\";\n            cooperativeMatrixFuncs << \"void coopMatLoadTensorNV(inout coopmat m, volatile coherent nontemporal uint8_t[] buf, uint element, tensorLayoutNV t, __function f);\\n\";\n            cooperativeMatrixFuncs << \"void coopMatLoadTensorNV(inout coopmat m, volatile coherent nontemporal uint8_t[] buf, uint element, tensorLayoutNV t, tensorViewNV v, __function f);\\n\";\n            cooperativeMatrixFuncs << \"void coopMatStoreTensorNV(coopmat m, volatile coherent nontemporal uint8_t[] buf, uint element, tensorLayoutNV t);\\n\";\n            cooperativeMatrixFuncs << \"void coopMatStoreTensorNV(coopmat m, volatile coherent nontemporal uint8_t[] buf, uint element, tensorLayoutNV t, tensorViewNV v);\\n\";\n        }\n\n        cooperativeMatrixFuncs <<\n            \"coopmat coopMatMulAdd(coopmat A, coopmat B, coopmat C);\\n\"\n            \"coopmat coopMatMulAdd(coopmat A, coopmat B, coopmat C, int matrixOperands);\\n\";\n\n        commonBuiltins.append(cooperativeMatrixFuncs.str().c_str());\n\n        commonBuiltins.append(\n            \"const int gl_MatrixUseA = 0;\\n\"\n            \"const int gl_MatrixUseB = 1;\\n\"\n            \"const int gl_MatrixUseAccumulator = 2;\\n\"\n            \"const int gl_MatrixOperandsSaturatingAccumulation = 0x10;\\n\"\n            \"const int gl_CooperativeMatrixLayoutRowMajor = 0;\\n\"\n            \"const int gl_CooperativeMatrixLayoutColumnMajor = 1;\\n\"\n            \"const int gl_CooperativeMatrixLayoutRowBlockedInterleavedARM = 4202;\\n\"\n            \"const int gl_CooperativeMatrixLayoutColumnBlockedInterleavedARM = 4203;\\n\"\n            \"\\n\"\n            );\n\n        commonBuiltins.append(\n            \"void coopMatTransposeNV(out coopmat, coopmat);\"\n            \"void coopMatReduceNV(out coopmat, coopmat, int, __function);\"\n            \"void coopMatPerElementNV();\"\n        );\n\n        commonBuiltins.append(\n            \"const int gl_CooperativeMatrixReduceRowNV = 0x1;\\n\"\n            \"const int gl_CooperativeMatrixReduceColumnNV = 0x2;\\n\"\n            \"const int gl_CooperativeMatrixReduceRowAndColumnNV = 0x3;\\n\"\n            \"const int gl_CooperativeMatrixReduce2x2NV = 0x4;\\n\"\n            \"\\n\"\n            );\n\n        commonBuiltins.append(\n            \"const int gl_CooperativeMatrixClampModeUndefinedNV = 0x0;\\n\"\n            \"const int gl_CooperativeMatrixClampModeConstantNV = 0x1;\\n\"\n            \"const int gl_CooperativeMatrixClampModeClampToEdgeNV = 0x2;\\n\"\n            \"const int gl_CooperativeMatrixClampModeRepeatNV = 0x3;\\n\"\n            \"const int gl_CooperativeMatrixClampModeMirrorRepeatNV = 0x4;\\n\"\n            \"\\n\"\n            );\n\n        commonBuiltins.append(\n            \"tensorLayoutNV createTensorLayoutNV(uint Dim);\\n\"\n            \"tensorLayoutNV createTensorLayoutNV(uint Dim, uint Mode);\\n\"\n\n            \"tensorLayoutNV setTensorLayoutBlockSizeNV(tensorLayoutNV t, uint blockSize0);\\n\"\n            \"tensorLayoutNV setTensorLayoutBlockSizeNV(tensorLayoutNV t, uint blockSize0, uint blockSize1);\\n\"\n            \"tensorLayoutNV setTensorLayoutBlockSizeNV(tensorLayoutNV t, uint blockSize0, uint blockSize1, uint blockSize2);\\n\"\n            \"tensorLayoutNV setTensorLayoutBlockSizeNV(tensorLayoutNV t, uint blockSize0, uint blockSize1, uint blockSize2, uint blockSize3);\\n\"\n            \"tensorLayoutNV setTensorLayoutBlockSizeNV(tensorLayoutNV t, uint blockSize0, uint blockSize1, uint blockSize2, uint blockSize3, uint blockSize4);\\n\"\n\n            \"tensorLayoutNV setTensorLayoutDimensionNV(tensorLayoutNV t, uint dim0);\\n\"\n            \"tensorLayoutNV setTensorLayoutDimensionNV(tensorLayoutNV t, uint dim0, uint dim1);\\n\"\n            \"tensorLayoutNV setTensorLayoutDimensionNV(tensorLayoutNV t, uint dim0, uint dim1, uint dim2);\\n\"\n            \"tensorLayoutNV setTensorLayoutDimensionNV(tensorLayoutNV t, uint dim0, uint dim1, uint dim2, uint dim3);\\n\"\n            \"tensorLayoutNV setTensorLayoutDimensionNV(tensorLayoutNV t, uint dim0, uint dim1, uint dim2, uint dim3, uint dim4);\\n\"\n\n            \"tensorLayoutNV setTensorLayoutStrideNV(tensorLayoutNV t, uint stride0);\\n\"\n            \"tensorLayoutNV setTensorLayoutStrideNV(tensorLayoutNV t, uint stride0, uint stride1);\\n\"\n            \"tensorLayoutNV setTensorLayoutStrideNV(tensorLayoutNV t, uint stride0, uint stride1, uint stride2);\\n\"\n            \"tensorLayoutNV setTensorLayoutStrideNV(tensorLayoutNV t, uint stride0, uint stride1, uint stride2, uint stride3);\\n\"\n            \"tensorLayoutNV setTensorLayoutStrideNV(tensorLayoutNV t, uint stride0, uint stride1, uint stride2, uint stride3, uint stride4);\\n\"\n\n            \"tensorLayoutNV sliceTensorLayoutNV(tensorLayoutNV t, uint offset0, uint span0);\\n\"\n            \"tensorLayoutNV sliceTensorLayoutNV(tensorLayoutNV t, uint offset0, uint span0, uint offset1, uint span1);\\n\"\n            \"tensorLayoutNV sliceTensorLayoutNV(tensorLayoutNV t, uint offset0, uint span0, uint offset1, uint span1, uint offset2, uint span2);\\n\"\n            \"tensorLayoutNV sliceTensorLayoutNV(tensorLayoutNV t, uint offset0, uint span0, uint offset1, uint span1, uint offset2, uint span2, uint offset3, uint span3);\\n\"\n            \"tensorLayoutNV sliceTensorLayoutNV(tensorLayoutNV t, uint offset0, uint span0, uint offset1, uint span1, uint offset2, uint span2, uint offset3, uint span3, uint offset4, uint span4);\\n\"\n\n            \"tensorLayoutNV setTensorLayoutClampValueNV(tensorLayoutNV t, uint value);\\n\"\n\n            \"tensorViewNV createTensorViewNV(uint Dim);\\n\"\n            \"tensorViewNV createTensorViewNV(uint Dim, bool HasDimensions);\\n\"\n            \"tensorViewNV createTensorViewNV(uint Dim, bool HasDimensions, uint p0);\\n\"\n            \"tensorViewNV createTensorViewNV(uint Dim, bool HasDimensions, uint p0, uint p1);\\n\"\n            \"tensorViewNV createTensorViewNV(uint Dim, bool HasDimensions, uint p0, uint p1, uint p2);\\n\"\n            \"tensorViewNV createTensorViewNV(uint Dim, bool HasDimensions, uint p0, uint p1, uint p2, uint p3);\\n\"\n            \"tensorViewNV createTensorViewNV(uint Dim, bool HasDimensions, uint p0, uint p1, uint p2, uint p3, uint p4);\\n\"\n\n            \"tensorViewNV setTensorViewDimensionsNV(tensorViewNV v, uint dim0);\\n\"\n            \"tensorViewNV setTensorViewDimensionsNV(tensorViewNV v, uint dim0, uint dim1);\\n\"\n            \"tensorViewNV setTensorViewDimensionsNV(tensorViewNV v, uint dim0, uint dim1, uint dim2);\\n\"\n            \"tensorViewNV setTensorViewDimensionsNV(tensorViewNV v, uint dim0, uint dim1, uint dim2, uint dim3);\\n\"\n            \"tensorViewNV setTensorViewDimensionsNV(tensorViewNV v, uint dim0, uint dim1, uint dim2, uint dim3, uint dim4);\\n\"\n\n            \"tensorViewNV setTensorViewStrideNV(tensorViewNV v, uint stride0);\\n\"\n            \"tensorViewNV setTensorViewStrideNV(tensorViewNV v, uint stride0, uint stride1);\\n\"\n            \"tensorViewNV setTensorViewStrideNV(tensorViewNV v, uint stride0, uint stride1, uint stride2);\\n\"\n            \"tensorViewNV setTensorViewStrideNV(tensorViewNV v, uint stride0, uint stride1, uint stride2, uint stride3);\\n\"\n            \"tensorViewNV setTensorViewStrideNV(tensorViewNV v, uint stride0, uint stride1, uint stride2, uint stride3, uint stride4);\\n\"\n\n            \"tensorViewNV setTensorViewClipNV(tensorViewNV v, uint clipRowOffset, uint clipRowSpan, uint clipColOffset, uint clipColSpan);\\n\"\n            \"\\n\"\n        );\n    }\n\n    if (profile != EEsProfile && version >= 450) {\n        const char *basicTypes[] = {\n            \"int8_t\",\n            \"int16_t\",\n            \"int32_t\",\n            \"int64_t\",\n            \"uint8_t\",\n            \"uint16_t\",\n            \"uint32_t\",\n            \"uint64_t\",\n            \"float16_t\",\n            \"float32_t\",\n            \"float64_t\",\n        };\n        for (uint32_t i = 0; i < sizeof(basicTypes)/sizeof(basicTypes[0]); ++i) {\n            std::string func = std::string(\"void coopVecMatMulNV(out coopvecNV result, \") +\n                               std::string(\"coopvecNV v, \") +\n                               std::string(\"int inputInterpretation, \") +\n                               std::string(basicTypes[i]) + std::string(\"[] matrix, \") +\n                               std::string(\"uint matrixOffset, \") +\n                               std::string(\"int matrixInterpretation, \") +\n                               std::string(\"uint M, \") +\n                               std::string(\"uint K, \") +\n                               std::string(\"int matrixLayout, \") +\n                               std::string(\"bool transpose, \") +\n                               std::string(\"uint matrixStride);\\n\");\n            commonBuiltins.append(func.c_str());\n\n            for (uint32_t j = 0; j < sizeof(basicTypes)/sizeof(basicTypes[0]); ++j) {\n                func = std::string(\"void coopVecMatMulAddNV(out coopvecNV result, \") +\n                       std::string(\"coopvecNV v, \") +\n                       std::string(\"int inputInterpretation, \") +\n                       std::string(basicTypes[i]) + std::string(\"[] matrix, \") +\n                       std::string(\"uint matrixOffset, \") +\n                       std::string(\"int matrixInterpretation, \") +\n                       std::string(basicTypes[j]) + std::string(\"[] bias, \") +\n                       std::string(\"uint biasOffset, \") +\n                       std::string(\"int biasInterpretation, \") +\n                       std::string(\"uint M, \") +\n                       std::string(\"uint K, \") +\n                       std::string(\"int matrixLayout, \") +\n                       std::string(\"bool transpose, \") +\n                       std::string(\"uint matrixStride);\\n\");\n                commonBuiltins.append(func.c_str());\n            }\n\n            func = std::string(\"void coopVecOuterProductAccumulateNV(coopvecNV v1, coopvecNV v2, \") +\n                   std::string(basicTypes[i]) +\n                   std::string(\"[] buf, uint offset, uint stride, int matrixLayout, int matrixInterpretation);\\n\");\n            commonBuiltins.append(func.c_str());\n            \n            func = std::string(\"void coopVecReduceSumAccumulateNV(coopvecNV v, \") +\n                   std::string(basicTypes[i]) +\n                   std::string(\"[] buf, uint offset);\\n\");\n            commonBuiltins.append(func.c_str());\n        }\n\n        std::string cooperativeVectorFuncs =\n            \"coopvecNV fma(coopvecNV, coopvecNV, coopvecNV);\\n\"\n            \"coopvecNV min(coopvecNV, coopvecNV);\\n\"\n            \"coopvecNV max(coopvecNV, coopvecNV);\\n\"\n            \"coopvecNV step(coopvecNV, coopvecNV);\\n\"\n            \"coopvecNV exp(coopvecNV);\\n\"            \n            \"coopvecNV log(coopvecNV);\\n\"            \n            \"coopvecNV tanh(coopvecNV);\\n\"            \n            \"coopvecNV atan(coopvecNV);\\n\"            \n            \"coopvecNV clamp(coopvecNV, coopvecNV, coopvecNV);\\n\"\n            \"\\n\"\n            ;\n\n        commonBuiltins.append(cooperativeVectorFuncs.c_str());\n\n        const char *scalarAndVectorTypes[] = {\n            \"int8_t\",\n            \"int16_t\",\n            \"int32_t\",\n            \"int64_t\",\n            \"uint8_t\",\n            \"uint16_t\",\n            \"uint32_t\",\n            \"uint64_t\",\n            \"float16_t\",\n            \"float32_t\",\n            \"float64_t\",\n            \"i8vec2\",\n            \"i16vec2\",\n            \"i32vec2\",\n            \"i64vec2\",\n            \"u8vec2\",\n            \"u16vec2\",\n            \"u32vec2\",\n            \"u64vec2\",\n            \"f16vec2\",\n            \"f32vec2\",\n            \"f64vec2\",\n            \"i8vec3\",\n            \"i16vec3\",\n            \"i32vec3\",\n            \"i64vec3\",\n            \"u8vec3\",\n            \"u16vec3\",\n            \"u32vec3\",\n            \"u64vec3\",\n            \"f16vec3\",\n            \"f32vec3\",\n            \"f64vec3\",\n            \"i8vec4\",\n            \"i16vec4\",\n            \"i32vec4\",\n            \"i64vec4\",\n            \"u8vec4\",\n            \"u16vec4\",\n            \"u32vec4\",\n            \"u64vec4\",\n            \"f16vec4\",\n            \"f32vec4\",\n            \"f64vec4\",\n        };\n        for (uint32_t i = 0; i < sizeof(scalarAndVectorTypes)/sizeof(scalarAndVectorTypes[0]); ++i) {\n            std::string load = std::string(\"void coopVecLoadNV(out coopvecNV v, volatile coherent \") +\n                               std::string(scalarAndVectorTypes[i]) + std::string(\"[] buf, uint offset);\");\n            std::string store = std::string(\"void coopVecStoreNV(coopvecNV v, volatile coherent \") +\n                               std::string(scalarAndVectorTypes[i]) + std::string(\"[] buf, uint offset);\");\n            commonBuiltins.append(load.c_str());\n            commonBuiltins.append(store.c_str());\n        }\n\n        commonBuiltins.append(\n            \"const int gl_CooperativeVectorMatrixLayoutRowMajorNV = 0;\\n\"\n            \"const int gl_CooperativeVectorMatrixLayoutColumnMajorNV = 1;\\n\"\n            \"const int gl_CooperativeVectorMatrixLayoutInferencingOptimalNV = 2;\\n\"\n            \"const int gl_CooperativeVectorMatrixLayoutTrainingOptimalNV = 3;\\n\"\n            \"\\n\"\n            );\n\n        commonBuiltins.append(\n            \"const int gl_ComponentTypeFloat16NV                = 0;\\n\"\n            \"const int gl_ComponentTypeFloat32NV                = 1;\\n\"\n            \"const int gl_ComponentTypeFloat64NV                = 2;\\n\"\n            \"const int gl_ComponentTypeSignedInt8NV             = 3;\\n\"\n            \"const int gl_ComponentTypeSignedInt16NV            = 4;\\n\"\n            \"const int gl_ComponentTypeSignedInt32NV            = 5;\\n\"\n            \"const int gl_ComponentTypeSignedInt64NV            = 6;\\n\"\n            \"const int gl_ComponentTypeUnsignedInt8NV           = 7;\\n\"\n            \"const int gl_ComponentTypeUnsignedInt16NV          = 8;\\n\"\n            \"const int gl_ComponentTypeUnsignedInt32NV          = 9;\\n\"\n            \"const int gl_ComponentTypeUnsignedInt64NV          = 10;\\n\"\n            \"const int gl_ComponentTypeSignedInt8PackedNV       = 1000491000;\\n\"\n            \"const int gl_ComponentTypeUnsignedInt8PackedNV     = 1000491001;\\n\"\n            \"const int gl_ComponentTypeFloatE4M3NV              = 1000491002;\\n\"\n            \"const int gl_ComponentTypeFloatE5M2NV              = 1000491003;\\n\"\n            \"\\n\"\n            );\n    }\n\n    //============================================================================\n    //\n    // Prototypes for built-in functions seen by fragment shaders only.\n    //\n    //============================================================================\n\n    //\n    // Original-style texture Functions with bias.\n    //\n    if (spvVersion.spv == 0 && (profile != EEsProfile || version == 100)) {\n        stageBuiltins[EShLangFragment].append(\n            \"vec4 texture2D(sampler2D, vec2, float);\"\n            \"vec4 texture2DProj(sampler2D, vec3, float);\"\n            \"vec4 texture2DProj(sampler2D, vec4, float);\"\n            \"vec4 texture3D(sampler3D, vec3, float);\"        // OES_texture_3D\n            \"vec4 texture3DProj(sampler3D, vec4, float);\"    // OES_texture_3D\n            \"vec4 textureCube(samplerCube, vec3, float);\"\n\n            \"\\n\");\n    }\n    if (spvVersion.spv == 0 && (profile != EEsProfile && version > 100)) {\n        stageBuiltins[EShLangFragment].append(\n            \"vec4 texture1D(sampler1D, float, float);\"\n            \"vec4 texture1DProj(sampler1D, vec2, float);\"\n            \"vec4 texture1DProj(sampler1D, vec4, float);\"\n            \"vec4 shadow1D(sampler1DShadow, vec3, float);\"\n            \"vec4 shadow2D(sampler2DShadow, vec3, float);\"\n            \"vec4 shadow1DProj(sampler1DShadow, vec4, float);\"\n            \"vec4 shadow2DProj(sampler2DShadow, vec4, float);\"\n\n            \"\\n\");\n    }\n    if (spvVersion.spv == 0 && profile == EEsProfile) {\n        stageBuiltins[EShLangFragment].append(\n            \"vec4 texture2DLodEXT(sampler2D, vec2, float);\"      // GL_EXT_shader_texture_lod\n            \"vec4 texture2DProjLodEXT(sampler2D, vec3, float);\"  // GL_EXT_shader_texture_lod\n            \"vec4 texture2DProjLodEXT(sampler2D, vec4, float);\"  // GL_EXT_shader_texture_lod\n            \"vec4 textureCubeLodEXT(samplerCube, vec3, float);\"  // GL_EXT_shader_texture_lod\n\n            \"\\n\");\n    }\n\n    // GL_EXT_shader_tile_image\n    if (spvVersion.vulkan > 0) {\n        stageBuiltins[EShLangFragment].append(\n            \"lowp uint stencilAttachmentReadEXT();\"\n            \"lowp uint stencilAttachmentReadEXT(int);\"\n            \"highp float depthAttachmentReadEXT();\"\n            \"highp float depthAttachmentReadEXT(int);\"\n            \"\\n\");\n        stageBuiltins[EShLangFragment].append(\n            \"vec4 colorAttachmentReadEXT(attachmentEXT);\"\n            \"vec4 colorAttachmentReadEXT(attachmentEXT, int);\"\n            \"ivec4 colorAttachmentReadEXT(iattachmentEXT);\"\n            \"ivec4 colorAttachmentReadEXT(iattachmentEXT, int);\"\n            \"uvec4 colorAttachmentReadEXT(uattachmentEXT);\"\n            \"uvec4 colorAttachmentReadEXT(uattachmentEXT, int);\"\n            \"\\n\");\n    }\n\n    // GL_ARB_derivative_control\n    if (profile != EEsProfile && version >= 400) {\n        stageBuiltins[EShLangFragment].append(derivativeControls);\n        stageBuiltins[EShLangFragment].append(\"\\n\");\n    }\n\n    // GL_OES_shader_multisample_interpolation\n    if ((profile == EEsProfile && version >= 310) ||\n        (profile != EEsProfile && version >= 150)) { // NV_gpu_shader5\n        stageBuiltins[EShLangFragment].append(\n            \"float interpolateAtCentroid(float);\"\n            \"vec2  interpolateAtCentroid(vec2);\"\n            \"vec3  interpolateAtCentroid(vec3);\"\n            \"vec4  interpolateAtCentroid(vec4);\"\n\n            \"float interpolateAtSample(float, int);\"\n            \"vec2  interpolateAtSample(vec2,  int);\"\n            \"vec3  interpolateAtSample(vec3,  int);\"\n            \"vec4  interpolateAtSample(vec4,  int);\"\n\n            \"float interpolateAtOffset(float, vec2);\"\n            \"vec2  interpolateAtOffset(vec2,  vec2);\"\n            \"vec3  interpolateAtOffset(vec3,  vec2);\"\n            \"vec4  interpolateAtOffset(vec4,  vec2);\"\n\n            \"\\n\");\n    }\n\n    stageBuiltins[EShLangFragment].append(\n        \"void beginInvocationInterlockARB(void);\"\n        \"void endInvocationInterlockARB(void);\");\n\n    stageBuiltins[EShLangFragment].append(\n        \"bool helperInvocationEXT();\"\n        \"\\n\");\n\n    // GL_AMD_shader_explicit_vertex_parameter\n    if (profile != EEsProfile && version >= 450) {\n        stageBuiltins[EShLangFragment].append(\n            \"float interpolateAtVertexAMD(float, uint);\"\n            \"vec2  interpolateAtVertexAMD(vec2,  uint);\"\n            \"vec3  interpolateAtVertexAMD(vec3,  uint);\"\n            \"vec4  interpolateAtVertexAMD(vec4,  uint);\"\n\n            \"int   interpolateAtVertexAMD(int,   uint);\"\n            \"ivec2 interpolateAtVertexAMD(ivec2, uint);\"\n            \"ivec3 interpolateAtVertexAMD(ivec3, uint);\"\n            \"ivec4 interpolateAtVertexAMD(ivec4, uint);\"\n\n            \"uint  interpolateAtVertexAMD(uint,  uint);\"\n            \"uvec2 interpolateAtVertexAMD(uvec2, uint);\"\n            \"uvec3 interpolateAtVertexAMD(uvec3, uint);\"\n            \"uvec4 interpolateAtVertexAMD(uvec4, uint);\"\n\n            \"float16_t interpolateAtVertexAMD(float16_t, uint);\"\n            \"f16vec2   interpolateAtVertexAMD(f16vec2,   uint);\"\n            \"f16vec3   interpolateAtVertexAMD(f16vec3,   uint);\"\n            \"f16vec4   interpolateAtVertexAMD(f16vec4,   uint);\"\n\n            \"\\n\");\n    }\n\n    // GL_AMD_gpu_shader_half_float\n    if (profile != EEsProfile && version >= 450) {\n        stageBuiltins[EShLangFragment].append(derivativesAndControl16bits);\n        stageBuiltins[EShLangFragment].append(\"\\n\");\n\n        stageBuiltins[EShLangFragment].append(\n            \"float16_t interpolateAtCentroid(float16_t);\"\n            \"f16vec2   interpolateAtCentroid(f16vec2);\"\n            \"f16vec3   interpolateAtCentroid(f16vec3);\"\n            \"f16vec4   interpolateAtCentroid(f16vec4);\"\n\n            \"float16_t interpolateAtSample(float16_t, int);\"\n            \"f16vec2   interpolateAtSample(f16vec2,   int);\"\n            \"f16vec3   interpolateAtSample(f16vec3,   int);\"\n            \"f16vec4   interpolateAtSample(f16vec4,   int);\"\n\n            \"float16_t interpolateAtOffset(float16_t, f16vec2);\"\n            \"f16vec2   interpolateAtOffset(f16vec2,   f16vec2);\"\n            \"f16vec3   interpolateAtOffset(f16vec3,   f16vec2);\"\n            \"f16vec4   interpolateAtOffset(f16vec4,   f16vec2);\"\n\n            \"\\n\");\n    }\n\n    // GL_ARB_shader_clock& GL_EXT_shader_realtime_clock\n    if (profile != EEsProfile && version >= 450) {\n        commonBuiltins.append(\n            \"uvec2 clock2x32ARB();\"\n            \"uint64_t clockARB();\"\n            \"uvec2 clockRealtime2x32EXT();\"\n            \"uint64_t clockRealtimeEXT();\"\n            \"\\n\");\n    }\n\n    // GL_AMD_shader_fragment_mask\n    if (profile != EEsProfile && version >= 450 && spvVersion.vulkan > 0) {\n        stageBuiltins[EShLangFragment].append(\n            \"uint fragmentMaskFetchAMD(subpassInputMS);\"\n            \"uint fragmentMaskFetchAMD(isubpassInputMS);\"\n            \"uint fragmentMaskFetchAMD(usubpassInputMS);\"\n\n            \"vec4  fragmentFetchAMD(subpassInputMS,  uint);\"\n            \"ivec4 fragmentFetchAMD(isubpassInputMS, uint);\"\n            \"uvec4 fragmentFetchAMD(usubpassInputMS, uint);\"\n\n            \"\\n\");\n    }\n\n    // Builtins for GL_NV_ray_tracing/GL_NV_ray_tracing_motion_blur/GL_EXT_ray_tracing/GL_EXT_ray_query/\n    // GL_NV_shader_invocation_reorder/GL_KHR_ray_tracing_position_Fetch\n    if (profile != EEsProfile && version >= 460) {\n         commonBuiltins.append(\"void rayQueryInitializeEXT(rayQueryEXT, accelerationStructureEXT, uint, uint, vec3, float, vec3, float);\"\n            \"void rayQueryTerminateEXT(rayQueryEXT);\"\n            \"void rayQueryGenerateIntersectionEXT(rayQueryEXT, float);\"\n            \"void rayQueryConfirmIntersectionEXT(rayQueryEXT);\"\n            \"bool rayQueryProceedEXT(rayQueryEXT);\"\n            \"uint rayQueryGetIntersectionTypeEXT(rayQueryEXT, bool);\"\n            \"float rayQueryGetRayTMinEXT(rayQueryEXT);\"\n            \"uint rayQueryGetRayFlagsEXT(rayQueryEXT);\"\n            \"vec3 rayQueryGetWorldRayOriginEXT(rayQueryEXT);\"\n            \"vec3 rayQueryGetWorldRayDirectionEXT(rayQueryEXT);\"\n            \"float rayQueryGetIntersectionTEXT(rayQueryEXT, bool);\"\n            \"int rayQueryGetIntersectionInstanceCustomIndexEXT(rayQueryEXT, bool);\"\n            \"int rayQueryGetIntersectionInstanceIdEXT(rayQueryEXT, bool);\"\n            \"uint rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT(rayQueryEXT, bool);\"\n            \"int rayQueryGetIntersectionGeometryIndexEXT(rayQueryEXT, bool);\"\n            \"int rayQueryGetIntersectionPrimitiveIndexEXT(rayQueryEXT, bool);\"\n            \"vec2 rayQueryGetIntersectionBarycentricsEXT(rayQueryEXT, bool);\"\n            \"bool rayQueryGetIntersectionFrontFaceEXT(rayQueryEXT, bool);\"\n            \"bool rayQueryGetIntersectionCandidateAABBOpaqueEXT(rayQueryEXT);\"\n            \"vec3 rayQueryGetIntersectionObjectRayDirectionEXT(rayQueryEXT, bool);\"\n            \"vec3 rayQueryGetIntersectionObjectRayOriginEXT(rayQueryEXT, bool);\"\n            \"mat4x3 rayQueryGetIntersectionObjectToWorldEXT(rayQueryEXT, bool);\"\n            \"mat4x3 rayQueryGetIntersectionWorldToObjectEXT(rayQueryEXT, bool);\"\n            \"void rayQueryGetIntersectionTriangleVertexPositionsEXT(rayQueryEXT, bool, out vec3[3]);\"\n            \"int rayQueryGetIntersectionClusterIdNV(rayQueryEXT, bool);\"\n            \"vec3 rayQueryGetIntersectionSpherePositionNV(rayQueryEXT, bool);\"\n            \"float rayQueryGetIntersectionSphereRadiusNV(rayQueryEXT, bool);\"\n            \"float rayQueryGetIntersectionLSSHitValueNV(rayQueryEXT, bool);\"\n            \"void rayQueryGetIntersectionLSSPositionsNV(rayQueryEXT, bool, out vec3[2]);\"\n            \"void rayQueryGetIntersectionLSSRadiiNV(rayQueryEXT, bool, out float[2]);\"\n            \"bool rayQueryIsSphereHitNV(rayQueryEXT, bool);\"\n            \"bool rayQueryIsLSSHitNV(rayQueryEXT, bool);\"\n            \"\\n\");\n\n        stageBuiltins[EShLangRayGen].append(\n            \"void traceNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);\"\n            \"void traceRayMotionNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,float,int);\"\n            \"void traceRayEXT(accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);\"\n            \"void executeCallableNV(uint, int);\"\n            \"void executeCallableEXT(uint, int);\"\n            \"void hitObjectTraceRayNV(hitObjectNV,accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);\"\n            \"void hitObjectTraceRayMotionNV(hitObjectNV,accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,float,int);\"\n            \"void hitObjectRecordHitNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,uint,vec3,float,vec3,float,int);\"\n            \"void hitObjectRecordHitMotionNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,uint,vec3,float,vec3,float,float,int);\"\n            \"void hitObjectRecordHitWithIndexNV(hitObjectNV, accelerationStructureEXT,int,int,int,uint,uint,vec3,float,vec3,float,int);\"\n            \"void hitObjectRecordHitWithIndexMotionNV(hitObjectNV, accelerationStructureEXT,int,int,int,uint,uint,vec3,float,vec3,float,float,int);\"\n            \"void hitObjectRecordMissNV(hitObjectNV,uint,vec3,float,vec3,float);\"\n            \"void hitObjectRecordMissMotionNV(hitObjectNV,uint,vec3,float,vec3,float,float);\"\n            \"void hitObjectRecordEmptyNV(hitObjectNV);\"\n            \"void hitObjectExecuteShaderNV(hitObjectNV,int);\"\n            \"bool hitObjectIsEmptyNV(hitObjectNV);\"\n            \"bool hitObjectIsMissNV(hitObjectNV);\"\n            \"bool hitObjectIsHitNV(hitObjectNV);\"\n            \"float hitObjectGetRayTMinNV(hitObjectNV);\"\n            \"float hitObjectGetRayTMaxNV(hitObjectNV);\"\n            \"vec3 hitObjectGetWorldRayOriginNV(hitObjectNV);\"\n            \"vec3 hitObjectGetWorldRayDirectionNV(hitObjectNV);\"\n            \"vec3 hitObjectGetObjectRayOriginNV(hitObjectNV);\"\n            \"vec3 hitObjectGetObjectRayDirectionNV(hitObjectNV);\"\n            \"mat4x3 hitObjectGetWorldToObjectNV(hitObjectNV);\"\n            \"mat4x3 hitObjectGetObjectToWorldNV(hitObjectNV);\"\n            \"int hitObjectGetInstanceCustomIndexNV(hitObjectNV);\"\n            \"int hitObjectGetInstanceIdNV(hitObjectNV);\"\n            \"int hitObjectGetGeometryIndexNV(hitObjectNV);\"\n            \"int hitObjectGetPrimitiveIndexNV(hitObjectNV);\"\n            \"uint hitObjectGetHitKindNV(hitObjectNV);\"\n            \"void hitObjectGetAttributesNV(hitObjectNV,int);\"\n            \"float hitObjectGetCurrentTimeNV(hitObjectNV);\"\n            \"uint hitObjectGetShaderBindingTableRecordIndexNV(hitObjectNV);\"\n            \"uvec2 hitObjectGetShaderRecordBufferHandleNV(hitObjectNV);\"\n            \"int hitObjectGetClusterIdNV(hitObjectNV);\"\n            \"void reorderThreadNV(uint, uint);\"\n            \"void reorderThreadNV(hitObjectNV);\"\n            \"void reorderThreadNV(hitObjectNV, uint, uint);\"\n            \"vec3 fetchMicroTriangleVertexPositionNV(accelerationStructureEXT, int, int, int, ivec2);\"\n            \"vec2 fetchMicroTriangleVertexBarycentricNV(accelerationStructureEXT, int, int, int, ivec2);\"\n            \"vec3 hitObjectGetSpherePositionNV(hitObjectNV);\"\n            \"float hitObjectGetSphereRadiusNV(hitObjectNV);\"\n            \"void hitObjectGetLSSPositionsNV(hitObjectNV, out vec3[2]);\"\n            \"void hitObjectGetLSSRadiiNV(hitObjectNV, out float[2]);\"\n            \"bool hitObjectIsSphereHitNV(hitObjectNV);\"\n            \"bool hitObjectIsLSSHitNV(hitObjectNV);\"\n            \"\\n\");\n        stageBuiltins[EShLangIntersect].append(\n            \"bool reportIntersectionNV(float, uint);\"\n            \"bool reportIntersectionEXT(float, uint);\"\n            \"\\n\");\n        stageBuiltins[EShLangAnyHit].append(\n            \"void ignoreIntersectionNV();\"\n            \"void terminateRayNV();\"\n            \"\\n\");\n        stageBuiltins[EShLangClosestHit].append(\n            \"void traceNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);\"\n            \"void traceRayMotionNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,float,int);\"\n            \"void traceRayEXT(accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);\"\n            \"void executeCallableNV(uint, int);\"\n            \"void executeCallableEXT(uint, int);\"\n            \"void hitObjectTraceRayNV(hitObjectNV,accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);\"\n            \"void hitObjectTraceRayMotionNV(hitObjectNV,accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,float,int);\"\n            \"void hitObjectRecordHitNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,uint,vec3,float,vec3,float,int);\"\n            \"void hitObjectRecordHitMotionNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,uint,vec3,float,vec3,float,float,int);\"\n            \"void hitObjectRecordHitWithIndexNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,vec3,float,vec3,float,int);\"\n            \"void hitObjectRecordHitWithIndexMotionNV(hitObjectNV, accelerationStructureEXT,int,int,int,uint,uint,vec3,float,vec3,float,float,int);\"\n            \"void hitObjectRecordMissNV(hitObjectNV, uint, vec3, float, vec3, float);\"\n            \"void hitObjectRecordMissMotionNV(hitObjectNV,uint,vec3,float,vec3,float,float);\"\n            \"void hitObjectRecordEmptyNV(hitObjectNV);\"\n            \"void hitObjectExecuteShaderNV(hitObjectNV, int);\"\n            \"bool hitObjectIsEmptyNV(hitObjectNV);\"\n            \"bool hitObjectIsMissNV(hitObjectNV);\"\n            \"bool hitObjectIsHitNV(hitObjectNV);\"\n            \"float hitObjectGetRayTMinNV(hitObjectNV);\"\n            \"float hitObjectGetRayTMaxNV(hitObjectNV);\"\n            \"vec3 hitObjectGetWorldRayOriginNV(hitObjectNV);\"\n            \"vec3 hitObjectGetWorldRayDirectionNV(hitObjectNV);\"\n            \"vec3 hitObjectGetObjectRayOriginNV(hitObjectNV);\"\n            \"vec3 hitObjectGetObjectRayDirectionNV(hitObjectNV);\"\n            \"mat4x3 hitObjectGetWorldToObjectNV(hitObjectNV);\"\n            \"mat4x3 hitObjectGetObjectToWorldNV(hitObjectNV);\"\n            \"int hitObjectGetInstanceCustomIndexNV(hitObjectNV);\"\n            \"int hitObjectGetInstanceIdNV(hitObjectNV);\"\n            \"int hitObjectGetGeometryIndexNV(hitObjectNV);\"\n            \"int hitObjectGetPrimitiveIndexNV(hitObjectNV);\"\n            \"uint hitObjectGetHitKindNV(hitObjectNV);\"\n            \"void hitObjectGetAttributesNV(hitObjectNV,int);\"\n            \"float hitObjectGetCurrentTimeNV(hitObjectNV);\"\n            \"uint hitObjectGetShaderBindingTableRecordIndexNV(hitObjectNV);\"\n            \"uvec2 hitObjectGetShaderRecordBufferHandleNV(hitObjectNV);\"\n            \"int hitObjectGetClusterIdNV(hitObjectNV);\"\n            \"vec3 hitObjectGetSpherePositionNV(hitObjectNV);\"\n            \"float hitObjectGetSphereRadiusNV(hitObjectNV);\"\n            \"void hitObjectGetLSSPositionsNV(hitObjectNV, out vec3[2]);\"\n            \"void hitObjectGetLSSRadiiNV(hitObjectNV, out float[2]);\"\n            \"bool hitObjectIsSphereHitNV(hitObjectNV);\"\n            \"bool hitObjectIsLSSHitNV(hitObjectNV);\"\n            \"\\n\");\n        stageBuiltins[EShLangMiss].append(\n            \"void traceNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);\"\n            \"void traceRayMotionNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,float,int);\"\n            \"void traceRayEXT(accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);\"\n            \"void executeCallableNV(uint, int);\"\n            \"void executeCallableEXT(uint, int);\"\n            \"void hitObjectTraceRayNV(hitObjectNV,accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);\"\n            \"void hitObjectTraceRayMotionNV(hitObjectNV,accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,float,int);\"\n            \"void hitObjectRecordHitNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,uint,vec3,float,vec3,float,int);\"\n            \"void hitObjectRecordHitMotionNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,uint,vec3,float,vec3,float,float,int);\"\n            \"void hitObjectRecordHitWithIndexNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,vec3,float,vec3,float,int);\"\n            \"void hitObjectRecordHitWithIndexMotionNV(hitObjectNV, accelerationStructureEXT,int,int,int,uint,uint,vec3,float,vec3,float,float,int);\"\n            \"void hitObjectRecordMissNV(hitObjectNV, uint, vec3, float, vec3, float);\"\n            \"void hitObjectRecordMissMotionNV(hitObjectNV,uint,vec3,float,vec3,float,float);\"\n            \"void hitObjectRecordEmptyNV(hitObjectNV);\"\n            \"void hitObjectExecuteShaderNV(hitObjectNV, int);\"\n            \"bool hitObjectIsEmptyNV(hitObjectNV);\"\n            \"bool hitObjectIsMissNV(hitObjectNV);\"\n            \"bool hitObjectIsHitNV(hitObjectNV);\"\n            \"float hitObjectGetRayTMinNV(hitObjectNV);\"\n            \"float hitObjectGetRayTMaxNV(hitObjectNV);\"\n            \"vec3 hitObjectGetWorldRayOriginNV(hitObjectNV);\"\n            \"vec3 hitObjectGetWorldRayDirectionNV(hitObjectNV);\"\n            \"vec3 hitObjectGetObjectRayOriginNV(hitObjectNV);\"\n            \"vec3 hitObjectGetObjectRayDirectionNV(hitObjectNV);\"\n            \"mat4x3 hitObjectGetWorldToObjectNV(hitObjectNV);\"\n            \"mat4x3 hitObjectGetObjectToWorldNV(hitObjectNV);\"\n            \"int hitObjectGetInstanceCustomIndexNV(hitObjectNV);\"\n            \"int hitObjectGetInstanceIdNV(hitObjectNV);\"\n            \"int hitObjectGetGeometryIndexNV(hitObjectNV);\"\n            \"int hitObjectGetPrimitiveIndexNV(hitObjectNV);\"\n            \"uint hitObjectGetHitKindNV(hitObjectNV);\"\n            \"void hitObjectGetAttributesNV(hitObjectNV,int);\"\n            \"float hitObjectGetCurrentTimeNV(hitObjectNV);\"\n            \"uint hitObjectGetShaderBindingTableRecordIndexNV(hitObjectNV);\"\n            \"uvec2 hitObjectGetShaderRecordBufferHandleNV(hitObjectNV);\"\n            \"int hitObjectGetClusterIdNV(hitObjectNV);\"\n            \"vec3 hitObjectGetSpherePositionNV(hitObjectNV);\"\n            \"float hitObjectGetSphereRadiusNV(hitObjectNV);\"\n            \"void hitObjectGetLSSPositionsNV(hitObjectNV, out vec3[2]);\"\n            \"void hitObjectGetLSSRadiiNV(hitObjectNV, out float[2]);\"\n            \"bool hitObjectIsSphereHitNV(hitObjectNV);\"\n            \"bool hitObjectIsLSSHitNV(hitObjectNV);\"\n            \"\\n\");\n        stageBuiltins[EShLangCallable].append(\n            \"void executeCallableNV(uint, int);\"\n            \"void executeCallableEXT(uint, int);\"\n            \"\\n\");\n    }\n\n    //E_SPV_NV_compute_shader_derivatives\n    if ((profile == EEsProfile && version >= 320) || (profile != EEsProfile && version >= 450)) {\n        stageBuiltins[EShLangCompute].append(derivativeControls);\n        stageBuiltins[EShLangCompute].append(\"\\n\");\n    }\n    if (profile != EEsProfile && version >= 450) {\n        stageBuiltins[EShLangCompute].append(derivativesAndControl16bits);\n        stageBuiltins[EShLangCompute].append(derivativesAndControl64bits);\n        stageBuiltins[EShLangCompute].append(\"\\n\");\n    }\n\n    // Builtins for GL_NV_mesh_shader\n    if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {\n        stageBuiltins[EShLangMesh].append(\n            \"void writePackedPrimitiveIndices4x8NV(uint, uint);\"\n            \"\\n\");\n    }\n    // Builtins for GL_EXT_mesh_shader\n    if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {\n        // Builtins for GL_EXT_mesh_shader\n        stageBuiltins[EShLangTask].append(\n            \"void EmitMeshTasksEXT(uint, uint, uint);\"\n            \"\\n\");\n\n        stageBuiltins[EShLangMesh].append(\n            \"void SetMeshOutputsEXT(uint, uint);\"\n            \"\\n\");\n    }\n    // Builtins for GL_NV_displacement_micromap\n    if ((profile != EEsProfile && version >= 460) || (profile == EEsProfile && version >= 320)) {\n        stageBuiltins[EShLangMesh].append(\n            \"vec3 fetchMicroTriangleVertexPositionNV(accelerationStructureEXT, int, int, int, ivec2);\"\n            \"vec2 fetchMicroTriangleVertexBarycentricNV(accelerationStructureEXT, int, int, int, ivec2);\"\n            \"\\n\");\n\n        stageBuiltins[EShLangCompute].append(\n            \"vec3 fetchMicroTriangleVertexPositionNV(accelerationStructureEXT, int, int, int, ivec2);\"\n            \"vec2 fetchMicroTriangleVertexBarycentricNV(accelerationStructureEXT, int, int, int, ivec2);\"\n            \"\\n\");\n\n    }\n\n\n    //============================================================================\n    //\n    // Standard Uniforms\n    //\n    //============================================================================\n\n    //\n    // Depth range in window coordinates, p. 33\n    //\n    if (spvVersion.spv == 0) {\n        commonBuiltins.append(\n            \"struct gl_DepthRangeParameters {\"\n            );\n        if (profile == EEsProfile) {\n            commonBuiltins.append(\n                \"highp float near;\"   // n\n                \"highp float far;\"    // f\n                \"highp float diff;\"   // f - n\n                );\n        } else {\n            commonBuiltins.append(\n                \"float near;\"  // n\n                \"float far;\"   // f\n                \"float diff;\"  // f - n\n                );\n        }\n\n        commonBuiltins.append(\n            \"};\"\n            \"uniform gl_DepthRangeParameters gl_DepthRange;\"\n            \"\\n\");\n    }\n\n    if (spvVersion.spv == 0 && IncludeLegacy(version, profile, spvVersion)) {\n        //\n        // Matrix state. p. 31, 32, 37, 39, 40.\n        //\n        commonBuiltins.append(\n            \"uniform mat4  gl_ModelViewMatrix;\"\n            \"uniform mat4  gl_ProjectionMatrix;\"\n            \"uniform mat4  gl_ModelViewProjectionMatrix;\"\n\n            //\n            // Derived matrix state that provides inverse and transposed versions\n            // of the matrices above.\n            //\n            \"uniform mat3  gl_NormalMatrix;\"\n\n            \"uniform mat4  gl_ModelViewMatrixInverse;\"\n            \"uniform mat4  gl_ProjectionMatrixInverse;\"\n            \"uniform mat4  gl_ModelViewProjectionMatrixInverse;\"\n\n            \"uniform mat4  gl_ModelViewMatrixTranspose;\"\n            \"uniform mat4  gl_ProjectionMatrixTranspose;\"\n            \"uniform mat4  gl_ModelViewProjectionMatrixTranspose;\"\n\n            \"uniform mat4  gl_ModelViewMatrixInverseTranspose;\"\n            \"uniform mat4  gl_ProjectionMatrixInverseTranspose;\"\n            \"uniform mat4  gl_ModelViewProjectionMatrixInverseTranspose;\"\n\n            //\n            // Normal scaling p. 39.\n            //\n            \"uniform float gl_NormalScale;\"\n\n            //\n            // Point Size, p. 66, 67.\n            //\n            \"struct gl_PointParameters {\"\n                \"float size;\"\n                \"float sizeMin;\"\n                \"float sizeMax;\"\n                \"float fadeThresholdSize;\"\n                \"float distanceConstantAttenuation;\"\n                \"float distanceLinearAttenuation;\"\n                \"float distanceQuadraticAttenuation;\"\n            \"};\"\n\n            \"uniform gl_PointParameters gl_Point;\"\n\n            //\n            // Material State p. 50, 55.\n            //\n            \"struct gl_MaterialParameters {\"\n                \"vec4  emission;\"    // Ecm\n                \"vec4  ambient;\"     // Acm\n                \"vec4  diffuse;\"     // Dcm\n                \"vec4  specular;\"    // Scm\n                \"float shininess;\"   // Srm\n            \"};\"\n            \"uniform gl_MaterialParameters  gl_FrontMaterial;\"\n            \"uniform gl_MaterialParameters  gl_BackMaterial;\"\n\n            //\n            // Light State p 50, 53, 55.\n            //\n            \"struct gl_LightSourceParameters {\"\n                \"vec4  ambient;\"             // Acli\n                \"vec4  diffuse;\"             // Dcli\n                \"vec4  specular;\"            // Scli\n                \"vec4  position;\"            // Ppli\n                \"vec4  halfVector;\"          // Derived: Hi\n                \"vec3  spotDirection;\"       // Sdli\n                \"float spotExponent;\"        // Srli\n                \"float spotCutoff;\"          // Crli\n                                                        // (range: [0.0,90.0], 180.0)\n                \"float spotCosCutoff;\"       // Derived: cos(Crli)\n                                                        // (range: [1.0,0.0],-1.0)\n                \"float constantAttenuation;\" // K0\n                \"float linearAttenuation;\"   // K1\n                \"float quadraticAttenuation;\"// K2\n            \"};\"\n\n            \"struct gl_LightModelParameters {\"\n                \"vec4  ambient;\"       // Acs\n            \"};\"\n\n            \"uniform gl_LightModelParameters  gl_LightModel;\"\n\n            //\n            // Derived state from products of light and material.\n            //\n            \"struct gl_LightModelProducts {\"\n                \"vec4  sceneColor;\"     // Derived. Ecm + Acm * Acs\n            \"};\"\n\n            \"uniform gl_LightModelProducts gl_FrontLightModelProduct;\"\n            \"uniform gl_LightModelProducts gl_BackLightModelProduct;\"\n\n            \"struct gl_LightProducts {\"\n                \"vec4  ambient;\"        // Acm * Acli\n                \"vec4  diffuse;\"        // Dcm * Dcli\n                \"vec4  specular;\"       // Scm * Scli\n            \"};\"\n\n            //\n            // Fog p. 161\n            //\n            \"struct gl_FogParameters {\"\n                \"vec4  color;\"\n                \"float density;\"\n                \"float start;\"\n                \"float end;\"\n                \"float scale;\"   //  1 / (gl_FogEnd - gl_FogStart)\n            \"};\"\n\n            \"uniform gl_FogParameters gl_Fog;\"\n\n            \"\\n\");\n    }\n\n    //============================================================================\n    //\n    // Define the interface to the compute shader.\n    //\n    //============================================================================\n\n    if ((profile != EEsProfile && version >= 420) ||\n        (profile == EEsProfile && version >= 310)) {\n        stageBuiltins[EShLangCompute].append(\n            \"in    highp uvec3 gl_NumWorkGroups;\"\n            \"const highp uvec3 gl_WorkGroupSize = uvec3(1,1,1);\"\n\n            \"in highp uvec3 gl_WorkGroupID;\"\n            \"in highp uvec3 gl_LocalInvocationID;\"\n\n            \"in highp uvec3 gl_GlobalInvocationID;\"\n            \"in highp uint gl_LocalInvocationIndex;\"\n\n            \"\\n\");\n    }\n\n    if ((profile != EEsProfile && version >= 140) ||\n        (profile == EEsProfile && version >= 310)) {\n        stageBuiltins[EShLangCompute].append(\n            \"in highp int gl_DeviceIndex;\"     // GL_EXT_device_group\n            \"\\n\");\n    }\n\n    // GL_QCOM_tile_shading\n    if ((profile == EEsProfile && version >= 310) ||\n        (profile != EEsProfile && version >= 460)) {\n        stageBuiltins[EShLangCompute].append(\n            \"in highp uvec2 gl_TileOffsetQCOM;\"     // GL_QCOM_tile_shading\n            \"in highp uvec3 gl_TileDimensionQCOM;\"  // GL_QCOM_tile_shading\n            \"in highp uvec2 gl_TileApronSizeQCOM;\"  // GL_QCOM_tile_shading\n            \"\\n\");\n    }\n\n    //============================================================================\n    //\n    // Define the interface to the mesh/task shader.\n    //\n    //============================================================================\n\n    if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {\n        // per-vertex attributes\n        stageBuiltins[EShLangMesh].append(\n            \"out gl_MeshPerVertexNV {\"\n                \"vec4 gl_Position;\"\n                \"float gl_PointSize;\"\n                \"float gl_ClipDistance[];\"\n                \"float gl_CullDistance[];\"\n                \"perviewNV vec4 gl_PositionPerViewNV[];\"\n                \"perviewNV float gl_ClipDistancePerViewNV[][];\"\n                \"perviewNV float gl_CullDistancePerViewNV[][];\"\n            \"} gl_MeshVerticesNV[];\"\n        );\n\n        // per-primitive attributes\n        stageBuiltins[EShLangMesh].append(\n            \"perprimitiveNV out gl_MeshPerPrimitiveNV {\"\n                \"int gl_PrimitiveID;\"\n                \"int gl_Layer;\"\n                \"int gl_ViewportIndex;\"\n                \"int gl_ViewportMask[];\"\n                \"perviewNV int gl_LayerPerViewNV[];\"\n                \"perviewNV int gl_ViewportMaskPerViewNV[][];\"\n            \"} gl_MeshPrimitivesNV[];\"\n        );\n\n        stageBuiltins[EShLangMesh].append(\n            \"out uint gl_PrimitiveCountNV;\"\n            \"out uint gl_PrimitiveIndicesNV[];\"\n\n            \"in uint gl_MeshViewCountNV;\"\n            \"in uint gl_MeshViewIndicesNV[4];\"\n\n            \"const highp uvec3 gl_WorkGroupSize = uvec3(1,1,1);\"\n\n            \"in highp uvec3 gl_WorkGroupID;\"\n            \"in highp uvec3 gl_LocalInvocationID;\"\n\n            \"in highp uvec3 gl_GlobalInvocationID;\"\n            \"in highp uint gl_LocalInvocationIndex;\"\n            \"\\n\");\n\n        // GL_EXT_mesh_shader\n        stageBuiltins[EShLangMesh].append(\n            \"out uint gl_PrimitivePointIndicesEXT[];\"\n            \"out uvec2 gl_PrimitiveLineIndicesEXT[];\"\n            \"out uvec3 gl_PrimitiveTriangleIndicesEXT[];\"\n            \"in    highp uvec3 gl_NumWorkGroups;\"\n            \"\\n\");\n\n        // per-vertex attributes\n        stageBuiltins[EShLangMesh].append(\n            \"out gl_MeshPerVertexEXT {\"\n                \"vec4 gl_Position;\"\n                \"float gl_PointSize;\"\n                \"float gl_ClipDistance[];\"\n                \"float gl_CullDistance[];\"\n            \"} gl_MeshVerticesEXT[];\"\n        );\n\n        // per-primitive attributes\n        stageBuiltins[EShLangMesh].append(\n            \"perprimitiveEXT out gl_MeshPerPrimitiveEXT {\"\n                \"int gl_PrimitiveID;\"\n                \"int gl_Layer;\"\n                \"int gl_ViewportIndex;\"\n                \"bool gl_CullPrimitiveEXT;\"\n                \"int  gl_PrimitiveShadingRateEXT;\"\n            \"} gl_MeshPrimitivesEXT[];\"\n        );\n\n        stageBuiltins[EShLangTask].append(\n            \"out uint gl_TaskCountNV;\"\n\n            \"const highp uvec3 gl_WorkGroupSize = uvec3(1,1,1);\"\n\n            \"in highp uvec3 gl_WorkGroupID;\"\n            \"in highp uvec3 gl_LocalInvocationID;\"\n\n            \"in highp uvec3 gl_GlobalInvocationID;\"\n            \"in highp uint gl_LocalInvocationIndex;\"\n\n            \"in uint gl_MeshViewCountNV;\"\n            \"in uint gl_MeshViewIndicesNV[4];\"\n            \"in    highp uvec3 gl_NumWorkGroups;\"\n            \"\\n\");\n    }\n\n    if (profile != EEsProfile && version >= 450) {\n        stageBuiltins[EShLangMesh].append(\n            \"in highp int gl_DeviceIndex;\"     // GL_EXT_device_group\n            \"in int gl_DrawIDARB;\"             // GL_ARB_shader_draw_parameters\n            \"in int gl_ViewIndex;\"             // GL_EXT_multiview\n            \"\\n\");\n\n        stageBuiltins[EShLangTask].append(\n            \"in highp int gl_DeviceIndex;\"     // GL_EXT_device_group\n            \"in int gl_DrawIDARB;\"             // GL_ARB_shader_draw_parameters\n            \"\\n\");\n\n        if (version >= 460) {\n            stageBuiltins[EShLangMesh].append(\n                \"in int gl_DrawID;\"\n                \"\\n\");\n\n            stageBuiltins[EShLangTask].append(\n                \"in int gl_DrawID;\"\n                \"\\n\");\n        }\n    }\n\n    //============================================================================\n    //\n    // Define the interface to the vertex shader.\n    //\n    //============================================================================\n\n    if (profile != EEsProfile) {\n        if (version < 130) {\n            stageBuiltins[EShLangVertex].append(\n                \"attribute vec4  gl_Color;\"\n                \"attribute vec4  gl_SecondaryColor;\"\n                \"attribute vec3  gl_Normal;\"\n                \"attribute vec4  gl_Vertex;\"\n                \"attribute vec4  gl_MultiTexCoord0;\"\n                \"attribute vec4  gl_MultiTexCoord1;\"\n                \"attribute vec4  gl_MultiTexCoord2;\"\n                \"attribute vec4  gl_MultiTexCoord3;\"\n                \"attribute vec4  gl_MultiTexCoord4;\"\n                \"attribute vec4  gl_MultiTexCoord5;\"\n                \"attribute vec4  gl_MultiTexCoord6;\"\n                \"attribute vec4  gl_MultiTexCoord7;\"\n                \"attribute float gl_FogCoord;\"\n                \"\\n\");\n        } else if (IncludeLegacy(version, profile, spvVersion)) {\n            stageBuiltins[EShLangVertex].append(\n                \"in vec4  gl_Color;\"\n                \"in vec4  gl_SecondaryColor;\"\n                \"in vec3  gl_Normal;\"\n                \"in vec4  gl_Vertex;\"\n                \"in vec4  gl_MultiTexCoord0;\"\n                \"in vec4  gl_MultiTexCoord1;\"\n                \"in vec4  gl_MultiTexCoord2;\"\n                \"in vec4  gl_MultiTexCoord3;\"\n                \"in vec4  gl_MultiTexCoord4;\"\n                \"in vec4  gl_MultiTexCoord5;\"\n                \"in vec4  gl_MultiTexCoord6;\"\n                \"in vec4  gl_MultiTexCoord7;\"\n                \"in float gl_FogCoord;\"\n                \"\\n\");\n        }\n\n        if (version < 150) {\n            if (version < 130) {\n                stageBuiltins[EShLangVertex].append(\n                    \"        vec4  gl_ClipVertex;\"       // needs qualifier fixed later\n                    \"varying vec4  gl_FrontColor;\"\n                    \"varying vec4  gl_BackColor;\"\n                    \"varying vec4  gl_FrontSecondaryColor;\"\n                    \"varying vec4  gl_BackSecondaryColor;\"\n                    \"varying vec4  gl_TexCoord[];\"\n                    \"varying float gl_FogFragCoord;\"\n                    \"\\n\");\n            } else if (IncludeLegacy(version, profile, spvVersion)) {\n                stageBuiltins[EShLangVertex].append(\n                    \"    vec4  gl_ClipVertex;\"       // needs qualifier fixed later\n                    \"out vec4  gl_FrontColor;\"\n                    \"out vec4  gl_BackColor;\"\n                    \"out vec4  gl_FrontSecondaryColor;\"\n                    \"out vec4  gl_BackSecondaryColor;\"\n                    \"out vec4  gl_TexCoord[];\"\n                    \"out float gl_FogFragCoord;\"\n                    \"\\n\");\n            }\n            stageBuiltins[EShLangVertex].append(\n                \"vec4 gl_Position;\"   // needs qualifier fixed later\n                \"float gl_PointSize;\" // needs qualifier fixed later\n                );\n\n            if (version == 130 || version == 140)\n                stageBuiltins[EShLangVertex].append(\n                    \"out float gl_ClipDistance[];\"\n                    );\n        } else {\n            // version >= 150\n            stageBuiltins[EShLangVertex].append(\n                \"out gl_PerVertex {\"\n                    \"vec4 gl_Position;\"     // needs qualifier fixed later\n                    \"float gl_PointSize;\"   // needs qualifier fixed later\n                    \"float gl_ClipDistance[];\"\n                    );\n            if (IncludeLegacy(version, profile, spvVersion))\n                stageBuiltins[EShLangVertex].append(\n                    \"vec4 gl_ClipVertex;\"   // needs qualifier fixed later\n                    \"vec4 gl_FrontColor;\"\n                    \"vec4 gl_BackColor;\"\n                    \"vec4 gl_FrontSecondaryColor;\"\n                    \"vec4 gl_BackSecondaryColor;\"\n                    \"vec4 gl_TexCoord[];\"\n                    \"float gl_FogFragCoord;\"\n                    );\n            if (version >= 450)\n                stageBuiltins[EShLangVertex].append(\n                    \"float gl_CullDistance[];\"\n                    );\n            stageBuiltins[EShLangVertex].append(\n                \"};\"\n                \"\\n\");\n        }\n        if (version >= 130 && spvVersion.vulkan == 0)\n            stageBuiltins[EShLangVertex].append(\n                \"int gl_VertexID;\"            // needs qualifier fixed later\n                );\n        if (spvVersion.vulkan == 0)\n            stageBuiltins[EShLangVertex].append(\n                \"int gl_InstanceID;\"          // needs qualifier fixed later\n                );\n        if (spvVersion.vulkan > 0 && version >= 140)\n            stageBuiltins[EShLangVertex].append(\n                \"in int gl_VertexIndex;\"\n                \"in int gl_InstanceIndex;\"\n                );\n\n        if (spvVersion.vulkan > 0 && version >= 140 && spvVersion.vulkanRelaxed)\n            stageBuiltins[EShLangVertex].append(\n                \"in int gl_VertexID;\"         // declare with 'in' qualifier\n                \"in int gl_InstanceID;\"\n                );\n\n        if (version >= 440) {\n            stageBuiltins[EShLangVertex].append(\n                \"in int gl_BaseVertexARB;\"\n                \"in int gl_BaseInstanceARB;\"\n                \"in int gl_DrawIDARB;\"\n                );\n        }\n        if (version >= 410) {\n            stageBuiltins[EShLangVertex].append(\n                \"out int gl_ViewportIndex;\"\n                \"out int gl_Layer;\"\n                );\n        }\n        if (version >= 460) {\n            stageBuiltins[EShLangVertex].append(\n                \"in int gl_BaseVertex;\"\n                \"in int gl_BaseInstance;\"\n                \"in int gl_DrawID;\"\n                );\n        }\n\n        if (version >= 430)\n            stageBuiltins[EShLangVertex].append(\n                \"out int gl_ViewportMask[];\"             // GL_NV_viewport_array2\n                );\n\n        if (version >= 450)\n            stageBuiltins[EShLangVertex].append(\n                \"out int gl_SecondaryViewportMaskNV[];\"  // GL_NV_stereo_view_rendering\n                \"out vec4 gl_SecondaryPositionNV;\"       // GL_NV_stereo_view_rendering\n                \"out vec4 gl_PositionPerViewNV[];\"       // GL_NVX_multiview_per_view_attributes\n                \"out int  gl_ViewportMaskPerViewNV[];\"   // GL_NVX_multiview_per_view_attributes\n                );\n    } else {\n        // ES profile\n        if (version == 100) {\n            stageBuiltins[EShLangVertex].append(\n                \"highp   vec4  gl_Position;\"  // needs qualifier fixed later\n                \"mediump float gl_PointSize;\" // needs qualifier fixed later\n                \"highp int gl_InstanceID;\" // needs qualifier fixed later\n                );\n        } else {\n            if (spvVersion.vulkan == 0 || spvVersion.vulkanRelaxed)\n                stageBuiltins[EShLangVertex].append(\n                    \"in highp int gl_VertexID;\"      // needs qualifier fixed later\n                    \"in highp int gl_InstanceID;\"    // needs qualifier fixed later\n                    );\n            if (spvVersion.vulkan > 0)\n                stageBuiltins[EShLangVertex].append(\n                    \"in highp int gl_VertexIndex;\"\n                    \"in highp int gl_InstanceIndex;\"\n                    );\n            if (version < 310)\n                stageBuiltins[EShLangVertex].append(\n                    \"highp vec4  gl_Position;\"    // needs qualifier fixed later\n                    \"highp float gl_PointSize;\"   // needs qualifier fixed later\n                    );\n            else\n                stageBuiltins[EShLangVertex].append(\n                    \"out gl_PerVertex {\"\n                        \"highp vec4  gl_Position;\"    // needs qualifier fixed later\n                        \"highp float gl_PointSize;\"   // needs qualifier fixed later\n                    \"};\"\n                    );\n        }\n    }\n\n    if ((profile != EEsProfile && version >= 140) ||\n        (profile == EEsProfile && version >= 310)) {\n        stageBuiltins[EShLangVertex].append(\n            \"in highp int gl_DeviceIndex;\"     // GL_EXT_device_group\n            \"in highp int gl_ViewIndex;\"       // GL_EXT_multiview\n            \"\\n\");\n    }\n\n    if (version >= 300 /* both ES and non-ES */) {\n        stageBuiltins[EShLangVertex].append(\n            \"in highp uint gl_ViewID_OVR;\"     // GL_OVR_multiview, GL_OVR_multiview2\n            \"\\n\");\n    }\n\n    if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 310)) {\n        stageBuiltins[EShLangVertex].append(\n            \"out highp int gl_PrimitiveShadingRateEXT;\" // GL_EXT_fragment_shading_rate\n            \"\\n\");\n    }\n\n    //============================================================================\n    //\n    // Define the interface to the geometry shader.\n    //\n    //============================================================================\n\n    if (profile == ECoreProfile || profile == ECompatibilityProfile) {\n        stageBuiltins[EShLangGeometry].append(\n            \"in gl_PerVertex {\"\n                \"vec4 gl_Position;\"\n                \"float gl_PointSize;\"\n                \"float gl_ClipDistance[];\"\n                );\n        if (profile == ECompatibilityProfile)\n            stageBuiltins[EShLangGeometry].append(\n                \"vec4 gl_ClipVertex;\"\n                \"vec4 gl_FrontColor;\"\n                \"vec4 gl_BackColor;\"\n                \"vec4 gl_FrontSecondaryColor;\"\n                \"vec4 gl_BackSecondaryColor;\"\n                \"vec4 gl_TexCoord[];\"\n                \"float gl_FogFragCoord;\"\n                );\n        if (version >= 450)\n            stageBuiltins[EShLangGeometry].append(\n                \"float gl_CullDistance[];\"\n                \"vec4 gl_SecondaryPositionNV;\"   // GL_NV_stereo_view_rendering\n                \"vec4 gl_PositionPerViewNV[];\"   // GL_NVX_multiview_per_view_attributes\n                );\n        stageBuiltins[EShLangGeometry].append(\n            \"} gl_in[];\"\n\n            \"in int gl_PrimitiveIDIn;\"\n            \"out gl_PerVertex {\"\n                \"vec4 gl_Position;\"\n                \"float gl_PointSize;\"\n                \"float gl_ClipDistance[];\"\n                \"\\n\");\n        if (profile == ECompatibilityProfile && version >= 400)\n            stageBuiltins[EShLangGeometry].append(\n                \"vec4 gl_ClipVertex;\"\n                \"vec4 gl_FrontColor;\"\n                \"vec4 gl_BackColor;\"\n                \"vec4 gl_FrontSecondaryColor;\"\n                \"vec4 gl_BackSecondaryColor;\"\n                \"vec4 gl_TexCoord[];\"\n                \"float gl_FogFragCoord;\"\n                );\n        if (version >= 450)\n            stageBuiltins[EShLangGeometry].append(\n                \"float gl_CullDistance[];\"\n                );\n        stageBuiltins[EShLangGeometry].append(\n            \"};\"\n\n            \"out int gl_PrimitiveID;\"\n            \"out int gl_Layer;\");\n\n        if (version >= 150)\n            stageBuiltins[EShLangGeometry].append(\n            \"out int gl_ViewportIndex;\"\n            );\n\n        if (profile == ECompatibilityProfile && version < 400)\n            stageBuiltins[EShLangGeometry].append(\n            \"out vec4 gl_ClipVertex;\"\n            );\n\n        if (version >= 150)\n            stageBuiltins[EShLangGeometry].append(\n            \"in int gl_InvocationID;\"\n            );\n\n        if (version >= 430)\n            stageBuiltins[EShLangGeometry].append(\n                \"out int gl_ViewportMask[];\"               // GL_NV_viewport_array2\n            );\n\n        if (version >= 450)\n            stageBuiltins[EShLangGeometry].append(\n                \"out int gl_SecondaryViewportMaskNV[];\"    // GL_NV_stereo_view_rendering\n                \"out vec4 gl_SecondaryPositionNV;\"         // GL_NV_stereo_view_rendering\n                \"out vec4 gl_PositionPerViewNV[];\"         // GL_NVX_multiview_per_view_attributes\n                \"out int  gl_ViewportMaskPerViewNV[];\"     // GL_NVX_multiview_per_view_attributes\n            );\n\n        stageBuiltins[EShLangGeometry].append(\"\\n\");\n    } else if (profile == EEsProfile && version >= 310) {\n        stageBuiltins[EShLangGeometry].append(\n            \"in gl_PerVertex {\"\n                \"highp vec4 gl_Position;\"\n                \"highp float gl_PointSize;\"\n            \"} gl_in[];\"\n            \"\\n\"\n            \"in highp int gl_PrimitiveIDIn;\"\n            \"in highp int gl_InvocationID;\"\n            \"\\n\"\n            \"out gl_PerVertex {\"\n                \"highp vec4 gl_Position;\"\n                \"highp float gl_PointSize;\"\n            \"};\"\n            \"\\n\"\n            \"out highp int gl_PrimitiveID;\"\n            \"out highp int gl_Layer;\"\n            \"\\n\"\n            );\n    }\n\n    if ((profile != EEsProfile && version >= 140) ||\n        (profile == EEsProfile && version >= 310)) {\n        stageBuiltins[EShLangGeometry].append(\n            \"in highp int gl_DeviceIndex;\"     // GL_EXT_device_group\n            \"in highp int gl_ViewIndex;\"       // GL_EXT_multiview\n            \"\\n\");\n    }\n\n    if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 310)) {\n        stageBuiltins[EShLangGeometry].append(\n            \"out highp int gl_PrimitiveShadingRateEXT;\" // GL_EXT_fragment_shading_rate\n            \"\\n\");\n    }\n\n    //============================================================================\n    //\n    // Define the interface to the tessellation control shader.\n    //\n    //============================================================================\n\n    if (profile != EEsProfile && version >= 150) {\n        // Note:  \"in gl_PerVertex {...} gl_in[gl_MaxPatchVertices];\" is declared in initialize() below,\n        // as it depends on the resource sizing of gl_MaxPatchVertices.\n\n        stageBuiltins[EShLangTessControl].append(\n            \"in int gl_PatchVerticesIn;\"\n            \"in int gl_PrimitiveID;\"\n            \"in int gl_InvocationID;\"\n\n            \"out gl_PerVertex {\"\n                \"vec4 gl_Position;\"\n                \"float gl_PointSize;\"\n                \"float gl_ClipDistance[];\"\n                );\n        if (profile == ECompatibilityProfile)\n            stageBuiltins[EShLangTessControl].append(\n                \"vec4 gl_ClipVertex;\"\n                \"vec4 gl_FrontColor;\"\n                \"vec4 gl_BackColor;\"\n                \"vec4 gl_FrontSecondaryColor;\"\n                \"vec4 gl_BackSecondaryColor;\"\n                \"vec4 gl_TexCoord[];\"\n                \"float gl_FogFragCoord;\"\n                );\n        if (version >= 450)\n            stageBuiltins[EShLangTessControl].append(\n                \"float gl_CullDistance[];\"\n            );\n        if (version >= 430)\n            stageBuiltins[EShLangTessControl].append(\n                \"int  gl_ViewportMask[];\"             // GL_NV_viewport_array2\n            );\n        if (version >= 450)\n            stageBuiltins[EShLangTessControl].append(\n                \"vec4 gl_SecondaryPositionNV;\"        // GL_NV_stereo_view_rendering\n                \"int  gl_SecondaryViewportMaskNV[];\"  // GL_NV_stereo_view_rendering\n                \"vec4 gl_PositionPerViewNV[];\"        // GL_NVX_multiview_per_view_attributes\n                \"int  gl_ViewportMaskPerViewNV[];\"    // GL_NVX_multiview_per_view_attributes\n                );\n        stageBuiltins[EShLangTessControl].append(\n            \"} gl_out[];\"\n\n            \"patch out float gl_TessLevelOuter[4];\"\n            \"patch out float gl_TessLevelInner[2];\"\n            \"\\n\");\n\n        if (version >= 410)\n            stageBuiltins[EShLangTessControl].append(\n                \"out int gl_ViewportIndex;\"\n                \"out int gl_Layer;\"\n                \"\\n\");\n\n    } else {\n        // Note:  \"in gl_PerVertex {...} gl_in[gl_MaxPatchVertices];\" is declared in initialize() below,\n        // as it depends on the resource sizing of gl_MaxPatchVertices.\n\n        stageBuiltins[EShLangTessControl].append(\n            \"in highp int gl_PatchVerticesIn;\"\n            \"in highp int gl_PrimitiveID;\"\n            \"in highp int gl_InvocationID;\"\n\n            \"out gl_PerVertex {\"\n                \"highp vec4 gl_Position;\"\n                \"highp float gl_PointSize;\"\n                );\n        stageBuiltins[EShLangTessControl].append(\n            \"} gl_out[];\"\n\n            \"patch out highp float gl_TessLevelOuter[4];\"\n            \"patch out highp float gl_TessLevelInner[2];\"\n            \"patch out highp vec4 gl_BoundingBoxOES[2];\"\n            \"patch out highp vec4 gl_BoundingBoxEXT[2];\"\n            \"\\n\");\n        if (profile == EEsProfile && version >= 320) {\n            stageBuiltins[EShLangTessControl].append(\n                \"patch out highp vec4 gl_BoundingBox[2];\"\n                \"\\n\"\n            );\n        }\n    }\n\n    if ((profile != EEsProfile && version >= 140) ||\n        (profile == EEsProfile && version >= 310)) {\n        stageBuiltins[EShLangTessControl].append(\n            \"in highp int gl_DeviceIndex;\"     // GL_EXT_device_group\n            \"in highp int gl_ViewIndex;\"       // GL_EXT_multiview\n            \"\\n\");\n    }\n\n    //============================================================================\n    //\n    // Define the interface to the tessellation evaluation shader.\n    //\n    //============================================================================\n\n    if (profile != EEsProfile && version >= 150) {\n        // Note:  \"in gl_PerVertex {...} gl_in[gl_MaxPatchVertices];\" is declared in initialize() below,\n        // as it depends on the resource sizing of gl_MaxPatchVertices.\n\n        stageBuiltins[EShLangTessEvaluation].append(\n            \"in int gl_PatchVerticesIn;\"\n            \"in int gl_PrimitiveID;\"\n            \"in vec3 gl_TessCoord;\"\n\n            \"patch in float gl_TessLevelOuter[4];\"\n            \"patch in float gl_TessLevelInner[2];\"\n\n            \"out gl_PerVertex {\"\n                \"vec4 gl_Position;\"\n                \"float gl_PointSize;\"\n                \"float gl_ClipDistance[];\"\n            );\n        if (version >= 400 && profile == ECompatibilityProfile)\n            stageBuiltins[EShLangTessEvaluation].append(\n                \"vec4 gl_ClipVertex;\"\n                \"vec4 gl_FrontColor;\"\n                \"vec4 gl_BackColor;\"\n                \"vec4 gl_FrontSecondaryColor;\"\n                \"vec4 gl_BackSecondaryColor;\"\n                \"vec4 gl_TexCoord[];\"\n                \"float gl_FogFragCoord;\"\n                );\n        if (version >= 450)\n            stageBuiltins[EShLangTessEvaluation].append(\n                \"float gl_CullDistance[];\"\n                );\n        stageBuiltins[EShLangTessEvaluation].append(\n            \"};\"\n            \"\\n\");\n\n        if (version >= 410)\n            stageBuiltins[EShLangTessEvaluation].append(\n                \"out int gl_ViewportIndex;\"\n                \"out int gl_Layer;\"\n                \"\\n\");\n\n        if (version >= 430)\n            stageBuiltins[EShLangTessEvaluation].append(\n                \"out int  gl_ViewportMask[];\"             // GL_NV_viewport_array2\n            );\n\n        if (version >= 450)\n            stageBuiltins[EShLangTessEvaluation].append(\n                \"out vec4 gl_SecondaryPositionNV;\"        // GL_NV_stereo_view_rendering\n                \"out int  gl_SecondaryViewportMaskNV[];\"  // GL_NV_stereo_view_rendering\n                \"out vec4 gl_PositionPerViewNV[];\"        // GL_NVX_multiview_per_view_attributes\n                \"out int  gl_ViewportMaskPerViewNV[];\"    // GL_NVX_multiview_per_view_attributes\n                );\n\n    } else if (profile == EEsProfile && version >= 310) {\n        // Note:  \"in gl_PerVertex {...} gl_in[gl_MaxPatchVertices];\" is declared in initialize() below,\n        // as it depends on the resource sizing of gl_MaxPatchVertices.\n\n        stageBuiltins[EShLangTessEvaluation].append(\n            \"in highp int gl_PatchVerticesIn;\"\n            \"in highp int gl_PrimitiveID;\"\n            \"in highp vec3 gl_TessCoord;\"\n\n            \"patch in highp float gl_TessLevelOuter[4];\"\n            \"patch in highp float gl_TessLevelInner[2];\"\n\n            \"out gl_PerVertex {\"\n                \"highp vec4 gl_Position;\"\n                \"highp float gl_PointSize;\"\n            );\n        stageBuiltins[EShLangTessEvaluation].append(\n            \"};\"\n            \"\\n\");\n    }\n\n    if ((profile != EEsProfile && version >= 140) ||\n        (profile == EEsProfile && version >= 310)) {\n        stageBuiltins[EShLangTessEvaluation].append(\n            \"in highp int gl_DeviceIndex;\"     // GL_EXT_device_group\n            \"in highp int gl_ViewIndex;\"       // GL_EXT_multiview\n            \"\\n\");\n    }\n\n    //============================================================================\n    //\n    // Define the interface to the fragment shader.\n    //\n    //============================================================================\n\n    if (profile != EEsProfile) {\n\n        stageBuiltins[EShLangFragment].append(\n            \"vec4  gl_FragCoord;\"   // needs qualifier fixed later\n            \"bool  gl_FrontFacing;\" // needs qualifier fixed later\n            \"float gl_FragDepth;\"   // needs qualifier fixed later\n            );\n        if (version >= 120)\n            stageBuiltins[EShLangFragment].append(\n                \"vec2 gl_PointCoord;\"  // needs qualifier fixed later\n                );\n        if (version >= 140)\n            stageBuiltins[EShLangFragment].append(\n                \"out int gl_FragStencilRefARB;\"\n                );\n        if (IncludeLegacy(version, profile, spvVersion) || (! ForwardCompatibility && version < 420))\n            stageBuiltins[EShLangFragment].append(\n                \"vec4 gl_FragColor;\"   // needs qualifier fixed later\n                );\n\n        if (version < 130) {\n            stageBuiltins[EShLangFragment].append(\n                \"varying vec4  gl_Color;\"\n                \"varying vec4  gl_SecondaryColor;\"\n                \"varying vec4  gl_TexCoord[];\"\n                \"varying float gl_FogFragCoord;\"\n                );\n        } else {\n            stageBuiltins[EShLangFragment].append(\n                \"in float gl_ClipDistance[];\"\n                );\n\n            if (IncludeLegacy(version, profile, spvVersion)) {\n                if (version < 150)\n                    stageBuiltins[EShLangFragment].append(\n                        \"in float gl_FogFragCoord;\"\n                        \"in vec4  gl_TexCoord[];\"\n                        \"in vec4  gl_Color;\"\n                        \"in vec4  gl_SecondaryColor;\"\n                        );\n                else\n                    stageBuiltins[EShLangFragment].append(\n                        \"in gl_PerFragment {\"\n                            \"in float gl_FogFragCoord;\"\n                            \"in vec4  gl_TexCoord[];\"\n                            \"in vec4  gl_Color;\"\n                            \"in vec4  gl_SecondaryColor;\"\n                        \"};\"\n                        );\n            }\n        }\n\n        if (version >= 150)\n            stageBuiltins[EShLangFragment].append(\n                \"flat in int gl_PrimitiveID;\"\n                );\n\n        if (version >= 130) { // ARB_sample_shading\n            stageBuiltins[EShLangFragment].append(\n                \"flat in  int  gl_SampleID;\"\n                \"     in  vec2 gl_SamplePosition;\"\n                \"     out int  gl_SampleMask[];\"\n                );\n\n            if (spvVersion.spv == 0) {\n                stageBuiltins[EShLangFragment].append(\n                    \"uniform int gl_NumSamples;\"\n                );\n            }\n        }\n\n        if (version >= 150)\n            stageBuiltins[EShLangFragment].append(\n                \"flat in  int  gl_SampleMaskIn[];\"\n            );\n\n        if (version >= 430)\n            stageBuiltins[EShLangFragment].append(\n                \"flat in int gl_Layer;\"\n                \"flat in int gl_ViewportIndex;\"\n                );\n\n        if (version >= 450)\n            stageBuiltins[EShLangFragment].append(\n                \"in float gl_CullDistance[];\"\n                \"bool gl_HelperInvocation;\"     // needs qualifier fixed later\n                );\n\n        if (version >= 450)\n            stageBuiltins[EShLangFragment].append( // GL_EXT_fragment_invocation_density\n                \"flat in ivec2 gl_FragSizeEXT;\"\n                \"flat in int   gl_FragInvocationCountEXT;\"\n                );\n\n        if (version >= 450)\n            stageBuiltins[EShLangFragment].append(\n                \"in vec2 gl_BaryCoordNoPerspAMD;\"\n                \"in vec2 gl_BaryCoordNoPerspCentroidAMD;\"\n                \"in vec2 gl_BaryCoordNoPerspSampleAMD;\"\n                \"in vec2 gl_BaryCoordSmoothAMD;\"\n                \"in vec2 gl_BaryCoordSmoothCentroidAMD;\"\n                \"in vec2 gl_BaryCoordSmoothSampleAMD;\"\n                \"in vec3 gl_BaryCoordPullModelAMD;\"\n                );\n\n        if (version >= 430)\n            stageBuiltins[EShLangFragment].append(\n                \"in bool gl_FragFullyCoveredNV;\"\n                );\n        if (version >= 450)\n            stageBuiltins[EShLangFragment].append(\n                \"flat in ivec2 gl_FragmentSizeNV;\"          // GL_NV_shading_rate_image\n                \"flat in int   gl_InvocationsPerPixelNV;\"\n                \"in vec3 gl_BaryCoordNV;\"                   // GL_NV_fragment_shader_barycentric\n                \"in vec3 gl_BaryCoordNoPerspNV;\"\n                \"in vec3 gl_BaryCoordEXT;\"                  // GL_EXT_fragment_shader_barycentric\n                \"in vec3 gl_BaryCoordNoPerspEXT;\"\n                );\n\n        if (version >= 450)\n            stageBuiltins[EShLangFragment].append(\n                \"flat in int gl_ShadingRateEXT;\" // GL_EXT_fragment_shading_rate\n            );\n\n    } else {\n        // ES profile\n\n        if (version == 100) {\n            stageBuiltins[EShLangFragment].append(\n                \"mediump vec4 gl_FragCoord;\"    // needs qualifier fixed later\n                \"        bool gl_FrontFacing;\"  // needs qualifier fixed later\n                \"mediump vec4 gl_FragColor;\"    // needs qualifier fixed later\n                \"mediump vec2 gl_PointCoord;\"   // needs qualifier fixed later\n                );\n        }\n        if (version >= 300) {\n            stageBuiltins[EShLangFragment].append(\n                \"highp   vec4  gl_FragCoord;\"    // needs qualifier fixed later\n                \"        bool  gl_FrontFacing;\"  // needs qualifier fixed later\n                \"mediump vec2  gl_PointCoord;\"   // needs qualifier fixed later\n                \"highp   float gl_FragDepth;\"    // needs qualifier fixed later\n                );\n        }\n        if (version >= 310) {\n            stageBuiltins[EShLangFragment].append(\n                \"bool gl_HelperInvocation;\"          // needs qualifier fixed later\n                \"flat in highp int gl_PrimitiveID;\"  // needs qualifier fixed later\n                \"flat in highp int gl_Layer;\"        // needs qualifier fixed later\n                );\n\n            stageBuiltins[EShLangFragment].append(  // GL_OES_sample_variables\n                \"flat  in lowp     int gl_SampleID;\"\n                \"      in mediump vec2 gl_SamplePosition;\"\n                \"flat  in highp    int gl_SampleMaskIn[];\"\n                \"     out highp    int gl_SampleMask[];\"\n                );\n            if (spvVersion.spv == 0)\n                stageBuiltins[EShLangFragment].append(  // GL_OES_sample_variables\n                    \"uniform lowp int gl_NumSamples;\"\n                    );\n        }\n        stageBuiltins[EShLangFragment].append(\n            \"highp float gl_FragDepthEXT;\"       // GL_EXT_frag_depth\n            );\n\n        if (version >= 310)\n            stageBuiltins[EShLangFragment].append( // GL_EXT_fragment_invocation_density\n                \"flat in ivec2 gl_FragSizeEXT;\"\n                \"flat in int   gl_FragInvocationCountEXT;\"\n            );\n        if (version >= 320)\n            stageBuiltins[EShLangFragment].append( // GL_NV_shading_rate_image\n                \"flat in ivec2 gl_FragmentSizeNV;\"\n                \"flat in int   gl_InvocationsPerPixelNV;\"\n            );\n        if (version >= 320)\n            stageBuiltins[EShLangFragment].append(\n                \"in vec3 gl_BaryCoordNV;\"\n                \"in vec3 gl_BaryCoordNoPerspNV;\"\n                \"in vec3 gl_BaryCoordEXT;\"\n                \"in vec3 gl_BaryCoordNoPerspEXT;\"\n            );\n        if (version >= 310)\n            stageBuiltins[EShLangFragment].append(\n                \"flat in highp int gl_ShadingRateEXT;\" // GL_EXT_fragment_shading_rate\n            );\n    }\n\n    stageBuiltins[EShLangFragment].append(\"\\n\");\n\n    if (version >= 130)\n        add2ndGenerationSamplingImaging(version, profile, spvVersion);\n\n    if ((profile != EEsProfile && version >= 140) ||\n        (profile == EEsProfile && version >= 310)) {\n        stageBuiltins[EShLangFragment].append(\n            \"flat in highp int gl_DeviceIndex;\"     // GL_EXT_device_group\n            \"flat in highp int gl_ViewIndex;\"       // GL_EXT_multiview\n            \"\\n\");\n    }\n\n    if (version >= 300 /* both ES and non-ES */) {\n        stageBuiltins[EShLangFragment].append(\n            \"flat in highp uint gl_ViewID_OVR;\"     // GL_OVR_multiview, GL_OVR_multiview2\n            \"\\n\");\n    }\n    \n    // GL_QCOM_tile_shading\n    if ((profile == EEsProfile && version >= 310) ||\n        (profile != EEsProfile && version >= 460)) {\n        stageBuiltins[EShLangFragment].append(\n            \"flat in highp uvec2 gl_TileOffsetQCOM;\"     // GL_QCOM_tile_shading\n            \"flat in highp uvec3 gl_TileDimensionQCOM;\"  // GL_QCOM_tile_shading\n            \"flat in highp uvec2 gl_TileApronSizeQCOM;\"  // GL_QCOM_tile_shading\n            \"\\n\");\n    }\n\n    // GL_ARB_shader_ballot\n    if (profile != EEsProfile && version >= 450) {\n        const char* ballotDecls =\n            \"uniform uint gl_SubGroupSizeARB;\"\n            \"in uint     gl_SubGroupInvocationARB;\"\n            \"in uint64_t gl_SubGroupEqMaskARB;\"\n            \"in uint64_t gl_SubGroupGeMaskARB;\"\n            \"in uint64_t gl_SubGroupGtMaskARB;\"\n            \"in uint64_t gl_SubGroupLeMaskARB;\"\n            \"in uint64_t gl_SubGroupLtMaskARB;\"\n            \"\\n\";\n        const char* rtBallotDecls =\n            \"uniform volatile uint gl_SubGroupSizeARB;\"\n            \"in volatile uint     gl_SubGroupInvocationARB;\"\n            \"in volatile uint64_t gl_SubGroupEqMaskARB;\"\n            \"in volatile uint64_t gl_SubGroupGeMaskARB;\"\n            \"in volatile uint64_t gl_SubGroupGtMaskARB;\"\n            \"in volatile uint64_t gl_SubGroupLeMaskARB;\"\n            \"in volatile uint64_t gl_SubGroupLtMaskARB;\"\n            \"\\n\";\n        const char* fragmentBallotDecls =\n            \"uniform uint gl_SubGroupSizeARB;\"\n            \"flat in uint     gl_SubGroupInvocationARB;\"\n            \"flat in uint64_t gl_SubGroupEqMaskARB;\"\n            \"flat in uint64_t gl_SubGroupGeMaskARB;\"\n            \"flat in uint64_t gl_SubGroupGtMaskARB;\"\n            \"flat in uint64_t gl_SubGroupLeMaskARB;\"\n            \"flat in uint64_t gl_SubGroupLtMaskARB;\"\n            \"\\n\";\n        stageBuiltins[EShLangVertex]        .append(ballotDecls);\n        stageBuiltins[EShLangTessControl]   .append(ballotDecls);\n        stageBuiltins[EShLangTessEvaluation].append(ballotDecls);\n        stageBuiltins[EShLangGeometry]      .append(ballotDecls);\n        stageBuiltins[EShLangCompute]       .append(ballotDecls);\n        stageBuiltins[EShLangFragment]      .append(fragmentBallotDecls);\n        stageBuiltins[EShLangMesh]        .append(ballotDecls);\n        stageBuiltins[EShLangTask]        .append(ballotDecls);\n        stageBuiltins[EShLangRayGen]        .append(rtBallotDecls);\n        stageBuiltins[EShLangIntersect]     .append(rtBallotDecls);\n        // No volatile qualifier on these builtins in any-hit\n        stageBuiltins[EShLangAnyHit]        .append(ballotDecls);\n        stageBuiltins[EShLangClosestHit]    .append(rtBallotDecls);\n        stageBuiltins[EShLangMiss]          .append(rtBallotDecls);\n        stageBuiltins[EShLangCallable]      .append(rtBallotDecls);\n    }\n\n    // GL_KHR_shader_subgroup\n    if ((profile == EEsProfile && version >= 310) ||\n        (profile != EEsProfile && version >= 140)) {\n        const char* subgroupDecls =\n            \"in mediump uint  gl_SubgroupSize;\"\n            \"in mediump uint  gl_SubgroupInvocationID;\"\n            \"in highp   uvec4 gl_SubgroupEqMask;\"\n            \"in highp   uvec4 gl_SubgroupGeMask;\"\n            \"in highp   uvec4 gl_SubgroupGtMask;\"\n            \"in highp   uvec4 gl_SubgroupLeMask;\"\n            \"in highp   uvec4 gl_SubgroupLtMask;\"\n            // GL_NV_shader_sm_builtins\n            \"in highp   uint  gl_WarpsPerSMNV;\"\n            \"in highp   uint  gl_SMCountNV;\"\n            \"in highp   uint  gl_WarpIDNV;\"\n            \"in highp   uint  gl_SMIDNV;\"\n            // GL_ARM_shader_core_builtins\n            \"in highp   uint  gl_CoreIDARM;\"\n            \"in highp   uint  gl_CoreCountARM;\"\n            \"in highp   uint  gl_CoreMaxIDARM;\"\n            \"in highp   uint  gl_WarpIDARM;\"\n            \"in highp   uint  gl_WarpMaxIDARM;\"\n            \"\\n\";\n        const char* fragmentSubgroupDecls =\n            \"flat in mediump uint  gl_SubgroupSize;\"\n            \"flat in mediump uint  gl_SubgroupInvocationID;\"\n            \"flat in highp   uvec4 gl_SubgroupEqMask;\"\n            \"flat in highp   uvec4 gl_SubgroupGeMask;\"\n            \"flat in highp   uvec4 gl_SubgroupGtMask;\"\n            \"flat in highp   uvec4 gl_SubgroupLeMask;\"\n            \"flat in highp   uvec4 gl_SubgroupLtMask;\"\n            // GL_NV_shader_sm_builtins\n            \"flat in highp   uint  gl_WarpsPerSMNV;\"\n            \"flat in highp   uint  gl_SMCountNV;\"\n            \"flat in highp   uint  gl_WarpIDNV;\"\n            \"flat in highp   uint  gl_SMIDNV;\"\n            // GL_ARM_shader_core_builtins\n            \"flat in highp   uint  gl_CoreIDARM;\"\n            \"flat in highp   uint  gl_CoreCountARM;\"\n            \"flat in highp   uint  gl_CoreMaxIDARM;\"\n            \"flat in highp   uint  gl_WarpIDARM;\"\n            \"flat in highp   uint  gl_WarpMaxIDARM;\"\n            \"\\n\";\n        const char* computeSubgroupDecls =\n            \"in highp   uint  gl_NumSubgroups;\"\n            \"in highp   uint  gl_SubgroupID;\"\n            \"\\n\";\n        // These builtins are volatile for RT stages\n        const char* rtSubgroupDecls =\n            \"in mediump volatile uint  gl_SubgroupSize;\"\n            \"in mediump volatile uint  gl_SubgroupInvocationID;\"\n            \"in highp   volatile uvec4 gl_SubgroupEqMask;\"\n            \"in highp   volatile uvec4 gl_SubgroupGeMask;\"\n            \"in highp   volatile uvec4 gl_SubgroupGtMask;\"\n            \"in highp   volatile uvec4 gl_SubgroupLeMask;\"\n            \"in highp   volatile uvec4 gl_SubgroupLtMask;\"\n            // GL_NV_shader_sm_builtins\n            \"in highp    uint  gl_WarpsPerSMNV;\"\n            \"in highp    uint  gl_SMCountNV;\"\n            \"in highp volatile uint  gl_WarpIDNV;\"\n            \"in highp volatile uint  gl_SMIDNV;\"\n            // GL_ARM_shader_core_builtins\n            \"in highp   uint  gl_CoreIDARM;\"\n            \"in highp   uint  gl_CoreCountARM;\"\n            \"in highp   uint  gl_CoreMaxIDARM;\"\n            \"in highp   uint  gl_WarpIDARM;\"\n            \"in highp   uint  gl_WarpMaxIDARM;\"\n            \"\\n\";\n\n        stageBuiltins[EShLangVertex]        .append(subgroupDecls);\n        stageBuiltins[EShLangTessControl]   .append(subgroupDecls);\n        stageBuiltins[EShLangTessEvaluation].append(subgroupDecls);\n        stageBuiltins[EShLangGeometry]      .append(subgroupDecls);\n        stageBuiltins[EShLangCompute]       .append(subgroupDecls);\n        stageBuiltins[EShLangCompute]       .append(computeSubgroupDecls);\n        stageBuiltins[EShLangFragment]      .append(fragmentSubgroupDecls);\n        stageBuiltins[EShLangMesh]        .append(subgroupDecls);\n        stageBuiltins[EShLangMesh]        .append(computeSubgroupDecls);\n        stageBuiltins[EShLangTask]        .append(subgroupDecls);\n        stageBuiltins[EShLangTask]        .append(computeSubgroupDecls);\n        stageBuiltins[EShLangRayGen]        .append(rtSubgroupDecls);\n        stageBuiltins[EShLangIntersect]     .append(rtSubgroupDecls);\n        // No volatile qualifier on these builtins in any-hit\n        stageBuiltins[EShLangAnyHit]        .append(subgroupDecls);\n        stageBuiltins[EShLangClosestHit]    .append(rtSubgroupDecls);\n        stageBuiltins[EShLangMiss]          .append(rtSubgroupDecls);\n        stageBuiltins[EShLangCallable]      .append(rtSubgroupDecls);\n    }\n\n    // GL_NV_ray_tracing/GL_EXT_ray_tracing\n    if (profile != EEsProfile && version >= 460) {\n\n        const char *constRayFlags =\n            \"const uint gl_RayFlagsNoneNV = 0U;\"\n            \"const uint gl_RayFlagsNoneEXT = 0U;\"\n            \"const uint gl_RayFlagsOpaqueNV = 1U;\"\n            \"const uint gl_RayFlagsOpaqueEXT = 1U;\"\n            \"const uint gl_RayFlagsNoOpaqueNV = 2U;\"\n            \"const uint gl_RayFlagsNoOpaqueEXT = 2U;\"\n            \"const uint gl_RayFlagsTerminateOnFirstHitNV = 4U;\"\n            \"const uint gl_RayFlagsTerminateOnFirstHitEXT = 4U;\"\n            \"const uint gl_RayFlagsSkipClosestHitShaderNV = 8U;\"\n            \"const uint gl_RayFlagsSkipClosestHitShaderEXT = 8U;\"\n            \"const uint gl_RayFlagsCullBackFacingTrianglesNV = 16U;\"\n            \"const uint gl_RayFlagsCullBackFacingTrianglesEXT = 16U;\"\n            \"const uint gl_RayFlagsCullFrontFacingTrianglesNV = 32U;\"\n            \"const uint gl_RayFlagsCullFrontFacingTrianglesEXT = 32U;\"\n            \"const uint gl_RayFlagsCullOpaqueNV = 64U;\"\n            \"const uint gl_RayFlagsCullOpaqueEXT = 64U;\"\n            \"const uint gl_RayFlagsCullNoOpaqueNV = 128U;\"\n            \"const uint gl_RayFlagsCullNoOpaqueEXT = 128U;\"\n            \"const uint gl_RayFlagsSkipTrianglesEXT = 256U;\"\n            \"const uint gl_RayFlagsSkipBuiltinPrimitivesNV = 256U;\"\n            \"const uint gl_RayFlagsSkipAABBEXT = 512U;\"\n            \"const uint gl_RayFlagsForceOpacityMicromap2StateEXT = 1024U;\"\n            \"const uint gl_HitKindFrontFacingTriangleEXT = 254U;\"\n            \"const uint gl_HitKindBackFacingTriangleEXT = 255U;\"\n            \"in    uint gl_HitKindFrontFacingMicroTriangleNV;\"\n            \"in    uint gl_HitKindBackFacingMicroTriangleNV;\"\n            \"const int  gl_ClusterIDNoneNV = -1;\"\n            \"\\n\";\n\n        const char *constRayQueryIntersection =\n            \"const uint gl_RayQueryCandidateIntersectionEXT = 0U;\"\n            \"const uint gl_RayQueryCommittedIntersectionEXT = 1U;\"\n            \"const uint gl_RayQueryCommittedIntersectionNoneEXT = 0U;\"\n            \"const uint gl_RayQueryCommittedIntersectionTriangleEXT = 1U;\"\n            \"const uint gl_RayQueryCommittedIntersectionGeneratedEXT = 2U;\"\n            \"const uint gl_RayQueryCandidateIntersectionTriangleEXT = 0U;\"\n            \"const uint gl_RayQueryCandidateIntersectionAABBEXT = 1U;\"\n            \"\\n\";\n\n        const char *rayGenDecls =\n            \"in    uvec3  gl_LaunchIDNV;\"\n            \"in    uvec3  gl_LaunchIDEXT;\"\n            \"in    uvec3  gl_LaunchSizeNV;\"\n            \"in    uvec3  gl_LaunchSizeEXT;\"\n            \"\\n\";\n        const char *intersectDecls =\n            \"in    uvec3  gl_LaunchIDNV;\"\n            \"in    uvec3  gl_LaunchIDEXT;\"\n            \"in    uvec3  gl_LaunchSizeNV;\"\n            \"in    uvec3  gl_LaunchSizeEXT;\"\n            \"in     int   gl_PrimitiveID;\"\n            \"in     int   gl_InstanceID;\"\n            \"in     int   gl_InstanceCustomIndexNV;\"\n            \"in     int   gl_InstanceCustomIndexEXT;\"\n            \"in     int   gl_GeometryIndexEXT;\"\n            \"in    vec3   gl_WorldRayOriginNV;\"\n            \"in    vec3   gl_WorldRayOriginEXT;\"\n            \"in    vec3   gl_WorldRayDirectionNV;\"\n            \"in    vec3   gl_WorldRayDirectionEXT;\"\n            \"in    vec3   gl_ObjectRayOriginNV;\"\n            \"in    vec3   gl_ObjectRayOriginEXT;\"\n            \"in    vec3   gl_ObjectRayDirectionNV;\"\n            \"in    vec3   gl_ObjectRayDirectionEXT;\"\n            \"in    float  gl_RayTminNV;\"\n            \"in    float  gl_RayTminEXT;\"\n            \"in    float  gl_RayTmaxNV;\"\n            \"in volatile float gl_RayTmaxEXT;\"\n            \"in    mat4x3 gl_ObjectToWorldNV;\"\n            \"in    mat4x3 gl_ObjectToWorldEXT;\"\n            \"in    mat3x4 gl_ObjectToWorld3x4EXT;\"\n            \"in    mat4x3 gl_WorldToObjectNV;\"\n            \"in    mat4x3 gl_WorldToObjectEXT;\"\n            \"in    mat3x4 gl_WorldToObject3x4EXT;\"\n            \"in    uint   gl_IncomingRayFlagsNV;\"\n            \"in    uint   gl_IncomingRayFlagsEXT;\"\n            \"in    float  gl_CurrentRayTimeNV;\"\n            \"in    uint   gl_CullMaskEXT;\"\n            \"\\n\";\n        const char *hitDecls =\n            \"in    uvec3  gl_LaunchIDNV;\"\n            \"in    uvec3  gl_LaunchIDEXT;\"\n            \"in    uvec3  gl_LaunchSizeNV;\"\n            \"in    uvec3  gl_LaunchSizeEXT;\"\n            \"in     int   gl_PrimitiveID;\"\n            \"in     int   gl_InstanceID;\"\n            \"in     int   gl_InstanceCustomIndexNV;\"\n            \"in     int   gl_InstanceCustomIndexEXT;\"\n            \"in     int   gl_GeometryIndexEXT;\"\n            \"in    vec3   gl_WorldRayOriginNV;\"\n            \"in    vec3   gl_WorldRayOriginEXT;\"\n            \"in    vec3   gl_WorldRayDirectionNV;\"\n            \"in    vec3   gl_WorldRayDirectionEXT;\"\n            \"in    vec3   gl_ObjectRayOriginNV;\"\n            \"in    vec3   gl_ObjectRayOriginEXT;\"\n            \"in    vec3   gl_ObjectRayDirectionNV;\"\n            \"in    vec3   gl_ObjectRayDirectionEXT;\"\n            \"in    float  gl_RayTminNV;\"\n            \"in    float  gl_RayTminEXT;\"\n            \"in    float  gl_RayTmaxNV;\"\n            \"in    float  gl_RayTmaxEXT;\"\n            \"in    float  gl_HitTNV;\"\n            \"in    float  gl_HitTEXT;\"\n            \"in    uint   gl_HitKindNV;\"\n            \"in    uint   gl_HitKindEXT;\"\n            \"in    mat4x3 gl_ObjectToWorldNV;\"\n            \"in    mat4x3 gl_ObjectToWorldEXT;\"\n            \"in    mat3x4 gl_ObjectToWorld3x4EXT;\"\n            \"in    mat4x3 gl_WorldToObjectNV;\"\n            \"in    mat4x3 gl_WorldToObjectEXT;\"\n            \"in    mat3x4 gl_WorldToObject3x4EXT;\"\n            \"in    uint   gl_IncomingRayFlagsNV;\"\n            \"in    uint   gl_IncomingRayFlagsEXT;\"\n            \"in    float  gl_CurrentRayTimeNV;\"\n            \"in    uint   gl_CullMaskEXT;\"\n            \"in    vec3   gl_HitTriangleVertexPositionsEXT[3];\"\n            \"in    vec3   gl_HitMicroTriangleVertexPositionsNV[3];\"\n            \"in    vec2   gl_HitMicroTriangleVertexBarycentricsNV[3];\"\n            \"in    int    gl_ClusterIDNV;\"\n            \"in    bool   gl_HitIsSphereNV;\"\n            \"in    bool   gl_HitIsLSSNV;\"\n            \"in    vec3   gl_HitSpherePositionNV;\"\n            \"in    float  gl_HitSphereRadiusNV;\"\n            \"in    vec3   gl_HitLSSPositionsNV[2];\"\n            \"in    float  gl_HitLSSRadiiNV[2];\"\n            \"\\n\";\n\n        const char *missDecls =\n            \"in    uvec3  gl_LaunchIDNV;\"\n            \"in    uvec3  gl_LaunchIDEXT;\"\n            \"in    uvec3  gl_LaunchSizeNV;\"\n            \"in    uvec3  gl_LaunchSizeEXT;\"\n            \"in    vec3   gl_WorldRayOriginNV;\"\n            \"in    vec3   gl_WorldRayOriginEXT;\"\n            \"in    vec3   gl_WorldRayDirectionNV;\"\n            \"in    vec3   gl_WorldRayDirectionEXT;\"\n            \"in    vec3   gl_ObjectRayOriginNV;\"\n            \"in    vec3   gl_ObjectRayDirectionNV;\"\n            \"in    float  gl_RayTminNV;\"\n            \"in    float  gl_RayTminEXT;\"\n            \"in    float  gl_RayTmaxNV;\"\n            \"in    float  gl_RayTmaxEXT;\"\n            \"in    uint   gl_IncomingRayFlagsNV;\"\n            \"in    uint   gl_IncomingRayFlagsEXT;\"\n            \"in    float  gl_CurrentRayTimeNV;\"\n            \"in    uint   gl_CullMaskEXT;\"\n            \"\\n\";\n\n        const char *callableDecls =\n            \"in    uvec3  gl_LaunchIDNV;\"\n            \"in    uvec3  gl_LaunchIDEXT;\"\n            \"in    uvec3  gl_LaunchSizeNV;\"\n            \"in    uvec3  gl_LaunchSizeEXT;\"\n            \"\\n\";\n\n\n        commonBuiltins.append(constRayQueryIntersection);\n        commonBuiltins.append(constRayFlags);\n\n        stageBuiltins[EShLangRayGen].append(rayGenDecls);\n        stageBuiltins[EShLangIntersect].append(intersectDecls);\n        stageBuiltins[EShLangAnyHit].append(hitDecls);\n        stageBuiltins[EShLangClosestHit].append(hitDecls);\n        stageBuiltins[EShLangMiss].append(missDecls);\n        stageBuiltins[EShLangCallable].append(callableDecls);\n\n    }\n\n    if ((profile != EEsProfile && version >= 140)) {\n        const char *deviceIndex =\n            \"in highp int gl_DeviceIndex;\"     // GL_EXT_device_group\n            \"\\n\";\n\n        stageBuiltins[EShLangRayGen].append(deviceIndex);\n        stageBuiltins[EShLangIntersect].append(deviceIndex);\n        stageBuiltins[EShLangAnyHit].append(deviceIndex);\n        stageBuiltins[EShLangClosestHit].append(deviceIndex);\n        stageBuiltins[EShLangMiss].append(deviceIndex);\n    }\n\n    if ((profile != EEsProfile && version >= 420) ||\n        (profile == EEsProfile && version >= 310)) {\n        commonBuiltins.append(\"const int gl_ScopeDevice      = 1;\\n\");\n        commonBuiltins.append(\"const int gl_ScopeWorkgroup   = 2;\\n\");\n        commonBuiltins.append(\"const int gl_ScopeSubgroup    = 3;\\n\");\n        commonBuiltins.append(\"const int gl_ScopeInvocation  = 4;\\n\");\n        commonBuiltins.append(\"const int gl_ScopeQueueFamily = 5;\\n\");\n        commonBuiltins.append(\"const int gl_ScopeShaderCallEXT = 6;\\n\");\n\n        commonBuiltins.append(\"const int gl_SemanticsRelaxed         = 0x0;\\n\");\n        commonBuiltins.append(\"const int gl_SemanticsAcquire         = 0x2;\\n\");\n        commonBuiltins.append(\"const int gl_SemanticsRelease         = 0x4;\\n\");\n        commonBuiltins.append(\"const int gl_SemanticsAcquireRelease  = 0x8;\\n\");\n        commonBuiltins.append(\"const int gl_SemanticsMakeAvailable   = 0x2000;\\n\");\n        commonBuiltins.append(\"const int gl_SemanticsMakeVisible     = 0x4000;\\n\");\n        commonBuiltins.append(\"const int gl_SemanticsVolatile        = 0x8000;\\n\");\n\n        commonBuiltins.append(\"const int gl_StorageSemanticsNone     = 0x0;\\n\");\n        commonBuiltins.append(\"const int gl_StorageSemanticsBuffer   = 0x40;\\n\");\n        commonBuiltins.append(\"const int gl_StorageSemanticsShared   = 0x100;\\n\");\n        commonBuiltins.append(\"const int gl_StorageSemanticsImage    = 0x800;\\n\");\n        commonBuiltins.append(\"const int gl_StorageSemanticsOutput   = 0x1000;\\n\");\n    }\n\n    // Adding these to common built-ins triggers an assert due to a memory corruption in related code when testing\n    // So instead add to each stage individually, avoiding the GLSLang bug\n    if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 310)) {\n        for (int stage=EShLangVertex; stage<EShLangCount; stage++)\n        {\n            stageBuiltins[static_cast<EShLanguage>(stage)].append(\"const highp int gl_ShadingRateFlag2VerticalPixelsEXT       = 1;\\n\");\n            stageBuiltins[static_cast<EShLanguage>(stage)].append(\"const highp int gl_ShadingRateFlag4VerticalPixelsEXT       = 2;\\n\");\n            stageBuiltins[static_cast<EShLanguage>(stage)].append(\"const highp int gl_ShadingRateFlag2HorizontalPixelsEXT     = 4;\\n\");\n            stageBuiltins[static_cast<EShLanguage>(stage)].append(\"const highp int gl_ShadingRateFlag4HorizontalPixelsEXT     = 8;\\n\");\n        }\n    }\n    \n    // GL_EXT_shader_image_int64\n    if ((profile != EEsProfile && version >= 420) ||\n        (profile == EEsProfile && version >= 310)) {\n            \n        const TBasicType bTypes[] = { EbtInt64, EbtUint64 };\n        for (int ms = 0; ms <= 1; ++ms) { // loop over \"bool\" multisample or not\n            for (int arrayed = 0; arrayed <= 1; ++arrayed) { // loop over \"bool\" arrayed or not\n                for (int dim = Esd1D; dim < EsdSubpass; ++dim) { // 1D, ..., buffer\n                    if ((dim == Esd1D || dim == EsdRect) && profile == EEsProfile)\n                        continue;\n                    \n                    if ((dim == Esd3D || dim == EsdRect || dim == EsdBuffer) && arrayed)\n                        continue;\n                    \n                    if (dim != Esd2D && ms)\n                        continue;\n                    \n                    // Loop over the bTypes\n                    for (size_t bType = 0; bType < sizeof(bTypes)/sizeof(TBasicType); ++bType) {\n                        //\n                        // Now, make all the function prototypes for the type we just built...\n                        //\n                        TSampler sampler;\n                    \n                        sampler.setImage(bTypes[bType], (TSamplerDim)dim, arrayed ? true : false,\n                                                                          false,\n                                                                          ms      ? true : false);\n\n                        TString typeName = sampler.getString();\n\n                        addQueryFunctions(sampler, typeName, version, profile);\n                        addImageFunctions(sampler, typeName, version, profile);\n                    }\n                }\n            }\n        }\n    }\n\n    // printf(\"%s\\n\", commonBuiltins.c_str());\n    // printf(\"%s\\n\", stageBuiltins[EShLangFragment].c_str());\n}\n\n//\n// Helper function for initialize(), to add the second set of names for texturing,\n// when adding context-independent built-in functions.\n//\nvoid TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, const SpvVersion& spvVersion)\n{\n    //\n    // In this function proper, enumerate the types, then calls the next set of functions\n    // to enumerate all the uses for that type.\n    //\n\n    // enumerate all the types\n    const TBasicType bTypes[] = { EbtFloat, EbtInt, EbtUint,\n         EbtFloat16\n    };\n    bool skipBuffer = (profile == EEsProfile && version < 310) || (profile != EEsProfile && version < 140);\n    bool skipCubeArrayed = (profile == EEsProfile && version < 310) || (profile != EEsProfile && version < 130);\n    for (int image = 0; image <= 1; ++image) // loop over \"bool\" image vs sampler\n    {\n        for (int shadow = 0; shadow <= 1; ++shadow) { // loop over \"bool\" shadow or not\n            for (int ms = 0; ms <= 1; ++ms) // loop over \"bool\" multisample or not\n            {\n                if ((ms || image) && shadow)\n                    continue;\n                if (ms && profile != EEsProfile && version < 140)\n                    continue;\n                if (ms && image && profile == EEsProfile)\n                    continue;\n                if (ms && profile == EEsProfile && version < 310)\n                    continue;\n\n                for (int arrayed = 0; arrayed <= 1; ++arrayed) { // loop over \"bool\" arrayed or not\n                    for (int dim = Esd1D; dim < EsdNumDims; ++dim) { // 1D, ..., buffer, subpass\n                        if (dim == EsdAttachmentEXT)\n                            continue;\n                        if (dim == EsdSubpass && spvVersion.vulkan == 0)\n                            continue;\n                        if (dim == EsdSubpass && (image || shadow || arrayed))\n                            continue;\n                        if ((dim == Esd1D || dim == EsdRect) && profile == EEsProfile)\n                            continue;\n                        if (dim == EsdSubpass && spvVersion.vulkan == 0)\n                            continue;\n                        if (dim == EsdSubpass && (image || shadow || arrayed))\n                            continue;\n                        if ((dim == Esd1D || dim == EsdRect) && profile == EEsProfile)\n                            continue;\n                        if (dim != Esd2D && dim != EsdSubpass && ms)\n                            continue;\n                        if (dim == EsdBuffer && skipBuffer)\n                            continue;\n                        if (dim == EsdBuffer && (shadow || arrayed || ms))\n                            continue;\n                        if (ms && arrayed && profile == EEsProfile && version < 310)\n                            continue;\n                        if (dim == Esd3D && shadow)\n                            continue;\n                        if (dim == EsdCube && arrayed && skipCubeArrayed)\n                            continue;\n                        if ((dim == Esd3D || dim == EsdRect) && arrayed)\n                            continue;\n\n                        // Loop over the bTypes\n                        for (size_t bType = 0; bType < sizeof(bTypes)/sizeof(TBasicType); ++bType) {\n                            if (bTypes[bType] == EbtFloat16 && (profile == EEsProfile || version < 450))\n                                continue;\n                            if (dim == EsdRect && version < 140 && bType > 0)\n                                continue;\n                            if (shadow && (bTypes[bType] == EbtInt || bTypes[bType] == EbtUint))\n                                continue;\n                            //\n                            // Now, make all the function prototypes for the type we just built...\n                            //\n                            TSampler sampler;\n                            if (dim == EsdSubpass) {\n                                sampler.setSubpass(bTypes[bType], ms ? true : false);\n                            } else if (dim == EsdAttachmentEXT) {\n                                sampler.setAttachmentEXT(bTypes[bType]);\n                            } else\n                            if (image) {\n                                sampler.setImage(bTypes[bType], (TSamplerDim)dim, arrayed ? true : false,\n                                                                                  shadow  ? true : false,\n                                                                                  ms      ? true : false);\n                            } else {\n                                sampler.set(bTypes[bType], (TSamplerDim)dim, arrayed ? true : false,\n                                                                             shadow  ? true : false,\n                                                                             ms      ? true : false);\n                            }\n\n                            TString typeName = sampler.getString();\n\n                            if (dim == EsdSubpass) {\n                                addSubpassSampling(sampler, typeName, version, profile);\n                                continue;\n                            }\n\n                            addQueryFunctions(sampler, typeName, version, profile);\n\n                            if (image)\n                                addImageFunctions(sampler, typeName, version, profile);\n                            else {\n                                addSamplingFunctions(sampler, typeName, version, profile);\n                                addGatherFunctions(sampler, typeName, version, profile);\n                                if (spvVersion.vulkan > 0 && sampler.isCombined() && !sampler.shadow) {\n                                    // Base Vulkan allows texelFetch() for\n                                    // textureBuffer (i.e. without sampler).\n                                    //\n                                    // GL_EXT_samplerless_texture_functions\n                                    // allows texelFetch() and query functions\n                                    // (other than textureQueryLod()) for all\n                                    // texture types.\n                                    sampler.setTexture(sampler.type, sampler.dim, sampler.arrayed, sampler.shadow,\n                                                       sampler.ms);\n                                    TString textureTypeName = sampler.getString();\n                                    addSamplingFunctions(sampler, textureTypeName, version, profile);\n                                    addQueryFunctions(sampler, textureTypeName, version, profile);\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    //\n    // sparseTexelsResidentARB()\n    //\n    if (profile != EEsProfile && version >= 450) {\n        commonBuiltins.append(\"bool sparseTexelsResidentARB(int code);\\n\");\n    }\n}\n\n//\n// Helper function for add2ndGenerationSamplingImaging(),\n// when adding context-independent built-in functions.\n//\n// Add all the query functions for the given type.\n//\nvoid TBuiltIns::addQueryFunctions(TSampler sampler, const TString& typeName, int version, EProfile profile)\n{\n    //\n    // textureSize() and imageSize()\n    //\n\n    int sizeDims = dimMap[sampler.dim] + (sampler.arrayed ? 1 : 0) - (sampler.dim == EsdCube ? 1 : 0);\n\n    if (sampler.isImage() && ((profile == EEsProfile && version < 310) || (profile != EEsProfile && version < 420)))\n        return;\n\n    if (profile == EEsProfile)\n        commonBuiltins.append(\"highp \");\n    if (sizeDims == 1)\n        commonBuiltins.append(\"int\");\n    else {\n        commonBuiltins.append(\"ivec\");\n        commonBuiltins.append(postfixes[sizeDims]);\n    }\n    if (sampler.isImage())\n        commonBuiltins.append(\" imageSize(readonly writeonly volatile coherent nontemporal \");\n    else\n        commonBuiltins.append(\" textureSize(\");\n    commonBuiltins.append(typeName);\n    if (! sampler.isImage() && ! sampler.isRect() && ! sampler.isBuffer() && ! sampler.isMultiSample())\n        commonBuiltins.append(\",int);\\n\");\n    else\n        commonBuiltins.append(\");\\n\");\n\n    //\n    // textureSamples() and imageSamples()\n    //\n\n    // GL_ARB_shader_texture_image_samples\n    // TODO: spec issue? there are no memory qualifiers; how to query a writeonly/readonly image, etc?\n    if (profile != EEsProfile && version >= 430 && sampler.isMultiSample()) {\n        commonBuiltins.append(\"int \");\n        if (sampler.isImage())\n            commonBuiltins.append(\"imageSamples(readonly writeonly volatile coherent nontemporal \");\n        else\n            commonBuiltins.append(\"textureSamples(\");\n        commonBuiltins.append(typeName);\n        commonBuiltins.append(\");\\n\");\n    }\n\n    //\n    // textureQueryLod(), fragment stage only\n    // Also enabled with extension GL_ARB_texture_query_lod\n    // Extension GL_ARB_texture_query_lod says that textureQueryLOD() also exist at extension.\n\n    if (profile != EEsProfile && version >= 150 && sampler.isCombined() && sampler.dim != EsdRect &&\n        ! sampler.isMultiSample() && ! sampler.isBuffer()) {\n\n        const TString funcName[2] = {\"vec2 textureQueryLod(\", \"vec2 textureQueryLOD(\"};\n\n        for (int i = 0; i < 2; ++i){\n            for (int f16TexAddr = 0; f16TexAddr < 2; ++f16TexAddr) {\n                if (f16TexAddr && sampler.type != EbtFloat16)\n                    continue;\n                stageBuiltins[EShLangFragment].append(funcName[i]);\n                stageBuiltins[EShLangFragment].append(typeName);\n                if (dimMap[sampler.dim] == 1)\n                    if (f16TexAddr)\n                        stageBuiltins[EShLangFragment].append(\", float16_t\");\n                    else\n                        stageBuiltins[EShLangFragment].append(\", float\");\n                else {\n                    if (f16TexAddr)\n                        stageBuiltins[EShLangFragment].append(\", f16vec\");\n                    else\n                        stageBuiltins[EShLangFragment].append(\", vec\");\n                    stageBuiltins[EShLangFragment].append(postfixes[dimMap[sampler.dim]]);\n                }\n                stageBuiltins[EShLangFragment].append(\");\\n\");\n            }\n\n            stageBuiltins[EShLangCompute].append(funcName[i]);\n            stageBuiltins[EShLangCompute].append(typeName);\n            if (dimMap[sampler.dim] == 1)\n                stageBuiltins[EShLangCompute].append(\", float\");\n            else {\n                stageBuiltins[EShLangCompute].append(\", vec\");\n                stageBuiltins[EShLangCompute].append(postfixes[dimMap[sampler.dim]]);\n            }\n            stageBuiltins[EShLangCompute].append(\");\\n\");\n        }\n    }\n\n    //\n    // textureQueryLevels()\n    //\n\n    if (profile != EEsProfile && version >= 430 && ! sampler.isImage() && sampler.dim != EsdRect &&\n        ! sampler.isMultiSample() && ! sampler.isBuffer()) {\n        commonBuiltins.append(\"int textureQueryLevels(\");\n        commonBuiltins.append(typeName);\n        commonBuiltins.append(\");\\n\");\n    }\n}\n\n//\n// Helper function for add2ndGenerationSamplingImaging(),\n// when adding context-independent built-in functions.\n//\n// Add all the image access functions for the given type.\n//\nvoid TBuiltIns::addImageFunctions(TSampler sampler, const TString& typeName, int version, EProfile profile)\n{\n    int dims = dimMap[sampler.dim];\n    // most things with an array add a dimension, except for cubemaps\n    if (sampler.arrayed && sampler.dim != EsdCube)\n        ++dims;\n\n    TString imageParams = typeName;\n    if (dims == 1)\n        imageParams.append(\", int\");\n    else {\n        imageParams.append(\", ivec\");\n        imageParams.append(postfixes[dims]);\n    }\n    if (sampler.isMultiSample())\n        imageParams.append(\", int\");\n\n    if (profile == EEsProfile)\n        commonBuiltins.append(\"highp \");\n    commonBuiltins.append(prefixes[sampler.type]);\n    commonBuiltins.append(\"vec4 imageLoad(readonly volatile coherent nontemporal \");\n    commonBuiltins.append(imageParams);\n    commonBuiltins.append(\");\\n\");\n\n    commonBuiltins.append(\"void imageStore(writeonly volatile coherent nontemporal \");\n    commonBuiltins.append(imageParams);\n    commonBuiltins.append(\", \");\n    commonBuiltins.append(prefixes[sampler.type]);\n    commonBuiltins.append(\"vec4);\\n\");\n\n    if (! sampler.is1D() && ! sampler.isBuffer() && profile != EEsProfile && version >= 450) {\n        commonBuiltins.append(\"int sparseImageLoadARB(readonly volatile coherent nontemporal \");\n        commonBuiltins.append(imageParams);\n        commonBuiltins.append(\", out \");\n        commonBuiltins.append(prefixes[sampler.type]);\n        commonBuiltins.append(\"vec4\");\n        commonBuiltins.append(\");\\n\");\n    }\n\n    if ( profile != EEsProfile ||\n        (profile == EEsProfile && version >= 310)) {\n        if (sampler.type == EbtInt || sampler.type == EbtUint || sampler.type == EbtInt64 || sampler.type == EbtUint64 ) {\n            \n            const char* dataType;\n            switch (sampler.type) {\n                case(EbtInt): dataType = \"highp int\"; break;\n                case(EbtUint): dataType = \"highp uint\"; break;\n                case(EbtInt64): dataType = \"highp int64_t\"; break;\n                case(EbtUint64): dataType = \"highp uint64_t\"; break;\n                default: dataType = \"\";\n            }\n\n            const int numBuiltins = 7;\n\n            static const char* atomicFunc[numBuiltins] = {\n                \" imageAtomicAdd(volatile coherent nontemporal \",\n                \" imageAtomicMin(volatile coherent nontemporal \",\n                \" imageAtomicMax(volatile coherent nontemporal \",\n                \" imageAtomicAnd(volatile coherent nontemporal \",\n                \" imageAtomicOr(volatile coherent nontemporal \",\n                \" imageAtomicXor(volatile coherent nontemporal \",\n                \" imageAtomicExchange(volatile coherent nontemporal \"\n            };\n\n            // Loop twice to add prototypes with/without scope/semantics\n            for (int j = 0; j < 2; ++j) {\n                for (size_t i = 0; i < numBuiltins; ++i) {\n                    commonBuiltins.append(dataType);\n                    commonBuiltins.append(atomicFunc[i]);\n                    commonBuiltins.append(imageParams);\n                    commonBuiltins.append(\", \");\n                    commonBuiltins.append(dataType);\n                    if (j == 1) {\n                        commonBuiltins.append(\", int, int, int\");\n                    }\n                    commonBuiltins.append(\");\\n\");\n                }\n\n                commonBuiltins.append(dataType);\n                commonBuiltins.append(\" imageAtomicCompSwap(volatile coherent nontemporal \");\n                commonBuiltins.append(imageParams);\n                commonBuiltins.append(\", \");\n                commonBuiltins.append(dataType);\n                commonBuiltins.append(\", \");\n                commonBuiltins.append(dataType);\n                if (j == 1) {\n                    commonBuiltins.append(\", int, int, int, int, int\");\n                }\n                commonBuiltins.append(\");\\n\");\n            }\n\n            commonBuiltins.append(dataType);\n            commonBuiltins.append(\" imageAtomicLoad(volatile coherent nontemporal \");\n            commonBuiltins.append(imageParams);\n            commonBuiltins.append(\", int, int, int);\\n\");\n\n            commonBuiltins.append(\"void imageAtomicStore(volatile coherent nontemporal \");\n            commonBuiltins.append(imageParams);\n            commonBuiltins.append(\", \");\n            commonBuiltins.append(dataType);\n            commonBuiltins.append(\", int, int, int);\\n\");\n\n        } else {\n            // not int or uint\n            // GL_ARB_ES3_1_compatibility\n            // TODO: spec issue: are there restrictions on the kind of layout() that can be used?  what about dropping memory qualifiers?\n            if (profile == EEsProfile && version >= 310) {\n                commonBuiltins.append(\"float imageAtomicExchange(volatile coherent nontemporal \");\n                commonBuiltins.append(imageParams);\n                commonBuiltins.append(\", float);\\n\");\n            }\n\n            // GL_NV_shader_atomic_fp16_vector\n            if (profile != EEsProfile && version >= 430) {\n                const int numFp16Builtins = 4;\n                const char* atomicFp16Func[numFp16Builtins] = {\n                    \" imageAtomicAdd(volatile coherent nontemporal \",\n                    \" imageAtomicMin(volatile coherent nontemporal \",\n                    \" imageAtomicMax(volatile coherent nontemporal \",\n                    \" imageAtomicExchange(volatile coherent nontemporal \"\n                };\n                const int numFp16DataTypes = 2;\n                const char* atomicFp16DataTypes[numFp16DataTypes] = {\n                    \"f16vec2\",\n                    \"f16vec4\"\n                };\n                // Loop twice to add prototypes with/without scope/semantics\n                for (int j = 0; j < numFp16DataTypes; ++j) {\n                    for (int i = 0; i < numFp16Builtins; ++i) {\n                        commonBuiltins.append(atomicFp16DataTypes[j]);\n                        commonBuiltins.append(atomicFp16Func[i]);\n                        commonBuiltins.append(imageParams);\n                        commonBuiltins.append(\", \");\n                        commonBuiltins.append(atomicFp16DataTypes[j]);\n                        commonBuiltins.append(\");\\n\");\n                    }\n                }\n            }\n\n            if (profile != EEsProfile && version >= 450) {\n                commonBuiltins.append(\"float imageAtomicAdd(volatile coherent nontemporal \");\n                commonBuiltins.append(imageParams);\n                commonBuiltins.append(\", float);\\n\");\n\n                commonBuiltins.append(\"float imageAtomicAdd(volatile coherent nontemporal \");\n                commonBuiltins.append(imageParams);\n                commonBuiltins.append(\", float\");\n                commonBuiltins.append(\", int, int, int);\\n\");\n\n                commonBuiltins.append(\"float imageAtomicExchange(volatile coherent nontemporal \");\n                commonBuiltins.append(imageParams);\n                commonBuiltins.append(\", float);\\n\");\n\n                commonBuiltins.append(\"float imageAtomicExchange(volatile coherent nontemporal \");\n                commonBuiltins.append(imageParams);\n                commonBuiltins.append(\", float\");\n                commonBuiltins.append(\", int, int, int);\\n\");\n\n                commonBuiltins.append(\"float imageAtomicLoad(readonly volatile coherent nontemporal \");\n                commonBuiltins.append(imageParams);\n                commonBuiltins.append(\", int, int, int);\\n\");\n\n                commonBuiltins.append(\"void imageAtomicStore(writeonly volatile coherent nontemporal \");\n                commonBuiltins.append(imageParams);\n                commonBuiltins.append(\", float\");\n                commonBuiltins.append(\", int, int, int);\\n\");\n\n                commonBuiltins.append(\"float imageAtomicMin(volatile coherent nontemporal \");\n                commonBuiltins.append(imageParams);\n                commonBuiltins.append(\", float);\\n\");\n\n                commonBuiltins.append(\"float imageAtomicMin(volatile coherent nontemporal \");\n                commonBuiltins.append(imageParams);\n                commonBuiltins.append(\", float\");\n                commonBuiltins.append(\", int, int, int);\\n\");\n\n                commonBuiltins.append(\"float imageAtomicMax(volatile coherent nontemporal \");\n                commonBuiltins.append(imageParams);\n                commonBuiltins.append(\", float);\\n\");\n\n                commonBuiltins.append(\"float imageAtomicMax(volatile coherent nontemporal \");\n                commonBuiltins.append(imageParams);\n                commonBuiltins.append(\", float\");\n                commonBuiltins.append(\", int, int, int);\\n\");\n            }\n        }\n    }\n\n    if (sampler.dim == EsdRect || sampler.dim == EsdBuffer || sampler.shadow || sampler.isMultiSample())\n        return;\n\n    if (profile == EEsProfile || version < 450)\n        return;\n\n    TString imageLodParams = typeName;\n    if (dims == 1)\n        imageLodParams.append(\", int\");\n    else {\n        imageLodParams.append(\", ivec\");\n        imageLodParams.append(postfixes[dims]);\n    }\n    imageLodParams.append(\", int\");\n\n    commonBuiltins.append(prefixes[sampler.type]);\n    commonBuiltins.append(\"vec4 imageLoadLodAMD(readonly volatile coherent nontemporal \");\n    commonBuiltins.append(imageLodParams);\n    commonBuiltins.append(\");\\n\");\n\n    commonBuiltins.append(\"void imageStoreLodAMD(writeonly volatile coherent nontemporal \");\n    commonBuiltins.append(imageLodParams);\n    commonBuiltins.append(\", \");\n    commonBuiltins.append(prefixes[sampler.type]);\n    commonBuiltins.append(\"vec4);\\n\");\n\n    if (! sampler.is1D()) {\n        commonBuiltins.append(\"int sparseImageLoadLodAMD(readonly volatile coherent nontemporal \");\n        commonBuiltins.append(imageLodParams);\n        commonBuiltins.append(\", out \");\n        commonBuiltins.append(prefixes[sampler.type]);\n        commonBuiltins.append(\"vec4\");\n        commonBuiltins.append(\");\\n\");\n    }\n}\n\n//\n// Helper function for initialize(),\n// when adding context-independent built-in functions.\n//\n// Add all the subpass access functions for the given type.\n//\nvoid TBuiltIns::addSubpassSampling(TSampler sampler, const TString& typeName, int /*version*/, EProfile /*profile*/)\n{\n    stageBuiltins[EShLangFragment].append(prefixes[sampler.type]);\n    stageBuiltins[EShLangFragment].append(\"vec4 subpassLoad\");\n    stageBuiltins[EShLangFragment].append(\"(\");\n    stageBuiltins[EShLangFragment].append(typeName.c_str());\n    if (sampler.isMultiSample())\n        stageBuiltins[EShLangFragment].append(\", int\");\n    stageBuiltins[EShLangFragment].append(\");\\n\");\n}\n\n//\n// Helper function for add2ndGenerationSamplingImaging(),\n// when adding context-independent built-in functions.\n//\n// Add all the texture lookup functions for the given type.\n//\nvoid TBuiltIns::addSamplingFunctions(TSampler sampler, const TString& typeName, int version, EProfile profile)\n{\n    //\n    // texturing\n    //\n    for (int proj = 0; proj <= 1; ++proj) { // loop over \"bool\" projective or not\n\n        if (proj && (sampler.dim == EsdCube || sampler.isBuffer() || sampler.arrayed || sampler.isMultiSample()\n            || !sampler.isCombined()))\n            continue;\n\n        for (int lod = 0; lod <= 1; ++lod) {\n\n            if (lod && (sampler.isBuffer() || sampler.isRect() || sampler.isMultiSample() || !sampler.isCombined()))\n                continue;\n            if (lod && sampler.dim == Esd2D && sampler.arrayed && sampler.shadow)\n                continue;\n            if (lod && sampler.dim == EsdCube && sampler.shadow)\n                continue;\n\n            for (int bias = 0; bias <= 1; ++bias) {\n\n                if (bias && (lod || sampler.isMultiSample() || !sampler.isCombined()))\n                    continue;\n                if (bias && (sampler.dim == Esd2D || sampler.dim == EsdCube) && sampler.shadow && sampler.arrayed)\n                    continue;\n                if (bias && (sampler.isRect() || sampler.isBuffer()))\n                    continue;\n\n                for (int offset = 0; offset <= 1; ++offset) { // loop over \"bool\" offset or not\n\n                    if (proj + offset + bias + lod > 3)\n                        continue;\n                    if (offset && (sampler.dim == EsdCube || sampler.isBuffer() || sampler.isMultiSample()))\n                        continue;\n\n                    for (int fetch = 0; fetch <= 1; ++fetch) { // loop over \"bool\" fetch or not\n\n                        if (proj + offset + fetch + bias + lod > 3)\n                            continue;\n                        if (fetch && (lod || bias))\n                            continue;\n                        if (fetch && (sampler.shadow || sampler.dim == EsdCube))\n                            continue;\n                        if (fetch == 0 && (sampler.isMultiSample() || sampler.isBuffer()\n                            || !sampler.isCombined()))\n                            continue;\n\n                        for (int grad = 0; grad <= 1; ++grad) { // loop over \"bool\" grad or not\n\n                            if (grad && (lod || bias || sampler.isMultiSample() || !sampler.isCombined()))\n                                continue;\n                            if (grad && sampler.isBuffer())\n                                continue;\n                            if (proj + offset + fetch + grad + bias + lod > 3)\n                                continue;\n\n                            for (int extraProj = 0; extraProj <= 1; ++extraProj) {\n                                bool compare = false;\n                                int totalDims = dimMap[sampler.dim] + (sampler.arrayed ? 1 : 0);\n                                // skip dummy unused second component for 1D non-array shadows\n                                if (sampler.shadow && totalDims < 2)\n                                    totalDims = 2;\n                                totalDims += (sampler.shadow ? 1 : 0) + proj;\n                                if (totalDims > 4 && sampler.shadow) {\n                                    compare = true;\n                                    totalDims = 4;\n                                }\n                                assert(totalDims <= 4);\n\n                                if (extraProj && ! proj)\n                                    continue;\n                                if (extraProj && (sampler.dim == Esd3D || sampler.shadow || !sampler.isCombined()))\n                                    continue;\n\n                                // loop over 16-bit floating-point texel addressing\n                                for (int f16TexAddr = 0; f16TexAddr <= 1; ++f16TexAddr)\n                                {\n                                    if (f16TexAddr && sampler.type != EbtFloat16)\n                                        continue;\n                                    if (f16TexAddr && sampler.shadow && ! compare) {\n                                        compare = true; // compare argument is always present\n                                        totalDims--;\n                                    }\n                                    // loop over \"bool\" lod clamp\n                                    for (int lodClamp = 0; lodClamp <= 1 ;++lodClamp)\n                                    {\n                                        if (lodClamp && (profile == EEsProfile || version < 450))\n                                            continue;\n                                        if (lodClamp && (proj || lod || fetch))\n                                            continue;\n\n                                        // loop over \"bool\" sparse or not\n                                        for (int sparse = 0; sparse <= 1; ++sparse)\n                                        {\n                                            if (sparse && (profile == EEsProfile || version < 450))\n                                                continue;\n                                            // Sparse sampling is not for 1D/1D array texture, buffer texture, and\n                                            // projective texture\n                                            if (sparse && (sampler.is1D() || sampler.isBuffer() || proj))\n                                                continue;\n\n                                            TString s;\n\n                                            // return type\n                                            if (sparse)\n                                                s.append(\"int \");\n                                            else {\n                                                if (sampler.shadow)\n                                                    if (sampler.type == EbtFloat16)\n                                                        s.append(\"float16_t \");\n                                                    else\n                                                        s.append(\"float \");\n                                                else {\n                                                    s.append(prefixes[sampler.type]);\n                                                    s.append(\"vec4 \");\n                                                }\n                                            }\n\n                                            // name\n                                            if (sparse) {\n                                                if (fetch)\n                                                    s.append(\"sparseTexel\");\n                                                else\n                                                    s.append(\"sparseTexture\");\n                                            }\n                                            else {\n                                                if (fetch)\n                                                    s.append(\"texel\");\n                                                else\n                                                    s.append(\"texture\");\n                                            }\n                                            if (proj)\n                                                s.append(\"Proj\");\n                                            if (lod)\n                                                s.append(\"Lod\");\n                                            if (grad)\n                                                s.append(\"Grad\");\n                                            if (fetch)\n                                                s.append(\"Fetch\");\n                                            if (offset)\n                                                s.append(\"Offset\");\n                                            if (lodClamp)\n                                                s.append(\"Clamp\");\n                                            if (lodClamp != 0 || sparse)\n                                                s.append(\"ARB\");\n                                            s.append(\"(\");\n\n                                            // sampler type\n                                            s.append(typeName);\n                                            // P coordinate\n                                            if (extraProj) {\n                                                if (f16TexAddr)\n                                                    s.append(\",f16vec4\");\n                                                else\n                                                    s.append(\",vec4\");\n                                            } else {\n                                                s.append(\",\");\n                                                TBasicType t = fetch ? EbtInt : (f16TexAddr ? EbtFloat16 : EbtFloat);\n                                                if (totalDims == 1)\n                                                    s.append(TType::getBasicString(t));\n                                                else {\n                                                    s.append(prefixes[t]);\n                                                    s.append(\"vec\");\n                                                    s.append(postfixes[totalDims]);\n                                                }\n                                            }\n                                            // non-optional compare\n                                            if (compare)\n                                                s.append(\",float\");\n\n                                            // non-optional lod argument (lod that's not driven by lod loop) or sample\n                                            if ((fetch && !sampler.isBuffer() &&\n                                                 !sampler.isRect() && !sampler.isMultiSample())\n                                                 || (sampler.isMultiSample() && fetch))\n                                                s.append(\",int\");\n                                            // non-optional lod\n                                            if (lod) {\n                                                if (f16TexAddr)\n                                                    s.append(\",float16_t\");\n                                                else\n                                                    s.append(\",float\");\n                                            }\n\n                                            // gradient arguments\n                                            if (grad) {\n                                                if (dimMap[sampler.dim] == 1) {\n                                                    if (f16TexAddr)\n                                                        s.append(\",float16_t,float16_t\");\n                                                    else\n                                                        s.append(\",float,float\");\n                                                } else {\n                                                    if (f16TexAddr)\n                                                        s.append(\",f16vec\");\n                                                    else\n                                                        s.append(\",vec\");\n                                                    s.append(postfixes[dimMap[sampler.dim]]);\n                                                    if (f16TexAddr)\n                                                        s.append(\",f16vec\");\n                                                    else\n                                                        s.append(\",vec\");\n                                                    s.append(postfixes[dimMap[sampler.dim]]);\n                                                }\n                                            }\n                                            // offset\n                                            if (offset) {\n                                                if (dimMap[sampler.dim] == 1)\n                                                    s.append(\",int\");\n                                                else {\n                                                    s.append(\",ivec\");\n                                                    s.append(postfixes[dimMap[sampler.dim]]);\n                                                }\n                                            }\n\n                                            // lod clamp\n                                            if (lodClamp) {\n                                                if (f16TexAddr)\n                                                    s.append(\",float16_t\");\n                                                else\n                                                    s.append(\",float\");\n                                            }\n                                            // texel out (for sparse texture)\n                                            if (sparse) {\n                                                s.append(\",out \");\n                                                if (sampler.shadow)\n                                                    if (sampler.type == EbtFloat16)\n                                                        s.append(\"float16_t\");\n                                                    else\n                                                        s.append(\"float\");\n                                                else {\n                                                    s.append(prefixes[sampler.type]);\n                                                    s.append(\"vec4\");\n                                                }\n                                            }\n                                            // optional bias\n                                            if (bias) {\n                                                if (f16TexAddr)\n                                                    s.append(\",float16_t\");\n                                                else\n                                                    s.append(\",float\");\n                                            }\n                                            s.append(\");\\n\");\n\n                                            // Add to the per-language set of built-ins\n                                            if (!grad && (bias || lodClamp != 0)) {\n                                                stageBuiltins[EShLangFragment].append(s);\n                                                stageBuiltins[EShLangCompute].append(s);\n                                            } else\n                                                commonBuiltins.append(s);\n\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\n//\n// Helper function for add2ndGenerationSamplingImaging(),\n// when adding context-independent built-in functions.\n//\n// Add all the texture gather functions for the given type.\n//\nvoid TBuiltIns::addGatherFunctions(TSampler sampler, const TString& typeName, int version, EProfile profile)\n{\n    switch (sampler.dim) {\n    case Esd2D:\n    case EsdRect:\n    case EsdCube:\n        break;\n    default:\n        return;\n    }\n\n    if (sampler.isMultiSample())\n        return;\n\n    if (version < 140 && sampler.dim == EsdRect && sampler.type != EbtFloat)\n        return;\n\n    for (int f16TexAddr = 0; f16TexAddr <= 1; ++f16TexAddr) { // loop over 16-bit floating-point texel addressing\n\n        if (f16TexAddr && sampler.type != EbtFloat16)\n            continue;\n        for (int offset = 0; offset < 3; ++offset) { // loop over three forms of offset in the call name:  none, Offset, and Offsets\n\n            for (int comp = 0; comp < 2; ++comp) { // loop over presence of comp argument\n\n                if (comp > 0 && sampler.shadow)\n                    continue;\n\n                if (offset > 0 && sampler.dim == EsdCube)\n                    continue;\n\n                for (int sparse = 0; sparse <= 1; ++sparse) { // loop over \"bool\" sparse or not\n                    if (sparse && (profile == EEsProfile || version < 450))\n                        continue;\n\n                    TString s;\n\n                    // return type\n                    if (sparse)\n                        s.append(\"int \");\n                    else {\n                        s.append(prefixes[sampler.type]);\n                        s.append(\"vec4 \");\n                    }\n\n                    // name\n                    if (sparse)\n                        s.append(\"sparseTextureGather\");\n                    else\n                        s.append(\"textureGather\");\n                    switch (offset) {\n                    case 1:\n                        s.append(\"Offset\");\n                        break;\n                    case 2:\n                        s.append(\"Offsets\");\n                        break;\n                    default:\n                        break;\n                    }\n                    if (sparse)\n                        s.append(\"ARB\");\n                    s.append(\"(\");\n\n                    // sampler type argument\n                    s.append(typeName);\n\n                    // P coordinate argument\n                    if (f16TexAddr)\n                        s.append(\",f16vec\");\n                    else\n                        s.append(\",vec\");\n                    int totalDims = dimMap[sampler.dim] + (sampler.arrayed ? 1 : 0);\n                    s.append(postfixes[totalDims]);\n\n                    // refZ argument\n                    if (sampler.shadow)\n                        s.append(\",float\");\n\n                    // offset argument\n                    if (offset > 0) {\n                        s.append(\",ivec2\");\n                        if (offset == 2)\n                            s.append(\"[4]\");\n                    }\n\n                    // texel out (for sparse texture)\n                    if (sparse) {\n                        s.append(\",out \");\n                        s.append(prefixes[sampler.type]);\n                        s.append(\"vec4 \");\n                    }\n\n                    // comp argument\n                    if (comp)\n                        s.append(\",int\");\n\n                    s.append(\");\\n\");\n                    commonBuiltins.append(s);\n                }\n            }\n        }\n    }\n\n    if (sampler.dim == EsdRect || sampler.shadow)\n        return;\n\n    if (profile == EEsProfile || version < 450)\n        return;\n\n    for (int bias = 0; bias < 2; ++bias) { // loop over presence of bias argument\n\n        for (int lod = 0; lod < 2; ++lod) { // loop over presence of lod argument\n\n            if ((lod && bias) || (lod == 0 && bias == 0))\n                continue;\n\n            for (int f16TexAddr = 0; f16TexAddr <= 1; ++f16TexAddr) { // loop over 16-bit floating-point texel addressing\n\n                if (f16TexAddr && sampler.type != EbtFloat16)\n                    continue;\n\n                for (int offset = 0; offset < 3; ++offset) { // loop over three forms of offset in the call name:  none, Offset, and Offsets\n\n                    for (int comp = 0; comp < 2; ++comp) { // loop over presence of comp argument\n\n                        if (comp == 0 && bias)\n                            continue;\n\n                        if (offset > 0 && sampler.dim == EsdCube)\n                            continue;\n\n                        for (int sparse = 0; sparse <= 1; ++sparse) { // loop over \"bool\" sparse or not\n                            if (sparse && (profile == EEsProfile || version < 450))\n                                continue;\n\n                            TString s;\n\n                            // return type\n                            if (sparse)\n                                s.append(\"int \");\n                            else {\n                                s.append(prefixes[sampler.type]);\n                                s.append(\"vec4 \");\n                            }\n\n                            // name\n                            if (sparse)\n                                s.append(\"sparseTextureGather\");\n                            else\n                                s.append(\"textureGather\");\n\n                            if (lod)\n                                s.append(\"Lod\");\n\n                            switch (offset) {\n                            case 1:\n                                s.append(\"Offset\");\n                                break;\n                            case 2:\n                                s.append(\"Offsets\");\n                                break;\n                            default:\n                                break;\n                            }\n\n                            if (lod)\n                                s.append(\"AMD\");\n                            else if (sparse)\n                                s.append(\"ARB\");\n\n                            s.append(\"(\");\n\n                            // sampler type argument\n                            s.append(typeName);\n\n                            // P coordinate argument\n                            if (f16TexAddr)\n                                s.append(\",f16vec\");\n                            else\n                                s.append(\",vec\");\n                            int totalDims = dimMap[sampler.dim] + (sampler.arrayed ? 1 : 0);\n                            s.append(postfixes[totalDims]);\n\n                            // lod argument\n                            if (lod) {\n                                if (f16TexAddr)\n                                    s.append(\",float16_t\");\n                                else\n                                    s.append(\",float\");\n                            }\n\n                            // offset argument\n                            if (offset > 0) {\n                                s.append(\",ivec2\");\n                                if (offset == 2)\n                                    s.append(\"[4]\");\n                            }\n\n                            // texel out (for sparse texture)\n                            if (sparse) {\n                                s.append(\",out \");\n                                s.append(prefixes[sampler.type]);\n                                s.append(\"vec4 \");\n                            }\n\n                            // comp argument\n                            if (comp)\n                                s.append(\",int\");\n\n                            // bias argument\n                            if (bias) {\n                                if (f16TexAddr)\n                                    s.append(\",float16_t\");\n                                else\n                                    s.append(\",float\");\n                            }\n\n                            s.append(\");\\n\");\n                            if (bias)\n                                stageBuiltins[EShLangFragment].append(s);\n                            else\n                                commonBuiltins.append(s);\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\n//\n// Add context-dependent built-in functions and variables that are present\n// for the given version and profile.  All the results are put into just the\n// commonBuiltins, because it is called for just a specific stage.  So,\n// add stage-specific entries to the commonBuiltins, and only if that stage\n// was requested.\n//\nvoid TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language)\n{\n    //\n    // Initialize the context-dependent (resource-dependent) built-in strings for parsing.\n    //\n\n    //============================================================================\n    //\n    // Standard Uniforms\n    //\n    //============================================================================\n\n    TString& s = commonBuiltins;\n    const int maxSize = 200;\n    char builtInConstant[maxSize];\n\n    //\n    // Build string of implementation dependent constants.\n    //\n\n    if (profile == EEsProfile) {\n        snprintf(builtInConstant, maxSize, \"const mediump int  gl_MaxVertexAttribs = %d;\", resources.maxVertexAttribs);\n        s.append(builtInConstant);\n\n        snprintf(builtInConstant, maxSize, \"const mediump int  gl_MaxVertexUniformVectors = %d;\", resources.maxVertexUniformVectors);\n        s.append(builtInConstant);\n\n        snprintf(builtInConstant, maxSize, \"const mediump int  gl_MaxVertexTextureImageUnits = %d;\", resources.maxVertexTextureImageUnits);\n        s.append(builtInConstant);\n\n        snprintf(builtInConstant, maxSize, \"const mediump int  gl_MaxCombinedTextureImageUnits = %d;\", resources.maxCombinedTextureImageUnits);\n        s.append(builtInConstant);\n\n        snprintf(builtInConstant, maxSize, \"const mediump int  gl_MaxTextureImageUnits = %d;\", resources.maxTextureImageUnits);\n        s.append(builtInConstant);\n\n        snprintf(builtInConstant, maxSize, \"const mediump int  gl_MaxFragmentUniformVectors = %d;\", resources.maxFragmentUniformVectors);\n        s.append(builtInConstant);\n\n        snprintf(builtInConstant, maxSize, \"const mediump int  gl_MaxDrawBuffers = %d;\", resources.maxDrawBuffers);\n        s.append(builtInConstant);\n\n        if (version == 100) {\n            snprintf(builtInConstant, maxSize, \"const mediump int  gl_MaxVaryingVectors = %d;\", resources.maxVaryingVectors);\n            s.append(builtInConstant);\n        } else {\n            snprintf(builtInConstant, maxSize, \"const mediump int  gl_MaxVertexOutputVectors = %d;\", resources.maxVertexOutputVectors);\n            s.append(builtInConstant);\n\n            snprintf(builtInConstant, maxSize, \"const mediump int  gl_MaxFragmentInputVectors = %d;\", resources.maxFragmentInputVectors);\n            s.append(builtInConstant);\n\n            snprintf(builtInConstant, maxSize, \"const mediump int  gl_MinProgramTexelOffset = %d;\", resources.minProgramTexelOffset);\n            s.append(builtInConstant);\n\n            snprintf(builtInConstant, maxSize, \"const mediump int  gl_MaxProgramTexelOffset = %d;\", resources.maxProgramTexelOffset);\n            s.append(builtInConstant);\n        }\n\n        if (version >= 310) {\n            // geometry\n\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxGeometryInputComponents = %d;\", resources.maxGeometryInputComponents);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxGeometryOutputComponents = %d;\", resources.maxGeometryOutputComponents);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxGeometryImageUniforms = %d;\", resources.maxGeometryImageUniforms);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxGeometryTextureImageUnits = %d;\", resources.maxGeometryTextureImageUnits);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxGeometryOutputVertices = %d;\", resources.maxGeometryOutputVertices);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxGeometryTotalOutputComponents = %d;\", resources.maxGeometryTotalOutputComponents);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxGeometryUniformComponents = %d;\", resources.maxGeometryUniformComponents);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxGeometryAtomicCounters = %d;\", resources.maxGeometryAtomicCounters);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxGeometryAtomicCounterBuffers = %d;\", resources.maxGeometryAtomicCounterBuffers);\n            s.append(builtInConstant);\n\n            // tessellation\n\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessControlInputComponents = %d;\", resources.maxTessControlInputComponents);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessControlOutputComponents = %d;\", resources.maxTessControlOutputComponents);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessControlTextureImageUnits = %d;\", resources.maxTessControlTextureImageUnits);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessControlUniformComponents = %d;\", resources.maxTessControlUniformComponents);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessControlTotalOutputComponents = %d;\", resources.maxTessControlTotalOutputComponents);\n            s.append(builtInConstant);\n\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessEvaluationInputComponents = %d;\", resources.maxTessEvaluationInputComponents);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessEvaluationOutputComponents = %d;\", resources.maxTessEvaluationOutputComponents);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessEvaluationTextureImageUnits = %d;\", resources.maxTessEvaluationTextureImageUnits);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessEvaluationUniformComponents = %d;\", resources.maxTessEvaluationUniformComponents);\n            s.append(builtInConstant);\n\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessPatchComponents = %d;\", resources.maxTessPatchComponents);\n            s.append(builtInConstant);\n\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxPatchVertices = %d;\", resources.maxPatchVertices);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessGenLevel = %d;\", resources.maxTessGenLevel);\n            s.append(builtInConstant);\n\n            // this is here instead of with the others in initialize(version, profile) due to the dependence on gl_MaxPatchVertices\n            if (language == EShLangTessControl || language == EShLangTessEvaluation) {\n                s.append(\n                    \"in gl_PerVertex {\"\n                        \"highp vec4 gl_Position;\"\n                        \"highp float gl_PointSize;\"\n                        \"highp vec4 gl_SecondaryPositionNV;\"  // GL_NV_stereo_view_rendering\n                        \"highp vec4 gl_PositionPerViewNV[];\"  // GL_NVX_multiview_per_view_attributes\n                    \"} gl_in[gl_MaxPatchVertices];\"\n                    \"\\n\");\n            }\n        }\n\n        if (version >= 320) {\n            // tessellation\n\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessControlImageUniforms = %d;\", resources.maxTessControlImageUniforms);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessEvaluationImageUniforms = %d;\", resources.maxTessEvaluationImageUniforms);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessControlAtomicCounters = %d;\", resources.maxTessControlAtomicCounters);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessEvaluationAtomicCounters = %d;\", resources.maxTessEvaluationAtomicCounters);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessControlAtomicCounterBuffers = %d;\", resources.maxTessControlAtomicCounterBuffers);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessEvaluationAtomicCounterBuffers = %d;\", resources.maxTessEvaluationAtomicCounterBuffers);\n            s.append(builtInConstant);\n        }\n\n        if (version >= 100) {\n            // GL_EXT_blend_func_extended\n            snprintf(builtInConstant, maxSize, \"const mediump int gl_MaxDualSourceDrawBuffersEXT = %d;\", resources.maxDualSourceDrawBuffersEXT);\n            s.append(builtInConstant);\n            // this is here instead of with the others in initialize(version, profile) due to the dependence on gl_MaxDualSourceDrawBuffersEXT\n            if (language == EShLangFragment) {\n                s.append(\n                    \"mediump vec4 gl_SecondaryFragColorEXT;\"\n                    \"mediump vec4 gl_SecondaryFragDataEXT[gl_MaxDualSourceDrawBuffersEXT];\"\n                    \"\\n\");\n            }\n        }\n    } else {\n        // non-ES profile\n\n        if (version > 400) {\n            snprintf(builtInConstant, maxSize, \"const int  gl_MaxVertexUniformVectors = %d;\", resources.maxVertexUniformVectors);\n            s.append(builtInConstant);\n\n            snprintf(builtInConstant, maxSize, \"const int  gl_MaxFragmentUniformVectors = %d;\", resources.maxFragmentUniformVectors);\n            s.append(builtInConstant);\n\n            snprintf(builtInConstant, maxSize, \"const int  gl_MaxVaryingVectors = %d;\", resources.maxVaryingVectors);\n            s.append(builtInConstant);\n        }\n\n        snprintf(builtInConstant, maxSize, \"const int  gl_MaxVertexAttribs = %d;\", resources.maxVertexAttribs);\n        s.append(builtInConstant);\n\n        snprintf(builtInConstant, maxSize, \"const int  gl_MaxVertexTextureImageUnits = %d;\", resources.maxVertexTextureImageUnits);\n        s.append(builtInConstant);\n\n        snprintf(builtInConstant, maxSize, \"const int  gl_MaxCombinedTextureImageUnits = %d;\", resources.maxCombinedTextureImageUnits);\n        s.append(builtInConstant);\n\n        snprintf(builtInConstant, maxSize, \"const int  gl_MaxTextureImageUnits = %d;\", resources.maxTextureImageUnits);\n        s.append(builtInConstant);\n\n        snprintf(builtInConstant, maxSize, \"const int  gl_MaxDrawBuffers = %d;\", resources.maxDrawBuffers);\n        s.append(builtInConstant);\n\n        snprintf(builtInConstant, maxSize, \"const int  gl_MaxLights = %d;\", resources.maxLights);\n        s.append(builtInConstant);\n\n        snprintf(builtInConstant, maxSize, \"const int  gl_MaxClipPlanes = %d;\", resources.maxClipPlanes);\n        s.append(builtInConstant);\n\n        snprintf(builtInConstant, maxSize, \"const int  gl_MaxTextureUnits = %d;\", resources.maxTextureUnits);\n        s.append(builtInConstant);\n\n        snprintf(builtInConstant, maxSize, \"const int  gl_MaxTextureCoords = %d;\", resources.maxTextureCoords);\n        s.append(builtInConstant);\n\n        snprintf(builtInConstant, maxSize, \"const int  gl_MaxVertexUniformComponents = %d;\", resources.maxVertexUniformComponents);\n        s.append(builtInConstant);\n\n        // Moved from just being deprecated into compatibility profile only as of 4.20\n        if (version < 420 || profile == ECompatibilityProfile) {\n            snprintf(builtInConstant, maxSize, \"const int  gl_MaxVaryingFloats = %d;\", resources.maxVaryingFloats);\n            s.append(builtInConstant);\n        }\n\n        snprintf(builtInConstant, maxSize, \"const int  gl_MaxFragmentUniformComponents = %d;\", resources.maxFragmentUniformComponents);\n        s.append(builtInConstant);\n\n        if (spvVersion.spv == 0 && IncludeLegacy(version, profile, spvVersion)) {\n            //\n            // OpenGL'uniform' state.  Page numbers are in reference to version\n            // 1.4 of the OpenGL specification.\n            //\n\n            //\n            // Matrix state. p. 31, 32, 37, 39, 40.\n            //\n            s.append(\"uniform mat4  gl_TextureMatrix[gl_MaxTextureCoords];\"\n\n            //\n            // Derived matrix state that provides inverse and transposed versions\n            // of the matrices above.\n            //\n                        \"uniform mat4  gl_TextureMatrixInverse[gl_MaxTextureCoords];\"\n\n                        \"uniform mat4  gl_TextureMatrixTranspose[gl_MaxTextureCoords];\"\n\n                        \"uniform mat4  gl_TextureMatrixInverseTranspose[gl_MaxTextureCoords];\"\n\n            //\n            // Clip planes p. 42.\n            //\n                        \"uniform vec4  gl_ClipPlane[gl_MaxClipPlanes];\"\n\n            //\n            // Light State p 50, 53, 55.\n            //\n                        \"uniform gl_LightSourceParameters  gl_LightSource[gl_MaxLights];\"\n\n            //\n            // Derived state from products of light.\n            //\n                        \"uniform gl_LightProducts gl_FrontLightProduct[gl_MaxLights];\"\n                        \"uniform gl_LightProducts gl_BackLightProduct[gl_MaxLights];\"\n\n            //\n            // Texture Environment and Generation, p. 152, p. 40-42.\n            //\n                        \"uniform vec4  gl_TextureEnvColor[gl_MaxTextureImageUnits];\"\n                        \"uniform vec4  gl_EyePlaneS[gl_MaxTextureCoords];\"\n                        \"uniform vec4  gl_EyePlaneT[gl_MaxTextureCoords];\"\n                        \"uniform vec4  gl_EyePlaneR[gl_MaxTextureCoords];\"\n                        \"uniform vec4  gl_EyePlaneQ[gl_MaxTextureCoords];\"\n                        \"uniform vec4  gl_ObjectPlaneS[gl_MaxTextureCoords];\"\n                        \"uniform vec4  gl_ObjectPlaneT[gl_MaxTextureCoords];\"\n                        \"uniform vec4  gl_ObjectPlaneR[gl_MaxTextureCoords];\"\n                        \"uniform vec4  gl_ObjectPlaneQ[gl_MaxTextureCoords];\");\n        }\n\n        if (version >= 130) {\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxClipDistances = %d;\", resources.maxClipDistances);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxVaryingComponents = %d;\", resources.maxVaryingComponents);\n            s.append(builtInConstant);\n\n            // GL_ARB_shading_language_420pack\n            snprintf(builtInConstant, maxSize, \"const mediump int  gl_MinProgramTexelOffset = %d;\", resources.minProgramTexelOffset);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const mediump int  gl_MaxProgramTexelOffset = %d;\", resources.maxProgramTexelOffset);\n            s.append(builtInConstant);\n        }\n\n        // geometry\n        if (version >= 150) {\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxGeometryInputComponents = %d;\", resources.maxGeometryInputComponents);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxGeometryOutputComponents = %d;\", resources.maxGeometryOutputComponents);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxGeometryTextureImageUnits = %d;\", resources.maxGeometryTextureImageUnits);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxGeometryOutputVertices = %d;\", resources.maxGeometryOutputVertices);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxGeometryTotalOutputComponents = %d;\", resources.maxGeometryTotalOutputComponents);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxGeometryUniformComponents = %d;\", resources.maxGeometryUniformComponents);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxGeometryVaryingComponents = %d;\", resources.maxGeometryVaryingComponents);\n            s.append(builtInConstant);\n\n        }\n\n        if (version >= 150) {\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxVertexOutputComponents = %d;\", resources.maxVertexOutputComponents);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxFragmentInputComponents = %d;\", resources.maxFragmentInputComponents);\n            s.append(builtInConstant);\n        }\n\n        // tessellation\n        if (version >= 150) {\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessControlInputComponents = %d;\", resources.maxTessControlInputComponents);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessControlOutputComponents = %d;\", resources.maxTessControlOutputComponents);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessControlTextureImageUnits = %d;\", resources.maxTessControlTextureImageUnits);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessControlUniformComponents = %d;\", resources.maxTessControlUniformComponents);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessControlTotalOutputComponents = %d;\", resources.maxTessControlTotalOutputComponents);\n            s.append(builtInConstant);\n\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessEvaluationInputComponents = %d;\", resources.maxTessEvaluationInputComponents);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessEvaluationOutputComponents = %d;\", resources.maxTessEvaluationOutputComponents);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessEvaluationTextureImageUnits = %d;\", resources.maxTessEvaluationTextureImageUnits);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessEvaluationUniformComponents = %d;\", resources.maxTessEvaluationUniformComponents);\n            s.append(builtInConstant);\n\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessPatchComponents = %d;\", resources.maxTessPatchComponents);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessGenLevel = %d;\", resources.maxTessGenLevel);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxPatchVertices = %d;\", resources.maxPatchVertices);\n            s.append(builtInConstant);\n\n            // this is here instead of with the others in initialize(version, profile) due to the dependence on gl_MaxPatchVertices\n            if (language == EShLangTessControl || language == EShLangTessEvaluation) {\n                s.append(\n                    \"in gl_PerVertex {\"\n                        \"vec4 gl_Position;\"\n                        \"float gl_PointSize;\"\n                        \"float gl_ClipDistance[];\"\n                    );\n                if (profile == ECompatibilityProfile)\n                    s.append(\n                        \"vec4 gl_ClipVertex;\"\n                        \"vec4 gl_FrontColor;\"\n                        \"vec4 gl_BackColor;\"\n                        \"vec4 gl_FrontSecondaryColor;\"\n                        \"vec4 gl_BackSecondaryColor;\"\n                        \"vec4 gl_TexCoord[];\"\n                        \"float gl_FogFragCoord;\"\n                        );\n                if (profile != EEsProfile && version >= 450)\n                    s.append(\n                        \"float gl_CullDistance[];\"\n                        \"vec4 gl_SecondaryPositionNV;\"  // GL_NV_stereo_view_rendering\n                        \"vec4 gl_PositionPerViewNV[];\"  // GL_NVX_multiview_per_view_attributes\n                       );\n                s.append(\n                    \"} gl_in[gl_MaxPatchVertices];\"\n                    \"\\n\");\n            }\n        }\n\n        if (version >= 150) {\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxViewports = %d;\", resources.maxViewports);\n            s.append(builtInConstant);\n        }\n\n        // images\n        if (version >= 130) {\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxCombinedImageUnitsAndFragmentOutputs = %d;\", resources.maxCombinedImageUnitsAndFragmentOutputs);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxImageSamples = %d;\", resources.maxImageSamples);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessControlImageUniforms = %d;\", resources.maxTessControlImageUniforms);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTessEvaluationImageUniforms = %d;\", resources.maxTessEvaluationImageUniforms);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxGeometryImageUniforms = %d;\", resources.maxGeometryImageUniforms);\n            s.append(builtInConstant);\n        }\n\n        // enhanced layouts\n        if (version >= 430) {\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTransformFeedbackBuffers = %d;\", resources.maxTransformFeedbackBuffers);\n            s.append(builtInConstant);\n            snprintf(builtInConstant, maxSize, \"const int gl_MaxTransformFeedbackInterleavedComponents = %d;\", resources.maxTransformFeedbackInterleavedComponents);\n            s.append(builtInConstant);\n        }\n    }\n\n    // compute\n    if ((profile == EEsProfile && version >= 310) || (profile != EEsProfile && version >= 420)) {\n        snprintf(builtInConstant, maxSize, \"const ivec3 gl_MaxComputeWorkGroupCount = ivec3(%d,%d,%d);\", resources.maxComputeWorkGroupCountX,\n                                                                                                         resources.maxComputeWorkGroupCountY,\n                                                                                                         resources.maxComputeWorkGroupCountZ);\n        s.append(builtInConstant);\n        snprintf(builtInConstant, maxSize, \"const ivec3 gl_MaxComputeWorkGroupSize = ivec3(%d,%d,%d);\", resources.maxComputeWorkGroupSizeX,\n                                                                                                        resources.maxComputeWorkGroupSizeY,\n                                                                                                        resources.maxComputeWorkGroupSizeZ);\n        s.append(builtInConstant);\n\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxComputeUniformComponents = %d;\", resources.maxComputeUniformComponents);\n        s.append(builtInConstant);\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxComputeTextureImageUnits = %d;\", resources.maxComputeTextureImageUnits);\n        s.append(builtInConstant);\n\n        s.append(\"\\n\");\n    }\n\n    // images (some in compute below)\n    if ((profile == EEsProfile && version >= 310) ||\n        (profile != EEsProfile && version >= 130)) {\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxImageUnits = %d;\", resources.maxImageUnits);\n        s.append(builtInConstant);\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxCombinedShaderOutputResources = %d;\", resources.maxCombinedShaderOutputResources);\n        s.append(builtInConstant);\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxVertexImageUniforms = %d;\", resources.maxVertexImageUniforms);\n        s.append(builtInConstant);\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxFragmentImageUniforms = %d;\", resources.maxFragmentImageUniforms);\n        s.append(builtInConstant);\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxCombinedImageUniforms = %d;\", resources.maxCombinedImageUniforms);\n        s.append(builtInConstant);\n    }\n\n    // compute\n    if ((profile == EEsProfile && version >= 310) || (profile != EEsProfile && version >= 420)) {\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxComputeImageUniforms = %d;\", resources.maxComputeImageUniforms);\n        s.append(builtInConstant);\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxComputeAtomicCounters = %d;\", resources.maxComputeAtomicCounters);\n        s.append(builtInConstant);\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxComputeAtomicCounterBuffers = %d;\", resources.maxComputeAtomicCounterBuffers);\n        s.append(builtInConstant);\n\n        s.append(\"\\n\");\n    }\n\n    // atomic counters (some in compute below)\n    if ((profile == EEsProfile && version >= 310) ||\n        (profile != EEsProfile && version >= 420)) {\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxVertexAtomicCounters = %d;\", resources.               maxVertexAtomicCounters);\n        s.append(builtInConstant);\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxFragmentAtomicCounters = %d;\", resources.             maxFragmentAtomicCounters);\n        s.append(builtInConstant);\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxCombinedAtomicCounters = %d;\", resources.             maxCombinedAtomicCounters);\n        s.append(builtInConstant);\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxAtomicCounterBindings = %d;\", resources.              maxAtomicCounterBindings);\n        s.append(builtInConstant);\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxVertexAtomicCounterBuffers = %d;\", resources.         maxVertexAtomicCounterBuffers);\n        s.append(builtInConstant);\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxFragmentAtomicCounterBuffers = %d;\", resources.       maxFragmentAtomicCounterBuffers);\n        s.append(builtInConstant);\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxCombinedAtomicCounterBuffers = %d;\", resources.       maxCombinedAtomicCounterBuffers);\n        s.append(builtInConstant);\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxAtomicCounterBufferSize = %d;\", resources.            maxAtomicCounterBufferSize);\n        s.append(builtInConstant);\n    }\n    if (profile != EEsProfile && version >= 420) {\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxTessControlAtomicCounters = %d;\", resources.          maxTessControlAtomicCounters);\n        s.append(builtInConstant);\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxTessEvaluationAtomicCounters = %d;\", resources.       maxTessEvaluationAtomicCounters);\n        s.append(builtInConstant);\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxGeometryAtomicCounters = %d;\", resources.             maxGeometryAtomicCounters);\n        s.append(builtInConstant);\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxTessControlAtomicCounterBuffers = %d;\", resources.    maxTessControlAtomicCounterBuffers);\n        s.append(builtInConstant);\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxTessEvaluationAtomicCounterBuffers = %d;\", resources. maxTessEvaluationAtomicCounterBuffers);\n        s.append(builtInConstant);\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxGeometryAtomicCounterBuffers = %d;\", resources.       maxGeometryAtomicCounterBuffers);\n        s.append(builtInConstant);\n\n        s.append(\"\\n\");\n    }\n\n    // GL_ARB_cull_distance\n    if (profile != EEsProfile && version >= 450) {\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxCullDistances = %d;\",                resources.maxCullDistances);\n        s.append(builtInConstant);\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxCombinedClipAndCullDistances = %d;\", resources.maxCombinedClipAndCullDistances);\n        s.append(builtInConstant);\n    }\n\n    // GL_ARB_ES3_1_compatibility\n    if ((profile != EEsProfile && version >= 450) ||\n        (profile == EEsProfile && version >= 310)) {\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxSamples = %d;\", resources.maxSamples);\n        s.append(builtInConstant);\n    }\n\n    // SPV_NV_mesh_shader\n    if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxMeshOutputVerticesNV = %d;\", resources.maxMeshOutputVerticesNV);\n        s.append(builtInConstant);\n\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxMeshOutputPrimitivesNV = %d;\", resources.maxMeshOutputPrimitivesNV);\n        s.append(builtInConstant);\n\n        snprintf(builtInConstant, maxSize, \"const ivec3 gl_MaxMeshWorkGroupSizeNV = ivec3(%d,%d,%d);\", resources.maxMeshWorkGroupSizeX_NV,\n                                                                                                       resources.maxMeshWorkGroupSizeY_NV,\n                                                                                                       resources.maxMeshWorkGroupSizeZ_NV);\n        s.append(builtInConstant);\n        snprintf(builtInConstant, maxSize, \"const ivec3 gl_MaxTaskWorkGroupSizeNV = ivec3(%d,%d,%d);\", resources.maxTaskWorkGroupSizeX_NV,\n                                                                                                       resources.maxTaskWorkGroupSizeY_NV,\n                                                                                                       resources.maxTaskWorkGroupSizeZ_NV);\n        s.append(builtInConstant);\n\n        snprintf(builtInConstant, maxSize, \"const int gl_MaxMeshViewCountNV = %d;\", resources.maxMeshViewCountNV);\n        s.append(builtInConstant);\n\n        s.append(\"\\n\");\n    }\n\n    s.append(\"\\n\");\n}\n\n//\n// To support special built-ins that have a special qualifier that cannot be declared textually\n// in a shader, like gl_Position.\n//\n// This lets the type of the built-in be declared textually, and then have just its qualifier be\n// updated afterward.\n//\n// Safe to call even if name is not present.\n//\n// Only use this for built-in variables that have a special qualifier in TStorageQualifier.\n// New built-in variables should use a generic (textually declarable) qualifier in\n// TStoraregQualifier and only call BuiltInVariable().\n//\nstatic void SpecialQualifier(const char* name, TStorageQualifier qualifier, TBuiltInVariable builtIn, TSymbolTable& symbolTable)\n{\n    TSymbol* symbol = symbolTable.find(name);\n    if (symbol == nullptr)\n        return;\n\n    TQualifier& symQualifier = symbol->getWritableType().getQualifier();\n    symQualifier.storage = qualifier;\n    symQualifier.builtIn = builtIn;\n}\n\n//\n// Modify the symbol's flat decoration.\n//\n// Safe to call even if name is not present.\n//\n// Originally written to transform gl_SubGroupSizeARB from uniform to fragment input in Vulkan.\n//\nstatic void ModifyFlatDecoration(const char* name, bool flat, TSymbolTable& symbolTable)\n{\n    TSymbol* symbol = symbolTable.find(name);\n    if (symbol == nullptr)\n        return;\n\n    TQualifier& symQualifier = symbol->getWritableType().getQualifier();\n    symQualifier.flat = flat;\n}\n\n//\n// To tag built-in variables with their TBuiltInVariable enum.  Use this when the\n// normal declaration text already gets the qualifier right, and all that's needed\n// is setting the builtIn field.  This should be the normal way for all new\n// built-in variables.\n//\n// If SpecialQualifier() was called, this does not need to be called.\n//\n// Safe to call even if name is not present.\n//\nstatic void BuiltInVariable(const char* name, TBuiltInVariable builtIn, TSymbolTable& symbolTable)\n{\n    TSymbol* symbol = symbolTable.find(name);\n    if (symbol == nullptr)\n        return;\n\n    TQualifier& symQualifier = symbol->getWritableType().getQualifier();\n    symQualifier.builtIn = builtIn;\n}\n\nstatic void RetargetVariable(const char* from, const char* to, TSymbolTable& symbolTable)\n{\n    symbolTable.retargetSymbol(from, to);\n}\n\n//\n// For built-in variables inside a named block.\n// SpecialQualifier() won't ever go inside a block; their member's qualifier come\n// from the qualification of the block.\n//\n// See comments above for other detail.\n//\nstatic void BuiltInVariable(const char* blockName, const char* name, TBuiltInVariable builtIn, TSymbolTable& symbolTable)\n{\n    TSymbol* symbol = symbolTable.find(blockName);\n    if (symbol == nullptr)\n        return;\n\n    TTypeList& structure = *symbol->getWritableType().getWritableStruct();\n    for (int i = 0; i < (int)structure.size(); ++i) {\n        if (structure[i].type->getFieldName().compare(name) == 0) {\n            structure[i].type->getQualifier().builtIn = builtIn;\n            return;\n        }\n    }\n}\n\n//\n// Finish adding/processing context-independent built-in symbols.\n// 1) Programmatically add symbols that could not be added by simple text strings above.\n// 2) Map built-in functions to operators, for those that will turn into an operation node\n//    instead of remaining a function call.\n// 3) Tag extension-related symbols added to their base version with their extensions, so\n//    that if an early version has the extension turned off, there is an error reported on use.\n//\nvoid TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable)\n{\n    //\n    // Tag built-in variables and functions with additional qualifier and extension information\n    // that cannot be declared with the text strings.\n    //\n\n    // N.B.: a symbol should only be tagged once, and this function is called multiple times, once\n    // per stage that's used for this profile.  So\n    //  - generally, stick common ones in the fragment stage to ensure they are tagged exactly once\n    //  - for ES, which has different precisions for different stages, the coarsest-grained tagging\n    //    for a built-in used in many stages needs to be once for the fragment stage and once for\n    //    the vertex stage\n\n    switch(language) {\n    case EShLangVertex:\n        if (spvVersion.vulkan > 0) {\n            BuiltInVariable(\"gl_VertexIndex\",   EbvVertexIndex,   symbolTable);\n            BuiltInVariable(\"gl_InstanceIndex\", EbvInstanceIndex, symbolTable);\n        }\n\n        if (spvVersion.vulkan == 0) {\n            SpecialQualifier(\"gl_VertexID\",   EvqVertexId,   EbvVertexId,   symbolTable);\n            SpecialQualifier(\"gl_InstanceID\", EvqInstanceId, EbvInstanceId, symbolTable);\n            if (version < 140)\n                symbolTable.setVariableExtensions(\"gl_InstanceID\", 1, &E_GL_EXT_draw_instanced);\n        }\n\n        if (spvVersion.vulkan > 0 && spvVersion.vulkanRelaxed) {\n            // treat these built-ins as aliases of VertexIndex and InstanceIndex\n            RetargetVariable(\"gl_InstanceID\", \"gl_InstanceIndex\", symbolTable);\n            RetargetVariable(\"gl_VertexID\", \"gl_VertexIndex\", symbolTable);\n        }\n\n        if (profile != EEsProfile) {\n            if (version >= 440) {\n                symbolTable.setVariableExtensions(\"gl_BaseVertexARB\",   1, &E_GL_ARB_shader_draw_parameters);\n                symbolTable.setVariableExtensions(\"gl_BaseInstanceARB\", 1, &E_GL_ARB_shader_draw_parameters);\n                symbolTable.setVariableExtensions(\"gl_DrawIDARB\",       1, &E_GL_ARB_shader_draw_parameters);\n                BuiltInVariable(\"gl_BaseVertexARB\",   EbvBaseVertex,   symbolTable);\n                BuiltInVariable(\"gl_BaseInstanceARB\", EbvBaseInstance, symbolTable);\n                BuiltInVariable(\"gl_DrawIDARB\",       EbvDrawId,       symbolTable);\n            }\n            if (version >= 460) {\n                BuiltInVariable(\"gl_BaseVertex\",   EbvBaseVertex,   symbolTable);\n                BuiltInVariable(\"gl_BaseInstance\", EbvBaseInstance, symbolTable);\n                BuiltInVariable(\"gl_DrawID\",       EbvDrawId,       symbolTable);\n            }\n            symbolTable.setVariableExtensions(\"gl_SubGroupSizeARB\",       1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupInvocationARB\", 1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupEqMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupGeMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupGtMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupLeMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupLtMaskARB\",     1, &E_GL_ARB_shader_ballot);\n\n            symbolTable.setFunctionExtensions(\"ballotARB\",              1, &E_GL_ARB_shader_ballot);\n            symbolTable.setFunctionExtensions(\"readInvocationARB\",      1, &E_GL_ARB_shader_ballot);\n            symbolTable.setFunctionExtensions(\"readFirstInvocationARB\", 1, &E_GL_ARB_shader_ballot);\n\n            if (version >= 430) {\n                symbolTable.setFunctionExtensions(\"anyInvocationARB\",       1, &E_GL_ARB_shader_group_vote);\n                symbolTable.setFunctionExtensions(\"allInvocationsARB\",      1, &E_GL_ARB_shader_group_vote);\n                symbolTable.setFunctionExtensions(\"allInvocationsEqualARB\", 1, &E_GL_ARB_shader_group_vote);\n            }\n            if (version >= 150) {\n                symbolTable.setFunctionExtensions(\"anyThreadNV\",       1, &E_GL_NV_gpu_shader5);\n                symbolTable.setFunctionExtensions(\"allThreadsNV\",      1, &E_GL_NV_gpu_shader5);\n                symbolTable.setFunctionExtensions(\"allThreadsEqualNV\", 1, &E_GL_NV_gpu_shader5);\n            }\n        }\n\n\n        if (profile != EEsProfile) {\n            symbolTable.setFunctionExtensions(\"minInvocationsAMD\",                1, &E_GL_AMD_shader_ballot);\n            symbolTable.setFunctionExtensions(\"maxInvocationsAMD\",                1, &E_GL_AMD_shader_ballot);\n            symbolTable.setFunctionExtensions(\"addInvocationsAMD\",                1, &E_GL_AMD_shader_ballot);\n            symbolTable.setFunctionExtensions(\"minInvocationsNonUniformAMD\",      1, &E_GL_AMD_shader_ballot);\n            symbolTable.setFunctionExtensions(\"maxInvocationsNonUniformAMD\",      1, &E_GL_AMD_shader_ballot);\n            symbolTable.setFunctionExtensions(\"addInvocationsNonUniformAMD\",      1, &E_GL_AMD_shader_ballot);\n            symbolTable.setFunctionExtensions(\"swizzleInvocationsAMD\",            1, &E_GL_AMD_shader_ballot);\n            symbolTable.setFunctionExtensions(\"swizzleInvocationsWithPatternAMD\", 1, &E_GL_AMD_shader_ballot);\n            symbolTable.setFunctionExtensions(\"writeInvocationAMD\",               1, &E_GL_AMD_shader_ballot);\n            symbolTable.setFunctionExtensions(\"mbcntAMD\",                         1, &E_GL_AMD_shader_ballot);\n\n            symbolTable.setFunctionExtensions(\"minInvocationsInclusiveScanAMD\",             1, &E_GL_AMD_shader_ballot);\n            symbolTable.setFunctionExtensions(\"maxInvocationsInclusiveScanAMD\",             1, &E_GL_AMD_shader_ballot);\n            symbolTable.setFunctionExtensions(\"addInvocationsInclusiveScanAMD\",             1, &E_GL_AMD_shader_ballot);\n            symbolTable.setFunctionExtensions(\"minInvocationsInclusiveScanNonUniformAMD\",   1, &E_GL_AMD_shader_ballot);\n            symbolTable.setFunctionExtensions(\"maxInvocationsInclusiveScanNonUniformAMD\",   1, &E_GL_AMD_shader_ballot);\n            symbolTable.setFunctionExtensions(\"addInvocationsInclusiveScanNonUniformAMD\",   1, &E_GL_AMD_shader_ballot);\n            symbolTable.setFunctionExtensions(\"minInvocationsExclusiveScanAMD\",             1, &E_GL_AMD_shader_ballot);\n            symbolTable.setFunctionExtensions(\"maxInvocationsExclusiveScanAMD\",             1, &E_GL_AMD_shader_ballot);\n            symbolTable.setFunctionExtensions(\"addInvocationsExclusiveScanAMD\",             1, &E_GL_AMD_shader_ballot);\n            symbolTable.setFunctionExtensions(\"minInvocationsExclusiveScanNonUniformAMD\",   1, &E_GL_AMD_shader_ballot);\n            symbolTable.setFunctionExtensions(\"maxInvocationsExclusiveScanNonUniformAMD\",   1, &E_GL_AMD_shader_ballot);\n            symbolTable.setFunctionExtensions(\"addInvocationsExclusiveScanNonUniformAMD\",   1, &E_GL_AMD_shader_ballot);\n        }\n\n        if (profile != EEsProfile) {\n            symbolTable.setFunctionExtensions(\"min3\", 1, &E_GL_AMD_shader_trinary_minmax);\n            symbolTable.setFunctionExtensions(\"max3\", 1, &E_GL_AMD_shader_trinary_minmax);\n            symbolTable.setFunctionExtensions(\"mid3\", 1, &E_GL_AMD_shader_trinary_minmax);\n        }\n\n        if (profile != EEsProfile) {\n            symbolTable.setVariableExtensions(\"gl_SIMDGroupSizeAMD\", 1, &E_GL_AMD_gcn_shader);\n            SpecialQualifier(\"gl_SIMDGroupSizeAMD\", EvqVaryingIn, EbvSubGroupSize, symbolTable);\n\n            symbolTable.setFunctionExtensions(\"cubeFaceIndexAMD\", 1, &E_GL_AMD_gcn_shader);\n            symbolTable.setFunctionExtensions(\"cubeFaceCoordAMD\", 1, &E_GL_AMD_gcn_shader);\n            symbolTable.setFunctionExtensions(\"timeAMD\",          1, &E_GL_AMD_gcn_shader);\n        }\n\n        if (profile != EEsProfile) {\n            symbolTable.setFunctionExtensions(\"fragmentMaskFetchAMD\", 1, &E_GL_AMD_shader_fragment_mask);\n            symbolTable.setFunctionExtensions(\"fragmentFetchAMD\",     1, &E_GL_AMD_shader_fragment_mask);\n        }\n\n        symbolTable.setFunctionExtensions(\"countLeadingZeros\",  1, &E_GL_INTEL_shader_integer_functions2);\n        symbolTable.setFunctionExtensions(\"countTrailingZeros\", 1, &E_GL_INTEL_shader_integer_functions2);\n        symbolTable.setFunctionExtensions(\"absoluteDifference\", 1, &E_GL_INTEL_shader_integer_functions2);\n        symbolTable.setFunctionExtensions(\"addSaturate\",        1, &E_GL_INTEL_shader_integer_functions2);\n        symbolTable.setFunctionExtensions(\"subtractSaturate\",   1, &E_GL_INTEL_shader_integer_functions2);\n        symbolTable.setFunctionExtensions(\"average\",            1, &E_GL_INTEL_shader_integer_functions2);\n        symbolTable.setFunctionExtensions(\"averageRounded\",     1, &E_GL_INTEL_shader_integer_functions2);\n        symbolTable.setFunctionExtensions(\"multiply32x16\",      1, &E_GL_INTEL_shader_integer_functions2);\n\n        symbolTable.setFunctionExtensions(\"textureFootprintNV\",          1, &E_GL_NV_shader_texture_footprint);\n        symbolTable.setFunctionExtensions(\"textureFootprintClampNV\",     1, &E_GL_NV_shader_texture_footprint);\n        symbolTable.setFunctionExtensions(\"textureFootprintLodNV\",       1, &E_GL_NV_shader_texture_footprint);\n        symbolTable.setFunctionExtensions(\"textureFootprintGradNV\",      1, &E_GL_NV_shader_texture_footprint);\n        symbolTable.setFunctionExtensions(\"textureFootprintGradClampNV\", 1, &E_GL_NV_shader_texture_footprint);\n        // Compatibility variables, vertex only\n        if (spvVersion.spv == 0) {\n            BuiltInVariable(\"gl_Color\",          EbvColor,          symbolTable);\n            BuiltInVariable(\"gl_SecondaryColor\", EbvSecondaryColor, symbolTable);\n            BuiltInVariable(\"gl_Normal\",         EbvNormal,         symbolTable);\n            BuiltInVariable(\"gl_Vertex\",         EbvVertex,         symbolTable);\n            BuiltInVariable(\"gl_MultiTexCoord0\", EbvMultiTexCoord0, symbolTable);\n            BuiltInVariable(\"gl_MultiTexCoord1\", EbvMultiTexCoord1, symbolTable);\n            BuiltInVariable(\"gl_MultiTexCoord2\", EbvMultiTexCoord2, symbolTable);\n            BuiltInVariable(\"gl_MultiTexCoord3\", EbvMultiTexCoord3, symbolTable);\n            BuiltInVariable(\"gl_MultiTexCoord4\", EbvMultiTexCoord4, symbolTable);\n            BuiltInVariable(\"gl_MultiTexCoord5\", EbvMultiTexCoord5, symbolTable);\n            BuiltInVariable(\"gl_MultiTexCoord6\", EbvMultiTexCoord6, symbolTable);\n            BuiltInVariable(\"gl_MultiTexCoord7\", EbvMultiTexCoord7, symbolTable);\n            BuiltInVariable(\"gl_FogCoord\",       EbvFogFragCoord,   symbolTable);\n        }\n\n        if (profile == EEsProfile) {\n            if (spvVersion.spv == 0) {\n                symbolTable.setFunctionExtensions(\"texture2DGradEXT\",     1, &E_GL_EXT_shader_texture_lod);\n                symbolTable.setFunctionExtensions(\"texture2DProjGradEXT\", 1, &E_GL_EXT_shader_texture_lod);\n                symbolTable.setFunctionExtensions(\"textureCubeGradEXT\",   1, &E_GL_EXT_shader_texture_lod);\n                if (version == 310)\n                    symbolTable.setFunctionExtensions(\"textureGatherOffsets\", Num_AEP_gpu_shader5, AEP_gpu_shader5);\n            }\n            if (version == 310) {\n                symbolTable.setFunctionExtensions(\"fma\", Num_AEP_gpu_shader5, AEP_gpu_shader5);\n            } else if (profile != EEsProfile && version >= 150) {\n                symbolTable.setFunctionExtensions(\"fma\", Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5);\n            }\n        }\n\n        if (profile == EEsProfile && version < 320) {\n            symbolTable.setFunctionExtensions(\"imageAtomicAdd\",      1, &E_GL_OES_shader_image_atomic);\n            symbolTable.setFunctionExtensions(\"imageAtomicMin\",      1, &E_GL_OES_shader_image_atomic);\n            symbolTable.setFunctionExtensions(\"imageAtomicMax\",      1, &E_GL_OES_shader_image_atomic);\n            symbolTable.setFunctionExtensions(\"imageAtomicAnd\",      1, &E_GL_OES_shader_image_atomic);\n            symbolTable.setFunctionExtensions(\"imageAtomicOr\",       1, &E_GL_OES_shader_image_atomic);\n            symbolTable.setFunctionExtensions(\"imageAtomicXor\",      1, &E_GL_OES_shader_image_atomic);\n            symbolTable.setFunctionExtensions(\"imageAtomicExchange\", 1, &E_GL_OES_shader_image_atomic);\n            symbolTable.setFunctionExtensions(\"imageAtomicCompSwap\", 1, &E_GL_OES_shader_image_atomic);\n        }\n\n        if (version >= 300 /* both ES and non-ES */) {\n            symbolTable.setVariableExtensions(\"gl_ViewID_OVR\", Num_OVR_multiview_EXTs, OVR_multiview_EXTs);\n            BuiltInVariable(\"gl_ViewID_OVR\", EbvViewIndex, symbolTable);\n        }\n\n        if (profile == EEsProfile) {\n            symbolTable.setFunctionExtensions(\"shadow2DEXT\",        1, &E_GL_EXT_shadow_samplers);\n            symbolTable.setFunctionExtensions(\"shadow2DProjEXT\",    1, &E_GL_EXT_shadow_samplers);\n        }\n\n        // E_GL_EXT_texture_array\n        if (profile != EEsProfile && spvVersion.spv == 0) {\n            symbolTable.setFunctionExtensions(\"texture1DArray\", 1, &E_GL_EXT_texture_array);\n            symbolTable.setFunctionExtensions(\"texture2DArray\", 1, &E_GL_EXT_texture_array);\n            symbolTable.setFunctionExtensions(\"shadow1DArray\", 1, &E_GL_EXT_texture_array);\n            symbolTable.setFunctionExtensions(\"shadow2DArray\", 1, &E_GL_EXT_texture_array);\n\n            symbolTable.setFunctionExtensions(\"texture1DArrayLod\", 1, &E_GL_EXT_texture_array);\n            symbolTable.setFunctionExtensions(\"texture2DArrayLod\", 1, &E_GL_EXT_texture_array);\n            symbolTable.setFunctionExtensions(\"shadow1DArrayLod\", 1, &E_GL_EXT_texture_array);\n        }\n        [[fallthrough]];\n\n    case EShLangTessControl:\n        if (profile == EEsProfile && version >= 310) {\n            BuiltInVariable(\"gl_BoundingBoxEXT\", EbvBoundingBox, symbolTable);\n            symbolTable.setVariableExtensions(\"gl_BoundingBoxEXT\", 1,\n                                              &E_GL_EXT_primitive_bounding_box);\n            BuiltInVariable(\"gl_BoundingBoxOES\", EbvBoundingBox, symbolTable);\n            symbolTable.setVariableExtensions(\"gl_BoundingBoxOES\", 1,\n                                              &E_GL_OES_primitive_bounding_box);\n\n            if (version >= 320) {\n                BuiltInVariable(\"gl_BoundingBox\", EbvBoundingBox, symbolTable);\n            }\n        }\n        [[fallthrough]];\n\n    case EShLangTessEvaluation:\n    case EShLangGeometry:\n        SpecialQualifier(\"gl_Position\",   EvqPosition,   EbvPosition,   symbolTable);\n        SpecialQualifier(\"gl_PointSize\",  EvqPointSize,  EbvPointSize,  symbolTable);\n\n        BuiltInVariable(\"gl_in\",  \"gl_Position\",     EbvPosition,     symbolTable);\n        BuiltInVariable(\"gl_in\",  \"gl_PointSize\",    EbvPointSize,    symbolTable);\n\n        BuiltInVariable(\"gl_out\", \"gl_Position\",     EbvPosition,     symbolTable);\n        BuiltInVariable(\"gl_out\", \"gl_PointSize\",    EbvPointSize,    symbolTable);\n\n        SpecialQualifier(\"gl_ClipVertex\", EvqClipVertex, EbvClipVertex, symbolTable);\n\n        BuiltInVariable(\"gl_in\",  \"gl_ClipDistance\", EbvClipDistance, symbolTable);\n        BuiltInVariable(\"gl_in\",  \"gl_CullDistance\", EbvCullDistance, symbolTable);\n\n        BuiltInVariable(\"gl_out\", \"gl_ClipDistance\", EbvClipDistance, symbolTable);\n        BuiltInVariable(\"gl_out\", \"gl_CullDistance\", EbvCullDistance, symbolTable);\n\n        BuiltInVariable(\"gl_ClipDistance\",    EbvClipDistance,   symbolTable);\n        BuiltInVariable(\"gl_CullDistance\",    EbvCullDistance,   symbolTable);\n        BuiltInVariable(\"gl_PrimitiveIDIn\",   EbvPrimitiveId,    symbolTable);\n        BuiltInVariable(\"gl_PrimitiveID\",     EbvPrimitiveId,    symbolTable);\n        BuiltInVariable(\"gl_InvocationID\",    EbvInvocationId,   symbolTable);\n        BuiltInVariable(\"gl_Layer\",           EbvLayer,          symbolTable);\n        BuiltInVariable(\"gl_ViewportIndex\",   EbvViewportIndex,  symbolTable);\n\n        if (language != EShLangGeometry) {\n            symbolTable.setVariableExtensions(\"gl_Layer\",         Num_viewportEXTs, viewportEXTs);\n            symbolTable.setVariableExtensions(\"gl_ViewportIndex\", Num_viewportEXTs, viewportEXTs);\n        }\n        symbolTable.setVariableExtensions(\"gl_ViewportMask\",            1, &E_GL_NV_viewport_array2);\n        symbolTable.setVariableExtensions(\"gl_SecondaryPositionNV\",     1, &E_GL_NV_stereo_view_rendering);\n        symbolTable.setVariableExtensions(\"gl_SecondaryViewportMaskNV\", 1, &E_GL_NV_stereo_view_rendering);\n        symbolTable.setVariableExtensions(\"gl_PositionPerViewNV\",       1, &E_GL_NVX_multiview_per_view_attributes);\n        symbolTable.setVariableExtensions(\"gl_ViewportMaskPerViewNV\",   1, &E_GL_NVX_multiview_per_view_attributes);\n\n        if (profile != EEsProfile && language == EShLangGeometry && version < 400) {\n            symbolTable.setVariableExtensions(\"gl_InvocationID\", Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5);\n        }\n        BuiltInVariable(\"gl_ViewportMask\",              EbvViewportMaskNV,          symbolTable);\n        BuiltInVariable(\"gl_SecondaryPositionNV\",       EbvSecondaryPositionNV,     symbolTable);\n        BuiltInVariable(\"gl_SecondaryViewportMaskNV\",   EbvSecondaryViewportMaskNV, symbolTable);\n        BuiltInVariable(\"gl_PositionPerViewNV\",         EbvPositionPerViewNV,       symbolTable);\n        BuiltInVariable(\"gl_ViewportMaskPerViewNV\",     EbvViewportMaskPerViewNV,   symbolTable);\n\n        if (language == EShLangVertex || language == EShLangGeometry) {\n            symbolTable.setVariableExtensions(\"gl_in\", \"gl_SecondaryPositionNV\", 1, &E_GL_NV_stereo_view_rendering);\n            symbolTable.setVariableExtensions(\"gl_in\", \"gl_PositionPerViewNV\",   1, &E_GL_NVX_multiview_per_view_attributes);\n\n            BuiltInVariable(\"gl_in\", \"gl_SecondaryPositionNV\", EbvSecondaryPositionNV, symbolTable);\n            BuiltInVariable(\"gl_in\", \"gl_PositionPerViewNV\",   EbvPositionPerViewNV,   symbolTable);\n        }\n        symbolTable.setVariableExtensions(\"gl_out\", \"gl_ViewportMask\",            1, &E_GL_NV_viewport_array2);\n        symbolTable.setVariableExtensions(\"gl_out\", \"gl_SecondaryPositionNV\",     1, &E_GL_NV_stereo_view_rendering);\n        symbolTable.setVariableExtensions(\"gl_out\", \"gl_SecondaryViewportMaskNV\", 1, &E_GL_NV_stereo_view_rendering);\n        symbolTable.setVariableExtensions(\"gl_out\", \"gl_PositionPerViewNV\",       1, &E_GL_NVX_multiview_per_view_attributes);\n        symbolTable.setVariableExtensions(\"gl_out\", \"gl_ViewportMaskPerViewNV\",   1, &E_GL_NVX_multiview_per_view_attributes);\n\n        BuiltInVariable(\"gl_out\", \"gl_ViewportMask\",            EbvViewportMaskNV,          symbolTable);\n        BuiltInVariable(\"gl_out\", \"gl_SecondaryPositionNV\",     EbvSecondaryPositionNV,     symbolTable);\n        BuiltInVariable(\"gl_out\", \"gl_SecondaryViewportMaskNV\", EbvSecondaryViewportMaskNV, symbolTable);\n        BuiltInVariable(\"gl_out\", \"gl_PositionPerViewNV\",       EbvPositionPerViewNV,       symbolTable);\n        BuiltInVariable(\"gl_out\", \"gl_ViewportMaskPerViewNV\",   EbvViewportMaskPerViewNV,   symbolTable);\n\n        BuiltInVariable(\"gl_PatchVerticesIn\", EbvPatchVertices,  symbolTable);\n        BuiltInVariable(\"gl_TessLevelOuter\",  EbvTessLevelOuter, symbolTable);\n        BuiltInVariable(\"gl_TessLevelInner\",  EbvTessLevelInner, symbolTable);\n        BuiltInVariable(\"gl_TessCoord\",       EbvTessCoord,      symbolTable);\n\n        if (version < 410)\n            symbolTable.setVariableExtensions(\"gl_ViewportIndex\", 1, &E_GL_ARB_viewport_array);\n\n        // Compatibility variables\n\n        BuiltInVariable(\"gl_in\", \"gl_ClipVertex\",          EbvClipVertex,          symbolTable);\n        BuiltInVariable(\"gl_in\", \"gl_FrontColor\",          EbvFrontColor,          symbolTable);\n        BuiltInVariable(\"gl_in\", \"gl_BackColor\",           EbvBackColor,           symbolTable);\n        BuiltInVariable(\"gl_in\", \"gl_FrontSecondaryColor\", EbvFrontSecondaryColor, symbolTable);\n        BuiltInVariable(\"gl_in\", \"gl_BackSecondaryColor\",  EbvBackSecondaryColor,  symbolTable);\n        BuiltInVariable(\"gl_in\", \"gl_TexCoord\",            EbvTexCoord,            symbolTable);\n        BuiltInVariable(\"gl_in\", \"gl_FogFragCoord\",        EbvFogFragCoord,        symbolTable);\n\n        BuiltInVariable(\"gl_out\", \"gl_ClipVertex\",          EbvClipVertex,          symbolTable);\n        BuiltInVariable(\"gl_out\", \"gl_FrontColor\",          EbvFrontColor,          symbolTable);\n        BuiltInVariable(\"gl_out\", \"gl_BackColor\",           EbvBackColor,           symbolTable);\n        BuiltInVariable(\"gl_out\", \"gl_FrontSecondaryColor\", EbvFrontSecondaryColor, symbolTable);\n        BuiltInVariable(\"gl_out\", \"gl_BackSecondaryColor\",  EbvBackSecondaryColor,  symbolTable);\n        BuiltInVariable(\"gl_out\", \"gl_TexCoord\",            EbvTexCoord,            symbolTable);\n        BuiltInVariable(\"gl_out\", \"gl_FogFragCoord\",        EbvFogFragCoord,        symbolTable);\n\n        BuiltInVariable(\"gl_ClipVertex\",          EbvClipVertex,          symbolTable);\n        BuiltInVariable(\"gl_FrontColor\",          EbvFrontColor,          symbolTable);\n        BuiltInVariable(\"gl_BackColor\",           EbvBackColor,           symbolTable);\n        BuiltInVariable(\"gl_FrontSecondaryColor\", EbvFrontSecondaryColor, symbolTable);\n        BuiltInVariable(\"gl_BackSecondaryColor\",  EbvBackSecondaryColor,  symbolTable);\n        BuiltInVariable(\"gl_TexCoord\",            EbvTexCoord,            symbolTable);\n        BuiltInVariable(\"gl_FogFragCoord\",        EbvFogFragCoord,        symbolTable);\n\n        // gl_PointSize, when it needs to be tied to an extension, is always a member of a block.\n        // (Sometimes with an instance name, sometimes anonymous).\n        if (profile == EEsProfile) {\n            if (language == EShLangGeometry) {\n                symbolTable.setVariableExtensions(\"gl_PointSize\", Num_AEP_geometry_point_size, AEP_geometry_point_size);\n                symbolTable.setVariableExtensions(\"gl_in\", \"gl_PointSize\", Num_AEP_geometry_point_size, AEP_geometry_point_size);\n            } else if (language == EShLangTessEvaluation || language == EShLangTessControl) {\n                // gl_in tessellation settings of gl_PointSize are in the context-dependent paths\n                symbolTable.setVariableExtensions(\"gl_PointSize\", Num_AEP_tessellation_point_size, AEP_tessellation_point_size);\n                symbolTable.setVariableExtensions(\"gl_out\", \"gl_PointSize\", Num_AEP_tessellation_point_size, AEP_tessellation_point_size);\n            }\n        }\n\n        if ((profile != EEsProfile && version >= 140) ||\n            (profile == EEsProfile && version >= 310)) {\n            symbolTable.setVariableExtensions(\"gl_DeviceIndex\",  1, &E_GL_EXT_device_group);\n            BuiltInVariable(\"gl_DeviceIndex\", EbvDeviceIndex, symbolTable);\n            symbolTable.setVariableExtensions(\"gl_ViewIndex\", 1, &E_GL_EXT_multiview);\n            BuiltInVariable(\"gl_ViewIndex\", EbvViewIndex, symbolTable);\n        }\n\n        if (profile != EEsProfile) {\n            BuiltInVariable(\"gl_SubGroupInvocationARB\", EbvSubGroupInvocation, symbolTable);\n            BuiltInVariable(\"gl_SubGroupEqMaskARB\",     EbvSubGroupEqMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupGeMaskARB\",     EbvSubGroupGeMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupGtMaskARB\",     EbvSubGroupGtMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupLeMaskARB\",     EbvSubGroupLeMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupLtMaskARB\",     EbvSubGroupLtMask,     symbolTable);\n\n            if (spvVersion.vulkan > 0) {\n                // Treat \"gl_SubGroupSizeARB\" as shader input instead of uniform for Vulkan\n                SpecialQualifier(\"gl_SubGroupSizeARB\", EvqVaryingIn, EbvSubGroupSize, symbolTable);\n                if (language == EShLangFragment)\n                    ModifyFlatDecoration(\"gl_SubGroupSizeARB\", true, symbolTable);\n            }\n            else\n                BuiltInVariable(\"gl_SubGroupSizeARB\", EbvSubGroupSize, symbolTable);\n        }\n\n        // GL_ARB_gpu_shader5/GL_NV_gpu_shader5\n        if (profile != EEsProfile && version < 400 && language == EShLangGeometry) {\n            symbolTable.setFunctionExtensions(\"EmitStreamVertex\", Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5);\n            symbolTable.setFunctionExtensions(\"EndStreamPrimitive\", Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5);\n        }\n        // GL_KHR_shader_subgroup\n        if ((profile == EEsProfile && version >= 310) ||\n            (profile != EEsProfile && version >= 140)) {\n            symbolTable.setVariableExtensions(\"gl_SubgroupSize\",         1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setVariableExtensions(\"gl_SubgroupInvocationID\", 1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setVariableExtensions(\"gl_SubgroupEqMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupGeMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupGtMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupLeMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupLtMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n\n            BuiltInVariable(\"gl_SubgroupSize\",         EbvSubgroupSize2,       symbolTable);\n            BuiltInVariable(\"gl_SubgroupInvocationID\", EbvSubgroupInvocation2, symbolTable);\n            BuiltInVariable(\"gl_SubgroupEqMask\",       EbvSubgroupEqMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupGeMask\",       EbvSubgroupGeMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupGtMask\",       EbvSubgroupGtMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupLeMask\",       EbvSubgroupLeMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupLtMask\",       EbvSubgroupLtMask2,     symbolTable);\n\n            // GL_NV_shader_sm_builtins\n            symbolTable.setVariableExtensions(\"gl_WarpsPerSMNV\",         1, &E_GL_NV_shader_sm_builtins);\n            symbolTable.setVariableExtensions(\"gl_SMCountNV\",            1, &E_GL_NV_shader_sm_builtins);\n            symbolTable.setVariableExtensions(\"gl_WarpIDNV\",             1, &E_GL_NV_shader_sm_builtins);\n            symbolTable.setVariableExtensions(\"gl_SMIDNV\",               1, &E_GL_NV_shader_sm_builtins);\n            BuiltInVariable(\"gl_WarpsPerSMNV\",          EbvWarpsPerSM,      symbolTable);\n            BuiltInVariable(\"gl_SMCountNV\",             EbvSMCount,         symbolTable);\n            BuiltInVariable(\"gl_WarpIDNV\",              EbvWarpID,          symbolTable);\n            BuiltInVariable(\"gl_SMIDNV\",                EbvSMID,            symbolTable);\n\n            // GL_ARM_shader_core_builtins\n            symbolTable.setVariableExtensions(\"gl_CoreCountARM\", 1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_CoreIDARM\",    1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_CoreMaxIDARM\", 1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_WarpIDARM\",    1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_WarpMaxIDARM\", 1, &E_GL_ARM_shader_core_builtins);\n\n            BuiltInVariable(\"gl_CoreCountARM\", EbvCoreCountARM, symbolTable);\n            BuiltInVariable(\"gl_CoreIDARM\",    EbvCoreIDARM, symbolTable);\n            BuiltInVariable(\"gl_CoreMaxIDARM\", EbvCoreMaxIDARM, symbolTable);\n            BuiltInVariable(\"gl_WarpIDARM\",    EbvWarpIDARM, symbolTable);\n            BuiltInVariable(\"gl_WarpMaxIDARM\", EbvWarpMaxIDARM, symbolTable);\n        }\n\n        if (language == EShLangGeometry || language == EShLangVertex) {\n            if ((profile == EEsProfile && version >= 310) ||\n                (profile != EEsProfile && version >= 450)) {\n                symbolTable.setVariableExtensions(\"gl_PrimitiveShadingRateEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n                BuiltInVariable(\"gl_PrimitiveShadingRateEXT\", EbvPrimitiveShadingRateKHR, symbolTable);\n\n                symbolTable.setVariableExtensions(\"gl_ShadingRateFlag2VerticalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n                symbolTable.setVariableExtensions(\"gl_ShadingRateFlag4VerticalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n                symbolTable.setVariableExtensions(\"gl_ShadingRateFlag2HorizontalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n                symbolTable.setVariableExtensions(\"gl_ShadingRateFlag4HorizontalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n            }\n        }\n        break;\n\n    case EShLangFragment:\n        SpecialQualifier(\"gl_FrontFacing\",      EvqFace,       EbvFace,             symbolTable);\n        SpecialQualifier(\"gl_FragCoord\",        EvqFragCoord,  EbvFragCoord,        symbolTable);\n        SpecialQualifier(\"gl_PointCoord\",       EvqPointCoord, EbvPointCoord,       symbolTable);\n        if (spvVersion.spv == 0)\n            SpecialQualifier(\"gl_FragColor\",    EvqFragColor,  EbvFragColor,        symbolTable);\n        else {\n            TSymbol* symbol = symbolTable.find(\"gl_FragColor\");\n            if (symbol) {\n                symbol->getWritableType().getQualifier().storage = EvqVaryingOut;\n                symbol->getWritableType().getQualifier().layoutLocation = 0;\n            }\n        }\n        SpecialQualifier(\"gl_FragDepth\",        EvqFragDepth,  EbvFragDepth,        symbolTable);\n        SpecialQualifier(\"gl_FragDepthEXT\",     EvqFragDepth,  EbvFragDepth,        symbolTable);\n        SpecialQualifier(\"gl_FragStencilRefARB\", EvqFragStencil, EbvFragStencilRef, symbolTable);\n        SpecialQualifier(\"gl_HelperInvocation\", EvqVaryingIn,  EbvHelperInvocation, symbolTable);\n\n        BuiltInVariable(\"gl_ClipDistance\",    EbvClipDistance,   symbolTable);\n        BuiltInVariable(\"gl_CullDistance\",    EbvCullDistance,   symbolTable);\n        BuiltInVariable(\"gl_PrimitiveID\",     EbvPrimitiveId,    symbolTable);\n\n        if (profile != EEsProfile && version >= 140) {\n            symbolTable.setVariableExtensions(\"gl_FragStencilRefARB\", 1, &E_GL_ARB_shader_stencil_export);\n            BuiltInVariable(\"gl_FragStencilRefARB\", EbvFragStencilRef, symbolTable);\n        }\n\n        if (profile != EEsProfile && version < 400) {\n            symbolTable.setFunctionExtensions(\"textureQueryLOD\", 1, &E_GL_ARB_texture_query_lod);\n        }\n\n        if (profile != EEsProfile && version >= 460) {\n            symbolTable.setFunctionExtensions(\"rayQueryInitializeEXT\",                                            1, &E_GL_EXT_ray_query);\n            symbolTable.setFunctionExtensions(\"rayQueryTerminateEXT\",                                             1, &E_GL_EXT_ray_query);\n            symbolTable.setFunctionExtensions(\"rayQueryGenerateIntersectionEXT\",                                  1, &E_GL_EXT_ray_query);\n            symbolTable.setFunctionExtensions(\"rayQueryConfirmIntersectionEXT\",                                   1, &E_GL_EXT_ray_query);\n            symbolTable.setFunctionExtensions(\"rayQueryProceedEXT\",                                               1, &E_GL_EXT_ray_query);\n            symbolTable.setFunctionExtensions(\"rayQueryGetIntersectionTypeEXT\",                                   1, &E_GL_EXT_ray_query);\n            symbolTable.setFunctionExtensions(\"rayQueryGetIntersectionTEXT\",                                      1, &E_GL_EXT_ray_query);\n            symbolTable.setFunctionExtensions(\"rayQueryGetRayFlagsEXT\",                                           1, &E_GL_EXT_ray_query);\n            symbolTable.setFunctionExtensions(\"rayQueryGetRayTMinEXT\",                                            1, &E_GL_EXT_ray_query);\n            symbolTable.setFunctionExtensions(\"rayQueryGetIntersectionInstanceCustomIndexEXT\",                    1, &E_GL_EXT_ray_query);\n            symbolTable.setFunctionExtensions(\"rayQueryGetIntersectionInstanceIdEXT\",                             1, &E_GL_EXT_ray_query);\n            symbolTable.setFunctionExtensions(\"rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT\", 1, &E_GL_EXT_ray_query);\n            symbolTable.setFunctionExtensions(\"rayQueryGetIntersectionGeometryIndexEXT\",                          1, &E_GL_EXT_ray_query);\n            symbolTable.setFunctionExtensions(\"rayQueryGetIntersectionPrimitiveIndexEXT\",                         1, &E_GL_EXT_ray_query);\n            symbolTable.setFunctionExtensions(\"rayQueryGetIntersectionBarycentricsEXT\",                           1, &E_GL_EXT_ray_query);\n            symbolTable.setFunctionExtensions(\"rayQueryGetIntersectionFrontFaceEXT\",                              1, &E_GL_EXT_ray_query);\n            symbolTable.setFunctionExtensions(\"rayQueryGetIntersectionCandidateAABBOpaqueEXT\",                    1, &E_GL_EXT_ray_query);\n            symbolTable.setFunctionExtensions(\"rayQueryGetIntersectionObjectRayDirectionEXT\",                     1, &E_GL_EXT_ray_query);\n            symbolTable.setFunctionExtensions(\"rayQueryGetIntersectionObjectRayOriginEXT\",                        1, &E_GL_EXT_ray_query);\n            symbolTable.setFunctionExtensions(\"rayQueryGetIntersectionObjectToWorldEXT\",                          1, &E_GL_EXT_ray_query);\n            symbolTable.setFunctionExtensions(\"rayQueryGetIntersectionWorldToObjectEXT\",                          1, &E_GL_EXT_ray_query);\n            symbolTable.setFunctionExtensions(\"rayQueryGetWorldRayOriginEXT\",                                     1, &E_GL_EXT_ray_query);\n            symbolTable.setFunctionExtensions(\"rayQueryGetWorldRayDirectionEXT\",                                  1, &E_GL_EXT_ray_query);\n            symbolTable.setFunctionExtensions(\"rayQueryGetIntersectionTriangleVertexPositionsEXT\",                1, &E_GL_EXT_ray_tracing_position_fetch);\n            symbolTable.setFunctionExtensions(\"rayQueryGetIntersectionClusterIdNV\",                               1, &E_GL_NV_cluster_acceleration_structure);\n            symbolTable.setFunctionExtensions(\"rayQueryGetIntersectionSpherePositionNV\",                          1, &E_GL_NV_linear_swept_spheres);\n            symbolTable.setFunctionExtensions(\"rayQueryGetIntersectionSphereRadiusNV\",                            1, &E_GL_NV_linear_swept_spheres);\n            symbolTable.setFunctionExtensions(\"rayQueryGetIntersectionLSSHitValueNV\",                             1, &E_GL_NV_linear_swept_spheres);\n            symbolTable.setFunctionExtensions(\"rayQueryGetIntersectionLSSPositionsNV\",                            1, &E_GL_NV_linear_swept_spheres);\n            symbolTable.setFunctionExtensions(\"rayQueryGetIntersectionLSSRadiiNV\",                                1, &E_GL_NV_linear_swept_spheres);\n            symbolTable.setFunctionExtensions(\"rayQueryIsSphereHitNV\",                                            1, &E_GL_NV_linear_swept_spheres);\n            symbolTable.setFunctionExtensions(\"rayQueryIsLSSHitNV\",                                               1, &E_GL_NV_linear_swept_spheres);\n            symbolTable.setVariableExtensions(\"gl_RayFlagsSkipAABBEXT\",                         1, &E_GL_EXT_ray_flags_primitive_culling);\n            symbolTable.setVariableExtensions(\"gl_RayFlagsSkipTrianglesEXT\",                    1, &E_GL_EXT_ray_flags_primitive_culling);\n            symbolTable.setVariableExtensions(\"gl_RayFlagsForceOpacityMicromap2StateEXT\",                  1, &E_GL_EXT_opacity_micromap);\n        }\n\n        if ((profile != EEsProfile && version >= 130) ||\n            (profile == EEsProfile && version >= 310)) {\n            BuiltInVariable(\"gl_SampleID\",           EbvSampleId,       symbolTable);\n            BuiltInVariable(\"gl_SamplePosition\",     EbvSamplePosition, symbolTable);\n            BuiltInVariable(\"gl_SampleMask\",         EbvSampleMask,     symbolTable);\n\n            if (profile != EEsProfile && version < 400) {\n                BuiltInVariable(\"gl_SampleMaskIn\",    EbvSampleMask,     symbolTable);\n                symbolTable.setVariableExtensions(\"gl_SampleMaskIn\", Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5);\n\n                BuiltInVariable(\"gl_NumSamples\",     EbvSampleMask,     symbolTable);\n\n                symbolTable.setVariableExtensions(\"gl_SampleMask\",     1, &E_GL_ARB_sample_shading);\n                symbolTable.setVariableExtensions(\"gl_SampleID\",       1, &E_GL_ARB_sample_shading);\n                symbolTable.setVariableExtensions(\"gl_SamplePosition\", 1, &E_GL_ARB_sample_shading);\n                symbolTable.setVariableExtensions(\"gl_NumSamples\",     1, &E_GL_ARB_sample_shading);\n            } else {\n                BuiltInVariable(\"gl_SampleMaskIn\",    EbvSampleMask,     symbolTable);\n\n                if (profile == EEsProfile && version < 320) {\n                    symbolTable.setVariableExtensions(\"gl_SampleID\", 1, &E_GL_OES_sample_variables);\n                    symbolTable.setVariableExtensions(\"gl_SamplePosition\", 1, &E_GL_OES_sample_variables);\n                    symbolTable.setVariableExtensions(\"gl_SampleMaskIn\", 1, &E_GL_OES_sample_variables);\n                    symbolTable.setVariableExtensions(\"gl_SampleMask\", 1, &E_GL_OES_sample_variables);\n                    symbolTable.setVariableExtensions(\"gl_NumSamples\", 1, &E_GL_OES_sample_variables);\n                }\n            }\n        }\n\n        BuiltInVariable(\"gl_Layer\",           EbvLayer,          symbolTable);\n        BuiltInVariable(\"gl_ViewportIndex\",   EbvViewportIndex,  symbolTable);\n\n        // Compatibility variables\n\n        BuiltInVariable(\"gl_in\", \"gl_FogFragCoord\",   EbvFogFragCoord,   symbolTable);\n        BuiltInVariable(\"gl_in\", \"gl_TexCoord\",       EbvTexCoord,       symbolTable);\n        BuiltInVariable(\"gl_in\", \"gl_Color\",          EbvColor,          symbolTable);\n        BuiltInVariable(\"gl_in\", \"gl_SecondaryColor\", EbvSecondaryColor, symbolTable);\n\n        BuiltInVariable(\"gl_FogFragCoord\",   EbvFogFragCoord,   symbolTable);\n        BuiltInVariable(\"gl_TexCoord\",       EbvTexCoord,       symbolTable);\n        BuiltInVariable(\"gl_Color\",          EbvColor,          symbolTable);\n        BuiltInVariable(\"gl_SecondaryColor\", EbvSecondaryColor, symbolTable);\n\n        // built-in functions\n\n        if (profile == EEsProfile) {\n            if (spvVersion.spv == 0) {\n                symbolTable.setFunctionExtensions(\"texture2DLodEXT\",      1, &E_GL_EXT_shader_texture_lod);\n                symbolTable.setFunctionExtensions(\"texture2DProjLodEXT\",  1, &E_GL_EXT_shader_texture_lod);\n                symbolTable.setFunctionExtensions(\"textureCubeLodEXT\",    1, &E_GL_EXT_shader_texture_lod);\n                symbolTable.setFunctionExtensions(\"texture2DGradEXT\",     1, &E_GL_EXT_shader_texture_lod);\n                symbolTable.setFunctionExtensions(\"texture2DProjGradEXT\", 1, &E_GL_EXT_shader_texture_lod);\n                symbolTable.setFunctionExtensions(\"textureCubeGradEXT\",   1, &E_GL_EXT_shader_texture_lod);\n                if (version < 320)\n                    symbolTable.setFunctionExtensions(\"textureGatherOffsets\", Num_AEP_gpu_shader5, AEP_gpu_shader5);\n            }\n            if (version == 100) {\n                symbolTable.setFunctionExtensions(\"dFdx\",   1, &E_GL_OES_standard_derivatives);\n                symbolTable.setFunctionExtensions(\"dFdy\",   1, &E_GL_OES_standard_derivatives);\n                symbolTable.setFunctionExtensions(\"fwidth\", 1, &E_GL_OES_standard_derivatives);\n            }\n            if (version == 310) {\n                symbolTable.setFunctionExtensions(\"fma\", Num_AEP_gpu_shader5, AEP_gpu_shader5);\n                symbolTable.setFunctionExtensions(\"interpolateAtCentroid\", 1, &E_GL_OES_shader_multisample_interpolation);\n                symbolTable.setFunctionExtensions(\"interpolateAtSample\",   1, &E_GL_OES_shader_multisample_interpolation);\n                symbolTable.setFunctionExtensions(\"interpolateAtOffset\",   1, &E_GL_OES_shader_multisample_interpolation);\n            }\n        } else if (version < 130) {\n            if (spvVersion.spv == 0) {\n                symbolTable.setFunctionExtensions(\"texture1DLod\",        1, &E_GL_ARB_shader_texture_lod);\n                symbolTable.setFunctionExtensions(\"texture2DLod\",        1, &E_GL_ARB_shader_texture_lod);\n                symbolTable.setFunctionExtensions(\"texture3DLod\",        1, &E_GL_ARB_shader_texture_lod);\n                symbolTable.setFunctionExtensions(\"textureCubeLod\",      1, &E_GL_ARB_shader_texture_lod);\n                symbolTable.setFunctionExtensions(\"texture1DProjLod\",    1, &E_GL_ARB_shader_texture_lod);\n                symbolTable.setFunctionExtensions(\"texture2DProjLod\",    1, &E_GL_ARB_shader_texture_lod);\n                symbolTable.setFunctionExtensions(\"texture3DProjLod\",    1, &E_GL_ARB_shader_texture_lod);\n                symbolTable.setFunctionExtensions(\"shadow1DLod\",         1, &E_GL_ARB_shader_texture_lod);\n                symbolTable.setFunctionExtensions(\"shadow2DLod\",         1, &E_GL_ARB_shader_texture_lod);\n                symbolTable.setFunctionExtensions(\"shadow1DProjLod\",     1, &E_GL_ARB_shader_texture_lod);\n                symbolTable.setFunctionExtensions(\"shadow2DProjLod\",     1, &E_GL_ARB_shader_texture_lod);\n            }\n        }\n\n        // E_GL_ARB_shader_texture_lod functions usable only with the extension enabled\n        if (profile != EEsProfile && spvVersion.spv == 0) {\n            symbolTable.setFunctionExtensions(\"texture1DGradARB\",         1, &E_GL_ARB_shader_texture_lod);\n            symbolTable.setFunctionExtensions(\"texture1DProjGradARB\",     1, &E_GL_ARB_shader_texture_lod);\n            symbolTable.setFunctionExtensions(\"texture2DGradARB\",         1, &E_GL_ARB_shader_texture_lod);\n            symbolTable.setFunctionExtensions(\"texture2DProjGradARB\",     1, &E_GL_ARB_shader_texture_lod);\n            symbolTable.setFunctionExtensions(\"texture3DGradARB\",         1, &E_GL_ARB_shader_texture_lod);\n            symbolTable.setFunctionExtensions(\"texture3DProjGradARB\",     1, &E_GL_ARB_shader_texture_lod);\n            symbolTable.setFunctionExtensions(\"textureCubeGradARB\",       1, &E_GL_ARB_shader_texture_lod);\n            symbolTable.setFunctionExtensions(\"shadow1DGradARB\",          1, &E_GL_ARB_shader_texture_lod);\n            symbolTable.setFunctionExtensions(\"shadow1DProjGradARB\",      1, &E_GL_ARB_shader_texture_lod);\n            symbolTable.setFunctionExtensions(\"shadow2DGradARB\",          1, &E_GL_ARB_shader_texture_lod);\n            symbolTable.setFunctionExtensions(\"shadow2DProjGradARB\",      1, &E_GL_ARB_shader_texture_lod);\n            symbolTable.setFunctionExtensions(\"texture2DRectGradARB\",     1, &E_GL_ARB_shader_texture_lod);\n            symbolTable.setFunctionExtensions(\"texture2DRectProjGradARB\", 1, &E_GL_ARB_shader_texture_lod);\n            symbolTable.setFunctionExtensions(\"shadow2DRectGradARB\",      1, &E_GL_ARB_shader_texture_lod);\n            symbolTable.setFunctionExtensions(\"shadow2DRectProjGradARB\",  1, &E_GL_ARB_shader_texture_lod);\n        }\n\n        // E_GL_ARB_shader_image_load_store\n        if (profile != EEsProfile && version < 420)\n            symbolTable.setFunctionExtensions(\"memoryBarrier\", 1, &E_GL_ARB_shader_image_load_store);\n        // All the image access functions are protected by checks on the type of the first argument.\n\n        // E_GL_ARB_shader_atomic_counters\n        if (profile != EEsProfile && version < 420) {\n            symbolTable.setFunctionExtensions(\"atomicCounterIncrement\", 1, &E_GL_ARB_shader_atomic_counters);\n            symbolTable.setFunctionExtensions(\"atomicCounterDecrement\", 1, &E_GL_ARB_shader_atomic_counters);\n            symbolTable.setFunctionExtensions(\"atomicCounter\"         , 1, &E_GL_ARB_shader_atomic_counters);\n        }\n\n        // E_GL_ARB_gpu_shader5/E_GL_NV_gpu_shader5 \n        if (profile != EEsProfile && version < 400) {\n            symbolTable.setFunctionExtensions(\"bitfieldExtract\", Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5);\n            symbolTable.setFunctionExtensions(\"bitfieldInsert\", Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5);\n            symbolTable.setFunctionExtensions(\"bitfieldReverse\", Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5);\n            symbolTable.setFunctionExtensions(\"bitCount\", Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5);\n            symbolTable.setFunctionExtensions(\"findLSB\", Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5);\n            symbolTable.setFunctionExtensions(\"findMSB\", Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5);\n            symbolTable.setFunctionExtensions(\"uaddCarry\", Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5);\n            symbolTable.setFunctionExtensions(\"usubBorrow\", Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5);\n            symbolTable.setFunctionExtensions(\"umulExtended\", Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5);\n            symbolTable.setFunctionExtensions(\"imulExtended\", Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5);\n            symbolTable.setFunctionExtensions(\"interpolateAtCentroid\", Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5);\n            symbolTable.setFunctionExtensions(\"interpolateAtSample\", Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5);\n            symbolTable.setFunctionExtensions(\"interpolateAtOffset\", Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5);\n        }\n\n        // E_GL_NV_gpu_shader5\n        if (profile != EEsProfile && version < 450) {\n            symbolTable.setFunctionExtensions(\"packInt2x32\",     1, &E_GL_NV_gpu_shader5);\n            symbolTable.setFunctionExtensions(\"packUint2x32\",     1, &E_GL_NV_gpu_shader5);\n            symbolTable.setFunctionExtensions(\"unpackInt2x32\",     1, &E_GL_NV_gpu_shader5);\n            symbolTable.setFunctionExtensions(\"unpackUint2x32\",     1, &E_GL_NV_gpu_shader5);\n            symbolTable.setFunctionExtensions(\"packFloat2x16\",     1, &E_GL_NV_gpu_shader5);\n            symbolTable.setFunctionExtensions(\"unpackFloat2x16\",     1, &E_GL_NV_gpu_shader5);\n            symbolTable.setFunctionExtensions(\"doubleBitsToInt64\",     1, &E_GL_NV_gpu_shader5);\n            symbolTable.setFunctionExtensions(\"doubleBitsToUint64\",     1, &E_GL_NV_gpu_shader5);\n            symbolTable.setFunctionExtensions(\"int64BitsToDouble\",     1, &E_GL_NV_gpu_shader5);\n            symbolTable.setFunctionExtensions(\"uint64BitsToDouble\",     1, &E_GL_NV_gpu_shader5);\n        }\n\n        // E_GL_ARB_shader_atomic_counter_ops\n        if (profile != EEsProfile && version == 450) {\n            symbolTable.setFunctionExtensions(\"atomicCounterAddARB\"     , 1, &E_GL_ARB_shader_atomic_counter_ops);\n            symbolTable.setFunctionExtensions(\"atomicCounterSubtractARB\", 1, &E_GL_ARB_shader_atomic_counter_ops);\n            symbolTable.setFunctionExtensions(\"atomicCounterMinARB\"     , 1, &E_GL_ARB_shader_atomic_counter_ops);\n            symbolTable.setFunctionExtensions(\"atomicCounterMaxARB\"     , 1, &E_GL_ARB_shader_atomic_counter_ops);\n            symbolTable.setFunctionExtensions(\"atomicCounterAndARB\"     , 1, &E_GL_ARB_shader_atomic_counter_ops);\n            symbolTable.setFunctionExtensions(\"atomicCounterOrARB\"      , 1, &E_GL_ARB_shader_atomic_counter_ops);\n            symbolTable.setFunctionExtensions(\"atomicCounterXorARB\"     , 1, &E_GL_ARB_shader_atomic_counter_ops);\n            symbolTable.setFunctionExtensions(\"atomicCounterExchangeARB\", 1, &E_GL_ARB_shader_atomic_counter_ops);\n            symbolTable.setFunctionExtensions(\"atomicCounterCompSwapARB\", 1, &E_GL_ARB_shader_atomic_counter_ops);\n        }\n\n        // E_GL_ARB_derivative_control\n        if (profile != EEsProfile && version < 450) {\n            symbolTable.setFunctionExtensions(\"dFdxFine\",     1, &E_GL_ARB_derivative_control);\n            symbolTable.setFunctionExtensions(\"dFdyFine\",     1, &E_GL_ARB_derivative_control);\n            symbolTable.setFunctionExtensions(\"fwidthFine\",   1, &E_GL_ARB_derivative_control);\n            symbolTable.setFunctionExtensions(\"dFdxCoarse\",   1, &E_GL_ARB_derivative_control);\n            symbolTable.setFunctionExtensions(\"dFdyCoarse\",   1, &E_GL_ARB_derivative_control);\n            symbolTable.setFunctionExtensions(\"fwidthCoarse\", 1, &E_GL_ARB_derivative_control);\n        }\n\n        // E_GL_ARB_sparse_texture2\n        if (profile != EEsProfile)\n        {\n            symbolTable.setFunctionExtensions(\"sparseTextureARB\",              1, &E_GL_ARB_sparse_texture2);\n            symbolTable.setFunctionExtensions(\"sparseTextureLodARB\",           1, &E_GL_ARB_sparse_texture2);\n            symbolTable.setFunctionExtensions(\"sparseTextureOffsetARB\",        1, &E_GL_ARB_sparse_texture2);\n            symbolTable.setFunctionExtensions(\"sparseTexelFetchARB\",           1, &E_GL_ARB_sparse_texture2);\n            symbolTable.setFunctionExtensions(\"sparseTexelFetchOffsetARB\",     1, &E_GL_ARB_sparse_texture2);\n            symbolTable.setFunctionExtensions(\"sparseTextureLodOffsetARB\",     1, &E_GL_ARB_sparse_texture2);\n            symbolTable.setFunctionExtensions(\"sparseTextureGradARB\",          1, &E_GL_ARB_sparse_texture2);\n            symbolTable.setFunctionExtensions(\"sparseTextureGradOffsetARB\",    1, &E_GL_ARB_sparse_texture2);\n            symbolTable.setFunctionExtensions(\"sparseTextureGatherARB\",        1, &E_GL_ARB_sparse_texture2);\n            symbolTable.setFunctionExtensions(\"sparseTextureGatherOffsetARB\",  1, &E_GL_ARB_sparse_texture2);\n            symbolTable.setFunctionExtensions(\"sparseTextureGatherOffsetsARB\", 1, &E_GL_ARB_sparse_texture2);\n            symbolTable.setFunctionExtensions(\"sparseImageLoadARB\",            1, &E_GL_ARB_sparse_texture2);\n            symbolTable.setFunctionExtensions(\"sparseTexelsResident\",          1, &E_GL_ARB_sparse_texture2);\n        }\n\n        // E_GL_ARB_sparse_texture_clamp\n        if (profile != EEsProfile)\n        {\n            symbolTable.setFunctionExtensions(\"sparseTextureClampARB\",              1, &E_GL_ARB_sparse_texture_clamp);\n            symbolTable.setFunctionExtensions(\"sparseTextureOffsetClampARB\",        1, &E_GL_ARB_sparse_texture_clamp);\n            symbolTable.setFunctionExtensions(\"sparseTextureGradClampARB\",          1, &E_GL_ARB_sparse_texture_clamp);\n            symbolTable.setFunctionExtensions(\"sparseTextureGradOffsetClampARB\",    1, &E_GL_ARB_sparse_texture_clamp);\n            symbolTable.setFunctionExtensions(\"textureClampARB\",                    1, &E_GL_ARB_sparse_texture_clamp);\n            symbolTable.setFunctionExtensions(\"textureOffsetClampARB\",              1, &E_GL_ARB_sparse_texture_clamp);\n            symbolTable.setFunctionExtensions(\"textureGradClampARB\",                1, &E_GL_ARB_sparse_texture_clamp);\n            symbolTable.setFunctionExtensions(\"textureGradOffsetClampARB\",          1, &E_GL_ARB_sparse_texture_clamp);\n        }\n\n        // E_GL_AMD_shader_explicit_vertex_parameter\n        if (profile != EEsProfile) {\n            symbolTable.setVariableExtensions(\"gl_BaryCoordNoPerspAMD\",         1, &E_GL_AMD_shader_explicit_vertex_parameter);\n            symbolTable.setVariableExtensions(\"gl_BaryCoordNoPerspCentroidAMD\", 1, &E_GL_AMD_shader_explicit_vertex_parameter);\n            symbolTable.setVariableExtensions(\"gl_BaryCoordNoPerspSampleAMD\",   1, &E_GL_AMD_shader_explicit_vertex_parameter);\n            symbolTable.setVariableExtensions(\"gl_BaryCoordSmoothAMD\",          1, &E_GL_AMD_shader_explicit_vertex_parameter);\n            symbolTable.setVariableExtensions(\"gl_BaryCoordSmoothCentroidAMD\",  1, &E_GL_AMD_shader_explicit_vertex_parameter);\n            symbolTable.setVariableExtensions(\"gl_BaryCoordSmoothSampleAMD\",    1, &E_GL_AMD_shader_explicit_vertex_parameter);\n            symbolTable.setVariableExtensions(\"gl_BaryCoordPullModelAMD\",       1, &E_GL_AMD_shader_explicit_vertex_parameter);\n\n            symbolTable.setFunctionExtensions(\"interpolateAtVertexAMD\",         1, &E_GL_AMD_shader_explicit_vertex_parameter);\n\n            BuiltInVariable(\"gl_BaryCoordNoPerspAMD\",           EbvBaryCoordNoPersp,         symbolTable);\n            BuiltInVariable(\"gl_BaryCoordNoPerspCentroidAMD\",   EbvBaryCoordNoPerspCentroid, symbolTable);\n            BuiltInVariable(\"gl_BaryCoordNoPerspSampleAMD\",     EbvBaryCoordNoPerspSample,   symbolTable);\n            BuiltInVariable(\"gl_BaryCoordSmoothAMD\",            EbvBaryCoordSmooth,          symbolTable);\n            BuiltInVariable(\"gl_BaryCoordSmoothCentroidAMD\",    EbvBaryCoordSmoothCentroid,  symbolTable);\n            BuiltInVariable(\"gl_BaryCoordSmoothSampleAMD\",      EbvBaryCoordSmoothSample,    symbolTable);\n            BuiltInVariable(\"gl_BaryCoordPullModelAMD\",         EbvBaryCoordPullModel,       symbolTable);\n        }\n\n        // E_GL_AMD_texture_gather_bias_lod\n        if (profile != EEsProfile) {\n            symbolTable.setFunctionExtensions(\"textureGatherLodAMD\",                1, &E_GL_AMD_texture_gather_bias_lod);\n            symbolTable.setFunctionExtensions(\"textureGatherLodOffsetAMD\",          1, &E_GL_AMD_texture_gather_bias_lod);\n            symbolTable.setFunctionExtensions(\"textureGatherLodOffsetsAMD\",         1, &E_GL_AMD_texture_gather_bias_lod);\n            symbolTable.setFunctionExtensions(\"sparseTextureGatherLodAMD\",          1, &E_GL_AMD_texture_gather_bias_lod);\n            symbolTable.setFunctionExtensions(\"sparseTextureGatherLodOffsetAMD\",    1, &E_GL_AMD_texture_gather_bias_lod);\n            symbolTable.setFunctionExtensions(\"sparseTextureGatherLodOffsetsAMD\",   1, &E_GL_AMD_texture_gather_bias_lod);\n        }\n\n        // E_GL_AMD_shader_image_load_store_lod\n        if (profile != EEsProfile) {\n            symbolTable.setFunctionExtensions(\"imageLoadLodAMD\",        1, &E_GL_AMD_shader_image_load_store_lod);\n            symbolTable.setFunctionExtensions(\"imageStoreLodAMD\",       1, &E_GL_AMD_shader_image_load_store_lod);\n            symbolTable.setFunctionExtensions(\"sparseImageLoadLodAMD\",  1, &E_GL_AMD_shader_image_load_store_lod);\n        }\n        if (profile != EEsProfile && version >= 430) {\n            symbolTable.setVariableExtensions(\"gl_FragFullyCoveredNV\", 1, &E_GL_NV_conservative_raster_underestimation);\n            BuiltInVariable(\"gl_FragFullyCoveredNV\", EbvFragFullyCoveredNV, symbolTable);\n        }\n        if ((profile != EEsProfile && version >= 450) ||\n            (profile == EEsProfile && version >= 320)) {\n            symbolTable.setVariableExtensions(\"gl_FragmentSizeNV\",        1, &E_GL_NV_shading_rate_image);\n            symbolTable.setVariableExtensions(\"gl_InvocationsPerPixelNV\", 1, &E_GL_NV_shading_rate_image);\n            BuiltInVariable(\"gl_FragmentSizeNV\",        EbvFragmentSizeNV, symbolTable);\n            BuiltInVariable(\"gl_InvocationsPerPixelNV\", EbvInvocationsPerPixelNV, symbolTable);\n            symbolTable.setVariableExtensions(\"gl_BaryCoordNV\",        1, &E_GL_NV_fragment_shader_barycentric);\n            symbolTable.setVariableExtensions(\"gl_BaryCoordNoPerspNV\", 1, &E_GL_NV_fragment_shader_barycentric);\n            BuiltInVariable(\"gl_BaryCoordNV\",        EbvBaryCoordNV,        symbolTable);\n            BuiltInVariable(\"gl_BaryCoordNoPerspNV\", EbvBaryCoordNoPerspNV, symbolTable);\n            symbolTable.setVariableExtensions(\"gl_BaryCoordEXT\",        1, &E_GL_EXT_fragment_shader_barycentric);\n            symbolTable.setVariableExtensions(\"gl_BaryCoordNoPerspEXT\", 1, &E_GL_EXT_fragment_shader_barycentric);\n            BuiltInVariable(\"gl_BaryCoordEXT\",        EbvBaryCoordEXT,        symbolTable);\n            BuiltInVariable(\"gl_BaryCoordNoPerspEXT\", EbvBaryCoordNoPerspEXT, symbolTable);\n        }\n\n        if ((profile != EEsProfile && version >= 450) ||\n            (profile == EEsProfile && version >= 310)) {\n            symbolTable.setVariableExtensions(\"gl_FragSizeEXT\",            1, &E_GL_EXT_fragment_invocation_density);\n            symbolTable.setVariableExtensions(\"gl_FragInvocationCountEXT\", 1, &E_GL_EXT_fragment_invocation_density);\n            BuiltInVariable(\"gl_FragSizeEXT\",            EbvFragSizeEXT, symbolTable);\n            BuiltInVariable(\"gl_FragInvocationCountEXT\", EbvFragInvocationCountEXT, symbolTable);\n        }\n\n        symbolTable.setVariableExtensions(\"gl_FragDepthEXT\", 1, &E_GL_EXT_frag_depth);\n\n        symbolTable.setFunctionExtensions(\"clockARB\",     1, &E_GL_ARB_shader_clock);\n        symbolTable.setFunctionExtensions(\"clock2x32ARB\", 1, &E_GL_ARB_shader_clock);\n\n        symbolTable.setFunctionExtensions(\"clockRealtimeEXT\", 1, &E_GL_EXT_shader_realtime_clock);\n        symbolTable.setFunctionExtensions(\"clockRealtime2x32EXT\", 1, &E_GL_EXT_shader_realtime_clock);\n\n        if (profile == EEsProfile && version < 320) {\n            symbolTable.setVariableExtensions(\"gl_PrimitiveID\",  Num_AEP_geometry_shader, AEP_geometry_shader);\n            symbolTable.setVariableExtensions(\"gl_Layer\",        Num_AEP_geometry_shader, AEP_geometry_shader);\n        }\n\n        if (profile == EEsProfile && version < 320) {\n            symbolTable.setFunctionExtensions(\"imageAtomicAdd\",      1, &E_GL_OES_shader_image_atomic);\n            symbolTable.setFunctionExtensions(\"imageAtomicMin\",      1, &E_GL_OES_shader_image_atomic);\n            symbolTable.setFunctionExtensions(\"imageAtomicMax\",      1, &E_GL_OES_shader_image_atomic);\n            symbolTable.setFunctionExtensions(\"imageAtomicAnd\",      1, &E_GL_OES_shader_image_atomic);\n            symbolTable.setFunctionExtensions(\"imageAtomicOr\",       1, &E_GL_OES_shader_image_atomic);\n            symbolTable.setFunctionExtensions(\"imageAtomicXor\",      1, &E_GL_OES_shader_image_atomic);\n            symbolTable.setFunctionExtensions(\"imageAtomicExchange\", 1, &E_GL_OES_shader_image_atomic);\n            symbolTable.setFunctionExtensions(\"imageAtomicCompSwap\", 1, &E_GL_OES_shader_image_atomic);\n        }\n\n        if (profile != EEsProfile && version < 330 ) {\n            const int numBitEncodingExts = 3;\n            const char* bitEncodingExts[numBitEncodingExts] = { E_GL_ARB_shader_bit_encoding,\n                                                                E_GL_ARB_gpu_shader5,\n                                                                E_GL_NV_gpu_shader5};\n            symbolTable.setFunctionExtensions(\"floatBitsToInt\", numBitEncodingExts, bitEncodingExts);\n            symbolTable.setFunctionExtensions(\"floatBitsToUint\", numBitEncodingExts, bitEncodingExts);\n            symbolTable.setFunctionExtensions(\"intBitsToFloat\", numBitEncodingExts, bitEncodingExts);\n            symbolTable.setFunctionExtensions(\"uintBitsToFloat\", numBitEncodingExts, bitEncodingExts);\n\n        }\n\n        if (profile != EEsProfile && version < 430 ) {\n            symbolTable.setFunctionExtensions(\"imageSize\", 1, &E_GL_ARB_shader_image_size);\n        }\n\n        // GL_ARB_shader_storage_buffer_object\n        if (profile != EEsProfile && version < 430 ) {\n            symbolTable.setFunctionExtensions(\"atomicAdd\", 1, &E_GL_ARB_shader_storage_buffer_object);\n            symbolTable.setFunctionExtensions(\"atomicMin\", 1, &E_GL_ARB_shader_storage_buffer_object);\n            symbolTable.setFunctionExtensions(\"atomicMax\", 1, &E_GL_ARB_shader_storage_buffer_object);\n            symbolTable.setFunctionExtensions(\"atomicAnd\", 1, &E_GL_ARB_shader_storage_buffer_object);\n            symbolTable.setFunctionExtensions(\"atomicOr\", 1, &E_GL_ARB_shader_storage_buffer_object);\n            symbolTable.setFunctionExtensions(\"atomicXor\", 1, &E_GL_ARB_shader_storage_buffer_object);\n            symbolTable.setFunctionExtensions(\"atomicExchange\", 1, &E_GL_ARB_shader_storage_buffer_object);\n            symbolTable.setFunctionExtensions(\"atomicCompSwap\", 1, &E_GL_ARB_shader_storage_buffer_object);\n        }\n\n        // GL_ARB_shading_language_packing\n        if (profile != EEsProfile && version < 400 ) {\n            const int numPackingExts = 3;\n            const char* packingExts[numPackingExts] = { E_GL_ARB_shading_language_packing,\n                                                                E_GL_ARB_gpu_shader5,\n                                                                E_GL_NV_gpu_shader5};\n            symbolTable.setFunctionExtensions(\"packUnorm2x16\", numPackingExts, packingExts);\n            symbolTable.setFunctionExtensions(\"unpackUnorm2x16\", numPackingExts, packingExts);\n            symbolTable.setFunctionExtensions(\"packSnorm4x8\", numPackingExts, packingExts);\n            symbolTable.setFunctionExtensions(\"packUnorm4x8\", numPackingExts, packingExts);\n            symbolTable.setFunctionExtensions(\"unpackSnorm4x8\", numPackingExts, packingExts);\n            symbolTable.setFunctionExtensions(\"unpackUnorm4x8\", numPackingExts, packingExts);\n        }\n        if (profile != EEsProfile && version < 420 ) {\n            symbolTable.setFunctionExtensions(\"packSnorm2x16\", 1, &E_GL_ARB_shading_language_packing);\n            symbolTable.setFunctionExtensions(\"unpackSnorm2x16\", 1, &E_GL_ARB_shading_language_packing);\n            symbolTable.setFunctionExtensions(\"unpackHalf2x16\", 1, &E_GL_ARB_shading_language_packing);\n            symbolTable.setFunctionExtensions(\"packHalf2x16\", 1, &E_GL_ARB_shading_language_packing);\n        }\n\n        symbolTable.setVariableExtensions(\"gl_DeviceIndex\",  1, &E_GL_EXT_device_group);\n        BuiltInVariable(\"gl_DeviceIndex\", EbvDeviceIndex, symbolTable);\n        symbolTable.setVariableExtensions(\"gl_ViewIndex\", 1, &E_GL_EXT_multiview);\n        BuiltInVariable(\"gl_ViewIndex\", EbvViewIndex, symbolTable);\n        if (version >= 300 /* both ES and non-ES */) {\n            symbolTable.setVariableExtensions(\"gl_ViewID_OVR\", Num_OVR_multiview_EXTs, OVR_multiview_EXTs);\n            BuiltInVariable(\"gl_ViewID_OVR\", EbvViewIndex, symbolTable);\n        }\n\n        // GL_ARB_shader_ballot\n        if (profile != EEsProfile) {\n            symbolTable.setVariableExtensions(\"gl_SubGroupSizeARB\",       1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupInvocationARB\", 1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupEqMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupGeMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupGtMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupLeMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupLtMaskARB\",     1, &E_GL_ARB_shader_ballot);\n\n            BuiltInVariable(\"gl_SubGroupInvocationARB\", EbvSubGroupInvocation, symbolTable);\n            BuiltInVariable(\"gl_SubGroupEqMaskARB\",     EbvSubGroupEqMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupGeMaskARB\",     EbvSubGroupGeMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupGtMaskARB\",     EbvSubGroupGtMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupLeMaskARB\",     EbvSubGroupLeMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupLtMaskARB\",     EbvSubGroupLtMask,     symbolTable);\n\n            if (spvVersion.vulkan > 0) {\n                // Treat \"gl_SubGroupSizeARB\" as shader input instead of uniform for Vulkan\n                SpecialQualifier(\"gl_SubGroupSizeARB\", EvqVaryingIn, EbvSubGroupSize, symbolTable);\n                if (language == EShLangFragment)\n                    ModifyFlatDecoration(\"gl_SubGroupSizeARB\", true, symbolTable);\n            }\n            else\n                BuiltInVariable(\"gl_SubGroupSizeARB\", EbvSubGroupSize, symbolTable);\n        }\n\n        // GL_EXT_expect_assume\n        if ((profile == EEsProfile && version >= 310) ||\n            (profile != EEsProfile && version >= 140)) {\n            symbolTable.setFunctionExtensions(\"assumeEXT\", 1, &E_GL_EXT_expect_assume);\n            symbolTable.setFunctionExtensions(\"expectEXT\", 1, &E_GL_EXT_expect_assume);\n        }\n\n        // GL_KHR_shader_subgroup\n        if ((profile == EEsProfile && version >= 310) ||\n            (profile != EEsProfile && version >= 140)) {\n            symbolTable.setVariableExtensions(\"gl_SubgroupSize\",         1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setVariableExtensions(\"gl_SubgroupInvocationID\", 1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setVariableExtensions(\"gl_SubgroupEqMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupGeMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupGtMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupLeMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupLtMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n\n            BuiltInVariable(\"gl_SubgroupSize\",         EbvSubgroupSize2,       symbolTable);\n            BuiltInVariable(\"gl_SubgroupInvocationID\", EbvSubgroupInvocation2, symbolTable);\n            BuiltInVariable(\"gl_SubgroupEqMask\",       EbvSubgroupEqMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupGeMask\",       EbvSubgroupGeMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupGtMask\",       EbvSubgroupGtMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupLeMask\",       EbvSubgroupLeMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupLtMask\",       EbvSubgroupLtMask2,     symbolTable);\n\n            symbolTable.setFunctionExtensions(\"subgroupBarrier\",                 1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setFunctionExtensions(\"subgroupMemoryBarrier\",           1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setFunctionExtensions(\"subgroupMemoryBarrierBuffer\",     1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setFunctionExtensions(\"subgroupMemoryBarrierImage\",      1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setFunctionExtensions(\"subgroupElect\",                   1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setFunctionExtensions(\"subgroupAll\",                     1, &E_GL_KHR_shader_subgroup_vote);\n            symbolTable.setFunctionExtensions(\"subgroupAny\",                     1, &E_GL_KHR_shader_subgroup_vote);\n            symbolTable.setFunctionExtensions(\"subgroupAllEqual\",                1, &E_GL_KHR_shader_subgroup_vote);\n            symbolTable.setFunctionExtensions(\"subgroupBroadcast\",               1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setFunctionExtensions(\"subgroupBroadcastFirst\",          1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setFunctionExtensions(\"subgroupBallot\",                  1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setFunctionExtensions(\"subgroupInverseBallot\",           1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setFunctionExtensions(\"subgroupBallotBitExtract\",        1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setFunctionExtensions(\"subgroupBallotBitCount\",          1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setFunctionExtensions(\"subgroupBallotInclusiveBitCount\", 1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setFunctionExtensions(\"subgroupBallotExclusiveBitCount\", 1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setFunctionExtensions(\"subgroupBallotFindLSB\",           1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setFunctionExtensions(\"subgroupBallotFindMSB\",           1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setFunctionExtensions(\"subgroupShuffle\",                 1, &E_GL_KHR_shader_subgroup_shuffle);\n            symbolTable.setFunctionExtensions(\"subgroupShuffleXor\",              1, &E_GL_KHR_shader_subgroup_shuffle);\n            symbolTable.setFunctionExtensions(\"subgroupShuffleUp\",               1, &E_GL_KHR_shader_subgroup_shuffle_relative);\n            symbolTable.setFunctionExtensions(\"subgroupShuffleDown\",             1, &E_GL_KHR_shader_subgroup_shuffle_relative);\n            symbolTable.setFunctionExtensions(\"subgroupRotate\",                  1, &E_GL_KHR_shader_subgroup_rotate);\n            symbolTable.setFunctionExtensions(\"subgroupClusteredRotate\",         1, &E_GL_KHR_shader_subgroup_rotate);\n            symbolTable.setFunctionExtensions(\"subgroupAdd\",                     1, &E_GL_KHR_shader_subgroup_arithmetic);\n            symbolTable.setFunctionExtensions(\"subgroupMul\",                     1, &E_GL_KHR_shader_subgroup_arithmetic);\n            symbolTable.setFunctionExtensions(\"subgroupMin\",                     1, &E_GL_KHR_shader_subgroup_arithmetic);\n            symbolTable.setFunctionExtensions(\"subgroupMax\",                     1, &E_GL_KHR_shader_subgroup_arithmetic);\n            symbolTable.setFunctionExtensions(\"subgroupAnd\",                     1, &E_GL_KHR_shader_subgroup_arithmetic);\n            symbolTable.setFunctionExtensions(\"subgroupOr\",                      1, &E_GL_KHR_shader_subgroup_arithmetic);\n            symbolTable.setFunctionExtensions(\"subgroupXor\",                     1, &E_GL_KHR_shader_subgroup_arithmetic);\n            symbolTable.setFunctionExtensions(\"subgroupInclusiveAdd\",            1, &E_GL_KHR_shader_subgroup_arithmetic);\n            symbolTable.setFunctionExtensions(\"subgroupInclusiveMul\",            1, &E_GL_KHR_shader_subgroup_arithmetic);\n            symbolTable.setFunctionExtensions(\"subgroupInclusiveMin\",            1, &E_GL_KHR_shader_subgroup_arithmetic);\n            symbolTable.setFunctionExtensions(\"subgroupInclusiveMax\",            1, &E_GL_KHR_shader_subgroup_arithmetic);\n            symbolTable.setFunctionExtensions(\"subgroupInclusiveAnd\",            1, &E_GL_KHR_shader_subgroup_arithmetic);\n            symbolTable.setFunctionExtensions(\"subgroupInclusiveOr\",             1, &E_GL_KHR_shader_subgroup_arithmetic);\n            symbolTable.setFunctionExtensions(\"subgroupInclusiveXor\",            1, &E_GL_KHR_shader_subgroup_arithmetic);\n            symbolTable.setFunctionExtensions(\"subgroupExclusiveAdd\",            1, &E_GL_KHR_shader_subgroup_arithmetic);\n            symbolTable.setFunctionExtensions(\"subgroupExclusiveMul\",            1, &E_GL_KHR_shader_subgroup_arithmetic);\n            symbolTable.setFunctionExtensions(\"subgroupExclusiveMin\",            1, &E_GL_KHR_shader_subgroup_arithmetic);\n            symbolTable.setFunctionExtensions(\"subgroupExclusiveMax\",            1, &E_GL_KHR_shader_subgroup_arithmetic);\n            symbolTable.setFunctionExtensions(\"subgroupExclusiveAnd\",            1, &E_GL_KHR_shader_subgroup_arithmetic);\n            symbolTable.setFunctionExtensions(\"subgroupExclusiveOr\",             1, &E_GL_KHR_shader_subgroup_arithmetic);\n            symbolTable.setFunctionExtensions(\"subgroupExclusiveXor\",            1, &E_GL_KHR_shader_subgroup_arithmetic);\n            symbolTable.setFunctionExtensions(\"subgroupClusteredAdd\",            1, &E_GL_KHR_shader_subgroup_clustered);\n            symbolTable.setFunctionExtensions(\"subgroupClusteredMul\",            1, &E_GL_KHR_shader_subgroup_clustered);\n            symbolTable.setFunctionExtensions(\"subgroupClusteredMin\",            1, &E_GL_KHR_shader_subgroup_clustered);\n            symbolTable.setFunctionExtensions(\"subgroupClusteredMax\",            1, &E_GL_KHR_shader_subgroup_clustered);\n            symbolTable.setFunctionExtensions(\"subgroupClusteredAnd\",            1, &E_GL_KHR_shader_subgroup_clustered);\n            symbolTable.setFunctionExtensions(\"subgroupClusteredOr\",             1, &E_GL_KHR_shader_subgroup_clustered);\n            symbolTable.setFunctionExtensions(\"subgroupClusteredXor\",            1, &E_GL_KHR_shader_subgroup_clustered);\n            symbolTable.setFunctionExtensions(\"subgroupQuadBroadcast\",           1, &E_GL_KHR_shader_subgroup_quad);\n            symbolTable.setFunctionExtensions(\"subgroupQuadSwapHorizontal\",      1, &E_GL_KHR_shader_subgroup_quad);\n            symbolTable.setFunctionExtensions(\"subgroupQuadSwapVertical\",        1, &E_GL_KHR_shader_subgroup_quad);\n            symbolTable.setFunctionExtensions(\"subgroupQuadSwapDiagonal\",        1, &E_GL_KHR_shader_subgroup_quad);\n            symbolTable.setFunctionExtensions(\"subgroupPartitionNV\",                          1, &E_GL_NV_shader_subgroup_partitioned);\n            symbolTable.setFunctionExtensions(\"subgroupPartitionedAddNV\",                     1, &E_GL_NV_shader_subgroup_partitioned);\n            symbolTable.setFunctionExtensions(\"subgroupPartitionedMulNV\",                     1, &E_GL_NV_shader_subgroup_partitioned);\n            symbolTable.setFunctionExtensions(\"subgroupPartitionedMinNV\",                     1, &E_GL_NV_shader_subgroup_partitioned);\n            symbolTable.setFunctionExtensions(\"subgroupPartitionedMaxNV\",                     1, &E_GL_NV_shader_subgroup_partitioned);\n            symbolTable.setFunctionExtensions(\"subgroupPartitionedAndNV\",                     1, &E_GL_NV_shader_subgroup_partitioned);\n            symbolTable.setFunctionExtensions(\"subgroupPartitionedOrNV\",                      1, &E_GL_NV_shader_subgroup_partitioned);\n            symbolTable.setFunctionExtensions(\"subgroupPartitionedXorNV\",                     1, &E_GL_NV_shader_subgroup_partitioned);\n            symbolTable.setFunctionExtensions(\"subgroupPartitionedInclusiveAddNV\",            1, &E_GL_NV_shader_subgroup_partitioned);\n            symbolTable.setFunctionExtensions(\"subgroupPartitionedInclusiveMulNV\",            1, &E_GL_NV_shader_subgroup_partitioned);\n            symbolTable.setFunctionExtensions(\"subgroupPartitionedInclusiveMinNV\",            1, &E_GL_NV_shader_subgroup_partitioned);\n            symbolTable.setFunctionExtensions(\"subgroupPartitionedInclusiveMaxNV\",            1, &E_GL_NV_shader_subgroup_partitioned);\n            symbolTable.setFunctionExtensions(\"subgroupPartitionedInclusiveAndNV\",            1, &E_GL_NV_shader_subgroup_partitioned);\n            symbolTable.setFunctionExtensions(\"subgroupPartitionedInclusiveOrNV\",             1, &E_GL_NV_shader_subgroup_partitioned);\n            symbolTable.setFunctionExtensions(\"subgroupPartitionedInclusiveXorNV\",            1, &E_GL_NV_shader_subgroup_partitioned);\n            symbolTable.setFunctionExtensions(\"subgroupPartitionedExclusiveAddNV\",            1, &E_GL_NV_shader_subgroup_partitioned);\n            symbolTable.setFunctionExtensions(\"subgroupPartitionedExclusiveMulNV\",            1, &E_GL_NV_shader_subgroup_partitioned);\n            symbolTable.setFunctionExtensions(\"subgroupPartitionedExclusiveMinNV\",            1, &E_GL_NV_shader_subgroup_partitioned);\n            symbolTable.setFunctionExtensions(\"subgroupPartitionedExclusiveMaxNV\",            1, &E_GL_NV_shader_subgroup_partitioned);\n            symbolTable.setFunctionExtensions(\"subgroupPartitionedExclusiveAndNV\",            1, &E_GL_NV_shader_subgroup_partitioned);\n            symbolTable.setFunctionExtensions(\"subgroupPartitionedExclusiveOrNV\",             1, &E_GL_NV_shader_subgroup_partitioned);\n            symbolTable.setFunctionExtensions(\"subgroupPartitionedExclusiveXorNV\",            1, &E_GL_NV_shader_subgroup_partitioned);\n\n            // GL_NV_shader_sm_builtins\n            symbolTable.setVariableExtensions(\"gl_WarpsPerSMNV\",         1, &E_GL_NV_shader_sm_builtins);\n            symbolTable.setVariableExtensions(\"gl_SMCountNV\",            1, &E_GL_NV_shader_sm_builtins);\n            symbolTable.setVariableExtensions(\"gl_WarpIDNV\",             1, &E_GL_NV_shader_sm_builtins);\n            symbolTable.setVariableExtensions(\"gl_SMIDNV\",               1, &E_GL_NV_shader_sm_builtins);\n            BuiltInVariable(\"gl_WarpsPerSMNV\",          EbvWarpsPerSM,      symbolTable);\n            BuiltInVariable(\"gl_SMCountNV\",             EbvSMCount,         symbolTable);\n            BuiltInVariable(\"gl_WarpIDNV\",              EbvWarpID,          symbolTable);\n            BuiltInVariable(\"gl_SMIDNV\",                EbvSMID,            symbolTable);\n\n            // GL_ARM_shader_core_builtins\n            symbolTable.setVariableExtensions(\"gl_CoreCountARM\", 1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_CoreIDARM\",    1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_CoreMaxIDARM\", 1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_WarpIDARM\",    1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_WarpMaxIDARM\", 1, &E_GL_ARM_shader_core_builtins);\n\n            BuiltInVariable(\"gl_CoreCountARM\", EbvCoreCountARM, symbolTable);\n            BuiltInVariable(\"gl_CoreIDARM\",    EbvCoreIDARM, symbolTable);\n            BuiltInVariable(\"gl_CoreMaxIDARM\", EbvCoreMaxIDARM, symbolTable);\n            BuiltInVariable(\"gl_WarpIDARM\",    EbvWarpIDARM, symbolTable);\n            BuiltInVariable(\"gl_WarpMaxIDARM\", EbvWarpMaxIDARM, symbolTable);\n        }\n\n        if (profile == EEsProfile) {\n            symbolTable.setFunctionExtensions(\"shadow2DEXT\",        1, &E_GL_EXT_shadow_samplers);\n            symbolTable.setFunctionExtensions(\"shadow2DProjEXT\",    1, &E_GL_EXT_shadow_samplers);\n        }\n\n        if (spvVersion.vulkan > 0) {\n            symbolTable.setVariableExtensions(\"gl_ScopeDevice\",             1, &E_GL_KHR_memory_scope_semantics);\n            symbolTable.setVariableExtensions(\"gl_ScopeWorkgroup\",          1, &E_GL_KHR_memory_scope_semantics);\n            symbolTable.setVariableExtensions(\"gl_ScopeSubgroup\",           1, &E_GL_KHR_memory_scope_semantics);\n            symbolTable.setVariableExtensions(\"gl_ScopeInvocation\",         1, &E_GL_KHR_memory_scope_semantics);\n\n            symbolTable.setVariableExtensions(\"gl_SemanticsRelaxed\",        1, &E_GL_KHR_memory_scope_semantics);\n            symbolTable.setVariableExtensions(\"gl_SemanticsAcquire\",        1, &E_GL_KHR_memory_scope_semantics);\n            symbolTable.setVariableExtensions(\"gl_SemanticsRelease\",        1, &E_GL_KHR_memory_scope_semantics);\n            symbolTable.setVariableExtensions(\"gl_SemanticsAcquireRelease\", 1, &E_GL_KHR_memory_scope_semantics);\n            symbolTable.setVariableExtensions(\"gl_SemanticsMakeAvailable\",  1, &E_GL_KHR_memory_scope_semantics);\n            symbolTable.setVariableExtensions(\"gl_SemanticsMakeVisible\",    1, &E_GL_KHR_memory_scope_semantics);\n            symbolTable.setVariableExtensions(\"gl_SemanticsVolatile\",       1, &E_GL_KHR_memory_scope_semantics);\n\n            symbolTable.setVariableExtensions(\"gl_StorageSemanticsNone\",    1, &E_GL_KHR_memory_scope_semantics);\n            symbolTable.setVariableExtensions(\"gl_StorageSemanticsBuffer\",  1, &E_GL_KHR_memory_scope_semantics);\n            symbolTable.setVariableExtensions(\"gl_StorageSemanticsShared\",  1, &E_GL_KHR_memory_scope_semantics);\n            symbolTable.setVariableExtensions(\"gl_StorageSemanticsImage\",   1, &E_GL_KHR_memory_scope_semantics);\n            symbolTable.setVariableExtensions(\"gl_StorageSemanticsOutput\",  1, &E_GL_KHR_memory_scope_semantics);\n        }\n\n        symbolTable.setFunctionExtensions(\"helperInvocationEXT\",            1, &E_GL_EXT_demote_to_helper_invocation);\n\n        if ((profile == EEsProfile && version >= 310) ||\n            (profile != EEsProfile && version >= 450)) {\n            symbolTable.setVariableExtensions(\"gl_ShadingRateEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n            BuiltInVariable(\"gl_ShadingRateEXT\", EbvShadingRateKHR, symbolTable);\n\n            symbolTable.setVariableExtensions(\"gl_ShadingRateFlag2VerticalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n            symbolTable.setVariableExtensions(\"gl_ShadingRateFlag4VerticalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n            symbolTable.setVariableExtensions(\"gl_ShadingRateFlag2HorizontalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n            symbolTable.setVariableExtensions(\"gl_ShadingRateFlag4HorizontalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n        }\n\n        // GL_EXT_shader_quad_control\n        if ((profile != EEsProfile && version >= 140) ||\n            (profile == EEsProfile && version >= 310)) {\n            symbolTable.setFunctionExtensions(\"subgroupQuadAll\",                     1,  &E_GL_KHR_shader_subgroup_vote);\n            symbolTable.setFunctionExtensions(\"subgroupQuadAny\",                     1,  &E_GL_KHR_shader_subgroup_vote);\n        }\n\n        // GL_EXT_shader_tile_image\n        symbolTable.setFunctionExtensions(\"stencilAttachmentReadEXT\", 1, &E_GL_EXT_shader_tile_image);\n        symbolTable.setFunctionExtensions(\"depthAttachmentReadEXT\", 1, &E_GL_EXT_shader_tile_image);\n        symbolTable.setFunctionExtensions(\"colorAttachmentReadEXT\", 1, &E_GL_EXT_shader_tile_image);\n\n        if ((profile == EEsProfile && version >= 310) ||\n            (profile != EEsProfile && version >= 140)) {\n\n            symbolTable.setFunctionExtensions(\"textureWeightedQCOM\",      1, &E_GL_QCOM_image_processing);\n            symbolTable.setFunctionExtensions(\"textureBoxFilterQCOM\",     1, &E_GL_QCOM_image_processing);\n            symbolTable.setFunctionExtensions(\"textureBlockMatchSADQCOM\", 1, &E_GL_QCOM_image_processing);\n            symbolTable.setFunctionExtensions(\"textureBlockMatchSSDQCOM\", 1, &E_GL_QCOM_image_processing);\n\n            symbolTable.setFunctionExtensions(\"textureBlockMatchWindowSSDQCOM\", 1, &E_GL_QCOM_image_processing2);\n            symbolTable.setFunctionExtensions(\"textureBlockMatchWindowSADQCOM\", 1, &E_GL_QCOM_image_processing2);\n            symbolTable.setFunctionExtensions(\"textureBlockMatchGatherSSDQCOM\", 1, &E_GL_QCOM_image_processing2);\n            symbolTable.setFunctionExtensions(\"textureBlockMatchGatherSADQCOM\", 1, &E_GL_QCOM_image_processing2);\n        }\n\n        if ((profile == EEsProfile && version >= 310) ||\n            (profile != EEsProfile && version >= 460)) {\n            BuiltInVariable(\"gl_TileOffsetQCOM\",    EbvTileOffsetQCOM,      symbolTable);\n            BuiltInVariable(\"gl_TileDimensionQCOM\", EbvTileDimensionQCOM,   symbolTable);\n            BuiltInVariable(\"gl_TileApronSizeQCOM\", EbvTileApronSizeQCOM,   symbolTable);\n\n            symbolTable.setVariableExtensions(\"gl_TileOffsetQCOM\",        1, &E_GL_QCOM_tile_shading);\n            symbolTable.setVariableExtensions(\"gl_TileDimensionQCOM\",     1, &E_GL_QCOM_tile_shading);\n            symbolTable.setVariableExtensions(\"gl_TileApronSizeQCOM\",     1, &E_GL_QCOM_tile_shading);\n        }\n        break;\n\n    case EShLangCompute:\n        BuiltInVariable(\"gl_NumWorkGroups\",         EbvNumWorkGroups,        symbolTable);\n        BuiltInVariable(\"gl_WorkGroupSize\",         EbvWorkGroupSize,        symbolTable);\n        BuiltInVariable(\"gl_WorkGroupID\",           EbvWorkGroupId,          symbolTable);\n        BuiltInVariable(\"gl_LocalInvocationID\",     EbvLocalInvocationId,    symbolTable);\n        BuiltInVariable(\"gl_GlobalInvocationID\",    EbvGlobalInvocationId,   symbolTable);\n        BuiltInVariable(\"gl_LocalInvocationIndex\",  EbvLocalInvocationIndex, symbolTable);\n        BuiltInVariable(\"gl_DeviceIndex\",           EbvDeviceIndex,          symbolTable);\n        BuiltInVariable(\"gl_ViewIndex\",             EbvViewIndex,            symbolTable);\n\n        if ((profile != EEsProfile && version >= 140) ||\n            (profile == EEsProfile && version >= 310)) {\n            symbolTable.setVariableExtensions(\"gl_DeviceIndex\",  1, &E_GL_EXT_device_group);\n            symbolTable.setVariableExtensions(\"gl_ViewIndex\",    1, &E_GL_EXT_multiview);\n        }\n\n        if (profile != EEsProfile && version < 430) {\n            symbolTable.setVariableExtensions(\"gl_NumWorkGroups\",        1, &E_GL_ARB_compute_shader);\n            symbolTable.setVariableExtensions(\"gl_WorkGroupSize\",        1, &E_GL_ARB_compute_shader);\n            symbolTable.setVariableExtensions(\"gl_WorkGroupID\",          1, &E_GL_ARB_compute_shader);\n            symbolTable.setVariableExtensions(\"gl_LocalInvocationID\",    1, &E_GL_ARB_compute_shader);\n            symbolTable.setVariableExtensions(\"gl_GlobalInvocationID\",   1, &E_GL_ARB_compute_shader);\n            symbolTable.setVariableExtensions(\"gl_LocalInvocationIndex\", 1, &E_GL_ARB_compute_shader);\n\n            symbolTable.setVariableExtensions(\"gl_MaxComputeWorkGroupCount\",       1, &E_GL_ARB_compute_shader);\n            symbolTable.setVariableExtensions(\"gl_MaxComputeWorkGroupSize\",        1, &E_GL_ARB_compute_shader);\n            symbolTable.setVariableExtensions(\"gl_MaxComputeUniformComponents\",    1, &E_GL_ARB_compute_shader);\n            symbolTable.setVariableExtensions(\"gl_MaxComputeTextureImageUnits\",    1, &E_GL_ARB_compute_shader);\n            symbolTable.setVariableExtensions(\"gl_MaxComputeImageUniforms\",        1, &E_GL_ARB_compute_shader);\n            symbolTable.setVariableExtensions(\"gl_MaxComputeAtomicCounters\",       1, &E_GL_ARB_compute_shader);\n            symbolTable.setVariableExtensions(\"gl_MaxComputeAtomicCounterBuffers\", 1, &E_GL_ARB_compute_shader);\n\n            symbolTable.setFunctionExtensions(\"barrier\",                    1, &E_GL_ARB_compute_shader);\n            symbolTable.setFunctionExtensions(\"memoryBarrierAtomicCounter\", 1, &E_GL_ARB_compute_shader);\n            symbolTable.setFunctionExtensions(\"memoryBarrierBuffer\",        1, &E_GL_ARB_compute_shader);\n            symbolTable.setFunctionExtensions(\"memoryBarrierImage\",         1, &E_GL_ARB_compute_shader);\n            symbolTable.setFunctionExtensions(\"memoryBarrierShared\",        1, &E_GL_ARB_compute_shader);\n            symbolTable.setFunctionExtensions(\"groupMemoryBarrier\",         1, &E_GL_ARB_compute_shader);\n        }\n\n\n        symbolTable.setFunctionExtensions(\"controlBarrier\",                 1, &E_GL_KHR_memory_scope_semantics);\n        symbolTable.setFunctionExtensions(\"debugPrintfEXT\",                 1, &E_GL_EXT_debug_printf);\n\n        // GL_ARB_shader_ballot\n        if (profile != EEsProfile) {\n            symbolTable.setVariableExtensions(\"gl_SubGroupSizeARB\",       1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupInvocationARB\", 1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupEqMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupGeMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupGtMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupLeMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupLtMaskARB\",     1, &E_GL_ARB_shader_ballot);\n\n            BuiltInVariable(\"gl_SubGroupInvocationARB\", EbvSubGroupInvocation, symbolTable);\n            BuiltInVariable(\"gl_SubGroupEqMaskARB\",     EbvSubGroupEqMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupGeMaskARB\",     EbvSubGroupGeMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupGtMaskARB\",     EbvSubGroupGtMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupLeMaskARB\",     EbvSubGroupLeMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupLtMaskARB\",     EbvSubGroupLtMask,     symbolTable);\n\n            if (spvVersion.vulkan > 0) {\n                // Treat \"gl_SubGroupSizeARB\" as shader input instead of uniform for Vulkan\n                SpecialQualifier(\"gl_SubGroupSizeARB\", EvqVaryingIn, EbvSubGroupSize, symbolTable);\n                if (language == EShLangFragment)\n                    ModifyFlatDecoration(\"gl_SubGroupSizeARB\", true, symbolTable);\n            }\n            else\n                BuiltInVariable(\"gl_SubGroupSizeARB\", EbvSubGroupSize, symbolTable);\n        }\n\n        // GL_KHR_shader_subgroup\n        if ((profile == EEsProfile && version >= 310) ||\n            (profile != EEsProfile && version >= 140)) {\n            symbolTable.setVariableExtensions(\"gl_SubgroupSize\",         1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setVariableExtensions(\"gl_SubgroupInvocationID\", 1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setVariableExtensions(\"gl_SubgroupEqMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupGeMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupGtMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupLeMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupLtMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n\n            BuiltInVariable(\"gl_SubgroupSize\",         EbvSubgroupSize2,       symbolTable);\n            BuiltInVariable(\"gl_SubgroupInvocationID\", EbvSubgroupInvocation2, symbolTable);\n            BuiltInVariable(\"gl_SubgroupEqMask\",       EbvSubgroupEqMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupGeMask\",       EbvSubgroupGeMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupGtMask\",       EbvSubgroupGtMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupLeMask\",       EbvSubgroupLeMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupLtMask\",       EbvSubgroupLtMask2,     symbolTable);\n\n            // GL_NV_shader_sm_builtins\n            symbolTable.setVariableExtensions(\"gl_WarpsPerSMNV\",         1, &E_GL_NV_shader_sm_builtins);\n            symbolTable.setVariableExtensions(\"gl_SMCountNV\",            1, &E_GL_NV_shader_sm_builtins);\n            symbolTable.setVariableExtensions(\"gl_WarpIDNV\",             1, &E_GL_NV_shader_sm_builtins);\n            symbolTable.setVariableExtensions(\"gl_SMIDNV\",               1, &E_GL_NV_shader_sm_builtins);\n            BuiltInVariable(\"gl_WarpsPerSMNV\",          EbvWarpsPerSM,      symbolTable);\n            BuiltInVariable(\"gl_SMCountNV\",             EbvSMCount,         symbolTable);\n            BuiltInVariable(\"gl_WarpIDNV\",              EbvWarpID,          symbolTable);\n            BuiltInVariable(\"gl_SMIDNV\",                EbvSMID,            symbolTable);\n\n            // GL_ARM_shader_core_builtins\n            symbolTable.setVariableExtensions(\"gl_CoreCountARM\", 1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_CoreIDARM\",    1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_CoreMaxIDARM\", 1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_WarpIDARM\",    1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_WarpMaxIDARM\", 1, &E_GL_ARM_shader_core_builtins);\n\n            BuiltInVariable(\"gl_CoreCountARM\", EbvCoreCountARM, symbolTable);\n            BuiltInVariable(\"gl_CoreIDARM\",    EbvCoreIDARM, symbolTable);\n            BuiltInVariable(\"gl_CoreMaxIDARM\", EbvCoreMaxIDARM, symbolTable);\n            BuiltInVariable(\"gl_WarpIDARM\",    EbvWarpIDARM, symbolTable);\n            BuiltInVariable(\"gl_WarpMaxIDARM\", EbvWarpMaxIDARM, symbolTable);\n        }\n\n        // GL_KHR_shader_subgroup\n        if ((profile == EEsProfile && version >= 310) ||\n            (profile != EEsProfile && version >= 140)) {\n            symbolTable.setVariableExtensions(\"gl_NumSubgroups\", 1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setVariableExtensions(\"gl_SubgroupID\",   1, &E_GL_KHR_shader_subgroup_basic);\n\n            BuiltInVariable(\"gl_NumSubgroups\", EbvNumSubgroups, symbolTable);\n            BuiltInVariable(\"gl_SubgroupID\",   EbvSubgroupID,   symbolTable);\n\n            symbolTable.setFunctionExtensions(\"subgroupMemoryBarrierShared\", 1, &E_GL_KHR_shader_subgroup_basic);\n        }\n\n        {\n            const char *coopExt[2] = { E_GL_NV_cooperative_matrix, E_GL_NV_integer_cooperative_matrix };\n            symbolTable.setFunctionExtensions(\"coopMatLoadNV\",   2, coopExt);\n            symbolTable.setFunctionExtensions(\"coopMatStoreNV\",  2, coopExt);\n            symbolTable.setFunctionExtensions(\"coopMatMulAddNV\", 2, coopExt);\n        }\n\n        {\n            symbolTable.setFunctionExtensions(\"coopMatLoad\",   1, &E_GL_KHR_cooperative_matrix);\n            symbolTable.setFunctionExtensions(\"coopMatStore\",  1, &E_GL_KHR_cooperative_matrix);\n            symbolTable.setFunctionExtensions(\"coopMatMulAdd\", 1, &E_GL_KHR_cooperative_matrix);\n\n            symbolTable.setFunctionExtensions(\"coopMatReduceNV\",   1, &E_GL_NV_cooperative_matrix2);\n            symbolTable.setFunctionExtensions(\"coopMatPerElementNV\",  1, &E_GL_NV_cooperative_matrix2);\n            symbolTable.setFunctionExtensions(\"coopMatTransposeNV\",   1, &E_GL_NV_cooperative_matrix2);\n            \n            symbolTable.setFunctionExtensions(\"createTensorLayoutNV\",           1, &E_GL_NV_cooperative_matrix2);\n            symbolTable.setFunctionExtensions(\"setTensorLayoutBlockSizeNV\",     1, &E_GL_NV_cooperative_matrix2);\n            symbolTable.setFunctionExtensions(\"setTensorLayoutDimensionNV\",     1, &E_GL_NV_cooperative_matrix2);\n            symbolTable.setFunctionExtensions(\"setTensorLayoutStrideNV\",        1, &E_GL_NV_cooperative_matrix2);\n            symbolTable.setFunctionExtensions(\"sliceTensorLayoutNV\",            1, &E_GL_NV_cooperative_matrix2);\n            symbolTable.setFunctionExtensions(\"setTensorLayoutClampValueNV\",    1, &E_GL_NV_cooperative_matrix2);\n\n            symbolTable.setFunctionExtensions(\"createTensorViewNV\",             1, &E_GL_NV_cooperative_matrix2);\n            symbolTable.setFunctionExtensions(\"setTensorViewDimensionsNV\",      1, &E_GL_NV_cooperative_matrix2);\n            symbolTable.setFunctionExtensions(\"setTensorViewStrideNV\",          1, &E_GL_NV_cooperative_matrix2);\n            symbolTable.setFunctionExtensions(\"setTensorViewClipNV\",            1, &E_GL_NV_cooperative_matrix2);\n        }\n\n        {\n            symbolTable.setFunctionExtensions(\"coopVecMatMulNV\",                    1, &E_GL_NV_cooperative_vector);\n            symbolTable.setFunctionExtensions(\"coopVecMatMulAddNV\",                 1, &E_GL_NV_cooperative_vector);\n            symbolTable.setFunctionExtensions(\"coopVecOuterProductAccumulateNV\",    1, &E_GL_NV_cooperative_vector);\n            symbolTable.setFunctionExtensions(\"coopVecReduceSumAccumulateNV\",       1, &E_GL_NV_cooperative_vector);\n        }\n\n        if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {\n            symbolTable.setFunctionExtensions(\"dFdx\",                   1, &E_GL_NV_compute_shader_derivatives);\n            symbolTable.setFunctionExtensions(\"dFdy\",                   1, &E_GL_NV_compute_shader_derivatives);\n            symbolTable.setFunctionExtensions(\"fwidth\",                 1, &E_GL_NV_compute_shader_derivatives);\n            symbolTable.setFunctionExtensions(\"dFdxFine\",               1, &E_GL_NV_compute_shader_derivatives);\n            symbolTable.setFunctionExtensions(\"dFdyFine\",               1, &E_GL_NV_compute_shader_derivatives);\n            symbolTable.setFunctionExtensions(\"fwidthFine\",             1, &E_GL_NV_compute_shader_derivatives);\n            symbolTable.setFunctionExtensions(\"dFdxCoarse\",             1, &E_GL_NV_compute_shader_derivatives);\n            symbolTable.setFunctionExtensions(\"dFdyCoarse\",             1, &E_GL_NV_compute_shader_derivatives);\n            symbolTable.setFunctionExtensions(\"fwidthCoarse\",           1, &E_GL_NV_compute_shader_derivatives);\n        }\n\n        if ((profile == EEsProfile && version >= 310) ||\n            (profile != EEsProfile && version >= 450)) {\n            symbolTable.setVariableExtensions(\"gl_ShadingRateFlag2VerticalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n            symbolTable.setVariableExtensions(\"gl_ShadingRateFlag4VerticalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n            symbolTable.setVariableExtensions(\"gl_ShadingRateFlag2HorizontalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n            symbolTable.setVariableExtensions(\"gl_ShadingRateFlag4HorizontalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n        }\n\n        if ((profile != EEsProfile && version >= 460)) {\n            symbolTable.setFunctionExtensions(\"fetchMicroTriangleVertexPositionNV\", 1, &E_GL_NV_displacement_micromap);\n            symbolTable.setFunctionExtensions(\"fetchMicroTriangleVertexBarycentricNV\", 1, &E_GL_NV_displacement_micromap);\n        }\n\n        // GL_EXT_integer_dot_product\n        if ((profile == EEsProfile && version >= 300) ||\n            (profile != EEsProfile && version >= 450)) {\n            symbolTable.setFunctionExtensions(\"dotEXT\", 1, &E_GL_EXT_integer_dot_product);\n            symbolTable.setFunctionExtensions(\"dotPacked4x8EXT\", 1, &E_GL_EXT_integer_dot_product);\n            symbolTable.setFunctionExtensions(\"dotAccSatEXT\", 1, &E_GL_EXT_integer_dot_product);\n            symbolTable.setFunctionExtensions(\"dotPacked4x8AccSatEXT\", 1, &E_GL_EXT_integer_dot_product);\n        }\n\n        {\n            symbolTable.setFunctionExtensions(\"bfloat16BitsToIntEXT\", 1, &E_GL_EXT_bfloat16);\n            symbolTable.setFunctionExtensions(\"bfloat16BitsToUintEXT\", 1, &E_GL_EXT_bfloat16);\n            symbolTable.setFunctionExtensions(\"intBitsToBFloat16EXT\", 1, &E_GL_EXT_bfloat16);\n            symbolTable.setFunctionExtensions(\"uintBitsToBFloat16EXT\", 1, &E_GL_EXT_bfloat16);\n\n            symbolTable.setFunctionExtensions(\"floate5m2BitsToIntEXT\", 1, &E_GL_EXT_float_e5m2);\n            symbolTable.setFunctionExtensions(\"floate5m2BitsToUintEXT\", 1, &E_GL_EXT_float_e5m2);\n            symbolTable.setFunctionExtensions(\"intBitsToFloate5m2EXT\", 1, &E_GL_EXT_float_e5m2);\n            symbolTable.setFunctionExtensions(\"uintBitsToFloate5m2EXT\", 1, &E_GL_EXT_float_e5m2);\n\n            symbolTable.setFunctionExtensions(\"floate4m3BitsToIntEXT\", 1, &E_GL_EXT_float_e4m3);\n            symbolTable.setFunctionExtensions(\"floate4m3BitsToUintEXT\", 1, &E_GL_EXT_float_e4m3);\n            symbolTable.setFunctionExtensions(\"intBitsToFloate4m3EXT\", 1, &E_GL_EXT_float_e4m3);\n            symbolTable.setFunctionExtensions(\"uintBitsToFloate4m3EXT\", 1, &E_GL_EXT_float_e4m3);\n\n            const char *float8exts[] = {E_GL_EXT_float_e5m2, E_GL_EXT_float_e4m3};\n            symbolTable.setFunctionExtensions(\"saturatedConvertEXT\", 2, float8exts);\n        }\n\n        // E_SPV_QCOM_tile_shading\n        if ((profile == EEsProfile && version >= 310) ||\n            (profile != EEsProfile && version >= 460)) {\n            BuiltInVariable(\"gl_TileOffsetQCOM\",        EbvTileOffsetQCOM,      symbolTable);\n            BuiltInVariable(\"gl_TileDimensionQCOM\",     EbvTileDimensionQCOM,   symbolTable);\n            BuiltInVariable(\"gl_TileApronSizeQCOM\",     EbvTileApronSizeQCOM,   symbolTable);\n\n            symbolTable.setVariableExtensions(\"gl_TileOffsetQCOM\",        1, &E_GL_QCOM_tile_shading);\n            symbolTable.setVariableExtensions(\"gl_TileDimensionQCOM\",     1, &E_GL_QCOM_tile_shading);\n            symbolTable.setVariableExtensions(\"gl_TileApronSizeQCOM\",     1, &E_GL_QCOM_tile_shading);\n        }\n        break;\n\n    case EShLangRayGen:\n    case EShLangIntersect:\n    case EShLangAnyHit:\n    case EShLangClosestHit:\n    case EShLangMiss:\n    case EShLangCallable:\n        if (profile != EEsProfile && version >= 460) {\n            const char *rtexts[] = { E_GL_NV_ray_tracing, E_GL_EXT_ray_tracing };\n            symbolTable.setVariableExtensions(\"gl_LaunchIDNV\", 1, &E_GL_NV_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_LaunchIDEXT\", 1, &E_GL_EXT_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_LaunchSizeNV\", 1, &E_GL_NV_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_LaunchSizeEXT\", 1, &E_GL_EXT_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_PrimitiveID\", 2, rtexts);\n            symbolTable.setVariableExtensions(\"gl_InstanceID\", 2, rtexts);\n            symbolTable.setVariableExtensions(\"gl_InstanceCustomIndexNV\", 1, &E_GL_NV_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_InstanceCustomIndexEXT\", 1, &E_GL_EXT_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_GeometryIndexEXT\", 1, &E_GL_EXT_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_WorldRayOriginNV\", 1, &E_GL_NV_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_WorldRayOriginEXT\", 1, &E_GL_EXT_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_WorldRayDirectionNV\", 1, &E_GL_NV_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_WorldRayDirectionEXT\", 1, &E_GL_EXT_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_ObjectRayOriginNV\", 1, &E_GL_NV_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_ObjectRayOriginEXT\", 1, &E_GL_EXT_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_ObjectRayDirectionNV\", 1, &E_GL_NV_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_ObjectRayDirectionEXT\", 1, &E_GL_EXT_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_RayTminNV\", 1, &E_GL_NV_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_RayTminEXT\", 1, &E_GL_EXT_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_RayTmaxNV\", 1, &E_GL_NV_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_RayTmaxEXT\", 1, &E_GL_EXT_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_CullMaskEXT\", 1, &E_GL_EXT_ray_cull_mask);\n            symbolTable.setVariableExtensions(\"gl_HitTNV\", 1, &E_GL_NV_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_HitTEXT\", 1, &E_GL_EXT_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_HitKindNV\", 1, &E_GL_NV_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_HitKindEXT\", 1, &E_GL_EXT_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_ObjectToWorldNV\", 1, &E_GL_NV_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_ObjectToWorldEXT\", 1, &E_GL_EXT_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_ObjectToWorld3x4EXT\", 1, &E_GL_EXT_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_WorldToObjectNV\", 1, &E_GL_NV_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_WorldToObjectEXT\", 1, &E_GL_EXT_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_WorldToObject3x4EXT\", 1, &E_GL_EXT_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_IncomingRayFlagsNV\", 1, &E_GL_NV_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_IncomingRayFlagsEXT\", 1, &E_GL_EXT_ray_tracing);\n            symbolTable.setVariableExtensions(\"gl_CurrentRayTimeNV\", 1, &E_GL_NV_ray_tracing_motion_blur);\n            symbolTable.setVariableExtensions(\"gl_HitTriangleVertexPositionsEXT\", 1, &E_GL_EXT_ray_tracing_position_fetch);\n            symbolTable.setVariableExtensions(\"gl_HitMicroTriangleVertexPositionsNV\", 1, &E_GL_NV_displacement_micromap);\n            symbolTable.setVariableExtensions(\"gl_HitMicroTriangleVertexBarycentricsNV\", 1, &E_GL_NV_displacement_micromap);\n            symbolTable.setVariableExtensions(\"gl_ClusterIDNV\", 1, &E_GL_NV_cluster_acceleration_structure);\n            symbolTable.setVariableExtensions(\"gl_HitKindSphereNV\", 1, &E_GL_NV_linear_swept_spheres);\n            symbolTable.setVariableExtensions(\"gl_HitKindLSSNV\", 1, &E_GL_NV_linear_swept_spheres);\n            symbolTable.setVariableExtensions(\"gl_HitSpherePositionNV\", 1, &E_GL_NV_linear_swept_spheres);\n            symbolTable.setVariableExtensions(\"gl_HitSphereRadiusNV\", 1, &E_GL_NV_linear_swept_spheres);\n            symbolTable.setVariableExtensions(\"gl_HitLSSPositionNV\", 1, &E_GL_NV_linear_swept_spheres);\n            symbolTable.setVariableExtensions(\"gl_HitLSSRadiiNV\", 1, &E_GL_NV_linear_swept_spheres);\n\n            symbolTable.setVariableExtensions(\"gl_DeviceIndex\", 1, &E_GL_EXT_device_group);\n\n\n            symbolTable.setFunctionExtensions(\"traceNV\", 1, &E_GL_NV_ray_tracing);\n            symbolTable.setFunctionExtensions(\"traceRayMotionNV\", 1, &E_GL_NV_ray_tracing_motion_blur);\n            symbolTable.setFunctionExtensions(\"traceRayEXT\", 1, &E_GL_EXT_ray_tracing);\n            symbolTable.setFunctionExtensions(\"reportIntersectionNV\", 1, &E_GL_NV_ray_tracing);\n            symbolTable.setFunctionExtensions(\"reportIntersectionEXT\", 1, &E_GL_EXT_ray_tracing);\n            symbolTable.setFunctionExtensions(\"ignoreIntersectionNV\", 1, &E_GL_NV_ray_tracing);\n            symbolTable.setFunctionExtensions(\"terminateRayNV\", 1, &E_GL_NV_ray_tracing);\n            symbolTable.setFunctionExtensions(\"executeCallableNV\", 1, &E_GL_NV_ray_tracing);\n            symbolTable.setFunctionExtensions(\"executeCallableEXT\", 1, &E_GL_EXT_ray_tracing);\n\n            symbolTable.setFunctionExtensions(\"hitObjectTraceRayNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectTraceRayMotionNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectRecordHitNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectRecordHitMotionNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectRecordHitWithIndexNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectRecordHitWithIndexMotionNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectRecordMissNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectRecordMissMotionNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectRecordEmptyNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectExecuteShaderNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectIsEmptyNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectIsMissNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectIsHitNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectGetRayTMinNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectGetRayTMaxNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectGetObjectRayOriginNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectGetObjectRayDirectionNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectGetWorldRayOriginNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectGetWorldRayDirectionNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectGetWorldToObjectNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectGetbjectToWorldNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectGetInstanceCustomIndexNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectGetInstanceIdNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectGetGeometryIndexNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectGetPrimitiveIndexNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectGetHitKindNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectGetAttributesNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectGetCurrentTimeNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectGetShaderBindingTableRecordIndexNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectGetShaderRecordBufferHandleNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"hitObjectGetClusterIdNV\", 1, &E_GL_NV_cluster_acceleration_structure);\n            symbolTable.setFunctionExtensions(\"reorderThreadNV\", 1, &E_GL_NV_shader_invocation_reorder);\n            symbolTable.setFunctionExtensions(\"fetchMicroTriangleVertexPositionNV\", 1, &E_GL_NV_displacement_micromap);\n            symbolTable.setFunctionExtensions(\"fetchMicroTriangleVertexBarycentricNV\", 1, &E_GL_NV_displacement_micromap);\n            symbolTable.setFunctionExtensions(\"hitObjectGetSpherePositionNV\", 1, &E_GL_NV_linear_swept_spheres);\n            symbolTable.setFunctionExtensions(\"hitObjectGetSphereRadiusNV\", 1, &E_GL_NV_linear_swept_spheres);\n            symbolTable.setFunctionExtensions(\"hitObjectGetLSSPositionsNV\", 1, &E_GL_NV_linear_swept_spheres);\n            symbolTable.setFunctionExtensions(\"hitObjectGetLSSRadiiNV\", 1, &E_GL_NV_linear_swept_spheres);\n            symbolTable.setFunctionExtensions(\"hitObjectIsSphereHitNV\", 1, &E_GL_NV_linear_swept_spheres);\n            symbolTable.setFunctionExtensions(\"hitObjectIsLSSHitNV\", 1, &E_GL_NV_linear_swept_spheres);\n\n\n            BuiltInVariable(\"gl_LaunchIDNV\",             EbvLaunchId,           symbolTable);\n            BuiltInVariable(\"gl_LaunchIDEXT\",            EbvLaunchId,           symbolTable);\n            BuiltInVariable(\"gl_LaunchSizeNV\",           EbvLaunchSize,         symbolTable);\n            BuiltInVariable(\"gl_LaunchSizeEXT\",          EbvLaunchSize,         symbolTable);\n            BuiltInVariable(\"gl_PrimitiveID\",            EbvPrimitiveId,        symbolTable);\n            BuiltInVariable(\"gl_InstanceID\",             EbvInstanceId,         symbolTable);\n            BuiltInVariable(\"gl_InstanceCustomIndexNV\",  EbvInstanceCustomIndex,symbolTable);\n            BuiltInVariable(\"gl_InstanceCustomIndexEXT\", EbvInstanceCustomIndex,symbolTable);\n            BuiltInVariable(\"gl_GeometryIndexEXT\",       EbvGeometryIndex,      symbolTable);\n            BuiltInVariable(\"gl_WorldRayOriginNV\",       EbvWorldRayOrigin,     symbolTable);\n            BuiltInVariable(\"gl_WorldRayOriginEXT\",      EbvWorldRayOrigin,     symbolTable);\n            BuiltInVariable(\"gl_WorldRayDirectionNV\",    EbvWorldRayDirection,  symbolTable);\n            BuiltInVariable(\"gl_WorldRayDirectionEXT\",   EbvWorldRayDirection,  symbolTable);\n            BuiltInVariable(\"gl_ObjectRayOriginNV\",      EbvObjectRayOrigin,    symbolTable);\n            BuiltInVariable(\"gl_ObjectRayOriginEXT\",     EbvObjectRayOrigin,    symbolTable);\n            BuiltInVariable(\"gl_ObjectRayDirectionNV\",   EbvObjectRayDirection, symbolTable);\n            BuiltInVariable(\"gl_ObjectRayDirectionEXT\",  EbvObjectRayDirection, symbolTable);\n            BuiltInVariable(\"gl_RayTminNV\",              EbvRayTmin,            symbolTable);\n            BuiltInVariable(\"gl_RayTminEXT\",             EbvRayTmin,            symbolTable);\n            BuiltInVariable(\"gl_RayTmaxNV\",              EbvRayTmax,            symbolTable);\n            BuiltInVariable(\"gl_RayTmaxEXT\",             EbvRayTmax,            symbolTable);\n            BuiltInVariable(\"gl_CullMaskEXT\",            EbvCullMask,           symbolTable);\n            BuiltInVariable(\"gl_HitKindNV\",              EbvHitKind,            symbolTable);\n            BuiltInVariable(\"gl_HitKindEXT\",             EbvHitKind,            symbolTable);\n            BuiltInVariable(\"gl_ObjectToWorldNV\",        EbvObjectToWorld,      symbolTable);\n            BuiltInVariable(\"gl_ObjectToWorldEXT\",       EbvObjectToWorld,      symbolTable);\n            BuiltInVariable(\"gl_ObjectToWorld3x4EXT\",    EbvObjectToWorld3x4,   symbolTable);\n            BuiltInVariable(\"gl_WorldToObjectNV\",        EbvWorldToObject,      symbolTable);\n            BuiltInVariable(\"gl_WorldToObjectEXT\",       EbvWorldToObject,      symbolTable);\n            BuiltInVariable(\"gl_WorldToObject3x4EXT\",    EbvWorldToObject3x4,   symbolTable);\n            BuiltInVariable(\"gl_IncomingRayFlagsNV\",     EbvIncomingRayFlags,   symbolTable);\n            BuiltInVariable(\"gl_IncomingRayFlagsEXT\",    EbvIncomingRayFlags,   symbolTable);\n            BuiltInVariable(\"gl_DeviceIndex\",            EbvDeviceIndex,        symbolTable);\n            BuiltInVariable(\"gl_CurrentRayTimeNV\",       EbvCurrentRayTimeNV,   symbolTable);\n            BuiltInVariable(\"gl_HitTriangleVertexPositionsEXT\", EbvPositionFetch, symbolTable);\n            BuiltInVariable(\"gl_HitMicroTriangleVertexPositionsNV\", EbvMicroTrianglePositionNV, symbolTable);\n            BuiltInVariable(\"gl_HitMicroTriangleVertexBarycentricsNV\", EbvMicroTriangleBaryNV, symbolTable);\n            BuiltInVariable(\"gl_HitKindFrontFacingMicroTriangleNV\", EbvHitKindFrontFacingMicroTriangleNV, symbolTable);\n            BuiltInVariable(\"gl_HitKindBackFacingMicroTriangleNV\", EbvHitKindBackFacingMicroTriangleNV, symbolTable);\n            BuiltInVariable(\"gl_ClusterIDNV\",            EbvClusterIDNV,         symbolTable);\n            BuiltInVariable(\"gl_HitIsSphereNV\", EbvHitIsSphereNV, symbolTable);\n            BuiltInVariable(\"gl_HitIsLSSNV\", EbvHitIsLSSNV, symbolTable);\n            BuiltInVariable(\"gl_HitSpherePositionNV\", EbvHitSpherePositionNV, symbolTable);\n            BuiltInVariable(\"gl_HitSphereRadiusNV\", EbvHitSphereRadiusNV, symbolTable);\n            BuiltInVariable(\"gl_HitLSSPositionsNV\", EbvHitLSSPositionsNV, symbolTable);\n            BuiltInVariable(\"gl_HitLSSRadiiNV\", EbvHitLSSRadiiNV, symbolTable);\n\n            // gl_HitT variables are aliases of their gl_RayTmax counterparts.\n            RetargetVariable(\"gl_HitTNV\",                \"gl_RayTmaxNV\",        symbolTable);\n            RetargetVariable(\"gl_HitTEXT\",               \"gl_RayTmaxEXT\",       symbolTable);\n\n            // GL_ARB_shader_ballot\n            symbolTable.setVariableExtensions(\"gl_SubGroupSizeARB\",       1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupInvocationARB\", 1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupEqMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupGeMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupGtMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupLeMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupLtMaskARB\",     1, &E_GL_ARB_shader_ballot);\n\n            BuiltInVariable(\"gl_SubGroupInvocationARB\", EbvSubGroupInvocation, symbolTable);\n            BuiltInVariable(\"gl_SubGroupEqMaskARB\",     EbvSubGroupEqMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupGeMaskARB\",     EbvSubGroupGeMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupGtMaskARB\",     EbvSubGroupGtMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupLeMaskARB\",     EbvSubGroupLeMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupLtMaskARB\",     EbvSubGroupLtMask,     symbolTable);\n\n            if (spvVersion.vulkan > 0) {\n                // Treat \"gl_SubGroupSizeARB\" as shader input instead of uniform for Vulkan\n                SpecialQualifier(\"gl_SubGroupSizeARB\", EvqVaryingIn, EbvSubGroupSize, symbolTable);\n                if (language == EShLangFragment)\n                    ModifyFlatDecoration(\"gl_SubGroupSizeARB\", true, symbolTable);\n            }\n            else\n                BuiltInVariable(\"gl_SubGroupSizeARB\", EbvSubGroupSize, symbolTable);\n\n            // GL_KHR_shader_subgroup\n            symbolTable.setVariableExtensions(\"gl_NumSubgroups\",         1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setVariableExtensions(\"gl_SubgroupID\",           1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setVariableExtensions(\"gl_SubgroupSize\",         1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setVariableExtensions(\"gl_SubgroupInvocationID\", 1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setVariableExtensions(\"gl_SubgroupEqMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupGeMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupGtMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupLeMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupLtMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n\n            BuiltInVariable(\"gl_NumSubgroups\",         EbvNumSubgroups,        symbolTable);\n            BuiltInVariable(\"gl_SubgroupID\",           EbvSubgroupID,          symbolTable);\n            BuiltInVariable(\"gl_SubgroupSize\",         EbvSubgroupSize2,       symbolTable);\n            BuiltInVariable(\"gl_SubgroupInvocationID\", EbvSubgroupInvocation2, symbolTable);\n            BuiltInVariable(\"gl_SubgroupEqMask\",       EbvSubgroupEqMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupGeMask\",       EbvSubgroupGeMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupGtMask\",       EbvSubgroupGtMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupLeMask\",       EbvSubgroupLeMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupLtMask\",       EbvSubgroupLtMask2,     symbolTable);\n\n            // GL_NV_shader_sm_builtins\n            symbolTable.setVariableExtensions(\"gl_WarpsPerSMNV\",         1, &E_GL_NV_shader_sm_builtins);\n            symbolTable.setVariableExtensions(\"gl_SMCountNV\",            1, &E_GL_NV_shader_sm_builtins);\n            symbolTable.setVariableExtensions(\"gl_WarpIDNV\",             1, &E_GL_NV_shader_sm_builtins);\n            symbolTable.setVariableExtensions(\"gl_SMIDNV\",               1, &E_GL_NV_shader_sm_builtins);\n            BuiltInVariable(\"gl_WarpsPerSMNV\",          EbvWarpsPerSM,      symbolTable);\n            BuiltInVariable(\"gl_SMCountNV\",             EbvSMCount,         symbolTable);\n            BuiltInVariable(\"gl_WarpIDNV\",              EbvWarpID,          symbolTable);\n            BuiltInVariable(\"gl_SMIDNV\",                EbvSMID,            symbolTable);\n\n            // GL_ARM_shader_core_builtins\n            symbolTable.setVariableExtensions(\"gl_CoreCountARM\", 1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_CoreIDARM\",    1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_CoreMaxIDARM\", 1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_WarpIDARM\",    1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_WarpMaxIDARM\", 1, &E_GL_ARM_shader_core_builtins);\n\n            BuiltInVariable(\"gl_CoreCountARM\", EbvCoreCountARM, symbolTable);\n            BuiltInVariable(\"gl_CoreIDARM\",    EbvCoreIDARM, symbolTable);\n            BuiltInVariable(\"gl_CoreMaxIDARM\", EbvCoreMaxIDARM, symbolTable);\n            BuiltInVariable(\"gl_WarpIDARM\",    EbvWarpIDARM, symbolTable);\n            BuiltInVariable(\"gl_WarpMaxIDARM\", EbvWarpMaxIDARM, symbolTable);\n        }\n        if ((profile == EEsProfile && version >= 310) ||\n            (profile != EEsProfile && version >= 450)) {\n            symbolTable.setVariableExtensions(\"gl_ShadingRateFlag2VerticalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n            symbolTable.setVariableExtensions(\"gl_ShadingRateFlag4VerticalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n            symbolTable.setVariableExtensions(\"gl_ShadingRateFlag2HorizontalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n            symbolTable.setVariableExtensions(\"gl_ShadingRateFlag4HorizontalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n        }\n        break;\n\n    case EShLangMesh:\n        if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {\n            // per-vertex builtins\n            symbolTable.setVariableExtensions(\"gl_MeshVerticesNV\", \"gl_Position\",     1, &E_GL_NV_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_MeshVerticesNV\", \"gl_PointSize\",    1, &E_GL_NV_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_MeshVerticesNV\", \"gl_ClipDistance\", 1, &E_GL_NV_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_MeshVerticesNV\", \"gl_CullDistance\", 1, &E_GL_NV_mesh_shader);\n\n            BuiltInVariable(\"gl_MeshVerticesNV\", \"gl_Position\",     EbvPosition,     symbolTable);\n            BuiltInVariable(\"gl_MeshVerticesNV\", \"gl_PointSize\",    EbvPointSize,    symbolTable);\n            BuiltInVariable(\"gl_MeshVerticesNV\", \"gl_ClipDistance\", EbvClipDistance, symbolTable);\n            BuiltInVariable(\"gl_MeshVerticesNV\", \"gl_CullDistance\", EbvCullDistance, symbolTable);\n\n            symbolTable.setVariableExtensions(\"gl_MeshVerticesNV\", \"gl_PositionPerViewNV\",     1, &E_GL_NV_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_MeshVerticesNV\", \"gl_ClipDistancePerViewNV\", 1, &E_GL_NV_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_MeshVerticesNV\", \"gl_CullDistancePerViewNV\", 1, &E_GL_NV_mesh_shader);\n\n            BuiltInVariable(\"gl_MeshVerticesNV\", \"gl_PositionPerViewNV\",     EbvPositionPerViewNV,     symbolTable);\n            BuiltInVariable(\"gl_MeshVerticesNV\", \"gl_ClipDistancePerViewNV\", EbvClipDistancePerViewNV, symbolTable);\n            BuiltInVariable(\"gl_MeshVerticesNV\", \"gl_CullDistancePerViewNV\", EbvCullDistancePerViewNV, symbolTable);\n\n            // per-primitive builtins\n            symbolTable.setVariableExtensions(\"gl_MeshPrimitivesNV\", \"gl_PrimitiveID\",   1, &E_GL_NV_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_MeshPrimitivesNV\", \"gl_Layer\",         1, &E_GL_NV_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_MeshPrimitivesNV\", \"gl_ViewportIndex\", 1, &E_GL_NV_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_MeshPrimitivesNV\", \"gl_ViewportMask\",  1, &E_GL_NV_mesh_shader);\n\n            BuiltInVariable(\"gl_MeshPrimitivesNV\", \"gl_PrimitiveID\",   EbvPrimitiveId,    symbolTable);\n            BuiltInVariable(\"gl_MeshPrimitivesNV\", \"gl_Layer\",         EbvLayer,          symbolTable);\n            BuiltInVariable(\"gl_MeshPrimitivesNV\", \"gl_ViewportIndex\", EbvViewportIndex,  symbolTable);\n            BuiltInVariable(\"gl_MeshPrimitivesNV\", \"gl_ViewportMask\",  EbvViewportMaskNV, symbolTable);\n\n            // per-view per-primitive builtins\n            symbolTable.setVariableExtensions(\"gl_MeshPrimitivesNV\", \"gl_LayerPerViewNV\",        1, &E_GL_NV_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_MeshPrimitivesNV\", \"gl_ViewportMaskPerViewNV\", 1, &E_GL_NV_mesh_shader);\n\n            BuiltInVariable(\"gl_MeshPrimitivesNV\", \"gl_LayerPerViewNV\",        EbvLayerPerViewNV,        symbolTable);\n            BuiltInVariable(\"gl_MeshPrimitivesNV\", \"gl_ViewportMaskPerViewNV\", EbvViewportMaskPerViewNV, symbolTable);\n\n            // other builtins\n            symbolTable.setVariableExtensions(\"gl_PrimitiveCountNV\",     1, &E_GL_NV_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_PrimitiveIndicesNV\",   1, &E_GL_NV_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_MeshViewCountNV\",      1, &E_GL_NV_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_MeshViewIndicesNV\",    1, &E_GL_NV_mesh_shader);\n            if (profile != EEsProfile) {\n                symbolTable.setVariableExtensions(\"gl_WorkGroupSize\",        Num_AEP_mesh_shader, AEP_mesh_shader);\n                symbolTable.setVariableExtensions(\"gl_WorkGroupID\",          Num_AEP_mesh_shader, AEP_mesh_shader);\n                symbolTable.setVariableExtensions(\"gl_LocalInvocationID\",    Num_AEP_mesh_shader, AEP_mesh_shader);\n                symbolTable.setVariableExtensions(\"gl_GlobalInvocationID\",   Num_AEP_mesh_shader, AEP_mesh_shader);\n                symbolTable.setVariableExtensions(\"gl_LocalInvocationIndex\", Num_AEP_mesh_shader, AEP_mesh_shader);\n            } else {\n                symbolTable.setVariableExtensions(\"gl_WorkGroupSize\",        1, &E_GL_NV_mesh_shader);\n                symbolTable.setVariableExtensions(\"gl_WorkGroupID\",          1, &E_GL_NV_mesh_shader);\n                symbolTable.setVariableExtensions(\"gl_LocalInvocationID\",    1, &E_GL_NV_mesh_shader);\n                symbolTable.setVariableExtensions(\"gl_GlobalInvocationID\",   1, &E_GL_NV_mesh_shader);\n                symbolTable.setVariableExtensions(\"gl_LocalInvocationIndex\", 1, &E_GL_NV_mesh_shader);\n            }\n            BuiltInVariable(\"gl_PrimitiveCountNV\",     EbvPrimitiveCountNV,     symbolTable);\n            BuiltInVariable(\"gl_PrimitiveIndicesNV\",   EbvPrimitiveIndicesNV,   symbolTable);\n            BuiltInVariable(\"gl_MeshViewCountNV\",      EbvMeshViewCountNV,      symbolTable);\n            BuiltInVariable(\"gl_MeshViewIndicesNV\",    EbvMeshViewIndicesNV,    symbolTable);\n            BuiltInVariable(\"gl_WorkGroupSize\",        EbvWorkGroupSize,        symbolTable);\n            BuiltInVariable(\"gl_WorkGroupID\",          EbvWorkGroupId,          symbolTable);\n            BuiltInVariable(\"gl_LocalInvocationID\",    EbvLocalInvocationId,    symbolTable);\n            BuiltInVariable(\"gl_GlobalInvocationID\",   EbvGlobalInvocationId,   symbolTable);\n            BuiltInVariable(\"gl_LocalInvocationIndex\", EbvLocalInvocationIndex, symbolTable);\n\n            // builtin constants\n            symbolTable.setVariableExtensions(\"gl_MaxMeshOutputVerticesNV\",   1, &E_GL_NV_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_MaxMeshOutputPrimitivesNV\", 1, &E_GL_NV_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_MaxMeshWorkGroupSizeNV\",    1, &E_GL_NV_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_MaxMeshViewCountNV\",        1, &E_GL_NV_mesh_shader);\n\n            // builtin functions\n            if (profile != EEsProfile) {\n                symbolTable.setFunctionExtensions(\"barrier\",                      Num_AEP_mesh_shader, AEP_mesh_shader);\n                symbolTable.setFunctionExtensions(\"memoryBarrierShared\",          Num_AEP_mesh_shader, AEP_mesh_shader);\n                symbolTable.setFunctionExtensions(\"groupMemoryBarrier\",           Num_AEP_mesh_shader, AEP_mesh_shader);\n            } else {\n                symbolTable.setFunctionExtensions(\"barrier\",                      1, &E_GL_NV_mesh_shader);\n                symbolTable.setFunctionExtensions(\"memoryBarrierShared\",          1, &E_GL_NV_mesh_shader);\n                symbolTable.setFunctionExtensions(\"groupMemoryBarrier\",           1, &E_GL_NV_mesh_shader);\n            }\n            symbolTable.setFunctionExtensions(\"writePackedPrimitiveIndices4x8NV\",  1, &E_GL_NV_mesh_shader);\n        }\n\n        if (profile != EEsProfile && version >= 450) {\n            // GL_EXT_Mesh_shader\n            symbolTable.setVariableExtensions(\"gl_PrimitivePointIndicesEXT\",    1, &E_GL_EXT_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_PrimitiveLineIndicesEXT\",     1, &E_GL_EXT_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_PrimitiveTriangleIndicesEXT\", 1, &E_GL_EXT_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_NumWorkGroups\",               1, &E_GL_EXT_mesh_shader);\n\n            BuiltInVariable(\"gl_PrimitivePointIndicesEXT\",    EbvPrimitivePointIndicesEXT,    symbolTable);\n            BuiltInVariable(\"gl_PrimitiveLineIndicesEXT\",     EbvPrimitiveLineIndicesEXT,     symbolTable);\n            BuiltInVariable(\"gl_PrimitiveTriangleIndicesEXT\", EbvPrimitiveTriangleIndicesEXT, symbolTable);\n            BuiltInVariable(\"gl_NumWorkGroups\",        EbvNumWorkGroups,        symbolTable);\n\n            symbolTable.setVariableExtensions(\"gl_MeshVerticesEXT\", \"gl_Position\",     1, &E_GL_EXT_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_MeshVerticesEXT\", \"gl_PointSize\",    1, &E_GL_EXT_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_MeshVerticesEXT\", \"gl_ClipDistance\", 1, &E_GL_EXT_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_MeshVerticesEXT\", \"gl_CullDistance\", 1, &E_GL_EXT_mesh_shader);\n            \n            BuiltInVariable(\"gl_MeshVerticesEXT\", \"gl_Position\",     EbvPosition,     symbolTable);\n            BuiltInVariable(\"gl_MeshVerticesEXT\", \"gl_PointSize\",    EbvPointSize,    symbolTable);\n            BuiltInVariable(\"gl_MeshVerticesEXT\", \"gl_ClipDistance\", EbvClipDistance, symbolTable);\n            BuiltInVariable(\"gl_MeshVerticesEXT\", \"gl_CullDistance\", EbvCullDistance, symbolTable);\n            \n            symbolTable.setVariableExtensions(\"gl_MeshPrimitivesEXT\", \"gl_PrimitiveID\",             1, &E_GL_EXT_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_MeshPrimitivesEXT\", \"gl_Layer\",                   1, &E_GL_EXT_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_MeshPrimitivesEXT\", \"gl_ViewportIndex\",           1, &E_GL_EXT_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_MeshPrimitivesEXT\", \"gl_CullPrimitiveEXT\",        1, &E_GL_EXT_mesh_shader);\n\n            // note: technically this member requires both GL_EXT_mesh_shader and GL_EXT_fragment_shading_rate\n            // since setVariableExtensions only needs *one of* the extensions to validate, it's more useful to specify EXT_fragment_shading_rate\n            // GL_EXT_mesh_shader will be required in practice by use of other fields of gl_MeshPrimitivesEXT\n            symbolTable.setVariableExtensions(\"gl_MeshPrimitivesEXT\", \"gl_PrimitiveShadingRateEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n\n            BuiltInVariable(\"gl_MeshPrimitivesEXT\", \"gl_PrimitiveID\",              EbvPrimitiveId,    symbolTable);\n            BuiltInVariable(\"gl_MeshPrimitivesEXT\", \"gl_Layer\",                    EbvLayer,          symbolTable);\n            BuiltInVariable(\"gl_MeshPrimitivesEXT\", \"gl_ViewportIndex\",            EbvViewportIndex,  symbolTable);\n            BuiltInVariable(\"gl_MeshPrimitivesEXT\", \"gl_CullPrimitiveEXT\",         EbvCullPrimitiveEXT, symbolTable);\n            BuiltInVariable(\"gl_MeshPrimitivesEXT\", \"gl_PrimitiveShadingRateEXT\",  EbvPrimitiveShadingRateKHR, symbolTable);\n\n            symbolTable.setFunctionExtensions(\"SetMeshOutputsEXT\",  1, &E_GL_EXT_mesh_shader);\n\n            // GL_EXT_device_group\n            symbolTable.setVariableExtensions(\"gl_DeviceIndex\", 1, &E_GL_EXT_device_group);\n            BuiltInVariable(\"gl_DeviceIndex\", EbvDeviceIndex, symbolTable);\n\n            // GL_ARB_shader_draw_parameters\n            symbolTable.setVariableExtensions(\"gl_DrawIDARB\", 1, &E_GL_ARB_shader_draw_parameters);\n            BuiltInVariable(\"gl_DrawIDARB\", EbvDrawId, symbolTable);\n            if (version >= 460) {\n                BuiltInVariable(\"gl_DrawID\", EbvDrawId, symbolTable);\n            }\n            // GL_EXT_multiview\n            BuiltInVariable(\"gl_ViewIndex\", EbvViewIndex, symbolTable);\n            symbolTable.setVariableExtensions(\"gl_ViewIndex\", 1, &E_GL_EXT_multiview);\n\n            // GL_ARB_shader_ballot\n            symbolTable.setVariableExtensions(\"gl_SubGroupSizeARB\",       1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupInvocationARB\", 1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupEqMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupGeMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupGtMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupLeMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupLtMaskARB\",     1, &E_GL_ARB_shader_ballot);\n\n            BuiltInVariable(\"gl_SubGroupInvocationARB\", EbvSubGroupInvocation, symbolTable);\n            BuiltInVariable(\"gl_SubGroupEqMaskARB\",     EbvSubGroupEqMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupGeMaskARB\",     EbvSubGroupGeMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupGtMaskARB\",     EbvSubGroupGtMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupLeMaskARB\",     EbvSubGroupLeMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupLtMaskARB\",     EbvSubGroupLtMask,     symbolTable);\n\n            if (spvVersion.vulkan > 0) {\n                // Treat \"gl_SubGroupSizeARB\" as shader input instead of uniform for Vulkan\n                SpecialQualifier(\"gl_SubGroupSizeARB\", EvqVaryingIn, EbvSubGroupSize, symbolTable);\n                if (language == EShLangFragment)\n                    ModifyFlatDecoration(\"gl_SubGroupSizeARB\", true, symbolTable);\n            }\n            else\n                BuiltInVariable(\"gl_SubGroupSizeARB\", EbvSubGroupSize, symbolTable);\n        }\n\n        // GL_KHR_shader_subgroup\n        if ((profile == EEsProfile && version >= 310) ||\n            (profile != EEsProfile && version >= 140)) {\n            symbolTable.setVariableExtensions(\"gl_NumSubgroups\",         1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setVariableExtensions(\"gl_SubgroupID\",           1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setVariableExtensions(\"gl_SubgroupSize\",         1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setVariableExtensions(\"gl_SubgroupInvocationID\", 1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setVariableExtensions(\"gl_SubgroupEqMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupGeMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupGtMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupLeMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupLtMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n\n            BuiltInVariable(\"gl_NumSubgroups\",         EbvNumSubgroups,        symbolTable);\n            BuiltInVariable(\"gl_SubgroupID\",           EbvSubgroupID,          symbolTable);\n            BuiltInVariable(\"gl_SubgroupSize\",         EbvSubgroupSize2,       symbolTable);\n            BuiltInVariable(\"gl_SubgroupInvocationID\", EbvSubgroupInvocation2, symbolTable);\n            BuiltInVariable(\"gl_SubgroupEqMask\",       EbvSubgroupEqMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupGeMask\",       EbvSubgroupGeMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupGtMask\",       EbvSubgroupGtMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupLeMask\",       EbvSubgroupLeMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupLtMask\",       EbvSubgroupLtMask2,     symbolTable);\n\n            symbolTable.setFunctionExtensions(\"subgroupMemoryBarrierShared\", 1, &E_GL_KHR_shader_subgroup_basic);\n\n            // GL_NV_shader_sm_builtins\n            symbolTable.setVariableExtensions(\"gl_WarpsPerSMNV\",         1, &E_GL_NV_shader_sm_builtins);\n            symbolTable.setVariableExtensions(\"gl_SMCountNV\",            1, &E_GL_NV_shader_sm_builtins);\n            symbolTable.setVariableExtensions(\"gl_WarpIDNV\",             1, &E_GL_NV_shader_sm_builtins);\n            symbolTable.setVariableExtensions(\"gl_SMIDNV\",               1, &E_GL_NV_shader_sm_builtins);\n            BuiltInVariable(\"gl_WarpsPerSMNV\",          EbvWarpsPerSM,      symbolTable);\n            BuiltInVariable(\"gl_SMCountNV\",             EbvSMCount,         symbolTable);\n            BuiltInVariable(\"gl_WarpIDNV\",              EbvWarpID,          symbolTable);\n            BuiltInVariable(\"gl_SMIDNV\",                EbvSMID,            symbolTable);\n\n            // GL_ARM_shader_core_builtins\n            symbolTable.setVariableExtensions(\"gl_CoreCountARM\", 1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_CoreIDARM\",    1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_CoreMaxIDARM\", 1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_WarpIDARM\",    1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_WarpMaxIDARM\", 1, &E_GL_ARM_shader_core_builtins);\n\n            BuiltInVariable(\"gl_CoreCountARM\", EbvCoreCountARM, symbolTable);\n            BuiltInVariable(\"gl_CoreIDARM\",    EbvCoreIDARM, symbolTable);\n            BuiltInVariable(\"gl_CoreMaxIDARM\", EbvCoreMaxIDARM, symbolTable);\n            BuiltInVariable(\"gl_WarpIDARM\",    EbvWarpIDARM, symbolTable);\n            BuiltInVariable(\"gl_WarpMaxIDARM\", EbvWarpMaxIDARM, symbolTable);\n        }\n\n        if ((profile == EEsProfile && version >= 310) ||\n            (profile != EEsProfile && version >= 450)) {\n            symbolTable.setVariableExtensions(\"gl_ShadingRateFlag2VerticalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n            symbolTable.setVariableExtensions(\"gl_ShadingRateFlag4VerticalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n            symbolTable.setVariableExtensions(\"gl_ShadingRateFlag2HorizontalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n            symbolTable.setVariableExtensions(\"gl_ShadingRateFlag4HorizontalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n        }\n\n        // Builtins for GL_NV_displacment_micromap\n        if ((profile != EEsProfile && version >= 460)) {\n            symbolTable.setFunctionExtensions(\"fetchMicroTriangleVertexPositionNV\", 1, &E_GL_NV_displacement_micromap);\n            symbolTable.setFunctionExtensions(\"fetchMicroTriangleVertexBarycentricNV\", 1, &E_GL_NV_displacement_micromap);\n        }\n\n        break;\n\n    case EShLangTask:\n        if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {\n            symbolTable.setVariableExtensions(\"gl_TaskCountNV\",          1, &E_GL_NV_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_MeshViewCountNV\",      1, &E_GL_NV_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_MeshViewIndicesNV\",    1, &E_GL_NV_mesh_shader);\n            if (profile != EEsProfile) {\n                symbolTable.setVariableExtensions(\"gl_WorkGroupSize\",        Num_AEP_mesh_shader, AEP_mesh_shader);\n                symbolTable.setVariableExtensions(\"gl_WorkGroupID\",          Num_AEP_mesh_shader, AEP_mesh_shader);\n                symbolTable.setVariableExtensions(\"gl_LocalInvocationID\",    Num_AEP_mesh_shader, AEP_mesh_shader);\n                symbolTable.setVariableExtensions(\"gl_GlobalInvocationID\",   Num_AEP_mesh_shader, AEP_mesh_shader);\n                symbolTable.setVariableExtensions(\"gl_LocalInvocationIndex\", Num_AEP_mesh_shader, AEP_mesh_shader);\n            } else {\n                symbolTable.setVariableExtensions(\"gl_WorkGroupSize\",        1, &E_GL_NV_mesh_shader);\n                symbolTable.setVariableExtensions(\"gl_WorkGroupID\",          1, &E_GL_NV_mesh_shader);\n                symbolTable.setVariableExtensions(\"gl_LocalInvocationID\",    1, &E_GL_NV_mesh_shader);\n                symbolTable.setVariableExtensions(\"gl_GlobalInvocationID\",   1, &E_GL_NV_mesh_shader);\n                symbolTable.setVariableExtensions(\"gl_LocalInvocationIndex\", 1, &E_GL_NV_mesh_shader);\n            }\n\n            BuiltInVariable(\"gl_TaskCountNV\",          EbvTaskCountNV,          symbolTable);\n            BuiltInVariable(\"gl_WorkGroupSize\",        EbvWorkGroupSize,        symbolTable);\n            BuiltInVariable(\"gl_WorkGroupID\",          EbvWorkGroupId,          symbolTable);\n            BuiltInVariable(\"gl_LocalInvocationID\",    EbvLocalInvocationId,    symbolTable);\n            BuiltInVariable(\"gl_GlobalInvocationID\",   EbvGlobalInvocationId,   symbolTable);\n            BuiltInVariable(\"gl_LocalInvocationIndex\", EbvLocalInvocationIndex, symbolTable);\n            BuiltInVariable(\"gl_MeshViewCountNV\",      EbvMeshViewCountNV,      symbolTable);\n            BuiltInVariable(\"gl_MeshViewIndicesNV\",    EbvMeshViewIndicesNV,    symbolTable);\n\n            symbolTable.setVariableExtensions(\"gl_MaxTaskWorkGroupSizeNV\", 1, &E_GL_NV_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_MaxMeshViewCountNV\",     1, &E_GL_NV_mesh_shader);\n\n            if (profile != EEsProfile) {\n                symbolTable.setFunctionExtensions(\"barrier\",                   Num_AEP_mesh_shader, AEP_mesh_shader);\n                symbolTable.setFunctionExtensions(\"memoryBarrierShared\",       Num_AEP_mesh_shader, AEP_mesh_shader);\n                symbolTable.setFunctionExtensions(\"groupMemoryBarrier\",        Num_AEP_mesh_shader, AEP_mesh_shader);\n            } else {\n                symbolTable.setFunctionExtensions(\"barrier\",                   1, &E_GL_NV_mesh_shader);\n                symbolTable.setFunctionExtensions(\"memoryBarrierShared\",       1, &E_GL_NV_mesh_shader);\n                symbolTable.setFunctionExtensions(\"groupMemoryBarrier\",        1, &E_GL_NV_mesh_shader);\n            }\n        }\n\n        if (profile != EEsProfile && version >= 450) {\n            // GL_EXT_mesh_shader\n            symbolTable.setFunctionExtensions(\"EmitMeshTasksEXT\",          1, &E_GL_EXT_mesh_shader);\n            symbolTable.setVariableExtensions(\"gl_NumWorkGroups\",        1, &E_GL_EXT_mesh_shader);\n            BuiltInVariable(\"gl_NumWorkGroups\",        EbvNumWorkGroups,        symbolTable);\n\n            // GL_EXT_device_group\n            symbolTable.setVariableExtensions(\"gl_DeviceIndex\", 1, &E_GL_EXT_device_group);\n            BuiltInVariable(\"gl_DeviceIndex\", EbvDeviceIndex, symbolTable);\n\n            // GL_ARB_shader_draw_parameters\n            symbolTable.setVariableExtensions(\"gl_DrawIDARB\", 1, &E_GL_ARB_shader_draw_parameters);\n            BuiltInVariable(\"gl_DrawIDARB\", EbvDrawId, symbolTable);\n            if (version >= 460) {\n                BuiltInVariable(\"gl_DrawID\", EbvDrawId, symbolTable);\n            }\n\n            // GL_ARB_shader_ballot\n            symbolTable.setVariableExtensions(\"gl_SubGroupSizeARB\",       1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupInvocationARB\", 1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupEqMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupGeMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupGtMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupLeMaskARB\",     1, &E_GL_ARB_shader_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubGroupLtMaskARB\",     1, &E_GL_ARB_shader_ballot);\n\n            BuiltInVariable(\"gl_SubGroupInvocationARB\", EbvSubGroupInvocation, symbolTable);\n            BuiltInVariable(\"gl_SubGroupEqMaskARB\",     EbvSubGroupEqMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupGeMaskARB\",     EbvSubGroupGeMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupGtMaskARB\",     EbvSubGroupGtMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupLeMaskARB\",     EbvSubGroupLeMask,     symbolTable);\n            BuiltInVariable(\"gl_SubGroupLtMaskARB\",     EbvSubGroupLtMask,     symbolTable);\n\n            if (spvVersion.vulkan > 0) {\n                // Treat \"gl_SubGroupSizeARB\" as shader input instead of uniform for Vulkan\n                SpecialQualifier(\"gl_SubGroupSizeARB\", EvqVaryingIn, EbvSubGroupSize, symbolTable);\n                if (language == EShLangFragment)\n                    ModifyFlatDecoration(\"gl_SubGroupSizeARB\", true, symbolTable);\n            }\n            else\n                BuiltInVariable(\"gl_SubGroupSizeARB\", EbvSubGroupSize, symbolTable);\n        }\n\n        // GL_KHR_shader_subgroup\n        if ((profile == EEsProfile && version >= 310) ||\n            (profile != EEsProfile && version >= 140)) {\n            symbolTable.setVariableExtensions(\"gl_NumSubgroups\",         1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setVariableExtensions(\"gl_SubgroupID\",           1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setVariableExtensions(\"gl_SubgroupSize\",         1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setVariableExtensions(\"gl_SubgroupInvocationID\", 1, &E_GL_KHR_shader_subgroup_basic);\n            symbolTable.setVariableExtensions(\"gl_SubgroupEqMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupGeMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupGtMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupLeMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n            symbolTable.setVariableExtensions(\"gl_SubgroupLtMask\",       1, &E_GL_KHR_shader_subgroup_ballot);\n\n            BuiltInVariable(\"gl_NumSubgroups\",         EbvNumSubgroups,        symbolTable);\n            BuiltInVariable(\"gl_SubgroupID\",           EbvSubgroupID,          symbolTable);\n            BuiltInVariable(\"gl_SubgroupSize\",         EbvSubgroupSize2,       symbolTable);\n            BuiltInVariable(\"gl_SubgroupInvocationID\", EbvSubgroupInvocation2, symbolTable);\n            BuiltInVariable(\"gl_SubgroupEqMask\",       EbvSubgroupEqMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupGeMask\",       EbvSubgroupGeMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupGtMask\",       EbvSubgroupGtMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupLeMask\",       EbvSubgroupLeMask2,     symbolTable);\n            BuiltInVariable(\"gl_SubgroupLtMask\",       EbvSubgroupLtMask2,     symbolTable);\n\n            symbolTable.setFunctionExtensions(\"subgroupMemoryBarrierShared\", 1, &E_GL_KHR_shader_subgroup_basic);\n\n            // GL_NV_shader_sm_builtins\n            symbolTable.setVariableExtensions(\"gl_WarpsPerSMNV\",         1, &E_GL_NV_shader_sm_builtins);\n            symbolTable.setVariableExtensions(\"gl_SMCountNV\",            1, &E_GL_NV_shader_sm_builtins);\n            symbolTable.setVariableExtensions(\"gl_WarpIDNV\",             1, &E_GL_NV_shader_sm_builtins);\n            symbolTable.setVariableExtensions(\"gl_SMIDNV\",               1, &E_GL_NV_shader_sm_builtins);\n            BuiltInVariable(\"gl_WarpsPerSMNV\",          EbvWarpsPerSM,      symbolTable);\n            BuiltInVariable(\"gl_SMCountNV\",             EbvSMCount,         symbolTable);\n            BuiltInVariable(\"gl_WarpIDNV\",              EbvWarpID,          symbolTable);\n            BuiltInVariable(\"gl_SMIDNV\",                EbvSMID,            symbolTable);\n\n            // GL_ARM_shader_core_builtins\n            symbolTable.setVariableExtensions(\"gl_CoreCountARM\", 1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_CoreIDARM\",    1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_CoreMaxIDARM\", 1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_WarpIDARM\",    1, &E_GL_ARM_shader_core_builtins);\n            symbolTable.setVariableExtensions(\"gl_WarpMaxIDARM\", 1, &E_GL_ARM_shader_core_builtins);\n\n            BuiltInVariable(\"gl_CoreCountARM\", EbvCoreCountARM, symbolTable);\n            BuiltInVariable(\"gl_CoreIDARM\",    EbvCoreIDARM, symbolTable);\n            BuiltInVariable(\"gl_CoreMaxIDARM\", EbvCoreMaxIDARM, symbolTable);\n            BuiltInVariable(\"gl_WarpIDARM\",    EbvWarpIDARM, symbolTable);\n            BuiltInVariable(\"gl_WarpMaxIDARM\", EbvWarpMaxIDARM, symbolTable);\n        }\n        if ((profile == EEsProfile && version >= 310) ||\n            (profile != EEsProfile && version >= 450)) {\n            symbolTable.setVariableExtensions(\"gl_ShadingRateFlag2VerticalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n            symbolTable.setVariableExtensions(\"gl_ShadingRateFlag4VerticalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n            symbolTable.setVariableExtensions(\"gl_ShadingRateFlag2HorizontalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n            symbolTable.setVariableExtensions(\"gl_ShadingRateFlag4HorizontalPixelsEXT\", 1, &E_GL_EXT_fragment_shading_rate);\n        }\n        break;\n\n    default:\n        assert(false && \"Language not supported\");\n        break;\n    }\n\n    //\n    // Next, identify which built-ins have a mapping to an operator.\n    // If PureOperatorBuiltins is false, those that are not identified as such are\n    // expected to be resolved through a library of functions, versus as\n    // operations.\n    //\n\n    relateTabledBuiltins(version, profile, spvVersion, language, symbolTable);\n\n    symbolTable.relateToOperator(\"doubleBitsToInt64\",  EOpDoubleBitsToInt64);\n    symbolTable.relateToOperator(\"doubleBitsToUint64\", EOpDoubleBitsToUint64);\n    symbolTable.relateToOperator(\"int64BitsToDouble\",  EOpInt64BitsToDouble);\n    symbolTable.relateToOperator(\"uint64BitsToDouble\", EOpUint64BitsToDouble);\n    symbolTable.relateToOperator(\"halfBitsToInt16\",  EOpFloat16BitsToInt16);\n    symbolTable.relateToOperator(\"halfBitsToUint16\", EOpFloat16BitsToUint16);\n    symbolTable.relateToOperator(\"float16BitsToInt16\",  EOpFloat16BitsToInt16);\n    symbolTable.relateToOperator(\"float16BitsToUint16\", EOpFloat16BitsToUint16);\n    symbolTable.relateToOperator(\"int16BitsToFloat16\",  EOpInt16BitsToFloat16);\n    symbolTable.relateToOperator(\"uint16BitsToFloat16\", EOpUint16BitsToFloat16);\n\n    symbolTable.relateToOperator(\"int16BitsToHalf\",  EOpInt16BitsToFloat16);\n    symbolTable.relateToOperator(\"uint16BitsToHalf\", EOpUint16BitsToFloat16);\n\n    symbolTable.relateToOperator(\"packSnorm4x8\",    EOpPackSnorm4x8);\n    symbolTable.relateToOperator(\"unpackSnorm4x8\",  EOpUnpackSnorm4x8);\n    symbolTable.relateToOperator(\"packUnorm4x8\",    EOpPackUnorm4x8);\n    symbolTable.relateToOperator(\"unpackUnorm4x8\",  EOpUnpackUnorm4x8);\n\n    symbolTable.relateToOperator(\"packDouble2x32\",    EOpPackDouble2x32);\n    symbolTable.relateToOperator(\"unpackDouble2x32\",  EOpUnpackDouble2x32);\n\n    symbolTable.relateToOperator(\"packInt2x32\",     EOpPackInt2x32);\n    symbolTable.relateToOperator(\"unpackInt2x32\",   EOpUnpackInt2x32);\n    symbolTable.relateToOperator(\"packUint2x32\",    EOpPackUint2x32);\n    symbolTable.relateToOperator(\"unpackUint2x32\",  EOpUnpackUint2x32);\n\n    symbolTable.relateToOperator(\"packInt2x16\",     EOpPackInt2x16);\n    symbolTable.relateToOperator(\"unpackInt2x16\",   EOpUnpackInt2x16);\n    symbolTable.relateToOperator(\"packUint2x16\",    EOpPackUint2x16);\n    symbolTable.relateToOperator(\"unpackUint2x16\",  EOpUnpackUint2x16);\n\n    symbolTable.relateToOperator(\"packInt4x16\",     EOpPackInt4x16);\n    symbolTable.relateToOperator(\"unpackInt4x16\",   EOpUnpackInt4x16);\n    symbolTable.relateToOperator(\"packUint4x16\",    EOpPackUint4x16);\n    symbolTable.relateToOperator(\"unpackUint4x16\",  EOpUnpackUint4x16);\n    symbolTable.relateToOperator(\"packFloat2x16\",   EOpPackFloat2x16);\n    symbolTable.relateToOperator(\"unpackFloat2x16\", EOpUnpackFloat2x16);\n\n    symbolTable.relateToOperator(\"pack16\",          EOpPack16);\n    symbolTable.relateToOperator(\"pack32\",          EOpPack32);\n    symbolTable.relateToOperator(\"pack64\",          EOpPack64);\n\n    symbolTable.relateToOperator(\"unpack32\",        EOpUnpack32);\n    symbolTable.relateToOperator(\"unpack16\",        EOpUnpack16);\n    symbolTable.relateToOperator(\"unpack8\",         EOpUnpack8);\n\n    symbolTable.relateToOperator(\"controlBarrier\",             EOpBarrier);\n    symbolTable.relateToOperator(\"memoryBarrierAtomicCounter\", EOpMemoryBarrierAtomicCounter);\n    symbolTable.relateToOperator(\"memoryBarrierImage\",         EOpMemoryBarrierImage);\n\n    if (spvVersion.vulkanRelaxed) {\n        //\n        // functions signature have been replaced to take uint operations on buffer variables\n        // remap atomic counter functions to atomic operations\n        //\n        symbolTable.relateToOperator(\"memoryBarrierAtomicCounter\", EOpMemoryBarrierBuffer);\n    }\n\n    symbolTable.relateToOperator(\"atomicLoad\",     EOpAtomicLoad);\n    symbolTable.relateToOperator(\"atomicStore\",    EOpAtomicStore);\n\n    symbolTable.relateToOperator(\"atomicCounterIncrement\", EOpAtomicCounterIncrement);\n    symbolTable.relateToOperator(\"atomicCounterDecrement\", EOpAtomicCounterDecrement);\n    symbolTable.relateToOperator(\"atomicCounter\",          EOpAtomicCounter);\n\n    if (spvVersion.vulkanRelaxed) {\n        //\n        // functions signature have been replaced to take uint operations\n        // remap atomic counter functions to atomic operations\n        //\n        // these atomic counter functions do not match signatures of glsl\n        // atomic functions, so they will be remapped to semantically\n        // equivalent functions in the parser\n        //\n        symbolTable.relateToOperator(\"atomicCounterIncrement\", EOpNull);\n        symbolTable.relateToOperator(\"atomicCounterDecrement\", EOpNull);\n        symbolTable.relateToOperator(\"atomicCounter\", EOpNull);\n    }\n\n    symbolTable.relateToOperator(\"clockARB\",     EOpReadClockSubgroupKHR);\n    symbolTable.relateToOperator(\"clock2x32ARB\", EOpReadClockSubgroupKHR);\n\n    symbolTable.relateToOperator(\"clockRealtimeEXT\",     EOpReadClockDeviceKHR);\n    symbolTable.relateToOperator(\"clockRealtime2x32EXT\", EOpReadClockDeviceKHR);\n\n    if (profile != EEsProfile && version == 450) {\n        symbolTable.relateToOperator(\"atomicCounterAddARB\",      EOpAtomicCounterAdd);\n        symbolTable.relateToOperator(\"atomicCounterSubtractARB\", EOpAtomicCounterSubtract);\n        symbolTable.relateToOperator(\"atomicCounterMinARB\",      EOpAtomicCounterMin);\n        symbolTable.relateToOperator(\"atomicCounterMaxARB\",      EOpAtomicCounterMax);\n        symbolTable.relateToOperator(\"atomicCounterAndARB\",      EOpAtomicCounterAnd);\n        symbolTable.relateToOperator(\"atomicCounterOrARB\",       EOpAtomicCounterOr);\n        symbolTable.relateToOperator(\"atomicCounterXorARB\",      EOpAtomicCounterXor);\n        symbolTable.relateToOperator(\"atomicCounterExchangeARB\", EOpAtomicCounterExchange);\n        symbolTable.relateToOperator(\"atomicCounterCompSwapARB\", EOpAtomicCounterCompSwap);\n    }\n\n    if (profile != EEsProfile && version >= 460) {\n        symbolTable.relateToOperator(\"atomicCounterAdd\",      EOpAtomicCounterAdd);\n        symbolTable.relateToOperator(\"atomicCounterSubtract\", EOpAtomicCounterSubtract);\n        symbolTable.relateToOperator(\"atomicCounterMin\",      EOpAtomicCounterMin);\n        symbolTable.relateToOperator(\"atomicCounterMax\",      EOpAtomicCounterMax);\n        symbolTable.relateToOperator(\"atomicCounterAnd\",      EOpAtomicCounterAnd);\n        symbolTable.relateToOperator(\"atomicCounterOr\",       EOpAtomicCounterOr);\n        symbolTable.relateToOperator(\"atomicCounterXor\",      EOpAtomicCounterXor);\n        symbolTable.relateToOperator(\"atomicCounterExchange\", EOpAtomicCounterExchange);\n        symbolTable.relateToOperator(\"atomicCounterCompSwap\", EOpAtomicCounterCompSwap);\n    }\n\n    if (spvVersion.vulkanRelaxed) {\n        //\n        // functions signature have been replaced to take 'uint' instead of 'atomic_uint'\n        // remap atomic counter functions to non-counter atomic ops so\n        // functions act as aliases to non-counter atomic ops\n        //\n        symbolTable.relateToOperator(\"atomicCounterAdd\", EOpAtomicAdd);\n        symbolTable.relateToOperator(\"atomicCounterSubtract\", EOpAtomicSubtract);\n        symbolTable.relateToOperator(\"atomicCounterMin\", EOpAtomicMin);\n        symbolTable.relateToOperator(\"atomicCounterMax\", EOpAtomicMax);\n        symbolTable.relateToOperator(\"atomicCounterAnd\", EOpAtomicAnd);\n        symbolTable.relateToOperator(\"atomicCounterOr\", EOpAtomicOr);\n        symbolTable.relateToOperator(\"atomicCounterXor\", EOpAtomicXor);\n        symbolTable.relateToOperator(\"atomicCounterExchange\", EOpAtomicExchange);\n        symbolTable.relateToOperator(\"atomicCounterCompSwap\", EOpAtomicCompSwap);\n    }\n\n    symbolTable.relateToOperator(\"fma\",               EOpFma);\n    symbolTable.relateToOperator(\"frexp\",             EOpFrexp);\n    symbolTable.relateToOperator(\"ldexp\",             EOpLdexp);\n    symbolTable.relateToOperator(\"uaddCarry\",         EOpAddCarry);\n    symbolTable.relateToOperator(\"usubBorrow\",        EOpSubBorrow);\n    symbolTable.relateToOperator(\"umulExtended\",      EOpUMulExtended);\n    symbolTable.relateToOperator(\"imulExtended\",      EOpIMulExtended);\n    symbolTable.relateToOperator(\"bitfieldExtract\",   EOpBitfieldExtract);\n    symbolTable.relateToOperator(\"bitfieldInsert\",    EOpBitfieldInsert);\n    symbolTable.relateToOperator(\"bitfieldReverse\",   EOpBitFieldReverse);\n    symbolTable.relateToOperator(\"bitCount\",          EOpBitCount);\n    symbolTable.relateToOperator(\"findLSB\",           EOpFindLSB);\n    symbolTable.relateToOperator(\"findMSB\",           EOpFindMSB);\n\n    symbolTable.relateToOperator(\"helperInvocationEXT\",  EOpIsHelperInvocation);\n\n    symbolTable.relateToOperator(\"countLeadingZeros\",  EOpCountLeadingZeros);\n    symbolTable.relateToOperator(\"countTrailingZeros\", EOpCountTrailingZeros);\n    symbolTable.relateToOperator(\"absoluteDifference\", EOpAbsDifference);\n    symbolTable.relateToOperator(\"addSaturate\",        EOpAddSaturate);\n    symbolTable.relateToOperator(\"subtractSaturate\",   EOpSubSaturate);\n    symbolTable.relateToOperator(\"average\",            EOpAverage);\n    symbolTable.relateToOperator(\"averageRounded\",     EOpAverageRounded);\n    symbolTable.relateToOperator(\"multiply32x16\",      EOpMul32x16);\n    symbolTable.relateToOperator(\"debugPrintfEXT\",     EOpDebugPrintf);\n    symbolTable.relateToOperator(\"assumeEXT\",          EOpAssumeEXT);\n    symbolTable.relateToOperator(\"expectEXT\",          EOpExpectEXT);\n\n\n    if (PureOperatorBuiltins) {\n        symbolTable.relateToOperator(\"imageSize\",               EOpImageQuerySize);\n        symbolTable.relateToOperator(\"imageSamples\",            EOpImageQuerySamples);\n        symbolTable.relateToOperator(\"imageLoad\",               EOpImageLoad);\n        symbolTable.relateToOperator(\"imageStore\",              EOpImageStore);\n        symbolTable.relateToOperator(\"imageAtomicAdd\",          EOpImageAtomicAdd);\n        symbolTable.relateToOperator(\"imageAtomicMin\",          EOpImageAtomicMin);\n        symbolTable.relateToOperator(\"imageAtomicMax\",          EOpImageAtomicMax);\n        symbolTable.relateToOperator(\"imageAtomicAnd\",          EOpImageAtomicAnd);\n        symbolTable.relateToOperator(\"imageAtomicOr\",           EOpImageAtomicOr);\n        symbolTable.relateToOperator(\"imageAtomicXor\",          EOpImageAtomicXor);\n        symbolTable.relateToOperator(\"imageAtomicExchange\",     EOpImageAtomicExchange);\n        symbolTable.relateToOperator(\"imageAtomicCompSwap\",     EOpImageAtomicCompSwap);\n        symbolTable.relateToOperator(\"imageAtomicLoad\",         EOpImageAtomicLoad);\n        symbolTable.relateToOperator(\"imageAtomicStore\",        EOpImageAtomicStore);\n\n        symbolTable.relateToOperator(\"subpassLoad\",             EOpSubpassLoad);\n        symbolTable.relateToOperator(\"subpassLoadMS\",           EOpSubpassLoadMS);\n\n        symbolTable.relateToOperator(\"textureGather\",           EOpTextureGather);\n        symbolTable.relateToOperator(\"textureGatherOffset\",     EOpTextureGatherOffset);\n        symbolTable.relateToOperator(\"textureGatherOffsets\",    EOpTextureGatherOffsets);\n\n        symbolTable.relateToOperator(\"noise1\", EOpNoise);\n        symbolTable.relateToOperator(\"noise2\", EOpNoise);\n        symbolTable.relateToOperator(\"noise3\", EOpNoise);\n        symbolTable.relateToOperator(\"noise4\", EOpNoise);\n\n        symbolTable.relateToOperator(\"textureFootprintNV\",          EOpImageSampleFootprintNV);\n        symbolTable.relateToOperator(\"textureFootprintClampNV\",     EOpImageSampleFootprintClampNV);\n        symbolTable.relateToOperator(\"textureFootprintLodNV\",       EOpImageSampleFootprintLodNV);\n        symbolTable.relateToOperator(\"textureFootprintGradNV\",      EOpImageSampleFootprintGradNV);\n        symbolTable.relateToOperator(\"textureFootprintGradClampNV\", EOpImageSampleFootprintGradClampNV);\n\n        if (spvVersion.spv == 0 && IncludeLegacy(version, profile, spvVersion))\n            symbolTable.relateToOperator(\"ftransform\", EOpFtransform);\n\n        if (spvVersion.spv == 0 && (IncludeLegacy(version, profile, spvVersion) ||\n            (profile == EEsProfile && version == 100))) {\n\n            symbolTable.relateToOperator(\"texture1D\",                EOpTexture);\n            symbolTable.relateToOperator(\"texture1DGradARB\",         EOpTextureGrad);\n            symbolTable.relateToOperator(\"texture1DProj\",            EOpTextureProj);\n            symbolTable.relateToOperator(\"texture1DProjGradARB\",     EOpTextureProjGrad);\n            symbolTable.relateToOperator(\"texture1DLod\",             EOpTextureLod);\n            symbolTable.relateToOperator(\"texture1DProjLod\",         EOpTextureProjLod);\n\n            symbolTable.relateToOperator(\"texture2DRect\",            EOpTexture);\n            symbolTable.relateToOperator(\"texture2DRectProj\",        EOpTextureProj);\n            symbolTable.relateToOperator(\"texture2DRectGradARB\",     EOpTextureGrad);\n            symbolTable.relateToOperator(\"texture2DRectProjGradARB\", EOpTextureProjGrad);\n            symbolTable.relateToOperator(\"shadow2DRect\",             EOpTexture);\n            symbolTable.relateToOperator(\"shadow2DRectProj\",         EOpTextureProj);\n            symbolTable.relateToOperator(\"shadow2DRectGradARB\",      EOpTextureGrad);\n            symbolTable.relateToOperator(\"shadow2DRectProjGradARB\",  EOpTextureProjGrad);\n\n            symbolTable.relateToOperator(\"texture2D\",                EOpTexture);\n            symbolTable.relateToOperator(\"texture2DProj\",            EOpTextureProj);\n            symbolTable.relateToOperator(\"texture2DGradEXT\",         EOpTextureGrad);\n            symbolTable.relateToOperator(\"texture2DGradARB\",         EOpTextureGrad);\n            symbolTable.relateToOperator(\"texture2DProjGradEXT\",     EOpTextureProjGrad);\n            symbolTable.relateToOperator(\"texture2DProjGradARB\",     EOpTextureProjGrad);\n            symbolTable.relateToOperator(\"texture2DLod\",             EOpTextureLod);\n            symbolTable.relateToOperator(\"texture2DLodEXT\",          EOpTextureLod);\n            symbolTable.relateToOperator(\"texture2DProjLod\",         EOpTextureProjLod);\n            symbolTable.relateToOperator(\"texture2DProjLodEXT\",      EOpTextureProjLod);\n\n            symbolTable.relateToOperator(\"texture3D\",                EOpTexture);\n            symbolTable.relateToOperator(\"texture3DGradARB\",         EOpTextureGrad);\n            symbolTable.relateToOperator(\"texture3DProj\",            EOpTextureProj);\n            symbolTable.relateToOperator(\"texture3DProjGradARB\",     EOpTextureProjGrad);\n            symbolTable.relateToOperator(\"texture3DLod\",             EOpTextureLod);\n            symbolTable.relateToOperator(\"texture3DProjLod\",         EOpTextureProjLod);\n            symbolTable.relateToOperator(\"textureCube\",              EOpTexture);\n            symbolTable.relateToOperator(\"textureCubeGradEXT\",       EOpTextureGrad);\n            symbolTable.relateToOperator(\"textureCubeGradARB\",       EOpTextureGrad);\n            symbolTable.relateToOperator(\"textureCubeLod\",           EOpTextureLod);\n            symbolTable.relateToOperator(\"textureCubeLodEXT\",        EOpTextureLod);\n            symbolTable.relateToOperator(\"shadow1D\",                 EOpTexture);\n            symbolTable.relateToOperator(\"shadow1DGradARB\",          EOpTextureGrad);\n            symbolTable.relateToOperator(\"shadow2D\",                 EOpTexture);\n            symbolTable.relateToOperator(\"shadow2DGradARB\",          EOpTextureGrad);\n            symbolTable.relateToOperator(\"shadow1DProj\",             EOpTextureProj);\n            symbolTable.relateToOperator(\"shadow2DProj\",             EOpTextureProj);\n            symbolTable.relateToOperator(\"shadow1DProjGradARB\",      EOpTextureProjGrad);\n            symbolTable.relateToOperator(\"shadow2DProjGradARB\",      EOpTextureProjGrad);\n            symbolTable.relateToOperator(\"shadow1DLod\",              EOpTextureLod);\n            symbolTable.relateToOperator(\"shadow2DLod\",              EOpTextureLod);\n            symbolTable.relateToOperator(\"shadow1DProjLod\",          EOpTextureProjLod);\n            symbolTable.relateToOperator(\"shadow2DProjLod\",          EOpTextureProjLod);\n        }\n\n        if (profile != EEsProfile) {\n            symbolTable.relateToOperator(\"sparseTextureARB\",                EOpSparseTexture);\n            symbolTable.relateToOperator(\"sparseTextureLodARB\",             EOpSparseTextureLod);\n            symbolTable.relateToOperator(\"sparseTextureOffsetARB\",          EOpSparseTextureOffset);\n            symbolTable.relateToOperator(\"sparseTexelFetchARB\",             EOpSparseTextureFetch);\n            symbolTable.relateToOperator(\"sparseTexelFetchOffsetARB\",       EOpSparseTextureFetchOffset);\n            symbolTable.relateToOperator(\"sparseTextureLodOffsetARB\",       EOpSparseTextureLodOffset);\n            symbolTable.relateToOperator(\"sparseTextureGradARB\",            EOpSparseTextureGrad);\n            symbolTable.relateToOperator(\"sparseTextureGradOffsetARB\",      EOpSparseTextureGradOffset);\n            symbolTable.relateToOperator(\"sparseTextureGatherARB\",          EOpSparseTextureGather);\n            symbolTable.relateToOperator(\"sparseTextureGatherOffsetARB\",    EOpSparseTextureGatherOffset);\n            symbolTable.relateToOperator(\"sparseTextureGatherOffsetsARB\",   EOpSparseTextureGatherOffsets);\n            symbolTable.relateToOperator(\"sparseImageLoadARB\",              EOpSparseImageLoad);\n            symbolTable.relateToOperator(\"sparseTexelsResidentARB\",         EOpSparseTexelsResident);\n\n            symbolTable.relateToOperator(\"sparseTextureClampARB\",           EOpSparseTextureClamp);\n            symbolTable.relateToOperator(\"sparseTextureOffsetClampARB\",     EOpSparseTextureOffsetClamp);\n            symbolTable.relateToOperator(\"sparseTextureGradClampARB\",       EOpSparseTextureGradClamp);\n            symbolTable.relateToOperator(\"sparseTextureGradOffsetClampARB\", EOpSparseTextureGradOffsetClamp);\n            symbolTable.relateToOperator(\"textureClampARB\",                 EOpTextureClamp);\n            symbolTable.relateToOperator(\"textureOffsetClampARB\",           EOpTextureOffsetClamp);\n            symbolTable.relateToOperator(\"textureGradClampARB\",             EOpTextureGradClamp);\n            symbolTable.relateToOperator(\"textureGradOffsetClampARB\",       EOpTextureGradOffsetClamp);\n\n            symbolTable.relateToOperator(\"ballotARB\",                       EOpBallot);\n            symbolTable.relateToOperator(\"readInvocationARB\",               EOpReadInvocation);\n            symbolTable.relateToOperator(\"readFirstInvocationARB\",          EOpReadFirstInvocation);\n\n            if (version >= 430) {\n                symbolTable.relateToOperator(\"anyInvocationARB\",            EOpAnyInvocation);\n                symbolTable.relateToOperator(\"allInvocationsARB\",           EOpAllInvocations);\n                symbolTable.relateToOperator(\"allInvocationsEqualARB\",      EOpAllInvocationsEqual);\n            }\n            if (version >= 460) {\n                symbolTable.relateToOperator(\"anyInvocation\",               EOpAnyInvocation);\n                symbolTable.relateToOperator(\"allInvocations\",              EOpAllInvocations);\n                symbolTable.relateToOperator(\"allInvocationsEqual\",         EOpAllInvocationsEqual);\n            }\n            // As per dependency between NV_gpu_shader5 and ARB_shader_group_vote\n            // anyInvocationARB = anyThreadNV\n            // allInvocationsARB = allThreadsNV\n            // allInvocationsEqualARB = allThreadsEqualNV\n            // Thus we reuse the Op's\n            if (version >= 150) {\n                symbolTable.relateToOperator(\"anyThreadNV\",            EOpAnyInvocation);\n                symbolTable.relateToOperator(\"allThreadsNV\",           EOpAllInvocations);\n                symbolTable.relateToOperator(\"allThreadsEqualNV\",      EOpAllInvocationsEqual);\n            }\n            symbolTable.relateToOperator(\"minInvocationsAMD\",                           EOpMinInvocations);\n            symbolTable.relateToOperator(\"maxInvocationsAMD\",                           EOpMaxInvocations);\n            symbolTable.relateToOperator(\"addInvocationsAMD\",                           EOpAddInvocations);\n            symbolTable.relateToOperator(\"minInvocationsNonUniformAMD\",                 EOpMinInvocationsNonUniform);\n            symbolTable.relateToOperator(\"maxInvocationsNonUniformAMD\",                 EOpMaxInvocationsNonUniform);\n            symbolTable.relateToOperator(\"addInvocationsNonUniformAMD\",                 EOpAddInvocationsNonUniform);\n            symbolTable.relateToOperator(\"minInvocationsInclusiveScanAMD\",              EOpMinInvocationsInclusiveScan);\n            symbolTable.relateToOperator(\"maxInvocationsInclusiveScanAMD\",              EOpMaxInvocationsInclusiveScan);\n            symbolTable.relateToOperator(\"addInvocationsInclusiveScanAMD\",              EOpAddInvocationsInclusiveScan);\n            symbolTable.relateToOperator(\"minInvocationsInclusiveScanNonUniformAMD\",    EOpMinInvocationsInclusiveScanNonUniform);\n            symbolTable.relateToOperator(\"maxInvocationsInclusiveScanNonUniformAMD\",    EOpMaxInvocationsInclusiveScanNonUniform);\n            symbolTable.relateToOperator(\"addInvocationsInclusiveScanNonUniformAMD\",    EOpAddInvocationsInclusiveScanNonUniform);\n            symbolTable.relateToOperator(\"minInvocationsExclusiveScanAMD\",              EOpMinInvocationsExclusiveScan);\n            symbolTable.relateToOperator(\"maxInvocationsExclusiveScanAMD\",              EOpMaxInvocationsExclusiveScan);\n            symbolTable.relateToOperator(\"addInvocationsExclusiveScanAMD\",              EOpAddInvocationsExclusiveScan);\n            symbolTable.relateToOperator(\"minInvocationsExclusiveScanNonUniformAMD\",    EOpMinInvocationsExclusiveScanNonUniform);\n            symbolTable.relateToOperator(\"maxInvocationsExclusiveScanNonUniformAMD\",    EOpMaxInvocationsExclusiveScanNonUniform);\n            symbolTable.relateToOperator(\"addInvocationsExclusiveScanNonUniformAMD\",    EOpAddInvocationsExclusiveScanNonUniform);\n            symbolTable.relateToOperator(\"swizzleInvocationsAMD\",                       EOpSwizzleInvocations);\n            symbolTable.relateToOperator(\"swizzleInvocationsMaskedAMD\",                 EOpSwizzleInvocationsMasked);\n            symbolTable.relateToOperator(\"writeInvocationAMD\",                          EOpWriteInvocation);\n            symbolTable.relateToOperator(\"mbcntAMD\",                                    EOpMbcnt);\n\n            symbolTable.relateToOperator(\"min3\",    EOpMin3);\n            symbolTable.relateToOperator(\"max3\",    EOpMax3);\n            symbolTable.relateToOperator(\"mid3\",    EOpMid3);\n\n            symbolTable.relateToOperator(\"cubeFaceIndexAMD\",    EOpCubeFaceIndex);\n            symbolTable.relateToOperator(\"cubeFaceCoordAMD\",    EOpCubeFaceCoord);\n            symbolTable.relateToOperator(\"timeAMD\",             EOpTime);\n\n            symbolTable.relateToOperator(\"textureGatherLodAMD\",                 EOpTextureGatherLod);\n            symbolTable.relateToOperator(\"textureGatherLodOffsetAMD\",           EOpTextureGatherLodOffset);\n            symbolTable.relateToOperator(\"textureGatherLodOffsetsAMD\",          EOpTextureGatherLodOffsets);\n            symbolTable.relateToOperator(\"sparseTextureGatherLodAMD\",           EOpSparseTextureGatherLod);\n            symbolTable.relateToOperator(\"sparseTextureGatherLodOffsetAMD\",     EOpSparseTextureGatherLodOffset);\n            symbolTable.relateToOperator(\"sparseTextureGatherLodOffsetsAMD\",    EOpSparseTextureGatherLodOffsets);\n\n            symbolTable.relateToOperator(\"imageLoadLodAMD\",                     EOpImageLoadLod);\n            symbolTable.relateToOperator(\"imageStoreLodAMD\",                    EOpImageStoreLod);\n            symbolTable.relateToOperator(\"sparseImageLoadLodAMD\",               EOpSparseImageLoadLod);\n\n            symbolTable.relateToOperator(\"fragmentMaskFetchAMD\",                EOpFragmentMaskFetch);\n            symbolTable.relateToOperator(\"fragmentFetchAMD\",                    EOpFragmentFetch);\n        }\n\n        // GL_EXT_integer_dot_product\n        if ((profile == EEsProfile && version >= 300) ||\n            (profile != EEsProfile && version >= 450)) {\n            symbolTable.relateToOperator(\"dotEXT\", EOpDot);\n            symbolTable.relateToOperator(\"dotPacked4x8EXT\", EOpDotPackedEXT);\n            symbolTable.relateToOperator(\"dotAccSatEXT\", EOpDotAccSatEXT);\n            symbolTable.relateToOperator(\"dotPacked4x8AccSatEXT\", EOpDotPackedAccSatEXT);\n        }\n\n        // GL_EXT_bfloat16\n        if ((profile == EEsProfile && version >= 320) ||\n            (profile != EEsProfile && version >= 450)) {\n            symbolTable.relateToOperator(\"bfloat16BitsToIntEXT\",  EOpFloatBitsToInt);\n            symbolTable.relateToOperator(\"bfloat16BitsToUintEXT\", EOpFloatBitsToUint);\n            symbolTable.relateToOperator(\"intBitsToBFloat16EXT\",  EOpIntBitsToFloat);\n            symbolTable.relateToOperator(\"uintBitsToBFloat16EXT\", EOpUintBitsToFloat);\n\n            symbolTable.relateToOperator(\"floate5m2BitsToIntEXT\",  EOpFloatBitsToInt);\n            symbolTable.relateToOperator(\"floate5m2BitsToUintEXT\", EOpFloatBitsToUint);\n            symbolTable.relateToOperator(\"intBitsToFloate5m2EXT\",  EOpIntBitsToFloat);\n            symbolTable.relateToOperator(\"uintBitsToFloate5m2EXT\", EOpUintBitsToFloat);\n\n            symbolTable.relateToOperator(\"floate4m3BitsToIntEXT\",  EOpFloatBitsToInt);\n            symbolTable.relateToOperator(\"floate4m3BitsToUintEXT\", EOpFloatBitsToUint);\n            symbolTable.relateToOperator(\"intBitsToFloate4m3EXT\",  EOpIntBitsToFloat);\n            symbolTable.relateToOperator(\"uintBitsToFloate4m3EXT\", EOpUintBitsToFloat);\n\n            symbolTable.relateToOperator(\"saturatedConvertEXT\", EOpConstructSaturated);\n        }\n\n        // GL_KHR_shader_subgroup\n        if ((profile == EEsProfile && version >= 310) ||\n            (profile != EEsProfile && version >= 140)) {\n            symbolTable.relateToOperator(\"subgroupBarrier\",                 EOpSubgroupBarrier);\n            symbolTable.relateToOperator(\"subgroupMemoryBarrier\",           EOpSubgroupMemoryBarrier);\n            symbolTable.relateToOperator(\"subgroupMemoryBarrierBuffer\",     EOpSubgroupMemoryBarrierBuffer);\n            symbolTable.relateToOperator(\"subgroupMemoryBarrierImage\",      EOpSubgroupMemoryBarrierImage);\n            symbolTable.relateToOperator(\"subgroupElect\",                   EOpSubgroupElect);\n            symbolTable.relateToOperator(\"subgroupAll\",                     EOpSubgroupAll);\n            symbolTable.relateToOperator(\"subgroupAny\",                     EOpSubgroupAny);\n            symbolTable.relateToOperator(\"subgroupAllEqual\",                EOpSubgroupAllEqual);\n            symbolTable.relateToOperator(\"subgroupBroadcast\",               EOpSubgroupBroadcast);\n            symbolTable.relateToOperator(\"subgroupBroadcastFirst\",          EOpSubgroupBroadcastFirst);\n            symbolTable.relateToOperator(\"subgroupBallot\",                  EOpSubgroupBallot);\n            symbolTable.relateToOperator(\"subgroupInverseBallot\",           EOpSubgroupInverseBallot);\n            symbolTable.relateToOperator(\"subgroupBallotBitExtract\",        EOpSubgroupBallotBitExtract);\n            symbolTable.relateToOperator(\"subgroupBallotBitCount\",          EOpSubgroupBallotBitCount);\n            symbolTable.relateToOperator(\"subgroupBallotInclusiveBitCount\", EOpSubgroupBallotInclusiveBitCount);\n            symbolTable.relateToOperator(\"subgroupBallotExclusiveBitCount\", EOpSubgroupBallotExclusiveBitCount);\n            symbolTable.relateToOperator(\"subgroupBallotFindLSB\",           EOpSubgroupBallotFindLSB);\n            symbolTable.relateToOperator(\"subgroupBallotFindMSB\",           EOpSubgroupBallotFindMSB);\n            symbolTable.relateToOperator(\"subgroupShuffle\",                 EOpSubgroupShuffle);\n            symbolTable.relateToOperator(\"subgroupShuffleXor\",              EOpSubgroupShuffleXor);\n            symbolTable.relateToOperator(\"subgroupShuffleUp\",               EOpSubgroupShuffleUp);\n            symbolTable.relateToOperator(\"subgroupShuffleDown\",             EOpSubgroupShuffleDown);\n            symbolTable.relateToOperator(\"subgroupRotate\",                  EOpSubgroupRotate);\n            symbolTable.relateToOperator(\"subgroupClusteredRotate\",         EOpSubgroupClusteredRotate);\n            symbolTable.relateToOperator(\"subgroupAdd\",                     EOpSubgroupAdd);\n            symbolTable.relateToOperator(\"subgroupMul\",                     EOpSubgroupMul);\n            symbolTable.relateToOperator(\"subgroupMin\",                     EOpSubgroupMin);\n            symbolTable.relateToOperator(\"subgroupMax\",                     EOpSubgroupMax);\n            symbolTable.relateToOperator(\"subgroupAnd\",                     EOpSubgroupAnd);\n            symbolTable.relateToOperator(\"subgroupOr\",                      EOpSubgroupOr);\n            symbolTable.relateToOperator(\"subgroupXor\",                     EOpSubgroupXor);\n            symbolTable.relateToOperator(\"subgroupInclusiveAdd\",            EOpSubgroupInclusiveAdd);\n            symbolTable.relateToOperator(\"subgroupInclusiveMul\",            EOpSubgroupInclusiveMul);\n            symbolTable.relateToOperator(\"subgroupInclusiveMin\",            EOpSubgroupInclusiveMin);\n            symbolTable.relateToOperator(\"subgroupInclusiveMax\",            EOpSubgroupInclusiveMax);\n            symbolTable.relateToOperator(\"subgroupInclusiveAnd\",            EOpSubgroupInclusiveAnd);\n            symbolTable.relateToOperator(\"subgroupInclusiveOr\",             EOpSubgroupInclusiveOr);\n            symbolTable.relateToOperator(\"subgroupInclusiveXor\",            EOpSubgroupInclusiveXor);\n            symbolTable.relateToOperator(\"subgroupExclusiveAdd\",            EOpSubgroupExclusiveAdd);\n            symbolTable.relateToOperator(\"subgroupExclusiveMul\",            EOpSubgroupExclusiveMul);\n            symbolTable.relateToOperator(\"subgroupExclusiveMin\",            EOpSubgroupExclusiveMin);\n            symbolTable.relateToOperator(\"subgroupExclusiveMax\",            EOpSubgroupExclusiveMax);\n            symbolTable.relateToOperator(\"subgroupExclusiveAnd\",            EOpSubgroupExclusiveAnd);\n            symbolTable.relateToOperator(\"subgroupExclusiveOr\",             EOpSubgroupExclusiveOr);\n            symbolTable.relateToOperator(\"subgroupExclusiveXor\",            EOpSubgroupExclusiveXor);\n            symbolTable.relateToOperator(\"subgroupClusteredAdd\",            EOpSubgroupClusteredAdd);\n            symbolTable.relateToOperator(\"subgroupClusteredMul\",            EOpSubgroupClusteredMul);\n            symbolTable.relateToOperator(\"subgroupClusteredMin\",            EOpSubgroupClusteredMin);\n            symbolTable.relateToOperator(\"subgroupClusteredMax\",            EOpSubgroupClusteredMax);\n            symbolTable.relateToOperator(\"subgroupClusteredAnd\",            EOpSubgroupClusteredAnd);\n            symbolTable.relateToOperator(\"subgroupClusteredOr\",             EOpSubgroupClusteredOr);\n            symbolTable.relateToOperator(\"subgroupClusteredXor\",            EOpSubgroupClusteredXor);\n            symbolTable.relateToOperator(\"subgroupQuadBroadcast\",           EOpSubgroupQuadBroadcast);\n            symbolTable.relateToOperator(\"subgroupQuadSwapHorizontal\",      EOpSubgroupQuadSwapHorizontal);\n            symbolTable.relateToOperator(\"subgroupQuadSwapVertical\",        EOpSubgroupQuadSwapVertical);\n            symbolTable.relateToOperator(\"subgroupQuadSwapDiagonal\",        EOpSubgroupQuadSwapDiagonal);\n\n            symbolTable.relateToOperator(\"subgroupPartitionNV\",                          EOpSubgroupPartition);\n            symbolTable.relateToOperator(\"subgroupPartitionedAddNV\",                     EOpSubgroupPartitionedAdd);\n            symbolTable.relateToOperator(\"subgroupPartitionedMulNV\",                     EOpSubgroupPartitionedMul);\n            symbolTable.relateToOperator(\"subgroupPartitionedMinNV\",                     EOpSubgroupPartitionedMin);\n            symbolTable.relateToOperator(\"subgroupPartitionedMaxNV\",                     EOpSubgroupPartitionedMax);\n            symbolTable.relateToOperator(\"subgroupPartitionedAndNV\",                     EOpSubgroupPartitionedAnd);\n            symbolTable.relateToOperator(\"subgroupPartitionedOrNV\",                      EOpSubgroupPartitionedOr);\n            symbolTable.relateToOperator(\"subgroupPartitionedXorNV\",                     EOpSubgroupPartitionedXor);\n            symbolTable.relateToOperator(\"subgroupPartitionedInclusiveAddNV\",            EOpSubgroupPartitionedInclusiveAdd);\n            symbolTable.relateToOperator(\"subgroupPartitionedInclusiveMulNV\",            EOpSubgroupPartitionedInclusiveMul);\n            symbolTable.relateToOperator(\"subgroupPartitionedInclusiveMinNV\",            EOpSubgroupPartitionedInclusiveMin);\n            symbolTable.relateToOperator(\"subgroupPartitionedInclusiveMaxNV\",            EOpSubgroupPartitionedInclusiveMax);\n            symbolTable.relateToOperator(\"subgroupPartitionedInclusiveAndNV\",            EOpSubgroupPartitionedInclusiveAnd);\n            symbolTable.relateToOperator(\"subgroupPartitionedInclusiveOrNV\",             EOpSubgroupPartitionedInclusiveOr);\n            symbolTable.relateToOperator(\"subgroupPartitionedInclusiveXorNV\",            EOpSubgroupPartitionedInclusiveXor);\n            symbolTable.relateToOperator(\"subgroupPartitionedExclusiveAddNV\",            EOpSubgroupPartitionedExclusiveAdd);\n            symbolTable.relateToOperator(\"subgroupPartitionedExclusiveMulNV\",            EOpSubgroupPartitionedExclusiveMul);\n            symbolTable.relateToOperator(\"subgroupPartitionedExclusiveMinNV\",            EOpSubgroupPartitionedExclusiveMin);\n            symbolTable.relateToOperator(\"subgroupPartitionedExclusiveMaxNV\",            EOpSubgroupPartitionedExclusiveMax);\n            symbolTable.relateToOperator(\"subgroupPartitionedExclusiveAndNV\",            EOpSubgroupPartitionedExclusiveAnd);\n            symbolTable.relateToOperator(\"subgroupPartitionedExclusiveOrNV\",             EOpSubgroupPartitionedExclusiveOr);\n            symbolTable.relateToOperator(\"subgroupPartitionedExclusiveXorNV\",            EOpSubgroupPartitionedExclusiveXor);\n        }\n\n        if (profile == EEsProfile) {\n            symbolTable.relateToOperator(\"shadow2DEXT\",              EOpTexture);\n            symbolTable.relateToOperator(\"shadow2DProjEXT\",          EOpTextureProj);\n        }\n\n        // GL_EXT_shader_quad_control\n        if ((profile == EEsProfile && version >= 310) ||\n            (profile != EEsProfile && version >= 140)) {\n            symbolTable.relateToOperator(\"subgroupQuadAll\",                     EOpSubgroupQuadAll);\n            symbolTable.relateToOperator(\"subgroupQuadAny\",                     EOpSubgroupQuadAny);\n        }\n\n        if ((profile == EEsProfile && version >= 310) ||\n            (profile != EEsProfile && version >= 140)) {\n            symbolTable.relateToOperator(\"textureWeightedQCOM\",      EOpImageSampleWeightedQCOM);\n            symbolTable.relateToOperator(\"textureBoxFilterQCOM\",     EOpImageBoxFilterQCOM);\n            symbolTable.relateToOperator(\"textureBlockMatchSADQCOM\", EOpImageBlockMatchSADQCOM);\n            symbolTable.relateToOperator(\"textureBlockMatchSSDQCOM\", EOpImageBlockMatchSSDQCOM);\n\n            symbolTable.relateToOperator(\"textureBlockMatchWindowSSDQCOM\", EOpImageBlockMatchWindowSSDQCOM);\n            symbolTable.relateToOperator(\"textureBlockMatchWindowSADQCOM\", EOpImageBlockMatchWindowSADQCOM);\n            symbolTable.relateToOperator(\"textureBlockMatchGatherSSDQCOM\", EOpImageBlockMatchGatherSSDQCOM);\n            symbolTable.relateToOperator(\"textureBlockMatchGatherSADQCOM\", EOpImageBlockMatchGatherSADQCOM);\n        }\n\n        if (profile != EEsProfile && spvVersion.spv == 0) {\n            symbolTable.relateToOperator(\"texture1DArray\", EOpTexture);\n            symbolTable.relateToOperator(\"texture2DArray\", EOpTexture);\n            symbolTable.relateToOperator(\"shadow1DArray\", EOpTexture);\n            symbolTable.relateToOperator(\"shadow2DArray\", EOpTexture);\n\n            symbolTable.relateToOperator(\"texture1DArrayLod\", EOpTextureLod);\n            symbolTable.relateToOperator(\"texture2DArrayLod\", EOpTextureLod);\n            symbolTable.relateToOperator(\"shadow1DArrayLod\", EOpTextureLod);\n        }\n\n        symbolTable.relateToOperator(\"coopVecMatMulNV\",              EOpCooperativeVectorMatMulNV);\n        symbolTable.relateToOperator(\"coopVecMatMulAddNV\",           EOpCooperativeVectorMatMulAddNV);\n        symbolTable.relateToOperator(\"coopVecLoadNV\",                EOpCooperativeVectorLoadNV);\n        symbolTable.relateToOperator(\"coopVecStoreNV\",               EOpCooperativeVectorStoreNV);\n        symbolTable.relateToOperator(\"coopVecOuterProductAccumulateNV\", EOpCooperativeVectorOuterProductAccumulateNV);\n        symbolTable.relateToOperator(\"coopVecReduceSumAccumulateNV\",    EOpCooperativeVectorReduceSumAccumulateNV);\n    }\n\n    switch(language) {\n    case EShLangVertex:\n        break;\n\n    case EShLangTessControl:\n    case EShLangTessEvaluation:\n        break;\n\n    case EShLangGeometry:\n        symbolTable.relateToOperator(\"EmitStreamVertex\",   EOpEmitStreamVertex);\n        symbolTable.relateToOperator(\"EndStreamPrimitive\", EOpEndStreamPrimitive);\n        symbolTable.relateToOperator(\"EmitVertex\",         EOpEmitVertex);\n        symbolTable.relateToOperator(\"EndPrimitive\",       EOpEndPrimitive);\n        break;\n\n    case EShLangFragment:\n        if (profile != EEsProfile && version >= 400) {\n            symbolTable.relateToOperator(\"dFdxFine\",     EOpDPdxFine);\n            symbolTable.relateToOperator(\"dFdyFine\",     EOpDPdyFine);\n            symbolTable.relateToOperator(\"fwidthFine\",   EOpFwidthFine);\n            symbolTable.relateToOperator(\"dFdxCoarse\",   EOpDPdxCoarse);\n            symbolTable.relateToOperator(\"dFdyCoarse\",   EOpDPdyCoarse);\n            symbolTable.relateToOperator(\"fwidthCoarse\", EOpFwidthCoarse);\n        }\n\n        if (profile != EEsProfile && version >= 460) {\n            symbolTable.relateToOperator(\"rayQueryInitializeEXT\",                                             EOpRayQueryInitialize);\n            symbolTable.relateToOperator(\"rayQueryTerminateEXT\",                                              EOpRayQueryTerminate);\n            symbolTable.relateToOperator(\"rayQueryGenerateIntersectionEXT\",                                   EOpRayQueryGenerateIntersection);\n            symbolTable.relateToOperator(\"rayQueryConfirmIntersectionEXT\",                                    EOpRayQueryConfirmIntersection);\n            symbolTable.relateToOperator(\"rayQueryProceedEXT\",                                                EOpRayQueryProceed);\n            symbolTable.relateToOperator(\"rayQueryGetIntersectionTypeEXT\",                                    EOpRayQueryGetIntersectionType);\n            symbolTable.relateToOperator(\"rayQueryGetRayTMinEXT\",                                             EOpRayQueryGetRayTMin);\n            symbolTable.relateToOperator(\"rayQueryGetRayFlagsEXT\",                                            EOpRayQueryGetRayFlags);\n            symbolTable.relateToOperator(\"rayQueryGetIntersectionTEXT\",                                       EOpRayQueryGetIntersectionT);\n            symbolTable.relateToOperator(\"rayQueryGetIntersectionInstanceCustomIndexEXT\",                     EOpRayQueryGetIntersectionInstanceCustomIndex);\n            symbolTable.relateToOperator(\"rayQueryGetIntersectionInstanceIdEXT\",                              EOpRayQueryGetIntersectionInstanceId);\n            symbolTable.relateToOperator(\"rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT\",  EOpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffset);\n            symbolTable.relateToOperator(\"rayQueryGetIntersectionGeometryIndexEXT\",                           EOpRayQueryGetIntersectionGeometryIndex);\n            symbolTable.relateToOperator(\"rayQueryGetIntersectionPrimitiveIndexEXT\",                          EOpRayQueryGetIntersectionPrimitiveIndex);\n            symbolTable.relateToOperator(\"rayQueryGetIntersectionBarycentricsEXT\",                            EOpRayQueryGetIntersectionBarycentrics);\n            symbolTable.relateToOperator(\"rayQueryGetIntersectionFrontFaceEXT\",                               EOpRayQueryGetIntersectionFrontFace);\n            symbolTable.relateToOperator(\"rayQueryGetIntersectionCandidateAABBOpaqueEXT\",                     EOpRayQueryGetIntersectionCandidateAABBOpaque);\n            symbolTable.relateToOperator(\"rayQueryGetIntersectionObjectRayDirectionEXT\",                      EOpRayQueryGetIntersectionObjectRayDirection);\n            symbolTable.relateToOperator(\"rayQueryGetIntersectionObjectRayOriginEXT\",                         EOpRayQueryGetIntersectionObjectRayOrigin);\n            symbolTable.relateToOperator(\"rayQueryGetWorldRayDirectionEXT\",                                   EOpRayQueryGetWorldRayDirection);\n            symbolTable.relateToOperator(\"rayQueryGetWorldRayOriginEXT\",                                      EOpRayQueryGetWorldRayOrigin);\n            symbolTable.relateToOperator(\"rayQueryGetIntersectionObjectToWorldEXT\",                           EOpRayQueryGetIntersectionObjectToWorld);\n            symbolTable.relateToOperator(\"rayQueryGetIntersectionWorldToObjectEXT\",                           EOpRayQueryGetIntersectionWorldToObject);\n            symbolTable.relateToOperator(\"rayQueryGetIntersectionTriangleVertexPositionsEXT\",                 EOpRayQueryGetIntersectionTriangleVertexPositionsEXT);\n            symbolTable.relateToOperator(\"rayQueryGetIntersectionClusterIdNV\",                                EOpRayQueryGetIntersectionClusterIdNV);\n            symbolTable.relateToOperator(\"rayQueryGetIntersectionSpherePositionNV\",                           EOpRayQueryGetIntersectionSpherePositionNV);\n            symbolTable.relateToOperator(\"rayQueryGetIntersectionSphereRadiusNV\",                             EOpRayQueryGetIntersectionSphereRadiusNV);\n            symbolTable.relateToOperator(\"rayQueryGetIntersectionLSSHitValueNV\",                              EOpRayQueryGetIntersectionLSSHitValueNV);\n            symbolTable.relateToOperator(\"rayQueryGetIntersectionLSSPositionsNV\",                             EOpRayQueryGetIntersectionLSSPositionsNV);\n            symbolTable.relateToOperator(\"rayQueryGetIntersectionLSSRadiiNV\",                                 EOpRayQueryGetIntersectionLSSRadiiNV);\n            symbolTable.relateToOperator(\"rayQueryIsSphereHitNV\",                                             EOpRayQueryIsSphereHitNV);\n            symbolTable.relateToOperator(\"rayQueryIsLSSHitNV\",                                                EOpRayQueryIsLSSHitNV);\n        }\n\n        symbolTable.relateToOperator(\"interpolateAtCentroid\", EOpInterpolateAtCentroid);\n        symbolTable.relateToOperator(\"interpolateAtSample\",   EOpInterpolateAtSample);\n        symbolTable.relateToOperator(\"interpolateAtOffset\",   EOpInterpolateAtOffset);\n\n        if (profile != EEsProfile)\n            symbolTable.relateToOperator(\"interpolateAtVertexAMD\", EOpInterpolateAtVertex);\n\n        symbolTable.relateToOperator(\"beginInvocationInterlockARB\", EOpBeginInvocationInterlock);\n        symbolTable.relateToOperator(\"endInvocationInterlockARB\",   EOpEndInvocationInterlock);\n\n        symbolTable.relateToOperator(\"stencilAttachmentReadEXT\", EOpStencilAttachmentReadEXT);\n        symbolTable.relateToOperator(\"depthAttachmentReadEXT\",   EOpDepthAttachmentReadEXT);\n        symbolTable.relateToOperator(\"colorAttachmentReadEXT\",   EOpColorAttachmentReadEXT);\n\n        break;\n\n    case EShLangCompute:\n        symbolTable.relateToOperator(\"subgroupMemoryBarrierShared\", EOpSubgroupMemoryBarrierShared);\n        if ((profile != EEsProfile && version >= 450) ||\n            (profile == EEsProfile && version >= 320)) {\n            symbolTable.relateToOperator(\"dFdx\",        EOpDPdx);\n            symbolTable.relateToOperator(\"dFdy\",        EOpDPdy);\n            symbolTable.relateToOperator(\"fwidth\",      EOpFwidth);\n            symbolTable.relateToOperator(\"dFdxFine\",    EOpDPdxFine);\n            symbolTable.relateToOperator(\"dFdyFine\",    EOpDPdyFine);\n            symbolTable.relateToOperator(\"fwidthFine\",  EOpFwidthFine);\n            symbolTable.relateToOperator(\"dFdxCoarse\",  EOpDPdxCoarse);\n            symbolTable.relateToOperator(\"dFdyCoarse\",  EOpDPdyCoarse);\n            symbolTable.relateToOperator(\"fwidthCoarse\",EOpFwidthCoarse);\n        }\n        symbolTable.relateToOperator(\"coopMatLoadNV\",              EOpCooperativeMatrixLoadNV);\n        symbolTable.relateToOperator(\"coopMatStoreNV\",             EOpCooperativeMatrixStoreNV);\n        symbolTable.relateToOperator(\"coopMatMulAddNV\",            EOpCooperativeMatrixMulAddNV);\n\n        symbolTable.relateToOperator(\"coopMatLoad\",                EOpCooperativeMatrixLoad);\n        symbolTable.relateToOperator(\"coopMatStore\",               EOpCooperativeMatrixStore);\n        symbolTable.relateToOperator(\"coopMatMulAdd\",              EOpCooperativeMatrixMulAdd);\n\n        symbolTable.relateToOperator(\"coopMatLoadTensorNV\",        EOpCooperativeMatrixLoadTensorNV);\n        symbolTable.relateToOperator(\"coopMatStoreTensorNV\",       EOpCooperativeMatrixStoreTensorNV);\n\n        symbolTable.relateToOperator(\"coopMatReduceNV\",            EOpCooperativeMatrixReduceNV);\n        symbolTable.relateToOperator(\"coopMatPerElementNV\",        EOpCooperativeMatrixPerElementOpNV);\n        symbolTable.relateToOperator(\"coopMatTransposeNV\",         EOpCooperativeMatrixTransposeNV);\n\n        symbolTable.relateToOperator(\"createTensorLayoutNV\",         EOpCreateTensorLayoutNV);\n        symbolTable.relateToOperator(\"setTensorLayoutBlockSizeNV\",   EOpTensorLayoutSetBlockSizeNV);\n        symbolTable.relateToOperator(\"setTensorLayoutDimensionNV\",   EOpTensorLayoutSetDimensionNV);\n        symbolTable.relateToOperator(\"setTensorLayoutStrideNV\",      EOpTensorLayoutSetStrideNV);\n        symbolTable.relateToOperator(\"sliceTensorLayoutNV\",          EOpTensorLayoutSliceNV);\n        symbolTable.relateToOperator(\"setTensorLayoutClampValueNV\",  EOpTensorLayoutSetClampValueNV);\n\n        symbolTable.relateToOperator(\"createTensorViewNV\",           EOpCreateTensorViewNV);\n        symbolTable.relateToOperator(\"setTensorViewDimensionsNV\",    EOpTensorViewSetDimensionNV);\n        symbolTable.relateToOperator(\"setTensorViewStrideNV\",        EOpTensorViewSetStrideNV);\n        symbolTable.relateToOperator(\"setTensorViewClipNV\",          EOpTensorViewSetClipNV);\n\n        if (profile != EEsProfile && version >= 460) {\n            symbolTable.relateToOperator(\"fetchMicroTriangleVertexPositionNV\", EOpFetchMicroTriangleVertexPositionNV);\n            symbolTable.relateToOperator(\"fetchMicroTriangleVertexBarycentricNV\", EOpFetchMicroTriangleVertexBarycentricNV);\n        }\n        break;\n\n    case EShLangRayGen:\n        if (profile != EEsProfile && version >= 460) {\n            symbolTable.relateToOperator(\"fetchMicroTriangleVertexPositionNV\", EOpFetchMicroTriangleVertexPositionNV);\n            symbolTable.relateToOperator(\"fetchMicroTriangleVertexBarycentricNV\", EOpFetchMicroTriangleVertexBarycentricNV);\n        }\n        [[fallthrough]];\n    case EShLangClosestHit:\n    case EShLangMiss:\n        if (profile != EEsProfile && version >= 460) {\n            symbolTable.relateToOperator(\"traceNV\", EOpTraceNV);\n            symbolTable.relateToOperator(\"traceRayMotionNV\", EOpTraceRayMotionNV);\n            symbolTable.relateToOperator(\"traceRayEXT\", EOpTraceKHR);\n            symbolTable.relateToOperator(\"executeCallableNV\", EOpExecuteCallableNV);\n            symbolTable.relateToOperator(\"executeCallableEXT\", EOpExecuteCallableKHR);\n\n            symbolTable.relateToOperator(\"hitObjectTraceRayNV\", EOpHitObjectTraceRayNV);\n            symbolTable.relateToOperator(\"hitObjectTraceRayMotionNV\", EOpHitObjectTraceRayMotionNV);\n            symbolTable.relateToOperator(\"hitObjectRecordHitNV\", EOpHitObjectRecordHitNV);\n            symbolTable.relateToOperator(\"hitObjectRecordHitMotionNV\", EOpHitObjectRecordHitMotionNV);\n            symbolTable.relateToOperator(\"hitObjectRecordHitWithIndexNV\", EOpHitObjectRecordHitWithIndexNV);\n            symbolTable.relateToOperator(\"hitObjectRecordHitWithIndexMotionNV\", EOpHitObjectRecordHitWithIndexMotionNV);\n            symbolTable.relateToOperator(\"hitObjectRecordMissNV\", EOpHitObjectRecordMissNV);\n            symbolTable.relateToOperator(\"hitObjectRecordMissMotionNV\", EOpHitObjectRecordMissMotionNV);\n            symbolTable.relateToOperator(\"hitObjectRecordEmptyNV\", EOpHitObjectRecordEmptyNV);\n            symbolTable.relateToOperator(\"hitObjectExecuteShaderNV\", EOpHitObjectExecuteShaderNV);\n            symbolTable.relateToOperator(\"hitObjectIsEmptyNV\", EOpHitObjectIsEmptyNV);\n            symbolTable.relateToOperator(\"hitObjectIsMissNV\", EOpHitObjectIsMissNV);\n            symbolTable.relateToOperator(\"hitObjectIsHitNV\", EOpHitObjectIsHitNV);\n            symbolTable.relateToOperator(\"hitObjectGetRayTMinNV\", EOpHitObjectGetRayTMinNV);\n            symbolTable.relateToOperator(\"hitObjectGetRayTMaxNV\", EOpHitObjectGetRayTMaxNV);\n            symbolTable.relateToOperator(\"hitObjectGetObjectRayOriginNV\", EOpHitObjectGetObjectRayOriginNV);\n            symbolTable.relateToOperator(\"hitObjectGetObjectRayDirectionNV\", EOpHitObjectGetObjectRayDirectionNV);\n            symbolTable.relateToOperator(\"hitObjectGetWorldRayOriginNV\", EOpHitObjectGetWorldRayOriginNV);\n            symbolTable.relateToOperator(\"hitObjectGetWorldRayDirectionNV\", EOpHitObjectGetWorldRayDirectionNV);\n            symbolTable.relateToOperator(\"hitObjectGetWorldToObjectNV\", EOpHitObjectGetWorldToObjectNV);\n            symbolTable.relateToOperator(\"hitObjectGetObjectToWorldNV\", EOpHitObjectGetObjectToWorldNV);\n            symbolTable.relateToOperator(\"hitObjectGetInstanceCustomIndexNV\", EOpHitObjectGetInstanceCustomIndexNV);\n            symbolTable.relateToOperator(\"hitObjectGetInstanceIdNV\", EOpHitObjectGetInstanceIdNV);\n            symbolTable.relateToOperator(\"hitObjectGetGeometryIndexNV\", EOpHitObjectGetGeometryIndexNV);\n            symbolTable.relateToOperator(\"hitObjectGetPrimitiveIndexNV\", EOpHitObjectGetPrimitiveIndexNV);\n            symbolTable.relateToOperator(\"hitObjectGetHitKindNV\", EOpHitObjectGetHitKindNV);\n            symbolTable.relateToOperator(\"hitObjectGetAttributesNV\", EOpHitObjectGetAttributesNV);\n            symbolTable.relateToOperator(\"hitObjectGetCurrentTimeNV\", EOpHitObjectGetCurrentTimeNV);\n            symbolTable.relateToOperator(\"hitObjectGetShaderBindingTableRecordIndexNV\", EOpHitObjectGetShaderBindingTableRecordIndexNV);\n            symbolTable.relateToOperator(\"hitObjectGetShaderRecordBufferHandleNV\", EOpHitObjectGetShaderRecordBufferHandleNV);\n            symbolTable.relateToOperator(\"hitObjectGetClusterIdNV\", EOpHitObjectGetClusterIdNV);\n            symbolTable.relateToOperator(\"reorderThreadNV\", EOpReorderThreadNV);\n            symbolTable.relateToOperator(\"hitObjectGetSpherePositionNV\", EOpHitObjectGetSpherePositionNV);\n            symbolTable.relateToOperator(\"hitObjectGetSphereRadiusNV\", EOpHitObjectGetSphereRadiusNV);\n            symbolTable.relateToOperator(\"hitObjectGetLSSPositionsNV\", EOpHitObjectGetLSSPositionsNV);\n            symbolTable.relateToOperator(\"hitObjectGetLSSRadiiNV\", EOpHitObjectGetLSSRadiiNV);\n            symbolTable.relateToOperator(\"hitObjectIsSphereHitNV\", EOpHitObjectIsSphereHitNV);\n            symbolTable.relateToOperator(\"hitObjectIsLSSHitNV\", EOpHitObjectIsLSSHitNV);\n        }\n        break;\n    case EShLangIntersect:\n        if (profile != EEsProfile && version >= 460) {\n            symbolTable.relateToOperator(\"reportIntersectionNV\", EOpReportIntersection);\n            symbolTable.relateToOperator(\"reportIntersectionEXT\", EOpReportIntersection);\n        }\n        break;\n    case EShLangAnyHit:\n        if (profile != EEsProfile && version >= 460) {\n            symbolTable.relateToOperator(\"ignoreIntersectionNV\", EOpIgnoreIntersectionNV);\n            symbolTable.relateToOperator(\"terminateRayNV\", EOpTerminateRayNV);\n        }\n        break;\n    case EShLangCallable:\n        if (profile != EEsProfile && version >= 460) {\n            symbolTable.relateToOperator(\"executeCallableNV\", EOpExecuteCallableNV);\n            symbolTable.relateToOperator(\"executeCallableEXT\", EOpExecuteCallableKHR);\n        }\n        break;\n    case EShLangMesh:\n        if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {\n            symbolTable.relateToOperator(\"writePackedPrimitiveIndices4x8NV\", EOpWritePackedPrimitiveIndices4x8NV);\n            symbolTable.relateToOperator(\"memoryBarrierShared\", EOpMemoryBarrierShared);\n            symbolTable.relateToOperator(\"groupMemoryBarrier\", EOpGroupMemoryBarrier);\n            symbolTable.relateToOperator(\"subgroupMemoryBarrierShared\", EOpSubgroupMemoryBarrierShared);\n        }\n\n        if (profile != EEsProfile && version >= 450) {\n            symbolTable.relateToOperator(\"SetMeshOutputsEXT\", EOpSetMeshOutputsEXT);\n        }\n\n        if (profile != EEsProfile && version >= 460) {\n            // Builtins for GL_NV_displacement_micromap.\n            symbolTable.relateToOperator(\"fetchMicroTriangleVertexPositionNV\", EOpFetchMicroTriangleVertexPositionNV);\n            symbolTable.relateToOperator(\"fetchMicroTriangleVertexBarycentricNV\", EOpFetchMicroTriangleVertexBarycentricNV);\n        }\n        break;\n    case EShLangTask:\n        if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {\n            symbolTable.relateToOperator(\"memoryBarrierShared\", EOpMemoryBarrierShared);\n            symbolTable.relateToOperator(\"groupMemoryBarrier\", EOpGroupMemoryBarrier);\n            symbolTable.relateToOperator(\"subgroupMemoryBarrierShared\", EOpSubgroupMemoryBarrierShared);\n        }\n        if (profile != EEsProfile && version >= 450) {\n            symbolTable.relateToOperator(\"EmitMeshTasksEXT\", EOpEmitMeshTasksEXT);\n        }\n        break;\n\n    default:\n        assert(false && \"Language not supported\");\n    }\n}\n\n//\n// Add context-dependent (resource-specific) built-ins not handled by the above.  These\n// would be ones that need to be programmatically added because they cannot\n// be added by simple text strings.  For these, also\n// 1) Map built-in functions to operators, for those that will turn into an operation node\n//    instead of remaining a function call.\n// 2) Tag extension-related symbols added to their base version with their extensions, so\n//    that if an early version has the extension turned off, there is an error reported on use.\n//\nvoid TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable, const TBuiltInResource &resources)\n{\n    if (profile != EEsProfile && version >= 430 && version < 440) {\n        symbolTable.setVariableExtensions(\"gl_MaxTransformFeedbackBuffers\", 1, &E_GL_ARB_enhanced_layouts);\n        symbolTable.setVariableExtensions(\"gl_MaxTransformFeedbackInterleavedComponents\", 1, &E_GL_ARB_enhanced_layouts);\n    }\n    if (profile != EEsProfile && version >= 130 && version < 420) {\n        symbolTable.setVariableExtensions(\"gl_MinProgramTexelOffset\", 1, &E_GL_ARB_shading_language_420pack);\n        symbolTable.setVariableExtensions(\"gl_MaxProgramTexelOffset\", 1, &E_GL_ARB_shading_language_420pack);\n    }\n    if (profile != EEsProfile && version >= 150 && version < 410)\n        symbolTable.setVariableExtensions(\"gl_MaxViewports\", 1, &E_GL_ARB_viewport_array);\n\n    switch(language) {\n    case EShLangFragment:\n        // Set up gl_FragData based on current array size.\n        if (version == 100 || IncludeLegacy(version, profile, spvVersion) || (! ForwardCompatibility && profile != EEsProfile && version < 420)) {\n            TPrecisionQualifier pq = profile == EEsProfile ? EpqMedium : EpqNone;\n            TType fragData(EbtFloat, EvqFragColor, pq, 4);\n            TArraySizes* arraySizes = new TArraySizes;\n            arraySizes->addInnerSize(resources.maxDrawBuffers);\n            fragData.transferArraySizes(arraySizes);\n            symbolTable.insert(*new TVariable(NewPoolTString(\"gl_FragData\"), fragData));\n            SpecialQualifier(\"gl_FragData\", EvqFragColor, EbvFragData, symbolTable);\n        }\n\n        // GL_EXT_blend_func_extended\n        if (profile == EEsProfile && version >= 100) {\n           symbolTable.setVariableExtensions(\"gl_MaxDualSourceDrawBuffersEXT\",    1, &E_GL_EXT_blend_func_extended);\n           symbolTable.setVariableExtensions(\"gl_SecondaryFragColorEXT\",    1, &E_GL_EXT_blend_func_extended);\n           symbolTable.setVariableExtensions(\"gl_SecondaryFragDataEXT\",    1, &E_GL_EXT_blend_func_extended);\n           SpecialQualifier(\"gl_SecondaryFragColorEXT\", EvqVaryingOut, EbvSecondaryFragColorEXT, symbolTable);\n           SpecialQualifier(\"gl_SecondaryFragDataEXT\", EvqVaryingOut, EbvSecondaryFragDataEXT, symbolTable);\n        }\n\n        break;\n\n    case EShLangTessControl:\n    case EShLangTessEvaluation:\n        // Because of the context-dependent array size (gl_MaxPatchVertices),\n        // these variables were added later than the others and need to be mapped now.\n\n        // standard members\n        BuiltInVariable(\"gl_in\", \"gl_Position\",     EbvPosition,     symbolTable);\n        BuiltInVariable(\"gl_in\", \"gl_PointSize\",    EbvPointSize,    symbolTable);\n        BuiltInVariable(\"gl_in\", \"gl_ClipDistance\", EbvClipDistance, symbolTable);\n        BuiltInVariable(\"gl_in\", \"gl_CullDistance\", EbvCullDistance, symbolTable);\n\n        // compatibility members\n        BuiltInVariable(\"gl_in\", \"gl_ClipVertex\",          EbvClipVertex,          symbolTable);\n        BuiltInVariable(\"gl_in\", \"gl_FrontColor\",          EbvFrontColor,          symbolTable);\n        BuiltInVariable(\"gl_in\", \"gl_BackColor\",           EbvBackColor,           symbolTable);\n        BuiltInVariable(\"gl_in\", \"gl_FrontSecondaryColor\", EbvFrontSecondaryColor, symbolTable);\n        BuiltInVariable(\"gl_in\", \"gl_BackSecondaryColor\",  EbvBackSecondaryColor,  symbolTable);\n        BuiltInVariable(\"gl_in\", \"gl_TexCoord\",            EbvTexCoord,            symbolTable);\n        BuiltInVariable(\"gl_in\", \"gl_FogFragCoord\",        EbvFogFragCoord,        symbolTable);\n\n        symbolTable.setVariableExtensions(\"gl_in\", \"gl_SecondaryPositionNV\", 1, &E_GL_NV_stereo_view_rendering);\n        symbolTable.setVariableExtensions(\"gl_in\", \"gl_PositionPerViewNV\",   1, &E_GL_NVX_multiview_per_view_attributes);\n\n        BuiltInVariable(\"gl_in\", \"gl_SecondaryPositionNV\", EbvSecondaryPositionNV, symbolTable);\n        BuiltInVariable(\"gl_in\", \"gl_PositionPerViewNV\",   EbvPositionPerViewNV,   symbolTable);\n\n        // extension requirements\n        if (profile == EEsProfile) {\n            symbolTable.setVariableExtensions(\"gl_in\", \"gl_PointSize\", Num_AEP_tessellation_point_size, AEP_tessellation_point_size);\n        }\n\n        break;\n\n    default:\n        break;\n    }\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/Initialize.h",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2013-2016 LunarG, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#ifndef _INITIALIZE_INCLUDED_\n#define _INITIALIZE_INCLUDED_\n\n#include \"../Include/ResourceLimits.h\"\n#include \"../Include/Common.h\"\n#include \"../Include/ShHandle.h\"\n#include \"SymbolTable.h\"\n#include \"Versions.h\"\n\nnamespace glslang {\n\n//\n// This is made to hold parseable strings for almost all the built-in\n// functions and variables for one specific combination of version\n// and profile.  (Some still need to be added programmatically.)\n// This is a base class for language-specific derivations, which\n// can be used for language independent builtins.\n//\n// The strings are organized by\n//    commonBuiltins:  intersection of all stages' built-ins, processed just once\n//    stageBuiltins[]: anything a stage needs that's not in commonBuiltins\n//\nclass TBuiltInParseables {\npublic:\n    POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())\n    TBuiltInParseables();\n    virtual ~TBuiltInParseables();\n    virtual void initialize(int version, EProfile, const SpvVersion& spvVersion) = 0;\n    virtual void initialize(const TBuiltInResource& resources, int version, EProfile, const SpvVersion& spvVersion, EShLanguage) = 0;\n    virtual const TString& getCommonString() const { return commonBuiltins; }\n    virtual const TString& getStageString(EShLanguage language) const { return stageBuiltins[language]; }\n\n    virtual void identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable) = 0;\n    virtual void identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable, const TBuiltInResource &resources) = 0;\n\nprotected:\n    TString commonBuiltins;\n    TString stageBuiltins[EShLangCount];\n};\n\n//\n// This is a GLSL specific derivation of TBuiltInParseables.  To present a stable\n// interface and match other similar code, it is called TBuiltIns, rather\n// than TBuiltInParseablesGlsl.\n//\nclass TBuiltIns : public TBuiltInParseables {\npublic:\n    POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())\n    TBuiltIns();\n    virtual ~TBuiltIns();\n    void initialize(int version, EProfile, const SpvVersion& spvVersion);\n    void initialize(const TBuiltInResource& resources, int version, EProfile, const SpvVersion& spvVersion, EShLanguage);\n\n    void identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable);\n    void identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable, const TBuiltInResource &resources);\n\nprotected:\n    void addTabledBuiltins(int version, EProfile profile, const SpvVersion& spvVersion);\n    void relateTabledBuiltins(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage, TSymbolTable&);\n    void add2ndGenerationSamplingImaging(int version, EProfile profile, const SpvVersion& spvVersion);\n    void addSubpassSampling(TSampler, const TString& typeName, int version, EProfile profile);\n    void addQueryFunctions(TSampler, const TString& typeName, int version, EProfile profile);\n    void addImageFunctions(TSampler, const TString& typeName, int version, EProfile profile);\n    void addSamplingFunctions(TSampler, const TString& typeName, int version, EProfile profile);\n    void addGatherFunctions(TSampler, const TString& typeName, int version, EProfile profile);\n\n    // Helpers for making textual representations of the permutations\n    // of texturing/imaging functions.\n    const char* postfixes[5];\n    const char* prefixes[EbtNumTypes];\n    int dimMap[EsdNumDims];\n};\n\n// change this back to false if depending on textual spellings of texturing calls when consuming the AST\n// Using PureOperatorBuiltins=false is deprecated.\nconstexpr bool PureOperatorBuiltins = true;\n} // end namespace glslang\n\n#endif // _INITIALIZE_INCLUDED_\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/IntermTraverse.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2013 LunarG, Inc.\n// Copyright (c) 2002-2010 The ANGLE Project Authors.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#include \"../Include/intermediate.h\"\n\nnamespace glslang {\n\n//\n// Traverse the intermediate representation tree, and\n// call a node type specific function for each node.\n// Done recursively through the member function Traverse().\n// Node types can be skipped if their function to call is 0,\n// but their subtree will still be traversed.\n// Nodes with children can have their whole subtree skipped\n// if preVisit is turned on and the type specific function\n// returns false.\n//\n// preVisit, postVisit, and rightToLeft control what order\n// nodes are visited in.\n//\n\n//\n// Traversal functions for terminals are straightforward....\n//\nvoid TIntermMethod::traverse(TIntermTraverser*)\n{\n    // Tree should always resolve all methods as a non-method.\n}\n\nvoid TIntermSymbol::traverse(TIntermTraverser *it)\n{\n    it->visitSymbol(this);\n}\n\nvoid TIntermConstantUnion::traverse(TIntermTraverser *it)\n{\n    it->visitConstantUnion(this);\n}\n\nconst TString& TIntermSymbol::getAccessName() const {\n    if (getBasicType() == EbtBlock)\n        return getType().getTypeName();\n    else\n        return getName();\n}\n\n//\n// Traverse a binary node.\n//\nvoid TIntermBinary::traverse(TIntermTraverser *it)\n{\n    bool visit = true;\n\n    //\n    // visit the node before children if pre-visiting.\n    //\n    if (it->preVisit)\n        visit = it->visitBinary(EvPreVisit, this);\n\n    //\n    // Visit the children, in the right order.\n    //\n    if (visit) {\n        it->incrementDepth(this);\n\n        if (it->rightToLeft) {\n            if (right)\n                right->traverse(it);\n\n            if (it->inVisit)\n                visit = it->visitBinary(EvInVisit, this);\n\n            if (visit && left)\n                left->traverse(it);\n        } else {\n            if (left)\n                left->traverse(it);\n\n            if (it->inVisit)\n                visit = it->visitBinary(EvInVisit, this);\n\n            if (visit && right)\n                right->traverse(it);\n        }\n\n        it->decrementDepth();\n    }\n\n    //\n    // Visit the node after the children, if requested and the traversal\n    // hasn't been canceled yet.\n    //\n    if (visit && it->postVisit)\n        it->visitBinary(EvPostVisit, this);\n}\n\n//\n// Traverse a unary node.  Same comments in binary node apply here.\n//\nvoid TIntermUnary::traverse(TIntermTraverser *it)\n{\n    bool visit = true;\n\n    if (it->preVisit)\n        visit = it->visitUnary(EvPreVisit, this);\n\n    if (visit) {\n        it->incrementDepth(this);\n        operand->traverse(it);\n        it->decrementDepth();\n    }\n\n    if (visit && it->postVisit)\n        it->visitUnary(EvPostVisit, this);\n}\n\n//\n// Traverse an aggregate node.  Same comments in binary node apply here.\n//\nvoid TIntermAggregate::traverse(TIntermTraverser *it)\n{\n    bool visit = true;\n\n    if (it->preVisit)\n        visit = it->visitAggregate(EvPreVisit, this);\n\n    if (visit) {\n        it->incrementDepth(this);\n\n        if (it->rightToLeft) {\n            for (TIntermSequence::reverse_iterator sit = sequence.rbegin(); sit != sequence.rend(); sit++) {\n                (*sit)->traverse(it);\n\n                if (visit && it->inVisit) {\n                    if (*sit != sequence.front())\n                        visit = it->visitAggregate(EvInVisit, this);\n                }\n            }\n        } else {\n            for (TIntermSequence::iterator sit = sequence.begin(); sit != sequence.end(); sit++) {\n                (*sit)->traverse(it);\n\n                if (visit && it->inVisit) {\n                    if (*sit != sequence.back())\n                        visit = it->visitAggregate(EvInVisit, this);\n                }\n            }\n        }\n\n        it->decrementDepth();\n    }\n\n    if (visit && it->postVisit)\n        it->visitAggregate(EvPostVisit, this);\n}\n\n//\n// Traverse a selection node.  Same comments in binary node apply here.\n//\nvoid TIntermSelection::traverse(TIntermTraverser *it)\n{\n    bool visit = true;\n\n    if (it->preVisit)\n        visit = it->visitSelection(EvPreVisit, this);\n\n    if (visit) {\n        it->incrementDepth(this);\n        if (it->rightToLeft) {\n            if (falseBlock)\n                falseBlock->traverse(it);\n            if (trueBlock)\n                trueBlock->traverse(it);\n            condition->traverse(it);\n        } else {\n            condition->traverse(it);\n            if (trueBlock)\n                trueBlock->traverse(it);\n            if (falseBlock)\n                falseBlock->traverse(it);\n        }\n        it->decrementDepth();\n    }\n\n    if (visit && it->postVisit)\n        it->visitSelection(EvPostVisit, this);\n}\n\n//\n// Traverse a loop node.  Same comments in binary node apply here.\n//\nvoid TIntermLoop::traverse(TIntermTraverser *it)\n{\n    bool visit = true;\n\n    if (it->preVisit)\n        visit = it->visitLoop(EvPreVisit, this);\n\n    if (visit) {\n        it->incrementDepth(this);\n\n        if (it->rightToLeft) {\n            if (terminal)\n                terminal->traverse(it);\n\n            if (body)\n                body->traverse(it);\n\n            if (test)\n                test->traverse(it);\n        } else {\n            if (test)\n                test->traverse(it);\n\n            if (body)\n                body->traverse(it);\n\n            if (terminal)\n                terminal->traverse(it);\n        }\n\n        it->decrementDepth();\n    }\n\n    if (visit && it->postVisit)\n        it->visitLoop(EvPostVisit, this);\n}\n\n//\n// Traverse a branch node.  Same comments in binary node apply here.\n//\nvoid TIntermBranch::traverse(TIntermTraverser *it)\n{\n    bool visit = true;\n\n    if (it->preVisit)\n        visit = it->visitBranch(EvPreVisit, this);\n\n    if (visit && expression) {\n        it->incrementDepth(this);\n        expression->traverse(it);\n        it->decrementDepth();\n    }\n\n    if (visit && it->postVisit)\n        it->visitBranch(EvPostVisit, this);\n}\n\n//\n// Traverse a switch node.\n//\nvoid TIntermSwitch::traverse(TIntermTraverser* it)\n{\n    bool visit = true;\n\n    if (it->preVisit)\n        visit = it->visitSwitch(EvPreVisit, this);\n\n    if (visit) {\n        it->incrementDepth(this);\n        if (it->rightToLeft) {\n            body->traverse(it);\n            condition->traverse(it);\n        } else {\n            condition->traverse(it);\n            body->traverse(it);\n        }\n        it->decrementDepth();\n    }\n\n    if (visit && it->postVisit)\n        it->visitSwitch(EvPostVisit, this);\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/Intermediate.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2012-2015 LunarG, Inc.\n// Copyright (C) 2015-2020 Google, Inc.\n// Copyright (C) 2017 ARM Limited.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n//\n// Build the intermediate representation.\n//\n\n#include \"localintermediate.h\"\n#include \"RemoveTree.h\"\n#include \"SymbolTable.h\"\n#include \"propagateNoContraction.h\"\n\n#include <cfloat>\n#include <limits>\n#include <utility>\n#include <tuple>\n\nnamespace glslang {\n\n////////////////////////////////////////////////////////////////////////////\n//\n// First set of functions are to help build the intermediate representation.\n// These functions are not member functions of the nodes.\n// They are called from parser productions.\n//\n/////////////////////////////////////////////////////////////////////////////\n\n//\n// Add a terminal node for an identifier in an expression.\n//\n// Returns the added node.\n//\n\nTIntermSymbol* TIntermediate::addSymbol(long long id, const TString& name, const TString& mangledName, const TType& type, const TConstUnionArray& constArray,\n                                        TIntermTyped* constSubtree, const TSourceLoc& loc)\n{\n    TIntermSymbol* node = new TIntermSymbol(id, name, getStage(), type, &mangledName);\n    node->setLoc(loc);\n    node->setConstArray(constArray);\n    node->setConstSubtree(constSubtree);\n\n    return node;\n}\n\nTIntermSymbol* TIntermediate::addSymbol(const TIntermSymbol& intermSymbol)\n{\n    return addSymbol(intermSymbol.getId(),\n                     intermSymbol.getName(),\n                     intermSymbol.getMangledName(),\n                     intermSymbol.getType(),\n                     intermSymbol.getConstArray(),\n                     intermSymbol.getConstSubtree(),\n                     intermSymbol.getLoc());\n}\n\nTIntermSymbol* TIntermediate::addSymbol(const TVariable& variable)\n{\n    glslang::TSourceLoc loc; // just a null location\n    loc.init();\n\n    return addSymbol(variable, loc);\n}\n\nTIntermSymbol* TIntermediate::addSymbol(const TVariable& variable, const TSourceLoc& loc)\n{\n    return addSymbol(variable.getUniqueId(), variable.getName(), variable.getMangledName(), variable.getType(), variable.getConstArray(), variable.getConstSubtree(), loc);\n}\n\nTIntermSymbol* TIntermediate::addSymbol(const TType& type, const TSourceLoc& loc)\n{\n    TConstUnionArray unionArray;  // just a null constant\n\n    return addSymbol(0, \"\", \"\", type, unionArray, nullptr, loc);\n}\n\n//\n// Connect two nodes with a new parent that does a binary operation on the nodes.\n//\n// Returns the added node.\n//\n// Returns nullptr if the working conversions and promotions could not be found.\n//\nTIntermTyped* TIntermediate::addBinaryMath(TOperator op, TIntermTyped* left, TIntermTyped* right, const TSourceLoc& loc)\n{\n    // No operations work on blocks\n    if (left->getType().getBasicType() == EbtBlock || right->getType().getBasicType() == EbtBlock)\n        return nullptr;\n\n    // Convert \"reference +/- int\" and \"reference - reference\" to integer math\n    if (op == EOpAdd || op == EOpSub) {\n\n        // No addressing math on struct with unsized array.\n        if ((left->isReference() && left->getType().getReferentType()->containsUnsizedArray()) ||\n            (right->isReference() && right->getType().getReferentType()->containsUnsizedArray())) {\n            return nullptr;\n        }\n\n        if (left->isReference() && isTypeInt(right->getBasicType())) {\n            const TType& referenceType = left->getType();\n            TIntermConstantUnion* size = addConstantUnion((unsigned long long)computeBufferReferenceTypeSize(left->getType()), loc, true);\n            left  = addBuiltInFunctionCall(loc, EOpConvPtrToUint64, true, left, TType(EbtUint64));\n\n            right = createConversion(EbtInt64, right);\n            right = addBinaryMath(EOpMul, right, size, loc);\n\n            TIntermTyped *node = addBinaryMath(op, left, right, loc);\n            node = addBuiltInFunctionCall(loc, EOpConvUint64ToPtr, true, node, referenceType);\n            return node;\n        }\n    }\n\n    if (op == EOpAdd && right->isReference() && isTypeInt(left->getBasicType())) {\n        const TType& referenceType = right->getType();\n        TIntermConstantUnion* size =\n            addConstantUnion((unsigned long long)computeBufferReferenceTypeSize(right->getType()), loc, true);\n        right = addBuiltInFunctionCall(loc, EOpConvPtrToUint64, true, right, TType(EbtUint64));\n\n        left  = createConversion(EbtInt64, left);\n        left  = addBinaryMath(EOpMul, left, size, loc);\n\n        TIntermTyped *node = addBinaryMath(op, left, right, loc);\n        node = addBuiltInFunctionCall(loc, EOpConvUint64ToPtr, true, node, referenceType);\n        return node;\n    }\n\n    if (op == EOpSub && left->isReference() && right->isReference()) {\n        TIntermConstantUnion* size =\n            addConstantUnion((long long)computeBufferReferenceTypeSize(left->getType()), loc, true);\n\n        left = addBuiltInFunctionCall(loc, EOpConvPtrToUint64, true, left, TType(EbtUint64));\n        right = addBuiltInFunctionCall(loc, EOpConvPtrToUint64, true, right, TType(EbtUint64));\n\n        left = addBuiltInFunctionCall(loc, EOpConvNumeric, true, left, TType(EbtInt64));\n        right = addBuiltInFunctionCall(loc, EOpConvNumeric, true, right, TType(EbtInt64));\n\n        left = addBinaryMath(EOpSub, left, right, loc);\n\n        TIntermTyped *node = addBinaryMath(EOpDiv, left, size, loc);\n        return node;\n    }\n\n    // No other math operators supported on references\n    if (left->isReference() || right->isReference())\n        return nullptr;\n\n    // Try converting the children's base types to compatible types.\n    auto children = addPairConversion(op, left, right);\n    left = std::get<0>(children);\n    right = std::get<1>(children);\n\n    if (left == nullptr || right == nullptr)\n        return nullptr;\n\n    // Convert the children's type shape to be compatible.\n    addBiShapeConversion(op, left, right);\n    if (left == nullptr || right == nullptr)\n        return nullptr;\n\n    //\n    // Need a new node holding things together.  Make\n    // one and promote it to the right type.\n    //\n    TIntermBinary* node = addBinaryNode(op, left, right, loc);\n    if (! promote(node))\n        return nullptr;\n\n    node->updatePrecision();\n\n    //\n    // If they are both (non-specialization) constants, they must be folded.\n    // (Unless it's the sequence (comma) operator, but that's handled in addComma().)\n    //\n    TIntermConstantUnion *leftTempConstant = node->getLeft()->getAsConstantUnion();\n    TIntermConstantUnion *rightTempConstant = node->getRight()->getAsConstantUnion();\n    if (leftTempConstant && rightTempConstant) {\n        TIntermTyped* folded = leftTempConstant->fold(node->getOp(), rightTempConstant);\n        if (folded)\n            return folded;\n    }\n\n    // If can propagate spec-constantness and if the operation is an allowed\n    // specialization-constant operation, make a spec-constant.\n    if (specConstantPropagates(*node->getLeft(), *node->getRight()) && isSpecializationOperation(*node))\n        node->getWritableType().getQualifier().makeSpecConstant();\n\n    // If must propagate nonuniform, make a nonuniform.\n    if ((node->getLeft()->getQualifier().isNonUniform() || node->getRight()->getQualifier().isNonUniform()) &&\n            isNonuniformPropagating(node->getOp()))\n        node->getWritableType().getQualifier().nonUniform = true;\n\n    return node;\n}\n\n//\n// Low level: add binary node (no promotions or other argument modifications)\n//\nTIntermBinary* TIntermediate::addBinaryNode(TOperator op, TIntermTyped* left, TIntermTyped* right,\n    const TSourceLoc& loc) const\n{\n    // build the node\n    TIntermBinary* node = new TIntermBinary(op);\n    node->setLoc(loc.line != 0 ? loc : left->getLoc());\n    node->setLeft(left);\n    node->setRight(right);\n\n    return node;\n}\n\n//\n// like non-type form, but sets node's type.\n//\nTIntermBinary* TIntermediate::addBinaryNode(TOperator op, TIntermTyped* left, TIntermTyped* right,\n    const TSourceLoc& loc, const TType& type) const\n{\n    TIntermBinary* node = addBinaryNode(op, left, right, loc);\n    node->setType(type);\n    return node;\n}\n\n//\n// Low level: add unary node (no promotions or other argument modifications)\n//\nTIntermUnary* TIntermediate::addUnaryNode(TOperator op, TIntermTyped* child, const TSourceLoc& loc) const\n{\n    TIntermUnary* node = new TIntermUnary(op);\n    node->setLoc(loc.line != 0 ? loc : child->getLoc());\n    node->setOperand(child);\n\n    return node;\n}\n\n//\n// like non-type form, but sets node's type.\n//\nTIntermUnary* TIntermediate::addUnaryNode(TOperator op, TIntermTyped* child, const TSourceLoc& loc, const TType& type)\n    const\n{\n    TIntermUnary* node = addUnaryNode(op, child, loc);\n    node->setType(type);\n    return node;\n}\n\n//\n// Connect two nodes through an assignment.\n//\n// Returns the added node.\n//\n// Returns nullptr if the 'right' type could not be converted to match the 'left' type,\n// or the resulting operation cannot be properly promoted.\n//\nTIntermTyped* TIntermediate::addAssign(TOperator op, TIntermTyped* left, TIntermTyped* right,\n    const TSourceLoc& loc)\n{\n    // No block assignment\n    if (left->getType().getBasicType() == EbtBlock || right->getType().getBasicType() == EbtBlock)\n        return nullptr;\n\n    // Convert \"reference += int\" to \"reference = reference + int\". We need this because the\n    // \"reference + int\" calculation involves a cast back to the original type, which makes it\n    // not an lvalue.\n    if ((op == EOpAddAssign || op == EOpSubAssign) && left->isReference()) {\n        if (!(right->getType().isScalar() && right->getType().isIntegerDomain()))\n            return nullptr;\n\n        TIntermTyped* node = addBinaryMath(op == EOpAddAssign ? EOpAdd : EOpSub, left, right, loc);\n        if (!node)\n            return nullptr;\n\n        TIntermSymbol* symbol = left->getAsSymbolNode();\n        left = addSymbol(*symbol);\n\n        node = addAssign(EOpAssign, left, node, loc);\n        return node;\n    }\n\n    //\n    // Like adding binary math, except the conversion can only go\n    // from right to left.\n    //\n\n    // convert base types, nullptr return means not possible\n    right = addConversion(op, left->getType(), right);\n    if (right == nullptr)\n        return nullptr;\n\n    // convert shape\n    right = addUniShapeConversion(op, left->getType(), right);\n\n    // build the node\n    TIntermBinary* node = addBinaryNode(op, left, right, loc);\n\n    if (! promote(node))\n        return nullptr;\n\n    node->updatePrecision();\n\n    return node;\n}\n\n//\n// Connect two nodes through an index operator, where the left node is the base\n// of an array or struct, and the right node is a direct or indirect offset.\n//\n// Returns the added node.\n// The caller should set the type of the returned node.\n//\nTIntermTyped* TIntermediate::addIndex(TOperator op, TIntermTyped* base, TIntermTyped* index,\n    const TSourceLoc& loc)\n{\n    // caller should set the type\n    return addBinaryNode(op, base, index, loc);\n}\n\n//\n// Add one node as the parent of another that it operates on.\n//\n// Returns the added node.\n//\nTIntermTyped* TIntermediate::addUnaryMath(TOperator op, TIntermTyped* child,\n    const TSourceLoc& loc)\n{\n    if (child == nullptr)\n        return nullptr;\n\n    if (child->getType().getBasicType() == EbtBlock)\n        return nullptr;\n\n    switch (op) {\n    case EOpLogicalNot:\n        if (getSource() == EShSourceHlsl) {\n            break; // HLSL can promote logical not\n        }\n\n        if (child->getType().getBasicType() != EbtBool || child->getType().isMatrix() || child->getType().isArray() || child->getType().isVector()) {\n            return nullptr;\n        }\n        break;\n\n    case EOpPostIncrement:\n    case EOpPreIncrement:\n    case EOpPostDecrement:\n    case EOpPreDecrement:\n    case EOpNegative:\n        if (child->getType().getBasicType() == EbtStruct || child->getType().isArray())\n            return nullptr;\n        break;\n    default: break; // some compilers want this\n    }\n\n    //\n    // Do we need to promote the operand?\n    //\n    TBasicType newType = EbtVoid;\n    switch (op) {\n    case EOpConstructBool:   newType = EbtBool;   break;\n    case EOpConstructFloat:  newType = EbtFloat;  break;\n    case EOpConstructInt:    newType = EbtInt;    break;\n    case EOpConstructUint:   newType = EbtUint;   break;\n    case EOpConstructInt8:   newType = EbtInt8;   break;\n    case EOpConstructUint8:  newType = EbtUint8;  break;\n    case EOpConstructInt16:  newType = EbtInt16;  break;\n    case EOpConstructUint16: newType = EbtUint16; break;\n    case EOpConstructInt64:  newType = EbtInt64;  break;\n    case EOpConstructUint64: newType = EbtUint64; break;\n    case EOpConstructDouble: newType = EbtDouble; break;\n    case EOpConstructFloat16: newType = EbtFloat16; break;\n    case EOpConstructBFloat16: newType = EbtBFloat16; break;\n    case EOpConstructFloatE4M3: newType = EbtFloatE4M3; break;\n    case EOpConstructFloatE5M2: newType = EbtFloatE5M2; break;\n    default: break; // some compilers want this\n    }\n\n    if (newType != EbtVoid) {\n        child = addConversion(op, TType(newType, EvqTemporary, child->getVectorSize(),\n                                                               child->getMatrixCols(),\n                                                               child->getMatrixRows(),\n                                                               child->isVector()),\n                              child);\n        if (child == nullptr)\n            return nullptr;\n    }\n\n    //\n    // For constructors, we are now done, it was all in the conversion.\n    // TODO: but, did this bypass constant folding?\n    //\n    switch (op) {\n        case EOpConstructInt8:\n        case EOpConstructUint8:\n        case EOpConstructInt16:\n        case EOpConstructUint16:\n        case EOpConstructInt:\n        case EOpConstructUint:\n        case EOpConstructInt64:\n        case EOpConstructUint64:\n        case EOpConstructBool:\n        case EOpConstructFloat:\n        case EOpConstructDouble:\n        case EOpConstructFloat16:\n        case EOpConstructBFloat16:\n        case EOpConstructFloatE5M2:\n        case EOpConstructFloatE4M3: {\n            TIntermUnary* unary_node = child->getAsUnaryNode();\n            if (unary_node != nullptr)\n                unary_node->updatePrecision();\n            return child;\n        }\n        default: break; // some compilers want this\n    }\n\n    //\n    // Make a new node for the operator.\n    //\n    TIntermUnary* node = addUnaryNode(op, child, loc);\n\n    if (! promote(node))\n        return nullptr;\n\n    node->updatePrecision();\n\n    // If it's a (non-specialization) constant, it must be folded.\n    if (node->getOperand()->getAsConstantUnion())\n        return node->getOperand()->getAsConstantUnion()->fold(op, node->getType());\n\n    // If it's a specialization constant, the result is too,\n    // if the operation is allowed for specialization constants.\n    if (node->getOperand()->getType().getQualifier().isSpecConstant() && isSpecializationOperation(*node))\n        node->getWritableType().getQualifier().makeSpecConstant();\n\n    // If must propagate nonuniform, make a nonuniform.\n    if (node->getOperand()->getQualifier().isNonUniform() && isNonuniformPropagating(node->getOp()))\n        node->getWritableType().getQualifier().nonUniform = true;\n\n    return node;\n}\n\nTIntermTyped* TIntermediate::addBuiltInFunctionCall(const TSourceLoc& loc, TOperator op, bool unary,\n    TIntermNode* childNode, const TType& returnType)\n{\n    if (unary) {\n        //\n        // Treat it like a unary operator.\n        // addUnaryMath() should get the type correct on its own;\n        // including constness (which would differ from the prototype).\n        //\n        TIntermTyped* child = childNode->getAsTyped();\n        if (child == nullptr)\n            return nullptr;\n\n        if (child->getAsConstantUnion()) {\n            TIntermTyped* folded = child->getAsConstantUnion()->fold(op, returnType);\n            if (folded)\n                return folded;\n        }\n\n        return addUnaryNode(op, child, child->getLoc(), returnType);\n    } else {\n        // setAggregateOperater() calls fold() for constant folding\n        TIntermTyped* node = setAggregateOperator(childNode, op, returnType, loc);\n\n        return node;\n    }\n}\n\n//\n// This is the safe way to change the operator on an aggregate, as it\n// does lots of error checking and fixing.  Especially for establishing\n// a function call's operation on its set of parameters.  Sequences\n// of instructions are also aggregates, but they just directly set\n// their operator to EOpSequence.\n//\n// Returns an aggregate node, which could be the one passed in if\n// it was already an aggregate.\n//\nTIntermTyped* TIntermediate::setAggregateOperator(TIntermNode* node, TOperator op, const TType& type,\n    const TSourceLoc& loc)\n{\n    TIntermAggregate* aggNode;\n\n    //\n    // Make sure we have an aggregate.  If not turn it into one.\n    //\n    if (node != nullptr) {\n        aggNode = node->getAsAggregate();\n        if (aggNode == nullptr || aggNode->getOp() != EOpNull) {\n            //\n            // Make an aggregate containing this node.\n            //\n            aggNode = new TIntermAggregate();\n            aggNode->getSequence().push_back(node);\n        }\n    } else\n        aggNode = new TIntermAggregate();\n\n    //\n    // Set the operator.\n    //\n    aggNode->setOperator(op);\n    if (loc.line != 0 || node != nullptr)\n        aggNode->setLoc(loc.line != 0 ? loc : node->getLoc());\n\n    aggNode->setType(type);\n\n    return fold(aggNode);\n}\n\nbool TIntermediate::isConversionAllowed(TOperator op, TIntermTyped* node) const\n{\n    //\n    // Does the base type even allow the operation?\n    //\n    switch (node->getBasicType()) {\n    case EbtVoid:\n        return false;\n    case EbtAtomicUint:\n    case EbtSampler:\n    case EbtAccStruct:\n        // opaque types can be passed to functions\n        if (op == EOpFunction)\n            break;\n\n        // HLSL can assign samplers directly (no constructor)\n        if (getSource() == EShSourceHlsl && node->getBasicType() == EbtSampler)\n            break;\n\n        // samplers can get assigned via a sampler constructor\n        // (well, not yet, but code in the rest of this function is ready for it)\n        if (node->getBasicType() == EbtSampler && op == EOpAssign &&\n            node->getAsOperator() != nullptr && node->getAsOperator()->getOp() == EOpConstructTextureSampler)\n            break;\n\n        // otherwise, opaque types can't even be operated on, let alone converted\n        return false;\n    default:\n        break;\n    }\n\n    return true;\n}\n\nbool TIntermediate::buildConvertOp(TBasicType dst, TBasicType src, TOperator& newOp) const\n{\n    // (bfloat16_t,fp8) <-> bool not supported\n    if (((src == EbtBFloat16 || src == EbtFloatE5M2 || src == EbtFloatE4M3) && dst == EbtBool) ||\n        ((dst == EbtBFloat16 || dst == EbtFloatE5M2 || dst == EbtFloatE4M3) && src == EbtBool)) {\n        return false;\n    }\n\n    if ((isTypeInt(dst) || isTypeFloat(dst) || dst == EbtBool) &&\n        (isTypeInt(src) || isTypeFloat(src) || src == EbtBool)) {\n        newOp = EOpConvNumeric;\n        return true;\n    }\n    return false;\n}\n\n// This is 'mechanism' here, it does any conversion told.\n// It is about basic type, not about shape.\n// The policy comes from the shader or the calling code.\nTIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped* node) const\n{\n    //\n    // Add a new newNode for the conversion.\n    //\n\n    bool convertToIntTypes = (convertTo == EbtInt8  || convertTo == EbtUint8  ||\n                              convertTo == EbtInt16 || convertTo == EbtUint16 ||\n                              convertTo == EbtInt   || convertTo == EbtUint   ||\n                              convertTo == EbtInt64 || convertTo == EbtUint64);\n\n    bool convertFromIntTypes = (node->getBasicType() == EbtInt8  || node->getBasicType() == EbtUint8  ||\n                                node->getBasicType() == EbtInt16 || node->getBasicType() == EbtUint16 ||\n                                node->getBasicType() == EbtInt   || node->getBasicType() == EbtUint   ||\n                                node->getBasicType() == EbtInt64 || node->getBasicType() == EbtUint64);\n\n    bool convertToFloatTypes = (convertTo == EbtFloat16 || convertTo == EbtBFloat16 || convertTo == EbtFloat || convertTo == EbtDouble ||\n                                convertTo == EbtFloatE5M2 || convertTo == EbtFloatE4M3);\n\n    bool convertFromFloatTypes = (node->getBasicType() == EbtFloat16 ||\n                                  node->getBasicType() == EbtBFloat16 ||\n                                  node->getBasicType() == EbtFloat ||\n                                  node->getBasicType() == EbtDouble ||\n                                  node->getBasicType() == EbtFloatE5M2 ||\n                                  node->getBasicType() == EbtFloatE4M3);\n\n    if (((convertTo == EbtInt8 || convertTo == EbtUint8) && ! convertFromIntTypes) ||\n        ((node->getBasicType() == EbtInt8 || node->getBasicType() == EbtUint8) && ! convertToIntTypes)) {\n        if (! getArithemeticInt8Enabled()) {\n            return nullptr;\n        }\n    }\n\n    if (((convertTo == EbtInt16 || convertTo == EbtUint16) && ! convertFromIntTypes) ||\n        ((node->getBasicType() == EbtInt16 || node->getBasicType() == EbtUint16) && ! convertToIntTypes)) {\n        if (! getArithemeticInt16Enabled()) {\n            return nullptr;\n        }\n    }\n\n    if ((convertTo == EbtFloat16 && ! convertFromFloatTypes) ||\n        (node->getBasicType() == EbtFloat16 && ! convertToFloatTypes)) {\n        if (! getArithemeticFloat16Enabled()) {\n            return nullptr;\n        }\n    }\n\n    TIntermUnary* newNode = nullptr;\n    TOperator newOp = EOpNull;\n    if (!buildConvertOp(convertTo, node->getBasicType(), newOp)) {\n        return nullptr;\n    }\n\n    TType newType(convertTo, EvqTemporary, node->getVectorSize(), node->getMatrixCols(), node->getMatrixRows());\n    newNode = addUnaryNode(newOp, node, node->getLoc(), newType);\n\n    if (node->getAsConstantUnion()) {\n        // 8/16-bit storage extensions don't support 8/16-bit constants, so don't fold conversions\n        // to those types\n        if ((getArithemeticInt8Enabled() || !(convertTo == EbtInt8 || convertTo == EbtUint8)) &&\n            (getArithemeticInt16Enabled() || !(convertTo == EbtInt16 || convertTo == EbtUint16)) &&\n            (getArithemeticFloat16Enabled() || !(convertTo == EbtFloat16)))\n        {\n            TIntermTyped* folded = node->getAsConstantUnion()->fold(newOp, newType);\n            if (folded)\n                return folded;\n        }\n    }\n\n    // Propagate specialization-constant-ness, if allowed\n    if (node->getType().getQualifier().isSpecConstant() && isSpecializationOperation(*newNode))\n        newNode->getWritableType().getQualifier().makeSpecConstant();\n\n    return newNode;\n}\n\nTIntermTyped* TIntermediate::addConversion(TBasicType convertTo, TIntermTyped* node) const\n{\n    return createConversion(convertTo, node);\n}\n\n// For converting a pair of operands to a binary operation to compatible\n// types with each other, relative to the operation in 'op'.\n// This does not cover assignment operations, which is asymmetric in that the\n// left type is not changeable.\n// See addConversion(op, type, node) for assignments and unary operation\n// conversions.\n//\n// Generally, this is focused on basic type conversion, not shape conversion.\n// See addShapeConversion() for shape conversions.\n//\n// Returns the converted pair of nodes.\n// Returns <nullptr, nullptr> when there is no conversion.\nstd::tuple<TIntermTyped*, TIntermTyped*>\nTIntermediate::addPairConversion(TOperator op, TIntermTyped* node0, TIntermTyped* node1)\n{\n    if (!isConversionAllowed(op, node0) || !isConversionAllowed(op, node1))\n        return std::make_tuple(nullptr, nullptr);\n\n    if (node0->getType() != node1->getType()) {\n        // If differing structure, then no conversions.\n        if (node0->isStruct() || node1->isStruct())\n            return std::make_tuple(nullptr, nullptr);\n\n        // If differing arrays, then no conversions.\n        if (node0->getType().isArray() || node1->getType().isArray())\n            return std::make_tuple(nullptr, nullptr);\n\n        // No implicit conversions for operations involving cooperative matrices\n        if (node0->getType().isCoopMat() || node1->getType().isCoopMat())\n            return std::make_tuple(node0, node1);\n    }\n\n    auto promoteTo = std::make_tuple(EbtNumTypes, EbtNumTypes);\n\n    switch (op) {\n    //\n    // List all the binary ops that can implicitly convert one operand to the other's type;\n    // This implements the 'policy' for implicit type conversion.\n    //\n    case EOpLessThan:\n    case EOpGreaterThan:\n    case EOpLessThanEqual:\n    case EOpGreaterThanEqual:\n    case EOpEqual:\n    case EOpNotEqual:\n\n    case EOpAdd:\n    case EOpSub:\n    case EOpMul:\n    case EOpDiv:\n    case EOpMod:\n\n    case EOpVectorTimesScalar:\n    case EOpVectorTimesMatrix:\n    case EOpMatrixTimesVector:\n    case EOpMatrixTimesScalar:\n\n    case EOpAnd:\n    case EOpInclusiveOr:\n    case EOpExclusiveOr:\n\n    case EOpSequence:          // used by ?:\n\n        if (node0->getBasicType() == node1->getBasicType())\n            return std::make_tuple(node0, node1);\n\n        promoteTo = getConversionDestinationType(node0->getBasicType(), node1->getBasicType(), op);\n        if (std::get<0>(promoteTo) == EbtNumTypes || std::get<1>(promoteTo) == EbtNumTypes)\n            return std::make_tuple(nullptr, nullptr);\n\n        break;\n\n    case EOpLogicalAnd:\n    case EOpLogicalOr:\n    case EOpLogicalXor:\n        if (getSource() == EShSourceHlsl)\n            promoteTo = std::make_tuple(EbtBool, EbtBool);\n        else\n            return std::make_tuple(node0, node1);\n        break;\n\n    // There are no conversions needed for GLSL; the shift amount just needs to be an\n    // integer type, as does the base.\n    // HLSL can promote bools to ints to make this work.\n    case EOpLeftShift:\n    case EOpRightShift:\n        if (getSource() == EShSourceHlsl) {\n            TBasicType node0BasicType = node0->getBasicType();\n            if (node0BasicType == EbtBool)\n                node0BasicType = EbtInt;\n            if (node1->getBasicType() == EbtBool)\n                promoteTo = std::make_tuple(node0BasicType, EbtInt);\n            else\n                promoteTo = std::make_tuple(node0BasicType, node1->getBasicType());\n        } else {\n            if (isTypeInt(node0->getBasicType()) && isTypeInt(node1->getBasicType()))\n                return std::make_tuple(node0, node1);\n            else\n                return std::make_tuple(nullptr, nullptr);\n        }\n        break;\n\n    default:\n        if (node0->getType() == node1->getType())\n            return std::make_tuple(node0, node1);\n\n        return std::make_tuple(nullptr, nullptr);\n    }\n\n    TIntermTyped* newNode0;\n    TIntermTyped* newNode1;\n\n    if (std::get<0>(promoteTo) != node0->getType().getBasicType()) {\n        if (node0->getAsConstantUnion())\n            newNode0 = promoteConstantUnion(std::get<0>(promoteTo), node0->getAsConstantUnion());\n        else\n            newNode0 = createConversion(std::get<0>(promoteTo), node0);\n    } else\n        newNode0 = node0;\n\n    if (std::get<1>(promoteTo) != node1->getType().getBasicType()) {\n        if (node1->getAsConstantUnion())\n            newNode1 = promoteConstantUnion(std::get<1>(promoteTo), node1->getAsConstantUnion());\n        else\n            newNode1 = createConversion(std::get<1>(promoteTo), node1);\n    } else\n        newNode1 = node1;\n\n    return std::make_tuple(newNode0, newNode1);\n}\n\n//\n// Convert the node's type to the given type, as allowed by the operation involved: 'op'.\n// For implicit conversions, 'op' is not the requested conversion, it is the explicit\n// operation requiring the implicit conversion.\n//\n// Binary operation conversions should be handled by addConversion(op, node, node), not here.\n//\n// Returns a node representing the conversion, which could be the same\n// node passed in if no conversion was needed.\n//\n// Generally, this is focused on basic type conversion, not shape conversion.\n// See addShapeConversion() for shape conversions.\n//\n// Return nullptr if a conversion can't be done.\n//\nTIntermTyped* TIntermediate::addConversion(TOperator op, const TType& type, TIntermTyped* node)\n{\n    if (!isConversionAllowed(op, node))\n        return nullptr;\n\n    // Otherwise, if types are identical, no problem\n    if (type == node->getType())\n        return node;\n\n    // If one's a structure, then no conversions.\n    if (type.isStruct() || node->isStruct())\n        return nullptr;\n\n    // If one's an array, then no conversions.\n    if (type.isArray() || node->getType().isArray())\n        return nullptr;\n\n    // Reject implicit conversions to cooperative matrix types\n    if (node->getType().isCoopMat() &&\n        op != EOpConstructCooperativeMatrixNV &&\n        op != EOpConstructCooperativeMatrixKHR)\n        return nullptr;\n\n    if (node->getType().isTensorLayoutNV() ||\n        node->getType().isTensorViewNV())\n        return nullptr;\n\n    // Reject implicit conversions to cooperative vector types\n    if (node->getType().isCoopVecNV() &&\n        op != EOpConstructCooperativeVectorNV)\n        return nullptr;\n\n    // Note: callers are responsible for other aspects of shape,\n    // like vector and matrix sizes.\n\n    switch (op) {\n    //\n    // Explicit conversions (unary operations)\n    //\n    case EOpConstructBool:\n    case EOpConstructFloat:\n    case EOpConstructInt:\n    case EOpConstructUint:\n    case EOpConstructDouble:\n    case EOpConstructFloat16:\n    case EOpConstructBFloat16:\n    case EOpConstructFloatE5M2:\n    case EOpConstructFloatE4M3:\n    case EOpConstructInt8:\n    case EOpConstructUint8:\n    case EOpConstructInt16:\n    case EOpConstructUint16:\n    case EOpConstructInt64:\n    case EOpConstructUint64:\n    case EOpConstructSaturated:\n        break;\n\n    //\n    // Implicit conversions\n    //\n    case EOpLogicalNot:\n\n    case EOpFunctionCall:\n\n    case EOpReturn:\n    case EOpAssign:\n    case EOpAddAssign:\n    case EOpSubAssign:\n    case EOpMulAssign:\n    case EOpVectorTimesScalarAssign:\n    case EOpMatrixTimesScalarAssign:\n    case EOpDivAssign:\n    case EOpModAssign:\n    case EOpAndAssign:\n    case EOpInclusiveOrAssign:\n    case EOpExclusiveOrAssign:\n\n    case EOpAtan:\n    case EOpClamp:\n    case EOpCross:\n    case EOpDistance:\n    case EOpDot:\n    case EOpDst:\n    case EOpFaceForward:\n    case EOpFma:\n    case EOpFrexp:\n    case EOpLdexp:\n    case EOpMix:\n    case EOpLit:\n    case EOpMax:\n    case EOpMin:\n    case EOpMod:\n    case EOpModf:\n    case EOpPow:\n    case EOpReflect:\n    case EOpRefract:\n    case EOpSmoothStep:\n    case EOpStep:\n\n    case EOpSequence:\n    case EOpConstructStruct:\n    case EOpConstructCooperativeMatrixNV:\n    case EOpConstructCooperativeMatrixKHR:\n    case EOpConstructCooperativeVectorNV:\n\n        if (type.isReference() || node->getType().isReference()) {\n            // types must match to assign a reference\n            if (type == node->getType())\n                return node;\n            else\n                return nullptr;\n        }\n\n        if (type.getBasicType() == node->getType().getBasicType())\n            return node;\n\n        if (! canImplicitlyPromote(node->getBasicType(), type.getBasicType(), op))\n            return nullptr;\n        break;\n\n    // For GLSL, there are no conversions needed; the shift amount just needs to be an\n    // integer type, as do the base/result.\n    // HLSL can convert the shift from a bool to an int.\n    case EOpLeftShiftAssign:\n    case EOpRightShiftAssign:\n    {\n        if (!(getSource() == EShSourceHlsl && node->getType().getBasicType() == EbtBool)) {\n            if (isTypeInt(type.getBasicType()) && isTypeInt(node->getBasicType()))\n                return node;\n            else\n                return nullptr;\n        }\n        break;\n    }\n\n    default:\n        // default is to require a match; all exceptions should have case statements above\n\n        if (type.getBasicType() == node->getType().getBasicType())\n            return node;\n        else\n            return nullptr;\n    }\n\n    bool canPromoteConstant = true;\n    // GL_EXT_shader_16bit_storage can't do OpConstantComposite with\n    // 16-bit types, so disable promotion for those types.\n    // Many issues with this, from JohnK:\n    //  - this isn't really right to discuss SPIR-V here\n    //  - this could easily be entirely about scalars, so is overstepping\n    //  - we should be looking at what the shader asked for, and saying whether or\n    //    not it can be done, in the parser, by calling requireExtensions(), not\n    //    changing language sementics on the fly by asking what extensions are in use\n    //  - at the time of this writing (14-Aug-2020), no test results are changed by this.\n    switch (op) {\n    case EOpConstructBFloat16:\n    case EOpConstructFloatE5M2:\n    case EOpConstructFloatE4M3:\n        canPromoteConstant = true;\n        break;\n    case EOpConstructFloat16:\n        canPromoteConstant = numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types) ||\n                             numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_float16);\n        break;\n    case EOpConstructInt8:\n    case EOpConstructUint8:\n        canPromoteConstant = numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types) ||\n                             numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_int8);\n        break;\n    case EOpConstructInt16:\n    case EOpConstructUint16:\n        canPromoteConstant = numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types) ||\n                             numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_int16);\n        break;\n    default:\n        break;\n    }\n\n    if (canPromoteConstant && node->getAsConstantUnion())\n        return promoteConstantUnion(type.getBasicType(), node->getAsConstantUnion());\n\n    //\n    // Add a new newNode for the conversion.\n    //\n    TIntermTyped* newNode = createConversion(type.getBasicType(), node);\n\n    return newNode;\n}\n\n// Convert the node's shape of type for the given type, as allowed by the\n// operation involved: 'op'.  This is for situations where there is only one\n// direction to consider doing the shape conversion.\n//\n// This implements policy, it call addShapeConversion() for the mechanism.\n//\n// Generally, the AST represents allowed GLSL shapes, so this isn't needed\n// for GLSL.  Bad shapes are caught in conversion or promotion.\n//\n// Return 'node' if no conversion was done. Promotion handles final shape\n// checking.\n//\nTIntermTyped* TIntermediate::addUniShapeConversion(TOperator op, const TType& type, TIntermTyped* node)\n{\n    // some source languages don't do this\n    switch (getSource()) {\n    case EShSourceHlsl:\n        break;\n    case EShSourceGlsl:\n    default:\n        return node;\n    }\n\n    // some operations don't do this\n    switch (op) {\n    case EOpFunctionCall:\n    case EOpReturn:\n        break;\n\n    case EOpMulAssign:\n        // want to support vector *= scalar native ops in AST and lower, not smear, similarly for\n        // matrix *= scalar, etc.\n\n    case EOpAddAssign:\n    case EOpSubAssign:\n    case EOpDivAssign:\n    case EOpAndAssign:\n    case EOpInclusiveOrAssign:\n    case EOpExclusiveOrAssign:\n    case EOpRightShiftAssign:\n    case EOpLeftShiftAssign:\n        if (node->getVectorSize() == 1)\n            return node;\n        break;\n\n    case EOpAssign:\n        break;\n\n    case EOpMix:\n        break;\n\n    default:\n        return node;\n    }\n\n    return addShapeConversion(type, node);\n}\n\n// Convert the nodes' shapes to be compatible for the operation 'op'.\n//\n// This implements policy, it call addShapeConversion() for the mechanism.\n//\n// Generally, the AST represents allowed GLSL shapes, so this isn't needed\n// for GLSL.  Bad shapes are caught in conversion or promotion.\n//\nvoid TIntermediate::addBiShapeConversion(TOperator op, TIntermTyped*& lhsNode, TIntermTyped*& rhsNode)\n{\n    // some source languages don't do this\n    switch (getSource()) {\n    case EShSourceHlsl:\n        break;\n    case EShSourceGlsl:\n    default:\n        return;\n    }\n\n    // some operations don't do this\n    // 'break' will mean attempt bidirectional conversion\n    switch (op) {\n    case EOpMulAssign:\n    case EOpAssign:\n    case EOpAddAssign:\n    case EOpSubAssign:\n    case EOpDivAssign:\n    case EOpAndAssign:\n    case EOpInclusiveOrAssign:\n    case EOpExclusiveOrAssign:\n    case EOpRightShiftAssign:\n    case EOpLeftShiftAssign:\n        // switch to unidirectional conversion (the lhs can't change)\n        rhsNode = addUniShapeConversion(op, lhsNode->getType(), rhsNode);\n        return;\n\n    case EOpMul:\n        // matrix multiply does not change shapes\n        if (lhsNode->isMatrix() && rhsNode->isMatrix())\n            return;\n        [[fallthrough]];\n    case EOpAdd:\n    case EOpSub:\n    case EOpDiv:\n        // want to support vector * scalar native ops in AST and lower, not smear, similarly for\n        // matrix * vector, etc.\n        if (lhsNode->getVectorSize() == 1 || rhsNode->getVectorSize() == 1)\n            return;\n        break;\n\n    case EOpRightShift:\n    case EOpLeftShift:\n        // can natively support the right operand being a scalar and the left a vector,\n        // but not the reverse\n        if (rhsNode->getVectorSize() == 1)\n            return;\n        break;\n\n    case EOpLessThan:\n    case EOpGreaterThan:\n    case EOpLessThanEqual:\n    case EOpGreaterThanEqual:\n\n    case EOpEqual:\n    case EOpNotEqual:\n\n    case EOpLogicalAnd:\n    case EOpLogicalOr:\n    case EOpLogicalXor:\n\n    case EOpAnd:\n    case EOpInclusiveOr:\n    case EOpExclusiveOr:\n\n    case EOpMix:\n        break;\n\n    default:\n        return;\n    }\n\n    // Do bidirectional conversions\n    if (lhsNode->getType().isScalarOrVec1() || rhsNode->getType().isScalarOrVec1()) {\n        if (lhsNode->getType().isScalarOrVec1())\n            lhsNode = addShapeConversion(rhsNode->getType(), lhsNode);\n        else\n            rhsNode = addShapeConversion(lhsNode->getType(), rhsNode);\n    }\n    lhsNode = addShapeConversion(rhsNode->getType(), lhsNode);\n    rhsNode = addShapeConversion(lhsNode->getType(), rhsNode);\n}\n\n// Convert the node's shape of type for the given type, as allowed by the\n// operation involved: 'op'.\n//\n// Generally, the AST represents allowed GLSL shapes, so this isn't needed\n// for GLSL.  Bad shapes are caught in conversion or promotion.\n//\n// Return 'node' if no conversion was done. Promotion handles final shape\n// checking.\n//\nTIntermTyped* TIntermediate::addShapeConversion(const TType& type, TIntermTyped* node)\n{\n    // no conversion needed\n    if (node->getType() == type)\n        return node;\n\n    // structures and arrays don't change shape, either to or from\n    if (node->getType().isStruct() || node->getType().isArray() ||\n        type.isStruct() || type.isArray())\n        return node;\n\n    // The new node that handles the conversion\n    TOperator constructorOp = mapTypeToConstructorOp(type);\n\n    if (getSource() == EShSourceHlsl) {\n        // HLSL rules for scalar, vector and matrix conversions:\n        // 1) scalar can become anything, initializing every component with its value\n        // 2) vector and matrix can become scalar, first element is used (warning: truncation)\n        // 3) matrix can become matrix with less rows and/or columns (warning: truncation)\n        // 4) vector can become vector with less rows size (warning: truncation)\n        // 5a) vector 4 can become 2x2 matrix (special case) (same packing layout, its a reinterpret)\n        // 5b) 2x2 matrix can become vector 4 (special case) (same packing layout, its a reinterpret)\n\n        const TType &sourceType = node->getType();\n\n        // rule 1 for scalar to matrix is special\n        if (sourceType.isScalarOrVec1() && type.isMatrix()) {\n\n            // HLSL semantics: the scalar (or vec1) is replicated to every component of the matrix.  Left to its\n            // own devices, the constructor from a scalar would populate the diagonal.  This forces replication\n            // to every matrix element.\n\n            // Note that if the node is complex (e.g, a function call), we don't want to duplicate it here\n            // repeatedly, so we copy it to a temp, then use the temp.\n            const int matSize = type.computeNumComponents();\n            TIntermAggregate* rhsAggregate = new TIntermAggregate();\n\n            const bool isSimple = (node->getAsSymbolNode() != nullptr) || (node->getAsConstantUnion() != nullptr);\n\n            if (!isSimple) {\n                assert(0); // TODO: use node replicator service when available.\n            }\n\n            for (int x = 0; x < matSize; ++x)\n                rhsAggregate->getSequence().push_back(node);\n\n            return setAggregateOperator(rhsAggregate, constructorOp, type, node->getLoc());\n        }\n\n        // rule 1 and 2\n        if ((sourceType.isScalar() && !type.isScalar()) || (!sourceType.isScalar() && type.isScalar()))\n            return setAggregateOperator(makeAggregate(node), constructorOp, type, node->getLoc());\n\n        // rule 3 and 5b\n        if (sourceType.isMatrix()) {\n            // rule 3\n            if (type.isMatrix()) {\n                if ((sourceType.getMatrixCols() != type.getMatrixCols() || sourceType.getMatrixRows() != type.getMatrixRows()) &&\n                    sourceType.getMatrixCols() >= type.getMatrixCols() && sourceType.getMatrixRows() >= type.getMatrixRows())\n                    return setAggregateOperator(makeAggregate(node), constructorOp, type, node->getLoc());\n            // rule 5b\n            } else if (type.isVector()) {\n                if (type.getVectorSize() == 4 && sourceType.getMatrixCols() == 2 && sourceType.getMatrixRows() == 2)\n                    return setAggregateOperator(makeAggregate(node), constructorOp, type, node->getLoc());\n            }\n        }\n\n        // rule 4 and 5a\n        if (sourceType.isVector()) {\n            // rule 4\n            if (type.isVector())\n            {\n                if (sourceType.getVectorSize() > type.getVectorSize())\n                    return setAggregateOperator(makeAggregate(node), constructorOp, type, node->getLoc());\n            // rule 5a\n            } else if (type.isMatrix()) {\n                if (sourceType.getVectorSize() == 4 && type.getMatrixCols() == 2 && type.getMatrixRows() == 2)\n                    return setAggregateOperator(makeAggregate(node), constructorOp, type, node->getLoc());\n            }\n        }\n    }\n\n    // scalar -> vector or vec1 -> vector or\n    // vector -> scalar or\n    // bigger vector -> smaller vector\n    if ((node->getType().isScalarOrVec1() && type.isVector()) ||\n        (node->getType().isVector() && type.isScalar()) ||\n        (node->isVector() && type.isVector() && node->getVectorSize() > type.getVectorSize()))\n        return setAggregateOperator(makeAggregate(node), constructorOp, type, node->getLoc());\n\n    return node;\n}\n\nbool TIntermediate::isIntegralPromotion(TBasicType from, TBasicType to) const\n{\n    // integral promotions\n    if (to == EbtInt) {\n        switch(from) {\n        case EbtInt8:\n        case EbtInt16:\n        case EbtUint8:\n        case EbtUint16:\n            return true;\n        default:\n            break;\n        }\n    }\n    return false;\n}\n\nbool TIntermediate::isFPPromotion(TBasicType from, TBasicType to) const\n{\n    // floating-point promotions\n    if (to == EbtDouble) {\n        switch(from) {\n        case EbtBFloat16:\n        case EbtFloatE5M2:\n        case EbtFloatE4M3:\n        case EbtFloat16:\n        case EbtFloat:\n            return true;\n        default:\n            break;\n        }\n    }\n    return false;\n}\n\nbool TIntermediate::isIntegralConversion(TBasicType from, TBasicType to) const\n{\n    switch (from) {\n    case EbtInt:\n        switch(to) {\n        case EbtUint:\n            return version >= 400 || getSource() == EShSourceHlsl;\n        case EbtInt64:\n        case EbtUint64:\n            return true;\n        default:\n            break;\n        }\n        break;\n    case EbtUint:\n        switch(to) {\n        case EbtInt64:\n        case EbtUint64:\n            return true;\n        default:\n            break;\n        }\n        break;\n    case EbtInt8:\n        switch (to) {\n        case EbtUint8:\n        case EbtInt16:\n        case EbtUint16:\n        case EbtUint:\n        case EbtInt64:\n        case EbtUint64:\n            return true;\n        default:\n            break;\n        }\n        break;\n    case EbtUint8:\n        switch (to) {\n        case EbtInt16:\n        case EbtUint16:\n        case EbtUint:\n        case EbtInt64:\n        case EbtUint64:\n            return true;\n        default:\n            break;\n        }\n        break;\n    case EbtInt16:\n        switch(to) {\n        case EbtUint16:\n        case EbtUint:\n        case EbtInt64:\n        case EbtUint64:\n            return true;\n        default:\n            break;\n        }\n        break;\n    case EbtUint16:\n        switch(to) {\n        case EbtUint:\n        case EbtInt64:\n        case EbtUint64:\n            return true;\n        default:\n            break;\n        }\n        break;\n    case EbtInt64:\n        if (to == EbtUint64) {\n            return true;\n        }\n        break;\n    default:\n        break;\n    }\n    return false;\n}\n\nbool TIntermediate::isFPConversion(TBasicType from, TBasicType to) const\n{\n    if (to == EbtFloat && (from == EbtFloat16 || from == EbtBFloat16 || from == EbtFloatE5M2 || from == EbtFloatE4M3)) {\n        return true;\n    } else {\n        return false;\n    }\n}\n\nbool TIntermediate::isFPIntegralConversion(TBasicType from, TBasicType to) const\n{\n    switch (from) {\n    case EbtInt:\n    case EbtUint:\n        switch(to) {\n        case EbtFloat:\n        case EbtDouble:\n            return true;\n        default:\n            break;\n        }\n        break;\n    case EbtInt8:\n    case EbtUint8:\n    case EbtInt16:\n    case EbtUint16:\n        switch (to) {\n        case EbtFloat16:\n        case EbtFloat:\n        case EbtDouble:\n            return true;\n        default:\n            break;\n        }\n        break;\n    case EbtInt64:\n    case EbtUint64:\n        if (to == EbtDouble) {\n            return true;\n        }\n        break;\n    default:\n        break;\n    }\n    return false;\n}\n\n//\n// See if the 'from' type is allowed to be implicitly converted to the\n// 'to' type.  This is not about vector/array/struct, only about basic type.\n//\nbool TIntermediate::canImplicitlyPromote(TBasicType from, TBasicType to, TOperator op) const\n{\n    if ((isEsProfile() && version < 310 ) || version == 110)\n        return false;\n\n    if (from == to)\n        return true;\n\n    // TODO: Move more policies into language-specific handlers.\n    // Some languages allow more general (or potentially, more specific) conversions under some conditions.\n    if (getSource() == EShSourceHlsl) {\n        const bool fromConvertable = (from == EbtFloat || from == EbtDouble || from == EbtInt || from == EbtUint || from == EbtBool);\n        const bool toConvertable = (to == EbtFloat || to == EbtDouble || to == EbtInt || to == EbtUint || to == EbtBool);\n\n        if (fromConvertable && toConvertable) {\n            switch (op) {\n            case EOpAndAssign:               // assignments can perform arbitrary conversions\n            case EOpInclusiveOrAssign:       // ...\n            case EOpExclusiveOrAssign:       // ...\n            case EOpAssign:                  // ...\n            case EOpAddAssign:               // ...\n            case EOpSubAssign:               // ...\n            case EOpMulAssign:               // ...\n            case EOpVectorTimesScalarAssign: // ...\n            case EOpMatrixTimesScalarAssign: // ...\n            case EOpDivAssign:               // ...\n            case EOpModAssign:               // ...\n            case EOpReturn:                  // function returns can also perform arbitrary conversions\n            case EOpFunctionCall:            // conversion of a calling parameter\n            case EOpLogicalNot:\n            case EOpLogicalAnd:\n            case EOpLogicalOr:\n            case EOpLogicalXor:\n            case EOpConstructStruct:\n                return true;\n            default:\n                break;\n            }\n        }\n    }\n\n    if (getSource() == EShSourceHlsl) {\n        // HLSL\n        if (from == EbtBool && (to == EbtInt || to == EbtUint || to == EbtFloat))\n            return true;\n    } else {\n        // GLSL\n        if (isIntegralPromotion(from, to) ||\n            isFPPromotion(from, to) ||\n            isIntegralConversion(from, to) ||\n            isFPConversion(from, to) ||\n            isFPIntegralConversion(from, to)) {\n\n            if (numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types) ||\n                numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_int8) ||\n                numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_int16) ||\n                numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_int32) ||\n                numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_int64) ||\n                numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_float16) ||\n                numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_float32) ||\n                numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_float64)) {\n                return true;\n            }\n        }\n    }\n\n    if (isEsProfile()) {\n        switch (to) {\n            case EbtFloat:\n                switch (from) {\n                case EbtInt:\n                case EbtUint:\n                    return numericFeatures.contains(TNumericFeatures::shader_implicit_conversions);\n                default:\n                    return false;\n                }\n            case EbtUint:\n                switch (from) {\n                case EbtInt:\n                    return numericFeatures.contains(TNumericFeatures::shader_implicit_conversions);\n                default:\n                    return false;\n                }\n            default:\n                return false;\n        }        \n    } else {\n        switch (to) {\n        case EbtDouble:\n            switch (from) {\n            case EbtInt:\n            case EbtUint:\n            case EbtInt64:\n            case EbtUint64:\n            case EbtFloat:\n                return version >= 400 || numericFeatures.contains(TNumericFeatures::gpu_shader_fp64);\n            case EbtInt16:\n            case EbtUint16:\n                return (version >= 400 || numericFeatures.contains(TNumericFeatures::gpu_shader_fp64)) &&\n                                         (numericFeatures.contains(TNumericFeatures::nv_gpu_shader5_types) || \n                                          numericFeatures.contains(TNumericFeatures::gpu_shader_int16));\n            case EbtFloat16:\n                return (version >= 400 || numericFeatures.contains(TNumericFeatures::gpu_shader_fp64)) &&\n                                        (numericFeatures.contains(TNumericFeatures::nv_gpu_shader5_types) || \n                                        numericFeatures.contains(TNumericFeatures::gpu_shader_half_float));\n            case EbtBFloat16:\n            case EbtFloatE5M2:\n            case EbtFloatE4M3:\n                return true;\n            case EbtInt8:\n            case EbtUint8:\n                return numericFeatures.contains(TNumericFeatures::nv_gpu_shader5_types);\n            default:\n                return false;\n           }\n        case EbtFloat:\n            switch (from) {\n            case EbtInt:\n            case EbtUint:\n                 return true;\n            case EbtBool:\n                 return getSource() == EShSourceHlsl;\n            case EbtInt16:\n            case EbtUint16:\n                return numericFeatures.contains(TNumericFeatures::gpu_shader_int16) ||\n                       numericFeatures.contains(TNumericFeatures::nv_gpu_shader5_types);\n            case EbtFloat16:\n                return numericFeatures.contains(TNumericFeatures::gpu_shader_half_float) ||\n                    numericFeatures.contains(TNumericFeatures::nv_gpu_shader5_types) ||\n                    getSource() == EShSourceHlsl;\n            case EbtBFloat16:\n            case EbtFloatE5M2:\n            case EbtFloatE4M3:\n                return true;\n            case EbtInt8:\n            case EbtUint8:\n                return numericFeatures.contains(TNumericFeatures::nv_gpu_shader5_types);\n            default:\n                 return false;\n            }\n        case EbtUint:\n            switch (from) {\n            case EbtInt:\n                return version >= 400 || getSource() == EShSourceHlsl || \n\t\t\t\t\t\tIsRequestedExtension(E_GL_ARB_gpu_shader5) ||\n\t\t\t\t\t\tnumericFeatures.contains(TNumericFeatures::nv_gpu_shader5_types);\n            case EbtBool:\n                return getSource() == EShSourceHlsl;\n            case EbtInt16:\n            case EbtUint16:\n                return numericFeatures.contains(TNumericFeatures::gpu_shader_int16) ||\n                       numericFeatures.contains(TNumericFeatures::nv_gpu_shader5_types);\n            case EbtInt8:\n            case EbtUint8:\n                return numericFeatures.contains(TNumericFeatures::nv_gpu_shader5_types);\n            default:\n                return false;\n            }\n        case EbtInt:\n            switch (from) {\n            case EbtBool:\n                return getSource() == EShSourceHlsl;\n            case EbtInt16:\n                return numericFeatures.contains(TNumericFeatures::gpu_shader_int16) ||\n                       numericFeatures.contains(TNumericFeatures::nv_gpu_shader5_types);\n            case EbtInt8:\n                return numericFeatures.contains(TNumericFeatures::nv_gpu_shader5_types);\n            default:\n                return false;\n            }\n        case EbtUint64:\n            switch (from) {\n            case EbtInt:\n            case EbtUint:\n            case EbtInt64:\n                return true;\n            case EbtInt16:\n            case EbtUint16:\n                return numericFeatures.contains(TNumericFeatures::gpu_shader_int16) ||\n                \tnumericFeatures.contains(TNumericFeatures::nv_gpu_shader5_types);\n            case EbtInt8:\n            case EbtUint8:\n                return numericFeatures.contains(TNumericFeatures::nv_gpu_shader5_types);\n            default:\n                return false;\n            }\n        case EbtInt64:\n            switch (from) {\n            case EbtInt:\n                return true;\n            case EbtInt8:\n                return numericFeatures.contains(TNumericFeatures::nv_gpu_shader5_types);\n            case EbtInt16:\n                return numericFeatures.contains(TNumericFeatures::gpu_shader_int16) ||\n\t\t\t\t       numericFeatures.contains(TNumericFeatures::nv_gpu_shader5_types);\n            default:\n                return false;\n            }\n        case EbtFloat16:\n            switch (from) {\n            case EbtInt16:\n            case EbtUint16:\n                return numericFeatures.contains(TNumericFeatures::gpu_shader_int16);\n            case EbtFloatE5M2:\n            case EbtFloatE4M3:\n                return true;\n            default:\n                break;\n            }\n            return false;\n        case EbtBFloat16:\n            switch (from) {\n            case EbtFloatE5M2:\n            case EbtFloatE4M3:\n                return true;\n            default:\n                break;\n            }\n            return false;\n        case EbtUint16:\n            switch (from) {\n            case EbtInt16:\n                return numericFeatures.contains(TNumericFeatures::gpu_shader_int16);\n            default:\n                break;\n            }\n            return false;\n        default:\n            return false;\n        }\n    }\n\n    return false;\n}\n\nstatic bool canSignedIntTypeRepresentAllUnsignedValues(TBasicType sintType, TBasicType uintType)\n{\n    switch(sintType) {\n    case EbtInt8:\n        switch(uintType) {\n        case EbtUint8:\n        case EbtUint16:\n        case EbtUint:\n        case EbtUint64:\n            return false;\n        default:\n            assert(false);\n            return false;\n        }\n        break;\n    case EbtInt16:\n        switch(uintType) {\n        case EbtUint8:\n            return true;\n        case EbtUint16:\n        case EbtUint:\n        case EbtUint64:\n            return false;\n        default:\n            assert(false);\n            return false;\n        }\n        break;\n    case EbtInt:\n        switch(uintType) {\n        case EbtUint8:\n        case EbtUint16:\n            return true;\n        case EbtUint:\n            return false;\n        default:\n            assert(false);\n            return false;\n        }\n        break;\n    case EbtInt64:\n        switch(uintType) {\n        case EbtUint8:\n        case EbtUint16:\n        case EbtUint:\n            return true;\n        case EbtUint64:\n            return false;\n        default:\n            assert(false);\n            return false;\n        }\n        break;\n    default:\n        assert(false);\n        return false;\n    }\n}\n\n\nstatic TBasicType getCorrespondingUnsignedType(TBasicType type)\n{\n    switch(type) {\n    case EbtInt8:\n        return EbtUint8;\n    case EbtInt16:\n        return EbtUint16;\n    case EbtInt:\n        return EbtUint;\n    case EbtInt64:\n        return EbtUint64;\n    default:\n        assert(false);\n        return EbtNumTypes;\n    }\n}\n\n// Implements the following rules\n//    - If either operand has type float64_t or derived from float64_t,\n//      the other shall be converted to float64_t or derived type.\n//    - Otherwise, if either operand has type float32_t or derived from\n//      float32_t, the other shall be converted to float32_t or derived type.\n//    - Otherwise, if either operand has type float16_t or derived from\n//      float16_t, the other shall be converted to float16_t or derived type.\n//    - Otherwise, if both operands have integer types the following rules\n//      shall be applied to the operands:\n//      - If both operands have the same type, no further conversion\n//        is needed.\n//      - Otherwise, if both operands have signed integer types or both\n//        have unsigned integer types, the operand with the type of lesser\n//        integer conversion rank shall be converted to the type of the\n//        operand with greater rank.\n//      - Otherwise, if the operand that has unsigned integer type has rank\n//        greater than or equal to the rank of the type of the other\n//        operand, the operand with signed integer type shall be converted\n//        to the type of the operand with unsigned integer type.\n//      - Otherwise, if the type of the operand with signed integer type can\n//        represent all of the values of the type of the operand with\n//        unsigned integer type, the operand with unsigned integer type\n//        shall be converted to the type of the operand with signed\n//        integer type.\n//      - Otherwise, both operands shall be converted to the unsigned\n//        integer type corresponding to the type of the operand with signed\n//        integer type.\n\nstd::tuple<TBasicType, TBasicType> TIntermediate::getConversionDestinationType(TBasicType type0, TBasicType type1, TOperator op) const\n{\n    TBasicType res0 = EbtNumTypes;\n    TBasicType res1 = EbtNumTypes;\n\n    if ((isEsProfile() && \n        (version < 310 || !numericFeatures.contains(TNumericFeatures::shader_implicit_conversions))) || \n        version == 110)\n        return std::make_tuple(res0, res1);\n\n    if (getSource() == EShSourceHlsl) {\n        if (canImplicitlyPromote(type1, type0, op)) {\n            res0 = type0;\n            res1 = type0;\n        } else if (canImplicitlyPromote(type0, type1, op)) {\n            res0 = type1;\n            res1 = type1;\n        }\n        return std::make_tuple(res0, res1);\n    }\n\n    if ((type0 == EbtDouble && canImplicitlyPromote(type1, EbtDouble, op)) ||\n        (type1 == EbtDouble && canImplicitlyPromote(type0, EbtDouble, op)) ) {\n        res0 = EbtDouble;\n        res1 = EbtDouble;\n    } else if ((type0 == EbtFloat && canImplicitlyPromote(type1, EbtFloat, op)) ||\n               (type1 == EbtFloat && canImplicitlyPromote(type0, EbtFloat, op)) ) {\n        res0 = EbtFloat;\n        res1 = EbtFloat;\n    } else if ((type0 == EbtFloat16 && canImplicitlyPromote(type1, EbtFloat16, op)) ||\n               (type1 == EbtFloat16 && canImplicitlyPromote(type0, EbtFloat16, op)) ) {\n        res0 = EbtFloat16;\n        res1 = EbtFloat16;\n    } else if ((type0 == EbtBFloat16 && canImplicitlyPromote(type1, EbtBFloat16, op)) ||\n               (type1 == EbtBFloat16 && canImplicitlyPromote(type0, EbtBFloat16, op)) ) {\n        res0 = EbtBFloat16;\n        res1 = EbtBFloat16;\n    } else if (isTypeInt(type0) && isTypeInt(type1) &&\n               (canImplicitlyPromote(type0, type1, op) || canImplicitlyPromote(type1, type0, op))) {\n        if ((isTypeSignedInt(type0) && isTypeSignedInt(type1)) ||\n            (isTypeUnsignedInt(type0) && isTypeUnsignedInt(type1))) {\n            if (getTypeRank(type0) < getTypeRank(type1)) {\n                res0 = type1;\n                res1 = type1;\n            } else {\n                res0 = type0;\n                res1 = type0;\n            }\n        } else if (isTypeUnsignedInt(type0) && (getTypeRank(type0) > getTypeRank(type1))) {\n            res0 = type0;\n            res1 = type0;\n        } else if (isTypeUnsignedInt(type1) && (getTypeRank(type1) > getTypeRank(type0))) {\n            res0 = type1;\n            res1 = type1;\n        } else if (isTypeSignedInt(type0)) {\n            if (canSignedIntTypeRepresentAllUnsignedValues(type0, type1)) {\n                res0 = type0;\n                res1 = type0;\n            } else {\n                res0 = getCorrespondingUnsignedType(type0);\n                res1 = getCorrespondingUnsignedType(type0);\n            }\n        } else if (isTypeSignedInt(type1)) {\n            if (canSignedIntTypeRepresentAllUnsignedValues(type1, type0)) {\n                res0 = type1;\n                res1 = type1;\n            } else {\n                res0 = getCorrespondingUnsignedType(type1);\n                res1 = getCorrespondingUnsignedType(type1);\n            }\n        }\n    }\n\n    return std::make_tuple(res0, res1);\n}\n\n//\n// Given a type, find what operation would fully construct it.\n//\nTOperator TIntermediate::mapTypeToConstructorOp(const TType& type) const\n{\n    TOperator op = EOpNull;\n\n    if (type.getQualifier().isNonUniform())\n        return EOpConstructNonuniform;\n\n    if (type.isCoopMatNV())\n        return EOpConstructCooperativeMatrixNV;\n\n    if (type.isCoopMatKHR())\n        return EOpConstructCooperativeMatrixKHR;\n\n    if (type.isCoopVecNV())\n        return EOpConstructCooperativeVectorNV;\n\n    switch (type.getBasicType()) {\n    case EbtStruct:\n        op = EOpConstructStruct;\n        break;\n    case EbtSampler:\n        if (type.getSampler().isCombined())\n            op = EOpConstructTextureSampler;\n        break;\n    case EbtFloat:\n        if (type.isMatrix()) {\n            switch (type.getMatrixCols()) {\n            case 2:\n                switch (type.getMatrixRows()) {\n                case 2: op = EOpConstructMat2x2; break;\n                case 3: op = EOpConstructMat2x3; break;\n                case 4: op = EOpConstructMat2x4; break;\n                default: break; // some compilers want this\n                }\n                break;\n            case 3:\n                switch (type.getMatrixRows()) {\n                case 2: op = EOpConstructMat3x2; break;\n                case 3: op = EOpConstructMat3x3; break;\n                case 4: op = EOpConstructMat3x4; break;\n                default: break; // some compilers want this\n                }\n                break;\n            case 4:\n                switch (type.getMatrixRows()) {\n                case 2: op = EOpConstructMat4x2; break;\n                case 3: op = EOpConstructMat4x3; break;\n                case 4: op = EOpConstructMat4x4; break;\n                default: break; // some compilers want this\n                }\n                break;\n            default: break; // some compilers want this\n            }\n        } else {\n            switch(type.getVectorSize()) {\n            case 1: op = EOpConstructFloat; break;\n            case 2: op = EOpConstructVec2;  break;\n            case 3: op = EOpConstructVec3;  break;\n            case 4: op = EOpConstructVec4;  break;\n            default: break; // some compilers want this\n            }\n        }\n        break;\n    case EbtInt:\n        if (type.getMatrixCols()) {\n            switch (type.getMatrixCols()) {\n            case 2:\n                switch (type.getMatrixRows()) {\n                case 2: op = EOpConstructIMat2x2; break;\n                case 3: op = EOpConstructIMat2x3; break;\n                case 4: op = EOpConstructIMat2x4; break;\n                default: break; // some compilers want this\n                }\n                break;\n            case 3:\n                switch (type.getMatrixRows()) {\n                case 2: op = EOpConstructIMat3x2; break;\n                case 3: op = EOpConstructIMat3x3; break;\n                case 4: op = EOpConstructIMat3x4; break;\n                default: break; // some compilers want this\n                }\n                break;\n            case 4:\n                switch (type.getMatrixRows()) {\n                case 2: op = EOpConstructIMat4x2; break;\n                case 3: op = EOpConstructIMat4x3; break;\n                case 4: op = EOpConstructIMat4x4; break;\n                default: break; // some compilers want this\n                }\n                break;\n            }\n        } else {\n            switch(type.getVectorSize()) {\n            case 1: op = EOpConstructInt;   break;\n            case 2: op = EOpConstructIVec2; break;\n            case 3: op = EOpConstructIVec3; break;\n            case 4: op = EOpConstructIVec4; break;\n            default: break; // some compilers want this\n            }\n        }\n        break;\n    case EbtUint:\n        if (type.getMatrixCols()) {\n            switch (type.getMatrixCols()) {\n            case 2:\n                switch (type.getMatrixRows()) {\n                case 2: op = EOpConstructUMat2x2; break;\n                case 3: op = EOpConstructUMat2x3; break;\n                case 4: op = EOpConstructUMat2x4; break;\n                default: break; // some compilers want this\n                }\n                break;\n            case 3:\n                switch (type.getMatrixRows()) {\n                case 2: op = EOpConstructUMat3x2; break;\n                case 3: op = EOpConstructUMat3x3; break;\n                case 4: op = EOpConstructUMat3x4; break;\n                default: break; // some compilers want this\n                }\n                break;\n            case 4:\n                switch (type.getMatrixRows()) {\n                case 2: op = EOpConstructUMat4x2; break;\n                case 3: op = EOpConstructUMat4x3; break;\n                case 4: op = EOpConstructUMat4x4; break;\n                default: break; // some compilers want this\n                }\n                break;\n            }\n        } else {\n            switch(type.getVectorSize()) {\n            case 1: op = EOpConstructUint;  break;\n            case 2: op = EOpConstructUVec2; break;\n            case 3: op = EOpConstructUVec3; break;\n            case 4: op = EOpConstructUVec4; break;\n            default: break; // some compilers want this\n            }\n        }\n        break;\n    case EbtBool:\n        if (type.getMatrixCols()) {\n            switch (type.getMatrixCols()) {\n            case 2:\n                switch (type.getMatrixRows()) {\n                case 2: op = EOpConstructBMat2x2; break;\n                case 3: op = EOpConstructBMat2x3; break;\n                case 4: op = EOpConstructBMat2x4; break;\n                default: break; // some compilers want this\n                }\n                break;\n            case 3:\n                switch (type.getMatrixRows()) {\n                case 2: op = EOpConstructBMat3x2; break;\n                case 3: op = EOpConstructBMat3x3; break;\n                case 4: op = EOpConstructBMat3x4; break;\n                default: break; // some compilers want this\n                }\n                break;\n            case 4:\n                switch (type.getMatrixRows()) {\n                case 2: op = EOpConstructBMat4x2; break;\n                case 3: op = EOpConstructBMat4x3; break;\n                case 4: op = EOpConstructBMat4x4; break;\n                default: break; // some compilers want this\n                }\n                break;\n            }\n        } else {\n            switch(type.getVectorSize()) {\n            case 1:  op = EOpConstructBool;  break;\n            case 2:  op = EOpConstructBVec2; break;\n            case 3:  op = EOpConstructBVec3; break;\n            case 4:  op = EOpConstructBVec4; break;\n            default: break; // some compilers want this\n            }\n        }\n        break;\n    case EbtDouble:\n        if (type.getMatrixCols()) {\n            switch (type.getMatrixCols()) {\n            case 2:\n                switch (type.getMatrixRows()) {\n                case 2: op = EOpConstructDMat2x2; break;\n                case 3: op = EOpConstructDMat2x3; break;\n                case 4: op = EOpConstructDMat2x4; break;\n                default: break; // some compilers want this\n                }\n                break;\n            case 3:\n                switch (type.getMatrixRows()) {\n                case 2: op = EOpConstructDMat3x2; break;\n                case 3: op = EOpConstructDMat3x3; break;\n                case 4: op = EOpConstructDMat3x4; break;\n                default: break; // some compilers want this\n                }\n                break;\n            case 4:\n                switch (type.getMatrixRows()) {\n                case 2: op = EOpConstructDMat4x2; break;\n                case 3: op = EOpConstructDMat4x3; break;\n                case 4: op = EOpConstructDMat4x4; break;\n                default: break; // some compilers want this\n                }\n                break;\n            }\n        } else {\n            switch(type.getVectorSize()) {\n            case 1: op = EOpConstructDouble; break;\n            case 2: op = EOpConstructDVec2;  break;\n            case 3: op = EOpConstructDVec3;  break;\n            case 4: op = EOpConstructDVec4;  break;\n            default: break; // some compilers want this\n            }\n        }\n        break;\n    case EbtFloat16:\n        if (type.getMatrixCols()) {\n            switch (type.getMatrixCols()) {\n            case 2:\n                switch (type.getMatrixRows()) {\n                case 2: op = EOpConstructF16Mat2x2; break;\n                case 3: op = EOpConstructF16Mat2x3; break;\n                case 4: op = EOpConstructF16Mat2x4; break;\n                default: break; // some compilers want this\n                }\n                break;\n            case 3:\n                switch (type.getMatrixRows()) {\n                case 2: op = EOpConstructF16Mat3x2; break;\n                case 3: op = EOpConstructF16Mat3x3; break;\n                case 4: op = EOpConstructF16Mat3x4; break;\n                default: break; // some compilers want this\n                }\n                break;\n            case 4:\n                switch (type.getMatrixRows()) {\n                case 2: op = EOpConstructF16Mat4x2; break;\n                case 3: op = EOpConstructF16Mat4x3; break;\n                case 4: op = EOpConstructF16Mat4x4; break;\n                default: break; // some compilers want this\n                }\n                break;\n            }\n        }\n        else {\n            switch (type.getVectorSize()) {\n            case 1: op = EOpConstructFloat16;  break;\n            case 2: op = EOpConstructF16Vec2;  break;\n            case 3: op = EOpConstructF16Vec3;  break;\n            case 4: op = EOpConstructF16Vec4;  break;\n            default: break; // some compilers want this\n            }\n        }\n        break;\n    case EbtBFloat16:\n        switch (type.getVectorSize()) {\n        case 1: op = EOpConstructBFloat16;  break;\n        case 2: op = EOpConstructBF16Vec2;  break;\n        case 3: op = EOpConstructBF16Vec3;  break;\n        case 4: op = EOpConstructBF16Vec4;  break;\n        default: break; // some compilers want this\n        }\n        break;\n    case EbtFloatE5M2:\n        switch (type.getVectorSize()) {\n        case 1: op = EOpConstructFloatE5M2;  break;\n        case 2: op = EOpConstructFloatE5M2Vec2;  break;\n        case 3: op = EOpConstructFloatE5M2Vec3;  break;\n        case 4: op = EOpConstructFloatE5M2Vec4;  break;\n        default: break; // some compilers want this\n        }\n        break;\n    case EbtFloatE4M3:\n        switch (type.getVectorSize()) {\n        case 1: op = EOpConstructFloatE4M3;  break;\n        case 2: op = EOpConstructFloatE4M3Vec2;  break;\n        case 3: op = EOpConstructFloatE4M3Vec3;  break;\n        case 4: op = EOpConstructFloatE4M3Vec4;  break;\n        default: break; // some compilers want this\n        }\n        break;\n    case EbtInt8:\n        switch(type.getVectorSize()) {\n        case 1: op = EOpConstructInt8;   break;\n        case 2: op = EOpConstructI8Vec2; break;\n        case 3: op = EOpConstructI8Vec3; break;\n        case 4: op = EOpConstructI8Vec4; break;\n        default: break; // some compilers want this\n        }\n        break;\n    case EbtUint8:\n        switch(type.getVectorSize()) {\n        case 1: op = EOpConstructUint8;  break;\n        case 2: op = EOpConstructU8Vec2; break;\n        case 3: op = EOpConstructU8Vec3; break;\n        case 4: op = EOpConstructU8Vec4; break;\n        default: break; // some compilers want this\n        }\n        break;\n    case EbtInt16:\n        switch(type.getVectorSize()) {\n        case 1: op = EOpConstructInt16;   break;\n        case 2: op = EOpConstructI16Vec2; break;\n        case 3: op = EOpConstructI16Vec3; break;\n        case 4: op = EOpConstructI16Vec4; break;\n        default: break; // some compilers want this\n        }\n        break;\n    case EbtUint16:\n        switch(type.getVectorSize()) {\n        case 1: op = EOpConstructUint16;  break;\n        case 2: op = EOpConstructU16Vec2; break;\n        case 3: op = EOpConstructU16Vec3; break;\n        case 4: op = EOpConstructU16Vec4; break;\n        default: break; // some compilers want this\n        }\n        break;\n    case EbtInt64:\n        switch(type.getVectorSize()) {\n        case 1: op = EOpConstructInt64;   break;\n        case 2: op = EOpConstructI64Vec2; break;\n        case 3: op = EOpConstructI64Vec3; break;\n        case 4: op = EOpConstructI64Vec4; break;\n        default: break; // some compilers want this\n        }\n        break;\n    case EbtUint64:\n        switch(type.getVectorSize()) {\n        case 1: op = EOpConstructUint64;  break;\n        case 2: op = EOpConstructU64Vec2; break;\n        case 3: op = EOpConstructU64Vec3; break;\n        case 4: op = EOpConstructU64Vec4; break;\n        default: break; // some compilers want this\n        }\n        break;\n    case EbtReference:\n        op = EOpConstructReference;\n        break;\n\n    case EbtAccStruct:\n        op = EOpConstructAccStruct;\n        break;\n    default:\n        break;\n    }\n\n    return op;\n}\n\n//\n// Safe way to combine two nodes into an aggregate.  Works with null pointers,\n// a node that's not a aggregate yet, etc.\n//\n// Returns the resulting aggregate, unless nullptr was passed in for\n// both existing nodes.\n//\nTIntermAggregate* TIntermediate::growAggregate(TIntermNode* left, TIntermNode* right)\n{\n    if (left == nullptr && right == nullptr)\n        return nullptr;\n\n    TIntermAggregate* aggNode = nullptr;\n    if (left != nullptr)\n        aggNode = left->getAsAggregate();\n    if (aggNode == nullptr || aggNode->getOp() != EOpNull) {\n        aggNode = new TIntermAggregate;\n        if (left != nullptr)\n            aggNode->getSequence().push_back(left);\n    }\n\n    if (right != nullptr)\n        aggNode->getSequence().push_back(right);\n\n    return aggNode;\n}\n\nTIntermAggregate* TIntermediate::growAggregate(TIntermNode* left, TIntermNode* right, const TSourceLoc& loc)\n{\n    TIntermAggregate* aggNode = growAggregate(left, right);\n    if (aggNode)\n        aggNode->setLoc(loc);\n\n    return aggNode;\n}\n\nTIntermAggregate* TIntermediate::mergeAggregate(TIntermNode* left, TIntermNode* right)\n{\n    if (left == nullptr && right == nullptr)\n        return nullptr;\n\n    TIntermAggregate* aggNode = nullptr;\n    if (left != nullptr)\n        aggNode = left->getAsAggregate();\n    if (aggNode == nullptr || aggNode->getOp() != EOpNull) {\n        aggNode = new TIntermAggregate;\n        if (left != nullptr)\n            aggNode->getSequence().push_back(left);\n    }\n\n    TIntermAggregate* rhsagg = right->getAsAggregate();\n    if (rhsagg == nullptr || rhsagg->getOp() != EOpNull)\n        aggNode->getSequence().push_back(right);\n    else\n        aggNode->getSequence().insert(aggNode->getSequence().end(),\n                                      rhsagg->getSequence().begin(),\n                                      rhsagg->getSequence().end());\n\n    return aggNode;\n}\n\nTIntermAggregate* TIntermediate::mergeAggregate(TIntermNode* left, TIntermNode* right, const TSourceLoc& loc)\n{\n    TIntermAggregate* aggNode = mergeAggregate(left, right);\n    if (aggNode)\n        aggNode->setLoc(loc);\n\n    return aggNode;\n}\n\n//\n// Turn an existing node into an aggregate.\n//\n// Returns an aggregate, unless nullptr was passed in for the existing node.\n//\nTIntermAggregate* TIntermediate::makeAggregate(TIntermNode* node)\n{\n    if (node == nullptr)\n        return nullptr;\n\n    TIntermAggregate* aggNode = new TIntermAggregate;\n    aggNode->getSequence().push_back(node);\n    aggNode->setLoc(node->getLoc());\n\n    return aggNode;\n}\n\nTIntermAggregate* TIntermediate::makeAggregate(TIntermNode* node, const TSourceLoc& loc)\n{\n    if (node == nullptr)\n        return nullptr;\n\n    TIntermAggregate* aggNode = new TIntermAggregate;\n    aggNode->getSequence().push_back(node);\n    aggNode->setLoc(loc);\n\n    return aggNode;\n}\n\n//\n// Make an aggregate with an empty sequence.\n//\nTIntermAggregate* TIntermediate::makeAggregate(const TSourceLoc& loc)\n{\n    TIntermAggregate* aggNode = new TIntermAggregate;\n    aggNode->setLoc(loc);\n\n    return aggNode;\n}\n\n//\n// For \"if\" test nodes.  There are three children; a condition,\n// a true path, and a false path.  The two paths are in the\n// nodePair.\n//\n// Returns the selection node created.\n//\nTIntermSelection* TIntermediate::addSelection(TIntermTyped* cond, TIntermNodePair nodePair, const TSourceLoc& loc)\n{\n    //\n    // Don't prune the false path for compile-time constants; it's needed\n    // for static access analysis.\n    //\n\n    TIntermSelection* node = new TIntermSelection(cond, nodePair.node1, nodePair.node2);\n    node->setLoc(loc);\n\n    return node;\n}\n\nTIntermTyped* TIntermediate::addComma(TIntermTyped* left, TIntermTyped* right, const TSourceLoc& loc)\n{\n    // However, the lowest precedence operators of the sequence operator ( , ) and the assignment operators\n    // ... are not included in the operators that can create a constant expression.\n    //\n    // if (left->getType().getQualifier().storage == EvqConst &&\n    //    right->getType().getQualifier().storage == EvqConst) {\n\n    //    return right;\n    //}\n\n    TIntermTyped *commaAggregate = growAggregate(left, right, loc);\n    commaAggregate->getAsAggregate()->setOperator(EOpComma);\n    commaAggregate->setType(right->getType());\n    commaAggregate->getWritableType().getQualifier().makeTemporary();\n\n    return commaAggregate;\n}\n\nTIntermTyped* TIntermediate::addMethod(TIntermTyped* object, const TType& type, const TString* name, const TSourceLoc& loc)\n{\n    TIntermMethod* method = new TIntermMethod(object, type, *name);\n    method->setLoc(loc);\n\n    return method;\n}\n\n//\n// For \"?:\" test nodes.  There are three children; a condition,\n// a true path, and a false path.  The two paths are specified\n// as separate parameters. For vector 'cond', the true and false\n// are not paths, but vectors to mix.\n//\n// Specialization constant operations include\n//     - The ternary operator ( ? : )\n//\n// Returns the selection node created, or nullptr if one could not be.\n//\nTIntermTyped* TIntermediate::addSelection(TIntermTyped* cond, TIntermTyped* trueBlock, TIntermTyped* falseBlock,\n                                          const TSourceLoc& loc)\n{\n    // If it's void, go to the if-then-else selection()\n    if (trueBlock->getBasicType() == EbtVoid && falseBlock->getBasicType() == EbtVoid) {\n        TIntermNodePair pair = { trueBlock, falseBlock };\n        TIntermSelection* selection = addSelection(cond, pair, loc);\n        if (getSource() == EShSourceHlsl)\n            selection->setNoShortCircuit();\n\n        return selection;\n    }\n\n    //\n    // Get compatible types.\n    //\n    auto children = addPairConversion(EOpSequence, trueBlock, falseBlock);\n    trueBlock = std::get<0>(children);\n    falseBlock = std::get<1>(children);\n\n    if (trueBlock == nullptr || falseBlock == nullptr)\n        return nullptr;\n\n    // Handle a vector condition as a mix\n    if (!cond->getType().isScalarOrVec1()) {\n        TType targetVectorType(trueBlock->getType().getBasicType(), EvqTemporary,\n                               cond->getType().getVectorSize());\n        // smear true/false operands as needed\n        trueBlock = addUniShapeConversion(EOpMix, targetVectorType, trueBlock);\n        falseBlock = addUniShapeConversion(EOpMix, targetVectorType, falseBlock);\n\n        // After conversion, types have to match.\n        if (falseBlock->getType() != trueBlock->getType())\n            return nullptr;\n\n        // make the mix operation\n        TIntermAggregate* mix = makeAggregate(loc);\n        mix = growAggregate(mix, falseBlock);\n        mix = growAggregate(mix, trueBlock);\n        mix = growAggregate(mix, cond);\n        mix->setType(targetVectorType);\n        mix->setOp(EOpMix);\n\n        return mix;\n    }\n\n    // Now have a scalar condition...\n\n    // Convert true and false expressions to matching types\n    addBiShapeConversion(EOpMix, trueBlock, falseBlock);\n\n    // After conversion, types have to match.\n    if (falseBlock->getType() != trueBlock->getType())\n        return nullptr;\n\n    // Eliminate the selection when the condition is a scalar and all operands are constant.\n    if (cond->getAsConstantUnion() && trueBlock->getAsConstantUnion() && falseBlock->getAsConstantUnion()) {\n        if (cond->getAsConstantUnion()->getConstArray()[0].getBConst())\n            return trueBlock;\n        else\n            return falseBlock;\n    }\n\n    //\n    // Make a selection node.\n    //\n    TIntermSelection* node = new TIntermSelection(cond, trueBlock, falseBlock, trueBlock->getType());\n    node->setLoc(loc);\n    node->getQualifier().precision = std::max(trueBlock->getQualifier().precision, falseBlock->getQualifier().precision);\n\n    if ((cond->getQualifier().isConstant() && specConstantPropagates(*trueBlock, *falseBlock)) ||\n        (cond->getQualifier().isSpecConstant() && trueBlock->getQualifier().isConstant() &&\n                                                 falseBlock->getQualifier().isConstant()))\n        node->getQualifier().makeSpecConstant();\n    else\n        node->getQualifier().makeTemporary();\n\n    if (getSource() == EShSourceHlsl)\n        node->setNoShortCircuit();\n\n    return node;\n}\n\n//\n// Constant terminal nodes.  Has a union that contains bool, float or int constants\n//\n// Returns the constant union node created.\n//\n\nTIntermConstantUnion* TIntermediate::addConstantUnion(const TConstUnionArray& unionArray, const TType& t, const TSourceLoc& loc, bool literal) const\n{\n    TIntermConstantUnion* node = new TIntermConstantUnion(unionArray, t);\n    node->getQualifier().storage = EvqConst;\n    node->setLoc(loc);\n    if (literal)\n        node->setLiteral();\n\n    return node;\n}\nTIntermConstantUnion* TIntermediate::addConstantUnion(signed char i8, const TSourceLoc& loc, bool literal) const\n{\n    TConstUnionArray unionArray(1);\n    unionArray[0].setI8Const(i8);\n\n    return addConstantUnion(unionArray, TType(EbtInt8, EvqConst), loc, literal);\n}\n\nTIntermConstantUnion* TIntermediate::addConstantUnion(unsigned char u8, const TSourceLoc& loc, bool literal) const\n{\n    TConstUnionArray unionArray(1);\n    unionArray[0].setUConst(u8);\n\n    return addConstantUnion(unionArray, TType(EbtUint8, EvqConst), loc, literal);\n}\n\nTIntermConstantUnion* TIntermediate::addConstantUnion(signed short i16, const TSourceLoc& loc, bool literal) const\n{\n    TConstUnionArray unionArray(1);\n    unionArray[0].setI16Const(i16);\n\n    return addConstantUnion(unionArray, TType(EbtInt16, EvqConst), loc, literal);\n}\n\nTIntermConstantUnion* TIntermediate::addConstantUnion(unsigned short u16, const TSourceLoc& loc, bool literal) const\n{\n    TConstUnionArray unionArray(1);\n    unionArray[0].setU16Const(u16);\n\n    return addConstantUnion(unionArray, TType(EbtUint16, EvqConst), loc, literal);\n}\n\nTIntermConstantUnion* TIntermediate::addConstantUnion(int i, const TSourceLoc& loc, bool literal) const\n{\n    TConstUnionArray unionArray(1);\n    unionArray[0].setIConst(i);\n\n    return addConstantUnion(unionArray, TType(EbtInt, EvqConst), loc, literal);\n}\n\nTIntermConstantUnion* TIntermediate::addConstantUnion(unsigned int u, const TSourceLoc& loc, bool literal) const\n{\n    TConstUnionArray unionArray(1);\n    unionArray[0].setUConst(u);\n\n    return addConstantUnion(unionArray, TType(EbtUint, EvqConst), loc, literal);\n}\n\nTIntermConstantUnion* TIntermediate::addConstantUnion(long long i64, const TSourceLoc& loc, bool literal) const\n{\n    TConstUnionArray unionArray(1);\n    unionArray[0].setI64Const(i64);\n\n    return addConstantUnion(unionArray, TType(EbtInt64, EvqConst), loc, literal);\n}\n\nTIntermConstantUnion* TIntermediate::addConstantUnion(unsigned long long u64, const TSourceLoc& loc, bool literal) const\n{\n    TConstUnionArray unionArray(1);\n    unionArray[0].setU64Const(u64);\n\n    return addConstantUnion(unionArray, TType(EbtUint64, EvqConst), loc, literal);\n}\n\nTIntermConstantUnion* TIntermediate::addConstantUnion(bool b, const TSourceLoc& loc, bool literal) const\n{\n    TConstUnionArray unionArray(1);\n    unionArray[0].setBConst(b);\n\n    return addConstantUnion(unionArray, TType(EbtBool, EvqConst), loc, literal);\n}\n\nTIntermConstantUnion* TIntermediate::addConstantUnion(double d, TBasicType baseType, const TSourceLoc& loc, bool literal) const\n{\n    assert(baseType == EbtFloat || baseType == EbtDouble || baseType == EbtFloat16 || baseType == EbtBFloat16 || baseType == EbtFloatE5M2 || baseType == EbtFloatE4M3);\n\n    if (isEsProfile() && (baseType == EbtFloat || baseType == EbtFloat16)) {\n        int exponent = 0;\n        frexp(d, &exponent);\n        int minExp = baseType == EbtFloat ? -126 : -14;\n        int maxExp = baseType == EbtFloat ? 127 : 15;\n        if (exponent > maxExp) { //overflow, d = inf\n            d = std::numeric_limits<double>::infinity();\n        } else if (exponent < minExp) { //underflow, d = 0.0;\n            d = 0.0;\n        }\n    }\n\n    TConstUnionArray unionArray(1);\n    unionArray[0].setDConst(d);\n\n    return addConstantUnion(unionArray, TType(baseType, EvqConst), loc, literal);\n}\n\nTIntermConstantUnion* TIntermediate::addConstantUnion(const TString* s, const TSourceLoc& loc, bool literal) const\n{\n    TConstUnionArray unionArray(1);\n    unionArray[0].setSConst(s);\n\n    return addConstantUnion(unionArray, TType(EbtString, EvqConst), loc, literal);\n}\n\n// Put vector swizzle selectors onto the given sequence\nvoid TIntermediate::pushSelector(TIntermSequence& sequence, const TVectorSelector& selector, const TSourceLoc& loc)\n{\n    TIntermConstantUnion* constIntNode = addConstantUnion(selector, loc);\n    sequence.push_back(constIntNode);\n}\n\n// Put matrix swizzle selectors onto the given sequence\nvoid TIntermediate::pushSelector(TIntermSequence& sequence, const TMatrixSelector& selector, const TSourceLoc& loc)\n{\n    TIntermConstantUnion* constIntNode = addConstantUnion(selector.coord1, loc);\n    sequence.push_back(constIntNode);\n    constIntNode = addConstantUnion(selector.coord2, loc);\n    sequence.push_back(constIntNode);\n}\n\n// Make an aggregate node that has a sequence of all selectors.\ntemplate TIntermTyped* TIntermediate::addSwizzle<TVectorSelector>(TSwizzleSelectors<TVectorSelector>& selector, const TSourceLoc& loc);\ntemplate TIntermTyped* TIntermediate::addSwizzle<TMatrixSelector>(TSwizzleSelectors<TMatrixSelector>& selector, const TSourceLoc& loc);\ntemplate<typename selectorType>\nTIntermTyped* TIntermediate::addSwizzle(TSwizzleSelectors<selectorType>& selector, const TSourceLoc& loc)\n{\n    TIntermAggregate* node = new TIntermAggregate(EOpSequence);\n\n    node->setLoc(loc);\n    TIntermSequence &sequenceVector = node->getSequence();\n\n    for (int i = 0; i < selector.size(); i++)\n        pushSelector(sequenceVector, selector[i], loc);\n\n    return node;\n}\n\n//\n// Follow the left branches down to the root of an l-value\n// expression (just \".\" and []).\n//\n// Return the base of the l-value (where following indexing quits working).\n// Return nullptr if a chain following dereferences cannot be followed.\n//\n// 'swizzleOkay' says whether or not it is okay to consider a swizzle\n// a valid part of the dereference chain.\n//\n// 'bufferReferenceOk' says if type is buffer_reference, the routine will stop to find the most left node.\n//\n// 'proc' is an optional function to run on each node that is processed during the traversal. 'proc' must\n// return true to continue the traversal, or false to end the traversal early.\n//\n\nconst TIntermTyped* TIntermediate::traverseLValueBase(const TIntermTyped* node, bool swizzleOkay,\n                                                      bool bufferReferenceOk,\n                                                      std::function<bool(const TIntermNode&)> proc)\n{\n    do {\n        const TIntermBinary* binary = node->getAsBinaryNode();\n        if (binary == nullptr) {\n            if (proc) {\n                proc(*node);\n            }\n            return node;\n        }\n        TOperator op = binary->getOp();\n        if (op != EOpIndexDirect && op != EOpIndexIndirect && op != EOpIndexDirectStruct && op != EOpVectorSwizzle &&\n            op != EOpMatrixSwizzle)\n            return nullptr;\n        if (!swizzleOkay) {\n            if (op == EOpVectorSwizzle || op == EOpMatrixSwizzle)\n                return nullptr;\n            if ((op == EOpIndexDirect || op == EOpIndexIndirect) &&\n                (binary->getLeft()->getType().isVector() || binary->getLeft()->getType().isScalar()) &&\n                !binary->getLeft()->getType().isArray())\n                return nullptr;\n        }\n        if (proc) {\n            if (!proc(*node)) {\n                return node;\n            }\n        }\n        node = binary->getLeft();\n        if (bufferReferenceOk && node->isReference())\n            return node;\n    } while (true);\n}\n\n//\n// Create while and do-while loop nodes.\n//\nTIntermLoop* TIntermediate::addLoop(TIntermNode* body, TIntermTyped* test, TIntermTyped* terminal, bool testFirst,\n    const TSourceLoc& loc)\n{\n    TIntermLoop* node = new TIntermLoop(body, test, terminal, testFirst);\n    node->setLoc(loc);\n\n    return node;\n}\n\n//\n// Create a for-loop sequence.\n//\nTIntermAggregate* TIntermediate::addForLoop(TIntermNode* body, TIntermNode* initializer, TIntermTyped* test,\n    TIntermTyped* terminal, bool testFirst, const TSourceLoc& loc, TIntermLoop*& node)\n{\n    node = new TIntermLoop(body, test, terminal, testFirst);\n    node->setLoc(loc);\n\n    // make a sequence of the initializer and statement, but try to reuse the\n    // aggregate already created for whatever is in the initializer, if there is one\n    TIntermAggregate* loopSequence = (initializer == nullptr ||\n                                      initializer->getAsAggregate() == nullptr) ? makeAggregate(initializer, loc)\n                                                                                : initializer->getAsAggregate();\n    if (loopSequence != nullptr && (loopSequence->getOp() == EOpSequence || loopSequence->getOp() == EOpScope))\n        loopSequence->setOp(EOpNull);\n    loopSequence = growAggregate(loopSequence, node);\n    loopSequence->setOperator(getDebugInfo() ? EOpScope : EOpSequence);\n\n    return loopSequence;\n}\n\n//\n// Add branches.\n//\nTIntermBranch* TIntermediate::addBranch(TOperator branchOp, const TSourceLoc& loc)\n{\n    return addBranch(branchOp, nullptr, loc);\n}\n\nTIntermBranch* TIntermediate::addBranch(TOperator branchOp, TIntermTyped* expression, const TSourceLoc& loc)\n{\n    TIntermBranch* node = new TIntermBranch(branchOp, expression);\n    node->setLoc(loc);\n\n    return node;\n}\n\n// Propagate precision from formal function return type to actual return type,\n// and on to its subtree.\nvoid TIntermBranch::updatePrecision(TPrecisionQualifier parentPrecision)\n{\n    TIntermTyped* exp = getExpression();\n    if (exp == nullptr)\n        return;\n\n    if (exp->getBasicType() == EbtInt || exp->getBasicType() == EbtUint ||\n        exp->getBasicType() == EbtFloat) {\n        if (parentPrecision != EpqNone && exp->getQualifier().precision == EpqNone) {\n            exp->propagatePrecision(parentPrecision);\n        }\n    }\n}\n\n//\n// This is to be executed after the final root is put on top by the parsing\n// process.\n//\nbool TIntermediate::postProcess(TIntermNode* root, EShLanguage /*language*/)\n{\n    if (root == nullptr)\n        return true;\n\n    // Finish off the top-level sequence\n    TIntermAggregate* aggRoot = root->getAsAggregate();\n    if (aggRoot && aggRoot->getOp() == EOpNull)\n        aggRoot->setOperator(EOpSequence);\n\n    // Propagate 'noContraction' label in backward from 'precise' variables.\n    glslang::PropagateNoContraction(*this);\n\n    switch (textureSamplerTransformMode) {\n    case EShTexSampTransKeep:\n        break;\n    case EShTexSampTransUpgradeTextureRemoveSampler:\n        performTextureUpgradeAndSamplerRemovalTransformation(root);\n        break;\n    case EShTexSampTransCount:\n        assert(0);\n        break;\n    }\n\n    return true;\n}\n\nvoid TIntermediate::addSymbolLinkageNodes(TIntermAggregate*& linkage, EShLanguage language, TSymbolTable& symbolTable)\n{\n    // Add top-level nodes for declarations that must be checked cross\n    // compilation unit by a linker, yet might not have been referenced\n    // by the AST.\n    //\n    // Almost entirely, translation of symbols is driven by what's present\n    // in the AST traversal, not by translating the symbol table.\n    //\n    // However, there are some special cases:\n    //  - From the specification: \"Special built-in inputs gl_VertexID and\n    //    gl_InstanceID are also considered active vertex attributes.\"\n    //  - Linker-based type mismatch error reporting needs to see all\n    //    uniforms/ins/outs variables and blocks.\n    //  - ftransform() can make gl_Vertex and gl_ModelViewProjectionMatrix active.\n    //\n\n    // if (ftransformUsed) {\n        // TODO: 1.1 lowering functionality: track ftransform() usage\n    //    addSymbolLinkageNode(root, symbolTable, \"gl_Vertex\");\n    //    addSymbolLinkageNode(root, symbolTable, \"gl_ModelViewProjectionMatrix\");\n    //}\n\n    if (language == EShLangVertex) {\n        addSymbolLinkageNode(linkage, symbolTable, \"gl_VertexID\");\n        if ((version < 140 && requestedExtensions.find(E_GL_EXT_draw_instanced) != requestedExtensions.end()) || version >= 140)\n            addSymbolLinkageNode(linkage, symbolTable, \"gl_InstanceID\");\n    }\n\n    // Add a child to the root node for the linker objects\n    linkage->setOperator(EOpLinkerObjects);\n    treeRoot = growAggregate(treeRoot, linkage);\n}\n\n//\n// Add the given name or symbol to the list of nodes at the end of the tree used\n// for link-time checking and external linkage.\n//\n\nvoid TIntermediate::addSymbolLinkageNode(TIntermAggregate*& linkage, TSymbolTable& symbolTable, const TString& name)\n{\n    TSymbol* symbol = symbolTable.find(name);\n    if (symbol)\n        addSymbolLinkageNode(linkage, *symbol->getAsVariable());\n}\n\nvoid TIntermediate::addSymbolLinkageNode(TIntermAggregate*& linkage, const TSymbol& symbol)\n{\n    const TVariable* variable = symbol.getAsVariable();\n    if (! variable) {\n        // This must be a member of an anonymous block, and we need to add the whole block\n        const TAnonMember* anon = symbol.getAsAnonMember();\n        variable = &anon->getAnonContainer();\n    }\n    TIntermSymbol* node = addSymbol(*variable);\n    linkage = growAggregate(linkage, node);\n}\n\n//\n// Add a caller->callee relationship to the call graph.\n// Assumes the strings are unique per signature.\n//\nvoid TIntermediate::addToCallGraph(TInfoSink& /*infoSink*/, const TString& caller, const TString& callee)\n{\n    // Duplicates are okay, but faster to not keep them, and they come grouped by caller,\n    // as long as new ones are push on the same end we check on for duplicates\n    for (TGraph::const_iterator call = callGraph.begin(); call != callGraph.end(); ++call) {\n        if (call->caller != caller)\n            break;\n        if (call->callee == callee)\n            return;\n    }\n\n    callGraph.emplace_front(caller, callee);\n}\n\n//\n// This deletes the tree.\n//\nvoid TIntermediate::removeTree()\n{\n    if (treeRoot)\n        RemoveAllTreeNodes(treeRoot);\n}\n\n//\n// Implement the part of KHR_vulkan_glsl that lists the set of operations\n// that can result in a specialization constant operation.\n//\n// \"5.x Specialization Constant Operations\"\n//\n//    Only some operations discussed in this section may be applied to a\n//    specialization constant and still yield a result that is as\n//    specialization constant.  The operations allowed are listed below.\n//    When a specialization constant is operated on with one of these\n//    operators and with another constant or specialization constant, the\n//    result is implicitly a specialization constant.\n//\n//     - int(), uint(), and bool() constructors for type conversions\n//       from any of the following types to any of the following types:\n//         * int\n//         * uint\n//         * bool\n//     - vector versions of the above conversion constructors\n//     - allowed implicit conversions of the above\n//     - swizzles (e.g., foo.yx)\n//     - The following when applied to integer or unsigned integer types:\n//         * unary negative ( - )\n//         * binary operations ( + , - , * , / , % )\n//         * shift ( <<, >> )\n//         * bitwise operations ( & , | , ^ )\n//     - The following when applied to integer or unsigned integer scalar types:\n//         * comparison ( == , != , > , >= , < , <= )\n//     - The following when applied to the Boolean scalar type:\n//         * not ( ! )\n//         * logical operations ( && , || , ^^ )\n//         * comparison ( == , != )\"\n//\n// This function just handles binary and unary nodes.  Construction\n// rules are handled in construction paths that are not covered by the unary\n// and binary paths, while required conversions will still show up here\n// as unary converters in the from a construction operator.\n//\nbool TIntermediate::isSpecializationOperation(const TIntermOperator& node) const\n{\n    // The operations resulting in floating point are quite limited\n    // (However, some floating-point operations result in bool, like \">\",\n    // so are handled later.)\n    if (node.getType().isFloatingDomain()) {\n        if (IsOpNumericConv(node.getOp()) &&\n            isTypeFloat(node.getType().getBasicType()) &&\n            isTypeFloat(node.getAsUnaryNode()->getOperand()->getAsTyped()->getType().getBasicType())) {\n            return true;\n        }\n        switch (node.getOp()) {\n        case EOpIndexDirect:\n        case EOpIndexIndirect:\n        case EOpIndexDirectStruct:\n        case EOpVectorSwizzle:\n            return true;\n        default:\n            return false;\n        }\n    }\n\n    // Check for floating-point arguments\n    if (const TIntermBinary* bin = node.getAsBinaryNode())\n        if (bin->getLeft() ->getType().isFloatingDomain() ||\n            bin->getRight()->getType().isFloatingDomain())\n            return false;\n\n    // So, for now, we can assume everything left is non-floating-point...\n\n    if (IsOpNumericConv(node.getOp())) {\n        TBasicType srcType = node.getAsUnaryNode()->getOperand()->getAsTyped()->getType().getBasicType();\n        TBasicType dstType = node.getType().getBasicType();\n        if ((isTypeInt(srcType) || srcType == EbtBool) &&\n            (isTypeInt(dstType) || dstType == EbtBool)) {\n            return true;\n        }\n    }\n\n    // Now check for integer/bool-based operations\n    switch (node.getOp()) {\n\n    // dereference/swizzle\n    case EOpIndexDirect:\n    case EOpIndexIndirect:\n    case EOpIndexDirectStruct:\n    case EOpVectorSwizzle:\n\n    // unary operations\n    case EOpNegative:\n    case EOpLogicalNot:\n    case EOpBitwiseNot:\n\n    // binary operations\n    case EOpAdd:\n    case EOpSub:\n    case EOpMul:\n    case EOpVectorTimesScalar:\n    case EOpDiv:\n    case EOpMod:\n    case EOpRightShift:\n    case EOpLeftShift:\n    case EOpAnd:\n    case EOpInclusiveOr:\n    case EOpExclusiveOr:\n    case EOpLogicalOr:\n    case EOpLogicalXor:\n    case EOpLogicalAnd:\n    case EOpEqual:\n    case EOpNotEqual:\n    case EOpLessThan:\n    case EOpGreaterThan:\n    case EOpLessThanEqual:\n    case EOpGreaterThanEqual:\n        return true;\n    default:\n        return false;\n    }\n}\n\n// Is the operation one that must propagate nonuniform?\nbool TIntermediate::isNonuniformPropagating(TOperator op) const\n{\n    // \"* All Operators in Section 5.1 (Operators), except for assignment,\n    //    arithmetic assignment, and sequence\n    //  * Component selection in Section 5.5\n    //  * Matrix components in Section 5.6\n    //  * Structure and Array Operations in Section 5.7, except for the length\n    //    method.\"\n    switch (op) {\n    case EOpPostIncrement:\n    case EOpPostDecrement:\n    case EOpPreIncrement:\n    case EOpPreDecrement:\n\n    case EOpNegative:\n    case EOpLogicalNot:\n    case EOpVectorLogicalNot:\n    case EOpBitwiseNot:\n\n    case EOpAdd:\n    case EOpSub:\n    case EOpMul:\n    case EOpDiv:\n    case EOpMod:\n    case EOpRightShift:\n    case EOpLeftShift:\n    case EOpAnd:\n    case EOpInclusiveOr:\n    case EOpExclusiveOr:\n    case EOpEqual:\n    case EOpNotEqual:\n    case EOpLessThan:\n    case EOpGreaterThan:\n    case EOpLessThanEqual:\n    case EOpGreaterThanEqual:\n    case EOpVectorTimesScalar:\n    case EOpVectorTimesMatrix:\n    case EOpMatrixTimesVector:\n    case EOpMatrixTimesScalar:\n\n    case EOpLogicalOr:\n    case EOpLogicalXor:\n    case EOpLogicalAnd:\n\n    case EOpIndexDirect:\n    case EOpIndexIndirect:\n    case EOpIndexDirectStruct:\n    case EOpVectorSwizzle:\n        return true;\n\n    default:\n        break;\n    }\n\n    return false;\n}\n\n////////////////////////////////////////////////////////////////\n//\n// Member functions of the nodes used for building the tree.\n//\n////////////////////////////////////////////////////////////////\n\n//\n// Say whether or not an operation node changes the value of a variable.\n//\n// Returns true if state is modified.\n//\nbool TIntermOperator::modifiesState() const\n{\n    switch (op) {\n    case EOpPostIncrement:\n    case EOpPostDecrement:\n    case EOpPreIncrement:\n    case EOpPreDecrement:\n    case EOpAssign:\n    case EOpAddAssign:\n    case EOpSubAssign:\n    case EOpMulAssign:\n    case EOpVectorTimesMatrixAssign:\n    case EOpVectorTimesScalarAssign:\n    case EOpMatrixTimesScalarAssign:\n    case EOpMatrixTimesMatrixAssign:\n    case EOpDivAssign:\n    case EOpModAssign:\n    case EOpAndAssign:\n    case EOpInclusiveOrAssign:\n    case EOpExclusiveOrAssign:\n    case EOpLeftShiftAssign:\n    case EOpRightShiftAssign:\n        return true;\n    default:\n        return false;\n    }\n}\n\n//\n// returns true if the operator is for one of the constructors\n//\nbool TIntermOperator::isConstructor() const\n{\n    return op > EOpConstructGuardStart && op < EOpConstructGuardEnd;\n}\n\n//\n// Make sure the type of an operator is appropriate for its\n// combination of operation and operand type.  This will invoke\n// promoteUnary, promoteBinary, etc as needed.\n//\n// Returns false if nothing makes sense.\n//\nbool TIntermediate::promote(TIntermOperator* node)\n{\n    if (node == nullptr)\n        return false;\n\n    if (node->getAsUnaryNode())\n        return promoteUnary(*node->getAsUnaryNode());\n\n    if (node->getAsBinaryNode())\n        return promoteBinary(*node->getAsBinaryNode());\n\n    if (node->getAsAggregate())\n        return promoteAggregate(*node->getAsAggregate());\n\n    return false;\n}\n\n//\n// See TIntermediate::promote\n//\nbool TIntermediate::promoteUnary(TIntermUnary& node)\n{\n    const TOperator op    = node.getOp();\n    TIntermTyped* operand = node.getOperand();\n\n    switch (op) {\n    case EOpLogicalNot:\n        // Convert operand to a boolean type\n        if (operand->getBasicType() != EbtBool) {\n            // Add constructor to boolean type. If that fails, we can't do it, so return false.\n            TIntermTyped* converted = addConversion(op, TType(EbtBool), operand);\n            if (converted == nullptr)\n                return false;\n\n            // Use the result of converting the node to a bool.\n            node.setOperand(operand = converted); // also updates stack variable\n        }\n        break;\n    case EOpBitwiseNot:\n        if (!isTypeInt(operand->getBasicType()))\n            return false;\n        break;\n    case EOpNegative:\n    case EOpPostIncrement:\n    case EOpPostDecrement:\n    case EOpPreIncrement:\n    case EOpPreDecrement:\n        if (!isTypeInt(operand->getBasicType()) &&\n            operand->getBasicType() != EbtFloat &&\n            operand->getBasicType() != EbtFloat16 &&\n            operand->getBasicType() != EbtDouble)\n\n            return false;\n        break;\n    default:\n        // HLSL uses this path for initial function signature finding for built-ins\n        // taking a single argument, which generally don't participate in\n        // operator-based type promotion (type conversion will occur later).\n        // For now, scalar argument cases are relying on the setType() call below.\n        if (getSource() == EShSourceHlsl)\n            break;\n\n        // GLSL only allows integer arguments for the cases identified above in the\n        // case statements.\n        if (operand->getBasicType() != EbtFloat)\n            return false;\n    }\n\n    node.setType(operand->getType());\n    node.getWritableType().getQualifier().makeTemporary();\n\n    return true;\n}\n\n// Propagate precision qualifiers *up* from children to parent.\nvoid TIntermUnary::updatePrecision()\n{\n    if (getBasicType() == EbtInt || getBasicType() == EbtUint ||\n        getBasicType() == EbtFloat) {\n        if (operand->getQualifier().precision > getQualifier().precision)\n            getQualifier().precision = operand->getQualifier().precision;\n    }\n}\n\n//\n// See TIntermediate::promote\n//\nbool TIntermediate::promoteBinary(TIntermBinary& node)\n{\n    TOperator     op    = node.getOp();\n    TIntermTyped* left  = node.getLeft();\n    TIntermTyped* right = node.getRight();\n\n    // Arrays and structures have to be exact matches.\n    if ((left->isArray() || right->isArray() || left->getBasicType() == EbtStruct || right->getBasicType() == EbtStruct)\n        && left->getType() != right->getType())\n        return false;\n\n    // Base assumption:  just make the type the same as the left\n    // operand.  Only deviations from this will be coded.\n    node.setType(left->getType());\n    node.getWritableType().getQualifier().clear();\n\n    // Composite and opaque types don't having pending operator changes, e.g.,\n    // array, structure, and samplers.  Just establish final type and correctness.\n    if (left->isArray() || left->getBasicType() == EbtStruct || left->getBasicType() == EbtSampler) {\n        switch (op) {\n        case EOpEqual:\n        case EOpNotEqual:\n            if (left->getBasicType() == EbtSampler) {\n                // can't compare samplers\n                return false;\n            } else {\n                // Promote to conditional\n                node.setType(TType(EbtBool));\n            }\n\n            return true;\n\n        case EOpAssign:\n            // Keep type from above\n\n            return true;\n\n        default:\n            return false;\n        }\n    }\n\n    //\n    // We now have only scalars, vectors, and matrices to worry about.\n    //\n\n    // HLSL implicitly promotes bool -> int for numeric operations.\n    // (Implicit conversions to make the operands match each other's types were already done.)\n    if (getSource() == EShSourceHlsl &&\n        (left->getBasicType() == EbtBool || right->getBasicType() == EbtBool)) {\n        switch (op) {\n        case EOpLessThan:\n        case EOpGreaterThan:\n        case EOpLessThanEqual:\n        case EOpGreaterThanEqual:\n\n        case EOpRightShift:\n        case EOpLeftShift:\n\n        case EOpMod:\n\n        case EOpAnd:\n        case EOpInclusiveOr:\n        case EOpExclusiveOr:\n\n        case EOpAdd:\n        case EOpSub:\n        case EOpDiv:\n        case EOpMul:\n            if (left->getBasicType() == EbtBool)\n                left  = createConversion(EbtInt, left);\n            if (right->getBasicType() == EbtBool)\n                right = createConversion(EbtInt, right);\n            if (left == nullptr || right == nullptr)\n                return false;\n            node.setLeft(left);\n            node.setRight(right);\n\n            // Update the original base assumption on result type..\n            node.setType(left->getType());\n            node.getWritableType().getQualifier().clear();\n\n            break;\n\n        default:\n            break;\n        }\n    }\n\n    // Do general type checks against individual operands (comparing left and right is coming up, checking mixed shapes after that)\n    switch (op) {\n    case EOpLessThan:\n    case EOpGreaterThan:\n    case EOpLessThanEqual:\n    case EOpGreaterThanEqual:\n        // Relational comparisons need numeric types and will promote to scalar Boolean.\n        if (left->getBasicType() == EbtBool)\n            return false;\n\n        node.setType(TType(EbtBool, EvqTemporary, left->getVectorSize()));\n        break;\n\n    case EOpEqual:\n    case EOpNotEqual:\n        if (getSource() == EShSourceHlsl) {\n            const int resultWidth = std::max(left->getVectorSize(), right->getVectorSize());\n\n            // In HLSL, == or != on vectors means component-wise comparison.\n            if (resultWidth > 1) {\n                op = (op == EOpEqual) ? EOpVectorEqual : EOpVectorNotEqual;\n                node.setOp(op);\n            }\n\n            node.setType(TType(EbtBool, EvqTemporary, resultWidth));\n        } else {\n            // All the above comparisons result in a bool (but not the vector compares)\n            node.setType(TType(EbtBool));\n        }\n        break;\n\n    case EOpLogicalAnd:\n    case EOpLogicalOr:\n    case EOpLogicalXor:\n        // logical ops operate only on Booleans or vectors of Booleans.\n        if (left->getBasicType() != EbtBool || left->isMatrix())\n                return false;\n\n        if (getSource() == EShSourceGlsl) {\n            // logical ops operate only on scalar Booleans and will promote to scalar Boolean.\n            if (left->isVector())\n                return false;\n        }\n\n        node.setType(TType(EbtBool, EvqTemporary, left->getVectorSize()));\n        break;\n\n    case EOpRightShift:\n    case EOpLeftShift:\n    case EOpRightShiftAssign:\n    case EOpLeftShiftAssign:\n\n    case EOpMod:\n    case EOpModAssign:\n\n    case EOpAnd:\n    case EOpInclusiveOr:\n    case EOpExclusiveOr:\n    case EOpAndAssign:\n    case EOpInclusiveOrAssign:\n    case EOpExclusiveOrAssign:\n        if (getSource() == EShSourceHlsl)\n            break;\n\n        // Check for integer-only operands.\n        if (!isTypeInt(left->getBasicType()) && !isTypeInt(right->getBasicType()))\n            return false;\n        if (left->isMatrix() || right->isMatrix())\n            return false;\n\n        break;\n\n    case EOpAdd:\n    case EOpSub:\n    case EOpDiv:\n    case EOpMul:\n    case EOpAddAssign:\n    case EOpSubAssign:\n    case EOpMulAssign:\n    case EOpDivAssign:\n        // check for non-Boolean operands\n        if (left->getBasicType() == EbtBool || right->getBasicType() == EbtBool)\n            return false;\n        break;\n\n    default:\n        break;\n    }\n\n    // Compare left and right, and finish with the cases where the operand types must match\n    switch (op) {\n    case EOpLessThan:\n    case EOpGreaterThan:\n    case EOpLessThanEqual:\n    case EOpGreaterThanEqual:\n\n    case EOpEqual:\n    case EOpNotEqual:\n    case EOpVectorEqual:\n    case EOpVectorNotEqual:\n\n    case EOpLogicalAnd:\n    case EOpLogicalOr:\n    case EOpLogicalXor:\n        return left->getType() == right->getType();\n\n    case EOpMod:\n    case EOpModAssign:\n\n    case EOpAnd:\n    case EOpInclusiveOr:\n    case EOpExclusiveOr:\n    case EOpAndAssign:\n    case EOpInclusiveOrAssign:\n    case EOpExclusiveOrAssign:\n\n    case EOpAdd:\n    case EOpSub:\n    case EOpDiv:\n\n    case EOpAddAssign:\n    case EOpSubAssign:\n    case EOpDivAssign:\n        // Quick out in case the types do match\n        if (left->getType() == right->getType())\n            return true;\n\n        [[fallthrough]];\n\n    case EOpMul:\n    case EOpMulAssign:\n        // At least the basic type has to match\n        if (left->getBasicType() != right->getBasicType())\n            return false;\n        break;\n\n    default:\n        break;\n    }\n\n    if (left->getType().isCoopMat() || right->getType().isCoopMat()) {\n        // Operations on two cooperative matrices must have identical types\n        if (left->getType().isCoopMat() && right->getType().isCoopMat() &&\n            left->getType() != right->getType()) {\n            return false;\n        }\n        switch (op) {\n        case EOpMul:\n        case EOpMulAssign:\n            // Mul not supported in NV_cooperative_matrix\n            if (left->getType().isCoopMatNV() && right->getType().isCoopMatNV()) {\n                return false;\n            }\n            // NV_cooperative_matrix supports MulAssign is for mat*=scalar only.\n            // KHR_cooperative_matrix supports it for mat*=mat as well.\n            if (op == EOpMulAssign && right->getType().isCoopMatNV()) {\n                return false;\n            }\n            // Use MatrixTimesScalar if either operand is not a matrix. Otherwise use Mul.\n            if (!left->getType().isCoopMat() || !right->getType().isCoopMat()) {\n                node.setOp(op == EOpMulAssign ? EOpMatrixTimesScalarAssign : EOpMatrixTimesScalar);\n            }\n            // In case of scalar*matrix, take the result type from the matrix.\n            if (right->getType().isCoopMat()) {\n                node.setType(right->getType());\n            }\n            return true;\n        case EOpAdd:\n        case EOpSub:\n        case EOpDiv:\n        case EOpAssign:\n            // These require both to be cooperative matrices\n            if (!left->getType().isCoopMat() || !right->getType().isCoopMat()) {\n                return false;\n            }\n            return true;\n        default:\n            break;\n        }\n        return false;\n    }\n\n    if (left->getType().isCoopVecNV() || right->getType().isCoopVecNV()) {\n        // Operations on two cooperative vectors must have identical types\n        if (left->getType().isCoopVecNV() && right->getType().isCoopVecNV() &&\n            left->getType() != right->getType()) {\n            return false;\n        }\n        switch (op) {\n        case EOpMul:\n        case EOpMulAssign:\n            // Use VectorTimesScalar if either operand is not a vector. Otherwise use Mul.\n            if (!left->getType().isCoopVecNV() || !right->getType().isCoopVecNV()) {\n                node.setOp(op == EOpMulAssign ? EOpVectorTimesScalarAssign : EOpVectorTimesScalar);\n            }\n            // In case of scalar*vector, take the result type from the vector.\n            if (right->getType().isCoopVecNV()) {\n                node.setType(right->getType());\n            }\n            return true;\n        case EOpLeftShift:\n        case EOpLeftShiftAssign:\n        case EOpRightShift:\n        case EOpRightShiftAssign:\n        case EOpAdd:\n        case EOpSub:\n        case EOpDiv:\n        case EOpAssign:\n            // These require both to be cooperative vectors\n            if (!left->getType().isCoopVecNV() || !right->getType().isCoopVecNV()) {\n                return false;\n            }\n            return true;\n        default:\n            break;\n        }\n        return false;\n    }\n\n    // Finish handling the case, for all ops, where both operands are scalars.\n    if (left->isScalar() && right->isScalar())\n        return true;\n\n    // Finish handling the case, for all ops, where there are two vectors of different sizes\n    if (left->isVector() && right->isVector() && left->getVectorSize() != right->getVectorSize() && right->getVectorSize() > 1)\n        return false;\n\n    //\n    // We now have a mix of scalars, vectors, or matrices, for non-relational operations.\n    //\n\n    // Can these two operands be combined, what is the resulting type?\n    TBasicType basicType = left->getBasicType();\n    switch (op) {\n    case EOpMul:\n        if (!left->isMatrix() && right->isMatrix()) {\n            if (left->isVector()) {\n                if (left->getVectorSize() != right->getMatrixRows())\n                    return false;\n                node.setOp(op = EOpVectorTimesMatrix);\n                node.setType(TType(basicType, EvqTemporary, right->getMatrixCols()));\n            } else {\n                node.setOp(op = EOpMatrixTimesScalar);\n                node.setType(TType(basicType, EvqTemporary, 0, right->getMatrixCols(), right->getMatrixRows()));\n            }\n        } else if (left->isMatrix() && !right->isMatrix()) {\n            if (right->isVector()) {\n                if (left->getMatrixCols() != right->getVectorSize())\n                    return false;\n                node.setOp(op = EOpMatrixTimesVector);\n                node.setType(TType(basicType, EvqTemporary, left->getMatrixRows()));\n            } else {\n                node.setOp(op = EOpMatrixTimesScalar);\n            }\n        } else if (left->isMatrix() && right->isMatrix()) {\n            if (left->getMatrixCols() != right->getMatrixRows())\n                return false;\n            node.setOp(op = EOpMatrixTimesMatrix);\n            node.setType(TType(basicType, EvqTemporary, 0, right->getMatrixCols(), left->getMatrixRows()));\n        } else if (! left->isMatrix() && ! right->isMatrix()) {\n            if (left->isVector() && right->isVector()) {\n                ; // leave as component product\n            } else if (left->isVector() || right->isVector()) {\n                node.setOp(op = EOpVectorTimesScalar);\n                if (right->isVector())\n                    node.setType(TType(basicType, EvqTemporary, right->getVectorSize()));\n            }\n        } else {\n            return false;\n        }\n        break;\n    case EOpMulAssign:\n        if (! left->isMatrix() && right->isMatrix()) {\n            if (left->isVector()) {\n                if (left->getVectorSize() != right->getMatrixRows() || left->getVectorSize() != right->getMatrixCols())\n                    return false;\n                node.setOp(op = EOpVectorTimesMatrixAssign);\n            } else {\n                return false;\n            }\n        } else if (left->isMatrix() && !right->isMatrix()) {\n            if (right->isVector()) {\n                return false;\n            } else {\n                node.setOp(op = EOpMatrixTimesScalarAssign);\n            }\n        } else if (left->isMatrix() && right->isMatrix()) {\n            if (left->getMatrixCols() != right->getMatrixCols() || left->getMatrixCols() != right->getMatrixRows())\n                return false;\n            node.setOp(op = EOpMatrixTimesMatrixAssign);\n        } else if (!left->isMatrix() && !right->isMatrix()) {\n            if (left->isVector() && right->isVector()) {\n                // leave as component product\n            } else if (left->isVector() || right->isVector()) {\n                if (! left->isVector())\n                    return false;\n                node.setOp(op = EOpVectorTimesScalarAssign);\n            }\n        } else {\n            return false;\n        }\n        break;\n\n    case EOpRightShift:\n    case EOpLeftShift:\n    case EOpRightShiftAssign:\n    case EOpLeftShiftAssign:\n        if (right->isVector() && (! left->isVector() || right->getVectorSize() != left->getVectorSize()))\n            return false;\n        break;\n\n    case EOpAssign:\n        if (left->getVectorSize() != right->getVectorSize() || left->getMatrixCols() != right->getMatrixCols() || left->getMatrixRows() != right->getMatrixRows())\n            return false;\n        [[fallthrough]];\n\n    case EOpAdd:\n    case EOpSub:\n    case EOpDiv:\n    case EOpMod:\n    case EOpAnd:\n    case EOpInclusiveOr:\n    case EOpExclusiveOr:\n    case EOpAddAssign:\n    case EOpSubAssign:\n    case EOpDivAssign:\n    case EOpModAssign:\n    case EOpAndAssign:\n    case EOpInclusiveOrAssign:\n    case EOpExclusiveOrAssign:\n\n        if ((left->isMatrix() && right->isVector()) ||\n            (left->isVector() && right->isMatrix()) ||\n            left->getBasicType() != right->getBasicType())\n            return false;\n        if (left->isMatrix() && right->isMatrix() && (left->getMatrixCols() != right->getMatrixCols() || left->getMatrixRows() != right->getMatrixRows()))\n            return false;\n        if (left->isVector() && right->isVector() && left->getVectorSize() != right->getVectorSize())\n            return false;\n        if (right->isVector() || right->isMatrix()) {\n            node.getWritableType().shallowCopy(right->getType());\n            node.getWritableType().getQualifier().makeTemporary();\n        }\n        break;\n\n    default:\n        return false;\n    }\n\n    //\n    // One more check for assignment.\n    //\n    switch (op) {\n    // The resulting type has to match the left operand.\n    case EOpAssign:\n    case EOpAddAssign:\n    case EOpSubAssign:\n    case EOpMulAssign:\n    case EOpDivAssign:\n    case EOpModAssign:\n    case EOpAndAssign:\n    case EOpInclusiveOrAssign:\n    case EOpExclusiveOrAssign:\n    case EOpLeftShiftAssign:\n    case EOpRightShiftAssign:\n        if (node.getType() != left->getType())\n            return false;\n        break;\n    default:\n        break;\n    }\n\n    return true;\n}\n\n//\n// See TIntermediate::promote\n//\nbool TIntermediate::promoteAggregate(TIntermAggregate& node)\n{\n    TOperator op = node.getOp();\n    TIntermSequence& args = node.getSequence();\n    const int numArgs = static_cast<int>(args.size());\n\n    // Presently, only hlsl does intrinsic promotions.\n    if (getSource() != EShSourceHlsl)\n        return true;\n\n    // set of opcodes that can be promoted in this manner.\n    switch (op) {\n    case EOpAtan:\n    case EOpClamp:\n    case EOpCross:\n    case EOpDistance:\n    case EOpDot:\n    case EOpDst:\n    case EOpFaceForward:\n    // case EOpFindMSB: TODO:\n    // case EOpFindLSB: TODO:\n    case EOpFma:\n    case EOpMod:\n    case EOpFrexp:\n    case EOpLdexp:\n    case EOpMix:\n    case EOpLit:\n    case EOpMax:\n    case EOpMin:\n    case EOpModf:\n    // case EOpGenMul: TODO:\n    case EOpPow:\n    case EOpReflect:\n    case EOpRefract:\n    // case EOpSinCos: TODO:\n    case EOpSmoothStep:\n    case EOpStep:\n        break;\n    default:\n        return true;\n    }\n\n    // TODO: array and struct behavior\n\n    // Try converting all nodes to the given node's type\n    TIntermSequence convertedArgs(numArgs, nullptr);\n\n    // Try to convert all types to the nonConvArg type.\n    for (int nonConvArg = 0; nonConvArg < numArgs; ++nonConvArg) {\n        // Try converting all args to this arg's type\n        for (int convArg = 0; convArg < numArgs; ++convArg) {\n            convertedArgs[convArg] = addConversion(op, args[nonConvArg]->getAsTyped()->getType(),\n                                                   args[convArg]->getAsTyped());\n        }\n\n        // If we successfully converted all the args, use the result.\n        if (std::all_of(convertedArgs.begin(), convertedArgs.end(),\n                        [](const TIntermNode* node) { return node != nullptr; })) {\n\n            std::swap(args, convertedArgs);\n            return true;\n        }\n    }\n\n    return false;\n}\n\n// Propagate precision qualifiers *up* from children to parent, and then\n// back *down* again to the children's subtrees.\nvoid TIntermAggregate::updatePrecision()\n{\n    if (getBasicType() == EbtInt || getBasicType() == EbtUint ||\n        getBasicType() == EbtFloat) {\n        TPrecisionQualifier maxPrecision = EpqNone;\n        TIntermSequence operands = getSequence();\n        for (unsigned int i = 0; i < operands.size(); ++i) {\n            TIntermTyped* typedNode = operands[i]->getAsTyped();\n            assert(typedNode);\n            maxPrecision = std::max(maxPrecision, typedNode->getQualifier().precision);\n        }\n        getQualifier().precision = maxPrecision;\n        for (unsigned int i = 0; i < operands.size(); ++i) {\n          TIntermTyped* typedNode = operands[i]->getAsTyped();\n          assert(typedNode);\n          typedNode->propagatePrecision(maxPrecision);\n        }\n    }\n}\n\n// Propagate precision qualifiers *up* from children to parent, and then\n// back *down* again to the children's subtrees.\nvoid TIntermBinary::updatePrecision()\n{\n     if (getBasicType() == EbtInt || getBasicType() == EbtUint ||\n         getBasicType() == EbtFloat) {\n       if (op == EOpRightShift || op == EOpLeftShift) {\n         // For shifts get precision from left side only and thus no need to propagate\n         getQualifier().precision = left->getQualifier().precision;\n       } else {\n         getQualifier().precision = std::max(right->getQualifier().precision, left->getQualifier().precision);\n         if (getQualifier().precision != EpqNone) {\n           left->propagatePrecision(getQualifier().precision);\n           right->propagatePrecision(getQualifier().precision);\n         }\n       }\n    }\n}\n\n// Recursively propagate precision qualifiers *down* the subtree of the current node,\n// until reaching a node that already has a precision qualifier or otherwise does\n// not participate in precision propagation.\nvoid TIntermTyped::propagatePrecision(TPrecisionQualifier newPrecision)\n{\n    if (getQualifier().precision != EpqNone ||\n        (getBasicType() != EbtInt && getBasicType() != EbtUint &&\n         getBasicType() != EbtFloat && getBasicType() != EbtFloat16))\n        return;\n\n    getQualifier().precision = newPrecision;\n\n    TIntermBinary* binaryNode = getAsBinaryNode();\n    if (binaryNode) {\n        binaryNode->getLeft()->propagatePrecision(newPrecision);\n        binaryNode->getRight()->propagatePrecision(newPrecision);\n\n        return;\n    }\n\n    TIntermUnary* unaryNode = getAsUnaryNode();\n    if (unaryNode) {\n        unaryNode->getOperand()->propagatePrecision(newPrecision);\n\n        return;\n    }\n\n    TIntermAggregate* aggregateNode = getAsAggregate();\n    if (aggregateNode) {\n        TIntermSequence operands = aggregateNode->getSequence();\n        for (unsigned int i = 0; i < operands.size(); ++i) {\n            TIntermTyped* typedNode = operands[i]->getAsTyped();\n            if (! typedNode)\n                break;\n            typedNode->propagatePrecision(newPrecision);\n        }\n\n        return;\n    }\n\n    TIntermSelection* selectionNode = getAsSelectionNode();\n    if (selectionNode) {\n        TIntermTyped* typedNode = selectionNode->getTrueBlock()->getAsTyped();\n        if (typedNode) {\n            typedNode->propagatePrecision(newPrecision);\n            typedNode = selectionNode->getFalseBlock()->getAsTyped();\n            if (typedNode)\n                typedNode->propagatePrecision(newPrecision);\n        }\n\n        return;\n    }\n}\n\nTIntermTyped* TIntermediate::promoteConstantUnion(TBasicType promoteTo, TIntermConstantUnion* node) const\n{\n    const TConstUnionArray& rightUnionArray = node->getConstArray();\n    int size = node->getType().computeNumComponents();\n\n    TConstUnionArray leftUnionArray(size);\n\n    for (int i=0; i < size; i++) {\n\n#define PROMOTE(Set, CType, Get) leftUnionArray[i].Set(static_cast<CType>(rightUnionArray[i].Get()))\n#define PROMOTE_TO_BOOL(Get) leftUnionArray[i].setBConst(rightUnionArray[i].Get() != 0)\n\n#define TO_ALL(Get)   \\\n        switch (promoteTo) { \\\n        case EbtBFloat16: PROMOTE(setDConst, double, Get); break; \\\n        case EbtFloatE5M2: PROMOTE(setDConst, double, Get); break; \\\n        case EbtFloatE4M3: PROMOTE(setDConst, double, Get); break; \\\n        case EbtFloat16: PROMOTE(setDConst, double, Get); break; \\\n        case EbtFloat: PROMOTE(setDConst, double, Get); break; \\\n        case EbtDouble: PROMOTE(setDConst, double, Get); break; \\\n        case EbtInt8: PROMOTE(setI8Const, signed char, Get); break; \\\n        case EbtInt16: PROMOTE(setI16Const, short, Get); break; \\\n        case EbtInt: PROMOTE(setIConst, int, Get); break; \\\n        case EbtInt64: PROMOTE(setI64Const, long long, Get); break; \\\n        case EbtUint8: PROMOTE(setU8Const, unsigned char, Get); break; \\\n        case EbtUint16: PROMOTE(setU16Const, unsigned short, Get); break; \\\n        case EbtUint: PROMOTE(setUConst, unsigned int, Get); break; \\\n        case EbtUint64: PROMOTE(setU64Const, unsigned long long, Get); break; \\\n        case EbtBool: PROMOTE_TO_BOOL(Get); break; \\\n        default: return node; \\\n        }\n\n        switch (node->getType().getBasicType()) {\n        case EbtFloat: TO_ALL(getDConst); break;\n        case EbtInt: TO_ALL(getIConst); break;\n        case EbtUint: TO_ALL(getUConst); break;\n        case EbtBool: TO_ALL(getBConst); break;\n        case EbtFloat16: TO_ALL(getDConst); break;\n        case EbtBFloat16: TO_ALL(getDConst); break;\n        case EbtFloatE5M2: TO_ALL(getDConst); break;\n        case EbtFloatE4M3: TO_ALL(getDConst); break;\n        case EbtDouble: TO_ALL(getDConst); break;\n        case EbtInt8: TO_ALL(getI8Const); break;\n        case EbtInt16: TO_ALL(getI16Const); break;\n        case EbtInt64: TO_ALL(getI64Const); break;\n        case EbtUint8: TO_ALL(getU8Const); break;\n        case EbtUint16: TO_ALL(getU16Const); break;\n        case EbtUint64: TO_ALL(getU64Const); break;\n        default: return node;\n        }\n    }\n\n    const TType& t = node->getType();\n\n    return addConstantUnion(leftUnionArray, TType(promoteTo, t.getQualifier().storage, t.getVectorSize(), t.getMatrixCols(), t.getMatrixRows()),\n                            node->getLoc());\n}\n\nvoid TIntermAggregate::setPragmaTable(const TPragmaTable& pTable)\n{\n    assert(pragmaTable == nullptr);\n    pragmaTable = new TPragmaTable;\n    *pragmaTable = pTable;\n}\n\n// If either node is a specialization constant, while the other is\n// a constant (or specialization constant), the result is still\n// a specialization constant.\nbool TIntermediate::specConstantPropagates(const TIntermTyped& node1, const TIntermTyped& node2)\n{\n    return (node1.getType().getQualifier().isSpecConstant() && node2.getType().getQualifier().isConstant()) ||\n           (node2.getType().getQualifier().isSpecConstant() && node1.getType().getQualifier().isConstant());\n}\n\nstruct TextureUpgradeAndSamplerRemovalTransform : public TIntermTraverser {\n    void visitSymbol(TIntermSymbol* symbol) override {\n        if (symbol->getBasicType() == EbtSampler && symbol->getType().getSampler().isTexture()) {\n            symbol->getWritableType().getSampler().setCombined(true);\n        }\n    }\n    bool visitAggregate(TVisit, TIntermAggregate* ag) override {\n        using namespace std;\n        TIntermSequence& seq = ag->getSequence();\n        TQualifierList& qual = ag->getQualifierList();\n\n        // qual and seq are indexed using the same indices, so we have to modify both in lock-step\n        assert(seq.size() == qual.size() || qual.empty());\n\n        size_t write = 0;\n        for (size_t i = 0; i < seq.size(); ++i) {\n            TIntermSymbol* symbol = seq[i]->getAsSymbolNode();\n            if (symbol && symbol->getBasicType() == EbtSampler && symbol->getType().getSampler().isPureSampler()) {\n                // remove pure sampler variables\n                continue;\n            }\n\n            TIntermNode* result = seq[i];\n\n            // replace constructors with sampler/textures\n            TIntermAggregate *constructor = seq[i]->getAsAggregate();\n            if (constructor && constructor->getOp() == EOpConstructTextureSampler) {\n                if (!constructor->getSequence().empty())\n                    result = constructor->getSequence()[0];\n            }\n\n            // write new node & qualifier\n            seq[write] = result;\n            if (!qual.empty())\n                qual[write] = qual[i];\n            write++;\n        }\n\n        seq.resize(write);\n        if (!qual.empty())\n            qual.resize(write);\n\n        return true;\n    }\n};\n\nvoid TIntermediate::performTextureUpgradeAndSamplerRemovalTransformation(TIntermNode* root)\n{\n    TextureUpgradeAndSamplerRemovalTransform transform;\n    root->traverse(&transform);\n}\n\nconst char* TIntermediate::getResourceName(TResourceType res)\n{\n    switch (res) {\n    case EResSampler: return \"shift-sampler-binding\";\n    case EResTexture: return \"shift-texture-binding\";\n    case EResImage:   return \"shift-image-binding\";\n    case EResUbo:     return \"shift-UBO-binding\";\n    case EResSsbo:    return \"shift-ssbo-binding\";\n    case EResUav:     return \"shift-uav-binding\";\n    default:\n        assert(0); // internal error: should only be called with valid resource types.\n        return nullptr;\n    }\n}\n\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/LiveTraverser.h",
    "content": "//\n// Copyright (C) 2016 LunarG, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#pragma once\n\n#include \"../Include/Common.h\"\n#include \"reflection.h\"\n#include \"localintermediate.h\"\n\n#include \"gl_types.h\"\n\n#include <list>\n#include <unordered_set>\n\nnamespace glslang {\n\n//\n// The traverser: mostly pass through, except\n//  - processing function-call nodes to push live functions onto the stack of functions to process\n//  - processing selection nodes to trim semantically dead code\n//\n// This is in the glslang namespace directly so it can be a friend of TReflection.\n// This can be derived from to implement reflection database traversers or\n// binding mappers: anything that wants to traverse the live subset of the tree.\n//\n\nclass TLiveTraverser : public TIntermTraverser {\npublic:\n    TLiveTraverser(const TIntermediate& i, bool traverseAll = false,\n                   bool preVisit = true, bool inVisit = false, bool postVisit = false) :\n        TIntermTraverser(preVisit, inVisit, postVisit),\n        intermediate(i), traverseAll(traverseAll)\n    { }\n\n    //\n    // Given a function name, find its subroot in the tree, and push it onto the stack of\n    // functions left to process.\n    //\n    void pushFunction(const TString& name)\n    {\n        TIntermSequence& globals = intermediate.getTreeRoot()->getAsAggregate()->getSequence();\n        for (unsigned int f = 0; f < globals.size(); ++f) {\n            TIntermAggregate* candidate = globals[f]->getAsAggregate();\n            if (candidate && candidate->getOp() == EOpFunction && candidate->getName() == name) {\n                destinations.push_back(candidate);\n                break;\n            }\n        }\n    }\n\n    void pushGlobalReference(const TString& name)\n    {\n        TIntermSequence& globals = intermediate.getTreeRoot()->getAsAggregate()->getSequence();\n        for (unsigned int f = 0; f < globals.size(); ++f) {\n            TIntermAggregate* candidate = globals[f]->getAsAggregate();\n            if (candidate && candidate->getOp() == EOpSequence &&\n                candidate->getSequence().size() == 1 &&\n                candidate->getSequence()[0]->getAsBinaryNode()) {\n                TIntermBinary* binary = candidate->getSequence()[0]->getAsBinaryNode();\n                TIntermSymbol* symbol = binary->getLeft()->getAsSymbolNode();\n                if (symbol && symbol->getQualifier().storage == EvqGlobal &&\n                    symbol->getName() == name) {\n                    destinations.push_back(candidate);\n                    break;\n                }\n            }\n        }\n    }\n\n    typedef std::list<TIntermAggregate*> TDestinationStack;\n    TDestinationStack destinations;\n\nprotected:\n    // To catch which function calls are not dead, and hence which functions must be visited.\n    virtual bool visitAggregate(TVisit, TIntermAggregate* node)\n    {\n        if (!traverseAll)\n            if (node->getOp() == EOpFunctionCall)\n                addFunctionCall(node);\n\n        return true; // traverse this subtree\n    }\n\n    // To prune semantically dead paths.\n    virtual bool visitSelection(TVisit /* visit */,  TIntermSelection* node)\n    {\n        if (traverseAll)\n            return true; // traverse all code\n\n        TIntermConstantUnion* constant = node->getCondition()->getAsConstantUnion();\n        if (constant) {\n            // cull the path that is dead\n            if (constant->getConstArray()[0].getBConst() == true && node->getTrueBlock())\n                node->getTrueBlock()->traverse(this);\n            if (constant->getConstArray()[0].getBConst() == false && node->getFalseBlock())\n                node->getFalseBlock()->traverse(this);\n\n            return false; // don't traverse any more, we did it all above\n        } else\n            return true; // traverse the whole subtree\n    }\n\n    // To prune semantically dead paths in switch statements with constant expressions.\n    virtual bool visitSwitch(TVisit /* visit */, TIntermSwitch* node)\n    {\n        if (traverseAll)\n            return true; // traverse all code\n\n        TIntermConstantUnion* constant = node->getCondition()->getAsConstantUnion();\n        if (constant) {\n            TConstUnion switchValue = constant->getConstArray()[0];\n            int liveBranch = -1;\n            const auto& body = node->getBody()->getSequence();\n            for (unsigned int i = 0; i < body.size(); ++i) {\n                if (body[i]->getAsBranchNode()) {\n                    if (body[i]->getAsBranchNode()->getFlowOp() == glslang::EOpCase) {\n                        TConstUnion caseValue =\n                            body[i]->getAsBranchNode()->getExpression()->getAsConstantUnion()->getConstArray()[0];\n                        if (switchValue == caseValue.getIConst()) {\n                            liveBranch = (int)i;\n                            break;\n                        }\n                    } else if (body[i]->getAsBranchNode()->getFlowOp() == glslang::EOpDefault) {\n                        liveBranch = (int)i;\n                    }\n                }\n            }\n            if (liveBranch != -1) {\n                for (int i = liveBranch; i < (int)body.size(); ++i) {\n                    if (body[i]->getAsAggregate()) {\n                        for (auto* inst : body[i]->getAsAggregate()->getSequence()) {\n                            if (inst->getAsBranchNode() && (inst->getAsBranchNode()->getFlowOp() == glslang::EOpBreak))\n                                return false; // found and traversed the live case(s)\n                            inst->traverse(this);\n                        }\n                    }\n                }\n            }\n            return false; // finished traversing all cases\n        } else\n            return true; // traverse the whole subtree\n    }\n\n    // Track live functions as well as uniforms, so that we don't visit dead functions\n    // and only visit each function once.\n    void addFunctionCall(TIntermAggregate* call)\n    {\n        // just use the map to ensure we process each function at most once\n        if (liveFunctions.find(call->getName()) == liveFunctions.end()) {\n            liveFunctions.insert(call->getName());\n            pushFunction(call->getName());\n        }\n    }\n\n    void addGlobalReference(const TString& name)\n    {\n        // just use the map to ensure we process each global at most once\n        if (liveGlobals.find(name) == liveGlobals.end()) {\n            liveGlobals.insert(name);\n            pushGlobalReference(name);\n        }\n    }\n\n    const TIntermediate& intermediate;\n    typedef std::unordered_set<TString> TLiveFunctions;\n    TLiveFunctions liveFunctions;\n    typedef std::unordered_set<TString> TLiveGlobals;\n    TLiveGlobals liveGlobals;\n    bool traverseAll;\n\nprivate:\n    // prevent copy & copy construct\n    TLiveTraverser(TLiveTraverser&);\n    TLiveTraverser& operator=(TLiveTraverser&);\n};\n\n} // namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/ParseContextBase.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2016 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n// Implement the TParseContextBase class.\n\n#include <cstdarg>\n\n#include \"ParseHelper.h\"\n\nextern int yyparse(glslang::TParseContext*);\n\nnamespace glslang {\n\n//\n// Used to output syntax, parsing, and semantic errors.\n//\n\nvoid TParseContextBase::outputMessage(const TSourceLoc& loc, const char* szReason,\n                                      const char* szToken,\n                                      const char* szExtraInfoFormat,\n                                      TPrefixType prefix, va_list args)\n{\n    const int maxSize = MaxTokenLength + 200;\n    char szExtraInfo[maxSize];\n\n    safe_vsprintf(szExtraInfo, maxSize, szExtraInfoFormat, args);\n\n    infoSink.info.prefix(prefix);\n    infoSink.info.location(loc, messages & EShMsgAbsolutePath, messages & EShMsgDisplayErrorColumn);\n    infoSink.info << \"'\" << szToken <<  \"' : \" << szReason << \" \" << szExtraInfo << \"\\n\";\n\n    if (prefix == EPrefixError) {\n        ++numErrors;\n    }\n}\n\nvoid C_DECL TParseContextBase::error(const TSourceLoc& loc, const char* szReason, const char* szToken,\n                                     const char* szExtraInfoFormat, ...)\n{\n    if (messages & EShMsgOnlyPreprocessor)\n        return;\n    // If enhanced msg readability, only print one error\n    if (messages & EShMsgEnhanced && numErrors > 0)\n        return;\n    va_list args;\n    va_start(args, szExtraInfoFormat);\n    outputMessage(loc, szReason, szToken, szExtraInfoFormat, EPrefixError, args);\n    va_end(args);\n\n    if ((messages & EShMsgCascadingErrors) == 0)\n        currentScanner->setEndOfInput();\n}\n\nvoid C_DECL TParseContextBase::warn(const TSourceLoc& loc, const char* szReason, const char* szToken,\n                                    const char* szExtraInfoFormat, ...)\n{\n    if (suppressWarnings())\n        return;\n    va_list args;\n    va_start(args, szExtraInfoFormat);\n    outputMessage(loc, szReason, szToken, szExtraInfoFormat, EPrefixWarning, args);\n    va_end(args);\n}\n\nvoid C_DECL TParseContextBase::ppError(const TSourceLoc& loc, const char* szReason, const char* szToken,\n                                       const char* szExtraInfoFormat, ...)\n{\n    va_list args;\n    va_start(args, szExtraInfoFormat);\n    outputMessage(loc, szReason, szToken, szExtraInfoFormat, EPrefixError, args);\n    va_end(args);\n\n    if ((messages & EShMsgCascadingErrors) == 0)\n        currentScanner->setEndOfInput();\n}\n\nvoid C_DECL TParseContextBase::ppWarn(const TSourceLoc& loc, const char* szReason, const char* szToken,\n                                      const char* szExtraInfoFormat, ...)\n{\n    va_list args;\n    va_start(args, szExtraInfoFormat);\n    outputMessage(loc, szReason, szToken, szExtraInfoFormat, EPrefixWarning, args);\n    va_end(args);\n}\n\n//\n// Both test and if necessary, spit out an error, to see if the node is really\n// an l-value that can be operated on this way.\n//\n// Returns true if there was an error.\n//\nbool TParseContextBase::lValueErrorCheck(const TSourceLoc& loc, const char* op, TIntermTyped* node)\n{\n    TIntermBinary* binaryNode = node->getAsBinaryNode();\n\n    const char* symbol = nullptr;\n    TIntermSymbol* symNode = node->getAsSymbolNode();\n    if (symNode != nullptr)\n        symbol = symNode->getName().c_str();\n\n    const char* message = nullptr;\n    switch (node->getQualifier().storage) {\n    case EvqConst:          message = \"can't modify a const\";        break;\n    case EvqConstReadOnly:  message = \"can't modify a const\";        break;\n    case EvqUniform:        message = \"can't modify a uniform\";      break;\n    case EvqBuffer:\n        if (node->getQualifier().isReadOnly())\n            message = \"can't modify a readonly buffer\";\n        if (node->getQualifier().isShaderRecord())\n            message = \"can't modify a shaderrecordnv qualified buffer\";\n        break;\n    case EvqHitAttr:\n        if (language != EShLangIntersect)\n            message = \"cannot modify hitAttributeNV in this stage\";\n        break;\n\n    default:\n        //\n        // Type that can't be written to?\n        //\n        switch (node->getBasicType()) {\n        case EbtSampler:\n            if (extensionTurnedOn(E_GL_ARB_bindless_texture) == false)\n                message = \"can't modify a sampler\";\n            break;\n        case EbtVoid:\n            message = \"can't modify void\";\n            break;\n        case EbtAtomicUint:\n            message = \"can't modify an atomic_uint\";\n            break;\n        case EbtAccStruct:\n            message = \"can't modify accelerationStructureNV\";\n            break;\n        case EbtRayQuery:\n            message = \"can't modify rayQueryEXT\";\n            break;\n        case EbtHitObjectNV:\n            message = \"can't modify hitObjectNV\";\n            break;\n        default:\n            break;\n        }\n    }\n\n    if (message == nullptr && binaryNode == nullptr && symNode == nullptr) {\n        error(loc, \" l-value required\", op, \"\", \"\");\n\n        return true;\n    }\n\n    //\n    // Everything else is okay, no error.\n    //\n    if (message == nullptr)\n    {\n        if (binaryNode) {\n            switch (binaryNode->getOp()) {\n            case EOpIndexDirect:\n            case EOpIndexIndirect:     // fall through\n            case EOpIndexDirectStruct: // fall through\n            case EOpVectorSwizzle:\n            case EOpMatrixSwizzle:\n                return lValueErrorCheck(loc, op, binaryNode->getLeft());\n            default:\n                break;\n            }\n            error(loc, \" l-value required\", op, \"\", \"\");\n\n            return true;\n        }\n        return false;\n    }\n\n    //\n    // If we get here, we have an error and a message.\n    //\n    const TIntermTyped* leftMostTypeNode = TIntermediate::traverseLValueBase(node, true);\n\n    if (symNode)\n        error(loc, \" l-value required\", op, \"\\\"%s\\\" (%s)\", symbol, message);\n    else\n        if (binaryNode && binaryNode->getAsOperator()->getOp() == EOpIndexDirectStruct)\n            if(IsAnonymous(leftMostTypeNode->getAsSymbolNode()->getName()))\n                error(loc, \" l-value required\", op, \"\\\"%s\\\" (%s)\", leftMostTypeNode->getAsSymbolNode()->getAccessName().c_str(), message);\n            else\n                error(loc, \" l-value required\", op, \"\\\"%s\\\" (%s)\", leftMostTypeNode->getAsSymbolNode()->getName().c_str(), message);\n        else\n            error(loc, \" l-value required\", op, \"(%s)\", message);\n\n    return true;\n}\n\n// Test for and give an error if the node can't be read from.\nvoid TParseContextBase::rValueErrorCheck(const TSourceLoc& loc, const char* op, TIntermTyped* node)\n{\n    if (! node)\n        return;\n\n    TIntermBinary* binaryNode = node->getAsBinaryNode();\n    const TIntermSymbol* symNode = node->getAsSymbolNode();\n\n    if (node->getQualifier().isWriteOnly()) {\n        const TIntermTyped* leftMostTypeNode = TIntermediate::traverseLValueBase(node, true);\n\n        if (symNode != nullptr)\n            error(loc, \"can't read from writeonly object: \", op, symNode->getName().c_str());\n        else if (binaryNode &&\n                (binaryNode->getAsOperator()->getOp() == EOpIndexDirectStruct ||\n                 binaryNode->getAsOperator()->getOp() == EOpIndexDirect))\n            if(IsAnonymous(leftMostTypeNode->getAsSymbolNode()->getName()))\n                error(loc, \"can't read from writeonly object: \", op, leftMostTypeNode->getAsSymbolNode()->getAccessName().c_str());\n            else\n                error(loc, \"can't read from writeonly object: \", op, leftMostTypeNode->getAsSymbolNode()->getName().c_str());\n        else\n            error(loc, \"can't read from writeonly object: \", op, \"\");\n\n    } else {\n        if (binaryNode) {\n            switch (binaryNode->getOp()) {\n            case EOpIndexDirect:\n            case EOpIndexIndirect:\n            case EOpIndexDirectStruct:\n            case EOpVectorSwizzle:\n            case EOpMatrixSwizzle:\n                rValueErrorCheck(loc, op, binaryNode->getLeft());\n                break;\n            default:\n                break;\n            }\n        }\n    }\n}\n\n// Add 'symbol' to the list of deferred linkage symbols, which\n// are later processed in finish(), at which point the symbol\n// must still be valid.\n// It is okay if the symbol's type will be subsequently edited;\n// the modifications will be tracked.\n// Order is preserved, to avoid creating novel forward references.\nvoid TParseContextBase::trackLinkage(TSymbol& symbol)\n{\n    if (!parsingBuiltins)\n        linkageSymbols.push_back(&symbol);\n}\n\n// Ensure index is in bounds, correct if necessary.\n// Give an error if not.\nvoid TParseContextBase::checkIndex(const TSourceLoc& loc, const TType& type, int& index)\n{\n    const auto sizeIsSpecializationExpression = [&type]() {\n        return type.containsSpecializationSize() &&\n               type.getArraySizes()->getOuterNode() != nullptr &&\n               type.getArraySizes()->getOuterNode()->getAsSymbolNode() == nullptr; };\n\n    if (index < 0) {\n        error(loc, \"\", \"[\", \"index out of range '%d'\", index);\n        index = 0;\n    } else if (type.isArray()) {\n        if (type.isSizedArray() && !sizeIsSpecializationExpression() &&\n            index >= type.getOuterArraySize()) {\n            error(loc, \"\", \"[\", \"array index out of range '%d'\", index);\n            index = type.getOuterArraySize() - 1;\n        }\n    } else if (type.isVector()) {\n        if (index >= type.getVectorSize()) {\n            error(loc, \"\", \"[\", \"vector index out of range '%d'\", index);\n            index = type.getVectorSize() - 1;\n        }\n    } else if (type.isMatrix()) {\n        if (index >= type.getMatrixCols()) {\n            error(loc, \"\", \"[\", \"matrix index out of range '%d'\", index);\n            index = type.getMatrixCols() - 1;\n        }\n    } else if (type.isCoopVecNV()) {\n        if (index >= type.computeNumComponents()) {\n            error(loc, \"\", \"[\", \"cooperative vector index out of range '%d'\", index);\n            index = type.computeNumComponents() - 1;\n        }\n    }\n}\n\n// Make a shared symbol have a non-shared version that can be edited by the current\n// compile, such that editing its type will not change the shared version and will\n// effect all nodes already sharing it (non-shallow type),\n// or adopting its full type after being edited (shallow type).\nvoid TParseContextBase::makeEditable(TSymbol*& symbol)\n{\n    // copyUp() does a deep copy of the type.\n    symbol = symbolTable.copyUp(symbol);\n\n    // Save it (deferred, so it can be edited first) in the AST for linker use.\n    if (symbol)\n        trackLinkage(*symbol);\n}\n\n// Return a writable version of the variable 'name'.\n//\n// Return nullptr if 'name' is not found.  This should mean\n// something is seriously wrong (e.g., compiler asking self for\n// built-in that doesn't exist).\nTVariable* TParseContextBase::getEditableVariable(const char* name)\n{\n    bool builtIn;\n    TSymbol* symbol = symbolTable.find(name, &builtIn);\n\n    assert(symbol != nullptr);\n    if (symbol == nullptr)\n        return nullptr;\n\n    if (builtIn)\n        makeEditable(symbol);\n\n    return symbol->getAsVariable();\n}\n\n// Select the best matching function for 'call' from 'candidateList'.\n//\n// Assumptions\n//\n// There is no exact match, so a selection algorithm needs to run. That is, the\n// language-specific handler should check for exact match first, to\n// decide what to do, before calling this selector.\n//\n// Input\n//\n//  * list of candidate signatures to select from\n//  * the call\n//  * a predicate function convertible(from, to) that says whether or not type\n//    'from' can implicitly convert to type 'to' (it includes the case of what\n//    the calling language would consider a matching type with no conversion\n//    needed)\n//  * a predicate function better(from1, from2, to1, to2) that says whether or\n//    not a conversion from <-> to2 is considered better than a conversion\n//    from <-> to1 (both in and out directions need testing, as declared by the\n//    formal parameter)\n//\n// Output\n//\n//  * best matching candidate (or none, if no viable candidates found)\n//  * whether there was a tie for the best match (ambiguous overload selection,\n//    caller's choice for how to report)\n//\nconst TFunction* TParseContextBase::selectFunction(\n    const TVector<const TFunction*> candidateList,\n    const TFunction& call,\n    std::function<bool(const TType& from, const TType& to, TOperator op, int arg)> convertible,\n    std::function<bool(const TType& from, const TType& to1, const TType& to2)> better,\n    /* output */ bool& tie)\n{\n//\n// Operation\n//\n// 1. Prune the input list of candidates down to a list of viable candidates,\n// where each viable candidate has\n//\n//  * at least as many parameters as there are calling arguments, with any\n//    remaining parameters being optional or having default values\n//  * each parameter is true under convertible(A, B), where A is the calling\n//    type for in and B is the formal type, and in addition, for out B is the\n//    calling type and A is the formal type\n//\n// 2. If there are no viable candidates, return with no match.\n//\n// 3. If there is only one viable candidate, it is the best match.\n//\n// 4. If there are multiple viable candidates, select the first viable candidate\n// as the incumbent. Compare the incumbent to the next viable candidate, and if\n// that candidate is better (bullets below), make it the incumbent. Repeat, with\n// a linear walk through the viable candidate list. The final incumbent will be\n// returned as the best match. A viable candidate is better than the incumbent if\n//\n//  * it has a function argument with a better(...) conversion than the incumbent,\n//    for all directions needed by in and out\n//  * the incumbent has no argument with a better(...) conversion then the\n//    candidate, for either in or out (as needed)\n//\n// 5. Check for ambiguity by comparing the best match against all other viable\n// candidates. If any other viable candidate has a function argument with a\n// better(...) conversion than the best candidate (for either in or out\n// directions), return that there was a tie for best.\n//\n\n    tie = false;\n\n    // 1. prune to viable...\n    TVector<const TFunction*> viableCandidates;\n    for (auto it = candidateList.begin(); it != candidateList.end(); ++it) {\n        const TFunction& candidate = *(*it);\n\n        // to even be a potential match, number of arguments must be >= the number of\n        // fixed (non-default) parameters, and <= the total (including parameter with defaults).\n        if (call.getParamCount() < candidate.getFixedParamCount() ||\n            call.getParamCount() > candidate.getParamCount())\n            continue;\n\n        // see if arguments are convertible\n        bool viable = true;\n\n        // The call can have fewer parameters than the candidate, if some have defaults.\n        const int paramCount = std::min(call.getParamCount(), candidate.getParamCount());\n        for (int param = 0; param < paramCount; ++param) {\n            if (candidate[param].type->getQualifier().isParamInput()) {\n                if (! convertible(*call[param].type, *candidate[param].type, candidate.getBuiltInOp(), param)) {\n                    viable = false;\n                    break;\n                }\n            }\n            if (candidate[param].type->getQualifier().isParamOutput()) {\n                if (! convertible(*candidate[param].type, *call[param].type, candidate.getBuiltInOp(), param)) {\n                    viable = false;\n                    break;\n                }\n            }\n        }\n\n        if (viable)\n            viableCandidates.push_back(&candidate);\n    }\n\n    // 2. none viable...\n    if (viableCandidates.size() == 0)\n        return nullptr;\n\n    // 3. only one viable...\n    if (viableCandidates.size() == 1)\n        return viableCandidates.front();\n\n    // 4. find best...\n    const auto betterParam = [&call, &better](const TFunction& can1, const TFunction& can2) -> bool {\n        // is call -> can2 better than call -> can1 for any parameter\n        bool hasBetterParam = false;\n        for (int param = 0; param < call.getParamCount(); ++param) {\n            if (better(*call[param].type, *can1[param].type, *can2[param].type)) {\n                hasBetterParam = true;\n                break;\n            }\n        }\n        return hasBetterParam;\n    };\n\n    const auto equivalentParams = [&call, &better](const TFunction& can1, const TFunction& can2) -> bool {\n        // is call -> can2 equivalent to call -> can1 for all the call parameters?\n        for (int param = 0; param < call.getParamCount(); ++param) {\n            if (better(*call[param].type, *can1[param].type, *can2[param].type) ||\n                better(*call[param].type, *can2[param].type, *can1[param].type))\n                return false;\n        }\n        return true;\n    };\n\n    const TFunction* incumbent = viableCandidates.front();\n    for (auto it = viableCandidates.begin() + 1; it != viableCandidates.end(); ++it) {\n        const TFunction& candidate = *(*it);\n        if (betterParam(*incumbent, candidate) && ! betterParam(candidate, *incumbent))\n            incumbent = &candidate;\n    }\n\n    // 5. ambiguity...\n    for (auto it = viableCandidates.begin(); it != viableCandidates.end(); ++it) {\n        if (incumbent == *it)\n            continue;\n        const TFunction& candidate = *(*it);\n\n        // In the case of default parameters, it may have an identical initial set, which is\n        // also ambiguous\n        if (betterParam(*incumbent, candidate) || equivalentParams(*incumbent, candidate))\n            tie = true;\n    }\n\n    return incumbent;\n}\n\n//\n// Look at a '.' field selector string and change it into numerical selectors\n// for a vector or scalar.\n//\n// Always return some form of swizzle, so the result is always usable.\n//\nvoid TParseContextBase::parseSwizzleSelector(const TSourceLoc& loc, const TString& compString, int vecSize,\n                                             TSwizzleSelectors<TVectorSelector>& selector)\n{\n    // Too long?\n    if (compString.size() > MaxSwizzleSelectors)\n        error(loc, \"vector swizzle too long\", compString.c_str(), \"\");\n\n    // Use this to test that all swizzle characters are from the same swizzle-namespace-set\n    enum {\n        exyzw,\n        ergba,\n        estpq,\n    } fieldSet[MaxSwizzleSelectors];\n\n    // Decode the swizzle string.\n    int size = std::min(MaxSwizzleSelectors, (int)compString.size());\n    for (int i = 0; i < size; ++i) {\n        switch (compString[i])  {\n        case 'x':\n            selector.push_back(0);\n            fieldSet[i] = exyzw;\n            break;\n        case 'r':\n            selector.push_back(0);\n            fieldSet[i] = ergba;\n            break;\n        case 's':\n            selector.push_back(0);\n            fieldSet[i] = estpq;\n            break;\n\n        case 'y':\n            selector.push_back(1);\n            fieldSet[i] = exyzw;\n            break;\n        case 'g':\n            selector.push_back(1);\n            fieldSet[i] = ergba;\n            break;\n        case 't':\n            selector.push_back(1);\n            fieldSet[i] = estpq;\n            break;\n\n        case 'z':\n            selector.push_back(2);\n            fieldSet[i] = exyzw;\n            break;\n        case 'b':\n            selector.push_back(2);\n            fieldSet[i] = ergba;\n            break;\n        case 'p':\n            selector.push_back(2);\n            fieldSet[i] = estpq;\n            break;\n\n        case 'w':\n            selector.push_back(3);\n            fieldSet[i] = exyzw;\n            break;\n        case 'a':\n            selector.push_back(3);\n            fieldSet[i] = ergba;\n            break;\n        case 'q':\n            selector.push_back(3);\n            fieldSet[i] = estpq;\n            break;\n\n        default:\n            error(loc, \"unknown swizzle selection\", compString.c_str(), \"\");\n            break;\n        }\n    }\n\n    // Additional error checking.\n    for (int i = 0; i < selector.size(); ++i) {\n        if (selector[i] >= vecSize) {\n            error(loc, \"vector swizzle selection out of range\",  compString.c_str(), \"\");\n            selector.resize(i);\n            break;\n        }\n\n        if (i > 0 && fieldSet[i] != fieldSet[i-1]) {\n            error(loc, \"vector swizzle selectors not from the same set\", compString.c_str(), \"\");\n            selector.resize(i);\n            break;\n        }\n    }\n\n    // Ensure it is valid.\n    if (selector.size() == 0)\n        selector.push_back(0);\n}\n\n//\n// Make the passed-in variable information become a member of the\n// global uniform block.  If this doesn't exist yet, make it.\n//\nvoid TParseContextBase::growGlobalUniformBlock(const TSourceLoc& loc, TType& memberType, const TString& memberName, TTypeList* typeList)\n{\n    // Make the global block, if not yet made.\n    if (globalUniformBlock == nullptr) {\n        TQualifier blockQualifier;\n        blockQualifier.clear();\n        blockQualifier.storage = EvqUniform;\n        TType blockType(new TTypeList, *NewPoolTString(getGlobalUniformBlockName()), blockQualifier);\n        setUniformBlockDefaults(blockType);\n        globalUniformBlock = new TVariable(NewPoolTString(\"\"), blockType, true);\n        firstNewMember = 0;\n    }\n\n    // Update with binding and set\n    globalUniformBlock->getWritableType().getQualifier().layoutBinding = globalUniformBinding;\n    globalUniformBlock->getWritableType().getQualifier().layoutSet = globalUniformSet;\n\n    // Check for declarations of this default uniform that already exist due to other compilation units.\n    TSymbol* symbol = symbolTable.find(memberName);\n    if (symbol) {\n        if (memberType != symbol->getType()) {\n            TString err;\n            err += \"Redeclaration: already declared as \\\"\" + symbol->getType().getCompleteString() + \"\\\"\";\n            error(loc, \"\", memberName.c_str(), err.c_str());\n        }\n        return;\n    }\n\n    // Add the requested member as a member to the global block.\n    TType* type = new TType;\n    type->shallowCopy(memberType);\n    type->setFieldName(memberName);\n    if (typeList)\n        type->setStruct(typeList);\n    TTypeLoc typeLoc = {type, loc};\n    globalUniformBlock->getType().getWritableStruct()->push_back(typeLoc);\n\n    // Insert into the symbol table.\n    if (firstNewMember == 0) {\n        // This is the first request; we need a normal symbol table insert\n        if (symbolTable.insert(*globalUniformBlock))\n            trackLinkage(*globalUniformBlock);\n        else\n            error(loc, \"failed to insert the global constant buffer\", \"uniform\", \"\");\n    } else {\n        // This is a follow-on request; we need to amend the first insert\n        symbolTable.amend(*globalUniformBlock, firstNewMember);\n    }\n\n    ++firstNewMember;\n}\n\nvoid TParseContextBase::growAtomicCounterBlock(int binding, const TSourceLoc& loc, TType& memberType, const TString& memberName, TTypeList* typeList) {\n    // Make the atomic counter block, if not yet made.\n    const auto &at  = atomicCounterBuffers.find(binding);\n    if (at == atomicCounterBuffers.end()) {\n        atomicCounterBuffers.insert({binding, (TVariable*)nullptr });\n        atomicCounterBlockFirstNewMember.insert({binding, 0});\n    }\n\n    TVariable*& atomicCounterBuffer = atomicCounterBuffers[binding];\n    int& bufferNewMember = atomicCounterBlockFirstNewMember[binding];\n\n    if (atomicCounterBuffer == nullptr) {\n        TQualifier blockQualifier;\n        blockQualifier.clear();\n        blockQualifier.storage = EvqBuffer;\n        \n        char charBuffer[512];\n        if (binding != TQualifier::layoutBindingEnd) {\n            snprintf(charBuffer, 512, \"%s_%d\", getAtomicCounterBlockName(), binding);\n        } else {\n            snprintf(charBuffer, 512, \"%s_0\", getAtomicCounterBlockName());\n        }\n        \n        TType blockType(new TTypeList, *NewPoolTString(charBuffer), blockQualifier);\n        setUniformBlockDefaults(blockType);\n        blockType.getQualifier().layoutPacking = ElpStd430;\n        atomicCounterBuffer = new TVariable(NewPoolTString(\"\"), blockType, true);\n        // If we arn't auto mapping bindings then set the block to use the same\n        // binding as what the atomic was set to use\n        if (!intermediate.getAutoMapBindings()) {\n            atomicCounterBuffer->getWritableType().getQualifier().layoutBinding = binding;\n        }\n        bufferNewMember = 0;\n\n        atomicCounterBuffer->getWritableType().getQualifier().layoutSet = atomicCounterBlockSet;\n    }\n\n    // Add the requested member as a member to the global block.\n    TType* type = new TType;\n    type->shallowCopy(memberType);\n    type->setFieldName(memberName);\n    if (typeList)\n        type->setStruct(typeList);\n    TTypeLoc typeLoc = {type, loc};\n    atomicCounterBuffer->getType().getWritableStruct()->push_back(typeLoc);\n\n    // Insert into the symbol table.\n    if (bufferNewMember == 0) {\n        // This is the first request; we need a normal symbol table insert\n        if (symbolTable.insert(*atomicCounterBuffer))\n            trackLinkage(*atomicCounterBuffer);\n        else\n            error(loc, \"failed to insert the global constant buffer\", \"buffer\", \"\");\n    } else {\n        // This is a follow-on request; we need to amend the first insert\n        symbolTable.amend(*atomicCounterBuffer, bufferNewMember);\n    }\n\n    ++bufferNewMember;\n}\n\nvoid TParseContextBase::finish()\n{\n    if (parsingBuiltins)\n        return;\n\n    for (const TString& relaxedSymbol : relaxedSymbols)\n    {\n        TSymbol* symbol = symbolTable.find(relaxedSymbol);\n        TType& type = symbol->getWritableType();\n        for (const TTypeLoc& typeLoc : *type.getStruct())\n        {\n            if (typeLoc.type->isOpaque())\n            {\n                typeLoc.type->getSampler() = TSampler{};\n                typeLoc.type->setBasicType(EbtInt);\n                TString fieldName(\"/*\");\n                fieldName.append(typeLoc.type->getFieldName());\n                fieldName.append(\"*/\");\n                typeLoc.type->setFieldName(fieldName);\n            }\n        }\n    }\n\n    // Transfer the linkage symbols to AST nodes, preserving order.\n    TIntermAggregate* linkage = new TIntermAggregate;\n    for (auto i = linkageSymbols.begin(); i != linkageSymbols.end(); ++i)\n        intermediate.addSymbolLinkageNode(linkage, **i);\n    intermediate.addSymbolLinkageNodes(linkage, getLanguage(), symbolTable);\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/ParseHelper.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2012-2015 LunarG, Inc.\n// Copyright (C) 2015-2018 Google, Inc.\n// Copyright (C) 2017, 2019 ARM Limited.\n// Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.\n// Modifications Copyright (C) 2024 Ravi Prakash Singh.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#include \"ParseHelper.h\"\n#include \"Initialize.h\"\n#include \"Scan.h\"\n\n#include <algorithm>\n\n#include \"Versions.h\"\n#include \"preprocessor/PpContext.h\"\n\nextern int yyparse(glslang::TParseContext*);\n\nnamespace glslang {\n\nTParseContext::TParseContext(TSymbolTable& symbolTable, TIntermediate& interm, bool parsingBuiltins,\n                             int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language,\n                             TInfoSink& infoSink, bool forwardCompatible, EShMessages messages,\n                             const TString* entryPoint) :\n            TParseContextBase(symbolTable, interm, parsingBuiltins, version, profile, spvVersion, language,\n                              infoSink, forwardCompatible, messages, entryPoint),\n            inMain(false),\n            blockName(nullptr),\n            limits(resources.limits),\n            atomicUintOffsets(nullptr), anyIndexLimits(false)\n{\n    // decide whether precision qualifiers should be ignored or respected\n    if (isEsProfile() || spvVersion.vulkan > 0) {\n        precisionManager.respectPrecisionQualifiers();\n        if (! parsingBuiltins && language == EShLangFragment && !isEsProfile() && spvVersion.vulkan > 0)\n            precisionManager.warnAboutDefaults();\n    }\n\n    setPrecisionDefaults();\n\n    globalUniformDefaults.clear();\n    globalUniformDefaults.layoutMatrix = ElmColumnMajor;\n    globalUniformDefaults.layoutPacking = spvVersion.spv != 0 ? ElpStd140 : ElpShared;\n\n    globalBufferDefaults.clear();\n    globalBufferDefaults.layoutMatrix = ElmColumnMajor;\n    globalBufferDefaults.layoutPacking = spvVersion.spv != 0 ? ElpStd430 : ElpShared;\n\n    globalInputDefaults.clear();\n    globalOutputDefaults.clear();\n\n    globalSharedDefaults.clear();\n    globalSharedDefaults.layoutMatrix = ElmColumnMajor;\n    globalSharedDefaults.layoutPacking = ElpStd430;\n\n    // \"Shaders in the transform\n    // feedback capturing mode have an initial global default of\n    //     layout(xfb_buffer = 0) out;\"\n    if (language == EShLangVertex ||\n        language == EShLangTessControl ||\n        language == EShLangTessEvaluation ||\n        language == EShLangGeometry)\n        globalOutputDefaults.layoutXfbBuffer = 0;\n\n    if (language == EShLangGeometry)\n        globalOutputDefaults.layoutStream = 0;\n\n    if (entryPoint != nullptr && entryPoint->size() > 0 && *entryPoint != \"main\")\n        infoSink.info.message(EPrefixError, \"Source entry point must be \\\"main\\\"\");\n}\n\nTParseContext::~TParseContext()\n{\n    delete [] atomicUintOffsets;\n}\n\n// Set up all default precisions as needed by the current environment.\n// Intended just as a TParseContext constructor helper.\nvoid TParseContext::setPrecisionDefaults()\n{\n    // Set all precision defaults to EpqNone, which is correct for all types\n    // when not obeying precision qualifiers, and correct for types that don't\n    // have defaults (thus getting an error on use) when obeying precision\n    // qualifiers.\n\n    for (int type = 0; type < EbtNumTypes; ++type)\n        defaultPrecision[type] = EpqNone;\n\n    for (int type = 0; type < maxSamplerIndex; ++type)\n        defaultSamplerPrecision[type] = EpqNone;\n\n    // replace with real precision defaults for those that have them\n    if (obeyPrecisionQualifiers()) {\n        if (isEsProfile()) {\n            // Most don't have defaults, a few default to lowp.\n            TSampler sampler;\n            sampler.set(EbtFloat, Esd2D);\n            defaultSamplerPrecision[computeSamplerTypeIndex(sampler)] = EpqLow;\n            sampler.set(EbtFloat, EsdCube);\n            defaultSamplerPrecision[computeSamplerTypeIndex(sampler)] = EpqLow;\n            sampler.set(EbtFloat, Esd2D);\n            sampler.setExternal(true);\n            defaultSamplerPrecision[computeSamplerTypeIndex(sampler)] = EpqLow;\n        }\n\n        // If we are parsing built-in computational variables/functions, it is meaningful to record\n        // whether the built-in has no precision qualifier, as that ambiguity\n        // is used to resolve the precision from the supplied arguments/operands instead.\n        // So, we don't actually want to replace EpqNone with a default precision for built-ins.\n        if (! parsingBuiltins) {\n            if (isEsProfile() && language == EShLangFragment) {\n                defaultPrecision[EbtInt] = EpqMedium;\n                defaultPrecision[EbtUint] = EpqMedium;\n            } else {\n                defaultPrecision[EbtInt] = EpqHigh;\n                defaultPrecision[EbtUint] = EpqHigh;\n                defaultPrecision[EbtFloat] = EpqHigh;\n            }\n\n            if (!isEsProfile()) {\n                // Non-ES profile\n                // All sampler precisions default to highp.\n                for (int type = 0; type < maxSamplerIndex; ++type)\n                    defaultSamplerPrecision[type] = EpqHigh;\n            }\n        }\n\n        defaultPrecision[EbtSampler] = EpqLow;\n        defaultPrecision[EbtAtomicUint] = EpqHigh;\n    }\n}\n\nvoid TParseContext::setLimits(const TBuiltInResource& r)\n{\n    resources = r;\n    intermediate.setLimits(r);\n\n    anyIndexLimits = ! limits.generalAttributeMatrixVectorIndexing ||\n                     ! limits.generalConstantMatrixVectorIndexing ||\n                     ! limits.generalSamplerIndexing ||\n                     ! limits.generalUniformIndexing ||\n                     ! limits.generalVariableIndexing ||\n                     ! limits.generalVaryingIndexing;\n\n\n    // \"Each binding point tracks its own current default offset for\n    // inheritance of subsequent variables using the same binding. The initial state of compilation is that all\n    // binding points have an offset of 0.\"\n    atomicUintOffsets = new int[resources.maxAtomicCounterBindings];\n    for (int b = 0; b < resources.maxAtomicCounterBindings; ++b)\n        atomicUintOffsets[b] = 0;\n}\n\n//\n// Parse an array of strings using yyparse, going through the\n// preprocessor to tokenize the shader strings, then through\n// the GLSL scanner.\n//\n// Returns true for successful acceptance of the shader, false if any errors.\n//\nbool TParseContext::parseShaderStrings(TPpContext& ppContext, TInputScanner& input, bool versionWillBeError)\n{\n    currentScanner = &input;\n    ppContext.setInput(input, versionWillBeError);\n    yyparse(this);\n\n    finish();\n\n    return numErrors == 0;\n}\n\n// This is called from bison when it has a parse (syntax) error\n// Note though that to stop cascading errors, we set EOF, which\n// will usually cause a syntax error, so be more accurate that\n// compilation is terminating.\nvoid TParseContext::parserError(const char* s)\n{\n    if (! getScanner()->atEndOfInput() || numErrors == 0)\n        error(getCurrentLoc(), \"\", \"\", s, \"\");\n    else\n        error(getCurrentLoc(), \"compilation terminated\", \"\", \"\");\n}\n\nvoid TParseContext::growGlobalUniformBlock(const TSourceLoc& loc, TType& memberType, const TString& memberName, TTypeList* typeList)\n{\n    bool createBlock = globalUniformBlock == nullptr;\n\n    if (createBlock) {\n        globalUniformBinding = intermediate.getGlobalUniformBinding();\n        globalUniformSet = intermediate.getGlobalUniformSet();\n    }\n\n    // use base class function to create/expand block\n    TParseContextBase::growGlobalUniformBlock(loc, memberType, memberName, typeList);\n\n    if (spvVersion.vulkan > 0 && spvVersion.vulkanRelaxed) {\n        // check for a block storage override\n        TBlockStorageClass storageOverride = intermediate.getBlockStorageOverride(getGlobalUniformBlockName());\n        TQualifier& qualifier = globalUniformBlock->getWritableType().getQualifier();\n        qualifier.defaultBlock = true;\n\n        if (storageOverride != EbsNone) {\n            if (createBlock) {\n                // Remap block storage\n                qualifier.setBlockStorage(storageOverride);\n\n                // check that the change didn't create errors\n                blockQualifierCheck(loc, qualifier, false);\n            }\n\n            // remap meber storage as well\n            memberType.getQualifier().setBlockStorage(storageOverride);\n        }\n    }\n}\n\nvoid TParseContext::growAtomicCounterBlock(int binding, const TSourceLoc& loc, TType& memberType, const TString& memberName, TTypeList* typeList)\n{\n    bool createBlock = atomicCounterBuffers.find(binding) == atomicCounterBuffers.end();\n\n    if (createBlock) {\n        atomicCounterBlockSet = intermediate.getAtomicCounterBlockSet();\n    }\n\n    // use base class function to create/expand block\n    TParseContextBase::growAtomicCounterBlock(binding, loc, memberType, memberName, typeList);\n    TQualifier& qualifier = atomicCounterBuffers[binding]->getWritableType().getQualifier();\n    qualifier.defaultBlock = true;\n\n    if (spvVersion.vulkan > 0 && spvVersion.vulkanRelaxed) {\n        // check for a Block storage override\n        TBlockStorageClass storageOverride = intermediate.getBlockStorageOverride(getAtomicCounterBlockName());\n\n        if (storageOverride != EbsNone) {\n            if (createBlock) {\n                // Remap block storage\n\n                qualifier.setBlockStorage(storageOverride);\n\n                // check that the change didn't create errors\n                blockQualifierCheck(loc, qualifier, false);\n            }\n\n            // remap meber storage as well\n            memberType.getQualifier().setBlockStorage(storageOverride);\n        }\n    }\n}\n\nconst char* TParseContext::getGlobalUniformBlockName() const\n{\n    const char* name = intermediate.getGlobalUniformBlockName();\n    if (std::string(name) == \"\")\n        return \"gl_DefaultUniformBlock\";\n    else\n        return name;\n}\nvoid TParseContext::finalizeGlobalUniformBlockLayout(TVariable&)\n{\n}\nvoid TParseContext::setUniformBlockDefaults(TType& block) const\n{\n    block.getQualifier().layoutPacking = ElpStd140;\n    block.getQualifier().layoutMatrix = ElmColumnMajor;\n}\n\n\nconst char* TParseContext::getAtomicCounterBlockName() const\n{\n    const char* name = intermediate.getAtomicCounterBlockName();\n    if (std::string(name) == \"\")\n        return \"gl_AtomicCounterBlock\";\n    else\n        return name;\n}\nvoid TParseContext::finalizeAtomicCounterBlockLayout(TVariable&)\n{\n}\n\nvoid TParseContext::setAtomicCounterBlockDefaults(TType& block) const\n{\n    block.getQualifier().layoutPacking = ElpStd430;\n    block.getQualifier().layoutMatrix = ElmRowMajor;\n}\n\nvoid TParseContext::setInvariant(const TSourceLoc& loc, const char* builtin) {\n    TSymbol* symbol = symbolTable.find(builtin);\n    if (symbol && symbol->getType().getQualifier().isPipeOutput()) {\n        if (intermediate.inIoAccessed(builtin))\n            warn(loc, \"changing qualification after use\", \"invariant\", builtin);\n        TSymbol* csymbol = symbolTable.copyUp(symbol);\n        csymbol->getWritableType().getQualifier().invariant = true;\n    }\n}\n\nvoid TParseContext::handlePragma(const TSourceLoc& loc, const TVector<TString>& tokens)\n{\n    if (pragmaCallback)\n        pragmaCallback(loc.line, tokens);\n\n    if (tokens.size() == 0)\n        return;\n\n    if (tokens[0].compare(\"optimize\") == 0) {\n        if (tokens.size() != 4) {\n            error(loc, \"optimize pragma syntax is incorrect\", \"#pragma\", \"\");\n            return;\n        }\n\n        if (tokens[1].compare(\"(\") != 0) {\n            error(loc, \"\\\"(\\\" expected after 'optimize' keyword\", \"#pragma\", \"\");\n            return;\n        }\n\n        if (tokens[2].compare(\"on\") == 0)\n            contextPragma.optimize = true;\n        else if (tokens[2].compare(\"off\") == 0)\n            contextPragma.optimize = false;\n        else {\n            if(relaxedErrors())\n                //  If an implementation does not recognize the tokens following #pragma, then it will ignore that pragma.\n                warn(loc, \"\\\"on\\\" or \\\"off\\\" expected after '(' for 'optimize' pragma\", \"#pragma\", \"\");\n            return;\n        }\n\n        if (tokens[3].compare(\")\") != 0) {\n            error(loc, \"\\\")\\\" expected to end 'optimize' pragma\", \"#pragma\", \"\");\n            return;\n        }\n    } else if (tokens[0].compare(\"debug\") == 0) {\n        if (tokens.size() != 4) {\n            error(loc, \"debug pragma syntax is incorrect\", \"#pragma\", \"\");\n            return;\n        }\n\n        if (tokens[1].compare(\"(\") != 0) {\n            error(loc, \"\\\"(\\\" expected after 'debug' keyword\", \"#pragma\", \"\");\n            return;\n        }\n\n        if (tokens[2].compare(\"on\") == 0)\n            contextPragma.debug = true;\n        else if (tokens[2].compare(\"off\") == 0)\n            contextPragma.debug = false;\n        else {\n            if(relaxedErrors())\n                //  If an implementation does not recognize the tokens following #pragma, then it will ignore that pragma.\n                warn(loc, \"\\\"on\\\" or \\\"off\\\" expected after '(' for 'debug' pragma\", \"#pragma\", \"\");\n            return;\n        }\n\n        if (tokens[3].compare(\")\") != 0) {\n            error(loc, \"\\\")\\\" expected to end 'debug' pragma\", \"#pragma\", \"\");\n            return;\n        }\n    } else if (spvVersion.spv > 0 && tokens[0].compare(\"use_storage_buffer\") == 0) {\n        if (tokens.size() != 1)\n            error(loc, \"extra tokens\", \"#pragma\", \"\");\n        intermediate.setUseStorageBuffer();\n    } else if (spvVersion.spv > 0 && tokens[0].compare(\"use_vulkan_memory_model\") == 0) {\n        if (tokens.size() != 1)\n            error(loc, \"extra tokens\", \"#pragma\", \"\");\n        intermediate.setUseVulkanMemoryModel();\n    } else if (spvVersion.spv > 0 && tokens[0].compare(\"use_variable_pointers\") == 0) {\n        if (tokens.size() != 1)\n            error(loc, \"extra tokens\", \"#pragma\", \"\");\n        if (spvVersion.spv < glslang::EShTargetSpv_1_3)\n            error(loc, \"requires SPIR-V 1.3\", \"#pragma use_variable_pointers\", \"\");\n        intermediate.setUseVariablePointers();\n    } else if (spvVersion.spv > 0 && tokens[0].compare(\"use_replicated_composites\") == 0) {\n        if (tokens.size() != 1)\n            error(loc, \"extra tokens\", \"#pragma\", \"\");\n        intermediate.setReplicatedComposites();\n    } else if (tokens[0].compare(\"once\") == 0) {\n        warn(loc, \"not implemented\", \"#pragma once\", \"\");\n    } else if (tokens[0].compare(\"glslang_binary_double_output\") == 0) {\n        intermediate.setBinaryDoubleOutput();\n    } else if (spvVersion.spv > 0 && tokens[0].compare(\"STDGL\") == 0 &&\n               tokens[1].compare(\"invariant\") == 0 && tokens[3].compare(\"all\") == 0) {\n        intermediate.setInvariantAll();\n        // Set all builtin out variables invariant if declared\n        setInvariant(loc, \"gl_Position\");\n        setInvariant(loc, \"gl_PointSize\");\n        setInvariant(loc, \"gl_ClipDistance\");\n        setInvariant(loc, \"gl_CullDistance\");\n        setInvariant(loc, \"gl_TessLevelOuter\");\n        setInvariant(loc, \"gl_TessLevelInner\");\n        setInvariant(loc, \"gl_PrimitiveID\");\n        setInvariant(loc, \"gl_Layer\");\n        setInvariant(loc, \"gl_ViewportIndex\");\n        setInvariant(loc, \"gl_FragDepth\");\n        setInvariant(loc, \"gl_SampleMask\");\n        setInvariant(loc, \"gl_ClipVertex\");\n        setInvariant(loc, \"gl_FrontColor\");\n        setInvariant(loc, \"gl_BackColor\");\n        setInvariant(loc, \"gl_FrontSecondaryColor\");\n        setInvariant(loc, \"gl_BackSecondaryColor\");\n        setInvariant(loc, \"gl_TexCoord\");\n        setInvariant(loc, \"gl_FogFragCoord\");\n        setInvariant(loc, \"gl_FragColor\");\n        setInvariant(loc, \"gl_FragData\");\n    }\n}\n\n//\n// Handle seeing a variable identifier in the grammar.\n//\nTIntermTyped* TParseContext::handleVariable(const TSourceLoc& loc, TSymbol* symbol, const TString* string)\n{\n    TIntermTyped* node = nullptr;\n\n    // Error check for requiring specific extensions present.\n    if (symbol && symbol->getNumExtensions())\n        requireExtensions(loc, symbol->getNumExtensions(), symbol->getExtensions(), symbol->getName().c_str());\n\n    if (symbol && symbol->isReadOnly()) {\n        // All shared things containing an unsized array must be copied up\n        // on first use, so that all future references will share its array structure,\n        // so that editing the implicit size will effect all nodes consuming it,\n        // and so that editing the implicit size won't change the shared one.\n        //\n        // If this is a variable or a block, check it and all it contains, but if this\n        // is a member of an anonymous block, check the whole block, as the whole block\n        // will need to be copied up if it contains an unsized array.\n        //\n        // This check is being done before the block-name check further down, so guard\n        // for that too.\n        if (!symbol->getType().isUnusableName()) {\n            if (symbol->getType().containsUnsizedArray() ||\n                (symbol->getAsAnonMember() &&\n                 symbol->getAsAnonMember()->getAnonContainer().getType().containsUnsizedArray()))\n                makeEditable(symbol);\n        }\n    }\n\n    const TVariable* variable;\n    const TAnonMember* anon = symbol ? symbol->getAsAnonMember() : nullptr;\n    if (anon) {\n        // It was a member of an anonymous container.\n\n        // Create a subtree for its dereference.\n        variable = anon->getAnonContainer().getAsVariable();\n        TIntermTyped* container = intermediate.addSymbol(*variable, loc);\n        TIntermTyped* constNode = intermediate.addConstantUnion(anon->getMemberNumber(), loc);\n        node = intermediate.addIndex(EOpIndexDirectStruct, container, constNode, loc);\n\n        node->setType(*(*variable->getType().getStruct())[anon->getMemberNumber()].type);\n        if (node->getType().hiddenMember())\n            error(loc, \"member of nameless block was not redeclared\", string->c_str(), \"\");\n    } else {\n        // Not a member of an anonymous container.\n\n        // The symbol table search was done in the lexical phase.\n        // See if it was a variable.\n        variable = symbol ? symbol->getAsVariable() : nullptr;\n        if (variable) {\n            if (variable->getType().isUnusableName()) {\n                error(loc, \"cannot be used (maybe an instance name is needed)\", string->c_str(), \"\");\n                variable = nullptr;\n            }\n\n            if (language == EShLangMesh && variable) {\n                TLayoutGeometry primitiveType = intermediate.getOutputPrimitive();\n                if ((variable->getMangledName() == \"gl_PrimitiveTriangleIndicesEXT\" && primitiveType != ElgTriangles) ||\n                    (variable->getMangledName() == \"gl_PrimitiveLineIndicesEXT\" && primitiveType != ElgLines) ||\n                    (variable->getMangledName() == \"gl_PrimitivePointIndicesEXT\" && primitiveType != ElgPoints)) {\n                    error(loc, \"cannot be used (output primitive type mismatch)\", string->c_str(), \"\");\n                    variable = nullptr;\n                }\n            }\n        } else {\n            if (symbol)\n                error(loc, \"variable name expected\", string->c_str(), \"\");\n        }\n\n        // Recovery, if it wasn't found or was not a variable.\n        if (! variable) {\n            bool builtIn = false;\n            TVector<const TFunction*> candidateList;\n            symbolTable.findFunctionNameList(*string + \"(\", candidateList, builtIn);\n\n            // If it's a function, pass the name/mangledName\n            if (!candidateList.empty() && !builtIn) {\n                variable = new TVariable(&candidateList[0]->getName(), &candidateList[0]->getMangledName(), TType(EbtFunction));\n            } else {\n                variable = new TVariable(string, TType(EbtVoid));\n            }\n        }\n\n        if (variable->getType().getQualifier().isFrontEndConstant())\n            node = intermediate.addConstantUnion(variable->getConstArray(), variable->getType(), loc);\n        else\n            node = intermediate.addSymbol(*variable, loc);\n    }\n\n    if (variable->getType().getQualifier().isIo())\n        intermediate.addIoAccessed(*string);\n\n    if (variable->getType().isReference() &&\n        variable->getType().getQualifier().bufferReferenceNeedsVulkanMemoryModel()) {\n        intermediate.setUseVulkanMemoryModel();\n    }\n\n    return node;\n}\n\n//\n// Handle seeing a base[index] dereference in the grammar.\n//\nTIntermTyped* TParseContext::handleBracketDereference(const TSourceLoc& loc, TIntermTyped* base, TIntermTyped* index)\n{\n    int indexValue = 0;\n    if (index->getQualifier().isFrontEndConstant())\n        indexValue = index->getAsConstantUnion()->getConstArray()[0].getIConst();\n\n    // basic type checks...\n    variableCheck(base);\n\n    if (! base->isArray() && ! base->isMatrix() && ! base->isVector() && ! base->getType().isCoopMat() &&\n        ! base->isReference() && ! base->getType().isCoopVecNV()) {\n        if (base->getAsSymbolNode())\n            error(loc, \" left of '[' is not of type array, matrix, or vector \", base->getAsSymbolNode()->getName().c_str(), \"\");\n        else\n            error(loc, \" left of '[' is not of type array, matrix, or vector \", \"expression\", \"\");\n\n        // Insert dummy error-recovery result\n        return intermediate.addConstantUnion(0.0, EbtFloat, loc);\n    }\n\n    if (!base->isArray() && base->isVector()) {\n        if (base->getType().contains16BitFloat())\n            requireFloat16Arithmetic(loc, \"[\", \"does not operate on types containing float16\");\n        if (base->getType().contains16BitInt())\n            requireInt16Arithmetic(loc, \"[\", \"does not operate on types containing (u)int16\");\n        if (base->getType().contains8BitInt())\n            requireInt8Arithmetic(loc, \"[\", \"does not operate on types containing (u)int8\");\n    }\n\n    // check for constant folding\n    if (base->getType().getQualifier().isFrontEndConstant() && index->getQualifier().isFrontEndConstant()) {\n        // both base and index are front-end constants\n        checkIndex(loc, base->getType(), indexValue);\n        return intermediate.foldDereference(base, indexValue, loc);\n    }\n\n    // at least one of base and index is not a front-end constant variable...\n    TIntermTyped* result = nullptr;\n\n    if (base->isReference() && ! base->isArray()) {\n        requireExtensions(loc, 1, &E_GL_EXT_buffer_reference2, \"buffer reference indexing\");\n        if (base->getType().getReferentType()->containsUnsizedArray()) {\n            error(loc, \"cannot index reference to buffer containing an unsized array\", \"\", \"\");\n            result = nullptr;\n        } else {\n            result = intermediate.addBinaryMath(EOpAdd, base, index, loc);\n            if (result != nullptr)\n                result->setType(base->getType());\n        }\n        if (result == nullptr) {\n            error(loc, \"cannot index buffer reference\", \"\", \"\");\n            result = intermediate.addConstantUnion(0.0, EbtFloat, loc);\n        }\n        return result;\n    }\n    if (base->getAsSymbolNode() && isIoResizeArray(base->getType()))\n        handleIoResizeArrayAccess(loc, base);\n\n    if (index->getQualifier().isFrontEndConstant())\n        checkIndex(loc, base->getType(), indexValue);\n\n    if (index->getQualifier().isFrontEndConstant()) {\n        if (base->getType().isUnsizedArray()) {\n            base->getWritableType().updateImplicitArraySize(indexValue + 1);\n            base->getWritableType().setImplicitlySized(true);\n            if (base->getQualifier().builtIn == EbvClipDistance &&\n                indexValue >= resources.maxClipDistances) {\n                error(loc, \"gl_ClipDistance\", \"[\", \"array index out of range '%d'\", indexValue);\n            }\n            else if (base->getQualifier().builtIn == EbvCullDistance &&\n                indexValue >= resources.maxCullDistances) {\n                error(loc, \"gl_CullDistance\", \"[\", \"array index out of range '%d'\", indexValue);\n            }\n            else if (base->getQualifier().builtIn == EbvSampleMask &&\n                indexValue >= (resources.maxSamples + 31) / 32) {\n                error(loc, \"gl_SampleMask\", \"[\", \"array index out of range '%d'\", indexValue);\n            }\n            // For 2D per-view builtin arrays, update the inner dimension size in parent type\n            if (base->getQualifier().isPerView() && base->getQualifier().builtIn != EbvNone) {\n                TIntermBinary* binaryNode = base->getAsBinaryNode();\n                if (binaryNode) {\n                    TType& leftType = binaryNode->getLeft()->getWritableType();\n                    TArraySizes& arraySizes = *leftType.getArraySizes();\n                    assert(arraySizes.getNumDims() == 2);\n                    arraySizes.setDimSize(1, std::max(arraySizes.getDimSize(1), indexValue + 1));\n                }\n            }\n        } else\n            checkIndex(loc, base->getType(), indexValue);\n        result = intermediate.addIndex(EOpIndexDirect, base, index, loc);\n    } else {\n        if (base->getType().isUnsizedArray()) {\n            // we have a variable index into an unsized array, which is okay,\n            // depending on the situation\n            if (base->getAsSymbolNode() && isIoResizeArray(base->getType()))\n                error(loc, \"\", \"[\", \"array must be sized by a redeclaration or layout qualifier before being indexed with a variable\");\n            else {\n                // it is okay for a run-time sized array\n                checkRuntimeSizable(loc, *base);\n            }\n            base->getWritableType().setArrayVariablyIndexed();\n        }\n        if (base->getBasicType() == EbtBlock) {\n            if (base->getQualifier().storage == EvqBuffer)\n                requireProfile(base->getLoc(), ~EEsProfile, \"variable indexing buffer block array\");\n            else if (base->getQualifier().storage == EvqUniform) {\n                profileRequires(base->getLoc(), EEsProfile, 320, Num_AEP_gpu_shader5, AEP_gpu_shader5,\n                                \"variable indexing uniform block array\");\n                profileRequires(base->getLoc(), ECoreProfile, 400, Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5,\n                                \"variable indexing uniform block array\");\n\n            }\n            else {\n                // input/output blocks either don't exist or can't be variably indexed\n            }\n        } else if (language == EShLangFragment && base->getQualifier().isPipeOutput() && base->getQualifier().builtIn != EbvSampleMask)\n            requireProfile(base->getLoc(), ~EEsProfile, \"variable indexing fragment shader output array\");\n        else if (base->getBasicType() == EbtSampler && version >= 130) {\n            const char* explanation = \"variable indexing sampler array\";\n            requireProfile(base->getLoc(), EEsProfile | ECoreProfile | ECompatibilityProfile, explanation);\n            profileRequires(base->getLoc(), EEsProfile, 320, Num_AEP_gpu_shader5, AEP_gpu_shader5, explanation);\n            profileRequires(base->getLoc(), ECoreProfile | ECompatibilityProfile, 400, Num_AEP_core_gpu_shader5,\n                            AEP_core_gpu_shader5, explanation);\n        }\n\n        result = intermediate.addIndex(EOpIndexIndirect, base, index, loc);\n    }\n\n    // Insert valid dereferenced result type\n    TType newType(base->getType(), 0);\n    if (base->getType().getQualifier().isConstant() && index->getQualifier().isConstant()) {\n        newType.getQualifier().storage = EvqConst;\n        // If base or index is a specialization constant, the result should also be a specialization constant.\n        if (base->getType().getQualifier().isSpecConstant() || index->getQualifier().isSpecConstant()) {\n            newType.getQualifier().makeSpecConstant();\n        }\n    } else {\n        newType.getQualifier().storage = EvqTemporary;\n        newType.getQualifier().specConstant = false;\n    }\n    result->setType(newType);\n\n    inheritMemoryQualifiers(base->getQualifier(), result->getWritableType().getQualifier());\n\n    // Propagate nonuniform\n    if (base->getQualifier().isNonUniform() || index->getQualifier().isNonUniform())\n        result->getWritableType().getQualifier().nonUniform = true;\n\n    if (anyIndexLimits)\n        handleIndexLimits(loc, base, index);\n\n    return result;\n}\n\n// for ES 2.0 (version 100) limitations for almost all index operations except vertex-shader uniforms\nvoid TParseContext::handleIndexLimits(const TSourceLoc& /*loc*/, TIntermTyped* base, TIntermTyped* index)\n{\n    if ((! limits.generalSamplerIndexing && base->getBasicType() == EbtSampler) ||\n        (! limits.generalUniformIndexing && base->getQualifier().isUniformOrBuffer() && language != EShLangVertex) ||\n        (! limits.generalAttributeMatrixVectorIndexing && base->getQualifier().isPipeInput() && language == EShLangVertex && (base->getType().isMatrix() || base->getType().isVector())) ||\n        (! limits.generalConstantMatrixVectorIndexing && base->getAsConstantUnion()) ||\n        (! limits.generalVariableIndexing && ! base->getType().getQualifier().isUniformOrBuffer() &&\n                                             ! base->getType().getQualifier().isPipeInput() &&\n                                             ! base->getType().getQualifier().isPipeOutput() &&\n                                             ! base->getType().getQualifier().isConstant()) ||\n        (! limits.generalVaryingIndexing && (base->getType().getQualifier().isPipeInput() ||\n                                                base->getType().getQualifier().isPipeOutput()))) {\n        // it's too early to know what the inductive variables are, save it for post processing\n        needsIndexLimitationChecking.push_back(index);\n    }\n}\n\n// Make a shared symbol have a non-shared version that can be edited by the current\n// compile, such that editing its type will not change the shared version and will\n// effect all nodes sharing it.\nvoid TParseContext::makeEditable(TSymbol*& symbol)\n{\n    TParseContextBase::makeEditable(symbol);\n\n    // See if it's tied to IO resizing\n    if (isIoResizeArray(symbol->getType()))\n        ioArraySymbolResizeList.push_back(symbol);\n}\n\n// Return true if this is a geometry shader input array or tessellation control output array\n// or mesh shader output array.\nbool TParseContext::isIoResizeArray(const TType& type) const\n{\n    return type.isArray() &&\n           ((language == EShLangGeometry    && type.getQualifier().storage == EvqVaryingIn) ||\n            (language == EShLangTessControl && type.getQualifier().storage == EvqVaryingOut &&\n                ! type.getQualifier().patch) ||\n            (language == EShLangFragment && type.getQualifier().storage == EvqVaryingIn &&\n                (type.getQualifier().pervertexNV || type.getQualifier().pervertexEXT)) ||\n            (language == EShLangMesh && type.getQualifier().storage == EvqVaryingOut &&\n                !type.getQualifier().perTaskNV));\n}\n\n// If an array is not isIoResizeArray() but is an io array, make sure it has the right size\nvoid TParseContext::fixIoArraySize(const TSourceLoc& loc, TType& type)\n{\n    if (! type.isArray() || type.getQualifier().patch || symbolTable.atBuiltInLevel())\n        return;\n\n    assert(! isIoResizeArray(type));\n\n    if (type.getQualifier().storage != EvqVaryingIn || type.getQualifier().patch)\n        return;\n\n    if (language == EShLangTessControl || language == EShLangTessEvaluation) {\n        if (type.getOuterArraySize() != resources.maxPatchVertices) {\n            if (type.isSizedArray())\n                error(loc, \"tessellation input array size must be gl_MaxPatchVertices or implicitly sized\", \"[]\", \"\");\n            type.changeOuterArraySize(resources.maxPatchVertices);\n        }\n    }\n}\n\n// Issue any errors if the non-array object is missing arrayness WRT\n// shader I/O that has array requirements.\n// All arrayness checking is handled in array paths, this is for\nvoid TParseContext::ioArrayCheck(const TSourceLoc& loc, const TType& type, const TString& identifier)\n{\n    if (! type.isArray() && ! symbolTable.atBuiltInLevel()) {\n        if (type.getQualifier().isArrayedIo(language) && !type.getQualifier().layoutPassthrough)\n            error(loc, \"type must be an array:\", type.getStorageQualifierString(), identifier.c_str());\n    }\n}\n\n// Handle a dereference of a geometry shader input array or tessellation control output array.\n// See ioArraySymbolResizeList comment in ParseHelper.h.\n//\nvoid TParseContext::handleIoResizeArrayAccess(const TSourceLoc& /*loc*/, TIntermTyped* base)\n{\n    TIntermSymbol* symbolNode = base->getAsSymbolNode();\n    assert(symbolNode);\n    if (! symbolNode)\n        return;\n\n    // fix array size, if it can be fixed and needs to be fixed (will allow variable indexing)\n    if (symbolNode->getType().isUnsizedArray()) {\n        int newSize = getIoArrayImplicitSize(symbolNode->getType().getQualifier());\n        if (newSize > 0)\n            symbolNode->getWritableType().changeOuterArraySize(newSize);\n    }\n}\n\n// If there has been an input primitive declaration (geometry shader) or an output\n// number of vertices declaration(tessellation shader), make sure all input array types\n// match it in size.  Types come either from nodes in the AST or symbols in the\n// symbol table.\n//\n// Types without an array size will be given one.\n// Types already having a size that is wrong will get an error.\n//\nvoid TParseContext::checkIoArraysConsistency(const TSourceLoc &loc, bool tailOnly)\n{\n    int requiredSize = 0;\n    TString featureString;\n    size_t listSize = ioArraySymbolResizeList.size();\n    size_t i = 0;\n\n    // If tailOnly = true, only check the last array symbol in the list.\n    if (tailOnly) {\n        i = listSize - 1;\n    }\n    for (bool firstIteration = true; i < listSize; ++i) {\n        TType &type = ioArraySymbolResizeList[i]->getWritableType();\n\n        // As I/O array sizes don't change, fetch requiredSize only once,\n        // except for mesh shaders which could have different I/O array sizes based on type qualifiers.\n        if (firstIteration || (language == EShLangMesh)) {\n            requiredSize = getIoArrayImplicitSize(type.getQualifier(), &featureString);\n            if (requiredSize == 0)\n                break;\n            firstIteration = false;\n        }\n\n        checkIoArrayConsistency(loc, requiredSize, featureString.c_str(), type,\n                                ioArraySymbolResizeList[i]->getName());\n    }\n}\n\nint TParseContext::getIoArrayImplicitSize(const TQualifier &qualifier, TString *featureString) const\n{\n    int expectedSize = 0;\n    TString str = \"unknown\";\n    unsigned int maxVertices = intermediate.getVertices() != TQualifier::layoutNotSet ? intermediate.getVertices() : 0;\n\n    if (language == EShLangGeometry) {\n        expectedSize = TQualifier::mapGeometryToSize(intermediate.getInputPrimitive());\n        str = TQualifier::getGeometryString(intermediate.getInputPrimitive());\n    }\n    else if (language == EShLangTessControl) {\n        expectedSize = maxVertices;\n        str = \"vertices\";\n    } else if (language == EShLangFragment) {\n        // Number of vertices for Fragment shader is always three.\n        expectedSize = 3;\n        str = \"vertices\";\n    } else if (language == EShLangMesh) {\n        unsigned int maxPrimitives =\n            intermediate.getPrimitives() != TQualifier::layoutNotSet ? intermediate.getPrimitives() : 0;\n        if (qualifier.builtIn == EbvPrimitiveIndicesNV) {\n            expectedSize = maxPrimitives * TQualifier::mapGeometryToSize(intermediate.getOutputPrimitive());\n            str = \"max_primitives*\";\n            str += TQualifier::getGeometryString(intermediate.getOutputPrimitive());\n        }\n        else if (qualifier.builtIn == EbvPrimitiveTriangleIndicesEXT || qualifier.builtIn == EbvPrimitiveLineIndicesEXT ||\n                 qualifier.builtIn == EbvPrimitivePointIndicesEXT) {\n            expectedSize = maxPrimitives;\n            str = \"max_primitives\";\n        }\n        else if (qualifier.isPerPrimitive()) {\n            expectedSize = maxPrimitives;\n            str = \"max_primitives\";\n        }\n        else {\n            expectedSize = maxVertices;\n            str = \"max_vertices\";\n        }\n    }\n    if (featureString)\n        *featureString = str;\n    return expectedSize;\n}\n\nvoid TParseContext::checkIoArrayConsistency(const TSourceLoc& loc, int requiredSize, const char* feature, TType& type, const TString& name)\n{\n    if (type.isUnsizedArray())\n        type.changeOuterArraySize(requiredSize);\n    else if (type.getOuterArraySize() != requiredSize) {\n        if (language == EShLangGeometry)\n            error(loc, \"inconsistent input primitive for array size of\", feature, name.c_str());\n        else if (language == EShLangTessControl)\n            error(loc, \"inconsistent output number of vertices for array size of\", feature, name.c_str());\n        else if (language == EShLangFragment) {\n            if (type.getOuterArraySize() > requiredSize)\n                error(loc, \" cannot be greater than 3 for pervertexEXT\", feature, name.c_str());\n        }\n        else if (language == EShLangMesh)\n            error(loc, \"inconsistent output array size of\", feature, name.c_str());\n        else\n            assert(0);\n    }\n}\n\n// Handle seeing a binary node with a math operation.\n// Returns nullptr if not semantically allowed.\nTIntermTyped* TParseContext::handleBinaryMath(const TSourceLoc& loc, const char* str, TOperator op, TIntermTyped* left, TIntermTyped* right)\n{\n    rValueErrorCheck(loc, str, left->getAsTyped());\n    rValueErrorCheck(loc, str, right->getAsTyped());\n\n    bool allowed = true;\n    switch (op) {\n    // TODO: Bring more source language-specific checks up from intermediate.cpp\n    // to the specific parse helpers for that source language.\n    case EOpLessThan:\n    case EOpGreaterThan:\n    case EOpLessThanEqual:\n    case EOpGreaterThanEqual:\n        if (! left->isScalar() || ! right->isScalar())\n            allowed = false;\n        break;\n    default:\n        break;\n    }\n\n    if (((left->getType().contains16BitFloat() || right->getType().contains16BitFloat()) && !float16Arithmetic()) ||\n        ((left->getType().contains16BitInt() || right->getType().contains16BitInt()) && !int16Arithmetic()) ||\n        ((left->getType().contains8BitInt() || right->getType().contains8BitInt()) && !int8Arithmetic()) ||\n        (left->getType().containsBFloat16() || right->getType().containsBFloat16())) {\n        allowed = false;\n    }\n\n    TIntermTyped* result = nullptr;\n    if (allowed) {\n        if ((left->isReference() || right->isReference()))\n            requireExtensions(loc, 1, &E_GL_EXT_buffer_reference2, \"buffer reference math\");\n        result = intermediate.addBinaryMath(op, left, right, loc);\n    }\n\n    if (result == nullptr) {\n        bool enhanced = intermediate.getEnhancedMsgs();\n        binaryOpError(loc, str, left->getCompleteString(enhanced), right->getCompleteString(enhanced));\n    }\n\n    return result;\n}\n\n// Handle seeing a unary node with a math operation.\nTIntermTyped* TParseContext::handleUnaryMath(const TSourceLoc& loc, const char* str, TOperator op, TIntermTyped* childNode)\n{\n    rValueErrorCheck(loc, str, childNode);\n\n    bool allowed = true;\n    if ((childNode->getType().contains16BitFloat() && !float16Arithmetic()) ||\n        (childNode->getType().contains16BitInt() && !int16Arithmetic()) ||\n        (childNode->getType().contains8BitInt() && !int8Arithmetic()) ||\n        (childNode->getType().containsBFloat16())) {\n        allowed = false;\n    }\n\n    TIntermTyped* result = nullptr;\n    if (allowed)\n        result = intermediate.addUnaryMath(op, childNode, loc);\n\n    if (result)\n        return result;\n    else {\n        bool enhanced = intermediate.getEnhancedMsgs();\n        unaryOpError(loc, str, childNode->getCompleteString(enhanced));\n    }\n\n    return childNode;\n}\n\n//\n// Handle seeing a base.field dereference in the grammar.\n//\nTIntermTyped* TParseContext::handleDotDereference(const TSourceLoc& loc, TIntermTyped* base, const TString& field)\n{\n    variableCheck(base);\n\n    //\n    // .length() can't be resolved until we later see the function-calling syntax.\n    // Save away the name in the AST for now.  Processing is completed in\n    // handleLengthMethod().\n    //\n    if (field == \"length\") {\n        if (base->isArray()) {\n            profileRequires(loc, ENoProfile, 120, E_GL_3DL_array_objects, \".length\");\n            profileRequires(loc, EEsProfile, 300, nullptr, \".length\");\n        } else if (base->isVector() || base->isMatrix()) {\n            const char* feature = \".length() on vectors and matrices\";\n            requireProfile(loc, ~EEsProfile, feature);\n            profileRequires(loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, feature);\n        } else if (!base->getType().isCoopMat() && !base->getType().isCoopVecNV()) {\n            bool enhanced = intermediate.getEnhancedMsgs();\n            error(loc, \"does not operate on this type:\", field.c_str(), base->getType().getCompleteString(enhanced).c_str());\n            return base;\n        }\n\n        return intermediate.addMethod(base, TType(EbtInt), &field, loc);\n    }\n\n    // It's not .length() if we get to here.\n\n    if (base->isArray()) {\n        error(loc, \"cannot apply to an array:\", \".\", field.c_str());\n\n        return base;\n    }\n\n    if (base->getType().isCoopMat()) {\n        error(loc, \"cannot apply to a cooperative matrix type:\", \".\", field.c_str());\n        return base;\n    }\n\n    // It's neither an array nor .length() if we get here,\n    // leaving swizzles and struct/block dereferences.\n\n    TIntermTyped* result = base;\n    if ((base->isVector() || base->isScalar()) &&\n        (base->isFloatingDomain() || base->isIntegerDomain() || base->getBasicType() == EbtBool)) {\n        result = handleDotSwizzle(loc, base, field);\n    } else if (base->isStruct() || base->isReference()) {\n        const TTypeList* fields = base->isReference() ?\n                                  base->getType().getReferentType()->getStruct() :\n                                  base->getType().getStruct();\n        bool fieldFound = false;\n        int member;\n        for (member = 0; member < (int)fields->size(); ++member) {\n            if ((*fields)[member].type->getFieldName() == field) {\n                fieldFound = true;\n                break;\n            }\n        }\n\n        if (fieldFound) {\n            if (spvVersion.vulkan != 0 && spvVersion.vulkanRelaxed)\n                result = vkRelaxedRemapDotDereference(loc, *base, *(*fields)[member].type, field);\n\n            if (result == base)\n            {\n                if (base->getType().getQualifier().isFrontEndConstant())\n                    result = intermediate.foldDereference(base, member, loc);\n                else {\n                    blockMemberExtensionCheck(loc, base, member, field);\n                    TIntermTyped* index = intermediate.addConstantUnion(member, loc);\n                    result = intermediate.addIndex(EOpIndexDirectStruct, base, index, loc);\n                    result->setType(*(*fields)[member].type);\n                    if ((*fields)[member].type->getQualifier().isIo())\n                        intermediate.addIoAccessed(field);\n                }\n            }\n\n            inheritMemoryQualifiers(base->getQualifier(), result->getWritableType().getQualifier());\n        } else {\n            auto baseSymbol = base;\n            while (baseSymbol->getAsSymbolNode() == nullptr) {\n                auto binaryNode = baseSymbol->getAsBinaryNode();\n                if (binaryNode == nullptr) break;\n                baseSymbol = binaryNode->getLeft();\n            }\n            if (baseSymbol->getAsSymbolNode() != nullptr) {\n                TString structName;\n                structName.append(\"\\'\").append(baseSymbol->getAsSymbolNode()->getName().c_str()).append(\"\\'\");\n                error(loc, \"no such field in structure\", field.c_str(), structName.c_str());\n            } else {\n                error(loc, \"no such field in structure\", field.c_str(), \"\");\n            }\n        }\n    } else\n        error(loc, \"does not apply to this type:\", field.c_str(),\n          base->getType().getCompleteString(intermediate.getEnhancedMsgs()).c_str());\n\n    // Propagate noContraction up the dereference chain\n    if (base->getQualifier().isNoContraction())\n        result->getWritableType().getQualifier().setNoContraction();\n\n    // Propagate nonuniform\n    if (base->getQualifier().isNonUniform())\n        result->getWritableType().getQualifier().nonUniform = true;\n\n    return result;\n}\n\n//\n// Handle seeing a base.swizzle, a subset of base.identifier in the grammar.\n//\nTIntermTyped* TParseContext::handleDotSwizzle(const TSourceLoc& loc, TIntermTyped* base, const TString& field)\n{\n    TIntermTyped* result = base;\n    if (base->isScalar()) {\n        const char* dotFeature = \"scalar swizzle\";\n        requireProfile(loc, ~EEsProfile, dotFeature);\n        profileRequires(loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, dotFeature);\n    }\n\n    TSwizzleSelectors<TVectorSelector> selectors;\n    parseSwizzleSelector(loc, field, base->getVectorSize(), selectors);\n\n    if (base->isVector() && selectors.size() != 1 && base->getType().contains16BitFloat())\n        requireFloat16Arithmetic(loc, \".\", \"can't swizzle types containing float16\");\n    if (base->isVector() && selectors.size() != 1 && base->getType().contains16BitInt())\n        requireInt16Arithmetic(loc, \".\", \"can't swizzle types containing (u)int16\");\n    if (base->isVector() && selectors.size() != 1 && base->getType().contains8BitInt())\n        requireInt8Arithmetic(loc, \".\", \"can't swizzle types containing (u)int8\");\n\n    if (base->isScalar()) {\n        if (selectors.size() == 1)\n            return result;\n        else {\n            TType type(base->getBasicType(), EvqTemporary, selectors.size());\n            // Swizzle operations propagate specialization-constantness\n            if (base->getQualifier().isSpecConstant())\n                type.getQualifier().makeSpecConstant();\n            return addConstructor(loc, base, type);\n        }\n    }\n\n    if (base->getType().getQualifier().isFrontEndConstant())\n        result = intermediate.foldSwizzle(base, selectors, loc);\n    else {\n        if (selectors.size() == 1) {\n            TIntermTyped* index = intermediate.addConstantUnion(selectors[0], loc);\n            result = intermediate.addIndex(EOpIndexDirect, base, index, loc);\n            result->setType(TType(base->getBasicType(), EvqTemporary, base->getType().getQualifier().precision));\n        } else {\n            TIntermTyped* index = intermediate.addSwizzle(selectors, loc);\n            result = intermediate.addIndex(EOpVectorSwizzle, base, index, loc);\n            result->setType(TType(base->getBasicType(), EvqTemporary, base->getType().getQualifier().precision, selectors.size()));\n        }\n        // Swizzle operations propagate specialization-constantness\n        if (base->getType().getQualifier().isSpecConstant())\n            result->getWritableType().getQualifier().makeSpecConstant();\n    }\n\n    return result;\n}\n\nvoid TParseContext::blockMemberExtensionCheck(const TSourceLoc& loc, const TIntermTyped* base, int member, const TString& memberName)\n{\n    // a block that needs extension checking is either 'base', or if arrayed,\n    // one level removed to the left\n    const TIntermSymbol* baseSymbol = nullptr;\n    if (base->getAsBinaryNode() == nullptr)\n        baseSymbol = base->getAsSymbolNode();\n    else\n        baseSymbol = base->getAsBinaryNode()->getLeft()->getAsSymbolNode();\n    if (baseSymbol == nullptr)\n        return;\n    const TSymbol* symbol = symbolTable.find(baseSymbol->getName());\n    if (symbol == nullptr)\n        return;\n    const TVariable* variable = symbol->getAsVariable();\n    if (variable == nullptr)\n        return;\n    if (!variable->hasMemberExtensions())\n        return;\n\n    // We now have a variable that is the base of a dot reference\n    // with members that need extension checking.\n    if (variable->getNumMemberExtensions(member) > 0)\n        requireExtensions(loc, variable->getNumMemberExtensions(member), variable->getMemberExtensions(member), memberName.c_str());\n}\n\n//\n// Handle seeing a function declarator in the grammar.  This is the precursor\n// to recognizing a function prototype or function definition.\n//\nTFunction* TParseContext::handleFunctionDeclarator(const TSourceLoc& loc, TFunction& function, bool prototype)\n{\n    // ES can't declare prototypes inside functions\n    if (! symbolTable.atGlobalLevel())\n        requireProfile(loc, ~EEsProfile, \"local function declaration\");\n\n    //\n    // Multiple declarations of the same function name are allowed.\n    //\n    // If this is a definition, the definition production code will check for redefinitions\n    // (we don't know at this point if it's a definition or not).\n    //\n    // Redeclarations (full signature match) are allowed.  But, return types and parameter qualifiers must also match.\n    //  - except ES 100, which only allows a single prototype\n    //\n    // ES 100 does not allow redefining, but does allow overloading of built-in functions.\n    // ES 300 does not allow redefining or overloading of built-in functions.\n    //\n    bool builtIn;\n    TSymbol* symbol = symbolTable.find(function.getMangledName(), &builtIn);\n    if (symbol && symbol->getAsFunction() && builtIn)\n        requireProfile(loc, ~EEsProfile, \"redefinition of built-in function\");\n    // Check the validity of using spirv_literal qualifier\n    for (int i = 0; i < function.getParamCount(); ++i) {\n        if (function[i].type->getQualifier().isSpirvLiteral() && function.getBuiltInOp() != EOpSpirvInst)\n            error(loc, \"'spirv_literal' can only be used on functions defined with 'spirv_instruction' for argument\",\n                  function.getName().c_str(), \"%d\", i + 1);\n    }\n\n    // For function declaration with SPIR-V instruction qualifier, always ignore the built-in function and\n    // respect this redeclared one.\n    if (symbol && builtIn && function.getBuiltInOp() == EOpSpirvInst)\n        symbol = nullptr;\n    const TFunction* prevDec = symbol ? symbol->getAsFunction() : nullptr;\n    if (prevDec) {\n        if (prevDec->isPrototyped() && prototype)\n            profileRequires(loc, EEsProfile, 300, nullptr, \"multiple prototypes for same function\");\n        if (prevDec->getSpirvInstruction() != function.getSpirvInstruction()) {\n            error(loc, \"overloaded functions must have the same qualifiers\", function.getName().c_str(),\n                  \"spirv_instruction\");\n        }\n        bool parameterTypesDiffer = false;\n        for (int i = 0; i < prevDec->getParamCount(); ++i) {\n            if ((*prevDec)[i].type->getQualifier().storage != function[i].type->getQualifier().storage)\n                error(loc, \"overloaded functions must have the same parameter storage qualifiers for argument\", function[i].type->getStorageQualifierString(), \"%d\", i+1);\n\n            if ((*prevDec)[i].type->getQualifier().precision != function[i].type->getQualifier().precision)\n                error(loc, \"overloaded functions must have the same parameter precision qualifiers for argument\", function[i].type->getPrecisionQualifierString(), \"%d\", i+1);\n\n            if (*(*prevDec)[i].type != *function[i].type)\n                parameterTypesDiffer = true;\n        }\n        if (!parameterTypesDiffer && prevDec->getType() != function.getType())\n            error(loc, \"overloaded functions must have the same return type\", function.getName().c_str(), \"\");\n    }\n\n    arrayObjectCheck(loc, function.getType(), \"array in function return type\");\n\n    if (prototype) {\n        // All built-in functions are defined, even though they don't have a body.\n        // Count their prototype as a definition instead.\n        if (symbolTable.atBuiltInLevel())\n            function.setDefined();\n        else {\n            if (prevDec && ! builtIn)\n                symbol->getAsFunction()->setPrototyped();  // need a writable one, but like having prevDec as a const\n            function.setPrototyped();\n        }\n    }\n\n    // This insert won't actually insert it if it's a duplicate signature, but it will still check for\n    // other forms of name collisions.\n    if (! symbolTable.insert(function))\n        error(loc, \"function name is redeclaration of existing name\", function.getName().c_str(), \"\");\n\n    //\n    // If this is a redeclaration, it could also be a definition,\n    // in which case, we need to use the parameter names from this one, and not the one that's\n    // being redeclared.  So, pass back this declaration, not the one in the symbol table.\n    //\n    return &function;\n}\n\n//\n// Handle seeing the function prototype in front of a function definition in the grammar.\n// The body is handled after this function returns.\n//\nTIntermAggregate* TParseContext::handleFunctionDefinition(const TSourceLoc& loc, TFunction& function)\n{\n    currentCaller = function.getMangledName();\n    TSymbol* symbol = symbolTable.find(function.getMangledName());\n    TFunction* prevDec = symbol ? symbol->getAsFunction() : nullptr;\n\n    if (! prevDec)\n        error(loc, \"can't find function\", function.getName().c_str(), \"\");\n    // Note:  'prevDec' could be 'function' if this is the first time we've seen function\n    // as it would have just been put in the symbol table.  Otherwise, we're looking up\n    // an earlier occurrence.\n\n    if (prevDec && prevDec->isDefined()) {\n        // Then this function already has a body.\n        error(loc, \"function already has a body\", function.getName().c_str(), \"\");\n    }\n    if (prevDec && ! prevDec->isDefined()) {\n        prevDec->setDefined();\n\n        // Remember the return type for later checking for RETURN statements.\n        currentFunctionType = &(prevDec->getType());\n    } else\n        currentFunctionType = new TType(EbtVoid);\n    functionReturnsValue = false;\n\n    // Check for entry point\n    if (function.getName().compare(intermediate.getEntryPointName().c_str()) == 0) {\n        intermediate.setEntryPointMangledName(function.getMangledName().c_str());\n        intermediate.incrementEntryPointCount();\n        inMain = true;\n    } else\n        inMain = false;\n\n    //\n    // Raise error message if main function takes any parameters or returns anything other than void\n    //\n    if (inMain) {\n        if (function.getParamCount() > 0)\n            error(loc, \"function cannot take any parameter(s)\", function.getName().c_str(), \"\");\n        if (function.getType().getBasicType() != EbtVoid)\n            error(loc, \"\", function.getType().getBasicTypeString().c_str(), \"entry point cannot return a value\");\n        if (function.getLinkType() != ELinkNone)\n            error(loc, \"main function cannot be exported\", \"\", \"\");\n    }\n\n    //\n    // New symbol table scope for body of function plus its arguments\n    //\n    symbolTable.push();\n\n    //\n    // Insert parameters into the symbol table.\n    // If the parameter has no name, it's not an error, just don't insert it\n    // (could be used for unused args).\n    //\n    // Also, accumulate the list of parameters into the HIL, so lower level code\n    // knows where to find parameters.\n    //\n    TIntermAggregate* paramNodes = new TIntermAggregate;\n    for (int i = 0; i < function.getParamCount(); i++) {\n        TParameter& param = function[i];\n        if (param.name != nullptr) {\n            TVariable *variable = new TVariable(param.name, *param.type);\n\n            // Insert the parameters with name in the symbol table.\n            if (! symbolTable.insert(*variable))\n                error(loc, \"redefinition\", variable->getName().c_str(), \"\");\n            else {\n                // Transfer ownership of name pointer to symbol table.\n                param.name = nullptr;\n\n                // Add the parameter to the HIL\n                paramNodes = intermediate.growAggregate(paramNodes,\n                                                        intermediate.addSymbol(*variable, loc),\n                                                        loc);\n            }\n        } else\n            paramNodes = intermediate.growAggregate(paramNodes, intermediate.addSymbol(*param.type, loc), loc);\n    }\n    paramNodes->setLinkType(function.getLinkType());\n    intermediate.setAggregateOperator(paramNodes, EOpParameters, TType(EbtVoid), loc);\n    loopNestingLevel = 0;\n    statementNestingLevel = 0;\n    controlFlowNestingLevel = 0;\n    postEntryPointReturn = false;\n\n    return paramNodes;\n}\n\n//\n// Handle seeing function call syntax in the grammar, which could be any of\n//  - .length() method\n//  - constructor\n//  - a call to a built-in function mapped to an operator\n//  - a call to a built-in function that will remain a function call (e.g., texturing)\n//  - user function\n//  - subroutine call (not implemented yet)\n//\nTIntermTyped* TParseContext::handleFunctionCall(const TSourceLoc& loc, TFunction* function, TIntermNode* arguments)\n{\n    TIntermTyped* result = nullptr;\n\n    if (spvVersion.vulkan != 0 && spvVersion.vulkanRelaxed) {\n        // allow calls that are invalid in Vulkan Semantics to be invisibily\n        // remapped to equivalent valid functions\n        result = vkRelaxedRemapFunctionCall(loc, function, arguments);\n        if (result)\n            return result;\n    }\n\n    if (function->getBuiltInOp() == EOpArrayLength)\n        result = handleLengthMethod(loc, function, arguments);\n    else if (function->getBuiltInOp() != EOpNull) {\n        //\n        // Then this should be a constructor.\n        // Don't go through the symbol table for constructors.\n        // Their parameters will be verified algorithmically.\n        //\n        TType type(EbtVoid);  // use this to get the type back\n        if (! constructorError(loc, arguments, *function, function->getBuiltInOp(), type)) {\n            //\n            // It's a constructor, of type 'type'.\n            //\n            result = addConstructor(loc, arguments, type);\n            if (result == nullptr)\n                error(loc, \"cannot construct with these arguments\", type.getCompleteString(intermediate.getEnhancedMsgs()).c_str(), \"\");\n        }\n    } else {\n        //\n        // Find it in the symbol table.\n        //\n        const TFunction* fnCandidate;\n        bool builtIn {false};\n        fnCandidate = findFunction(loc, *function, builtIn);\n        if (fnCandidate) {\n            // This is a declared function that might map to\n            //  - a built-in operator,\n            //  - a built-in function not mapped to an operator, or\n            //  - a user function.\n\n            // Error check for a function requiring specific extensions present.\n            if (builtIn &&\n                (fnCandidate->getBuiltInOp() == EOpSubgroupQuadAll || fnCandidate->getBuiltInOp() == EOpSubgroupQuadAny))\n                requireExtensions(loc, 1, &E_GL_EXT_shader_quad_control, fnCandidate->getName().c_str());\n\n            if (builtIn && fnCandidate->getNumExtensions())\n                requireExtensions(loc, fnCandidate->getNumExtensions(), fnCandidate->getExtensions(), fnCandidate->getName().c_str());\n\n            if (builtIn && fnCandidate->getType().contains16BitFloat())\n                requireFloat16Arithmetic(loc, \"built-in function\", \"float16 types can only be in uniform block or buffer storage\");\n            if (builtIn && fnCandidate->getType().contains16BitInt())\n                requireInt16Arithmetic(loc, \"built-in function\", \"(u)int16 types can only be in uniform block or buffer storage\");\n            if (builtIn && fnCandidate->getType().contains8BitInt())\n                requireInt8Arithmetic(loc, \"built-in function\", \"(u)int8 types can only be in uniform block or buffer storage\");\n            if (builtIn && (fnCandidate->getBuiltInOp() == EOpTextureFetch || fnCandidate->getBuiltInOp() == EOpTextureQuerySize)) {\n                if ((*fnCandidate)[0].type->getSampler().isMultiSample() && version <= 140)\n                    requireExtensions(loc, 1, &E_GL_ARB_texture_multisample, fnCandidate->getName().c_str());\n            }\n            if (arguments != nullptr) {\n                // Make sure qualifications work for these arguments.\n                TIntermAggregate* aggregate = arguments->getAsAggregate();\n                for (int i = 0; i < fnCandidate->getParamCount(); ++i) {\n                    // At this early point there is a slight ambiguity between whether an aggregate 'arguments'\n                    // is the single argument itself or its children are the arguments.  Only one argument\n                    // means take 'arguments' itself as the one argument.\n                    TIntermNode* arg = fnCandidate->getParamCount() == 1 ? arguments : (aggregate ? aggregate->getSequence()[i] : arguments);\n                    TQualifier& formalQualifier = (*fnCandidate)[i].type->getQualifier();\n                    if (formalQualifier.isParamOutput()) {\n                        if (lValueErrorCheck(arguments->getLoc(), \"assign\", arg->getAsTyped()))\n                            error(arguments->getLoc(), \"Non-L-value cannot be passed for 'out' or 'inout' parameters.\", \"out\", \"\");\n                    }\n                    if (formalQualifier.isSpirvLiteral()) {\n                        if (!arg->getAsTyped()->getQualifier().isFrontEndConstant()) {\n                            error(arguments->getLoc(),\n                                  \"Non front-end constant expressions cannot be passed for 'spirv_literal' parameters.\",\n                                  \"spirv_literal\", \"\");\n                        }\n                    }\n                    const TType& argType = arg->getAsTyped()->getType();\n                    const TQualifier& argQualifier = argType.getQualifier();\n                    bool containsBindlessSampler = intermediate.getBindlessMode() && argType.containsSampler();\n                    if (argQualifier.isMemory() && !containsBindlessSampler && (argType.containsOpaque() || argType.isReference())) {\n                        const char* message = \"argument cannot drop memory qualifier when passed to formal parameter\";\n                        if (argQualifier.volatil && ! formalQualifier.volatil)\n                            error(arguments->getLoc(), message, \"volatile\", \"\");\n                        if (argQualifier.coherent && ! (formalQualifier.devicecoherent || formalQualifier.coherent))\n                            error(arguments->getLoc(), message, \"coherent\", \"\");\n                        if (argQualifier.devicecoherent && ! (formalQualifier.devicecoherent || formalQualifier.coherent))\n                            error(arguments->getLoc(), message, \"devicecoherent\", \"\");\n                        if (argQualifier.queuefamilycoherent && ! (formalQualifier.queuefamilycoherent || formalQualifier.devicecoherent || formalQualifier.coherent))\n                            error(arguments->getLoc(), message, \"queuefamilycoherent\", \"\");\n                        if (argQualifier.workgroupcoherent && ! (formalQualifier.workgroupcoherent || formalQualifier.queuefamilycoherent || formalQualifier.devicecoherent || formalQualifier.coherent))\n                            error(arguments->getLoc(), message, \"workgroupcoherent\", \"\");\n                        if (argQualifier.subgroupcoherent && ! (formalQualifier.subgroupcoherent || formalQualifier.workgroupcoherent || formalQualifier.queuefamilycoherent || formalQualifier.devicecoherent || formalQualifier.coherent))\n                            error(arguments->getLoc(), message, \"subgroupcoherent\", \"\");\n                        if (argQualifier.readonly && ! formalQualifier.readonly)\n                            error(arguments->getLoc(), message, \"readonly\", \"\");\n                        if (argQualifier.writeonly && ! formalQualifier.writeonly)\n                            error(arguments->getLoc(), message, \"writeonly\", \"\");\n                        if (argQualifier.nontemporal && ! formalQualifier.nontemporal)\n                            error(arguments->getLoc(), message, \"nontemporal\", \"\");\n                        // Don't check 'restrict', it is different than the rest:\n                        // \"...but only restrict can be taken away from a calling argument, by a formal parameter that\n                        // lacks the restrict qualifier...\"\n                    }\n                    if (!builtIn && argQualifier.getFormat() != formalQualifier.getFormat()) {\n                        // we have mismatched formats, which should only be allowed if writeonly\n                        // and at least one format is unknown\n                        if (!formalQualifier.isWriteOnly() || (formalQualifier.getFormat() != ElfNone &&\n                                                                  argQualifier.getFormat() != ElfNone))\n                            error(arguments->getLoc(), \"image formats must match\", \"format\", \"\");\n                    }\n                    if (builtIn && arg->getAsTyped()->getType().contains16BitFloat())\n                        requireFloat16Arithmetic(arguments->getLoc(), \"built-in function\", \"float16 types can only be in uniform block or buffer storage\");\n                    if (builtIn && arg->getAsTyped()->getType().contains16BitInt())\n                        requireInt16Arithmetic(arguments->getLoc(), \"built-in function\", \"(u)int16 types can only be in uniform block or buffer storage\");\n                    if (builtIn && arg->getAsTyped()->getType().contains8BitInt())\n                        requireInt8Arithmetic(arguments->getLoc(), \"built-in function\", \"(u)int8 types can only be in uniform block or buffer storage\");\n\n                    // Check that coopVecOuterProductAccumulateNV vector component types match\n                    if (builtIn && fnCandidate->getBuiltInOp() == EOpCooperativeVectorOuterProductAccumulateNV &&\n                        i == 1 && arg->getAsTyped()->getType().getBasicType() != aggregate->getSequence()[0]->getAsTyped()->getType().getBasicType())\n                        error(arguments->getLoc(), \"cooperative vector basic types must match\", fnCandidate->getName().c_str(), \"\");\n\n                    // TODO 4.5 functionality:  A shader will fail to compile\n                    // if the value passed to the memargument of an atomic memory function does not correspond to a buffer or\n                    // shared variable. It is acceptable to pass an element of an array or a single component of a vector to the\n                    // memargument of an atomic memory function, as long as the underlying array or vector is a buffer or\n                    // shared variable.\n                }\n\n                // Convert 'in' arguments\n                addInputArgumentConversions(*fnCandidate, arguments);  // arguments may be modified if it's just a single argument node\n            }\n\n            if (builtIn && fnCandidate->getBuiltInOp() != EOpNull) {\n                // A function call mapped to a built-in operation.\n                result = handleBuiltInFunctionCall(loc, arguments, *fnCandidate);\n            } else if (fnCandidate->getBuiltInOp() == EOpSpirvInst) {\n                // When SPIR-V instruction qualifier is specified, the function call is still mapped to a built-in operation.\n                result = handleBuiltInFunctionCall(loc, arguments, *fnCandidate);\n            } else {\n                // This is a function call not mapped to built-in operator.\n                // It could still be a built-in function, but only if PureOperatorBuiltins == false.\n                result = intermediate.setAggregateOperator(arguments, EOpFunctionCall, fnCandidate->getType(), loc);\n                TIntermAggregate* call = result->getAsAggregate();\n                call->setName(fnCandidate->getMangledName());\n\n                // this is how we know whether the given function is a built-in function or a user-defined function\n                // if builtIn == false, it's a userDefined -> could be an overloaded built-in function also\n                // if builtIn == true, it's definitely a built-in function with EOpNull\n                if (! builtIn) {\n                    call->setUserDefined();\n                    if (symbolTable.atGlobalLevel()) {\n                        requireProfile(loc, ~EEsProfile, \"calling user function from global scope\");\n                        intermediate.addToCallGraph(infoSink, \"main(\", fnCandidate->getMangledName());\n                    } else\n                        intermediate.addToCallGraph(infoSink, currentCaller, fnCandidate->getMangledName());\n                }\n\n                if (builtIn)\n                    nonOpBuiltInCheck(loc, *fnCandidate, *call);\n                else\n                    userFunctionCallCheck(loc, *call);\n            }\n\n            // Convert 'out' arguments.  If it was a constant folded built-in, it won't be an aggregate anymore.\n            // Built-ins with a single argument aren't called with an aggregate, but they also don't have an output.\n            // Also, build the qualifier list for user function calls, which are always called with an aggregate.\n            if (result->getAsAggregate()) {\n                TQualifierList& qualifierList = result->getAsAggregate()->getQualifierList();\n                for (int i = 0; i < fnCandidate->getParamCount(); ++i) {\n                    TStorageQualifier qual = (*fnCandidate)[i].type->getQualifier().storage;\n                    qualifierList.push_back(qual);\n                }\n                result = addOutputArgumentConversions(*fnCandidate, *result->getAsAggregate());\n            }\n\n            handleCoopMat2FunctionCall(loc, fnCandidate, result, arguments);\n\n            if (result->getAsTyped()->getType().isCoopVecNV() &&\n               !result->getAsTyped()->getType().isParameterized()) {\n                if (auto unaryNode = result->getAsUnaryNode())\n                    result->setType(unaryNode->getOperand()->getAsTyped()->getType());\n                else\n                    result->setType(result->getAsAggregate()->getSequence()[0]->getAsTyped()->getType());\n            }\n\n            if (fnCandidate->getBuiltInOp() == EOpConstructSaturated) {\n                // result type is taken from the first parameter\n                result->setType(result->getAsAggregate()->getSequence()[0]->getAsTyped()->getType());\n            }\n        }\n    }\n\n    // generic error recovery\n    // TODO: simplification: localize all the error recoveries that look like this, and taking type into account to reduce cascades\n    if (result == nullptr)\n        result = intermediate.addConstantUnion(0.0, EbtFloat, loc);\n\n    return result;\n}\n\nvoid TParseContext::handleCoopMat2FunctionCall(const TSourceLoc& loc, const TFunction* fnCandidate, TIntermTyped* result, TIntermNode* arguments)\n{\n    if (arguments && arguments->getAsAggregate()) {\n        auto &sequence = arguments->getAsAggregate()->getSequence();\n        for (uint32_t i = 0; i < sequence.size(); ++i) {\n            auto param = sequence[i];\n            if (param->getAsTyped()->getBasicType() == EbtFunction) {\n                // Add the function to the callgraph\n                intermediate.addToCallGraph(infoSink, currentCaller, param->getAsSymbolNode()->getMangledName());\n\n                // error checking that all parameters are 'const in'\n                if (fnCandidate->getBuiltInOp() == EOpCooperativeMatrixLoadTensorNV ||\n                    fnCandidate->getBuiltInOp() == EOpCooperativeMatrixReduceNV ||\n                    fnCandidate->getBuiltInOp() == EOpCooperativeMatrixPerElementOpNV) {\n                    const TFunction* func = symbolTable.find(param->getAsSymbolNode()->getMangledName())->getAsFunction();\n                    for (int i = 0; i < func->getParamCount(); ++i) {\n                        const TParameter& arg = (*func)[i];\n                        const TQualifier& formalQualifier = arg.type->getQualifier();\n                        if (formalQualifier.storage != EvqConstReadOnly) {\n                            error(loc, \"function parameters must all be qualified 'const in'\", param->getAsSymbolNode()->getMangledName().c_str(), \"\");\n                        }\n                    }\n                }\n\n                // error checking decodeFunc parameters are (reference, uint32_t[], uint32_t[])\n                if (fnCandidate->getBuiltInOp() == EOpCooperativeMatrixLoadTensorNV) {\n                    const TFunction* decodeFunc = symbolTable.find(param->getAsSymbolNode()->getMangledName())->getAsFunction();\n\n                    if (decodeFunc->getParamCount() != 3) {\n                        error(loc, \"must have three parameters\", param->getAsSymbolNode()->getMangledName().c_str(), \"\");\n                    }\n\n                    if ((*decodeFunc)[0].type->getBasicType() != EbtReference) {\n                        error(loc, \"first parameter must be buffer reference type\", param->getAsSymbolNode()->getMangledName().c_str(), \"\");\n                    }\n                    if ((*decodeFunc)[1].type->getBasicType() != EbtUint || (*decodeFunc)[2].type->getBasicType() != EbtUint) {\n                        error(loc, \"coordinate parameters must be uint32_t\", param->getAsSymbolNode()->getMangledName().c_str(), \"\");\n                    }\n                    if (!(*decodeFunc)[1].type->isArray() || !(*decodeFunc)[2].type->isArray()) {\n                        error(loc, \"coordinate parameters must be uint32_t\", param->getAsSymbolNode()->getMangledName().c_str(), \"\");\n                    }\n                }\n\n                // error checking reduce function has matching parameters\n                if (fnCandidate->getBuiltInOp() == EOpCooperativeMatrixReduceNV) {\n                    const TFunction* combineOp = symbolTable.find(param->getAsSymbolNode()->getMangledName())->getAsFunction();\n\n                    if (combineOp->getParamCount() != 2) {\n                        error(loc, \"must have two parameters\", param->getAsSymbolNode()->getMangledName().c_str(), \"\");\n                    }\n\n                    for (int i = 0; i < combineOp->getParamCount(); ++i) {\n                        const TParameter& arg = (*combineOp)[i];\n                        if (sequence[1]->getAsTyped()->getType().getBasicType() != arg.type->getBasicType()) {\n                            error(loc, \"parameter types must match cooperative matrix component type\", param->getAsSymbolNode()->getMangledName().c_str(), \"\");\n                        }\n                    }\n                    if (sequence[1]->getAsTyped()->getType().getBasicType() != combineOp->getType().getBasicType()) {\n                        error(loc, \"return type must match cooperative matrix component type\", param->getAsSymbolNode()->getMangledName().c_str(), \"\");\n                    }\n                }\n\n                // error checking perelement op has correct parameters\n                if (fnCandidate->getBuiltInOp() == EOpCooperativeMatrixPerElementOpNV) {\n                    const TFunction* elemOp = symbolTable.find(param->getAsSymbolNode()->getMangledName())->getAsFunction();\n\n                    if (sequence[1]->getAsTyped()->getType() != sequence[0]->getAsTyped()->getType()) {\n                        error(loc, \"cooperative matrix input and result types must match\", \"\", \"\");\n                    }\n\n                    if (elemOp->getParamCount() < 3) {\n                        error(loc, \"not enough parameters\", param->getAsSymbolNode()->getMangledName().c_str(), \"\");\n                    } else if (elemOp->getParamCount() != (int)sequence.size()) {\n                        error(loc, \"number of parameters must match call to coopMatPerElementNV\", param->getAsSymbolNode()->getMangledName().c_str(), \"\");\n                    } else {\n                        if ((*elemOp)[0].type->getBasicType() != EbtUint || (*elemOp)[1].type->getBasicType() != EbtUint) {\n                            error(loc, \"row/column parameters must be uint32_t\", param->getAsSymbolNode()->getMangledName().c_str(), \"\");\n                        }\n\n                        const TParameter& matArg = (*elemOp)[2];\n                        if (sequence[1]->getAsTyped()->getType().getBasicType() != matArg.type->getBasicType()) {\n                            error(loc, \"third parameter must match cooperative matrix component type\", param->getAsSymbolNode()->getMangledName().c_str(), \"\");\n                        }\n\n                        for (int i = 3; i < elemOp->getParamCount(); ++i) {\n                            const TParameter& arg = (*elemOp)[i];\n                            if (sequence[i]->getAsTyped()->getType().getBasicType() != arg.type->getBasicType()) {\n                                error(loc, \"parameter types must match or be cooperative matrix component type\", param->getAsSymbolNode()->getMangledName().c_str(), \"\");\n                            }\n                        }\n                        if (sequence[1]->getAsTyped()->getType().getBasicType() != elemOp->getType().getBasicType()) {\n                            error(loc, \"return type must match cooperative matrix component type\", param->getAsSymbolNode()->getMangledName().c_str(), \"\");\n                        }\n                    }\n                }\n            }\n        }\n    }\n    if ((result->getAsTyped()->getType().isCoopMat() ||\n         result->getAsTyped()->getType().isTensorLayoutNV() ||\n         result->getAsTyped()->getType().isTensorViewNV()) &&\n       !result->getAsTyped()->getType().isParameterized()) {\n        assert(fnCandidate->getBuiltInOp() == EOpCooperativeMatrixMulAdd ||\n               fnCandidate->getBuiltInOp() == EOpCooperativeMatrixMulAddNV ||\n               fnCandidate->getBuiltInOp() == EOpCooperativeMatrixReduceNV ||\n               fnCandidate->getBuiltInOp() == EOpCooperativeMatrixPerElementOpNV ||\n               fnCandidate->getBuiltInOp() == EOpCooperativeMatrixTransposeNV ||\n               fnCandidate->getBuiltInOp() == EOpCreateTensorLayoutNV ||\n               fnCandidate->getBuiltInOp() == EOpTensorLayoutSetDimensionNV ||\n               fnCandidate->getBuiltInOp() == EOpTensorLayoutSetBlockSizeNV ||\n               fnCandidate->getBuiltInOp() == EOpTensorLayoutSetStrideNV ||\n               fnCandidate->getBuiltInOp() == EOpTensorLayoutSliceNV ||\n               fnCandidate->getBuiltInOp() == EOpTensorLayoutSetClampValueNV ||\n               fnCandidate->getBuiltInOp() == EOpCreateTensorViewNV ||\n               fnCandidate->getBuiltInOp() == EOpTensorViewSetDimensionNV ||\n               fnCandidate->getBuiltInOp() == EOpTensorViewSetStrideNV ||\n               fnCandidate->getBuiltInOp() == EOpTensorViewSetClipNV);\n\n        if (fnCandidate->getBuiltInOp() == EOpCreateTensorLayoutNV) {\n\n            // Convert template parameters to arraySizes/typeParameters\n            TArraySizes *arraySizes = new TArraySizes;\n            for (uint32_t i = 0; i < 2; ++i) {\n                TIntermNode *param {};\n                if (arguments->getAsConstantUnion()) {\n                    if (i == 0) {\n                        param = arguments;\n                    }\n                } else {\n                    assert(arguments->getAsAggregate());\n                    auto &sequence = arguments->getAsAggregate()->getSequence();\n                    if (i < sequence.size()) {\n                        param = sequence[i];\n                    }\n                }\n                if (param) {\n                    if (param->getAsTyped()->getType().getQualifier().isSpecConstant()) {\n                        uint32_t value = param->getAsSymbolNode()->getConstArray()[0].getIConst();\n                        arraySizes->addInnerSize(value, param->getAsTyped());\n                    } else {\n                        uint32_t value = param->getAsConstantUnion()->getConstArray()[0].getIConst();\n                        arraySizes->addInnerSize(value);\n                    }\n                } else {\n                    // gl_CooperativeMatrixClampModeUndefined\n                    arraySizes->addInnerSize(0);\n                }\n            }\n            TTypeParameters typeParameters;\n            typeParameters.arraySizes = arraySizes;\n\n            TType resultType;\n            resultType.deepCopy(result->getAsTyped()->getType());\n\n            resultType.copyTypeParameters(typeParameters);\n            result->setType(resultType);\n        } else if (fnCandidate->getBuiltInOp() == EOpCreateTensorViewNV) {\n\n            // Convert template parameters to arraySizes/typeParameters\n            TArraySizes *arraySizes = new TArraySizes;\n            for (uint32_t i = 0; i < 7; ++i) {\n                TIntermNode *param {};\n                if (arguments->getAsConstantUnion()) {\n                    if (i == 0) {\n                        param = arguments;\n                    }\n                } else {\n                    assert(arguments->getAsAggregate());\n                    auto &sequence = arguments->getAsAggregate()->getSequence();\n                    if (i < sequence.size()) {\n                        param = sequence[i];\n                    }\n                }\n                if (param) {\n                    if (param->getAsTyped()->getType().getQualifier().isSpecConstant()) {\n                        uint32_t value = param->getAsSymbolNode()->getConstArray()[0].getIConst();\n                        arraySizes->addInnerSize(value, param->getAsTyped());\n                    } else {\n                        uint32_t value = param->getAsConstantUnion()->getConstArray()[0].getIConst();\n                        arraySizes->addInnerSize(value);\n                    }\n                } else {\n                    uint32_t value = 0;\n                    if (i >= 2) {\n                        // default permutation values are an increasing sequence\n                        value = i - 2;\n                    }\n                    arraySizes->addInnerSize(value);\n                }\n            }\n            TTypeParameters typeParameters;\n            typeParameters.arraySizes = arraySizes;\n\n            TType resultType;\n            resultType.deepCopy(result->getAsTyped()->getType());\n\n            resultType.copyTypeParameters(typeParameters);\n            result->setType(resultType);\n        } else if (fnCandidate->getBuiltInOp() == EOpCooperativeMatrixReduceNV ||\n                   fnCandidate->getBuiltInOp() == EOpCooperativeMatrixPerElementOpNV ||\n                   fnCandidate->getBuiltInOp() == EOpCooperativeMatrixTransposeNV ||\n                   fnCandidate->getBuiltInOp() == EOpTensorLayoutSetDimensionNV ||\n                   fnCandidate->getBuiltInOp() == EOpTensorLayoutSetBlockSizeNV ||\n                   fnCandidate->getBuiltInOp() == EOpTensorLayoutSetStrideNV ||\n                   fnCandidate->getBuiltInOp() == EOpTensorLayoutSliceNV ||\n                   fnCandidate->getBuiltInOp() == EOpTensorLayoutSetClampValueNV ||\n                   fnCandidate->getBuiltInOp() == EOpTensorViewSetDimensionNV ||\n                   fnCandidate->getBuiltInOp() == EOpTensorViewSetStrideNV ||\n                   fnCandidate->getBuiltInOp() == EOpTensorViewSetClipNV) {\n            // Set result type to match type of first parameter\n            result->setType(result->getAsAggregate()->getSequence()[0]->getAsTyped()->getType());\n        } else {\n            // For MulAdd, set result type to match type of C parameter\n            result->setType(result->getAsAggregate()->getSequence()[2]->getAsTyped()->getType());\n        }\n    }\n}\n\nTIntermTyped* TParseContext::handleBuiltInFunctionCall(TSourceLoc loc, TIntermNode* arguments,\n                                                       const TFunction& function)\n{\n    checkLocation(loc, function.getBuiltInOp());\n    TIntermTyped *result = intermediate.addBuiltInFunctionCall(loc, function.getBuiltInOp(),\n                                                               function.getParamCount() == 1,\n                                                               arguments, function.getType());\n    if (result != nullptr && obeyPrecisionQualifiers())\n        computeBuiltinPrecisions(*result, function);\n\n    if (result == nullptr) {\n        if (arguments == nullptr)\n            error(loc, \" wrong operand type\", \"Internal Error\",\n                                      \"built in unary operator function.  Type: %s\", \"\");\n        else\n            error(arguments->getLoc(), \" wrong operand type\", \"Internal Error\",\n                                      \"built in unary operator function.  Type: %s\",\n                                      static_cast<TIntermTyped*>(arguments)->getCompleteString(intermediate.getEnhancedMsgs()).c_str());\n    } else if (result->getAsOperator())\n        builtInOpCheck(loc, function, *result->getAsOperator());\n\n    // Special handling for function call with SPIR-V instruction qualifier specified\n    if (function.getBuiltInOp() == EOpSpirvInst) {\n        if (auto agg = result->getAsAggregate()) {\n            // Propogate spirv_by_reference/spirv_literal from parameters to arguments\n            auto& sequence = agg->getSequence();\n            for (unsigned i = 0; i < sequence.size(); ++i) {\n                if (function[i].type->getQualifier().isSpirvByReference())\n                    sequence[i]->getAsTyped()->getQualifier().setSpirvByReference();\n                if (function[i].type->getQualifier().isSpirvLiteral())\n                    sequence[i]->getAsTyped()->getQualifier().setSpirvLiteral();\n            }\n\n            // Attach the function call to SPIR-V intruction\n            agg->setSpirvInstruction(function.getSpirvInstruction());\n        } else if (auto unaryNode = result->getAsUnaryNode()) {\n            // Propogate spirv_by_reference/spirv_literal from parameters to arguments\n            if (function[0].type->getQualifier().isSpirvByReference())\n                unaryNode->getOperand()->getQualifier().setSpirvByReference();\n            if (function[0].type->getQualifier().isSpirvLiteral())\n                unaryNode->getOperand()->getQualifier().setSpirvLiteral();\n\n            // Attach the function call to SPIR-V intruction\n            unaryNode->setSpirvInstruction(function.getSpirvInstruction());\n        } else\n            assert(0);\n    }\n\n    return result;\n}\n\n// \"The operation of a built-in function can have a different precision\n// qualification than the precision qualification of the resulting value.\n// These two precision qualifications are established as follows.\n//\n// The precision qualification of the operation of a built-in function is\n// based on the precision qualification of its input arguments and formal\n// parameters:  When a formal parameter specifies a precision qualifier,\n// that is used, otherwise, the precision qualification of the calling\n// argument is used.  The highest precision of these will be the precision\n// qualification of the operation of the built-in function. Generally,\n// this is applied across all arguments to a built-in function, with the\n// exceptions being:\n//   - bitfieldExtract and bitfieldInsert ignore the 'offset' and 'bits'\n//     arguments.\n//   - interpolateAt* functions only look at the 'interpolant' argument.\n//\n// The precision qualification of the result of a built-in function is\n// determined in one of the following ways:\n//\n//   - For the texture sampling, image load, and image store functions,\n//     the precision of the return type matches the precision of the\n//     sampler type\n//\n//   Otherwise:\n//\n//   - For prototypes that do not specify a resulting precision qualifier,\n//     the precision will be the same as the precision of the operation.\n//\n//   - For prototypes that do specify a resulting precision qualifier,\n//     the specified precision qualifier is the precision qualification of\n//     the result.\"\n//\nvoid TParseContext::computeBuiltinPrecisions(TIntermTyped& node, const TFunction& function)\n{\n    TPrecisionQualifier operationPrecision = EpqNone;\n    TPrecisionQualifier resultPrecision = EpqNone;\n\n    TIntermOperator* opNode = node.getAsOperator();\n    if (opNode == nullptr)\n        return;\n\n    if (TIntermUnary* unaryNode = node.getAsUnaryNode()) {\n        operationPrecision = std::max(function[0].type->getQualifier().precision,\n                                      unaryNode->getOperand()->getType().getQualifier().precision);\n        if (function.getType().getBasicType() != EbtBool)\n            resultPrecision = function.getType().getQualifier().precision == EpqNone ?\n                                        operationPrecision :\n                                        function.getType().getQualifier().precision;\n    } else if (TIntermAggregate* agg = node.getAsAggregate()) {\n        TIntermSequence& sequence = agg->getSequence();\n        unsigned int numArgs = (unsigned int)sequence.size();\n        switch (agg->getOp()) {\n        case EOpBitfieldExtract:\n            numArgs = 1;\n            break;\n        case EOpBitfieldInsert:\n            numArgs = 2;\n            break;\n        case EOpInterpolateAtCentroid:\n        case EOpInterpolateAtOffset:\n        case EOpInterpolateAtSample:\n            numArgs = 1;\n            break;\n        case EOpDebugPrintf:\n        case EOpCooperativeMatrixPerElementOpNV:\n        case EOpCooperativeMatrixReduceNV:\n        case EOpConstructSaturated:\n            numArgs = 0;\n            break;\n        default:\n            break;\n        }\n        // find the maximum precision from the arguments and parameters\n        for (unsigned int arg = 0; arg < numArgs; ++arg) {\n            operationPrecision = std::max(operationPrecision, sequence[arg]->getAsTyped()->getQualifier().precision);\n            operationPrecision = std::max(operationPrecision, function[arg].type->getQualifier().precision);\n        }\n        // compute the result precision\n        if (agg->isSampling() ||\n            agg->getOp() == EOpImageLoad || agg->getOp() == EOpImageStore ||\n            agg->getOp() == EOpImageLoadLod || agg->getOp() == EOpImageStoreLod)\n            resultPrecision = sequence[0]->getAsTyped()->getQualifier().precision;\n        else if (function.getType().getBasicType() != EbtBool)\n            resultPrecision = function.getType().getQualifier().precision == EpqNone ?\n                                        operationPrecision :\n                                        function.getType().getQualifier().precision;\n    }\n\n    // Propagate precision through this node and its children. That algorithm stops\n    // when a precision is found, so start by clearing this subroot precision\n    opNode->getQualifier().precision = EpqNone;\n    if (operationPrecision != EpqNone) {\n        opNode->propagatePrecision(operationPrecision);\n        opNode->setOperationPrecision(operationPrecision);\n    }\n    // Now, set the result precision, which might not match\n    opNode->getQualifier().precision = resultPrecision;\n}\n\nTIntermNode* TParseContext::handleReturnValue(const TSourceLoc& loc, TIntermTyped* value)\n{\n    storage16BitAssignmentCheck(loc, value->getType(), \"return\");\n\n    functionReturnsValue = true;\n    TIntermBranch* branch = nullptr;\n    if (currentFunctionType->getBasicType() == EbtVoid) {\n        error(loc, \"void function cannot return a value\", \"return\", \"\");\n        branch = intermediate.addBranch(EOpReturn, loc);\n    } else if (*currentFunctionType != value->getType()) {\n        TIntermTyped* converted = intermediate.addConversion(EOpReturn, *currentFunctionType, value);\n        if (converted) {\n            if (*currentFunctionType != converted->getType())\n                error(loc, \"cannot convert return value to function return type\", \"return\", \"\");\n            if (version < 420)\n                warn(loc, \"type conversion on return values was not explicitly allowed until version 420\",\n                     \"return\", \"\");\n            branch = intermediate.addBranch(EOpReturn, converted, loc);\n        } else {\n            error(loc, \"type does not match, or is not convertible to, the function's return type\", \"return\", \"\");\n            branch = intermediate.addBranch(EOpReturn, value, loc);\n        }\n    } else {\n        if (value->getType().isTexture() || value->getType().isImage()) {\n            if (spvVersion.spv != 0)\n                error(loc, \"sampler or image cannot be used as return type when generating SPIR-V\", \"return\", \"\");\n            else if (!extensionTurnedOn(E_GL_ARB_bindless_texture))\n                error(loc, \"sampler or image can be used as return type only when the extension GL_ARB_bindless_texture enabled\", \"return\", \"\");\n        }\n        branch = intermediate.addBranch(EOpReturn, value, loc);\n    }\n    branch->updatePrecision(currentFunctionType->getQualifier().precision);\n    return branch;\n}\n\n// See if the operation is being done in an illegal location.\nvoid TParseContext::checkLocation(const TSourceLoc& loc, TOperator op)\n{\n    switch (op) {\n    case EOpBarrier:\n        if (language == EShLangTessControl) {\n            if (controlFlowNestingLevel > 0)\n                error(loc, \"tessellation control barrier() cannot be placed within flow control\", \"\", \"\");\n            if (! inMain)\n                error(loc, \"tessellation control barrier() must be in main()\", \"\", \"\");\n            else if (postEntryPointReturn)\n                error(loc, \"tessellation control barrier() cannot be placed after a return from main()\", \"\", \"\");\n        }\n        break;\n    case EOpBeginInvocationInterlock:\n        if (language != EShLangFragment)\n            error(loc, \"beginInvocationInterlockARB() must be in a fragment shader\", \"\", \"\");\n        if (! inMain)\n            error(loc, \"beginInvocationInterlockARB() must be in main()\", \"\", \"\");\n        else if (postEntryPointReturn)\n            error(loc, \"beginInvocationInterlockARB() cannot be placed after a return from main()\", \"\", \"\");\n        if (controlFlowNestingLevel > 0)\n            error(loc, \"beginInvocationInterlockARB() cannot be placed within flow control\", \"\", \"\");\n\n        if (beginInvocationInterlockCount > 0)\n            error(loc, \"beginInvocationInterlockARB() must only be called once\", \"\", \"\");\n        if (endInvocationInterlockCount > 0)\n            error(loc, \"beginInvocationInterlockARB() must be called before endInvocationInterlockARB()\", \"\", \"\");\n\n        beginInvocationInterlockCount++;\n\n        // default to pixel_interlock_ordered\n        if (intermediate.getInterlockOrdering() == EioNone)\n            intermediate.setInterlockOrdering(EioPixelInterlockOrdered);\n        break;\n    case EOpEndInvocationInterlock:\n        if (language != EShLangFragment)\n            error(loc, \"endInvocationInterlockARB() must be in a fragment shader\", \"\", \"\");\n        if (! inMain)\n            error(loc, \"endInvocationInterlockARB() must be in main()\", \"\", \"\");\n        else if (postEntryPointReturn)\n            error(loc, \"endInvocationInterlockARB() cannot be placed after a return from main()\", \"\", \"\");\n        if (controlFlowNestingLevel > 0)\n            error(loc, \"endInvocationInterlockARB() cannot be placed within flow control\", \"\", \"\");\n\n        if (endInvocationInterlockCount > 0)\n            error(loc, \"endInvocationInterlockARB() must only be called once\", \"\", \"\");\n        if (beginInvocationInterlockCount == 0)\n            error(loc, \"beginInvocationInterlockARB() must be called before endInvocationInterlockARB()\", \"\", \"\");\n\n        endInvocationInterlockCount++;\n        break;\n    default:\n        break;\n    }\n}\n\n// Finish processing object.length(). This started earlier in handleDotDereference(), where\n// the \".length\" part was recognized and semantically checked, and finished here where the\n// function syntax \"()\" is recognized.\n//\n// Return resulting tree node.\nTIntermTyped* TParseContext::handleLengthMethod(const TSourceLoc& loc, TFunction* function, TIntermNode* intermNode)\n{\n    int length = 0;\n\n    if (function->getParamCount() > 0)\n        error(loc, \"method does not accept any arguments\", function->getName().c_str(), \"\");\n    else {\n        const TType& type = intermNode->getAsTyped()->getType();\n        if (type.isArray()) {\n            if (type.isUnsizedArray()) {\n                if (intermNode->getAsSymbolNode() && isIoResizeArray(type)) {\n                    // We could be between a layout declaration that gives a built-in io array implicit size and\n                    // a user redeclaration of that array, meaning we have to substitute its implicit size here\n                    // without actually redeclaring the array.  (It is an error to use a member before the\n                    // redeclaration, but not an error to use the array name itself.)\n                    const TString& name = intermNode->getAsSymbolNode()->getName();\n                    if (name == \"gl_in\" || name == \"gl_out\" || name == \"gl_MeshVerticesNV\" ||\n                        name == \"gl_MeshPrimitivesNV\") {\n                        length = getIoArrayImplicitSize(type.getQualifier());\n                    }\n                } else if (const auto typed = intermNode->getAsTyped()) {\n                    if (typed->getQualifier().builtIn == EbvSampleMask) {\n                        requireProfile(loc, EEsProfile, \"the array size of gl_SampleMask and gl_SampleMaskIn is ceil(gl_MaxSamples/32)\");\n                        length = (resources.maxSamples + 31) / 32;\n                    }\n                }\n                if (length == 0) {\n                    if (intermNode->getAsSymbolNode() && isIoResizeArray(type))\n                        error(loc, \"\", function->getName().c_str(), \"array must first be sized by a redeclaration or layout qualifier\");\n                    else if (isRuntimeLength(*intermNode->getAsTyped())) {\n                        // Create a unary op and let the back end handle it\n                        return intermediate.addBuiltInFunctionCall(loc, EOpArrayLength, true, intermNode, TType(EbtInt));\n                    } else\n                        error(loc, \"\", function->getName().c_str(), \"array must be declared with a size before using this method\");\n                }\n            } else if (type.getOuterArrayNode()) {\n                // If the array's outer size is specified by an intermediate node, it means the array's length\n                // was specified by a specialization constant. In such a case, we should return the node of the\n                // specialization constants to represent the length.\n                return type.getOuterArrayNode();\n            } else\n                length = type.getOuterArraySize();\n        } else if (type.isMatrix())\n            length = type.getMatrixCols();\n        else if (type.isVector())\n            length = type.getVectorSize();\n        else if (type.isCoopMat() || type.isCoopVecNV())\n            return intermediate.addBuiltInFunctionCall(loc, EOpArrayLength, true, intermNode, TType(EbtInt));\n        else {\n            // we should not get here, because earlier semantic checking should have prevented this path\n            error(loc, \".length()\", \"unexpected use of .length()\", \"\");\n        }\n    }\n\n    if (length == 0)\n        length = 1;\n\n    return intermediate.addConstantUnion(length, loc);\n}\n\n//\n// Add any needed implicit conversions for function-call arguments to input parameters.\n//\nvoid TParseContext::addInputArgumentConversions(const TFunction& function, TIntermNode*& arguments) const\n{\n    TIntermAggregate* aggregate = arguments->getAsAggregate();\n\n    // Process each argument's conversion\n    for (int i = 0; i < function.getParamCount(); ++i) {\n        // At this early point there is a slight ambiguity between whether an aggregate 'arguments'\n        // is the single argument itself or its children are the arguments.  Only one argument\n        // means take 'arguments' itself as the one argument.\n        TIntermTyped* arg = function.getParamCount() == 1 ? arguments->getAsTyped() : (aggregate ? aggregate->getSequence()[i]->getAsTyped() : arguments->getAsTyped());\n        if (*function[i].type != arg->getType()) {\n            if (function[i].type->getQualifier().isParamInput() &&\n               !function[i].type->isCoopMat()) {\n                // In-qualified arguments just need an extra node added above the argument to\n                // convert to the correct type.\n                arg = intermediate.addConversion(EOpFunctionCall, *function[i].type, arg);\n                if (arg) {\n                    if (function.getParamCount() == 1)\n                        arguments = arg;\n                    else {\n                        if (aggregate)\n                            aggregate->getSequence()[i] = arg;\n                        else\n                            arguments = arg;\n                    }\n                }\n            }\n        }\n    }\n}\n\n//\n// Add any needed implicit output conversions for function-call arguments.  This\n// can require a new tree topology, complicated further by whether the function\n// has a return value.\n//\n// Returns a node of a subtree that evaluates to the return value of the function.\n//\nTIntermTyped* TParseContext::addOutputArgumentConversions(const TFunction& function, TIntermAggregate& intermNode) const\n{\n    TIntermSequence& arguments = intermNode.getSequence();\n\n    // Will there be any output conversions?\n    bool outputConversions = false;\n    for (int i = 0; i < function.getParamCount(); ++i) {\n        if (*function[i].type != arguments[i]->getAsTyped()->getType() && function[i].type->getQualifier().isParamOutput() &&\n            !function[i].type->isCoopMat()) {\n            outputConversions = true;\n            break;\n        }\n    }\n\n    if (! outputConversions)\n        return &intermNode;\n\n    // Setup for the new tree, if needed:\n    //\n    // Output conversions need a different tree topology.\n    // Out-qualified arguments need a temporary of the correct type, with the call\n    // followed by an assignment of the temporary to the original argument:\n    //     void: function(arg, ...)  ->        (          function(tempArg, ...), arg = tempArg, ...)\n    //     ret = function(arg, ...)  ->  ret = (tempRet = function(tempArg, ...), arg = tempArg, ..., tempRet)\n    // Where the \"tempArg\" type needs no conversion as an argument, but will convert on assignment.\n    TIntermTyped* conversionTree = nullptr;\n    TVariable* tempRet = nullptr;\n    if (intermNode.getBasicType() != EbtVoid) {\n        // do the \"tempRet = function(...), \" bit from above\n        tempRet = makeInternalVariable(\"tempReturn\", intermNode.getType());\n        TIntermSymbol* tempRetNode = intermediate.addSymbol(*tempRet, intermNode.getLoc());\n        conversionTree = intermediate.addAssign(EOpAssign, tempRetNode, &intermNode, intermNode.getLoc());\n    } else\n        conversionTree = &intermNode;\n\n    conversionTree = intermediate.makeAggregate(conversionTree);\n\n    // Process each argument's conversion\n    for (int i = 0; i < function.getParamCount(); ++i) {\n        if (*function[i].type != arguments[i]->getAsTyped()->getType()) {\n            if (function[i].type->getQualifier().isParamOutput()) {\n                // Out-qualified arguments need to use the topology set up above.\n                // do the \" ...(tempArg, ...), arg = tempArg\" bit from above\n                TType paramType;\n                paramType.shallowCopy(*function[i].type);\n                if (arguments[i]->getAsTyped()->getType().isParameterized() &&\n                    !paramType.isParameterized()) {\n                    paramType.shallowCopy(arguments[i]->getAsTyped()->getType());\n                    paramType.copyTypeParameters(*arguments[i]->getAsTyped()->getType().getTypeParameters());\n                }\n                TVariable* tempArg = makeInternalVariable(\"tempArg\", paramType);\n                tempArg->getWritableType().getQualifier().makeTemporary();\n                TIntermSymbol* tempArgNode = intermediate.addSymbol(*tempArg, intermNode.getLoc());\n                TIntermTyped* tempAssign = intermediate.addAssign(EOpAssign, arguments[i]->getAsTyped(), tempArgNode, arguments[i]->getLoc());\n                conversionTree = intermediate.growAggregate(conversionTree, tempAssign, arguments[i]->getLoc());\n                // replace the argument with another node for the same tempArg variable\n                arguments[i] = intermediate.addSymbol(*tempArg, intermNode.getLoc());\n            }\n        }\n    }\n\n    // Finalize the tree topology (see bigger comment above).\n    if (tempRet) {\n        // do the \"..., tempRet\" bit from above\n        TIntermSymbol* tempRetNode = intermediate.addSymbol(*tempRet, intermNode.getLoc());\n        conversionTree = intermediate.growAggregate(conversionTree, tempRetNode, intermNode.getLoc());\n    }\n    conversionTree = intermediate.setAggregateOperator(conversionTree, EOpComma, intermNode.getType(), intermNode.getLoc());\n\n    return conversionTree;\n}\n\nTIntermTyped* TParseContext::addAssign(const TSourceLoc& loc, TOperator op, TIntermTyped* left, TIntermTyped* right)\n{\n    if ((op == EOpAddAssign || op == EOpSubAssign) && left->isReference())\n        requireExtensions(loc, 1, &E_GL_EXT_buffer_reference2, \"+= and -= on a buffer reference\");\n\n    if (op == EOpAssign && left->getBasicType() == EbtSampler && right->getBasicType() == EbtSampler)\n        requireExtensions(loc, 1, &E_GL_ARB_bindless_texture, \"sampler assignment for bindless texture\");\n\n    return intermediate.addAssign(op, left, right, loc);\n}\n\nvoid TParseContext::memorySemanticsCheck(const TSourceLoc& loc, const TFunction& fnCandidate, const TIntermOperator& callNode)\n{\n    const TIntermSequence* argp = &callNode.getAsAggregate()->getSequence();\n\n    //const int gl_SemanticsRelaxed         = 0x0;\n    const int gl_SemanticsAcquire         = 0x2;\n    const int gl_SemanticsRelease         = 0x4;\n    const int gl_SemanticsAcquireRelease  = 0x8;\n    const int gl_SemanticsMakeAvailable   = 0x2000;\n    const int gl_SemanticsMakeVisible     = 0x4000;\n    const int gl_SemanticsVolatile        = 0x8000;\n\n    //const int gl_StorageSemanticsNone     = 0x0;\n    const int gl_StorageSemanticsBuffer   = 0x40;\n    const int gl_StorageSemanticsShared   = 0x100;\n    const int gl_StorageSemanticsImage    = 0x800;\n    const int gl_StorageSemanticsOutput   = 0x1000;\n\n\n    unsigned int semantics = 0, storageClassSemantics = 0;\n    unsigned int semantics2 = 0, storageClassSemantics2 = 0;\n\n    const TIntermTyped* arg0 = (*argp)[0]->getAsTyped();\n    const bool isMS = arg0->getBasicType() == EbtSampler && arg0->getType().getSampler().isMultiSample();\n\n    // Grab the semantics and storage class semantics from the operands, based on opcode\n    switch (callNode.getOp()) {\n    case EOpAtomicAdd:\n    case EOpAtomicSubtract:\n    case EOpAtomicMin:\n    case EOpAtomicMax:\n    case EOpAtomicAnd:\n    case EOpAtomicOr:\n    case EOpAtomicXor:\n    case EOpAtomicExchange:\n    case EOpAtomicStore:\n        storageClassSemantics = (*argp)[3]->getAsConstantUnion()->getConstArray()[0].getIConst();\n        semantics = (*argp)[4]->getAsConstantUnion()->getConstArray()[0].getIConst();\n        break;\n    case EOpAtomicLoad:\n        storageClassSemantics = (*argp)[2]->getAsConstantUnion()->getConstArray()[0].getIConst();\n        semantics = (*argp)[3]->getAsConstantUnion()->getConstArray()[0].getIConst();\n        break;\n    case EOpAtomicCompSwap:\n        storageClassSemantics = (*argp)[4]->getAsConstantUnion()->getConstArray()[0].getIConst();\n        semantics = (*argp)[5]->getAsConstantUnion()->getConstArray()[0].getIConst();\n        storageClassSemantics2 = (*argp)[6]->getAsConstantUnion()->getConstArray()[0].getIConst();\n        semantics2 = (*argp)[7]->getAsConstantUnion()->getConstArray()[0].getIConst();\n        break;\n\n    case EOpImageAtomicAdd:\n    case EOpImageAtomicMin:\n    case EOpImageAtomicMax:\n    case EOpImageAtomicAnd:\n    case EOpImageAtomicOr:\n    case EOpImageAtomicXor:\n    case EOpImageAtomicExchange:\n    case EOpImageAtomicStore:\n        storageClassSemantics = (*argp)[isMS ? 5 : 4]->getAsConstantUnion()->getConstArray()[0].getIConst();\n        semantics = (*argp)[isMS ? 6 : 5]->getAsConstantUnion()->getConstArray()[0].getIConst();\n        break;\n    case EOpImageAtomicLoad:\n        storageClassSemantics = (*argp)[isMS ? 4 : 3]->getAsConstantUnion()->getConstArray()[0].getIConst();\n        semantics = (*argp)[isMS ? 5 : 4]->getAsConstantUnion()->getConstArray()[0].getIConst();\n        break;\n    case EOpImageAtomicCompSwap:\n        storageClassSemantics = (*argp)[isMS ? 6 : 5]->getAsConstantUnion()->getConstArray()[0].getIConst();\n        semantics = (*argp)[isMS ? 7 : 6]->getAsConstantUnion()->getConstArray()[0].getIConst();\n        storageClassSemantics2 = (*argp)[isMS ? 8 : 7]->getAsConstantUnion()->getConstArray()[0].getIConst();\n        semantics2 = (*argp)[isMS ? 9 : 8]->getAsConstantUnion()->getConstArray()[0].getIConst();\n        break;\n\n    case EOpBarrier:\n        storageClassSemantics = (*argp)[2]->getAsConstantUnion()->getConstArray()[0].getIConst();\n        semantics = (*argp)[3]->getAsConstantUnion()->getConstArray()[0].getIConst();\n        break;\n    case EOpMemoryBarrier:\n        storageClassSemantics = (*argp)[1]->getAsConstantUnion()->getConstArray()[0].getIConst();\n        semantics = (*argp)[2]->getAsConstantUnion()->getConstArray()[0].getIConst();\n        break;\n    default:\n        break;\n    }\n\n    if ((semantics & gl_SemanticsAcquire) &&\n        (callNode.getOp() == EOpAtomicStore || callNode.getOp() == EOpImageAtomicStore)) {\n        error(loc, \"gl_SemanticsAcquire must not be used with (image) atomic store\",\n              fnCandidate.getName().c_str(), \"\");\n    }\n    if ((semantics & gl_SemanticsRelease) &&\n        (callNode.getOp() == EOpAtomicLoad || callNode.getOp() == EOpImageAtomicLoad)) {\n        error(loc, \"gl_SemanticsRelease must not be used with (image) atomic load\",\n              fnCandidate.getName().c_str(), \"\");\n    }\n    if ((semantics & gl_SemanticsAcquireRelease) &&\n        (callNode.getOp() == EOpAtomicStore || callNode.getOp() == EOpImageAtomicStore ||\n         callNode.getOp() == EOpAtomicLoad  || callNode.getOp() == EOpImageAtomicLoad)) {\n        error(loc, \"gl_SemanticsAcquireRelease must not be used with (image) atomic load/store\",\n              fnCandidate.getName().c_str(), \"\");\n    }\n    if (((semantics | semantics2) & ~(gl_SemanticsAcquire |\n                                      gl_SemanticsRelease |\n                                      gl_SemanticsAcquireRelease |\n                                      gl_SemanticsMakeAvailable |\n                                      gl_SemanticsMakeVisible |\n                                      gl_SemanticsVolatile))) {\n        error(loc, \"Invalid semantics value\", fnCandidate.getName().c_str(), \"\");\n    }\n    if (((storageClassSemantics | storageClassSemantics2) & ~(gl_StorageSemanticsBuffer |\n                                                              gl_StorageSemanticsShared |\n                                                              gl_StorageSemanticsImage |\n                                                              gl_StorageSemanticsOutput))) {\n        error(loc, \"Invalid storage class semantics value\", fnCandidate.getName().c_str(), \"\");\n    }\n\n    if (callNode.getOp() == EOpMemoryBarrier) {\n        if (!IsPow2(semantics & (gl_SemanticsAcquire | gl_SemanticsRelease | gl_SemanticsAcquireRelease))) {\n            error(loc, \"Semantics must include exactly one of gl_SemanticsRelease, gl_SemanticsAcquire, or \"\n                       \"gl_SemanticsAcquireRelease\", fnCandidate.getName().c_str(), \"\");\n        }\n    } else {\n        if (semantics & (gl_SemanticsAcquire | gl_SemanticsRelease | gl_SemanticsAcquireRelease)) {\n            if (!IsPow2(semantics & (gl_SemanticsAcquire | gl_SemanticsRelease | gl_SemanticsAcquireRelease))) {\n                error(loc, \"Semantics must not include multiple of gl_SemanticsRelease, gl_SemanticsAcquire, or \"\n                           \"gl_SemanticsAcquireRelease\", fnCandidate.getName().c_str(), \"\");\n            }\n        }\n        if (semantics2 & (gl_SemanticsAcquire | gl_SemanticsRelease | gl_SemanticsAcquireRelease)) {\n            if (!IsPow2(semantics2 & (gl_SemanticsAcquire | gl_SemanticsRelease | gl_SemanticsAcquireRelease))) {\n                error(loc, \"semUnequal must not include multiple of gl_SemanticsRelease, gl_SemanticsAcquire, or \"\n                           \"gl_SemanticsAcquireRelease\", fnCandidate.getName().c_str(), \"\");\n            }\n        }\n    }\n    if (callNode.getOp() == EOpMemoryBarrier) {\n        if (storageClassSemantics == 0) {\n            error(loc, \"Storage class semantics must not be zero\", fnCandidate.getName().c_str(), \"\");\n        }\n    }\n    if (callNode.getOp() == EOpBarrier && semantics != 0 && storageClassSemantics == 0) {\n        error(loc, \"Storage class semantics must not be zero\", fnCandidate.getName().c_str(), \"\");\n    }\n    if ((callNode.getOp() == EOpAtomicCompSwap || callNode.getOp() == EOpImageAtomicCompSwap) &&\n        (semantics2 & (gl_SemanticsRelease | gl_SemanticsAcquireRelease))) {\n        error(loc, \"semUnequal must not be gl_SemanticsRelease or gl_SemanticsAcquireRelease\",\n              fnCandidate.getName().c_str(), \"\");\n    }\n    if ((semantics & gl_SemanticsMakeAvailable) &&\n        !(semantics & (gl_SemanticsRelease | gl_SemanticsAcquireRelease))) {\n        error(loc, \"gl_SemanticsMakeAvailable requires gl_SemanticsRelease or gl_SemanticsAcquireRelease\",\n              fnCandidate.getName().c_str(), \"\");\n    }\n    if ((semantics & gl_SemanticsMakeVisible) &&\n        !(semantics & (gl_SemanticsAcquire | gl_SemanticsAcquireRelease))) {\n        error(loc, \"gl_SemanticsMakeVisible requires gl_SemanticsAcquire or gl_SemanticsAcquireRelease\",\n              fnCandidate.getName().c_str(), \"\");\n    }\n    if ((semantics & gl_SemanticsVolatile) &&\n        (callNode.getOp() == EOpMemoryBarrier || callNode.getOp() == EOpBarrier)) {\n        error(loc, \"gl_SemanticsVolatile must not be used with memoryBarrier or controlBarrier\",\n              fnCandidate.getName().c_str(), \"\");\n    }\n    if ((callNode.getOp() == EOpAtomicCompSwap || callNode.getOp() == EOpImageAtomicCompSwap) &&\n        ((semantics ^ semantics2) & gl_SemanticsVolatile)) {\n        error(loc, \"semEqual and semUnequal must either both include gl_SemanticsVolatile or neither\",\n              fnCandidate.getName().c_str(), \"\");\n    }\n}\n\n//\n// Do additional checking of built-in function calls that is not caught\n// by normal semantic checks on argument type, extension tagging, etc.\n//\n// Assumes there has been a semantically correct match to a built-in function prototype.\n//\nvoid TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCandidate, TIntermOperator& callNode)\n{\n    // Set up convenience accessors to the argument(s).  There is almost always\n    // multiple arguments for the cases below, but when there might be one,\n    // check the unaryArg first.\n    const TIntermSequence* argp = nullptr;   // confusing to use [] syntax on a pointer, so this is to help get a reference\n    const TIntermTyped* unaryArg = nullptr;\n    const TIntermTyped* arg0 = nullptr;\n    if (callNode.getAsAggregate()) {\n        argp = &callNode.getAsAggregate()->getSequence();\n        if (argp->size() > 0)\n            arg0 = (*argp)[0]->getAsTyped();\n    } else {\n        assert(callNode.getAsUnaryNode());\n        unaryArg = callNode.getAsUnaryNode()->getOperand();\n        arg0 = unaryArg;\n    }\n\n    TString featureString;\n    const char* feature = nullptr;\n    switch (callNode.getOp()) {\n    case EOpTextureGather:\n    case EOpTextureGatherOffset:\n    case EOpTextureGatherOffsets:\n    {\n        // Figure out which variants are allowed by what extensions,\n        // and what arguments must be constant for which situations.\n\n        featureString = fnCandidate.getName();\n        featureString += \"(...)\";\n        feature = featureString.c_str();\n        profileRequires(loc, EEsProfile, 310, nullptr, feature);\n        int compArg = -1;  // track which argument, if any, is the constant component argument\n        const int numTexGatherExts = 3;\n        const char* texGatherExts[numTexGatherExts] = { E_GL_ARB_texture_gather,\n                                                        E_GL_ARB_gpu_shader5,\n                                                        E_GL_NV_gpu_shader5};\n        switch (callNode.getOp()) {\n        case EOpTextureGather:\n            // More than two arguments needs gpu_shader5, and rectangular or shadow needs gpu_shader5,\n            // otherwise, need GL_ARB_texture_gather.\n            if (fnCandidate.getParamCount() > 2 || fnCandidate[0].type->getSampler().dim == EsdRect || fnCandidate[0].type->getSampler().shadow) {\n                profileRequires(loc, ~EEsProfile, 400, Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5, feature);\n                if (! fnCandidate[0].type->getSampler().shadow)\n                    compArg = 2;\n            } else\n                profileRequires(loc, ~EEsProfile, 400, numTexGatherExts, texGatherExts, feature);\n            break;\n        case EOpTextureGatherOffset:\n            // GL_ARB_texture_gather is good enough for 2D non-shadow textures with no component argument\n            if (fnCandidate[0].type->getSampler().dim == Esd2D && ! fnCandidate[0].type->getSampler().shadow && fnCandidate.getParamCount() == 3)\n                profileRequires(loc, ~EEsProfile, 400, numTexGatherExts, texGatherExts, feature);\n            else\n                profileRequires(loc, ~EEsProfile, 400, Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5, feature);\n            if (! (*argp)[fnCandidate[0].type->getSampler().shadow ? 3 : 2]->getAsConstantUnion())\n                profileRequires(loc, EEsProfile, 320, Num_AEP_gpu_shader5, AEP_gpu_shader5,\n                                \"non-constant offset argument\");\n            if (! fnCandidate[0].type->getSampler().shadow)\n                compArg = 3;\n            break;\n        case EOpTextureGatherOffsets:\n            profileRequires(loc, ~EEsProfile, 400, Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5, feature);\n            if (! fnCandidate[0].type->getSampler().shadow)\n                compArg = 3;\n            // check for constant offsets\n            if (! (*argp)[fnCandidate[0].type->getSampler().shadow ? 3 : 2]->getAsConstantUnion() \n                // NV_gpu_shader5 relaxes this limitation and allows for non-constant offsets\n                && !extensionTurnedOn(E_GL_NV_gpu_shader5))\n                error(loc, \"must be a compile-time constant:\", feature, \"offsets argument\");\n            break;\n        default:\n            break;\n        }\n\n        if (compArg > 0 && compArg < fnCandidate.getParamCount()) {\n            if ((*argp)[compArg]->getAsConstantUnion()) {\n                int value = (*argp)[compArg]->getAsConstantUnion()->getConstArray()[0].getIConst();\n                if (value < 0 || value > 3)\n                    error(loc, \"must be 0, 1, 2, or 3:\", feature, \"component argument\");\n            } else\n                error(loc, \"must be a compile-time constant:\", feature, \"component argument\");\n        }\n\n        bool bias = false;\n        if (callNode.getOp() == EOpTextureGather)\n            bias = fnCandidate.getParamCount() > 3;\n        else if (callNode.getOp() == EOpTextureGatherOffset ||\n                 callNode.getOp() == EOpTextureGatherOffsets)\n            bias = fnCandidate.getParamCount() > 4;\n\n        if (bias) {\n            featureString = fnCandidate.getName();\n            featureString += \"with bias argument\";\n            feature = featureString.c_str();\n            profileRequires(loc, ~EEsProfile, 450, nullptr, feature);\n            requireExtensions(loc, 1, &E_GL_AMD_texture_gather_bias_lod, feature);\n        }\n        break;\n    }\n\n    case EOpTexture:\n    case EOpTextureLod:\n    {\n        if ((fnCandidate.getParamCount() > 2) && ((*argp)[1]->getAsTyped()->getType().getBasicType() == EbtFloat) &&\n            ((*argp)[1]->getAsTyped()->getType().getVectorSize() == 4) && fnCandidate[0].type->getSampler().shadow) {\n            featureString = fnCandidate.getName();\n            if (callNode.getOp() == EOpTexture)\n                featureString += \"(..., float bias)\";\n            else\n                featureString += \"(..., float lod)\";\n            feature = featureString.c_str();\n\n            if ((fnCandidate[0].type->getSampler().dim == Esd2D && fnCandidate[0].type->getSampler().arrayed) || //2D Array Shadow\n                (fnCandidate[0].type->getSampler().dim == EsdCube && fnCandidate[0].type->getSampler().arrayed && fnCandidate.getParamCount() > 3) || // Cube Array Shadow\n                (fnCandidate[0].type->getSampler().dim == EsdCube && callNode.getOp() == EOpTextureLod)) { // Cube Shadow\n                requireExtensions(loc, 1, &E_GL_EXT_texture_shadow_lod, feature);\n                if (isEsProfile()) {\n                    if (version < 320 &&\n                        !extensionsTurnedOn(Num_AEP_texture_cube_map_array, AEP_texture_cube_map_array))\n                        error(loc, \"GL_EXT_texture_shadow_lod not supported for this ES version\", feature, \"\");\n                    else\n                        profileRequires(loc, EEsProfile, 320, nullptr, feature);\n                } else { // Desktop\n                    profileRequires(loc, ~EEsProfile, 130, nullptr, feature);\n                }\n            }\n        }\n        break;\n    }\n\n    case EOpSparseTextureGather:\n    case EOpSparseTextureGatherOffset:\n    case EOpSparseTextureGatherOffsets:\n    {\n        bool bias = false;\n        if (callNode.getOp() == EOpSparseTextureGather)\n            bias = fnCandidate.getParamCount() > 4;\n        else if (callNode.getOp() == EOpSparseTextureGatherOffset ||\n                 callNode.getOp() == EOpSparseTextureGatherOffsets)\n            bias = fnCandidate.getParamCount() > 5;\n\n        if (bias) {\n            featureString = fnCandidate.getName();\n            featureString += \"with bias argument\";\n            feature = featureString.c_str();\n            profileRequires(loc, ~EEsProfile, 450, nullptr, feature);\n            requireExtensions(loc, 1, &E_GL_AMD_texture_gather_bias_lod, feature);\n        }\n        // As per GL_ARB_sparse_texture2 extension \"Offsets\" parameter must be constant integral expression\n        // for sparseTextureGatherOffsetsARB just as textureGatherOffsets\n        if (callNode.getOp() == EOpSparseTextureGatherOffsets) {\n            int offsetsArg = arg0->getType().getSampler().shadow ? 3 : 2;\n            if (!(*argp)[offsetsArg]->getAsConstantUnion())\n                error(loc, \"argument must be compile-time constant\", \"offsets\", \"\");\n        }\n        break;\n    }\n\n    case EOpSparseTextureGatherLod:\n    case EOpSparseTextureGatherLodOffset:\n    case EOpSparseTextureGatherLodOffsets:\n    {\n        requireExtensions(loc, 1, &E_GL_ARB_sparse_texture2, fnCandidate.getName().c_str());\n        break;\n    }\n\n    case EOpSwizzleInvocations:\n    {\n        if (! (*argp)[1]->getAsConstantUnion())\n            error(loc, \"argument must be compile-time constant\", \"offset\", \"\");\n        else {\n            unsigned offset[4] = {};\n            offset[0] = (*argp)[1]->getAsConstantUnion()->getConstArray()[0].getUConst();\n            offset[1] = (*argp)[1]->getAsConstantUnion()->getConstArray()[1].getUConst();\n            offset[2] = (*argp)[1]->getAsConstantUnion()->getConstArray()[2].getUConst();\n            offset[3] = (*argp)[1]->getAsConstantUnion()->getConstArray()[3].getUConst();\n            if (offset[0] > 3 || offset[1] > 3 || offset[2] > 3 || offset[3] > 3)\n                error(loc, \"components must be in the range [0, 3]\", \"offset\", \"\");\n        }\n\n        break;\n    }\n\n    case EOpSwizzleInvocationsMasked:\n    {\n        if (! (*argp)[1]->getAsConstantUnion())\n            error(loc, \"argument must be compile-time constant\", \"mask\", \"\");\n        else {\n            unsigned mask[3] = {};\n            mask[0] = (*argp)[1]->getAsConstantUnion()->getConstArray()[0].getUConst();\n            mask[1] = (*argp)[1]->getAsConstantUnion()->getConstArray()[1].getUConst();\n            mask[2] = (*argp)[1]->getAsConstantUnion()->getConstArray()[2].getUConst();\n            if (mask[0] > 31 || mask[1] > 31 || mask[2] > 31)\n                error(loc, \"components must be in the range [0, 31]\", \"mask\", \"\");\n        }\n\n        break;\n    }\n\n    case EOpTextureOffset:\n    case EOpTextureFetchOffset:\n    case EOpTextureProjOffset:\n    case EOpTextureLodOffset:\n    case EOpTextureProjLodOffset:\n    case EOpTextureGradOffset:\n    case EOpTextureProjGradOffset:\n    case EOpSparseTextureOffset:\n    case EOpSparseTextureFetchOffset:\n    case EOpSparseTextureLodOffset:\n    case EOpSparseTextureGradOffset:\n    {\n        // Handle texture-offset limits checking\n        // Pick which argument has to hold constant offsets\n        int arg = -1;\n        switch (callNode.getOp()) {\n        case EOpSparseTextureOffset:\n        case EOpTextureOffset:\n        case EOpTextureProjOffset:\n            arg = 2;\n            break;\n        case EOpSparseTextureLodOffset:\n        case EOpTextureLodOffset:\n        case EOpTextureProjLodOffset:\n            arg = 3;\n            break;\n        case EOpSparseTextureGradOffset:\n        case EOpTextureGradOffset:\n        case EOpTextureProjGradOffset:\n            arg = 4;\n            break;\n        case EOpSparseTextureFetchOffset:\n        case EOpTextureFetchOffset:\n            arg = (arg0->getType().getSampler().isRect()) ? 2 : 3;\n            break;\n        default:\n            assert(0);\n            break;\n        }\n\n        if (arg > 0) {\n\n            bool f16ShadowCompare = (*argp)[1]->getAsTyped()->getBasicType() == EbtFloat16 &&\n                                    arg0->getType().getSampler().shadow;\n            if (f16ShadowCompare)\n                ++arg;\n            // Allow non-constant offsets for certain texture ops\n            bool variableOffsetSupport = extensionTurnedOn(E_GL_NV_gpu_shader5) && \n                (callNode.getOp() == EOpTextureOffset || \n                 callNode.getOp() == EOpTextureFetchOffset ||\n                 callNode.getOp() == EOpTextureProjOffset || \n                 callNode.getOp() == EOpTextureLodOffset ||\n                 callNode.getOp() == EOpTextureProjLodOffset);\n            if (! (*argp)[arg]->getAsTyped()->getQualifier().isConstant()) {\n\t\t\t\tif (!extensionTurnedOn(E_GL_EXT_texture_offset_non_const) && !variableOffsetSupport)\n                    error(loc, \"argument must be compile-time constant\", \"texel offset\", \"\");\n            }\n            else if ((*argp)[arg]->getAsConstantUnion()) {\n                const TType& type = (*argp)[arg]->getAsTyped()->getType();\n                for (int c = 0; c < type.getVectorSize(); ++c) {\n                    int offset = (*argp)[arg]->getAsConstantUnion()->getConstArray()[c].getIConst();\n                    if (offset > resources.maxProgramTexelOffset || offset < resources.minProgramTexelOffset)\n                        error(loc, \"value is out of range:\", \"texel offset\",\n                              \"[gl_MinProgramTexelOffset, gl_MaxProgramTexelOffset]\");\n                }\n            }\n\n            // This check does not apply to sparse because\n            // GL_ARB_sparse_texture2 always includes this function.\n            if (callNode.getOp() == EOpTextureOffset) {\n                TSampler s = arg0->getType().getSampler();\n                if (s.is2D() && s.isArrayed() && s.isShadow()) {\n                    if (\n                        ((*argp)[1]->getAsTyped()->getType().getBasicType() == EbtFloat) &&\n                        ((*argp)[1]->getAsTyped()->getType().getVectorSize() == 4) &&\n                        (fnCandidate.getParamCount() == 4)) {\n                        featureString = fnCandidate.getName() + \" for sampler2DArrayShadow\";\n                        feature = featureString.c_str();\n                        requireExtensions(loc, 1, &E_GL_EXT_texture_shadow_lod, feature);\n                        profileRequires(loc, EEsProfile, 300, nullptr, feature);\n                        profileRequires(loc, ~EEsProfile, 130, nullptr, feature);\n                    }\n                    else if (isEsProfile())\n                        error(loc, \"TextureOffset does not support sampler2DArrayShadow : \", \"sampler\", \"ES Profile\");\n                    else if (version <= 420)\n                        error(loc, \"TextureOffset does not support sampler2DArrayShadow : \", \"sampler\", \"version <= 420\");\n                }\n            }\n\n            // This check does not apply to sparse because\n            // GL_ARB_sparse_texture2 does not define sparseTextureLodOffsetARB\n            // with a sampler2DArrayShadow.\n            if (callNode.getOp() == EOpTextureLodOffset) {\n                TSampler s = arg0->getType().getSampler();\n                if (s.is2D() && s.isArrayed() && s.isShadow() &&\n                    ((*argp)[1]->getAsTyped()->getType().getBasicType() == EbtFloat) &&\n                    ((*argp)[1]->getAsTyped()->getType().getVectorSize() == 4) &&\n                    (fnCandidate.getParamCount() == 4)) {\n                        featureString = fnCandidate.getName() + \" for sampler2DArrayShadow\";\n                        feature = featureString.c_str();\n                        profileRequires(loc, EEsProfile, 300, nullptr, feature);\n                        profileRequires(loc, ~EEsProfile, 130, nullptr, feature);\n                        requireExtensions(loc, 1, &E_GL_EXT_texture_shadow_lod, feature);\n                }\n            }\n        }\n\n        break;\n    }\n\n    case EOpTraceNV:\n        if (!(*argp)[10]->getAsConstantUnion())\n            error(loc, \"argument must be compile-time constant\", \"payload number\", \"a\");\n        break;\n    case EOpTraceRayMotionNV:\n        if (!(*argp)[11]->getAsConstantUnion())\n            error(loc, \"argument must be compile-time constant\", \"payload number\", \"a\");\n        break;\n    case EOpTraceKHR:\n        if (!(*argp)[10]->getAsConstantUnion())\n            error(loc, \"argument must be compile-time constant\", \"payload number\", \"a\");\n        else {\n            unsigned int location = (*argp)[10]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst();\n            if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(0, location) < 0)\n                error(loc, \"with layout(location =\", \"no rayPayloadEXT/rayPayloadInEXT declared\", \"%d)\", location);\n        }\n        break;\n    case EOpExecuteCallableNV:\n        if (!(*argp)[1]->getAsConstantUnion())\n            error(loc, \"argument must be compile-time constant\", \"callable data number\", \"\");\n        break;\n    case EOpExecuteCallableKHR:\n        if (!(*argp)[1]->getAsConstantUnion())\n            error(loc, \"argument must be compile-time constant\", \"callable data number\", \"\");\n        else {\n            unsigned int location = (*argp)[1]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst();\n            if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(1, location) < 0)\n                error(loc, \"with layout(location =\", \"no callableDataEXT/callableDataInEXT declared\", \"%d)\", location);\n        }\n        break;\n\n    case EOpHitObjectTraceRayNV:\n        if (!(*argp)[11]->getAsConstantUnion())\n            error(loc, \"argument must be compile-time constant\", \"payload number\", \"\");\n        else {\n            unsigned int location = (*argp)[11]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst();\n            if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(0, location) < 0)\n                error(loc, \"with layout(location =\", \"no rayPayloadEXT/rayPayloadInEXT declared\", \"%d)\", location);\n        }\n        break;\n    case EOpHitObjectTraceRayMotionNV:\n        if (!(*argp)[12]->getAsConstantUnion())\n            error(loc, \"argument must be compile-time constant\", \"payload number\", \"\");\n        else {\n            unsigned int location = (*argp)[12]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst();\n            if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(0, location) < 0)\n                error(loc, \"with layout(location =\", \"no rayPayloadEXT/rayPayloadInEXT declared\", \"%d)\", location);\n        }\n        break;\n    case EOpHitObjectExecuteShaderNV:\n        if (!(*argp)[1]->getAsConstantUnion())\n            error(loc, \"argument must be compile-time constant\", \"payload number\", \"\");\n        else {\n            unsigned int location = (*argp)[1]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst();\n            if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(0, location) < 0)\n                error(loc, \"with layout(location =\", \"no rayPayloadEXT/rayPayloadInEXT declared\", \"%d)\", location);\n        }\n        break;\n    case EOpHitObjectRecordHitNV:\n        if (!(*argp)[12]->getAsConstantUnion())\n            error(loc, \"argument must be compile-time constant\", \"hitobjectattribute number\", \"\");\n        else {\n            unsigned int location = (*argp)[12]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst();\n            if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(2, location) < 0)\n                error(loc, \"with layout(location =\", \"no hitObjectAttributeNV declared\", \"%d)\", location);\n        }\n        break;\n    case EOpHitObjectRecordHitMotionNV:\n        if (!(*argp)[13]->getAsConstantUnion())\n            error(loc, \"argument must be compile-time constant\", \"hitobjectattribute number\", \"\");\n        else {\n            unsigned int location = (*argp)[13]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst();\n            if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(2, location) < 0)\n                error(loc, \"with layout(location =\", \"no hitObjectAttributeNV declared\", \"%d)\", location);\n        }\n        break;\n    case EOpHitObjectRecordHitWithIndexNV:\n        if (!(*argp)[11]->getAsConstantUnion())\n            error(loc, \"argument must be compile-time constant\", \"hitobjectattribute number\", \"\");\n        else {\n            unsigned int location = (*argp)[11]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst();\n            if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(2, location) < 0)\n                error(loc, \"with layout(location =\", \"no hitObjectAttributeNV declared\", \"%d)\", location);\n        }\n        break;\n    case EOpHitObjectRecordHitWithIndexMotionNV:\n        if (!(*argp)[12]->getAsConstantUnion())\n            error(loc, \"argument must be compile-time constant\", \"hitobjectattribute number\", \"\");\n        else {\n            unsigned int location = (*argp)[12]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst();\n            if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(2, location) < 0)\n                error(loc, \"with layout(location =\", \"no hitObjectAttributeNV declared\", \"%d)\", location);\n        }\n        break;\n    case EOpHitObjectGetAttributesNV:\n        if (!(*argp)[1]->getAsConstantUnion())\n            error(loc, \"argument must be compile-time constant\", \"hitobjectattribute number\", \"\");\n        else {\n            unsigned int location = (*argp)[1]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst();\n            if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(2, location) < 0)\n                error(loc, \"with layout(location =\", \"no hitObjectAttributeNV declared\", \"%d)\", location);\n        }\n        break;\n\n    case EOpRayQueryGetIntersectionType:\n    case EOpRayQueryGetIntersectionT:\n    case EOpRayQueryGetIntersectionInstanceCustomIndex:\n    case EOpRayQueryGetIntersectionInstanceId:\n    case EOpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffset:\n    case EOpRayQueryGetIntersectionGeometryIndex:\n    case EOpRayQueryGetIntersectionPrimitiveIndex:\n    case EOpRayQueryGetIntersectionBarycentrics:\n    case EOpRayQueryGetIntersectionFrontFace:\n    case EOpRayQueryGetIntersectionObjectRayDirection:\n    case EOpRayQueryGetIntersectionObjectRayOrigin:\n    case EOpRayQueryGetIntersectionObjectToWorld:\n    case EOpRayQueryGetIntersectionWorldToObject:\n    case EOpRayQueryGetIntersectionTriangleVertexPositionsEXT:\n    case EOpRayQueryGetIntersectionClusterIdNV:\n    case EOpRayQueryGetIntersectionSpherePositionNV:\n    case EOpRayQueryGetIntersectionSphereRadiusNV:\n    case EOpRayQueryGetIntersectionLSSHitValueNV:\n    case EOpRayQueryGetIntersectionLSSPositionsNV:\n    case EOpRayQueryGetIntersectionLSSRadiiNV:\n        if (!(*argp)[1]->getAsConstantUnion())\n            error(loc, \"argument must be compile-time constant\", \"committed\", \"\");\n        break;\n\n    case EOpTextureQuerySamples:\n    case EOpImageQuerySamples:\n        // GL_ARB_shader_texture_image_samples\n        profileRequires(loc, ~EEsProfile, 450, E_GL_ARB_shader_texture_image_samples, \"textureSamples and imageSamples\");\n        break;\n\n    case EOpImageAtomicAdd:\n    case EOpImageAtomicMin:\n    case EOpImageAtomicMax:\n    case EOpImageAtomicAnd:\n    case EOpImageAtomicOr:\n    case EOpImageAtomicXor:\n    case EOpImageAtomicExchange:\n    case EOpImageAtomicCompSwap:\n    case EOpImageAtomicLoad:\n    case EOpImageAtomicStore:\n    {\n        // Make sure the image types have the correct layout() format and correct argument types\n        const TType& imageType = arg0->getType();\n        if (imageType.getSampler().type == EbtInt || imageType.getSampler().type == EbtUint ||\n            imageType.getSampler().type == EbtInt64 || imageType.getSampler().type == EbtUint64) {\n            if (imageType.getQualifier().getFormat() != ElfR32i && imageType.getQualifier().getFormat() != ElfR32ui &&\n                imageType.getQualifier().getFormat() != ElfR64i && imageType.getQualifier().getFormat() != ElfR64ui)\n                error(loc, \"only supported on image with format r32i or r32ui\", fnCandidate.getName().c_str(), \"\");\n            if (callNode.getType().getBasicType() == EbtInt64 && imageType.getQualifier().getFormat() != ElfR64i)\n                error(loc, \"only supported on image with format r64i\", fnCandidate.getName().c_str(), \"\");\n            else if (callNode.getType().getBasicType() == EbtUint64 && imageType.getQualifier().getFormat() != ElfR64ui)\n                error(loc, \"only supported on image with format r64ui\", fnCandidate.getName().c_str(), \"\");\n        } else if(callNode.getType().getBasicType() == EbtFloat16 &&\n                ((callNode.getType().getVectorSize() == 2 && arg0->getType().getQualifier().getFormat() == ElfRg16f) ||\n                  (callNode.getType().getVectorSize() == 4 && arg0->getType().getQualifier().getFormat() == ElfRgba16f))) {\n            if (StartsWith(fnCandidate.getName(), \"imageAtomicAdd\") ||\n                StartsWith(fnCandidate.getName(), \"imageAtomicExchange\") ||\n                StartsWith(fnCandidate.getName(), \"imageAtomicMin\") ||\n                StartsWith(fnCandidate.getName(), \"imageAtomicMax\")) {\n                requireExtensions(loc, 1, &E_GL_NV_shader_atomic_fp16_vector, fnCandidate.getName().c_str());\n            } else {\n                error(loc, \"f16vec2/4 operation not supported on: \", fnCandidate.getName().c_str(), \"\");\n            }\n        } else if (imageType.getSampler().type == EbtFloat) {\n            if (StartsWith(fnCandidate.getName(), \"imageAtomicExchange\")) {\n                // imageAtomicExchange doesn't require an extension\n            } else if (StartsWith(fnCandidate.getName(), \"imageAtomicAdd\") ||\n                       StartsWith(fnCandidate.getName(), \"imageAtomicLoad\") ||\n                       StartsWith(fnCandidate.getName(), \"imageAtomicStore\")) {\n                requireExtensions(loc, 1, &E_GL_EXT_shader_atomic_float, fnCandidate.getName().c_str());\n            } else if (StartsWith(fnCandidate.getName(), \"imageAtomicMin\") ||\n                       StartsWith(fnCandidate.getName(), \"imageAtomicMax\")) {\n                requireExtensions(loc, 1, &E_GL_EXT_shader_atomic_float2, fnCandidate.getName().c_str());\n            } else {\n                error(loc, \"only supported on integer images\", fnCandidate.getName().c_str(), \"\");\n            }\n            if (imageType.getQualifier().getFormat() != ElfR32f && isEsProfile())\n                error(loc, \"only supported on image with format r32f\", fnCandidate.getName().c_str(), \"\");\n        } else {\n            error(loc, \"not supported on this image type\", fnCandidate.getName().c_str(), \"\");\n        }\n\n        const size_t maxArgs = imageType.getSampler().isMultiSample() ? 5 : 4;\n        if (argp->size() > maxArgs) {\n            requireExtensions(loc, 1, &E_GL_KHR_memory_scope_semantics, fnCandidate.getName().c_str());\n            memorySemanticsCheck(loc, fnCandidate, callNode);\n        }\n\n        break;\n    }\n\n    case EOpAtomicAdd:\n    case EOpAtomicSubtract:\n    case EOpAtomicMin:\n    case EOpAtomicMax:\n    case EOpAtomicAnd:\n    case EOpAtomicOr:\n    case EOpAtomicXor:\n    case EOpAtomicExchange:\n    case EOpAtomicCompSwap:\n    case EOpAtomicLoad:\n    case EOpAtomicStore:\n    {\n        if (argp->size() > 3) {\n            requireExtensions(loc, 1, &E_GL_KHR_memory_scope_semantics, fnCandidate.getName().c_str());\n            memorySemanticsCheck(loc, fnCandidate, callNode);\n            if ((callNode.getOp() == EOpAtomicAdd || callNode.getOp() == EOpAtomicExchange ||\n                callNode.getOp() == EOpAtomicLoad || callNode.getOp() == EOpAtomicStore) &&\n                (arg0->getType().getBasicType() == EbtFloat ||\n                 arg0->getType().getBasicType() == EbtDouble)) {\n                requireExtensions(loc, 1, &E_GL_EXT_shader_atomic_float, fnCandidate.getName().c_str());\n            } else if ((callNode.getOp() == EOpAtomicAdd || callNode.getOp() == EOpAtomicExchange ||\n                        callNode.getOp() == EOpAtomicLoad || callNode.getOp() == EOpAtomicStore ||\n                        callNode.getOp() == EOpAtomicMin || callNode.getOp() == EOpAtomicMax) &&\n                       arg0->getType().isFloatingDomain()) {\n                requireExtensions(loc, 1, &E_GL_EXT_shader_atomic_float2, fnCandidate.getName().c_str());\n            }\n        } else if (arg0->getType().getBasicType() == EbtInt64 || arg0->getType().getBasicType() == EbtUint64) {\n            const char* const extensions[2] = { E_GL_NV_shader_atomic_int64,\n                                                E_GL_EXT_shader_atomic_int64 };\n            requireExtensions(loc, 2, extensions, fnCandidate.getName().c_str());\n        } else if ((callNode.getOp() == EOpAtomicAdd || callNode.getOp() == EOpAtomicExchange ||\n                    callNode.getOp() == EOpAtomicMin || callNode.getOp() == EOpAtomicMax) &&\n                   arg0->getType().getBasicType() == EbtFloat16 &&\n                   (arg0->getType().getVectorSize() == 2 || arg0->getType().getVectorSize() == 4 )) {\n            requireExtensions(loc, 1, &E_GL_NV_shader_atomic_fp16_vector, fnCandidate.getName().c_str());\n        } else if ((callNode.getOp() == EOpAtomicAdd || callNode.getOp() == EOpAtomicExchange) &&\n                   (arg0->getType().getBasicType() == EbtFloat ||\n                    arg0->getType().getBasicType() == EbtDouble)) {\n            requireExtensions(loc, 1, &E_GL_EXT_shader_atomic_float, fnCandidate.getName().c_str());\n        } else if ((callNode.getOp() == EOpAtomicAdd || callNode.getOp() == EOpAtomicExchange ||\n                    callNode.getOp() == EOpAtomicLoad || callNode.getOp() == EOpAtomicStore ||\n                    callNode.getOp() == EOpAtomicMin || callNode.getOp() == EOpAtomicMax) &&\n                   arg0->getType().isFloatingDomain()) {\n            requireExtensions(loc, 1, &E_GL_EXT_shader_atomic_float2, fnCandidate.getName().c_str());\n        }\n\n        const TIntermTyped* base = TIntermediate::traverseLValueBase(arg0, true, true);\n        const char* errMsg = \"Only l-values corresponding to shader block storage or shared variables can be used with \"\n                             \"atomic memory functions.\";\n        if (base) {\n            const TType* refType = (base->getType().isReference()) ? base->getType().getReferentType() : nullptr;\n            const TQualifier& qualifier =\n                (refType != nullptr) ? refType->getQualifier() : base->getType().getQualifier();\n            if (qualifier.storage != EvqShared && qualifier.storage != EvqBuffer &&\n                qualifier.storage != EvqtaskPayloadSharedEXT)\n                error(loc, errMsg, fnCandidate.getName().c_str(), \"\");\n        } else {\n            error(loc, errMsg, fnCandidate.getName().c_str(), \"\");\n        }\n\n        break;\n    }\n\n    case EOpInterpolateAtCentroid:\n    case EOpInterpolateAtSample:\n    case EOpInterpolateAtOffset:\n    case EOpInterpolateAtVertex: {\n        if (arg0->getType().getQualifier().storage != EvqVaryingIn) {\n            // Traverse down the left branch of arg0 to ensure this argument is a valid interpolant.\n            //\n            // For desktop GL >4.3 we effectively only need to ensure that arg0 represents an l-value from an\n            // input declaration.\n            //\n            // For desktop GL <= 4.3 and ES, we must also ensure that swizzling is not used\n            //\n            // For ES, we must also ensure that a field selection operator (i.e., '.') is not used on a named\n            // struct.\n\n            const bool esProfile = isEsProfile();\n            const bool swizzleOkay = !esProfile && (version >= 440);\n\n            std::string interpolantErrorMsg = \"first argument must be an interpolant, or interpolant-array element\";\n            bool isValid = true; // Assume that the interpolant is valid until we find a condition making it invalid\n            bool isIn = false;   // Checks whether or not the interpolant is a shader input\n            bool structAccessOp = false; // Whether or not the previous node in the chain is a struct accessor\n            TIntermediate::traverseLValueBase(\n                arg0, swizzleOkay, false,\n                [&isValid, &isIn, &interpolantErrorMsg, esProfile, &structAccessOp](const TIntermNode& n) -> bool {\n                    auto* type = n.getAsTyped();\n                    if (type) {\n                        if (type->getType().getQualifier().storage == EvqVaryingIn) {\n                            isIn = true;\n                        }\n                        // If a field accessor was used, it can only be used to access a field with an input block, not a struct.\n                        if (structAccessOp && (type->getType().getBasicType() != EbtBlock)) {\n                            interpolantErrorMsg +=\n                                \". Using the field of a named struct as an interpolant argument is not \"\n                                \"allowed (ES-only).\";\n                            isValid = false;\n                        }\n                    }\n\n                    // ES has different requirements for interpolants than GL\n                    if (esProfile) {\n                        // Swizzling will be taken care of by the 'swizzleOkay' argument passsed to traverseLValueBase,\n                        // so we only ned to check whether or not a field accessor has been used with a named struct.\n                        auto* binary = n.getAsBinaryNode();\n                        if (binary && (binary->getOp() == EOpIndexDirectStruct)) {\n                            structAccessOp = true;\n                        }\n                    }\n                    // Don't continue traversing if we know we have an invalid interpolant at this point.\n                    return isValid;\n                });\n            if (!isIn || !isValid) {\n                error(loc, interpolantErrorMsg.c_str(), fnCandidate.getName().c_str(), \"\");\n            }\n        }\n\n        if (callNode.getOp() == EOpInterpolateAtVertex) {\n            if (!arg0->getType().getQualifier().isExplicitInterpolation())\n                error(loc, \"argument must be qualified as __explicitInterpAMD in\", \"interpolant\", \"\");\n            else {\n                if (! (*argp)[1]->getAsConstantUnion())\n                    error(loc, \"argument must be compile-time constant\", \"vertex index\", \"\");\n                else {\n                    unsigned vertexIdx = (*argp)[1]->getAsConstantUnion()->getConstArray()[0].getUConst();\n                    if (vertexIdx > 2)\n                        error(loc, \"must be in the range [0, 2]\", \"vertex index\", \"\");\n                }\n            }\n        }\n    } break;\n\n    case EOpEmitStreamVertex:\n    case EOpEndStreamPrimitive:\n        if (version == 150)\n            requireExtensions(loc, Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5, \"if the verison is 150 , the EmitStreamVertex and EndStreamPrimitive only support at extension GL_ARB_gpu_shader5/GL_NV_gpu_shader5\");\n        intermediate.setMultiStream();\n        break;\n\n    case EOpSubgroupClusteredAdd:\n    case EOpSubgroupClusteredMul:\n    case EOpSubgroupClusteredMin:\n    case EOpSubgroupClusteredMax:\n    case EOpSubgroupClusteredAnd:\n    case EOpSubgroupClusteredOr:\n    case EOpSubgroupClusteredXor:\n        // The <clusterSize> as used in the subgroupClustered<op>() operations must be:\n        // - An integral constant expression.\n        // - At least 1.\n        // - A power of 2.\n        if ((*argp)[1]->getAsConstantUnion() == nullptr)\n            error(loc, \"argument must be compile-time constant\", \"cluster size\", \"\");\n        else {\n            int size = (*argp)[1]->getAsConstantUnion()->getConstArray()[0].getIConst();\n            if (size < 1)\n                error(loc, \"argument must be at least 1\", \"cluster size\", \"\");\n            else if (!IsPow2(size))\n                error(loc, \"argument must be a power of 2\", \"cluster size\", \"\");\n        }\n        break;\n\n    case EOpSubgroupBroadcast:\n    case EOpSubgroupQuadBroadcast:\n        if (spvVersion.spv < EShTargetSpv_1_5) {\n            // <id> must be an integral constant expression.\n            if ((*argp)[1]->getAsConstantUnion() == nullptr)\n                error(loc, \"argument must be compile-time constant\", \"id\", \"\");\n        }\n        break;\n\n    case EOpBarrier:\n    case EOpMemoryBarrier:\n        if (argp->size() > 0) {\n            requireExtensions(loc, 1, &E_GL_KHR_memory_scope_semantics, fnCandidate.getName().c_str());\n            memorySemanticsCheck(loc, fnCandidate, callNode);\n        }\n        break;\n\n    case EOpMix:\n        if (profile == EEsProfile && version < 310) {\n            // Look for specific signatures\n            if ((*argp)[0]->getAsTyped()->getBasicType() != EbtFloat &&\n                (*argp)[1]->getAsTyped()->getBasicType() != EbtFloat &&\n                (*argp)[2]->getAsTyped()->getBasicType() == EbtBool) {\n                requireExtensions(loc, 1, &E_GL_EXT_shader_integer_mix, \"specific signature of builtin mix\");\n            }\n        }\n\n        if (profile != EEsProfile && version < 450) {\n            if ((*argp)[0]->getAsTyped()->getBasicType() != EbtFloat &&\n                (*argp)[0]->getAsTyped()->getBasicType() != EbtDouble &&\n                (*argp)[1]->getAsTyped()->getBasicType() != EbtFloat &&\n                (*argp)[1]->getAsTyped()->getBasicType() != EbtDouble &&\n                (*argp)[2]->getAsTyped()->getBasicType() == EbtBool) {\n                requireExtensions(loc, 1, &E_GL_EXT_shader_integer_mix, fnCandidate.getName().c_str());\n            }\n        }\n\n        break;\n    case EOpLessThan:\n    case EOpLessThanEqual:\n    case EOpGreaterThan:\n    case EOpGreaterThanEqual:\n    case EOpEqual:\n    case EOpNotEqual:\n        if (profile != EEsProfile && version >= 150 && version < 450) {\n            if ((*argp)[1]->getAsTyped()->getBasicType() == EbtInt64 ||                 \n                (*argp)[1]->getAsTyped()->getBasicType() == EbtUint64)\n                requireExtensions(loc, 1, &E_GL_NV_gpu_shader5, fnCandidate.getName().c_str());\n        }\n    break;\n    case EOpFma:\n    case EOpFrexp:\n    case EOpLdexp:\n        if (profile != EEsProfile && version < 400) {\n            if ((*argp)[0]->getAsTyped()->getBasicType() == EbtFloat) {\n                requireExtensions(loc, Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5, fnCandidate.getName().c_str());\n            }\n        }\n\n        break;\n    case EOpCooperativeVectorMatMulNV:\n    case EOpCooperativeVectorMatMulAddNV:\n        {\n            int inputInterpIdx = 2;\n            int matrixInterpIdx = 5;\n            int biasInterpIdx = 8;\n            int MIdx = callNode.getOp() == EOpCooperativeVectorMatMulAddNV ? 9 : 6;\n            int KIdx = callNode.getOp() == EOpCooperativeVectorMatMulAddNV ? 10 : 7;\n            int matrixLayoutIdx = callNode.getOp() == EOpCooperativeVectorMatMulAddNV ? 11 : 8;\n            int transposeIdx = callNode.getOp() == EOpCooperativeVectorMatMulAddNV ? 12 : 9;\n\n            if (!(*argp)[inputInterpIdx]->getAsTyped()->getType().getQualifier().isConstant())\n                error(loc, \"argument must be compile-time constant\", \"inputInterpretation\", \"\");\n            if (!(*argp)[matrixInterpIdx]->getAsTyped()->getType().getQualifier().isConstant())\n                error(loc, \"argument must be compile-time constant\", \"matrixInterpretation\", \"\");\n            if (callNode.getOp() == EOpCooperativeVectorMatMulAddNV) {\n                if (!(*argp)[biasInterpIdx]->getAsTyped()->getType().getQualifier().isConstant())\n                    error(loc, \"argument must be compile-time constant\", \"biasInterpretation\", \"\");\n            }\n            if (!(*argp)[MIdx]->getAsTyped()->getType().getQualifier().isConstant())\n                error(loc, \"argument must be compile-time constant\", \"M\", \"\");\n            if (!(*argp)[KIdx]->getAsTyped()->getType().getQualifier().isConstant())\n                error(loc, \"argument must be compile-time constant\", \"K\", \"\");\n            if (!(*argp)[matrixLayoutIdx]->getAsTyped()->getType().getQualifier().isConstant())\n                error(loc, \"argument must be compile-time constant\", \"matrixLayout\", \"\");\n            if (!(*argp)[transposeIdx]->getAsTyped()->getType().getQualifier().isConstant())\n                error(loc, \"argument must be compile-time constant\", \"transpose\", \"\");\n        }\n        break;\n    case EOpCooperativeVectorOuterProductAccumulateNV:\n        if (!(*argp)[5]->getAsTyped()->getType().getQualifier().isConstant())\n            error(loc, \"argument must be compile-time constant\", \"matrixLayout\", \"\");\n        if (!(*argp)[6]->getAsTyped()->getType().getQualifier().isConstant())\n            error(loc, \"argument must be compile-time constant\", \"matrixInterpretation\", \"\");\n        break;\n    default:\n        break;\n    }\n\n    // Texture operations on texture objects (aside from texelFetch on a\n    // textureBuffer) require EXT_samplerless_texture_functions.\n    switch (callNode.getOp()) {\n    case EOpTextureQuerySize:\n    case EOpTextureQueryLevels:\n    case EOpTextureQuerySamples:\n    case EOpTextureFetch:\n    case EOpTextureFetchOffset:\n    {\n        const TSampler& sampler = fnCandidate[0].type->getSampler();\n\n        const bool isTexture = sampler.isTexture() && !sampler.isCombined();\n        const bool isBuffer = sampler.isBuffer();\n        const bool isFetch = callNode.getOp() == EOpTextureFetch || callNode.getOp() == EOpTextureFetchOffset;\n\n        if (isTexture && (!isBuffer || !isFetch))\n            requireExtensions(loc, 1, &E_GL_EXT_samplerless_texture_functions, fnCandidate.getName().c_str());\n\n        break;\n    }\n\n    case EOpConstructSaturated:\n    {\n        auto &sequence = callNode.getAsAggregate()->getSequence();\n        if (sequence.size() != 2) {\n            error(loc, \"requires exactly two parameters\", \"\", \"\");\n        }\n        auto &op0Type = sequence[0]->getAsTyped()->getType();\n        auto &op1Type = sequence[1]->getAsTyped()->getType();\n        if (op0Type.getBasicType() != EbtFloatE5M2 && op0Type.getBasicType() != EbtFloatE4M3) {\n            error(loc, \"first parameter must have floate5m2 or floate4m3 basic type\", \"\", \"\");\n        }\n        if (op1Type.getBasicType() == EbtFloatE5M2 || op1Type.getBasicType() == EbtFloatE4M3) {\n            error(loc, \"second parameter must not have floate5m2 or floate4m3 basic type\", \"\", \"\");\n        }\n\n        if (!(op0Type.isScalar() || op0Type.isVector() || op0Type.isCoopMatKHR())) {\n            error(loc, \"first parameter must be scalar, vector, or cooperative matrix\", \"\", \"\");\n        }\n        if (!(op1Type.isScalar() || op1Type.isVector() || op1Type.isCoopMatKHR())) {\n            error(loc, \"second parameter must be scalar, vector, or cooperative matrix\", \"\", \"\");\n        }\n        if (!(op0Type.sameElementShape(op1Type) || op0Type.sameCoopMatShape(op1Type))) {\n            error(loc, \"types must match other than scalar type and coopmat Use\", \"\", \"\");\n        }\n        break;\n    }\n    default:\n        break;\n    }\n\n    if (callNode.isSubgroup()) {\n        // these require SPIR-V 1.3\n        if (spvVersion.spv > 0 && spvVersion.spv < EShTargetSpv_1_3)\n            error(loc, \"requires SPIR-V 1.3\", \"subgroup op\", \"\");\n\n        // Check that if extended types are being used that the correct extensions are enabled.\n        if (arg0 != nullptr) {\n            const TType& type = arg0->getType();\n            bool enhanced = intermediate.getEnhancedMsgs();\n            switch (type.getBasicType()) {\n            default:\n                break;\n            case EbtInt8:\n            case EbtUint8:\n                requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_int8, type.getCompleteString(enhanced).c_str());\n                break;\n            case EbtInt16:\n            case EbtUint16:\n                requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_int16, type.getCompleteString(enhanced).c_str());\n                break;\n            case EbtInt64:\n            case EbtUint64:\n                requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_int64, type.getCompleteString(enhanced).c_str());\n                break;\n            case EbtFloat16:\n                requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_float16, type.getCompleteString(enhanced).c_str());\n                break;\n            }\n        }\n    }\n}\n\n\n// Deprecated!  Use PureOperatorBuiltins == true instead, in which case this\n// functionality is handled in builtInOpCheck() instead of here.\n//\n// Do additional checking of built-in function calls that were not mapped\n// to built-in operations (e.g., texturing functions).\n//\n// Assumes there has been a semantically correct match to a built-in function.\n//\nvoid TParseContext::nonOpBuiltInCheck(const TSourceLoc& loc, const TFunction& fnCandidate, TIntermAggregate& callNode)\n{\n    // Further maintenance of this function is deprecated, because the \"correct\"\n    // future-oriented design is to not have to do string compares on function names.\n\n    // If PureOperatorBuiltins == true, then all built-ins should be mapped\n    // to a TOperator, and this function would then never get called.\n\n    assert(PureOperatorBuiltins == false);\n\n    // built-in texturing functions get their return value precision from the precision of the sampler\n    if (fnCandidate.getType().getQualifier().precision == EpqNone &&\n        fnCandidate.getParamCount() > 0 && fnCandidate[0].type->getBasicType() == EbtSampler)\n        callNode.getQualifier().precision = callNode.getSequence()[0]->getAsTyped()->getQualifier().precision;\n\n    if (fnCandidate.getName().compare(0, 7, \"texture\") == 0) {\n        if (fnCandidate.getName().compare(0, 13, \"textureGather\") == 0) {\n            TString featureString = fnCandidate.getName() + \"(...)\";\n            const char* feature = featureString.c_str();\n            profileRequires(loc, EEsProfile, 310, nullptr, feature);\n\n            int compArg = -1;  // track which argument, if any, is the constant component argument\n            if (fnCandidate.getName().compare(\"textureGatherOffset\") == 0) {\n                // GL_ARB_texture_gather is good enough for 2D non-shadow textures with no component argument\n                if (fnCandidate[0].type->getSampler().dim == Esd2D && ! fnCandidate[0].type->getSampler().shadow && fnCandidate.getParamCount() == 3)\n                    profileRequires(loc, ~EEsProfile, 400, E_GL_ARB_texture_gather, feature);\n                else\n                    profileRequires(loc, ~EEsProfile, 400, E_GL_ARB_gpu_shader5, feature);\n                int offsetArg = fnCandidate[0].type->getSampler().shadow ? 3 : 2;\n                if (! callNode.getSequence()[offsetArg]->getAsConstantUnion())\n                    profileRequires(loc, EEsProfile, 320, Num_AEP_gpu_shader5, AEP_gpu_shader5,\n                                    \"non-constant offset argument\");\n                if (! fnCandidate[0].type->getSampler().shadow)\n                    compArg = 3;\n            } else if (fnCandidate.getName().compare(\"textureGatherOffsets\") == 0) {\n                profileRequires(loc, ~EEsProfile, 400, E_GL_ARB_gpu_shader5, feature);\n                if (! fnCandidate[0].type->getSampler().shadow)\n                    compArg = 3;\n                // check for constant offsets\n                int offsetArg = fnCandidate[0].type->getSampler().shadow ? 3 : 2;\n                if (! callNode.getSequence()[offsetArg]->getAsConstantUnion() && !extensionTurnedOn(E_GL_NV_gpu_shader5))\n                    error(loc, \"must be a compile-time constant:\", feature, \"offsets argument\");\n            } else if (fnCandidate.getName().compare(\"textureGather\") == 0) {\n                // More than two arguments needs gpu_shader5, and rectangular or shadow needs gpu_shader5,\n                // otherwise, need GL_ARB_texture_gather.\n                if (fnCandidate.getParamCount() > 2 || fnCandidate[0].type->getSampler().dim == EsdRect || fnCandidate[0].type->getSampler().shadow) {\n                    profileRequires(loc, ~EEsProfile, 400, E_GL_ARB_gpu_shader5, feature);\n                    if (! fnCandidate[0].type->getSampler().shadow)\n                        compArg = 2;\n                } else\n                    profileRequires(loc, ~EEsProfile, 400, E_GL_ARB_texture_gather, feature);\n            }\n\n            if (compArg > 0 && compArg < fnCandidate.getParamCount()) {\n                if (callNode.getSequence()[compArg]->getAsConstantUnion()) {\n                    int value = callNode.getSequence()[compArg]->getAsConstantUnion()->getConstArray()[0].getIConst();\n                    if (value < 0 || value > 3)\n                        error(loc, \"must be 0, 1, 2, or 3:\", feature, \"component argument\");\n                } else\n                    error(loc, \"must be a compile-time constant:\", feature, \"component argument\");\n            }\n        } else {\n            // this is only for functions not starting \"textureGather\"...\n            if (fnCandidate.getName().find(\"Offset\") != TString::npos) {\n\n                // Handle texture-offset limits checking\n                int arg = -1;\n                if (fnCandidate.getName().compare(\"textureOffset\") == 0)\n                    arg = 2;\n                else if (fnCandidate.getName().compare(\"texelFetchOffset\") == 0)\n                    arg = 3;\n                else if (fnCandidate.getName().compare(\"textureProjOffset\") == 0)\n                    arg = 2;\n                else if (fnCandidate.getName().compare(\"textureLodOffset\") == 0)\n                    arg = 3;\n                else if (fnCandidate.getName().compare(\"textureProjLodOffset\") == 0)\n                    arg = 3;\n                else if (fnCandidate.getName().compare(\"textureGradOffset\") == 0)\n                    arg = 4;\n                else if (fnCandidate.getName().compare(\"textureProjGradOffset\") == 0)\n                    arg = 4;\n\n                if (arg > 0) {\n                    if (! callNode.getSequence()[arg]->getAsConstantUnion()) {\n                        if (!extensionTurnedOn(E_GL_EXT_texture_offset_non_const))\n                            error(loc, \"argument must be compile-time constant\", \"texel offset\", \"\");\n                    }\n                    else {\n                        const TType& type = callNode.getSequence()[arg]->getAsTyped()->getType();\n                        for (int c = 0; c < type.getVectorSize(); ++c) {\n                            int offset = callNode.getSequence()[arg]->getAsConstantUnion()->getConstArray()[c].getIConst();\n                            if (offset > resources.maxProgramTexelOffset || offset < resources.minProgramTexelOffset)\n                                error(loc, \"value is out of range:\", \"texel offset\", \"[gl_MinProgramTexelOffset, gl_MaxProgramTexelOffset]\");\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    // GL_ARB_shader_texture_image_samples\n    if (fnCandidate.getName().compare(0, 14, \"textureSamples\") == 0 || fnCandidate.getName().compare(0, 12, \"imageSamples\") == 0)\n        profileRequires(loc, ~EEsProfile, 450, E_GL_ARB_shader_texture_image_samples, \"textureSamples and imageSamples\");\n\n    if (fnCandidate.getName().compare(0, 11, \"imageAtomic\") == 0) {\n        const TType& imageType = callNode.getSequence()[0]->getAsTyped()->getType();\n        if (imageType.getSampler().type == EbtInt || imageType.getSampler().type == EbtUint) {\n            if (imageType.getQualifier().getFormat() != ElfR32i && imageType.getQualifier().getFormat() != ElfR32ui)\n                error(loc, \"only supported on image with format r32i or r32ui\", fnCandidate.getName().c_str(), \"\");\n        } else {\n            if (fnCandidate.getName().compare(0, 19, \"imageAtomicExchange\") != 0)\n                error(loc, \"only supported on integer images\", fnCandidate.getName().c_str(), \"\");\n            else if (imageType.getQualifier().getFormat() != ElfR32f && isEsProfile())\n                error(loc, \"only supported on image with format r32f\", fnCandidate.getName().c_str(), \"\");\n        }\n    }\n}\n\n//\n// Do any extra checking for a user function call.\n//\nvoid TParseContext::userFunctionCallCheck(const TSourceLoc& loc, TIntermAggregate& callNode)\n{\n    TIntermSequence& arguments = callNode.getSequence();\n\n    for (int i = 0; i < (int)arguments.size(); ++i)\n        samplerConstructorLocationCheck(loc, \"call argument\", arguments[i]);\n}\n\n//\n// Emit an error if this is a sampler constructor\n//\nvoid TParseContext::samplerConstructorLocationCheck(const TSourceLoc& loc, const char* token, TIntermNode* node)\n{\n    if (node->getAsOperator() && node->getAsOperator()->getOp() == EOpConstructTextureSampler)\n        error(loc, \"sampler constructor must appear at point of use\", token, \"\");\n}\n\n//\n// Handle seeing a built-in constructor in a grammar production.\n//\nTFunction* TParseContext::handleConstructorCall(const TSourceLoc& loc, const TPublicType& publicType)\n{\n    TType type(publicType);\n    type.getQualifier().precision = EpqNone;\n\n    if (type.isArray()) {\n        profileRequires(loc, ENoProfile, 120, E_GL_3DL_array_objects, \"arrayed constructor\");\n        profileRequires(loc, EEsProfile, 300, nullptr, \"arrayed constructor\");\n    }\n\n    // Reuse EOpConstructTextureSampler for bindless image constructor\n    // uvec2 imgHandle;\n    // imageLoad(image1D(imgHandle), 0);\n    if (type.isImage() && extensionTurnedOn(E_GL_ARB_bindless_texture))\n    {\n        intermediate.setBindlessImageMode(currentCaller, AstRefTypeFunc);\n    }\n\n    TOperator op = intermediate.mapTypeToConstructorOp(type);\n\n    if (op == EOpNull) {\n      if (intermediate.getEnhancedMsgs() && type.getBasicType() == EbtSampler)\n            error(loc, \"function not supported in this version; use texture() instead\", \"texture*D*\", \"\");\n        else\n            error(loc, \"cannot construct this type\", type.getBasicString(), \"\");\n        op = EOpConstructFloat;\n        TType errorType(EbtFloat);\n        type.shallowCopy(errorType);\n    }\n\n    TString empty(\"\");\n\n    return new TFunction(&empty, type, op);\n}\n\n// Handle seeing a precision qualifier in the grammar.\nvoid TParseContext::handlePrecisionQualifier(const TSourceLoc& /*loc*/, TQualifier& qualifier, TPrecisionQualifier precision)\n{\n    if (obeyPrecisionQualifiers())\n        qualifier.precision = precision;\n}\n\n// Check for messages to give on seeing a precision qualifier used in a\n// declaration in the grammar.\nvoid TParseContext::checkPrecisionQualifier(const TSourceLoc& loc, TPrecisionQualifier)\n{\n    if (precisionManager.shouldWarnAboutDefaults()) {\n        warn(loc, \"all default precisions are highp; use precision statements to quiet warning, e.g.:\\n\"\n                  \"         \\\"precision mediump int; precision highp float;\\\"\", \"\", \"\");\n        precisionManager.defaultWarningGiven();\n    }\n}\n\n//\n// Same error message for all places assignments don't work.\n//\nvoid TParseContext::assignError(const TSourceLoc& loc, const char* op, TString left, TString right)\n{\n    error(loc, \"\", op, \"cannot convert from '%s' to '%s'\",\n          right.c_str(), left.c_str());\n}\n\n//\n// Same error message for all places unary operations don't work.\n//\nvoid TParseContext::unaryOpError(const TSourceLoc& loc, const char* op, TString operand)\n{\n   error(loc, \" wrong operand type\", op,\n          \"no operation '%s' exists that takes an operand of type %s (or there is no acceptable conversion)\",\n          op, operand.c_str());\n}\n\n//\n// Same error message for all binary operations don't work.\n//\nvoid TParseContext::binaryOpError(const TSourceLoc& loc, const char* op, TString left, TString right)\n{\n    error(loc, \" wrong operand types:\", op,\n            \"no operation '%s' exists that takes a left-hand operand of type '%s' and \"\n            \"a right operand of type '%s' (or there is no acceptable conversion)\",\n            op, left.c_str(), right.c_str());\n}\n\n//\n// A basic type of EbtVoid is a key that the name string was seen in the source, but\n// it was not found as a variable in the symbol table.  If so, give the error\n// message and insert a dummy variable in the symbol table to prevent future errors.\n//\nvoid TParseContext::variableCheck(TIntermTyped*& nodePtr)\n{\n    TIntermSymbol* symbol = nodePtr->getAsSymbolNode();\n    if (! symbol)\n        return;\n\n    if (symbol->getType().getBasicType() == EbtVoid) {\n        const char *extraInfoFormat = \"\";\n        if (spvVersion.vulkan != 0 && symbol->getName() == \"gl_VertexID\") {\n          extraInfoFormat = \"(Did you mean gl_VertexIndex?)\";\n        } else if (spvVersion.vulkan != 0 && symbol->getName() == \"gl_InstanceID\") {\n          extraInfoFormat = \"(Did you mean gl_InstanceIndex?)\";\n        }\n        error(symbol->getLoc(), \"undeclared identifier\", symbol->getName().c_str(), extraInfoFormat);\n\n        // Add to symbol table to prevent future error messages on the same name\n        if (symbol->getName().size() > 0) {\n            TVariable* fakeVariable = new TVariable(&symbol->getName(), TType(EbtFloat));\n            symbolTable.insert(*fakeVariable);\n\n            // substitute a symbol node for this new variable\n            nodePtr = intermediate.addSymbol(*fakeVariable, symbol->getLoc());\n        }\n    } else {\n        switch (symbol->getQualifier().storage) {\n        case EvqPointCoord:\n            profileRequires(symbol->getLoc(), ENoProfile, 120, nullptr, \"gl_PointCoord\");\n            break;\n        default: break; // some compilers want this\n        }\n    }\n}\n\n//\n// Both test and if necessary, spit out an error, to see if the node is really\n// an l-value that can be operated on this way.\n//\n// Returns true if there was an error.\n//\nbool TParseContext::lValueErrorCheck(const TSourceLoc& loc, const char* op, TIntermTyped* node)\n{\n    TIntermBinary* binaryNode = node->getAsBinaryNode();\n\n    if (binaryNode) {\n        bool errorReturn = false;\n\n        switch(binaryNode->getOp()) {\n        case EOpIndexDirect:\n        case EOpIndexIndirect:\n            // ...  tessellation control shader ...\n            // If a per-vertex output variable is used as an l-value, it is a\n            // compile-time or link-time error if the expression indicating the\n            // vertex index is not the identifier gl_InvocationID.\n            if (language == EShLangTessControl) {\n                const TType& leftType = binaryNode->getLeft()->getType();\n                if (leftType.getQualifier().storage == EvqVaryingOut && ! leftType.getQualifier().patch && binaryNode->getLeft()->getAsSymbolNode()) {\n                    // we have a per-vertex output\n                    const TIntermSymbol* rightSymbol = binaryNode->getRight()->getAsSymbolNode();\n                    if (! rightSymbol || rightSymbol->getQualifier().builtIn != EbvInvocationId)\n                        error(loc, \"tessellation-control per-vertex output l-value must be indexed with gl_InvocationID\", \"[]\", \"\");\n                }\n            }\n            break; // left node is checked by base class\n        case EOpVectorSwizzle:\n            errorReturn = lValueErrorCheck(loc, op, binaryNode->getLeft());\n            if (!errorReturn) {\n                int offset[4] = {0,0,0,0};\n\n                TIntermTyped* rightNode = binaryNode->getRight();\n                TIntermAggregate *aggrNode = rightNode->getAsAggregate();\n\n                for (TIntermSequence::iterator p = aggrNode->getSequence().begin();\n                                               p != aggrNode->getSequence().end(); p++) {\n                    int value = (*p)->getAsTyped()->getAsConstantUnion()->getConstArray()[0].getIConst();\n                    offset[value]++;\n                    if (offset[value] > 1) {\n                        error(loc, \" l-value of swizzle cannot have duplicate components\", op, \"\", \"\");\n\n                        return true;\n                    }\n                }\n            }\n\n            return errorReturn;\n        default:\n            break;\n        }\n\n        if (errorReturn) {\n            error(loc, \" l-value required\", op, \"\", \"\");\n            return true;\n        }\n    }\n\n    if (binaryNode && binaryNode->getOp() == EOpIndexDirectStruct && binaryNode->getLeft()->isReference())\n        return false;\n\n    // Let the base class check errors\n    if (TParseContextBase::lValueErrorCheck(loc, op, node))\n        return true;\n\n    const char* symbol = nullptr;\n    TIntermSymbol* symNode = node->getAsSymbolNode();\n    if (symNode != nullptr)\n        symbol = symNode->getName().c_str();\n\n    const char* message = nullptr;\n    switch (node->getQualifier().storage) {\n    case EvqVaryingIn:      message = \"can't modify shader input\";   break;\n    case EvqInstanceId:     message = \"can't modify gl_InstanceID\";  break;\n    case EvqVertexId:       message = \"can't modify gl_VertexID\";    break;\n    case EvqFace:           message = \"can't modify gl_FrontFace\";   break;\n    case EvqFragCoord:      message = \"can't modify gl_FragCoord\";   break;\n    case EvqPointCoord:     message = \"can't modify gl_PointCoord\";  break;\n    case EvqFragDepth:\n        intermediate.setDepthReplacing();\n        // \"In addition, it is an error to statically write to gl_FragDepth in the fragment shader.\"\n        if (isEsProfile() && intermediate.getEarlyFragmentTests())\n            message = \"can't modify gl_FragDepth if using early_fragment_tests\";\n        break;\n    case EvqFragStencil:\n        intermediate.setStencilReplacing();\n        // \"In addition, it is an error to statically write to gl_FragDepth in the fragment shader.\"\n        if (isEsProfile() && intermediate.getEarlyFragmentTests())\n            message = \"can't modify EvqFragStencil if using early_fragment_tests\";\n        break;\n\n    case EvqtaskPayloadSharedEXT:\n        if (language == EShLangMesh)\n            message = \"can't modify variable with storage qualifier taskPayloadSharedEXT in mesh shaders\";\n        break;\n    default:\n        break;\n    }\n\n    if (message == nullptr && binaryNode == nullptr && symNode == nullptr) {\n        error(loc, \" l-value required\", op, \"\", \"\");\n\n        return true;\n    }\n\n    //\n    // Everything else is okay, no error.\n    //\n    if (message == nullptr)\n        return false;\n\n    //\n    // If we get here, we have an error and a message.\n    //\n    if (symNode)\n        error(loc, \" l-value required\", op, \"\\\"%s\\\" (%s)\", symbol, message);\n    else\n        error(loc, \" l-value required\", op, \"(%s)\", message);\n\n    return true;\n}\n\n// Test for and give an error if the node can't be read from.\nvoid TParseContext::rValueErrorCheck(const TSourceLoc& loc, const char* op, TIntermTyped* node)\n{\n    // Let the base class check errors\n    TParseContextBase::rValueErrorCheck(loc, op, node);\n\n    TIntermSymbol* symNode = node->getAsSymbolNode();\n    if (!(symNode && symNode->getQualifier().isWriteOnly())) // base class checks\n        if (symNode && symNode->getQualifier().isExplicitInterpolation())\n            error(loc, \"can't read from explicitly-interpolated object: \", op, symNode->getName().c_str());\n\n    // local_size_{xyz} must be assigned or specialized before gl_WorkGroupSize can be assigned.\n    if(node->getQualifier().builtIn == EbvWorkGroupSize &&\n       !(intermediate.isLocalSizeSet() || intermediate.isLocalSizeSpecialized()))\n        error(loc, \"can't read from gl_WorkGroupSize before a fixed workgroup size has been declared\", op, \"\");\n}\n\n//\n// Both test, and if necessary spit out an error, to see if the node is really\n// a constant.\n//\nvoid TParseContext::constantValueCheck(TIntermTyped* node, const char* token)\n{\n    if (! node->getQualifier().isConstant())\n        error(node->getLoc(), \"constant expression required\", token, \"\");\n}\n\n//\n// Both test, and if necessary spit out an error, to see if the node is really\n// a 32-bit integer or can implicitly convert to one.\n//\nvoid TParseContext::integerCheck(const TIntermTyped* node, const char* token)\n{\n    auto from_type = node->getBasicType();\n    if ((from_type == EbtInt || from_type == EbtUint ||\n         intermediate.canImplicitlyPromote(from_type, EbtInt, EOpNull) ||\n         intermediate.canImplicitlyPromote(from_type, EbtUint, EOpNull)) && node->isScalar())\n        return;\n\n    error(node->getLoc(), \"scalar integer expression required\", token, \"\");\n}\n\n//\n// Both test, and if necessary spit out an error, to see if we are currently\n// globally scoped.\n//\nvoid TParseContext::globalCheck(const TSourceLoc& loc, const char* token)\n{\n    if (! symbolTable.atGlobalLevel())\n        error(loc, \"not allowed in nested scope\", token, \"\");\n}\n\n//\n// Reserved errors for GLSL.\n//\nvoid TParseContext::reservedErrorCheck(const TSourceLoc& loc, const TString& identifier)\n{\n    // \"Identifiers starting with \"gl_\" are reserved for use by OpenGL, and may not be\n    // declared in a shader; this results in a compile-time error.\"\n    if (! symbolTable.atBuiltInLevel()) {\n        if (builtInName(identifier) && !extensionTurnedOn(E_GL_EXT_spirv_intrinsics))\n            // The extension GL_EXT_spirv_intrinsics allows us to declare identifiers starting with \"gl_\".\n            error(loc, \"identifiers starting with \\\"gl_\\\" are reserved\", identifier.c_str(), \"\");\n\n        // \"__\" are not supposed to be an error.  ES 300 (and desktop) added the clarification:\n        // \"In addition, all identifiers containing two consecutive underscores (__) are\n        // reserved; using such a name does not itself result in an error, but may result\n        // in undefined behavior.\"\n        // however, before that, ES tests required an error.\n        if (identifier.find(\"__\") != TString::npos && !extensionTurnedOn(E_GL_EXT_spirv_intrinsics)) {\n            // The extension GL_EXT_spirv_intrinsics allows us to declare identifiers starting with \"__\".\n            if (isEsProfile() && version < 300)\n                error(loc, \"identifiers containing consecutive underscores (\\\"__\\\") are reserved, and an error if version < 300\", identifier.c_str(), \"\");\n            else\n                warn(loc, \"identifiers containing consecutive underscores (\\\"__\\\") are reserved\", identifier.c_str(), \"\");\n        }\n    }\n}\n\n//\n// Reserved errors for the preprocessor.\n//\nvoid TParseContext::reservedPpErrorCheck(const TSourceLoc& loc, const char* identifier, const char* op)\n{\n    // \"__\" are not supposed to be an error.  ES 300 (and desktop) added the clarification:\n    // \"All macro names containing two consecutive underscores ( __ ) are reserved;\n    // defining such a name does not itself result in an error, but may result in\n    // undefined behavior.  All macro names prefixed with \"GL_\" (\"GL\" followed by a\n    // single underscore) are also reserved, and defining such a name results in a\n    // compile-time error.\"\n    // however, before that, ES tests required an error.\n    if (strncmp(identifier, \"GL_\", 3) == 0 && !extensionTurnedOn(E_GL_EXT_spirv_intrinsics))\n        // The extension GL_EXT_spirv_intrinsics allows us to declare macros prefixed with \"GL_\".\n        ppError(loc, \"names beginning with \\\"GL_\\\" can't be (un)defined:\", op,  identifier);\n    else if (strncmp(identifier, \"defined\", 8) == 0)\n        if (relaxedErrors())\n            ppWarn(loc, \"\\\"defined\\\" is (un)defined:\", op,  identifier);\n        else\n            ppError(loc, \"\\\"defined\\\" can't be (un)defined:\", op,  identifier);\n    else if (strstr(identifier, \"__\") != nullptr && !extensionTurnedOn(E_GL_EXT_spirv_intrinsics)) {\n        // The extension GL_EXT_spirv_intrinsics allows us to declare macros prefixed with \"__\".\n        if (isEsProfile() && version >= 300 &&\n            (strcmp(identifier, \"__LINE__\") == 0 ||\n             strcmp(identifier, \"__FILE__\") == 0 ||\n             strcmp(identifier, \"__VERSION__\") == 0))\n            ppError(loc, \"predefined names can't be (un)defined:\", op,  identifier);\n        else {\n            if (isEsProfile() && version < 300 && !relaxedErrors())\n                ppError(loc, \"names containing consecutive underscores are reserved, and an error if version < 300:\", op, identifier);\n            else\n                ppWarn(loc, \"names containing consecutive underscores are reserved:\", op, identifier);\n        }\n    }\n}\n\n//\n// See if this version/profile allows use of the line-continuation character '\\'.\n//\n// Returns true if a line continuation should be done.\n//\nbool TParseContext::lineContinuationCheck(const TSourceLoc& loc, bool endOfComment)\n{\n    const char* message = \"line continuation\";\n\n    bool lineContinuationAllowed = (isEsProfile() && version >= 300) ||\n                                   (!isEsProfile() && (version >= 420 || extensionTurnedOn(E_GL_ARB_shading_language_420pack)));\n\n    if (endOfComment) {\n        if (lineContinuationAllowed)\n            warn(loc, \"used at end of comment; the following line is still part of the comment\", message, \"\");\n        else\n            warn(loc, \"used at end of comment, but this version does not provide line continuation\", message, \"\");\n\n        return lineContinuationAllowed;\n    }\n\n    if (relaxedErrors()) {\n        if (! lineContinuationAllowed)\n            warn(loc, \"not allowed in this version\", message, \"\");\n        return true;\n    } else {\n        profileRequires(loc, EEsProfile, 300, nullptr, message);\n        profileRequires(loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, message);\n    }\n\n    return lineContinuationAllowed;\n}\n\nbool TParseContext::builtInName(const TString& identifier)\n{\n    return identifier.compare(0, 3, \"gl_\") == 0;\n}\n\n//\n// Make sure there is enough data and not too many arguments provided to the\n// constructor to build something of the type of the constructor.  Also returns\n// the type of the constructor.\n//\n// Part of establishing type is establishing specialization-constness.\n// We don't yet know \"top down\" whether type is a specialization constant,\n// but a const constructor can becomes a specialization constant if any of\n// its children are, subject to KHR_vulkan_glsl rules:\n//\n//     - int(), uint(), and bool() constructors for type conversions\n//       from any of the following types to any of the following types:\n//         * int\n//         * uint\n//         * bool\n//     - vector versions of the above conversion constructors\n//\n// Returns true if there was an error in construction.\n//\nbool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, TFunction& function, TOperator op, TType& type)\n{\n    // See if the constructor does not establish the main type, only requalifies\n    // it, in which case the type comes from the argument instead of from the\n    // constructor function.\n    switch (op) {\n    case EOpConstructNonuniform:\n        if (node != nullptr && node->getAsTyped() != nullptr) {\n            type.shallowCopy(node->getAsTyped()->getType());\n            type.getQualifier().makeTemporary();\n            type.getQualifier().nonUniform = true;\n        }\n        break;\n    default:\n        type.shallowCopy(function.getType());\n        break;\n    }\n\n    TString constructorString;\n    if (intermediate.getEnhancedMsgs())\n        constructorString.append(type.getCompleteString(true, false, false, true)).append(\" constructor\");\n    else\n        constructorString.append(\"constructor\");\n\n    // See if it's a matrix\n    bool constructingMatrix = false;\n    switch (op) {\n    case EOpConstructTextureSampler:\n        return constructorTextureSamplerError(loc, function);\n    case EOpConstructMat2x2:\n    case EOpConstructMat2x3:\n    case EOpConstructMat2x4:\n    case EOpConstructMat3x2:\n    case EOpConstructMat3x3:\n    case EOpConstructMat3x4:\n    case EOpConstructMat4x2:\n    case EOpConstructMat4x3:\n    case EOpConstructMat4x4:\n    case EOpConstructDMat2x2:\n    case EOpConstructDMat2x3:\n    case EOpConstructDMat2x4:\n    case EOpConstructDMat3x2:\n    case EOpConstructDMat3x3:\n    case EOpConstructDMat3x4:\n    case EOpConstructDMat4x2:\n    case EOpConstructDMat4x3:\n    case EOpConstructDMat4x4:\n    case EOpConstructF16Mat2x2:\n    case EOpConstructF16Mat2x3:\n    case EOpConstructF16Mat2x4:\n    case EOpConstructF16Mat3x2:\n    case EOpConstructF16Mat3x3:\n    case EOpConstructF16Mat3x4:\n    case EOpConstructF16Mat4x2:\n    case EOpConstructF16Mat4x3:\n    case EOpConstructF16Mat4x4:\n        constructingMatrix = true;\n        break;\n    default:\n        break;\n    }\n\n    //\n    // Walk the arguments for first-pass checks and collection of information.\n    //\n\n    int size = 0;\n    bool constType = true;\n    bool specConstType = false;   // value is only valid if constType is true\n    bool full = false;\n    bool overFull = false;\n    bool matrixInMatrix = false;\n    bool arrayArg = false;\n    bool floatArgument = false;\n    bool intArgument = false;\n    for (int arg = 0; arg < function.getParamCount(); ++arg) {\n        if (function[arg].type->isArray()) {\n            if (function[arg].type->isUnsizedArray()) {\n                // Can't construct from an unsized array.\n                error(loc, \"array argument must be sized\", constructorString.c_str(), \"\");\n                return true;\n            }\n            arrayArg = true;\n        }\n        if (constructingMatrix && function[arg].type->isMatrix())\n            matrixInMatrix = true;\n\n        // 'full' will go to true when enough args have been seen.  If we loop\n        // again, there is an extra argument.\n        if (full) {\n            // For vectors and matrices, it's okay to have too many components\n            // available, but not okay to have unused arguments.\n            overFull = true;\n        }\n\n        size += function[arg].type->computeNumComponents();\n        if (op != EOpConstructStruct && ! type.isArray() && size >= type.computeNumComponents())\n            full = true;\n\n        if (! function[arg].type->getQualifier().isConstant())\n            constType = false;\n        if (function[arg].type->getQualifier().isSpecConstant())\n            specConstType = true;\n        if (function[arg].type->isFloatingDomain())\n            floatArgument = true;\n        if (function[arg].type->isIntegerDomain())\n            intArgument = true;\n        if (type.isStruct()) {\n            if (function[arg].type->contains16BitFloat()) {\n                requireFloat16Arithmetic(loc, constructorString.c_str(), \"can't construct structure containing 16-bit type\");\n            }\n            if (function[arg].type->contains16BitInt()) {\n                requireInt16Arithmetic(loc, constructorString.c_str(), \"can't construct structure containing 16-bit type\");\n            }\n            if (function[arg].type->contains8BitInt()) {\n                requireInt8Arithmetic(loc, constructorString.c_str(), \"can't construct structure containing 8-bit type\");\n            }\n        }\n    }\n    if (op == EOpConstructNonuniform)\n        constType = false;\n\n    switch (op) {\n    case EOpConstructFloat16:\n    case EOpConstructF16Vec2:\n    case EOpConstructF16Vec3:\n    case EOpConstructF16Vec4:\n        if (type.isArray())\n            requireFloat16Arithmetic(loc, constructorString.c_str(), \"16-bit arrays not supported\");\n        if (type.isVector() && function.getParamCount() != 1)\n            requireFloat16Arithmetic(loc, constructorString.c_str(), \"16-bit vectors only take vector types\");\n        break;\n    case EOpConstructUint16:\n    case EOpConstructU16Vec2:\n    case EOpConstructU16Vec3:\n    case EOpConstructU16Vec4:\n    case EOpConstructInt16:\n    case EOpConstructI16Vec2:\n    case EOpConstructI16Vec3:\n    case EOpConstructI16Vec4:\n        if (type.isArray())\n            requireInt16Arithmetic(loc, constructorString.c_str(), \"16-bit arrays not supported\");\n        if (type.isVector() && function.getParamCount() != 1)\n            requireInt16Arithmetic(loc, constructorString.c_str(), \"16-bit vectors only take vector types\");\n        break;\n    case EOpConstructUint8:\n    case EOpConstructU8Vec2:\n    case EOpConstructU8Vec3:\n    case EOpConstructU8Vec4:\n    case EOpConstructInt8:\n    case EOpConstructI8Vec2:\n    case EOpConstructI8Vec3:\n    case EOpConstructI8Vec4:\n        if (type.isArray())\n            requireInt8Arithmetic(loc, constructorString.c_str(), \"8-bit arrays not supported\");\n        if (type.isVector() && function.getParamCount() != 1)\n            requireInt8Arithmetic(loc, constructorString.c_str(), \"8-bit vectors only take vector types\");\n        break;\n    default:\n        break;\n    }\n\n    // inherit constness from children\n    if (constType) {\n        bool makeSpecConst;\n        // Finish pinning down spec-const semantics\n        if (specConstType) {\n            switch (op) {\n            case EOpConstructInt8:\n            case EOpConstructInt:\n            case EOpConstructUint:\n            case EOpConstructBool:\n            case EOpConstructBVec2:\n            case EOpConstructBVec3:\n            case EOpConstructBVec4:\n            case EOpConstructIVec2:\n            case EOpConstructIVec3:\n            case EOpConstructIVec4:\n            case EOpConstructUVec2:\n            case EOpConstructUVec3:\n            case EOpConstructUVec4:\n            case EOpConstructUint8:\n            case EOpConstructInt16:\n            case EOpConstructUint16:\n            case EOpConstructInt64:\n            case EOpConstructUint64:\n            case EOpConstructI8Vec2:\n            case EOpConstructI8Vec3:\n            case EOpConstructI8Vec4:\n            case EOpConstructU8Vec2:\n            case EOpConstructU8Vec3:\n            case EOpConstructU8Vec4:\n            case EOpConstructI16Vec2:\n            case EOpConstructI16Vec3:\n            case EOpConstructI16Vec4:\n            case EOpConstructU16Vec2:\n            case EOpConstructU16Vec3:\n            case EOpConstructU16Vec4:\n            case EOpConstructI64Vec2:\n            case EOpConstructI64Vec3:\n            case EOpConstructI64Vec4:\n            case EOpConstructU64Vec2:\n            case EOpConstructU64Vec3:\n            case EOpConstructU64Vec4:\n                // This was the list of valid ones, if they aren't converting from float\n                // and aren't making an array.\n                makeSpecConst = ! floatArgument && ! type.isArray();\n                break;\n\n            case EOpConstructVec2:\n            case EOpConstructVec3:\n            case EOpConstructVec4:\n                // This was the list of valid ones, if they aren't converting from int\n                // and aren't making an array.\n                makeSpecConst = ! intArgument && !type.isArray();\n                break;\n\n            case EOpConstructCooperativeMatrixNV:\n            case EOpConstructCooperativeMatrixKHR:\n            case EOpConstructStruct:\n                {\n                    const char *specConstantCompositeExt[] = { E_GL_EXT_spec_constant_composites };\n                    if (checkExtensionsRequested(loc, 1, specConstantCompositeExt, \"spec constant aggregate constructor\")) {\n                        makeSpecConst = true;\n                    } else {\n                        makeSpecConst = false;\n                    }\n                }\n                break;\n\n            default:\n                // anything else wasn't white-listed in the spec as a conversion\n                makeSpecConst = false;\n                break;\n            }\n        } else\n            makeSpecConst = false;\n\n        if (makeSpecConst)\n            type.getQualifier().makeSpecConstant();\n        else if (specConstType)\n            type.getQualifier().makeTemporary();\n        else\n            type.getQualifier().storage = EvqConst;\n    }\n\n    if (type.isArray()) {\n        if (function.getParamCount() == 0) {\n            error(loc, \"array constructor must have at least one argument\", constructorString.c_str(), \"\");\n            return true;\n        }\n\n        if (type.isUnsizedArray()) {\n            // auto adapt the constructor type to the number of arguments\n            type.changeOuterArraySize(function.getParamCount());\n        } else if (type.getOuterArraySize() != function.getParamCount()) {\n            error(loc, \"array constructor needs one argument per array element\", constructorString.c_str(), \"\");\n            return true;\n        }\n\n        if (type.isArrayOfArrays()) {\n            // Types have to match, but we're still making the type.\n            // Finish making the type, and the comparison is done later\n            // when checking for conversion.\n            TArraySizes& arraySizes = *type.getArraySizes();\n\n            // At least the dimensionalities have to match.\n            if (! function[0].type->isArray() ||\n                    arraySizes.getNumDims() != function[0].type->getArraySizes()->getNumDims() + 1) {\n                error(loc, \"array constructor argument not correct type to construct array element\", constructorString.c_str(), \"\");\n                return true;\n            }\n\n            if (arraySizes.isInnerUnsized()) {\n                // \"Arrays of arrays ..., and the size for any dimension is optional\"\n                // That means we need to adopt (from the first argument) the other array sizes into the type.\n                for (int d = 1; d < arraySizes.getNumDims(); ++d) {\n                    if (arraySizes.getDimSize(d) == UnsizedArraySize) {\n                        arraySizes.setDimSize(d, function[0].type->getArraySizes()->getDimSize(d - 1));\n                    }\n                }\n            }\n        }\n    }\n\n    if (arrayArg && op != EOpConstructStruct && ! type.isArrayOfArrays()) {\n        error(loc, \"constructing non-array constituent from array argument\", constructorString.c_str(), \"\");\n        return true;\n    }\n\n    if (matrixInMatrix && ! type.isArray()) {\n        profileRequires(loc, ENoProfile, 120, nullptr, \"constructing matrix from matrix\");\n\n        // \"If a matrix argument is given to a matrix constructor,\n        // it is a compile-time error to have any other arguments.\"\n        if (function.getParamCount() != 1)\n            error(loc, \"matrix constructed from matrix can only have one argument\", constructorString.c_str(), \"\");\n        return false;\n    }\n\n    if (overFull) {\n        error(loc, \"too many arguments\", constructorString.c_str(), \"\");\n        return true;\n    }\n\n    if (op == EOpConstructStruct && ! type.isArray() && (int)type.getStruct()->size() != function.getParamCount()) {\n        error(loc, \"Number of constructor parameters does not match the number of structure fields\", constructorString.c_str(), \"\");\n        return true;\n    }\n\n    if ((op != EOpConstructStruct && size != 1 && size < type.computeNumComponents()) ||\n        (op == EOpConstructStruct && size < type.computeNumComponents())) {\n        error(loc, \"not enough data provided for construction\", constructorString.c_str(), \"\");\n        return true;\n    }\n\n    if (type.isCoopMat() && function.getParamCount() != 1) {\n        error(loc, \"wrong number of arguments\", constructorString.c_str(), \"\");\n        return true;\n    }\n    if (type.isCoopMat() &&\n        !(function[0].type->isScalar() || function[0].type->isCoopMat())) {\n        error(loc, \"Cooperative matrix constructor argument must be scalar or cooperative matrix\", constructorString.c_str(), \"\");\n        return true;\n    }\n\n    TIntermTyped* typed = node->getAsTyped();\n    if (type.isCoopMat() && typed->getType().isCoopMat() &&\n        ((extensionTurnedOn(E_GL_NV_cooperative_matrix2) && !type.sameCoopMatShape(typed->getType())) ||\n         (!extensionTurnedOn(E_GL_NV_cooperative_matrix2) && !type.sameCoopMatShapeAndUse(typed->getType())))) {\n        error(loc, \"Cooperative matrix type parameters mismatch\", constructorString.c_str(), \"\");\n        return true;\n    }\n\n    if (typed == nullptr) {\n        error(loc, \"constructor argument does not have a type\", constructorString.c_str(), \"\");\n        return true;\n    }\n    if (op != EOpConstructStruct && op != EOpConstructNonuniform && typed->getBasicType() == EbtSampler) {\n        if (op == EOpConstructUVec2 && extensionTurnedOn(E_GL_ARB_bindless_texture)) {\n            intermediate.setBindlessTextureMode(currentCaller, AstRefTypeFunc);\n        }\n        else {\n            error(loc, \"cannot convert a sampler\", constructorString.c_str(), \"\");\n            return true;\n        }\n    }\n    if (op != EOpConstructStruct && typed->isAtomic()) {\n        error(loc, \"cannot convert an atomic_uint\", constructorString.c_str(), \"\");\n        return true;\n    }\n    if (typed->getBasicType() == EbtVoid) {\n        error(loc, \"cannot convert a void\", constructorString.c_str(), \"\");\n        return true;\n    }\n\n    return false;\n}\n\n// Verify all the correct semantics for constructing a combined texture/sampler.\n// Return true if the semantics are incorrect.\nbool TParseContext::constructorTextureSamplerError(const TSourceLoc& loc, const TFunction& function)\n{\n    TString constructorName = function.getType().getBasicTypeString();  // TODO: performance: should not be making copy; interface needs to change\n    const char* token = constructorName.c_str();\n    // verify the constructor for bindless texture, the input must be ivec2 or uvec2\n    if (function.getParamCount() == 1) {\n        TType* pType = function[0].type;\n        TBasicType basicType = pType->getBasicType();\n        bool isIntegerVec2 = ((basicType == EbtUint || basicType == EbtInt) && pType->getVectorSize() == 2);\n        bool bindlessMode = extensionTurnedOn(E_GL_ARB_bindless_texture);\n        if (isIntegerVec2 && bindlessMode) {\n            if (pType->getSampler().isImage())\n                intermediate.setBindlessImageMode(currentCaller, AstRefTypeFunc);\n            else\n                intermediate.setBindlessTextureMode(currentCaller, AstRefTypeFunc);\n            return false;\n        } else {\n            if (!bindlessMode)\n                error(loc, \"sampler-constructor requires the extension GL_ARB_bindless_texture enabled\", token, \"\");\n            else\n                error(loc, \"sampler-constructor requires the input to be ivec2 or uvec2\", token, \"\");\n            return true;\n        }\n    }\n\n    // exactly two arguments needed\n    if (function.getParamCount() != 2) {\n        error(loc, \"sampler-constructor requires two arguments\", token, \"\");\n        return true;\n    }\n\n    // For now, not allowing arrayed constructors, the rest of this function\n    // is set up to allow them, if this test is removed:\n    if (function.getType().isArray()) {\n        error(loc, \"sampler-constructor cannot make an array of samplers\", token, \"\");\n        return true;\n    }\n\n    // first argument\n    //  * the constructor's first argument must be a texture type\n    //  * the dimensionality (1D, 2D, 3D, Cube, Rect, Buffer, MS, and Array)\n    //    of the texture type must match that of the constructed sampler type\n    //    (that is, the suffixes of the type of the first argument and the\n    //    type of the constructor will be spelled the same way)\n    if (function[0].type->getBasicType() != EbtSampler ||\n        ! function[0].type->getSampler().isTexture() ||\n        function[0].type->isArray()) {\n        error(loc, \"sampler-constructor first argument must be a scalar *texture* type\", token, \"\");\n        return true;\n    }\n\n    // simulate the first argument's impact on the result type, so it can be compared with the encapsulated operator!=()\n    TSampler texture = function.getType().getSampler();\n    texture.setCombined(false);\n    texture.shadow = false;\n    if (function[0].type->getSampler().isTileAttachmentQCOM()) {\n      //TSampler& texture = const_cast<TFunction&>(function).getWritableType().getSampler();\n      texture.image = true;\n      texture.tileQCOM = true;\n    }\n    if (texture != function[0].type->getSampler()) {\n        error(loc, \"sampler-constructor first argument must be a *texture* type\"\n                   \" matching the dimensionality and sampled type of the constructor\", token, \"\");\n        return true;\n    }\n\n    // second argument\n    //   * the constructor's second argument must be a scalar of type\n    //     *sampler* or *samplerShadow*\n    if (  function[1].type->getBasicType() != EbtSampler ||\n        ! function[1].type->getSampler().isPureSampler() ||\n          function[1].type->isArray()) {\n        error(loc, \"sampler-constructor second argument must be a scalar sampler or samplerShadow\", token, \"\");\n        return true;\n    }\n\n    return false;\n}\n\n// Checks to see if a void variable has been declared and raise an error message for such a case\n//\n// returns true in case of an error\n//\nbool TParseContext::voidErrorCheck(const TSourceLoc& loc, const TString& identifier, const TBasicType basicType)\n{\n    if (basicType == EbtVoid) {\n        error(loc, \"illegal use of type 'void'\", identifier.c_str(), \"\");\n        return true;\n    }\n\n    return false;\n}\n\n// Checks to see if the node (for the expression) contains a scalar boolean expression or not\nvoid TParseContext::boolCheck(const TSourceLoc& loc, const TIntermTyped* type)\n{\n    if (type->getBasicType() != EbtBool || type->isArray() || type->isMatrix() || type->isVector())\n        error(loc, \"boolean expression expected\", \"\", \"\");\n}\n\n// This function checks to see if the node (for the expression) contains a scalar boolean expression or not\nvoid TParseContext::boolCheck(const TSourceLoc& loc, const TPublicType& pType)\n{\n    if (pType.basicType != EbtBool || pType.arraySizes || pType.matrixCols > 1 || (pType.vectorSize > 1))\n        error(loc, \"boolean expression expected\", \"\", \"\");\n}\n\nvoid TParseContext::samplerCheck(const TSourceLoc& loc, const TType& type, const TString& identifier, TIntermTyped* /*initializer*/)\n{\n    // Check that the appropriate extension is enabled if external sampler is used.\n    // There are two extensions. The correct one must be used based on GLSL version.\n    if (type.getBasicType() == EbtSampler && type.getSampler().isExternal()) {\n        if (version < 300) {\n            requireExtensions(loc, 1, &E_GL_OES_EGL_image_external, \"samplerExternalOES\");\n        } else {\n            requireExtensions(loc, 1, &E_GL_OES_EGL_image_external_essl3, \"samplerExternalOES\");\n        }\n    }\n    if (type.getSampler().isYuv()) {\n        requireExtensions(loc, 1, &E_GL_EXT_YUV_target, \"__samplerExternal2DY2YEXT\");\n    }\n\n    if (type.getQualifier().storage == EvqUniform)\n        return;\n\n    if (type.getBasicType() == EbtStruct && containsFieldWithBasicType(type, EbtSampler)) {\n        // For bindless texture, sampler can be declared as an struct member\n        if (extensionTurnedOn(E_GL_ARB_bindless_texture)) {\n            if (type.getSampler().isImage())\n                intermediate.setBindlessImageMode(currentCaller, AstRefTypeVar);\n            else\n                intermediate.setBindlessTextureMode(currentCaller, AstRefTypeVar);\n        }\n        else {\n            error(loc, \"non-uniform struct contains a sampler or image:\", type.getBasicTypeString().c_str(), identifier.c_str());\n        }\n    }\n    else if (type.getBasicType() == EbtSampler && type.getQualifier().storage != EvqUniform) {\n        // For bindless texture, sampler can be declared as an input/output/block member\n        if (extensionTurnedOn(E_GL_ARB_bindless_texture)) {\n            if (type.getSampler().isImage())\n                intermediate.setBindlessImageMode(currentCaller, AstRefTypeVar);\n            else\n                intermediate.setBindlessTextureMode(currentCaller, AstRefTypeVar);\n        }\n        else {\n            // non-uniform sampler\n            // not yet:  okay if it has an initializer\n            // if (! initializer)\n            if (type.getSampler().isAttachmentEXT() && type.getQualifier().storage != EvqTileImageEXT)\n                 error(loc, \"can only be used in tileImageEXT variables or function parameters:\", type.getBasicTypeString().c_str(), identifier.c_str());\n            else if (type.getQualifier().storage != EvqTileImageEXT)\n                 error(loc, \"sampler/image types can only be used in uniform variables or function parameters:\", type.getBasicTypeString().c_str(), identifier.c_str());\n        }\n    }\n}\n\nvoid TParseContext::atomicUintCheck(const TSourceLoc& loc, const TType& type, const TString& identifier)\n{\n    if (type.getQualifier().storage == EvqUniform)\n        return;\n\n    if (type.getBasicType() == EbtStruct && containsFieldWithBasicType(type, EbtAtomicUint))\n        error(loc, \"non-uniform struct contains an atomic_uint:\", type.getBasicTypeString().c_str(), identifier.c_str());\n    else if (type.getBasicType() == EbtAtomicUint && type.getQualifier().storage != EvqUniform)\n        error(loc, \"atomic_uints can only be used in uniform variables or function parameters:\", type.getBasicTypeString().c_str(), identifier.c_str());\n}\n\nvoid TParseContext::accStructCheck(const TSourceLoc& loc, const TType& type, const TString& identifier)\n{\n    if (type.getQualifier().storage == EvqUniform)\n        return;\n\n    if (type.getBasicType() == EbtStruct && containsFieldWithBasicType(type, EbtAccStruct))\n        error(loc, \"non-uniform struct contains an accelerationStructureNV:\", type.getBasicTypeString().c_str(), identifier.c_str());\n    else if (type.getBasicType() == EbtAccStruct && type.getQualifier().storage != EvqUniform)\n        error(loc, \"accelerationStructureNV can only be used in uniform variables or function parameters:\",\n            type.getBasicTypeString().c_str(), identifier.c_str());\n\n}\n\nvoid TParseContext::hitObjectNVCheck(const TSourceLoc & loc, const TType & type, const TString & identifier)\n{\n    if (type.getBasicType() == EbtStruct && containsFieldWithBasicType(type, EbtHitObjectNV)) {\n        error(loc, \"struct is not allowed to contain hitObjectNV:\", type.getTypeName().c_str(), identifier.c_str());\n    } else if (type.getBasicType() == EbtHitObjectNV) {\n        TStorageQualifier qualifier = type.getQualifier().storage;\n        if (qualifier != EvqGlobal && qualifier != EvqTemporary) {\n            error(loc, \"hitObjectNV can only be declared in global or function scope with no storage qualifier:\", \"hitObjectNV\", identifier.c_str());\n        }\n    }\n}\n\nvoid TParseContext::transparentOpaqueCheck(const TSourceLoc& loc, const TType& type, const TString& identifier)\n{\n    if (parsingBuiltins)\n        return;\n\n    if (type.getQualifier().storage != EvqUniform)\n        return;\n\n    if (type.containsNonOpaque()) {\n        // Vulkan doesn't allow transparent uniforms outside of blocks\n        if (spvVersion.vulkan > 0 && !spvVersion.vulkanRelaxed)\n            vulkanRemoved(loc, \"non-opaque uniforms outside a block\");\n        // OpenGL wants locations on these (unless they are getting automapped)\n        if (spvVersion.openGl > 0 && !type.getQualifier().hasLocation() && !intermediate.getAutoMapLocations())\n            error(loc, \"non-opaque uniform variables need a layout(location=L)\", identifier.c_str(), \"\");\n    }\n}\n\n//\n// Qualifier checks knowing the qualifier and that it is a member of a struct/block.\n//\nvoid TParseContext::memberQualifierCheck(glslang::TPublicType& publicType)\n{\n    globalQualifierFixCheck(publicType.loc, publicType.qualifier, true);\n    checkNoShaderLayouts(publicType.loc, publicType.shaderQualifiers);\n    if (publicType.qualifier.isNonUniform()) {\n        error(publicType.loc, \"not allowed on block or structure members\", \"nonuniformEXT\", \"\");\n        publicType.qualifier.nonUniform = false;\n    }\n    if (publicType.qualifier.isPatch()) {\n        error(publicType.loc, \"not allowed on block or structure members\",\n              \"patch\", \"\");\n    }\n}\n\n//\n// Check/fix just a full qualifier (no variables or types yet, but qualifier is complete) at global level.\n//\nvoid TParseContext::globalQualifierFixCheck(const TSourceLoc& loc, TQualifier& qualifier, bool isMemberCheck, const TPublicType* publicType)\n{\n    bool nonuniformOkay = false;\n\n    // move from parameter/unknown qualifiers to pipeline in/out qualifiers\n    switch (qualifier.storage) {\n    case EvqIn:\n        profileRequires(loc, ENoProfile, 130, nullptr, \"in for stage inputs\");\n        profileRequires(loc, EEsProfile, 300, nullptr, \"in for stage inputs\");\n        qualifier.storage = EvqVaryingIn;\n        nonuniformOkay = true;\n        break;\n    case EvqOut:\n        profileRequires(loc, ENoProfile, 130, nullptr, \"out for stage outputs\");\n        profileRequires(loc, EEsProfile, 300, nullptr, \"out for stage outputs\");\n        qualifier.storage = EvqVaryingOut;\n        if (intermediate.isInvariantAll())\n            qualifier.invariant = true;\n        break;\n    case EvqInOut:\n        qualifier.storage = EvqVaryingIn;\n        error(loc, \"cannot use 'inout' at global scope\", \"\", \"\");\n        break;\n    case EvqGlobal:\n    case EvqTemporary:\n        nonuniformOkay = true;\n        break;\n    case EvqUniform:\n        // According to GLSL spec: The std430 qualifier is supported only for shader storage blocks; a shader using\n        // the std430 qualifier on a uniform block will fail to compile.\n        // Only check the global declaration: layout(std430) uniform;\n        if (blockName == nullptr &&\n            qualifier.layoutPacking == ElpStd430)\n        {\n            requireExtensions(loc, 1, &E_GL_EXT_scalar_block_layout, \"default std430 layout for uniform\");\n        }\n\n        if (publicType != nullptr && publicType->isImage() &&\n            (qualifier.layoutFormat > ElfExtSizeGuard && qualifier.layoutFormat < ElfCount))\n            qualifier.layoutFormat = mapLegacyLayoutFormat(qualifier.layoutFormat, publicType->sampler.getBasicType());\n\n        break;\n    default:\n        break;\n    }\n\n    if (!nonuniformOkay && qualifier.isNonUniform())\n        error(loc, \"for non-parameter, can only apply to 'in' or no storage qualifier\", \"nonuniformEXT\", \"\");\n\n    if (qualifier.isSpirvByReference())\n        error(loc, \"can only apply to parameter\", \"spirv_by_reference\", \"\");\n\n    if (qualifier.isSpirvLiteral())\n        error(loc, \"can only apply to parameter\", \"spirv_literal\", \"\");\n\n    // Storage qualifier isn't ready for memberQualifierCheck, we should skip invariantCheck for it.\n    if (!isMemberCheck || structNestingLevel > 0)\n        invariantCheck(loc, qualifier);\n\n    if (qualifier.isFullQuads()) {\n        if (qualifier.storage != EvqVaryingIn)\n            error(loc, \"can only apply to input layout\", \"full_quads \", \"\");\n        intermediate.setReqFullQuadsMode();\n    }\n\n    if (qualifier.isQuadDeriv()) {\n        if (qualifier.storage != EvqVaryingIn)\n            error(loc, \"can only apply to input layout\", \"quad_derivatives\", \"\");\n        intermediate.setQuadDerivMode();\n    }\n}\n\n//\n// Check a full qualifier and type (no variable yet) at global level.\n//\nvoid TParseContext::globalQualifierTypeCheck(const TSourceLoc& loc, const TQualifier& qualifier, const TPublicType& publicType)\n{\n    if (! symbolTable.atGlobalLevel())\n        return;\n\n    if (!(publicType.userDef && publicType.userDef->isReference()) && !parsingBuiltins) {\n        if (qualifier.isMemoryQualifierImageAndSSBOOnly() && ! publicType.isImage() && publicType.qualifier.storage != EvqBuffer) {\n            error(loc, \"memory qualifiers cannot be used on this type\", \"\", \"\");\n        } else if (qualifier.isMemory() && (publicType.basicType != EbtSampler) && !publicType.qualifier.isUniformOrBuffer()) {\n            error(loc, \"memory qualifiers cannot be used on this type\", \"\", \"\");\n        }\n    }\n\n    if (qualifier.storage == EvqBuffer &&\n        publicType.basicType != EbtBlock &&\n        !qualifier.hasBufferReference())\n        error(loc, \"buffers can be declared only as blocks\", \"buffer\", \"\");\n\n    if (qualifier.storage != EvqVaryingIn && publicType.basicType == EbtDouble &&\n        extensionTurnedOn(E_GL_ARB_vertex_attrib_64bit) && language == EShLangVertex &&\n        version < 400) {\n        profileRequires(loc, ECoreProfile | ECompatibilityProfile, 410, E_GL_ARB_gpu_shader_fp64, \"vertex-shader `double` type\");\n    }\n    if (qualifier.storage != EvqVaryingIn && qualifier.storage != EvqVaryingOut)\n        return;\n\n    if (publicType.shaderQualifiers.hasBlendEquation())\n        error(loc, \"can only be applied to a standalone 'out'\", \"blend equation\", \"\");\n\n    // now, knowing it is a shader in/out, do all the in/out semantic checks\n\n    if (publicType.basicType == EbtBool && !parsingBuiltins) {\n        error(loc, \"cannot be bool\", GetStorageQualifierString(qualifier.storage), \"\");\n        return;\n    }\n\n    if (isTypeInt(publicType.basicType) || publicType.basicType == EbtDouble) {\n        profileRequires(loc, EEsProfile, 300, nullptr, \"non-float shader input/output\");\n        profileRequires(loc, ~EEsProfile, 130, nullptr, \"non-float shader input/output\");\n    }\n\n    if (!qualifier.flat && !qualifier.isExplicitInterpolation() && !qualifier.isPervertexNV() && !qualifier.isPervertexEXT()) {\n        if (isTypeInt(publicType.basicType) ||\n            publicType.basicType == EbtDouble ||\n            (publicType.userDef && (   publicType.userDef->containsBasicType(EbtInt)\n                                    || publicType.userDef->containsBasicType(EbtUint)\n                                    || publicType.userDef->contains16BitInt()\n                                    || publicType.userDef->contains8BitInt()\n                                    || publicType.userDef->contains64BitInt()\n                                    || publicType.userDef->containsDouble()))) {\n            if (qualifier.storage == EvqVaryingIn && language == EShLangFragment)\n                error(loc, \"must be qualified as flat\", TType::getBasicString(publicType.basicType), GetStorageQualifierString(qualifier.storage));\n            else if (qualifier.storage == EvqVaryingOut && language == EShLangVertex && version == 300)\n                error(loc, \"must be qualified as flat\", TType::getBasicString(publicType.basicType), GetStorageQualifierString(qualifier.storage));\n        }\n    }\n\n    if (qualifier.isPatch() && qualifier.isInterpolation())\n        error(loc, \"cannot use interpolation qualifiers with patch\", \"patch\", \"\");\n\n    // Only \"patch in\" is supported via GL_NV_gpu_shader5\n    if (! symbolTable.atBuiltInLevel() && qualifier.isPatch() && \n        (language == EShLangGeometry) && qualifier.storage != EvqVaryingIn &&\n        extensionTurnedOn(E_GL_NV_gpu_shader5))\n            error(loc, \"only 'patch in' is supported in this stage:\", \"patch\", \"geometry\");\n\n    if (qualifier.isTaskPayload() && publicType.basicType == EbtBlock)\n        error(loc, \"taskPayloadSharedEXT variables should not be declared as interface blocks\", \"taskPayloadSharedEXT\", \"\");\n\n    if (qualifier.isTaskMemory() && publicType.basicType != EbtBlock)\n        error(loc, \"taskNV variables can be declared only as blocks\", \"taskNV\", \"\");\n\n    if (qualifier.storage == EvqVaryingIn) {\n        switch (language) {\n        case EShLangVertex:\n            if (publicType.basicType == EbtStruct) {\n                error(loc, \"cannot be a structure\", GetStorageQualifierString(qualifier.storage), \"\");\n                return;\n            }\n            if (publicType.arraySizes) {\n                requireProfile(loc, ~EEsProfile, \"vertex input arrays\");\n                profileRequires(loc, ENoProfile, 150, nullptr, \"vertex input arrays\");\n            }\n            if (publicType.basicType == EbtDouble) {\n            \tconst char* const float64_attrib[] = {E_GL_NV_gpu_shader5, E_GL_ARB_vertex_attrib_64bit};\n                const int Num_float64_attrib = sizeof(float64_attrib) / sizeof(float64_attrib[0]);        \n                profileRequires(loc, ~EEsProfile, 410, Num_float64_attrib, float64_attrib, \"vertex-shader `double` type input\");\n\t\t\t}\n            if (qualifier.isAuxiliary() || qualifier.isInterpolation() || qualifier.isMemory() || qualifier.invariant)\n                error(loc, \"vertex input cannot be further qualified\", \"\", \"\");\n            break;\n        case EShLangFragment:\n            if (publicType.userDef) {\n                profileRequires(loc, EEsProfile, 300, nullptr, \"fragment-shader struct input\");\n                profileRequires(loc, ~EEsProfile, 150, nullptr, \"fragment-shader struct input\");\n                if (publicType.userDef->containsStructure())\n                    requireProfile(loc, ~EEsProfile, \"fragment-shader struct input containing structure\");\n                if (publicType.userDef->containsArray())\n                    requireProfile(loc, ~EEsProfile, \"fragment-shader struct input containing an array\");\n            }\n            break;\n       case EShLangCompute:\n            if (! symbolTable.atBuiltInLevel())\n                error(loc, \"global storage input qualifier cannot be used in a compute shader\", \"in\", \"\");\n            break;\n       case EShLangTessControl:\n            if (qualifier.patch)\n                error(loc, \"can only use on output in tessellation-control shader\", \"patch\", \"\");\n            break;\n        default:\n            break;\n        }\n    } else {\n        // qualifier.storage == EvqVaryingOut\n        switch (language) {\n        case EShLangVertex:\n            if (publicType.userDef) {\n                profileRequires(loc, EEsProfile, 300, nullptr, \"vertex-shader struct output\");\n                profileRequires(loc, ~EEsProfile, 150, nullptr, \"vertex-shader struct output\");\n                if (publicType.userDef->containsStructure())\n                    requireProfile(loc, ~EEsProfile, \"vertex-shader struct output containing structure\");\n                if (publicType.userDef->containsArray())\n                    requireProfile(loc, ~EEsProfile, \"vertex-shader struct output containing an array\");\n            }\n\n            break;\n        case EShLangFragment:\n            profileRequires(loc, EEsProfile, 300, nullptr, \"fragment shader output\");\n            if (publicType.basicType == EbtStruct) {\n                error(loc, \"cannot be a structure\", GetStorageQualifierString(qualifier.storage), \"\");\n                return;\n            }\n            if (publicType.matrixRows > 0) {\n                error(loc, \"cannot be a matrix\", GetStorageQualifierString(qualifier.storage), \"\");\n                return;\n            }\n            if (qualifier.isAuxiliary())\n                error(loc, \"can't use auxiliary qualifier on a fragment output\", \"centroid/sample/patch\", \"\");\n            if (qualifier.isInterpolation())\n                error(loc, \"can't use interpolation qualifier on a fragment output\", \"flat/smooth/noperspective\", \"\");\n            if (publicType.basicType == EbtDouble || publicType.basicType == EbtInt64 || publicType.basicType == EbtUint64)\n                error(loc, \"cannot contain a double, int64, or uint64\", GetStorageQualifierString(qualifier.storage), \"\");\n        break;\n\n        case EShLangCompute:\n            error(loc, \"global storage output qualifier cannot be used in a compute shader\", \"out\", \"\");\n            break;\n        case EShLangTessEvaluation:\n            if (qualifier.patch)\n                error(loc, \"can only use on input in tessellation-evaluation shader\", \"patch\", \"\");\n            break;\n        default:\n            break;\n        }\n    }\n}\n\n//\n// Merge characteristics of the 'src' qualifier into the 'dst'.\n// If there is duplication, issue error messages, unless 'force'\n// is specified, which means to just override default settings.\n//\n// Also, when force is false, it will be assumed that 'src' follows\n// 'dst', for the purpose of error checking order for versions\n// that require specific orderings of qualifiers.\n//\nvoid TParseContext::mergeQualifiers(const TSourceLoc& loc, TQualifier& dst, const TQualifier& src, bool force)\n{\n    // Multiple auxiliary qualifiers (mostly done later by 'individual qualifiers')\n    if (src.isAuxiliary() && dst.isAuxiliary())\n        error(loc, \"can only have one auxiliary qualifier (centroid, patch, and sample)\", \"\", \"\");\n\n    // Multiple interpolation qualifiers (mostly done later by 'individual qualifiers')\n    if (src.isInterpolation() && dst.isInterpolation())\n        error(loc, \"can only have one interpolation qualifier (flat, smooth, noperspective, __explicitInterpAMD)\", \"\", \"\");\n\n    // Ordering\n    if (! force && ((!isEsProfile() && version < 420) ||\n                    (isEsProfile() && version < 310))\n                && ! extensionTurnedOn(E_GL_ARB_shading_language_420pack)) {\n        // non-function parameters\n        if (src.isNoContraction() && (dst.invariant || dst.isInterpolation() || dst.isAuxiliary() || dst.storage != EvqTemporary || dst.precision != EpqNone))\n            error(loc, \"precise qualifier must appear first\", \"\", \"\");\n        if (src.invariant && (dst.isInterpolation() || dst.isAuxiliary() || dst.storage != EvqTemporary || dst.precision != EpqNone))\n            error(loc, \"invariant qualifier must appear before interpolation, storage, and precision qualifiers \", \"\", \"\");\n        else if (src.isInterpolation() && (dst.isAuxiliary() || dst.storage != EvqTemporary || dst.precision != EpqNone))\n            error(loc, \"interpolation qualifiers must appear before storage and precision qualifiers\", \"\", \"\");\n        else if (src.isAuxiliary() && (dst.storage != EvqTemporary || dst.precision != EpqNone))\n            error(loc, \"Auxiliary qualifiers (centroid, patch, and sample) must appear before storage and precision qualifiers\", \"\", \"\");\n        else if (src.storage != EvqTemporary && (dst.precision != EpqNone))\n            error(loc, \"precision qualifier must appear as last qualifier\", \"\", \"\");\n\n        // function parameters\n        if (src.isNoContraction() && (dst.storage == EvqConst || dst.storage == EvqIn || dst.storage == EvqOut))\n            error(loc, \"precise qualifier must appear first\", \"\", \"\");\n        if (src.storage == EvqConst && (dst.storage == EvqIn || dst.storage == EvqOut))\n            error(loc, \"in/out must appear before const\", \"\", \"\");\n    }\n\n    // Storage qualification\n    if (dst.storage == EvqTemporary || dst.storage == EvqGlobal)\n        dst.storage = src.storage;\n    else if ((dst.storage == EvqIn  && src.storage == EvqOut) ||\n             (dst.storage == EvqOut && src.storage == EvqIn))\n        dst.storage = EvqInOut;\n    else if ((dst.storage == EvqIn    && src.storage == EvqConst) ||\n             (dst.storage == EvqConst && src.storage == EvqIn))\n        dst.storage = EvqConstReadOnly;\n    else if (src.storage != EvqTemporary &&\n             src.storage != EvqGlobal)\n        error(loc, \"too many storage qualifiers\", GetStorageQualifierString(src.storage), \"\");\n\n    // Precision qualifiers\n    if (! force && src.precision != EpqNone && dst.precision != EpqNone)\n        error(loc, \"only one precision qualifier allowed\", GetPrecisionQualifierString(src.precision), \"\");\n    if (dst.precision == EpqNone || (force && src.precision != EpqNone))\n        dst.precision = src.precision;\n\n    if (!force && ((src.coherent && (dst.devicecoherent || dst.queuefamilycoherent || dst.workgroupcoherent || dst.subgroupcoherent || dst.shadercallcoherent)) ||\n                   (src.devicecoherent && (dst.coherent || dst.queuefamilycoherent || dst.workgroupcoherent || dst.subgroupcoherent || dst.shadercallcoherent)) ||\n                   (src.queuefamilycoherent && (dst.coherent || dst.devicecoherent || dst.workgroupcoherent || dst.subgroupcoherent || dst.shadercallcoherent)) ||\n                   (src.workgroupcoherent && (dst.coherent || dst.devicecoherent || dst.queuefamilycoherent || dst.subgroupcoherent || dst.shadercallcoherent)) ||\n                   (src.subgroupcoherent  && (dst.coherent || dst.devicecoherent || dst.queuefamilycoherent || dst.workgroupcoherent || dst.shadercallcoherent)) ||\n                   (src.shadercallcoherent && (dst.coherent || dst.devicecoherent || dst.queuefamilycoherent || dst.workgroupcoherent || dst.subgroupcoherent)))) {\n        error(loc, \"only one coherent/devicecoherent/queuefamilycoherent/workgroupcoherent/subgroupcoherent/shadercallcoherent qualifier allowed\",\n            GetPrecisionQualifierString(src.precision), \"\");\n    }\n\n    // Layout qualifiers\n    mergeObjectLayoutQualifiers(dst, src, false);\n\n    // individual qualifiers\n    bool repeated = false;\n    #define MERGE_SINGLETON(field) repeated |= dst.field && src.field; dst.field |= src.field;\n    MERGE_SINGLETON(invariant);\n    MERGE_SINGLETON(centroid);\n    MERGE_SINGLETON(smooth);\n    MERGE_SINGLETON(flat);\n    MERGE_SINGLETON(specConstant);\n    MERGE_SINGLETON(noContraction);\n    MERGE_SINGLETON(nopersp);\n    MERGE_SINGLETON(explicitInterp);\n    MERGE_SINGLETON(perPrimitiveNV);\n    MERGE_SINGLETON(perViewNV);\n    MERGE_SINGLETON(perTaskNV);\n    MERGE_SINGLETON(patch);\n    MERGE_SINGLETON(sample);\n    MERGE_SINGLETON(coherent);\n    MERGE_SINGLETON(devicecoherent);\n    MERGE_SINGLETON(queuefamilycoherent);\n    MERGE_SINGLETON(workgroupcoherent);\n    MERGE_SINGLETON(subgroupcoherent);\n    MERGE_SINGLETON(shadercallcoherent);\n    MERGE_SINGLETON(nonprivate);\n    MERGE_SINGLETON(volatil);\n    MERGE_SINGLETON(nontemporal);\n    MERGE_SINGLETON(restrict);\n    MERGE_SINGLETON(readonly);\n    MERGE_SINGLETON(writeonly);\n    MERGE_SINGLETON(nonUniform);\n\n    // SPIR-V storage class qualifier (GL_EXT_spirv_intrinsics)\n    dst.spirvStorageClass = src.spirvStorageClass;\n\n    // SPIR-V decorate qualifiers (GL_EXT_spirv_intrinsics)\n    if (src.hasSpirvDecorate()) {\n        if (dst.hasSpirvDecorate()) {\n            const TSpirvDecorate& srcSpirvDecorate = src.getSpirvDecorate();\n            TSpirvDecorate& dstSpirvDecorate = dst.getSpirvDecorate();\n            for (auto& decorate : srcSpirvDecorate.decorates) {\n                if (dstSpirvDecorate.decorates.find(decorate.first) != dstSpirvDecorate.decorates.end())\n                    error(loc, \"too many SPIR-V decorate qualifiers\", \"spirv_decorate\", \"(decoration=%u)\", decorate.first);\n                else\n                    dstSpirvDecorate.decorates.insert(decorate);\n            }\n\n            for (auto& decorateId : srcSpirvDecorate.decorateIds) {\n                if (dstSpirvDecorate.decorateIds.find(decorateId.first) != dstSpirvDecorate.decorateIds.end())\n                    error(loc, \"too many SPIR-V decorate qualifiers\", \"spirv_decorate_id\", \"(decoration=%u)\", decorateId.first);\n                else\n                    dstSpirvDecorate.decorateIds.insert(decorateId);\n            }\n\n            for (auto& decorateString : srcSpirvDecorate.decorateStrings) {\n                if (dstSpirvDecorate.decorates.find(decorateString.first) != dstSpirvDecorate.decorates.end())\n                    error(loc, \"too many SPIR-V decorate qualifiers\", \"spirv_decorate_string\", \"(decoration=%u)\", decorateString.first);\n                else\n                    dstSpirvDecorate.decorateStrings.insert(decorateString);\n            }\n        } else {\n            dst.spirvDecorate = src.spirvDecorate;\n        }\n    }\n\n    if (repeated)\n        error(loc, \"replicated qualifiers\", \"\", \"\");\n}\n\nvoid TParseContext::setDefaultPrecision(const TSourceLoc& loc, TPublicType& publicType, TPrecisionQualifier qualifier)\n{\n    TBasicType basicType = publicType.basicType;\n\n    if (basicType == EbtSampler) {\n        defaultSamplerPrecision[computeSamplerTypeIndex(publicType.sampler)] = qualifier;\n\n        return;  // all is well\n    }\n\n    if (basicType == EbtInt || basicType == EbtFloat) {\n        if (publicType.isScalar()) {\n            defaultPrecision[basicType] = qualifier;\n            if (basicType == EbtInt) {\n                defaultPrecision[EbtUint] = qualifier;\n                precisionManager.explicitIntDefaultSeen();\n            } else\n                precisionManager.explicitFloatDefaultSeen();\n\n            return;  // all is well\n        }\n    }\n\n    if (basicType == EbtAtomicUint) {\n        if (qualifier != EpqHigh)\n            error(loc, \"can only apply highp to atomic_uint\", \"precision\", \"\");\n\n        return;\n    }\n\n    error(loc, \"cannot apply precision statement to this type; use 'float', 'int' or a sampler type\", TType::getBasicString(basicType), \"\");\n}\n\n// used to flatten the sampler type space into a single dimension\n// correlates with the declaration of defaultSamplerPrecision[]\nint TParseContext::computeSamplerTypeIndex(TSampler& sampler)\n{\n    int arrayIndex    = sampler.arrayed         ? 1 : 0;\n    int shadowIndex   = sampler.shadow          ? 1 : 0;\n    int externalIndex = sampler.isExternal()    ? 1 : 0;\n    int imageIndex    = sampler.isImageClass()  ? 1 : 0;\n    int msIndex       = sampler.isMultiSample() ? 1 : 0;\n\n    int flattened = EsdNumDims * (EbtNumTypes * (2 * (2 * (2 * (2 * arrayIndex + msIndex) + imageIndex) + shadowIndex) +\n                                                 externalIndex) + sampler.type) + sampler.dim;\n    assert(flattened < maxSamplerIndex);\n\n    return flattened;\n}\n\nTPrecisionQualifier TParseContext::getDefaultPrecision(TPublicType& publicType)\n{\n    if (publicType.basicType == EbtSampler)\n        return defaultSamplerPrecision[computeSamplerTypeIndex(publicType.sampler)];\n    else\n        return defaultPrecision[publicType.basicType];\n}\n\nvoid TParseContext::precisionQualifierCheck(const TSourceLoc& loc, TBasicType baseType, TQualifier& qualifier, bool isCoopMatOrVec)\n{\n    // Built-in symbols are allowed some ambiguous precisions, to be pinned down\n    // later by context.\n    if (! obeyPrecisionQualifiers() || parsingBuiltins)\n        return;\n\n    if (baseType == EbtAtomicUint && qualifier.precision != EpqNone && qualifier.precision != EpqHigh)\n        error(loc, \"atomic counters can only be highp\", \"atomic_uint\", \"\");\n\n    if (isCoopMatOrVec)\n        return;\n\n    if (baseType == EbtFloat || baseType == EbtUint || baseType == EbtInt || baseType == EbtSampler || baseType == EbtAtomicUint) {\n        if (qualifier.precision == EpqNone) {\n            if (relaxedErrors())\n                warn(loc, \"type requires declaration of default precision qualifier\", TType::getBasicString(baseType), \"substituting 'mediump'\");\n            else\n                error(loc, \"type requires declaration of default precision qualifier\", TType::getBasicString(baseType), \"\");\n            qualifier.precision = EpqMedium;\n            defaultPrecision[baseType] = EpqMedium;\n        }\n    } else if (qualifier.precision != EpqNone)\n        error(loc, \"type cannot have precision qualifier\", TType::getBasicString(baseType), \"\");\n}\n\nvoid TParseContext::parameterTypeCheck(const TSourceLoc& loc, TStorageQualifier qualifier, const TType& type)\n{\n    if ((qualifier == EvqOut || qualifier == EvqInOut) && type.isOpaque() && !intermediate.getBindlessMode())\n        error(loc, \"samplers and atomic_uints cannot be output parameters\", type.getBasicTypeString().c_str(), \"\");\n    if (!parsingBuiltins && type.contains16BitFloat())\n        requireFloat16Arithmetic(loc, type.getBasicTypeString().c_str(), \"float16 types can only be in uniform block or buffer storage\");\n    if (!parsingBuiltins && type.contains16BitInt())\n        requireInt16Arithmetic(loc, type.getBasicTypeString().c_str(), \"(u)int16 types can only be in uniform block or buffer storage\");\n    if (!parsingBuiltins && type.contains8BitInt())\n        requireInt8Arithmetic(loc, type.getBasicTypeString().c_str(), \"(u)int8 types can only be in uniform block or buffer storage\");\n}\n\nbool TParseContext::containsFieldWithBasicType(const TType& type, TBasicType basicType)\n{\n    if (type.getBasicType() == basicType)\n        return true;\n\n    if (type.getBasicType() == EbtStruct) {\n        const TTypeList& structure = *type.getStruct();\n        for (unsigned int i = 0; i < structure.size(); ++i) {\n            if (containsFieldWithBasicType(*structure[i].type, basicType))\n                return true;\n        }\n    }\n\n    return false;\n}\n\n//\n// Do size checking for an array type's size.\n//\nvoid TParseContext::arraySizeCheck(const TSourceLoc& loc, TIntermTyped* expr, TArraySize& sizePair,\n                                   const char* sizeType, const bool isTypeParameter)\n{\n    bool isConst = false;\n    sizePair.node = nullptr;\n\n    int size = 1;\n\n    TIntermConstantUnion* constant = expr->getAsConstantUnion();\n    if (constant) {\n        // handle true (non-specialization) constant\n        size = constant->getConstArray()[0].getIConst();\n        isConst = true;\n    } else {\n        // see if it's a specialization constant instead\n        if (expr->getQualifier().isSpecConstant()) {\n            isConst = true;\n            sizePair.node = expr;\n            TIntermSymbol* symbol = expr->getAsSymbolNode();\n            if (symbol && symbol->getConstArray().size() > 0)\n                size = symbol->getConstArray()[0].getIConst();\n        } else if (expr->getAsUnaryNode() && expr->getAsUnaryNode()->getOp() == glslang::EOpArrayLength &&\n                   expr->getAsUnaryNode()->getOperand()->getType().isCoopMatNV()) {\n            isConst = true;\n            size = 1;\n            sizePair.node = expr->getAsUnaryNode();\n        }\n    }\n\n    sizePair.size = size;\n\n    if (isTypeParameter) {\n        if (extensionTurnedOn(E_GL_NV_cooperative_matrix2)) {\n            if (! isConst || (expr->getBasicType() != EbtInt && expr->getBasicType() != EbtUint && expr->getBasicType() != EbtBool)) {\n                error(loc, sizeType, \"\", \"must be a constant integer or boolean expression\");\n                return;\n            }\n        } else {\n            if (! isConst || (expr->getBasicType() != EbtInt && expr->getBasicType() != EbtUint)) {\n                error(loc, sizeType, \"\", \"must be a constant integer expression\");\n                return;\n            }\n        }\n        if (size < 0) {\n            error(loc, sizeType, \"\", \"must be a non-negative integer\");\n            return;\n        }\n    } else {\n        if (! isConst || (expr->getBasicType() != EbtInt && expr->getBasicType() != EbtUint)) {\n            error(loc, sizeType, \"\", \"must be a constant integer expression\");\n            return;\n        }\n        if (size <= 0) {\n            error(loc, sizeType, \"\", \"must be a positive integer\");\n            return;\n        }\n    }\n}\n\n//\n// See if this qualifier can be an array.\n//\n// Returns true if there is an error.\n//\nbool TParseContext::arrayQualifierError(const TSourceLoc& loc, const TQualifier& qualifier)\n{\n    if (qualifier.storage == EvqConst) {\n        profileRequires(loc, ENoProfile, 120, E_GL_3DL_array_objects, \"const array\");\n        profileRequires(loc, EEsProfile, 300, nullptr, \"const array\");\n    }\n\n    if (qualifier.storage == EvqVaryingIn && language == EShLangVertex) {\n        requireProfile(loc, ~EEsProfile, \"vertex input arrays\");\n        profileRequires(loc, ENoProfile, 150, nullptr, \"vertex input arrays\");\n    }\n\n    return false;\n}\n\n//\n// See if this qualifier and type combination can be an array.\n// Assumes arrayQualifierError() was also called to catch the type-invariant tests.\n//\n// Returns true if there is an error.\n//\nbool TParseContext::arrayError(const TSourceLoc& loc, const TType& type)\n{\n    if (type.getQualifier().storage == EvqVaryingOut && language == EShLangVertex) {\n        if (type.isArrayOfArrays())\n            requireProfile(loc, ~EEsProfile, \"vertex-shader array-of-array output\");\n        else if (type.isStruct())\n            requireProfile(loc, ~EEsProfile, \"vertex-shader array-of-struct output\");\n    }\n    if (type.getQualifier().storage == EvqVaryingIn && language == EShLangFragment) {\n        if (type.isArrayOfArrays())\n            requireProfile(loc, ~EEsProfile, \"fragment-shader array-of-array input\");\n        else if (type.isStruct())\n            requireProfile(loc, ~EEsProfile, \"fragment-shader array-of-struct input\");\n    }\n    if (type.getQualifier().storage == EvqVaryingOut && language == EShLangFragment) {\n        if (type.isArrayOfArrays())\n            requireProfile(loc, ~EEsProfile, \"fragment-shader array-of-array output\");\n    }\n\n    return false;\n}\n\n//\n// Require array to be completely sized\n//\nvoid TParseContext::arraySizeRequiredCheck(const TSourceLoc& loc, const TArraySizes& arraySizes)\n{\n    if (!parsingBuiltins && arraySizes.hasUnsized())\n        error(loc, \"array size required\", \"\", \"\");\n}\n\nvoid TParseContext::structArrayCheck(const TSourceLoc& /*loc*/, const TType& type)\n{\n    const TTypeList& structure = *type.getStruct();\n    for (int m = 0; m < (int)structure.size(); ++m) {\n        const TType& member = *structure[m].type;\n        if (member.isArray())\n            arraySizeRequiredCheck(structure[m].loc, *member.getArraySizes());\n    }\n}\n\nvoid TParseContext::arraySizesCheck(const TSourceLoc& loc, const TQualifier& qualifier, TArraySizes* arraySizes,\n    const TIntermTyped* initializer, bool lastMember)\n{\n    assert(arraySizes);\n\n    // always allow special built-in ins/outs sized to topologies\n    if (parsingBuiltins)\n        return;\n\n    // initializer must be a sized array, in which case\n    // allow the initializer to set any unknown array sizes\n    if (initializer != nullptr) {\n        if (initializer->getType().isUnsizedArray())\n            error(loc, \"array initializer must be sized\", \"[]\", \"\");\n        return;\n    }\n\n    // No environment allows any non-outer-dimension to be implicitly sized\n    if (arraySizes->isInnerUnsized()) {\n        error(loc, \"only outermost dimension of an array of arrays can be implicitly sized\", \"[]\", \"\");\n        arraySizes->clearInnerUnsized();\n    }\n\n    if (arraySizes->isInnerSpecialization() &&\n        (qualifier.storage != EvqTemporary && qualifier.storage != EvqGlobal && qualifier.storage != EvqShared && qualifier.storage != EvqConst))\n        error(loc, \"only outermost dimension of an array of arrays can be a specialization constant\", \"[]\", \"\");\n\n    // desktop always allows outer-dimension-unsized variable arrays,\n    if (!isEsProfile())\n        return;\n\n    // for ES, if size isn't coming from an initializer, it has to be explicitly declared now,\n    // with very few exceptions\n\n    // implicitly-sized io exceptions:\n    switch (language) {\n    case EShLangGeometry:\n        if (qualifier.storage == EvqVaryingIn)\n            if ((isEsProfile() && version >= 320) ||\n                extensionsTurnedOn(Num_AEP_geometry_shader, AEP_geometry_shader))\n                return;\n        break;\n    case EShLangTessControl:\n        if ( qualifier.storage == EvqVaryingIn ||\n            (qualifier.storage == EvqVaryingOut && ! qualifier.isPatch()))\n            if ((isEsProfile() && version >= 320) ||\n                extensionsTurnedOn(Num_AEP_tessellation_shader, AEP_tessellation_shader))\n                return;\n        break;\n    case EShLangTessEvaluation:\n        if ((qualifier.storage == EvqVaryingIn && ! qualifier.isPatch()) ||\n             qualifier.storage == EvqVaryingOut)\n            if ((isEsProfile() && version >= 320) ||\n                extensionsTurnedOn(Num_AEP_tessellation_shader, AEP_tessellation_shader))\n                return;\n        break;\n    case EShLangMesh:\n        if (qualifier.storage == EvqVaryingOut)\n            if ((isEsProfile() && version >= 320) ||\n                extensionsTurnedOn(Num_AEP_mesh_shader, AEP_mesh_shader))\n                return;\n        break;\n    default:\n        break;\n    }\n\n    // last member of ssbo block exception:\n    if (qualifier.storage == EvqBuffer && lastMember)\n        return;\n\n    arraySizeRequiredCheck(loc, *arraySizes);\n}\n\nvoid TParseContext::arrayOfArrayVersionCheck(const TSourceLoc& loc, const TArraySizes* sizes)\n{\n    if (sizes == nullptr || sizes->getNumDims() == 1)\n        return;\n\n    const char* feature = \"arrays of arrays\";\n\n    requireProfile(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, feature);\n    profileRequires(loc, EEsProfile, 310, nullptr, feature);\n    profileRequires(loc, ECoreProfile | ECompatibilityProfile, 430, nullptr, feature);\n}\n\n//\n// Do all the semantic checking for declaring or redeclaring an array, with and\n// without a size, and make the right changes to the symbol table.\n//\nvoid TParseContext::declareArray(const TSourceLoc& loc, const TString& identifier, const TType& type, TSymbol*& symbol)\n{\n    if (symbol == nullptr) {\n        bool currentScope;\n        symbol = symbolTable.find(identifier, nullptr, &currentScope);\n\n        if (symbol && builtInName(identifier) && ! symbolTable.atBuiltInLevel()) {\n            // bad shader (errors already reported) trying to redeclare a built-in name as an array\n            symbol = nullptr;\n            return;\n        }\n        if (symbol == nullptr || ! currentScope) {\n            //\n            // Successfully process a new definition.\n            // (Redeclarations have to take place at the same scope; otherwise they are hiding declarations)\n            //\n            symbol = new TVariable(&identifier, type);\n            symbolTable.insert(*symbol);\n            if (symbolTable.atGlobalLevel())\n                trackLinkage(*symbol);\n\n            if (! symbolTable.atBuiltInLevel()) {\n                if (isIoResizeArray(type)) {\n                    ioArraySymbolResizeList.push_back(symbol);\n                    checkIoArraysConsistency(loc, true);\n                } else\n                    fixIoArraySize(loc, symbol->getWritableType());\n            }\n\n            return;\n        }\n        if (symbol->getAsAnonMember()) {\n            error(loc, \"cannot redeclare a user-block member array\", identifier.c_str(), \"\");\n            symbol = nullptr;\n            return;\n        }\n    }\n\n    //\n    // Process a redeclaration.\n    //\n\n    if (symbol == nullptr) {\n        error(loc, \"array variable name expected\", identifier.c_str(), \"\");\n        return;\n    }\n\n    // redeclareBuiltinVariable() should have already done the copyUp()\n    TType& existingType = symbol->getWritableType();\n\n    if (! existingType.isArray()) {\n        error(loc, \"redeclaring non-array as array\", identifier.c_str(), \"\");\n        return;\n    }\n\n    if (! existingType.sameElementType(type)) {\n        error(loc, \"redeclaration of array with a different element type\", identifier.c_str(), \"\");\n        return;\n    }\n\n    if (! existingType.sameInnerArrayness(type)) {\n        error(loc, \"redeclaration of array with a different array dimensions or sizes\", identifier.c_str(), \"\");\n        return;\n    }\n\n    if (existingType.isSizedArray()) {\n        // be more leniant for input arrays to geometry shaders and tessellation control outputs, where the redeclaration is the same size\n        if (! (isIoResizeArray(type) && existingType.getOuterArraySize() == type.getOuterArraySize()))\n            error(loc, \"redeclaration of array with size\", identifier.c_str(), \"\");\n        return;\n    }\n\n    arrayLimitCheck(loc, identifier, type.getOuterArraySize());\n\n    existingType.updateArraySizes(type);\n\n    if (isIoResizeArray(type))\n        checkIoArraysConsistency(loc);\n}\n\n// Policy and error check for needing a runtime sized array.\nvoid TParseContext::checkRuntimeSizable(const TSourceLoc& loc, const TIntermTyped& base)\n{\n    // runtime length implies runtime sizeable, so no problem\n    if (isRuntimeLength(base))\n        return;\n\n    if (base.getType().getQualifier().builtIn == EbvSampleMask)\n        return;\n\n    // Check for last member of a bufferreference type, which is runtime sizeable\n    // but doesn't support runtime length\n    if (base.getType().getQualifier().storage == EvqBuffer) {\n        const TIntermBinary* binary = base.getAsBinaryNode();\n        if (binary != nullptr &&\n            binary->getOp() == EOpIndexDirectStruct &&\n            binary->getLeft()->isReference()) {\n\n            const int index = binary->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst();\n            const int memberCount = (int)binary->getLeft()->getType().getReferentType()->getStruct()->size();\n            if (index == memberCount - 1)\n                return;\n        }\n    }\n\n    // check for additional things allowed by GL_EXT_nonuniform_qualifier\n    if (base.getBasicType() == EbtSampler || base.getBasicType() == EbtAccStruct || base.getBasicType() == EbtRayQuery ||\n        base.getBasicType() == EbtHitObjectNV || (base.getBasicType() == EbtBlock && base.getType().getQualifier().isUniformOrBuffer()))\n        requireExtensions(loc, 1, &E_GL_EXT_nonuniform_qualifier, \"variable index\");\n    else\n        error(loc, \"\", \"[\", \"array must be redeclared with a size before being indexed with a variable\");\n}\n\n// Policy decision for whether a run-time .length() is allowed.\nbool TParseContext::isRuntimeLength(const TIntermTyped& base) const\n{\n    if (base.getType().getQualifier().storage == EvqBuffer) {\n        // in a buffer block\n        const TIntermBinary* binary = base.getAsBinaryNode();\n        if (binary != nullptr && binary->getOp() == EOpIndexDirectStruct) {\n            // is it the last member?\n            const int index = binary->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst();\n\n            if (binary->getLeft()->isReference())\n                return false;\n\n            const int memberCount = (int)binary->getLeft()->getType().getStruct()->size();\n            if (index == memberCount - 1)\n                return true;\n        }\n    }\n\n    return false;\n}\n\n// Check if mesh perviewNV attributes have a view dimension\n// and resize it to gl_MaxMeshViewCountNV when implicitly sized.\nvoid TParseContext::checkAndResizeMeshViewDim(const TSourceLoc& loc, TType& type, bool isBlockMember)\n{\n    // see if member is a per-view attribute\n    if (!type.getQualifier().isPerView())\n        return;\n\n    if ((isBlockMember && type.isArray()) || (!isBlockMember && type.isArrayOfArrays())) {\n        // since we don't have the maxMeshViewCountNV set during parsing builtins, we hardcode the value.\n        int maxViewCount = parsingBuiltins ? 4 : resources.maxMeshViewCountNV;\n        // For block members, outermost array dimension is the view dimension.\n        // For non-block members, outermost array dimension is the vertex/primitive dimension\n        // and 2nd outermost is the view dimension.\n        int viewDim = isBlockMember ? 0 : 1;\n        int viewDimSize = type.getArraySizes()->getDimSize(viewDim);\n\n        if (viewDimSize != UnsizedArraySize && viewDimSize != maxViewCount)\n            error(loc, \"mesh view output array size must be gl_MaxMeshViewCountNV or implicitly sized\", \"[]\", \"\");\n        else if (viewDimSize == UnsizedArraySize)\n            type.getArraySizes()->setDimSize(viewDim, maxViewCount);\n    }\n    else {\n        error(loc, \"requires a view array dimension\", \"perviewNV\", \"\");\n    }\n}\n\n// Returns true if the first argument to the #line directive is the line number for the next line.\n//\n// Desktop, pre-version 3.30:  \"After processing this directive\n// (including its new-line), the implementation will behave as if it is compiling at line number line+1 and\n// source string number source-string-number.\"\n//\n// Desktop, version 3.30 and later, and ES:  \"After processing this directive\n// (including its new-line), the implementation will behave as if it is compiling at line number line and\n// source string number source-string-number.\nbool TParseContext::lineDirectiveShouldSetNextLine() const\n{\n    return isEsProfile() || version >= 330;\n}\n\n//\n// Enforce non-initializer type/qualifier rules.\n//\nvoid TParseContext::nonInitConstCheck(const TSourceLoc& loc, TString& identifier, TType& type)\n{\n    //\n    // Make the qualifier make sense, given that there is not an initializer.\n    //\n    if (type.getQualifier().storage == EvqConst ||\n        type.getQualifier().storage == EvqConstReadOnly) {\n        type.getQualifier().makeTemporary();\n        error(loc, \"variables with qualifier 'const' must be initialized\", identifier.c_str(), \"\");\n    }\n}\n\n//\n// See if the identifier is a built-in symbol that can be redeclared, and if so,\n// copy the symbol table's read-only built-in variable to the current\n// global level, where it can be modified based on the passed in type.\n//\n// Returns nullptr if no redeclaration took place; meaning a normal declaration still\n// needs to occur for it, not necessarily an error.\n//\n// Returns a redeclared and type-modified variable if a redeclarated occurred.\n//\nTSymbol* TParseContext::redeclareBuiltinVariable(const TSourceLoc& loc, const TString& identifier,\n                                                 const TQualifier& qualifier, const TShaderQualifiers& publicType)\n{\n    if (! builtInName(identifier) || symbolTable.atBuiltInLevel() || ! symbolTable.atGlobalLevel())\n        return nullptr;\n\n    bool nonEsRedecls = (!isEsProfile() && (version >= 130 || identifier == \"gl_TexCoord\"));\n    bool    esRedecls = (isEsProfile() &&\n                         (version >= 320 || extensionsTurnedOn(Num_AEP_shader_io_blocks, AEP_shader_io_blocks)));\n    if (! esRedecls && ! nonEsRedecls)\n        return nullptr;\n\n    // Special case when using GL_ARB_separate_shader_objects\n    bool ssoPre150 = false;  // means the only reason this variable is redeclared is due to this combination\n    if (!isEsProfile() && version <= 140 && extensionTurnedOn(E_GL_ARB_separate_shader_objects)) {\n        if (identifier == \"gl_Position\"     ||\n            identifier == \"gl_PointSize\"    ||\n            identifier == \"gl_ClipVertex\"   ||\n            identifier == \"gl_FogFragCoord\")\n            ssoPre150 = true;\n    }\n\n    // Potentially redeclaring a built-in variable...\n\n    if (ssoPre150 ||\n        (identifier == \"gl_FragDepth\"           && ((nonEsRedecls && version >= 420) || esRedecls)) ||\n        (identifier == \"gl_FragCoord\"           && ((nonEsRedecls && version >= 140) || esRedecls)) ||\n         identifier == \"gl_ClipDistance\"                                                            ||\n         identifier == \"gl_CullDistance\"                                                            ||\n         identifier == \"gl_ShadingRateEXT\"                                                          ||\n         identifier == \"gl_PrimitiveShadingRateEXT\"                                                 ||\n         identifier == \"gl_FrontColor\"                                                              ||\n         identifier == \"gl_BackColor\"                                                               ||\n         identifier == \"gl_FrontSecondaryColor\"                                                     ||\n         identifier == \"gl_BackSecondaryColor\"                                                      ||\n         identifier == \"gl_SecondaryColor\"                                                          ||\n        (identifier == \"gl_Color\"               && language == EShLangFragment)                     ||\n        (identifier == \"gl_FragStencilRefARB\"   && (nonEsRedecls && version >= 140)\n                                                && language == EShLangFragment)                     ||\n         identifier == \"gl_SampleMask\"                                                              ||\n         identifier == \"gl_Layer\"                                                                   ||\n         identifier == \"gl_PrimitiveIndicesNV\"                                                      ||\n         identifier == \"gl_PrimitivePointIndicesEXT\"                                                ||\n         identifier == \"gl_PrimitiveLineIndicesEXT\"                                                 ||\n         identifier == \"gl_PrimitiveTriangleIndicesEXT\"                                             ||\n         identifier == \"gl_TexCoord\") {\n\n        // Find the existing symbol, if any.\n        bool builtIn;\n        TSymbol* symbol = symbolTable.find(identifier, &builtIn);\n\n        // If the symbol was not found, this must be a version/profile/stage\n        // that doesn't have it.\n        if (! symbol)\n            return nullptr;\n\n        // If it wasn't at a built-in level, then it's already been redeclared;\n        // that is, this is a redeclaration of a redeclaration; reuse that initial\n        // redeclaration.  Otherwise, make the new one.\n        if (builtIn) {\n            makeEditable(symbol);\n            symbolTable.amendSymbolIdLevel(*symbol);\n        }\n\n        // Now, modify the type of the copy, as per the type of the current redeclaration.\n\n        TQualifier& symbolQualifier = symbol->getWritableType().getQualifier();\n        if (ssoPre150) {\n            if (intermediate.inIoAccessed(identifier))\n                error(loc, \"cannot redeclare after use\", identifier.c_str(), \"\");\n            if (qualifier.hasLayout())\n                error(loc, \"cannot apply layout qualifier to\", \"redeclaration\", symbol->getName().c_str());\n            if (qualifier.isMemory() || qualifier.isAuxiliary() || (language == EShLangVertex   && qualifier.storage != EvqVaryingOut) ||\n                                                                   (language == EShLangFragment && qualifier.storage != EvqVaryingIn))\n                error(loc, \"cannot change storage, memory, or auxiliary qualification of\", \"redeclaration\", symbol->getName().c_str());\n            if (! qualifier.smooth)\n                error(loc, \"cannot change interpolation qualification of\", \"redeclaration\", symbol->getName().c_str());\n        } else if (identifier == \"gl_FrontColor\"          ||\n                   identifier == \"gl_BackColor\"           ||\n                   identifier == \"gl_FrontSecondaryColor\" ||\n                   identifier == \"gl_BackSecondaryColor\"  ||\n                   identifier == \"gl_SecondaryColor\"      ||\n                   identifier == \"gl_Color\") {\n            symbolQualifier.flat = qualifier.flat;\n            symbolQualifier.smooth = qualifier.smooth;\n            symbolQualifier.nopersp = qualifier.nopersp;\n            if (qualifier.hasLayout())\n                error(loc, \"cannot apply layout qualifier to\", \"redeclaration\", symbol->getName().c_str());\n            if (qualifier.isMemory() || qualifier.isAuxiliary() || symbol->getType().getQualifier().storage != qualifier.storage)\n                error(loc, \"cannot change storage, memory, or auxiliary qualification of\", \"redeclaration\", symbol->getName().c_str());\n        } else if (identifier == \"gl_TexCoord\"     ||\n                   identifier == \"gl_ClipDistance\" ||\n                   identifier == \"gl_CullDistance\") {\n            if (qualifier.hasLayout() || qualifier.isMemory() || qualifier.isAuxiliary() ||\n                qualifier.nopersp != symbolQualifier.nopersp || qualifier.flat != symbolQualifier.flat ||\n                symbolQualifier.storage != qualifier.storage)\n                error(loc, \"cannot change qualification of\", \"redeclaration\", symbol->getName().c_str());\n        } else if (identifier == \"gl_FragCoord\") {\n            if (!intermediate.getTexCoordRedeclared() && intermediate.inIoAccessed(\"gl_FragCoord\"))\n                error(loc, \"cannot redeclare after use\", \"gl_FragCoord\", \"\");\n            if (qualifier.nopersp != symbolQualifier.nopersp || qualifier.flat != symbolQualifier.flat ||\n                qualifier.isMemory() || qualifier.isAuxiliary())\n                error(loc, \"can only change layout qualification of\", \"redeclaration\", symbol->getName().c_str());\n            if (qualifier.storage != EvqVaryingIn)\n                error(loc, \"cannot change input storage qualification of\", \"redeclaration\", symbol->getName().c_str());\n            if (! builtIn && (publicType.pixelCenterInteger != intermediate.getPixelCenterInteger() ||\n                              publicType.originUpperLeft != intermediate.getOriginUpperLeft()))\n                error(loc, \"cannot redeclare with different qualification:\", \"redeclaration\", symbol->getName().c_str());\n\n\n            intermediate.setTexCoordRedeclared();\n            if (publicType.pixelCenterInteger)\n                intermediate.setPixelCenterInteger();\n            if (publicType.originUpperLeft)\n                intermediate.setOriginUpperLeft();\n        } else if (identifier == \"gl_FragDepth\") {\n            if (qualifier.nopersp != symbolQualifier.nopersp || qualifier.flat != symbolQualifier.flat ||\n                qualifier.isMemory() || qualifier.isAuxiliary())\n                error(loc, \"can only change layout qualification of\", \"redeclaration\", symbol->getName().c_str());\n            if (qualifier.storage != EvqVaryingOut)\n                error(loc, \"cannot change output storage qualification of\", \"redeclaration\", symbol->getName().c_str());\n            if (publicType.layoutDepth != EldNone) {\n                if (intermediate.inIoAccessed(\"gl_FragDepth\"))\n                    error(loc, \"cannot redeclare after use\", \"gl_FragDepth\", \"\");\n                if (! intermediate.setDepth(publicType.layoutDepth))\n                    error(loc, \"all redeclarations must use the same depth layout on\", \"redeclaration\", symbol->getName().c_str());\n            }\n        } else if (identifier == \"gl_FragStencilRefARB\") {\n            if (qualifier.nopersp != symbolQualifier.nopersp || qualifier.flat != symbolQualifier.flat ||\n                qualifier.isMemory() || qualifier.isAuxiliary())\n                error(loc, \"can only change layout qualification of\", \"redeclaration\", symbol->getName().c_str());\n            if (qualifier.storage != EvqVaryingOut)\n                error(loc, \"cannot change output storage qualification of\", \"redeclaration\", symbol->getName().c_str());\n            if (publicType.layoutStencil != ElsNone) {\n                if (intermediate.inIoAccessed(\"gl_FragStencilRefARB\"))\n                    error(loc, \"cannot redeclare after use\", \"gl_FragStencilRefARB\", \"\");\n                if (!intermediate.setStencil(publicType.layoutStencil))\n                    error(loc, \"all redeclarations must use the same stencil layout on\", \"redeclaration\",\n                          symbol->getName().c_str());\n            }\n        }\n        else if (\n            identifier == \"gl_PrimitiveIndicesNV\") {\n            if (qualifier.hasLayout())\n                error(loc, \"cannot apply layout qualifier to\", \"redeclaration\", symbol->getName().c_str());\n            if (qualifier.storage != EvqVaryingOut)\n                error(loc, \"cannot change output storage qualification of\", \"redeclaration\", symbol->getName().c_str());\n        }\n        else if (identifier == \"gl_SampleMask\") {\n            if (!publicType.layoutOverrideCoverage) {\n                error(loc, \"redeclaration only allowed for override_coverage layout\", \"redeclaration\", symbol->getName().c_str());\n            }\n            intermediate.setLayoutOverrideCoverage();\n        }\n        else if (identifier == \"gl_Layer\") {\n            if (!qualifier.layoutViewportRelative && qualifier.layoutSecondaryViewportRelativeOffset == -2048)\n                error(loc, \"redeclaration only allowed for viewport_relative or secondary_view_offset layout\", \"redeclaration\", symbol->getName().c_str());\n            symbolQualifier.layoutViewportRelative = qualifier.layoutViewportRelative;\n            symbolQualifier.layoutSecondaryViewportRelativeOffset = qualifier.layoutSecondaryViewportRelativeOffset;\n        }\n\n        // TODO: semantics quality: separate smooth from nothing declared, then use IsInterpolation for several tests above\n\n        return symbol;\n    }\n\n    return nullptr;\n}\n\n//\n// Either redeclare the requested block, or give an error message why it can't be done.\n//\n// TODO: functionality: explicitly sizing members of redeclared blocks is not giving them an explicit size\nvoid TParseContext::redeclareBuiltinBlock(const TSourceLoc& loc, TTypeList& newTypeList, const TString& blockName,\n    const TString* instanceName, TArraySizes* arraySizes)\n{\n    const char* feature = \"built-in block redeclaration\";\n    profileRequires(loc, EEsProfile, 320, Num_AEP_shader_io_blocks, AEP_shader_io_blocks, feature);\n    profileRequires(loc, ~EEsProfile, 410, E_GL_ARB_separate_shader_objects, feature);\n\n    if (blockName != \"gl_PerVertex\" && blockName != \"gl_PerFragment\" &&\n        blockName != \"gl_MeshPerVertexNV\" && blockName != \"gl_MeshPerPrimitiveNV\" &&\n        blockName != \"gl_MeshPerVertexEXT\" && blockName != \"gl_MeshPerPrimitiveEXT\") {\n        error(loc, \"cannot redeclare block: \", \"block declaration\", blockName.c_str());\n        return;\n    }\n\n    // Redeclaring a built-in block...\n\n    if (instanceName && ! builtInName(*instanceName)) {\n        error(loc, \"cannot redeclare a built-in block with a user name\", instanceName->c_str(), \"\");\n        return;\n    }\n\n    // Blocks with instance names are easy to find, lookup the instance name,\n    // Anonymous blocks need to be found via a member.\n    bool builtIn;\n    TSymbol* block;\n    if (instanceName)\n        block = symbolTable.find(*instanceName, &builtIn);\n    else\n        block = symbolTable.find(newTypeList.front().type->getFieldName(), &builtIn);\n\n    // If the block was not found, this must be a version/profile/stage\n    // that doesn't have it, or the instance name is wrong.\n    const char* errorName = instanceName ? instanceName->c_str() : newTypeList.front().type->getFieldName().c_str();\n    if (! block) {\n        error(loc, \"no declaration found for redeclaration\", errorName, \"\");\n        return;\n    }\n    // Built-in blocks cannot be redeclared more than once, which if happened,\n    // we'd be finding the already redeclared one here, rather than the built in.\n    if (! builtIn) {\n        error(loc, \"can only redeclare a built-in block once, and before any use\", blockName.c_str(), \"\");\n        return;\n    }\n\n    // Copy the block to make a writable version, to insert into the block table after editing.\n    block = symbolTable.copyUpDeferredInsert(block);\n\n    if (block->getType().getBasicType() != EbtBlock) {\n        error(loc, \"cannot redeclare a non block as a block\", errorName, \"\");\n        return;\n    }\n\n    // Fix XFB stuff up, it applies to the order of the redeclaration, not\n    // the order of the original members.\n    if (currentBlockQualifier.storage == EvqVaryingOut && globalOutputDefaults.hasXfbBuffer()) {\n        if (!currentBlockQualifier.hasXfbBuffer())\n            currentBlockQualifier.layoutXfbBuffer = globalOutputDefaults.layoutXfbBuffer;\n        if (!currentBlockQualifier.hasStream())\n            currentBlockQualifier.layoutStream = globalOutputDefaults.layoutStream;\n        fixXfbOffsets(currentBlockQualifier, newTypeList);\n    }\n\n    // Edit and error check the container against the redeclaration\n    //  - remove unused members\n    //  - ensure remaining qualifiers/types match\n\n    TType& type = block->getWritableType();\n\n    // if gl_PerVertex is redeclared for the purpose of passing through \"gl_Position\"\n    // for passthrough purpose, the redeclared block should have the same qualifers as\n    // the current one\n    if (currentBlockQualifier.layoutPassthrough) {\n        type.getQualifier().layoutPassthrough = currentBlockQualifier.layoutPassthrough;\n        type.getQualifier().storage = currentBlockQualifier.storage;\n        type.getQualifier().layoutStream = currentBlockQualifier.layoutStream;\n        type.getQualifier().layoutXfbBuffer = currentBlockQualifier.layoutXfbBuffer;\n    }\n\n    TTypeList::iterator member = type.getWritableStruct()->begin();\n    size_t numOriginalMembersFound = 0;\n    while (member != type.getStruct()->end()) {\n        // look for match\n        bool found = false;\n        TTypeList::const_iterator newMember;\n        TSourceLoc memberLoc;\n        memberLoc.init();\n        for (newMember = newTypeList.begin(); newMember != newTypeList.end(); ++newMember) {\n            if (member->type->getFieldName() == newMember->type->getFieldName()) {\n                found = true;\n                memberLoc = newMember->loc;\n                break;\n            }\n        }\n\n        if (found) {\n            ++numOriginalMembersFound;\n            // - ensure match between redeclared members' types\n            // - check for things that can't be changed\n            // - update things that can be changed\n            TType& oldType = *member->type;\n            const TType& newType = *newMember->type;\n            if (! newType.sameElementType(oldType))\n                error(memberLoc, \"cannot redeclare block member with a different type\", member->type->getFieldName().c_str(), \"\");\n            if (oldType.isArray() != newType.isArray())\n                error(memberLoc, \"cannot change arrayness of redeclared block member\", member->type->getFieldName().c_str(), \"\");\n            else if (! oldType.getQualifier().isPerView() && ! oldType.sameArrayness(newType) && oldType.isSizedArray())\n                error(memberLoc, \"cannot change array size of redeclared block member\", member->type->getFieldName().c_str(), \"\");\n            else if (! oldType.getQualifier().isPerView() && newType.isArray())\n                arrayLimitCheck(loc, member->type->getFieldName(), newType.getOuterArraySize());\n            if (oldType.getQualifier().isPerView() && ! newType.getQualifier().isPerView())\n                error(memberLoc, \"missing perviewNV qualifier to redeclared block member\", member->type->getFieldName().c_str(), \"\");\n            else if (! oldType.getQualifier().isPerView() && newType.getQualifier().isPerView())\n                error(memberLoc, \"cannot add perviewNV qualifier to redeclared block member\", member->type->getFieldName().c_str(), \"\");\n            else if (newType.getQualifier().isPerView()) {\n                if (oldType.getArraySizes()->getNumDims() != newType.getArraySizes()->getNumDims())\n                    error(memberLoc, \"cannot change arrayness of redeclared block member\", member->type->getFieldName().c_str(), \"\");\n                else if (! newType.isUnsizedArray() && newType.getOuterArraySize() != resources.maxMeshViewCountNV)\n                    error(loc, \"mesh view output array size must be gl_MaxMeshViewCountNV or implicitly sized\", \"[]\", \"\");\n                else if (newType.getArraySizes()->getNumDims() == 2) {\n                    int innerDimSize = newType.getArraySizes()->getDimSize(1);\n                    arrayLimitCheck(memberLoc, member->type->getFieldName(), innerDimSize);\n                    oldType.getArraySizes()->setDimSize(1, innerDimSize);\n                }\n            }\n            if (oldType.getQualifier().isPerPrimitive() && ! newType.getQualifier().isPerPrimitive())\n                error(memberLoc, \"missing perprimitiveNV qualifier to redeclared block member\", member->type->getFieldName().c_str(), \"\");\n            else if (! oldType.getQualifier().isPerPrimitive() && newType.getQualifier().isPerPrimitive())\n                error(memberLoc, \"cannot add perprimitiveNV qualifier to redeclared block member\", member->type->getFieldName().c_str(), \"\");\n            if (newType.getQualifier().isMemory())\n                error(memberLoc, \"cannot add memory qualifier to redeclared block member\", member->type->getFieldName().c_str(), \"\");\n            if (newType.getQualifier().hasNonXfbLayout())\n                error(memberLoc, \"cannot add non-XFB layout to redeclared block member\", member->type->getFieldName().c_str(), \"\");\n            if (newType.getQualifier().patch)\n                error(memberLoc, \"cannot add patch to redeclared block member\", member->type->getFieldName().c_str(), \"\");\n            if (newType.getQualifier().hasXfbBuffer() &&\n                newType.getQualifier().layoutXfbBuffer != currentBlockQualifier.layoutXfbBuffer)\n                error(memberLoc, \"member cannot contradict block (or what block inherited from global)\", \"xfb_buffer\", \"\");\n            if (newType.getQualifier().hasStream() &&\n                newType.getQualifier().layoutStream != currentBlockQualifier.layoutStream)\n                error(memberLoc, \"member cannot contradict block (or what block inherited from global)\", \"xfb_stream\", \"\");\n            oldType.getQualifier().centroid = newType.getQualifier().centroid;\n            oldType.getQualifier().sample = newType.getQualifier().sample;\n            oldType.getQualifier().invariant = newType.getQualifier().invariant;\n            oldType.getQualifier().noContraction = newType.getQualifier().noContraction;\n            oldType.getQualifier().smooth = newType.getQualifier().smooth;\n            oldType.getQualifier().flat = newType.getQualifier().flat;\n            oldType.getQualifier().nopersp = newType.getQualifier().nopersp;\n            oldType.getQualifier().layoutXfbOffset = newType.getQualifier().layoutXfbOffset;\n            oldType.getQualifier().layoutXfbBuffer = newType.getQualifier().layoutXfbBuffer;\n            oldType.getQualifier().layoutXfbStride = newType.getQualifier().layoutXfbStride;\n            if (oldType.getQualifier().layoutXfbOffset != TQualifier::layoutXfbBufferEnd) {\n                // If any member has an xfb_offset, then the block's xfb_buffer inherents current xfb_buffer,\n                // and for xfb processing, the member needs it as well, along with xfb_stride.\n                type.getQualifier().layoutXfbBuffer = currentBlockQualifier.layoutXfbBuffer;\n                oldType.getQualifier().layoutXfbBuffer = currentBlockQualifier.layoutXfbBuffer;\n            }\n            if (oldType.isUnsizedArray() && newType.isSizedArray())\n                oldType.changeOuterArraySize(newType.getOuterArraySize());\n\n            //  check and process the member's type, which will include managing xfb information\n            layoutTypeCheck(loc, oldType);\n\n            // go to next member\n            ++member;\n        } else {\n            // For missing members of anonymous blocks that have been redeclared,\n            // hide the original (shared) declaration.\n            // Instance-named blocks can just have the member removed.\n            if (instanceName)\n                member = type.getWritableStruct()->erase(member);\n            else {\n                member->type->hideMember();\n                ++member;\n            }\n        }\n    }\n\n    if (spvVersion.vulkan > 0) {\n        // ...then streams apply to built-in blocks, instead of them being only on stream 0\n        type.getQualifier().layoutStream = currentBlockQualifier.layoutStream;\n    }\n\n    if (numOriginalMembersFound < newTypeList.size())\n        error(loc, \"block redeclaration has extra members\", blockName.c_str(), \"\");\n    if (type.isArray() != (arraySizes != nullptr) ||\n        (type.isArray() && arraySizes != nullptr && type.getArraySizes()->getNumDims() != arraySizes->getNumDims()))\n        error(loc, \"cannot change arrayness of redeclared block\", blockName.c_str(), \"\");\n    else if (type.isArray()) {\n        // At this point, we know both are arrays and both have the same number of dimensions.\n\n        // It is okay for a built-in block redeclaration to be unsized, and keep the size of the\n        // original block declaration.\n        if (!arraySizes->isSized() && type.isSizedArray())\n            arraySizes->changeOuterSize(type.getOuterArraySize());\n\n        // And, okay to be giving a size to the array, by the redeclaration\n        if (!type.isSizedArray() && arraySizes->isSized())\n            type.changeOuterArraySize(arraySizes->getOuterSize());\n\n        // Now, they must match in all dimensions.\n        if (type.isSizedArray() && *type.getArraySizes() != *arraySizes)\n            error(loc, \"cannot change array size of redeclared block\", blockName.c_str(), \"\");\n    }\n\n    symbolTable.insert(*block);\n\n    // Check for general layout qualifier errors\n    layoutObjectCheck(loc, *block);\n\n    // Tracking for implicit sizing of array\n    if (isIoResizeArray(block->getType())) {\n        ioArraySymbolResizeList.push_back(block);\n        checkIoArraysConsistency(loc, true);\n    } else if (block->getType().isArray())\n        fixIoArraySize(loc, block->getWritableType());\n\n    // Save it in the AST for linker use.\n    trackLinkage(*block);\n}\n\nvoid TParseContext::paramCheckFixStorage(const TSourceLoc& loc, const TStorageQualifier& qualifier, TType& type)\n{\n    switch (qualifier) {\n    case EvqConst:\n    case EvqConstReadOnly:\n        type.getQualifier().storage = EvqConstReadOnly;\n        break;\n    case EvqIn:\n    case EvqOut:\n    case EvqInOut:\n    case EvqTileImageEXT:\n        type.getQualifier().storage = qualifier;\n        break;\n    case EvqGlobal:\n    case EvqTemporary:\n        type.getQualifier().storage = EvqIn;\n        break;\n    default:\n        type.getQualifier().storage = EvqIn;\n        error(loc, \"storage qualifier not allowed on function parameter\", GetStorageQualifierString(qualifier), \"\");\n        break;\n    }\n}\n\nvoid TParseContext::paramCheckFix(const TSourceLoc& loc, const TQualifier& qualifier, TType& type)\n{\n    if (qualifier.isMemory()) {\n        type.getQualifier().volatil   = qualifier.volatil;\n        type.getQualifier().nontemporal   = qualifier.nontemporal;\n        type.getQualifier().coherent  = qualifier.coherent;\n        type.getQualifier().devicecoherent  = qualifier.devicecoherent ;\n        type.getQualifier().queuefamilycoherent  = qualifier.queuefamilycoherent;\n        type.getQualifier().workgroupcoherent  = qualifier.workgroupcoherent;\n        type.getQualifier().subgroupcoherent  = qualifier.subgroupcoherent;\n        type.getQualifier().shadercallcoherent = qualifier.shadercallcoherent;\n        type.getQualifier().nonprivate = qualifier.nonprivate;\n        type.getQualifier().readonly  = qualifier.readonly;\n        type.getQualifier().writeonly = qualifier.writeonly;\n        type.getQualifier().restrict  = qualifier.restrict;\n    }\n\n    if (qualifier.isAuxiliary() ||\n        qualifier.isInterpolation())\n        error(loc, \"cannot use auxiliary or interpolation qualifiers on a function parameter\", \"\", \"\");\n    if (qualifier.hasLayout())\n        error(loc, \"cannot use layout qualifiers on a function parameter\", \"\", \"\");\n    if (qualifier.invariant)\n        error(loc, \"cannot use invariant qualifier on a function parameter\", \"\", \"\");\n    if (qualifier.isNoContraction()) {\n        if (qualifier.isParamOutput())\n            type.getQualifier().setNoContraction();\n        else\n            warn(loc, \"qualifier has no effect on non-output parameters\", \"precise\", \"\");\n    }\n    if (qualifier.isNonUniform())\n        type.getQualifier().nonUniform = qualifier.nonUniform;\n    if (qualifier.isSpirvByReference())\n        type.getQualifier().setSpirvByReference();\n    if (qualifier.isSpirvLiteral()) {\n        if (type.getBasicType() == EbtFloat || type.getBasicType() == EbtInt || type.getBasicType() == EbtUint ||\n            type.getBasicType() == EbtBool)\n            type.getQualifier().setSpirvLiteral();\n        else\n            error(loc, \"cannot use spirv_literal qualifier\", type.getBasicTypeString().c_str(), \"\");\n    }\n\n    paramCheckFixStorage(loc, qualifier.storage, type);\n}\n\nvoid TParseContext::nestedBlockCheck(const TSourceLoc& loc)\n{\n    if (structNestingLevel > 0 || blockNestingLevel > 0)\n        error(loc, \"cannot nest a block definition inside a structure or block\", \"\", \"\");\n    ++blockNestingLevel;\n}\n\nvoid TParseContext::nestedStructCheck(const TSourceLoc& loc)\n{\n    if (structNestingLevel > 0 || blockNestingLevel > 0)\n        error(loc, \"cannot nest a structure definition inside a structure or block\", \"\", \"\");\n    ++structNestingLevel;\n}\n\nvoid TParseContext::arrayObjectCheck(const TSourceLoc& loc, const TType& type, const char* op)\n{\n    // Some versions don't allow comparing arrays or structures containing arrays\n    if (type.containsArray()) {\n        profileRequires(loc, ENoProfile, 120, E_GL_3DL_array_objects, op);\n        profileRequires(loc, EEsProfile, 300, nullptr, op);\n    }\n}\n\nvoid TParseContext::opaqueCheck(const TSourceLoc& loc, const TType& type, const char* op)\n{\n    if (containsFieldWithBasicType(type, EbtSampler) && !extensionTurnedOn(E_GL_ARB_bindless_texture))\n        error(loc, \"can't use with samplers or structs containing samplers\", op, \"\");\n}\n\nvoid TParseContext::referenceCheck(const TSourceLoc& loc, const TType& type, const char* op)\n{\n    if (containsFieldWithBasicType(type, EbtReference))\n        error(loc, \"can't use with reference types\", op, \"\");\n}\n\nvoid TParseContext::storage16BitAssignmentCheck(const TSourceLoc& loc, const TType& type, const char* op)\n{\n    if (type.getBasicType() == EbtStruct && containsFieldWithBasicType(type, EbtFloat16))\n        requireFloat16Arithmetic(loc, op, \"can't use with structs containing float16\");\n\n    if (type.isArray() && type.getBasicType() == EbtFloat16)\n        requireFloat16Arithmetic(loc, op, \"can't use with arrays containing float16\");\n\n    if (type.getBasicType() == EbtStruct && containsFieldWithBasicType(type, EbtInt16))\n        requireInt16Arithmetic(loc, op, \"can't use with structs containing int16\");\n\n    if (type.isArray() && type.getBasicType() == EbtInt16)\n        requireInt16Arithmetic(loc, op, \"can't use with arrays containing int16\");\n\n    if (type.getBasicType() == EbtStruct && containsFieldWithBasicType(type, EbtUint16))\n        requireInt16Arithmetic(loc, op, \"can't use with structs containing uint16\");\n\n    if (type.isArray() && type.getBasicType() == EbtUint16)\n        requireInt16Arithmetic(loc, op, \"can't use with arrays containing uint16\");\n\n    if (type.getBasicType() == EbtStruct && containsFieldWithBasicType(type, EbtInt8))\n        requireInt8Arithmetic(loc, op, \"can't use with structs containing int8\");\n\n    if (type.isArray() && type.getBasicType() == EbtInt8)\n        requireInt8Arithmetic(loc, op, \"can't use with arrays containing int8\");\n\n    if (type.getBasicType() == EbtStruct && containsFieldWithBasicType(type, EbtUint8))\n        requireInt8Arithmetic(loc, op, \"can't use with structs containing uint8\");\n\n    if (type.isArray() && type.getBasicType() == EbtUint8)\n        requireInt8Arithmetic(loc, op, \"can't use with arrays containing uint8\");\n}\n\nvoid TParseContext::specializationCheck(const TSourceLoc& loc, const TType& type, const char* op)\n{\n    if (type.containsSpecializationSize())\n        error(loc, \"can't use with types containing arrays sized with a specialization constant\", op, \"\");\n}\n\nvoid TParseContext::structTypeCheck(const TSourceLoc& /*loc*/, TPublicType& publicType)\n{\n    const TTypeList& typeList = *publicType.userDef->getStruct();\n\n    // fix and check for member storage qualifiers and types that don't belong within a structure\n    for (unsigned int member = 0; member < typeList.size(); ++member) {\n        TQualifier& memberQualifier = typeList[member].type->getQualifier();\n        const TSourceLoc& memberLoc = typeList[member].loc;\n        if (memberQualifier.isAuxiliary() ||\n            memberQualifier.isInterpolation() ||\n            (memberQualifier.storage != EvqTemporary && memberQualifier.storage != EvqGlobal))\n            error(memberLoc, \"cannot use storage or interpolation qualifiers on structure members\", typeList[member].type->getFieldName().c_str(), \"\");\n        if (memberQualifier.isMemory())\n            error(memberLoc, \"cannot use memory qualifiers on structure members\", typeList[member].type->getFieldName().c_str(), \"\");\n        if (memberQualifier.hasLayout()) {\n            error(memberLoc, \"cannot use layout qualifiers on structure members\", typeList[member].type->getFieldName().c_str(), \"\");\n            memberQualifier.clearLayout();\n        }\n        if (memberQualifier.invariant)\n            error(memberLoc, \"cannot use invariant qualifier on structure members\", typeList[member].type->getFieldName().c_str(), \"\");\n    }\n}\n\n//\n// See if this loop satisfies the limitations for ES 2.0 (version 100) for loops in Appendex A:\n//\n// \"The loop index has type int or float.\n//\n// \"The for statement has the form:\n//     for ( init-declaration ; condition ; expression )\n//     init-declaration has the form: type-specifier identifier = constant-expression\n//     condition has the form:  loop-index relational_operator constant-expression\n//         where relational_operator is one of: > >= < <= == or !=\n//     expression [sic] has one of the following forms:\n//         loop-index++\n//         loop-index--\n//         loop-index += constant-expression\n//         loop-index -= constant-expression\n//\n// The body is handled in an AST traversal.\n//\nvoid TParseContext::inductiveLoopCheck(const TSourceLoc& loc, TIntermNode* init, TIntermLoop* loop)\n{\n    // loop index init must exist and be a declaration, which shows up in the AST as an aggregate of size 1 of the declaration\n    bool badInit = false;\n    if (! init || ! init->getAsAggregate() || init->getAsAggregate()->getSequence().size() != 1)\n        badInit = true;\n    TIntermBinary* binaryInit = nullptr;\n    if (! badInit) {\n        // get the declaration assignment\n        binaryInit = init->getAsAggregate()->getSequence()[0]->getAsBinaryNode();\n        if (! binaryInit)\n            badInit = true;\n    }\n    if (badInit) {\n        error(loc, \"inductive-loop init-declaration requires the form \\\"type-specifier loop-index = constant-expression\\\"\", \"limitations\", \"\");\n        return;\n    }\n\n    // loop index must be type int or float\n    if (! binaryInit->getType().isScalar() || (binaryInit->getBasicType() != EbtInt && binaryInit->getBasicType() != EbtFloat)) {\n        error(loc, \"inductive loop requires a scalar 'int' or 'float' loop index\", \"limitations\", \"\");\n        return;\n    }\n\n    // init is the form \"loop-index = constant\"\n    if (binaryInit->getOp() != EOpAssign || ! binaryInit->getLeft()->getAsSymbolNode() || ! binaryInit->getRight()->getAsConstantUnion()) {\n        error(loc, \"inductive-loop init-declaration requires the form \\\"type-specifier loop-index = constant-expression\\\"\", \"limitations\", \"\");\n        return;\n    }\n\n    // get the unique id of the loop index\n    long long loopIndex = binaryInit->getLeft()->getAsSymbolNode()->getId();\n    inductiveLoopIds.insert(loopIndex);\n\n    // condition's form must be \"loop-index relational-operator constant-expression\"\n    bool badCond = ! loop->getTest();\n    if (! badCond) {\n        TIntermBinary* binaryCond = loop->getTest()->getAsBinaryNode();\n        badCond = ! binaryCond;\n        if (! badCond) {\n            switch (binaryCond->getOp()) {\n            case EOpGreaterThan:\n            case EOpGreaterThanEqual:\n            case EOpLessThan:\n            case EOpLessThanEqual:\n            case EOpEqual:\n            case EOpNotEqual:\n                break;\n            default:\n                badCond = true;\n            }\n        }\n        if (binaryCond && (! binaryCond->getLeft()->getAsSymbolNode() ||\n                           binaryCond->getLeft()->getAsSymbolNode()->getId() != loopIndex ||\n                           ! binaryCond->getRight()->getAsConstantUnion()))\n            badCond = true;\n    }\n    if (badCond) {\n        error(loc, \"inductive-loop condition requires the form \\\"loop-index <comparison-op> constant-expression\\\"\", \"limitations\", \"\");\n        return;\n    }\n\n    // loop-index++\n    // loop-index--\n    // loop-index += constant-expression\n    // loop-index -= constant-expression\n    bool badTerminal = ! loop->getTerminal();\n    if (! badTerminal) {\n        TIntermUnary* unaryTerminal = loop->getTerminal()->getAsUnaryNode();\n        TIntermBinary* binaryTerminal = loop->getTerminal()->getAsBinaryNode();\n        if (unaryTerminal || binaryTerminal) {\n            switch(loop->getTerminal()->getAsOperator()->getOp()) {\n            case EOpPostDecrement:\n            case EOpPostIncrement:\n            case EOpAddAssign:\n            case EOpSubAssign:\n                break;\n            default:\n                badTerminal = true;\n            }\n        } else\n            badTerminal = true;\n        if (binaryTerminal && (! binaryTerminal->getLeft()->getAsSymbolNode() ||\n                               binaryTerminal->getLeft()->getAsSymbolNode()->getId() != loopIndex ||\n                               ! binaryTerminal->getRight()->getAsConstantUnion()))\n            badTerminal = true;\n        if (unaryTerminal && (! unaryTerminal->getOperand()->getAsSymbolNode() ||\n                              unaryTerminal->getOperand()->getAsSymbolNode()->getId() != loopIndex))\n            badTerminal = true;\n    }\n    if (badTerminal) {\n        error(loc, \"inductive-loop termination requires the form \\\"loop-index++, loop-index--, loop-index += constant-expression, or loop-index -= constant-expression\\\"\", \"limitations\", \"\");\n        return;\n    }\n\n    // the body\n    inductiveLoopBodyCheck(loop->getBody(), loopIndex, symbolTable);\n}\n\n// Do limit checks for built-in arrays.\nvoid TParseContext::arrayLimitCheck(const TSourceLoc& loc, const TString& identifier, int size)\n{\n    if (identifier.compare(\"gl_TexCoord\") == 0)\n        limitCheck(loc, size, \"gl_MaxTextureCoords\", \"gl_TexCoord array size\");\n    else if (identifier.compare(\"gl_ClipDistance\") == 0)\n        limitCheck(loc, size, \"gl_MaxClipDistances\", \"gl_ClipDistance array size\");\n    else if (identifier.compare(\"gl_CullDistance\") == 0)\n        limitCheck(loc, size, \"gl_MaxCullDistances\", \"gl_CullDistance array size\");\n    else if (identifier.compare(\"gl_ClipDistancePerViewNV\") == 0)\n        limitCheck(loc, size, \"gl_MaxClipDistances\", \"gl_ClipDistancePerViewNV array size\");\n    else if (identifier.compare(\"gl_CullDistancePerViewNV\") == 0)\n        limitCheck(loc, size, \"gl_MaxCullDistances\", \"gl_CullDistancePerViewNV array size\");\n}\n\n// See if the provided value is less than or equal to the symbol indicated by limit,\n// which should be a constant in the symbol table.\nvoid TParseContext::limitCheck(const TSourceLoc& loc, int value, const char* limit, const char* feature)\n{\n    TSymbol* symbol = symbolTable.find(limit);\n    assert(symbol->getAsVariable());\n    const TConstUnionArray& constArray = symbol->getAsVariable()->getConstArray();\n    assert(! constArray.empty());\n    if (value > constArray[0].getIConst())\n        error(loc, \"must be less than or equal to\", feature, \"%s (%d)\", limit, constArray[0].getIConst());\n}\n\n//\n// Do any additional error checking, etc., once we know the parsing is done.\n//\nvoid TParseContext::finish()\n{\n    TParseContextBase::finish();\n\n    if (parsingBuiltins)\n        return;\n\n    // Check on array indexes for ES 2.0 (version 100) limitations.\n    for (size_t i = 0; i < needsIndexLimitationChecking.size(); ++i)\n        constantIndexExpressionCheck(needsIndexLimitationChecking[i]);\n\n    // Check for stages that are enabled by extension.\n    // Can't do this at the beginning, it is chicken and egg to add a stage by\n    // extension.\n    // Stage-specific features were correctly tested for already, this is just\n    // about the stage itself.\n    switch (language) {\n    case EShLangGeometry:\n        if (isEsProfile() && version == 310)\n            requireExtensions(getCurrentLoc(), Num_AEP_geometry_shader, AEP_geometry_shader, \"geometry shaders\");\n        break;\n    case EShLangTessControl:\n    case EShLangTessEvaluation:\n        if (isEsProfile() && version == 310)\n            requireExtensions(getCurrentLoc(), Num_AEP_tessellation_shader, AEP_tessellation_shader, \"tessellation shaders\");\n        else if (!isEsProfile() && version < 400)\n            requireExtensions(getCurrentLoc(), 1, &E_GL_ARB_tessellation_shader, \"tessellation shaders\");\n        break;\n    case EShLangCompute:\n        if (!isEsProfile() && version < 430)\n            requireExtensions(getCurrentLoc(), 1, &E_GL_ARB_compute_shader, \"compute shaders\");\n        break;\n    case EShLangTask:\n        requireExtensions(getCurrentLoc(), Num_AEP_mesh_shader, AEP_mesh_shader, \"task shaders\");\n        break;\n    case EShLangMesh:\n        requireExtensions(getCurrentLoc(), Num_AEP_mesh_shader, AEP_mesh_shader, \"mesh shaders\");\n        break;\n    default:\n        break;\n    }\n\n    // Set default outputs for GL_NV_geometry_shader_passthrough\n    if (language == EShLangGeometry && extensionTurnedOn(E_SPV_NV_geometry_shader_passthrough)) {\n        if (intermediate.getOutputPrimitive() == ElgNone) {\n            switch (intermediate.getInputPrimitive()) {\n            case ElgPoints:      intermediate.setOutputPrimitive(ElgPoints);    break;\n            case ElgLines:       intermediate.setOutputPrimitive(ElgLineStrip); break;\n            case ElgTriangles:   intermediate.setOutputPrimitive(ElgTriangleStrip); break;\n            default: break;\n            }\n        }\n        if (intermediate.getVertices() == TQualifier::layoutNotSet) {\n            switch (intermediate.getInputPrimitive()) {\n            case ElgPoints:      intermediate.setVertices(1); break;\n            case ElgLines:       intermediate.setVertices(2); break;\n            case ElgTriangles:   intermediate.setVertices(3); break;\n            default: break;\n            }\n        }\n    }\n}\n\n//\n// Layout qualifier stuff.\n//\n\n// Put the id's layout qualification into the public type, for qualifiers not having a number set.\n// This is before we know any type information for error checking.\nvoid TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publicType, TString& id)\n{\n    std::transform(id.begin(), id.end(), id.begin(), ::tolower);\n\n    if (id == TQualifier::getLayoutMatrixString(ElmColumnMajor)) {\n        publicType.qualifier.layoutMatrix = ElmColumnMajor;\n        return;\n    }\n    if (id == TQualifier::getLayoutMatrixString(ElmRowMajor)) {\n        publicType.qualifier.layoutMatrix = ElmRowMajor;\n        return;\n    }\n    if (id == TQualifier::getLayoutPackingString(ElpPacked)) {\n        if (spvVersion.spv != 0) {\n            if (spvVersion.vulkanRelaxed)\n                return; // silently ignore qualifier\n            else\n                spvRemoved(loc, \"packed\");\n        }\n        publicType.qualifier.layoutPacking = ElpPacked;\n        return;\n    }\n    if (id == TQualifier::getLayoutPackingString(ElpShared)) {\n        if (spvVersion.spv != 0) {\n            if (spvVersion.vulkanRelaxed)\n                return; // silently ignore qualifier\n            else\n                spvRemoved(loc, \"shared\");\n        }\n        publicType.qualifier.layoutPacking = ElpShared;\n        return;\n    }\n    if (id == TQualifier::getLayoutPackingString(ElpStd140)) {\n        publicType.qualifier.layoutPacking = ElpStd140;\n        return;\n    }\n    if (id == TQualifier::getLayoutPackingString(ElpStd430)) {\n        requireProfile(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, \"std430\");\n        profileRequires(loc, ECoreProfile | ECompatibilityProfile, 430, E_GL_ARB_shader_storage_buffer_object, \"std430\");\n        profileRequires(loc, EEsProfile, 310, nullptr, \"std430\");\n        publicType.qualifier.layoutPacking = ElpStd430;\n        return;\n    }\n    if (id == TQualifier::getLayoutPackingString(ElpScalar)) {\n        requireVulkan(loc, \"scalar\");\n        requireExtensions(loc, 1, &E_GL_EXT_scalar_block_layout, \"scalar block layout\");\n        publicType.qualifier.layoutPacking = ElpScalar;\n        return;\n    }\n    // TODO: compile-time performance: may need to stop doing linear searches\n    for (TLayoutFormat format = (TLayoutFormat)(ElfNone + 1); format < ElfCount; format = (TLayoutFormat)(format + 1)) {\n        if (id == TQualifier::getLayoutFormatString(format)) {\n            if ((format > ElfEsFloatGuard && format < ElfFloatGuard) ||\n                (format > ElfEsIntGuard && format < ElfIntGuard) ||\n                (format > ElfEsUintGuard && format < ElfCount))\n                requireProfile(loc, ENoProfile | ECoreProfile | ECompatibilityProfile, \"image load-store format\");\n            profileRequires(loc, ENoProfile | ECoreProfile | ECompatibilityProfile, 420, E_GL_ARB_shader_image_load_store, \"image load store\");\n            profileRequires(loc, EEsProfile, 310, E_GL_ARB_shader_image_load_store, \"image load store\");\n            publicType.qualifier.layoutFormat = format;\n            return;\n        }\n    }\n    if (id == \"push_constant\") {\n        requireVulkan(loc, \"push_constant\");\n        publicType.qualifier.layoutPushConstant = true;\n        return;\n    }\n    if (id == \"buffer_reference\") {\n        requireVulkan(loc, \"buffer_reference\");\n        requireExtensions(loc, 1, &E_GL_EXT_buffer_reference, \"buffer_reference\");\n        publicType.qualifier.layoutBufferReference = true;\n        intermediate.setUseStorageBuffer();\n        intermediate.setUsePhysicalStorageBuffer();\n        return;\n    }\n    if (id == \"bindless_sampler\") {\n        requireExtensions(loc, 1, &E_GL_ARB_bindless_texture, \"bindless_sampler\");\n        publicType.qualifier.layoutBindlessSampler = true;\n        intermediate.setBindlessTextureMode(currentCaller, AstRefTypeLayout);\n        return;\n    }\n    if (id == \"bindless_image\") {\n        requireExtensions(loc, 1, &E_GL_ARB_bindless_texture, \"bindless_image\");\n        publicType.qualifier.layoutBindlessImage = true;\n        intermediate.setBindlessImageMode(currentCaller, AstRefTypeLayout);\n        return;\n    }\n    if (id == \"bound_sampler\") {\n        requireExtensions(loc, 1, &E_GL_ARB_bindless_texture, \"bound_sampler\");\n        publicType.qualifier.layoutBindlessSampler = false;\n        return;\n    }\n    if (id == \"bound_image\") {\n        requireExtensions(loc, 1, &E_GL_ARB_bindless_texture, \"bound_image\");\n        publicType.qualifier.layoutBindlessImage = false;\n        return;\n    }\n    if (language == EShLangGeometry || language == EShLangTessEvaluation || language == EShLangMesh) {\n        if (id == TQualifier::getGeometryString(ElgTriangles)) {\n            publicType.shaderQualifiers.geometry = ElgTriangles;\n            return;\n        }\n        if (language == EShLangGeometry || language == EShLangMesh) {\n            if (id == TQualifier::getGeometryString(ElgPoints)) {\n                publicType.shaderQualifiers.geometry = ElgPoints;\n                return;\n            }\n            if (id == TQualifier::getGeometryString(ElgLines)) {\n                publicType.shaderQualifiers.geometry = ElgLines;\n                return;\n            }\n            if (language == EShLangGeometry) {\n                if (id == TQualifier::getGeometryString(ElgLineStrip)) {\n                    publicType.shaderQualifiers.geometry = ElgLineStrip;\n                    return;\n                }\n                if (id == TQualifier::getGeometryString(ElgLinesAdjacency)) {\n                    publicType.shaderQualifiers.geometry = ElgLinesAdjacency;\n                    return;\n                }\n                if (id == TQualifier::getGeometryString(ElgTrianglesAdjacency)) {\n                    publicType.shaderQualifiers.geometry = ElgTrianglesAdjacency;\n                    return;\n                }\n                if (id == TQualifier::getGeometryString(ElgTriangleStrip)) {\n                    publicType.shaderQualifiers.geometry = ElgTriangleStrip;\n                    return;\n                }\n                if (id == \"passthrough\") {\n                    requireExtensions(loc, 1, &E_SPV_NV_geometry_shader_passthrough, \"geometry shader passthrough\");\n                    publicType.qualifier.layoutPassthrough = true;\n                    intermediate.setGeoPassthroughEXT();\n                    return;\n                }\n            }\n        } else {\n            assert(language == EShLangTessEvaluation);\n\n            // input primitive\n            if (id == TQualifier::getGeometryString(ElgTriangles)) {\n                publicType.shaderQualifiers.geometry = ElgTriangles;\n                return;\n            }\n            if (id == TQualifier::getGeometryString(ElgQuads)) {\n                publicType.shaderQualifiers.geometry = ElgQuads;\n                return;\n            }\n            if (id == TQualifier::getGeometryString(ElgIsolines)) {\n                publicType.shaderQualifiers.geometry = ElgIsolines;\n                return;\n            }\n\n            // vertex spacing\n            if (id == TQualifier::getVertexSpacingString(EvsEqual)) {\n                publicType.shaderQualifiers.spacing = EvsEqual;\n                return;\n            }\n            if (id == TQualifier::getVertexSpacingString(EvsFractionalEven)) {\n                publicType.shaderQualifiers.spacing = EvsFractionalEven;\n                return;\n            }\n            if (id == TQualifier::getVertexSpacingString(EvsFractionalOdd)) {\n                publicType.shaderQualifiers.spacing = EvsFractionalOdd;\n                return;\n            }\n\n            // triangle order\n            if (id == TQualifier::getVertexOrderString(EvoCw)) {\n                publicType.shaderQualifiers.order = EvoCw;\n                return;\n            }\n            if (id == TQualifier::getVertexOrderString(EvoCcw)) {\n                publicType.shaderQualifiers.order = EvoCcw;\n                return;\n            }\n\n            // point mode\n            if (id == \"point_mode\") {\n                publicType.shaderQualifiers.pointMode = true;\n                return;\n            }\n        }\n    }\n    if (language == EShLangFragment) {\n        if (id == \"origin_upper_left\") {\n            requireProfile(loc, ECoreProfile | ECompatibilityProfile | ENoProfile, \"origin_upper_left\");\n            if (profile == ENoProfile) {\n                profileRequires(loc,ECoreProfile | ECompatibilityProfile, 140, E_GL_ARB_fragment_coord_conventions, \"origin_upper_left\");\n            }\n\n            publicType.shaderQualifiers.originUpperLeft = true;\n            return;\n        }\n        if (id == \"pixel_center_integer\") {\n            requireProfile(loc, ECoreProfile | ECompatibilityProfile | ENoProfile, \"pixel_center_integer\");\n            if (profile == ENoProfile) {\n                profileRequires(loc,ECoreProfile | ECompatibilityProfile, 140, E_GL_ARB_fragment_coord_conventions, \"pixel_center_integer\");\n            }\n            publicType.shaderQualifiers.pixelCenterInteger = true;\n            return;\n        }\n        if (id == \"early_fragment_tests\") {\n            profileRequires(loc, ENoProfile | ECoreProfile | ECompatibilityProfile, 420, E_GL_ARB_shader_image_load_store, \"early_fragment_tests\");\n            profileRequires(loc, EEsProfile, 310, nullptr, \"early_fragment_tests\");\n            publicType.shaderQualifiers.earlyFragmentTests = true;\n            return;\n        }\n        if (id == \"early_and_late_fragment_tests_amd\") {\n            profileRequires(loc, ENoProfile | ECoreProfile | ECompatibilityProfile, 420, E_GL_AMD_shader_early_and_late_fragment_tests, \"early_and_late_fragment_tests_amd\");\n            profileRequires(loc, EEsProfile, 310, nullptr, \"early_and_late_fragment_tests_amd\");\n            publicType.shaderQualifiers.earlyAndLateFragmentTestsAMD = true;\n            return;\n        }\n        if (id == \"post_depth_coverage\") {\n            requireExtensions(loc, Num_post_depth_coverageEXTs, post_depth_coverageEXTs, \"post depth coverage\");\n            if (extensionTurnedOn(E_GL_ARB_post_depth_coverage)) {\n                publicType.shaderQualifiers.earlyFragmentTests = true;\n            }\n            publicType.shaderQualifiers.postDepthCoverage = true;\n            return;\n        }\n        /* id is transformed into lower case in the beginning of this function. */\n        if (id == \"non_coherent_color_attachment_readext\") {\n            requireExtensions(loc, 1, &E_GL_EXT_shader_tile_image, \"non_coherent_color_attachment_readEXT\");\n            publicType.shaderQualifiers.nonCoherentColorAttachmentReadEXT = true;\n            return;\n        }\n        if (id == \"non_coherent_depth_attachment_readext\") {\n            requireExtensions(loc, 1, &E_GL_EXT_shader_tile_image, \"non_coherent_depth_attachment_readEXT\");\n            publicType.shaderQualifiers.nonCoherentDepthAttachmentReadEXT = true;\n            return;\n        }\n        if (id == \"non_coherent_stencil_attachment_readext\") {\n            requireExtensions(loc, 1, &E_GL_EXT_shader_tile_image, \"non_coherent_stencil_attachment_readEXT\");\n            publicType.shaderQualifiers.nonCoherentStencilAttachmentReadEXT = true;\n            return;\n        }\n        for (TLayoutDepth depth = (TLayoutDepth)(EldNone + 1); depth < EldCount; depth = (TLayoutDepth)(depth+1)) {\n            if (id == TQualifier::getLayoutDepthString(depth)) {\n                requireProfile(loc, ECoreProfile | ECompatibilityProfile, \"depth layout qualifier\");\n                profileRequires(loc, ECoreProfile | ECompatibilityProfile, 420, nullptr, \"depth layout qualifier\");\n                publicType.shaderQualifiers.layoutDepth = depth;\n                return;\n            }\n        }\n        for (TLayoutStencil stencil = (TLayoutStencil)(ElsNone + 1); stencil < ElsCount; stencil = (TLayoutStencil)(stencil+1)) {\n            if (id == TQualifier::getLayoutStencilString(stencil)) {\n                requireProfile(loc, ECoreProfile | ECompatibilityProfile, \"stencil layout qualifier\");\n                profileRequires(loc, ECoreProfile | ECompatibilityProfile, 420, nullptr, \"stencil layout qualifier\");\n                publicType.shaderQualifiers.layoutStencil = stencil;\n                return;\n            }\n        }\n        for (TInterlockOrdering order = (TInterlockOrdering)(EioNone + 1); order < EioCount; order = (TInterlockOrdering)(order+1)) {\n            if (id == TQualifier::getInterlockOrderingString(order)) {\n                requireProfile(loc, ECoreProfile | ECompatibilityProfile, \"fragment shader interlock layout qualifier\");\n                profileRequires(loc, ECoreProfile | ECompatibilityProfile, 450, nullptr, \"fragment shader interlock layout qualifier\");\n                requireExtensions(loc, 1, &E_GL_ARB_fragment_shader_interlock, TQualifier::getInterlockOrderingString(order));\n                if (order == EioShadingRateInterlockOrdered || order == EioShadingRateInterlockUnordered)\n                    requireExtensions(loc, 1, &E_GL_NV_shading_rate_image, TQualifier::getInterlockOrderingString(order));\n                publicType.shaderQualifiers.interlockOrdering = order;\n                return;\n            }\n        }\n        if (id.compare(0, 13, \"blend_support\") == 0) {\n            bool found = false;\n            for (TBlendEquationShift be = (TBlendEquationShift)0; be < EBlendCount; be = (TBlendEquationShift)(be + 1)) {\n                if (id == TQualifier::getBlendEquationString(be)) {\n                    profileRequires(loc, EEsProfile, 320, E_GL_KHR_blend_equation_advanced, \"blend equation\");\n                    profileRequires(loc, ~EEsProfile, 0, E_GL_KHR_blend_equation_advanced, \"blend equation\");\n                    intermediate.addBlendEquation(be);\n                    publicType.shaderQualifiers.blendEquation = true;\n                    found = true;\n                    break;\n                }\n            }\n            if (! found)\n                error(loc, \"unknown blend equation\", \"blend_support\", \"\");\n            return;\n        }\n        if (id == \"override_coverage\") {\n            requireExtensions(loc, 1, &E_GL_NV_sample_mask_override_coverage, \"sample mask override coverage\");\n            publicType.shaderQualifiers.layoutOverrideCoverage = true;\n            return;\n        }\n        if (id == \"full_quads\")\n        {\n            const char* feature = \"full_quads qualifier\";\n            requireProfile(loc, ECompatibilityProfile | ECoreProfile | EEsProfile, feature);\n            profileRequires(loc, ECoreProfile | ECompatibilityProfile, 140, E_GL_EXT_shader_quad_control, feature);\n            profileRequires(loc, EEsProfile, 310, E_GL_EXT_shader_quad_control, feature);\n            publicType.qualifier.layoutFullQuads = true;\n            return;\n        }\n        if (id == \"non_coherent_attachment_readqcom\") {\n            requireExtensions(loc, 1, &E_GL_QCOM_tile_shading, \"tile shading QCOM\");\n            publicType.shaderQualifiers.layoutNonCoherentTileAttachmentReadQCOM = true;\n            return;\n        }\n        if (id == \"tile_attachmentqcom\") {\n            requireExtensions(loc, 1, &E_GL_QCOM_tile_shading, \"tile shading QCOM\");\n            publicType.qualifier.layoutTileAttachmentQCOM = true;\n            return;\n        }\n    }\n    if (language == EShLangVertex ||\n        language == EShLangTessControl ||\n        language == EShLangTessEvaluation ||\n        language == EShLangGeometry ) {\n        if (id == \"viewport_relative\") {\n            requireExtensions(loc, 1, &E_GL_NV_viewport_array2, \"view port array2\");\n            publicType.qualifier.layoutViewportRelative = true;\n            return;\n        }\n    } else {\n        if (language == EShLangRayGen || language == EShLangIntersect ||\n        language == EShLangAnyHit || language == EShLangClosestHit ||\n        language == EShLangMiss || language == EShLangCallable) {\n            if (id == \"shaderrecordnv\" || id == \"shaderrecordext\") {\n                if (id == \"shaderrecordnv\") {\n                    requireExtensions(loc, 1, &E_GL_NV_ray_tracing, \"shader record NV\");\n                } else {\n                    requireExtensions(loc, 1, &E_GL_EXT_ray_tracing, \"shader record EXT\");\n                }\n                publicType.qualifier.layoutShaderRecord = true;\n                return;\n            } else if (id == \"hitobjectshaderrecordnv\") {\n                requireExtensions(loc, 1, &E_GL_NV_shader_invocation_reorder, \"hitobject shader record NV\");\n                publicType.qualifier.layoutHitObjectShaderRecordNV = true;\n                return;\n            }\n\n        }\n    }\n    if (language == EShLangCompute) {\n        if (id.compare(0, 17, \"derivative_group_\") == 0) {\n            requireExtensions(loc, 1, &E_GL_NV_compute_shader_derivatives, \"compute shader derivatives\");\n            if (id == \"derivative_group_quadsnv\") {\n                publicType.shaderQualifiers.layoutDerivativeGroupQuads = true;\n                return;\n            } else if (id == \"derivative_group_linearnv\") {\n                publicType.shaderQualifiers.layoutDerivativeGroupLinear = true;\n                return;\n            }\n        }\n        if (id == \"tile_attachmentqcom\") {\n            requireExtensions(loc, 1, &E_GL_QCOM_tile_shading, \"tile shading QCOM\");\n            publicType.qualifier.layoutTileAttachmentQCOM = true;\n            return;\n        }\n    }\n\n    if (id == \"primitive_culling\") {\n        requireExtensions(loc, 1, &E_GL_EXT_ray_flags_primitive_culling, \"primitive culling\");\n        publicType.shaderQualifiers.layoutPrimitiveCulling = true;\n        return;\n    }\n\n    if (id == \"quad_derivatives\")\n    {\n        const char* feature = \"quad_derivatives qualifier\";\n        requireProfile(loc, ECompatibilityProfile | ECoreProfile | EEsProfile, feature);\n        profileRequires(loc, ECoreProfile | ECompatibilityProfile, 140, E_GL_EXT_shader_quad_control, feature);\n        profileRequires(loc, EEsProfile, 310, E_GL_EXT_shader_quad_control, feature);\n        publicType.qualifier.layoutQuadDeriv = true;\n        return;\n    }\n\n    error(loc, \"unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4)\", id.c_str(), \"\");\n}\n\n// Put the id's layout qualifier value into the public type, for qualifiers having a number set.\n// This is before we know any type information for error checking.\nvoid TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publicType, TString& id, const TIntermTyped* node)\n{\n    const char* feature = \"layout-id value\";\n    const char* nonLiteralFeature = \"non-literal layout-id value\";\n\n    integerCheck(node, feature);\n    const TIntermConstantUnion* constUnion = node->getAsConstantUnion();\n    int value;\n    bool nonLiteral = false;\n    if (constUnion) {\n        value = constUnion->getConstArray()[0].getIConst();\n        if (! constUnion->isLiteral()) {\n            requireProfile(loc, ECoreProfile | ECompatibilityProfile, nonLiteralFeature);\n            profileRequires(loc, ECoreProfile | ECompatibilityProfile, 440, E_GL_ARB_enhanced_layouts, nonLiteralFeature);\n        }\n    } else {\n        // grammar should have give out the error message\n        value = 0;\n        nonLiteral = true;\n    }\n\n    if (value < 0) {\n        error(loc, \"cannot be negative\", feature, \"\");\n        return;\n    }\n\n    std::transform(id.begin(), id.end(), id.begin(), ::tolower);\n\n    if (id == \"offset\") {\n        // \"offset\" can be for either\n        //  - uniform offsets\n        //  - atomic_uint offsets\n        const char* feature = \"offset\";\n        if (spvVersion.spv == 0) {\n            requireProfile(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, feature);\n            const char* exts[2] = { E_GL_ARB_enhanced_layouts, E_GL_ARB_shader_atomic_counters };\n            profileRequires(loc, ECoreProfile | ECompatibilityProfile, 420, 2, exts, feature);\n            profileRequires(loc, EEsProfile, 310, nullptr, feature);\n        }\n        publicType.qualifier.layoutOffset = value;\n        publicType.qualifier.explicitOffset = true;\n        if (nonLiteral)\n            error(loc, \"needs a literal integer\", \"offset\", \"\");\n        return;\n    } else if (id == \"align\") {\n        const char* feature = \"uniform buffer-member align\";\n        if (spvVersion.spv == 0) {\n            requireProfile(loc, ECoreProfile | ECompatibilityProfile, feature);\n            profileRequires(loc, ECoreProfile | ECompatibilityProfile, 440, E_GL_ARB_enhanced_layouts, feature);\n        }\n        // \"The specified alignment must be a power of 2, or a compile-time error results.\"\n        if (! IsPow2(value))\n            error(loc, \"must be a power of 2\", \"align\", \"\");\n        else\n            publicType.qualifier.layoutAlign = value;\n        if (nonLiteral)\n            error(loc, \"needs a literal integer\", \"align\", \"\");\n        return;\n    } else if (id == \"location\") {\n        profileRequires(loc, EEsProfile, 300, nullptr, \"location\");\n        const char* exts[2] = { E_GL_ARB_separate_shader_objects, E_GL_ARB_explicit_attrib_location };\n        // GL_ARB_explicit_uniform_location requires 330 or GL_ARB_explicit_attrib_location we do not need to add it here\n        profileRequires(loc, ~EEsProfile, 330, 2, exts, \"location\");\n        if ((unsigned int)value >= TQualifier::layoutLocationEnd)\n            error(loc, \"location is too large\", id.c_str(), \"\");\n        else\n            publicType.qualifier.layoutLocation = value;\n        if (nonLiteral)\n            error(loc, \"needs a literal integer\", \"location\", \"\");\n        return;\n    } else if (id == \"set\") {\n        if ((unsigned int)value >= TQualifier::layoutSetEnd)\n            error(loc, \"set is too large\", id.c_str(), \"\");\n        else\n            publicType.qualifier.layoutSet = value;\n        if (value != 0)\n            requireVulkan(loc, \"descriptor set\");\n        if (nonLiteral)\n            error(loc, \"needs a literal integer\", \"set\", \"\");\n        return;\n    } else if (id == \"binding\") {\n        profileRequires(loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, \"binding\");\n        profileRequires(loc, EEsProfile, 310, nullptr, \"binding\");\n        if ((unsigned int)value >= TQualifier::layoutBindingEnd)\n            error(loc, \"binding is too large\", id.c_str(), \"\");\n        else\n            publicType.qualifier.layoutBinding = value;\n        if (nonLiteral)\n            error(loc, \"needs a literal integer\", \"binding\", \"\");\n        return;\n    }\n    if (id == \"constant_id\") {\n        requireSpv(loc, \"constant_id\");\n        if (value >= (int)TQualifier::layoutSpecConstantIdEnd) {\n            error(loc, \"specialization-constant id is too large\", id.c_str(), \"\");\n        } else {\n            publicType.qualifier.layoutSpecConstantId = value;\n            publicType.qualifier.specConstant = true;\n            if (! intermediate.addUsedConstantId(value))\n                error(loc, \"specialization-constant id already used\", id.c_str(), \"\");\n        }\n        if (nonLiteral)\n            error(loc, \"needs a literal integer\", \"constant_id\", \"\");\n        return;\n    }\n    if (id == \"component\") {\n        requireProfile(loc, ECoreProfile | ECompatibilityProfile, \"component\");\n        profileRequires(loc, ECoreProfile | ECompatibilityProfile, 440, E_GL_ARB_enhanced_layouts, \"component\");\n        if ((unsigned)value >= TQualifier::layoutComponentEnd)\n            error(loc, \"component is too large\", id.c_str(), \"\");\n        else\n            publicType.qualifier.layoutComponent = value;\n        if (nonLiteral)\n            error(loc, \"needs a literal integer\", \"component\", \"\");\n        return;\n    }\n    if (id.compare(0, 4, \"xfb_\") == 0) {\n        // \"Any shader making any static use (after preprocessing) of any of these\n        // *xfb_* qualifiers will cause the shader to be in a transform feedback\n        // capturing mode and hence responsible for describing the transform feedback\n        // setup.\"\n        intermediate.setXfbMode();\n        const char* feature = \"transform feedback qualifier\";\n        requireStage(loc, (EShLanguageMask)(EShLangVertexMask | EShLangGeometryMask | EShLangTessControlMask | EShLangTessEvaluationMask), feature);\n        requireProfile(loc, ECoreProfile | ECompatibilityProfile, feature);\n        profileRequires(loc, ECoreProfile | ECompatibilityProfile, 440, E_GL_ARB_enhanced_layouts, feature);\n        if (id == \"xfb_buffer\") {\n            // \"It is a compile-time error to specify an *xfb_buffer* that is greater than\n            // the implementation-dependent constant gl_MaxTransformFeedbackBuffers.\"\n            if (value >= resources.maxTransformFeedbackBuffers)\n                error(loc, \"buffer is too large:\", id.c_str(), \"gl_MaxTransformFeedbackBuffers is %d\", resources.maxTransformFeedbackBuffers);\n            if (value >= (int)TQualifier::layoutXfbBufferEnd)\n                error(loc, \"buffer is too large:\", id.c_str(), \"internal max is %d\", TQualifier::layoutXfbBufferEnd-1);\n            else\n                publicType.qualifier.layoutXfbBuffer = value;\n            if (nonLiteral)\n                error(loc, \"needs a literal integer\", \"xfb_buffer\", \"\");\n            return;\n        } else if (id == \"xfb_offset\") {\n            if (value >= (int)TQualifier::layoutXfbOffsetEnd)\n                error(loc, \"offset is too large:\", id.c_str(), \"internal max is %d\", TQualifier::layoutXfbOffsetEnd-1);\n            else\n                publicType.qualifier.layoutXfbOffset = value;\n            if (nonLiteral)\n                error(loc, \"needs a literal integer\", \"xfb_offset\", \"\");\n            return;\n        } else if (id == \"xfb_stride\") {\n            // \"The resulting stride (implicit or explicit), when divided by 4, must be less than or equal to the\n            // implementation-dependent constant gl_MaxTransformFeedbackInterleavedComponents.\"\n            if (value > 4 * resources.maxTransformFeedbackInterleavedComponents) {\n                error(loc, \"1/4 stride is too large:\", id.c_str(), \"gl_MaxTransformFeedbackInterleavedComponents is %d\",\n                    resources.maxTransformFeedbackInterleavedComponents);\n            }\n            if (value >= (int)TQualifier::layoutXfbStrideEnd)\n                error(loc, \"stride is too large:\", id.c_str(), \"internal max is %d\", TQualifier::layoutXfbStrideEnd-1);\n            else\n                publicType.qualifier.layoutXfbStride = value;\n            if (nonLiteral)\n                error(loc, \"needs a literal integer\", \"xfb_stride\", \"\");\n            return;\n        }\n    }\n    if (id == \"input_attachment_index\") {\n        requireVulkan(loc, \"input_attachment_index\");\n        if (value >= (int)TQualifier::layoutAttachmentEnd)\n            error(loc, \"attachment index is too large\", id.c_str(), \"\");\n        else\n            publicType.qualifier.layoutAttachment = value;\n        if (nonLiteral)\n            error(loc, \"needs a literal integer\", \"input_attachment_index\", \"\");\n        return;\n    }\n    if (id == \"num_views\") {\n        requireExtensions(loc, Num_OVR_multiview_EXTs, OVR_multiview_EXTs, \"num_views\");\n        publicType.shaderQualifiers.numViews = value;\n        if (nonLiteral)\n            error(loc, \"needs a literal integer\", \"num_views\", \"\");\n        return;\n    }\n    if (language == EShLangVertex ||\n        language == EShLangTessControl ||\n        language == EShLangTessEvaluation ||\n        language == EShLangGeometry) {\n        if (id == \"secondary_view_offset\") {\n            requireExtensions(loc, 1, &E_GL_NV_stereo_view_rendering, \"stereo view rendering\");\n            publicType.qualifier.layoutSecondaryViewportRelativeOffset = value;\n            if (nonLiteral)\n                error(loc, \"needs a literal integer\", \"secondary_view_offset\", \"\");\n            return;\n        }\n    }\n\n    if (id == \"buffer_reference_align\") {\n        requireExtensions(loc, 1, &E_GL_EXT_buffer_reference, \"buffer_reference_align\");\n        if (! IsPow2(value))\n            error(loc, \"must be a power of 2\", \"buffer_reference_align\", \"\");\n        else\n            publicType.qualifier.layoutBufferReferenceAlign = IntLog2(value);\n        if (nonLiteral)\n            error(loc, \"needs a literal integer\", \"buffer_reference_align\", \"\");\n        return;\n    }\n\n    switch (language) {\n    case EShLangTessControl:\n        if (id == \"vertices\") {\n            if (value == 0)\n                error(loc, \"must be greater than 0\", \"vertices\", \"\");\n            else\n                publicType.shaderQualifiers.vertices = value;\n            if (nonLiteral)\n                error(loc, \"needs a literal integer\", \"vertices\", \"\");\n            return;\n        }\n        break;\n\n    case EShLangGeometry:\n        if (id == \"invocations\") {\n            profileRequires(loc, ECompatibilityProfile | ECoreProfile, 400,\n                Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5, \"invocations\");\n\n            if (value == 0)\n                error(loc, \"must be at least 1\", \"invocations\", \"\");\n            else\n                publicType.shaderQualifiers.invocations = value;\n            if (nonLiteral)\n                error(loc, \"needs a literal integer\", \"invocations\", \"\");\n            return;\n        }\n        if (id == \"max_vertices\") {\n            publicType.shaderQualifiers.vertices = value;\n            if (value > resources.maxGeometryOutputVertices)\n                error(loc, \"too large, must be less than gl_MaxGeometryOutputVertices\", \"max_vertices\", \"\");\n            if (nonLiteral)\n                error(loc, \"needs a literal integer\", \"max_vertices\", \"\");\n            return;\n        }\n        if (id == \"stream\") {\n            requireProfile(loc, ~EEsProfile, \"selecting output stream\");\n            publicType.qualifier.layoutStream = value;\n            if (value > 0)\n                intermediate.setMultiStream();\n            if (nonLiteral)\n                error(loc, \"needs a literal integer\", \"stream\", \"\");\n            return;\n        }\n        break;\n\n    case EShLangFragment:\n        if (id == \"index\") {\n            requireProfile(loc, ECompatibilityProfile | ECoreProfile | EEsProfile, \"index layout qualifier on fragment output\");\n            const char* exts[2] = { E_GL_ARB_separate_shader_objects, E_GL_ARB_explicit_attrib_location };\n            profileRequires(loc, ECompatibilityProfile | ECoreProfile, 330, 2, exts, \"index layout qualifier on fragment output\");\n            profileRequires(loc, EEsProfile ,310, E_GL_EXT_blend_func_extended, \"index layout qualifier on fragment output\");\n            // \"It is also a compile-time error if a fragment shader sets a layout index to less than 0 or greater than 1.\"\n            if (value < 0 || value > 1) {\n                value = 0;\n                error(loc, \"value must be 0 or 1\", \"index\", \"\");\n            }\n\n            publicType.qualifier.layoutIndex = value;\n            if (nonLiteral)\n                error(loc, \"needs a literal integer\", \"index\", \"\");\n            return;\n        }\n        break;\n\n    case EShLangMesh:\n        if (id == \"max_vertices\") {\n            requireExtensions(loc, Num_AEP_mesh_shader, AEP_mesh_shader, \"max_vertices\");\n            publicType.shaderQualifiers.vertices = value;\n            int max = extensionTurnedOn(E_GL_EXT_mesh_shader) ? resources.maxMeshOutputVerticesEXT\n                                                              : resources.maxMeshOutputVerticesNV;\n            if (value > max) {\n                TString maxsErrtring = \"too large, must be less than \";\n                maxsErrtring.append(extensionTurnedOn(E_GL_EXT_mesh_shader) ? \"gl_MaxMeshOutputVerticesEXT\"\n                                                                            : \"gl_MaxMeshOutputVerticesNV\");\n                error(loc, maxsErrtring.c_str(), \"max_vertices\", \"\");\n            }\n            if (nonLiteral)\n                error(loc, \"needs a literal integer\", \"max_vertices\", \"\");\n            return;\n        }\n        if (id == \"max_primitives\") {\n            requireExtensions(loc, Num_AEP_mesh_shader, AEP_mesh_shader, \"max_primitives\");\n            publicType.shaderQualifiers.primitives = value;\n            int max = extensionTurnedOn(E_GL_EXT_mesh_shader) ? resources.maxMeshOutputPrimitivesEXT\n                                                              : resources.maxMeshOutputPrimitivesNV;\n            if (value > max) {\n                TString maxsErrtring = \"too large, must be less than \";\n                maxsErrtring.append(extensionTurnedOn(E_GL_EXT_mesh_shader) ? \"gl_MaxMeshOutputPrimitivesEXT\"\n                                                                            : \"gl_MaxMeshOutputPrimitivesNV\");\n                error(loc, maxsErrtring.c_str(), \"max_primitives\", \"\");\n            }\n            if (nonLiteral)\n                error(loc, \"needs a literal integer\", \"max_primitives\", \"\");\n            return;\n        }\n        [[fallthrough]];\n\n    case EShLangTask:\n        // Fall through\n    case EShLangCompute:\n        if (id.compare(0, 11, \"local_size_\") == 0) {\n            if (language == EShLangMesh || language == EShLangTask) {\n                requireExtensions(loc, Num_AEP_mesh_shader, AEP_mesh_shader, \"gl_WorkGroupSize\");\n            } else {\n                profileRequires(loc, EEsProfile, 310, nullptr, \"gl_WorkGroupSize\");\n                profileRequires(loc, ~EEsProfile, 430, E_GL_ARB_compute_shader, \"gl_WorkGroupSize\");\n            }\n            if (nonLiteral)\n                error(loc, \"needs a literal integer\", \"local_size\", \"\");\n            if (id.size() == 12 && value == 0) {\n                error(loc, \"must be at least 1\", id.c_str(), \"\");\n                return;\n            }\n            if (id == \"local_size_x\") {\n                publicType.shaderQualifiers.localSize[0] = value;\n                publicType.shaderQualifiers.localSizeNotDefault[0] = true;\n                return;\n            }\n            if (id == \"local_size_y\") {\n                publicType.shaderQualifiers.localSize[1] = value;\n                publicType.shaderQualifiers.localSizeNotDefault[1] = true;\n                return;\n            }\n            if (id == \"local_size_z\") {\n                publicType.shaderQualifiers.localSize[2] = value;\n                publicType.shaderQualifiers.localSizeNotDefault[2] = true;\n                return;\n            }\n            if (spvVersion.spv != 0) {\n                if (id == \"local_size_x_id\") {\n                    publicType.shaderQualifiers.localSizeSpecId[0] = value;\n                    return;\n                }\n                if (id == \"local_size_y_id\") {\n                    publicType.shaderQualifiers.localSizeSpecId[1] = value;\n                    return;\n                }\n                if (id == \"local_size_z_id\") {\n                    publicType.shaderQualifiers.localSizeSpecId[2] = value;\n                    return;\n                }\n            }\n        }\n        if (id.compare(0, 18, \"shading_rate_xqcom\") == 0 ||\n            id.compare(0, 18, \"shading_rate_yqcom\") == 0 ||\n            id.compare(0, 18, \"shading_rate_zqcom\") == 0) {\n            requireExtensions(loc, 1, &E_GL_QCOM_tile_shading, \"tile shading QCOM\");\n            if (nonLiteral)\n                error(loc, \"needs a literal integer\", \"shading_rate_*QCOM\", \"\");\n            if (id.size() == 18 && value == 0) {\n                error(loc, \"must be at least 1\", id.c_str(), \"\");\n                return;\n            }\n            if (id == \"shading_rate_xqcom\") {\n                publicType.shaderQualifiers.layoutTileShadingRateQCOM[0] = value;\n                publicType.shaderQualifiers.layoutTileShadingRateQCOMNotDefault[0] = true;\n                if (! IsPow2(value))\n                    error(loc, \"must be a power of 2\", id.c_str(), \"\");\n                return;\n            }\n            if (id == \"shading_rate_yqcom\") {\n                publicType.shaderQualifiers.layoutTileShadingRateQCOM[1] = value;\n                publicType.shaderQualifiers.layoutTileShadingRateQCOMNotDefault[1] = true;\n                if (! IsPow2(value))\n                    error(loc, \"must be a power of 2\", id.c_str(), \"\");\n                return;\n            }\n            if (id == \"shading_rate_zqcom\") {\n                publicType.shaderQualifiers.layoutTileShadingRateQCOM[2] = value;\n                publicType.shaderQualifiers.layoutTileShadingRateQCOMNotDefault[2] = true;\n                if (value <= 0)\n                    error(loc, \"must be a positive value\", id.c_str(), \"\");\n                return;\n            }\n        }\n        break;\n\n    default:\n        break;\n    }\n\n    error(loc, \"there is no such layout identifier for this stage taking an assigned value\", id.c_str(), \"\");\n}\n\n// Merge any layout qualifier information from src into dst, leaving everything else in dst alone\n//\n// \"More than one layout qualifier may appear in a single declaration.\n// Additionally, the same layout-qualifier-name can occur multiple times\n// within a layout qualifier or across multiple layout qualifiers in the\n// same declaration. When the same layout-qualifier-name occurs\n// multiple times, in a single declaration, the last occurrence overrides\n// the former occurrence(s).  Further, if such a layout-qualifier-name\n// will effect subsequent declarations or other observable behavior, it\n// is only the last occurrence that will have any effect, behaving as if\n// the earlier occurrence(s) within the declaration are not present.\n// This is also true for overriding layout-qualifier-names, where one\n// overrides the other (e.g., row_major vs. column_major); only the last\n// occurrence has any effect.\"\nvoid TParseContext::mergeObjectLayoutQualifiers(TQualifier& dst, const TQualifier& src, bool inheritOnly)\n{\n    if (src.hasMatrix())\n        dst.layoutMatrix = src.layoutMatrix;\n    if (src.hasPacking())\n        dst.layoutPacking = src.layoutPacking;\n\n    if (src.hasStream())\n        dst.layoutStream = src.layoutStream;\n    if (src.hasFormat())\n        dst.layoutFormat = src.layoutFormat;\n    if (src.hasXfbBuffer())\n        dst.layoutXfbBuffer = src.layoutXfbBuffer;\n    if (src.hasBufferReferenceAlign())\n        dst.layoutBufferReferenceAlign = src.layoutBufferReferenceAlign;\n\n    if (src.hasAlign())\n        dst.layoutAlign = src.layoutAlign;\n\n    if (! inheritOnly) {\n        if (src.hasLocation())\n            dst.layoutLocation = src.layoutLocation;\n        if (src.hasOffset())\n            dst.layoutOffset = src.layoutOffset;\n        if (src.hasSet())\n            dst.layoutSet = src.layoutSet;\n        if (src.layoutBinding != TQualifier::layoutBindingEnd)\n            dst.layoutBinding = src.layoutBinding;\n\n        if (src.hasSpecConstantId())\n            dst.layoutSpecConstantId = src.layoutSpecConstantId;\n\n        if (src.hasComponent())\n            dst.layoutComponent = src.layoutComponent;\n        if (src.hasIndex())\n            dst.layoutIndex = src.layoutIndex;\n        if (src.hasXfbStride())\n            dst.layoutXfbStride = src.layoutXfbStride;\n        if (src.hasXfbOffset())\n            dst.layoutXfbOffset = src.layoutXfbOffset;\n        if (src.hasAttachment())\n            dst.layoutAttachment = src.layoutAttachment;\n        if (src.layoutPushConstant)\n            dst.layoutPushConstant = true;\n\n        if (src.layoutBufferReference)\n            dst.layoutBufferReference = true;\n\n        if (src.layoutPassthrough)\n            dst.layoutPassthrough = true;\n        if (src.layoutViewportRelative)\n            dst.layoutViewportRelative = true;\n        if (src.layoutSecondaryViewportRelativeOffset != -2048)\n            dst.layoutSecondaryViewportRelativeOffset = src.layoutSecondaryViewportRelativeOffset;\n        if (src.layoutShaderRecord)\n            dst.layoutShaderRecord = true;\n        if (src.layoutFullQuads)\n            dst.layoutFullQuads = true;\n        if (src.layoutQuadDeriv)\n            dst.layoutQuadDeriv = true;\n        if (src.layoutBindlessSampler)\n            dst.layoutBindlessSampler = true;\n        if (src.layoutBindlessImage)\n            dst.layoutBindlessImage = true;\n        if (src.pervertexNV)\n            dst.pervertexNV = true;\n        if (src.pervertexEXT)\n            dst.pervertexEXT = true;\n        if (src.layoutHitObjectShaderRecordNV)\n            dst.layoutHitObjectShaderRecordNV = true;\n        dst.layoutTileAttachmentQCOM |= src.layoutTileAttachmentQCOM;\n    }\n}\n\n// Do error layout error checking given a full variable/block declaration.\nvoid TParseContext::layoutObjectCheck(const TSourceLoc& loc, const TSymbol& symbol)\n{\n    const TType& type = symbol.getType();\n    const TQualifier& qualifier = type.getQualifier();\n\n    // first, cross check WRT to just the type\n    layoutTypeCheck(loc, type);\n\n    // now, any remaining error checking based on the object itself\n\n    if (qualifier.hasAnyLocation()) {\n        switch (qualifier.storage) {\n        case EvqUniform:\n        case EvqBuffer:\n            if (symbol.getAsVariable() == nullptr)\n                error(loc, \"can only be used on variable declaration\", \"location\", \"\");\n            break;\n        default:\n            break;\n        }\n    }\n\n    // user-variable location check, which are required for SPIR-V in/out:\n    //  - variables have it directly,\n    //  - blocks have it on each member (already enforced), so check first one\n    if (spvVersion.spv > 0 && !parsingBuiltins && qualifier.builtIn == EbvNone &&\n        !qualifier.hasLocation() && !intermediate.getAutoMapLocations()) {\n\n        switch (qualifier.storage) {\n        case EvqVaryingIn:\n        case EvqVaryingOut:\n            if (!type.getQualifier().isTaskMemory() && !type.getQualifier().hasSpirvDecorate() &&\n                (type.getBasicType() != EbtBlock ||\n                 (!(*type.getStruct())[0].type->getQualifier().hasLocation() &&\n                   (*type.getStruct())[0].type->getQualifier().builtIn == EbvNone)))\n                error(loc, \"SPIR-V requires location for user input/output\", \"location\", \"\");\n            break;\n        default:\n            break;\n        }\n    }\n\n    // Check packing and matrix\n    if (qualifier.hasUniformLayout()) {\n        switch (qualifier.storage) {\n        case EvqUniform:\n        case EvqBuffer:\n            if (type.getBasicType() != EbtBlock) {\n                if (qualifier.hasMatrix())\n                    error(loc, \"cannot specify matrix layout on a variable declaration\", \"layout\", \"\");\n                if (qualifier.hasPacking())\n                    error(loc, \"cannot specify packing on a variable declaration\", \"layout\", \"\");\n                // \"The offset qualifier can only be used on block members of blocks...\"\n                if (qualifier.hasOffset() && !type.isAtomic())\n                    error(loc, \"cannot specify on a variable declaration\", \"offset\", \"\");\n                // \"The align qualifier can only be used on blocks or block members...\"\n                if (qualifier.hasAlign())\n                    error(loc, \"cannot specify on a variable declaration\", \"align\", \"\");\n                if (qualifier.isPushConstant())\n                    error(loc, \"can only specify on a uniform block\", \"push_constant\", \"\");\n                if (qualifier.isShaderRecord())\n                    error(loc, \"can only specify on a buffer block\", \"shaderRecordNV\", \"\");\n                if (qualifier.hasLocation() && type.isAtomic())\n                    error(loc, \"cannot specify on atomic counter\", \"location\", \"\");\n            }\n            break;\n        default:\n            // these were already filtered by layoutTypeCheck() (or its callees)\n            break;\n        }\n    }\n}\n\n// \"For some blocks declared as arrays, the location can only be applied at the block level:\n// When a block is declared as an array where additional locations are needed for each member\n// for each block array element, it is a compile-time error to specify locations on the block\n// members.  That is, when locations would be under specified by applying them on block members,\n// they are not allowed on block members.  For arrayed interfaces (those generally having an\n// extra level of arrayness due to interface expansion), the outer array is stripped before\n// applying this rule.\"\nvoid TParseContext::layoutMemberLocationArrayCheck(const TSourceLoc& loc, bool memberWithLocation,\n    TArraySizes* arraySizes)\n{\n    if (memberWithLocation && arraySizes != nullptr) {\n        if (arraySizes->getNumDims() > (currentBlockQualifier.isArrayedIo(language) ? 1 : 0))\n            error(loc, \"cannot use in a block array where new locations are needed for each block element\",\n                       \"location\", \"\");\n    }\n}\n\n// Do layout error checking with respect to a type.\nvoid TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type)\n{\n    const TQualifier& qualifier = type.getQualifier();\n\n    // first, intra-layout qualifier-only error checking\n    layoutQualifierCheck(loc, qualifier);\n\n    // now, error checking combining type and qualifier\n\n    if (qualifier.hasAnyLocation()) {\n        if (qualifier.hasLocation()) {\n            if (qualifier.storage == EvqVaryingOut && language == EShLangFragment) {\n                if (qualifier.layoutLocation >= (unsigned int)resources.maxDrawBuffers)\n                    error(loc, \"too large for fragment output\", \"location\", \"\");\n            }\n        }\n        if (qualifier.hasComponent()) {\n            // \"It is a compile-time error if this sequence of components gets larger than 3.\"\n            if (qualifier.layoutComponent + type.getVectorSize() * (type.getBasicType() == EbtDouble ? 2 : 1) > 4)\n                error(loc, \"type overflows the available 4 components\", \"component\", \"\");\n\n            // \"It is a compile-time error to apply the component qualifier to a matrix, a structure, a block, or an array containing any of these.\"\n            if (type.isMatrix() || type.getBasicType() == EbtBlock || type.getBasicType() == EbtStruct)\n                error(loc, \"cannot apply to a matrix, structure, or block\", \"component\", \"\");\n\n            // \" It is a compile-time error to use component 1 or 3 as the beginning of a double or dvec2.\"\n            if (type.getBasicType() == EbtDouble)\n                if (qualifier.layoutComponent & 1)\n                    error(loc, \"doubles cannot start on an odd-numbered component\", \"component\", \"\");\n        }\n\n        switch (qualifier.storage) {\n        case EvqVaryingIn:\n        case EvqVaryingOut:\n            if (type.getBasicType() == EbtBlock)\n                profileRequires(loc, ECoreProfile | ECompatibilityProfile, 440, E_GL_ARB_enhanced_layouts, \"location qualifier on in/out block\");\n            if (type.getQualifier().isTaskMemory())\n                error(loc, \"cannot apply to taskNV in/out blocks\", \"location\", \"\");\n            break;\n        case EvqUniform:\n        case EvqBuffer:\n            if (type.getBasicType() == EbtBlock)\n                error(loc, \"cannot apply to uniform or buffer block\", \"location\", \"\");\n            else if (type.getBasicType() == EbtSampler && type.getSampler().isAttachmentEXT())\n                error(loc, \"only applies to\", \"location\", \"%s with storage tileImageEXT\", type.getBasicTypeString().c_str());\n            break;\n        case EvqtaskPayloadSharedEXT:\n            error(loc, \"cannot apply to taskPayloadSharedEXT\", \"location\", \"\");\n            break;\n        case EvqPayload:\n        case EvqPayloadIn:\n        case EvqHitAttr:\n        case EvqCallableData:\n        case EvqCallableDataIn:\n        case EvqHitObjectAttrNV:\n        case EvqSpirvStorageClass:\n            break;\n        case EvqTileImageEXT:\n            break;\n        default:\n            error(loc, \"can only apply to uniform, buffer, in, or out storage qualifiers\", \"location\", \"\");\n            break;\n        }\n\n        bool typeCollision;\n        int repeated = intermediate.addUsedLocation(messages, qualifier, type, typeCollision);\n        if (repeated >= 0 && ! typeCollision)\n            error(loc, \"overlapping use of location\", \"location\", \"%d\", repeated);\n        // When location aliasing, the aliases sharing the location must have the same underlying numerical type and bit width(\n        // floating - point or integer, 32 - bit versus 64 - bit,etc.)\n        if (typeCollision && (qualifier.isPipeInput() || qualifier.isPipeOutput() || qualifier.storage == EvqTileImageEXT))\n            error(loc, \"the aliases sharing the location\", \"location\", \"%d must be the same basic type and interpolation qualification\", repeated);\n    }\n\n    if (qualifier.hasXfbOffset() && qualifier.hasXfbBuffer()) {\n        if (type.isUnsizedArray()) {\n            error(loc, \"unsized array\", \"xfb_offset\", \"in buffer %d\", qualifier.layoutXfbBuffer);\n        } else {\n            int repeated = intermediate.addXfbBufferOffset(type);\n            if (repeated >= 0)\n                error(loc, \"overlapping offsets at\", \"xfb_offset\", \"offset %d in buffer %d\", repeated, qualifier.layoutXfbBuffer);\n        }\n\n        // \"The offset must be a multiple of the size of the first component of the first\n        // qualified variable or block member, or a compile-time error results. Further, if applied to an aggregate\n        // containing a double or 64-bit integer, the offset must also be a multiple of 8...\"\n        if ((type.containsBasicType(EbtDouble) || type.containsBasicType(EbtInt64) || type.containsBasicType(EbtUint64)) &&\n            ! IsMultipleOfPow2(qualifier.layoutXfbOffset, 8))\n            error(loc, \"type contains double or 64-bit integer; xfb_offset must be a multiple of 8\", \"xfb_offset\", \"\");\n        else if ((type.containsBasicType(EbtBool) || type.containsBasicType(EbtFloat) ||\n                  type.containsBasicType(EbtInt) || type.containsBasicType(EbtUint)) &&\n                 ! IsMultipleOfPow2(qualifier.layoutXfbOffset, 4))\n            error(loc, \"must be a multiple of size of first component\", \"xfb_offset\", \"\");\n        // ..., if applied to an aggregate containing a half float or 16-bit integer, the offset must also be a multiple of 2...\"\n        else if ((type.contains16BitFloat() || type.containsBasicType(EbtInt16) || type.containsBasicType(EbtUint16)) &&\n                 !IsMultipleOfPow2(qualifier.layoutXfbOffset, 2))\n            error(loc, \"type contains half float or 16-bit integer; xfb_offset must be a multiple of 2\", \"xfb_offset\", \"\");\n    }\n    if (qualifier.hasXfbStride() && qualifier.hasXfbBuffer()) {\n        if (! intermediate.setXfbBufferStride(qualifier.layoutXfbBuffer, qualifier.layoutXfbStride))\n            error(loc, \"all stride settings must match for xfb buffer\", \"xfb_stride\", \"%d\", qualifier.layoutXfbBuffer);\n    }\n\n    if (qualifier.hasBinding()) {\n        // Binding checking, from the spec:\n        //\n        // \"If the binding point for any uniform or shader storage block instance is less than zero, or greater than or\n        // equal to the implementation-dependent maximum number of uniform buffer bindings, a compile-time\n        // error will occur. When the binding identifier is used with a uniform or shader storage block instanced as\n        // an array of size N, all elements of the array from binding through binding + N - 1 must be within this\n        // range.\"\n        //\n        if (!type.isOpaque() && type.getBasicType() != EbtBlock && type.getBasicType() != EbtSpirvType)\n            error(loc, \"requires block, or sampler/image, or atomic-counter type\", \"binding\", \"\");\n        if (type.getBasicType() == EbtSampler) {\n            int lastBinding = qualifier.layoutBinding;\n            if (type.isArray()) {\n                if (spvVersion.vulkan == 0) {\n                    if (type.isSizedArray())\n                        lastBinding += (type.getCumulativeArraySize() - 1);\n                    else {\n                        warn(loc, \"assuming binding count of one for compile-time checking of binding numbers for unsized array\", \"[]\", \"\");\n                    }\n                }\n            }\n            if (spvVersion.vulkan == 0 && lastBinding >= resources.maxCombinedTextureImageUnits)\n                error(loc, \"sampler binding not less than gl_MaxCombinedTextureImageUnits\", \"binding\", type.isArray() ? \"(using array)\" : \"\");\n        }\n        if (type.isAtomic() && !spvVersion.vulkanRelaxed) {\n            if (qualifier.layoutBinding >= (unsigned int)resources.maxAtomicCounterBindings) {\n                error(loc, \"atomic_uint binding is too large; see gl_MaxAtomicCounterBindings\", \"binding\", \"\");\n                return;\n            }\n        }\n    } else if (!intermediate.getAutoMapBindings()) {\n        // some types require bindings\n\n        // atomic_uint\n        if (type.isAtomic())\n            error(loc, \"layout(binding=X) is required\", \"atomic_uint\", \"\");\n\n        // SPIR-V\n        if (spvVersion.spv > 0) {\n            if (qualifier.isUniformOrBuffer()) {\n                if (type.getBasicType() == EbtBlock && !qualifier.isPushConstant() &&\n                       !qualifier.isShaderRecord() &&\n                       !qualifier.hasAttachment() &&\n                       !qualifier.hasBufferReference())\n                    error(loc, \"uniform/buffer blocks require layout(binding=X)\", \"binding\", \"\");\n                else if (spvVersion.vulkan > 0 && type.getBasicType() == EbtSampler && !type.getSampler().isAttachmentEXT())\n                    error(loc, \"sampler/texture/image requires layout(binding=X)\", \"binding\", \"\");\n            }\n        }\n    }\n\n    // some things can't have arrays of arrays\n    if (type.isArrayOfArrays()) {\n        if (spvVersion.vulkan > 0) {\n            if (type.isOpaque() || (type.getQualifier().isUniformOrBuffer() && type.getBasicType() == EbtBlock))\n                warn(loc, \"Generating SPIR-V array-of-arrays, but Vulkan only supports single array level for this resource\", \"[][]\", \"\");\n        }\n    }\n\n    // \"The offset qualifier can only be used on block members of blocks...\"\n    if (qualifier.hasOffset()) {\n        if (type.getBasicType() == EbtBlock)\n            error(loc, \"only applies to block members, not blocks\", \"offset\", \"\");\n    }\n\n    // Image format\n    if (qualifier.hasFormat()) {\n        if (! type.isImage() && !intermediate.getBindlessImageMode())\n            error(loc, \"only apply to images\", TQualifier::getLayoutFormatString(qualifier.getFormat()), \"\");\n        else {\n            if (type.getSampler().type == EbtFloat && qualifier.getFormat() > ElfFloatGuard)\n                error(loc, \"does not apply to floating point images\", TQualifier::getLayoutFormatString(qualifier.getFormat()), \"\");\n            if (type.getSampler().type == EbtInt && (qualifier.getFormat() < ElfFloatGuard || qualifier.getFormat() > ElfIntGuard))\n                error(loc, \"does not apply to signed integer images\", TQualifier::getLayoutFormatString(qualifier.getFormat()), \"\");\n            if (type.getSampler().type == EbtUint && qualifier.getFormat() < ElfIntGuard)\n                error(loc, \"does not apply to unsigned integer images\", TQualifier::getLayoutFormatString(qualifier.getFormat()), \"\");\n\n            if (isEsProfile()) {\n                // \"Except for image variables qualified with the format qualifiers r32f, r32i, and r32ui, image variables must\n                // specify either memory qualifier readonly or the memory qualifier writeonly.\"\n                if (! (qualifier.getFormat() == ElfR32f || qualifier.getFormat() == ElfR32i || qualifier.getFormat() == ElfR32ui)) {\n                    if (! qualifier.isReadOnly() && ! qualifier.isWriteOnly())\n                        error(loc, \"format requires readonly or writeonly memory qualifier\", TQualifier::getLayoutFormatString(qualifier.getFormat()), \"\");\n                }\n            }\n        }\n    } else if (type.isImage() && ! qualifier.isWriteOnly() && !intermediate.getBindlessImageMode()) {\n        const char *explanation = \"image variables not declared 'writeonly' and without a format layout qualifier\";\n        requireProfile(loc, ECoreProfile | ECompatibilityProfile, explanation);\n        profileRequires(loc, ECoreProfile | ECompatibilityProfile, 0, E_GL_EXT_shader_image_load_formatted, explanation);\n    }\n\n    if (qualifier.isPushConstant()) {\n        if (type.getBasicType() != EbtBlock)\n            error(loc, \"can only be used with a block\", \"push_constant\", \"\");\n        if (type.isArray())\n            error(loc, \"Push constants blocks can't be an array\", \"push_constant\", \"\");\n    }\n\n    if (type.getBasicType() == EbtReference) {\n        if (qualifier.isPipeInput())\n            error(loc, \"cannot contain any structs with buffer_reference.\", \"in\",\n                  \"If you want to interface shader stages with a buffer_reference cast to a uint64 or uvec2 instead.\");\n        if (qualifier.isPipeOutput())\n            error(loc, \"cannot contain any structs with buffer_reference.\", \"out\",\n                  \"If you want to interface shader stages with a buffer_reference cast to a uint64 or uvec2 instead.\");\n    }\n\n    if (qualifier.hasBufferReference() && type.getBasicType() != EbtBlock)\n        error(loc, \"can only be used with a block\", \"buffer_reference\", \"\");\n\n    if (qualifier.isShaderRecord() && type.getBasicType() != EbtBlock)\n        error(loc, \"can only be used with a block\", \"shaderRecordNV\", \"\");\n\n    // input attachment\n    if (type.isSubpass()) {\n        if (extensionTurnedOn(E_GL_EXT_shader_tile_image))\n            error(loc, \"cannot be used with GL_EXT_shader_tile_image enabled\", type.getSampler().getString().c_str(),\n                  \"\");\n        if (! qualifier.hasAttachment())\n            error(loc, \"requires an input_attachment_index layout qualifier\", \"subpass\", \"\");\n    } else {\n        if (qualifier.hasAttachment())\n            error(loc, \"can only be used with a subpass\", \"input_attachment_index\", \"\");\n    }\n\n    // specialization-constant id\n    if (qualifier.hasSpecConstantId()) {\n        if (type.getQualifier().storage != EvqConst)\n            error(loc, \"can only be applied to 'const'-qualified scalar\", \"constant_id\", \"\");\n        if (! type.isScalar())\n            error(loc, \"can only be applied to a scalar\", \"constant_id\", \"\");\n        switch (type.getBasicType())\n        {\n        case EbtInt8:\n        case EbtUint8:\n        case EbtInt16:\n        case EbtUint16:\n        case EbtInt:\n        case EbtUint:\n        case EbtInt64:\n        case EbtUint64:\n        case EbtBool:\n        case EbtFloat:\n        case EbtDouble:\n        case EbtFloat16:\n        case EbtBFloat16:\n        case EbtFloatE5M2:\n        case EbtFloatE4M3:\n            break;\n        default:\n            error(loc, \"cannot be applied to this type\", \"constant_id\", \"\");\n            break;\n        }\n    }\n}\n\nstatic bool storageCanHaveLayoutInBlock(const enum TStorageQualifier storage)\n{\n    switch (storage) {\n    case EvqUniform:\n    case EvqBuffer:\n    case EvqShared:\n        return true;\n    default:\n        return false;\n    }\n}\n\n// Do layout error checking that can be done within a layout qualifier proper, not needing to know\n// if there are blocks, atomic counters, variables, etc.\nvoid TParseContext::layoutQualifierCheck(const TSourceLoc& loc, const TQualifier& qualifier)\n{\n    if (qualifier.storage == EvqShared && qualifier.hasLayout()) {\n        if (spvVersion.spv > 0 && spvVersion.spv < EShTargetSpv_1_4) {\n            error(loc, \"shared block requires at least SPIR-V 1.4\", \"shared block\", \"\");\n        }\n        profileRequires(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, 0, E_GL_EXT_shared_memory_block, \"shared block\");\n    }\n\n    // \"It is a compile-time error to use *component* without also specifying the location qualifier (order does not matter).\"\n    if (qualifier.hasComponent() && ! qualifier.hasLocation())\n        error(loc, \"must specify 'location' to use 'component'\", \"component\", \"\");\n\n    if (qualifier.hasAnyLocation()) {\n\n        // \"As with input layout qualifiers, all shaders except compute shaders\n        // allow *location* layout qualifiers on output variable declarations,\n        // output block declarations, and output block member declarations.\"\n\n        switch (qualifier.storage) {\n        case EvqVaryingIn:\n        {\n            const char* feature = \"location qualifier on input\";\n            if (isEsProfile() && version < 310)\n                requireStage(loc, EShLangVertex, feature);\n            else\n                requireStage(loc, (EShLanguageMask)~EShLangComputeMask, feature);\n            if (language == EShLangVertex) {\n                const char* exts[2] = { E_GL_ARB_separate_shader_objects, E_GL_ARB_explicit_attrib_location };\n                profileRequires(loc, ~EEsProfile, 330, 2, exts, feature);\n                profileRequires(loc, EEsProfile, 300, nullptr, feature);\n            } else {\n                profileRequires(loc, ~EEsProfile, 410, E_GL_ARB_separate_shader_objects, feature);\n                profileRequires(loc, EEsProfile, 310, nullptr, feature);\n            }\n            break;\n        }\n        case EvqVaryingOut:\n        {\n            const char* feature = \"location qualifier on output\";\n            if (isEsProfile() && version < 310)\n                requireStage(loc, EShLangFragment, feature);\n            else\n                requireStage(loc, (EShLanguageMask)~EShLangComputeMask, feature);\n            if (language == EShLangFragment) {\n                const char* exts[2] = { E_GL_ARB_separate_shader_objects, E_GL_ARB_explicit_attrib_location };\n                profileRequires(loc, ~EEsProfile, 330, 2, exts, feature);\n                profileRequires(loc, EEsProfile, 300, nullptr, feature);\n            } else {\n                profileRequires(loc, ~EEsProfile, 410, E_GL_ARB_separate_shader_objects, feature);\n                profileRequires(loc, EEsProfile, 310, nullptr, feature);\n            }\n            break;\n        }\n        case EvqUniform:\n        case EvqBuffer:\n        {\n            const char* feature = \"location qualifier on uniform or buffer\";\n            requireProfile(loc, EEsProfile | ECoreProfile | ECompatibilityProfile | ENoProfile, feature);\n            profileRequires(loc, ~EEsProfile, 330, E_GL_ARB_explicit_attrib_location, feature);\n            profileRequires(loc, ~EEsProfile, 430, E_GL_ARB_explicit_uniform_location, feature);\n            profileRequires(loc, EEsProfile, 310, nullptr, feature);\n            break;\n        }\n        default:\n            break;\n        }\n        if (qualifier.hasIndex()) {\n            if (qualifier.storage != EvqVaryingOut)\n                error(loc, \"can only be used on an output\", \"index\", \"\");\n            if (! qualifier.hasLocation())\n                error(loc, \"can only be used with an explicit location\", \"index\", \"\");\n        }\n    }\n\n    if (qualifier.hasBinding()) {\n        if (! qualifier.isUniformOrBuffer() && !qualifier.isTaskMemory() && !qualifier.isTileAttachmentQCOM())\n            error(loc, \"requires uniform or buffer or tile image storage qualifier\", \"binding\", \"\");\n    }\n    if (qualifier.hasStream()) {\n        if (!qualifier.isPipeOutput())\n            error(loc, \"can only be used on an output\", \"stream\", \"\");\n    }\n    if (qualifier.hasXfb()) {\n        if (!qualifier.isPipeOutput())\n            error(loc, \"can only be used on an output\", \"xfb layout qualifier\", \"\");\n    }\n    if (qualifier.hasUniformLayout()) {\n        if (!storageCanHaveLayoutInBlock(qualifier.storage) && !qualifier.isTaskMemory()) {\n            if (qualifier.hasMatrix() || qualifier.hasPacking())\n                error(loc, \"matrix or packing qualifiers can only be used on a uniform or buffer\", \"layout\", \"\");\n            if (qualifier.hasOffset() || qualifier.hasAlign())\n                error(loc, \"offset/align can only be used on a uniform or buffer\", \"layout\", \"\");\n        }\n    }\n    if (qualifier.isPushConstant()) {\n        if (qualifier.storage != EvqUniform)\n            error(loc, \"can only be used with a uniform\", \"push_constant\", \"\");\n        if (qualifier.hasSet())\n            error(loc, \"cannot be used with push_constant\", \"set\", \"\");\n        if (qualifier.hasBinding())\n            error(loc, \"cannot be used with push_constant\", \"binding\", \"\");\n    }\n    if (qualifier.hasBufferReference()) {\n        if (qualifier.storage != EvqBuffer)\n            error(loc, \"can only be used with buffer\", \"buffer_reference\", \"\");\n    }\n    if (qualifier.isShaderRecord()) {\n        if (qualifier.storage != EvqBuffer)\n            error(loc, \"can only be used with a buffer\", \"shaderRecordNV\", \"\");\n        if (qualifier.hasBinding())\n            error(loc, \"cannot be used with shaderRecordNV\", \"binding\", \"\");\n        if (qualifier.hasSet())\n            error(loc, \"cannot be used with shaderRecordNV\", \"set\", \"\");\n\n    }\n\n    if (qualifier.storage == EvqTileImageEXT) {\n        if (qualifier.hasSet())\n            error(loc, \"cannot be used with tileImageEXT\", \"set\", \"\");\n        if (!qualifier.hasLocation())\n            error(loc, \"can only be used with an explicit location\", \"tileImageEXT\", \"\");\n    }\n\n    if (qualifier.storage == EvqHitAttr && qualifier.hasLayout()) {\n        error(loc, \"cannot apply layout qualifiers to hitAttributeNV variable\", \"hitAttributeNV\", \"\");\n    }\n}\n\n// For places that can't have shader-level layout qualifiers\nvoid TParseContext::checkNoShaderLayouts(const TSourceLoc& loc, const TShaderQualifiers& shaderQualifiers)\n{\n    const char* message = \"can only apply to a standalone qualifier\";\n\n    if (shaderQualifiers.geometry != ElgNone)\n        error(loc, message, TQualifier::getGeometryString(shaderQualifiers.geometry), \"\");\n    if (shaderQualifiers.spacing != EvsNone)\n        error(loc, message, TQualifier::getVertexSpacingString(shaderQualifiers.spacing), \"\");\n    if (shaderQualifiers.order != EvoNone)\n        error(loc, message, TQualifier::getVertexOrderString(shaderQualifiers.order), \"\");\n    if (shaderQualifiers.pointMode)\n        error(loc, message, \"point_mode\", \"\");\n    if (shaderQualifiers.invocations != TQualifier::layoutNotSet)\n        error(loc, message, \"invocations\", \"\");\n    for (int i = 0; i < 3; ++i) {\n        if (shaderQualifiers.localSize[i] > 1)\n            error(loc, message, \"local_size\", \"\");\n        if (shaderQualifiers.localSizeSpecId[i] != TQualifier::layoutNotSet)\n            error(loc, message, \"local_size id\", \"\");\n    }\n    if (shaderQualifiers.vertices != TQualifier::layoutNotSet) {\n        if (language == EShLangGeometry || language == EShLangMesh)\n            error(loc, message, \"max_vertices\", \"\");\n        else if (language == EShLangTessControl)\n            error(loc, message, \"vertices\", \"\");\n        else\n            assert(0);\n    }\n    if (shaderQualifiers.earlyFragmentTests)\n        error(loc, message, \"early_fragment_tests\", \"\");\n    if (shaderQualifiers.postDepthCoverage)\n        error(loc, message, \"post_depth_coverage\", \"\");\n    if (shaderQualifiers.nonCoherentColorAttachmentReadEXT)\n        error(loc, message, \"non_coherent_color_attachment_readEXT\", \"\");\n    if (shaderQualifiers.nonCoherentDepthAttachmentReadEXT)\n        error(loc, message, \"non_coherent_depth_attachment_readEXT\", \"\");\n    if (shaderQualifiers.nonCoherentStencilAttachmentReadEXT)\n        error(loc, message, \"non_coherent_stencil_attachment_readEXT\", \"\");\n    if (shaderQualifiers.primitives != TQualifier::layoutNotSet) {\n        if (language == EShLangMesh)\n            error(loc, message, \"max_primitives\", \"\");\n        else\n            assert(0);\n    }\n    if (shaderQualifiers.hasBlendEquation())\n        error(loc, message, \"blend equation\", \"\");\n    if (shaderQualifiers.numViews != TQualifier::layoutNotSet)\n        error(loc, message, \"num_views\", \"\");\n    if (shaderQualifiers.interlockOrdering != EioNone)\n        error(loc, message, TQualifier::getInterlockOrderingString(shaderQualifiers.interlockOrdering), \"\");\n    if (shaderQualifiers.layoutPrimitiveCulling)\n        error(loc, \"can only be applied as standalone\", \"primitive_culling\", \"\");\n\n    if (shaderQualifiers.layoutNonCoherentTileAttachmentReadQCOM)\n        error(loc, message, \"non_coherent_attachment_readQCOM\", \"\");\n    if (shaderQualifiers.layoutTileShadingRateQCOM[0] >= 1)\n        error(loc, message, \"shading_rate_xQCOM\", \"\");\n    if (shaderQualifiers.layoutTileShadingRateQCOM[1] >= 1)\n        error(loc, message, \"shading_rate_yQCOM\", \"\");\n    if (shaderQualifiers.layoutTileShadingRateQCOM[2] >= 1)\n        error(loc, message, \"shading_rate_zQCOM\", \"\");\n}\n\n// Correct and/or advance an object's offset layout qualifier.\nvoid TParseContext::fixOffset(const TSourceLoc& loc, TSymbol& symbol)\n{\n    const TQualifier& qualifier = symbol.getType().getQualifier();\n    if (symbol.getType().isAtomic()) {\n        if (qualifier.hasBinding() && (int)qualifier.layoutBinding < resources.maxAtomicCounterBindings) {\n\n            // Set the offset\n            int offset;\n            if (qualifier.hasOffset())\n                offset = qualifier.layoutOffset;\n            else\n                offset = atomicUintOffsets[qualifier.layoutBinding];\n\n            if (offset % 4 != 0)\n                error(loc, \"atomic counters offset should align based on 4:\", \"offset\", \"%d\", offset);\n\n            symbol.getWritableType().getQualifier().layoutOffset = offset;\n\n            // Check for overlap\n            int numOffsets = 4;\n            if (symbol.getType().isArray()) {\n                if (symbol.getType().isSizedArray() && !symbol.getType().getArraySizes()->isInnerUnsized())\n                    numOffsets *= symbol.getType().getCumulativeArraySize();\n                else {\n                    // \"It is a compile-time error to declare an unsized array of atomic_uint.\"\n                    error(loc, \"array must be explicitly sized\", \"atomic_uint\", \"\");\n                }\n            }\n            int repeated = intermediate.addUsedOffsets(qualifier.layoutBinding, offset, numOffsets);\n            if (repeated >= 0)\n                error(loc, \"atomic counters sharing the same offset:\", \"offset\", \"%d\", repeated);\n\n            // Bump the default offset\n            atomicUintOffsets[qualifier.layoutBinding] = offset + numOffsets;\n        }\n    }\n}\n\n//\n// Look up a function name in the symbol table, and make sure it is a function.\n//\n// Return the function symbol if found, otherwise nullptr.\n//\nconst TFunction* TParseContext::findFunction(const TSourceLoc& loc, const TFunction& call, bool& builtIn)\n{\n    if (symbolTable.isFunctionNameVariable(call.getName())) {\n        error(loc, \"can't use function syntax on variable\", call.getName().c_str(), \"\");\n        return nullptr;\n    }\n\n    const TFunction* function = nullptr;\n\n    // debugPrintfEXT has var args and is in the symbol table as \"debugPrintfEXT()\",\n    // mangled to \"debugPrintfEXT(\"\n    if (call.getName() == \"debugPrintfEXT\") {\n        TSymbol* symbol = symbolTable.find(\"debugPrintfEXT(\", &builtIn);\n        if (symbol)\n            return symbol->getAsFunction();\n    }\n\n    // coopMatPerElementNV is variadic. There is some function signature error\n    // checking in handleCoopMat2FunctionCall.\n    if (call.getName() == \"coopMatPerElementNV\") {\n        TSymbol* symbol = symbolTable.find(\"coopMatPerElementNV(\", &builtIn);\n        if (symbol)\n            return symbol->getAsFunction();\n    }\n\n    if (call.getName() == \"saturatedConvertEXT\") {\n        TSymbol* symbol = symbolTable.find(\"saturatedConvertEXT(\", &builtIn);\n        if (symbol)\n            return symbol->getAsFunction();\n    }\n\n    bool explicitTypesEnabled = extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types) ||\n                                extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_int8) ||\n                                extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_int16) ||\n                                extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_int32) ||\n                                extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_int64) ||\n                                extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_float16) ||\n                                extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_float32) ||\n                                extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_float64);\n\n    if (isEsProfile())\n        function = (explicitTypesEnabled && version >= 310)\n                   ? findFunctionExplicitTypes(loc, call, builtIn)\n                   : ((extensionTurnedOn(E_GL_EXT_shader_implicit_conversions) && version >= 310)\n                      ? findFunction120(loc, call, builtIn)\n                      : findFunctionExact(loc, call, builtIn));\n    else if (version < 120)\n        function = findFunctionExact(loc, call, builtIn);\n    else if (version < 400) {\n        bool needfindFunction400 = extensionTurnedOn(E_GL_ARB_gpu_shader_fp64)\n                                  || extensionTurnedOn(E_GL_ARB_gpu_shader5)\n                                  || extensionTurnedOn(E_GL_NV_gpu_shader5);\n        function = needfindFunction400 ? findFunction400(loc, call, builtIn) : findFunction120(loc, call, builtIn);\n    }\n    else if (explicitTypesEnabled)\n        function = findFunctionExplicitTypes(loc, call, builtIn);\n    else\n        function = findFunction400(loc, call, builtIn);\n\n    return function;\n}\n\n// Function finding algorithm for ES and desktop 110.\nconst TFunction* TParseContext::findFunctionExact(const TSourceLoc& loc, const TFunction& call, bool& builtIn)\n{\n    TSymbol* symbol = symbolTable.find(call.getMangledName(), &builtIn);\n    if (symbol == nullptr) {\n        error(loc, \"no matching overloaded function found\", call.getName().c_str(), \"\");\n\n        return nullptr;\n    }\n\n    return symbol->getAsFunction();\n}\n\n// Function finding algorithm for desktop versions 120 through 330.\nconst TFunction* TParseContext::findFunction120(const TSourceLoc& loc, const TFunction& call, bool& builtIn)\n{\n    // first, look for an exact match\n    TSymbol* symbol = symbolTable.find(call.getMangledName(), &builtIn);\n    if (symbol)\n        return symbol->getAsFunction();\n\n    // exact match not found, look through a list of overloaded functions of the same name\n\n    // \"If no exact match is found, then [implicit conversions] will be applied to find a match. Mismatched types\n    // on input parameters (in or inout or default) must have a conversion from the calling argument type to the\n    // formal parameter type. Mismatched types on output parameters (out or inout) must have a conversion\n    // from the formal parameter type to the calling argument type.  When argument conversions are used to find\n    // a match, it is a semantic error if there are multiple ways to apply these conversions to make the call match\n    // more than one function.\"\n\n    const TFunction* candidate = nullptr;\n    TVector<const TFunction*> candidateList;\n    symbolTable.findFunctionNameList(call.getMangledName(), candidateList, builtIn);\n\n    for (auto it = candidateList.begin(); it != candidateList.end(); ++it) {\n        const TFunction& function = *(*it);\n\n        // to even be a potential match, number of arguments has to match\n        if (call.getParamCount() != function.getParamCount())\n            continue;\n\n        bool possibleMatch = true;\n        for (int i = 0; i < function.getParamCount(); ++i) {\n            // same types is easy\n            if (*function[i].type == *call[i].type)\n                continue;\n\n            // We have a mismatch in type, see if it is implicitly convertible\n\n            if (function[i].type->isArray() || call[i].type->isArray() ||\n                ! function[i].type->sameElementShape(*call[i].type))\n                possibleMatch = false;\n            else {\n                // do direction-specific checks for conversion of basic type\n                if (function[i].type->getQualifier().isParamInput()) {\n                    if (! intermediate.canImplicitlyPromote(call[i].type->getBasicType(), function[i].type->getBasicType()))\n                        possibleMatch = false;\n                }\n                if (function[i].type->getQualifier().isParamOutput()) {\n                    if (! intermediate.canImplicitlyPromote(function[i].type->getBasicType(), call[i].type->getBasicType()))\n                        possibleMatch = false;\n                }\n            }\n            if (! possibleMatch)\n                break;\n        }\n        if (possibleMatch) {\n            if (candidate) {\n                // our second match, meaning ambiguity\n                error(loc, \"ambiguous function signature match: multiple signatures match under implicit type conversion\", call.getName().c_str(), \"\");\n            } else\n                candidate = &function;\n        }\n    }\n\n    if (candidate == nullptr)\n        error(loc, \"no matching overloaded function found\", call.getName().c_str(), \"\");\n\n    return candidate;\n}\n\n// Function finding algorithm for desktop version 400 and above.\n//\n// \"When function calls are resolved, an exact type match for all the arguments\n// is sought. If an exact match is found, all other functions are ignored, and\n// the exact match is used. If no exact match is found, then the implicit\n// conversions in section 4.1.10 Implicit Conversions will be applied to find\n// a match. Mismatched types on input parameters (in or inout or default) must\n// have a conversion from the calling argument type to the formal parameter type.\n// Mismatched types on output parameters (out or inout) must have a conversion\n// from the formal parameter type to the calling argument type.\n//\n// \"If implicit conversions can be used to find more than one matching function,\n// a single best-matching function is sought. To determine a best match, the\n// conversions between calling argument and formal parameter types are compared\n// for each function argument and pair of matching functions. After these\n// comparisons are performed, each pair of matching functions are compared.\n// A function declaration A is considered a better match than function\n// declaration B if\n//\n//  * for at least one function argument, the conversion for that argument in A\n//    is better than the corresponding conversion in B; and\n//  * there is no function argument for which the conversion in B is better than\n//    the corresponding conversion in A.\n//\n// \"If a single function declaration is considered a better match than every\n// other matching function declaration, it will be used. Otherwise, a\n// compile-time semantic error for an ambiguous overloaded function call occurs.\n//\n// \"To determine whether the conversion for a single argument in one match is\n// better than that for another match, the following rules are applied, in order:\n//\n//  1. An exact match is better than a match involving any implicit conversion.\n//  2. A match involving an implicit conversion from float to double is better\n//     than a match involving any other implicit conversion.\n//  3. A match involving an implicit conversion from either int or uint to float\n//     is better than a match involving an implicit conversion from either int\n//     or uint to double.\n//\n// \"If none of the rules above apply to a particular pair of conversions, neither\n// conversion is considered better than the other.\"\n//\nconst TFunction* TParseContext::findFunction400(const TSourceLoc& loc, const TFunction& call, bool& builtIn)\n{\n    // first, look for an exact match\n    TSymbol* symbol = symbolTable.find(call.getMangledName(), &builtIn);\n    if (symbol)\n        return symbol->getAsFunction();\n\n    // no exact match, use the generic selector, parameterized by the GLSL rules\n\n    // create list of candidates to send\n    TVector<const TFunction*> candidateList;\n    symbolTable.findFunctionNameList(call.getMangledName(), candidateList, builtIn);\n\n    // can 'from' convert to 'to'?\n    const auto convertible = [this,builtIn](const TType& from, const TType& to, TOperator op, int param) -> bool {\n        if (from == to)\n            return true;\n        if (from.coopMatParameterOK(to))\n            return true;\n        if (from.tensorParameterOK(to))\n            return true;\n        if (from.getBasicType() == EbtFunction && to.getBasicType() == EbtFunction)\n            return true;\n        if (from.coopVecParameterOK(to))\n            return true;\n        // Allow a sized array to be passed through an unsized array parameter, for coopMatLoad/Store functions\n        if (builtIn && from.isArray() && to.isUnsizedArray()) {\n            TType fromElementType(from, 0);\n            TType toElementType(to, 0);\n            // Load/store tensor functions allow any element type for the pointer\n            if ((op == EOpCooperativeMatrixLoadTensorNV || op == EOpCooperativeMatrixStoreTensorNV) &&\n                param == 1 &&\n                (from.getQualifier().storage == EvqBuffer || from.getQualifier().storage == EvqShared)) {\n                return true;\n            }\n            if (fromElementType == toElementType)\n                return true;\n        }\n        if (from.isArray() || to.isArray() || ! from.sameElementShape(to))\n            return false;\n        if (from.isCoopMat() && to.isCoopMat())\n            return from.sameCoopMatBaseType(to);\n        if (from.isCoopVecNV() && to.isCoopVecNV())\n            return from.sameCoopVecBaseType(to);\n        return intermediate.canImplicitlyPromote(from.getBasicType(), to.getBasicType());\n    };\n\n    // Is 'to2' a better conversion than 'to1'?\n    // Ties should not be considered as better.\n    // Assumes 'convertible' already said true.\n    const auto better = [&](const TType& from, const TType& to1, const TType& to2) -> bool {\n        // 1. exact match\n        if (from == to2)\n            return from != to1;\n        if (from == to1)\n            return false;\n        if (extensionTurnedOn(E_GL_NV_gpu_shader5)) {\n            // This map refers to the conversion table mentioned under the \n            // section \"Modify Section 6.1, Function Definitions, p. 63\" in NV_gpu_shader5 spec\n            const static std::map<int, std::vector<int>> conversionTable = {\n                {EbtInt8,   {EbtInt, EbtInt64}},\n                {EbtInt16,  {EbtInt, EbtInt64}},\n                {EbtInt,    {EbtInt64}},\n                {EbtUint8,  {EbtUint, EbtUint64}}, \n                {EbtUint16, {EbtUint, EbtUint64}}, \n                {EbtUint,   {EbtUint64}},\n            };\n            auto source = conversionTable.find(from.getBasicType());\n            if (source != conversionTable.end()) {\n                for (auto destination : source->second) {\n                    if (to2.getBasicType() == destination &&\n                        to1.getBasicType() != destination) // to2 is better then to1\n                        return true;\n                    else if (to1.getBasicType() == destination &&\n                             to2.getBasicType() != destination) // This means to1 is better then to2\n                        return false;\n                }\n            }\n        }\n        // 2. float -> double is better\n        if (from.getBasicType() == EbtFloat) {\n            if (to2.getBasicType() == EbtDouble && to1.getBasicType() != EbtDouble)\n                return true;\n        }\n\n        // 3. -> float is better than -> double\n        return to2.getBasicType() == EbtFloat && to1.getBasicType() == EbtDouble;\n    };\n\n    // for ambiguity reporting\n    bool tie = false;\n\n    // send to the generic selector\n    const TFunction* bestMatch = selectFunction(candidateList, call, convertible, better, tie);\n\n    if (bestMatch == nullptr)\n        error(loc, \"no matching overloaded function found\", call.getName().c_str(), \"\");\n    else if (tie)\n        error(loc, \"ambiguous best function under implicit type conversion\", call.getName().c_str(), \"\");\n\n    return bestMatch;\n}\n\n// \"To determine whether the conversion for a single argument in one match\n//  is better than that for another match, the conversion is assigned of the\n//  three ranks ordered from best to worst:\n//   1. Exact match: no conversion.\n//    2. Promotion: integral or floating-point promotion.\n//    3. Conversion: integral conversion, floating-point conversion,\n//       floating-integral conversion.\n//  A conversion C1 is better than a conversion C2 if the rank of C1 is\n//  better than the rank of C2.\"\nconst TFunction* TParseContext::findFunctionExplicitTypes(const TSourceLoc& loc, const TFunction& call, bool& builtIn)\n{\n    // first, look for an exact match\n    TSymbol* symbol = symbolTable.find(call.getMangledName(), &builtIn);\n    if (symbol)\n        return symbol->getAsFunction();\n\n    // no exact match, use the generic selector, parameterized by the GLSL rules\n\n    // create list of candidates to send\n    TVector<const TFunction*> candidateList;\n    symbolTable.findFunctionNameList(call.getMangledName(), candidateList, builtIn);\n\n    // can 'from' convert to 'to'?\n    const auto convertible = [this,builtIn](const TType& from, const TType& to, TOperator op, int param) -> bool {\n        if (from == to)\n            return true;\n        if (from.coopMatParameterOK(to))\n            return true;\n        if (from.tensorParameterOK(to))\n            return true;\n        if (from.getBasicType() == EbtFunction && to.getBasicType() == EbtFunction)\n            return true;\n        if (from.coopVecParameterOK(to))\n            return true;\n        // Allow a sized array to be passed through an unsized array parameter, for coopMatLoad/Store functions\n        if (builtIn && from.isArray() && to.isUnsizedArray()) {\n            TType fromElementType(from, 0);\n            TType toElementType(to, 0);\n            // Load/store tensor functions allow any element type for the pointer\n            if ((op == EOpCooperativeMatrixLoadTensorNV || op == EOpCooperativeMatrixStoreTensorNV) &&\n                param == 1 &&\n                (from.getQualifier().storage == EvqBuffer || from.getQualifier().storage == EvqShared)) {\n                return true;\n            }\n            if (fromElementType == toElementType)\n                return true;\n        }\n        if (from.isArray() || to.isArray() || ! from.sameElementShape(to))\n            return false;\n        if (from.isCoopMat() && to.isCoopMat())\n            return from.sameCoopMatBaseType(to);\n        if (from.isCoopVecNV() && to.isCoopVecNV())\n            return from.sameCoopVecBaseType(to);\n        return intermediate.canImplicitlyPromote(from.getBasicType(), to.getBasicType());\n    };\n\n    // Is 'to2' a better conversion than 'to1'?\n    // Ties should not be considered as better.\n    // Assumes 'convertible' already said true.\n    const auto better = [this](const TType& from, const TType& to1, const TType& to2) -> bool {\n        // 1. exact match\n        if (from == to2)\n            return from != to1;\n        if (from == to1)\n            return false;\n\n        // 2. Promotion (integral, floating-point) is better\n        TBasicType from_type = from.getBasicType();\n        TBasicType to1_type = to1.getBasicType();\n        TBasicType to2_type = to2.getBasicType();\n        bool isPromotion1 = (intermediate.isIntegralPromotion(from_type, to1_type) ||\n                             intermediate.isFPPromotion(from_type, to1_type));\n        bool isPromotion2 = (intermediate.isIntegralPromotion(from_type, to2_type) ||\n                             intermediate.isFPPromotion(from_type, to2_type));\n        if (isPromotion2)\n            return !isPromotion1;\n        if(isPromotion1)\n            return false;\n\n        // 3. Conversion (integral, floating-point , floating-integral)\n        bool isConversion1 = (intermediate.isIntegralConversion(from_type, to1_type) ||\n                              intermediate.isFPConversion(from_type, to1_type) ||\n                              intermediate.isFPIntegralConversion(from_type, to1_type));\n        bool isConversion2 = (intermediate.isIntegralConversion(from_type, to2_type) ||\n                              intermediate.isFPConversion(from_type, to2_type) ||\n                              intermediate.isFPIntegralConversion(from_type, to2_type));\n\n        return isConversion2 && !isConversion1;\n    };\n\n    // for ambiguity reporting\n    bool tie = false;\n\n    // send to the generic selector\n    const TFunction* bestMatch = selectFunction(candidateList, call, convertible, better, tie);\n\n    if (bestMatch == nullptr)\n        error(loc, \"no matching overloaded function found\", call.getName().c_str(), \"\");\n    else if (tie)\n        error(loc, \"ambiguous best function under implicit type conversion\", call.getName().c_str(), \"\");\n\n    return bestMatch;\n}\n\n//\n// Adjust function calls that aren't declared in Vulkan to a\n// calls with equivalent effects\n//\nTIntermTyped* TParseContext::vkRelaxedRemapFunctionCall(const TSourceLoc& loc, TFunction* function, TIntermNode* arguments)\n{\n    TIntermTyped* result = nullptr;\n\n    if (function->getBuiltInOp() != EOpNull) {\n        return nullptr;\n    }\n\n    if (function->getName() == \"atomicCounterIncrement\") {\n        // change atomicCounterIncrement into an atomicAdd of 1\n        TString name(\"atomicAdd\");\n        TType uintType(EbtUint);\n\n        TFunction realFunc(&name, function->getType());\n\n        // Use copyParam to avoid shared ownership of the 'type' field\n        // of the parameter.\n        for (int i = 0; i < function->getParamCount(); ++i) {\n            realFunc.addParameter(TParameter().copyParam((*function)[i]));\n        }\n\n        TParameter tmpP = { nullptr, &uintType, {} };\n        realFunc.addParameter(TParameter().copyParam(tmpP));\n        arguments = intermediate.growAggregate(arguments, intermediate.addConstantUnion(1, loc, true));\n\n        result = handleFunctionCall(loc, &realFunc, arguments);\n    } else if (function->getName() == \"atomicCounterDecrement\") {\n        // change atomicCounterDecrement into an atomicAdd with -1\n        // and subtract 1 from result, to return post-decrement value\n        TString name(\"atomicAdd\");\n        TType uintType(EbtUint);\n\n        TFunction realFunc(&name, function->getType());\n\n        for (int i = 0; i < function->getParamCount(); ++i) {\n            realFunc.addParameter(TParameter().copyParam((*function)[i]));\n        }\n\n        TParameter tmpP = { nullptr, &uintType, {} };\n        realFunc.addParameter(TParameter().copyParam(tmpP));\n        arguments = intermediate.growAggregate(arguments, intermediate.addConstantUnion(-1, loc, true));\n\n        result = handleFunctionCall(loc, &realFunc, arguments);\n\n        // post decrement, so that it matches AtomicCounterDecrement semantics\n        if (result) {\n            result = handleBinaryMath(loc, \"-\", EOpSub, result, intermediate.addConstantUnion(1, loc, true));\n        }\n    } else if (function->getName() == \"atomicCounter\") {\n        // change atomicCounter into a direct read of the variable\n        if (arguments && arguments->getAsTyped()) {\n            result = arguments->getAsTyped();\n        }\n    }\n\n    return result;\n}\n\n// When a declaration includes a type, but not a variable name, it can be used\n// to establish defaults.\nvoid TParseContext::declareTypeDefaults(const TSourceLoc& loc, const TPublicType& publicType)\n{\n    if (publicType.basicType == EbtAtomicUint && publicType.qualifier.hasBinding()) {\n        if (publicType.qualifier.layoutBinding >= (unsigned int)resources.maxAtomicCounterBindings) {\n            error(loc, \"atomic_uint binding is too large\", \"binding\", \"\");\n            return;\n        }\n        if (publicType.qualifier.hasOffset())\n            atomicUintOffsets[publicType.qualifier.layoutBinding] = publicType.qualifier.layoutOffset;\n        return;\n    }\n\n    if (publicType.arraySizes) {\n        error(loc, \"expect an array name\", \"\", \"\");\n    }\n\n    if (publicType.qualifier.hasLayout() && !publicType.qualifier.hasBufferReference())\n        warn(loc, \"useless application of layout qualifier\", \"layout\", \"\");\n}\n\nvoid TParseContext::typeParametersCheck(const TSourceLoc& loc, const TPublicType& publicType)\n{\n    if (parsingBuiltins)\n        return;\n    if (publicType.isCoopmatKHR()) {\n        if (publicType.typeParameters == nullptr) {\n            error(loc, \"coopmat missing type parameters\", \"\", \"\");\n            return;\n        }\n        switch (publicType.typeParameters->basicType) {\n        case EbtFloat:\n        case EbtFloat16:\n        case EbtBFloat16:\n        case EbtFloatE5M2:\n        case EbtFloatE4M3:\n        case EbtInt:\n        case EbtInt8:\n        case EbtInt16:\n        case EbtUint:\n        case EbtUint8:\n        case EbtUint16:\n        case EbtSpirvType:\n            break;\n        default:\n            error(loc, \"coopmat invalid basic type\", TType::getBasicString(publicType.typeParameters->basicType), \"\");\n            break;\n        }\n        if (publicType.typeParameters->arraySizes->getNumDims() != 4) {\n            error(loc, \"coopmat incorrect number of type parameters\", \"\", \"\");\n            return;\n        }\n        int use = publicType.typeParameters->arraySizes->getDimSize(3);\n        if (use < 0 || use > 2) {\n            error(loc, \"coopmat invalid matrix Use\", \"\", \"\");\n            return;\n        }\n    }\n    if (publicType.isTensorLayoutNV()) {\n        if (publicType.typeParameters == nullptr) {\n            error(loc, \"tensorLayout missing type parameters\", \"\", \"\");\n            return;\n        }\n        if (publicType.typeParameters->arraySizes->getNumDims() > 2) {\n            error(loc, \"tensorLayout incorrect number of type parameters\", \"\", \"\");\n            return;\n        }\n        if (publicType.typeParameters && publicType.typeParameters->arraySizes->getNumDims() < 2) {\n            while (publicType.typeParameters->arraySizes->getNumDims() < 2) {\n                publicType.typeParameters->arraySizes->addInnerSize(0);\n            }\n        }\n    }\n    if (publicType.isTensorViewNV()) {\n        if (publicType.typeParameters == nullptr) {\n            error(loc, \"tensorView missing type parameters\", \"\", \"\");\n            return;\n        }\n        if (publicType.typeParameters->arraySizes->getNumDims() < 1 ||\n            publicType.typeParameters->arraySizes->getNumDims() > 7) {\n            error(loc, \"tensorView incorrect number of type parameters\", \"\", \"\");\n            return;\n        }\n        if (publicType.typeParameters && publicType.typeParameters->arraySizes->getNumDims() < 7) {\n            uint32_t numDims = publicType.typeParameters->arraySizes->getNumDims();\n            while (numDims < 7) {\n                uint32_t dim = (numDims == 1) ? 0 : (numDims - 2);\n                publicType.typeParameters->arraySizes->addInnerSize(dim);\n                numDims++;\n            }\n        }\n    }\n}\n\nbool TParseContext::vkRelaxedRemapUniformVariable(const TSourceLoc& loc, TString& identifier, const TPublicType& publicType,\n    TArraySizes*, TIntermTyped* initializer, TType& type)\n{\n    vkRelaxedRemapUniformMembers(loc, publicType, type, identifier);\n\n    if (parsingBuiltins || symbolTable.atBuiltInLevel() || !symbolTable.atGlobalLevel() ||\n        type.getQualifier().storage != EvqUniform ||\n        !(type.containsNonOpaque() || type.getBasicType() == EbtAtomicUint || (type.containsSampler() && type.isStruct()))) {\n        return false;\n    }\n\n    if (type.getQualifier().hasLocation()) {\n        warn(loc, \"ignoring layout qualifier for uniform\", identifier.c_str(), \"location\");\n        type.getQualifier().layoutLocation = TQualifier::layoutLocationEnd;\n    }\n\n    if (initializer) {\n        warn(loc, \"Ignoring initializer for uniform\", identifier.c_str(), \"\");\n        initializer = nullptr;\n    }\n\n    if (type.isArray()) {\n        // do array size checks here\n        arraySizesCheck(loc, type.getQualifier(), type.getArraySizes(), initializer, false);\n\n        if (arrayQualifierError(loc, type.getQualifier()) || arrayError(loc, type)) {\n            error(loc, \"array param error\", identifier.c_str(), \"\");\n        }\n    }\n\n    // do some checking on the type as it was declared\n    layoutTypeCheck(loc, type);\n\n    int bufferBinding = TQualifier::layoutBindingEnd;\n    TVariable* updatedBlock = nullptr;\n\n    // Convert atomic_uint into members of a buffer block\n    if (type.isAtomic()) {\n        type.setBasicType(EbtUint);\n        type.getQualifier().storage = EvqBuffer;\n\n        type.getQualifier().volatil = true;\n        type.getQualifier().coherent = true;\n\n        // xxTODO: use logic from fixOffset() to apply explicit member offset\n        bufferBinding = type.getQualifier().layoutBinding;\n        type.getQualifier().layoutBinding = TQualifier::layoutBindingEnd;\n        type.getQualifier().explicitOffset = false;\n        growAtomicCounterBlock(bufferBinding, loc, type, identifier, nullptr);\n        updatedBlock = atomicCounterBuffers[bufferBinding];\n    }\n\n    if (!updatedBlock) {\n        growGlobalUniformBlock(loc, type, identifier, nullptr);\n        updatedBlock = globalUniformBlock;\n    }\n\n    //\n    //      don't assign explicit member offsets here\n    //      if any are assigned, need to be updated here and in the merge/link step\n    // fixBlockUniformOffsets(updatedBlock->getWritableType().getQualifier(), *updatedBlock->getWritableType().getWritableStruct());\n\n    // checks on update buffer object\n    layoutObjectCheck(loc, *updatedBlock);\n\n    TSymbol* symbol = symbolTable.find(identifier);\n\n    if (!symbol) {\n        if (updatedBlock == globalUniformBlock)\n            error(loc, \"error adding uniform to default uniform block\", identifier.c_str(), \"\");\n        else\n            error(loc, \"error adding atomic counter to atomic counter block\", identifier.c_str(), \"\");\n        return false;\n    }\n\n    // merge qualifiers\n    mergeObjectLayoutQualifiers(updatedBlock->getWritableType().getQualifier(), type.getQualifier(), true);\n\n    return true;\n}\n\ntemplate <typename Function>\nstatic void ForEachOpaque(const TType& type, const TString& path, Function callback)\n{\n    auto recursion = [&callback](const TType& type, const TString& path, bool skipArray, auto& recursion) -> void {\n        if (!skipArray && type.isArray())\n        {\n            std::vector<int> indices(type.getArraySizes()->getNumDims());\n            for (int flatIndex = 0;\n                 flatIndex < type.getArraySizes()->getCumulativeSize();\n                 ++flatIndex)\n            {\n                TString subscriptPath = path;\n                for (size_t dimIndex = 0; dimIndex < indices.size(); ++dimIndex)\n                {\n                    int index = indices[dimIndex];\n                    subscriptPath.append(\"[\");\n                    subscriptPath.append(String(index));\n                    subscriptPath.append(\"]\");\n                }\n\n                recursion(type, subscriptPath, true, recursion);\n\n                for (size_t dimIndex = 0; dimIndex < indices.size(); ++dimIndex)\n                {\n                    ++indices[dimIndex];\n                    if (indices[dimIndex] < type.getArraySizes()->getDimSize(dimIndex))\n                        break;\n                    else\n                        indices[dimIndex] = 0;\n                }\n            }\n        }\n\n        else if (type.isStruct() && type.containsOpaque())\n        {\n            const TTypeList& types = *type.getStruct();\n            for (const TTypeLoc& typeLoc : types)\n            {\n                TString nextPath = path;\n                nextPath.append(\".\");\n                nextPath.append(typeLoc.type->getFieldName());\n\n                recursion(*(typeLoc.type), nextPath, false, recursion);\n            }\n        }\n\n        else if (type.isOpaque())\n        {\n            callback(type, path);\n        }\n    };\n\n    recursion(type, path, false, recursion);\n}\n\nvoid TParseContext::vkRelaxedRemapUniformMembers(const TSourceLoc& loc, const TPublicType& publicType, const TType& type,\n    const TString& identifier)\n{\n    if (!type.isStruct() || !type.containsOpaque())\n        return;\n\n    ForEachOpaque(type, identifier,\n                  [&publicType, &loc, this](const TType& type, const TString& path) {\n                      TArraySizes arraySizes = {};\n                      if (type.getArraySizes()) arraySizes = *type.getArraySizes();\n                      TTypeParameters typeParameters = {};\n                      if (type.getTypeParameters()) typeParameters = *type.getTypeParameters();\n\n                      TPublicType memberType{};\n                      memberType.basicType = type.getBasicType();\n                      memberType.sampler = type.getSampler();\n                      memberType.qualifier = type.getQualifier();\n                      memberType.vectorSize = type.getVectorSize();\n                      memberType.matrixCols = type.getMatrixCols();\n                      memberType.matrixRows = type.getMatrixRows();\n                      memberType.coopmatNV = type.isCoopMatNV();\n                      memberType.coopmatKHR = type.isCoopMatKHR();\n                      memberType.arraySizes = nullptr;\n                      memberType.userDef = nullptr;\n                      memberType.loc = loc;\n                      memberType.typeParameters = (type.getTypeParameters() ? &typeParameters : nullptr);\n                      memberType.spirvType = nullptr;\n\n                      memberType.qualifier.storage = publicType.qualifier.storage;\n                      memberType.shaderQualifiers = publicType.shaderQualifiers;\n\n                      TString& structMemberName = *NewPoolTString(path.c_str()); // A copy is required due to declareVariable() signature.\n                      declareVariable(loc, structMemberName, memberType, nullptr, nullptr);\n                  });\n}\n\nvoid TParseContext::vkRelaxedRemapFunctionParameter(TFunction* function, TParameter& param, std::vector<int>* newParams)\n{\n    function->addParameter(param);\n\n    if (!param.type->isStruct() || !param.type->containsOpaque())\n        return;\n\n    ForEachOpaque(*param.type, (param.name ? *param.name : param.type->getFieldName()),\n                  [function, param, newParams](const TType& type, const TString& path) {\n                      TString* memberName = NewPoolTString(path.c_str());\n\n                      TType* memberType = new TType();\n                      memberType->shallowCopy(type);\n                      memberType->getQualifier().storage = param.type->getQualifier().storage;\n                      memberType->clearArraySizes();\n\n                      TParameter memberParam = {};\n                      memberParam.name = memberName;\n                      memberParam.type = memberType;\n                      memberParam.defaultValue = nullptr;\n                      function->addParameter(memberParam);\n                      if (newParams)\n                          newParams->push_back(function->getParamCount()-1);\n                  });\n}\n\n//\n// Generates a valid GLSL dereferencing string for the input TIntermNode\n//\nstruct AccessChainTraverser : public TIntermTraverser {\n    AccessChainTraverser() : TIntermTraverser(false, false, true)\n    {}\n\n    TString path = \"\";\n    TStorageQualifier topLevelStorageQualifier = TStorageQualifier::EvqLast;\n\n    bool visitBinary(TVisit, TIntermBinary* binary) override {\n        if (binary->getOp() == EOpIndexDirectStruct)\n        {\n            const TTypeList& members = *binary->getLeft()->getType().getStruct();\n            const TTypeLoc& member =\n                members[binary->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst()];\n            TString memberName = member.type->getFieldName();\n\n            if (path != \"\")\n                path.append(\".\");\n\n            path.append(memberName);\n        }\n\n        if (binary->getOp() == EOpIndexDirect)\n        {\n            const TConstUnionArray& indices = binary->getRight()->getAsConstantUnion()->getConstArray();\n            for (int index = 0; index < indices.size(); ++index)\n            {\n                path.append(\"[\");\n                path.append(String(indices[index].getIConst()));\n                path.append(\"]\");\n            }\n        }\n\n        return true;\n    }\n\n    void visitSymbol(TIntermSymbol* symbol) override {\n        if (symbol->getType().isOpaque())\n            topLevelStorageQualifier = symbol->getQualifier().storage;\n        if (!IsAnonymous(symbol->getName()))\n            path.append(symbol->getName());\n    }\n};\n\nTIntermNode* TParseContext::vkRelaxedRemapFunctionArgument(const TSourceLoc& loc, TFunction* function, TIntermTyped* intermTyped)\n{\n    AccessChainTraverser accessChainTraverser{};\n    intermTyped->traverse(&accessChainTraverser);\n\n    if (accessChainTraverser.topLevelStorageQualifier == TStorageQualifier::EvqUniform)\n    {\n        TParameter param = { 0, new TType, {} };\n        param.type->shallowCopy(intermTyped->getType());\n\n        function->addParameter(param);\n        return intermTyped;\n    }\n\n    TParameter param = { NewPoolTString(accessChainTraverser.path.c_str()), new TType, {} };\n    param.type->shallowCopy(intermTyped->getType());\n\n    std::vector<int> newParams = {};\n    vkRelaxedRemapFunctionParameter(function, param, &newParams);\n\n    if (intermTyped->getType().isOpaque())\n    {\n        TIntermNode* remappedArgument = intermTyped;\n        {\n            TIntermSymbol* intermSymbol = nullptr;\n            TSymbol* symbol = symbolTable.find(*param.name);\n            if (symbol && symbol->getAsVariable())\n                intermSymbol = intermediate.addSymbol(*symbol->getAsVariable(), loc);\n            else\n            {\n                TVariable* variable = new TVariable(param.name, *param.type);\n                intermSymbol = intermediate.addSymbol(*variable, loc);\n            }\n\n            remappedArgument = intermSymbol;\n        }\n\n        return remappedArgument;\n    }\n    else if (!(intermTyped->isStruct() && intermTyped->getType().containsOpaque()))\n        return intermTyped;\n    else\n    {\n        TIntermNode* remappedArgument = intermTyped;\n        {\n            TSymbol* symbol = symbolTable.find(*param.name);\n            if (symbol && symbol->getAsVariable())\n                remappedArgument = intermediate.addSymbol(*symbol->getAsVariable(), loc);\n        }\n\n        if (!newParams.empty())\n            remappedArgument = intermediate.makeAggregate(remappedArgument, loc);\n\n        for (int paramIndex : newParams)\n        {\n            TParameter& newParam = function->operator[](paramIndex);\n            TIntermSymbol* intermSymbol = nullptr;\n            TSymbol* symbol = symbolTable.find(*newParam.name);\n            if (symbol && symbol->getAsVariable())\n                intermSymbol = intermediate.addSymbol(*symbol->getAsVariable(), loc);\n            else\n            {\n                TVariable* variable = new TVariable(newParam.name, *newParam.type);\n                intermSymbol = intermediate.addSymbol(*variable, loc);\n            }\n\n            remappedArgument = intermediate.growAggregate(remappedArgument, intermSymbol);\n        }\n\n        return remappedArgument;\n    }\n}\n\nTIntermTyped* TParseContext::vkRelaxedRemapDotDereference(const TSourceLoc&, TIntermTyped& base, const TType& member,\n    const TString& identifier)\n{\n    if (!member.isOpaque())\n        return &base;\n\n    AccessChainTraverser traverser{};\n    base.traverse(&traverser);\n    if (!traverser.path.empty())\n        traverser.path.append(\".\");\n    traverser.path.append(identifier);\n\n    const TSymbol* symbol = symbolTable.find(traverser.path);\n    if (!symbol)\n        return &base;\n\n    TIntermTyped* result = intermediate.addSymbol(*symbol->getAsVariable());\n    result->setType(symbol->getType());\n    return result;\n}\n\n//\n// Do everything necessary to handle a variable (non-block) declaration.\n// Either redeclaring a variable, or making a new one, updating the symbol\n// table, and all error checking.\n//\n// Returns a subtree node that computes an initializer, if needed.\n// Returns nullptr if there is no code to execute for initialization.\n//\n// 'publicType' is the type part of the declaration (to the left)\n// 'arraySizes' is the arrayness tagged on the identifier (to the right)\n//\nTIntermNode* TParseContext::declareVariable(const TSourceLoc& loc, TString& identifier, const TPublicType& publicType,\n    TArraySizes* arraySizes, TIntermTyped* initializer)\n{\n    // Make a fresh type that combines the characteristics from the individual\n    // identifier syntax and the declaration-type syntax.\n    TType type(publicType);\n    type.transferArraySizes(arraySizes);\n    type.copyArrayInnerSizes(publicType.arraySizes);\n    arrayOfArrayVersionCheck(loc, type.getArraySizes());\n\n    if (initializer) {\n        if (type.getBasicType() == EbtRayQuery) {\n            error(loc, \"ray queries can only be initialized by using the rayQueryInitializeEXT intrinsic:\", \"=\", identifier.c_str());\n        } else if (type.getBasicType() == EbtHitObjectNV) {\n            error(loc, \"hit objects cannot be initialized using initializers\", \"=\", identifier.c_str());\n        }\n\n    }\n\n    if (type.isCoopMatKHR()) {\n        intermediate.setUseVulkanMemoryModel();\n        intermediate.setUseStorageBuffer();\n\n        if (!publicType.typeParameters || !publicType.typeParameters->arraySizes ||\n            publicType.typeParameters->arraySizes->getNumDims() != 4) {\n            error(loc, \"unexpected number type parameters\", identifier.c_str(), \"\");\n        }\n        if (publicType.typeParameters) {\n            if (!isTypeFloat(publicType.typeParameters->basicType) &&\n                !isTypeInt(publicType.typeParameters->basicType) && publicType.typeParameters->basicType != EbtSpirvType) {\n                error(loc, \"expected 8, 16, 32, or 64 bit signed or unsigned integer or 16, 32, or 64 bit float type\", identifier.c_str(), \"\");\n            }\n        }\n    }\n    else if (type.isCoopMatNV()) {\n        intermediate.setUseVulkanMemoryModel();\n        intermediate.setUseStorageBuffer();\n\n        if (!publicType.typeParameters || !publicType.typeParameters->arraySizes || publicType.typeParameters->arraySizes->getNumDims() != 4) {\n            error(loc, \"expected four type parameters\", identifier.c_str(), \"\");\n        } else {\n            if (isTypeFloat(publicType.basicType) &&\n                publicType.typeParameters->arraySizes->getDimSize(0) != 16 &&\n                publicType.typeParameters->arraySizes->getDimSize(0) != 32 &&\n                publicType.typeParameters->arraySizes->getDimSize(0) != 64) {\n                error(loc, \"expected 16, 32, or 64 bits for first type parameter\", identifier.c_str(), \"\");\n            }\n            if (isTypeInt(publicType.basicType) &&\n                publicType.typeParameters->arraySizes->getDimSize(0) != 8 &&\n                publicType.typeParameters->arraySizes->getDimSize(0) != 16 &&\n                publicType.typeParameters->arraySizes->getDimSize(0) != 32) {\n                error(loc, \"expected 8, 16, or 32 bits for first type parameter\", identifier.c_str(), \"\");\n            }\n        }\n    } else if (type.isTensorLayoutNV()) {\n        if (!publicType.typeParameters || publicType.typeParameters->arraySizes->getNumDims() > 2) {\n            error(loc, \"expected 1-2 type parameters\", identifier.c_str(), \"\");\n        }\n    } else if (type.isTensorViewNV()) {\n        if (!publicType.typeParameters || publicType.typeParameters->arraySizes->getNumDims() > 7) {\n            error(loc, \"expected 1-7 type parameters\", identifier.c_str(), \"\");\n        }\n    } else if (type.isCoopVecNV()) {\n        intermediate.setUseVulkanMemoryModel();\n        intermediate.setUseStorageBuffer();\n\n        if (!publicType.typeParameters || !publicType.typeParameters->arraySizes || publicType.typeParameters->arraySizes->getNumDims() != 1) {\n            error(loc, \"expected two type parameters\", identifier.c_str(), \"\");\n        } else if (publicType.typeParameters->arraySizes->getDimSize(0) <= 0) {\n            error(loc, \"expected positive number of components\", identifier.c_str(), \"\");\n        }\n    } else {\n        if (publicType.typeParameters && publicType.typeParameters->arraySizes->getNumDims() != 0) {\n            error(loc, \"unexpected type parameters\", identifier.c_str(), \"\");\n        }\n    }\n\n    if (voidErrorCheck(loc, identifier, type.getBasicType()))\n        return nullptr;\n\n    if (initializer)\n        rValueErrorCheck(loc, \"initializer\", initializer);\n    else\n        nonInitConstCheck(loc, identifier, type);\n\n    samplerCheck(loc, type, identifier, initializer);\n    transparentOpaqueCheck(loc, type, identifier);\n    atomicUintCheck(loc, type, identifier);\n    accStructCheck(loc, type, identifier);\n    hitObjectNVCheck(loc, type, identifier);\n    checkAndResizeMeshViewDim(loc, type, /*isBlockMember*/ false);\n    if (type.getQualifier().storage == EvqConst && type.containsReference()) {\n        error(loc, \"variables with reference type can't have qualifier 'const'\", \"qualifier\", \"\");\n    }\n\n    if (type.getQualifier().storage != EvqUniform && type.getQualifier().storage != EvqBuffer) {\n        if (type.contains16BitFloat())\n            requireFloat16Arithmetic(loc, \"qualifier\", \"float16 types can only be in uniform block or buffer storage\");\n        if (type.contains16BitInt())\n            requireInt16Arithmetic(loc, \"qualifier\", \"(u)int16 types can only be in uniform block or buffer storage\");\n        if (type.contains8BitInt())\n            requireInt8Arithmetic(loc, \"qualifier\", \"(u)int8 types can only be in uniform block or buffer storage\");\n    }\n    if (type.getBasicType() == EbtBFloat16 &&\n        (type.getQualifier().storage == EvqVaryingIn || type.getQualifier().storage == EvqVaryingOut))\n        error(loc, \"qualifier\", \"bfloat16 types not allowed as input/output\", \"\");\n\n    if ((type.getBasicType() == EbtFloatE5M2 || type.getBasicType() == EbtFloatE4M3) &&\n        (type.getQualifier().storage == EvqVaryingIn || type.getQualifier().storage == EvqVaryingOut))\n        error(loc, \"qualifier\", \"fp8 types not allowed as input/output\", \"\");\n\n    if (type.getQualifier().storage == EvqtaskPayloadSharedEXT)\n        intermediate.addTaskPayloadEXTCount();\n    if (type.getQualifier().storage == EvqShared && type.containsCoopMat())\n        error(loc, \"qualifier\", \"Cooperative matrix types must not be used in shared memory\", \"\");\n\n    if (profile == EEsProfile) {\n        if (type.getQualifier().isPipeInput() && type.getBasicType() == EbtStruct) {\n            if (type.getQualifier().isArrayedIo(language)) {\n                TType perVertexType(type, 0);\n                if (perVertexType.containsArray() && perVertexType.containsBuiltIn() == false) {\n                    error(loc, \"A per vertex structure containing an array is not allowed as input in ES\", type.getTypeName().c_str(), \"\");\n                }\n            }\n            else if (type.containsArray() && type.containsBuiltIn() == false) {\n                error(loc, \"A structure containing an array is not allowed as input in ES\", type.getTypeName().c_str(), \"\");\n            }\n            if (type.containsStructure())\n                error(loc, \"A structure containing an struct is not allowed as input in ES\", type.getTypeName().c_str(), \"\");\n        }\n    }\n\n    if (identifier != \"gl_FragCoord\" && (publicType.shaderQualifiers.originUpperLeft || publicType.shaderQualifiers.pixelCenterInteger))\n        error(loc, \"can only apply origin_upper_left and pixel_center_origin to gl_FragCoord\", \"layout qualifier\", \"\");\n    if (identifier != \"gl_FragDepth\" && publicType.shaderQualifiers.getDepth() != EldNone)\n        error(loc, \"can only apply depth layout to gl_FragDepth\", \"layout qualifier\", \"\");\n    if (identifier != \"gl_FragStencilRefARB\" && publicType.shaderQualifiers.getStencil() != ElsNone)\n        error(loc, \"can only apply depth layout to gl_FragStencilRefARB\", \"layout qualifier\", \"\");\n\n    // Check for redeclaration of built-ins and/or attempting to declare a reserved name\n    TSymbol* symbol = redeclareBuiltinVariable(loc, identifier, type.getQualifier(), publicType.shaderQualifiers);\n    if (symbol == nullptr)\n        reservedErrorCheck(loc, identifier);\n\n    if (symbol == nullptr && spvVersion.vulkan > 0 && spvVersion.vulkanRelaxed) {\n        bool remapped = vkRelaxedRemapUniformVariable(loc, identifier, publicType, arraySizes, initializer, type);\n\n        if (remapped) {\n            return nullptr;\n        }\n    }\n\n    inheritGlobalDefaults(type.getQualifier());\n\n    // Declare the variable\n    if (type.isArray()) {\n        // Check that implicit sizing is only where allowed.\n        arraySizesCheck(loc, type.getQualifier(), type.getArraySizes(), initializer, false);\n\n        if (! arrayQualifierError(loc, type.getQualifier()) && ! arrayError(loc, type))\n            declareArray(loc, identifier, type, symbol);\n\n        if (initializer) {\n            profileRequires(loc, ENoProfile, 120, E_GL_3DL_array_objects, \"initializer\");\n            profileRequires(loc, EEsProfile, 300, nullptr, \"initializer\");\n        }\n    } else {\n        // non-array case\n        if (symbol == nullptr)\n            symbol = declareNonArray(loc, identifier, type);\n        else if (type != symbol->getType())\n            error(loc, \"cannot change the type of\", \"redeclaration\", symbol->getName().c_str());\n    }\n\n    if (symbol == nullptr)\n        return nullptr;\n\n    // Deal with initializer\n    TIntermNode* initNode = nullptr;\n    if (symbol != nullptr && initializer) {\n        TVariable* variable = symbol->getAsVariable();\n        if (! variable) {\n            error(loc, \"initializer requires a variable, not a member\", identifier.c_str(), \"\");\n            return nullptr;\n        }\n        initNode = executeInitializer(loc, initializer, variable);\n    }\n\n    // look for errors in layout qualifier use\n    layoutObjectCheck(loc, *symbol);\n\n    // fix up\n    fixOffset(loc, *symbol);\n\n    return initNode;\n}\n\n// Pick up global defaults from the provide global defaults into dst.\nvoid TParseContext::inheritGlobalDefaults(TQualifier& dst) const\n{\n    if (dst.storage == EvqVaryingOut) {\n        if (! dst.hasStream() && language == EShLangGeometry)\n            dst.layoutStream = globalOutputDefaults.layoutStream;\n        if (! dst.hasXfbBuffer())\n            dst.layoutXfbBuffer = globalOutputDefaults.layoutXfbBuffer;\n    }\n}\n\n//\n// Make an internal-only variable whose name is for debug purposes only\n// and won't be searched for.  Callers will only use the return value to use\n// the variable, not the name to look it up.  It is okay if the name\n// is the same as other names; there won't be any conflict.\n//\nTVariable* TParseContext::makeInternalVariable(const char* name, const TType& type) const\n{\n    TString* nameString = NewPoolTString(name);\n    TVariable* variable = new TVariable(nameString, type);\n    symbolTable.makeInternalVariable(*variable);\n\n    return variable;\n}\n\n//\n// Declare a non-array variable, the main point being there is no redeclaration\n// for resizing allowed.\n//\n// Return the successfully declared variable.\n//\nTVariable* TParseContext::declareNonArray(const TSourceLoc& loc, const TString& identifier, const TType& type)\n{\n    // make a new variable\n    TVariable* variable = new TVariable(&identifier, type);\n\n    ioArrayCheck(loc, type, identifier);\n\n    // add variable to symbol table\n    if (symbolTable.insert(*variable)) {\n        if (symbolTable.atGlobalLevel())\n            trackLinkage(*variable);\n        return variable;\n    }\n\n    error(loc, \"redefinition\", variable->getName().c_str(), \"\");\n    return nullptr;\n}\n\n//\n// Handle all types of initializers from the grammar.\n//\n// Returning nullptr just means there is no code to execute to handle the\n// initializer, which will, for example, be the case for constant initializers.\n//\nTIntermNode* TParseContext::executeInitializer(const TSourceLoc& loc, TIntermTyped* initializer, TVariable* variable)\n{\n    // A null initializer is an aggregate that hasn't had an op assigned yet\n    // (still EOpNull, no relation to nullInit), and has no children.\n    bool nullInit = initializer->getAsAggregate() && initializer->getAsAggregate()->getOp() == EOpNull &&\n        initializer->getAsAggregate()->getSequence().size() == 0;\n\n    //\n    // Identifier must be of type constant, a global, or a temporary, and\n    // starting at version 120, desktop allows uniforms to have initializers.\n    //\n    TStorageQualifier qualifier = variable->getType().getQualifier().storage;\n    if (! (qualifier == EvqTemporary || qualifier == EvqGlobal || qualifier == EvqConst ||\n           (qualifier == EvqUniform && !isEsProfile() && version >= 120))) {\n        if (qualifier == EvqShared) {\n            // GL_EXT_null_initializer allows this for shared, if it's a null initializer\n            if (nullInit) {\n                const char* feature = \"initialization with shared qualifier\";\n                profileRequires(loc, EEsProfile, 0, E_GL_EXT_null_initializer, feature);\n                profileRequires(loc, ~EEsProfile, 0, E_GL_EXT_null_initializer, feature);\n            } else {\n                error(loc, \"initializer can only be a null initializer ('{}')\", \"shared\", \"\");\n            }\n        } else {\n            error(loc, \" cannot initialize this type of qualifier \",\n                  variable->getType().getStorageQualifierString(), \"\");\n            return nullptr;\n        }\n    }\n\n    if (nullInit) {\n        // only some types can be null initialized\n        if (variable->getType().containsUnsizedArray()) {\n            error(loc, \"null initializers can't size unsized arrays\", \"{}\", \"\");\n            return nullptr;\n        }\n        if (variable->getType().containsOpaque()) {\n            error(loc, \"null initializers can't be used on opaque values\", \"{}\", \"\");\n            return nullptr;\n        }\n        variable->getWritableType().getQualifier().setNullInit();\n        return nullptr;\n    }\n\n    arrayObjectCheck(loc, variable->getType(), \"array initializer\");\n\n    //\n    // If the initializer was from braces { ... }, we convert the whole subtree to a\n    // constructor-style subtree, allowing the rest of the code to operate\n    // identically for both kinds of initializers.\n    //\n    // Type can't be deduced from the initializer list, so a skeletal type to\n    // follow has to be passed in.  Constness and specialization-constness\n    // should be deduced bottom up, not dictated by the skeletal type.\n    //\n    TType skeletalType;\n    skeletalType.shallowCopy(variable->getType());\n    skeletalType.getQualifier().makeTemporary();\n    initializer = convertInitializerList(loc, skeletalType, initializer);\n    if (! initializer) {\n        // error recovery; don't leave const without constant values\n        if (qualifier == EvqConst)\n            variable->getWritableType().getQualifier().makeTemporary();\n        return nullptr;\n    }\n\n    // Fix outer arrayness if variable is unsized, getting size from the initializer\n    if (initializer->getType().isSizedArray() && variable->getType().isUnsizedArray())\n        variable->getWritableType().changeOuterArraySize(initializer->getType().getOuterArraySize());\n\n    // Inner arrayness can also get set by an initializer\n    if (initializer->getType().isArrayOfArrays() && variable->getType().isArrayOfArrays() &&\n        initializer->getType().getArraySizes()->getNumDims() ==\n           variable->getType().getArraySizes()->getNumDims()) {\n        // adopt unsized sizes from the initializer's sizes\n        for (int d = 1; d < variable->getType().getArraySizes()->getNumDims(); ++d) {\n            if (variable->getType().getArraySizes()->getDimSize(d) == UnsizedArraySize) {\n                variable->getWritableType().getArraySizes()->setDimSize(d,\n                    initializer->getType().getArraySizes()->getDimSize(d));\n            }\n        }\n    }\n\n    // Uniforms require a compile-time constant initializer\n    if (qualifier == EvqUniform && ! initializer->getType().getQualifier().isFrontEndConstant()) {\n        error(loc, \"uniform initializers must be constant\", \"=\", \"'%s'\",\n              variable->getType().getCompleteString(intermediate.getEnhancedMsgs()).c_str());\n        variable->getWritableType().getQualifier().makeTemporary();\n        return nullptr;\n    }\n    // Global consts require a constant initializer (specialization constant is okay)\n    if (qualifier == EvqConst && symbolTable.atGlobalLevel() && ! initializer->getType().getQualifier().isConstant()) {\n        error(loc, \"global const initializers must be constant\", \"=\", \"'%s'\",\n              variable->getType().getCompleteString(intermediate.getEnhancedMsgs()).c_str());\n        variable->getWritableType().getQualifier().makeTemporary();\n        return nullptr;\n    }\n\n    // Const variables require a constant initializer, depending on version\n    if (qualifier == EvqConst) {\n        if (! initializer->getType().getQualifier().isConstant()) {\n            const char* initFeature = \"non-constant initializer\";\n            requireProfile(loc, ~EEsProfile, initFeature);\n            profileRequires(loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature);\n            variable->getWritableType().getQualifier().storage = EvqConstReadOnly;\n            qualifier = EvqConstReadOnly;\n        }\n    } else {\n        // Non-const global variables in ES need a const initializer.\n        //\n        // \"In declarations of global variables with no storage qualifier or with a const\n        // qualifier any initializer must be a constant expression.\"\n        if (symbolTable.atGlobalLevel() && ! initializer->getType().getQualifier().isConstant()) {\n            const char* initFeature =\n                \"non-constant global initializer (needs GL_EXT_shader_non_constant_global_initializers)\";\n            if (isEsProfile()) {\n                if (relaxedErrors() && ! extensionTurnedOn(E_GL_EXT_shader_non_constant_global_initializers))\n                    warn(loc, \"not allowed in this version\", initFeature, \"\");\n                else\n                    profileRequires(loc, EEsProfile, 0, E_GL_EXT_shader_non_constant_global_initializers, initFeature);\n            }\n        }\n    }\n\n    if (qualifier == EvqConst || qualifier == EvqUniform) {\n        // Compile-time tagging of the variable with its constant value...\n\n        initializer = intermediate.addConversion(EOpAssign, variable->getType(), initializer);\n        if (! initializer || ! initializer->getType().getQualifier().isConstant() ||\n            variable->getType() != initializer->getType()) {\n            error(loc, \"non-matching or non-convertible constant type for const initializer\",\n                  variable->getType().getStorageQualifierString(), \"\");\n            variable->getWritableType().getQualifier().makeTemporary();\n            return nullptr;\n        }\n\n        // We either have a folded constant in getAsConstantUnion, or we have to use\n        // the initializer's subtree in the AST to represent the computation of a\n        // specialization constant.\n        assert(initializer->getAsConstantUnion() || initializer->getType().getQualifier().isSpecConstant());\n        if (initializer->getAsConstantUnion())\n            variable->setConstArray(initializer->getAsConstantUnion()->getConstArray());\n        else {\n            // It's a specialization constant.\n            variable->getWritableType().getQualifier().makeSpecConstant();\n\n            // Keep the subtree that computes the specialization constant with the variable.\n            // Later, a symbol node will adopt the subtree from the variable.\n            variable->setConstSubtree(initializer);\n        }\n    } else {\n        // normal assigning of a value to a variable...\n        specializationCheck(loc, initializer->getType(), \"initializer\");\n        TIntermSymbol* intermSymbol = intermediate.addSymbol(*variable, loc);\n        TIntermTyped* initNode = intermediate.addAssign(EOpAssign, intermSymbol, initializer, loc);\n        if (! initNode)\n            assignError(loc, \"=\", intermSymbol->getCompleteString(intermediate.getEnhancedMsgs()), initializer->getCompleteString(intermediate.getEnhancedMsgs()));\n\n        return initNode;\n    }\n\n    return nullptr;\n}\n\n//\n// Reprocess any initializer-list (the  \"{ ... }\" syntax) parts of the\n// initializer.\n//\n// Need to hierarchically assign correct types and implicit\n// conversions. Will do this mimicking the same process used for\n// creating a constructor-style initializer, ensuring we get the\n// same form.  However, it has to in parallel walk the 'type'\n// passed in, as type cannot be deduced from an initializer list.\n//\nTIntermTyped* TParseContext::convertInitializerList(const TSourceLoc& loc, const TType& type, TIntermTyped* initializer)\n{\n    // Will operate recursively.  Once a subtree is found that is constructor style,\n    // everything below it is already good: Only the \"top part\" of the initializer\n    // can be an initializer list, where \"top part\" can extend for several (or all) levels.\n\n    // see if we have bottomed out in the tree within the initializer-list part\n    TIntermAggregate* initList = initializer->getAsAggregate();\n    if (! initList || initList->getOp() != EOpNull)\n        return initializer;\n\n    // Of the initializer-list set of nodes, need to process bottom up,\n    // so recurse deep, then process on the way up.\n\n    // Go down the tree here...\n    if (type.isArray()) {\n        // The type's array might be unsized, which could be okay, so base sizes on the size of the aggregate.\n        // Later on, initializer execution code will deal with array size logic.\n        TType arrayType;\n        arrayType.shallowCopy(type);                     // sharing struct stuff is fine\n        arrayType.copyArraySizes(*type.getArraySizes());  // but get a fresh copy of the array information, to edit below\n\n        // edit array sizes to fill in unsized dimensions\n        arrayType.changeOuterArraySize((int)initList->getSequence().size());\n        TIntermTyped* firstInit = initList->getSequence()[0]->getAsTyped();\n        if (arrayType.isArrayOfArrays() && firstInit->getType().isArray() &&\n            arrayType.getArraySizes()->getNumDims() == firstInit->getType().getArraySizes()->getNumDims() + 1) {\n            for (int d = 1; d < arrayType.getArraySizes()->getNumDims(); ++d) {\n                if (arrayType.getArraySizes()->getDimSize(d) == UnsizedArraySize)\n                    arrayType.getArraySizes()->setDimSize(d, firstInit->getType().getArraySizes()->getDimSize(d - 1));\n            }\n        }\n\n        TType elementType(arrayType, 0); // dereferenced type\n        for (size_t i = 0; i < initList->getSequence().size(); ++i) {\n            initList->getSequence()[i] = convertInitializerList(loc, elementType, initList->getSequence()[i]->getAsTyped());\n            if (initList->getSequence()[i] == nullptr)\n                return nullptr;\n        }\n\n        return addConstructor(loc, initList, arrayType);\n    } else if (type.isStruct()) {\n        if (type.getStruct()->size() != initList->getSequence().size()) {\n            error(loc, \"wrong number of structure members\", \"initializer list\", \"\");\n            return nullptr;\n        }\n        for (size_t i = 0; i < type.getStruct()->size(); ++i) {\n            initList->getSequence()[i] = convertInitializerList(loc, *(*type.getStruct())[i].type, initList->getSequence()[i]->getAsTyped());\n            if (initList->getSequence()[i] == nullptr)\n                return nullptr;\n        }\n    } else if (type.isMatrix()) {\n        if (type.getMatrixCols() != (int)initList->getSequence().size()) {\n            error(loc, \"wrong number of matrix columns:\", \"initializer list\", type.getCompleteString(intermediate.getEnhancedMsgs()).c_str());\n            return nullptr;\n        }\n        TType vectorType(type, 0); // dereferenced type\n        for (int i = 0; i < type.getMatrixCols(); ++i) {\n            initList->getSequence()[i] = convertInitializerList(loc, vectorType, initList->getSequence()[i]->getAsTyped());\n            if (initList->getSequence()[i] == nullptr)\n                return nullptr;\n        }\n    } else if (type.isVector()) {\n        if (type.getVectorSize() != (int)initList->getSequence().size()) {\n            error(loc, \"wrong vector size (or rows in a matrix column):\", \"initializer list\", type.getCompleteString(intermediate.getEnhancedMsgs()).c_str());\n            return nullptr;\n        }\n        TBasicType destType = type.getBasicType();\n        for (int i = 0; i < type.getVectorSize(); ++i) {\n            TBasicType initType = initList->getSequence()[i]->getAsTyped()->getBasicType();\n            if (destType != initType && !intermediate.canImplicitlyPromote(initType, destType)) {\n                error(loc, \"type mismatch in initializer list\", \"initializer list\", type.getCompleteString(intermediate.getEnhancedMsgs()).c_str());\n                return nullptr;\n            }\n\n        }\n    } else {\n        error(loc, \"unexpected initializer-list type:\", \"initializer list\", type.getCompleteString(intermediate.getEnhancedMsgs()).c_str());\n        return nullptr;\n    }\n\n    // Now that the subtree is processed, process this node as if the\n    // initializer list is a set of arguments to a constructor.\n    TIntermNode* emulatedConstructorArguments;\n    if (initList->getSequence().size() == 1)\n        emulatedConstructorArguments = initList->getSequence()[0];\n    else\n        emulatedConstructorArguments = initList;\n    return addConstructor(loc, emulatedConstructorArguments, type);\n}\n\n//\n// Test for the correctness of the parameters passed to various constructor functions\n// and also convert them to the right data type, if allowed and required.\n//\n// 'node' is what to construct from.\n// 'type' is what type to construct.\n//\n// Returns nullptr for an error or the constructed node (aggregate or typed) for no error.\n//\nTIntermTyped* TParseContext::addConstructor(const TSourceLoc& loc, TIntermNode* node, const TType& type)\n{\n    if (node == nullptr || node->getAsTyped() == nullptr)\n        return nullptr;\n    rValueErrorCheck(loc, \"constructor\", node->getAsTyped());\n\n    TIntermAggregate* aggrNode = node->getAsAggregate();\n    TOperator op = intermediate.mapTypeToConstructorOp(type);\n\n    // Combined texture-sampler constructors are completely semantic checked\n    // in constructorTextureSamplerError()\n    if (op == EOpConstructTextureSampler) {\n        if (aggrNode != nullptr) {\n            if (aggrNode->getSequence()[1]->getAsTyped()->getType().getSampler().shadow) {\n                // Transfer depth into the texture (SPIR-V image) type, as a hint\n                // for tools to know this texture/image is a depth image.\n                aggrNode->getSequence()[0]->getAsTyped()->getWritableType().getSampler().shadow = true;\n            }\n            return intermediate.setAggregateOperator(aggrNode, op, type, loc);\n        }\n    }\n\n    TTypeList::const_iterator memberTypes;\n    if (op == EOpConstructStruct)\n        memberTypes = type.getStruct()->begin();\n\n    TType elementType;\n    if (type.isArray()) {\n        TType dereferenced(type, 0);\n        elementType.shallowCopy(dereferenced);\n    } else\n        elementType.shallowCopy(type);\n\n    bool singleArg;\n    if (aggrNode) {\n        if (aggrNode->getOp() != EOpNull)\n            singleArg = true;\n        else\n            singleArg = false;\n    } else\n        singleArg = true;\n\n    TIntermTyped *newNode;\n    if (singleArg) {\n        // If structure constructor or array constructor is being called\n        // for only one parameter inside the structure, we need to call constructAggregate function once.\n        if (type.isArray())\n            newNode = constructAggregate(node, elementType, 1, node->getLoc());\n        else if (op == EOpConstructStruct)\n            newNode = constructAggregate(node, *(*memberTypes).type, 1, node->getLoc());\n        else\n            newNode = constructBuiltIn(type, op, node->getAsTyped(), node->getLoc(), false);\n\n        if (newNode && (type.isArray() || op == EOpConstructStruct))\n            newNode = intermediate.setAggregateOperator(newNode, EOpConstructStruct, type, loc);\n\n        return newNode;\n    }\n\n    //\n    // Handle list of arguments.\n    //\n    TIntermSequence &sequenceVector = aggrNode->getSequence();    // Stores the information about the parameter to the constructor\n    // if the structure constructor contains more than one parameter, then construct\n    // each parameter\n\n    int paramCount = 0;  // keeps track of the constructor parameter number being checked\n\n    // We don't know \"top down\" whether type is a specialization constant,\n    // but a const becomes a specialization constant if any of its children are.\n    bool hasSpecConst = false;\n    bool isConstConstructor = true;\n\n    // for each parameter to the constructor call, check to see if the right type is passed or convert them\n    // to the right type if possible (and allowed).\n    // for structure constructors, just check if the right type is passed, no conversion is allowed.\n    for (TIntermSequence::iterator p = sequenceVector.begin();\n                                   p != sequenceVector.end(); p++, paramCount++) {\n        if (type.isArray())\n            newNode = constructAggregate(*p, elementType, paramCount+1, node->getLoc());\n        else if (op == EOpConstructStruct)\n            newNode = constructAggregate(*p, *(memberTypes[paramCount]).type, paramCount+1, node->getLoc());\n        else\n            newNode = constructBuiltIn(type, op, (*p)->getAsTyped(), node->getLoc(), true);\n\n        if (newNode) {\n            *p = newNode;\n            if (!newNode->getType().getQualifier().isConstant())\n                isConstConstructor = false;\n            if (newNode->getType().getQualifier().isSpecConstant())\n                hasSpecConst = true;\n        } else\n            return nullptr;\n    }\n\n    TIntermTyped* ret_node = intermediate.setAggregateOperator(aggrNode, op, type, loc);\n\n    const char *specConstantCompositeExt[] = { E_GL_EXT_spec_constant_composites };\n    if (checkExtensionsRequested(loc, 1, specConstantCompositeExt, \"spec constant aggregate constructor\")) {\n        if (isConstConstructor && hasSpecConst) {\n            ret_node->getWritableType().getQualifier().makeSpecConstant();\n        }\n    }\n\n    TIntermAggregate *agg_node = ret_node->getAsAggregate();\n    if (agg_node && (agg_node->isVector() || agg_node->isArray() || agg_node->isMatrix()))\n        agg_node->updatePrecision();\n\n    return ret_node;\n}\n\n// Function for constructor implementation. Calls addUnaryMath with appropriate EOp value\n// for the parameter to the constructor (passed to this function). Essentially, it converts\n// the parameter types correctly. If a constructor expects an int (like ivec2) and is passed a\n// float, then float is converted to int.\n//\n// Returns nullptr for an error or the constructed node.\n//\nTIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, TIntermTyped* node, const TSourceLoc& loc,\n    bool subset)\n{\n    // If we are changing a matrix in both domain of basic type and to a non matrix,\n    // do the shape change first (by default, below, basic type is changed before shape).\n    // This avoids requesting a matrix of a new type that is going to be discarded anyway.\n    // TODO: This could be generalized to more type combinations, but that would require\n    // more extensive testing and full algorithm rework. For now, the need to do two changes makes\n    // the recursive call work, and avoids the most egregious case of creating integer matrices.\n    if (node->getType().isMatrix() && (type.isScalar() || type.isVector()) &&\n            type.isFloatingDomain() != node->getType().isFloatingDomain()) {\n        TType transitionType(node->getBasicType(), glslang::EvqTemporary, type.getVectorSize(), 0, 0, node->isVector());\n        TOperator transitionOp = intermediate.mapTypeToConstructorOp(transitionType);\n        node = constructBuiltIn(transitionType, transitionOp, node, loc, false);\n    }\n\n    TIntermTyped* newNode;\n    TOperator basicOp;\n\n    //\n    // First, convert types as needed.\n    //\n    switch (op) {\n    case EOpConstructVec2:\n    case EOpConstructVec3:\n    case EOpConstructVec4:\n    case EOpConstructMat2x2:\n    case EOpConstructMat2x3:\n    case EOpConstructMat2x4:\n    case EOpConstructMat3x2:\n    case EOpConstructMat3x3:\n    case EOpConstructMat3x4:\n    case EOpConstructMat4x2:\n    case EOpConstructMat4x3:\n    case EOpConstructMat4x4:\n    case EOpConstructFloat:\n        basicOp = EOpConstructFloat;\n        break;\n\n    case EOpConstructIVec2:\n    case EOpConstructIVec3:\n    case EOpConstructIVec4:\n    case EOpConstructInt:\n        basicOp = EOpConstructInt;\n        break;\n\n    case EOpConstructUVec2:\n        if (node->getType().getBasicType() == EbtReference) {\n            requireExtensions(loc, 1, &E_GL_EXT_buffer_reference_uvec2, \"reference conversion to uvec2\");\n            TIntermTyped* newNode = intermediate.addBuiltInFunctionCall(node->getLoc(), EOpConvPtrToUvec2, true, node,\n                type);\n            return newNode;\n        } else if (node->getType().getBasicType() == EbtSampler) {\n            requireExtensions(loc, 1, &E_GL_ARB_bindless_texture, \"sampler conversion to uvec2\");\n            // force the basic type of the constructor param to uvec2, otherwise spv builder will\n            // report some errors\n            TIntermTyped* newSrcNode = intermediate.createConversion(EbtUint, node);\n            newSrcNode->getAsTyped()->getWritableType().setVectorSize(2);\n\n            TIntermTyped* newNode =\n                intermediate.addBuiltInFunctionCall(node->getLoc(), EOpConstructUVec2, false, newSrcNode, type);\n            return newNode;\n        }\n        [[fallthrough]];\n    case EOpConstructUVec3:\n    case EOpConstructUVec4:\n    case EOpConstructUint:\n        basicOp = EOpConstructUint;\n        break;\n\n    case EOpConstructBVec2:\n    case EOpConstructBVec3:\n    case EOpConstructBVec4:\n    case EOpConstructBool:\n        basicOp = EOpConstructBool;\n        break;\n    case EOpConstructTextureSampler:\n        if ((node->getType().getBasicType() == EbtUint || node->getType().getBasicType() == EbtInt) &&\n            node->getType().getVectorSize() == 2) {\n            requireExtensions(loc, 1, &E_GL_ARB_bindless_texture, \"ivec2/uvec2 convert to texture handle\");\n            // No matter ivec2 or uvec2, Set EOpPackUint2x32 just to generate an opBitcast op code\n            TIntermTyped* newNode =\n                intermediate.addBuiltInFunctionCall(node->getLoc(), EOpPackUint2x32, true, node, type);\n            return newNode;\n        }\n        [[fallthrough]];\n    case EOpConstructDVec2:\n    case EOpConstructDVec3:\n    case EOpConstructDVec4:\n    case EOpConstructDMat2x2:\n    case EOpConstructDMat2x3:\n    case EOpConstructDMat2x4:\n    case EOpConstructDMat3x2:\n    case EOpConstructDMat3x3:\n    case EOpConstructDMat3x4:\n    case EOpConstructDMat4x2:\n    case EOpConstructDMat4x3:\n    case EOpConstructDMat4x4:\n    case EOpConstructDouble:\n        basicOp = EOpConstructDouble;\n        break;\n\n    case EOpConstructF16Vec2:\n    case EOpConstructF16Vec3:\n    case EOpConstructF16Vec4:\n    case EOpConstructF16Mat2x2:\n    case EOpConstructF16Mat2x3:\n    case EOpConstructF16Mat2x4:\n    case EOpConstructF16Mat3x2:\n    case EOpConstructF16Mat3x3:\n    case EOpConstructF16Mat3x4:\n    case EOpConstructF16Mat4x2:\n    case EOpConstructF16Mat4x3:\n    case EOpConstructF16Mat4x4:\n    case EOpConstructFloat16:\n        basicOp = EOpConstructFloat16;\n        // 8/16-bit storage extensions don't support direct constructing composites of 8/16-bit types,\n        // so construct a 32-bit type and convert\n        // and do not generate any conversion if it is an identity conversion, i.e. float16_t(<float16_t> var)\n        if (!intermediate.getArithemeticFloat16Enabled() && (node->getBasicType() != EbtFloat16)) {\n            TType tempType(EbtFloat, EvqTemporary, type.getVectorSize());\n            newNode = node;\n            if (tempType != newNode->getType()) {\n                TOperator aggregateOp;\n                if (op == EOpConstructFloat16)\n                    aggregateOp = EOpConstructFloat;\n                else\n                    aggregateOp = (TOperator)(EOpConstructVec2 + op - EOpConstructF16Vec2);\n                newNode = intermediate.setAggregateOperator(newNode, aggregateOp, tempType, node->getLoc());\n            }\n            newNode = intermediate.addConversion(EbtFloat16, newNode);\n            return newNode;\n        }\n        break;\n\n    case EOpConstructBF16Vec2:\n    case EOpConstructBF16Vec3:\n    case EOpConstructBF16Vec4:\n    case EOpConstructBFloat16:\n        basicOp = EOpConstructBFloat16;\n        break;\n\n    case EOpConstructFloatE5M2Vec2:\n    case EOpConstructFloatE5M2Vec3:\n    case EOpConstructFloatE5M2Vec4:\n    case EOpConstructFloatE5M2:\n        basicOp = EOpConstructFloatE5M2;\n        break;\n\n    case EOpConstructFloatE4M3Vec2:\n    case EOpConstructFloatE4M3Vec3:\n    case EOpConstructFloatE4M3Vec4:\n    case EOpConstructFloatE4M3:\n        basicOp = EOpConstructFloatE4M3;\n        break;\n\n    case EOpConstructI8Vec2:\n    case EOpConstructI8Vec3:\n    case EOpConstructI8Vec4:\n    case EOpConstructInt8:\n        basicOp = EOpConstructInt8;\n        // 8/16-bit storage extensions don't support direct constructing composites of 8/16-bit types,\n        // so construct a 32-bit type and convert\n        // and do not generate any conversion if it is an identity conversion, i.e. int8_t(<int8_t> var)\n        if (!intermediate.getArithemeticInt8Enabled() && (node->getBasicType() != EbtInt8)) {\n            TType tempType(EbtInt, EvqTemporary, type.getVectorSize());\n            newNode = node;\n            if (tempType != newNode->getType()) {\n                TOperator aggregateOp;\n                if (op == EOpConstructInt8)\n                    aggregateOp = EOpConstructInt;\n                else\n                    aggregateOp = (TOperator)(EOpConstructIVec2 + op - EOpConstructI8Vec2);\n                newNode = intermediate.setAggregateOperator(newNode, aggregateOp, tempType, node->getLoc());\n            }\n            newNode = intermediate.addConversion(EbtInt8, newNode);\n            return newNode;\n        }\n        break;\n\n    case EOpConstructU8Vec2:\n    case EOpConstructU8Vec3:\n    case EOpConstructU8Vec4:\n    case EOpConstructUint8:\n        basicOp = EOpConstructUint8;\n        // 8/16-bit storage extensions don't support direct constructing composites of 8/16-bit types,\n        // so construct a 32-bit type and convert\n        // and do not generate any conversion if it is an identity conversion, i.e. uint8_t(<uint8_t> var)\n        if (!intermediate.getArithemeticInt8Enabled() && (node->getBasicType() != EbtUint8)) {\n            TType tempType(EbtUint, EvqTemporary, type.getVectorSize());\n            newNode = node;\n            if (tempType != newNode->getType()) {\n                TOperator aggregateOp;\n                if (op == EOpConstructUint8)\n                    aggregateOp = EOpConstructUint;\n                else\n                    aggregateOp = (TOperator)(EOpConstructUVec2 + op - EOpConstructU8Vec2);\n                newNode = intermediate.setAggregateOperator(newNode, aggregateOp, tempType, node->getLoc());\n            }\n            newNode = intermediate.addConversion(EbtUint8, newNode);\n            return newNode;\n        }\n        break;\n\n    case EOpConstructI16Vec2:\n    case EOpConstructI16Vec3:\n    case EOpConstructI16Vec4:\n    case EOpConstructInt16:\n        basicOp = EOpConstructInt16;\n        // 8/16-bit storage extensions don't support direct constructing composites of 8/16-bit types,\n        // so construct a 32-bit type and convert\n        // and do not generate any conversion if it is an identity conversion, i.e. int16_t(<int16_t> var)\n        if (!intermediate.getArithemeticInt16Enabled() && (node->getBasicType() != EbtInt16)) {\n            TType tempType(EbtInt, EvqTemporary, type.getVectorSize());\n            newNode = node;\n            if (tempType != newNode->getType()) {\n                TOperator aggregateOp;\n                if (op == EOpConstructInt16)\n                    aggregateOp = EOpConstructInt;\n                else\n                    aggregateOp = (TOperator)(EOpConstructIVec2 + op - EOpConstructI16Vec2);\n                newNode = intermediate.setAggregateOperator(newNode, aggregateOp, tempType, node->getLoc());\n            }\n            newNode = intermediate.addConversion(EbtInt16, newNode);\n            return newNode;\n        }\n        break;\n\n    case EOpConstructU16Vec2:\n    case EOpConstructU16Vec3:\n    case EOpConstructU16Vec4:\n    case EOpConstructUint16:\n        basicOp = EOpConstructUint16;\n        // 8/16-bit storage extensions don't support direct constructing composites of 8/16-bit types,\n        // so construct a 32-bit type and convert\n        // and do not generate any conversion if it is an identity conversion, i.e. uint16_t(<uint16_t> var)\n        if (!intermediate.getArithemeticInt16Enabled() && (node->getBasicType() != EbtUint16)) {\n            TType tempType(EbtUint, EvqTemporary, type.getVectorSize());\n            newNode = node;\n            if (tempType != newNode->getType()) {\n                TOperator aggregateOp;\n                if (op == EOpConstructUint16)\n                    aggregateOp = EOpConstructUint;\n                else\n                    aggregateOp = (TOperator)(EOpConstructUVec2 + op - EOpConstructU16Vec2);\n                newNode = intermediate.setAggregateOperator(newNode, aggregateOp, tempType, node->getLoc());\n            }\n            newNode = intermediate.addConversion(EbtUint16, newNode);\n            return newNode;\n        }\n        break;\n\n    case EOpConstructI64Vec2:\n    case EOpConstructI64Vec3:\n    case EOpConstructI64Vec4:\n    case EOpConstructInt64:\n        basicOp = EOpConstructInt64;\n        break;\n\n    case EOpConstructUint64:\n        if (type.isScalar() && node->getType().isReference()) {\n            TIntermTyped* newNode = intermediate.addBuiltInFunctionCall(node->getLoc(), EOpConvPtrToUint64, true, node, type);\n            return newNode;\n        }\n        [[fallthrough]];\n    case EOpConstructU64Vec2:\n    case EOpConstructU64Vec3:\n    case EOpConstructU64Vec4:\n        basicOp = EOpConstructUint64;\n        break;\n\n    case EOpConstructNonuniform:\n        // Make a nonuniform copy of node\n        newNode = intermediate.addBuiltInFunctionCall(node->getLoc(), EOpCopyObject, true, node, type);\n        return newNode;\n\n    case EOpConstructReference:\n        // construct reference from reference\n        if (node->getType().isReference()) {\n            newNode = intermediate.addBuiltInFunctionCall(node->getLoc(), EOpConstructReference, true, node, type);\n            return newNode;\n        // construct reference from uint64\n        } else if (node->getType().isScalar() && node->getType().getBasicType() == EbtUint64) {\n            TIntermTyped* newNode = intermediate.addBuiltInFunctionCall(node->getLoc(), EOpConvUint64ToPtr, true, node,\n                type);\n            return newNode;\n        // construct reference from uvec2\n        } else if (node->getType().isVector() && node->getType().getBasicType() == EbtUint &&\n                   node->getVectorSize() == 2) {\n            requireExtensions(loc, 1, &E_GL_EXT_buffer_reference_uvec2, \"uvec2 conversion to reference\");\n            TIntermTyped* newNode = intermediate.addBuiltInFunctionCall(node->getLoc(), EOpConvUvec2ToPtr, true, node,\n                type);\n            return newNode;\n        } else {\n            return nullptr;\n        }\n\n    case EOpConstructCooperativeVectorNV:\n        if (!node->getType().isCoopVecNV()) {\n            if (type.getBasicType() != node->getType().getBasicType()) {\n                node = intermediate.addConversion(type.getBasicType(), node);\n                if (node == nullptr)\n                    return nullptr;\n            }\n        }\n        if (type.getBasicType() != node->getType().getBasicType()) {\n            intermediate.buildConvertOp(type.getBasicType(), node->getType().getBasicType(), op);\n            node = intermediate.addUnaryNode(op, node, node->getLoc(), type);\n            return node;\n        }\n        if (subset) {\n            return node;\n        }\n\n        node = intermediate.setAggregateOperator(node, op, type, node->getLoc());\n\n        return node;\n\n    case EOpConstructCooperativeMatrixNV:\n    case EOpConstructCooperativeMatrixKHR:\n        if (node->getType() == type) {\n            return node;\n        }\n        if (!node->getType().isCoopMat()) {\n            if (type.getBasicType() != node->getType().getBasicType()) {\n                node = intermediate.addConversion(type.getBasicType(), node);\n                if (node == nullptr)\n                    return nullptr;\n            }\n            node = intermediate.setAggregateOperator(node, op, type, node->getLoc());\n        } else if (type.sameCoopMatShape(node->getType()) && !type.sameCoopMatUse(node->getType()) &&\n                   type.getBasicType() == node->getType().getBasicType()) {\n            node = intermediate.setAggregateOperator(node, op, type, node->getLoc());\n        } else {\n            TOperator op = EOpConvNumeric;\n\n            node = intermediate.addUnaryNode(op, node, node->getLoc(), type);\n            // If it's a (non-specialization) constant, it must be folded.\n            if (node->getAsUnaryNode()->getOperand()->getAsConstantUnion())\n                return node->getAsUnaryNode()->getOperand()->getAsConstantUnion()->fold(op, node->getType());\n        }\n\n        return node;\n\n    case EOpConstructAccStruct:\n        if ((node->getType().isScalar() && node->getType().getBasicType() == EbtUint64)) {\n            // construct acceleration structure from uint64\n            requireExtensions(loc, Num_ray_tracing_EXTs, ray_tracing_EXTs, \"uint64_t conversion to acclerationStructureEXT\");\n            return intermediate.addBuiltInFunctionCall(node->getLoc(), EOpConvUint64ToAccStruct, true, node,\n                type);\n        } else if (node->getType().isVector() && node->getType().getBasicType() == EbtUint && node->getVectorSize() == 2) {\n            // construct acceleration structure from uint64\n            requireExtensions(loc, Num_ray_tracing_EXTs, ray_tracing_EXTs, \"uvec2 conversion to accelerationStructureEXT\");\n            return intermediate.addBuiltInFunctionCall(node->getLoc(), EOpConvUvec2ToAccStruct, true, node,\n                type);\n        } else\n            return nullptr;\n\n    default:\n        error(loc, \"unsupported construction\", \"\", \"\");\n\n        return nullptr;\n    }\n    newNode = intermediate.addUnaryMath(basicOp, node, node->getLoc());\n    if (newNode == nullptr) {\n        error(loc, \"can't convert\", \"constructor\", \"\");\n        return nullptr;\n    }\n\n    //\n    // Now, if there still isn't an operation to do the construction, and we need one, add one.\n    //\n\n    // Otherwise, skip out early.\n    if (subset || (newNode != node && newNode->getType() == type))\n        return newNode;\n\n    // setAggregateOperator will insert a new node for the constructor, as needed.\n    return intermediate.setAggregateOperator(newNode, op, type, loc);\n}\n\n// This function tests for the type of the parameters to the structure or array constructor. Raises\n// an error message if the expected type does not match the parameter passed to the constructor.\n//\n// Returns nullptr for an error or the input node itself if the expected and the given parameter types match.\n//\nTIntermTyped* TParseContext::constructAggregate(TIntermNode* node, const TType& type, int paramCount, const TSourceLoc& loc)\n{\n    TIntermTyped* converted = intermediate.addConversion(EOpConstructStruct, type, node->getAsTyped());\n    if (! converted || converted->getType() != type) {\n        bool enhanced = intermediate.getEnhancedMsgs();\n        error(loc, \"\", \"constructor\", \"cannot convert parameter %d from '%s' to '%s'\", paramCount,\n              node->getAsTyped()->getType().getCompleteString(enhanced).c_str(), type.getCompleteString(enhanced).c_str());\n\n        return nullptr;\n    }\n\n    return converted;\n}\n\n// If a memory qualifier is present in 'to', also make it present in 'from'.\nvoid TParseContext::inheritMemoryQualifiers(const TQualifier& from, TQualifier& to)\n{\n    if (from.isReadOnly())\n        to.readonly = from.readonly;\n    if (from.isWriteOnly())\n        to.writeonly = from.writeonly;\n    if (from.coherent)\n        to.coherent = from.coherent;\n    if (from.volatil)\n        to.volatil = from.volatil;\n    if (from.nontemporal)\n        to.nontemporal = from.nontemporal;\n    if (from.restrict)\n        to.restrict = from.restrict;\n}\n\n//\n// Update qualifier layoutBindlessImage & layoutBindlessSampler on block member\n//\nvoid TParseContext::updateBindlessQualifier(TType& memberType)\n{\n    if (memberType.containsSampler()) {\n        if (memberType.isStruct()) {\n            TTypeList* typeList = memberType.getWritableStruct();\n            for (unsigned int member = 0; member < typeList->size(); ++member) {\n                TType* subMemberType = (*typeList)[member].type;\n                updateBindlessQualifier(*subMemberType);\n            }\n        }\n        else if (memberType.getSampler().isImage()) {\n            intermediate.setBindlessImageMode(currentCaller, AstRefTypeLayout);\n            memberType.getQualifier().layoutBindlessImage = true;\n        }\n        else {\n            intermediate.setBindlessTextureMode(currentCaller, AstRefTypeLayout);\n            memberType.getQualifier().layoutBindlessSampler = true;\n        }\n    }\n}\n\n//\n// Do everything needed to add an interface block.\n//\nvoid TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, const TString* instanceName,\n    TArraySizes* arraySizes)\n{\n    if (spvVersion.vulkan > 0 && spvVersion.vulkanRelaxed)\n        blockStorageRemap(loc, blockName, currentBlockQualifier);\n    blockStageIoCheck(loc, currentBlockQualifier);\n    blockQualifierCheck(loc, currentBlockQualifier, instanceName != nullptr);\n    if (arraySizes != nullptr) {\n        arraySizesCheck(loc, currentBlockQualifier, arraySizes, nullptr, false);\n        arrayOfArrayVersionCheck(loc, arraySizes);\n        if (arraySizes->getNumDims() > 1)\n            requireProfile(loc, ~EEsProfile, \"array-of-array of block\");\n    }\n\n    // Inherit and check member storage qualifiers WRT to the block-level qualifier.\n    for (unsigned int member = 0; member < typeList.size(); ++member) {\n        TType& memberType = *typeList[member].type;\n        TQualifier& memberQualifier = memberType.getQualifier();\n        const TSourceLoc& memberLoc = typeList[member].loc;\n        if (memberQualifier.storage != EvqTemporary && memberQualifier.storage != EvqGlobal && memberQualifier.storage != currentBlockQualifier.storage)\n            error(memberLoc, \"member storage qualifier cannot contradict block storage qualifier\", memberType.getFieldName().c_str(), \"\");\n        memberQualifier.storage = currentBlockQualifier.storage;\n        globalQualifierFixCheck(memberLoc, memberQualifier);\n        inheritMemoryQualifiers(currentBlockQualifier, memberQualifier);\n        if (currentBlockQualifier.perPrimitiveNV)\n            memberQualifier.perPrimitiveNV = currentBlockQualifier.perPrimitiveNV;\n        if (currentBlockQualifier.perViewNV)\n            memberQualifier.perViewNV = currentBlockQualifier.perViewNV;\n        if (currentBlockQualifier.perTaskNV)\n            memberQualifier.perTaskNV = currentBlockQualifier.perTaskNV;\n        if (currentBlockQualifier.storage == EvqtaskPayloadSharedEXT)\n            memberQualifier.storage = EvqtaskPayloadSharedEXT;\n        if (memberQualifier.storage == EvqSpirvStorageClass)\n            error(memberLoc, \"member cannot have a spirv_storage_class qualifier\", memberType.getFieldName().c_str(), \"\");\n        if (memberQualifier.hasSpirvDecorate() && !memberQualifier.getSpirvDecorate().decorateIds.empty())\n            error(memberLoc, \"member cannot have a spirv_decorate_id qualifier\", memberType.getFieldName().c_str(), \"\");\n        if ((currentBlockQualifier.storage == EvqUniform || currentBlockQualifier.storage == EvqBuffer) && (memberQualifier.isInterpolation() || memberQualifier.isAuxiliary()))\n            error(memberLoc, \"member of uniform or buffer block cannot have an auxiliary or interpolation qualifier\", memberType.getFieldName().c_str(), \"\");\n        if (memberType.isArray())\n            arraySizesCheck(memberLoc, currentBlockQualifier, memberType.getArraySizes(), nullptr, member == typeList.size() - 1);\n        if (memberQualifier.hasOffset()) {\n            if (spvVersion.spv == 0) {\n                profileRequires(memberLoc, ~EEsProfile, 440, E_GL_ARB_enhanced_layouts, \"\\\"offset\\\" on block member\");\n                profileRequires(memberLoc, EEsProfile, 300, E_GL_ARB_enhanced_layouts, \"\\\"offset\\\" on block member\");\n            }\n        }\n\n        // For bindless texture, sampler can be declared as uniform/storage block member,\n        if (memberType.containsOpaque()) {\n            if (memberType.containsSampler() && extensionTurnedOn(E_GL_ARB_bindless_texture))\n                updateBindlessQualifier(memberType);\n            else\n                error(memberLoc, \"member of block cannot be or contain a sampler, image, or atomic_uint type\", typeList[member].type->getFieldName().c_str(), \"\");\n            }\n\n        if (memberType.containsCoopMat())\n            error(memberLoc, \"member of block cannot be or contain a cooperative matrix type\", typeList[member].type->getFieldName().c_str(), \"\");\n\n        if (memberType.containsCoopVec())\n            error(memberLoc, \"member of block cannot be or contain a cooperative vector type\", typeList[member].type->getFieldName().c_str(), \"\");\n    }\n\n    // This might be a redeclaration of a built-in block.  If so, redeclareBuiltinBlock() will\n    // do all the rest.\n    if (! symbolTable.atBuiltInLevel() && builtInName(*blockName)) {\n        redeclareBuiltinBlock(loc, typeList, *blockName, instanceName, arraySizes);\n        return;\n    }\n\n    // Not a redeclaration of a built-in; check that all names are user names.\n    reservedErrorCheck(loc, *blockName);\n    if (instanceName)\n        reservedErrorCheck(loc, *instanceName);\n    for (unsigned int member = 0; member < typeList.size(); ++member)\n        reservedErrorCheck(typeList[member].loc, typeList[member].type->getFieldName());\n\n    // Make default block qualification, and adjust the member qualifications\n\n    TQualifier defaultQualification;\n    switch (currentBlockQualifier.storage) {\n    case EvqUniform:    defaultQualification = globalUniformDefaults;    break;\n    case EvqBuffer:     defaultQualification = globalBufferDefaults;     break;\n    case EvqVaryingIn:  defaultQualification = globalInputDefaults;      break;\n    case EvqVaryingOut: defaultQualification = globalOutputDefaults;     break;\n    case EvqShared:     defaultQualification = globalSharedDefaults;     break;\n    default:            defaultQualification.clear();                    break;\n    }\n\n    // Special case for \"push_constant uniform\", which has a default of std430,\n    // contrary to normal uniform defaults, and can't have a default tracked for it.\n    if ((currentBlockQualifier.isPushConstant() && !currentBlockQualifier.hasPacking()) ||\n        (currentBlockQualifier.isShaderRecord() && !currentBlockQualifier.hasPacking()))\n        currentBlockQualifier.layoutPacking = ElpStd430;\n\n    // Special case for \"taskNV in/out\", which has a default of std430,\n    if (currentBlockQualifier.isTaskMemory() && !currentBlockQualifier.hasPacking())\n        currentBlockQualifier.layoutPacking = ElpStd430;\n\n    // fix and check for member layout qualifiers\n\n    mergeObjectLayoutQualifiers(defaultQualification, currentBlockQualifier, true);\n\n    // \"The align qualifier can only be used on blocks or block members, and only for blocks declared with std140 or std430 layouts.\"\n    if (currentBlockQualifier.hasAlign()) {\n        if (defaultQualification.layoutPacking != ElpStd140 &&\n            defaultQualification.layoutPacking != ElpStd430 &&\n            defaultQualification.layoutPacking != ElpScalar) {\n            error(loc, \"can only be used with std140, std430, or scalar layout packing\", \"align\", \"\");\n            defaultQualification.layoutAlign = -1;\n        }\n    }\n\n    bool memberWithLocation = false;\n    bool memberWithoutLocation = false;\n    bool memberWithPerViewQualifier = false;\n    for (unsigned int member = 0; member < typeList.size(); ++member) {\n        TQualifier& memberQualifier = typeList[member].type->getQualifier();\n        const TSourceLoc& memberLoc = typeList[member].loc;\n        if (memberQualifier.hasStream()) {\n            if (defaultQualification.layoutStream != memberQualifier.layoutStream)\n                error(memberLoc, \"member cannot contradict block\", \"stream\", \"\");\n        }\n\n        // \"This includes a block's inheritance of the\n        // current global default buffer, a block member's inheritance of the block's\n        // buffer, and the requirement that any *xfb_buffer* declared on a block\n        // member must match the buffer inherited from the block.\"\n        if (memberQualifier.hasXfbBuffer()) {\n            if (defaultQualification.layoutXfbBuffer != memberQualifier.layoutXfbBuffer)\n                error(memberLoc, \"member cannot contradict block (or what block inherited from global)\", \"xfb_buffer\", \"\");\n        }\n\n        if (memberQualifier.hasPacking())\n            error(memberLoc, \"member of block cannot have a packing layout qualifier\", typeList[member].type->getFieldName().c_str(), \"\");\n        if (memberQualifier.hasLocation()) {\n            const char* feature = \"location on block member\";\n            switch (currentBlockQualifier.storage) {\n            case EvqVaryingIn:\n            case EvqVaryingOut:\n                requireProfile(memberLoc, ECoreProfile | ECompatibilityProfile | EEsProfile, feature);\n                profileRequires(memberLoc, ECoreProfile | ECompatibilityProfile, 440, E_GL_ARB_enhanced_layouts, feature);\n                profileRequires(memberLoc, EEsProfile, 320, Num_AEP_shader_io_blocks, AEP_shader_io_blocks, feature);\n                memberWithLocation = true;\n                break;\n            default:\n                error(memberLoc, \"can only use in an in/out block\", feature, \"\");\n                break;\n            }\n        } else\n            memberWithoutLocation = true;\n\n        // \"The offset qualifier can only be used on block members of blocks declared with std140 or std430 layouts.\"\n        // \"The align qualifier can only be used on blocks or block members, and only for blocks declared with std140 or std430 layouts.\"\n        if (memberQualifier.hasAlign() || memberQualifier.hasOffset()) {\n            if (defaultQualification.layoutPacking != ElpStd140 &&\n                defaultQualification.layoutPacking != ElpStd430 &&\n                defaultQualification.layoutPacking != ElpScalar)\n                error(memberLoc, \"can only be used with std140, std430, or scalar layout packing\", \"offset/align\", \"\");\n        }\n\n        if (memberQualifier.isPerView()) {\n            memberWithPerViewQualifier = true;\n        }\n\n        TQualifier newMemberQualification = defaultQualification;\n        mergeQualifiers(memberLoc, newMemberQualification, memberQualifier, false);\n        memberQualifier = newMemberQualification;\n    }\n\n    layoutMemberLocationArrayCheck(loc, memberWithLocation, arraySizes);\n\n    // Ensure that the block has an XfbBuffer assigned. This is needed\n    // because if the block has a XfbOffset assigned, then it is\n    // assumed that it has implicitly assigned the current global\n    // XfbBuffer, and because it's members need to be assigned a\n    // XfbOffset if they lack it.\n    if (currentBlockQualifier.storage == EvqVaryingOut && globalOutputDefaults.hasXfbBuffer()) {\n       if (!currentBlockQualifier.hasXfbBuffer() && currentBlockQualifier.hasXfbOffset())\n          currentBlockQualifier.layoutXfbBuffer = globalOutputDefaults.layoutXfbBuffer;\n    }\n\n    // Process the members\n    fixBlockLocations(loc, currentBlockQualifier, typeList, memberWithLocation, memberWithoutLocation);\n    fixXfbOffsets(currentBlockQualifier, typeList);\n    fixBlockUniformOffsets(currentBlockQualifier, typeList);\n    fixBlockUniformLayoutMatrix(currentBlockQualifier, &typeList, nullptr);\n    fixBlockUniformLayoutPacking(currentBlockQualifier, &typeList, nullptr);\n    for (unsigned int member = 0; member < typeList.size(); ++member)\n        layoutTypeCheck(typeList[member].loc, *typeList[member].type);\n\n    if (memberWithPerViewQualifier) {\n        for (unsigned int member = 0; member < typeList.size(); ++member) {\n            checkAndResizeMeshViewDim(typeList[member].loc, *typeList[member].type, /*isBlockMember*/ true);\n        }\n    }\n\n    // reverse merge, so that currentBlockQualifier now has all layout information\n    // (can't use defaultQualification directly, it's missing other non-layout-default-class qualifiers)\n    mergeObjectLayoutQualifiers(currentBlockQualifier, defaultQualification, true);\n\n    //\n    // Build and add the interface block as a new type named 'blockName'\n    //\n\n    TType blockType(&typeList, *blockName, currentBlockQualifier);\n    if (arraySizes != nullptr)\n        blockType.transferArraySizes(arraySizes);\n\n    if (arraySizes == nullptr)\n        ioArrayCheck(loc, blockType, instanceName ? *instanceName : *blockName);\n    if (currentBlockQualifier.hasBufferReference()) {\n\n        if (currentBlockQualifier.storage != EvqBuffer)\n            error(loc, \"can only be used with buffer\", \"buffer_reference\", \"\");\n\n        // Create the block reference type. If it was forward-declared, detect that\n        // as a referent struct type with no members. Replace the referent type with\n        // blockType.\n        TType blockNameType(EbtReference, blockType, *blockName);\n        TVariable* blockNameVar = new TVariable(blockName, blockNameType, true);\n        if (! symbolTable.insert(*blockNameVar)) {\n            TSymbol* existingName = symbolTable.find(*blockName);\n            if (existingName->getType().isReference() &&\n                existingName->getType().getReferentType()->getStruct() &&\n                existingName->getType().getReferentType()->getStruct()->size() == 0 &&\n                existingName->getType().getQualifier().storage == blockType.getQualifier().storage) {\n                existingName->getType().getReferentType()->deepCopy(blockType);\n            } else {\n                error(loc, \"block name cannot be redefined\", blockName->c_str(), \"\");\n            }\n        }\n        if (!instanceName) {\n            return;\n        }\n    } else {\n        //\n        // Don't make a user-defined type out of block name; that will cause an error\n        // if the same block name gets reused in a different interface.\n        //\n        // \"Block names have no other use within a shader\n        // beyond interface matching; it is a compile-time error to use a block name at global scope for anything\n        // other than as a block name (e.g., use of a block name for a global variable name or function name is\n        // currently reserved).\"\n        //\n        // Use the symbol table to prevent normal reuse of the block's name, as a variable entry,\n        // whose type is EbtBlock, but without all the structure; that will come from the type\n        // the instances point to.\n        //\n        TType blockNameType(EbtBlock, blockType.getQualifier().storage);\n        TVariable* blockNameVar = new TVariable(blockName, blockNameType);\n        if (! symbolTable.insert(*blockNameVar)) {\n            TSymbol* existingName = symbolTable.find(*blockName);\n            if (existingName->getType().getBasicType() == EbtBlock) {\n                if (existingName->getType().getQualifier().storage == blockType.getQualifier().storage) {\n                    error(loc, \"Cannot reuse block name within the same interface:\", blockName->c_str(), blockType.getStorageQualifierString());\n                    return;\n                }\n            } else {\n                error(loc, \"block name cannot redefine a non-block name\", blockName->c_str(), \"\");\n                return;\n            }\n        }\n    }\n\n    // Add the variable, as anonymous or named instanceName.\n    // Make an anonymous variable if no name was provided.\n    if (! instanceName)\n        instanceName = NewPoolTString(\"\");\n\n    TVariable& variable = *new TVariable(instanceName, blockType);\n    if (! symbolTable.insert(variable)) {\n        if (*instanceName == \"\")\n            error(loc, \"nameless block contains a member that already has a name at global scope\", blockName->c_str(), \"\");\n        else\n            error(loc, \"block instance name redefinition\", variable.getName().c_str(), \"\");\n\n        return;\n    }\n\n    // Check for general layout qualifier errors\n    layoutObjectCheck(loc, variable);\n\n    // fix up\n    if (isIoResizeArray(blockType)) {\n        ioArraySymbolResizeList.push_back(&variable);\n        checkIoArraysConsistency(loc, true);\n    } else\n        fixIoArraySize(loc, variable.getWritableType());\n\n    // Save it in the AST for linker use.\n    trackLinkage(variable);\n}\n\n//\n// allow storage type of block to be remapped at compile time\n//\nvoid TParseContext::blockStorageRemap(const TSourceLoc&, const TString* instanceName, TQualifier& qualifier)\n{\n    TBlockStorageClass type = intermediate.getBlockStorageOverride(instanceName->c_str());\n    if (type != EbsNone) {\n        qualifier.setBlockStorage(type);\n    }\n}\n\n// Do all block-declaration checking regarding the combination of in/out/uniform/buffer\n// with a particular stage.\nvoid TParseContext::blockStageIoCheck(const TSourceLoc& loc, const TQualifier& qualifier)\n{\n    const char *extsrt[2] = { E_GL_NV_ray_tracing, E_GL_EXT_ray_tracing };\n    switch (qualifier.storage) {\n    case EvqUniform:\n        profileRequires(loc, EEsProfile, 300, nullptr, \"uniform block\");\n        profileRequires(loc, ENoProfile, 140, E_GL_ARB_uniform_buffer_object, \"uniform block\");\n        if (currentBlockQualifier.layoutPacking == ElpStd430 && ! currentBlockQualifier.isPushConstant())\n            requireExtensions(loc, 1, &E_GL_EXT_scalar_block_layout, \"std430 requires the buffer storage qualifier\");\n        break;\n    case EvqBuffer:\n        requireProfile(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, \"buffer block\");\n        profileRequires(loc, ECoreProfile | ECompatibilityProfile, 430, E_GL_ARB_shader_storage_buffer_object, \"buffer block\");\n        profileRequires(loc, EEsProfile, 310, nullptr, \"buffer block\");\n        break;\n    case EvqVaryingIn:\n        profileRequires(loc, ~EEsProfile, 150, E_GL_ARB_separate_shader_objects, \"input block\");\n        // It is a compile-time error to have an input block in a vertex shader or an output block in a fragment shader\n        // \"Compute shaders do not permit user-defined input variables...\"\n        requireStage(loc, (EShLanguageMask)(EShLangTessControlMask|EShLangTessEvaluationMask|EShLangGeometryMask|\n            EShLangFragmentMask|EShLangMeshMask), \"input block\");\n        if (language == EShLangFragment) {\n            profileRequires(loc, EEsProfile, 320, Num_AEP_shader_io_blocks, AEP_shader_io_blocks, \"fragment input block\");\n        } else if (language == EShLangMesh && ! qualifier.isTaskMemory()) {\n            error(loc, \"input blocks cannot be used in a mesh shader\", \"out\", \"\");\n        }\n        break;\n    case EvqVaryingOut:\n        profileRequires(loc, ~EEsProfile, 150, E_GL_ARB_separate_shader_objects, \"output block\");\n        requireStage(loc, (EShLanguageMask)(EShLangVertexMask|EShLangTessControlMask|EShLangTessEvaluationMask|\n            EShLangGeometryMask|EShLangMeshMask|EShLangTaskMask), \"output block\");\n        // ES 310 can have a block before shader_io is turned on, so skip this test for built-ins\n        if (language == EShLangVertex && ! parsingBuiltins) {\n            profileRequires(loc, EEsProfile, 320, Num_AEP_shader_io_blocks, AEP_shader_io_blocks, \"vertex output block\");\n        } else if (language == EShLangMesh && qualifier.isTaskMemory()) {\n            error(loc, \"can only use on input blocks in mesh shader\", \"taskNV\", \"\");\n        } else if (language == EShLangTask && ! qualifier.isTaskMemory()) {\n            error(loc, \"output blocks cannot be used in a task shader\", \"out\", \"\");\n        }\n        break;\n    case EvqShared:\n        if (spvVersion.spv > 0 && spvVersion.spv < EShTargetSpv_1_4) {\n            error(loc, \"shared block requires at least SPIR-V 1.4\", \"shared block\", \"\");\n        }\n        profileRequires(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, 0, E_GL_EXT_shared_memory_block, \"shared block\");\n        break;\n    case EvqPayload:\n        profileRequires(loc, ~EEsProfile, 460, 2, extsrt, \"rayPayloadNV block\");\n        requireStage(loc, (EShLanguageMask)(EShLangRayGenMask | EShLangAnyHitMask | EShLangClosestHitMask | EShLangMissMask),\n            \"rayPayloadNV block\");\n        break;\n    case EvqPayloadIn:\n        profileRequires(loc, ~EEsProfile, 460, 2, extsrt, \"rayPayloadInNV block\");\n        requireStage(loc, (EShLanguageMask)(EShLangAnyHitMask | EShLangClosestHitMask | EShLangMissMask),\n            \"rayPayloadInNV block\");\n        break;\n    case EvqHitAttr:\n        profileRequires(loc, ~EEsProfile, 460, 2, extsrt, \"hitAttributeNV block\");\n        requireStage(loc, (EShLanguageMask)(EShLangIntersectMask | EShLangAnyHitMask | EShLangClosestHitMask), \"hitAttributeNV block\");\n        break;\n    case EvqCallableData:\n        profileRequires(loc, ~EEsProfile, 460, 2, extsrt, \"callableDataNV block\");\n        requireStage(loc, (EShLanguageMask)(EShLangRayGenMask | EShLangClosestHitMask | EShLangMissMask | EShLangCallableMask),\n            \"callableDataNV block\");\n        break;\n    case EvqCallableDataIn:\n        profileRequires(loc, ~EEsProfile, 460, 2, extsrt, \"callableDataInNV block\");\n        requireStage(loc, (EShLanguageMask)(EShLangCallableMask), \"callableDataInNV block\");\n        break;\n    case EvqHitObjectAttrNV:\n        profileRequires(loc, ~EEsProfile, 460, E_GL_NV_shader_invocation_reorder, \"hitObjectAttributeNV block\");\n        requireStage(loc, (EShLanguageMask)(EShLangRayGenMask | EShLangClosestHitMask | EShLangMissMask), \"hitObjectAttributeNV block\");\n        break;\n    default:\n        error(loc, \"only uniform, buffer, in, or out blocks are supported\", blockName->c_str(), \"\");\n        break;\n    }\n}\n\n// Do all block-declaration checking regarding its qualifiers.\nvoid TParseContext::blockQualifierCheck(const TSourceLoc& loc, const TQualifier& qualifier, bool /*instanceName*/)\n{\n    // The 4.5 specification says:\n    //\n    // interface-block :\n    //    layout-qualifieropt interface-qualifier  block-name { member-list } instance-nameopt ;\n    //\n    // interface-qualifier :\n    //    in\n    //    out\n    //    patch in\n    //    patch out\n    //    uniform\n    //    buffer\n    //\n    // Note however memory qualifiers aren't included, yet the specification also says\n    //\n    // \"...memory qualifiers may also be used in the declaration of shader storage blocks...\"\n\n    if (qualifier.isInterpolation())\n        error(loc, \"cannot use interpolation qualifiers on an interface block\", \"flat/smooth/noperspective\", \"\");\n    if (qualifier.centroid)\n        error(loc, \"cannot use centroid qualifier on an interface block\", \"centroid\", \"\");\n    if (qualifier.isSample())\n        error(loc, \"cannot use sample qualifier on an interface block\", \"sample\", \"\");\n    if (qualifier.invariant)\n        error(loc, \"cannot use invariant qualifier on an interface block\", \"invariant\", \"\");\n    if (qualifier.isPushConstant())\n        intermediate.addPushConstantCount();\n    if (qualifier.isShaderRecord())\n        intermediate.addShaderRecordCount();\n    if (qualifier.isTaskMemory())\n        intermediate.addTaskNVCount();\n}\n\n//\n// \"For a block, this process applies to the entire block, or until the first member\n// is reached that has a location layout qualifier. When a block member is declared with a location\n// qualifier, its location comes from that qualifier: The member's location qualifier overrides the block-level\n// declaration. Subsequent members are again assigned consecutive locations, based on the newest location,\n// until the next member declared with a location qualifier. The values used for locations do not have to be\n// declared in increasing order.\"\nvoid TParseContext::fixBlockLocations(const TSourceLoc& loc, TQualifier& qualifier, TTypeList& typeList, bool memberWithLocation, bool memberWithoutLocation)\n{\n    // \"If a block has no block-level location layout qualifier, it is required that either all or none of its members\n    // have a location layout qualifier, or a compile-time error results.\"\n    if (! qualifier.hasLocation() && memberWithLocation && memberWithoutLocation)\n        error(loc, \"either the block needs a location, or all members need a location, or no members have a location\", \"location\", \"\");\n    else {\n        if (memberWithLocation) {\n            // remove any block-level location and make it per *every* member\n            int nextLocation = 0;  // by the rule above, initial value is not relevant\n            if (qualifier.hasAnyLocation()) {\n                nextLocation = qualifier.layoutLocation;\n                qualifier.layoutLocation = TQualifier::layoutLocationEnd;\n                if (qualifier.hasComponent()) {\n                    // \"It is a compile-time error to apply the *component* qualifier to a ... block\"\n                    error(loc, \"cannot apply to a block\", \"component\", \"\");\n                }\n                if (qualifier.hasIndex()) {\n                    error(loc, \"cannot apply to a block\", \"index\", \"\");\n                }\n            }\n            for (unsigned int member = 0; member < typeList.size(); ++member) {\n                TQualifier& memberQualifier = typeList[member].type->getQualifier();\n                const TSourceLoc& memberLoc = typeList[member].loc;\n                if (! memberQualifier.hasLocation()) {\n                    if (nextLocation >= (int)TQualifier::layoutLocationEnd)\n                        error(memberLoc, \"location is too large\", \"location\", \"\");\n                    memberQualifier.layoutLocation = nextLocation;\n                    memberQualifier.layoutComponent = TQualifier::layoutComponentEnd;\n                }\n                nextLocation = memberQualifier.layoutLocation + intermediate.computeTypeLocationSize(\n                                    *typeList[member].type, language);\n            }\n        }\n    }\n}\n\nvoid TParseContext::fixXfbOffsets(TQualifier& qualifier, TTypeList& typeList)\n{\n    // \"If a block is qualified with xfb_offset, all its\n    // members are assigned transform feedback buffer offsets. If a block is not qualified with xfb_offset, any\n    // members of that block not qualified with an xfb_offset will not be assigned transform feedback buffer\n    // offsets.\"\n\n    if (! qualifier.hasXfbBuffer() || ! qualifier.hasXfbOffset())\n        return;\n\n    int nextOffset = qualifier.layoutXfbOffset;\n    for (unsigned int member = 0; member < typeList.size(); ++member) {\n        TQualifier& memberQualifier = typeList[member].type->getQualifier();\n        bool contains64BitType = false;\n        bool contains32BitType = false;\n        bool contains16BitType = false;\n        int memberSize = intermediate.computeTypeXfbSize(*typeList[member].type, contains64BitType, contains32BitType, contains16BitType);\n        // see if we need to auto-assign an offset to this member\n        if (! memberQualifier.hasXfbOffset()) {\n            // \"if applied to an aggregate containing a double or 64-bit integer, the offset must also be a multiple of 8\"\n            if (contains64BitType)\n                RoundToPow2(nextOffset, 8);\n            else if (contains32BitType)\n                RoundToPow2(nextOffset, 4);\n            else if (contains16BitType)\n                RoundToPow2(nextOffset, 2);\n            memberQualifier.layoutXfbOffset = nextOffset;\n        } else\n            nextOffset = memberQualifier.layoutXfbOffset;\n        nextOffset += memberSize;\n    }\n\n    // The above gave all block members an offset, so we can take it off the block now,\n    // which will avoid double counting the offset usage.\n    qualifier.layoutXfbOffset = TQualifier::layoutXfbOffsetEnd;\n}\n\n// Calculate and save the offset of each block member, using the recursively\n// defined block offset rules and the user-provided offset and align.\n//\n// Also, compute and save the total size of the block. For the block's size, arrayness\n// is not taken into account, as each element is backed by a separate buffer.\n//\nvoid TParseContext::fixBlockUniformOffsets(TQualifier& qualifier, TTypeList& typeList)\n{\n    if (!storageCanHaveLayoutInBlock(qualifier.storage) && !qualifier.isTaskMemory())\n        return;\n    if (qualifier.layoutPacking != ElpStd140 && qualifier.layoutPacking != ElpStd430 && qualifier.layoutPacking != ElpScalar)\n        return;\n\n    int offset = 0;\n    int memberSize;\n    for (unsigned int member = 0; member < typeList.size(); ++member) {\n        TQualifier& memberQualifier = typeList[member].type->getQualifier();\n        const TSourceLoc& memberLoc = typeList[member].loc;\n\n        // \"When align is applied to an array, it effects only the start of the array, not the array's internal stride.\"\n\n        // modify just the children's view of matrix layout, if there is one for this member\n        TLayoutMatrix subMatrixLayout = typeList[member].type->getQualifier().layoutMatrix;\n        int dummyStride;\n        int memberAlignment = intermediate.getMemberAlignment(*typeList[member].type, memberSize, dummyStride, qualifier.layoutPacking,\n                                                              subMatrixLayout != ElmNone ? subMatrixLayout == ElmRowMajor : qualifier.layoutMatrix == ElmRowMajor);\n        if (memberQualifier.hasOffset()) {\n            // \"The specified offset must be a multiple\n            // of the base alignment of the type of the block member it qualifies, or a compile-time error results.\"\n            if (! IsMultipleOfPow2(memberQualifier.layoutOffset, memberAlignment))\n                error(memberLoc, \"must be a multiple of the member's alignment\", \"offset\",\n                    \"(layout offset = %d | member alignment = %d)\", memberQualifier.layoutOffset, memberAlignment);\n\n            // GLSL: \"It is a compile-time error to specify an offset that is smaller than the offset of the previous\n            // member in the block or that lies within the previous member of the block\"\n            if (spvVersion.spv == 0) {\n                if (memberQualifier.layoutOffset < offset)\n                    error(memberLoc, \"cannot lie in previous members\", \"offset\", \"\");\n\n                // \"The offset qualifier forces the qualified member to start at or after the specified\n                // integral-constant expression, which will be its byte offset from the beginning of the buffer.\n                // \"The actual offset of a member is computed as\n                // follows: If offset was declared, start with that offset, otherwise start with the next available offset.\"\n                offset = std::max(offset, memberQualifier.layoutOffset);\n            } else {\n                // TODO: Vulkan: \"It is a compile-time error to have any offset, explicit or assigned,\n                // that lies within another member of the block.\"\n\n                offset = memberQualifier.layoutOffset;\n            }\n        }\n\n        // \"The actual alignment of a member will be the greater of the specified align alignment and the standard\n        // (e.g., std140) base alignment for the member's type.\"\n        if (memberQualifier.hasAlign())\n            memberAlignment = std::max(memberAlignment, memberQualifier.layoutAlign);\n\n        // \"If the resulting offset is not a multiple of the actual alignment,\n        // increase it to the first offset that is a multiple of\n        // the actual alignment.\"\n        RoundToPow2(offset, memberAlignment);\n        typeList[member].type->getQualifier().layoutOffset = offset;\n        offset += memberSize;\n    }\n}\n\n//\n// Spread LayoutMatrix to uniform block member, if a uniform block member is a struct,\n// we need spread LayoutMatrix to this struct member too. and keep this rule for recursive.\n//\nvoid TParseContext::fixBlockUniformLayoutMatrix(TQualifier& qualifier, TTypeList* originTypeList,\n                                                TTypeList* tmpTypeList)\n{\n    assert(tmpTypeList == nullptr || originTypeList->size() == tmpTypeList->size());\n    for (unsigned int member = 0; member < originTypeList->size(); ++member) {\n        if (qualifier.layoutPacking != ElpNone) {\n            if (tmpTypeList == nullptr) {\n                if (((*originTypeList)[member].type->isMatrix() ||\n                     (*originTypeList)[member].type->getBasicType() == EbtStruct) &&\n                    (*originTypeList)[member].type->getQualifier().layoutMatrix == ElmNone) {\n                    (*originTypeList)[member].type->getQualifier().layoutMatrix = qualifier.layoutMatrix;\n                }\n            } else {\n                if (((*tmpTypeList)[member].type->isMatrix() ||\n                     (*tmpTypeList)[member].type->getBasicType() == EbtStruct) &&\n                    (*tmpTypeList)[member].type->getQualifier().layoutMatrix == ElmNone) {\n                    (*tmpTypeList)[member].type->getQualifier().layoutMatrix = qualifier.layoutMatrix;\n                }\n            }\n        }\n\n        if ((*originTypeList)[member].type->getBasicType() == EbtStruct) {\n            TQualifier* memberQualifier = nullptr;\n            // block member can be declare a matrix style, so it should be update to the member's style\n            if ((*originTypeList)[member].type->getQualifier().layoutMatrix == ElmNone) {\n                memberQualifier = &qualifier;\n            } else {\n                memberQualifier = &((*originTypeList)[member].type->getQualifier());\n            }\n\n            const TType* tmpType = tmpTypeList == nullptr ?\n                (*originTypeList)[member].type->clone() : (*tmpTypeList)[member].type;\n\n            fixBlockUniformLayoutMatrix(*memberQualifier, (*originTypeList)[member].type->getWritableStruct(),\n                                        tmpType->getWritableStruct());\n\n            const TTypeList* structure = recordStructCopy(matrixFixRecord, (*originTypeList)[member].type, tmpType);\n\n            if (tmpTypeList == nullptr) {\n                (*originTypeList)[member].type->setStruct(const_cast<TTypeList*>(structure));\n            }\n            if (tmpTypeList != nullptr) {\n                (*tmpTypeList)[member].type->setStruct(const_cast<TTypeList*>(structure));\n            }\n        }\n    }\n}\n\n//\n// Spread LayoutPacking to matrix or aggregate block members. If a block member is a struct or\n// array of struct, spread LayoutPacking recursively to its matrix or aggregate members.\n//\nvoid TParseContext::fixBlockUniformLayoutPacking(TQualifier& qualifier, TTypeList* originTypeList,\n                                                 TTypeList* tmpTypeList)\n{\n    assert(tmpTypeList == nullptr || originTypeList->size() == tmpTypeList->size());\n    for (unsigned int member = 0; member < originTypeList->size(); ++member) {\n        if (qualifier.layoutPacking != ElpNone) {\n            if (tmpTypeList == nullptr) {\n                if ((*originTypeList)[member].type->getQualifier().layoutPacking == ElpNone &&\n                    !(*originTypeList)[member].type->isScalarOrVector()) {\n                    (*originTypeList)[member].type->getQualifier().layoutPacking = qualifier.layoutPacking;\n                }\n            } else {\n                if ((*tmpTypeList)[member].type->getQualifier().layoutPacking == ElpNone &&\n                    !(*tmpTypeList)[member].type->isScalarOrVector()) {\n                    (*tmpTypeList)[member].type->getQualifier().layoutPacking = qualifier.layoutPacking;\n                }\n            }\n        }\n\n        if ((*originTypeList)[member].type->getBasicType() == EbtStruct) {\n            // Deep copy the type in pool.\n            // Because, struct use in different block may have different layout qualifier.\n            // We have to new a object to distinguish between them.\n            const TType* tmpType = tmpTypeList == nullptr ?\n                (*originTypeList)[member].type->clone() : (*tmpTypeList)[member].type;\n\n            fixBlockUniformLayoutPacking(qualifier, (*originTypeList)[member].type->getWritableStruct(),\n                                         tmpType->getWritableStruct());\n\n            const TTypeList* structure = recordStructCopy(packingFixRecord, (*originTypeList)[member].type, tmpType);\n\n            if (tmpTypeList == nullptr) {\n                (*originTypeList)[member].type->setStruct(const_cast<TTypeList*>(structure));\n            }\n            if (tmpTypeList != nullptr) {\n                (*tmpTypeList)[member].type->setStruct(const_cast<TTypeList*>(structure));\n            }\n        }\n    }\n}\n\n// For an identifier that is already declared, add more qualification to it.\nvoid TParseContext::addQualifierToExisting(const TSourceLoc& loc, TQualifier qualifier, const TString& identifier)\n{\n    TSymbol* symbol = symbolTable.find(identifier);\n\n    // A forward declaration of a block reference looks to the grammar like adding\n    // a qualifier to an existing symbol. Detect this and create the block reference\n    // type with an empty type list, which will be filled in later in\n    // TParseContext::declareBlock.\n    if (!symbol && qualifier.hasBufferReference()) {\n        // The layout qualifiers are ignored in forward declaration, give warning for the most probable to be seen\n        if (qualifier.hasBufferReferenceAlign()) {\n            warn(loc, \"the buffer_reference_align layout is ignored when defined in forward declaration\",\n                 identifier.c_str(), \"\");\n        }\n        if (qualifier.hasPacking()) {\n            warn(loc, \"the packing layout (scalar, std430, etc) is ignored when defined in forward declaration\",\n                 identifier.c_str(), \"\");\n        }\n        TTypeList typeList;\n        TType blockType(&typeList, identifier, qualifier);\n        TType blockNameType(EbtReference, blockType, identifier);\n        TVariable* blockNameVar = new TVariable(&identifier, blockNameType, true);\n        if (! symbolTable.insert(*blockNameVar)) {\n            error(loc, \"block name cannot redefine a non-block name\", blockName->c_str(), \"\");\n        }\n        return;\n    }\n\n    if (! symbol) {\n        error(loc, \"identifier not previously declared\", identifier.c_str(), \"\");\n        return;\n    }\n    if (symbol->getAsFunction()) {\n        error(loc, \"cannot re-qualify a function name\", identifier.c_str(), \"\");\n        return;\n    }\n\n    if (qualifier.isAuxiliary() ||\n        qualifier.isMemory() ||\n        qualifier.isInterpolation() ||\n        qualifier.hasLayout() ||\n        qualifier.storage != EvqTemporary ||\n        qualifier.precision != EpqNone) {\n        error(loc, \"cannot add storage, auxiliary, memory, interpolation, layout, or precision qualifier to an existing variable\", identifier.c_str(), \"\");\n        return;\n    }\n\n    // For read-only built-ins, add a new symbol for holding the modified qualifier.\n    // This will bring up an entire block, if a block type has to be modified (e.g., gl_Position inside a block)\n    if (symbol->isReadOnly())\n        symbol = symbolTable.copyUp(symbol);\n\n    if (qualifier.invariant) {\n        if (intermediate.inIoAccessed(identifier))\n            error(loc, \"cannot change qualification after use\", \"invariant\", \"\");\n        symbol->getWritableType().getQualifier().invariant = true;\n        invariantCheck(loc, symbol->getType().getQualifier());\n    } else if (qualifier.isNoContraction()) {\n        if (intermediate.inIoAccessed(identifier))\n            error(loc, \"cannot change qualification after use\", \"precise\", \"\");\n        symbol->getWritableType().getQualifier().setNoContraction();\n    } else if (qualifier.specConstant) {\n        symbol->getWritableType().getQualifier().makeSpecConstant();\n        if (qualifier.hasSpecConstantId())\n            symbol->getWritableType().getQualifier().layoutSpecConstantId = qualifier.layoutSpecConstantId;\n    } else\n        warn(loc, \"unknown requalification\", \"\", \"\");\n}\n\nvoid TParseContext::addQualifierToExisting(const TSourceLoc& loc, TQualifier qualifier, TIdentifierList& identifiers)\n{\n    for (unsigned int i = 0; i < identifiers.size(); ++i)\n        addQualifierToExisting(loc, qualifier, *identifiers[i]);\n}\n\n// Make sure 'invariant' isn't being applied to a non-allowed object.\nvoid TParseContext::invariantCheck(const TSourceLoc& loc, const TQualifier& qualifier)\n{\n    if (! qualifier.invariant)\n        return;\n\n    bool pipeOut = qualifier.isPipeOutput();\n    bool pipeIn = qualifier.isPipeInput();\n    if ((version >= 300 && isEsProfile()) || (!isEsProfile() && version >= 420)) {\n        if (! pipeOut)\n            error(loc, \"can only apply to an output\", \"invariant\", \"\");\n    } else {\n        if ((language == EShLangVertex && pipeIn) || (! pipeOut && ! pipeIn))\n            error(loc, \"can only apply to an output, or to an input in a non-vertex stage\\n\", \"invariant\", \"\");\n    }\n}\n\n//\n// Updating default qualifier for the case of a declaration with just a qualifier,\n// no type, block, or identifier.\n//\nvoid TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, const TPublicType& publicType)\n{\n    if (publicType.shaderQualifiers.vertices != TQualifier::layoutNotSet) {\n        assert(language == EShLangTessControl || language == EShLangGeometry || language == EShLangMesh);\n        const char* id = (language == EShLangTessControl) ? \"vertices\" : \"max_vertices\";\n\n        if (publicType.qualifier.storage != EvqVaryingOut)\n            error(loc, \"can only apply to 'out'\", id, \"\");\n        if (! intermediate.setVertices(publicType.shaderQualifiers.vertices))\n            error(loc, \"cannot change previously set layout value\", id, \"\");\n\n        if (language == EShLangTessControl)\n            checkIoArraysConsistency(loc);\n    }\n    if (publicType.shaderQualifiers.primitives != TQualifier::layoutNotSet) {\n        assert(language == EShLangMesh);\n        const char* id = \"max_primitives\";\n\n        if (publicType.qualifier.storage != EvqVaryingOut)\n            error(loc, \"can only apply to 'out'\", id, \"\");\n        if (! intermediate.setPrimitives(publicType.shaderQualifiers.primitives))\n            error(loc, \"cannot change previously set layout value\", id, \"\");\n    }\n    if (publicType.shaderQualifiers.invocations != TQualifier::layoutNotSet) {\n        if (publicType.qualifier.storage != EvqVaryingIn)\n            error(loc, \"can only apply to 'in'\", \"invocations\", \"\");\n        if (! intermediate.setInvocations(publicType.shaderQualifiers.invocations))\n            error(loc, \"cannot change previously set layout value\", \"invocations\", \"\");\n    }\n    if (publicType.shaderQualifiers.geometry != ElgNone) {\n        if (publicType.qualifier.storage == EvqVaryingIn) {\n            switch (publicType.shaderQualifiers.geometry) {\n            case ElgPoints:\n            case ElgLines:\n            case ElgLinesAdjacency:\n            case ElgTriangles:\n            case ElgTrianglesAdjacency:\n            case ElgQuads:\n            case ElgIsolines:\n                if (language == EShLangMesh) {\n                    error(loc, \"cannot apply to input\", TQualifier::getGeometryString(publicType.shaderQualifiers.geometry), \"\");\n                    break;\n                }\n                if (intermediate.setInputPrimitive(publicType.shaderQualifiers.geometry)) {\n                    if (language == EShLangGeometry)\n                        checkIoArraysConsistency(loc);\n                } else\n                    error(loc, \"cannot change previously set input primitive\", TQualifier::getGeometryString(publicType.shaderQualifiers.geometry), \"\");\n                break;\n            default:\n                error(loc, \"cannot apply to input\", TQualifier::getGeometryString(publicType.shaderQualifiers.geometry), \"\");\n            }\n        } else if (publicType.qualifier.storage == EvqVaryingOut) {\n            switch (publicType.shaderQualifiers.geometry) {\n            case ElgLines:\n            case ElgTriangles:\n                if (language != EShLangMesh) {\n                    error(loc, \"cannot apply to 'out'\", TQualifier::getGeometryString(publicType.shaderQualifiers.geometry), \"\");\n                    break;\n                }\n                [[fallthrough]];\n            case ElgPoints:\n            case ElgLineStrip:\n            case ElgTriangleStrip:\n                if (! intermediate.setOutputPrimitive(publicType.shaderQualifiers.geometry))\n                    error(loc, \"cannot change previously set output primitive\", TQualifier::getGeometryString(publicType.shaderQualifiers.geometry), \"\");\n                break;\n            default:\n                error(loc, \"cannot apply to 'out'\", TQualifier::getGeometryString(publicType.shaderQualifiers.geometry), \"\");\n            }\n        } else\n            error(loc, \"cannot apply to:\", TQualifier::getGeometryString(publicType.shaderQualifiers.geometry), GetStorageQualifierString(publicType.qualifier.storage));\n    }\n    if (publicType.shaderQualifiers.spacing != EvsNone) {\n        if (publicType.qualifier.storage == EvqVaryingIn) {\n            if (! intermediate.setVertexSpacing(publicType.shaderQualifiers.spacing))\n                error(loc, \"cannot change previously set vertex spacing\", TQualifier::getVertexSpacingString(publicType.shaderQualifiers.spacing), \"\");\n        } else\n            error(loc, \"can only apply to 'in'\", TQualifier::getVertexSpacingString(publicType.shaderQualifiers.spacing), \"\");\n    }\n    if (publicType.shaderQualifiers.order != EvoNone) {\n        if (publicType.qualifier.storage == EvqVaryingIn) {\n            if (! intermediate.setVertexOrder(publicType.shaderQualifiers.order))\n                error(loc, \"cannot change previously set vertex order\", TQualifier::getVertexOrderString(publicType.shaderQualifiers.order), \"\");\n        } else\n            error(loc, \"can only apply to 'in'\", TQualifier::getVertexOrderString(publicType.shaderQualifiers.order), \"\");\n    }\n    if (publicType.shaderQualifiers.pointMode) {\n        if (publicType.qualifier.storage == EvqVaryingIn)\n            intermediate.setPointMode();\n        else\n            error(loc, \"can only apply to 'in'\", \"point_mode\", \"\");\n    }\n\n    for (int i = 0; i < 3; ++i) {\n        if (publicType.shaderQualifiers.localSizeNotDefault[i]) {\n            if (publicType.qualifier.storage == EvqVaryingIn) {\n                if (! intermediate.setLocalSize(i, publicType.shaderQualifiers.localSize[i]))\n                    error(loc, \"cannot change previously set size\", \"local_size\", \"\");\n                else {\n                    int max = 0;\n                    if (language == EShLangCompute) {\n                        switch (i) {\n                        case 0: max = resources.maxComputeWorkGroupSizeX; break;\n                        case 1: max = resources.maxComputeWorkGroupSizeY; break;\n                        case 2: max = resources.maxComputeWorkGroupSizeZ; break;\n                        default: break;\n                        }\n                        if (intermediate.getLocalSize(i) > (unsigned int)max)\n                            error(loc, \"too large; see gl_MaxComputeWorkGroupSize\", \"local_size\", \"\");\n                    } else if (language == EShLangMesh) {\n                        switch (i) {\n                        case 0:\n                            max = extensionTurnedOn(E_GL_EXT_mesh_shader) ?\n                                    resources.maxMeshWorkGroupSizeX_EXT :\n                                    resources.maxMeshWorkGroupSizeX_NV;\n                            break;\n                        case 1:\n                            max = extensionTurnedOn(E_GL_EXT_mesh_shader) ?\n                                    resources.maxMeshWorkGroupSizeY_EXT :\n                                    resources.maxMeshWorkGroupSizeY_NV ;\n                            break;\n                        case 2:\n                            max = extensionTurnedOn(E_GL_EXT_mesh_shader) ?\n                                    resources.maxMeshWorkGroupSizeZ_EXT :\n                                    resources.maxMeshWorkGroupSizeZ_NV ;\n                            break;\n                        default: break;\n                        }\n                        if (intermediate.getLocalSize(i) > (unsigned int)max) {\n                            TString maxsErrtring = \"too large, see \";\n                            maxsErrtring.append(extensionTurnedOn(E_GL_EXT_mesh_shader) ?\n                                                    \"gl_MaxMeshWorkGroupSizeEXT\" : \"gl_MaxMeshWorkGroupSizeNV\");\n                            error(loc, maxsErrtring.c_str(), \"local_size\", \"\");\n                        }\n                    } else if (language == EShLangTask) {\n                        switch (i) {\n                        case 0:\n                            max = extensionTurnedOn(E_GL_EXT_mesh_shader) ?\n                                    resources.maxTaskWorkGroupSizeX_EXT :\n                                    resources.maxTaskWorkGroupSizeX_NV;\n                            break;\n                        case 1:\n                            max = extensionTurnedOn(E_GL_EXT_mesh_shader) ?\n                                    resources.maxTaskWorkGroupSizeY_EXT:\n                                    resources.maxTaskWorkGroupSizeY_NV;\n                            break;\n                        case 2:\n                            max = extensionTurnedOn(E_GL_EXT_mesh_shader) ?\n                                    resources.maxTaskWorkGroupSizeZ_EXT:\n                                    resources.maxTaskWorkGroupSizeZ_NV;\n                            break;\n                        default: break;\n                        }\n                        if (intermediate.getLocalSize(i) > (unsigned int)max) {\n                            TString maxsErrtring = \"too large, see \";\n                            maxsErrtring.append(extensionTurnedOn(E_GL_EXT_mesh_shader) ?\n                                                    \"gl_MaxTaskWorkGroupSizeEXT\" : \"gl_MaxTaskWorkGroupSizeNV\");\n                            error(loc, maxsErrtring.c_str(), \"local_size\", \"\");\n                        }\n                    } else {\n                        assert(0);\n                    }\n\n                    // Fix the existing constant gl_WorkGroupSize with this new information.\n                    TVariable* workGroupSize = getEditableVariable(\"gl_WorkGroupSize\");\n                    if (workGroupSize != nullptr)\n                        workGroupSize->getWritableConstArray()[i].setUConst(intermediate.getLocalSize(i));\n                }\n            } else\n                error(loc, \"can only apply to 'in'\", \"local_size\", \"\");\n        }\n        if (publicType.shaderQualifiers.localSizeSpecId[i] != TQualifier::layoutNotSet) {\n            if (publicType.qualifier.storage == EvqVaryingIn) {\n                if (! intermediate.setLocalSizeSpecId(i, publicType.shaderQualifiers.localSizeSpecId[i]))\n                    error(loc, \"cannot change previously set size\", \"local_size\", \"\");\n            } else\n                error(loc, \"can only apply to 'in'\", \"local_size id\", \"\");\n            // Set the workgroup built-in variable as a specialization constant\n            TVariable* workGroupSize = getEditableVariable(\"gl_WorkGroupSize\");\n            if (workGroupSize != nullptr)\n                workGroupSize->getWritableType().getQualifier().specConstant = true;\n        }\n    }\n\n    if (publicType.shaderQualifiers.earlyFragmentTests) {\n        if (publicType.qualifier.storage == EvqVaryingIn)\n            intermediate.setEarlyFragmentTests();\n        else\n            error(loc, \"can only apply to 'in'\", \"early_fragment_tests\", \"\");\n    }\n    if (publicType.shaderQualifiers.earlyAndLateFragmentTestsAMD) {\n        if (publicType.qualifier.storage == EvqVaryingIn)\n            intermediate.setEarlyAndLateFragmentTestsAMD();\n        else\n            error(loc, \"can only apply to 'in'\", \"early_and_late_fragment_tests_amd\", \"\");\n    }\n    if (publicType.shaderQualifiers.postDepthCoverage) {\n        if (publicType.qualifier.storage == EvqVaryingIn)\n            intermediate.setPostDepthCoverage();\n        else\n            error(loc, \"can only apply to 'in'\", \"post_coverage_coverage\", \"\");\n    }\n    if (publicType.shaderQualifiers.nonCoherentColorAttachmentReadEXT) {\n        if (publicType.qualifier.storage == EvqVaryingIn)\n            intermediate.setNonCoherentColorAttachmentReadEXT();\n        else\n            error(loc, \"can only apply to 'in'\", \"non_coherent_color_attachment_readEXT\", \"\");\n    }\n    if (publicType.shaderQualifiers.nonCoherentDepthAttachmentReadEXT) {\n        if (publicType.qualifier.storage == EvqVaryingIn)\n            intermediate.setNonCoherentDepthAttachmentReadEXT();\n        else\n            error(loc, \"can only apply to 'in'\", \"non_coherent_depth_attachment_readEXT\", \"\");\n    }\n    if (publicType.shaderQualifiers.nonCoherentStencilAttachmentReadEXT) {\n        if (publicType.qualifier.storage == EvqVaryingIn)\n            intermediate.setNonCoherentStencilAttachmentReadEXT();\n        else\n            error(loc, \"can only apply to 'in'\", \"non_coherent_stencil_attachment_readEXT\", \"\");\n    }\n    if (publicType.shaderQualifiers.layoutNonCoherentTileAttachmentReadQCOM) {\n        if (publicType.qualifier.storage == EvqVaryingIn)\n            intermediate.setNonCoherentTileAttachmentReadQCOM();\n        else\n            error(loc, \"can only apply to 'in'\", \"non_coherent_attachment_readQCOM\", \"\");\n    }\n    if (publicType.shaderQualifiers.hasBlendEquation()) {\n        if (publicType.qualifier.storage != EvqVaryingOut)\n            error(loc, \"can only apply to 'out'\", \"blend equation\", \"\");\n    }\n    if (publicType.shaderQualifiers.interlockOrdering) {\n        if (publicType.qualifier.storage == EvqVaryingIn) {\n            if (!intermediate.setInterlockOrdering(publicType.shaderQualifiers.interlockOrdering))\n                error(loc, \"cannot change previously set fragment shader interlock ordering\", TQualifier::getInterlockOrderingString(publicType.shaderQualifiers.interlockOrdering), \"\");\n        }\n        else\n            error(loc, \"can only apply to 'in'\", TQualifier::getInterlockOrderingString(publicType.shaderQualifiers.interlockOrdering), \"\");\n    }\n\n    if (publicType.shaderQualifiers.layoutDerivativeGroupQuads &&\n        publicType.shaderQualifiers.layoutDerivativeGroupLinear) {\n        error(loc, \"cannot be both specified\", \"derivative_group_quadsNV and derivative_group_linearNV\", \"\");\n    }\n\n    if (publicType.shaderQualifiers.layoutDerivativeGroupQuads) {\n        if (publicType.qualifier.storage == EvqVaryingIn) {\n            if ((intermediate.getLocalSizeSpecId(0) == TQualifier::layoutNotSet && (intermediate.getLocalSize(0) & 1)) ||\n                (intermediate.getLocalSizeSpecId(1) == TQualifier::layoutNotSet && (intermediate.getLocalSize(1) & 1)))\n                error(loc, \"requires local_size_x and local_size_y to be multiple of two\", \"derivative_group_quadsNV\", \"\");\n            else\n                intermediate.setLayoutDerivativeMode(LayoutDerivativeGroupQuads);\n        }\n        else\n            error(loc, \"can only apply to 'in'\", \"derivative_group_quadsNV\", \"\");\n    }\n    if (publicType.shaderQualifiers.layoutDerivativeGroupLinear) {\n        if (publicType.qualifier.storage == EvqVaryingIn) {\n            if (intermediate.getLocalSizeSpecId(0) == TQualifier::layoutNotSet &&\n                intermediate.getLocalSizeSpecId(1) == TQualifier::layoutNotSet &&\n                intermediate.getLocalSizeSpecId(2) == TQualifier::layoutNotSet &&\n                (intermediate.getLocalSize(0) *\n                intermediate.getLocalSize(1) *\n                intermediate.getLocalSize(2)) % 4 != 0)\n                error(loc, \"requires total group size to be multiple of four\", \"derivative_group_linearNV\", \"\");\n            else\n                intermediate.setLayoutDerivativeMode(LayoutDerivativeGroupLinear);\n        }\n        else\n            error(loc, \"can only apply to 'in'\", \"derivative_group_linearNV\", \"\");\n    }\n    // Check mesh out array sizes, once all the necessary out qualifiers are defined.\n    if ((language == EShLangMesh) &&\n        (intermediate.getVertices() != TQualifier::layoutNotSet) &&\n        (intermediate.getPrimitives() != TQualifier::layoutNotSet) &&\n        (intermediate.getOutputPrimitive() != ElgNone))\n    {\n        checkIoArraysConsistency(loc);\n    }\n\n    if (publicType.shaderQualifiers.layoutPrimitiveCulling) {\n        if (publicType.qualifier.storage != EvqTemporary)\n            error(loc, \"layout qualifier cannot have storage qualifiers\", \"primitive_culling\", \"\", \"\");\n        else {\n            intermediate.setLayoutPrimitiveCulling();\n        }\n        // Exit early as further checks are not valid\n        return;\n    }\n\n    for (int i = 0; i < 3; ++i) {\n        if (publicType.shaderQualifiers.layoutTileShadingRateQCOMNotDefault[i]) {\n            if (publicType.qualifier.storage == EvqVaryingIn) {\n                if (! intermediate.setTileShadingRateQCOM(i, publicType.shaderQualifiers.layoutTileShadingRateQCOM[i]))\n                    error(loc, \"cannot change previously set size\", (i==0?\"shading_rate_xQCOM\":(i==1?\"shading_rate_yQCOM\":\"shading_rate_zQCOM\")), \"\");\n            } else\n                error(loc, \"can only apply to 'in'\", (i==0?\"shading_rate_xQCOM\":(i==1?\"shading_rate_yQCOM\":\"shading_rate_zQCOM\")), \"\");\n        }\n    }\n\n    const TQualifier& qualifier = publicType.qualifier;\n\n    if (qualifier.isAuxiliary() ||\n        qualifier.isMemory() ||\n        qualifier.isInterpolation() ||\n        qualifier.precision != EpqNone)\n        error(loc, \"cannot use auxiliary, memory, interpolation, or precision qualifier in a default qualifier declaration (declaration with no type)\", \"qualifier\", \"\");\n\n    // \"The offset qualifier can only be used on block members of blocks...\"\n    // \"The align qualifier can only be used on blocks or block members...\"\n    if (qualifier.hasOffset() ||\n        qualifier.hasAlign())\n        error(loc, \"cannot use offset or align qualifiers in a default qualifier declaration (declaration with no type)\", \"layout qualifier\", \"\");\n\n    layoutQualifierCheck(loc, qualifier);\n\n    switch (qualifier.storage) {\n    case EvqUniform:\n        if (qualifier.hasMatrix())\n            globalUniformDefaults.layoutMatrix = qualifier.layoutMatrix;\n        if (qualifier.hasPacking())\n            globalUniformDefaults.layoutPacking = qualifier.layoutPacking;\n        break;\n    case EvqBuffer:\n        if (qualifier.hasMatrix())\n            globalBufferDefaults.layoutMatrix = qualifier.layoutMatrix;\n        if (qualifier.hasPacking())\n            globalBufferDefaults.layoutPacking = qualifier.layoutPacking;\n        break;\n    case EvqVaryingIn:\n        break;\n    case EvqVaryingOut:\n        if (qualifier.hasStream())\n            globalOutputDefaults.layoutStream = qualifier.layoutStream;\n        if (qualifier.hasXfbBuffer())\n            globalOutputDefaults.layoutXfbBuffer = qualifier.layoutXfbBuffer;\n        if (globalOutputDefaults.hasXfbBuffer() && qualifier.hasXfbStride()) {\n            if (! intermediate.setXfbBufferStride(globalOutputDefaults.layoutXfbBuffer, qualifier.layoutXfbStride))\n                error(loc, \"all stride settings must match for xfb buffer\", \"xfb_stride\", \"%d\", qualifier.layoutXfbBuffer);\n        }\n        break;\n    case EvqShared:\n        if (qualifier.hasMatrix())\n            globalSharedDefaults.layoutMatrix = qualifier.layoutMatrix;\n        if (qualifier.hasPacking())\n            globalSharedDefaults.layoutPacking = qualifier.layoutPacking;\n        break;\n    default:\n        error(loc, \"default qualifier requires 'uniform', 'buffer', 'in', 'out' or 'shared' storage qualification\", \"\", \"\");\n        return;\n    }\n\n    if (qualifier.hasBinding())\n        error(loc, \"cannot declare a default, include a type or full declaration\", \"binding\", \"\");\n    if (qualifier.hasAnyLocation())\n        error(loc, \"cannot declare a default, use a full declaration\", \"location/component/index\", \"\");\n    if (qualifier.hasXfbOffset())\n        error(loc, \"cannot declare a default, use a full declaration\", \"xfb_offset\", \"\");\n    if (qualifier.isPushConstant())\n        error(loc, \"cannot declare a default, can only be used on a block\", \"push_constant\", \"\");\n    if (qualifier.hasBufferReference())\n        error(loc, \"cannot declare a default, can only be used on a block\", \"buffer_reference\", \"\");\n    if (qualifier.hasSpecConstantId())\n        error(loc, \"cannot declare a default, can only be used on a scalar\", \"constant_id\", \"\");\n    if (qualifier.isShaderRecord())\n        error(loc, \"cannot declare a default, can only be used on a block\", \"shaderRecordNV\", \"\");\n}\n\n//\n// Take the sequence of statements that has been built up since the last case/default,\n// put it on the list of top-level nodes for the current (inner-most) switch statement,\n// and follow that by the case/default we are on now.  (See switch topology comment on\n// TIntermSwitch.)\n//\nvoid TParseContext::wrapupSwitchSubsequence(TIntermAggregate* statements, TIntermNode* branchNode)\n{\n    TIntermSequence* switchSequence = switchSequenceStack.back();\n\n    if (statements) {\n        if (switchSequence->size() == 0)\n            error(statements->getLoc(), \"cannot have statements before first case/default label\", \"switch\", \"\");\n        statements->setOperator(EOpSequence);\n        switchSequence->push_back(statements);\n    }\n    if (branchNode) {\n        // check all previous cases for the same label (or both are 'default')\n        for (unsigned int s = 0; s < switchSequence->size(); ++s) {\n            TIntermBranch* prevBranch = (*switchSequence)[s]->getAsBranchNode();\n            if (prevBranch) {\n                TIntermTyped* prevExpression = prevBranch->getExpression();\n                TIntermTyped* newExpression = branchNode->getAsBranchNode()->getExpression();\n                if (prevExpression == nullptr && newExpression == nullptr)\n                    error(branchNode->getLoc(), \"duplicate label\", \"default\", \"\");\n                else if (prevExpression != nullptr &&\n                          newExpression != nullptr &&\n                         prevExpression->getAsConstantUnion() &&\n                          newExpression->getAsConstantUnion() &&\n                         prevExpression->getAsConstantUnion()->getConstArray()[0].getIConst() ==\n                          newExpression->getAsConstantUnion()->getConstArray()[0].getIConst())\n                    error(branchNode->getLoc(), \"duplicated value\", \"case\", \"\");\n            }\n        }\n        switchSequence->push_back(branchNode);\n    }\n}\n\n//\n// Turn the top-level node sequence built up of wrapupSwitchSubsequence9)\n// into a switch node.\n//\nTIntermNode* TParseContext::addSwitch(const TSourceLoc& loc, TIntermTyped* expression, TIntermAggregate* lastStatements)\n{\n    profileRequires(loc, EEsProfile, 300, nullptr, \"switch statements\");\n    profileRequires(loc, ENoProfile, 130, nullptr, \"switch statements\");\n\n    wrapupSwitchSubsequence(lastStatements, nullptr);\n\n    if (expression == nullptr ||\n        (expression->getBasicType() != EbtInt && expression->getBasicType() != EbtUint) ||\n        expression->getType().isArray() || expression->getType().isMatrix() || expression->getType().isVector())\n            error(loc, \"condition must be a scalar integer expression\", \"switch\", \"\");\n\n    // If there is nothing to do, drop the switch but still execute the expression\n    TIntermSequence* switchSequence = switchSequenceStack.back();\n    if (switchSequence->size() == 0)\n        return expression;\n\n    if (lastStatements == nullptr) {\n        // This was originally an ERRROR, because early versions of the specification said\n        // \"it is an error to have no statement between a label and the end of the switch statement.\"\n        // The specifications were updated to remove this (being ill-defined what a \"statement\" was),\n        // so, this became a warning.  However, 3.0 tests still check for the error.\n        if (isEsProfile() && (version <= 300 || version >= 320) && ! relaxedErrors())\n            error(loc, \"last case/default label not followed by statements\", \"switch\", \"\");\n        else if (!isEsProfile() && (version <= 430 || version >= 460))\n            error(loc, \"last case/default label not followed by statements\", \"switch\", \"\");\n        else\n            warn(loc, \"last case/default label not followed by statements\", \"switch\", \"\");\n\n\n        // emulate a break for error recovery\n        lastStatements = intermediate.makeAggregate(intermediate.addBranch(EOpBreak, loc));\n        lastStatements->setOperator(EOpSequence);\n        switchSequence->push_back(lastStatements);\n    }\n\n    TIntermAggregate* body = new TIntermAggregate(EOpSequence);\n    body->getSequence() = *switchSequenceStack.back();\n    body->setLoc(loc);\n\n    TIntermSwitch* switchNode = new TIntermSwitch(expression, body);\n    switchNode->setLoc(loc);\n\n    return switchNode;\n}\n\n//\n// When a struct used in block, and has it's own layout packing, layout matrix,\n// record the origin structure of a struct to map, and Record the structure copy to the copy table,\n//\nconst TTypeList* TParseContext::recordStructCopy(TStructRecord& record, const TType* originType, const TType* tmpType)\n{\n    size_t memberCount = tmpType->getStruct()->size();\n    size_t originHash = 0, tmpHash = 0;\n    std::hash<size_t> hasher;\n    for (size_t i = 0; i < memberCount; i++) {\n        size_t originMemberHash = hasher(originType->getStruct()->at(i).type->getQualifier().layoutPacking +\n                                         originType->getStruct()->at(i).type->getQualifier().layoutMatrix);\n        size_t tmpMemberHash = hasher(tmpType->getStruct()->at(i).type->getQualifier().layoutPacking +\n                                      tmpType->getStruct()->at(i).type->getQualifier().layoutMatrix);\n        originHash = hasher((originHash ^ originMemberHash) << 1);\n        tmpHash = hasher((tmpHash ^ tmpMemberHash) << 1);\n    }\n    const TTypeList* originStruct = originType->getStruct();\n    const TTypeList* tmpStruct = tmpType->getStruct();\n    if (originHash != tmpHash) {\n        auto fixRecords = record.find(originStruct);\n        if (fixRecords != record.end()) {\n            auto fixRecord = fixRecords->second.find(tmpHash);\n            if (fixRecord != fixRecords->second.end()) {\n                return fixRecord->second;\n            } else {\n                record[originStruct][tmpHash] = tmpStruct;\n                return tmpStruct;\n            }\n        } else {\n            record[originStruct] = std::map<size_t, const TTypeList*>();\n            record[originStruct][tmpHash] = tmpStruct;\n            return tmpStruct;\n        }\n    }\n    return originStruct;\n}\n\nTLayoutFormat TParseContext::mapLegacyLayoutFormat(TLayoutFormat legacyLayoutFormat, TBasicType imageType)\n{\n    TLayoutFormat layoutFormat = ElfNone;\n    if (imageType == EbtFloat) {\n        switch (legacyLayoutFormat) {\n        case ElfSize1x16: layoutFormat = ElfR16f; break;\n        case ElfSize1x32: layoutFormat = ElfR32f; break;\n        case ElfSize2x32: layoutFormat = ElfRg32f; break;\n        case ElfSize4x32: layoutFormat = ElfRgba32f; break;\n        default: break;\n        }\n    } else if (imageType == EbtUint) {\n        switch (legacyLayoutFormat) {\n        case ElfSize1x8: layoutFormat = ElfR8ui; break;\n        case ElfSize1x16: layoutFormat = ElfR16ui; break;\n        case ElfSize1x32: layoutFormat = ElfR32ui; break;\n        case ElfSize2x32: layoutFormat = ElfRg32ui; break;\n        case ElfSize4x32: layoutFormat = ElfRgba32ui; break;\n        default: break;\n        }\n    } else if (imageType == EbtInt) {\n        switch (legacyLayoutFormat) {\n        case ElfSize1x8: layoutFormat = ElfR8i; break;\n        case ElfSize1x16: layoutFormat = ElfR16i; break;\n        case ElfSize1x32: layoutFormat = ElfR32i; break;\n        case ElfSize2x32: layoutFormat = ElfRg32i; break;\n        case ElfSize4x32: layoutFormat = ElfRgba32i; break;\n        default: break;\n        }\n    }\n\n    return layoutFormat;\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/ParseHelper.h",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2012-2013 LunarG, Inc.\n// Copyright (C) 2015-2018 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n//\n// This header defines a two-level parse-helper hierarchy, derived from\n// TParseVersions:\n//  - TParseContextBase:  sharable across multiple parsers\n//  - TParseContext:      GLSL specific helper\n//\n\n#ifndef _PARSER_HELPER_INCLUDED_\n#define _PARSER_HELPER_INCLUDED_\n\n#include <cstdarg>\n#include <functional>\n\n#include \"parseVersions.h\"\n#include \"../Include/ShHandle.h\"\n#include \"SymbolTable.h\"\n#include \"localintermediate.h\"\n#include \"Scan.h\"\n#include \"attribute.h\"\n\nnamespace glslang {\n\nstruct TPragma {\n    TPragma(bool o, bool d) : optimize(o), debug(d) { }\n    bool optimize;\n    bool debug;\n    TPragmaTable pragmaTable;\n};\n\nclass TScanContext;\nclass TPpContext;\n\ntypedef std::set<long long> TIdSetType;\ntypedef std::map<const TTypeList*, std::map<size_t, const TTypeList*>> TStructRecord;\n\n//\n// Sharable code (as well as what's in TParseVersions) across\n// parse helpers.\n//\nclass TParseContextBase : public TParseVersions {\npublic:\n    TParseContextBase(TSymbolTable& symbolTable, TIntermediate& interm, bool parsingBuiltins, int version,\n                      EProfile profile, const SpvVersion& spvVersion, EShLanguage language,\n                      TInfoSink& infoSink, bool forwardCompatible, EShMessages messages,\n                      const TString* entryPoint = nullptr)\n          : TParseVersions(interm, version, profile, spvVersion, language, infoSink, forwardCompatible, messages),\n            scopeMangler(\"::\"),\n            symbolTable(symbolTable),\n            statementNestingLevel(0), loopNestingLevel(0), structNestingLevel(0), blockNestingLevel(0), controlFlowNestingLevel(0),\n            currentFunctionType(nullptr),\n            postEntryPointReturn(false),\n            contextPragma(true, false),\n            beginInvocationInterlockCount(0), endInvocationInterlockCount(0),\n            parsingBuiltins(parsingBuiltins), scanContext(nullptr), ppContext(nullptr),\n            limits(resources.limits),\n            globalUniformBlock(nullptr),\n            globalUniformBinding(TQualifier::layoutBindingEnd),\n            globalUniformSet(TQualifier::layoutSetEnd),\n            atomicCounterBlockSet(TQualifier::layoutSetEnd)\n    {\n        // use storage buffer on SPIR-V 1.3 and up\n        if (spvVersion.spv >= EShTargetSpv_1_3)\n            intermediate.setUseStorageBuffer();\n\n        if (entryPoint != nullptr)\n            sourceEntryPointName = *entryPoint;\n    }\n    virtual ~TParseContextBase() { }\n\n    virtual void C_DECL   error(const TSourceLoc&, const char* szReason, const char* szToken,\n                                const char* szExtraInfoFormat, ...);\n    virtual void C_DECL    warn(const TSourceLoc&, const char* szReason, const char* szToken,\n                                const char* szExtraInfoFormat, ...);\n    virtual void C_DECL ppError(const TSourceLoc&, const char* szReason, const char* szToken,\n                                const char* szExtraInfoFormat, ...);\n    virtual void C_DECL  ppWarn(const TSourceLoc&, const char* szReason, const char* szToken,\n                                const char* szExtraInfoFormat, ...);\n\n    virtual void setLimits(const TBuiltInResource&) = 0;\n\n    void checkIndex(const TSourceLoc&, const TType&, int& index);\n\n    EShLanguage getLanguage() const { return language; }\n    void setScanContext(TScanContext* c) { scanContext = c; }\n    TScanContext* getScanContext() const { return scanContext; }\n    void setPpContext(TPpContext* c) { ppContext = c; }\n    TPpContext* getPpContext() const { return ppContext; }\n\n    virtual void setLineCallback(const std::function<void(int, int, bool, int, const char*)>& func) { lineCallback = func; }\n    virtual void setExtensionCallback(const std::function<void(int, const char*, const char*)>& func) { extensionCallback = func; }\n    virtual void setVersionCallback(const std::function<void(int, int, const char*)>& func) { versionCallback = func; }\n    virtual void setPragmaCallback(const std::function<void(int, const TVector<TString>&)>& func) { pragmaCallback = func; }\n    virtual void setErrorCallback(const std::function<void(int, const char*)>& func) { errorCallback = func; }\n\n    virtual void reservedPpErrorCheck(const TSourceLoc&, const char* name, const char* op) = 0;\n    virtual bool lineContinuationCheck(const TSourceLoc&, bool endOfComment) = 0;\n    virtual bool lineDirectiveShouldSetNextLine() const = 0;\n    virtual void handlePragma(const TSourceLoc&, const TVector<TString>&) = 0;\n\n    virtual bool parseShaderStrings(TPpContext&, TInputScanner& input, bool versionWillBeError = false) = 0;\n\n    virtual void notifyVersion(int line, int version, const char* type_string)\n    {\n        if (versionCallback)\n            versionCallback(line, version, type_string);\n    }\n    virtual void notifyErrorDirective(int line, const char* error_message)\n    {\n        if (errorCallback)\n            errorCallback(line, error_message);\n    }\n    virtual void notifyLineDirective(int curLineNo, int newLineNo, bool hasSource, int sourceNum, const char* sourceName)\n    {\n        if (lineCallback)\n            lineCallback(curLineNo, newLineNo, hasSource, sourceNum, sourceName);\n    }\n    virtual void notifyExtensionDirective(int line, const char* extension, const char* behavior)\n    {\n        if (extensionCallback)\n            extensionCallback(line, extension, behavior);\n    }\n\n    // Manage the global uniform block (default uniforms in GLSL, $Global in HLSL)\n    virtual void growGlobalUniformBlock(const TSourceLoc&, TType&, const TString& memberName, TTypeList* typeList = nullptr);\n\n    // Manage global buffer (used for backing atomic counters in GLSL when using relaxed Vulkan semantics)\n    virtual void growAtomicCounterBlock(int binding, const TSourceLoc&, TType&, const TString& memberName, TTypeList* typeList = nullptr);\n\n    // Potentially rename shader entry point function\n    void renameShaderFunction(TString*& name) const\n    {\n        // Replace the entry point name given in the shader with the real entry point name,\n        // if there is a substitution.\n        if (name != nullptr && *name == sourceEntryPointName && intermediate.getEntryPointName().size() > 0)\n            name = NewPoolTString(intermediate.getEntryPointName().c_str());\n    }\n\n    virtual bool lValueErrorCheck(const TSourceLoc&, const char* op, TIntermTyped*);\n    virtual void rValueErrorCheck(const TSourceLoc&, const char* op, TIntermTyped*);\n\n    const char* const scopeMangler;\n\n    // Basic parsing state, easily accessible to the grammar\n\n    TSymbolTable& symbolTable;        // symbol table that goes with the current language, version, and profile\n    TVector<TString> relaxedSymbols;\n    int statementNestingLevel;        // 0 if outside all flow control or compound statements\n    int loopNestingLevel;             // 0 if outside all loops\n    int structNestingLevel;           // 0 if outside structures\n    int blockNestingLevel;            // 0 if outside blocks\n    int controlFlowNestingLevel;      // 0 if outside all flow control\n    const TType* currentFunctionType; // the return type of the function that's currently being parsed\n    bool functionReturnsValue;        // true if a non-void function has a return\n    // if inside a function, true if the function is the entry point and this is after a return statement\n    bool postEntryPointReturn;\n    // case, node, case, case, node, ...; ensure only one node between cases;   stack of them for nesting\n    TList<TIntermSequence*> switchSequenceStack;\n    // the statementNestingLevel the current switch statement is at, which must match the level of its case statements\n    TList<int> switchLevel;\n    struct TPragma contextPragma;\n    int beginInvocationInterlockCount;\n    int endInvocationInterlockCount;\n    bool compileOnly = false;\n\nprotected:\n    TParseContextBase(TParseContextBase&);\n    TParseContextBase& operator=(TParseContextBase&);\n\n    const bool parsingBuiltins;       // true if parsing built-in symbols/functions\n    TVector<TSymbol*> linkageSymbols; // will be transferred to 'linkage', after all editing is done, order preserving\n    TScanContext* scanContext;\n    TPpContext* ppContext;\n    TBuiltInResource resources;\n    TLimits& limits;\n    TString sourceEntryPointName;\n\n    // These, if set, will be called when a line, pragma ... is preprocessed.\n    // They will be called with any parameters to the original directive.\n    std::function<void(int, int, bool, int, const char*)> lineCallback;\n    std::function<void(int, const TVector<TString>&)> pragmaCallback;\n    std::function<void(int, int, const char*)> versionCallback;\n    std::function<void(int, const char*, const char*)> extensionCallback;\n    std::function<void(int, const char*)> errorCallback;\n\n    // see implementation for detail\n    const TFunction* selectFunction(const TVector<const TFunction*>, const TFunction&,\n        std::function<bool(const TType&, const TType&, TOperator, int arg)>,\n        std::function<bool(const TType&, const TType&, const TType&)>,\n        /* output */ bool& tie);\n\n    virtual void parseSwizzleSelector(const TSourceLoc&, const TString&, int size,\n                                      TSwizzleSelectors<TVectorSelector>&);\n\n    // Manage the global uniform block (default uniforms in GLSL, $Global in HLSL)\n    TVariable* globalUniformBlock;     // the actual block, inserted into the symbol table\n    unsigned int globalUniformBinding; // the block's binding number\n    unsigned int globalUniformSet;     // the block's set number\n    int firstNewMember;                // the index of the first member not yet inserted into the symbol table\n    // override this to set the language-specific name\n    virtual const char* getGlobalUniformBlockName() const { return \"\"; }\n    virtual void setUniformBlockDefaults(TType&) const { }\n    virtual void finalizeGlobalUniformBlockLayout(TVariable&) {}\n\n    // Manage the atomic counter block (used for atomic_uints with Vulkan-Relaxed)\n    TMap<int, TVariable*> atomicCounterBuffers;\n    unsigned int atomicCounterBlockSet;\n    TMap<int, int> atomicCounterBlockFirstNewMember;\n    // override this to set the language-specific name\n    virtual const char* getAtomicCounterBlockName() const { return \"\"; }\n    virtual void setAtomicCounterBlockDefaults(TType&) const {}\n    virtual void setInvariant(const TSourceLoc&, const char*) {}\n    virtual void finalizeAtomicCounterBlockLayout(TVariable&) {}\n    bool isAtomicCounterBlock(const TSymbol& symbol) {\n        const TVariable* var = symbol.getAsVariable();\n        if (!var)\n            return false;\n        const auto& at = atomicCounterBuffers.find(var->getType().getQualifier().layoutBinding);\n        return (at != atomicCounterBuffers.end() && (*at).second->getType() == var->getType());\n    }\n\n    virtual void outputMessage(const TSourceLoc&, const char* szReason, const char* szToken,\n                               const char* szExtraInfoFormat, TPrefixType prefix,\n                               va_list args);\n    virtual void trackLinkage(TSymbol& symbol);\n    virtual void makeEditable(TSymbol*&);\n    virtual TVariable* getEditableVariable(const char* name);\n    virtual void finish();\n};\n\n//\n// Manage the state for when to respect precision qualifiers and when to warn about\n// the defaults being different than might be expected.\n//\nclass TPrecisionManager {\npublic:\n    TPrecisionManager() : obey(false), warn(false), explicitIntDefault(false), explicitFloatDefault(false){ }\n    virtual ~TPrecisionManager() {}\n\n    void respectPrecisionQualifiers() { obey = true; }\n    bool respectingPrecisionQualifiers() const { return obey; }\n    bool shouldWarnAboutDefaults() const { return warn; }\n    void defaultWarningGiven() { warn = false; }\n    void warnAboutDefaults() { warn = true; }\n    void explicitIntDefaultSeen()\n    {\n        explicitIntDefault = true;\n        if (explicitFloatDefault)\n            warn = false;\n    }\n    void explicitFloatDefaultSeen()\n    {\n        explicitFloatDefault = true;\n        if (explicitIntDefault)\n            warn = false;\n    }\n\nprotected:\n    bool obey;                  // respect precision qualifiers\n    bool warn;                  // need to give a warning about the defaults\n    bool explicitIntDefault;    // user set the default for int/uint\n    bool explicitFloatDefault;  // user set the default for float\n};\n\n//\n// GLSL-specific parse helper.  Should have GLSL in the name, but that's\n// too big of a change for comparing branches at the moment, and perhaps\n// impacts downstream consumers as well.\n//\nclass TParseContext : public TParseContextBase {\npublic:\n    TParseContext(TSymbolTable&, TIntermediate&, bool parsingBuiltins, int version, EProfile, const SpvVersion& spvVersion, EShLanguage, TInfoSink&,\n                  bool forwardCompatible = false, EShMessages messages = EShMsgDefault,\n                  const TString* entryPoint = nullptr);\n    virtual ~TParseContext();\n\n    bool obeyPrecisionQualifiers() const { return precisionManager.respectingPrecisionQualifiers(); }\n    void setPrecisionDefaults();\n\n    void setLimits(const TBuiltInResource&) override;\n    bool parseShaderStrings(TPpContext&, TInputScanner& input, bool versionWillBeError = false) override;\n    void parserError(const char* s);     // for bison's yyerror\n\n    virtual void growGlobalUniformBlock(const TSourceLoc&, TType&, const TString& memberName, TTypeList* typeList = nullptr) override;\n    virtual void growAtomicCounterBlock(int binding, const TSourceLoc&, TType&, const TString& memberName, TTypeList* typeList = nullptr) override;\n\n    void reservedErrorCheck(const TSourceLoc&, const TString&);\n    void reservedPpErrorCheck(const TSourceLoc&, const char* name, const char* op) override;\n    bool lineContinuationCheck(const TSourceLoc&, bool endOfComment) override;\n    bool lineDirectiveShouldSetNextLine() const override;\n    bool builtInName(const TString&);\n\n    void handlePragma(const TSourceLoc&, const TVector<TString>&) override;\n    TIntermTyped* handleVariable(const TSourceLoc&, TSymbol* symbol, const TString* string);\n    TIntermTyped* handleBracketDereference(const TSourceLoc&, TIntermTyped* base, TIntermTyped* index);\n    void handleIndexLimits(const TSourceLoc&, TIntermTyped* base, TIntermTyped* index);\n\n    void makeEditable(TSymbol*&) override;\n    void ioArrayCheck(const TSourceLoc&, const TType&, const TString& identifier);\n    bool isIoResizeArray(const TType&) const;\n    void fixIoArraySize(const TSourceLoc&, TType&);\n    void handleIoResizeArrayAccess(const TSourceLoc&, TIntermTyped* base);\n    void checkIoArraysConsistency(const TSourceLoc&, bool tailOnly = false);\n    int getIoArrayImplicitSize(const TQualifier&, TString* featureString = nullptr) const;\n    void checkIoArrayConsistency(const TSourceLoc&, int requiredSize, const char* feature, TType&, const TString&);\n\n    TIntermTyped* handleBinaryMath(const TSourceLoc&, const char* str, TOperator op, TIntermTyped* left, TIntermTyped* right);\n    TIntermTyped* handleUnaryMath(const TSourceLoc&, const char* str, TOperator op, TIntermTyped* childNode);\n    TIntermTyped* handleDotDereference(const TSourceLoc&, TIntermTyped* base, const TString& field);\n    TIntermTyped* handleDotSwizzle(const TSourceLoc&, TIntermTyped* base, const TString& field);\n    void blockMemberExtensionCheck(const TSourceLoc&, const TIntermTyped* base, int member, const TString& memberName);\n    TFunction* handleFunctionDeclarator(const TSourceLoc&, TFunction& function, bool prototype);\n    TIntermAggregate* handleFunctionDefinition(const TSourceLoc&, TFunction&);\n    TIntermTyped* handleFunctionCall(const TSourceLoc&, TFunction*, TIntermNode*);\n    TIntermTyped* handleBuiltInFunctionCall(TSourceLoc, TIntermNode* arguments, const TFunction& function);\n    void computeBuiltinPrecisions(TIntermTyped&, const TFunction&);\n    TIntermNode* handleReturnValue(const TSourceLoc&, TIntermTyped*);\n    void checkLocation(const TSourceLoc&, TOperator);\n    TIntermTyped* handleLengthMethod(const TSourceLoc&, TFunction*, TIntermNode*);\n    void addInputArgumentConversions(const TFunction&, TIntermNode*&) const;\n    TIntermTyped* addOutputArgumentConversions(const TFunction&, TIntermAggregate&) const;\n    TIntermTyped* addAssign(const TSourceLoc&, TOperator op, TIntermTyped* left, TIntermTyped* right);\n    void builtInOpCheck(const TSourceLoc&, const TFunction&, TIntermOperator&);\n    void nonOpBuiltInCheck(const TSourceLoc&, const TFunction&, TIntermAggregate&);\n    void userFunctionCallCheck(const TSourceLoc&, TIntermAggregate&);\n    void samplerConstructorLocationCheck(const TSourceLoc&, const char* token, TIntermNode*);\n    TFunction* handleConstructorCall(const TSourceLoc&, const TPublicType&);\n    void handlePrecisionQualifier(const TSourceLoc&, TQualifier&, TPrecisionQualifier);\n    void checkPrecisionQualifier(const TSourceLoc&, TPrecisionQualifier);\n    void memorySemanticsCheck(const TSourceLoc&, const TFunction&, const TIntermOperator& callNode);\n\n    TIntermTyped* vkRelaxedRemapFunctionCall(const TSourceLoc&, TFunction*, TIntermNode*);\n    // returns true if the variable was remapped to something else\n    bool vkRelaxedRemapUniformVariable(const TSourceLoc&, TString&, const TPublicType&, TArraySizes*, TIntermTyped*, TType&);\n    void vkRelaxedRemapUniformMembers(const TSourceLoc&, const TPublicType&, const TType&, const TString&);\n    void vkRelaxedRemapFunctionParameter(TFunction*, TParameter&, std::vector<int>* newParams = nullptr);\n    TIntermNode* vkRelaxedRemapFunctionArgument(const TSourceLoc&, TFunction*, TIntermTyped*);\n    TIntermTyped* vkRelaxedRemapDotDereference(const TSourceLoc&, TIntermTyped&, const TType&, const TString&);\n\n    void assignError(const TSourceLoc&, const char* op, TString left, TString right);\n    void unaryOpError(const TSourceLoc&, const char* op, TString operand);\n    void binaryOpError(const TSourceLoc&, const char* op, TString left, TString right);\n    void variableCheck(TIntermTyped*& nodePtr);\n    bool lValueErrorCheck(const TSourceLoc&, const char* op, TIntermTyped*) override;\n    void rValueErrorCheck(const TSourceLoc&, const char* op, TIntermTyped*) override;\n    void constantValueCheck(TIntermTyped* node, const char* token);\n    void integerCheck(const TIntermTyped* node, const char* token);\n    void globalCheck(const TSourceLoc&, const char* token);\n    bool constructorError(const TSourceLoc&, TIntermNode*, TFunction&, TOperator, TType&);\n    bool constructorTextureSamplerError(const TSourceLoc&, const TFunction&);\n    void arraySizeCheck(const TSourceLoc&, TIntermTyped* expr, TArraySize&, const char *sizeType, const bool isTypeParameter = false);\n    bool arrayQualifierError(const TSourceLoc&, const TQualifier&);\n    bool arrayError(const TSourceLoc&, const TType&);\n    void arraySizeRequiredCheck(const TSourceLoc&, const TArraySizes&);\n    void structArrayCheck(const TSourceLoc&, const TType& structure);\n    void arraySizesCheck(const TSourceLoc&, const TQualifier&, TArraySizes*, const TIntermTyped* initializer, bool lastMember);\n    void arrayOfArrayVersionCheck(const TSourceLoc&, const TArraySizes*);\n    bool voidErrorCheck(const TSourceLoc&, const TString&, TBasicType);\n    void boolCheck(const TSourceLoc&, const TIntermTyped*);\n    void boolCheck(const TSourceLoc&, const TPublicType&);\n    void samplerCheck(const TSourceLoc&, const TType&, const TString& identifier, TIntermTyped* initializer);\n    void atomicUintCheck(const TSourceLoc&, const TType&, const TString& identifier);\n    void accStructCheck(const TSourceLoc & loc, const TType & type, const TString & identifier);\n    void hitObjectNVCheck(const TSourceLoc & loc, const TType & type, const TString & identifier);\n    void transparentOpaqueCheck(const TSourceLoc&, const TType&, const TString& identifier);\n    void memberQualifierCheck(glslang::TPublicType&);\n    void globalQualifierFixCheck(const TSourceLoc&, TQualifier&, bool isMemberCheck = false, const TPublicType* publicType = nullptr);\n    void globalQualifierTypeCheck(const TSourceLoc&, const TQualifier&, const TPublicType&);\n    bool structQualifierErrorCheck(const TSourceLoc&, const TPublicType& pType);\n    void mergeQualifiers(const TSourceLoc&, TQualifier& dst, const TQualifier& src, bool force);\n    void setDefaultPrecision(const TSourceLoc&, TPublicType&, TPrecisionQualifier);\n    int computeSamplerTypeIndex(TSampler&);\n    TPrecisionQualifier getDefaultPrecision(TPublicType&);\n    void precisionQualifierCheck(const TSourceLoc&, TBasicType, TQualifier&, bool isCoopMatOrVec);\n    void parameterTypeCheck(const TSourceLoc&, TStorageQualifier qualifier, const TType& type);\n    bool containsFieldWithBasicType(const TType& type ,TBasicType basicType);\n    TSymbol* redeclareBuiltinVariable(const TSourceLoc&, const TString&, const TQualifier&, const TShaderQualifiers&);\n    void redeclareBuiltinBlock(const TSourceLoc&, TTypeList& typeList, const TString& blockName, const TString* instanceName, TArraySizes* arraySizes);\n    void paramCheckFixStorage(const TSourceLoc&, const TStorageQualifier&, TType& type);\n    void paramCheckFix(const TSourceLoc&, const TQualifier&, TType& type);\n    void nestedBlockCheck(const TSourceLoc&);\n    void nestedStructCheck(const TSourceLoc&);\n    void arrayObjectCheck(const TSourceLoc&, const TType&, const char* op);\n    void opaqueCheck(const TSourceLoc&, const TType&, const char* op);\n    void referenceCheck(const TSourceLoc&, const TType&, const char* op);\n    void storage16BitAssignmentCheck(const TSourceLoc&, const TType&, const char* op);\n    void specializationCheck(const TSourceLoc&, const TType&, const char* op);\n    void structTypeCheck(const TSourceLoc&, TPublicType&);\n    void inductiveLoopCheck(const TSourceLoc&, TIntermNode* init, TIntermLoop* loop);\n    void arrayLimitCheck(const TSourceLoc&, const TString&, int size);\n    void limitCheck(const TSourceLoc&, int value, const char* limit, const char* feature);\n    void typeParametersCheck(const TSourceLoc&, const TPublicType&);\n\n    void inductiveLoopBodyCheck(TIntermNode*, long long loopIndexId, TSymbolTable&);\n    void constantIndexExpressionCheck(TIntermNode*);\n\n    void setLayoutQualifier(const TSourceLoc&, TPublicType&, TString&);\n    void setLayoutQualifier(const TSourceLoc&, TPublicType&, TString&, const TIntermTyped*);\n    void mergeObjectLayoutQualifiers(TQualifier& dest, const TQualifier& src, bool inheritOnly);\n    void layoutObjectCheck(const TSourceLoc&, const TSymbol&);\n    void layoutMemberLocationArrayCheck(const TSourceLoc&, bool memberWithLocation, TArraySizes* arraySizes);\n    void layoutTypeCheck(const TSourceLoc&, const TType&);\n    void layoutQualifierCheck(const TSourceLoc&, const TQualifier&);\n    void checkNoShaderLayouts(const TSourceLoc&, const TShaderQualifiers&);\n    void fixOffset(const TSourceLoc&, TSymbol&);\n\n    const TFunction* findFunction(const TSourceLoc& loc, const TFunction& call, bool& builtIn);\n    const TFunction* findFunctionExact(const TSourceLoc& loc, const TFunction& call, bool& builtIn);\n    const TFunction* findFunction120(const TSourceLoc& loc, const TFunction& call, bool& builtIn);\n    const TFunction* findFunction400(const TSourceLoc& loc, const TFunction& call, bool& builtIn);\n    const TFunction* findFunctionExplicitTypes(const TSourceLoc& loc, const TFunction& call, bool& builtIn);\n    void declareTypeDefaults(const TSourceLoc&, const TPublicType&);\n    TIntermNode* declareVariable(const TSourceLoc&, TString& identifier, const TPublicType&, TArraySizes* typeArray = nullptr, TIntermTyped* initializer = nullptr);\n    TIntermTyped* addConstructor(const TSourceLoc&, TIntermNode*, const TType&);\n    TIntermTyped* constructAggregate(TIntermNode*, const TType&, int, const TSourceLoc&);\n    TIntermTyped* constructBuiltIn(const TType&, TOperator, TIntermTyped*, const TSourceLoc&, bool subset);\n    void inheritMemoryQualifiers(const TQualifier& from, TQualifier& to);\n    void declareBlock(const TSourceLoc&, TTypeList& typeList, const TString* instanceName = nullptr, TArraySizes* arraySizes = nullptr);\n    void blockStorageRemap(const TSourceLoc&, const TString*, TQualifier&);\n    void blockStageIoCheck(const TSourceLoc&, const TQualifier&);\n    void blockQualifierCheck(const TSourceLoc&, const TQualifier&, bool instanceName);\n    void fixBlockLocations(const TSourceLoc&, TQualifier&, TTypeList&, bool memberWithLocation, bool memberWithoutLocation);\n    void fixXfbOffsets(TQualifier&, TTypeList&);\n    void fixBlockUniformOffsets(TQualifier&, TTypeList&);\n    void fixBlockUniformLayoutMatrix(TQualifier&, TTypeList*, TTypeList*);\n    void fixBlockUniformLayoutPacking(TQualifier&, TTypeList*, TTypeList*);\n    void addQualifierToExisting(const TSourceLoc&, TQualifier, const TString& identifier);\n    void addQualifierToExisting(const TSourceLoc&, TQualifier, TIdentifierList&);\n    void invariantCheck(const TSourceLoc&, const TQualifier&);\n    void updateStandaloneQualifierDefaults(const TSourceLoc&, const TPublicType&);\n    void updateBindlessQualifier(TType& memberType);\n    void wrapupSwitchSubsequence(TIntermAggregate* statements, TIntermNode* branchNode);\n    TIntermNode* addSwitch(const TSourceLoc&, TIntermTyped* expression, TIntermAggregate* body);\n    const TTypeList* recordStructCopy(TStructRecord&, const TType*, const TType*);\n    TLayoutFormat mapLegacyLayoutFormat(TLayoutFormat legacyLayoutFormat, TBasicType imageType);\n\n    TAttributeType attributeFromName(const TString& name) const;\n    TAttributes* makeAttributes(const TString& identifier) const;\n    TAttributes* makeAttributes(const TString& identifier, TIntermNode* node) const;\n    TAttributes* mergeAttributes(TAttributes*, TAttributes*) const;\n\n    // Determine selection control from attributes\n    void handleSelectionAttributes(const TAttributes& attributes, TIntermNode*);\n    void handleSwitchAttributes(const TAttributes& attributes, TIntermNode*);\n    // Determine loop control from attributes\n    void handleLoopAttributes(const TAttributes& attributes, TIntermNode*);\n    // Function attributes\n    void handleFunctionAttributes(const TSourceLoc&, const TAttributes&);\n\n    // GL_EXT_spirv_intrinsics\n    TSpirvRequirement* makeSpirvRequirement(const TSourceLoc& loc, const TString& name,\n                                            const TIntermAggregate* extensions, const TIntermAggregate* capabilities);\n    TSpirvRequirement* mergeSpirvRequirements(const TSourceLoc& loc, TSpirvRequirement* spirvReq1,\n                                                TSpirvRequirement* spirvReq2);\n    TSpirvTypeParameters* makeSpirvTypeParameters(const TSourceLoc& loc, const TIntermConstantUnion* constant);\n    TSpirvTypeParameters* makeSpirvTypeParameters(const TSourceLoc& loc, const TPublicType& type);\n    TSpirvTypeParameters* mergeSpirvTypeParameters(TSpirvTypeParameters* spirvTypeParams1,\n                                                   TSpirvTypeParameters* spirvTypeParams2);\n    TSpirvInstruction* makeSpirvInstruction(const TSourceLoc& loc, const TString& name, const TString& value);\n    TSpirvInstruction* makeSpirvInstruction(const TSourceLoc& loc, const TString& name, int value);\n    TSpirvInstruction* mergeSpirvInstruction(const TSourceLoc& loc, TSpirvInstruction* spirvInst1,\n                                             TSpirvInstruction* spirvInst2);\n    void checkAndResizeMeshViewDim(const TSourceLoc&, TType&, bool isBlockMember);\n\nprotected:\n    void nonInitConstCheck(const TSourceLoc&, TString& identifier, TType& type);\n    void inheritGlobalDefaults(TQualifier& dst) const;\n    TVariable* makeInternalVariable(const char* name, const TType&) const;\n    TVariable* declareNonArray(const TSourceLoc&, const TString& identifier, const TType&);\n    void declareArray(const TSourceLoc&, const TString& identifier, const TType&, TSymbol*&);\n    void checkRuntimeSizable(const TSourceLoc&, const TIntermTyped&);\n    bool isRuntimeLength(const TIntermTyped&) const;\n    TIntermNode* executeInitializer(const TSourceLoc&, TIntermTyped* initializer, TVariable* variable);\n    TIntermTyped* convertInitializerList(const TSourceLoc&, const TType&, TIntermTyped* initializer);\n    void finish() override;\n    void handleCoopMat2FunctionCall(const TSourceLoc& loc, const TFunction* fnCandidate, TIntermTyped* result, TIntermNode* arguments);\n\n    virtual const char* getGlobalUniformBlockName() const override;\n    virtual void finalizeGlobalUniformBlockLayout(TVariable&) override;\n    virtual void setUniformBlockDefaults(TType& block) const override;\n\n    virtual const char* getAtomicCounterBlockName() const override;\n    virtual void finalizeAtomicCounterBlockLayout(TVariable&) override;\n    virtual void setAtomicCounterBlockDefaults(TType& block) const override;\n    virtual void setInvariant(const TSourceLoc& loc, const char* builtin) override;\n\npublic:\n    //\n    // Generally, bison productions, the scanner, and the PP need read/write access to these; just give them direct access\n    //\n\n    // Current state of parsing\n    bool inMain;                 // if inside a function, true if the function is main\n    const TString* blockName;\n    TQualifier currentBlockQualifier;\n    TPrecisionQualifier defaultPrecision[EbtNumTypes];\n    TBuiltInResource resources;\n    TLimits& limits;\n\nprotected:\n    TParseContext(TParseContext&);\n    TParseContext& operator=(TParseContext&);\n\n    static const int maxSamplerIndex = EsdNumDims * (EbtNumTypes * (2 * 2 * 2 * 2 * 2)); // see computeSamplerTypeIndex()\n    TPrecisionQualifier defaultSamplerPrecision[maxSamplerIndex];\n    TPrecisionManager precisionManager;\n    TQualifier globalBufferDefaults;\n    TQualifier globalUniformDefaults;\n    TQualifier globalInputDefaults;\n    TQualifier globalOutputDefaults;\n    TQualifier globalSharedDefaults;\n    TString currentCaller;        // name of last function body entered (not valid when at global scope)\n    int* atomicUintOffsets;       // to become an array of the right size to hold an offset per binding point\n    bool anyIndexLimits;\n    TIdSetType inductiveLoopIds;\n    TVector<TIntermTyped*> needsIndexLimitationChecking;\n    TStructRecord matrixFixRecord;\n    TStructRecord packingFixRecord;\n\n    //\n    // Geometry shader input arrays:\n    //  - array sizing is based on input primitive and/or explicit size\n    //\n    // Tessellation control output arrays:\n    //  - array sizing is based on output layout(vertices=...) and/or explicit size\n    //\n    // Both:\n    //  - array sizing is retroactive\n    //  - built-in block redeclarations interact with this\n    //\n    // Design:\n    //  - use a per-context \"resize-list\", a list of symbols whose array sizes\n    //    can be fixed\n    //\n    //  - the resize-list starts empty at beginning of user-shader compilation, it does\n    //    not have built-ins in it\n    //\n    //  - on built-in array use: copyUp() symbol and add it to the resize-list\n    //\n    //  - on user array declaration: add it to the resize-list\n    //\n    //  - on block redeclaration: copyUp() symbol and add it to the resize-list\n    //     * note, that appropriately gives an error if redeclaring a block that\n    //       was already used and hence already copied-up\n    //\n    //  - on seeing a layout declaration that sizes the array, fix everything in the\n    //    resize-list, giving errors for mismatch\n    //\n    //  - on seeing an array size declaration, give errors on mismatch between it and previous\n    //    array-sizing declarations\n    //\n    TVector<TSymbol*> ioArraySymbolResizeList;\n};\n\n} // end namespace glslang\n\n#endif // _PARSER_HELPER_INCLUDED_\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/PoolAlloc.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#include \"../Include/Common.h\"\n#include \"../Include/PoolAlloc.h\"\n\n// Mostly here for target that do not support threads such as WASI.\n#ifdef DISABLE_THREAD_SUPPORT\n#define THREAD_LOCAL \n#else\n#define THREAD_LOCAL thread_local\n#endif\n\nnamespace glslang {\n\nnamespace {\nTHREAD_LOCAL TPoolAllocator* threadPoolAllocator = nullptr;\n\nTPoolAllocator* GetDefaultThreadPoolAllocator()\n{\n    THREAD_LOCAL TPoolAllocator defaultAllocator;\n    return &defaultAllocator;\n}\n} // anonymous namespace\n\n// Return the thread-specific current pool.\nTPoolAllocator& GetThreadPoolAllocator()\n{\n    return *(threadPoolAllocator ? threadPoolAllocator : GetDefaultThreadPoolAllocator());\n}\n\n// Set the thread-specific current pool.\nvoid SetThreadPoolAllocator(TPoolAllocator* poolAllocator)\n{\n    threadPoolAllocator = poolAllocator;\n}\n\n//\n// Implement the functionality of the TPoolAllocator class, which\n// is documented in PoolAlloc.h.\n//\nTPoolAllocator::TPoolAllocator(int growthIncrement, int allocationAlignment) :\n    pageSize(growthIncrement),\n    alignment(allocationAlignment),\n    freeList(nullptr),\n    inUseList(nullptr),\n    numCalls(0)\n{\n    //\n    // Don't allow page sizes we know are smaller than all common\n    // OS page sizes.\n    //\n    if (pageSize < 4*1024)\n        pageSize = 4*1024;\n\n    //\n    // A large currentPageOffset indicates a new page needs to\n    // be obtained to allocate memory.\n    //\n    currentPageOffset = pageSize;\n\n    //\n    // Adjust alignment to be at least pointer aligned and\n    // power of 2.\n    //\n    size_t minAlign = sizeof(void*);\n    alignment &= ~(minAlign - 1);\n    if (alignment < minAlign)\n        alignment = minAlign;\n    size_t a = 1;\n    while (a < alignment)\n        a <<= 1;\n    alignment = a;\n    alignmentMask = a - 1;\n\n    //\n    // Align header skip\n    //\n    headerSkip = minAlign;\n    if (headerSkip < sizeof(tHeader)) {\n        headerSkip = (sizeof(tHeader) + alignmentMask) & ~alignmentMask;\n    }\n\n    push();\n}\n\nTPoolAllocator::~TPoolAllocator()\n{\n    while (inUseList) {\n        tHeader* next = inUseList->nextPage;\n        inUseList->~tHeader();\n        delete [] reinterpret_cast<char*>(inUseList);\n        inUseList = next;\n    }\n\n    //\n    // Always delete the free list memory - it can't be being\n    // (correctly) referenced, whether the pool allocator was\n    // global or not.  We should not check the guard blocks\n    // here, because we did it already when the block was\n    // placed into the free list.\n    //\n    while (freeList) {\n        tHeader* next = freeList->nextPage;\n        delete [] reinterpret_cast<char*>(freeList);\n        freeList = next;\n    }\n}\n\n//\n// Check a single guard block for damage\n//\n#ifdef GUARD_BLOCKS\nvoid TAllocation::checkGuardBlock(unsigned char* blockMem, unsigned char val, const char* locText) const\n#else\nvoid TAllocation::checkGuardBlock(unsigned char*, unsigned char, const char*) const\n#endif\n{\n#ifdef GUARD_BLOCKS\n    for (size_t x = 0; x < guardBlockSize; x++) {\n        if (blockMem[x] != val) {\n            const int maxSize = 80;\n            char assertMsg[maxSize];\n\n            // We don't print the assert message.  It's here just to be helpful.\n            snprintf(assertMsg, maxSize, \"PoolAlloc: Damage %s %zu byte allocation at 0x%p\\n\",\n                      locText, size, data());\n            assert(0 && \"PoolAlloc: Damage in guard block\");\n        }\n    }\n#else\n    assert(guardBlockSize == 0);\n#endif\n}\n\nvoid TPoolAllocator::push()\n{\n    tAllocState state = { currentPageOffset, inUseList };\n\n    stack.push_back(state);\n\n    //\n    // Indicate there is no current page to allocate from.\n    //\n    currentPageOffset = pageSize;\n}\n\n//\n// Do a mass-deallocation of all the individual allocations\n// that have occurred since the last push(), or since the\n// last pop(), or since the object's creation.\n//\n// The deallocated pages are saved for future allocations.\n//\nvoid TPoolAllocator::pop()\n{\n    if (stack.size() < 1)\n        return;\n\n    tHeader* page = stack.back().page;\n    currentPageOffset = stack.back().offset;\n\n    while (inUseList != page) {\n        tHeader* nextInUse = inUseList->nextPage;\n        size_t pageCount = inUseList->pageCount;\n\n        // This technically ends the lifetime of the header as C++ object,\n        // but we will still control the memory and reuse it.\n        inUseList->~tHeader(); // currently, just a debug allocation checker\n\n        if (pageCount > 1) {\n            delete [] reinterpret_cast<char*>(inUseList);\n        } else {\n            inUseList->nextPage = freeList;\n            freeList = inUseList;\n        }\n        inUseList = nextInUse;\n    }\n\n    stack.pop_back();\n}\n\n//\n// Do a mass-deallocation of all the individual allocations\n// that have occurred.\n//\nvoid TPoolAllocator::popAll()\n{\n    while (stack.size() > 0)\n        pop();\n}\n\nvoid* TPoolAllocator::allocate(size_t numBytes)\n{\n    // If we are using guard blocks, all allocations are bracketed by\n    // them: [guardblock][allocation][guardblock].  numBytes is how\n    // much memory the caller asked for.  allocationSize is the total\n    // size including guard blocks.  In release build,\n    // guardBlockSize=0 and this all gets optimized away.\n    size_t allocationSize = TAllocation::allocationSize(numBytes);\n\n    //\n    // Just keep some interesting statistics.\n    //\n    ++numCalls;\n    totalBytes += numBytes;\n\n    //\n    // Do the allocation, most likely case first, for efficiency.\n    // This step could be moved to be inline sometime.\n    //\n    if (currentPageOffset + allocationSize <= pageSize) {\n        //\n        // Safe to allocate from currentPageOffset.\n        //\n        unsigned char* memory = reinterpret_cast<unsigned char*>(inUseList) + currentPageOffset;\n        currentPageOffset += allocationSize;\n        currentPageOffset = (currentPageOffset + alignmentMask) & ~alignmentMask;\n\n        return initializeAllocation(inUseList, memory, numBytes);\n    }\n\n    if (allocationSize + headerSkip > pageSize) {\n        //\n        // Do a multi-page allocation.  Don't mix these with the others.\n        // The OS is efficient and allocating and free-ing multiple pages.\n        //\n        size_t numBytesToAlloc = allocationSize + headerSkip;\n        tHeader* memory = reinterpret_cast<tHeader*>(::new char[numBytesToAlloc]);\n        if (memory == nullptr)\n            return nullptr;\n\n        // Use placement-new to initialize header\n        new(memory) tHeader(inUseList, (numBytesToAlloc + pageSize - 1) / pageSize);\n        inUseList = memory;\n\n        currentPageOffset = pageSize;  // make next allocation come from a new page\n\n        // No guard blocks for multi-page allocations (yet)\n        return reinterpret_cast<void*>(reinterpret_cast<UINT_PTR>(memory) + headerSkip);\n    }\n\n    //\n    // Need a simple page to allocate from.\n    //\n    tHeader* memory;\n    if (freeList) {\n        memory = freeList;\n        freeList = freeList->nextPage;\n    } else {\n        memory = reinterpret_cast<tHeader*>(::new char[pageSize]);\n        if (memory == nullptr)\n            return nullptr;\n    }\n\n    // Use placement-new to initialize header\n    new(memory) tHeader(inUseList, 1);\n    inUseList = memory;\n\n    unsigned char* ret = reinterpret_cast<unsigned char*>(inUseList) + headerSkip;\n    currentPageOffset = (headerSkip + allocationSize + alignmentMask) & ~alignmentMask;\n\n    return initializeAllocation(inUseList, ret, numBytes);\n}\n\n//\n// Check all allocations in a list for damage by calling check on each.\n//\nvoid TAllocation::checkAllocList() const\n{\n    for (const TAllocation* alloc = this; alloc != nullptr; alloc = alloc->prevAlloc)\n        alloc->check();\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/RemoveTree.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2013 LunarG, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#include \"../Include/intermediate.h\"\n#include \"RemoveTree.h\"\n\nnamespace glslang {\n\n//\n// Code to recursively delete the intermediate tree.\n//\nstruct TRemoveTraverser : TIntermTraverser {\n    TRemoveTraverser() : TIntermTraverser(false, false, true, false) {}\n\n    virtual void visitSymbol(TIntermSymbol* node)\n    {\n        delete node;\n    }\n\n    virtual bool visitBinary(TVisit /* visit*/ , TIntermBinary* node)\n    {\n        delete node;\n\n        return true;\n    }\n\n    virtual bool visitUnary(TVisit /* visit */, TIntermUnary* node)\n    {\n        delete node;\n\n        return true;\n    }\n\n    virtual bool visitAggregate(TVisit /* visit*/ , TIntermAggregate* node)\n    {\n        delete node;\n\n        return true;\n    }\n\n    virtual bool visitSelection(TVisit /* visit*/ , TIntermSelection* node)\n    {\n        delete node;\n\n        return true;\n    }\n\n    virtual bool visitSwitch(TVisit /* visit*/ , TIntermSwitch* node)\n    {\n        delete node;\n\n        return true;\n    }\n\n    virtual void visitConstantUnion(TIntermConstantUnion* node)\n    {\n        delete node;\n    }\n\n    virtual bool visitLoop(TVisit /* visit*/ , TIntermLoop* node)\n    {\n        delete node;\n\n        return true;\n    }\n\n    virtual bool visitBranch(TVisit /* visit*/ , TIntermBranch* node)\n    {\n        delete node;\n\n        return true;\n    }\n};\n\n//\n// Entry point.\n//\nvoid RemoveAllTreeNodes(TIntermNode* root)\n{\n    TRemoveTraverser it;\n\n    root->traverse(&it);\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/RemoveTree.h",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#pragma once\n\nnamespace glslang {\n\nvoid RemoveAllTreeNodes(TIntermNode*);\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/Scan.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2013 LunarG, Inc.\n// Copyright (C) 2017 ARM Limited.\n// Copyright (C) 2020 Google, Inc.\n// Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n//\n// GLSL scanning, leveraging the scanning done by the preprocessor.\n//\n\n#include <cstring>\n#include <unordered_map>\n#include <unordered_set>\n\n#include \"../Include/Types.h\"\n#include \"SymbolTable.h\"\n#include \"ParseHelper.h\"\n#include \"attribute.h\"\n#include \"glslang_tab.cpp.h\"\n#include \"ScanContext.h\"\n#include \"Scan.h\"\n\n// preprocessor includes\n#include \"preprocessor/PpContext.h\"\n#include \"preprocessor/PpTokens.h\"\n\n// Required to avoid missing prototype warnings for some compilers\nint yylex(YYSTYPE*, glslang::TParseContext&);\n\nnamespace glslang {\n\n// read past any white space\nvoid TInputScanner::consumeWhiteSpace(bool& foundNonSpaceTab)\n{\n    int c = peek();  // don't accidentally consume anything other than whitespace\n    while (c == ' ' || c == '\\t' || c == '\\r' || c == '\\n') {\n        if (c == '\\r' || c == '\\n')\n            foundNonSpaceTab = true;\n        get();\n        c = peek();\n    }\n}\n\n// return true if a comment was actually consumed\nbool TInputScanner::consumeComment()\n{\n    if (peek() != '/')\n        return false;\n\n    get();  // consume the '/'\n    int c = peek();\n    if (c == '/') {\n\n        // a '//' style comment\n        get();  // consume the second '/'\n        c = get();\n        do {\n            while (c != EndOfInput && c != '\\\\' && c != '\\r' && c != '\\n')\n                c = get();\n\n            if (c == EndOfInput || c == '\\r' || c == '\\n') {\n                while (c == '\\r' || c == '\\n')\n                    c = get();\n\n                // we reached the end of the comment\n                break;\n            } else {\n                // it's a '\\', so we need to keep going, after skipping what's escaped\n\n                // read the skipped character\n                c = get();\n\n                // if it's a two-character newline, skip both characters\n                if (c == '\\r' && peek() == '\\n')\n                    get();\n                c = get();\n            }\n        } while (true);\n\n        // put back the last non-comment character\n        if (c != EndOfInput)\n            unget();\n\n        return true;\n    } else if (c == '*') {\n\n        // a '/*' style comment\n        get();  // consume the '*'\n        c = get();\n        do {\n            while (c != EndOfInput && c != '*')\n                c = get();\n            if (c == '*') {\n                c = get();\n                if (c == '/')\n                    break;  // end of comment\n                // not end of comment\n            } else // end of input\n                break;\n        } while (true);\n\n        return true;\n    } else {\n        // it's not a comment, put the '/' back\n        unget();\n\n        return false;\n    }\n}\n\n// skip whitespace, then skip a comment, rinse, repeat\nvoid TInputScanner::consumeWhitespaceComment(bool& foundNonSpaceTab)\n{\n    do {\n        consumeWhiteSpace(foundNonSpaceTab);\n\n        // if not starting a comment now, then done\n        int c = peek();\n        if (c != '/' || c == EndOfInput)\n            return;\n\n        // skip potential comment\n        foundNonSpaceTab = true;\n        if (! consumeComment())\n            return;\n\n    } while (true);\n}\n\n// Returns true if there was non-white space (e.g., a comment, newline) before the #version\n// or no #version was found; otherwise, returns false.  There is no error case, it always\n// succeeds, but will leave version == 0 if no #version was found.\n//\n// Sets notFirstToken based on whether tokens (beyond white space and comments)\n// appeared before the #version.\n//\n// N.B. does not attempt to leave input in any particular known state.  The assumption\n// is that scanning will start anew, following the rules for the chosen version/profile,\n// and with a corresponding parsing context.\n//\nbool TInputScanner::scanVersion(int& version, EProfile& profile, bool& notFirstToken)\n{\n    // This function doesn't have to get all the semantics correct,\n    // just find the #version if there is a correct one present.\n    // The preprocessor will have the responsibility of getting all the semantics right.\n\n    bool versionNotFirst = false;  // means not first WRT comments and white space, nothing more\n    notFirstToken = false;         // means not first WRT to real tokens\n    version = 0;                   // means not found\n    profile = ENoProfile;\n\n    bool foundNonSpaceTab = false;\n    bool lookingInMiddle = false;\n    int c;\n    do {\n        if (lookingInMiddle) {\n            notFirstToken = true;\n            // make forward progress by finishing off the current line plus extra new lines\n            if (peek() != '\\n' && peek() != '\\r') {\n                do {\n                    c = get();\n                } while (c != EndOfInput && c != '\\n' && c != '\\r');\n            }\n            while (peek() == '\\n' || peek() == '\\r')\n                get();\n            if (peek() == EndOfInput)\n                return true;\n        }\n        lookingInMiddle = true;\n\n        // Nominal start, skipping the desktop allowed comments and white space, but tracking if\n        // something else was found for ES:\n        consumeWhitespaceComment(foundNonSpaceTab);\n        if (foundNonSpaceTab)\n            versionNotFirst = true;\n\n        // \"#\"\n        if (get() != '#') {\n            versionNotFirst = true;\n            continue;\n        }\n\n        // whitespace\n        do {\n            c = get();\n        } while (c == ' ' || c == '\\t');\n\n        // \"version\"\n        if (    c != 'v' ||\n            get() != 'e' ||\n            get() != 'r' ||\n            get() != 's' ||\n            get() != 'i' ||\n            get() != 'o' ||\n            get() != 'n') {\n            versionNotFirst = true;\n            continue;\n        }\n\n        // whitespace\n        do {\n            c = get();\n        } while (c == ' ' || c == '\\t');\n\n        // version number\n        while (c >= '0' && c <= '9') {\n            version = 10 * version + (c - '0');\n            c = get();\n        }\n        if (version == 0) {\n            versionNotFirst = true;\n            continue;\n        }\n\n        // whitespace\n        while (c == ' ' || c == '\\t')\n            c = get();\n\n        // profile\n        const int maxProfileLength = 13;  // not including any 0\n        char profileString[maxProfileLength];\n        int profileLength;\n        for (profileLength = 0; profileLength < maxProfileLength; ++profileLength) {\n            if (c == EndOfInput || c == ' ' || c == '\\t' || c == '\\n' || c == '\\r')\n                break;\n            profileString[profileLength] = (char)c;\n            c = get();\n        }\n        if (c != EndOfInput && c != ' ' && c != '\\t' && c != '\\n' && c != '\\r') {\n            versionNotFirst = true;\n            continue;\n        }\n\n        if (profileLength == 2 && strncmp(profileString, \"es\", profileLength) == 0)\n            profile = EEsProfile;\n        else if (profileLength == 4 && strncmp(profileString, \"core\", profileLength) == 0)\n            profile = ECoreProfile;\n        else if (profileLength == 13 && strncmp(profileString, \"compatibility\", profileLength) == 0)\n            profile = ECompatibilityProfile;\n\n        return versionNotFirst;\n    } while (true);\n}\n\n// Fill this in when doing glslang-level scanning, to hand back to the parser.\nclass TParserToken {\npublic:\n    explicit TParserToken(YYSTYPE& b) : sType(b) { }\n\n    YYSTYPE& sType;\nprotected:\n    TParserToken(TParserToken&);\n    TParserToken& operator=(TParserToken&);\n};\n\n} // end namespace glslang\n\n// This is the function the glslang parser (i.e., bison) calls to get its next token\nint yylex(YYSTYPE* glslangTokenDesc, glslang::TParseContext& parseContext)\n{\n    glslang::TParserToken token(*glslangTokenDesc);\n\n    return parseContext.getScanContext()->tokenize(parseContext.getPpContext(), token);\n}\n\nnamespace {\n\nstruct str_eq\n{\n    bool operator()(const char* lhs, const char* rhs) const\n    {\n        return strcmp(lhs, rhs) == 0;\n    }\n};\n\nstruct str_hash\n{\n    size_t operator()(const char* str) const\n    {\n        // djb2\n        unsigned long hash = 5381;\n        int c;\n\n        while ((c = *str++) != 0)\n            hash = ((hash << 5) + hash) + c;\n\n        return hash;\n    }\n};\n\n// A single global usable by all threads, by all versions, by all languages.\nconst std::unordered_map<const char*, int, str_hash, str_eq> KeywordMap {\n    {\"const\",CONST},\n    {\"uniform\",UNIFORM},\n    {\"tileImageEXT\",TILEIMAGEEXT},\n    {\"buffer\",BUFFER},\n    {\"in\",IN},\n    {\"out\",OUT},\n    {\"smooth\",SMOOTH},\n    {\"flat\",FLAT},\n    {\"centroid\",CENTROID},\n    {\"invariant\",INVARIANT},\n    {\"packed\",PACKED},\n    {\"resource\",RESOURCE},\n    {\"inout\",INOUT},\n    {\"struct\",STRUCT},\n    {\"break\",BREAK},\n    {\"continue\",CONTINUE},\n    {\"do\",DO},\n    {\"for\",FOR},\n    {\"while\",WHILE},\n    {\"switch\",SWITCH},\n    {\"case\",CASE},\n    {\"default\",DEFAULT},\n    {\"if\",IF},\n    {\"else\",ELSE},\n    {\"discard\",DISCARD},\n    {\"terminateInvocation\",TERMINATE_INVOCATION},\n    {\"terminateRayEXT\",TERMINATE_RAY},\n    {\"ignoreIntersectionEXT\",IGNORE_INTERSECTION},\n    {\"return\",RETURN},\n    {\"void\",VOID},\n    {\"bool\",BOOL},\n    {\"float\",FLOAT},\n    {\"int\",INT},\n    {\"bvec2\",BVEC2},\n    {\"bvec3\",BVEC3},\n    {\"bvec4\",BVEC4},\n    {\"vec2\",VEC2},\n    {\"vec3\",VEC3},\n    {\"vec4\",VEC4},\n    {\"ivec2\",IVEC2},\n    {\"ivec3\",IVEC3},\n    {\"ivec4\",IVEC4},\n    {\"mat2\",MAT2},\n    {\"mat3\",MAT3},\n    {\"mat4\",MAT4},\n    {\"true\",BOOLCONSTANT},\n    {\"false\",BOOLCONSTANT},\n    {\"layout\",LAYOUT},\n    {\"shared\",SHARED},\n    {\"highp\",HIGH_PRECISION},\n    {\"mediump\",MEDIUM_PRECISION},\n    {\"lowp\",LOW_PRECISION},\n    {\"superp\",SUPERP},\n    {\"precision\",PRECISION},\n    {\"mat2x2\",MAT2X2},\n    {\"mat2x3\",MAT2X3},\n    {\"mat2x4\",MAT2X4},\n    {\"mat3x2\",MAT3X2},\n    {\"mat3x3\",MAT3X3},\n    {\"mat3x4\",MAT3X4},\n    {\"mat4x2\",MAT4X2},\n    {\"mat4x3\",MAT4X3},\n    {\"mat4x4\",MAT4X4},\n    {\"uint\",UINT},\n    {\"uvec2\",UVEC2},\n    {\"uvec3\",UVEC3},\n    {\"uvec4\",UVEC4},\n\n    {\"nonuniformEXT\",NONUNIFORM},\n    {\"demote\",DEMOTE},\n    {\"attribute\",ATTRIBUTE},\n    {\"varying\",VARYING},\n    {\"noperspective\",NOPERSPECTIVE},\n    {\"coherent\",COHERENT},\n    {\"devicecoherent\",DEVICECOHERENT},\n    {\"queuefamilycoherent\",QUEUEFAMILYCOHERENT},\n    {\"workgroupcoherent\",WORKGROUPCOHERENT},\n    {\"subgroupcoherent\",SUBGROUPCOHERENT},\n    {\"shadercallcoherent\",SHADERCALLCOHERENT},\n    {\"nonprivate\",NONPRIVATE},\n    {\"restrict\",RESTRICT},\n    {\"readonly\",READONLY},\n    {\"writeonly\",WRITEONLY},\n    {\"atomic_uint\",ATOMIC_UINT},\n    {\"volatile\",VOLATILE},\n    {\"nontemporal\",NONTEMPORAL},\n    {\"patch\",PATCH},\n    {\"sample\",SAMPLE},\n    {\"subroutine\",SUBROUTINE},\n    {\"dmat2\",DMAT2},\n    {\"dmat3\",DMAT3},\n    {\"dmat4\",DMAT4},\n    {\"dmat2x2\",DMAT2X2},\n    {\"dmat2x3\",DMAT2X3},\n    {\"dmat2x4\",DMAT2X4},\n    {\"dmat3x2\",DMAT3X2},\n    {\"dmat3x3\",DMAT3X3},\n    {\"dmat3x4\",DMAT3X4},\n    {\"dmat4x2\",DMAT4X2},\n    {\"dmat4x3\",DMAT4X3},\n    {\"dmat4x4\",DMAT4X4},\n    {\"image1D\",IMAGE1D},\n    {\"iimage1D\",IIMAGE1D},\n    {\"uimage1D\",UIMAGE1D},\n    {\"image2D\",IMAGE2D},\n    {\"iimage2D\",IIMAGE2D},\n    {\"uimage2D\",UIMAGE2D},\n    {\"image3D\",IMAGE3D},\n    {\"iimage3D\",IIMAGE3D},\n    {\"uimage3D\",UIMAGE3D},\n    {\"image2DRect\",IMAGE2DRECT},\n    {\"iimage2DRect\",IIMAGE2DRECT},\n    {\"uimage2DRect\",UIMAGE2DRECT},\n    {\"imageCube\",IMAGECUBE},\n    {\"iimageCube\",IIMAGECUBE},\n    {\"uimageCube\",UIMAGECUBE},\n    {\"imageBuffer\",IMAGEBUFFER},\n    {\"iimageBuffer\",IIMAGEBUFFER},\n    {\"uimageBuffer\",UIMAGEBUFFER},\n    {\"image1DArray\",IMAGE1DARRAY},\n    {\"iimage1DArray\",IIMAGE1DARRAY},\n    {\"uimage1DArray\",UIMAGE1DARRAY},\n    {\"image2DArray\",IMAGE2DARRAY},\n    {\"iimage2DArray\",IIMAGE2DARRAY},\n    {\"uimage2DArray\",UIMAGE2DARRAY},\n    {\"imageCubeArray\",IMAGECUBEARRAY},\n    {\"iimageCubeArray\",IIMAGECUBEARRAY},\n    {\"uimageCubeArray\",UIMAGECUBEARRAY},\n    {\"image2DMS\",IMAGE2DMS},\n    {\"iimage2DMS\",IIMAGE2DMS},\n    {\"uimage2DMS\",UIMAGE2DMS},\n    {\"image2DMSArray\",IMAGE2DMSARRAY},\n    {\"iimage2DMSArray\",IIMAGE2DMSARRAY},\n    {\"uimage2DMSArray\",UIMAGE2DMSARRAY},\n    {\"i64image1D\",I64IMAGE1D},\n    {\"u64image1D\",U64IMAGE1D},\n    {\"i64image2D\",I64IMAGE2D},\n    {\"u64image2D\",U64IMAGE2D},\n    {\"i64image3D\",I64IMAGE3D},\n    {\"u64image3D\",U64IMAGE3D},\n    {\"i64image2DRect\",I64IMAGE2DRECT},\n    {\"u64image2DRect\",U64IMAGE2DRECT},\n    {\"i64imageCube\",I64IMAGECUBE},\n    {\"u64imageCube\",U64IMAGECUBE},\n    {\"i64imageBuffer\",I64IMAGEBUFFER},\n    {\"u64imageBuffer\",U64IMAGEBUFFER},\n    {\"i64image1DArray\",I64IMAGE1DARRAY},\n    {\"u64image1DArray\",U64IMAGE1DARRAY},\n    {\"i64image2DArray\",I64IMAGE2DARRAY},\n    {\"u64image2DArray\",U64IMAGE2DARRAY},\n    {\"i64imageCubeArray\",I64IMAGECUBEARRAY},\n    {\"u64imageCubeArray\",U64IMAGECUBEARRAY},\n    {\"i64image2DMS\",I64IMAGE2DMS},\n    {\"u64image2DMS\",U64IMAGE2DMS},\n    {\"i64image2DMSArray\",I64IMAGE2DMSARRAY},\n    {\"u64image2DMSArray\",U64IMAGE2DMSARRAY},\n    {\"double\",DOUBLE},\n    {\"dvec2\",DVEC2},\n    {\"dvec3\",DVEC3},\n    {\"dvec4\",DVEC4},\n    {\"int64_t\",INT64_T},\n    {\"uint64_t\",UINT64_T},\n    {\"i64vec2\",I64VEC2},\n    {\"i64vec3\",I64VEC3},\n    {\"i64vec4\",I64VEC4},\n    {\"u64vec2\",U64VEC2},\n    {\"u64vec3\",U64VEC3},\n    {\"u64vec4\",U64VEC4},\n\n    // GL_EXT_shader_explicit_arithmetic_types\n    {\"int8_t\",INT8_T},\n    {\"i8vec2\",I8VEC2},\n    {\"i8vec3\",I8VEC3},\n    {\"i8vec4\",I8VEC4},\n    {\"uint8_t\",UINT8_T},\n    {\"u8vec2\",U8VEC2},\n    {\"u8vec3\",U8VEC3},\n    {\"u8vec4\",U8VEC4},\n\n    {\"int16_t\",INT16_T},\n    {\"i16vec2\",I16VEC2},\n    {\"i16vec3\",I16VEC3},\n    {\"i16vec4\",I16VEC4},\n    {\"uint16_t\",UINT16_T},\n    {\"u16vec2\",U16VEC2},\n    {\"u16vec3\",U16VEC3},\n    {\"u16vec4\",U16VEC4},\n\n    {\"int32_t\",INT32_T},\n    {\"i32vec2\",I32VEC2},\n    {\"i32vec3\",I32VEC3},\n    {\"i32vec4\",I32VEC4},\n    {\"uint32_t\",UINT32_T},\n    {\"u32vec2\",U32VEC2},\n    {\"u32vec3\",U32VEC3},\n    {\"u32vec4\",U32VEC4},\n\n    {\"float16_t\",FLOAT16_T},\n    {\"f16vec2\",F16VEC2},\n    {\"f16vec3\",F16VEC3},\n    {\"f16vec4\",F16VEC4},\n    {\"f16mat2\",F16MAT2},\n    {\"f16mat3\",F16MAT3},\n    {\"f16mat4\",F16MAT4},\n    {\"f16mat2x2\",F16MAT2X2},\n    {\"f16mat2x3\",F16MAT2X3},\n    {\"f16mat2x4\",F16MAT2X4},\n    {\"f16mat3x2\",F16MAT3X2},\n    {\"f16mat3x3\",F16MAT3X3},\n    {\"f16mat3x4\",F16MAT3X4},\n    {\"f16mat4x2\",F16MAT4X2},\n    {\"f16mat4x3\",F16MAT4X3},\n    {\"f16mat4x4\",F16MAT4X4},\n\n    {\"bfloat16_t\",BFLOAT16_T},\n    {\"bf16vec2\",BF16VEC2},\n    {\"bf16vec3\",BF16VEC3},\n    {\"bf16vec4\",BF16VEC4},\n\n    {\"floate5m2_t\",FLOATE5M2_T},\n    {\"fe5m2vec2\",FE5M2VEC2},\n    {\"fe5m2vec3\",FE5M2VEC3},\n    {\"fe5m2vec4\",FE5M2VEC4},\n\n    {\"floate4m3_t\",FLOATE4M3_T},\n    {\"fe4m3vec2\",FE4M3VEC2},\n    {\"fe4m3vec3\",FE4M3VEC3},\n    {\"fe4m3vec4\",FE4M3VEC4},\n\n    {\"float32_t\",FLOAT32_T},\n    {\"f32vec2\",F32VEC2},\n    {\"f32vec3\",F32VEC3},\n    {\"f32vec4\",F32VEC4},\n    {\"f32mat2\",F32MAT2},\n    {\"f32mat3\",F32MAT3},\n    {\"f32mat4\",F32MAT4},\n    {\"f32mat2x2\",F32MAT2X2},\n    {\"f32mat2x3\",F32MAT2X3},\n    {\"f32mat2x4\",F32MAT2X4},\n    {\"f32mat3x2\",F32MAT3X2},\n    {\"f32mat3x3\",F32MAT3X3},\n    {\"f32mat3x4\",F32MAT3X4},\n    {\"f32mat4x2\",F32MAT4X2},\n    {\"f32mat4x3\",F32MAT4X3},\n    {\"f32mat4x4\",F32MAT4X4},\n    {\"float64_t\",FLOAT64_T},\n    {\"f64vec2\",F64VEC2},\n    {\"f64vec3\",F64VEC3},\n    {\"f64vec4\",F64VEC4},\n    {\"f64mat2\",F64MAT2},\n    {\"f64mat3\",F64MAT3},\n    {\"f64mat4\",F64MAT4},\n    {\"f64mat2x2\",F64MAT2X2},\n    {\"f64mat2x3\",F64MAT2X3},\n    {\"f64mat2x4\",F64MAT2X4},\n    {\"f64mat3x2\",F64MAT3X2},\n    {\"f64mat3x3\",F64MAT3X3},\n    {\"f64mat3x4\",F64MAT3X4},\n    {\"f64mat4x2\",F64MAT4X2},\n    {\"f64mat4x3\",F64MAT4X3},\n    {\"f64mat4x4\",F64MAT4X4},\n\n    // GL_EXT_spirv_intrinsics\n    {\"spirv_instruction\",SPIRV_INSTRUCTION},\n    {\"spirv_execution_mode\",SPIRV_EXECUTION_MODE},\n    {\"spirv_execution_mode_id\",SPIRV_EXECUTION_MODE_ID},\n    {\"spirv_decorate\",SPIRV_DECORATE},\n    {\"spirv_decorate_id\",SPIRV_DECORATE_ID},\n    {\"spirv_decorate_string\",SPIRV_DECORATE_STRING},\n    {\"spirv_type\",SPIRV_TYPE},\n    {\"spirv_storage_class\",SPIRV_STORAGE_CLASS},\n    {\"spirv_by_reference\",SPIRV_BY_REFERENCE},\n    {\"spirv_literal\",SPIRV_LITERAL},\n\n    {\"sampler2D\",SAMPLER2D},\n    {\"samplerCube\",SAMPLERCUBE},\n    {\"samplerCubeShadow\",SAMPLERCUBESHADOW},\n    {\"sampler2DArray\",SAMPLER2DARRAY},\n    {\"sampler2DArrayShadow\",SAMPLER2DARRAYSHADOW},\n    {\"isampler2D\",ISAMPLER2D},\n    {\"isampler3D\",ISAMPLER3D},\n    {\"isamplerCube\",ISAMPLERCUBE},\n    {\"isampler2DArray\",ISAMPLER2DARRAY},\n    {\"usampler2D\",USAMPLER2D},\n    {\"usampler3D\",USAMPLER3D},\n    {\"usamplerCube\",USAMPLERCUBE},\n    {\"usampler2DArray\",USAMPLER2DARRAY},\n    {\"sampler3D\",SAMPLER3D},\n    {\"sampler2DShadow\",SAMPLER2DSHADOW},\n\n    {\"texture2D\",TEXTURE2D},\n    {\"textureCube\",TEXTURECUBE},\n    {\"texture2DArray\",TEXTURE2DARRAY},\n    {\"itexture2D\",ITEXTURE2D},\n    {\"itexture3D\",ITEXTURE3D},\n    {\"itextureCube\",ITEXTURECUBE},\n    {\"itexture2DArray\",ITEXTURE2DARRAY},\n    {\"utexture2D\",UTEXTURE2D},\n    {\"utexture3D\",UTEXTURE3D},\n    {\"utextureCube\",UTEXTURECUBE},\n    {\"utexture2DArray\",UTEXTURE2DARRAY},\n    {\"texture3D\",TEXTURE3D},\n\n    {\"sampler\",SAMPLER},\n    {\"samplerShadow\",SAMPLERSHADOW},\n\n    {\"textureCubeArray\",TEXTURECUBEARRAY},\n    {\"itextureCubeArray\",ITEXTURECUBEARRAY},\n    {\"utextureCubeArray\",UTEXTURECUBEARRAY},\n    {\"samplerCubeArray\",SAMPLERCUBEARRAY},\n    {\"samplerCubeArrayShadow\",SAMPLERCUBEARRAYSHADOW},\n    {\"isamplerCubeArray\",ISAMPLERCUBEARRAY},\n    {\"usamplerCubeArray\",USAMPLERCUBEARRAY},\n    {\"sampler1DArrayShadow\",SAMPLER1DARRAYSHADOW},\n    {\"isampler1DArray\",ISAMPLER1DARRAY},\n    {\"usampler1D\",USAMPLER1D},\n    {\"isampler1D\",ISAMPLER1D},\n    {\"usampler1DArray\",USAMPLER1DARRAY},\n    {\"samplerBuffer\",SAMPLERBUFFER},\n    {\"isampler2DRect\",ISAMPLER2DRECT},\n    {\"usampler2DRect\",USAMPLER2DRECT},\n    {\"isamplerBuffer\",ISAMPLERBUFFER},\n    {\"usamplerBuffer\",USAMPLERBUFFER},\n    {\"sampler2DMS\",SAMPLER2DMS},\n    {\"isampler2DMS\",ISAMPLER2DMS},\n    {\"usampler2DMS\",USAMPLER2DMS},\n    {\"sampler2DMSArray\",SAMPLER2DMSARRAY},\n    {\"isampler2DMSArray\",ISAMPLER2DMSARRAY},\n    {\"usampler2DMSArray\",USAMPLER2DMSARRAY},\n    {\"sampler1D\",SAMPLER1D},\n    {\"sampler1DShadow\",SAMPLER1DSHADOW},\n    {\"sampler2DRect\",SAMPLER2DRECT},\n    {\"sampler2DRectShadow\",SAMPLER2DRECTSHADOW},\n    {\"sampler1DArray\",SAMPLER1DARRAY},\n\n    {\"samplerExternalOES\",     SAMPLEREXTERNALOES}, // GL_OES_EGL_image_external\n    {\"__samplerExternal2DY2YEXT\", SAMPLEREXTERNAL2DY2YEXT}, // GL_EXT_YUV_target\n\n    {\"itexture1DArray\",ITEXTURE1DARRAY},\n    {\"utexture1D\",UTEXTURE1D},\n    {\"itexture1D\",ITEXTURE1D},\n    {\"utexture1DArray\",UTEXTURE1DARRAY},\n    {\"textureBuffer\",TEXTUREBUFFER},\n    {\"itexture2DRect\",ITEXTURE2DRECT},\n    {\"utexture2DRect\",UTEXTURE2DRECT},\n    {\"itextureBuffer\",ITEXTUREBUFFER},\n    {\"utextureBuffer\",UTEXTUREBUFFER},\n    {\"texture2DMS\",TEXTURE2DMS},\n    {\"itexture2DMS\",ITEXTURE2DMS},\n    {\"utexture2DMS\",UTEXTURE2DMS},\n    {\"texture2DMSArray\",TEXTURE2DMSARRAY},\n    {\"itexture2DMSArray\",ITEXTURE2DMSARRAY},\n    {\"utexture2DMSArray\",UTEXTURE2DMSARRAY},\n    {\"texture1D\",TEXTURE1D},\n    {\"texture2DRect\",TEXTURE2DRECT},\n    {\"texture1DArray\",TEXTURE1DARRAY},\n\n    {\"attachmentEXT\",ATTACHMENTEXT},\n    {\"iattachmentEXT\",IATTACHMENTEXT},\n    {\"uattachmentEXT\",UATTACHMENTEXT},\n\n    {\"subpassInput\",SUBPASSINPUT},\n    {\"subpassInputMS\",SUBPASSINPUTMS},\n    {\"isubpassInput\",ISUBPASSINPUT},\n    {\"isubpassInputMS\",ISUBPASSINPUTMS},\n    {\"usubpassInput\",USUBPASSINPUT},\n    {\"usubpassInputMS\",USUBPASSINPUTMS},\n\n    {\"f16sampler1D\",F16SAMPLER1D},\n    {\"f16sampler2D\",F16SAMPLER2D},\n    {\"f16sampler3D\",F16SAMPLER3D},\n    {\"f16sampler2DRect\",F16SAMPLER2DRECT},\n    {\"f16samplerCube\",F16SAMPLERCUBE},\n    {\"f16sampler1DArray\",F16SAMPLER1DARRAY},\n    {\"f16sampler2DArray\",F16SAMPLER2DARRAY},\n    {\"f16samplerCubeArray\",F16SAMPLERCUBEARRAY},\n    {\"f16samplerBuffer\",F16SAMPLERBUFFER},\n    {\"f16sampler2DMS\",F16SAMPLER2DMS},\n    {\"f16sampler2DMSArray\",F16SAMPLER2DMSARRAY},\n    {\"f16sampler1DShadow\",F16SAMPLER1DSHADOW},\n    {\"f16sampler2DShadow\",F16SAMPLER2DSHADOW},\n    {\"f16sampler2DRectShadow\",F16SAMPLER2DRECTSHADOW},\n    {\"f16samplerCubeShadow\",F16SAMPLERCUBESHADOW},\n    {\"f16sampler1DArrayShadow\",F16SAMPLER1DARRAYSHADOW},\n    {\"f16sampler2DArrayShadow\",F16SAMPLER2DARRAYSHADOW},\n    {\"f16samplerCubeArrayShadow\",F16SAMPLERCUBEARRAYSHADOW},\n\n    {\"f16image1D\",F16IMAGE1D},\n    {\"f16image2D\",F16IMAGE2D},\n    {\"f16image3D\",F16IMAGE3D},\n    {\"f16image2DRect\",F16IMAGE2DRECT},\n    {\"f16imageCube\",F16IMAGECUBE},\n    {\"f16image1DArray\",F16IMAGE1DARRAY},\n    {\"f16image2DArray\",F16IMAGE2DARRAY},\n    {\"f16imageCubeArray\",F16IMAGECUBEARRAY},\n    {\"f16imageBuffer\",F16IMAGEBUFFER},\n    {\"f16image2DMS\",F16IMAGE2DMS},\n    {\"f16image2DMSArray\",F16IMAGE2DMSARRAY},\n\n    {\"f16texture1D\",F16TEXTURE1D},\n    {\"f16texture2D\",F16TEXTURE2D},\n    {\"f16texture3D\",F16TEXTURE3D},\n    {\"f16texture2DRect\",F16TEXTURE2DRECT},\n    {\"f16textureCube\",F16TEXTURECUBE},\n    {\"f16texture1DArray\",F16TEXTURE1DARRAY},\n    {\"f16texture2DArray\",F16TEXTURE2DARRAY},\n    {\"f16textureCubeArray\",F16TEXTURECUBEARRAY},\n    {\"f16textureBuffer\",F16TEXTUREBUFFER},\n    {\"f16texture2DMS\",F16TEXTURE2DMS},\n    {\"f16texture2DMSArray\",F16TEXTURE2DMSARRAY},\n\n    {\"f16subpassInput\",F16SUBPASSINPUT},\n    {\"f16subpassInputMS\",F16SUBPASSINPUTMS},\n    {\"__explicitInterpAMD\",EXPLICITINTERPAMD},\n    {\"pervertexNV\",PERVERTEXNV},\n    {\"pervertexEXT\",PERVERTEXEXT},\n    {\"precise\",PRECISE},\n\n    {\"rayPayloadNV\",PAYLOADNV},\n    {\"rayPayloadEXT\",PAYLOADEXT},\n    {\"rayPayloadInNV\",PAYLOADINNV},\n    {\"rayPayloadInEXT\",PAYLOADINEXT},\n    {\"hitAttributeNV\",HITATTRNV},\n    {\"hitAttributeEXT\",HITATTREXT},\n    {\"callableDataNV\",CALLDATANV},\n    {\"callableDataEXT\",CALLDATAEXT},\n    {\"callableDataInNV\",CALLDATAINNV},\n    {\"callableDataInEXT\",CALLDATAINEXT},\n    {\"accelerationStructureNV\",ACCSTRUCTNV},\n    {\"accelerationStructureEXT\",ACCSTRUCTEXT},\n    {\"rayQueryEXT\",RAYQUERYEXT},\n    {\"perprimitiveNV\",PERPRIMITIVENV},\n    {\"perviewNV\",PERVIEWNV},\n    {\"taskNV\",PERTASKNV},\n    {\"perprimitiveEXT\",PERPRIMITIVEEXT},\n    {\"taskPayloadSharedEXT\",TASKPAYLOADWORKGROUPEXT},\n\n    {\"fcoopmatNV\",FCOOPMATNV},\n    {\"icoopmatNV\",ICOOPMATNV},\n    {\"ucoopmatNV\",UCOOPMATNV},\n\n    {\"coopmat\",COOPMAT},\n\n    {\"hitObjectNV\",HITOBJECTNV},\n    {\"hitObjectAttributeNV\",HITOBJECTATTRNV},\n\n    {\"__function\",FUNCTION},\n    {\"tensorLayoutNV\",TENSORLAYOUTNV},\n    {\"tensorViewNV\",TENSORVIEWNV},\n\n    {\"coopvecNV\",COOPVECNV},\n};\nconst std::unordered_set<const char*, str_hash, str_eq> ReservedSet {\n    \"common\",\n    \"partition\",\n    \"active\",\n    \"asm\",\n    \"class\",\n    \"union\",\n    \"enum\",\n    \"typedef\",\n    \"template\",\n    \"this\",\n    \"goto\",\n    \"inline\",\n    \"noinline\",\n    \"public\",\n    \"static\",\n    \"extern\",\n    \"external\",\n    \"interface\",\n    \"long\",\n    \"short\",\n    \"half\",\n    \"fixed\",\n    \"unsigned\",\n    \"input\",\n    \"output\",\n    \"hvec2\",\n    \"hvec3\",\n    \"hvec4\",\n    \"fvec2\",\n    \"fvec3\",\n    \"fvec4\",\n    \"sampler3DRect\",\n    \"filter\",\n    \"sizeof\",\n    \"cast\",\n    \"namespace\",\n    \"using\",\n};\n\n}\n\nnamespace glslang {\n\n// Called by yylex to get the next token.\n// Returning 0 implies end of input.\nint TScanContext::tokenize(TPpContext* pp, TParserToken& token)\n{\n    do {\n        parserToken = &token;\n        TPpToken ppToken;\n        int token = pp->tokenize(ppToken);\n        if (token == EndOfInput)\n            return 0;\n\n        tokenText = ppToken.name;\n        loc = ppToken.loc;\n        parserToken->sType.lex.loc = loc;\n        switch (token) {\n        case ';':  afterType = false; afterBuffer = false; return SEMICOLON;\n        case ',':  afterType = false;   return COMMA;\n        case ':':                       return COLON;\n        case '=':  afterType = false;   return EQUAL;\n        case '(':  afterType = false;   return LEFT_PAREN;\n        case ')':  afterType = false;   return RIGHT_PAREN;\n        case '.':  field = true;        return DOT;\n        case '!':                       return BANG;\n        case '-':                       return DASH;\n        case '~':                       return TILDE;\n        case '+':                       return PLUS;\n        case '*':                       return STAR;\n        case '/':                       return SLASH;\n        case '%':                       return PERCENT;\n        case '<':                       return LEFT_ANGLE;\n        case '>':                       return RIGHT_ANGLE;\n        case '|':                       return VERTICAL_BAR;\n        case '^':                       return CARET;\n        case '&':                       return AMPERSAND;\n        case '?':                       return QUESTION;\n        case '[':                       return LEFT_BRACKET;\n        case ']':                       return RIGHT_BRACKET;\n        case '{':  afterStruct = false; afterBuffer = false; return LEFT_BRACE;\n        case '}':                       return RIGHT_BRACE;\n        case '\\\\':\n            parseContext.error(loc, \"illegal use of escape character\", \"\\\\\", \"\");\n            break;\n\n        case PPAtomAddAssign:          return ADD_ASSIGN;\n        case PPAtomSubAssign:          return SUB_ASSIGN;\n        case PPAtomMulAssign:          return MUL_ASSIGN;\n        case PPAtomDivAssign:          return DIV_ASSIGN;\n        case PPAtomModAssign:          return MOD_ASSIGN;\n\n        case PpAtomRight:              return RIGHT_OP;\n        case PpAtomLeft:               return LEFT_OP;\n\n        case PpAtomRightAssign:        return RIGHT_ASSIGN;\n        case PpAtomLeftAssign:         return LEFT_ASSIGN;\n        case PpAtomAndAssign:          return AND_ASSIGN;\n        case PpAtomOrAssign:           return OR_ASSIGN;\n        case PpAtomXorAssign:          return XOR_ASSIGN;\n\n        case PpAtomAnd:                return AND_OP;\n        case PpAtomOr:                 return OR_OP;\n        case PpAtomXor:                return XOR_OP;\n\n        case PpAtomEQ:                 return EQ_OP;\n        case PpAtomGE:                 return GE_OP;\n        case PpAtomNE:                 return NE_OP;\n        case PpAtomLE:                 return LE_OP;\n\n        case PpAtomDecrement:          return DEC_OP;\n        case PpAtomIncrement:          return INC_OP;\n\n        case PpAtomColonColon:\n            parseContext.error(loc, \"not supported\", \"::\", \"\");\n            break;\n\n        case PpAtomConstString:        parserToken->sType.lex.string = NewPoolTString(tokenText);     return STRING_LITERAL;\n        case PpAtomConstInt:           parserToken->sType.lex.i    = ppToken.ival;       return INTCONSTANT;\n        case PpAtomConstUint:          parserToken->sType.lex.i    = ppToken.ival;       return UINTCONSTANT;\n        case PpAtomConstFloat:         parserToken->sType.lex.d    = ppToken.dval;       return FLOATCONSTANT;\n        case PpAtomConstInt16:         parserToken->sType.lex.i    = ppToken.ival;       return INT16CONSTANT;\n        case PpAtomConstUint16:        parserToken->sType.lex.i    = ppToken.ival;       return UINT16CONSTANT;\n        case PpAtomConstInt64:         parserToken->sType.lex.i64  = ppToken.i64val;     return INT64CONSTANT;\n        case PpAtomConstUint64:        parserToken->sType.lex.i64  = ppToken.i64val;     return UINT64CONSTANT;\n        case PpAtomConstDouble:        parserToken->sType.lex.d    = ppToken.dval;       return DOUBLECONSTANT;\n        case PpAtomConstFloat16:       parserToken->sType.lex.d    = ppToken.dval;       return FLOAT16CONSTANT;\n        case PpAtomIdentifier:\n        {\n            int token = tokenizeIdentifier();\n            field = false;\n            return token;\n        }\n\n        case EndOfInput:               return 0;\n\n        default:\n            char buf[2];\n            buf[0] = (char)token;\n            buf[1] = 0;\n            parseContext.error(loc, \"unexpected token\", buf, \"\");\n            break;\n        }\n    } while (true);\n}\n\nint TScanContext::tokenizeIdentifier()\n{\n    if (ReservedSet.find(tokenText) != ReservedSet.end())\n        return reservedWord();\n\n    auto it = KeywordMap.find(tokenText);\n    if (it == KeywordMap.end()) {\n        // Should have an identifier of some sort\n        return identifierOrType();\n    }\n    keyword = it->second;\n\n    switch (keyword) {\n    case CONST:\n    case UNIFORM:\n    case TILEIMAGEEXT:\n    case IN:\n    case OUT:\n    case INOUT:\n    case BREAK:\n    case CONTINUE:\n    case DO:\n    case FOR:\n    case WHILE:\n    case IF:\n    case ELSE:\n    case DISCARD:\n    case RETURN:\n    case CASE:\n        return keyword;\n\n    case TERMINATE_INVOCATION:\n        if (!parseContext.extensionTurnedOn(E_GL_EXT_terminate_invocation))\n            return identifierOrType();\n        return keyword;\n\n    case TERMINATE_RAY:\n    case IGNORE_INTERSECTION:\n        if (!parseContext.extensionTurnedOn(E_GL_EXT_ray_tracing))\n            return identifierOrType();\n        return keyword;\n\n    case BUFFER:\n        afterBuffer = true;\n        if ((parseContext.isEsProfile() && parseContext.version < 310) ||\n            (!parseContext.isEsProfile() && (parseContext.version < 430 &&\n            !parseContext.extensionTurnedOn(E_GL_ARB_shader_storage_buffer_object))))\n            return identifierOrType();\n        return keyword;\n\n    case STRUCT:\n        afterStruct = true;\n        return keyword;\n\n    case SWITCH:\n    case DEFAULT:\n        if ((parseContext.isEsProfile() && parseContext.version < 300) ||\n            (!parseContext.isEsProfile() && parseContext.version < 130))\n            reservedWord();\n        return keyword;\n\n    case VOID:\n    case BOOL:\n    case FLOAT:\n    case INT:\n    case BVEC2:\n    case BVEC3:\n    case BVEC4:\n    case VEC2:\n    case VEC3:\n    case VEC4:\n    case IVEC2:\n    case IVEC3:\n    case IVEC4:\n    case MAT2:\n    case MAT3:\n    case MAT4:\n    case SAMPLER2D:\n    case SAMPLERCUBE:\n        afterType = true;\n        return keyword;\n\n    case BOOLCONSTANT:\n        if (strcmp(\"true\", tokenText) == 0)\n            parserToken->sType.lex.b = true;\n        else\n            parserToken->sType.lex.b = false;\n        return keyword;\n\n    case SMOOTH:\n        if ((parseContext.isEsProfile() && parseContext.version < 300) ||\n            (!parseContext.isEsProfile() && parseContext.version < 130))\n            return identifierOrType();\n        return keyword;\n    case FLAT:\n        if (parseContext.isEsProfile() && parseContext.version < 300)\n            reservedWord();\n        else if (!parseContext.isEsProfile() && parseContext.version < 130)\n            return identifierOrType();\n        return keyword;\n    case CENTROID:\n        if (parseContext.version < 120)\n            return identifierOrType();\n        return keyword;\n    case INVARIANT:\n        if (!parseContext.isEsProfile() && parseContext.version < 120)\n            return identifierOrType();\n        return keyword;\n    case PACKED:\n        if ((parseContext.isEsProfile() && parseContext.version < 300) ||\n            (!parseContext.isEsProfile() && parseContext.version < 140))\n            return reservedWord();\n        return identifierOrType();\n\n    case RESOURCE:\n    {\n        bool reserved = (parseContext.isEsProfile() && parseContext.version >= 300) ||\n                        (!parseContext.isEsProfile() && parseContext.version >= 420);\n        return identifierOrReserved(reserved);\n    }\n    case SUPERP:\n    {\n        bool reserved = parseContext.isEsProfile() || parseContext.version >= 130;\n        return identifierOrReserved(reserved);\n    }\n\n    case NOPERSPECTIVE:\n        if (parseContext.extensionTurnedOn(E_GL_NV_shader_noperspective_interpolation))\n            return keyword;\n        return es30ReservedFromGLSL(130);\n\n    case NONUNIFORM:\n        if (parseContext.extensionTurnedOn(E_GL_EXT_nonuniform_qualifier))\n            return keyword;\n        else\n            return identifierOrType();\n    case ATTRIBUTE:\n    case VARYING:\n        if (parseContext.isEsProfile() && parseContext.version >= 300)\n            reservedWord();\n        return keyword;\n    case PAYLOADNV:\n    case PAYLOADINNV:\n    case HITATTRNV:\n    case CALLDATANV:\n    case CALLDATAINNV:\n    case ACCSTRUCTNV:\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_NV_ray_tracing))\n            return keyword;\n        return identifierOrType();\n    case ACCSTRUCTEXT:\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_EXT_ray_tracing) ||\n            parseContext.extensionTurnedOn(E_GL_EXT_ray_query) ||\n            parseContext.extensionTurnedOn(E_GL_NV_displacement_micromap))\n            return keyword;\n        return identifierOrType();\n    case PAYLOADEXT:\n    case PAYLOADINEXT:\n    case HITATTREXT:\n    case CALLDATAEXT:\n    case CALLDATAINEXT:\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_EXT_ray_tracing) ||\n            parseContext.extensionTurnedOn(E_GL_EXT_ray_query))\n            return keyword;\n        return identifierOrType();\n    case RAYQUERYEXT:\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            (!parseContext.isEsProfile() && parseContext.version >= 460\n                 && parseContext.extensionTurnedOn(E_GL_EXT_ray_query)))\n            return keyword;\n        return identifierOrType();\n    case ATOMIC_UINT:\n        if ((parseContext.isEsProfile() && parseContext.version >= 310) ||\n            parseContext.extensionTurnedOn(E_GL_ARB_shader_atomic_counters))\n            return keyword;\n        return es30ReservedFromGLSL(420);\n\n    case COHERENT:\n    case DEVICECOHERENT:\n    case QUEUEFAMILYCOHERENT:\n    case WORKGROUPCOHERENT:\n    case SUBGROUPCOHERENT:\n    case SHADERCALLCOHERENT:\n    case NONPRIVATE:\n    case RESTRICT:\n    case READONLY:\n    case WRITEONLY:\n        if (parseContext.isEsProfile() && parseContext.version >= 310)\n            return keyword;\n        return es30ReservedFromGLSL(parseContext.extensionTurnedOn(E_GL_ARB_shader_image_load_store) ? 130 : 420);\n    case VOLATILE:\n        if (parseContext.isEsProfile() && parseContext.version >= 310)\n            return keyword;\n        if (! parseContext.symbolTable.atBuiltInLevel() && (parseContext.isEsProfile() ||\n            (parseContext.version < 420 && ! parseContext.extensionTurnedOn(E_GL_ARB_shader_image_load_store))))\n            reservedWord();\n        return keyword;\n    case NONTEMPORAL:\n        if (parseContext.symbolTable.atBuiltInLevel())\n            return keyword;\n        if (parseContext.extensionTurnedOn(E_GL_EXT_nontemporal_keyword)) {\n            if (!parseContext.intermediate.usingVulkanMemoryModel())\n                parseContext.warn(loc, \"Nontemporal without the Vulkan Memory Model is ignored\", tokenText, \"\");\n            return keyword;\n        }\n        return identifierOrType();\n    case PATCH:\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            (parseContext.isEsProfile() &&\n             (parseContext.version >= 320 ||\n              parseContext.extensionsTurnedOn(Num_AEP_tessellation_shader, AEP_tessellation_shader))) ||\n            (!parseContext.isEsProfile() && parseContext.extensionTurnedOn(E_GL_ARB_tessellation_shader)))\n            return keyword;\n\n        return es30ReservedFromGLSL(400);\n\n    case SAMPLE: \n    {\n        const int numLayoutExts = 3;\n        const char* layoutExts[numLayoutExts] = {E_GL_OES_shader_multisample_interpolation, E_GL_ARB_gpu_shader5,\n                                                 E_GL_NV_gpu_shader5};\n        if ((parseContext.isEsProfile() && parseContext.version >= 320) ||\n            parseContext.extensionsTurnedOn(numLayoutExts, layoutExts))\n            return keyword;\n        return es30ReservedFromGLSL(400);\n    }\n    case SUBROUTINE:\n        return es30ReservedFromGLSL(400);\n\n    case SHARED:\n        if ((parseContext.isEsProfile() && parseContext.version < 300) ||\n            (!parseContext.isEsProfile() && parseContext.version < 140))\n            return identifierOrType();\n        return keyword;\n    case LAYOUT:\n    {\n        const int numLayoutExts = 2;\n        const char* layoutExts[numLayoutExts] = { E_GL_ARB_shading_language_420pack,\n                                                  E_GL_ARB_explicit_attrib_location };\n        if ((parseContext.isEsProfile() && parseContext.version < 300) ||\n            (!parseContext.isEsProfile() && parseContext.version < 140 &&\n            ! parseContext.extensionsTurnedOn(numLayoutExts, layoutExts)))\n            return identifierOrType();\n        return keyword;\n    }\n\n    case HIGH_PRECISION:\n    case MEDIUM_PRECISION:\n    case LOW_PRECISION:\n    case PRECISION:\n        return precisionKeyword();\n\n    case MAT2X2:\n    case MAT2X3:\n    case MAT2X4:\n    case MAT3X2:\n    case MAT3X3:\n    case MAT3X4:\n    case MAT4X2:\n    case MAT4X3:\n    case MAT4X4:\n        return matNxM();\n\n    case DMAT2:\n    case DMAT3:\n    case DMAT4:\n    case DMAT2X2:\n    case DMAT2X3:\n    case DMAT2X4:\n    case DMAT3X2:\n    case DMAT3X3:\n    case DMAT3X4:\n    case DMAT4X2:\n    case DMAT4X3:\n    case DMAT4X4:\n        return dMat();\n\n    case IMAGE1D:\n    case IIMAGE1D:\n    case UIMAGE1D:\n    case IMAGE1DARRAY:\n    case IIMAGE1DARRAY:\n    case UIMAGE1DARRAY:\n    case IMAGE2DRECT:\n    case IIMAGE2DRECT:\n    case UIMAGE2DRECT:\n        afterType = true;\n        return firstGenerationImage(false);\n\n    case I64IMAGE1D:\n    case U64IMAGE1D:\n    case I64IMAGE1DARRAY:\n    case U64IMAGE1DARRAY:\n    case I64IMAGE2DRECT:\n    case U64IMAGE2DRECT:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_image_int64)) {\n            return firstGenerationImage(false);\n        }\n        return identifierOrType();\n\n    case IMAGEBUFFER:\n    case IIMAGEBUFFER:\n    case UIMAGEBUFFER:\n        afterType = true;\n        if ((parseContext.isEsProfile() && parseContext.version >= 320) ||\n            parseContext.extensionsTurnedOn(Num_AEP_texture_buffer, AEP_texture_buffer))\n            return keyword;\n        return firstGenerationImage(false);\n        \n    case I64IMAGEBUFFER:\n    case U64IMAGEBUFFER:\n        afterType = true;        \n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_image_int64)) {\n            if ((parseContext.isEsProfile() && parseContext.version >= 320) ||\n                parseContext.extensionsTurnedOn(Num_AEP_texture_buffer, AEP_texture_buffer))\n                return keyword;\n            return firstGenerationImage(false);\n        }\n        return identifierOrType();\n\n    case IMAGE2D:\n    case IIMAGE2D:\n    case UIMAGE2D:\n    case IMAGE3D:\n    case IIMAGE3D:\n    case UIMAGE3D:\n    case IMAGECUBE:\n    case IIMAGECUBE:\n    case UIMAGECUBE:\n    case IMAGE2DARRAY:\n    case IIMAGE2DARRAY:\n    case UIMAGE2DARRAY:\n        afterType = true;\n        return firstGenerationImage(true);\n\n    case I64IMAGE2D:\n    case U64IMAGE2D:\n    case I64IMAGE3D:\n    case U64IMAGE3D:\n    case I64IMAGECUBE:\n    case U64IMAGECUBE:\n    case I64IMAGE2DARRAY:\n    case U64IMAGE2DARRAY:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_image_int64))\n            return firstGenerationImage(true);\n        return identifierOrType();\n        \n    case IMAGECUBEARRAY:\n    case IIMAGECUBEARRAY:\n    case UIMAGECUBEARRAY:\n        afterType = true;\n        if ((parseContext.isEsProfile() && parseContext.version >= 320) ||\n            parseContext.extensionsTurnedOn(Num_AEP_texture_cube_map_array, AEP_texture_cube_map_array))\n            return keyword;\n        return secondGenerationImage();\n        \n    case I64IMAGECUBEARRAY:\n    case U64IMAGECUBEARRAY:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_image_int64)) {\n            if ((parseContext.isEsProfile() && parseContext.version >= 320) ||\n                parseContext.extensionsTurnedOn(Num_AEP_texture_cube_map_array, AEP_texture_cube_map_array))\n                return keyword;\n            return secondGenerationImage();\n        }\n        return identifierOrType();\n\n    case IMAGE2DMS:\n    case IIMAGE2DMS:\n    case UIMAGE2DMS:\n    case IMAGE2DMSARRAY:\n    case IIMAGE2DMSARRAY:\n    case UIMAGE2DMSARRAY:\n        afterType = true;\n        return secondGenerationImage();\n        \n    case I64IMAGE2DMS:\n    case U64IMAGE2DMS:\n    case I64IMAGE2DMSARRAY:\n    case U64IMAGE2DMSARRAY:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_image_int64)) {\n            return secondGenerationImage();\n        }\n        return identifierOrType();\n\n    case DOUBLE:\n    case DVEC2:\n    case DVEC3:\n    case DVEC4:\n        afterType = true;\n        if (parseContext.isEsProfile() || parseContext.version < 150 ||\n            (!parseContext.symbolTable.atBuiltInLevel() &&\n              (parseContext.version < 400 && !parseContext.extensionTurnedOn(E_GL_ARB_gpu_shader_fp64) &&\n              (parseContext.version < 410 && !parseContext.extensionTurnedOn(E_GL_ARB_vertex_attrib_64bit)))))\n            reservedWord();\n        return keyword;\n\n    case INT64_T:\n    case UINT64_T:\n    case I64VEC2:\n    case I64VEC3:\n    case I64VEC4:\n    case U64VEC2:\n    case U64VEC3:\n    case U64VEC4:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_ARB_gpu_shader_int64) ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types) ||\n            parseContext.extensionTurnedOn(E_GL_NV_gpu_shader5) ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_int64))\n            return keyword;\n        return identifierOrType();\n\n    case INT8_T:\n    case UINT8_T:\n    case I8VEC2:\n    case I8VEC3:\n    case I8VEC4:\n    case U8VEC2:\n    case U8VEC3:\n    case U8VEC4:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types) ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_8bit_storage) ||\n            parseContext.extensionTurnedOn(E_GL_NV_gpu_shader5) ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_int8))\n            return keyword;\n        return identifierOrType();\n\n    case INT16_T:\n    case UINT16_T:\n    case I16VEC2:\n    case I16VEC3:\n    case I16VEC4:\n    case U16VEC2:\n    case U16VEC3:\n    case U16VEC4:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_int16) ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_16bit_storage) ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types) ||\n            parseContext.extensionTurnedOn(E_GL_NV_gpu_shader5) ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_int16))\n            return keyword;\n        return identifierOrType();\n    case INT32_T:\n    case UINT32_T:\n    case I32VEC2:\n    case I32VEC3:\n    case I32VEC4:\n    case U32VEC2:\n    case U32VEC3:\n    case U32VEC4:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types) ||\n            parseContext.extensionTurnedOn(E_GL_NV_gpu_shader5) ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_int32))\n            return keyword;\n        return identifierOrType();\n    case FLOAT32_T:\n    case F32VEC2:\n    case F32VEC3:\n    case F32VEC4:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types) ||\n            parseContext.extensionTurnedOn(E_GL_NV_gpu_shader5) ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_float32))\n            return keyword;\n        return identifierOrType();\n    case F32MAT2:\n    case F32MAT3:\n    case F32MAT4:\n    case F32MAT2X2:\n    case F32MAT2X3:\n    case F32MAT2X4:\n    case F32MAT3X2:\n    case F32MAT3X3:\n    case F32MAT3X4:\n    case F32MAT4X2:\n    case F32MAT4X3:\n    case F32MAT4X4:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types) ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_float32))\n            return keyword;\n        return identifierOrType();\n\n    case FLOAT64_T:\n    case F64VEC2:\n    case F64VEC3:\n    case F64VEC4:\n    afterType = true;\n    if (parseContext.symbolTable.atBuiltInLevel() ||\n        parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types) ||\n        (parseContext.extensionTurnedOn(E_GL_NV_gpu_shader5) && \n         parseContext.extensionTurnedOn(E_GL_ARB_gpu_shader_fp64)) ||\n        parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_float64))\n        return keyword;\n    return identifierOrType();\n    case F64MAT2:\n    case F64MAT3:\n    case F64MAT4:\n    case F64MAT2X2:\n    case F64MAT2X3:\n    case F64MAT2X4:\n    case F64MAT3X2:\n    case F64MAT3X3:\n    case F64MAT3X4:\n    case F64MAT4X2:\n    case F64MAT4X3:\n    case F64MAT4X4:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types) ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_float64))\n            return keyword;\n        return identifierOrType();\n\n    case FLOAT16_T:\n    case F16VEC2:\n    case F16VEC3:\n    case F16VEC4:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_half_float) ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_16bit_storage) ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types) ||\n            parseContext.extensionTurnedOn(E_GL_NV_gpu_shader5) ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_float16))\n            return keyword;\n\n        return identifierOrType();\n\n    case F16MAT2:\n    case F16MAT3:\n    case F16MAT4:\n    case F16MAT2X2:\n    case F16MAT2X3:\n    case F16MAT2X4:\n    case F16MAT3X2:\n    case F16MAT3X3:\n    case F16MAT3X4:\n    case F16MAT4X2:\n    case F16MAT4X3:\n    case F16MAT4X4:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_half_float) ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types) ||\n            parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_float16))\n            return keyword;\n\n        return identifierOrType();\n\n    case BFLOAT16_T:\n    case BF16VEC2:\n    case BF16VEC3:\n    case BF16VEC4:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_EXT_bfloat16))\n            return keyword;\n\n        return identifierOrType();\n\n    case FLOATE5M2_T:\n    case FE5M2VEC2:\n    case FE5M2VEC3:\n    case FE5M2VEC4:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_EXT_float_e5m2))\n            return keyword;\n\n        return identifierOrType();\n\n    case FLOATE4M3_T:\n    case FE4M3VEC2:\n    case FE4M3VEC3:\n    case FE4M3VEC4:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_EXT_float_e4m3))\n            return keyword;\n\n        return identifierOrType();\n\n    case SAMPLERCUBEARRAY:\n    case SAMPLERCUBEARRAYSHADOW:\n    case ISAMPLERCUBEARRAY:\n    case USAMPLERCUBEARRAY:\n        afterType = true;\n        if ((parseContext.isEsProfile() && parseContext.version >= 320) ||\n            parseContext.extensionsTurnedOn(Num_AEP_texture_cube_map_array, AEP_texture_cube_map_array))\n            return keyword;\n        if (parseContext.isEsProfile() || (parseContext.version < 400 &&\n            ! parseContext.extensionTurnedOn(E_GL_ARB_texture_cube_map_array)\n            && ! parseContext.extensionsTurnedOn(Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5)))\n            reservedWord();\n        return keyword;\n\n    case TEXTURECUBEARRAY:\n    case ITEXTURECUBEARRAY:\n    case UTEXTURECUBEARRAY:\n        if (parseContext.spvVersion.vulkan > 0)\n            return keyword;\n        else\n            return identifierOrType();\n\n    case UINT:\n    case UVEC2:\n    case UVEC3:\n    case UVEC4:\n    case SAMPLERCUBESHADOW:\n    case SAMPLER2DARRAY:\n    case SAMPLER2DARRAYSHADOW:\n    case ISAMPLER2D:\n    case ISAMPLER3D:\n    case ISAMPLERCUBE:\n    case ISAMPLER2DARRAY:\n    case USAMPLER2D:\n    case USAMPLER3D:\n    case USAMPLERCUBE:\n    case USAMPLER2DARRAY:\n        afterType = true;\n        if (keyword == SAMPLER2DARRAY || keyword == SAMPLER2DARRAYSHADOW) {\n            if (!parseContext.isEsProfile() &&\n                (parseContext.extensionTurnedOn(E_GL_EXT_texture_array) || parseContext.symbolTable.atBuiltInLevel())) {\n                return keyword;\n            }\n        }\n        return nonreservedKeyword(300, 130);\n\n    case SAMPLER3D:\n        afterType = true;\n        if (parseContext.isEsProfile() && parseContext.version < 300) {\n            if (!parseContext.extensionTurnedOn(E_GL_OES_texture_3D))\n                reservedWord();\n        }\n        return keyword;\n\n    case SAMPLER2DSHADOW:\n        afterType = true;\n        if (parseContext.isEsProfile() && parseContext.version < 300) {\n            if (!parseContext.extensionTurnedOn(E_GL_EXT_shadow_samplers))\n                reservedWord();\n        }\n        return keyword;\n\n    case TEXTURE2D:\n    case TEXTURECUBE:\n    case TEXTURE2DARRAY:\n    case ITEXTURE2D:\n    case ITEXTURE3D:\n    case ITEXTURECUBE:\n    case ITEXTURE2DARRAY:\n    case UTEXTURE2D:\n    case UTEXTURE3D:\n    case UTEXTURECUBE:\n    case UTEXTURE2DARRAY:\n    case TEXTURE3D:\n    case SAMPLER:\n    case SAMPLERSHADOW:\n        if (parseContext.spvVersion.vulkan > 0)\n            return keyword;\n        else\n            return identifierOrType();\n\n    case ISAMPLER1D:\n    case ISAMPLER1DARRAY:\n    case SAMPLER1DARRAYSHADOW:\n    case USAMPLER1D:\n    case USAMPLER1DARRAY:\n        afterType = true;\n        if (keyword == SAMPLER1DARRAYSHADOW) {\n            if (!parseContext.isEsProfile() &&\n                (parseContext.extensionTurnedOn(E_GL_EXT_texture_array) || parseContext.symbolTable.atBuiltInLevel())) {\n                return keyword;\n            }\n        }\n        return es30ReservedFromGLSL(130);\n    case ISAMPLER2DRECT:\n    case USAMPLER2DRECT:\n        afterType = true;\n        return es30ReservedFromGLSL(140);\n\n    case SAMPLERBUFFER:\n        afterType = true;\n        if ((parseContext.isEsProfile() && parseContext.version >= 320) ||\n            parseContext.extensionsTurnedOn(Num_AEP_texture_buffer, AEP_texture_buffer))\n            return keyword;\n        return es30ReservedFromGLSL(130);\n\n    case ISAMPLERBUFFER:\n    case USAMPLERBUFFER:\n        afterType = true;\n        if ((parseContext.isEsProfile() && parseContext.version >= 320) ||\n            parseContext.extensionsTurnedOn(Num_AEP_texture_buffer, AEP_texture_buffer))\n            return keyword;\n        return es30ReservedFromGLSL(140);\n\n    case SAMPLER2DMS:\n    case ISAMPLER2DMS:\n    case USAMPLER2DMS:\n        afterType = true;\n        if (parseContext.isEsProfile() && parseContext.version >= 310)\n            return keyword;\n        if (!parseContext.isEsProfile() && (parseContext.version > 140 ||\n            (parseContext.version == 140 && parseContext.extensionsTurnedOn(1, &E_GL_ARB_texture_multisample))))\n            return keyword;\n        return es30ReservedFromGLSL(150);\n\n    case SAMPLER2DMSARRAY:\n    case ISAMPLER2DMSARRAY:\n    case USAMPLER2DMSARRAY:\n        afterType = true;\n        if ((parseContext.isEsProfile() && parseContext.version >= 320) ||\n            parseContext.extensionsTurnedOn(1, &E_GL_OES_texture_storage_multisample_2d_array))\n            return keyword;\n        if (!parseContext.isEsProfile() && (parseContext.version > 140 ||\n            (parseContext.version == 140 && parseContext.extensionsTurnedOn(1, &E_GL_ARB_texture_multisample))))\n            return keyword;\n        return es30ReservedFromGLSL(150);\n\n    case SAMPLER1D:\n    case SAMPLER1DSHADOW:\n        afterType = true;\n        if (parseContext.isEsProfile())\n            reservedWord();\n        return keyword;\n\n    case SAMPLER2DRECT:\n    case SAMPLER2DRECTSHADOW:\n        afterType = true;\n        if (parseContext.isEsProfile())\n            reservedWord();\n        else if (parseContext.version < 140 && ! parseContext.symbolTable.atBuiltInLevel() && ! parseContext.extensionTurnedOn(E_GL_ARB_texture_rectangle)) {\n            if (parseContext.relaxedErrors())\n                parseContext.requireExtensions(loc, 1, &E_GL_ARB_texture_rectangle, \"texture-rectangle sampler keyword\");\n            else\n                reservedWord();\n        }\n        return keyword;\n\n    case SAMPLER1DARRAY:\n        afterType = true;\n        if (parseContext.isEsProfile() && parseContext.version == 300)\n            reservedWord();\n        else if ((parseContext.isEsProfile() && parseContext.version < 300) ||\n                 ((!parseContext.isEsProfile() && parseContext.version < 130) &&\n                   !parseContext.symbolTable.atBuiltInLevel() &&\n                   !parseContext.extensionTurnedOn(E_GL_EXT_texture_array)))\n            return identifierOrType();\n        return keyword;\n\n    case SAMPLEREXTERNALOES:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_OES_EGL_image_external) ||\n            parseContext.extensionTurnedOn(E_GL_OES_EGL_image_external_essl3))\n            return keyword;\n        return identifierOrType();\n\n    case SAMPLEREXTERNAL2DY2YEXT:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_EXT_YUV_target))\n            return keyword;\n        return identifierOrType();\n\n    case ITEXTURE1DARRAY:\n    case UTEXTURE1D:\n    case ITEXTURE1D:\n    case UTEXTURE1DARRAY:\n    case TEXTUREBUFFER:\n    case ITEXTURE2DRECT:\n    case UTEXTURE2DRECT:\n    case ITEXTUREBUFFER:\n    case UTEXTUREBUFFER:\n    case TEXTURE2DMS:\n    case ITEXTURE2DMS:\n    case UTEXTURE2DMS:\n    case TEXTURE2DMSARRAY:\n    case ITEXTURE2DMSARRAY:\n    case UTEXTURE2DMSARRAY:\n    case TEXTURE1D:\n    case TEXTURE2DRECT:\n    case TEXTURE1DARRAY:\n        if (parseContext.spvVersion.vulkan > 0)\n            return keyword;\n        else\n            return identifierOrType();\n\n    case SUBPASSINPUT:\n    case SUBPASSINPUTMS:\n    case ISUBPASSINPUT:\n    case ISUBPASSINPUTMS:\n    case USUBPASSINPUT:\n    case USUBPASSINPUTMS:\n    case ATTACHMENTEXT:\n    case IATTACHMENTEXT:\n    case UATTACHMENTEXT:\n        if (parseContext.spvVersion.vulkan > 0)\n            return keyword;\n        else\n            return identifierOrType();\n\n    case F16SAMPLER1D:\n    case F16SAMPLER2D:\n    case F16SAMPLER3D:\n    case F16SAMPLER2DRECT:\n    case F16SAMPLERCUBE:\n    case F16SAMPLER1DARRAY:\n    case F16SAMPLER2DARRAY:\n    case F16SAMPLERCUBEARRAY:\n    case F16SAMPLERBUFFER:\n    case F16SAMPLER2DMS:\n    case F16SAMPLER2DMSARRAY:\n    case F16SAMPLER1DSHADOW:\n    case F16SAMPLER2DSHADOW:\n    case F16SAMPLER1DARRAYSHADOW:\n    case F16SAMPLER2DARRAYSHADOW:\n    case F16SAMPLER2DRECTSHADOW:\n    case F16SAMPLERCUBESHADOW:\n    case F16SAMPLERCUBEARRAYSHADOW:\n\n    case F16IMAGE1D:\n    case F16IMAGE2D:\n    case F16IMAGE3D:\n    case F16IMAGE2DRECT:\n    case F16IMAGECUBE:\n    case F16IMAGE1DARRAY:\n    case F16IMAGE2DARRAY:\n    case F16IMAGECUBEARRAY:\n    case F16IMAGEBUFFER:\n    case F16IMAGE2DMS:\n    case F16IMAGE2DMSARRAY:\n\n    case F16TEXTURE1D:\n    case F16TEXTURE2D:\n    case F16TEXTURE3D:\n    case F16TEXTURE2DRECT:\n    case F16TEXTURECUBE:\n    case F16TEXTURE1DARRAY:\n    case F16TEXTURE2DARRAY:\n    case F16TEXTURECUBEARRAY:\n    case F16TEXTUREBUFFER:\n    case F16TEXTURE2DMS:\n    case F16TEXTURE2DMSARRAY:\n\n    case F16SUBPASSINPUT:\n    case F16SUBPASSINPUTMS:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_half_float_fetch))\n            return keyword;\n        return identifierOrType();\n\n    case EXPLICITINTERPAMD:\n        if (parseContext.extensionTurnedOn(E_GL_AMD_shader_explicit_vertex_parameter))\n            return keyword;\n        return identifierOrType();\n\n    case PERVERTEXNV:\n        if ((!parseContext.isEsProfile() && parseContext.version >= 450) ||\n            parseContext.extensionTurnedOn(E_GL_NV_fragment_shader_barycentric))\n            return keyword;\n        return identifierOrType();\n\n    case PERVERTEXEXT:\n        if ((!parseContext.isEsProfile() && parseContext.version >= 450) ||\n            parseContext.extensionTurnedOn(E_GL_EXT_fragment_shader_barycentric))\n            return keyword;\n        return identifierOrType();\n\n    case PRECISE:\n        if ((parseContext.isEsProfile() &&\n             (parseContext.version >= 320 || parseContext.extensionsTurnedOn(Num_AEP_gpu_shader5, AEP_gpu_shader5))) ||\n            (!parseContext.isEsProfile() &&\n             (parseContext.version >= 400 \n             || parseContext.extensionsTurnedOn(Num_AEP_core_gpu_shader5, AEP_core_gpu_shader5))))\n            return keyword;\n        if (parseContext.isEsProfile() && parseContext.version == 310) {\n            reservedWord();\n            return keyword;\n        }\n        return identifierOrType();\n\n    case PERPRIMITIVENV:\n    case PERVIEWNV:\n    case PERTASKNV:\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_NV_mesh_shader))\n            return keyword;\n        return identifierOrType();\n\n    case PERPRIMITIVEEXT:\n    case TASKPAYLOADWORKGROUPEXT:\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_EXT_mesh_shader))\n            return keyword;\n        return identifierOrType();\n\n    case FCOOPMATNV:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_NV_cooperative_matrix))\n            return keyword;\n        return identifierOrType();\n\n    case UCOOPMATNV:\n    case ICOOPMATNV:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_NV_integer_cooperative_matrix))\n            return keyword;\n        return identifierOrType();\n\n    case COOPMAT:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_KHR_cooperative_matrix))\n            return keyword;\n        return identifierOrType();\n\n    case COOPVECNV:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_NV_cooperative_vector))\n            return keyword;\n        return identifierOrType();\n\n    case DEMOTE:\n        if (parseContext.extensionTurnedOn(E_GL_EXT_demote_to_helper_invocation))\n            return keyword;\n        else\n            return identifierOrType();\n\n    case SPIRV_INSTRUCTION:\n    case SPIRV_EXECUTION_MODE:\n    case SPIRV_EXECUTION_MODE_ID:\n    case SPIRV_DECORATE:\n    case SPIRV_DECORATE_ID:\n    case SPIRV_DECORATE_STRING:\n    case SPIRV_TYPE:\n    case SPIRV_STORAGE_CLASS:\n    case SPIRV_BY_REFERENCE:\n    case SPIRV_LITERAL:\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_EXT_spirv_intrinsics))\n            return keyword;\n        return identifierOrType();\n\n    case HITOBJECTNV:\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            (!parseContext.isEsProfile() && parseContext.version >= 460\n                 && parseContext.extensionTurnedOn(E_GL_NV_shader_invocation_reorder)))\n            return keyword;\n        return identifierOrType();\n\n    case HITOBJECTATTRNV:\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            (!parseContext.isEsProfile() && parseContext.version >= 460\n                 && parseContext.extensionTurnedOn(E_GL_NV_shader_invocation_reorder)))\n            return keyword;\n        return identifierOrType();\n\n    case FUNCTION:\n    case TENSORLAYOUTNV:\n    case TENSORVIEWNV:\n        afterType = true;\n        if (parseContext.symbolTable.atBuiltInLevel() ||\n            parseContext.extensionTurnedOn(E_GL_NV_cooperative_matrix2))\n            return keyword;\n        return identifierOrType();\n\n    default:\n        parseContext.infoSink.info.message(EPrefixInternalError, \"Unknown glslang keyword\", loc);\n        return 0;\n    }\n}\n\nint TScanContext::identifierOrType()\n{\n    parserToken->sType.lex.string = NewPoolTString(tokenText);\n    if (field)\n        return IDENTIFIER;\n\n    parserToken->sType.lex.symbol = parseContext.symbolTable.find(*parserToken->sType.lex.string);\n    if ((afterType == false && afterStruct == false) && parserToken->sType.lex.symbol != nullptr) {\n        if (const TVariable* variable = parserToken->sType.lex.symbol->getAsVariable()) {\n            if (variable->isUserType() &&\n                // treat redeclaration of forward-declared buffer/uniform reference as an identifier\n                !(variable->getType().isReference() && afterBuffer)) {\n                afterType = true;\n\n                return TYPE_NAME;\n            }\n        }\n    }\n\n    return IDENTIFIER;\n}\n\n// Give an error for use of a reserved symbol.\n// However, allow built-in declarations to use reserved words, to allow\n// extension support before the extension is enabled.\nint TScanContext::reservedWord()\n{\n    if (! parseContext.symbolTable.atBuiltInLevel())\n        parseContext.error(loc, \"Reserved word.\", tokenText, \"\", \"\");\n\n    return 0;\n}\n\nint TScanContext::identifierOrReserved(bool reserved)\n{\n    if (reserved) {\n        reservedWord();\n\n        return 0;\n    }\n\n    if (parseContext.isForwardCompatible())\n        parseContext.warn(loc, \"using future reserved keyword\", tokenText, \"\");\n\n    return identifierOrType();\n}\n\n// For keywords that suddenly showed up on non-ES (not previously reserved)\n// but then got reserved by ES 3.0.\nint TScanContext::es30ReservedFromGLSL(int version)\n{\n    if (parseContext.symbolTable.atBuiltInLevel())\n        return keyword;\n\n    if ((parseContext.isEsProfile() && parseContext.version < 300) ||\n        (!parseContext.isEsProfile() && parseContext.version < version)) {\n            if (parseContext.isForwardCompatible())\n                parseContext.warn(loc, \"future reserved word in ES 300 and keyword in GLSL\", tokenText, \"\");\n\n            return identifierOrType();\n    } else if (parseContext.isEsProfile() && parseContext.version >= 300)\n        reservedWord();\n\n    return keyword;\n}\n\n// For a keyword that was never reserved, until it suddenly\n// showed up, both in an es version and a non-ES version.\nint TScanContext::nonreservedKeyword(int esVersion, int nonEsVersion)\n{\n    if ((parseContext.isEsProfile() && parseContext.version < esVersion) ||\n        (!parseContext.isEsProfile() && parseContext.version < nonEsVersion)) {\n        if (parseContext.isForwardCompatible())\n            parseContext.warn(loc, \"using future keyword\", tokenText, \"\");\n\n        return identifierOrType();\n    }\n\n    return keyword;\n}\n\nint TScanContext::precisionKeyword()\n{\n    if (parseContext.isEsProfile() || parseContext.version >= 130)\n        return keyword;\n\n    if (parseContext.isForwardCompatible())\n        parseContext.warn(loc, \"using ES precision qualifier keyword\", tokenText, \"\");\n\n    return identifierOrType();\n}\n\nint TScanContext::matNxM()\n{\n    afterType = true;\n\n    if (parseContext.version > 110)\n        return keyword;\n\n    if (parseContext.isForwardCompatible())\n        parseContext.warn(loc, \"using future non-square matrix type keyword\", tokenText, \"\");\n\n    return identifierOrType();\n}\n\nint TScanContext::dMat()\n{\n    afterType = true;\n\n    if (parseContext.isEsProfile() && parseContext.version >= 300) {\n        reservedWord();\n\n        return keyword;\n    }\n\n    if (!parseContext.isEsProfile() && (parseContext.version >= 400 ||\n        parseContext.symbolTable.atBuiltInLevel() ||\n        (parseContext.version >= 150 && parseContext.extensionTurnedOn(E_GL_ARB_gpu_shader_fp64)) ||\n        (parseContext.version >= 150 && parseContext.extensionTurnedOn(E_GL_ARB_vertex_attrib_64bit)\n         && parseContext.language == EShLangVertex)))\n        return keyword;\n\n    if (parseContext.isForwardCompatible())\n        parseContext.warn(loc, \"using future type keyword\", tokenText, \"\");\n\n    return identifierOrType();\n}\n\nint TScanContext::firstGenerationImage(bool inEs310)\n{\n    if (parseContext.symbolTable.atBuiltInLevel() ||\n        (!parseContext.isEsProfile() && (parseContext.version >= 420 ||\n         parseContext.extensionTurnedOn(E_GL_ARB_shader_image_load_store))) ||\n        (inEs310 && parseContext.isEsProfile() && parseContext.version >= 310))\n        return keyword;\n\n    if ((parseContext.isEsProfile() && parseContext.version >= 300) ||\n        (!parseContext.isEsProfile() && parseContext.version >= 130)) {\n        reservedWord();\n\n        return keyword;\n    }\n\n    if (parseContext.isForwardCompatible())\n        parseContext.warn(loc, \"using future type keyword\", tokenText, \"\");\n\n    return identifierOrType();\n}\n\nint TScanContext::secondGenerationImage()\n{\n    if (parseContext.isEsProfile() && parseContext.version >= 310) {\n        reservedWord();\n        return keyword;\n    }\n\n    if (parseContext.symbolTable.atBuiltInLevel() ||\n        (!parseContext.isEsProfile() &&\n         (parseContext.version >= 420 || parseContext.extensionTurnedOn(E_GL_ARB_shader_image_load_store))))\n        return keyword;\n\n    if (parseContext.isForwardCompatible())\n        parseContext.warn(loc, \"using future type keyword\", tokenText, \"\");\n\n    return identifierOrType();\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/Scan.h",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2013 LunarG, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n#ifndef _GLSLANG_SCAN_INCLUDED_\n#define _GLSLANG_SCAN_INCLUDED_\n\n#include \"Versions.h\"\n\nnamespace glslang {\n\n// Use a global end-of-input character, so no translation is needed across\n// layers of encapsulation.  Characters are all 8 bit, and positive, so there is\n// no aliasing of character 255 onto -1, for example.\nconst int EndOfInput = -1;\n\n//\n// A character scanner that seamlessly, on read-only strings, reads across an\n// array of strings without assuming null termination.\n//\nclass TInputScanner {\npublic:\n    TInputScanner(int n, const char* const s[], size_t L[], const char* const* names = nullptr,\n                  int b = 0, int f = 0, bool single = false) :\n        numSources(n),\n         // up to this point, common usage is \"char*\", but now we need positive 8-bit characters\n        sources(reinterpret_cast<const unsigned char* const *>(s)),\n        lengths(L), currentSource(0), currentChar(0), stringBias(b), finale(f), singleLogical(single),\n        endOfFileReached(false)\n    {\n        loc = new TSourceLoc[numSources];\n        for (int i = 0; i < numSources; ++i) {\n            loc[i].init(i - stringBias);\n        }\n        if (names != nullptr) {\n            for (int i = 0; i < numSources; ++i)\n                loc[i].name = names[i] != nullptr ? NewPoolTString(names[i]) : nullptr;\n        }\n        loc[currentSource].line = 1;\n        logicalSourceLoc.init(1);\n        logicalSourceLoc.name = loc[0].name;\n    }\n\n    virtual ~TInputScanner()\n    {\n        delete [] loc;\n    }\n\n    // retrieve the next character and advance one character\n    int get()\n    {\n        int ret = peek();\n        if (ret == EndOfInput)\n            return ret;\n        ++loc[currentSource].column;\n        ++logicalSourceLoc.column;\n        if (ret == '\\n') {\n            ++loc[currentSource].line;\n            ++logicalSourceLoc.line;\n            logicalSourceLoc.column = 0;\n            loc[currentSource].column = 0;\n        }\n        advance();\n\n        return ret;\n    }\n\n    // retrieve the next character, no advance\n    int peek()\n    {\n        if (currentSource >= numSources) {\n            endOfFileReached = true;\n            return EndOfInput;\n        }\n        // Make sure we do not read off the end of a string.\n        // N.B. Sources can have a length of 0.\n        int sourceToRead = currentSource;\n        size_t charToRead = currentChar;\n        while(charToRead >= lengths[sourceToRead]) {\n            charToRead = 0;\n            sourceToRead += 1;\n            if (sourceToRead >= numSources) {\n                return EndOfInput;\n            }\n        }\n\n        // Here, we care about making negative valued characters positive\n        return sources[sourceToRead][charToRead];\n    }\n\n    // go back one character\n    void unget()\n    {\n        // Do not roll back once we've reached the end of the file.\n        if (endOfFileReached)\n            return;\n\n        if (currentChar > 0) {\n            --currentChar;\n            --loc[currentSource].column;\n            --logicalSourceLoc.column;\n            if (loc[currentSource].column < 0) {\n                // We've moved back past a new line. Find the\n                // previous newline (or start of the file) to compute\n                // the column count on the now current line.\n                size_t chIndex = currentChar;\n                while (chIndex > 0) {\n                    if (sources[currentSource][chIndex] == '\\n') {\n                        break;\n                    }\n                    --chIndex;\n                }\n                logicalSourceLoc.column = (int)(currentChar - chIndex);\n                loc[currentSource].column = (int)(currentChar - chIndex);\n            }\n        } else {\n            do {\n                --currentSource;\n            } while (currentSource > 0 && lengths[currentSource] == 0);\n            if (lengths[currentSource] == 0) {\n                // set to 0 if we've backed up to the start of an empty string\n                currentChar = 0;\n            } else\n                currentChar = lengths[currentSource] - 1;\n        }\n        if (peek() == '\\n') {\n            --loc[currentSource].line;\n            --logicalSourceLoc.line;\n        }\n    }\n\n    // for #line override\n    void setLine(int newLine)\n    {\n        logicalSourceLoc.line = newLine;\n        loc[getLastValidSourceIndex()].line = newLine;\n    }\n\n    // for #line override in filename based parsing\n    void setFile(const char* filename)\n    {\n        TString* fn_tstr = NewPoolTString(filename);\n        logicalSourceLoc.name = fn_tstr;\n        loc[getLastValidSourceIndex()].name = fn_tstr;\n    }\n\n    void setFile(const char* filename, int i)\n    {\n        TString* fn_tstr = NewPoolTString(filename);\n        if (i == getLastValidSourceIndex()) {\n            logicalSourceLoc.name = fn_tstr;\n        }\n        loc[i].name = fn_tstr;\n    }\n\n    void setString(int newString)\n    {\n        logicalSourceLoc.string = newString;\n        loc[getLastValidSourceIndex()].string = newString;\n        logicalSourceLoc.name = nullptr;\n        loc[getLastValidSourceIndex()].name = nullptr;\n    }\n\n    // for #include content indentation\n    void setColumn(int col)\n    {\n        logicalSourceLoc.column = col;\n        loc[getLastValidSourceIndex()].column = col;\n    }\n\n    void setEndOfInput()\n    {\n        endOfFileReached = true;\n        currentSource = numSources;\n    }\n\n    bool atEndOfInput() const { return endOfFileReached; }\n\n    const TSourceLoc& getSourceLoc() const\n    {\n        if (singleLogical) {\n            return logicalSourceLoc;\n        } else {\n            return loc[std::max(0, std::min(currentSource, numSources - finale - 1))];\n        }\n    }\n    // Returns the index (starting from 0) of the most recent valid source string we are reading from.\n    int getLastValidSourceIndex() const { return std::min(currentSource, numSources - 1); }\n\n    void consumeWhiteSpace(bool& foundNonSpaceTab);\n    bool consumeComment();\n    void consumeWhitespaceComment(bool& foundNonSpaceTab);\n    bool scanVersion(int& version, EProfile& profile, bool& notFirstToken);\n\nprotected:\n\n    // advance one character\n    void advance()\n    {\n        ++currentChar;\n        if (currentChar >= lengths[currentSource]) {\n            ++currentSource;\n            if (currentSource < numSources) {\n                loc[currentSource].string = loc[currentSource - 1].string + 1;\n                loc[currentSource].line = 1;\n                loc[currentSource].column = 0;\n            }\n            while (currentSource < numSources && lengths[currentSource] == 0) {\n                ++currentSource;\n                if (currentSource < numSources) {\n                    loc[currentSource].string = loc[currentSource - 1].string + 1;\n                    loc[currentSource].line = 1;\n                    loc[currentSource].column = 0;\n                }\n            }\n            currentChar = 0;\n        }\n    }\n\n    int numSources;                      // number of strings in source\n    const unsigned char* const *sources; // array of strings; must be converted to positive values on use, to avoid aliasing with -1 as EndOfInput\n    const size_t *lengths;               // length of each string\n    int currentSource;\n    size_t currentChar;\n\n    // This is for reporting what string/line an error occurred on, and can be overridden by #line.\n    // It remembers the last state of each source string as it is left for the next one, so unget()\n    // can restore that state.\n    TSourceLoc* loc;  // an array\n\n    int stringBias;   // the first string that is the user's string number 0\n    int finale;       // number of internal strings after user's last string\n\n    TSourceLoc logicalSourceLoc;\n    bool singleLogical; // treats the strings as a single logical string.\n                        // locations will be reported from the first string.\n\n    // Set to true once peek() returns EndOfFile, so that we won't roll back\n    // once we've reached EndOfFile.\n    bool endOfFileReached;\n};\n\n} // end namespace glslang\n\n#endif // _GLSLANG_SCAN_INCLUDED_\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/ScanContext.h",
    "content": "//\n// Copyright (C) 2013 LunarG, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n//\n// This holds context specific to the GLSL scanner, which\n// sits between the preprocessor scanner and parser.\n//\n\n#pragma once\n\n#include \"ParseHelper.h\"\n\nnamespace glslang {\n\nclass TPpContext;\nclass TPpToken;\nclass TParserToken;\n\nclass TScanContext {\npublic:\n    explicit TScanContext(TParseContextBase& pc) :\n        parseContext(pc),\n        afterType(false), afterStruct(false),\n        field(false), afterBuffer(false) { }\n    virtual ~TScanContext() { }\n\n    static void fillInKeywordMap();\n    static void deleteKeywordMap();\n\n    int tokenize(TPpContext*, TParserToken&);\n\nprotected:\n    TScanContext(TScanContext&);\n    TScanContext& operator=(TScanContext&);\n\n    int tokenizeIdentifier();\n    int identifierOrType();\n    int reservedWord();\n    int identifierOrReserved(bool reserved);\n    int es30ReservedFromGLSL(int version);\n    int nonreservedKeyword(int esVersion, int nonEsVersion);\n    int precisionKeyword();\n    int matNxM();\n    int dMat();\n    int firstGenerationImage(bool inEs310);\n    int secondGenerationImage();\n\n    TParseContextBase& parseContext;\n    bool afterType;           // true if we've recognized a type, so can only be looking for an identifier\n    bool afterStruct;         // true if we've recognized the STRUCT keyword, so can only be looking for an identifier\n    bool field;               // true if we're on a field, right after a '.'\n    bool afterBuffer;         // true if we've recognized the BUFFER keyword\n    TSourceLoc loc;\n    TParserToken* parserToken;\n    TPpToken* ppToken;\n\n    const char* tokenText;\n    int keyword;\n};\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/ShaderLang.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2013-2016 LunarG, Inc.\n// Copyright (C) 2015-2020 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n//\n// Implement the top-level of interface to the compiler/linker,\n// as defined in ShaderLang.h\n// This is the platform independent interface between an OGL driver\n// and the shading language compiler/linker.\n//\n#include <cstring>\n#include <iostream>\n#include <sstream>\n#include <memory>\n#include <mutex>\n#include \"SymbolTable.h\"\n#include \"ParseHelper.h\"\n#include \"Scan.h\"\n#include \"ScanContext.h\"\n\n#ifdef ENABLE_HLSL\n#include \"../HLSL/hlslParseHelper.h\"\n#include \"../HLSL/hlslParseables.h\"\n#include \"../HLSL/hlslScanContext.h\"\n#endif\n\n#include \"../Include/ShHandle.h\"\n\n#include \"preprocessor/PpContext.h\"\n\n#define SH_EXPORTING\n#include \"../Public/ShaderLang.h\"\n#include \"reflection.h\"\n#include \"iomapper.h\"\n#include \"Initialize.h\"\n\n// TODO: this really shouldn't be here, it is only because of the trial addition\n// of printing pre-processed tokens, which requires knowing the string literal\n// token to print \", but none of that seems appropriate for this file.\n#include \"preprocessor/PpTokens.h\"\n\n// Build-time generated includes\n#include \"../../glslang/build_info.h\"\n\nnamespace { // anonymous namespace for file-local functions and symbols\n\n// Total number of successful initializers of glslang: a refcount\n// Shared global; access should be protected by a global mutex/critical section.\nint NumberOfClients = 0;\n\n// global initialization lock\n#ifndef DISABLE_THREAD_SUPPORT\nstd::mutex init_lock;\n#endif\n\n\nusing namespace glslang;\n\n// Create a language specific version of parseables.\nTBuiltInParseables* CreateBuiltInParseables(TInfoSink& infoSink, EShSource source)\n{\n    switch (source) {\n    case EShSourceGlsl: return new TBuiltIns();              // GLSL builtIns\n#ifdef ENABLE_HLSL\n    case EShSourceHlsl: return new TBuiltInParseablesHlsl(); // HLSL intrinsics\n#endif\n\n    default:\n        infoSink.info.message(EPrefixInternalError, \"Unable to determine source language\");\n        return nullptr;\n    }\n}\n\n// Create a language specific version of a parse context.\nTParseContextBase* CreateParseContext(TSymbolTable& symbolTable, TIntermediate& intermediate,\n                                      int version, EProfile profile, EShSource source,\n                                      EShLanguage language, TInfoSink& infoSink,\n                                      SpvVersion spvVersion, bool forwardCompatible, EShMessages messages,\n                                      bool parsingBuiltIns, std::string sourceEntryPointName = \"\")\n{\n    switch (source) {\n    case EShSourceGlsl: {\n        if (sourceEntryPointName.size() == 0)\n            intermediate.setEntryPointName(\"main\");\n        TString entryPoint = sourceEntryPointName.c_str();\n        return new TParseContext(symbolTable, intermediate, parsingBuiltIns, version, profile, spvVersion,\n                                 language, infoSink, forwardCompatible, messages, &entryPoint);\n    }\n#ifdef ENABLE_HLSL\n    case EShSourceHlsl:\n        return new HlslParseContext(symbolTable, intermediate, parsingBuiltIns, version, profile, spvVersion,\n                                    language, infoSink, sourceEntryPointName.c_str(), forwardCompatible, messages);\n#endif\n    default:\n        infoSink.info.message(EPrefixInternalError, \"Unable to determine source language\");\n        return nullptr;\n    }\n}\n\n// Local mapping functions for making arrays of symbol tables....\n\nconst int VersionCount = 17;  // index range in MapVersionToIndex\n\nint MapVersionToIndex(int version)\n{\n    int index = 0;\n\n    switch (version) {\n    case 100: index =  0; break;\n    case 110: index =  1; break;\n    case 120: index =  2; break;\n    case 130: index =  3; break;\n    case 140: index =  4; break;\n    case 150: index =  5; break;\n    case 300: index =  6; break;\n    case 330: index =  7; break;\n    case 400: index =  8; break;\n    case 410: index =  9; break;\n    case 420: index = 10; break;\n    case 430: index = 11; break;\n    case 440: index = 12; break;\n    case 310: index = 13; break;\n    case 450: index = 14; break;\n    case 500: index =  0; break; // HLSL\n    case 320: index = 15; break;\n    case 460: index = 16; break;\n    default:  assert(0);  break;\n    }\n\n    assert(index < VersionCount);\n\n    return index;\n}\n\nconst int SpvVersionCount = 4;  // index range in MapSpvVersionToIndex\n\nint MapSpvVersionToIndex(const SpvVersion& spvVersion)\n{\n    int index = 0;\n\n    if (spvVersion.openGl > 0)\n        index = 1;\n    else if (spvVersion.vulkan > 0) {\n        if (!spvVersion.vulkanRelaxed)\n            index = 2;\n        else\n            index = 3;\n    }\n\n    assert(index < SpvVersionCount);\n\n    return index;\n}\n\nconst int ProfileCount = 4;   // index range in MapProfileToIndex\n\nint MapProfileToIndex(EProfile profile)\n{\n    int index = 0;\n\n    switch (profile) {\n    case ENoProfile:            index = 0; break;\n    case ECoreProfile:          index = 1; break;\n    case ECompatibilityProfile: index = 2; break;\n    case EEsProfile:            index = 3; break;\n    default:                               break;\n    }\n\n    assert(index < ProfileCount);\n\n    return index;\n}\n\nconst int SourceCount = 2;\n\nint MapSourceToIndex(EShSource source)\n{\n    int index = 0;\n\n    switch (source) {\n    case EShSourceGlsl: index = 0; break;\n    case EShSourceHlsl: index = 1; break;\n    default:                       break;\n    }\n\n    assert(index < SourceCount);\n\n    return index;\n}\n\n// only one of these needed for non-ES; ES needs 2 for different precision defaults of built-ins\nenum EPrecisionClass {\n    EPcGeneral,\n    EPcFragment,\n    EPcCount\n};\n\n// A process-global symbol table per version per profile for built-ins common\n// to multiple stages (languages), and a process-global symbol table per version\n// per profile per stage for built-ins unique to each stage.  They will be sparsely\n// populated, so they will only be generated as needed.\n//\n// Each has a different set of built-ins, and we want to preserve that from\n// compile to compile.\n//\nTSymbolTable* CommonSymbolTable[VersionCount][SpvVersionCount][ProfileCount][SourceCount][EPcCount] = {};\nTSymbolTable* SharedSymbolTables[VersionCount][SpvVersionCount][ProfileCount][SourceCount][EShLangCount] = {};\n\nTPoolAllocator* PerProcessGPA = nullptr;\n\n//\n// Parse and add to the given symbol table the content of the given shader string.\n//\nbool InitializeSymbolTable(const TString& builtIns, int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language,\n                           EShSource source, TInfoSink& infoSink, TSymbolTable& symbolTable)\n{\n    TIntermediate intermediate(language, version, profile);\n\n    intermediate.setSource(source);\n\n    std::unique_ptr<TParseContextBase> parseContext(CreateParseContext(symbolTable, intermediate, version, profile, source,\n                                                                       language, infoSink, spvVersion, true, EShMsgDefault,\n                                                                       true));\n\n    TShader::ForbidIncluder includer;\n    TPpContext ppContext(*parseContext, \"\", includer);\n    TScanContext scanContext(*parseContext);\n    parseContext->setScanContext(&scanContext);\n    parseContext->setPpContext(&ppContext);\n\n    //\n    // Push the symbol table to give it an initial scope.  This\n    // push should not have a corresponding pop, so that built-ins\n    // are preserved, and the test for an empty table fails.\n    //\n\n    symbolTable.push();\n\n    const char* builtInShaders[2];\n    size_t builtInLengths[2];\n    builtInShaders[0] = builtIns.c_str();\n    builtInLengths[0] = builtIns.size();\n\n    if (builtInLengths[0] == 0)\n        return true;\n\n    TInputScanner input(1, builtInShaders, builtInLengths);\n    if (! parseContext->parseShaderStrings(ppContext, input) != 0) {\n        infoSink.info.message(EPrefixInternalError, \"Unable to parse built-ins\");\n        printf(\"Unable to parse built-ins\\n%s\\n\", infoSink.info.c_str());\n        printf(\"%s\\n\", builtInShaders[0]);\n\n        return false;\n    }\n\n    return true;\n}\n\nint CommonIndex(EProfile profile, EShLanguage language)\n{\n    return (profile == EEsProfile && language == EShLangFragment) ? EPcFragment : EPcGeneral;\n}\n\n//\n// To initialize per-stage shared tables, with the common table already complete.\n//\nbool InitializeStageSymbolTable(TBuiltInParseables& builtInParseables, int version, EProfile profile, const SpvVersion& spvVersion,\n                                EShLanguage language, EShSource source, TInfoSink& infoSink, TSymbolTable** commonTable,\n                                TSymbolTable** symbolTables)\n{\n    (*symbolTables[language]).adoptLevels(*commonTable[CommonIndex(profile, language)]);\n    if (!InitializeSymbolTable(builtInParseables.getStageString(language), version, profile, spvVersion, language, source,\n                          infoSink, *symbolTables[language]))\n        return false;\n    builtInParseables.identifyBuiltIns(version, profile, spvVersion, language, *symbolTables[language]);\n    if (profile == EEsProfile && version >= 300)\n        (*symbolTables[language]).setNoBuiltInRedeclarations();\n    if (version == 110)\n        (*symbolTables[language]).setSeparateNameSpaces();\n\n    return true;\n}\n\n//\n// Initialize the full set of shareable symbol tables;\n// The common (cross-stage) and those shareable per-stage.\n//\nbool InitializeSymbolTables(TInfoSink& infoSink, TSymbolTable** commonTable,  TSymbolTable** symbolTables, int version, EProfile profile, const SpvVersion& spvVersion, EShSource source)\n{\n    bool success = true;\n    std::unique_ptr<TBuiltInParseables> builtInParseables(CreateBuiltInParseables(infoSink, source));\n\n    if (builtInParseables == nullptr)\n        return false;\n\n    builtInParseables->initialize(version, profile, spvVersion);\n\n    // do the common tables\n    success &= InitializeSymbolTable(builtInParseables->getCommonString(), version, profile, spvVersion, EShLangVertex, source,\n                          infoSink, *commonTable[EPcGeneral]);\n    if (profile == EEsProfile)\n        success &= InitializeSymbolTable(builtInParseables->getCommonString(), version, profile, spvVersion, EShLangFragment, source,\n                              infoSink, *commonTable[EPcFragment]);\n\n    // do the per-stage tables\n\n    // always have vertex and fragment\n    success &= InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangVertex, source,\n                               infoSink, commonTable, symbolTables);\n    success &= InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangFragment, source,\n                               infoSink, commonTable, symbolTables);\n\n    // check for tessellation\n    if ((profile != EEsProfile && version >= 150) ||\n        (profile == EEsProfile && version >= 310)) {\n        success &= InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangTessControl, source,\n                                   infoSink, commonTable, symbolTables);\n        success &= InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangTessEvaluation, source,\n                                   infoSink, commonTable, symbolTables);\n    }\n\n    // check for geometry\n    if ((profile != EEsProfile && version >= 150) ||\n        (profile == EEsProfile && version >= 310))\n        success &= InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangGeometry, source,\n                                   infoSink, commonTable, symbolTables);\n\n    // check for compute\n    if ((profile != EEsProfile && version >= 420) ||\n        (profile == EEsProfile && version >= 310))\n        success &= InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangCompute, source,\n                                   infoSink, commonTable, symbolTables);\n\n    // check for ray tracing stages\n    if (profile != EEsProfile && version >= 450) {\n        success &= InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangRayGen, source,\n            infoSink, commonTable, symbolTables);\n        success &= InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangIntersect, source,\n            infoSink, commonTable, symbolTables);\n        success &= InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangAnyHit, source,\n            infoSink, commonTable, symbolTables);\n        success &= InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangClosestHit, source,\n            infoSink, commonTable, symbolTables);\n        success &= InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangMiss, source,\n            infoSink, commonTable, symbolTables);\n        success &= InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangCallable, source,\n            infoSink, commonTable, symbolTables);\n    }\n\n    // check for mesh\n    if ((profile != EEsProfile && version >= 450) ||\n        (profile == EEsProfile && version >= 320))\n        success &= InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangMesh, source,\n                                   infoSink, commonTable, symbolTables);\n\n    // check for task\n    if ((profile != EEsProfile && version >= 450) ||\n        (profile == EEsProfile && version >= 320))\n        success &= InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangTask, source,\n                                   infoSink, commonTable, symbolTables);\n\n    return success;\n}\n\nbool AddContextSpecificSymbols(const TBuiltInResource* resources, TInfoSink& infoSink, TSymbolTable& symbolTable, int version,\n                               EProfile profile, const SpvVersion& spvVersion, EShLanguage language, EShSource source)\n{\n    std::unique_ptr<TBuiltInParseables> builtInParseables(CreateBuiltInParseables(infoSink, source));\n\n    if (builtInParseables == nullptr)\n        return false;\n\n    builtInParseables->initialize(*resources, version, profile, spvVersion, language);\n    if (!InitializeSymbolTable(builtInParseables->getCommonString(), version, profile, spvVersion, language, source, infoSink, symbolTable))\n        return false;\n    builtInParseables->identifyBuiltIns(version, profile, spvVersion, language, symbolTable, *resources);\n\n    return true;\n}\n\n//\n// To do this on the fly, we want to leave the current state of our thread's\n// pool allocator intact, so:\n//  - Switch to a new pool for parsing the built-ins\n//  - Do the parsing, which builds the symbol table, using the new pool\n//  - Switch to the process-global pool to save a copy of the resulting symbol table\n//  - Free up the new pool used to parse the built-ins\n//  - Switch back to the original thread's pool\n//\n// This only gets done the first time any thread needs a particular symbol table\n// (lazy evaluation).\n//\nbool SetupBuiltinSymbolTable(int version, EProfile profile, const SpvVersion& spvVersion, EShSource source)\n{\n    TInfoSink infoSink;\n    bool success;\n\n    // Make sure only one thread tries to do this at a time\n#ifndef DISABLE_THREAD_SUPPORT\n    const std::lock_guard<std::mutex> lock(init_lock);\n#endif\n\n    // See if it's already been done for this version/profile combination\n    int versionIndex = MapVersionToIndex(version);\n    int spvVersionIndex = MapSpvVersionToIndex(spvVersion);\n    int profileIndex = MapProfileToIndex(profile);\n    int sourceIndex = MapSourceToIndex(source);\n    if (CommonSymbolTable[versionIndex][spvVersionIndex][profileIndex][sourceIndex][EPcGeneral]) {\n        return true;\n    }\n\n    // Switch to a new pool\n    TPoolAllocator& previousAllocator = GetThreadPoolAllocator();\n    TPoolAllocator* builtInPoolAllocator = new TPoolAllocator;\n    SetThreadPoolAllocator(builtInPoolAllocator);\n\n    // Dynamically allocate the local symbol tables so we can control when they are deallocated WRT when the pool is popped.\n    TSymbolTable* commonTable[EPcCount];\n    TSymbolTable* stageTables[EShLangCount];\n    for (int precClass = 0; precClass < EPcCount; ++precClass)\n        commonTable[precClass] = new TSymbolTable;\n    for (int stage = 0; stage < EShLangCount; ++stage)\n        stageTables[stage] = new TSymbolTable;\n\n    // Generate the local symbol tables using the new pool\n    if (!InitializeSymbolTables(infoSink, commonTable, stageTables, version, profile, spvVersion, source)) {\n        success = false;\n        goto cleanup;\n    }\n\n    // Switch to the process-global pool\n    SetThreadPoolAllocator(PerProcessGPA);\n\n    // Copy the local symbol tables from the new pool to the global tables using the process-global pool\n    for (int precClass = 0; precClass < EPcCount; ++precClass) {\n        if (! commonTable[precClass]->isEmpty()) {\n            CommonSymbolTable[versionIndex][spvVersionIndex][profileIndex][sourceIndex][precClass] = new TSymbolTable;\n            CommonSymbolTable[versionIndex][spvVersionIndex][profileIndex][sourceIndex][precClass]->copyTable(*commonTable[precClass]);\n            CommonSymbolTable[versionIndex][spvVersionIndex][profileIndex][sourceIndex][precClass]->readOnly();\n        }\n    }\n    for (int stage = 0; stage < EShLangCount; ++stage) {\n        if (! stageTables[stage]->isEmpty()) {\n            SharedSymbolTables[versionIndex][spvVersionIndex][profileIndex][sourceIndex][stage] = new TSymbolTable;\n            SharedSymbolTables[versionIndex][spvVersionIndex][profileIndex][sourceIndex][stage]->adoptLevels(*CommonSymbolTable\n                              [versionIndex][spvVersionIndex][profileIndex][sourceIndex][CommonIndex(profile, (EShLanguage)stage)]);\n            SharedSymbolTables[versionIndex][spvVersionIndex][profileIndex][sourceIndex][stage]->copyTable(*stageTables[stage]);\n            SharedSymbolTables[versionIndex][spvVersionIndex][profileIndex][sourceIndex][stage]->readOnly();\n        }\n    }\n    success = true;\n\ncleanup:\n    // Clean up the local tables before deleting the pool they used.\n    for (int precClass = 0; precClass < EPcCount; ++precClass)\n        delete commonTable[precClass];\n    for (int stage = 0; stage < EShLangCount; ++stage)\n        delete stageTables[stage];\n\n    delete builtInPoolAllocator;\n    SetThreadPoolAllocator(&previousAllocator);\n\n    return success;\n}\n\n// Function to Print all builtins\nvoid DumpBuiltinSymbolTable(TInfoSink& infoSink, const TSymbolTable& symbolTable)\n{\n    infoSink.debug << \"BuiltinSymbolTable {\\n\";\n\n    symbolTable.dump(infoSink, true);\n\n    infoSink.debug << \"}\\n\";\n}\n\n// Return true if the shader was correctly specified for version/profile/stage.\nbool DeduceVersionProfile(TInfoSink& infoSink, EShLanguage stage, bool versionNotFirst, int defaultVersion,\n                          EShSource source, int& version, EProfile& profile, const SpvVersion& spvVersion)\n{\n    const int FirstProfileVersion = 150;\n    bool correct = true;\n\n    if (source == EShSourceHlsl) {\n        version = 500;          // shader model; currently a characteristic of glslang, not the input\n        profile = ECoreProfile; // allow doubles in prototype parsing\n        return correct;\n    }\n\n    // Get a version...\n    if (version == 0) {\n        version = defaultVersion;\n        // infoSink.info.message(EPrefixWarning, \"#version: statement missing; use #version on first line of shader\");\n    }\n\n    // Get a good profile...\n    if (profile == ENoProfile) {\n        if (version == 300 || version == 310 || version == 320) {\n            correct = false;\n            infoSink.info.message(EPrefixError, \"#version: versions 300, 310, and 320 require specifying the 'es' profile\");\n            profile = EEsProfile;\n        } else if (version == 100)\n            profile = EEsProfile;\n        else if (version >= FirstProfileVersion)\n            profile = ECoreProfile;\n        else\n            profile = ENoProfile;\n    } else {\n        // a profile was provided...\n        if (version < 150) {\n            correct = false;\n            infoSink.info.message(EPrefixError, \"#version: versions before 150 do not allow a profile token\");\n            if (version == 100)\n                profile = EEsProfile;\n            else\n                profile = ENoProfile;\n        } else if (version == 300 || version == 310 || version == 320) {\n            if (profile != EEsProfile) {\n                correct = false;\n                infoSink.info.message(EPrefixError, \"#version: versions 300, 310, and 320 support only the es profile\");\n            }\n            profile = EEsProfile;\n        } else {\n            if (profile == EEsProfile) {\n                correct = false;\n                infoSink.info.message(EPrefixError, \"#version: only version 300, 310, and 320 support the es profile\");\n                if (version >= FirstProfileVersion)\n                    profile = ECoreProfile;\n                else\n                    profile = ENoProfile;\n            }\n            // else: typical desktop case... e.g., \"#version 410 core\"\n        }\n    }\n\n    // Fix version...\n    switch (version) {\n    // ES versions\n    case 100: break;\n    case 300: break;\n    case 310: break;\n    case 320: break;\n\n    // desktop versions\n    case 110: break;\n    case 120: break;\n    case 130: break;\n    case 140: break;\n    case 150: break;\n    case 330: break;\n    case 400: break;\n    case 410: break;\n    case 420: break;\n    case 430: break;\n    case 440: break;\n    case 450: break;\n    case 460: break;\n\n    // unknown version\n    default:\n        correct = false;\n        infoSink.info.message(EPrefixError, \"version not supported\");\n        if (profile == EEsProfile)\n            version = 310;\n        else {\n            version = 450;\n            profile = ECoreProfile;\n        }\n        break;\n    }\n\n    // Correct for stage type...\n    switch (stage) {\n    case EShLangGeometry:\n        if ((profile == EEsProfile && version < 310) ||\n            (profile != EEsProfile && version < 150)) {\n            correct = false;\n            infoSink.info.message(EPrefixError, \"#version: geometry shaders require es profile with version 310 or non-es profile with version 150 or above\");\n            version = (profile == EEsProfile) ? 310 : 150;\n            if (profile == EEsProfile || profile == ENoProfile)\n                profile = ECoreProfile;\n        }\n        break;\n    case EShLangTessControl:\n    case EShLangTessEvaluation:\n        if ((profile == EEsProfile && version < 310) ||\n            (profile != EEsProfile && version < 150)) {\n            correct = false;\n            infoSink.info.message(EPrefixError, \"#version: tessellation shaders require es profile with version 310 or non-es profile with version 150 or above\");\n            version = (profile == EEsProfile) ? 310 : 400; // 150 supports the extension, correction is to 400 which does not\n            if (profile == EEsProfile || profile == ENoProfile)\n                profile = ECoreProfile;\n        }\n        break;\n    case EShLangCompute:\n        if ((profile == EEsProfile && version < 310) ||\n            (profile != EEsProfile && version < 420)) {\n            correct = false;\n            infoSink.info.message(EPrefixError, \"#version: compute shaders require es profile with version 310 or above, or non-es profile with version 420 or above\");\n            version = profile == EEsProfile ? 310 : 420;\n        }\n        break;\n    case EShLangRayGen:\n    case EShLangIntersect:\n    case EShLangAnyHit:\n    case EShLangClosestHit:\n    case EShLangMiss:\n    case EShLangCallable:\n        if (profile == EEsProfile || version < 460) {\n            correct = false;\n            infoSink.info.message(EPrefixError, \"#version: ray tracing shaders require non-es profile with version 460 or above\");\n            version = 460;\n        }\n        break;\n    case EShLangMesh:\n    case EShLangTask:\n        if ((profile == EEsProfile && version < 320) ||\n            (profile != EEsProfile && version < 450)) {\n            correct = false;\n            infoSink.info.message(EPrefixError, \"#version: mesh/task shaders require es profile with version 320 or above, or non-es profile with version 450 or above\");\n            version = profile == EEsProfile ? 320 : 450;\n        }\n        break;\n    default:\n        break;\n    }\n\n    if (profile == EEsProfile && version >= 300 && versionNotFirst) {\n        correct = false;\n        infoSink.info.message(EPrefixError, \"#version: statement must appear first in es-profile shader; before comments or newlines\");\n    }\n\n    // Check for SPIR-V compatibility\n    if (spvVersion.spv != 0) {\n        switch (profile) {\n        case EEsProfile:\n            if (version < 310) {\n                correct = false;\n                infoSink.info.message(EPrefixError, \"#version: ES shaders for SPIR-V require version 310 or higher\");\n                version = 310;\n            }\n            break;\n        case ECompatibilityProfile:\n            infoSink.info.message(EPrefixError, \"#version: compilation for SPIR-V does not support the compatibility profile\");\n            break;\n        default:\n            if (spvVersion.vulkan > 0 && version < 140) {\n                correct = false;\n                infoSink.info.message(EPrefixError, \"#version: Desktop shaders for Vulkan SPIR-V require version 140 or higher\");\n                version = 140;\n            }\n            if (spvVersion.openGl >= 100 && version < 330) {\n                correct = false;\n                infoSink.info.message(EPrefixError, \"#version: Desktop shaders for OpenGL SPIR-V require version 330 or higher\");\n                version = 330;\n            }\n            break;\n        }\n    }\n\n    return correct;\n}\n\n// There are multiple paths in for setting environment stuff.\n// TEnvironment takes precedence, for what it sets, so sort all this out.\n// Ideally, the internal code could be made to use TEnvironment, but for\n// now, translate it to the historically used parameters.\nvoid TranslateEnvironment(const TEnvironment* environment, EShMessages& messages, EShSource& source,\n                          EShLanguage& stage, SpvVersion& spvVersion)\n{\n    // Set up environmental defaults, first ignoring 'environment'.\n    if (messages & EShMsgSpvRules)\n        spvVersion.spv = EShTargetSpv_1_0;\n    if (messages & EShMsgVulkanRules) {\n        spvVersion.vulkan = EShTargetVulkan_1_0;\n        spvVersion.vulkanGlsl = 100;\n    } else if (spvVersion.spv != 0)\n        spvVersion.openGl = 100;\n\n    // Now, override, based on any content set in 'environment'.\n    // 'environment' must be cleared to ESh*None settings when items\n    // are not being set.\n    if (environment != nullptr) {\n        // input language\n        if (environment->input.languageFamily != EShSourceNone) {\n            stage = environment->input.stage;\n            switch (environment->input.dialect) {\n            case EShClientNone:\n                break;\n            case EShClientVulkan:\n                spvVersion.vulkanGlsl = environment->input.dialectVersion;\n                spvVersion.vulkanRelaxed = environment->input.vulkanRulesRelaxed;\n                break;\n            case EShClientOpenGL:\n                spvVersion.openGl = environment->input.dialectVersion;\n                break;\n            case EShClientCount:\n                assert(0);\n                break;\n            }\n            switch (environment->input.languageFamily) {\n            case EShSourceNone:\n                break;\n            case EShSourceGlsl:\n                source = EShSourceGlsl;\n                messages = static_cast<EShMessages>(messages & ~EShMsgReadHlsl);\n                break;\n            case EShSourceHlsl:\n                source = EShSourceHlsl;\n                messages = static_cast<EShMessages>(messages | EShMsgReadHlsl);\n                break;\n            case EShSourceCount:\n                assert(0);\n                break;\n            }\n        }\n\n        // client\n        switch (environment->client.client) {\n        case EShClientVulkan:\n            spvVersion.vulkan = environment->client.version;\n            break;\n        default:\n            break;\n        }\n\n        // generated code\n        switch (environment->target.language) {\n        case EshTargetSpv:\n            spvVersion.spv = environment->target.version;\n            break;\n        default:\n            break;\n        }\n    }\n}\n\n// Most processes are recorded when set in the intermediate representation,\n// These are the few that are not.\nvoid RecordProcesses(TIntermediate& intermediate, EShMessages messages, const std::string& sourceEntryPointName)\n{\n    if ((messages & EShMsgRelaxedErrors) != 0)\n        intermediate.addProcess(\"relaxed-errors\");\n    if ((messages & EShMsgSuppressWarnings) != 0)\n        intermediate.addProcess(\"suppress-warnings\");\n    if ((messages & EShMsgKeepUncalled) != 0)\n        intermediate.addProcess(\"keep-uncalled\");\n    if (sourceEntryPointName.size() > 0) {\n        intermediate.addProcess(\"source-entrypoint\");\n        intermediate.addProcessArgument(sourceEntryPointName);\n    }\n}\n\n// This is the common setup and cleanup code for PreprocessDeferred and\n// CompileDeferred.\n// It takes any callable with a signature of\n//  bool (TParseContextBase& parseContext, TPpContext& ppContext,\n//                  TInputScanner& input, bool versionWillBeError,\n//                  TSymbolTable& , TIntermediate& ,\n//                  EShOptimizationLevel , EShMessages );\n// Which returns false if a failure was detected and true otherwise.\n//\ntemplate<typename ProcessingContext>\nbool ProcessDeferred(\n    TCompiler* compiler,\n    const char* const shaderStrings[],\n    const int numStrings,\n    const int* inputLengths,\n    const char* const stringNames[],\n    const char* customPreamble,\n    const EShOptimizationLevel optLevel,\n    const TBuiltInResource* resources,\n    int defaultVersion,  // use 100 for ES environment, 110 for desktop; this is the GLSL version, not SPIR-V or Vulkan\n    EProfile defaultProfile,\n    // set version/profile to defaultVersion/defaultProfile regardless of the #version\n    // directive in the source code\n    bool forceDefaultVersionAndProfile,\n    int overrideVersion, // overrides version specified by #version or default version\n    bool forwardCompatible,     // give errors for use of deprecated features\n    EShMessages messages,       // warnings/errors/AST; things to print out\n    TIntermediate& intermediate, // returned tree, etc.\n    ProcessingContext& processingContext,\n    bool requireNonempty,\n    TShader::Includer& includer,\n    const std::string sourceEntryPointName = \"\",\n    const TEnvironment* environment = nullptr,  // optional way of fully setting all versions, overriding the above\n    bool compileOnly = false)\n{\n    // This must be undone (.pop()) by the caller, after it finishes consuming the created tree.\n    GetThreadPoolAllocator().push();\n\n    if (numStrings == 0)\n        return true;\n\n    // Move to length-based strings, rather than null-terminated strings.\n    // Also, add strings to include the preamble and to ensure the shader is not null,\n    // which lets the grammar accept what was a null (post preprocessing) shader.\n    //\n    // Shader will look like\n    //   string 0:                system preamble\n    //   string 1:                custom preamble\n    //   string 2...numStrings+1: user's shader\n    //   string numStrings+2:     \"int;\"\n    const int numPre = 2;\n    const int numPost = requireNonempty? 1 : 0;\n    const int numTotal = numPre + numStrings + numPost;\n    std::unique_ptr<size_t[]> lengths(new size_t[numTotal]);\n    std::unique_ptr<const char*[]> strings(new const char*[numTotal]);\n    std::unique_ptr<const char*[]> names(new const char*[numTotal]);\n    for (int s = 0; s < numStrings; ++s) {\n        strings[s + numPre] = shaderStrings[s];\n        if (inputLengths == nullptr || inputLengths[s] < 0)\n            lengths[s + numPre] = strlen(shaderStrings[s]);\n        else\n            lengths[s + numPre] = inputLengths[s];\n    }\n    if (stringNames != nullptr) {\n        for (int s = 0; s < numStrings; ++s)\n            names[s + numPre] = stringNames[s];\n    } else {\n        for (int s = 0; s < numStrings; ++s)\n            names[s + numPre] = nullptr;\n    }\n\n    // Get all the stages, languages, clients, and other environment\n    // stuff sorted out.\n    EShSource sourceGuess = (messages & EShMsgReadHlsl) != 0 ? EShSourceHlsl : EShSourceGlsl;\n    SpvVersion spvVersion;\n    EShLanguage stage = compiler->getLanguage();\n    TranslateEnvironment(environment, messages, sourceGuess, stage, spvVersion);\n#ifdef ENABLE_HLSL\n    EShSource source = sourceGuess;\n    if (environment != nullptr && environment->target.hlslFunctionality1)\n        intermediate.setHlslFunctionality1();\n#else\n    const EShSource source = EShSourceGlsl;\n#endif\n    // First, without using the preprocessor or parser, find the #version, so we know what\n    // symbol tables, processing rules, etc. to set up.  This does not need the extra strings\n    // outlined above, just the user shader, after the system and user preambles.\n    glslang::TInputScanner userInput(numStrings, &strings[numPre], &lengths[numPre]);\n    int version = 0;\n    EProfile profile = ENoProfile;\n    bool versionNotFirstToken = false;\n    bool versionNotFirst = (source == EShSourceHlsl)\n                                ? true\n                                : userInput.scanVersion(version, profile, versionNotFirstToken);\n    bool versionNotFound = version == 0;\n    if (forceDefaultVersionAndProfile && source == EShSourceGlsl) {\n        if (! (messages & EShMsgSuppressWarnings) && ! versionNotFound &&\n            (version != defaultVersion || profile != defaultProfile)) {\n            compiler->infoSink.info << \"Warning, (version, profile) forced to be (\"\n                                    << defaultVersion << \", \" << ProfileName(defaultProfile)\n                                    << \"), while in source code it is (\"\n                                    << version << \", \" << ProfileName(profile) << \")\\n\";\n        }\n\n        if (versionNotFound) {\n            versionNotFirstToken = false;\n            versionNotFirst = false;\n            versionNotFound = false;\n        }\n        version = defaultVersion;\n        profile = defaultProfile;\n    }\n    if (source == EShSourceGlsl && overrideVersion != 0) {\n        version = overrideVersion;\n    }\n\n    bool goodVersion = DeduceVersionProfile(compiler->infoSink, stage,\n                                            versionNotFirst, defaultVersion, source, version, profile, spvVersion);\n    bool versionWillBeError = (versionNotFound || (profile == EEsProfile && version >= 300 && versionNotFirst));\n    bool warnVersionNotFirst = false;\n    if (! versionWillBeError && versionNotFirstToken) {\n        if (messages & EShMsgRelaxedErrors)\n            warnVersionNotFirst = true;\n        else\n            versionWillBeError = true;\n    }\n\n    intermediate.setSource(source);\n    intermediate.setVersion(version);\n    intermediate.setProfile(profile);\n    intermediate.setSpv(spvVersion);\n    RecordProcesses(intermediate, messages, sourceEntryPointName);\n    if (spvVersion.vulkan > 0)\n        intermediate.setOriginUpperLeft();\n#ifdef ENABLE_HLSL\n    if ((messages & EShMsgHlslOffsets) || source == EShSourceHlsl)\n        intermediate.setHlslOffsets();\n#endif\n    if (messages & EShMsgDebugInfo) {\n        intermediate.setSourceFile(names[numPre]);\n        for (int s = 0; s < numStrings; ++s) {\n            // The string may not be null-terminated, so make sure we provide\n            // the length along with the string.\n            intermediate.addSourceText(strings[numPre + s], lengths[numPre + s]);\n        }\n    }\n    if (!SetupBuiltinSymbolTable(version, profile, spvVersion, source)) {\n        return false;\n    }\n\n    TSymbolTable* cachedTable = SharedSymbolTables[MapVersionToIndex(version)]\n                                                  [MapSpvVersionToIndex(spvVersion)]\n                                                  [MapProfileToIndex(profile)]\n                                                  [MapSourceToIndex(source)]\n                                                  [stage];\n\n    // Dynamically allocate the symbol table so we can control when it is deallocated WRT the pool.\n    std::unique_ptr<TSymbolTable> symbolTable(new TSymbolTable);\n    if (cachedTable)\n        symbolTable->adoptLevels(*cachedTable);\n\n    if (intermediate.getUniqueId() != 0)\n        symbolTable->overwriteUniqueId(intermediate.getUniqueId());\n\n    // Add built-in symbols that are potentially context dependent;\n    // they get popped again further down.\n    if (! AddContextSpecificSymbols(resources, compiler->infoSink, *symbolTable, version, profile, spvVersion,\n                                    stage, source)) {\n        return false;\n    }\n\n    if (messages & EShMsgBuiltinSymbolTable)\n        DumpBuiltinSymbolTable(compiler->infoSink, *symbolTable);\n\n    //\n    // Now we can process the full shader under proper symbols and rules.\n    //\n\n    std::unique_ptr<TParseContextBase> parseContext(CreateParseContext(*symbolTable, intermediate, version, profile, source,\n                                                    stage, compiler->infoSink,\n                                                    spvVersion, forwardCompatible, messages, false, sourceEntryPointName));\n    parseContext->compileOnly = compileOnly;\n    TPpContext ppContext(*parseContext, names[numPre] ? names[numPre] : \"\", includer);\n\n    // only GLSL (bison triggered, really) needs an externally set scan context\n    glslang::TScanContext scanContext(*parseContext);\n    if (source == EShSourceGlsl)\n        parseContext->setScanContext(&scanContext);\n\n    parseContext->setPpContext(&ppContext);\n    parseContext->setLimits(*resources);\n    if (! goodVersion)\n        parseContext->addError();\n    if (warnVersionNotFirst) {\n        TSourceLoc loc;\n        loc.init();\n        parseContext->warn(loc, \"Illegal to have non-comment, non-whitespace tokens before #version\", \"#version\", \"\");\n    }\n\n    parseContext->initializeExtensionBehavior();\n\n    // Fill in the strings as outlined above.\n    std::string preamble;\n    parseContext->getPreamble(preamble);\n    strings[0] = preamble.c_str();\n    lengths[0] = strlen(strings[0]);\n    names[0] = nullptr;\n    strings[1] = customPreamble;\n    lengths[1] = strlen(strings[1]);\n    names[1] = nullptr;\n    assert(2 == numPre);\n    if (requireNonempty) {\n        const int postIndex = numStrings + numPre;\n        strings[postIndex] = \"\\n int;\";\n        lengths[postIndex] = strlen(strings[numStrings + numPre]);\n        names[postIndex] = nullptr;\n    }\n    TInputScanner fullInput(numStrings + numPre + numPost, strings.get(), lengths.get(), names.get(), numPre, numPost);\n\n    // Push a new symbol allocation scope that will get used for the shader's globals.\n    symbolTable->push();\n\n    bool success = processingContext(*parseContext, ppContext, fullInput,\n                                     versionWillBeError, *symbolTable,\n                                     intermediate, optLevel, messages);\n    intermediate.setUniqueId(symbolTable->getMaxSymbolId());\n    return success;\n}\n\n// Responsible for keeping track of the most recent source string and line in\n// the preprocessor and outputting newlines appropriately if the source string\n// or line changes.\nclass SourceLineSynchronizer {\npublic:\n    SourceLineSynchronizer(const std::function<int()>& lastSourceIndex,\n                           std::string* output)\n      : getLastSourceIndex(lastSourceIndex), output(output), lastSource(-1), lastLine(0) {}\n//    SourceLineSynchronizer(const SourceLineSynchronizer&) = delete;\n//    SourceLineSynchronizer& operator=(const SourceLineSynchronizer&) = delete;\n\n    // Sets the internally tracked source string index to that of the most\n    // recently read token. If we switched to a new source string, returns\n    // true and inserts a newline. Otherwise, returns false and outputs nothing.\n    bool syncToMostRecentString() {\n        if (getLastSourceIndex() != lastSource) {\n            // After switching to a new source string, we need to reset lastLine\n            // because line number resets every time a new source string is\n            // used. We also need to output a newline to separate the output\n            // from the previous source string (if there is one).\n            if (lastSource != -1 || lastLine != 0)\n                *output += '\\n';\n            lastSource = getLastSourceIndex();\n            lastLine = -1;\n            return true;\n        }\n        return false;\n    }\n\n    // Calls syncToMostRecentString() and then sets the internally tracked line\n    // number to tokenLine. If we switched to a new line, returns true and inserts\n    // newlines appropriately. Otherwise, returns false and outputs nothing.\n    bool syncToLine(int tokenLine) {\n        syncToMostRecentString();\n        const bool newLineStarted = lastLine < tokenLine;\n        for (; lastLine < tokenLine; ++lastLine) {\n            if (lastLine > 0) *output += '\\n';\n        }\n        return newLineStarted;\n    }\n\n    // Sets the internally tracked line number to newLineNum.\n    void setLineNum(int newLineNum) { lastLine = newLineNum; }\n\nprivate:\n    SourceLineSynchronizer& operator=(const SourceLineSynchronizer&);\n\n    // A function for getting the index of the last valid source string we've\n    // read tokens from.\n    const std::function<int()> getLastSourceIndex;\n    // output string for newlines.\n    std::string* output;\n    // lastSource is the source string index (starting from 0) of the last token\n    // processed. It is tracked in order for newlines to be inserted when a new\n    // source string starts. -1 means we haven't started processing any source\n    // string.\n    int lastSource;\n    // lastLine is the line number (starting from 1) of the last token processed.\n    // It is tracked in order for newlines to be inserted when a token appears\n    // on a new line. 0 means we haven't started processing any line in the\n    // current source string.\n    int lastLine;\n};\n\n// DoPreprocessing is a valid ProcessingContext template argument,\n// which only performs the preprocessing step of compilation.\n// It places the result in the \"string\" argument to its constructor.\n//\n// This is not an officially supported or fully working path.\nstruct DoPreprocessing {\n    explicit DoPreprocessing(std::string* string): outputString(string) {}\n    bool operator()(TParseContextBase& parseContext, TPpContext& ppContext,\n                    TInputScanner& input, bool versionWillBeError,\n                    TSymbolTable&, TIntermediate&,\n                    EShOptimizationLevel, EShMessages)\n    {\n        // This is a list of tokens that do not require a space before or after.\n        static const std::string noNeededSpaceBeforeTokens = \";)[].,\";\n        static const std::string noNeededSpaceAfterTokens = \".([\";\n        glslang::TPpToken ppToken;\n\n        parseContext.setScanner(&input);\n        ppContext.setInput(input, versionWillBeError);\n\n        std::string outputBuffer;\n        SourceLineSynchronizer lineSync(\n            std::bind(&TInputScanner::getLastValidSourceIndex, &input), &outputBuffer);\n\n        parseContext.setExtensionCallback([&lineSync, &outputBuffer](\n            int line, const char* extension, const char* behavior) {\n                lineSync.syncToLine(line);\n                outputBuffer += \"#extension \";\n                outputBuffer += extension;\n                outputBuffer += \" : \";\n                outputBuffer += behavior;\n        });\n\n        parseContext.setLineCallback([&lineSync, &outputBuffer, &parseContext](\n            int curLineNum, int newLineNum, bool hasSource, int sourceNum, const char* sourceName) {\n            // SourceNum is the number of the source-string that is being parsed.\n            lineSync.syncToLine(curLineNum);\n            outputBuffer += \"#line \";\n            outputBuffer += std::to_string(newLineNum);\n            if (hasSource) {\n                outputBuffer += ' ';\n                if (sourceName != nullptr) {\n                    outputBuffer += '\\\"';\n                    outputBuffer += sourceName;\n                    outputBuffer += '\\\"';\n                } else {\n                    outputBuffer += std::to_string(sourceNum);\n                }\n            }\n            if (parseContext.lineDirectiveShouldSetNextLine()) {\n                // newLineNum is the new line number for the line following the #line\n                // directive. So the new line number for the current line is\n                newLineNum -= 1;\n            }\n            outputBuffer += '\\n';\n            // And we are at the next line of the #line directive now.\n            lineSync.setLineNum(newLineNum + 1);\n        });\n\n        parseContext.setVersionCallback(\n            [&lineSync, &outputBuffer](int line, int version, const char* str) {\n                lineSync.syncToLine(line);\n                outputBuffer += \"#version \";\n                outputBuffer += std::to_string(version);\n                if (str) {\n                    outputBuffer += ' ';\n                    outputBuffer += str;\n                }\n            });\n\n        parseContext.setPragmaCallback([&lineSync, &outputBuffer](\n            int line, const glslang::TVector<glslang::TString>& ops) {\n                lineSync.syncToLine(line);\n                outputBuffer += \"#pragma \";\n                for(size_t i = 0; i < ops.size(); ++i) {\n                    outputBuffer += ops[i].c_str();\n                }\n        });\n\n        parseContext.setErrorCallback([&lineSync, &outputBuffer](\n            int line, const char* errorMessage) {\n                lineSync.syncToLine(line);\n                outputBuffer += \"#error \";\n                outputBuffer += errorMessage;\n        });\n\n        int lastToken = EndOfInput; // lastToken records the last token processed.\n        std::string lastTokenName;\n        do {\n            int token = ppContext.tokenize(ppToken);\n            if (token == EndOfInput)\n                break;\n\n            bool isNewString = lineSync.syncToMostRecentString();\n            bool isNewLine = lineSync.syncToLine(ppToken.loc.line);\n\n            if (isNewLine) {\n                // Don't emit whitespace onto empty lines.\n                // Copy any whitespace characters at the start of a line\n                // from the input to the output.\n                outputBuffer += std::string(ppToken.loc.column - 1, ' ');\n            }\n\n            // Output a space in between tokens, but not at the start of a line,\n            // and also not around special tokens. This helps with readability\n            // and consistency.\n            if (!isNewString && !isNewLine && lastToken != EndOfInput) {\n                // left parenthesis need a leading space, except it is in a function-call-like context.\n                // examples: `for (xxx)`, `a * (b + c)`, `vec(2.0)`, `foo(x, y, z)`\n                if (token == '(') {\n                    if (lastToken != PpAtomIdentifier ||\n                        lastTokenName == \"if\" ||\n                        lastTokenName == \"for\" ||\n                        lastTokenName == \"while\" ||\n                        lastTokenName == \"switch\")\n                        outputBuffer += ' ';\n                } else if ((noNeededSpaceBeforeTokens.find((char)token) == std::string::npos) &&\n                    (noNeededSpaceAfterTokens.find((char)lastToken) == std::string::npos)) {\n                    outputBuffer += ' ';\n                }\n            }\n            if (token == PpAtomIdentifier)\n                lastTokenName = ppToken.name;\n            lastToken = token;\n            if (token == PpAtomConstString)\n                outputBuffer += \"\\\"\";\n            outputBuffer += ppToken.name;\n            if (token == PpAtomConstString)\n                outputBuffer += \"\\\"\";\n        } while (true);\n        outputBuffer += '\\n';\n        *outputString = std::move(outputBuffer);\n\n        bool success = true;\n        if (parseContext.getNumErrors() > 0) {\n            success = false;\n            parseContext.infoSink.info.prefix(EPrefixError);\n            parseContext.infoSink.info << parseContext.getNumErrors() << \" compilation errors.  No code generated.\\n\\n\";\n        }\n        return success;\n    }\n    std::string* outputString;\n};\n\n// DoFullParse is a valid ProcessingConext template argument for fully\n// parsing the shader.  It populates the \"intermediate\" with the AST.\nstruct DoFullParse{\n  bool operator()(TParseContextBase& parseContext, TPpContext& ppContext,\n                  TInputScanner& fullInput, bool versionWillBeError,\n                  TSymbolTable&, TIntermediate& intermediate,\n                  EShOptimizationLevel optLevel, EShMessages messages)\n    {\n        bool success = true;\n        // Parse the full shader.\n        if (! parseContext.parseShaderStrings(ppContext, fullInput, versionWillBeError))\n            success = false;\n\n        if (success && intermediate.getTreeRoot()) {\n            if (optLevel == EShOptNoGeneration)\n                parseContext.infoSink.info.message(EPrefixNone, \"No errors.  No code generation or linking was requested.\");\n            else\n                success = intermediate.postProcess(intermediate.getTreeRoot(), parseContext.getLanguage());\n        } else if (! success) {\n            parseContext.infoSink.info.prefix(EPrefixError);\n            parseContext.infoSink.info << parseContext.getNumErrors() << \" compilation errors.  No code generated.\\n\\n\";\n        }\n\n        if (messages & EShMsgAST)\n            intermediate.output(parseContext.infoSink, true);\n\n        return success;\n    }\n};\n\n// Take a single compilation unit, and run the preprocessor on it.\n// Return: True if there were no issues found in preprocessing,\n//         False if during preprocessing any unknown version, pragmas or\n//         extensions were found.\n//\n// NOTE: Doing just preprocessing to obtain a correct preprocessed shader string\n// is not an officially supported or fully working path.\nbool PreprocessDeferred(\n    TCompiler* compiler,\n    const char* const shaderStrings[],\n    const int numStrings,\n    const int* inputLengths,\n    const char* const stringNames[],\n    const char* preamble,\n    const EShOptimizationLevel optLevel,\n    const TBuiltInResource* resources,\n    int defaultVersion,         // use 100 for ES environment, 110 for desktop\n    EProfile defaultProfile,\n    bool forceDefaultVersionAndProfile,\n    int overrideVersion,        // use 0 if not overriding GLSL version\n    bool forwardCompatible,     // give errors for use of deprecated features\n    EShMessages messages,       // warnings/errors/AST; things to print out\n    TShader::Includer& includer,\n    TIntermediate& intermediate, // returned tree, etc.\n    std::string* outputString,\n    TEnvironment* environment = nullptr)\n{\n    DoPreprocessing parser(outputString);\n    return ProcessDeferred(compiler, shaderStrings, numStrings, inputLengths, stringNames,\n                           preamble, optLevel, resources, defaultVersion,\n                           defaultProfile, forceDefaultVersionAndProfile, overrideVersion,\n                           forwardCompatible, messages, intermediate, parser,\n                           false, includer, \"\", environment);\n}\n\n//\n// do a partial compile on the given strings for a single compilation unit\n// for a potential deferred link into a single stage (and deferred full compile of that\n// stage through machine-dependent compilation).\n//\n// all preprocessing, parsing, semantic checks, etc. for a single compilation unit\n// are done here.\n//\n// return:  the tree and other information is filled into the intermediate argument,\n//          and true is returned by the function for success.\n//\nbool CompileDeferred(\n    TCompiler* compiler,\n    const char* const shaderStrings[],\n    const int numStrings,\n    const int* inputLengths,\n    const char* const stringNames[],\n    const char* preamble,\n    const EShOptimizationLevel optLevel,\n    const TBuiltInResource* resources,\n    int defaultVersion,         // use 100 for ES environment, 110 for desktop\n    EProfile defaultProfile,\n    bool forceDefaultVersionAndProfile,\n    int overrideVersion,        // use 0 if not overriding GLSL version\n    bool forwardCompatible,     // give errors for use of deprecated features\n    EShMessages messages,       // warnings/errors/AST; things to print out\n    TIntermediate& intermediate,// returned tree, etc.\n    TShader::Includer& includer,\n    const std::string sourceEntryPointName = \"\",\n    TEnvironment* environment = nullptr,\n    bool compileOnly = false)\n{\n    DoFullParse parser;\n    return ProcessDeferred(compiler, shaderStrings, numStrings, inputLengths, stringNames,\n                           preamble, optLevel, resources, defaultVersion,\n                           defaultProfile, forceDefaultVersionAndProfile, overrideVersion,\n                           forwardCompatible, messages, intermediate, parser,\n                           true, includer, sourceEntryPointName, environment, compileOnly);\n}\n\n} // end anonymous namespace for local functions\n\n//\n// ShInitialize() should be called exactly once per process, not per thread.\n//\nint ShInitialize()\n{\n#ifndef DISABLE_THREAD_SUPPORT\n    const std::lock_guard<std::mutex> lock(init_lock);\n#endif\n    ++NumberOfClients;\n\n    if (PerProcessGPA == nullptr)\n        PerProcessGPA = new TPoolAllocator();\n\n    return 1;\n}\n\n//\n// Driver calls these to create and destroy compiler/linker\n// objects.\n//\n\nShHandle ShConstructCompiler(const EShLanguage language, int /*debugOptions unused*/)\n{\n    TShHandleBase* base = static_cast<TShHandleBase*>(ConstructCompiler(language, 0));\n\n    return reinterpret_cast<void*>(base);\n}\n\nShHandle ShConstructLinker(const EShExecutable executable, int /*debugOptions unused*/)\n{\n    TShHandleBase* base = static_cast<TShHandleBase*>(ConstructLinker(executable, 0));\n\n    return reinterpret_cast<void*>(base);\n}\n\nShHandle ShConstructUniformMap()\n{\n    TShHandleBase* base = static_cast<TShHandleBase*>(ConstructUniformMap());\n\n    return reinterpret_cast<void*>(base);\n}\n\nvoid ShDestruct(ShHandle handle)\n{\n    if (handle == nullptr)\n        return;\n\n    TShHandleBase* base = static_cast<TShHandleBase*>(handle);\n\n    if (base->getAsCompiler())\n        DeleteCompiler(base->getAsCompiler());\n    else if (base->getAsLinker())\n        DeleteLinker(base->getAsLinker());\n    else if (base->getAsUniformMap())\n        DeleteUniformMap(base->getAsUniformMap());\n}\n\n//\n// Cleanup symbol tables\n//\nint ShFinalize()\n{\n#ifndef DISABLE_THREAD_SUPPORT\n    const std::lock_guard<std::mutex> lock(init_lock);\n#endif\n    --NumberOfClients;\n    assert(NumberOfClients >= 0);\n    if (NumberOfClients > 0)\n        return 1;\n\n    for (int version = 0; version < VersionCount; ++version) {\n        for (int spvVersion = 0; spvVersion < SpvVersionCount; ++spvVersion) {\n            for (int p = 0; p < ProfileCount; ++p) {\n                for (int source = 0; source < SourceCount; ++source) {\n                    for (int stage = 0; stage < EShLangCount; ++stage) {\n                        delete SharedSymbolTables[version][spvVersion][p][source][stage];\n                        SharedSymbolTables[version][spvVersion][p][source][stage] = nullptr;\n                    }\n                }\n            }\n        }\n    }\n\n    for (int version = 0; version < VersionCount; ++version) {\n        for (int spvVersion = 0; spvVersion < SpvVersionCount; ++spvVersion) {\n            for (int p = 0; p < ProfileCount; ++p) {\n                for (int source = 0; source < SourceCount; ++source) {\n                    for (int pc = 0; pc < EPcCount; ++pc) {\n                        delete CommonSymbolTable[version][spvVersion][p][source][pc];\n                        CommonSymbolTable[version][spvVersion][p][source][pc] = nullptr;\n                    }\n                }\n            }\n        }\n    }\n\n    if (PerProcessGPA != nullptr) {\n        delete PerProcessGPA;\n        PerProcessGPA = nullptr;\n    }\n\n    return 1;\n}\n\n//\n// Do a full compile on the given strings for a single compilation unit\n// forming a complete stage.  The result of the machine dependent compilation\n// is left in the provided compile object.\n//\n// Return:  The return value is really boolean, indicating\n// success (1) or failure (0).\n//\nint ShCompile(\n    const ShHandle handle,\n    const char* const shaderStrings[],\n    const int numStrings,\n    const int* inputLengths,\n    const EShOptimizationLevel optLevel,\n    const TBuiltInResource* resources,\n    int /*debugOptions*/,\n    int defaultVersion,        // use 100 for ES environment, 110 for desktop\n    bool forwardCompatible,    // give errors for use of deprecated features\n    EShMessages messages,       // warnings/errors/AST; things to print out,\n    const char *shaderFileName // the filename\n    )\n{\n    // Map the generic handle to the C++ object\n    if (handle == nullptr)\n        return 0;\n\n    TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle);\n    TCompiler* compiler = base->getAsCompiler();\n    if (compiler == nullptr)\n        return 0;\n\n    SetThreadPoolAllocator(compiler->getPool());\n\n    compiler->infoSink.info.erase();\n    compiler->infoSink.debug.erase();\n    compiler->infoSink.info.setShaderFileName(shaderFileName);\n    compiler->infoSink.debug.setShaderFileName(shaderFileName);\n\n\n    TIntermediate intermediate(compiler->getLanguage());\n    TShader::ForbidIncluder includer;\n    bool success = CompileDeferred(compiler, shaderStrings, numStrings, inputLengths, nullptr,\n                                   \"\", optLevel, resources, defaultVersion, ENoProfile, false, 0,\n                                   forwardCompatible, messages, intermediate, includer);\n\n    //\n    // Call the machine dependent compiler\n    //\n    if (success && intermediate.getTreeRoot() && optLevel != EShOptNoGeneration)\n        success = compiler->compile(intermediate.getTreeRoot(), intermediate.getVersion(), intermediate.getProfile());\n\n    intermediate.removeTree();\n\n    // Throw away all the temporary memory used by the compilation process.\n    // The push was done in the CompileDeferred() call above.\n    GetThreadPoolAllocator().pop();\n\n    return success ? 1 : 0;\n}\n\n//\n// Link the given compile objects.\n//\n// Return:  The return value of is really boolean, indicating\n// success or failure.\n//\nint ShLinkExt(\n    const ShHandle linkHandle,\n    const ShHandle compHandles[],\n    const int numHandles)\n{\n    if (linkHandle == nullptr || numHandles == 0)\n        return 0;\n\n    THandleList cObjects;\n\n    for (int i = 0; i < numHandles; ++i) {\n        if (compHandles[i] == nullptr)\n            return 0;\n        TShHandleBase* base = reinterpret_cast<TShHandleBase*>(compHandles[i]);\n        if (base->getAsLinker()) {\n            cObjects.push_back(base->getAsLinker());\n        }\n        if (base->getAsCompiler())\n            cObjects.push_back(base->getAsCompiler());\n\n        if (cObjects[i] == nullptr)\n            return 0;\n    }\n\n    TShHandleBase* base = reinterpret_cast<TShHandleBase*>(linkHandle);\n    TLinker* linker = static_cast<TLinker*>(base->getAsLinker());\n\n    if (linker == nullptr)\n        return 0;\n    \n    SetThreadPoolAllocator(linker->getPool());\n    linker->infoSink.info.erase();\n\n    for (int i = 0; i < numHandles; ++i) {\n        if (cObjects[i]->getAsCompiler()) {\n            if (! cObjects[i]->getAsCompiler()->linkable()) {\n                linker->infoSink.info.message(EPrefixError, \"Not all shaders have valid object code.\");\n                return 0;\n            }\n        }\n    }\n\n    bool ret = linker->link(cObjects);\n\n    return ret ? 1 : 0;\n}\n\n//\n// ShSetEncrpytionMethod is a place-holder for specifying\n// how source code is encrypted.\n//\nvoid ShSetEncryptionMethod(ShHandle handle)\n{\n    if (handle == nullptr)\n        return;\n}\n\n//\n// Return any compiler/linker/uniformmap log of messages for the application.\n//\nconst char* ShGetInfoLog(const ShHandle handle)\n{\n    if (handle == nullptr)\n        return nullptr;\n\n    TShHandleBase* base = static_cast<TShHandleBase*>(handle);\n    TInfoSink* infoSink;\n\n    if (base->getAsCompiler())\n        infoSink = &(base->getAsCompiler()->getInfoSink());\n    else if (base->getAsLinker())\n        infoSink = &(base->getAsLinker()->getInfoSink());\n    else\n        return nullptr;\n\n    infoSink->info << infoSink->debug.c_str();\n    return infoSink->info.c_str();\n}\n\n//\n// Return the resulting binary code from the link process.  Structure\n// is machine dependent.\n//\nconst void* ShGetExecutable(const ShHandle handle)\n{\n    if (handle == nullptr)\n        return nullptr;\n\n    TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle);\n\n    TLinker* linker = static_cast<TLinker*>(base->getAsLinker());\n    if (linker == nullptr)\n        return nullptr;\n\n    return linker->getObjectCode();\n}\n\n//\n// Let the linker know where the application said it's attributes are bound.\n// The linker does not use these values, they are remapped by the ICD or\n// hardware.  It just needs them to know what's aliased.\n//\n// Return:  The return value of is really boolean, indicating\n// success or failure.\n//\nint ShSetVirtualAttributeBindings(const ShHandle handle, const ShBindingTable* table)\n{\n    if (handle == nullptr)\n        return 0;\n\n    TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle);\n    TLinker* linker = static_cast<TLinker*>(base->getAsLinker());\n\n    if (linker == nullptr)\n        return 0;\n\n    linker->setAppAttributeBindings(table);\n\n    return 1;\n}\n\n//\n// Let the linker know where the predefined attributes have to live.\n//\nint ShSetFixedAttributeBindings(const ShHandle handle, const ShBindingTable* table)\n{\n    if (handle == nullptr)\n        return 0;\n\n    TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle);\n    TLinker* linker = static_cast<TLinker*>(base->getAsLinker());\n\n    if (linker == nullptr)\n        return 0;\n\n    linker->setFixedAttributeBindings(table);\n    return 1;\n}\n\n//\n// Some attribute locations are off-limits to the linker...\n//\nint ShExcludeAttributes(const ShHandle handle, int *attributes, int count)\n{\n    if (handle == nullptr)\n        return 0;\n\n    TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle);\n    TLinker* linker = static_cast<TLinker*>(base->getAsLinker());\n    if (linker == nullptr)\n        return 0;\n\n    linker->setExcludedAttributes(attributes, count);\n\n    return 1;\n}\n\n//\n// Return the index for OpenGL to use for knowing where a uniform lives.\n//\n// Return:  The return value of is really boolean, indicating\n// success or failure.\n//\nint ShGetUniformLocation(const ShHandle handle, const char* name)\n{\n    if (handle == nullptr)\n        return -1;\n\n    TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle);\n    TUniformMap* uniformMap= base->getAsUniformMap();\n    if (uniformMap == nullptr)\n        return -1;\n\n    return uniformMap->getLocation(name);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////\n//\n// Deferred-Lowering C++ Interface\n// -----------------------------------\n//\n// Below is a new alternate C++ interface that might potentially replace the above\n// opaque handle-based interface.\n//\n// See more detailed comment in ShaderLang.h\n//\n\nnamespace glslang {\n\nVersion GetVersion()\n{\n    Version version;\n    version.major = GLSLANG_VERSION_MAJOR;\n    version.minor = GLSLANG_VERSION_MINOR;\n    version.patch = GLSLANG_VERSION_PATCH;\n    version.flavor = GLSLANG_VERSION_FLAVOR;\n    return version;\n}\n\n#define QUOTE(s) #s\n#define STR(n) QUOTE(n)\n\nconst char* GetEsslVersionString()\n{\n    return \"OpenGL ES GLSL 3.20 glslang Khronos. \" STR(GLSLANG_VERSION_MAJOR) \".\" STR(GLSLANG_VERSION_MINOR) \".\" STR(\n        GLSLANG_VERSION_PATCH) GLSLANG_VERSION_FLAVOR;\n}\n\nconst char* GetGlslVersionString()\n{\n    return \"4.60 glslang Khronos. \" STR(GLSLANG_VERSION_MAJOR) \".\" STR(GLSLANG_VERSION_MINOR) \".\" STR(\n        GLSLANG_VERSION_PATCH) GLSLANG_VERSION_FLAVOR;\n}\n\nint GetKhronosToolId()\n{\n    return 8;\n}\n\nbool InitializeProcess()\n{\n    return ShInitialize() != 0;\n}\n\nvoid FinalizeProcess()\n{\n    ShFinalize();\n}\n\nclass TDeferredCompiler : public TCompiler {\npublic:\n    TDeferredCompiler(EShLanguage s, TInfoSink& i) : TCompiler(s, i) { }\n    virtual bool compile(TIntermNode*, int = 0, EProfile = ENoProfile) { return true; }\n};\n\nTIoMapper* GetGlslIoMapper() {\n    return static_cast<TIoMapper*>(new TGlslIoMapper());\n}\n\nTShader::TShader(EShLanguage s)\n    : stage(s), lengths(nullptr), stringNames(nullptr), preamble(\"\"), overrideVersion(0)\n{\n    pool = new TPoolAllocator;\n    infoSink = new TInfoSink;\n    compiler = new TDeferredCompiler(stage, *infoSink);\n    intermediate = new TIntermediate(s);\n\n    // clear environment (avoid constructors in them for use in a C interface)\n    environment.input.languageFamily = EShSourceNone;\n    environment.input.dialect = EShClientNone;\n    environment.input.vulkanRulesRelaxed = false;\n    environment.client.client = EShClientNone;\n    environment.target.language = EShTargetNone;\n    environment.target.hlslFunctionality1 = false;\n}\n\nTShader::~TShader()\n{\n    delete infoSink;\n    delete compiler;\n    delete intermediate;\n    delete pool;\n}\n\nvoid TShader::setStrings(const char* const* s, int n)\n{\n    strings = s;\n    numStrings = n;\n    lengths = nullptr;\n}\n\nvoid TShader::setStringsWithLengths(const char* const* s, const int* l, int n)\n{\n    strings = s;\n    numStrings = n;\n    lengths = l;\n}\n\nvoid TShader::setStringsWithLengthsAndNames(\n    const char* const* s, const int* l, const char* const* names, int n)\n{\n    strings = s;\n    numStrings = n;\n    lengths = l;\n    stringNames = names;\n}\n\nvoid TShader::setEntryPoint(const char* entryPoint)\n{\n    intermediate->setEntryPointName(entryPoint);\n}\n\nvoid TShader::setSourceEntryPoint(const char* name)\n{\n    sourceEntryPointName = name;\n}\n\n// Log initial settings and transforms.\n// See comment for class TProcesses.\nvoid TShader::addProcesses(const std::vector<std::string>& p)\n{\n    intermediate->addProcesses(p);\n}\n\nvoid  TShader::setUniqueId(unsigned long long id)\n{\n    intermediate->setUniqueId(id);\n}\n\nvoid TShader::setOverrideVersion(int version)\n{\n    overrideVersion = version;\n}\n\nvoid TShader::setDebugInfo(bool debugInfo)              { intermediate->setDebugInfo(debugInfo); }\nvoid TShader::setInvertY(bool invert)                   { intermediate->setInvertY(invert); }\nvoid TShader::setDxPositionW(bool invert)               { intermediate->setDxPositionW(invert); }\nvoid TShader::setEnhancedMsgs()                         { intermediate->setEnhancedMsgs(); }\nvoid TShader::setNanMinMaxClamp(bool useNonNan)         { intermediate->setNanMinMaxClamp(useNonNan); }\n\n// Set binding base for given resource type\nvoid TShader::setShiftBinding(TResourceType res, unsigned int base) {\n    intermediate->setShiftBinding(res, base);\n}\n\n// Set binding base for given resource type for a given binding set.\nvoid TShader::setShiftBindingForSet(TResourceType res, unsigned int base, unsigned int set) {\n    intermediate->setShiftBindingForSet(res, base, set);\n}\n\n// Set binding base for sampler types\nvoid TShader::setShiftSamplerBinding(unsigned int base) { setShiftBinding(EResSampler, base); }\n// Set binding base for texture types (SRV)\nvoid TShader::setShiftTextureBinding(unsigned int base) { setShiftBinding(EResTexture, base); }\n// Set binding base for image types\nvoid TShader::setShiftImageBinding(unsigned int base)   { setShiftBinding(EResImage, base); }\n// Set binding base for uniform buffer objects (CBV)\nvoid TShader::setShiftUboBinding(unsigned int base)     { setShiftBinding(EResUbo, base); }\n// Synonym for setShiftUboBinding, to match HLSL language.\nvoid TShader::setShiftCbufferBinding(unsigned int base) { setShiftBinding(EResUbo, base); }\n// Set binding base for UAV (unordered access view)\nvoid TShader::setShiftUavBinding(unsigned int base)     { setShiftBinding(EResUav, base); }\n// Set binding base for SSBOs\nvoid TShader::setShiftSsboBinding(unsigned int base)    { setShiftBinding(EResSsbo, base); }\n// Enables binding automapping using TIoMapper\nvoid TShader::setAutoMapBindings(bool map)              { intermediate->setAutoMapBindings(map); }\n// Enables position.Y output negation in vertex shader\n\n// Fragile: currently within one stage: simple auto-assignment of location\nvoid TShader::setAutoMapLocations(bool map)             { intermediate->setAutoMapLocations(map); }\nvoid TShader::addUniformLocationOverride(const char* name, int loc)\n{\n    intermediate->addUniformLocationOverride(name, loc);\n}\nvoid TShader::setUniformLocationBase(int base)\n{\n    intermediate->setUniformLocationBase(base);\n}\nvoid TShader::setNoStorageFormat(bool useUnknownFormat) { intermediate->setNoStorageFormat(useUnknownFormat); }\nvoid TShader::setResourceSetBinding(const std::vector<std::string>& base)   { intermediate->setResourceSetBinding(base); }\nvoid TShader::setTextureSamplerTransformMode(EShTextureSamplerTransformMode mode) { intermediate->setTextureSamplerTransformMode(mode); }\n\nvoid TShader::addBlockStorageOverride(const char* nameStr, TBlockStorageClass backing) { intermediate->addBlockStorageOverride(nameStr, backing); }\n\nvoid TShader::setGlobalUniformBlockName(const char* name) { intermediate->setGlobalUniformBlockName(name); }\nvoid TShader::setGlobalUniformSet(unsigned int set) { intermediate->setGlobalUniformSet(set); }\nvoid TShader::setGlobalUniformBinding(unsigned int binding) { intermediate->setGlobalUniformBinding(binding); }\n\nvoid TShader::setAtomicCounterBlockName(const char* name) { intermediate->setAtomicCounterBlockName(name); }\nvoid TShader::setAtomicCounterBlockSet(unsigned int set) { intermediate->setAtomicCounterBlockSet(set); }\n\nvoid TShader::addSourceText(const char* text, size_t len) { intermediate->addSourceText(text, len); }\nvoid TShader::setSourceFile(const char* file) { intermediate->setSourceFile(file); }\n\n#ifdef ENABLE_HLSL\n// See comment above TDefaultHlslIoMapper in iomapper.cpp:\nvoid TShader::setHlslIoMapping(bool hlslIoMap)          { intermediate->setHlslIoMapping(hlslIoMap); }\nvoid TShader::setFlattenUniformArrays(bool flatten)     { intermediate->setFlattenUniformArrays(flatten); }\n#endif\n\n//\n// Turn the shader strings into a parse tree in the TIntermediate.\n//\n// Returns true for success.\n//\nbool TShader::parse(const TBuiltInResource* builtInResources, int defaultVersion, EProfile defaultProfile, bool forceDefaultVersionAndProfile,\n                    bool forwardCompatible, EShMessages messages, Includer& includer)\n{\n    SetThreadPoolAllocator(pool);\n\n    if (! preamble)\n        preamble = \"\";\n\n    return CompileDeferred(compiler, strings, numStrings, lengths, stringNames,\n                           preamble, EShOptNone, builtInResources, defaultVersion,\n                           defaultProfile, forceDefaultVersionAndProfile, overrideVersion,\n                           forwardCompatible, messages, *intermediate, includer, sourceEntryPointName,\n                           &environment, compileOnly);\n}\n\n// Fill in a string with the result of preprocessing ShaderStrings\n// Returns true if all extensions, pragmas and version strings were valid.\n//\n// NOTE: Doing just preprocessing to obtain a correct preprocessed shader string\n// is not an officially supported or fully working path.\nbool TShader::preprocess(const TBuiltInResource* builtInResources,\n                         int defaultVersion, EProfile defaultProfile,\n                         bool forceDefaultVersionAndProfile,\n                         bool forwardCompatible, EShMessages message,\n                         std::string* output_string,\n                         Includer& includer)\n{\n    SetThreadPoolAllocator(pool);\n\n    if (! preamble)\n        preamble = \"\";\n\n    return PreprocessDeferred(compiler, strings, numStrings, lengths, stringNames, preamble,\n                              EShOptNone, builtInResources, defaultVersion,\n                              defaultProfile, forceDefaultVersionAndProfile, overrideVersion,\n                              forwardCompatible, message, includer, *intermediate, output_string,\n                              &environment);\n}\n\nconst char* TShader::getInfoLog()\n{\n    return infoSink->info.c_str();\n}\n\nconst char* TShader::getInfoDebugLog()\n{\n    return infoSink->debug.c_str();\n}\n\nTProgram::TProgram() : reflection(nullptr), linked(false)\n{\n    pool = new TPoolAllocator;\n    infoSink = new TInfoSink;\n    for (int s = 0; s < EShLangCount; ++s) {\n        intermediate[s] = nullptr;\n        newedIntermediate[s] = false;\n    }\n}\n\nTProgram::~TProgram()\n{\n    delete infoSink;\n    delete reflection;\n\n    for (int s = 0; s < EShLangCount; ++s)\n        if (newedIntermediate[s])\n            delete intermediate[s];\n\n    delete pool;\n}\n\n//\n// Merge the compilation units within each stage into a single TIntermediate.\n// All starting compilation units need to be the result of calling TShader::parse().\n//\n// Return true for success.\n//\nbool TProgram::link(EShMessages messages)\n{\n    if (linked)\n        return false;\n    linked = true;\n\n    bool error = false;\n\n    SetThreadPoolAllocator(pool);\n\n    for (int s = 0; s < EShLangCount; ++s) {\n        if (! linkStage((EShLanguage)s, messages))\n            error = true;\n    }\n\n    if (!error) {\n        if (! crossStageCheck(messages))\n            error = true;\n    }\n\n    if (messages & EShMsgAST) {\n        for (int s = 0; s < EShLangCount; ++s) {\n            if (intermediate[s] == nullptr)\n                continue;\n            intermediate[s]->output(*infoSink, true);\n        }\n    }\n\n    return ! error;\n}\n\n//\n// Merge the compilation units within the given stage into a single TIntermediate.\n//\n// Return true for success.\n//\nbool TProgram::linkStage(EShLanguage stage, EShMessages messages)\n{\n    if (stages[stage].size() == 0)\n        return true;\n\n    int numEsShaders = 0, numNonEsShaders = 0;\n    for (auto it = stages[stage].begin(); it != stages[stage].end(); ++it) {\n        if ((*it)->intermediate->getProfile() == EEsProfile) {\n            numEsShaders++;\n        } else {\n            numNonEsShaders++;\n        }\n    }\n\n    if (numEsShaders > 0 && numNonEsShaders > 0) {\n        infoSink->info.message(EPrefixError, \"Cannot mix ES profile with non-ES profile shaders\");\n        return false;\n    } else if (numEsShaders > 1) {\n        infoSink->info.message(EPrefixError, \"Cannot attach multiple ES shaders of the same type to a single program\");\n        return false;\n    }\n\n    //\n    // Be efficient for the common single compilation unit per stage case,\n    // reusing it's TIntermediate instead of merging into a new one.\n    //\n    TIntermediate *firstIntermediate = stages[stage].front()->intermediate;\n    if (stages[stage].size() == 1)\n        intermediate[stage] = firstIntermediate;\n    else {\n        intermediate[stage] = new TIntermediate(stage,\n                                                firstIntermediate->getVersion(),\n                                                firstIntermediate->getProfile());\n        intermediate[stage]->setLimits(firstIntermediate->getLimits());\n        if (firstIntermediate->getEnhancedMsgs())\n            intermediate[stage]->setEnhancedMsgs();\n\n        // The new TIntermediate must use the same origin as the original TIntermediates.\n        // Otherwise linking will fail due to different coordinate systems.\n        if (firstIntermediate->getOriginUpperLeft()) {\n            intermediate[stage]->setOriginUpperLeft();\n        }\n        intermediate[stage]->setSpv(firstIntermediate->getSpv());\n\n        newedIntermediate[stage] = true;\n    }\n\n    if (messages & EShMsgAST)\n        infoSink->info << \"\\nLinked \" << StageName(stage) << \" stage:\\n\\n\";\n\n    if (stages[stage].size() > 1) {\n        std::list<TShader*>::const_iterator it;\n        for (it = stages[stage].begin(); it != stages[stage].end(); ++it)\n            intermediate[stage]->merge(*infoSink, *(*it)->intermediate);\n    }\n    intermediate[stage]->finalCheck(*infoSink, (messages & EShMsgKeepUncalled) != 0);\n\n    return intermediate[stage]->getNumErrors() == 0;\n}\n\n//\n// Check that there are no errors in linker objects accross stages\n//\n// Return true if no errors.\n//\nbool TProgram::crossStageCheck(EShMessages messages) {\n\n    // make temporary intermediates to hold the linkage symbols for each linking interface\n    // while we do the checks\n    // Independent interfaces are:\n    //                  all uniform variables and blocks\n    //                  all buffer blocks\n    //                  all in/out on a stage boundary\n\n    TVector<TIntermediate*> activeStages;\n    for (int s = 0; s < EShLangCount; ++s) {\n        if (intermediate[s])\n            activeStages.push_back(intermediate[s]);\n    }\n\n    class TFinalLinkTraverser : public TIntermTraverser {\n    public:\n        TFinalLinkTraverser() { }\n        virtual ~TFinalLinkTraverser() { }\n\n        virtual void visitSymbol(TIntermSymbol* symbol)\n        {\n            // Implicitly size arrays.\n            // If an unsized array is left as unsized, it effectively\n            // becomes run-time sized.\n            symbol->getWritableType().adoptImplicitArraySizes(false);\n        }\n    } finalLinkTraverser;\n\n    // no extra linking if there is only one stage\n    if (! (activeStages.size() > 1)) {\n        if (activeStages.size() == 1 && activeStages[0]->getTreeRoot()) {\n            activeStages[0]->getTreeRoot()->traverse(&finalLinkTraverser);\n        }\n        return true;\n    }\n\n    // setup temporary tree to hold unfirom objects from different stages\n    TIntermediate* firstIntermediate = activeStages.front();\n    TIntermediate uniforms(EShLangCount,\n                           firstIntermediate->getVersion(),\n                           firstIntermediate->getProfile());\n    uniforms.setSpv(firstIntermediate->getSpv());\n\n    TIntermAggregate uniformObjects(EOpLinkerObjects);\n    TIntermAggregate root(EOpSequence);\n    root.getSequence().push_back(&uniformObjects);\n    uniforms.setTreeRoot(&root);\n\n    bool error = false;\n\n    // merge uniforms from all stages into a single intermediate\n    for (unsigned int i = 0; i < activeStages.size(); ++i) {\n        uniforms.mergeUniformObjects(*infoSink, *activeStages[i]);\n    }\n    error |= uniforms.getNumErrors() != 0;\n\n    // update implicit array sizes across shader stages\n    for (unsigned int i = 0; i < activeStages.size(); ++i) {\n        activeStages[i]->mergeImplicitArraySizes(*infoSink, uniforms);\n        activeStages[i]->getTreeRoot()->traverse(&finalLinkTraverser);\n    }\n\n    // copy final definition of global block back into each stage\n    for (unsigned int i = 0; i < activeStages.size(); ++i) {\n        // We only want to merge into already existing global uniform blocks.\n        // A stage that doesn't already know about the global doesn't care about it's content.\n        // Otherwise we end up pointing to the same object between different stages\n        // and that will break binding/set remappings\n        bool mergeExistingOnly = true;\n        activeStages[i]->mergeGlobalUniformBlocks(*infoSink, uniforms, mergeExistingOnly);\n    }\n\n    // compare cross stage symbols for each stage boundary\n    for (unsigned int i = 1; i < activeStages.size(); ++i) {\n        activeStages[i - 1]->checkStageIO(*infoSink, *activeStages[i], messages);\n        error |= (activeStages[i - 1]->getNumErrors() != 0 || activeStages[i]->getNumErrors() != 0);\n    }\n\n    // if requested, optimize cross stage IO\n    if (messages & EShMsgLinkTimeOptimization) {\n        for (unsigned int i = 1; i < activeStages.size(); ++i) {\n            activeStages[i - 1]->optimizeStageIO(*infoSink, *activeStages[i]);\n        }\n    }\n\n    return !error;\n}\n\nconst char* TProgram::getInfoLog()\n{\n    return infoSink->info.c_str();\n}\n\nconst char* TProgram::getInfoDebugLog()\n{\n    return infoSink->debug.c_str();\n}\n\n//\n// Reflection implementation.\n//\n\nunsigned int TObjectReflection::layoutLocation() const { return type->getQualifier().layoutLocation; }\n\nbool TProgram::buildReflection(int opts)\n{\n    if (! linked || reflection != nullptr)\n        return false;\n\n    SetThreadPoolAllocator(pool);\n\n    int firstStage = EShLangVertex, lastStage = EShLangFragment;\n\n    if (opts & EShReflectionIntermediateIO) {\n        // if we're reflecting intermediate I/O, determine the first and last stage linked and use those as the\n        // boundaries for which stages generate pipeline inputs/outputs\n        firstStage = EShLangCount;\n        lastStage = 0;\n        for (int s = 0; s < EShLangCount; ++s) {\n            if (intermediate[s]) {\n                firstStage = std::min(firstStage, s);\n                lastStage = std::max(lastStage, s);\n            }\n        }\n    }\n\n    reflection = new TReflection((EShReflectionOptions)opts, (EShLanguage)firstStage, (EShLanguage)lastStage);\n\n    for (int s = 0; s < EShLangCount; ++s) {\n        if (intermediate[s]) {\n            if (! reflection->addStage((EShLanguage)s, *intermediate[s]))\n                return false;\n        }\n    }\n\n    return true;\n}\n\nunsigned TProgram::getLocalSize(int dim) const                        { return reflection->getLocalSize(dim); }\nunsigned TProgram::getTileShadingRateQCOM(int dim) const              { return reflection->getTileShadingRateQCOM(dim); }\nint TProgram::getReflectionIndex(const char* name) const              { return reflection->getIndex(name); }\nint TProgram::getReflectionPipeIOIndex(const char* name, const bool inOrOut) const\n                                                                      { return reflection->getPipeIOIndex(name, inOrOut); }\n\nint TProgram::getNumUniformVariables() const                          { return reflection->getNumUniforms(); }\nconst TObjectReflection& TProgram::getUniform(int index) const        { return reflection->getUniform(index); }\nint TProgram::getNumUniformBlocks() const                             { return reflection->getNumUniformBlocks(); }\nconst TObjectReflection& TProgram::getUniformBlock(int index) const   { return reflection->getUniformBlock(index); }\nint TProgram::getNumPipeInputs() const                                { return reflection->getNumPipeInputs(); }\nconst TObjectReflection& TProgram::getPipeInput(int index) const      { return reflection->getPipeInput(index); }\nint TProgram::getNumPipeOutputs() const                               { return reflection->getNumPipeOutputs(); }\nconst TObjectReflection& TProgram::getPipeOutput(int index) const     { return reflection->getPipeOutput(index); }\nint TProgram::getNumBufferVariables() const                           { return reflection->getNumBufferVariables(); }\nconst TObjectReflection& TProgram::getBufferVariable(int index) const { return reflection->getBufferVariable(index); }\nint TProgram::getNumBufferBlocks() const                              { return reflection->getNumStorageBuffers(); }\nconst TObjectReflection& TProgram::getBufferBlock(int index) const    { return reflection->getStorageBufferBlock(index); }\nint TProgram::getNumAtomicCounters() const                            { return reflection->getNumAtomicCounters(); }\nconst TObjectReflection& TProgram::getAtomicCounter(int index) const  { return reflection->getAtomicCounter(index); }\nvoid TProgram::dumpReflection() { if (reflection != nullptr) reflection->dump(); }\n\nTIoMapResolver* TProgram::getGlslIoResolver(EShLanguage stage) {\n    auto *intermediate = getIntermediate(stage);\n    if (!intermediate)\n        return NULL;\n    return static_cast<TIoMapResolver*>(new TDefaultGlslIoResolver(*intermediate));\n}\n//\n// I/O mapping implementation.\n//\nbool TProgram::mapIO(TIoMapResolver* pResolver, TIoMapper* pIoMapper)\n{\n    if (! linked)\n        return false;\n\n    SetThreadPoolAllocator(pool);\n\n    TIoMapper* ioMapper = nullptr;\n    TIoMapper defaultIOMapper;\n    if (pIoMapper == nullptr)\n        ioMapper = &defaultIOMapper;\n    else\n        ioMapper = pIoMapper;\n    for (int s = 0; s < EShLangCount; ++s) {\n        if (intermediate[s]) {\n            if (! ioMapper->addStage((EShLanguage)s, *intermediate[s], *infoSink, pResolver))\n                return false;\n        }\n    }\n\n    return ioMapper->doMap(pResolver, *infoSink);\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/SpirvIntrinsics.cpp",
    "content": "//\n// Copyright(C) 2021 Advanced Micro Devices, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n//\n// GL_EXT_spirv_intrinsics\n//\n#include \"../Include/intermediate.h\"\n#include \"../Include/SpirvIntrinsics.h\"\n#include \"../Include/Types.h\"\n#include \"ParseHelper.h\"\n\nnamespace glslang {\n\nbool TSpirvTypeParameter::operator==(const TSpirvTypeParameter& rhs) const\n{\n    if (getAsConstant() != nullptr)\n        return getAsConstant()->getConstArray() == rhs.getAsConstant()->getConstArray();\n\n    assert(getAsType() != nullptr);\n    return *getAsType() == *rhs.getAsType();\n}\n\n//\n// Handle SPIR-V requirements\n//\nTSpirvRequirement* TParseContext::makeSpirvRequirement(const TSourceLoc& loc, const TString& name,\n                                                       const TIntermAggregate* extensions,\n                                                       const TIntermAggregate* capabilities)\n{\n    TSpirvRequirement* spirvReq = new TSpirvRequirement;\n\n    if (name == \"extensions\") {\n        assert(extensions);\n        for (auto extension : extensions->getSequence()) {\n            assert(extension->getAsConstantUnion());\n            spirvReq->extensions.insert(*extension->getAsConstantUnion()->getConstArray()[0].getSConst());\n        }\n    } else if (name == \"capabilities\") {\n        assert(capabilities);\n        for (auto capability : capabilities->getSequence()) {\n            assert(capability->getAsConstantUnion());\n            spirvReq->capabilities.insert(capability->getAsConstantUnion()->getConstArray()[0].getIConst());\n        }\n    } else\n        error(loc, \"unknown SPIR-V requirement\", name.c_str(), \"\");\n\n    return spirvReq;\n}\n\nTSpirvRequirement* TParseContext::mergeSpirvRequirements(const TSourceLoc& loc, TSpirvRequirement* spirvReq1,\n                                                         TSpirvRequirement* spirvReq2)\n{\n    // Merge the second SPIR-V requirement to the first one\n    if (!spirvReq2->extensions.empty()) {\n        if (spirvReq1->extensions.empty())\n            spirvReq1->extensions = spirvReq2->extensions;\n        else\n            error(loc, \"too many SPIR-V requirements\", \"extensions\", \"\");\n    }\n\n    if (!spirvReq2->capabilities.empty()) {\n        if (spirvReq1->capabilities.empty())\n            spirvReq1->capabilities = spirvReq2->capabilities;\n        else\n            error(loc, \"too many SPIR-V requirements\", \"capabilities\", \"\");\n    }\n\n    return spirvReq1;\n}\n\nvoid TIntermediate::insertSpirvRequirement(const TSpirvRequirement* spirvReq)\n{\n    if (!spirvRequirement)\n        spirvRequirement = new TSpirvRequirement;\n\n    for (auto extension : spirvReq->extensions)\n        spirvRequirement->extensions.insert(extension);\n\n    for (auto capability : spirvReq->capabilities)\n        spirvRequirement->capabilities.insert(capability);\n}\n\n//\n// Handle SPIR-V execution modes\n//\nvoid TIntermediate::insertSpirvExecutionMode(int executionMode, const TIntermAggregate* args)\n{\n    if (!spirvExecutionMode)\n        spirvExecutionMode = new TSpirvExecutionMode;\n\n    TVector<const TIntermConstantUnion*> extraOperands;\n    if (args) {\n        for (auto arg : args->getSequence()) {\n            auto extraOperand = arg->getAsConstantUnion();\n            assert(extraOperand != nullptr);\n            extraOperands.push_back(extraOperand);\n        }\n    }\n    spirvExecutionMode->modes[executionMode] = extraOperands;\n}\n\nvoid TIntermediate::insertSpirvExecutionModeId(int executionMode, const TIntermAggregate* args)\n{\n    if (!spirvExecutionMode)\n        spirvExecutionMode = new TSpirvExecutionMode;\n\n    assert(args);\n    TVector<const TIntermTyped*> extraOperands;\n\n    for (auto arg : args->getSequence()) {\n        auto extraOperand = arg->getAsTyped();\n        assert(extraOperand != nullptr && extraOperand->getQualifier().isConstant());\n        extraOperands.push_back(extraOperand);\n    }\n    spirvExecutionMode->modeIds[executionMode] = extraOperands;\n}\n\n//\n// Handle SPIR-V decorate qualifiers\n//\nvoid TQualifier::setSpirvDecorate(int decoration, const TIntermAggregate* args)\n{\n    if (!spirvDecorate)\n        spirvDecorate = new TSpirvDecorate;\n\n    TVector<const TIntermConstantUnion*> extraOperands;\n    if (args) {\n        for (auto arg : args->getSequence()) {\n            auto extraOperand = arg->getAsConstantUnion();\n            assert(extraOperand != nullptr);\n            extraOperands.push_back(extraOperand);\n        }\n    }\n    spirvDecorate->decorates[decoration] = extraOperands;\n}\n\nvoid TQualifier::setSpirvDecorateId(int decoration, const TIntermAggregate* args)\n{\n    if (!spirvDecorate)\n        spirvDecorate = new TSpirvDecorate;\n\n    assert(args);\n    TVector<const TIntermTyped*> extraOperands;\n    for (auto arg : args->getSequence()) {\n        auto extraOperand = arg->getAsTyped();\n        assert(extraOperand != nullptr);\n        extraOperands.push_back(extraOperand);\n    }\n    spirvDecorate->decorateIds[decoration] = extraOperands;\n}\n\nvoid TQualifier::setSpirvDecorateString(int decoration, const TIntermAggregate* args)\n{\n    if (!spirvDecorate)\n        spirvDecorate = new TSpirvDecorate;\n\n    assert(args);\n    TVector<const TIntermConstantUnion*> extraOperands;\n    for (auto arg : args->getSequence()) {\n        auto extraOperand = arg->getAsConstantUnion();\n        assert(extraOperand != nullptr);\n        extraOperands.push_back(extraOperand);\n    }\n    spirvDecorate->decorateStrings[decoration] = extraOperands;\n}\n\nTString TQualifier::getSpirvDecorateQualifierString() const\n{\n    assert(spirvDecorate);\n\n    TString qualifierString;\n\n    const auto appendFloat = [&](float f) { qualifierString.append(std::to_string(f).c_str()); };\n    const auto appendInt = [&](int i) { qualifierString.append(std::to_string(i).c_str()); };\n    const auto appendUint = [&](unsigned int u) { qualifierString.append(std::to_string(u).c_str()); };\n    const auto appendBool = [&](bool b) { qualifierString.append(std::to_string(b).c_str()); };\n    const auto appendStr = [&](const char* s) { qualifierString.append(s); };\n\n    const auto appendDecorate = [&](const TIntermTyped* constant) {\n        if (constant->getAsConstantUnion()) {\n            auto& constArray = constant->getAsConstantUnion()->getConstArray();\n            if (constant->getBasicType() == EbtFloat) {\n                float value = static_cast<float>(constArray[0].getDConst());\n                appendFloat(value);\n            } else if (constant->getBasicType() == EbtInt) {\n                int value = constArray[0].getIConst();\n                appendInt(value);\n            } else if (constant->getBasicType() == EbtUint) {\n                unsigned value = constArray[0].getUConst();\n                appendUint(value);\n            } else if (constant->getBasicType() == EbtBool) {\n                bool value = constArray[0].getBConst();\n                appendBool(value);\n            } else if (constant->getBasicType() == EbtString) {\n                const TString* value = constArray[0].getSConst();\n                appendStr(value->c_str());\n            } else\n                assert(0);\n        } else {\n            assert(constant->getAsSymbolNode());\n            appendStr(constant->getAsSymbolNode()->getName().c_str());\n        }\n    };\n\n    for (auto& decorate : spirvDecorate->decorates) {\n        appendStr(\"spirv_decorate(\");\n        appendInt(decorate.first);\n        for (auto extraOperand : decorate.second) {\n            appendStr(\", \");\n            appendDecorate(extraOperand);\n        }\n        appendStr(\") \");\n    }\n\n    for (auto& decorateId : spirvDecorate->decorateIds) {\n        appendStr(\"spirv_decorate_id(\");\n        appendInt(decorateId.first);\n        for (auto extraOperand : decorateId.second) {\n            appendStr(\", \");\n            appendDecorate(extraOperand);\n        }\n        appendStr(\") \");\n    }\n\n    for (auto& decorateString : spirvDecorate->decorateStrings) {\n        appendStr(\"spirv_decorate_string(\");\n        appendInt(decorateString.first);\n        for (auto extraOperand : decorateString.second) {\n            appendStr(\", \");\n            appendDecorate(extraOperand);\n        }\n        appendStr(\") \");\n    }\n\n    return qualifierString;\n}\n\n//\n// Handle SPIR-V type specifiers\n//\nvoid TPublicType::setSpirvType(const TSpirvInstruction& spirvInst, const TSpirvTypeParameters* typeParams)\n{\n    if (!spirvType)\n        spirvType = new TSpirvType;\n\n    basicType = EbtSpirvType;\n    spirvType->spirvInst = spirvInst;\n    if (typeParams)\n        spirvType->typeParams = *typeParams;\n}\n\nTSpirvTypeParameters* TParseContext::makeSpirvTypeParameters(const TSourceLoc& loc, const TIntermConstantUnion* constant)\n{\n    TSpirvTypeParameters* spirvTypeParams = new TSpirvTypeParameters;\n    if (constant->getBasicType() != EbtFloat &&\n        constant->getBasicType() != EbtInt &&\n        constant->getBasicType() != EbtUint &&\n        constant->getBasicType() != EbtBool &&\n        constant->getBasicType() != EbtString)\n        error(loc, \"this type not allowed\", constant->getType().getBasicString(), \"\");\n    else\n        spirvTypeParams->push_back(TSpirvTypeParameter(constant));\n\n    return spirvTypeParams;\n}\n\nTSpirvTypeParameters* TParseContext::makeSpirvTypeParameters(const TSourceLoc& /* loc */,\n                                                             const TPublicType& type)\n{\n    TSpirvTypeParameters* spirvTypeParams = new TSpirvTypeParameters;\n    spirvTypeParams->push_back(TSpirvTypeParameter(new TType(type)));\n    return spirvTypeParams;\n}\n\nTSpirvTypeParameters* TParseContext::mergeSpirvTypeParameters(TSpirvTypeParameters* spirvTypeParams1, TSpirvTypeParameters* spirvTypeParams2)\n{\n    // Merge SPIR-V type parameters of the second one to the first one\n    for (const auto& spirvTypeParam : *spirvTypeParams2)\n        spirvTypeParams1->push_back(spirvTypeParam);\n    return spirvTypeParams1;\n}\n\n//\n// Handle SPIR-V instruction qualifiers\n//\nTSpirvInstruction* TParseContext::makeSpirvInstruction(const TSourceLoc& loc, const TString& name, const TString& value)\n{\n    TSpirvInstruction* spirvInst = new TSpirvInstruction;\n    if (name == \"set\")\n        spirvInst->set = value;\n    else\n        error(loc, \"unknown SPIR-V instruction qualifier\", name.c_str(), \"\");\n\n    return spirvInst;\n}\n\nTSpirvInstruction* TParseContext::makeSpirvInstruction(const TSourceLoc& loc, const TString& name, int value)\n{\n    TSpirvInstruction* spirvInstuction = new TSpirvInstruction;\n    if (name == \"id\")\n        spirvInstuction->id = value;\n    else\n        error(loc, \"unknown SPIR-V instruction qualifier\", name.c_str(), \"\");\n\n    return spirvInstuction;\n}\n\nTSpirvInstruction* TParseContext::mergeSpirvInstruction(const TSourceLoc& loc, TSpirvInstruction* spirvInst1, TSpirvInstruction* spirvInst2)\n{\n    // Merge qualifiers of the second SPIR-V instruction to those of the first one\n    if (!spirvInst2->set.empty()) {\n        if (spirvInst1->set.empty())\n            spirvInst1->set = spirvInst2->set;\n        else\n            error(loc, \"too many SPIR-V instruction qualifiers\", \"spirv_instruction\", \"(set)\");\n    }\n\n    if (spirvInst2->id != -1) {\n        if (spirvInst1->id == -1)\n            spirvInst1->id = spirvInst2->id;\n        else\n            error(loc, \"too many SPIR-V instruction qualifiers\", \"spirv_instruction\", \"(id)\");\n    }\n\n    return spirvInst1;\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/SymbolTable.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2012-2013 LunarG, Inc.\n// Copyright (C) 2017 ARM Limited.\n// Copyright (C) 2015-2018 Google, Inc.\n// Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n//\n// Symbol table for parsing.  Most functionality and main ideas\n// are documented in the header file.\n//\n\n#include \"SymbolTable.h\"\n\nnamespace glslang {\n\n//\n// TType helper function needs a place to live.\n//\n\n//\n// Recursively generate mangled names.\n//\nvoid TType::buildMangledName(TString& mangledName) const\n{\n    if (isMatrix())\n        mangledName += 'm';\n    else if (isVector())\n        mangledName += 'v';\n\n    if (isCoopVecNV())\n        mangledName += \"coopvec\";\n\n    switch (basicType) {\n    case EbtFloat:              mangledName += 'f';      break;\n    case EbtInt:                mangledName += 'i';      break;\n    case EbtUint:               mangledName += 'u';      break;\n    case EbtBool:               mangledName += 'b';      break;\n    case EbtDouble:             mangledName += 'd';      break;\n    case EbtFloat16:            mangledName += \"f16\";    break;\n    case EbtBFloat16:           mangledName += \"bf16\";   break;\n    case EbtFloatE5M2:          mangledName += \"fe5m2\";  break;\n    case EbtFloatE4M3:          mangledName += \"fe4m3\";  break;\n    case EbtInt8:               mangledName += \"i8\";     break;\n    case EbtUint8:              mangledName += \"u8\";     break;\n    case EbtInt16:              mangledName += \"i16\";    break;\n    case EbtUint16:             mangledName += \"u16\";    break;\n    case EbtInt64:              mangledName += \"i64\";    break;\n    case EbtUint64:             mangledName += \"u64\";    break;\n    case EbtAtomicUint:         mangledName += \"au\";     break;\n    case EbtAccStruct:          mangledName += \"as\";     break;\n    case EbtRayQuery:           mangledName += \"rq\";     break;\n    case EbtSpirvType:          mangledName += \"spv-t\";  break;\n    case EbtHitObjectNV:        mangledName += \"ho\";     break;\n    case EbtTensorLayoutNV:     mangledName += \"tl\";     break;\n    case EbtTensorViewNV:       mangledName += \"tv\";     break;\n    case EbtSampler:\n        switch (sampler.type) {\n        case EbtFloat16: mangledName += \"f16\"; break;\n        case EbtInt:   mangledName += \"i\"; break;\n        case EbtUint:  mangledName += \"u\"; break;\n        case EbtInt64:   mangledName += \"i64\"; break;\n        case EbtUint64:  mangledName += \"u64\"; break;\n        default: break; // some compilers want this\n        }\n        if (sampler.isImageClass())\n            mangledName += \"I\";  // a normal image or subpass\n        else if (sampler.isPureSampler())\n            mangledName += \"p\";  // a \"pure\" sampler\n        else if (!sampler.isCombined())\n            mangledName += \"t\";  // a \"pure\" texture\n        else\n            mangledName += \"s\";  // traditional combined sampler\n        if (sampler.isArrayed())\n            mangledName += \"A\";\n        if (sampler.isShadow())\n            mangledName += \"S\";\n        if (sampler.isExternal())\n            mangledName += \"E\";\n        if (sampler.isYuv())\n            mangledName += \"Y\";\n        switch (sampler.dim) {\n        case Esd2D:       mangledName += \"2\";  break;\n        case Esd3D:       mangledName += \"3\";  break;\n        case EsdCube:     mangledName += \"C\";  break;\n        case Esd1D:       mangledName += \"1\";  break;\n        case EsdRect:     mangledName += \"R2\"; break;\n        case EsdBuffer:   mangledName += \"B\";  break;\n        case EsdSubpass:  mangledName += \"P\";  break;\n        default: break; // some compilers want this\n        }\n\n#ifdef ENABLE_HLSL\n        if (sampler.hasReturnStruct()) {\n            // Name mangle for sampler return struct uses struct table index.\n            mangledName += \"-tx-struct\";\n\n            char text[16]; // plenty enough space for the small integers.\n            snprintf(text, sizeof(text), \"%u-\", sampler.getStructReturnIndex());\n            mangledName += text;\n        } else {\n            switch (sampler.getVectorSize()) {\n            case 1: mangledName += \"1\"; break;\n            case 2: mangledName += \"2\"; break;\n            case 3: mangledName += \"3\"; break;\n            case 4: break; // default to prior name mangle behavior\n            }\n        }\n#endif\n\n        if (sampler.isMultiSample())\n            mangledName += \"M\";\n        break;\n    case EbtStruct:\n    case EbtBlock:\n        if (basicType == EbtStruct)\n            mangledName += \"struct-\";\n        else\n            mangledName += \"block-\";\n        if (typeName)\n            mangledName += *typeName;\n        for (unsigned int i = 0; i < structure->size(); ++i) {\n            if ((*structure)[i].type->getBasicType() == EbtVoid)\n                continue;\n            mangledName += '-';\n            (*structure)[i].type->buildMangledName(mangledName);\n        }\n        break;\n    default:\n        break;\n    }\n\n    if (getVectorSize() > 0)\n        mangledName += static_cast<char>('0' + getVectorSize());\n    else {\n        mangledName += static_cast<char>('0' + getMatrixCols());\n        mangledName += static_cast<char>('0' + getMatrixRows());\n    }\n\n    if (typeParameters) {\n        const int maxSize = 11;\n        char buf[maxSize];\n        for (int i = 0; i < typeParameters->arraySizes->getNumDims(); ++i) {\n            if (typeParameters->arraySizes->getDimNode(i)) {\n                if (typeParameters->arraySizes->getDimNode(i)->getAsSymbolNode())\n                    snprintf(buf, maxSize, \"s%lld\", typeParameters->arraySizes->getDimNode(i)->getAsSymbolNode()->getId());\n                else\n                    snprintf(buf, maxSize, \"s%p\", typeParameters->arraySizes->getDimNode(i));\n            } else\n                snprintf(buf, maxSize, \"%d\", typeParameters->arraySizes->getDimSize(i));\n            mangledName += '<';\n            mangledName += buf;\n            mangledName += '>';\n        }\n    }\n\n    if (arraySizes) {\n        const int maxSize = 11;\n        char buf[maxSize];\n        for (int i = 0; i < arraySizes->getNumDims(); ++i) {\n            if (arraySizes->getDimNode(i)) {\n                if (arraySizes->getDimNode(i)->getAsSymbolNode())\n                    snprintf(buf, maxSize, \"s%lld\", arraySizes->getDimNode(i)->getAsSymbolNode()->getId());\n                else\n                    snprintf(buf, maxSize, \"s%p\", (void*)(arraySizes->getDimNode(i)));\n            } else\n                snprintf(buf, maxSize, \"%d\", arraySizes->getDimSize(i));\n            mangledName += '[';\n            mangledName += buf;\n            mangledName += ']';\n        }\n    }\n}\n\n//\n// Dump functions.\n//\n\nvoid TSymbol::dumpExtensions(TInfoSink& infoSink) const\n{\n    int numExtensions = getNumExtensions();\n    if (numExtensions) {\n        infoSink.debug << \" <\";\n\n        for (int i = 0; i < numExtensions; i++)\n            infoSink.debug << getExtensions()[i] << \",\";\n\n        infoSink.debug << \">\";\n    }\n}\n\nvoid TVariable::dump(TInfoSink& infoSink, bool complete) const\n{\n    if (complete) {\n        infoSink.debug << getName().c_str() << \": \" << type.getCompleteString();\n        dumpExtensions(infoSink);\n    } else {\n        infoSink.debug << getName().c_str() << \": \" << type.getStorageQualifierString() << \" \"\n                       << type.getBasicTypeString();\n\n        if (type.isArray())\n            infoSink.debug << \"[0]\";\n    }\n\n    infoSink.debug << \"\\n\";\n}\n\nvoid TFunction::dump(TInfoSink& infoSink, bool complete) const\n{\n    if (complete) {\n        infoSink.debug << getName().c_str() << \": \" << returnType.getCompleteString() << \" \" << getName().c_str()\n                       << \"(\";\n\n        int numParams = getParamCount();\n        for (int i = 0; i < numParams; i++) {\n            const TParameter &param = parameters[i];\n            infoSink.debug << param.type->getCompleteString() << \" \"\n                           << (param.type->isStruct() ? \"of \" + param.type->getTypeName() + \" \" : \"\")\n                           << (param.name ? *param.name : \"\") << (i < numParams - 1 ? \",\" : \"\");\n        }\n\n        infoSink.debug << \")\";\n        dumpExtensions(infoSink);\n    } else {\n        infoSink.debug << getName().c_str() << \": \" << returnType.getBasicTypeString() << \" \"\n                       << getMangledName().c_str() << \"n\";\n    }\n\n    infoSink.debug << \"\\n\";\n}\n\nvoid TAnonMember::dump(TInfoSink& TInfoSink, bool) const\n{\n    TInfoSink.debug << \"anonymous member \" << getMemberNumber() << \" of \" << getAnonContainer().getName().c_str()\n                    << \"\\n\";\n}\n\nvoid TSymbolTableLevel::dump(TInfoSink& infoSink, bool complete) const\n{\n    tLevel::const_iterator it;\n    for (it = level.begin(); it != level.end(); ++it)\n        (*it).second->dump(infoSink, complete);\n}\n\nvoid TSymbolTable::dump(TInfoSink& infoSink, bool complete) const\n{\n    for (int level = currentLevel(); level >= 0; --level) {\n        infoSink.debug << \"LEVEL \" << level << \"\\n\";\n        table[level]->dump(infoSink, complete);\n    }\n}\n\n//\n// Functions have buried pointers to delete.\n//\nTFunction::~TFunction()\n{\n    for (TParamList::iterator i = parameters.begin(); i != parameters.end(); ++i)\n        delete (*i).type;\n}\n\n//\n// Symbol table levels are a map of pointers to symbols that have to be deleted.\n//\nTSymbolTableLevel::~TSymbolTableLevel()\n{\n    for (tLevel::iterator it = level.begin(); it != level.end(); ++it) {\n        const TString& name = it->first;\n        auto retargetIter = std::find_if(retargetedSymbols.begin(), retargetedSymbols.end(),\n                                      [&name](const std::pair<TString, TString>& i) { return i.first == name; });\n        if (retargetIter == retargetedSymbols.end())\n            delete (*it).second;\n    }\n\n\n    delete [] defaultPrecision;\n}\n\n//\n// Change all function entries in the table with the non-mangled name\n// to be related to the provided built-in operation.\n//\nvoid TSymbolTableLevel::relateToOperator(const char* name, TOperator op)\n{\n    tLevel::const_iterator candidate = level.lower_bound(name);\n    while (candidate != level.end()) {\n        const TString& candidateName = (*candidate).first;\n        TString::size_type parenAt = candidateName.find_first_of('(');\n        if (parenAt != candidateName.npos && candidateName.compare(0, parenAt, name) == 0) {\n            TFunction* function = (*candidate).second->getAsFunction();\n            function->relateToOperator(op);\n        } else\n            break;\n        ++candidate;\n    }\n}\n\n// Make all function overloads of the given name require an extension(s).\n// Should only be used for a version/profile that actually needs the extension(s).\nvoid TSymbolTableLevel::setFunctionExtensions(const char* name, int num, const char* const extensions[])\n{\n    tLevel::const_iterator candidate = level.lower_bound(name);\n    while (candidate != level.end()) {\n        const TString& candidateName = (*candidate).first;\n        TString::size_type parenAt = candidateName.find_first_of('(');\n        if (parenAt != candidateName.npos && candidateName.compare(0, parenAt, name) == 0) {\n            TSymbol* symbol = candidate->second;\n            symbol->setExtensions(num, extensions);\n        } else\n            break;\n        ++candidate;\n    }\n}\n\n// Make a single function require an extension(s). i.e., this will only set the extensions for the symbol that matches 'name' exactly.\n// This is different from setFunctionExtensions, which uses std::map::lower_bound to effectively set all symbols that start with 'name'.\n// Should only be used for a version/profile that actually needs the extension(s).\nvoid TSymbolTableLevel::setSingleFunctionExtensions(const char* name, int num, const char* const extensions[])\n{\n    if (auto candidate = level.find(name); candidate != level.end()) {\n        candidate->second->setExtensions(num, extensions);\n    }\n}\n\n//\n// Make all symbols in this table level read only.\n//\nvoid TSymbolTableLevel::readOnly()\n{\n    for (tLevel::iterator it = level.begin(); it != level.end(); ++it)\n        (*it).second->makeReadOnly();\n}\n\n//\n// Copy a symbol, but the copy is writable; call readOnly() afterward if that's not desired.\n//\nTSymbol::TSymbol(const TSymbol& copyOf)\n{\n    name = NewPoolTString(copyOf.name->c_str());\n    mangledName = NewPoolTString(copyOf.mangledName->c_str());\n    uniqueId = copyOf.uniqueId;\n    writable = true;\n}\n\nTVariable::TVariable(const TVariable& copyOf) : TSymbol(copyOf)\n{\n    type.deepCopy(copyOf.type);\n    userType = copyOf.userType;\n\n    // we don't support specialization-constant subtrees in cloned tables, only extensions\n    constSubtree = nullptr;\n    extensions = nullptr;\n    memberExtensions = nullptr;\n    if (copyOf.getNumExtensions() > 0)\n        setExtensions(copyOf.getNumExtensions(), copyOf.getExtensions());\n    if (copyOf.hasMemberExtensions()) {\n        for (int m = 0; m < (int)copyOf.type.getStruct()->size(); ++m) {\n            if (copyOf.getNumMemberExtensions(m) > 0)\n                setMemberExtensions(m, copyOf.getNumMemberExtensions(m), copyOf.getMemberExtensions(m));\n        }\n    }\n\n    if (! copyOf.constArray.empty()) {\n        assert(! copyOf.type.isStruct());\n        TConstUnionArray newArray(copyOf.constArray, 0, copyOf.constArray.size());\n        constArray = newArray;\n    }\n}\n\nTVariable* TVariable::clone() const\n{\n    TVariable *variable = new TVariable(*this);\n\n    return variable;\n}\n\nTFunction::TFunction(const TFunction& copyOf) : TSymbol(copyOf)\n{\n    for (unsigned int i = 0; i < copyOf.parameters.size(); ++i) {\n        TParameter param{};\n        parameters.push_back(param);\n        (void)parameters.back().copyParam(copyOf.parameters[i]);\n    }\n\n    extensions = nullptr;\n    if (copyOf.getNumExtensions() > 0)\n        setExtensions(copyOf.getNumExtensions(), copyOf.getExtensions());\n    returnType.deepCopy(copyOf.returnType);\n    mangledName = copyOf.mangledName;\n    op = copyOf.op;\n    defined = copyOf.defined;\n    prototyped = copyOf.prototyped;\n    implicitThis = copyOf.implicitThis;\n    illegalImplicitThis = copyOf.illegalImplicitThis;\n    defaultParamCount = copyOf.defaultParamCount;\n    spirvInst = copyOf.spirvInst;\n}\n\nTFunction* TFunction::clone() const\n{\n    TFunction *function = new TFunction(*this);\n\n    return function;\n}\n\nTAnonMember* TAnonMember::clone() const\n{\n    // Anonymous members of a given block should be cloned at a higher level,\n    // where they can all be assured to still end up pointing to a single\n    // copy of the original container.\n    assert(0);\n\n    return nullptr;\n}\n\nTSymbolTableLevel* TSymbolTableLevel::clone() const\n{\n    TSymbolTableLevel *symTableLevel = new TSymbolTableLevel();\n    symTableLevel->anonId = anonId;\n    symTableLevel->thisLevel = thisLevel;\n    symTableLevel->retargetedSymbols.clear();\n    for (auto &s : retargetedSymbols) {\n        symTableLevel->retargetedSymbols.push_back({s.first, s.second});\n    }\n    std::vector<bool> containerCopied(anonId, false);\n    tLevel::const_iterator iter;\n    for (iter = level.begin(); iter != level.end(); ++iter) {\n        const TAnonMember* anon = iter->second->getAsAnonMember();\n        if (anon) {\n            // Insert all the anonymous members of this same container at once,\n            // avoid inserting the remaining members in the future, once this has been done,\n            // allowing them to all be part of the same new container.\n            if (! containerCopied[anon->getAnonId()]) {\n                TVariable* container = anon->getAnonContainer().clone();\n                container->changeName(NewPoolTString(\"\"));\n                // insert the container and all its members\n                symTableLevel->insert(*container, false);\n                containerCopied[anon->getAnonId()] = true;\n            }\n        } else {\n            const TString& name = iter->first;\n            auto retargetIter = std::find_if(retargetedSymbols.begin(), retargetedSymbols.end(),\n                                          [&name](const std::pair<TString, TString>& i) { return i.first == name; });\n            if (retargetIter != retargetedSymbols.end())\n                continue;\n            symTableLevel->insert(*iter->second->clone(), false);\n        }\n    }\n    // Now point retargeted symbols to the newly created versions of them\n    for (auto &s : retargetedSymbols) {\n        TSymbol* sym = symTableLevel->find(s.second);\n        if (!sym)\n            continue;\n        symTableLevel->insert(s.first, sym);\n    }\n\n    return symTableLevel;\n}\n\nvoid TSymbolTable::copyTable(const TSymbolTable& copyOf)\n{\n    assert(adoptedLevels == copyOf.adoptedLevels);\n\n    uniqueId = copyOf.uniqueId;\n    noBuiltInRedeclarations = copyOf.noBuiltInRedeclarations;\n    separateNameSpaces = copyOf.separateNameSpaces;\n    for (unsigned int i = copyOf.adoptedLevels; i < copyOf.table.size(); ++i)\n        table.push_back(copyOf.table[i]->clone());\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/SymbolTable.h",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2013 LunarG, Inc.\n// Copyright (C) 2015-2018 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#ifndef _SYMBOL_TABLE_INCLUDED_\n#define _SYMBOL_TABLE_INCLUDED_\n\n//\n// Symbol table for parsing.  Has these design characteristics:\n//\n// * Same symbol table can be used to compile many shaders, to preserve\n//   effort of creating and loading with the large numbers of built-in\n//   symbols.\n//\n// -->  This requires a copy mechanism, so initial pools used to create\n//   the shared information can be popped.  Done through \"clone\"\n//   methods.\n//\n// * Name mangling will be used to give each function a unique name\n//   so that symbol table lookups are never ambiguous.  This allows\n//   a simpler symbol table structure.\n//\n// * Pushing and popping of scope, so symbol table will really be a stack\n//   of symbol tables.  Searched from the top, with new inserts going into\n//   the top.\n//\n// * Constants:  Compile time constant symbols will keep their values\n//   in the symbol table.  The parser can substitute constants at parse\n//   time, including doing constant folding and constant propagation.\n//\n// * No temporaries:  Temporaries made from operations (+, --, .xy, etc.)\n//   are tracked in the intermediate representation, not the symbol table.\n//\n\n#include \"../Include/Common.h\"\n#include \"../Include/intermediate.h\"\n#include \"../Include/InfoSink.h\"\n\nnamespace glslang {\n\n//\n// Symbol base class.  (Can build functions or variables out of these...)\n//\n\nclass TVariable;\nclass TFunction;\nclass TAnonMember;\n\ntypedef TVector<const char*> TExtensionList;\n\nclass TSymbol {\npublic:\n    POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())\n    explicit TSymbol(const TString *n, const TString *mn) :  name(n), mangledName(mn), uniqueId(0), extensions(nullptr), writable(true) { }\n    explicit TSymbol(const TString *n) : TSymbol(n, n) { }\n    virtual TSymbol* clone() const = 0;\n    virtual ~TSymbol() { }  // rely on all symbol owned memory coming from the pool\n\n    virtual const TString& getName() const { return *name; }\n    virtual void changeName(const TString* newName) { name = newName; }\n    virtual void addPrefix(const char* prefix)\n    {\n        TString newName(prefix);\n        newName.append(*name);\n        changeName(NewPoolTString(newName.c_str()));\n    }\n    virtual const TString& getMangledName() const { return *mangledName; }\n    virtual TFunction* getAsFunction() { return nullptr; }\n    virtual const TFunction* getAsFunction() const { return nullptr; }\n    virtual TVariable* getAsVariable() { return nullptr; }\n    virtual const TVariable* getAsVariable() const { return nullptr; }\n    virtual const TAnonMember* getAsAnonMember() const { return nullptr; }\n    virtual const TType& getType() const = 0;\n    virtual TType& getWritableType() = 0;\n    virtual void setUniqueId(long long id) { uniqueId = id; }\n    virtual long long getUniqueId() const { return uniqueId; }\n    virtual void setExtensions(int numExts, const char* const exts[])\n    {\n        assert(extensions == nullptr);\n        assert(numExts > 0);\n        extensions = NewPoolObject(extensions);\n        for (int e = 0; e < numExts; ++e)\n            extensions->push_back(exts[e]);\n    }\n    virtual int getNumExtensions() const { return extensions == nullptr ? 0 : (int)extensions->size(); }\n    virtual const char** getExtensions() const { return extensions->data(); }\n\n    virtual void dump(TInfoSink& infoSink, bool complete = false) const = 0;\n    void dumpExtensions(TInfoSink& infoSink) const;\n\n    virtual bool isReadOnly() const { return ! writable; }\n    virtual void makeReadOnly() { writable = false; }\n\nprotected:\n    explicit TSymbol(const TSymbol&);\n    TSymbol& operator=(const TSymbol&);\n\n    const TString *name;\n    const TString *mangledName;\n    unsigned long long uniqueId;      // For cross-scope comparing during code generation\n\n    // For tracking what extensions must be present\n    // (don't use if correct version/profile is present).\n    TExtensionList* extensions; // an array of pointers to existing constant char strings\n\n    //\n    // N.B.: Non-const functions that will be generally used should assert on this,\n    // to avoid overwriting shared symbol-table information.\n    //\n    bool writable;\n};\n\n//\n// Variable class, meaning a symbol that's not a function.\n//\n// There could be a separate class hierarchy for Constant variables;\n// Only one of int, bool, or float, (or none) is correct for\n// any particular use, but it's easy to do this way, and doesn't\n// seem worth having separate classes, and \"getConst\" can't simply return\n// different values for different types polymorphically, so this is\n// just simple and pragmatic.\n//\nclass TVariable : public TSymbol {\npublic:\n    TVariable(const TString *name, const TType& t, bool uT = false )\n        : TVariable(name, name, t, uT) {}\n    TVariable(const TString *name, const TString *mangledName, const TType& t, bool uT = false )\n        : TSymbol(name, mangledName),\n          userType(uT),\n          constSubtree(nullptr),\n          memberExtensions(nullptr),\n          anonId(-1)\n        { type.shallowCopy(t); }\n    virtual TVariable* clone() const;\n    virtual ~TVariable() { }\n\n    virtual TVariable* getAsVariable() { return this; }\n    virtual const TVariable* getAsVariable() const { return this; }\n    virtual const TType& getType() const { return type; }\n    virtual TType& getWritableType() { assert(writable); return type; }\n    virtual bool isUserType() const { return userType; }\n    virtual const TConstUnionArray& getConstArray() const { return constArray; }\n    virtual TConstUnionArray& getWritableConstArray() { assert(writable); return constArray; }\n    virtual void setConstArray(const TConstUnionArray& array) { constArray = array; }\n    virtual void setConstSubtree(TIntermTyped* subtree) { constSubtree = subtree; }\n    virtual TIntermTyped* getConstSubtree() const { return constSubtree; }\n    virtual void setAnonId(int i) { anonId = i; }\n    virtual int getAnonId() const { return anonId; }\n\n    virtual void setMemberExtensions(int member, int numExts, const char* const exts[])\n    {\n        assert(type.isStruct());\n        assert(numExts > 0);\n        if (memberExtensions == nullptr) {\n            memberExtensions = NewPoolObject(memberExtensions);\n            memberExtensions->resize(type.getStruct()->size());\n        }\n        for (int e = 0; e < numExts; ++e)\n            (*memberExtensions)[member].push_back(exts[e]);\n    }\n    virtual bool hasMemberExtensions() const { return memberExtensions != nullptr; }\n    virtual int getNumMemberExtensions(int member) const \n    {\n        return memberExtensions == nullptr ? 0 : (int)(*memberExtensions)[member].size();\n    }\n    virtual const char** getMemberExtensions(int member) const { return (*memberExtensions)[member].data(); }\n\n    virtual void dump(TInfoSink& infoSink, bool complete = false) const;\n\nprotected:\n    explicit TVariable(const TVariable&);\n    TVariable& operator=(const TVariable&);\n\n    TType type;\n    bool userType;\n\n    // we are assuming that Pool Allocator will free the memory allocated to unionArray\n    // when this object is destroyed\n\n    TConstUnionArray constArray;               // for compile-time constant value\n    TIntermTyped* constSubtree;                // for specialization constant computation\n    TVector<TExtensionList>* memberExtensions; // per-member extension list, allocated only when needed\n    int anonId; // the ID used for anonymous blocks: TODO: see if uniqueId could serve a dual purpose\n};\n\n//\n// The function sub-class of symbols and the parser will need to\n// share this definition of a function parameter.\n//\nstruct TParameter {\n    TString *name;\n    TType* type;\n    TIntermTyped* defaultValue;\n    TParameter& copyParam(const TParameter& param)\n    {\n        if (param.name)\n            name = NewPoolTString(param.name->c_str());\n        else\n            name = nullptr;\n        type = param.type->clone();\n        defaultValue = param.defaultValue;\n        return *this;\n    }\n    TBuiltInVariable getDeclaredBuiltIn() const { return type->getQualifier().declaredBuiltIn; }\n};\n\n//\n// The function sub-class of a symbol.\n//\nclass TFunction : public TSymbol {\npublic:\n    explicit TFunction(TOperator o) :\n        TSymbol(nullptr),\n        op(o),\n        defined(false), prototyped(false), implicitThis(false), illegalImplicitThis(false), defaultParamCount(0) { }\n    TFunction(const TString *name, const TType& retType, TOperator tOp = EOpNull) :\n        TSymbol(name),\n        mangledName(*name + '('),\n        op(tOp),\n        defined(false), prototyped(false), implicitThis(false), illegalImplicitThis(false), defaultParamCount(0),\n        linkType(ELinkNone)\n    {\n        returnType.shallowCopy(retType);\n        declaredBuiltIn = retType.getQualifier().builtIn;\n    }\n    virtual TFunction* clone() const override;\n    virtual ~TFunction();\n\n    virtual TFunction* getAsFunction() override { return this; }\n    virtual const TFunction* getAsFunction() const override { return this; }\n\n    // Install 'p' as the (non-'this') last parameter.\n    // Non-'this' parameters are reflected in both the list of parameters and the\n    // mangled name.\n    virtual void addParameter(TParameter& p)\n    {\n        assert(writable);\n        parameters.push_back(p);\n        p.type->appendMangledName(mangledName);\n\n        if (p.defaultValue != nullptr)\n            defaultParamCount++;\n    }\n\n    // Install 'this' as the first parameter.\n    // 'this' is reflected in the list of parameters, but not the mangled name.\n    virtual void addThisParameter(TType& type, const char* name)\n    {\n        TParameter p = { NewPoolTString(name), new TType, nullptr };\n        p.type->shallowCopy(type);\n        parameters.insert(parameters.begin(), p);\n    }\n\n    virtual void addPrefix(const char* prefix) override\n    {\n        TSymbol::addPrefix(prefix);\n        mangledName.insert(0, prefix);\n    }\n\n    virtual void removePrefix(const TString& prefix)\n    {\n        assert(mangledName.compare(0, prefix.size(), prefix) == 0);\n        mangledName.erase(0, prefix.size());\n    }\n\n    virtual const TString& getMangledName() const override { return mangledName; }\n    virtual const TType& getType() const override { return returnType; }\n    virtual TBuiltInVariable getDeclaredBuiltInType() const { return declaredBuiltIn; }\n    virtual TType& getWritableType() override { return returnType; }\n    virtual void relateToOperator(TOperator o) { assert(writable); op = o; }\n    virtual TOperator getBuiltInOp() const { return op; }\n    virtual void setDefined() { assert(writable); defined = true; }\n    virtual bool isDefined() const { return defined; }\n    virtual void setPrototyped() { assert(writable); prototyped = true; }\n    virtual bool isPrototyped() const { return prototyped; }\n    virtual void setImplicitThis() { assert(writable); implicitThis = true; }\n    virtual bool hasImplicitThis() const { return implicitThis; }\n    virtual void setIllegalImplicitThis() { assert(writable); illegalImplicitThis = true; }\n    virtual bool hasIllegalImplicitThis() const { return illegalImplicitThis; }\n\n    // Return total number of parameters\n    virtual int getParamCount() const { return static_cast<int>(parameters.size()); }\n    // Return number of parameters with default values.\n    virtual int getDefaultParamCount() const { return defaultParamCount; }\n    // Return number of fixed parameters (without default values)\n    virtual int getFixedParamCount() const { return getParamCount() - getDefaultParamCount(); }\n\n    virtual TParameter& operator[](int i) { assert(writable); return parameters[i]; }\n    virtual const TParameter& operator[](int i) const { return parameters[i]; }\n    const TQualifier& getQualifier() const { return returnType.getQualifier(); }\n\n    virtual void setSpirvInstruction(const TSpirvInstruction& inst)\n    {\n        relateToOperator(EOpSpirvInst);\n        spirvInst = inst;\n    }\n    virtual const TSpirvInstruction& getSpirvInstruction() const { return spirvInst; }\n\n    virtual void dump(TInfoSink& infoSink, bool complete = false) const override;\n\n    void setExport() { linkType = ELinkExport; }\n    TLinkType getLinkType() const { return linkType; }\n\nprotected:\n    explicit TFunction(const TFunction&);\n    TFunction& operator=(const TFunction&);\n\n    typedef TVector<TParameter> TParamList;\n    TParamList parameters;\n    TType returnType;\n    TBuiltInVariable declaredBuiltIn;\n\n    TString mangledName;\n    TOperator op;\n    bool defined;\n    bool prototyped;\n    bool implicitThis;         // True if this function is allowed to see all members of 'this'\n    bool illegalImplicitThis;  // True if this function is not supposed to have access to dynamic members of 'this',\n                               // even if it finds member variables in the symbol table.\n                               // This is important for a static member function that has member variables in scope,\n                               // but is not allowed to use them, or see hidden symbols instead.\n    int  defaultParamCount;\n\n    TSpirvInstruction spirvInst; // SPIR-V instruction qualifiers\n    TLinkType linkType;\n};\n\n//\n// Members of anonymous blocks are a kind of TSymbol.  They are not hidden in\n// the symbol table behind a container; rather they are visible and point to\n// their anonymous container.  (The anonymous container is found through the\n// member, not the other way around.)\n//\nclass TAnonMember : public TSymbol {\npublic:\n    TAnonMember(const TString* n, unsigned int m, TVariable& a, int an) : TSymbol(n), anonContainer(a), memberNumber(m), anonId(an) { }\n    virtual TAnonMember* clone() const override;\n    virtual ~TAnonMember() { }\n\n    virtual const TAnonMember* getAsAnonMember() const override { return this; }\n    virtual const TVariable& getAnonContainer() const { return anonContainer; }\n    virtual unsigned int getMemberNumber() const { return memberNumber; }\n\n    virtual const TType& getType() const override\n    {\n        const TTypeList& types = *anonContainer.getType().getStruct();\n        return *types[memberNumber].type;\n    }\n\n    virtual TType& getWritableType() override\n    {\n        assert(writable);\n        const TTypeList& types = *anonContainer.getType().getStruct();\n        return *types[memberNumber].type;\n    }\n\n    virtual void setExtensions(int numExts, const char* const exts[]) override\n    {\n        anonContainer.setMemberExtensions(memberNumber, numExts, exts);\n    }\n    virtual int getNumExtensions() const override { return anonContainer.getNumMemberExtensions(memberNumber); }\n    virtual const char** getExtensions() const override { return anonContainer.getMemberExtensions(memberNumber); }\n\n    virtual int getAnonId() const { return anonId; }\n    virtual void dump(TInfoSink& infoSink, bool complete = false) const override;\n\nprotected:\n    explicit TAnonMember(const TAnonMember&);\n    TAnonMember& operator=(const TAnonMember&);\n\n    TVariable& anonContainer;\n    unsigned int memberNumber;\n    int anonId;\n};\n\nclass TSymbolTableLevel {\npublic:\n    POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())\n    TSymbolTableLevel() : defaultPrecision(nullptr), anonId(0), thisLevel(false) { }\n    ~TSymbolTableLevel();\n\n    bool insert(const TString& name, TSymbol* symbol) {\n        return level.insert(tLevelPair(name, symbol)).second;\n    }\n\n    bool insert(TSymbol& symbol, bool separateNameSpaces, const TString& forcedKeyName = TString())\n    {\n        //\n        // returning true means symbol was added to the table with no semantic errors\n        //\n        const TString& name = symbol.getName();\n        if (forcedKeyName.length()) {\n            return level.insert(tLevelPair(forcedKeyName, &symbol)).second;\n        }\n        else if (name == \"\") {\n            symbol.getAsVariable()->setAnonId(anonId++);\n            // An empty name means an anonymous container, exposing its members to the external scope.\n            // Give it a name and insert its members in the symbol table, pointing to the container.\n            char buf[20];\n            snprintf(buf, 20, \"%s%d\", AnonymousPrefix, symbol.getAsVariable()->getAnonId());\n            symbol.changeName(NewPoolTString(buf));\n\n            return insertAnonymousMembers(symbol, 0);\n        } else {\n            // Check for redefinition errors:\n            // - STL itself will tell us if there is a direct name collision, with name mangling, at this level\n            // - additionally, check for function-redefining-variable name collisions\n            const TString& insertName = symbol.getMangledName();\n            if (symbol.getAsFunction()) {\n                // make sure there isn't a variable of this name\n                if (! separateNameSpaces && level.find(name) != level.end())\n                    return false;\n\n                // insert, and whatever happens is okay\n                level.insert(tLevelPair(insertName, &symbol));\n\n                return true;\n            } else\n                return level.insert(tLevelPair(insertName, &symbol)).second;\n        }\n    }\n\n    // Add more members to an already inserted aggregate object\n    bool amend(TSymbol& symbol, int firstNewMember)\n    {\n        // See insert() for comments on basic explanation of insert.\n        // This operates similarly, but more simply.\n        // Only supporting amend of anonymous blocks so far.\n        if (IsAnonymous(symbol.getName()))\n            return insertAnonymousMembers(symbol, firstNewMember);\n        else\n            return false;\n    }\n\n    bool insertAnonymousMembers(TSymbol& symbol, int firstMember)\n    {\n        const TTypeList& types = *symbol.getAsVariable()->getType().getStruct();\n        for (unsigned int m = firstMember; m < types.size(); ++m) {\n            TAnonMember* member = new TAnonMember(&types[m].type->getFieldName(), m, *symbol.getAsVariable(), symbol.getAsVariable()->getAnonId());\n            if (! level.insert(tLevelPair(member->getMangledName(), member)).second)\n                return false;\n        }\n\n        return true;\n    }\n\n    void retargetSymbol(const TString& from, const TString& to) {\n        tLevel::const_iterator fromIt = level.find(from);\n        tLevel::const_iterator toIt = level.find(to);\n        if (fromIt == level.end() || toIt == level.end())\n            return;\n        delete fromIt->second;\n        level[from] = toIt->second;\n        retargetedSymbols.push_back({from, to});\n    }\n\n    TSymbol* find(const TString& name) const\n    {\n        tLevel::const_iterator it = level.find(name);\n        if (it == level.end())\n            return nullptr;\n        else\n            return (*it).second;\n    }\n\n    void findFunctionNameList(const TString& name, TVector<const TFunction*>& list)\n    {\n        size_t parenAt = name.find_first_of('(');\n        TString base(name, 0, parenAt + 1);\n\n        tLevel::const_iterator begin = level.lower_bound(base);\n        base[parenAt] = ')';  // assume ')' is lexically after '('\n        tLevel::const_iterator end = level.upper_bound(base);\n        for (tLevel::const_iterator it = begin; it != end; ++it)\n            list.push_back(it->second->getAsFunction());\n    }\n\n    // See if there is already a function in the table having the given non-function-style name.\n    bool hasFunctionName(const TString& name) const\n    {\n        tLevel::const_iterator candidate = level.lower_bound(name);\n        if (candidate != level.end()) {\n            const TString& candidateName = (*candidate).first;\n            TString::size_type parenAt = candidateName.find_first_of('(');\n            if (parenAt != candidateName.npos && candidateName.compare(0, parenAt, name) == 0)\n\n                return true;\n        }\n\n        return false;\n    }\n\n    // See if there is a variable at this level having the given non-function-style name.\n    // Return true if name is found, and set variable to true if the name was a variable.\n    bool findFunctionVariableName(const TString& name, bool& variable) const\n    {\n        tLevel::const_iterator candidate = level.lower_bound(name);\n        if (candidate != level.end()) {\n            const TString& candidateName = (*candidate).first;\n            TString::size_type parenAt = candidateName.find_first_of('(');\n            if (parenAt == candidateName.npos) {\n                // not a mangled name\n                if (candidateName == name) {\n                    // found a variable name match\n                    variable = true;\n                    return true;\n                }\n            } else {\n                // a mangled name\n                if (candidateName.compare(0, parenAt, name) == 0) {\n                    // found a function name match\n                    variable = false;\n                    return true;\n                }\n            }\n        }\n\n        return false;\n    }\n\n    // Use this to do a lazy 'push' of precision defaults the first time\n    // a precision statement is seen in a new scope.  Leave it at 0 for\n    // when no push was needed.  Thus, it is not the current defaults,\n    // it is what to restore the defaults to when popping a level.\n    void setPreviousDefaultPrecisions(const TPrecisionQualifier *p)\n    {\n        // can call multiple times at one scope, will only latch on first call,\n        // as we're tracking the previous scope's values, not the current values\n        if (defaultPrecision != nullptr)\n            return;\n\n        defaultPrecision = new TPrecisionQualifier[EbtNumTypes];\n        for (int t = 0; t < EbtNumTypes; ++t)\n            defaultPrecision[t] = p[t];\n    }\n\n    void getPreviousDefaultPrecisions(TPrecisionQualifier *p)\n    {\n        // can be called for table level pops that didn't set the\n        // defaults\n        if (defaultPrecision == nullptr || p == nullptr)\n            return;\n\n        for (int t = 0; t < EbtNumTypes; ++t)\n            p[t] = defaultPrecision[t];\n    }\n\n    void relateToOperator(const char* name, TOperator op);\n    void setFunctionExtensions(const char* name, int num, const char* const extensions[]);\n    void setSingleFunctionExtensions(const char* name, int num, const char* const extensions[]);\n    void dump(TInfoSink& infoSink, bool complete = false) const;\n    TSymbolTableLevel* clone() const;\n    void readOnly();\n\n    void setThisLevel() { thisLevel = true; }\n    bool isThisLevel() const { return thisLevel; }\n\nprotected:\n    explicit TSymbolTableLevel(TSymbolTableLevel&);\n    TSymbolTableLevel& operator=(TSymbolTableLevel&);\n\n    typedef std::map<TString, TSymbol*, std::less<TString>, pool_allocator<std::pair<const TString, TSymbol*> > > tLevel;\n    typedef const tLevel::value_type tLevelPair;\n    typedef std::pair<tLevel::iterator, bool> tInsertResult;\n\n    tLevel level;  // named mappings\n    TPrecisionQualifier *defaultPrecision;\n    // pair<FromName, ToName>\n    TVector<std::pair<TString, TString>> retargetedSymbols;\n    int anonId;\n    bool thisLevel;  // True if this level of the symbol table is a structure scope containing member function\n                     // that are supposed to see anonymous access to member variables.\n};\n\nclass TSymbolTable {\npublic:\n    TSymbolTable() : uniqueId(0), noBuiltInRedeclarations(false), separateNameSpaces(false), adoptedLevels(0)\n    {\n        //\n        // This symbol table cannot be used until push() is called.\n        //\n    }\n    ~TSymbolTable()\n    {\n        // this can be called explicitly; safest to code it so it can be called multiple times\n\n        // don't deallocate levels passed in from elsewhere\n        while (table.size() > adoptedLevels)\n            pop(nullptr);\n    }\n\n    void adoptLevels(TSymbolTable& symTable)\n    {\n        for (unsigned int level = 0; level < symTable.table.size(); ++level) {\n            table.push_back(symTable.table[level]);\n            ++adoptedLevels;\n        }\n        uniqueId = symTable.uniqueId;\n        noBuiltInRedeclarations = symTable.noBuiltInRedeclarations;\n        separateNameSpaces = symTable.separateNameSpaces;\n    }\n\n    //\n    // While level adopting is generic, the methods below enact a the following\n    // convention for levels:\n    //   0: common built-ins shared across all stages, all compiles, only one copy for all symbol tables\n    //   1: per-stage built-ins, shared across all compiles, but a different copy per stage\n    //   2: built-ins specific to a compile, like resources that are context-dependent, or redeclared built-ins\n    //   3: user-shader globals\n    //\nprotected:\n    static const uint32_t LevelFlagBitOffset = 56;\n    static const int globalLevel = 3;\n    static bool isSharedLevel(int level)  { return level <= 1; }            // exclude all per-compile levels\n    static bool isBuiltInLevel(int level) { return level <= 2; }            // exclude user globals\n    static bool isGlobalLevel(int level)  { return level <= globalLevel; }  // include user globals\npublic:\n    bool isEmpty() { return table.size() == 0; }\n    bool atBuiltInLevel() { return isBuiltInLevel(currentLevel()); }\n    bool atGlobalLevel()  { return isGlobalLevel(currentLevel()); }\n    static bool isBuiltInSymbol(long long uniqueId) {\n        int level = static_cast<int>(uniqueId >> LevelFlagBitOffset);\n        return isBuiltInLevel(level);\n    }\n    static constexpr uint64_t uniqueIdMask = (1LL << LevelFlagBitOffset) - 1;\n    static const uint32_t MaxLevelInUniqueID = 127;\n    void setNoBuiltInRedeclarations() { noBuiltInRedeclarations = true; }\n    void setSeparateNameSpaces() { separateNameSpaces = true; }\n\n    void push()\n    {\n        table.push_back(new TSymbolTableLevel);\n        updateUniqueIdLevelFlag();\n    }\n\n    // Make a new symbol-table level to represent the scope introduced by a structure\n    // containing member functions, such that the member functions can find anonymous\n    // references to member variables.\n    //\n    // 'thisSymbol' should have a name of \"\" to trigger anonymous structure-member\n    // symbol finds.\n    void pushThis(TSymbol& thisSymbol)\n    {\n        assert(thisSymbol.getName().size() == 0);\n        table.push_back(new TSymbolTableLevel);\n        updateUniqueIdLevelFlag();\n        table.back()->setThisLevel();\n        insert(thisSymbol);\n    }\n\n    void pop(TPrecisionQualifier *p)\n    {\n        table[currentLevel()]->getPreviousDefaultPrecisions(p);\n        delete table.back();\n        table.pop_back();\n        updateUniqueIdLevelFlag();\n    }\n\n    //\n    // Insert a visible symbol into the symbol table so it can\n    // be found later by name.\n    //\n    // Returns false if the was a name collision.\n    //\n    bool insert(TSymbol& symbol)\n    {\n        symbol.setUniqueId(++uniqueId);\n\n        // make sure there isn't a function of this variable name\n        if (! separateNameSpaces && ! symbol.getAsFunction() && table[currentLevel()]->hasFunctionName(symbol.getName()))\n            return false;\n\n        // check for not overloading or redefining a built-in function\n        if (noBuiltInRedeclarations) {\n            if (atGlobalLevel() && currentLevel() > 0) {\n                if (table[0]->hasFunctionName(symbol.getName()))\n                    return false;\n                if (currentLevel() > 1 && table[1]->hasFunctionName(symbol.getName()))\n                    return false;\n            }\n        }\n\n        return table[currentLevel()]->insert(symbol, separateNameSpaces);\n    }\n\n    // Add more members to an already inserted aggregate object\n    bool amend(TSymbol& symbol, int firstNewMember)\n    {\n        // See insert() for comments on basic explanation of insert.\n        // This operates similarly, but more simply.\n        return table[currentLevel()]->amend(symbol, firstNewMember);\n    }\n\n    // Update the level info in symbol's unique ID to current level\n    void amendSymbolIdLevel(TSymbol& symbol)\n    {\n        // clamp level to avoid overflow\n        uint64_t level = (uint32_t)currentLevel() > MaxLevelInUniqueID ? MaxLevelInUniqueID : currentLevel();\n        uint64_t symbolId = symbol.getUniqueId();\n        symbolId &= uniqueIdMask;\n        symbolId |= (level << LevelFlagBitOffset);\n        symbol.setUniqueId(symbolId);\n    }\n    //\n    // To allocate an internal temporary, which will need to be uniquely\n    // identified by the consumer of the AST, but never need to\n    // found by doing a symbol table search by name, hence allowed an\n    // arbitrary name in the symbol with no worry of collision.\n    //\n    void makeInternalVariable(TSymbol& symbol)\n    {\n        symbol.setUniqueId(++uniqueId);\n    }\n\n    //\n    // Copy a variable or anonymous member's structure from a shared level so that\n    // it can be added (soon after return) to the symbol table where it can be\n    // modified without impacting other users of the shared table.\n    //\n    TSymbol* copyUpDeferredInsert(TSymbol* shared)\n    {\n        if (shared->getAsVariable()) {\n            TSymbol* copy = shared->clone();\n            copy->setUniqueId(shared->getUniqueId());\n            return copy;\n        } else {\n            const TAnonMember* anon = shared->getAsAnonMember();\n            assert(anon);\n            TVariable* container = anon->getAnonContainer().clone();\n            container->changeName(NewPoolTString(\"\"));\n            container->setUniqueId(anon->getAnonContainer().getUniqueId());\n            return container;\n        }\n    }\n\n    TSymbol* copyUp(TSymbol* shared)\n    {\n        TSymbol* copy = copyUpDeferredInsert(shared);\n        table[globalLevel]->insert(*copy, separateNameSpaces);\n        if (shared->getAsVariable())\n            return copy;\n        else {\n            // return the copy of the anonymous member\n            return table[globalLevel]->find(shared->getName());\n        }\n    }\n\n    // Normal find of a symbol, that can optionally say whether the symbol was found\n    // at a built-in level or the current top-scope level.\n    TSymbol* find(const TString& name, bool* builtIn = nullptr, bool* currentScope = nullptr, int* thisDepthP = nullptr)\n    {\n        int level = currentLevel();\n        TSymbol* symbol;\n        int thisDepth = 0;\n        do {\n            if (table[level]->isThisLevel())\n                ++thisDepth;\n            symbol = table[level]->find(name);\n            --level;\n        } while (symbol == nullptr && level >= 0);\n        level++;\n        if (builtIn)\n            *builtIn = isBuiltInLevel(level);\n        if (currentScope)\n            *currentScope = isGlobalLevel(currentLevel()) || level == currentLevel();  // consider shared levels as \"current scope\" WRT user globals\n        if (thisDepthP != nullptr) {\n            if (! table[level]->isThisLevel())\n                thisDepth = 0;\n            *thisDepthP = thisDepth;\n        }\n\n        return symbol;\n    }\n\n    void retargetSymbol(const TString& from, const TString& to) {\n        int level = currentLevel();\n        table[level]->retargetSymbol(from, to);\n    }\n\n\n    // Find of a symbol that returns how many layers deep of nested\n    // structures-with-member-functions ('this' scopes) deep the symbol was\n    // found in.\n    TSymbol* find(const TString& name, int& thisDepth)\n    {\n        int level = currentLevel();\n        TSymbol* symbol;\n        thisDepth = 0;\n        do {\n            if (table[level]->isThisLevel())\n                ++thisDepth;\n            symbol = table[level]->find(name);\n            --level;\n        } while (symbol == nullptr && level >= 0);\n\n        if (! table[level + 1]->isThisLevel())\n            thisDepth = 0;\n\n        return symbol;\n    }\n\n    bool isFunctionNameVariable(const TString& name) const\n    {\n        if (separateNameSpaces)\n            return false;\n\n        int level = currentLevel();\n        do {\n            bool variable;\n            bool found = table[level]->findFunctionVariableName(name, variable);\n            if (found)\n                return variable;\n            --level;\n        } while (level >= 0);\n\n        return false;\n    }\n\n    void findFunctionNameList(const TString& name, TVector<const TFunction*>& list, bool& builtIn)\n    {\n        // For user levels, return the set found in the first scope with a match\n        builtIn = false;\n        int level = currentLevel();\n        do {\n            table[level]->findFunctionNameList(name, list);\n            --level;\n        } while (list.empty() && level >= globalLevel);\n\n        if (! list.empty())\n            return;\n\n        // Gather across all built-in levels; they don't hide each other\n        builtIn = true;\n        do {\n            table[level]->findFunctionNameList(name, list);\n            --level;\n        } while (level >= 0);\n    }\n\n    void relateToOperator(const char* name, TOperator op)\n    {\n        for (unsigned int level = 0; level < table.size(); ++level)\n            table[level]->relateToOperator(name, op);\n    }\n\n    void setFunctionExtensions(const char* name, int num, const char* const extensions[])\n    {\n        for (unsigned int level = 0; level < table.size(); ++level)\n            table[level]->setFunctionExtensions(name, num, extensions);\n    }\n\n    void setSingleFunctionExtensions(const char* name, int num, const char* const extensions[])\n    {\n        for (unsigned int level = 0; level < table.size(); ++level)\n            table[level]->setSingleFunctionExtensions(name, num, extensions);\n    }\n\n    void setVariableExtensions(const char* name, int numExts, const char* const extensions[])\n    {\n        TSymbol* symbol = find(TString(name));\n        if (symbol == nullptr)\n            return;\n\n        symbol->setExtensions(numExts, extensions);\n    }\n\n    void setVariableExtensions(const char* blockName, const char* name, int numExts, const char* const extensions[])\n    {\n        TSymbol* symbol = find(TString(blockName));\n        if (symbol == nullptr)\n            return;\n        TVariable* variable = symbol->getAsVariable();\n        assert(variable != nullptr);\n\n        const TTypeList& structure = *variable->getAsVariable()->getType().getStruct();\n        for (int member = 0; member < (int)structure.size(); ++member) {\n            if (structure[member].type->getFieldName().compare(name) == 0) {\n                variable->setMemberExtensions(member, numExts, extensions);\n                return;\n            }\n        }\n    }\n\n    long long getMaxSymbolId() { return uniqueId; }\n    void dump(TInfoSink& infoSink, bool complete = false) const;\n    void copyTable(const TSymbolTable& copyOf);\n\n    void setPreviousDefaultPrecisions(TPrecisionQualifier *p) { table[currentLevel()]->setPreviousDefaultPrecisions(p); }\n\n    void readOnly()\n    {\n        for (unsigned int level = 0; level < table.size(); ++level)\n            table[level]->readOnly();\n    }\n\n    // Add current level in the high-bits of unique id\n    void updateUniqueIdLevelFlag() {\n        // clamp level to avoid overflow\n        uint64_t level = (uint32_t)currentLevel() > MaxLevelInUniqueID ? MaxLevelInUniqueID : currentLevel();\n        uniqueId &= uniqueIdMask;\n        uniqueId |= (level << LevelFlagBitOffset);\n    }\n\n    void overwriteUniqueId(long long id)\n    {\n        uniqueId = id;\n        updateUniqueIdLevelFlag();\n    }\n\nprotected:\n    TSymbolTable(TSymbolTable&);\n    TSymbolTable& operator=(TSymbolTableLevel&);\n\n    int currentLevel() const { return static_cast<int>(table.size()) - 1; }\n    std::vector<TSymbolTableLevel*> table;\n    long long uniqueId;     // for unique identification in code generation\n    bool noBuiltInRedeclarations;\n    bool separateNameSpaces;\n    unsigned int adoptedLevels;\n};\n\n} // end namespace glslang\n\n#endif // _SYMBOL_TABLE_INCLUDED_\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/Versions.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2012-2013 LunarG, Inc.\n// Copyright (C) 2017, 2022-2024 Arm Limited.\n// Copyright (C) 2015-2020 Google, Inc.\n// Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n//\n// Help manage multiple profiles, versions, extensions etc.\n//\n// These don't return error codes, as the presumption is parsing will\n// always continue as if the tested feature were enabled, and thus there\n// is no error recovery needed.\n//\n\n//\n// HOW TO add a feature enabled by an extension.\n//\n// To add a new hypothetical \"Feature F\" to the front end, where an extension\n// \"XXX_extension_X\" can be used to enable the feature, do the following.\n//\n// OVERVIEW: Specific features are what are error-checked for, not\n//    extensions:  A specific Feature F might be enabled by an extension, or a\n//    particular version in a particular profile, or a stage, or combinations, etc.\n//\n//    The basic mechanism is to use the following to \"declare\" all the things that\n//    enable/disable Feature F, in a code path that implements Feature F:\n//\n//        requireProfile()\n//        profileRequires()\n//        requireStage()\n//        checkDeprecated()\n//        requireNotRemoved()\n//        requireExtensions()\n//        extensionRequires()\n//\n//    Typically, only the first two calls are needed.  They go into a code path that\n//    implements Feature F, and will log the proper error/warning messages.  Parsing\n//    will then always continue as if the tested feature was enabled.\n//\n//    There is typically no if-testing or conditional parsing, just insertion of the calls above.\n//    However, if symbols specific to the extension are added (step 5), they will\n//    only be added under tests that the minimum version and profile are present.\n//\n// 1) Add a symbol name for the extension string at the bottom of Versions.h:\n//\n//     const char* const XXX_extension_X = \"XXX_extension_X\";\n//\n// 2) Add extension initialization to TParseVersions::initializeExtensionBehavior(),\n//    the first function below and optionally a entry to extensionData for additional\n//    error checks:\n//\n//     extensionBehavior[XXX_extension_X] = EBhDisable;\n//     (Optional) exts[] = {XXX_extension_X, EShTargetSpv_1_4}\n//\n// 3) Add any preprocessor directives etc. in the next function, TParseVersions::getPreamble():\n//\n//           \"#define XXX_extension_X 1\\n\"\n//\n//    The new-line is important, as that ends preprocess tokens.\n//\n// 4) Insert a profile check in the feature's path (unless all profiles support the feature,\n//    for some version level).  That is, call requireProfile() to constrain the profiles, e.g.:\n//\n//         // ... in a path specific to Feature F...\n//         requireProfile(loc,\n//                        ECoreProfile | ECompatibilityProfile,\n//                        \"Feature F\");\n//\n// 5) For each profile that supports the feature, insert version/extension checks:\n//\n//    The mostly likely scenario is that Feature F can only be used with a\n//    particular profile if XXX_extension_X is present or the version is\n//    high enough that the core specification already incorporated it.\n//\n//        // following the requireProfile() call...\n//        profileRequires(loc,\n//                        ECoreProfile | ECompatibilityProfile,\n//                        420,             // 0 if no version incorporated the feature into the core spec.\n//                        XXX_extension_X, // can be a list of extensions that all add the feature\n//                        \"Feature F Description\");\n//\n//    This allows the feature if either A) one of the extensions is enabled or\n//    B) the version is high enough.  If no version yet incorporates the feature\n//    into core, pass in 0.\n//\n//    This can be called multiple times, if different profiles support the\n//    feature starting at different version numbers or with different\n//    extensions.\n//\n//    This must be called for each profile allowed by the initial call to requireProfile().\n//\n//    Profiles are all masks, which can be \"or\"-ed together.\n//\n//        ENoProfile\n//        ECoreProfile\n//        ECompatibilityProfile\n//        EEsProfile\n//\n//    The ENoProfile profile is only for desktop, before profiles showed up in version 150;\n//    All other #version with no profile default to either es or core, and so have profiles.\n//\n//    You can select all but a particular profile using ~.  The following basically means \"desktop\":\n//\n//        ~EEsProfile\n//\n// 6) If built-in symbols are added by the extension, add them in Initialize.cpp:  Their use\n//    will be automatically error checked against the extensions enabled at that moment.\n//    see the comment at the top of Initialize.cpp for where to put them.  Establish them at\n//    the earliest release that supports the extension.  Then, tag them with the\n//    set of extensions that both enable them and are necessary, given the version of the symbol\n//    table. (There is a different symbol table for each version.)\n//\n// 7) If the extension has additional requirements like minimum SPIR-V version required, add them\n//    to extensionRequires()\n\n#include \"parseVersions.h\"\n#include \"localintermediate.h\"\n\nnamespace glslang {\n\n//\n// Initialize all extensions, almost always to 'disable', as once their features\n// are incorporated into a core version, their features are supported through allowing that\n// core version, not through a pseudo-enablement of the extension.\n//\nvoid TParseVersions::initializeExtensionBehavior()\n{\n    typedef struct {\n        const char *const extensionName;\n        EShTargetLanguageVersion minSpvVersion;\n    } extensionData;\n\n    const extensionData exts[] = { {E_GL_EXT_ray_tracing, EShTargetSpv_1_4},\n                                   {E_GL_NV_ray_tracing_motion_blur, EShTargetSpv_1_4},\n                                   {E_GL_EXT_mesh_shader, EShTargetSpv_1_4},\n                                   {E_GL_NV_cooperative_matrix2, EShTargetSpv_1_6}\n                                 };\n\n    for (size_t ii = 0; ii < sizeof(exts) / sizeof(exts[0]); ii++) {\n        // Add only extensions which require > spv1.0 to save space in map\n        if (exts[ii].minSpvVersion > EShTargetSpv_1_0) {\n            extensionMinSpv[exts[ii].extensionName] = exts[ii].minSpvVersion;\n        }\n    }\n\n    extensionBehavior[E_GL_OES_texture_3D]                   = EBhDisable;\n    extensionBehavior[E_GL_OES_standard_derivatives]         = EBhDisable;\n    extensionBehavior[E_GL_EXT_frag_depth]                   = EBhDisable;\n    extensionBehavior[E_GL_OES_EGL_image_external]           = EBhDisable;\n    extensionBehavior[E_GL_OES_EGL_image_external_essl3]     = EBhDisable;\n    extensionBehavior[E_GL_EXT_YUV_target]                   = EBhDisable;\n    extensionBehavior[E_GL_EXT_shader_texture_lod]           = EBhDisable;\n    extensionBehavior[E_GL_EXT_shadow_samplers]              = EBhDisable;\n    extensionBehavior[E_GL_ARB_texture_rectangle]            = EBhDisable;\n    extensionBehavior[E_GL_3DL_array_objects]                = EBhDisable;\n    extensionBehavior[E_GL_ARB_shading_language_420pack]     = EBhDisable;\n    extensionBehavior[E_GL_ARB_texture_gather]               = EBhDisable;\n    extensionBehavior[E_GL_ARB_gpu_shader5]                  = EBhDisable;\n    extensionBehavior[E_GL_ARB_separate_shader_objects]      = EBhDisable;\n    extensionBehavior[E_GL_ARB_compute_shader]               = EBhDisable;\n    extensionBehavior[E_GL_ARB_tessellation_shader]          = EBhDisable;\n    extensionBehavior[E_GL_ARB_enhanced_layouts]             = EBhDisable;\n    extensionBehavior[E_GL_ARB_texture_cube_map_array]       = EBhDisable;\n    extensionBehavior[E_GL_ARB_texture_multisample]          = EBhDisable;\n    extensionBehavior[E_GL_ARB_shader_texture_lod]           = EBhDisable;\n    extensionBehavior[E_GL_ARB_explicit_attrib_location]     = EBhDisable;\n    extensionBehavior[E_GL_ARB_explicit_uniform_location]    = EBhDisable;\n    extensionBehavior[E_GL_ARB_shader_image_load_store]      = EBhDisable;\n    extensionBehavior[E_GL_ARB_shader_atomic_counters]       = EBhDisable;\n    extensionBehavior[E_GL_ARB_shader_atomic_counter_ops]    = EBhDisable;\n    extensionBehavior[E_GL_ARB_shader_draw_parameters]       = EBhDisable;\n    extensionBehavior[E_GL_ARB_shader_group_vote]            = EBhDisable;\n    extensionBehavior[E_GL_ARB_derivative_control]           = EBhDisable;\n    extensionBehavior[E_GL_ARB_shader_texture_image_samples] = EBhDisable;\n    extensionBehavior[E_GL_ARB_viewport_array]               = EBhDisable;\n    extensionBehavior[E_GL_ARB_gpu_shader_int64]             = EBhDisable;\n    extensionBehavior[E_GL_ARB_gpu_shader_fp64]              = EBhDisable;\n    extensionBehavior[E_GL_ARB_shader_ballot]                = EBhDisable;\n    extensionBehavior[E_GL_ARB_sparse_texture2]              = EBhDisable;\n    extensionBehavior[E_GL_ARB_sparse_texture_clamp]         = EBhDisable;\n    extensionBehavior[E_GL_ARB_shader_stencil_export]        = EBhDisable;\n//    extensionBehavior[E_GL_ARB_cull_distance]                = EBhDisable;    // present for 4.5, but need extension control over block members\n    extensionBehavior[E_GL_ARB_post_depth_coverage]          = EBhDisable;\n    extensionBehavior[E_GL_ARB_shader_viewport_layer_array]  = EBhDisable;\n    extensionBehavior[E_GL_ARB_fragment_shader_interlock]    = EBhDisable;\n    extensionBehavior[E_GL_ARB_shader_clock]                 = EBhDisable;\n    extensionBehavior[E_GL_ARB_uniform_buffer_object]        = EBhDisable;\n    extensionBehavior[E_GL_ARB_sample_shading]               = EBhDisable;\n    extensionBehavior[E_GL_ARB_shader_bit_encoding]          = EBhDisable;\n    extensionBehavior[E_GL_ARB_shader_image_size]            = EBhDisable;\n    extensionBehavior[E_GL_ARB_shader_storage_buffer_object] = EBhDisable;\n    extensionBehavior[E_GL_ARB_shading_language_packing]     = EBhDisable;\n    extensionBehavior[E_GL_ARB_texture_query_lod]            = EBhDisable;\n    extensionBehavior[E_GL_ARB_vertex_attrib_64bit]          = EBhDisable;\n    extensionBehavior[E_GL_NV_gpu_shader5]                   = EBhDisable;\n    extensionBehavior[E_GL_ARB_draw_instanced]               = EBhDisable;\n    extensionBehavior[E_GL_ARB_bindless_texture]             = EBhDisable;\n    extensionBehavior[E_GL_ARB_fragment_coord_conventions]   = EBhDisable;\n\n\n    extensionBehavior[E_GL_KHR_shader_subgroup_basic]            = EBhDisable;\n    extensionBehavior[E_GL_KHR_shader_subgroup_vote]             = EBhDisable;\n    extensionBehavior[E_GL_KHR_shader_subgroup_arithmetic]       = EBhDisable;\n    extensionBehavior[E_GL_KHR_shader_subgroup_ballot]           = EBhDisable;\n    extensionBehavior[E_GL_KHR_shader_subgroup_shuffle]          = EBhDisable;\n    extensionBehavior[E_GL_KHR_shader_subgroup_shuffle_relative] = EBhDisable;\n    extensionBehavior[E_GL_KHR_shader_subgroup_rotate]           = EBhDisable;\n    extensionBehavior[E_GL_KHR_shader_subgroup_clustered]        = EBhDisable;\n    extensionBehavior[E_GL_KHR_shader_subgroup_quad]             = EBhDisable;\n    extensionBehavior[E_GL_KHR_memory_scope_semantics]           = EBhDisable;\n\n    extensionBehavior[E_GL_EXT_shader_atomic_int64]              = EBhDisable;\n\n    extensionBehavior[E_GL_EXT_shader_non_constant_global_initializers] = EBhDisable;\n    extensionBehavior[E_GL_EXT_shader_image_load_formatted]             = EBhDisable;\n    extensionBehavior[E_GL_EXT_post_depth_coverage]                     = EBhDisable;\n    extensionBehavior[E_GL_EXT_control_flow_attributes]                 = EBhDisable;\n    extensionBehavior[E_GL_EXT_nonuniform_qualifier]                    = EBhDisable;\n    extensionBehavior[E_GL_EXT_samplerless_texture_functions]           = EBhDisable;\n    extensionBehavior[E_GL_EXT_scalar_block_layout]                     = EBhDisable;\n    extensionBehavior[E_GL_EXT_fragment_invocation_density]             = EBhDisable;\n    extensionBehavior[E_GL_EXT_buffer_reference]                        = EBhDisable;\n    extensionBehavior[E_GL_EXT_buffer_reference2]                       = EBhDisable;\n    extensionBehavior[E_GL_EXT_buffer_reference_uvec2]                  = EBhDisable;\n    extensionBehavior[E_GL_EXT_demote_to_helper_invocation]             = EBhDisable;\n    extensionBehavior[E_GL_EXT_debug_printf]                            = EBhDisable;\n\n    extensionBehavior[E_GL_EXT_shader_16bit_storage]                    = EBhDisable;\n    extensionBehavior[E_GL_EXT_shader_8bit_storage]                     = EBhDisable;\n    extensionBehavior[E_GL_EXT_subgroup_uniform_control_flow]           = EBhDisable;\n    extensionBehavior[E_GL_EXT_maximal_reconvergence]                   = EBhDisable;\n\n    extensionBehavior[E_GL_EXT_fragment_shader_barycentric]             = EBhDisable;\n    extensionBehavior[E_GL_EXT_expect_assume]                           = EBhDisable;\n\n    extensionBehavior[E_GL_EXT_control_flow_attributes2]                = EBhDisable;\n    extensionBehavior[E_GL_EXT_spec_constant_composites]                = EBhDisable;\n\n    extensionBehavior[E_GL_KHR_cooperative_matrix]                      = EBhDisable;\n    extensionBehavior[E_GL_NV_cooperative_vector]                       = EBhDisable;\n\n    // #line and #include\n    extensionBehavior[E_GL_GOOGLE_cpp_style_line_directive]          = EBhDisable;\n    extensionBehavior[E_GL_GOOGLE_include_directive]                 = EBhDisable;\n    extensionBehavior[E_GL_ARB_shading_language_include]             = EBhDisable;\n\n    extensionBehavior[E_GL_AMD_shader_ballot]                        = EBhDisable;\n    extensionBehavior[E_GL_AMD_shader_trinary_minmax]                = EBhDisable;\n    extensionBehavior[E_GL_AMD_shader_explicit_vertex_parameter]     = EBhDisable;\n    extensionBehavior[E_GL_AMD_gcn_shader]                           = EBhDisable;\n    extensionBehavior[E_GL_AMD_gpu_shader_half_float]                = EBhDisable;\n    extensionBehavior[E_GL_AMD_texture_gather_bias_lod]              = EBhDisable;\n    extensionBehavior[E_GL_AMD_gpu_shader_int16]                     = EBhDisable;\n    extensionBehavior[E_GL_AMD_shader_image_load_store_lod]          = EBhDisable;\n    extensionBehavior[E_GL_AMD_shader_fragment_mask]                 = EBhDisable;\n    extensionBehavior[E_GL_AMD_gpu_shader_half_float_fetch]          = EBhDisable;\n    extensionBehavior[E_GL_AMD_shader_early_and_late_fragment_tests] = EBhDisable;\n\n    extensionBehavior[E_GL_INTEL_shader_integer_functions2]          = EBhDisable;\n\n    extensionBehavior[E_GL_NV_sample_mask_override_coverage]         = EBhDisable;\n    extensionBehavior[E_SPV_NV_geometry_shader_passthrough]          = EBhDisable;\n    extensionBehavior[E_GL_NV_viewport_array2]                       = EBhDisable;\n    extensionBehavior[E_GL_NV_stereo_view_rendering]                 = EBhDisable;\n    extensionBehavior[E_GL_NVX_multiview_per_view_attributes]        = EBhDisable;\n    extensionBehavior[E_GL_NV_shader_atomic_int64]                   = EBhDisable;\n    extensionBehavior[E_GL_NV_conservative_raster_underestimation]   = EBhDisable;\n    extensionBehavior[E_GL_NV_shader_noperspective_interpolation]    = EBhDisable;\n    extensionBehavior[E_GL_NV_shader_subgroup_partitioned]           = EBhDisable;\n    extensionBehavior[E_GL_NV_shading_rate_image]                    = EBhDisable;\n    extensionBehavior[E_GL_NV_ray_tracing]                           = EBhDisable;\n    extensionBehavior[E_GL_NV_ray_tracing_motion_blur]               = EBhDisable;\n    extensionBehavior[E_GL_NV_fragment_shader_barycentric]           = EBhDisable;\n    extensionBehavior[E_GL_NV_compute_shader_derivatives]            = EBhDisable;\n    extensionBehavior[E_GL_NV_shader_texture_footprint]              = EBhDisable;\n    extensionBehavior[E_GL_NV_mesh_shader]                           = EBhDisable;\n    extensionBehavior[E_GL_NV_cooperative_matrix]                    = EBhDisable;\n    extensionBehavior[E_GL_NV_shader_sm_builtins]                    = EBhDisable;\n    extensionBehavior[E_GL_NV_integer_cooperative_matrix]            = EBhDisable;\n    extensionBehavior[E_GL_NV_shader_invocation_reorder]             = EBhDisable;\n    extensionBehavior[E_GL_NV_displacement_micromap]                 = EBhDisable;\n    extensionBehavior[E_GL_NV_shader_atomic_fp16_vector]             = EBhDisable;\n    extensionBehavior[E_GL_NV_cooperative_matrix2]                   = EBhDisable;\n    extensionBehavior[E_GL_NV_cluster_acceleration_structure]        = EBhDisable;\n    extensionBehavior[E_GL_NV_linear_swept_spheres]                  = EBhDisable;\n\n    // ARM\n    extensionBehavior[E_GL_ARM_shader_core_builtins]                 = EBhDisable;\n\n    // QCOM\n    extensionBehavior[E_GL_QCOM_image_processing]                    = EBhDisable;\n    extensionBehavior[E_GL_QCOM_image_processing2]                   = EBhDisable;\n    extensionBehavior[E_GL_QCOM_tile_shading]                        = EBhDisable;\n\n    // AEP\n    extensionBehavior[E_GL_ANDROID_extension_pack_es31a]             = EBhDisable;\n    extensionBehavior[E_GL_KHR_blend_equation_advanced]              = EBhDisable;\n    extensionBehavior[E_GL_OES_sample_variables]                     = EBhDisable;\n    extensionBehavior[E_GL_OES_shader_image_atomic]                  = EBhDisable;\n    extensionBehavior[E_GL_OES_shader_multisample_interpolation]     = EBhDisable;\n    extensionBehavior[E_GL_OES_texture_storage_multisample_2d_array] = EBhDisable;\n    extensionBehavior[E_GL_EXT_geometry_shader]                      = EBhDisable;\n    extensionBehavior[E_GL_EXT_geometry_point_size]                  = EBhDisable;\n    extensionBehavior[E_GL_EXT_gpu_shader5]                          = EBhDisable;\n    extensionBehavior[E_GL_EXT_primitive_bounding_box]               = EBhDisable;\n    extensionBehavior[E_GL_EXT_shader_io_blocks]                     = EBhDisable;\n    extensionBehavior[E_GL_EXT_tessellation_shader]                  = EBhDisable;\n    extensionBehavior[E_GL_EXT_tessellation_point_size]              = EBhDisable;\n    extensionBehavior[E_GL_EXT_texture_buffer]                       = EBhDisable;\n    extensionBehavior[E_GL_EXT_texture_cube_map_array]               = EBhDisable;\n    extensionBehavior[E_GL_EXT_null_initializer]                     = EBhDisable;\n\n    // OES matching AEP\n    extensionBehavior[E_GL_OES_geometry_shader]          = EBhDisable;\n    extensionBehavior[E_GL_OES_geometry_point_size]      = EBhDisable;\n    extensionBehavior[E_GL_OES_gpu_shader5]              = EBhDisable;\n    extensionBehavior[E_GL_OES_primitive_bounding_box]   = EBhDisable;\n    extensionBehavior[E_GL_OES_shader_io_blocks]         = EBhDisable;\n    extensionBehavior[E_GL_OES_tessellation_shader]      = EBhDisable;\n    extensionBehavior[E_GL_OES_tessellation_point_size]  = EBhDisable;\n    extensionBehavior[E_GL_OES_texture_buffer]           = EBhDisable;\n    extensionBehavior[E_GL_OES_texture_cube_map_array]   = EBhDisable;\n    extensionBehavior[E_GL_EXT_shader_integer_mix]       = EBhDisable;\n\n    // EXT extensions\n    extensionBehavior[E_GL_EXT_device_group]                = EBhDisable;\n    extensionBehavior[E_GL_EXT_multiview]                   = EBhDisable;\n    extensionBehavior[E_GL_EXT_shader_realtime_clock]       = EBhDisable;\n    extensionBehavior[E_GL_EXT_ray_tracing]                 = EBhDisable;\n    extensionBehavior[E_GL_EXT_ray_query]                   = EBhDisable;\n    extensionBehavior[E_GL_EXT_ray_flags_primitive_culling] = EBhDisable;\n    extensionBehavior[E_GL_EXT_ray_cull_mask]               = EBhDisable;\n    extensionBehavior[E_GL_EXT_blend_func_extended]         = EBhDisable;\n    extensionBehavior[E_GL_EXT_shader_implicit_conversions] = EBhDisable;\n    extensionBehavior[E_GL_EXT_fragment_shading_rate]       = EBhDisable;\n    extensionBehavior[E_GL_EXT_shader_image_int64]          = EBhDisable;\n    extensionBehavior[E_GL_EXT_terminate_invocation]        = EBhDisable;\n    extensionBehavior[E_GL_EXT_shared_memory_block]         = EBhDisable;\n    extensionBehavior[E_GL_EXT_spirv_intrinsics]            = EBhDisable;\n    extensionBehavior[E_GL_EXT_mesh_shader]                 = EBhDisable;\n    extensionBehavior[E_GL_EXT_opacity_micromap]            = EBhDisable;\n    extensionBehavior[E_GL_EXT_shader_quad_control]         = EBhDisable;\n    extensionBehavior[E_GL_EXT_ray_tracing_position_fetch]  = EBhDisable;\n    extensionBehavior[E_GL_EXT_shader_tile_image]           = EBhDisable;\n    extensionBehavior[E_GL_EXT_texture_shadow_lod]          = EBhDisable;\n    extensionBehavior[E_GL_EXT_draw_instanced]              = EBhDisable;\n    extensionBehavior[E_GL_EXT_texture_array]               = EBhDisable;\n    extensionBehavior[E_GL_EXT_texture_offset_non_const]    = EBhDisable;\n    extensionBehavior[E_GL_EXT_nontemporal_keyword]         = EBhDisable;\n    extensionBehavior[E_GL_EXT_bfloat16]                    = EBhDisable;\n    extensionBehavior[E_GL_EXT_float_e4m3]                  = EBhDisable;\n    extensionBehavior[E_GL_EXT_float_e5m2]                  = EBhDisable;\n\n    // OVR extensions\n    extensionBehavior[E_GL_OVR_multiview]                = EBhDisable;\n    extensionBehavior[E_GL_OVR_multiview2]               = EBhDisable;\n\n    // explicit types\n    extensionBehavior[E_GL_EXT_shader_explicit_arithmetic_types]         = EBhDisable;\n    extensionBehavior[E_GL_EXT_shader_explicit_arithmetic_types_int8]    = EBhDisable;\n    extensionBehavior[E_GL_EXT_shader_explicit_arithmetic_types_int16]   = EBhDisable;\n    extensionBehavior[E_GL_EXT_shader_explicit_arithmetic_types_int32]   = EBhDisable;\n    extensionBehavior[E_GL_EXT_shader_explicit_arithmetic_types_int64]   = EBhDisable;\n    extensionBehavior[E_GL_EXT_shader_explicit_arithmetic_types_float16] = EBhDisable;\n    extensionBehavior[E_GL_EXT_shader_explicit_arithmetic_types_float32] = EBhDisable;\n    extensionBehavior[E_GL_EXT_shader_explicit_arithmetic_types_float64] = EBhDisable;\n\n    // subgroup extended types\n    extensionBehavior[E_GL_EXT_shader_subgroup_extended_types_int8]    = EBhDisable;\n    extensionBehavior[E_GL_EXT_shader_subgroup_extended_types_int16]   = EBhDisable;\n    extensionBehavior[E_GL_EXT_shader_subgroup_extended_types_int64]   = EBhDisable;\n    extensionBehavior[E_GL_EXT_shader_subgroup_extended_types_float16] = EBhDisable;\n    extensionBehavior[E_GL_EXT_shader_atomic_float]                    = EBhDisable;\n    extensionBehavior[E_GL_EXT_shader_atomic_float2]                   = EBhDisable;\n\n    extensionBehavior[E_GL_EXT_integer_dot_product]                    = EBhDisable;\n\n    // Record extensions not for spv.\n    spvUnsupportedExt.push_back(E_GL_ARB_bindless_texture);\n}\n\n// Get code that is not part of a shared symbol table, is specific to this shader,\n// or needed by the preprocessor (which does not use a shared symbol table).\nvoid TParseVersions::getPreamble(std::string& preamble)\n{\n    if (isEsProfile()) {\n        preamble =\n            \"#define GL_ES 1\\n\"\n            \"#define GL_FRAGMENT_PRECISION_HIGH 1\\n\"\n            \"#define GL_OES_texture_3D 1\\n\"\n            \"#define GL_OES_standard_derivatives 1\\n\"\n            \"#define GL_EXT_frag_depth 1\\n\"\n            \"#define GL_OES_EGL_image_external 1\\n\"\n            \"#define GL_OES_EGL_image_external_essl3 1\\n\"\n            \"#define GL_EXT_YUV_target 1\\n\"\n            \"#define GL_EXT_shader_texture_lod 1\\n\"\n            \"#define GL_EXT_shadow_samplers 1\\n\"\n            \"#define GL_EXT_fragment_shading_rate 1\\n\"\n\n            // AEP\n            \"#define GL_ANDROID_extension_pack_es31a 1\\n\"\n            \"#define GL_OES_sample_variables 1\\n\"\n            \"#define GL_OES_shader_image_atomic 1\\n\"\n            \"#define GL_OES_shader_multisample_interpolation 1\\n\"\n            \"#define GL_OES_texture_storage_multisample_2d_array 1\\n\"\n            \"#define GL_EXT_geometry_shader 1\\n\"\n            \"#define GL_EXT_geometry_point_size 1\\n\"\n            \"#define GL_EXT_gpu_shader5 1\\n\"\n            \"#define GL_EXT_primitive_bounding_box 1\\n\"\n            \"#define GL_EXT_shader_io_blocks 1\\n\"\n            \"#define GL_EXT_tessellation_shader 1\\n\"\n            \"#define GL_EXT_tessellation_point_size 1\\n\"\n            \"#define GL_EXT_texture_buffer 1\\n\"\n            \"#define GL_EXT_texture_cube_map_array 1\\n\"\n            \"#define GL_EXT_shader_implicit_conversions 1\\n\"\n            \"#define GL_EXT_shader_integer_mix 1\\n\"\n            \"#define GL_EXT_blend_func_extended 1\\n\"\n\n            // OES matching AEP\n            \"#define GL_OES_geometry_shader 1\\n\"\n            \"#define GL_OES_geometry_point_size 1\\n\"\n            \"#define GL_OES_gpu_shader5 1\\n\"\n            \"#define GL_OES_primitive_bounding_box 1\\n\"\n            \"#define GL_OES_shader_io_blocks 1\\n\"\n            \"#define GL_OES_tessellation_shader 1\\n\"\n            \"#define GL_OES_tessellation_point_size 1\\n\"\n            \"#define GL_OES_texture_buffer 1\\n\"\n            \"#define GL_OES_texture_cube_map_array 1\\n\"\n            \"#define GL_EXT_shader_non_constant_global_initializers 1\\n\"\n\n            \"#define GL_QCOM_image_processing 1\\n\"\n            \"#define GL_QCOM_image_processing2 1\\n\"\n            \"#define GL_QCOM_tile_shading 1\\n\"\n            ;\n\n            if (version >= 300) {\n                preamble += \"#define GL_NV_shader_noperspective_interpolation 1\\n\";\n            }\n            if (version >= 310) {\n                preamble += \"#define GL_EXT_null_initializer 1\\n\";\n                preamble += \"#define GL_EXT_subgroup_uniform_control_flow 1\\n\";\n                preamble += \"#define GL_EXT_maximal_reconvergence 1\\n\";\n            }\n\n    } else { // !isEsProfile()\n        preamble =\n            \"#define GL_ARB_texture_rectangle 1\\n\"\n            \"#define GL_ARB_shading_language_420pack 1\\n\"\n            \"#define GL_ARB_texture_gather 1\\n\"\n            \"#define GL_ARB_gpu_shader5 1\\n\"\n            \"#define GL_ARB_separate_shader_objects 1\\n\"\n            \"#define GL_ARB_compute_shader 1\\n\"\n            \"#define GL_ARB_tessellation_shader 1\\n\"\n            \"#define GL_ARB_enhanced_layouts 1\\n\"\n            \"#define GL_ARB_texture_cube_map_array 1\\n\"\n            \"#define GL_ARB_texture_multisample 1\\n\"\n            \"#define GL_ARB_shader_texture_lod 1\\n\"\n            \"#define GL_ARB_explicit_attrib_location 1\\n\"\n            \"#define GL_ARB_explicit_uniform_location 1\\n\"\n            \"#define GL_ARB_shader_image_load_store 1\\n\"\n            \"#define GL_ARB_shader_atomic_counters 1\\n\"\n            \"#define GL_ARB_shader_draw_parameters 1\\n\"\n            \"#define GL_ARB_shader_group_vote 1\\n\"\n            \"#define GL_ARB_derivative_control 1\\n\"\n            \"#define GL_ARB_shader_texture_image_samples 1\\n\"\n            \"#define GL_ARB_viewport_array 1\\n\"\n            \"#define GL_ARB_gpu_shader_int64 1\\n\"\n            \"#define GL_ARB_gpu_shader_fp64 1\\n\"\n            \"#define GL_ARB_shader_ballot 1\\n\"\n            \"#define GL_ARB_sparse_texture2 1\\n\"\n            \"#define GL_ARB_sparse_texture_clamp 1\\n\"\n            \"#define GL_ARB_shader_stencil_export 1\\n\"\n            \"#define GL_ARB_sample_shading 1\\n\"\n            \"#define GL_ARB_shader_image_size 1\\n\"\n            \"#define GL_ARB_shading_language_packing 1\\n\"\n//            \"#define GL_ARB_cull_distance 1\\n\"    // present for 4.5, but need extension control over block members\n            \"#define GL_ARB_post_depth_coverage 1\\n\"\n            \"#define GL_ARB_fragment_shader_interlock 1\\n\"\n            \"#define GL_ARB_uniform_buffer_object 1\\n\"\n            \"#define GL_ARB_shader_bit_encoding 1\\n\"\n            \"#define GL_ARB_shader_storage_buffer_object 1\\n\"\n            \"#define GL_ARB_texture_query_lod 1\\n\"\n            \"#define GL_ARB_vertex_attrib_64bit 1\\n\"\n            \"#define GL_NV_gpu_shader5 1\\n\"\n            \"#define GL_ARB_draw_instanced 1\\n\"\n            \"#define GL_ARB_fragment_coord_conventions 1\\n\"\n\n            \"#define GL_EXT_shader_non_constant_global_initializers 1\\n\"\n            \"#define GL_EXT_shader_image_load_formatted 1\\n\"\n            \"#define GL_EXT_post_depth_coverage 1\\n\"\n            \"#define GL_EXT_control_flow_attributes 1\\n\"\n            \"#define GL_EXT_nonuniform_qualifier 1\\n\"\n            \"#define GL_EXT_shader_16bit_storage 1\\n\"\n            \"#define GL_EXT_shader_8bit_storage 1\\n\"\n            \"#define GL_EXT_samplerless_texture_functions 1\\n\"\n            \"#define GL_EXT_scalar_block_layout 1\\n\"\n            \"#define GL_EXT_fragment_invocation_density 1\\n\"\n            \"#define GL_EXT_buffer_reference 1\\n\"\n            \"#define GL_EXT_buffer_reference2 1\\n\"\n            \"#define GL_EXT_buffer_reference_uvec2 1\\n\"\n            \"#define GL_EXT_demote_to_helper_invocation 1\\n\"\n            \"#define GL_EXT_debug_printf 1\\n\"\n            \"#define GL_EXT_fragment_shading_rate 1\\n\"\n            \"#define GL_EXT_shared_memory_block 1\\n\"\n            \"#define GL_EXT_shader_integer_mix 1\\n\"\n            \"#define GL_EXT_spec_constant_composites 1\\n\"\n\n            // GL_KHR_shader_subgroup\n            \"#define GL_KHR_shader_subgroup_basic 1\\n\"\n            \"#define GL_KHR_shader_subgroup_vote 1\\n\"\n            \"#define GL_KHR_shader_subgroup_arithmetic 1\\n\"\n            \"#define GL_KHR_shader_subgroup_ballot 1\\n\"\n            \"#define GL_KHR_shader_subgroup_shuffle 1\\n\"\n            \"#define GL_KHR_shader_subgroup_shuffle_relative 1\\n\"\n            \"#define GL_KHR_shader_subgroup_clustered 1\\n\"\n            \"#define GL_KHR_shader_subgroup_quad 1\\n\"\n\n            \"#define GL_KHR_cooperative_matrix 1\\n\"\n\n            \"#define GL_EXT_shader_image_int64 1\\n\"\n            \"#define GL_EXT_shader_atomic_int64 1\\n\"\n            \"#define GL_EXT_shader_realtime_clock 1\\n\"\n            \"#define GL_EXT_ray_tracing 1\\n\"\n            \"#define GL_EXT_ray_query 1\\n\"\n            \"#define GL_EXT_ray_flags_primitive_culling 1\\n\"\n            \"#define GL_EXT_ray_cull_mask 1\\n\"\n            \"#define GL_EXT_ray_tracing_position_fetch 1\\n\"\n            \"#define GL_EXT_spirv_intrinsics 1\\n\"\n            \"#define GL_EXT_mesh_shader 1\\n\"\n\n            \"#define GL_AMD_shader_ballot 1\\n\"\n            \"#define GL_AMD_shader_trinary_minmax 1\\n\"\n            \"#define GL_AMD_shader_explicit_vertex_parameter 1\\n\"\n            \"#define GL_AMD_gcn_shader 1\\n\"\n            \"#define GL_AMD_gpu_shader_half_float 1\\n\"\n            \"#define GL_AMD_texture_gather_bias_lod 1\\n\"\n            \"#define GL_AMD_gpu_shader_int16 1\\n\"\n            \"#define GL_AMD_shader_image_load_store_lod 1\\n\"\n            \"#define GL_AMD_shader_fragment_mask 1\\n\"\n            \"#define GL_AMD_gpu_shader_half_float_fetch 1\\n\"\n\n            \"#define GL_INTEL_shader_integer_functions2 1\\n\"\n\n            \"#define GL_NV_sample_mask_override_coverage 1\\n\"\n            \"#define GL_NV_geometry_shader_passthrough 1\\n\"\n            \"#define GL_NV_viewport_array2 1\\n\"\n            \"#define GL_NV_shader_atomic_int64 1\\n\"\n            \"#define GL_NV_conservative_raster_underestimation 1\\n\"\n            \"#define GL_NV_shader_subgroup_partitioned 1\\n\"\n            \"#define GL_NV_shading_rate_image 1\\n\"\n            \"#define GL_NV_ray_tracing 1\\n\"\n            \"#define GL_NV_ray_tracing_motion_blur 1\\n\"\n            \"#define GL_NV_fragment_shader_barycentric 1\\n\"\n            \"#define GL_NV_compute_shader_derivatives 1\\n\"\n            \"#define GL_NV_shader_texture_footprint 1\\n\"\n            \"#define GL_NV_mesh_shader 1\\n\"\n            \"#define GL_NV_cooperative_matrix 1\\n\"\n            \"#define GL_NV_integer_cooperative_matrix 1\\n\"\n            \"#define GL_NV_shader_invocation_reorder 1\\n\"\n            \"#define GL_NV_cooperative_matrix2 1\\n\"\n\n            \"#define GL_QCOM_image_processing 1\\n\"\n            \"#define GL_QCOM_image_processing2 1\\n\"\n            \"#define GL_QCOM_tile_shading 1\\n\"\n\n            \"#define GL_EXT_shader_explicit_arithmetic_types 1\\n\"\n            \"#define GL_EXT_shader_explicit_arithmetic_types_int8 1\\n\"\n            \"#define GL_EXT_shader_explicit_arithmetic_types_int16 1\\n\"\n            \"#define GL_EXT_shader_explicit_arithmetic_types_int32 1\\n\"\n            \"#define GL_EXT_shader_explicit_arithmetic_types_int64 1\\n\"\n            \"#define GL_EXT_shader_explicit_arithmetic_types_float16 1\\n\"\n            \"#define GL_EXT_shader_explicit_arithmetic_types_float32 1\\n\"\n            \"#define GL_EXT_shader_explicit_arithmetic_types_float64 1\\n\"\n\n            \"#define GL_EXT_shader_subgroup_extended_types_int8 1\\n\"\n            \"#define GL_EXT_shader_subgroup_extended_types_int16 1\\n\"\n            \"#define GL_EXT_shader_subgroup_extended_types_int64 1\\n\"\n            \"#define GL_EXT_shader_subgroup_extended_types_float16 1\\n\"\n\n            \"#define GL_EXT_shader_atomic_float 1\\n\"\n            \"#define GL_EXT_shader_atomic_float2 1\\n\"\n\n            \"#define GL_EXT_fragment_shader_barycentric 1\\n\"\n            \"#define GL_EXT_shader_quad_control 1\\n\"\n            \"#define GL_EXT_texture_array 1\\n\"\n\n            \"#define GL_EXT_control_flow_attributes2 1\\n\"\n\n            \"#define GL_EXT_integer_dot_product 1\\n\"\n            \"#define GL_EXT_bfloat16 1\\n\"\n            \"#define GL_EXT_float_e5m2 1\\n\"\n            \"#define GL_EXT_float_e4m3 1\\n\"\n            ;\n\n        if (spvVersion.spv == 0) {\n            preamble += \"#define GL_ARB_bindless_texture 1\\n\";\n        }\n\n        if (version >= 150) {\n            // define GL_core_profile and GL_compatibility_profile\n            preamble += \"#define GL_core_profile 1\\n\";\n\n            if (profile == ECompatibilityProfile)\n                preamble += \"#define GL_compatibility_profile 1\\n\";\n        }\n        if (version >= 140) {\n            preamble += \"#define GL_EXT_null_initializer 1\\n\";\n            preamble += \"#define GL_EXT_subgroup_uniform_control_flow 1\\n\";\n            preamble += \"#define GL_EXT_maximal_reconvergence 1\\n\";\n        }\n        if (version >= 130) {\n            preamble +=\"#define GL_FRAGMENT_PRECISION_HIGH 1\\n\";\n        }\n    }\n\n    if ((!isEsProfile() && version >= 140) ||\n        (isEsProfile() && version >= 310)) {\n        preamble +=\n            \"#define GL_EXT_device_group 1\\n\"\n            \"#define GL_EXT_multiview 1\\n\"\n            \"#define GL_NV_shader_sm_builtins 1\\n\"\n            ;\n    }\n\n    if ((!isEsProfile() && version >= 130) ||\n        (isEsProfile() && version >= 300)) {\n        preamble += \"#define GL_EXT_texture_offset_non_const 1\\n\";\n    }\n\n    if (version >= 300 /* both ES and non-ES */) {\n        preamble +=\n            \"#define GL_OVR_multiview 1\\n\"\n            \"#define GL_OVR_multiview2 1\\n\"\n            ;\n    }\n\n    // #line and #include\n    preamble +=\n            \"#define GL_GOOGLE_cpp_style_line_directive 1\\n\"\n            \"#define GL_GOOGLE_include_directive 1\\n\"\n            \"#define GL_KHR_blend_equation_advanced 1\\n\"\n            ;\n\n    // other general extensions\n    preamble +=\n            \"#define GL_EXT_terminate_invocation 1\\n\"\n            ;\n\n    // #define VULKAN XXXX\n    const int numberBufSize = 12;\n    char numberBuf[numberBufSize];\n    if (spvVersion.vulkanGlsl > 0) {\n        preamble += \"#define VULKAN \";\n        snprintf(numberBuf, numberBufSize, \"%d\", spvVersion.vulkanGlsl);\n        preamble += numberBuf;\n        preamble += \"\\n\";\n    }\n\n    // #define GL_SPIRV XXXX\n    if (spvVersion.openGl > 0) {\n        preamble += \"#define GL_SPIRV \";\n        snprintf(numberBuf, numberBufSize, \"%d\", spvVersion.openGl);\n        preamble += numberBuf;\n        preamble += \"\\n\";\n    }\n\n    // GL_EXT_spirv_intrinsics\n    if (!isEsProfile()) {\n        switch (language) {\n        case EShLangVertex:         preamble += \"#define GL_VERTEX_SHADER 1 \\n\";                    break;\n        case EShLangTessControl:    preamble += \"#define GL_TESSELLATION_CONTROL_SHADER 1 \\n\";      break;\n        case EShLangTessEvaluation: preamble += \"#define GL_TESSELLATION_EVALUATION_SHADER 1 \\n\";   break;\n        case EShLangGeometry:       preamble += \"#define GL_GEOMETRY_SHADER 1 \\n\";                  break;\n        case EShLangFragment:       preamble += \"#define GL_FRAGMENT_SHADER 1 \\n\";                  break;\n        case EShLangCompute:        preamble += \"#define GL_COMPUTE_SHADER 1 \\n\";                   break;\n        case EShLangRayGen:         preamble += \"#define GL_RAY_GENERATION_SHADER_EXT 1 \\n\";        break;\n        case EShLangIntersect:      preamble += \"#define GL_INTERSECTION_SHADER_EXT 1 \\n\";          break;\n        case EShLangAnyHit:         preamble += \"#define GL_ANY_HIT_SHADER_EXT 1 \\n\";               break;\n        case EShLangClosestHit:     preamble += \"#define GL_CLOSEST_HIT_SHADER_EXT 1 \\n\";           break;\n        case EShLangMiss:           preamble += \"#define GL_MISS_SHADER_EXT 1 \\n\";                  break;\n        case EShLangCallable:       preamble += \"#define GL_CALLABLE_SHADER_EXT 1 \\n\";              break;\n        case EShLangTask:           preamble += \"#define GL_TASK_SHADER_NV 1 \\n\";                   break;\n        case EShLangMesh:           preamble += \"#define GL_MESH_SHADER_NV 1 \\n\";                   break;\n        default:                                                                                    break;\n        }\n    }\n}\n\n//\n// Map from stage enum to externally readable text name.\n//\nconst char* StageName(EShLanguage stage)\n{\n    switch(stage) {\n    case EShLangVertex:         return \"vertex\";\n    case EShLangFragment:       return \"fragment\";\n    case EShLangCompute:        return \"compute\";\n    case EShLangTessControl:    return \"tessellation control\";\n    case EShLangTessEvaluation: return \"tessellation evaluation\";\n    case EShLangGeometry:       return \"geometry\";\n    case EShLangRayGen:         return \"ray-generation\";\n    case EShLangIntersect:      return \"intersection\";\n    case EShLangAnyHit:         return \"any-hit\";\n    case EShLangClosestHit:     return \"closest-hit\";\n    case EShLangMiss:           return \"miss\";\n    case EShLangCallable:       return \"callable\";\n    case EShLangMesh:           return \"mesh\";\n    case EShLangTask:           return \"task\";\n    default:                    return \"unknown stage\";\n    }\n}\n\n//\n// When to use requireStage()\n//\n//     If only some stages support a feature.\n//\n// Operation: If the current stage is not present, give an error message.\n//\nvoid TParseVersions::requireStage(const TSourceLoc& loc, EShLanguageMask languageMask, const char* featureDesc)\n{\n    if (((1 << language) & languageMask) == 0)\n        error(loc, \"not supported in this stage:\", featureDesc, StageName(language));\n}\n\n// If only one stage supports a feature, this can be called.  But, all supporting stages\n// must be specified with one call.\nvoid TParseVersions::requireStage(const TSourceLoc& loc, EShLanguage stage, const char* featureDesc)\n{\n    requireStage(loc, static_cast<EShLanguageMask>(1 << stage), featureDesc);\n}\n\n//\n// When to use requireProfile():\n//\n//     Use if only some profiles support a feature.  However, if within a profile the feature\n//     is version or extension specific, follow this call with calls to profileRequires().\n//\n// Operation:  If the current profile is not one of the profileMask,\n// give an error message.\n//\nvoid TParseVersions::requireProfile(const TSourceLoc& loc, int profileMask, const char* featureDesc)\n{\n    if (! (profile & profileMask))\n        error(loc, \"not supported with this profile:\", featureDesc, ProfileName(profile));\n}\n\n//\n// When to use profileRequires():\n//\n//     If a set of profiles have the same requirements for what version or extensions\n//     are needed to support a feature.\n//\n//     It must be called for each profile that needs protection.  Use requireProfile() first\n//     to reduce that set of profiles.\n//\n// Operation: Will issue warnings/errors based on the current profile, version, and extension\n// behaviors.  It only checks extensions when the current profile is one of the profileMask.\n//\n// A minVersion of 0 means no version of the profileMask support this in core,\n// the extension must be present.\n//\n\n// entry point that takes multiple extensions\nvoid TParseVersions::profileRequires(const TSourceLoc& loc, int profileMask, int minVersion, int numExtensions,\n    const char* const extensions[], const char* featureDesc)\n{\n    if (profile & profileMask) {\n        bool okay = minVersion > 0 && version >= minVersion;\n        for (int i = 0; i < numExtensions; ++i) {\n            switch (getExtensionBehavior(extensions[i])) {\n            case EBhWarn:\n                infoSink.info.message(EPrefixWarning, (\"extension \" + TString(extensions[i]) + \" is being used for \" + featureDesc).c_str(), loc, messages & EShMsgAbsolutePath, messages & EShMsgDisplayErrorColumn);\n                [[fallthrough]];\n            case EBhRequire:\n            case EBhEnable:\n                okay = true;\n                break;\n            default: break; // some compilers want this\n            }\n        }\n        if (! okay)\n            error(loc, \"not supported for this version or the enabled extensions\", featureDesc, \"\");\n    }\n}\n\n// entry point for the above that takes a single extension\nvoid TParseVersions::profileRequires(const TSourceLoc& loc, int profileMask, int minVersion, const char* extension,\n    const char* featureDesc)\n{\n    profileRequires(loc, profileMask, minVersion, extension ? 1 : 0, &extension, featureDesc);\n}\n\nvoid TParseVersions::unimplemented(const TSourceLoc& loc, const char* featureDesc)\n{\n    error(loc, \"feature not yet implemented\", featureDesc, \"\");\n}\n\n//\n// Within a set of profiles, see if a feature is deprecated and give an error or warning based on whether\n// a future compatibility context is being use.\n//\nvoid TParseVersions::checkDeprecated(const TSourceLoc& loc, int profileMask, int depVersion, const char* featureDesc)\n{\n    if (profile & profileMask) {\n        if (version >= depVersion) {\n            if (forwardCompatible)\n                error(loc, \"deprecated, may be removed in future release\", featureDesc, \"\");\n            else if (! suppressWarnings())\n                infoSink.info.message(EPrefixWarning, (TString(featureDesc) + \" deprecated in version \" +\n                                                       String(depVersion) + \"; may be removed in future release\").c_str(), \n                                                       loc, messages & EShMsgAbsolutePath, messages & EShMsgDisplayErrorColumn);\n        }\n    }\n}\n\n//\n// Within a set of profiles, see if a feature has now been removed and if so, give an error.\n// The version argument is the first version no longer having the feature.\n//\nvoid TParseVersions::requireNotRemoved(const TSourceLoc& loc, int profileMask, int removedVersion, const char* featureDesc)\n{\n    if (profile & profileMask) {\n        if (version >= removedVersion) {\n            const int maxSize = 60;\n            char buf[maxSize];\n            snprintf(buf, maxSize, \"%s profile; removed in version %d\", ProfileName(profile), removedVersion);\n            error(loc, \"no longer supported in\", featureDesc, buf);\n        }\n    }\n}\n\n// Returns true if at least one of the extensions in the extensions parameter is requested. Otherwise, returns false.\n// Warns appropriately if the requested behavior of an extension is \"warn\".\nbool TParseVersions::checkExtensionsRequested(const TSourceLoc& loc, int numExtensions, const char* const extensions[], const char* featureDesc)\n{\n    // First, see if any of the extensions are enabled\n    for (int i = 0; i < numExtensions; ++i) {\n        TExtensionBehavior behavior = getExtensionBehavior(extensions[i]);\n        if (behavior == EBhEnable || behavior == EBhRequire)\n            return true;\n    }\n\n    // See if any extensions want to give a warning on use; give warnings for all such extensions\n    bool warned = false;\n    for (int i = 0; i < numExtensions; ++i) {\n        TExtensionBehavior behavior = getExtensionBehavior(extensions[i]);\n        if (behavior == EBhDisable && relaxedErrors()) {\n            infoSink.info.message(EPrefixWarning, \"The following extension must be enabled to use this feature:\", loc,\n                                  messages & EShMsgAbsolutePath, messages & EShMsgDisplayErrorColumn);\n            behavior = EBhWarn;\n        }\n        if (behavior == EBhWarn) {\n            infoSink.info.message(EPrefixWarning,\n                                  (\"extension \" + TString(extensions[i]) + \" is being used for \" + featureDesc).c_str(),\n                                  loc, messages & EShMsgAbsolutePath, messages & EShMsgDisplayErrorColumn);\n            warned = true;\n        }\n    }\n    if (warned)\n        return true;\n    return false;\n}\n\n//\n// Use when there are no profile/version to check, it's just an error if one of the\n// extensions is not present.\n//\nvoid TParseVersions::requireExtensions(const TSourceLoc& loc, int numExtensions, const char* const extensions[],\n    const char* featureDesc)\n{\n    if (checkExtensionsRequested(loc, numExtensions, extensions, featureDesc))\n        return;\n\n    // If we get this far, give errors explaining what extensions are needed\n    if (numExtensions == 1)\n        error(loc, \"required extension not requested:\", featureDesc, extensions[0]);\n    else {\n        error(loc, \"required extension not requested:\", featureDesc, \"Possible extensions include:\");\n        for (int i = 0; i < numExtensions; ++i)\n            infoSink.info.message(EPrefixNone, extensions[i]);\n    }\n}\n\n//\n// Use by preprocessor when there are no profile/version to check, it's just an error if one of the\n// extensions is not present.\n//\nvoid TParseVersions::ppRequireExtensions(const TSourceLoc& loc, int numExtensions, const char* const extensions[],\n    const char* featureDesc)\n{\n    if (checkExtensionsRequested(loc, numExtensions, extensions, featureDesc))\n        return;\n\n    // If we get this far, give errors explaining what extensions are needed\n    if (numExtensions == 1)\n        ppError(loc, \"required extension not requested:\", featureDesc, extensions[0]);\n    else {\n        ppError(loc, \"required extension not requested:\", featureDesc, \"Possible extensions include:\");\n        for (int i = 0; i < numExtensions; ++i)\n            infoSink.info.message(EPrefixNone, extensions[i]);\n    }\n}\n\nTExtensionBehavior TParseVersions::getExtensionBehavior(const char* extension)\n{\n    auto iter = extensionBehavior.find(TString(extension));\n    if (iter == extensionBehavior.end())\n        return EBhMissing;\n    else\n        return iter->second;\n}\n\n// Returns true if the given extension is set to enable, require, or warn.\nbool TParseVersions::extensionTurnedOn(const char* const extension)\n{\n      switch (getExtensionBehavior(extension)) {\n      case EBhEnable:\n      case EBhRequire:\n      case EBhWarn:\n          return true;\n      default:\n          break;\n      }\n      return false;\n}\n// See if any of the extensions are set to enable, require, or warn.\nbool TParseVersions::extensionsTurnedOn(int numExtensions, const char* const extensions[])\n{\n    for (int i = 0; i < numExtensions; ++i) {\n        if (extensionTurnedOn(extensions[i]))\n            return true;\n    }\n    return false;\n}\n\n//\n// Change the current state of an extension's behavior.\n//\nvoid TParseVersions::updateExtensionBehavior(int line, const char* extension, const char* behaviorString)\n{\n    // Translate from text string of extension's behavior to an enum.\n    TExtensionBehavior behavior = EBhDisable;\n    if (! strcmp(\"require\", behaviorString))\n        behavior = EBhRequire;\n    else if (! strcmp(\"enable\", behaviorString))\n        behavior = EBhEnable;\n    else if (! strcmp(\"disable\", behaviorString))\n        behavior = EBhDisable;\n    else if (! strcmp(\"warn\", behaviorString))\n        behavior = EBhWarn;\n    else {\n        error(getCurrentLoc(), \"behavior not supported:\", \"#extension\", behaviorString);\n        return;\n    }\n    bool on = behavior != EBhDisable;\n\n    // check if extension is used with correct shader stage\n    checkExtensionStage(getCurrentLoc(), extension);\n\n    // check if extension has additional requirements\n    extensionRequires(getCurrentLoc(), extension, behaviorString);\n\n    // update the requested extension\n    updateExtensionBehavior(extension, behavior);\n\n    // see if need to propagate to implicitly modified things\n    if (strcmp(extension, \"GL_ANDROID_extension_pack_es31a\") == 0) {\n        // to everything in AEP\n        updateExtensionBehavior(line, \"GL_KHR_blend_equation_advanced\", behaviorString);\n        updateExtensionBehavior(line, \"GL_OES_sample_variables\", behaviorString);\n        updateExtensionBehavior(line, \"GL_OES_shader_image_atomic\", behaviorString);\n        updateExtensionBehavior(line, \"GL_OES_shader_multisample_interpolation\", behaviorString);\n        updateExtensionBehavior(line, \"GL_OES_texture_storage_multisample_2d_array\", behaviorString);\n        updateExtensionBehavior(line, \"GL_EXT_geometry_shader\", behaviorString);\n        updateExtensionBehavior(line, \"GL_EXT_gpu_shader5\", behaviorString);\n        updateExtensionBehavior(line, \"GL_EXT_primitive_bounding_box\", behaviorString);\n        updateExtensionBehavior(line, \"GL_EXT_shader_io_blocks\", behaviorString);\n        updateExtensionBehavior(line, \"GL_EXT_tessellation_shader\", behaviorString);\n        updateExtensionBehavior(line, \"GL_EXT_texture_buffer\", behaviorString);\n        updateExtensionBehavior(line, \"GL_EXT_texture_cube_map_array\", behaviorString);\n    }\n    // geometry to io_blocks\n    else if (strcmp(extension, \"GL_EXT_geometry_shader\") == 0)\n        updateExtensionBehavior(line, \"GL_EXT_shader_io_blocks\", behaviorString);\n    else if (strcmp(extension, \"GL_OES_geometry_shader\") == 0)\n        updateExtensionBehavior(line, \"GL_OES_shader_io_blocks\", behaviorString);\n    // tessellation to io_blocks\n    else if (strcmp(extension, \"GL_EXT_tessellation_shader\") == 0)\n        updateExtensionBehavior(line, \"GL_EXT_shader_io_blocks\", behaviorString);\n    else if (strcmp(extension, \"GL_OES_tessellation_shader\") == 0)\n        updateExtensionBehavior(line, \"GL_OES_shader_io_blocks\", behaviorString);\n    else if (strcmp(extension, \"GL_GOOGLE_include_directive\") == 0)\n        updateExtensionBehavior(line, \"GL_GOOGLE_cpp_style_line_directive\", behaviorString);\n    else if (strcmp(extension, \"GL_ARB_shading_language_include\") == 0)\n        updateExtensionBehavior(line, \"GL_GOOGLE_cpp_style_line_directive\", behaviorString);\n    // subgroup_* to subgroup_basic\n    else if (strcmp(extension, \"GL_KHR_shader_subgroup_vote\") == 0)\n        updateExtensionBehavior(line, \"GL_KHR_shader_subgroup_basic\", behaviorString);\n    else if (strcmp(extension, \"GL_KHR_shader_subgroup_arithmetic\") == 0)\n        updateExtensionBehavior(line, \"GL_KHR_shader_subgroup_basic\", behaviorString);\n    else if (strcmp(extension, \"GL_KHR_shader_subgroup_ballot\") == 0)\n        updateExtensionBehavior(line, \"GL_KHR_shader_subgroup_basic\", behaviorString);\n    else if (strcmp(extension, \"GL_KHR_shader_subgroup_shuffle\") == 0)\n        updateExtensionBehavior(line, \"GL_KHR_shader_subgroup_basic\", behaviorString);\n    else if (strcmp(extension, \"GL_KHR_shader_subgroup_shuffle_relative\") == 0)\n        updateExtensionBehavior(line, \"GL_KHR_shader_subgroup_basic\", behaviorString);\n    else if (strcmp(extension, \"GL_KHR_shader_subgroup_clustered\") == 0)\n        updateExtensionBehavior(line, \"GL_KHR_shader_subgroup_basic\", behaviorString);\n    else if (strcmp(extension, \"GL_KHR_shader_subgroup_quad\") == 0)\n        updateExtensionBehavior(line, \"GL_KHR_shader_subgroup_basic\", behaviorString);\n    else if (strcmp(extension, \"GL_NV_shader_subgroup_partitioned\") == 0)\n        updateExtensionBehavior(line, \"GL_KHR_shader_subgroup_basic\", behaviorString);\n    else if (strcmp(extension, \"GL_EXT_buffer_reference2\") == 0 ||\n             strcmp(extension, \"GL_EXT_buffer_reference_uvec2\") == 0)\n        updateExtensionBehavior(line, \"GL_EXT_buffer_reference\", behaviorString);\n    else if (strcmp(extension, \"GL_NV_integer_cooperative_matrix\") == 0)\n        updateExtensionBehavior(line, \"GL_NV_cooperative_matrix\", behaviorString);\n    else if (strcmp(extension, \"GL_NV_cooperative_matrix2\") == 0)\n        updateExtensionBehavior(line, \"GL_KHR_cooperative_matrix\", behaviorString);\n    // subgroup extended types to explicit types\n    else if (strcmp(extension, \"GL_EXT_shader_subgroup_extended_types_int8\") == 0)\n        updateExtensionBehavior(line, \"GL_EXT_shader_explicit_arithmetic_types_int8\", behaviorString);\n    else if (strcmp(extension, \"GL_EXT_shader_subgroup_extended_types_int16\") == 0)\n        updateExtensionBehavior(line, \"GL_EXT_shader_explicit_arithmetic_types_int16\", behaviorString);\n    else if (strcmp(extension, \"GL_EXT_shader_subgroup_extended_types_int64\") == 0)\n        updateExtensionBehavior(line, \"GL_EXT_shader_explicit_arithmetic_types_int64\", behaviorString);\n    else if (strcmp(extension, \"GL_EXT_shader_subgroup_extended_types_float16\") == 0)\n        updateExtensionBehavior(line, \"GL_EXT_shader_explicit_arithmetic_types_float16\", behaviorString);\n\n    // see if we need to update the numeric features\n    else if (strcmp(extension, \"GL_EXT_shader_explicit_arithmetic_types\") == 0)\n        intermediate.updateNumericFeature(TNumericFeatures::shader_explicit_arithmetic_types, on);\n    else if (strcmp(extension, \"GL_EXT_shader_explicit_arithmetic_types_int8\") == 0)\n        intermediate.updateNumericFeature(TNumericFeatures::shader_explicit_arithmetic_types_int8, on);\n    else if (strcmp(extension, \"GL_EXT_shader_explicit_arithmetic_types_int16\") == 0)\n        intermediate.updateNumericFeature(TNumericFeatures::shader_explicit_arithmetic_types_int16, on);\n    else if (strcmp(extension, \"GL_EXT_shader_explicit_arithmetic_types_int32\") == 0)\n        intermediate.updateNumericFeature(TNumericFeatures::shader_explicit_arithmetic_types_int32, on);\n    else if (strcmp(extension, \"GL_EXT_shader_explicit_arithmetic_types_int64\") == 0)\n        intermediate.updateNumericFeature(TNumericFeatures::shader_explicit_arithmetic_types_int64, on);\n    else if (strcmp(extension, \"GL_EXT_shader_explicit_arithmetic_types_float16\") == 0)\n        intermediate.updateNumericFeature(TNumericFeatures::shader_explicit_arithmetic_types_float16, on);\n    else if (strcmp(extension, \"GL_EXT_shader_explicit_arithmetic_types_float32\") == 0)\n        intermediate.updateNumericFeature(TNumericFeatures::shader_explicit_arithmetic_types_float32, on);\n    else if (strcmp(extension, \"GL_EXT_shader_explicit_arithmetic_types_float64\") == 0)\n        intermediate.updateNumericFeature(TNumericFeatures::shader_explicit_arithmetic_types_float64, on);\n    else if (strcmp(extension, \"GL_EXT_shader_implicit_conversions\") == 0)\n        intermediate.updateNumericFeature(TNumericFeatures::shader_implicit_conversions, on);\n    else if (strcmp(extension, \"GL_ARB_gpu_shader_fp64\") == 0)\n        intermediate.updateNumericFeature(TNumericFeatures::gpu_shader_fp64, on);\n    else if (strcmp(extension, \"GL_AMD_gpu_shader_int16\") == 0)\n        intermediate.updateNumericFeature(TNumericFeatures::gpu_shader_int16, on);\n    else if (strcmp(extension, \"GL_AMD_gpu_shader_half_float\") == 0)\n        intermediate.updateNumericFeature(TNumericFeatures::gpu_shader_half_float, on);\n    else if (strcmp(extension, \"GL_NV_gpu_shader5\") == 0) {\n        intermediate.updateNumericFeature(TNumericFeatures::nv_gpu_shader5_types, on);\n    }\n}\n\nvoid TParseVersions::updateExtensionBehavior(const char* extension, TExtensionBehavior behavior)\n{\n    // Update the current behavior\n    if (strcmp(extension, \"all\") == 0) {\n        // special case for the 'all' extension; apply it to every extension present\n        if (behavior == EBhRequire || behavior == EBhEnable) {\n            error(getCurrentLoc(), \"extension 'all' cannot have 'require' or 'enable' behavior\", \"#extension\", \"\");\n            return;\n        } else {\n            for (auto iter = extensionBehavior.begin(); iter != extensionBehavior.end(); ++iter)\n                iter->second = behavior;\n        }\n    } else {\n        // Do the update for this single extension\n        auto iter = extensionBehavior.find(TString(extension));\n        if (iter == extensionBehavior.end()) {\n            switch (behavior) {\n            case EBhRequire:\n                error(getCurrentLoc(), \"extension not supported:\", \"#extension\", extension);\n                break;\n            case EBhEnable:\n            case EBhWarn:\n            case EBhDisable:\n                warn(getCurrentLoc(), \"extension not supported:\", \"#extension\", extension);\n                break;\n            default:\n                assert(0 && \"unexpected behavior\");\n            }\n\n            return;\n        } else {\n            if (iter->second == EBhDisablePartial)\n                warn(getCurrentLoc(), \"extension is only partially supported:\", \"#extension\", extension);\n            if (behavior != EBhDisable)\n                intermediate.addRequestedExtension(extension);\n            iter->second = behavior;\n        }\n    }\n}\n\n// Check if extension is used with correct shader stage.\nvoid TParseVersions::checkExtensionStage(const TSourceLoc& loc, const char * const extension)\n{\n    // GL_NV_mesh_shader extension is only allowed in task/mesh shaders\n    if (strcmp(extension, \"GL_NV_mesh_shader\") == 0) {\n        requireStage(loc, (EShLanguageMask)(EShLangTaskMask | EShLangMeshMask | EShLangFragmentMask),\n                     \"#extension GL_NV_mesh_shader\");\n        profileRequires(loc, ECoreProfile, 450, nullptr, \"#extension GL_NV_mesh_shader\");\n        profileRequires(loc, EEsProfile, 320, nullptr, \"#extension GL_NV_mesh_shader\");\n        if (extensionTurnedOn(E_GL_EXT_mesh_shader)) {\n            error(loc, \"GL_EXT_mesh_shader is already turned on, and not allowed with\", \"#extension\", extension);\n        }\n    }\n    else if (strcmp(extension, \"GL_EXT_mesh_shader\") == 0) {\n        requireStage(loc, (EShLanguageMask)(EShLangTaskMask | EShLangMeshMask | EShLangFragmentMask),\n                     \"#extension GL_EXT_mesh_shader\");\n        profileRequires(loc, ECoreProfile, 450, nullptr, \"#extension GL_EXT_mesh_shader\");\n        profileRequires(loc, EEsProfile, 320, nullptr, \"#extension GL_EXT_mesh_shader\");\n        if (extensionTurnedOn(E_GL_NV_mesh_shader)) {\n            error(loc, \"GL_NV_mesh_shader is already turned on, and not allowed with\", \"#extension\", extension);\n        }\n    }\n}\n\n// Check if extension has additional requirements\nvoid TParseVersions::extensionRequires(const TSourceLoc &loc, const char * const extension, const char *behaviorString)\n{\n    bool isEnabled = false;\n    if (!strcmp(\"require\", behaviorString))\n        isEnabled = true;\n    else if (!strcmp(\"enable\", behaviorString))\n        isEnabled = true;\n\n    if (isEnabled) {\n        unsigned int minSpvVersion = 0;\n        auto iter = extensionMinSpv.find(TString(extension));\n        if (iter != extensionMinSpv.end())\n            minSpvVersion = iter->second;\n        requireSpv(loc, extension, minSpvVersion);\n    }\n\n    if (spvVersion.spv != 0){\n        for (auto ext : spvUnsupportedExt){\n            if (strcmp(extension, ext.c_str()) == 0)\n                error(loc, \"not allowed when using generating SPIR-V codes\", extension, \"\");\n        }\n    }\n}\n\n// Call for any operation needing full GLSL integer data-type support.\nvoid TParseVersions::fullIntegerCheck(const TSourceLoc& loc, const char* op)\n{\n    profileRequires(loc, ENoProfile, 130, nullptr, op);\n    profileRequires(loc, EEsProfile, 300, nullptr, op);\n}\n\n// Call for any operation needing GLSL double data-type support.\nvoid TParseVersions::doubleCheck(const TSourceLoc& loc, const char* op)\n{\n\n    //requireProfile(loc, ECoreProfile | ECompatibilityProfile, op);\n    if (language == EShLangVertex) {\n        const char* const f64_Extensions[] = {E_GL_ARB_gpu_shader_fp64, E_GL_ARB_vertex_attrib_64bit};\n        profileRequires(loc, ECoreProfile | ECompatibilityProfile, 400, 2, f64_Extensions, op);\n    } else\n        profileRequires(loc, ECoreProfile | ECompatibilityProfile, 400, E_GL_ARB_gpu_shader_fp64, op);\n}\n\n// Call for any operation needing GLSL float16 data-type support.\nvoid TParseVersions::float16Check(const TSourceLoc& loc, const char* op, bool builtIn)\n{\n    if (!builtIn) {\n        const char* const extensions[] = {\n                                           E_GL_AMD_gpu_shader_half_float,\n                                           E_GL_EXT_shader_explicit_arithmetic_types,\n                                           E_GL_EXT_shader_explicit_arithmetic_types_float16};\n        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);\n    }\n}\n\nbool TParseVersions::float16Arithmetic()\n{\n    const char* const extensions[] = {\n                                       E_GL_AMD_gpu_shader_half_float,\n                                       E_GL_EXT_shader_explicit_arithmetic_types,\n                                       E_GL_NV_gpu_shader5,\n                                       E_GL_EXT_shader_explicit_arithmetic_types_float16};\n    return extensionsTurnedOn(sizeof(extensions)/sizeof(extensions[0]), extensions);\n}\n\nbool TParseVersions::int16Arithmetic()\n{\n    const char* const extensions[] = {\n                                       E_GL_AMD_gpu_shader_int16,\n                                       E_GL_EXT_shader_explicit_arithmetic_types,\n                                       E_GL_NV_gpu_shader5,\n                                       E_GL_EXT_shader_explicit_arithmetic_types_int16};\n    return extensionsTurnedOn(sizeof(extensions)/sizeof(extensions[0]), extensions);\n}\n\nbool TParseVersions::int8Arithmetic()\n{\n    const char* const extensions[] = {\n                                       E_GL_EXT_shader_explicit_arithmetic_types,\n                                       E_GL_NV_gpu_shader5,\n                                       E_GL_EXT_shader_explicit_arithmetic_types_int8};\n    return extensionsTurnedOn(sizeof(extensions)/sizeof(extensions[0]), extensions);\n}\n\nvoid TParseVersions::requireFloat16Arithmetic(const TSourceLoc& loc, const char* op, const char* featureDesc)\n{\n    TString combined;\n    combined = op;\n    combined += \": \";\n    combined += featureDesc;\n\n    const char* const extensions[] = {\n                                       E_GL_AMD_gpu_shader_half_float,\n                                       E_GL_EXT_shader_explicit_arithmetic_types,\n                                       E_GL_NV_gpu_shader5,\n                                       E_GL_EXT_shader_explicit_arithmetic_types_float16};\n    requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, combined.c_str());\n}\n\nvoid TParseVersions::requireInt16Arithmetic(const TSourceLoc& loc, const char* op, const char* featureDesc)\n{\n    TString combined;\n    combined = op;\n    combined += \": \";\n    combined += featureDesc;\n\n    const char* const extensions[] = {\n                                       E_GL_AMD_gpu_shader_int16,\n                                       E_GL_EXT_shader_explicit_arithmetic_types,\n                                       E_GL_NV_gpu_shader5,\n                                       E_GL_EXT_shader_explicit_arithmetic_types_int16};\n    requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, combined.c_str());\n}\n\nvoid TParseVersions::requireInt8Arithmetic(const TSourceLoc& loc, const char* op, const char* featureDesc)\n{\n    TString combined;\n    combined = op;\n    combined += \": \";\n    combined += featureDesc;\n\n    const char* const extensions[] = {\n                                       E_GL_EXT_shader_explicit_arithmetic_types,\n                                       E_GL_NV_gpu_shader5,\n                                       E_GL_EXT_shader_explicit_arithmetic_types_int8};\n    requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, combined.c_str());\n}\n\nvoid TParseVersions::float16ScalarVectorCheck(const TSourceLoc& loc, const char* op, bool builtIn)\n{\n    if (!builtIn) {\n        const char* const extensions[] = {\n                                           E_GL_AMD_gpu_shader_half_float,\n                                           E_GL_EXT_shader_16bit_storage,\n                                           E_GL_EXT_shader_explicit_arithmetic_types,\n                                           E_GL_NV_gpu_shader5,\n                                           E_GL_EXT_shader_explicit_arithmetic_types_float16};\n        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);\n    }\n}\n\nvoid TParseVersions::bfloat16ScalarVectorCheck(const TSourceLoc& loc, const char* op, bool builtIn)\n{\n    if (!builtIn) {\n        const char* const extensions[] = {\n                                           E_GL_EXT_bfloat16,\n                                         };\n        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);\n    }\n}\n\nvoid TParseVersions::floate5m2ScalarVectorCheck(const TSourceLoc& loc, const char* op, bool builtIn)\n{\n    if (!builtIn) {\n        const char* const extensions[] = {\n                                           E_GL_EXT_float_e5m2,\n                                         };\n        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);\n    }\n}\n\nvoid TParseVersions::floate4m3ScalarVectorCheck(const TSourceLoc& loc, const char* op, bool builtIn)\n{\n    if (!builtIn) {\n        const char* const extensions[] = {\n                                           E_GL_EXT_float_e4m3,\n                                         };\n        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);\n    }\n}\n\n// Call for any operation needing GLSL float32 data-type support.\nvoid TParseVersions::explicitFloat32Check(const TSourceLoc& loc, const char* op, bool builtIn)\n{\n    if (!builtIn) {\n        const char* const extensions[] = {E_GL_EXT_shader_explicit_arithmetic_types,\n                                          E_GL_NV_gpu_shader5,\n                                           E_GL_EXT_shader_explicit_arithmetic_types_float32};\n        requireExtensions(loc, sizeof(extensions) / sizeof(extensions[0]), extensions, op);\n    }\n}\n\n// Call for any operation needing GLSL float64 data-type support.\nvoid TParseVersions::explicitFloat64Check(const TSourceLoc& loc, const char* op, bool builtIn)\n{\n    if (!builtIn) {\n        const char* const extensions[] = {E_GL_EXT_shader_explicit_arithmetic_types,\n                                           E_GL_NV_gpu_shader5,\n                                           E_GL_EXT_shader_explicit_arithmetic_types_float64};\n        requireExtensions(loc, sizeof(extensions) / sizeof(extensions[0]), extensions, op);\n        requireProfile(loc, ECoreProfile | ECompatibilityProfile, op);\n        if(extensionTurnedOn(E_GL_ARB_gpu_shader_fp64) && extensionTurnedOn(E_GL_NV_gpu_shader5))\n            profileRequires(loc, ECoreProfile | ECompatibilityProfile, 150, nullptr, op);\n        else\n            profileRequires(loc, ECoreProfile | ECompatibilityProfile, 400, nullptr, op);\n    }\n}\n\n// Call for any operation needing GLSL explicit int8 data-type support.\nvoid TParseVersions::explicitInt8Check(const TSourceLoc& loc, const char* op, bool builtIn)\n{\n    if (! builtIn) {\n        const char* const extensions[2] = {E_GL_EXT_shader_explicit_arithmetic_types,\n                                           E_GL_EXT_shader_explicit_arithmetic_types_int8};\n        requireExtensions(loc, 2, extensions, op);\n    }\n}\n\n// Call for any operation needing GLSL float16 opaque-type support\nvoid TParseVersions::float16OpaqueCheck(const TSourceLoc& loc, const char* op, bool builtIn)\n{\n    if (! builtIn) {\n        requireExtensions(loc, 1, &E_GL_AMD_gpu_shader_half_float_fetch, op);\n        requireProfile(loc, ECoreProfile | ECompatibilityProfile, op);\n        profileRequires(loc, ECoreProfile | ECompatibilityProfile, 400, nullptr, op);\n    }\n}\n\n// Call for any operation needing GLSL explicit int16 data-type support.\nvoid TParseVersions::explicitInt16Check(const TSourceLoc& loc, const char* op, bool builtIn)\n{\n    if (! builtIn) {\n        const char* const extensions[] = {\n                                           E_GL_AMD_gpu_shader_int16,\n                                           E_GL_EXT_shader_explicit_arithmetic_types,\n                                           E_GL_EXT_shader_explicit_arithmetic_types_int16};\n        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);\n    }\n}\n\nvoid TParseVersions::int16ScalarVectorCheck(const TSourceLoc& loc, const char* op, bool builtIn)\n{\n    if (! builtIn) {\n    \tconst char* const extensions[] = {\n                                           E_GL_AMD_gpu_shader_int16,\n                                           E_GL_EXT_shader_16bit_storage,\n                                           E_GL_EXT_shader_explicit_arithmetic_types,\n                                           E_GL_NV_gpu_shader5,\n                                           E_GL_EXT_shader_explicit_arithmetic_types_int16};\n        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);\n    }\n}\n\nvoid TParseVersions::int8ScalarVectorCheck(const TSourceLoc& loc, const char* op, bool builtIn)\n{\n    if (! builtIn) {\n    \tconst char* const extensions[] = {\n                                           E_GL_EXT_shader_8bit_storage,\n                                           E_GL_EXT_shader_explicit_arithmetic_types,\n                                           E_GL_NV_gpu_shader5,\n                                           E_GL_EXT_shader_explicit_arithmetic_types_int8};\n        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);\n    }\n}\n\n// Call for any operation needing GLSL explicit int32 data-type support.\nvoid TParseVersions::explicitInt32Check(const TSourceLoc& loc, const char* op, bool builtIn)\n{\n    if (! builtIn) {\n        const char* const extensions[] = {E_GL_EXT_shader_explicit_arithmetic_types,\n                                           E_GL_NV_gpu_shader5,\n                                           E_GL_EXT_shader_explicit_arithmetic_types_int32};\n        requireExtensions(loc, sizeof(extensions) / sizeof(extensions[0]), extensions, op);\n    }\n}\n\n// Call for any operation needing GLSL 64-bit integer data-type support.\nvoid TParseVersions::int64Check(const TSourceLoc& loc, const char* op, bool builtIn)\n{\n    if (! builtIn) {\n        const char* const extensions[] = {E_GL_ARB_gpu_shader_int64,\n                                           E_GL_EXT_shader_explicit_arithmetic_types,\n                                           E_GL_NV_gpu_shader5,\n                                           E_GL_EXT_shader_explicit_arithmetic_types_int64};\n        requireExtensions(loc, sizeof(extensions) / sizeof(extensions[0]), extensions, op);\n        requireProfile(loc, ECoreProfile | ECompatibilityProfile, op);\n        if (extensionTurnedOn(E_GL_NV_gpu_shader5))\n            profileRequires(loc, ECoreProfile | ECompatibilityProfile, 150, nullptr, op);\n        else\n        profileRequires(loc, ECoreProfile | ECompatibilityProfile, 400, nullptr, op);\n    }\n}\n\nvoid TParseVersions::fcoopmatCheckNV(const TSourceLoc& loc, const char* op, bool builtIn)\n{\n    if (!builtIn) {\n        const char* const extensions[] = {E_GL_NV_cooperative_matrix};\n        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);\n    }\n}\n\nvoid TParseVersions::intcoopmatCheckNV(const TSourceLoc& loc, const char* op, bool builtIn)\n{\n    if (!builtIn) {\n        const char* const extensions[] = {E_GL_NV_integer_cooperative_matrix};\n        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);\n    }\n}\n\nvoid TParseVersions::coopmatCheck(const TSourceLoc& loc, const char* op, bool builtIn)\n{\n    if (!builtIn) {\n        const char* const extensions[] = {E_GL_KHR_cooperative_matrix};\n        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);\n    }\n}\n\nvoid TParseVersions::tensorLayoutViewCheck(const TSourceLoc& loc, const char* op, bool builtIn)\n{\n    if (!builtIn) {\n        const char* const extensions[] = {E_GL_NV_cooperative_matrix2};\n        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);\n    }\n}\n\nvoid TParseVersions::coopvecCheck(const TSourceLoc& loc, const char* op, bool builtIn)\n{\n    if (!builtIn) {\n        const char* const extensions[] = {E_GL_NV_cooperative_vector};\n        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);\n    }\n}\n\nvoid TParseVersions::intattachmentCheck(const TSourceLoc& loc, const char* op, bool builtIn)\n{\n    if (!builtIn) {\n        const char* const extensions[] = {E_GL_QCOM_tile_shading};\n        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);\n    }\n}\n\n// Call for any operation removed because SPIR-V is in use.\nvoid TParseVersions::spvRemoved(const TSourceLoc& loc, const char* op)\n{\n    if (spvVersion.spv != 0)\n        error(loc, \"not allowed when generating SPIR-V\", op, \"\");\n}\n\n// Call for any operation removed because Vulkan SPIR-V is being generated.\nvoid TParseVersions::vulkanRemoved(const TSourceLoc& loc, const char* op)\n{\n    if (spvVersion.vulkan > 0 && !spvVersion.vulkanRelaxed)\n        error(loc, \"not allowed when using GLSL for Vulkan\", op, \"\");\n}\n\n// Call for any operation that requires Vulkan.\nvoid TParseVersions::requireVulkan(const TSourceLoc& loc, const char* op)\n{\n    if (spvVersion.vulkan == 0)\n        error(loc, \"only allowed when using GLSL for Vulkan\", op, \"\");\n}\n\n// Call for any operation that requires SPIR-V.\nvoid TParseVersions::requireSpv(const TSourceLoc& loc, const char* op)\n{\n    if (spvVersion.spv == 0)\n        error(loc, \"only allowed when generating SPIR-V\", op, \"\");\n}\nvoid TParseVersions::requireSpv(const TSourceLoc& loc, const char *op, unsigned int version)\n{\n    if (spvVersion.spv < version)\n        error(loc, \"not supported for current targeted SPIR-V version\", op, \"\");\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/Versions.h",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2012-2013 LunarG, Inc.\n// Copyright (C) 2017, 2022-2024 Arm Limited.\n// Copyright (C) 2015-2018 Google, Inc.\n// Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.\n// Modifications Copyright (C) 2024 Valve Corporation.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#ifndef _VERSIONS_INCLUDED_\n#define _VERSIONS_INCLUDED_\n\n#define LAST_ELEMENT_MARKER(x) x\n\n//\n// Help manage multiple profiles, versions, extensions etc.\n//\n\n//\n// Profiles are set up for masking operations, so queries can be done on multiple\n// profiles at the same time.\n//\n// Don't maintain an ordinal set of enums (0,1,2,3...) to avoid all possible\n// defects from mixing the two different forms.\n//\ntypedef enum : unsigned {\n    EBadProfile           = 0,\n    ENoProfile            = (1 << 0), // only for desktop, before profiles showed up\n    ECoreProfile          = (1 << 1),\n    ECompatibilityProfile = (1 << 2),\n    EEsProfile            = (1 << 3),\n    LAST_ELEMENT_MARKER(EProfileCount),\n} EProfile;\n\nnamespace glslang {\n\n//\n// Map from profile enum to externally readable text name.\n//\ninline const char* ProfileName(EProfile profile)\n{\n    switch (profile) {\n    case ENoProfile:             return \"none\";\n    case ECoreProfile:           return \"core\";\n    case ECompatibilityProfile:  return \"compatibility\";\n    case EEsProfile:             return \"es\";\n    default:                     return \"unknown profile\";\n    }\n}\n\n//\n// What source rules, validation rules, target language, etc. are needed or\n// desired for SPIR-V?\n//\n// 0 means a target or rule set is not enabled (ignore rules from that entity).\n// Non-0 means to apply semantic rules arising from that version of its rule set.\n// The union of all requested rule sets will be applied.\n//\nstruct SpvVersion {\n    SpvVersion() : spv(0), vulkanGlsl(0), vulkan(0), openGl(0), vulkanRelaxed(false) {}\n    unsigned int spv; // the version of SPIR-V to target, as defined by \"word 1\" of the SPIR-V binary header\n    int vulkanGlsl;   // the version of GLSL semantics for Vulkan, from GL_KHR_vulkan_glsl, for \"#define VULKAN XXX\"\n    int vulkan;       // the version of Vulkan, for which SPIR-V execution environment rules to use\n    int openGl;       // the version of GLSL semantics for OpenGL, from GL_ARB_gl_spirv, for \"#define GL_SPIRV XXX\"\n    bool vulkanRelaxed; // relax changes to GLSL for Vulkan, allowing some GL-specific to be compiled to Vulkan SPIR-V target\n};\n\n//\n// The behaviors from the GLSL \"#extension extension_name : behavior\"\n//\ntypedef enum {\n    EBhMissing = 0,\n    EBhRequire,\n    EBhEnable,\n    EBhWarn,\n    EBhDisable,\n    EBhDisablePartial    // use as initial state of an extension that is only partially implemented\n} TExtensionBehavior;\n\n//\n// Symbolic names for extensions.  Strings may be directly used when calling the\n// functions, but better to have the compiler do spelling checks.\n//\nconst char* const E_GL_OES_texture_3D                   = \"GL_OES_texture_3D\";\nconst char* const E_GL_OES_standard_derivatives         = \"GL_OES_standard_derivatives\";\nconst char* const E_GL_EXT_frag_depth                   = \"GL_EXT_frag_depth\";\nconst char* const E_GL_OES_EGL_image_external           = \"GL_OES_EGL_image_external\";\nconst char* const E_GL_OES_EGL_image_external_essl3     = \"GL_OES_EGL_image_external_essl3\";\nconst char* const E_GL_EXT_YUV_target                   = \"GL_EXT_YUV_target\";\nconst char* const E_GL_EXT_shader_texture_lod           = \"GL_EXT_shader_texture_lod\";\nconst char* const E_GL_EXT_shadow_samplers              = \"GL_EXT_shadow_samplers\";\n\nconst char* const E_GL_ARB_texture_rectangle            = \"GL_ARB_texture_rectangle\";\nconst char* const E_GL_3DL_array_objects                = \"GL_3DL_array_objects\";\nconst char* const E_GL_ARB_shading_language_420pack     = \"GL_ARB_shading_language_420pack\";\nconst char* const E_GL_ARB_texture_gather               = \"GL_ARB_texture_gather\";\nconst char* const E_GL_ARB_gpu_shader5                  = \"GL_ARB_gpu_shader5\";\nconst char* const E_GL_ARB_separate_shader_objects      = \"GL_ARB_separate_shader_objects\";\nconst char* const E_GL_ARB_compute_shader               = \"GL_ARB_compute_shader\";\nconst char* const E_GL_ARB_tessellation_shader          = \"GL_ARB_tessellation_shader\";\nconst char* const E_GL_ARB_enhanced_layouts             = \"GL_ARB_enhanced_layouts\";\nconst char* const E_GL_ARB_texture_cube_map_array       = \"GL_ARB_texture_cube_map_array\";\nconst char* const E_GL_ARB_texture_multisample          = \"GL_ARB_texture_multisample\";\nconst char* const E_GL_ARB_shader_texture_lod           = \"GL_ARB_shader_texture_lod\";\nconst char* const E_GL_ARB_explicit_attrib_location     = \"GL_ARB_explicit_attrib_location\";\nconst char* const E_GL_ARB_explicit_uniform_location    = \"GL_ARB_explicit_uniform_location\";\nconst char* const E_GL_ARB_shader_image_load_store      = \"GL_ARB_shader_image_load_store\";\nconst char* const E_GL_ARB_shader_atomic_counters       = \"GL_ARB_shader_atomic_counters\";\nconst char* const E_GL_ARB_shader_atomic_counter_ops    = \"GL_ARB_shader_atomic_counter_ops\";\nconst char* const E_GL_ARB_shader_draw_parameters       = \"GL_ARB_shader_draw_parameters\";\nconst char* const E_GL_ARB_shader_group_vote            = \"GL_ARB_shader_group_vote\";\nconst char* const E_GL_ARB_derivative_control           = \"GL_ARB_derivative_control\";\nconst char* const E_GL_ARB_shader_texture_image_samples = \"GL_ARB_shader_texture_image_samples\";\nconst char* const E_GL_ARB_viewport_array               = \"GL_ARB_viewport_array\";\nconst char* const E_GL_ARB_gpu_shader_int64             = \"GL_ARB_gpu_shader_int64\";\nconst char* const E_GL_ARB_gpu_shader_fp64              = \"GL_ARB_gpu_shader_fp64\";\nconst char* const E_GL_ARB_shader_ballot                = \"GL_ARB_shader_ballot\";\nconst char* const E_GL_ARB_sparse_texture2              = \"GL_ARB_sparse_texture2\";\nconst char* const E_GL_ARB_sparse_texture_clamp         = \"GL_ARB_sparse_texture_clamp\";\nconst char* const E_GL_ARB_shader_stencil_export        = \"GL_ARB_shader_stencil_export\";\n// const char* const E_GL_ARB_cull_distance            = \"GL_ARB_cull_distance\";  // present for 4.5, but need extension control over block members\nconst char* const E_GL_ARB_post_depth_coverage          = \"GL_ARB_post_depth_coverage\";\nconst char* const E_GL_ARB_shader_viewport_layer_array  = \"GL_ARB_shader_viewport_layer_array\";\nconst char* const E_GL_ARB_fragment_shader_interlock    = \"GL_ARB_fragment_shader_interlock\";\nconst char* const E_GL_ARB_shader_clock                 = \"GL_ARB_shader_clock\";\nconst char* const E_GL_ARB_uniform_buffer_object        = \"GL_ARB_uniform_buffer_object\";\nconst char* const E_GL_ARB_sample_shading               = \"GL_ARB_sample_shading\";\nconst char* const E_GL_ARB_shader_bit_encoding          = \"GL_ARB_shader_bit_encoding\";\nconst char* const E_GL_ARB_shader_image_size            = \"GL_ARB_shader_image_size\";\nconst char* const E_GL_ARB_shader_storage_buffer_object = \"GL_ARB_shader_storage_buffer_object\";\nconst char* const E_GL_ARB_shading_language_packing     = \"GL_ARB_shading_language_packing\";\nconst char* const E_GL_ARB_texture_query_lod            = \"GL_ARB_texture_query_lod\";\nconst char* const E_GL_ARB_vertex_attrib_64bit          = \"GL_ARB_vertex_attrib_64bit\";\nconst char* const E_GL_ARB_draw_instanced               = \"GL_ARB_draw_instanced\";\nconst char* const E_GL_ARB_fragment_coord_conventions   = \"GL_ARB_fragment_coord_conventions\";\nconst char* const E_GL_ARB_bindless_texture             = \"GL_ARB_bindless_texture\";\n\nconst char* const E_GL_KHR_shader_subgroup_basic            = \"GL_KHR_shader_subgroup_basic\";\nconst char* const E_GL_KHR_shader_subgroup_vote             = \"GL_KHR_shader_subgroup_vote\";\nconst char* const E_GL_KHR_shader_subgroup_arithmetic       = \"GL_KHR_shader_subgroup_arithmetic\";\nconst char* const E_GL_KHR_shader_subgroup_ballot           = \"GL_KHR_shader_subgroup_ballot\";\nconst char* const E_GL_KHR_shader_subgroup_shuffle          = \"GL_KHR_shader_subgroup_shuffle\";\nconst char* const E_GL_KHR_shader_subgroup_shuffle_relative = \"GL_KHR_shader_subgroup_shuffle_relative\";\nconst char* const E_GL_KHR_shader_subgroup_rotate           = \"GL_KHR_shader_subgroup_rotate\";\nconst char* const E_GL_KHR_shader_subgroup_clustered        = \"GL_KHR_shader_subgroup_clustered\";\nconst char* const E_GL_KHR_shader_subgroup_quad             = \"GL_KHR_shader_subgroup_quad\";\nconst char* const E_GL_KHR_memory_scope_semantics           = \"GL_KHR_memory_scope_semantics\";\nconst char* const E_GL_KHR_cooperative_matrix               = \"GL_KHR_cooperative_matrix\";\n\nconst char* const E_GL_EXT_shader_atomic_int64              = \"GL_EXT_shader_atomic_int64\";\n\nconst char* const E_GL_EXT_shader_non_constant_global_initializers = \"GL_EXT_shader_non_constant_global_initializers\";\nconst char* const E_GL_EXT_shader_image_load_formatted = \"GL_EXT_shader_image_load_formatted\";\n\nconst char* const E_GL_EXT_shader_16bit_storage             = \"GL_EXT_shader_16bit_storage\";\nconst char* const E_GL_EXT_shader_8bit_storage              = \"GL_EXT_shader_8bit_storage\";\n\n\n// EXT extensions\nconst char* const E_GL_EXT_device_group                     = \"GL_EXT_device_group\";\nconst char* const E_GL_EXT_multiview                        = \"GL_EXT_multiview\";\nconst char* const E_GL_EXT_post_depth_coverage              = \"GL_EXT_post_depth_coverage\";\nconst char* const E_GL_EXT_control_flow_attributes          = \"GL_EXT_control_flow_attributes\";\nconst char* const E_GL_EXT_nonuniform_qualifier             = \"GL_EXT_nonuniform_qualifier\";\nconst char* const E_GL_EXT_samplerless_texture_functions    = \"GL_EXT_samplerless_texture_functions\";\nconst char* const E_GL_EXT_scalar_block_layout              = \"GL_EXT_scalar_block_layout\";\nconst char* const E_GL_EXT_fragment_invocation_density      = \"GL_EXT_fragment_invocation_density\";\nconst char* const E_GL_EXT_buffer_reference                 = \"GL_EXT_buffer_reference\";\nconst char* const E_GL_EXT_buffer_reference2                = \"GL_EXT_buffer_reference2\";\nconst char* const E_GL_EXT_buffer_reference_uvec2           = \"GL_EXT_buffer_reference_uvec2\";\nconst char* const E_GL_EXT_demote_to_helper_invocation      = \"GL_EXT_demote_to_helper_invocation\";\nconst char* const E_GL_EXT_shader_realtime_clock            = \"GL_EXT_shader_realtime_clock\";\nconst char* const E_GL_EXT_debug_printf                     = \"GL_EXT_debug_printf\";\nconst char* const E_GL_EXT_ray_tracing                      = \"GL_EXT_ray_tracing\";\nconst char* const E_GL_EXT_ray_query                        = \"GL_EXT_ray_query\";\nconst char* const E_GL_EXT_ray_flags_primitive_culling      = \"GL_EXT_ray_flags_primitive_culling\";\nconst char* const E_GL_EXT_ray_cull_mask                    = \"GL_EXT_ray_cull_mask\";\nconst char* const E_GL_EXT_blend_func_extended              = \"GL_EXT_blend_func_extended\";\nconst char* const E_GL_EXT_shader_implicit_conversions      = \"GL_EXT_shader_implicit_conversions\";\nconst char* const E_GL_EXT_fragment_shading_rate            = \"GL_EXT_fragment_shading_rate\";\nconst char* const E_GL_EXT_shader_image_int64               = \"GL_EXT_shader_image_int64\";\nconst char* const E_GL_EXT_null_initializer                 = \"GL_EXT_null_initializer\";\nconst char* const E_GL_EXT_shared_memory_block              = \"GL_EXT_shared_memory_block\";\nconst char* const E_GL_EXT_subgroup_uniform_control_flow    = \"GL_EXT_subgroup_uniform_control_flow\";\nconst char* const E_GL_EXT_spirv_intrinsics                 = \"GL_EXT_spirv_intrinsics\";\nconst char* const E_GL_EXT_fragment_shader_barycentric      = \"GL_EXT_fragment_shader_barycentric\";\nconst char* const E_GL_EXT_mesh_shader                      = \"GL_EXT_mesh_shader\";\nconst char* const E_GL_EXT_opacity_micromap                 = \"GL_EXT_opacity_micromap\";\nconst char* const E_GL_EXT_shader_quad_control              = \"GL_EXT_shader_quad_control\";\nconst char* const E_GL_EXT_draw_instanced                   = \"GL_EXT_draw_instanced\";\nconst char* const E_GL_EXT_texture_array                    = \"GL_EXT_texture_array\";\nconst char* const E_GL_EXT_maximal_reconvergence            = \"GL_EXT_maximal_reconvergence\";\nconst char* const E_GL_EXT_expect_assume                    = \"GL_EXT_expect_assume\";\nconst char* const E_GL_EXT_control_flow_attributes2         = \"GL_EXT_control_flow_attributes2\";\nconst char* const E_GL_EXT_spec_constant_composites         = \"GL_EXT_spec_constant_composites\";\nconst char* const E_GL_EXT_texture_offset_non_const         = \"GL_EXT_texture_offset_non_const\";\nconst char* const E_GL_EXT_nontemporal_keyword              = \"GL_EXT_nontemporal_keyword\";\n\n// Arrays of extensions for the above viewportEXTs duplications\n\nconst char* const post_depth_coverageEXTs[] = { E_GL_ARB_post_depth_coverage, E_GL_EXT_post_depth_coverage };\nconst int Num_post_depth_coverageEXTs = sizeof(post_depth_coverageEXTs) / sizeof(post_depth_coverageEXTs[0]);\n\n// Array of extensions to cover both extensions providing ray tracing capabilities.\nconst char* const ray_tracing_EXTs[] = { E_GL_EXT_ray_query, E_GL_EXT_ray_tracing };\nconst int Num_ray_tracing_EXTs = sizeof(ray_tracing_EXTs) / sizeof(ray_tracing_EXTs[0]);\n\n// OVR extensions\nconst char* const E_GL_OVR_multiview                    = \"GL_OVR_multiview\";\nconst char* const E_GL_OVR_multiview2                   = \"GL_OVR_multiview2\";\n\nconst char* const OVR_multiview_EXTs[] = { E_GL_OVR_multiview, E_GL_OVR_multiview2 };\nconst int Num_OVR_multiview_EXTs = sizeof(OVR_multiview_EXTs) / sizeof(OVR_multiview_EXTs[0]);\n\n// #line and #include\nconst char* const E_GL_GOOGLE_cpp_style_line_directive          = \"GL_GOOGLE_cpp_style_line_directive\";\nconst char* const E_GL_GOOGLE_include_directive                 = \"GL_GOOGLE_include_directive\";\nconst char* const E_GL_ARB_shading_language_include             = \"GL_ARB_shading_language_include\";\n\nconst char* const E_GL_AMD_shader_ballot                        = \"GL_AMD_shader_ballot\";\nconst char* const E_GL_AMD_shader_trinary_minmax                = \"GL_AMD_shader_trinary_minmax\";\nconst char* const E_GL_AMD_shader_explicit_vertex_parameter     = \"GL_AMD_shader_explicit_vertex_parameter\";\nconst char* const E_GL_AMD_gcn_shader                           = \"GL_AMD_gcn_shader\";\nconst char* const E_GL_AMD_gpu_shader_half_float                = \"GL_AMD_gpu_shader_half_float\";\nconst char* const E_GL_AMD_texture_gather_bias_lod              = \"GL_AMD_texture_gather_bias_lod\";\nconst char* const E_GL_AMD_gpu_shader_int16                     = \"GL_AMD_gpu_shader_int16\";\nconst char* const E_GL_AMD_shader_image_load_store_lod          = \"GL_AMD_shader_image_load_store_lod\";\nconst char* const E_GL_AMD_shader_fragment_mask                 = \"GL_AMD_shader_fragment_mask\";\nconst char* const E_GL_AMD_gpu_shader_half_float_fetch          = \"GL_AMD_gpu_shader_half_float_fetch\";\nconst char* const E_GL_AMD_shader_early_and_late_fragment_tests = \"GL_AMD_shader_early_and_late_fragment_tests\";\n\nconst char* const E_GL_INTEL_shader_integer_functions2          = \"GL_INTEL_shader_integer_functions2\";\n\nconst char* const E_GL_NV_sample_mask_override_coverage         = \"GL_NV_sample_mask_override_coverage\";\nconst char* const E_SPV_NV_geometry_shader_passthrough          = \"GL_NV_geometry_shader_passthrough\";\nconst char* const E_GL_NV_viewport_array2                       = \"GL_NV_viewport_array2\";\nconst char* const E_GL_NV_stereo_view_rendering                 = \"GL_NV_stereo_view_rendering\";\nconst char* const E_GL_NVX_multiview_per_view_attributes        = \"GL_NVX_multiview_per_view_attributes\";\nconst char* const E_GL_NV_shader_atomic_int64                   = \"GL_NV_shader_atomic_int64\";\nconst char* const E_GL_NV_conservative_raster_underestimation   = \"GL_NV_conservative_raster_underestimation\";\nconst char* const E_GL_NV_shader_noperspective_interpolation    = \"GL_NV_shader_noperspective_interpolation\";\nconst char* const E_GL_NV_shader_subgroup_partitioned           = \"GL_NV_shader_subgroup_partitioned\";\nconst char* const E_GL_NV_shading_rate_image                    = \"GL_NV_shading_rate_image\";\nconst char* const E_GL_NV_ray_tracing                           = \"GL_NV_ray_tracing\";\nconst char* const E_GL_NV_ray_tracing_motion_blur               = \"GL_NV_ray_tracing_motion_blur\";\nconst char* const E_GL_NV_fragment_shader_barycentric           = \"GL_NV_fragment_shader_barycentric\";\nconst char* const E_GL_NV_compute_shader_derivatives            = \"GL_NV_compute_shader_derivatives\";\nconst char* const E_GL_NV_shader_texture_footprint              = \"GL_NV_shader_texture_footprint\";\nconst char* const E_GL_NV_mesh_shader                           = \"GL_NV_mesh_shader\";\nconst char* const E_GL_NV_cooperative_matrix                    = \"GL_NV_cooperative_matrix\";\nconst char* const E_GL_NV_shader_sm_builtins                    = \"GL_NV_shader_sm_builtins\";\nconst char* const E_GL_NV_integer_cooperative_matrix            = \"GL_NV_integer_cooperative_matrix\";\nconst char* const E_GL_NV_shader_invocation_reorder             = \"GL_NV_shader_invocation_reorder\";\nconst char* const E_GL_EXT_ray_tracing_position_fetch           = \"GL_EXT_ray_tracing_position_fetch\";\nconst char* const E_GL_NV_displacement_micromap                 = \"GL_NV_displacement_micromap\";\nconst char* const E_GL_NV_shader_atomic_fp16_vector             = \"GL_NV_shader_atomic_fp16_vector\";\nconst char* const E_GL_NV_cooperative_matrix2                   = \"GL_NV_cooperative_matrix2\";\nconst char* const E_GL_NV_cooperative_vector                    = \"GL_NV_cooperative_vector\";\nconst char* const E_GL_NV_cluster_acceleration_structure        = \"GL_NV_cluster_acceleration_structure\";\nconst char* const E_GL_NV_linear_swept_spheres                  = \"GL_NV_linear_swept_spheres\";\nconst char* const E_GL_NV_gpu_shader5                           = \"GL_NV_gpu_shader5\";\n\n// ARM\nconst char* const E_GL_ARM_shader_core_builtins                 = \"GL_ARM_shader_core_builtins\";\n\n// Arrays of extensions for the above viewportEXTs duplications\n\nconst char* const viewportEXTs[] = { E_GL_ARB_shader_viewport_layer_array, E_GL_NV_viewport_array2 };\nconst int Num_viewportEXTs = sizeof(viewportEXTs) / sizeof(viewportEXTs[0]);\n\n\nconst char* const E_GL_QCOM_image_processing                    = \"GL_QCOM_image_processing\";\nconst char* const E_GL_QCOM_image_processing2                   = \"GL_QCOM_image_processing2\";\nconst char* const E_GL_QCOM_tile_shading                        = \"GL_QCOM_tile_shading\";\n\n// AEP\nconst char* const E_GL_ANDROID_extension_pack_es31a             = \"GL_ANDROID_extension_pack_es31a\";\nconst char* const E_GL_KHR_blend_equation_advanced              = \"GL_KHR_blend_equation_advanced\";\nconst char* const E_GL_OES_sample_variables                     = \"GL_OES_sample_variables\";\nconst char* const E_GL_OES_shader_image_atomic                  = \"GL_OES_shader_image_atomic\";\nconst char* const E_GL_OES_shader_multisample_interpolation     = \"GL_OES_shader_multisample_interpolation\";\nconst char* const E_GL_OES_texture_storage_multisample_2d_array = \"GL_OES_texture_storage_multisample_2d_array\";\nconst char* const E_GL_EXT_geometry_shader                      = \"GL_EXT_geometry_shader\";\nconst char* const E_GL_EXT_geometry_point_size                  = \"GL_EXT_geometry_point_size\";\nconst char* const E_GL_EXT_gpu_shader5                          = \"GL_EXT_gpu_shader5\";\nconst char* const E_GL_EXT_primitive_bounding_box               = \"GL_EXT_primitive_bounding_box\";\nconst char* const E_GL_EXT_shader_io_blocks                     = \"GL_EXT_shader_io_blocks\";\nconst char* const E_GL_EXT_tessellation_shader                  = \"GL_EXT_tessellation_shader\";\nconst char* const E_GL_EXT_tessellation_point_size              = \"GL_EXT_tessellation_point_size\";\nconst char* const E_GL_EXT_texture_buffer                       = \"GL_EXT_texture_buffer\";\nconst char* const E_GL_EXT_texture_cube_map_array               = \"GL_EXT_texture_cube_map_array\";\nconst char* const E_GL_EXT_shader_integer_mix                   = \"GL_EXT_shader_integer_mix\";\n\n// OES matching AEP\nconst char* const E_GL_OES_geometry_shader                      = \"GL_OES_geometry_shader\";\nconst char* const E_GL_OES_geometry_point_size                  = \"GL_OES_geometry_point_size\";\nconst char* const E_GL_OES_gpu_shader5                          = \"GL_OES_gpu_shader5\";\nconst char* const E_GL_OES_primitive_bounding_box               = \"GL_OES_primitive_bounding_box\";\nconst char* const E_GL_OES_shader_io_blocks                     = \"GL_OES_shader_io_blocks\";\nconst char* const E_GL_OES_tessellation_shader                  = \"GL_OES_tessellation_shader\";\nconst char* const E_GL_OES_tessellation_point_size              = \"GL_OES_tessellation_point_size\";\nconst char* const E_GL_OES_texture_buffer                       = \"GL_OES_texture_buffer\";\nconst char* const E_GL_OES_texture_cube_map_array               = \"GL_OES_texture_cube_map_array\";\n\n// EXT\nconst char* const E_GL_EXT_shader_explicit_arithmetic_types          = \"GL_EXT_shader_explicit_arithmetic_types\";\nconst char* const E_GL_EXT_shader_explicit_arithmetic_types_int8     = \"GL_EXT_shader_explicit_arithmetic_types_int8\";\nconst char* const E_GL_EXT_shader_explicit_arithmetic_types_int16    = \"GL_EXT_shader_explicit_arithmetic_types_int16\";\nconst char* const E_GL_EXT_shader_explicit_arithmetic_types_int32    = \"GL_EXT_shader_explicit_arithmetic_types_int32\";\nconst char* const E_GL_EXT_shader_explicit_arithmetic_types_int64    = \"GL_EXT_shader_explicit_arithmetic_types_int64\";\nconst char* const E_GL_EXT_shader_explicit_arithmetic_types_float16  = \"GL_EXT_shader_explicit_arithmetic_types_float16\";\nconst char* const E_GL_EXT_shader_explicit_arithmetic_types_float32  = \"GL_EXT_shader_explicit_arithmetic_types_float32\";\nconst char* const E_GL_EXT_shader_explicit_arithmetic_types_float64  = \"GL_EXT_shader_explicit_arithmetic_types_float64\";\n\nconst char* const E_GL_EXT_shader_subgroup_extended_types_int8    = \"GL_EXT_shader_subgroup_extended_types_int8\";\nconst char* const E_GL_EXT_shader_subgroup_extended_types_int16   = \"GL_EXT_shader_subgroup_extended_types_int16\";\nconst char* const E_GL_EXT_shader_subgroup_extended_types_int64   = \"GL_EXT_shader_subgroup_extended_types_int64\";\nconst char* const E_GL_EXT_shader_subgroup_extended_types_float16 = \"GL_EXT_shader_subgroup_extended_types_float16\";\nconst char* const E_GL_EXT_terminate_invocation = \"GL_EXT_terminate_invocation\";\n\nconst char* const E_GL_EXT_shader_atomic_float = \"GL_EXT_shader_atomic_float\";\nconst char* const E_GL_EXT_shader_atomic_float2 = \"GL_EXT_shader_atomic_float2\";\n\nconst char* const E_GL_EXT_shader_tile_image = \"GL_EXT_shader_tile_image\";\n\nconst char* const E_GL_EXT_texture_shadow_lod = \"GL_EXT_texture_shadow_lod\";\n\nconst char* const E_GL_EXT_integer_dot_product                    = \"GL_EXT_integer_dot_product\";\n\nconst char* const E_GL_EXT_bfloat16 = \"GL_EXT_bfloat16\";\nconst char* const E_GL_EXT_float_e5m2 = \"GL_EXT_float_e5m2\";\nconst char* const E_GL_EXT_float_e4m3 = \"GL_EXT_float_e4m3\";\n\n// Arrays of extensions for the above AEP duplications\n\nconst char* const AEP_geometry_shader[] = { E_GL_EXT_geometry_shader, E_GL_OES_geometry_shader };\nconst int Num_AEP_geometry_shader = sizeof(AEP_geometry_shader)/sizeof(AEP_geometry_shader[0]);\n\nconst char* const AEP_geometry_point_size[] = { E_GL_EXT_geometry_point_size, E_GL_OES_geometry_point_size };\nconst int Num_AEP_geometry_point_size = sizeof(AEP_geometry_point_size)/sizeof(AEP_geometry_point_size[0]);\n\nconst char* const AEP_gpu_shader5[] = { E_GL_EXT_gpu_shader5, E_GL_OES_gpu_shader5 };\nconst int Num_AEP_gpu_shader5 = sizeof(AEP_gpu_shader5)/sizeof(AEP_gpu_shader5[0]);\n\nconst char* const AEP_core_gpu_shader5[] = { E_GL_ARB_gpu_shader5, E_GL_NV_gpu_shader5};\nconst int Num_AEP_core_gpu_shader5 = sizeof(AEP_core_gpu_shader5)/sizeof(AEP_core_gpu_shader5[0]);\n\nconst char* const AEP_primitive_bounding_box[] = { E_GL_EXT_primitive_bounding_box, E_GL_OES_primitive_bounding_box };\nconst int Num_AEP_primitive_bounding_box = sizeof(AEP_primitive_bounding_box)/sizeof(AEP_primitive_bounding_box[0]);\n\nconst char* const AEP_shader_io_blocks[] = { E_GL_EXT_shader_io_blocks, E_GL_OES_shader_io_blocks };\nconst int Num_AEP_shader_io_blocks = sizeof(AEP_shader_io_blocks)/sizeof(AEP_shader_io_blocks[0]);\n\nconst char* const AEP_tessellation_shader[] = { E_GL_EXT_tessellation_shader, E_GL_OES_tessellation_shader };\nconst int Num_AEP_tessellation_shader = sizeof(AEP_tessellation_shader)/sizeof(AEP_tessellation_shader[0]);\n\nconst char* const AEP_tessellation_point_size[] = { E_GL_EXT_tessellation_point_size, E_GL_OES_tessellation_point_size };\nconst int Num_AEP_tessellation_point_size = sizeof(AEP_tessellation_point_size)/sizeof(AEP_tessellation_point_size[0]);\n\nconst char* const AEP_texture_buffer[] = { E_GL_EXT_texture_buffer, E_GL_OES_texture_buffer };\nconst int Num_AEP_texture_buffer = sizeof(AEP_texture_buffer)/sizeof(AEP_texture_buffer[0]);\n\nconst char* const AEP_texture_cube_map_array[] = { E_GL_EXT_texture_cube_map_array, E_GL_OES_texture_cube_map_array };\nconst int Num_AEP_texture_cube_map_array = sizeof(AEP_texture_cube_map_array)/sizeof(AEP_texture_cube_map_array[0]);\n\nconst char* const AEP_mesh_shader[] = { E_GL_NV_mesh_shader, E_GL_EXT_mesh_shader };\nconst int Num_AEP_mesh_shader = sizeof(AEP_mesh_shader)/sizeof(AEP_mesh_shader[0]);\n\n} // end namespace glslang\n\n#endif // _VERSIONS_INCLUDED_\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/attribute.cpp",
    "content": "//\n// Copyright (C) 2017 LunarG, Inc.\n// Copyright (C) 2018 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of Google, Inc., nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#include \"attribute.h\"\n#include \"../Include/intermediate.h\"\n#include \"ParseHelper.h\"\n\nnamespace glslang {\n\n// extract integers out of attribute arguments stored in attribute aggregate\nbool TAttributeArgs::getInt(int& value, int argNum) const \n{\n    const TConstUnion* intConst = getConstUnion(EbtInt, argNum);\n\n    if (intConst == nullptr)\n        return false;\n\n    value = intConst->getIConst();\n    return true;\n}\n\n\n// extract strings out of attribute arguments stored in attribute aggregate.\n// convert to lower case if converToLower is true (for case-insensitive compare convenience)\nbool TAttributeArgs::getString(TString& value, int argNum, bool convertToLower) const \n{\n    const TConstUnion* stringConst = getConstUnion(EbtString, argNum);\n\n    if (stringConst == nullptr)\n        return false;\n\n    value = *stringConst->getSConst();\n\n    // Convenience.\n    if (convertToLower)\n        std::transform(value.begin(), value.end(), value.begin(), ::tolower);\n\n    return true;\n}\n\n// How many arguments were supplied?\nint TAttributeArgs::size() const\n{\n    return args == nullptr ? 0 : (int)args->getSequence().size();\n}\n\n// Helper to get attribute const union.  Returns nullptr on failure.\nconst TConstUnion* TAttributeArgs::getConstUnion(TBasicType basicType, int argNum) const\n{\n    if (args == nullptr)\n        return nullptr;\n\n    if (argNum >= (int)args->getSequence().size())\n        return nullptr;\n\n    if (args->getSequence()[argNum]->getAsConstantUnion() == nullptr)\n        return nullptr;\n\n    const TConstUnion* constVal = &args->getSequence()[argNum]->getAsConstantUnion()->getConstArray()[0];\n    if (constVal == nullptr || constVal->getType() != basicType)\n        return nullptr;\n\n    return constVal;\n}\n\n// Implementation of TParseContext parts of attributes\nTAttributeType TParseContext::attributeFromName(const TString& name) const\n{\n    if (name == \"branch\" || name == \"dont_flatten\")\n        return EatBranch;\n    else if (name == \"flatten\")\n        return EatFlatten;\n    else if (name == \"unroll\")\n        return EatUnroll;\n    else if (name == \"loop\" || name == \"dont_unroll\")\n        return EatLoop;\n    else if (name == \"dependency_infinite\")\n        return EatDependencyInfinite;\n    else if (name == \"dependency_length\")\n        return EatDependencyLength;\n    else if (name == \"min_iterations\")\n        return EatMinIterations;\n    else if (name == \"max_iterations\")\n        return EatMaxIterations;\n    else if (name == \"iteration_multiple\")\n        return EatIterationMultiple;\n    else if (name == \"peel_count\")\n        return EatPeelCount;\n    else if (name == \"partial_count\")\n        return EatPartialCount;\n    else if (name == \"subgroup_uniform_control_flow\")\n        return EatSubgroupUniformControlFlow;\n    else if (name == \"export\")\n        return EatExport;\n    else if (name == \"maximally_reconverges\")\n        return EatMaximallyReconverges;\n    else\n        return EatNone;\n}\n\n// Make an initial leaf for the grammar from a no-argument attribute\nTAttributes* TParseContext::makeAttributes(const TString& identifier) const\n{\n    TAttributes *attributes = nullptr;\n    attributes = NewPoolObject(attributes);\n    TAttributeArgs args = { attributeFromName(identifier), nullptr };\n    attributes->push_back(args);\n    return attributes;\n}\n\n// Make an initial leaf for the grammar from a one-argument attribute\nTAttributes* TParseContext::makeAttributes(const TString& identifier, TIntermNode* node) const\n{\n    TAttributes *attributes = nullptr;\n    attributes = NewPoolObject(attributes);\n\n    // for now, node is always a simple single expression, but other code expects\n    // a list, so make it so\n    TIntermAggregate* agg = intermediate.makeAggregate(node);\n    TAttributeArgs args = { attributeFromName(identifier), agg };\n    attributes->push_back(args);\n    return attributes;\n}\n\n// Merge two sets of attributes into a single set.\n// The second argument is destructively consumed.\nTAttributes* TParseContext::mergeAttributes(TAttributes* attr1, TAttributes* attr2) const\n{\n    attr1->splice(attr1->end(), *attr2);\n    return attr1;\n}\n\n//\n// Selection attributes\n//\nvoid TParseContext::handleSelectionAttributes(const TAttributes& attributes, TIntermNode* node)\n{\n    TIntermSelection* selection = node->getAsSelectionNode();\n    if (selection == nullptr)\n        return;\n\n    for (auto it = attributes.begin(); it != attributes.end(); ++it) {\n        if (it->size() > 0) {\n            warn(node->getLoc(), \"attribute with arguments not recognized, skipping\", \"\", \"\");\n            continue;\n        }\n\n        switch (it->name) {\n        case EatFlatten:\n            selection->setFlatten();\n            break;\n        case EatBranch:\n            selection->setDontFlatten();\n            break;\n        default:\n            warn(node->getLoc(), \"attribute does not apply to a selection\", \"\", \"\");\n            break;\n        }\n    }\n}\n\n//\n// Switch attributes\n//\nvoid TParseContext::handleSwitchAttributes(const TAttributes& attributes, TIntermNode* node)\n{\n    TIntermSwitch* selection = node->getAsSwitchNode();\n    if (selection == nullptr)\n        return;\n\n    for (auto it = attributes.begin(); it != attributes.end(); ++it) {\n        if (it->size() > 0) {\n            warn(node->getLoc(), \"attribute with arguments not recognized, skipping\", \"\", \"\");\n            continue;\n        }\n\n        switch (it->name) {\n        case EatFlatten:\n            selection->setFlatten();\n            break;\n        case EatBranch:\n            selection->setDontFlatten();\n            break;\n        default:\n            warn(node->getLoc(), \"attribute does not apply to a switch\", \"\", \"\");\n            break;\n        }\n    }\n}\n\n//\n// Loop attributes\n//\nvoid TParseContext::handleLoopAttributes(const TAttributes& attributes, TIntermNode* node)\n{\n    TIntermLoop* loop = node->getAsLoopNode();\n    if (loop == nullptr) {\n        // the actual loop might be part of a sequence\n        TIntermAggregate* agg = node->getAsAggregate();\n        if (agg == nullptr)\n            return;\n        for (auto it = agg->getSequence().begin(); it != agg->getSequence().end(); ++it) {\n            loop = (*it)->getAsLoopNode();\n            if (loop != nullptr)\n                break;\n        }\n        if (loop == nullptr)\n            return;\n    }\n\n    for (auto it = attributes.begin(); it != attributes.end(); ++it) {\n\n        const auto noArgument = [&](const char* feature) {\n            if (it->size() > 0) {\n                warn(node->getLoc(), \"expected no arguments\", feature, \"\");\n                return false;\n            }\n            return true;\n        };\n\n        const auto positiveSignedArgument = [&](const char* feature, int& value) {\n            if (it->size() == 1 && it->getInt(value)) {\n                if (value <= 0) {\n                    error(node->getLoc(), \"must be positive\", feature, \"\");\n                    return false;\n                }\n            } else {\n                warn(node->getLoc(), \"expected a single integer argument\", feature, \"\");\n                return false;\n            }\n            return true;\n        };\n\n        const auto unsignedArgument = [&](const char* feature, unsigned int& uiValue) {\n            int value;\n            if (!(it->size() == 1 && it->getInt(value))) {\n                warn(node->getLoc(), \"expected a single integer argument\", feature, \"\");\n                return false;\n            }\n            uiValue = (unsigned int)value;\n            return true;\n        };\n\n        const auto positiveUnsignedArgument = [&](const char* feature, unsigned int& uiValue) {\n            int value;\n            if (it->size() == 1 && it->getInt(value)) {\n                if (value == 0) {\n                    error(node->getLoc(), \"must be greater than or equal to 1\", feature, \"\");\n                    return false;\n                }\n            } else {\n                warn(node->getLoc(), \"expected a single integer argument\", feature, \"\");\n                return false;\n            }\n            uiValue = (unsigned int)value;\n            return true;\n        };\n\n        const auto spirv14 = [&](const char* feature) {\n            if (spvVersion.spv > 0 && spvVersion.spv < EShTargetSpv_1_4)\n                warn(node->getLoc(), \"attribute requires a SPIR-V 1.4 target-env\", feature, \"\");\n        };\n\n        int value = 0;\n        unsigned uiValue = 0;\n        switch (it->name) {\n        case EatUnroll:\n            if (noArgument(\"unroll\"))\n                loop->setUnroll();\n            break;\n        case EatLoop:\n            if (noArgument(\"dont_unroll\"))\n                loop->setDontUnroll();\n            break;\n        case EatDependencyInfinite:\n            if (noArgument(\"dependency_infinite\"))\n                loop->setLoopDependency(TIntermLoop::dependencyInfinite);\n            break;\n        case EatDependencyLength:\n            if (positiveSignedArgument(\"dependency_length\", value))\n                loop->setLoopDependency(value);\n            break;\n        case EatMinIterations:\n            spirv14(\"min_iterations\");\n            if (unsignedArgument(\"min_iterations\", uiValue))\n                loop->setMinIterations(uiValue);\n            break;\n        case EatMaxIterations:\n            spirv14(\"max_iterations\");\n            if (unsignedArgument(\"max_iterations\", uiValue))\n                loop->setMaxIterations(uiValue);\n            break;\n        case EatIterationMultiple:\n            spirv14(\"iteration_multiple\");\n            if (positiveUnsignedArgument(\"iteration_multiple\", uiValue))\n                loop->setIterationMultiple(uiValue);\n            break;\n        case EatPeelCount:\n            spirv14(\"peel_count\");\n            if (unsignedArgument(\"peel_count\", uiValue))\n                loop->setPeelCount(uiValue);\n            break;\n        case EatPartialCount:\n            spirv14(\"partial_count\");\n            if (unsignedArgument(\"partial_count\", uiValue))\n                loop->setPartialCount(uiValue);\n            break;\n        default:\n            warn(node->getLoc(), \"attribute does not apply to a loop\", \"\", \"\");\n            break;\n        }\n    }\n}\n\n\n//\n// Function attributes\n//\nvoid TParseContext::handleFunctionAttributes(const TSourceLoc& loc, const TAttributes& attributes)\n{\n    for (auto it = attributes.begin(); it != attributes.end(); ++it) {\n        if (it->size() > 0) {\n            warn(loc, \"attribute with arguments not recognized, skipping\", \"\", \"\");\n            continue;\n        }\n\n        switch (it->name) {\n        case EatSubgroupUniformControlFlow:\n            requireExtensions(loc, 1, &E_GL_EXT_subgroup_uniform_control_flow, \"attribute\");\n            intermediate.setSubgroupUniformControlFlow();\n            break;\n        case EatMaximallyReconverges:\n            requireExtensions(loc, 1, &E_GL_EXT_maximal_reconvergence, \"attribute\");\n            intermediate.setMaximallyReconverges();\n            break;\n        default:\n            warn(loc, \"attribute does not apply to a function\", \"\", \"\");\n            break;\n        }\n    }\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/attribute.h",
    "content": "//\n// Copyright (C) 2017 LunarG, Inc.\n// Copyright (C) 2018 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#ifndef _ATTRIBUTE_INCLUDED_\n#define _ATTRIBUTE_INCLUDED_\n\n#include \"../Include/Common.h\"\n#include \"../Include/ConstantUnion.h\"\n\nnamespace glslang {\n\n    enum TAttributeType {\n        EatNone,\n        EatAllow_uav_condition,\n        EatBranch,\n        EatCall,\n        EatDomain,\n        EatEarlyDepthStencil,\n        EatFastOpt,\n        EatFlatten,\n        EatForceCase,\n        EatInstance,\n        EatMaxTessFactor,\n        EatNumThreads,\n        EatMaxVertexCount,\n        EatOutputControlPoints,\n        EatOutputTopology,\n        EatPartitioning,\n        EatPatchConstantFunc,\n        EatPatchSize,\n        EatUnroll,\n        EatLoop,\n        EatBinding,\n        EatGlobalBinding,\n        EatLocation,\n        EatInputAttachment,\n        EatBuiltIn,\n        EatPushConstant,\n        EatConstantId,\n        EatDependencyInfinite,\n        EatDependencyLength,\n        EatMinIterations,\n        EatMaxIterations,\n        EatIterationMultiple,\n        EatPeelCount,\n        EatPartialCount,\n        EatFormatRgba32f,\n        EatFormatRgba16f,\n        EatFormatR32f,\n        EatFormatRgba8,\n        EatFormatRgba8Snorm,\n        EatFormatRg32f,\n        EatFormatRg16f,\n        EatFormatR11fG11fB10f,\n        EatFormatR16f,\n        EatFormatRgba16,\n        EatFormatRgb10A2,\n        EatFormatRg16,\n        EatFormatRg8,\n        EatFormatR16,\n        EatFormatR8,\n        EatFormatRgba16Snorm,\n        EatFormatRg16Snorm,\n        EatFormatRg8Snorm,\n        EatFormatR16Snorm,\n        EatFormatR8Snorm,\n        EatFormatRgba32i,\n        EatFormatRgba16i,\n        EatFormatRgba8i,\n        EatFormatR32i,\n        EatFormatRg32i,\n        EatFormatRg16i,\n        EatFormatRg8i,\n        EatFormatR16i,\n        EatFormatR8i,\n        EatFormatRgba32ui,\n        EatFormatRgba16ui,\n        EatFormatRgba8ui,\n        EatFormatR32ui,\n        EatFormatRgb10a2ui,\n        EatFormatRg32ui,\n        EatFormatRg16ui,\n        EatFormatRg8ui,\n        EatFormatR16ui,\n        EatFormatR8ui,\n        EatFormatUnknown,\n        EatNonWritable,\n        EatNonReadable,\n        EatSubgroupUniformControlFlow,\n        EatExport,\n        EatMaximallyReconverges,\n    };\n\n    class TIntermAggregate;\n\n    struct TAttributeArgs {\n        TAttributeType name;\n        const TIntermAggregate* args;\n\n        // Obtain attribute as integer\n        // Return false if it cannot be obtained\n        bool getInt(int& value, int argNum = 0) const;\n\n        // Obtain attribute as string, with optional to-lower transform\n        // Return false if it cannot be obtained\n        bool getString(TString& value, int argNum = 0, bool convertToLower = true) const;\n\n        // How many arguments were provided to the attribute?\n        int size() const;\n\n    protected:\n        const TConstUnion* getConstUnion(TBasicType basicType, int argNum) const;\n    };\n\n    typedef TList<TAttributeArgs> TAttributes;\n\n} // end namespace glslang\n\n#endif // _ATTRIBUTE_INCLUDED_\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/gl_types.h",
    "content": "/*\n** Copyright (c) 2013 The Khronos Group Inc.\n**\n** Permission is hereby granted, free of charge, to any person obtaining a\n** copy of this software and/or associated documentation files (the\n** \"Materials\"), to deal in the Materials without restriction, including\n** without limitation the rights to use, copy, modify, merge, publish,\n** distribute, sublicense, and/or sell copies of the Materials, and to\n** permit persons to whom the Materials are furnished to do so, subject to\n** the following conditions:\n**\n** The above copyright notice and this permission notice shall be included\n** in all copies or substantial portions of the Materials.\n**\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\n*/\n\n#pragma once\n\n#define GL_FLOAT                          0x1406\n#define GL_FLOAT_VEC2                     0x8B50\n#define GL_FLOAT_VEC3                     0x8B51\n#define GL_FLOAT_VEC4                     0x8B52\n\n#define GL_DOUBLE                         0x140A\n#define GL_DOUBLE_VEC2                    0x8FFC\n#define GL_DOUBLE_VEC3                    0x8FFD\n#define GL_DOUBLE_VEC4                    0x8FFE\n\n#define GL_INT                            0x1404\n#define GL_INT_VEC2                       0x8B53\n#define GL_INT_VEC3                       0x8B54\n#define GL_INT_VEC4                       0x8B55\n\n#define GL_UNSIGNED_INT                   0x1405\n#define GL_UNSIGNED_INT_VEC2              0x8DC6\n#define GL_UNSIGNED_INT_VEC3              0x8DC7\n#define GL_UNSIGNED_INT_VEC4              0x8DC8\n\n#define GL_INT64_ARB                      0x140E\n#define GL_INT64_VEC2_ARB                 0x8FE9\n#define GL_INT64_VEC3_ARB                 0x8FEA\n#define GL_INT64_VEC4_ARB                 0x8FEB\n\n#define GL_UNSIGNED_INT64_ARB             0x140F\n#define GL_UNSIGNED_INT64_VEC2_ARB        0x8FF5\n#define GL_UNSIGNED_INT64_VEC3_ARB        0x8FF6\n#define GL_UNSIGNED_INT64_VEC4_ARB        0x8FF7\n#define GL_UNSIGNED_INT16_VEC2_NV         0x8FF1\n#define GL_UNSIGNED_INT16_VEC3_NV         0x8FF2\n#define GL_UNSIGNED_INT16_VEC4_NV         0x8FF3\n\n#define GL_INT16_NV                       0x8FE4\n#define GL_INT16_VEC2_NV                  0x8FE5\n#define GL_INT16_VEC3_NV                  0x8FE6\n#define GL_INT16_VEC4_NV                  0x8FE7\n\n#define GL_BOOL                           0x8B56\n#define GL_BOOL_VEC2                      0x8B57\n#define GL_BOOL_VEC3                      0x8B58\n#define GL_BOOL_VEC4                      0x8B59\n\n#define GL_FLOAT_MAT2                     0x8B5A\n#define GL_FLOAT_MAT3                     0x8B5B\n#define GL_FLOAT_MAT4                     0x8B5C\n#define GL_FLOAT_MAT2x3                   0x8B65\n#define GL_FLOAT_MAT2x4                   0x8B66\n#define GL_FLOAT_MAT3x2                   0x8B67\n#define GL_FLOAT_MAT3x4                   0x8B68\n#define GL_FLOAT_MAT4x2                   0x8B69\n#define GL_FLOAT_MAT4x3                   0x8B6A\n\n#define GL_DOUBLE_MAT2                    0x8F46\n#define GL_DOUBLE_MAT3                    0x8F47\n#define GL_DOUBLE_MAT4                    0x8F48\n#define GL_DOUBLE_MAT2x3                  0x8F49\n#define GL_DOUBLE_MAT2x4                  0x8F4A\n#define GL_DOUBLE_MAT3x2                  0x8F4B\n#define GL_DOUBLE_MAT3x4                  0x8F4C\n#define GL_DOUBLE_MAT4x2                  0x8F4D\n#define GL_DOUBLE_MAT4x3                  0x8F4E\n\n// Those constants are borrowed from extension NV_gpu_shader5\n#define GL_FLOAT16_NV                     0x8FF8\n#define GL_FLOAT16_VEC2_NV                0x8FF9\n#define GL_FLOAT16_VEC3_NV                0x8FFA\n#define GL_FLOAT16_VEC4_NV                0x8FFB\n\n#define GL_FLOAT16_MAT2_AMD               0x91C5\n#define GL_FLOAT16_MAT3_AMD               0x91C6\n#define GL_FLOAT16_MAT4_AMD               0x91C7\n#define GL_FLOAT16_MAT2x3_AMD             0x91C8\n#define GL_FLOAT16_MAT2x4_AMD             0x91C9\n#define GL_FLOAT16_MAT3x2_AMD             0x91CA\n#define GL_FLOAT16_MAT3x4_AMD             0x91CB\n#define GL_FLOAT16_MAT4x2_AMD             0x91CC\n#define GL_FLOAT16_MAT4x3_AMD             0x91CD\n\n#define GL_SAMPLER_1D                     0x8B5D\n#define GL_SAMPLER_2D                     0x8B5E\n#define GL_SAMPLER_3D                     0x8B5F\n#define GL_SAMPLER_CUBE                   0x8B60\n#define GL_SAMPLER_BUFFER                 0x8DC2\n#define GL_SAMPLER_1D_ARRAY               0x8DC0\n#define GL_SAMPLER_2D_ARRAY               0x8DC1\n#define GL_SAMPLER_1D_ARRAY_SHADOW        0x8DC3\n#define GL_SAMPLER_2D_ARRAY_SHADOW        0x8DC4\n#define GL_SAMPLER_CUBE_SHADOW            0x8DC5\n#define GL_SAMPLER_1D_SHADOW              0x8B61\n#define GL_SAMPLER_2D_SHADOW              0x8B62\n#define GL_SAMPLER_2D_RECT                0x8B63\n#define GL_SAMPLER_2D_RECT_SHADOW         0x8B64\n#define GL_SAMPLER_2D_MULTISAMPLE         0x9108\n#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY   0x910B\n#define GL_SAMPLER_CUBE_MAP_ARRAY         0x900C\n#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW  0x900D\n#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB     0x900C\n#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D\n\n#define GL_FLOAT16_SAMPLER_1D_AMD                       0x91CE\n#define GL_FLOAT16_SAMPLER_2D_AMD                       0x91CF\n#define GL_FLOAT16_SAMPLER_3D_AMD                       0x91D0\n#define GL_FLOAT16_SAMPLER_CUBE_AMD                     0x91D1\n#define GL_FLOAT16_SAMPLER_2D_RECT_AMD                  0x91D2\n#define GL_FLOAT16_SAMPLER_1D_ARRAY_AMD                 0x91D3\n#define GL_FLOAT16_SAMPLER_2D_ARRAY_AMD                 0x91D4\n#define GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_AMD           0x91D5\n#define GL_FLOAT16_SAMPLER_BUFFER_AMD                   0x91D6\n#define GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_AMD           0x91D7\n#define GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_ARRAY_AMD     0x91D8\n\n#define GL_FLOAT16_SAMPLER_1D_SHADOW_AMD                0x91D9\n#define GL_FLOAT16_SAMPLER_2D_SHADOW_AMD                0x91DA\n#define GL_FLOAT16_SAMPLER_2D_RECT_SHADOW_AMD           0x91DB\n#define GL_FLOAT16_SAMPLER_1D_ARRAY_SHADOW_AMD          0x91DC\n#define GL_FLOAT16_SAMPLER_2D_ARRAY_SHADOW_AMD          0x91DD\n#define GL_FLOAT16_SAMPLER_CUBE_SHADOW_AMD              0x91DE\n#define GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_SHADOW_AMD    0x91DF\n\n#define GL_FLOAT16_IMAGE_1D_AMD                         0x91E0\n#define GL_FLOAT16_IMAGE_2D_AMD                         0x91E1\n#define GL_FLOAT16_IMAGE_3D_AMD                         0x91E2\n#define GL_FLOAT16_IMAGE_2D_RECT_AMD                    0x91E3\n#define GL_FLOAT16_IMAGE_CUBE_AMD                       0x91E4\n#define GL_FLOAT16_IMAGE_1D_ARRAY_AMD                   0x91E5\n#define GL_FLOAT16_IMAGE_2D_ARRAY_AMD                   0x91E6\n#define GL_FLOAT16_IMAGE_CUBE_MAP_ARRAY_AMD             0x91E7\n#define GL_FLOAT16_IMAGE_BUFFER_AMD                     0x91E8\n#define GL_FLOAT16_IMAGE_2D_MULTISAMPLE_AMD             0x91E9\n#define GL_FLOAT16_IMAGE_2D_MULTISAMPLE_ARRAY_AMD       0x91EA\n\n#define GL_INT_SAMPLER_1D                 0x8DC9\n#define GL_INT_SAMPLER_2D                 0x8DCA\n#define GL_INT_SAMPLER_3D                 0x8DCB\n#define GL_INT_SAMPLER_CUBE               0x8DCC\n#define GL_INT_SAMPLER_1D_ARRAY           0x8DCE\n#define GL_INT_SAMPLER_2D_ARRAY           0x8DCF\n#define GL_INT_SAMPLER_2D_RECT            0x8DCD\n#define GL_INT_SAMPLER_BUFFER             0x8DD0\n#define GL_INT_SAMPLER_2D_MULTISAMPLE     0x9109\n#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C\n#define GL_INT_SAMPLER_CUBE_MAP_ARRAY     0x900E\n#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E\n\n#define GL_UNSIGNED_INT_SAMPLER_1D        0x8DD1\n#define GL_UNSIGNED_INT_SAMPLER_2D        0x8DD2\n#define GL_UNSIGNED_INT_SAMPLER_3D        0x8DD3\n#define GL_UNSIGNED_INT_SAMPLER_CUBE      0x8DD4\n#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY  0x8DD6\n#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY  0x8DD7\n#define GL_UNSIGNED_INT_SAMPLER_2D_RECT   0x8DD5\n#define GL_UNSIGNED_INT_SAMPLER_BUFFER    0x8DD8\n#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D\n#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F\n#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F\n#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A\n\n#define GL_IMAGE_1D                       0x904C\n#define GL_IMAGE_2D                       0x904D\n#define GL_IMAGE_3D                       0x904E\n#define GL_IMAGE_2D_RECT                  0x904F\n#define GL_IMAGE_CUBE                     0x9050\n#define GL_IMAGE_BUFFER                   0x9051\n#define GL_IMAGE_1D_ARRAY                 0x9052\n#define GL_IMAGE_2D_ARRAY                 0x9053\n#define GL_IMAGE_CUBE_MAP_ARRAY           0x9054\n#define GL_IMAGE_2D_MULTISAMPLE           0x9055\n#define GL_IMAGE_2D_MULTISAMPLE_ARRAY     0x9056\n#define GL_INT_IMAGE_1D                   0x9057\n#define GL_INT_IMAGE_2D                   0x9058\n#define GL_INT_IMAGE_3D                   0x9059\n#define GL_INT_IMAGE_2D_RECT              0x905A\n#define GL_INT_IMAGE_CUBE                 0x905B\n#define GL_INT_IMAGE_BUFFER               0x905C\n#define GL_INT_IMAGE_1D_ARRAY             0x905D\n#define GL_INT_IMAGE_2D_ARRAY             0x905E\n#define GL_INT_IMAGE_CUBE_MAP_ARRAY       0x905F\n#define GL_INT_IMAGE_2D_MULTISAMPLE       0x9060\n#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061\n#define GL_UNSIGNED_INT_IMAGE_1D          0x9062\n#define GL_UNSIGNED_INT_IMAGE_2D          0x9063\n#define GL_UNSIGNED_INT_IMAGE_3D          0x9064\n#define GL_UNSIGNED_INT_IMAGE_2D_RECT     0x9065\n#define GL_UNSIGNED_INT_IMAGE_CUBE        0x9066\n#define GL_UNSIGNED_INT_IMAGE_BUFFER      0x9067\n#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY    0x9068\n#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY    0x9069\n#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A\n#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B\n#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C\n\n#define GL_UNSIGNED_INT_ATOMIC_COUNTER    0x92DB\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/glslang_tab.cpp",
    "content": "/* A Bison parser, made by GNU Bison 3.8.2.  */\n\n/* Bison implementation for Yacc-like parsers in C\n\n   Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,\n   Inc.\n\n   This program is free software: you can redistribute it and/or modify\n   it under the terms of the GNU General Public License as published by\n   the Free Software Foundation, either version 3 of the License, or\n   (at your option) any later version.\n\n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n\n   You should have received a copy of the GNU General Public License\n   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */\n\n/* As a special exception, you may create a larger work that contains\n   part or all of the Bison parser skeleton and distribute that work\n   under terms of your choice, so long as that work isn't itself a\n   parser generator using the skeleton or a modified version thereof\n   as a parser skeleton.  Alternatively, if you modify or redistribute\n   the parser skeleton itself, you may (at your option) remove this\n   special exception, which will cause the skeleton and the resulting\n   Bison output files to be licensed under the GNU General Public\n   License without this special exception.\n\n   This special exception was added by the Free Software Foundation in\n   version 2.2 of Bison.  */\n\n/* C LALR(1) parser skeleton written by Richard Stallman, by\n   simplifying the original so-called \"semantic\" parser.  */\n\n/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,\n   especially those whose name start with YY_ or yy_.  They are\n   private implementation details that can be changed or removed.  */\n\n/* All symbols defined below should begin with yy or YY, to avoid\n   infringing on user name space.  This should be done even for local\n   variables, as they might otherwise be expanded by user macros.\n   There are some unavoidable exceptions within include files to\n   define necessary library symbols; they are noted \"INFRINGES ON\n   USER NAME SPACE\" below.  */\n\n/* Identify Bison output, and Bison version.  */\n#define YYBISON 30802\n\n/* Bison version string.  */\n#define YYBISON_VERSION \"3.8.2\"\n\n/* Skeleton name.  */\n#define YYSKELETON_NAME \"yacc.c\"\n\n/* Pure parsers.  */\n#define YYPURE 1\n\n/* Push parsers.  */\n#define YYPUSH 0\n\n/* Pull parsers.  */\n#define YYPULL 1\n\n\n\n\n/* First part of user prologue.  */\n#line 44 \"MachineIndependent/glslang.y\"\n\n\n/* Based on:\nANSI C Yacc grammar\n\nIn 1985, Jeff Lee published his Yacc grammar (which is accompanied by a\nmatching Lex specification) for the April 30, 1985 draft version of the\nANSI C standard.  Tom Stockfisch reposted it to net.sources in 1987; that\noriginal, as mentioned in the answer to question 17.25 of the comp.lang.c\nFAQ, can be ftp'ed from ftp.uu.net, file usenet/net.sources/ansi.c.grammar.Z.\n\nI intend to keep this version as close to the current C Standard grammar as\npossible; please let me know if you discover discrepancies.\n\nJutta Degener, 1995\n*/\n\n#include \"SymbolTable.h\"\n#include \"ParseHelper.h\"\n#include \"../Public/ShaderLang.h\"\n#include \"attribute.h\"\n\nusing namespace glslang;\n\n\n#line 97 \"MachineIndependent/glslang_tab.cpp\"\n\n# ifndef YY_CAST\n#  ifdef __cplusplus\n#   define YY_CAST(Type, Val) static_cast<Type> (Val)\n#   define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast<Type> (Val)\n#  else\n#   define YY_CAST(Type, Val) ((Type) (Val))\n#   define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val))\n#  endif\n# endif\n# ifndef YY_NULLPTR\n#  if defined __cplusplus\n#   if 201103L <= __cplusplus\n#    define YY_NULLPTR nullptr\n#   else\n#    define YY_NULLPTR 0\n#   endif\n#  else\n#   define YY_NULLPTR ((void*)0)\n#  endif\n# endif\n\n#include \"glslang_tab.cpp.h\"\n/* Symbol kind.  */\nenum yysymbol_kind_t\n{\n  YYSYMBOL_YYEMPTY = -2,\n  YYSYMBOL_YYEOF = 0,                      /* \"end of file\"  */\n  YYSYMBOL_YYerror = 1,                    /* error  */\n  YYSYMBOL_YYUNDEF = 2,                    /* \"invalid token\"  */\n  YYSYMBOL_CONST = 3,                      /* CONST  */\n  YYSYMBOL_BOOL = 4,                       /* BOOL  */\n  YYSYMBOL_INT = 5,                        /* INT  */\n  YYSYMBOL_UINT = 6,                       /* UINT  */\n  YYSYMBOL_FLOAT = 7,                      /* FLOAT  */\n  YYSYMBOL_BVEC2 = 8,                      /* BVEC2  */\n  YYSYMBOL_BVEC3 = 9,                      /* BVEC3  */\n  YYSYMBOL_BVEC4 = 10,                     /* BVEC4  */\n  YYSYMBOL_IVEC2 = 11,                     /* IVEC2  */\n  YYSYMBOL_IVEC3 = 12,                     /* IVEC3  */\n  YYSYMBOL_IVEC4 = 13,                     /* IVEC4  */\n  YYSYMBOL_UVEC2 = 14,                     /* UVEC2  */\n  YYSYMBOL_UVEC3 = 15,                     /* UVEC3  */\n  YYSYMBOL_UVEC4 = 16,                     /* UVEC4  */\n  YYSYMBOL_VEC2 = 17,                      /* VEC2  */\n  YYSYMBOL_VEC3 = 18,                      /* VEC3  */\n  YYSYMBOL_VEC4 = 19,                      /* VEC4  */\n  YYSYMBOL_MAT2 = 20,                      /* MAT2  */\n  YYSYMBOL_MAT3 = 21,                      /* MAT3  */\n  YYSYMBOL_MAT4 = 22,                      /* MAT4  */\n  YYSYMBOL_MAT2X2 = 23,                    /* MAT2X2  */\n  YYSYMBOL_MAT2X3 = 24,                    /* MAT2X3  */\n  YYSYMBOL_MAT2X4 = 25,                    /* MAT2X4  */\n  YYSYMBOL_MAT3X2 = 26,                    /* MAT3X2  */\n  YYSYMBOL_MAT3X3 = 27,                    /* MAT3X3  */\n  YYSYMBOL_MAT3X4 = 28,                    /* MAT3X4  */\n  YYSYMBOL_MAT4X2 = 29,                    /* MAT4X2  */\n  YYSYMBOL_MAT4X3 = 30,                    /* MAT4X3  */\n  YYSYMBOL_MAT4X4 = 31,                    /* MAT4X4  */\n  YYSYMBOL_SAMPLER2D = 32,                 /* SAMPLER2D  */\n  YYSYMBOL_SAMPLER3D = 33,                 /* SAMPLER3D  */\n  YYSYMBOL_SAMPLERCUBE = 34,               /* SAMPLERCUBE  */\n  YYSYMBOL_SAMPLER2DSHADOW = 35,           /* SAMPLER2DSHADOW  */\n  YYSYMBOL_SAMPLERCUBESHADOW = 36,         /* SAMPLERCUBESHADOW  */\n  YYSYMBOL_SAMPLER2DARRAY = 37,            /* SAMPLER2DARRAY  */\n  YYSYMBOL_SAMPLER2DARRAYSHADOW = 38,      /* SAMPLER2DARRAYSHADOW  */\n  YYSYMBOL_ISAMPLER2D = 39,                /* ISAMPLER2D  */\n  YYSYMBOL_ISAMPLER3D = 40,                /* ISAMPLER3D  */\n  YYSYMBOL_ISAMPLERCUBE = 41,              /* ISAMPLERCUBE  */\n  YYSYMBOL_ISAMPLER2DARRAY = 42,           /* ISAMPLER2DARRAY  */\n  YYSYMBOL_USAMPLER2D = 43,                /* USAMPLER2D  */\n  YYSYMBOL_USAMPLER3D = 44,                /* USAMPLER3D  */\n  YYSYMBOL_USAMPLERCUBE = 45,              /* USAMPLERCUBE  */\n  YYSYMBOL_USAMPLER2DARRAY = 46,           /* USAMPLER2DARRAY  */\n  YYSYMBOL_SAMPLER = 47,                   /* SAMPLER  */\n  YYSYMBOL_SAMPLERSHADOW = 48,             /* SAMPLERSHADOW  */\n  YYSYMBOL_TEXTURE2D = 49,                 /* TEXTURE2D  */\n  YYSYMBOL_TEXTURE3D = 50,                 /* TEXTURE3D  */\n  YYSYMBOL_TEXTURECUBE = 51,               /* TEXTURECUBE  */\n  YYSYMBOL_TEXTURE2DARRAY = 52,            /* TEXTURE2DARRAY  */\n  YYSYMBOL_ITEXTURE2D = 53,                /* ITEXTURE2D  */\n  YYSYMBOL_ITEXTURE3D = 54,                /* ITEXTURE3D  */\n  YYSYMBOL_ITEXTURECUBE = 55,              /* ITEXTURECUBE  */\n  YYSYMBOL_ITEXTURE2DARRAY = 56,           /* ITEXTURE2DARRAY  */\n  YYSYMBOL_UTEXTURE2D = 57,                /* UTEXTURE2D  */\n  YYSYMBOL_UTEXTURE3D = 58,                /* UTEXTURE3D  */\n  YYSYMBOL_UTEXTURECUBE = 59,              /* UTEXTURECUBE  */\n  YYSYMBOL_UTEXTURE2DARRAY = 60,           /* UTEXTURE2DARRAY  */\n  YYSYMBOL_ATTRIBUTE = 61,                 /* ATTRIBUTE  */\n  YYSYMBOL_VARYING = 62,                   /* VARYING  */\n  YYSYMBOL_FLOATE5M2_T = 63,               /* FLOATE5M2_T  */\n  YYSYMBOL_FLOATE4M3_T = 64,               /* FLOATE4M3_T  */\n  YYSYMBOL_BFLOAT16_T = 65,                /* BFLOAT16_T  */\n  YYSYMBOL_FLOAT16_T = 66,                 /* FLOAT16_T  */\n  YYSYMBOL_FLOAT32_T = 67,                 /* FLOAT32_T  */\n  YYSYMBOL_DOUBLE = 68,                    /* DOUBLE  */\n  YYSYMBOL_FLOAT64_T = 69,                 /* FLOAT64_T  */\n  YYSYMBOL_INT64_T = 70,                   /* INT64_T  */\n  YYSYMBOL_UINT64_T = 71,                  /* UINT64_T  */\n  YYSYMBOL_INT32_T = 72,                   /* INT32_T  */\n  YYSYMBOL_UINT32_T = 73,                  /* UINT32_T  */\n  YYSYMBOL_INT16_T = 74,                   /* INT16_T  */\n  YYSYMBOL_UINT16_T = 75,                  /* UINT16_T  */\n  YYSYMBOL_INT8_T = 76,                    /* INT8_T  */\n  YYSYMBOL_UINT8_T = 77,                   /* UINT8_T  */\n  YYSYMBOL_I64VEC2 = 78,                   /* I64VEC2  */\n  YYSYMBOL_I64VEC3 = 79,                   /* I64VEC3  */\n  YYSYMBOL_I64VEC4 = 80,                   /* I64VEC4  */\n  YYSYMBOL_U64VEC2 = 81,                   /* U64VEC2  */\n  YYSYMBOL_U64VEC3 = 82,                   /* U64VEC3  */\n  YYSYMBOL_U64VEC4 = 83,                   /* U64VEC4  */\n  YYSYMBOL_I32VEC2 = 84,                   /* I32VEC2  */\n  YYSYMBOL_I32VEC3 = 85,                   /* I32VEC3  */\n  YYSYMBOL_I32VEC4 = 86,                   /* I32VEC4  */\n  YYSYMBOL_U32VEC2 = 87,                   /* U32VEC2  */\n  YYSYMBOL_U32VEC3 = 88,                   /* U32VEC3  */\n  YYSYMBOL_U32VEC4 = 89,                   /* U32VEC4  */\n  YYSYMBOL_I16VEC2 = 90,                   /* I16VEC2  */\n  YYSYMBOL_I16VEC3 = 91,                   /* I16VEC3  */\n  YYSYMBOL_I16VEC4 = 92,                   /* I16VEC4  */\n  YYSYMBOL_U16VEC2 = 93,                   /* U16VEC2  */\n  YYSYMBOL_U16VEC3 = 94,                   /* U16VEC3  */\n  YYSYMBOL_U16VEC4 = 95,                   /* U16VEC4  */\n  YYSYMBOL_I8VEC2 = 96,                    /* I8VEC2  */\n  YYSYMBOL_I8VEC3 = 97,                    /* I8VEC3  */\n  YYSYMBOL_I8VEC4 = 98,                    /* I8VEC4  */\n  YYSYMBOL_U8VEC2 = 99,                    /* U8VEC2  */\n  YYSYMBOL_U8VEC3 = 100,                   /* U8VEC3  */\n  YYSYMBOL_U8VEC4 = 101,                   /* U8VEC4  */\n  YYSYMBOL_DVEC2 = 102,                    /* DVEC2  */\n  YYSYMBOL_DVEC3 = 103,                    /* DVEC3  */\n  YYSYMBOL_DVEC4 = 104,                    /* DVEC4  */\n  YYSYMBOL_DMAT2 = 105,                    /* DMAT2  */\n  YYSYMBOL_DMAT3 = 106,                    /* DMAT3  */\n  YYSYMBOL_DMAT4 = 107,                    /* DMAT4  */\n  YYSYMBOL_BF16VEC2 = 108,                 /* BF16VEC2  */\n  YYSYMBOL_BF16VEC3 = 109,                 /* BF16VEC3  */\n  YYSYMBOL_BF16VEC4 = 110,                 /* BF16VEC4  */\n  YYSYMBOL_FE5M2VEC2 = 111,                /* FE5M2VEC2  */\n  YYSYMBOL_FE5M2VEC3 = 112,                /* FE5M2VEC3  */\n  YYSYMBOL_FE5M2VEC4 = 113,                /* FE5M2VEC4  */\n  YYSYMBOL_FE4M3VEC2 = 114,                /* FE4M3VEC2  */\n  YYSYMBOL_FE4M3VEC3 = 115,                /* FE4M3VEC3  */\n  YYSYMBOL_FE4M3VEC4 = 116,                /* FE4M3VEC4  */\n  YYSYMBOL_F16VEC2 = 117,                  /* F16VEC2  */\n  YYSYMBOL_F16VEC3 = 118,                  /* F16VEC3  */\n  YYSYMBOL_F16VEC4 = 119,                  /* F16VEC4  */\n  YYSYMBOL_F16MAT2 = 120,                  /* F16MAT2  */\n  YYSYMBOL_F16MAT3 = 121,                  /* F16MAT3  */\n  YYSYMBOL_F16MAT4 = 122,                  /* F16MAT4  */\n  YYSYMBOL_F32VEC2 = 123,                  /* F32VEC2  */\n  YYSYMBOL_F32VEC3 = 124,                  /* F32VEC3  */\n  YYSYMBOL_F32VEC4 = 125,                  /* F32VEC4  */\n  YYSYMBOL_F32MAT2 = 126,                  /* F32MAT2  */\n  YYSYMBOL_F32MAT3 = 127,                  /* F32MAT3  */\n  YYSYMBOL_F32MAT4 = 128,                  /* F32MAT4  */\n  YYSYMBOL_F64VEC2 = 129,                  /* F64VEC2  */\n  YYSYMBOL_F64VEC3 = 130,                  /* F64VEC3  */\n  YYSYMBOL_F64VEC4 = 131,                  /* F64VEC4  */\n  YYSYMBOL_F64MAT2 = 132,                  /* F64MAT2  */\n  YYSYMBOL_F64MAT3 = 133,                  /* F64MAT3  */\n  YYSYMBOL_F64MAT4 = 134,                  /* F64MAT4  */\n  YYSYMBOL_DMAT2X2 = 135,                  /* DMAT2X2  */\n  YYSYMBOL_DMAT2X3 = 136,                  /* DMAT2X3  */\n  YYSYMBOL_DMAT2X4 = 137,                  /* DMAT2X4  */\n  YYSYMBOL_DMAT3X2 = 138,                  /* DMAT3X2  */\n  YYSYMBOL_DMAT3X3 = 139,                  /* DMAT3X3  */\n  YYSYMBOL_DMAT3X4 = 140,                  /* DMAT3X4  */\n  YYSYMBOL_DMAT4X2 = 141,                  /* DMAT4X2  */\n  YYSYMBOL_DMAT4X3 = 142,                  /* DMAT4X3  */\n  YYSYMBOL_DMAT4X4 = 143,                  /* DMAT4X4  */\n  YYSYMBOL_F16MAT2X2 = 144,                /* F16MAT2X2  */\n  YYSYMBOL_F16MAT2X3 = 145,                /* F16MAT2X3  */\n  YYSYMBOL_F16MAT2X4 = 146,                /* F16MAT2X4  */\n  YYSYMBOL_F16MAT3X2 = 147,                /* F16MAT3X2  */\n  YYSYMBOL_F16MAT3X3 = 148,                /* F16MAT3X3  */\n  YYSYMBOL_F16MAT3X4 = 149,                /* F16MAT3X4  */\n  YYSYMBOL_F16MAT4X2 = 150,                /* F16MAT4X2  */\n  YYSYMBOL_F16MAT4X3 = 151,                /* F16MAT4X3  */\n  YYSYMBOL_F16MAT4X4 = 152,                /* F16MAT4X4  */\n  YYSYMBOL_F32MAT2X2 = 153,                /* F32MAT2X2  */\n  YYSYMBOL_F32MAT2X3 = 154,                /* F32MAT2X3  */\n  YYSYMBOL_F32MAT2X4 = 155,                /* F32MAT2X4  */\n  YYSYMBOL_F32MAT3X2 = 156,                /* F32MAT3X2  */\n  YYSYMBOL_F32MAT3X3 = 157,                /* F32MAT3X3  */\n  YYSYMBOL_F32MAT3X4 = 158,                /* F32MAT3X4  */\n  YYSYMBOL_F32MAT4X2 = 159,                /* F32MAT4X2  */\n  YYSYMBOL_F32MAT4X3 = 160,                /* F32MAT4X3  */\n  YYSYMBOL_F32MAT4X4 = 161,                /* F32MAT4X4  */\n  YYSYMBOL_F64MAT2X2 = 162,                /* F64MAT2X2  */\n  YYSYMBOL_F64MAT2X3 = 163,                /* F64MAT2X3  */\n  YYSYMBOL_F64MAT2X4 = 164,                /* F64MAT2X4  */\n  YYSYMBOL_F64MAT3X2 = 165,                /* F64MAT3X2  */\n  YYSYMBOL_F64MAT3X3 = 166,                /* F64MAT3X3  */\n  YYSYMBOL_F64MAT3X4 = 167,                /* F64MAT3X4  */\n  YYSYMBOL_F64MAT4X2 = 168,                /* F64MAT4X2  */\n  YYSYMBOL_F64MAT4X3 = 169,                /* F64MAT4X3  */\n  YYSYMBOL_F64MAT4X4 = 170,                /* F64MAT4X4  */\n  YYSYMBOL_ATOMIC_UINT = 171,              /* ATOMIC_UINT  */\n  YYSYMBOL_ACCSTRUCTNV = 172,              /* ACCSTRUCTNV  */\n  YYSYMBOL_ACCSTRUCTEXT = 173,             /* ACCSTRUCTEXT  */\n  YYSYMBOL_RAYQUERYEXT = 174,              /* RAYQUERYEXT  */\n  YYSYMBOL_FCOOPMATNV = 175,               /* FCOOPMATNV  */\n  YYSYMBOL_ICOOPMATNV = 176,               /* ICOOPMATNV  */\n  YYSYMBOL_UCOOPMATNV = 177,               /* UCOOPMATNV  */\n  YYSYMBOL_COOPMAT = 178,                  /* COOPMAT  */\n  YYSYMBOL_COOPVECNV = 179,                /* COOPVECNV  */\n  YYSYMBOL_HITOBJECTNV = 180,              /* HITOBJECTNV  */\n  YYSYMBOL_HITOBJECTATTRNV = 181,          /* HITOBJECTATTRNV  */\n  YYSYMBOL_TENSORLAYOUTNV = 182,           /* TENSORLAYOUTNV  */\n  YYSYMBOL_TENSORVIEWNV = 183,             /* TENSORVIEWNV  */\n  YYSYMBOL_SAMPLERCUBEARRAY = 184,         /* SAMPLERCUBEARRAY  */\n  YYSYMBOL_SAMPLERCUBEARRAYSHADOW = 185,   /* SAMPLERCUBEARRAYSHADOW  */\n  YYSYMBOL_ISAMPLERCUBEARRAY = 186,        /* ISAMPLERCUBEARRAY  */\n  YYSYMBOL_USAMPLERCUBEARRAY = 187,        /* USAMPLERCUBEARRAY  */\n  YYSYMBOL_SAMPLER1D = 188,                /* SAMPLER1D  */\n  YYSYMBOL_SAMPLER1DARRAY = 189,           /* SAMPLER1DARRAY  */\n  YYSYMBOL_SAMPLER1DARRAYSHADOW = 190,     /* SAMPLER1DARRAYSHADOW  */\n  YYSYMBOL_ISAMPLER1D = 191,               /* ISAMPLER1D  */\n  YYSYMBOL_SAMPLER1DSHADOW = 192,          /* SAMPLER1DSHADOW  */\n  YYSYMBOL_SAMPLER2DRECT = 193,            /* SAMPLER2DRECT  */\n  YYSYMBOL_SAMPLER2DRECTSHADOW = 194,      /* SAMPLER2DRECTSHADOW  */\n  YYSYMBOL_ISAMPLER2DRECT = 195,           /* ISAMPLER2DRECT  */\n  YYSYMBOL_USAMPLER2DRECT = 196,           /* USAMPLER2DRECT  */\n  YYSYMBOL_SAMPLERBUFFER = 197,            /* SAMPLERBUFFER  */\n  YYSYMBOL_ISAMPLERBUFFER = 198,           /* ISAMPLERBUFFER  */\n  YYSYMBOL_USAMPLERBUFFER = 199,           /* USAMPLERBUFFER  */\n  YYSYMBOL_SAMPLER2DMS = 200,              /* SAMPLER2DMS  */\n  YYSYMBOL_ISAMPLER2DMS = 201,             /* ISAMPLER2DMS  */\n  YYSYMBOL_USAMPLER2DMS = 202,             /* USAMPLER2DMS  */\n  YYSYMBOL_SAMPLER2DMSARRAY = 203,         /* SAMPLER2DMSARRAY  */\n  YYSYMBOL_ISAMPLER2DMSARRAY = 204,        /* ISAMPLER2DMSARRAY  */\n  YYSYMBOL_USAMPLER2DMSARRAY = 205,        /* USAMPLER2DMSARRAY  */\n  YYSYMBOL_SAMPLEREXTERNALOES = 206,       /* SAMPLEREXTERNALOES  */\n  YYSYMBOL_SAMPLEREXTERNAL2DY2YEXT = 207,  /* SAMPLEREXTERNAL2DY2YEXT  */\n  YYSYMBOL_ISAMPLER1DARRAY = 208,          /* ISAMPLER1DARRAY  */\n  YYSYMBOL_USAMPLER1D = 209,               /* USAMPLER1D  */\n  YYSYMBOL_USAMPLER1DARRAY = 210,          /* USAMPLER1DARRAY  */\n  YYSYMBOL_F16SAMPLER1D = 211,             /* F16SAMPLER1D  */\n  YYSYMBOL_F16SAMPLER2D = 212,             /* F16SAMPLER2D  */\n  YYSYMBOL_F16SAMPLER3D = 213,             /* F16SAMPLER3D  */\n  YYSYMBOL_F16SAMPLER2DRECT = 214,         /* F16SAMPLER2DRECT  */\n  YYSYMBOL_F16SAMPLERCUBE = 215,           /* F16SAMPLERCUBE  */\n  YYSYMBOL_F16SAMPLER1DARRAY = 216,        /* F16SAMPLER1DARRAY  */\n  YYSYMBOL_F16SAMPLER2DARRAY = 217,        /* F16SAMPLER2DARRAY  */\n  YYSYMBOL_F16SAMPLERCUBEARRAY = 218,      /* F16SAMPLERCUBEARRAY  */\n  YYSYMBOL_F16SAMPLERBUFFER = 219,         /* F16SAMPLERBUFFER  */\n  YYSYMBOL_F16SAMPLER2DMS = 220,           /* F16SAMPLER2DMS  */\n  YYSYMBOL_F16SAMPLER2DMSARRAY = 221,      /* F16SAMPLER2DMSARRAY  */\n  YYSYMBOL_F16SAMPLER1DSHADOW = 222,       /* F16SAMPLER1DSHADOW  */\n  YYSYMBOL_F16SAMPLER2DSHADOW = 223,       /* F16SAMPLER2DSHADOW  */\n  YYSYMBOL_F16SAMPLER1DARRAYSHADOW = 224,  /* F16SAMPLER1DARRAYSHADOW  */\n  YYSYMBOL_F16SAMPLER2DARRAYSHADOW = 225,  /* F16SAMPLER2DARRAYSHADOW  */\n  YYSYMBOL_F16SAMPLER2DRECTSHADOW = 226,   /* F16SAMPLER2DRECTSHADOW  */\n  YYSYMBOL_F16SAMPLERCUBESHADOW = 227,     /* F16SAMPLERCUBESHADOW  */\n  YYSYMBOL_F16SAMPLERCUBEARRAYSHADOW = 228, /* F16SAMPLERCUBEARRAYSHADOW  */\n  YYSYMBOL_IMAGE1D = 229,                  /* IMAGE1D  */\n  YYSYMBOL_IIMAGE1D = 230,                 /* IIMAGE1D  */\n  YYSYMBOL_UIMAGE1D = 231,                 /* UIMAGE1D  */\n  YYSYMBOL_IMAGE2D = 232,                  /* IMAGE2D  */\n  YYSYMBOL_IIMAGE2D = 233,                 /* IIMAGE2D  */\n  YYSYMBOL_UIMAGE2D = 234,                 /* UIMAGE2D  */\n  YYSYMBOL_IMAGE3D = 235,                  /* IMAGE3D  */\n  YYSYMBOL_IIMAGE3D = 236,                 /* IIMAGE3D  */\n  YYSYMBOL_UIMAGE3D = 237,                 /* UIMAGE3D  */\n  YYSYMBOL_IMAGE2DRECT = 238,              /* IMAGE2DRECT  */\n  YYSYMBOL_IIMAGE2DRECT = 239,             /* IIMAGE2DRECT  */\n  YYSYMBOL_UIMAGE2DRECT = 240,             /* UIMAGE2DRECT  */\n  YYSYMBOL_IMAGECUBE = 241,                /* IMAGECUBE  */\n  YYSYMBOL_IIMAGECUBE = 242,               /* IIMAGECUBE  */\n  YYSYMBOL_UIMAGECUBE = 243,               /* UIMAGECUBE  */\n  YYSYMBOL_IMAGEBUFFER = 244,              /* IMAGEBUFFER  */\n  YYSYMBOL_IIMAGEBUFFER = 245,             /* IIMAGEBUFFER  */\n  YYSYMBOL_UIMAGEBUFFER = 246,             /* UIMAGEBUFFER  */\n  YYSYMBOL_IMAGE1DARRAY = 247,             /* IMAGE1DARRAY  */\n  YYSYMBOL_IIMAGE1DARRAY = 248,            /* IIMAGE1DARRAY  */\n  YYSYMBOL_UIMAGE1DARRAY = 249,            /* UIMAGE1DARRAY  */\n  YYSYMBOL_IMAGE2DARRAY = 250,             /* IMAGE2DARRAY  */\n  YYSYMBOL_IIMAGE2DARRAY = 251,            /* IIMAGE2DARRAY  */\n  YYSYMBOL_UIMAGE2DARRAY = 252,            /* UIMAGE2DARRAY  */\n  YYSYMBOL_IMAGECUBEARRAY = 253,           /* IMAGECUBEARRAY  */\n  YYSYMBOL_IIMAGECUBEARRAY = 254,          /* IIMAGECUBEARRAY  */\n  YYSYMBOL_UIMAGECUBEARRAY = 255,          /* UIMAGECUBEARRAY  */\n  YYSYMBOL_IMAGE2DMS = 256,                /* IMAGE2DMS  */\n  YYSYMBOL_IIMAGE2DMS = 257,               /* IIMAGE2DMS  */\n  YYSYMBOL_UIMAGE2DMS = 258,               /* UIMAGE2DMS  */\n  YYSYMBOL_IMAGE2DMSARRAY = 259,           /* IMAGE2DMSARRAY  */\n  YYSYMBOL_IIMAGE2DMSARRAY = 260,          /* IIMAGE2DMSARRAY  */\n  YYSYMBOL_UIMAGE2DMSARRAY = 261,          /* UIMAGE2DMSARRAY  */\n  YYSYMBOL_F16IMAGE1D = 262,               /* F16IMAGE1D  */\n  YYSYMBOL_F16IMAGE2D = 263,               /* F16IMAGE2D  */\n  YYSYMBOL_F16IMAGE3D = 264,               /* F16IMAGE3D  */\n  YYSYMBOL_F16IMAGE2DRECT = 265,           /* F16IMAGE2DRECT  */\n  YYSYMBOL_F16IMAGECUBE = 266,             /* F16IMAGECUBE  */\n  YYSYMBOL_F16IMAGE1DARRAY = 267,          /* F16IMAGE1DARRAY  */\n  YYSYMBOL_F16IMAGE2DARRAY = 268,          /* F16IMAGE2DARRAY  */\n  YYSYMBOL_F16IMAGECUBEARRAY = 269,        /* F16IMAGECUBEARRAY  */\n  YYSYMBOL_F16IMAGEBUFFER = 270,           /* F16IMAGEBUFFER  */\n  YYSYMBOL_F16IMAGE2DMS = 271,             /* F16IMAGE2DMS  */\n  YYSYMBOL_F16IMAGE2DMSARRAY = 272,        /* F16IMAGE2DMSARRAY  */\n  YYSYMBOL_I64IMAGE1D = 273,               /* I64IMAGE1D  */\n  YYSYMBOL_U64IMAGE1D = 274,               /* U64IMAGE1D  */\n  YYSYMBOL_I64IMAGE2D = 275,               /* I64IMAGE2D  */\n  YYSYMBOL_U64IMAGE2D = 276,               /* U64IMAGE2D  */\n  YYSYMBOL_I64IMAGE3D = 277,               /* I64IMAGE3D  */\n  YYSYMBOL_U64IMAGE3D = 278,               /* U64IMAGE3D  */\n  YYSYMBOL_I64IMAGE2DRECT = 279,           /* I64IMAGE2DRECT  */\n  YYSYMBOL_U64IMAGE2DRECT = 280,           /* U64IMAGE2DRECT  */\n  YYSYMBOL_I64IMAGECUBE = 281,             /* I64IMAGECUBE  */\n  YYSYMBOL_U64IMAGECUBE = 282,             /* U64IMAGECUBE  */\n  YYSYMBOL_I64IMAGEBUFFER = 283,           /* I64IMAGEBUFFER  */\n  YYSYMBOL_U64IMAGEBUFFER = 284,           /* U64IMAGEBUFFER  */\n  YYSYMBOL_I64IMAGE1DARRAY = 285,          /* I64IMAGE1DARRAY  */\n  YYSYMBOL_U64IMAGE1DARRAY = 286,          /* U64IMAGE1DARRAY  */\n  YYSYMBOL_I64IMAGE2DARRAY = 287,          /* I64IMAGE2DARRAY  */\n  YYSYMBOL_U64IMAGE2DARRAY = 288,          /* U64IMAGE2DARRAY  */\n  YYSYMBOL_I64IMAGECUBEARRAY = 289,        /* I64IMAGECUBEARRAY  */\n  YYSYMBOL_U64IMAGECUBEARRAY = 290,        /* U64IMAGECUBEARRAY  */\n  YYSYMBOL_I64IMAGE2DMS = 291,             /* I64IMAGE2DMS  */\n  YYSYMBOL_U64IMAGE2DMS = 292,             /* U64IMAGE2DMS  */\n  YYSYMBOL_I64IMAGE2DMSARRAY = 293,        /* I64IMAGE2DMSARRAY  */\n  YYSYMBOL_U64IMAGE2DMSARRAY = 294,        /* U64IMAGE2DMSARRAY  */\n  YYSYMBOL_TEXTURECUBEARRAY = 295,         /* TEXTURECUBEARRAY  */\n  YYSYMBOL_ITEXTURECUBEARRAY = 296,        /* ITEXTURECUBEARRAY  */\n  YYSYMBOL_UTEXTURECUBEARRAY = 297,        /* UTEXTURECUBEARRAY  */\n  YYSYMBOL_TEXTURE1D = 298,                /* TEXTURE1D  */\n  YYSYMBOL_ITEXTURE1D = 299,               /* ITEXTURE1D  */\n  YYSYMBOL_UTEXTURE1D = 300,               /* UTEXTURE1D  */\n  YYSYMBOL_TEXTURE1DARRAY = 301,           /* TEXTURE1DARRAY  */\n  YYSYMBOL_ITEXTURE1DARRAY = 302,          /* ITEXTURE1DARRAY  */\n  YYSYMBOL_UTEXTURE1DARRAY = 303,          /* UTEXTURE1DARRAY  */\n  YYSYMBOL_TEXTURE2DRECT = 304,            /* TEXTURE2DRECT  */\n  YYSYMBOL_ITEXTURE2DRECT = 305,           /* ITEXTURE2DRECT  */\n  YYSYMBOL_UTEXTURE2DRECT = 306,           /* UTEXTURE2DRECT  */\n  YYSYMBOL_TEXTUREBUFFER = 307,            /* TEXTUREBUFFER  */\n  YYSYMBOL_ITEXTUREBUFFER = 308,           /* ITEXTUREBUFFER  */\n  YYSYMBOL_UTEXTUREBUFFER = 309,           /* UTEXTUREBUFFER  */\n  YYSYMBOL_TEXTURE2DMS = 310,              /* TEXTURE2DMS  */\n  YYSYMBOL_ITEXTURE2DMS = 311,             /* ITEXTURE2DMS  */\n  YYSYMBOL_UTEXTURE2DMS = 312,             /* UTEXTURE2DMS  */\n  YYSYMBOL_TEXTURE2DMSARRAY = 313,         /* TEXTURE2DMSARRAY  */\n  YYSYMBOL_ITEXTURE2DMSARRAY = 314,        /* ITEXTURE2DMSARRAY  */\n  YYSYMBOL_UTEXTURE2DMSARRAY = 315,        /* UTEXTURE2DMSARRAY  */\n  YYSYMBOL_F16TEXTURE1D = 316,             /* F16TEXTURE1D  */\n  YYSYMBOL_F16TEXTURE2D = 317,             /* F16TEXTURE2D  */\n  YYSYMBOL_F16TEXTURE3D = 318,             /* F16TEXTURE3D  */\n  YYSYMBOL_F16TEXTURE2DRECT = 319,         /* F16TEXTURE2DRECT  */\n  YYSYMBOL_F16TEXTURECUBE = 320,           /* F16TEXTURECUBE  */\n  YYSYMBOL_F16TEXTURE1DARRAY = 321,        /* F16TEXTURE1DARRAY  */\n  YYSYMBOL_F16TEXTURE2DARRAY = 322,        /* F16TEXTURE2DARRAY  */\n  YYSYMBOL_F16TEXTURECUBEARRAY = 323,      /* F16TEXTURECUBEARRAY  */\n  YYSYMBOL_F16TEXTUREBUFFER = 324,         /* F16TEXTUREBUFFER  */\n  YYSYMBOL_F16TEXTURE2DMS = 325,           /* F16TEXTURE2DMS  */\n  YYSYMBOL_F16TEXTURE2DMSARRAY = 326,      /* F16TEXTURE2DMSARRAY  */\n  YYSYMBOL_SUBPASSINPUT = 327,             /* SUBPASSINPUT  */\n  YYSYMBOL_SUBPASSINPUTMS = 328,           /* SUBPASSINPUTMS  */\n  YYSYMBOL_ISUBPASSINPUT = 329,            /* ISUBPASSINPUT  */\n  YYSYMBOL_ISUBPASSINPUTMS = 330,          /* ISUBPASSINPUTMS  */\n  YYSYMBOL_USUBPASSINPUT = 331,            /* USUBPASSINPUT  */\n  YYSYMBOL_USUBPASSINPUTMS = 332,          /* USUBPASSINPUTMS  */\n  YYSYMBOL_F16SUBPASSINPUT = 333,          /* F16SUBPASSINPUT  */\n  YYSYMBOL_F16SUBPASSINPUTMS = 334,        /* F16SUBPASSINPUTMS  */\n  YYSYMBOL_SPIRV_INSTRUCTION = 335,        /* SPIRV_INSTRUCTION  */\n  YYSYMBOL_SPIRV_EXECUTION_MODE = 336,     /* SPIRV_EXECUTION_MODE  */\n  YYSYMBOL_SPIRV_EXECUTION_MODE_ID = 337,  /* SPIRV_EXECUTION_MODE_ID  */\n  YYSYMBOL_SPIRV_DECORATE = 338,           /* SPIRV_DECORATE  */\n  YYSYMBOL_SPIRV_DECORATE_ID = 339,        /* SPIRV_DECORATE_ID  */\n  YYSYMBOL_SPIRV_DECORATE_STRING = 340,    /* SPIRV_DECORATE_STRING  */\n  YYSYMBOL_SPIRV_TYPE = 341,               /* SPIRV_TYPE  */\n  YYSYMBOL_SPIRV_STORAGE_CLASS = 342,      /* SPIRV_STORAGE_CLASS  */\n  YYSYMBOL_SPIRV_BY_REFERENCE = 343,       /* SPIRV_BY_REFERENCE  */\n  YYSYMBOL_SPIRV_LITERAL = 344,            /* SPIRV_LITERAL  */\n  YYSYMBOL_ATTACHMENTEXT = 345,            /* ATTACHMENTEXT  */\n  YYSYMBOL_IATTACHMENTEXT = 346,           /* IATTACHMENTEXT  */\n  YYSYMBOL_UATTACHMENTEXT = 347,           /* UATTACHMENTEXT  */\n  YYSYMBOL_LEFT_OP = 348,                  /* LEFT_OP  */\n  YYSYMBOL_RIGHT_OP = 349,                 /* RIGHT_OP  */\n  YYSYMBOL_INC_OP = 350,                   /* INC_OP  */\n  YYSYMBOL_DEC_OP = 351,                   /* DEC_OP  */\n  YYSYMBOL_LE_OP = 352,                    /* LE_OP  */\n  YYSYMBOL_GE_OP = 353,                    /* GE_OP  */\n  YYSYMBOL_EQ_OP = 354,                    /* EQ_OP  */\n  YYSYMBOL_NE_OP = 355,                    /* NE_OP  */\n  YYSYMBOL_AND_OP = 356,                   /* AND_OP  */\n  YYSYMBOL_OR_OP = 357,                    /* OR_OP  */\n  YYSYMBOL_XOR_OP = 358,                   /* XOR_OP  */\n  YYSYMBOL_MUL_ASSIGN = 359,               /* MUL_ASSIGN  */\n  YYSYMBOL_DIV_ASSIGN = 360,               /* DIV_ASSIGN  */\n  YYSYMBOL_ADD_ASSIGN = 361,               /* ADD_ASSIGN  */\n  YYSYMBOL_MOD_ASSIGN = 362,               /* MOD_ASSIGN  */\n  YYSYMBOL_LEFT_ASSIGN = 363,              /* LEFT_ASSIGN  */\n  YYSYMBOL_RIGHT_ASSIGN = 364,             /* RIGHT_ASSIGN  */\n  YYSYMBOL_AND_ASSIGN = 365,               /* AND_ASSIGN  */\n  YYSYMBOL_XOR_ASSIGN = 366,               /* XOR_ASSIGN  */\n  YYSYMBOL_OR_ASSIGN = 367,                /* OR_ASSIGN  */\n  YYSYMBOL_SUB_ASSIGN = 368,               /* SUB_ASSIGN  */\n  YYSYMBOL_STRING_LITERAL = 369,           /* STRING_LITERAL  */\n  YYSYMBOL_LEFT_PAREN = 370,               /* LEFT_PAREN  */\n  YYSYMBOL_RIGHT_PAREN = 371,              /* RIGHT_PAREN  */\n  YYSYMBOL_LEFT_BRACKET = 372,             /* LEFT_BRACKET  */\n  YYSYMBOL_RIGHT_BRACKET = 373,            /* RIGHT_BRACKET  */\n  YYSYMBOL_LEFT_BRACE = 374,               /* LEFT_BRACE  */\n  YYSYMBOL_RIGHT_BRACE = 375,              /* RIGHT_BRACE  */\n  YYSYMBOL_DOT = 376,                      /* DOT  */\n  YYSYMBOL_COMMA = 377,                    /* COMMA  */\n  YYSYMBOL_COLON = 378,                    /* COLON  */\n  YYSYMBOL_EQUAL = 379,                    /* EQUAL  */\n  YYSYMBOL_SEMICOLON = 380,                /* SEMICOLON  */\n  YYSYMBOL_BANG = 381,                     /* BANG  */\n  YYSYMBOL_DASH = 382,                     /* DASH  */\n  YYSYMBOL_TILDE = 383,                    /* TILDE  */\n  YYSYMBOL_PLUS = 384,                     /* PLUS  */\n  YYSYMBOL_STAR = 385,                     /* STAR  */\n  YYSYMBOL_SLASH = 386,                    /* SLASH  */\n  YYSYMBOL_PERCENT = 387,                  /* PERCENT  */\n  YYSYMBOL_LEFT_ANGLE = 388,               /* LEFT_ANGLE  */\n  YYSYMBOL_RIGHT_ANGLE = 389,              /* RIGHT_ANGLE  */\n  YYSYMBOL_VERTICAL_BAR = 390,             /* VERTICAL_BAR  */\n  YYSYMBOL_CARET = 391,                    /* CARET  */\n  YYSYMBOL_AMPERSAND = 392,                /* AMPERSAND  */\n  YYSYMBOL_QUESTION = 393,                 /* QUESTION  */\n  YYSYMBOL_INVARIANT = 394,                /* INVARIANT  */\n  YYSYMBOL_HIGH_PRECISION = 395,           /* HIGH_PRECISION  */\n  YYSYMBOL_MEDIUM_PRECISION = 396,         /* MEDIUM_PRECISION  */\n  YYSYMBOL_LOW_PRECISION = 397,            /* LOW_PRECISION  */\n  YYSYMBOL_PRECISION = 398,                /* PRECISION  */\n  YYSYMBOL_PACKED = 399,                   /* PACKED  */\n  YYSYMBOL_RESOURCE = 400,                 /* RESOURCE  */\n  YYSYMBOL_SUPERP = 401,                   /* SUPERP  */\n  YYSYMBOL_FLOATCONSTANT = 402,            /* FLOATCONSTANT  */\n  YYSYMBOL_INTCONSTANT = 403,              /* INTCONSTANT  */\n  YYSYMBOL_UINTCONSTANT = 404,             /* UINTCONSTANT  */\n  YYSYMBOL_BOOLCONSTANT = 405,             /* BOOLCONSTANT  */\n  YYSYMBOL_IDENTIFIER = 406,               /* IDENTIFIER  */\n  YYSYMBOL_TYPE_NAME = 407,                /* TYPE_NAME  */\n  YYSYMBOL_CENTROID = 408,                 /* CENTROID  */\n  YYSYMBOL_IN = 409,                       /* IN  */\n  YYSYMBOL_OUT = 410,                      /* OUT  */\n  YYSYMBOL_INOUT = 411,                    /* INOUT  */\n  YYSYMBOL_STRUCT = 412,                   /* STRUCT  */\n  YYSYMBOL_VOID = 413,                     /* VOID  */\n  YYSYMBOL_WHILE = 414,                    /* WHILE  */\n  YYSYMBOL_BREAK = 415,                    /* BREAK  */\n  YYSYMBOL_CONTINUE = 416,                 /* CONTINUE  */\n  YYSYMBOL_DO = 417,                       /* DO  */\n  YYSYMBOL_ELSE = 418,                     /* ELSE  */\n  YYSYMBOL_FOR = 419,                      /* FOR  */\n  YYSYMBOL_IF = 420,                       /* IF  */\n  YYSYMBOL_DISCARD = 421,                  /* DISCARD  */\n  YYSYMBOL_RETURN = 422,                   /* RETURN  */\n  YYSYMBOL_SWITCH = 423,                   /* SWITCH  */\n  YYSYMBOL_CASE = 424,                     /* CASE  */\n  YYSYMBOL_DEFAULT = 425,                  /* DEFAULT  */\n  YYSYMBOL_TERMINATE_INVOCATION = 426,     /* TERMINATE_INVOCATION  */\n  YYSYMBOL_TERMINATE_RAY = 427,            /* TERMINATE_RAY  */\n  YYSYMBOL_IGNORE_INTERSECTION = 428,      /* IGNORE_INTERSECTION  */\n  YYSYMBOL_UNIFORM = 429,                  /* UNIFORM  */\n  YYSYMBOL_SHARED = 430,                   /* SHARED  */\n  YYSYMBOL_BUFFER = 431,                   /* BUFFER  */\n  YYSYMBOL_TILEIMAGEEXT = 432,             /* TILEIMAGEEXT  */\n  YYSYMBOL_FLAT = 433,                     /* FLAT  */\n  YYSYMBOL_SMOOTH = 434,                   /* SMOOTH  */\n  YYSYMBOL_LAYOUT = 435,                   /* LAYOUT  */\n  YYSYMBOL_DOUBLECONSTANT = 436,           /* DOUBLECONSTANT  */\n  YYSYMBOL_INT16CONSTANT = 437,            /* INT16CONSTANT  */\n  YYSYMBOL_UINT16CONSTANT = 438,           /* UINT16CONSTANT  */\n  YYSYMBOL_FLOAT16CONSTANT = 439,          /* FLOAT16CONSTANT  */\n  YYSYMBOL_INT32CONSTANT = 440,            /* INT32CONSTANT  */\n  YYSYMBOL_UINT32CONSTANT = 441,           /* UINT32CONSTANT  */\n  YYSYMBOL_INT64CONSTANT = 442,            /* INT64CONSTANT  */\n  YYSYMBOL_UINT64CONSTANT = 443,           /* UINT64CONSTANT  */\n  YYSYMBOL_SUBROUTINE = 444,               /* SUBROUTINE  */\n  YYSYMBOL_DEMOTE = 445,                   /* DEMOTE  */\n  YYSYMBOL_FUNCTION = 446,                 /* FUNCTION  */\n  YYSYMBOL_PAYLOADNV = 447,                /* PAYLOADNV  */\n  YYSYMBOL_PAYLOADINNV = 448,              /* PAYLOADINNV  */\n  YYSYMBOL_HITATTRNV = 449,                /* HITATTRNV  */\n  YYSYMBOL_CALLDATANV = 450,               /* CALLDATANV  */\n  YYSYMBOL_CALLDATAINNV = 451,             /* CALLDATAINNV  */\n  YYSYMBOL_PAYLOADEXT = 452,               /* PAYLOADEXT  */\n  YYSYMBOL_PAYLOADINEXT = 453,             /* PAYLOADINEXT  */\n  YYSYMBOL_HITATTREXT = 454,               /* HITATTREXT  */\n  YYSYMBOL_CALLDATAEXT = 455,              /* CALLDATAEXT  */\n  YYSYMBOL_CALLDATAINEXT = 456,            /* CALLDATAINEXT  */\n  YYSYMBOL_PATCH = 457,                    /* PATCH  */\n  YYSYMBOL_SAMPLE = 458,                   /* SAMPLE  */\n  YYSYMBOL_NONUNIFORM = 459,               /* NONUNIFORM  */\n  YYSYMBOL_COHERENT = 460,                 /* COHERENT  */\n  YYSYMBOL_VOLATILE = 461,                 /* VOLATILE  */\n  YYSYMBOL_RESTRICT = 462,                 /* RESTRICT  */\n  YYSYMBOL_READONLY = 463,                 /* READONLY  */\n  YYSYMBOL_WRITEONLY = 464,                /* WRITEONLY  */\n  YYSYMBOL_NONTEMPORAL = 465,              /* NONTEMPORAL  */\n  YYSYMBOL_DEVICECOHERENT = 466,           /* DEVICECOHERENT  */\n  YYSYMBOL_QUEUEFAMILYCOHERENT = 467,      /* QUEUEFAMILYCOHERENT  */\n  YYSYMBOL_WORKGROUPCOHERENT = 468,        /* WORKGROUPCOHERENT  */\n  YYSYMBOL_SUBGROUPCOHERENT = 469,         /* SUBGROUPCOHERENT  */\n  YYSYMBOL_NONPRIVATE = 470,               /* NONPRIVATE  */\n  YYSYMBOL_SHADERCALLCOHERENT = 471,       /* SHADERCALLCOHERENT  */\n  YYSYMBOL_NOPERSPECTIVE = 472,            /* NOPERSPECTIVE  */\n  YYSYMBOL_EXPLICITINTERPAMD = 473,        /* EXPLICITINTERPAMD  */\n  YYSYMBOL_PERVERTEXEXT = 474,             /* PERVERTEXEXT  */\n  YYSYMBOL_PERVERTEXNV = 475,              /* PERVERTEXNV  */\n  YYSYMBOL_PERPRIMITIVENV = 476,           /* PERPRIMITIVENV  */\n  YYSYMBOL_PERVIEWNV = 477,                /* PERVIEWNV  */\n  YYSYMBOL_PERTASKNV = 478,                /* PERTASKNV  */\n  YYSYMBOL_PERPRIMITIVEEXT = 479,          /* PERPRIMITIVEEXT  */\n  YYSYMBOL_TASKPAYLOADWORKGROUPEXT = 480,  /* TASKPAYLOADWORKGROUPEXT  */\n  YYSYMBOL_PRECISE = 481,                  /* PRECISE  */\n  YYSYMBOL_YYACCEPT = 482,                 /* $accept  */\n  YYSYMBOL_variable_identifier = 483,      /* variable_identifier  */\n  YYSYMBOL_primary_expression = 484,       /* primary_expression  */\n  YYSYMBOL_postfix_expression = 485,       /* postfix_expression  */\n  YYSYMBOL_integer_expression = 486,       /* integer_expression  */\n  YYSYMBOL_function_call = 487,            /* function_call  */\n  YYSYMBOL_function_call_or_method = 488,  /* function_call_or_method  */\n  YYSYMBOL_function_call_generic = 489,    /* function_call_generic  */\n  YYSYMBOL_function_call_header_no_parameters = 490, /* function_call_header_no_parameters  */\n  YYSYMBOL_function_call_header_with_parameters = 491, /* function_call_header_with_parameters  */\n  YYSYMBOL_function_call_header = 492,     /* function_call_header  */\n  YYSYMBOL_function_identifier = 493,      /* function_identifier  */\n  YYSYMBOL_unary_expression = 494,         /* unary_expression  */\n  YYSYMBOL_unary_operator = 495,           /* unary_operator  */\n  YYSYMBOL_multiplicative_expression = 496, /* multiplicative_expression  */\n  YYSYMBOL_additive_expression = 497,      /* additive_expression  */\n  YYSYMBOL_shift_expression = 498,         /* shift_expression  */\n  YYSYMBOL_relational_expression = 499,    /* relational_expression  */\n  YYSYMBOL_equality_expression = 500,      /* equality_expression  */\n  YYSYMBOL_and_expression = 501,           /* and_expression  */\n  YYSYMBOL_exclusive_or_expression = 502,  /* exclusive_or_expression  */\n  YYSYMBOL_inclusive_or_expression = 503,  /* inclusive_or_expression  */\n  YYSYMBOL_logical_and_expression = 504,   /* logical_and_expression  */\n  YYSYMBOL_logical_xor_expression = 505,   /* logical_xor_expression  */\n  YYSYMBOL_logical_or_expression = 506,    /* logical_or_expression  */\n  YYSYMBOL_conditional_expression = 507,   /* conditional_expression  */\n  YYSYMBOL_508_1 = 508,                    /* $@1  */\n  YYSYMBOL_assignment_expression = 509,    /* assignment_expression  */\n  YYSYMBOL_assignment_operator = 510,      /* assignment_operator  */\n  YYSYMBOL_expression = 511,               /* expression  */\n  YYSYMBOL_constant_expression = 512,      /* constant_expression  */\n  YYSYMBOL_declaration = 513,              /* declaration  */\n  YYSYMBOL_block_structure = 514,          /* block_structure  */\n  YYSYMBOL_515_2 = 515,                    /* $@2  */\n  YYSYMBOL_identifier_list = 516,          /* identifier_list  */\n  YYSYMBOL_function_prototype = 517,       /* function_prototype  */\n  YYSYMBOL_function_declarator = 518,      /* function_declarator  */\n  YYSYMBOL_function_header_with_parameters = 519, /* function_header_with_parameters  */\n  YYSYMBOL_function_header = 520,          /* function_header  */\n  YYSYMBOL_parameter_declarator = 521,     /* parameter_declarator  */\n  YYSYMBOL_parameter_declaration = 522,    /* parameter_declaration  */\n  YYSYMBOL_parameter_type_specifier = 523, /* parameter_type_specifier  */\n  YYSYMBOL_init_declarator_list = 524,     /* init_declarator_list  */\n  YYSYMBOL_single_declaration = 525,       /* single_declaration  */\n  YYSYMBOL_fully_specified_type = 526,     /* fully_specified_type  */\n  YYSYMBOL_invariant_qualifier = 527,      /* invariant_qualifier  */\n  YYSYMBOL_interpolation_qualifier = 528,  /* interpolation_qualifier  */\n  YYSYMBOL_layout_qualifier = 529,         /* layout_qualifier  */\n  YYSYMBOL_layout_qualifier_id_list = 530, /* layout_qualifier_id_list  */\n  YYSYMBOL_layout_qualifier_id = 531,      /* layout_qualifier_id  */\n  YYSYMBOL_precise_qualifier = 532,        /* precise_qualifier  */\n  YYSYMBOL_type_qualifier = 533,           /* type_qualifier  */\n  YYSYMBOL_single_type_qualifier = 534,    /* single_type_qualifier  */\n  YYSYMBOL_storage_qualifier = 535,        /* storage_qualifier  */\n  YYSYMBOL_non_uniform_qualifier = 536,    /* non_uniform_qualifier  */\n  YYSYMBOL_type_name_list = 537,           /* type_name_list  */\n  YYSYMBOL_type_specifier = 538,           /* type_specifier  */\n  YYSYMBOL_array_specifier = 539,          /* array_specifier  */\n  YYSYMBOL_type_parameter_specifier_opt = 540, /* type_parameter_specifier_opt  */\n  YYSYMBOL_type_parameter_specifier = 541, /* type_parameter_specifier  */\n  YYSYMBOL_type_parameter_specifier_list = 542, /* type_parameter_specifier_list  */\n  YYSYMBOL_type_specifier_nonarray = 543,  /* type_specifier_nonarray  */\n  YYSYMBOL_precision_qualifier = 544,      /* precision_qualifier  */\n  YYSYMBOL_struct_specifier = 545,         /* struct_specifier  */\n  YYSYMBOL_546_3 = 546,                    /* $@3  */\n  YYSYMBOL_547_4 = 547,                    /* $@4  */\n  YYSYMBOL_struct_declaration_list = 548,  /* struct_declaration_list  */\n  YYSYMBOL_struct_declaration = 549,       /* struct_declaration  */\n  YYSYMBOL_struct_declarator_list = 550,   /* struct_declarator_list  */\n  YYSYMBOL_struct_declarator = 551,        /* struct_declarator  */\n  YYSYMBOL_initializer = 552,              /* initializer  */\n  YYSYMBOL_initializer_list = 553,         /* initializer_list  */\n  YYSYMBOL_declaration_statement = 554,    /* declaration_statement  */\n  YYSYMBOL_statement = 555,                /* statement  */\n  YYSYMBOL_simple_statement = 556,         /* simple_statement  */\n  YYSYMBOL_demote_statement = 557,         /* demote_statement  */\n  YYSYMBOL_compound_statement = 558,       /* compound_statement  */\n  YYSYMBOL_559_5 = 559,                    /* $@5  */\n  YYSYMBOL_560_6 = 560,                    /* $@6  */\n  YYSYMBOL_statement_no_new_scope = 561,   /* statement_no_new_scope  */\n  YYSYMBOL_statement_scoped = 562,         /* statement_scoped  */\n  YYSYMBOL_563_7 = 563,                    /* $@7  */\n  YYSYMBOL_564_8 = 564,                    /* $@8  */\n  YYSYMBOL_compound_statement_no_new_scope = 565, /* compound_statement_no_new_scope  */\n  YYSYMBOL_statement_list = 566,           /* statement_list  */\n  YYSYMBOL_expression_statement = 567,     /* expression_statement  */\n  YYSYMBOL_selection_statement = 568,      /* selection_statement  */\n  YYSYMBOL_selection_statement_nonattributed = 569, /* selection_statement_nonattributed  */\n  YYSYMBOL_selection_rest_statement = 570, /* selection_rest_statement  */\n  YYSYMBOL_condition = 571,                /* condition  */\n  YYSYMBOL_switch_statement = 572,         /* switch_statement  */\n  YYSYMBOL_switch_statement_nonattributed = 573, /* switch_statement_nonattributed  */\n  YYSYMBOL_574_9 = 574,                    /* $@9  */\n  YYSYMBOL_switch_statement_list = 575,    /* switch_statement_list  */\n  YYSYMBOL_case_label = 576,               /* case_label  */\n  YYSYMBOL_iteration_statement = 577,      /* iteration_statement  */\n  YYSYMBOL_iteration_statement_nonattributed = 578, /* iteration_statement_nonattributed  */\n  YYSYMBOL_579_10 = 579,                   /* $@10  */\n  YYSYMBOL_580_11 = 580,                   /* $@11  */\n  YYSYMBOL_581_12 = 581,                   /* $@12  */\n  YYSYMBOL_for_init_statement = 582,       /* for_init_statement  */\n  YYSYMBOL_conditionopt = 583,             /* conditionopt  */\n  YYSYMBOL_for_rest_statement = 584,       /* for_rest_statement  */\n  YYSYMBOL_jump_statement = 585,           /* jump_statement  */\n  YYSYMBOL_translation_unit = 586,         /* translation_unit  */\n  YYSYMBOL_external_declaration = 587,     /* external_declaration  */\n  YYSYMBOL_function_definition = 588,      /* function_definition  */\n  YYSYMBOL_589_13 = 589,                   /* $@13  */\n  YYSYMBOL_attribute = 590,                /* attribute  */\n  YYSYMBOL_attribute_list = 591,           /* attribute_list  */\n  YYSYMBOL_single_attribute = 592,         /* single_attribute  */\n  YYSYMBOL_spirv_requirements_list = 593,  /* spirv_requirements_list  */\n  YYSYMBOL_spirv_requirements_parameter = 594, /* spirv_requirements_parameter  */\n  YYSYMBOL_spirv_extension_list = 595,     /* spirv_extension_list  */\n  YYSYMBOL_spirv_capability_list = 596,    /* spirv_capability_list  */\n  YYSYMBOL_spirv_execution_mode_qualifier = 597, /* spirv_execution_mode_qualifier  */\n  YYSYMBOL_spirv_execution_mode_parameter_list = 598, /* spirv_execution_mode_parameter_list  */\n  YYSYMBOL_spirv_execution_mode_parameter = 599, /* spirv_execution_mode_parameter  */\n  YYSYMBOL_spirv_execution_mode_id_parameter_list = 600, /* spirv_execution_mode_id_parameter_list  */\n  YYSYMBOL_spirv_storage_class_qualifier = 601, /* spirv_storage_class_qualifier  */\n  YYSYMBOL_spirv_decorate_qualifier = 602, /* spirv_decorate_qualifier  */\n  YYSYMBOL_spirv_decorate_parameter_list = 603, /* spirv_decorate_parameter_list  */\n  YYSYMBOL_spirv_decorate_parameter = 604, /* spirv_decorate_parameter  */\n  YYSYMBOL_spirv_decorate_id_parameter_list = 605, /* spirv_decorate_id_parameter_list  */\n  YYSYMBOL_spirv_decorate_id_parameter = 606, /* spirv_decorate_id_parameter  */\n  YYSYMBOL_spirv_decorate_string_parameter_list = 607, /* spirv_decorate_string_parameter_list  */\n  YYSYMBOL_spirv_type_specifier = 608,     /* spirv_type_specifier  */\n  YYSYMBOL_spirv_type_parameter_list = 609, /* spirv_type_parameter_list  */\n  YYSYMBOL_spirv_type_parameter = 610,     /* spirv_type_parameter  */\n  YYSYMBOL_spirv_instruction_qualifier = 611, /* spirv_instruction_qualifier  */\n  YYSYMBOL_spirv_instruction_qualifier_list = 612, /* spirv_instruction_qualifier_list  */\n  YYSYMBOL_spirv_instruction_qualifier_id = 613 /* spirv_instruction_qualifier_id  */\n};\ntypedef enum yysymbol_kind_t yysymbol_kind_t;\n\n\n/* Second part of user prologue.  */\n#line 111 \"MachineIndependent/glslang.y\"\n\n\n#define parseContext (*pParseContext)\n#define yyerror(context, msg) context->parserError(msg)\n\nextern int yylex(YYSTYPE*, TParseContext&);\n\n\n#line 753 \"MachineIndependent/glslang_tab.cpp\"\n\n\n#ifdef short\n# undef short\n#endif\n\n/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure\n   <limits.h> and (if available) <stdint.h> are included\n   so that the code can choose integer types of a good width.  */\n\n#ifndef __PTRDIFF_MAX__\n# include <limits.h> /* INFRINGES ON USER NAME SPACE */\n# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__\n#  include <stdint.h> /* INFRINGES ON USER NAME SPACE */\n#  define YY_STDINT_H\n# endif\n#endif\n\n/* Narrow types that promote to a signed type and that can represent a\n   signed or unsigned integer of at least N bits.  In tables they can\n   save space and decrease cache pressure.  Promoting to a signed type\n   helps avoid bugs in integer arithmetic.  */\n\n#ifdef __INT_LEAST8_MAX__\ntypedef __INT_LEAST8_TYPE__ yytype_int8;\n#elif defined YY_STDINT_H\ntypedef int_least8_t yytype_int8;\n#else\ntypedef signed char yytype_int8;\n#endif\n\n#ifdef __INT_LEAST16_MAX__\ntypedef __INT_LEAST16_TYPE__ yytype_int16;\n#elif defined YY_STDINT_H\ntypedef int_least16_t yytype_int16;\n#else\ntypedef short yytype_int16;\n#endif\n\n/* Work around bug in HP-UX 11.23, which defines these macros\n   incorrectly for preprocessor constants.  This workaround can likely\n   be removed in 2023, as HPE has promised support for HP-UX 11.23\n   (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of\n   <https://h20195.www2.hpe.com/V2/getpdf.aspx/4AA4-7673ENW.pdf>.  */\n#ifdef __hpux\n# undef UINT_LEAST8_MAX\n# undef UINT_LEAST16_MAX\n# define UINT_LEAST8_MAX 255\n# define UINT_LEAST16_MAX 65535\n#endif\n\n#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__\ntypedef __UINT_LEAST8_TYPE__ yytype_uint8;\n#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \\\n       && UINT_LEAST8_MAX <= INT_MAX)\ntypedef uint_least8_t yytype_uint8;\n#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX\ntypedef unsigned char yytype_uint8;\n#else\ntypedef short yytype_uint8;\n#endif\n\n#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__\ntypedef __UINT_LEAST16_TYPE__ yytype_uint16;\n#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \\\n       && UINT_LEAST16_MAX <= INT_MAX)\ntypedef uint_least16_t yytype_uint16;\n#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX\ntypedef unsigned short yytype_uint16;\n#else\ntypedef int yytype_uint16;\n#endif\n\n#ifndef YYPTRDIFF_T\n# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__\n#  define YYPTRDIFF_T __PTRDIFF_TYPE__\n#  define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__\n# elif defined PTRDIFF_MAX\n#  ifndef ptrdiff_t\n#   include <stddef.h> /* INFRINGES ON USER NAME SPACE */\n#  endif\n#  define YYPTRDIFF_T ptrdiff_t\n#  define YYPTRDIFF_MAXIMUM PTRDIFF_MAX\n# else\n#  define YYPTRDIFF_T long\n#  define YYPTRDIFF_MAXIMUM LONG_MAX\n# endif\n#endif\n\n#ifndef YYSIZE_T\n# ifdef __SIZE_TYPE__\n#  define YYSIZE_T __SIZE_TYPE__\n# elif defined size_t\n#  define YYSIZE_T size_t\n# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__\n#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */\n#  define YYSIZE_T size_t\n# else\n#  define YYSIZE_T unsigned\n# endif\n#endif\n\n#define YYSIZE_MAXIMUM                                  \\\n  YY_CAST (YYPTRDIFF_T,                                 \\\n           (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1)  \\\n            ? YYPTRDIFF_MAXIMUM                         \\\n            : YY_CAST (YYSIZE_T, -1)))\n\n#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X))\n\n\n/* Stored state numbers (used for stacks). */\ntypedef yytype_int16 yy_state_t;\n\n/* State numbers in computations.  */\ntypedef int yy_state_fast_t;\n\n#ifndef YY_\n# if defined YYENABLE_NLS && YYENABLE_NLS\n#  if ENABLE_NLS\n#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */\n#   define YY_(Msgid) dgettext (\"bison-runtime\", Msgid)\n#  endif\n# endif\n# ifndef YY_\n#  define YY_(Msgid) Msgid\n# endif\n#endif\n\n\n#ifndef YY_ATTRIBUTE_PURE\n# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__)\n#  define YY_ATTRIBUTE_PURE __attribute__ ((__pure__))\n# else\n#  define YY_ATTRIBUTE_PURE\n# endif\n#endif\n\n#ifndef YY_ATTRIBUTE_UNUSED\n# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__)\n#  define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__))\n# else\n#  define YY_ATTRIBUTE_UNUSED\n# endif\n#endif\n\n/* Suppress unused-variable warnings by \"using\" E.  */\n#if ! defined lint || defined __GNUC__\n# define YY_USE(E) ((void) (E))\n#else\n# define YY_USE(E) /* empty */\n#endif\n\n/* Suppress an incorrect diagnostic about yylval being uninitialized.  */\n#if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__\n# if __GNUC__ * 100 + __GNUC_MINOR__ < 407\n#  define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN                           \\\n    _Pragma (\"GCC diagnostic push\")                                     \\\n    _Pragma (\"GCC diagnostic ignored \\\"-Wuninitialized\\\"\")\n# else\n#  define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN                           \\\n    _Pragma (\"GCC diagnostic push\")                                     \\\n    _Pragma (\"GCC diagnostic ignored \\\"-Wuninitialized\\\"\")              \\\n    _Pragma (\"GCC diagnostic ignored \\\"-Wmaybe-uninitialized\\\"\")\n# endif\n# define YY_IGNORE_MAYBE_UNINITIALIZED_END      \\\n    _Pragma (\"GCC diagnostic pop\")\n#else\n# define YY_INITIAL_VALUE(Value) Value\n#endif\n#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN\n# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN\n# define YY_IGNORE_MAYBE_UNINITIALIZED_END\n#endif\n#ifndef YY_INITIAL_VALUE\n# define YY_INITIAL_VALUE(Value) /* Nothing. */\n#endif\n\n#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__\n# define YY_IGNORE_USELESS_CAST_BEGIN                          \\\n    _Pragma (\"GCC diagnostic push\")                            \\\n    _Pragma (\"GCC diagnostic ignored \\\"-Wuseless-cast\\\"\")\n# define YY_IGNORE_USELESS_CAST_END            \\\n    _Pragma (\"GCC diagnostic pop\")\n#endif\n#ifndef YY_IGNORE_USELESS_CAST_BEGIN\n# define YY_IGNORE_USELESS_CAST_BEGIN\n# define YY_IGNORE_USELESS_CAST_END\n#endif\n\n\n#define YY_ASSERT(E) ((void) (0 && (E)))\n\n#if 1\n\n/* The parser invokes alloca or malloc; define the necessary symbols.  */\n\n# ifdef YYSTACK_USE_ALLOCA\n#  if YYSTACK_USE_ALLOCA\n#   ifdef __GNUC__\n#    define YYSTACK_ALLOC __builtin_alloca\n#   elif defined __BUILTIN_VA_ARG_INCR\n#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */\n#   elif defined _AIX\n#    define YYSTACK_ALLOC __alloca\n#   elif defined _MSC_VER\n#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */\n#    define alloca _alloca\n#   else\n#    define YYSTACK_ALLOC alloca\n#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS\n#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */\n      /* Use EXIT_SUCCESS as a witness for stdlib.h.  */\n#     ifndef EXIT_SUCCESS\n#      define EXIT_SUCCESS 0\n#     endif\n#    endif\n#   endif\n#  endif\n# endif\n\n# ifdef YYSTACK_ALLOC\n   /* Pacify GCC's 'empty if-body' warning.  */\n#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)\n#  ifndef YYSTACK_ALLOC_MAXIMUM\n    /* The OS might guarantee only one guard page at the bottom of the stack,\n       and a page size can be as small as 4096 bytes.  So we cannot safely\n       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number\n       to allow for a few compiler-allocated temporary stack slots.  */\n#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */\n#  endif\n# else\n#  define YYSTACK_ALLOC YYMALLOC\n#  define YYSTACK_FREE YYFREE\n#  ifndef YYSTACK_ALLOC_MAXIMUM\n#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM\n#  endif\n#  if (defined __cplusplus && ! defined EXIT_SUCCESS \\\n       && ! ((defined YYMALLOC || defined malloc) \\\n             && (defined YYFREE || defined free)))\n#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */\n#   ifndef EXIT_SUCCESS\n#    define EXIT_SUCCESS 0\n#   endif\n#  endif\n#  ifndef YYMALLOC\n#   define YYMALLOC malloc\n#   if ! defined malloc && ! defined EXIT_SUCCESS\nvoid *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */\n#   endif\n#  endif\n#  ifndef YYFREE\n#   define YYFREE free\n#   if ! defined free && ! defined EXIT_SUCCESS\nvoid free (void *); /* INFRINGES ON USER NAME SPACE */\n#   endif\n#  endif\n# endif\n#endif /* 1 */\n\n#if (! defined yyoverflow \\\n     && (! defined __cplusplus \\\n         || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))\n\n/* A type that is properly aligned for any stack member.  */\nunion yyalloc\n{\n  yy_state_t yyss_alloc;\n  YYSTYPE yyvs_alloc;\n};\n\n/* The size of the maximum gap between one aligned stack and the next.  */\n# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1)\n\n/* The size of an array large to enough to hold all stacks, each with\n   N elements.  */\n# define YYSTACK_BYTES(N) \\\n     ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \\\n      + YYSTACK_GAP_MAXIMUM)\n\n# define YYCOPY_NEEDED 1\n\n/* Relocate STACK from its old location to the new one.  The\n   local variables YYSIZE and YYSTACKSIZE give the old and new number of\n   elements in the stack, and YYPTR gives the new location of the\n   stack.  Advance YYPTR to a properly aligned location for the next\n   stack.  */\n# define YYSTACK_RELOCATE(Stack_alloc, Stack)                           \\\n    do                                                                  \\\n      {                                                                 \\\n        YYPTRDIFF_T yynewbytes;                                         \\\n        YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \\\n        Stack = &yyptr->Stack_alloc;                                    \\\n        yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \\\n        yyptr += yynewbytes / YYSIZEOF (*yyptr);                        \\\n      }                                                                 \\\n    while (0)\n\n#endif\n\n#if defined YYCOPY_NEEDED && YYCOPY_NEEDED\n/* Copy COUNT objects from SRC to DST.  The source and destination do\n   not overlap.  */\n# ifndef YYCOPY\n#  if defined __GNUC__ && 1 < __GNUC__\n#   define YYCOPY(Dst, Src, Count) \\\n      __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src)))\n#  else\n#   define YYCOPY(Dst, Src, Count)              \\\n      do                                        \\\n        {                                       \\\n          YYPTRDIFF_T yyi;                      \\\n          for (yyi = 0; yyi < (Count); yyi++)   \\\n            (Dst)[yyi] = (Src)[yyi];            \\\n        }                                       \\\n      while (0)\n#  endif\n# endif\n#endif /* !YYCOPY_NEEDED */\n\n/* YYFINAL -- State number of the termination state.  */\n#define YYFINAL  469\n/* YYLAST -- Last index in YYTABLE.  */\n#define YYLAST   13182\n\n/* YYNTOKENS -- Number of terminals.  */\n#define YYNTOKENS  482\n/* YYNNTS -- Number of nonterminals.  */\n#define YYNNTS  132\n/* YYNRULES -- Number of rules.  */\n#define YYNRULES  717\n/* YYNSTATES -- Number of states.  */\n#define YYNSTATES  963\n\n/* YYMAXUTOK -- Last valid token kind.  */\n#define YYMAXUTOK   736\n\n\n/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM\n   as returned by yylex, with out-of-bounds checking.  */\n#define YYTRANSLATE(YYX)                                \\\n  (0 <= (YYX) && (YYX) <= YYMAXUTOK                     \\\n   ? YY_CAST (yysymbol_kind_t, yytranslate[YYX])        \\\n   : YYSYMBOL_YYUNDEF)\n\n/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM\n   as returned by yylex.  */\nstatic const yytype_int16 yytranslate[] =\n{\n       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,\n       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,\n      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,\n      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,\n      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,\n      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,\n      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,\n      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,\n      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,\n      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,\n      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,\n     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,\n     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,\n     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,\n     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,\n     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,\n     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,\n     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,\n     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,\n     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,\n     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,\n     205,   206,   207,   208,   209,   210,   211,   212,   213,   214,\n     215,   216,   217,   218,   219,   220,   221,   222,   223,   224,\n     225,   226,   227,   228,   229,   230,   231,   232,   233,   234,\n     235,   236,   237,   238,   239,   240,   241,   242,   243,   244,\n     245,   246,   247,   248,   249,   250,   251,   252,   253,   254,\n     255,   256,   257,   258,   259,   260,   261,   262,   263,   264,\n     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,\n     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,\n     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,\n     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,\n     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,\n     315,   316,   317,   318,   319,   320,   321,   322,   323,   324,\n     325,   326,   327,   328,   329,   330,   331,   332,   333,   334,\n     335,   336,   337,   338,   339,   340,   341,   342,   343,   344,\n     345,   346,   347,   348,   349,   350,   351,   352,   353,   354,\n     355,   356,   357,   358,   359,   360,   361,   362,   363,   364,\n     365,   366,   367,   368,   369,   370,   371,   372,   373,   374,\n     375,   376,   377,   378,   379,   380,   381,   382,   383,   384,\n     385,   386,   387,   388,   389,   390,   391,   392,   393,   394,\n     395,   396,   397,   398,   399,   400,   401,   402,   403,   404,\n     405,   406,   407,   408,   409,   410,   411,   412,   413,   414,\n     415,   416,   417,   418,   419,   420,   421,   422,   423,   424,\n     425,   426,   427,   428,   429,   430,   431,   432,   433,   434,\n     435,   436,   437,   438,   439,   440,   441,   442,   443,   444,\n     445,   446,   447,   448,   449,   450,   451,   452,   453,   454,\n     455,   456,   457,   458,   459,   460,   461,   462,   463,   464,\n     465,   466,   467,   468,   469,   470,   471,   472,   473,   474,\n     475,   476,   477,   478,   479,   480,   481\n};\n\n#if YYDEBUG\n/* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */\nstatic const yytype_int16 yyrline[] =\n{\n       0,   360,   360,   366,   369,   374,   377,   380,   384,   387,\n     390,   394,   398,   402,   406,   410,   414,   420,   427,   430,\n     433,   436,   439,   444,   452,   459,   466,   472,   476,   483,\n     486,   492,   510,   535,   543,   548,   575,   583,   589,   593,\n     597,   617,   618,   619,   620,   626,   627,   632,   637,   646,\n     647,   652,   660,   661,   667,   676,   677,   682,   687,   692,\n     700,   701,   710,   722,   723,   732,   733,   742,   743,   752,\n     753,   761,   762,   770,   771,   779,   780,   780,   798,   799,\n     815,   819,   823,   827,   832,   836,   840,   844,   848,   852,\n     856,   863,   866,   877,   884,   889,   896,   901,   906,   913,\n     917,   921,   925,   930,   935,   944,   944,   955,   959,   966,\n     971,   979,   987,   999,  1002,  1009,  1022,  1045,  1068,  1083,\n    1108,  1119,  1129,  1139,  1149,  1158,  1161,  1165,  1169,  1174,\n    1182,  1187,  1192,  1197,  1202,  1211,  1221,  1248,  1257,  1264,\n    1271,  1278,  1285,  1293,  1301,  1311,  1321,  1328,  1338,  1344,\n    1347,  1354,  1358,  1362,  1370,  1379,  1382,  1393,  1396,  1399,\n    1403,  1407,  1411,  1415,  1418,  1423,  1427,  1432,  1440,  1444,\n    1449,  1455,  1461,  1468,  1473,  1478,  1486,  1491,  1503,  1517,\n    1523,  1528,  1536,  1544,  1552,  1560,  1568,  1576,  1584,  1592,\n    1600,  1607,  1614,  1618,  1623,  1628,  1633,  1638,  1643,  1648,\n    1652,  1656,  1660,  1664,  1668,  1674,  1680,  1690,  1697,  1700,\n    1708,  1715,  1726,  1731,  1739,  1743,  1753,  1756,  1762,  1768,\n    1774,  1782,  1792,  1796,  1800,  1804,  1809,  1813,  1818,  1823,\n    1828,  1833,  1838,  1843,  1848,  1853,  1858,  1864,  1870,  1876,\n    1881,  1886,  1891,  1896,  1901,  1906,  1911,  1916,  1921,  1926,\n    1931,  1936,  1943,  1948,  1953,  1958,  1963,  1968,  1973,  1978,\n    1983,  1988,  1993,  1998,  2003,  2008,  2013,  2021,  2029,  2037,\n    2043,  2049,  2055,  2061,  2067,  2073,  2079,  2085,  2091,  2097,\n    2103,  2109,  2115,  2121,  2127,  2133,  2139,  2145,  2151,  2157,\n    2163,  2169,  2175,  2181,  2187,  2193,  2199,  2205,  2211,  2217,\n    2223,  2229,  2235,  2241,  2247,  2253,  2259,  2265,  2271,  2277,\n    2283,  2289,  2297,  2305,  2313,  2321,  2329,  2337,  2345,  2353,\n    2361,  2369,  2377,  2385,  2391,  2397,  2403,  2409,  2415,  2421,\n    2427,  2433,  2439,  2445,  2451,  2457,  2463,  2469,  2475,  2481,\n    2487,  2493,  2499,  2505,  2511,  2517,  2523,  2529,  2535,  2541,\n    2547,  2553,  2559,  2565,  2571,  2577,  2583,  2589,  2595,  2601,\n    2605,  2609,  2613,  2618,  2623,  2628,  2633,  2638,  2643,  2648,\n    2653,  2658,  2663,  2668,  2673,  2678,  2683,  2689,  2695,  2701,\n    2707,  2713,  2719,  2725,  2731,  2737,  2743,  2749,  2755,  2761,\n    2766,  2771,  2776,  2781,  2786,  2791,  2796,  2801,  2806,  2811,\n    2816,  2821,  2826,  2831,  2836,  2841,  2846,  2851,  2856,  2861,\n    2866,  2871,  2876,  2881,  2886,  2891,  2896,  2901,  2906,  2911,\n    2916,  2921,  2926,  2932,  2938,  2943,  2948,  2953,  2959,  2964,\n    2969,  2974,  2980,  2985,  2990,  2995,  3001,  3006,  3011,  3016,\n    3022,  3028,  3034,  3040,  3045,  3051,  3057,  3063,  3068,  3073,\n    3078,  3083,  3088,  3094,  3099,  3104,  3109,  3115,  3120,  3125,\n    3130,  3136,  3141,  3146,  3151,  3157,  3162,  3167,  3172,  3178,\n    3183,  3188,  3193,  3199,  3204,  3209,  3214,  3220,  3225,  3230,\n    3235,  3241,  3246,  3251,  3256,  3262,  3267,  3272,  3277,  3283,\n    3288,  3293,  3298,  3304,  3309,  3314,  3319,  3325,  3330,  3335,\n    3340,  3346,  3351,  3356,  3361,  3367,  3372,  3377,  3382,  3388,\n    3393,  3398,  3403,  3408,  3413,  3418,  3423,  3428,  3433,  3438,\n    3443,  3448,  3453,  3458,  3463,  3468,  3473,  3478,  3483,  3488,\n    3493,  3498,  3503,  3508,  3514,  3520,  3526,  3532,  3538,  3544,\n    3550,  3557,  3564,  3570,  3576,  3582,  3588,  3595,  3602,  3609,\n    3616,  3621,  3626,  3630,  3636,  3640,  3644,  3649,  3665,  3670,\n    3675,  3683,  3683,  3700,  3700,  3710,  3713,  3726,  3748,  3775,\n    3779,  3785,  3790,  3801,  3804,  3810,  3816,  3825,  3828,  3834,\n    3838,  3839,  3845,  3846,  3847,  3848,  3849,  3850,  3851,  3852,\n    3856,  3864,  3865,  3869,  3865,  3883,  3884,  3888,  3888,  3895,\n    3895,  3909,  3912,  3922,  3930,  3941,  3942,  3946,  3949,  3956,\n    3963,  3967,  3975,  3979,  3992,  3995,  4002,  4002,  4022,  4025,\n    4031,  4043,  4055,  4058,  4066,  4066,  4081,  4081,  4099,  4099,\n    4120,  4123,  4129,  4132,  4138,  4142,  4149,  4154,  4159,  4166,\n    4169,  4173,  4177,  4181,  4190,  4194,  4203,  4206,  4209,  4217,\n    4217,  4259,  4264,  4267,  4272,  4275,  4280,  4283,  4288,  4291,\n    4296,  4299,  4304,  4307,  4312,  4316,  4321,  4325,  4330,  4334,\n    4341,  4344,  4349,  4352,  4355,  4358,  4361,  4366,  4375,  4386,\n    4391,  4399,  4403,  4408,  4412,  4417,  4421,  4426,  4430,  4437,\n    4440,  4445,  4448,  4451,  4454,  4459,  4462,  4467,  4473,  4476,\n    4479,  4482,  4487,  4491,  4496,  4500,  4505,  4509,  4516,  4519,\n    4524,  4527,  4532,  4535,  4541,  4544,  4549,  4552\n};\n#endif\n\n/** Accessing symbol of state STATE.  */\n#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State])\n\n#if 1\n/* The user-facing name of the symbol whose (internal) number is\n   YYSYMBOL.  No bounds checking.  */\nstatic const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;\n\n/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.\n   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */\nstatic const char *const yytname[] =\n{\n  \"\\\"end of file\\\"\", \"error\", \"\\\"invalid token\\\"\", \"CONST\", \"BOOL\", \"INT\",\n  \"UINT\", \"FLOAT\", \"BVEC2\", \"BVEC3\", \"BVEC4\", \"IVEC2\", \"IVEC3\", \"IVEC4\",\n  \"UVEC2\", \"UVEC3\", \"UVEC4\", \"VEC2\", \"VEC3\", \"VEC4\", \"MAT2\", \"MAT3\",\n  \"MAT4\", \"MAT2X2\", \"MAT2X3\", \"MAT2X4\", \"MAT3X2\", \"MAT3X3\", \"MAT3X4\",\n  \"MAT4X2\", \"MAT4X3\", \"MAT4X4\", \"SAMPLER2D\", \"SAMPLER3D\", \"SAMPLERCUBE\",\n  \"SAMPLER2DSHADOW\", \"SAMPLERCUBESHADOW\", \"SAMPLER2DARRAY\",\n  \"SAMPLER2DARRAYSHADOW\", \"ISAMPLER2D\", \"ISAMPLER3D\", \"ISAMPLERCUBE\",\n  \"ISAMPLER2DARRAY\", \"USAMPLER2D\", \"USAMPLER3D\", \"USAMPLERCUBE\",\n  \"USAMPLER2DARRAY\", \"SAMPLER\", \"SAMPLERSHADOW\", \"TEXTURE2D\", \"TEXTURE3D\",\n  \"TEXTURECUBE\", \"TEXTURE2DARRAY\", \"ITEXTURE2D\", \"ITEXTURE3D\",\n  \"ITEXTURECUBE\", \"ITEXTURE2DARRAY\", \"UTEXTURE2D\", \"UTEXTURE3D\",\n  \"UTEXTURECUBE\", \"UTEXTURE2DARRAY\", \"ATTRIBUTE\", \"VARYING\", \"FLOATE5M2_T\",\n  \"FLOATE4M3_T\", \"BFLOAT16_T\", \"FLOAT16_T\", \"FLOAT32_T\", \"DOUBLE\",\n  \"FLOAT64_T\", \"INT64_T\", \"UINT64_T\", \"INT32_T\", \"UINT32_T\", \"INT16_T\",\n  \"UINT16_T\", \"INT8_T\", \"UINT8_T\", \"I64VEC2\", \"I64VEC3\", \"I64VEC4\",\n  \"U64VEC2\", \"U64VEC3\", \"U64VEC4\", \"I32VEC2\", \"I32VEC3\", \"I32VEC4\",\n  \"U32VEC2\", \"U32VEC3\", \"U32VEC4\", \"I16VEC2\", \"I16VEC3\", \"I16VEC4\",\n  \"U16VEC2\", \"U16VEC3\", \"U16VEC4\", \"I8VEC2\", \"I8VEC3\", \"I8VEC4\", \"U8VEC2\",\n  \"U8VEC3\", \"U8VEC4\", \"DVEC2\", \"DVEC3\", \"DVEC4\", \"DMAT2\", \"DMAT3\", \"DMAT4\",\n  \"BF16VEC2\", \"BF16VEC3\", \"BF16VEC4\", \"FE5M2VEC2\", \"FE5M2VEC3\",\n  \"FE5M2VEC4\", \"FE4M3VEC2\", \"FE4M3VEC3\", \"FE4M3VEC4\", \"F16VEC2\", \"F16VEC3\",\n  \"F16VEC4\", \"F16MAT2\", \"F16MAT3\", \"F16MAT4\", \"F32VEC2\", \"F32VEC3\",\n  \"F32VEC4\", \"F32MAT2\", \"F32MAT3\", \"F32MAT4\", \"F64VEC2\", \"F64VEC3\",\n  \"F64VEC4\", \"F64MAT2\", \"F64MAT3\", \"F64MAT4\", \"DMAT2X2\", \"DMAT2X3\",\n  \"DMAT2X4\", \"DMAT3X2\", \"DMAT3X3\", \"DMAT3X4\", \"DMAT4X2\", \"DMAT4X3\",\n  \"DMAT4X4\", \"F16MAT2X2\", \"F16MAT2X3\", \"F16MAT2X4\", \"F16MAT3X2\",\n  \"F16MAT3X3\", \"F16MAT3X4\", \"F16MAT4X2\", \"F16MAT4X3\", \"F16MAT4X4\",\n  \"F32MAT2X2\", \"F32MAT2X3\", \"F32MAT2X4\", \"F32MAT3X2\", \"F32MAT3X3\",\n  \"F32MAT3X4\", \"F32MAT4X2\", \"F32MAT4X3\", \"F32MAT4X4\", \"F64MAT2X2\",\n  \"F64MAT2X3\", \"F64MAT2X4\", \"F64MAT3X2\", \"F64MAT3X3\", \"F64MAT3X4\",\n  \"F64MAT4X2\", \"F64MAT4X3\", \"F64MAT4X4\", \"ATOMIC_UINT\", \"ACCSTRUCTNV\",\n  \"ACCSTRUCTEXT\", \"RAYQUERYEXT\", \"FCOOPMATNV\", \"ICOOPMATNV\", \"UCOOPMATNV\",\n  \"COOPMAT\", \"COOPVECNV\", \"HITOBJECTNV\", \"HITOBJECTATTRNV\",\n  \"TENSORLAYOUTNV\", \"TENSORVIEWNV\", \"SAMPLERCUBEARRAY\",\n  \"SAMPLERCUBEARRAYSHADOW\", \"ISAMPLERCUBEARRAY\", \"USAMPLERCUBEARRAY\",\n  \"SAMPLER1D\", \"SAMPLER1DARRAY\", \"SAMPLER1DARRAYSHADOW\", \"ISAMPLER1D\",\n  \"SAMPLER1DSHADOW\", \"SAMPLER2DRECT\", \"SAMPLER2DRECTSHADOW\",\n  \"ISAMPLER2DRECT\", \"USAMPLER2DRECT\", \"SAMPLERBUFFER\", \"ISAMPLERBUFFER\",\n  \"USAMPLERBUFFER\", \"SAMPLER2DMS\", \"ISAMPLER2DMS\", \"USAMPLER2DMS\",\n  \"SAMPLER2DMSARRAY\", \"ISAMPLER2DMSARRAY\", \"USAMPLER2DMSARRAY\",\n  \"SAMPLEREXTERNALOES\", \"SAMPLEREXTERNAL2DY2YEXT\", \"ISAMPLER1DARRAY\",\n  \"USAMPLER1D\", \"USAMPLER1DARRAY\", \"F16SAMPLER1D\", \"F16SAMPLER2D\",\n  \"F16SAMPLER3D\", \"F16SAMPLER2DRECT\", \"F16SAMPLERCUBE\",\n  \"F16SAMPLER1DARRAY\", \"F16SAMPLER2DARRAY\", \"F16SAMPLERCUBEARRAY\",\n  \"F16SAMPLERBUFFER\", \"F16SAMPLER2DMS\", \"F16SAMPLER2DMSARRAY\",\n  \"F16SAMPLER1DSHADOW\", \"F16SAMPLER2DSHADOW\", \"F16SAMPLER1DARRAYSHADOW\",\n  \"F16SAMPLER2DARRAYSHADOW\", \"F16SAMPLER2DRECTSHADOW\",\n  \"F16SAMPLERCUBESHADOW\", \"F16SAMPLERCUBEARRAYSHADOW\", \"IMAGE1D\",\n  \"IIMAGE1D\", \"UIMAGE1D\", \"IMAGE2D\", \"IIMAGE2D\", \"UIMAGE2D\", \"IMAGE3D\",\n  \"IIMAGE3D\", \"UIMAGE3D\", \"IMAGE2DRECT\", \"IIMAGE2DRECT\", \"UIMAGE2DRECT\",\n  \"IMAGECUBE\", \"IIMAGECUBE\", \"UIMAGECUBE\", \"IMAGEBUFFER\", \"IIMAGEBUFFER\",\n  \"UIMAGEBUFFER\", \"IMAGE1DARRAY\", \"IIMAGE1DARRAY\", \"UIMAGE1DARRAY\",\n  \"IMAGE2DARRAY\", \"IIMAGE2DARRAY\", \"UIMAGE2DARRAY\", \"IMAGECUBEARRAY\",\n  \"IIMAGECUBEARRAY\", \"UIMAGECUBEARRAY\", \"IMAGE2DMS\", \"IIMAGE2DMS\",\n  \"UIMAGE2DMS\", \"IMAGE2DMSARRAY\", \"IIMAGE2DMSARRAY\", \"UIMAGE2DMSARRAY\",\n  \"F16IMAGE1D\", \"F16IMAGE2D\", \"F16IMAGE3D\", \"F16IMAGE2DRECT\",\n  \"F16IMAGECUBE\", \"F16IMAGE1DARRAY\", \"F16IMAGE2DARRAY\",\n  \"F16IMAGECUBEARRAY\", \"F16IMAGEBUFFER\", \"F16IMAGE2DMS\",\n  \"F16IMAGE2DMSARRAY\", \"I64IMAGE1D\", \"U64IMAGE1D\", \"I64IMAGE2D\",\n  \"U64IMAGE2D\", \"I64IMAGE3D\", \"U64IMAGE3D\", \"I64IMAGE2DRECT\",\n  \"U64IMAGE2DRECT\", \"I64IMAGECUBE\", \"U64IMAGECUBE\", \"I64IMAGEBUFFER\",\n  \"U64IMAGEBUFFER\", \"I64IMAGE1DARRAY\", \"U64IMAGE1DARRAY\",\n  \"I64IMAGE2DARRAY\", \"U64IMAGE2DARRAY\", \"I64IMAGECUBEARRAY\",\n  \"U64IMAGECUBEARRAY\", \"I64IMAGE2DMS\", \"U64IMAGE2DMS\", \"I64IMAGE2DMSARRAY\",\n  \"U64IMAGE2DMSARRAY\", \"TEXTURECUBEARRAY\", \"ITEXTURECUBEARRAY\",\n  \"UTEXTURECUBEARRAY\", \"TEXTURE1D\", \"ITEXTURE1D\", \"UTEXTURE1D\",\n  \"TEXTURE1DARRAY\", \"ITEXTURE1DARRAY\", \"UTEXTURE1DARRAY\", \"TEXTURE2DRECT\",\n  \"ITEXTURE2DRECT\", \"UTEXTURE2DRECT\", \"TEXTUREBUFFER\", \"ITEXTUREBUFFER\",\n  \"UTEXTUREBUFFER\", \"TEXTURE2DMS\", \"ITEXTURE2DMS\", \"UTEXTURE2DMS\",\n  \"TEXTURE2DMSARRAY\", \"ITEXTURE2DMSARRAY\", \"UTEXTURE2DMSARRAY\",\n  \"F16TEXTURE1D\", \"F16TEXTURE2D\", \"F16TEXTURE3D\", \"F16TEXTURE2DRECT\",\n  \"F16TEXTURECUBE\", \"F16TEXTURE1DARRAY\", \"F16TEXTURE2DARRAY\",\n  \"F16TEXTURECUBEARRAY\", \"F16TEXTUREBUFFER\", \"F16TEXTURE2DMS\",\n  \"F16TEXTURE2DMSARRAY\", \"SUBPASSINPUT\", \"SUBPASSINPUTMS\", \"ISUBPASSINPUT\",\n  \"ISUBPASSINPUTMS\", \"USUBPASSINPUT\", \"USUBPASSINPUTMS\", \"F16SUBPASSINPUT\",\n  \"F16SUBPASSINPUTMS\", \"SPIRV_INSTRUCTION\", \"SPIRV_EXECUTION_MODE\",\n  \"SPIRV_EXECUTION_MODE_ID\", \"SPIRV_DECORATE\", \"SPIRV_DECORATE_ID\",\n  \"SPIRV_DECORATE_STRING\", \"SPIRV_TYPE\", \"SPIRV_STORAGE_CLASS\",\n  \"SPIRV_BY_REFERENCE\", \"SPIRV_LITERAL\", \"ATTACHMENTEXT\", \"IATTACHMENTEXT\",\n  \"UATTACHMENTEXT\", \"LEFT_OP\", \"RIGHT_OP\", \"INC_OP\", \"DEC_OP\", \"LE_OP\",\n  \"GE_OP\", \"EQ_OP\", \"NE_OP\", \"AND_OP\", \"OR_OP\", \"XOR_OP\", \"MUL_ASSIGN\",\n  \"DIV_ASSIGN\", \"ADD_ASSIGN\", \"MOD_ASSIGN\", \"LEFT_ASSIGN\", \"RIGHT_ASSIGN\",\n  \"AND_ASSIGN\", \"XOR_ASSIGN\", \"OR_ASSIGN\", \"SUB_ASSIGN\", \"STRING_LITERAL\",\n  \"LEFT_PAREN\", \"RIGHT_PAREN\", \"LEFT_BRACKET\", \"RIGHT_BRACKET\",\n  \"LEFT_BRACE\", \"RIGHT_BRACE\", \"DOT\", \"COMMA\", \"COLON\", \"EQUAL\",\n  \"SEMICOLON\", \"BANG\", \"DASH\", \"TILDE\", \"PLUS\", \"STAR\", \"SLASH\", \"PERCENT\",\n  \"LEFT_ANGLE\", \"RIGHT_ANGLE\", \"VERTICAL_BAR\", \"CARET\", \"AMPERSAND\",\n  \"QUESTION\", \"INVARIANT\", \"HIGH_PRECISION\", \"MEDIUM_PRECISION\",\n  \"LOW_PRECISION\", \"PRECISION\", \"PACKED\", \"RESOURCE\", \"SUPERP\",\n  \"FLOATCONSTANT\", \"INTCONSTANT\", \"UINTCONSTANT\", \"BOOLCONSTANT\",\n  \"IDENTIFIER\", \"TYPE_NAME\", \"CENTROID\", \"IN\", \"OUT\", \"INOUT\", \"STRUCT\",\n  \"VOID\", \"WHILE\", \"BREAK\", \"CONTINUE\", \"DO\", \"ELSE\", \"FOR\", \"IF\",\n  \"DISCARD\", \"RETURN\", \"SWITCH\", \"CASE\", \"DEFAULT\", \"TERMINATE_INVOCATION\",\n  \"TERMINATE_RAY\", \"IGNORE_INTERSECTION\", \"UNIFORM\", \"SHARED\", \"BUFFER\",\n  \"TILEIMAGEEXT\", \"FLAT\", \"SMOOTH\", \"LAYOUT\", \"DOUBLECONSTANT\",\n  \"INT16CONSTANT\", \"UINT16CONSTANT\", \"FLOAT16CONSTANT\", \"INT32CONSTANT\",\n  \"UINT32CONSTANT\", \"INT64CONSTANT\", \"UINT64CONSTANT\", \"SUBROUTINE\",\n  \"DEMOTE\", \"FUNCTION\", \"PAYLOADNV\", \"PAYLOADINNV\", \"HITATTRNV\",\n  \"CALLDATANV\", \"CALLDATAINNV\", \"PAYLOADEXT\", \"PAYLOADINEXT\", \"HITATTREXT\",\n  \"CALLDATAEXT\", \"CALLDATAINEXT\", \"PATCH\", \"SAMPLE\", \"NONUNIFORM\",\n  \"COHERENT\", \"VOLATILE\", \"RESTRICT\", \"READONLY\", \"WRITEONLY\",\n  \"NONTEMPORAL\", \"DEVICECOHERENT\", \"QUEUEFAMILYCOHERENT\",\n  \"WORKGROUPCOHERENT\", \"SUBGROUPCOHERENT\", \"NONPRIVATE\",\n  \"SHADERCALLCOHERENT\", \"NOPERSPECTIVE\", \"EXPLICITINTERPAMD\",\n  \"PERVERTEXEXT\", \"PERVERTEXNV\", \"PERPRIMITIVENV\", \"PERVIEWNV\",\n  \"PERTASKNV\", \"PERPRIMITIVEEXT\", \"TASKPAYLOADWORKGROUPEXT\", \"PRECISE\",\n  \"$accept\", \"variable_identifier\", \"primary_expression\",\n  \"postfix_expression\", \"integer_expression\", \"function_call\",\n  \"function_call_or_method\", \"function_call_generic\",\n  \"function_call_header_no_parameters\",\n  \"function_call_header_with_parameters\", \"function_call_header\",\n  \"function_identifier\", \"unary_expression\", \"unary_operator\",\n  \"multiplicative_expression\", \"additive_expression\", \"shift_expression\",\n  \"relational_expression\", \"equality_expression\", \"and_expression\",\n  \"exclusive_or_expression\", \"inclusive_or_expression\",\n  \"logical_and_expression\", \"logical_xor_expression\",\n  \"logical_or_expression\", \"conditional_expression\", \"$@1\",\n  \"assignment_expression\", \"assignment_operator\", \"expression\",\n  \"constant_expression\", \"declaration\", \"block_structure\", \"$@2\",\n  \"identifier_list\", \"function_prototype\", \"function_declarator\",\n  \"function_header_with_parameters\", \"function_header\",\n  \"parameter_declarator\", \"parameter_declaration\",\n  \"parameter_type_specifier\", \"init_declarator_list\", \"single_declaration\",\n  \"fully_specified_type\", \"invariant_qualifier\", \"interpolation_qualifier\",\n  \"layout_qualifier\", \"layout_qualifier_id_list\", \"layout_qualifier_id\",\n  \"precise_qualifier\", \"type_qualifier\", \"single_type_qualifier\",\n  \"storage_qualifier\", \"non_uniform_qualifier\", \"type_name_list\",\n  \"type_specifier\", \"array_specifier\", \"type_parameter_specifier_opt\",\n  \"type_parameter_specifier\", \"type_parameter_specifier_list\",\n  \"type_specifier_nonarray\", \"precision_qualifier\", \"struct_specifier\",\n  \"$@3\", \"$@4\", \"struct_declaration_list\", \"struct_declaration\",\n  \"struct_declarator_list\", \"struct_declarator\", \"initializer\",\n  \"initializer_list\", \"declaration_statement\", \"statement\",\n  \"simple_statement\", \"demote_statement\", \"compound_statement\", \"$@5\",\n  \"$@6\", \"statement_no_new_scope\", \"statement_scoped\", \"$@7\", \"$@8\",\n  \"compound_statement_no_new_scope\", \"statement_list\",\n  \"expression_statement\", \"selection_statement\",\n  \"selection_statement_nonattributed\", \"selection_rest_statement\",\n  \"condition\", \"switch_statement\", \"switch_statement_nonattributed\", \"$@9\",\n  \"switch_statement_list\", \"case_label\", \"iteration_statement\",\n  \"iteration_statement_nonattributed\", \"$@10\", \"$@11\", \"$@12\",\n  \"for_init_statement\", \"conditionopt\", \"for_rest_statement\",\n  \"jump_statement\", \"translation_unit\", \"external_declaration\",\n  \"function_definition\", \"$@13\", \"attribute\", \"attribute_list\",\n  \"single_attribute\", \"spirv_requirements_list\",\n  \"spirv_requirements_parameter\", \"spirv_extension_list\",\n  \"spirv_capability_list\", \"spirv_execution_mode_qualifier\",\n  \"spirv_execution_mode_parameter_list\", \"spirv_execution_mode_parameter\",\n  \"spirv_execution_mode_id_parameter_list\",\n  \"spirv_storage_class_qualifier\", \"spirv_decorate_qualifier\",\n  \"spirv_decorate_parameter_list\", \"spirv_decorate_parameter\",\n  \"spirv_decorate_id_parameter_list\", \"spirv_decorate_id_parameter\",\n  \"spirv_decorate_string_parameter_list\", \"spirv_type_specifier\",\n  \"spirv_type_parameter_list\", \"spirv_type_parameter\",\n  \"spirv_instruction_qualifier\", \"spirv_instruction_qualifier_list\",\n  \"spirv_instruction_qualifier_id\", YY_NULLPTR\n};\n\nstatic const char *\nyysymbol_name (yysymbol_kind_t yysymbol)\n{\n  return yytname[yysymbol];\n}\n#endif\n\n#define YYPACT_NINF (-894)\n\n#define yypact_value_is_default(Yyn) \\\n  ((Yyn) == YYPACT_NINF)\n\n#define YYTABLE_NINF (-712)\n\n#define yytable_value_is_error(Yyn) \\\n  0\n\n/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing\n   STATE-NUM.  */\nstatic const yytype_int16 yypact[] =\n{\n    4801,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -279,  -215,  -187,  -167,  -155,  -120,  -116,\n     -95,  -894,  -894,  -894,  -894,  -894,  -330,  -894,  -894,  -894,\n    -894,  -894,   -68,  -894,  -894,  -894,  -894,  -894,  -336,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,   -91,   -85,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -327,  -179,  -319,  -227,  8154,\n    -235,  -894,  -178,  -894,  -894,  -894,  -894,  5759,  -894,  -894,\n    -894,  -894,   -97,  -894,  -894,   969,  -894,  -894,  8154,   -63,\n    -894,  -894,  -894,  6238,   -82,  -174,  -164,  -163,  -142,  -141,\n     -82,  -140,   -67, 12736,  -894,   -30,  -373,   -57,  -894,  -286,\n    -894,   -24,   -18,  8154,  -894,  -894,  -894,  8154,   -51,   -49,\n    -894,  -269,  -894,  -250,  -894,  -894, 11368,   -16,  -894,  -894,\n    -894,   -13,   -47,  8154,  -894,   -20,   -17,   -14,  -894,  -334,\n    -894,  -245,   -15,   -12,   -11,   -10,  -243,    -9,    -8,    -7,\n      -6,    -5,    -4,  -240,     3,    -2,     7,  -244,  -894,   -19,\n    8154,  -894,    -1,  -894,  -233,  -894,  -894,  -231,  9544,  -894,\n    -267,  1448,  -894,  -894,  -894,  -894,  -894,   -16,  -321,  -894,\n   10000,  -265,  -894,   -27,  -894,  -110, 11368, 11368,  -894, 11368,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -296,\n    -894,  -894,  -894,     9,  -230, 11824,    11,  -894, 11368,  -894,\n      14,  -329,    13,   -18,    16,  -894,  -322,   -82,  -894,    -3,\n    -894,  -341,    15,  -135, 11368,  -134,  -894,  -156,  -130,  -181,\n    -129,    19,  -113,   -82,  -894, 12280,  -894,  -111, 11368,    17,\n     -67,  -894,  8154,     1,  6717,  -894,  8154, 11368,  -894,  -373,\n    -894,     4,  -894,  -894,   -50,  -220,  -237,  -317,  -121,     8,\n      10,    21,    33,    34,  -325,    20,  -894, 10456,  -894,    23,\n    -894,  -894,    24,    22,    25,  -894,    26,    29,    32, 10912,\n      36, 11368,    35,    39,    40,    42,    44,  -170,  -894,  -894,\n     -61,  -894,  -179,    45,    14,  -894,  -894,  -894,  -894,  -894,\n    1927,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    5280,    13, 10000,  -264,  8632,  -894,  -894, 10000,  8154,  -894,\n      28,  -894,  -894,  -894,  -228,  -894,  -894, 11368,    30,  -894,\n    -894, 11368,    43,  -894,  -894,  -894, 11368,  -894,  -894,  -894,\n    -338,  -894,  -894,  -217,    37,  -894,  -894,  -894,  -894,  -894,\n    -894,  -214,  -894,  -212,  -894,  -894,  -205,    49,  -894,  -894,\n    -894,  -894,  -204,  -894,  -202,  -894,  -894,  -894,  -894,  -894,\n    -197,  -894,    62,  -894,  -195,    64,  -193,    37,  -894,  -288,\n    -192,  -894,    71,    73,  -894,  -894,     1,   -16,   -59,  -894,\n    -894,  -894,  7196,  -894,  -894,  -894, 11368, 11368, 11368, 11368,\n   11368, 11368, 11368, 11368, 11368, 11368, 11368, 11368, 11368, 11368,\n   11368, 11368, 11368, 11368, 11368,  -894,  -894,  -894,    74,  -894,\n    2406,  -894,  -894,  -894,  2406,  -894, 11368,  -894,  -894,   -55,\n   11368,  -133,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894, 11368, 11368,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894, 10000,  -894,  -894,\n     -37,  -894,  7675,  -894,  -894,    75,    69,  -894,  -894,  -894,\n    -894,  -894,  -147,  -146,  -894,  -328,  -894,  -341,  -894,  -341,\n    -894, 11368, 11368,  -894,  -156,  -894,  -156,  -894,  -181,  -181,\n    -894,    80,    19,  -894, 12280,  -894, 11368,  -894,  -894,   -54,\n      13,     1,  -894,  -894,  -894,  -894,  -894,   -50,   -50,  -220,\n    -220,  -237,  -237,  -237,  -237,  -317,  -317,  -121,     8,    10,\n      21,    33,    34, 11368,  -894,  2406,  4322,    38,  3843,  -190,\n    -894,  -172,  -894,  -894,  -894,  -894,  -894,  9088,  -894,  -894,\n    -894,    81,  -894,    52,  -894,  -171,  -894,  -169,  -894,  -161,\n    -894,  -160,  -894,  -159,  -158,  -894,  -894,  -894,   -45,    83,\n      69,    50,    88,    90,  -894,  -894,  4322,    87,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894, 11368,\n    -894,    84,  2885, 11368,  -894,    82,    93,    53,    96,  3364,\n    -894,    98,  -894, 10000,  -894,  -894,  -894,  -157, 11368,  2885,\n      87,  -894,  -894,  2406,  -894,    94,    69,  -894,  -894,  2406,\n      92,  -894,  -894\n};\n\n/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.\n   Performed when YYTABLE does not specify something else to do.  Zero\n   means the default is an error.  */\nstatic const yytype_int16 yydefact[] =\n{\n       0,   168,   226,   224,   225,   223,   230,   231,   232,   233,\n     234,   235,   236,   237,   238,   227,   228,   229,   239,   240,\n     241,   242,   243,   244,   245,   246,   247,   248,   249,   250,\n     364,   365,   366,   367,   368,   369,   370,   390,   391,   392,\n     393,   394,   395,   396,   405,   418,   419,   406,   407,   409,\n     408,   410,   411,   412,   413,   414,   415,   416,   417,   177,\n     178,   253,   254,   252,   255,   256,   251,   257,   264,   265,\n     262,   263,   260,   261,   258,   259,   296,   297,   298,   308,\n     309,   310,   293,   294,   295,   305,   306,   307,   290,   291,\n     292,   302,   303,   304,   287,   288,   289,   299,   300,   301,\n     266,   267,   268,   311,   312,   313,   269,   270,   271,   272,\n     273,   274,   275,   276,   277,   278,   279,   280,   323,   324,\n     325,   281,   282,   283,   335,   336,   337,   284,   285,   286,\n     347,   348,   349,   314,   315,   316,   317,   318,   319,   320,\n     321,   322,   326,   327,   328,   329,   330,   331,   332,   333,\n     334,   338,   339,   340,   341,   342,   343,   344,   345,   346,\n     350,   351,   352,   353,   354,   355,   356,   357,   358,   362,\n     359,   360,   361,   546,   547,   548,   549,   553,   555,   182,\n     550,   551,   374,   375,   398,   401,   363,   372,   373,   389,\n     371,   420,   421,   424,   425,   426,   428,   429,   430,   432,\n     433,   434,   436,   437,   533,   534,   397,   399,   400,   376,\n     377,   378,   422,   379,   383,   384,   387,   427,   431,   435,\n     380,   381,   385,   386,   423,   382,   388,   467,   469,   470,\n     471,   473,   474,   475,   477,   478,   479,   481,   482,   483,\n     485,   486,   487,   489,   490,   491,   493,   494,   495,   497,\n     498,   499,   501,   502,   503,   505,   506,   507,   509,   510,\n     468,   472,   476,   480,   484,   492,   496,   500,   488,   504,\n     508,   511,   512,   513,   514,   515,   516,   517,   518,   519,\n     520,   521,   522,   523,   524,   525,   526,   527,   528,   529,\n     530,   531,   532,   402,   403,   404,   438,   447,   449,   443,\n     448,   450,   451,   453,   454,   455,   457,   458,   459,   461,\n     462,   463,   465,   466,   439,   440,   441,   452,   442,   444,\n     445,   446,   456,   460,   464,   538,   539,   542,   543,   544,\n     545,   540,   541,     0,     0,     0,     0,     0,     0,     0,\n       0,   166,   167,   535,   536,   537,     0,   648,   137,   558,\n     559,   560,     0,   557,   172,   170,   171,   169,     0,   222,\n     173,   175,   176,   174,   139,   138,     0,   204,   552,   184,\n     186,   181,   188,   190,   185,   187,   183,   189,   191,   179,\n     180,   207,   192,   199,   200,   201,   202,   203,   193,   194,\n     195,   196,   197,   198,   140,   141,   143,   142,   144,   146,\n     147,   145,   206,   154,   647,     0,   649,     0,   114,   113,\n       0,   125,   130,   161,   160,   158,   162,     0,   155,   157,\n     163,   135,   217,   159,   556,     0,   644,   646,     0,     0,\n     164,   165,   554,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,   563,     0,     0,     0,    99,     0,\n      94,     0,   109,     0,   121,   115,   123,     0,   124,     0,\n      97,   131,   102,     0,   156,   136,     0,   210,   216,     1,\n     645,     0,     0,     0,    96,     0,     0,     0,   656,     0,\n     714,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,   654,     0,   652,     0,\n       0,   561,   151,   153,     0,   149,   208,     0,     0,   100,\n       0,     0,   650,   110,   116,   120,   122,   118,   126,   117,\n       0,   132,   105,     0,   103,     0,     0,     0,     9,     0,\n      43,    42,    44,    41,     5,     6,     7,     8,     2,    16,\n      14,    15,    17,    10,    11,    12,    13,     3,    18,    37,\n      20,    25,    26,     0,     0,    30,     0,   220,     0,    36,\n     219,     0,   211,   111,     0,    95,     0,     0,   712,     0,\n     664,     0,     0,     0,     0,     0,   681,     0,     0,     0,\n       0,     0,     0,     0,   706,     0,   679,     0,     0,     0,\n       0,    98,     0,     0,     0,   565,     0,     0,   148,     0,\n     205,     0,   212,    45,    49,    52,    55,    60,    63,    65,\n      67,    69,    71,    73,    75,     0,    34,     0,   101,   592,\n     601,   605,     0,     0,     0,   626,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,    45,    78,    91,\n       0,   579,     0,   163,   135,   582,   603,   581,   589,   580,\n       0,   583,   584,   607,   585,   614,   586,   587,   622,   588,\n       0,   119,     0,   127,     0,   573,   134,     0,     0,   107,\n       0,   104,    38,    39,     0,    22,    23,     0,     0,    28,\n      27,     0,   222,    31,    33,    40,     0,   218,   112,   716,\n       0,   717,   657,     0,     0,   715,   676,   672,   673,   674,\n     675,     0,   670,     0,    93,   677,     0,     0,   691,   692,\n     693,   694,     0,   689,     0,   698,   699,   700,   701,   697,\n       0,   695,     0,   702,     0,     0,     0,     2,   710,   217,\n       0,   708,     0,     0,   651,   653,     0,   571,     0,   569,\n     564,   566,     0,   152,   150,   209,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,    76,   213,   214,     0,   591,\n       0,   624,   637,   636,     0,   628,     0,   640,   638,     0,\n       0,     0,   621,   641,   642,   643,   590,    81,    82,    84,\n      83,    86,    87,    88,    89,    90,    85,    80,     0,     0,\n     606,   602,   604,   608,   615,   623,   129,     0,   576,   577,\n       0,   133,     0,   108,     4,     0,    24,    21,    32,   221,\n     660,   662,     0,     0,   713,     0,   666,     0,   665,     0,\n     668,     0,     0,   683,     0,   682,     0,   685,     0,     0,\n     687,     0,     0,   707,     0,   704,     0,   680,   655,     0,\n     572,     0,   567,   562,    46,    47,    48,    51,    50,    53,\n      54,    58,    59,    56,    57,    61,    62,    64,    66,    68,\n      70,    72,    74,     0,   215,   593,     0,     0,     0,     0,\n     639,     0,   620,    79,    92,   128,   574,     0,   106,    19,\n     658,     0,   659,     0,   671,     0,   678,     0,   690,     0,\n     696,     0,   703,     0,     0,   709,   568,   570,     0,     0,\n     612,     0,     0,     0,   631,   630,   633,   599,   616,   575,\n     578,   661,   663,   667,   669,   684,   686,   688,   705,     0,\n     594,     0,     0,     0,   632,     0,     0,   611,     0,     0,\n     609,     0,    77,     0,   596,   625,   595,     0,   634,     0,\n     599,   598,   600,   618,   613,     0,   635,   629,   610,   619,\n       0,   627,   617\n};\n\n/* YYPGOTO[NTERM-NUM].  */\nstatic const yytype_int16 yypgoto[] =\n{\n    -894,  -557,  -894,  -894,  -894,  -894,  -894,  -894,  -894,  -894,\n    -894,  -894,  -449,  -894,  -403,  -410,  -497,  -405,  -284,  -283,\n    -285,  -282,  -281,  -280,  -894,  -501,  -894,  -511,  -894,  -525,\n    -548,     6,  -894,  -894,  -894,     5,  -407,  -894,  -894,    31,\n      41,    46,  -894,  -894,  -425,  -894,  -894,  -894,  -894,  -118,\n    -894,  -408,  -388,  -894,    12,  -894,     0,  -451,  -894,  -894,\n    -894,  -566,   126,  -894,  -894,  -894,  -569,  -571,  -257,  -368,\n    -649,  -894,  -392,  -639,  -893,  -894,  -448,  -894,  -894,  -462,\n    -461,  -894,  -894,    47,  -746,  -386,  -894,  -165,  -894,  -423,\n    -894,  -154,  -894,  -894,  -894,  -894,  -153,  -894,  -894,  -894,\n    -894,  -894,  -894,  -894,  -894,    72,  -894,  -894,     2,  -894,\n     -94,  -318,  -485,  -894,  -894,  -894,  -324,  -326,  -333,  -894,\n    -894,  -332,  -320,  -337,  -323,  -316,  -894,  -335,  -315,  -894,\n    -406,  -555\n};\n\n/* YYDEFGOTO[NTERM-NUM].  */\nstatic const yytype_int16 yydefgoto[] =\n{\n       0,   547,   548,   549,   815,   550,   551,   552,   553,   554,\n     555,   556,   637,   558,   604,   605,   606,   607,   608,   609,\n     610,   611,   612,   613,   614,   638,   873,   639,   798,   640,\n     728,   641,   405,   668,   525,   642,   407,   408,   409,   454,\n     455,   456,   410,   411,   412,   413,   414,   415,   504,   505,\n     416,   417,   418,   419,   559,   507,   616,   510,   467,   468,\n     561,   422,   423,   424,   596,   500,   594,   595,   738,   739,\n     666,   810,   645,   646,   647,   648,   649,   770,   909,   945,\n     937,   938,   939,   946,   650,   651,   652,   653,   940,   912,\n     654,   655,   941,   960,   656,   657,   658,   876,   774,   878,\n     916,   935,   936,   659,   425,   426,   427,   451,   660,   497,\n     498,   477,   478,   822,   823,   429,   701,   702,   706,   430,\n     431,   712,   713,   720,   721,   724,   432,   730,   731,   433,\n     479,   480\n};\n\n/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If\n   positive, shift that token.  If negative, reduce the rule whose\n   number is the opposite.  If YYTABLE_NINF, syntax error.  */\nstatic const yytype_int16 yytable[] =\n{\n     421,   457,   428,   472,   674,   406,   404,   615,   472,   665,\n     521,   802,   420,   806,   695,   809,   562,   557,   811,   729,\n     473,   471,   719,   741,   875,   473,   705,   742,   696,   464,\n     695,   820,   764,   502,   493,   753,   754,   568,   444,   944,\n     733,   689,   442,   569,   683,   457,   952,   689,   686,   743,\n     690,   508,   452,   448,   675,   676,   944,   503,   662,   603,\n     687,   697,   698,   699,   700,   821,   661,   663,   765,   464,\n     445,   755,   756,   704,   -35,   691,   677,   672,   673,   449,\n     678,   691,   692,  -711,   704,   464,   508,   704,   692,  -711,\n     692,   434,   592,   692,   509,   692,   704,   692,   692,   812,\n     466,   519,   692,   508,   779,   617,   781,   617,   617,   685,\n     520,   751,   752,   618,   667,   807,   768,   483,   485,   487,\n     489,   491,   492,   495,   522,   603,   570,   523,   576,   589,\n     524,   584,   571,   590,   577,   877,   603,   585,   598,   603,\n     600,   680,   459,   814,   599,   460,   601,   681,   603,   799,\n     453,   665,   816,   665,   824,   435,   665,   826,   885,   828,\n     569,   693,   749,   827,   750,   829,   830,   833,   603,   835,\n     818,   741,   831,   834,   837,   836,   840,   726,   843,   845,\n     838,   917,   841,   436,   844,   846,   592,   799,   592,   787,\n     788,   789,   790,   791,   792,   793,   794,   795,   796,   918,\n     923,   450,   924,   437,   464,   799,   827,   959,   831,   797,\n     925,   926,   927,   928,   955,   438,   834,   838,   841,   846,\n     799,   715,   716,   717,   718,   538,   890,   892,   461,   481,\n     891,   893,   482,   757,   758,   472,   802,   819,   920,   484,\n     486,   741,   482,   482,   799,   882,   708,   709,   710,   711,\n     439,   879,   473,   471,   440,   881,   861,   862,   863,   864,\n     592,   488,   490,   494,   482,   482,   482,   670,   703,   707,\n     671,   482,   482,   714,   722,   441,   482,   482,   729,   446,\n     729,   719,   719,   896,   705,   447,   850,   883,   884,   695,\n     725,   466,   732,   482,   954,   482,   665,   854,   855,   856,\n     603,   603,   603,   603,   603,   603,   603,   603,   603,   603,\n     603,   603,   603,   603,   603,   603,   799,   474,   851,   800,\n     802,   852,   799,   851,   476,   880,   906,   349,   350,   351,\n     704,   704,   799,   929,   592,   746,   747,   748,   886,   496,\n     887,   859,   860,   704,   501,   704,   857,   858,   908,   506,\n     511,   910,   865,   866,   346,   517,   508,   518,   563,   564,\n     565,   591,   566,   567,   572,   573,   574,   575,   578,   579,\n     580,   581,   582,   583,   586,   587,   665,   588,   597,   669,\n     679,   684,   603,   603,   -34,   617,   519,   690,   723,   762,\n     734,   910,   763,   766,   771,   603,   775,   603,   769,   776,\n     759,   760,   772,   694,   592,   773,   780,   737,   947,   458,\n     745,   761,   777,   782,   -29,   -36,   825,   465,   942,   783,\n     784,   420,   785,   956,   786,   421,   832,   428,   421,   420,\n     406,   404,   665,   421,   813,   428,   817,   420,   475,   839,\n     420,   842,   847,   499,   848,   420,   799,   874,   889,   902,\n     921,   911,   913,   458,   513,   922,   931,   458,   930,   932,\n     933,  -597,   948,   943,   949,   420,   560,   962,   473,   420,\n     619,   950,   953,   465,   961,   867,   869,   868,   443,   849,\n     870,   744,   871,   907,   872,   420,   914,   957,   515,   958,\n     951,   911,   915,   934,   514,   803,   735,   470,   512,   897,\n     593,   894,   901,   516,   899,   895,   804,   805,   473,   904,\n       0,   644,   420,     0,   898,   900,     0,     0,     0,     0,\n       0,     0,     0,   643,     0,     0,   903,     0,     0,     0,\n       0,   905,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,   688,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,   736,     0,   593,     0,   593,     0,     0,     0,\n       0,     0,     0,     0,   420,     0,   420,     0,   420,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n     644,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n     421,     0,   643,     0,     0,     0,     0,     0,   593,     0,\n       0,     0,   420,     0,     0,     0,     0,     0,     0,     0,\n     420,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,   593,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,   420,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n     644,     0,     0,     0,   644,     0,     0,     0,     0,     0,\n       0,     0,   643,     0,     0,     0,   643,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,   593,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,   420,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,   644,   644,     0,   644,     0,\n     428,     0,     0,     0,     0,     0,     0,   643,   643,     0,\n     643,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,   644,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,   643,     0,\n       0,     0,   644,     0,     0,     0,     0,     0,     0,   644,\n       0,     0,     0,     0,   643,     0,     0,     0,     0,   644,\n       0,   643,     0,   644,     0,     0,     0,     0,     0,   644,\n       0,   643,     0,     0,     0,   643,     0,     0,     0,   469,\n       0,   643,     1,     2,     3,     4,     5,     6,     7,     8,\n       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,\n      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,\n      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,\n      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,\n      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,\n      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,\n      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,\n      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,\n      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,\n      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,\n     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,\n     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,\n     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,\n     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,\n     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,\n     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,\n     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,\n     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,\n     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,\n     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,\n     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,\n     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,\n     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,\n     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,\n     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,\n     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,\n     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,\n     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,\n     289,   290,   291,   292,   293,   294,   295,   296,   297,   298,\n     299,   300,   301,   302,   303,   304,   305,   306,   307,   308,\n     309,   310,   311,   312,   313,   314,   315,   316,   317,   318,\n     319,   320,   321,   322,   323,   324,   325,   326,   327,   328,\n     329,   330,   331,   332,   333,   334,   335,   336,   337,   338,\n     339,   340,   341,   342,   343,   344,   345,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,   346,     0,     0,     0,     0,     0,     0,     0,   347,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,   348,   349,   350,   351,   352,     0,     0,\n       0,     0,     0,     0,     0,     0,   353,   354,   355,   356,\n     357,   358,   359,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,   360,   361,\n     362,   363,   364,   365,   366,     0,     0,     0,     0,     0,\n       0,     0,     0,   367,     0,   368,   369,   370,   371,   372,\n     373,   374,   375,   376,   377,   378,   379,   380,   381,   382,\n     383,   384,   385,   386,   387,   388,   389,   390,   391,   392,\n     393,   394,   395,   396,   397,   398,   399,   400,   401,   402,\n     403,     1,     2,     3,     4,     5,     6,     7,     8,     9,\n      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,\n      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,\n      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,\n      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,\n      50,    51,    52,    53,    54,    55,    56,    57,    58,    59,\n      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,\n      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,\n      80,    81,    82,    83,    84,    85,    86,    87,    88,    89,\n      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,\n     100,   101,   102,   103,   104,   105,   106,   107,   108,   109,\n     110,   111,   112,   113,   114,   115,   116,   117,   118,   119,\n     120,   121,   122,   123,   124,   125,   126,   127,   128,   129,\n     130,   131,   132,   133,   134,   135,   136,   137,   138,   139,\n     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,\n     150,   151,   152,   153,   154,   155,   156,   157,   158,   159,\n     160,   161,   162,   163,   164,   165,   166,   167,   168,   169,\n     170,   171,   172,   173,   174,   175,   176,   177,   178,   179,\n     180,   181,   182,   183,   184,   185,   186,   187,   188,   189,\n     190,   191,   192,   193,   194,   195,   196,   197,   198,   199,\n     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,\n     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,\n     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,\n     230,   231,   232,   233,   234,   235,   236,   237,   238,   239,\n     240,   241,   242,   243,   244,   245,   246,   247,   248,   249,\n     250,   251,   252,   253,   254,   255,   256,   257,   258,   259,\n     260,   261,   262,   263,   264,   265,   266,   267,   268,   269,\n     270,   271,   272,   273,   274,   275,   276,   277,   278,   279,\n     280,   281,   282,   283,   284,   285,   286,   287,   288,   289,\n     290,   291,   292,   293,   294,   295,   296,   297,   298,   299,\n     300,   301,   302,   303,   304,   305,   306,   307,   308,   309,\n     310,   311,   312,   313,   314,   315,   316,   317,   318,   319,\n     320,   321,   322,   323,   324,   325,   326,   327,   328,   329,\n     330,   331,   332,   333,   334,   335,   336,   337,   338,   339,\n     340,   341,   342,   343,   344,   345,     0,     0,   526,   527,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,   528,   529,     0,\n     346,     0,   619,   620,     0,     0,     0,     0,   621,   530,\n     531,   532,   533,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,   348,   349,   350,   351,   352,     0,     0,     0,\n     534,   535,   536,   537,   538,   353,   354,   355,   356,   357,\n     358,   359,   622,   623,   624,   625,     0,   626,   627,   628,\n     629,   630,   631,   632,   633,   634,   635,   360,   361,   362,\n     363,   364,   365,   366,   539,   540,   541,   542,   543,   544,\n     545,   546,   367,   636,   368,   369,   370,   371,   372,   373,\n     374,   375,   376,   377,   378,   379,   380,   381,   382,   383,\n     384,   385,   386,   387,   388,   389,   390,   391,   392,   393,\n     394,   395,   396,   397,   398,   399,   400,   401,   402,   403,\n       1,     2,     3,     4,     5,     6,     7,     8,     9,    10,\n      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,\n      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,\n      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,\n      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,\n      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,\n      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,\n      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,\n      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,\n      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,\n     101,   102,   103,   104,   105,   106,   107,   108,   109,   110,\n     111,   112,   113,   114,   115,   116,   117,   118,   119,   120,\n     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,\n     131,   132,   133,   134,   135,   136,   137,   138,   139,   140,\n     141,   142,   143,   144,   145,   146,   147,   148,   149,   150,\n     151,   152,   153,   154,   155,   156,   157,   158,   159,   160,\n     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,\n     171,   172,   173,   174,   175,   176,   177,   178,   179,   180,\n     181,   182,   183,   184,   185,   186,   187,   188,   189,   190,\n     191,   192,   193,   194,   195,   196,   197,   198,   199,   200,\n     201,   202,   203,   204,   205,   206,   207,   208,   209,   210,\n     211,   212,   213,   214,   215,   216,   217,   218,   219,   220,\n     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,\n     231,   232,   233,   234,   235,   236,   237,   238,   239,   240,\n     241,   242,   243,   244,   245,   246,   247,   248,   249,   250,\n     251,   252,   253,   254,   255,   256,   257,   258,   259,   260,\n     261,   262,   263,   264,   265,   266,   267,   268,   269,   270,\n     271,   272,   273,   274,   275,   276,   277,   278,   279,   280,\n     281,   282,   283,   284,   285,   286,   287,   288,   289,   290,\n     291,   292,   293,   294,   295,   296,   297,   298,   299,   300,\n     301,   302,   303,   304,   305,   306,   307,   308,   309,   310,\n     311,   312,   313,   314,   315,   316,   317,   318,   319,   320,\n     321,   322,   323,   324,   325,   326,   327,   328,   329,   330,\n     331,   332,   333,   334,   335,   336,   337,   338,   339,   340,\n     341,   342,   343,   344,   345,     0,     0,   526,   527,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,   528,   529,     0,   346,\n       0,   619,   801,     0,     0,     0,     0,   621,   530,   531,\n     532,   533,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,   348,   349,   350,   351,   352,     0,     0,     0,   534,\n     535,   536,   537,   538,   353,   354,   355,   356,   357,   358,\n     359,   622,   623,   624,   625,     0,   626,   627,   628,   629,\n     630,   631,   632,   633,   634,   635,   360,   361,   362,   363,\n     364,   365,   366,   539,   540,   541,   542,   543,   544,   545,\n     546,   367,   636,   368,   369,   370,   371,   372,   373,   374,\n     375,   376,   377,   378,   379,   380,   381,   382,   383,   384,\n     385,   386,   387,   388,   389,   390,   391,   392,   393,   394,\n     395,   396,   397,   398,   399,   400,   401,   402,   403,     1,\n       2,     3,     4,     5,     6,     7,     8,     9,    10,    11,\n      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,\n      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,\n      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,\n      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,\n      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,\n      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,\n      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,\n      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,\n      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,\n     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,\n     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,\n     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,\n     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,\n     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,\n     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,\n     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,\n     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,\n     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,\n     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,\n     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,\n     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,\n     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,\n     232,   233,   234,   235,   236,   237,   238,   239,   240,   241,\n     242,   243,   244,   245,   246,   247,   248,   249,   250,   251,\n     252,   253,   254,   255,   256,   257,   258,   259,   260,   261,\n     262,   263,   264,   265,   266,   267,   268,   269,   270,   271,\n     272,   273,   274,   275,   276,   277,   278,   279,   280,   281,\n     282,   283,   284,   285,   286,   287,   288,   289,   290,   291,\n     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,\n     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,\n     312,   313,   314,   315,   316,   317,   318,   319,   320,   321,\n     322,   323,   324,   325,   326,   327,   328,   329,   330,   331,\n     332,   333,   334,   335,   336,   337,   338,   339,   340,   341,\n     342,   343,   344,   345,     0,     0,   526,   527,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,   528,   529,     0,   346,     0,\n     619,     0,     0,     0,     0,     0,   621,   530,   531,   532,\n     533,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n     348,   349,   350,   351,   352,     0,     0,     0,   534,   535,\n     536,   537,   538,   353,   354,   355,   356,   357,   358,   359,\n     622,   623,   624,   625,     0,   626,   627,   628,   629,   630,\n     631,   632,   633,   634,   635,   360,   361,   362,   363,   364,\n     365,   366,   539,   540,   541,   542,   543,   544,   545,   546,\n     367,   636,   368,   369,   370,   371,   372,   373,   374,   375,\n     376,   377,   378,   379,   380,   381,   382,   383,   384,   385,\n     386,   387,   388,   389,   390,   391,   392,   393,   394,   395,\n     396,   397,   398,   399,   400,   401,   402,   403,     1,     2,\n       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,\n      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,\n      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,\n      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,\n      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,\n      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,\n      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,\n      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,\n      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,\n      93,    94,    95,    96,    97,    98,    99,   100,   101,   102,\n     103,   104,   105,   106,   107,   108,   109,   110,   111,   112,\n     113,   114,   115,   116,   117,   118,   119,   120,   121,   122,\n     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,\n     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,\n     143,   144,   145,   146,   147,   148,   149,   150,   151,   152,\n     153,   154,   155,   156,   157,   158,   159,   160,   161,   162,\n     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,\n     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,\n     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,\n     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,\n     203,   204,   205,   206,   207,   208,   209,   210,   211,   212,\n     213,   214,   215,   216,   217,   218,   219,   220,   221,   222,\n     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,\n     233,   234,   235,   236,   237,   238,   239,   240,   241,   242,\n     243,   244,   245,   246,   247,   248,   249,   250,   251,   252,\n     253,   254,   255,   256,   257,   258,   259,   260,   261,   262,\n     263,   264,   265,   266,   267,   268,   269,   270,   271,   272,\n     273,   274,   275,   276,   277,   278,   279,   280,   281,   282,\n     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,\n     293,   294,   295,   296,   297,   298,   299,   300,   301,   302,\n     303,   304,   305,   306,   307,   308,   309,   310,   311,   312,\n     313,   314,   315,   316,   317,   318,   319,   320,   321,   322,\n     323,   324,   325,   326,   327,   328,   329,   330,   331,   332,\n     333,   334,   335,   336,   337,   338,   339,   340,   341,   342,\n     343,   344,   345,     0,     0,   526,   527,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,   528,   529,     0,   346,     0,   511,\n       0,     0,     0,     0,     0,   621,   530,   531,   532,   533,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,   348,\n     349,   350,   351,   352,     0,     0,     0,   534,   535,   536,\n     537,   538,   353,   354,   355,   356,   357,   358,   359,   622,\n     623,   624,   625,     0,   626,   627,   628,   629,   630,   631,\n     632,   633,   634,   635,   360,   361,   362,   363,   364,   365,\n     366,   539,   540,   541,   542,   543,   544,   545,   546,   367,\n     636,   368,   369,   370,   371,   372,   373,   374,   375,   376,\n     377,   378,   379,   380,   381,   382,   383,   384,   385,   386,\n     387,   388,   389,   390,   391,   392,   393,   394,   395,   396,\n     397,   398,   399,   400,   401,   402,   403,     1,     2,     3,\n       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,\n      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,\n      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,\n      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,\n      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,\n      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,\n      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,\n      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,\n      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,\n      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,\n     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,\n     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,\n     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,\n     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,\n     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,\n     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,\n     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,\n     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,\n     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,\n     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,\n     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,\n     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,\n     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,\n     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,\n     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,\n     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,\n     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,\n     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,\n     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,\n     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,\n     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,\n     314,   315,   316,   317,   318,   319,   320,   321,   322,   323,\n     324,   325,   326,   327,   328,   329,   330,   331,   332,   333,\n     334,   335,   336,   337,   338,   339,   340,   341,   342,   343,\n     344,   345,     0,     0,   526,   527,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,   528,   529,     0,   346,     0,     0,     0,\n       0,     0,     0,     0,   621,   530,   531,   532,   533,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,   348,   349,\n     350,   351,   352,     0,     0,     0,   534,   535,   536,   537,\n     538,   353,   354,   355,   356,   357,   358,   359,   622,   623,\n     624,   625,     0,   626,   627,   628,   629,   630,   631,   632,\n     633,   634,   635,   360,   361,   362,   363,   364,   365,   366,\n     539,   540,   541,   542,   543,   544,   545,   546,   367,   636,\n     368,   369,   370,   371,   372,   373,   374,   375,   376,   377,\n     378,   379,   380,   381,   382,   383,   384,   385,   386,   387,\n     388,   389,   390,   391,   392,   393,   394,   395,   396,   397,\n     398,   399,   400,   401,   402,   403,     1,     2,     3,     4,\n       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,\n      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,\n      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,\n      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,\n      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,\n      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,\n      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,\n      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,\n      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,\n      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,\n     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,\n     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,\n     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,\n     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,\n     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,\n     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,\n     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,\n     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,\n     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,\n     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,\n     205,   206,   207,   208,   209,   210,   211,   212,   213,   214,\n     215,   216,   217,   218,   219,   220,   221,   222,   223,   224,\n     225,   226,   227,   228,   229,   230,   231,   232,   233,   234,\n     235,   236,   237,   238,   239,   240,   241,   242,   243,   244,\n     245,   246,   247,   248,   249,   250,   251,   252,   253,   254,\n     255,   256,   257,   258,   259,   260,   261,   262,   263,   264,\n     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,\n     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,\n     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,\n     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,\n     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,\n     315,   316,   317,   318,   319,   320,   321,   322,   323,   324,\n     325,   326,   327,   328,   329,   330,   331,   332,   333,   334,\n     335,   336,   337,   338,   339,   340,   341,   342,   343,   344,\n     345,     0,     0,   526,   527,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,   528,   529,     0,   346,     0,     0,     0,     0,\n       0,     0,     0,   621,   530,   531,   532,   533,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,   348,   349,   350,\n     351,   352,     0,     0,     0,   534,   535,   536,   537,   538,\n     353,   354,   355,   356,   357,   358,   359,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,   360,   361,   362,   363,   364,   365,   366,   539,\n     540,   541,   542,   543,   544,   545,   546,   367,     0,   368,\n     369,   370,   371,   372,   373,   374,   375,   376,   377,   378,\n     379,   380,   381,   382,   383,   384,   385,   386,   387,   388,\n     389,   390,   391,   392,   393,   394,   395,   396,   397,   398,\n     399,   400,   401,   402,   403,     1,     2,     3,     4,     5,\n       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,\n      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,\n      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,\n      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,\n      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,\n      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,\n      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,\n      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,\n      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,\n      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,\n     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,\n     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,\n     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,\n     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,\n     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,\n     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,\n     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,\n     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,\n     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,\n     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,\n     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,\n     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,\n     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,\n     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,\n     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,\n     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,\n     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,\n     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,\n     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,\n     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,\n     306,   307,   308,   309,   310,   311,   312,   313,   314,   315,\n     316,   317,   318,   319,   320,   321,   322,   323,   324,   325,\n     326,   327,   328,   329,   330,   331,   332,     0,     0,     0,\n     336,   337,   338,   339,   340,   341,   342,   343,   344,   345,\n       0,     0,   526,   527,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,   528,   529,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,   530,   531,   532,   533,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,   348,   349,   350,   351,\n       0,     0,     0,     0,   534,   535,   536,   537,   538,   353,\n     354,   355,   356,   357,   358,   359,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,   360,   361,   362,   363,   364,   365,   366,   539,   540,\n     541,   542,   543,   544,   545,   546,   367,     0,   368,   369,\n     370,   371,   372,   373,   374,   375,   376,   377,   378,   379,\n     380,   381,   382,   383,   384,   385,   386,   387,   388,   389,\n     390,   391,   392,   393,   394,   395,   396,   397,   398,   399,\n     400,   401,   402,   403,     1,     2,     3,     4,     5,     6,\n       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,\n      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,\n      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,\n      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,\n      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,\n      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,\n      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,\n      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,\n      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,\n      97,    98,    99,   100,   101,   102,   103,   104,   105,   106,\n     107,   108,   109,   110,   111,   112,   113,   114,   115,   116,\n     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,\n     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,\n     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,\n     147,   148,   149,   150,   151,   152,   153,   154,   155,   156,\n     157,   158,   159,   160,   161,   162,   163,   164,   165,   166,\n     167,   168,   169,   170,   171,   172,   173,   174,   175,   176,\n     177,   178,   179,   180,   181,   182,   183,   184,   185,   186,\n     187,   188,   189,   190,   191,   192,   193,   194,   195,   196,\n     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,\n     207,   208,   209,   210,   211,   212,   213,   214,   215,   216,\n     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,\n     227,   228,   229,   230,   231,   232,   233,   234,   235,   236,\n     237,   238,   239,   240,   241,   242,   243,   244,   245,   246,\n     247,   248,   249,   250,   251,   252,   253,   254,   255,   256,\n     257,   258,   259,   260,   261,   262,   263,   264,   265,   266,\n     267,   268,   269,   270,   271,   272,   273,   274,   275,   276,\n     277,   278,   279,   280,   281,   282,   283,   284,   285,   286,\n     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,\n     297,   298,   299,   300,   301,   302,   303,   304,   305,   306,\n     307,   308,   309,   310,   311,   312,   313,   314,   315,   316,\n     317,   318,   319,   320,   321,   322,   323,   324,   325,   326,\n     327,   328,   329,   330,   331,   332,   333,   334,   335,   336,\n     337,   338,   339,   340,   341,   342,   343,   344,   345,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,   346,     0,     0,     0,     0,     0,     0,\n       0,   347,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,   348,   349,   350,   351,   352,\n       0,     0,     0,     0,     0,     0,     0,     0,   353,   354,\n     355,   356,   357,   358,   359,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n     360,   361,   362,   363,   364,   365,   366,     0,     0,     0,\n       0,     0,     0,     0,     0,   367,     0,   368,   369,   370,\n     371,   372,   373,   374,   375,   376,   377,   378,   379,   380,\n     381,   382,   383,   384,   385,   386,   387,   388,   389,   390,\n     391,   392,   393,   394,   395,   396,   397,   398,   399,   400,\n     401,   402,   403,     1,     2,     3,     4,     5,     6,     7,\n       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,\n      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,\n      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,\n      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,\n      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,\n      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,\n      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,\n      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,\n      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,\n      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,\n     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,\n     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,\n     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,\n     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,\n     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,\n     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,\n     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,\n     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,\n     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,\n     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,\n     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,\n     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,\n     228,   229,   230,   231,   232,   233,   234,   235,   236,   237,\n     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,\n     248,   249,   250,   251,   252,   253,   254,   255,   256,   257,\n     258,   259,   260,   261,   262,   263,   264,   265,   266,   267,\n     268,   269,   270,   271,   272,   273,   274,   275,   276,   277,\n     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,\n     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,\n     298,   299,   300,   301,   302,   303,   304,   305,   306,   307,\n     308,   309,   310,   311,   312,   313,   314,   315,   316,   317,\n     318,   319,   320,   321,   322,   323,   324,   325,   326,   327,\n     328,   329,   330,   331,   332,     0,     0,     0,   336,   337,\n     338,   339,   340,   341,   342,   343,   344,   345,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,   348,   349,   350,   351,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,   353,   354,   355,\n     356,   357,   358,   359,   622,     0,     0,   625,     0,   626,\n     627,     0,     0,   630,     0,     0,     0,     0,     0,   360,\n     361,   362,   363,   364,   365,   366,     0,     0,     0,     0,\n       0,     0,     0,     0,   367,     0,   368,   369,   370,   371,\n     372,   373,   374,   375,   376,   377,   378,   379,   380,   381,\n     382,   383,   384,   385,   386,   387,   388,   389,   390,   391,\n     392,   393,   394,   395,   396,   397,   398,   399,   400,   401,\n     402,   403,     1,     2,     3,     4,     5,     6,     7,     8,\n       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,\n      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,\n      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,\n      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,\n      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,\n      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,\n      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,\n      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,\n      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,\n      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,\n     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,\n     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,\n     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,\n     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,\n     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,\n     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,\n     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,\n     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,\n     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,\n     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,\n     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,\n     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,\n     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,\n     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,\n     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,\n     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,\n     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,\n     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,\n     289,   290,   291,   292,   293,   294,   295,   296,   297,   298,\n     299,   300,   301,   302,   303,   304,   305,   306,   307,   308,\n     309,   310,   311,   312,   313,   314,   315,   316,   317,   318,\n     319,   320,   321,   322,   323,   324,   325,   326,   327,   328,\n     329,   330,   331,   332,     0,     0,     0,   336,   337,   338,\n     339,   340,   341,   342,   343,   344,   345,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,   462,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,   348,   349,   350,   351,     0,     0,     0,\n       0,     0,     0,     0,     0,   463,   353,   354,   355,   356,\n     357,   358,   359,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,   360,   361,\n     362,   363,   364,   365,   366,     0,     0,     0,     0,     0,\n       0,     0,     0,   367,     0,   368,   369,   370,   371,   372,\n     373,   374,   375,   376,   377,   378,   379,   380,   381,   382,\n     383,   384,   385,   386,   387,   388,   389,   390,   391,   392,\n     393,   394,   395,   396,   397,   398,   399,   400,   401,   402,\n     403,     1,     2,     3,     4,     5,     6,     7,     8,     9,\n      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,\n      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,\n      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,\n      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,\n      50,    51,    52,    53,    54,    55,    56,    57,    58,    59,\n      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,\n      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,\n      80,    81,    82,    83,    84,    85,    86,    87,    88,    89,\n      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,\n     100,   101,   102,   103,   104,   105,   106,   107,   108,   109,\n     110,   111,   112,   113,   114,   115,   116,   117,   118,   119,\n     120,   121,   122,   123,   124,   125,   126,   127,   128,   129,\n     130,   131,   132,   133,   134,   135,   136,   137,   138,   139,\n     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,\n     150,   151,   152,   153,   154,   155,   156,   157,   158,   159,\n     160,   161,   162,   163,   164,   165,   166,   167,   168,   169,\n     170,   171,   172,   173,   174,   175,   176,   177,   178,   179,\n     180,   181,   182,   183,   184,   185,   186,   187,   188,   189,\n     190,   191,   192,   193,   194,   195,   196,   197,   198,   199,\n     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,\n     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,\n     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,\n     230,   231,   232,   233,   234,   235,   236,   237,   238,   239,\n     240,   241,   242,   243,   244,   245,   246,   247,   248,   249,\n     250,   251,   252,   253,   254,   255,   256,   257,   258,   259,\n     260,   261,   262,   263,   264,   265,   266,   267,   268,   269,\n     270,   271,   272,   273,   274,   275,   276,   277,   278,   279,\n     280,   281,   282,   283,   284,   285,   286,   287,   288,   289,\n     290,   291,   292,   293,   294,   295,   296,   297,   298,   299,\n     300,   301,   302,   303,   304,   305,   306,   307,   308,   309,\n     310,   311,   312,   313,   314,   315,   316,   317,   318,   319,\n     320,   321,   322,   323,   324,   325,   326,   327,   328,   329,\n     330,   331,   332,     0,     0,     0,   336,   337,   338,   339,\n     340,   341,   342,   343,   344,   345,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n     346,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,   348,   349,   350,   351,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,   353,   354,   355,   356,   357,\n     358,   359,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,   360,   361,   362,\n     363,   364,   365,   366,     0,     0,     0,     0,     0,     0,\n       0,     0,   367,     0,   368,   369,   370,   371,   372,   373,\n     374,   375,   376,   377,   378,   379,   380,   381,   382,   383,\n     384,   385,   386,   387,   388,   389,   390,   391,   392,   393,\n     394,   395,   396,   397,   398,   399,   400,   401,   402,   403,\n       1,     2,     3,     4,     5,     6,     7,     8,     9,    10,\n      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,\n      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,\n      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,\n      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,\n      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,\n      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,\n      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,\n      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,\n      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,\n     101,   102,   103,   104,   105,   106,   107,   108,   109,   110,\n     111,   112,   113,   114,   115,   116,   117,   118,   119,   120,\n     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,\n     131,   132,   133,   134,   135,   136,   137,   138,   139,   140,\n     141,   142,   143,   144,   145,   146,   147,   148,   149,   150,\n     151,   152,   153,   154,   155,   156,   157,   158,   159,   160,\n     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,\n     171,   172,   173,   174,   175,   176,   177,   178,   179,   180,\n     181,   182,   183,   184,   185,   186,   187,   188,   189,   190,\n     191,   192,   193,   194,   195,   196,   197,   198,   199,   200,\n     201,   202,   203,   204,   205,   206,   207,   208,   209,   210,\n     211,   212,   213,   214,   215,   216,   217,   218,   219,   220,\n     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,\n     231,   232,   233,   234,   235,   236,   237,   238,   239,   240,\n     241,   242,   243,   244,   245,   246,   247,   248,   249,   250,\n     251,   252,   253,   254,   255,   256,   257,   258,   259,   260,\n     261,   262,   263,   264,   265,   266,   267,   268,   269,   270,\n     271,   272,   273,   274,   275,   276,   277,   278,   279,   280,\n     281,   282,   283,   284,   285,   286,   287,   288,   289,   290,\n     291,   292,   293,   294,   295,   296,   297,   298,   299,   300,\n     301,   302,   303,   304,   305,   306,   307,   308,   309,   310,\n     311,   312,   313,   314,   315,   316,   317,   318,   319,   320,\n     321,   322,   323,   324,   325,   326,   327,   328,   329,   330,\n     331,   332,     0,     0,     0,   336,   337,   338,   339,   340,\n     341,   342,   343,   344,   345,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,   740,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,   348,   349,   350,   351,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,   353,   354,   355,   356,   357,   358,\n     359,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,   360,   361,   362,   363,\n     364,   365,   366,     0,     0,     0,     0,     0,     0,     0,\n       0,   367,     0,   368,   369,   370,   371,   372,   373,   374,\n     375,   376,   377,   378,   379,   380,   381,   382,   383,   384,\n     385,   386,   387,   388,   389,   390,   391,   392,   393,   394,\n     395,   396,   397,   398,   399,   400,   401,   402,   403,     1,\n       2,     3,     4,     5,     6,     7,     8,     9,    10,    11,\n      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,\n      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,\n      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,\n      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,\n      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,\n      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,\n      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,\n      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,\n      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,\n     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,\n     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,\n     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,\n     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,\n     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,\n     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,\n     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,\n     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,\n     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,\n     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,\n     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,\n     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,\n     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,\n     232,   233,   234,   235,   236,   237,   238,   239,   240,   241,\n     242,   243,   244,   245,   246,   247,   248,   249,   250,   251,\n     252,   253,   254,   255,   256,   257,   258,   259,   260,   261,\n     262,   263,   264,   265,   266,   267,   268,   269,   270,   271,\n     272,   273,   274,   275,   276,   277,   278,   279,   280,   281,\n     282,   283,   284,   285,   286,   287,   288,   289,   290,   291,\n     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,\n     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,\n     312,   313,   314,   315,   316,   317,   318,   319,   320,   321,\n     322,   323,   324,   325,   326,   327,   328,   329,   330,   331,\n     332,     0,     0,     0,   336,   337,   338,   339,   340,   341,\n     342,   343,   344,   345,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,   853,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n     348,   349,   350,   351,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,   353,   354,   355,   356,   357,   358,   359,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,   360,   361,   362,   363,   364,\n     365,   366,     0,     0,     0,     0,     0,     0,     0,     0,\n     367,     0,   368,   369,   370,   371,   372,   373,   374,   375,\n     376,   377,   378,   379,   380,   381,   382,   383,   384,   385,\n     386,   387,   388,   389,   390,   391,   392,   393,   394,   395,\n     396,   397,   398,   399,   400,   401,   402,   403,     1,     2,\n       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,\n      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,\n      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,\n      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,\n      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,\n      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,\n      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,\n      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,\n      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,\n      93,    94,    95,    96,    97,    98,    99,   100,   101,   102,\n     103,   104,   105,   106,   107,   108,   109,   110,   111,   112,\n     113,   114,   115,   116,   117,   118,   119,   120,   121,   122,\n     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,\n     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,\n     143,   144,   145,   146,   147,   148,   149,   150,   151,   152,\n     153,   154,   155,   156,   157,   158,   159,   160,   161,   162,\n     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,\n     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,\n     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,\n     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,\n     203,   204,   205,   206,   207,   208,   209,   210,   211,   212,\n     213,   214,   215,   216,   217,   218,   219,   220,   221,   222,\n     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,\n     233,   234,   235,   236,   237,   238,   239,   240,   241,   242,\n     243,   244,   245,   246,   247,   248,   249,   250,   251,   252,\n     253,   254,   255,   256,   257,   258,   259,   260,   261,   262,\n     263,   264,   265,   266,   267,   268,   269,   270,   271,   272,\n     273,   274,   275,   276,   277,   278,   279,   280,   281,   282,\n     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,\n     293,   294,   295,   296,   297,   298,   299,   300,   301,   302,\n     303,   304,   305,   306,   307,   308,   309,   310,   311,   312,\n     313,   314,   315,   316,   317,   318,   319,   320,   321,   322,\n     323,   324,   325,   326,   327,   328,   329,   330,   331,   332,\n       0,     0,     0,   336,   337,   338,   339,   340,   341,   342,\n     343,   344,   345,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n     888,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,   348,\n     349,   350,   351,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,   353,   354,   355,   356,   357,   358,   359,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,   360,   361,   362,   363,   364,   365,\n     366,     0,     0,     0,     0,     0,     0,     0,     0,   367,\n       0,   368,   369,   370,   371,   372,   373,   374,   375,   376,\n     377,   378,   379,   380,   381,   382,   383,   384,   385,   386,\n     387,   388,   389,   390,   391,   392,   393,   394,   395,   396,\n     397,   398,   399,   400,   401,   402,   403,     1,     2,     3,\n       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,\n      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,\n      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,\n      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,\n      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,\n      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,\n      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,\n      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,\n      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,\n      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,\n     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,\n     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,\n     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,\n     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,\n     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,\n     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,\n     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,\n     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,\n     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,\n     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,\n     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,\n     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,\n     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,\n     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,\n     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,\n     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,\n     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,\n     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,\n     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,\n     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,\n     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,\n     314,   315,   316,   317,   318,   319,   320,   321,   322,   323,\n     324,   325,   326,   327,   328,   329,   330,   331,   332,     0,\n       0,     0,   336,   337,   338,   339,   340,   341,   342,   343,\n     344,   345,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,   348,   349,\n     350,   351,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,   353,   354,   355,   356,   357,   358,   359,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,   360,   361,   362,   363,   364,   365,   366,\n       0,     0,     0,     0,     0,     0,     0,     0,   367,     0,\n     368,   369,   370,   371,   372,   373,   374,   375,   376,   377,\n     378,   379,   380,   381,   382,   383,   384,   385,   386,   387,\n     388,   389,   390,   391,   392,   393,   394,   395,   396,   397,\n     398,   399,   400,   401,   402,   403,     2,     3,     4,     5,\n       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,\n      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,\n      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,\n      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,\n      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,\n      56,    57,    58,     0,     0,    61,    62,    63,    64,    65,\n      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,\n      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,\n      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,\n      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,\n     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,\n     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,\n     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,\n     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,\n     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,\n     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,\n     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,\n     176,   177,   178,     0,   180,   181,   182,   183,   184,   185,\n     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,\n     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,\n     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,\n     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,\n     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,\n     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,\n     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,\n     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,\n     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,\n     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,\n     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,\n     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,\n     306,   307,   308,   309,   310,   311,   312,   313,   314,   315,\n     316,   317,   318,   319,   320,   321,   322,   323,   324,   325,\n     326,   327,   328,   329,   330,   331,   332,     0,     0,     0,\n       0,     0,     0,   339,     0,     0,     0,   343,   344,   345,\n       0,     0,   526,   527,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,   528,   529,     0,     0,     0,   664,   808,     0,     0,\n       0,     0,     0,   530,   531,   532,   533,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,   534,   535,   536,   537,   538,   353,\n       0,     0,     0,     0,   358,   359,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,   539,   540,\n     541,   542,   543,   544,   545,   546,     0,     0,   368,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,   381,     2,     3,     4,     5,     6,     7,     8,     9,\n      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,\n      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,\n      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,\n      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,\n      50,    51,    52,    53,    54,    55,    56,    57,    58,     0,\n       0,    61,    62,    63,    64,    65,    66,    67,    68,    69,\n      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,\n      80,    81,    82,    83,    84,    85,    86,    87,    88,    89,\n      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,\n     100,   101,   102,   103,   104,   105,   106,   107,   108,   109,\n     110,   111,   112,   113,   114,   115,   116,   117,   118,   119,\n     120,   121,   122,   123,   124,   125,   126,   127,   128,   129,\n     130,   131,   132,   133,   134,   135,   136,   137,   138,   139,\n     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,\n     150,   151,   152,   153,   154,   155,   156,   157,   158,   159,\n     160,   161,   162,   163,   164,   165,   166,   167,   168,   169,\n     170,   171,   172,   173,   174,   175,   176,   177,   178,     0,\n     180,   181,   182,   183,   184,   185,   186,   187,   188,   189,\n     190,   191,   192,   193,   194,   195,   196,   197,   198,   199,\n     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,\n     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,\n     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,\n     230,   231,   232,   233,   234,   235,   236,   237,   238,   239,\n     240,   241,   242,   243,   244,   245,   246,   247,   248,   249,\n     250,   251,   252,   253,   254,   255,   256,   257,   258,   259,\n     260,   261,   262,   263,   264,   265,   266,   267,   268,   269,\n     270,   271,   272,   273,   274,   275,   276,   277,   278,   279,\n     280,   281,   282,   283,   284,   285,   286,   287,   288,   289,\n     290,   291,   292,   293,   294,   295,   296,   297,   298,   299,\n     300,   301,   302,   303,   304,   305,   306,   307,   308,   309,\n     310,   311,   312,   313,   314,   315,   316,   317,   318,   319,\n     320,   321,   322,   323,   324,   325,   326,   327,   328,   329,\n     330,   331,   332,     0,     0,     0,     0,     0,     0,   339,\n       0,     0,     0,   343,   344,   345,     0,     0,   526,   527,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,   528,   529,     0,\n       0,     0,   664,   919,     0,     0,     0,     0,     0,   530,\n     531,   532,   533,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n     534,   535,   536,   537,   538,   353,     0,     0,     0,     0,\n     358,   359,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,   539,   540,   541,   542,   543,   544,\n     545,   546,     0,     0,   368,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,   381,     2,     3,\n       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,\n      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,\n      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,\n      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,\n      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,\n      54,    55,    56,    57,    58,     0,     0,    61,    62,    63,\n      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,\n      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,\n      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,\n      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,\n     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,\n     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,\n     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,\n     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,\n     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,\n     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,\n     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,\n     174,   175,   176,   177,   178,     0,   180,   181,   182,   183,\n     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,\n     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,\n     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,\n     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,\n     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,\n     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,\n     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,\n     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,\n     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,\n     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,\n     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,\n     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,\n     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,\n     314,   315,   316,   317,   318,   319,   320,   321,   322,   323,\n     324,   325,   326,   327,   328,   329,   330,   331,   332,     0,\n       0,     0,     0,     0,     0,   339,     0,     0,     0,   343,\n     344,   345,     0,     0,   526,   527,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,   528,   529,     0,     0,   602,     0,     0,\n       0,     0,     0,     0,     0,   530,   531,   532,   533,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,   534,   535,   536,   537,\n     538,   353,     0,     0,     0,     0,   358,   359,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n     539,   540,   541,   542,   543,   544,   545,   546,     0,     0,\n     368,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,   381,     2,     3,     4,     5,     6,     7,\n       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,\n      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,\n      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,\n      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,\n      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,\n      58,     0,     0,    61,    62,    63,    64,    65,    66,    67,\n      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,\n      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,\n      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,\n      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,\n     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,\n     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,\n     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,\n     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,\n     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,\n     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,\n     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,\n     178,     0,   180,   181,   182,   183,   184,   185,   186,   187,\n     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,\n     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,\n     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,\n     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,\n     228,   229,   230,   231,   232,   233,   234,   235,   236,   237,\n     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,\n     248,   249,   250,   251,   252,   253,   254,   255,   256,   257,\n     258,   259,   260,   261,   262,   263,   264,   265,   266,   267,\n     268,   269,   270,   271,   272,   273,   274,   275,   276,   277,\n     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,\n     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,\n     298,   299,   300,   301,   302,   303,   304,   305,   306,   307,\n     308,   309,   310,   311,   312,   313,   314,   315,   316,   317,\n     318,   319,   320,   321,   322,   323,   324,   325,   326,   327,\n     328,   329,   330,   331,   332,     0,     0,     0,     0,     0,\n       0,   339,     0,     0,     0,   343,   344,   345,     0,     0,\n     526,   527,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,   528,\n     529,     0,     0,     0,   664,     0,     0,     0,     0,     0,\n       0,   530,   531,   532,   533,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,   534,   535,   536,   537,   538,   353,     0,     0,\n       0,     0,   358,   359,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,   539,   540,   541,   542,\n     543,   544,   545,   546,     0,     0,   368,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,   381,\n       2,     3,     4,     5,     6,     7,     8,     9,    10,    11,\n      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,\n      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,\n      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,\n      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,\n      52,    53,    54,    55,    56,    57,    58,     0,     0,    61,\n      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,\n      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,\n      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,\n      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,\n     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,\n     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,\n     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,\n     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,\n     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,\n     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,\n     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,\n     172,   173,   174,   175,   176,   177,   178,     0,   180,   181,\n     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,\n     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,\n     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,\n     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,\n     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,\n     232,   233,   234,   235,   236,   237,   238,   239,   240,   241,\n     242,   243,   244,   245,   246,   247,   248,   249,   250,   251,\n     252,   253,   254,   255,   256,   257,   258,   259,   260,   261,\n     262,   263,   264,   265,   266,   267,   268,   269,   270,   271,\n     272,   273,   274,   275,   276,   277,   278,   279,   280,   281,\n     282,   283,   284,   285,   286,   287,   288,   289,   290,   291,\n     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,\n     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,\n     312,   313,   314,   315,   316,   317,   318,   319,   320,   321,\n     322,   323,   324,   325,   326,   327,   328,   329,   330,   331,\n     332,     0,     0,     0,     0,     0,     0,   339,     0,     0,\n       0,   343,   344,   345,     0,     0,   526,   527,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,   528,   529,     0,     0,   767,\n       0,     0,     0,     0,     0,     0,     0,   530,   531,   532,\n     533,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,   534,   535,\n     536,   537,   538,   353,     0,     0,     0,     0,   358,   359,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,   539,   540,   541,   542,   543,   544,   545,   546,\n       0,     0,   368,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,   381,     2,     3,     4,     5,\n       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,\n      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,\n      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,\n      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,\n      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,\n      56,    57,    58,     0,     0,    61,    62,    63,    64,    65,\n      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,\n      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,\n      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,\n      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,\n     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,\n     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,\n     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,\n     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,\n     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,\n     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,\n     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,\n     176,   177,   178,     0,   180,   181,   182,   183,   184,   185,\n     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,\n     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,\n     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,\n     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,\n     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,\n     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,\n     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,\n     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,\n     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,\n     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,\n     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,\n     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,\n     306,   307,   308,   309,   310,   311,   312,   313,   314,   315,\n     316,   317,   318,   319,   320,   321,   322,   323,   324,   325,\n     326,   327,   328,   329,   330,   331,   332,     0,     0,     0,\n       0,     0,     0,   339,     0,     0,     0,   343,   344,   345,\n       0,     0,   526,   527,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,   528,   529,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,   778,   530,   531,   532,   533,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,   534,   535,   536,   537,   538,   353,\n       0,     0,     0,     0,   358,   359,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,   539,   540,\n     541,   542,   543,   544,   545,   546,     0,     0,   368,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,   381,     2,     3,     4,     5,     6,     7,     8,     9,\n      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,\n      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,\n      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,\n      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,\n      50,    51,    52,    53,    54,    55,    56,    57,    58,     0,\n       0,    61,    62,    63,    64,    65,    66,    67,    68,    69,\n      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,\n      80,    81,    82,    83,    84,    85,    86,    87,    88,    89,\n      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,\n     100,   101,   102,   103,   104,   105,   106,   107,   108,   109,\n     110,   111,   112,   113,   114,   115,   116,   117,   118,   119,\n     120,   121,   122,   123,   124,   125,   126,   127,   128,   129,\n     130,   131,   132,   133,   134,   135,   136,   137,   138,   139,\n     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,\n     150,   151,   152,   153,   154,   155,   156,   157,   158,   159,\n     160,   161,   162,   163,   164,   165,   166,   167,   168,   169,\n     170,   171,   172,   173,   174,   175,   176,   177,   178,     0,\n     180,   181,   182,   183,   184,   185,   186,   187,   188,   189,\n     190,   191,   192,   193,   194,   195,   196,   197,   198,   199,\n     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,\n     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,\n     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,\n     230,   231,   232,   233,   234,   235,   236,   237,   238,   239,\n     240,   241,   242,   243,   244,   245,   246,   247,   248,   249,\n     250,   251,   252,   253,   254,   255,   256,   257,   258,   259,\n     260,   261,   262,   263,   264,   265,   266,   267,   268,   269,\n     270,   271,   272,   273,   274,   275,   276,   277,   278,   279,\n     280,   281,   282,   283,   284,   285,   286,   287,   288,   289,\n     290,   291,   292,   293,   294,   295,   296,   297,   298,   299,\n     300,   301,   302,   303,   304,   305,   306,   307,   308,   309,\n     310,   311,   312,   313,   314,   315,   316,   317,   318,   319,\n     320,   321,   322,   323,   324,   325,   326,   327,   328,   329,\n     330,   331,   332,     0,     0,     0,     0,     0,     0,   339,\n       0,     0,     0,   343,   344,   345,     0,     0,   526,   527,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,   528,   529,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,   530,\n     531,   532,   533,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n     534,   535,   536,   537,   538,   353,     0,     0,     0,     0,\n     358,   359,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,   539,   540,   541,   542,   543,   544,\n     545,   546,     0,     0,   368,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,   381,     2,     3,\n       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,\n      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,\n      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,\n      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,\n      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,\n      54,    55,    56,    57,    58,     0,     0,    61,    62,    63,\n      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,\n      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,\n      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,\n      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,\n     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,\n     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,\n     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,\n     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,\n     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,\n     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,\n     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,\n     174,   175,   176,   177,   178,     0,   180,   181,   182,   183,\n     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,\n     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,\n     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,\n     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,\n     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,\n     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,\n     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,\n     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,\n     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,\n     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,\n     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,\n     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,\n     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,\n     314,   315,   316,   317,   318,   319,   320,   321,   322,   323,\n     324,   325,   326,   327,   328,   329,   330,   331,   332,     0,\n       0,     0,     0,     0,     0,   339,     0,     0,     0,   343,\n     344,   345,     0,     0,   526,   527,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,   528,   529,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,   530,   531,   532,   533,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,   534,   535,   536,   537,\n     538,   353,     0,     0,     0,     0,   358,   682,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n     539,   540,   541,   542,   543,   544,   545,   546,     0,     0,\n     368,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,   381,     2,     3,     4,     5,     6,     7,\n       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,\n      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,\n      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,\n      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,\n      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,\n      58,     0,     0,    61,    62,    63,    64,    65,    66,    67,\n      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,\n      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,\n      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,\n      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,\n     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,\n     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,\n     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,\n     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,\n     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,\n     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,\n     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,\n     178,     0,   180,   181,   182,   183,   184,   185,   186,   187,\n     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,\n     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,\n     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,\n     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,\n     228,   229,   230,   231,   232,   233,   234,   235,   236,   237,\n     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,\n     248,   249,   250,   251,   252,   253,   254,   255,   256,   257,\n     258,   259,   260,   261,   262,   263,   264,   265,   266,   267,\n     268,   269,   270,   271,   272,   273,   274,   275,   276,   277,\n     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,\n     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,\n     298,   299,   300,   301,   302,   303,   304,   305,   306,   307,\n     308,   309,   310,   311,   312,   313,   314,   315,   316,   317,\n     318,   319,   320,   321,   322,   323,   324,   325,   326,   327,\n     328,   329,   330,   331,   332,     0,     0,     0,     0,     0,\n       0,   339,     0,     0,     0,   343,   344,   345,     0,     0,\n     526,   527,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,   528,\n     529,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,   530,   531,   532,   533,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,   534,   535,   536,   537,   727,   353,     0,     0,\n       0,     0,   358,   359,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,   539,   540,   541,   542,\n     543,   544,   545,   546,     0,     0,   368,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,   381,\n       2,     3,     4,     5,     6,     7,     8,     9,    10,    11,\n      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,\n      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,\n      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,\n      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,\n      52,    53,    54,    55,    56,    57,    58,     0,     0,    61,\n      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,\n      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,\n      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,\n      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,\n     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,\n     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,\n     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,\n     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,\n     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,\n     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,\n     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,\n     172,   173,   174,   175,   176,   177,   178,     0,   180,   181,\n     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,\n     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,\n     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,\n     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,\n     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,\n     232,   233,   234,   235,   236,   237,   238,   239,   240,   241,\n     242,   243,   244,   245,   246,   247,   248,   249,   250,   251,\n     252,   253,   254,   255,   256,   257,   258,   259,   260,   261,\n     262,   263,   264,   265,   266,   267,   268,   269,   270,   271,\n     272,   273,   274,   275,   276,   277,   278,   279,   280,   281,\n     282,   283,   284,   285,   286,   287,   288,   289,   290,   291,\n     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,\n     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,\n     312,   313,   314,   315,   316,   317,   318,   319,   320,   321,\n     322,   323,   324,   325,   326,   327,   328,   329,   330,   331,\n     332,     0,     0,     0,     0,     0,     0,   339,     0,     0,\n       0,   343,   344,   345,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,   353,     0,     0,     0,     0,   358,   359,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,\n       0,     0,   368\n};\n\nstatic const yytype_int16 yycheck[] =\n{\n       0,   409,     0,   428,   529,     0,     0,   508,   433,   520,\n     461,   650,     0,   662,   569,   664,   467,   466,   667,   585,\n     428,   428,   579,   594,   770,   433,   574,   596,   369,   417,\n     585,   369,   357,   406,   440,   352,   353,   371,   374,   932,\n     588,   369,   372,   377,   555,   453,   939,   369,   377,   597,\n     372,   372,   371,   380,   350,   351,   949,   430,   379,   508,\n     389,   402,   403,   404,   405,   403,   517,   518,   393,   457,\n     406,   388,   389,   574,   370,   403,   372,   526,   527,   406,\n     376,   403,   567,   371,   585,   473,   372,   588,   573,   377,\n     575,   370,   500,   578,   380,   580,   597,   582,   583,   668,\n     388,   370,   587,   372,   629,   372,   631,   372,   372,   558,\n     379,   348,   349,   380,   379,   379,   617,   435,   436,   437,\n     438,   439,   440,   441,   374,   574,   371,   377,   371,   373,\n     380,   371,   377,   377,   377,   774,   585,   377,   371,   588,\n     371,   371,   377,   371,   377,   380,   377,   377,   597,   377,\n     377,   662,   677,   664,   371,   370,   667,   371,   807,   371,\n     377,   567,   382,   377,   384,   377,   371,   371,   617,   371,\n     681,   742,   377,   377,   371,   377,   371,   583,   371,   371,\n     377,   371,   377,   370,   377,   377,   594,   377,   596,   359,\n     360,   361,   362,   363,   364,   365,   366,   367,   368,   371,\n     371,   380,   371,   370,   592,   377,   377,   953,   377,   379,\n     371,   371,   371,   371,   371,   370,   377,   377,   377,   377,\n     377,   402,   403,   404,   405,   406,   373,   373,   406,   403,\n     377,   377,   406,   354,   355,   660,   875,   686,   887,   403,\n     403,   812,   406,   406,   377,   378,   402,   403,   404,   405,\n     370,   776,   660,   660,   370,   780,   753,   754,   755,   756,\n     668,   403,   403,   403,   406,   406,   406,   377,   403,   403,\n     380,   406,   406,   403,   403,   370,   406,   406,   844,   370,\n     846,   838,   839,   831,   832,   370,   737,   798,   799,   844,\n     403,   388,   403,   406,   943,   406,   807,   746,   747,   748,\n     749,   750,   751,   752,   753,   754,   755,   756,   757,   758,\n     759,   760,   761,   762,   763,   764,   377,   380,   377,   380,\n     959,   380,   377,   377,   406,   380,   380,   395,   396,   397,\n     831,   832,   377,   378,   742,   385,   386,   387,   375,   406,\n     377,   751,   752,   844,   374,   846,   749,   750,   873,   406,\n     374,   876,   757,   758,   372,   406,   372,   406,   371,   406,\n     380,   380,   379,   377,   379,   377,   377,   377,   377,   377,\n     377,   377,   377,   377,   371,   377,   887,   370,   379,   406,\n     371,   370,   831,   832,   370,   372,   370,   372,   369,   356,\n     373,   916,   358,   373,   370,   844,   370,   846,   375,   370,\n     392,   391,   380,   406,   812,   380,   370,   406,   933,   409,\n     406,   390,   380,   378,   371,   370,   379,   417,   929,   380,\n     380,   409,   380,   948,   380,   425,   377,   425,   428,   417,\n     425,   425,   943,   433,   406,   433,   406,   425,   433,   377,\n     428,   377,   371,   443,   371,   433,   377,   373,   373,   369,\n     369,   876,   414,   453,   452,   403,   406,   457,   375,   371,\n     370,   374,   380,   379,   371,   453,   466,   375,   876,   457,\n     374,   418,   374,   473,   380,   759,   761,   760,   352,   736,\n     762,   599,   763,   851,   764,   473,   878,   949,   457,   950,\n     938,   916,   878,   916,   453,   660,   590,   425,   451,   832,\n     500,   827,   839,   457,   836,   829,   660,   660,   916,   844,\n      -1,   511,   500,    -1,   834,   838,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,   511,    -1,    -1,   842,    -1,    -1,    -1,\n      -1,   846,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,   563,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,   592,    -1,   594,    -1,   596,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,   592,    -1,   594,    -1,   596,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n     650,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n     660,    -1,   650,    -1,    -1,    -1,    -1,    -1,   668,    -1,\n      -1,    -1,   660,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n     668,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,   742,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,   742,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n     770,    -1,    -1,    -1,   774,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,   770,    -1,    -1,    -1,   774,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,   812,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,   812,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,   875,   876,    -1,   878,    -1,\n     878,    -1,    -1,    -1,    -1,    -1,    -1,   875,   876,    -1,\n     878,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,   916,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   916,    -1,\n      -1,    -1,   932,    -1,    -1,    -1,    -1,    -1,    -1,   939,\n      -1,    -1,    -1,    -1,   932,    -1,    -1,    -1,    -1,   949,\n      -1,   939,    -1,   953,    -1,    -1,    -1,    -1,    -1,   959,\n      -1,   949,    -1,    -1,    -1,   953,    -1,    -1,    -1,     0,\n      -1,   959,     3,     4,     5,     6,     7,     8,     9,    10,\n      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,\n      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,\n      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,\n      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,\n      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,\n      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,\n      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,\n      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,\n      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,\n     101,   102,   103,   104,   105,   106,   107,   108,   109,   110,\n     111,   112,   113,   114,   115,   116,   117,   118,   119,   120,\n     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,\n     131,   132,   133,   134,   135,   136,   137,   138,   139,   140,\n     141,   142,   143,   144,   145,   146,   147,   148,   149,   150,\n     151,   152,   153,   154,   155,   156,   157,   158,   159,   160,\n     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,\n     171,   172,   173,   174,   175,   176,   177,   178,   179,   180,\n     181,   182,   183,   184,   185,   186,   187,   188,   189,   190,\n     191,   192,   193,   194,   195,   196,   197,   198,   199,   200,\n     201,   202,   203,   204,   205,   206,   207,   208,   209,   210,\n     211,   212,   213,   214,   215,   216,   217,   218,   219,   220,\n     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,\n     231,   232,   233,   234,   235,   236,   237,   238,   239,   240,\n     241,   242,   243,   244,   245,   246,   247,   248,   249,   250,\n     251,   252,   253,   254,   255,   256,   257,   258,   259,   260,\n     261,   262,   263,   264,   265,   266,   267,   268,   269,   270,\n     271,   272,   273,   274,   275,   276,   277,   278,   279,   280,\n     281,   282,   283,   284,   285,   286,   287,   288,   289,   290,\n     291,   292,   293,   294,   295,   296,   297,   298,   299,   300,\n     301,   302,   303,   304,   305,   306,   307,   308,   309,   310,\n     311,   312,   313,   314,   315,   316,   317,   318,   319,   320,\n     321,   322,   323,   324,   325,   326,   327,   328,   329,   330,\n     331,   332,   333,   334,   335,   336,   337,   338,   339,   340,\n     341,   342,   343,   344,   345,   346,   347,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,   372,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   380,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,   394,   395,   396,   397,   398,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,   407,   408,   409,   410,\n     411,   412,   413,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   429,   430,\n     431,   432,   433,   434,   435,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,   444,    -1,   446,   447,   448,   449,   450,\n     451,   452,   453,   454,   455,   456,   457,   458,   459,   460,\n     461,   462,   463,   464,   465,   466,   467,   468,   469,   470,\n     471,   472,   473,   474,   475,   476,   477,   478,   479,   480,\n     481,     3,     4,     5,     6,     7,     8,     9,    10,    11,\n      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,\n      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,\n      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,\n      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,\n      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,\n      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,\n      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,\n      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,\n      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,\n     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,\n     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,\n     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,\n     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,\n     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,\n     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,\n     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,\n     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,\n     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,\n     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,\n     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,\n     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,\n     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,\n     232,   233,   234,   235,   236,   237,   238,   239,   240,   241,\n     242,   243,   244,   245,   246,   247,   248,   249,   250,   251,\n     252,   253,   254,   255,   256,   257,   258,   259,   260,   261,\n     262,   263,   264,   265,   266,   267,   268,   269,   270,   271,\n     272,   273,   274,   275,   276,   277,   278,   279,   280,   281,\n     282,   283,   284,   285,   286,   287,   288,   289,   290,   291,\n     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,\n     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,\n     312,   313,   314,   315,   316,   317,   318,   319,   320,   321,\n     322,   323,   324,   325,   326,   327,   328,   329,   330,   331,\n     332,   333,   334,   335,   336,   337,   338,   339,   340,   341,\n     342,   343,   344,   345,   346,   347,    -1,    -1,   350,   351,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,   369,   370,    -1,\n     372,    -1,   374,   375,    -1,    -1,    -1,    -1,   380,   381,\n     382,   383,   384,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,   394,   395,   396,   397,   398,    -1,    -1,    -1,\n     402,   403,   404,   405,   406,   407,   408,   409,   410,   411,\n     412,   413,   414,   415,   416,   417,    -1,   419,   420,   421,\n     422,   423,   424,   425,   426,   427,   428,   429,   430,   431,\n     432,   433,   434,   435,   436,   437,   438,   439,   440,   441,\n     442,   443,   444,   445,   446,   447,   448,   449,   450,   451,\n     452,   453,   454,   455,   456,   457,   458,   459,   460,   461,\n     462,   463,   464,   465,   466,   467,   468,   469,   470,   471,\n     472,   473,   474,   475,   476,   477,   478,   479,   480,   481,\n       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,\n      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,\n      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,\n      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,\n      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,\n      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,\n      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,\n      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,\n      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,\n      93,    94,    95,    96,    97,    98,    99,   100,   101,   102,\n     103,   104,   105,   106,   107,   108,   109,   110,   111,   112,\n     113,   114,   115,   116,   117,   118,   119,   120,   121,   122,\n     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,\n     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,\n     143,   144,   145,   146,   147,   148,   149,   150,   151,   152,\n     153,   154,   155,   156,   157,   158,   159,   160,   161,   162,\n     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,\n     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,\n     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,\n     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,\n     203,   204,   205,   206,   207,   208,   209,   210,   211,   212,\n     213,   214,   215,   216,   217,   218,   219,   220,   221,   222,\n     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,\n     233,   234,   235,   236,   237,   238,   239,   240,   241,   242,\n     243,   244,   245,   246,   247,   248,   249,   250,   251,   252,\n     253,   254,   255,   256,   257,   258,   259,   260,   261,   262,\n     263,   264,   265,   266,   267,   268,   269,   270,   271,   272,\n     273,   274,   275,   276,   277,   278,   279,   280,   281,   282,\n     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,\n     293,   294,   295,   296,   297,   298,   299,   300,   301,   302,\n     303,   304,   305,   306,   307,   308,   309,   310,   311,   312,\n     313,   314,   315,   316,   317,   318,   319,   320,   321,   322,\n     323,   324,   325,   326,   327,   328,   329,   330,   331,   332,\n     333,   334,   335,   336,   337,   338,   339,   340,   341,   342,\n     343,   344,   345,   346,   347,    -1,    -1,   350,   351,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,   369,   370,    -1,   372,\n      -1,   374,   375,    -1,    -1,    -1,    -1,   380,   381,   382,\n     383,   384,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,   394,   395,   396,   397,   398,    -1,    -1,    -1,   402,\n     403,   404,   405,   406,   407,   408,   409,   410,   411,   412,\n     413,   414,   415,   416,   417,    -1,   419,   420,   421,   422,\n     423,   424,   425,   426,   427,   428,   429,   430,   431,   432,\n     433,   434,   435,   436,   437,   438,   439,   440,   441,   442,\n     443,   444,   445,   446,   447,   448,   449,   450,   451,   452,\n     453,   454,   455,   456,   457,   458,   459,   460,   461,   462,\n     463,   464,   465,   466,   467,   468,   469,   470,   471,   472,\n     473,   474,   475,   476,   477,   478,   479,   480,   481,     3,\n       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,\n      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,\n      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,\n      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,\n      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,\n      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,\n      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,\n      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,\n      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,\n      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,\n     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,\n     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,\n     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,\n     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,\n     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,\n     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,\n     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,\n     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,\n     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,\n     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,\n     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,\n     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,\n     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,\n     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,\n     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,\n     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,\n     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,\n     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,\n     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,\n     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,\n     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,\n     314,   315,   316,   317,   318,   319,   320,   321,   322,   323,\n     324,   325,   326,   327,   328,   329,   330,   331,   332,   333,\n     334,   335,   336,   337,   338,   339,   340,   341,   342,   343,\n     344,   345,   346,   347,    -1,    -1,   350,   351,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,   369,   370,    -1,   372,    -1,\n     374,    -1,    -1,    -1,    -1,    -1,   380,   381,   382,   383,\n     384,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n     394,   395,   396,   397,   398,    -1,    -1,    -1,   402,   403,\n     404,   405,   406,   407,   408,   409,   410,   411,   412,   413,\n     414,   415,   416,   417,    -1,   419,   420,   421,   422,   423,\n     424,   425,   426,   427,   428,   429,   430,   431,   432,   433,\n     434,   435,   436,   437,   438,   439,   440,   441,   442,   443,\n     444,   445,   446,   447,   448,   449,   450,   451,   452,   453,\n     454,   455,   456,   457,   458,   459,   460,   461,   462,   463,\n     464,   465,   466,   467,   468,   469,   470,   471,   472,   473,\n     474,   475,   476,   477,   478,   479,   480,   481,     3,     4,\n       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,\n      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,\n      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,\n      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,\n      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,\n      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,\n      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,\n      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,\n      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,\n      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,\n     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,\n     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,\n     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,\n     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,\n     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,\n     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,\n     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,\n     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,\n     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,\n     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,\n     205,   206,   207,   208,   209,   210,   211,   212,   213,   214,\n     215,   216,   217,   218,   219,   220,   221,   222,   223,   224,\n     225,   226,   227,   228,   229,   230,   231,   232,   233,   234,\n     235,   236,   237,   238,   239,   240,   241,   242,   243,   244,\n     245,   246,   247,   248,   249,   250,   251,   252,   253,   254,\n     255,   256,   257,   258,   259,   260,   261,   262,   263,   264,\n     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,\n     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,\n     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,\n     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,\n     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,\n     315,   316,   317,   318,   319,   320,   321,   322,   323,   324,\n     325,   326,   327,   328,   329,   330,   331,   332,   333,   334,\n     335,   336,   337,   338,   339,   340,   341,   342,   343,   344,\n     345,   346,   347,    -1,    -1,   350,   351,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,   369,   370,    -1,   372,    -1,   374,\n      -1,    -1,    -1,    -1,    -1,   380,   381,   382,   383,   384,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   394,\n     395,   396,   397,   398,    -1,    -1,    -1,   402,   403,   404,\n     405,   406,   407,   408,   409,   410,   411,   412,   413,   414,\n     415,   416,   417,    -1,   419,   420,   421,   422,   423,   424,\n     425,   426,   427,   428,   429,   430,   431,   432,   433,   434,\n     435,   436,   437,   438,   439,   440,   441,   442,   443,   444,\n     445,   446,   447,   448,   449,   450,   451,   452,   453,   454,\n     455,   456,   457,   458,   459,   460,   461,   462,   463,   464,\n     465,   466,   467,   468,   469,   470,   471,   472,   473,   474,\n     475,   476,   477,   478,   479,   480,   481,     3,     4,     5,\n       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,\n      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,\n      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,\n      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,\n      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,\n      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,\n      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,\n      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,\n      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,\n      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,\n     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,\n     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,\n     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,\n     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,\n     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,\n     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,\n     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,\n     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,\n     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,\n     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,\n     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,\n     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,\n     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,\n     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,\n     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,\n     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,\n     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,\n     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,\n     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,\n     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,\n     306,   307,   308,   309,   310,   311,   312,   313,   314,   315,\n     316,   317,   318,   319,   320,   321,   322,   323,   324,   325,\n     326,   327,   328,   329,   330,   331,   332,   333,   334,   335,\n     336,   337,   338,   339,   340,   341,   342,   343,   344,   345,\n     346,   347,    -1,    -1,   350,   351,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,   369,   370,    -1,   372,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,   380,   381,   382,   383,   384,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   394,   395,\n     396,   397,   398,    -1,    -1,    -1,   402,   403,   404,   405,\n     406,   407,   408,   409,   410,   411,   412,   413,   414,   415,\n     416,   417,    -1,   419,   420,   421,   422,   423,   424,   425,\n     426,   427,   428,   429,   430,   431,   432,   433,   434,   435,\n     436,   437,   438,   439,   440,   441,   442,   443,   444,   445,\n     446,   447,   448,   449,   450,   451,   452,   453,   454,   455,\n     456,   457,   458,   459,   460,   461,   462,   463,   464,   465,\n     466,   467,   468,   469,   470,   471,   472,   473,   474,   475,\n     476,   477,   478,   479,   480,   481,     3,     4,     5,     6,\n       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,\n      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,\n      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,\n      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,\n      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,\n      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,\n      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,\n      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,\n      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,\n      97,    98,    99,   100,   101,   102,   103,   104,   105,   106,\n     107,   108,   109,   110,   111,   112,   113,   114,   115,   116,\n     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,\n     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,\n     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,\n     147,   148,   149,   150,   151,   152,   153,   154,   155,   156,\n     157,   158,   159,   160,   161,   162,   163,   164,   165,   166,\n     167,   168,   169,   170,   171,   172,   173,   174,   175,   176,\n     177,   178,   179,   180,   181,   182,   183,   184,   185,   186,\n     187,   188,   189,   190,   191,   192,   193,   194,   195,   196,\n     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,\n     207,   208,   209,   210,   211,   212,   213,   214,   215,   216,\n     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,\n     227,   228,   229,   230,   231,   232,   233,   234,   235,   236,\n     237,   238,   239,   240,   241,   242,   243,   244,   245,   246,\n     247,   248,   249,   250,   251,   252,   253,   254,   255,   256,\n     257,   258,   259,   260,   261,   262,   263,   264,   265,   266,\n     267,   268,   269,   270,   271,   272,   273,   274,   275,   276,\n     277,   278,   279,   280,   281,   282,   283,   284,   285,   286,\n     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,\n     297,   298,   299,   300,   301,   302,   303,   304,   305,   306,\n     307,   308,   309,   310,   311,   312,   313,   314,   315,   316,\n     317,   318,   319,   320,   321,   322,   323,   324,   325,   326,\n     327,   328,   329,   330,   331,   332,   333,   334,   335,   336,\n     337,   338,   339,   340,   341,   342,   343,   344,   345,   346,\n     347,    -1,    -1,   350,   351,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,   369,   370,    -1,   372,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,   380,   381,   382,   383,   384,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,   394,   395,   396,\n     397,   398,    -1,    -1,    -1,   402,   403,   404,   405,   406,\n     407,   408,   409,   410,   411,   412,   413,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,   429,   430,   431,   432,   433,   434,   435,   436,\n     437,   438,   439,   440,   441,   442,   443,   444,    -1,   446,\n     447,   448,   449,   450,   451,   452,   453,   454,   455,   456,\n     457,   458,   459,   460,   461,   462,   463,   464,   465,   466,\n     467,   468,   469,   470,   471,   472,   473,   474,   475,   476,\n     477,   478,   479,   480,   481,     3,     4,     5,     6,     7,\n       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,\n      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,\n      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,\n      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,\n      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,\n      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,\n      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,\n      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,\n      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,\n      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,\n     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,\n     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,\n     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,\n     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,\n     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,\n     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,\n     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,\n     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,\n     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,\n     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,\n     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,\n     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,\n     228,   229,   230,   231,   232,   233,   234,   235,   236,   237,\n     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,\n     248,   249,   250,   251,   252,   253,   254,   255,   256,   257,\n     258,   259,   260,   261,   262,   263,   264,   265,   266,   267,\n     268,   269,   270,   271,   272,   273,   274,   275,   276,   277,\n     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,\n     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,\n     298,   299,   300,   301,   302,   303,   304,   305,   306,   307,\n     308,   309,   310,   311,   312,   313,   314,   315,   316,   317,\n     318,   319,   320,   321,   322,   323,   324,   325,   326,   327,\n     328,   329,   330,   331,   332,   333,   334,    -1,    -1,    -1,\n     338,   339,   340,   341,   342,   343,   344,   345,   346,   347,\n      -1,    -1,   350,   351,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,   369,   370,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,   381,   382,   383,   384,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,   394,   395,   396,   397,\n      -1,    -1,    -1,    -1,   402,   403,   404,   405,   406,   407,\n     408,   409,   410,   411,   412,   413,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,   429,   430,   431,   432,   433,   434,   435,   436,   437,\n     438,   439,   440,   441,   442,   443,   444,    -1,   446,   447,\n     448,   449,   450,   451,   452,   453,   454,   455,   456,   457,\n     458,   459,   460,   461,   462,   463,   464,   465,   466,   467,\n     468,   469,   470,   471,   472,   473,   474,   475,   476,   477,\n     478,   479,   480,   481,     3,     4,     5,     6,     7,     8,\n       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,\n      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,\n      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,\n      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,\n      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,\n      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,\n      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,\n      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,\n      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,\n      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,\n     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,\n     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,\n     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,\n     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,\n     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,\n     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,\n     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,\n     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,\n     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,\n     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,\n     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,\n     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,\n     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,\n     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,\n     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,\n     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,\n     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,\n     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,\n     289,   290,   291,   292,   293,   294,   295,   296,   297,   298,\n     299,   300,   301,   302,   303,   304,   305,   306,   307,   308,\n     309,   310,   311,   312,   313,   314,   315,   316,   317,   318,\n     319,   320,   321,   322,   323,   324,   325,   326,   327,   328,\n     329,   330,   331,   332,   333,   334,   335,   336,   337,   338,\n     339,   340,   341,   342,   343,   344,   345,   346,   347,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,   372,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,   380,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,   394,   395,   396,   397,   398,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   407,   408,\n     409,   410,   411,   412,   413,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n     429,   430,   431,   432,   433,   434,   435,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,   444,    -1,   446,   447,   448,\n     449,   450,   451,   452,   453,   454,   455,   456,   457,   458,\n     459,   460,   461,   462,   463,   464,   465,   466,   467,   468,\n     469,   470,   471,   472,   473,   474,   475,   476,   477,   478,\n     479,   480,   481,     3,     4,     5,     6,     7,     8,     9,\n      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,\n      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,\n      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,\n      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,\n      50,    51,    52,    53,    54,    55,    56,    57,    58,    59,\n      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,\n      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,\n      80,    81,    82,    83,    84,    85,    86,    87,    88,    89,\n      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,\n     100,   101,   102,   103,   104,   105,   106,   107,   108,   109,\n     110,   111,   112,   113,   114,   115,   116,   117,   118,   119,\n     120,   121,   122,   123,   124,   125,   126,   127,   128,   129,\n     130,   131,   132,   133,   134,   135,   136,   137,   138,   139,\n     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,\n     150,   151,   152,   153,   154,   155,   156,   157,   158,   159,\n     160,   161,   162,   163,   164,   165,   166,   167,   168,   169,\n     170,   171,   172,   173,   174,   175,   176,   177,   178,   179,\n     180,   181,   182,   183,   184,   185,   186,   187,   188,   189,\n     190,   191,   192,   193,   194,   195,   196,   197,   198,   199,\n     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,\n     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,\n     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,\n     230,   231,   232,   233,   234,   235,   236,   237,   238,   239,\n     240,   241,   242,   243,   244,   245,   246,   247,   248,   249,\n     250,   251,   252,   253,   254,   255,   256,   257,   258,   259,\n     260,   261,   262,   263,   264,   265,   266,   267,   268,   269,\n     270,   271,   272,   273,   274,   275,   276,   277,   278,   279,\n     280,   281,   282,   283,   284,   285,   286,   287,   288,   289,\n     290,   291,   292,   293,   294,   295,   296,   297,   298,   299,\n     300,   301,   302,   303,   304,   305,   306,   307,   308,   309,\n     310,   311,   312,   313,   314,   315,   316,   317,   318,   319,\n     320,   321,   322,   323,   324,   325,   326,   327,   328,   329,\n     330,   331,   332,   333,   334,    -1,    -1,    -1,   338,   339,\n     340,   341,   342,   343,   344,   345,   346,   347,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,   394,   395,   396,   397,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,   407,   408,   409,\n     410,   411,   412,   413,   414,    -1,    -1,   417,    -1,   419,\n     420,    -1,    -1,   423,    -1,    -1,    -1,    -1,    -1,   429,\n     430,   431,   432,   433,   434,   435,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,   444,    -1,   446,   447,   448,   449,\n     450,   451,   452,   453,   454,   455,   456,   457,   458,   459,\n     460,   461,   462,   463,   464,   465,   466,   467,   468,   469,\n     470,   471,   472,   473,   474,   475,   476,   477,   478,   479,\n     480,   481,     3,     4,     5,     6,     7,     8,     9,    10,\n      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,\n      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,\n      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,\n      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,\n      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,\n      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,\n      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,\n      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,\n      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,\n     101,   102,   103,   104,   105,   106,   107,   108,   109,   110,\n     111,   112,   113,   114,   115,   116,   117,   118,   119,   120,\n     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,\n     131,   132,   133,   134,   135,   136,   137,   138,   139,   140,\n     141,   142,   143,   144,   145,   146,   147,   148,   149,   150,\n     151,   152,   153,   154,   155,   156,   157,   158,   159,   160,\n     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,\n     171,   172,   173,   174,   175,   176,   177,   178,   179,   180,\n     181,   182,   183,   184,   185,   186,   187,   188,   189,   190,\n     191,   192,   193,   194,   195,   196,   197,   198,   199,   200,\n     201,   202,   203,   204,   205,   206,   207,   208,   209,   210,\n     211,   212,   213,   214,   215,   216,   217,   218,   219,   220,\n     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,\n     231,   232,   233,   234,   235,   236,   237,   238,   239,   240,\n     241,   242,   243,   244,   245,   246,   247,   248,   249,   250,\n     251,   252,   253,   254,   255,   256,   257,   258,   259,   260,\n     261,   262,   263,   264,   265,   266,   267,   268,   269,   270,\n     271,   272,   273,   274,   275,   276,   277,   278,   279,   280,\n     281,   282,   283,   284,   285,   286,   287,   288,   289,   290,\n     291,   292,   293,   294,   295,   296,   297,   298,   299,   300,\n     301,   302,   303,   304,   305,   306,   307,   308,   309,   310,\n     311,   312,   313,   314,   315,   316,   317,   318,   319,   320,\n     321,   322,   323,   324,   325,   326,   327,   328,   329,   330,\n     331,   332,   333,   334,    -1,    -1,    -1,   338,   339,   340,\n     341,   342,   343,   344,   345,   346,   347,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   380,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,   394,   395,   396,   397,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,   406,   407,   408,   409,   410,\n     411,   412,   413,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   429,   430,\n     431,   432,   433,   434,   435,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,   444,    -1,   446,   447,   448,   449,   450,\n     451,   452,   453,   454,   455,   456,   457,   458,   459,   460,\n     461,   462,   463,   464,   465,   466,   467,   468,   469,   470,\n     471,   472,   473,   474,   475,   476,   477,   478,   479,   480,\n     481,     3,     4,     5,     6,     7,     8,     9,    10,    11,\n      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,\n      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,\n      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,\n      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,\n      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,\n      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,\n      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,\n      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,\n      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,\n     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,\n     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,\n     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,\n     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,\n     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,\n     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,\n     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,\n     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,\n     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,\n     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,\n     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,\n     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,\n     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,\n     232,   233,   234,   235,   236,   237,   238,   239,   240,   241,\n     242,   243,   244,   245,   246,   247,   248,   249,   250,   251,\n     252,   253,   254,   255,   256,   257,   258,   259,   260,   261,\n     262,   263,   264,   265,   266,   267,   268,   269,   270,   271,\n     272,   273,   274,   275,   276,   277,   278,   279,   280,   281,\n     282,   283,   284,   285,   286,   287,   288,   289,   290,   291,\n     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,\n     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,\n     312,   313,   314,   315,   316,   317,   318,   319,   320,   321,\n     322,   323,   324,   325,   326,   327,   328,   329,   330,   331,\n     332,   333,   334,    -1,    -1,    -1,   338,   339,   340,   341,\n     342,   343,   344,   345,   346,   347,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n     372,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,   394,   395,   396,   397,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,   407,   408,   409,   410,   411,\n     412,   413,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,   429,   430,   431,\n     432,   433,   434,   435,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,   444,    -1,   446,   447,   448,   449,   450,   451,\n     452,   453,   454,   455,   456,   457,   458,   459,   460,   461,\n     462,   463,   464,   465,   466,   467,   468,   469,   470,   471,\n     472,   473,   474,   475,   476,   477,   478,   479,   480,   481,\n       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,\n      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,\n      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,\n      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,\n      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,\n      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,\n      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,\n      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,\n      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,\n      93,    94,    95,    96,    97,    98,    99,   100,   101,   102,\n     103,   104,   105,   106,   107,   108,   109,   110,   111,   112,\n     113,   114,   115,   116,   117,   118,   119,   120,   121,   122,\n     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,\n     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,\n     143,   144,   145,   146,   147,   148,   149,   150,   151,   152,\n     153,   154,   155,   156,   157,   158,   159,   160,   161,   162,\n     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,\n     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,\n     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,\n     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,\n     203,   204,   205,   206,   207,   208,   209,   210,   211,   212,\n     213,   214,   215,   216,   217,   218,   219,   220,   221,   222,\n     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,\n     233,   234,   235,   236,   237,   238,   239,   240,   241,   242,\n     243,   244,   245,   246,   247,   248,   249,   250,   251,   252,\n     253,   254,   255,   256,   257,   258,   259,   260,   261,   262,\n     263,   264,   265,   266,   267,   268,   269,   270,   271,   272,\n     273,   274,   275,   276,   277,   278,   279,   280,   281,   282,\n     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,\n     293,   294,   295,   296,   297,   298,   299,   300,   301,   302,\n     303,   304,   305,   306,   307,   308,   309,   310,   311,   312,\n     313,   314,   315,   316,   317,   318,   319,   320,   321,   322,\n     323,   324,   325,   326,   327,   328,   329,   330,   331,   332,\n     333,   334,    -1,    -1,    -1,   338,   339,   340,   341,   342,\n     343,   344,   345,   346,   347,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,   375,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,   394,   395,   396,   397,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,   407,   408,   409,   410,   411,   412,\n     413,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,   429,   430,   431,   432,\n     433,   434,   435,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,   444,    -1,   446,   447,   448,   449,   450,   451,   452,\n     453,   454,   455,   456,   457,   458,   459,   460,   461,   462,\n     463,   464,   465,   466,   467,   468,   469,   470,   471,   472,\n     473,   474,   475,   476,   477,   478,   479,   480,   481,     3,\n       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,\n      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,\n      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,\n      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,\n      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,\n      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,\n      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,\n      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,\n      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,\n      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,\n     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,\n     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,\n     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,\n     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,\n     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,\n     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,\n     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,\n     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,\n     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,\n     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,\n     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,\n     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,\n     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,\n     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,\n     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,\n     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,\n     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,\n     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,\n     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,\n     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,\n     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,\n     314,   315,   316,   317,   318,   319,   320,   321,   322,   323,\n     324,   325,   326,   327,   328,   329,   330,   331,   332,   333,\n     334,    -1,    -1,    -1,   338,   339,   340,   341,   342,   343,\n     344,   345,   346,   347,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,   375,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n     394,   395,   396,   397,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,   407,   408,   409,   410,   411,   412,   413,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,   429,   430,   431,   432,   433,\n     434,   435,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n     444,    -1,   446,   447,   448,   449,   450,   451,   452,   453,\n     454,   455,   456,   457,   458,   459,   460,   461,   462,   463,\n     464,   465,   466,   467,   468,   469,   470,   471,   472,   473,\n     474,   475,   476,   477,   478,   479,   480,   481,     3,     4,\n       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,\n      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,\n      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,\n      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,\n      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,\n      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,\n      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,\n      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,\n      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,\n      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,\n     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,\n     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,\n     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,\n     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,\n     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,\n     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,\n     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,\n     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,\n     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,\n     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,\n     205,   206,   207,   208,   209,   210,   211,   212,   213,   214,\n     215,   216,   217,   218,   219,   220,   221,   222,   223,   224,\n     225,   226,   227,   228,   229,   230,   231,   232,   233,   234,\n     235,   236,   237,   238,   239,   240,   241,   242,   243,   244,\n     245,   246,   247,   248,   249,   250,   251,   252,   253,   254,\n     255,   256,   257,   258,   259,   260,   261,   262,   263,   264,\n     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,\n     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,\n     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,\n     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,\n     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,\n     315,   316,   317,   318,   319,   320,   321,   322,   323,   324,\n     325,   326,   327,   328,   329,   330,   331,   332,   333,   334,\n      -1,    -1,    -1,   338,   339,   340,   341,   342,   343,   344,\n     345,   346,   347,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n     375,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   394,\n     395,   396,   397,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,   407,   408,   409,   410,   411,   412,   413,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,   429,   430,   431,   432,   433,   434,\n     435,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   444,\n      -1,   446,   447,   448,   449,   450,   451,   452,   453,   454,\n     455,   456,   457,   458,   459,   460,   461,   462,   463,   464,\n     465,   466,   467,   468,   469,   470,   471,   472,   473,   474,\n     475,   476,   477,   478,   479,   480,   481,     3,     4,     5,\n       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,\n      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,\n      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,\n      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,\n      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,\n      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,\n      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,\n      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,\n      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,\n      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,\n     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,\n     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,\n     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,\n     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,\n     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,\n     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,\n     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,\n     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,\n     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,\n     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,\n     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,\n     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,\n     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,\n     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,\n     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,\n     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,\n     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,\n     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,\n     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,\n     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,\n     306,   307,   308,   309,   310,   311,   312,   313,   314,   315,\n     316,   317,   318,   319,   320,   321,   322,   323,   324,   325,\n     326,   327,   328,   329,   330,   331,   332,   333,   334,    -1,\n      -1,    -1,   338,   339,   340,   341,   342,   343,   344,   345,\n     346,   347,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   394,   395,\n     396,   397,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,   407,   408,   409,   410,   411,   412,   413,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,   429,   430,   431,   432,   433,   434,   435,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   444,    -1,\n     446,   447,   448,   449,   450,   451,   452,   453,   454,   455,\n     456,   457,   458,   459,   460,   461,   462,   463,   464,   465,\n     466,   467,   468,   469,   470,   471,   472,   473,   474,   475,\n     476,   477,   478,   479,   480,   481,     4,     5,     6,     7,\n       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,\n      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,\n      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,\n      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,\n      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,\n      58,    59,    60,    -1,    -1,    63,    64,    65,    66,    67,\n      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,\n      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,\n      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,\n      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,\n     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,\n     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,\n     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,\n     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,\n     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,\n     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,\n     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,\n     178,   179,   180,    -1,   182,   183,   184,   185,   186,   187,\n     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,\n     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,\n     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,\n     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,\n     228,   229,   230,   231,   232,   233,   234,   235,   236,   237,\n     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,\n     248,   249,   250,   251,   252,   253,   254,   255,   256,   257,\n     258,   259,   260,   261,   262,   263,   264,   265,   266,   267,\n     268,   269,   270,   271,   272,   273,   274,   275,   276,   277,\n     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,\n     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,\n     298,   299,   300,   301,   302,   303,   304,   305,   306,   307,\n     308,   309,   310,   311,   312,   313,   314,   315,   316,   317,\n     318,   319,   320,   321,   322,   323,   324,   325,   326,   327,\n     328,   329,   330,   331,   332,   333,   334,    -1,    -1,    -1,\n      -1,    -1,    -1,   341,    -1,    -1,    -1,   345,   346,   347,\n      -1,    -1,   350,   351,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,   369,   370,    -1,    -1,    -1,   374,   375,    -1,    -1,\n      -1,    -1,    -1,   381,   382,   383,   384,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,   402,   403,   404,   405,   406,   407,\n      -1,    -1,    -1,    -1,   412,   413,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   436,   437,\n     438,   439,   440,   441,   442,   443,    -1,    -1,   446,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,   459,     4,     5,     6,     7,     8,     9,    10,    11,\n      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,\n      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,\n      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,\n      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,\n      52,    53,    54,    55,    56,    57,    58,    59,    60,    -1,\n      -1,    63,    64,    65,    66,    67,    68,    69,    70,    71,\n      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,\n      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,\n      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,\n     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,\n     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,\n     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,\n     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,\n     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,\n     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,\n     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,\n     172,   173,   174,   175,   176,   177,   178,   179,   180,    -1,\n     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,\n     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,\n     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,\n     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,\n     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,\n     232,   233,   234,   235,   236,   237,   238,   239,   240,   241,\n     242,   243,   244,   245,   246,   247,   248,   249,   250,   251,\n     252,   253,   254,   255,   256,   257,   258,   259,   260,   261,\n     262,   263,   264,   265,   266,   267,   268,   269,   270,   271,\n     272,   273,   274,   275,   276,   277,   278,   279,   280,   281,\n     282,   283,   284,   285,   286,   287,   288,   289,   290,   291,\n     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,\n     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,\n     312,   313,   314,   315,   316,   317,   318,   319,   320,   321,\n     322,   323,   324,   325,   326,   327,   328,   329,   330,   331,\n     332,   333,   334,    -1,    -1,    -1,    -1,    -1,    -1,   341,\n      -1,    -1,    -1,   345,   346,   347,    -1,    -1,   350,   351,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,   369,   370,    -1,\n      -1,    -1,   374,   375,    -1,    -1,    -1,    -1,    -1,   381,\n     382,   383,   384,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n     402,   403,   404,   405,   406,   407,    -1,    -1,    -1,    -1,\n     412,   413,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,   436,   437,   438,   439,   440,   441,\n     442,   443,    -1,    -1,   446,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,   459,     4,     5,\n       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,\n      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,\n      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,\n      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,\n      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,\n      56,    57,    58,    59,    60,    -1,    -1,    63,    64,    65,\n      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,\n      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,\n      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,\n      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,\n     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,\n     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,\n     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,\n     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,\n     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,\n     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,\n     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,\n     176,   177,   178,   179,   180,    -1,   182,   183,   184,   185,\n     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,\n     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,\n     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,\n     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,\n     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,\n     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,\n     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,\n     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,\n     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,\n     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,\n     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,\n     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,\n     306,   307,   308,   309,   310,   311,   312,   313,   314,   315,\n     316,   317,   318,   319,   320,   321,   322,   323,   324,   325,\n     326,   327,   328,   329,   330,   331,   332,   333,   334,    -1,\n      -1,    -1,    -1,    -1,    -1,   341,    -1,    -1,    -1,   345,\n     346,   347,    -1,    -1,   350,   351,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,   369,   370,    -1,    -1,   373,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,   381,   382,   383,   384,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,   402,   403,   404,   405,\n     406,   407,    -1,    -1,    -1,    -1,   412,   413,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n     436,   437,   438,   439,   440,   441,   442,   443,    -1,    -1,\n     446,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,   459,     4,     5,     6,     7,     8,     9,\n      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,\n      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,\n      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,\n      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,\n      50,    51,    52,    53,    54,    55,    56,    57,    58,    59,\n      60,    -1,    -1,    63,    64,    65,    66,    67,    68,    69,\n      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,\n      80,    81,    82,    83,    84,    85,    86,    87,    88,    89,\n      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,\n     100,   101,   102,   103,   104,   105,   106,   107,   108,   109,\n     110,   111,   112,   113,   114,   115,   116,   117,   118,   119,\n     120,   121,   122,   123,   124,   125,   126,   127,   128,   129,\n     130,   131,   132,   133,   134,   135,   136,   137,   138,   139,\n     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,\n     150,   151,   152,   153,   154,   155,   156,   157,   158,   159,\n     160,   161,   162,   163,   164,   165,   166,   167,   168,   169,\n     170,   171,   172,   173,   174,   175,   176,   177,   178,   179,\n     180,    -1,   182,   183,   184,   185,   186,   187,   188,   189,\n     190,   191,   192,   193,   194,   195,   196,   197,   198,   199,\n     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,\n     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,\n     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,\n     230,   231,   232,   233,   234,   235,   236,   237,   238,   239,\n     240,   241,   242,   243,   244,   245,   246,   247,   248,   249,\n     250,   251,   252,   253,   254,   255,   256,   257,   258,   259,\n     260,   261,   262,   263,   264,   265,   266,   267,   268,   269,\n     270,   271,   272,   273,   274,   275,   276,   277,   278,   279,\n     280,   281,   282,   283,   284,   285,   286,   287,   288,   289,\n     290,   291,   292,   293,   294,   295,   296,   297,   298,   299,\n     300,   301,   302,   303,   304,   305,   306,   307,   308,   309,\n     310,   311,   312,   313,   314,   315,   316,   317,   318,   319,\n     320,   321,   322,   323,   324,   325,   326,   327,   328,   329,\n     330,   331,   332,   333,   334,    -1,    -1,    -1,    -1,    -1,\n      -1,   341,    -1,    -1,    -1,   345,   346,   347,    -1,    -1,\n     350,   351,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   369,\n     370,    -1,    -1,    -1,   374,    -1,    -1,    -1,    -1,    -1,\n      -1,   381,   382,   383,   384,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,   402,   403,   404,   405,   406,   407,    -1,    -1,\n      -1,    -1,   412,   413,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,   436,   437,   438,   439,\n     440,   441,   442,   443,    -1,    -1,   446,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   459,\n       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,\n      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,\n      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,\n      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,\n      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,\n      54,    55,    56,    57,    58,    59,    60,    -1,    -1,    63,\n      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,\n      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,\n      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,\n      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,\n     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,\n     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,\n     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,\n     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,\n     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,\n     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,\n     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,\n     174,   175,   176,   177,   178,   179,   180,    -1,   182,   183,\n     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,\n     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,\n     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,\n     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,\n     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,\n     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,\n     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,\n     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,\n     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,\n     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,\n     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,\n     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,\n     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,\n     314,   315,   316,   317,   318,   319,   320,   321,   322,   323,\n     324,   325,   326,   327,   328,   329,   330,   331,   332,   333,\n     334,    -1,    -1,    -1,    -1,    -1,    -1,   341,    -1,    -1,\n      -1,   345,   346,   347,    -1,    -1,   350,   351,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,   369,   370,    -1,    -1,   373,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,   381,   382,   383,\n     384,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   402,   403,\n     404,   405,   406,   407,    -1,    -1,    -1,    -1,   412,   413,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,   436,   437,   438,   439,   440,   441,   442,   443,\n      -1,    -1,   446,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,   459,     4,     5,     6,     7,\n       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,\n      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,\n      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,\n      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,\n      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,\n      58,    59,    60,    -1,    -1,    63,    64,    65,    66,    67,\n      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,\n      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,\n      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,\n      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,\n     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,\n     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,\n     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,\n     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,\n     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,\n     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,\n     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,\n     178,   179,   180,    -1,   182,   183,   184,   185,   186,   187,\n     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,\n     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,\n     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,\n     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,\n     228,   229,   230,   231,   232,   233,   234,   235,   236,   237,\n     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,\n     248,   249,   250,   251,   252,   253,   254,   255,   256,   257,\n     258,   259,   260,   261,   262,   263,   264,   265,   266,   267,\n     268,   269,   270,   271,   272,   273,   274,   275,   276,   277,\n     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,\n     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,\n     298,   299,   300,   301,   302,   303,   304,   305,   306,   307,\n     308,   309,   310,   311,   312,   313,   314,   315,   316,   317,\n     318,   319,   320,   321,   322,   323,   324,   325,   326,   327,\n     328,   329,   330,   331,   332,   333,   334,    -1,    -1,    -1,\n      -1,    -1,    -1,   341,    -1,    -1,    -1,   345,   346,   347,\n      -1,    -1,   350,   351,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,   369,   370,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,   380,   381,   382,   383,   384,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,   402,   403,   404,   405,   406,   407,\n      -1,    -1,    -1,    -1,   412,   413,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   436,   437,\n     438,   439,   440,   441,   442,   443,    -1,    -1,   446,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,   459,     4,     5,     6,     7,     8,     9,    10,    11,\n      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,\n      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,\n      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,\n      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,\n      52,    53,    54,    55,    56,    57,    58,    59,    60,    -1,\n      -1,    63,    64,    65,    66,    67,    68,    69,    70,    71,\n      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,\n      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,\n      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,\n     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,\n     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,\n     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,\n     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,\n     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,\n     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,\n     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,\n     172,   173,   174,   175,   176,   177,   178,   179,   180,    -1,\n     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,\n     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,\n     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,\n     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,\n     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,\n     232,   233,   234,   235,   236,   237,   238,   239,   240,   241,\n     242,   243,   244,   245,   246,   247,   248,   249,   250,   251,\n     252,   253,   254,   255,   256,   257,   258,   259,   260,   261,\n     262,   263,   264,   265,   266,   267,   268,   269,   270,   271,\n     272,   273,   274,   275,   276,   277,   278,   279,   280,   281,\n     282,   283,   284,   285,   286,   287,   288,   289,   290,   291,\n     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,\n     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,\n     312,   313,   314,   315,   316,   317,   318,   319,   320,   321,\n     322,   323,   324,   325,   326,   327,   328,   329,   330,   331,\n     332,   333,   334,    -1,    -1,    -1,    -1,    -1,    -1,   341,\n      -1,    -1,    -1,   345,   346,   347,    -1,    -1,   350,   351,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,   369,   370,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   381,\n     382,   383,   384,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n     402,   403,   404,   405,   406,   407,    -1,    -1,    -1,    -1,\n     412,   413,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,   436,   437,   438,   439,   440,   441,\n     442,   443,    -1,    -1,   446,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,   459,     4,     5,\n       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,\n      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,\n      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,\n      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,\n      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,\n      56,    57,    58,    59,    60,    -1,    -1,    63,    64,    65,\n      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,\n      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,\n      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,\n      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,\n     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,\n     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,\n     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,\n     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,\n     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,\n     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,\n     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,\n     176,   177,   178,   179,   180,    -1,   182,   183,   184,   185,\n     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,\n     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,\n     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,\n     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,\n     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,\n     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,\n     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,\n     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,\n     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,\n     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,\n     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,\n     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,\n     306,   307,   308,   309,   310,   311,   312,   313,   314,   315,\n     316,   317,   318,   319,   320,   321,   322,   323,   324,   325,\n     326,   327,   328,   329,   330,   331,   332,   333,   334,    -1,\n      -1,    -1,    -1,    -1,    -1,   341,    -1,    -1,    -1,   345,\n     346,   347,    -1,    -1,   350,   351,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,   369,   370,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,   381,   382,   383,   384,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,   402,   403,   404,   405,\n     406,   407,    -1,    -1,    -1,    -1,   412,   413,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n     436,   437,   438,   439,   440,   441,   442,   443,    -1,    -1,\n     446,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,   459,     4,     5,     6,     7,     8,     9,\n      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,\n      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,\n      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,\n      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,\n      50,    51,    52,    53,    54,    55,    56,    57,    58,    59,\n      60,    -1,    -1,    63,    64,    65,    66,    67,    68,    69,\n      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,\n      80,    81,    82,    83,    84,    85,    86,    87,    88,    89,\n      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,\n     100,   101,   102,   103,   104,   105,   106,   107,   108,   109,\n     110,   111,   112,   113,   114,   115,   116,   117,   118,   119,\n     120,   121,   122,   123,   124,   125,   126,   127,   128,   129,\n     130,   131,   132,   133,   134,   135,   136,   137,   138,   139,\n     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,\n     150,   151,   152,   153,   154,   155,   156,   157,   158,   159,\n     160,   161,   162,   163,   164,   165,   166,   167,   168,   169,\n     170,   171,   172,   173,   174,   175,   176,   177,   178,   179,\n     180,    -1,   182,   183,   184,   185,   186,   187,   188,   189,\n     190,   191,   192,   193,   194,   195,   196,   197,   198,   199,\n     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,\n     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,\n     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,\n     230,   231,   232,   233,   234,   235,   236,   237,   238,   239,\n     240,   241,   242,   243,   244,   245,   246,   247,   248,   249,\n     250,   251,   252,   253,   254,   255,   256,   257,   258,   259,\n     260,   261,   262,   263,   264,   265,   266,   267,   268,   269,\n     270,   271,   272,   273,   274,   275,   276,   277,   278,   279,\n     280,   281,   282,   283,   284,   285,   286,   287,   288,   289,\n     290,   291,   292,   293,   294,   295,   296,   297,   298,   299,\n     300,   301,   302,   303,   304,   305,   306,   307,   308,   309,\n     310,   311,   312,   313,   314,   315,   316,   317,   318,   319,\n     320,   321,   322,   323,   324,   325,   326,   327,   328,   329,\n     330,   331,   332,   333,   334,    -1,    -1,    -1,    -1,    -1,\n      -1,   341,    -1,    -1,    -1,   345,   346,   347,    -1,    -1,\n     350,   351,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   369,\n     370,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,   381,   382,   383,   384,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,   402,   403,   404,   405,   406,   407,    -1,    -1,\n      -1,    -1,   412,   413,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,   436,   437,   438,   439,\n     440,   441,   442,   443,    -1,    -1,   446,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   459,\n       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,\n      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,\n      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,\n      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,\n      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,\n      54,    55,    56,    57,    58,    59,    60,    -1,    -1,    63,\n      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,\n      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,\n      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,\n      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,\n     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,\n     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,\n     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,\n     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,\n     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,\n     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,\n     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,\n     174,   175,   176,   177,   178,   179,   180,    -1,   182,   183,\n     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,\n     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,\n     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,\n     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,\n     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,\n     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,\n     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,\n     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,\n     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,\n     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,\n     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,\n     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,\n     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,\n     314,   315,   316,   317,   318,   319,   320,   321,   322,   323,\n     324,   325,   326,   327,   328,   329,   330,   331,   332,   333,\n     334,    -1,    -1,    -1,    -1,    -1,    -1,   341,    -1,    -1,\n      -1,   345,   346,   347,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,   407,    -1,    -1,    -1,    -1,   412,   413,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,\n      -1,    -1,   446\n};\n\n/* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of\n   state STATE-NUM.  */\nstatic const yytype_int16 yystos[] =\n{\n       0,     3,     4,     5,     6,     7,     8,     9,    10,    11,\n      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,\n      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,\n      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,\n      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,\n      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,\n      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,\n      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,\n      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,\n      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,\n     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,\n     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,\n     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,\n     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,\n     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,\n     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,\n     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,\n     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,\n     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,\n     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,\n     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,\n     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,\n     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,\n     232,   233,   234,   235,   236,   237,   238,   239,   240,   241,\n     242,   243,   244,   245,   246,   247,   248,   249,   250,   251,\n     252,   253,   254,   255,   256,   257,   258,   259,   260,   261,\n     262,   263,   264,   265,   266,   267,   268,   269,   270,   271,\n     272,   273,   274,   275,   276,   277,   278,   279,   280,   281,\n     282,   283,   284,   285,   286,   287,   288,   289,   290,   291,\n     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,\n     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,\n     312,   313,   314,   315,   316,   317,   318,   319,   320,   321,\n     322,   323,   324,   325,   326,   327,   328,   329,   330,   331,\n     332,   333,   334,   335,   336,   337,   338,   339,   340,   341,\n     342,   343,   344,   345,   346,   347,   372,   380,   394,   395,\n     396,   397,   398,   407,   408,   409,   410,   411,   412,   413,\n     429,   430,   431,   432,   433,   434,   435,   444,   446,   447,\n     448,   449,   450,   451,   452,   453,   454,   455,   456,   457,\n     458,   459,   460,   461,   462,   463,   464,   465,   466,   467,\n     468,   469,   470,   471,   472,   473,   474,   475,   476,   477,\n     478,   479,   480,   481,   513,   514,   517,   518,   519,   520,\n     524,   525,   526,   527,   528,   529,   532,   533,   534,   535,\n     536,   538,   543,   544,   545,   586,   587,   588,   590,   597,\n     601,   602,   608,   611,   370,   370,   370,   370,   370,   370,\n     370,   370,   372,   544,   374,   406,   370,   370,   380,   406,\n     380,   589,   371,   377,   521,   522,   523,   533,   538,   377,\n     380,   406,   380,   406,   534,   538,   388,   540,   541,     0,\n     587,   518,   526,   533,   380,   517,   406,   593,   594,   612,\n     613,   403,   406,   593,   403,   593,   403,   593,   403,   593,\n     403,   593,   593,   612,   403,   593,   406,   591,   592,   538,\n     547,   374,   406,   430,   530,   531,   406,   537,   372,   380,\n     539,   374,   565,   590,   522,   521,   523,   406,   406,   370,\n     379,   539,   374,   377,   380,   516,   350,   351,   369,   370,\n     381,   382,   383,   384,   402,   403,   404,   405,   406,   436,\n     437,   438,   439,   440,   441,   442,   443,   483,   484,   485,\n     487,   488,   489,   490,   491,   492,   493,   494,   495,   536,\n     538,   542,   539,   371,   406,   380,   379,   377,   371,   377,\n     371,   377,   379,   377,   377,   377,   371,   377,   377,   377,\n     377,   377,   377,   377,   371,   377,   371,   377,   370,   373,\n     377,   380,   533,   538,   548,   549,   546,   379,   371,   377,\n     371,   377,   373,   494,   496,   497,   498,   499,   500,   501,\n     502,   503,   504,   505,   506,   507,   538,   372,   380,   374,\n     375,   380,   414,   415,   416,   417,   419,   420,   421,   422,\n     423,   424,   425,   426,   427,   428,   445,   494,   507,   509,\n     511,   513,   517,   536,   538,   554,   555,   556,   557,   558,\n     566,   567,   568,   569,   572,   573,   576,   577,   578,   585,\n     590,   539,   379,   539,   374,   509,   552,   379,   515,   406,\n     377,   380,   494,   494,   511,   350,   351,   372,   376,   371,\n     371,   377,   413,   509,   370,   494,   377,   389,   590,   369,\n     372,   403,   594,   612,   406,   613,   369,   402,   403,   404,\n     405,   598,   599,   403,   507,   512,   600,   403,   402,   403,\n     404,   405,   603,   604,   403,   402,   403,   404,   405,   483,\n     605,   606,   403,   369,   607,   403,   612,   406,   512,   543,\n     609,   610,   403,   512,   373,   592,   538,   406,   550,   551,\n     375,   549,   548,   512,   531,   406,   385,   386,   387,   382,\n     384,   348,   349,   352,   353,   388,   389,   354,   355,   392,\n     391,   390,   356,   358,   357,   393,   373,   373,   507,   375,\n     559,   370,   380,   380,   580,   370,   370,   380,   380,   511,\n     370,   511,   378,   380,   380,   380,   380,   359,   360,   361,\n     362,   363,   364,   365,   366,   367,   368,   379,   510,   377,\n     380,   375,   555,   569,   573,   578,   552,   379,   375,   552,\n     553,   552,   548,   406,   371,   486,   511,   406,   509,   494,\n     369,   403,   595,   596,   371,   379,   371,   377,   371,   377,\n     371,   377,   377,   371,   377,   371,   377,   371,   377,   377,\n     371,   377,   377,   371,   377,   371,   377,   371,   371,   550,\n     539,   377,   380,   375,   494,   494,   494,   496,   496,   497,\n     497,   498,   498,   498,   498,   499,   499,   500,   501,   502,\n     503,   504,   505,   508,   373,   566,   579,   555,   581,   511,\n     380,   511,   378,   509,   509,   552,   375,   377,   375,   373,\n     373,   377,   373,   377,   599,   598,   512,   600,   604,   603,\n     606,   605,   369,   607,   609,   610,   380,   551,   511,   560,\n     511,   526,   571,   414,   554,   567,   582,   371,   371,   375,\n     552,   369,   403,   371,   371,   371,   371,   371,   371,   378,\n     375,   406,   371,   370,   571,   583,   584,   562,   563,   564,\n     570,   574,   509,   379,   556,   561,   565,   511,   380,   371,\n     418,   558,   556,   374,   552,   371,   511,   561,   562,   566,\n     575,   380,   375\n};\n\n/* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM.  */\nstatic const yytype_int16 yyr1[] =\n{\n       0,   482,   483,   484,   484,   484,   484,   484,   484,   484,\n     484,   484,   484,   484,   484,   484,   484,   484,   485,   485,\n     485,   485,   485,   485,   486,   487,   488,   489,   489,   490,\n     490,   491,   491,   492,   493,   493,   493,   494,   494,   494,\n     494,   495,   495,   495,   495,   496,   496,   496,   496,   497,\n     497,   497,   498,   498,   498,   499,   499,   499,   499,   499,\n     500,   500,   500,   501,   501,   502,   502,   503,   503,   504,\n     504,   505,   505,   506,   506,   507,   508,   507,   509,   509,\n     510,   510,   510,   510,   510,   510,   510,   510,   510,   510,\n     510,   511,   511,   512,   513,   513,   513,   513,   513,   513,\n     513,   513,   513,   513,   513,   515,   514,   516,   516,   517,\n     517,   517,   517,   518,   518,   519,   519,   520,   521,   521,\n     522,   522,   522,   522,   523,   524,   524,   524,   524,   524,\n     525,   525,   525,   525,   525,   526,   526,   527,   528,   528,\n     528,   528,   528,   528,   528,   528,   528,   528,   529,   530,\n     530,   531,   531,   531,   532,   533,   533,   534,   534,   534,\n     534,   534,   534,   534,   534,   534,   534,   534,   535,   535,\n     535,   535,   535,   535,   535,   535,   535,   535,   535,   535,\n     535,   535,   535,   535,   535,   535,   535,   535,   535,   535,\n     535,   535,   535,   535,   535,   535,   535,   535,   535,   535,\n     535,   535,   535,   535,   535,   535,   535,   536,   537,   537,\n     538,   538,   539,   539,   539,   539,   540,   540,   541,   542,\n     542,   542,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   543,   543,\n     543,   543,   543,   543,   543,   543,   543,   543,   544,   544,\n     544,   546,   545,   547,   545,   548,   548,   549,   549,   550,\n     550,   551,   551,   552,   552,   552,   552,   553,   553,   554,\n     555,   555,   556,   556,   556,   556,   556,   556,   556,   556,\n     557,   558,   559,   560,   558,   561,   561,   563,   562,   564,\n     562,   565,   565,   566,   566,   567,   567,   568,   568,   569,\n     570,   570,   571,   571,   572,   572,   574,   573,   575,   575,\n     576,   576,   577,   577,   579,   578,   580,   578,   581,   578,\n     582,   582,   583,   583,   584,   584,   585,   585,   585,   585,\n     585,   585,   585,   585,   586,   586,   587,   587,   587,   589,\n     588,   590,   591,   591,   592,   592,   593,   593,   594,   594,\n     595,   595,   596,   596,   597,   597,   597,   597,   597,   597,\n     598,   598,   599,   599,   599,   599,   599,   600,   600,   601,\n     601,   602,   602,   602,   602,   602,   602,   602,   602,   603,\n     603,   604,   604,   604,   604,   605,   605,   606,   606,   606,\n     606,   606,   607,   607,   608,   608,   608,   608,   609,   609,\n     610,   610,   611,   611,   612,   612,   613,   613\n};\n\n/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM.  */\nstatic const yytype_int8 yyr2[] =\n{\n       0,     2,     1,     1,     3,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     4,\n       1,     3,     2,     2,     1,     1,     1,     2,     2,     2,\n       1,     2,     3,     2,     1,     1,     1,     1,     2,     2,\n       2,     1,     1,     1,     1,     1,     3,     3,     3,     1,\n       3,     3,     1,     3,     3,     1,     3,     3,     3,     3,\n       1,     3,     3,     1,     3,     1,     3,     1,     3,     1,\n       3,     1,     3,     1,     3,     1,     0,     6,     1,     3,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     3,     1,     2,     3,     2,     2,     4,     2,\n       3,     4,     2,     3,     4,     0,     6,     2,     3,     2,\n       3,     3,     4,     1,     1,     2,     3,     3,     2,     3,\n       2,     1,     2,     1,     1,     1,     3,     4,     6,     5,\n       1,     2,     3,     5,     4,     1,     2,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     4,     1,\n       3,     1,     3,     1,     1,     1,     2,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     4,     1,     1,     1,     3,\n       2,     3,     2,     3,     3,     4,     1,     0,     3,     1,\n       1,     3,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       1,     0,     6,     0,     5,     1,     2,     3,     4,     1,\n       3,     1,     2,     1,     3,     4,     2,     1,     3,     1,\n       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,\n       2,     2,     0,     0,     5,     1,     1,     0,     2,     0,\n       2,     2,     3,     1,     2,     1,     2,     1,     2,     5,\n       3,     1,     1,     4,     1,     2,     0,     8,     0,     1,\n       3,     2,     1,     2,     0,     6,     0,     8,     0,     7,\n       1,     1,     1,     0,     2,     3,     2,     2,     2,     3,\n       2,     2,     2,     2,     1,     2,     1,     1,     1,     0,\n       3,     5,     1,     3,     1,     4,     1,     3,     5,     5,\n       1,     3,     1,     3,     4,     6,     6,     8,     6,     8,\n       1,     3,     1,     1,     1,     1,     1,     1,     3,     4,\n       6,     4,     6,     6,     8,     6,     8,     6,     8,     1,\n       3,     1,     1,     1,     1,     1,     3,     1,     1,     1,\n       1,     1,     1,     3,     6,     8,     4,     6,     1,     3,\n       1,     1,     4,     6,     1,     3,     3,     3\n};\n\n\nenum { YYENOMEM = -2 };\n\n#define yyerrok         (yyerrstatus = 0)\n#define yyclearin       (yychar = YYEMPTY)\n\n#define YYACCEPT        goto yyacceptlab\n#define YYABORT         goto yyabortlab\n#define YYERROR         goto yyerrorlab\n#define YYNOMEM         goto yyexhaustedlab\n\n\n#define YYRECOVERING()  (!!yyerrstatus)\n\n#define YYBACKUP(Token, Value)                                    \\\n  do                                                              \\\n    if (yychar == YYEMPTY)                                        \\\n      {                                                           \\\n        yychar = (Token);                                         \\\n        yylval = (Value);                                         \\\n        YYPOPSTACK (yylen);                                       \\\n        yystate = *yyssp;                                         \\\n        goto yybackup;                                            \\\n      }                                                           \\\n    else                                                          \\\n      {                                                           \\\n        yyerror (pParseContext, YY_(\"syntax error: cannot back up\")); \\\n        YYERROR;                                                  \\\n      }                                                           \\\n  while (0)\n\n/* Backward compatibility with an undocumented macro.\n   Use YYerror or YYUNDEF. */\n#define YYERRCODE YYUNDEF\n\n\n/* Enable debugging if requested.  */\n#if YYDEBUG\n\n# ifndef YYFPRINTF\n#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */\n#  define YYFPRINTF fprintf\n# endif\n\n# define YYDPRINTF(Args)                        \\\ndo {                                            \\\n  if (yydebug)                                  \\\n    YYFPRINTF Args;                             \\\n} while (0)\n\n\n\n\n# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)                    \\\ndo {                                                                      \\\n  if (yydebug)                                                            \\\n    {                                                                     \\\n      YYFPRINTF (stderr, \"%s \", Title);                                   \\\n      yy_symbol_print (stderr,                                            \\\n                  Kind, Value, pParseContext); \\\n      YYFPRINTF (stderr, \"\\n\");                                           \\\n    }                                                                     \\\n} while (0)\n\n\n/*-----------------------------------.\n| Print this symbol's value on YYO.  |\n`-----------------------------------*/\n\nstatic void\nyy_symbol_value_print (FILE *yyo,\n                       yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, glslang::TParseContext* pParseContext)\n{\n  FILE *yyoutput = yyo;\n  YY_USE (yyoutput);\n  YY_USE (pParseContext);\n  if (!yyvaluep)\n    return;\n  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN\n  YY_USE (yykind);\n  YY_IGNORE_MAYBE_UNINITIALIZED_END\n}\n\n\n/*---------------------------.\n| Print this symbol on YYO.  |\n`---------------------------*/\n\nstatic void\nyy_symbol_print (FILE *yyo,\n                 yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, glslang::TParseContext* pParseContext)\n{\n  YYFPRINTF (yyo, \"%s %s (\",\n             yykind < YYNTOKENS ? \"token\" : \"nterm\", yysymbol_name (yykind));\n\n  yy_symbol_value_print (yyo, yykind, yyvaluep, pParseContext);\n  YYFPRINTF (yyo, \")\");\n}\n\n/*------------------------------------------------------------------.\n| yy_stack_print -- Print the state stack from its BOTTOM up to its |\n| TOP (included).                                                   |\n`------------------------------------------------------------------*/\n\nstatic void\nyy_stack_print (yy_state_t *yybottom, yy_state_t *yytop)\n{\n  YYFPRINTF (stderr, \"Stack now\");\n  for (; yybottom <= yytop; yybottom++)\n    {\n      int yybot = *yybottom;\n      YYFPRINTF (stderr, \" %d\", yybot);\n    }\n  YYFPRINTF (stderr, \"\\n\");\n}\n\n# define YY_STACK_PRINT(Bottom, Top)                            \\\ndo {                                                            \\\n  if (yydebug)                                                  \\\n    yy_stack_print ((Bottom), (Top));                           \\\n} while (0)\n\n\n/*------------------------------------------------.\n| Report that the YYRULE is going to be reduced.  |\n`------------------------------------------------*/\n\nstatic void\nyy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp,\n                 int yyrule, glslang::TParseContext* pParseContext)\n{\n  int yylno = yyrline[yyrule];\n  int yynrhs = yyr2[yyrule];\n  int yyi;\n  YYFPRINTF (stderr, \"Reducing stack by rule %d (line %d):\\n\",\n             yyrule - 1, yylno);\n  /* The symbols being reduced.  */\n  for (yyi = 0; yyi < yynrhs; yyi++)\n    {\n      YYFPRINTF (stderr, \"   $%d = \", yyi + 1);\n      yy_symbol_print (stderr,\n                       YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]),\n                       &yyvsp[(yyi + 1) - (yynrhs)], pParseContext);\n      YYFPRINTF (stderr, \"\\n\");\n    }\n}\n\n# define YY_REDUCE_PRINT(Rule)          \\\ndo {                                    \\\n  if (yydebug)                          \\\n    yy_reduce_print (yyssp, yyvsp, Rule, pParseContext); \\\n} while (0)\n\n/* Nonzero means print parse trace.  It is left uninitialized so that\n   multiple parsers can coexist.  */\nint yydebug;\n#else /* !YYDEBUG */\n# define YYDPRINTF(Args) ((void) 0)\n# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)\n# define YY_STACK_PRINT(Bottom, Top)\n# define YY_REDUCE_PRINT(Rule)\n#endif /* !YYDEBUG */\n\n\n/* YYINITDEPTH -- initial size of the parser's stacks.  */\n#ifndef YYINITDEPTH\n# define YYINITDEPTH 200\n#endif\n\n/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only\n   if the built-in stack extension method is used).\n\n   Do not make this value too large; the results are undefined if\n   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)\n   evaluated with infinite-precision integer arithmetic.  */\n\n#ifndef YYMAXDEPTH\n# define YYMAXDEPTH 10000\n#endif\n\n\n/* Context of a parse error.  */\ntypedef struct\n{\n  yy_state_t *yyssp;\n  yysymbol_kind_t yytoken;\n} yypcontext_t;\n\n/* Put in YYARG at most YYARGN of the expected tokens given the\n   current YYCTX, and return the number of tokens stored in YYARG.  If\n   YYARG is null, return the number of expected tokens (guaranteed to\n   be less than YYNTOKENS).  Return YYENOMEM on memory exhaustion.\n   Return 0 if there are more than YYARGN expected tokens, yet fill\n   YYARG up to YYARGN. */\nstatic int\nyypcontext_expected_tokens (const yypcontext_t *yyctx,\n                            yysymbol_kind_t yyarg[], int yyargn)\n{\n  /* Actual size of YYARG. */\n  int yycount = 0;\n  int yyn = yypact[+*yyctx->yyssp];\n  if (!yypact_value_is_default (yyn))\n    {\n      /* Start YYX at -YYN if negative to avoid negative indexes in\n         YYCHECK.  In other words, skip the first -YYN actions for\n         this state because they are default actions.  */\n      int yyxbegin = yyn < 0 ? -yyn : 0;\n      /* Stay within bounds of both yycheck and yytname.  */\n      int yychecklim = YYLAST - yyn + 1;\n      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;\n      int yyx;\n      for (yyx = yyxbegin; yyx < yyxend; ++yyx)\n        if (yycheck[yyx + yyn] == yyx && yyx != YYSYMBOL_YYerror\n            && !yytable_value_is_error (yytable[yyx + yyn]))\n          {\n            if (!yyarg)\n              ++yycount;\n            else if (yycount == yyargn)\n              return 0;\n            else\n              yyarg[yycount++] = YY_CAST (yysymbol_kind_t, yyx);\n          }\n    }\n  if (yyarg && yycount == 0 && 0 < yyargn)\n    yyarg[0] = YYSYMBOL_YYEMPTY;\n  return yycount;\n}\n\n\n\n\n#ifndef yystrlen\n# if defined __GLIBC__ && defined _STRING_H\n#  define yystrlen(S) (YY_CAST (YYPTRDIFF_T, strlen (S)))\n# else\n/* Return the length of YYSTR.  */\nstatic YYPTRDIFF_T\nyystrlen (const char *yystr)\n{\n  YYPTRDIFF_T yylen;\n  for (yylen = 0; yystr[yylen]; yylen++)\n    continue;\n  return yylen;\n}\n# endif\n#endif\n\n#ifndef yystpcpy\n# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE\n#  define yystpcpy stpcpy\n# else\n/* Copy YYSRC to YYDEST, returning the address of the terminating '\\0' in\n   YYDEST.  */\nstatic char *\nyystpcpy (char *yydest, const char *yysrc)\n{\n  char *yyd = yydest;\n  const char *yys = yysrc;\n\n  while ((*yyd++ = *yys++) != '\\0')\n    continue;\n\n  return yyd - 1;\n}\n# endif\n#endif\n\n#ifndef yytnamerr\n/* Copy to YYRES the contents of YYSTR after stripping away unnecessary\n   quotes and backslashes, so that it's suitable for yyerror.  The\n   heuristic is that double-quoting is unnecessary unless the string\n   contains an apostrophe, a comma, or backslash (other than\n   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is\n   null, do not copy; instead, return the length of what the result\n   would have been.  */\nstatic YYPTRDIFF_T\nyytnamerr (char *yyres, const char *yystr)\n{\n  if (*yystr == '\"')\n    {\n      YYPTRDIFF_T yyn = 0;\n      char const *yyp = yystr;\n      for (;;)\n        switch (*++yyp)\n          {\n          case '\\'':\n          case ',':\n            goto do_not_strip_quotes;\n\n          case '\\\\':\n            if (*++yyp != '\\\\')\n              goto do_not_strip_quotes;\n            else\n              goto append;\n\n          append:\n          default:\n            if (yyres)\n              yyres[yyn] = *yyp;\n            yyn++;\n            break;\n\n          case '\"':\n            if (yyres)\n              yyres[yyn] = '\\0';\n            return yyn;\n          }\n    do_not_strip_quotes: ;\n    }\n\n  if (yyres)\n    return yystpcpy (yyres, yystr) - yyres;\n  else\n    return yystrlen (yystr);\n}\n#endif\n\n\nstatic int\nyy_syntax_error_arguments (const yypcontext_t *yyctx,\n                           yysymbol_kind_t yyarg[], int yyargn)\n{\n  /* Actual size of YYARG. */\n  int yycount = 0;\n  /* There are many possibilities here to consider:\n     - If this state is a consistent state with a default action, then\n       the only way this function was invoked is if the default action\n       is an error action.  In that case, don't check for expected\n       tokens because there are none.\n     - The only way there can be no lookahead present (in yychar) is if\n       this state is a consistent state with a default action.  Thus,\n       detecting the absence of a lookahead is sufficient to determine\n       that there is no unexpected or expected token to report.  In that\n       case, just report a simple \"syntax error\".\n     - Don't assume there isn't a lookahead just because this state is a\n       consistent state with a default action.  There might have been a\n       previous inconsistent state, consistent state with a non-default\n       action, or user semantic action that manipulated yychar.\n     - Of course, the expected token list depends on states to have\n       correct lookahead information, and it depends on the parser not\n       to perform extra reductions after fetching a lookahead from the\n       scanner and before detecting a syntax error.  Thus, state merging\n       (from LALR or IELR) and default reductions corrupt the expected\n       token list.  However, the list is correct for canonical LR with\n       one exception: it will still contain any token that will not be\n       accepted due to an error action in a later state.\n  */\n  if (yyctx->yytoken != YYSYMBOL_YYEMPTY)\n    {\n      int yyn;\n      if (yyarg)\n        yyarg[yycount] = yyctx->yytoken;\n      ++yycount;\n      yyn = yypcontext_expected_tokens (yyctx,\n                                        yyarg ? yyarg + 1 : yyarg, yyargn - 1);\n      if (yyn == YYENOMEM)\n        return YYENOMEM;\n      else\n        yycount += yyn;\n    }\n  return yycount;\n}\n\n/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message\n   about the unexpected token YYTOKEN for the state stack whose top is\n   YYSSP.\n\n   Return 0 if *YYMSG was successfully written.  Return -1 if *YYMSG is\n   not large enough to hold the message.  In that case, also set\n   *YYMSG_ALLOC to the required number of bytes.  Return YYENOMEM if the\n   required number of bytes is too large to store.  */\nstatic int\nyysyntax_error (YYPTRDIFF_T *yymsg_alloc, char **yymsg,\n                const yypcontext_t *yyctx)\n{\n  enum { YYARGS_MAX = 5 };\n  /* Internationalized format string. */\n  const char *yyformat = YY_NULLPTR;\n  /* Arguments of yyformat: reported tokens (one for the \"unexpected\",\n     one per \"expected\"). */\n  yysymbol_kind_t yyarg[YYARGS_MAX];\n  /* Cumulated lengths of YYARG.  */\n  YYPTRDIFF_T yysize = 0;\n\n  /* Actual size of YYARG. */\n  int yycount = yy_syntax_error_arguments (yyctx, yyarg, YYARGS_MAX);\n  if (yycount == YYENOMEM)\n    return YYENOMEM;\n\n  switch (yycount)\n    {\n#define YYCASE_(N, S)                       \\\n      case N:                               \\\n        yyformat = S;                       \\\n        break\n    default: /* Avoid compiler warnings. */\n      YYCASE_(0, YY_(\"syntax error\"));\n      YYCASE_(1, YY_(\"syntax error, unexpected %s\"));\n      YYCASE_(2, YY_(\"syntax error, unexpected %s, expecting %s\"));\n      YYCASE_(3, YY_(\"syntax error, unexpected %s, expecting %s or %s\"));\n      YYCASE_(4, YY_(\"syntax error, unexpected %s, expecting %s or %s or %s\"));\n      YYCASE_(5, YY_(\"syntax error, unexpected %s, expecting %s or %s or %s or %s\"));\n#undef YYCASE_\n    }\n\n  /* Compute error message size.  Don't count the \"%s\"s, but reserve\n     room for the terminator.  */\n  yysize = yystrlen (yyformat) - 2 * yycount + 1;\n  {\n    int yyi;\n    for (yyi = 0; yyi < yycount; ++yyi)\n      {\n        YYPTRDIFF_T yysize1\n          = yysize + yytnamerr (YY_NULLPTR, yytname[yyarg[yyi]]);\n        if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)\n          yysize = yysize1;\n        else\n          return YYENOMEM;\n      }\n  }\n\n  if (*yymsg_alloc < yysize)\n    {\n      *yymsg_alloc = 2 * yysize;\n      if (! (yysize <= *yymsg_alloc\n             && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))\n        *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;\n      return -1;\n    }\n\n  /* Avoid sprintf, as that infringes on the user's name space.\n     Don't have undefined behavior even if the translation\n     produced a string with the wrong number of \"%s\"s.  */\n  {\n    char *yyp = *yymsg;\n    int yyi = 0;\n    while ((*yyp = *yyformat) != '\\0')\n      if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)\n        {\n          yyp += yytnamerr (yyp, yytname[yyarg[yyi++]]);\n          yyformat += 2;\n        }\n      else\n        {\n          ++yyp;\n          ++yyformat;\n        }\n  }\n  return 0;\n}\n\n\n/*-----------------------------------------------.\n| Release the memory associated to this symbol.  |\n`-----------------------------------------------*/\n\nstatic void\nyydestruct (const char *yymsg,\n            yysymbol_kind_t yykind, YYSTYPE *yyvaluep, glslang::TParseContext* pParseContext)\n{\n  YY_USE (yyvaluep);\n  YY_USE (pParseContext);\n  if (!yymsg)\n    yymsg = \"Deleting\";\n  YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp);\n\n  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN\n  YY_USE (yykind);\n  YY_IGNORE_MAYBE_UNINITIALIZED_END\n}\n\n\n\n\n\n\n/*----------.\n| yyparse.  |\n`----------*/\n\nint\nyyparse (glslang::TParseContext* pParseContext)\n{\n/* Lookahead token kind.  */\nint yychar;\n\n\n/* The semantic value of the lookahead symbol.  */\n/* Default value used for initialization, for pacifying older GCCs\n   or non-GCC compilers.  */\nYY_INITIAL_VALUE (static YYSTYPE yyval_default;)\nYYSTYPE yylval YY_INITIAL_VALUE (= yyval_default);\n\n    /* Number of syntax errors so far.  */\n    int yynerrs = 0;\n\n    yy_state_fast_t yystate = 0;\n    /* Number of tokens to shift before error messages enabled.  */\n    int yyerrstatus = 0;\n\n    /* Refer to the stacks through separate pointers, to allow yyoverflow\n       to reallocate them elsewhere.  */\n\n    /* Their size.  */\n    YYPTRDIFF_T yystacksize = YYINITDEPTH;\n\n    /* The state stack: array, bottom, top.  */\n    yy_state_t yyssa[YYINITDEPTH];\n    yy_state_t *yyss = yyssa;\n    yy_state_t *yyssp = yyss;\n\n    /* The semantic value stack: array, bottom, top.  */\n    YYSTYPE yyvsa[YYINITDEPTH];\n    YYSTYPE *yyvs = yyvsa;\n    YYSTYPE *yyvsp = yyvs;\n\n  int yyn;\n  /* The return value of yyparse.  */\n  int yyresult;\n  /* Lookahead symbol kind.  */\n  yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY;\n  /* The variables used to return semantic value and location from the\n     action routines.  */\n  YYSTYPE yyval;\n\n  /* Buffer for error messages, and its allocated size.  */\n  char yymsgbuf[128];\n  char *yymsg = yymsgbuf;\n  YYPTRDIFF_T yymsg_alloc = sizeof yymsgbuf;\n\n#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))\n\n  /* The number of symbols on the RHS of the reduced rule.\n     Keep to zero when no symbol should be popped.  */\n  int yylen = 0;\n\n  YYDPRINTF ((stderr, \"Starting parse\\n\"));\n\n  yychar = YYEMPTY; /* Cause a token to be read.  */\n\n  goto yysetstate;\n\n\n/*------------------------------------------------------------.\n| yynewstate -- push a new state, which is found in yystate.  |\n`------------------------------------------------------------*/\nyynewstate:\n  /* In all cases, when you get here, the value and location stacks\n     have just been pushed.  So pushing a state here evens the stacks.  */\n  yyssp++;\n\n\n/*--------------------------------------------------------------------.\n| yysetstate -- set current state (the top of the stack) to yystate.  |\n`--------------------------------------------------------------------*/\nyysetstate:\n  YYDPRINTF ((stderr, \"Entering state %d\\n\", yystate));\n  YY_ASSERT (0 <= yystate && yystate < YYNSTATES);\n  YY_IGNORE_USELESS_CAST_BEGIN\n  *yyssp = YY_CAST (yy_state_t, yystate);\n  YY_IGNORE_USELESS_CAST_END\n  YY_STACK_PRINT (yyss, yyssp);\n\n  if (yyss + yystacksize - 1 <= yyssp)\n#if !defined yyoverflow && !defined YYSTACK_RELOCATE\n    YYNOMEM;\n#else\n    {\n      /* Get the current used size of the three stacks, in elements.  */\n      YYPTRDIFF_T yysize = yyssp - yyss + 1;\n\n# if defined yyoverflow\n      {\n        /* Give user a chance to reallocate the stack.  Use copies of\n           these so that the &'s don't force the real ones into\n           memory.  */\n        yy_state_t *yyss1 = yyss;\n        YYSTYPE *yyvs1 = yyvs;\n\n        /* Each stack pointer address is followed by the size of the\n           data in use in that stack, in bytes.  This used to be a\n           conditional around just the two extra args, but that might\n           be undefined if yyoverflow is a macro.  */\n        yyoverflow (YY_(\"memory exhausted\"),\n                    &yyss1, yysize * YYSIZEOF (*yyssp),\n                    &yyvs1, yysize * YYSIZEOF (*yyvsp),\n                    &yystacksize);\n        yyss = yyss1;\n        yyvs = yyvs1;\n      }\n# else /* defined YYSTACK_RELOCATE */\n      /* Extend the stack our own way.  */\n      if (YYMAXDEPTH <= yystacksize)\n        YYNOMEM;\n      yystacksize *= 2;\n      if (YYMAXDEPTH < yystacksize)\n        yystacksize = YYMAXDEPTH;\n\n      {\n        yy_state_t *yyss1 = yyss;\n        union yyalloc *yyptr =\n          YY_CAST (union yyalloc *,\n                   YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize))));\n        if (! yyptr)\n          YYNOMEM;\n        YYSTACK_RELOCATE (yyss_alloc, yyss);\n        YYSTACK_RELOCATE (yyvs_alloc, yyvs);\n#  undef YYSTACK_RELOCATE\n        if (yyss1 != yyssa)\n          YYSTACK_FREE (yyss1);\n      }\n# endif\n\n      yyssp = yyss + yysize - 1;\n      yyvsp = yyvs + yysize - 1;\n\n      YY_IGNORE_USELESS_CAST_BEGIN\n      YYDPRINTF ((stderr, \"Stack size increased to %ld\\n\",\n                  YY_CAST (long, yystacksize)));\n      YY_IGNORE_USELESS_CAST_END\n\n      if (yyss + yystacksize - 1 <= yyssp)\n        YYABORT;\n    }\n#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */\n\n\n  if (yystate == YYFINAL)\n    YYACCEPT;\n\n  goto yybackup;\n\n\n/*-----------.\n| yybackup.  |\n`-----------*/\nyybackup:\n  /* Do appropriate processing given the current state.  Read a\n     lookahead token if we need one and don't already have one.  */\n\n  /* First try to decide what to do without reference to lookahead token.  */\n  yyn = yypact[yystate];\n  if (yypact_value_is_default (yyn))\n    goto yydefault;\n\n  /* Not known => get a lookahead token if don't already have one.  */\n\n  /* YYCHAR is either empty, or end-of-input, or a valid lookahead.  */\n  if (yychar == YYEMPTY)\n    {\n      YYDPRINTF ((stderr, \"Reading a token\\n\"));\n      yychar = yylex (&yylval, parseContext);\n    }\n\n  if (yychar <= YYEOF)\n    {\n      yychar = YYEOF;\n      yytoken = YYSYMBOL_YYEOF;\n      YYDPRINTF ((stderr, \"Now at end of input.\\n\"));\n    }\n  else if (yychar == YYerror)\n    {\n      /* The scanner already issued an error message, process directly\n         to error recovery.  But do not keep the error token as\n         lookahead, it is too special and may lead us to an endless\n         loop in error recovery. */\n      yychar = YYUNDEF;\n      yytoken = YYSYMBOL_YYerror;\n      goto yyerrlab1;\n    }\n  else\n    {\n      yytoken = YYTRANSLATE (yychar);\n      YY_SYMBOL_PRINT (\"Next token is\", yytoken, &yylval, &yylloc);\n    }\n\n  /* If the proper action on seeing token YYTOKEN is to reduce or to\n     detect an error, take that action.  */\n  yyn += yytoken;\n  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)\n    goto yydefault;\n  yyn = yytable[yyn];\n  if (yyn <= 0)\n    {\n      if (yytable_value_is_error (yyn))\n        goto yyerrlab;\n      yyn = -yyn;\n      goto yyreduce;\n    }\n\n  /* Count tokens shifted since error; after three, turn off error\n     status.  */\n  if (yyerrstatus)\n    yyerrstatus--;\n\n  /* Shift the lookahead token.  */\n  YY_SYMBOL_PRINT (\"Shifting\", yytoken, &yylval, &yylloc);\n  yystate = yyn;\n  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN\n  *++yyvsp = yylval;\n  YY_IGNORE_MAYBE_UNINITIALIZED_END\n\n  /* Discard the shifted token.  */\n  yychar = YYEMPTY;\n  goto yynewstate;\n\n\n/*-----------------------------------------------------------.\n| yydefault -- do the default action for the current state.  |\n`-----------------------------------------------------------*/\nyydefault:\n  yyn = yydefact[yystate];\n  if (yyn == 0)\n    goto yyerrlab;\n  goto yyreduce;\n\n\n/*-----------------------------.\n| yyreduce -- do a reduction.  |\n`-----------------------------*/\nyyreduce:\n  /* yyn is the number of a rule to reduce with.  */\n  yylen = yyr2[yyn];\n\n  /* If YYLEN is nonzero, implement the default value of the action:\n     '$$ = $1'.\n\n     Otherwise, the following line sets YYVAL to garbage.\n     This behavior is undocumented and Bison\n     users should not rely upon it.  Assigning to YYVAL\n     unconditionally makes the parser a bit smaller, and it avoids a\n     GCC warning that YYVAL may be used uninitialized.  */\n  yyval = yyvsp[1-yylen];\n\n\n  YY_REDUCE_PRINT (yyn);\n  switch (yyn)\n    {\n  case 2: /* variable_identifier: IDENTIFIER  */\n#line 360 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.intermTypedNode) = parseContext.handleVariable((yyvsp[0].lex).loc, (yyvsp[0].lex).symbol, (yyvsp[0].lex).string);\n    }\n#line 5339 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 3: /* primary_expression: variable_identifier  */\n#line 366 \"MachineIndependent/glslang.y\"\n                          {\n        (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);\n    }\n#line 5347 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 4: /* primary_expression: LEFT_PAREN expression RIGHT_PAREN  */\n#line 369 \"MachineIndependent/glslang.y\"\n                                        {\n        (yyval.interm.intermTypedNode) = (yyvsp[-1].interm.intermTypedNode);\n        if ((yyval.interm.intermTypedNode)->getAsConstantUnion())\n            (yyval.interm.intermTypedNode)->getAsConstantUnion()->setExpression();\n    }\n#line 5357 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 5: /* primary_expression: FLOATCONSTANT  */\n#line 374 \"MachineIndependent/glslang.y\"\n                    {\n        (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat, (yyvsp[0].lex).loc, true);\n    }\n#line 5365 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 6: /* primary_expression: INTCONSTANT  */\n#line 377 \"MachineIndependent/glslang.y\"\n                  {\n        (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true);\n    }\n#line 5373 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 7: /* primary_expression: UINTCONSTANT  */\n#line 380 \"MachineIndependent/glslang.y\"\n                   {\n        parseContext.fullIntegerCheck((yyvsp[0].lex).loc, \"unsigned literal\");\n        (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true);\n    }\n#line 5382 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 8: /* primary_expression: BOOLCONSTANT  */\n#line 384 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).b, (yyvsp[0].lex).loc, true);\n    }\n#line 5390 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 9: /* primary_expression: STRING_LITERAL  */\n#line 387 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).string, (yyvsp[0].lex).loc, true);\n    }\n#line 5398 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 10: /* primary_expression: INT32CONSTANT  */\n#line 390 \"MachineIndependent/glslang.y\"\n                    {\n        parseContext.explicitInt32Check((yyvsp[0].lex).loc, \"32-bit signed literal\");\n        (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true);\n    }\n#line 5407 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 11: /* primary_expression: UINT32CONSTANT  */\n#line 394 \"MachineIndependent/glslang.y\"\n                     {\n        parseContext.explicitInt32Check((yyvsp[0].lex).loc, \"32-bit signed literal\");\n        (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true);\n    }\n#line 5416 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 12: /* primary_expression: INT64CONSTANT  */\n#line 398 \"MachineIndependent/glslang.y\"\n                    {\n        parseContext.int64Check((yyvsp[0].lex).loc, \"64-bit integer literal\");\n        (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i64, (yyvsp[0].lex).loc, true);\n    }\n#line 5425 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 13: /* primary_expression: UINT64CONSTANT  */\n#line 402 \"MachineIndependent/glslang.y\"\n                     {\n        parseContext.int64Check((yyvsp[0].lex).loc, \"64-bit unsigned integer literal\");\n        (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u64, (yyvsp[0].lex).loc, true);\n    }\n#line 5434 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 14: /* primary_expression: INT16CONSTANT  */\n#line 406 \"MachineIndependent/glslang.y\"\n                    {\n        parseContext.explicitInt16Check((yyvsp[0].lex).loc, \"16-bit integer literal\");\n        (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((short)(yyvsp[0].lex).i, (yyvsp[0].lex).loc, true);\n    }\n#line 5443 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 15: /* primary_expression: UINT16CONSTANT  */\n#line 410 \"MachineIndependent/glslang.y\"\n                     {\n        parseContext.explicitInt16Check((yyvsp[0].lex).loc, \"16-bit unsigned integer literal\");\n        (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((unsigned short)(yyvsp[0].lex).u, (yyvsp[0].lex).loc, true);\n    }\n#line 5452 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 16: /* primary_expression: DOUBLECONSTANT  */\n#line 414 \"MachineIndependent/glslang.y\"\n                     {\n        parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, \"double literal\");\n        if (! parseContext.symbolTable.atBuiltInLevel())\n            parseContext.doubleCheck((yyvsp[0].lex).loc, \"double literal\");\n        (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtDouble, (yyvsp[0].lex).loc, true);\n    }\n#line 5463 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 17: /* primary_expression: FLOAT16CONSTANT  */\n#line 420 \"MachineIndependent/glslang.y\"\n                      {\n        parseContext.float16Check((yyvsp[0].lex).loc, \"half float literal\");\n        (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat16, (yyvsp[0].lex).loc, true);\n    }\n#line 5472 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 18: /* postfix_expression: primary_expression  */\n#line 427 \"MachineIndependent/glslang.y\"\n                         {\n        (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);\n    }\n#line 5480 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 19: /* postfix_expression: postfix_expression LEFT_BRACKET integer_expression RIGHT_BRACKET  */\n#line 430 \"MachineIndependent/glslang.y\"\n                                                                       {\n        (yyval.interm.intermTypedNode) = parseContext.handleBracketDereference((yyvsp[-2].lex).loc, (yyvsp[-3].interm.intermTypedNode), (yyvsp[-1].interm.intermTypedNode));\n    }\n#line 5488 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 20: /* postfix_expression: function_call  */\n#line 433 \"MachineIndependent/glslang.y\"\n                    {\n        (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);\n    }\n#line 5496 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 21: /* postfix_expression: postfix_expression DOT IDENTIFIER  */\n#line 436 \"MachineIndependent/glslang.y\"\n                                        {\n        (yyval.interm.intermTypedNode) = parseContext.handleDotDereference((yyvsp[0].lex).loc, (yyvsp[-2].interm.intermTypedNode), *(yyvsp[0].lex).string);\n    }\n#line 5504 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 22: /* postfix_expression: postfix_expression INC_OP  */\n#line 439 \"MachineIndependent/glslang.y\"\n                                {\n        parseContext.variableCheck((yyvsp[-1].interm.intermTypedNode));\n        parseContext.lValueErrorCheck((yyvsp[0].lex).loc, \"++\", (yyvsp[-1].interm.intermTypedNode));\n        (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[0].lex).loc, \"++\", EOpPostIncrement, (yyvsp[-1].interm.intermTypedNode));\n    }\n#line 5514 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 23: /* postfix_expression: postfix_expression DEC_OP  */\n#line 444 \"MachineIndependent/glslang.y\"\n                                {\n        parseContext.variableCheck((yyvsp[-1].interm.intermTypedNode));\n        parseContext.lValueErrorCheck((yyvsp[0].lex).loc, \"--\", (yyvsp[-1].interm.intermTypedNode));\n        (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[0].lex).loc, \"--\", EOpPostDecrement, (yyvsp[-1].interm.intermTypedNode));\n    }\n#line 5524 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 24: /* integer_expression: expression  */\n#line 452 \"MachineIndependent/glslang.y\"\n                 {\n        parseContext.integerCheck((yyvsp[0].interm.intermTypedNode), \"[]\");\n        (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);\n    }\n#line 5533 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 25: /* function_call: function_call_or_method  */\n#line 459 \"MachineIndependent/glslang.y\"\n                              {\n        (yyval.interm.intermTypedNode) = parseContext.handleFunctionCall((yyvsp[0].interm).loc, (yyvsp[0].interm).function, (yyvsp[0].interm).intermNode);\n        delete (yyvsp[0].interm).function;\n    }\n#line 5542 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 26: /* function_call_or_method: function_call_generic  */\n#line 466 \"MachineIndependent/glslang.y\"\n                            {\n        (yyval.interm) = (yyvsp[0].interm);\n    }\n#line 5550 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 27: /* function_call_generic: function_call_header_with_parameters RIGHT_PAREN  */\n#line 472 \"MachineIndependent/glslang.y\"\n                                                       {\n        (yyval.interm) = (yyvsp[-1].interm);\n        (yyval.interm).loc = (yyvsp[0].lex).loc;\n    }\n#line 5559 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 28: /* function_call_generic: function_call_header_no_parameters RIGHT_PAREN  */\n#line 476 \"MachineIndependent/glslang.y\"\n                                                     {\n        (yyval.interm) = (yyvsp[-1].interm);\n        (yyval.interm).loc = (yyvsp[0].lex).loc;\n    }\n#line 5568 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 29: /* function_call_header_no_parameters: function_call_header VOID  */\n#line 483 \"MachineIndependent/glslang.y\"\n                                {\n        (yyval.interm) = (yyvsp[-1].interm);\n    }\n#line 5576 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 30: /* function_call_header_no_parameters: function_call_header  */\n#line 486 \"MachineIndependent/glslang.y\"\n                           {\n        (yyval.interm) = (yyvsp[0].interm);\n    }\n#line 5584 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 31: /* function_call_header_with_parameters: function_call_header assignment_expression  */\n#line 492 \"MachineIndependent/glslang.y\"\n                                                 {\n        if (parseContext.spvVersion.vulkan > 0\n            && parseContext.spvVersion.vulkanRelaxed\n            && (yyvsp[0].interm.intermTypedNode)->getType().containsOpaque())\n        {\n            (yyval.interm).intermNode = parseContext.vkRelaxedRemapFunctionArgument((yyval.interm).loc, (yyvsp[-1].interm).function, (yyvsp[0].interm.intermTypedNode));\n            (yyval.interm).function = (yyvsp[-1].interm).function;\n        }\n        else\n        {\n            TParameter param = { 0, new TType, {} };\n            param.type->shallowCopy((yyvsp[0].interm.intermTypedNode)->getType());\n\n            (yyvsp[-1].interm).function->addParameter(param);\n            (yyval.interm).function = (yyvsp[-1].interm).function;\n            (yyval.interm).intermNode = (yyvsp[0].interm.intermTypedNode);\n        }\n    }\n#line 5607 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 32: /* function_call_header_with_parameters: function_call_header_with_parameters COMMA assignment_expression  */\n#line 510 \"MachineIndependent/glslang.y\"\n                                                                       {\n        if (parseContext.spvVersion.vulkan > 0\n            && parseContext.spvVersion.vulkanRelaxed\n            && (yyvsp[0].interm.intermTypedNode)->getType().containsOpaque())\n        {\n            TIntermNode* remappedNode = parseContext.vkRelaxedRemapFunctionArgument((yyvsp[-1].lex).loc, (yyvsp[-2].interm).function, (yyvsp[0].interm.intermTypedNode));\n            if (remappedNode == (yyvsp[0].interm.intermTypedNode))\n                (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-2].interm).intermNode, (yyvsp[0].interm.intermTypedNode), (yyvsp[-1].lex).loc);\n            else\n                (yyval.interm).intermNode = parseContext.intermediate.mergeAggregate((yyvsp[-2].interm).intermNode, remappedNode, (yyvsp[-1].lex).loc);\n            (yyval.interm).function = (yyvsp[-2].interm).function;\n        }\n        else\n        {\n            TParameter param = { 0, new TType, {} };\n            param.type->shallowCopy((yyvsp[0].interm.intermTypedNode)->getType());\n\n            (yyvsp[-2].interm).function->addParameter(param);\n            (yyval.interm).function = (yyvsp[-2].interm).function;\n            (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-2].interm).intermNode, (yyvsp[0].interm.intermTypedNode), (yyvsp[-1].lex).loc);\n        }\n    }\n#line 5634 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 33: /* function_call_header: function_identifier LEFT_PAREN  */\n#line 535 \"MachineIndependent/glslang.y\"\n                                     {\n        (yyval.interm) = (yyvsp[-1].interm);\n    }\n#line 5642 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 34: /* function_identifier: type_specifier  */\n#line 543 \"MachineIndependent/glslang.y\"\n                     {\n        // Constructor\n        (yyval.interm).intermNode = 0;\n        (yyval.interm).function = parseContext.handleConstructorCall((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type));\n    }\n#line 5652 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 35: /* function_identifier: postfix_expression  */\n#line 548 \"MachineIndependent/glslang.y\"\n                         {\n        //\n        // Should be a method or subroutine call, but we haven't recognized the arguments yet.\n        //\n        (yyval.interm).function = 0;\n        (yyval.interm).intermNode = 0;\n\n        TIntermMethod* method = (yyvsp[0].interm.intermTypedNode)->getAsMethodNode();\n        if (method) {\n            (yyval.interm).function = new TFunction(&method->getMethodName(), TType(EbtInt), EOpArrayLength);\n            (yyval.interm).intermNode = method->getObject();\n        } else {\n            TIntermSymbol* symbol = (yyvsp[0].interm.intermTypedNode)->getAsSymbolNode();\n            if (symbol) {\n                parseContext.reservedErrorCheck(symbol->getLoc(), symbol->getName());\n                TFunction *function = new TFunction(&symbol->getName(), TType(EbtVoid));\n                (yyval.interm).function = function;\n            } else\n                parseContext.error((yyvsp[0].interm.intermTypedNode)->getLoc(), \"function call, method, or subroutine call expected\", \"\", \"\");\n        }\n\n        if ((yyval.interm).function == 0) {\n            // error recover\n            TString* empty = NewPoolTString(\"\");\n            (yyval.interm).function = new TFunction(empty, TType(EbtVoid), EOpNull);\n        }\n    }\n#line 5684 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 36: /* function_identifier: non_uniform_qualifier  */\n#line 575 \"MachineIndependent/glslang.y\"\n                            {\n        // Constructor\n        (yyval.interm).intermNode = 0;\n        (yyval.interm).function = parseContext.handleConstructorCall((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type));\n    }\n#line 5694 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 37: /* unary_expression: postfix_expression  */\n#line 583 \"MachineIndependent/glslang.y\"\n                         {\n        parseContext.variableCheck((yyvsp[0].interm.intermTypedNode));\n        (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);\n        if (TIntermMethod* method = (yyvsp[0].interm.intermTypedNode)->getAsMethodNode())\n            parseContext.error((yyvsp[0].interm.intermTypedNode)->getLoc(), \"incomplete method syntax\", method->getMethodName().c_str(), \"\");\n    }\n#line 5705 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 38: /* unary_expression: INC_OP unary_expression  */\n#line 589 \"MachineIndependent/glslang.y\"\n                              {\n        parseContext.lValueErrorCheck((yyvsp[-1].lex).loc, \"++\", (yyvsp[0].interm.intermTypedNode));\n        (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[-1].lex).loc, \"++\", EOpPreIncrement, (yyvsp[0].interm.intermTypedNode));\n    }\n#line 5714 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 39: /* unary_expression: DEC_OP unary_expression  */\n#line 593 \"MachineIndependent/glslang.y\"\n                              {\n        parseContext.lValueErrorCheck((yyvsp[-1].lex).loc, \"--\", (yyvsp[0].interm.intermTypedNode));\n        (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[-1].lex).loc, \"--\", EOpPreDecrement, (yyvsp[0].interm.intermTypedNode));\n    }\n#line 5723 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 40: /* unary_expression: unary_operator unary_expression  */\n#line 597 \"MachineIndependent/glslang.y\"\n                                      {\n        if ((yyvsp[-1].interm).op != EOpNull) {\n            char errorOp[2] = {0, 0};\n            switch((yyvsp[-1].interm).op) {\n            case EOpNegative:   errorOp[0] = '-'; break;\n            case EOpLogicalNot: errorOp[0] = '!'; break;\n            case EOpBitwiseNot: errorOp[0] = '~'; break;\n            default: break; // some compilers want this\n            }\n            (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[-1].interm).loc, errorOp, (yyvsp[-1].interm).op, (yyvsp[0].interm.intermTypedNode));\n        } else {\n            (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);\n            if ((yyval.interm.intermTypedNode)->getAsConstantUnion())\n                (yyval.interm.intermTypedNode)->getAsConstantUnion()->setExpression();\n        }\n    }\n#line 5744 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 41: /* unary_operator: PLUS  */\n#line 617 \"MachineIndependent/glslang.y\"\n            { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpNull; }\n#line 5750 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 42: /* unary_operator: DASH  */\n#line 618 \"MachineIndependent/glslang.y\"\n            { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpNegative; }\n#line 5756 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 43: /* unary_operator: BANG  */\n#line 619 \"MachineIndependent/glslang.y\"\n            { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpLogicalNot; }\n#line 5762 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 44: /* unary_operator: TILDE  */\n#line 620 \"MachineIndependent/glslang.y\"\n            { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpBitwiseNot;\n              parseContext.fullIntegerCheck((yyvsp[0].lex).loc, \"bitwise not\"); }\n#line 5769 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 45: /* multiplicative_expression: unary_expression  */\n#line 626 \"MachineIndependent/glslang.y\"\n                       { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }\n#line 5775 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 46: /* multiplicative_expression: multiplicative_expression STAR unary_expression  */\n#line 627 \"MachineIndependent/glslang.y\"\n                                                      {\n        (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, \"*\", EOpMul, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));\n        if ((yyval.interm.intermTypedNode) == 0)\n            (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);\n    }\n#line 5785 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 47: /* multiplicative_expression: multiplicative_expression SLASH unary_expression  */\n#line 632 \"MachineIndependent/glslang.y\"\n                                                       {\n        (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, \"/\", EOpDiv, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));\n        if ((yyval.interm.intermTypedNode) == 0)\n            (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);\n    }\n#line 5795 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 48: /* multiplicative_expression: multiplicative_expression PERCENT unary_expression  */\n#line 637 \"MachineIndependent/glslang.y\"\n                                                         {\n        parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, \"%\");\n        (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, \"%\", EOpMod, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));\n        if ((yyval.interm.intermTypedNode) == 0)\n            (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);\n    }\n#line 5806 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 49: /* additive_expression: multiplicative_expression  */\n#line 646 \"MachineIndependent/glslang.y\"\n                                { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }\n#line 5812 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 50: /* additive_expression: additive_expression PLUS multiplicative_expression  */\n#line 647 \"MachineIndependent/glslang.y\"\n                                                         {\n        (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, \"+\", EOpAdd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));\n        if ((yyval.interm.intermTypedNode) == 0)\n            (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);\n    }\n#line 5822 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 51: /* additive_expression: additive_expression DASH multiplicative_expression  */\n#line 652 \"MachineIndependent/glslang.y\"\n                                                         {\n        (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, \"-\", EOpSub, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));\n        if ((yyval.interm.intermTypedNode) == 0)\n            (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);\n    }\n#line 5832 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 52: /* shift_expression: additive_expression  */\n#line 660 \"MachineIndependent/glslang.y\"\n                          { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }\n#line 5838 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 53: /* shift_expression: shift_expression LEFT_OP additive_expression  */\n#line 661 \"MachineIndependent/glslang.y\"\n                                                   {\n        parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, \"bit shift left\");\n        (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, \"<<\", EOpLeftShift, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));\n        if ((yyval.interm.intermTypedNode) == 0)\n            (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);\n    }\n#line 5849 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 54: /* shift_expression: shift_expression RIGHT_OP additive_expression  */\n#line 667 \"MachineIndependent/glslang.y\"\n                                                    {\n        parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, \"bit shift right\");\n        (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, \">>\", EOpRightShift, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));\n        if ((yyval.interm.intermTypedNode) == 0)\n            (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);\n    }\n#line 5860 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 55: /* relational_expression: shift_expression  */\n#line 676 \"MachineIndependent/glslang.y\"\n                       { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }\n#line 5866 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 56: /* relational_expression: relational_expression LEFT_ANGLE shift_expression  */\n#line 677 \"MachineIndependent/glslang.y\"\n                                                        {\n        (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, \"<\", EOpLessThan, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));\n        if ((yyval.interm.intermTypedNode) == 0)\n            (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);\n    }\n#line 5876 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 57: /* relational_expression: relational_expression RIGHT_ANGLE shift_expression  */\n#line 682 \"MachineIndependent/glslang.y\"\n                                                          {\n        (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, \">\", EOpGreaterThan, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));\n        if ((yyval.interm.intermTypedNode) == 0)\n            (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);\n    }\n#line 5886 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 58: /* relational_expression: relational_expression LE_OP shift_expression  */\n#line 687 \"MachineIndependent/glslang.y\"\n                                                    {\n        (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, \"<=\", EOpLessThanEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));\n        if ((yyval.interm.intermTypedNode) == 0)\n            (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);\n    }\n#line 5896 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 59: /* relational_expression: relational_expression GE_OP shift_expression  */\n#line 692 \"MachineIndependent/glslang.y\"\n                                                    {\n        (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, \">=\", EOpGreaterThanEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));\n        if ((yyval.interm.intermTypedNode) == 0)\n            (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);\n    }\n#line 5906 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 60: /* equality_expression: relational_expression  */\n#line 700 \"MachineIndependent/glslang.y\"\n                            { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }\n#line 5912 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 61: /* equality_expression: equality_expression EQ_OP relational_expression  */\n#line 701 \"MachineIndependent/glslang.y\"\n                                                       {\n        parseContext.arrayObjectCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), \"array comparison\");\n        parseContext.opaqueCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), \"==\");\n        parseContext.specializationCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), \"==\");\n        parseContext.referenceCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), \"==\");\n        (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, \"==\", EOpEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));\n        if ((yyval.interm.intermTypedNode) == 0)\n            (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);\n    }\n#line 5926 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 62: /* equality_expression: equality_expression NE_OP relational_expression  */\n#line 710 \"MachineIndependent/glslang.y\"\n                                                      {\n        parseContext.arrayObjectCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), \"array comparison\");\n        parseContext.opaqueCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), \"!=\");\n        parseContext.specializationCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), \"!=\");\n        parseContext.referenceCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), \"!=\");\n        (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, \"!=\", EOpNotEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));\n        if ((yyval.interm.intermTypedNode) == 0)\n            (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);\n    }\n#line 5940 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 63: /* and_expression: equality_expression  */\n#line 722 \"MachineIndependent/glslang.y\"\n                          { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }\n#line 5946 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 64: /* and_expression: and_expression AMPERSAND equality_expression  */\n#line 723 \"MachineIndependent/glslang.y\"\n                                                   {\n        parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, \"bitwise and\");\n        (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, \"&\", EOpAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));\n        if ((yyval.interm.intermTypedNode) == 0)\n            (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);\n    }\n#line 5957 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 65: /* exclusive_or_expression: and_expression  */\n#line 732 \"MachineIndependent/glslang.y\"\n                     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }\n#line 5963 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 66: /* exclusive_or_expression: exclusive_or_expression CARET and_expression  */\n#line 733 \"MachineIndependent/glslang.y\"\n                                                   {\n        parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, \"bitwise exclusive or\");\n        (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, \"^\", EOpExclusiveOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));\n        if ((yyval.interm.intermTypedNode) == 0)\n            (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);\n    }\n#line 5974 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 67: /* inclusive_or_expression: exclusive_or_expression  */\n#line 742 \"MachineIndependent/glslang.y\"\n                              { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }\n#line 5980 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 68: /* inclusive_or_expression: inclusive_or_expression VERTICAL_BAR exclusive_or_expression  */\n#line 743 \"MachineIndependent/glslang.y\"\n                                                                   {\n        parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, \"bitwise inclusive or\");\n        (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, \"|\", EOpInclusiveOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));\n        if ((yyval.interm.intermTypedNode) == 0)\n            (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);\n    }\n#line 5991 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 69: /* logical_and_expression: inclusive_or_expression  */\n#line 752 \"MachineIndependent/glslang.y\"\n                              { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }\n#line 5997 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 70: /* logical_and_expression: logical_and_expression AND_OP inclusive_or_expression  */\n#line 753 \"MachineIndependent/glslang.y\"\n                                                            {\n        (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, \"&&\", EOpLogicalAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));\n        if ((yyval.interm.intermTypedNode) == 0)\n            (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);\n    }\n#line 6007 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 71: /* logical_xor_expression: logical_and_expression  */\n#line 761 \"MachineIndependent/glslang.y\"\n                             { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }\n#line 6013 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 72: /* logical_xor_expression: logical_xor_expression XOR_OP logical_and_expression  */\n#line 762 \"MachineIndependent/glslang.y\"\n                                                            {\n        (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, \"^^\", EOpLogicalXor, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));\n        if ((yyval.interm.intermTypedNode) == 0)\n            (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);\n    }\n#line 6023 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 73: /* logical_or_expression: logical_xor_expression  */\n#line 770 \"MachineIndependent/glslang.y\"\n                             { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }\n#line 6029 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 74: /* logical_or_expression: logical_or_expression OR_OP logical_xor_expression  */\n#line 771 \"MachineIndependent/glslang.y\"\n                                                          {\n        (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, \"||\", EOpLogicalOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));\n        if ((yyval.interm.intermTypedNode) == 0)\n            (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);\n    }\n#line 6039 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 75: /* conditional_expression: logical_or_expression  */\n#line 779 \"MachineIndependent/glslang.y\"\n                            { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }\n#line 6045 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 76: /* $@1: %empty  */\n#line 780 \"MachineIndependent/glslang.y\"\n                                     {\n        ++parseContext.controlFlowNestingLevel;\n    }\n#line 6053 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 77: /* conditional_expression: logical_or_expression QUESTION $@1 expression COLON assignment_expression  */\n#line 783 \"MachineIndependent/glslang.y\"\n                                             {\n        --parseContext.controlFlowNestingLevel;\n        parseContext.boolCheck((yyvsp[-4].lex).loc, (yyvsp[-5].interm.intermTypedNode));\n        parseContext.rValueErrorCheck((yyvsp[-4].lex).loc, \"?\", (yyvsp[-5].interm.intermTypedNode));\n        parseContext.rValueErrorCheck((yyvsp[-1].lex).loc, \":\", (yyvsp[-2].interm.intermTypedNode));\n        parseContext.rValueErrorCheck((yyvsp[-1].lex).loc, \":\", (yyvsp[0].interm.intermTypedNode));\n        (yyval.interm.intermTypedNode) = parseContext.intermediate.addSelection((yyvsp[-5].interm.intermTypedNode), (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yyvsp[-4].lex).loc);\n        if ((yyval.interm.intermTypedNode) == 0) {\n            parseContext.binaryOpError((yyvsp[-4].lex).loc, \":\", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), (yyvsp[0].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs()));\n            (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);\n        }\n    }\n#line 6070 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 78: /* assignment_expression: conditional_expression  */\n#line 798 \"MachineIndependent/glslang.y\"\n                             { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }\n#line 6076 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 79: /* assignment_expression: unary_expression assignment_operator assignment_expression  */\n#line 799 \"MachineIndependent/glslang.y\"\n                                                                 {\n        parseContext.arrayObjectCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), \"array assignment\");\n        parseContext.opaqueCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), \"=\");\n        parseContext.storage16BitAssignmentCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), \"=\");\n        parseContext.specializationCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), \"=\");\n        parseContext.lValueErrorCheck((yyvsp[-1].interm).loc, \"assign\", (yyvsp[-2].interm.intermTypedNode));\n        parseContext.rValueErrorCheck((yyvsp[-1].interm).loc, \"assign\", (yyvsp[0].interm.intermTypedNode));\n        (yyval.interm.intermTypedNode) = parseContext.addAssign((yyvsp[-1].interm).loc, (yyvsp[-1].interm).op, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));\n        if ((yyval.interm.intermTypedNode) == 0) {\n            parseContext.assignError((yyvsp[-1].interm).loc, \"assign\", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), (yyvsp[0].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs()));\n            (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);\n        }\n    }\n#line 6094 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 80: /* assignment_operator: EQUAL  */\n#line 815 \"MachineIndependent/glslang.y\"\n            {\n        (yyval.interm).loc = (yyvsp[0].lex).loc;\n        (yyval.interm).op = EOpAssign;\n    }\n#line 6103 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 81: /* assignment_operator: MUL_ASSIGN  */\n#line 819 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm).loc = (yyvsp[0].lex).loc;\n        (yyval.interm).op = EOpMulAssign;\n    }\n#line 6112 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 82: /* assignment_operator: DIV_ASSIGN  */\n#line 823 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm).loc = (yyvsp[0].lex).loc;\n        (yyval.interm).op = EOpDivAssign;\n    }\n#line 6121 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 83: /* assignment_operator: MOD_ASSIGN  */\n#line 827 \"MachineIndependent/glslang.y\"\n                 {\n        parseContext.fullIntegerCheck((yyvsp[0].lex).loc, \"%=\");\n        (yyval.interm).loc = (yyvsp[0].lex).loc;\n        (yyval.interm).op = EOpModAssign;\n    }\n#line 6131 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 84: /* assignment_operator: ADD_ASSIGN  */\n#line 832 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm).loc = (yyvsp[0].lex).loc;\n        (yyval.interm).op = EOpAddAssign;\n    }\n#line 6140 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 85: /* assignment_operator: SUB_ASSIGN  */\n#line 836 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm).loc = (yyvsp[0].lex).loc;\n        (yyval.interm).op = EOpSubAssign;\n    }\n#line 6149 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 86: /* assignment_operator: LEFT_ASSIGN  */\n#line 840 \"MachineIndependent/glslang.y\"\n                  {\n        parseContext.fullIntegerCheck((yyvsp[0].lex).loc, \"bit-shift left assign\");\n        (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpLeftShiftAssign;\n    }\n#line 6158 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 87: /* assignment_operator: RIGHT_ASSIGN  */\n#line 844 \"MachineIndependent/glslang.y\"\n                   {\n        parseContext.fullIntegerCheck((yyvsp[0].lex).loc, \"bit-shift right assign\");\n        (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpRightShiftAssign;\n    }\n#line 6167 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 88: /* assignment_operator: AND_ASSIGN  */\n#line 848 \"MachineIndependent/glslang.y\"\n                 {\n        parseContext.fullIntegerCheck((yyvsp[0].lex).loc, \"bitwise-and assign\");\n        (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpAndAssign;\n    }\n#line 6176 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 89: /* assignment_operator: XOR_ASSIGN  */\n#line 852 \"MachineIndependent/glslang.y\"\n                 {\n        parseContext.fullIntegerCheck((yyvsp[0].lex).loc, \"bitwise-xor assign\");\n        (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpExclusiveOrAssign;\n    }\n#line 6185 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 90: /* assignment_operator: OR_ASSIGN  */\n#line 856 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.fullIntegerCheck((yyvsp[0].lex).loc, \"bitwise-or assign\");\n        (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpInclusiveOrAssign;\n    }\n#line 6194 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 91: /* expression: assignment_expression  */\n#line 863 \"MachineIndependent/glslang.y\"\n                            {\n        (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);\n    }\n#line 6202 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 92: /* expression: expression COMMA assignment_expression  */\n#line 866 \"MachineIndependent/glslang.y\"\n                                             {\n        parseContext.samplerConstructorLocationCheck((yyvsp[-1].lex).loc, \",\", (yyvsp[0].interm.intermTypedNode));\n        (yyval.interm.intermTypedNode) = parseContext.intermediate.addComma((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yyvsp[-1].lex).loc);\n        if ((yyval.interm.intermTypedNode) == 0) {\n            parseContext.binaryOpError((yyvsp[-1].lex).loc, \",\", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), (yyvsp[0].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs()));\n            (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);\n        }\n    }\n#line 6215 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 93: /* constant_expression: conditional_expression  */\n#line 877 \"MachineIndependent/glslang.y\"\n                             {\n        parseContext.constantValueCheck((yyvsp[0].interm.intermTypedNode), \"\");\n        (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);\n    }\n#line 6224 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 94: /* declaration: function_prototype SEMICOLON  */\n#line 884 \"MachineIndependent/glslang.y\"\n                                   {\n        parseContext.handleFunctionDeclarator((yyvsp[-1].interm).loc, *(yyvsp[-1].interm).function, true /* prototype */);\n        (yyval.interm.intermNode) = 0;\n        // TODO: 4.0 functionality: subroutines: make the identifier a user type for this signature\n    }\n#line 6234 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 95: /* declaration: spirv_instruction_qualifier function_prototype SEMICOLON  */\n#line 889 \"MachineIndependent/glslang.y\"\n                                                               {\n        parseContext.requireExtensions((yyvsp[-1].interm).loc, 1, &E_GL_EXT_spirv_intrinsics, \"SPIR-V instruction qualifier\");\n        (yyvsp[-1].interm).function->setSpirvInstruction(*(yyvsp[-2].interm.spirvInst)); // Attach SPIR-V intruction qualifier\n        parseContext.handleFunctionDeclarator((yyvsp[-1].interm).loc, *(yyvsp[-1].interm).function, true /* prototype */);\n        (yyval.interm.intermNode) = 0;\n        // TODO: 4.0 functionality: subroutines: make the identifier a user type for this signature\n    }\n#line 6246 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 96: /* declaration: spirv_execution_mode_qualifier SEMICOLON  */\n#line 896 \"MachineIndependent/glslang.y\"\n                                               {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"SPIR-V execution mode qualifier\");\n        parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_EXT_spirv_intrinsics, \"SPIR-V execution mode qualifier\");\n        (yyval.interm.intermNode) = 0;\n    }\n#line 6256 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 97: /* declaration: init_declarator_list SEMICOLON  */\n#line 901 \"MachineIndependent/glslang.y\"\n                                     {\n        if ((yyvsp[-1].interm).intermNode && (yyvsp[-1].interm).intermNode->getAsAggregate())\n            (yyvsp[-1].interm).intermNode->getAsAggregate()->setOperator(EOpSequence);\n        (yyval.interm.intermNode) = (yyvsp[-1].interm).intermNode;\n    }\n#line 6266 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 98: /* declaration: PRECISION precision_qualifier type_specifier SEMICOLON  */\n#line 906 \"MachineIndependent/glslang.y\"\n                                                             {\n        parseContext.profileRequires((yyvsp[-3].lex).loc, ENoProfile, 130, 0, \"precision statement\");\n        // lazy setting of the previous scope's defaults, has effect only the first time it is called in a particular scope\n        parseContext.symbolTable.setPreviousDefaultPrecisions(&parseContext.defaultPrecision[0]);\n        parseContext.setDefaultPrecision((yyvsp[-3].lex).loc, (yyvsp[-1].interm.type), (yyvsp[-2].interm.type).qualifier.precision);\n        (yyval.interm.intermNode) = 0;\n    }\n#line 6278 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 99: /* declaration: block_structure SEMICOLON  */\n#line 913 \"MachineIndependent/glslang.y\"\n                                {\n        parseContext.declareBlock((yyvsp[-1].interm).loc, *(yyvsp[-1].interm).typeList);\n        (yyval.interm.intermNode) = 0;\n    }\n#line 6287 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 100: /* declaration: block_structure IDENTIFIER SEMICOLON  */\n#line 917 \"MachineIndependent/glslang.y\"\n                                           {\n        parseContext.declareBlock((yyvsp[-2].interm).loc, *(yyvsp[-2].interm).typeList, (yyvsp[-1].lex).string);\n        (yyval.interm.intermNode) = 0;\n    }\n#line 6296 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 101: /* declaration: block_structure IDENTIFIER array_specifier SEMICOLON  */\n#line 921 \"MachineIndependent/glslang.y\"\n                                                           {\n        parseContext.declareBlock((yyvsp[-3].interm).loc, *(yyvsp[-3].interm).typeList, (yyvsp[-2].lex).string, (yyvsp[-1].interm).arraySizes);\n        (yyval.interm.intermNode) = 0;\n    }\n#line 6305 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 102: /* declaration: type_qualifier SEMICOLON  */\n#line 925 \"MachineIndependent/glslang.y\"\n                               {\n        parseContext.globalQualifierFixCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier);\n        parseContext.updateStandaloneQualifierDefaults((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type));\n        (yyval.interm.intermNode) = 0;\n    }\n#line 6315 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 103: /* declaration: type_qualifier IDENTIFIER SEMICOLON  */\n#line 930 \"MachineIndependent/glslang.y\"\n                                          {\n        parseContext.checkNoShaderLayouts((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).shaderQualifiers);\n        parseContext.addQualifierToExisting((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).qualifier, *(yyvsp[-1].lex).string);\n        (yyval.interm.intermNode) = 0;\n    }\n#line 6325 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 104: /* declaration: type_qualifier IDENTIFIER identifier_list SEMICOLON  */\n#line 935 \"MachineIndependent/glslang.y\"\n                                                          {\n        parseContext.checkNoShaderLayouts((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).shaderQualifiers);\n        (yyvsp[-1].interm.identifierList)->push_back((yyvsp[-2].lex).string);\n        parseContext.addQualifierToExisting((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).qualifier, *(yyvsp[-1].interm.identifierList));\n        (yyval.interm.intermNode) = 0;\n    }\n#line 6336 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 105: /* $@2: %empty  */\n#line 944 \"MachineIndependent/glslang.y\"\n                                           { parseContext.nestedBlockCheck((yyvsp[-2].interm.type).loc); }\n#line 6342 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 106: /* block_structure: type_qualifier IDENTIFIER LEFT_BRACE $@2 struct_declaration_list RIGHT_BRACE  */\n#line 944 \"MachineIndependent/glslang.y\"\n                                                                                                                          {\n        --parseContext.blockNestingLevel;\n        parseContext.blockName = (yyvsp[-4].lex).string;\n        parseContext.globalQualifierFixCheck((yyvsp[-5].interm.type).loc, (yyvsp[-5].interm.type).qualifier);\n        parseContext.checkNoShaderLayouts((yyvsp[-5].interm.type).loc, (yyvsp[-5].interm.type).shaderQualifiers);\n        parseContext.currentBlockQualifier = (yyvsp[-5].interm.type).qualifier;\n        (yyval.interm).loc = (yyvsp[-5].interm.type).loc;\n        (yyval.interm).typeList = (yyvsp[-1].interm.typeList);\n    }\n#line 6356 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 107: /* identifier_list: COMMA IDENTIFIER  */\n#line 955 \"MachineIndependent/glslang.y\"\n                       {\n        (yyval.interm.identifierList) = new TIdentifierList;\n        (yyval.interm.identifierList)->push_back((yyvsp[0].lex).string);\n    }\n#line 6365 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 108: /* identifier_list: identifier_list COMMA IDENTIFIER  */\n#line 959 \"MachineIndependent/glslang.y\"\n                                       {\n        (yyval.interm.identifierList) = (yyvsp[-2].interm.identifierList);\n        (yyval.interm.identifierList)->push_back((yyvsp[0].lex).string);\n    }\n#line 6374 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 109: /* function_prototype: function_declarator RIGHT_PAREN  */\n#line 966 \"MachineIndependent/glslang.y\"\n                                       {\n        (yyval.interm).function = (yyvsp[-1].interm.function);\n        if (parseContext.compileOnly) (yyval.interm).function->setExport();\n        (yyval.interm).loc = (yyvsp[0].lex).loc;\n    }\n#line 6384 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 110: /* function_prototype: function_declarator RIGHT_PAREN attribute  */\n#line 971 \"MachineIndependent/glslang.y\"\n                                                {\n        (yyval.interm).function = (yyvsp[-2].interm.function);\n        if (parseContext.compileOnly) (yyval.interm).function->setExport();\n        (yyval.interm).loc = (yyvsp[-1].lex).loc;\n        const char * extensions[2] = { E_GL_EXT_subgroup_uniform_control_flow, E_GL_EXT_maximal_reconvergence };\n        parseContext.requireExtensions((yyvsp[-1].lex).loc, 2, extensions, \"attribute\");\n        parseContext.handleFunctionAttributes((yyvsp[-1].lex).loc, *(yyvsp[0].interm.attributes));\n    }\n#line 6397 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 111: /* function_prototype: attribute function_declarator RIGHT_PAREN  */\n#line 979 \"MachineIndependent/glslang.y\"\n                                                {\n        (yyval.interm).function = (yyvsp[-1].interm.function);\n        if (parseContext.compileOnly) (yyval.interm).function->setExport();\n        (yyval.interm).loc = (yyvsp[0].lex).loc;\n        const char * extensions[2] = { E_GL_EXT_subgroup_uniform_control_flow, E_GL_EXT_maximal_reconvergence };\n        parseContext.requireExtensions((yyvsp[0].lex).loc, 2, extensions, \"attribute\");\n        parseContext.handleFunctionAttributes((yyvsp[0].lex).loc, *(yyvsp[-2].interm.attributes));\n    }\n#line 6410 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 112: /* function_prototype: attribute function_declarator RIGHT_PAREN attribute  */\n#line 987 \"MachineIndependent/glslang.y\"\n                                                          {\n        (yyval.interm).function = (yyvsp[-2].interm.function);\n        if (parseContext.compileOnly) (yyval.interm).function->setExport();\n        (yyval.interm).loc = (yyvsp[-1].lex).loc;\n        const char * extensions[2] = { E_GL_EXT_subgroup_uniform_control_flow, E_GL_EXT_maximal_reconvergence };\n        parseContext.requireExtensions((yyvsp[-1].lex).loc, 2, extensions, \"attribute\");\n        parseContext.handleFunctionAttributes((yyvsp[-1].lex).loc, *(yyvsp[-3].interm.attributes));\n        parseContext.handleFunctionAttributes((yyvsp[-1].lex).loc, *(yyvsp[0].interm.attributes));\n    }\n#line 6424 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 113: /* function_declarator: function_header  */\n#line 999 \"MachineIndependent/glslang.y\"\n                      {\n        (yyval.interm.function) = (yyvsp[0].interm.function);\n    }\n#line 6432 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 114: /* function_declarator: function_header_with_parameters  */\n#line 1002 \"MachineIndependent/glslang.y\"\n                                      {\n        (yyval.interm.function) = (yyvsp[0].interm.function);\n    }\n#line 6440 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 115: /* function_header_with_parameters: function_header parameter_declaration  */\n#line 1009 \"MachineIndependent/glslang.y\"\n                                            {\n        // Add the parameter\n        (yyval.interm.function) = (yyvsp[-1].interm.function);\n        if ((yyvsp[0].interm).param.type->getBasicType() != EbtVoid)\n        {\n            if (!(parseContext.spvVersion.vulkan > 0 && parseContext.spvVersion.vulkanRelaxed))\n                (yyvsp[-1].interm.function)->addParameter((yyvsp[0].interm).param);\n            else\n                parseContext.vkRelaxedRemapFunctionParameter((yyvsp[-1].interm.function), (yyvsp[0].interm).param);\n        }\n        else\n            delete (yyvsp[0].interm).param.type;\n    }\n#line 6458 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 116: /* function_header_with_parameters: function_header_with_parameters COMMA parameter_declaration  */\n#line 1022 \"MachineIndependent/glslang.y\"\n                                                                  {\n        //\n        // Only first parameter of one-parameter functions can be void\n        // The check for named parameters not being void is done in parameter_declarator\n        //\n        if ((yyvsp[0].interm).param.type->getBasicType() == EbtVoid) {\n            //\n            // This parameter > first is void\n            //\n            parseContext.error((yyvsp[-1].lex).loc, \"cannot be an argument type except for '(void)'\", \"void\", \"\");\n            delete (yyvsp[0].interm).param.type;\n        } else {\n            // Add the parameter\n            (yyval.interm.function) = (yyvsp[-2].interm.function);\n            if (!(parseContext.spvVersion.vulkan > 0 && parseContext.spvVersion.vulkanRelaxed))\n                (yyvsp[-2].interm.function)->addParameter((yyvsp[0].interm).param);\n            else\n                parseContext.vkRelaxedRemapFunctionParameter((yyvsp[-2].interm.function), (yyvsp[0].interm).param);\n        }\n    }\n#line 6483 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 117: /* function_header: fully_specified_type IDENTIFIER LEFT_PAREN  */\n#line 1045 \"MachineIndependent/glslang.y\"\n                                                 {\n        if ((yyvsp[-2].interm.type).qualifier.storage != EvqGlobal && (yyvsp[-2].interm.type).qualifier.storage != EvqTemporary) {\n            parseContext.error((yyvsp[-1].lex).loc, \"no qualifiers allowed for function return\",\n                               GetStorageQualifierString((yyvsp[-2].interm.type).qualifier.storage), \"\");\n        }\n        if ((yyvsp[-2].interm.type).arraySizes)\n            parseContext.arraySizeRequiredCheck((yyvsp[-2].interm.type).loc, *(yyvsp[-2].interm.type).arraySizes);\n\n        // Add the function as a prototype after parsing it (we do not support recursion)\n        TFunction *function;\n        TType type((yyvsp[-2].interm.type));\n\n        // Potentially rename shader entry point function.  No-op most of the time.\n        parseContext.renameShaderFunction((yyvsp[-1].lex).string);\n\n        // Make the function\n        function = new TFunction((yyvsp[-1].lex).string, type);\n        (yyval.interm.function) = function;\n    }\n#line 6507 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 118: /* parameter_declarator: type_specifier IDENTIFIER  */\n#line 1068 \"MachineIndependent/glslang.y\"\n                                {\n        if ((yyvsp[-1].interm.type).arraySizes) {\n            parseContext.profileRequires((yyvsp[-1].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, \"arrayed type\");\n            parseContext.profileRequires((yyvsp[-1].interm.type).loc, EEsProfile, 300, 0, \"arrayed type\");\n            parseContext.arraySizeRequiredCheck((yyvsp[-1].interm.type).loc, *(yyvsp[-1].interm.type).arraySizes);\n        }\n        if ((yyvsp[-1].interm.type).basicType == EbtVoid) {\n            parseContext.error((yyvsp[0].lex).loc, \"illegal use of type 'void'\", (yyvsp[0].lex).string->c_str(), \"\");\n        }\n        parseContext.reservedErrorCheck((yyvsp[0].lex).loc, *(yyvsp[0].lex).string);\n\n        TParameter param = {(yyvsp[0].lex).string, new TType((yyvsp[-1].interm.type)), {}};\n        (yyval.interm).loc = (yyvsp[0].lex).loc;\n        (yyval.interm).param = param;\n    }\n#line 6527 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 119: /* parameter_declarator: type_specifier IDENTIFIER array_specifier  */\n#line 1083 \"MachineIndependent/glslang.y\"\n                                                {\n        if ((yyvsp[-2].interm.type).arraySizes) {\n            parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, \"arrayed type\");\n            parseContext.profileRequires((yyvsp[-2].interm.type).loc, EEsProfile, 300, 0, \"arrayed type\");\n            parseContext.arraySizeRequiredCheck((yyvsp[-2].interm.type).loc, *(yyvsp[-2].interm.type).arraySizes);\n        }\n        TType* type = new TType((yyvsp[-2].interm.type));\n        type->transferArraySizes((yyvsp[0].interm).arraySizes);\n        type->copyArrayInnerSizes((yyvsp[-2].interm.type).arraySizes);\n\n        parseContext.arrayOfArrayVersionCheck((yyvsp[-1].lex).loc, type->getArraySizes());\n        parseContext.arraySizeRequiredCheck((yyvsp[0].interm).loc, *(yyvsp[0].interm).arraySizes);\n        parseContext.reservedErrorCheck((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string);\n\n        TParameter param = { (yyvsp[-1].lex).string, type, {} };\n\n        (yyval.interm).loc = (yyvsp[-1].lex).loc;\n        (yyval.interm).param = param;\n    }\n#line 6551 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 120: /* parameter_declaration: type_qualifier parameter_declarator  */\n#line 1108 \"MachineIndependent/glslang.y\"\n                                          {\n        (yyval.interm) = (yyvsp[0].interm);\n        if ((yyvsp[-1].interm.type).qualifier.precision != EpqNone)\n            (yyval.interm).param.type->getQualifier().precision = (yyvsp[-1].interm.type).qualifier.precision;\n        parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier(), (yyval.interm).param.type->isCoopMatOrVec());\n\n        parseContext.checkNoShaderLayouts((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).shaderQualifiers);\n        parseContext.parameterTypeCheck((yyvsp[0].interm).loc, (yyvsp[-1].interm.type).qualifier.storage, *(yyval.interm).param.type);\n        parseContext.paramCheckFix((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, *(yyval.interm).param.type);\n\n    }\n#line 6567 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 121: /* parameter_declaration: parameter_declarator  */\n#line 1119 \"MachineIndependent/glslang.y\"\n                           {\n        (yyval.interm) = (yyvsp[0].interm);\n\n        parseContext.parameterTypeCheck((yyvsp[0].interm).loc, EvqIn, *(yyvsp[0].interm).param.type);\n        parseContext.paramCheckFixStorage((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type);\n        parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier(), (yyval.interm).param.type->isCoopMatOrVec());\n    }\n#line 6579 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 122: /* parameter_declaration: type_qualifier parameter_type_specifier  */\n#line 1129 \"MachineIndependent/glslang.y\"\n                                              {\n        (yyval.interm) = (yyvsp[0].interm);\n        if ((yyvsp[-1].interm.type).qualifier.precision != EpqNone)\n            (yyval.interm).param.type->getQualifier().precision = (yyvsp[-1].interm.type).qualifier.precision;\n        parseContext.precisionQualifierCheck((yyvsp[-1].interm.type).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier(), (yyval.interm).param.type->isCoopMatOrVec());\n\n        parseContext.checkNoShaderLayouts((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).shaderQualifiers);\n        parseContext.parameterTypeCheck((yyvsp[0].interm).loc, (yyvsp[-1].interm.type).qualifier.storage, *(yyval.interm).param.type);\n        parseContext.paramCheckFix((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, *(yyval.interm).param.type);\n    }\n#line 6594 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 123: /* parameter_declaration: parameter_type_specifier  */\n#line 1139 \"MachineIndependent/glslang.y\"\n                               {\n        (yyval.interm) = (yyvsp[0].interm);\n\n        parseContext.parameterTypeCheck((yyvsp[0].interm).loc, EvqIn, *(yyvsp[0].interm).param.type);\n        parseContext.paramCheckFixStorage((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type);\n        parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier(), (yyval.interm).param.type->isCoopMatOrVec());\n    }\n#line 6606 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 124: /* parameter_type_specifier: type_specifier  */\n#line 1149 \"MachineIndependent/glslang.y\"\n                     {\n        TParameter param = { 0, new TType((yyvsp[0].interm.type)), {} };\n        (yyval.interm).param = param;\n        if ((yyvsp[0].interm.type).arraySizes)\n            parseContext.arraySizeRequiredCheck((yyvsp[0].interm.type).loc, *(yyvsp[0].interm.type).arraySizes);\n    }\n#line 6617 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 125: /* init_declarator_list: single_declaration  */\n#line 1158 \"MachineIndependent/glslang.y\"\n                         {\n        (yyval.interm) = (yyvsp[0].interm);\n    }\n#line 6625 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 126: /* init_declarator_list: init_declarator_list COMMA IDENTIFIER  */\n#line 1161 \"MachineIndependent/glslang.y\"\n                                            {\n        (yyval.interm) = (yyvsp[-2].interm);\n        parseContext.declareVariable((yyvsp[0].lex).loc, *(yyvsp[0].lex).string, (yyvsp[-2].interm).type);\n    }\n#line 6634 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 127: /* init_declarator_list: init_declarator_list COMMA IDENTIFIER array_specifier  */\n#line 1165 \"MachineIndependent/glslang.y\"\n                                                            {\n        (yyval.interm) = (yyvsp[-3].interm);\n        parseContext.declareVariable((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string, (yyvsp[-3].interm).type, (yyvsp[0].interm).arraySizes);\n    }\n#line 6643 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 128: /* init_declarator_list: init_declarator_list COMMA IDENTIFIER array_specifier EQUAL initializer  */\n#line 1169 \"MachineIndependent/glslang.y\"\n                                                                              {\n        (yyval.interm).type = (yyvsp[-5].interm).type;\n        TIntermNode* initNode = parseContext.declareVariable((yyvsp[-3].lex).loc, *(yyvsp[-3].lex).string, (yyvsp[-5].interm).type, (yyvsp[-2].interm).arraySizes, (yyvsp[0].interm.intermTypedNode));\n        (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-5].interm).intermNode, initNode, (yyvsp[-1].lex).loc);\n    }\n#line 6653 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 129: /* init_declarator_list: init_declarator_list COMMA IDENTIFIER EQUAL initializer  */\n#line 1174 \"MachineIndependent/glslang.y\"\n                                                              {\n        (yyval.interm).type = (yyvsp[-4].interm).type;\n        TIntermNode* initNode = parseContext.declareVariable((yyvsp[-2].lex).loc, *(yyvsp[-2].lex).string, (yyvsp[-4].interm).type, 0, (yyvsp[0].interm.intermTypedNode));\n        (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-4].interm).intermNode, initNode, (yyvsp[-1].lex).loc);\n    }\n#line 6663 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 130: /* single_declaration: fully_specified_type  */\n#line 1182 \"MachineIndependent/glslang.y\"\n                           {\n        (yyval.interm).type = (yyvsp[0].interm.type);\n        (yyval.interm).intermNode = 0;\n        parseContext.declareTypeDefaults((yyval.interm).loc, (yyval.interm).type);\n    }\n#line 6673 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 131: /* single_declaration: fully_specified_type IDENTIFIER  */\n#line 1187 \"MachineIndependent/glslang.y\"\n                                      {\n        (yyval.interm).type = (yyvsp[-1].interm.type);\n        (yyval.interm).intermNode = 0;\n        parseContext.declareVariable((yyvsp[0].lex).loc, *(yyvsp[0].lex).string, (yyvsp[-1].interm.type));\n    }\n#line 6683 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 132: /* single_declaration: fully_specified_type IDENTIFIER array_specifier  */\n#line 1192 \"MachineIndependent/glslang.y\"\n                                                      {\n        (yyval.interm).type = (yyvsp[-2].interm.type);\n        (yyval.interm).intermNode = 0;\n        parseContext.declareVariable((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string, (yyvsp[-2].interm.type), (yyvsp[0].interm).arraySizes);\n    }\n#line 6693 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 133: /* single_declaration: fully_specified_type IDENTIFIER array_specifier EQUAL initializer  */\n#line 1197 \"MachineIndependent/glslang.y\"\n                                                                        {\n        (yyval.interm).type = (yyvsp[-4].interm.type);\n        TIntermNode* initNode = parseContext.declareVariable((yyvsp[-3].lex).loc, *(yyvsp[-3].lex).string, (yyvsp[-4].interm.type), (yyvsp[-2].interm).arraySizes, (yyvsp[0].interm.intermTypedNode));\n        (yyval.interm).intermNode = parseContext.intermediate.growAggregate(0, initNode, (yyvsp[-1].lex).loc);\n    }\n#line 6703 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 134: /* single_declaration: fully_specified_type IDENTIFIER EQUAL initializer  */\n#line 1202 \"MachineIndependent/glslang.y\"\n                                                        {\n        (yyval.interm).type = (yyvsp[-3].interm.type);\n        TIntermNode* initNode = parseContext.declareVariable((yyvsp[-2].lex).loc, *(yyvsp[-2].lex).string, (yyvsp[-3].interm.type), 0, (yyvsp[0].interm.intermTypedNode));\n        (yyval.interm).intermNode = parseContext.intermediate.growAggregate(0, initNode, (yyvsp[-1].lex).loc);\n    }\n#line 6713 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 135: /* fully_specified_type: type_specifier  */\n#line 1211 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.type) = (yyvsp[0].interm.type);\n\n        parseContext.globalQualifierTypeCheck((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).qualifier, (yyval.interm.type));\n        if ((yyvsp[0].interm.type).arraySizes) {\n            parseContext.profileRequires((yyvsp[0].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, \"arrayed type\");\n            parseContext.profileRequires((yyvsp[0].interm.type).loc, EEsProfile, 300, 0, \"arrayed type\");\n        }\n        parseContext.precisionQualifierCheck((yyval.interm.type).loc, (yyval.interm.type).basicType, (yyval.interm.type).qualifier, (yyval.interm.type).isCoopmatOrvec());\n    }\n#line 6728 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 136: /* fully_specified_type: type_qualifier type_specifier  */\n#line 1221 \"MachineIndependent/glslang.y\"\n                                     {\n        parseContext.globalQualifierFixCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, false, &(yyvsp[0].interm.type));\n        parseContext.globalQualifierTypeCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, (yyvsp[0].interm.type));\n\n        if ((yyvsp[0].interm.type).arraySizes) {\n            parseContext.profileRequires((yyvsp[0].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, \"arrayed type\");\n            parseContext.profileRequires((yyvsp[0].interm.type).loc, EEsProfile, 300, 0, \"arrayed type\");\n        }\n\n        if ((yyvsp[0].interm.type).arraySizes && parseContext.arrayQualifierError((yyvsp[0].interm.type).loc, (yyvsp[-1].interm.type).qualifier))\n            (yyvsp[0].interm.type).arraySizes = nullptr;\n\n        parseContext.checkNoShaderLayouts((yyvsp[0].interm.type).loc, (yyvsp[-1].interm.type).shaderQualifiers);\n        (yyvsp[0].interm.type).shaderQualifiers.merge((yyvsp[-1].interm.type).shaderQualifiers);\n        parseContext.mergeQualifiers((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).qualifier, (yyvsp[-1].interm.type).qualifier, true);\n        parseContext.precisionQualifierCheck((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).basicType, (yyvsp[0].interm.type).qualifier, (yyvsp[0].interm.type).isCoopmatOrvec());\n\n        (yyval.interm.type) = (yyvsp[0].interm.type);\n\n        if (! (yyval.interm.type).qualifier.isInterpolation() &&\n            ((parseContext.language == EShLangVertex   && (yyval.interm.type).qualifier.storage == EvqVaryingOut) ||\n             (parseContext.language == EShLangFragment && (yyval.interm.type).qualifier.storage == EvqVaryingIn)))\n            (yyval.interm.type).qualifier.smooth = true;\n    }\n#line 6757 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 137: /* invariant_qualifier: INVARIANT  */\n#line 1248 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"invariant\");\n        parseContext.profileRequires((yyval.interm.type).loc, ENoProfile, 120, 0, \"invariant\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.invariant = true;\n    }\n#line 6768 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 138: /* interpolation_qualifier: SMOOTH  */\n#line 1257 \"MachineIndependent/glslang.y\"\n             {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"smooth\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, \"smooth\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 300, 0, \"smooth\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.smooth = true;\n    }\n#line 6780 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 139: /* interpolation_qualifier: FLAT  */\n#line 1264 \"MachineIndependent/glslang.y\"\n           {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"flat\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, \"flat\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 300, 0, \"flat\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.flat = true;\n    }\n#line 6792 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 140: /* interpolation_qualifier: NOPERSPECTIVE  */\n#line 1271 \"MachineIndependent/glslang.y\"\n                    {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"noperspective\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 0, E_GL_NV_shader_noperspective_interpolation, \"noperspective\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, \"noperspective\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.nopersp = true;\n    }\n#line 6804 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 141: /* interpolation_qualifier: EXPLICITINTERPAMD  */\n#line 1278 \"MachineIndependent/glslang.y\"\n                        {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"__explicitInterpAMD\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 450, E_GL_AMD_shader_explicit_vertex_parameter, \"explicit interpolation\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, ECompatibilityProfile, 450, E_GL_AMD_shader_explicit_vertex_parameter, \"explicit interpolation\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.explicitInterp = true;\n    }\n#line 6816 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 142: /* interpolation_qualifier: PERVERTEXNV  */\n#line 1285 \"MachineIndependent/glslang.y\"\n                  {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"pervertexNV\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 0, E_GL_NV_fragment_shader_barycentric, \"fragment shader barycentric\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, ECompatibilityProfile, 0, E_GL_NV_fragment_shader_barycentric, \"fragment shader barycentric\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 0, E_GL_NV_fragment_shader_barycentric, \"fragment shader barycentric\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.pervertexNV = true;\n    }\n#line 6829 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 143: /* interpolation_qualifier: PERVERTEXEXT  */\n#line 1293 \"MachineIndependent/glslang.y\"\n                   {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"pervertexEXT\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 0, E_GL_EXT_fragment_shader_barycentric, \"fragment shader barycentric\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, ECompatibilityProfile, 0, E_GL_EXT_fragment_shader_barycentric, \"fragment shader barycentric\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 0, E_GL_EXT_fragment_shader_barycentric, \"fragment shader barycentric\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.pervertexEXT = true;\n    }\n#line 6842 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 144: /* interpolation_qualifier: PERPRIMITIVENV  */\n#line 1301 \"MachineIndependent/glslang.y\"\n                     {\n        // No need for profile version or extension check. Shader stage already checks both.\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"perprimitiveNV\");\n        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangFragmentMask | EShLangMeshMask), \"perprimitiveNV\");\n        // Fragment shader stage doesn't check for extension. So we explicitly add below extension check.\n        if (parseContext.language == EShLangFragment)\n            parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_NV_mesh_shader, \"perprimitiveNV\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.perPrimitiveNV = true;\n    }\n#line 6857 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 145: /* interpolation_qualifier: PERPRIMITIVEEXT  */\n#line 1311 \"MachineIndependent/glslang.y\"\n                      {\n        // No need for profile version or extension check. Shader stage already checks both.\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"perprimitiveEXT\");\n        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangFragmentMask | EShLangMeshMask), \"perprimitiveEXT\");\n        // Fragment shader stage doesn't check for extension. So we explicitly add below extension check.\n        if (parseContext.language == EShLangFragment)\n            parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_EXT_mesh_shader, \"perprimitiveEXT\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.perPrimitiveNV = true;\n    }\n#line 6872 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 146: /* interpolation_qualifier: PERVIEWNV  */\n#line 1321 \"MachineIndependent/glslang.y\"\n                {\n        // No need for profile version or extension check. Shader stage already checks both.\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"perviewNV\");\n        parseContext.requireStage((yyvsp[0].lex).loc, EShLangMesh, \"perviewNV\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.perViewNV = true;\n    }\n#line 6884 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 147: /* interpolation_qualifier: PERTASKNV  */\n#line 1328 \"MachineIndependent/glslang.y\"\n                {\n        // No need for profile version or extension check. Shader stage already checks both.\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"taskNV\");\n        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangTaskMask | EShLangMeshMask), \"taskNV\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.perTaskNV = true;\n    }\n#line 6896 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 148: /* layout_qualifier: LAYOUT LEFT_PAREN layout_qualifier_id_list RIGHT_PAREN  */\n#line 1338 \"MachineIndependent/glslang.y\"\n                                                             {\n        (yyval.interm.type) = (yyvsp[-1].interm.type);\n    }\n#line 6904 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 149: /* layout_qualifier_id_list: layout_qualifier_id  */\n#line 1344 \"MachineIndependent/glslang.y\"\n                          {\n        (yyval.interm.type) = (yyvsp[0].interm.type);\n    }\n#line 6912 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 150: /* layout_qualifier_id_list: layout_qualifier_id_list COMMA layout_qualifier_id  */\n#line 1347 \"MachineIndependent/glslang.y\"\n                                                         {\n        (yyval.interm.type) = (yyvsp[-2].interm.type);\n        (yyval.interm.type).shaderQualifiers.merge((yyvsp[0].interm.type).shaderQualifiers);\n        parseContext.mergeObjectLayoutQualifiers((yyval.interm.type).qualifier, (yyvsp[0].interm.type).qualifier, false);\n    }\n#line 6922 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 151: /* layout_qualifier_id: IDENTIFIER  */\n#line 1354 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        parseContext.setLayoutQualifier((yyvsp[0].lex).loc, (yyval.interm.type), *(yyvsp[0].lex).string);\n    }\n#line 6931 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 152: /* layout_qualifier_id: IDENTIFIER EQUAL constant_expression  */\n#line 1358 \"MachineIndependent/glslang.y\"\n                                           {\n        (yyval.interm.type).init((yyvsp[-2].lex).loc);\n        parseContext.setLayoutQualifier((yyvsp[-2].lex).loc, (yyval.interm.type), *(yyvsp[-2].lex).string, (yyvsp[0].interm.intermTypedNode));\n    }\n#line 6940 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 153: /* layout_qualifier_id: SHARED  */\n#line 1362 \"MachineIndependent/glslang.y\"\n             { // because \"shared\" is both an identifier and a keyword\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        TString strShared(\"shared\");\n        parseContext.setLayoutQualifier((yyvsp[0].lex).loc, (yyval.interm.type), strShared);\n    }\n#line 6950 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 154: /* precise_qualifier: PRECISE  */\n#line 1370 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.profileRequires((yyval.interm.type).loc, ECoreProfile | ECompatibilityProfile, 400, E_GL_ARB_gpu_shader5, \"precise\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 320, Num_AEP_gpu_shader5, AEP_gpu_shader5, \"precise\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.noContraction = true;\n    }\n#line 6961 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 155: /* type_qualifier: single_type_qualifier  */\n#line 1379 \"MachineIndependent/glslang.y\"\n                            {\n        (yyval.interm.type) = (yyvsp[0].interm.type);\n    }\n#line 6969 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 156: /* type_qualifier: type_qualifier single_type_qualifier  */\n#line 1382 \"MachineIndependent/glslang.y\"\n                                           {\n        (yyval.interm.type) = (yyvsp[-1].interm.type);\n        if ((yyval.interm.type).basicType == EbtVoid)\n            (yyval.interm.type).basicType = (yyvsp[0].interm.type).basicType;\n\n        (yyval.interm.type).shaderQualifiers.merge((yyvsp[0].interm.type).shaderQualifiers);\n        parseContext.mergeQualifiers((yyval.interm.type).loc, (yyval.interm.type).qualifier, (yyvsp[0].interm.type).qualifier, false);\n    }\n#line 6982 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 157: /* single_type_qualifier: storage_qualifier  */\n#line 1393 \"MachineIndependent/glslang.y\"\n                        {\n        (yyval.interm.type) = (yyvsp[0].interm.type);\n    }\n#line 6990 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 158: /* single_type_qualifier: layout_qualifier  */\n#line 1396 \"MachineIndependent/glslang.y\"\n                       {\n        (yyval.interm.type) = (yyvsp[0].interm.type);\n    }\n#line 6998 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 159: /* single_type_qualifier: precision_qualifier  */\n#line 1399 \"MachineIndependent/glslang.y\"\n                          {\n        parseContext.checkPrecisionQualifier((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).qualifier.precision);\n        (yyval.interm.type) = (yyvsp[0].interm.type);\n    }\n#line 7007 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 160: /* single_type_qualifier: interpolation_qualifier  */\n#line 1403 \"MachineIndependent/glslang.y\"\n                              {\n        // allow inheritance of storage qualifier from block declaration\n        (yyval.interm.type) = (yyvsp[0].interm.type);\n    }\n#line 7016 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 161: /* single_type_qualifier: invariant_qualifier  */\n#line 1407 \"MachineIndependent/glslang.y\"\n                          {\n        // allow inheritance of storage qualifier from block declaration\n        (yyval.interm.type) = (yyvsp[0].interm.type);\n    }\n#line 7025 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 162: /* single_type_qualifier: precise_qualifier  */\n#line 1411 \"MachineIndependent/glslang.y\"\n                        {\n        // allow inheritance of storage qualifier from block declaration\n        (yyval.interm.type) = (yyvsp[0].interm.type);\n    }\n#line 7034 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 163: /* single_type_qualifier: non_uniform_qualifier  */\n#line 1415 \"MachineIndependent/glslang.y\"\n                            {\n        (yyval.interm.type) = (yyvsp[0].interm.type);\n    }\n#line 7042 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 164: /* single_type_qualifier: spirv_storage_class_qualifier  */\n#line 1418 \"MachineIndependent/glslang.y\"\n                                    {\n        parseContext.globalCheck((yyvsp[0].interm.type).loc, \"spirv_storage_class\");\n        parseContext.requireExtensions((yyvsp[0].interm.type).loc, 1, &E_GL_EXT_spirv_intrinsics, \"SPIR-V storage class qualifier\");\n        (yyval.interm.type) = (yyvsp[0].interm.type);\n    }\n#line 7052 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 165: /* single_type_qualifier: spirv_decorate_qualifier  */\n#line 1423 \"MachineIndependent/glslang.y\"\n                               {\n        parseContext.requireExtensions((yyvsp[0].interm.type).loc, 1, &E_GL_EXT_spirv_intrinsics, \"SPIR-V decorate qualifier\");\n        (yyval.interm.type) = (yyvsp[0].interm.type);\n    }\n#line 7061 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 166: /* single_type_qualifier: SPIRV_BY_REFERENCE  */\n#line 1427 \"MachineIndependent/glslang.y\"\n                         {\n        parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_EXT_spirv_intrinsics, \"spirv_by_reference\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.setSpirvByReference();\n    }\n#line 7071 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 167: /* single_type_qualifier: SPIRV_LITERAL  */\n#line 1432 \"MachineIndependent/glslang.y\"\n                    {\n        parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_EXT_spirv_intrinsics, \"spirv_by_literal\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.setSpirvLiteral();\n    }\n#line 7081 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 168: /* storage_qualifier: CONST  */\n#line 1440 \"MachineIndependent/glslang.y\"\n            {\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.storage = EvqConst;  // will later turn into EvqConstReadOnly, if the initializer is not constant\n    }\n#line 7090 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 169: /* storage_qualifier: INOUT  */\n#line 1444 \"MachineIndependent/glslang.y\"\n            {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"inout\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.storage = EvqInOut;\n    }\n#line 7100 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 170: /* storage_qualifier: IN  */\n#line 1449 \"MachineIndependent/glslang.y\"\n         {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"in\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        // whether this is a parameter \"in\" or a pipeline \"in\" will get sorted out a bit later\n        (yyval.interm.type).qualifier.storage = EvqIn;\n    }\n#line 7111 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 171: /* storage_qualifier: OUT  */\n#line 1455 \"MachineIndependent/glslang.y\"\n          {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"out\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        // whether this is a parameter \"out\" or a pipeline \"out\" will get sorted out a bit later\n        (yyval.interm.type).qualifier.storage = EvqOut;\n    }\n#line 7122 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 172: /* storage_qualifier: CENTROID  */\n#line 1461 \"MachineIndependent/glslang.y\"\n               {\n        parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 120, 0, \"centroid\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 300, 0, \"centroid\");\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"centroid\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.centroid = true;\n    }\n#line 7134 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 173: /* storage_qualifier: UNIFORM  */\n#line 1468 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"uniform\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.storage = EvqUniform;\n    }\n#line 7144 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 174: /* storage_qualifier: TILEIMAGEEXT  */\n#line 1473 \"MachineIndependent/glslang.y\"\n                   {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"tileImageEXT\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.storage = EvqTileImageEXT;\n    }\n#line 7154 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 175: /* storage_qualifier: SHARED  */\n#line 1478 \"MachineIndependent/glslang.y\"\n             {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"shared\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, 430, E_GL_ARB_compute_shader, \"shared\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 310, 0, \"shared\");\n        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangComputeMask | EShLangMeshMask | EShLangTaskMask), \"shared\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.storage = EvqShared;\n    }\n#line 7167 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 176: /* storage_qualifier: BUFFER  */\n#line 1486 \"MachineIndependent/glslang.y\"\n             {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"buffer\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.storage = EvqBuffer;\n    }\n#line 7177 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 177: /* storage_qualifier: ATTRIBUTE  */\n#line 1491 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.requireStage((yyvsp[0].lex).loc, EShLangVertex, \"attribute\");\n        parseContext.checkDeprecated((yyvsp[0].lex).loc, ECoreProfile, 130, \"attribute\");\n        parseContext.checkDeprecated((yyvsp[0].lex).loc, ENoProfile, 130, \"attribute\");\n        parseContext.requireNotRemoved((yyvsp[0].lex).loc, ECoreProfile, 420, \"attribute\");\n        parseContext.requireNotRemoved((yyvsp[0].lex).loc, EEsProfile, 300, \"attribute\");\n\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"attribute\");\n\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.storage = EvqVaryingIn;\n    }\n#line 7194 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 178: /* storage_qualifier: VARYING  */\n#line 1503 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.checkDeprecated((yyvsp[0].lex).loc, ENoProfile, 130, \"varying\");\n        parseContext.checkDeprecated((yyvsp[0].lex).loc, ECoreProfile, 130, \"varying\");\n        parseContext.requireNotRemoved((yyvsp[0].lex).loc, ECoreProfile, 420, \"varying\");\n        parseContext.requireNotRemoved((yyvsp[0].lex).loc, EEsProfile, 300, \"varying\");\n\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"varying\");\n\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        if (parseContext.language == EShLangVertex)\n            (yyval.interm.type).qualifier.storage = EvqVaryingOut;\n        else\n            (yyval.interm.type).qualifier.storage = EvqVaryingIn;\n    }\n#line 7213 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 179: /* storage_qualifier: PATCH  */\n#line 1517 \"MachineIndependent/glslang.y\"\n            {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"patch\");\n        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangTessControlMask | EShLangTessEvaluationMask), \"patch\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.patch = true;\n    }\n#line 7224 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 180: /* storage_qualifier: SAMPLE  */\n#line 1523 \"MachineIndependent/glslang.y\"\n             {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"sample\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.sample = true;\n    }\n#line 7234 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 181: /* storage_qualifier: HITATTRNV  */\n#line 1528 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"hitAttributeNV\");\n        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangIntersectMask | EShLangClosestHitMask\n            | EShLangAnyHitMask), \"hitAttributeNV\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 460, E_GL_NV_ray_tracing, \"hitAttributeNV\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.storage = EvqHitAttr;\n    }\n#line 7247 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 182: /* storage_qualifier: HITOBJECTATTRNV  */\n#line 1536 \"MachineIndependent/glslang.y\"\n                          {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"hitAttributeNV\");\n        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenMask | EShLangClosestHitMask\n            | EShLangMissMask), \"hitObjectAttributeNV\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 460, E_GL_NV_shader_invocation_reorder, \"hitObjectAttributeNV\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.storage = EvqHitObjectAttrNV;\n\t}\n#line 7260 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 183: /* storage_qualifier: HITATTREXT  */\n#line 1544 \"MachineIndependent/glslang.y\"\n                 {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"hitAttributeEXT\");\n        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangIntersectMask | EShLangClosestHitMask\n            | EShLangAnyHitMask), \"hitAttributeEXT\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 460, E_GL_EXT_ray_tracing, \"hitAttributeNV\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.storage = EvqHitAttr;\n    }\n#line 7273 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 184: /* storage_qualifier: PAYLOADNV  */\n#line 1552 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"rayPayloadNV\");\n        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenMask | EShLangClosestHitMask |\n            EShLangAnyHitMask | EShLangMissMask), \"rayPayloadNV\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 460, E_GL_NV_ray_tracing, \"rayPayloadNV\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.storage = EvqPayload;\n    }\n#line 7286 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 185: /* storage_qualifier: PAYLOADEXT  */\n#line 1560 \"MachineIndependent/glslang.y\"\n                 {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"rayPayloadEXT\");\n        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenMask | EShLangClosestHitMask |\n            EShLangAnyHitMask | EShLangMissMask), \"rayPayloadEXT\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 460, E_GL_EXT_ray_tracing, \"rayPayloadEXT\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.storage = EvqPayload;\n    }\n#line 7299 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 186: /* storage_qualifier: PAYLOADINNV  */\n#line 1568 \"MachineIndependent/glslang.y\"\n                  {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"rayPayloadInNV\");\n        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangClosestHitMask |\n            EShLangAnyHitMask | EShLangMissMask), \"rayPayloadInNV\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 460, E_GL_NV_ray_tracing, \"rayPayloadInNV\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.storage = EvqPayloadIn;\n    }\n#line 7312 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 187: /* storage_qualifier: PAYLOADINEXT  */\n#line 1576 \"MachineIndependent/glslang.y\"\n                   {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"rayPayloadInEXT\");\n        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangClosestHitMask |\n            EShLangAnyHitMask | EShLangMissMask), \"rayPayloadInEXT\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 460, E_GL_EXT_ray_tracing, \"rayPayloadInEXT\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.storage = EvqPayloadIn;\n    }\n#line 7325 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 188: /* storage_qualifier: CALLDATANV  */\n#line 1584 \"MachineIndependent/glslang.y\"\n                 {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"callableDataNV\");\n        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenMask |\n            EShLangClosestHitMask | EShLangMissMask | EShLangCallableMask), \"callableDataNV\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 460, E_GL_NV_ray_tracing, \"callableDataNV\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.storage = EvqCallableData;\n    }\n#line 7338 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 189: /* storage_qualifier: CALLDATAEXT  */\n#line 1592 \"MachineIndependent/glslang.y\"\n                  {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"callableDataEXT\");\n        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenMask |\n            EShLangClosestHitMask | EShLangMissMask | EShLangCallableMask), \"callableDataEXT\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 460, E_GL_EXT_ray_tracing, \"callableDataEXT\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.storage = EvqCallableData;\n    }\n#line 7351 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 190: /* storage_qualifier: CALLDATAINNV  */\n#line 1600 \"MachineIndependent/glslang.y\"\n                   {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"callableDataInNV\");\n        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangCallableMask), \"callableDataInNV\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 460, E_GL_NV_ray_tracing, \"callableDataInNV\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.storage = EvqCallableDataIn;\n    }\n#line 7363 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 191: /* storage_qualifier: CALLDATAINEXT  */\n#line 1607 \"MachineIndependent/glslang.y\"\n                    {\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"callableDataInEXT\");\n        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangCallableMask), \"callableDataInEXT\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 460, E_GL_EXT_ray_tracing, \"callableDataInEXT\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.storage = EvqCallableDataIn;\n    }\n#line 7375 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 192: /* storage_qualifier: COHERENT  */\n#line 1614 \"MachineIndependent/glslang.y\"\n               {\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.coherent = true;\n    }\n#line 7384 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 193: /* storage_qualifier: DEVICECOHERENT  */\n#line 1618 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, \"devicecoherent\");\n        (yyval.interm.type).qualifier.devicecoherent = true;\n    }\n#line 7394 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 194: /* storage_qualifier: QUEUEFAMILYCOHERENT  */\n#line 1623 \"MachineIndependent/glslang.y\"\n                          {\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, \"queuefamilycoherent\");\n        (yyval.interm.type).qualifier.queuefamilycoherent = true;\n    }\n#line 7404 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 195: /* storage_qualifier: WORKGROUPCOHERENT  */\n#line 1628 \"MachineIndependent/glslang.y\"\n                        {\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, \"workgroupcoherent\");\n        (yyval.interm.type).qualifier.workgroupcoherent = true;\n    }\n#line 7414 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 196: /* storage_qualifier: SUBGROUPCOHERENT  */\n#line 1633 \"MachineIndependent/glslang.y\"\n                       {\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, \"subgroupcoherent\");\n        (yyval.interm.type).qualifier.subgroupcoherent = true;\n    }\n#line 7424 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 197: /* storage_qualifier: NONPRIVATE  */\n#line 1638 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, \"nonprivate\");\n        (yyval.interm.type).qualifier.nonprivate = true;\n    }\n#line 7434 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 198: /* storage_qualifier: SHADERCALLCOHERENT  */\n#line 1643 \"MachineIndependent/glslang.y\"\n                         {\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_EXT_ray_tracing, \"shadercallcoherent\");\n        (yyval.interm.type).qualifier.shadercallcoherent = true;\n    }\n#line 7444 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 199: /* storage_qualifier: VOLATILE  */\n#line 1648 \"MachineIndependent/glslang.y\"\n               {\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.volatil = true;\n    }\n#line 7453 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 200: /* storage_qualifier: RESTRICT  */\n#line 1652 \"MachineIndependent/glslang.y\"\n               {\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.restrict = true;\n    }\n#line 7462 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 201: /* storage_qualifier: READONLY  */\n#line 1656 \"MachineIndependent/glslang.y\"\n               {\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.readonly = true;\n    }\n#line 7471 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 202: /* storage_qualifier: WRITEONLY  */\n#line 1660 \"MachineIndependent/glslang.y\"\n                {\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.writeonly = true;\n    }\n#line 7480 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 203: /* storage_qualifier: NONTEMPORAL  */\n#line 1664 \"MachineIndependent/glslang.y\"\n                  {\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.nontemporal  = true;\n    }\n#line 7489 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 204: /* storage_qualifier: SUBROUTINE  */\n#line 1668 \"MachineIndependent/glslang.y\"\n                 {\n        parseContext.spvRemoved((yyvsp[0].lex).loc, \"subroutine\");\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"subroutine\");\n        parseContext.unimplemented((yyvsp[0].lex).loc, \"subroutine\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n    }\n#line 7500 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 205: /* storage_qualifier: SUBROUTINE LEFT_PAREN type_name_list RIGHT_PAREN  */\n#line 1674 \"MachineIndependent/glslang.y\"\n                                                       {\n        parseContext.spvRemoved((yyvsp[-3].lex).loc, \"subroutine\");\n        parseContext.globalCheck((yyvsp[-3].lex).loc, \"subroutine\");\n        parseContext.unimplemented((yyvsp[-3].lex).loc, \"subroutine\");\n        (yyval.interm.type).init((yyvsp[-3].lex).loc);\n    }\n#line 7511 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 206: /* storage_qualifier: TASKPAYLOADWORKGROUPEXT  */\n#line 1680 \"MachineIndependent/glslang.y\"\n                              {\n        // No need for profile version or extension check. Shader stage already checks both.\n        parseContext.globalCheck((yyvsp[0].lex).loc, \"taskPayloadSharedEXT\");\n        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangTaskMask | EShLangMeshMask), \"taskPayloadSharedEXT  \");\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.storage = EvqtaskPayloadSharedEXT;\n    }\n#line 7523 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 207: /* non_uniform_qualifier: NONUNIFORM  */\n#line 1690 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).qualifier.nonUniform = true;\n    }\n#line 7532 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 208: /* type_name_list: IDENTIFIER  */\n#line 1697 \"MachineIndependent/glslang.y\"\n                 {\n        // TODO\n    }\n#line 7540 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 209: /* type_name_list: type_name_list COMMA IDENTIFIER  */\n#line 1700 \"MachineIndependent/glslang.y\"\n                                      {\n        // TODO: 4.0 semantics: subroutines\n        // 1) make sure each identifier is a type declared earlier with SUBROUTINE\n        // 2) save all of the identifiers for future comparison with the declared function\n    }\n#line 7550 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 210: /* type_specifier: type_specifier_nonarray type_parameter_specifier_opt  */\n#line 1708 \"MachineIndependent/glslang.y\"\n                                                           {\n        (yyval.interm.type) = (yyvsp[-1].interm.type);\n        (yyval.interm.type).qualifier.precision = parseContext.getDefaultPrecision((yyval.interm.type));\n        (yyval.interm.type).typeParameters = (yyvsp[0].interm.typeParameters);\n        parseContext.typeParametersCheck((yyvsp[-1].interm.type).loc, (yyval.interm.type));\n\n    }\n#line 7562 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 211: /* type_specifier: type_specifier_nonarray type_parameter_specifier_opt array_specifier  */\n#line 1715 \"MachineIndependent/glslang.y\"\n                                                                           {\n        parseContext.arrayOfArrayVersionCheck((yyvsp[0].interm).loc, (yyvsp[0].interm).arraySizes);\n        (yyval.interm.type) = (yyvsp[-2].interm.type);\n        (yyval.interm.type).qualifier.precision = parseContext.getDefaultPrecision((yyval.interm.type));\n        (yyval.interm.type).typeParameters = (yyvsp[-1].interm.typeParameters);\n        (yyval.interm.type).arraySizes = (yyvsp[0].interm).arraySizes;\n        parseContext.typeParametersCheck((yyvsp[-2].interm.type).loc, (yyval.interm.type));\n    }\n#line 7575 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 212: /* array_specifier: LEFT_BRACKET RIGHT_BRACKET  */\n#line 1726 \"MachineIndependent/glslang.y\"\n                                 {\n        (yyval.interm).loc = (yyvsp[-1].lex).loc;\n        (yyval.interm).arraySizes = new TArraySizes;\n        (yyval.interm).arraySizes->addInnerSize();\n    }\n#line 7585 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 213: /* array_specifier: LEFT_BRACKET conditional_expression RIGHT_BRACKET  */\n#line 1731 \"MachineIndependent/glslang.y\"\n                                                        {\n        (yyval.interm).loc = (yyvsp[-2].lex).loc;\n        (yyval.interm).arraySizes = new TArraySizes;\n\n        TArraySize size;\n        parseContext.arraySizeCheck((yyvsp[-1].interm.intermTypedNode)->getLoc(), (yyvsp[-1].interm.intermTypedNode), size, \"array size\");\n        (yyval.interm).arraySizes->addInnerSize(size);\n    }\n#line 7598 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 214: /* array_specifier: array_specifier LEFT_BRACKET RIGHT_BRACKET  */\n#line 1739 \"MachineIndependent/glslang.y\"\n                                                 {\n        (yyval.interm) = (yyvsp[-2].interm);\n        (yyval.interm).arraySizes->addInnerSize();\n    }\n#line 7607 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 215: /* array_specifier: array_specifier LEFT_BRACKET conditional_expression RIGHT_BRACKET  */\n#line 1743 \"MachineIndependent/glslang.y\"\n                                                                        {\n        (yyval.interm) = (yyvsp[-3].interm);\n\n        TArraySize size;\n        parseContext.arraySizeCheck((yyvsp[-1].interm.intermTypedNode)->getLoc(), (yyvsp[-1].interm.intermTypedNode), size, \"array size\");\n        (yyval.interm).arraySizes->addInnerSize(size);\n    }\n#line 7619 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 216: /* type_parameter_specifier_opt: type_parameter_specifier  */\n#line 1753 \"MachineIndependent/glslang.y\"\n                               {\n        (yyval.interm.typeParameters) = (yyvsp[0].interm.typeParameters);\n    }\n#line 7627 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 217: /* type_parameter_specifier_opt: %empty  */\n#line 1756 \"MachineIndependent/glslang.y\"\n                        {\n        (yyval.interm.typeParameters) = 0;\n    }\n#line 7635 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 218: /* type_parameter_specifier: LEFT_ANGLE type_parameter_specifier_list RIGHT_ANGLE  */\n#line 1762 \"MachineIndependent/glslang.y\"\n                                                           {\n        (yyval.interm.typeParameters) = (yyvsp[-1].interm.typeParameters);\n    }\n#line 7643 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 219: /* type_parameter_specifier_list: type_specifier  */\n#line 1768 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.typeParameters) = new TTypeParameters;\n        (yyval.interm.typeParameters)->arraySizes = new TArraySizes;\n        (yyval.interm.typeParameters)->spirvType = (yyvsp[0].interm.type).spirvType;\n        (yyval.interm.typeParameters)->basicType = (yyvsp[0].interm.type).basicType;\n    }\n#line 7654 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 220: /* type_parameter_specifier_list: unary_expression  */\n#line 1774 \"MachineIndependent/glslang.y\"\n                       {\n        (yyval.interm.typeParameters) = new TTypeParameters;\n        (yyval.interm.typeParameters)->arraySizes = new TArraySizes;\n\n        TArraySize size;\n        parseContext.arraySizeCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode), size, \"type parameter\", true);\n        (yyval.interm.typeParameters)->arraySizes->addInnerSize(size);\n    }\n#line 7667 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 221: /* type_parameter_specifier_list: type_parameter_specifier_list COMMA unary_expression  */\n#line 1782 \"MachineIndependent/glslang.y\"\n                                                           {\n        (yyval.interm.typeParameters) = (yyvsp[-2].interm.typeParameters);\n\n        TArraySize size;\n        parseContext.arraySizeCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode), size, \"type parameter\", true);\n        (yyval.interm.typeParameters)->arraySizes->addInnerSize(size);\n    }\n#line 7679 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 222: /* type_specifier_nonarray: VOID  */\n#line 1792 \"MachineIndependent/glslang.y\"\n           {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtVoid;\n    }\n#line 7688 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 223: /* type_specifier_nonarray: FLOAT  */\n#line 1796 \"MachineIndependent/glslang.y\"\n            {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n    }\n#line 7697 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 224: /* type_specifier_nonarray: INT  */\n#line 1800 \"MachineIndependent/glslang.y\"\n          {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtInt;\n    }\n#line 7706 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 225: /* type_specifier_nonarray: UINT  */\n#line 1804 \"MachineIndependent/glslang.y\"\n           {\n        parseContext.fullIntegerCheck((yyvsp[0].lex).loc, \"unsigned integer\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtUint;\n    }\n#line 7716 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 226: /* type_specifier_nonarray: BOOL  */\n#line 1809 \"MachineIndependent/glslang.y\"\n           {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtBool;\n    }\n#line 7725 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 227: /* type_specifier_nonarray: VEC2  */\n#line 1813 \"MachineIndependent/glslang.y\"\n           {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setVector(2);\n    }\n#line 7735 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 228: /* type_specifier_nonarray: VEC3  */\n#line 1818 \"MachineIndependent/glslang.y\"\n           {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setVector(3);\n    }\n#line 7745 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 229: /* type_specifier_nonarray: VEC4  */\n#line 1823 \"MachineIndependent/glslang.y\"\n           {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setVector(4);\n    }\n#line 7755 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 230: /* type_specifier_nonarray: BVEC2  */\n#line 1828 \"MachineIndependent/glslang.y\"\n            {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtBool;\n        (yyval.interm.type).setVector(2);\n    }\n#line 7765 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 231: /* type_specifier_nonarray: BVEC3  */\n#line 1833 \"MachineIndependent/glslang.y\"\n            {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtBool;\n        (yyval.interm.type).setVector(3);\n    }\n#line 7775 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 232: /* type_specifier_nonarray: BVEC4  */\n#line 1838 \"MachineIndependent/glslang.y\"\n            {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtBool;\n        (yyval.interm.type).setVector(4);\n    }\n#line 7785 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 233: /* type_specifier_nonarray: IVEC2  */\n#line 1843 \"MachineIndependent/glslang.y\"\n            {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtInt;\n        (yyval.interm.type).setVector(2);\n    }\n#line 7795 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 234: /* type_specifier_nonarray: IVEC3  */\n#line 1848 \"MachineIndependent/glslang.y\"\n            {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtInt;\n        (yyval.interm.type).setVector(3);\n    }\n#line 7805 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 235: /* type_specifier_nonarray: IVEC4  */\n#line 1853 \"MachineIndependent/glslang.y\"\n            {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtInt;\n        (yyval.interm.type).setVector(4);\n    }\n#line 7815 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 236: /* type_specifier_nonarray: UVEC2  */\n#line 1858 \"MachineIndependent/glslang.y\"\n            {\n        parseContext.fullIntegerCheck((yyvsp[0].lex).loc, \"unsigned integer vector\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtUint;\n        (yyval.interm.type).setVector(2);\n    }\n#line 7826 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 237: /* type_specifier_nonarray: UVEC3  */\n#line 1864 \"MachineIndependent/glslang.y\"\n            {\n        parseContext.fullIntegerCheck((yyvsp[0].lex).loc, \"unsigned integer vector\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtUint;\n        (yyval.interm.type).setVector(3);\n    }\n#line 7837 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 238: /* type_specifier_nonarray: UVEC4  */\n#line 1870 \"MachineIndependent/glslang.y\"\n            {\n        parseContext.fullIntegerCheck((yyvsp[0].lex).loc, \"unsigned integer vector\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtUint;\n        (yyval.interm.type).setVector(4);\n    }\n#line 7848 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 239: /* type_specifier_nonarray: MAT2  */\n#line 1876 \"MachineIndependent/glslang.y\"\n           {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(2, 2);\n    }\n#line 7858 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 240: /* type_specifier_nonarray: MAT3  */\n#line 1881 \"MachineIndependent/glslang.y\"\n           {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(3, 3);\n    }\n#line 7868 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 241: /* type_specifier_nonarray: MAT4  */\n#line 1886 \"MachineIndependent/glslang.y\"\n           {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(4, 4);\n    }\n#line 7878 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 242: /* type_specifier_nonarray: MAT2X2  */\n#line 1891 \"MachineIndependent/glslang.y\"\n             {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(2, 2);\n    }\n#line 7888 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 243: /* type_specifier_nonarray: MAT2X3  */\n#line 1896 \"MachineIndependent/glslang.y\"\n             {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(2, 3);\n    }\n#line 7898 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 244: /* type_specifier_nonarray: MAT2X4  */\n#line 1901 \"MachineIndependent/glslang.y\"\n             {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(2, 4);\n    }\n#line 7908 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 245: /* type_specifier_nonarray: MAT3X2  */\n#line 1906 \"MachineIndependent/glslang.y\"\n             {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(3, 2);\n    }\n#line 7918 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 246: /* type_specifier_nonarray: MAT3X3  */\n#line 1911 \"MachineIndependent/glslang.y\"\n             {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(3, 3);\n    }\n#line 7928 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 247: /* type_specifier_nonarray: MAT3X4  */\n#line 1916 \"MachineIndependent/glslang.y\"\n             {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(3, 4);\n    }\n#line 7938 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 248: /* type_specifier_nonarray: MAT4X2  */\n#line 1921 \"MachineIndependent/glslang.y\"\n             {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(4, 2);\n    }\n#line 7948 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 249: /* type_specifier_nonarray: MAT4X3  */\n#line 1926 \"MachineIndependent/glslang.y\"\n             {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(4, 3);\n    }\n#line 7958 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 250: /* type_specifier_nonarray: MAT4X4  */\n#line 1931 \"MachineIndependent/glslang.y\"\n             {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(4, 4);\n    }\n#line 7968 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 251: /* type_specifier_nonarray: DOUBLE  */\n#line 1936 \"MachineIndependent/glslang.y\"\n             {\n        parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, \"double\");\n        if (! parseContext.symbolTable.atBuiltInLevel())\n            parseContext.doubleCheck((yyvsp[0].lex).loc, \"double\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n    }\n#line 7980 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 252: /* type_specifier_nonarray: BFLOAT16_T  */\n#line 1943 \"MachineIndependent/glslang.y\"\n                 {\n        parseContext.bfloat16ScalarVectorCheck((yyvsp[0].lex).loc, \"bfloat16_t\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtBFloat16;\n    }\n#line 7990 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 253: /* type_specifier_nonarray: FLOATE5M2_T  */\n#line 1948 \"MachineIndependent/glslang.y\"\n                  {\n        parseContext.floate5m2ScalarVectorCheck((yyvsp[0].lex).loc, \"floate5m2_t\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloatE5M2;\n    }\n#line 8000 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 254: /* type_specifier_nonarray: FLOATE4M3_T  */\n#line 1953 \"MachineIndependent/glslang.y\"\n                  {\n        parseContext.floate4m3ScalarVectorCheck((yyvsp[0].lex).loc, \"floate4m3_t\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloatE4M3;\n    }\n#line 8010 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 255: /* type_specifier_nonarray: FLOAT16_T  */\n#line 1958 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, \"float16_t\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat16;\n    }\n#line 8020 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 256: /* type_specifier_nonarray: FLOAT32_T  */\n#line 1963 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, \"float32_t\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n    }\n#line 8030 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 257: /* type_specifier_nonarray: FLOAT64_T  */\n#line 1968 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, \"float64_t\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n    }\n#line 8040 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 258: /* type_specifier_nonarray: INT8_T  */\n#line 1973 \"MachineIndependent/glslang.y\"\n             {\n        parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, \"8-bit signed integer\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtInt8;\n    }\n#line 8050 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 259: /* type_specifier_nonarray: UINT8_T  */\n#line 1978 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, \"8-bit unsigned integer\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtUint8;\n    }\n#line 8060 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 260: /* type_specifier_nonarray: INT16_T  */\n#line 1983 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, \"16-bit signed integer\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtInt16;\n    }\n#line 8070 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 261: /* type_specifier_nonarray: UINT16_T  */\n#line 1988 \"MachineIndependent/glslang.y\"\n               {\n        parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, \"16-bit unsigned integer\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtUint16;\n    }\n#line 8080 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 262: /* type_specifier_nonarray: INT32_T  */\n#line 1993 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.explicitInt32Check((yyvsp[0].lex).loc, \"32-bit signed integer\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtInt;\n    }\n#line 8090 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 263: /* type_specifier_nonarray: UINT32_T  */\n#line 1998 \"MachineIndependent/glslang.y\"\n               {\n        parseContext.explicitInt32Check((yyvsp[0].lex).loc, \"32-bit unsigned integer\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtUint;\n    }\n#line 8100 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 264: /* type_specifier_nonarray: INT64_T  */\n#line 2003 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.int64Check((yyvsp[0].lex).loc, \"64-bit integer\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtInt64;\n    }\n#line 8110 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 265: /* type_specifier_nonarray: UINT64_T  */\n#line 2008 \"MachineIndependent/glslang.y\"\n               {\n        parseContext.int64Check((yyvsp[0].lex).loc, \"64-bit unsigned integer\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtUint64;\n    }\n#line 8120 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 266: /* type_specifier_nonarray: DVEC2  */\n#line 2013 \"MachineIndependent/glslang.y\"\n            {\n        parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, \"double vector\");\n        if (! parseContext.symbolTable.atBuiltInLevel())\n            parseContext.doubleCheck((yyvsp[0].lex).loc, \"double vector\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setVector(2);\n    }\n#line 8133 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 267: /* type_specifier_nonarray: DVEC3  */\n#line 2021 \"MachineIndependent/glslang.y\"\n            {\n        parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, \"double vector\");\n        if (! parseContext.symbolTable.atBuiltInLevel())\n            parseContext.doubleCheck((yyvsp[0].lex).loc, \"double vector\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setVector(3);\n    }\n#line 8146 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 268: /* type_specifier_nonarray: DVEC4  */\n#line 2029 \"MachineIndependent/glslang.y\"\n            {\n        parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, \"double vector\");\n        if (! parseContext.symbolTable.atBuiltInLevel())\n            parseContext.doubleCheck((yyvsp[0].lex).loc, \"double vector\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setVector(4);\n    }\n#line 8159 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 269: /* type_specifier_nonarray: BF16VEC2  */\n#line 2037 \"MachineIndependent/glslang.y\"\n               {\n        parseContext.bfloat16ScalarVectorCheck((yyvsp[0].lex).loc, \"half float vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtBFloat16;\n        (yyval.interm.type).setVector(2);\n    }\n#line 8170 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 270: /* type_specifier_nonarray: BF16VEC3  */\n#line 2043 \"MachineIndependent/glslang.y\"\n               {\n        parseContext.bfloat16ScalarVectorCheck((yyvsp[0].lex).loc, \"half float vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtBFloat16;\n        (yyval.interm.type).setVector(3);\n    }\n#line 8181 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 271: /* type_specifier_nonarray: BF16VEC4  */\n#line 2049 \"MachineIndependent/glslang.y\"\n               {\n        parseContext.bfloat16ScalarVectorCheck((yyvsp[0].lex).loc, \"half float vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtBFloat16;\n        (yyval.interm.type).setVector(4);\n    }\n#line 8192 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 272: /* type_specifier_nonarray: FE5M2VEC2  */\n#line 2055 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.floate5m2ScalarVectorCheck((yyvsp[0].lex).loc, \"fe5m2 vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloatE5M2;\n        (yyval.interm.type).setVector(2);\n    }\n#line 8203 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 273: /* type_specifier_nonarray: FE5M2VEC3  */\n#line 2061 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.floate5m2ScalarVectorCheck((yyvsp[0].lex).loc, \"fe5m2 vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloatE5M2;\n        (yyval.interm.type).setVector(3);\n    }\n#line 8214 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 274: /* type_specifier_nonarray: FE5M2VEC4  */\n#line 2067 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.floate5m2ScalarVectorCheck((yyvsp[0].lex).loc, \"fe5m2 vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloatE5M2;\n        (yyval.interm.type).setVector(4);\n    }\n#line 8225 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 275: /* type_specifier_nonarray: FE4M3VEC2  */\n#line 2073 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.floate4m3ScalarVectorCheck((yyvsp[0].lex).loc, \"fe4m3 vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloatE4M3;\n        (yyval.interm.type).setVector(2);\n    }\n#line 8236 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 276: /* type_specifier_nonarray: FE4M3VEC3  */\n#line 2079 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.floate4m3ScalarVectorCheck((yyvsp[0].lex).loc, \"fe4m3 vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloatE4M3;\n        (yyval.interm.type).setVector(3);\n    }\n#line 8247 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 277: /* type_specifier_nonarray: FE4M3VEC4  */\n#line 2085 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.floate4m3ScalarVectorCheck((yyvsp[0].lex).loc, \"fe4m3 vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloatE4M3;\n        (yyval.interm.type).setVector(4);\n    }\n#line 8258 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 278: /* type_specifier_nonarray: F16VEC2  */\n#line 2091 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, \"half float vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat16;\n        (yyval.interm.type).setVector(2);\n    }\n#line 8269 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 279: /* type_specifier_nonarray: F16VEC3  */\n#line 2097 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, \"half float vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat16;\n        (yyval.interm.type).setVector(3);\n    }\n#line 8280 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 280: /* type_specifier_nonarray: F16VEC4  */\n#line 2103 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, \"half float vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat16;\n        (yyval.interm.type).setVector(4);\n    }\n#line 8291 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 281: /* type_specifier_nonarray: F32VEC2  */\n#line 2109 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, \"float32_t vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setVector(2);\n    }\n#line 8302 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 282: /* type_specifier_nonarray: F32VEC3  */\n#line 2115 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, \"float32_t vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setVector(3);\n    }\n#line 8313 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 283: /* type_specifier_nonarray: F32VEC4  */\n#line 2121 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, \"float32_t vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setVector(4);\n    }\n#line 8324 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 284: /* type_specifier_nonarray: F64VEC2  */\n#line 2127 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, \"float64_t vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setVector(2);\n    }\n#line 8335 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 285: /* type_specifier_nonarray: F64VEC3  */\n#line 2133 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, \"float64_t vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setVector(3);\n    }\n#line 8346 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 286: /* type_specifier_nonarray: F64VEC4  */\n#line 2139 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, \"float64_t vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setVector(4);\n    }\n#line 8357 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 287: /* type_specifier_nonarray: I8VEC2  */\n#line 2145 \"MachineIndependent/glslang.y\"\n             {\n        parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, \"8-bit signed integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtInt8;\n        (yyval.interm.type).setVector(2);\n    }\n#line 8368 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 288: /* type_specifier_nonarray: I8VEC3  */\n#line 2151 \"MachineIndependent/glslang.y\"\n             {\n        parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, \"8-bit signed integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtInt8;\n        (yyval.interm.type).setVector(3);\n    }\n#line 8379 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 289: /* type_specifier_nonarray: I8VEC4  */\n#line 2157 \"MachineIndependent/glslang.y\"\n             {\n        parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, \"8-bit signed integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtInt8;\n        (yyval.interm.type).setVector(4);\n    }\n#line 8390 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 290: /* type_specifier_nonarray: I16VEC2  */\n#line 2163 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, \"16-bit signed integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtInt16;\n        (yyval.interm.type).setVector(2);\n    }\n#line 8401 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 291: /* type_specifier_nonarray: I16VEC3  */\n#line 2169 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, \"16-bit signed integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtInt16;\n        (yyval.interm.type).setVector(3);\n    }\n#line 8412 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 292: /* type_specifier_nonarray: I16VEC4  */\n#line 2175 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, \"16-bit signed integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtInt16;\n        (yyval.interm.type).setVector(4);\n    }\n#line 8423 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 293: /* type_specifier_nonarray: I32VEC2  */\n#line 2181 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.explicitInt32Check((yyvsp[0].lex).loc, \"32-bit signed integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtInt;\n        (yyval.interm.type).setVector(2);\n    }\n#line 8434 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 294: /* type_specifier_nonarray: I32VEC3  */\n#line 2187 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.explicitInt32Check((yyvsp[0].lex).loc, \"32-bit signed integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtInt;\n        (yyval.interm.type).setVector(3);\n    }\n#line 8445 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 295: /* type_specifier_nonarray: I32VEC4  */\n#line 2193 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.explicitInt32Check((yyvsp[0].lex).loc, \"32-bit signed integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtInt;\n        (yyval.interm.type).setVector(4);\n    }\n#line 8456 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 296: /* type_specifier_nonarray: I64VEC2  */\n#line 2199 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.int64Check((yyvsp[0].lex).loc, \"64-bit integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtInt64;\n        (yyval.interm.type).setVector(2);\n    }\n#line 8467 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 297: /* type_specifier_nonarray: I64VEC3  */\n#line 2205 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.int64Check((yyvsp[0].lex).loc, \"64-bit integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtInt64;\n        (yyval.interm.type).setVector(3);\n    }\n#line 8478 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 298: /* type_specifier_nonarray: I64VEC4  */\n#line 2211 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.int64Check((yyvsp[0].lex).loc, \"64-bit integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtInt64;\n        (yyval.interm.type).setVector(4);\n    }\n#line 8489 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 299: /* type_specifier_nonarray: U8VEC2  */\n#line 2217 \"MachineIndependent/glslang.y\"\n             {\n        parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, \"8-bit unsigned integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtUint8;\n        (yyval.interm.type).setVector(2);\n    }\n#line 8500 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 300: /* type_specifier_nonarray: U8VEC3  */\n#line 2223 \"MachineIndependent/glslang.y\"\n             {\n        parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, \"8-bit unsigned integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtUint8;\n        (yyval.interm.type).setVector(3);\n    }\n#line 8511 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 301: /* type_specifier_nonarray: U8VEC4  */\n#line 2229 \"MachineIndependent/glslang.y\"\n             {\n        parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, \"8-bit unsigned integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtUint8;\n        (yyval.interm.type).setVector(4);\n    }\n#line 8522 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 302: /* type_specifier_nonarray: U16VEC2  */\n#line 2235 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, \"16-bit unsigned integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtUint16;\n        (yyval.interm.type).setVector(2);\n    }\n#line 8533 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 303: /* type_specifier_nonarray: U16VEC3  */\n#line 2241 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, \"16-bit unsigned integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtUint16;\n        (yyval.interm.type).setVector(3);\n    }\n#line 8544 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 304: /* type_specifier_nonarray: U16VEC4  */\n#line 2247 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, \"16-bit unsigned integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtUint16;\n        (yyval.interm.type).setVector(4);\n    }\n#line 8555 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 305: /* type_specifier_nonarray: U32VEC2  */\n#line 2253 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.explicitInt32Check((yyvsp[0].lex).loc, \"32-bit unsigned integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtUint;\n        (yyval.interm.type).setVector(2);\n    }\n#line 8566 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 306: /* type_specifier_nonarray: U32VEC3  */\n#line 2259 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.explicitInt32Check((yyvsp[0].lex).loc, \"32-bit unsigned integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtUint;\n        (yyval.interm.type).setVector(3);\n    }\n#line 8577 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 307: /* type_specifier_nonarray: U32VEC4  */\n#line 2265 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.explicitInt32Check((yyvsp[0].lex).loc, \"32-bit unsigned integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtUint;\n        (yyval.interm.type).setVector(4);\n    }\n#line 8588 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 308: /* type_specifier_nonarray: U64VEC2  */\n#line 2271 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.int64Check((yyvsp[0].lex).loc, \"64-bit unsigned integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtUint64;\n        (yyval.interm.type).setVector(2);\n    }\n#line 8599 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 309: /* type_specifier_nonarray: U64VEC3  */\n#line 2277 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.int64Check((yyvsp[0].lex).loc, \"64-bit unsigned integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtUint64;\n        (yyval.interm.type).setVector(3);\n    }\n#line 8610 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 310: /* type_specifier_nonarray: U64VEC4  */\n#line 2283 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.int64Check((yyvsp[0].lex).loc, \"64-bit unsigned integer vector\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtUint64;\n        (yyval.interm.type).setVector(4);\n    }\n#line 8621 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 311: /* type_specifier_nonarray: DMAT2  */\n#line 2289 \"MachineIndependent/glslang.y\"\n            {\n        parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, \"double matrix\");\n        if (! parseContext.symbolTable.atBuiltInLevel())\n            parseContext.doubleCheck((yyvsp[0].lex).loc, \"double matrix\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(2, 2);\n    }\n#line 8634 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 312: /* type_specifier_nonarray: DMAT3  */\n#line 2297 \"MachineIndependent/glslang.y\"\n            {\n        parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, \"double matrix\");\n        if (! parseContext.symbolTable.atBuiltInLevel())\n            parseContext.doubleCheck((yyvsp[0].lex).loc, \"double matrix\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(3, 3);\n    }\n#line 8647 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 313: /* type_specifier_nonarray: DMAT4  */\n#line 2305 \"MachineIndependent/glslang.y\"\n            {\n        parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, \"double matrix\");\n        if (! parseContext.symbolTable.atBuiltInLevel())\n            parseContext.doubleCheck((yyvsp[0].lex).loc, \"double matrix\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(4, 4);\n    }\n#line 8660 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 314: /* type_specifier_nonarray: DMAT2X2  */\n#line 2313 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, \"double matrix\");\n        if (! parseContext.symbolTable.atBuiltInLevel())\n            parseContext.doubleCheck((yyvsp[0].lex).loc, \"double matrix\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(2, 2);\n    }\n#line 8673 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 315: /* type_specifier_nonarray: DMAT2X3  */\n#line 2321 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, \"double matrix\");\n        if (! parseContext.symbolTable.atBuiltInLevel())\n            parseContext.doubleCheck((yyvsp[0].lex).loc, \"double matrix\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(2, 3);\n    }\n#line 8686 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 316: /* type_specifier_nonarray: DMAT2X4  */\n#line 2329 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, \"double matrix\");\n        if (! parseContext.symbolTable.atBuiltInLevel())\n            parseContext.doubleCheck((yyvsp[0].lex).loc, \"double matrix\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(2, 4);\n    }\n#line 8699 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 317: /* type_specifier_nonarray: DMAT3X2  */\n#line 2337 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, \"double matrix\");\n        if (! parseContext.symbolTable.atBuiltInLevel())\n            parseContext.doubleCheck((yyvsp[0].lex).loc, \"double matrix\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(3, 2);\n    }\n#line 8712 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 318: /* type_specifier_nonarray: DMAT3X3  */\n#line 2345 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, \"double matrix\");\n        if (! parseContext.symbolTable.atBuiltInLevel())\n            parseContext.doubleCheck((yyvsp[0].lex).loc, \"double matrix\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(3, 3);\n    }\n#line 8725 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 319: /* type_specifier_nonarray: DMAT3X4  */\n#line 2353 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, \"double matrix\");\n        if (! parseContext.symbolTable.atBuiltInLevel())\n            parseContext.doubleCheck((yyvsp[0].lex).loc, \"double matrix\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(3, 4);\n    }\n#line 8738 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 320: /* type_specifier_nonarray: DMAT4X2  */\n#line 2361 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, \"double matrix\");\n        if (! parseContext.symbolTable.atBuiltInLevel())\n            parseContext.doubleCheck((yyvsp[0].lex).loc, \"double matrix\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(4, 2);\n    }\n#line 8751 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 321: /* type_specifier_nonarray: DMAT4X3  */\n#line 2369 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, \"double matrix\");\n        if (! parseContext.symbolTable.atBuiltInLevel())\n            parseContext.doubleCheck((yyvsp[0].lex).loc, \"double matrix\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(4, 3);\n    }\n#line 8764 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 322: /* type_specifier_nonarray: DMAT4X4  */\n#line 2377 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, \"double matrix\");\n        if (! parseContext.symbolTable.atBuiltInLevel())\n            parseContext.doubleCheck((yyvsp[0].lex).loc, \"double matrix\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(4, 4);\n    }\n#line 8777 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 323: /* type_specifier_nonarray: F16MAT2  */\n#line 2385 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.float16Check((yyvsp[0].lex).loc, \"half float matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat16;\n        (yyval.interm.type).setMatrix(2, 2);\n    }\n#line 8788 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 324: /* type_specifier_nonarray: F16MAT3  */\n#line 2391 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.float16Check((yyvsp[0].lex).loc, \"half float matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat16;\n        (yyval.interm.type).setMatrix(3, 3);\n    }\n#line 8799 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 325: /* type_specifier_nonarray: F16MAT4  */\n#line 2397 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.float16Check((yyvsp[0].lex).loc, \"half float matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat16;\n        (yyval.interm.type).setMatrix(4, 4);\n    }\n#line 8810 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 326: /* type_specifier_nonarray: F16MAT2X2  */\n#line 2403 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.float16Check((yyvsp[0].lex).loc, \"half float matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat16;\n        (yyval.interm.type).setMatrix(2, 2);\n    }\n#line 8821 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 327: /* type_specifier_nonarray: F16MAT2X3  */\n#line 2409 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.float16Check((yyvsp[0].lex).loc, \"half float matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat16;\n        (yyval.interm.type).setMatrix(2, 3);\n    }\n#line 8832 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 328: /* type_specifier_nonarray: F16MAT2X4  */\n#line 2415 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.float16Check((yyvsp[0].lex).loc, \"half float matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat16;\n        (yyval.interm.type).setMatrix(2, 4);\n    }\n#line 8843 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 329: /* type_specifier_nonarray: F16MAT3X2  */\n#line 2421 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.float16Check((yyvsp[0].lex).loc, \"half float matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat16;\n        (yyval.interm.type).setMatrix(3, 2);\n    }\n#line 8854 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 330: /* type_specifier_nonarray: F16MAT3X3  */\n#line 2427 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.float16Check((yyvsp[0].lex).loc, \"half float matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat16;\n        (yyval.interm.type).setMatrix(3, 3);\n    }\n#line 8865 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 331: /* type_specifier_nonarray: F16MAT3X4  */\n#line 2433 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.float16Check((yyvsp[0].lex).loc, \"half float matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat16;\n        (yyval.interm.type).setMatrix(3, 4);\n    }\n#line 8876 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 332: /* type_specifier_nonarray: F16MAT4X2  */\n#line 2439 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.float16Check((yyvsp[0].lex).loc, \"half float matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat16;\n        (yyval.interm.type).setMatrix(4, 2);\n    }\n#line 8887 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 333: /* type_specifier_nonarray: F16MAT4X3  */\n#line 2445 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.float16Check((yyvsp[0].lex).loc, \"half float matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat16;\n        (yyval.interm.type).setMatrix(4, 3);\n    }\n#line 8898 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 334: /* type_specifier_nonarray: F16MAT4X4  */\n#line 2451 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.float16Check((yyvsp[0].lex).loc, \"half float matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat16;\n        (yyval.interm.type).setMatrix(4, 4);\n    }\n#line 8909 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 335: /* type_specifier_nonarray: F32MAT2  */\n#line 2457 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, \"float32_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(2, 2);\n    }\n#line 8920 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 336: /* type_specifier_nonarray: F32MAT3  */\n#line 2463 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, \"float32_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(3, 3);\n    }\n#line 8931 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 337: /* type_specifier_nonarray: F32MAT4  */\n#line 2469 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, \"float32_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(4, 4);\n    }\n#line 8942 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 338: /* type_specifier_nonarray: F32MAT2X2  */\n#line 2475 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, \"float32_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(2, 2);\n    }\n#line 8953 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 339: /* type_specifier_nonarray: F32MAT2X3  */\n#line 2481 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, \"float32_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(2, 3);\n    }\n#line 8964 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 340: /* type_specifier_nonarray: F32MAT2X4  */\n#line 2487 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, \"float32_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(2, 4);\n    }\n#line 8975 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 341: /* type_specifier_nonarray: F32MAT3X2  */\n#line 2493 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, \"float32_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(3, 2);\n    }\n#line 8986 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 342: /* type_specifier_nonarray: F32MAT3X3  */\n#line 2499 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, \"float32_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(3, 3);\n    }\n#line 8997 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 343: /* type_specifier_nonarray: F32MAT3X4  */\n#line 2505 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, \"float32_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(3, 4);\n    }\n#line 9008 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 344: /* type_specifier_nonarray: F32MAT4X2  */\n#line 2511 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, \"float32_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(4, 2);\n    }\n#line 9019 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 345: /* type_specifier_nonarray: F32MAT4X3  */\n#line 2517 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, \"float32_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(4, 3);\n    }\n#line 9030 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 346: /* type_specifier_nonarray: F32MAT4X4  */\n#line 2523 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, \"float32_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).setMatrix(4, 4);\n    }\n#line 9041 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 347: /* type_specifier_nonarray: F64MAT2  */\n#line 2529 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, \"float64_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(2, 2);\n    }\n#line 9052 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 348: /* type_specifier_nonarray: F64MAT3  */\n#line 2535 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, \"float64_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(3, 3);\n    }\n#line 9063 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 349: /* type_specifier_nonarray: F64MAT4  */\n#line 2541 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, \"float64_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(4, 4);\n    }\n#line 9074 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 350: /* type_specifier_nonarray: F64MAT2X2  */\n#line 2547 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, \"float64_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(2, 2);\n    }\n#line 9085 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 351: /* type_specifier_nonarray: F64MAT2X3  */\n#line 2553 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, \"float64_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(2, 3);\n    }\n#line 9096 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 352: /* type_specifier_nonarray: F64MAT2X4  */\n#line 2559 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, \"float64_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(2, 4);\n    }\n#line 9107 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 353: /* type_specifier_nonarray: F64MAT3X2  */\n#line 2565 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, \"float64_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(3, 2);\n    }\n#line 9118 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 354: /* type_specifier_nonarray: F64MAT3X3  */\n#line 2571 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, \"float64_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(3, 3);\n    }\n#line 9129 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 355: /* type_specifier_nonarray: F64MAT3X4  */\n#line 2577 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, \"float64_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(3, 4);\n    }\n#line 9140 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 356: /* type_specifier_nonarray: F64MAT4X2  */\n#line 2583 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, \"float64_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(4, 2);\n    }\n#line 9151 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 357: /* type_specifier_nonarray: F64MAT4X3  */\n#line 2589 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, \"float64_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(4, 3);\n    }\n#line 9162 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 358: /* type_specifier_nonarray: F64MAT4X4  */\n#line 2595 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, \"float64_t matrix\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtDouble;\n        (yyval.interm.type).setMatrix(4, 4);\n    }\n#line 9173 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 359: /* type_specifier_nonarray: ACCSTRUCTNV  */\n#line 2601 \"MachineIndependent/glslang.y\"\n                  {\n       (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n       (yyval.interm.type).basicType = EbtAccStruct;\n    }\n#line 9182 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 360: /* type_specifier_nonarray: ACCSTRUCTEXT  */\n#line 2605 \"MachineIndependent/glslang.y\"\n                   {\n       (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n       (yyval.interm.type).basicType = EbtAccStruct;\n    }\n#line 9191 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 361: /* type_specifier_nonarray: RAYQUERYEXT  */\n#line 2609 \"MachineIndependent/glslang.y\"\n                  {\n       (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n       (yyval.interm.type).basicType = EbtRayQuery;\n    }\n#line 9200 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 362: /* type_specifier_nonarray: ATOMIC_UINT  */\n#line 2613 \"MachineIndependent/glslang.y\"\n                  {\n        parseContext.vulkanRemoved((yyvsp[0].lex).loc, \"atomic counter types\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtAtomicUint;\n    }\n#line 9210 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 363: /* type_specifier_nonarray: SAMPLER1D  */\n#line 2618 \"MachineIndependent/glslang.y\"\n                {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat, Esd1D);\n    }\n#line 9220 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 364: /* type_specifier_nonarray: SAMPLER2D  */\n#line 2623 \"MachineIndependent/glslang.y\"\n                {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat, Esd2D);\n    }\n#line 9230 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 365: /* type_specifier_nonarray: SAMPLER3D  */\n#line 2628 \"MachineIndependent/glslang.y\"\n                {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat, Esd3D);\n    }\n#line 9240 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 366: /* type_specifier_nonarray: SAMPLERCUBE  */\n#line 2633 \"MachineIndependent/glslang.y\"\n                  {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat, EsdCube);\n    }\n#line 9250 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 367: /* type_specifier_nonarray: SAMPLER2DSHADOW  */\n#line 2638 \"MachineIndependent/glslang.y\"\n                      {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat, Esd2D, false, true);\n    }\n#line 9260 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 368: /* type_specifier_nonarray: SAMPLERCUBESHADOW  */\n#line 2643 \"MachineIndependent/glslang.y\"\n                        {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat, EsdCube, false, true);\n    }\n#line 9270 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 369: /* type_specifier_nonarray: SAMPLER2DARRAY  */\n#line 2648 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true);\n    }\n#line 9280 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 370: /* type_specifier_nonarray: SAMPLER2DARRAYSHADOW  */\n#line 2653 \"MachineIndependent/glslang.y\"\n                           {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true, true);\n    }\n#line 9290 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 371: /* type_specifier_nonarray: SAMPLER1DSHADOW  */\n#line 2658 \"MachineIndependent/glslang.y\"\n                      {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat, Esd1D, false, true);\n    }\n#line 9300 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 372: /* type_specifier_nonarray: SAMPLER1DARRAY  */\n#line 2663 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat, Esd1D, true);\n    }\n#line 9310 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 373: /* type_specifier_nonarray: SAMPLER1DARRAYSHADOW  */\n#line 2668 \"MachineIndependent/glslang.y\"\n                           {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat, Esd1D, true, true);\n    }\n#line 9320 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 374: /* type_specifier_nonarray: SAMPLERCUBEARRAY  */\n#line 2673 \"MachineIndependent/glslang.y\"\n                       {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat, EsdCube, true);\n    }\n#line 9330 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 375: /* type_specifier_nonarray: SAMPLERCUBEARRAYSHADOW  */\n#line 2678 \"MachineIndependent/glslang.y\"\n                             {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat, EsdCube, true, true);\n    }\n#line 9340 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 376: /* type_specifier_nonarray: F16SAMPLER1D  */\n#line 2683 \"MachineIndependent/glslang.y\"\n                   {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float sampler\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat16, Esd1D);\n    }\n#line 9351 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 377: /* type_specifier_nonarray: F16SAMPLER2D  */\n#line 2689 \"MachineIndependent/glslang.y\"\n                   {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float sampler\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat16, Esd2D);\n    }\n#line 9362 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 378: /* type_specifier_nonarray: F16SAMPLER3D  */\n#line 2695 \"MachineIndependent/glslang.y\"\n                   {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float sampler\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat16, Esd3D);\n    }\n#line 9373 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 379: /* type_specifier_nonarray: F16SAMPLERCUBE  */\n#line 2701 \"MachineIndependent/glslang.y\"\n                     {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float sampler\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat16, EsdCube);\n    }\n#line 9384 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 380: /* type_specifier_nonarray: F16SAMPLER1DSHADOW  */\n#line 2707 \"MachineIndependent/glslang.y\"\n                         {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float sampler\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, false, true);\n    }\n#line 9395 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 381: /* type_specifier_nonarray: F16SAMPLER2DSHADOW  */\n#line 2713 \"MachineIndependent/glslang.y\"\n                         {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float sampler\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, false, true);\n    }\n#line 9406 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 382: /* type_specifier_nonarray: F16SAMPLERCUBESHADOW  */\n#line 2719 \"MachineIndependent/glslang.y\"\n                           {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float sampler\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, false, true);\n    }\n#line 9417 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 383: /* type_specifier_nonarray: F16SAMPLER1DARRAY  */\n#line 2725 \"MachineIndependent/glslang.y\"\n                        {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float sampler\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, true);\n    }\n#line 9428 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 384: /* type_specifier_nonarray: F16SAMPLER2DARRAY  */\n#line 2731 \"MachineIndependent/glslang.y\"\n                        {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float sampler\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true);\n    }\n#line 9439 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 385: /* type_specifier_nonarray: F16SAMPLER1DARRAYSHADOW  */\n#line 2737 \"MachineIndependent/glslang.y\"\n                              {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float sampler\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, true, true);\n    }\n#line 9450 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 386: /* type_specifier_nonarray: F16SAMPLER2DARRAYSHADOW  */\n#line 2743 \"MachineIndependent/glslang.y\"\n                              {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float sampler\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true, true);\n    }\n#line 9461 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 387: /* type_specifier_nonarray: F16SAMPLERCUBEARRAY  */\n#line 2749 \"MachineIndependent/glslang.y\"\n                          {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float sampler\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, true);\n    }\n#line 9472 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 388: /* type_specifier_nonarray: F16SAMPLERCUBEARRAYSHADOW  */\n#line 2755 \"MachineIndependent/glslang.y\"\n                                {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float sampler\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, true, true);\n    }\n#line 9483 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 389: /* type_specifier_nonarray: ISAMPLER1D  */\n#line 2761 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtInt, Esd1D);\n    }\n#line 9493 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 390: /* type_specifier_nonarray: ISAMPLER2D  */\n#line 2766 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtInt, Esd2D);\n    }\n#line 9503 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 391: /* type_specifier_nonarray: ISAMPLER3D  */\n#line 2771 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtInt, Esd3D);\n    }\n#line 9513 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 392: /* type_specifier_nonarray: ISAMPLERCUBE  */\n#line 2776 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtInt, EsdCube);\n    }\n#line 9523 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 393: /* type_specifier_nonarray: ISAMPLER2DARRAY  */\n#line 2781 \"MachineIndependent/glslang.y\"\n                      {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtInt, Esd2D, true);\n    }\n#line 9533 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 394: /* type_specifier_nonarray: USAMPLER2D  */\n#line 2786 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtUint, Esd2D);\n    }\n#line 9543 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 395: /* type_specifier_nonarray: USAMPLER3D  */\n#line 2791 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtUint, Esd3D);\n    }\n#line 9553 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 396: /* type_specifier_nonarray: USAMPLERCUBE  */\n#line 2796 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtUint, EsdCube);\n    }\n#line 9563 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 397: /* type_specifier_nonarray: ISAMPLER1DARRAY  */\n#line 2801 \"MachineIndependent/glslang.y\"\n                      {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtInt, Esd1D, true);\n    }\n#line 9573 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 398: /* type_specifier_nonarray: ISAMPLERCUBEARRAY  */\n#line 2806 \"MachineIndependent/glslang.y\"\n                        {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtInt, EsdCube, true);\n    }\n#line 9583 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 399: /* type_specifier_nonarray: USAMPLER1D  */\n#line 2811 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtUint, Esd1D);\n    }\n#line 9593 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 400: /* type_specifier_nonarray: USAMPLER1DARRAY  */\n#line 2816 \"MachineIndependent/glslang.y\"\n                      {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtUint, Esd1D, true);\n    }\n#line 9603 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 401: /* type_specifier_nonarray: USAMPLERCUBEARRAY  */\n#line 2821 \"MachineIndependent/glslang.y\"\n                        {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtUint, EsdCube, true);\n    }\n#line 9613 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 402: /* type_specifier_nonarray: TEXTURECUBEARRAY  */\n#line 2826 \"MachineIndependent/glslang.y\"\n                       {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtFloat, EsdCube, true);\n    }\n#line 9623 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 403: /* type_specifier_nonarray: ITEXTURECUBEARRAY  */\n#line 2831 \"MachineIndependent/glslang.y\"\n                        {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtInt, EsdCube, true);\n    }\n#line 9633 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 404: /* type_specifier_nonarray: UTEXTURECUBEARRAY  */\n#line 2836 \"MachineIndependent/glslang.y\"\n                        {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtUint, EsdCube, true);\n    }\n#line 9643 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 405: /* type_specifier_nonarray: USAMPLER2DARRAY  */\n#line 2841 \"MachineIndependent/glslang.y\"\n                      {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtUint, Esd2D, true);\n    }\n#line 9653 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 406: /* type_specifier_nonarray: TEXTURE2D  */\n#line 2846 \"MachineIndependent/glslang.y\"\n                {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D);\n    }\n#line 9663 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 407: /* type_specifier_nonarray: TEXTURE3D  */\n#line 2851 \"MachineIndependent/glslang.y\"\n                {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtFloat, Esd3D);\n    }\n#line 9673 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 408: /* type_specifier_nonarray: TEXTURE2DARRAY  */\n#line 2856 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, true);\n    }\n#line 9683 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 409: /* type_specifier_nonarray: TEXTURECUBE  */\n#line 2861 \"MachineIndependent/glslang.y\"\n                  {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtFloat, EsdCube);\n    }\n#line 9693 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 410: /* type_specifier_nonarray: ITEXTURE2D  */\n#line 2866 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D);\n    }\n#line 9703 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 411: /* type_specifier_nonarray: ITEXTURE3D  */\n#line 2871 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtInt, Esd3D);\n    }\n#line 9713 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 412: /* type_specifier_nonarray: ITEXTURECUBE  */\n#line 2876 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtInt, EsdCube);\n    }\n#line 9723 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 413: /* type_specifier_nonarray: ITEXTURE2DARRAY  */\n#line 2881 \"MachineIndependent/glslang.y\"\n                      {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, true);\n    }\n#line 9733 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 414: /* type_specifier_nonarray: UTEXTURE2D  */\n#line 2886 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D);\n    }\n#line 9743 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 415: /* type_specifier_nonarray: UTEXTURE3D  */\n#line 2891 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtUint, Esd3D);\n    }\n#line 9753 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 416: /* type_specifier_nonarray: UTEXTURECUBE  */\n#line 2896 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtUint, EsdCube);\n    }\n#line 9763 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 417: /* type_specifier_nonarray: UTEXTURE2DARRAY  */\n#line 2901 \"MachineIndependent/glslang.y\"\n                      {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, true);\n    }\n#line 9773 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 418: /* type_specifier_nonarray: SAMPLER  */\n#line 2906 \"MachineIndependent/glslang.y\"\n              {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setPureSampler(false);\n    }\n#line 9783 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 419: /* type_specifier_nonarray: SAMPLERSHADOW  */\n#line 2911 \"MachineIndependent/glslang.y\"\n                    {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setPureSampler(true);\n    }\n#line 9793 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 420: /* type_specifier_nonarray: SAMPLER2DRECT  */\n#line 2916 \"MachineIndependent/glslang.y\"\n                    {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat, EsdRect);\n    }\n#line 9803 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 421: /* type_specifier_nonarray: SAMPLER2DRECTSHADOW  */\n#line 2921 \"MachineIndependent/glslang.y\"\n                          {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat, EsdRect, false, true);\n    }\n#line 9813 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 422: /* type_specifier_nonarray: F16SAMPLER2DRECT  */\n#line 2926 \"MachineIndependent/glslang.y\"\n                       {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float sampler\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat16, EsdRect);\n    }\n#line 9824 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 423: /* type_specifier_nonarray: F16SAMPLER2DRECTSHADOW  */\n#line 2932 \"MachineIndependent/glslang.y\"\n                             {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float sampler\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat16, EsdRect, false, true);\n    }\n#line 9835 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 424: /* type_specifier_nonarray: ISAMPLER2DRECT  */\n#line 2938 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtInt, EsdRect);\n    }\n#line 9845 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 425: /* type_specifier_nonarray: USAMPLER2DRECT  */\n#line 2943 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtUint, EsdRect);\n    }\n#line 9855 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 426: /* type_specifier_nonarray: SAMPLERBUFFER  */\n#line 2948 \"MachineIndependent/glslang.y\"\n                    {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat, EsdBuffer);\n    }\n#line 9865 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 427: /* type_specifier_nonarray: F16SAMPLERBUFFER  */\n#line 2953 \"MachineIndependent/glslang.y\"\n                       {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float sampler\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat16, EsdBuffer);\n    }\n#line 9876 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 428: /* type_specifier_nonarray: ISAMPLERBUFFER  */\n#line 2959 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtInt, EsdBuffer);\n    }\n#line 9886 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 429: /* type_specifier_nonarray: USAMPLERBUFFER  */\n#line 2964 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtUint, EsdBuffer);\n    }\n#line 9896 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 430: /* type_specifier_nonarray: SAMPLER2DMS  */\n#line 2969 \"MachineIndependent/glslang.y\"\n                  {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat, Esd2D, false, false, true);\n    }\n#line 9906 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 431: /* type_specifier_nonarray: F16SAMPLER2DMS  */\n#line 2974 \"MachineIndependent/glslang.y\"\n                     {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float sampler\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, false, false, true);\n    }\n#line 9917 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 432: /* type_specifier_nonarray: ISAMPLER2DMS  */\n#line 2980 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtInt, Esd2D, false, false, true);\n    }\n#line 9927 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 433: /* type_specifier_nonarray: USAMPLER2DMS  */\n#line 2985 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtUint, Esd2D, false, false, true);\n    }\n#line 9937 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 434: /* type_specifier_nonarray: SAMPLER2DMSARRAY  */\n#line 2990 \"MachineIndependent/glslang.y\"\n                       {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true, false, true);\n    }\n#line 9947 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 435: /* type_specifier_nonarray: F16SAMPLER2DMSARRAY  */\n#line 2995 \"MachineIndependent/glslang.y\"\n                          {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float sampler\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true, false, true);\n    }\n#line 9958 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 436: /* type_specifier_nonarray: ISAMPLER2DMSARRAY  */\n#line 3001 \"MachineIndependent/glslang.y\"\n                        {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtInt, Esd2D, true, false, true);\n    }\n#line 9968 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 437: /* type_specifier_nonarray: USAMPLER2DMSARRAY  */\n#line 3006 \"MachineIndependent/glslang.y\"\n                        {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtUint, Esd2D, true, false, true);\n    }\n#line 9978 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 438: /* type_specifier_nonarray: TEXTURE1D  */\n#line 3011 \"MachineIndependent/glslang.y\"\n                {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtFloat, Esd1D);\n    }\n#line 9988 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 439: /* type_specifier_nonarray: F16TEXTURE1D  */\n#line 3016 \"MachineIndependent/glslang.y\"\n                   {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float texture\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd1D);\n    }\n#line 9999 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 440: /* type_specifier_nonarray: F16TEXTURE2D  */\n#line 3022 \"MachineIndependent/glslang.y\"\n                   {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float texture\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D);\n    }\n#line 10010 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 441: /* type_specifier_nonarray: F16TEXTURE3D  */\n#line 3028 \"MachineIndependent/glslang.y\"\n                   {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float texture\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd3D);\n    }\n#line 10021 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 442: /* type_specifier_nonarray: F16TEXTURECUBE  */\n#line 3034 \"MachineIndependent/glslang.y\"\n                     {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float texture\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdCube);\n    }\n#line 10032 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 443: /* type_specifier_nonarray: TEXTURE1DARRAY  */\n#line 3040 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtFloat, Esd1D, true);\n    }\n#line 10042 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 444: /* type_specifier_nonarray: F16TEXTURE1DARRAY  */\n#line 3045 \"MachineIndependent/glslang.y\"\n                        {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float texture\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd1D, true);\n    }\n#line 10053 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 445: /* type_specifier_nonarray: F16TEXTURE2DARRAY  */\n#line 3051 \"MachineIndependent/glslang.y\"\n                        {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float texture\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, true);\n    }\n#line 10064 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 446: /* type_specifier_nonarray: F16TEXTURECUBEARRAY  */\n#line 3057 \"MachineIndependent/glslang.y\"\n                          {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float texture\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdCube, true);\n    }\n#line 10075 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 447: /* type_specifier_nonarray: ITEXTURE1D  */\n#line 3063 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtInt, Esd1D);\n    }\n#line 10085 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 448: /* type_specifier_nonarray: ITEXTURE1DARRAY  */\n#line 3068 \"MachineIndependent/glslang.y\"\n                      {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtInt, Esd1D, true);\n    }\n#line 10095 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 449: /* type_specifier_nonarray: UTEXTURE1D  */\n#line 3073 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtUint, Esd1D);\n    }\n#line 10105 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 450: /* type_specifier_nonarray: UTEXTURE1DARRAY  */\n#line 3078 \"MachineIndependent/glslang.y\"\n                      {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtUint, Esd1D, true);\n    }\n#line 10115 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 451: /* type_specifier_nonarray: TEXTURE2DRECT  */\n#line 3083 \"MachineIndependent/glslang.y\"\n                    {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtFloat, EsdRect);\n    }\n#line 10125 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 452: /* type_specifier_nonarray: F16TEXTURE2DRECT  */\n#line 3088 \"MachineIndependent/glslang.y\"\n                       {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float texture\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdRect);\n    }\n#line 10136 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 453: /* type_specifier_nonarray: ITEXTURE2DRECT  */\n#line 3094 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtInt, EsdRect);\n    }\n#line 10146 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 454: /* type_specifier_nonarray: UTEXTURE2DRECT  */\n#line 3099 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtUint, EsdRect);\n    }\n#line 10156 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 455: /* type_specifier_nonarray: TEXTUREBUFFER  */\n#line 3104 \"MachineIndependent/glslang.y\"\n                    {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtFloat, EsdBuffer);\n    }\n#line 10166 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 456: /* type_specifier_nonarray: F16TEXTUREBUFFER  */\n#line 3109 \"MachineIndependent/glslang.y\"\n                       {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float texture\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdBuffer);\n    }\n#line 10177 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 457: /* type_specifier_nonarray: ITEXTUREBUFFER  */\n#line 3115 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtInt, EsdBuffer);\n    }\n#line 10187 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 458: /* type_specifier_nonarray: UTEXTUREBUFFER  */\n#line 3120 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtUint, EsdBuffer);\n    }\n#line 10197 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 459: /* type_specifier_nonarray: TEXTURE2DMS  */\n#line 3125 \"MachineIndependent/glslang.y\"\n                  {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, false, false, true);\n    }\n#line 10207 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 460: /* type_specifier_nonarray: F16TEXTURE2DMS  */\n#line 3130 \"MachineIndependent/glslang.y\"\n                     {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float texture\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, false, false, true);\n    }\n#line 10218 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 461: /* type_specifier_nonarray: ITEXTURE2DMS  */\n#line 3136 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, false, false, true);\n    }\n#line 10228 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 462: /* type_specifier_nonarray: UTEXTURE2DMS  */\n#line 3141 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, false, false, true);\n    }\n#line 10238 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 463: /* type_specifier_nonarray: TEXTURE2DMSARRAY  */\n#line 3146 \"MachineIndependent/glslang.y\"\n                       {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, true, false, true);\n    }\n#line 10248 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 464: /* type_specifier_nonarray: F16TEXTURE2DMSARRAY  */\n#line 3151 \"MachineIndependent/glslang.y\"\n                          {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float texture\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, true, false, true);\n    }\n#line 10259 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 465: /* type_specifier_nonarray: ITEXTURE2DMSARRAY  */\n#line 3157 \"MachineIndependent/glslang.y\"\n                        {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, true, false, true);\n    }\n#line 10269 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 466: /* type_specifier_nonarray: UTEXTURE2DMSARRAY  */\n#line 3162 \"MachineIndependent/glslang.y\"\n                        {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, true, false, true);\n    }\n#line 10279 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 467: /* type_specifier_nonarray: IMAGE1D  */\n#line 3167 \"MachineIndependent/glslang.y\"\n              {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtFloat, Esd1D);\n    }\n#line 10289 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 468: /* type_specifier_nonarray: F16IMAGE1D  */\n#line 3172 \"MachineIndependent/glslang.y\"\n                 {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float image\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtFloat16, Esd1D);\n    }\n#line 10300 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 469: /* type_specifier_nonarray: IIMAGE1D  */\n#line 3178 \"MachineIndependent/glslang.y\"\n               {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtInt, Esd1D);\n    }\n#line 10310 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 470: /* type_specifier_nonarray: UIMAGE1D  */\n#line 3183 \"MachineIndependent/glslang.y\"\n               {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtUint, Esd1D);\n    }\n#line 10320 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 471: /* type_specifier_nonarray: IMAGE2D  */\n#line 3188 \"MachineIndependent/glslang.y\"\n              {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D);\n    }\n#line 10330 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 472: /* type_specifier_nonarray: F16IMAGE2D  */\n#line 3193 \"MachineIndependent/glslang.y\"\n                 {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float image\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D);\n    }\n#line 10341 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 473: /* type_specifier_nonarray: IIMAGE2D  */\n#line 3199 \"MachineIndependent/glslang.y\"\n               {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtInt, Esd2D);\n    }\n#line 10351 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 474: /* type_specifier_nonarray: UIMAGE2D  */\n#line 3204 \"MachineIndependent/glslang.y\"\n               {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtUint, Esd2D);\n    }\n#line 10361 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 475: /* type_specifier_nonarray: IMAGE3D  */\n#line 3209 \"MachineIndependent/glslang.y\"\n              {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtFloat, Esd3D);\n    }\n#line 10371 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 476: /* type_specifier_nonarray: F16IMAGE3D  */\n#line 3214 \"MachineIndependent/glslang.y\"\n                 {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float image\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtFloat16, Esd3D);\n    }\n#line 10382 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 477: /* type_specifier_nonarray: IIMAGE3D  */\n#line 3220 \"MachineIndependent/glslang.y\"\n               {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtInt, Esd3D);\n    }\n#line 10392 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 478: /* type_specifier_nonarray: UIMAGE3D  */\n#line 3225 \"MachineIndependent/glslang.y\"\n               {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtUint, Esd3D);\n    }\n#line 10402 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 479: /* type_specifier_nonarray: IMAGE2DRECT  */\n#line 3230 \"MachineIndependent/glslang.y\"\n                  {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtFloat, EsdRect);\n    }\n#line 10412 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 480: /* type_specifier_nonarray: F16IMAGE2DRECT  */\n#line 3235 \"MachineIndependent/glslang.y\"\n                     {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float image\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtFloat16, EsdRect);\n    }\n#line 10423 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 481: /* type_specifier_nonarray: IIMAGE2DRECT  */\n#line 3241 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtInt, EsdRect);\n    }\n#line 10433 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 482: /* type_specifier_nonarray: UIMAGE2DRECT  */\n#line 3246 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtUint, EsdRect);\n    }\n#line 10443 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 483: /* type_specifier_nonarray: IMAGECUBE  */\n#line 3251 \"MachineIndependent/glslang.y\"\n                {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtFloat, EsdCube);\n    }\n#line 10453 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 484: /* type_specifier_nonarray: F16IMAGECUBE  */\n#line 3256 \"MachineIndependent/glslang.y\"\n                   {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float image\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtFloat16, EsdCube);\n    }\n#line 10464 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 485: /* type_specifier_nonarray: IIMAGECUBE  */\n#line 3262 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtInt, EsdCube);\n    }\n#line 10474 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 486: /* type_specifier_nonarray: UIMAGECUBE  */\n#line 3267 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtUint, EsdCube);\n    }\n#line 10484 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 487: /* type_specifier_nonarray: IMAGEBUFFER  */\n#line 3272 \"MachineIndependent/glslang.y\"\n                  {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtFloat, EsdBuffer);\n    }\n#line 10494 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 488: /* type_specifier_nonarray: F16IMAGEBUFFER  */\n#line 3277 \"MachineIndependent/glslang.y\"\n                     {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float image\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtFloat16, EsdBuffer);\n    }\n#line 10505 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 489: /* type_specifier_nonarray: IIMAGEBUFFER  */\n#line 3283 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtInt, EsdBuffer);\n    }\n#line 10515 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 490: /* type_specifier_nonarray: UIMAGEBUFFER  */\n#line 3288 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtUint, EsdBuffer);\n    }\n#line 10525 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 491: /* type_specifier_nonarray: IMAGE1DARRAY  */\n#line 3293 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtFloat, Esd1D, true);\n    }\n#line 10535 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 492: /* type_specifier_nonarray: F16IMAGE1DARRAY  */\n#line 3298 \"MachineIndependent/glslang.y\"\n                      {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float image\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtFloat16, Esd1D, true);\n    }\n#line 10546 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 493: /* type_specifier_nonarray: IIMAGE1DARRAY  */\n#line 3304 \"MachineIndependent/glslang.y\"\n                    {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtInt, Esd1D, true);\n    }\n#line 10556 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 494: /* type_specifier_nonarray: UIMAGE1DARRAY  */\n#line 3309 \"MachineIndependent/glslang.y\"\n                    {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtUint, Esd1D, true);\n    }\n#line 10566 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 495: /* type_specifier_nonarray: IMAGE2DARRAY  */\n#line 3314 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, true);\n    }\n#line 10576 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 496: /* type_specifier_nonarray: F16IMAGE2DARRAY  */\n#line 3319 \"MachineIndependent/glslang.y\"\n                      {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float image\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, true);\n    }\n#line 10587 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 497: /* type_specifier_nonarray: IIMAGE2DARRAY  */\n#line 3325 \"MachineIndependent/glslang.y\"\n                    {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, true);\n    }\n#line 10597 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 498: /* type_specifier_nonarray: UIMAGE2DARRAY  */\n#line 3330 \"MachineIndependent/glslang.y\"\n                    {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, true);\n    }\n#line 10607 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 499: /* type_specifier_nonarray: IMAGECUBEARRAY  */\n#line 3335 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtFloat, EsdCube, true);\n    }\n#line 10617 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 500: /* type_specifier_nonarray: F16IMAGECUBEARRAY  */\n#line 3340 \"MachineIndependent/glslang.y\"\n                        {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float image\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtFloat16, EsdCube, true);\n    }\n#line 10628 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 501: /* type_specifier_nonarray: IIMAGECUBEARRAY  */\n#line 3346 \"MachineIndependent/glslang.y\"\n                      {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtInt, EsdCube, true);\n    }\n#line 10638 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 502: /* type_specifier_nonarray: UIMAGECUBEARRAY  */\n#line 3351 \"MachineIndependent/glslang.y\"\n                      {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtUint, EsdCube, true);\n    }\n#line 10648 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 503: /* type_specifier_nonarray: IMAGE2DMS  */\n#line 3356 \"MachineIndependent/glslang.y\"\n                {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, false, false, true);\n    }\n#line 10658 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 504: /* type_specifier_nonarray: F16IMAGE2DMS  */\n#line 3361 \"MachineIndependent/glslang.y\"\n                   {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float image\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, false, false, true);\n    }\n#line 10669 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 505: /* type_specifier_nonarray: IIMAGE2DMS  */\n#line 3367 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, false, false, true);\n    }\n#line 10679 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 506: /* type_specifier_nonarray: UIMAGE2DMS  */\n#line 3372 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, false, false, true);\n    }\n#line 10689 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 507: /* type_specifier_nonarray: IMAGE2DMSARRAY  */\n#line 3377 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, true, false, true);\n    }\n#line 10699 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 508: /* type_specifier_nonarray: F16IMAGE2DMSARRAY  */\n#line 3382 \"MachineIndependent/glslang.y\"\n                        {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float image\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, true, false, true);\n    }\n#line 10710 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 509: /* type_specifier_nonarray: IIMAGE2DMSARRAY  */\n#line 3388 \"MachineIndependent/glslang.y\"\n                      {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, true, false, true);\n    }\n#line 10720 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 510: /* type_specifier_nonarray: UIMAGE2DMSARRAY  */\n#line 3393 \"MachineIndependent/glslang.y\"\n                      {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, true, false, true);\n    }\n#line 10730 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 511: /* type_specifier_nonarray: I64IMAGE1D  */\n#line 3398 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtInt64, Esd1D);\n    }\n#line 10740 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 512: /* type_specifier_nonarray: U64IMAGE1D  */\n#line 3403 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtUint64, Esd1D);\n    }\n#line 10750 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 513: /* type_specifier_nonarray: I64IMAGE2D  */\n#line 3408 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtInt64, Esd2D);\n    }\n#line 10760 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 514: /* type_specifier_nonarray: U64IMAGE2D  */\n#line 3413 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtUint64, Esd2D);\n    }\n#line 10770 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 515: /* type_specifier_nonarray: I64IMAGE3D  */\n#line 3418 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtInt64, Esd3D);\n    }\n#line 10780 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 516: /* type_specifier_nonarray: U64IMAGE3D  */\n#line 3423 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtUint64, Esd3D);\n    }\n#line 10790 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 517: /* type_specifier_nonarray: I64IMAGE2DRECT  */\n#line 3428 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtInt64, EsdRect);\n    }\n#line 10800 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 518: /* type_specifier_nonarray: U64IMAGE2DRECT  */\n#line 3433 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtUint64, EsdRect);\n    }\n#line 10810 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 519: /* type_specifier_nonarray: I64IMAGECUBE  */\n#line 3438 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtInt64, EsdCube);\n    }\n#line 10820 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 520: /* type_specifier_nonarray: U64IMAGECUBE  */\n#line 3443 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtUint64, EsdCube);\n    }\n#line 10830 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 521: /* type_specifier_nonarray: I64IMAGEBUFFER  */\n#line 3448 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtInt64, EsdBuffer);\n    }\n#line 10840 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 522: /* type_specifier_nonarray: U64IMAGEBUFFER  */\n#line 3453 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtUint64, EsdBuffer);\n    }\n#line 10850 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 523: /* type_specifier_nonarray: I64IMAGE1DARRAY  */\n#line 3458 \"MachineIndependent/glslang.y\"\n                      {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtInt64, Esd1D, true);\n    }\n#line 10860 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 524: /* type_specifier_nonarray: U64IMAGE1DARRAY  */\n#line 3463 \"MachineIndependent/glslang.y\"\n                      {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtUint64, Esd1D, true);\n    }\n#line 10870 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 525: /* type_specifier_nonarray: I64IMAGE2DARRAY  */\n#line 3468 \"MachineIndependent/glslang.y\"\n                      {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtInt64, Esd2D, true);\n    }\n#line 10880 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 526: /* type_specifier_nonarray: U64IMAGE2DARRAY  */\n#line 3473 \"MachineIndependent/glslang.y\"\n                      {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtUint64, Esd2D, true);\n    }\n#line 10890 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 527: /* type_specifier_nonarray: I64IMAGECUBEARRAY  */\n#line 3478 \"MachineIndependent/glslang.y\"\n                        {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtInt64, EsdCube, true);\n    }\n#line 10900 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 528: /* type_specifier_nonarray: U64IMAGECUBEARRAY  */\n#line 3483 \"MachineIndependent/glslang.y\"\n                        {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtUint64, EsdCube, true);\n    }\n#line 10910 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 529: /* type_specifier_nonarray: I64IMAGE2DMS  */\n#line 3488 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtInt64, Esd2D, false, false, true);\n    }\n#line 10920 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 530: /* type_specifier_nonarray: U64IMAGE2DMS  */\n#line 3493 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtUint64, Esd2D, false, false, true);\n    }\n#line 10930 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 531: /* type_specifier_nonarray: I64IMAGE2DMSARRAY  */\n#line 3498 \"MachineIndependent/glslang.y\"\n                        {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtInt64, Esd2D, true, false, true);\n    }\n#line 10940 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 532: /* type_specifier_nonarray: U64IMAGE2DMSARRAY  */\n#line 3503 \"MachineIndependent/glslang.y\"\n                        {\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setImage(EbtUint64, Esd2D, true, false, true);\n    }\n#line 10950 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 533: /* type_specifier_nonarray: SAMPLEREXTERNALOES  */\n#line 3508 \"MachineIndependent/glslang.y\"\n                         {  // GL_OES_EGL_image_external\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat, Esd2D);\n        (yyval.interm.type).sampler.external = true;\n    }\n#line 10961 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 534: /* type_specifier_nonarray: SAMPLEREXTERNAL2DY2YEXT  */\n#line 3514 \"MachineIndependent/glslang.y\"\n                              { // GL_EXT_YUV_target\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.set(EbtFloat, Esd2D);\n        (yyval.interm.type).sampler.yuv = true;\n    }\n#line 10972 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 535: /* type_specifier_nonarray: ATTACHMENTEXT  */\n#line 3520 \"MachineIndependent/glslang.y\"\n                    {\n        parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, \"attachmentEXT input\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setAttachmentEXT(EbtFloat);\n    }\n#line 10983 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 536: /* type_specifier_nonarray: IATTACHMENTEXT  */\n#line 3526 \"MachineIndependent/glslang.y\"\n                     {\n        parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, \"attachmentEXT input\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setAttachmentEXT(EbtInt);\n    }\n#line 10994 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 537: /* type_specifier_nonarray: UATTACHMENTEXT  */\n#line 3532 \"MachineIndependent/glslang.y\"\n                     {\n        parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, \"attachmentEXT input\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setAttachmentEXT(EbtUint);\n    }\n#line 11005 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 538: /* type_specifier_nonarray: SUBPASSINPUT  */\n#line 3538 \"MachineIndependent/glslang.y\"\n                   {\n        parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, \"subpass input\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setSubpass(EbtFloat);\n    }\n#line 11016 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 539: /* type_specifier_nonarray: SUBPASSINPUTMS  */\n#line 3544 \"MachineIndependent/glslang.y\"\n                     {\n        parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, \"subpass input\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setSubpass(EbtFloat, true);\n    }\n#line 11027 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 540: /* type_specifier_nonarray: F16SUBPASSINPUT  */\n#line 3550 \"MachineIndependent/glslang.y\"\n                      {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float subpass input\", parseContext.symbolTable.atBuiltInLevel());\n        parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, \"subpass input\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setSubpass(EbtFloat16);\n    }\n#line 11039 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 541: /* type_specifier_nonarray: F16SUBPASSINPUTMS  */\n#line 3557 \"MachineIndependent/glslang.y\"\n                        {\n        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, \"half float subpass input\", parseContext.symbolTable.atBuiltInLevel());\n        parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, \"subpass input\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setSubpass(EbtFloat16, true);\n    }\n#line 11051 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 542: /* type_specifier_nonarray: ISUBPASSINPUT  */\n#line 3564 \"MachineIndependent/glslang.y\"\n                    {\n        parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, \"subpass input\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setSubpass(EbtInt);\n    }\n#line 11062 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 543: /* type_specifier_nonarray: ISUBPASSINPUTMS  */\n#line 3570 \"MachineIndependent/glslang.y\"\n                      {\n        parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, \"subpass input\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setSubpass(EbtInt, true);\n    }\n#line 11073 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 544: /* type_specifier_nonarray: USUBPASSINPUT  */\n#line 3576 \"MachineIndependent/glslang.y\"\n                    {\n        parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, \"subpass input\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setSubpass(EbtUint);\n    }\n#line 11084 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 545: /* type_specifier_nonarray: USUBPASSINPUTMS  */\n#line 3582 \"MachineIndependent/glslang.y\"\n                      {\n        parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, \"subpass input\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtSampler;\n        (yyval.interm.type).sampler.setSubpass(EbtUint, true);\n    }\n#line 11095 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 546: /* type_specifier_nonarray: FCOOPMATNV  */\n#line 3588 \"MachineIndependent/glslang.y\"\n                 {\n        parseContext.fcoopmatCheckNV((yyvsp[0].lex).loc, \"fcoopmatNV\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtFloat;\n        (yyval.interm.type).coopmatNV = true;\n        (yyval.interm.type).coopmatKHR = false;\n    }\n#line 11107 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 547: /* type_specifier_nonarray: ICOOPMATNV  */\n#line 3595 \"MachineIndependent/glslang.y\"\n                 {\n        parseContext.intcoopmatCheckNV((yyvsp[0].lex).loc, \"icoopmatNV\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtInt;\n        (yyval.interm.type).coopmatNV = true;\n        (yyval.interm.type).coopmatKHR = false;\n    }\n#line 11119 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 548: /* type_specifier_nonarray: UCOOPMATNV  */\n#line 3602 \"MachineIndependent/glslang.y\"\n                 {\n        parseContext.intcoopmatCheckNV((yyvsp[0].lex).loc, \"ucoopmatNV\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtUint;\n        (yyval.interm.type).coopmatNV = true;\n        (yyval.interm.type).coopmatKHR = false;\n    }\n#line 11131 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 549: /* type_specifier_nonarray: COOPMAT  */\n#line 3609 \"MachineIndependent/glslang.y\"\n              {\n        parseContext.coopmatCheck((yyvsp[0].lex).loc, \"coopmat\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtCoopmat;\n        (yyval.interm.type).coopmatNV = false;\n        (yyval.interm.type).coopmatKHR = true;\n    }\n#line 11143 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 550: /* type_specifier_nonarray: TENSORLAYOUTNV  */\n#line 3616 \"MachineIndependent/glslang.y\"\n                     {\n        parseContext.tensorLayoutViewCheck((yyvsp[0].lex).loc, \"tensorLayoutNV\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtTensorLayoutNV;\n    }\n#line 11153 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 551: /* type_specifier_nonarray: TENSORVIEWNV  */\n#line 3621 \"MachineIndependent/glslang.y\"\n                   {\n        parseContext.tensorLayoutViewCheck((yyvsp[0].lex).loc, \"tensorViewNV\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtTensorViewNV;\n    }\n#line 11163 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 552: /* type_specifier_nonarray: FUNCTION  */\n#line 3626 \"MachineIndependent/glslang.y\"\n               {\n        (yyval.interm.type).init((yyvsp[0].lex).loc);\n        (yyval.interm.type).basicType = EbtFunction;\n    }\n#line 11172 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 553: /* type_specifier_nonarray: COOPVECNV  */\n#line 3630 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.coopvecCheck((yyvsp[0].lex).loc, \"coopvecNV\", parseContext.symbolTable.atBuiltInLevel());\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).basicType = EbtCoopvecNV;\n        (yyval.interm.type).coopvecNV = true;\n    }\n#line 11183 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 554: /* type_specifier_nonarray: spirv_type_specifier  */\n#line 3636 \"MachineIndependent/glslang.y\"\n                           {\n        parseContext.requireExtensions((yyvsp[0].interm.type).loc, 1, &E_GL_EXT_spirv_intrinsics, \"SPIR-V type specifier\");\n        (yyval.interm.type) = (yyvsp[0].interm.type);\n    }\n#line 11192 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 555: /* type_specifier_nonarray: HITOBJECTNV  */\n#line 3640 \"MachineIndependent/glslang.y\"\n                      {\n       (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n       (yyval.interm.type).basicType = EbtHitObjectNV;\n\t}\n#line 11201 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 556: /* type_specifier_nonarray: struct_specifier  */\n#line 3644 \"MachineIndependent/glslang.y\"\n                       {\n        (yyval.interm.type) = (yyvsp[0].interm.type);\n        (yyval.interm.type).qualifier.storage = parseContext.symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;\n        parseContext.structTypeCheck((yyval.interm.type).loc, (yyval.interm.type));\n    }\n#line 11211 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 557: /* type_specifier_nonarray: TYPE_NAME  */\n#line 3649 \"MachineIndependent/glslang.y\"\n                {\n        //\n        // This is for user defined type names.  The lexical phase looked up the\n        // type.\n        //\n        if (const TVariable* variable = ((yyvsp[0].lex).symbol)->getAsVariable()) {\n            const TType& structure = variable->getType();\n            (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n            (yyval.interm.type).basicType = EbtStruct;\n            (yyval.interm.type).userDef = &structure;\n        } else\n            parseContext.error((yyvsp[0].lex).loc, \"expected type name\", (yyvsp[0].lex).string->c_str(), \"\");\n    }\n#line 11229 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 558: /* precision_qualifier: HIGH_PRECISION  */\n#line 3665 \"MachineIndependent/glslang.y\"\n                     {\n        parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, \"highp precision qualifier\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqHigh);\n    }\n#line 11239 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 559: /* precision_qualifier: MEDIUM_PRECISION  */\n#line 3670 \"MachineIndependent/glslang.y\"\n                       {\n        parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, \"mediump precision qualifier\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqMedium);\n    }\n#line 11249 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 560: /* precision_qualifier: LOW_PRECISION  */\n#line 3675 \"MachineIndependent/glslang.y\"\n                    {\n        parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, \"lowp precision qualifier\");\n        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqLow);\n    }\n#line 11259 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 561: /* $@3: %empty  */\n#line 3683 \"MachineIndependent/glslang.y\"\n                                   { parseContext.nestedStructCheck((yyvsp[-2].lex).loc); }\n#line 11265 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 562: /* struct_specifier: STRUCT IDENTIFIER LEFT_BRACE $@3 struct_declaration_list RIGHT_BRACE  */\n#line 3683 \"MachineIndependent/glslang.y\"\n                                                                                                                   {\n\n        TType* structure = new TType((yyvsp[-1].interm.typeList), *(yyvsp[-4].lex).string);\n        parseContext.structArrayCheck((yyvsp[-4].lex).loc, *structure);\n\n        TVariable* userTypeDef = new TVariable((yyvsp[-4].lex).string, *structure, true);\n        if (! parseContext.symbolTable.insert(*userTypeDef))\n            parseContext.error((yyvsp[-4].lex).loc, \"redefinition\", (yyvsp[-4].lex).string->c_str(), \"struct\");\n        else if (parseContext.spvVersion.vulkanRelaxed\n                 && structure->containsOpaque())\n            parseContext.relaxedSymbols.push_back(structure->getTypeName());\n\n        (yyval.interm.type).init((yyvsp[-5].lex).loc);\n        (yyval.interm.type).basicType = EbtStruct;\n        (yyval.interm.type).userDef = structure;\n        --parseContext.structNestingLevel;\n    }\n#line 11287 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 563: /* $@4: %empty  */\n#line 3700 \"MachineIndependent/glslang.y\"\n                        { parseContext.nestedStructCheck((yyvsp[-1].lex).loc); }\n#line 11293 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 564: /* struct_specifier: STRUCT LEFT_BRACE $@4 struct_declaration_list RIGHT_BRACE  */\n#line 3700 \"MachineIndependent/glslang.y\"\n                                                                                                        {\n        TType* structure = new TType((yyvsp[-1].interm.typeList), TString(\"\"));\n        (yyval.interm.type).init((yyvsp[-4].lex).loc);\n        (yyval.interm.type).basicType = EbtStruct;\n        (yyval.interm.type).userDef = structure;\n        --parseContext.structNestingLevel;\n    }\n#line 11305 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 565: /* struct_declaration_list: struct_declaration  */\n#line 3710 \"MachineIndependent/glslang.y\"\n                         {\n        (yyval.interm.typeList) = (yyvsp[0].interm.typeList);\n    }\n#line 11313 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 566: /* struct_declaration_list: struct_declaration_list struct_declaration  */\n#line 3713 \"MachineIndependent/glslang.y\"\n                                                 {\n        (yyval.interm.typeList) = (yyvsp[-1].interm.typeList);\n        for (unsigned int i = 0; i < (yyvsp[0].interm.typeList)->size(); ++i) {\n            for (unsigned int j = 0; j < (yyval.interm.typeList)->size(); ++j) {\n                if ((*(yyval.interm.typeList))[j].type->getFieldName() == (*(yyvsp[0].interm.typeList))[i].type->getFieldName())\n                    parseContext.error((*(yyvsp[0].interm.typeList))[i].loc, \"duplicate member name:\", \"\", (*(yyvsp[0].interm.typeList))[i].type->getFieldName().c_str());\n            }\n            (yyval.interm.typeList)->push_back((*(yyvsp[0].interm.typeList))[i]);\n        }\n    }\n#line 11328 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 567: /* struct_declaration: type_specifier struct_declarator_list SEMICOLON  */\n#line 3726 \"MachineIndependent/glslang.y\"\n                                                      {\n        if ((yyvsp[-2].interm.type).arraySizes) {\n            parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, \"arrayed type\");\n            parseContext.profileRequires((yyvsp[-2].interm.type).loc, EEsProfile, 300, 0, \"arrayed type\");\n            if (parseContext.isEsProfile())\n                parseContext.arraySizeRequiredCheck((yyvsp[-2].interm.type).loc, *(yyvsp[-2].interm.type).arraySizes);\n        }\n\n        (yyval.interm.typeList) = (yyvsp[-1].interm.typeList);\n\n        parseContext.voidErrorCheck((yyvsp[-2].interm.type).loc, (*(yyvsp[-1].interm.typeList))[0].type->getFieldName(), (yyvsp[-2].interm.type).basicType);\n        parseContext.precisionQualifierCheck((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).basicType, (yyvsp[-2].interm.type).qualifier, (yyvsp[-2].interm.type).isCoopmatOrvec());\n\n        for (unsigned int i = 0; i < (yyval.interm.typeList)->size(); ++i) {\n            TType type((yyvsp[-2].interm.type));\n            type.setFieldName((*(yyval.interm.typeList))[i].type->getFieldName());\n            type.transferArraySizes((*(yyval.interm.typeList))[i].type->getArraySizes());\n            type.copyArrayInnerSizes((yyvsp[-2].interm.type).arraySizes);\n            parseContext.arrayOfArrayVersionCheck((*(yyval.interm.typeList))[i].loc, type.getArraySizes());\n            (*(yyval.interm.typeList))[i].type->shallowCopy(type);\n        }\n    }\n#line 11355 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 568: /* struct_declaration: type_qualifier type_specifier struct_declarator_list SEMICOLON  */\n#line 3748 \"MachineIndependent/glslang.y\"\n                                                                     {\n        if ((yyvsp[-2].interm.type).arraySizes) {\n            parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, \"arrayed type\");\n            parseContext.profileRequires((yyvsp[-2].interm.type).loc, EEsProfile, 300, 0, \"arrayed type\");\n            if (parseContext.isEsProfile())\n                parseContext.arraySizeRequiredCheck((yyvsp[-2].interm.type).loc, *(yyvsp[-2].interm.type).arraySizes);\n        }\n\n        (yyval.interm.typeList) = (yyvsp[-1].interm.typeList);\n\n        parseContext.memberQualifierCheck((yyvsp[-3].interm.type));\n        parseContext.voidErrorCheck((yyvsp[-2].interm.type).loc, (*(yyvsp[-1].interm.typeList))[0].type->getFieldName(), (yyvsp[-2].interm.type).basicType);\n        parseContext.mergeQualifiers((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).qualifier, (yyvsp[-3].interm.type).qualifier, true);\n        parseContext.precisionQualifierCheck((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).basicType, (yyvsp[-2].interm.type).qualifier, (yyvsp[-2].interm.type).isCoopmatOrvec());\n\n        for (unsigned int i = 0; i < (yyval.interm.typeList)->size(); ++i) {\n            TType type((yyvsp[-2].interm.type));\n            type.setFieldName((*(yyval.interm.typeList))[i].type->getFieldName());\n            type.transferArraySizes((*(yyval.interm.typeList))[i].type->getArraySizes());\n            type.copyArrayInnerSizes((yyvsp[-2].interm.type).arraySizes);\n            parseContext.arrayOfArrayVersionCheck((*(yyval.interm.typeList))[i].loc, type.getArraySizes());\n            (*(yyval.interm.typeList))[i].type->shallowCopy(type);\n        }\n    }\n#line 11384 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 569: /* struct_declarator_list: struct_declarator  */\n#line 3775 \"MachineIndependent/glslang.y\"\n                        {\n        (yyval.interm.typeList) = new TTypeList;\n        (yyval.interm.typeList)->push_back((yyvsp[0].interm.typeLine));\n    }\n#line 11393 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 570: /* struct_declarator_list: struct_declarator_list COMMA struct_declarator  */\n#line 3779 \"MachineIndependent/glslang.y\"\n                                                     {\n        (yyval.interm.typeList)->push_back((yyvsp[0].interm.typeLine));\n    }\n#line 11401 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 571: /* struct_declarator: IDENTIFIER  */\n#line 3785 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.typeLine).type = new TType(EbtVoid);\n        (yyval.interm.typeLine).loc = (yyvsp[0].lex).loc;\n        (yyval.interm.typeLine).type->setFieldName(*(yyvsp[0].lex).string);\n    }\n#line 11411 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 572: /* struct_declarator: IDENTIFIER array_specifier  */\n#line 3790 \"MachineIndependent/glslang.y\"\n                                 {\n        parseContext.arrayOfArrayVersionCheck((yyvsp[-1].lex).loc, (yyvsp[0].interm).arraySizes);\n\n        (yyval.interm.typeLine).type = new TType(EbtVoid);\n        (yyval.interm.typeLine).loc = (yyvsp[-1].lex).loc;\n        (yyval.interm.typeLine).type->setFieldName(*(yyvsp[-1].lex).string);\n        (yyval.interm.typeLine).type->transferArraySizes((yyvsp[0].interm).arraySizes);\n    }\n#line 11424 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 573: /* initializer: assignment_expression  */\n#line 3801 \"MachineIndependent/glslang.y\"\n                            {\n        (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);\n    }\n#line 11432 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 574: /* initializer: LEFT_BRACE initializer_list RIGHT_BRACE  */\n#line 3804 \"MachineIndependent/glslang.y\"\n                                              {\n        const char* initFeature = \"{ } style initializers\";\n        parseContext.requireProfile((yyvsp[-2].lex).loc, ~EEsProfile, initFeature);\n        parseContext.profileRequires((yyvsp[-2].lex).loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature);\n        (yyval.interm.intermTypedNode) = (yyvsp[-1].interm.intermTypedNode);\n    }\n#line 11443 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 575: /* initializer: LEFT_BRACE initializer_list COMMA RIGHT_BRACE  */\n#line 3810 \"MachineIndependent/glslang.y\"\n                                                    {\n        const char* initFeature = \"{ } style initializers\";\n        parseContext.requireProfile((yyvsp[-3].lex).loc, ~EEsProfile, initFeature);\n        parseContext.profileRequires((yyvsp[-3].lex).loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature);\n        (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);\n    }\n#line 11454 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 576: /* initializer: LEFT_BRACE RIGHT_BRACE  */\n#line 3816 \"MachineIndependent/glslang.y\"\n                             {\n        const char* initFeature = \"empty { } initializer\";\n        parseContext.profileRequires((yyvsp[-1].lex).loc, EEsProfile, 0, E_GL_EXT_null_initializer, initFeature);\n        parseContext.profileRequires((yyvsp[-1].lex).loc, ~EEsProfile, 0, E_GL_EXT_null_initializer, initFeature);\n        (yyval.interm.intermTypedNode) = parseContext.intermediate.makeAggregate((yyvsp[-1].lex).loc);\n    }\n#line 11465 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 577: /* initializer_list: initializer  */\n#line 3825 \"MachineIndependent/glslang.y\"\n                  {\n        (yyval.interm.intermTypedNode) = parseContext.intermediate.growAggregate(0, (yyvsp[0].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)->getLoc());\n    }\n#line 11473 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 578: /* initializer_list: initializer_list COMMA initializer  */\n#line 3828 \"MachineIndependent/glslang.y\"\n                                         {\n        (yyval.interm.intermTypedNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));\n    }\n#line 11481 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 579: /* declaration_statement: declaration  */\n#line 3834 \"MachineIndependent/glslang.y\"\n                  { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }\n#line 11487 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 580: /* statement: compound_statement  */\n#line 3838 \"MachineIndependent/glslang.y\"\n                          { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }\n#line 11493 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 581: /* statement: simple_statement  */\n#line 3839 \"MachineIndependent/glslang.y\"\n                          { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }\n#line 11499 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 582: /* simple_statement: declaration_statement  */\n#line 3845 \"MachineIndependent/glslang.y\"\n                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }\n#line 11505 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 583: /* simple_statement: expression_statement  */\n#line 3846 \"MachineIndependent/glslang.y\"\n                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }\n#line 11511 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 584: /* simple_statement: selection_statement  */\n#line 3847 \"MachineIndependent/glslang.y\"\n                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }\n#line 11517 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 585: /* simple_statement: switch_statement  */\n#line 3848 \"MachineIndependent/glslang.y\"\n                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }\n#line 11523 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 586: /* simple_statement: case_label  */\n#line 3849 \"MachineIndependent/glslang.y\"\n                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }\n#line 11529 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 587: /* simple_statement: iteration_statement  */\n#line 3850 \"MachineIndependent/glslang.y\"\n                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }\n#line 11535 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 588: /* simple_statement: jump_statement  */\n#line 3851 \"MachineIndependent/glslang.y\"\n                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }\n#line 11541 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 589: /* simple_statement: demote_statement  */\n#line 3852 \"MachineIndependent/glslang.y\"\n                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }\n#line 11547 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 590: /* demote_statement: DEMOTE SEMICOLON  */\n#line 3856 \"MachineIndependent/glslang.y\"\n                       {\n        parseContext.requireStage((yyvsp[-1].lex).loc, EShLangFragment, \"demote\");\n        parseContext.requireExtensions((yyvsp[-1].lex).loc, 1, &E_GL_EXT_demote_to_helper_invocation, \"demote\");\n        (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpDemote, (yyvsp[-1].lex).loc);\n    }\n#line 11557 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 591: /* compound_statement: LEFT_BRACE RIGHT_BRACE  */\n#line 3864 \"MachineIndependent/glslang.y\"\n                             { (yyval.interm.intermNode) = 0; }\n#line 11563 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 592: /* $@5: %empty  */\n#line 3865 \"MachineIndependent/glslang.y\"\n                 {\n        parseContext.symbolTable.push();\n        ++parseContext.statementNestingLevel;\n    }\n#line 11572 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 593: /* $@6: %empty  */\n#line 3869 \"MachineIndependent/glslang.y\"\n                     {\n        parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);\n        --parseContext.statementNestingLevel;\n    }\n#line 11581 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 594: /* compound_statement: LEFT_BRACE $@5 statement_list $@6 RIGHT_BRACE  */\n#line 3873 \"MachineIndependent/glslang.y\"\n                  {\n        if ((yyvsp[-2].interm.intermNode) && (yyvsp[-2].interm.intermNode)->getAsAggregate()) {\n            (yyvsp[-2].interm.intermNode)->getAsAggregate()->setOperator(parseContext.intermediate.getDebugInfo() ? EOpScope : EOpSequence);\n            (yyvsp[-2].interm.intermNode)->getAsAggregate()->setEndLoc((yyvsp[0].lex).loc);\n        }\n        (yyval.interm.intermNode) = (yyvsp[-2].interm.intermNode);\n    }\n#line 11593 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 595: /* statement_no_new_scope: compound_statement_no_new_scope  */\n#line 3883 \"MachineIndependent/glslang.y\"\n                                      { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }\n#line 11599 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 596: /* statement_no_new_scope: simple_statement  */\n#line 3884 \"MachineIndependent/glslang.y\"\n                                      { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }\n#line 11605 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 597: /* $@7: %empty  */\n#line 3888 \"MachineIndependent/glslang.y\"\n      {\n        ++parseContext.controlFlowNestingLevel;\n    }\n#line 11613 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 598: /* statement_scoped: $@7 compound_statement  */\n#line 3891 \"MachineIndependent/glslang.y\"\n                          {\n        --parseContext.controlFlowNestingLevel;\n        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);\n    }\n#line 11622 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 599: /* $@8: %empty  */\n#line 3895 \"MachineIndependent/glslang.y\"\n      {\n        parseContext.symbolTable.push();\n        ++parseContext.statementNestingLevel;\n        ++parseContext.controlFlowNestingLevel;\n    }\n#line 11632 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 600: /* statement_scoped: $@8 simple_statement  */\n#line 3900 \"MachineIndependent/glslang.y\"\n                       {\n        parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);\n        --parseContext.statementNestingLevel;\n        --parseContext.controlFlowNestingLevel;\n        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);\n    }\n#line 11643 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 601: /* compound_statement_no_new_scope: LEFT_BRACE RIGHT_BRACE  */\n#line 3909 \"MachineIndependent/glslang.y\"\n                             {\n        (yyval.interm.intermNode) = 0;\n    }\n#line 11651 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 602: /* compound_statement_no_new_scope: LEFT_BRACE statement_list RIGHT_BRACE  */\n#line 3912 \"MachineIndependent/glslang.y\"\n                                            {\n        if ((yyvsp[-1].interm.intermNode) && (yyvsp[-1].interm.intermNode)->getAsAggregate()) {\n            (yyvsp[-1].interm.intermNode)->getAsAggregate()->setOperator(EOpSequence);\n            (yyvsp[-1].interm.intermNode)->getAsAggregate()->setEndLoc((yyvsp[0].lex).loc);\n        }\n        (yyval.interm.intermNode) = (yyvsp[-1].interm.intermNode);\n    }\n#line 11663 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 603: /* statement_list: statement  */\n#line 3922 \"MachineIndependent/glslang.y\"\n                {\n        (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermNode));\n        if ((yyvsp[0].interm.intermNode) && (yyvsp[0].interm.intermNode)->getAsBranchNode() && ((yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpCase ||\n                                            (yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpDefault)) {\n            parseContext.wrapupSwitchSubsequence(0, (yyvsp[0].interm.intermNode));\n            (yyval.interm.intermNode) = 0;  // start a fresh subsequence for what's after this case\n        }\n    }\n#line 11676 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 604: /* statement_list: statement_list statement  */\n#line 3930 \"MachineIndependent/glslang.y\"\n                               {\n        if ((yyvsp[0].interm.intermNode) && (yyvsp[0].interm.intermNode)->getAsBranchNode() && ((yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpCase ||\n                                            (yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpDefault)) {\n            parseContext.wrapupSwitchSubsequence((yyvsp[-1].interm.intermNode) ? (yyvsp[-1].interm.intermNode)->getAsAggregate() : 0, (yyvsp[0].interm.intermNode));\n            (yyval.interm.intermNode) = 0;  // start a fresh subsequence for what's after this case\n        } else\n            (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode));\n    }\n#line 11689 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 605: /* expression_statement: SEMICOLON  */\n#line 3941 \"MachineIndependent/glslang.y\"\n                 { (yyval.interm.intermNode) = 0; }\n#line 11695 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 606: /* expression_statement: expression SEMICOLON  */\n#line 3942 \"MachineIndependent/glslang.y\"\n                            { (yyval.interm.intermNode) = static_cast<TIntermNode*>((yyvsp[-1].interm.intermTypedNode)); }\n#line 11701 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 607: /* selection_statement: selection_statement_nonattributed  */\n#line 3946 \"MachineIndependent/glslang.y\"\n                                        {\n        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);\n    }\n#line 11709 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 608: /* selection_statement: attribute selection_statement_nonattributed  */\n#line 3949 \"MachineIndependent/glslang.y\"\n                                                  {\n        parseContext.requireExtensions((yyvsp[0].interm.intermNode)->getLoc(), 1, &E_GL_EXT_control_flow_attributes, \"attribute\");\n        parseContext.handleSelectionAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode));\n        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);\n    }\n#line 11719 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 609: /* selection_statement_nonattributed: IF LEFT_PAREN expression RIGHT_PAREN selection_rest_statement  */\n#line 3956 \"MachineIndependent/glslang.y\"\n                                                                    {\n        parseContext.boolCheck((yyvsp[-4].lex).loc, (yyvsp[-2].interm.intermTypedNode));\n        (yyval.interm.intermNode) = parseContext.intermediate.addSelection((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.nodePair), (yyvsp[-4].lex).loc);\n    }\n#line 11728 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 610: /* selection_rest_statement: statement_scoped ELSE statement_scoped  */\n#line 3963 \"MachineIndependent/glslang.y\"\n                                             {\n        (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermNode);\n        (yyval.interm.nodePair).node2 = (yyvsp[0].interm.intermNode);\n    }\n#line 11737 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 611: /* selection_rest_statement: statement_scoped  */\n#line 3967 \"MachineIndependent/glslang.y\"\n                       {\n        (yyval.interm.nodePair).node1 = (yyvsp[0].interm.intermNode);\n        (yyval.interm.nodePair).node2 = 0;\n    }\n#line 11746 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 612: /* condition: expression  */\n#line 3975 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);\n        parseContext.boolCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode));\n    }\n#line 11755 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 613: /* condition: fully_specified_type IDENTIFIER EQUAL initializer  */\n#line 3979 \"MachineIndependent/glslang.y\"\n                                                        {\n        parseContext.boolCheck((yyvsp[-2].lex).loc, (yyvsp[-3].interm.type));\n\n        TType type((yyvsp[-3].interm.type));\n        TIntermNode* initNode = parseContext.declareVariable((yyvsp[-2].lex).loc, *(yyvsp[-2].lex).string, (yyvsp[-3].interm.type), 0, (yyvsp[0].interm.intermTypedNode));\n        if (initNode)\n            (yyval.interm.intermTypedNode) = initNode->getAsTyped();\n        else\n            (yyval.interm.intermTypedNode) = 0;\n    }\n#line 11770 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 614: /* switch_statement: switch_statement_nonattributed  */\n#line 3992 \"MachineIndependent/glslang.y\"\n                                     {\n        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);\n    }\n#line 11778 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 615: /* switch_statement: attribute switch_statement_nonattributed  */\n#line 3995 \"MachineIndependent/glslang.y\"\n                                               {\n        parseContext.requireExtensions((yyvsp[0].interm.intermNode)->getLoc(), 1, &E_GL_EXT_control_flow_attributes, \"attribute\");\n        parseContext.handleSwitchAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode));\n        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);\n    }\n#line 11788 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 616: /* $@9: %empty  */\n#line 4002 \"MachineIndependent/glslang.y\"\n                                               {\n        // start new switch sequence on the switch stack\n        ++parseContext.controlFlowNestingLevel;\n        ++parseContext.statementNestingLevel;\n        parseContext.switchSequenceStack.push_back(new TIntermSequence);\n        parseContext.switchLevel.push_back(parseContext.statementNestingLevel);\n        parseContext.symbolTable.push();\n    }\n#line 11801 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 617: /* switch_statement_nonattributed: SWITCH LEFT_PAREN expression RIGHT_PAREN $@9 LEFT_BRACE switch_statement_list RIGHT_BRACE  */\n#line 4010 \"MachineIndependent/glslang.y\"\n                                                 {\n        (yyval.interm.intermNode) = parseContext.addSwitch((yyvsp[-7].lex).loc, (yyvsp[-5].interm.intermTypedNode), (yyvsp[-1].interm.intermNode) ? (yyvsp[-1].interm.intermNode)->getAsAggregate() : 0);\n        delete parseContext.switchSequenceStack.back();\n        parseContext.switchSequenceStack.pop_back();\n        parseContext.switchLevel.pop_back();\n        parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);\n        --parseContext.statementNestingLevel;\n        --parseContext.controlFlowNestingLevel;\n    }\n#line 11815 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 618: /* switch_statement_list: %empty  */\n#line 4022 \"MachineIndependent/glslang.y\"\n                    {\n        (yyval.interm.intermNode) = 0;\n    }\n#line 11823 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 619: /* switch_statement_list: statement_list  */\n#line 4025 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);\n    }\n#line 11831 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 620: /* case_label: CASE expression COLON  */\n#line 4031 \"MachineIndependent/glslang.y\"\n                            {\n        (yyval.interm.intermNode) = 0;\n        if (parseContext.switchLevel.size() == 0)\n            parseContext.error((yyvsp[-2].lex).loc, \"cannot appear outside switch statement\", \"case\", \"\");\n        else if (parseContext.switchLevel.back() != parseContext.statementNestingLevel)\n            parseContext.error((yyvsp[-2].lex).loc, \"cannot be nested inside control flow\", \"case\", \"\");\n        else {\n            parseContext.constantValueCheck((yyvsp[-1].interm.intermTypedNode), \"case\");\n            parseContext.integerCheck((yyvsp[-1].interm.intermTypedNode), \"case\");\n            (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpCase, (yyvsp[-1].interm.intermTypedNode), (yyvsp[-2].lex).loc);\n        }\n    }\n#line 11848 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 621: /* case_label: DEFAULT COLON  */\n#line 4043 \"MachineIndependent/glslang.y\"\n                    {\n        (yyval.interm.intermNode) = 0;\n        if (parseContext.switchLevel.size() == 0)\n            parseContext.error((yyvsp[-1].lex).loc, \"cannot appear outside switch statement\", \"default\", \"\");\n        else if (parseContext.switchLevel.back() != parseContext.statementNestingLevel)\n            parseContext.error((yyvsp[-1].lex).loc, \"cannot be nested inside control flow\", \"default\", \"\");\n        else\n            (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpDefault, (yyvsp[-1].lex).loc);\n    }\n#line 11862 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 622: /* iteration_statement: iteration_statement_nonattributed  */\n#line 4055 \"MachineIndependent/glslang.y\"\n                                        {\n        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);\n    }\n#line 11870 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 623: /* iteration_statement: attribute iteration_statement_nonattributed  */\n#line 4058 \"MachineIndependent/glslang.y\"\n                                                  {\n        const char * extensions[2] = { E_GL_EXT_control_flow_attributes, E_GL_EXT_control_flow_attributes2 };\n        parseContext.requireExtensions((yyvsp[0].interm.intermNode)->getLoc(), 2, extensions, \"attribute\");\n        parseContext.handleLoopAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode));\n        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);\n    }\n#line 11881 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 624: /* $@10: %empty  */\n#line 4066 \"MachineIndependent/glslang.y\"\n                       {\n        if (! parseContext.limits.whileLoops)\n            parseContext.error((yyvsp[-1].lex).loc, \"while loops not available\", \"limitation\", \"\");\n        parseContext.symbolTable.push();\n        ++parseContext.loopNestingLevel;\n        ++parseContext.statementNestingLevel;\n        ++parseContext.controlFlowNestingLevel;\n    }\n#line 11894 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 625: /* iteration_statement_nonattributed: WHILE LEFT_PAREN $@10 condition RIGHT_PAREN statement_no_new_scope  */\n#line 4074 \"MachineIndependent/glslang.y\"\n                                                   {\n        parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);\n        (yyval.interm.intermNode) = parseContext.intermediate.addLoop((yyvsp[0].interm.intermNode), (yyvsp[-2].interm.intermTypedNode), 0, true, (yyvsp[-5].lex).loc);\n        --parseContext.loopNestingLevel;\n        --parseContext.statementNestingLevel;\n        --parseContext.controlFlowNestingLevel;\n    }\n#line 11906 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 626: /* $@11: %empty  */\n#line 4081 \"MachineIndependent/glslang.y\"\n         {\n        parseContext.symbolTable.push();\n        ++parseContext.loopNestingLevel;\n        ++parseContext.statementNestingLevel;\n        ++parseContext.controlFlowNestingLevel;\n    }\n#line 11917 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 627: /* iteration_statement_nonattributed: DO $@11 statement WHILE LEFT_PAREN expression RIGHT_PAREN SEMICOLON  */\n#line 4087 \"MachineIndependent/glslang.y\"\n                                                                  {\n        if (! parseContext.limits.whileLoops)\n            parseContext.error((yyvsp[-7].lex).loc, \"do-while loops not available\", \"limitation\", \"\");\n\n        parseContext.boolCheck((yyvsp[0].lex).loc, (yyvsp[-2].interm.intermTypedNode));\n\n        (yyval.interm.intermNode) = parseContext.intermediate.addLoop((yyvsp[-5].interm.intermNode), (yyvsp[-2].interm.intermTypedNode), 0, false, (yyvsp[-4].lex).loc);\n        parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);\n        --parseContext.loopNestingLevel;\n        --parseContext.statementNestingLevel;\n        --parseContext.controlFlowNestingLevel;\n    }\n#line 11934 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 628: /* $@12: %empty  */\n#line 4099 \"MachineIndependent/glslang.y\"\n                     {\n        parseContext.symbolTable.push();\n        ++parseContext.loopNestingLevel;\n        ++parseContext.statementNestingLevel;\n        ++parseContext.controlFlowNestingLevel;\n    }\n#line 11945 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 629: /* iteration_statement_nonattributed: FOR LEFT_PAREN $@12 for_init_statement for_rest_statement RIGHT_PAREN statement_no_new_scope  */\n#line 4105 \"MachineIndependent/glslang.y\"\n                                                                               {\n        parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);\n        (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[-3].interm.intermNode), (yyvsp[-5].lex).loc);\n        TIntermLoop* forLoop = parseContext.intermediate.addLoop((yyvsp[0].interm.intermNode), reinterpret_cast<TIntermTyped*>((yyvsp[-2].interm.nodePair).node1), reinterpret_cast<TIntermTyped*>((yyvsp[-2].interm.nodePair).node2), true, (yyvsp[-6].lex).loc);\n        if (! parseContext.limits.nonInductiveForLoops)\n            parseContext.inductiveLoopCheck((yyvsp[-6].lex).loc, (yyvsp[-3].interm.intermNode), forLoop);\n        (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyval.interm.intermNode), forLoop, (yyvsp[-6].lex).loc);\n        (yyval.interm.intermNode)->getAsAggregate()->setOperator(EOpSequence);\n        --parseContext.loopNestingLevel;\n        --parseContext.statementNestingLevel;\n        --parseContext.controlFlowNestingLevel;\n    }\n#line 11962 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 630: /* for_init_statement: expression_statement  */\n#line 4120 \"MachineIndependent/glslang.y\"\n                           {\n        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);\n    }\n#line 11970 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 631: /* for_init_statement: declaration_statement  */\n#line 4123 \"MachineIndependent/glslang.y\"\n                            {\n        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);\n    }\n#line 11978 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 632: /* conditionopt: condition  */\n#line 4129 \"MachineIndependent/glslang.y\"\n                {\n        (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);\n    }\n#line 11986 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 633: /* conditionopt: %empty  */\n#line 4132 \"MachineIndependent/glslang.y\"\n                        {\n        (yyval.interm.intermTypedNode) = 0;\n    }\n#line 11994 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 634: /* for_rest_statement: conditionopt SEMICOLON  */\n#line 4138 \"MachineIndependent/glslang.y\"\n                             {\n        (yyval.interm.nodePair).node1 = (yyvsp[-1].interm.intermTypedNode);\n        (yyval.interm.nodePair).node2 = 0;\n    }\n#line 12003 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 635: /* for_rest_statement: conditionopt SEMICOLON expression  */\n#line 4142 \"MachineIndependent/glslang.y\"\n                                         {\n        (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermTypedNode);\n        (yyval.interm.nodePair).node2 = (yyvsp[0].interm.intermTypedNode);\n    }\n#line 12012 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 636: /* jump_statement: CONTINUE SEMICOLON  */\n#line 4149 \"MachineIndependent/glslang.y\"\n                         {\n        if (parseContext.loopNestingLevel <= 0)\n            parseContext.error((yyvsp[-1].lex).loc, \"continue statement only allowed in loops\", \"\", \"\");\n        (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpContinue, (yyvsp[-1].lex).loc);\n    }\n#line 12022 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 637: /* jump_statement: BREAK SEMICOLON  */\n#line 4154 \"MachineIndependent/glslang.y\"\n                      {\n        if (parseContext.loopNestingLevel + parseContext.switchSequenceStack.size() <= 0)\n            parseContext.error((yyvsp[-1].lex).loc, \"break statement only allowed in switch and loops\", \"\", \"\");\n        (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpBreak, (yyvsp[-1].lex).loc);\n    }\n#line 12032 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 638: /* jump_statement: RETURN SEMICOLON  */\n#line 4159 \"MachineIndependent/glslang.y\"\n                       {\n        (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpReturn, (yyvsp[-1].lex).loc);\n        if (parseContext.currentFunctionType->getBasicType() != EbtVoid)\n            parseContext.error((yyvsp[-1].lex).loc, \"non-void function must return a value\", \"return\", \"\");\n        if (parseContext.inMain)\n            parseContext.postEntryPointReturn = true;\n    }\n#line 12044 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 639: /* jump_statement: RETURN expression SEMICOLON  */\n#line 4166 \"MachineIndependent/glslang.y\"\n                                  {\n        (yyval.interm.intermNode) = parseContext.handleReturnValue((yyvsp[-2].lex).loc, (yyvsp[-1].interm.intermTypedNode));\n    }\n#line 12052 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 640: /* jump_statement: DISCARD SEMICOLON  */\n#line 4169 \"MachineIndependent/glslang.y\"\n                        {\n        parseContext.requireStage((yyvsp[-1].lex).loc, EShLangFragment, \"discard\");\n        (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpKill, (yyvsp[-1].lex).loc);\n    }\n#line 12061 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 641: /* jump_statement: TERMINATE_INVOCATION SEMICOLON  */\n#line 4173 \"MachineIndependent/glslang.y\"\n                                     {\n        parseContext.requireStage((yyvsp[-1].lex).loc, EShLangFragment, \"terminateInvocation\");\n        (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpTerminateInvocation, (yyvsp[-1].lex).loc);\n    }\n#line 12070 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 642: /* jump_statement: TERMINATE_RAY SEMICOLON  */\n#line 4177 \"MachineIndependent/glslang.y\"\n                              {\n        parseContext.requireStage((yyvsp[-1].lex).loc, EShLangAnyHit, \"terminateRayEXT\");\n        (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpTerminateRayKHR, (yyvsp[-1].lex).loc);\n    }\n#line 12079 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 643: /* jump_statement: IGNORE_INTERSECTION SEMICOLON  */\n#line 4181 \"MachineIndependent/glslang.y\"\n                                    {\n        parseContext.requireStage((yyvsp[-1].lex).loc, EShLangAnyHit, \"ignoreIntersectionEXT\");\n        (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpIgnoreIntersectionKHR, (yyvsp[-1].lex).loc);\n    }\n#line 12088 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 644: /* translation_unit: external_declaration  */\n#line 4190 \"MachineIndependent/glslang.y\"\n                           {\n        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);\n        parseContext.intermediate.setTreeRoot((yyval.interm.intermNode));\n    }\n#line 12097 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 645: /* translation_unit: translation_unit external_declaration  */\n#line 4194 \"MachineIndependent/glslang.y\"\n                                            {\n        if ((yyvsp[0].interm.intermNode) != nullptr) {\n            (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode));\n            parseContext.intermediate.setTreeRoot((yyval.interm.intermNode));\n        }\n    }\n#line 12108 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 646: /* external_declaration: function_definition  */\n#line 4203 \"MachineIndependent/glslang.y\"\n                          {\n        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);\n    }\n#line 12116 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 647: /* external_declaration: declaration  */\n#line 4206 \"MachineIndependent/glslang.y\"\n                  {\n        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);\n    }\n#line 12124 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 648: /* external_declaration: SEMICOLON  */\n#line 4209 \"MachineIndependent/glslang.y\"\n                {\n        parseContext.requireProfile((yyvsp[0].lex).loc, ~EEsProfile, \"extraneous semicolon\");\n        parseContext.profileRequires((yyvsp[0].lex).loc, ~EEsProfile, 460, nullptr, \"extraneous semicolon\");\n        (yyval.interm.intermNode) = nullptr;\n    }\n#line 12134 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 649: /* $@13: %empty  */\n#line 4217 \"MachineIndependent/glslang.y\"\n                         {\n        (yyvsp[0].interm).function = parseContext.handleFunctionDeclarator((yyvsp[0].interm).loc, *(yyvsp[0].interm).function, false /* not prototype */);\n        (yyvsp[0].interm).intermNode = parseContext.handleFunctionDefinition((yyvsp[0].interm).loc, *(yyvsp[0].interm).function);\n\n        // For ES 100 only, according to ES shading language 100 spec: A function\n        // body has a scope nested inside the function's definition.\n        if (parseContext.profile == EEsProfile && parseContext.version == 100)\n        {\n            parseContext.symbolTable.push();\n            ++parseContext.statementNestingLevel;\n        }\n    }\n#line 12151 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 650: /* function_definition: function_prototype $@13 compound_statement_no_new_scope  */\n#line 4229 \"MachineIndependent/glslang.y\"\n                                    {\n        //   May be best done as post process phase on intermediate code\n        if (parseContext.currentFunctionType->getBasicType() != EbtVoid && ! parseContext.functionReturnsValue)\n            parseContext.error((yyvsp[-2].interm).loc, \"function does not return a value:\", \"\", (yyvsp[-2].interm).function->getName().c_str());\n        parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);\n        (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm).intermNode, (yyvsp[0].interm.intermNode));\n        (yyval.interm.intermNode)->getAsAggregate()->setLinkType((yyvsp[-2].interm).function->getLinkType());\n        parseContext.intermediate.setAggregateOperator((yyval.interm.intermNode), EOpFunction, (yyvsp[-2].interm).function->getType(), (yyvsp[-2].interm).loc);\n        (yyval.interm.intermNode)->getAsAggregate()->setName((yyvsp[-2].interm).function->getMangledName().c_str());\n\n        // store the pragma information for debug and optimize and other vendor specific\n        // information. This information can be queried from the parse tree\n        (yyval.interm.intermNode)->getAsAggregate()->setOptimize(parseContext.contextPragma.optimize);\n        (yyval.interm.intermNode)->getAsAggregate()->setDebug(parseContext.contextPragma.debug);\n        (yyval.interm.intermNode)->getAsAggregate()->setPragmaTable(parseContext.contextPragma.pragmaTable);\n\n        // Set currentFunctionType to empty pointer when goes outside of the function\n        parseContext.currentFunctionType = nullptr;\n\n        // For ES 100 only, according to ES shading language 100 spec: A function\n        // body has a scope nested inside the function's definition.\n        if (parseContext.profile == EEsProfile && parseContext.version == 100)\n        {\n            parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);\n            --parseContext.statementNestingLevel;\n        }\n    }\n#line 12183 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 651: /* attribute: LEFT_BRACKET LEFT_BRACKET attribute_list RIGHT_BRACKET RIGHT_BRACKET  */\n#line 4259 \"MachineIndependent/glslang.y\"\n                                                                           {\n        (yyval.interm.attributes) = (yyvsp[-2].interm.attributes);\n    }\n#line 12191 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 652: /* attribute_list: single_attribute  */\n#line 4264 \"MachineIndependent/glslang.y\"\n                       {\n        (yyval.interm.attributes) = (yyvsp[0].interm.attributes);\n    }\n#line 12199 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 653: /* attribute_list: attribute_list COMMA single_attribute  */\n#line 4267 \"MachineIndependent/glslang.y\"\n                                            {\n        (yyval.interm.attributes) = parseContext.mergeAttributes((yyvsp[-2].interm.attributes), (yyvsp[0].interm.attributes));\n    }\n#line 12207 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 654: /* single_attribute: IDENTIFIER  */\n#line 4272 \"MachineIndependent/glslang.y\"\n                 {\n        (yyval.interm.attributes) = parseContext.makeAttributes(*(yyvsp[0].lex).string);\n    }\n#line 12215 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 655: /* single_attribute: IDENTIFIER LEFT_PAREN constant_expression RIGHT_PAREN  */\n#line 4275 \"MachineIndependent/glslang.y\"\n                                                            {\n        (yyval.interm.attributes) = parseContext.makeAttributes(*(yyvsp[-3].lex).string, (yyvsp[-1].interm.intermTypedNode));\n    }\n#line 12223 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 656: /* spirv_requirements_list: spirv_requirements_parameter  */\n#line 4280 \"MachineIndependent/glslang.y\"\n                                   {\n        (yyval.interm.spirvReq) = (yyvsp[0].interm.spirvReq);\n    }\n#line 12231 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 657: /* spirv_requirements_list: spirv_requirements_list COMMA spirv_requirements_parameter  */\n#line 4283 \"MachineIndependent/glslang.y\"\n                                                                 {\n        (yyval.interm.spirvReq) = parseContext.mergeSpirvRequirements((yyvsp[-1].lex).loc, (yyvsp[-2].interm.spirvReq), (yyvsp[0].interm.spirvReq));\n    }\n#line 12239 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 658: /* spirv_requirements_parameter: IDENTIFIER EQUAL LEFT_BRACKET spirv_extension_list RIGHT_BRACKET  */\n#line 4288 \"MachineIndependent/glslang.y\"\n                                                                       {\n        (yyval.interm.spirvReq) = parseContext.makeSpirvRequirement((yyvsp[-3].lex).loc, *(yyvsp[-4].lex).string, (yyvsp[-1].interm.intermNode)->getAsAggregate(), nullptr);\n    }\n#line 12247 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 659: /* spirv_requirements_parameter: IDENTIFIER EQUAL LEFT_BRACKET spirv_capability_list RIGHT_BRACKET  */\n#line 4291 \"MachineIndependent/glslang.y\"\n                                                                        {\n        (yyval.interm.spirvReq) = parseContext.makeSpirvRequirement((yyvsp[-3].lex).loc, *(yyvsp[-4].lex).string, nullptr, (yyvsp[-1].interm.intermNode)->getAsAggregate());\n    }\n#line 12255 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 660: /* spirv_extension_list: STRING_LITERAL  */\n#line 4296 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate(parseContext.intermediate.addConstantUnion((yyvsp[0].lex).string, (yyvsp[0].lex).loc, true));\n    }\n#line 12263 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 661: /* spirv_extension_list: spirv_extension_list COMMA STRING_LITERAL  */\n#line 4299 \"MachineIndependent/glslang.y\"\n                                                {\n        (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermNode), parseContext.intermediate.addConstantUnion((yyvsp[0].lex).string, (yyvsp[0].lex).loc, true));\n    }\n#line 12271 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 662: /* spirv_capability_list: INTCONSTANT  */\n#line 4304 \"MachineIndependent/glslang.y\"\n                  {\n        (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate(parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true));\n    }\n#line 12279 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 663: /* spirv_capability_list: spirv_capability_list COMMA INTCONSTANT  */\n#line 4307 \"MachineIndependent/glslang.y\"\n                                              {\n        (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermNode), parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true));\n    }\n#line 12287 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 664: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE LEFT_PAREN INTCONSTANT RIGHT_PAREN  */\n#line 4312 \"MachineIndependent/glslang.y\"\n                                                              {\n        parseContext.intermediate.insertSpirvExecutionMode((yyvsp[-1].lex).i);\n        (yyval.interm.intermNode) = 0;\n    }\n#line 12296 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 665: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT RIGHT_PAREN  */\n#line 4316 \"MachineIndependent/glslang.y\"\n                                                                                            {\n        parseContext.intermediate.insertSpirvRequirement((yyvsp[-3].interm.spirvReq));\n        parseContext.intermediate.insertSpirvExecutionMode((yyvsp[-1].lex).i);\n        (yyval.interm.intermNode) = 0;\n    }\n#line 12306 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 666: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE LEFT_PAREN INTCONSTANT COMMA spirv_execution_mode_parameter_list RIGHT_PAREN  */\n#line 4321 \"MachineIndependent/glslang.y\"\n                                                                                                        {\n        parseContext.intermediate.insertSpirvExecutionMode((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate());\n        (yyval.interm.intermNode) = 0;\n    }\n#line 12315 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 667: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_execution_mode_parameter_list RIGHT_PAREN  */\n#line 4325 \"MachineIndependent/glslang.y\"\n                                                                                                                                      {\n        parseContext.intermediate.insertSpirvRequirement((yyvsp[-5].interm.spirvReq));\n        parseContext.intermediate.insertSpirvExecutionMode((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate());\n        (yyval.interm.intermNode) = 0;\n    }\n#line 12325 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 668: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE_ID LEFT_PAREN INTCONSTANT COMMA spirv_execution_mode_id_parameter_list RIGHT_PAREN  */\n#line 4330 \"MachineIndependent/glslang.y\"\n                                                                                                              {\n        parseContext.intermediate.insertSpirvExecutionModeId((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate());\n        (yyval.interm.intermNode) = 0;\n    }\n#line 12334 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 669: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE_ID LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_execution_mode_id_parameter_list RIGHT_PAREN  */\n#line 4334 \"MachineIndependent/glslang.y\"\n                                                                                                                                            {\n        parseContext.intermediate.insertSpirvRequirement((yyvsp[-5].interm.spirvReq));\n        parseContext.intermediate.insertSpirvExecutionModeId((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate());\n        (yyval.interm.intermNode) = 0;\n    }\n#line 12344 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 670: /* spirv_execution_mode_parameter_list: spirv_execution_mode_parameter  */\n#line 4341 \"MachineIndependent/glslang.y\"\n                                     {\n        (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermNode));\n    }\n#line 12352 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 671: /* spirv_execution_mode_parameter_list: spirv_execution_mode_parameter_list COMMA spirv_execution_mode_parameter  */\n#line 4344 \"MachineIndependent/glslang.y\"\n                                                                               {\n        (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermNode), (yyvsp[0].interm.intermNode));\n    }\n#line 12360 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 672: /* spirv_execution_mode_parameter: FLOATCONSTANT  */\n#line 4349 \"MachineIndependent/glslang.y\"\n                    {\n        (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat, (yyvsp[0].lex).loc, true);\n    }\n#line 12368 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 673: /* spirv_execution_mode_parameter: INTCONSTANT  */\n#line 4352 \"MachineIndependent/glslang.y\"\n                  {\n        (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true);\n    }\n#line 12376 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 674: /* spirv_execution_mode_parameter: UINTCONSTANT  */\n#line 4355 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true);\n    }\n#line 12384 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 675: /* spirv_execution_mode_parameter: BOOLCONSTANT  */\n#line 4358 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).b, (yyvsp[0].lex).loc, true);\n    }\n#line 12392 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 676: /* spirv_execution_mode_parameter: STRING_LITERAL  */\n#line 4361 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).string, (yyvsp[0].lex).loc, true);\n    }\n#line 12400 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 677: /* spirv_execution_mode_id_parameter_list: constant_expression  */\n#line 4366 \"MachineIndependent/glslang.y\"\n                          {\n        if ((yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtFloat &&\n            (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtInt &&\n            (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtUint &&\n            (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtBool &&\n            (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtString)\n            parseContext.error((yyvsp[0].interm.intermTypedNode)->getLoc(), \"this type not allowed\", (yyvsp[0].interm.intermTypedNode)->getType().getBasicString(), \"\");\n        (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermTypedNode));\n    }\n#line 12414 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 678: /* spirv_execution_mode_id_parameter_list: spirv_execution_mode_id_parameter_list COMMA constant_expression  */\n#line 4375 \"MachineIndependent/glslang.y\"\n                                                                       {\n        if ((yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtFloat &&\n            (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtInt &&\n            (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtUint &&\n            (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtBool &&\n            (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtString)\n            parseContext.error((yyvsp[0].interm.intermTypedNode)->getLoc(), \"this type not allowed\", (yyvsp[0].interm.intermTypedNode)->getType().getBasicString(), \"\");\n        (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermNode), (yyvsp[0].interm.intermTypedNode));\n    }\n#line 12428 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 679: /* spirv_storage_class_qualifier: SPIRV_STORAGE_CLASS LEFT_PAREN INTCONSTANT RIGHT_PAREN  */\n#line 4386 \"MachineIndependent/glslang.y\"\n                                                             {\n        (yyval.interm.type).init((yyvsp[-3].lex).loc);\n        (yyval.interm.type).qualifier.storage = EvqSpirvStorageClass;\n        (yyval.interm.type).qualifier.spirvStorageClass = (yyvsp[-1].lex).i;\n    }\n#line 12438 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 680: /* spirv_storage_class_qualifier: SPIRV_STORAGE_CLASS LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT RIGHT_PAREN  */\n#line 4391 \"MachineIndependent/glslang.y\"\n                                                                                           {\n        (yyval.interm.type).init((yyvsp[-5].lex).loc);\n        parseContext.intermediate.insertSpirvRequirement((yyvsp[-3].interm.spirvReq));\n        (yyval.interm.type).qualifier.storage = EvqSpirvStorageClass;\n        (yyval.interm.type).qualifier.spirvStorageClass = (yyvsp[-1].lex).i;\n    }\n#line 12449 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 681: /* spirv_decorate_qualifier: SPIRV_DECORATE LEFT_PAREN INTCONSTANT RIGHT_PAREN  */\n#line 4399 \"MachineIndependent/glslang.y\"\n                                                       {\n        (yyval.interm.type).init((yyvsp[-3].lex).loc);\n        (yyval.interm.type).qualifier.setSpirvDecorate((yyvsp[-1].lex).i);\n    }\n#line 12458 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 682: /* spirv_decorate_qualifier: SPIRV_DECORATE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT RIGHT_PAREN  */\n#line 4403 \"MachineIndependent/glslang.y\"\n                                                                                     {\n        (yyval.interm.type).init((yyvsp[-5].lex).loc);\n        parseContext.intermediate.insertSpirvRequirement((yyvsp[-3].interm.spirvReq));\n        (yyval.interm.type).qualifier.setSpirvDecorate((yyvsp[-1].lex).i);\n    }\n#line 12468 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 683: /* spirv_decorate_qualifier: SPIRV_DECORATE LEFT_PAREN INTCONSTANT COMMA spirv_decorate_parameter_list RIGHT_PAREN  */\n#line 4408 \"MachineIndependent/glslang.y\"\n                                                                                            {\n        (yyval.interm.type).init((yyvsp[-5].lex).loc);\n        (yyval.interm.type).qualifier.setSpirvDecorate((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate());\n    }\n#line 12477 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 684: /* spirv_decorate_qualifier: SPIRV_DECORATE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_decorate_parameter_list RIGHT_PAREN  */\n#line 4412 \"MachineIndependent/glslang.y\"\n                                                                                                                          {\n        (yyval.interm.type).init((yyvsp[-7].lex).loc);\n        parseContext.intermediate.insertSpirvRequirement((yyvsp[-5].interm.spirvReq));\n        (yyval.interm.type).qualifier.setSpirvDecorate((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate());\n    }\n#line 12487 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 685: /* spirv_decorate_qualifier: SPIRV_DECORATE_ID LEFT_PAREN INTCONSTANT COMMA spirv_decorate_id_parameter_list RIGHT_PAREN  */\n#line 4417 \"MachineIndependent/glslang.y\"\n                                                                                                  {\n        (yyval.interm.type).init((yyvsp[-5].lex).loc);\n        (yyval.interm.type).qualifier.setSpirvDecorateId((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate());\n    }\n#line 12496 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 686: /* spirv_decorate_qualifier: SPIRV_DECORATE_ID LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_decorate_id_parameter_list RIGHT_PAREN  */\n#line 4421 \"MachineIndependent/glslang.y\"\n                                                                                                                                {\n        (yyval.interm.type).init((yyvsp[-7].lex).loc);\n        parseContext.intermediate.insertSpirvRequirement((yyvsp[-5].interm.spirvReq));\n        (yyval.interm.type).qualifier.setSpirvDecorateId((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate());\n    }\n#line 12506 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 687: /* spirv_decorate_qualifier: SPIRV_DECORATE_STRING LEFT_PAREN INTCONSTANT COMMA spirv_decorate_string_parameter_list RIGHT_PAREN  */\n#line 4426 \"MachineIndependent/glslang.y\"\n                                                                                                          {\n        (yyval.interm.type).init((yyvsp[-5].lex).loc);\n        (yyval.interm.type).qualifier.setSpirvDecorateString((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate());\n    }\n#line 12515 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 688: /* spirv_decorate_qualifier: SPIRV_DECORATE_STRING LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_decorate_string_parameter_list RIGHT_PAREN  */\n#line 4430 \"MachineIndependent/glslang.y\"\n                                                                                                                                        {\n        (yyval.interm.type).init((yyvsp[-7].lex).loc);\n        parseContext.intermediate.insertSpirvRequirement((yyvsp[-5].interm.spirvReq));\n        (yyval.interm.type).qualifier.setSpirvDecorateString((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate());\n    }\n#line 12525 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 689: /* spirv_decorate_parameter_list: spirv_decorate_parameter  */\n#line 4437 \"MachineIndependent/glslang.y\"\n                               {\n        (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermNode));\n    }\n#line 12533 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 690: /* spirv_decorate_parameter_list: spirv_decorate_parameter_list COMMA spirv_decorate_parameter  */\n#line 4440 \"MachineIndependent/glslang.y\"\n                                                                   {\n        (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermNode), (yyvsp[0].interm.intermNode));\n    }\n#line 12541 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 691: /* spirv_decorate_parameter: FLOATCONSTANT  */\n#line 4445 \"MachineIndependent/glslang.y\"\n                    {\n        (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat, (yyvsp[0].lex).loc, true);\n    }\n#line 12549 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 692: /* spirv_decorate_parameter: INTCONSTANT  */\n#line 4448 \"MachineIndependent/glslang.y\"\n                  {\n        (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true);\n    }\n#line 12557 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 693: /* spirv_decorate_parameter: UINTCONSTANT  */\n#line 4451 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true);\n    }\n#line 12565 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 694: /* spirv_decorate_parameter: BOOLCONSTANT  */\n#line 4454 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).b, (yyvsp[0].lex).loc, true);\n    }\n#line 12573 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 695: /* spirv_decorate_id_parameter_list: spirv_decorate_id_parameter  */\n#line 4459 \"MachineIndependent/glslang.y\"\n                                  {\n        (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermNode));\n    }\n#line 12581 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 696: /* spirv_decorate_id_parameter_list: spirv_decorate_id_parameter_list COMMA spirv_decorate_id_parameter  */\n#line 4462 \"MachineIndependent/glslang.y\"\n                                                                         {\n        (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermNode), (yyvsp[0].interm.intermNode));\n    }\n#line 12589 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 697: /* spirv_decorate_id_parameter: variable_identifier  */\n#line 4467 \"MachineIndependent/glslang.y\"\n                          {\n        if ((yyvsp[0].interm.intermTypedNode)->getAsConstantUnion() || (yyvsp[0].interm.intermTypedNode)->getAsSymbolNode())\n            (yyval.interm.intermNode) = (yyvsp[0].interm.intermTypedNode);\n        else\n            parseContext.error((yyvsp[0].interm.intermTypedNode)->getLoc(), \"only allow constants or variables which are not elements of a composite\", \"\", \"\");\n    }\n#line 12600 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 698: /* spirv_decorate_id_parameter: FLOATCONSTANT  */\n#line 4473 \"MachineIndependent/glslang.y\"\n                    {\n        (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat, (yyvsp[0].lex).loc, true);\n    }\n#line 12608 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 699: /* spirv_decorate_id_parameter: INTCONSTANT  */\n#line 4476 \"MachineIndependent/glslang.y\"\n                  {\n        (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true);\n    }\n#line 12616 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 700: /* spirv_decorate_id_parameter: UINTCONSTANT  */\n#line 4479 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true);\n    }\n#line 12624 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 701: /* spirv_decorate_id_parameter: BOOLCONSTANT  */\n#line 4482 \"MachineIndependent/glslang.y\"\n                   {\n        (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).b, (yyvsp[0].lex).loc, true);\n    }\n#line 12632 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 702: /* spirv_decorate_string_parameter_list: STRING_LITERAL  */\n#line 4487 \"MachineIndependent/glslang.y\"\n                     {\n        (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate(\n            parseContext.intermediate.addConstantUnion((yyvsp[0].lex).string, (yyvsp[0].lex).loc, true));\n    }\n#line 12641 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 703: /* spirv_decorate_string_parameter_list: spirv_decorate_string_parameter_list COMMA STRING_LITERAL  */\n#line 4491 \"MachineIndependent/glslang.y\"\n                                                                {\n        (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermNode), parseContext.intermediate.addConstantUnion((yyvsp[0].lex).string, (yyvsp[0].lex).loc, true));\n    }\n#line 12649 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 704: /* spirv_type_specifier: SPIRV_TYPE LEFT_PAREN spirv_instruction_qualifier_list COMMA spirv_type_parameter_list RIGHT_PAREN  */\n#line 4496 \"MachineIndependent/glslang.y\"\n                                                                                                         {\n        (yyval.interm.type).init((yyvsp[-5].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).setSpirvType(*(yyvsp[-3].interm.spirvInst), (yyvsp[-1].interm.spirvTypeParams));\n    }\n#line 12658 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 705: /* spirv_type_specifier: SPIRV_TYPE LEFT_PAREN spirv_requirements_list COMMA spirv_instruction_qualifier_list COMMA spirv_type_parameter_list RIGHT_PAREN  */\n#line 4500 \"MachineIndependent/glslang.y\"\n                                                                                                                                       {\n        (yyval.interm.type).init((yyvsp[-7].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        parseContext.intermediate.insertSpirvRequirement((yyvsp[-5].interm.spirvReq));\n        (yyval.interm.type).setSpirvType(*(yyvsp[-3].interm.spirvInst), (yyvsp[-1].interm.spirvTypeParams));\n    }\n#line 12668 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 706: /* spirv_type_specifier: SPIRV_TYPE LEFT_PAREN spirv_instruction_qualifier_list RIGHT_PAREN  */\n#line 4505 \"MachineIndependent/glslang.y\"\n                                                                         {\n        (yyval.interm.type).init((yyvsp[-3].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        (yyval.interm.type).setSpirvType(*(yyvsp[-1].interm.spirvInst));\n    }\n#line 12677 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 707: /* spirv_type_specifier: SPIRV_TYPE LEFT_PAREN spirv_requirements_list COMMA spirv_instruction_qualifier_list RIGHT_PAREN  */\n#line 4509 \"MachineIndependent/glslang.y\"\n                                                                                                       {\n        (yyval.interm.type).init((yyvsp[-5].lex).loc, parseContext.symbolTable.atGlobalLevel());\n        parseContext.intermediate.insertSpirvRequirement((yyvsp[-3].interm.spirvReq));\n        (yyval.interm.type).setSpirvType(*(yyvsp[-1].interm.spirvInst));\n    }\n#line 12687 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 708: /* spirv_type_parameter_list: spirv_type_parameter  */\n#line 4516 \"MachineIndependent/glslang.y\"\n                           {\n        (yyval.interm.spirvTypeParams) = (yyvsp[0].interm.spirvTypeParams);\n    }\n#line 12695 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 709: /* spirv_type_parameter_list: spirv_type_parameter_list COMMA spirv_type_parameter  */\n#line 4519 \"MachineIndependent/glslang.y\"\n                                                           {\n        (yyval.interm.spirvTypeParams) = parseContext.mergeSpirvTypeParameters((yyvsp[-2].interm.spirvTypeParams), (yyvsp[0].interm.spirvTypeParams));\n    }\n#line 12703 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 710: /* spirv_type_parameter: constant_expression  */\n#line 4524 \"MachineIndependent/glslang.y\"\n                          {\n        (yyval.interm.spirvTypeParams) = parseContext.makeSpirvTypeParameters((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode)->getAsConstantUnion());\n    }\n#line 12711 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 711: /* spirv_type_parameter: type_specifier_nonarray  */\n#line 4527 \"MachineIndependent/glslang.y\"\n                              {\n        (yyval.interm.spirvTypeParams) = parseContext.makeSpirvTypeParameters((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type));\n    }\n#line 12719 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 712: /* spirv_instruction_qualifier: SPIRV_INSTRUCTION LEFT_PAREN spirv_instruction_qualifier_list RIGHT_PAREN  */\n#line 4532 \"MachineIndependent/glslang.y\"\n                                                                                {\n        (yyval.interm.spirvInst) = (yyvsp[-1].interm.spirvInst);\n    }\n#line 12727 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 713: /* spirv_instruction_qualifier: SPIRV_INSTRUCTION LEFT_PAREN spirv_requirements_list COMMA spirv_instruction_qualifier_list RIGHT_PAREN  */\n#line 4535 \"MachineIndependent/glslang.y\"\n                                                                                                              {\n        parseContext.intermediate.insertSpirvRequirement((yyvsp[-3].interm.spirvReq));\n        (yyval.interm.spirvInst) = (yyvsp[-1].interm.spirvInst);\n    }\n#line 12736 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 714: /* spirv_instruction_qualifier_list: spirv_instruction_qualifier_id  */\n#line 4541 \"MachineIndependent/glslang.y\"\n                                     {\n        (yyval.interm.spirvInst) = (yyvsp[0].interm.spirvInst);\n    }\n#line 12744 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 715: /* spirv_instruction_qualifier_list: spirv_instruction_qualifier_list COMMA spirv_instruction_qualifier_id  */\n#line 4544 \"MachineIndependent/glslang.y\"\n                                                                            {\n        (yyval.interm.spirvInst) = parseContext.mergeSpirvInstruction((yyvsp[-1].lex).loc, (yyvsp[-2].interm.spirvInst), (yyvsp[0].interm.spirvInst));\n    }\n#line 12752 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 716: /* spirv_instruction_qualifier_id: IDENTIFIER EQUAL STRING_LITERAL  */\n#line 4549 \"MachineIndependent/glslang.y\"\n                                      {\n        (yyval.interm.spirvInst) = parseContext.makeSpirvInstruction((yyvsp[-1].lex).loc, *(yyvsp[-2].lex).string, *(yyvsp[0].lex).string);\n    }\n#line 12760 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n  case 717: /* spirv_instruction_qualifier_id: IDENTIFIER EQUAL INTCONSTANT  */\n#line 4552 \"MachineIndependent/glslang.y\"\n                                   {\n        (yyval.interm.spirvInst) = parseContext.makeSpirvInstruction((yyvsp[-1].lex).loc, *(yyvsp[-2].lex).string, (yyvsp[0].lex).i);\n    }\n#line 12768 \"MachineIndependent/glslang_tab.cpp\"\n    break;\n\n\n#line 12772 \"MachineIndependent/glslang_tab.cpp\"\n\n      default: break;\n    }\n  /* User semantic actions sometimes alter yychar, and that requires\n     that yytoken be updated with the new translation.  We take the\n     approach of translating immediately before every use of yytoken.\n     One alternative is translating here after every semantic action,\n     but that translation would be missed if the semantic action invokes\n     YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or\n     if it invokes YYBACKUP.  In the case of YYABORT or YYACCEPT, an\n     incorrect destructor might then be invoked immediately.  In the\n     case of YYERROR or YYBACKUP, subsequent parser actions might lead\n     to an incorrect destructor call or verbose syntax error message\n     before the lookahead is translated.  */\n  YY_SYMBOL_PRINT (\"-> $$ =\", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc);\n\n  YYPOPSTACK (yylen);\n  yylen = 0;\n\n  *++yyvsp = yyval;\n\n  /* Now 'shift' the result of the reduction.  Determine what state\n     that goes to, based on the state we popped back to and the rule\n     number reduced by.  */\n  {\n    const int yylhs = yyr1[yyn] - YYNTOKENS;\n    const int yyi = yypgoto[yylhs] + *yyssp;\n    yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp\n               ? yytable[yyi]\n               : yydefgoto[yylhs]);\n  }\n\n  goto yynewstate;\n\n\n/*--------------------------------------.\n| yyerrlab -- here on detecting error.  |\n`--------------------------------------*/\nyyerrlab:\n  /* Make sure we have latest lookahead translation.  See comments at\n     user semantic actions for why this is necessary.  */\n  yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar);\n  /* If not already recovering from an error, report this error.  */\n  if (!yyerrstatus)\n    {\n      ++yynerrs;\n      {\n        yypcontext_t yyctx\n          = {yyssp, yytoken};\n        char const *yymsgp = YY_(\"syntax error\");\n        int yysyntax_error_status;\n        yysyntax_error_status = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx);\n        if (yysyntax_error_status == 0)\n          yymsgp = yymsg;\n        else if (yysyntax_error_status == -1)\n          {\n            if (yymsg != yymsgbuf)\n              YYSTACK_FREE (yymsg);\n            yymsg = YY_CAST (char *,\n                             YYSTACK_ALLOC (YY_CAST (YYSIZE_T, yymsg_alloc)));\n            if (yymsg)\n              {\n                yysyntax_error_status\n                  = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx);\n                yymsgp = yymsg;\n              }\n            else\n              {\n                yymsg = yymsgbuf;\n                yymsg_alloc = sizeof yymsgbuf;\n                yysyntax_error_status = YYENOMEM;\n              }\n          }\n        yyerror (pParseContext, yymsgp);\n        if (yysyntax_error_status == YYENOMEM)\n          YYNOMEM;\n      }\n    }\n\n  if (yyerrstatus == 3)\n    {\n      /* If just tried and failed to reuse lookahead token after an\n         error, discard it.  */\n\n      if (yychar <= YYEOF)\n        {\n          /* Return failure if at end of input.  */\n          if (yychar == YYEOF)\n            YYABORT;\n        }\n      else\n        {\n          yydestruct (\"Error: discarding\",\n                      yytoken, &yylval, pParseContext);\n          yychar = YYEMPTY;\n        }\n    }\n\n  /* Else will try to reuse lookahead token after shifting the error\n     token.  */\n  goto yyerrlab1;\n\n\n/*---------------------------------------------------.\n| yyerrorlab -- error raised explicitly by YYERROR.  |\n`---------------------------------------------------*/\nyyerrorlab:\n  /* Pacify compilers when the user code never invokes YYERROR and the\n     label yyerrorlab therefore never appears in user code.  */\n  if (0)\n    YYERROR;\n  ++yynerrs;\n\n  /* Do not reclaim the symbols of the rule whose action triggered\n     this YYERROR.  */\n  YYPOPSTACK (yylen);\n  yylen = 0;\n  YY_STACK_PRINT (yyss, yyssp);\n  yystate = *yyssp;\n  goto yyerrlab1;\n\n\n/*-------------------------------------------------------------.\n| yyerrlab1 -- common code for both syntax error and YYERROR.  |\n`-------------------------------------------------------------*/\nyyerrlab1:\n  yyerrstatus = 3;      /* Each real token shifted decrements this.  */\n\n  /* Pop stack until we find a state that shifts the error token.  */\n  for (;;)\n    {\n      yyn = yypact[yystate];\n      if (!yypact_value_is_default (yyn))\n        {\n          yyn += YYSYMBOL_YYerror;\n          if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror)\n            {\n              yyn = yytable[yyn];\n              if (0 < yyn)\n                break;\n            }\n        }\n\n      /* Pop the current state because it cannot handle the error token.  */\n      if (yyssp == yyss)\n        YYABORT;\n\n\n      yydestruct (\"Error: popping\",\n                  YY_ACCESSING_SYMBOL (yystate), yyvsp, pParseContext);\n      YYPOPSTACK (1);\n      yystate = *yyssp;\n      YY_STACK_PRINT (yyss, yyssp);\n    }\n\n  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN\n  *++yyvsp = yylval;\n  YY_IGNORE_MAYBE_UNINITIALIZED_END\n\n\n  /* Shift the error token.  */\n  YY_SYMBOL_PRINT (\"Shifting\", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp);\n\n  yystate = yyn;\n  goto yynewstate;\n\n\n/*-------------------------------------.\n| yyacceptlab -- YYACCEPT comes here.  |\n`-------------------------------------*/\nyyacceptlab:\n  yyresult = 0;\n  goto yyreturnlab;\n\n\n/*-----------------------------------.\n| yyabortlab -- YYABORT comes here.  |\n`-----------------------------------*/\nyyabortlab:\n  yyresult = 1;\n  goto yyreturnlab;\n\n\n/*-----------------------------------------------------------.\n| yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here.  |\n`-----------------------------------------------------------*/\nyyexhaustedlab:\n  yyerror (pParseContext, YY_(\"memory exhausted\"));\n  yyresult = 2;\n  goto yyreturnlab;\n\n\n/*----------------------------------------------------------.\n| yyreturnlab -- parsing is finished, clean up and return.  |\n`----------------------------------------------------------*/\nyyreturnlab:\n  if (yychar != YYEMPTY)\n    {\n      /* Make sure we have latest lookahead translation.  See comments at\n         user semantic actions for why this is necessary.  */\n      yytoken = YYTRANSLATE (yychar);\n      yydestruct (\"Cleanup: discarding lookahead\",\n                  yytoken, &yylval, pParseContext);\n    }\n  /* Do not reclaim the symbols of the rule whose action triggered\n     this YYABORT or YYACCEPT.  */\n  YYPOPSTACK (yylen);\n  YY_STACK_PRINT (yyss, yyssp);\n  while (yyssp != yyss)\n    {\n      yydestruct (\"Cleanup: popping\",\n                  YY_ACCESSING_SYMBOL (+*yyssp), yyvsp, pParseContext);\n      YYPOPSTACK (1);\n    }\n#ifndef yyoverflow\n  if (yyss != yyssa)\n    YYSTACK_FREE (yyss);\n#endif\n  if (yymsg != yymsgbuf)\n    YYSTACK_FREE (yymsg);\n  return yyresult;\n}\n\n#line 4556 \"MachineIndependent/glslang.y\"\n\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/glslang_tab.cpp.h",
    "content": "/* A Bison parser, made by GNU Bison 3.8.2.  */\n\n/* Bison interface for Yacc-like parsers in C\n\n   Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,\n   Inc.\n\n   This program is free software: you can redistribute it and/or modify\n   it under the terms of the GNU General Public License as published by\n   the Free Software Foundation, either version 3 of the License, or\n   (at your option) any later version.\n\n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n\n   You should have received a copy of the GNU General Public License\n   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */\n\n/* As a special exception, you may create a larger work that contains\n   part or all of the Bison parser skeleton and distribute that work\n   under terms of your choice, so long as that work isn't itself a\n   parser generator using the skeleton or a modified version thereof\n   as a parser skeleton.  Alternatively, if you modify or redistribute\n   the parser skeleton itself, you may (at your option) remove this\n   special exception, which will cause the skeleton and the resulting\n   Bison output files to be licensed under the GNU General Public\n   License without this special exception.\n\n   This special exception was added by the Free Software Foundation in\n   version 2.2 of Bison.  */\n\n/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,\n   especially those whose name start with YY_ or yy_.  They are\n   private implementation details that can be changed or removed.  */\n\n#ifndef YY_YY_MACHINEINDEPENDENT_GLSLANG_TAB_CPP_H_INCLUDED\n# define YY_YY_MACHINEINDEPENDENT_GLSLANG_TAB_CPP_H_INCLUDED\n/* Debug traces.  */\n#ifndef YYDEBUG\n# define YYDEBUG 1\n#endif\n#if YYDEBUG\nextern int yydebug;\n#endif\n\n/* Token kinds.  */\n#ifndef YYTOKENTYPE\n# define YYTOKENTYPE\n  enum yytokentype\n  {\n    YYEMPTY = -2,\n    YYEOF = 0,                     /* \"end of file\"  */\n    YYerror = 256,                 /* error  */\n    YYUNDEF = 257,                 /* \"invalid token\"  */\n    CONST = 258,                   /* CONST  */\n    BOOL = 259,                    /* BOOL  */\n    INT = 260,                     /* INT  */\n    UINT = 261,                    /* UINT  */\n    FLOAT = 262,                   /* FLOAT  */\n    BVEC2 = 263,                   /* BVEC2  */\n    BVEC3 = 264,                   /* BVEC3  */\n    BVEC4 = 265,                   /* BVEC4  */\n    IVEC2 = 266,                   /* IVEC2  */\n    IVEC3 = 267,                   /* IVEC3  */\n    IVEC4 = 268,                   /* IVEC4  */\n    UVEC2 = 269,                   /* UVEC2  */\n    UVEC3 = 270,                   /* UVEC3  */\n    UVEC4 = 271,                   /* UVEC4  */\n    VEC2 = 272,                    /* VEC2  */\n    VEC3 = 273,                    /* VEC3  */\n    VEC4 = 274,                    /* VEC4  */\n    MAT2 = 275,                    /* MAT2  */\n    MAT3 = 276,                    /* MAT3  */\n    MAT4 = 277,                    /* MAT4  */\n    MAT2X2 = 278,                  /* MAT2X2  */\n    MAT2X3 = 279,                  /* MAT2X3  */\n    MAT2X4 = 280,                  /* MAT2X4  */\n    MAT3X2 = 281,                  /* MAT3X2  */\n    MAT3X3 = 282,                  /* MAT3X3  */\n    MAT3X4 = 283,                  /* MAT3X4  */\n    MAT4X2 = 284,                  /* MAT4X2  */\n    MAT4X3 = 285,                  /* MAT4X3  */\n    MAT4X4 = 286,                  /* MAT4X4  */\n    SAMPLER2D = 287,               /* SAMPLER2D  */\n    SAMPLER3D = 288,               /* SAMPLER3D  */\n    SAMPLERCUBE = 289,             /* SAMPLERCUBE  */\n    SAMPLER2DSHADOW = 290,         /* SAMPLER2DSHADOW  */\n    SAMPLERCUBESHADOW = 291,       /* SAMPLERCUBESHADOW  */\n    SAMPLER2DARRAY = 292,          /* SAMPLER2DARRAY  */\n    SAMPLER2DARRAYSHADOW = 293,    /* SAMPLER2DARRAYSHADOW  */\n    ISAMPLER2D = 294,              /* ISAMPLER2D  */\n    ISAMPLER3D = 295,              /* ISAMPLER3D  */\n    ISAMPLERCUBE = 296,            /* ISAMPLERCUBE  */\n    ISAMPLER2DARRAY = 297,         /* ISAMPLER2DARRAY  */\n    USAMPLER2D = 298,              /* USAMPLER2D  */\n    USAMPLER3D = 299,              /* USAMPLER3D  */\n    USAMPLERCUBE = 300,            /* USAMPLERCUBE  */\n    USAMPLER2DARRAY = 301,         /* USAMPLER2DARRAY  */\n    SAMPLER = 302,                 /* SAMPLER  */\n    SAMPLERSHADOW = 303,           /* SAMPLERSHADOW  */\n    TEXTURE2D = 304,               /* TEXTURE2D  */\n    TEXTURE3D = 305,               /* TEXTURE3D  */\n    TEXTURECUBE = 306,             /* TEXTURECUBE  */\n    TEXTURE2DARRAY = 307,          /* TEXTURE2DARRAY  */\n    ITEXTURE2D = 308,              /* ITEXTURE2D  */\n    ITEXTURE3D = 309,              /* ITEXTURE3D  */\n    ITEXTURECUBE = 310,            /* ITEXTURECUBE  */\n    ITEXTURE2DARRAY = 311,         /* ITEXTURE2DARRAY  */\n    UTEXTURE2D = 312,              /* UTEXTURE2D  */\n    UTEXTURE3D = 313,              /* UTEXTURE3D  */\n    UTEXTURECUBE = 314,            /* UTEXTURECUBE  */\n    UTEXTURE2DARRAY = 315,         /* UTEXTURE2DARRAY  */\n    ATTRIBUTE = 316,               /* ATTRIBUTE  */\n    VARYING = 317,                 /* VARYING  */\n    FLOATE5M2_T = 318,             /* FLOATE5M2_T  */\n    FLOATE4M3_T = 319,             /* FLOATE4M3_T  */\n    BFLOAT16_T = 320,              /* BFLOAT16_T  */\n    FLOAT16_T = 321,               /* FLOAT16_T  */\n    FLOAT32_T = 322,               /* FLOAT32_T  */\n    DOUBLE = 323,                  /* DOUBLE  */\n    FLOAT64_T = 324,               /* FLOAT64_T  */\n    INT64_T = 325,                 /* INT64_T  */\n    UINT64_T = 326,                /* UINT64_T  */\n    INT32_T = 327,                 /* INT32_T  */\n    UINT32_T = 328,                /* UINT32_T  */\n    INT16_T = 329,                 /* INT16_T  */\n    UINT16_T = 330,                /* UINT16_T  */\n    INT8_T = 331,                  /* INT8_T  */\n    UINT8_T = 332,                 /* UINT8_T  */\n    I64VEC2 = 333,                 /* I64VEC2  */\n    I64VEC3 = 334,                 /* I64VEC3  */\n    I64VEC4 = 335,                 /* I64VEC4  */\n    U64VEC2 = 336,                 /* U64VEC2  */\n    U64VEC3 = 337,                 /* U64VEC3  */\n    U64VEC4 = 338,                 /* U64VEC4  */\n    I32VEC2 = 339,                 /* I32VEC2  */\n    I32VEC3 = 340,                 /* I32VEC3  */\n    I32VEC4 = 341,                 /* I32VEC4  */\n    U32VEC2 = 342,                 /* U32VEC2  */\n    U32VEC3 = 343,                 /* U32VEC3  */\n    U32VEC4 = 344,                 /* U32VEC4  */\n    I16VEC2 = 345,                 /* I16VEC2  */\n    I16VEC3 = 346,                 /* I16VEC3  */\n    I16VEC4 = 347,                 /* I16VEC4  */\n    U16VEC2 = 348,                 /* U16VEC2  */\n    U16VEC3 = 349,                 /* U16VEC3  */\n    U16VEC4 = 350,                 /* U16VEC4  */\n    I8VEC2 = 351,                  /* I8VEC2  */\n    I8VEC3 = 352,                  /* I8VEC3  */\n    I8VEC4 = 353,                  /* I8VEC4  */\n    U8VEC2 = 354,                  /* U8VEC2  */\n    U8VEC3 = 355,                  /* U8VEC3  */\n    U8VEC4 = 356,                  /* U8VEC4  */\n    DVEC2 = 357,                   /* DVEC2  */\n    DVEC3 = 358,                   /* DVEC3  */\n    DVEC4 = 359,                   /* DVEC4  */\n    DMAT2 = 360,                   /* DMAT2  */\n    DMAT3 = 361,                   /* DMAT3  */\n    DMAT4 = 362,                   /* DMAT4  */\n    BF16VEC2 = 363,                /* BF16VEC2  */\n    BF16VEC3 = 364,                /* BF16VEC3  */\n    BF16VEC4 = 365,                /* BF16VEC4  */\n    FE5M2VEC2 = 366,               /* FE5M2VEC2  */\n    FE5M2VEC3 = 367,               /* FE5M2VEC3  */\n    FE5M2VEC4 = 368,               /* FE5M2VEC4  */\n    FE4M3VEC2 = 369,               /* FE4M3VEC2  */\n    FE4M3VEC3 = 370,               /* FE4M3VEC3  */\n    FE4M3VEC4 = 371,               /* FE4M3VEC4  */\n    F16VEC2 = 372,                 /* F16VEC2  */\n    F16VEC3 = 373,                 /* F16VEC3  */\n    F16VEC4 = 374,                 /* F16VEC4  */\n    F16MAT2 = 375,                 /* F16MAT2  */\n    F16MAT3 = 376,                 /* F16MAT3  */\n    F16MAT4 = 377,                 /* F16MAT4  */\n    F32VEC2 = 378,                 /* F32VEC2  */\n    F32VEC3 = 379,                 /* F32VEC3  */\n    F32VEC4 = 380,                 /* F32VEC4  */\n    F32MAT2 = 381,                 /* F32MAT2  */\n    F32MAT3 = 382,                 /* F32MAT3  */\n    F32MAT4 = 383,                 /* F32MAT4  */\n    F64VEC2 = 384,                 /* F64VEC2  */\n    F64VEC3 = 385,                 /* F64VEC3  */\n    F64VEC4 = 386,                 /* F64VEC4  */\n    F64MAT2 = 387,                 /* F64MAT2  */\n    F64MAT3 = 388,                 /* F64MAT3  */\n    F64MAT4 = 389,                 /* F64MAT4  */\n    DMAT2X2 = 390,                 /* DMAT2X2  */\n    DMAT2X3 = 391,                 /* DMAT2X3  */\n    DMAT2X4 = 392,                 /* DMAT2X4  */\n    DMAT3X2 = 393,                 /* DMAT3X2  */\n    DMAT3X3 = 394,                 /* DMAT3X3  */\n    DMAT3X4 = 395,                 /* DMAT3X4  */\n    DMAT4X2 = 396,                 /* DMAT4X2  */\n    DMAT4X3 = 397,                 /* DMAT4X3  */\n    DMAT4X4 = 398,                 /* DMAT4X4  */\n    F16MAT2X2 = 399,               /* F16MAT2X2  */\n    F16MAT2X3 = 400,               /* F16MAT2X3  */\n    F16MAT2X4 = 401,               /* F16MAT2X4  */\n    F16MAT3X2 = 402,               /* F16MAT3X2  */\n    F16MAT3X3 = 403,               /* F16MAT3X3  */\n    F16MAT3X4 = 404,               /* F16MAT3X4  */\n    F16MAT4X2 = 405,               /* F16MAT4X2  */\n    F16MAT4X3 = 406,               /* F16MAT4X3  */\n    F16MAT4X4 = 407,               /* F16MAT4X4  */\n    F32MAT2X2 = 408,               /* F32MAT2X2  */\n    F32MAT2X3 = 409,               /* F32MAT2X3  */\n    F32MAT2X4 = 410,               /* F32MAT2X4  */\n    F32MAT3X2 = 411,               /* F32MAT3X2  */\n    F32MAT3X3 = 412,               /* F32MAT3X3  */\n    F32MAT3X4 = 413,               /* F32MAT3X4  */\n    F32MAT4X2 = 414,               /* F32MAT4X2  */\n    F32MAT4X3 = 415,               /* F32MAT4X3  */\n    F32MAT4X4 = 416,               /* F32MAT4X4  */\n    F64MAT2X2 = 417,               /* F64MAT2X2  */\n    F64MAT2X3 = 418,               /* F64MAT2X3  */\n    F64MAT2X4 = 419,               /* F64MAT2X4  */\n    F64MAT3X2 = 420,               /* F64MAT3X2  */\n    F64MAT3X3 = 421,               /* F64MAT3X3  */\n    F64MAT3X4 = 422,               /* F64MAT3X4  */\n    F64MAT4X2 = 423,               /* F64MAT4X2  */\n    F64MAT4X3 = 424,               /* F64MAT4X3  */\n    F64MAT4X4 = 425,               /* F64MAT4X4  */\n    ATOMIC_UINT = 426,             /* ATOMIC_UINT  */\n    ACCSTRUCTNV = 427,             /* ACCSTRUCTNV  */\n    ACCSTRUCTEXT = 428,            /* ACCSTRUCTEXT  */\n    RAYQUERYEXT = 429,             /* RAYQUERYEXT  */\n    FCOOPMATNV = 430,              /* FCOOPMATNV  */\n    ICOOPMATNV = 431,              /* ICOOPMATNV  */\n    UCOOPMATNV = 432,              /* UCOOPMATNV  */\n    COOPMAT = 433,                 /* COOPMAT  */\n    COOPVECNV = 434,               /* COOPVECNV  */\n    HITOBJECTNV = 435,             /* HITOBJECTNV  */\n    HITOBJECTATTRNV = 436,         /* HITOBJECTATTRNV  */\n    TENSORLAYOUTNV = 437,          /* TENSORLAYOUTNV  */\n    TENSORVIEWNV = 438,            /* TENSORVIEWNV  */\n    SAMPLERCUBEARRAY = 439,        /* SAMPLERCUBEARRAY  */\n    SAMPLERCUBEARRAYSHADOW = 440,  /* SAMPLERCUBEARRAYSHADOW  */\n    ISAMPLERCUBEARRAY = 441,       /* ISAMPLERCUBEARRAY  */\n    USAMPLERCUBEARRAY = 442,       /* USAMPLERCUBEARRAY  */\n    SAMPLER1D = 443,               /* SAMPLER1D  */\n    SAMPLER1DARRAY = 444,          /* SAMPLER1DARRAY  */\n    SAMPLER1DARRAYSHADOW = 445,    /* SAMPLER1DARRAYSHADOW  */\n    ISAMPLER1D = 446,              /* ISAMPLER1D  */\n    SAMPLER1DSHADOW = 447,         /* SAMPLER1DSHADOW  */\n    SAMPLER2DRECT = 448,           /* SAMPLER2DRECT  */\n    SAMPLER2DRECTSHADOW = 449,     /* SAMPLER2DRECTSHADOW  */\n    ISAMPLER2DRECT = 450,          /* ISAMPLER2DRECT  */\n    USAMPLER2DRECT = 451,          /* USAMPLER2DRECT  */\n    SAMPLERBUFFER = 452,           /* SAMPLERBUFFER  */\n    ISAMPLERBUFFER = 453,          /* ISAMPLERBUFFER  */\n    USAMPLERBUFFER = 454,          /* USAMPLERBUFFER  */\n    SAMPLER2DMS = 455,             /* SAMPLER2DMS  */\n    ISAMPLER2DMS = 456,            /* ISAMPLER2DMS  */\n    USAMPLER2DMS = 457,            /* USAMPLER2DMS  */\n    SAMPLER2DMSARRAY = 458,        /* SAMPLER2DMSARRAY  */\n    ISAMPLER2DMSARRAY = 459,       /* ISAMPLER2DMSARRAY  */\n    USAMPLER2DMSARRAY = 460,       /* USAMPLER2DMSARRAY  */\n    SAMPLEREXTERNALOES = 461,      /* SAMPLEREXTERNALOES  */\n    SAMPLEREXTERNAL2DY2YEXT = 462, /* SAMPLEREXTERNAL2DY2YEXT  */\n    ISAMPLER1DARRAY = 463,         /* ISAMPLER1DARRAY  */\n    USAMPLER1D = 464,              /* USAMPLER1D  */\n    USAMPLER1DARRAY = 465,         /* USAMPLER1DARRAY  */\n    F16SAMPLER1D = 466,            /* F16SAMPLER1D  */\n    F16SAMPLER2D = 467,            /* F16SAMPLER2D  */\n    F16SAMPLER3D = 468,            /* F16SAMPLER3D  */\n    F16SAMPLER2DRECT = 469,        /* F16SAMPLER2DRECT  */\n    F16SAMPLERCUBE = 470,          /* F16SAMPLERCUBE  */\n    F16SAMPLER1DARRAY = 471,       /* F16SAMPLER1DARRAY  */\n    F16SAMPLER2DARRAY = 472,       /* F16SAMPLER2DARRAY  */\n    F16SAMPLERCUBEARRAY = 473,     /* F16SAMPLERCUBEARRAY  */\n    F16SAMPLERBUFFER = 474,        /* F16SAMPLERBUFFER  */\n    F16SAMPLER2DMS = 475,          /* F16SAMPLER2DMS  */\n    F16SAMPLER2DMSARRAY = 476,     /* F16SAMPLER2DMSARRAY  */\n    F16SAMPLER1DSHADOW = 477,      /* F16SAMPLER1DSHADOW  */\n    F16SAMPLER2DSHADOW = 478,      /* F16SAMPLER2DSHADOW  */\n    F16SAMPLER1DARRAYSHADOW = 479, /* F16SAMPLER1DARRAYSHADOW  */\n    F16SAMPLER2DARRAYSHADOW = 480, /* F16SAMPLER2DARRAYSHADOW  */\n    F16SAMPLER2DRECTSHADOW = 481,  /* F16SAMPLER2DRECTSHADOW  */\n    F16SAMPLERCUBESHADOW = 482,    /* F16SAMPLERCUBESHADOW  */\n    F16SAMPLERCUBEARRAYSHADOW = 483, /* F16SAMPLERCUBEARRAYSHADOW  */\n    IMAGE1D = 484,                 /* IMAGE1D  */\n    IIMAGE1D = 485,                /* IIMAGE1D  */\n    UIMAGE1D = 486,                /* UIMAGE1D  */\n    IMAGE2D = 487,                 /* IMAGE2D  */\n    IIMAGE2D = 488,                /* IIMAGE2D  */\n    UIMAGE2D = 489,                /* UIMAGE2D  */\n    IMAGE3D = 490,                 /* IMAGE3D  */\n    IIMAGE3D = 491,                /* IIMAGE3D  */\n    UIMAGE3D = 492,                /* UIMAGE3D  */\n    IMAGE2DRECT = 493,             /* IMAGE2DRECT  */\n    IIMAGE2DRECT = 494,            /* IIMAGE2DRECT  */\n    UIMAGE2DRECT = 495,            /* UIMAGE2DRECT  */\n    IMAGECUBE = 496,               /* IMAGECUBE  */\n    IIMAGECUBE = 497,              /* IIMAGECUBE  */\n    UIMAGECUBE = 498,              /* UIMAGECUBE  */\n    IMAGEBUFFER = 499,             /* IMAGEBUFFER  */\n    IIMAGEBUFFER = 500,            /* IIMAGEBUFFER  */\n    UIMAGEBUFFER = 501,            /* UIMAGEBUFFER  */\n    IMAGE1DARRAY = 502,            /* IMAGE1DARRAY  */\n    IIMAGE1DARRAY = 503,           /* IIMAGE1DARRAY  */\n    UIMAGE1DARRAY = 504,           /* UIMAGE1DARRAY  */\n    IMAGE2DARRAY = 505,            /* IMAGE2DARRAY  */\n    IIMAGE2DARRAY = 506,           /* IIMAGE2DARRAY  */\n    UIMAGE2DARRAY = 507,           /* UIMAGE2DARRAY  */\n    IMAGECUBEARRAY = 508,          /* IMAGECUBEARRAY  */\n    IIMAGECUBEARRAY = 509,         /* IIMAGECUBEARRAY  */\n    UIMAGECUBEARRAY = 510,         /* UIMAGECUBEARRAY  */\n    IMAGE2DMS = 511,               /* IMAGE2DMS  */\n    IIMAGE2DMS = 512,              /* IIMAGE2DMS  */\n    UIMAGE2DMS = 513,              /* UIMAGE2DMS  */\n    IMAGE2DMSARRAY = 514,          /* IMAGE2DMSARRAY  */\n    IIMAGE2DMSARRAY = 515,         /* IIMAGE2DMSARRAY  */\n    UIMAGE2DMSARRAY = 516,         /* UIMAGE2DMSARRAY  */\n    F16IMAGE1D = 517,              /* F16IMAGE1D  */\n    F16IMAGE2D = 518,              /* F16IMAGE2D  */\n    F16IMAGE3D = 519,              /* F16IMAGE3D  */\n    F16IMAGE2DRECT = 520,          /* F16IMAGE2DRECT  */\n    F16IMAGECUBE = 521,            /* F16IMAGECUBE  */\n    F16IMAGE1DARRAY = 522,         /* F16IMAGE1DARRAY  */\n    F16IMAGE2DARRAY = 523,         /* F16IMAGE2DARRAY  */\n    F16IMAGECUBEARRAY = 524,       /* F16IMAGECUBEARRAY  */\n    F16IMAGEBUFFER = 525,          /* F16IMAGEBUFFER  */\n    F16IMAGE2DMS = 526,            /* F16IMAGE2DMS  */\n    F16IMAGE2DMSARRAY = 527,       /* F16IMAGE2DMSARRAY  */\n    I64IMAGE1D = 528,              /* I64IMAGE1D  */\n    U64IMAGE1D = 529,              /* U64IMAGE1D  */\n    I64IMAGE2D = 530,              /* I64IMAGE2D  */\n    U64IMAGE2D = 531,              /* U64IMAGE2D  */\n    I64IMAGE3D = 532,              /* I64IMAGE3D  */\n    U64IMAGE3D = 533,              /* U64IMAGE3D  */\n    I64IMAGE2DRECT = 534,          /* I64IMAGE2DRECT  */\n    U64IMAGE2DRECT = 535,          /* U64IMAGE2DRECT  */\n    I64IMAGECUBE = 536,            /* I64IMAGECUBE  */\n    U64IMAGECUBE = 537,            /* U64IMAGECUBE  */\n    I64IMAGEBUFFER = 538,          /* I64IMAGEBUFFER  */\n    U64IMAGEBUFFER = 539,          /* U64IMAGEBUFFER  */\n    I64IMAGE1DARRAY = 540,         /* I64IMAGE1DARRAY  */\n    U64IMAGE1DARRAY = 541,         /* U64IMAGE1DARRAY  */\n    I64IMAGE2DARRAY = 542,         /* I64IMAGE2DARRAY  */\n    U64IMAGE2DARRAY = 543,         /* U64IMAGE2DARRAY  */\n    I64IMAGECUBEARRAY = 544,       /* I64IMAGECUBEARRAY  */\n    U64IMAGECUBEARRAY = 545,       /* U64IMAGECUBEARRAY  */\n    I64IMAGE2DMS = 546,            /* I64IMAGE2DMS  */\n    U64IMAGE2DMS = 547,            /* U64IMAGE2DMS  */\n    I64IMAGE2DMSARRAY = 548,       /* I64IMAGE2DMSARRAY  */\n    U64IMAGE2DMSARRAY = 549,       /* U64IMAGE2DMSARRAY  */\n    TEXTURECUBEARRAY = 550,        /* TEXTURECUBEARRAY  */\n    ITEXTURECUBEARRAY = 551,       /* ITEXTURECUBEARRAY  */\n    UTEXTURECUBEARRAY = 552,       /* UTEXTURECUBEARRAY  */\n    TEXTURE1D = 553,               /* TEXTURE1D  */\n    ITEXTURE1D = 554,              /* ITEXTURE1D  */\n    UTEXTURE1D = 555,              /* UTEXTURE1D  */\n    TEXTURE1DARRAY = 556,          /* TEXTURE1DARRAY  */\n    ITEXTURE1DARRAY = 557,         /* ITEXTURE1DARRAY  */\n    UTEXTURE1DARRAY = 558,         /* UTEXTURE1DARRAY  */\n    TEXTURE2DRECT = 559,           /* TEXTURE2DRECT  */\n    ITEXTURE2DRECT = 560,          /* ITEXTURE2DRECT  */\n    UTEXTURE2DRECT = 561,          /* UTEXTURE2DRECT  */\n    TEXTUREBUFFER = 562,           /* TEXTUREBUFFER  */\n    ITEXTUREBUFFER = 563,          /* ITEXTUREBUFFER  */\n    UTEXTUREBUFFER = 564,          /* UTEXTUREBUFFER  */\n    TEXTURE2DMS = 565,             /* TEXTURE2DMS  */\n    ITEXTURE2DMS = 566,            /* ITEXTURE2DMS  */\n    UTEXTURE2DMS = 567,            /* UTEXTURE2DMS  */\n    TEXTURE2DMSARRAY = 568,        /* TEXTURE2DMSARRAY  */\n    ITEXTURE2DMSARRAY = 569,       /* ITEXTURE2DMSARRAY  */\n    UTEXTURE2DMSARRAY = 570,       /* UTEXTURE2DMSARRAY  */\n    F16TEXTURE1D = 571,            /* F16TEXTURE1D  */\n    F16TEXTURE2D = 572,            /* F16TEXTURE2D  */\n    F16TEXTURE3D = 573,            /* F16TEXTURE3D  */\n    F16TEXTURE2DRECT = 574,        /* F16TEXTURE2DRECT  */\n    F16TEXTURECUBE = 575,          /* F16TEXTURECUBE  */\n    F16TEXTURE1DARRAY = 576,       /* F16TEXTURE1DARRAY  */\n    F16TEXTURE2DARRAY = 577,       /* F16TEXTURE2DARRAY  */\n    F16TEXTURECUBEARRAY = 578,     /* F16TEXTURECUBEARRAY  */\n    F16TEXTUREBUFFER = 579,        /* F16TEXTUREBUFFER  */\n    F16TEXTURE2DMS = 580,          /* F16TEXTURE2DMS  */\n    F16TEXTURE2DMSARRAY = 581,     /* F16TEXTURE2DMSARRAY  */\n    SUBPASSINPUT = 582,            /* SUBPASSINPUT  */\n    SUBPASSINPUTMS = 583,          /* SUBPASSINPUTMS  */\n    ISUBPASSINPUT = 584,           /* ISUBPASSINPUT  */\n    ISUBPASSINPUTMS = 585,         /* ISUBPASSINPUTMS  */\n    USUBPASSINPUT = 586,           /* USUBPASSINPUT  */\n    USUBPASSINPUTMS = 587,         /* USUBPASSINPUTMS  */\n    F16SUBPASSINPUT = 588,         /* F16SUBPASSINPUT  */\n    F16SUBPASSINPUTMS = 589,       /* F16SUBPASSINPUTMS  */\n    SPIRV_INSTRUCTION = 590,       /* SPIRV_INSTRUCTION  */\n    SPIRV_EXECUTION_MODE = 591,    /* SPIRV_EXECUTION_MODE  */\n    SPIRV_EXECUTION_MODE_ID = 592, /* SPIRV_EXECUTION_MODE_ID  */\n    SPIRV_DECORATE = 593,          /* SPIRV_DECORATE  */\n    SPIRV_DECORATE_ID = 594,       /* SPIRV_DECORATE_ID  */\n    SPIRV_DECORATE_STRING = 595,   /* SPIRV_DECORATE_STRING  */\n    SPIRV_TYPE = 596,              /* SPIRV_TYPE  */\n    SPIRV_STORAGE_CLASS = 597,     /* SPIRV_STORAGE_CLASS  */\n    SPIRV_BY_REFERENCE = 598,      /* SPIRV_BY_REFERENCE  */\n    SPIRV_LITERAL = 599,           /* SPIRV_LITERAL  */\n    ATTACHMENTEXT = 600,           /* ATTACHMENTEXT  */\n    IATTACHMENTEXT = 601,          /* IATTACHMENTEXT  */\n    UATTACHMENTEXT = 602,          /* UATTACHMENTEXT  */\n    LEFT_OP = 603,                 /* LEFT_OP  */\n    RIGHT_OP = 604,                /* RIGHT_OP  */\n    INC_OP = 605,                  /* INC_OP  */\n    DEC_OP = 606,                  /* DEC_OP  */\n    LE_OP = 607,                   /* LE_OP  */\n    GE_OP = 608,                   /* GE_OP  */\n    EQ_OP = 609,                   /* EQ_OP  */\n    NE_OP = 610,                   /* NE_OP  */\n    AND_OP = 611,                  /* AND_OP  */\n    OR_OP = 612,                   /* OR_OP  */\n    XOR_OP = 613,                  /* XOR_OP  */\n    MUL_ASSIGN = 614,              /* MUL_ASSIGN  */\n    DIV_ASSIGN = 615,              /* DIV_ASSIGN  */\n    ADD_ASSIGN = 616,              /* ADD_ASSIGN  */\n    MOD_ASSIGN = 617,              /* MOD_ASSIGN  */\n    LEFT_ASSIGN = 618,             /* LEFT_ASSIGN  */\n    RIGHT_ASSIGN = 619,            /* RIGHT_ASSIGN  */\n    AND_ASSIGN = 620,              /* AND_ASSIGN  */\n    XOR_ASSIGN = 621,              /* XOR_ASSIGN  */\n    OR_ASSIGN = 622,               /* OR_ASSIGN  */\n    SUB_ASSIGN = 623,              /* SUB_ASSIGN  */\n    STRING_LITERAL = 624,          /* STRING_LITERAL  */\n    LEFT_PAREN = 625,              /* LEFT_PAREN  */\n    RIGHT_PAREN = 626,             /* RIGHT_PAREN  */\n    LEFT_BRACKET = 627,            /* LEFT_BRACKET  */\n    RIGHT_BRACKET = 628,           /* RIGHT_BRACKET  */\n    LEFT_BRACE = 629,              /* LEFT_BRACE  */\n    RIGHT_BRACE = 630,             /* RIGHT_BRACE  */\n    DOT = 631,                     /* DOT  */\n    COMMA = 632,                   /* COMMA  */\n    COLON = 633,                   /* COLON  */\n    EQUAL = 634,                   /* EQUAL  */\n    SEMICOLON = 635,               /* SEMICOLON  */\n    BANG = 636,                    /* BANG  */\n    DASH = 637,                    /* DASH  */\n    TILDE = 638,                   /* TILDE  */\n    PLUS = 639,                    /* PLUS  */\n    STAR = 640,                    /* STAR  */\n    SLASH = 641,                   /* SLASH  */\n    PERCENT = 642,                 /* PERCENT  */\n    LEFT_ANGLE = 643,              /* LEFT_ANGLE  */\n    RIGHT_ANGLE = 644,             /* RIGHT_ANGLE  */\n    VERTICAL_BAR = 645,            /* VERTICAL_BAR  */\n    CARET = 646,                   /* CARET  */\n    AMPERSAND = 647,               /* AMPERSAND  */\n    QUESTION = 648,                /* QUESTION  */\n    INVARIANT = 649,               /* INVARIANT  */\n    HIGH_PRECISION = 650,          /* HIGH_PRECISION  */\n    MEDIUM_PRECISION = 651,        /* MEDIUM_PRECISION  */\n    LOW_PRECISION = 652,           /* LOW_PRECISION  */\n    PRECISION = 653,               /* PRECISION  */\n    PACKED = 654,                  /* PACKED  */\n    RESOURCE = 655,                /* RESOURCE  */\n    SUPERP = 656,                  /* SUPERP  */\n    FLOATCONSTANT = 657,           /* FLOATCONSTANT  */\n    INTCONSTANT = 658,             /* INTCONSTANT  */\n    UINTCONSTANT = 659,            /* UINTCONSTANT  */\n    BOOLCONSTANT = 660,            /* BOOLCONSTANT  */\n    IDENTIFIER = 661,              /* IDENTIFIER  */\n    TYPE_NAME = 662,               /* TYPE_NAME  */\n    CENTROID = 663,                /* CENTROID  */\n    IN = 664,                      /* IN  */\n    OUT = 665,                     /* OUT  */\n    INOUT = 666,                   /* INOUT  */\n    STRUCT = 667,                  /* STRUCT  */\n    VOID = 668,                    /* VOID  */\n    WHILE = 669,                   /* WHILE  */\n    BREAK = 670,                   /* BREAK  */\n    CONTINUE = 671,                /* CONTINUE  */\n    DO = 672,                      /* DO  */\n    ELSE = 673,                    /* ELSE  */\n    FOR = 674,                     /* FOR  */\n    IF = 675,                      /* IF  */\n    DISCARD = 676,                 /* DISCARD  */\n    RETURN = 677,                  /* RETURN  */\n    SWITCH = 678,                  /* SWITCH  */\n    CASE = 679,                    /* CASE  */\n    DEFAULT = 680,                 /* DEFAULT  */\n    TERMINATE_INVOCATION = 681,    /* TERMINATE_INVOCATION  */\n    TERMINATE_RAY = 682,           /* TERMINATE_RAY  */\n    IGNORE_INTERSECTION = 683,     /* IGNORE_INTERSECTION  */\n    UNIFORM = 684,                 /* UNIFORM  */\n    SHARED = 685,                  /* SHARED  */\n    BUFFER = 686,                  /* BUFFER  */\n    TILEIMAGEEXT = 687,            /* TILEIMAGEEXT  */\n    FLAT = 688,                    /* FLAT  */\n    SMOOTH = 689,                  /* SMOOTH  */\n    LAYOUT = 690,                  /* LAYOUT  */\n    DOUBLECONSTANT = 691,          /* DOUBLECONSTANT  */\n    INT16CONSTANT = 692,           /* INT16CONSTANT  */\n    UINT16CONSTANT = 693,          /* UINT16CONSTANT  */\n    FLOAT16CONSTANT = 694,         /* FLOAT16CONSTANT  */\n    INT32CONSTANT = 695,           /* INT32CONSTANT  */\n    UINT32CONSTANT = 696,          /* UINT32CONSTANT  */\n    INT64CONSTANT = 697,           /* INT64CONSTANT  */\n    UINT64CONSTANT = 698,          /* UINT64CONSTANT  */\n    SUBROUTINE = 699,              /* SUBROUTINE  */\n    DEMOTE = 700,                  /* DEMOTE  */\n    FUNCTION = 701,                /* FUNCTION  */\n    PAYLOADNV = 702,               /* PAYLOADNV  */\n    PAYLOADINNV = 703,             /* PAYLOADINNV  */\n    HITATTRNV = 704,               /* HITATTRNV  */\n    CALLDATANV = 705,              /* CALLDATANV  */\n    CALLDATAINNV = 706,            /* CALLDATAINNV  */\n    PAYLOADEXT = 707,              /* PAYLOADEXT  */\n    PAYLOADINEXT = 708,            /* PAYLOADINEXT  */\n    HITATTREXT = 709,              /* HITATTREXT  */\n    CALLDATAEXT = 710,             /* CALLDATAEXT  */\n    CALLDATAINEXT = 711,           /* CALLDATAINEXT  */\n    PATCH = 712,                   /* PATCH  */\n    SAMPLE = 713,                  /* SAMPLE  */\n    NONUNIFORM = 714,              /* NONUNIFORM  */\n    COHERENT = 715,                /* COHERENT  */\n    VOLATILE = 716,                /* VOLATILE  */\n    RESTRICT = 717,                /* RESTRICT  */\n    READONLY = 718,                /* READONLY  */\n    WRITEONLY = 719,               /* WRITEONLY  */\n    NONTEMPORAL = 720,             /* NONTEMPORAL  */\n    DEVICECOHERENT = 721,          /* DEVICECOHERENT  */\n    QUEUEFAMILYCOHERENT = 722,     /* QUEUEFAMILYCOHERENT  */\n    WORKGROUPCOHERENT = 723,       /* WORKGROUPCOHERENT  */\n    SUBGROUPCOHERENT = 724,        /* SUBGROUPCOHERENT  */\n    NONPRIVATE = 725,              /* NONPRIVATE  */\n    SHADERCALLCOHERENT = 726,      /* SHADERCALLCOHERENT  */\n    NOPERSPECTIVE = 727,           /* NOPERSPECTIVE  */\n    EXPLICITINTERPAMD = 728,       /* EXPLICITINTERPAMD  */\n    PERVERTEXEXT = 729,            /* PERVERTEXEXT  */\n    PERVERTEXNV = 730,             /* PERVERTEXNV  */\n    PERPRIMITIVENV = 731,          /* PERPRIMITIVENV  */\n    PERVIEWNV = 732,               /* PERVIEWNV  */\n    PERTASKNV = 733,               /* PERTASKNV  */\n    PERPRIMITIVEEXT = 734,         /* PERPRIMITIVEEXT  */\n    TASKPAYLOADWORKGROUPEXT = 735, /* TASKPAYLOADWORKGROUPEXT  */\n    PRECISE = 736                  /* PRECISE  */\n  };\n  typedef enum yytokentype yytoken_kind_t;\n#endif\n\n/* Value type.  */\n#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED\nunion YYSTYPE\n{\n#line 72 \"MachineIndependent/glslang.y\"\n\n    struct {\n        glslang::TSourceLoc loc;\n        union {\n            glslang::TString *string;\n            int i;\n            unsigned int u;\n            long long i64;\n            unsigned long long u64;\n            bool b;\n            double d;\n        };\n        glslang::TSymbol* symbol;\n    } lex;\n    struct {\n        glslang::TSourceLoc loc;\n        glslang::TOperator op;\n        union {\n            TIntermNode* intermNode;\n            glslang::TIntermNodePair nodePair;\n            glslang::TIntermTyped* intermTypedNode;\n            glslang::TAttributes* attributes;\n            glslang::TSpirvRequirement* spirvReq;\n            glslang::TSpirvInstruction* spirvInst;\n            glslang::TSpirvTypeParameters* spirvTypeParams;\n        };\n        union {\n            glslang::TPublicType type;\n            glslang::TFunction* function;\n            glslang::TParameter param;\n            glslang::TTypeLoc typeLine;\n            glslang::TTypeList* typeList;\n            glslang::TArraySizes* arraySizes;\n            glslang::TIdentifierList* identifierList;\n        };\n        glslang::TTypeParameters* typeParameters;\n    } interm;\n\n#line 584 \"MachineIndependent/glslang_tab.cpp.h\"\n\n};\ntypedef union YYSTYPE YYSTYPE;\n# define YYSTYPE_IS_TRIVIAL 1\n# define YYSTYPE_IS_DECLARED 1\n#endif\n\n\n\n\nint yyparse (glslang::TParseContext* pParseContext);\n\n\n#endif /* !YY_YY_MACHINEINDEPENDENT_GLSLANG_TAB_CPP_H_INCLUDED  */\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/intermOut.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2012-2016 LunarG, Inc.\n// Copyright (C) 2017, 2022-2024 Arm Limited.\n// Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#include \"localintermediate.h\"\n#include \"../Include/InfoSink.h\"\n\n#ifdef _MSC_VER\n#include <cfloat>\n#else\n#include <cmath>\n#endif\n#include <cstdint>\n\n\nnamespace glslang {\n\n//\n// Two purposes:\n// 1.  Show an example of how to iterate tree.  Functions can\n//     also directly call Traverse() on children themselves to\n//     have finer grained control over the process than shown here.\n//     See the last function for how to get started.\n// 2.  Print out a text based description of the tree.\n//\n\n//\n// Use this class to carry along data from node to node in\n// the traversal\n//\nclass TOutputTraverser : public TIntermTraverser {\npublic:\n    TOutputTraverser(TInfoSink& i) : infoSink(i), extraOutput(NoExtraOutput) { }\n\n    enum EExtraOutput {\n        NoExtraOutput,\n        BinaryDoubleOutput\n    };\n    void setDoubleOutput(EExtraOutput extra) { extraOutput = extra; }\n\n    virtual bool visitBinary(TVisit, TIntermBinary* node);\n    virtual bool visitUnary(TVisit, TIntermUnary* node);\n    virtual bool visitAggregate(TVisit, TIntermAggregate* node);\n    virtual bool visitSelection(TVisit, TIntermSelection* node);\n    virtual void visitConstantUnion(TIntermConstantUnion* node);\n    virtual void visitSymbol(TIntermSymbol* node);\n    virtual bool visitLoop(TVisit, TIntermLoop* node);\n    virtual bool visitBranch(TVisit, TIntermBranch* node);\n    virtual bool visitSwitch(TVisit, TIntermSwitch* node);\n\n    TInfoSink& infoSink;\nprotected:\n    TOutputTraverser(TOutputTraverser&);\n    TOutputTraverser& operator=(TOutputTraverser&);\n\n    EExtraOutput extraOutput;\n};\n\n//\n// Helper functions for printing, not part of traversing.\n//\n\nstatic void OutputTreeText(TInfoSink& infoSink, const TIntermNode* node, const int depth)\n{\n    int i;\n\n    infoSink.debug << node->getLoc().string << \":\";\n    if (node->getLoc().line)\n        infoSink.debug << node->getLoc().line;\n    else\n        infoSink.debug << \"? \";\n\n    for (i = 0; i < depth; ++i)\n        infoSink.debug << \"  \";\n}\n\n//\n// The rest of the file are the traversal functions.  The last one\n// is the one that starts the traversal.\n//\n// Return true from interior nodes to have the external traversal\n// continue on to children.  If you process children yourself,\n// return false.\n//\n\nbool TOutputTraverser::visitBinary(TVisit /* visit */, TIntermBinary* node)\n{\n    TInfoSink& out = infoSink;\n\n    OutputTreeText(out, node, depth);\n\n    switch (node->getOp()) {\n    case EOpAssign:                   out.debug << \"move second child to first child\";           break;\n    case EOpAddAssign:                out.debug << \"add second child into first child\";          break;\n    case EOpSubAssign:                out.debug << \"subtract second child into first child\";     break;\n    case EOpMulAssign:                out.debug << \"multiply second child into first child\";     break;\n    case EOpVectorTimesMatrixAssign:  out.debug << \"matrix mult second child into first child\";  break;\n    case EOpVectorTimesScalarAssign:  out.debug << \"vector scale second child into first child\"; break;\n    case EOpMatrixTimesScalarAssign:  out.debug << \"matrix scale second child into first child\"; break;\n    case EOpMatrixTimesMatrixAssign:  out.debug << \"matrix mult second child into first child\";  break;\n    case EOpDivAssign:                out.debug << \"divide second child into first child\";       break;\n    case EOpModAssign:                out.debug << \"mod second child into first child\";          break;\n    case EOpAndAssign:                out.debug << \"and second child into first child\";          break;\n    case EOpInclusiveOrAssign:        out.debug << \"or second child into first child\";           break;\n    case EOpExclusiveOrAssign:        out.debug << \"exclusive or second child into first child\"; break;\n    case EOpLeftShiftAssign:          out.debug << \"left shift second child into first child\";   break;\n    case EOpRightShiftAssign:         out.debug << \"right shift second child into first child\";  break;\n\n    case EOpIndexDirect:   out.debug << \"direct index\";   break;\n    case EOpIndexIndirect: out.debug << \"indirect index\"; break;\n    case EOpIndexDirectStruct:\n        {\n            bool reference = node->getLeft()->getType().isReference();\n            const TTypeList *members = reference ? node->getLeft()->getType().getReferentType()->getStruct() : node->getLeft()->getType().getStruct();\n            out.debug << (*members)[node->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst()].type->getFieldName();\n            out.debug << \": direct index for structure\";      break;\n        }\n    case EOpVectorSwizzle: out.debug << \"vector swizzle\"; break;\n    case EOpMatrixSwizzle: out.debug << \"matrix swizzle\"; break;\n\n    case EOpAdd:    out.debug << \"add\";                     break;\n    case EOpSub:    out.debug << \"subtract\";                break;\n    case EOpMul:    out.debug << \"component-wise multiply\"; break;\n    case EOpDiv:    out.debug << \"divide\";                  break;\n    case EOpMod:    out.debug << \"mod\";                     break;\n    case EOpRightShift:  out.debug << \"right-shift\";  break;\n    case EOpLeftShift:   out.debug << \"left-shift\";   break;\n    case EOpAnd:         out.debug << \"bitwise and\";  break;\n    case EOpInclusiveOr: out.debug << \"inclusive-or\"; break;\n    case EOpExclusiveOr: out.debug << \"exclusive-or\"; break;\n    case EOpEqual:            out.debug << \"Compare Equal\";                 break;\n    case EOpNotEqual:         out.debug << \"Compare Not Equal\";             break;\n    case EOpLessThan:         out.debug << \"Compare Less Than\";             break;\n    case EOpGreaterThan:      out.debug << \"Compare Greater Than\";          break;\n    case EOpLessThanEqual:    out.debug << \"Compare Less Than or Equal\";    break;\n    case EOpGreaterThanEqual: out.debug << \"Compare Greater Than or Equal\"; break;\n    case EOpVectorEqual:      out.debug << \"Equal\";                         break;\n    case EOpVectorNotEqual:   out.debug << \"NotEqual\";                      break;\n\n    case EOpVectorTimesScalar: out.debug << \"vector-scale\";          break;\n    case EOpVectorTimesMatrix: out.debug << \"vector-times-matrix\";   break;\n    case EOpMatrixTimesVector: out.debug << \"matrix-times-vector\";   break;\n    case EOpMatrixTimesScalar: out.debug << \"matrix-scale\";          break;\n    case EOpMatrixTimesMatrix: out.debug << \"matrix-multiply\";       break;\n\n    case EOpLogicalOr:  out.debug << \"logical-or\";   break;\n    case EOpLogicalXor: out.debug << \"logical-xor\"; break;\n    case EOpLogicalAnd: out.debug << \"logical-and\"; break;\n\n    case EOpAbsDifference:          out.debug << \"absoluteDifference\";    break;\n    case EOpAddSaturate:            out.debug << \"addSaturate\";           break;\n    case EOpSubSaturate:            out.debug << \"subtractSaturate\";      break;\n    case EOpAverage:                out.debug << \"average\";               break;\n    case EOpAverageRounded:         out.debug << \"averageRounded\";        break;\n    case EOpMul32x16:               out.debug << \"multiply32x16\";         break;\n\n    default: out.debug << \"<unknown op>\";\n    }\n\n    out.debug << \" (\" << node->getCompleteString() << \")\";\n\n    out.debug << \"\\n\";\n\n    return true;\n}\n\nbool TOutputTraverser::visitUnary(TVisit /* visit */, TIntermUnary* node)\n{\n    TInfoSink& out = infoSink;\n\n    OutputTreeText(out, node, depth);\n\n    if (IsOpNumericConv(node->getAsOperator()->getOp())) {\n        out.debug << \"Convert \" << TType::getBasicString(node->getOperand()->getType().getBasicType()) << \" to \" << TType::getBasicString(node->getType().getBasicType());\n        out.debug << \" (\" << node->getCompleteString() << \")\";\n        out.debug << \"\\n\";\n        return true;\n    }\n\n    switch (node->getOp()) {\n    case EOpNegative:       out.debug << \"Negate value\";         break;\n    case EOpVectorLogicalNot:\n    case EOpLogicalNot:     out.debug << \"Negate conditional\";   break;\n    case EOpBitwiseNot:     out.debug << \"Bitwise not\";          break;\n\n    case EOpPostIncrement:  out.debug << \"Post-Increment\";       break;\n    case EOpPostDecrement:  out.debug << \"Post-Decrement\";       break;\n    case EOpPreIncrement:   out.debug << \"Pre-Increment\";        break;\n    case EOpPreDecrement:   out.debug << \"Pre-Decrement\";        break;\n    case EOpCopyObject:     out.debug << \"copy object\";          break;\n\n    case EOpConvUint64ToPtr:  out.debug << \"Convert uint64_t to pointer\";   break;\n    case EOpConvPtrToUint64:  out.debug << \"Convert pointer to uint64_t\";   break;\n\n    case EOpConvUint64ToAccStruct: out.debug << \"Convert uint64_t to acceleration structure\"; break;\n    case EOpConvUvec2ToAccStruct:  out.debug << \"Convert uvec2 to acceleration strucuture \"; break;\n\n    case EOpRadians:        out.debug << \"radians\";              break;\n    case EOpDegrees:        out.debug << \"degrees\";              break;\n    case EOpSin:            out.debug << \"sine\";                 break;\n    case EOpCos:            out.debug << \"cosine\";               break;\n    case EOpTan:            out.debug << \"tangent\";              break;\n    case EOpAsin:           out.debug << \"arc sine\";             break;\n    case EOpAcos:           out.debug << \"arc cosine\";           break;\n    case EOpAtan:           out.debug << \"arc tangent\";          break;\n    case EOpSinh:           out.debug << \"hyp. sine\";            break;\n    case EOpCosh:           out.debug << \"hyp. cosine\";          break;\n    case EOpTanh:           out.debug << \"hyp. tangent\";         break;\n    case EOpAsinh:          out.debug << \"arc hyp. sine\";        break;\n    case EOpAcosh:          out.debug << \"arc hyp. cosine\";      break;\n    case EOpAtanh:          out.debug << \"arc hyp. tangent\";     break;\n\n    case EOpExp:            out.debug << \"exp\";                  break;\n    case EOpLog:            out.debug << \"log\";                  break;\n    case EOpExp2:           out.debug << \"exp2\";                 break;\n    case EOpLog2:           out.debug << \"log2\";                 break;\n    case EOpSqrt:           out.debug << \"sqrt\";                 break;\n    case EOpInverseSqrt:    out.debug << \"inverse sqrt\";         break;\n\n    case EOpAbs:            out.debug << \"Absolute value\";       break;\n    case EOpSign:           out.debug << \"Sign\";                 break;\n    case EOpFloor:          out.debug << \"Floor\";                break;\n    case EOpTrunc:          out.debug << \"trunc\";                break;\n    case EOpRound:          out.debug << \"round\";                break;\n    case EOpRoundEven:      out.debug << \"roundEven\";            break;\n    case EOpCeil:           out.debug << \"Ceiling\";              break;\n    case EOpFract:          out.debug << \"Fraction\";             break;\n\n    case EOpIsNan:          out.debug << \"isnan\";                break;\n    case EOpIsInf:          out.debug << \"isinf\";                break;\n\n    case EOpFloatBitsToInt: out.debug << \"floatBitsToInt\";       break;\n    case EOpFloatBitsToUint:out.debug << \"floatBitsToUint\";      break;\n    case EOpIntBitsToFloat: out.debug << \"intBitsToFloat\";       break;\n    case EOpUintBitsToFloat:out.debug << \"uintBitsToFloat\";      break;\n    case EOpDoubleBitsToInt64:  out.debug << \"doubleBitsToInt64\";  break;\n    case EOpDoubleBitsToUint64: out.debug << \"doubleBitsToUint64\"; break;\n    case EOpInt64BitsToDouble:  out.debug << \"int64BitsToDouble\";  break;\n    case EOpUint64BitsToDouble: out.debug << \"uint64BitsToDouble\"; break;\n    case EOpFloat16BitsToInt16:  out.debug << \"float16BitsToInt16\";  break;\n    case EOpFloat16BitsToUint16: out.debug << \"float16BitsToUint16\"; break;\n    case EOpInt16BitsToFloat16:  out.debug << \"int16BitsToFloat16\";  break;\n    case EOpUint16BitsToFloat16: out.debug << \"uint16BitsToFloat16\"; break;\n\n    case EOpPackSnorm2x16:  out.debug << \"packSnorm2x16\";        break;\n    case EOpUnpackSnorm2x16:out.debug << \"unpackSnorm2x16\";      break;\n    case EOpPackUnorm2x16:  out.debug << \"packUnorm2x16\";        break;\n    case EOpUnpackUnorm2x16:out.debug << \"unpackUnorm2x16\";      break;\n    case EOpPackHalf2x16:   out.debug << \"packHalf2x16\";         break;\n    case EOpUnpackHalf2x16: out.debug << \"unpackHalf2x16\";       break;\n    case EOpPack16:           out.debug << \"pack16\";                 break;\n    case EOpPack32:           out.debug << \"pack32\";                 break;\n    case EOpPack64:           out.debug << \"pack64\";                 break;\n    case EOpUnpack32:         out.debug << \"unpack32\";               break;\n    case EOpUnpack16:         out.debug << \"unpack16\";               break;\n    case EOpUnpack8:          out.debug << \"unpack8\";               break;\n\n    case EOpPackSnorm4x8:     out.debug << \"PackSnorm4x8\";       break;\n    case EOpUnpackSnorm4x8:   out.debug << \"UnpackSnorm4x8\";     break;\n    case EOpPackUnorm4x8:     out.debug << \"PackUnorm4x8\";       break;\n    case EOpUnpackUnorm4x8:   out.debug << \"UnpackUnorm4x8\";     break;\n    case EOpPackDouble2x32:   out.debug << \"PackDouble2x32\";     break;\n    case EOpUnpackDouble2x32: out.debug << \"UnpackDouble2x32\";   break;\n\n    case EOpPackInt2x32:      out.debug << \"packInt2x32\";        break;\n    case EOpUnpackInt2x32:    out.debug << \"unpackInt2x32\";      break;\n    case EOpPackUint2x32:     out.debug << \"packUint2x32\";       break;\n    case EOpUnpackUint2x32:   out.debug << \"unpackUint2x32\";     break;\n\n    case EOpPackInt2x16:      out.debug << \"packInt2x16\";        break;\n    case EOpUnpackInt2x16:    out.debug << \"unpackInt2x16\";      break;\n    case EOpPackUint2x16:     out.debug << \"packUint2x16\";       break;\n    case EOpUnpackUint2x16:   out.debug << \"unpackUint2x16\";     break;\n\n    case EOpPackInt4x16:      out.debug << \"packInt4x16\";        break;\n    case EOpUnpackInt4x16:    out.debug << \"unpackInt4x16\";      break;\n    case EOpPackUint4x16:     out.debug << \"packUint4x16\";       break;\n    case EOpUnpackUint4x16:   out.debug << \"unpackUint4x16\";     break;\n    case EOpPackFloat2x16:    out.debug << \"packFloat2x16\";      break;\n    case EOpUnpackFloat2x16:  out.debug << \"unpackFloat2x16\";    break;\n\n    case EOpLength:         out.debug << \"length\";               break;\n    case EOpNormalize:      out.debug << \"normalize\";            break;\n    case EOpDPdx:           out.debug << \"dPdx\";                 break;\n    case EOpDPdy:           out.debug << \"dPdy\";                 break;\n    case EOpFwidth:         out.debug << \"fwidth\";               break;\n    case EOpDPdxFine:       out.debug << \"dPdxFine\";             break;\n    case EOpDPdyFine:       out.debug << \"dPdyFine\";             break;\n    case EOpFwidthFine:     out.debug << \"fwidthFine\";           break;\n    case EOpDPdxCoarse:     out.debug << \"dPdxCoarse\";           break;\n    case EOpDPdyCoarse:     out.debug << \"dPdyCoarse\";           break;\n    case EOpFwidthCoarse:   out.debug << \"fwidthCoarse\";         break;\n\n    case EOpInterpolateAtCentroid: out.debug << \"interpolateAtCentroid\";  break;\n\n    case EOpDeterminant:    out.debug << \"determinant\";          break;\n    case EOpMatrixInverse:  out.debug << \"inverse\";              break;\n    case EOpTranspose:      out.debug << \"transpose\";            break;\n\n    case EOpAny:            out.debug << \"any\";                  break;\n    case EOpAll:            out.debug << \"all\";                  break;\n\n    case EOpArrayLength:    out.debug << \"array length\";         break;\n\n    case EOpEmitStreamVertex:   out.debug << \"EmitStreamVertex\";   break;\n    case EOpEndStreamPrimitive: out.debug << \"EndStreamPrimitive\"; break;\n\n    case EOpAtomicCounterIncrement: out.debug << \"AtomicCounterIncrement\";break;\n    case EOpAtomicCounterDecrement: out.debug << \"AtomicCounterDecrement\";break;\n    case EOpAtomicCounter:          out.debug << \"AtomicCounter\";         break;\n\n    case EOpTextureQuerySize:       out.debug << \"textureSize\";           break;\n    case EOpTextureQueryLod:        out.debug << \"textureQueryLod\";       break;\n    case EOpTextureQueryLevels:     out.debug << \"textureQueryLevels\";    break;\n    case EOpTextureQuerySamples:    out.debug << \"textureSamples\";        break;\n    case EOpImageQuerySize:         out.debug << \"imageQuerySize\";        break;\n    case EOpImageQuerySamples:      out.debug << \"imageQuerySamples\";     break;\n    case EOpImageLoad:              out.debug << \"imageLoad\";             break;\n\n    case EOpBitFieldReverse:        out.debug << \"bitFieldReverse\";       break;\n    case EOpBitCount:               out.debug << \"bitCount\";              break;\n    case EOpFindLSB:                out.debug << \"findLSB\";               break;\n    case EOpFindMSB:                out.debug << \"findMSB\";               break;\n\n    case EOpCountLeadingZeros:      out.debug << \"countLeadingZeros\";     break;\n    case EOpCountTrailingZeros:     out.debug << \"countTrailingZeros\";    break;\n\n    case EOpNoise:                  out.debug << \"noise\";                 break;\n\n    case EOpBallot:                 out.debug << \"ballot\";                break;\n    case EOpReadFirstInvocation:    out.debug << \"readFirstInvocation\";   break;\n\n    case EOpAnyInvocation:          out.debug << \"anyInvocation\";         break;\n    case EOpAllInvocations:         out.debug << \"allInvocations\";        break;\n    case EOpAllInvocationsEqual:    out.debug << \"allInvocationsEqual\";   break;\n\n    case EOpSubgroupElect:                   out.debug << \"subgroupElect\";                   break;\n    case EOpSubgroupAll:                     out.debug << \"subgroupAll\";                     break;\n    case EOpSubgroupAny:                     out.debug << \"subgroupAny\";                     break;\n    case EOpSubgroupAllEqual:                out.debug << \"subgroupAllEqual\";                break;\n    case EOpSubgroupBroadcast:               out.debug << \"subgroupBroadcast\";               break;\n    case EOpSubgroupBroadcastFirst:          out.debug << \"subgroupBroadcastFirst\";          break;\n    case EOpSubgroupBallot:                  out.debug << \"subgroupBallot\";                  break;\n    case EOpSubgroupInverseBallot:           out.debug << \"subgroupInverseBallot\";           break;\n    case EOpSubgroupBallotBitExtract:        out.debug << \"subgroupBallotBitExtract\";        break;\n    case EOpSubgroupBallotBitCount:          out.debug << \"subgroupBallotBitCount\";          break;\n    case EOpSubgroupBallotInclusiveBitCount: out.debug << \"subgroupBallotInclusiveBitCount\"; break;\n    case EOpSubgroupBallotExclusiveBitCount: out.debug << \"subgroupBallotExclusiveBitCount\"; break;\n    case EOpSubgroupBallotFindLSB:           out.debug << \"subgroupBallotFindLSB\";           break;\n    case EOpSubgroupBallotFindMSB:           out.debug << \"subgroupBallotFindMSB\";           break;\n    case EOpSubgroupShuffle:                 out.debug << \"subgroupShuffle\";                 break;\n    case EOpSubgroupShuffleXor:              out.debug << \"subgroupShuffleXor\";              break;\n    case EOpSubgroupShuffleUp:               out.debug << \"subgroupShuffleUp\";               break;\n    case EOpSubgroupShuffleDown:             out.debug << \"subgroupShuffleDown\";             break;\n    case EOpSubgroupRotate:                  out.debug << \"subgroupRotate\";                  break;\n    case EOpSubgroupClusteredRotate:         out.debug << \"subgroupClusteredRotate\";         break;\n    case EOpSubgroupAdd:                     out.debug << \"subgroupAdd\";                     break;\n    case EOpSubgroupMul:                     out.debug << \"subgroupMul\";                     break;\n    case EOpSubgroupMin:                     out.debug << \"subgroupMin\";                     break;\n    case EOpSubgroupMax:                     out.debug << \"subgroupMax\";                     break;\n    case EOpSubgroupAnd:                     out.debug << \"subgroupAnd\";                     break;\n    case EOpSubgroupOr:                      out.debug << \"subgroupOr\";                      break;\n    case EOpSubgroupXor:                     out.debug << \"subgroupXor\";                     break;\n    case EOpSubgroupInclusiveAdd:            out.debug << \"subgroupInclusiveAdd\";            break;\n    case EOpSubgroupInclusiveMul:            out.debug << \"subgroupInclusiveMul\";            break;\n    case EOpSubgroupInclusiveMin:            out.debug << \"subgroupInclusiveMin\";            break;\n    case EOpSubgroupInclusiveMax:            out.debug << \"subgroupInclusiveMax\";            break;\n    case EOpSubgroupInclusiveAnd:            out.debug << \"subgroupInclusiveAnd\";            break;\n    case EOpSubgroupInclusiveOr:             out.debug << \"subgroupInclusiveOr\";             break;\n    case EOpSubgroupInclusiveXor:            out.debug << \"subgroupInclusiveXor\";            break;\n    case EOpSubgroupExclusiveAdd:            out.debug << \"subgroupExclusiveAdd\";            break;\n    case EOpSubgroupExclusiveMul:            out.debug << \"subgroupExclusiveMul\";            break;\n    case EOpSubgroupExclusiveMin:            out.debug << \"subgroupExclusiveMin\";            break;\n    case EOpSubgroupExclusiveMax:            out.debug << \"subgroupExclusiveMax\";            break;\n    case EOpSubgroupExclusiveAnd:            out.debug << \"subgroupExclusiveAnd\";            break;\n    case EOpSubgroupExclusiveOr:             out.debug << \"subgroupExclusiveOr\";             break;\n    case EOpSubgroupExclusiveXor:            out.debug << \"subgroupExclusiveXor\";            break;\n    case EOpSubgroupClusteredAdd:            out.debug << \"subgroupClusteredAdd\";            break;\n    case EOpSubgroupClusteredMul:            out.debug << \"subgroupClusteredMul\";            break;\n    case EOpSubgroupClusteredMin:            out.debug << \"subgroupClusteredMin\";            break;\n    case EOpSubgroupClusteredMax:            out.debug << \"subgroupClusteredMax\";            break;\n    case EOpSubgroupClusteredAnd:            out.debug << \"subgroupClusteredAnd\";            break;\n    case EOpSubgroupClusteredOr:             out.debug << \"subgroupClusteredOr\";             break;\n    case EOpSubgroupClusteredXor:            out.debug << \"subgroupClusteredXor\";            break;\n    case EOpSubgroupQuadBroadcast:           out.debug << \"subgroupQuadBroadcast\";           break;\n    case EOpSubgroupQuadSwapHorizontal:      out.debug << \"subgroupQuadSwapHorizontal\";      break;\n    case EOpSubgroupQuadSwapVertical:        out.debug << \"subgroupQuadSwapVertical\";        break;\n    case EOpSubgroupQuadSwapDiagonal:        out.debug << \"subgroupQuadSwapDiagonal\";        break;\n    case EOpSubgroupQuadAll:                 out.debug << \"subgroupQuadAll\";                 break;\n    case EOpSubgroupQuadAny:                 out.debug << \"subgroupQuadAny\";                 break;\n\n    case EOpSubgroupPartition:                          out.debug << \"subgroupPartitionNV\";                          break;\n    case EOpSubgroupPartitionedAdd:                     out.debug << \"subgroupPartitionedAddNV\";                     break;\n    case EOpSubgroupPartitionedMul:                     out.debug << \"subgroupPartitionedMulNV\";                     break;\n    case EOpSubgroupPartitionedMin:                     out.debug << \"subgroupPartitionedMinNV\";                     break;\n    case EOpSubgroupPartitionedMax:                     out.debug << \"subgroupPartitionedMaxNV\";                     break;\n    case EOpSubgroupPartitionedAnd:                     out.debug << \"subgroupPartitionedAndNV\";                     break;\n    case EOpSubgroupPartitionedOr:                      out.debug << \"subgroupPartitionedOrNV\";                      break;\n    case EOpSubgroupPartitionedXor:                     out.debug << \"subgroupPartitionedXorNV\";                     break;\n    case EOpSubgroupPartitionedInclusiveAdd:            out.debug << \"subgroupPartitionedInclusiveAddNV\";            break;\n    case EOpSubgroupPartitionedInclusiveMul:            out.debug << \"subgroupPartitionedInclusiveMulNV\";            break;\n    case EOpSubgroupPartitionedInclusiveMin:            out.debug << \"subgroupPartitionedInclusiveMinNV\";            break;\n    case EOpSubgroupPartitionedInclusiveMax:            out.debug << \"subgroupPartitionedInclusiveMaxNV\";            break;\n    case EOpSubgroupPartitionedInclusiveAnd:            out.debug << \"subgroupPartitionedInclusiveAndNV\";            break;\n    case EOpSubgroupPartitionedInclusiveOr:             out.debug << \"subgroupPartitionedInclusiveOrNV\";             break;\n    case EOpSubgroupPartitionedInclusiveXor:            out.debug << \"subgroupPartitionedInclusiveXorNV\";            break;\n    case EOpSubgroupPartitionedExclusiveAdd:            out.debug << \"subgroupPartitionedExclusiveAddNV\";            break;\n    case EOpSubgroupPartitionedExclusiveMul:            out.debug << \"subgroupPartitionedExclusiveMulNV\";            break;\n    case EOpSubgroupPartitionedExclusiveMin:            out.debug << \"subgroupPartitionedExclusiveMinNV\";            break;\n    case EOpSubgroupPartitionedExclusiveMax:            out.debug << \"subgroupPartitionedExclusiveMaxNV\";            break;\n    case EOpSubgroupPartitionedExclusiveAnd:            out.debug << \"subgroupPartitionedExclusiveAndNV\";            break;\n    case EOpSubgroupPartitionedExclusiveOr:             out.debug << \"subgroupPartitionedExclusiveOrNV\";             break;\n    case EOpSubgroupPartitionedExclusiveXor:            out.debug << \"subgroupPartitionedExclusiveXorNV\";            break;\n\n    case EOpClip:                   out.debug << \"clip\";                  break;\n    case EOpIsFinite:               out.debug << \"isfinite\";              break;\n    case EOpLog10:                  out.debug << \"log10\";                 break;\n    case EOpRcp:                    out.debug << \"rcp\";                   break;\n    case EOpSaturate:               out.debug << \"saturate\";              break;\n\n    case EOpSparseTexelsResident:   out.debug << \"sparseTexelsResident\";  break;\n\n    case EOpMinInvocations:             out.debug << \"minInvocations\";              break;\n    case EOpMaxInvocations:             out.debug << \"maxInvocations\";              break;\n    case EOpAddInvocations:             out.debug << \"addInvocations\";              break;\n    case EOpMinInvocationsNonUniform:   out.debug << \"minInvocationsNonUniform\";    break;\n    case EOpMaxInvocationsNonUniform:   out.debug << \"maxInvocationsNonUniform\";    break;\n    case EOpAddInvocationsNonUniform:   out.debug << \"addInvocationsNonUniform\";    break;\n\n    case EOpMinInvocationsInclusiveScan:            out.debug << \"minInvocationsInclusiveScan\";             break;\n    case EOpMaxInvocationsInclusiveScan:            out.debug << \"maxInvocationsInclusiveScan\";             break;\n    case EOpAddInvocationsInclusiveScan:            out.debug << \"addInvocationsInclusiveScan\";             break;\n    case EOpMinInvocationsInclusiveScanNonUniform:  out.debug << \"minInvocationsInclusiveScanNonUniform\";   break;\n    case EOpMaxInvocationsInclusiveScanNonUniform:  out.debug << \"maxInvocationsInclusiveScanNonUniform\";   break;\n    case EOpAddInvocationsInclusiveScanNonUniform:  out.debug << \"addInvocationsInclusiveScanNonUniform\";   break;\n\n    case EOpMinInvocationsExclusiveScan:            out.debug << \"minInvocationsExclusiveScan\";             break;\n    case EOpMaxInvocationsExclusiveScan:            out.debug << \"maxInvocationsExclusiveScan\";             break;\n    case EOpAddInvocationsExclusiveScan:            out.debug << \"addInvocationsExclusiveScan\";             break;\n    case EOpMinInvocationsExclusiveScanNonUniform:  out.debug << \"minInvocationsExclusiveScanNonUniform\";   break;\n    case EOpMaxInvocationsExclusiveScanNonUniform:  out.debug << \"maxInvocationsExclusiveScanNonUniform\";   break;\n    case EOpAddInvocationsExclusiveScanNonUniform:  out.debug << \"addInvocationsExclusiveScanNonUniform\";   break;\n\n    case EOpMbcnt:                  out.debug << \"mbcnt\";                       break;\n\n    case EOpFragmentMaskFetch:      out.debug << \"fragmentMaskFetchAMD\";        break;\n    case EOpFragmentFetch:          out.debug << \"fragmentFetchAMD\";            break;\n\n    case EOpCubeFaceIndex:          out.debug << \"cubeFaceIndex\";               break;\n    case EOpCubeFaceCoord:          out.debug << \"cubeFaceCoord\";               break;\n\n    case EOpSubpassLoad:   out.debug << \"subpassLoad\";   break;\n    case EOpSubpassLoadMS: out.debug << \"subpassLoadMS\"; break;\n\n    case EOpColorAttachmentReadEXT:   out.debug << \"colorAttachmentReadEXT\";   break;\n\n    case EOpConstructReference: out.debug << \"Construct reference type\"; break;\n\n    case EOpDeclare: out.debug << \"Declare\"; break;\n\n    case EOpSpirvInst: out.debug << \"spirv_instruction\"; break;\n\n    case EOpCreateTensorLayoutNV:           out.debug << \"createTensorLayoutNV\"; break;\n    case EOpTensorLayoutSetBlockSizeNV:     out.debug << \"setTensorLayoutBlockSizeNV\"; break;\n    case EOpTensorLayoutSetDimensionNV:     out.debug << \"setTensorLayoutDimensionNV\"; break;\n    case EOpTensorLayoutSetStrideNV:        out.debug << \"setTensorLayoutStrideNV\"; break;\n    case EOpTensorLayoutSliceNV:            out.debug << \"sliceTensorLayoutNV\"; break;\n    case EOpTensorLayoutSetClampValueNV:    out.debug << \"setTensorLayoutClampValueNV\"; break;\n    case EOpCreateTensorViewNV:             out.debug << \"createTensorViewNV\"; break;\n    case EOpTensorViewSetDimensionNV:       out.debug << \"setTensorViewDimensionsNV\"; break;\n    case EOpTensorViewSetStrideNV:          out.debug << \"setTensorViewStrideNV\"; break;\n    case EOpTensorViewSetClipNV:            out.debug << \"setTensorViewClipNV\"; break;\n\n    default: out.debug.message(EPrefixError, \"Bad unary op\");\n    }\n\n    out.debug << \" (\" << node->getCompleteString() << \")\";\n\n    out.debug << \"\\n\";\n\n    return true;\n}\n\nbool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node)\n{\n    TInfoSink& out = infoSink;\n\n    if (node->getOp() == EOpNull) {\n        out.debug.message(EPrefixError, \"node is still EOpNull!\");\n        return true;\n    }\n\n    OutputTreeText(out, node, depth);\n\n    switch (node->getOp()) {\n    case EOpSequence:      out.debug << \"Sequence\\n\";       return true;\n    case EOpScope:         out.debug << \"Scope\\n\";       return true;\n    case EOpLinkerObjects: out.debug << \"Linker Objects\\n\"; return true;\n    case EOpComma:         out.debug << \"Comma\";            break;\n    case EOpFunction:      out.debug << \"Function Definition: \" << node->getName(); break;\n    case EOpFunctionCall:  out.debug << \"Function Call: \"       << node->getName(); break;\n    case EOpParameters:    out.debug << \"Function Parameters: \";                    break;\n\n    case EOpConstructFloat: out.debug << \"Construct float\"; break;\n    case EOpConstructDouble:out.debug << \"Construct double\"; break;\n\n    case EOpConstructVec2:  out.debug << \"Construct vec2\";  break;\n    case EOpConstructVec3:  out.debug << \"Construct vec3\";  break;\n    case EOpConstructVec4:  out.debug << \"Construct vec4\";  break;\n    case EOpConstructDVec2: out.debug << \"Construct dvec2\";  break;\n    case EOpConstructDVec3: out.debug << \"Construct dvec3\";  break;\n    case EOpConstructDVec4: out.debug << \"Construct dvec4\";  break;\n    case EOpConstructBool:  out.debug << \"Construct bool\";  break;\n    case EOpConstructBVec2: out.debug << \"Construct bvec2\"; break;\n    case EOpConstructBVec3: out.debug << \"Construct bvec3\"; break;\n    case EOpConstructBVec4: out.debug << \"Construct bvec4\"; break;\n    case EOpConstructInt8:   out.debug << \"Construct int8_t\";   break;\n    case EOpConstructI8Vec2: out.debug << \"Construct i8vec2\"; break;\n    case EOpConstructI8Vec3: out.debug << \"Construct i8vec3\"; break;\n    case EOpConstructI8Vec4: out.debug << \"Construct i8vec4\"; break;\n    case EOpConstructInt:   out.debug << \"Construct int\";   break;\n    case EOpConstructIVec2: out.debug << \"Construct ivec2\"; break;\n    case EOpConstructIVec3: out.debug << \"Construct ivec3\"; break;\n    case EOpConstructIVec4: out.debug << \"Construct ivec4\"; break;\n    case EOpConstructUint8:    out.debug << \"Construct uint8_t\";    break;\n    case EOpConstructU8Vec2:   out.debug << \"Construct u8vec2\";   break;\n    case EOpConstructU8Vec3:   out.debug << \"Construct u8vec3\";   break;\n    case EOpConstructU8Vec4:   out.debug << \"Construct u8vec4\";   break;\n    case EOpConstructUint:    out.debug << \"Construct uint\";    break;\n    case EOpConstructUVec2:   out.debug << \"Construct uvec2\";   break;\n    case EOpConstructUVec3:   out.debug << \"Construct uvec3\";   break;\n    case EOpConstructUVec4:   out.debug << \"Construct uvec4\";   break;\n    case EOpConstructInt64:   out.debug << \"Construct int64\"; break;\n    case EOpConstructI64Vec2: out.debug << \"Construct i64vec2\"; break;\n    case EOpConstructI64Vec3: out.debug << \"Construct i64vec3\"; break;\n    case EOpConstructI64Vec4: out.debug << \"Construct i64vec4\"; break;\n    case EOpConstructUint64:  out.debug << \"Construct uint64\"; break;\n    case EOpConstructU64Vec2: out.debug << \"Construct u64vec2\"; break;\n    case EOpConstructU64Vec3: out.debug << \"Construct u64vec3\"; break;\n    case EOpConstructU64Vec4: out.debug << \"Construct u64vec4\"; break;\n    case EOpConstructInt16:   out.debug << \"Construct int16_t\"; break;\n    case EOpConstructI16Vec2: out.debug << \"Construct i16vec2\"; break;\n    case EOpConstructI16Vec3: out.debug << \"Construct i16vec3\"; break;\n    case EOpConstructI16Vec4: out.debug << \"Construct i16vec4\"; break;\n    case EOpConstructUint16:  out.debug << \"Construct uint16_t\"; break;\n    case EOpConstructU16Vec2: out.debug << \"Construct u16vec2\"; break;\n    case EOpConstructU16Vec3: out.debug << \"Construct u16vec3\"; break;\n    case EOpConstructU16Vec4: out.debug << \"Construct u16vec4\"; break;\n    case EOpConstructMat2x2:  out.debug << \"Construct mat2\";    break;\n    case EOpConstructMat2x3:  out.debug << \"Construct mat2x3\";  break;\n    case EOpConstructMat2x4:  out.debug << \"Construct mat2x4\";  break;\n    case EOpConstructMat3x2:  out.debug << \"Construct mat3x2\";  break;\n    case EOpConstructMat3x3:  out.debug << \"Construct mat3\";    break;\n    case EOpConstructMat3x4:  out.debug << \"Construct mat3x4\";  break;\n    case EOpConstructMat4x2:  out.debug << \"Construct mat4x2\";  break;\n    case EOpConstructMat4x3:  out.debug << \"Construct mat4x3\";  break;\n    case EOpConstructMat4x4:  out.debug << \"Construct mat4\";    break;\n    case EOpConstructDMat2x2: out.debug << \"Construct dmat2\";   break;\n    case EOpConstructDMat2x3: out.debug << \"Construct dmat2x3\"; break;\n    case EOpConstructDMat2x4: out.debug << \"Construct dmat2x4\"; break;\n    case EOpConstructDMat3x2: out.debug << \"Construct dmat3x2\"; break;\n    case EOpConstructDMat3x3: out.debug << \"Construct dmat3\";   break;\n    case EOpConstructDMat3x4: out.debug << \"Construct dmat3x4\"; break;\n    case EOpConstructDMat4x2: out.debug << \"Construct dmat4x2\"; break;\n    case EOpConstructDMat4x3: out.debug << \"Construct dmat4x3\"; break;\n    case EOpConstructDMat4x4: out.debug << \"Construct dmat4\";   break;\n    case EOpConstructIMat2x2: out.debug << \"Construct imat2\";   break;\n    case EOpConstructIMat2x3: out.debug << \"Construct imat2x3\"; break;\n    case EOpConstructIMat2x4: out.debug << \"Construct imat2x4\"; break;\n    case EOpConstructIMat3x2: out.debug << \"Construct imat3x2\"; break;\n    case EOpConstructIMat3x3: out.debug << \"Construct imat3\";   break;\n    case EOpConstructIMat3x4: out.debug << \"Construct imat3x4\"; break;\n    case EOpConstructIMat4x2: out.debug << \"Construct imat4x2\"; break;\n    case EOpConstructIMat4x3: out.debug << \"Construct imat4x3\"; break;\n    case EOpConstructIMat4x4: out.debug << \"Construct imat4\";   break;\n    case EOpConstructUMat2x2: out.debug << \"Construct umat2\";   break;\n    case EOpConstructUMat2x3: out.debug << \"Construct umat2x3\"; break;\n    case EOpConstructUMat2x4: out.debug << \"Construct umat2x4\"; break;\n    case EOpConstructUMat3x2: out.debug << \"Construct umat3x2\"; break;\n    case EOpConstructUMat3x3: out.debug << \"Construct umat3\";   break;\n    case EOpConstructUMat3x4: out.debug << \"Construct umat3x4\"; break;\n    case EOpConstructUMat4x2: out.debug << \"Construct umat4x2\"; break;\n    case EOpConstructUMat4x3: out.debug << \"Construct umat4x3\"; break;\n    case EOpConstructUMat4x4: out.debug << \"Construct umat4\";   break;\n    case EOpConstructBMat2x2: out.debug << \"Construct bmat2\";   break;\n    case EOpConstructBMat2x3: out.debug << \"Construct bmat2x3\"; break;\n    case EOpConstructBMat2x4: out.debug << \"Construct bmat2x4\"; break;\n    case EOpConstructBMat3x2: out.debug << \"Construct bmat3x2\"; break;\n    case EOpConstructBMat3x3: out.debug << \"Construct bmat3\";   break;\n    case EOpConstructBMat3x4: out.debug << \"Construct bmat3x4\"; break;\n    case EOpConstructBMat4x2: out.debug << \"Construct bmat4x2\"; break;\n    case EOpConstructBMat4x3: out.debug << \"Construct bmat4x3\"; break;\n    case EOpConstructBMat4x4: out.debug << \"Construct bmat4\";   break;\n    case EOpConstructBFloat16:  out.debug << \"Construct bfloat16_t\"; break;\n    case EOpConstructBF16Vec2:  out.debug << \"Construct bf16vec2\";   break;\n    case EOpConstructBF16Vec3:  out.debug << \"Construct bf16vec3\";   break;\n    case EOpConstructBF16Vec4:  out.debug << \"Construct bf16vec4\";   break;\n    case EOpConstructFloatE5M2:  out.debug << \"Construct floate5m2_t\"; break;\n    case EOpConstructFloatE5M2Vec2:  out.debug << \"Construct fe5m2vec2\";   break;\n    case EOpConstructFloatE5M2Vec3:  out.debug << \"Construct fe5m2vec3\";   break;\n    case EOpConstructFloatE5M2Vec4:  out.debug << \"Construct fe5m2vec4\";   break;\n    case EOpConstructFloatE4M3:  out.debug << \"Construct floate4m3_t\"; break;\n    case EOpConstructFloatE4M3Vec2:  out.debug << \"Construct fe4m3vec2\";   break;\n    case EOpConstructFloatE4M3Vec3:  out.debug << \"Construct fe4m3vec3\";   break;\n    case EOpConstructFloatE4M3Vec4:  out.debug << \"Construct fe4m3vec4\";   break;\n    case EOpConstructFloat16:   out.debug << \"Construct float16_t\"; break;\n    case EOpConstructF16Vec2:   out.debug << \"Construct f16vec2\";   break;\n    case EOpConstructF16Vec3:   out.debug << \"Construct f16vec3\";   break;\n    case EOpConstructF16Vec4:   out.debug << \"Construct f16vec4\";   break;\n    case EOpConstructF16Mat2x2: out.debug << \"Construct f16mat2\";   break;\n    case EOpConstructF16Mat2x3: out.debug << \"Construct f16mat2x3\"; break;\n    case EOpConstructF16Mat2x4: out.debug << \"Construct f16mat2x4\"; break;\n    case EOpConstructF16Mat3x2: out.debug << \"Construct f16mat3x2\"; break;\n    case EOpConstructF16Mat3x3: out.debug << \"Construct f16mat3\";   break;\n    case EOpConstructF16Mat3x4: out.debug << \"Construct f16mat3x4\"; break;\n    case EOpConstructF16Mat4x2: out.debug << \"Construct f16mat4x2\"; break;\n    case EOpConstructF16Mat4x3: out.debug << \"Construct f16mat4x3\"; break;\n    case EOpConstructF16Mat4x4: out.debug << \"Construct f16mat4\";   break;\n    case EOpConstructStruct:  out.debug << \"Construct structure\";  break;\n    case EOpConstructTextureSampler: out.debug << \"Construct combined texture-sampler\"; break;\n    case EOpConstructReference:  out.debug << \"Construct reference\";  break;\n    case EOpConstructCooperativeMatrixNV:  out.debug << \"Construct cooperative matrix NV\";  break;\n    case EOpConstructCooperativeMatrixKHR:  out.debug << \"Construct cooperative matrix KHR\";  break;\n    case EOpConstructCooperativeVectorNV:  out.debug << \"Construct cooperative vector NV\";  break;\n    case EOpConstructAccStruct: out.debug << \"Construct acceleration structure\"; break;\n\n    case EOpLessThan:         out.debug << \"Compare Less Than\";             break;\n    case EOpGreaterThan:      out.debug << \"Compare Greater Than\";          break;\n    case EOpLessThanEqual:    out.debug << \"Compare Less Than or Equal\";    break;\n    case EOpGreaterThanEqual: out.debug << \"Compare Greater Than or Equal\"; break;\n    case EOpVectorEqual:      out.debug << \"Equal\";                         break;\n    case EOpVectorNotEqual:   out.debug << \"NotEqual\";                      break;\n\n    case EOpMod:           out.debug << \"mod\";         break;\n    case EOpModf:          out.debug << \"modf\";        break;\n    case EOpPow:           out.debug << \"pow\";         break;\n\n    case EOpAtan:          out.debug << \"arc tangent\"; break;\n\n    case EOpMin:           out.debug << \"min\";         break;\n    case EOpMax:           out.debug << \"max\";         break;\n    case EOpClamp:         out.debug << \"clamp\";       break;\n    case EOpMix:           out.debug << \"mix\";         break;\n    case EOpStep:          out.debug << \"step\";        break;\n    case EOpSmoothStep:    out.debug << \"smoothstep\";  break;\n\n    case EOpDistance:      out.debug << \"distance\";                break;\n    case EOpDot:           out.debug << \"dot-product\";             break;\n    case EOpDotPackedEXT:  out.debug << \"dot-product-packed\";break;\n    case EOpDotAccSatEXT:  out.debug << \"dot-product-accumulate-saturate\";break;\n    case EOpDotPackedAccSatEXT:  out.debug << \"dot-product-packed-accumulate-saturate\";break;\n    case EOpCross:         out.debug << \"cross-product\";           break;\n    case EOpFaceForward:   out.debug << \"face-forward\";            break;\n    case EOpReflect:       out.debug << \"reflect\";                 break;\n    case EOpRefract:       out.debug << \"refract\";                 break;\n    case EOpMul:           out.debug << \"component-wise multiply\"; break;\n    case EOpOuterProduct:  out.debug << \"outer product\";           break;\n\n    case EOpEmitVertex:    out.debug << \"EmitVertex\";              break;\n    case EOpEndPrimitive:  out.debug << \"EndPrimitive\";            break;\n\n    case EOpBarrier:                    out.debug << \"Barrier\";                    break;\n    case EOpMemoryBarrier:              out.debug << \"MemoryBarrier\";              break;\n    case EOpMemoryBarrierAtomicCounter: out.debug << \"MemoryBarrierAtomicCounter\"; break;\n    case EOpMemoryBarrierBuffer:        out.debug << \"MemoryBarrierBuffer\";        break;\n    case EOpMemoryBarrierImage:         out.debug << \"MemoryBarrierImage\";         break;\n    case EOpMemoryBarrierShared:        out.debug << \"MemoryBarrierShared\";        break;\n    case EOpGroupMemoryBarrier:         out.debug << \"GroupMemoryBarrier\";         break;\n\n    case EOpReadInvocation:             out.debug << \"readInvocation\";        break;\n\n    case EOpSwizzleInvocations:         out.debug << \"swizzleInvocations\";       break;\n    case EOpSwizzleInvocationsMasked:   out.debug << \"swizzleInvocationsMasked\"; break;\n    case EOpWriteInvocation:            out.debug << \"writeInvocation\";          break;\n\n    case EOpMin3:                       out.debug << \"min3\";                  break;\n    case EOpMax3:                       out.debug << \"max3\";                  break;\n    case EOpMid3:                       out.debug << \"mid3\";                  break;\n    case EOpTime:                       out.debug << \"time\";                  break;\n\n    case EOpAtomicAdd:                  out.debug << \"AtomicAdd\";             break;\n    case EOpAtomicSubtract:             out.debug << \"AtomicSubtract\";        break;\n    case EOpAtomicMin:                  out.debug << \"AtomicMin\";             break;\n    case EOpAtomicMax:                  out.debug << \"AtomicMax\";             break;\n    case EOpAtomicAnd:                  out.debug << \"AtomicAnd\";             break;\n    case EOpAtomicOr:                   out.debug << \"AtomicOr\";              break;\n    case EOpAtomicXor:                  out.debug << \"AtomicXor\";             break;\n    case EOpAtomicExchange:             out.debug << \"AtomicExchange\";        break;\n    case EOpAtomicCompSwap:             out.debug << \"AtomicCompSwap\";        break;\n    case EOpAtomicLoad:                 out.debug << \"AtomicLoad\";            break;\n    case EOpAtomicStore:                out.debug << \"AtomicStore\";           break;\n\n    case EOpAtomicCounterAdd:           out.debug << \"AtomicCounterAdd\";      break;\n    case EOpAtomicCounterSubtract:      out.debug << \"AtomicCounterSubtract\"; break;\n    case EOpAtomicCounterMin:           out.debug << \"AtomicCounterMin\";      break;\n    case EOpAtomicCounterMax:           out.debug << \"AtomicCounterMax\";      break;\n    case EOpAtomicCounterAnd:           out.debug << \"AtomicCounterAnd\";      break;\n    case EOpAtomicCounterOr:            out.debug << \"AtomicCounterOr\";       break;\n    case EOpAtomicCounterXor:           out.debug << \"AtomicCounterXor\";      break;\n    case EOpAtomicCounterExchange:      out.debug << \"AtomicCounterExchange\"; break;\n    case EOpAtomicCounterCompSwap:      out.debug << \"AtomicCounterCompSwap\"; break;\n\n    case EOpImageQuerySize:             out.debug << \"imageQuerySize\";        break;\n    case EOpImageQuerySamples:          out.debug << \"imageQuerySamples\";     break;\n    case EOpImageLoad:                  out.debug << \"imageLoad\";             break;\n    case EOpImageStore:                 out.debug << \"imageStore\";            break;\n    case EOpImageAtomicAdd:             out.debug << \"imageAtomicAdd\";        break;\n    case EOpImageAtomicMin:             out.debug << \"imageAtomicMin\";        break;\n    case EOpImageAtomicMax:             out.debug << \"imageAtomicMax\";        break;\n    case EOpImageAtomicAnd:             out.debug << \"imageAtomicAnd\";        break;\n    case EOpImageAtomicOr:              out.debug << \"imageAtomicOr\";         break;\n    case EOpImageAtomicXor:             out.debug << \"imageAtomicXor\";        break;\n    case EOpImageAtomicExchange:        out.debug << \"imageAtomicExchange\";   break;\n    case EOpImageAtomicCompSwap:        out.debug << \"imageAtomicCompSwap\";   break;\n    case EOpImageAtomicLoad:            out.debug << \"imageAtomicLoad\";       break;\n    case EOpImageAtomicStore:           out.debug << \"imageAtomicStore\";      break;\n    case EOpImageLoadLod:               out.debug << \"imageLoadLod\";          break;\n    case EOpImageStoreLod:              out.debug << \"imageStoreLod\";         break;\n\n    case EOpTextureQuerySize:           out.debug << \"textureSize\";           break;\n    case EOpTextureQueryLod:            out.debug << \"textureQueryLod\";       break;\n    case EOpTextureQueryLevels:         out.debug << \"textureQueryLevels\";    break;\n    case EOpTextureQuerySamples:        out.debug << \"textureSamples\";        break;\n    case EOpTexture:                    out.debug << \"texture\";               break;\n    case EOpTextureProj:                out.debug << \"textureProj\";           break;\n    case EOpTextureLod:                 out.debug << \"textureLod\";            break;\n    case EOpTextureOffset:              out.debug << \"textureOffset\";         break;\n    case EOpTextureFetch:               out.debug << \"textureFetch\";          break;\n    case EOpTextureFetchOffset:         out.debug << \"textureFetchOffset\";    break;\n    case EOpTextureProjOffset:          out.debug << \"textureProjOffset\";     break;\n    case EOpTextureLodOffset:           out.debug << \"textureLodOffset\";      break;\n    case EOpTextureProjLod:             out.debug << \"textureProjLod\";        break;\n    case EOpTextureProjLodOffset:       out.debug << \"textureProjLodOffset\";  break;\n    case EOpTextureGrad:                out.debug << \"textureGrad\";           break;\n    case EOpTextureGradOffset:          out.debug << \"textureGradOffset\";     break;\n    case EOpTextureProjGrad:            out.debug << \"textureProjGrad\";       break;\n    case EOpTextureProjGradOffset:      out.debug << \"textureProjGradOffset\"; break;\n    case EOpTextureGather:              out.debug << \"textureGather\";         break;\n    case EOpTextureGatherOffset:        out.debug << \"textureGatherOffset\";   break;\n    case EOpTextureGatherOffsets:       out.debug << \"textureGatherOffsets\";  break;\n    case EOpTextureClamp:               out.debug << \"textureClamp\";          break;\n    case EOpTextureOffsetClamp:         out.debug << \"textureOffsetClamp\";    break;\n    case EOpTextureGradClamp:           out.debug << \"textureGradClamp\";      break;\n    case EOpTextureGradOffsetClamp:     out.debug << \"textureGradOffsetClamp\";  break;\n    case EOpTextureGatherLod:           out.debug << \"textureGatherLod\";        break;\n    case EOpTextureGatherLodOffset:     out.debug << \"textureGatherLodOffset\";  break;\n    case EOpTextureGatherLodOffsets:    out.debug << \"textureGatherLodOffsets\"; break;\n\n    case EOpSparseTexture:                  out.debug << \"sparseTexture\";                   break;\n    case EOpSparseTextureOffset:            out.debug << \"sparseTextureOffset\";             break;\n    case EOpSparseTextureLod:               out.debug << \"sparseTextureLod\";                break;\n    case EOpSparseTextureLodOffset:         out.debug << \"sparseTextureLodOffset\";          break;\n    case EOpSparseTextureFetch:             out.debug << \"sparseTexelFetch\";                break;\n    case EOpSparseTextureFetchOffset:       out.debug << \"sparseTexelFetchOffset\";          break;\n    case EOpSparseTextureGrad:              out.debug << \"sparseTextureGrad\";               break;\n    case EOpSparseTextureGradOffset:        out.debug << \"sparseTextureGradOffset\";         break;\n    case EOpSparseTextureGather:            out.debug << \"sparseTextureGather\";             break;\n    case EOpSparseTextureGatherOffset:      out.debug << \"sparseTextureGatherOffset\";       break;\n    case EOpSparseTextureGatherOffsets:     out.debug << \"sparseTextureGatherOffsets\";      break;\n    case EOpSparseImageLoad:                out.debug << \"sparseImageLoad\";                 break;\n    case EOpSparseTextureClamp:             out.debug << \"sparseTextureClamp\";              break;\n    case EOpSparseTextureOffsetClamp:       out.debug << \"sparseTextureOffsetClamp\";        break;\n    case EOpSparseTextureGradClamp:         out.debug << \"sparseTextureGradClamp\";          break;\n    case EOpSparseTextureGradOffsetClamp:   out.debug << \"sparseTextureGradOffsetClam\";     break;\n    case EOpSparseTextureGatherLod:         out.debug << \"sparseTextureGatherLod\";          break;\n    case EOpSparseTextureGatherLodOffset:   out.debug << \"sparseTextureGatherLodOffset\";    break;\n    case EOpSparseTextureGatherLodOffsets:  out.debug << \"sparseTextureGatherLodOffsets\";   break;\n    case EOpSparseImageLoadLod:             out.debug << \"sparseImageLoadLod\";              break;\n    case EOpImageSampleFootprintNV:             out.debug << \"imageSampleFootprintNV\";          break;\n    case EOpImageSampleFootprintClampNV:        out.debug << \"imageSampleFootprintClampNV\";     break;\n    case EOpImageSampleFootprintLodNV:          out.debug << \"imageSampleFootprintLodNV\";       break;\n    case EOpImageSampleFootprintGradNV:         out.debug << \"imageSampleFootprintGradNV\";      break;\n    case EOpImageSampleFootprintGradClampNV:    out.debug << \"mageSampleFootprintGradClampNV\";  break;\n    case EOpAddCarry:                   out.debug << \"addCarry\";              break;\n    case EOpSubBorrow:                  out.debug << \"subBorrow\";             break;\n    case EOpUMulExtended:               out.debug << \"uMulExtended\";          break;\n    case EOpIMulExtended:               out.debug << \"iMulExtended\";          break;\n    case EOpBitfieldExtract:            out.debug << \"bitfieldExtract\";       break;\n    case EOpBitfieldInsert:             out.debug << \"bitfieldInsert\";        break;\n\n    case EOpFma:                        out.debug << \"fma\";                   break;\n    case EOpFrexp:                      out.debug << \"frexp\";                 break;\n    case EOpLdexp:                      out.debug << \"ldexp\";                 break;\n\n    case EOpInterpolateAtSample:   out.debug << \"interpolateAtSample\";    break;\n    case EOpInterpolateAtOffset:   out.debug << \"interpolateAtOffset\";    break;\n    case EOpInterpolateAtVertex:   out.debug << \"interpolateAtVertex\";    break;\n\n    case EOpSinCos:                     out.debug << \"sincos\";                break;\n    case EOpGenMul:                     out.debug << \"mul\";                   break;\n\n    case EOpAllMemoryBarrierWithGroupSync:    out.debug << \"AllMemoryBarrierWithGroupSync\";    break;\n    case EOpDeviceMemoryBarrier:              out.debug << \"DeviceMemoryBarrier\";              break;\n    case EOpDeviceMemoryBarrierWithGroupSync: out.debug << \"DeviceMemoryBarrierWithGroupSync\"; break;\n    case EOpWorkgroupMemoryBarrier:           out.debug << \"WorkgroupMemoryBarrier\";           break;\n    case EOpWorkgroupMemoryBarrierWithGroupSync: out.debug << \"WorkgroupMemoryBarrierWithGroupSync\"; break;\n\n    case EOpSubgroupBarrier:                 out.debug << \"subgroupBarrier\"; break;\n    case EOpSubgroupMemoryBarrier:           out.debug << \"subgroupMemoryBarrier\"; break;\n    case EOpSubgroupMemoryBarrierBuffer:     out.debug << \"subgroupMemoryBarrierBuffer\"; break;\n    case EOpSubgroupMemoryBarrierImage:      out.debug << \"subgroupMemoryBarrierImage\";   break;\n    case EOpSubgroupMemoryBarrierShared:     out.debug << \"subgroupMemoryBarrierShared\"; break;\n    case EOpSubgroupElect:                   out.debug << \"subgroupElect\"; break;\n    case EOpSubgroupAll:                     out.debug << \"subgroupAll\"; break;\n    case EOpSubgroupAny:                     out.debug << \"subgroupAny\"; break;\n    case EOpSubgroupAllEqual:                out.debug << \"subgroupAllEqual\"; break;\n    case EOpSubgroupBroadcast:               out.debug << \"subgroupBroadcast\"; break;\n    case EOpSubgroupBroadcastFirst:          out.debug << \"subgroupBroadcastFirst\"; break;\n    case EOpSubgroupBallot:                  out.debug << \"subgroupBallot\"; break;\n    case EOpSubgroupInverseBallot:           out.debug << \"subgroupInverseBallot\"; break;\n    case EOpSubgroupBallotBitExtract:        out.debug << \"subgroupBallotBitExtract\"; break;\n    case EOpSubgroupBallotBitCount:          out.debug << \"subgroupBallotBitCount\"; break;\n    case EOpSubgroupBallotInclusiveBitCount: out.debug << \"subgroupBallotInclusiveBitCount\"; break;\n    case EOpSubgroupBallotExclusiveBitCount: out.debug << \"subgroupBallotExclusiveBitCount\"; break;\n    case EOpSubgroupBallotFindLSB:           out.debug << \"subgroupBallotFindLSB\"; break;\n    case EOpSubgroupBallotFindMSB:           out.debug << \"subgroupBallotFindMSB\"; break;\n    case EOpSubgroupShuffle:                 out.debug << \"subgroupShuffle\"; break;\n    case EOpSubgroupShuffleXor:              out.debug << \"subgroupShuffleXor\"; break;\n    case EOpSubgroupShuffleUp:               out.debug << \"subgroupShuffleUp\"; break;\n    case EOpSubgroupShuffleDown:             out.debug << \"subgroupShuffleDown\"; break;\n    case EOpSubgroupRotate:                  out.debug << \"subgroupRotate\"; break;\n    case EOpSubgroupClusteredRotate:         out.debug << \"subgroupClusteredRotate\"; break;\n    case EOpSubgroupAdd:                     out.debug << \"subgroupAdd\"; break;\n    case EOpSubgroupMul:                     out.debug << \"subgroupMul\"; break;\n    case EOpSubgroupMin:                     out.debug << \"subgroupMin\"; break;\n    case EOpSubgroupMax:                     out.debug << \"subgroupMax\"; break;\n    case EOpSubgroupAnd:                     out.debug << \"subgroupAnd\"; break;\n    case EOpSubgroupOr:                      out.debug << \"subgroupOr\"; break;\n    case EOpSubgroupXor:                     out.debug << \"subgroupXor\"; break;\n    case EOpSubgroupInclusiveAdd:            out.debug << \"subgroupInclusiveAdd\"; break;\n    case EOpSubgroupInclusiveMul:            out.debug << \"subgroupInclusiveMul\"; break;\n    case EOpSubgroupInclusiveMin:            out.debug << \"subgroupInclusiveMin\"; break;\n    case EOpSubgroupInclusiveMax:            out.debug << \"subgroupInclusiveMax\"; break;\n    case EOpSubgroupInclusiveAnd:            out.debug << \"subgroupInclusiveAnd\"; break;\n    case EOpSubgroupInclusiveOr:             out.debug << \"subgroupInclusiveOr\"; break;\n    case EOpSubgroupInclusiveXor:            out.debug << \"subgroupInclusiveXor\"; break;\n    case EOpSubgroupExclusiveAdd:            out.debug << \"subgroupExclusiveAdd\"; break;\n    case EOpSubgroupExclusiveMul:            out.debug << \"subgroupExclusiveMul\"; break;\n    case EOpSubgroupExclusiveMin:            out.debug << \"subgroupExclusiveMin\"; break;\n    case EOpSubgroupExclusiveMax:            out.debug << \"subgroupExclusiveMax\"; break;\n    case EOpSubgroupExclusiveAnd:            out.debug << \"subgroupExclusiveAnd\"; break;\n    case EOpSubgroupExclusiveOr:             out.debug << \"subgroupExclusiveOr\"; break;\n    case EOpSubgroupExclusiveXor:            out.debug << \"subgroupExclusiveXor\"; break;\n    case EOpSubgroupClusteredAdd:            out.debug << \"subgroupClusteredAdd\"; break;\n    case EOpSubgroupClusteredMul:            out.debug << \"subgroupClusteredMul\"; break;\n    case EOpSubgroupClusteredMin:            out.debug << \"subgroupClusteredMin\"; break;\n    case EOpSubgroupClusteredMax:            out.debug << \"subgroupClusteredMax\"; break;\n    case EOpSubgroupClusteredAnd:            out.debug << \"subgroupClusteredAnd\"; break;\n    case EOpSubgroupClusteredOr:             out.debug << \"subgroupClusteredOr\"; break;\n    case EOpSubgroupClusteredXor:            out.debug << \"subgroupClusteredXor\"; break;\n    case EOpSubgroupQuadBroadcast:           out.debug << \"subgroupQuadBroadcast\"; break;\n    case EOpSubgroupQuadSwapHorizontal:      out.debug << \"subgroupQuadSwapHorizontal\"; break;\n    case EOpSubgroupQuadSwapVertical:        out.debug << \"subgroupQuadSwapVertical\"; break;\n    case EOpSubgroupQuadSwapDiagonal:        out.debug << \"subgroupQuadSwapDiagonal\"; break;\n    case EOpSubgroupQuadAll:                 out.debug << \"subgroupQuadAll\"; break;\n    case EOpSubgroupQuadAny:                 out.debug << \"subgroupQuadAny\"; break;\n\n    case EOpSubgroupPartition:                          out.debug << \"subgroupPartitionNV\";                          break;\n    case EOpSubgroupPartitionedAdd:                     out.debug << \"subgroupPartitionedAddNV\";                     break;\n    case EOpSubgroupPartitionedMul:                     out.debug << \"subgroupPartitionedMulNV\";                     break;\n    case EOpSubgroupPartitionedMin:                     out.debug << \"subgroupPartitionedMinNV\";                     break;\n    case EOpSubgroupPartitionedMax:                     out.debug << \"subgroupPartitionedMaxNV\";                     break;\n    case EOpSubgroupPartitionedAnd:                     out.debug << \"subgroupPartitionedAndNV\";                     break;\n    case EOpSubgroupPartitionedOr:                      out.debug << \"subgroupPartitionedOrNV\";                      break;\n    case EOpSubgroupPartitionedXor:                     out.debug << \"subgroupPartitionedXorNV\";                     break;\n    case EOpSubgroupPartitionedInclusiveAdd:            out.debug << \"subgroupPartitionedInclusiveAddNV\";            break;\n    case EOpSubgroupPartitionedInclusiveMul:            out.debug << \"subgroupPartitionedInclusiveMulNV\";            break;\n    case EOpSubgroupPartitionedInclusiveMin:            out.debug << \"subgroupPartitionedInclusiveMinNV\";            break;\n    case EOpSubgroupPartitionedInclusiveMax:            out.debug << \"subgroupPartitionedInclusiveMaxNV\";            break;\n    case EOpSubgroupPartitionedInclusiveAnd:            out.debug << \"subgroupPartitionedInclusiveAndNV\";            break;\n    case EOpSubgroupPartitionedInclusiveOr:             out.debug << \"subgroupPartitionedInclusiveOrNV\";             break;\n    case EOpSubgroupPartitionedInclusiveXor:            out.debug << \"subgroupPartitionedInclusiveXorNV\";            break;\n    case EOpSubgroupPartitionedExclusiveAdd:            out.debug << \"subgroupPartitionedExclusiveAddNV\";            break;\n    case EOpSubgroupPartitionedExclusiveMul:            out.debug << \"subgroupPartitionedExclusiveMulNV\";            break;\n    case EOpSubgroupPartitionedExclusiveMin:            out.debug << \"subgroupPartitionedExclusiveMinNV\";            break;\n    case EOpSubgroupPartitionedExclusiveMax:            out.debug << \"subgroupPartitionedExclusiveMaxNV\";            break;\n    case EOpSubgroupPartitionedExclusiveAnd:            out.debug << \"subgroupPartitionedExclusiveAndNV\";            break;\n    case EOpSubgroupPartitionedExclusiveOr:             out.debug << \"subgroupPartitionedExclusiveOrNV\";             break;\n    case EOpSubgroupPartitionedExclusiveXor:            out.debug << \"subgroupPartitionedExclusiveXorNV\";            break;\n\n    case EOpSubpassLoad:   out.debug << \"subpassLoad\";   break;\n    case EOpSubpassLoadMS: out.debug << \"subpassLoadMS\"; break;\n\n    case EOpColorAttachmentReadEXT:   out.debug << \"colorAttachmentReadEXT\";   break;\n\n    case EOpTraceNV:                          out.debug << \"traceNV\"; break;\n    case EOpTraceRayMotionNV:                 out.debug << \"traceRayMotionNV\"; break;\n    case EOpTraceKHR:                         out.debug << \"traceRayKHR\"; break;\n    case EOpReportIntersection:               out.debug << \"reportIntersectionNV\"; break;\n    case EOpIgnoreIntersectionNV:             out.debug << \"ignoreIntersectionNV\"; break;\n    case EOpIgnoreIntersectionKHR:            out.debug << \"ignoreIntersectionKHR\"; break;\n    case EOpTerminateRayNV:                   out.debug << \"terminateRayNV\"; break;\n    case EOpTerminateRayKHR:                  out.debug << \"terminateRayKHR\"; break;\n    case EOpExecuteCallableNV:                out.debug << \"executeCallableNV\"; break;\n    case EOpExecuteCallableKHR:               out.debug << \"executeCallableKHR\"; break;\n    case EOpWritePackedPrimitiveIndices4x8NV: out.debug << \"writePackedPrimitiveIndices4x8NV\"; break;\n    case EOpEmitMeshTasksEXT:                 out.debug << \"EmitMeshTasksEXT\"; break;\n    case EOpSetMeshOutputsEXT:                out.debug << \"SetMeshOutputsEXT\"; break;\n\n    case EOpRayQueryInitialize:                                            out.debug << \"rayQueryInitializeEXT\"; break;\n    case EOpRayQueryTerminate:                                             out.debug << \"rayQueryTerminateEXT\"; break;\n    case EOpRayQueryGenerateIntersection:                                  out.debug << \"rayQueryGenerateIntersectionEXT\"; break;\n    case EOpRayQueryConfirmIntersection:                                   out.debug << \"rayQueryConfirmIntersectionEXT\"; break;\n    case EOpRayQueryProceed:                                               out.debug << \"rayQueryProceedEXT\"; break;\n    case EOpRayQueryGetIntersectionType:                                   out.debug << \"rayQueryGetIntersectionTypeEXT\"; break;\n    case EOpRayQueryGetRayTMin:                                            out.debug << \"rayQueryGetRayTMinEXT\"; break;\n    case EOpRayQueryGetRayFlags:                                           out.debug << \"rayQueryGetRayFlagsEXT\"; break;\n    case EOpRayQueryGetIntersectionT:                                      out.debug << \"rayQueryGetIntersectionTEXT\"; break;\n    case EOpRayQueryGetIntersectionInstanceCustomIndex:                    out.debug << \"rayQueryGetIntersectionInstanceCustomIndexEXT\"; break;\n    case EOpRayQueryGetIntersectionInstanceId:                             out.debug << \"rayQueryGetIntersectionInstanceIdEXT\"; break;\n    case EOpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffset: out.debug << \"rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT\"; break;\n    case EOpRayQueryGetIntersectionGeometryIndex:                          out.debug << \"rayQueryGetIntersectionGeometryIndexEXT\"; break;\n    case EOpRayQueryGetIntersectionPrimitiveIndex:                         out.debug << \"rayQueryGetIntersectionPrimitiveIndexEXT\"; break;\n    case EOpRayQueryGetIntersectionBarycentrics:                           out.debug << \"rayQueryGetIntersectionBarycentricsEXT\"; break;\n    case EOpRayQueryGetIntersectionFrontFace:                              out.debug << \"rayQueryGetIntersectionFrontFaceEXT\"; break;\n    case EOpRayQueryGetIntersectionCandidateAABBOpaque:                    out.debug << \"rayQueryGetIntersectionCandidateAABBOpaqueEXT\"; break;\n    case EOpRayQueryGetIntersectionObjectRayDirection:                     out.debug << \"rayQueryGetIntersectionObjectRayDirectionEXT\"; break;\n    case EOpRayQueryGetIntersectionObjectRayOrigin:                        out.debug << \"rayQueryGetIntersectionObjectRayOriginEXT\"; break;\n    case EOpRayQueryGetWorldRayDirection:                                  out.debug << \"rayQueryGetWorldRayDirectionEXT\"; break;\n    case EOpRayQueryGetWorldRayOrigin:                                     out.debug << \"rayQueryGetWorldRayOriginEXT\"; break;\n    case EOpRayQueryGetIntersectionObjectToWorld:                          out.debug << \"rayQueryGetIntersectionObjectToWorldEXT\"; break;\n    case EOpRayQueryGetIntersectionWorldToObject:                          out.debug << \"rayQueryGetIntersectionWorldToObjectEXT\"; break;\n    case EOpRayQueryGetIntersectionTriangleVertexPositionsEXT:             out.debug << \"rayQueryGetIntersectionTriangleVertexPositionsEXT\"; break;\n    case EOpRayQueryGetIntersectionClusterIdNV:                            out.debug << \"rayQueryGetIntersectionClusterIdNV\"; break;\n    case EOpRayQueryGetIntersectionSpherePositionNV:                       out.debug << \"rayQueryGetIntersectionSpherePositionNV\"; break;\n    case EOpRayQueryGetIntersectionSphereRadiusNV:                         out.debug << \"rayQueryGetIntersectionSphereRadiusNV\"; break;\n    case EOpRayQueryGetIntersectionLSSHitValueNV:                          out.debug << \"rayQueryGetIntersectionLSSHitValueNV\"; break;\n    case EOpRayQueryGetIntersectionLSSPositionsNV:                         out.debug << \"rayQueryGetIntersectionLSSPositionsNV\"; break;\n    case EOpRayQueryGetIntersectionLSSRadiiNV:                             out.debug << \"rayQueryGetIntersectionLSSRadiiNV\"; break;\n    case EOpRayQueryIsSphereHitNV:                                         out.debug << \"rayQueryIsSphereHitNV\"; break;\n    case EOpRayQueryIsLSSHitNV:                                            out.debug << \"rayQueryIsLSSHitNV\"; break;\n\n    case EOpCooperativeMatrixLoad:  out.debug << \"Load cooperative matrix KHR\"; break;\n    case EOpCooperativeMatrixStore:  out.debug << \"Store cooperative matrix KHR\"; break;\n    case EOpCooperativeMatrixMulAdd: out.debug << \"MulAdd cooperative matrices KHR\"; break;\n    case EOpCooperativeMatrixLoadNV:  out.debug << \"Load cooperative matrix NV\"; break;\n    case EOpCooperativeMatrixStoreNV:  out.debug << \"Store cooperative matrix NV\"; break;\n    case EOpCooperativeMatrixLoadTensorNV:  out.debug << \"Load cooperative matrix tensor NV\"; break;\n    case EOpCooperativeMatrixStoreTensorNV:  out.debug << \"Store cooperative matrix tensor NV\"; break;\n    case EOpCooperativeMatrixMulAddNV: out.debug << \"MulAdd cooperative matrices NV\"; break;\n    case EOpCooperativeMatrixReduceNV: out.debug << \"Reduce cooperative matrices\"; break;\n    case EOpCooperativeMatrixPerElementOpNV: out.debug << \"cooperative matrix per element op\"; break;\n    case EOpCooperativeMatrixTransposeNV: out.debug << \"Transpose cooperative matrix\"; break;\n\n    case EOpCooperativeVectorMatMulNV: out.debug << \"Cooperative vector matrix multiply NV\"; break;\n    case EOpCooperativeVectorMatMulAddNV: out.debug << \"Cooperative vector matrix multiply add NV\"; break;\n    case EOpCooperativeVectorLoadNV:  out.debug << \"Load cooperative vector NV\"; break;\n    case EOpCooperativeVectorStoreNV:  out.debug << \"Store cooperative vector NV\"; break;\n    case EOpCooperativeVectorOuterProductAccumulateNV: out.debug << \"Cooperative vector outer product accumulate NV\"; break;\n    case EOpCooperativeVectorReduceSumAccumulateNV: out.debug << \"Cooperative vector reduce sum accumulate NV\"; break;\n\n    case EOpIsHelperInvocation: out.debug << \"IsHelperInvocation\"; break;\n    case EOpDebugPrintf:  out.debug << \"Debug printf\";  break;\n\n    case EOpHitObjectTraceRayNV: out.debug << \"HitObjectTraceRayNV\"; break;\n    case EOpHitObjectTraceRayMotionNV: out.debug << \"HitObjectTraceRayMotionNV\"; break;\n    case EOpHitObjectRecordHitNV: out.debug << \"HitObjectRecordHitNV\"; break;\n    case EOpHitObjectRecordHitMotionNV: out.debug << \"HitObjectRecordHitMotionNV\"; break;\n    case EOpHitObjectRecordHitWithIndexNV: out.debug << \"HitObjectRecordHitWithIndexNV\"; break;\n    case EOpHitObjectRecordHitWithIndexMotionNV: out.debug << \"HitObjectRecordHitWithIndexMotionNV\"; break;\n    case EOpHitObjectRecordMissNV: out.debug << \"HitObjectRecordMissNV\"; break;\n    case EOpHitObjectRecordMissMotionNV: out.debug << \"HitObjectRecordMissMotionNV\"; break;\n    case EOpHitObjectRecordEmptyNV: out.debug << \"HitObjectRecordEmptyNV\"; break;\n    case EOpHitObjectExecuteShaderNV: out.debug << \"HitObjectExecuteShaderNV\"; break;\n    case EOpHitObjectIsEmptyNV: out.debug << \"HitObjectIsEmptyNV\"; break;\n    case EOpHitObjectIsMissNV: out.debug << \"HitObjectIsMissNV\"; break;\n    case EOpHitObjectIsHitNV:  out.debug << \"HitObjectIsHitNV\"; break;\n    case EOpHitObjectGetRayTMinNV: out.debug << \"HitObjectGetRayTMinNV\"; break;\n    case EOpHitObjectGetRayTMaxNV: out.debug << \"HitObjectGetRayTMaxNV\"; break;\n    case EOpHitObjectGetObjectRayOriginNV: out.debug << \"HitObjectGetObjectRayOriginNV\"; break;\n    case EOpHitObjectGetObjectRayDirectionNV: out.debug << \"HitObjectGetObjectRayDirectionNV\"; break;\n    case EOpHitObjectGetWorldRayOriginNV: out.debug << \"HitObjectGetWorldRayOriginNV\"; break;\n    case EOpHitObjectGetWorldRayDirectionNV: out.debug << \"HitObjectGetWorldRayDirectionNV\"; break;\n    case EOpHitObjectGetObjectToWorldNV: out.debug << \"HitObjectGetObjectToWorldNV\"; break;\n    case EOpHitObjectGetWorldToObjectNV: out.debug << \"HitObjectGetWorldToObjectNV\"; break;\n    case EOpHitObjectGetInstanceCustomIndexNV: out.debug<< \"HitObjectGetInstanceCustomIndexNV\"; break;\n    case EOpHitObjectGetInstanceIdNV: out.debug << \"HitObjectGetInstaneIdNV\"; break;\n    case EOpHitObjectGetGeometryIndexNV: out.debug << \"HitObjectGetGeometryIndexNV\"; break;\n    case EOpHitObjectGetPrimitiveIndexNV: out.debug << \"HitObjectGetPrimitiveIndexNV\"; break;\n    case EOpHitObjectGetHitKindNV: out.debug << \"HitObjectGetHitKindNV\"; break;\n    case EOpHitObjectGetAttributesNV: out.debug << \"HitObjectGetAttributesNV\"; break;\n    case EOpHitObjectGetCurrentTimeNV: out.debug << \"HitObjectGetCurrentTimeNV\"; break;\n    case EOpHitObjectGetShaderBindingTableRecordIndexNV: out.debug << \"HitObjectGetShaderBindingTableRecordIndexNV\"; break;\n    case EOpHitObjectGetShaderRecordBufferHandleNV: out.debug << \"HitObjectReadShaderRecordBufferHandleNV\"; break;\n    case EOpHitObjectGetClusterIdNV: out.debug << \"HitObjectGetClusterIdNV\"; break;\n    case EOpReorderThreadNV: out.debug << \"ReorderThreadNV\"; break;\n    case EOpFetchMicroTriangleVertexPositionNV: out.debug << \"MicroTriangleVertexPositionNV\"; break;\n    case EOpFetchMicroTriangleVertexBarycentricNV: out.debug << \"MicroTriangleVertexBarycentricNV\"; break;\n    case EOpHitObjectGetSpherePositionNV: out.debug << \"HitObjectGetSpherePositionNV\"; break;\n    case EOpHitObjectGetSphereRadiusNV:   out.debug << \"HitObjectGetSphereRadiusNV\"; break;\n    case EOpHitObjectGetLSSPositionsNV:   out.debug << \"HitObjectGetLSSPositionsNV\"; break;\n    case EOpHitObjectGetLSSRadiiNV:       out.debug << \"HitObjectGetLSSRadiiNV\"; break;\n    case EOpHitObjectIsSphereHitNV:       out.debug << \"HitObjectIsSphereHitNV\"; break;\n    case EOpHitObjectIsLSSHitNV:          out.debug << \"HitObjectIsLSSHitNV\"; break;\n\n    case EOpSpirvInst: out.debug << \"spirv_instruction\"; break;\n    case EOpStencilAttachmentReadEXT: out.debug << \"stencilAttachmentReadEXT\"; break;\n    case EOpDepthAttachmentReadEXT: out.debug << \"depthAttachmentReadEXT\"; break;\n\n    case EOpCreateTensorLayoutNV:           out.debug << \"createTensorLayout\"; break;\n    case EOpTensorLayoutSetBlockSizeNV:     out.debug << \"setBlockSize\"; break;\n    case EOpTensorLayoutSetDimensionNV:     out.debug << \"setDimension\"; break;\n    case EOpTensorLayoutSetStrideNV:        out.debug << \"setStride\"; break;\n    case EOpTensorLayoutSliceNV:            out.debug << \"slice\"; break;\n    case EOpTensorLayoutSetClampValueNV:    out.debug << \"setClampValue\"; break;\n    case EOpCreateTensorViewNV:             out.debug << \"createTensorView\"; break;\n    case EOpTensorViewSetDimensionNV:       out.debug << \"setTensorViewDimensions\"; break;\n    case EOpTensorViewSetStrideNV:          out.debug << \"setTensorViewStride\"; break;\n    case EOpTensorViewSetClipNV:            out.debug << \"clipTensorView\"; break;\n\n    default: out.debug.message(EPrefixError, \"Bad aggregation op\");\n    }\n\n    if (node->getOp() != EOpSequence && node->getOp() != EOpScope && node->getOp() != EOpParameters)\n        out.debug << \" (\" << node->getCompleteString() << \")\";\n\n    out.debug << \"\\n\";\n\n    return true;\n}\n\nbool TOutputTraverser::visitSelection(TVisit /* visit */, TIntermSelection* node)\n{\n    TInfoSink& out = infoSink;\n\n    OutputTreeText(out, node, depth);\n\n    out.debug << \"Test condition and select\";\n    out.debug << \" (\" << node->getCompleteString() << \")\";\n\n    if (node->getShortCircuit() == false)\n        out.debug << \": no shortcircuit\";\n    if (node->getFlatten())\n        out.debug << \": Flatten\";\n    if (node->getDontFlatten())\n        out.debug << \": DontFlatten\";\n    out.debug << \"\\n\";\n\n    ++depth;\n\n    OutputTreeText(out, node, depth);\n    out.debug << \"Condition\\n\";\n    node->getCondition()->traverse(this);\n\n    OutputTreeText(out, node, depth);\n    if (node->getTrueBlock()) {\n        out.debug << \"true case\\n\";\n        node->getTrueBlock()->traverse(this);\n    } else\n        out.debug << \"true case is null\\n\";\n\n    if (node->getFalseBlock()) {\n        OutputTreeText(out, node, depth);\n        out.debug << \"false case\\n\";\n        node->getFalseBlock()->traverse(this);\n    }\n\n    --depth;\n\n    return false;\n}\n\n// Print infinities and NaNs, and numbers in a portable way.\n// Goals:\n//   - portable (across IEEE 754 platforms)\n//   - shows all possible IEEE values\n//   - shows simple numbers in a simple way, e.g., no leading/trailing 0s\n//   - shows all digits, no premature rounding\nstatic void OutputDouble(TInfoSink& out, double value, TOutputTraverser::EExtraOutput extra)\n{\n    if (std::isinf(value)) {\n        if (value < 0)\n            out.debug << \"-1.#INF\";\n        else\n            out.debug << \"+1.#INF\";\n    } else if (std::isnan(value))\n        out.debug << \"1.#IND\";\n    else {\n        const int maxSize = 340;\n        char buf[maxSize];\n        const char* format = \"%f\";\n        if (fabs(value) > 0.0 && (fabs(value) < 1e-5 || fabs(value) > 1e12))\n            format = \"%-.13e\";\n        int len = snprintf(buf, maxSize, format, value);\n        assert(len < maxSize);\n\n        // remove a leading zero in the 100s slot in exponent; it is not portable\n        // pattern:   XX...XXXe+0XX or XX...XXXe-0XX\n        if (len > 5) {\n            if (buf[len-5] == 'e' && (buf[len-4] == '+' || buf[len-4] == '-') && buf[len-3] == '0') {\n                buf[len-3] = buf[len-2];\n                buf[len-2] = buf[len-1];\n                buf[len-1] = '\\0';\n            }\n        }\n\n        out.debug << buf;\n\n        switch (extra) {\n        case TOutputTraverser::BinaryDoubleOutput:\n        {\n            uint64_t b;\n            static_assert(sizeof(b) == sizeof(value), \"sizeof(uint64_t) != sizeof(double)\");\n            memcpy(&b, &value, sizeof(b));\n\n            out.debug << \" : \";\n            for (size_t i = 0; i < 8 * sizeof(value); ++i, ++b) {\n                out.debug << ((b & 0x8000000000000000) != 0 ? \"1\" : \"0\");\n                b <<= 1;\n            }\n            break;\n        }\n        default:\n            break;\n        }\n    }\n}\n\nstatic void OutputConstantUnion(TInfoSink& out, const TIntermTyped* node, const TConstUnionArray& constUnion,\n    TOutputTraverser::EExtraOutput extra, int depth)\n{\n    int size = node->getType().computeNumComponents();\n\n    for (int i = 0; i < size; i++) {\n        OutputTreeText(out, node, depth);\n        switch (constUnion[i].getType()) {\n        case EbtBool:\n            if (constUnion[i].getBConst())\n                out.debug << \"true\";\n            else\n                out.debug << \"false\";\n\n            out.debug << \" (\" << \"const bool\" << \")\";\n\n            out.debug << \"\\n\";\n            break;\n        case EbtFloat:\n        case EbtDouble:\n        case EbtFloat16:\n        case EbtBFloat16:\n        case EbtFloatE5M2:\n        case EbtFloatE4M3:\n            OutputDouble(out, constUnion[i].getDConst(), extra);\n            out.debug << \"\\n\";\n            break;\n        case EbtInt8:\n            {\n                const int maxSize = 300;\n                char buf[maxSize];\n                snprintf(buf, maxSize, \"%d (%s)\", constUnion[i].getI8Const(), \"const int8_t\");\n\n                out.debug << buf << \"\\n\";\n            }\n            break;\n        case EbtUint8:\n            {\n                const int maxSize = 300;\n                char buf[maxSize];\n                snprintf(buf, maxSize, \"%u (%s)\", constUnion[i].getU8Const(), \"const uint8_t\");\n\n                out.debug << buf << \"\\n\";\n            }\n            break;\n        case EbtInt16:\n            {\n                const int maxSize = 300;\n                char buf[maxSize];\n                snprintf(buf, maxSize, \"%d (%s)\", constUnion[i].getI16Const(), \"const int16_t\");\n\n                out.debug << buf << \"\\n\";\n            }\n            break;\n        case EbtUint16:\n            {\n                const int maxSize = 300;\n                char buf[maxSize];\n                snprintf(buf, maxSize, \"%u (%s)\", constUnion[i].getU16Const(), \"const uint16_t\");\n\n                out.debug << buf << \"\\n\";\n            }\n            break;\n        case EbtInt:\n            {\n                const int maxSize = 300;\n                char buf[maxSize];\n                snprintf(buf, maxSize, \"%d (%s)\", constUnion[i].getIConst(), \"const int\");\n\n                out.debug << buf << \"\\n\";\n            }\n            break;\n        case EbtUint:\n            {\n                const int maxSize = 300;\n                char buf[maxSize];\n                snprintf(buf, maxSize, \"%u (%s)\", constUnion[i].getUConst(), \"const uint\");\n\n                out.debug << buf << \"\\n\";\n            }\n            break;\n        case EbtInt64:\n            {\n                const int maxSize = 300;\n                char buf[maxSize];\n                snprintf(buf, maxSize, \"%lld (%s)\", constUnion[i].getI64Const(), \"const int64_t\");\n\n                out.debug << buf << \"\\n\";\n            }\n            break;\n        case EbtUint64:\n            {\n                const int maxSize = 300;\n                char buf[maxSize];\n                snprintf(buf, maxSize, \"%llu (%s)\", constUnion[i].getU64Const(), \"const uint64_t\");\n\n                out.debug << buf << \"\\n\";\n            }\n            break;\n        case EbtString:\n            out.debug << \"\\\"\" << constUnion[i].getSConst()->c_str() << \"\\\"\\n\";\n            break;\n        default:\n            out.info.message(EPrefixInternalError, \"Unknown constant\", node->getLoc());\n            break;\n        }\n    }\n}\n\nvoid TOutputTraverser::visitConstantUnion(TIntermConstantUnion* node)\n{\n    OutputTreeText(infoSink, node, depth);\n    infoSink.debug << \"Constant:\\n\";\n\n    OutputConstantUnion(infoSink, node, node->getConstArray(), extraOutput, depth + 1);\n}\n\nvoid TOutputTraverser::visitSymbol(TIntermSymbol* node)\n{\n    OutputTreeText(infoSink, node, depth);\n\n    infoSink.debug << \"'\" << node->getName() << \"' (\" << node->getCompleteString() << \")\\n\";\n\n    if (! node->getConstArray().empty())\n        OutputConstantUnion(infoSink, node, node->getConstArray(), extraOutput, depth + 1);\n    else if (node->getConstSubtree()) {\n        incrementDepth(node);\n        node->getConstSubtree()->traverse(this);\n        decrementDepth();\n    }\n}\n\nbool TOutputTraverser::visitLoop(TVisit /* visit */, TIntermLoop* node)\n{\n    TInfoSink& out = infoSink;\n\n    OutputTreeText(out, node, depth);\n\n    out.debug << \"Loop with condition \";\n    if (! node->testFirst())\n        out.debug << \"not \";\n    out.debug << \"tested first\";\n\n    if (node->getUnroll())\n        out.debug << \": Unroll\";\n    if (node->getDontUnroll())\n        out.debug << \": DontUnroll\";\n    if (node->getLoopDependency()) {\n        out.debug << \": Dependency \";\n        out.debug << node->getLoopDependency();\n    }\n    out.debug << \"\\n\";\n\n    ++depth;\n\n    OutputTreeText(infoSink, node, depth);\n    if (node->getTest()) {\n        out.debug << \"Loop Condition\\n\";\n        node->getTest()->traverse(this);\n    } else\n        out.debug << \"No loop condition\\n\";\n\n    OutputTreeText(infoSink, node, depth);\n    if (node->getBody()) {\n        out.debug << \"Loop Body\\n\";\n        node->getBody()->traverse(this);\n    } else\n        out.debug << \"No loop body\\n\";\n\n    if (node->getTerminal()) {\n        OutputTreeText(infoSink, node, depth);\n        out.debug << \"Loop Terminal Expression\\n\";\n        node->getTerminal()->traverse(this);\n    }\n\n    --depth;\n\n    return false;\n}\n\nbool TOutputTraverser::visitBranch(TVisit /* visit*/, TIntermBranch* node)\n{\n    TInfoSink& out = infoSink;\n\n    OutputTreeText(out, node, depth);\n\n    switch (node->getFlowOp()) {\n    case EOpKill:                   out.debug << \"Branch: Kill\";                  break;\n    case EOpTerminateInvocation:    out.debug << \"Branch: TerminateInvocation\";   break;\n    case EOpIgnoreIntersectionKHR:  out.debug << \"Branch: IgnoreIntersectionKHR\"; break;\n    case EOpTerminateRayKHR:        out.debug << \"Branch: TerminateRayKHR\";       break;\n    case EOpBreak:                  out.debug << \"Branch: Break\";                 break;\n    case EOpContinue:               out.debug << \"Branch: Continue\";              break;\n    case EOpReturn:                 out.debug << \"Branch: Return\";                break;\n    case EOpCase:                   out.debug << \"case: \";                        break;\n    case EOpDemote:                 out.debug << \"Demote\";                        break;\n    case EOpDefault:                out.debug << \"default: \";                     break;\n    default:                        out.debug << \"Branch: Unknown Branch\";        break;\n    }\n\n    if (node->getExpression()) {\n        out.debug << \" with expression\\n\";\n        ++depth;\n        node->getExpression()->traverse(this);\n        --depth;\n    } else\n        out.debug << \"\\n\";\n\n    return false;\n}\n\nbool TOutputTraverser::visitSwitch(TVisit /* visit */, TIntermSwitch* node)\n{\n    TInfoSink& out = infoSink;\n\n    OutputTreeText(out, node, depth);\n    out.debug << \"switch\";\n\n    if (node->getFlatten())\n        out.debug << \": Flatten\";\n    if (node->getDontFlatten())\n        out.debug << \": DontFlatten\";\n    out.debug << \"\\n\";\n\n    OutputTreeText(out, node, depth);\n    out.debug << \"condition\\n\";\n    ++depth;\n    node->getCondition()->traverse(this);\n\n    --depth;\n    OutputTreeText(out, node, depth);\n    out.debug << \"body\\n\";\n    ++depth;\n    node->getBody()->traverse(this);\n\n    --depth;\n\n    return false;\n}\n\n//\n// This function is the one to call externally to start the traversal.\n// Individual functions can be initialized to 0 to skip processing of that\n// type of node.  It's children will still be processed.\n//\nvoid TIntermediate::output(TInfoSink& infoSink, bool tree)\n{\n    infoSink.debug << \"Shader version: \" << version << \"\\n\";\n    if (requestedExtensions.size() > 0) {\n        for (auto extIt = requestedExtensions.begin(); extIt != requestedExtensions.end(); ++extIt)\n            infoSink.debug << \"Requested \" << *extIt << \"\\n\";\n    }\n\n    if (xfbMode)\n        infoSink.debug << \"in xfb mode\\n\";\n\n    if (getSubgroupUniformControlFlow())\n        infoSink.debug << \"subgroup_uniform_control_flow\\n\";\n\n    if (getMaximallyReconverges())\n        infoSink.debug << \"maximally_reconverges\\n\";\n\n    switch (language) {\n    case EShLangVertex:\n        break;\n\n    case EShLangTessControl:\n        infoSink.debug << \"vertices = \" << vertices << \"\\n\";\n\n        if (inputPrimitive != ElgNone)\n            infoSink.debug << \"input primitive = \" << TQualifier::getGeometryString(inputPrimitive) << \"\\n\";\n        if (vertexSpacing != EvsNone)\n            infoSink.debug << \"vertex spacing = \" << TQualifier::getVertexSpacingString(vertexSpacing) << \"\\n\";\n        if (vertexOrder != EvoNone)\n            infoSink.debug << \"triangle order = \" << TQualifier::getVertexOrderString(vertexOrder) << \"\\n\";\n        break;\n\n    case EShLangTessEvaluation:\n        infoSink.debug << \"input primitive = \" << TQualifier::getGeometryString(inputPrimitive) << \"\\n\";\n        infoSink.debug << \"vertex spacing = \" << TQualifier::getVertexSpacingString(vertexSpacing) << \"\\n\";\n        infoSink.debug << \"triangle order = \" << TQualifier::getVertexOrderString(vertexOrder) << \"\\n\";\n        if (pointMode)\n            infoSink.debug << \"using point mode\\n\";\n        break;\n\n    case EShLangGeometry:\n        infoSink.debug << \"invocations = \" << invocations << \"\\n\";\n        infoSink.debug << \"max_vertices = \" << vertices << \"\\n\";\n        infoSink.debug << \"input primitive = \" << TQualifier::getGeometryString(inputPrimitive) << \"\\n\";\n        infoSink.debug << \"output primitive = \" << TQualifier::getGeometryString(outputPrimitive) << \"\\n\";\n        break;\n\n    case EShLangFragment:\n        if (pixelCenterInteger)\n            infoSink.debug << \"gl_FragCoord pixel center is integer\\n\";\n        if (originUpperLeft)\n            infoSink.debug << \"gl_FragCoord origin is upper left\\n\";\n        if (earlyFragmentTests)\n            infoSink.debug << \"using early_fragment_tests\\n\";\n        if (postDepthCoverage)\n            infoSink.debug << \"using post_depth_coverage\\n\";\n        if (nonCoherentColorAttachmentReadEXT)\n            infoSink.debug << \"using non_coherent_color_attachment_readEXT\\n\";\n        if (nonCoherentDepthAttachmentReadEXT)\n            infoSink.debug << \"using non_coherent_depth_attachment_readEXT\\n\";\n        if (nonCoherentStencilAttachmentReadEXT)\n            infoSink.debug << \"using non_coherent_stencil_attachment_readEXT\\n\";\n        if (nonCoherentTileAttachmentReadQCOM)\n            infoSink.debug << \"using non_coherent_attachment_readQCOM\\n\";\n        if (depthLayout != EldNone)\n            infoSink.debug << \"using \" << TQualifier::getLayoutDepthString(depthLayout) << \"\\n\";\n        if (blendEquations != 0) {\n            infoSink.debug << \"using\";\n            // blendEquations is a mask, decode it\n            for (TBlendEquationShift be = (TBlendEquationShift)0; be < EBlendCount; be = (TBlendEquationShift)(be + 1)) {\n                if (blendEquations & (1 << be))\n                    infoSink.debug << \" \" << TQualifier::getBlendEquationString(be);\n            }\n            infoSink.debug << \"\\n\";\n        }\n        if (interlockOrdering != EioNone)\n            infoSink.debug << \"interlock ordering = \" << TQualifier::getInterlockOrderingString(interlockOrdering) << \"\\n\";\n        break;\n\n    case EShLangMesh:\n        infoSink.debug << \"max_vertices = \" << vertices << \"\\n\";\n        infoSink.debug << \"max_primitives = \" << primitives << \"\\n\";\n        infoSink.debug << \"output primitive = \" << TQualifier::getGeometryString(outputPrimitive) << \"\\n\";\n        [[fallthrough]];\n    case EShLangTask:\n        // Fall through\n    case EShLangCompute:\n        infoSink.debug << \"local_size = (\" << localSize[0] << \", \" << localSize[1] << \", \" << localSize[2] << \")\\n\";\n        {\n            if (localSizeSpecId[0] != TQualifier::layoutNotSet ||\n                localSizeSpecId[1] != TQualifier::layoutNotSet ||\n                localSizeSpecId[2] != TQualifier::layoutNotSet) {\n                infoSink.debug << \"local_size ids = (\" <<\n                    localSizeSpecId[0] << \", \" <<\n                    localSizeSpecId[1] << \", \" <<\n                    localSizeSpecId[2] << \")\\n\";\n            }\n        }\n        if (nonCoherentTileAttachmentReadQCOM)\n            infoSink.debug << \"using non_coherent_attachment_readQCOM\\n\";\n        if (isTileShadingRateQCOMSet()) {\n            infoSink.debug << \"shading_rateQCOM = (\" << tileShadingRateQCOM[0] << \", \"\n                                                     << tileShadingRateQCOM[1] << \", \"\n                                                     << tileShadingRateQCOM[2] << \")\\n\";\n        }\n        break;\n\n    default:\n        break;\n    }\n\n    if (treeRoot == nullptr || ! tree)\n        return;\n\n    TOutputTraverser it(infoSink);\n    if (getBinaryDoubleOutput())\n        it.setDoubleOutput(TOutputTraverser::BinaryDoubleOutput);\n    treeRoot->traverse(&it);\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/iomapper.cpp",
    "content": "//\n// Copyright (C) 2016-2017 LunarG, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#include \"../Include/Common.h\"\n#include \"../Include/InfoSink.h\"\n#include \"../Include/Types.h\"\n\n#include \"gl_types.h\"\n#include \"iomapper.h\"\n#include \"LiveTraverser.h\"\n#include \"SymbolTable.h\"\n\n//\n// Map IO bindings.\n//\n// High-level algorithm for one stage:\n//\n// 1. Traverse all code (live+dead) to find the explicitly provided bindings.\n//\n// 2. Traverse (just) the live code to determine which non-provided bindings\n//    require auto-numbering.  We do not auto-number dead ones.\n//\n// 3. Traverse all the code to apply the bindings:\n//    a. explicitly given bindings are offset according to their type\n//    b. implicit live bindings are auto-numbered into the holes, using\n//       any open binding slot.\n//    c. implicit dead bindings are left un-bound.\n//\n\nnamespace glslang {\n\nstruct TVarEntryInfo {\n    long long id;\n    TIntermSymbol* symbol;\n    bool live;\n    TLayoutPacking upgradedToPushConstantPacking; // ElpNone means it hasn't been upgraded\n    int newBinding;\n    int newSet;\n    int newLocation;\n    int newComponent;\n    int newIndex;\n    EShLanguage stage;\n\n    void clearNewAssignments() {\n        upgradedToPushConstantPacking = ElpNone;\n        newBinding = -1;\n        newSet = -1;\n        newLocation = -1;\n        newComponent = -1;\n        newIndex = -1;\n    }\n\n    struct TOrderById {\n        inline bool operator()(const TVarEntryInfo& l, const TVarEntryInfo& r) { return l.id < r.id; }\n    };\n\n    struct TOrderByPriority {\n        // ordering:\n        // 1) has both binding and set\n        // 2) has binding but no set\n        // 3) has no binding but set\n        // 4) has no binding and no set\n        inline bool operator()(const TVarEntryInfo& l, const TVarEntryInfo& r) {\n            const TQualifier& lq = l.symbol->getQualifier();\n            const TQualifier& rq = r.symbol->getQualifier();\n\n            // simple rules:\n            // has binding gives 2 points\n            // has set gives 1 point\n            // who has the most points is more important.\n            int lPoints = (lq.hasBinding() ? 2 : 0) + (lq.hasSet() ? 1 : 0);\n            int rPoints = (rq.hasBinding() ? 2 : 0) + (rq.hasSet() ? 1 : 0);\n\n            if (lPoints == rPoints)\n                return l.id < r.id;\n            return lPoints > rPoints;\n        }\n    };\n\n    struct TOrderByPriorityAndLive {\n        // ordering:\n        // 1) do live variables first\n        // 2) has both binding and set\n        // 3) has binding but no set\n        // 4) has no binding but set\n        // 5) has no binding and no set\n        inline bool operator()(const TVarEntryInfo& l, const TVarEntryInfo& r) {\n\n            const TQualifier& lq = l.symbol->getQualifier();\n            const TQualifier& rq = r.symbol->getQualifier();\n\n            // simple rules:\n            // has binding gives 2 points\n            // has set gives 1 point\n            // who has the most points is more important.\n            int lPoints = (lq.hasBinding() ? 2 : 0) + (lq.hasSet() ? 1 : 0);\n            int rPoints = (rq.hasBinding() ? 2 : 0) + (rq.hasSet() ? 1 : 0);\n\n            if (l.live != r.live)\n                return l.live > r.live;\n\n            if (lPoints != rPoints)\n                return lPoints > rPoints;\n\n            return l.id < r.id;\n        }\n    };\n};\n\n// override function \"operator=\", if a vector<const _Kty, _Ty> being sort,\n// when use vc++, the sort function will call :\n// pair& operator=(const pair<_Other1, _Other2>& _Right)\n// {\n//     first = _Right.first;\n//     second = _Right.second;\n//     return (*this);\n// }\n// that will make a const type handing on left.\n// override this function can avoid a compiler error.\n// In the future, if the vc++ compiler can handle such a situation,\n// this part of the code will be removed.\nstruct TVarLivePair : std::pair<const TString, TVarEntryInfo> {\n    TVarLivePair(const std::pair<const TString, TVarEntryInfo>& _Right) : pair(_Right.first, _Right.second) {}\n    TVarLivePair& operator=(const TVarLivePair& _Right) {\n        const_cast<TString&>(first) = _Right.first;\n        second = _Right.second;\n        return (*this);\n    }\n    TVarLivePair(const TVarLivePair& src) : pair(src) { }\n};\ntypedef std::vector<TVarLivePair> TVarLiveVector;\n\n\nclass TVarGatherTraverser : public TLiveTraverser {\npublic:\n    TVarGatherTraverser(const TIntermediate& i, bool traverseDeadCode, TVarLiveMap& inList, TVarLiveMap& outList, TVarLiveMap& uniformList)\n      : TLiveTraverser(i, traverseDeadCode, true, true, false)\n      , inputList(inList)\n      , outputList(outList)\n      , uniformList(uniformList)\n    {\n    }\n\n    virtual void visitSymbol(TIntermSymbol* base)\n    {\n        TVarLiveMap* target = nullptr;\n        if (base->getQualifier().storage == EvqVaryingIn)\n            target = &inputList;\n        else if (base->getQualifier().storage == EvqVaryingOut)\n            target = &outputList;\n        else if (base->getQualifier().isUniformOrBuffer() && !base->getQualifier().isPushConstant() && !base->getQualifier().isShaderRecord())\n            target = &uniformList;\n        // If a global is being visited, then we should also traverse it incase it's evaluation\n        // ends up visiting inputs we want to tag as live\n        else if (base->getQualifier().storage == EvqGlobal)\n            addGlobalReference(base->getAccessName());\n\n        if (target) {\n            TVarEntryInfo ent = {base->getId(), base, ! traverseAll, {}, {}, {}, {}, {}, {}, {}};\n            ent.stage = intermediate.getStage();\n            TVarLiveMap::iterator at = target->find(\n                ent.symbol->getAccessName()); // std::lower_bound(target->begin(), target->end(), ent, TVarEntryInfo::TOrderById());\n            if (at != target->end() && at->second.id == ent.id)\n                at->second.live = at->second.live || ! traverseAll; // update live state\n            else\n                (*target)[ent.symbol->getAccessName()] = ent;\n        }\n    }\n\nprivate:\n    TVarLiveMap&    inputList;\n    TVarLiveMap&    outputList;\n    TVarLiveMap&    uniformList;\n};\n\nclass TVarSetTraverser : public TLiveTraverser\n{\npublic:\n    TVarSetTraverser(const TIntermediate& i, const TVarLiveMap& inList, const TVarLiveMap& outList, const TVarLiveMap& uniformList)\n      : TLiveTraverser(i, true, true, true, false)\n      , inputList(inList)\n      , outputList(outList)\n      , uniformList(uniformList)\n    {\n    }\n\n    virtual void visitSymbol(TIntermSymbol* base) {\n        const TVarLiveMap* source;\n        if (base->getQualifier().storage == EvqVaryingIn)\n            source = &inputList;\n        else if (base->getQualifier().storage == EvqVaryingOut)\n            source = &outputList;\n        else if (base->getQualifier().isUniformOrBuffer())\n            source = &uniformList;\n        else\n            return;\n\n        TVarEntryInfo ent = { base->getId(), {}, {}, {}, {}, {}, {}, {}, {}, {} };\n        // Fix a defect, when block has no instance name, we need to find its block name\n        TVarLiveMap::const_iterator at = source->find(base->getAccessName());\n        if (at == source->end())\n            return;\n\n        if (at->second.id != ent.id)\n            return;\n\n        if (at->second.newBinding != -1)\n            base->getWritableType().getQualifier().layoutBinding = at->second.newBinding;\n        if (at->second.newSet != -1)\n            base->getWritableType().getQualifier().layoutSet = at->second.newSet;\n        if (at->second.newLocation != -1)\n            base->getWritableType().getQualifier().layoutLocation = at->second.newLocation;\n        if (at->second.newComponent != -1)\n            base->getWritableType().getQualifier().layoutComponent = at->second.newComponent;\n        if (at->second.newIndex != -1)\n            base->getWritableType().getQualifier().layoutIndex = at->second.newIndex;\n        if (at->second.upgradedToPushConstantPacking != ElpNone) {\n            base->getWritableType().getQualifier().layoutPushConstant = true;\n            base->getWritableType().getQualifier().setBlockStorage(EbsPushConstant);\n            base->getWritableType().getQualifier().layoutPacking = at->second.upgradedToPushConstantPacking;\n        }\n    }\n\n  private:\n    const TVarLiveMap&    inputList;\n    const TVarLiveMap&    outputList;\n    const TVarLiveMap&    uniformList;\n};\n\nstruct TNotifyUniformAdaptor\n{\n    EShLanguage stage;\n    TIoMapResolver& resolver;\n    inline TNotifyUniformAdaptor(EShLanguage s, TIoMapResolver& r)\n      : stage(s)\n      , resolver(r)\n    {\n    }\n\n    inline void operator()(std::pair<const TString, TVarEntryInfo>& entKey)\n    {\n        resolver.notifyBinding(stage, entKey.second);\n    }\n\nprivate:\n    TNotifyUniformAdaptor& operator=(TNotifyUniformAdaptor&) = delete;\n};\n\nstruct TNotifyInOutAdaptor\n{\n    EShLanguage stage;\n    TIoMapResolver& resolver;\n    inline TNotifyInOutAdaptor(EShLanguage s, TIoMapResolver& r)\n      : stage(s)\n      , resolver(r)\n    {\n    }\n\n    inline void operator()(std::pair<const TString, TVarEntryInfo>& entKey)\n    {\n        resolver.notifyInOut(entKey.second.stage, entKey.second);\n    }\n\nprivate:\n    TNotifyInOutAdaptor& operator=(TNotifyInOutAdaptor&) = delete;\n};\n\nstruct TResolverUniformAdaptor {\n    TResolverUniformAdaptor(EShLanguage s, TIoMapResolver& r, TVarLiveMap* uniform[EShLangCount], TInfoSink& i, bool& e)\n      : stage(s)\n      , resolver(r)\n      , infoSink(i)\n      , error(e)\n    {\n        memcpy(uniformVarMap, uniform, EShLangCount * (sizeof(TVarLiveMap*)));\n    }\n\n    inline void operator()(std::pair<const TString, TVarEntryInfo>& entKey) {\n        TVarEntryInfo& ent = entKey.second;\n        ent.clearNewAssignments();\n        const bool isValid = resolver.validateBinding(stage, ent);\n        if (isValid) {\n            resolver.resolveSet(ent.stage, ent);\n            resolver.resolveBinding(ent.stage, ent);\n            resolver.resolveUniformLocation(ent.stage, ent);\n\n            if (ent.newBinding != -1) {\n                if (ent.newBinding >= int(TQualifier::layoutBindingEnd)) {\n                    TString err = \"mapped binding out of range: \" + entKey.first;\n\n                    infoSink.info.message(EPrefixInternalError, err.c_str());\n                    error = true;\n                }\n\n                if (ent.symbol->getQualifier().hasBinding()) {\n                    for (uint32_t idx = EShLangVertex; idx < EShLangCount; ++idx) {\n                        if (idx == ent.stage || uniformVarMap[idx] == nullptr)\n                            continue;\n                        auto entKey2 = uniformVarMap[idx]->find(entKey.first);\n                        if (entKey2 != uniformVarMap[idx]->end()) {\n                            entKey2->second.newBinding = ent.newBinding;\n                        }\n                    }\n                }\n            }\n            if (ent.newSet != -1) {\n                if (ent.newSet >= int(TQualifier::layoutSetEnd)) {\n                    TString err = \"mapped set out of range: \" + entKey.first;\n\n                    infoSink.info.message(EPrefixInternalError, err.c_str());\n                    error = true;\n                }\n                if (ent.symbol->getQualifier().hasSet()) {\n                    for (uint32_t idx = EShLangVertex; idx < EShLangCount; ++idx) {\n                        if ((idx == stage) || (uniformVarMap[idx] == nullptr))\n                            continue;\n                        auto entKey2 = uniformVarMap[idx]->find(entKey.first);\n                        if (entKey2 != uniformVarMap[idx]->end()) {\n                            entKey2->second.newSet = ent.newSet;\n                        }\n                    }\n                }\n            }\n        } else {\n            TString errorMsg = \"Invalid binding: \" + entKey.first;\n            infoSink.info.message(EPrefixInternalError, errorMsg.c_str());\n            error = true;\n        }\n    }\n\n    inline void setStage(EShLanguage s) { stage = s; }\n\n    EShLanguage     stage;\n    TIoMapResolver& resolver;\n    TInfoSink&      infoSink;\n    bool&           error;\n    TVarLiveMap*    uniformVarMap[EShLangCount];\nprivate:\n    TResolverUniformAdaptor& operator=(TResolverUniformAdaptor&) = delete;\n};\n\nstruct TResolverInOutAdaptor {\n    TResolverInOutAdaptor(EShLanguage s, TIoMapResolver& r, TInfoSink& i, bool& e)\n      : stage(s)\n      , resolver(r)\n      , infoSink(i)\n      , error(e)\n    {\n    }\n\n    inline void operator()(std::pair<const TString, TVarEntryInfo>& entKey)\n    {\n        TVarEntryInfo& ent = entKey.second;\n        ent.clearNewAssignments();\n        const bool isValid = resolver.validateInOut(ent.stage, ent);\n        if (isValid) {\n            resolver.resolveInOutLocation(stage, ent);\n            resolver.resolveInOutComponent(stage, ent);\n            resolver.resolveInOutIndex(stage, ent);\n        } else {\n            TString errorMsg;\n            if (ent.symbol->getType().getQualifier().semanticName != nullptr) {\n                errorMsg = \"Invalid shader In/Out variable semantic: \";\n                errorMsg += ent.symbol->getType().getQualifier().semanticName;\n            } else {\n                errorMsg = \"Invalid shader In/Out variable: \";\n                errorMsg += ent.symbol->getName();\n            }\n            infoSink.info.message(EPrefixInternalError, errorMsg.c_str());\n            error = true;\n        }\n    }\n\n    inline void setStage(EShLanguage s) { stage = s; }\n\n    EShLanguage     stage;\n    TIoMapResolver& resolver;\n    TInfoSink&      infoSink;\n    bool&           error;\n\nprivate:\n    TResolverInOutAdaptor& operator=(TResolverInOutAdaptor&) = delete;\n};\n\n// The class is used for reserving explicit uniform locations and ubo/ssbo/opaque bindings\n// xxTODO: maybe this logic should be moved into the resolver's \"validateInOut\" and \"validateUniform\"\n\nstruct TSymbolValidater\n{\n    TSymbolValidater(TIoMapResolver& r, TInfoSink& i, TVarLiveMap* in[EShLangCount], TVarLiveMap* out[EShLangCount],\n                     TVarLiveMap* uniform[EShLangCount], bool& hadError, EProfile profile, int version)\n        : resolver(r)\n        , infoSink(i)\n        , hadError(hadError)\n        , profile(profile)\n        , version(version)\n    {\n        memcpy(inVarMaps, in, EShLangCount * (sizeof(TVarLiveMap*)));\n        memcpy(outVarMaps, out, EShLangCount * (sizeof(TVarLiveMap*)));\n        memcpy(uniformVarMap, uniform, EShLangCount * (sizeof(TVarLiveMap*)));\n\n        std::map<TString, TString> anonymousMemberMap;\n        std::vector<TRange> usedUniformLocation;\n        std::vector<TString> usedUniformName;\n        usedUniformLocation.clear();\n        usedUniformName.clear();\n        for (int i = 0; i < EShLangCount; i++) {\n            if (uniformVarMap[i]) {\n                for (auto uniformVar : *uniformVarMap[i])\n                {\n                    TIntermSymbol* pSymbol = uniformVar.second.symbol;\n                    TQualifier qualifier = uniformVar.second.symbol->getQualifier();\n                    TString symbolName = pSymbol->getAccessName();\n\n                    // All the uniform needs multi-stage location check (block/default)\n                    int uniformLocation = qualifier.layoutLocation;\n\n                    if (uniformLocation != TQualifier::layoutLocationEnd) {\n                        // Total size of current uniform, could be block, struct or other types.\n                        int size = TIntermediate::computeTypeUniformLocationSize(pSymbol->getType());\n\n                        TRange locationRange(uniformLocation, uniformLocation + size - 1);\n\n                        // Combine location and component ranges\n                        int overlapLocation = -1;\n                        bool diffLocation = false;\n\n                        // Check for collisions, except for vertex inputs on desktop targeting OpenGL\n                        overlapLocation = checkLocationOverlap(locationRange, usedUniformLocation, symbolName, usedUniformName, diffLocation);\n\n                        // Overlap locations of uniforms, regardless of components (multi stages)\n                        if (overlapLocation == -1) {\n                            usedUniformLocation.push_back(locationRange);\n                            usedUniformName.push_back(symbolName);\n                        }\n                        else if (overlapLocation >= 0) {\n                            if (diffLocation == true) {\n                                TString err = (\"Uniform location should be equal for same uniforms: \" +std::to_string(overlapLocation)).c_str();\n                                infoSink.info.message(EPrefixInternalError, err.c_str());\n                                hadError = true;\n                                break;\n                            }\n                            else {\n                                TString err = (\"Uniform location overlaps across stages: \" + std::to_string(overlapLocation)).c_str();\n                                infoSink.info.message(EPrefixInternalError, err.c_str());\n                                hadError = true;\n                                break;\n                            }\n                        }\n                    }\n\n                    if ((uniformVar.second.symbol->getBasicType() == EbtBlock) &&\n                        IsAnonymous(uniformVar.second.symbol->getName()))\n                    {\n                        auto blockType = uniformVar.second.symbol->getType().getStruct();\n                        for (size_t memberIdx = 0; memberIdx < blockType->size(); ++memberIdx) {\n                            auto memberName = (*blockType)[memberIdx].type->getFieldName();\n                            if (anonymousMemberMap.find(memberName) != anonymousMemberMap.end())\n                            {\n                                if (anonymousMemberMap[memberName] != uniformVar.second.symbol->getType().getTypeName())\n                                {\n                                    TString err = \"Invalid block member name: \" + memberName;\n                                    infoSink.info.message(EPrefixInternalError, err.c_str());\n                                    hadError = true;\n                                    break;\n                                }\n                            }\n                            else\n                            {\n                                anonymousMemberMap[memberName] = uniformVar.second.symbol->getType().getTypeName();\n                            }\n                        }\n                    }\n                    if (hadError)\n                        break;\n                }\n            }\n        }\n    }\n\n    // In case we need to new an intermediate, which costs too much\n    int checkLocationOverlap(const TRange& locationRange, std::vector<TRange>& usedUniformLocation, const TString symbolName, std::vector<TString>& usedUniformName, bool& diffLocation)\n    {\n        for (size_t r = 0; r < usedUniformLocation.size(); ++r) {\n            if (usedUniformName[r] == symbolName) {\n                diffLocation = true;\n                return (usedUniformLocation[r].start == locationRange.start &&\n                        usedUniformLocation[r].last == locationRange.last)\n                       ? -2 : std::max(locationRange.start, usedUniformLocation[r].start);\n            }\n            if (locationRange.overlap(usedUniformLocation[r])) {\n                // there is a collision; pick one\n                return std::max(locationRange.start, usedUniformLocation[r].start);\n            }\n        }\n\n        return -1; // no collision\n    }\n\n    inline void operator()(std::pair<const TString, TVarEntryInfo>& entKey) {\n        TVarEntryInfo& ent1 = entKey.second;\n        TIntermSymbol* base = ent1.symbol;\n        const TType& type = ent1.symbol->getType();\n        const TString& name = entKey.first;\n        TString mangleName1, mangleName2;\n        EShLanguage stage = ent1.stage;\n        EShLanguage preStage, currentStage, nextStage;\n\n        preStage = EShLangCount;\n        for (int i = stage - 1; i >= 0; i--) {\n            if (inVarMaps[i] != nullptr) {\n                preStage = static_cast<EShLanguage>(i);\n                break;\n            }\n        }\n        currentStage = stage;\n        nextStage = EShLangCount;\n        for (int i = stage + 1; i < EShLangCount; i++) {\n            if (inVarMaps[i] != nullptr) {\n                nextStage = static_cast<EShLanguage>(i);\n                break;\n            }\n        }\n\n        if (type.getQualifier().isArrayedIo(stage)) {\n            TType subType(type, 0);\n            subType.appendMangledName(mangleName1);\n        } else {\n            type.appendMangledName(mangleName1);\n        }\n\n\n        // basic checking that symbols match\n        // more extensive checking in the link stage\n        if (base->getQualifier().storage == EvqVaryingIn) {\n            // validate stage in;\n            if (preStage == EShLangCount)\n                return;\n            if (TSymbolTable::isBuiltInSymbol(base->getId()))\n                return;\n            if (outVarMaps[preStage] != nullptr) {\n                auto ent2 = outVarMaps[preStage]->find(name);\n                uint32_t location = base->getType().getQualifier().layoutLocation;\n                if (ent2 == outVarMaps[preStage]->end() &&\n                    location != glslang::TQualifier::layoutLocationEnd) {\n                    for (auto var = outVarMaps[preStage]->begin(); var != ent2; var++) {\n                        if (var->second.symbol->getType().getQualifier().layoutLocation == location) {\n                            ent2 = var;\n                            break;\n                        }\n                    }\n                }\n                if (ent2 != outVarMaps[preStage]->end()) {\n                    auto& type1 = base->getType();\n                    auto& type2 = ent2->second.symbol->getType();\n                    hadError = hadError || typeCheck(&type1, &type2, name.c_str(), false);\n                    if (ent2->second.symbol->getType().getQualifier().isArrayedIo(preStage)) {\n                        TType subType(ent2->second.symbol->getType(), 0);\n                        subType.appendMangledName(mangleName2);\n                    } else {\n                        ent2->second.symbol->getType().appendMangledName(mangleName2);\n                    }\n\n                    if (mangleName1 == mangleName2) {\n                        // For ES 3.0 only, other versions have no such restrictions\n                        // According to ES 3.0 spec: The type and presence of the interpolation qualifiers and\n                        // storage qualifiers  of variables with the same name declared in all linked shaders must\n                        // match, otherwise the link command will fail.\n                        if (profile == EEsProfile && version == 300) {\n                            // Don't need to check smooth qualifier, as it uses the default interpolation mode\n                            if (ent1.stage == EShLangFragment && type1.isBuiltIn() == false) {\n                                if (type1.getQualifier().flat != type2.getQualifier().flat ||\n                                    type1.getQualifier().nopersp != type2.getQualifier().nopersp) {\n                                    TString err = \"Interpolation qualifier mismatch : \" + entKey.first;\n                                    infoSink.info.message(EPrefixInternalError, err.c_str());\n                                    hadError = true;\n                                }\n                            }\n                        }\n                        return;\n                    }\n                    else {\n                        // Deal with input/output pairs where one is a block member but the other is loose,\n                        // e.g. with ARB_separate_shader_objects\n                        if (type1.getBasicType() == EbtBlock &&\n                            type1.isStruct() && !type2.isStruct()) {\n                            // Iterate through block members tracking layout\n                            glslang::TString name;\n                            type1.getStruct()->begin()->type->appendMangledName(name);\n                            if (name == mangleName2\n                                && type1.getQualifier().layoutLocation == type2.getQualifier().layoutLocation) return;\n                        }\n                        if (type2.getBasicType() == EbtBlock &&\n                            type2.isStruct() && !type1.isStruct()) {\n                            // Iterate through block members tracking layout\n                            glslang::TString name;\n                            type2.getStruct()->begin()->type->appendMangledName(name);\n                            if (name == mangleName1\n                                && type1.getQualifier().layoutLocation == type2.getQualifier().layoutLocation) return;\n                        }\n                        TString err = \"Invalid In/Out variable type : \" + entKey.first;\n                        infoSink.info.message(EPrefixInternalError, err.c_str());\n                        hadError = true;\n                    }\n                }\n                else if (!base->getType().isBuiltIn()) {\n                    // According to spec: A link error is generated if any statically referenced input variable\n                    // or block does not have a matching output\n                    if (profile == EEsProfile && ent1.live) {\n                        hadError = true;\n                        TString errorStr = name + \": not been declare as a output variable in pre shader stage.\";\n                        infoSink.info.message(EPrefixError, errorStr.c_str());\n                    }\n                }\n                return;\n            }\n        } else if (base->getQualifier().storage == EvqVaryingOut) {\n            // validate stage out;\n            if (nextStage == EShLangCount)\n                return;\n            if (TSymbolTable::isBuiltInSymbol(base->getId()))\n                return;\n            if (inVarMaps[nextStage] != nullptr) {\n                auto ent2 = inVarMaps[nextStage]->find(name);\n                if (ent2 != inVarMaps[nextStage]->end()) {\n                    if (ent2->second.symbol->getType().getQualifier().isArrayedIo(nextStage)) {\n                        TType subType(ent2->second.symbol->getType(), 0);\n                        subType.appendMangledName(mangleName2);\n                    } else {\n                        ent2->second.symbol->getType().appendMangledName(mangleName2);\n                    }\n                    if (mangleName1 == mangleName2)\n                        return;\n                    else {\n                        TString err = \"Invalid In/Out variable type : \" + entKey.first;\n                        infoSink.info.message(EPrefixInternalError, err.c_str());\n                        hadError = true;\n                    }\n                }\n                return;\n            }\n        } else if (base->getQualifier().isUniformOrBuffer() && !base->getQualifier().isPushConstant()) {\n            // validate uniform type;\n            for (int i = 0; i < EShLangCount; i++) {\n                if (i != currentStage && outVarMaps[i] != nullptr) {\n                    auto ent2 = uniformVarMap[i]->find(name);\n                    if (ent2 != uniformVarMap[i]->end()) {\n                        ent2->second.symbol->getType().appendMangledName(mangleName2);\n                        if (mangleName1 != mangleName2) {\n                            ent2->second.symbol->getType().sameElementType(type);\n                            TString err = \"Invalid Uniform variable type : \" + entKey.first;\n                            infoSink.info.message(EPrefixInternalError, err.c_str());\n                            hadError = true;\n                        }\n                        mangleName2.clear();\n\n                        // validate instance name of blocks\n                        if (hadError == false &&\n                            base->getType().getBasicType() == EbtBlock &&\n                            IsAnonymous(base->getName()) != IsAnonymous(ent2->second.symbol->getName())) {\n                            TString err = \"Matched uniform block names must also either all be lacking \"\n                                          \"an instance name or all having an instance name: \" + entKey.first;\n                            infoSink.info.message(EPrefixInternalError, err.c_str());\n                            hadError = true;\n                        }\n\n                        // validate uniform block member qualifier and member names\n                        auto& type1 = base->getType();\n                        auto& type2 = ent2->second.symbol->getType();\n                        if (hadError == false && base->getType().getBasicType() == EbtBlock) {\n                            hadError = hadError || typeCheck(&type1, &type2, name.c_str(), true);\n                        }\n                        else {\n                            hadError = hadError || typeCheck(&type1, &type2, name.c_str(), false);\n                        }\n                    }\n                    else if (base->getBasicType() == EbtBlock)\n                    {\n                        if (IsAnonymous(base->getName()))\n                        {\n                            // The name of anonymous block member can't same with default uniform variable.\n                            auto blockType1 = base->getType().getStruct();\n                            for (size_t memberIdx = 0; memberIdx < blockType1->size(); ++memberIdx) {\n                                auto memberName = (*blockType1)[memberIdx].type->getFieldName();\n                                if (uniformVarMap[i]->find(memberName) != uniformVarMap[i]->end())\n                                {\n                                    TString err = \"Invalid Uniform variable name : \" + memberName;\n                                    infoSink.info.message(EPrefixInternalError, err.c_str());\n                                    hadError = true;\n                                    break;\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    TVarLiveMap *inVarMaps[EShLangCount], *outVarMaps[EShLangCount], *uniformVarMap[EShLangCount];\n\n    // Use for mark current shader stage for resolver\n    TIoMapResolver& resolver;\n    TInfoSink& infoSink;\n    bool& hadError;\n    EProfile profile;\n    int version;\n\nprivate:\n    TSymbolValidater& operator=(TSymbolValidater&) = delete;\n\n    bool qualifierCheck(const TType* const type1, const TType* const type2, const std::string& name, bool isBlock)\n    {\n        bool hasError = false;\n        const TQualifier& qualifier1 = type1->getQualifier();\n        const TQualifier& qualifier2 = type2->getQualifier();\n\n        if (((isBlock == false) &&\n            (type1->getQualifier().storage == EvqUniform && type2->getQualifier().storage == EvqUniform)) ||\n            (type1->getQualifier().storage == EvqGlobal && type2->getQualifier().storage == EvqGlobal)) {\n            if (qualifier1.precision != qualifier2.precision) {\n                hasError = true;\n                std::string errorStr = name + \": have precision conflict cross stage.\";\n                infoSink.info.message(EPrefixError, errorStr.c_str());\n            }\n            if (qualifier1.hasFormat() && qualifier2.hasFormat()) {\n                if (qualifier1.layoutFormat != qualifier2.layoutFormat) {\n                    hasError = true;\n                    std::string errorStr = name + \": have layout format conflict cross stage.\";\n                    infoSink.info.message(EPrefixError, errorStr.c_str());\n                }\n\n            }\n        }\n\n        if (isBlock == true) {\n            if (qualifier1.layoutPacking != qualifier2.layoutPacking) {\n                hasError = true;\n                std::string errorStr = name + \": have layoutPacking conflict cross stage.\";\n                infoSink.info.message(EPrefixError, errorStr.c_str());\n            }\n            if (qualifier1.layoutMatrix != qualifier2.layoutMatrix) {\n                hasError = true;\n                std::string errorStr = name + \": have layoutMatrix conflict cross stage.\";\n                infoSink.info.message(EPrefixError, errorStr.c_str());\n            }\n            if (qualifier1.layoutOffset != qualifier2.layoutOffset) {\n                hasError = true;\n                std::string errorStr = name + \": have layoutOffset conflict cross stage.\";\n                infoSink.info.message(EPrefixError, errorStr.c_str());\n            }\n            if (qualifier1.layoutAlign != qualifier2.layoutAlign) {\n                hasError = true;\n                std::string errorStr = name + \": have layoutAlign conflict cross stage.\";\n                infoSink.info.message(EPrefixError, errorStr.c_str());\n            }\n        }\n\n        return hasError;\n    }\n\n    bool typeCheck(const TType* const type1, const TType* const type2, const std::string& name, bool isBlock)\n    {\n        bool hasError = false;\n        if (!(type1->isStruct() && type2->isStruct())) {\n            hasError = hasError || qualifierCheck(type1, type2, name, isBlock);\n        }\n        else {\n            if (type1->getBasicType() == EbtBlock && type2->getBasicType() == EbtBlock)\n                isBlock = true;\n            const TTypeList* typeList1 = type1->getStruct();\n            const TTypeList* typeList2 = type2->getStruct();\n\n            std::string newName = name;\n            size_t memberCount = typeList1->size();\n            size_t index2 = 0;\n            for (size_t index = 0; index < memberCount; index++, index2++) {\n                // Skip inactive member\n                if (typeList1->at(index).type->getBasicType() == EbtVoid)\n                    continue;\n                while (index2 < typeList2->size() && typeList2->at(index2).type->getBasicType() == EbtVoid) {\n                    ++index2;\n                }\n\n                // TypeList1 has more members in list\n                if (index2 == typeList2->size()) {\n                    std::string errorStr = name + \": struct mismatch.\";\n                    infoSink.info.message(EPrefixError, errorStr.c_str());\n                    hasError = true;\n                    break;\n                }\n\n                if (typeList1->at(index).type->getFieldName() != typeList2->at(index2).type->getFieldName()) {\n                    std::string errorStr = name + \": member name mismatch.\";\n                    infoSink.info.message(EPrefixError, errorStr.c_str());\n                    hasError = true;\n                }\n                else {\n                    newName = typeList1->at(index).type->getFieldName().c_str();\n                }\n                hasError = hasError || typeCheck(typeList1->at(index).type, typeList2->at(index2).type, newName, isBlock);\n            }\n\n            while (index2 < typeList2->size())\n            {\n                // TypeList2 has more members\n                if (typeList2->at(index2).type->getBasicType() != EbtVoid) {\n                    std::string errorStr = name + \": struct mismatch.\";\n                    infoSink.info.message(EPrefixError, errorStr.c_str());\n                    hasError = true;\n                    break;\n                }\n                ++index2;\n            }\n        }\n        return hasError;\n    }\n};\n\nstruct TSlotCollector {\n    TSlotCollector(TIoMapResolver& r, TInfoSink& i) : resolver(r), infoSink(i) { }\n\n    inline void operator()(std::pair<const TString, TVarEntryInfo>& entKey) {\n        resolver.reserverStorageSlot(entKey.second, infoSink);\n        resolver.reserverResourceSlot(entKey.second, infoSink);\n    }\n    TIoMapResolver& resolver;\n    TInfoSink& infoSink;\n\nprivate:\n    TSlotCollector& operator=(TSlotCollector&) = delete;\n};\n\nTDefaultIoResolverBase::TDefaultIoResolverBase(const TIntermediate& intermediate)\n    : referenceIntermediate(intermediate)\n    , nextUniformLocation(intermediate.getUniformLocationBase())\n    , nextInputLocation(0)\n    , nextOutputLocation(0)\n{\n    memset(stageMask, false, sizeof(bool) * (EShLangCount + 1));\n    memset(stageIntermediates, 0, sizeof(TIntermediate*) * (EShLangCount));\n    stageIntermediates[intermediate.getStage()] = &intermediate;\n}\n\nint TDefaultIoResolverBase::getBaseBinding(EShLanguage stage, TResourceType res, unsigned int set) const {\n    return stageIntermediates[stage] ? selectBaseBinding(stageIntermediates[stage]->getShiftBinding(res), stageIntermediates[stage]->getShiftBindingForSet(res, set))\n                                     : selectBaseBinding(referenceIntermediate.getShiftBinding(res), referenceIntermediate.getShiftBindingForSet(res, set));\n}\n\nconst std::vector<std::string>& TDefaultIoResolverBase::getResourceSetBinding(EShLanguage stage) const {\n    return stageIntermediates[stage] ? stageIntermediates[stage]->getResourceSetBinding()\n                                     : referenceIntermediate.getResourceSetBinding();\n}\n\nbool TDefaultIoResolverBase::doAutoBindingMapping() const { return referenceIntermediate.getAutoMapBindings(); }\n\nbool TDefaultIoResolverBase::doAutoLocationMapping() const { return referenceIntermediate.getAutoMapLocations(); }\n\nTDefaultIoResolverBase::TSlotSet::iterator TDefaultIoResolverBase::findSlot(int set, int slot) {\n    return std::lower_bound(slots[set].begin(), slots[set].end(), slot);\n}\n\nbool TDefaultIoResolverBase::checkEmpty(int set, int slot) {\n    TSlotSet::iterator at = findSlot(set, slot);\n    return ! (at != slots[set].end() && *at == slot);\n}\n\nint TDefaultIoResolverBase::reserveSlot(int set, int slot, int size) {\n    TSlotSet::iterator at = findSlot(set, slot);\n    // tolerate aliasing, by not double-recording aliases\n    // (policy about appropriateness of the alias is higher up)\n    for (int i = 0; i < size; i++) {\n        if (at == slots[set].end() || *at != slot + i)\n            at = slots[set].insert(at, slot + i);\n        ++at;\n    }\n    return slot;\n}\n\nint TDefaultIoResolverBase::getFreeSlot(int set, int base, int size) {\n    TSlotSet::iterator at = findSlot(set, base);\n    if (at == slots[set].end())\n        return reserveSlot(set, base, size);\n    // look for a big enough gap\n    for (; at != slots[set].end(); ++at) {\n        if (*at - base >= size)\n            break;\n        base = *at + 1;\n    }\n    return reserveSlot(set, base, size);\n}\n\nint TDefaultIoResolverBase::resolveSet(EShLanguage stage, TVarEntryInfo& ent) {\n    const TType& type = ent.symbol->getType();\n    if (type.getQualifier().hasSet()) {\n        return ent.newSet = type.getQualifier().layoutSet;\n    }\n    // If a command line or API option requested a single descriptor set, use that (if not overrided by spaceN)\n    if (getResourceSetBinding(stage).size() == 1) {\n        return ent.newSet = atoi(getResourceSetBinding(stage)[0].c_str());\n    }\n    return ent.newSet = 0;\n}\n\nint TDefaultIoResolverBase::resolveUniformLocation(EShLanguage /*stage*/, TVarEntryInfo& ent) {\n    const TType& type = ent.symbol->getType();\n    const char* name =  ent.symbol->getAccessName().c_str();\n    // kick out of not doing this\n    if (! doAutoLocationMapping()) {\n        return ent.newLocation = -1;\n    }\n    // no locations added if already present, a built-in variable, a block, or an opaque\n    if (type.getQualifier().hasLocation() || type.isBuiltIn() || type.getBasicType() == EbtBlock ||\n        type.isAtomic() || type.isSpirvType() || (type.containsOpaque() && referenceIntermediate.getSpv().openGl == 0)) {\n        return ent.newLocation = -1;\n    }\n    // no locations on blocks of built-in variables\n    if (type.isStruct()) {\n        if (type.getStruct()->size() < 1) {\n            return ent.newLocation = -1;\n        }\n        if ((*type.getStruct())[0].type->isBuiltIn()) {\n            return ent.newLocation = -1;\n        }\n    }\n    int location = referenceIntermediate.getUniformLocationOverride(name);\n    if (location != -1) {\n        return ent.newLocation = location;\n    }\n    location = nextUniformLocation;\n    nextUniformLocation += TIntermediate::computeTypeUniformLocationSize(type);\n    return ent.newLocation = location;\n}\n\nint TDefaultIoResolverBase::resolveInOutLocation(EShLanguage stage, TVarEntryInfo& ent) {\n    const TType& type = ent.symbol->getType();\n    // kick out of not doing this\n    if (! doAutoLocationMapping()) {\n        return ent.newLocation = -1;\n    }\n\n    // no locations added if already present, a built-in variable, or a variable with SPIR-V decorate\n    if (type.getQualifier().hasLocation() || type.isBuiltIn() || type.getQualifier().hasSpirvDecorate()) {\n        return ent.newLocation = -1;\n    }\n\n    // no locations on blocks of built-in variables\n    if (type.isStruct()) {\n        if (type.getStruct()->size() < 1) {\n            return ent.newLocation = -1;\n        }\n        if ((*type.getStruct())[0].type->isBuiltIn()) {\n            return ent.newLocation = -1;\n        }\n    }\n    // point to the right input or output location counter\n    int& nextLocation = type.getQualifier().isPipeInput() ? nextInputLocation : nextOutputLocation;\n    // Placeholder. This does not do proper cross-stage lining up, nor\n    // work with mixed location/no-location declarations.\n    int location = nextLocation;\n    int typeLocationSize;\n    // Don’t take into account the outer-most array if the stage’s\n    // interface is automatically an array.\n    typeLocationSize = computeTypeLocationSize(type, stage);\n    nextLocation += typeLocationSize;\n    return ent.newLocation = location;\n}\n\nint TDefaultIoResolverBase::resolveInOutComponent(EShLanguage /*stage*/, TVarEntryInfo& ent) {\n    return ent.newComponent = -1;\n}\n\nint TDefaultIoResolverBase::resolveInOutIndex(EShLanguage /*stage*/, TVarEntryInfo& ent) { return ent.newIndex = -1; }\n\nuint32_t TDefaultIoResolverBase::computeTypeLocationSize(const TType& type, EShLanguage stage) {\n    int typeLocationSize;\n    // Don’t take into account the outer-most array if the stage’s\n    // interface is automatically an array.\n    if (type.getQualifier().isArrayedIo(stage)) {\n        TType elementType(type, 0);\n        typeLocationSize = TIntermediate::computeTypeLocationSize(elementType, stage);\n    } else {\n        typeLocationSize = TIntermediate::computeTypeLocationSize(type, stage);\n    }\n    return typeLocationSize;\n}\n\n//TDefaultGlslIoResolver\nTResourceType TDefaultGlslIoResolver::getResourceType(const glslang::TType& type) {\n    if (isImageType(type)) {\n        return EResImage;\n    }\n    if (isTextureType(type)) {\n        return EResTexture;\n    }\n    if (isSsboType(type)) {\n        return EResSsbo;\n    }\n    if (isSamplerType(type)) {\n        return EResSampler;\n    }\n    if (isUboType(type)) {\n        return EResUbo;\n    }\n    return EResCount;\n}\n\nTDefaultGlslIoResolver::TDefaultGlslIoResolver(const TIntermediate& intermediate)\n    : TDefaultIoResolverBase(intermediate)\n    , preStage(EShLangCount)\n    , currentStage(EShLangCount)\n{ }\n\nint TDefaultGlslIoResolver::resolveInOutLocation(EShLanguage stage, TVarEntryInfo& ent) {\n    const TType& type = ent.symbol->getType();\n    const TString& name = ent.symbol->getAccessName();\n    if (currentStage != stage) {\n        preStage = currentStage;\n        currentStage = stage;\n    }\n    // kick out if not doing this\n    if (! doAutoLocationMapping()) {\n        return ent.newLocation = -1;\n    }\n    // expand the location to each element if the symbol is a struct or array\n    if (type.getQualifier().hasLocation()) {\n        return ent.newLocation = type.getQualifier().layoutLocation;\n    }\n    // no locations added if already present, a built-in variable, or a variable with SPIR-V decorate\n    if (type.isBuiltIn() || type.getQualifier().hasSpirvDecorate()) {\n        return ent.newLocation = -1;\n    }\n    // no locations on blocks of built-in variables\n    if (type.isStruct()) {\n        if (type.getStruct()->size() < 1) {\n            return ent.newLocation = -1;\n        }\n        if ((*type.getStruct())[0].type->isBuiltIn()) {\n            return ent.newLocation = -1;\n        }\n    }\n    int typeLocationSize = computeTypeLocationSize(type, stage);\n    int location = type.getQualifier().layoutLocation;\n    bool hasLocation = false;\n    EShLanguage keyStage(EShLangCount);\n    TStorageQualifier storage;\n    storage = EvqInOut;\n    if (type.getQualifier().isPipeInput()) {\n        // If this symbol is a input, search pre stage's out\n        keyStage = preStage;\n    }\n    if (type.getQualifier().isPipeOutput()) {\n        // If this symbol is a output, search next stage's in\n        keyStage = currentStage;\n    }\n    // The in/out in current stage is not declared with location, but it is possible declared\n    // with explicit location in other stages, find the storageSlotMap firstly to check whether\n    // the in/out has location\n    int resourceKey = buildStorageKey(keyStage, storage);\n    if (! storageSlotMap[resourceKey].empty()) {\n        TVarSlotMap::iterator iter = storageSlotMap[resourceKey].find(name);\n        if (iter != storageSlotMap[resourceKey].end()) {\n            // If interface resource be found, set it has location and this symbol's new location\n            // equal the symbol's explicit location declaration in pre or next stage.\n            //\n            // vs:    out vec4 a;\n            // fs:    layout(..., location = 3,...) in vec4 a;\n            hasLocation = true;\n            location = iter->second;\n            // if we want deal like that:\n            // vs:    layout(location=4) out vec4 a;\n            //        out vec4 b;\n            //\n            // fs:    in vec4 a;\n            //        layout(location = 4) in vec4 b;\n            // we need retraverse the map.\n        }\n        if (! hasLocation) {\n            // If interface resource note found, It's mean the location in two stage are both implicit declarat.\n            // So we should find a new slot for this interface.\n            //\n            // vs: out vec4 a;\n            // fs: in vec4 a;\n            location = getFreeSlot(resourceKey, 0, typeLocationSize);\n            storageSlotMap[resourceKey][name] = location;\n        }\n    } else {\n        // the first interface declarated in a program.\n        TVarSlotMap varSlotMap;\n        location = getFreeSlot(resourceKey, 0, typeLocationSize);\n        varSlotMap[name] = location;\n        storageSlotMap[resourceKey] = varSlotMap;\n    }\n    //Update location\n    return ent.newLocation = location;\n}\n\nint TDefaultGlslIoResolver::resolveUniformLocation(EShLanguage /*stage*/, TVarEntryInfo& ent) {\n    const TType& type = ent.symbol->getType();\n    const TString& name = ent.symbol->getAccessName();\n    // kick out of not doing this\n    if (! doAutoLocationMapping()) {\n        return ent.newLocation = -1;\n    }\n    // expand the location to each element if the symbol is a struct or array\n    if (type.getQualifier().hasLocation() && (type.isStruct() || type.isArray())) {\n        return ent.newLocation = type.getQualifier().layoutLocation;\n    } else {\n        // no locations added if already present, a built-in variable, a block, or an opaque\n        if (type.getQualifier().hasLocation() || type.isBuiltIn() || type.getBasicType() == EbtBlock ||\n            type.isAtomic() || type.isSpirvType() ||\n            (type.containsOpaque() && referenceIntermediate.getSpv().openGl == 0)) {\n            return ent.newLocation = -1;\n        }\n        // no locations on blocks of built-in variables\n        if (type.isStruct()) {\n            if (type.getStruct()->size() < 1) {\n                return ent.newLocation = -1;\n            }\n            if ((*type.getStruct())[0].type->isBuiltIn()) {\n                return ent.newLocation = -1;\n            }\n        }\n    }\n    int location = referenceIntermediate.getUniformLocationOverride(name.c_str());\n    if (location != -1) {\n        return ent.newLocation = location;\n    }\n\n    int size = TIntermediate::computeTypeUniformLocationSize(type);\n\n    // The uniform in current stage is not declared with location, but it is possible declared\n    // with explicit location in other stages, find the storageSlotMap firstly to check whether\n    // the uniform has location\n    bool hasLocation = false;\n    int resourceKey = buildStorageKey(EShLangCount, EvqUniform);\n    TVarSlotMap& slotMap = storageSlotMap[resourceKey];\n    // Check dose shader program has uniform resource\n    if (! slotMap.empty()) {\n        // If uniform resource not empty, try find a same name uniform\n        TVarSlotMap::iterator iter = slotMap.find(name);\n        if (iter != slotMap.end()) {\n            // If uniform resource be found, set it has location and this symbol's new location\n            // equal the uniform's explicit location declaration in other stage.\n            //\n            // vs:    uniform vec4 a;\n            // fs:    layout(..., location = 3,...) uniform vec4 a;\n            hasLocation = true;\n            location = iter->second;\n        }\n        if (! hasLocation) {\n            // No explicit location declaration in other stage.\n            // So we should find a new slot for this uniform.\n            //\n            // vs:    uniform vec4 a;\n            // fs:    uniform vec4 a;\n            location = getFreeSlot(resourceKey, 0, computeTypeLocationSize(type, currentStage));\n            storageSlotMap[resourceKey][name] = location;\n        }\n    } else {\n        // the first uniform declaration in a program.\n        TVarSlotMap varSlotMap;\n        location = getFreeSlot(resourceKey, 0, size);\n        varSlotMap[name] = location;\n        storageSlotMap[resourceKey] = varSlotMap;\n    }\n    return ent.newLocation = location;\n}\n\nint TDefaultGlslIoResolver::resolveBinding(EShLanguage stage, TVarEntryInfo& ent) {\n    const TType& type = ent.symbol->getType();\n    const TString& name = ent.symbol->getAccessName();\n    // On OpenGL arrays of opaque types take a separate binding for each element\n    int numBindings = referenceIntermediate.getSpv().openGl != 0 && type.isSizedArray() ? type.getCumulativeArraySize() : 1;\n    TResourceType resource = getResourceType(type);\n    // don't need to handle uniform symbol, it will be handled in resolveUniformLocation\n    if (resource == EResUbo && type.getBasicType() != EbtBlock) {\n        return ent.newBinding = -1;\n    }\n    // There is no 'set' qualifier in OpenGL shading language, each resource has its own\n    // binding name space, so remap the 'set' to resource type which make each resource\n    // binding is valid from 0 to MAX_XXRESOURCE_BINDINGS\n    int set = referenceIntermediate.getSpv().openGl != 0 ? resource : ent.newSet;\n    int resourceKey = set;\n    if (resource < EResCount) {\n        if (type.getQualifier().hasBinding()) {\n            int newBinding = reserveSlot(resourceKey, getBaseBinding(stage, resource, set) + type.getQualifier().layoutBinding, numBindings);\n            return ent.newBinding = newBinding;\n\n        } else {\n            // The resource in current stage is not declared with binding, but it is possible declared\n            // with explicit binding in other stages, find the resourceSlotMap firstly to check whether\n            // the resource has binding, don't need to allocate if it already has a binding\n            bool hasBinding = false;\n            ent.newBinding = -1; // leave as -1 if it isn't set below\n\n            if (! resourceSlotMap[resourceKey].empty()) {\n                TVarSlotMap::iterator iter = resourceSlotMap[resourceKey].find(name);\n                if (iter != resourceSlotMap[resourceKey].end()) {\n                    hasBinding = true;\n                    ent.newBinding = iter->second;\n                }\n            }\n            if (!hasBinding && (ent.live && doAutoBindingMapping())) {\n                // find free slot, the caller did make sure it passes all vars with binding\n                // first and now all are passed that do not have a binding and needs one\n                int binding = getFreeSlot(resourceKey, getBaseBinding(stage, resource, set), numBindings);\n                resourceSlotMap[resourceKey][name] = binding;\n                ent.newBinding = binding;\n            }\n            return ent.newBinding;\n        }\n    }\n    return ent.newBinding = -1;\n}\n\nvoid TDefaultGlslIoResolver::beginResolve(EShLanguage stage) {\n    // reset stage state\n    if (stage == EShLangCount)\n        preStage = currentStage = stage;\n    // update stage state\n    else if (currentStage != stage) {\n        preStage = currentStage;\n        currentStage = stage;\n    }\n}\n\nvoid TDefaultGlslIoResolver::endResolve(EShLanguage /*stage*/) {\n    // TODO nothing\n}\n\nvoid TDefaultGlslIoResolver::beginCollect(EShLanguage stage) {\n    // reset stage state\n    if (stage == EShLangCount)\n        preStage = currentStage = stage;\n    // update stage state\n    else if (currentStage != stage) {\n        preStage = currentStage;\n        currentStage = stage;\n    }\n}\n\nvoid TDefaultGlslIoResolver::endCollect(EShLanguage /*stage*/) {\n    // TODO nothing\n}\n\nvoid TDefaultGlslIoResolver::reserverStorageSlot(TVarEntryInfo& ent, TInfoSink& infoSink) {\n    const TType& type = ent.symbol->getType();\n    const TString& name = ent.symbol->getAccessName();\n    TStorageQualifier storage = type.getQualifier().storage;\n    EShLanguage stage(EShLangCount);\n    switch (storage) {\n    case EvqUniform:\n        if (type.getBasicType() != EbtBlock && type.getQualifier().hasLocation()) {\n            //\n            // Reserve the slots for the uniforms who has explicit location\n            int storageKey = buildStorageKey(EShLangCount, EvqUniform);\n            int location = type.getQualifier().layoutLocation;\n            TVarSlotMap& varSlotMap = storageSlotMap[storageKey];\n            TVarSlotMap::iterator iter = varSlotMap.find(name);\n            if (iter == varSlotMap.end()) {\n                int numLocations = TIntermediate::computeTypeUniformLocationSize(type);\n                reserveSlot(storageKey, location, numLocations);\n                varSlotMap[name] = location;\n            } else {\n                // Allocate location by name for OpenGL driver, so the uniform in different\n                // stages should be declared with the same location\n                if (iter->second != location) {\n                    TString errorMsg = \"Invalid location: \" + name;\n                    infoSink.info.message(EPrefixInternalError, errorMsg.c_str());\n                    hasError = true;\n                }\n            }\n        }\n        break;\n    case EvqVaryingIn:\n    case EvqVaryingOut:\n        //\n        // Reserve the slots for the inout who has explicit location\n        if (type.getQualifier().hasLocation()) {\n            stage = storage == EvqVaryingIn ? preStage : stage;\n            stage = storage == EvqVaryingOut ? currentStage : stage;\n            int storageKey = buildStorageKey(stage, EvqInOut);\n            int location = type.getQualifier().layoutLocation;\n            TVarSlotMap& varSlotMap = storageSlotMap[storageKey];\n            TVarSlotMap::iterator iter = varSlotMap.find(name);\n            if (iter == varSlotMap.end()) {\n                int numLocations = TIntermediate::computeTypeUniformLocationSize(type);\n                reserveSlot(storageKey, location, numLocations);\n                varSlotMap[name] = location;\n            } else {\n                // Allocate location by name for OpenGL driver, so the uniform in different\n                // stages should be declared with the same location\n                if (iter->second != location) {\n                    TString errorMsg = \"Invalid location: \" + name;\n                    infoSink.info.message(EPrefixInternalError, errorMsg.c_str());\n                    hasError = true;\n                }\n            }\n        }\n        break;\n    default:\n        break;\n    }\n}\n\nvoid TDefaultGlslIoResolver::reserverResourceSlot(TVarEntryInfo& ent, TInfoSink& infoSink) {\n    const TType& type = ent.symbol->getType();\n    const TString& name = ent.symbol->getAccessName();\n    TResourceType resource = getResourceType(type);\n    int set = referenceIntermediate.getSpv().openGl != 0 ? resource : resolveSet(ent.stage, ent);\n    int resourceKey = set;\n\n    if (type.getQualifier().hasBinding()) {\n        TVarSlotMap& varSlotMap = resourceSlotMap[resourceKey];\n        TVarSlotMap::iterator iter = varSlotMap.find(name);\n        int binding = type.getQualifier().layoutBinding + getBaseBinding(ent.stage, resource, set);\n\n        if (iter == varSlotMap.end()) {\n            // Reserve the slots for the ubo, ssbo and opaques who has explicit binding\n            int numBindings = referenceIntermediate.getSpv().openGl != 0 && type.isSizedArray() ? type.getCumulativeArraySize() : 1;\n            varSlotMap[name] = binding;\n            reserveSlot(resourceKey, binding, numBindings);\n        } else {\n            // Allocate binding by name for OpenGL driver, so the resource in different\n            // stages should be declared with the same binding\n            if (iter->second != binding) {\n                TString errorMsg = \"Invalid binding: \" + name;\n                infoSink.info.message(EPrefixInternalError, errorMsg.c_str());\n                hasError = true;\n            }\n        }\n    }\n}\n\n//TDefaultGlslIoResolver end\n\n/*\n * Basic implementation of glslang::TIoMapResolver that replaces the\n * previous offset behavior.\n * It does the same, uses the offsets for the corresponding uniform\n * types. Also respects the EOptionAutoMapBindings flag and binds\n * them if needed.\n */\n/*\n * Default resolver\n */\nstruct TDefaultIoResolver : public TDefaultIoResolverBase {\n    TDefaultIoResolver(const TIntermediate& intermediate) : TDefaultIoResolverBase(intermediate) { }\n\n    bool validateBinding(EShLanguage /*stage*/, TVarEntryInfo& /*ent*/) override { return true; }\n\n    TResourceType getResourceType(const glslang::TType& type) override {\n        if (isImageType(type)) {\n            return EResImage;\n        }\n        if (isTextureType(type)) {\n            return EResTexture;\n        }\n        if (isSsboType(type)) {\n            return EResSsbo;\n        }\n        if (isSamplerType(type)) {\n            return EResSampler;\n        }\n        if (isUboType(type)) {\n            return EResUbo;\n        }\n        return EResCount;\n    }\n\n    int resolveBinding(EShLanguage stage, TVarEntryInfo& ent) override {\n        const TType& type = ent.symbol->getType();\n        const int set = getLayoutSet(type);\n        // On OpenGL arrays of opaque types take a seperate binding for each element\n        int numBindings = referenceIntermediate.getSpv().openGl != 0 && type.isSizedArray() ? type.getCumulativeArraySize() : 1;\n        TResourceType resource = getResourceType(type);\n        if (resource < EResCount) {\n            if (type.getQualifier().hasBinding()) {\n                return ent.newBinding = reserveSlot(\n                           set, getBaseBinding(stage, resource, set) + type.getQualifier().layoutBinding, numBindings);\n            } else if (ent.live && doAutoBindingMapping()) {\n                // find free slot, the caller did make sure it passes all vars with binding\n                // first and now all are passed that do not have a binding and needs one\n                return ent.newBinding = getFreeSlot(set, getBaseBinding(stage, resource, set), numBindings);\n            }\n        }\n        return ent.newBinding = -1;\n    }\n};\n\n#ifdef ENABLE_HLSL\n/********************************************************************************\nThe following IO resolver maps types in HLSL register space, as follows:\n\nt - for shader resource views (SRV)\n   TEXTURE1D\n   TEXTURE1DARRAY\n   TEXTURE2D\n   TEXTURE2DARRAY\n   TEXTURE3D\n   TEXTURECUBE\n   TEXTURECUBEARRAY\n   TEXTURE2DMS\n   TEXTURE2DMSARRAY\n   STRUCTUREDBUFFER\n   BYTEADDRESSBUFFER\n   BUFFER\n   TBUFFER\n\ns - for samplers\n   SAMPLER\n   SAMPLER1D\n   SAMPLER2D\n   SAMPLER3D\n   SAMPLERCUBE\n   SAMPLERSTATE\n   SAMPLERCOMPARISONSTATE\n\nu - for unordered access views (UAV)\n   RWBYTEADDRESSBUFFER\n   RWSTRUCTUREDBUFFER\n   APPENDSTRUCTUREDBUFFER\n   CONSUMESTRUCTUREDBUFFER\n   RWBUFFER\n   RWTEXTURE1D\n   RWTEXTURE1DARRAY\n   RWTEXTURE2D\n   RWTEXTURE2DARRAY\n   RWTEXTURE3D\n\nb - for constant buffer views (CBV)\n   CBUFFER\n   CONSTANTBUFFER\n ********************************************************************************/\nstruct TDefaultHlslIoResolver : public TDefaultIoResolverBase {\n    TDefaultHlslIoResolver(const TIntermediate& intermediate) : TDefaultIoResolverBase(intermediate) { }\n\n    bool validateBinding(EShLanguage /*stage*/, TVarEntryInfo& /*ent*/) override { return true; }\n\n    TResourceType getResourceType(const glslang::TType& type) override {\n        if (isUavType(type)) {\n            return EResUav;\n        }\n        if (isSrvType(type)) {\n            return EResTexture;\n        }\n        if (isSamplerType(type)) {\n            return EResSampler;\n        }\n        if (isUboType(type)) {\n            return EResUbo;\n        }\n        return EResCount;\n    }\n\n    int resolveBinding(EShLanguage stage, TVarEntryInfo& ent) override {\n        const TType& type = ent.symbol->getType();\n        const int set = getLayoutSet(type);\n        TResourceType resource = getResourceType(type);\n        if (resource < EResCount) {\n            if (type.getQualifier().hasBinding()) {\n                return ent.newBinding = reserveSlot(set, getBaseBinding(stage, resource, set) + type.getQualifier().layoutBinding);\n            } else if (ent.live && doAutoBindingMapping()) {\n                // find free slot, the caller did make sure it passes all vars with binding\n                // first and now all are passed that do not have a binding and needs one\n                return ent.newBinding = getFreeSlot(set, getBaseBinding(stage, resource, set));\n            }\n        }\n        return ent.newBinding = -1;\n    }\n};\n#endif\n\n// Map I/O variables to provided offsets, and make bindings for\n// unbound but live variables.\n//\n// Returns false if the input is too malformed to do this.\nbool TIoMapper::addStage(EShLanguage stage, TIntermediate& intermediate, TInfoSink& infoSink, TIoMapResolver* resolver) {\n    bool somethingToDo = ! intermediate.getResourceSetBinding().empty() || intermediate.getAutoMapBindings() ||\n                         intermediate.getAutoMapLocations();\n    // Restrict the stricter condition to further check 'somethingToDo' only if 'somethingToDo' has not been set, reduce\n    // unnecessary or insignificant for-loop operation after 'somethingToDo' have been true.\n    for (int res = 0; (res < EResCount && !somethingToDo); ++res) {\n        somethingToDo = somethingToDo || (intermediate.getShiftBinding(TResourceType(res)) != 0) ||\n                        intermediate.hasShiftBindingForSet(TResourceType(res));\n    }\n    if (! somethingToDo && resolver == nullptr)\n        return true;\n    if (intermediate.getNumEntryPoints() != 1 || intermediate.isRecursive())\n        return false;\n    TIntermNode* root = intermediate.getTreeRoot();\n    if (root == nullptr)\n        return false;\n    // if no resolver is provided, use the default resolver with the given shifts and auto map settings\n    TDefaultIoResolver defaultResolver(intermediate);\n#ifdef ENABLE_HLSL\n    TDefaultHlslIoResolver defaultHlslResolver(intermediate);\n    if (resolver == nullptr) {\n        // TODO: use a passed in IO mapper for this\n        if (intermediate.usingHlslIoMapping())\n            resolver = &defaultHlslResolver;\n        else\n            resolver = &defaultResolver;\n    }\n#else\n    resolver = &defaultResolver;\n#endif\n    resolver->addStage(stage, intermediate);\n\n    TVarLiveMap inVarMap, outVarMap, uniformVarMap;\n    TVarLiveVector inVector, outVector, uniformVector;\n    TVarGatherTraverser iter_binding_all(intermediate, true, inVarMap, outVarMap, uniformVarMap);\n    TVarGatherTraverser iter_binding_live(intermediate, false, inVarMap, outVarMap, uniformVarMap);\n    root->traverse(&iter_binding_all);\n    iter_binding_live.pushFunction(intermediate.getEntryPointMangledName().c_str());\n    while (! iter_binding_live.destinations.empty()) {\n        TIntermNode* destination = iter_binding_live.destinations.back();\n        iter_binding_live.destinations.pop_back();\n        destination->traverse(&iter_binding_live);\n    }\n\n    // sort entries by priority. see TVarEntryInfo::TOrderByPriority for info.\n    for (auto& var : inVarMap) { inVector.push_back(var); }\n    std::sort(inVector.begin(), inVector.end(), [](const TVarLivePair& p1, const TVarLivePair& p2) -> bool {\n        return TVarEntryInfo::TOrderByPriority()(p1.second, p2.second);\n    });\n    for (auto& var : outVarMap) { outVector.push_back(var); }\n    std::sort(outVector.begin(), outVector.end(), [](const TVarLivePair& p1, const TVarLivePair& p2) -> bool {\n        return TVarEntryInfo::TOrderByPriority()(p1.second, p2.second);\n    });\n    for (auto& var : uniformVarMap) { uniformVector.push_back(var); }\n    std::sort(uniformVector.begin(), uniformVector.end(), [](const TVarLivePair& p1, const TVarLivePair& p2) -> bool {\n        return TVarEntryInfo::TOrderByPriority()(p1.second, p2.second);\n    });\n    bool hadError = false;\n    TVarLiveMap* dummyUniformVarMap[EShLangCount] = {};\n    TNotifyInOutAdaptor inOutNotify(stage, *resolver);\n    TNotifyUniformAdaptor uniformNotify(stage, *resolver);\n    TResolverUniformAdaptor uniformResolve(stage, *resolver, dummyUniformVarMap, infoSink, hadError);\n    TResolverInOutAdaptor inOutResolve(stage, *resolver, infoSink, hadError);\n    resolver->beginNotifications(stage);\n    std::for_each(inVector.begin(), inVector.end(), inOutNotify);\n    std::for_each(outVector.begin(), outVector.end(), inOutNotify);\n    std::for_each(uniformVector.begin(), uniformVector.end(), uniformNotify);\n    resolver->endNotifications(stage);\n    resolver->beginResolve(stage);\n    for (auto& var : inVector) { inOutResolve(var); }\n    std::for_each(inVector.begin(), inVector.end(), [&inVarMap](TVarLivePair p) {\n        auto at = inVarMap.find(p.second.symbol->getAccessName());\n        if (at != inVarMap.end() && p.second.id == at->second.id)\n            at->second = p.second;\n    });\n    for (auto& var : outVector) { inOutResolve(var); }\n    std::for_each(outVector.begin(), outVector.end(), [&outVarMap](TVarLivePair p) {\n        auto at = outVarMap.find(p.second.symbol->getAccessName());\n        if (at != outVarMap.end() && p.second.id == at->second.id)\n            at->second = p.second;\n    });\n    std::for_each(uniformVector.begin(), uniformVector.end(), uniformResolve);\n    std::for_each(uniformVector.begin(), uniformVector.end(), [&uniformVarMap](TVarLivePair p) {\n        auto at = uniformVarMap.find(p.second.symbol->getAccessName());\n        if (at != uniformVarMap.end() && p.second.id == at->second.id)\n            at->second = p.second;\n    });\n    resolver->endResolve(stage);\n    if (!hadError) {\n        TVarSetTraverser iter_iomap(intermediate, inVarMap, outVarMap, uniformVarMap);\n        root->traverse(&iter_iomap);\n    }\n    return !hadError;\n}\n\nTGlslIoMapper::TGlslIoMapper() {\n    memset(inVarMaps,     0, sizeof(TVarLiveMap*)   * EShLangCount);\n    memset(outVarMaps,    0, sizeof(TVarLiveMap*)   * EShLangCount);\n    memset(uniformVarMap, 0, sizeof(TVarLiveMap*)   * EShLangCount);\n    memset(intermediates, 0, sizeof(TIntermediate*) * EShLangCount);\n    profile = ENoProfile;\n    version = 0;\n    autoPushConstantMaxSize = 128;\n    autoPushConstantBlockPacking = ElpStd430;\n}\n\nTGlslIoMapper::~TGlslIoMapper() {\n    for (size_t stage = 0; stage < EShLangCount; stage++) {\n        if (inVarMaps[stage] != nullptr) {\n            delete inVarMaps[stage];\n            inVarMaps[stage] = nullptr;\n        }\n        if (outVarMaps[stage] != nullptr) {\n            delete outVarMaps[stage];\n            outVarMaps[stage] = nullptr;\n        }\n        if (uniformVarMap[stage] != nullptr) {\n            delete uniformVarMap[stage];\n            uniformVarMap[stage] = nullptr;\n        }\n        if (intermediates[stage] != nullptr)\n            intermediates[stage] = nullptr;\n    }\n}\n\n// Map I/O variables to provided offsets, and make bindings for\n// unbound but live variables.\n//\n// Returns false if the input is too malformed to do this.\nbool TGlslIoMapper::addStage(EShLanguage stage, TIntermediate& intermediate, TInfoSink& infoSink, TIoMapResolver* resolver) {\n    bool somethingToDo = !intermediate.getResourceSetBinding().empty() ||\n        intermediate.getAutoMapBindings() ||\n        intermediate.getAutoMapLocations();\n\n    // Profile and version are use for symbol validate.\n    profile = intermediate.getProfile();\n    version = intermediate.getVersion();\n\n    // Restrict the stricter condition to further check 'somethingToDo' only if 'somethingToDo' has not been set, reduce\n    // unnecessary or insignificant for-loop operation after 'somethingToDo' have been true.\n    for (int res = 0; (res < EResCount && !somethingToDo); ++res) {\n        somethingToDo = somethingToDo || (intermediate.getShiftBinding(TResourceType(res)) != 0) ||\n                        intermediate.hasShiftBindingForSet(TResourceType(res));\n    }\n    if (! somethingToDo && resolver == nullptr) {\n        return true;\n    }\n    if (intermediate.getNumEntryPoints() != 1 || intermediate.isRecursive()) {\n        return false;\n    }\n    TIntermNode* root = intermediate.getTreeRoot();\n    if (root == nullptr) {\n        return false;\n    }\n    // if no resolver is provided, use the default resolver with the given shifts and auto map settings\n    TDefaultGlslIoResolver defaultResolver(intermediate);\n#ifdef ENABLE_HLSL\n    TDefaultHlslIoResolver defaultHlslResolver(intermediate);\n    if (resolver == nullptr) {\n        // TODO: use a passed in IO mapper for this\n        if (intermediate.usingHlslIoMapping())\n            resolver = &defaultHlslResolver;\n        else\n            resolver = &defaultResolver;\n    }\n#else\n    if (resolver == nullptr) {\n        resolver = &defaultResolver;\n    }\n#endif\n    resolver->addStage(stage, intermediate);\n    inVarMaps[stage] = new TVarLiveMap(); outVarMaps[stage] = new TVarLiveMap(); uniformVarMap[stage] = new TVarLiveMap();\n    TVarGatherTraverser iter_binding_all(intermediate, true, *inVarMaps[stage], *outVarMaps[stage],\n                                         *uniformVarMap[stage]);\n    TVarGatherTraverser iter_binding_live(intermediate, false, *inVarMaps[stage], *outVarMaps[stage],\n                                          *uniformVarMap[stage]);\n    root->traverse(&iter_binding_all);\n    iter_binding_live.pushFunction(intermediate.getEntryPointMangledName().c_str());\n    while (! iter_binding_live.destinations.empty()) {\n        TIntermNode* destination = iter_binding_live.destinations.back();\n        iter_binding_live.destinations.pop_back();\n        destination->traverse(&iter_binding_live);\n    }\n\n    TNotifyInOutAdaptor inOutNotify(stage, *resolver);\n    TNotifyUniformAdaptor uniformNotify(stage, *resolver);\n    // Resolve current stage input symbol location with previous stage output here,\n    // uniform symbol, ubo, ssbo and opaque symbols are per-program resource,\n    // will resolve uniform symbol location and ubo/ssbo/opaque binding in doMap()\n    resolver->beginNotifications(stage);\n    std::for_each(inVarMaps[stage]->begin(), inVarMaps[stage]->end(), inOutNotify);\n    std::for_each(outVarMaps[stage]->begin(), outVarMaps[stage]->end(), inOutNotify);\n    std::for_each(uniformVarMap[stage]->begin(), uniformVarMap[stage]->end(), uniformNotify);\n    resolver->endNotifications(stage);\n    TSlotCollector slotCollector(*resolver, infoSink);\n    resolver->beginCollect(stage);\n    std::for_each(inVarMaps[stage]->begin(), inVarMaps[stage]->end(), slotCollector);\n    std::for_each(outVarMaps[stage]->begin(), outVarMaps[stage]->end(), slotCollector);\n    std::for_each(uniformVarMap[stage]->begin(), uniformVarMap[stage]->end(), slotCollector);\n    resolver->endCollect(stage);\n    intermediates[stage] = &intermediate;\n    return !hadError;\n}\n\nbool TGlslIoMapper::doMap(TIoMapResolver* resolver, TInfoSink& infoSink) {\n    resolver->endResolve(EShLangCount);\n    if (!hadError) {\n        //Resolve uniform location, ubo/ssbo/opaque bindings across stages\n        TResolverUniformAdaptor uniformResolve(EShLangCount, *resolver, uniformVarMap, infoSink, hadError);\n        TResolverInOutAdaptor inOutResolve(EShLangCount, *resolver, infoSink, hadError);\n        TSymbolValidater symbolValidater(*resolver, infoSink, inVarMaps,\n                                         outVarMaps, uniformVarMap, hadError, profile, version);\n\n        TVarLiveVector inVectors[EShLangCount];\n        TVarLiveVector outVectors[EShLangCount];\n        TVarLiveVector uniformVector;\n\n        resolver->beginResolve(EShLangCount);\n        for (int stage = EShLangVertex; stage < EShLangCount; stage++) {\n            if (inVarMaps[stage] != nullptr) {\n                inOutResolve.setStage(EShLanguage(stage));\n\n                // copy vars into a sorted list\n                std::for_each(inVarMaps[stage]->begin(), inVarMaps[stage]->end(),\n                        [&inVectors, stage](TVarLivePair p) { inVectors[stage].push_back(p); });\n                std::sort(inVectors[stage].begin(), inVectors[stage].end(),\n                        [](const TVarLivePair& p1, const TVarLivePair& p2) -> bool {\n                            return TVarEntryInfo::TOrderByPriority()(p1.second, p2.second);\n                });\n\n                std::for_each(outVarMaps[stage]->begin(), outVarMaps[stage]->end(),\n                        [&outVectors, stage](TVarLivePair p) { outVectors[stage].push_back(p); });\n                std::sort(outVectors[stage].begin(), outVectors[stage].end(),\n                        [](const TVarLivePair& p1, const TVarLivePair& p2) -> bool {\n                            return TVarEntryInfo::TOrderByPriority()(p1.second, p2.second);\n                });\n\n                for (auto& var : inVectors[stage]) { symbolValidater(var); }\n                for (auto& var : inVectors[stage]) { inOutResolve(var); }\n                for (auto& var : outVectors[stage]) { symbolValidater(var); }\n                for (auto& var : outVectors[stage]) { inOutResolve(var); }\n\n                // copy results back into maps\n                std::for_each(inVectors[stage].begin(), inVectors[stage].end(),\n                    [this, stage](TVarLivePair p) {\n                        auto at = inVarMaps[stage]->find(p.first);\n                        if (at != inVarMaps[stage]->end())\n                            at->second = p.second;\n                });\n\n                std::for_each(outVectors[stage].begin(), outVectors[stage].end(),\n                    [this, stage](TVarLivePair p) {\n                        auto at = outVarMaps[stage]->find(p.first);\n                        if (at != outVarMaps[stage]->end())\n                            at->second = p.second;\n                });\n\n            }\n            if (uniformVarMap[stage] != nullptr) {\n                uniformResolve.setStage(EShLanguage(stage));\n                for (auto& var : *(uniformVarMap[stage])) { uniformVector.push_back(var); }\n            }\n        }\n        std::sort(uniformVector.begin(), uniformVector.end(), [](const TVarLivePair& p1, const TVarLivePair& p2) -> bool {\n            return TVarEntryInfo::TOrderByPriorityAndLive()(p1.second, p2.second);\n        });\n        for (auto& var : uniformVector) { symbolValidater(var); }\n        for (auto& var : uniformVector) { uniformResolve(var); }\n        std::sort(uniformVector.begin(), uniformVector.end(), [](const TVarLivePair& p1, const TVarLivePair& p2) -> bool {\n            return TVarEntryInfo::TOrderByPriority()(p1.second, p2.second);\n        });\n        resolver->endResolve(EShLangCount);\n        if (autoPushConstantBlockName.length()) {\n            bool upgraded = false;\n            for (size_t stage = 0; stage < EShLangCount; stage++) {\n                if (intermediates[stage] != nullptr) {\n                    TVarLiveMap** pUniformVarMap = uniformResolve.uniformVarMap;\n                    auto at = pUniformVarMap[stage]->find(autoPushConstantBlockName);\n                    if (at == pUniformVarMap[stage]->end())\n                        continue;\n                    TQualifier& qualifier = at->second.symbol->getQualifier();\n                    if (!qualifier.isUniform())\n                        continue;\n                    TType& t = at->second.symbol->getWritableType();\n                    int size, stride;\n                    TIntermediate::getBaseAlignment(t, size, stride, autoPushConstantBlockPacking,\n                                                    qualifier.layoutMatrix == ElmRowMajor);\n                    if (size <= int(autoPushConstantMaxSize)) {\n                        qualifier.setBlockStorage(EbsPushConstant);\n                        qualifier.layoutPacking = autoPushConstantBlockPacking;\n                        // Push constants don't have set/binding etc. decorations, remove those.\n                        qualifier.layoutSet = TQualifier::layoutSetEnd;\n                        at->second.clearNewAssignments();\n\n                        upgraded = true;\n                    }\n                }\n            }\n            // If it's been upgraded to push_constant, then set the flag so when its traversed\n            // in the next for loop, all references to this symbol will get their flag changed.\n            // so it doesn't get a set/binding assigned to it.\n            if (upgraded) {\n                std::for_each(uniformVector.begin(), uniformVector.end(),\n                                       [this](TVarLivePair& p) {\n                if (p.first == autoPushConstantBlockName) {\n                        p.second.upgradedToPushConstantPacking = autoPushConstantBlockPacking;\n                        p.second.newSet = TQualifier::layoutSetEnd;\n                    }\n                });\n            }\n        }\n        for (size_t stage = 0; stage < EShLangCount; stage++) {\n            if (intermediates[stage] != nullptr) {\n                // traverse each stage, set new location to each input/output and unifom symbol, set new binding to\n                // ubo, ssbo and opaque symbols. Assign push_constant upgrades as well.\n                TVarLiveMap** pUniformVarMap = uniformResolve.uniformVarMap;\n                std::for_each(uniformVector.begin(), uniformVector.end(), [pUniformVarMap, stage](TVarLivePair p) {\n                    auto at = pUniformVarMap[stage]->find(p.second.symbol->getAccessName());\n                    if (at != pUniformVarMap[stage]->end() && at->second.id == p.second.id){\n                        if (p.second.upgradedToPushConstantPacking != ElpNone) {\n                            at->second.upgradedToPushConstantPacking = p.second.upgradedToPushConstantPacking;\n                        } else {\n                            int resolvedBinding = at->second.newBinding;\n                            at->second = p.second;\n                            if (resolvedBinding > 0)\n                                at->second.newBinding = resolvedBinding;\n                        }\n                    }\n                });\n                TVarSetTraverser iter_iomap(*intermediates[stage], *inVarMaps[stage], *outVarMaps[stage],\n                                            *uniformResolve.uniformVarMap[stage]);\n                intermediates[stage]->getTreeRoot()->traverse(&iter_iomap);\n            }\n        }\n        return !hadError;\n    } else {\n        return false;\n    }\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/iomapper.h",
    "content": "//\n// Copyright (C) 2016 LunarG, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#ifndef _IOMAPPER_INCLUDED\n#define _IOMAPPER_INCLUDED\n\n#include <cstdint>\n#include <unordered_map>\n#include <unordered_set>\n//\n// A reflection database and its interface, consistent with the OpenGL API reflection queries.\n//\n\nclass TInfoSink;\n\nnamespace glslang {\n\nclass TIntermediate;\nstruct TVarEntryInfo;\n// Base class for shared TIoMapResolver services, used by several derivations.\nstruct TDefaultIoResolverBase : public glslang::TIoMapResolver {\npublic:\n    TDefaultIoResolverBase(const TIntermediate& intermediate);\n    typedef std::vector<int> TSlotSet;\n    typedef std::unordered_map<int, TSlotSet> TSlotSetMap;\n\n    // grow the reflection stage by stage\n    void notifyBinding(EShLanguage, TVarEntryInfo& /*ent*/) override {}\n    void notifyInOut(EShLanguage, TVarEntryInfo& /*ent*/) override {}\n    void beginNotifications(EShLanguage) override {}\n    void endNotifications(EShLanguage) override {}\n    void beginResolve(EShLanguage) override {}\n    void endResolve(EShLanguage) override {}\n    void beginCollect(EShLanguage) override {}\n    void endCollect(EShLanguage) override {}\n    void reserverResourceSlot(TVarEntryInfo& /*ent*/, TInfoSink& /*infoSink*/) override {}\n    void reserverStorageSlot(TVarEntryInfo& /*ent*/, TInfoSink& /*infoSink*/) override {}\n    int getBaseBinding(EShLanguage stage, TResourceType res, unsigned int set) const;\n    const std::vector<std::string>& getResourceSetBinding(EShLanguage stage) const;\n    virtual TResourceType getResourceType(const glslang::TType& type) = 0;\n    bool doAutoBindingMapping() const;\n    bool doAutoLocationMapping() const;\n    TSlotSet::iterator findSlot(int set, int slot);\n    bool checkEmpty(int set, int slot);\n    bool validateInOut(EShLanguage /*stage*/, TVarEntryInfo& /*ent*/) override { return true; }\n    int reserveSlot(int set, int slot, int size = 1);\n    int getFreeSlot(int set, int base, int size = 1);\n    int resolveSet(EShLanguage /*stage*/, TVarEntryInfo& ent) override;\n    int resolveUniformLocation(EShLanguage /*stage*/, TVarEntryInfo& ent) override;\n    int resolveInOutLocation(EShLanguage stage, TVarEntryInfo& ent) override;\n    int resolveInOutComponent(EShLanguage /*stage*/, TVarEntryInfo& ent) override;\n    int resolveInOutIndex(EShLanguage /*stage*/, TVarEntryInfo& ent) override;\n    void addStage(EShLanguage stage, TIntermediate& stageIntermediate) override {\n        if (stage < EShLangCount) {\n            stageMask[stage] = true;\n            stageIntermediates[stage] = &stageIntermediate;\n        }\n    }\n    uint32_t computeTypeLocationSize(const TType& type, EShLanguage stage);\n\n    TSlotSetMap slots;\n    bool hasError = false;\n\nprotected:\n    TDefaultIoResolverBase(TDefaultIoResolverBase&);\n    TDefaultIoResolverBase& operator=(TDefaultIoResolverBase&);\n    const TIntermediate& referenceIntermediate;\n    int nextUniformLocation;\n    int nextInputLocation;\n    int nextOutputLocation;\n    bool stageMask[EShLangCount + 1];\n    const TIntermediate* stageIntermediates[EShLangCount];\n\n    // Return descriptor set specific base if there is one, and the generic base otherwise.\n    int selectBaseBinding(int base, int descriptorSetBase) const {\n        return descriptorSetBase != -1 ? descriptorSetBase : base;\n    }\n\n    static int getLayoutSet(const glslang::TType& type) {\n        if (type.getQualifier().hasSet())\n            return type.getQualifier().layoutSet;\n        else\n            return 0;\n    }\n\n    static bool isSamplerType(const glslang::TType& type) {\n        return type.getBasicType() == glslang::EbtSampler && type.getSampler().isPureSampler();\n    }\n\n    static bool isTextureType(const glslang::TType& type) {\n        return (type.getBasicType() == glslang::EbtSampler &&\n                (type.getSampler().isTexture() || type.getSampler().isSubpass()));\n    }\n\n    static bool isUboType(const glslang::TType& type) {\n        return type.getQualifier().storage == EvqUniform;\n    }\n\n    static bool isImageType(const glslang::TType& type) {\n        return type.getBasicType() == glslang::EbtSampler && type.getSampler().isImage();\n    }\n\n    static bool isSsboType(const glslang::TType& type) {\n        return type.getQualifier().storage == EvqBuffer;\n    }\n\n    // Return true if this is a SRV (shader resource view) type:\n    static bool isSrvType(const glslang::TType& type) {\n        return isTextureType(type) || type.getQualifier().storage == EvqBuffer;\n    }\n\n    // Return true if this is a UAV (unordered access view) type:\n    static bool isUavType(const glslang::TType& type) {\n        if (type.getQualifier().isReadOnly())\n            return false;\n        return (type.getBasicType() == glslang::EbtSampler && type.getSampler().isImage()) ||\n                (type.getQualifier().storage == EvqBuffer);\n    }\n};\n\n// Default I/O resolver for OpenGL\nstruct TDefaultGlslIoResolver : public TDefaultIoResolverBase {\npublic:\n    typedef std::map<TString, int> TVarSlotMap;  // <resourceName, location/binding>\n    typedef std::map<int, TVarSlotMap> TSlotMap; // <resourceKey, TVarSlotMap>\n    TDefaultGlslIoResolver(const TIntermediate& intermediate);\n    bool validateBinding(EShLanguage /*stage*/, TVarEntryInfo& /*ent*/) override { return true; }\n    TResourceType getResourceType(const glslang::TType& type) override;\n    int resolveInOutLocation(EShLanguage stage, TVarEntryInfo& ent) override;\n    int resolveUniformLocation(EShLanguage /*stage*/, TVarEntryInfo& ent) override;\n    int resolveBinding(EShLanguage /*stage*/, TVarEntryInfo& ent) override;\n    void beginResolve(EShLanguage /*stage*/) override;\n    void endResolve(EShLanguage stage) override;\n    void beginCollect(EShLanguage) override;\n    void endCollect(EShLanguage) override;\n    void reserverStorageSlot(TVarEntryInfo& ent, TInfoSink& infoSink) override;\n    void reserverResourceSlot(TVarEntryInfo& ent, TInfoSink& infoSink) override;\n    // in/out symbol and uniform symbol are stored in the same resourceSlotMap, the storage key is used to identify each type of symbol.\n    // We use stage and storage qualifier to construct a storage key. it can help us identify the same storage resource used in different stage.\n    // if a resource is a program resource and we don't need know it usage stage, we can use same stage to build storage key.\n    // Note: both stage and type must less then 0xffff.\n    int buildStorageKey(EShLanguage stage, TStorageQualifier type) {\n        assert(static_cast<uint32_t>(stage) <= 0x0000ffff && static_cast<uint32_t>(type) <= 0x0000ffff);\n        return (stage << 16) | type;\n    }\n\nprotected:\n    // Use for mark pre stage, to get more interface symbol information.\n    EShLanguage preStage;\n    // Use for mark current shader stage for resolver\n    EShLanguage currentStage;\n    // Slot map for storage resource(location of uniform and interface symbol) It's a program share slot\n    TSlotMap resourceSlotMap;\n    // Slot map for other resource(image, ubo, ssbo), It's a program share slot.\n    TSlotMap storageSlotMap;\n};\n\ntypedef std::map<TString, TVarEntryInfo> TVarLiveMap;\n\n// I/O mapper for GLSL\nclass TGlslIoMapper : public TIoMapper {\npublic:\n    TGlslIoMapper();\n    virtual ~TGlslIoMapper();\n    // If set, the uniform block with the given name will be changed to be backed by\n    // push_constant if it's size is <= maxSize\n    bool setAutoPushConstantBlock(const char* name, unsigned int maxSize, TLayoutPacking packing) override {\n        autoPushConstantBlockName = name;\n        autoPushConstantMaxSize = maxSize;\n        autoPushConstantBlockPacking = packing;\n        return true;\n    }\n    // grow the reflection stage by stage\n    bool addStage(EShLanguage, TIntermediate&, TInfoSink&, TIoMapResolver*) override;\n    bool doMap(TIoMapResolver*, TInfoSink&) override;\n    TIntermediate* intermediates[EShLangCount];\n    bool hadError = false;\n    EProfile profile;\n    int version;\n\nprivate:\n    TString autoPushConstantBlockName;\n    unsigned int autoPushConstantMaxSize;\n    TLayoutPacking autoPushConstantBlockPacking;\n    TVarLiveMap *inVarMaps[EShLangCount], *outVarMaps[EShLangCount],\n                *uniformVarMap[EShLangCount];\n};\n\n} // end namespace glslang\n\n#endif // _IOMAPPER_INCLUDED\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/limits.cpp",
    "content": "//\n// Copyright (C) 2013 LunarG, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n//\n// Do sub tree walks for\n// 1) inductive loop bodies to see if the inductive variable is modified\n// 2) array-index expressions to see if they are \"constant-index-expression\"\n//\n// These are per Appendix A of ES 2.0:\n//\n// \"Within the body of the loop, the loop index is not statically assigned to nor is it used as the\n// argument to a function out or inout parameter.\"\n//\n// \"The following are constant-index-expressions:\n//  - Constant expressions\n//  - Loop indices as defined in section 4\n//  - Expressions composed of both of the above\"\n//\n// N.B.: assuming the last rule excludes function calls\n//\n\n#include \"ParseHelper.h\"\n\nnamespace glslang {\n\n//\n// The inductive loop-body traverser.\n//\n// Just look at things that might modify the loop index.\n//\n\nclass TInductiveTraverser : public TIntermTraverser {\npublic:\n    TInductiveTraverser(long long id, TSymbolTable& st)\n    : loopId(id), symbolTable(st), bad(false)  { }\n\n    virtual bool visitBinary(TVisit, TIntermBinary* node);\n    virtual bool visitUnary(TVisit, TIntermUnary* node);\n    virtual bool visitAggregate(TVisit, TIntermAggregate* node);\n\n    long long loopId;           // unique ID of the symbol that's the loop inductive variable\n    TSymbolTable& symbolTable;\n    bool bad;\n    TSourceLoc badLoc;\n\nprotected:\n    TInductiveTraverser(TInductiveTraverser&);\n    TInductiveTraverser& operator=(TInductiveTraverser&);\n};\n\n// check binary operations for those modifying the loop index\nbool TInductiveTraverser::visitBinary(TVisit /* visit */, TIntermBinary* node)\n{\n    if (node->modifiesState() && node->getLeft()->getAsSymbolNode() &&\n                                 node->getLeft()->getAsSymbolNode()->getId() == loopId) {\n        bad = true;\n        badLoc = node->getLoc();\n    }\n\n    return true;\n}\n\n// check unary operations for those modifying the loop index\nbool TInductiveTraverser::visitUnary(TVisit /* visit */, TIntermUnary* node)\n{\n    if (node->modifiesState() && node->getOperand()->getAsSymbolNode() &&\n                                 node->getOperand()->getAsSymbolNode()->getId() == loopId) {\n        bad = true;\n        badLoc = node->getLoc();\n    }\n\n    return true;\n}\n\n// check function calls for arguments modifying the loop index\nbool TInductiveTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node)\n{\n    if (node->getOp() == EOpFunctionCall) {\n        // see if an out or inout argument is the loop index\n        const TIntermSequence& args = node->getSequence();\n        for (int i = 0; i < (int)args.size(); ++i) {\n            if (args[i]->getAsSymbolNode() && args[i]->getAsSymbolNode()->getId() == loopId) {\n                TSymbol* function = symbolTable.find(node->getName());\n                const TType* type = (*function->getAsFunction())[i].type;\n                if (type->getQualifier().storage == EvqOut ||\n                    type->getQualifier().storage == EvqInOut) {\n                    bad = true;\n                    badLoc = node->getLoc();\n                }\n            }\n        }\n    }\n\n    return true;\n}\n\n//\n// External function to call for loop check.\n//\nvoid TParseContext::inductiveLoopBodyCheck(TIntermNode* body, long long loopId, TSymbolTable& symbolTable)\n{\n    TInductiveTraverser it(loopId, symbolTable);\n\n    if (body == nullptr)\n        return;\n\n    body->traverse(&it);\n\n    if (it.bad)\n        error(it.badLoc, \"inductive loop index modified\", \"limitations\", \"\");\n}\n\n//\n// The \"constant-index-expression\" tranverser.\n//\n// Just look at things that can form an index.\n//\n\nclass TIndexTraverser : public TIntermTraverser {\npublic:\n    TIndexTraverser(const TIdSetType& ids) : inductiveLoopIds(ids), bad(false) { }\n    virtual void visitSymbol(TIntermSymbol* symbol);\n    virtual bool visitAggregate(TVisit, TIntermAggregate* node);\n    const TIdSetType& inductiveLoopIds;\n    bool bad;\n    TSourceLoc badLoc;\n\nprotected:\n    TIndexTraverser(TIndexTraverser&);\n    TIndexTraverser& operator=(TIndexTraverser&);\n};\n\n// make sure symbols are inductive-loop indexes\nvoid TIndexTraverser::visitSymbol(TIntermSymbol* symbol)\n{\n    if (inductiveLoopIds.find(symbol->getId()) == inductiveLoopIds.end()) {\n        bad = true;\n        badLoc = symbol->getLoc();\n    }\n}\n\n// check for function calls, assuming they are bad; spec. doesn't really say\nbool TIndexTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node)\n{\n    if (node->getOp() == EOpFunctionCall) {\n        bad = true;\n        badLoc = node->getLoc();\n    }\n\n    return true;\n}\n\n//\n// External function to call for loop check.\n//\nvoid TParseContext::constantIndexExpressionCheck(TIntermNode* index)\n{\n    TIndexTraverser it(inductiveLoopIds);\n\n    index->traverse(&it);\n\n    if (it.bad)\n        error(it.badLoc, \"Non-constant-index-expression\", \"limitations\", \"\");\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/linkValidate.cpp",
    "content": "//\n// Copyright (C) 2013 LunarG, Inc.\n// Copyright (C) 2017 ARM Limited.\n// Copyright (C) 2015-2018 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n//\n// Do link-time merging and validation of intermediate representations.\n//\n// Basic model is that during compilation, each compilation unit (shader) is\n// compiled into one TIntermediate instance.  Then, at link time, multiple\n// units for the same stage can be merged together, which can generate errors.\n// Then, after all merging, a single instance of TIntermediate represents\n// the whole stage.  A final error check can be done on the resulting stage,\n// even if no merging was done (i.e., the stage was only one compilation unit).\n//\n\n#include \"../../glslang/Public/ShaderLang.h\"\n#include \"localintermediate.h\"\n#include \"../Include/InfoSink.h\"\n#include \"SymbolTable.h\"\n#include \"LiveTraverser.h\"\n\nnamespace glslang {\n\n//\n// Link-time error emitter.\n//\nvoid TIntermediate::error(TInfoSink& infoSink, const TSourceLoc* loc, EShMessages messages, const char* message,\n                          EShLanguage unitStage)\n{\n    infoSink.info.prefix(EPrefixError);\n    if (loc)\n        infoSink.info.location(*loc, messages & EShMsgAbsolutePath, messages & EShMsgDisplayErrorColumn);\n    if (unitStage == EShLangCount)\n        infoSink.info << \"Linking \" << StageName(language) << \" stage: \" << message << \"\\n\";\n    else if (language == EShLangCount)\n        infoSink.info << \"Linking \" << StageName(unitStage) << \" stage: \" << message << \"\\n\";\n    else\n        infoSink.info << \"Linking \" << StageName(language) << \" and \" << StageName(unitStage) << \" stages: \" << message << \"\\n\";\n\n    ++numErrors;\n}\n\n// Link-time warning.\nvoid TIntermediate::warn(TInfoSink& infoSink, const TSourceLoc* loc, EShMessages messages, const char* message,\n                         EShLanguage unitStage)\n{\n    infoSink.info.prefix(EPrefixWarning);\n    if (loc)\n        infoSink.info.location(*loc, messages & EShMsgAbsolutePath, messages & EShMsgDisplayErrorColumn);\n    if (unitStage == EShLangCount)\n        infoSink.info << \"Linking \" << StageName(language) << \" stage: \" << message << \"\\n\";\n    else if (language == EShLangCount)\n        infoSink.info << \"Linking \" << StageName(unitStage) << \" stage: \" << message << \"\\n\";\n    else\n        infoSink.info << \"Linking \" << StageName(language) << \" and \" << StageName(unitStage) << \" stages: \" << message << \"\\n\";\n}\n\n// TODO: 4.4 offset/align:  \"Two blocks linked together in the same program with the same block\n// name must have the exact same set of members qualified with offset and their integral-constant\n// expression values must be the same, or a link-time error results.\"\n\n//\n// Merge the information from 'unit' into 'this'\n//\nvoid TIntermediate::merge(TInfoSink& infoSink, TIntermediate& unit)\n{\n    mergeCallGraphs(infoSink, unit);\n    mergeModes(infoSink, unit);\n    mergeTrees(infoSink, unit);\n}\n\n//\n// check that link objects between stages\n//\nvoid TIntermediate::mergeUniformObjects(TInfoSink& infoSink, TIntermediate& unit) {\n    if (unit.treeRoot == nullptr || treeRoot == nullptr)\n        return;\n\n    // Get the linker-object lists\n    TIntermSequence& linkerObjects = findLinkerObjects()->getSequence();\n    TIntermSequence unitLinkerObjects = unit.findLinkerObjects()->getSequence();\n\n    // filter unitLinkerObjects to only contain uniforms\n    auto end = std::remove_if(unitLinkerObjects.begin(), unitLinkerObjects.end(),\n        [](TIntermNode* node) {return node->getAsSymbolNode()->getQualifier().storage != EvqUniform &&\n                                      node->getAsSymbolNode()->getQualifier().storage != EvqBuffer; });\n    unitLinkerObjects.resize(end - unitLinkerObjects.begin());\n\n    // merge uniforms and do error checking\n    bool mergeExistingOnly = false;\n    mergeGlobalUniformBlocks(infoSink, unit, mergeExistingOnly);\n    mergeLinkerObjects(infoSink, linkerObjects, unitLinkerObjects, unit.getStage());\n}\n\nstatic inline bool isSameInterface(TIntermSymbol* symbol, TIntermSymbol* unitSymbol) {\n    EShLanguage stage = symbol->getStage();\n    EShLanguage unitStage = unitSymbol->getStage();\n    return // 1) same stage and same shader interface\n        (stage == unitStage && symbol->getType().getShaderInterface() == unitSymbol->getType().getShaderInterface()) ||\n        // 2) accross stages and both are uniform or buffer\n        (symbol->getQualifier().storage == EvqUniform  && unitSymbol->getQualifier().storage == EvqUniform) ||\n        (symbol->getQualifier().storage == EvqBuffer   && unitSymbol->getQualifier().storage == EvqBuffer) ||\n        // 3) in/out matched across stage boundary\n        (stage < unitStage && symbol->getQualifier().storage == EvqVaryingOut  && unitSymbol->getQualifier().storage == EvqVaryingIn) ||\n        (unitStage < stage && symbol->getQualifier().storage == EvqVaryingIn && unitSymbol->getQualifier().storage == EvqVaryingOut);\n}\n\nstatic bool isSameSymbol(TIntermSymbol* symbol1, TIntermSymbol* symbol2) {\n    // If they are both blocks in the same shader interface,\n    // match by the block-name, not the identifier name.\n    if (symbol1->getType().getBasicType() == EbtBlock && symbol2->getType().getBasicType() == EbtBlock) {\n        if (isSameInterface(symbol1, symbol2)) {\n            return symbol1->getType().getTypeName() == symbol2->getType().getTypeName();\n        }\n    } else if (symbol1->getName() == symbol2->getName())\n        return true;\n    return false;\n}\n\n//\n// merge implicit array sizes for uniform/buffer objects\n//\nvoid TIntermediate::mergeImplicitArraySizes(TInfoSink&, TIntermediate& unit) {\n    if (unit.treeRoot == nullptr || treeRoot == nullptr)\n        return;\n\n    // Get the linker-object lists\n    TIntermSequence& linkerObjects = findLinkerObjects()->getSequence();\n    TIntermSequence unitLinkerObjects = unit.findLinkerObjects()->getSequence();\n\n    // filter unitLinkerObjects to only contain uniforms\n    auto end = std::remove_if(unitLinkerObjects.begin(), unitLinkerObjects.end(),\n        [](TIntermNode* node) {return node->getAsSymbolNode()->getQualifier().storage != EvqUniform &&\n                                      node->getAsSymbolNode()->getQualifier().storage != EvqBuffer; });\n    unitLinkerObjects.resize(end - unitLinkerObjects.begin());\n\n    std::size_t initialNumLinkerObjects = linkerObjects.size();\n    for (unsigned int unitLinkObj = 0; unitLinkObj < unitLinkerObjects.size(); ++unitLinkObj) {\n        for (std::size_t linkObj = 0; linkObj < initialNumLinkerObjects; ++linkObj) {\n            TIntermSymbol* symbol = linkerObjects[linkObj]->getAsSymbolNode();\n            TIntermSymbol* unitSymbol = unitLinkerObjects[unitLinkObj]->getAsSymbolNode();\n            assert(symbol && unitSymbol);\n\n            if (isSameSymbol(symbol, unitSymbol)) {\n                // Update implicit array sizes\n                mergeImplicitArraySizes(symbol->getWritableType(), unitSymbol->getType());\n            }\n        }\n    }\n}\n\n//\n// do error checking on the shader boundary in / out vars\n//\nvoid TIntermediate::checkStageIO(TInfoSink& infoSink, TIntermediate& unit, EShMessages messages) {\n    if (unit.treeRoot == nullptr || treeRoot == nullptr)\n        return;\n\n    // Get copies of the linker-object lists\n    TIntermSequence linkerObjects = findLinkerObjects()->getSequence();\n    TIntermSequence unitLinkerObjects = unit.findLinkerObjects()->getSequence();\n\n    // filter linkerObjects to only contain out variables\n    auto end = std::remove_if(linkerObjects.begin(), linkerObjects.end(),\n        [](TIntermNode* node) {return node->getAsSymbolNode()->getQualifier().storage != EvqVaryingOut; });\n    linkerObjects.resize(end - linkerObjects.begin());\n\n    // filter unitLinkerObjects to only contain in variables\n    auto unitEnd = std::remove_if(unitLinkerObjects.begin(), unitLinkerObjects.end(),\n        [](TIntermNode* node) {return node->getAsSymbolNode()->getQualifier().storage != EvqVaryingIn; });\n    unitLinkerObjects.resize(unitEnd - unitLinkerObjects.begin());\n\n    // do matching and error checking\n    mergeLinkerObjects(infoSink, linkerObjects, unitLinkerObjects, unit.getStage());\n\n    if ((messages & EShMsgValidateCrossStageIO) == 0)\n        return;\n\n    // The OpenGL Shading Language, Version 4.60.8 (https://registry.khronos.org/OpenGL/specs/gl/GLSLangSpec.4.60.pdf)\n    // 4.3.4 Input Variables\n    // Only the input variables that are statically read need to be written by the previous stage; it is\n    // allowed to have superfluous declarations of input variables. This is shown in the following table.\n    // +------------------------------------------------------------------------------------------------+\n    // | Treatment of Mismatched Input        | Consuming Shader (input variables)                      |\n    // | Variables                            |---------------------------------------------------------|\n    // |                                      | No          | Declared but no | Declared and Static Use |\n    // |                                      | Declaration | Static Use      |                         |\n    // |--------------------------------------+-------------+-----------------+-------------------------|\n    // | Generating Shader  | No Declaration  | Allowed     | Allowed         | Link-Time Error         |\n    // | (output variables) |-----------------+-------------+-----------------+-------------------------|\n    // |                    | Declared but no | Allowed     | Allowed         | Allowed (values are     |\n    // |                    | Static Use      |             |                 | undefined)              |\n    // |                    |-----------------+-------------+-----------------+-------------------------|\n    // |                    | Declared and    | Allowed     | Allowed         | Allowed (values are     |\n    // |                    | Static Use      |             |                 | potentially undefined)  |\n    // +------------------------------------------------------------------------------------------------+\n    // Consumption errors are based on static use only. Compilation may generate a warning, but not an\n    // error, for any dynamic use the compiler can deduce that might cause consumption of undefined values.\n\n    // TODO: implement support for geometry passthrough\n    if (getGeoPassthroughEXT()) {\n        unit.warn(infoSink, \"GL_NV_geometry_shader_passthrough is enabled, skipping cross-stage IO validation\",\n                  getStage());\n        return;\n    }\n\n    class TIOTraverser : public TLiveTraverser {\n    public:\n        TIOTraverser(TIntermediate& i, bool all, TIntermSequence& sequence, TStorageQualifier storage)\n            : TLiveTraverser(i, all, true, false, false), sequence(sequence), storage(storage)\n        {\n        }\n\n        virtual void visitSymbol(TIntermSymbol* symbol)\n        {\n            if (symbol->getQualifier().storage == storage)\n                sequence.push_back(symbol);\n        }\n\n    private:\n        TIntermSequence& sequence;\n        TStorageQualifier storage;\n    };\n\n    // live symbols only\n    TIntermSequence unitLiveInputs;\n\n    TIOTraverser unitTraverser(unit, false, unitLiveInputs, EvqVaryingIn);\n    unitTraverser.pushFunction(unit.getEntryPointMangledName().c_str());\n    while (! unitTraverser.destinations.empty()) {\n        TIntermNode* destination = unitTraverser.destinations.back();\n        unitTraverser.destinations.pop_back();\n        destination->traverse(&unitTraverser);\n    }\n\n    // all symbols\n    TIntermSequence allOutputs;\n\n    TIOTraverser traverser(*this, true, allOutputs, EvqVaryingOut);\n    getTreeRoot()->traverse(&traverser);\n\n    std::unordered_set<int> outputLocations;\n    for (auto& output : allOutputs) {\n        if (output->getAsSymbolNode()->getBasicType() == EbtBlock) {\n            int lastLocation = -1;\n            if (output->getAsSymbolNode()->getQualifier().hasLocation())\n                lastLocation = output->getAsSymbolNode()->getQualifier().layoutLocation;\n            const TTypeList* members = output->getAsSymbolNode()->getType().getStruct();\n            for (auto& member : *members) {\n                int location = lastLocation;\n                if (member.type->getQualifier().hasLocation())\n                    location = member.type->getQualifier().layoutLocation;\n                if (location != -1) {\n                    int locationSize = TIntermediate::computeTypeLocationSize(*member.type, getStage());\n                    for (int i = 0; i < locationSize; ++i)\n                        outputLocations.insert(location + i);\n                    lastLocation = location + locationSize;\n                }\n            }\n        } else {\n            int locationSize = TIntermediate::computeTypeLocationSize(output->getAsSymbolNode()->getType(), getStage());\n            for (int i = 0; i < locationSize; ++i)\n                outputLocations.insert(output->getAsSymbolNode()->getQualifier().layoutLocation + i);\n        }\n    }\n\n    // remove unitStage inputs with matching outputs in the current stage\n    auto liveEnd = std::remove_if(\n        unitLiveInputs.begin(), unitLiveInputs.end(), [this, &allOutputs, &outputLocations](TIntermNode* input) {\n            // ignore built-ins\n            if (input->getAsSymbolNode()->getAccessName().compare(0, 3, \"gl_\") == 0)\n                return true;\n            // try to match by location\n            if (input->getAsSymbolNode()->getQualifier().hasLocation() &&\n                outputLocations.find(input->getAsSymbolNode()->getQualifier().layoutLocation) != outputLocations.end())\n                return true;\n            if (input->getAsSymbolNode()->getBasicType() == EbtBlock) {\n                int lastLocation = -1;\n                if (input->getAsSymbolNode()->getQualifier().hasLocation())\n                    lastLocation = input->getAsSymbolNode()->getQualifier().layoutLocation;\n                const TTypeList* members = input->getAsSymbolNode()->getType().getStruct();\n                for (auto& member : *members) {\n                    int location = lastLocation;\n                    if (member.type->getQualifier().hasLocation())\n                        location = member.type->getQualifier().layoutLocation;\n                    if (location != -1) {\n                        int locationSize = TIntermediate::computeTypeLocationSize(*member.type, getStage());\n                        for (int i = 0; i < locationSize; ++i)\n                            if (outputLocations.find(location + i) != outputLocations.end())\n                                return true;\n                        lastLocation = location + locationSize;\n                    }\n                }\n            }\n            // otherwise, try to match by name\n            return std::any_of(allOutputs.begin(), allOutputs.end(), [input](TIntermNode* output) {\n                return output->getAsSymbolNode()->getAccessName() == input->getAsSymbolNode()->getAccessName();\n            });\n        });\n    unitLiveInputs.resize(liveEnd - unitLiveInputs.begin());\n\n    // check remaining loose unitStage inputs for a matching output block member\n    liveEnd = std::remove_if(unitLiveInputs.begin(), unitLiveInputs.end(), [&allOutputs](TIntermNode* input) {\n        return std::any_of(allOutputs.begin(), allOutputs.end(), [input](TIntermNode* output) {\n            if (output->getAsSymbolNode()->getBasicType() != EbtBlock)\n                return false;\n            const TTypeList* members = output->getAsSymbolNode()->getType().getStruct();\n            return std::any_of(members->begin(), members->end(), [input](TTypeLoc type) {\n                return type.type->getFieldName() == input->getAsSymbolNode()->getName();\n            });\n        });\n    });\n    unitLiveInputs.resize(liveEnd - unitLiveInputs.begin());\n\n    // finally, check remaining unitStage block inputs for a matching loose output\n    liveEnd = std::remove_if(\n        unitLiveInputs.begin(), unitLiveInputs.end(), [&allOutputs](TIntermNode* input) {\n            if (input->getAsSymbolNode()->getBasicType() != EbtBlock)\n                return false;\n            // liveness isn't tracked per member so finding any one live member is the best we can do\n            const TTypeList* members = input->getAsSymbolNode()->getType().getStruct();\n            return std::any_of(members->begin(), members->end(), [allOutputs](TTypeLoc type) {\n                return std::any_of(allOutputs.begin(), allOutputs.end(), [&type](TIntermNode* output) {\n                    return type.type->getFieldName() == output->getAsSymbolNode()->getName();\n                });\n            });\n        });\n    unitLiveInputs.resize(liveEnd - unitLiveInputs.begin());\n\n    // any remaining unitStage inputs have no matching output\n    std::for_each(unitLiveInputs.begin(), unitLiveInputs.end(), [&](TIntermNode* input) {\n        unit.error(infoSink, &input->getLoc(), messages,\n                   \"Preceding stage has no matching declaration for statically used input:\", getStage());\n        infoSink.info << \"    \"\n                      << input->getAsSymbolNode()->getType().getCompleteString(\n                             true, true, false, true, input->getAsSymbolNode()->getAccessName())\n                      << \"\\n\";\n    });\n\n    // TODO: warn about statically read inputs with outputs declared but not written to\n}\n\nvoid TIntermediate::optimizeStageIO(TInfoSink&, TIntermediate& unit)\n{\n    // don't do any input/output demotion on compute, raytracing, or task/mesh stages\n    // TODO: support task/mesh\n    if (getStage() > EShLangFragment || unit.getStage() > EShLangFragment) {\n        return;\n    }\n\n    class TIOTraverser : public TLiveTraverser {\n    public:\n        TIOTraverser(TIntermediate& i, bool all, TIntermSequence& sequence, TStorageQualifier storage)\n            : TLiveTraverser(i, all, true, false, false), sequence(sequence), storage(storage)\n        {\n        }\n\n        virtual void visitSymbol(TIntermSymbol* symbol)\n        {\n            if (symbol->getQualifier().storage == storage) {\n                sequence.push_back(symbol);\n            }\n        }\n\n    private:\n        TIntermSequence& sequence;\n        TStorageQualifier storage;\n    };\n\n    // live symbols only\n    TIntermSequence unitLiveInputs;\n\n    TIOTraverser unitTraverser(unit, false, unitLiveInputs, EvqVaryingIn);\n    unitTraverser.pushFunction(unit.getEntryPointMangledName().c_str());\n    while (! unitTraverser.destinations.empty()) {\n        TIntermNode* destination = unitTraverser.destinations.back();\n        unitTraverser.destinations.pop_back();\n        destination->traverse(&unitTraverser);\n    }\n\n    TIntermSequence allOutputs;\n    TIntermSequence unitAllInputs;\n\n    TIOTraverser allTraverser(*this, true, allOutputs, EvqVaryingOut);\n    getTreeRoot()->traverse(&allTraverser);\n\n    TIOTraverser unitAllTraverser(unit, true, unitAllInputs, EvqVaryingIn);\n    unit.getTreeRoot()->traverse(&unitAllTraverser);\n\n    // find outputs not consumed by the next stage\n    std::for_each(allOutputs.begin(), allOutputs.end(), [&unitLiveInputs, &unitAllInputs](TIntermNode* output) {\n        // don't do anything to builtins\n        if (output->getAsSymbolNode()->getAccessName().compare(0, 3, \"gl_\") == 0)\n            return;\n\n        // don't demote block outputs (for now)\n        if (output->getAsSymbolNode()->getBasicType() == EbtBlock)\n            return;\n\n        // check if the (loose) output has a matching loose input\n        auto isMatchingInput = [output](TIntermNode* input) {\n            return output->getAsSymbolNode()->getAccessName() == input->getAsSymbolNode()->getAccessName();\n        };\n\n        // check if the (loose) output has a matching block member input\n        auto isMatchingInputBlockMember = [output](TIntermNode* input) {\n            // ignore loose inputs\n            if (input->getAsSymbolNode()->getBasicType() != EbtBlock)\n                return false;\n\n            // don't demote loose outputs with matching input block members\n            auto isMatchingBlockMember = [output](TTypeLoc type) {\n                return type.type->getFieldName() == output->getAsSymbolNode()->getName();\n            };\n            const TTypeList* members = input->getAsSymbolNode()->getType().getStruct();\n            return std::any_of(members->begin(), members->end(), isMatchingBlockMember);\n        };\n\n        // determine if the input/output pair should be demoted\n        // do the faster (and more likely) loose-loose check first\n        if (std::none_of(unitLiveInputs.begin(), unitLiveInputs.end(), isMatchingInput) && \n            std::none_of(unitAllInputs.begin(), unitAllInputs.end(), isMatchingInputBlockMember)) {\n            // demote any input matching the output\n            auto demoteMatchingInputs = [output](TIntermNode* input) {\n                if (output->getAsSymbolNode()->getAccessName() == input->getAsSymbolNode()->getAccessName()) {\n                    // demote input to a plain variable\n                    TIntermSymbol* symbol = input->getAsSymbolNode();\n                    symbol->getQualifier().storage = EvqGlobal;\n                    symbol->getQualifier().clearInterstage();\n                    symbol->getQualifier().clearLayout();\n                }\n            };\n\n            // demote all matching outputs to a plain variable\n            TIntermSymbol* symbol = output->getAsSymbolNode();\n            symbol->getQualifier().storage = EvqGlobal;\n            symbol->getQualifier().clearInterstage();\n            symbol->getQualifier().clearLayout();\n            std::for_each(unitAllInputs.begin(), unitAllInputs.end(), demoteMatchingInputs);\n        }\n    });\n}\n\nvoid TIntermediate::mergeCallGraphs(TInfoSink& infoSink, TIntermediate& unit)\n{\n    if (unit.getNumEntryPoints() > 0) {\n        if (getNumEntryPoints() > 0)\n            error(infoSink, \"can't handle multiple entry points per stage\");\n        else {\n            entryPointName = unit.getEntryPointName();\n            entryPointMangledName = unit.getEntryPointMangledName();\n        }\n    }\n    numEntryPoints += unit.getNumEntryPoints();\n\n    callGraph.insert(callGraph.end(), unit.callGraph.begin(), unit.callGraph.end());\n}\n\n#define MERGE_MAX(member) member = std::max(member, unit.member)\n#define MERGE_TRUE(member) if (unit.member) member = unit.member;\n\nvoid TIntermediate::mergeModes(TInfoSink& infoSink, TIntermediate& unit)\n{\n    if (language != unit.language)\n        error(infoSink, \"stages must match when linking into a single stage\");\n\n    if (getSource() == EShSourceNone)\n        setSource(unit.getSource());\n    if (getSource() != unit.getSource())\n        error(infoSink, \"can't link compilation units from different source languages\");\n\n    if (treeRoot == nullptr) {\n        profile = unit.profile;\n        version = unit.version;\n        requestedExtensions = unit.requestedExtensions;\n    } else {\n        if ((isEsProfile()) != (unit.isEsProfile()))\n            error(infoSink, \"Cannot cross link ES and desktop profiles\");\n        else if (unit.profile == ECompatibilityProfile)\n            profile = ECompatibilityProfile;\n        version = std::max(version, unit.version);\n        requestedExtensions.insert(unit.requestedExtensions.begin(), unit.requestedExtensions.end());\n    }\n\n    MERGE_MAX(spvVersion.spv);\n    MERGE_MAX(spvVersion.vulkanGlsl);\n    MERGE_MAX(spvVersion.vulkan);\n    MERGE_MAX(spvVersion.openGl);\n    MERGE_TRUE(spvVersion.vulkanRelaxed);\n\n    numErrors += unit.getNumErrors();\n    // Only one push_constant is allowed, mergeLinkerObjects() will ensure the push_constant\n    // is the same for all units.\n    if (numPushConstants > 1 || unit.numPushConstants > 1)\n        error(infoSink, \"Only one push_constant block is allowed per stage\");\n    numPushConstants = std::min(numPushConstants + unit.numPushConstants, 1);\n\n    if (unit.invocations != TQualifier::layoutNotSet) {\n        if (invocations == TQualifier::layoutNotSet)\n            invocations = unit.invocations;\n        else if (invocations != unit.invocations)\n            error(infoSink, \"number of invocations must match between compilation units\");\n    }\n\n    if (vertices == TQualifier::layoutNotSet)\n        vertices = unit.vertices;\n    else if (unit.vertices != TQualifier::layoutNotSet && vertices != unit.vertices) {\n        if (language == EShLangGeometry || language == EShLangMesh)\n            error(infoSink, \"Contradictory layout max_vertices values\");\n        else if (language == EShLangTessControl)\n            error(infoSink, \"Contradictory layout vertices values\");\n        else\n            assert(0);\n    }\n    if (primitives == TQualifier::layoutNotSet)\n        primitives = unit.primitives;\n    else if (primitives != unit.primitives) {\n        if (language == EShLangMesh)\n            error(infoSink, \"Contradictory layout max_primitives values\");\n        else\n            assert(0);\n    }\n\n    if (inputPrimitive == ElgNone)\n        inputPrimitive = unit.inputPrimitive;\n    else if (unit.inputPrimitive != ElgNone && inputPrimitive != unit.inputPrimitive)\n        error(infoSink, \"Contradictory input layout primitives\");\n\n    if (outputPrimitive == ElgNone)\n        outputPrimitive = unit.outputPrimitive;\n    else if (unit.outputPrimitive != ElgNone && outputPrimitive != unit.outputPrimitive)\n        error(infoSink, \"Contradictory output layout primitives\");\n\n    if (originUpperLeft != unit.originUpperLeft || pixelCenterInteger != unit.pixelCenterInteger)\n        error(infoSink, \"gl_FragCoord redeclarations must match across shaders\");\n\n    if (vertexSpacing == EvsNone)\n        vertexSpacing = unit.vertexSpacing;\n    else if (vertexSpacing != unit.vertexSpacing)\n        error(infoSink, \"Contradictory input vertex spacing\");\n\n    if (vertexOrder == EvoNone)\n        vertexOrder = unit.vertexOrder;\n    else if (vertexOrder != unit.vertexOrder)\n        error(infoSink, \"Contradictory triangle ordering\");\n\n    MERGE_TRUE(pointMode);\n\n    for (int i = 0; i < 3; ++i) {\n        if (unit.localSizeNotDefault[i]) {\n            if (!localSizeNotDefault[i]) {\n                localSize[i] = unit.localSize[i];\n                localSizeNotDefault[i] = true;\n            }\n            else if (localSize[i] != unit.localSize[i])\n                error(infoSink, \"Contradictory local size\");\n        }\n\n        if (localSizeSpecId[i] == TQualifier::layoutNotSet)\n            localSizeSpecId[i] = unit.localSizeSpecId[i];\n        else if (localSizeSpecId[i] != unit.localSizeSpecId[i])\n            error(infoSink, \"Contradictory local size specialization ids\");\n    }\n\n    MERGE_TRUE(earlyFragmentTests);\n    MERGE_TRUE(postDepthCoverage);\n    MERGE_TRUE(nonCoherentColorAttachmentReadEXT);\n    MERGE_TRUE(nonCoherentDepthAttachmentReadEXT);\n    MERGE_TRUE(nonCoherentStencilAttachmentReadEXT);\n    MERGE_TRUE(nonCoherentTileAttachmentReadQCOM);\n\n    if (depthLayout == EldNone)\n        depthLayout = unit.depthLayout;\n    else if (depthLayout != unit.depthLayout)\n        error(infoSink, \"Contradictory depth layouts\");\n\n    MERGE_TRUE(depthReplacing);\n    MERGE_TRUE(hlslFunctionality1);\n\n    blendEquations |= unit.blendEquations;\n\n    MERGE_TRUE(xfbMode);\n\n    for (size_t b = 0; b < xfbBuffers.size(); ++b) {\n        if (xfbBuffers[b].stride == TQualifier::layoutXfbStrideEnd)\n            xfbBuffers[b].stride = unit.xfbBuffers[b].stride;\n        else if (xfbBuffers[b].stride != unit.xfbBuffers[b].stride)\n            error(infoSink, \"Contradictory xfb_stride\");\n        xfbBuffers[b].implicitStride = std::max(xfbBuffers[b].implicitStride, unit.xfbBuffers[b].implicitStride);\n        if (unit.xfbBuffers[b].contains64BitType)\n            xfbBuffers[b].contains64BitType = true;\n        if (unit.xfbBuffers[b].contains32BitType)\n            xfbBuffers[b].contains32BitType = true;\n        if (unit.xfbBuffers[b].contains16BitType)\n            xfbBuffers[b].contains16BitType = true;\n        // TODO: 4.4 link: enhanced layouts: compare ranges\n    }\n\n    MERGE_TRUE(multiStream);\n    MERGE_TRUE(layoutOverrideCoverage);\n    MERGE_TRUE(geoPassthroughEXT);\n\n    for (unsigned int i = 0; i < unit.shiftBinding.size(); ++i) {\n        if (unit.shiftBinding[i] > 0)\n            setShiftBinding((TResourceType)i, unit.shiftBinding[i]);\n    }\n\n    for (unsigned int i = 0; i < unit.shiftBindingForSet.size(); ++i) {\n        for (auto it = unit.shiftBindingForSet[i].begin(); it != unit.shiftBindingForSet[i].end(); ++it)\n            setShiftBindingForSet((TResourceType)i, it->second, it->first);\n    }\n\n    resourceSetBinding.insert(resourceSetBinding.end(), unit.resourceSetBinding.begin(), unit.resourceSetBinding.end());\n\n    MERGE_TRUE(autoMapBindings);\n    MERGE_TRUE(autoMapLocations);\n    MERGE_TRUE(invertY);\n    MERGE_TRUE(dxPositionW);\n    MERGE_TRUE(debugInfo);\n    MERGE_TRUE(flattenUniformArrays);\n    MERGE_TRUE(useUnknownFormat);\n    MERGE_TRUE(hlslOffsets);\n    MERGE_TRUE(useStorageBuffer);\n    MERGE_TRUE(invariantAll);\n    MERGE_TRUE(hlslIoMapping);\n\n    // TODO: sourceFile\n    // TODO: sourceText\n    // TODO: processes\n\n    MERGE_TRUE(needToLegalize);\n    MERGE_TRUE(binaryDoubleOutput);\n    MERGE_TRUE(usePhysicalStorageBuffer);\n}\n\n//\n// Merge the 'unit' AST into 'this' AST.\n// That includes rationalizing the unique IDs, which were set up independently,\n// and might have overlaps that are not the same symbol, or might have different\n// IDs for what should be the same shared symbol.\n//\nvoid TIntermediate::mergeTrees(TInfoSink& infoSink, TIntermediate& unit)\n{\n    if (unit.treeRoot == nullptr)\n        return;\n\n    if (treeRoot == nullptr) {\n        treeRoot = unit.treeRoot;\n        return;\n    }\n\n    // Getting this far means we have two existing trees to merge...\n    numShaderRecordBlocks += unit.numShaderRecordBlocks;\n    numTaskNVBlocks += unit.numTaskNVBlocks;\n\n    // Get the top-level globals of each unit\n    TIntermSequence& globals = treeRoot->getAsAggregate()->getSequence();\n    TIntermSequence& unitGlobals = unit.treeRoot->getAsAggregate()->getSequence();\n\n    // Get the linker-object lists\n    TIntermSequence& linkerObjects = findLinkerObjects()->getSequence();\n    const TIntermSequence& unitLinkerObjects = unit.findLinkerObjects()->getSequence();\n\n    // Map by global name to unique ID to rationalize the same object having\n    // differing IDs in different trees.\n    TIdMaps idMaps;\n    long long idShift;\n    seedIdMap(idMaps, idShift);\n    remapIds(idMaps, idShift + 1, unit);\n\n    mergeBodies(infoSink, globals, unitGlobals);\n    bool mergeExistingOnly = false;\n    mergeGlobalUniformBlocks(infoSink, unit, mergeExistingOnly);\n    mergeLinkerObjects(infoSink, linkerObjects, unitLinkerObjects, unit.getStage());\n    ioAccessed.insert(unit.ioAccessed.begin(), unit.ioAccessed.end());\n}\n\nstatic const TString& getNameForIdMap(TIntermSymbol* symbol)\n{\n    TShaderInterface si = symbol->getType().getShaderInterface();\n    if (si == EsiNone)\n        return symbol->getName();\n    else\n        return symbol->getType().getTypeName();\n}\n\n\n\n// Traverser that seeds an ID map with all built-ins, and tracks the\n// maximum ID used, currently using (maximum ID + 1) as new symbol id shift seed.\n// Level id will keep same after shifting.\n// (It would be nice to put this in a function, but that causes warnings\n// on having no bodies for the copy-constructor/operator=.)\nclass TBuiltInIdTraverser : public TIntermTraverser {\npublic:\n    TBuiltInIdTraverser(TIdMaps& idMaps) : idMaps(idMaps), idShift(0) { }\n    // If it's a built in, add it to the map.\n    virtual void visitSymbol(TIntermSymbol* symbol)\n    {\n        const TQualifier& qualifier = symbol->getType().getQualifier();\n        if (qualifier.builtIn != EbvNone) {\n            TShaderInterface si = symbol->getType().getShaderInterface();\n            idMaps[si][getNameForIdMap(symbol)] = symbol->getId();\n        }\n        idShift = (symbol->getId() & ~TSymbolTable::uniqueIdMask) |\n                std::max(idShift & TSymbolTable::uniqueIdMask,\n                         symbol->getId() & TSymbolTable::uniqueIdMask);\n    }\n    long long getIdShift() const { return idShift; }\nprotected:\n    TBuiltInIdTraverser(TBuiltInIdTraverser&);\n    TBuiltInIdTraverser& operator=(TBuiltInIdTraverser&);\n    TIdMaps& idMaps;\n    long long idShift;\n};\n\n// Traverser that seeds an ID map with non-builtins.\n// (It would be nice to put this in a function, but that causes warnings\n// on having no bodies for the copy-constructor/operator=.)\nclass TUserIdTraverser : public TIntermTraverser {\npublic:\n    TUserIdTraverser(TIdMaps& idMaps) : idMaps(idMaps) { }\n    // If its a non-built-in global, add it to the map.\n    virtual void visitSymbol(TIntermSymbol* symbol)\n    {\n        const TQualifier& qualifier = symbol->getType().getQualifier();\n        if (qualifier.builtIn == EbvNone) {\n            TShaderInterface si = symbol->getType().getShaderInterface();\n            idMaps[si][getNameForIdMap(symbol)] = symbol->getId();\n        }\n    }\n\nprotected:\n    TUserIdTraverser(TUserIdTraverser&);\n    TUserIdTraverser& operator=(TUserIdTraverser&);\n    TIdMaps& idMaps; // over biggest id\n};\n\n// Initialize the the ID map with what we know of 'this' AST.\nvoid TIntermediate::seedIdMap(TIdMaps& idMaps, long long& idShift)\n{\n    // all built-ins everywhere need to align on IDs and contribute to the max ID\n    TBuiltInIdTraverser builtInIdTraverser(idMaps);\n    treeRoot->traverse(&builtInIdTraverser);\n    idShift = builtInIdTraverser.getIdShift() & TSymbolTable::uniqueIdMask;\n\n    // user variables in the linker object list need to align on ids\n    TUserIdTraverser userIdTraverser(idMaps);\n    findLinkerObjects()->traverse(&userIdTraverser);\n}\n\n// Traverser to map an AST ID to what was known from the seeding AST.\n// (It would be nice to put this in a function, but that causes warnings\n// on having no bodies for the copy-constructor/operator=.)\nclass TRemapIdTraverser : public TIntermTraverser {\npublic:\n    TRemapIdTraverser(const TIdMaps& idMaps, long long idShift) : idMaps(idMaps), idShift(idShift) { }\n    // Do the mapping:\n    //  - if the same symbol, adopt the 'this' ID\n    //  - otherwise, ensure a unique ID by shifting to a new space\n    virtual void visitSymbol(TIntermSymbol* symbol)\n    {\n        const TQualifier& qualifier = symbol->getType().getQualifier();\n        bool remapped = false;\n        if (qualifier.isLinkable() || qualifier.builtIn != EbvNone) {\n            TShaderInterface si = symbol->getType().getShaderInterface();\n            auto it = idMaps[si].find(getNameForIdMap(symbol));\n            if (it != idMaps[si].end()) {\n                uint64_t id = (symbol->getId() & ~TSymbolTable::uniqueIdMask) |\n                    (it->second & TSymbolTable::uniqueIdMask);\n                symbol->changeId(id);\n                remapped = true;\n            }\n        }\n        if (!remapped)\n            symbol->changeId(symbol->getId() + idShift);\n    }\nprotected:\n    TRemapIdTraverser(TRemapIdTraverser&);\n    TRemapIdTraverser& operator=(TRemapIdTraverser&);\n    const TIdMaps& idMaps;\n    long long idShift;\n};\n\nvoid TIntermediate::remapIds(const TIdMaps& idMaps, long long idShift, TIntermediate& unit)\n{\n    // Remap all IDs to either share or be unique, as dictated by the idMap and idShift.\n    TRemapIdTraverser idTraverser(idMaps, idShift);\n    unit.getTreeRoot()->traverse(&idTraverser);\n}\n\n//\n// Merge the function bodies and global-level initializers from unitGlobals into globals.\n// Will error check duplication of function bodies for the same signature.\n//\nvoid TIntermediate::mergeBodies(TInfoSink& infoSink, TIntermSequence& globals, const TIntermSequence& unitGlobals)\n{\n    // TODO: link-time performance: Processing in alphabetical order will be faster\n\n    // Error check the global objects, not including the linker objects\n    for (unsigned int child = 0; child < globals.size() - 1; ++child) {\n        for (unsigned int unitChild = 0; unitChild < unitGlobals.size() - 1; ++unitChild) {\n            TIntermAggregate* body = globals[child]->getAsAggregate();\n            TIntermAggregate* unitBody = unitGlobals[unitChild]->getAsAggregate();\n            if (body && unitBody && body->getOp() == EOpFunction && unitBody->getOp() == EOpFunction && body->getName() == unitBody->getName()) {\n                error(infoSink, \"Multiple function bodies in multiple compilation units for the same signature in the same stage:\");\n                infoSink.info << \"    \" << globals[child]->getAsAggregate()->getName() << \"\\n\";\n            }\n        }\n    }\n\n    // Merge the global objects, just in front of the linker objects\n    globals.insert(globals.end() - 1, unitGlobals.begin(), unitGlobals.end() - 1);\n}\n\n//\n// Global Unfiform block stores any default uniforms (i.e. uniforms without a block)\n// If two linked stages declare the same member, they are meant to be the same uniform\n// and need to be in the same block\n// merge the members of different stages to allow them to be linked properly\n// as a single block\n//\nvoid TIntermediate::mergeGlobalUniformBlocks(TInfoSink& infoSink, TIntermediate& unit, bool mergeExistingOnly)\n{\n    TIntermSequence& linkerObjects = findLinkerObjects()->getSequence();\n    TIntermSequence& unitLinkerObjects = unit.findLinkerObjects()->getSequence();\n\n    // build lists of default blocks from the intermediates\n    TIntermSequence defaultBlocks;\n    TIntermSequence unitDefaultBlocks;\n\n    auto filter = [](TIntermSequence& list, TIntermNode* node) {\n        if (node->getAsSymbolNode()->getQualifier().defaultBlock) {\n            list.push_back(node);\n        }\n    };\n\n    std::for_each(linkerObjects.begin(), linkerObjects.end(),\n        [&defaultBlocks, &filter](TIntermNode* node) {\n            filter(defaultBlocks, node);\n        });\n    std::for_each(unitLinkerObjects.begin(), unitLinkerObjects.end(),\n        [&unitDefaultBlocks, &filter](TIntermNode* node) {\n            filter(unitDefaultBlocks, node);\n    });\n\n    auto itUnitBlock = unitDefaultBlocks.begin();\n    for (; itUnitBlock != unitDefaultBlocks.end(); itUnitBlock++) {\n\n        bool add = !mergeExistingOnly;\n        auto itBlock = defaultBlocks.begin();\n\n        for (; itBlock != defaultBlocks.end(); itBlock++) {\n            TIntermSymbol* block = (*itBlock)->getAsSymbolNode();\n            TIntermSymbol* unitBlock = (*itUnitBlock)->getAsSymbolNode();\n\n            assert(block && unitBlock);\n\n            // if the two default blocks match, then merge their definitions\n            if (block->getType().getTypeName() == unitBlock->getType().getTypeName() &&\n                block->getQualifier().storage == unitBlock->getQualifier().storage) {\n                add = false;\n                mergeBlockDefinitions(infoSink, block, unitBlock, &unit);\n            }\n        }\n        if (add) {\n            // push back on original list; won't change the size of the list we're iterating over\n            linkerObjects.push_back(*itUnitBlock);\n        }\n    }\n}\n\nvoid TIntermediate::mergeBlockDefinitions(TInfoSink& infoSink, TIntermSymbol* block, TIntermSymbol* unitBlock, TIntermediate* unit) {\n\n    if (block->getType().getTypeName() != unitBlock->getType().getTypeName() ||\n        block->getType().getBasicType() != unitBlock->getType().getBasicType() ||\n        block->getQualifier().storage != unitBlock->getQualifier().storage ||\n        block->getQualifier().layoutSet != unitBlock->getQualifier().layoutSet) {\n        // different block names likely means different blocks\n        return;\n    }\n\n    // merge the struct\n    // order of declarations doesn't matter and they matched based on member name\n    TTypeList* memberList = block->getType().getWritableStruct();\n    TTypeList* unitMemberList = unitBlock->getType().getWritableStruct();\n\n    // keep track of which members have changed position\n    // so we don't have to search the array again\n    std::map<unsigned int, unsigned int> memberIndexUpdates;\n\n    size_t memberListStartSize = memberList->size();\n    for (unsigned int i = 0; i < unitMemberList->size(); ++i) {\n        bool merge = true;\n        for (unsigned int j = 0; j < memberListStartSize; ++j) {\n            if ((*memberList)[j].type->getFieldName() == (*unitMemberList)[i].type->getFieldName()) {\n                merge = false;\n                const TType* memberType = (*memberList)[j].type;\n                const TType* unitMemberType = (*unitMemberList)[i].type;\n\n                // compare types\n                // don't need as many checks as when merging symbols, since\n                // initializers and most qualifiers are stripped when the member is moved into the block\n                if ((*memberType) != (*unitMemberType)) {\n                    error(infoSink, \"Types must match:\", unitBlock->getStage());\n                    infoSink.info << \"    \" << memberType->getFieldName() << \": \";\n                    infoSink.info << \"\\\"\" << memberType->getCompleteString() << \"\\\" in stage \" << StageName(block->getStage()) << \" versus \";\n                    infoSink.info << \"\\\"\" << unitMemberType->getCompleteString() << \"\\\" in stage \" << StageName(unitBlock->getStage()) << \"\\n\";\n                }\n\n                memberIndexUpdates[i] = j;\n            }\n        }\n        if (merge) {\n            memberList->push_back((*unitMemberList)[i]);\n            memberIndexUpdates[i] = (unsigned int)memberList->size() - 1;\n        }\n    }\n\n    // update symbol node in unit tree,\n    // and other nodes that may reference it\n    class TMergeBlockTraverser : public TIntermTraverser {\n    public:\n        TMergeBlockTraverser(const TIntermSymbol* newSym)\n            : newSymbol(newSym), newType(nullptr), unit(nullptr), memberIndexUpdates(nullptr)\n        {\n        }\n        TMergeBlockTraverser(const TIntermSymbol* newSym, const glslang::TType* unitType, glslang::TIntermediate* unit,\n                             const std::map<unsigned int, unsigned int>* memberIdxUpdates)\n            : TIntermTraverser(false, true), newSymbol(newSym), newType(unitType), unit(unit), memberIndexUpdates(memberIdxUpdates)\n        {\n        }\n        virtual ~TMergeBlockTraverser() {}\n\n        const TIntermSymbol* newSymbol;\n        const glslang::TType* newType; // shallow copy of the new type\n        glslang::TIntermediate* unit;   // intermediate that is being updated\n        const std::map<unsigned int, unsigned int>* memberIndexUpdates;\n\n        virtual void visitSymbol(TIntermSymbol* symbol)\n        {\n            if (newSymbol->getAccessName() == symbol->getAccessName() &&\n                newSymbol->getQualifier().getBlockStorage() == symbol->getQualifier().getBlockStorage()) {\n                // Each symbol node may have a local copy of the block structure.\n                // Update those structures to match the new one post-merge\n                *(symbol->getWritableType().getWritableStruct()) = *(newSymbol->getType().getStruct());\n            }\n        }\n\n        virtual bool visitBinary(TVisit, glslang::TIntermBinary* node)\n        {\n            if (!unit || !newType || !memberIndexUpdates || memberIndexUpdates->empty())\n                return true;\n\n            if (node->getOp() == EOpIndexDirectStruct && node->getLeft()->getType() == *newType) {\n                // this is a dereference to a member of the block since the\n                // member list changed, need to update this to point to the\n                // right index\n                assert(node->getRight()->getAsConstantUnion());\n\n                glslang::TIntermConstantUnion* constNode = node->getRight()->getAsConstantUnion();\n                unsigned int memberIdx = constNode->getConstArray()[0].getUConst();\n                unsigned int newIdx = memberIndexUpdates->at(memberIdx);\n                TIntermTyped* newConstNode = unit->addConstantUnion(newIdx, node->getRight()->getLoc());\n\n                node->setRight(newConstNode);\n                delete constNode;\n\n                return true;\n            }\n            return true;\n        }\n    };\n\n    // 'this' may have symbols that are using the old block structure, so traverse the tree to update those\n    // in 'visitSymbol'\n    TMergeBlockTraverser finalLinkTraverser(block);\n    getTreeRoot()->traverse(&finalLinkTraverser);\n\n    // The 'unit' intermediate needs the block structures update, but also structure entry indices\n    // may have changed from the old block to the new one that it was merged into, so update those\n    // in 'visitBinary'\n    TType newType;\n    newType.shallowCopy(block->getType());\n    TMergeBlockTraverser unitFinalLinkTraverser(block, &newType, unit, &memberIndexUpdates);\n    unit->getTreeRoot()->traverse(&unitFinalLinkTraverser);\n\n    // update the member list\n    (*unitMemberList) = (*memberList);\n}\n\n//\n// Merge the linker objects from unitLinkerObjects into linkerObjects.\n// Duplication is expected and filtered out, but contradictions are an error.\n//\nvoid TIntermediate::mergeLinkerObjects(TInfoSink& infoSink, TIntermSequence& linkerObjects, const TIntermSequence& unitLinkerObjects, EShLanguage unitStage)\n{\n    // Error check and merge the linker objects (duplicates should not be created)\n    std::size_t initialNumLinkerObjects = linkerObjects.size();\n    for (unsigned int unitLinkObj = 0; unitLinkObj < unitLinkerObjects.size(); ++unitLinkObj) {\n        bool merge = true;\n        for (std::size_t linkObj = 0; linkObj < initialNumLinkerObjects; ++linkObj) {\n            TIntermSymbol* symbol = linkerObjects[linkObj]->getAsSymbolNode();\n            TIntermSymbol* unitSymbol = unitLinkerObjects[unitLinkObj]->getAsSymbolNode();\n            assert(symbol && unitSymbol);\n\n            if (isSameSymbol(symbol, unitSymbol)) {\n                // filter out copy\n                merge = false;\n\n                // but if one has an initializer and the other does not, update\n                // the initializer\n                if (symbol->getConstArray().empty() && ! unitSymbol->getConstArray().empty())\n                    symbol->setConstArray(unitSymbol->getConstArray());\n\n                // Similarly for binding\n                if (! symbol->getQualifier().hasBinding() && unitSymbol->getQualifier().hasBinding())\n                    symbol->getQualifier().layoutBinding = unitSymbol->getQualifier().layoutBinding;\n\n                // Similarly for location\n                if (!symbol->getQualifier().hasLocation() && unitSymbol->getQualifier().hasLocation()) {\n                    symbol->getQualifier().layoutLocation = unitSymbol->getQualifier().layoutLocation;\n                }\n\n                // Update implicit array sizes\n                if (symbol->getWritableType().isImplicitlySizedArray() && unitSymbol->getType().isImplicitlySizedArray()) {\n                    if (unitSymbol->getType().getImplicitArraySize() > symbol->getType().getImplicitArraySize()){\n                        symbol->getWritableType().updateImplicitArraySize(unitSymbol->getType().getImplicitArraySize());\n                    }\n                }\n                else if (symbol->getWritableType().isImplicitlySizedArray() && unitSymbol->getType().isSizedArray()) {\n                    if (symbol->getWritableType().getImplicitArraySize() > unitSymbol->getType().getOuterArraySize())\n                        error(infoSink, \"Implicit size of unsized array doesn't match same symbol among multiple shaders.\", unitStage);\n                }\n                else if (unitSymbol->getType().isImplicitlySizedArray() && symbol->getWritableType().isSizedArray()) {\n                    if (unitSymbol->getType().getImplicitArraySize() > symbol->getWritableType().getOuterArraySize())\n                        error(infoSink, \"Implicit size of unsized array doesn't match same symbol among multiple shaders.\", unitStage);\n                }\n\n                if (symbol->getType().isStruct() && unitSymbol->getType().isStruct() &&\n                    symbol->getType().getStruct()->size() == unitSymbol->getType().getStruct()->size()) {\n                    for (int i = 0; i < (int)symbol->getType().getStruct()->size(); ++i) {\n                        auto& type = (*symbol->getWritableType().getStruct())[i];\n                        auto& unitType = (*unitSymbol->getWritableType().getStruct())[i];\n\n                        if (type.type->isImplicitlySizedArray() && unitType.type->isImplicitlySizedArray()) {\n                            if (unitType.type->getImplicitArraySize() > type.type->getImplicitArraySize())\n                                type.type->updateImplicitArraySize(unitType.type->getImplicitArraySize());\n                        }\n                        else if (type.type->isImplicitlySizedArray() && unitType.type->isSizedArray()) {\n                            if (type.type->getImplicitArraySize() > unitType.type->getOuterArraySize())\n                                error(infoSink, \"Implicit size of unsized array doesn't match same symbol among multiple shaders.\", unitStage);\n                        }\n                        else if (type.type->isSizedArray() && unitType.type->isImplicitlySizedArray()) {\n                            if (type.type->getOuterArraySize() < unitType.type->getImplicitArraySize())\n                                error(infoSink, \"Implicit size of unsized array doesn't match same symbol among multiple shaders.\", unitStage);\n                        }\n                    }\n                }\n\n                // Update implicit array sizes\n                mergeImplicitArraySizes(symbol->getWritableType(), unitSymbol->getType());\n\n                // Check for consistent types/qualification/initializers etc.\n                mergeErrorCheck(infoSink, *symbol, *unitSymbol);\n            }\n            // If different symbols, verify they arn't push_constant since there can only be one per stage\n            else if (symbol->getQualifier().isPushConstant() && unitSymbol->getQualifier().isPushConstant() && getStage() == unitStage)\n                error(infoSink, \"Only one push_constant block is allowed per stage\");\n        }\n\n        // Check conflicts between preset primitives and sizes of I/O variables among multiple geometry shaders\n        if (language == EShLangGeometry && unitStage == EShLangGeometry)\n        {\n            TIntermSymbol* unitSymbol = unitLinkerObjects[unitLinkObj]->getAsSymbolNode();\n            if (unitSymbol->isArray() && unitSymbol->getQualifier().storage == EvqVaryingIn && unitSymbol->getQualifier().builtIn == EbvNone)\n                if ((unitSymbol->getArraySizes()->isImplicitlySized() &&\n                        unitSymbol->getArraySizes()->getImplicitSize() != TQualifier::mapGeometryToSize(getInputPrimitive())) ||\n                    (! unitSymbol->getArraySizes()->isImplicitlySized() &&\n                        unitSymbol->getArraySizes()->getDimSize(0) != TQualifier::mapGeometryToSize(getInputPrimitive())))\n                    error(infoSink, \"Not all array sizes match across all geometry shaders in the program\");\n        }\n\n        if (merge) {\n            linkerObjects.push_back(unitLinkerObjects[unitLinkObj]);\n\n            // for anonymous blocks, check that their members don't conflict with other names\n            if (unitLinkerObjects[unitLinkObj]->getAsSymbolNode()->getBasicType() == EbtBlock &&\n                IsAnonymous(unitLinkerObjects[unitLinkObj]->getAsSymbolNode()->getName())) {\n                for (std::size_t linkObj = 0; linkObj < initialNumLinkerObjects; ++linkObj) {\n                    TIntermSymbol* symbol = linkerObjects[linkObj]->getAsSymbolNode();\n                    TIntermSymbol* unitSymbol = unitLinkerObjects[unitLinkObj]->getAsSymbolNode();\n                    assert(symbol && unitSymbol);\n\n                    auto checkName = [this, unitSymbol, &infoSink](const TString& name) {\n                        for (unsigned int i = 0; i < unitSymbol->getType().getStruct()->size(); ++i) {\n                            if (name == (*unitSymbol->getType().getStruct())[i].type->getFieldName()\n                                && !((*unitSymbol->getType().getStruct())[i].type->getQualifier().hasLocation()\n                                    || unitSymbol->getType().getQualifier().hasLocation())\n                                ) {\n                                error(infoSink, \"Anonymous member name used for global variable or other anonymous member: \");\n                                infoSink.info << (*unitSymbol->getType().getStruct())[i].type->getCompleteString() << \"\\n\";\n                            }\n                        }\n                    };\n\n                    if (isSameInterface(symbol, unitSymbol)) {\n                        checkName(symbol->getName());\n\n                        // check members of other anonymous blocks\n                        if (symbol->getBasicType() == EbtBlock && IsAnonymous(symbol->getName())) {\n                            for (unsigned int i = 0; i < symbol->getType().getStruct()->size(); ++i) {\n                                checkName((*symbol->getType().getStruct())[i].type->getFieldName());\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\n// TODO 4.5 link functionality: cull distance array size checking\n\n// Recursively merge the implicit array sizes through the objects' respective type trees.\nvoid TIntermediate::mergeImplicitArraySizes(TType& type, const TType& unitType)\n{\n    if (type.isUnsizedArray()) {\n        if (unitType.isUnsizedArray()) {\n            type.updateImplicitArraySize(unitType.getImplicitArraySize());\n            if (unitType.isArrayVariablyIndexed())\n                type.setArrayVariablyIndexed();\n        } else if (unitType.isSizedArray())\n            type.changeOuterArraySize(unitType.getOuterArraySize());\n    }\n\n    // Type mismatches are caught and reported after this, just be careful for now.\n    if (! type.isStruct() || ! unitType.isStruct() || type.getStruct()->size() != unitType.getStruct()->size())\n        return;\n\n    for (int i = 0; i < (int)type.getStruct()->size(); ++i)\n        mergeImplicitArraySizes(*(*type.getStruct())[i].type, *(*unitType.getStruct())[i].type);\n}\n\n//\n// Compare two global objects from two compilation units and see if they match\n// well enough.  Rules can be different for intra- vs. cross-stage matching.\n//\n// This function only does one of intra- or cross-stage matching per call.\n//\nvoid TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& symbol, const TIntermSymbol& unitSymbol)\n{\n    EShLanguage stage = symbol.getStage();\n    EShLanguage unitStage = unitSymbol.getStage();\n    bool crossStage = stage != unitStage;\n    bool writeTypeComparison = false;\n    bool errorReported = false;\n    bool printQualifiers = false;\n    bool printPrecision = false;\n    bool printType = false;\n\n    // Types have to match\n    {\n        // but, we make an exception if one is an implicit array and the other is sized\n        // or if the array sizes differ because of the extra array dimension on some in/out boundaries\n        bool arraysMatch = false;\n        if (isIoResizeArray(symbol.getType(), stage) || isIoResizeArray(unitSymbol.getType(), unitStage)) {\n            // if the arrays have an extra dimension because of the stage.\n            // compare dimensions while ignoring the outer dimension\n            unsigned int firstDim = isIoResizeArray(symbol.getType(), stage) ? 1 : 0;\n            unsigned int numDim = symbol.getArraySizes()\n                ? symbol.getArraySizes()->getNumDims() : 0;\n            unsigned int unitFirstDim = isIoResizeArray(unitSymbol.getType(), unitStage) ? 1 : 0;\n            unsigned int unitNumDim = unitSymbol.getArraySizes()\n                ? unitSymbol.getArraySizes()->getNumDims() : 0;\n            arraysMatch = (numDim - firstDim) == (unitNumDim - unitFirstDim);\n            // check that array sizes match as well\n            for (unsigned int i = 0; i < (numDim - firstDim) && arraysMatch; i++) {\n                if (symbol.getArraySizes()->getDimSize(firstDim + i) !=\n                    unitSymbol.getArraySizes()->getDimSize(unitFirstDim + i)) {\n                    arraysMatch = false;\n                    break;\n                }\n            }\n        }\n        else {\n            arraysMatch = symbol.getType().sameArrayness(unitSymbol.getType()) ||\n                (symbol.getType().isArray() && unitSymbol.getType().isArray() &&\n                 (symbol.getType().isImplicitlySizedArray() || unitSymbol.getType().isImplicitlySizedArray() ||\n                  symbol.getType().isUnsizedArray() || unitSymbol.getType().isUnsizedArray()));\n        }\n\n        int lpidx = -1;\n        int rpidx = -1;\n        if (!symbol.getType().sameElementType(unitSymbol.getType(), &lpidx, &rpidx)) {\n            if (lpidx >= 0 && rpidx >= 0) {\n                error(infoSink, \"Member names and types must match:\", unitStage);\n                infoSink.info << \"    Block: \" << symbol.getType().getTypeName() << \"\\n\";\n                infoSink.info << \"        \" << StageName(stage) << \" stage: \\\"\"\n                              << (*symbol.getType().getStruct())[lpidx].type->getCompleteString(true, false, false, true,\n                                      (*symbol.getType().getStruct())[lpidx].type->getFieldName()) << \"\\\"\\n\";\n                infoSink.info << \"        \" << StageName(unitStage) << \" stage: \\\"\"\n                              << (*unitSymbol.getType().getStruct())[rpidx].type->getCompleteString(true, false, false, true,\n                                      (*unitSymbol.getType().getStruct())[rpidx].type->getFieldName()) << \"\\\"\\n\";\n                errorReported = true;\n            } else if (lpidx >= 0 && rpidx == -1) {\n                  TString errmsg = StageName(stage);\n                  errmsg.append(\" block member has no corresponding member in \").append(StageName(unitStage)).append(\" block:\");\n                  error(infoSink, errmsg.c_str(), unitStage);\n                  infoSink.info << \"    \" << StageName(stage) << \" stage: Block: \" << symbol.getType().getTypeName() << \", Member: \"\n                    << (*symbol.getType().getStruct())[lpidx].type->getFieldName() << \"\\n\";\n                  infoSink.info << \"    \" << StageName(unitStage) << \" stage: Block: \" << unitSymbol.getType().getTypeName() << \", Member: n/a \\n\";\n                  errorReported = true;\n            } else if (lpidx == -1 && rpidx >= 0) {\n                  TString errmsg = StageName(unitStage);\n                  errmsg.append(\" block member has no corresponding member in \").append(StageName(stage)).append(\" block:\");\n                  error(infoSink, errmsg.c_str(), unitStage);\n                  infoSink.info << \"    \" << StageName(unitStage) << \" stage: Block: \" << unitSymbol.getType().getTypeName() << \", Member: \"\n                    << (*unitSymbol.getType().getStruct())[rpidx].type->getFieldName() << \"\\n\";\n                  infoSink.info << \"    \" << StageName(stage) << \" stage: Block: \" << symbol.getType().getTypeName() << \", Member: n/a \\n\";\n                  errorReported = true;\n            } else {\n                  error(infoSink, \"Types must match:\", unitStage);\n                  writeTypeComparison = true;\n                  printType = true;\n            }\n        } else if (!arraysMatch) {\n            error(infoSink, \"Array sizes must be compatible:\", unitStage);\n            writeTypeComparison = true;\n            printType = true;\n        } else if (!symbol.getType().sameTypeParameters(unitSymbol.getType())) {\n            error(infoSink, \"Type parameters must match:\", unitStage);\n            writeTypeComparison = true;\n            printType = true;\n        }\n    }\n\n    // Interface block  member-wise layout qualifiers have to match\n    if (symbol.getType().getBasicType() == EbtBlock && unitSymbol.getType().getBasicType() == EbtBlock &&\n        symbol.getType().getStruct() && unitSymbol.getType().getStruct() &&\n        symbol.getType().sameStructType(unitSymbol.getType())) {\n        unsigned int li = 0;\n        unsigned int ri = 0;\n        while (li < symbol.getType().getStruct()->size() && ri < unitSymbol.getType().getStruct()->size()) {\n            if ((*symbol.getType().getStruct())[li].type->hiddenMember()) {\n                ++li;\n                continue;\n            }\n            if ((*unitSymbol.getType().getStruct())[ri].type->hiddenMember()) {\n                ++ri;\n                continue;\n            }\n            const TQualifier& qualifier = (*symbol.getType().getStruct())[li].type->getQualifier();\n            const TQualifier & unitQualifier = (*unitSymbol.getType().getStruct())[ri].type->getQualifier();\n            bool layoutQualifierError = false;\n            if (qualifier.layoutMatrix != unitQualifier.layoutMatrix) {\n                error(infoSink, \"Interface block member layout matrix qualifier must match:\", unitStage);\n                layoutQualifierError = true;\n            }\n            if (qualifier.layoutOffset != unitQualifier.layoutOffset) {\n                error(infoSink, \"Interface block member layout offset qualifier must match:\", unitStage);\n                layoutQualifierError = true;\n            }\n            if (qualifier.layoutAlign != unitQualifier.layoutAlign) {\n                error(infoSink, \"Interface block member layout align qualifier must match:\", unitStage);\n                layoutQualifierError = true;\n            }\n            if (qualifier.layoutLocation != unitQualifier.layoutLocation) {\n                error(infoSink, \"Interface block member layout location qualifier must match:\", unitStage);\n                layoutQualifierError = true;\n            }\n            if (qualifier.layoutComponent != unitQualifier.layoutComponent) {\n                error(infoSink, \"Interface block member layout component qualifier must match:\", unitStage);\n                layoutQualifierError = true;\n            }\n            if (layoutQualifierError) {\n                infoSink.info << \"    \" << StageName(stage) << \" stage: Block: \" << symbol.getType().getTypeName() << \", Member: \"\n                              << (*symbol.getType().getStruct())[li].type->getFieldName() << \" \\\"\"\n                              << (*symbol.getType().getStruct())[li].type->getCompleteString(true, true, false, false) << \"\\\"\\n\";\n                infoSink.info << \"    \" << StageName(unitStage) << \" stage: Block: \" << unitSymbol.getType().getTypeName() << \", Member: \"\n                              << (*unitSymbol.getType().getStruct())[ri].type->getFieldName() << \" \\\"\"\n                              << (*unitSymbol.getType().getStruct())[ri].type->getCompleteString(true, true, false, false) << \"\\\"\\n\";\n                errorReported = true;\n            }\n            ++li;\n            ++ri;\n        }\n    }\n\n    bool isInOut = crossStage &&\n                   ((symbol.getQualifier().storage == EvqVaryingIn && unitSymbol.getQualifier().storage == EvqVaryingOut) ||\n                   (symbol.getQualifier().storage == EvqVaryingOut && unitSymbol.getQualifier().storage == EvqVaryingIn));\n\n    // Qualifiers have to (almost) match\n    // Storage...\n    if (!isInOut && symbol.getQualifier().storage != unitSymbol.getQualifier().storage) {\n        error(infoSink, \"Storage qualifiers must match:\", unitStage);\n        writeTypeComparison = true;\n        printQualifiers = true;\n    }\n\n    // Uniform and buffer blocks must either both have an instance name, or\n    // must both be anonymous. The names don't need to match though.\n    if (symbol.getQualifier().isUniformOrBuffer() &&\n        (IsAnonymous(symbol.getName()) != IsAnonymous(unitSymbol.getName()))) {\n        error(infoSink, \"Matched Uniform or Storage blocks must all be anonymous,\"\n                        \" or all be named:\", unitStage);\n        writeTypeComparison = true;\n    }\n\n    if (symbol.getQualifier().storage == unitSymbol.getQualifier().storage &&\n        (IsAnonymous(symbol.getName()) != IsAnonymous(unitSymbol.getName()) ||\n         (!IsAnonymous(symbol.getName()) && symbol.getName() != unitSymbol.getName()))) {\n        warn(infoSink, \"Matched shader interfaces are using different instance names.\", unitStage);\n        writeTypeComparison = true;\n    }\n\n    // Precision...\n    if (!isInOut && symbol.getQualifier().precision != unitSymbol.getQualifier().precision) {\n        error(infoSink, \"Precision qualifiers must match:\", unitStage);\n        writeTypeComparison = true;\n        printPrecision = true;\n    }\n\n    // Invariance...\n    if (! crossStage && symbol.getQualifier().invariant != unitSymbol.getQualifier().invariant) {\n        error(infoSink, \"Presence of invariant qualifier must match:\", unitStage);\n        writeTypeComparison = true;\n        printQualifiers = true;\n    }\n\n    // Precise...\n    if (! crossStage && symbol.getQualifier().isNoContraction() != unitSymbol.getQualifier().isNoContraction()) {\n        error(infoSink, \"Presence of precise qualifier must match:\", unitStage);\n        writeTypeComparison = true;\n        printPrecision = true;\n    }\n\n    // Auxiliary and interpolation...\n    // \"interpolation qualification (e.g., flat) and auxiliary qualification (e.g. centroid) may differ.\n    //  These mismatches are allowed between any pair of stages ...\n    //  those provided in the fragment shader supersede those provided in previous stages.\"\n    if (!crossStage &&\n        (symbol.getQualifier().centroid  != unitSymbol.getQualifier().centroid ||\n        symbol.getQualifier().smooth    != unitSymbol.getQualifier().smooth ||\n        symbol.getQualifier().flat      != unitSymbol.getQualifier().flat ||\n        symbol.getQualifier().isSample()!= unitSymbol.getQualifier().isSample() ||\n        symbol.getQualifier().isPatch() != unitSymbol.getQualifier().isPatch() ||\n        symbol.getQualifier().isNonPerspective() != unitSymbol.getQualifier().isNonPerspective())) {\n        error(infoSink, \"Interpolation and auxiliary storage qualifiers must match:\", unitStage);\n        writeTypeComparison = true;\n        printQualifiers = true;\n    }\n\n    // Memory...\n    bool memoryQualifierError = false;\n    if (symbol.getQualifier().coherent != unitSymbol.getQualifier().coherent) {\n        error(infoSink, \"Memory coherent qualifier must match:\", unitStage);\n        memoryQualifierError = true;\n    }\n    if (symbol.getQualifier().devicecoherent != unitSymbol.getQualifier().devicecoherent) {\n        error(infoSink, \"Memory devicecoherent qualifier must match:\", unitStage);\n        memoryQualifierError = true;\n    }\n    if (symbol.getQualifier().queuefamilycoherent != unitSymbol.getQualifier().queuefamilycoherent) {\n        error(infoSink, \"Memory queuefamilycoherent qualifier must match:\", unitStage);\n        memoryQualifierError = true;\n    }\n    if (symbol.getQualifier().workgroupcoherent != unitSymbol.getQualifier().workgroupcoherent) {\n        error(infoSink, \"Memory workgroupcoherent qualifier must match:\", unitStage);\n        memoryQualifierError = true;\n    }\n    if (symbol.getQualifier().subgroupcoherent != unitSymbol.getQualifier().subgroupcoherent) {\n        error(infoSink, \"Memory subgroupcoherent qualifier must match:\", unitStage);\n        memoryQualifierError = true;\n    }\n    if (symbol.getQualifier().shadercallcoherent != unitSymbol.getQualifier().shadercallcoherent) {\n        error(infoSink, \"Memory shadercallcoherent qualifier must match:\", unitStage);\n        memoryQualifierError = true;\n    }\n    if (symbol.getQualifier().nonprivate != unitSymbol.getQualifier().nonprivate) {\n        error(infoSink, \"Memory nonprivate qualifier must match:\", unitStage);\n        memoryQualifierError = true;\n    }\n    if (symbol.getQualifier().volatil != unitSymbol.getQualifier().volatil) {\n        error(infoSink, \"Memory volatil qualifier must match:\", unitStage);\n        memoryQualifierError = true;\n    }\n    if (symbol.getQualifier().nontemporal != unitSymbol.getQualifier().nontemporal) {\n        error(infoSink, \"Memory nontemporal qualifier must match:\", unitStage);\n        memoryQualifierError = true;\n    }\n    if (symbol.getQualifier().restrict != unitSymbol.getQualifier().restrict) {\n        error(infoSink, \"Memory restrict qualifier must match:\", unitStage);\n        memoryQualifierError = true;\n    }\n    if (symbol.getQualifier().readonly != unitSymbol.getQualifier().readonly) {\n        error(infoSink, \"Memory readonly qualifier must match:\", unitStage);\n        memoryQualifierError = true;\n    }\n    if (symbol.getQualifier().writeonly != unitSymbol.getQualifier().writeonly) {\n        error(infoSink, \"Memory writeonly qualifier must match:\", unitStage);\n        memoryQualifierError = true;\n    }\n    if (memoryQualifierError) {\n          writeTypeComparison = true;\n          printQualifiers = true;\n    }\n\n    // Layouts...\n    // TODO: 4.4 enhanced layouts: Generalize to include offset/align: current spec\n    //       requires separate user-supplied offset from actual computed offset, but\n    //       current implementation only has one offset.\n    bool layoutQualifierError = false;\n    if (symbol.getQualifier().layoutMatrix != unitSymbol.getQualifier().layoutMatrix) {\n        error(infoSink, \"Layout matrix qualifier must match:\", unitStage);\n        layoutQualifierError = true;\n    }\n    if (symbol.getQualifier().layoutPacking != unitSymbol.getQualifier().layoutPacking) {\n        error(infoSink, \"Layout packing qualifier must match:\", unitStage);\n        layoutQualifierError = true;\n    }\n    if (symbol.getQualifier().hasLocation() && unitSymbol.getQualifier().hasLocation() && symbol.getQualifier().layoutLocation != unitSymbol.getQualifier().layoutLocation) {\n        error(infoSink, \"Layout location qualifier must match:\", unitStage);\n        layoutQualifierError = true;\n    }\n    if (symbol.getQualifier().layoutComponent != unitSymbol.getQualifier().layoutComponent) {\n        error(infoSink, \"Layout component qualifier must match:\", unitStage);\n        layoutQualifierError = true;\n    }\n    if (symbol.getQualifier().layoutIndex != unitSymbol.getQualifier().layoutIndex) {\n        error(infoSink, \"Layout index qualifier must match:\", unitStage);\n        layoutQualifierError = true;\n    }\n    if (symbol.getQualifier().hasBinding() && unitSymbol.getQualifier().hasBinding() && symbol.getQualifier().layoutBinding != unitSymbol.getQualifier().layoutBinding) {\n        error(infoSink, \"Layout binding qualifier must match:\", unitStage);\n        layoutQualifierError = true;\n    }\n    if (symbol.getQualifier().hasBinding() && (symbol.getQualifier().layoutOffset != unitSymbol.getQualifier().layoutOffset)) {\n        error(infoSink, \"Layout offset qualifier must match:\", unitStage);\n        layoutQualifierError = true;\n    }\n    if (layoutQualifierError) {\n        writeTypeComparison = true;\n        printQualifiers = true;\n    }\n\n    // Initializers have to match, if both are present, and if we don't already know the types don't match\n    if (! writeTypeComparison && ! errorReported) {\n        if (! symbol.getConstArray().empty() && ! unitSymbol.getConstArray().empty()) {\n            if (symbol.getConstArray() != unitSymbol.getConstArray()) {\n                error(infoSink, \"Initializers must match:\", unitStage);\n                infoSink.info << \"    \" << symbol.getName() << \"\\n\";\n            }\n        }\n    }\n\n    if (writeTypeComparison) {\n        if (symbol.getType().getBasicType() == EbtBlock && unitSymbol.getType().getBasicType() == EbtBlock &&\n            symbol.getType().getStruct() && unitSymbol.getType().getStruct()) {\n          if (printType) {\n            infoSink.info << \"    \" << StageName(stage) << \" stage: \\\"\" << symbol.getType().getCompleteString(true, printQualifiers, printPrecision,\n                                                    printType, symbol.getName(), symbol.getType().getTypeName()) << \"\\\"\\n\";\n            infoSink.info << \"    \" << StageName(unitStage) << \" stage: \\\"\" << unitSymbol.getType().getCompleteString(true, printQualifiers, printPrecision,\n                                                    printType, unitSymbol.getName(), unitSymbol.getType().getTypeName()) << \"\\\"\\n\";\n          } else {\n            infoSink.info << \"    \" << StageName(stage) << \" stage: Block: \" << symbol.getType().getTypeName() << \" Instance: \" << symbol.getName()\n              << \": \\\"\" << symbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType) << \"\\\"\\n\";\n            infoSink.info << \"    \" << StageName(unitStage) << \" stage: Block: \" << unitSymbol.getType().getTypeName() << \" Instance: \" << unitSymbol.getName()\n              << \": \\\"\" << unitSymbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType) << \"\\\"\\n\";\n          }\n        } else {\n          if (printType) {\n            infoSink.info << \"    \" << StageName(stage) << \" stage: \\\"\"\n              << symbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType, symbol.getName()) << \"\\\"\\n\";\n            infoSink.info << \"    \" << StageName(unitStage) << \" stage: \\\"\"\n              << unitSymbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType, unitSymbol.getName()) << \"\\\"\\n\";\n          } else {\n            infoSink.info << \"    \" << StageName(stage) << \" stage: \" << symbol.getName() << \" \\\"\"\n              << symbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType) << \"\\\"\\n\";\n            infoSink.info << \"    \" << StageName(unitStage) << \" stage: \" << unitSymbol.getName() << \" \\\"\"\n              << unitSymbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType) << \"\\\"\\n\";\n          }\n        }\n    }\n}\n\nvoid TIntermediate::sharedBlockCheck(TInfoSink& infoSink)\n{\n    bool has_shared_block = false;\n    bool has_shared_non_block = false;\n    TIntermSequence& linkObjects = findLinkerObjects()->getSequence();\n    for (size_t i = 0; i < linkObjects.size(); ++i) {\n        const TType& type = linkObjects[i]->getAsTyped()->getType();\n        const TQualifier& qualifier = type.getQualifier();\n        if (qualifier.storage == glslang::EvqShared) {\n            if (type.getBasicType() == glslang::EbtBlock)\n                has_shared_block = true;\n            else\n                has_shared_non_block = true;\n        }\n    }\n    if (has_shared_block && has_shared_non_block)\n        error(infoSink, \"cannot mix use of shared variables inside and outside blocks\");\n}\n\n//\n// Do final link-time error checking of a complete (merged) intermediate representation.\n// (Much error checking was done during merging).\n//\n// Also, lock in defaults of things not set.\n// Defer adopting implicit array sizes to later, after all stages are merged.\n//\nvoid TIntermediate::finalCheck(TInfoSink& infoSink, bool keepUncalled)\n{\n    if (getTreeRoot() == nullptr)\n        return;\n\n    if (numEntryPoints < 1) {\n        if (getSource() == EShSourceGlsl)\n            error(infoSink, \"Missing entry point: Each stage requires one entry point\");\n        else\n            warn(infoSink, \"Entry point not found\");\n    }\n\n    // recursion and missing body checking\n    checkCallGraphCycles(infoSink);\n    checkCallGraphBodies(infoSink, keepUncalled);\n\n    // overlap/alias/missing I/O, etc.\n    inOutLocationCheck(infoSink);\n\n    if (getNumPushConstants() > 1)\n        error(infoSink, \"Only one push_constant block is allowed per stage\");\n\n    // invocations\n    if (invocations == TQualifier::layoutNotSet)\n        invocations = 1;\n\n    if (inIoAccessed(\"gl_ClipDistance\") && inIoAccessed(\"gl_ClipVertex\"))\n        error(infoSink, \"Can only use one of gl_ClipDistance or gl_ClipVertex (gl_ClipDistance is preferred)\");\n    if (inIoAccessed(\"gl_CullDistance\") && inIoAccessed(\"gl_ClipVertex\"))\n        error(infoSink, \"Can only use one of gl_CullDistance or gl_ClipVertex (gl_ClipDistance is preferred)\");\n\n    if (userOutputUsed() && (inIoAccessed(\"gl_FragColor\") || inIoAccessed(\"gl_FragData\")))\n        error(infoSink, \"Cannot use gl_FragColor or gl_FragData when using user-defined outputs\");\n    if (inIoAccessed(\"gl_FragColor\") && inIoAccessed(\"gl_FragData\"))\n        error(infoSink, \"Cannot use both gl_FragColor and gl_FragData\");\n\n    for (size_t b = 0; b < xfbBuffers.size(); ++b) {\n        if (xfbBuffers[b].contains64BitType)\n            RoundToPow2(xfbBuffers[b].implicitStride, 8);\n        else if (xfbBuffers[b].contains32BitType)\n            RoundToPow2(xfbBuffers[b].implicitStride, 4);\n        else if (xfbBuffers[b].contains16BitType)\n            RoundToPow2(xfbBuffers[b].implicitStride, 2);\n\n        // \"It is a compile-time or link-time error to have\n        // any xfb_offset that overflows xfb_stride, whether stated on declarations before or after the xfb_stride, or\n        // in different compilation units. While xfb_stride can be declared multiple times for the same buffer, it is a\n        // compile-time or link-time error to have different values specified for the stride for the same buffer.\"\n        if (xfbBuffers[b].stride != TQualifier::layoutXfbStrideEnd && xfbBuffers[b].implicitStride > xfbBuffers[b].stride) {\n            error(infoSink, \"xfb_stride is too small to hold all buffer entries:\");\n            infoSink.info.prefix(EPrefixError);\n            infoSink.info << \"    xfb_buffer \" << (unsigned int)b << \", xfb_stride \" << xfbBuffers[b].stride << \", minimum stride needed: \" << xfbBuffers[b].implicitStride << \"\\n\";\n        }\n        if (xfbBuffers[b].stride == TQualifier::layoutXfbStrideEnd)\n            xfbBuffers[b].stride = xfbBuffers[b].implicitStride;\n\n        // \"If the buffer is capturing any\n        // outputs with double-precision or 64-bit integer components, the stride must be a multiple of 8, otherwise it must be a\n        // multiple of 4, or a compile-time or link-time error results.\"\n        if (xfbBuffers[b].contains64BitType && ! IsMultipleOfPow2(xfbBuffers[b].stride, 8)) {\n            error(infoSink, \"xfb_stride must be multiple of 8 for buffer holding a double or 64-bit integer:\");\n            infoSink.info.prefix(EPrefixError);\n            infoSink.info << \"    xfb_buffer \" << (unsigned int)b << \", xfb_stride \" << xfbBuffers[b].stride << \"\\n\";\n        } else if (xfbBuffers[b].contains32BitType && ! IsMultipleOfPow2(xfbBuffers[b].stride, 4)) {\n            error(infoSink, \"xfb_stride must be multiple of 4:\");\n            infoSink.info.prefix(EPrefixError);\n            infoSink.info << \"    xfb_buffer \" << (unsigned int)b << \", xfb_stride \" << xfbBuffers[b].stride << \"\\n\";\n        }\n        // \"If the buffer is capturing any\n        // outputs with half-precision or 16-bit integer components, the stride must be a multiple of 2\"\n        else if (xfbBuffers[b].contains16BitType && ! IsMultipleOfPow2(xfbBuffers[b].stride, 2)) {\n            error(infoSink, \"xfb_stride must be multiple of 2 for buffer holding a half float or 16-bit integer:\");\n            infoSink.info.prefix(EPrefixError);\n            infoSink.info << \"    xfb_buffer \" << (unsigned int)b << \", xfb_stride \" << xfbBuffers[b].stride << \"\\n\";\n        }\n\n        // \"The resulting stride (implicit or explicit), when divided by 4, must be less than or equal to the\n        // implementation-dependent constant gl_MaxTransformFeedbackInterleavedComponents.\"\n        if (xfbBuffers[b].stride > (unsigned int)(4 * resources->maxTransformFeedbackInterleavedComponents)) {\n            error(infoSink, \"xfb_stride is too large:\");\n            infoSink.info.prefix(EPrefixError);\n            infoSink.info << \"    xfb_buffer \" << (unsigned int)b << \", components (1/4 stride) needed are \" << xfbBuffers[b].stride/4 << \", gl_MaxTransformFeedbackInterleavedComponents is \" << resources->maxTransformFeedbackInterleavedComponents << \"\\n\";\n        }\n    }\n\n    switch (language) {\n    case EShLangVertex:\n        break;\n    case EShLangTessControl:\n        if (vertices == TQualifier::layoutNotSet)\n            error(infoSink, \"At least one shader must specify an output layout(vertices=...)\");\n        break;\n    case EShLangTessEvaluation:\n        if (getSource() == EShSourceGlsl) {\n            if (inputPrimitive == ElgNone)\n                error(infoSink, \"At least one shader must specify an input layout primitive\");\n            if (vertexSpacing == EvsNone)\n                vertexSpacing = EvsEqual;\n            if (vertexOrder == EvoNone)\n                vertexOrder = EvoCcw;\n        }\n        break;\n    case EShLangGeometry:\n        if (inputPrimitive == ElgNone)\n            error(infoSink, \"At least one shader must specify an input layout primitive\");\n        if (outputPrimitive == ElgNone)\n            error(infoSink, \"At least one shader must specify an output layout primitive\");\n        if (vertices == TQualifier::layoutNotSet)\n            error(infoSink, \"At least one shader must specify a layout(max_vertices = value)\");\n        break;\n    case EShLangFragment:\n        // for GL_ARB_post_depth_coverage, EarlyFragmentTest is set automatically in\n        // ParseHelper.cpp. So if we reach here, this must be GL_EXT_post_depth_coverage\n        // requiring explicit early_fragment_tests\n        if (getPostDepthCoverage() && !getEarlyFragmentTests())\n            error(infoSink, \"post_depth_coverage requires early_fragment_tests\");\n        break;\n    case EShLangCompute:\n        sharedBlockCheck(infoSink);\n        break;\n    case EShLangRayGen:\n    case EShLangIntersect:\n    case EShLangAnyHit:\n    case EShLangClosestHit:\n    case EShLangMiss:\n    case EShLangCallable:\n        if (numShaderRecordBlocks > 1)\n            error(infoSink, \"Only one shaderRecordNV buffer block is allowed per stage\");\n        break;\n    case EShLangMesh:\n        // NV_mesh_shader doesn't allow use of both single-view and per-view builtins.\n        if (inIoAccessed(\"gl_Position\") && inIoAccessed(\"gl_PositionPerViewNV\"))\n            error(infoSink, \"Can only use one of gl_Position or gl_PositionPerViewNV\");\n        if (inIoAccessed(\"gl_ClipDistance\") && inIoAccessed(\"gl_ClipDistancePerViewNV\"))\n            error(infoSink, \"Can only use one of gl_ClipDistance or gl_ClipDistancePerViewNV\");\n        if (inIoAccessed(\"gl_CullDistance\") && inIoAccessed(\"gl_CullDistancePerViewNV\"))\n            error(infoSink, \"Can only use one of gl_CullDistance or gl_CullDistancePerViewNV\");\n        if (inIoAccessed(\"gl_Layer\") && inIoAccessed(\"gl_LayerPerViewNV\"))\n            error(infoSink, \"Can only use one of gl_Layer or gl_LayerPerViewNV\");\n        if (inIoAccessed(\"gl_ViewportMask\") && inIoAccessed(\"gl_ViewportMaskPerViewNV\"))\n            error(infoSink, \"Can only use one of gl_ViewportMask or gl_ViewportMaskPerViewNV\");\n        if (outputPrimitive == ElgNone)\n            error(infoSink, \"At least one shader must specify an output layout primitive\");\n        if (vertices == TQualifier::layoutNotSet)\n            error(infoSink, \"At least one shader must specify a layout(max_vertices = value)\");\n        if (primitives == TQualifier::layoutNotSet)\n            error(infoSink, \"At least one shader must specify a layout(max_primitives = value)\");\n        [[fallthrough]];\n    case EShLangTask:\n        if (numTaskNVBlocks > 1)\n            error(infoSink, \"Only one taskNV interface block is allowed per shader\");\n        if (numTaskEXTPayloads > 1)\n            error(infoSink, \"Only single variable of type taskPayloadSharedEXT is allowed per shader\");\n        sharedBlockCheck(infoSink);\n        break;\n    default:\n        error(infoSink, \"Unknown Stage.\");\n        break;\n    }\n}\n\n//\n// See if the call graph contains any static recursion, which is disallowed\n// by the specification.\n//\nvoid TIntermediate::checkCallGraphCycles(TInfoSink& infoSink)\n{\n    // Clear fields we'll use for this.\n    for (TGraph::iterator call = callGraph.begin(); call != callGraph.end(); ++call) {\n        call->visited = false;\n        call->currentPath = false;\n        call->errorGiven = false;\n    }\n\n    //\n    // Loop, looking for a new connected subgraph.  One subgraph is handled per loop iteration.\n    //\n\n    TCall* newRoot;\n    do {\n        // See if we have unvisited parts of the graph.\n        newRoot = nullptr;\n        for (TGraph::iterator call = callGraph.begin(); call != callGraph.end(); ++call) {\n            if (! call->visited) {\n                newRoot = &(*call);\n                break;\n            }\n        }\n\n        // If not, we are done.\n        if (! newRoot)\n            break;\n\n        // Otherwise, we found a new subgraph, process it:\n        // See what all can be reached by this new root, and if any of\n        // that is recursive.  This is done by depth-first traversals, seeing\n        // if a new call is found that was already in the currentPath (a back edge),\n        // thereby detecting recursion.\n        std::list<TCall*> stack;\n        newRoot->currentPath = true; // currentPath will be true iff it is on the stack\n        stack.push_back(newRoot);\n        while (! stack.empty()) {\n            // get a caller\n            TCall* call = stack.back();\n\n            // Add to the stack just one callee.\n            // This algorithm always terminates, because only !visited and !currentPath causes a push\n            // and all pushes change currentPath to true, and all pops change visited to true.\n            TGraph::iterator child = callGraph.begin();\n            for (; child != callGraph.end(); ++child) {\n\n                // If we already visited this node, its whole subgraph has already been processed, so skip it.\n                if (child->visited)\n                    continue;\n\n                if (call->callee == child->caller) {\n                    if (child->currentPath) {\n                        // Then, we found a back edge\n                        if (! child->errorGiven) {\n                            error(infoSink, \"Recursion detected:\");\n                            infoSink.info << \"    \" << call->callee << \" calling \" << child->callee << \"\\n\";\n                            child->errorGiven = true;\n                            recursive = true;\n                        }\n                    } else {\n                        child->currentPath = true;\n                        stack.push_back(&(*child));\n                        break;\n                    }\n                }\n            }\n            if (child == callGraph.end()) {\n                // no more callees, we bottomed out, never look at this node again\n                stack.back()->currentPath = false;\n                stack.back()->visited = true;\n                stack.pop_back();\n            }\n        }  // end while, meaning nothing left to process in this subtree\n\n    } while (newRoot);  // redundant loop check; should always exit via the 'break' above\n}\n\n//\n// See which functions are reachable from the entry point and which have bodies.\n// Reachable ones with missing bodies are errors.\n// Unreachable bodies are dead code.\n//\nvoid TIntermediate::checkCallGraphBodies(TInfoSink& infoSink, bool keepUncalled)\n{\n    // Clear fields we'll use for this.\n    for (TGraph::iterator call = callGraph.begin(); call != callGraph.end(); ++call) {\n        call->visited = false;\n        call->calleeBodyPosition = -1;\n    }\n\n    // The top level of the AST includes function definitions (bodies).\n    // Compare these to function calls in the call graph.\n    // We'll end up knowing which have bodies, and if so,\n    // how to map the call-graph node to the location in the AST.\n    TIntermSequence &functionSequence = getTreeRoot()->getAsAggregate()->getSequence();\n    std::vector<bool> reachable(functionSequence.size(), true); // so that non-functions are reachable\n    for (int f = 0; f < (int)functionSequence.size(); ++f) {\n        glslang::TIntermAggregate* node = functionSequence[f]->getAsAggregate();\n        if (node && (node->getOp() == glslang::EOpFunction)) {\n            if (node->getName().compare(getEntryPointMangledName().c_str()) != 0)\n                reachable[f] = false; // so that function bodies are unreachable, until proven otherwise\n            for (TGraph::iterator call = callGraph.begin(); call != callGraph.end(); ++call) {\n                if (call->callee == node->getName())\n                    call->calleeBodyPosition = f;\n            }\n        }\n    }\n\n    // Start call-graph traversal by visiting the entry point nodes.\n    for (TGraph::iterator call = callGraph.begin(); call != callGraph.end(); ++call) {\n        if (call->caller.compare(getEntryPointMangledName().c_str()) == 0)\n            call->visited = true;\n    }\n\n    // Propagate 'visited' through the call-graph to every part of the graph it\n    // can reach (seeded with the entry-point setting above).\n    bool changed;\n    do {\n        changed = false;\n        for (auto call1 = callGraph.begin(); call1 != callGraph.end(); ++call1) {\n            if (call1->visited) {\n                for (TGraph::iterator call2 = callGraph.begin(); call2 != callGraph.end(); ++call2) {\n                    if (! call2->visited) {\n                        if (call1->callee == call2->caller) {\n                            changed = true;\n                            call2->visited = true;\n                        }\n                    }\n                }\n            }\n        }\n    } while (changed);\n\n    // Any call-graph node set to visited but without a callee body is an error.\n    for (TGraph::iterator call = callGraph.begin(); call != callGraph.end(); ++call) {\n        if (call->visited) {\n            if (call->calleeBodyPosition == -1) {\n                error(infoSink, \"No function definition (body) found: \");\n                infoSink.info << \"    \" << call->callee << \"\\n\";\n            } else\n                reachable[call->calleeBodyPosition] = true;\n        }\n    }\n\n    // Bodies in the AST not reached by the call graph are dead;\n    // clear them out, since they can't be reached and also can't\n    // be translated further due to possibility of being ill defined.\n    if (! keepUncalled) {\n        for (int f = 0; f < (int)functionSequence.size(); ++f) {\n            if (! reachable[f])\n            {\n                resetTopLevelUncalledStatus(functionSequence[f]->getAsAggregate()->getName());\n                functionSequence[f] = nullptr;\n            }\n        }\n        functionSequence.erase(std::remove(functionSequence.begin(), functionSequence.end(), nullptr), functionSequence.end());\n    }\n}\n\n//\n// Satisfy rules for location qualifiers on inputs and outputs\n//\nvoid TIntermediate::inOutLocationCheck(TInfoSink& infoSink)\n{\n    // ES 3.0 requires all outputs to have location qualifiers if there is more than one output\n    bool fragOutWithNoLocation = false;\n    int numFragOut = 0;\n\n    // TODO: linker functionality: location collision checking\n\n    TIntermSequence& linkObjects = findLinkerObjects()->getSequence();\n    for (size_t i = 0; i < linkObjects.size(); ++i) {\n        const TType& type = linkObjects[i]->getAsTyped()->getType();\n        const TQualifier& qualifier = type.getQualifier();\n        if (language == EShLangFragment) {\n            if (qualifier.storage == EvqVaryingOut && qualifier.builtIn == EbvNone) {\n                ++numFragOut;\n                if (!qualifier.hasAnyLocation())\n                    fragOutWithNoLocation = true;\n            }\n        }\n    }\n\n    if (isEsProfile()) {\n        if (numFragOut > 1 && fragOutWithNoLocation)\n            error(infoSink, \"when more than one fragment shader output, all must have location qualifiers\");\n    }\n}\n\nTIntermAggregate* TIntermediate::findLinkerObjects() const\n{\n    // Get the top-level globals\n    TIntermSequence& globals = treeRoot->getAsAggregate()->getSequence();\n\n    // Get the last member of the sequences, expected to be the linker-object lists\n    assert(globals.back()->getAsAggregate()->getOp() == EOpLinkerObjects);\n\n    return globals.back()->getAsAggregate();\n}\n\n// See if a variable was both a user-declared output and used.\n// Note: the spec discusses writing to one, but this looks at read or write, which\n// is more useful, and perhaps the spec should be changed to reflect that.\nbool TIntermediate::userOutputUsed() const\n{\n    const TIntermSequence& linkerObjects = findLinkerObjects()->getSequence();\n\n    bool found = false;\n    for (size_t i = 0; i < linkerObjects.size(); ++i) {\n        const TIntermSymbol& symbolNode = *linkerObjects[i]->getAsSymbolNode();\n        if (symbolNode.getQualifier().storage == EvqVaryingOut &&\n            symbolNode.getName().compare(0, 3, \"gl_\") != 0 &&\n            inIoAccessed(symbolNode.getName())) {\n            found = true;\n            break;\n        }\n    }\n\n    return found;\n}\n\n// Accumulate locations used for inputs, outputs, and uniforms, payload, callable data, and tileImageEXT\n// and check for collisions as the accumulation is done.\n//\n// Returns < 0 if no collision, >= 0 if collision and the value returned is a colliding value.\n//\n// typeCollision is set to true if there is no direct collision, but the types in the same location\n// are different.\n//\nint TIntermediate::addUsedLocation(EShMessages messages, const TQualifier& qualifier, const TType& type, bool& typeCollision)\n{\n    typeCollision = false;\n\n    int set;\n    if (qualifier.isPipeInput())\n        set = 0;\n    else if (qualifier.isPipeOutput())\n        set = 1;\n    else if (qualifier.storage == EvqUniform)\n        set = 2;\n    else if (qualifier.storage == EvqBuffer)\n        set = 3;\n    else if (qualifier.storage == EvqTileImageEXT)\n        set = 4;\n    else if (qualifier.isAnyPayload())\n        set = 0;\n    else if (qualifier.isAnyCallable())\n        set = 1;\n    else if (qualifier.isHitObjectAttrNV())\n        set = 2;\n    else\n        return -1;\n\n    int size;\n    if (qualifier.isAnyPayload() || qualifier.isAnyCallable()) {\n        size = 1;\n    } else if (qualifier.isUniformOrBuffer() || qualifier.isTaskMemory()) {\n        if (type.isSizedArray())\n            size = type.getCumulativeArraySize();\n        else\n            size = 1;\n    } else {\n        // Strip off the outer array dimension for those having an extra one.\n        if (type.isArray() && qualifier.isArrayedIo(language)) {\n            TType elementType(type, 0);\n            size = computeTypeLocationSize(elementType, language);\n        } else\n            size = computeTypeLocationSize(type, language);\n    }\n\n    // Locations, and components within locations.\n    //\n    // Almost always, dealing with components means a single location is involved.\n    // The exception is a dvec3. From the spec:\n    //\n    // \"A dvec3 will consume all four components of the first location and components 0 and 1 of\n    // the second location. This leaves components 2 and 3 available for other component-qualified\n    // declarations.\"\n    //\n    // That means, without ever mentioning a component, a component range\n    // for a different location gets specified, if it's not a vertex shader input. (!)\n    // (A vertex shader input will show using only one location, even for a dvec3/4.)\n    //\n    // So, for the case of dvec3, we need two independent ioRanges.\n    //\n    // For raytracing IO (payloads and callabledata) each declaration occupies a single\n    // slot irrespective of type.\n    int collision = -1; // no collision\n    if (qualifier.isAnyPayload() || qualifier.isAnyCallable() || qualifier.isHitObjectAttrNV()) {\n        TRange range(qualifier.layoutLocation, qualifier.layoutLocation);\n        collision = checkLocationRT(set, qualifier.layoutLocation);\n        if (collision < 0)\n            usedIoRT[set].push_back(range);\n        return collision;\n    }\n    if (size == 2 && type.getBasicType() == EbtDouble && type.getVectorSize() == 3 &&\n        (qualifier.isPipeInput() || qualifier.isPipeOutput())) {\n        // Dealing with dvec3 in/out split across two locations.\n        // Need two io-ranges.\n        // The case where the dvec3 doesn't start at component 0 was previously caught as overflow.\n\n        // First range:\n        TRange locationRange(qualifier.layoutLocation, qualifier.layoutLocation);\n        TRange componentRange(0, 3);\n        TIoRange range(locationRange, componentRange, type.getBasicType(), 0, qualifier.centroid, qualifier.smooth, qualifier.flat, qualifier.sample, qualifier.patch);\n\n        // check for collisions\n        collision = checkLocationRange(set, range, type, typeCollision);\n        if (collision < 0) {\n            usedIo[set].push_back(range);\n\n            // Second range:\n            TRange locationRange2(qualifier.layoutLocation + 1, qualifier.layoutLocation + 1);\n            TRange componentRange2(0, 1);\n            TIoRange range2(locationRange2, componentRange2, type.getBasicType(), 0, qualifier.centroid, qualifier.smooth, qualifier.flat, qualifier.sample, qualifier.patch);\n\n            // check for collisions\n            collision = checkLocationRange(set, range2, type, typeCollision);\n            if (collision < 0)\n                usedIo[set].push_back(range2);\n        }\n        return collision;\n    }\n\n    // Not a dvec3 in/out split across two locations, generic path.\n    // Need a single IO-range block.\n\n    TRange locationRange(qualifier.layoutLocation, qualifier.layoutLocation + size - 1);\n    TRange componentRange(0, 3);\n    if (qualifier.hasComponent() || type.getVectorSize() > 0) {\n        int consumedComponents = type.getVectorSize() * (type.getBasicType() == EbtDouble ? 2 : 1);\n        if (qualifier.hasComponent())\n            componentRange.start = qualifier.layoutComponent;\n        componentRange.last  = componentRange.start + consumedComponents - 1;\n    }\n\n    // combine location and component ranges\n    TBasicType basicTy = type.getBasicType();\n    if (basicTy == EbtSampler && type.getSampler().isAttachmentEXT())\n        basicTy = type.getSampler().type;\n    TIoRange range(locationRange, componentRange, basicTy, qualifier.hasIndex() ? qualifier.getIndex() : 0, qualifier.centroid, qualifier.smooth, qualifier.flat, qualifier.sample, qualifier.patch);\n\n    // check for collisions, except for vertex inputs on desktop targeting OpenGL\n    if (! (!isEsProfile() && language == EShLangVertex && qualifier.isPipeInput()) || spvVersion.vulkan > 0 || (messages & EshMsgOverlappingLocations) != 0)\n        collision = checkLocationRange(set, range, type, typeCollision);\n\n    if (collision < 0)\n        usedIo[set].push_back(range);\n\n    return collision;\n}\n\n// Check that two types can be stored in different components in the same location.\n// They must be the same type, except signed/unsigned integers are considered compatible.\nstatic bool checkCompatibleTypes(TBasicType t1, TBasicType t2) {\n    if (t1 != t2) {\n        if ((t1 == EbtInt8 && t2 == EbtUint8) ||\n            (t2 == EbtInt8 && t1 == EbtUint8) ||\n            (t1 == EbtInt16 && t2 == EbtUint16) ||\n            (t2 == EbtInt16 && t1 == EbtUint16)||\n            (t1 == EbtInt && t2 == EbtUint) ||\n            (t2 == EbtInt && t1 == EbtUint)||\n            (t1 == EbtInt64 && t2 == EbtUint64) ||\n            (t2 == EbtInt64 && t1 == EbtUint64)) {\n            return true;\n        }\n    }\n    return t1 == t2;\n}\n\n// Compare a new (the passed in) 'range' against the existing set, and see\n// if there are any collisions.\n//\n// Returns < 0 if no collision, >= 0 if collision and the value returned is a colliding value.\n//\nint TIntermediate::checkLocationRange(int set, const TIoRange& range, const TType& type, bool& typeCollision)\n{\n    for (size_t r = 0; r < usedIo[set].size(); ++r) {\n        if (range.overlap(usedIo[set][r])) {\n            // there is a collision; pick one\n            return std::max(range.location.start, usedIo[set][r].location.start);\n        } else if (range.location.overlap(usedIo[set][r].location) &&\n                   (!checkCompatibleTypes(type.getBasicType(), usedIo[set][r].basicType) ||\n                    type.getQualifier().centroid != usedIo[set][r].centroid ||\n                    type.getQualifier().smooth != usedIo[set][r].smooth ||\n                    type.getQualifier().flat != usedIo[set][r].flat ||\n                    type.getQualifier().sample != usedIo[set][r].sample ||\n                    type.getQualifier().patch != usedIo[set][r].patch)) {\n            // aliased-type mismatch\n            typeCollision = true;\n            return std::max(range.location.start, usedIo[set][r].location.start);\n        }\n    }\n\n    // check typeCollision between tileImageEXT and out\n    if (set == 4 || set == 1) {\n      // if the set is \"tileImageEXT\", check against \"out\" and vice versa\n      int againstSet = (set == 4) ? 1 : 4;\n      for (size_t r = 0; r < usedIo[againstSet].size(); ++r) {\n        if (range.location.overlap(usedIo[againstSet][r].location) && type.getBasicType() != usedIo[againstSet][r].basicType) {\n            // aliased-type mismatch\n            typeCollision = true;\n            return std::max(range.location.start, usedIo[againstSet][r].location.start);\n        }\n      }\n    }\n\n    return -1; // no collision\n}\n\nint TIntermediate::checkLocationRT(int set, int location) {\n    TRange range(location, location);\n    for (size_t r = 0; r < usedIoRT[set].size(); ++r) {\n        if (range.overlap(usedIoRT[set][r])) {\n            return range.start;\n        }\n    }\n    return -1; // no collision\n}\n\n// Accumulate bindings and offsets, and check for collisions\n// as the accumulation is done.\n//\n// Returns < 0 if no collision, >= 0 if collision and the value returned is a colliding value.\n//\nint TIntermediate::addUsedOffsets(int binding, int offset, int numOffsets)\n{\n    TRange bindingRange(binding, binding);\n    TRange offsetRange(offset, offset + numOffsets - 1);\n    TOffsetRange range(bindingRange, offsetRange);\n\n    // check for collisions, except for vertex inputs on desktop\n    for (size_t r = 0; r < usedAtomics.size(); ++r) {\n        if (range.overlap(usedAtomics[r])) {\n            // there is a collision; pick one\n            return std::max(offset, usedAtomics[r].offset.start);\n        }\n    }\n\n    usedAtomics.push_back(range);\n\n    return -1; // no collision\n}\n\n// Accumulate used constant_id values.\n//\n// Return false is one was already used.\nbool TIntermediate::addUsedConstantId(int id)\n{\n    if (usedConstantId.find(id) != usedConstantId.end())\n        return false;\n\n    usedConstantId.insert(id);\n\n    return true;\n}\n\n// Recursively figure out how many locations are used up by an input or output type.\n// Return the size of type, as measured by \"locations\".\nint TIntermediate::computeTypeLocationSize(const TType& type, EShLanguage stage)\n{\n    // \"If the declared input is an array of size n and each element takes m locations, it will be assigned m * n\n    // consecutive locations...\"\n    if (type.isArray()) {\n        // TODO: perf: this can be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness\n        // TODO: are there valid cases of having an unsized array with a location?  If so, running this code too early.\n        TType elementType(type, 0);\n        if (type.isSizedArray() && !type.getQualifier().isPerView())\n            return type.getOuterArraySize() * computeTypeLocationSize(elementType, stage);\n        else {\n            // unset perViewNV attributes for arrayed per-view outputs: \"perviewNV vec4 v[MAX_VIEWS][3];\"\n            elementType.getQualifier().perViewNV = false;\n            return computeTypeLocationSize(elementType, stage);\n        }\n    }\n\n    // \"The locations consumed by block and structure members are determined by applying the rules above\n    // recursively...\"\n    if (type.isStruct()) {\n        int size = 0;\n        for (int member = 0; member < (int)type.getStruct()->size(); ++member) {\n            TType memberType(type, member);\n            size += computeTypeLocationSize(memberType, stage);\n        }\n        return size;\n    }\n\n    // ES: \"If a shader input is any scalar or vector type, it will consume a single location.\"\n\n    // Desktop: \"If a vertex shader input is any scalar or vector type, it will consume a single location. If a non-vertex\n    // shader input is a scalar or vector type other than dvec3 or dvec4, it will consume a single location, while\n    // types dvec3 or dvec4 will consume two consecutive locations. Inputs of type double and dvec2 will\n    // consume only a single location, in all stages.\"\n    if (type.isScalar())\n        return 1;\n    if (type.isVector()) {\n        if (stage == EShLangVertex && type.getQualifier().isPipeInput())\n            return 1;\n        if (type.getBasicType() == EbtDouble && type.getVectorSize() > 2)\n            return 2;\n        else\n            return 1;\n    }\n\n    // \"If the declared input is an n x m single- or double-precision matrix, ...\n    // The number of locations assigned for each matrix will be the same as\n    // for an n-element array of m-component vectors...\"\n    if (type.isMatrix()) {\n        TType columnType(type, 0);\n        return type.getMatrixCols() * computeTypeLocationSize(columnType, stage);\n    }\n\n    assert(0);\n    return 1;\n}\n\n// Same as computeTypeLocationSize but for uniforms\nint TIntermediate::computeTypeUniformLocationSize(const TType& type)\n{\n    // \"Individual elements of a uniform array are assigned\n    // consecutive locations with the first element taking location\n    // location.\"\n    if (type.isArray()) {\n        // TODO: perf: this can be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness\n        TType elementType(type, 0);\n        if (type.isSizedArray()) {\n            return type.getOuterArraySize() * computeTypeUniformLocationSize(elementType);\n        } else {\n            // TODO: are there valid cases of having an implicitly-sized array with a location?  If so, running this code too early.\n            return computeTypeUniformLocationSize(elementType);\n        }\n    }\n\n    // \"Each subsequent inner-most member or element gets incremental\n    // locations for the entire structure or array.\"\n    if (type.isStruct()) {\n        int size = 0;\n        for (int member = 0; member < (int)type.getStruct()->size(); ++member) {\n            TType memberType(type, member);\n            size += computeTypeUniformLocationSize(memberType);\n        }\n        return size;\n    }\n\n    return 1;\n}\n\n// Accumulate xfb buffer ranges and check for collisions as the accumulation is done.\n//\n// Returns < 0 if no collision, >= 0 if collision and the value returned is a colliding value.\n//\nint TIntermediate::addXfbBufferOffset(const TType& type)\n{\n    const TQualifier& qualifier = type.getQualifier();\n\n    assert(qualifier.hasXfbOffset() && qualifier.hasXfbBuffer());\n    TXfbBuffer& buffer = xfbBuffers[qualifier.layoutXfbBuffer];\n\n    // compute the range\n    unsigned int size = computeTypeXfbSize(type, buffer.contains64BitType, buffer.contains32BitType, buffer.contains16BitType);\n    buffer.implicitStride = std::max(buffer.implicitStride, qualifier.layoutXfbOffset + size);\n    TRange range(qualifier.layoutXfbOffset, qualifier.layoutXfbOffset + size - 1);\n\n    // check for collisions\n    for (size_t r = 0; r < buffer.ranges.size(); ++r) {\n        if (range.overlap(buffer.ranges[r])) {\n            // there is a collision; pick an example to return\n            return std::max(range.start, buffer.ranges[r].start);\n        }\n    }\n\n    buffer.ranges.push_back(range);\n\n    return -1;  // no collision\n}\n\n// Recursively figure out how many bytes of xfb buffer are used by the given type.\n// Return the size of type, in bytes.\n// Sets contains64BitType to true if the type contains a 64-bit data type.\n// Sets contains32BitType to true if the type contains a 32-bit data type.\n// Sets contains16BitType to true if the type contains a 16-bit data type.\n// N.B. Caller must set contains64BitType, contains32BitType, and contains16BitType to false before calling.\nunsigned int TIntermediate::computeTypeXfbSize(const TType& type, bool& contains64BitType, bool& contains32BitType, bool& contains16BitType) const\n{\n    // \"...if applied to an aggregate containing a double or 64-bit integer, the offset must also be a multiple of 8,\n    // and the space taken in the buffer will be a multiple of 8.\n    // ...within the qualified entity, subsequent components are each\n    // assigned, in order, to the next available offset aligned to a multiple of\n    // that component's size.  Aggregate types are flattened down to the component\n    // level to get this sequence of components.\"\n\n    if (type.isSizedArray()) {\n        // TODO: perf: this can be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness\n        // Unsized array use to xfb should be a compile error.\n        TType elementType(type, 0);\n        return type.getOuterArraySize() * computeTypeXfbSize(elementType, contains64BitType, contains16BitType, contains16BitType);\n    }\n\n    if (type.isStruct()) {\n        unsigned int size = 0;\n        bool structContains64BitType = false;\n        bool structContains32BitType = false;\n        bool structContains16BitType = false;\n        for (int member = 0; member < (int)type.getStruct()->size(); ++member) {\n            TType memberType(type, member);\n            // \"... if applied to\n            // an aggregate containing a double or 64-bit integer, the offset must also be a multiple of 8,\n            // and the space taken in the buffer will be a multiple of 8.\"\n            bool memberContains64BitType = false;\n            bool memberContains32BitType = false;\n            bool memberContains16BitType = false;\n            int memberSize = computeTypeXfbSize(memberType, memberContains64BitType, memberContains32BitType, memberContains16BitType);\n            if (memberContains64BitType) {\n                structContains64BitType = true;\n                RoundToPow2(size, 8);\n            } else if (memberContains32BitType) {\n                structContains32BitType = true;\n                RoundToPow2(size, 4);\n            } else if (memberContains16BitType) {\n                structContains16BitType = true;\n                RoundToPow2(size, 2);\n            }\n            size += memberSize;\n        }\n\n        if (structContains64BitType) {\n            contains64BitType = true;\n            RoundToPow2(size, 8);\n        } else if (structContains32BitType) {\n            contains32BitType = true;\n            RoundToPow2(size, 4);\n        } else if (structContains16BitType) {\n            contains16BitType = true;\n            RoundToPow2(size, 2);\n        }\n        return size;\n    }\n\n    int numComponents {0};\n    if (type.isScalar())\n        numComponents = 1;\n    else if (type.isVector())\n        numComponents = type.getVectorSize();\n    else if (type.isMatrix())\n        numComponents = type.getMatrixCols() * type.getMatrixRows();\n    else {\n        assert(0);\n        numComponents = 1;\n    }\n\n    if (type.getBasicType() == EbtDouble || type.getBasicType() == EbtInt64 || type.getBasicType() == EbtUint64) {\n        contains64BitType = true;\n        return 8 * numComponents;\n    } else if (type.getBasicType() == EbtFloat16 || type.getBasicType() == EbtInt16 || type.getBasicType() == EbtUint16) {\n        contains16BitType = true;\n        return 2 * numComponents;\n    } else if (type.getBasicType() == EbtInt8 || type.getBasicType() == EbtUint8)\n        return numComponents;\n    else {\n        contains32BitType = true;\n        return 4 * numComponents;\n    }\n}\n\nconst int baseAlignmentVec4Std140 = 16;\n\n// Return the size and alignment of a component of the given type.\n// The size is returned in the 'size' parameter\n// Return value is the alignment..\nint TIntermediate::getBaseAlignmentScalar(const TType& type, int& size)\n{\n    switch (type.getBasicType()) {\n    case EbtInt64:\n    case EbtUint64:\n    case EbtDouble:  size = 8; return 8;\n    case EbtFloat16: size = 2; return 2;\n    case EbtBFloat16: size = 2; return 2;\n    case EbtFloatE5M2:\n    case EbtFloatE4M3:\n    case EbtInt8:\n    case EbtUint8:   size = 1; return 1;\n    case EbtInt16:\n    case EbtUint16:  size = 2; return 2;\n    case EbtReference: size = 8; return 8;\n    case EbtSampler:\n    {\n        if (type.isBindlessImage() || type.isBindlessTexture()) {\n            size = 8; return 8;\n        }\n        else {\n            size = 4; return 4;\n        }\n    }\n    default:         size = 4; return 4;\n    }\n}\n\n// Implement base-alignment and size rules from section 7.6.2.2 Standard Uniform Block Layout\n// Operates recursively.\n//\n// If std140 is true, it does the rounding up to vec4 size required by std140,\n// otherwise it does not, yielding std430 rules.\n//\n// The size is returned in the 'size' parameter\n//\n// The stride is only non-0 for arrays or matrices, and is the stride of the\n// top-level object nested within the type.  E.g., for an array of matrices,\n// it is the distances needed between matrices, despite the rules saying the\n// stride comes from the flattening down to vectors.\n//\n// Return value is the alignment of the type.\nint TIntermediate::getBaseAlignment(const TType& type, int& size, int& stride, TLayoutPacking layoutPacking, bool rowMajor)\n{\n    int alignment;\n\n    bool std140 = layoutPacking == glslang::ElpStd140;\n    // When using the std140 storage layout, structures will be laid out in buffer\n    // storage with its members stored in monotonically increasing order based on their\n    // location in the declaration. A structure and each structure member have a base\n    // offset and a base alignment, from which an aligned offset is computed by rounding\n    // the base offset up to a multiple of the base alignment. The base offset of the first\n    // member of a structure is taken from the aligned offset of the structure itself. The\n    // base offset of all other structure members is derived by taking the offset of the\n    // last basic machine unit consumed by the previous member and adding one. Each\n    // structure member is stored in memory at its aligned offset. The members of a top-\n    // level uniform block are laid out in buffer storage by treating the uniform block as\n    // a structure with a base offset of zero.\n    //\n    //   1. If the member is a scalar consuming N basic machine units, the base alignment is N.\n    //\n    //   2. If the member is a two- or four-component vector with components consuming N basic\n    //      machine units, the base alignment is 2N or 4N, respectively.\n    //\n    //   3. If the member is a three-component vector with components consuming N\n    //      basic machine units, the base alignment is 4N.\n    //\n    //   4. If the member is an array of scalars or vectors, the base alignment and array\n    //      stride are set to match the base alignment of a single array element, according\n    //      to rules (1), (2), and (3), and rounded up to the base alignment of a vec4. The\n    //      array may have padding at the end; the base offset of the member following\n    //      the array is rounded up to the next multiple of the base alignment.\n    //\n    //   5. If the member is a column-major matrix with C columns and R rows, the\n    //      matrix is stored identically to an array of C column vectors with R\n    //      components each, according to rule (4).\n    //\n    //   6. If the member is an array of S column-major matrices with C columns and\n    //      R rows, the matrix is stored identically to a row of S X C column vectors\n    //      with R components each, according to rule (4).\n    //\n    //   7. If the member is a row-major matrix with C columns and R rows, the matrix\n    //      is stored identically to an array of R row vectors with C components each,\n    //      according to rule (4).\n    //\n    //   8. If the member is an array of S row-major matrices with C columns and R\n    //      rows, the matrix is stored identically to a row of S X R row vectors with C\n    //      components each, according to rule (4).\n    //\n    //   9. If the member is a structure, the base alignment of the structure is N , where\n    //      N is the largest base alignment value of any    of its members, and rounded\n    //      up to the base alignment of a vec4. The individual members of this substructure\n    //      are then assigned offsets by applying this set of rules recursively,\n    //      where the base offset of the first member of the sub-structure is equal to the\n    //      aligned offset of the structure. The structure may have padding at the end;\n    //      the base offset of the member following the sub-structure is rounded up to\n    //      the next multiple of the base alignment of the structure.\n    //\n    //   10. If the member is an array of S structures, the S elements of the array are laid\n    //       out in order, according to rule (9).\n    //\n    //   Assuming, for rule 10:  The stride is the same as the size of an element.\n\n    stride = 0;\n    int dummyStride;\n\n    // rules 4, 6, 8, and 10\n    if (type.isArray()) {\n        // TODO: perf: this might be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness\n        TType derefType(type, 0);\n        alignment = getBaseAlignment(derefType, size, dummyStride, layoutPacking, rowMajor);\n        if (std140)\n            alignment = std::max(baseAlignmentVec4Std140, alignment);\n        RoundToPow2(size, alignment);\n        stride = size;  // uses full matrix size for stride of an array of matrices (not quite what rule 6/8, but what's expected)\n                        // uses the assumption for rule 10 in the comment above\n        // use one element to represent the last member of SSBO which is unsized array\n        int arraySize = (type.isUnsizedArray() && (type.getOuterArraySize() == 0)) ? 1 : type.getOuterArraySize();\n        size = stride * arraySize;\n        return alignment;\n    }\n\n    // rule 9\n    if (type.getBasicType() == EbtStruct || type.getBasicType() == EbtBlock) {\n        const TTypeList& memberList = *type.getStruct();\n\n        size = 0;\n        int maxAlignment = std140 ? baseAlignmentVec4Std140 : 0;\n        for (size_t m = 0; m < memberList.size(); ++m) {\n            int memberSize;\n            // modify just the children's view of matrix layout, if there is one for this member\n            TLayoutMatrix subMatrixLayout = memberList[m].type->getQualifier().layoutMatrix;\n            int memberAlignment = getBaseAlignment(*memberList[m].type, memberSize, dummyStride, layoutPacking,\n                                                   (subMatrixLayout != ElmNone) ? (subMatrixLayout == ElmRowMajor) : rowMajor);\n            maxAlignment = std::max(maxAlignment, memberAlignment);\n            RoundToPow2(size, memberAlignment);\n            size += memberSize;\n        }\n\n        // The structure may have padding at the end; the base offset of\n        // the member following the sub-structure is rounded up to the next\n        // multiple of the base alignment of the structure.\n        RoundToPow2(size, maxAlignment);\n\n        return maxAlignment;\n    }\n\n    // rule 1\n    if (type.isScalar())\n        return getBaseAlignmentScalar(type, size);\n\n    // rules 2 and 3\n    if (type.isVector()) {\n        int scalarAlign = getBaseAlignmentScalar(type, size);\n        switch (type.getVectorSize()) {\n        case 1: // HLSL has this, GLSL does not\n            return scalarAlign;\n        case 2:\n            size *= 2;\n            return 2 * scalarAlign;\n        default:\n            size *= type.getVectorSize();\n            return 4 * scalarAlign;\n        }\n    }\n\n    // rules 5 and 7\n    if (type.isMatrix()) {\n        // rule 5: deref to row, not to column, meaning the size of vector is num columns instead of num rows\n        TType derefType(type, 0, rowMajor);\n\n        alignment = getBaseAlignment(derefType, size, dummyStride, layoutPacking, rowMajor);\n        if (std140)\n            alignment = std::max(baseAlignmentVec4Std140, alignment);\n        RoundToPow2(size, alignment);\n        stride = size;  // use intra-matrix stride for stride of a just a matrix\n        if (rowMajor)\n            size = stride * type.getMatrixRows();\n        else\n            size = stride * type.getMatrixCols();\n\n        return alignment;\n    }\n\n    assert(0);  // all cases should be covered above\n    size = baseAlignmentVec4Std140;\n    return baseAlignmentVec4Std140;\n}\n\n// To aid the basic HLSL rule about crossing vec4 boundaries.\nbool TIntermediate::improperStraddle(const TType& type, int size, int offset, bool vectorLike)\n{\n    if (! vectorLike || type.isArray())\n        return false;\n\n    return size <= 16 ? offset / 16 != (offset + size - 1) / 16\n                      : offset % 16 != 0;\n}\n\nint TIntermediate::getScalarAlignment(const TType& type, int& size, int& stride, bool rowMajor)\n{\n    int alignment;\n\n    stride = 0;\n    int dummyStride;\n\n    if (type.isArray()) {\n        TType derefType(type, 0);\n        alignment = getScalarAlignment(derefType, size, dummyStride, rowMajor);\n\n        stride = size;\n        RoundToPow2(stride, alignment);\n\n        size = stride * (type.getOuterArraySize() - 1) + size;\n        return alignment;\n    }\n\n    if (type.getBasicType() == EbtStruct) {\n        const TTypeList& memberList = *type.getStruct();\n\n        size = 0;\n        int maxAlignment = 0;\n        for (size_t m = 0; m < memberList.size(); ++m) {\n            int memberSize;\n            // modify just the children's view of matrix layout, if there is one for this member\n            TLayoutMatrix subMatrixLayout = memberList[m].type->getQualifier().layoutMatrix;\n            int memberAlignment = getScalarAlignment(*memberList[m].type, memberSize, dummyStride,\n                                                     (subMatrixLayout != ElmNone) ? (subMatrixLayout == ElmRowMajor) : rowMajor);\n            maxAlignment = std::max(maxAlignment, memberAlignment);\n            RoundToPow2(size, memberAlignment);\n            size += memberSize;\n        }\n\n        return maxAlignment;\n    }\n\n    if (type.isScalar())\n        return getBaseAlignmentScalar(type, size);\n\n    if (type.isVector()) {\n        int scalarAlign = getBaseAlignmentScalar(type, size);\n\n        size *= type.getVectorSize();\n        return scalarAlign;\n    }\n\n    if (type.isMatrix()) {\n        TType derefType(type, 0, rowMajor);\n\n        alignment = getScalarAlignment(derefType, size, dummyStride, rowMajor);\n\n        stride = size;  // use intra-matrix stride for stride of a just a matrix\n        if (rowMajor)\n            size = stride * type.getMatrixRows();\n        else\n            size = stride * type.getMatrixCols();\n\n        return alignment;\n    }\n\n    assert(0);  // all cases should be covered above\n    size = 1;\n    return 1;\n}\n\nint TIntermediate::getMemberAlignment(const TType& type, int& size, int& stride, TLayoutPacking layoutPacking, bool rowMajor)\n{\n    if (layoutPacking == glslang::ElpScalar) {\n        return getScalarAlignment(type, size, stride, rowMajor);\n    } else {\n        return getBaseAlignment(type, size, stride, layoutPacking, rowMajor);\n    }\n}\n\n// shared calculation by getOffset and getOffsets\nvoid TIntermediate::updateOffset(const TType& parentType, const TType& memberType, int& offset, int& memberSize)\n{\n    int dummyStride;\n\n    // modify just the children's view of matrix layout, if there is one for this member\n    TLayoutMatrix subMatrixLayout = memberType.getQualifier().layoutMatrix;\n    int memberAlignment = getMemberAlignment(memberType, memberSize, dummyStride,\n                                             parentType.getQualifier().layoutPacking,\n                                             subMatrixLayout != ElmNone\n                                                 ? subMatrixLayout == ElmRowMajor\n                                                 : parentType.getQualifier().layoutMatrix == ElmRowMajor);\n    RoundToPow2(offset, memberAlignment);\n}\n\n// Lookup or calculate the offset of a block member, using the recursively\n// defined block offset rules.\nint TIntermediate::getOffset(const TType& type, int index)\n{\n    const TTypeList& memberList = *type.getStruct();\n\n    // Don't calculate offset if one is present, it could be user supplied\n    // and different than what would be calculated.  That is, this is faster,\n    // but not just an optimization.\n    if (memberList[index].type->getQualifier().hasOffset())\n        return memberList[index].type->getQualifier().layoutOffset;\n\n    int memberSize = 0;\n    int offset = 0;\n    for (int m = 0; m <= index; ++m) {\n        updateOffset(type, *memberList[m].type, offset, memberSize);\n\n        if (m < index)\n            offset += memberSize;\n    }\n\n    return offset;\n}\n\n// Calculate the block data size.\n// Block arrayness is not taken into account, each element is backed by a separate buffer.\nint TIntermediate::getBlockSize(const TType& blockType)\n{\n    const TTypeList& memberList = *blockType.getStruct();\n    int lastIndex = (int)memberList.size() - 1;\n    int lastOffset = getOffset(blockType, lastIndex);\n\n    int lastMemberSize;\n    int dummyStride;\n    getMemberAlignment(*memberList[lastIndex].type, lastMemberSize, dummyStride,\n                       blockType.getQualifier().layoutPacking,\n                       blockType.getQualifier().layoutMatrix == ElmRowMajor);\n\n    return lastOffset + lastMemberSize;\n}\n\nint TIntermediate::computeBufferReferenceTypeSize(const TType& type)\n{\n    assert(type.isReference());\n    int size = getBlockSize(*type.getReferentType());\n\n    int align = type.getBufferReferenceAlignment();\n\n    if (align) {\n        size = (size + align - 1) & ~(align-1);\n    }\n\n    return size;\n}\n\nbool TIntermediate::isIoResizeArray(const TType& type, EShLanguage language) {\n    return type.isArray() &&\n            ((language == EShLangGeometry    && type.getQualifier().storage == EvqVaryingIn) ||\n            (language == EShLangTessControl && (type.getQualifier().storage == EvqVaryingIn || type.getQualifier().storage == EvqVaryingOut) &&\n                ! type.getQualifier().patch) ||\n            (language == EShLangTessEvaluation && type.getQualifier().storage == EvqVaryingIn) ||\n            (language == EShLangFragment && type.getQualifier().storage == EvqVaryingIn &&\n             (type.getQualifier().pervertexNV || type.getQualifier().pervertexEXT)) ||\n            (language == EShLangMesh && type.getQualifier().storage == EvqVaryingOut &&\n                !type.getQualifier().perTaskNV));\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/localintermediate.h",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2016 LunarG, Inc.\n// Copyright (C) 2017 ARM Limited.\n// Copyright (C) 2015-2018 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#ifndef _LOCAL_INTERMEDIATE_INCLUDED_\n#define _LOCAL_INTERMEDIATE_INCLUDED_\n\n#include \"../Include/intermediate.h\"\n#include \"../Public/ShaderLang.h\"\n#include \"Versions.h\"\n\n#include <algorithm>\n#include <array>\n#include <functional>\n#include <set>\n#include <string>\n#include <vector>\n\nclass TInfoSink;\n\nnamespace glslang {\n\nstruct TMatrixSelector {\n    int coord1;  // stay agnostic about column/row; this is parse order\n    int coord2;\n};\n\ntypedef int TVectorSelector;\n\nconst int MaxSwizzleSelectors = 4;\n\ntemplate<typename selectorType>\nclass TSwizzleSelectors {\npublic:\n    TSwizzleSelectors() : size_(0) { }\n\n    void push_back(selectorType comp)\n    {\n        if (size_ < MaxSwizzleSelectors)\n            components[size_++] = comp;\n    }\n    void resize(int s)\n    {\n        assert(s <= size_);\n        size_ = s;\n    }\n    int size() const { return size_; }\n    selectorType operator[](int i) const\n    {\n        assert(i < MaxSwizzleSelectors);\n        return components[i];\n    }\n\nprivate:\n    int size_;\n    selectorType components[MaxSwizzleSelectors];\n};\n\n//\n// Some helper structures for TIntermediate.  Their contents are encapsulated\n// by TIntermediate.\n//\n\n// Used for call-graph algorithms for detecting recursion, missing bodies, and dead bodies.\n// A \"call\" is a pair: <caller, callee>.\n// There can be duplicates. General assumption is the list is small.\nstruct TCall {\n    TCall(const TString& pCaller, const TString& pCallee)\n        : caller(pCaller), callee(pCallee), visited(false), currentPath(false), errorGiven(false) { }\n    TString caller;\n    TString callee;\n    bool visited;\n    bool currentPath;\n    bool errorGiven;\n    int calleeBodyPosition;\n};\n\n// A generic 1-D range.\nstruct TRange {\n    TRange(int start, int last) : start(start), last(last) { }\n    bool overlap(const TRange& rhs) const\n    {\n        return last >= rhs.start && start <= rhs.last;\n    }\n    int start;\n    int last;\n};\n\n// An IO range is a 3-D rectangle; the set of (location, component, index) triples all lying\n// within the same location range, component range, and index value.  Locations don't alias unless\n// all other dimensions of their range overlap.\nstruct TIoRange {\n    TIoRange(TRange location, TRange component, TBasicType basicType, int index, bool centroid, bool smooth, bool flat, bool sample, bool patch)\n        : location(location), component(component), basicType(basicType), index(index), centroid(centroid), smooth(smooth), flat(flat), sample(sample), patch(patch)\n    {\n    }\n    bool overlap(const TIoRange& rhs) const\n    {\n        return location.overlap(rhs.location) && component.overlap(rhs.component) && index == rhs.index;\n    }\n    TRange location;\n    TRange component;\n    TBasicType basicType;\n    int index;\n    bool centroid;\n    bool smooth;\n    bool flat;\n    bool sample;\n    bool patch;\n};\n\n// An offset range is a 2-D rectangle; the set of (binding, offset) pairs all lying\n// within the same binding and offset range.\nstruct TOffsetRange {\n    TOffsetRange(TRange binding, TRange offset)\n        : binding(binding), offset(offset) { }\n    bool overlap(const TOffsetRange& rhs) const\n    {\n        return binding.overlap(rhs.binding) && offset.overlap(rhs.offset);\n    }\n    TRange binding;\n    TRange offset;\n};\n\n// Things that need to be tracked per xfb buffer.\nstruct TXfbBuffer {\n    TXfbBuffer() : stride(TQualifier::layoutXfbStrideEnd), implicitStride(0), contains64BitType(false),\n                   contains32BitType(false), contains16BitType(false) { }\n    std::vector<TRange> ranges;  // byte offsets that have already been assigned\n    unsigned int stride;\n    unsigned int implicitStride;\n    bool contains64BitType;\n    bool contains32BitType;\n    bool contains16BitType;\n};\n\n// Track a set of strings describing how the module was processed.\n// This includes command line options, transforms, etc., ideally inclusive enough\n// to reproduce the steps used to transform the input source to the output.\n// E.g., see SPIR-V OpModuleProcessed.\n// Each \"process\" or \"transform\" uses is expressed in the form:\n//   process arg0 arg1 arg2 ...\n//   process arg0 arg1 arg2 ...\n// where everything is textual, and there can be zero or more arguments\nclass TProcesses {\npublic:\n    TProcesses() {}\n    ~TProcesses() {}\n\n    void addProcess(const char* process)\n    {\n        processes.push_back(process);\n    }\n    void addProcess(const std::string& process)\n    {\n        processes.push_back(process);\n    }\n    void addArgument(int arg)\n    {\n        processes.back().append(\" \");\n        std::string argString = std::to_string(arg);\n        processes.back().append(argString);\n    }\n    void addArgument(const char* arg)\n    {\n        processes.back().append(\" \");\n        processes.back().append(arg);\n    }\n    void addArgument(const std::string& arg)\n    {\n        processes.back().append(\" \");\n        processes.back().append(arg);\n    }\n    void addIfNonZero(const char* process, int value)\n    {\n        if (value != 0) {\n            addProcess(process);\n            addArgument(value);\n        }\n    }\n\n    const std::vector<std::string>& getProcesses() const { return processes; }\n\nprivate:\n    std::vector<std::string> processes;\n};\n\nclass TSymbolTable;\nclass TSymbol;\nclass TVariable;\n\n//\n// Texture and Sampler transformation mode.\n//\nenum ComputeDerivativeMode {\n    LayoutDerivativeNone,         // default layout as SPV_NV_compute_shader_derivatives not enabled\n    LayoutDerivativeGroupQuads,   // derivative_group_quadsNV\n    LayoutDerivativeGroupLinear,  // derivative_group_linearNV\n};\n\n//\n// Status type on AST level. Some uncalled status or functions would be reset in call graph.\n// Currently we will keep status set by explicitly declared layout or variable decl.\n//\nenum AstRefType {\n    AstRefTypeVar,         // Status set by variable decl\n    AstRefTypeFunc,        // Status set by function decl\n    AstRefTypeLayout,      // Status set by layout decl\n};\n\nclass TIdMaps {\npublic:\n    TMap<TString, long long>& operator[](long long i) { return maps[i]; }\n    const TMap<TString, long long>& operator[](long long i) const { return maps[i]; }\nprivate:\n    TMap<TString, long long> maps[EsiCount];\n};\n\nclass TNumericFeatures {\npublic:\n    TNumericFeatures() : features(0) { }\n    TNumericFeatures(const TNumericFeatures&) = delete;\n    TNumericFeatures& operator=(const TNumericFeatures&) = delete;\n    typedef enum : unsigned int {\n        shader_explicit_arithmetic_types          = 1 << 0,\n        shader_explicit_arithmetic_types_int8     = 1 << 1,\n        shader_explicit_arithmetic_types_int16    = 1 << 2,\n        shader_explicit_arithmetic_types_int32    = 1 << 3,\n        shader_explicit_arithmetic_types_int64    = 1 << 4,\n        shader_explicit_arithmetic_types_float16  = 1 << 5,\n        shader_explicit_arithmetic_types_float32  = 1 << 6,\n        shader_explicit_arithmetic_types_float64  = 1 << 7,\n        shader_implicit_conversions               = 1 << 8,\n        gpu_shader_fp64                           = 1 << 9,\n        gpu_shader_int16                          = 1 << 10,\n        gpu_shader_half_float                     = 1 << 11,\n        nv_gpu_shader5_types                      = 1 << 12,\n    } feature;\n    void insert(feature f) { features |= f; }\n    void erase(feature f) { features &= ~f; }\n    bool contains(feature f) const { return (features & f) != 0; }\nprivate:\n    unsigned int features;\n};\n\n// MustBeAssigned wraps a T, asserting that it has been assigned with \n// operator =() before attempting to read with operator T() or operator ->().\n// Used to catch cases where fields are read before they have been assigned.\ntemplate<typename T>\nclass MustBeAssigned\n{\npublic:\n    MustBeAssigned() = default;\n    MustBeAssigned(const T& v) : value(v) {}\n    operator const T&() const { assert(isSet); return value; }\n    const T* operator ->() const { assert(isSet); return &value; }\n    MustBeAssigned& operator = (const T& v) { value = v; isSet = true; return *this; } \nprivate:\n    T value;\n    bool isSet = false;\n};\n\n//\n// Set of helper functions to help parse and build the tree.\n//\nclass TIntermediate {\npublic:\n    explicit TIntermediate(EShLanguage l, int v = 0, EProfile p = ENoProfile) :\n        language(l),\n        profile(p), version(v),\n        treeRoot(nullptr),\n        resources(TBuiltInResource{}),\n        numEntryPoints(0), numErrors(0), numPushConstants(0), recursive(false),\n        invertY(false),\n        dxPositionW(false),\n        enhancedMsgs(false),\n        debugInfo(false),\n        useStorageBuffer(false),\n        invariantAll(false),\n        nanMinMaxClamp(false),\n        depthReplacing(false),\n        stencilReplacing(false),\n        uniqueId(0),\n        globalUniformBlockName(\"\"),\n        atomicCounterBlockName(\"\"),\n        globalUniformBlockSet(TQualifier::layoutSetEnd),\n        globalUniformBlockBinding(TQualifier::layoutBindingEnd),\n        atomicCounterBlockSet(TQualifier::layoutSetEnd),\n        implicitThisName(\"@this\"), implicitCounterName(\"@count\"),\n        source(EShSourceNone),\n        useVulkanMemoryModel(false),\n        invocations(TQualifier::layoutNotSet), vertices(TQualifier::layoutNotSet),\n        inputPrimitive(ElgNone), outputPrimitive(ElgNone),\n        pixelCenterInteger(false), originUpperLeft(false),texCoordBuiltinRedeclared(false),\n        vertexSpacing(EvsNone), vertexOrder(EvoNone), interlockOrdering(EioNone), pointMode(false), earlyFragmentTests(false),\n        postDepthCoverage(false), earlyAndLateFragmentTestsAMD(false),\n        nonCoherentColorAttachmentReadEXT(false),\n        nonCoherentDepthAttachmentReadEXT(false),\n        nonCoherentStencilAttachmentReadEXT(false),\n        depthLayout(EldNone),\n        stencilLayout(ElsNone),\n        hlslFunctionality1(false),\n        blendEquations(0), xfbMode(false), multiStream(false),\n        layoutOverrideCoverage(false),\n        geoPassthroughEXT(false),\n        numShaderRecordBlocks(0),\n        computeDerivativeMode(LayoutDerivativeNone),\n        primitives(TQualifier::layoutNotSet),\n        numTaskNVBlocks(0),\n        layoutPrimitiveCulling(false),\n        numTaskEXTPayloads(0),\n        nonCoherentTileAttachmentReadQCOM(false),\n        autoMapBindings(false),\n        autoMapLocations(false),\n        flattenUniformArrays(false),\n        useUnknownFormat(false),\n        hlslOffsets(false),\n        hlslIoMapping(false),\n        useVariablePointers(false),\n        textureSamplerTransformMode(EShTexSampTransKeep),\n        needToLegalize(false),\n        binaryDoubleOutput(false),\n        subgroupUniformControlFlow(false),\n        maximallyReconverges(false),\n        usePhysicalStorageBuffer(false),\n        spirvRequirement(nullptr),\n        spirvExecutionMode(nullptr),\n        uniformLocationBase(0),\n        quadDerivMode(false), reqFullQuadsMode(false)\n    {\n        localSize[0] = 1;\n        localSize[1] = 1;\n        localSize[2] = 1;\n        localSizeNotDefault[0] = false;\n        localSizeNotDefault[1] = false;\n        localSizeNotDefault[2] = false;\n        localSizeSpecId[0] = TQualifier::layoutNotSet;\n        localSizeSpecId[1] = TQualifier::layoutNotSet;\n        localSizeSpecId[2] = TQualifier::layoutNotSet;\n        xfbBuffers.resize(TQualifier::layoutXfbBufferEnd);\n        tileShadingRateQCOM[0] = 0;\n        tileShadingRateQCOM[1] = 0;\n        tileShadingRateQCOM[2] = 0;\n        tileShadingRateQCOMNotDefault[0] = false;\n        tileShadingRateQCOMNotDefault[1] = false;\n        tileShadingRateQCOMNotDefault[2] = false;\n        shiftBinding.fill(0);\n    }\n\n    void setVersion(int v)\n    {\n        version = v;\n    }\n    void setProfile(EProfile p)\n    {\n        profile = p;\n    }\n\n    int getVersion() const { return version; }\n    EProfile getProfile() const { return profile; }\n    void setSpv(const SpvVersion& s)\n    {\n        spvVersion = s;\n\n        // client processes\n        if (spvVersion.vulkan > 0)\n            processes.addProcess(\"client vulkan100\");\n        if (spvVersion.openGl > 0)\n            processes.addProcess(\"client opengl100\");\n\n        // target SPV\n        switch (spvVersion.spv) {\n        case 0:\n            break;\n        case EShTargetSpv_1_0:\n            break;\n        case EShTargetSpv_1_1:\n            processes.addProcess(\"target-env spirv1.1\");\n            break;\n        case EShTargetSpv_1_2:\n            processes.addProcess(\"target-env spirv1.2\");\n            break;\n        case EShTargetSpv_1_3:\n            processes.addProcess(\"target-env spirv1.3\");\n            break;\n        case EShTargetSpv_1_4:\n            processes.addProcess(\"target-env spirv1.4\");\n            break;\n        case EShTargetSpv_1_5:\n            processes.addProcess(\"target-env spirv1.5\");\n            break;\n        case EShTargetSpv_1_6:\n            processes.addProcess(\"target-env spirv1.6\");\n            break;\n        default:\n            processes.addProcess(\"target-env spirvUnknown\");\n            break;\n        }\n\n        // target-environment processes\n        switch (spvVersion.vulkan) {\n        case 0:\n            break;\n        case EShTargetVulkan_1_0:\n            processes.addProcess(\"target-env vulkan1.0\");\n            break;\n        case EShTargetVulkan_1_1:\n            processes.addProcess(\"target-env vulkan1.1\");\n            break;\n        case EShTargetVulkan_1_2:\n            processes.addProcess(\"target-env vulkan1.2\");\n            break;\n        case EShTargetVulkan_1_3:\n            processes.addProcess(\"target-env vulkan1.3\");\n            break;\n        case EShTargetVulkan_1_4:\n            processes.addProcess(\"target-env vulkan1.4\");\n            break;\n        default:\n            processes.addProcess(\"target-env vulkanUnknown\");\n            break;\n        }\n        if (spvVersion.openGl > 0)\n            processes.addProcess(\"target-env opengl\");\n    }\n    const SpvVersion& getSpv() const { return spvVersion; }\n    EShLanguage getStage() const { return language; }\n    void addRequestedExtension(const char* extension) { requestedExtensions.insert(extension); }\n    const std::set<std::string>& getRequestedExtensions() const { return requestedExtensions; }\n    bool isRayTracingStage() const {\n        return language >= EShLangRayGen && language <= EShLangCallableNV;\n    }\n\n    void setTreeRoot(TIntermNode* r) { treeRoot = r; }\n    TIntermNode* getTreeRoot() const { return treeRoot; }\n    void incrementEntryPointCount() { ++numEntryPoints; }\n    int getNumEntryPoints() const { return numEntryPoints; }\n    int getNumErrors() const { return numErrors; }\n    void addPushConstantCount() { ++numPushConstants; }\n    void setLimits(const TBuiltInResource& r) { resources = r; }\n    const TBuiltInResource& getLimits() const { return resources; }\n\n    bool postProcess(TIntermNode*, EShLanguage);\n    void removeTree();\n\n    void setEntryPointName(const char* ep)\n    {\n        entryPointName = ep;\n        processes.addProcess(\"entry-point\");\n        processes.addArgument(entryPointName);\n    }\n    void setEntryPointMangledName(const char* ep) { entryPointMangledName = ep; }\n    const std::string& getEntryPointName() const { return entryPointName; }\n    const std::string& getEntryPointMangledName() const { return entryPointMangledName; }\n\n    void setDebugInfo(bool debuginfo)\n    {\n        debugInfo = debuginfo;\n    }\n    bool getDebugInfo() const { return debugInfo; }\n\n    void setInvertY(bool invert)\n    {\n        invertY = invert;\n        if (invertY)\n            processes.addProcess(\"invert-y\");\n    }\n    bool getInvertY() const { return invertY; }\n\n    void setDxPositionW(bool dxPosW)\n    {\n        dxPositionW = dxPosW;\n        if (dxPositionW)\n            processes.addProcess(\"dx-position-w\");\n    }\n    bool getDxPositionW() const { return dxPositionW; }\n\n    void setEnhancedMsgs()\n    {\n        enhancedMsgs = true;\n    }\n    bool getEnhancedMsgs() const { return enhancedMsgs && getSource() == EShSourceGlsl; }\n\n#ifdef ENABLE_HLSL\n    void setSource(EShSource s) { source = s; }\n    EShSource getSource() const { return source; }\n#else\n    void setSource(EShSource s) { assert(s == EShSourceGlsl); (void)s; }\n    EShSource getSource() const { return EShSourceGlsl; }\n#endif\n\n    bool isRecursive() const { return recursive; }\n\n    TIntermSymbol* addSymbol(const TVariable&);\n    TIntermSymbol* addSymbol(const TVariable&, const TSourceLoc&);\n    TIntermSymbol* addSymbol(const TType&, const TSourceLoc&);\n    TIntermSymbol* addSymbol(const TIntermSymbol&);\n    TIntermTyped* addConversion(TOperator, const TType&, TIntermTyped*);\n    std::tuple<TIntermTyped*, TIntermTyped*> addPairConversion(TOperator op, TIntermTyped* node0, TIntermTyped* node1);\n    TIntermTyped* addUniShapeConversion(TOperator, const TType&, TIntermTyped*);\n    TIntermTyped* addConversion(TBasicType convertTo, TIntermTyped* node) const;\n    void addBiShapeConversion(TOperator, TIntermTyped*& lhsNode, TIntermTyped*& rhsNode);\n    TIntermTyped* addShapeConversion(const TType&, TIntermTyped*);\n    TIntermTyped* addBinaryMath(TOperator, TIntermTyped* left, TIntermTyped* right, const TSourceLoc&);\n    TIntermTyped* addAssign(TOperator op, TIntermTyped* left, TIntermTyped* right, const TSourceLoc&);\n    TIntermTyped* addIndex(TOperator op, TIntermTyped* base, TIntermTyped* index, const TSourceLoc&);\n    TIntermTyped* addUnaryMath(TOperator, TIntermTyped* child, const TSourceLoc&);\n    TIntermTyped* addBuiltInFunctionCall(const TSourceLoc& line, TOperator, bool unary, TIntermNode*, const TType& returnType);\n    bool canImplicitlyPromote(TBasicType from, TBasicType to, TOperator op = EOpNull) const;\n    bool isIntegralPromotion(TBasicType from, TBasicType to) const;\n    bool isFPPromotion(TBasicType from, TBasicType to) const;\n    bool isIntegralConversion(TBasicType from, TBasicType to) const;\n    bool isFPConversion(TBasicType from, TBasicType to) const;\n    bool isFPIntegralConversion(TBasicType from, TBasicType to) const;\n    TOperator mapTypeToConstructorOp(const TType&) const;\n    TIntermAggregate* growAggregate(TIntermNode* left, TIntermNode* right);\n    TIntermAggregate* growAggregate(TIntermNode* left, TIntermNode* right, const TSourceLoc&);\n    TIntermAggregate* mergeAggregate(TIntermNode* left, TIntermNode* right);\n    TIntermAggregate* mergeAggregate(TIntermNode* left, TIntermNode* right, const TSourceLoc&);\n    TIntermAggregate* makeAggregate(TIntermNode* node);\n    TIntermAggregate* makeAggregate(TIntermNode* node, const TSourceLoc&);\n    TIntermAggregate* makeAggregate(const TSourceLoc&);\n    TIntermTyped* setAggregateOperator(TIntermNode*, TOperator, const TType& type, const TSourceLoc&);\n    bool areAllChildConst(TIntermAggregate* aggrNode);\n    TIntermSelection* addSelection(TIntermTyped* cond, TIntermNodePair code, const TSourceLoc&);\n    TIntermTyped* addSelection(TIntermTyped* cond, TIntermTyped* trueBlock, TIntermTyped* falseBlock, const TSourceLoc&);\n    TIntermTyped* addComma(TIntermTyped* left, TIntermTyped* right, const TSourceLoc&);\n    TIntermTyped* addMethod(TIntermTyped*, const TType&, const TString*, const TSourceLoc&);\n    TIntermConstantUnion* addConstantUnion(const TConstUnionArray&, const TType&, const TSourceLoc&, bool literal = false) const;\n    TIntermConstantUnion* addConstantUnion(signed char, const TSourceLoc&, bool literal = false) const;\n    TIntermConstantUnion* addConstantUnion(unsigned char, const TSourceLoc&, bool literal = false) const;\n    TIntermConstantUnion* addConstantUnion(signed short, const TSourceLoc&, bool literal = false) const;\n    TIntermConstantUnion* addConstantUnion(unsigned short, const TSourceLoc&, bool literal = false) const;\n    TIntermConstantUnion* addConstantUnion(int, const TSourceLoc&, bool literal = false) const;\n    TIntermConstantUnion* addConstantUnion(unsigned int, const TSourceLoc&, bool literal = false) const;\n    TIntermConstantUnion* addConstantUnion(long long, const TSourceLoc&, bool literal = false) const;\n    TIntermConstantUnion* addConstantUnion(unsigned long long, const TSourceLoc&, bool literal = false) const;\n    TIntermConstantUnion* addConstantUnion(bool, const TSourceLoc&, bool literal = false) const;\n    TIntermConstantUnion* addConstantUnion(double, TBasicType, const TSourceLoc&, bool literal = false) const;\n    TIntermConstantUnion* addConstantUnion(const TString*, const TSourceLoc&, bool literal = false) const;\n    TIntermTyped* promoteConstantUnion(TBasicType, TIntermConstantUnion*) const;\n    bool parseConstTree(TIntermNode*, TConstUnionArray, TOperator, const TType&, bool singleConstantParam = false);\n    TIntermLoop* addLoop(TIntermNode*, TIntermTyped*, TIntermTyped*, bool testFirst, const TSourceLoc&);\n    TIntermAggregate* addForLoop(TIntermNode*, TIntermNode*, TIntermTyped*, TIntermTyped*, bool testFirst,\n        const TSourceLoc&, TIntermLoop*&);\n    TIntermBranch* addBranch(TOperator, const TSourceLoc&);\n    TIntermBranch* addBranch(TOperator, TIntermTyped*, const TSourceLoc&);\n    template<typename selectorType> TIntermTyped* addSwizzle(TSwizzleSelectors<selectorType>&, const TSourceLoc&);\n\n    // Low level functions to add nodes (no conversions or other higher level transformations)\n    // If a type is provided, the node's type will be set to it.\n    TIntermBinary* addBinaryNode(TOperator op, TIntermTyped* left, TIntermTyped* right, const TSourceLoc&) const;\n    TIntermBinary* addBinaryNode(TOperator op, TIntermTyped* left, TIntermTyped* right, const TSourceLoc&,\n        const TType&) const;\n    TIntermUnary* addUnaryNode(TOperator op, TIntermTyped* child, const TSourceLoc&) const;\n    TIntermUnary* addUnaryNode(TOperator op, TIntermTyped* child, const TSourceLoc&, const TType&) const;\n\n    // Constant folding (in Constant.cpp)\n    TIntermTyped* fold(TIntermAggregate* aggrNode);\n    TIntermTyped* foldConstructor(TIntermAggregate* aggrNode);\n    TIntermTyped* foldDereference(TIntermTyped* node, int index, const TSourceLoc&);\n    TIntermTyped* foldSwizzle(TIntermTyped* node, TSwizzleSelectors<TVectorSelector>& fields, const TSourceLoc&);\n\n    // Tree ops\n    static const TIntermTyped* traverseLValueBase(const TIntermTyped*, bool swizzleOkay, bool bufferReferenceOk = false,\n                                                  std::function<bool(const TIntermNode&)> proc = {});\n\n    // Linkage related\n    void addSymbolLinkageNodes(TIntermAggregate*& linkage, EShLanguage, TSymbolTable&);\n    void addSymbolLinkageNode(TIntermAggregate*& linkage, const TSymbol&);\n    TIntermAggregate* findLinkerObjects() const;\n\n    void setGlobalUniformBlockName(const char* name) { globalUniformBlockName = std::string(name); }\n    const char* getGlobalUniformBlockName() const { return globalUniformBlockName.c_str(); }\n    void setGlobalUniformSet(unsigned int set) { globalUniformBlockSet = set; }\n    unsigned int getGlobalUniformSet() const { return globalUniformBlockSet; }\n    void setGlobalUniformBinding(unsigned int binding) { globalUniformBlockBinding = binding; }\n    unsigned int getGlobalUniformBinding() const { return globalUniformBlockBinding; }\n\n    void setAtomicCounterBlockName(const char* name) { atomicCounterBlockName = std::string(name); }\n    const char* getAtomicCounterBlockName() const { return atomicCounterBlockName.c_str(); }\n    void setAtomicCounterBlockSet(unsigned int set) { atomicCounterBlockSet = set; }\n    unsigned int getAtomicCounterBlockSet() const { return atomicCounterBlockSet; }\n\n\n    void setUseStorageBuffer() { useStorageBuffer = true; }\n    bool usingStorageBuffer() const { return useStorageBuffer; }\n    void setInvariantAll() { invariantAll = true; }\n    bool isInvariantAll() const { return invariantAll; }\n    void setDepthReplacing() { depthReplacing = true; }\n    bool isDepthReplacing() const { return depthReplacing; }\n    void setStencilReplacing() { stencilReplacing = true; }\n    bool isStencilReplacing() const { return stencilReplacing; }\n    bool setLocalSize(int dim, int size)\n    {\n        if (localSizeNotDefault[dim])\n            return size == localSize[dim];\n        localSizeNotDefault[dim] = true;\n        localSize[dim] = size;\n        return true;\n    }\n    unsigned int getLocalSize(int dim) const { return localSize[dim]; }\n    bool isLocalSizeSet() const\n    {\n        // Return true if any component has been set (i.e. any component is not default).\n        return localSizeNotDefault[0] || localSizeNotDefault[1] || localSizeNotDefault[2];\n    }\n    bool setLocalSizeSpecId(int dim, int id)\n    {\n        if (localSizeSpecId[dim] != TQualifier::layoutNotSet)\n            return id == localSizeSpecId[dim];\n        localSizeSpecId[dim] = id;\n        return true;\n    }\n    int getLocalSizeSpecId(int dim) const { return localSizeSpecId[dim]; }\n    bool isLocalSizeSpecialized() const\n    {\n        // Return true if any component has been specialized.\n        return localSizeSpecId[0] != TQualifier::layoutNotSet ||\n               localSizeSpecId[1] != TQualifier::layoutNotSet ||\n               localSizeSpecId[2] != TQualifier::layoutNotSet;\n    }\n    void output(TInfoSink&, bool tree);\n\n    bool isEsProfile() const { return profile == EEsProfile; }\n\n    bool setTileShadingRateQCOM(int dim, int size)\n    {\n        if (tileShadingRateQCOMNotDefault[dim])\n            return size == tileShadingRateQCOM[dim];\n        tileShadingRateQCOMNotDefault[dim] = true;\n        tileShadingRateQCOM[dim] = size;\n        return true;\n    }\n    unsigned int getTileShadingRateQCOM(int dim) const { return tileShadingRateQCOM[dim]; }\n    bool isTileShadingRateQCOMSet() const\n    {\n        // Return true if any component has been set (i.e. any component is not default).\n        return tileShadingRateQCOMNotDefault[0] || tileShadingRateQCOMNotDefault[1] || tileShadingRateQCOMNotDefault[2];\n    }\n\n    void setShiftBinding(TResourceType res, unsigned int shift)\n    {\n        shiftBinding[res] = shift;\n\n        const char* name = getResourceName(res);\n        if (name != nullptr)\n            processes.addIfNonZero(name, shift);\n    }\n\n    unsigned int getShiftBinding(TResourceType res) const { return shiftBinding[res]; }\n\n    void setShiftBindingForSet(TResourceType res, unsigned int shift, unsigned int set)\n    {\n        if (shift == 0) // ignore if there's no shift: it's a no-op.\n            return;\n\n        shiftBindingForSet[res][set] = shift;\n\n        const char* name = getResourceName(res);\n        if (name != nullptr) {\n            processes.addProcess(name);\n            processes.addArgument(shift);\n            processes.addArgument(set);\n        }\n    }\n\n    int getShiftBindingForSet(TResourceType res, unsigned int set) const\n    {\n        const auto shift = shiftBindingForSet[res].find(set);\n        return shift == shiftBindingForSet[res].end() ? -1 : shift->second;\n    }\n    bool hasShiftBindingForSet(TResourceType res) const { return !shiftBindingForSet[res].empty(); }\n\n    void setResourceSetBinding(const std::vector<std::string>& shift)\n    {\n        resourceSetBinding = shift;\n        if (shift.size() > 0) {\n            processes.addProcess(\"resource-set-binding\");\n            for (int s = 0; s < (int)shift.size(); ++s)\n                processes.addArgument(shift[s]);\n        }\n    }\n    const std::vector<std::string>& getResourceSetBinding() const { return resourceSetBinding; }\n    void setAutoMapBindings(bool map)\n    {\n        autoMapBindings = map;\n        if (autoMapBindings)\n            processes.addProcess(\"auto-map-bindings\");\n    }\n    bool getAutoMapBindings() const { return autoMapBindings; }\n    void setAutoMapLocations(bool map)\n    {\n        autoMapLocations = map;\n        if (autoMapLocations)\n            processes.addProcess(\"auto-map-locations\");\n    }\n    bool getAutoMapLocations() const { return autoMapLocations; }\n\n#ifdef ENABLE_HLSL\n    void setFlattenUniformArrays(bool flatten)\n    {\n        flattenUniformArrays = flatten;\n        if (flattenUniformArrays)\n            processes.addProcess(\"flatten-uniform-arrays\");\n    }\n    bool getFlattenUniformArrays() const { return flattenUniformArrays; }\n#endif\n    void setNoStorageFormat(bool b)\n    {\n        useUnknownFormat = b;\n        if (useUnknownFormat)\n            processes.addProcess(\"no-storage-format\");\n    }\n    bool getNoStorageFormat() const { return useUnknownFormat; }\n    void setUseVulkanMemoryModel()\n    {\n        useVulkanMemoryModel = true;\n        processes.addProcess(\"use-vulkan-memory-model\");\n    }\n    bool usingVulkanMemoryModel() const { return useVulkanMemoryModel; }\n    void setUsePhysicalStorageBuffer()\n    {\n        usePhysicalStorageBuffer = true;\n    }\n    bool usingPhysicalStorageBuffer() const { return usePhysicalStorageBuffer; }\n    void setReplicatedComposites()\n    {\n        useReplicatedComposites = true;\n    }\n    bool usingReplicatedComposites() const { return useReplicatedComposites; }\n    void setUseVariablePointers()\n    {\n        useVariablePointers = true;\n        processes.addProcess(\"use-variable-pointers\");\n    }\n    // Set the global flag for bindless texture\n    void setBindlessTextureMode(const TString& currentCaller, AstRefType type)\n    {\n        // When type is not func, currentCaller should be \"\" (empty string)\n        bindlessTextureModeCaller[currentCaller] = type;\n    }\n\n    // Get the global flag for bindless texture\n    bool getBindlessTextureMode() const\n    {\n        return (bindlessTextureModeCaller.size() > 0);\n    }\n\n    // Set the global flag for bindless image\n    void setBindlessImageMode(const TString& currentCaller, AstRefType type)\n    {\n        // When type is not func, currentCaller should be \"\" (empty string)\n        bindlessImageModeCaller[currentCaller] = type;\n    }\n\n    // Get the global flag for bindless image\n    bool getBindlessImageMode() const\n    {\n        return (bindlessImageModeCaller.size() > 0);\n    }\n\n    // Get the global flag for bindless texture\n    bool resetTopLevelUncalledStatus(const TString& deadCaller)\n    {\n        // For reflection collection purpose, currently uniform layout setting and some\n        // flags introduced by variables (IO, global, etc,.) won't be reset here.\n        // Remove each global status (AST top level) introduced by uncalled functions.\n        // If a status is set by several functions, keep those which in call graph.\n        bool result = false;\n\n        // For two types of bindless mode flag, we would only reset which is set by an uncalled function.\n        // If one status flag's key in caller vec is empty, it should be come from a non-function setting.\n        if (!bindlessTextureModeCaller.empty()) {\n            auto caller = bindlessTextureModeCaller.find(deadCaller);\n            if (caller != bindlessTextureModeCaller.end() && bindlessTextureModeCaller[deadCaller] == AstRefTypeFunc) {\n                bindlessTextureModeCaller.erase(caller);\n                result = true;\n            }\n        }\n        if (!bindlessImageModeCaller.empty()) {\n            auto caller = bindlessImageModeCaller.find(deadCaller);\n            if (caller != bindlessImageModeCaller.end() && bindlessImageModeCaller[deadCaller] == AstRefTypeFunc) {\n                bindlessImageModeCaller.erase(caller);\n                result = true;\n            }\n        }\n        return result;\n    }\n\n    bool getBindlessMode() const\n    {\n        return getBindlessTextureMode() || getBindlessImageMode();\n    }\n\n    bool usingVariablePointers() const { return useVariablePointers; }\n\n#ifdef ENABLE_HLSL\n    template<class T> T addCounterBufferName(const T& name) const { return name + implicitCounterName; }\n    bool hasCounterBufferName(const TString& name) const {\n        size_t len = strlen(implicitCounterName);\n        return name.size() > len &&\n               name.compare(name.size() - len, len, implicitCounterName) == 0;\n    }\n#endif\n\n    void setTextureSamplerTransformMode(EShTextureSamplerTransformMode mode) { textureSamplerTransformMode = mode; }\n    int getNumPushConstants() const { return numPushConstants; }\n    void addShaderRecordCount() { ++numShaderRecordBlocks; }\n    void addTaskNVCount() { ++numTaskNVBlocks; }\n    void addTaskPayloadEXTCount() { ++numTaskEXTPayloads; }\n\n    bool setInvocations(int i)\n    {\n        if (invocations != TQualifier::layoutNotSet)\n            return invocations == i;\n        invocations = i;\n        return true;\n    }\n    int getInvocations() const { return invocations; }\n    bool setVertices(int m)\n    {\n        if (vertices != TQualifier::layoutNotSet)\n            return vertices == m;\n        vertices = m;\n        return true;\n    }\n    int getVertices() const { return vertices; }\n    bool setInputPrimitive(TLayoutGeometry p)\n    {\n        if (inputPrimitive != ElgNone)\n            return inputPrimitive == p;\n        inputPrimitive = p;\n        return true;\n    }\n    TLayoutGeometry getInputPrimitive() const { return inputPrimitive; }\n    bool setVertexSpacing(TVertexSpacing s)\n    {\n        if (vertexSpacing != EvsNone)\n            return vertexSpacing == s;\n        vertexSpacing = s;\n        return true;\n    }\n    TVertexSpacing getVertexSpacing() const { return vertexSpacing; }\n    bool setVertexOrder(TVertexOrder o)\n    {\n        if (vertexOrder != EvoNone)\n            return vertexOrder == o;\n        vertexOrder = o;\n        return true;\n    }\n    TVertexOrder getVertexOrder() const { return vertexOrder; }\n    void setPointMode() { pointMode = true; }\n    bool getPointMode() const { return pointMode; }\n\n    bool setInterlockOrdering(TInterlockOrdering o)\n    {\n        if (interlockOrdering != EioNone)\n            return interlockOrdering == o;\n        interlockOrdering = o;\n        return true;\n    }\n    TInterlockOrdering getInterlockOrdering() const { return interlockOrdering; }\n\n    void setXfbMode() { xfbMode = true; }\n    bool getXfbMode() const { return xfbMode; }\n    void setQuadDerivMode(bool mode = true) { quadDerivMode = mode; }\n    bool getQuadDerivMode() const { return quadDerivMode; }\n    void setReqFullQuadsMode(bool mode = true) { reqFullQuadsMode = mode; }\n    bool getReqFullQuadsMode() const { return reqFullQuadsMode; }\n    void setMultiStream() { multiStream = true; }\n    bool isMultiStream() const { return multiStream; }\n    bool setOutputPrimitive(TLayoutGeometry p)\n    {\n        if (outputPrimitive != ElgNone)\n            return outputPrimitive == p;\n        outputPrimitive = p;\n        return true;\n    }\n    TLayoutGeometry getOutputPrimitive() const { return outputPrimitive; }\n    void setNonCoherentColorAttachmentReadEXT() { nonCoherentColorAttachmentReadEXT = true; }\n    bool getNonCoherentColorAttachmentReadEXT() const { return nonCoherentColorAttachmentReadEXT; }\n    void setNonCoherentDepthAttachmentReadEXT() { nonCoherentDepthAttachmentReadEXT = true; }\n    bool getNonCoherentDepthAttachmentReadEXT() const { return nonCoherentDepthAttachmentReadEXT; }\n    void setNonCoherentStencilAttachmentReadEXT() { nonCoherentStencilAttachmentReadEXT = true; }\n    bool getNonCoherentStencilAttachmentReadEXT() const { return nonCoherentStencilAttachmentReadEXT; }\n    void setNonCoherentTileAttachmentReadQCOM() { nonCoherentTileAttachmentReadQCOM = true; }\n    bool getNonCoherentTileAttachmentReadQCOM() const { return nonCoherentTileAttachmentReadQCOM; }\n    void setPostDepthCoverage() { postDepthCoverage = true; }\n    bool getPostDepthCoverage() const { return postDepthCoverage; }\n    void setEarlyFragmentTests() { earlyFragmentTests = true; }\n    void setEarlyAndLateFragmentTestsAMD() { earlyAndLateFragmentTestsAMD = true; }\n    bool getEarlyFragmentTests() const { return earlyFragmentTests; }\n    bool getEarlyAndLateFragmentTestsAMD() const { return earlyAndLateFragmentTestsAMD; }\n    bool setDepth(TLayoutDepth d)\n    {\n        if (depthLayout != EldNone)\n            return depthLayout == d;\n        depthLayout = d;\n        return true;\n    }\n    bool setStencil(TLayoutStencil s)\n    {\n        if (stencilLayout != ElsNone)\n            return stencilLayout == s;\n        stencilLayout = s;\n        return true;\n    }\n    TLayoutDepth getDepth() const { return depthLayout; }\n    TLayoutStencil getStencil() const { return stencilLayout; }\n    void setOriginUpperLeft() { originUpperLeft = true; }\n    bool getOriginUpperLeft() const { return originUpperLeft; }\n    void setPixelCenterInteger() { pixelCenterInteger = true; }\n    bool getPixelCenterInteger() const { return pixelCenterInteger; }\n    void setTexCoordRedeclared() { texCoordBuiltinRedeclared = true; }\n    bool getTexCoordRedeclared() const { return texCoordBuiltinRedeclared; }\n    void addBlendEquation(TBlendEquationShift b) { blendEquations |= (1 << b); }\n    unsigned int getBlendEquations() const { return blendEquations; }\n    bool setXfbBufferStride(int buffer, unsigned stride)\n    {\n        if (xfbBuffers[buffer].stride != TQualifier::layoutXfbStrideEnd)\n            return xfbBuffers[buffer].stride == stride;\n        xfbBuffers[buffer].stride = stride;\n        return true;\n    }\n    unsigned getXfbStride(int buffer) const { return xfbBuffers[buffer].stride; }\n    int addXfbBufferOffset(const TType&);\n    unsigned int computeTypeXfbSize(const TType&, bool& contains64BitType, bool& contains32BitType, bool& contains16BitType) const;\n    unsigned int computeTypeXfbSize(const TType&, bool& contains64BitType) const;\n    void setLayoutOverrideCoverage() { layoutOverrideCoverage = true; }\n    bool getLayoutOverrideCoverage() const { return layoutOverrideCoverage; }\n    void setGeoPassthroughEXT() { geoPassthroughEXT = true; }\n    bool getGeoPassthroughEXT() const { return geoPassthroughEXT; }\n    void setLayoutDerivativeMode(ComputeDerivativeMode mode) { computeDerivativeMode = mode; }\n    bool hasLayoutDerivativeModeNone() const { return computeDerivativeMode != LayoutDerivativeNone; }\n    ComputeDerivativeMode getLayoutDerivativeModeNone() const { return computeDerivativeMode; }\n    void setLayoutPrimitiveCulling() { layoutPrimitiveCulling = true; }\n    bool getLayoutPrimitiveCulling() const { return layoutPrimitiveCulling; }\n    bool setPrimitives(int m)\n    {\n        if (primitives != TQualifier::layoutNotSet)\n            return primitives == m;\n        primitives = m;\n        return true;\n    }\n    int getPrimitives() const { return primitives; }\n    const char* addSemanticName(const TString& name)\n    {\n        return semanticNameSet.insert(name).first->c_str();\n    }\n    void addUniformLocationOverride(const char* nameStr, int location)\n    {\n        std::string name = nameStr;\n        uniformLocationOverrides[name] = location;\n    }\n\n    int getUniformLocationOverride(const char* nameStr) const\n    {\n        std::string name = nameStr;\n        auto pos = uniformLocationOverrides.find(name);\n        if (pos == uniformLocationOverrides.end())\n            return -1;\n        else\n            return pos->second;\n    }\n\n    void setUniformLocationBase(int base) { uniformLocationBase = base; }\n    int getUniformLocationBase() const { return uniformLocationBase; }\n\n    void setNeedsLegalization() { needToLegalize = true; }\n    bool needsLegalization() const { return needToLegalize; }\n\n    void setBinaryDoubleOutput() { binaryDoubleOutput = true; }\n    bool getBinaryDoubleOutput() { return binaryDoubleOutput; }\n\n    void setSubgroupUniformControlFlow() { subgroupUniformControlFlow = true; }\n    bool getSubgroupUniformControlFlow() const { return subgroupUniformControlFlow; }\n\n    void setMaximallyReconverges() { maximallyReconverges = true; }\n    bool getMaximallyReconverges() const { return maximallyReconverges; }\n\n    // GL_EXT_spirv_intrinsics\n    void insertSpirvRequirement(const TSpirvRequirement* spirvReq);\n    bool hasSpirvRequirement() const { return spirvRequirement != nullptr; }\n    const TSpirvRequirement& getSpirvRequirement() const { return *spirvRequirement; }\n    void insertSpirvExecutionMode(int executionMode, const TIntermAggregate* args = nullptr);\n    void insertSpirvExecutionModeId(int executionMode, const TIntermAggregate* args);\n    bool hasSpirvExecutionMode() const { return spirvExecutionMode != nullptr; }\n    const TSpirvExecutionMode& getSpirvExecutionMode() const { return *spirvExecutionMode; }\n\n    void addBlockStorageOverride(const char* nameStr, TBlockStorageClass backing)\n    {\n        std::string name(nameStr);\n        blockBackingOverrides[name] = backing;\n    }\n    TBlockStorageClass getBlockStorageOverride(const char* nameStr) const\n    {\n        std::string name = nameStr;\n        auto pos = blockBackingOverrides.find(name);\n        if (pos == blockBackingOverrides.end())\n            return EbsNone;\n        else\n            return pos->second;\n    }\n#ifdef ENABLE_HLSL\n    void setHlslFunctionality1() { hlslFunctionality1 = true; }\n    bool getHlslFunctionality1() const { return hlslFunctionality1; }\n    void setHlslOffsets()\n    {\n        hlslOffsets = true;\n        if (hlslOffsets)\n            processes.addProcess(\"hlsl-offsets\");\n    }\n    bool usingHlslOffsets() const { return hlslOffsets; }\n    void setHlslIoMapping(bool b)\n    {\n        hlslIoMapping = b;\n        if (hlslIoMapping)\n            processes.addProcess(\"hlsl-iomap\");\n    }\n    bool usingHlslIoMapping() { return hlslIoMapping; }\n#else\n    bool getHlslFunctionality1() const { return false; }\n    bool usingHlslOffsets() const { return false; }\n    bool usingHlslIoMapping() { return false; }\n#endif\n\n    bool usingScalarBlockLayout() const {\n        return IsRequestedExtension(E_GL_EXT_scalar_block_layout);\n    }\n\n    bool usingTextureOffsetNonConst() const {\n        return IsRequestedExtension(E_GL_EXT_texture_offset_non_const);\n    }\n\n    bool IsRequestedExtension(const char* extension) const\n    {\n        return (requestedExtensions.find(extension) != requestedExtensions.end());\n    }\n\n    void addToCallGraph(TInfoSink&, const TString& caller, const TString& callee);\n    void merge(TInfoSink&, TIntermediate&);\n    void finalCheck(TInfoSink&, bool keepUncalled);\n\n    void mergeGlobalUniformBlocks(TInfoSink& infoSink, TIntermediate& unit, bool mergeExistingOnly);\n    void mergeUniformObjects(TInfoSink& infoSink, TIntermediate& unit);\n    void mergeImplicitArraySizes(TInfoSink& infoSink, TIntermediate& unit);\n    void checkStageIO(TInfoSink&, TIntermediate&, EShMessages);\n    void optimizeStageIO(TInfoSink&, TIntermediate&);\n\n    bool buildConvertOp(TBasicType dst, TBasicType src, TOperator& convertOp) const;\n    TIntermTyped* createConversion(TBasicType convertTo, TIntermTyped* node) const;\n\n    void addIoAccessed(const TString& name) { ioAccessed.insert(name); }\n    bool inIoAccessed(const TString& name) const { return ioAccessed.find(name) != ioAccessed.end(); }\n\n    int addUsedLocation(EShMessages, const TQualifier&, const TType&, bool& typeCollision);\n    int checkLocationRange(int set, const TIoRange& range, const TType&, bool& typeCollision);\n    int checkLocationRT(int set, int location);\n    int addUsedOffsets(int binding, int offset, int numOffsets);\n    bool addUsedConstantId(int id);\n    GLSLANG_EXPORT_FOR_TESTS\n    static int computeTypeLocationSize(const TType&, EShLanguage);\n    static int computeTypeUniformLocationSize(const TType&);\n\n    static int getBaseAlignmentScalar(const TType&, int& size);\n    static int getBaseAlignment(const TType&, int& size, int& stride, TLayoutPacking layoutPacking, bool rowMajor);\n    static int getScalarAlignment(const TType&, int& size, int& stride, bool rowMajor);\n    static int getMemberAlignment(const TType&, int& size, int& stride, TLayoutPacking layoutPacking, bool rowMajor);\n    static bool improperStraddle(const TType& type, int size, int offset, bool vectorLike);\n    static void updateOffset(const TType& parentType, const TType& memberType, int& offset, int& memberSize);\n    static int getOffset(const TType& type, int index);\n    static int getBlockSize(const TType& blockType);\n    static int computeBufferReferenceTypeSize(const TType&);\n    static bool isIoResizeArray(const TType& type, EShLanguage language);\n\n    bool promote(TIntermOperator*);\n    void setNanMinMaxClamp(bool setting) { nanMinMaxClamp = setting; }\n    bool getNanMinMaxClamp() const { return nanMinMaxClamp; }\n\n    void setSourceFile(const char* file) { if (file != nullptr) sourceFile = file; }\n    const std::string& getSourceFile() const { return sourceFile; }\n    void addSourceText(const char* text, size_t len) { sourceText.append(text, len); }\n    const std::string& getSourceText() const { return sourceText; }\n    const std::map<std::string, std::string>& getIncludeText() const { return includeText; }\n    void addIncludeText(const char* name, const char* text, size_t len) { includeText[name].assign(text,len); }\n    void addProcesses(const std::vector<std::string>& p)\n    {\n        for (int i = 0; i < (int)p.size(); ++i)\n            processes.addProcess(p[i]);\n    }\n    void addProcess(const std::string& process) { processes.addProcess(process); }\n    void addProcessArgument(const std::string& arg) { processes.addArgument(arg); }\n    const std::vector<std::string>& getProcesses() const { return processes.getProcesses(); }\n    unsigned long long getUniqueId() const { return uniqueId; }\n    void setUniqueId(unsigned long long id) { uniqueId = id; }\n\n    // Certain explicit conversions are allowed conditionally\n    bool getArithemeticInt8Enabled() const {\n        return numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types) ||\n               numericFeatures.contains(TNumericFeatures::nv_gpu_shader5_types) ||\n               numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_int8);\n    }\n    bool getArithemeticInt16Enabled() const {\n        return numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types) ||\n               numericFeatures.contains(TNumericFeatures::gpu_shader_int16) ||\n               numericFeatures.contains(TNumericFeatures::nv_gpu_shader5_types) ||\n               numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_int16);\n    }\n\n    bool getArithemeticFloat16Enabled() const {\n        return numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types) ||\n               numericFeatures.contains(TNumericFeatures::gpu_shader_half_float) ||\n               numericFeatures.contains(TNumericFeatures::nv_gpu_shader5_types) ||\n               numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_float16);\n    }\n    void updateNumericFeature(TNumericFeatures::feature f, bool on)\n        { on ? numericFeatures.insert(f) : numericFeatures.erase(f); }\n\nprotected:\n    TIntermSymbol* addSymbol(long long Id, const TString&, const TString&, const TType&, const TConstUnionArray&, TIntermTyped* subtree, const TSourceLoc&);\n    void error(TInfoSink& infoSink, const TSourceLoc* loc, EShMessages messages, const char*, EShLanguage unitStage = EShLangCount);\n    void error(TInfoSink& infoSink, const char* message, EShLanguage unitStage = EShLangCount) {\n        error(infoSink, nullptr, EShMsgDefault, message, unitStage);\n    }\n    void warn(TInfoSink& infoSink, const TSourceLoc* loc, EShMessages, const char*, EShLanguage unitStage = EShLangCount);\n    void warn(TInfoSink& infoSink, const char* message, EShLanguage unitStage = EShLangCount) {\n        warn(infoSink, nullptr, EShMsgDefault, message, unitStage);\n    }\n    void mergeCallGraphs(TInfoSink&, TIntermediate&);\n    void mergeModes(TInfoSink&, TIntermediate&);\n    void mergeTrees(TInfoSink&, TIntermediate&);\n    void seedIdMap(TIdMaps& idMaps, long long& IdShift);\n    void remapIds(const TIdMaps& idMaps, long long idShift, TIntermediate&);\n    void mergeBodies(TInfoSink&, TIntermSequence& globals, const TIntermSequence& unitGlobals);\n    void mergeLinkerObjects(TInfoSink&, TIntermSequence& linkerObjects, const TIntermSequence& unitLinkerObjects, EShLanguage);\n    void mergeBlockDefinitions(TInfoSink&, TIntermSymbol* block, TIntermSymbol* unitBlock, TIntermediate* unitRoot);\n    void mergeImplicitArraySizes(TType&, const TType&);\n    void mergeErrorCheck(TInfoSink&, const TIntermSymbol&, const TIntermSymbol&);\n    void checkCallGraphCycles(TInfoSink&);\n    void checkCallGraphBodies(TInfoSink&, bool keepUncalled);\n    void inOutLocationCheck(TInfoSink&);\n    void sharedBlockCheck(TInfoSink&);\n    bool userOutputUsed() const;\n    bool isSpecializationOperation(const TIntermOperator&) const;\n    bool isNonuniformPropagating(TOperator) const;\n    bool promoteUnary(TIntermUnary&);\n    bool promoteBinary(TIntermBinary&);\n    void addSymbolLinkageNode(TIntermAggregate*& linkage, TSymbolTable&, const TString&);\n    bool promoteAggregate(TIntermAggregate&);\n    void pushSelector(TIntermSequence&, const TVectorSelector&, const TSourceLoc&);\n    void pushSelector(TIntermSequence&, const TMatrixSelector&, const TSourceLoc&);\n    bool specConstantPropagates(const TIntermTyped&, const TIntermTyped&);\n    void performTextureUpgradeAndSamplerRemovalTransformation(TIntermNode* root);\n    bool isConversionAllowed(TOperator op, TIntermTyped* node) const;\n    std::tuple<TBasicType, TBasicType> getConversionDestinationType(TBasicType type0, TBasicType type1, TOperator op) const;\n\n    static const char* getResourceName(TResourceType);\n\n    const EShLanguage language;  // stage, known at construction time\n    std::string entryPointName;\n    std::string entryPointMangledName;\n    typedef std::list<TCall> TGraph;\n    TGraph callGraph;\n\n    EProfile profile;                           // source profile\n    int version;                                // source version\n    SpvVersion spvVersion;\n    TIntermNode* treeRoot;\n    std::set<std::string> requestedExtensions;  // cumulation of all enabled or required extensions; not connected to what subset of the shader used them\n    MustBeAssigned<TBuiltInResource> resources;\n    int numEntryPoints;\n    int numErrors;\n    int numPushConstants;\n    bool recursive;\n    bool invertY;\n    bool dxPositionW;\n    bool enhancedMsgs;\n    bool debugInfo;\n    bool useStorageBuffer;\n    bool invariantAll;\n    bool nanMinMaxClamp;            // true if desiring min/max/clamp to favor non-NaN over NaN\n    bool depthReplacing;\n    bool stencilReplacing;\n    int localSize[3];\n    bool localSizeNotDefault[3];\n    int localSizeSpecId[3];\n    unsigned long long uniqueId;\n\n    std::string globalUniformBlockName;\n    std::string atomicCounterBlockName;\n    unsigned int globalUniformBlockSet;\n    unsigned int globalUniformBlockBinding;\n    unsigned int atomicCounterBlockSet;\n\npublic:\n    const char* const implicitThisName;\n    const char* const implicitCounterName;\nprotected:\n    EShSource source;            // source language, known a bit later\n    bool useVulkanMemoryModel;\n    int invocations;\n    int vertices;\n    TLayoutGeometry inputPrimitive;\n    TLayoutGeometry outputPrimitive;\n    bool pixelCenterInteger;\n    bool originUpperLeft;\n    bool texCoordBuiltinRedeclared;\n    TVertexSpacing vertexSpacing;\n    TVertexOrder vertexOrder;\n    TInterlockOrdering interlockOrdering;\n    bool pointMode;\n    bool earlyFragmentTests;\n    bool postDepthCoverage;\n    bool earlyAndLateFragmentTestsAMD;\n    bool nonCoherentColorAttachmentReadEXT;\n    bool nonCoherentDepthAttachmentReadEXT;\n    bool nonCoherentStencilAttachmentReadEXT;\n    TLayoutDepth depthLayout;\n    TLayoutStencil stencilLayout;\n    bool hlslFunctionality1;\n    int blendEquations;        // an 'or'ing of masks of shifts of TBlendEquationShift\n    bool xfbMode;\n    std::vector<TXfbBuffer> xfbBuffers;     // all the data we need to track per xfb buffer\n    bool multiStream;\n    bool layoutOverrideCoverage;\n    bool geoPassthroughEXT;\n    int numShaderRecordBlocks;\n    ComputeDerivativeMode computeDerivativeMode;\n    int primitives;\n    int numTaskNVBlocks;\n    bool layoutPrimitiveCulling;\n    int numTaskEXTPayloads;\n\n    bool nonCoherentTileAttachmentReadQCOM;\n    int  tileShadingRateQCOM[3];\n    bool tileShadingRateQCOMNotDefault[3];\n\n    // Base shift values\n    std::array<unsigned int, EResCount> shiftBinding;\n\n    // Per-descriptor-set shift values\n    std::array<std::map<int, int>, EResCount> shiftBindingForSet;\n\n    std::vector<std::string> resourceSetBinding;\n    bool autoMapBindings;\n    bool autoMapLocations;\n    bool flattenUniformArrays;\n    bool useUnknownFormat;\n    bool hlslOffsets;\n    bool hlslIoMapping;\n    bool useVariablePointers;\n\n    std::set<TString> semanticNameSet;\n\n    EShTextureSamplerTransformMode textureSamplerTransformMode;\n\n    bool needToLegalize;\n    bool binaryDoubleOutput;\n    bool subgroupUniformControlFlow;\n    bool maximallyReconverges;\n    bool usePhysicalStorageBuffer;\n    bool useReplicatedComposites { false };\n\n    TSpirvRequirement* spirvRequirement;\n    TSpirvExecutionMode* spirvExecutionMode;\n    std::map<TString, AstRefType> bindlessTextureModeCaller;\n    std::map<TString, AstRefType> bindlessImageModeCaller;\n    std::unordered_map<std::string, int> uniformLocationOverrides;\n    int uniformLocationBase;\n    bool quadDerivMode;\n    bool reqFullQuadsMode;\n    TNumericFeatures numericFeatures;\n    std::unordered_map<std::string, TBlockStorageClass> blockBackingOverrides;\n\n    std::unordered_set<int> usedConstantId; // specialization constant ids used\n    std::vector<TOffsetRange> usedAtomics;  // sets of bindings used by atomic counters\n    std::vector<TIoRange> usedIo[5];        // sets of used locations, one for each of in, out, uniform, and buffers\n    std::vector<TRange> usedIoRT[4];        // sets of used location, one for rayPayload/rayPayloadIN,\n                                            // one for callableData/callableDataIn, one for hitObjectAttributeNV and\n                                            // one for shaderrecordhitobjectNV\n    // set of names of statically read/written I/O that might need extra checking\n    std::set<TString> ioAccessed;\n\n    // source code of shader, useful as part of debug information\n    std::string sourceFile;\n    std::string sourceText;\n\n    // Included text. First string is a name, second is the included text\n    std::map<std::string, std::string> includeText;\n\n    // for OpModuleProcessed, or equivalent\n    TProcesses processes;\n\nprivate:\n    void operator=(TIntermediate&); // prevent assignments\n};\n\n} // end namespace glslang\n\n#endif // _LOCAL_INTERMEDIATE_INCLUDED_\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/parseConst.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n//\n// Traverse a tree of constants to create a single folded constant.\n// It should only be used when the whole tree is known to be constant.\n//\n\n#include \"ParseHelper.h\"\n\nnamespace glslang {\n\nclass TConstTraverser : public TIntermTraverser {\npublic:\n    TConstTraverser(const TConstUnionArray& cUnion, bool singleConstParam, TOperator constructType, const TType& t)\n      : unionArray(cUnion), type(t),\n        constructorType(constructType), singleConstantParam(singleConstParam), error(false), isMatrix(false),\n        matrixCols(0), matrixRows(0) {  index = 0; tOp = EOpNull; }\n\n    virtual void visitConstantUnion(TIntermConstantUnion* node);\n    virtual bool visitAggregate(TVisit, TIntermAggregate* node);\n\n    int index;\n    TConstUnionArray unionArray;\n    TOperator tOp;\n    const TType& type;\n    TOperator constructorType;\n    bool singleConstantParam;\n    bool error;\n    int size; // size of the constructor ( 4 for vec4)\n    bool isMatrix;\n    int matrixCols;\n    int matrixRows;\n\nprotected:\n    TConstTraverser(TConstTraverser&);\n    TConstTraverser& operator=(TConstTraverser&);\n};\n\nbool TConstTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node)\n{\n    if (! node->isConstructor() && node->getOp() != EOpComma) {\n        error = true;\n\n        return false;\n    }\n\n    bool flag = node->getSequence().size() == 1 && node->getSequence()[0]->getAsTyped()->getAsConstantUnion();\n    if (flag) {\n        singleConstantParam = true;\n        constructorType = node->getOp();\n        size = node->getType().computeNumComponents();\n\n        if (node->getType().isMatrix()) {\n            isMatrix = true;\n            matrixCols = node->getType().getMatrixCols();\n            matrixRows = node->getType().getMatrixRows();\n        }\n    }\n\n    for (TIntermSequence::iterator p = node->getSequence().begin();\n                                   p != node->getSequence().end(); p++) {\n\n        if (node->getOp() == EOpComma)\n            index = 0;\n\n        (*p)->traverse(this);\n    }\n    if (flag)\n    {\n        singleConstantParam = false;\n        constructorType = EOpNull;\n        size = 0;\n        isMatrix = false;\n        matrixCols = 0;\n        matrixRows = 0;\n    }\n\n    return false;\n}\n\nvoid TConstTraverser::visitConstantUnion(TIntermConstantUnion* node)\n{\n    TConstUnionArray leftUnionArray(unionArray);\n    int instanceSize = type.computeNumComponents();\n\n    if (index >= instanceSize)\n        return;\n\n    if (! singleConstantParam) {\n        int rightUnionSize = node->getType().computeNumComponents();\n\n        const TConstUnionArray& rightUnionArray = node->getConstArray();\n        for (int i = 0; i < rightUnionSize; i++) {\n            if (index >= instanceSize)\n                return;\n            leftUnionArray[index] = rightUnionArray[i];\n\n            index++;\n        }\n    } else {\n        int endIndex = index + size;\n        const TConstUnionArray& rightUnionArray = node->getConstArray();\n        if (! isMatrix) {\n            int count = 0;\n            int nodeComps = node->getType().computeNumComponents();\n            for (int i = index; i < endIndex; i++) {\n                if (i >= instanceSize)\n                    return;\n\n                leftUnionArray[i] = rightUnionArray[count];\n\n                (index)++;\n\n                if (nodeComps > 1)\n                    count++;\n            }\n        } else {\n            // constructing a matrix, but from what?\n            if (node->isMatrix()) {\n                // Matrix from a matrix; this has the outer matrix, node is the argument matrix.\n                // Traverse the outer, potentially bigger matrix, fill in missing pieces with the\n                // identity matrix.\n                for (int c = 0; c < matrixCols; ++c) {\n                    for (int r = 0; r < matrixRows; ++r) {\n                        int targetOffset = index + c * matrixRows + r;\n                        if (r < node->getType().getMatrixRows() && c < node->getType().getMatrixCols()) {\n                            int srcOffset = c * node->getType().getMatrixRows() + r;\n                            leftUnionArray[targetOffset] = rightUnionArray[srcOffset];\n                        } else if (r == c)\n                            leftUnionArray[targetOffset].setDConst(1.0);\n                        else\n                            leftUnionArray[targetOffset].setDConst(0.0);\n                    }\n                }\n            } else {\n                // matrix from vector or scalar\n                int nodeComps = node->getType().computeNumComponents();\n                if (nodeComps == 1) {\n                    for (int c = 0; c < matrixCols; ++c) {\n                        for (int r = 0; r < matrixRows; ++r) {\n                            if (r == c)\n                                leftUnionArray[index] = rightUnionArray[0];\n                            else\n                                leftUnionArray[index].setDConst(0.0);\n                            index++;\n                        }\n                    }\n                } else {\n                    int count = 0;\n                    for (int i = index; i < endIndex; i++) {\n                        if (i >= instanceSize)\n                            return;\n\n                        // construct the matrix in column-major order, from\n                        // the components provided, in order\n                        leftUnionArray[i] = rightUnionArray[count];\n\n                        index++;\n                        count++;\n                    }\n                }\n            }\n        }\n    }\n}\n\nbool TIntermediate::parseConstTree(TIntermNode* root, TConstUnionArray unionArray, TOperator constructorType, const TType& t, bool singleConstantParam)\n{\n    if (root == nullptr)\n        return false;\n\n    TConstTraverser it(unionArray, singleConstantParam, constructorType, t);\n\n    root->traverse(&it);\n    if (it.error)\n        return true;\n    else\n        return false;\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/parseVersions.h",
    "content": "//\n// Copyright (C) 2015-2018 Google, Inc.\n// Copyright (C) 2017 ARM Limited.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n// This is implemented in Versions.cpp\n\n#ifndef _PARSE_VERSIONS_INCLUDED_\n#define _PARSE_VERSIONS_INCLUDED_\n\n#include \"../Public/ShaderLang.h\"\n#include \"../Include/InfoSink.h\"\n#include \"Scan.h\"\n\n#include <map>\n\nnamespace glslang {\n\n//\n// Base class for parse helpers.\n// This just has version-related information and checking.\n// This class should be sufficient for preprocessing.\n//\nclass TParseVersions {\npublic:\n    TParseVersions(TIntermediate& interm, int version, EProfile profile,\n                   const SpvVersion& spvVersion, EShLanguage language, TInfoSink& infoSink,\n                   bool forwardCompatible, EShMessages messages)\n        :\n        forwardCompatible(forwardCompatible),\n        profile(profile),\n        infoSink(infoSink), version(version), \n        language(language),\n        spvVersion(spvVersion), \n        intermediate(interm), messages(messages), numErrors(0), currentScanner(nullptr) { }\n    virtual ~TParseVersions() { }\n    void requireStage(const TSourceLoc&, EShLanguageMask, const char* featureDesc);\n    void requireStage(const TSourceLoc&, EShLanguage, const char* featureDesc);\n\n    bool forwardCompatible;      // true if errors are to be given for use of deprecated features\n    EProfile profile;            // the declared profile in the shader (core by default)\n    bool isEsProfile() const { return profile == EEsProfile; }\n    void requireProfile(const TSourceLoc& loc, int profileMask, const char* featureDesc);\n    void profileRequires(const TSourceLoc& loc, int profileMask, int minVersion, int numExtensions,\n        const char* const extensions[], const char* featureDesc);\n    void profileRequires(const TSourceLoc& loc, int profileMask, int minVersion, const char* extension,\n        const char* featureDesc);\n    virtual void initializeExtensionBehavior();\n    virtual void checkDeprecated(const TSourceLoc&, int queryProfiles, int depVersion, const char* featureDesc);\n    virtual void requireNotRemoved(const TSourceLoc&, int queryProfiles, int removedVersion, const char* featureDesc);\n    virtual void requireExtensions(const TSourceLoc&, int numExtensions, const char* const extensions[],\n        const char* featureDesc);\n    virtual void ppRequireExtensions(const TSourceLoc&, int numExtensions, const char* const extensions[],\n        const char* featureDesc);\n    template<typename Container>\n    constexpr void ppRequireExtensions(const TSourceLoc& loc, Container extensions, const char* featureDesc) {\n        ppRequireExtensions(loc, static_cast<int>(extensions.size()), extensions.data(), featureDesc);\n    }\n\n    virtual TExtensionBehavior getExtensionBehavior(const char*);\n    virtual bool extensionTurnedOn(const char* const extension);\n    virtual bool extensionsTurnedOn(int numExtensions, const char* const extensions[]);\n    virtual void updateExtensionBehavior(int line, const char* const extension, const char* behavior);\n    virtual void updateExtensionBehavior(const char* const extension, TExtensionBehavior);\n    virtual bool checkExtensionsRequested(const TSourceLoc&, int numExtensions, const char* const extensions[],\n        const char* featureDesc);\n    virtual void checkExtensionStage(const TSourceLoc&, const char* const extension);\n    virtual void extensionRequires(const TSourceLoc&, const char* const extension, const char* behavior);\n    virtual void fullIntegerCheck(const TSourceLoc&, const char* op);\n\n    virtual void unimplemented(const TSourceLoc&, const char* featureDesc);\n    virtual void doubleCheck(const TSourceLoc&, const char* op);\n    virtual void float16Check(const TSourceLoc&, const char* op, bool builtIn = false);\n    virtual void float16ScalarVectorCheck(const TSourceLoc&, const char* op, bool builtIn = false);\n    virtual void bfloat16ScalarVectorCheck(const TSourceLoc&, const char* op, bool builtIn = false);\n    virtual void floate5m2ScalarVectorCheck(const TSourceLoc&, const char* op, bool builtIn = false);\n    virtual void floate4m3ScalarVectorCheck(const TSourceLoc&, const char* op, bool builtIn = false);\n    virtual bool float16Arithmetic();\n    virtual void requireFloat16Arithmetic(const TSourceLoc& loc, const char* op, const char* featureDesc);\n    virtual void int16ScalarVectorCheck(const TSourceLoc&, const char* op, bool builtIn = false);\n    virtual bool int16Arithmetic();\n    virtual void requireInt16Arithmetic(const TSourceLoc& loc, const char* op, const char* featureDesc);\n    virtual void int8ScalarVectorCheck(const TSourceLoc&, const char* op, bool builtIn = false);\n    virtual bool int8Arithmetic();\n    virtual void requireInt8Arithmetic(const TSourceLoc& loc, const char* op, const char* featureDesc);\n    virtual void float16OpaqueCheck(const TSourceLoc&, const char* op, bool builtIn = false);\n    virtual void int64Check(const TSourceLoc&, const char* op, bool builtIn = false);\n    virtual void explicitInt8Check(const TSourceLoc&, const char* op, bool builtIn = false);\n    virtual void explicitInt16Check(const TSourceLoc&, const char* op, bool builtIn = false);\n    virtual void explicitInt32Check(const TSourceLoc&, const char* op, bool builtIn = false);\n    virtual void explicitFloat32Check(const TSourceLoc&, const char* op, bool builtIn = false);\n    virtual void explicitFloat64Check(const TSourceLoc&, const char* op, bool builtIn = false);\n    virtual void fcoopmatCheckNV(const TSourceLoc&, const char* op, bool builtIn = false);\n    virtual void intcoopmatCheckNV(const TSourceLoc&, const char *op, bool builtIn = false);\n    virtual void coopmatCheck(const TSourceLoc&, const char* op, bool builtIn = false);\n    virtual void tensorLayoutViewCheck(const TSourceLoc&, const char* op, bool builtIn = false);\n    virtual void coopvecCheck(const TSourceLoc&, const char* op, bool builtIn = false);\n    virtual void intattachmentCheck(const TSourceLoc&, const char *op, bool builtIn = false);\n    bool relaxedErrors()    const { return (messages & EShMsgRelaxedErrors) != 0; }\n    bool suppressWarnings() const { return (messages & EShMsgSuppressWarnings) != 0; }\n    bool isForwardCompatible() const { return forwardCompatible; }\n\n    virtual void spvRemoved(const TSourceLoc&, const char* op);\n    virtual void vulkanRemoved(const TSourceLoc&, const char* op);\n    virtual void requireVulkan(const TSourceLoc&, const char* op);\n    virtual void requireSpv(const TSourceLoc&, const char* op);\n    virtual void requireSpv(const TSourceLoc&, const char *op, unsigned int version);\n\n    virtual void C_DECL error(const TSourceLoc&, const char* szReason, const char* szToken,\n        const char* szExtraInfoFormat, ...) = 0;\n    virtual void C_DECL  warn(const TSourceLoc&, const char* szReason, const char* szToken,\n        const char* szExtraInfoFormat, ...) = 0;\n    virtual void C_DECL ppError(const TSourceLoc&, const char* szReason, const char* szToken,\n        const char* szExtraInfoFormat, ...) = 0;\n    virtual void C_DECL ppWarn(const TSourceLoc&, const char* szReason, const char* szToken,\n        const char* szExtraInfoFormat, ...) = 0;\n\n    void addError() { ++numErrors; }\n    int getNumErrors() const { return numErrors; }\n\n    void setScanner(TInputScanner* scanner) { currentScanner = scanner; }\n    TInputScanner* getScanner() const { return currentScanner; }\n    const TSourceLoc& getCurrentLoc() const { return currentScanner->getSourceLoc(); }\n    void setCurrentLine(int line) { currentScanner->setLine(line); }\n    void setCurrentColumn(int col) { currentScanner->setColumn(col); }\n    void setCurrentSourceName(const char* name) { currentScanner->setFile(name); }\n    void setCurrentString(int string) { currentScanner->setString(string); }\n\n    void getPreamble(std::string&);\n#ifdef ENABLE_HLSL\n    bool isReadingHLSL()    const { return (messages & EShMsgReadHlsl) == EShMsgReadHlsl; }\n    bool hlslEnable16BitTypes() const { return (messages & EShMsgHlslEnable16BitTypes) != 0; }\n    bool hlslDX9Compatible() const { return (messages & EShMsgHlslDX9Compatible) != 0; }\n#else\n    bool isReadingHLSL()    const { return false; }\n#endif\n\n    TInfoSink& infoSink;\n\n    // compilation mode\n    int version;                 // version, updated by #version in the shader\n    EShLanguage language;        // really the stage\n    SpvVersion spvVersion;\n    TIntermediate& intermediate; // helper for making and hooking up pieces of the parse tree\n\nprotected:\n    TMap<TString, TExtensionBehavior> extensionBehavior;    // for each extension string, what its current behavior is\n    TMap<TString, unsigned int> extensionMinSpv;            // for each extension string, store minimum spirv required\n    TVector<TString> spvUnsupportedExt;                     // for extensions reserved for spv usage.\n    EShMessages messages;        // errors/warnings/rule-sets\n    int numErrors;               // number of compile-time errors encountered\n    TInputScanner* currentScanner;\n\nprivate:\n    explicit TParseVersions(const TParseVersions&);\n    TParseVersions& operator=(const TParseVersions&);\n};\n\n} // end namespace glslang\n\n#endif // _PARSE_VERSIONS_INCLUDED_\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/pch.h",
    "content": "#ifndef _PCH_H\n#define _PCH_H\n//\n// Copyright (C) 2018 The Khronos Group Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n#include <sstream>\n#include <cstdlib>\n#include <cstring>\n#include <cctype>\n#include <climits>\n#include <iostream>\n#include <sstream>\n#include <memory>\n#include \"SymbolTable.h\"\n#include \"ParseHelper.h\"\n#include \"Scan.h\"\n#include \"ScanContext.h\"\n\n#endif /* _PCH_H */\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/preprocessor/Pp.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2013 LunarG, Inc.\n// Copyright (C) 2015-2018 Google, Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n/****************************************************************************\\\nCopyright (c) 2002, NVIDIA Corporation.\n\nNVIDIA Corporation(\"NVIDIA\") supplies this software to you in\nconsideration of your agreement to the following terms, and your use,\ninstallation, modification or redistribution of this NVIDIA software\nconstitutes acceptance of these terms.  If you do not agree with these\nterms, please do not use, install, modify or redistribute this NVIDIA\nsoftware.\n\nIn consideration of your agreement to abide by the following terms, and\nsubject to these terms, NVIDIA grants you a personal, non-exclusive\nlicense, under NVIDIA's copyrights in this original NVIDIA software (the\n\"NVIDIA Software\"), to use, reproduce, modify and redistribute the\nNVIDIA Software, with or without modifications, in source and/or binary\nforms; provided that if you redistribute the NVIDIA Software, you must\nretain the copyright notice of NVIDIA, this notice and the following\ntext and disclaimers in all such redistributions of the NVIDIA Software.\nNeither the name, trademarks, service marks nor logos of NVIDIA\nCorporation may be used to endorse or promote products derived from the\nNVIDIA Software without specific prior written permission from NVIDIA.\nExcept as expressly stated in this notice, no other rights or licenses\nexpress or implied, are granted by NVIDIA herein, including but not\nlimited to any patent rights that may be infringed by your derivative\nworks or by other works in which the NVIDIA Software may be\nincorporated. No hardware is licensed hereunder.\n\nTHE NVIDIA SOFTWARE IS BEING PROVIDED ON AN \"AS IS\" BASIS, WITHOUT\nWARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,\nINCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR\nITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER\nPRODUCTS.\n\nIN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,\nINCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF\nUSE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY\nOUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE\nNVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,\nTORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF\nNVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\\****************************************************************************/\n\n#ifndef _CRT_SECURE_NO_WARNINGS\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n\n#include <sstream>\n#include <cstdlib>\n#include <cstring>\n#include <cctype>\n#include <climits>\n\n#include \"PpContext.h\"\n#include \"PpTokens.h\"\n\nnamespace glslang {\n\n// Handle #define\nint TPpContext::CPPdefine(TPpToken* ppToken)\n{\n    MacroSymbol mac;\n\n    // get the macro name\n    int token = scanToken(ppToken);\n    if (token != PpAtomIdentifier) {\n        parseContext.ppError(ppToken->loc, \"must be followed by macro name\", \"#define\", \"\");\n        return token;\n    }\n    if (ppToken->loc.string >= 0) {\n        // We are in user code; check for reserved name use:\n        parseContext.reservedPpErrorCheck(ppToken->loc, ppToken->name, \"#define\");\n    }\n\n    // save the macro name\n    const int defAtom = atomStrings.getAddAtom(ppToken->name);\n    TSourceLoc defineLoc = ppToken->loc; // because ppToken might go to the next line before we report errors\n\n    // gather parameters to the macro, between (...)\n    token = scanToken(ppToken);\n    if (token == '(' && !ppToken->space) {\n        mac.functionLike = 1;\n        do {\n            token = scanToken(ppToken);\n            if (mac.args.size() == 0 && token == ')')\n                break;\n            if (token != PpAtomIdentifier) {\n                parseContext.ppError(ppToken->loc, \"bad argument\", \"#define\", \"\");\n\n                return token;\n            }\n            const int argAtom = atomStrings.getAddAtom(ppToken->name);\n\n            // check for duplication of parameter name\n            bool duplicate = false;\n            for (size_t a = 0; a < mac.args.size(); ++a) {\n                if (mac.args[a] == argAtom) {\n                    parseContext.ppError(ppToken->loc, \"duplicate macro parameter\", \"#define\", \"\");\n                    duplicate = true;\n                    break;\n                }\n            }\n            if (! duplicate)\n                mac.args.push_back(argAtom);\n            token = scanToken(ppToken);\n        } while (token == ',');\n        if (token != ')') {\n            parseContext.ppError(ppToken->loc, \"missing parenthesis\", \"#define\", \"\");\n\n            return token;\n        }\n\n        token = scanToken(ppToken);\n    } else if (token != '\\n' && token != EndOfInput && !ppToken->space) {\n        parseContext.ppWarn(ppToken->loc, \"missing space after macro name\", \"#define\", \"\");\n\n        return token;\n    }\n\n    // record the definition of the macro\n    while (token != '\\n' && token != EndOfInput) {\n        mac.body.putToken(token, ppToken);\n        token = scanToken(ppToken);\n        if (token != '\\n' && ppToken->space)\n            mac.body.putToken(' ', ppToken);\n    }\n\n    // check for duplicate definition\n    MacroSymbol* existing = lookupMacroDef(defAtom);\n    if (existing != nullptr) {\n        if (! existing->undef) {\n            // Already defined -- need to make sure they are identical:\n            // \"Two replacement lists are identical if and only if the\n            // preprocessing tokens in both have the same number,\n            // ordering, spelling, and white-space separation, where all\n            // white-space separations are considered identical.\"\n            if (existing->functionLike != mac.functionLike) {\n                parseContext.ppError(defineLoc, \"Macro redefined; function-like versus object-like:\", \"#define\",\n                    atomStrings.getString(defAtom));\n            } else if (existing->args.size() != mac.args.size()) {\n                parseContext.ppError(defineLoc, \"Macro redefined; different number of arguments:\", \"#define\",\n                    atomStrings.getString(defAtom));\n            } else {\n                if (existing->args != mac.args) {\n                    parseContext.ppError(defineLoc, \"Macro redefined; different argument names:\", \"#define\",\n                       atomStrings.getString(defAtom));\n                }\n                // set up to compare the two\n                existing->body.reset();\n                mac.body.reset();\n                int newToken;\n                bool firstToken = true;\n                do {\n                    int oldToken;\n                    TPpToken oldPpToken;\n                    TPpToken newPpToken;\n                    oldToken = existing->body.getToken(parseContext, &oldPpToken);\n                    newToken = mac.body.getToken(parseContext, &newPpToken);\n                    // for the first token, preceding spaces don't matter\n                    if (firstToken) {\n                        newPpToken.space = oldPpToken.space;\n                        firstToken = false;\n                    }\n                    if (oldToken != newToken || oldPpToken != newPpToken) {\n                        parseContext.ppError(defineLoc, \"Macro redefined; different substitutions:\", \"#define\",\n                            atomStrings.getString(defAtom));\n                        break;\n                    }\n                } while (newToken != EndOfInput);\n            }\n        }\n        *existing = mac;\n    } else\n        addMacroDef(defAtom, mac);\n\n    return '\\n';\n}\n\n// Handle #undef\nint TPpContext::CPPundef(TPpToken* ppToken)\n{\n    int token = scanToken(ppToken);\n    if (token != PpAtomIdentifier) {\n        parseContext.ppError(ppToken->loc, \"must be followed by macro name\", \"#undef\", \"\");\n\n        return token;\n    }\n\n    parseContext.reservedPpErrorCheck(ppToken->loc, ppToken->name, \"#undef\");\n\n    MacroSymbol* macro = lookupMacroDef(atomStrings.getAtom(ppToken->name));\n    if (macro != nullptr)\n        macro->undef = 1;\n    token = scanToken(ppToken);\n    if (token != '\\n')\n        parseContext.ppError(ppToken->loc, \"can only be followed by a single macro name\", \"#undef\", \"\");\n\n    return token;\n}\n\n// Handle #else\n/* Skip forward to appropriate spot.  This is used both\n** to skip to a #endif after seeing an #else, AND to skip to a #else,\n** #elif, or #endif after a #if/#ifdef/#ifndef/#elif test was false.\n*/\nint TPpContext::CPPelse(int matchelse, TPpToken* ppToken)\n{\n    inElseSkip = true;\n    int depth = 0;\n    int token = scanToken(ppToken);\n\n    while (token != EndOfInput) {\n        if (token != '#') {\n            while (token != '\\n' && token != EndOfInput)\n                token = scanToken(ppToken);\n\n            if (token == EndOfInput)\n                return token;\n\n            token = scanToken(ppToken);\n            continue;\n        }\n\n        if ((token = scanToken(ppToken)) != PpAtomIdentifier)\n            continue;\n\n        int nextAtom = atomStrings.getAtom(ppToken->name);\n        if (nextAtom == PpAtomIf || nextAtom == PpAtomIfdef || nextAtom == PpAtomIfndef) {\n            depth++;\n            if (ifdepth >= maxIfNesting || elsetracker >= maxIfNesting) {\n                parseContext.ppError(ppToken->loc, \"maximum nesting depth exceeded\", \"#if/#ifdef/#ifndef\", \"\");\n                return EndOfInput;\n            } else {\n                ifdepth++;\n                elsetracker++;\n            }\n        } else if (nextAtom == PpAtomEndif) {\n            token = extraTokenCheck(nextAtom, ppToken, scanToken(ppToken));\n            elseSeen[elsetracker] = false;\n            --elsetracker;\n            if (depth == 0) {\n                // found the #endif we are looking for\n                if (ifdepth > 0)\n                    --ifdepth;\n                break;\n            }\n            --depth;\n            --ifdepth;\n        } else if (matchelse && depth == 0) {\n            if (nextAtom == PpAtomElse) {\n                elseSeen[elsetracker] = true;\n                token = extraTokenCheck(nextAtom, ppToken, scanToken(ppToken));\n                // found the #else we are looking for\n                break;\n            } else if (nextAtom == PpAtomElif) {\n                if (elseSeen[elsetracker])\n                    parseContext.ppError(ppToken->loc, \"#elif after #else\", \"#elif\", \"\");\n                /* we decrement ifdepth here, because CPPif will increment\n                * it and we really want to leave it alone */\n                if (ifdepth > 0) {\n                    --ifdepth;\n                    elseSeen[elsetracker] = false;\n                    --elsetracker;\n                }\n                inElseSkip = false;\n                return CPPif(ppToken);\n            }\n        } else if (nextAtom == PpAtomElse) {\n            if (elseSeen[elsetracker])\n                parseContext.ppError(ppToken->loc, \"#else after #else\", \"#else\", \"\");\n            else\n                elseSeen[elsetracker] = true;\n            token = extraTokenCheck(nextAtom, ppToken, scanToken(ppToken));\n        } else if (nextAtom == PpAtomElif) {\n            if (elseSeen[elsetracker])\n                parseContext.ppError(ppToken->loc, \"#elif after #else\", \"#elif\", \"\");\n        }\n    }\n    \n    inElseSkip = false;\n    return token;\n}\n\n// Call when there should be no more tokens left on a line.\nint TPpContext::extraTokenCheck(int contextAtom, TPpToken* ppToken, int token)\n{\n    if (token != '\\n' && token != EndOfInput) {\n        static const char* message = \"unexpected tokens following directive\";\n\n        const char* label;\n        if (contextAtom == PpAtomElse)\n            label = \"#else\";\n        else if (contextAtom == PpAtomElif)\n            label = \"#elif\";\n        else if (contextAtom == PpAtomEndif)\n            label = \"#endif\";\n        else if (contextAtom == PpAtomIf)\n            label = \"#if\";\n        else if (contextAtom == PpAtomLine)\n            label = \"#line\";\n        else\n            label = \"\";\n\n        if (parseContext.relaxedErrors())\n            parseContext.ppWarn(ppToken->loc, message, label, \"\");\n        else\n            parseContext.ppError(ppToken->loc, message, label, \"\");\n\n        while (token != '\\n' && token != EndOfInput)\n            token = scanToken(ppToken);\n    }\n\n    return token;\n}\n\nenum eval_prec {\n    MIN_PRECEDENCE,\n    COND, LOGOR, LOGAND, OR, XOR, AND, EQUAL, RELATION, SHIFT, ADD, MUL, UNARY,\n    MAX_PRECEDENCE\n};\n\nnamespace {\n\n    int op_logor(int a, int b) { return a || b; }\n    int op_logand(int a, int b) { return a && b; }\n    int op_or(int a, int b) { return a | b; }\n    int op_xor(int a, int b) { return a ^ b; }\n    int op_and(int a, int b) { return a & b; }\n    int op_eq(int a, int b) { return a == b; }\n    int op_ne(int a, int b) { return a != b; }\n    int op_ge(int a, int b) { return a >= b; }\n    int op_le(int a, int b) { return a <= b; }\n    int op_gt(int a, int b) { return a > b; }\n    int op_lt(int a, int b) { return a < b; }\n    int op_shl(int a, int b) { return a << b; }\n    int op_shr(int a, int b) { return a >> b; }\n    int op_add(int a, int b) { return a + b; }\n    int op_sub(int a, int b) { return a - b; }\n    int op_mul(int a, int b) { return a * b; }\n    int op_div(int a, int b) { return a == INT_MIN && b == -1 ? 0 : a / b; }\n    int op_mod(int a, int b) { return a == INT_MIN && b == -1 ? 0 : a % b; }\n    int op_pos(int a) { return a; }\n    int op_neg(int a) { return a == INT_MIN ? INT_MIN : -a; }\n    int op_cmpl(int a) { return ~a; }\n    int op_not(int a) { return !a; }\n\nstruct TBinop {\n    int token, precedence, (*op)(int, int);\n} binop[] = {\n    { PpAtomOr, LOGOR, op_logor },\n    { PpAtomAnd, LOGAND, op_logand },\n    { '|', OR, op_or },\n    { '^', XOR, op_xor },\n    { '&', AND, op_and },\n    { PpAtomEQ, EQUAL, op_eq },\n    { PpAtomNE, EQUAL, op_ne },\n    { '>', RELATION, op_gt },\n    { PpAtomGE, RELATION, op_ge },\n    { '<', RELATION, op_lt },\n    { PpAtomLE, RELATION, op_le },\n    { PpAtomLeft, SHIFT, op_shl },\n    { PpAtomRight, SHIFT, op_shr },\n    { '+', ADD, op_add },\n    { '-', ADD, op_sub },\n    { '*', MUL, op_mul },\n    { '/', MUL, op_div },\n    { '%', MUL, op_mod },\n};\n\nstruct TUnop {\n    int token, (*op)(int);\n} unop[] = {\n    { '+', op_pos },\n    { '-', op_neg },\n    { '~', op_cmpl },\n    { '!', op_not },\n};\n\n} // anonymous namespace\n\n#define NUM_ELEMENTS(A) (sizeof(A) / sizeof(A[0]))\n\nint TPpContext::eval(int token, int precedence, bool shortCircuit, int& res, bool& err, TPpToken* ppToken)\n{\n    TSourceLoc loc = ppToken->loc;  // because we sometimes read the newline before reporting the error\n    if (token == PpAtomIdentifier) {\n        if (strcmp(\"defined\", ppToken->name) == 0) {\n            if (! parseContext.isReadingHLSL() && isMacroInput()) {\n                if (parseContext.relaxedErrors())\n                    parseContext.ppWarn(ppToken->loc, \"nonportable when expanded from macros for preprocessor expression\",\n                        \"defined\", \"\");\n                else\n                    parseContext.ppError(ppToken->loc, \"cannot use in preprocessor expression when expanded from macros\",\n                        \"defined\", \"\");\n            }\n            bool needclose = 0;\n            token = scanToken(ppToken);\n            if (token == '(') {\n                needclose = true;\n                token = scanToken(ppToken);\n            }\n            if (token != PpAtomIdentifier) {\n                parseContext.ppError(loc, \"incorrect directive, expected identifier\", \"preprocessor evaluation\", \"\");\n                err = true;\n                res = 0;\n\n                return token;\n            }\n\n            MacroSymbol* macro = lookupMacroDef(atomStrings.getAtom(ppToken->name));\n            res = macro != nullptr ? !macro->undef : 0;\n            token = scanToken(ppToken);\n            if (needclose) {\n                if (token != ')') {\n                    parseContext.ppError(loc, \"expected ')'\", \"preprocessor evaluation\", \"\");\n                    err = true;\n                    res = 0;\n\n                    return token;\n                }\n                token = scanToken(ppToken);\n            }\n        } else {\n            token = tokenPaste(token, *ppToken);\n            token = evalToToken(token, shortCircuit, res, err, ppToken);\n            return eval(token, precedence, shortCircuit, res, err, ppToken);\n        }\n    } else if (token == PpAtomConstInt) {\n        res = ppToken->ival;\n        token = scanToken(ppToken);\n    } else if (token == '(') {\n        token = scanToken(ppToken);\n        token = eval(token, MIN_PRECEDENCE, shortCircuit, res, err, ppToken);\n        if (! err) {\n            if (token != ')') {\n                parseContext.ppError(loc, \"expected ')'\", \"preprocessor evaluation\", \"\");\n                err = true;\n                res = 0;\n\n                return token;\n            }\n            token = scanToken(ppToken);\n        }\n    } else {\n        int op = NUM_ELEMENTS(unop) - 1;\n        for (; op >= 0; op--) {\n            if (unop[op].token == token)\n                break;\n        }\n        if (op >= 0) {\n            token = scanToken(ppToken);\n            token = eval(token, UNARY, shortCircuit, res, err, ppToken);\n            res = unop[op].op(res);\n        } else {\n            parseContext.ppError(loc, \"bad expression\", \"preprocessor evaluation\", \"\");\n            err = true;\n            res = 0;\n\n            return token;\n        }\n    }\n\n    token = evalToToken(token, shortCircuit, res, err, ppToken);\n\n    // Perform evaluation of binary operation, if there is one, otherwise we are done.\n    while (! err) {\n        if (token == ')' || token == '\\n')\n            break;\n        int op;\n        for (op = NUM_ELEMENTS(binop) - 1; op >= 0; op--) {\n            if (binop[op].token == token)\n                break;\n        }\n        if (op < 0 || binop[op].precedence <= precedence)\n            break;\n        int leftSide = res;\n\n        // Setup short-circuiting, needed for ES, unless already in a short circuit.\n        // (Once in a short-circuit, can't turn off again, until that whole subexpression is done.\n        if (! shortCircuit) {\n            if ((token == PpAtomOr  && leftSide == 1) ||\n                (token == PpAtomAnd && leftSide == 0))\n                shortCircuit = true;\n        }\n\n        token = scanToken(ppToken);\n        token = eval(token, binop[op].precedence, shortCircuit, res, err, ppToken);\n\n        if (binop[op].op == op_div || binop[op].op == op_mod) {\n            if (res == 0) {\n                parseContext.ppError(loc, \"division by 0\", \"preprocessor evaluation\", \"\");\n                res = 1;\n            }\n        }\n        res = binop[op].op(leftSide, res);\n    }\n\n    return token;\n}\n\n// Expand macros, skipping empty expansions, to get to the first real token in those expansions.\nint TPpContext::evalToToken(int token, bool shortCircuit, int& res, bool& err, TPpToken* ppToken)\n{\n    while (token == PpAtomIdentifier && strcmp(\"defined\", ppToken->name) != 0) {\n        switch (MacroExpand(ppToken, true, false)) {\n        case MacroExpandNotStarted:\n        case MacroExpandError:\n            parseContext.ppError(ppToken->loc, \"can't evaluate expression\", \"preprocessor evaluation\", \"\");\n            err = true;\n            res = 0;\n            break;\n        case MacroExpandStarted:\n            break;\n        case MacroExpandUndef:\n            if (! shortCircuit && parseContext.isEsProfile()) {\n                const char* message = \"undefined macro in expression not allowed in es profile\";\n                if (parseContext.relaxedErrors())\n                    parseContext.ppWarn(ppToken->loc, message, \"preprocessor evaluation\", ppToken->name);\n                else\n                    parseContext.ppError(ppToken->loc, message, \"preprocessor evaluation\", ppToken->name);\n            }\n            break;\n        }\n        token = scanToken(ppToken);\n        if (err)\n            break;\n    }\n\n    return token;\n}\n\n// Handle #if\nint TPpContext::CPPif(TPpToken* ppToken)\n{\n    int token = scanToken(ppToken);\n    if (ifdepth >= maxIfNesting || elsetracker >= maxIfNesting) {\n        parseContext.ppError(ppToken->loc, \"maximum nesting depth exceeded\", \"#if\", \"\");\n        return EndOfInput;\n    } else {\n        elsetracker++;\n        ifdepth++;\n    }\n    int res = 0;\n    bool err = false;\n    token = eval(token, MIN_PRECEDENCE, false, res, err, ppToken);\n    token = extraTokenCheck(PpAtomIf, ppToken, token);\n    if (!res && !err)\n        token = CPPelse(1, ppToken);\n\n    return token;\n}\n\n// Handle #ifdef\nint TPpContext::CPPifdef(int defined, TPpToken* ppToken)\n{\n    int token = scanToken(ppToken);\n    if (ifdepth > maxIfNesting || elsetracker > maxIfNesting) {\n        parseContext.ppError(ppToken->loc, \"maximum nesting depth exceeded\", \"#ifdef\", \"\");\n        return EndOfInput;\n    } else {\n        elsetracker++;\n        ifdepth++;\n    }\n\n    if (token != PpAtomIdentifier) {\n        if (defined)\n            parseContext.ppError(ppToken->loc, \"must be followed by macro name\", \"#ifdef\", \"\");\n        else\n            parseContext.ppError(ppToken->loc, \"must be followed by macro name\", \"#ifndef\", \"\");\n    } else {\n        MacroSymbol* macro = lookupMacroDef(atomStrings.getAtom(ppToken->name));\n        token = scanToken(ppToken);\n        if (token != '\\n') {\n            parseContext.ppError(ppToken->loc, \"unexpected tokens following #ifdef directive - expected a newline\", \"#ifdef\", \"\");\n            while (token != '\\n' && token != EndOfInput)\n                token = scanToken(ppToken);\n        }\n        if (((macro != nullptr && !macro->undef) ? 1 : 0) != defined)\n            token = CPPelse(1, ppToken);\n    }\n\n    return token;\n}\n\n// Handle #include ...\n// TODO: Handle macro expansions for the header name\nint TPpContext::CPPinclude(TPpToken* ppToken)\n{\n    const TSourceLoc directiveLoc = ppToken->loc;\n    bool startWithLocalSearch = true; // to additionally include the extra \"\" paths\n    int token;\n\n    // Find the first non-whitespace char after #include\n    int ch = getChar();\n    while (ch == ' ' || ch == '\\t') {\n        ch = getChar();\n    }\n    if (ch == '<') {\n        // <header-name> style\n        startWithLocalSearch = false;\n        token = scanHeaderName(ppToken, '>');\n    } else if (ch == '\"') {\n        // \"header-name\" style\n        token = scanHeaderName(ppToken, '\"');\n    } else {\n        // unexpected, get the full token to generate the error\n        ungetChar();\n        token = scanToken(ppToken);\n    }\n\n    if (token != PpAtomConstString) {\n        parseContext.ppError(directiveLoc, \"must be followed by a header name\", \"#include\", \"\");\n        return token;\n    }\n\n    // Make a copy of the name because it will be overwritten by the next token scan.\n    const std::string filename = ppToken->name;\n\n    // See if the directive was well formed\n    token = scanToken(ppToken);\n    if (token != '\\n') {\n        if (token == EndOfInput)\n            parseContext.ppError(ppToken->loc, \"expected newline after header name:\", \"#include\", \"%s\", filename.c_str());\n        else\n            parseContext.ppError(ppToken->loc, \"extra content after header name:\", \"#include\", \"%s\", filename.c_str());\n        return token;\n    }\n\n    // Process well-formed directive\n\n    // Find the inclusion, first look in \"Local\" (\"\") paths, if requested,\n    // otherwise, only search the \"System\" (<>) paths.\n    TShader::Includer::IncludeResult* res = nullptr;\n    if (startWithLocalSearch)\n        res = includer.includeLocal(filename.c_str(), currentSourceFile.c_str(), includeStack.size() + 1);\n    if (res == nullptr || res->headerName.empty()) {\n        includer.releaseInclude(res);\n        res = includer.includeSystem(filename.c_str(), currentSourceFile.c_str(), includeStack.size() + 1);\n    }\n\n    // Process the results\n    if (res != nullptr && !res->headerName.empty()) {\n        if (res->headerData != nullptr && res->headerLength > 0) {\n            // path for processing one or more tokens from an included header, hand off 'res'\n            const bool forNextLine = parseContext.lineDirectiveShouldSetNextLine();\n            std::ostringstream prologue;\n            std::ostringstream epilogue;\n            prologue << \"#line \" << forNextLine << \" \" << \"\\\"\" << res->headerName << \"\\\"\\n\";\n            epilogue << (res->headerData[res->headerLength - 1] == '\\n'? \"\" : \"\\n\") <<\n                \"#line \" << directiveLoc.line + forNextLine << \" \" << directiveLoc.getStringNameOrNum() << \"\\n\";\n            pushInput(new TokenizableIncludeFile(directiveLoc, prologue.str(), res, epilogue.str(), this));\n            parseContext.intermediate.addIncludeText(res->headerName.c_str(), res->headerData, res->headerLength);\n            // There's no \"current\" location anymore.\n            parseContext.setCurrentColumn(0);\n        } else {\n            // things are okay, but there is nothing to process\n            includer.releaseInclude(res);\n        }\n    } else {\n        // error path, clean up\n        std::string message =\n            res != nullptr ? std::string(res->headerData, res->headerLength)\n                           : std::string(\"Could not process include directive\");\n        parseContext.ppError(directiveLoc, message.c_str(), \"#include\", \"for header name: %s\", filename.c_str());\n        includer.releaseInclude(res);\n    }\n\n    return token;\n}\n\n// Handle #line\nint TPpContext::CPPline(TPpToken* ppToken)\n{\n    // \"#line must have, after macro substitution, one of the following forms:\n    // \"#line line\n    // \"#line line source-string-number\"\n\n    int token = scanToken(ppToken);\n    const TSourceLoc directiveLoc = ppToken->loc;\n    if (token == '\\n') {\n        parseContext.ppError(ppToken->loc, \"must by followed by an integral literal\", \"#line\", \"\");\n        return token;\n    }\n\n    int lineRes = 0; // Line number after macro expansion.\n    int lineToken = 0;\n    bool hasFile = false;\n    int fileRes = 0; // Source file number after macro expansion.\n    const char* sourceName = nullptr; // Optional source file name.\n    bool lineErr = false;\n    bool fileErr = false;\n    disableEscapeSequences = true;\n    token = eval(token, MIN_PRECEDENCE, false, lineRes, lineErr, ppToken);\n    disableEscapeSequences = false;\n    if (! lineErr) {\n        lineToken = lineRes;\n        if (token == '\\n')\n            ++lineRes;\n\n        if (parseContext.lineDirectiveShouldSetNextLine())\n            --lineRes;\n        parseContext.setCurrentLine(lineRes);\n\n        if (token != '\\n') {\n            if (token == PpAtomConstString) {\n                parseContext.ppRequireExtensions(directiveLoc, 1, &E_GL_GOOGLE_cpp_style_line_directive, \"filename-based #line\");\n                // We need to save a copy of the string instead of pointing\n                // to the name field of the token since the name field\n                // will likely be overwritten by the next token scan.\n                sourceName = atomStrings.getString(atomStrings.getAddAtom(ppToken->name));\n                parseContext.setCurrentSourceName(sourceName);\n                hasFile = true;\n                token = scanToken(ppToken);\n            } else {\n                token = eval(token, MIN_PRECEDENCE, false, fileRes, fileErr, ppToken);\n                if (! fileErr) {\n                    parseContext.setCurrentString(fileRes);\n                    hasFile = true;\n                }\n            }\n        }\n    }\n    if (!fileErr && !lineErr) {\n        parseContext.notifyLineDirective(directiveLoc.line, lineToken, hasFile, fileRes, sourceName);\n    }\n    token = extraTokenCheck(PpAtomLine, ppToken, token);\n\n    return token;\n}\n\n// Handle #error\nint TPpContext::CPPerror(TPpToken* ppToken)\n{\n    disableEscapeSequences = true;\n    int token = scanToken(ppToken);\n    disableEscapeSequences = false;\n    std::string message;\n    TSourceLoc loc = ppToken->loc;\n\n    while (token != '\\n' && token != EndOfInput) {\n        if (token == PpAtomConstInt16 || token == PpAtomConstUint16 ||\n            token == PpAtomConstInt   || token == PpAtomConstUint   ||\n            token == PpAtomConstInt64 || token == PpAtomConstUint64 ||\n            token == PpAtomConstFloat16 ||\n            token == PpAtomConstFloat || token == PpAtomConstDouble) {\n                message.append(ppToken->name);\n        } else if (token == PpAtomIdentifier || token == PpAtomConstString) {\n            message.append(ppToken->name);\n        } else {\n            message.append(atomStrings.getString(token));\n        }\n        message.append(\" \");\n        token = scanToken(ppToken);\n    }\n    parseContext.notifyErrorDirective(loc.line, message.c_str());\n    // store this msg into the shader's information log..set the Compile Error flag!!!!\n    parseContext.ppError(loc, message.c_str(), \"#error\", \"\");\n\n    return '\\n';\n}\n\n// Handle #pragma\nint TPpContext::CPPpragma(TPpToken* ppToken)\n{\n    char SrcStrName[2];\n    TVector<TString> tokens;\n\n    TSourceLoc loc = ppToken->loc;  // because we go to the next line before processing\n    int token = scanToken(ppToken);\n    while (token != '\\n' && token != EndOfInput) {\n        switch (token) {\n        case PpAtomIdentifier:\n        case PpAtomConstInt:\n        case PpAtomConstUint:\n        case PpAtomConstInt64:\n        case PpAtomConstUint64:\n        case PpAtomConstInt16:\n        case PpAtomConstUint16:\n        case PpAtomConstFloat:\n        case PpAtomConstDouble:\n        case PpAtomConstFloat16:\n            tokens.push_back(ppToken->name);\n            break;\n        default:\n            SrcStrName[0] = (char)token;\n            SrcStrName[1] = '\\0';\n            tokens.push_back(SrcStrName);\n        }\n        token = scanToken(ppToken);\n    }\n\n    if (token == EndOfInput)\n        parseContext.ppError(loc, \"directive must end with a newline\", \"#pragma\", \"\");\n    else\n        parseContext.handlePragma(loc, tokens);\n\n    return token;\n}\n\n// #version: This is just for error checking: the version and profile are decided before preprocessing starts\nint TPpContext::CPPversion(TPpToken* ppToken)\n{\n    int token = scanToken(ppToken);\n\n    if (errorOnVersion || versionSeen) {\n        if (parseContext.isReadingHLSL())\n            parseContext.ppError(ppToken->loc, \"invalid preprocessor command\", \"#version\", \"\");\n        else\n            parseContext.ppError(ppToken->loc, \"must occur first in shader\", \"#version\", \"\");\n    }\n    versionSeen = true;\n\n    if (token == '\\n') {\n        parseContext.ppError(ppToken->loc, \"must be followed by version number\", \"#version\", \"\");\n\n        return token;\n    }\n\n    if (token != PpAtomConstInt)\n        parseContext.ppError(ppToken->loc, \"must be followed by version number\", \"#version\", \"\");\n\n    ppToken->ival = atoi(ppToken->name);\n    int versionNumber = ppToken->ival;\n    int line = ppToken->loc.line;\n    token = scanToken(ppToken);\n\n    if (token == '\\n') {\n        parseContext.notifyVersion(line, versionNumber, nullptr);\n        return token;\n    } else {\n        int profileAtom = atomStrings.getAtom(ppToken->name);\n        if (profileAtom != PpAtomCore &&\n            profileAtom != PpAtomCompatibility &&\n            profileAtom != PpAtomEs)\n            parseContext.ppError(ppToken->loc, \"bad profile name; use es, core, or compatibility\", \"#version\", \"\");\n        parseContext.notifyVersion(line, versionNumber, ppToken->name);\n        token = scanToken(ppToken);\n\n        if (token == '\\n')\n            return token;\n        else\n            parseContext.ppError(ppToken->loc, \"bad tokens following profile -- expected newline\", \"#version\", \"\");\n    }\n\n    return token;\n}\n\n// Handle #extension\nint TPpContext::CPPextension(TPpToken* ppToken)\n{\n    int line = ppToken->loc.line;\n    int token = scanToken(ppToken);\n    char extensionName[MaxTokenLength + 1];\n\n    if (token=='\\n') {\n        parseContext.ppError(ppToken->loc, \"extension name not specified\", \"#extension\", \"\");\n        return token;\n    }\n\n    if (token != PpAtomIdentifier)\n        parseContext.ppError(ppToken->loc, \"extension name expected\", \"#extension\", \"\");\n\n    snprintf(extensionName, sizeof(extensionName), \"%s\", ppToken->name);\n\n    token = scanToken(ppToken);\n    if (token != ':') {\n        parseContext.ppError(ppToken->loc, \"':' missing after extension name\", \"#extension\", \"\");\n        return token;\n    }\n\n    token = scanToken(ppToken);\n    if (token != PpAtomIdentifier) {\n        parseContext.ppError(ppToken->loc, \"behavior for extension not specified\", \"#extension\", \"\");\n        return token;\n    }\n\n    parseContext.updateExtensionBehavior(line, extensionName, ppToken->name);\n    parseContext.notifyExtensionDirective(line, extensionName, ppToken->name);\n\n    token = scanToken(ppToken);\n    if (token == '\\n')\n        return token;\n    else\n        parseContext.ppError(ppToken->loc,  \"extra tokens -- expected newline\", \"#extension\",\"\");\n\n    return token;\n}\n\nint TPpContext::readCPPline(TPpToken* ppToken)\n{\n    int token = scanToken(ppToken);\n\n    if (token == PpAtomIdentifier) {\n        switch (atomStrings.getAtom(ppToken->name)) {\n        case PpAtomDefine:\n            token = CPPdefine(ppToken);\n            break;\n        case PpAtomElse:\n            if (elseSeen[elsetracker])\n                parseContext.ppError(ppToken->loc, \"#else after #else\", \"#else\", \"\");\n            elseSeen[elsetracker] = true;\n            if (ifdepth == 0)\n                parseContext.ppError(ppToken->loc, \"mismatched statements\", \"#else\", \"\");\n            token = extraTokenCheck(PpAtomElse, ppToken, scanToken(ppToken));\n            token = CPPelse(0, ppToken);\n            break;\n        case PpAtomElif:\n            if (ifdepth == 0)\n                parseContext.ppError(ppToken->loc, \"mismatched statements\", \"#elif\", \"\");\n            if (elseSeen[elsetracker])\n                parseContext.ppError(ppToken->loc, \"#elif after #else\", \"#elif\", \"\");\n            // this token is really a dont care, but we still need to eat the tokens\n            token = scanToken(ppToken);\n            while (token != '\\n' && token != EndOfInput)\n                token = scanToken(ppToken);\n            token = CPPelse(0, ppToken);\n            break;\n        case PpAtomEndif:\n            if (ifdepth == 0)\n                parseContext.ppError(ppToken->loc, \"mismatched statements\", \"#endif\", \"\");\n            else {\n                elseSeen[elsetracker] = false;\n                --elsetracker;\n                --ifdepth;\n            }\n            token = extraTokenCheck(PpAtomEndif, ppToken, scanToken(ppToken));\n            break;\n        case PpAtomIf:\n            token = CPPif(ppToken);\n            break;\n        case PpAtomIfdef:\n            token = CPPifdef(1, ppToken);\n            break;\n        case PpAtomIfndef:\n            token = CPPifdef(0, ppToken);\n            break;\n        case PpAtomLine:\n            token = CPPline(ppToken);\n            break;\n        case PpAtomInclude:\n            if(!parseContext.isReadingHLSL()) {\n                const std::array exts = { E_GL_GOOGLE_include_directive, E_GL_ARB_shading_language_include };\n                parseContext.ppRequireExtensions(ppToken->loc, exts, \"#include\");\n            }\n            token = CPPinclude(ppToken);\n            break;\n        case PpAtomPragma:\n            token = CPPpragma(ppToken);\n            break;\n        case PpAtomUndef:\n            token = CPPundef(ppToken);\n            break;\n        case PpAtomError:\n            token = CPPerror(ppToken);\n            break;\n        case PpAtomVersion:\n            token = CPPversion(ppToken);\n            break;\n        case PpAtomExtension:\n            token = CPPextension(ppToken);\n            break;\n        default:\n            parseContext.ppError(ppToken->loc, \"invalid directive:\", \"#\", ppToken->name);\n            break;\n        }\n    } else if (token != '\\n' && token != EndOfInput)\n        parseContext.ppError(ppToken->loc, \"invalid directive\", \"#\", \"\");\n\n    while (token != '\\n' && token != EndOfInput)\n        token = scanToken(ppToken);\n\n    return token;\n}\n\n// Context-dependent parsing of a #include <header-name>.\n// Assumes no macro expansions etc. are being done; the name is just on the current input.\n// Always creates a name and returns PpAtomicConstString, unless we run out of input.\nint TPpContext::scanHeaderName(TPpToken* ppToken, char delimit)\n{\n    bool tooLong = false;\n\n    if (inputStack.empty())\n        return EndOfInput;\n\n    int len = 0;\n    ppToken->name[0] = '\\0';\n    do {\n        int ch = inputStack.back()->getch();\n\n        // done yet?\n        if (ch == delimit) {\n            ppToken->name[len] = '\\0';\n            if (tooLong)\n                parseContext.ppError(ppToken->loc, \"header name too long\", \"\", \"\");\n            return PpAtomConstString;\n        } else if (ch == EndOfInput)\n            return EndOfInput;\n\n        // found a character to expand the name with\n        if (len < MaxTokenLength)\n            ppToken->name[len++] = (char)ch;\n        else\n            tooLong = true;\n    } while (true);\n}\n\n// Macro-expand a macro argument 'arg' to create 'expandedArg'.\n// Does not replace 'arg'.\n// Returns nullptr if no expanded argument is created.\nTPpContext::TokenStream* TPpContext::PrescanMacroArg(TokenStream& arg, TPpToken* ppToken, bool newLineOkay)\n{\n    // expand the argument\n    TokenStream* expandedArg = new TokenStream;\n    pushInput(new tMarkerInput(this));\n    pushTokenStreamInput(arg);\n    int token;\n    while ((token = scanToken(ppToken)) != tMarkerInput::marker && token != EndOfInput) {\n        token = tokenPaste(token, *ppToken);\n        if (token == PpAtomIdentifier) {\n            switch (MacroExpand(ppToken, false, newLineOkay)) {\n            case MacroExpandNotStarted:\n                break;\n            case MacroExpandError:\n                // toss the rest of the pushed-input argument by scanning until tMarkerInput\n                while ((token = scanToken(ppToken)) != tMarkerInput::marker && token != EndOfInput)\n                    ;\n                break;\n            case MacroExpandStarted:\n            case MacroExpandUndef:\n                continue;\n            }\n        }\n        if (token == tMarkerInput::marker || token == EndOfInput)\n            break;\n        expandedArg->putToken(token, ppToken);\n    }\n\n    if (token != tMarkerInput::marker) {\n        // Error, or MacroExpand ate the marker, so had bad input, recover\n        delete expandedArg;\n        expandedArg = nullptr;\n    }\n\n    return expandedArg;\n}\n\n//\n// Return the next token for a macro expansion, handling macro arguments,\n// whose semantics are dependent on being adjacent to ##.\n//\nint TPpContext::tMacroInput::scan(TPpToken* ppToken)\n{\n    int token;\n    do {\n        token = mac->body.getToken(pp->parseContext, ppToken);\n    } while (token == ' ');  // handle white space in macro\n\n    // Hash operators basically turn off a round of macro substitution\n    // (the round done on the argument before the round done on the RHS of the\n    // macro definition):\n    //\n    // \"A parameter in the replacement list, unless preceded by a # or ##\n    // preprocessing token or followed by a ## preprocessing token (see below),\n    // is replaced by the corresponding argument after all macros contained\n    // therein have been expanded.\"\n    //\n    // \"If, in the replacement list, a parameter is immediately preceded or\n    // followed by a ## preprocessing token, the parameter is replaced by the\n    // corresponding argument's preprocessing token sequence.\"\n\n    bool pasting = false;\n    if (postpaste) {\n        // don't expand next token\n        pasting = true;\n        postpaste = false;\n    }\n\n    if (prepaste) {\n        // already know we should be on a ##, verify\n        assert(token == PpAtomPaste);\n        prepaste = false;\n        postpaste = true;\n    }\n\n    // see if are preceding a ##\n    if (mac->body.peekUntokenizedPasting()) {\n        prepaste = true;\n        pasting = true;\n    }\n\n\n    // TODO: preprocessor:  properly handle whitespace (or lack of it) between tokens when expanding\n    if (token == PpAtomIdentifier) {\n        int i;\n        for (i = (int)mac->args.size() - 1; i >= 0; i--)\n            if (strcmp(pp->atomStrings.getString(mac->args[i]), ppToken->name) == 0)\n                break;\n        if (i >= 0) {\n            TokenStream* arg = expandedArgs[i];\n            bool expanded = !!arg && !pasting;\n            // HLSL does expand macros before concatenation\n            if (arg == nullptr || (pasting && !pp->parseContext.isReadingHLSL()) ) {\n                arg = args[i];\n            }\n            pp->pushTokenStreamInput(*arg, prepaste, expanded);\n\n            return pp->scanToken(ppToken);\n        }\n    }\n\n    if (token == EndOfInput)\n        mac->busy = 0;\n\n    return token;\n}\n\n// return a textual zero, for scanning a macro that was never defined\nint TPpContext::tZeroInput::scan(TPpToken* ppToken)\n{\n    if (done)\n        return EndOfInput;\n\n    ppToken->name[0] = '0';\n    ppToken->name[1] = 0;\n    ppToken->ival = 0;\n    ppToken->space = false;\n    done = true;\n\n    return PpAtomConstInt;\n}\n\n//\n// Check a token to see if it is a macro that should be expanded:\n// - If it is, and defined, push a tInput that will produce the appropriate\n//   expansion and return MacroExpandStarted.\n// - If it is, but undefined, and expandUndef is requested, push a tInput\n//   that will expand to 0 and return MacroExpandUndef.\n// - Otherwise, there is no expansion, and there are two cases:\n//   * It might be okay there is no expansion, and no specific error was\n//     detected. Returns MacroExpandNotStarted.\n//   * The expansion was started, but could not be completed, due to an error\n//     that cannot be recovered from. Returns MacroExpandError.\n//\nMacroExpandResult TPpContext::MacroExpand(TPpToken* ppToken, bool expandUndef, bool newLineOkay)\n{\n    ppToken->space = false;\n    int macroAtom = atomStrings.getAtom(ppToken->name);\n    if (ppToken->fullyExpanded)\n        return MacroExpandNotStarted;\n\n    switch (macroAtom) {\n    case PpAtomLineMacro:\n        // Arguments which are macro have been replaced in the first stage.\n        if (ppToken->ival == 0)\n            ppToken->ival = parseContext.getCurrentLoc().line;\n        snprintf(ppToken->name, sizeof(ppToken->name), \"%d\", ppToken->ival);\n        UngetToken(PpAtomConstInt, ppToken);\n        return MacroExpandStarted;\n\n    case PpAtomFileMacro: {\n        if (parseContext.getCurrentLoc().name)\n            parseContext.ppRequireExtensions(ppToken->loc, 1, &E_GL_GOOGLE_cpp_style_line_directive, \"filename-based __FILE__\");\n        ppToken->ival = parseContext.getCurrentLoc().string;\n        snprintf(ppToken->name, sizeof(ppToken->name), \"%s\", ppToken->loc.getStringNameOrNum().c_str());\n        UngetToken(PpAtomConstInt, ppToken);\n        return MacroExpandStarted;\n    }\n\n    case PpAtomVersionMacro:\n        ppToken->ival = parseContext.version;\n        snprintf(ppToken->name, sizeof(ppToken->name), \"%d\", ppToken->ival);\n        UngetToken(PpAtomConstInt, ppToken);\n        return MacroExpandStarted;\n\n    default:\n        break;\n    }\n\n    MacroSymbol* macro = macroAtom == 0 ? nullptr : lookupMacroDef(macroAtom);\n\n    // no recursive expansions\n    if (macro != nullptr && macro->busy) {\n        ppToken->fullyExpanded = true;\n        return MacroExpandNotStarted;\n    }\n\n    // not expanding undefined macros\n    if ((macro == nullptr || macro->undef) && ! expandUndef)\n        return MacroExpandNotStarted;\n\n    // 0 is the value of an undefined macro\n    if ((macro == nullptr || macro->undef) && expandUndef) {\n        pushInput(new tZeroInput(this));\n        return MacroExpandUndef;\n    }\n\n    tMacroInput *in = new tMacroInput(this);\n\n    TSourceLoc loc = ppToken->loc;  // in case we go to the next line before discovering the error\n    in->mac = macro;\n    if (macro->functionLike) {\n        // We don't know yet if this will be a successful call of a\n        // function-like macro; need to look for a '(', but without trashing\n        // the passed in ppToken, until we know we are no longer speculative.\n        TPpToken parenToken;\n        int token = scanToken(&parenToken);\n        if (newLineOkay) {\n            while (token == '\\n')\n                token = scanToken(&parenToken);\n        }\n        if (token != '(') {\n            // Function-like macro called with object-like syntax: okay, don't expand.\n            // (We ate exactly one token that might not be white space; put it back.\n            UngetToken(token, &parenToken);\n            delete in;\n            return MacroExpandNotStarted;\n        }\n        in->args.resize(in->mac->args.size());\n        for (size_t i = 0; i < in->mac->args.size(); i++)\n            in->args[i] = new TokenStream;\n        in->expandedArgs.resize(in->mac->args.size());\n        for (size_t i = 0; i < in->mac->args.size(); i++)\n            in->expandedArgs[i] = nullptr;\n        size_t arg = 0;\n        bool tokenRecorded = false;\n        do {\n            TVector<char> nestStack;\n            while (true) {\n                token = scanToken(ppToken);\n                if (token == EndOfInput || token == tMarkerInput::marker) {\n                    parseContext.ppError(loc, \"End of input in macro\", \"macro expansion\", atomStrings.getString(macroAtom));\n                    delete in;\n                    return MacroExpandError;\n                }\n                if (token == '\\n') {\n                    if (! newLineOkay) {\n                        parseContext.ppError(loc, \"End of line in macro substitution:\", \"macro expansion\", atomStrings.getString(macroAtom));\n                        delete in;\n                        return MacroExpandError;\n                    }\n                    continue;\n                }\n                if (token == '#') {\n                    parseContext.ppError(ppToken->loc, \"unexpected '#'\", \"macro expansion\", atomStrings.getString(macroAtom));\n                    delete in;\n                    return MacroExpandError;\n                }\n                if (in->mac->args.size() == 0 && token != ')')\n                    break;\n                if (nestStack.size() == 0 && (token == ',' || token == ')'))\n                    break;\n                if (token == '(')\n                    nestStack.push_back(')');\n                else if (token == '{' && parseContext.isReadingHLSL())\n                    nestStack.push_back('}');\n                else if (nestStack.size() > 0 && token == nestStack.back())\n                    nestStack.pop_back();\n\n                //Macro replacement list is expanded in the last stage.\n                if (atomStrings.getAtom(ppToken->name) == PpAtomLineMacro)\n                    ppToken->ival = parseContext.getCurrentLoc().line;\n\n                in->args[arg]->putToken(token, ppToken);\n                tokenRecorded = true;\n            }\n            // end of single argument scan\n\n            if (token == ')') {\n                // closing paren of call\n                if (in->mac->args.size() == 1 && !tokenRecorded)\n                    break;\n                arg++;\n                break;\n            }\n            arg++;\n        } while (arg < in->mac->args.size());\n        // end of all arguments scan\n\n        if (arg < in->mac->args.size())\n            parseContext.ppError(loc, \"Too few args in Macro\", \"macro expansion\", atomStrings.getString(macroAtom));\n        else if (token != ')') {\n            // Error recover code; find end of call, if possible\n            int depth = 0;\n            while (token != EndOfInput && (depth > 0 || token != ')')) {\n                if (token == ')' || token == '}')\n                    depth--;\n                token = scanToken(ppToken);\n                if (token == '(' || token == '{')\n                    depth++;\n            }\n\n            if (token == EndOfInput) {\n                parseContext.ppError(loc, \"End of input in macro\", \"macro expansion\", atomStrings.getString(macroAtom));\n                delete in;\n                return MacroExpandError;\n            }\n            parseContext.ppError(loc, \"Too many args in macro\", \"macro expansion\", atomStrings.getString(macroAtom));\n        }\n\n        // We need both expanded and non-expanded forms of the argument, for whether or\n        // not token pasting will be applied later when the argument is consumed next to ##.\n        for (size_t i = 0; i < in->mac->args.size(); i++)\n            in->expandedArgs[i] = PrescanMacroArg(*in->args[i], ppToken, newLineOkay);\n    }\n\n    pushInput(in);\n    macro->busy = 1;\n    macro->body.reset();\n\n    return MacroExpandStarted;\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/preprocessor/PpAtom.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2013 LunarG, Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n/****************************************************************************\\\nCopyright (c) 2002, NVIDIA Corporation.\n\nNVIDIA Corporation(\"NVIDIA\") supplies this software to you in\nconsideration of your agreement to the following terms, and your use,\ninstallation, modification or redistribution of this NVIDIA software\nconstitutes acceptance of these terms.  If you do not agree with these\nterms, please do not use, install, modify or redistribute this NVIDIA\nsoftware.\n\nIn consideration of your agreement to abide by the following terms, and\nsubject to these terms, NVIDIA grants you a personal, non-exclusive\nlicense, under NVIDIA's copyrights in this original NVIDIA software (the\n\"NVIDIA Software\"), to use, reproduce, modify and redistribute the\nNVIDIA Software, with or without modifications, in source and/or binary\nforms; provided that if you redistribute the NVIDIA Software, you must\nretain the copyright notice of NVIDIA, this notice and the following\ntext and disclaimers in all such redistributions of the NVIDIA Software.\nNeither the name, trademarks, service marks nor logos of NVIDIA\nCorporation may be used to endorse or promote products derived from the\nNVIDIA Software without specific prior written permission from NVIDIA.\nExcept as expressly stated in this notice, no other rights or licenses\nexpress or implied, are granted by NVIDIA herein, including but not\nlimited to any patent rights that may be infringed by your derivative\nworks or by other works in which the NVIDIA Software may be\nincorporated. No hardware is licensed hereunder.\n\nTHE NVIDIA SOFTWARE IS BEING PROVIDED ON AN \"AS IS\" BASIS, WITHOUT\nWARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,\nINCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR\nITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER\nPRODUCTS.\n\nIN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,\nINCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF\nUSE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY\nOUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE\nNVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,\nTORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF\nNVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\\****************************************************************************/\n\n#ifndef _CRT_SECURE_NO_WARNINGS\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n\n#include <cassert>\n#include <cstdlib>\n#include <cstring>\n\n#include \"PpContext.h\"\n#include \"PpTokens.h\"\n\nnamespace {\n\nusing namespace glslang;\n\nconst struct {\n    int val;\n    const char* str;\n} tokens[] = {\n\n    { PPAtomAddAssign,      \"+=\" },\n    { PPAtomSubAssign,      \"-=\" },\n    { PPAtomMulAssign,      \"*=\" },\n    { PPAtomDivAssign,      \"/=\" },\n    { PPAtomModAssign,      \"%=\" },\n\n    { PpAtomRight,          \">>\" },\n    { PpAtomLeft,           \"<<\" },\n    { PpAtomAnd,            \"&&\" },\n    { PpAtomOr,             \"||\" },\n    { PpAtomXor,            \"^^\" },\n\n    { PpAtomRightAssign,    \">>=\" },\n    { PpAtomLeftAssign,     \"<<=\" },\n    { PpAtomAndAssign,      \"&=\" },\n    { PpAtomOrAssign,       \"|=\" },\n    { PpAtomXorAssign,      \"^=\" },\n\n    { PpAtomEQ,             \"==\" },\n    { PpAtomNE,             \"!=\" },\n    { PpAtomGE,             \">=\" },\n    { PpAtomLE,             \"<=\" },\n\n    { PpAtomDecrement,      \"--\" },\n    { PpAtomIncrement,      \"++\" },\n\n    { PpAtomColonColon,     \"::\" },\n\n    { PpAtomDefine,         \"define\" },\n    { PpAtomUndef,          \"undef\" },\n    { PpAtomIf,             \"if\" },\n    { PpAtomElif,           \"elif\" },\n    { PpAtomElse,           \"else\" },\n    { PpAtomEndif,          \"endif\" },\n    { PpAtomIfdef,          \"ifdef\" },\n    { PpAtomIfndef,         \"ifndef\" },\n    { PpAtomLine,           \"line\" },\n    { PpAtomPragma,         \"pragma\" },\n    { PpAtomError,          \"error\" },\n\n    { PpAtomVersion,        \"version\" },\n    { PpAtomCore,           \"core\" },\n    { PpAtomCompatibility,  \"compatibility\" },\n    { PpAtomEs,             \"es\" },\n    { PpAtomExtension,      \"extension\" },\n\n    { PpAtomLineMacro,       \"__LINE__\" },\n    { PpAtomFileMacro,       \"__FILE__\" },\n    { PpAtomVersionMacro,    \"__VERSION__\" },\n\n    { PpAtomInclude,         \"include\" },\n};\n\n} // end anonymous namespace\n\nnamespace glslang {\n\n//\n// Initialize the atom table.\n//\nTStringAtomMap::TStringAtomMap()\n{\n    badToken.assign(\"<bad token>\");\n\n    // Add single character tokens to the atom table:\n    const char* s = \"~!%^&*()-+=|,.<>/?;:[]{}#\\\\\";\n    char t[2];\n\n    t[1] = '\\0';\n    while (*s) {\n        t[0] = *s;\n        addAtomFixed(t, s[0]);\n        s++;\n    }\n\n    // Add multiple character scanner tokens :\n    for (size_t ii = 0; ii < sizeof(tokens)/sizeof(tokens[0]); ii++)\n        addAtomFixed(tokens[ii].str, tokens[ii].val);\n\n    nextAtom = PpAtomLast;\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/preprocessor/PpContext.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2013 LunarG, Inc.\n// Copyright (C) 2015-2018 Google, Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n/****************************************************************************\\\nCopyright (c) 2002, NVIDIA Corporation.\n\nNVIDIA Corporation(\"NVIDIA\") supplies this software to you in\nconsideration of your agreement to the following terms, and your use,\ninstallation, modification or redistribution of this NVIDIA software\nconstitutes acceptance of these terms.  If you do not agree with these\nterms, please do not use, install, modify or redistribute this NVIDIA\nsoftware.\n\nIn consideration of your agreement to abide by the following terms, and\nsubject to these terms, NVIDIA grants you a personal, non-exclusive\nlicense, under NVIDIA's copyrights in this original NVIDIA software (the\n\"NVIDIA Software\"), to use, reproduce, modify and redistribute the\nNVIDIA Software, with or without modifications, in source and/or binary\nforms; provided that if you redistribute the NVIDIA Software, you must\nretain the copyright notice of NVIDIA, this notice and the following\ntext and disclaimers in all such redistributions of the NVIDIA Software.\nNeither the name, trademarks, service marks nor logos of NVIDIA\nCorporation may be used to endorse or promote products derived from the\nNVIDIA Software without specific prior written permission from NVIDIA.\nExcept as expressly stated in this notice, no other rights or licenses\nexpress or implied, are granted by NVIDIA herein, including but not\nlimited to any patent rights that may be infringed by your derivative\nworks or by other works in which the NVIDIA Software may be\nincorporated. No hardware is licensed hereunder.\n\nTHE NVIDIA SOFTWARE IS BEING PROVIDED ON AN \"AS IS\" BASIS, WITHOUT\nWARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,\nINCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR\nITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER\nPRODUCTS.\n\nIN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,\nINCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF\nUSE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY\nOUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE\nNVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,\nTORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF\nNVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\\****************************************************************************/\n\n#include <cstdlib>\n#include <locale>\n\n#include \"PpContext.h\"\n\nnamespace glslang {\n\nTPpContext::TPpContext(TParseContextBase& pc, const std::string& rootFileName, TShader::Includer& inclr) :\n    preamble(nullptr), strings(nullptr), previous_token('\\n'), parseContext(pc), includer(inclr), inComment(false),\n    rootFileName(rootFileName),\n    currentSourceFile(rootFileName),\n    disableEscapeSequences(false),\n    inElseSkip(false)\n{\n    ifdepth = 0;\n    for (elsetracker = 0; elsetracker < maxIfNesting; elsetracker++)\n        elseSeen[elsetracker] = false;\n    elsetracker = 0;\n\n    strtodStream.imbue(std::locale::classic());\n}\n\nTPpContext::~TPpContext()\n{\n    delete [] preamble;\n\n    // free up the inputStack\n    while (! inputStack.empty())\n        popInput();\n}\n\nvoid TPpContext::setInput(TInputScanner& input, bool versionWillBeError)\n{\n    assert(inputStack.size() == 0);\n\n    pushInput(new tStringInput(this, input));\n\n    errorOnVersion = versionWillBeError;\n    versionSeen = false;\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/preprocessor/PpContext.h",
    "content": "//\n// Copyright (C) 2013 LunarG, Inc.\n// Copyright (C) 2015-2018 Google, Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n/****************************************************************************\\\nCopyright (c) 2002, NVIDIA Corporation.\n\nNVIDIA Corporation(\"NVIDIA\") supplies this software to you in\nconsideration of your agreement to the following terms, and your use,\ninstallation, modification or redistribution of this NVIDIA software\nconstitutes acceptance of these terms.  If you do not agree with these\nterms, please do not use, install, modify or redistribute this NVIDIA\nsoftware.\n\nIn consideration of your agreement to abide by the following terms, and\nsubject to these terms, NVIDIA grants you a personal, non-exclusive\nlicense, under NVIDIA's copyrights in this original NVIDIA software (the\n\"NVIDIA Software\"), to use, reproduce, modify and redistribute the\nNVIDIA Software, with or without modifications, in source and/or binary\nforms; provided that if you redistribute the NVIDIA Software, you must\nretain the copyright notice of NVIDIA, this notice and the following\ntext and disclaimers in all such redistributions of the NVIDIA Software.\nNeither the name, trademarks, service marks nor logos of NVIDIA\nCorporation may be used to endorse or promote products derived from the\nNVIDIA Software without specific prior written permission from NVIDIA.\nExcept as expressly stated in this notice, no other rights or licenses\nexpress or implied, are granted by NVIDIA herein, including but not\nlimited to any patent rights that may be infringed by your derivative\nworks or by other works in which the NVIDIA Software may be\nincorporated. No hardware is licensed hereunder.\n\nTHE NVIDIA SOFTWARE IS BEING PROVIDED ON AN \"AS IS\" BASIS, WITHOUT\nWARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,\nINCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR\nITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER\nPRODUCTS.\n\nIN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,\nINCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF\nUSE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY\nOUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE\nNVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,\nTORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF\nNVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\\****************************************************************************/\n\n#ifndef PPCONTEXT_H\n#define PPCONTEXT_H\n\n#include <stack>\n#include <unordered_map>\n#include <sstream>\n\n#include \"../ParseHelper.h\"\n#include \"PpTokens.h\"\n\nnamespace glslang {\n\nclass TPpToken {\npublic:\n    TPpToken() { clear(); }\n    void clear()\n    {\n        space = false;\n        i64val = 0;\n        loc.init();\n        name[0] = 0;\n        fullyExpanded = false;\n    }\n\n    // Used for comparing macro definitions, so checks what is relevant for that.\n    bool operator==(const TPpToken& right) const\n    {\n        return space == right.space &&\n               ival == right.ival && dval == right.dval && i64val == right.i64val &&\n               strncmp(name, right.name, MaxTokenLength) == 0;\n    }\n    bool operator!=(const TPpToken& right) const { return ! operator==(right); }\n\n    TSourceLoc loc;\n    // True if a space (for white space or a removed comment) should also be\n    // recognized, in front of the token returned:\n    bool space;\n\n    bool fullyExpanded;\n    // Numeric value of the token:\n    union {\n        int ival;\n        double dval;\n        long long i64val;\n    };\n    // Text string of the token:\n    char name[MaxTokenLength + 1];\n};\n\nclass TStringAtomMap {\n//\n// Implementation is in PpAtom.cpp\n//\n// Maintain a bi-directional mapping between relevant preprocessor strings and\n// \"atoms\" which a unique integers (small, contiguous, not hash-like) per string.\n//\npublic:\n    TStringAtomMap();\n\n    // Map string -> atom.\n    // Return 0 if no existing string.\n    int getAtom(const char* s) const\n    {\n        auto it = atomMap.find(s);\n        return it == atomMap.end() ? 0 : it->second;\n    }\n\n    // Map a new or existing string -> atom, inventing a new atom if necessary.\n    int getAddAtom(const char* s)\n    {\n        int atom = getAtom(s);\n        if (atom == 0) {\n            atom = nextAtom++;\n            addAtomFixed(s, atom);\n        }\n        return atom;\n    }\n\n    // Map atom -> string.\n    const char* getString(int atom) const { return stringMap[atom]->c_str(); }\n\nprotected:\n    TStringAtomMap(TStringAtomMap&);\n    TStringAtomMap& operator=(TStringAtomMap&);\n\n    TUnorderedMap<TString, int> atomMap;\n    TVector<const TString*> stringMap;    // these point into the TString in atomMap\n    int nextAtom;\n\n    // Bad source characters can lead to bad atoms, so gracefully handle those by\n    // pre-filling the table with them (to avoid if tests later).\n    TString badToken;\n\n    // Add bi-directional mappings:\n    //  - string -> atom\n    //  - atom -> string\n    void addAtomFixed(const char* s, int atom)\n    {\n        auto it = atomMap.insert(std::pair<TString, int>(s, atom)).first;\n        if (stringMap.size() < (size_t)atom + 1)\n            stringMap.resize(atom + 100, &badToken);\n        stringMap[atom] = &it->first;\n    }\n};\n\nclass TInputScanner;\n\nenum MacroExpandResult {\n    MacroExpandNotStarted, // macro not expanded, which might not be an error\n    MacroExpandError,      // a clear error occurred while expanding, no expansion\n    MacroExpandStarted,    // macro expansion process has started\n    MacroExpandUndef       // macro is undefined and will be expanded\n};\n\n// This class is the result of turning a huge pile of C code communicating through globals\n// into a class.  This was done to allowing instancing to attain thread safety.\n// Don't expect too much in terms of OO design.\nclass TPpContext {\npublic:\n    TPpContext(TParseContextBase&, const std::string& rootFileName, TShader::Includer&);\n    virtual ~TPpContext();\n\n    void setPreamble(const char* preamble, size_t length);\n\n    int tokenize(TPpToken& ppToken);\n    int tokenPaste(int token, TPpToken&);\n\n    class tInput {\n    public:\n        tInput(TPpContext* p) : done(false), pp(p) { }\n        virtual ~tInput() { }\n\n        virtual int scan(TPpToken*) = 0;\n        virtual int getch() = 0;\n        virtual void ungetch() = 0;\n        virtual bool peekPasting() { return false; }             // true when about to see ##\n        virtual bool peekContinuedPasting(int) { return false; } // true when non-spaced tokens can paste\n        virtual bool endOfReplacementList() { return false; } // true when at the end of a macro replacement list (RHS of #define)\n        virtual bool isMacroInput() { return false; }\n        virtual bool isStringInput() { return false; }\n\n        // Will be called when we start reading tokens from this instance\n        virtual void notifyActivated() {}\n        // Will be called when we do not read tokens from this instance anymore\n        virtual void notifyDeleted() {}\n    protected:\n        bool done;\n        TPpContext* pp;\n    };\n\n    void setInput(TInputScanner& input, bool versionWillBeError);\n\n    void pushInput(tInput* in)\n    {\n        inputStack.push_back(in);\n        in->notifyActivated();\n    }\n    void popInput()\n    {\n        inputStack.back()->notifyDeleted();\n        delete inputStack.back();\n        inputStack.pop_back();\n    }\n\n    //\n    // From PpTokens.cpp\n    //\n\n    // Capture the needed parts of a token stream for macro recording/playback.\n    class TokenStream {\n    public:\n        // Manage a stream of these 'Token', which capture the relevant parts\n        // of a TPpToken, plus its atom.\n        class Token {\n        public:\n            Token(int atom, const TPpToken& ppToken) : \n                atom(atom),\n                space(ppToken.space),\n                i64val(ppToken.i64val),\n                name(ppToken.name) { }\n            int get(TPpToken& ppToken)\n            {\n                ppToken.clear();\n                ppToken.space = space;\n                ppToken.i64val = i64val;\n                snprintf(ppToken.name, sizeof(ppToken.name), \"%s\", name.c_str());\n                return atom;\n            }\n            bool isAtom(int a) const { return atom == a; }\n            int getAtom() const { return atom; }\n            bool nonSpaced() const { return !space; }\n        protected:\n            Token() {}\n            int atom;\n            bool space;        // did a space precede the token?\n            long long i64val;\n            TString name;\n        };\n\n        TokenStream() : currentPos(0) { }\n\n        void putToken(int token, TPpToken* ppToken);\n        bool peekToken(int atom) { return !atEnd() && stream[currentPos].isAtom(atom); }\n        bool peekContinuedPasting(int atom)\n        {\n            // This is basically necessary because, for example, the PP\n            // tokenizer only accepts valid numeric-literals plus suffixes, so\n            // separates numeric-literals plus bad suffix into two tokens, which\n            // should get both pasted together as one token when token pasting.\n            //\n            // The following code is a bit more generalized than the above example.\n            if (!atEnd() && atom == PpAtomIdentifier && stream[currentPos].nonSpaced()) {\n                switch(stream[currentPos].getAtom()) {\n                    case PpAtomConstInt:\n                    case PpAtomConstUint:\n                    case PpAtomConstInt64:\n                    case PpAtomConstUint64:\n                    case PpAtomConstInt16:\n                    case PpAtomConstUint16:\n                    case PpAtomConstFloat:\n                    case PpAtomConstDouble:\n                    case PpAtomConstFloat16:\n                    case PpAtomConstString:\n                    case PpAtomIdentifier:\n                        return true;\n                    default:\n                        break;\n                }\n            }\n\n            return false;\n        }\n        int getToken(TParseContextBase&, TPpToken*);\n        bool atEnd() { return currentPos >= stream.size(); }\n        bool peekTokenizedPasting(bool lastTokenPastes);\n        bool peekUntokenizedPasting();\n        void reset() { currentPos = 0; }\n\n    protected:\n        TVector<Token> stream;\n        size_t currentPos;\n    };\n\n    //\n    // From Pp.cpp\n    //\n\n    struct MacroSymbol {\n        MacroSymbol() : functionLike(0), busy(0), undef(0) { }\n        TVector<int> args;\n        TokenStream body;\n        unsigned functionLike : 1;  // 0 means object-like, 1 means function-like\n        unsigned busy         : 1;\n        unsigned undef        : 1;\n    };\n\n    typedef TMap<int, MacroSymbol> TSymbolMap;\n    TSymbolMap macroDefs;  // map atoms to macro definitions\n    MacroSymbol* lookupMacroDef(int atom)\n    {\n        auto existingMacroIt = macroDefs.find(atom);\n        return (existingMacroIt == macroDefs.end()) ? nullptr : &(existingMacroIt->second);\n    }\n    void addMacroDef(int atom, MacroSymbol& macroDef) { macroDefs[atom] = macroDef; }\n\nprotected:\n    TPpContext(TPpContext&);\n    TPpContext& operator=(TPpContext&);\n\n    TStringAtomMap atomStrings;\n    char*   preamble;               // string to parse, all before line 1 of string 0, it is 0 if no preamble\n    int     preambleLength;\n    char**  strings;                // official strings of shader, starting a string 0 line 1\n    size_t* lengths;\n    int     numStrings;             // how many official strings there are\n    int     currentString;          // which string we're currently parsing  (-1 for preamble)\n\n    // Scanner data:\n    int previous_token;\n    TParseContextBase& parseContext;\n    std::vector<int> lastLineTokens;\n    std::vector<TSourceLoc> lastLineTokenLocs;\n    // Get the next token from *stack* of input sources, popping input sources\n    // that are out of tokens, down until an input source is found that has a token.\n    // Return EndOfInput when there are no more tokens to be found by doing this.\n    int scanToken(TPpToken* ppToken)\n    {\n        int token = EndOfInput;\n\n        while (! inputStack.empty()) {\n            token = inputStack.back()->scan(ppToken);\n            if (token != EndOfInput || inputStack.empty())\n                break;\n            popInput();\n        }\n        if (!inputStack.empty() && inputStack.back()->isStringInput() && !inElseSkip) {\n            if (token == '\\n') {\n                bool seenNumSign = false;\n                for (int i = 0; i < (int)lastLineTokens.size() - 1;) {\n                    int curPos = i;\n                    int curToken = lastLineTokens[i++];\n                    if (curToken == '#' && lastLineTokens[i] == '#') {\n                        curToken = PpAtomPaste;\n                        i++;\n                    }\n                    if (curToken == '#') {\n                        if (seenNumSign) {\n                            parseContext.ppError(lastLineTokenLocs[curPos], \"(#) can be preceded in its line only by spaces or horizontal tabs\", \"#\", \"\");\n                        } else {\n                            seenNumSign = true;\n                        }\n                    }\n                }\n                lastLineTokens.clear();\n                lastLineTokenLocs.clear();\n            } else {\n                lastLineTokens.push_back(token);\n                lastLineTokenLocs.push_back(ppToken->loc);\n            }\n        }\n        return token;\n    }\n    int  getChar() { return inputStack.back()->getch(); }\n    void ungetChar() { inputStack.back()->ungetch(); }\n    bool peekPasting() { return !inputStack.empty() && inputStack.back()->peekPasting(); }\n    bool peekContinuedPasting(int a)\n    {\n        return !inputStack.empty() && inputStack.back()->peekContinuedPasting(a);\n    }\n    bool endOfReplacementList() { return inputStack.empty() || inputStack.back()->endOfReplacementList(); }\n    bool isMacroInput() { return inputStack.size() > 0 && inputStack.back()->isMacroInput(); }\n\n    static const int maxIfNesting = 65;\n\n    int ifdepth;                  // current #if-#else-#endif nesting in the cpp.c file (pre-processor)\n    bool elseSeen[maxIfNesting];  // Keep a track of whether an else has been seen at a particular depth\n    int elsetracker;              // #if-#else and #endif constructs...Counter.\n\n    class tMacroInput : public tInput {\n    public:\n        tMacroInput(TPpContext* pp) : tInput(pp), prepaste(false), postpaste(false) { }\n        virtual ~tMacroInput()\n        {\n            for (size_t i = 0; i < args.size(); ++i)\n                delete args[i];\n            for (size_t i = 0; i < expandedArgs.size(); ++i)\n                delete expandedArgs[i];\n        }\n\n        virtual int scan(TPpToken*) override;\n        virtual int getch() override { assert(0); return EndOfInput; }\n        virtual void ungetch() override { assert(0); }\n        bool peekPasting() override { return prepaste; }\n        bool peekContinuedPasting(int a) override { return mac->body.peekContinuedPasting(a); }\n        bool endOfReplacementList() override { return mac->body.atEnd(); }\n        bool isMacroInput() override { return true; }\n\n        MacroSymbol *mac;\n        TVector<TokenStream*> args;\n        TVector<TokenStream*> expandedArgs;\n\n    protected:\n        bool prepaste;         // true if we are just before ##\n        bool postpaste;        // true if we are right after ##\n    };\n\n    class tMarkerInput : public tInput {\n    public:\n        tMarkerInput(TPpContext* pp) : tInput(pp) { }\n        virtual int scan(TPpToken*) override\n        {\n            if (done)\n                return EndOfInput;\n            done = true;\n\n            return marker;\n        }\n        virtual int getch() override { assert(0); return EndOfInput; }\n        virtual void ungetch() override { assert(0); }\n        static const int marker = -3;\n    };\n\n    class tZeroInput : public tInput {\n    public:\n        tZeroInput(TPpContext* pp) : tInput(pp) { }\n        virtual int scan(TPpToken*) override;\n        virtual int getch() override { assert(0); return EndOfInput; }\n        virtual void ungetch() override { assert(0); }\n    };\n\n    std::vector<tInput*> inputStack;\n    bool errorOnVersion;\n    bool versionSeen;\n\n    //\n    // from Pp.cpp\n    //\n\n    // Used to obtain #include content.\n    TShader::Includer& includer;\n\n    int CPPdefine(TPpToken * ppToken);\n    int CPPundef(TPpToken * ppToken);\n    int CPPelse(int matchelse, TPpToken * ppToken);\n    int extraTokenCheck(int atom, TPpToken* ppToken, int token);\n    int eval(int token, int precedence, bool shortCircuit, int& res, bool& err, TPpToken * ppToken);\n    int evalToToken(int token, bool shortCircuit, int& res, bool& err, TPpToken * ppToken);\n    int CPPif (TPpToken * ppToken);\n    int CPPifdef(int defined, TPpToken * ppToken);\n    int CPPinclude(TPpToken * ppToken);\n    int CPPline(TPpToken * ppToken);\n    int CPPerror(TPpToken * ppToken);\n    int CPPpragma(TPpToken * ppToken);\n    int CPPversion(TPpToken * ppToken);\n    int CPPextension(TPpToken * ppToken);\n    int readCPPline(TPpToken * ppToken);\n    int scanHeaderName(TPpToken* ppToken, char delimit);\n    TokenStream* PrescanMacroArg(TokenStream&, TPpToken*, bool newLineOkay);\n    MacroExpandResult MacroExpand(TPpToken* ppToken, bool expandUndef, bool newLineOkay);\n\n    //\n    // From PpTokens.cpp\n    //\n    void pushTokenStreamInput(TokenStream&, bool pasting = false, bool expanded = false);\n    void UngetToken(int token, TPpToken*);\n\n    class tTokenInput : public tInput {\n    public:\n        tTokenInput(TPpContext* pp, TokenStream* t, bool prepasting, bool expanded) :\n            tInput(pp),\n            tokens(t),\n            lastTokenPastes(prepasting),\n            preExpanded(expanded) { }\n        virtual int scan(TPpToken *ppToken) override {\n            int token = tokens->getToken(pp->parseContext, ppToken);\n            ppToken->fullyExpanded = preExpanded;\n            if (tokens->atEnd() && token == PpAtomIdentifier) {\n                int macroAtom = pp->atomStrings.getAtom(ppToken->name);\n                MacroSymbol* macro = macroAtom == 0 ? nullptr : pp->lookupMacroDef(macroAtom);\n                if (macro && macro->functionLike)\n                    ppToken->fullyExpanded = false;\n            }\n            return token;\n        }\n        virtual int getch() override { assert(0); return EndOfInput; }\n        virtual void ungetch() override { assert(0); }\n        virtual bool peekPasting() override { return tokens->peekTokenizedPasting(lastTokenPastes); }\n        bool peekContinuedPasting(int a) override { return tokens->peekContinuedPasting(a); }\n    protected:\n        TokenStream* tokens;\n        bool lastTokenPastes; // true if the last token in the input is to be pasted, rather than consumed as a token\n        bool preExpanded;\n    };\n\n    class tUngotTokenInput : public tInput {\n    public:\n        tUngotTokenInput(TPpContext* pp, int t, TPpToken* p) : tInput(pp), token(t), lval(*p) { }\n        virtual int scan(TPpToken *) override;\n        virtual int getch() override { assert(0); return EndOfInput; }\n        virtual void ungetch() override { assert(0); }\n    protected:\n        int token;\n        TPpToken lval;\n    };\n\n    //\n    // From PpScanner.cpp\n    //\n    class tStringInput : public tInput {\n    public:\n        tStringInput(TPpContext* pp, TInputScanner& i) : tInput(pp), input(&i) { }\n        virtual int scan(TPpToken*) override;\n        bool isStringInput() override { return true; }\n        // Scanner used to get source stream characters.\n        //  - Escaped newlines are handled here, invisibly to the caller.\n        //  - All forms of newline are handled, and turned into just a '\\n'.\n        int getch() override\n        {\n            int ch = input->get();\n\n            if (ch == '\\\\') {\n                // Move past escaped newlines, as many as sequentially exist\n                do {\n                    if (input->peek() == '\\r' || input->peek() == '\\n') {\n                        bool allowed = pp->parseContext.lineContinuationCheck(input->getSourceLoc(), pp->inComment);\n                        if (! allowed && pp->inComment)\n                            return '\\\\';\n\n                        // escape one newline now\n                        ch = input->get();\n                        int nextch = input->get();\n                        if (ch == '\\r' && nextch == '\\n')\n                            ch = input->get();\n                        else\n                            ch = nextch;\n                    } else\n                        return '\\\\';\n                } while (ch == '\\\\');\n            }\n\n            // handle any non-escaped newline\n            if (ch == '\\r' || ch == '\\n') {\n                if (ch == '\\r' && input->peek() == '\\n')\n                    input->get();\n                return '\\n';\n            }\n\n            return ch;\n        }\n\n        // Scanner used to backup the source stream characters.  Newlines are\n        // handled here, invisibly to the caller, meaning have to undo exactly\n        // what getch() above does (e.g., don't leave things in the middle of a\n        // sequence of escaped newlines).\n        void ungetch() override\n        {\n            input->unget();\n\n            do {\n                int ch = input->peek();\n                if (ch == '\\r' || ch == '\\n') {\n                    if (ch == '\\n') {\n                        // correct for two-character newline\n                        input->unget();\n                        if (input->peek() != '\\r')\n                            input->get();\n                    }\n                    // now in front of a complete newline, move past an escape character\n                    input->unget();\n                    if (input->peek() == '\\\\')\n                        input->unget();\n                    else {\n                        input->get();\n                        break;\n                    }\n                } else\n                    break;\n            } while (true);\n        }\n\n    protected:\n        TInputScanner* input;\n    };\n\n    // Holds a reference to included file data, as well as a\n    // prologue and an epilogue string. This can be scanned using the tInput\n    // interface and acts as a single source string.\n    class TokenizableIncludeFile : public tInput {\n    public:\n        // Copies prologue and epilogue. The includedFile must remain valid\n        // until this TokenizableIncludeFile is no longer used.\n        TokenizableIncludeFile(const TSourceLoc& startLoc,\n                          const std::string& prologue,\n                          TShader::Includer::IncludeResult* includedFile,\n                          const std::string& epilogue,\n                          TPpContext* pp)\n            : tInput(pp),\n              prologue_(prologue),\n              epilogue_(epilogue),\n              includedFile_(includedFile),\n              scanner(3, strings, lengths, nullptr, 0, 0, true),\n              prevScanner(nullptr),\n              stringInput(pp, scanner)\n        {\n              strings[0] = prologue_.data();\n              strings[1] = includedFile_->headerData;\n              strings[2] = epilogue_.data();\n\n              lengths[0] = prologue_.size();\n              lengths[1] = includedFile_->headerLength;\n              lengths[2] = epilogue_.size();\n\n              scanner.setLine(startLoc.line);\n              scanner.setString(startLoc.string);\n\n              scanner.setFile(startLoc.getFilenameStr(), 0);\n              scanner.setFile(startLoc.getFilenameStr(), 1);\n              scanner.setFile(startLoc.getFilenameStr(), 2);\n        }\n\n        // tInput methods:\n        int scan(TPpToken* t) override { return stringInput.scan(t); }\n        int getch() override { return stringInput.getch(); }\n        void ungetch() override { stringInput.ungetch(); }\n\n        void notifyActivated() override\n        {\n            prevScanner = pp->parseContext.getScanner();\n            pp->parseContext.setScanner(&scanner);\n            pp->push_include(includedFile_);\n        }\n\n        void notifyDeleted() override\n        {\n            pp->parseContext.setScanner(prevScanner);\n            pp->pop_include();\n        }\n\n    private:\n        TokenizableIncludeFile& operator=(const TokenizableIncludeFile&);\n\n        // Stores the prologue for this string.\n        const std::string prologue_;\n\n        // Stores the epilogue for this string.\n        const std::string epilogue_;\n\n        // Points to the IncludeResult that this TokenizableIncludeFile represents.\n        TShader::Includer::IncludeResult* includedFile_;\n\n        // Will point to prologue_, includedFile_->headerData and epilogue_\n        // This is passed to scanner constructor.\n        // These do not own the storage and it must remain valid until this\n        // object has been destroyed.\n        const char* strings[3];\n        // Length of str_, passed to scanner constructor.\n        size_t lengths[3];\n        // Scans over str_.\n        TInputScanner scanner;\n        // The previous effective scanner before the scanner in this instance\n        // has been activated.\n        TInputScanner* prevScanner;\n        // Delegate object implementing the tInput interface.\n        tStringInput stringInput;\n    };\n\n    int ScanFromString(char* s);\n    void missingEndifCheck();\n    int lFloatConst(int len, int ch, TPpToken* ppToken);\n    int characterLiteral(TPpToken* ppToken);\n\n    void push_include(TShader::Includer::IncludeResult* result)\n    {\n        currentSourceFile = result->headerName;\n        includeStack.push(result);\n    }\n\n    void pop_include()\n    {\n        TShader::Includer::IncludeResult* include = includeStack.top();\n        includeStack.pop();\n        includer.releaseInclude(include);\n        if (includeStack.empty()) {\n            currentSourceFile = rootFileName;\n        } else {\n            currentSourceFile = includeStack.top()->headerName;\n        }\n    }\n\n    bool inComment;\n    std::string rootFileName;\n    std::stack<TShader::Includer::IncludeResult*> includeStack;\n    std::string currentSourceFile;\n\n    std::istringstream strtodStream;\n    bool disableEscapeSequences;\n    // True if we're skipping a section enclosed by #if/#ifdef/#elif/#else which was evaluated to\n    // be inactive, e.g. #if 0\n    bool inElseSkip;\n};\n\n} // end namespace glslang\n\n#endif  // PPCONTEXT_H\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/preprocessor/PpScanner.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2013 LunarG, Inc.\n// Copyright (C) 2017 ARM Limited.\n// Copyright (C) 2015-2018 Google, Inc.\n// Copyright (c) 2023, Mobica Limited\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n/****************************************************************************\\\nCopyright (c) 2002, NVIDIA Corporation.\n\nNVIDIA Corporation(\"NVIDIA\") supplies this software to you in\nconsideration of your agreement to the following terms, and your use,\ninstallation, modification or redistribution of this NVIDIA software\nconstitutes acceptance of these terms.  If you do not agree with these\nterms, please do not use, install, modify or redistribute this NVIDIA\nsoftware.\n\nIn consideration of your agreement to abide by the following terms, and\nsubject to these terms, NVIDIA grants you a personal, non-exclusive\nlicense, under NVIDIA's copyrights in this original NVIDIA software (the\n\"NVIDIA Software\"), to use, reproduce, modify and redistribute the\nNVIDIA Software, with or without modifications, in source and/or binary\nforms; provided that if you redistribute the NVIDIA Software, you must\nretain the copyright notice of NVIDIA, this notice and the following\ntext and disclaimers in all such redistributions of the NVIDIA Software.\nNeither the name, trademarks, service marks nor logos of NVIDIA\nCorporation may be used to endorse or promote products derived from the\nNVIDIA Software without specific prior written permission from NVIDIA.\nExcept as expressly stated in this notice, no other rights or licenses\nexpress or implied, are granted by NVIDIA herein, including but not\nlimited to any patent rights that may be infringed by your derivative\nworks or by other works in which the NVIDIA Software may be\nincorporated. No hardware is licensed hereunder.\n\nTHE NVIDIA SOFTWARE IS BEING PROVIDED ON AN \"AS IS\" BASIS, WITHOUT\nWARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,\nINCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR\nITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER\nPRODUCTS.\n\nIN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,\nINCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF\nUSE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY\nOUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE\nNVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,\nTORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF\nNVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\\****************************************************************************/\n\n#ifndef _CRT_SECURE_NO_WARNINGS\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n\n#include <cstdlib>\n#include <cstring>\n\n#include \"PpContext.h\"\n#include \"PpTokens.h\"\n#include \"../Scan.h\"\n\nnamespace glslang {\n\n///////////////////////////////////////////////////////////////////////////////////////////////\n/////////////////////////////////// Floating point constants: /////////////////////////////////\n///////////////////////////////////////////////////////////////////////////////////////////////\n\n// \n// Scan a single- or double-precision floating point constant.\n// Assumes that the scanner has seen at least one digit,\n// followed by either a decimal '.' or the letter 'e', or a\n// precision ending (e.g., F or LF).\n//\n// This is technically not correct, as the preprocessor should just\n// accept the numeric literal along with whatever suffix it has, but\n// currently, it stops on seeing a bad suffix, treating that as the\n// next token. This effects things like token pasting, where it is\n// relevant how many tokens something was broken into.\n//\n// See peekContinuedPasting().\nint TPpContext::lFloatConst(int len, int ch, TPpToken* ppToken)\n{\n    const auto saveName = [&](int ch) {\n        if (len <= MaxTokenLength)\n            ppToken->name[len++] = static_cast<char>(ch);\n    };\n\n    // find the range of non-zero digits before the decimal point\n    int startNonZero = 0;\n    while (startNonZero < len && ppToken->name[startNonZero] == '0')\n        ++startNonZero;\n    int endNonZero = len;\n    while (endNonZero > startNonZero && ppToken->name[endNonZero-1] == '0')\n        --endNonZero;\n    int numWholeNumberDigits = endNonZero - startNonZero;\n\n    // accumulate the range's value\n    bool fastPath = numWholeNumberDigits <= 15;  // when the number gets too complex, set to false\n    unsigned long long wholeNumber = 0;\n    if (fastPath) {\n        for (int i = startNonZero; i < endNonZero; ++i)\n            wholeNumber = wholeNumber * 10 + (ppToken->name[i] - '0');\n    }\n    int decimalShift = len - endNonZero;\n\n    // Decimal point:\n    bool hasDecimalOrExponent = false;\n    if (ch == '.') {\n        hasDecimalOrExponent = true;\n        saveName(ch);\n        ch = getChar();\n        int firstDecimal = len;\n\n#ifdef ENABLE_HLSL\n        // 1.#INF or -1.#INF\n        if (ch == '#' && (ifdepth > 0 || parseContext.intermediate.getSource() == EShSourceHlsl)) {\n            if ((len <  2) ||\n                (len == 2 && ppToken->name[0] != '1') ||\n                (len == 3 && ppToken->name[1] != '1' && !(ppToken->name[0] == '-' || ppToken->name[0] == '+')) ||\n                (len >  3))\n                parseContext.ppError(ppToken->loc, \"unexpected use of\", \"#\", \"\");\n            else {\n                // we have 1.# or -1.# or +1.#, check for 'INF'\n                if ((ch = getChar()) != 'I' ||\n                    (ch = getChar()) != 'N' ||\n                    (ch = getChar()) != 'F')\n                    parseContext.ppError(ppToken->loc, \"expected 'INF'\", \"#\", \"\");\n                else {\n                    // we have [+-].#INF, and we are targeting IEEE 754, so wrap it up:\n                    saveName('I');\n                    saveName('N');\n                    saveName('F');\n                    ppToken->name[len] = '\\0';\n                    if (ppToken->name[0] == '-')\n                        ppToken->i64val = 0xfff0000000000000; // -Infinity\n                    else\n                        ppToken->i64val = 0x7ff0000000000000; // +Infinity\n                    return PpAtomConstFloat;\n                }\n            }\n        }\n#endif\n\n        // Consume leading-zero digits after the decimal point\n        while (ch == '0') {\n            saveName(ch);\n            ch = getChar();\n        }\n        int startNonZeroDecimal = len;\n        int endNonZeroDecimal = len;\n\n        // Consume remaining digits, up to the exponent\n        while (ch >= '0' && ch <= '9') {\n            saveName(ch);\n            if (ch != '0')\n                endNonZeroDecimal = len;\n            ch = getChar();\n        }\n\n        // Compute accumulation up to the last non-zero digit\n        if (endNonZeroDecimal > startNonZeroDecimal) {\n            numWholeNumberDigits += endNonZeroDecimal - endNonZero - 1; // don't include the \".\"\n            if (numWholeNumberDigits > 15)\n                fastPath = false;\n            if (fastPath) {\n                for (int i = endNonZero; i < endNonZeroDecimal; ++i) {\n                    if (ppToken->name[i] != '.')\n                        wholeNumber = wholeNumber * 10 + (ppToken->name[i] - '0');\n                }\n            }\n            decimalShift = firstDecimal - endNonZeroDecimal;\n        }\n    }\n\n    // Exponent:\n    bool negativeExponent = false;\n    double exponentValue = 0.0;\n    int exponent = 0;\n    {\n        if (ch == 'e' || ch == 'E') {\n            hasDecimalOrExponent = true;\n            saveName(ch);\n            ch = getChar();\n            if (ch == '+' || ch == '-') {\n                negativeExponent = ch == '-';\n                saveName(ch);\n                ch = getChar();\n            }\n            if (ch >= '0' && ch <= '9') {\n                while (ch >= '0' && ch <= '9') {\n                    if (exponent < 500) {\n                        exponent = exponent * 10 + (ch - '0');\n                    }\n                    saveName(ch);\n                    ch = getChar();\n                }\n            } else {\n                parseContext.ppError(ppToken->loc, \"bad character in float exponent\", \"\", \"\");\n            }\n        }\n\n        // Compensate for location of decimal\n        if (negativeExponent)\n            exponent -= decimalShift;\n        else {\n            exponent += decimalShift;\n            if (exponent < 0) {\n                negativeExponent = true;\n                exponent = -exponent;\n            }\n        }\n        if (exponent > 22)\n            fastPath = false;\n\n        if (fastPath) {\n            // Compute the floating-point value of the exponent\n            exponentValue = 1.0;\n            if (exponent > 0) {\n                double expFactor = 10;\n                while (exponent > 0) {\n                    if (exponent & 0x1)\n                        exponentValue *= expFactor;\n                    expFactor *= expFactor;\n                    exponent >>= 1;\n                }\n            }\n        }\n    }\n\n    // Suffix:\n    bool isDouble = false;\n    bool isFloat16 = false;\n    if (ch == 'l' || ch == 'L') {\n        if (ifdepth == 0 && parseContext.intermediate.getSource() == EShSourceGlsl)\n            parseContext.doubleCheck(ppToken->loc, \"double floating-point suffix\");\n        if (ifdepth == 0 && !hasDecimalOrExponent)\n            parseContext.ppError(ppToken->loc, \"float literal needs a decimal point or exponent\", \"\", \"\");\n        if (parseContext.intermediate.getSource() == EShSourceGlsl) {\n            int ch2 = getChar();\n            if (ch2 != 'f' && ch2 != 'F') {\n                ungetChar();\n                ungetChar();\n            } else {\n                saveName(ch);\n                saveName(ch2);\n                isDouble = true;\n            }\n        } else if (parseContext.intermediate.getSource() == EShSourceHlsl) {\n            saveName(ch);\n            isDouble = true;\n        }\n    } else if (ch == 'h' || ch == 'H') {\n        if (ifdepth == 0 && parseContext.intermediate.getSource() == EShSourceGlsl)\n            parseContext.float16Check(ppToken->loc, \"half floating-point suffix\");\n        if (ifdepth == 0 && !hasDecimalOrExponent)\n            parseContext.ppError(ppToken->loc, \"float literal needs a decimal point or exponent\", \"\", \"\");\n        if (parseContext.intermediate.getSource() == EShSourceGlsl) {\n            int ch2 = getChar();\n            if (ch2 != 'f' && ch2 != 'F') {\n                ungetChar();\n                ungetChar();\n            } else {\n                saveName(ch);\n                saveName(ch2);\n                isFloat16 = true;\n            }\n        } else if (parseContext.intermediate.getSource() == EShSourceHlsl) {\n            saveName(ch);\n            isFloat16 = true;\n        }\n    } else\n    if (ch == 'f' || ch == 'F') {\n        if (ifdepth == 0)\n            parseContext.profileRequires(ppToken->loc,  EEsProfile, 300, nullptr, \"floating-point suffix\");\n        if (ifdepth == 0 && !parseContext.relaxedErrors())\n            parseContext.profileRequires(ppToken->loc, ~EEsProfile, 120, nullptr, \"floating-point suffix\");\n        if (ifdepth == 0 && !hasDecimalOrExponent)\n            parseContext.ppError(ppToken->loc, \"float literal needs a decimal point or exponent\", \"\", \"\");\n        saveName(ch);\n    } else\n        ungetChar();\n\n    // Patch up the name and length for overflow\n\n    if (len > MaxTokenLength) {\n        len = MaxTokenLength;\n        parseContext.ppError(ppToken->loc, \"float literal too long\", \"\", \"\");\n    }\n    ppToken->name[len] = '\\0';\n\n    // Compute the numerical value\n    if (fastPath) {\n        // compute the floating-point value of the exponent\n        if (exponentValue == 0.0)\n            ppToken->dval = (double)wholeNumber;\n        else if (negativeExponent)\n            ppToken->dval = (double)wholeNumber / exponentValue;\n        else\n            ppToken->dval = (double)wholeNumber * exponentValue;\n    } else {\n        // slow path\n        ppToken->dval = 0.0;\n\n        // remove suffix\n        TString numstr(ppToken->name);\n        if (numstr.back() == 'f' || numstr.back() == 'F')\n            numstr.pop_back();\n        if (numstr.back() == 'h' || numstr.back() == 'H')\n            numstr.pop_back();\n        if (numstr.back() == 'l' || numstr.back() == 'L')\n            numstr.pop_back();\n\n        // use platform library\n        strtodStream.clear();\n        strtodStream.str(numstr.c_str());\n        strtodStream >> ppToken->dval;\n        if (strtodStream.fail()) {\n            // Assume failure combined with a large exponent was overflow, in\n            // an attempt to set INF.\n            if (!negativeExponent && exponent + numWholeNumberDigits > 300)\n                ppToken->i64val = 0x7ff0000000000000; // +Infinity\n            // Assume failure combined with a small exponent was overflow.\n            if (negativeExponent && exponent + numWholeNumberDigits > 300)\n                ppToken->dval = 0.0;\n            // Unknown reason for failure. Theory is that either\n            //  - the 0.0 is still there, or\n            //  - something reasonable was written that is better than 0.0\n        }\n    }\n\n    // Return the right token type\n    if (isDouble)\n        return PpAtomConstDouble;\n    else if (isFloat16)\n        return PpAtomConstFloat16;\n    else\n        return PpAtomConstFloat;\n}\n\n// Recognize a character literal.\n//\n// The first ' has already been accepted, read the rest, through the closing '.\n//\n// Always returns PpAtomConstInt.\n//\nint TPpContext::characterLiteral(TPpToken* ppToken)\n{\n    ppToken->name[0] = 0;\n    ppToken->ival = 0;\n\n    if (parseContext.intermediate.getSource() != EShSourceHlsl) {\n        // illegal, except in macro definition, for which case we report the character\n        return '\\'';\n    }\n\n    int ch = getChar();\n    switch (ch) {\n    case '\\'':\n        // As empty sequence:  ''\n        parseContext.ppError(ppToken->loc, \"unexpected\", \"\\'\", \"\");\n        return PpAtomConstInt;\n    case '\\\\':\n        // As escape sequence:  '\\XXX'\n        switch (ch = getChar()) {\n        case 'a':\n            ppToken->ival = 7;\n            break;\n        case 'b':\n            ppToken->ival = 8;\n            break;\n        case 't':\n            ppToken->ival = 9;\n            break;\n        case 'n':\n            ppToken->ival = 10;\n            break;\n        case 'v':\n            ppToken->ival = 11;\n            break;\n        case 'f':\n            ppToken->ival = 12;\n            break;\n        case 'r':\n            ppToken->ival = 13;\n            break;\n        case 'x':\n        case '0':\n            parseContext.ppError(ppToken->loc, \"octal and hex sequences not supported\", \"\\\\\", \"\");\n            break;\n        default:\n            // This catches '\\'', '\\\"', '\\?', etc.\n            // Also, things like '\\C' mean the same thing as 'C'\n            // (after the above cases are filtered out).\n            ppToken->ival = ch;\n            break;\n        }\n        break;\n    default:\n        ppToken->ival = ch;\n        break;\n    }\n    ppToken->name[0] = (char)ppToken->ival;\n    ppToken->name[1] = '\\0';\n    ch = getChar();\n    if (ch != '\\'') {\n        parseContext.ppError(ppToken->loc, \"expected\", \"\\'\", \"\");\n        // Look ahead for a closing '\n        do {\n            ch = getChar();\n        } while (ch != '\\'' && ch != EndOfInput && ch != '\\n');\n    }\n\n    return PpAtomConstInt;\n}\n\n//\n// Scanner used to tokenize source stream.\n//\n// N.B. Invalid numeric suffixes are not consumed.//\n// This is technically not correct, as the preprocessor should just\n// accept the numeric literal along with whatever suffix it has, but\n// currently, it stops on seeing a bad suffix, treating that as the\n// next token. This effects things like token pasting, where it is\n// relevant how many tokens something was broken into.\n// See peekContinuedPasting().\n//\nint TPpContext::tStringInput::scan(TPpToken* ppToken)\n{\n    int AlreadyComplained = 0;\n    int len = 0;\n    int ch = 0;\n    int ii = 0;\n    unsigned long long ival = 0;\n    const auto floatingPointChar = [&](int ch) { return ch == '.' || ch == 'e' || ch == 'E' ||\n                                                                     ch == 'f' || ch == 'F' ||\n                                                                     ch == 'h' || ch == 'H'; };\n\n    static const char* const Int64_Extensions[] = {\n        E_GL_ARB_gpu_shader_int64,\n        E_GL_EXT_shader_explicit_arithmetic_types,\n        E_GL_NV_gpu_shader5,\n        E_GL_EXT_shader_explicit_arithmetic_types_int64 };\n    static const int Num_Int64_Extensions = sizeof(Int64_Extensions) / sizeof(Int64_Extensions[0]);\n\n    static const char* const Int16_Extensions[] = {\n        E_GL_AMD_gpu_shader_int16,\n        E_GL_EXT_shader_explicit_arithmetic_types,\n        E_GL_EXT_shader_explicit_arithmetic_types_int16 };\n    static const int Num_Int16_Extensions = sizeof(Int16_Extensions) / sizeof(Int16_Extensions[0]);\n\n    ppToken->clear();\n    ch = getch();\n    for (;;) {\n        while (ch == ' ' || ch == '\\t') {\n            ppToken->space = true;\n            ch = getch();\n        }\n\n        ppToken->loc = pp->parseContext.getCurrentLoc();\n        len = 0;\n        switch (ch) {\n        default:\n            // Single character token, including EndOfInput, '#' and '\\' (escaped newlines are handled at a lower level, so this is just a '\\' token)\n            if (ch > PpAtomMaxSingle)\n                ch = PpAtomBadToken;\n            return ch;\n\n        case 'A': case 'B': case 'C': case 'D': case 'E':\n        case 'F': case 'G': case 'H': case 'I': case 'J':\n        case 'K': case 'L': case 'M': case 'N': case 'O':\n        case 'P': case 'Q': case 'R': case 'S': case 'T':\n        case 'U': case 'V': case 'W': case 'X': case 'Y':\n        case 'Z': case '_':\n        case 'a': case 'b': case 'c': case 'd': case 'e':\n        case 'f': case 'g': case 'h': case 'i': case 'j':\n        case 'k': case 'l': case 'm': case 'n': case 'o':\n        case 'p': case 'q': case 'r': case 's': case 't':\n        case 'u': case 'v': case 'w': case 'x': case 'y':\n        case 'z':\n            do {\n                if (len < MaxTokenLength) {\n                    ppToken->name[len++] = (char)ch;\n                    ch = getch();\n                } else {\n                    if (! AlreadyComplained) {\n                        pp->parseContext.ppError(ppToken->loc, \"name too long\", \"\", \"\");\n                        AlreadyComplained = 1;\n                    }\n                    ch = getch();\n                }\n            } while ((ch >= 'a' && ch <= 'z') ||\n                     (ch >= 'A' && ch <= 'Z') ||\n                     (ch >= '0' && ch <= '9') ||\n                     ch == '_');\n\n            // line continuation with no token before or after makes len == 0, and need to start over skipping white space, etc.\n            if (len == 0)\n                continue;\n\n            ppToken->name[len] = '\\0';\n            ungetch();\n            return PpAtomIdentifier;\n        case '0':\n            ppToken->name[len++] = (char)ch;\n            ch = getch();\n            if (ch == 'x' || ch == 'X') {\n                // must be hexadecimal\n\n                bool isUnsigned = false;\n                bool isInt64 = false;\n                bool isInt16 = false;\n                ppToken->name[len++] = (char)ch;\n                ch = getch();\n                if ((ch >= '0' && ch <= '9') ||\n                    (ch >= 'A' && ch <= 'F') ||\n                    (ch >= 'a' && ch <= 'f')) {\n\n                    ival = 0;\n                    do {\n                        if (len < MaxTokenLength && ival <= 0x7fffffffffffffffull) {\n                            ppToken->name[len++] = (char)ch;\n                            if (ch >= '0' && ch <= '9') {\n                                ii = ch - '0';\n                            } else if (ch >= 'A' && ch <= 'F') {\n                                ii = ch - 'A' + 10;\n                            } else if (ch >= 'a' && ch <= 'f') {\n                                ii = ch - 'a' + 10;\n                            } else\n                                pp->parseContext.ppError(ppToken->loc, \"bad digit in hexadecimal literal\", \"\", \"\");\n                            ival = (ival << 4) | ii;\n                        } else {\n                            if (! AlreadyComplained) {\n                                if(len < MaxTokenLength)\n                                    pp->parseContext.ppError(ppToken->loc, \"hexadecimal literal too big\", \"\", \"\");\n                                else\n                                    pp->parseContext.ppError(ppToken->loc, \"hexadecimal literal too long\", \"\", \"\");\n                                AlreadyComplained = 1;\n                            }\n                            ival = 0xffffffffffffffffull;\n                        }\n                        ch = getch();\n                    } while ((ch >= '0' && ch <= '9') ||\n                             (ch >= 'A' && ch <= 'F') ||\n                             (ch >= 'a' && ch <= 'f'));\n                } else {\n                    pp->parseContext.ppError(ppToken->loc, \"bad digit in hexadecimal literal\", \"\", \"\");\n                }\n                if (ch == 'u' || ch == 'U') {\n                    if (len < MaxTokenLength)\n                        ppToken->name[len++] = (char)ch;\n                    isUnsigned = true;\n\n                    int nextCh = getch();\n                    if (nextCh == 'l' || nextCh == 'L') {\n                        if (len < MaxTokenLength)\n                            ppToken->name[len++] = (char)nextCh;\n                        isInt64 = true;\n                    } else\n                        ungetch();\n\n                    nextCh = getch();\n                    if ((nextCh == 's' || nextCh == 'S') &&\n                            pp->parseContext.intermediate.getSource() == EShSourceGlsl) {\n                        if (len < MaxTokenLength)\n                            ppToken->name[len++] = (char)nextCh;\n                        isInt16 = true;\n                    } else\n                        ungetch();\n                } else if (ch == 'l' || ch == 'L') {\n                    if (len < MaxTokenLength)\n                        ppToken->name[len++] = (char)ch;\n                    isInt64 = true;\n                } else if ((ch == 's' || ch == 'S') &&\n                           pp->parseContext.intermediate.getSource() == EShSourceGlsl) {\n                    if (len < MaxTokenLength)\n                        ppToken->name[len++] = (char)ch;\n                    isInt16 = true;\n                } else\n                    ungetch();\n                ppToken->name[len] = '\\0';\n\n                if (isInt64 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) {\n                    if (pp->ifdepth == 0) {\n                        pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,\n                                                        \"64-bit hexadecimal literal\");\n                        pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,\n                            Num_Int64_Extensions, Int64_Extensions, \"64-bit hexadecimal literal\");\n                    }\n                    ppToken->i64val = ival;\n                    return isUnsigned ? PpAtomConstUint64 : PpAtomConstInt64;\n                } else if (isInt16) {\n                    if (pp->ifdepth == 0) {\n                        if (pp->parseContext.intermediate.getSource() == EShSourceGlsl) {\n                            pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,\n                                                             \"16-bit hexadecimal literal\");\n                            pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,\n                                Num_Int16_Extensions, Int16_Extensions, \"16-bit hexadecimal literal\");\n                        }\n                    }\n                    ppToken->ival = (int)ival;\n                    return isUnsigned ? PpAtomConstUint16 : PpAtomConstInt16;\n                } else {\n                    if (ival > 0xffffffffu && !AlreadyComplained)\n                        pp->parseContext.ppError(ppToken->loc, \"hexadecimal literal too big\", \"\", \"\");\n                    ppToken->ival = (int)ival;\n                    return isUnsigned ? PpAtomConstUint : PpAtomConstInt;\n                }\n            } else if ((ch == 'b' || ch == 'B') && pp->parseContext.intermediate.getSource() == EShSourceHlsl) {\n                // must be binary\n                bool isUnsigned = false;\n                bool isInt64 = false;\n                bool isInt16 = false;\n                ppToken->name[len++] = (char)ch;\n                ch = getch();\n\n                // Check value\n                if ((ch == '0' || ch == '1'))\n                {\n                    ival = 0;\n                    do {\n                        if (len < MaxTokenLength && ival <= 0x7fffffffffffffffull) {\n                            ppToken->name[len++] = (char)ch;\n                            if (ch == '0' || ch == '1') {\n                                ii = ch - '0';\n                            } else {\n                                pp->parseContext.ppError(ppToken->loc, \"bad digit in binary literal\", \"\", \"\");\n                            }\n                            ival = (ival << 1) | ii;\n                        }\n                        else\n                        {\n                            if (! AlreadyComplained) {\n                                if(len < MaxTokenLength)\n                                    pp->parseContext.ppError(ppToken->loc, \"binary literal too big\", \"\", \"\");\n                                else\n                                    pp->parseContext.ppError(ppToken->loc, \"binary literal too long\", \"\", \"\");\n                                AlreadyComplained = 1;\n                            }\n                            ival = 0xffffffffffffffffull;\n                        }\n                        ch = getch();\n                    } while (ch == '0' || ch == '1');\n                }\n                else\n                {\n                   pp->parseContext.ppError(ppToken->loc, \"bad digit in binary literal\", \"\", \"\");\n                }\n\n                // check type\n                if (ch == 'u' || ch == 'U') {\n                    if (len < MaxTokenLength)\n                        ppToken->name[len++] = (char)ch;\n                    isUnsigned = true;\n\n                    int nextCh = getch();\n                    if (nextCh == 'l' || nextCh == 'L') {\n                        if (len < MaxTokenLength)\n                            ppToken->name[len++] = (char)nextCh;\n                        isInt64 = true;\n                    } else\n                        ungetch();\n\n                    nextCh = getch();\n                    if ((nextCh == 's' || nextCh == 'S') &&\n                                pp->parseContext.intermediate.getSource() == EShSourceGlsl) {\n                        if (len < MaxTokenLength)\n                            ppToken->name[len++] = (char)nextCh;\n                        isInt16 = true;\n                    } else\n                        ungetch();\n                } else if (ch == 'l' || ch == 'L') {\n                    if (len < MaxTokenLength)\n                        ppToken->name[len++] = (char)ch;\n                    isInt64 = true;\n                } else if ((ch == 's' || ch == 'S') &&\n                                pp->parseContext.intermediate.getSource() == EShSourceGlsl) {\n                    if (len < MaxTokenLength)\n                        ppToken->name[len++] = (char)ch;\n                    isInt16 = true;\n                } else {\n                    ungetch();\n                }\n                ppToken->name[len] = '\\0';\n\n                // Assign value\n                if (isInt64 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) {\n                    if (pp->ifdepth == 0) {\n                        pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,\n                                                        \"64-bit binary literal\");\n                        pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,\n                            Num_Int64_Extensions, Int64_Extensions, \"64-bit binary literal\");\n                    }\n                    ppToken->i64val = ival;\n                    return isUnsigned ? PpAtomConstUint64 : PpAtomConstInt64;\n                } else if (isInt16) {\n                    if (pp->ifdepth == 0) {\n                        if (pp->parseContext.intermediate.getSource() == EShSourceGlsl) {\n                            pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,\n                                                            \"16-bit binary literal\");\n                            pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,\n                                Num_Int16_Extensions, Int16_Extensions, \"16-bit binary literal\");\n                        }\n                    }\n                    ppToken->ival = (int)ival;\n                    return isUnsigned ? PpAtomConstUint16 : PpAtomConstInt16;\n                } else {\n                    ppToken->ival = (int)ival;\n                    return isUnsigned ? PpAtomConstUint : PpAtomConstInt;\n                }\n            } else {\n                // could be octal integer or floating point, speculative pursue octal until it must be floating point\n\n                bool isUnsigned = false;\n                bool isInt64 = false;\n                bool isInt16 = false;\n                bool octalOverflow = false;\n                bool nonOctal = false;\n                ival = 0;\n\n                // see how much octal-like stuff we can read\n                while (ch >= '0' && ch <= '7') {\n                    if (len < MaxTokenLength)\n                        ppToken->name[len++] = (char)ch;\n                    else if (! AlreadyComplained) {\n                        pp->parseContext.ppError(ppToken->loc, \"numeric literal too long\", \"\", \"\");\n                        AlreadyComplained = 1;\n                    }\n                    if (ival <= 0x1fffffffffffffffull) {\n                        ii = ch - '0';\n                        ival = (ival << 3) | ii;\n                    } else\n                        octalOverflow = true;\n                    ch = getch();\n                }\n\n                // could be part of a float...\n                if (ch == '8' || ch == '9') {\n                    nonOctal = true;\n                    do {\n                        if (len < MaxTokenLength)\n                            ppToken->name[len++] = (char)ch;\n                        else if (! AlreadyComplained) {\n                            pp->parseContext.ppError(ppToken->loc, \"numeric literal too long\", \"\", \"\");\n                            AlreadyComplained = 1;\n                        }\n                        ch = getch();\n                    } while (ch >= '0' && ch <= '9');\n                }\n                if (floatingPointChar(ch))\n                    return pp->lFloatConst(len, ch, ppToken);\n\n                // wasn't a float, so must be octal...\n                if (nonOctal)\n                    pp->parseContext.ppError(ppToken->loc, \"octal literal digit too large\", \"\", \"\");\n\n                if (ch == 'u' || ch == 'U') {\n                    if (len < MaxTokenLength)\n                        ppToken->name[len++] = (char)ch;\n                    isUnsigned = true;\n\n                    int nextCh = getch();\n                    if (nextCh == 'l' || nextCh == 'L') {\n                        if (len < MaxTokenLength)\n                            ppToken->name[len++] = (char)nextCh;\n                        isInt64 = true;\n                    } else\n                        ungetch();\n\n                    nextCh = getch();\n                    if ((nextCh == 's' || nextCh == 'S') && \n                                pp->parseContext.intermediate.getSource() == EShSourceGlsl) {\n                        if (len < MaxTokenLength)\n                            ppToken->name[len++] = (char)nextCh;\n                        isInt16 = true;\n                    } else\n                        ungetch();\n                } else if (ch == 'l' || ch == 'L') {\n                    if (len < MaxTokenLength)\n                        ppToken->name[len++] = (char)ch;\n                    isInt64 = true;\n                } else if ((ch == 's' || ch == 'S') && \n                                pp->parseContext.intermediate.getSource() == EShSourceGlsl) {\n                    if (len < MaxTokenLength)\n                        ppToken->name[len++] = (char)ch;\n                    isInt16 = true;\n                } else\n                    ungetch();\n                ppToken->name[len] = '\\0';\n\n                if (!isInt64 && ival > 0xffffffffu)\n                    octalOverflow = true;\n\n                if (octalOverflow)\n                    pp->parseContext.ppError(ppToken->loc, \"octal literal too big\", \"\", \"\");\n\n                if (isInt64 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) {\n                    if (pp->ifdepth == 0) {\n                        pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,\n                                                        \"64-bit octal literal\");\n                        pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,\n                            Num_Int64_Extensions, Int64_Extensions, \"64-bit octal literal\");\n                    }\n                    ppToken->i64val = ival;\n                    return isUnsigned ? PpAtomConstUint64 : PpAtomConstInt64;\n                } else if (isInt16) {\n                    if (pp->ifdepth == 0) {\n                        if (pp->parseContext.intermediate.getSource() == EShSourceGlsl) {\n                            pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,\n                                                            \"16-bit octal literal\");\n                            pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,\n                                Num_Int16_Extensions, Int16_Extensions, \"16-bit octal literal\");\n                        }\n                    }\n                    ppToken->ival = (int)ival;\n                    return isUnsigned ? PpAtomConstUint16 : PpAtomConstInt16;\n                } else {\n                    ppToken->ival = (int)ival;\n                    return isUnsigned ? PpAtomConstUint : PpAtomConstInt;\n                }\n            }\n            break;\n        case '1': case '2': case '3': case '4':\n        case '5': case '6': case '7': case '8': case '9':\n            // can't be hexadecimal or octal, is either decimal or floating point\n\n            do {\n                if (len < MaxTokenLength)\n                    ppToken->name[len++] = (char)ch;\n                else if (! AlreadyComplained) {\n                    pp->parseContext.ppError(ppToken->loc, \"numeric literal too long\", \"\", \"\");\n                    AlreadyComplained = 1;\n                }\n                ch = getch();\n            } while (ch >= '0' && ch <= '9');\n            if (floatingPointChar(ch))\n                return pp->lFloatConst(len, ch, ppToken);\n            else {\n                // Finish handling signed and unsigned integers\n                int numericLen = len;\n                bool isUnsigned = false;\n                bool isInt64 = false;\n                bool isInt16 = false;\n                if (ch == 'u' || ch == 'U') {\n                    if (len < MaxTokenLength)\n                        ppToken->name[len++] = (char)ch;\n                    isUnsigned = true;\n\n                    int nextCh = getch();\n                    if (nextCh == 'l' || nextCh == 'L') {\n                        if (len < MaxTokenLength)\n                            ppToken->name[len++] = (char)nextCh;\n                        isInt64 = true;\n                    } else\n                        ungetch();\n\n                    nextCh = getch();\n                    if ((nextCh == 's' || nextCh == 'S') &&\n                                pp->parseContext.intermediate.getSource() == EShSourceGlsl) {\n                        if (len < MaxTokenLength)\n                            ppToken->name[len++] = (char)nextCh;\n                        isInt16 = true;\n                    } else\n                        ungetch();\n                } else if (ch == 'l' || ch == 'L') {\n                    if (len < MaxTokenLength)\n                        ppToken->name[len++] = (char)ch;\n                    isInt64 = true;\n                } else if ((ch == 's' || ch == 'S') &&\n                                pp->parseContext.intermediate.getSource() == EShSourceGlsl) {\n                    if (len < MaxTokenLength)\n                        ppToken->name[len++] = (char)ch;\n                    isInt16 = true;\n                } else\n                    ungetch();\n\n                ppToken->name[len] = '\\0';\n                ival = 0;\n                const unsigned oneTenthMaxInt  = 0xFFFFFFFFu / 10;\n                const unsigned remainderMaxInt = 0xFFFFFFFFu - 10 * oneTenthMaxInt;\n                const unsigned long long oneTenthMaxInt64  = 0xFFFFFFFFFFFFFFFFull / 10;\n                const unsigned long long remainderMaxInt64 = 0xFFFFFFFFFFFFFFFFull - 10 * oneTenthMaxInt64;\n                const unsigned short oneTenthMaxInt16  = 0xFFFFu / 10;\n                const unsigned short remainderMaxInt16 = 0xFFFFu - 10 * oneTenthMaxInt16;\n                for (int i = 0; i < numericLen; i++) {\n                    ch = ppToken->name[i] - '0';\n                    bool overflow = false;\n                    if (isInt64)\n                        overflow = (ival > oneTenthMaxInt64 || (ival == oneTenthMaxInt64 && (unsigned long long)ch > remainderMaxInt64));\n                    else if (isInt16)\n                        overflow = (ival > oneTenthMaxInt16 || (ival == oneTenthMaxInt16 && (unsigned short)ch > remainderMaxInt16));\n                    else\n                        overflow = (ival > oneTenthMaxInt || (ival == oneTenthMaxInt && (unsigned)ch > remainderMaxInt));\n                    if (overflow) {\n                        pp->parseContext.ppError(ppToken->loc, \"numeric literal too big\", \"\", \"\");\n                        ival = 0xFFFFFFFFFFFFFFFFull;\n                        break;\n                    } else\n                        ival = ival * 10 + ch;\n                }\n\n                if (isInt64 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) {\n                    if (pp->ifdepth == 0) {\n                        pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,\n                                                        \"64-bit literal\");\n                        pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,\n                            Num_Int64_Extensions, Int64_Extensions, \"64-bit literal\");\n                    }\n                    ppToken->i64val = ival;\n                    return isUnsigned ? PpAtomConstUint64 : PpAtomConstInt64;\n                } else if (isInt16) {\n                    if (pp->ifdepth == 0 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) {\n                        pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,\n                                                        \"16-bit  literal\");\n                        pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,\n                            Num_Int16_Extensions, Int16_Extensions, \"16-bit literal\");\n                    }\n                    ppToken->ival = (int)ival;\n                    return isUnsigned ? PpAtomConstUint16 : PpAtomConstInt16;\n                } else {\n                    ppToken->ival = (int)ival;\n                    return isUnsigned ? PpAtomConstUint : PpAtomConstInt;\n                }\n            }\n            break;\n        case '-':\n            ch = getch();\n            if (ch == '-') {\n                return PpAtomDecrement;\n            } else if (ch == '=') {\n                return PPAtomSubAssign;\n            } else {\n                ungetch();\n                return '-';\n            }\n        case '+':\n            ch = getch();\n            if (ch == '+') {\n                return PpAtomIncrement;\n            } else if (ch == '=') {\n                return PPAtomAddAssign;\n            } else {\n                ungetch();\n                return '+';\n            }\n        case '*':\n            ch = getch();\n            if (ch == '=') {\n                return PPAtomMulAssign;\n            } else {\n                ungetch();\n                return '*';\n            }\n        case '%':\n            ch = getch();\n            if (ch == '=') {\n                return PPAtomModAssign;\n            } else {\n                ungetch();\n                return '%';\n            }\n        case '^':\n            ch = getch();\n            if (ch == '^') {\n                return PpAtomXor;\n            } else {\n                if (ch == '=')\n                    return PpAtomXorAssign;\n                else{\n                    ungetch();\n                    return '^';\n                }\n            }\n\n        case '=':\n            ch = getch();\n            if (ch == '=') {\n                return PpAtomEQ;\n            } else {\n                ungetch();\n                return '=';\n            }\n        case '!':\n            ch = getch();\n            if (ch == '=') {\n                return PpAtomNE;\n            } else {\n                ungetch();\n                return '!';\n            }\n        case '|':\n            ch = getch();\n            if (ch == '|') {\n                return PpAtomOr;\n            } else if (ch == '=') {\n                return PpAtomOrAssign;\n            } else {\n                ungetch();\n                return '|';\n            }\n        case '&':\n            ch = getch();\n            if (ch == '&') {\n                return PpAtomAnd;\n            } else if (ch == '=') {\n                return PpAtomAndAssign;\n            } else {\n                ungetch();\n                return '&';\n            }\n        case '<':\n            ch = getch();\n            if (ch == '<') {\n                ch = getch();\n                if (ch == '=')\n                    return PpAtomLeftAssign;\n                else {\n                    ungetch();\n                    return PpAtomLeft;\n                }\n            } else if (ch == '=') {\n                return PpAtomLE;\n            } else {\n                ungetch();\n                return '<';\n            }\n        case '>':\n            ch = getch();\n            if (ch == '>') {\n                ch = getch();\n                if (ch == '=')\n                    return PpAtomRightAssign;\n                else {\n                    ungetch();\n                    return PpAtomRight;\n                }\n            } else if (ch == '=') {\n                return PpAtomGE;\n            } else {\n                ungetch();\n                return '>';\n            }\n        case '.':\n            ch = getch();\n            if (ch >= '0' && ch <= '9') {\n                ungetch();\n                return pp->lFloatConst(0, '.', ppToken);\n            } else {\n                ungetch();\n                return '.';\n            }\n        case '/':\n            ch = getch();\n            if (ch == '/') {\n                pp->inComment = true;\n                do {\n                    ch = getch();\n                } while (ch != '\\n' && ch != EndOfInput);\n                ppToken->space = true;\n                pp->inComment = false;\n\n                return ch;\n            } else if (ch == '*') {\n                ch = getch();\n                do {\n                    while (ch != '*') {\n                        if (ch == EndOfInput) {\n                            pp->parseContext.ppError(ppToken->loc, \"End of input in comment\", \"comment\", \"\");\n                            return ch;\n                        }\n                        ch = getch();\n                    }\n                    ch = getch();\n                    if (ch == EndOfInput) {\n                        pp->parseContext.ppError(ppToken->loc, \"End of input in comment\", \"comment\", \"\");\n                        return ch;\n                    }\n                } while (ch != '/');\n                ppToken->space = true;\n                // loop again to get the next token...\n                break;\n            } else if (ch == '=') {\n                return PPAtomDivAssign;\n            } else {\n                ungetch();\n                return '/';\n            }\n            break;\n        case '\\'':\n            return pp->characterLiteral(ppToken);\n        case '\"':\n            // #include uses scanHeaderName() to ignore these escape sequences.\n            ch = getch();\n            while (ch != '\"' && ch != '\\n' && ch != EndOfInput) {\n                if (len < MaxTokenLength) {\n                    if (ch == '\\\\' && !pp->disableEscapeSequences) {\n                        int nextCh = getch();\n                        switch (nextCh) {\n                        case '\\'': ch = 0x27; break;\n                        case '\"':  ch = 0x22; break;\n                        case '?':  ch = 0x3f; break;\n                        case '\\\\': ch = 0x5c; break;\n                        case 'a':  ch = 0x07; break;\n                        case 'b':  ch = 0x08; break;\n                        case 'f':  ch = 0x0c; break;\n                        case 'n':  ch = 0x0a; break;\n                        case 'r':  ch = 0x0d; break;\n                        case 't':  ch = 0x09; break;\n                        case 'v':  ch = 0x0b; break;\n                        case 'x': \n                            // Hex value, arbitrary number of characters. Terminated by the first\n                            // non-hex digit\n                            {\n                                int numDigits = 0;\n                                ch = 0;\n                                while (true) {\n                                    nextCh = getch();\n                                    if (nextCh >= '0' && nextCh <= '9')\n                                        nextCh -= '0';\n                                    else if (nextCh >= 'A' && nextCh <= 'F')\n                                        nextCh -= 'A' - 10;\n                                    else if (nextCh >= 'a' && nextCh <= 'f')\n                                        nextCh -= 'a' - 10;\n                                    else {\n                                        ungetch();\n                                        break;\n                                    }\n                                    numDigits++;\n                                    ch = ch * 0x10 + nextCh;\n                                }\n                                if (numDigits == 0) {\n                                    pp->parseContext.ppError(ppToken->loc, \"Expected hex value in escape sequence\", \"string\", \"\");\n                                }\n                                break;\n                            }\n                        case '0':\n                        case '1':\n                        case '2':\n                        case '3':\n                        case '4':\n                        case '5':\n                        case '6':\n                        case '7':\n                            // Octal value, up to three octal digits\n                            {\n                                int numDigits = 1;\n                                ch = nextCh - '0';\n                                while (numDigits < 3) {\n                                    nextCh = getch();\n                                    if (nextCh >= '0' && nextCh <= '7')\n                                        nextCh -= '0';\n                                    else {\n                                        ungetch();\n                                        break;\n                                    }\n                                    numDigits++;\n                                    ch = ch * 8 + nextCh;\n                                }\n                                break;\n                            }\n                        default:\n                            pp->parseContext.ppError(ppToken->loc, \"Invalid escape sequence\", \"string\", \"\");\n                            break;\n                        }\n                    }\n                    ppToken->name[len] = (char)ch;\n                    len++;\n                    ch = getch();\n                } else\n                    break;\n            };\n            ppToken->name[len] = '\\0';\n            if (ch != '\"') {\n                ungetch();\n                pp->parseContext.ppError(ppToken->loc, \"End of line in string\", \"string\", \"\");\n            }\n            return PpAtomConstString;\n        case ':':\n            ch = getch();\n            if (ch == ':')\n                return PpAtomColonColon;\n            ungetch();\n            return ':';\n        }\n\n        ch = getch();\n    }\n}\n\n//\n// The main functional entry point into the preprocessor, which will\n// scan the source strings to figure out and return the next processing token.\n//\n// Return the token, or EndOfInput when no more tokens.\n//\nint TPpContext::tokenize(TPpToken& ppToken)\n{\n    for(;;) {\n        int token = scanToken(&ppToken);\n\n        // Handle token-pasting logic\n        token = tokenPaste(token, ppToken);\n\n        if (token == EndOfInput) {\n            missingEndifCheck();\n            return EndOfInput;\n        }\n        if (token == '#') {\n            if (previous_token == '\\n') {\n                token = readCPPline(&ppToken);\n                if (token == EndOfInput) {\n                    missingEndifCheck();\n                    return EndOfInput;\n                }\n                continue;\n            } else {\n                parseContext.ppError(ppToken.loc, \"preprocessor directive cannot be preceded by another token\", \"#\", \"\");\n                return EndOfInput;\n            }\n        }\n        previous_token = token;\n\n        if (token == '\\n')\n            continue;\n\n        // expand macros\n        if (token == PpAtomIdentifier) {\n            switch (MacroExpand(&ppToken, false, true)) {\n            case MacroExpandNotStarted:\n                break;\n            case MacroExpandError:\n                return EndOfInput;\n            case MacroExpandStarted:\n            case MacroExpandUndef:\n                continue;\n            }\n        }\n\n        switch (token) {\n        case PpAtomIdentifier:\n        case PpAtomConstInt:\n        case PpAtomConstUint:\n        case PpAtomConstFloat:\n        case PpAtomConstInt64:\n        case PpAtomConstUint64:\n        case PpAtomConstInt16:\n        case PpAtomConstUint16:\n        case PpAtomConstDouble:\n        case PpAtomConstFloat16:\n            if (ppToken.name[0] == '\\0')\n                continue;\n            break;\n        case PpAtomConstString:\n            // HLSL allows string literals.\n            // GLSL allows string literals with GL_EXT_debug_printf.\n            if (ifdepth == 0 && parseContext.intermediate.getSource() != EShSourceHlsl) {\n              const char* const string_literal_EXTs[] = { E_GL_EXT_debug_printf, E_GL_EXT_spirv_intrinsics };\n              parseContext.requireExtensions(ppToken.loc, 2, string_literal_EXTs, \"string literal\");\n              if (!parseContext.extensionTurnedOn(E_GL_EXT_debug_printf) &&\n                  !parseContext.extensionTurnedOn(E_GL_EXT_spirv_intrinsics))\n                  continue;\n            }\n            break;\n        case '\\'':\n            parseContext.ppError(ppToken.loc, \"character literals not supported\", \"\\'\", \"\");\n            continue;\n        default:\n            snprintf(ppToken.name, sizeof(ppToken.name), \"%s\", atomStrings.getString(token));\n            break;\n        }\n\n        return token;\n    }\n}\n\n//\n// Do all token-pasting related combining of two pasted tokens when getting a\n// stream of tokens from a replacement list. Degenerates to no processing if a\n// replacement list is not the source of the token stream.\n//\nint TPpContext::tokenPaste(int token, TPpToken& ppToken)\n{\n    // starting with ## is illegal, skip to next token\n    if (token == PpAtomPaste) {\n        parseContext.ppError(ppToken.loc, \"unexpected location\", \"##\", \"\");\n        return scanToken(&ppToken);\n    }\n\n    int resultToken = token; // \"foo\" pasted with \"35\" is an identifier, not a number\n\n    // ## can be chained, process all in the chain at once\n    while (peekPasting()) {\n        TPpToken pastedPpToken;\n\n        // next token has to be ##\n        token = scanToken(&pastedPpToken);\n        assert(token == PpAtomPaste);\n\n        // This covers end of macro expansion\n        if (endOfReplacementList()) {\n            parseContext.ppError(ppToken.loc, \"unexpected location; end of replacement list\", \"##\", \"\");\n            break;\n        }\n\n        // Get the token(s) after the ##.\n        // Because of \"space\" semantics, and prior tokenization, what\n        // appeared a single token, e.g. \"3A\", might have been tokenized\n        // into two tokens \"3\" and \"A\", but the \"A\" will have 'space' set to\n        // false.  Accumulate all of these to recreate the original lexical\n        // appearing token.\n        do {\n            token = scanToken(&pastedPpToken);\n\n            // This covers end of argument expansion\n            if (token == tMarkerInput::marker) {\n                parseContext.ppError(ppToken.loc, \"unexpected location; end of argument\", \"##\", \"\");\n                return resultToken;\n            }\n\n            // get the token text\n            switch (resultToken) {\n            case PpAtomIdentifier:\n                // already have the correct text in token.names\n                break;\n            case '=':\n            case '!':\n            case '-':\n            case '~':\n            case '+':\n            case '*':\n            case '/':\n            case '%':\n            case '<':\n            case '>':\n            case '|':\n            case '^':\n            case '&':\n            case PpAtomRight:\n            case PpAtomLeft:\n            case PpAtomAnd:\n            case PpAtomOr:\n            case PpAtomXor:\n                snprintf(ppToken.name, sizeof(ppToken.name), \"%s\", atomStrings.getString(resultToken));\n                snprintf(pastedPpToken.name, sizeof(pastedPpToken.name), \"%s\", atomStrings.getString(token));\n                break;\n            default:\n                parseContext.ppError(ppToken.loc, \"not supported for these tokens\", \"##\", \"\");\n                return resultToken;\n            }\n\n            // combine the tokens\n            if (strlen(ppToken.name) + strlen(pastedPpToken.name) > MaxTokenLength) {\n                parseContext.ppError(ppToken.loc, \"combined tokens are too long\", \"##\", \"\");\n                return resultToken;\n            }\n            snprintf(&ppToken.name[0] + strlen(ppToken.name), sizeof(ppToken.name) - strlen(ppToken.name),\n                \"%s\", pastedPpToken.name);\n\n            // correct the kind of token we are making, if needed (identifiers stay identifiers)\n            if (resultToken != PpAtomIdentifier) {\n                int newToken = atomStrings.getAtom(ppToken.name);\n                if (newToken > 0)\n                    resultToken = newToken;\n                else\n                    parseContext.ppError(ppToken.loc, \"combined token is invalid\", \"##\", \"\");\n            }\n        } while (peekContinuedPasting(resultToken));\n    }\n\n    return resultToken;\n}\n\n// Checks if we've seen balanced #if...#endif\nvoid TPpContext::missingEndifCheck()\n{\n    if (ifdepth > 0)\n        parseContext.ppError(parseContext.getCurrentLoc(), \"missing #endif\", \"\", \"\");\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/preprocessor/PpTokens.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2013 LunarG, Inc.\n// Copyright (C) 2015-2018 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n/****************************************************************************\\\nCopyright (c) 2002, NVIDIA Corporation.\n\nNVIDIA Corporation(\"NVIDIA\") supplies this software to you in\nconsideration of your agreement to the following terms, and your use,\ninstallation, modification or redistribution of this NVIDIA software\nconstitutes acceptance of these terms.  If you do not agree with these\nterms, please do not use, install, modify or redistribute this NVIDIA\nsoftware.\n\nIn consideration of your agreement to abide by the following terms, and\nsubject to these terms, NVIDIA grants you a personal, non-exclusive\nlicense, under NVIDIA's copyrights in this original NVIDIA software (the\n\"NVIDIA Software\"), to use, reproduce, modify and redistribute the\nNVIDIA Software, with or without modifications, in source and/or binary\nforms; provided that if you redistribute the NVIDIA Software, you must\nretain the copyright notice of NVIDIA, this notice and the following\ntext and disclaimers in all such redistributions of the NVIDIA Software.\nNeither the name, trademarks, service marks nor logos of NVIDIA\nCorporation may be used to endorse or promote products derived from the\nNVIDIA Software without specific prior written permission from NVIDIA.\nExcept as expressly stated in this notice, no other rights or licenses\nexpress or implied, are granted by NVIDIA herein, including but not\nlimited to any patent rights that may be infringed by your derivative\nworks or by other works in which the NVIDIA Software may be\nincorporated. No hardware is licensed hereunder.\n\nTHE NVIDIA SOFTWARE IS BEING PROVIDED ON AN \"AS IS\" BASIS, WITHOUT\nWARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,\nINCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR\nITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER\nPRODUCTS.\n\nIN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,\nINCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF\nUSE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY\nOUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE\nNVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,\nTORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF\nNVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\\****************************************************************************/\n\n//\n// For recording and playing back the stream of tokens in a macro definition.\n//\n\n#ifndef _CRT_SECURE_NO_WARNINGS\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n\n#include <cassert>\n#include <cstdlib>\n#include <cstring>\n#include <cctype>\n\n#include \"PpContext.h\"\n#include \"PpTokens.h\"\n\nnamespace glslang {\n\n// Add a token (including backing string) to the end of a macro\n// token stream, for later playback.\nvoid TPpContext::TokenStream::putToken(int atom, TPpToken* ppToken)\n{\n    TokenStream::Token streamToken(atom, *ppToken);\n    stream.push_back(streamToken);\n}\n\n// Read the next token from a macro token stream.\nint TPpContext::TokenStream::getToken(TParseContextBase& parseContext, TPpToken *ppToken)\n{\n    if (atEnd())\n        return EndOfInput;\n\n    int atom = stream[currentPos++].get(*ppToken);\n    ppToken->loc = parseContext.getCurrentLoc();\n\n    // Check for ##, unless the current # is the last character\n    if (atom == '#') {\n        if (peekToken('#')) {\n            parseContext.requireProfile(ppToken->loc, ~EEsProfile, \"token pasting (##)\");\n            parseContext.profileRequires(ppToken->loc, ~EEsProfile, 130, nullptr, \"token pasting (##)\");\n            currentPos++;\n            atom = PpAtomPaste;\n        }\n    }\n\n    return atom;\n}\n\n// We are pasting if\n//   1. we are preceding a pasting operator within this stream\n// or\n//   2. the entire macro is preceding a pasting operator (lastTokenPastes)\n//      and we are also on the last token\nbool TPpContext::TokenStream::peekTokenizedPasting(bool lastTokenPastes)\n{\n    // 1. preceding ##?\n\n    size_t savePos = currentPos;\n    // skip white space\n    while (peekToken(' '))\n        ++currentPos;\n    if (peekToken(PpAtomPaste)) {\n        currentPos = savePos;\n        return true;\n    }\n\n    // 2. last token and we've been told after this there will be a ##\n\n    if (! lastTokenPastes)\n        return false;\n    // Getting here means the last token will be pasted, after this\n\n    // Are we at the last non-whitespace token?\n    savePos = currentPos;\n    bool moreTokens = false;\n    do {\n        if (atEnd())\n            break;\n        if (!peekToken(' ')) {\n            moreTokens = true;\n            break;\n        }\n        ++currentPos;\n    } while (true);\n    currentPos = savePos;\n\n    return !moreTokens;\n}\n\n// See if the next non-white-space tokens are two consecutive #\nbool TPpContext::TokenStream::peekUntokenizedPasting()\n{\n    // don't return early, have to restore this\n    size_t savePos = currentPos;\n\n    // skip white-space\n    while (peekToken(' '))\n        ++currentPos;\n\n    // check for ##\n    bool pasting = false;\n    if (peekToken('#')) {\n        ++currentPos;\n        if (peekToken('#'))\n            pasting = true;\n    }\n\n    currentPos = savePos;\n\n    return pasting;\n}\n\nvoid TPpContext::pushTokenStreamInput(TokenStream& ts, bool prepasting, bool expanded)\n{\n    pushInput(new tTokenInput(this, &ts, prepasting, expanded));\n    ts.reset();\n}\n\nint TPpContext::tUngotTokenInput::scan(TPpToken* ppToken)\n{\n    if (done)\n        return EndOfInput;\n\n    int ret = token;\n    *ppToken = lval;\n    done = true;\n\n    return ret;\n}\n\nvoid TPpContext::UngetToken(int token, TPpToken* ppToken)\n{\n    pushInput(new tUngotTokenInput(this, token, ppToken));\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/preprocessor/PpTokens.h",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n/****************************************************************************\\\nCopyright (c) 2002, NVIDIA Corporation.\n\nNVIDIA Corporation(\"NVIDIA\") supplies this software to you in\nconsideration of your agreement to the following terms, and your use,\ninstallation, modification or redistribution of this NVIDIA software\nconstitutes acceptance of these terms.  If you do not agree with these\nterms, please do not use, install, modify or redistribute this NVIDIA\nsoftware.\n\nIn consideration of your agreement to abide by the following terms, and\nsubject to these terms, NVIDIA grants you a personal, non-exclusive\nlicense, under NVIDIA's copyrights in this original NVIDIA software (the\n\"NVIDIA Software\"), to use, reproduce, modify and redistribute the\nNVIDIA Software, with or without modifications, in source and/or binary\nforms; provided that if you redistribute the NVIDIA Software, you must\nretain the copyright notice of NVIDIA, this notice and the following\ntext and disclaimers in all such redistributions of the NVIDIA Software.\nNeither the name, trademarks, service marks nor logos of NVIDIA\nCorporation may be used to endorse or promote products derived from the\nNVIDIA Software without specific prior written permission from NVIDIA.\nExcept as expressly stated in this notice, no other rights or licenses\nexpress or implied, are granted by NVIDIA herein, including but not\nlimited to any patent rights that may be infringed by your derivative\nworks or by other works in which the NVIDIA Software may be\nincorporated. No hardware is licensed hereunder.\n\nTHE NVIDIA SOFTWARE IS BEING PROVIDED ON AN \"AS IS\" BASIS, WITHOUT\nWARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,\nINCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR\nITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER\nPRODUCTS.\n\nIN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,\nINCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF\nUSE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY\nOUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE\nNVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,\nTORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF\nNVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\\****************************************************************************/\n\n#ifndef PARSER_H\n#define PARSER_H\n\nnamespace glslang {\n\n// Multi-character tokens\nenum EFixedAtoms {\n    // single character tokens get their own char value as their token; start here for multi-character tokens\n    PpAtomMaxSingle = 127,\n\n    // replace bad character tokens with this, to avoid accidental aliasing with the below\n    PpAtomBadToken,\n\n    // Operators\n\n    PPAtomAddAssign,\n    PPAtomSubAssign,\n    PPAtomMulAssign,\n    PPAtomDivAssign,\n    PPAtomModAssign,\n\n    PpAtomRight,\n    PpAtomLeft,\n\n    PpAtomRightAssign,\n    PpAtomLeftAssign,\n    PpAtomAndAssign,\n    PpAtomOrAssign,\n    PpAtomXorAssign,\n\n    PpAtomAnd,\n    PpAtomOr,\n    PpAtomXor,\n\n    PpAtomEQ,\n    PpAtomNE,\n    PpAtomGE,\n    PpAtomLE,\n\n    PpAtomDecrement,\n    PpAtomIncrement,\n\n    PpAtomColonColon,\n\n    PpAtomPaste,\n\n    // Constants\n\n    PpAtomConstInt,\n    PpAtomConstUint,\n    PpAtomConstInt64,\n    PpAtomConstUint64,\n    PpAtomConstInt16,\n    PpAtomConstUint16,\n    PpAtomConstFloat,\n    PpAtomConstDouble,\n    PpAtomConstFloat16,\n    PpAtomConstString,\n\n    // Identifiers\n    PpAtomIdentifier,\n\n    // preprocessor \"keywords\"\n\n    PpAtomDefine,\n    PpAtomUndef,\n\n    PpAtomIf,\n    PpAtomIfdef,\n    PpAtomIfndef,\n    PpAtomElse,\n    PpAtomElif,\n    PpAtomEndif,\n\n    PpAtomLine,\n    PpAtomPragma,\n    PpAtomError,\n\n    // #version ...\n    PpAtomVersion,\n    PpAtomCore,\n    PpAtomCompatibility,\n    PpAtomEs,\n\n    // #extension\n    PpAtomExtension,\n\n    // __LINE__, __FILE__, __VERSION__\n\n    PpAtomLineMacro,\n    PpAtomFileMacro,\n    PpAtomVersionMacro,\n\n    // #include\n    PpAtomInclude,\n\n    PpAtomLast,\n};\n\n} // end namespace glslang\n\n#endif /* not PARSER_H */\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/propagateNoContraction.cpp",
    "content": "//\n// Copyright (C) 2015-2016 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of Google Inc. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Visit the nodes in the glslang intermediate tree representation to\n// propagate the 'noContraction' qualifier.\n//\n\n#include \"propagateNoContraction.h\"\n\n#include <cstdlib>\n#include <string>\n#include <tuple>\n#include <unordered_map>\n#include <unordered_set>\n\n#include \"localintermediate.h\"\nnamespace {\n\n// Use a string to hold the access chain information, as in most cases the\n// access chain is short and may contain only one element, which is the symbol\n// ID.\n// Example: struct {float a; float b;} s;\n//  Object s.a will be represented with: <symbol ID of s>/0\n//  Object s.b will be represented with: <symbol ID of s>/1\n//  Object s will be represented with: <symbol ID of s>\n// For members of vector, matrix and arrays, they will be represented with the\n// same symbol ID of their container symbol objects. This is because their\n// preciseness is always the same as their container symbol objects.\ntypedef std::string ObjectAccessChain;\n\n// The delimiter used in the ObjectAccessChain string to separate symbol ID and\n// different level of struct indices.\nconst char ObjectAccesschainDelimiter = '/';\n\n// Mapping from Symbol IDs of symbol nodes, to their defining operation\n// nodes.\ntypedef std::unordered_multimap<ObjectAccessChain, glslang::TIntermOperator*> NodeMapping;\n// Mapping from object nodes to their access chain info string.\ntypedef std::unordered_map<glslang::TIntermTyped*, ObjectAccessChain> AccessChainMapping;\n\n// Set of object IDs.\ntypedef std::unordered_set<ObjectAccessChain> ObjectAccesschainSet;\n// Set of return branch nodes.\ntypedef std::unordered_set<glslang::TIntermBranch*> ReturnBranchNodeSet;\n\n// A helper function to tell whether a node is 'noContraction'. Returns true if\n// the node has 'noContraction' qualifier, otherwise false.\nbool isPreciseObjectNode(glslang::TIntermTyped* node)\n{\n    return node->getType().getQualifier().isNoContraction();\n}\n\n// Returns true if the opcode is a dereferencing one.\nbool isDereferenceOperation(glslang::TOperator op)\n{\n    switch (op) {\n    case glslang::EOpIndexDirect:\n    case glslang::EOpIndexDirectStruct:\n    case glslang::EOpIndexIndirect:\n    case glslang::EOpVectorSwizzle:\n    case glslang::EOpMatrixSwizzle:\n        return true;\n    default:\n        return false;\n    }\n}\n\n// Returns true if the opcode leads to an assignment operation.\nbool isAssignOperation(glslang::TOperator op)\n{\n    switch (op) {\n    case glslang::EOpAssign:\n    case glslang::EOpAddAssign:\n    case glslang::EOpSubAssign:\n    case glslang::EOpMulAssign:\n    case glslang::EOpVectorTimesMatrixAssign:\n    case glslang::EOpVectorTimesScalarAssign:\n    case glslang::EOpMatrixTimesScalarAssign:\n    case glslang::EOpMatrixTimesMatrixAssign:\n    case glslang::EOpDivAssign:\n    case glslang::EOpModAssign:\n    case glslang::EOpAndAssign:\n    case glslang::EOpLeftShiftAssign:\n    case glslang::EOpRightShiftAssign:\n    case glslang::EOpInclusiveOrAssign:\n    case glslang::EOpExclusiveOrAssign:\n\n    case glslang::EOpPostIncrement:\n    case glslang::EOpPostDecrement:\n    case glslang::EOpPreIncrement:\n    case glslang::EOpPreDecrement:\n        return true;\n    default:\n        return false;\n    }\n}\n\n// A helper function to get the unsigned int from a given constant union node.\n// Note the node should only hold a uint scalar.\nunsigned getStructIndexFromConstantUnion(glslang::TIntermTyped* node)\n{\n    assert(node->getAsConstantUnion() && node->getAsConstantUnion()->isScalar());\n    unsigned struct_dereference_index = node->getAsConstantUnion()->getConstArray()[0].getUConst();\n    return struct_dereference_index;\n}\n\n// A helper function to generate symbol_label.\nObjectAccessChain generateSymbolLabel(glslang::TIntermSymbol* node)\n{\n    ObjectAccessChain symbol_id =\n        std::to_string(node->getId()) + \"(\" + node->getName().c_str() + \")\";\n    return symbol_id;\n}\n\n// Returns true if the operation is an arithmetic operation and valid for\n// the 'NoContraction' decoration.\nbool isArithmeticOperation(glslang::TOperator op)\n{\n    switch (op) {\n    case glslang::EOpAddAssign:\n    case glslang::EOpSubAssign:\n    case glslang::EOpMulAssign:\n    case glslang::EOpVectorTimesMatrixAssign:\n    case glslang::EOpVectorTimesScalarAssign:\n    case glslang::EOpMatrixTimesScalarAssign:\n    case glslang::EOpMatrixTimesMatrixAssign:\n    case glslang::EOpDivAssign:\n    case glslang::EOpModAssign:\n\n    case glslang::EOpNegative:\n\n    case glslang::EOpAdd:\n    case glslang::EOpSub:\n    case glslang::EOpMul:\n    case glslang::EOpDiv:\n    case glslang::EOpMod:\n\n    case glslang::EOpVectorTimesScalar:\n    case glslang::EOpVectorTimesMatrix:\n    case glslang::EOpMatrixTimesVector:\n    case glslang::EOpMatrixTimesScalar:\n    case glslang::EOpMatrixTimesMatrix:\n\n    case glslang::EOpDot:\n    case glslang::EOpDotPackedEXT:\n    case glslang::EOpDotAccSatEXT:\n    case glslang::EOpDotPackedAccSatEXT:\n\n    case glslang::EOpPostIncrement:\n    case glslang::EOpPostDecrement:\n    case glslang::EOpPreIncrement:\n    case glslang::EOpPreDecrement:\n        return true;\n    default:\n        return false;\n    }\n}\n\n// A helper class to help manage the populating_initial_no_contraction_ flag.\ntemplate <typename T> class StateSettingGuard {\npublic:\n    StateSettingGuard(T* state_ptr, T new_state_value)\n        : state_ptr_(state_ptr), previous_state_(*state_ptr)\n    {\n        *state_ptr = new_state_value;\n    }\n    StateSettingGuard(T* state_ptr) : state_ptr_(state_ptr), previous_state_(*state_ptr) {}\n    void setState(T new_state_value) { *state_ptr_ = new_state_value; }\n    ~StateSettingGuard() { *state_ptr_ = previous_state_; }\n\nprivate:\n    T* state_ptr_;\n    T previous_state_;\n};\n\n// A helper function to get the front element from a given ObjectAccessChain\nObjectAccessChain getFrontElement(const ObjectAccessChain& chain)\n{\n    size_t pos_delimiter = chain.find(ObjectAccesschainDelimiter);\n    return pos_delimiter == std::string::npos ? chain : chain.substr(0, pos_delimiter);\n}\n\n// A helper function to get the access chain starting from the second element.\nObjectAccessChain subAccessChainFromSecondElement(const ObjectAccessChain& chain)\n{\n    size_t pos_delimiter = chain.find(ObjectAccesschainDelimiter);\n    return pos_delimiter == std::string::npos ? \"\" : chain.substr(pos_delimiter + 1);\n}\n\n// A helper function to get the access chain after removing a given prefix.\nObjectAccessChain getSubAccessChainAfterPrefix(const ObjectAccessChain& chain,\n                                               const ObjectAccessChain& prefix)\n{\n    size_t pos = chain.find(prefix);\n    if (pos != 0)\n        return chain;\n    return chain.substr(prefix.length() + sizeof(ObjectAccesschainDelimiter));\n}\n\n//\n// A traverser which traverses the whole AST and populates:\n//  1) A mapping from symbol nodes' IDs to their defining operation nodes.\n//  2) A set of access chains of the initial precise object nodes.\n//\nclass TSymbolDefinitionCollectingTraverser : public glslang::TIntermTraverser {\npublic:\n    TSymbolDefinitionCollectingTraverser(NodeMapping* symbol_definition_mapping,\n                                         AccessChainMapping* accesschain_mapping,\n                                         ObjectAccesschainSet* precise_objects,\n                                         ReturnBranchNodeSet* precise_return_nodes);\n\n    bool visitUnary(glslang::TVisit, glslang::TIntermUnary*) override;\n    bool visitBinary(glslang::TVisit, glslang::TIntermBinary*) override;\n    void visitSymbol(glslang::TIntermSymbol*) override;\n    bool visitAggregate(glslang::TVisit, glslang::TIntermAggregate*) override;\n    bool visitBranch(glslang::TVisit, glslang::TIntermBranch*) override;\n\nprotected:\n    TSymbolDefinitionCollectingTraverser& operator=(const TSymbolDefinitionCollectingTraverser&);\n\n    // The mapping from symbol node IDs to their defining nodes. This should be\n    // populated along traversing the AST.\n    NodeMapping& symbol_definition_mapping_;\n    // The set of symbol node IDs for precise symbol nodes, the ones marked as\n    // 'noContraction'.\n    ObjectAccesschainSet& precise_objects_;\n    // The set of precise return nodes.\n    ReturnBranchNodeSet& precise_return_nodes_;\n    // A temporary cache of the symbol node whose defining node is to be found\n    // currently along traversing the AST.\n    ObjectAccessChain current_object_;\n    // A map from object node to its access chain. This traverser stores\n    // the built access chains into this map for each object node it has\n    // visited.\n    AccessChainMapping& accesschain_mapping_;\n    // The pointer to the Function Definition node, so we can get the\n    // preciseness of the return expression from it when we traverse the\n    // return branch node.\n    glslang::TIntermAggregate* current_function_definition_node_;\n};\n\nTSymbolDefinitionCollectingTraverser::TSymbolDefinitionCollectingTraverser(\n    NodeMapping* symbol_definition_mapping, AccessChainMapping* accesschain_mapping,\n    ObjectAccesschainSet* precise_objects,\n    std::unordered_set<glslang::TIntermBranch*>* precise_return_nodes)\n    : TIntermTraverser(true, false, false), symbol_definition_mapping_(*symbol_definition_mapping),\n      precise_objects_(*precise_objects), precise_return_nodes_(*precise_return_nodes),\n      current_object_(), accesschain_mapping_(*accesschain_mapping),\n      current_function_definition_node_(nullptr) {}\n\n// Visits a symbol node, set the current_object_ to the\n// current node symbol ID, and record a mapping from this node to the current\n// current_object_, which is the just obtained symbol\n// ID.\nvoid TSymbolDefinitionCollectingTraverser::visitSymbol(glslang::TIntermSymbol* node)\n{\n    current_object_ = generateSymbolLabel(node);\n    accesschain_mapping_[node] = current_object_;\n}\n\n// Visits an aggregate node, traverses all of its children.\nbool TSymbolDefinitionCollectingTraverser::visitAggregate(glslang::TVisit,\n                                                          glslang::TIntermAggregate* node)\n{\n    // This aggregate node might be a function definition node, in which case we need to\n    // cache this node, so we can get the preciseness information of the return value\n    // of this function later.\n    StateSettingGuard<glslang::TIntermAggregate*> current_function_definition_node_setting_guard(\n        &current_function_definition_node_);\n    if (node->getOp() == glslang::EOpFunction) {\n        // This is function definition node, we need to cache this node so that we can\n        // get the preciseness of the return value later.\n        current_function_definition_node_setting_guard.setState(node);\n    }\n    // Traverse the items in the sequence.\n    glslang::TIntermSequence& seq = node->getSequence();\n    for (int i = 0; i < (int)seq.size(); ++i) {\n        current_object_.clear();\n        seq[i]->traverse(this);\n    }\n    return false;\n}\n\nbool TSymbolDefinitionCollectingTraverser::visitBranch(glslang::TVisit,\n                                                       glslang::TIntermBranch* node)\n{\n    if (node->getFlowOp() == glslang::EOpReturn && node->getExpression() &&\n        current_function_definition_node_ &&\n        current_function_definition_node_->getType().getQualifier().noContraction) {\n        // This node is a return node with an expression, and its function has a\n        // precise return value. We need to find the involved objects in its\n        // expression and add them to the set of initial precise objects.\n        precise_return_nodes_.insert(node);\n        node->getExpression()->traverse(this);\n    }\n    return false;\n}\n\n// Visits a unary node. This might be an implicit assignment like i++, i--. etc.\nbool TSymbolDefinitionCollectingTraverser::visitUnary(glslang::TVisit /* visit */,\n                                                      glslang::TIntermUnary* node)\n{\n    current_object_.clear();\n    node->getOperand()->traverse(this);\n    if (isAssignOperation(node->getOp())) {\n        // We should always be able to get an access chain of the operand node.\n        assert(!current_object_.empty());\n\n        // If the operand node object is 'precise', we collect its access chain\n        // for the initial set of 'precise' objects.\n        if (isPreciseObjectNode(node->getOperand())) {\n            // The operand node is an 'precise' object node, add its\n            // access chain to the set of 'precise' objects. This is to collect\n            // the initial set of 'precise' objects.\n            precise_objects_.insert(current_object_);\n        }\n        // Gets the symbol ID from the object's access chain.\n        ObjectAccessChain id_symbol = getFrontElement(current_object_);\n        // Add a mapping from the symbol ID to this assignment operation node.\n        symbol_definition_mapping_.insert(std::make_pair(id_symbol, node));\n    }\n    // A unary node is not a dereference node, so we clear the access chain which\n    // is under construction.\n    current_object_.clear();\n    return false;\n}\n\n// Visits a binary node and updates the mapping from symbol IDs to the definition\n// nodes. Also collects the access chains for the initial precise objects.\nbool TSymbolDefinitionCollectingTraverser::visitBinary(glslang::TVisit /* visit */,\n                                                       glslang::TIntermBinary* node)\n{\n    // Traverses the left node to build the access chain info for the object.\n    current_object_.clear();\n    node->getLeft()->traverse(this);\n\n    if (isAssignOperation(node->getOp())) {\n        // We should always be able to get an access chain for the left node.\n        assert(!current_object_.empty());\n\n        // If the left node object is 'precise', it is an initial precise object\n        // specified in the shader source. Adds it to the initial work list to\n        // process later.\n        if (isPreciseObjectNode(node->getLeft())) {\n            // The left node is an 'precise' object node, add its access chain to\n            // the set of 'precise' objects. This is to collect the initial set\n            // of 'precise' objects.\n            precise_objects_.insert(current_object_);\n        }\n        // Gets the symbol ID from the object access chain, which should be the\n        // first element recorded in the access chain.\n        ObjectAccessChain id_symbol = getFrontElement(current_object_);\n        // Adds a mapping from the symbol ID to this assignment operation node.\n        symbol_definition_mapping_.insert(std::make_pair(id_symbol, node));\n\n        // Traverses the right node, there may be other 'assignment'\n        // operations in the right.\n        current_object_.clear();\n        node->getRight()->traverse(this);\n\n    } else if (isDereferenceOperation(node->getOp())) {\n        // The left node (parent node) is a struct type object. We need to\n        // record the access chain information of the current node into its\n        // object id.\n        if (node->getOp() == glslang::EOpIndexDirectStruct) {\n            unsigned struct_dereference_index = getStructIndexFromConstantUnion(node->getRight());\n            current_object_.push_back(ObjectAccesschainDelimiter);\n            current_object_.append(std::to_string(struct_dereference_index));\n        }\n        accesschain_mapping_[node] = current_object_;\n\n        // For a dereference node, there is no need to traverse the right child\n        // node as the right node should always be an integer type object.\n\n    } else {\n        // For other binary nodes, still traverse the right node.\n        current_object_.clear();\n        node->getRight()->traverse(this);\n    }\n    return false;\n}\n\n// Traverses the AST and returns a tuple of four members:\n// 1) a mapping from symbol IDs to the definition nodes (aka. assignment nodes) of these symbols.\n// 2) a mapping from object nodes in the AST to the access chains of these objects.\n// 3) a set of access chains of precise objects.\n// 4) a set of return nodes with precise expressions.\nstd::tuple<NodeMapping, AccessChainMapping, ObjectAccesschainSet, ReturnBranchNodeSet>\ngetSymbolToDefinitionMappingAndPreciseSymbolIDs(const glslang::TIntermediate& intermediate)\n{\n    auto result_tuple = std::make_tuple(NodeMapping(), AccessChainMapping(), ObjectAccesschainSet(),\n                                        ReturnBranchNodeSet());\n\n    TIntermNode* root = intermediate.getTreeRoot();\n    if (root == nullptr)\n        return result_tuple;\n\n    NodeMapping& symbol_definition_mapping = std::get<0>(result_tuple);\n    AccessChainMapping& accesschain_mapping = std::get<1>(result_tuple);\n    ObjectAccesschainSet& precise_objects = std::get<2>(result_tuple);\n    ReturnBranchNodeSet& precise_return_nodes = std::get<3>(result_tuple);\n\n    // Traverses the AST and populate the results.\n    TSymbolDefinitionCollectingTraverser collector(&symbol_definition_mapping, &accesschain_mapping,\n                                                   &precise_objects, &precise_return_nodes);\n    root->traverse(&collector);\n\n    return result_tuple;\n}\n\n//\n// A traverser that determine whether the left node (or operand node for unary\n// node) of an assignment node is 'precise', containing 'precise' or not,\n// according to the access chain a given precise object which share the same\n// symbol as the left node.\n//\n// Post-orderly traverses the left node subtree of an binary assignment node and:\n//\n//  1) Propagates the 'precise' from the left object nodes to this object node.\n//\n//  2) Builds object access chain along the traversal, and also compares with\n//  the access chain of the given 'precise' object along with the traversal to\n//  tell if the node to be defined is 'precise' or not.\n//\nclass TNoContractionAssigneeCheckingTraverser : public glslang::TIntermTraverser {\n\n    enum DecisionStatus {\n        // The object node to be assigned to may contain 'precise' objects and also not 'precise' objects.\n        Mixed = 0,\n        // The object node to be assigned to is either a 'precise' object or a struct objects whose members are all 'precise'.\n        Precise = 1,\n        // The object node to be assigned to is not a 'precise' object.\n        NotPreicse = 2,\n    };\n\npublic:\n    TNoContractionAssigneeCheckingTraverser(const AccessChainMapping& accesschain_mapping)\n        : TIntermTraverser(true, false, false), accesschain_mapping_(accesschain_mapping),\n          precise_object_(nullptr) {}\n\n    // Checks the preciseness of a given assignment node with a precise object\n    // represented as access chain. The precise object shares the same symbol\n    // with the assignee of the given assignment node. Return a tuple of two:\n    //\n    //  1) The preciseness of the assignee node of this assignment node. True\n    //  if the assignee contains 'precise' objects or is 'precise', false if\n    //  the assignee is not 'precise' according to the access chain of the given\n    //  precise object.\n    //\n    //  2) The incremental access chain from the assignee node to its nested\n    //  'precise' object, according to the access chain of the given precise\n    //  object. This incremental access chain can be empty, which means the\n    //  assignee is 'precise'. Otherwise it shows the path to the nested\n    //  precise object.\n    std::tuple<bool, ObjectAccessChain>\n    getPrecisenessAndRemainedAccessChain(glslang::TIntermOperator* node,\n                                         const ObjectAccessChain& precise_object)\n    {\n        assert(isAssignOperation(node->getOp()));\n        precise_object_ = &precise_object;\n        ObjectAccessChain assignee_object;\n        if (glslang::TIntermBinary* BN = node->getAsBinaryNode()) {\n            // This is a binary assignment node, we need to check the\n            // preciseness of the left node.\n            assert(accesschain_mapping_.count(BN->getLeft()));\n            // The left node (assignee node) is an object node, traverse the\n            // node to let the 'precise' of nesting objects being transfered to\n            // nested objects.\n            BN->getLeft()->traverse(this);\n            // After traversing the left node, if the left node is 'precise',\n            // we can conclude this assignment should propagate 'precise'.\n            if (isPreciseObjectNode(BN->getLeft())) {\n                return make_tuple(true, ObjectAccessChain());\n            }\n            // If the preciseness of the left node (assignee node) can not\n            // be determined by now, we need to compare the access chain string\n            // of the assignee object with the given precise object.\n            assignee_object = accesschain_mapping_.at(BN->getLeft());\n\n        } else if (glslang::TIntermUnary* UN = node->getAsUnaryNode()) {\n            // This is a unary assignment node, we need to check the\n            // preciseness of the operand node. For unary assignment node, the\n            // operand node should always be an object node.\n            assert(accesschain_mapping_.count(UN->getOperand()));\n            // Traverse the operand node to let the 'precise' being propagated\n            // from lower nodes to upper nodes.\n            UN->getOperand()->traverse(this);\n            // After traversing the operand node, if the operand node is\n            // 'precise', this assignment should propagate 'precise'.\n            if (isPreciseObjectNode(UN->getOperand())) {\n                return make_tuple(true, ObjectAccessChain());\n            }\n            // If the preciseness of the operand node (assignee node) can not\n            // be determined by now, we need to compare the access chain string\n            // of the assignee object with the given precise object.\n            assignee_object = accesschain_mapping_.at(UN->getOperand());\n        } else {\n            // Not a binary or unary node, should not happen.\n            assert(false);\n        }\n\n        // Compare the access chain string of the assignee node with the given\n        // precise object to determine if this assignment should propagate\n        // 'precise'.\n        if (assignee_object.find(precise_object) == 0) {\n            // The access chain string of the given precise object is a prefix\n            // of assignee's access chain string. The assignee should be\n            // 'precise'.\n            return make_tuple(true, ObjectAccessChain());\n        } else if (precise_object.find(assignee_object) == 0) {\n            // The assignee's access chain string is a prefix of the given\n            // precise object, the assignee object contains 'precise' object,\n            // and we need to pass the remained access chain to the object nodes\n            // in the right.\n            return make_tuple(true, getSubAccessChainAfterPrefix(precise_object, assignee_object));\n        } else {\n            // The access chain strings do not match, the assignee object can\n            // not be labeled as 'precise' according to the given precise\n            // object.\n            return make_tuple(false, ObjectAccessChain());\n        }\n    }\n\nprotected:\n    TNoContractionAssigneeCheckingTraverser& operator=(const TNoContractionAssigneeCheckingTraverser&);\n\n    bool visitBinary(glslang::TVisit, glslang::TIntermBinary* node) override;\n    void visitSymbol(glslang::TIntermSymbol* node) override;\n\n    // A map from object nodes to their access chain string (used as object ID).\n    const AccessChainMapping& accesschain_mapping_;\n    // A given precise object, represented in it access chain string. This\n    // precise object is used to be compared with the assignee node to tell if\n    // the assignee node is 'precise', contains 'precise' object or not\n    // 'precise'.\n    const ObjectAccessChain* precise_object_;\n};\n\n// Visits a binary node. If the node is an object node, it must be a dereference\n// node. In such cases, if the left node is 'precise', this node should also be\n// 'precise'.\nbool TNoContractionAssigneeCheckingTraverser::visitBinary(glslang::TVisit,\n                                                          glslang::TIntermBinary* node)\n{\n    // Traverses the left so that we transfer the 'precise' from nesting object\n    // to its nested object.\n    node->getLeft()->traverse(this);\n    // If this binary node is an object node, we should have it in the\n    // accesschain_mapping_.\n    if (accesschain_mapping_.count(node)) {\n        // A binary object node must be a dereference node.\n        assert(isDereferenceOperation(node->getOp()));\n        // If the left node is 'precise', this node should also be precise,\n        // otherwise, compare with the given precise_object_. If the\n        // access chain of this node matches with the given precise_object_,\n        // this node should be marked as 'precise'.\n        if (isPreciseObjectNode(node->getLeft())) {\n            node->getWritableType().getQualifier().noContraction = true;\n        } else if (accesschain_mapping_.at(node) == *precise_object_) {\n            node->getWritableType().getQualifier().noContraction = true;\n        }\n    }\n    return false;\n}\n\n// Visits a symbol node, if the symbol node ID (its access chain string) matches\n// with the given precise object, this node should be 'precise'.\nvoid TNoContractionAssigneeCheckingTraverser::visitSymbol(glslang::TIntermSymbol* node)\n{\n    // A symbol node should always be an object node, and should have been added\n    // to the map from object nodes to their access chain strings.\n    assert(accesschain_mapping_.count(node));\n    if (accesschain_mapping_.at(node) == *precise_object_) {\n        node->getWritableType().getQualifier().noContraction = true;\n    }\n}\n\n//\n// A traverser that only traverses the right side of binary assignment nodes\n// and the operand node of unary assignment nodes.\n//\n// 1) Marks arithmetic operations as 'NoContraction'.\n//\n// 2) Find the object which should be marked as 'precise' in the right and\n//    update the 'precise' object work list.\n//\nclass TNoContractionPropagator : public glslang::TIntermTraverser {\npublic:\n    TNoContractionPropagator(ObjectAccesschainSet* precise_objects,\n                             const AccessChainMapping& accesschain_mapping)\n        : TIntermTraverser(true, false, false),\n          precise_objects_(*precise_objects), added_precise_object_ids_(),\n          remained_accesschain_(), accesschain_mapping_(accesschain_mapping) {}\n\n    // Propagates 'precise' in the right nodes of a given assignment node with\n    // access chain record from the assignee node to a 'precise' object it\n    // contains.\n    void\n    propagateNoContractionInOneExpression(glslang::TIntermTyped* defining_node,\n                                          const ObjectAccessChain& assignee_remained_accesschain)\n    {\n        remained_accesschain_ = assignee_remained_accesschain;\n        if (glslang::TIntermBinary* BN = defining_node->getAsBinaryNode()) {\n            assert(isAssignOperation(BN->getOp()));\n            BN->getRight()->traverse(this);\n            if (isArithmeticOperation(BN->getOp())) {\n                BN->getWritableType().getQualifier().noContraction = true;\n            }\n        } else if (glslang::TIntermUnary* UN = defining_node->getAsUnaryNode()) {\n            assert(isAssignOperation(UN->getOp()));\n            UN->getOperand()->traverse(this);\n            if (isArithmeticOperation(UN->getOp())) {\n                UN->getWritableType().getQualifier().noContraction = true;\n            }\n        }\n    }\n\n    // Propagates 'precise' in a given precise return node.\n    void propagateNoContractionInReturnNode(glslang::TIntermBranch* return_node)\n    {\n        remained_accesschain_ = \"\";\n        assert(return_node->getFlowOp() == glslang::EOpReturn && return_node->getExpression());\n        return_node->getExpression()->traverse(this);\n    }\n\nprotected:\n    TNoContractionPropagator& operator=(const TNoContractionPropagator&);\n\n    // Visits an aggregate node. The node can be a initializer list, in which\n    // case we need to find the 'precise' or 'precise' containing object node\n    // with the access chain record. In other cases, just need to traverse all\n    // the children nodes.\n    bool visitAggregate(glslang::TVisit, glslang::TIntermAggregate* node) override\n    {\n        if (!remained_accesschain_.empty() && node->getOp() == glslang::EOpConstructStruct) {\n            // This is a struct initializer node, and the remained\n            // access chain is not empty, we need to refer to the\n            // assignee_remained_access_chain_ to find the nested\n            // 'precise' object. And we don't need to visit other nodes in this\n            // aggregate node.\n\n            // Gets the struct dereference index that leads to 'precise' object.\n            ObjectAccessChain precise_accesschain_index_str =\n                getFrontElement(remained_accesschain_);\n            unsigned precise_accesschain_index = (unsigned)strtoul(precise_accesschain_index_str.c_str(), nullptr, 10);\n            // Gets the node pointed by the access chain index extracted before.\n            glslang::TIntermTyped* potential_precise_node =\n                node->getSequence()[precise_accesschain_index]->getAsTyped();\n            assert(potential_precise_node);\n            // Pop the front access chain index from the path, and visit the nested node.\n            {\n                ObjectAccessChain next_level_accesschain =\n                    subAccessChainFromSecondElement(remained_accesschain_);\n                StateSettingGuard<ObjectAccessChain> setup_remained_accesschain_for_next_level(\n                    &remained_accesschain_, next_level_accesschain);\n                potential_precise_node->traverse(this);\n            }\n            return false;\n        }\n        return true;\n    }\n\n    // Visits a binary node. A binary node can be an object node, e.g. a dereference node.\n    // As only the top object nodes in the right side of an assignment needs to be visited\n    // and added to 'precise' work list, this traverser won't visit the children nodes of\n    // an object node. If the binary node does not represent an object node, it should\n    // go on to traverse its children nodes and if it is an arithmetic operation node, this\n    // operation should be marked as 'noContraction'.\n    bool visitBinary(glslang::TVisit, glslang::TIntermBinary* node) override\n    {\n        if (isDereferenceOperation(node->getOp())) {\n            // This binary node is an object node. Need to update the precise\n            // object set with the access chain of this node + remained\n            // access chain .\n            ObjectAccessChain new_precise_accesschain = accesschain_mapping_.at(node);\n            if (remained_accesschain_.empty()) {\n                node->getWritableType().getQualifier().noContraction = true;\n            } else {\n                new_precise_accesschain += ObjectAccesschainDelimiter + remained_accesschain_;\n            }\n            // Cache the access chain as added precise object, so we won't add the\n            // same object to the work list again.\n            if (!added_precise_object_ids_.count(new_precise_accesschain)) {\n                precise_objects_.insert(new_precise_accesschain);\n                added_precise_object_ids_.insert(new_precise_accesschain);\n            }\n            // Only the upper-most object nodes should be visited, so do not\n            // visit children of this object node.\n            return false;\n        }\n        // If this is an arithmetic operation, marks this node as 'noContraction'.\n        if (isArithmeticOperation(node->getOp()) && node->getBasicType() != glslang::EbtInt) {\n            node->getWritableType().getQualifier().noContraction = true;\n        }\n        // As this node is not an object node, need to traverse the children nodes.\n        return true;\n    }\n\n    // Visits a unary node. A unary node can not be an object node. If the operation\n    // is an arithmetic operation, need to mark this node as 'noContraction'.\n    bool visitUnary(glslang::TVisit /* visit */, glslang::TIntermUnary* node) override\n    {\n        // If this is an arithmetic operation, marks this with 'noContraction'\n        if (isArithmeticOperation(node->getOp())) {\n            node->getWritableType().getQualifier().noContraction = true;\n        }\n        return true;\n    }\n\n    // Visits a symbol node. A symbol node is always an object node. So we\n    // should always be able to find its in our collected mapping from object\n    // nodes to access chains.  As an object node, a symbol node can be either\n    // 'precise' or containing 'precise' objects according to unused\n    // access chain information we have when we visit this node.\n    void visitSymbol(glslang::TIntermSymbol* node) override\n    {\n        // Symbol nodes are object nodes and should always have an\n        // access chain collected before matches with it.\n        assert(accesschain_mapping_.count(node));\n        ObjectAccessChain new_precise_accesschain = accesschain_mapping_.at(node);\n        // If the unused access chain is empty, this symbol node should be\n        // marked as 'precise'.  Otherwise, the unused access chain should be\n        // appended to the symbol ID to build a new access chain which points to\n        // the nested 'precise' object in this symbol object.\n        if (remained_accesschain_.empty()) {\n            node->getWritableType().getQualifier().noContraction = true;\n        } else {\n            new_precise_accesschain += ObjectAccesschainDelimiter + remained_accesschain_;\n        }\n        // Add the new 'precise' access chain to the work list and make sure we\n        // don't visit it again.\n        if (!added_precise_object_ids_.count(new_precise_accesschain)) {\n            precise_objects_.insert(new_precise_accesschain);\n            added_precise_object_ids_.insert(new_precise_accesschain);\n        }\n    }\n\n    // A set of precise objects, represented as access chains.\n    ObjectAccesschainSet& precise_objects_;\n    // Visited symbol nodes, should not revisit these nodes.\n    ObjectAccesschainSet added_precise_object_ids_;\n    // The left node of an assignment operation might be an parent of 'precise' objects.\n    // This means the left node might not be an 'precise' object node, but it may contains\n    // 'precise' qualifier which should be propagated to the corresponding child node in\n    // the right. So we need the path from the left node to its nested 'precise' node to\n    // tell us how to find the corresponding 'precise' node in the right.\n    ObjectAccessChain remained_accesschain_;\n    // A map from node pointers to their access chains.\n    const AccessChainMapping& accesschain_mapping_;\n};\n}\n\nnamespace glslang {\n\nvoid PropagateNoContraction(const glslang::TIntermediate& intermediate)\n{\n    // First, traverses the AST, records symbols with their defining operations\n    // and collects the initial set of precise symbols (symbol nodes that marked\n    // as 'noContraction') and precise return nodes.\n    auto mappings_and_precise_objects =\n        getSymbolToDefinitionMappingAndPreciseSymbolIDs(intermediate);\n\n    // The mapping of symbol node IDs to their defining nodes. This enables us\n    // to get the defining node directly from a given symbol ID without\n    // traversing the tree again.\n    NodeMapping& symbol_definition_mapping = std::get<0>(mappings_and_precise_objects);\n\n    // The mapping of object nodes to their access chains recorded.\n    AccessChainMapping& accesschain_mapping = std::get<1>(mappings_and_precise_objects);\n\n    // The initial set of 'precise' objects which are represented as the\n    // access chain toward them.\n    ObjectAccesschainSet& precise_object_accesschains = std::get<2>(mappings_and_precise_objects);\n\n    // The set of 'precise' return nodes.\n    ReturnBranchNodeSet& precise_return_nodes = std::get<3>(mappings_and_precise_objects);\n\n    // Second, uses the initial set of precise objects as a work list, pops an\n    // access chain, extract the symbol ID from it. Then:\n    //  1) Check the assignee object, see if it is 'precise' object node or\n    //  contains 'precise' object. Obtain the incremental access chain from the\n    //  assignee node to its nested 'precise' node (if any).\n    //  2) If the assignee object node is 'precise' or it contains 'precise'\n    //  objects, traverses the right side of the assignment operation\n    //  expression to mark arithmetic operations as 'noContration' and update\n    //  'precise' access chain work list with new found object nodes.\n    // Repeat above steps until the work list is empty.\n    TNoContractionAssigneeCheckingTraverser checker(accesschain_mapping);\n    TNoContractionPropagator propagator(&precise_object_accesschains, accesschain_mapping);\n\n    // We have two initial precise work lists to handle:\n    //  1) precise return nodes\n    //  2) precise object access chains\n    // We should process the precise return nodes first and the involved\n    // objects in the return expression should be added to the precise object\n    // access chain set.\n    while (!precise_return_nodes.empty()) {\n        glslang::TIntermBranch* precise_return_node = *precise_return_nodes.begin();\n        propagator.propagateNoContractionInReturnNode(precise_return_node);\n        precise_return_nodes.erase(precise_return_node);\n    }\n\n    while (!precise_object_accesschains.empty()) {\n        // Get the access chain of a precise object from the work list.\n        ObjectAccessChain precise_object_accesschain = *precise_object_accesschains.begin();\n        // Get the symbol id from the access chain.\n        ObjectAccessChain symbol_id = getFrontElement(precise_object_accesschain);\n        // Get all the defining nodes of that symbol ID.\n        std::pair<NodeMapping::iterator, NodeMapping::iterator> range =\n            symbol_definition_mapping.equal_range(symbol_id);\n        // Visits all the assignment nodes of that symbol ID and\n        //  1) Check if the assignee node is 'precise' or contains 'precise'\n        //  objects.\n        //  2) Propagate the 'precise' to the top layer object nodes\n        //  in the right side of the assignment operation, update the 'precise'\n        //  work list with new access chains representing the new 'precise'\n        //  objects, and mark arithmetic operations as 'noContraction'.\n        for (NodeMapping::iterator defining_node_iter = range.first;\n             defining_node_iter != range.second; defining_node_iter++) {\n            TIntermOperator* defining_node = defining_node_iter->second;\n            // Check the assignee node.\n            auto checker_result = checker.getPrecisenessAndRemainedAccessChain(\n                defining_node, precise_object_accesschain);\n            bool& contain_precise = std::get<0>(checker_result);\n            ObjectAccessChain& remained_accesschain = std::get<1>(checker_result);\n            // If the assignee node is 'precise' or contains 'precise', propagate the\n            // 'precise' to the right. Otherwise just skip this assignment node.\n            if (contain_precise) {\n                propagator.propagateNoContractionInOneExpression(defining_node,\n                                                                 remained_accesschain);\n            }\n        }\n        // Remove the last processed 'precise' object from the work list.\n        precise_object_accesschains.erase(precise_object_accesschain);\n    }\n}\n}\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/propagateNoContraction.h",
    "content": "//\n// Copyright (C) 2015-2016 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of Google Inc. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Visit the nodes in the glslang intermediate tree representation to\n// propagate 'noContraction' qualifier.\n//\n\n#pragma once\n\n#include \"../Include/intermediate.h\"\n\nnamespace glslang {\n\n// Propagates the 'precise' qualifier for objects (objects marked with\n// 'noContraction' qualifier) from the shader source specified 'precise'\n// variables to all the involved objects, and add 'noContraction' qualifier for\n// the involved arithmetic operations.\n// Note that the same qualifier: 'noContraction' is used in both object nodes\n// and arithmetic operation nodes, but has different meaning. For object nodes,\n// 'noContraction' means the object is 'precise'; and for arithmetic operation\n// nodes, it means the operation should not be contracted.\nvoid PropagateNoContraction(const glslang::TIntermediate& intermediate);\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/reflection.cpp",
    "content": "//\n// Copyright (C) 2013-2016 LunarG, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#include \"../Include/Common.h\"\n#include \"reflection.h\"\n#include \"LiveTraverser.h\"\n#include \"localintermediate.h\"\n\n#include \"gl_types.h\"\n\n//\n// Grow the reflection database through a friend traverser class of TReflection and a\n// collection of functions to do a liveness traversal that note what uniforms are used\n// in semantically non-dead code.\n//\n// Can be used multiple times, once per stage, to grow a program reflection.\n//\n// High-level algorithm for one stage:\n//\n// 1. Put the entry point on the list of live functions.\n//\n// 2. Traverse any live function, while skipping if-tests with a compile-time constant\n//    condition of false, and while adding any encountered function calls to the live\n//    function list.\n//\n//    Repeat until the live function list is empty.\n//\n// 3. Add any encountered uniform variables and blocks to the reflection database.\n//\n// Can be attempted with a failed link, but will return false if recursion had been detected, or\n// there wasn't exactly one entry point.\n//\n\nnamespace glslang {\n\n//\n// The traverser: mostly pass through, except\n//  - processing binary nodes to see if they are dereferences of an aggregates to track\n//  - processing symbol nodes to see if they are non-aggregate objects to track\n//\n// This ignores semantically dead code by using TLiveTraverser.\n//\n// This is in the glslang namespace directly so it can be a friend of TReflection.\n//\n\nclass TReflectionTraverser : public TIntermTraverser {\npublic:\n    TReflectionTraverser(const TIntermediate& i, TReflection& r) :\n\t                     TIntermTraverser(), intermediate(i), reflection(r), updateStageMasks(true) { }\n\n    virtual bool visitBinary(TVisit, TIntermBinary* node);\n    virtual void visitSymbol(TIntermSymbol* base);\n\n    // Add a simple reference to a uniform variable to the uniform database, no dereference involved.\n    // However, no dereference doesn't mean simple... it could be a complex aggregate.\n    void addUniform(const TIntermSymbol& base)\n    {\n        if (processedDerefs.find(&base) == processedDerefs.end()) {\n            processedDerefs.insert(&base);\n\n            int blockIndex = -1;\n            int offset     = -1;\n            TList<TIntermBinary*> derefs;\n            TString baseName = base.getName();\n\n            if (base.getType().getBasicType() == EbtBlock) {\n                offset = 0;\n                bool anonymous = IsAnonymous(baseName);\n                const TString& blockName = base.getType().getTypeName();\n\n                if (!anonymous)\n                    baseName = blockName;\n                else\n                    baseName = \"\";\n\n                blockIndex = addBlockName(blockName, base.getType(), intermediate.getBlockSize(base.getType()));\n            }\n\n            // Use a degenerate (empty) set of dereferences to immediately put as at the end of\n            // the dereference change expected by blowUpActiveAggregate.\n            blowUpActiveAggregate(base.getType(), baseName, derefs, derefs.end(), offset, blockIndex, 0, -1, 0,\n                                    base.getQualifier().storage, updateStageMasks, &base.getConstArray());\n        }\n    }\n\n    void addPipeIOVariable(const TIntermSymbol& base)\n    {\n        if (processedDerefs.find(&base) == processedDerefs.end()) {\n            processedDerefs.insert(&base);\n\n            const TString &name = base.getName();\n            const TType &type = base.getType();\n            const bool input = base.getQualifier().isPipeInput();\n\n            TReflection::TMapIndexToReflection &ioItems =\n                input ? reflection.indexToPipeInput : reflection.indexToPipeOutput;\n\n\n            TReflection::TNameToIndex &ioMapper =\n                input ? reflection.pipeInNameToIndex : reflection.pipeOutNameToIndex;\n\n            if (reflection.options & EShReflectionUnwrapIOBlocks) {\n                bool anonymous = IsAnonymous(name);\n\n                TString baseName;\n                if (type.getBasicType() == EbtBlock) {\n                    baseName = anonymous ? TString() : type.getTypeName();\n                } else {\n                    baseName = anonymous ? TString() : name;\n                }\n\n                // by convention if this is an arrayed block we ignore the array in the reflection\n                if (type.isArray() && type.getBasicType() == EbtBlock) {\n                    blowUpIOAggregate(input, baseName, TType(type, 0));\n                } else {               \n                    blowUpIOAggregate(input, baseName, type);\n                }\n            } else {\n                TReflection::TNameToIndex::const_iterator it = ioMapper.find(name.c_str());\n                if (it == ioMapper.end()) {\n                    // seperate pipe i/o params from uniforms and blocks\n                    // in is only for input in first stage as out is only for last stage. check traverse in call stack.\n                    ioMapper[name.c_str()] = static_cast<int>(ioItems.size());\n                    ioItems.push_back(\n                        TObjectReflection(name.c_str(), type, 0, mapToGlType(type), mapToGlArraySize(type), 0));\n                    EShLanguageMask& stages = ioItems.back().stages;\n                    stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());\n                } else {\n                    EShLanguageMask& stages = ioItems[it->second].stages;\n                    stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());\n                }\n            }\n        }\n    }\n\n    // Lookup or calculate the offset of all block members at once, using the recursively\n    // defined block offset rules.\n    void getOffsets(const TType& type, TVector<int>& offsets)\n    {\n        const TTypeList& memberList = *type.getStruct();\n        int memberSize = 0;\n        int offset = 0;\n\n        for (size_t m = 0; m < offsets.size(); ++m) {\n            // if the user supplied an offset, snap to it now\n            if (memberList[m].type->getQualifier().hasOffset())\n                offset = memberList[m].type->getQualifier().layoutOffset;\n\n            // calculate the offset of the next member and align the current offset to this member\n            intermediate.updateOffset(type, *memberList[m].type, offset, memberSize);\n\n            // save the offset of this member\n            offsets[m] = offset;\n\n            // update for the next member\n            offset += memberSize;\n        }\n    }\n\n    // Calculate the stride of an array type\n    int getArrayStride(const TType& baseType, const TType& type)\n    {\n        int dummySize;\n        int stride;\n\n        // consider blocks to have 0 stride, so that all offsets are relative to the start of their block\n        if (type.getBasicType() == EbtBlock)\n            return 0;\n\n        TLayoutMatrix subMatrixLayout = type.getQualifier().layoutMatrix;\n        intermediate.getMemberAlignment(type, dummySize, stride,\n                                        baseType.getQualifier().layoutPacking,\n                                        subMatrixLayout != ElmNone\n                                            ? subMatrixLayout == ElmRowMajor\n                                            : baseType.getQualifier().layoutMatrix == ElmRowMajor);\n\n        return stride;\n    }\n\n    // count the total number of leaf members from iterating out of a block type\n    int countAggregateMembers(const TType& parentType)\n    {\n        if (! parentType.isStruct())\n            return 1;\n\n        const bool strictArraySuffix = (reflection.options & EShReflectionStrictArraySuffix);\n\n        bool blockParent = (parentType.getBasicType() == EbtBlock && parentType.getQualifier().storage == EvqBuffer);\n\n        const TTypeList &memberList = *parentType.getStruct();\n\n        int ret = 0;\n\n        for (size_t i = 0; i < memberList.size(); i++)\n        {\n            const TType &memberType = *memberList[i].type;\n            int numMembers = countAggregateMembers(memberType);\n            // for sized arrays of structs, apply logic to expand out the same as we would below in\n            // blowUpActiveAggregate\n            if (memberType.isArray() && ! memberType.getArraySizes()->hasUnsized() && memberType.isStruct()) {\n                if (! strictArraySuffix || ! blockParent)\n                    numMembers *= memberType.getArraySizes()->getCumulativeSize();\n            }\n            ret += numMembers;\n        }\n\n        return ret;\n    }\n\n    // Traverse the provided deref chain, including the base, and\n    // - build a full reflection-granularity name, array size, etc. entry out of it, if it goes down to that granularity\n    // - recursively expand any variable array index in the middle of that traversal\n    // - recursively expand what's left at the end if the deref chain did not reach down to reflection granularity\n    //\n    // arraySize tracks, just for the final dereference in the chain, if there was a specific known size.\n    // A value of 0 for arraySize will mean to use the full array's size.\n    void blowUpActiveAggregate(const TType& baseType, const TString& baseName, const TList<TIntermBinary*>& derefs,\n                               TList<TIntermBinary*>::const_iterator deref, int offset, int blockIndex, int arraySize,\n                               int topLevelArraySize, int topLevelArrayStride, TStorageQualifier baseStorage, bool active,\n                               const TConstUnionArray* constArray = nullptr)\n    {\n        // when strictArraySuffix is enabled, we closely follow the rules from ARB_program_interface_query.\n        // Broadly:\n        // * arrays-of-structs always have a [x] suffix.\n        // * with array-of-struct variables in the root of a buffer block, only ever return [0].\n        // * otherwise, array suffixes are added whenever we iterate, even if that means expanding out an array.\n        const bool strictArraySuffix = (reflection.options & EShReflectionStrictArraySuffix);\n\n        // is this variable inside a buffer block. This flag is set back to false after we iterate inside the first array element.\n        bool blockParent = (baseType.getBasicType() == EbtBlock && baseType.getQualifier().storage == EvqBuffer);\n\n        // process the part of the dereference chain that was explicit in the shader\n        TString name = baseName;\n        const TType* terminalType = &baseType;\n        const TConstUnionArray* terminalConstArray = constArray;\n        for (; deref != derefs.end(); ++deref) {\n            TIntermBinary* visitNode = *deref;\n            terminalType = &visitNode->getType();\n            if (visitNode->getAsSymbolNode())\n                terminalConstArray = &visitNode->getAsSymbolNode()->getConstArray();\n            else if (visitNode->getAsConstantUnion())\n                terminalConstArray = &visitNode->getAsConstantUnion()->getConstArray();\n            else if (visitNode->getLeft() != nullptr && visitNode->getLeft()->getAsSymbolNode())\n                terminalConstArray = &visitNode->getLeft()->getAsSymbolNode()->getConstArray();\n            else\n                terminalConstArray = nullptr;\n            int index;\n            switch (visitNode->getOp()) {\n            case EOpIndexIndirect: {\n                int stride = getArrayStride(baseType, visitNode->getLeft()->getType());\n\n                if (topLevelArrayStride == 0)\n                    topLevelArrayStride = stride;\n\n                // Visit all the indices of this array, and for each one add on the remaining dereferencing\n                for (int i = 0; i < std::max(visitNode->getLeft()->getType().getOuterArraySize(), 1); ++i) {\n                    TString newBaseName = name;\n                    if (terminalType->getBasicType() == EbtBlock) {}\n                    else if (strictArraySuffix && blockParent)\n                        newBaseName.append(TString(\"[0]\"));\n                    else if (strictArraySuffix || baseType.getBasicType() != EbtBlock)\n                        newBaseName.append(TString(\"[\") + String(i) + \"]\");\n                    TList<TIntermBinary*>::const_iterator nextDeref = deref;\n                    ++nextDeref;\n                    blowUpActiveAggregate(*terminalType, newBaseName, derefs, nextDeref, offset, blockIndex, arraySize,\n                                          topLevelArraySize, topLevelArrayStride, baseStorage, active);\n\n                    if (offset >= 0)\n                        offset += stride;\n                }\n\n                // it was all completed in the recursive calls above\n                return;\n            }\n            case EOpIndexDirect: {\n                int stride = getArrayStride(baseType, visitNode->getLeft()->getType());\n\n                index = visitNode->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst();\n                if (terminalType->getBasicType() == EbtBlock) {}\n                else if (strictArraySuffix && blockParent)\n                    name.append(TString(\"[0]\"));\n                else if (strictArraySuffix || baseType.getBasicType() != EbtBlock) {\n                    name.append(TString(\"[\") + String(index) + \"]\");\n\n                    if (offset >= 0)\n                        offset += stride * index;\n                }\n\n                if (topLevelArrayStride == 0)\n                    topLevelArrayStride = stride;\n\n                // expand top-level arrays in blocks with [0] suffix\n                if (topLevelArrayStride != 0 && visitNode->getLeft()->getType().isArray()) {\n                    blockParent = false;\n                }\n                break;\n            }\n            case EOpIndexDirectStruct:\n                index = visitNode->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst();\n                if (offset >= 0)\n                    offset += intermediate.getOffset(visitNode->getLeft()->getType(), index);\n                if (name.size() > 0)\n                    name.append(\".\");\n                name.append((*visitNode->getLeft()->getType().getStruct())[index].type->getFieldName());\n\n                // expand non top-level arrays with [x] suffix\n                if (visitNode->getLeft()->getType().getBasicType() != EbtBlock && terminalType->isArray())\n                {\n                    blockParent = false;\n                }\n                break;\n            default:\n                break;\n            }\n        }\n\n        // if the terminalType is still too coarse a granularity, this is still an aggregate to expand, expand it...\n        if (! isReflectionGranularity(*terminalType)) {\n            // the base offset of this node, that children are relative to\n            int baseOffset = offset;\n\n            if (terminalType->isArray()) {\n                // Visit all the indices of this array, and for each one,\n                // fully explode the remaining aggregate to dereference\n\n                int stride = 0;\n                if (offset >= 0)\n                    stride = getArrayStride(baseType, *terminalType);\n\n                int arrayIterateSize = std::max(terminalType->getOuterArraySize(), 1);\n\n                // for top-level arrays in blocks, only expand [0] to avoid explosion of items\n                if ((strictArraySuffix && blockParent) ||\n                    ((topLevelArraySize == arrayIterateSize) && (topLevelArrayStride == 0))) {\n                    arrayIterateSize = 1;\n                }\n\n                if (topLevelArrayStride == 0)\n                    topLevelArrayStride = stride;\n\n                for (int i = 0; i < arrayIterateSize; ++i) {\n                    TString newBaseName = name;\n                    if (terminalType->getBasicType() != EbtBlock)\n                        newBaseName.append(TString(\"[\") + String(i) + \"]\");\n                    TType derefType(*terminalType, 0);\n                    if (offset >= 0)\n                        offset = baseOffset + stride * i;\n\n                    blowUpActiveAggregate(derefType, newBaseName, derefs, derefs.end(), offset, blockIndex, 0,\n                                          topLevelArraySize, topLevelArrayStride, baseStorage, active);\n                }\n            } else {\n                // Visit all members of this aggregate, and for each one,\n                // fully explode the remaining aggregate to dereference\n                const TTypeList& typeList = *terminalType->getStruct();\n\n                TVector<int> memberOffsets;\n\n                if (baseOffset >= 0) {\n                    memberOffsets.resize(typeList.size());\n                    getOffsets(*terminalType, memberOffsets);\n                }\n\n                for (int i = 0; i < (int)typeList.size(); ++i) {\n                    TString newBaseName = name;\n                    if (newBaseName.size() > 0)\n                        newBaseName.append(\".\");\n                    newBaseName.append(typeList[i].type->getFieldName());\n                    TType derefType(*terminalType, i);\n                    if (offset >= 0)\n                        offset = baseOffset + memberOffsets[i];\n\n                    int arrayStride = topLevelArrayStride;\n                    if (terminalType->getBasicType() == EbtBlock && terminalType->getQualifier().storage == EvqBuffer &&\n                        derefType.isArray()) {\n                        arrayStride = getArrayStride(baseType, derefType);\n                    }\n\n                    if (topLevelArraySize == -1 && arrayStride == 0 && blockParent)\n                        topLevelArraySize = 1;\n\n                    if (strictArraySuffix && blockParent) {\n                        // if this member is an array, store the top-level array stride but start the explosion from\n                        // the inner struct type.\n                        if (derefType.isArray() && derefType.isStruct()) {\n                            newBaseName.append(\"[0]\");\n                            auto dimSize = derefType.isUnsizedArray() ? 0 : derefType.getArraySizes()->getDimSize(0);\n                            blowUpActiveAggregate(TType(derefType, 0), newBaseName, derefs, derefs.end(), memberOffsets[i],\n                                blockIndex, 0, dimSize, arrayStride, terminalType->getQualifier().storage, false);\n                        }\n                        else if (derefType.isArray()) {\n                            auto dimSize = derefType.isUnsizedArray() ? 0 : derefType.getArraySizes()->getDimSize(0);\n                            blowUpActiveAggregate(derefType, newBaseName, derefs, derefs.end(), memberOffsets[i], blockIndex,\n                                0, dimSize, 0, terminalType->getQualifier().storage, false);\n                        }\n                        else {\n                            blowUpActiveAggregate(derefType, newBaseName, derefs, derefs.end(), memberOffsets[i], blockIndex,\n                                0, 1, 0, terminalType->getQualifier().storage, false);\n                        }\n                    } else {\n                        blowUpActiveAggregate(derefType, newBaseName, derefs, derefs.end(), offset, blockIndex, 0,\n                                              topLevelArraySize, arrayStride, baseStorage, active);\n                    }\n                }\n            }\n\n            // it was all completed in the recursive calls above\n            return;\n        }\n\n        if ((reflection.options & EShReflectionBasicArraySuffix) && terminalType->isArray()) {\n            name.append(TString(\"[0]\"));\n        }\n\n        // Finally, add a full string to the reflection database, and update the array size if necessary.\n        // If the dereferenced entity to record is an array, compute the size and update the maximum size.\n\n        // there might not be a final array dereference, it could have been copied as an array object\n        if (arraySize == 0)\n            arraySize = mapToGlArraySize(*terminalType);\n\n        TReflection::TMapIndexToReflection& variables = reflection.GetVariableMapForStorage(baseStorage);\n\n        TReflection::TNameToIndex::const_iterator it = reflection.nameToIndex.find(name.c_str());\n        if (it == reflection.nameToIndex.end()) {\n            int uniformIndex = (int)variables.size();\n            reflection.nameToIndex[name.c_str()] = uniformIndex;\n            variables.push_back(TObjectReflection(name.c_str(), *terminalType, offset, mapToGlType(*terminalType),\n                                                  arraySize, blockIndex, terminalConstArray));\n            if (terminalType->isArray()) {\n                variables.back().arrayStride = getArrayStride(baseType, *terminalType);\n                if (topLevelArrayStride == 0)\n                    topLevelArrayStride = variables.back().arrayStride;\n            }\n\n            if ((reflection.options & EShReflectionSeparateBuffers) && terminalType->isAtomic())\n                reflection.atomicCounterUniformIndices.push_back(uniformIndex);\n\n            variables.back().topLevelArraySize = topLevelArraySize;\n            variables.back().topLevelArrayStride = topLevelArrayStride;\n            \n            if ((reflection.options & EShReflectionAllBlockVariables) && active) {\n                EShLanguageMask& stages = variables.back().stages;\n                stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());\n            }\n        } else {\n            if (arraySize > 1) {\n                int& reflectedArraySize = variables[it->second].size;\n                reflectedArraySize = std::max(arraySize, reflectedArraySize);\n            }\n\n            if ((reflection.options & EShReflectionAllBlockVariables) && active) {\n              EShLanguageMask& stages = variables[it->second].stages;\n              stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());\n            }\n        }\n    }\n    \n    // similar to blowUpActiveAggregate, but with simpler rules and no dereferences to follow.\n    void blowUpIOAggregate(bool input, const TString &baseName, const TType &type)\n    {\n        TString name = baseName;\n\n        // if the type is still too coarse a granularity, this is still an aggregate to expand, expand it...\n        if (! isReflectionGranularity(type)) {\n            if (type.isArray()) {\n                // Visit all the indices of this array, and for each one,\n                // fully explode the remaining aggregate to dereference\n                for (int i = 0; i < std::max(type.getOuterArraySize(), 1); ++i) {\n                    TString newBaseName = name;\n                    newBaseName.append(TString(\"[\") + String(i) + \"]\");\n                    TType derefType(type, 0);\n\n                    blowUpIOAggregate(input, newBaseName, derefType);\n                }\n            } else {\n                // Visit all members of this aggregate, and for each one,\n                // fully explode the remaining aggregate to dereference\n                const TTypeList& typeList = *type.getStruct();\n\n                for (int i = 0; i < (int)typeList.size(); ++i) {\n                    TString newBaseName = name;\n                    if (newBaseName.size() > 0)\n                        newBaseName.append(\".\");\n                    newBaseName.append(typeList[i].type->getFieldName());\n                    TType derefType(type, i);\n\n                    blowUpIOAggregate(input, newBaseName, derefType);\n                }\n            }\n\n            // it was all completed in the recursive calls above\n            return;\n        }\n\n        if ((reflection.options & EShReflectionBasicArraySuffix) && type.isArray()) {\n            name.append(TString(\"[0]\"));\n        }\n\n        TReflection::TMapIndexToReflection &ioItems =\n            input ? reflection.indexToPipeInput : reflection.indexToPipeOutput;\n\n        std::string namespacedName = input ? \"in \" : \"out \";\n        namespacedName += name.c_str();\n\n        TReflection::TNameToIndex::const_iterator it = reflection.nameToIndex.find(namespacedName);\n        if (it == reflection.nameToIndex.end()) {\n            reflection.nameToIndex[namespacedName] = (int)ioItems.size();\n            ioItems.push_back(\n                TObjectReflection(name.c_str(), type, 0, mapToGlType(type), mapToGlArraySize(type), 0));\n\n            EShLanguageMask& stages = ioItems.back().stages;\n            stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());\n        } else {\n            EShLanguageMask& stages = ioItems[it->second].stages;\n            stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());\n        }\n    }\n\n    // Add a uniform dereference where blocks/struct/arrays are involved in the access.\n    // Handles the situation where the left node is at the correct or too coarse a\n    // granularity for reflection.  (That is, further dereferences up the tree will be\n    // skipped.) Earlier dereferences, down the tree, will be handled\n    // at the same time, and logged to prevent reprocessing as the tree is traversed.\n    //\n    // Note: Other things like the following must be caught elsewhere:\n    //  - a simple non-array, non-struct variable (no dereference even conceivable)\n    //  - an aggregrate consumed en masse, without a dereference\n    //\n    // So, this code is for cases like\n    //   - a struct/block dereferencing a member (whether the member is array or not)\n    //   - an array of struct\n    //   - structs/arrays containing the above\n    //\n    void addDereferencedUniform(TIntermBinary* topNode)\n    {\n        // See if too fine-grained to process (wait to get further down the tree)\n        const TType& leftType = topNode->getLeft()->getType();\n        if ((leftType.isVector() || leftType.isMatrix()) && ! leftType.isArray())\n            return;\n\n        // We have an array or structure or block dereference, see if it's a uniform\n        // based dereference (if not, skip it).\n        TIntermSymbol* base = findBase(topNode);\n        if (! base || ! base->getQualifier().isUniformOrBuffer())\n            return;\n\n        // See if we've already processed this (e.g., in the middle of something\n        // we did earlier), and if so skip it\n        if (processedDerefs.find(topNode) != processedDerefs.end())\n            return;\n\n        // Process this uniform dereference\n\n        int offset = -1;\n        int blockIndex = -1;\n        bool anonymous = false;\n\n        // See if we need to record the block itself\n        bool block = base->getBasicType() == EbtBlock;\n        if (block) {\n            offset = 0;\n            anonymous = IsAnonymous(base->getName());\n\n            const TString& blockName = base->getType().getTypeName();\n            TString baseName;\n            \n            if (! anonymous)\n                baseName = blockName;\n\n            blockIndex = addBlockName(blockName, base->getType(), intermediate.getBlockSize(base->getType()));\n\n            if (reflection.options & EShReflectionAllBlockVariables) {\n                // Use a degenerate (empty) set of dereferences to immediately put as at the end of\n                // the dereference change expected by blowUpActiveAggregate.\n                TList<TIntermBinary*> derefs;\n\n                // otherwise - if we're not using strict array suffix rules, or this isn't a block so we are\n                // expanding root arrays anyway, just start the iteration from the base block type.\n                blowUpActiveAggregate(base->getType(), baseName, derefs, derefs.end(), 0, blockIndex, 0, -1, 0,\n                                          base->getQualifier().storage, false, &base->getConstArray());\n            }\n        }\n\n        // Process the dereference chain, backward, accumulating the pieces for later forward traversal.\n        // If the topNode is a reflection-granularity-array dereference, don't include that last dereference.\n        TList<TIntermBinary*> derefs;\n        for (TIntermBinary* visitNode = topNode; visitNode; visitNode = visitNode->getLeft()->getAsBinaryNode()) {\n            if (isReflectionGranularity(visitNode->getLeft()->getType()))\n                continue;\n\n            derefs.push_front(visitNode);\n            processedDerefs.insert(visitNode);\n        }\n        processedDerefs.insert(base);\n\n        // See if we have a specific array size to stick to while enumerating the explosion of the aggregate\n        int arraySize = 0;\n        if (isReflectionGranularity(topNode->getLeft()->getType()) && topNode->getLeft()->isArray()) {\n            if (topNode->getOp() == EOpIndexDirect)\n                arraySize = topNode->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst() + 1;\n        }\n\n        // Put the dereference chain together, forward\n        TString baseName;\n        if (! anonymous) {\n            if (block)\n                baseName = base->getType().getTypeName();\n            else\n                baseName = base->getName();\n        }\n        blowUpActiveAggregate(base->getType(), baseName, derefs, derefs.begin(), offset, blockIndex, arraySize, -1, 0,\n                              base->getQualifier().storage, true, &base->getConstArray());\n    }\n\n    int addBlockName(const TString& name, const TType& type, int size)\n    {\n        int blockIndex = 0;\n        if (type.isArray()) {\n            TType derefType(type, 0);\n            for (int e = 0; e < type.getOuterArraySize(); ++e) {\n                int memberBlockIndex = addBlockName(name + \"[\" + String(e) + \"]\", derefType, size);\n                if (e == 0)\n                    blockIndex = memberBlockIndex;\n            }\n        } else {\n            TReflection::TMapIndexToReflection& blocks = reflection.GetBlockMapForStorage(type.getQualifier().storage);\n\n            TReflection::TNameToIndex::const_iterator it = reflection.nameToIndex.find(name.c_str());\n            if (reflection.nameToIndex.find(name.c_str()) == reflection.nameToIndex.end()) {\n                blockIndex = (int)blocks.size();\n                reflection.nameToIndex[name.c_str()] = blockIndex;\n                blocks.push_back(TObjectReflection(name.c_str(), type, -1, -1, size, blockIndex));\n\n                blocks.back().numMembers = countAggregateMembers(type);\n\n                if (updateStageMasks) {\n                    EShLanguageMask& stages = blocks.back().stages;\n                    stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());\n                }\n            }\n            else {\n                blockIndex = it->second;\n                if (updateStageMasks) {\n                    EShLanguageMask& stages = blocks[blockIndex].stages;\n                    stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());\n                }\n            }\n        }\n\n        return blockIndex;\n    }\n\n    // Are we at a level in a dereference chain at which individual active uniform queries are made?\n    bool isReflectionGranularity(const TType& type)\n    {\n        return type.getBasicType() != EbtBlock && type.getBasicType() != EbtStruct && !type.isArrayOfArrays();\n    }\n\n    // For a binary operation indexing into an aggregate, chase down the base of the aggregate.\n    // Return nullptr if the topology does not fit this situation.\n    TIntermSymbol* findBase(const TIntermBinary* node)\n    {\n        TIntermSymbol *base = node->getLeft()->getAsSymbolNode();\n        if (base)\n            return base;\n        TIntermBinary* left = node->getLeft()->getAsBinaryNode();\n        if (! left)\n            return nullptr;\n\n        return findBase(left);\n    }\n\n    //\n    // Translate a glslang sampler type into the GL API #define number.\n    //\n    int mapSamplerToGlType(TSampler sampler)\n    {\n        if (! sampler.image) {\n            // a sampler...\n            switch (sampler.type) {\n            case EbtFloat:\n                switch ((int)sampler.dim) {\n                case Esd1D:\n                    if (sampler.shadow)\n                        return sampler.arrayed ? GL_SAMPLER_1D_ARRAY_SHADOW : GL_SAMPLER_1D_SHADOW;\n                    else\n                        return sampler.arrayed ? GL_SAMPLER_1D_ARRAY : GL_SAMPLER_1D;\n                case Esd2D:\n                    if (sampler.ms) {\n                        return sampler.arrayed ? GL_SAMPLER_2D_MULTISAMPLE_ARRAY : GL_SAMPLER_2D_MULTISAMPLE;\n                    } else {\n                        if (sampler.shadow)\n                            return sampler.arrayed ? GL_SAMPLER_2D_ARRAY_SHADOW : GL_SAMPLER_2D_SHADOW;\n                        else\n                            return sampler.arrayed ? GL_SAMPLER_2D_ARRAY : GL_SAMPLER_2D;\n                    }\n                case Esd3D:\n                    return GL_SAMPLER_3D;\n                case EsdCube:\n                    if (sampler.shadow)\n                        return sampler.arrayed ? GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW : GL_SAMPLER_CUBE_SHADOW;\n                    else\n                        return sampler.arrayed ? GL_SAMPLER_CUBE_MAP_ARRAY : GL_SAMPLER_CUBE;\n                case EsdRect:\n                    return sampler.shadow ? GL_SAMPLER_2D_RECT_SHADOW : GL_SAMPLER_2D_RECT;\n                case EsdBuffer:\n                    return GL_SAMPLER_BUFFER;\n                default:\n                    return 0;\n                }\n            case EbtFloat16:\n                switch ((int)sampler.dim) {\n                case Esd1D:\n                    if (sampler.shadow)\n                        return sampler.arrayed ? GL_FLOAT16_SAMPLER_1D_ARRAY_SHADOW_AMD : GL_FLOAT16_SAMPLER_1D_SHADOW_AMD;\n                    else\n                        return sampler.arrayed ? GL_FLOAT16_SAMPLER_1D_ARRAY_AMD : GL_FLOAT16_SAMPLER_1D_AMD;\n                case Esd2D:\n                    if (sampler.ms) {\n                        return sampler.arrayed ? GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_ARRAY_AMD : GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_AMD;\n                    } else {\n                        if (sampler.shadow)\n                            return sampler.arrayed ? GL_FLOAT16_SAMPLER_2D_ARRAY_SHADOW_AMD : GL_FLOAT16_SAMPLER_2D_SHADOW_AMD;\n                        else\n                            return sampler.arrayed ? GL_FLOAT16_SAMPLER_2D_ARRAY_AMD : GL_FLOAT16_SAMPLER_2D_AMD;\n                    }\n                case Esd3D:\n                    return GL_FLOAT16_SAMPLER_3D_AMD;\n                case EsdCube:\n                    if (sampler.shadow)\n                        return sampler.arrayed ? GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_SHADOW_AMD : GL_FLOAT16_SAMPLER_CUBE_SHADOW_AMD;\n                    else\n                        return sampler.arrayed ? GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_AMD : GL_FLOAT16_SAMPLER_CUBE_AMD;\n                case EsdRect:\n                    return sampler.shadow ? GL_FLOAT16_SAMPLER_2D_RECT_SHADOW_AMD : GL_FLOAT16_SAMPLER_2D_RECT_AMD;\n                case EsdBuffer:\n                    return GL_FLOAT16_SAMPLER_BUFFER_AMD;\n                default:\n                    return 0;\n                }\n            case EbtInt:\n                switch ((int)sampler.dim) {\n                case Esd1D:\n                    return sampler.arrayed ? GL_INT_SAMPLER_1D_ARRAY : GL_INT_SAMPLER_1D;\n                case Esd2D:\n                    if (sampler.ms)\n                        return sampler.arrayed ? GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY\n                                               : GL_INT_SAMPLER_2D_MULTISAMPLE;\n                    else\n                        return sampler.arrayed ? GL_INT_SAMPLER_2D_ARRAY : GL_INT_SAMPLER_2D;\n                case Esd3D:\n                    return GL_INT_SAMPLER_3D;\n                case EsdCube:\n                    return sampler.arrayed ? GL_INT_SAMPLER_CUBE_MAP_ARRAY : GL_INT_SAMPLER_CUBE;\n                case EsdRect:\n                    return GL_INT_SAMPLER_2D_RECT;\n                case EsdBuffer:\n                    return GL_INT_SAMPLER_BUFFER;\n                default:\n                    return 0;\n                }\n            case EbtUint:\n                switch ((int)sampler.dim) {\n                case Esd1D:\n                    return sampler.arrayed ? GL_UNSIGNED_INT_SAMPLER_1D_ARRAY : GL_UNSIGNED_INT_SAMPLER_1D;\n                case Esd2D:\n                    if (sampler.ms)\n                        return sampler.arrayed ? GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY\n                                               : GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE;\n                    else\n                        return sampler.arrayed ? GL_UNSIGNED_INT_SAMPLER_2D_ARRAY : GL_UNSIGNED_INT_SAMPLER_2D;\n                case Esd3D:\n                    return GL_UNSIGNED_INT_SAMPLER_3D;\n                case EsdCube:\n                    return sampler.arrayed ? GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY : GL_UNSIGNED_INT_SAMPLER_CUBE;\n                case EsdRect:\n                    return GL_UNSIGNED_INT_SAMPLER_2D_RECT;\n                case EsdBuffer:\n                    return GL_UNSIGNED_INT_SAMPLER_BUFFER;\n                default:\n                    return 0;\n                }\n            default:\n                return 0;\n            }\n        } else {\n            // an image...\n            switch (sampler.type) {\n            case EbtFloat:\n                switch ((int)sampler.dim) {\n                case Esd1D:\n                    return sampler.arrayed ? GL_IMAGE_1D_ARRAY : GL_IMAGE_1D;\n                case Esd2D:\n                    if (sampler.ms)\n                        return sampler.arrayed ? GL_IMAGE_2D_MULTISAMPLE_ARRAY : GL_IMAGE_2D_MULTISAMPLE;\n                    else\n                        return sampler.arrayed ? GL_IMAGE_2D_ARRAY : GL_IMAGE_2D;\n                case Esd3D:\n                    return GL_IMAGE_3D;\n                case EsdCube:\n                    return sampler.arrayed ? GL_IMAGE_CUBE_MAP_ARRAY : GL_IMAGE_CUBE;\n                case EsdRect:\n                    return GL_IMAGE_2D_RECT;\n                case EsdBuffer:\n                    return GL_IMAGE_BUFFER;\n                default:\n                    return 0;\n                }\n            case EbtFloat16:\n                switch ((int)sampler.dim) {\n                case Esd1D:\n                    return sampler.arrayed ? GL_FLOAT16_IMAGE_1D_ARRAY_AMD : GL_FLOAT16_IMAGE_1D_AMD;\n                case Esd2D:\n                    if (sampler.ms)\n                        return sampler.arrayed ? GL_FLOAT16_IMAGE_2D_MULTISAMPLE_ARRAY_AMD : GL_FLOAT16_IMAGE_2D_MULTISAMPLE_AMD;\n                    else\n                        return sampler.arrayed ? GL_FLOAT16_IMAGE_2D_ARRAY_AMD : GL_FLOAT16_IMAGE_2D_AMD;\n                case Esd3D:\n                    return GL_FLOAT16_IMAGE_3D_AMD;\n                case EsdCube:\n                    return sampler.arrayed ? GL_FLOAT16_IMAGE_CUBE_MAP_ARRAY_AMD : GL_FLOAT16_IMAGE_CUBE_AMD;\n                case EsdRect:\n                    return GL_FLOAT16_IMAGE_2D_RECT_AMD;\n                case EsdBuffer:\n                    return GL_FLOAT16_IMAGE_BUFFER_AMD;\n                default:\n                    return 0;\n                }\n            case EbtInt:\n                switch ((int)sampler.dim) {\n                case Esd1D:\n                    return sampler.arrayed ? GL_INT_IMAGE_1D_ARRAY : GL_INT_IMAGE_1D;\n                case Esd2D:\n                    if (sampler.ms)\n                        return sampler.arrayed ? GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY : GL_INT_IMAGE_2D_MULTISAMPLE;\n                    else\n                        return sampler.arrayed ? GL_INT_IMAGE_2D_ARRAY : GL_INT_IMAGE_2D;\n                case Esd3D:\n                    return GL_INT_IMAGE_3D;\n                case EsdCube:\n                    return sampler.arrayed ? GL_INT_IMAGE_CUBE_MAP_ARRAY : GL_INT_IMAGE_CUBE;\n                case EsdRect:\n                    return GL_INT_IMAGE_2D_RECT;\n                case EsdBuffer:\n                    return GL_INT_IMAGE_BUFFER;\n                default:\n                    return 0;\n                }\n            case EbtUint:\n                switch ((int)sampler.dim) {\n                case Esd1D:\n                    return sampler.arrayed ? GL_UNSIGNED_INT_IMAGE_1D_ARRAY : GL_UNSIGNED_INT_IMAGE_1D;\n                case Esd2D:\n                    if (sampler.ms)\n                        return sampler.arrayed ? GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY\n                                               : GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE;\n                    else\n                        return sampler.arrayed ? GL_UNSIGNED_INT_IMAGE_2D_ARRAY : GL_UNSIGNED_INT_IMAGE_2D;\n                case Esd3D:\n                    return GL_UNSIGNED_INT_IMAGE_3D;\n                case EsdCube:\n                    return sampler.arrayed ? GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY : GL_UNSIGNED_INT_IMAGE_CUBE;\n                case EsdRect:\n                    return GL_UNSIGNED_INT_IMAGE_2D_RECT;\n                case EsdBuffer:\n                    return GL_UNSIGNED_INT_IMAGE_BUFFER;\n                default:\n                    return 0;\n                }\n            default:\n                return 0;\n            }\n        }\n    }\n\n    //\n    // Translate a glslang type into the GL API #define number.\n    // Ignores arrayness.\n    //\n    int mapToGlType(const TType& type)\n    {\n        switch (type.getBasicType()) {\n        case EbtSampler:\n            return mapSamplerToGlType(type.getSampler());\n        case EbtStruct:\n        case EbtBlock:\n        case EbtVoid:\n            return 0;\n        default:\n            break;\n        }\n\n        if (type.isVector()) {\n            int offset = type.getVectorSize() - 2;\n            switch (type.getBasicType()) {\n            case EbtFloat:      return GL_FLOAT_VEC2                  + offset;\n            case EbtDouble:     return GL_DOUBLE_VEC2                 + offset;\n            case EbtFloat16:    return GL_FLOAT16_VEC2_NV             + offset;\n            case EbtInt:        return GL_INT_VEC2                    + offset;\n            case EbtUint:       return GL_UNSIGNED_INT_VEC2           + offset;\n            case EbtInt64:      return GL_INT64_VEC2_ARB              + offset;\n            case EbtUint64:     return GL_UNSIGNED_INT64_VEC2_ARB     + offset;\n            case EbtBool:       return GL_BOOL_VEC2                   + offset;\n            case EbtAtomicUint: return GL_UNSIGNED_INT_ATOMIC_COUNTER + offset;\n            default:            return 0;\n            }\n        }\n        if (type.isMatrix()) {\n            switch (type.getBasicType()) {\n            case EbtFloat:\n                switch (type.getMatrixCols()) {\n                case 2:\n                    switch (type.getMatrixRows()) {\n                    case 2:    return GL_FLOAT_MAT2;\n                    case 3:    return GL_FLOAT_MAT2x3;\n                    case 4:    return GL_FLOAT_MAT2x4;\n                    default:   return 0;\n                    }\n                case 3:\n                    switch (type.getMatrixRows()) {\n                    case 2:    return GL_FLOAT_MAT3x2;\n                    case 3:    return GL_FLOAT_MAT3;\n                    case 4:    return GL_FLOAT_MAT3x4;\n                    default:   return 0;\n                    }\n                case 4:\n                    switch (type.getMatrixRows()) {\n                    case 2:    return GL_FLOAT_MAT4x2;\n                    case 3:    return GL_FLOAT_MAT4x3;\n                    case 4:    return GL_FLOAT_MAT4;\n                    default:   return 0;\n                    }\n                default: return 0;\n                }\n            case EbtDouble:\n                switch (type.getMatrixCols()) {\n                case 2:\n                    switch (type.getMatrixRows()) {\n                    case 2:    return GL_DOUBLE_MAT2;\n                    case 3:    return GL_DOUBLE_MAT2x3;\n                    case 4:    return GL_DOUBLE_MAT2x4;\n                    default:   return 0;\n                    }\n                case 3:\n                    switch (type.getMatrixRows()) {\n                    case 2:    return GL_DOUBLE_MAT3x2;\n                    case 3:    return GL_DOUBLE_MAT3;\n                    case 4:    return GL_DOUBLE_MAT3x4;\n                    default:   return 0;\n                    }\n                case 4:\n                    switch (type.getMatrixRows()) {\n                    case 2:    return GL_DOUBLE_MAT4x2;\n                    case 3:    return GL_DOUBLE_MAT4x3;\n                    case 4:    return GL_DOUBLE_MAT4;\n                    default:   return 0;\n                    }\n                default: return 0;\n                }\n            case EbtFloat16:\n                switch (type.getMatrixCols()) {\n                case 2:\n                    switch (type.getMatrixRows()) {\n                    case 2:    return GL_FLOAT16_MAT2_AMD;\n                    case 3:    return GL_FLOAT16_MAT2x3_AMD;\n                    case 4:    return GL_FLOAT16_MAT2x4_AMD;\n                    default:   return 0;\n                    }\n                case 3:\n                    switch (type.getMatrixRows()) {\n                    case 2:    return GL_FLOAT16_MAT3x2_AMD;\n                    case 3:    return GL_FLOAT16_MAT3_AMD;\n                    case 4:    return GL_FLOAT16_MAT3x4_AMD;\n                    default:   return 0;\n                    }\n                case 4:\n                    switch (type.getMatrixRows()) {\n                    case 2:    return GL_FLOAT16_MAT4x2_AMD;\n                    case 3:    return GL_FLOAT16_MAT4x3_AMD;\n                    case 4:    return GL_FLOAT16_MAT4_AMD;\n                    default:   return 0;\n                    }\n                default: return 0;\n                }\n            default:\n                return 0;\n            }\n        }\n        if (type.getVectorSize() == 1) {\n            switch (type.getBasicType()) {\n            case EbtFloat:      return GL_FLOAT;\n            case EbtDouble:     return GL_DOUBLE;\n            case EbtFloat16:    return GL_FLOAT16_NV;\n            case EbtInt:        return GL_INT;\n            case EbtUint:       return GL_UNSIGNED_INT;\n            case EbtInt64:      return GL_INT64_ARB;\n            case EbtUint64:     return GL_UNSIGNED_INT64_ARB;\n            case EbtBool:       return GL_BOOL;\n            case EbtAtomicUint: return GL_UNSIGNED_INT_ATOMIC_COUNTER;\n            default:            return 0;\n            }\n        }\n\n        return 0;\n    }\n\n    int mapToGlArraySize(const TType& type)\n    {\n        return type.isArray() ? type.getOuterArraySize() : 1;\n    }\n\n    const TIntermediate& intermediate;\n    TReflection& reflection;\n    std::set<const TIntermNode*> processedDerefs;\n    bool updateStageMasks;\n\nprotected:\n    TReflectionTraverser(TReflectionTraverser&);\n    TReflectionTraverser& operator=(TReflectionTraverser&);\n};\n\n//\n// Implement the traversal functions of interest.\n//\n\n// To catch dereferenced aggregates that must be reflected.\n// This catches them at the highest level possible in the tree.\nbool TReflectionTraverser::visitBinary(TVisit /* visit */, TIntermBinary* node)\n{\n    switch (node->getOp()) {\n    case EOpIndexDirect:\n    case EOpIndexIndirect:\n    case EOpIndexDirectStruct:\n        addDereferencedUniform(node);\n        break;\n    default:\n        break;\n    }\n\n    // still need to visit everything below, which could contain sub-expressions\n    // containing different uniforms\n    return true;\n}\n\n// To reflect non-dereferenced objects.\nvoid TReflectionTraverser::visitSymbol(TIntermSymbol* base)\n{\n    if (base->getQualifier().storage == EvqUniform) {\n        if (base->getBasicType() == EbtBlock) {\n            if (reflection.options & EShReflectionSharedStd140UBO) {\n                addUniform(*base);\n            }\n        } else {\n            addUniform(*base);\n        }\n    }\n\n    // #TODO add std140/layout active rules for ssbo, same with ubo.\n    // Storage buffer blocks will be collected and expanding in this part.\n    if((reflection.options & EShReflectionSharedStd140SSBO) &&\n       (base->getQualifier().storage == EvqBuffer && base->getBasicType() == EbtBlock &&\n        (base->getQualifier().layoutPacking == ElpStd140 || base->getQualifier().layoutPacking == ElpShared)))\n        addUniform(*base);\n\n    if ((intermediate.getStage() == reflection.firstStage && base->getQualifier().isPipeInput()) ||\n        (intermediate.getStage() == reflection.lastStage && base->getQualifier().isPipeOutput()))\n        addPipeIOVariable(*base);\n}\n\n//\n// Implement TObjectReflection methods.\n//\n\nTObjectReflection::TObjectReflection(const std::string &pName, const TType &pType, int pOffset, int pGLDefineType,\n                                     int pSize, int pIndex, const TConstUnionArray* pConstArray)\n    : name(pName), offset(pOffset), glDefineType(pGLDefineType), size(pSize), index(pIndex), counterIndex(-1),\n      numMembers(-1), arrayStride(0), topLevelArrayStride(0), stages(EShLanguageMask(0)), type(pType.clone()), constArray(pConstArray)\n{\n}\n\nint TObjectReflection::getBinding() const\n{\n    if (type == nullptr || !type->getQualifier().hasBinding())\n        return -1;\n    return type->getQualifier().layoutBinding;\n}\n\nvoid TObjectReflection::dump() const\n{\n    printf(\"%s: offset %d, type %x, size %d, index %d, binding %d, stages %d\", name.c_str(), offset, glDefineType, size,\n           index, getBinding(), stages);\n\n    if (counterIndex != -1)\n        printf(\", counter %d\", counterIndex);\n\n    if (numMembers != -1)\n        printf(\", numMembers %d\", numMembers);\n\n    if (arrayStride != 0)\n        printf(\", arrayStride %d\", arrayStride);\n\n    if (topLevelArrayStride != 0)\n        printf(\", topLevelArrayStride %d\", topLevelArrayStride);\n\n    printf(\"\\n\");\n}\n\n//\n// Implement TReflection methods.\n//\n\n// Track any required attribute reflection, such as compute shader numthreads.\n//\nvoid TReflection::buildAttributeReflection(EShLanguage stage, const TIntermediate& intermediate)\n{\n    if (stage == EShLangCompute) {\n        // Remember thread dimensions\n        for (int dim=0; dim<3; ++dim) {\n            localSize[dim] = intermediate.getLocalSize(dim);\n            tileShadingRateQCOM[dim] = intermediate.getTileShadingRateQCOM(dim);\n        }\n    }\n}\n\n// build counter block index associations for buffers\nvoid TReflection::buildCounterIndices(const TIntermediate& intermediate)\n{\n#ifdef ENABLE_HLSL\n    // search for ones that have counters\n    for (int i = 0; i < int(indexToUniformBlock.size()); ++i) {\n        const TString counterName(intermediate.addCounterBufferName(indexToUniformBlock[i].name).c_str());\n        const int index = getIndex(counterName);\n\n        if (index >= 0)\n            indexToUniformBlock[i].counterIndex = index;\n    }\n#else\n    (void)intermediate;\n#endif\n}\n\n// build Shader Stages mask for all uniforms\nvoid TReflection::buildUniformStageMask(const TIntermediate& intermediate)\n{\n    if (options & EShReflectionAllBlockVariables)\n        return;\n\n    for (int i = 0; i < int(indexToUniform.size()); ++i) {\n        indexToUniform[i].stages = static_cast<EShLanguageMask>(indexToUniform[i].stages | 1 << intermediate.getStage());\n    }\n\n    for (int i = 0; i < int(indexToBufferVariable.size()); ++i) {\n        indexToBufferVariable[i].stages =\n            static_cast<EShLanguageMask>(indexToBufferVariable[i].stages | 1 << intermediate.getStage());\n    }\n}\n\n// Merge live symbols from 'intermediate' into the existing reflection database.\n//\n// Returns false if the input is too malformed to do this.\nbool TReflection::addStage(EShLanguage stage, const TIntermediate& intermediate)\n{\n    if (intermediate.getTreeRoot() == nullptr ||\n        intermediate.getNumEntryPoints() != 1 ||\n        intermediate.isRecursive())\n        return false;\n\n    buildAttributeReflection(stage, intermediate);\n\n    TReflectionTraverser it(intermediate, *this);\n\n    for (auto& sequnence : intermediate.getTreeRoot()->getAsAggregate()->getSequence()) {\n        if (sequnence->getAsAggregate() != nullptr) {\n            if (sequnence->getAsAggregate()->getOp() == glslang::EOpLinkerObjects) {\n                it.updateStageMasks = false;\n                TIntermAggregate* linkerObjects = sequnence->getAsAggregate();\n                for (auto& sequnence : linkerObjects->getSequence()) {\n                    auto pNode = sequnence->getAsSymbolNode();\n                    if (pNode != nullptr) {\n                        if ((pNode->getQualifier().storage == EvqUniform &&\n                            (options & EShReflectionSharedStd140UBO)) ||\n                           (pNode->getQualifier().storage == EvqBuffer &&\n                            (options & EShReflectionSharedStd140SSBO))) {\n                            // collect std140 and shared uniform block form AST\n                            if ((pNode->getBasicType() == EbtBlock) &&\n                                ((pNode->getQualifier().layoutPacking == ElpStd140) ||\n                                 (pNode->getQualifier().layoutPacking == ElpShared))) {\n                                   pNode->traverse(&it);\n                            }\n                        }\n                        else if ((options & EShReflectionAllIOVariables) &&\n                            (pNode->getQualifier().isPipeInput() || pNode->getQualifier().isPipeOutput()))\n                        {\n                            pNode->traverse(&it);\n                        }\n                    }\n                }\n            } else {\n                // This traverser will travers all function in AST.\n                // If we want reflect uncalled function, we need set linke message EShMsgKeepUncalled.\n                // When EShMsgKeepUncalled been set to true, all function will be keep in AST, even it is a uncalled function.\n                // This will keep some uniform variables in reflection, if those uniform variables is used in these uncalled function.\n                //\n                // If we just want reflect only live node, we can use a default link message or set EShMsgKeepUncalled false.\n                // When linke message not been set EShMsgKeepUncalled, linker won't keep uncalled function in AST.\n                // So, travers all function node can equivalent to travers live function.\n                it.updateStageMasks = true;\n                sequnence->getAsAggregate()->traverse(&it);\n            }\n        }\n    }\n    it.updateStageMasks = true;\n\n    buildCounterIndices(intermediate);\n    buildUniformStageMask(intermediate);\n\n    return true;\n}\n\nvoid TReflection::dump()\n{\n    printf(\"Uniform reflection:\\n\");\n    for (size_t i = 0; i < indexToUniform.size(); ++i)\n        indexToUniform[i].dump();\n    printf(\"\\n\");\n\n    printf(\"Uniform block reflection:\\n\");\n    for (size_t i = 0; i < indexToUniformBlock.size(); ++i)\n        indexToUniformBlock[i].dump();\n    printf(\"\\n\");\n\n    printf(\"Buffer variable reflection:\\n\");\n    for (size_t i = 0; i < indexToBufferVariable.size(); ++i)\n      indexToBufferVariable[i].dump();\n    printf(\"\\n\");\n\n    printf(\"Buffer block reflection:\\n\");\n    for (size_t i = 0; i < indexToBufferBlock.size(); ++i)\n      indexToBufferBlock[i].dump();\n    printf(\"\\n\");\n\n    printf(\"Pipeline input reflection:\\n\");\n    for (size_t i = 0; i < indexToPipeInput.size(); ++i)\n        indexToPipeInput[i].dump();\n    printf(\"\\n\");\n\n    printf(\"Pipeline output reflection:\\n\");\n    for (size_t i = 0; i < indexToPipeOutput.size(); ++i)\n        indexToPipeOutput[i].dump();\n    printf(\"\\n\");\n\n    static const char* axis[] = { \"X\", \"Y\", \"Z\" };\n    if (getLocalSize(0) > 1) {\n        for (int dim=0; dim<3; ++dim)\n            if (getLocalSize(dim) > 1)\n                printf(\"Local size %s: %u\\n\", axis[dim], getLocalSize(dim));\n\n        printf(\"\\n\");\n    }\n\n    if (getTileShadingRateQCOM(0) > 1 || getTileShadingRateQCOM(1) > 1) {\n        for (int dim=0; dim<3; ++dim)\n            printf(\"Tile shading rate QCOM %s: %u\\n\", axis[dim], getTileShadingRateQCOM(dim));\n        printf(\"\\n\");\n    }\n\n    // printf(\"Live names\\n\");\n    // for (TNameToIndex::const_iterator it = nameToIndex.begin(); it != nameToIndex.end(); ++it)\n    //    printf(\"%s: %d\\n\", it->first.c_str(), it->second);\n    // printf(\"\\n\");\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/reflection.h",
    "content": "//\n// Copyright (C) 2013-2016 LunarG, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#ifndef _REFLECTION_INCLUDED\n#define _REFLECTION_INCLUDED\n\n#include \"../Public/ShaderLang.h\"\n#include \"../Include/BaseTypes.h\"\n#include \"../Include/visibility.h\"\n#include <list>\n#include <set>\n\n//\n// A reflection database and its interface, consistent with the OpenGL API reflection queries.\n//\n\nnamespace glslang {\n\nclass TIntermediate;\nclass TIntermAggregate;\nclass TReflectionTraverser;\n\n// The full reflection database\nclass TReflection {\npublic:\n    TReflection(EShReflectionOptions opts, EShLanguage first, EShLanguage last)\n        : options(opts), firstStage(first), lastStage(last), badReflection(TObjectReflection::badReflection())\n    { \n        for (int dim=0; dim<3; ++dim) {\n            localSize[dim] = 0;\n            tileShadingRateQCOM[dim] = 0;\n        }\n    }\n\n    virtual ~TReflection() {}\n\n    // grow the reflection stage by stage\n    GLSLANG_EXPORT_FOR_TESTS\n    bool addStage(EShLanguage, const TIntermediate&);\n\n    // for mapping a uniform index to a uniform object's description\n    int getNumUniforms() { return (int)indexToUniform.size(); }\n    const TObjectReflection& getUniform(int i) const\n    {\n        if (i >= 0 && i < (int)indexToUniform.size())\n            return indexToUniform[i];\n        else\n            return badReflection;\n    }\n\n    // for mapping a block index to the block's description\n    int getNumUniformBlocks() const { return (int)indexToUniformBlock.size(); }\n    const TObjectReflection& getUniformBlock(int i) const\n    {\n        if (i >= 0 && i < (int)indexToUniformBlock.size())\n            return indexToUniformBlock[i];\n        else\n            return badReflection;\n    }\n\n    // for mapping an pipeline input index to the input's description\n    int getNumPipeInputs() { return (int)indexToPipeInput.size(); }\n    const TObjectReflection& getPipeInput(int i) const\n    {\n        if (i >= 0 && i < (int)indexToPipeInput.size())\n            return indexToPipeInput[i];\n        else\n            return badReflection;\n    }\n\n    // for mapping an pipeline output index to the output's description\n    int getNumPipeOutputs() { return (int)indexToPipeOutput.size(); }\n    const TObjectReflection& getPipeOutput(int i) const\n    {\n        if (i >= 0 && i < (int)indexToPipeOutput.size())\n            return indexToPipeOutput[i];\n        else\n            return badReflection;\n    }\n\n    // for mapping from an atomic counter to the uniform index\n    int getNumAtomicCounters() const { return (int)atomicCounterUniformIndices.size(); }\n    const TObjectReflection& getAtomicCounter(int i) const\n    {\n        if (i >= 0 && i < (int)atomicCounterUniformIndices.size())\n            return getUniform(atomicCounterUniformIndices[i]);\n        else\n            return badReflection;\n    }\n\n    // for mapping a buffer variable index to a buffer variable object's description\n    int getNumBufferVariables() { return (int)indexToBufferVariable.size(); }\n    const TObjectReflection& getBufferVariable(int i) const\n    {\n        if (i >= 0 && i < (int)indexToBufferVariable.size())\n            return indexToBufferVariable[i];\n        else\n            return badReflection;\n    }\n    \n    // for mapping a storage block index to the storage block's description\n    int getNumStorageBuffers() const { return (int)indexToBufferBlock.size(); }\n    const TObjectReflection&  getStorageBufferBlock(int i) const\n    {\n        if (i >= 0 && i < (int)indexToBufferBlock.size())\n            return indexToBufferBlock[i];\n        else\n            return badReflection;\n    }\n\n    // for mapping any name to its index (block names, uniform names and input/output names)\n    int getIndex(const char* name) const\n    {\n        TNameToIndex::const_iterator it = nameToIndex.find(name);\n        if (it == nameToIndex.end())\n            return -1;\n        else\n            return it->second;\n    }\n\n    // see getIndex(const char*)\n    int getIndex(const TString& name) const { return getIndex(name.c_str()); }\n\n\n    // for mapping any name to its index (only pipe input/output names)\n    int getPipeIOIndex(const char* name, const bool inOrOut) const\n    {\n        TNameToIndex::const_iterator it = inOrOut ? pipeInNameToIndex.find(name) : pipeOutNameToIndex.find(name);\n        if (it == (inOrOut ? pipeInNameToIndex.end() : pipeOutNameToIndex.end()))\n            return -1;\n        else\n            return it->second;\n    }\n\n    // see gePipeIOIndex(const char*, const bool)\n    int getPipeIOIndex(const TString& name, const bool inOrOut) const { return getPipeIOIndex(name.c_str(), inOrOut); }\n\n    // Thread local size\n    unsigned getLocalSize(int dim) const { return dim <= 2 ? localSize[dim] : 0; }\n\n    // Tile shading rate QCOM\n    unsigned getTileShadingRateQCOM(int dim) const { return dim <= 2 ? tileShadingRateQCOM[dim] : 0; }\n\n    void dump();\n\nprotected:\n    friend class glslang::TReflectionTraverser;\n\n    void buildCounterIndices(const TIntermediate&);\n    void buildUniformStageMask(const TIntermediate& intermediate);\n    void buildAttributeReflection(EShLanguage, const TIntermediate&);\n\n    // Need a TString hash: typedef std::unordered_map<TString, int> TNameToIndex;\n    typedef std::map<std::string, int> TNameToIndex;\n    typedef std::vector<TObjectReflection> TMapIndexToReflection;\n    typedef std::vector<int> TIndices;\n\n    TMapIndexToReflection& GetBlockMapForStorage(TStorageQualifier storage)\n    {\n        if ((options & EShReflectionSeparateBuffers) && storage == EvqBuffer)\n            return indexToBufferBlock;\n        return indexToUniformBlock;\n    }\n    TMapIndexToReflection& GetVariableMapForStorage(TStorageQualifier storage)\n    {\n        if ((options & EShReflectionSeparateBuffers) && storage == EvqBuffer)\n            return indexToBufferVariable;\n        return indexToUniform;\n    }\n\n    EShReflectionOptions options;\n\n    EShLanguage firstStage;\n    EShLanguage lastStage;\n\n    TObjectReflection badReflection; // return for queries of -1 or generally out of range; has expected descriptions with in it for this\n    TNameToIndex nameToIndex;        // maps names to indexes; can hold all types of data: uniform/buffer and which function names have been processed\n    TNameToIndex pipeInNameToIndex;  // maps pipe in names to indexes, this is a fix to seperate pipe I/O from uniforms and buffers.\n    TNameToIndex pipeOutNameToIndex; // maps pipe out names to indexes, this is a fix to seperate pipe I/O from uniforms and buffers.\n    TMapIndexToReflection indexToUniform;\n    TMapIndexToReflection indexToUniformBlock;\n    TMapIndexToReflection indexToBufferVariable;\n    TMapIndexToReflection indexToBufferBlock;\n    TMapIndexToReflection indexToPipeInput;\n    TMapIndexToReflection indexToPipeOutput;\n    TIndices atomicCounterUniformIndices;\n\n    unsigned int localSize[3];\n    unsigned int tileShadingRateQCOM[3];\n};\n\n} // end namespace glslang\n\n#endif // _REFLECTION_INCLUDED\n"
  },
  {
    "path": "src/libraries/glslang/glslang/MachineIndependent/span.h",
    "content": "#pragma once\n\n//\n// Copyright (C) 2023 LunarG, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n// Partial implementation of std::span for C++11\n// Replace with std::span if repo standard is bumped to C++20\n//\n// This code was copied from https://github.com/KhronosGroup/Vulkan-ValidationLayers/blob/main/layers/containers/custom_containers.h\ntemplate <typename T>\nclass span {\n  public:\n    using pointer = T *;\n    using const_pointer = T const *;\n    using iterator = pointer;\n    using const_iterator = const_pointer;\n\n    span() = default;\n    span(pointer start, size_t n) : data_(start), count_(n) {}\n    template <typename Iterator>\n    span(Iterator start, Iterator end) : data_(&(*start)), count_(end - start) {}\n    template <typename Container>\n    span(Container &c) : data_(c.data()), count_(c.size()) {}\n\n    iterator begin() { return data_; }\n    const_iterator begin() const { return data_; }\n\n    iterator end() { return data_ + count_; }\n    const_iterator end() const { return data_ + count_; }\n\n    T &operator[](int i) { return data_[i]; }\n    const T &operator[](int i) const { return data_[i]; }\n\n    T &front() { return *data_; }\n    const T &front() const { return *data_; }\n\n    T &back() { return *(data_ + (count_ - 1)); }\n    const T &back() const { return *(data_ + (count_ - 1)); }\n\n    size_t size() const { return count_; }\n    bool empty() const { return count_ == 0; }\n\n    pointer data() { return data_; }\n    const_pointer data() const { return data_; }\n\n  private:\n    pointer data_ = {};\n    size_t count_ = 0;\n};\n\n//\n// Allow type inference that using the constructor doesn't allow in C++11\ntemplate <typename T>\nspan<T> make_span(T *begin, size_t count) {\n    return span<T>(begin, count);\n}\ntemplate <typename T>\nspan<T> make_span(T *begin, T *end) {\n    return make_span<T>(begin, end);\n}\n"
  },
  {
    "path": "src/libraries/glslang/glslang/OSDependent/Unix/ossource.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n//\n// This file contains the Linux-specific functions\n//\n#include \"../osinclude.h\"\n\n#include <cstdio>\n\n#if !defined(__Fuchsia__)\n#include <sys/resource.h>\n#endif\n\nnamespace glslang {\n\n// #define DUMP_COUNTERS\n\nvoid OS_DumpMemoryCounters()\n{\n#ifdef DUMP_COUNTERS\n    struct rusage usage;\n\n    if (getrusage(RUSAGE_SELF, &usage) == 0)\n        printf(\"Working set size: %ld\\n\", usage.ru_maxrss * 1024);\n#else\n    printf(\"Recompile with DUMP_COUNTERS defined to see counters.\\n\");\n#endif\n}\n\n} // end namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/OSDependent/Web/glslang.after.js",
    "content": "export default (() => {\n    const initialize = () => {\n        return new Promise(resolve => {\n            Module({\n                locateFile() {\n                    const i = import.meta.url.lastIndexOf('/')\n                    return import.meta.url.substring(0, i) + '/glslang.wasm';\n                },\n                onRuntimeInitialized() {\n                    resolve({\n                        compileGLSLZeroCopy: this.compileGLSLZeroCopy,\n                        compileGLSL: this.compileGLSL,\n                    });\n                },\n            });\n        });\n    };\n\n    let instance;\n    return () => {\n        if (!instance) {\n            instance = initialize();\n        }\n        return instance;\n    };\n})();\n"
  },
  {
    "path": "src/libraries/glslang/glslang/OSDependent/Web/glslang.js.cpp",
    "content": "//\n// Copyright (C) 2019 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#include <cstdio>\n#include <cstdint>\n#include <memory>\n\n#ifdef __EMSCRIPTEN__\n#include <emscripten.h>\n#endif\n\n#include \"../../../SPIRV/GlslangToSpv.h\"\n#include \"../../../glslang/Public/ShaderLang.h\"\n\n#ifndef __EMSCRIPTEN__\n#define EMSCRIPTEN_KEEPALIVE\n#endif\n\nconst TBuiltInResource DefaultTBuiltInResource = {\n    /* .MaxLights = */ 32,\n    /* .MaxClipPlanes = */ 6,\n    /* .MaxTextureUnits = */ 32,\n    /* .MaxTextureCoords = */ 32,\n    /* .MaxVertexAttribs = */ 64,\n    /* .MaxVertexUniformComponents = */ 4096,\n    /* .MaxVaryingFloats = */ 64,\n    /* .MaxVertexTextureImageUnits = */ 32,\n    /* .MaxCombinedTextureImageUnits = */ 80,\n    /* .MaxTextureImageUnits = */ 32,\n    /* .MaxFragmentUniformComponents = */ 4096,\n    /* .MaxDrawBuffers = */ 32,\n    /* .MaxVertexUniformVectors = */ 128,\n    /* .MaxVaryingVectors = */ 8,\n    /* .MaxFragmentUniformVectors = */ 16,\n    /* .MaxVertexOutputVectors = */ 16,\n    /* .MaxFragmentInputVectors = */ 15,\n    /* .MinProgramTexelOffset = */ -8,\n    /* .MaxProgramTexelOffset = */ 7,\n    /* .MaxClipDistances = */ 8,\n    /* .MaxComputeWorkGroupCountX = */ 65535,\n    /* .MaxComputeWorkGroupCountY = */ 65535,\n    /* .MaxComputeWorkGroupCountZ = */ 65535,\n    /* .MaxComputeWorkGroupSizeX = */ 1024,\n    /* .MaxComputeWorkGroupSizeY = */ 1024,\n    /* .MaxComputeWorkGroupSizeZ = */ 64,\n    /* .MaxComputeUniformComponents = */ 1024,\n    /* .MaxComputeTextureImageUnits = */ 16,\n    /* .MaxComputeImageUniforms = */ 8,\n    /* .MaxComputeAtomicCounters = */ 8,\n    /* .MaxComputeAtomicCounterBuffers = */ 1,\n    /* .MaxVaryingComponents = */ 60,\n    /* .MaxVertexOutputComponents = */ 64,\n    /* .MaxGeometryInputComponents = */ 64,\n    /* .MaxGeometryOutputComponents = */ 128,\n    /* .MaxFragmentInputComponents = */ 128,\n    /* .MaxImageUnits = */ 8,\n    /* .MaxCombinedImageUnitsAndFragmentOutputs = */ 8,\n    /* .MaxCombinedShaderOutputResources = */ 8,\n    /* .MaxImageSamples = */ 0,\n    /* .MaxVertexImageUniforms = */ 0,\n    /* .MaxTessControlImageUniforms = */ 0,\n    /* .MaxTessEvaluationImageUniforms = */ 0,\n    /* .MaxGeometryImageUniforms = */ 0,\n    /* .MaxFragmentImageUniforms = */ 8,\n    /* .MaxCombinedImageUniforms = */ 8,\n    /* .MaxGeometryTextureImageUnits = */ 16,\n    /* .MaxGeometryOutputVertices = */ 256,\n    /* .MaxGeometryTotalOutputComponents = */ 1024,\n    /* .MaxGeometryUniformComponents = */ 1024,\n    /* .MaxGeometryVaryingComponents = */ 64,\n    /* .MaxTessControlInputComponents = */ 128,\n    /* .MaxTessControlOutputComponents = */ 128,\n    /* .MaxTessControlTextureImageUnits = */ 16,\n    /* .MaxTessControlUniformComponents = */ 1024,\n    /* .MaxTessControlTotalOutputComponents = */ 4096,\n    /* .MaxTessEvaluationInputComponents = */ 128,\n    /* .MaxTessEvaluationOutputComponents = */ 128,\n    /* .MaxTessEvaluationTextureImageUnits = */ 16,\n    /* .MaxTessEvaluationUniformComponents = */ 1024,\n    /* .MaxTessPatchComponents = */ 120,\n    /* .MaxPatchVertices = */ 32,\n    /* .MaxTessGenLevel = */ 64,\n    /* .MaxViewports = */ 16,\n    /* .MaxVertexAtomicCounters = */ 0,\n    /* .MaxTessControlAtomicCounters = */ 0,\n    /* .MaxTessEvaluationAtomicCounters = */ 0,\n    /* .MaxGeometryAtomicCounters = */ 0,\n    /* .MaxFragmentAtomicCounters = */ 8,\n    /* .MaxCombinedAtomicCounters = */ 8,\n    /* .MaxAtomicCounterBindings = */ 1,\n    /* .MaxVertexAtomicCounterBuffers = */ 0,\n    /* .MaxTessControlAtomicCounterBuffers = */ 0,\n    /* .MaxTessEvaluationAtomicCounterBuffers = */ 0,\n    /* .MaxGeometryAtomicCounterBuffers = */ 0,\n    /* .MaxFragmentAtomicCounterBuffers = */ 1,\n    /* .MaxCombinedAtomicCounterBuffers = */ 1,\n    /* .MaxAtomicCounterBufferSize = */ 16384,\n    /* .MaxTransformFeedbackBuffers = */ 4,\n    /* .MaxTransformFeedbackInterleavedComponents = */ 64,\n    /* .MaxCullDistances = */ 8,\n    /* .MaxCombinedClipAndCullDistances = */ 8,\n    /* .MaxSamples = */ 4,\n    /* .maxMeshOutputVerticesNV = */ 256,\n    /* .maxMeshOutputPrimitivesNV = */ 512,\n    /* .maxMeshWorkGroupSizeX_NV = */ 32,\n    /* .maxMeshWorkGroupSizeY_NV = */ 1,\n    /* .maxMeshWorkGroupSizeZ_NV = */ 1,\n    /* .maxTaskWorkGroupSizeX_NV = */ 32,\n    /* .maxTaskWorkGroupSizeY_NV = */ 1,\n    /* .maxTaskWorkGroupSizeZ_NV = */ 1,\n    /* .maxMeshViewCountNV = */ 4,\n    /* .maxMeshOutputVerticesEXT = */ 256,\n    /* .maxMeshOutputPrimitivesEXT = */ 512,\n    /* .maxMeshWorkGroupSizeX_EXT = */ 32,\n    /* .maxMeshWorkGroupSizeY_EXT = */ 1,\n    /* .maxMeshWorkGroupSizeZ_EXT = */ 1,\n    /* .maxTaskWorkGroupSizeX_EXT = */ 32,\n    /* .maxTaskWorkGroupSizeY_EXT = */ 1,\n    /* .maxTaskWorkGroupSizeZ_EXT = */ 1,\n    /* .maxMeshViewCountEXT = */ 4,\n    /* .maxDualSourceDrawBuffersEXT = */ 1,\n\n    /* .limits = */ {\n        /* .nonInductiveForLoops = */ 1,\n        /* .whileLoops = */ 1,\n        /* .doWhileLoops = */ 1,\n        /* .generalUniformIndexing = */ 1,\n        /* .generalAttributeMatrixVectorIndexing = */ 1,\n        /* .generalVaryingIndexing = */ 1,\n        /* .generalSamplerIndexing = */ 1,\n        /* .generalVariableIndexing = */ 1,\n        /* .generalConstantMatrixVectorIndexing = */ 1,\n    }};\n\nstatic bool initialized = false;\n\nextern \"C\" {\n\n/*\n * Takes in a GLSL shader as a string and converts it to SPIR-V in binary form.\n *\n * |glsl|          Null-terminated string containing the shader to be converted.\n * |stage_int|     Magic number indicating the type of shader being processed.\n*                  Legal values are as follows:\n *                   Vertex = 0\n *                   Fragment = 4\n *                   Compute = 5\n * |gen_debug|     Flag to indicate if debug information should be generated.\n * |spirv|         Output parameter for a pointer to the resulting SPIR-V data.\n * |spirv_len|     Output parameter for the length of the output binary buffer.\n *\n * Returns a void* pointer which, if not null, must be destroyed by\n * destroy_output_buffer.o. (This is not the same pointer returned in |spirv|.)\n * If null, the compilation failed.\n */\nEMSCRIPTEN_KEEPALIVE\nvoid* convert_glsl_to_spirv(const char* glsl,\n                            int stage_int,\n                            bool gen_debug,\n                            glslang::EShTargetLanguageVersion spirv_version,\n                            uint32_t** spirv,\n                            size_t* spirv_len)\n{\n    if (glsl == nullptr) {\n        fprintf(stderr, \"Input pointer null\\n\");\n        return nullptr;\n    }\n    if (spirv == nullptr || spirv_len == nullptr) {\n        fprintf(stderr, \"Output pointer null\\n\");\n        return nullptr;\n    }\n    *spirv = nullptr;\n    *spirv_len = 0;\n\n    if (stage_int != 0 && stage_int != 4 && stage_int != 5) {\n        fprintf(stderr, \"Invalid shader stage\\n\");\n        return nullptr;\n    }\n    EShLanguage stage = static_cast<EShLanguage>(stage_int);\n    switch (spirv_version) {\n        case glslang::EShTargetSpv_1_0:\n        case glslang::EShTargetSpv_1_1:\n        case glslang::EShTargetSpv_1_2:\n        case glslang::EShTargetSpv_1_3:\n        case glslang::EShTargetSpv_1_4:\n        case glslang::EShTargetSpv_1_5:\n            break;\n        default:\n            fprintf(stderr, \"Invalid SPIR-V version number\\n\");\n            return nullptr;\n    }\n\n    if (!initialized) {\n        glslang::InitializeProcess();\n        initialized = true;\n    }\n\n    glslang::TShader shader(stage);\n    shader.setStrings(&glsl, 1);\n    shader.setEnvInput(glslang::EShSourceGlsl, stage, glslang::EShClientVulkan, 100);\n    shader.setEnvClient(glslang::EShClientVulkan, glslang::EShTargetVulkan_1_0);\n    shader.setEnvTarget(glslang::EShTargetSpv, spirv_version);\n    if (!shader.parse(&DefaultTBuiltInResource, 100, true, EShMsgDefault)) {\n        fprintf(stderr, \"Parse failed\\n\");\n        fprintf(stderr, \"%s\\n\", shader.getInfoLog());\n        return nullptr;\n    }\n\n    glslang::TProgram program;\n    program.addShader(&shader);\n    if (!program.link(EShMsgDefault)) {\n        fprintf(stderr, \"Link failed\\n\");\n        fprintf(stderr, \"%s\\n\", program.getInfoLog());\n        return nullptr;\n    }\n\n    glslang::SpvOptions spvOptions;\n    spvOptions.generateDebugInfo = gen_debug;\n    spvOptions.optimizeSize = false;\n    spvOptions.disassemble = false;\n    spvOptions.validate = false;\n\n    std::vector<uint32_t>* output = new std::vector<uint32_t>;\n    glslang::GlslangToSpv(*program.getIntermediate(stage), *output, nullptr, &spvOptions);\n\n    *spirv_len = output->size();\n    *spirv = output->data();\n    return output;\n}\n\n/*\n * Destroys a buffer created by convert_glsl_to_spirv\n */\nEMSCRIPTEN_KEEPALIVE\nvoid destroy_output_buffer(void* p)\n{\n    delete static_cast<std::vector<uint32_t>*>(p);\n}\n\n}  // extern \"C\"\n\n/*\n * For non-Emscripten builds we supply a generic main, so that the glslang.js\n * build target can generate an executable with a trivial use case instead of\n * generating a WASM binary. This is done so that there is a target that can be\n * built and output analyzed using desktop tools, since WASM binaries are\n * specific to the Emscripten toolchain.\n */\n#ifndef __EMSCRIPTEN__\nint main() {\n    const char* input = R\"(#version 310 es\n\nvoid main() { })\";\n\n    uint32_t* output;\n    size_t output_len;\n\n    void* id = convert_glsl_to_spirv(input, 4, false, glslang::EShTargetSpv_1_0, &output, &output_len);\n    assert(output != nullptr);\n    assert(output_len != 0);\n    destroy_output_buffer(id);\n    return 0;\n}\n#endif  // ifndef __EMSCRIPTEN__\n"
  },
  {
    "path": "src/libraries/glslang/glslang/OSDependent/Web/glslang.pre.js",
    "content": "Module['compileGLSLZeroCopy'] = function(glsl, shader_stage, gen_debug, spirv_version) {\n    gen_debug = !!gen_debug;\n\n    var shader_stage_int; // EShLanguage\n    switch (shader_stage) {\n        case 'vertex':   shader_stage_int = 0; break;\n        case 'fragment': shader_stage_int = 4; break;\n        case 'compute':  shader_stage_int = 5; break;\n        default:\n            throw new Error(\"shader_stage must be 'vertex', 'fragment', or 'compute'.\");\n    }\n\n    spirv_version = spirv_version || '1.0';\n    var spirv_version_int; // EShTargetLanguageVersion\n    switch (spirv_version) {\n        case '1.0': spirv_version_int = (1 << 16) | (0 << 8); break;\n        case '1.1': spirv_version_int = (1 << 16) | (1 << 8); break;\n        case '1.2': spirv_version_int = (1 << 16) | (2 << 8); break;\n        case '1.3': spirv_version_int = (1 << 16) | (3 << 8); break;\n        case '1.4': spirv_version_int = (1 << 16) | (4 << 8); break;\n        case '1.5': spirv_version_int = (1 << 16) | (5 << 8); break;\n        default:\n            throw new Error(\"spirv_version must be '1.0' ~ '1.5'.\");\n    }\n\n    var p_output = Module['_malloc'](4);\n    var p_output_len = Module['_malloc'](4);\n    var id = Module['ccall']('convert_glsl_to_spirv',\n        'number',\n        ['string', 'number', 'boolean', 'number', 'number', 'number'],\n        [glsl, shader_stage_int, gen_debug, spirv_version_int, p_output, p_output_len]);\n    var output = getValue(p_output, 'i32');\n    var output_len = getValue(p_output_len, 'i32');\n    Module['_free'](p_output);\n    Module['_free'](p_output_len);\n\n    if (id === 0) {\n        throw new Error('GLSL compilation failed');\n    }\n\n    var ret = {};\n    var outputIndexU32 = output / 4;\n    ret['data'] = Module['HEAPU32'].subarray(outputIndexU32, outputIndexU32 + output_len);\n    ret['free'] = function() {\n        Module['_destroy_output_buffer'](id);\n    };\n\n    return ret;\n};\n\nModule['compileGLSL'] = function(glsl, shader_stage, gen_debug, spirv_version) {\n    var compiled = Module['compileGLSLZeroCopy'](glsl, shader_stage, gen_debug, spirv_version);\n    var ret = compiled['data'].slice()\n    compiled['free']();\n    return ret;\n};\n"
  },
  {
    "path": "src/libraries/glslang/glslang/OSDependent/Windows/ossource.cpp",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#include \"../osinclude.h\"\n\n#define STRICT\n#define VC_EXTRALEAN 1\n#include <windows.h>\n#include <process.h>\n#include <psapi.h>\n#include <cstdio>\n\n//\n// This file contains the Window-OS-specific functions\n//\n\n#if !(defined(_WIN32) || defined(_WIN64))\n#error Trying to build a windows specific file in a non windows build.\n#endif\n\nnamespace glslang {\n\n//#define DUMP_COUNTERS\n\nvoid OS_DumpMemoryCounters()\n{\n#ifdef DUMP_COUNTERS\n    PROCESS_MEMORY_COUNTERS counters;\n    GetProcessMemoryInfo(GetCurrentProcess(), &counters, sizeof(counters));\n    printf(\"Working set size: %d\\n\", counters.WorkingSetSize);\n#else\n    printf(\"Recompile with DUMP_COUNTERS defined to see counters.\\n\");\n#endif\n}\n\n} // namespace glslang\n"
  },
  {
    "path": "src/libraries/glslang/glslang/OSDependent/osinclude.h",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n\n#ifndef __OSINCLUDE_H\n#define __OSINCLUDE_H\n\n#include \"../Include/visibility.h\"\nnamespace glslang {\n\nGLSLANG_EXPORT void OS_DumpMemoryCounters();\n\n} // end namespace glslang\n\n#endif // __OSINCLUDE_H\n"
  },
  {
    "path": "src/libraries/glslang/glslang/Public/ResourceLimits.h",
    "content": "//\n// Copyright (C) 2016 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of Google Inc. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef _STAND_ALONE_RESOURCE_LIMITS_INCLUDED_\n#define _STAND_ALONE_RESOURCE_LIMITS_INCLUDED_\n\n#include <string>\n\n#include \"../Include/ResourceLimits.h\"\n#include \"../Include/visibility.h\"\n\n// Return pointer to user-writable Resource to pass through API in\n// future-proof way.\nGLSLANG_EXPORT extern TBuiltInResource* GetResources();\n\n// These are the default resources for TBuiltInResources, used for both\n//  - parsing this string for the case where the user didn't supply one,\n//  - dumping out a template for user construction of a config file.\nGLSLANG_EXPORT extern const TBuiltInResource* GetDefaultResources();\n\n// Returns the DefaultTBuiltInResource as a human-readable string.\nGLSLANG_EXPORT std::string GetDefaultTBuiltInResourceString();\n\n// Decodes the resource limits from |config| to |resources|.\nGLSLANG_EXPORT void DecodeResourceLimits(TBuiltInResource* resources, char* config);\n\n#endif  // _STAND_ALONE_RESOURCE_LIMITS_INCLUDED_\n"
  },
  {
    "path": "src/libraries/glslang/glslang/Public/ShaderLang.h",
    "content": "//\n// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.\n// Copyright (C) 2013-2016 LunarG, Inc.\n// Copyright (C) 2015-2018 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n//\n#ifndef _COMPILER_INTERFACE_INCLUDED_\n#define _COMPILER_INTERFACE_INCLUDED_\n\n#include \"../Include/ResourceLimits.h\"\n#include \"../Include/visibility.h\"\n#include \"../MachineIndependent/Versions.h\"\n\n#include <cstring>\n#include <vector>\n\n#ifdef _WIN32\n    #define C_DECL __cdecl\n#else\n    #define C_DECL\n#endif\n\n//\n// This is the platform independent interface between an OGL driver\n// and the shading language compiler/linker.\n//\n\n#ifdef __cplusplus\n    extern \"C\" {\n#endif\n\n//\n// Call before doing any other compiler/linker operations.\n//\n// (Call once per process, not once per thread.)\n//\nGLSLANG_EXPORT int ShInitialize();\n\n//\n// Call this at process shutdown to clean up memory.\n//\nGLSLANG_EXPORT int ShFinalize();\n\n//\n// Types of languages the compiler can consume.\n//\ntypedef enum {\n    EShLangVertex,\n    EShLangTessControl,\n    EShLangTessEvaluation,\n    EShLangGeometry,\n    EShLangFragment,\n    EShLangCompute,\n    EShLangRayGen,\n    EShLangRayGenNV = EShLangRayGen,\n    EShLangIntersect,\n    EShLangIntersectNV = EShLangIntersect,\n    EShLangAnyHit,\n    EShLangAnyHitNV = EShLangAnyHit,\n    EShLangClosestHit,\n    EShLangClosestHitNV = EShLangClosestHit,\n    EShLangMiss,\n    EShLangMissNV = EShLangMiss,\n    EShLangCallable,\n    EShLangCallableNV = EShLangCallable,\n    EShLangTask,\n    EShLangTaskNV = EShLangTask,\n    EShLangMesh,\n    EShLangMeshNV = EShLangMesh,\n    LAST_ELEMENT_MARKER(EShLangCount),\n} EShLanguage;         // would be better as stage, but this is ancient now\n\ntypedef enum : unsigned {\n    EShLangVertexMask         = (1 << EShLangVertex),\n    EShLangTessControlMask    = (1 << EShLangTessControl),\n    EShLangTessEvaluationMask = (1 << EShLangTessEvaluation),\n    EShLangGeometryMask       = (1 << EShLangGeometry),\n    EShLangFragmentMask       = (1 << EShLangFragment),\n    EShLangComputeMask        = (1 << EShLangCompute),\n    EShLangRayGenMask         = (1 << EShLangRayGen),\n    EShLangRayGenNVMask       = EShLangRayGenMask,\n    EShLangIntersectMask      = (1 << EShLangIntersect),\n    EShLangIntersectNVMask    = EShLangIntersectMask,\n    EShLangAnyHitMask         = (1 << EShLangAnyHit),\n    EShLangAnyHitNVMask       = EShLangAnyHitMask,\n    EShLangClosestHitMask     = (1 << EShLangClosestHit),\n    EShLangClosestHitNVMask   = EShLangClosestHitMask,\n    EShLangMissMask           = (1 << EShLangMiss),\n    EShLangMissNVMask         = EShLangMissMask,\n    EShLangCallableMask       = (1 << EShLangCallable),\n    EShLangCallableNVMask     = EShLangCallableMask,\n    EShLangTaskMask           = (1 << EShLangTask),\n    EShLangTaskNVMask         = EShLangTaskMask,\n    EShLangMeshMask           = (1 << EShLangMesh),\n    EShLangMeshNVMask         = EShLangMeshMask,\n    LAST_ELEMENT_MARKER(EShLanguageMaskCount),\n} EShLanguageMask;\n\nnamespace glslang {\n\nclass TType;\nclass TConstUnionArray;\n\ntypedef enum {\n    EShSourceNone,\n    EShSourceGlsl,               // GLSL, includes ESSL (OpenGL ES GLSL)\n    EShSourceHlsl,               // HLSL\n    LAST_ELEMENT_MARKER(EShSourceCount),\n} EShSource;                     // if EShLanguage were EShStage, this could be EShLanguage instead\n\ntypedef enum {\n    EShClientNone,               // use when there is no client, e.g. for validation\n    EShClientVulkan,             // as GLSL dialect, specifies KHR_vulkan_glsl extension\n    EShClientOpenGL,             // as GLSL dialect, specifies ARB_gl_spirv extension\n    LAST_ELEMENT_MARKER(EShClientCount),\n} EShClient;\n\ntypedef enum {\n    EShTargetNone,\n    EShTargetSpv,                 // SPIR-V (preferred spelling)\n    EshTargetSpv = EShTargetSpv,  // legacy spelling\n    LAST_ELEMENT_MARKER(EShTargetCount),\n} EShTargetLanguage;\n\ntypedef enum {\n    EShTargetVulkan_1_0 = (1 << 22),                  // Vulkan 1.0\n    EShTargetVulkan_1_1 = (1 << 22) | (1 << 12),      // Vulkan 1.1\n    EShTargetVulkan_1_2 = (1 << 22) | (2 << 12),      // Vulkan 1.2\n    EShTargetVulkan_1_3 = (1 << 22) | (3 << 12),      // Vulkan 1.3\n    EShTargetVulkan_1_4 = (1 << 22) | (4 << 12),      // Vulkan 1.4\n    EShTargetOpenGL_450 = 450,                        // OpenGL\n    LAST_ELEMENT_MARKER(EShTargetClientVersionCount = 6),\n} EShTargetClientVersion;\n\ntypedef EShTargetClientVersion EshTargetClientVersion;\n\ntypedef enum {\n    EShTargetSpv_1_0 = (1 << 16),                     // SPIR-V 1.0\n    EShTargetSpv_1_1 = (1 << 16) | (1 << 8),          // SPIR-V 1.1\n    EShTargetSpv_1_2 = (1 << 16) | (2 << 8),          // SPIR-V 1.2\n    EShTargetSpv_1_3 = (1 << 16) | (3 << 8),          // SPIR-V 1.3\n    EShTargetSpv_1_4 = (1 << 16) | (4 << 8),          // SPIR-V 1.4\n    EShTargetSpv_1_5 = (1 << 16) | (5 << 8),          // SPIR-V 1.5\n    EShTargetSpv_1_6 = (1 << 16) | (6 << 8),          // SPIR-V 1.6\n    LAST_ELEMENT_MARKER(EShTargetLanguageVersionCount = 7),\n} EShTargetLanguageVersion;\n\n//\n// Following are a series of helper enums for managing layouts and qualifiers,\n// used for TPublicType, TType, others.\n//\n\nenum TLayoutPacking {\n    ElpNone,\n    ElpShared, // default, but different than saying nothing\n    ElpStd140,\n    ElpStd430,\n    ElpPacked,\n    ElpScalar,\n    ElpCount // If expanding, see bitfield width below\n};\n\nstruct TInputLanguage {\n    EShSource languageFamily; // redundant information with other input, this one overrides when not EShSourceNone\n    EShLanguage stage;        // redundant information with other input, this one overrides when not EShSourceNone\n    EShClient dialect;\n    int dialectVersion;       // version of client's language definition, not the client (when not EShClientNone)\n    bool vulkanRulesRelaxed;\n};\n\nstruct TClient {\n    EShClient client;\n    EShTargetClientVersion version;   // version of client itself (not the client's input dialect)\n};\n\nstruct TTarget {\n    EShTargetLanguage language;\n    EShTargetLanguageVersion version; // version to target, if SPIR-V, defined by \"word 1\" of the SPIR-V header\n    bool hlslFunctionality1;          // can target hlsl_functionality1 extension(s)\n};\n\n// All source/client/target versions and settings.\n// Can override previous methods of setting, when items are set here.\n// Expected to grow, as more are added, rather than growing parameter lists.\nstruct TEnvironment {\n    TInputLanguage input;     // definition of the input language\n    TClient client;           // what client is the overall compilation being done for?\n    TTarget target;           // what to generate\n};\n\nGLSLANG_EXPORT const char* StageName(EShLanguage);\n\n} // end namespace glslang\n\n//\n// Types of output the linker will create.\n//\ntypedef enum {\n    EShExVertexFragment,\n    EShExFragment\n} EShExecutable;\n\n//\n// Optimization level for the compiler.\n//\ntypedef enum {\n    EShOptNoGeneration,\n    EShOptNone,\n    EShOptSimple,       // Optimizations that can be done quickly\n    EShOptFull,         // Optimizations that will take more time\n    LAST_ELEMENT_MARKER(EshOptLevelCount),\n} EShOptimizationLevel;\n\n//\n// Texture and Sampler transformation mode.\n//\ntypedef enum {\n    EShTexSampTransKeep,   // keep textures and samplers as is (default)\n    EShTexSampTransUpgradeTextureRemoveSampler,  // change texture w/o embeded sampler into sampled texture and throw away all samplers\n    LAST_ELEMENT_MARKER(EShTexSampTransCount),\n} EShTextureSamplerTransformMode;\n\n//\n// Message choices for what errors and warnings are given.\n//\nenum EShMessages : unsigned {\n    EShMsgDefault              = 0,         // default is to give all required errors and extra warnings\n    EShMsgRelaxedErrors        = (1 << 0),  // be liberal in accepting input\n    EShMsgSuppressWarnings     = (1 << 1),  // suppress all warnings, except those required by the specification\n    EShMsgAST                  = (1 << 2),  // print the AST intermediate representation\n    EShMsgSpvRules             = (1 << 3),  // issue messages for SPIR-V generation\n    EShMsgVulkanRules          = (1 << 4),  // issue messages for Vulkan-requirements of GLSL for SPIR-V\n    EShMsgOnlyPreprocessor     = (1 << 5),  // only print out errors produced by the preprocessor\n    EShMsgReadHlsl             = (1 << 6),  // use HLSL parsing rules and semantics\n    EShMsgCascadingErrors      = (1 << 7),  // get cascading errors; risks error-recovery issues, instead of an early exit\n    EShMsgKeepUncalled         = (1 << 8),  // for testing, don't eliminate uncalled functions\n    EShMsgHlslOffsets          = (1 << 9),  // allow block offsets to follow HLSL rules instead of GLSL rules\n    EShMsgDebugInfo            = (1 << 10), // save debug information\n    EShMsgHlslEnable16BitTypes = (1 << 11), // enable use of 16-bit types in SPIR-V for HLSL\n    EShMsgHlslLegalization     = (1 << 12), // enable HLSL Legalization messages\n    EShMsgHlslDX9Compatible    = (1 << 13), // enable HLSL DX9 compatible mode (for samplers and semantics)\n    EShMsgBuiltinSymbolTable   = (1 << 14), // print the builtin symbol table\n    EShMsgEnhanced             = (1 << 15), // enhanced message readability\n    EShMsgAbsolutePath         = (1 << 16), // Output Absolute path for messages\n    EShMsgDisplayErrorColumn   = (1 << 17), // Display error message column aswell as line\n    EShMsgLinkTimeOptimization = (1 << 18), // perform cross-stage optimizations during linking\n    EShMsgValidateCrossStageIO = (1 << 19), // validate shader inputs have matching outputs in previous stage\n    EshMsgOverlappingLocations = (1 << 29), // Always validate overlapping layout locations\n    LAST_ELEMENT_MARKER(EShMsgCount),\n};\n\n//\n// Options for building reflection\n//\ntypedef enum {\n    EShReflectionDefault            = 0,        // default is original behaviour before options were added\n    EShReflectionStrictArraySuffix  = (1 << 0), // reflection will follow stricter rules for array-of-structs suffixes\n    EShReflectionBasicArraySuffix   = (1 << 1), // arrays of basic types will be appended with [0] as in GL reflection\n    EShReflectionIntermediateIO     = (1 << 2), // reflect inputs and outputs to program, even with no vertex shader\n    EShReflectionSeparateBuffers    = (1 << 3), // buffer variables and buffer blocks are reflected separately\n    EShReflectionAllBlockVariables  = (1 << 4), // reflect all variables in blocks, even if they are inactive\n    EShReflectionUnwrapIOBlocks     = (1 << 5), // unwrap input/output blocks the same as with uniform blocks\n    EShReflectionAllIOVariables     = (1 << 6), // reflect all input/output variables, even if they are inactive\n    EShReflectionSharedStd140SSBO   = (1 << 7), // Apply std140/shared rules for ubo to ssbo\n    EShReflectionSharedStd140UBO    = (1 << 8), // Apply std140/shared rules for ubo to ssbo\n    LAST_ELEMENT_MARKER(EShReflectionCount),\n} EShReflectionOptions;\n\n//\n// Build a table for bindings.  This can be used for locating\n// attributes, uniforms, globals, etc., as needed.\n//\ntypedef struct {\n    const char* name;\n    int binding;\n} ShBinding;\n\ntypedef struct {\n    int numBindings;\n    ShBinding* bindings;  // array of bindings\n} ShBindingTable;\n\n//\n// ShHandle held by but opaque to the driver.  It is allocated,\n// managed, and de-allocated by the compiler/linker. Its contents\n// are defined by and used by the compiler and linker.  For example,\n// symbol table information and object code passed from the compiler\n// to the linker can be stored where ShHandle points.\n//\n// If handle creation fails, 0 will be returned.\n//\ntypedef void* ShHandle;\n\n//\n// Driver calls these to create and destroy compiler/linker\n// objects.\n//\nGLSLANG_EXPORT ShHandle ShConstructCompiler(const EShLanguage, int /*debugOptions unused*/); // one per shader\nGLSLANG_EXPORT ShHandle ShConstructLinker(const EShExecutable, int /*debugOptions unused*/); // one per shader pair\nGLSLANG_EXPORT ShHandle ShConstructUniformMap();                 // one per uniform namespace (currently entire program object)\nGLSLANG_EXPORT void ShDestruct(ShHandle);\n\n//\n// The return value of ShCompile is boolean, non-zero indicating\n// success.\n//\n// The info-log should be written by ShCompile into\n// ShHandle, so it can answer future queries.\n//\nGLSLANG_EXPORT int ShCompile(const ShHandle, const char* const shaderStrings[], const int numStrings,\n                             const int* lengths, const EShOptimizationLevel, const TBuiltInResource* resources,\n                             int,                      // debugOptions unused\n                             int defaultVersion = 110, // use 100 for ES environment, overridden by #version in shader\n                             bool forwardCompatible = false,      // give errors for use of deprecated features\n                             EShMessages messages = EShMsgDefault, // warnings and errors\n                             const char* fileName = nullptr\n);\n\nGLSLANG_EXPORT int ShLinkExt(\n    const ShHandle,               // linker object\n    const ShHandle h[],           // compiler objects to link together\n    const int numHandles);\n\n//\n// ShSetEncrpytionMethod is a place-holder for specifying\n// how source code is encrypted.\n//\nGLSLANG_EXPORT void ShSetEncryptionMethod(ShHandle);\n\n//\n// All the following return 0 if the information is not\n// available in the object passed down, or the object is bad.\n//\nGLSLANG_EXPORT const char* ShGetInfoLog(const ShHandle);\nGLSLANG_EXPORT const void* ShGetExecutable(const ShHandle);\nGLSLANG_EXPORT int ShSetVirtualAttributeBindings(const ShHandle, const ShBindingTable*);   // to detect user aliasing\nGLSLANG_EXPORT int ShSetFixedAttributeBindings(const ShHandle, const ShBindingTable*);     // to force any physical mappings\n//\n// Tell the linker to never assign a vertex attribute to this list of physical attributes\n//\nGLSLANG_EXPORT int ShExcludeAttributes(const ShHandle, int *attributes, int count);\n\n//\n// Returns the location ID of the named uniform.\n// Returns -1 if error.\n//\nGLSLANG_EXPORT int ShGetUniformLocation(const ShHandle uniformMap, const char* name);\n\n#ifdef __cplusplus\n    }  // end extern \"C\"\n#endif\n\n////////////////////////////////////////////////////////////////////////////////////////////\n//\n// Deferred-Lowering C++ Interface\n// -----------------------------------\n//\n// Below is a new alternate C++ interface, which deprecates the above\n// opaque handle-based interface.\n//\n// The below is further designed to handle multiple compilation units per stage, where\n// the intermediate results, including the parse tree, are preserved until link time,\n// rather than the above interface which is designed to have each compilation unit\n// lowered at compile time.  In the above model, linking occurs on the lowered results,\n// whereas in this model intra-stage linking can occur at the parse tree\n// (treeRoot in TIntermediate) level, and then a full stage can be lowered.\n//\n\n#include <list>\n#include <string>\n#include <utility>\n\nclass TCompiler;\nclass TInfoSink;\n\nnamespace glslang {\n\nstruct Version {\n    int major;\n    int minor;\n    int patch;\n    const char* flavor;\n};\n\nGLSLANG_EXPORT Version GetVersion();\nGLSLANG_EXPORT const char* GetEsslVersionString();\nGLSLANG_EXPORT const char* GetGlslVersionString();\nGLSLANG_EXPORT int GetKhronosToolId();\n\nclass TIntermediate;\nclass TProgram;\nclass TPoolAllocator;\nclass TIoMapResolver;\n\n// Call this exactly once per process before using anything else\nGLSLANG_EXPORT bool InitializeProcess();\n\n// Call once per process to tear down everything\nGLSLANG_EXPORT void FinalizeProcess();\n\n// Resource type for IO resolver\nenum TResourceType {\n    EResSampler,\n    EResTexture,\n    EResImage,\n    EResUbo,\n    EResSsbo,\n    EResUav,\n    EResCount\n};\n\nenum TBlockStorageClass\n{\n    EbsUniform = 0,\n    EbsStorageBuffer,\n    EbsPushConstant,\n    EbsNone,    // not a uniform or buffer variable\n    EbsCount,\n};\n\n// Make one TShader per shader that you will link into a program. Then\n//  - provide the shader through setStrings() or setStringsWithLengths()\n//  - optionally call setEnv*(), see below for more detail\n//  - optionally use setPreamble() to set a special shader string that will be\n//    processed before all others but won't affect the validity of #version\n//  - optionally call addProcesses() for each setting/transform,\n//    see comment for class TProcesses\n//  - call parse(): source language and target environment must be selected\n//    either by correct setting of EShMessages sent to parse(), or by\n//    explicitly calling setEnv*()\n//  - query the info logs\n//\n// N.B.: Does not yet support having the same TShader instance being linked into\n// multiple programs.\n//\n// N.B.: Destruct a linked program *before* destructing the shaders linked into it.\n//\nclass TShader {\npublic:\n    GLSLANG_EXPORT explicit TShader(EShLanguage);\n    GLSLANG_EXPORT virtual ~TShader();\n    GLSLANG_EXPORT void setStrings(const char* const* s, int n);\n    GLSLANG_EXPORT void setStringsWithLengths(\n        const char* const* s, const int* l, int n);\n    GLSLANG_EXPORT void setStringsWithLengthsAndNames(\n        const char* const* s, const int* l, const char* const* names, int n);\n    void setPreamble(const char* s) { preamble = s; }\n    GLSLANG_EXPORT void setEntryPoint(const char* entryPoint);\n    GLSLANG_EXPORT void setSourceEntryPoint(const char* sourceEntryPointName);\n    GLSLANG_EXPORT void addProcesses(const std::vector<std::string>&);\n    GLSLANG_EXPORT void setUniqueId(unsigned long long id);\n    GLSLANG_EXPORT void setOverrideVersion(int version);\n    GLSLANG_EXPORT void setDebugInfo(bool debugInfo);\n\n    // IO resolver binding data: see comments in ShaderLang.cpp\n    GLSLANG_EXPORT void setShiftBinding(TResourceType res, unsigned int base);\n    GLSLANG_EXPORT void setShiftSamplerBinding(unsigned int base);  // DEPRECATED: use setShiftBinding\n    GLSLANG_EXPORT void setShiftTextureBinding(unsigned int base);  // DEPRECATED: use setShiftBinding\n    GLSLANG_EXPORT void setShiftImageBinding(unsigned int base);    // DEPRECATED: use setShiftBinding\n    GLSLANG_EXPORT void setShiftUboBinding(unsigned int base);      // DEPRECATED: use setShiftBinding\n    GLSLANG_EXPORT void setShiftUavBinding(unsigned int base);      // DEPRECATED: use setShiftBinding\n    GLSLANG_EXPORT void setShiftCbufferBinding(unsigned int base);  // synonym for setShiftUboBinding\n    GLSLANG_EXPORT void setShiftSsboBinding(unsigned int base);     // DEPRECATED: use setShiftBinding\n    GLSLANG_EXPORT void setShiftBindingForSet(TResourceType res, unsigned int base, unsigned int set);\n    GLSLANG_EXPORT void setResourceSetBinding(const std::vector<std::string>& base);\n    GLSLANG_EXPORT void setAutoMapBindings(bool map);\n    GLSLANG_EXPORT void setAutoMapLocations(bool map);\n    GLSLANG_EXPORT void addUniformLocationOverride(const char* name, int loc);\n    GLSLANG_EXPORT void setUniformLocationBase(int base);\n    GLSLANG_EXPORT void setInvertY(bool invert);\n    GLSLANG_EXPORT void setDxPositionW(bool dxPosW);\n    GLSLANG_EXPORT void setEnhancedMsgs();\n#ifdef ENABLE_HLSL\n    GLSLANG_EXPORT void setHlslIoMapping(bool hlslIoMap);\n    GLSLANG_EXPORT void setFlattenUniformArrays(bool flatten);\n#endif\n    GLSLANG_EXPORT void setNoStorageFormat(bool useUnknownFormat);\n    GLSLANG_EXPORT void setNanMinMaxClamp(bool nanMinMaxClamp);\n    GLSLANG_EXPORT void setTextureSamplerTransformMode(EShTextureSamplerTransformMode mode);\n    GLSLANG_EXPORT void addBlockStorageOverride(const char* nameStr, glslang::TBlockStorageClass backing);\n\n    GLSLANG_EXPORT void setGlobalUniformBlockName(const char* name);\n    GLSLANG_EXPORT void setAtomicCounterBlockName(const char* name);\n    GLSLANG_EXPORT void setGlobalUniformSet(unsigned int set);\n    GLSLANG_EXPORT void setGlobalUniformBinding(unsigned int binding);\n    GLSLANG_EXPORT void setAtomicCounterBlockSet(unsigned int set);\n    GLSLANG_EXPORT void setAtomicCounterBlockBinding(unsigned int binding);\n\n    GLSLANG_EXPORT void addSourceText(const char* text, size_t len);\n    GLSLANG_EXPORT void setSourceFile(const char* file);\n\n    // For setting up the environment (cleared to nothingness in the constructor).\n    // These must be called so that parsing is done for the right source language and\n    // target environment, either indirectly through TranslateEnvironment() based on\n    // EShMessages et. al., or directly by the user.\n    //\n    // setEnvInput:    The input source language and stage. If generating code for a\n    //                 specific client, the input client semantics to use and the\n    //                 version of that client's input semantics to use, otherwise\n    //                 use EShClientNone and version of 0, e.g. for validation mode.\n    //                 Note 'version' does not describe the target environment,\n    //                 just the version of the source dialect to compile under.\n    //                 For example, to choose the Vulkan dialect of GLSL defined by\n    //                 version 100 of the KHR_vulkan_glsl extension: lang = EShSourceGlsl,\n    //                 dialect = EShClientVulkan, and version = 100.\n    //\n    //                 See the definitions of TEnvironment, EShSource, EShLanguage,\n    //                 and EShClient for choices and more detail.\n    //\n    // setEnvClient:   The client that will be hosting the execution, and its version.\n    //                 Note 'version' is not the version of the languages involved, but\n    //                 the version of the client environment.\n    //                 Use EShClientNone and version of 0 if there is no client, e.g.\n    //                 for validation mode.\n    //\n    //                 See EShTargetClientVersion for choices.\n    //\n    // setEnvTarget:   The language to translate to when generating code, and that\n    //                 language's version.\n    //                 Use EShTargetNone and version of 0 if there is no client, e.g.\n    //                 for validation mode.\n    //\n    void setEnvInput(EShSource lang, EShLanguage envStage, EShClient client, int version)\n    {\n        environment.input.languageFamily = lang;\n        environment.input.stage = envStage;\n        environment.input.dialect = client;\n        environment.input.dialectVersion = version;\n    }\n    void setEnvClient(EShClient client, EShTargetClientVersion version)\n    {\n        environment.client.client = client;\n        environment.client.version = version;\n    }\n    void setEnvTarget(EShTargetLanguage lang, EShTargetLanguageVersion version)\n    {\n        environment.target.language = lang;\n        environment.target.version = version;\n    }\n\n    void getStrings(const char* const* &s, int& n) { s = strings; n = numStrings; }\n\n#ifdef ENABLE_HLSL\n    void setEnvTargetHlslFunctionality1() { environment.target.hlslFunctionality1 = true; }\n    bool getEnvTargetHlslFunctionality1() const { return environment.target.hlslFunctionality1; }\n#else\n    bool getEnvTargetHlslFunctionality1() const { return false; }\n#endif\n\n    void setEnvInputVulkanRulesRelaxed() { environment.input.vulkanRulesRelaxed = true; }\n    bool getEnvInputVulkanRulesRelaxed() const { return environment.input.vulkanRulesRelaxed; }\n\n    void setCompileOnly() { compileOnly = true; }\n    bool getCompileOnly() const { return compileOnly; }\n\n    // Interface to #include handlers.\n    //\n    // To support #include, a client of Glslang does the following:\n    // 1. Call setStringsWithNames to set the source strings and associated\n    //    names.  For example, the names could be the names of the files\n    //    containing the shader sources.\n    // 2. Call parse with an Includer.\n    //\n    // When the Glslang parser encounters an #include directive, it calls\n    // the Includer's include method with the requested include name\n    // together with the current string name.  The returned IncludeResult\n    // contains the fully resolved name of the included source, together\n    // with the source text that should replace the #include directive\n    // in the source stream.  After parsing that source, Glslang will\n    // release the IncludeResult object.\n    class Includer {\n    public:\n        // An IncludeResult contains the resolved name and content of a source\n        // inclusion.\n        struct IncludeResult {\n            IncludeResult(const std::string& headerName, const char* const headerData, const size_t headerLength, void* userData) :\n                headerName(headerName), headerData(headerData), headerLength(headerLength), userData(userData) { }\n            // For a successful inclusion, the fully resolved name of the requested\n            // include.  For example, in a file system-based includer, full resolution\n            // should convert a relative path name into an absolute path name.\n            // For a failed inclusion, this is an empty string.\n            const std::string headerName;\n            // The content and byte length of the requested inclusion.  The\n            // Includer producing this IncludeResult retains ownership of the\n            // storage.\n            // For a failed inclusion, the header\n            // field points to a string containing error details.\n            const char* const headerData;\n            const size_t headerLength;\n            // Include resolver's context.\n            void* userData;\n        protected:\n            IncludeResult& operator=(const IncludeResult&);\n            IncludeResult();\n        };\n\n        // For both include methods below:\n        //\n        // Resolves an inclusion request by name, current source name,\n        // and include depth.\n        // On success, returns an IncludeResult containing the resolved name\n        // and content of the include.\n        // On failure, returns a nullptr, or an IncludeResult\n        // with an empty string for the headerName and error details in the\n        // header field.\n        // The Includer retains ownership of the contents\n        // of the returned IncludeResult value, and those contents must\n        // remain valid until the releaseInclude method is called on that\n        // IncludeResult object.\n        //\n        // Note \"local\" vs. \"system\" is not an \"either/or\": \"local\" is an\n        // extra thing to do over \"system\". Both might get called, as per\n        // the C++ specification.\n\n        // For the \"system\" or <>-style includes; search the \"system\" paths.\n        virtual IncludeResult* includeSystem(const char* /*headerName*/,\n                                             const char* /*includerName*/,\n                                             size_t /*inclusionDepth*/) { return nullptr; }\n\n        // For the \"local\"-only aspect of a \"\" include. Should not search in the\n        // \"system\" paths, because on returning a failure, the parser will\n        // call includeSystem() to look in the \"system\" locations.\n        virtual IncludeResult* includeLocal(const char* /*headerName*/,\n                                            const char* /*includerName*/,\n                                            size_t /*inclusionDepth*/) { return nullptr; }\n\n        // Signals that the parser will no longer use the contents of the\n        // specified IncludeResult.\n        virtual void releaseInclude(IncludeResult*) = 0;\n        virtual ~Includer() {}\n    };\n\n    // Fail all Includer searches\n    class ForbidIncluder : public Includer {\n    public:\n        virtual void releaseInclude(IncludeResult*) override { }\n    };\n\n    GLSLANG_EXPORT bool parse(\n        const TBuiltInResource*, int defaultVersion, EProfile defaultProfile,\n        bool forceDefaultVersionAndProfile, bool forwardCompatible,\n        EShMessages, Includer&);\n\n    bool parse(const TBuiltInResource* res, int defaultVersion, EProfile defaultProfile, bool forceDefaultVersionAndProfile,\n               bool forwardCompatible, EShMessages messages)\n    {\n        TShader::ForbidIncluder includer;\n        return parse(res, defaultVersion, defaultProfile, forceDefaultVersionAndProfile, forwardCompatible, messages, includer);\n    }\n\n    // Equivalent to parse() without a default profile and without forcing defaults.\n    bool parse(const TBuiltInResource* builtInResources, int defaultVersion, bool forwardCompatible, EShMessages messages)\n    {\n        return parse(builtInResources, defaultVersion, ENoProfile, false, forwardCompatible, messages);\n    }\n\n    bool parse(const TBuiltInResource* builtInResources, int defaultVersion, bool forwardCompatible, EShMessages messages,\n               Includer& includer)\n    {\n        return parse(builtInResources, defaultVersion, ENoProfile, false, forwardCompatible, messages, includer);\n    }\n\n    // NOTE: Doing just preprocessing to obtain a correct preprocessed shader string\n    // is not an officially supported or fully working path.\n    GLSLANG_EXPORT bool preprocess(\n        const TBuiltInResource* builtInResources, int defaultVersion,\n        EProfile defaultProfile, bool forceDefaultVersionAndProfile,\n        bool forwardCompatible, EShMessages message, std::string* outputString,\n        Includer& includer);\n\n    GLSLANG_EXPORT const char* getInfoLog();\n    GLSLANG_EXPORT const char* getInfoDebugLog();\n    EShLanguage getStage() const { return stage; }\n    TIntermediate* getIntermediate() const { return intermediate; }\n\nprotected:\n    TPoolAllocator* pool;\n    EShLanguage stage;\n    TCompiler* compiler;\n    TIntermediate* intermediate;\n    TInfoSink* infoSink;\n    // strings and lengths follow the standard for glShaderSource:\n    //     strings is an array of numStrings pointers to string data.\n    //     lengths can be null, but if not it is an array of numStrings\n    //         integers containing the length of the associated strings.\n    //         if lengths is null or lengths[n] < 0  the associated strings[n] is\n    //         assumed to be null-terminated.\n    // stringNames is the optional names for all the strings. If stringNames\n    // is null, then none of the strings has name. If a certain element in\n    // stringNames is null, then the corresponding string does not have name.\n    const char* const* strings;      // explicit code to compile, see previous comment\n    const int* lengths;\n    const char* const* stringNames;\n    int numStrings;                  // size of the above arrays\n    const char* preamble;            // string of implicit code to compile before the explicitly provided code\n\n    // a function in the source string can be renamed FROM this TO the name given in setEntryPoint.\n    std::string sourceEntryPointName;\n\n    // overrides #version in shader source or default version if #version isn't present\n    int overrideVersion;\n\n    TEnvironment environment;\n\n    // Indicates this shader is meant to be used without linking\n    bool compileOnly = false;\n\n    friend class TProgram;\n\nprivate:\n    TShader& operator=(TShader&);\n};\n\n//\n// A reflection database and its interface, consistent with the OpenGL API reflection queries.\n//\n\n// Data needed for just a single object at the granularity exchanged by the reflection API\nclass TObjectReflection {\npublic:\n    GLSLANG_EXPORT TObjectReflection(const std::string& pName, const TType& pType, int pOffset, int pGLDefineType, int pSize, int pIndex, const TConstUnionArray* pConstArray = nullptr);\n\n    const TType* getType() const { return type; }\n    const TConstUnionArray* getConstArray() const { return constArray; }\n    GLSLANG_EXPORT int getBinding() const;\n    GLSLANG_EXPORT void dump() const;\n    static TObjectReflection badReflection() { return TObjectReflection(); }\n\n    GLSLANG_EXPORT unsigned int layoutLocation() const;\n\n    std::string name;\n    int offset;\n    int glDefineType;\n    int size;                   // data size in bytes for a block, array size for a (non-block) object that's an array\n    int index;\n    int counterIndex;\n    int numMembers;\n    int arrayStride;            // stride of an array variable\n    int topLevelArraySize;      // size of the top-level variable in a storage buffer member\n    int topLevelArrayStride;    // stride of the top-level variable in a storage buffer member\n    EShLanguageMask stages;\n\nprotected:\n    TObjectReflection()\n        : offset(-1), glDefineType(-1), size(-1), index(-1), counterIndex(-1), numMembers(-1), arrayStride(0),\n          topLevelArrayStride(0), stages(EShLanguageMask(0)), type(nullptr), constArray(nullptr)\n    {\n    }\n\n    const TType* type;\n    const TConstUnionArray* constArray;\n};\n\nclass  TReflection;\nclass  TIoMapper;\nstruct TVarEntryInfo;\n\n// Allows to customize the binding layout after linking.\n// All used uniform variables will invoke at least validateBinding.\n// If validateBinding returned true then the other resolveBinding,\n// resolveSet, and resolveLocation are invoked to resolve the binding\n// and descriptor set index respectively.\n//\n// Invocations happen in a particular order:\n// 1) all shader inputs\n// 2) all shader outputs\n// 3) all uniforms with binding and set already defined\n// 4) all uniforms with binding but no set defined\n// 5) all uniforms with set but no binding defined\n// 6) all uniforms with no binding and no set defined\n//\n// mapIO will use this resolver in two phases. The first\n// phase is a notification phase, calling the corresponging\n// notifiy callbacks, this phase ends with a call to endNotifications.\n// Phase two starts directly after the call to endNotifications\n// and calls all other callbacks to validate and to get the\n// bindings, sets, locations, component and color indices.\n//\n// NOTE: that still limit checks are applied to bindings and sets\n// and may result in an error.\nclass TIoMapResolver\n{\npublic:\n    virtual ~TIoMapResolver() {}\n\n    // Should return true if the resulting/current binding would be okay.\n    // Basic idea is to do aliasing binding checks with this.\n    virtual bool validateBinding(EShLanguage stage, TVarEntryInfo& ent) = 0;\n    // Should return a value >= 0 if the current binding should be overridden.\n    // Return -1 if the current binding (including no binding) should be kept.\n    virtual int resolveBinding(EShLanguage stage, TVarEntryInfo& ent) = 0;\n    // Should return a value >= 0 if the current set should be overridden.\n    // Return -1 if the current set (including no set) should be kept.\n    virtual int resolveSet(EShLanguage stage, TVarEntryInfo& ent) = 0;\n    // Should return a value >= 0 if the current location should be overridden.\n    // Return -1 if the current location (including no location) should be kept.\n    virtual int resolveUniformLocation(EShLanguage stage, TVarEntryInfo& ent) = 0;\n    // Should return true if the resulting/current setup would be okay.\n    // Basic idea is to do aliasing checks and reject invalid semantic names.\n    virtual bool validateInOut(EShLanguage stage, TVarEntryInfo& ent) = 0;\n    // Should return a value >= 0 if the current location should be overridden.\n    // Return -1 if the current location (including no location) should be kept.\n    virtual int resolveInOutLocation(EShLanguage stage, TVarEntryInfo& ent) = 0;\n    // Should return a value >= 0 if the current component index should be overridden.\n    // Return -1 if the current component index (including no index) should be kept.\n    virtual int resolveInOutComponent(EShLanguage stage, TVarEntryInfo& ent) = 0;\n    // Should return a value >= 0 if the current color index should be overridden.\n    // Return -1 if the current color index (including no index) should be kept.\n    virtual int resolveInOutIndex(EShLanguage stage, TVarEntryInfo& ent) = 0;\n    // Notification of a uniform variable\n    virtual void notifyBinding(EShLanguage stage, TVarEntryInfo& ent) = 0;\n    // Notification of a in or out variable\n    virtual void notifyInOut(EShLanguage stage, TVarEntryInfo& ent) = 0;\n    // Called by mapIO when it starts its notify pass for the given stage\n    virtual void beginNotifications(EShLanguage stage) = 0;\n    // Called by mapIO when it has finished the notify pass\n    virtual void endNotifications(EShLanguage stage) = 0;\n    // Called by mipIO when it starts its resolve pass for the given stage\n    virtual void beginResolve(EShLanguage stage) = 0;\n    // Called by mapIO when it has finished the resolve pass\n    virtual void endResolve(EShLanguage stage) = 0;\n    // Called by mapIO when it starts its symbol collect for teh given stage\n    virtual void beginCollect(EShLanguage stage) = 0;\n    // Called by mapIO when it has finished the symbol collect\n    virtual void endCollect(EShLanguage stage) = 0;\n    // Called by TSlotCollector to resolve storage locations or bindings\n    virtual void reserverStorageSlot(TVarEntryInfo& ent, TInfoSink& infoSink) = 0;\n    // Called by TSlotCollector to resolve resource locations or bindings\n    virtual void reserverResourceSlot(TVarEntryInfo& ent, TInfoSink& infoSink) = 0;\n    // Called by mapIO.addStage to set shader stage mask to mark a stage be added to this pipeline\n    virtual void addStage(EShLanguage stage, TIntermediate& stageIntermediate) = 0;\n};\n\n// I/O mapper\nclass TIoMapper {\npublic:\n    TIoMapper() {}\n    virtual ~TIoMapper() {}\n    // grow the reflection stage by stage\n    bool virtual addStage(EShLanguage, TIntermediate&, TInfoSink&, TIoMapResolver*);\n    bool virtual doMap(TIoMapResolver*, TInfoSink&) { return true; }\n    bool virtual setAutoPushConstantBlock(const char*, unsigned int, TLayoutPacking) { return false; }\n};\n\n// Get the default GLSL IO mapper\nGLSLANG_EXPORT TIoMapper* GetGlslIoMapper();\n\n// Make one TProgram per set of shaders that will get linked together.  Add all\n// the shaders that are to be linked together.  After calling shader.parse()\n// for all shaders, call link().\n//\n// N.B.: Destruct a linked program *before* destructing the shaders linked into it.\n//\nclass TProgram {\npublic:\n    GLSLANG_EXPORT TProgram();\n    GLSLANG_EXPORT virtual ~TProgram();\n    void addShader(TShader* shader) { stages[shader->stage].push_back(shader); }\n    std::list<TShader*>& getShaders(EShLanguage stage) { return stages[stage]; }\n    // Link Validation interface\n    GLSLANG_EXPORT bool link(EShMessages);\n    GLSLANG_EXPORT const char* getInfoLog();\n    GLSLANG_EXPORT const char* getInfoDebugLog();\n\n    TIntermediate* getIntermediate(EShLanguage stage) const { return intermediate[stage]; }\n\n    // Reflection Interface\n\n    // call first, to do liveness analysis, index mapping, etc.; returns false on failure\n    GLSLANG_EXPORT bool buildReflection(int opts = EShReflectionDefault);\n    GLSLANG_EXPORT unsigned getLocalSize(int dim) const;                  // return dim'th local size\n    GLSLANG_EXPORT unsigned getTileShadingRateQCOM(int dim) const;        // return dim'th tile shading rate QCOM\n    GLSLANG_EXPORT int getReflectionIndex(const char *name) const;\n    GLSLANG_EXPORT int getReflectionPipeIOIndex(const char* name, const bool inOrOut) const;\n    GLSLANG_EXPORT int getNumUniformVariables() const;\n    GLSLANG_EXPORT const TObjectReflection& getUniform(int index) const;\n    GLSLANG_EXPORT int getNumUniformBlocks() const;\n    GLSLANG_EXPORT const TObjectReflection& getUniformBlock(int index) const;\n    GLSLANG_EXPORT int getNumPipeInputs() const;\n    GLSLANG_EXPORT const TObjectReflection& getPipeInput(int index) const;\n    GLSLANG_EXPORT int getNumPipeOutputs() const;\n    GLSLANG_EXPORT const TObjectReflection& getPipeOutput(int index) const;\n    GLSLANG_EXPORT int getNumBufferVariables() const;\n    GLSLANG_EXPORT const TObjectReflection& getBufferVariable(int index) const;\n    GLSLANG_EXPORT int getNumBufferBlocks() const;\n    GLSLANG_EXPORT const TObjectReflection& getBufferBlock(int index) const;\n    GLSLANG_EXPORT int getNumAtomicCounters() const;\n    GLSLANG_EXPORT const TObjectReflection& getAtomicCounter(int index) const;\n\n    // Legacy Reflection Interface - expressed in terms of above interface\n\n    // can be used for glGetProgramiv(GL_ACTIVE_UNIFORMS)\n    int getNumLiveUniformVariables() const             { return getNumUniformVariables(); }\n\n    // can be used for glGetProgramiv(GL_ACTIVE_UNIFORM_BLOCKS)\n    int getNumLiveUniformBlocks() const                { return getNumUniformBlocks(); }\n\n    // can be used for glGetProgramiv(GL_ACTIVE_ATTRIBUTES)\n    int getNumLiveAttributes() const                   { return getNumPipeInputs(); }\n\n    // can be used for glGetUniformIndices()\n    int getUniformIndex(const char *name) const        { return getReflectionIndex(name); }\n\n    int getPipeIOIndex(const char *name, const bool inOrOut) const\n                                                       { return getReflectionPipeIOIndex(name, inOrOut); }\n\n    // can be used for \"name\" part of glGetActiveUniform()\n    const char *getUniformName(int index) const        { return getUniform(index).name.c_str(); }\n\n    // returns the binding number\n    int getUniformBinding(int index) const             { return getUniform(index).getBinding(); }\n\n    // returns Shaders Stages where a Uniform is present\n    EShLanguageMask getUniformStages(int index) const  { return getUniform(index).stages; }\n\n    // can be used for glGetActiveUniformsiv(GL_UNIFORM_BLOCK_INDEX)\n    int getUniformBlockIndex(int index) const          { return getUniform(index).index; }\n\n    // can be used for glGetActiveUniformsiv(GL_UNIFORM_TYPE)\n    int getUniformType(int index) const                { return getUniform(index).glDefineType; }\n\n    // can be used for glGetActiveUniformsiv(GL_UNIFORM_OFFSET)\n    int getUniformBufferOffset(int index) const        { return getUniform(index).offset; }\n\n    // can be used for glGetActiveUniformsiv(GL_UNIFORM_SIZE)\n    int getUniformArraySize(int index) const           { return getUniform(index).size; }\n\n    // returns a TType*\n    const TType *getUniformTType(int index) const      { return getUniform(index).getType(); }\n\n    // can be used for glGetActiveUniformBlockName()\n    const char *getUniformBlockName(int index) const   { return getUniformBlock(index).name.c_str(); }\n\n    // can be used for glGetActiveUniformBlockiv(UNIFORM_BLOCK_DATA_SIZE)\n    int getUniformBlockSize(int index) const           { return getUniformBlock(index).size; }\n\n    // returns the block binding number\n    int getUniformBlockBinding(int index) const        { return getUniformBlock(index).getBinding(); }\n\n    // returns block index of associated counter.\n    int getUniformBlockCounterIndex(int index) const   { return getUniformBlock(index).counterIndex; }\n\n    // returns a TType*\n    const TType *getUniformBlockTType(int index) const { return getUniformBlock(index).getType(); }\n\n    // can be used for glGetActiveAttrib()\n    const char *getAttributeName(int index) const      { return getPipeInput(index).name.c_str(); }\n\n    // can be used for glGetActiveAttrib()\n    int getAttributeType(int index) const              { return getPipeInput(index).glDefineType; }\n\n    // returns a TType*\n    const TType *getAttributeTType(int index) const    { return getPipeInput(index).getType(); }\n\n    GLSLANG_EXPORT void dumpReflection();\n\n    // Get the IO resolver to use for mapIO\n    GLSLANG_EXPORT TIoMapResolver* getGlslIoResolver(EShLanguage stage);\n\n    // I/O mapping: apply base offsets and map live unbound variables\n    // If resolver is not provided it uses the previous approach\n    // and respects auto assignment and offsets.\n    GLSLANG_EXPORT bool mapIO(TIoMapResolver* pResolver = nullptr, TIoMapper* pIoMapper = nullptr);\n\nprotected:\n    GLSLANG_EXPORT bool linkStage(EShLanguage, EShMessages);\n    GLSLANG_EXPORT bool crossStageCheck(EShMessages);\n\n    TPoolAllocator* pool;\n    std::list<TShader*> stages[EShLangCount];\n    TIntermediate* intermediate[EShLangCount];\n    bool newedIntermediate[EShLangCount];      // track which intermediate were \"new\" versus reusing a singleton unit in a stage\n    TInfoSink* infoSink;\n    TReflection* reflection;\n    bool linked;\n\nprivate:\n    TProgram(TProgram&);\n    TProgram& operator=(TProgram&);\n};\n\n} // end namespace glslang\n\n#endif // _COMPILER_INTERFACE_INCLUDED_\n"
  },
  {
    "path": "src/libraries/glslang/glslang/ResourceLimits/ResourceLimits.cpp",
    "content": "//\n// Copyright (C) 2016 Google, Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of Google Inc. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\n#include <cstdlib>\n#include <cstring>\n#include <sstream>\n#include <cctype>\n\n#include \"../../glslang/Public/ResourceLimits.h\"\n\nTBuiltInResource Resources;\n\nconst TBuiltInResource DefaultTBuiltInResource = {\n    /* .MaxLights = */ 32,\n    /* .MaxClipPlanes = */ 6,\n    /* .MaxTextureUnits = */ 32,\n    /* .MaxTextureCoords = */ 32,\n    /* .MaxVertexAttribs = */ 64,\n    /* .MaxVertexUniformComponents = */ 4096,\n    /* .MaxVaryingFloats = */ 64,\n    /* .MaxVertexTextureImageUnits = */ 32,\n    /* .MaxCombinedTextureImageUnits = */ 80,\n    /* .MaxTextureImageUnits = */ 32,\n    /* .MaxFragmentUniformComponents = */ 4096,\n    /* .MaxDrawBuffers = */ 32,\n    /* .MaxVertexUniformVectors = */ 128,\n    /* .MaxVaryingVectors = */ 8,\n    /* .MaxFragmentUniformVectors = */ 16,\n    /* .MaxVertexOutputVectors = */ 16,\n    /* .MaxFragmentInputVectors = */ 15,\n    /* .MinProgramTexelOffset = */ -8,\n    /* .MaxProgramTexelOffset = */ 7,\n    /* .MaxClipDistances = */ 8,\n    /* .MaxComputeWorkGroupCountX = */ 65535,\n    /* .MaxComputeWorkGroupCountY = */ 65535,\n    /* .MaxComputeWorkGroupCountZ = */ 65535,\n    /* .MaxComputeWorkGroupSizeX = */ 1024,\n    /* .MaxComputeWorkGroupSizeY = */ 1024,\n    /* .MaxComputeWorkGroupSizeZ = */ 64,\n    /* .MaxComputeUniformComponents = */ 1024,\n    /* .MaxComputeTextureImageUnits = */ 16,\n    /* .MaxComputeImageUniforms = */ 8,\n    /* .MaxComputeAtomicCounters = */ 8,\n    /* .MaxComputeAtomicCounterBuffers = */ 1,\n    /* .MaxVaryingComponents = */ 60,\n    /* .MaxVertexOutputComponents = */ 64,\n    /* .MaxGeometryInputComponents = */ 64,\n    /* .MaxGeometryOutputComponents = */ 128,\n    /* .MaxFragmentInputComponents = */ 128,\n    /* .MaxImageUnits = */ 8,\n    /* .MaxCombinedImageUnitsAndFragmentOutputs = */ 8,\n    /* .MaxCombinedShaderOutputResources = */ 8,\n    /* .MaxImageSamples = */ 0,\n    /* .MaxVertexImageUniforms = */ 0,\n    /* .MaxTessControlImageUniforms = */ 0,\n    /* .MaxTessEvaluationImageUniforms = */ 0,\n    /* .MaxGeometryImageUniforms = */ 0,\n    /* .MaxFragmentImageUniforms = */ 8,\n    /* .MaxCombinedImageUniforms = */ 8,\n    /* .MaxGeometryTextureImageUnits = */ 16,\n    /* .MaxGeometryOutputVertices = */ 256,\n    /* .MaxGeometryTotalOutputComponents = */ 1024,\n    /* .MaxGeometryUniformComponents = */ 1024,\n    /* .MaxGeometryVaryingComponents = */ 64,\n    /* .MaxTessControlInputComponents = */ 128,\n    /* .MaxTessControlOutputComponents = */ 128,\n    /* .MaxTessControlTextureImageUnits = */ 16,\n    /* .MaxTessControlUniformComponents = */ 1024,\n    /* .MaxTessControlTotalOutputComponents = */ 4096,\n    /* .MaxTessEvaluationInputComponents = */ 128,\n    /* .MaxTessEvaluationOutputComponents = */ 128,\n    /* .MaxTessEvaluationTextureImageUnits = */ 16,\n    /* .MaxTessEvaluationUniformComponents = */ 1024,\n    /* .MaxTessPatchComponents = */ 120,\n    /* .MaxPatchVertices = */ 32,\n    /* .MaxTessGenLevel = */ 64,\n    /* .MaxViewports = */ 16,\n    /* .MaxVertexAtomicCounters = */ 0,\n    /* .MaxTessControlAtomicCounters = */ 0,\n    /* .MaxTessEvaluationAtomicCounters = */ 0,\n    /* .MaxGeometryAtomicCounters = */ 0,\n    /* .MaxFragmentAtomicCounters = */ 8,\n    /* .MaxCombinedAtomicCounters = */ 8,\n    /* .MaxAtomicCounterBindings = */ 1,\n    /* .MaxVertexAtomicCounterBuffers = */ 0,\n    /* .MaxTessControlAtomicCounterBuffers = */ 0,\n    /* .MaxTessEvaluationAtomicCounterBuffers = */ 0,\n    /* .MaxGeometryAtomicCounterBuffers = */ 0,\n    /* .MaxFragmentAtomicCounterBuffers = */ 1,\n    /* .MaxCombinedAtomicCounterBuffers = */ 1,\n    /* .MaxAtomicCounterBufferSize = */ 16384,\n    /* .MaxTransformFeedbackBuffers = */ 4,\n    /* .MaxTransformFeedbackInterleavedComponents = */ 64,\n    /* .MaxCullDistances = */ 8,\n    /* .MaxCombinedClipAndCullDistances = */ 8,\n    /* .MaxSamples = */ 4,\n    /* .maxMeshOutputVerticesNV = */ 256,\n    /* .maxMeshOutputPrimitivesNV = */ 512,\n    /* .maxMeshWorkGroupSizeX_NV = */ 32,\n    /* .maxMeshWorkGroupSizeY_NV = */ 1,\n    /* .maxMeshWorkGroupSizeZ_NV = */ 1,\n    /* .maxTaskWorkGroupSizeX_NV = */ 32,\n    /* .maxTaskWorkGroupSizeY_NV = */ 1,\n    /* .maxTaskWorkGroupSizeZ_NV = */ 1,\n    /* .maxMeshViewCountNV = */ 4,\n    /* .maxMeshOutputVerticesEXT = */ 256,\n    /* .maxMeshOutputPrimitivesEXT = */ 256,\n    /* .maxMeshWorkGroupSizeX_EXT = */ 128,\n    /* .maxMeshWorkGroupSizeY_EXT = */ 128,\n    /* .maxMeshWorkGroupSizeZ_EXT = */ 128,\n    /* .maxTaskWorkGroupSizeX_EXT = */ 128,\n    /* .maxTaskWorkGroupSizeY_EXT = */ 128,\n    /* .maxTaskWorkGroupSizeZ_EXT = */ 128,\n    /* .maxMeshViewCountEXT = */ 4,\n    /* .maxDualSourceDrawBuffersEXT = */ 1,\n\n    /* .limits = */ {\n        /* .nonInductiveForLoops = */ 1,\n        /* .whileLoops = */ 1,\n        /* .doWhileLoops = */ 1,\n        /* .generalUniformIndexing = */ 1,\n        /* .generalAttributeMatrixVectorIndexing = */ 1,\n        /* .generalVaryingIndexing = */ 1,\n        /* .generalSamplerIndexing = */ 1,\n        /* .generalVariableIndexing = */ 1,\n        /* .generalConstantMatrixVectorIndexing = */ 1,\n    }};\n\nstd::string GetDefaultTBuiltInResourceString()\n{\n    std::ostringstream ostream;\n\n    ostream << \"MaxLights \"                                 << DefaultTBuiltInResource.maxLights << \"\\n\"\n            << \"MaxClipPlanes \"                             << DefaultTBuiltInResource.maxClipPlanes << \"\\n\"\n            << \"MaxTextureUnits \"                           << DefaultTBuiltInResource.maxTextureUnits << \"\\n\"\n            << \"MaxTextureCoords \"                          << DefaultTBuiltInResource.maxTextureCoords << \"\\n\"\n            << \"MaxVertexAttribs \"                          << DefaultTBuiltInResource.maxVertexAttribs << \"\\n\"\n            << \"MaxVertexUniformComponents \"                << DefaultTBuiltInResource.maxVertexUniformComponents << \"\\n\"\n            << \"MaxVaryingFloats \"                          << DefaultTBuiltInResource.maxVaryingFloats << \"\\n\"\n            << \"MaxVertexTextureImageUnits \"                << DefaultTBuiltInResource.maxVertexTextureImageUnits << \"\\n\"\n            << \"MaxCombinedTextureImageUnits \"              << DefaultTBuiltInResource.maxCombinedTextureImageUnits << \"\\n\"\n            << \"MaxTextureImageUnits \"                      << DefaultTBuiltInResource.maxTextureImageUnits << \"\\n\"\n            << \"MaxFragmentUniformComponents \"              << DefaultTBuiltInResource.maxFragmentUniformComponents << \"\\n\"\n            << \"MaxDrawBuffers \"                            << DefaultTBuiltInResource.maxDrawBuffers << \"\\n\"\n            << \"MaxVertexUniformVectors \"                   << DefaultTBuiltInResource.maxVertexUniformVectors << \"\\n\"\n            << \"MaxVaryingVectors \"                         << DefaultTBuiltInResource.maxVaryingVectors << \"\\n\"\n            << \"MaxFragmentUniformVectors \"                 << DefaultTBuiltInResource.maxFragmentUniformVectors << \"\\n\"\n            << \"MaxVertexOutputVectors \"                    << DefaultTBuiltInResource.maxVertexOutputVectors << \"\\n\"\n            << \"MaxFragmentInputVectors \"                   << DefaultTBuiltInResource.maxFragmentInputVectors << \"\\n\"\n            << \"MinProgramTexelOffset \"                     << DefaultTBuiltInResource.minProgramTexelOffset << \"\\n\"\n            << \"MaxProgramTexelOffset \"                     << DefaultTBuiltInResource.maxProgramTexelOffset << \"\\n\"\n            << \"MaxClipDistances \"                          << DefaultTBuiltInResource.maxClipDistances << \"\\n\"\n            << \"MaxComputeWorkGroupCountX \"                 << DefaultTBuiltInResource.maxComputeWorkGroupCountX << \"\\n\"\n            << \"MaxComputeWorkGroupCountY \"                 << DefaultTBuiltInResource.maxComputeWorkGroupCountY << \"\\n\"\n            << \"MaxComputeWorkGroupCountZ \"                 << DefaultTBuiltInResource.maxComputeWorkGroupCountZ << \"\\n\"\n            << \"MaxComputeWorkGroupSizeX \"                  << DefaultTBuiltInResource.maxComputeWorkGroupSizeX << \"\\n\"\n            << \"MaxComputeWorkGroupSizeY \"                  << DefaultTBuiltInResource.maxComputeWorkGroupSizeY << \"\\n\"\n            << \"MaxComputeWorkGroupSizeZ \"                  << DefaultTBuiltInResource.maxComputeWorkGroupSizeZ << \"\\n\"\n            << \"MaxComputeUniformComponents \"               << DefaultTBuiltInResource.maxComputeUniformComponents << \"\\n\"\n            << \"MaxComputeTextureImageUnits \"               << DefaultTBuiltInResource.maxComputeTextureImageUnits << \"\\n\"\n            << \"MaxComputeImageUniforms \"                   << DefaultTBuiltInResource.maxComputeImageUniforms << \"\\n\"\n            << \"MaxComputeAtomicCounters \"                  << DefaultTBuiltInResource.maxComputeAtomicCounters << \"\\n\"\n            << \"MaxComputeAtomicCounterBuffers \"            << DefaultTBuiltInResource.maxComputeAtomicCounterBuffers << \"\\n\"\n            << \"MaxVaryingComponents \"                      << DefaultTBuiltInResource.maxVaryingComponents << \"\\n\"\n            << \"MaxVertexOutputComponents \"                 << DefaultTBuiltInResource.maxVertexOutputComponents << \"\\n\"\n            << \"MaxGeometryInputComponents \"                << DefaultTBuiltInResource.maxGeometryInputComponents << \"\\n\"\n            << \"MaxGeometryOutputComponents \"               << DefaultTBuiltInResource.maxGeometryOutputComponents << \"\\n\"\n            << \"MaxFragmentInputComponents \"                << DefaultTBuiltInResource.maxFragmentInputComponents << \"\\n\"\n            << \"MaxImageUnits \"                             << DefaultTBuiltInResource.maxImageUnits << \"\\n\"\n            << \"MaxCombinedImageUnitsAndFragmentOutputs \"   << DefaultTBuiltInResource.maxCombinedImageUnitsAndFragmentOutputs << \"\\n\"\n            << \"MaxCombinedShaderOutputResources \"          << DefaultTBuiltInResource.maxCombinedShaderOutputResources << \"\\n\"\n            << \"MaxImageSamples \"                           << DefaultTBuiltInResource.maxImageSamples << \"\\n\"\n            << \"MaxVertexImageUniforms \"                    << DefaultTBuiltInResource.maxVertexImageUniforms << \"\\n\"\n            << \"MaxTessControlImageUniforms \"               << DefaultTBuiltInResource.maxTessControlImageUniforms << \"\\n\"\n            << \"MaxTessEvaluationImageUniforms \"            << DefaultTBuiltInResource.maxTessEvaluationImageUniforms << \"\\n\"\n            << \"MaxGeometryImageUniforms \"                  << DefaultTBuiltInResource.maxGeometryImageUniforms << \"\\n\"\n            << \"MaxFragmentImageUniforms \"                  << DefaultTBuiltInResource.maxFragmentImageUniforms << \"\\n\"\n            << \"MaxCombinedImageUniforms \"                  << DefaultTBuiltInResource.maxCombinedImageUniforms << \"\\n\"\n            << \"MaxGeometryTextureImageUnits \"              << DefaultTBuiltInResource.maxGeometryTextureImageUnits << \"\\n\"\n            << \"MaxGeometryOutputVertices \"                 << DefaultTBuiltInResource.maxGeometryOutputVertices << \"\\n\"\n            << \"MaxGeometryTotalOutputComponents \"          << DefaultTBuiltInResource.maxGeometryTotalOutputComponents << \"\\n\"\n            << \"MaxGeometryUniformComponents \"              << DefaultTBuiltInResource.maxGeometryUniformComponents << \"\\n\"\n            << \"MaxGeometryVaryingComponents \"              << DefaultTBuiltInResource.maxGeometryVaryingComponents << \"\\n\"\n            << \"MaxTessControlInputComponents \"             << DefaultTBuiltInResource.maxTessControlInputComponents << \"\\n\"\n            << \"MaxTessControlOutputComponents \"            << DefaultTBuiltInResource.maxTessControlOutputComponents << \"\\n\"\n            << \"MaxTessControlTextureImageUnits \"           << DefaultTBuiltInResource.maxTessControlTextureImageUnits << \"\\n\"\n            << \"MaxTessControlUniformComponents \"           << DefaultTBuiltInResource.maxTessControlUniformComponents << \"\\n\"\n            << \"MaxTessControlTotalOutputComponents \"       << DefaultTBuiltInResource.maxTessControlTotalOutputComponents << \"\\n\"\n            << \"MaxTessEvaluationInputComponents \"          << DefaultTBuiltInResource.maxTessEvaluationInputComponents << \"\\n\"\n            << \"MaxTessEvaluationOutputComponents \"         << DefaultTBuiltInResource.maxTessEvaluationOutputComponents << \"\\n\"\n            << \"MaxTessEvaluationTextureImageUnits \"        << DefaultTBuiltInResource.maxTessEvaluationTextureImageUnits << \"\\n\"\n            << \"MaxTessEvaluationUniformComponents \"        << DefaultTBuiltInResource.maxTessEvaluationUniformComponents << \"\\n\"\n            << \"MaxTessPatchComponents \"                    << DefaultTBuiltInResource.maxTessPatchComponents << \"\\n\"\n            << \"MaxPatchVertices \"                          << DefaultTBuiltInResource.maxPatchVertices << \"\\n\"\n            << \"MaxTessGenLevel \"                           << DefaultTBuiltInResource.maxTessGenLevel << \"\\n\"\n            << \"MaxViewports \"                              << DefaultTBuiltInResource.maxViewports << \"\\n\"\n            << \"MaxVertexAtomicCounters \"                   << DefaultTBuiltInResource.maxVertexAtomicCounters << \"\\n\"\n            << \"MaxTessControlAtomicCounters \"              << DefaultTBuiltInResource.maxTessControlAtomicCounters << \"\\n\"\n            << \"MaxTessEvaluationAtomicCounters \"           << DefaultTBuiltInResource.maxTessEvaluationAtomicCounters << \"\\n\"\n            << \"MaxGeometryAtomicCounters \"                 << DefaultTBuiltInResource.maxGeometryAtomicCounters << \"\\n\"\n            << \"MaxFragmentAtomicCounters \"                 << DefaultTBuiltInResource.maxFragmentAtomicCounters << \"\\n\"\n            << \"MaxCombinedAtomicCounters \"                 << DefaultTBuiltInResource.maxCombinedAtomicCounters << \"\\n\"\n            << \"MaxAtomicCounterBindings \"                  << DefaultTBuiltInResource.maxAtomicCounterBindings << \"\\n\"\n            << \"MaxVertexAtomicCounterBuffers \"             << DefaultTBuiltInResource.maxVertexAtomicCounterBuffers << \"\\n\"\n            << \"MaxTessControlAtomicCounterBuffers \"        << DefaultTBuiltInResource.maxTessControlAtomicCounterBuffers << \"\\n\"\n            << \"MaxTessEvaluationAtomicCounterBuffers \"     << DefaultTBuiltInResource.maxTessEvaluationAtomicCounterBuffers << \"\\n\"\n            << \"MaxGeometryAtomicCounterBuffers \"           << DefaultTBuiltInResource.maxGeometryAtomicCounterBuffers << \"\\n\"\n            << \"MaxFragmentAtomicCounterBuffers \"           << DefaultTBuiltInResource.maxFragmentAtomicCounterBuffers << \"\\n\"\n            << \"MaxCombinedAtomicCounterBuffers \"           << DefaultTBuiltInResource.maxCombinedAtomicCounterBuffers << \"\\n\"\n            << \"MaxAtomicCounterBufferSize \"                << DefaultTBuiltInResource.maxAtomicCounterBufferSize << \"\\n\"\n            << \"MaxTransformFeedbackBuffers \"               << DefaultTBuiltInResource.maxTransformFeedbackBuffers << \"\\n\"\n            << \"MaxTransformFeedbackInterleavedComponents \" << DefaultTBuiltInResource.maxTransformFeedbackInterleavedComponents << \"\\n\"\n            << \"MaxCullDistances \"                          << DefaultTBuiltInResource.maxCullDistances << \"\\n\"\n            << \"MaxCombinedClipAndCullDistances \"           << DefaultTBuiltInResource.maxCombinedClipAndCullDistances << \"\\n\"\n            << \"MaxSamples \"                                << DefaultTBuiltInResource.maxSamples << \"\\n\"\n            << \"MaxMeshOutputVerticesNV \"                   << DefaultTBuiltInResource.maxMeshOutputVerticesNV << \"\\n\"\n            << \"MaxMeshOutputPrimitivesNV \"                 << DefaultTBuiltInResource.maxMeshOutputPrimitivesNV << \"\\n\"\n            << \"MaxMeshWorkGroupSizeX_NV \"                  << DefaultTBuiltInResource.maxMeshWorkGroupSizeX_NV << \"\\n\"\n            << \"MaxMeshWorkGroupSizeY_NV \"                  << DefaultTBuiltInResource.maxMeshWorkGroupSizeY_NV << \"\\n\"\n            << \"MaxMeshWorkGroupSizeZ_NV \"                  << DefaultTBuiltInResource.maxMeshWorkGroupSizeZ_NV << \"\\n\"\n            << \"MaxTaskWorkGroupSizeX_NV \"                  << DefaultTBuiltInResource.maxTaskWorkGroupSizeX_NV << \"\\n\"\n            << \"MaxTaskWorkGroupSizeY_NV \"                  << DefaultTBuiltInResource.maxTaskWorkGroupSizeY_NV << \"\\n\"\n            << \"MaxTaskWorkGroupSizeZ_NV \"                  << DefaultTBuiltInResource.maxTaskWorkGroupSizeZ_NV << \"\\n\"\n            << \"MaxMeshViewCountNV \"                        << DefaultTBuiltInResource.maxMeshViewCountNV << \"\\n\"\n            << \"MaxMeshOutputVerticesEXT \"                  << DefaultTBuiltInResource.maxMeshOutputVerticesEXT << \"\\n\"\n            << \"MaxMeshOutputPrimitivesEXT \"                << DefaultTBuiltInResource.maxMeshOutputPrimitivesEXT << \"\\n\"\n            << \"MaxMeshWorkGroupSizeX_EXT \"                 << DefaultTBuiltInResource.maxMeshWorkGroupSizeX_EXT << \"\\n\"\n            << \"MaxMeshWorkGroupSizeY_EXT \"                 << DefaultTBuiltInResource.maxMeshWorkGroupSizeY_EXT << \"\\n\"\n            << \"MaxMeshWorkGroupSizeZ_EXT \"                 << DefaultTBuiltInResource.maxMeshWorkGroupSizeZ_EXT << \"\\n\"\n            << \"MaxTaskWorkGroupSizeX_EXT \"                 << DefaultTBuiltInResource.maxTaskWorkGroupSizeX_EXT << \"\\n\"\n            << \"MaxTaskWorkGroupSizeY_EXT \"                 << DefaultTBuiltInResource.maxTaskWorkGroupSizeY_EXT << \"\\n\"\n            << \"MaxTaskWorkGroupSizeZ_EXT \"                 << DefaultTBuiltInResource.maxTaskWorkGroupSizeZ_EXT << \"\\n\"\n            << \"MaxMeshViewCountEXT \"                       << DefaultTBuiltInResource.maxMeshViewCountEXT << \"\\n\"\n            << \"MaxDualSourceDrawBuffersEXT \"               << DefaultTBuiltInResource.maxDualSourceDrawBuffersEXT << \"\\n\"\n            << \"nonInductiveForLoops \"                      << DefaultTBuiltInResource.limits.nonInductiveForLoops << \"\\n\"\n            << \"whileLoops \"                                << DefaultTBuiltInResource.limits.whileLoops << \"\\n\"\n            << \"doWhileLoops \"                              << DefaultTBuiltInResource.limits.doWhileLoops << \"\\n\"\n            << \"generalUniformIndexing \"                    << DefaultTBuiltInResource.limits.generalUniformIndexing << \"\\n\"\n            << \"generalAttributeMatrixVectorIndexing \"      << DefaultTBuiltInResource.limits.generalAttributeMatrixVectorIndexing << \"\\n\"\n            << \"generalVaryingIndexing \"                    << DefaultTBuiltInResource.limits.generalVaryingIndexing << \"\\n\"\n            << \"generalSamplerIndexing \"                    << DefaultTBuiltInResource.limits.generalSamplerIndexing << \"\\n\"\n            << \"generalVariableIndexing \"                   << DefaultTBuiltInResource.limits.generalVariableIndexing << \"\\n\"\n            << \"generalConstantMatrixVectorIndexing \"       << DefaultTBuiltInResource.limits.generalConstantMatrixVectorIndexing << \"\\n\"\n      ;\n\n    return ostream.str();\n}\n\nvoid DecodeResourceLimits(TBuiltInResource* resources, char* config)\n{\n    static const char* delims = \" \\t\\n\\r\";\n\n    size_t pos     = 0;\n    std::string configStr(config);\n\n    while ((pos = configStr.find_first_not_of(delims, pos)) != std::string::npos) {\n        const size_t token_s = pos;\n        const size_t token_e = configStr.find_first_of(delims, token_s);\n        const size_t value_s = configStr.find_first_not_of(delims, token_e);\n        const size_t value_e = configStr.find_first_of(delims, value_s);\n        pos = value_e;\n\n        // Faster to use compare(), but prefering readability.\n        const std::string tokenStr = configStr.substr(token_s, token_e-token_s);\n        const std::string valueStr = configStr.substr(value_s, value_e-value_s);\n\n        if (value_s == std::string::npos || ! (valueStr[0] == '-' || isdigit(valueStr[0]))) {\n            printf(\"Error: '%s' bad .conf file.  Each name must be followed by one number.\\n\",\n                   valueStr.c_str());\n            return;\n        }\n\n        const int value = std::atoi(valueStr.c_str());\n\n        if (tokenStr == \"MaxLights\")\n            resources->maxLights = value;\n        else if (tokenStr == \"MaxClipPlanes\")\n            resources->maxClipPlanes = value;\n        else if (tokenStr == \"MaxTextureUnits\")\n            resources->maxTextureUnits = value;\n        else if (tokenStr == \"MaxTextureCoords\")\n            resources->maxTextureCoords = value;\n        else if (tokenStr == \"MaxVertexAttribs\")\n            resources->maxVertexAttribs = value;\n        else if (tokenStr == \"MaxVertexUniformComponents\")\n            resources->maxVertexUniformComponents = value;\n        else if (tokenStr == \"MaxVaryingFloats\")\n            resources->maxVaryingFloats = value;\n        else if (tokenStr == \"MaxVertexTextureImageUnits\")\n            resources->maxVertexTextureImageUnits = value;\n        else if (tokenStr == \"MaxCombinedTextureImageUnits\")\n            resources->maxCombinedTextureImageUnits = value;\n        else if (tokenStr == \"MaxTextureImageUnits\")\n            resources->maxTextureImageUnits = value;\n        else if (tokenStr == \"MaxFragmentUniformComponents\")\n            resources->maxFragmentUniformComponents = value;\n        else if (tokenStr == \"MaxDrawBuffers\")\n            resources->maxDrawBuffers = value;\n        else if (tokenStr == \"MaxVertexUniformVectors\")\n            resources->maxVertexUniformVectors = value;\n        else if (tokenStr == \"MaxVaryingVectors\")\n            resources->maxVaryingVectors = value;\n        else if (tokenStr == \"MaxFragmentUniformVectors\")\n            resources->maxFragmentUniformVectors = value;\n        else if (tokenStr == \"MaxVertexOutputVectors\")\n            resources->maxVertexOutputVectors = value;\n        else if (tokenStr == \"MaxFragmentInputVectors\")\n            resources->maxFragmentInputVectors = value;\n        else if (tokenStr == \"MinProgramTexelOffset\")\n            resources->minProgramTexelOffset = value;\n        else if (tokenStr == \"MaxProgramTexelOffset\")\n            resources->maxProgramTexelOffset = value;\n        else if (tokenStr == \"MaxClipDistances\")\n            resources->maxClipDistances = value;\n        else if (tokenStr == \"MaxComputeWorkGroupCountX\")\n            resources->maxComputeWorkGroupCountX = value;\n        else if (tokenStr == \"MaxComputeWorkGroupCountY\")\n            resources->maxComputeWorkGroupCountY = value;\n        else if (tokenStr == \"MaxComputeWorkGroupCountZ\")\n            resources->maxComputeWorkGroupCountZ = value;\n        else if (tokenStr == \"MaxComputeWorkGroupSizeX\")\n            resources->maxComputeWorkGroupSizeX = value;\n        else if (tokenStr == \"MaxComputeWorkGroupSizeY\")\n            resources->maxComputeWorkGroupSizeY = value;\n        else if (tokenStr == \"MaxComputeWorkGroupSizeZ\")\n            resources->maxComputeWorkGroupSizeZ = value;\n        else if (tokenStr == \"MaxComputeUniformComponents\")\n            resources->maxComputeUniformComponents = value;\n        else if (tokenStr == \"MaxComputeTextureImageUnits\")\n            resources->maxComputeTextureImageUnits = value;\n        else if (tokenStr == \"MaxComputeImageUniforms\")\n            resources->maxComputeImageUniforms = value;\n        else if (tokenStr == \"MaxComputeAtomicCounters\")\n            resources->maxComputeAtomicCounters = value;\n        else if (tokenStr == \"MaxComputeAtomicCounterBuffers\")\n            resources->maxComputeAtomicCounterBuffers = value;\n        else if (tokenStr == \"MaxVaryingComponents\")\n            resources->maxVaryingComponents = value;\n        else if (tokenStr == \"MaxVertexOutputComponents\")\n            resources->maxVertexOutputComponents = value;\n        else if (tokenStr == \"MaxGeometryInputComponents\")\n            resources->maxGeometryInputComponents = value;\n        else if (tokenStr == \"MaxGeometryOutputComponents\")\n            resources->maxGeometryOutputComponents = value;\n        else if (tokenStr == \"MaxFragmentInputComponents\")\n            resources->maxFragmentInputComponents = value;\n        else if (tokenStr == \"MaxImageUnits\")\n            resources->maxImageUnits = value;\n        else if (tokenStr == \"MaxCombinedImageUnitsAndFragmentOutputs\")\n            resources->maxCombinedImageUnitsAndFragmentOutputs = value;\n        else if (tokenStr == \"MaxCombinedShaderOutputResources\")\n            resources->maxCombinedShaderOutputResources = value;\n        else if (tokenStr == \"MaxImageSamples\")\n            resources->maxImageSamples = value;\n        else if (tokenStr == \"MaxVertexImageUniforms\")\n            resources->maxVertexImageUniforms = value;\n        else if (tokenStr == \"MaxTessControlImageUniforms\")\n            resources->maxTessControlImageUniforms = value;\n        else if (tokenStr == \"MaxTessEvaluationImageUniforms\")\n            resources->maxTessEvaluationImageUniforms = value;\n        else if (tokenStr == \"MaxGeometryImageUniforms\")\n            resources->maxGeometryImageUniforms = value;\n        else if (tokenStr == \"MaxFragmentImageUniforms\")\n            resources->maxFragmentImageUniforms = value;\n        else if (tokenStr == \"MaxCombinedImageUniforms\")\n            resources->maxCombinedImageUniforms = value;\n        else if (tokenStr == \"MaxGeometryTextureImageUnits\")\n            resources->maxGeometryTextureImageUnits = value;\n        else if (tokenStr == \"MaxGeometryOutputVertices\")\n            resources->maxGeometryOutputVertices = value;\n        else if (tokenStr == \"MaxGeometryTotalOutputComponents\")\n            resources->maxGeometryTotalOutputComponents = value;\n        else if (tokenStr == \"MaxGeometryUniformComponents\")\n            resources->maxGeometryUniformComponents = value;\n        else if (tokenStr == \"MaxGeometryVaryingComponents\")\n            resources->maxGeometryVaryingComponents = value;\n        else if (tokenStr == \"MaxTessControlInputComponents\")\n            resources->maxTessControlInputComponents = value;\n        else if (tokenStr == \"MaxTessControlOutputComponents\")\n            resources->maxTessControlOutputComponents = value;\n        else if (tokenStr == \"MaxTessControlTextureImageUnits\")\n            resources->maxTessControlTextureImageUnits = value;\n        else if (tokenStr == \"MaxTessControlUniformComponents\")\n            resources->maxTessControlUniformComponents = value;\n        else if (tokenStr == \"MaxTessControlTotalOutputComponents\")\n            resources->maxTessControlTotalOutputComponents = value;\n        else if (tokenStr == \"MaxTessEvaluationInputComponents\")\n            resources->maxTessEvaluationInputComponents = value;\n        else if (tokenStr == \"MaxTessEvaluationOutputComponents\")\n            resources->maxTessEvaluationOutputComponents = value;\n        else if (tokenStr == \"MaxTessEvaluationTextureImageUnits\")\n            resources->maxTessEvaluationTextureImageUnits = value;\n        else if (tokenStr == \"MaxTessEvaluationUniformComponents\")\n            resources->maxTessEvaluationUniformComponents = value;\n        else if (tokenStr == \"MaxTessPatchComponents\")\n            resources->maxTessPatchComponents = value;\n        else if (tokenStr == \"MaxPatchVertices\")\n            resources->maxPatchVertices = value;\n        else if (tokenStr == \"MaxTessGenLevel\")\n            resources->maxTessGenLevel = value;\n        else if (tokenStr == \"MaxViewports\")\n            resources->maxViewports = value;\n        else if (tokenStr == \"MaxVertexAtomicCounters\")\n            resources->maxVertexAtomicCounters = value;\n        else if (tokenStr == \"MaxTessControlAtomicCounters\")\n            resources->maxTessControlAtomicCounters = value;\n        else if (tokenStr == \"MaxTessEvaluationAtomicCounters\")\n            resources->maxTessEvaluationAtomicCounters = value;\n        else if (tokenStr == \"MaxGeometryAtomicCounters\")\n            resources->maxGeometryAtomicCounters = value;\n        else if (tokenStr == \"MaxFragmentAtomicCounters\")\n            resources->maxFragmentAtomicCounters = value;\n        else if (tokenStr == \"MaxCombinedAtomicCounters\")\n            resources->maxCombinedAtomicCounters = value;\n        else if (tokenStr == \"MaxAtomicCounterBindings\")\n            resources->maxAtomicCounterBindings = value;\n        else if (tokenStr == \"MaxVertexAtomicCounterBuffers\")\n            resources->maxVertexAtomicCounterBuffers = value;\n        else if (tokenStr == \"MaxTessControlAtomicCounterBuffers\")\n            resources->maxTessControlAtomicCounterBuffers = value;\n        else if (tokenStr == \"MaxTessEvaluationAtomicCounterBuffers\")\n            resources->maxTessEvaluationAtomicCounterBuffers = value;\n        else if (tokenStr == \"MaxGeometryAtomicCounterBuffers\")\n            resources->maxGeometryAtomicCounterBuffers = value;\n        else if (tokenStr == \"MaxFragmentAtomicCounterBuffers\")\n            resources->maxFragmentAtomicCounterBuffers = value;\n        else if (tokenStr == \"MaxCombinedAtomicCounterBuffers\")\n            resources->maxCombinedAtomicCounterBuffers = value;\n        else if (tokenStr == \"MaxAtomicCounterBufferSize\")\n            resources->maxAtomicCounterBufferSize = value;\n        else if (tokenStr == \"MaxTransformFeedbackBuffers\")\n            resources->maxTransformFeedbackBuffers = value;\n        else if (tokenStr == \"MaxTransformFeedbackInterleavedComponents\")\n            resources->maxTransformFeedbackInterleavedComponents = value;\n        else if (tokenStr == \"MaxCullDistances\")\n            resources->maxCullDistances = value;\n        else if (tokenStr == \"MaxCombinedClipAndCullDistances\")\n            resources->maxCombinedClipAndCullDistances = value;\n        else if (tokenStr == \"MaxSamples\")\n            resources->maxSamples = value;\n        else if (tokenStr == \"MaxMeshOutputVerticesNV\")\n            resources->maxMeshOutputVerticesNV = value;\n        else if (tokenStr == \"MaxMeshOutputPrimitivesNV\")\n            resources->maxMeshOutputPrimitivesNV = value;\n        else if (tokenStr == \"MaxMeshWorkGroupSizeX_NV\")\n            resources->maxMeshWorkGroupSizeX_NV = value;\n        else if (tokenStr == \"MaxMeshWorkGroupSizeY_NV\")\n            resources->maxMeshWorkGroupSizeY_NV = value;\n        else if (tokenStr == \"MaxMeshWorkGroupSizeZ_NV\")\n            resources->maxMeshWorkGroupSizeZ_NV = value;\n        else if (tokenStr == \"MaxTaskWorkGroupSizeX_NV\")\n            resources->maxTaskWorkGroupSizeX_NV = value;\n        else if (tokenStr == \"MaxTaskWorkGroupSizeY_NV\")\n            resources->maxTaskWorkGroupSizeY_NV = value;\n        else if (tokenStr == \"MaxTaskWorkGroupSizeZ_NV\")\n            resources->maxTaskWorkGroupSizeZ_NV = value;\n        else if (tokenStr == \"MaxMeshViewCountNV\")\n            resources->maxMeshViewCountNV = value;\n        else if (tokenStr == \"MaxMeshOutputVerticesEXT\")\n            resources->maxMeshOutputVerticesEXT = value;\n        else if (tokenStr == \"MaxMeshOutputPrimitivesEXT\")\n            resources->maxMeshOutputPrimitivesEXT = value;\n        else if (tokenStr == \"MaxMeshWorkGroupSizeX_EXT\")\n            resources->maxMeshWorkGroupSizeX_EXT = value;\n        else if (tokenStr == \"MaxMeshWorkGroupSizeY_EXT\")\n            resources->maxMeshWorkGroupSizeY_EXT = value;\n        else if (tokenStr == \"MaxMeshWorkGroupSizeZ_EXT\")\n            resources->maxMeshWorkGroupSizeZ_EXT = value;\n        else if (tokenStr == \"MaxTaskWorkGroupSizeX_EXT\")\n            resources->maxTaskWorkGroupSizeX_EXT = value;\n        else if (tokenStr == \"MaxTaskWorkGroupSizeY_EXT\")\n            resources->maxTaskWorkGroupSizeY_EXT = value;\n        else if (tokenStr == \"MaxTaskWorkGroupSizeZ_EXT\")\n            resources->maxTaskWorkGroupSizeZ_EXT = value;\n        else if (tokenStr == \"MaxMeshViewCountEXT\")\n            resources->maxMeshViewCountEXT = value;\n        else if (tokenStr == \"MaxDualSourceDrawBuffersEXT\")\n            resources->maxDualSourceDrawBuffersEXT = value;\n        else if (tokenStr == \"nonInductiveForLoops\")\n            resources->limits.nonInductiveForLoops = (value != 0);\n        else if (tokenStr == \"whileLoops\")\n            resources->limits.whileLoops = (value != 0);\n        else if (tokenStr == \"doWhileLoops\")\n            resources->limits.doWhileLoops = (value != 0);\n        else if (tokenStr == \"generalUniformIndexing\")\n            resources->limits.generalUniformIndexing = (value != 0);\n        else if (tokenStr == \"generalAttributeMatrixVectorIndexing\")\n            resources->limits.generalAttributeMatrixVectorIndexing = (value != 0);\n        else if (tokenStr == \"generalVaryingIndexing\")\n            resources->limits.generalVaryingIndexing = (value != 0);\n        else if (tokenStr == \"generalSamplerIndexing\")\n            resources->limits.generalSamplerIndexing = (value != 0);\n        else if (tokenStr == \"generalVariableIndexing\")\n            resources->limits.generalVariableIndexing = (value != 0);\n        else if (tokenStr == \"generalConstantMatrixVectorIndexing\")\n            resources->limits.generalConstantMatrixVectorIndexing = (value != 0);\n        else\n            printf(\"Warning: unrecognized limit (%s) in configuration file.\\n\", tokenStr.c_str());\n\n    }\n}\n\nTBuiltInResource* GetResources()\n{\n   return &Resources;\n}\n\nconst TBuiltInResource* GetDefaultResources()\n{\n    return &DefaultTBuiltInResource;\n}\n"
  },
  {
    "path": "src/libraries/glslang/glslang/build_info.h",
    "content": "// Copyright (C) 2020 The Khronos Group Inc.\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//\n//    Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//\n//    Redistributions in binary form must reproduce the above\n//    copyright notice, this list of conditions and the following\n//    disclaimer in the documentation and/or other materials provided\n//    with the distribution.\n//\n//    Neither the name of The Khronos Group Inc. nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef GLSLANG_BUILD_INFO\n#define GLSLANG_BUILD_INFO\n\n#define GLSLANG_VERSION_MAJOR 15\n#define GLSLANG_VERSION_MINOR 3\n#define GLSLANG_VERSION_PATCH 0\n#define GLSLANG_VERSION_FLAVOR \"\"\n\n#define GLSLANG_VERSION_GREATER_THAN(major, minor, patch) \\\n    ((GLSLANG_VERSION_MAJOR) > (major) || ((major) == GLSLANG_VERSION_MAJOR && \\\n    ((GLSLANG_VERSION_MINOR) > (minor) || ((minor) == GLSLANG_VERSION_MINOR && \\\n     (GLSLANG_VERSION_PATCH) > (patch)))))\n\n#define GLSLANG_VERSION_GREATER_OR_EQUAL_TO(major, minor, patch) \\\n    ((GLSLANG_VERSION_MAJOR) > (major) || ((major) == GLSLANG_VERSION_MAJOR && \\\n    ((GLSLANG_VERSION_MINOR) > (minor) || ((minor) == GLSLANG_VERSION_MINOR && \\\n     (GLSLANG_VERSION_PATCH >= (patch))))))\n\n#define GLSLANG_VERSION_LESS_THAN(major, minor, patch) \\\n    ((GLSLANG_VERSION_MAJOR) < (major) || ((major) == GLSLANG_VERSION_MAJOR && \\\n    ((GLSLANG_VERSION_MINOR) < (minor) || ((minor) == GLSLANG_VERSION_MINOR && \\\n     (GLSLANG_VERSION_PATCH) < (patch)))))\n\n#define GLSLANG_VERSION_LESS_OR_EQUAL_TO(major, minor, patch) \\\n    ((GLSLANG_VERSION_MAJOR) < (major) || ((major) == GLSLANG_VERSION_MAJOR && \\\n    ((GLSLANG_VERSION_MINOR) < (minor) || ((minor) == GLSLANG_VERSION_MINOR && \\\n     (GLSLANG_VERSION_PATCH <= (patch))))))\n\n#endif // GLSLANG_BUILD_INFO\n"
  },
  {
    "path": "src/libraries/lodepng/lodepng.cpp",
    "content": "/*\nLodePNG version 20210627\n\nCopyright (c) 2005-2021 Lode Vandevenne\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n    1. The origin of this software must not be misrepresented; you must not\n    claim that you wrote the original software. If you use this software\n    in a product, an acknowledgment in the product documentation would be\n    appreciated but is not required.\n\n    2. Altered source versions must be plainly marked as such, and must not be\n    misrepresented as being the original software.\n\n    3. This notice may not be removed or altered from any source\n    distribution.\n*/\n\n/*\nThe manual and changelog are in the header file \"lodepng.h\"\nRename this file to lodepng.cpp to use it for C++, or to lodepng.c to use it for C.\n*/\n\n#include \"lodepng.h\"\n\n#ifdef LODEPNG_COMPILE_DISK\n#include <limits.h> /* LONG_MAX */\n#include <stdio.h> /* file handling */\n#endif /* LODEPNG_COMPILE_DISK */\n\n#ifdef LODEPNG_COMPILE_ALLOCATORS\n#include <stdlib.h> /* allocations */\n#endif /* LODEPNG_COMPILE_ALLOCATORS */\n\n#if defined(_MSC_VER) && (_MSC_VER >= 1310) /*Visual Studio: A few warning types are not desired here.*/\n#pragma warning( disable : 4244 ) /*implicit conversions: not warned by gcc -Wall -Wextra and requires too much casts*/\n#pragma warning( disable : 4996 ) /*VS does not like fopen, but fopen_s is not standard C so unusable here*/\n#endif /*_MSC_VER */\n\nconst char* LODEPNG_VERSION_STRING = \"20210627\";\n\n/*\nThis source file is built up in the following large parts. The code sections\nwith the \"LODEPNG_COMPILE_\" #defines divide this up further in an intermixed way.\n-Tools for C and common code for PNG and Zlib\n-C Code for Zlib (huffman, deflate, ...)\n-C Code for PNG (file format chunks, adam7, PNG filters, color conversions, ...)\n-The C++ wrapper around all of the above\n*/\n\n/* ////////////////////////////////////////////////////////////////////////// */\n/* ////////////////////////////////////////////////////////////////////////// */\n/* // Tools for C, and common code for PNG and Zlib.                       // */\n/* ////////////////////////////////////////////////////////////////////////// */\n/* ////////////////////////////////////////////////////////////////////////// */\n\n/*The malloc, realloc and free functions defined here with \"lodepng_\" in front\nof the name, so that you can easily change them to others related to your\nplatform if needed. Everything else in the code calls these. Pass\n-DLODEPNG_NO_COMPILE_ALLOCATORS to the compiler, or comment out\n#define LODEPNG_COMPILE_ALLOCATORS in the header, to disable the ones here and\ndefine them in your own project's source files without needing to change\nlodepng source code. Don't forget to remove \"static\" if you copypaste them\nfrom here.*/\n\n#ifdef LODEPNG_COMPILE_ALLOCATORS\nstatic void* lodepng_malloc(size_t size) {\n#ifdef LODEPNG_MAX_ALLOC\n  if(size > LODEPNG_MAX_ALLOC) return 0;\n#endif\n  return malloc(size);\n}\n\n/* NOTE: when realloc returns NULL, it leaves the original memory untouched */\nstatic void* lodepng_realloc(void* ptr, size_t new_size) {\n#ifdef LODEPNG_MAX_ALLOC\n  if(new_size > LODEPNG_MAX_ALLOC) return 0;\n#endif\n  return realloc(ptr, new_size);\n}\n\nstatic void lodepng_free(void* ptr) {\n  free(ptr);\n}\n#else /*LODEPNG_COMPILE_ALLOCATORS*/\n/* TODO: support giving additional void* payload to the custom allocators */\nvoid* lodepng_malloc(size_t size);\nvoid* lodepng_realloc(void* ptr, size_t new_size);\nvoid lodepng_free(void* ptr);\n#endif /*LODEPNG_COMPILE_ALLOCATORS*/\n\n/* convince the compiler to inline a function, for use when this measurably improves performance */\n/* inline is not available in C90, but use it when supported by the compiler */\n#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || (defined(__cplusplus) && (__cplusplus >= 199711L))\n#define LODEPNG_INLINE inline\n#else\n#define LODEPNG_INLINE /* not available */\n#endif\n\n/* restrict is not available in C90, but use it when supported by the compiler */\n#if (defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))) ||\\\n    (defined(_MSC_VER) && (_MSC_VER >= 1400)) || \\\n    (defined(__WATCOMC__) && (__WATCOMC__ >= 1250) && !defined(__cplusplus))\n#define LODEPNG_RESTRICT __restrict\n#else\n#define LODEPNG_RESTRICT /* not available */\n#endif\n\n/* Replacements for C library functions such as memcpy and strlen, to support platforms\nwhere a full C library is not available. The compiler can recognize them and compile\nto something as fast. */\n\nstatic void lodepng_memcpy(void* LODEPNG_RESTRICT dst,\n                           const void* LODEPNG_RESTRICT src, size_t size) {\n  size_t i;\n  for(i = 0; i < size; i++) ((char*)dst)[i] = ((const char*)src)[i];\n}\n\nstatic void lodepng_memset(void* LODEPNG_RESTRICT dst,\n                           int value, size_t num) {\n  size_t i;\n  for(i = 0; i < num; i++) ((char*)dst)[i] = (char)value;\n}\n\n/* does not check memory out of bounds, do not use on untrusted data */\nstatic size_t lodepng_strlen(const char* a) {\n  const char* orig = a;\n  /* avoid warning about unused function in case of disabled COMPILE... macros */\n  (void)(&lodepng_strlen);\n  while(*a) a++;\n  return (size_t)(a - orig);\n}\n\n#define LODEPNG_MAX(a, b) (((a) > (b)) ? (a) : (b))\n#define LODEPNG_MIN(a, b) (((a) < (b)) ? (a) : (b))\n#define LODEPNG_ABS(x) ((x) < 0 ? -(x) : (x))\n\n#if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_DECODER)\n/* Safely check if adding two integers will overflow (no undefined\nbehavior, compiler removing the code, etc...) and output result. */\nstatic int lodepng_addofl(size_t a, size_t b, size_t* result) {\n  *result = a + b; /* Unsigned addition is well defined and safe in C90 */\n  return *result < a;\n}\n#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_DECODER)*/\n\n#ifdef LODEPNG_COMPILE_DECODER\n/* Safely check if multiplying two integers will overflow (no undefined\nbehavior, compiler removing the code, etc...) and output result. */\nstatic int lodepng_mulofl(size_t a, size_t b, size_t* result) {\n  *result = a * b; /* Unsigned multiplication is well defined and safe in C90 */\n  return (a != 0 && *result / a != b);\n}\n\n#ifdef LODEPNG_COMPILE_ZLIB\n/* Safely check if a + b > c, even if overflow could happen. */\nstatic int lodepng_gtofl(size_t a, size_t b, size_t c) {\n  size_t d;\n  if(lodepng_addofl(a, b, &d)) return 1;\n  return d > c;\n}\n#endif /*LODEPNG_COMPILE_ZLIB*/\n#endif /*LODEPNG_COMPILE_DECODER*/\n\n\n/*\nOften in case of an error a value is assigned to a variable and then it breaks\nout of a loop (to go to the cleanup phase of a function). This macro does that.\nIt makes the error handling code shorter and more readable.\n\nExample: if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83);\n*/\n#define CERROR_BREAK(errorvar, code){\\\n  errorvar = code;\\\n  break;\\\n}\n\n/*version of CERROR_BREAK that assumes the common case where the error variable is named \"error\"*/\n#define ERROR_BREAK(code) CERROR_BREAK(error, code)\n\n/*Set error var to the error code, and return it.*/\n#define CERROR_RETURN_ERROR(errorvar, code){\\\n  errorvar = code;\\\n  return code;\\\n}\n\n/*Try the code, if it returns error, also return the error.*/\n#define CERROR_TRY_RETURN(call){\\\n  unsigned error = call;\\\n  if(error) return error;\\\n}\n\n/*Set error var to the error code, and return from the void function.*/\n#define CERROR_RETURN(errorvar, code){\\\n  errorvar = code;\\\n  return;\\\n}\n\n/*\nAbout uivector, ucvector and string:\n-All of them wrap dynamic arrays or text strings in a similar way.\n-LodePNG was originally written in C++. The vectors replace the std::vectors that were used in the C++ version.\n-The string tools are made to avoid problems with compilers that declare things like strncat as deprecated.\n-They're not used in the interface, only internally in this file as static functions.\n-As with many other structs in this file, the init and cleanup functions serve as ctor and dtor.\n*/\n\n#ifdef LODEPNG_COMPILE_ZLIB\n#ifdef LODEPNG_COMPILE_ENCODER\n/*dynamic vector of unsigned ints*/\ntypedef struct uivector {\n  unsigned* data;\n  size_t size; /*size in number of unsigned longs*/\n  size_t allocsize; /*allocated size in bytes*/\n} uivector;\n\nstatic void uivector_cleanup(void* p) {\n  ((uivector*)p)->size = ((uivector*)p)->allocsize = 0;\n  lodepng_free(((uivector*)p)->data);\n  ((uivector*)p)->data = NULL;\n}\n\n/*returns 1 if success, 0 if failure ==> nothing done*/\nstatic unsigned uivector_resize(uivector* p, size_t size) {\n  size_t allocsize = size * sizeof(unsigned);\n  if(allocsize > p->allocsize) {\n    size_t newsize = allocsize + (p->allocsize >> 1u);\n    void* data = lodepng_realloc(p->data, newsize);\n    if(data) {\n      p->allocsize = newsize;\n      p->data = (unsigned*)data;\n    }\n    else return 0; /*error: not enough memory*/\n  }\n  p->size = size;\n  return 1; /*success*/\n}\n\nstatic void uivector_init(uivector* p) {\n  p->data = NULL;\n  p->size = p->allocsize = 0;\n}\n\n/*returns 1 if success, 0 if failure ==> nothing done*/\nstatic unsigned uivector_push_back(uivector* p, unsigned c) {\n  if(!uivector_resize(p, p->size + 1)) return 0;\n  p->data[p->size - 1] = c;\n  return 1;\n}\n#endif /*LODEPNG_COMPILE_ENCODER*/\n#endif /*LODEPNG_COMPILE_ZLIB*/\n\n/* /////////////////////////////////////////////////////////////////////////// */\n\n/*dynamic vector of unsigned chars*/\ntypedef struct ucvector {\n  unsigned char* data;\n  size_t size; /*used size*/\n  size_t allocsize; /*allocated size*/\n} ucvector;\n\n/*returns 1 if success, 0 if failure ==> nothing done*/\nstatic unsigned ucvector_resize(ucvector* p, size_t size) {\n  if(size > p->allocsize) {\n    size_t newsize = size + (p->allocsize >> 1u);\n    void* data = lodepng_realloc(p->data, newsize);\n    if(data) {\n      p->allocsize = newsize;\n      p->data = (unsigned char*)data;\n    }\n    else return 0; /*error: not enough memory*/\n  }\n  p->size = size;\n  return 1; /*success*/\n}\n\nstatic ucvector ucvector_init(unsigned char* buffer, size_t size) {\n  ucvector v;\n  v.data = buffer;\n  v.allocsize = v.size = size;\n  return v;\n}\n\n/* ////////////////////////////////////////////////////////////////////////// */\n\n#ifdef LODEPNG_COMPILE_PNG\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n\n/*free string pointer and set it to NULL*/\nstatic void string_cleanup(char** out) {\n  lodepng_free(*out);\n  *out = NULL;\n}\n\n/*also appends null termination character*/\nstatic char* alloc_string_sized(const char* in, size_t insize) {\n  char* out = (char*)lodepng_malloc(insize + 1);\n  if(out) {\n    lodepng_memcpy(out, in, insize);\n    out[insize] = 0;\n  }\n  return out;\n}\n\n/* dynamically allocates a new string with a copy of the null terminated input text */\nstatic char* alloc_string(const char* in) {\n  return alloc_string_sized(in, lodepng_strlen(in));\n}\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n#endif /*LODEPNG_COMPILE_PNG*/\n\n/* ////////////////////////////////////////////////////////////////////////// */\n\n#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_PNG)\nstatic unsigned lodepng_read32bitInt(const unsigned char* buffer) {\n  return (((unsigned)buffer[0] << 24u) | ((unsigned)buffer[1] << 16u) |\n         ((unsigned)buffer[2] << 8u) | (unsigned)buffer[3]);\n}\n#endif /*defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_PNG)*/\n\n#if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)\n/*buffer must have at least 4 allocated bytes available*/\nstatic void lodepng_set32bitInt(unsigned char* buffer, unsigned value) {\n  buffer[0] = (unsigned char)((value >> 24) & 0xff);\n  buffer[1] = (unsigned char)((value >> 16) & 0xff);\n  buffer[2] = (unsigned char)((value >>  8) & 0xff);\n  buffer[3] = (unsigned char)((value      ) & 0xff);\n}\n#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/\n\n/* ////////////////////////////////////////////////////////////////////////// */\n/* / File IO                                                                / */\n/* ////////////////////////////////////////////////////////////////////////// */\n\n#ifdef LODEPNG_COMPILE_DISK\n\n/* returns negative value on error. This should be pure C compatible, so no fstat. */\nstatic long lodepng_filesize(const char* filename) {\n  FILE* file;\n  long size;\n  file = fopen(filename, \"rb\");\n  if(!file) return -1;\n\n  if(fseek(file, 0, SEEK_END) != 0) {\n    fclose(file);\n    return -1;\n  }\n\n  size = ftell(file);\n  /* It may give LONG_MAX as directory size, this is invalid for us. */\n  if(size == LONG_MAX) size = -1;\n\n  fclose(file);\n  return size;\n}\n\n/* load file into buffer that already has the correct allocated size. Returns error code.*/\nstatic unsigned lodepng_buffer_file(unsigned char* out, size_t size, const char* filename) {\n  FILE* file;\n  size_t readsize;\n  file = fopen(filename, \"rb\");\n  if(!file) return 78;\n\n  readsize = fread(out, 1, size, file);\n  fclose(file);\n\n  if(readsize != size) return 78;\n  return 0;\n}\n\nunsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename) {\n  long size = lodepng_filesize(filename);\n  if(size < 0) return 78;\n  *outsize = (size_t)size;\n\n  *out = (unsigned char*)lodepng_malloc((size_t)size);\n  if(!(*out) && size > 0) return 83; /*the above malloc failed*/\n\n  return lodepng_buffer_file(*out, (size_t)size, filename);\n}\n\n/*write given buffer to the file, overwriting the file, it doesn't append to it.*/\nunsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename) {\n  FILE* file;\n  file = fopen(filename, \"wb\" );\n  if(!file) return 79;\n  fwrite(buffer, 1, buffersize, file);\n  fclose(file);\n  return 0;\n}\n\n#endif /*LODEPNG_COMPILE_DISK*/\n\n/* ////////////////////////////////////////////////////////////////////////// */\n/* ////////////////////////////////////////////////////////////////////////// */\n/* // End of common code and tools. Begin of Zlib related code.            // */\n/* ////////////////////////////////////////////////////////////////////////// */\n/* ////////////////////////////////////////////////////////////////////////// */\n\n#ifdef LODEPNG_COMPILE_ZLIB\n#ifdef LODEPNG_COMPILE_ENCODER\n\ntypedef struct {\n  ucvector* data;\n  unsigned char bp; /*ok to overflow, indicates bit pos inside byte*/\n} LodePNGBitWriter;\n\nstatic void LodePNGBitWriter_init(LodePNGBitWriter* writer, ucvector* data) {\n  writer->data = data;\n  writer->bp = 0;\n}\n\n/*TODO: this ignores potential out of memory errors*/\n#define WRITEBIT(writer, bit){\\\n  /* append new byte */\\\n  if(((writer->bp) & 7u) == 0) {\\\n    if(!ucvector_resize(writer->data, writer->data->size + 1)) return;\\\n    writer->data->data[writer->data->size - 1] = 0;\\\n  }\\\n  (writer->data->data[writer->data->size - 1]) |= (bit << ((writer->bp) & 7u));\\\n  ++writer->bp;\\\n}\n\n/* LSB of value is written first, and LSB of bytes is used first */\nstatic void writeBits(LodePNGBitWriter* writer, unsigned value, size_t nbits) {\n  if(nbits == 1) { /* compiler should statically compile this case if nbits == 1 */\n    WRITEBIT(writer, value);\n  } else {\n    /* TODO: increase output size only once here rather than in each WRITEBIT */\n    size_t i;\n    for(i = 0; i != nbits; ++i) {\n      WRITEBIT(writer, (unsigned char)((value >> i) & 1));\n    }\n  }\n}\n\n/* This one is to use for adding huffman symbol, the value bits are written MSB first */\nstatic void writeBitsReversed(LodePNGBitWriter* writer, unsigned value, size_t nbits) {\n  size_t i;\n  for(i = 0; i != nbits; ++i) {\n    /* TODO: increase output size only once here rather than in each WRITEBIT */\n    WRITEBIT(writer, (unsigned char)((value >> (nbits - 1u - i)) & 1u));\n  }\n}\n#endif /*LODEPNG_COMPILE_ENCODER*/\n\n#ifdef LODEPNG_COMPILE_DECODER\n\ntypedef struct {\n  const unsigned char* data;\n  size_t size; /*size of data in bytes*/\n  size_t bitsize; /*size of data in bits, end of valid bp values, should be 8*size*/\n  size_t bp;\n  unsigned buffer; /*buffer for reading bits. NOTE: 'unsigned' must support at least 32 bits*/\n} LodePNGBitReader;\n\n/* data size argument is in bytes. Returns error if size too large causing overflow */\nstatic unsigned LodePNGBitReader_init(LodePNGBitReader* reader, const unsigned char* data, size_t size) {\n  size_t temp;\n  reader->data = data;\n  reader->size = size;\n  /* size in bits, return error if overflow (if size_t is 32 bit this supports up to 500MB)  */\n  if(lodepng_mulofl(size, 8u, &reader->bitsize)) return 105;\n  /*ensure incremented bp can be compared to bitsize without overflow even when it would be incremented 32 too much and\n  trying to ensure 32 more bits*/\n  if(lodepng_addofl(reader->bitsize, 64u, &temp)) return 105;\n  reader->bp = 0;\n  reader->buffer = 0;\n  return 0; /*ok*/\n}\n\n/*\nensureBits functions:\nEnsures the reader can at least read nbits bits in one or more readBits calls,\nsafely even if not enough bits are available.\nReturns 1 if there are enough bits available, 0 if not.\n*/\n\n/*See ensureBits documentation above. This one ensures exactly 1 bit */\n/*static unsigned ensureBits1(LodePNGBitReader* reader) {\n  if(reader->bp >= reader->bitsize) return 0;\n  reader->buffer = (unsigned)reader->data[reader->bp >> 3u] >> (reader->bp & 7u);\n  return 1;\n}*/\n\n/*See ensureBits documentation above. This one ensures up to 9 bits */\nstatic unsigned ensureBits9(LodePNGBitReader* reader, size_t nbits) {\n  size_t start = reader->bp >> 3u;\n  size_t size = reader->size;\n  if(start + 1u < size) {\n    reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u);\n    reader->buffer >>= (reader->bp & 7u);\n    return 1;\n  } else {\n    reader->buffer = 0;\n    if(start + 0u < size) reader->buffer |= reader->data[start + 0];\n    reader->buffer >>= (reader->bp & 7u);\n    return reader->bp + nbits <= reader->bitsize;\n  }\n}\n\n/*See ensureBits documentation above. This one ensures up to 17 bits */\nstatic unsigned ensureBits17(LodePNGBitReader* reader, size_t nbits) {\n  size_t start = reader->bp >> 3u;\n  size_t size = reader->size;\n  if(start + 2u < size) {\n    reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) |\n                     ((unsigned)reader->data[start + 2] << 16u);\n    reader->buffer >>= (reader->bp & 7u);\n    return 1;\n  } else {\n    reader->buffer = 0;\n    if(start + 0u < size) reader->buffer |= reader->data[start + 0];\n    if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u);\n    reader->buffer >>= (reader->bp & 7u);\n    return reader->bp + nbits <= reader->bitsize;\n  }\n}\n\n/*See ensureBits documentation above. This one ensures up to 25 bits */\nstatic LODEPNG_INLINE unsigned ensureBits25(LodePNGBitReader* reader, size_t nbits) {\n  size_t start = reader->bp >> 3u;\n  size_t size = reader->size;\n  if(start + 3u < size) {\n    reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) |\n                     ((unsigned)reader->data[start + 2] << 16u) | ((unsigned)reader->data[start + 3] << 24u);\n    reader->buffer >>= (reader->bp & 7u);\n    return 1;\n  } else {\n    reader->buffer = 0;\n    if(start + 0u < size) reader->buffer |= reader->data[start + 0];\n    if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u);\n    if(start + 2u < size) reader->buffer |= ((unsigned)reader->data[start + 2] << 16u);\n    reader->buffer >>= (reader->bp & 7u);\n    return reader->bp + nbits <= reader->bitsize;\n  }\n}\n\n/*See ensureBits documentation above. This one ensures up to 32 bits */\nstatic LODEPNG_INLINE unsigned ensureBits32(LodePNGBitReader* reader, size_t nbits) {\n  size_t start = reader->bp >> 3u;\n  size_t size = reader->size;\n  if(start + 4u < size) {\n    reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) |\n                     ((unsigned)reader->data[start + 2] << 16u) | ((unsigned)reader->data[start + 3] << 24u);\n    reader->buffer >>= (reader->bp & 7u);\n    reader->buffer |= (((unsigned)reader->data[start + 4] << 24u) << (8u - (reader->bp & 7u)));\n    return 1;\n  } else {\n    reader->buffer = 0;\n    if(start + 0u < size) reader->buffer |= reader->data[start + 0];\n    if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u);\n    if(start + 2u < size) reader->buffer |= ((unsigned)reader->data[start + 2] << 16u);\n    if(start + 3u < size) reader->buffer |= ((unsigned)reader->data[start + 3] << 24u);\n    reader->buffer >>= (reader->bp & 7u);\n    return reader->bp + nbits <= reader->bitsize;\n  }\n}\n\n/* Get bits without advancing the bit pointer. Must have enough bits available with ensureBits. Max nbits is 31. */\nstatic unsigned peekBits(LodePNGBitReader* reader, size_t nbits) {\n  /* The shift allows nbits to be only up to 31. */\n  return reader->buffer & ((1u << nbits) - 1u);\n}\n\n/* Must have enough bits available with ensureBits */\nstatic void advanceBits(LodePNGBitReader* reader, size_t nbits) {\n  reader->buffer >>= nbits;\n  reader->bp += nbits;\n}\n\n/* Must have enough bits available with ensureBits */\nstatic unsigned readBits(LodePNGBitReader* reader, size_t nbits) {\n  unsigned result = peekBits(reader, nbits);\n  advanceBits(reader, nbits);\n  return result;\n}\n\n/* Public for testing only. steps and result must have numsteps values. */\nunsigned lode_png_test_bitreader(const unsigned char* data, size_t size,\n                                 size_t numsteps, const size_t* steps, unsigned* result) {\n  size_t i;\n  LodePNGBitReader reader;\n  unsigned error = LodePNGBitReader_init(&reader, data, size);\n  if(error) return 0;\n  for(i = 0; i < numsteps; i++) {\n    size_t step = steps[i];\n    unsigned ok;\n    if(step > 25) ok = ensureBits32(&reader, step);\n    else if(step > 17) ok = ensureBits25(&reader, step);\n    else if(step > 9) ok = ensureBits17(&reader, step);\n    else ok = ensureBits9(&reader, step);\n    if(!ok) return 0;\n    result[i] = readBits(&reader, step);\n  }\n  return 1;\n}\n#endif /*LODEPNG_COMPILE_DECODER*/\n\nstatic unsigned reverseBits(unsigned bits, unsigned num) {\n  /*TODO: implement faster lookup table based version when needed*/\n  unsigned i, result = 0;\n  for(i = 0; i < num; i++) result |= ((bits >> (num - i - 1u)) & 1u) << i;\n  return result;\n}\n\n/* ////////////////////////////////////////////////////////////////////////// */\n/* / Deflate - Huffman                                                      / */\n/* ////////////////////////////////////////////////////////////////////////// */\n\n#define FIRST_LENGTH_CODE_INDEX 257\n#define LAST_LENGTH_CODE_INDEX 285\n/*256 literals, the end code, some length codes, and 2 unused codes*/\n#define NUM_DEFLATE_CODE_SYMBOLS 288\n/*the distance codes have their own symbols, 30 used, 2 unused*/\n#define NUM_DISTANCE_SYMBOLS 32\n/*the code length codes. 0-15: code lengths, 16: copy previous 3-6 times, 17: 3-10 zeros, 18: 11-138 zeros*/\n#define NUM_CODE_LENGTH_CODES 19\n\n/*the base lengths represented by codes 257-285*/\nstatic const unsigned LENGTHBASE[29]\n  = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59,\n     67, 83, 99, 115, 131, 163, 195, 227, 258};\n\n/*the extra bits used by codes 257-285 (added to base length)*/\nstatic const unsigned LENGTHEXTRA[29]\n  = {0, 0, 0, 0, 0, 0, 0,  0,  1,  1,  1,  1,  2,  2,  2,  2,  3,  3,  3,  3,\n      4,  4,  4,   4,   5,   5,   5,   5,   0};\n\n/*the base backwards distances (the bits of distance codes appear after length codes and use their own huffman tree)*/\nstatic const unsigned DISTANCEBASE[30]\n  = {1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513,\n     769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577};\n\n/*the extra bits of backwards distances (added to base)*/\nstatic const unsigned DISTANCEEXTRA[30]\n  = {0, 0, 0, 0, 1, 1, 2,  2,  3,  3,  4,  4,  5,  5,   6,   6,   7,   7,   8,\n       8,    9,    9,   10,   10,   11,   11,   12,    12,    13,    13};\n\n/*the order in which \"code length alphabet code lengths\" are stored as specified by deflate, out of this the huffman\ntree of the dynamic huffman tree lengths is generated*/\nstatic const unsigned CLCL_ORDER[NUM_CODE_LENGTH_CODES]\n  = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};\n\n/* ////////////////////////////////////////////////////////////////////////// */\n\n/*\nHuffman tree struct, containing multiple representations of the tree\n*/\ntypedef struct HuffmanTree {\n  unsigned* codes; /*the huffman codes (bit patterns representing the symbols)*/\n  unsigned* lengths; /*the lengths of the huffman codes*/\n  unsigned maxbitlen; /*maximum number of bits a single code can get*/\n  unsigned numcodes; /*number of symbols in the alphabet = number of codes*/\n  /* for reading only */\n  unsigned char* table_len; /*length of symbol from lookup table, or max length if secondary lookup needed*/\n  unsigned short* table_value; /*value of symbol from lookup table, or pointer to secondary table if needed*/\n} HuffmanTree;\n\nstatic void HuffmanTree_init(HuffmanTree* tree) {\n  tree->codes = 0;\n  tree->lengths = 0;\n  tree->table_len = 0;\n  tree->table_value = 0;\n}\n\nstatic void HuffmanTree_cleanup(HuffmanTree* tree) {\n  lodepng_free(tree->codes);\n  lodepng_free(tree->lengths);\n  lodepng_free(tree->table_len);\n  lodepng_free(tree->table_value);\n}\n\n/* amount of bits for first huffman table lookup (aka root bits), see HuffmanTree_makeTable and huffmanDecodeSymbol.*/\n/* values 8u and 9u work the fastest */\n#define FIRSTBITS 9u\n\n/* a symbol value too big to represent any valid symbol, to indicate reading disallowed huffman bits combination,\nwhich is possible in case of only 0 or 1 present symbols. */\n#define INVALIDSYMBOL 65535u\n\n/* make table for huffman decoding */\nstatic unsigned HuffmanTree_makeTable(HuffmanTree* tree) {\n  static const unsigned headsize = 1u << FIRSTBITS; /*size of the first table*/\n  static const unsigned mask = (1u << FIRSTBITS) /*headsize*/ - 1u;\n  size_t i, numpresent, pointer, size; /*total table size*/\n  unsigned* maxlens = (unsigned*)lodepng_malloc(headsize * sizeof(unsigned));\n  if(!maxlens) return 83; /*alloc fail*/\n\n  /* compute maxlens: max total bit length of symbols sharing prefix in the first table*/\n  lodepng_memset(maxlens, 0, headsize * sizeof(*maxlens));\n  for(i = 0; i < tree->numcodes; i++) {\n    unsigned symbol = tree->codes[i];\n    unsigned l = tree->lengths[i];\n    unsigned index;\n    if(l <= FIRSTBITS) continue; /*symbols that fit in first table don't increase secondary table size*/\n    /*get the FIRSTBITS MSBs, the MSBs of the symbol are encoded first. See later comment about the reversing*/\n    index = reverseBits(symbol >> (l - FIRSTBITS), FIRSTBITS);\n    maxlens[index] = LODEPNG_MAX(maxlens[index], l);\n  }\n  /* compute total table size: size of first table plus all secondary tables for symbols longer than FIRSTBITS */\n  size = headsize;\n  for(i = 0; i < headsize; ++i) {\n    unsigned l = maxlens[i];\n    if(l > FIRSTBITS) size += (1u << (l - FIRSTBITS));\n  }\n  tree->table_len = (unsigned char*)lodepng_malloc(size * sizeof(*tree->table_len));\n  tree->table_value = (unsigned short*)lodepng_malloc(size * sizeof(*tree->table_value));\n  if(!tree->table_len || !tree->table_value) {\n    lodepng_free(maxlens);\n    /* freeing tree->table values is done at a higher scope */\n    return 83; /*alloc fail*/\n  }\n  /*initialize with an invalid length to indicate unused entries*/\n  for(i = 0; i < size; ++i) tree->table_len[i] = 16;\n\n  /*fill in the first table for long symbols: max prefix size and pointer to secondary tables*/\n  pointer = headsize;\n  for(i = 0; i < headsize; ++i) {\n    unsigned l = maxlens[i];\n    if(l <= FIRSTBITS) continue;\n    tree->table_len[i] = l;\n    tree->table_value[i] = pointer;\n    pointer += (1u << (l - FIRSTBITS));\n  }\n  lodepng_free(maxlens);\n\n  /*fill in the first table for short symbols, or secondary table for long symbols*/\n  numpresent = 0;\n  for(i = 0; i < tree->numcodes; ++i) {\n    unsigned l = tree->lengths[i];\n    unsigned symbol = tree->codes[i]; /*the huffman bit pattern. i itself is the value.*/\n    /*reverse bits, because the huffman bits are given in MSB first order but the bit reader reads LSB first*/\n    unsigned reverse = reverseBits(symbol, l);\n    if(l == 0) continue;\n    numpresent++;\n\n    if(l <= FIRSTBITS) {\n      /*short symbol, fully in first table, replicated num times if l < FIRSTBITS*/\n      unsigned num = 1u << (FIRSTBITS - l);\n      unsigned j;\n      for(j = 0; j < num; ++j) {\n        /*bit reader will read the l bits of symbol first, the remaining FIRSTBITS - l bits go to the MSB's*/\n        unsigned index = reverse | (j << l);\n        if(tree->table_len[index] != 16) return 55; /*invalid tree: long symbol shares prefix with short symbol*/\n        tree->table_len[index] = l;\n        tree->table_value[index] = i;\n      }\n    } else {\n      /*long symbol, shares prefix with other long symbols in first lookup table, needs second lookup*/\n      /*the FIRSTBITS MSBs of the symbol are the first table index*/\n      unsigned index = reverse & mask;\n      unsigned maxlen = tree->table_len[index];\n      /*log2 of secondary table length, should be >= l - FIRSTBITS*/\n      unsigned tablelen = maxlen - FIRSTBITS;\n      unsigned start = tree->table_value[index]; /*starting index in secondary table*/\n      unsigned num = 1u << (tablelen - (l - FIRSTBITS)); /*amount of entries of this symbol in secondary table*/\n      unsigned j;\n      if(maxlen < l) return 55; /*invalid tree: long symbol shares prefix with short symbol*/\n      for(j = 0; j < num; ++j) {\n        unsigned reverse2 = reverse >> FIRSTBITS; /* l - FIRSTBITS bits */\n        unsigned index2 = start + (reverse2 | (j << (l - FIRSTBITS)));\n        tree->table_len[index2] = l;\n        tree->table_value[index2] = i;\n      }\n    }\n  }\n\n  if(numpresent < 2) {\n    /* In case of exactly 1 symbol, in theory the huffman symbol needs 0 bits,\n    but deflate uses 1 bit instead. In case of 0 symbols, no symbols can\n    appear at all, but such huffman tree could still exist (e.g. if distance\n    codes are never used). In both cases, not all symbols of the table will be\n    filled in. Fill them in with an invalid symbol value so returning them from\n    huffmanDecodeSymbol will cause error. */\n    for(i = 0; i < size; ++i) {\n      if(tree->table_len[i] == 16) {\n        /* As length, use a value smaller than FIRSTBITS for the head table,\n        and a value larger than FIRSTBITS for the secondary table, to ensure\n        valid behavior for advanceBits when reading this symbol. */\n        tree->table_len[i] = (i < headsize) ? 1 : (FIRSTBITS + 1);\n        tree->table_value[i] = INVALIDSYMBOL;\n      }\n    }\n  } else {\n    /* A good huffman tree has N * 2 - 1 nodes, of which N - 1 are internal nodes.\n    If that is not the case (due to too long length codes), the table will not\n    have been fully used, and this is an error (not all bit combinations can be\n    decoded): an oversubscribed huffman tree, indicated by error 55. */\n    for(i = 0; i < size; ++i) {\n      if(tree->table_len[i] == 16) return 55;\n    }\n  }\n\n  return 0;\n}\n\n/*\nSecond step for the ...makeFromLengths and ...makeFromFrequencies functions.\nnumcodes, lengths and maxbitlen must already be filled in correctly. return\nvalue is error.\n*/\nstatic unsigned HuffmanTree_makeFromLengths2(HuffmanTree* tree) {\n  unsigned* blcount;\n  unsigned* nextcode;\n  unsigned error = 0;\n  unsigned bits, n;\n\n  tree->codes = (unsigned*)lodepng_malloc(tree->numcodes * sizeof(unsigned));\n  blcount = (unsigned*)lodepng_malloc((tree->maxbitlen + 1) * sizeof(unsigned));\n  nextcode = (unsigned*)lodepng_malloc((tree->maxbitlen + 1) * sizeof(unsigned));\n  if(!tree->codes || !blcount || !nextcode) error = 83; /*alloc fail*/\n\n  if(!error) {\n    for(n = 0; n != tree->maxbitlen + 1; n++) blcount[n] = nextcode[n] = 0;\n    /*step 1: count number of instances of each code length*/\n    for(bits = 0; bits != tree->numcodes; ++bits) ++blcount[tree->lengths[bits]];\n    /*step 2: generate the nextcode values*/\n    for(bits = 1; bits <= tree->maxbitlen; ++bits) {\n      nextcode[bits] = (nextcode[bits - 1] + blcount[bits - 1]) << 1u;\n    }\n    /*step 3: generate all the codes*/\n    for(n = 0; n != tree->numcodes; ++n) {\n      if(tree->lengths[n] != 0) {\n        tree->codes[n] = nextcode[tree->lengths[n]]++;\n        /*remove superfluous bits from the code*/\n        tree->codes[n] &= ((1u << tree->lengths[n]) - 1u);\n      }\n    }\n  }\n\n  lodepng_free(blcount);\n  lodepng_free(nextcode);\n\n  if(!error) error = HuffmanTree_makeTable(tree);\n  return error;\n}\n\n/*\ngiven the code lengths (as stored in the PNG file), generate the tree as defined\nby Deflate. maxbitlen is the maximum bits that a code in the tree can have.\nreturn value is error.\n*/\nstatic unsigned HuffmanTree_makeFromLengths(HuffmanTree* tree, const unsigned* bitlen,\n                                            size_t numcodes, unsigned maxbitlen) {\n  unsigned i;\n  tree->lengths = (unsigned*)lodepng_malloc(numcodes * sizeof(unsigned));\n  if(!tree->lengths) return 83; /*alloc fail*/\n  for(i = 0; i != numcodes; ++i) tree->lengths[i] = bitlen[i];\n  tree->numcodes = (unsigned)numcodes; /*number of symbols*/\n  tree->maxbitlen = maxbitlen;\n  return HuffmanTree_makeFromLengths2(tree);\n}\n\n#ifdef LODEPNG_COMPILE_ENCODER\n\n/*BPM: Boundary Package Merge, see \"A Fast and Space-Economical Algorithm for Length-Limited Coding\",\nJyrki Katajainen, Alistair Moffat, Andrew Turpin, 1995.*/\n\n/*chain node for boundary package merge*/\ntypedef struct BPMNode {\n  int weight; /*the sum of all weights in this chain*/\n  unsigned index; /*index of this leaf node (called \"count\" in the paper)*/\n  struct BPMNode* tail; /*the next nodes in this chain (null if last)*/\n  int in_use;\n} BPMNode;\n\n/*lists of chains*/\ntypedef struct BPMLists {\n  /*memory pool*/\n  unsigned memsize;\n  BPMNode* memory;\n  unsigned numfree;\n  unsigned nextfree;\n  BPMNode** freelist;\n  /*two heads of lookahead chains per list*/\n  unsigned listsize;\n  BPMNode** chains0;\n  BPMNode** chains1;\n} BPMLists;\n\n/*creates a new chain node with the given parameters, from the memory in the lists */\nstatic BPMNode* bpmnode_create(BPMLists* lists, int weight, unsigned index, BPMNode* tail) {\n  unsigned i;\n  BPMNode* result;\n\n  /*memory full, so garbage collect*/\n  if(lists->nextfree >= lists->numfree) {\n    /*mark only those that are in use*/\n    for(i = 0; i != lists->memsize; ++i) lists->memory[i].in_use = 0;\n    for(i = 0; i != lists->listsize; ++i) {\n      BPMNode* node;\n      for(node = lists->chains0[i]; node != 0; node = node->tail) node->in_use = 1;\n      for(node = lists->chains1[i]; node != 0; node = node->tail) node->in_use = 1;\n    }\n    /*collect those that are free*/\n    lists->numfree = 0;\n    for(i = 0; i != lists->memsize; ++i) {\n      if(!lists->memory[i].in_use) lists->freelist[lists->numfree++] = &lists->memory[i];\n    }\n    lists->nextfree = 0;\n  }\n\n  result = lists->freelist[lists->nextfree++];\n  result->weight = weight;\n  result->index = index;\n  result->tail = tail;\n  return result;\n}\n\n/*sort the leaves with stable mergesort*/\nstatic void bpmnode_sort(BPMNode* leaves, size_t num) {\n  BPMNode* mem = (BPMNode*)lodepng_malloc(sizeof(*leaves) * num);\n  size_t width, counter = 0;\n  for(width = 1; width < num; width *= 2) {\n    BPMNode* a = (counter & 1) ? mem : leaves;\n    BPMNode* b = (counter & 1) ? leaves : mem;\n    size_t p;\n    for(p = 0; p < num; p += 2 * width) {\n      size_t q = (p + width > num) ? num : (p + width);\n      size_t r = (p + 2 * width > num) ? num : (p + 2 * width);\n      size_t i = p, j = q, k;\n      for(k = p; k < r; k++) {\n        if(i < q && (j >= r || a[i].weight <= a[j].weight)) b[k] = a[i++];\n        else b[k] = a[j++];\n      }\n    }\n    counter++;\n  }\n  if(counter & 1) lodepng_memcpy(leaves, mem, sizeof(*leaves) * num);\n  lodepng_free(mem);\n}\n\n/*Boundary Package Merge step, numpresent is the amount of leaves, and c is the current chain.*/\nstatic void boundaryPM(BPMLists* lists, BPMNode* leaves, size_t numpresent, int c, int num) {\n  unsigned lastindex = lists->chains1[c]->index;\n\n  if(c == 0) {\n    if(lastindex >= numpresent) return;\n    lists->chains0[c] = lists->chains1[c];\n    lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, 0);\n  } else {\n    /*sum of the weights of the head nodes of the previous lookahead chains.*/\n    int sum = lists->chains0[c - 1]->weight + lists->chains1[c - 1]->weight;\n    lists->chains0[c] = lists->chains1[c];\n    if(lastindex < numpresent && sum > leaves[lastindex].weight) {\n      lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, lists->chains1[c]->tail);\n      return;\n    }\n    lists->chains1[c] = bpmnode_create(lists, sum, lastindex, lists->chains1[c - 1]);\n    /*in the end we are only interested in the chain of the last list, so no\n    need to recurse if we're at the last one (this gives measurable speedup)*/\n    if(num + 1 < (int)(2 * numpresent - 2)) {\n      boundaryPM(lists, leaves, numpresent, c - 1, num);\n      boundaryPM(lists, leaves, numpresent, c - 1, num);\n    }\n  }\n}\n\nunsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies,\n                                      size_t numcodes, unsigned maxbitlen) {\n  unsigned error = 0;\n  unsigned i;\n  size_t numpresent = 0; /*number of symbols with non-zero frequency*/\n  BPMNode* leaves; /*the symbols, only those with > 0 frequency*/\n\n  if(numcodes == 0) return 80; /*error: a tree of 0 symbols is not supposed to be made*/\n  if((1u << maxbitlen) < (unsigned)numcodes) return 80; /*error: represent all symbols*/\n\n  leaves = (BPMNode*)lodepng_malloc(numcodes * sizeof(*leaves));\n  if(!leaves) return 83; /*alloc fail*/\n\n  for(i = 0; i != numcodes; ++i) {\n    if(frequencies[i] > 0) {\n      leaves[numpresent].weight = (int)frequencies[i];\n      leaves[numpresent].index = i;\n      ++numpresent;\n    }\n  }\n\n  lodepng_memset(lengths, 0, numcodes * sizeof(*lengths));\n\n  /*ensure at least two present symbols. There should be at least one symbol\n  according to RFC 1951 section 3.2.7. Some decoders incorrectly require two. To\n  make these work as well ensure there are at least two symbols. The\n  Package-Merge code below also doesn't work correctly if there's only one\n  symbol, it'd give it the theoretical 0 bits but in practice zlib wants 1 bit*/\n  if(numpresent == 0) {\n    lengths[0] = lengths[1] = 1; /*note that for RFC 1951 section 3.2.7, only lengths[0] = 1 is needed*/\n  } else if(numpresent == 1) {\n    lengths[leaves[0].index] = 1;\n    lengths[leaves[0].index == 0 ? 1 : 0] = 1;\n  } else {\n    BPMLists lists;\n    BPMNode* node;\n\n    bpmnode_sort(leaves, numpresent);\n\n    lists.listsize = maxbitlen;\n    lists.memsize = 2 * maxbitlen * (maxbitlen + 1);\n    lists.nextfree = 0;\n    lists.numfree = lists.memsize;\n    lists.memory = (BPMNode*)lodepng_malloc(lists.memsize * sizeof(*lists.memory));\n    lists.freelist = (BPMNode**)lodepng_malloc(lists.memsize * sizeof(BPMNode*));\n    lists.chains0 = (BPMNode**)lodepng_malloc(lists.listsize * sizeof(BPMNode*));\n    lists.chains1 = (BPMNode**)lodepng_malloc(lists.listsize * sizeof(BPMNode*));\n    if(!lists.memory || !lists.freelist || !lists.chains0 || !lists.chains1) error = 83; /*alloc fail*/\n\n    if(!error) {\n      for(i = 0; i != lists.memsize; ++i) lists.freelist[i] = &lists.memory[i];\n\n      bpmnode_create(&lists, leaves[0].weight, 1, 0);\n      bpmnode_create(&lists, leaves[1].weight, 2, 0);\n\n      for(i = 0; i != lists.listsize; ++i) {\n        lists.chains0[i] = &lists.memory[0];\n        lists.chains1[i] = &lists.memory[1];\n      }\n\n      /*each boundaryPM call adds one chain to the last list, and we need 2 * numpresent - 2 chains.*/\n      for(i = 2; i != 2 * numpresent - 2; ++i) boundaryPM(&lists, leaves, numpresent, (int)maxbitlen - 1, (int)i);\n\n      for(node = lists.chains1[maxbitlen - 1]; node; node = node->tail) {\n        for(i = 0; i != node->index; ++i) ++lengths[leaves[i].index];\n      }\n    }\n\n    lodepng_free(lists.memory);\n    lodepng_free(lists.freelist);\n    lodepng_free(lists.chains0);\n    lodepng_free(lists.chains1);\n  }\n\n  lodepng_free(leaves);\n  return error;\n}\n\n/*Create the Huffman tree given the symbol frequencies*/\nstatic unsigned HuffmanTree_makeFromFrequencies(HuffmanTree* tree, const unsigned* frequencies,\n                                                size_t mincodes, size_t numcodes, unsigned maxbitlen) {\n  unsigned error = 0;\n  while(!frequencies[numcodes - 1] && numcodes > mincodes) --numcodes; /*trim zeroes*/\n  tree->lengths = (unsigned*)lodepng_malloc(numcodes * sizeof(unsigned));\n  if(!tree->lengths) return 83; /*alloc fail*/\n  tree->maxbitlen = maxbitlen;\n  tree->numcodes = (unsigned)numcodes; /*number of symbols*/\n\n  error = lodepng_huffman_code_lengths(tree->lengths, frequencies, numcodes, maxbitlen);\n  if(!error) error = HuffmanTree_makeFromLengths2(tree);\n  return error;\n}\n#endif /*LODEPNG_COMPILE_ENCODER*/\n\n/*get the literal and length code tree of a deflated block with fixed tree, as per the deflate specification*/\nstatic unsigned generateFixedLitLenTree(HuffmanTree* tree) {\n  unsigned i, error = 0;\n  unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned));\n  if(!bitlen) return 83; /*alloc fail*/\n\n  /*288 possible codes: 0-255=literals, 256=endcode, 257-285=lengthcodes, 286-287=unused*/\n  for(i =   0; i <= 143; ++i) bitlen[i] = 8;\n  for(i = 144; i <= 255; ++i) bitlen[i] = 9;\n  for(i = 256; i <= 279; ++i) bitlen[i] = 7;\n  for(i = 280; i <= 287; ++i) bitlen[i] = 8;\n\n  error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DEFLATE_CODE_SYMBOLS, 15);\n\n  lodepng_free(bitlen);\n  return error;\n}\n\n/*get the distance code tree of a deflated block with fixed tree, as specified in the deflate specification*/\nstatic unsigned generateFixedDistanceTree(HuffmanTree* tree) {\n  unsigned i, error = 0;\n  unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned));\n  if(!bitlen) return 83; /*alloc fail*/\n\n  /*there are 32 distance codes, but 30-31 are unused*/\n  for(i = 0; i != NUM_DISTANCE_SYMBOLS; ++i) bitlen[i] = 5;\n  error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DISTANCE_SYMBOLS, 15);\n\n  lodepng_free(bitlen);\n  return error;\n}\n\n#ifdef LODEPNG_COMPILE_DECODER\n\n/*\nreturns the code. The bit reader must already have been ensured at least 15 bits\n*/\nstatic unsigned huffmanDecodeSymbol(LodePNGBitReader* reader, const HuffmanTree* codetree) {\n  unsigned short code = peekBits(reader, FIRSTBITS);\n  unsigned short l = codetree->table_len[code];\n  unsigned short value = codetree->table_value[code];\n  if(l <= FIRSTBITS) {\n    advanceBits(reader, l);\n    return value;\n  } else {\n    unsigned index2;\n    advanceBits(reader, FIRSTBITS);\n    index2 = value + peekBits(reader, l - FIRSTBITS);\n    advanceBits(reader, codetree->table_len[index2] - FIRSTBITS);\n    return codetree->table_value[index2];\n  }\n}\n#endif /*LODEPNG_COMPILE_DECODER*/\n\n#ifdef LODEPNG_COMPILE_DECODER\n\n/* ////////////////////////////////////////////////////////////////////////// */\n/* / Inflator (Decompressor)                                                / */\n/* ////////////////////////////////////////////////////////////////////////// */\n\n/*get the tree of a deflated block with fixed tree, as specified in the deflate specification\nReturns error code.*/\nstatic unsigned getTreeInflateFixed(HuffmanTree* tree_ll, HuffmanTree* tree_d) {\n  unsigned error = generateFixedLitLenTree(tree_ll);\n  if(error) return error;\n  return generateFixedDistanceTree(tree_d);\n}\n\n/*get the tree of a deflated block with dynamic tree, the tree itself is also Huffman compressed with a known tree*/\nstatic unsigned getTreeInflateDynamic(HuffmanTree* tree_ll, HuffmanTree* tree_d,\n                                      LodePNGBitReader* reader) {\n  /*make sure that length values that aren't filled in will be 0, or a wrong tree will be generated*/\n  unsigned error = 0;\n  unsigned n, HLIT, HDIST, HCLEN, i;\n\n  /*see comments in deflateDynamic for explanation of the context and these variables, it is analogous*/\n  unsigned* bitlen_ll = 0; /*lit,len code lengths*/\n  unsigned* bitlen_d = 0; /*dist code lengths*/\n  /*code length code lengths (\"clcl\"), the bit lengths of the huffman tree used to compress bitlen_ll and bitlen_d*/\n  unsigned* bitlen_cl = 0;\n  HuffmanTree tree_cl; /*the code tree for code length codes (the huffman tree for compressed huffman trees)*/\n\n  if(!ensureBits17(reader, 14)) return 49; /*error: the bit pointer is or will go past the memory*/\n\n  /*number of literal/length codes + 257. Unlike the spec, the value 257 is added to it here already*/\n  HLIT =  readBits(reader, 5) + 257;\n  /*number of distance codes. Unlike the spec, the value 1 is added to it here already*/\n  HDIST = readBits(reader, 5) + 1;\n  /*number of code length codes. Unlike the spec, the value 4 is added to it here already*/\n  HCLEN = readBits(reader, 4) + 4;\n\n  bitlen_cl = (unsigned*)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(unsigned));\n  if(!bitlen_cl) return 83 /*alloc fail*/;\n\n  HuffmanTree_init(&tree_cl);\n\n  while(!error) {\n    /*read the code length codes out of 3 * (amount of code length codes) bits*/\n    if(lodepng_gtofl(reader->bp, HCLEN * 3, reader->bitsize)) {\n      ERROR_BREAK(50); /*error: the bit pointer is or will go past the memory*/\n    }\n    for(i = 0; i != HCLEN; ++i) {\n      ensureBits9(reader, 3); /*out of bounds already checked above */\n      bitlen_cl[CLCL_ORDER[i]] = readBits(reader, 3);\n    }\n    for(i = HCLEN; i != NUM_CODE_LENGTH_CODES; ++i) {\n      bitlen_cl[CLCL_ORDER[i]] = 0;\n    }\n\n    error = HuffmanTree_makeFromLengths(&tree_cl, bitlen_cl, NUM_CODE_LENGTH_CODES, 7);\n    if(error) break;\n\n    /*now we can use this tree to read the lengths for the tree that this function will return*/\n    bitlen_ll = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned));\n    bitlen_d = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned));\n    if(!bitlen_ll || !bitlen_d) ERROR_BREAK(83 /*alloc fail*/);\n    lodepng_memset(bitlen_ll, 0, NUM_DEFLATE_CODE_SYMBOLS * sizeof(*bitlen_ll));\n    lodepng_memset(bitlen_d, 0, NUM_DISTANCE_SYMBOLS * sizeof(*bitlen_d));\n\n    /*i is the current symbol we're reading in the part that contains the code lengths of lit/len and dist codes*/\n    i = 0;\n    while(i < HLIT + HDIST) {\n      unsigned code;\n      ensureBits25(reader, 22); /* up to 15 bits for huffman code, up to 7 extra bits below*/\n      code = huffmanDecodeSymbol(reader, &tree_cl);\n      if(code <= 15) /*a length code*/ {\n        if(i < HLIT) bitlen_ll[i] = code;\n        else bitlen_d[i - HLIT] = code;\n        ++i;\n      } else if(code == 16) /*repeat previous*/ {\n        unsigned replength = 3; /*read in the 2 bits that indicate repeat length (3-6)*/\n        unsigned value; /*set value to the previous code*/\n\n        if(i == 0) ERROR_BREAK(54); /*can't repeat previous if i is 0*/\n\n        replength += readBits(reader, 2);\n\n        if(i < HLIT + 1) value = bitlen_ll[i - 1];\n        else value = bitlen_d[i - HLIT - 1];\n        /*repeat this value in the next lengths*/\n        for(n = 0; n < replength; ++n) {\n          if(i >= HLIT + HDIST) ERROR_BREAK(13); /*error: i is larger than the amount of codes*/\n          if(i < HLIT) bitlen_ll[i] = value;\n          else bitlen_d[i - HLIT] = value;\n          ++i;\n        }\n      } else if(code == 17) /*repeat \"0\" 3-10 times*/ {\n        unsigned replength = 3; /*read in the bits that indicate repeat length*/\n        replength += readBits(reader, 3);\n\n        /*repeat this value in the next lengths*/\n        for(n = 0; n < replength; ++n) {\n          if(i >= HLIT + HDIST) ERROR_BREAK(14); /*error: i is larger than the amount of codes*/\n\n          if(i < HLIT) bitlen_ll[i] = 0;\n          else bitlen_d[i - HLIT] = 0;\n          ++i;\n        }\n      } else if(code == 18) /*repeat \"0\" 11-138 times*/ {\n        unsigned replength = 11; /*read in the bits that indicate repeat length*/\n        replength += readBits(reader, 7);\n\n        /*repeat this value in the next lengths*/\n        for(n = 0; n < replength; ++n) {\n          if(i >= HLIT + HDIST) ERROR_BREAK(15); /*error: i is larger than the amount of codes*/\n\n          if(i < HLIT) bitlen_ll[i] = 0;\n          else bitlen_d[i - HLIT] = 0;\n          ++i;\n        }\n      } else /*if(code == INVALIDSYMBOL)*/ {\n        ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/\n      }\n      /*check if any of the ensureBits above went out of bounds*/\n      if(reader->bp > reader->bitsize) {\n        /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol\n        (10=no endcode, 11=wrong jump outside of tree)*/\n        /* TODO: revise error codes 10,11,50: the above comment is no longer valid */\n        ERROR_BREAK(50); /*error, bit pointer jumps past memory*/\n      }\n    }\n    if(error) break;\n\n    if(bitlen_ll[256] == 0) ERROR_BREAK(64); /*the length of the end code 256 must be larger than 0*/\n\n    /*now we've finally got HLIT and HDIST, so generate the code trees, and the function is done*/\n    error = HuffmanTree_makeFromLengths(tree_ll, bitlen_ll, NUM_DEFLATE_CODE_SYMBOLS, 15);\n    if(error) break;\n    error = HuffmanTree_makeFromLengths(tree_d, bitlen_d, NUM_DISTANCE_SYMBOLS, 15);\n\n    break; /*end of error-while*/\n  }\n\n  lodepng_free(bitlen_cl);\n  lodepng_free(bitlen_ll);\n  lodepng_free(bitlen_d);\n  HuffmanTree_cleanup(&tree_cl);\n\n  return error;\n}\n\n/*inflate a block with dynamic of fixed Huffman tree. btype must be 1 or 2.*/\nstatic unsigned inflateHuffmanBlock(ucvector* out, LodePNGBitReader* reader,\n                                    unsigned btype, size_t max_output_size) {\n  unsigned error = 0;\n  HuffmanTree tree_ll; /*the huffman tree for literal and length codes*/\n  HuffmanTree tree_d; /*the huffman tree for distance codes*/\n\n  HuffmanTree_init(&tree_ll);\n  HuffmanTree_init(&tree_d);\n\n  if(btype == 1) error = getTreeInflateFixed(&tree_ll, &tree_d);\n  else /*if(btype == 2)*/ error = getTreeInflateDynamic(&tree_ll, &tree_d, reader);\n\n  while(!error) /*decode all symbols until end reached, breaks at end code*/ {\n    /*code_ll is literal, length or end code*/\n    unsigned code_ll;\n    ensureBits25(reader, 20); /* up to 15 for the huffman symbol, up to 5 for the length extra bits */\n    code_ll = huffmanDecodeSymbol(reader, &tree_ll);\n    if(code_ll <= 255) /*literal symbol*/ {\n      if(!ucvector_resize(out, out->size + 1)) ERROR_BREAK(83 /*alloc fail*/);\n      out->data[out->size - 1] = (unsigned char)code_ll;\n    } else if(code_ll >= FIRST_LENGTH_CODE_INDEX && code_ll <= LAST_LENGTH_CODE_INDEX) /*length code*/ {\n      unsigned code_d, distance;\n      unsigned numextrabits_l, numextrabits_d; /*extra bits for length and distance*/\n      size_t start, backward, length;\n\n      /*part 1: get length base*/\n      length = LENGTHBASE[code_ll - FIRST_LENGTH_CODE_INDEX];\n\n      /*part 2: get extra bits and add the value of that to length*/\n      numextrabits_l = LENGTHEXTRA[code_ll - FIRST_LENGTH_CODE_INDEX];\n      if(numextrabits_l != 0) {\n        /* bits already ensured above */\n        length += readBits(reader, numextrabits_l);\n      }\n\n      /*part 3: get distance code*/\n      ensureBits32(reader, 28); /* up to 15 for the huffman symbol, up to 13 for the extra bits */\n      code_d = huffmanDecodeSymbol(reader, &tree_d);\n      if(code_d > 29) {\n        if(code_d <= 31) {\n          ERROR_BREAK(18); /*error: invalid distance code (30-31 are never used)*/\n        } else /* if(code_d == INVALIDSYMBOL) */{\n          ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/\n        }\n      }\n      distance = DISTANCEBASE[code_d];\n\n      /*part 4: get extra bits from distance*/\n      numextrabits_d = DISTANCEEXTRA[code_d];\n      if(numextrabits_d != 0) {\n        /* bits already ensured above */\n        distance += readBits(reader, numextrabits_d);\n      }\n\n      /*part 5: fill in all the out[n] values based on the length and dist*/\n      start = out->size;\n      if(distance > start) ERROR_BREAK(52); /*too long backward distance*/\n      backward = start - distance;\n\n      if(!ucvector_resize(out, out->size + length)) ERROR_BREAK(83 /*alloc fail*/);\n      if(distance < length) {\n        size_t forward;\n        lodepng_memcpy(out->data + start, out->data + backward, distance);\n        start += distance;\n        for(forward = distance; forward < length; ++forward) {\n          out->data[start++] = out->data[backward++];\n        }\n      } else {\n        lodepng_memcpy(out->data + start, out->data + backward, length);\n      }\n    } else if(code_ll == 256) {\n      break; /*end code, break the loop*/\n    } else /*if(code_ll == INVALIDSYMBOL)*/ {\n      ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/\n    }\n    /*check if any of the ensureBits above went out of bounds*/\n    if(reader->bp > reader->bitsize) {\n      /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol\n      (10=no endcode, 11=wrong jump outside of tree)*/\n      /* TODO: revise error codes 10,11,50: the above comment is no longer valid */\n      ERROR_BREAK(51); /*error, bit pointer jumps past memory*/\n    }\n    if(max_output_size && out->size > max_output_size) {\n      ERROR_BREAK(109); /*error, larger than max size*/\n    }\n  }\n\n  HuffmanTree_cleanup(&tree_ll);\n  HuffmanTree_cleanup(&tree_d);\n\n  return error;\n}\n\nstatic unsigned inflateNoCompression(ucvector* out, LodePNGBitReader* reader,\n                                     const LodePNGDecompressSettings* settings) {\n  size_t bytepos;\n  size_t size = reader->size;\n  unsigned LEN, NLEN, error = 0;\n\n  /*go to first boundary of byte*/\n  bytepos = (reader->bp + 7u) >> 3u;\n\n  /*read LEN (2 bytes) and NLEN (2 bytes)*/\n  if(bytepos + 4 >= size) return 52; /*error, bit pointer will jump past memory*/\n  LEN = (unsigned)reader->data[bytepos] + ((unsigned)reader->data[bytepos + 1] << 8u); bytepos += 2;\n  NLEN = (unsigned)reader->data[bytepos] + ((unsigned)reader->data[bytepos + 1] << 8u); bytepos += 2;\n\n  /*check if 16-bit NLEN is really the one's complement of LEN*/\n  if(!settings->ignore_nlen && LEN + NLEN != 65535) {\n    return 21; /*error: NLEN is not one's complement of LEN*/\n  }\n\n  if(!ucvector_resize(out, out->size + LEN)) return 83; /*alloc fail*/\n\n  /*read the literal data: LEN bytes are now stored in the out buffer*/\n  if(bytepos + LEN > size) return 23; /*error: reading outside of in buffer*/\n\n  lodepng_memcpy(out->data + out->size - LEN, reader->data + bytepos, LEN);\n  bytepos += LEN;\n\n  reader->bp = bytepos << 3u;\n\n  return error;\n}\n\nstatic unsigned lodepng_inflatev(ucvector* out,\n                                 const unsigned char* in, size_t insize,\n                                 const LodePNGDecompressSettings* settings) {\n  unsigned BFINAL = 0;\n  LodePNGBitReader reader;\n  unsigned error = LodePNGBitReader_init(&reader, in, insize);\n\n  if(error) return error;\n\n  while(!BFINAL) {\n    unsigned BTYPE;\n    if(!ensureBits9(&reader, 3)) return 52; /*error, bit pointer will jump past memory*/\n    BFINAL = readBits(&reader, 1);\n    BTYPE = readBits(&reader, 2);\n\n    if(BTYPE == 3) return 20; /*error: invalid BTYPE*/\n    else if(BTYPE == 0) error = inflateNoCompression(out, &reader, settings); /*no compression*/\n    else error = inflateHuffmanBlock(out, &reader, BTYPE, settings->max_output_size); /*compression, BTYPE 01 or 10*/\n    if(!error && settings->max_output_size && out->size > settings->max_output_size) error = 109;\n    if(error) break;\n  }\n\n  return error;\n}\n\nunsigned lodepng_inflate(unsigned char** out, size_t* outsize,\n                         const unsigned char* in, size_t insize,\n                         const LodePNGDecompressSettings* settings) {\n  ucvector v = ucvector_init(*out, *outsize);\n  unsigned error = lodepng_inflatev(&v, in, insize, settings);\n  *out = v.data;\n  *outsize = v.size;\n  return error;\n}\n\nstatic unsigned inflatev(ucvector* out, const unsigned char* in, size_t insize,\n                        const LodePNGDecompressSettings* settings) {\n  if(settings->custom_inflate) {\n    unsigned error = settings->custom_inflate(&out->data, &out->size, in, insize, settings);\n    out->allocsize = out->size;\n    if(error) {\n      /*the custom inflate is allowed to have its own error codes, however, we translate it to code 110*/\n      error = 110;\n      /*if there's a max output size, and the custom zlib returned error, then indicate that error instead*/\n      if(settings->max_output_size && out->size > settings->max_output_size) error = 109;\n    }\n    return error;\n  } else {\n    return lodepng_inflatev(out, in, insize, settings);\n  }\n}\n\n#endif /*LODEPNG_COMPILE_DECODER*/\n\n#ifdef LODEPNG_COMPILE_ENCODER\n\n/* ////////////////////////////////////////////////////////////////////////// */\n/* / Deflator (Compressor)                                                  / */\n/* ////////////////////////////////////////////////////////////////////////// */\n\nstatic const size_t MAX_SUPPORTED_DEFLATE_LENGTH = 258;\n\n/*search the index in the array, that has the largest value smaller than or equal to the given value,\ngiven array must be sorted (if no value is smaller, it returns the size of the given array)*/\nstatic size_t searchCodeIndex(const unsigned* array, size_t array_size, size_t value) {\n  /*binary search (only small gain over linear). TODO: use CPU log2 instruction for getting symbols instead*/\n  size_t left = 1;\n  size_t right = array_size - 1;\n\n  while(left <= right) {\n    size_t mid = (left + right) >> 1;\n    if(array[mid] >= value) right = mid - 1;\n    else left = mid + 1;\n  }\n  if(left >= array_size || array[left] > value) left--;\n  return left;\n}\n\nstatic void addLengthDistance(uivector* values, size_t length, size_t distance) {\n  /*values in encoded vector are those used by deflate:\n  0-255: literal bytes\n  256: end\n  257-285: length/distance pair (length code, followed by extra length bits, distance code, extra distance bits)\n  286-287: invalid*/\n\n  unsigned length_code = (unsigned)searchCodeIndex(LENGTHBASE, 29, length);\n  unsigned extra_length = (unsigned)(length - LENGTHBASE[length_code]);\n  unsigned dist_code = (unsigned)searchCodeIndex(DISTANCEBASE, 30, distance);\n  unsigned extra_distance = (unsigned)(distance - DISTANCEBASE[dist_code]);\n\n  size_t pos = values->size;\n  /*TODO: return error when this fails (out of memory)*/\n  unsigned ok = uivector_resize(values, values->size + 4);\n  if(ok) {\n    values->data[pos + 0] = length_code + FIRST_LENGTH_CODE_INDEX;\n    values->data[pos + 1] = extra_length;\n    values->data[pos + 2] = dist_code;\n    values->data[pos + 3] = extra_distance;\n  }\n}\n\n/*3 bytes of data get encoded into two bytes. The hash cannot use more than 3\nbytes as input because 3 is the minimum match length for deflate*/\nstatic const unsigned HASH_NUM_VALUES = 65536;\nstatic const unsigned HASH_BIT_MASK = 65535; /*HASH_NUM_VALUES - 1, but C90 does not like that as initializer*/\n\ntypedef struct Hash {\n  int* head; /*hash value to head circular pos - can be outdated if went around window*/\n  /*circular pos to prev circular pos*/\n  unsigned short* chain;\n  int* val; /*circular pos to hash value*/\n\n  /*TODO: do this not only for zeros but for any repeated byte. However for PNG\n  it's always going to be the zeros that dominate, so not important for PNG*/\n  int* headz; /*similar to head, but for chainz*/\n  unsigned short* chainz; /*those with same amount of zeros*/\n  unsigned short* zeros; /*length of zeros streak, used as a second hash chain*/\n} Hash;\n\nstatic unsigned hash_init(Hash* hash, unsigned windowsize) {\n  unsigned i;\n  hash->head = (int*)lodepng_malloc(sizeof(int) * HASH_NUM_VALUES);\n  hash->val = (int*)lodepng_malloc(sizeof(int) * windowsize);\n  hash->chain = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize);\n\n  hash->zeros = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize);\n  hash->headz = (int*)lodepng_malloc(sizeof(int) * (MAX_SUPPORTED_DEFLATE_LENGTH + 1));\n  hash->chainz = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize);\n\n  if(!hash->head || !hash->chain || !hash->val  || !hash->headz|| !hash->chainz || !hash->zeros) {\n    return 83; /*alloc fail*/\n  }\n\n  /*initialize hash table*/\n  for(i = 0; i != HASH_NUM_VALUES; ++i) hash->head[i] = -1;\n  for(i = 0; i != windowsize; ++i) hash->val[i] = -1;\n  for(i = 0; i != windowsize; ++i) hash->chain[i] = i; /*same value as index indicates uninitialized*/\n\n  for(i = 0; i <= MAX_SUPPORTED_DEFLATE_LENGTH; ++i) hash->headz[i] = -1;\n  for(i = 0; i != windowsize; ++i) hash->chainz[i] = i; /*same value as index indicates uninitialized*/\n\n  return 0;\n}\n\nstatic void hash_cleanup(Hash* hash) {\n  lodepng_free(hash->head);\n  lodepng_free(hash->val);\n  lodepng_free(hash->chain);\n\n  lodepng_free(hash->zeros);\n  lodepng_free(hash->headz);\n  lodepng_free(hash->chainz);\n}\n\n\n\nstatic unsigned getHash(const unsigned char* data, size_t size, size_t pos) {\n  unsigned result = 0;\n  if(pos + 2 < size) {\n    /*A simple shift and xor hash is used. Since the data of PNGs is dominated\n    by zeroes due to the filters, a better hash does not have a significant\n    effect on speed in traversing the chain, and causes more time spend on\n    calculating the hash.*/\n    result ^= ((unsigned)data[pos + 0] << 0u);\n    result ^= ((unsigned)data[pos + 1] << 4u);\n    result ^= ((unsigned)data[pos + 2] << 8u);\n  } else {\n    size_t amount, i;\n    if(pos >= size) return 0;\n    amount = size - pos;\n    for(i = 0; i != amount; ++i) result ^= ((unsigned)data[pos + i] << (i * 8u));\n  }\n  return result & HASH_BIT_MASK;\n}\n\nstatic unsigned countZeros(const unsigned char* data, size_t size, size_t pos) {\n  const unsigned char* start = data + pos;\n  const unsigned char* end = start + MAX_SUPPORTED_DEFLATE_LENGTH;\n  if(end > data + size) end = data + size;\n  data = start;\n  while(data != end && *data == 0) ++data;\n  /*subtracting two addresses returned as 32-bit number (max value is MAX_SUPPORTED_DEFLATE_LENGTH)*/\n  return (unsigned)(data - start);\n}\n\n/*wpos = pos & (windowsize - 1)*/\nstatic void updateHashChain(Hash* hash, size_t wpos, unsigned hashval, unsigned short numzeros) {\n  hash->val[wpos] = (int)hashval;\n  if(hash->head[hashval] != -1) hash->chain[wpos] = hash->head[hashval];\n  hash->head[hashval] = (int)wpos;\n\n  hash->zeros[wpos] = numzeros;\n  if(hash->headz[numzeros] != -1) hash->chainz[wpos] = hash->headz[numzeros];\n  hash->headz[numzeros] = (int)wpos;\n}\n\n/*\nLZ77-encode the data. Return value is error code. The input are raw bytes, the output\nis in the form of unsigned integers with codes representing for example literal bytes, or\nlength/distance pairs.\nIt uses a hash table technique to let it encode faster. When doing LZ77 encoding, a\nsliding window (of windowsize) is used, and all past bytes in that window can be used as\nthe \"dictionary\". A brute force search through all possible distances would be slow, and\nthis hash technique is one out of several ways to speed this up.\n*/\nstatic unsigned encodeLZ77(uivector* out, Hash* hash,\n                           const unsigned char* in, size_t inpos, size_t insize, unsigned windowsize,\n                           unsigned minmatch, unsigned nicematch, unsigned lazymatching) {\n  size_t pos;\n  unsigned i, error = 0;\n  /*for large window lengths, assume the user wants no compression loss. Otherwise, max hash chain length speedup.*/\n  unsigned maxchainlength = windowsize >= 8192 ? windowsize : windowsize / 8u;\n  unsigned maxlazymatch = windowsize >= 8192 ? MAX_SUPPORTED_DEFLATE_LENGTH : 64;\n\n  unsigned usezeros = 1; /*not sure if setting it to false for windowsize < 8192 is better or worse*/\n  unsigned numzeros = 0;\n\n  unsigned offset; /*the offset represents the distance in LZ77 terminology*/\n  unsigned length;\n  unsigned lazy = 0;\n  unsigned lazylength = 0, lazyoffset = 0;\n  unsigned hashval;\n  unsigned current_offset, current_length;\n  unsigned prev_offset;\n  const unsigned char *lastptr, *foreptr, *backptr;\n  unsigned hashpos;\n\n  if(windowsize == 0 || windowsize > 32768) return 60; /*error: windowsize smaller/larger than allowed*/\n  if((windowsize & (windowsize - 1)) != 0) return 90; /*error: must be power of two*/\n\n  if(nicematch > MAX_SUPPORTED_DEFLATE_LENGTH) nicematch = MAX_SUPPORTED_DEFLATE_LENGTH;\n\n  for(pos = inpos; pos < insize; ++pos) {\n    size_t wpos = pos & (windowsize - 1); /*position for in 'circular' hash buffers*/\n    unsigned chainlength = 0;\n\n    hashval = getHash(in, insize, pos);\n\n    if(usezeros && hashval == 0) {\n      if(numzeros == 0) numzeros = countZeros(in, insize, pos);\n      else if(pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros;\n    } else {\n      numzeros = 0;\n    }\n\n    updateHashChain(hash, wpos, hashval, numzeros);\n\n    /*the length and offset found for the current position*/\n    length = 0;\n    offset = 0;\n\n    hashpos = hash->chain[wpos];\n\n    lastptr = &in[insize < pos + MAX_SUPPORTED_DEFLATE_LENGTH ? insize : pos + MAX_SUPPORTED_DEFLATE_LENGTH];\n\n    /*search for the longest string*/\n    prev_offset = 0;\n    for(;;) {\n      if(chainlength++ >= maxchainlength) break;\n      current_offset = (unsigned)(hashpos <= wpos ? wpos - hashpos : wpos - hashpos + windowsize);\n\n      if(current_offset < prev_offset) break; /*stop when went completely around the circular buffer*/\n      prev_offset = current_offset;\n      if(current_offset > 0) {\n        /*test the next characters*/\n        foreptr = &in[pos];\n        backptr = &in[pos - current_offset];\n\n        /*common case in PNGs is lots of zeros. Quickly skip over them as a speedup*/\n        if(numzeros >= 3) {\n          unsigned skip = hash->zeros[hashpos];\n          if(skip > numzeros) skip = numzeros;\n          backptr += skip;\n          foreptr += skip;\n        }\n\n        while(foreptr != lastptr && *backptr == *foreptr) /*maximum supported length by deflate is max length*/ {\n          ++backptr;\n          ++foreptr;\n        }\n        current_length = (unsigned)(foreptr - &in[pos]);\n\n        if(current_length > length) {\n          length = current_length; /*the longest length*/\n          offset = current_offset; /*the offset that is related to this longest length*/\n          /*jump out once a length of max length is found (speed gain). This also jumps\n          out if length is MAX_SUPPORTED_DEFLATE_LENGTH*/\n          if(current_length >= nicematch) break;\n        }\n      }\n\n      if(hashpos == hash->chain[hashpos]) break;\n\n      if(numzeros >= 3 && length > numzeros) {\n        hashpos = hash->chainz[hashpos];\n        if(hash->zeros[hashpos] != numzeros) break;\n      } else {\n        hashpos = hash->chain[hashpos];\n        /*outdated hash value, happens if particular value was not encountered in whole last window*/\n        if(hash->val[hashpos] != (int)hashval) break;\n      }\n    }\n\n    if(lazymatching) {\n      if(!lazy && length >= 3 && length <= maxlazymatch && length < MAX_SUPPORTED_DEFLATE_LENGTH) {\n        lazy = 1;\n        lazylength = length;\n        lazyoffset = offset;\n        continue; /*try the next byte*/\n      }\n      if(lazy) {\n        lazy = 0;\n        if(pos == 0) ERROR_BREAK(81);\n        if(length > lazylength + 1) {\n          /*push the previous character as literal*/\n          if(!uivector_push_back(out, in[pos - 1])) ERROR_BREAK(83 /*alloc fail*/);\n        } else {\n          length = lazylength;\n          offset = lazyoffset;\n          hash->head[hashval] = -1; /*the same hashchain update will be done, this ensures no wrong alteration*/\n          hash->headz[numzeros] = -1; /*idem*/\n          --pos;\n        }\n      }\n    }\n    if(length >= 3 && offset > windowsize) ERROR_BREAK(86 /*too big (or overflown negative) offset*/);\n\n    /*encode it as length/distance pair or literal value*/\n    if(length < 3) /*only lengths of 3 or higher are supported as length/distance pair*/ {\n      if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/);\n    } else if(length < minmatch || (length == 3 && offset > 4096)) {\n      /*compensate for the fact that longer offsets have more extra bits, a\n      length of only 3 may be not worth it then*/\n      if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/);\n    } else {\n      addLengthDistance(out, length, offset);\n      for(i = 1; i < length; ++i) {\n        ++pos;\n        wpos = pos & (windowsize - 1);\n        hashval = getHash(in, insize, pos);\n        if(usezeros && hashval == 0) {\n          if(numzeros == 0) numzeros = countZeros(in, insize, pos);\n          else if(pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros;\n        } else {\n          numzeros = 0;\n        }\n        updateHashChain(hash, wpos, hashval, numzeros);\n      }\n    }\n  } /*end of the loop through each character of input*/\n\n  return error;\n}\n\n/* /////////////////////////////////////////////////////////////////////////// */\n\nstatic unsigned deflateNoCompression(ucvector* out, const unsigned char* data, size_t datasize) {\n  /*non compressed deflate block data: 1 bit BFINAL,2 bits BTYPE,(5 bits): it jumps to start of next byte,\n  2 bytes LEN, 2 bytes NLEN, LEN bytes literal DATA*/\n\n  size_t i, numdeflateblocks = (datasize + 65534u) / 65535u;\n  unsigned datapos = 0;\n  for(i = 0; i != numdeflateblocks; ++i) {\n    unsigned BFINAL, BTYPE, LEN, NLEN;\n    unsigned char firstbyte;\n    size_t pos = out->size;\n\n    BFINAL = (i == numdeflateblocks - 1);\n    BTYPE = 0;\n\n    LEN = 65535;\n    if(datasize - datapos < 65535u) LEN = (unsigned)datasize - datapos;\n    NLEN = 65535 - LEN;\n\n    if(!ucvector_resize(out, out->size + LEN + 5)) return 83; /*alloc fail*/\n\n    firstbyte = (unsigned char)(BFINAL + ((BTYPE & 1u) << 1u) + ((BTYPE & 2u) << 1u));\n    out->data[pos + 0] = firstbyte;\n    out->data[pos + 1] = (unsigned char)(LEN & 255);\n    out->data[pos + 2] = (unsigned char)(LEN >> 8u);\n    out->data[pos + 3] = (unsigned char)(NLEN & 255);\n    out->data[pos + 4] = (unsigned char)(NLEN >> 8u);\n    lodepng_memcpy(out->data + pos + 5, data + datapos, LEN);\n    datapos += LEN;\n  }\n\n  return 0;\n}\n\n/*\nwrite the lz77-encoded data, which has lit, len and dist codes, to compressed stream using huffman trees.\ntree_ll: the tree for lit and len codes.\ntree_d: the tree for distance codes.\n*/\nstatic void writeLZ77data(LodePNGBitWriter* writer, const uivector* lz77_encoded,\n                          const HuffmanTree* tree_ll, const HuffmanTree* tree_d) {\n  size_t i = 0;\n  for(i = 0; i != lz77_encoded->size; ++i) {\n    unsigned val = lz77_encoded->data[i];\n    writeBitsReversed(writer, tree_ll->codes[val], tree_ll->lengths[val]);\n    if(val > 256) /*for a length code, 3 more things have to be added*/ {\n      unsigned length_index = val - FIRST_LENGTH_CODE_INDEX;\n      unsigned n_length_extra_bits = LENGTHEXTRA[length_index];\n      unsigned length_extra_bits = lz77_encoded->data[++i];\n\n      unsigned distance_code = lz77_encoded->data[++i];\n\n      unsigned distance_index = distance_code;\n      unsigned n_distance_extra_bits = DISTANCEEXTRA[distance_index];\n      unsigned distance_extra_bits = lz77_encoded->data[++i];\n\n      writeBits(writer, length_extra_bits, n_length_extra_bits);\n      writeBitsReversed(writer, tree_d->codes[distance_code], tree_d->lengths[distance_code]);\n      writeBits(writer, distance_extra_bits, n_distance_extra_bits);\n    }\n  }\n}\n\n/*Deflate for a block of type \"dynamic\", that is, with freely, optimally, created huffman trees*/\nstatic unsigned deflateDynamic(LodePNGBitWriter* writer, Hash* hash,\n                               const unsigned char* data, size_t datapos, size_t dataend,\n                               const LodePNGCompressSettings* settings, unsigned final) {\n  unsigned error = 0;\n\n  /*\n  A block is compressed as follows: The PNG data is lz77 encoded, resulting in\n  literal bytes and length/distance pairs. This is then huffman compressed with\n  two huffman trees. One huffman tree is used for the lit and len values (\"ll\"),\n  another huffman tree is used for the dist values (\"d\"). These two trees are\n  stored using their code lengths, and to compress even more these code lengths\n  are also run-length encoded and huffman compressed. This gives a huffman tree\n  of code lengths \"cl\". The code lengths used to describe this third tree are\n  the code length code lengths (\"clcl\").\n  */\n\n  /*The lz77 encoded data, represented with integers since there will also be length and distance codes in it*/\n  uivector lz77_encoded;\n  HuffmanTree tree_ll; /*tree for lit,len values*/\n  HuffmanTree tree_d; /*tree for distance codes*/\n  HuffmanTree tree_cl; /*tree for encoding the code lengths representing tree_ll and tree_d*/\n  unsigned* frequencies_ll = 0; /*frequency of lit,len codes*/\n  unsigned* frequencies_d = 0; /*frequency of dist codes*/\n  unsigned* frequencies_cl = 0; /*frequency of code length codes*/\n  unsigned* bitlen_lld = 0; /*lit,len,dist code lengths (int bits), literally (without repeat codes).*/\n  unsigned* bitlen_lld_e = 0; /*bitlen_lld encoded with repeat codes (this is a rudimentary run length compression)*/\n  size_t datasize = dataend - datapos;\n\n  /*\n  If we could call \"bitlen_cl\" the the code length code lengths (\"clcl\"), that is the bit lengths of codes to represent\n  tree_cl in CLCL_ORDER, then due to the huffman compression of huffman tree representations (\"two levels\"), there are\n  some analogies:\n  bitlen_lld is to tree_cl what data is to tree_ll and tree_d.\n  bitlen_lld_e is to bitlen_lld what lz77_encoded is to data.\n  bitlen_cl is to bitlen_lld_e what bitlen_lld is to lz77_encoded.\n  */\n\n  unsigned BFINAL = final;\n  size_t i;\n  size_t numcodes_ll, numcodes_d, numcodes_lld, numcodes_lld_e, numcodes_cl;\n  unsigned HLIT, HDIST, HCLEN;\n\n  uivector_init(&lz77_encoded);\n  HuffmanTree_init(&tree_ll);\n  HuffmanTree_init(&tree_d);\n  HuffmanTree_init(&tree_cl);\n  /* could fit on stack, but >1KB is on the larger side so allocate instead */\n  frequencies_ll = (unsigned*)lodepng_malloc(286 * sizeof(*frequencies_ll));\n  frequencies_d = (unsigned*)lodepng_malloc(30 * sizeof(*frequencies_d));\n  frequencies_cl = (unsigned*)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(*frequencies_cl));\n\n  if(!frequencies_ll || !frequencies_d || !frequencies_cl) error = 83; /*alloc fail*/\n\n  /*This while loop never loops due to a break at the end, it is here to\n  allow breaking out of it to the cleanup phase on error conditions.*/\n  while(!error) {\n    lodepng_memset(frequencies_ll, 0, 286 * sizeof(*frequencies_ll));\n    lodepng_memset(frequencies_d, 0, 30 * sizeof(*frequencies_d));\n    lodepng_memset(frequencies_cl, 0, NUM_CODE_LENGTH_CODES * sizeof(*frequencies_cl));\n\n    if(settings->use_lz77) {\n      error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize,\n                         settings->minmatch, settings->nicematch, settings->lazymatching);\n      if(error) break;\n    } else {\n      if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83 /*alloc fail*/);\n      for(i = datapos; i < dataend; ++i) lz77_encoded.data[i - datapos] = data[i]; /*no LZ77, but still will be Huffman compressed*/\n    }\n\n    /*Count the frequencies of lit, len and dist codes*/\n    for(i = 0; i != lz77_encoded.size; ++i) {\n      unsigned symbol = lz77_encoded.data[i];\n      ++frequencies_ll[symbol];\n      if(symbol > 256) {\n        unsigned dist = lz77_encoded.data[i + 2];\n        ++frequencies_d[dist];\n        i += 3;\n      }\n    }\n    frequencies_ll[256] = 1; /*there will be exactly 1 end code, at the end of the block*/\n\n    /*Make both huffman trees, one for the lit and len codes, one for the dist codes*/\n    error = HuffmanTree_makeFromFrequencies(&tree_ll, frequencies_ll, 257, 286, 15);\n    if(error) break;\n    /*2, not 1, is chosen for mincodes: some buggy PNG decoders require at least 2 symbols in the dist tree*/\n    error = HuffmanTree_makeFromFrequencies(&tree_d, frequencies_d, 2, 30, 15);\n    if(error) break;\n\n    numcodes_ll = LODEPNG_MIN(tree_ll.numcodes, 286);\n    numcodes_d = LODEPNG_MIN(tree_d.numcodes, 30);\n    /*store the code lengths of both generated trees in bitlen_lld*/\n    numcodes_lld = numcodes_ll + numcodes_d;\n    bitlen_lld = (unsigned*)lodepng_malloc(numcodes_lld * sizeof(*bitlen_lld));\n    /*numcodes_lld_e never needs more size than bitlen_lld*/\n    bitlen_lld_e = (unsigned*)lodepng_malloc(numcodes_lld * sizeof(*bitlen_lld_e));\n    if(!bitlen_lld || !bitlen_lld_e) ERROR_BREAK(83); /*alloc fail*/\n    numcodes_lld_e = 0;\n\n    for(i = 0; i != numcodes_ll; ++i) bitlen_lld[i] = tree_ll.lengths[i];\n    for(i = 0; i != numcodes_d; ++i) bitlen_lld[numcodes_ll + i] = tree_d.lengths[i];\n\n    /*run-length compress bitlen_ldd into bitlen_lld_e by using repeat codes 16 (copy length 3-6 times),\n    17 (3-10 zeroes), 18 (11-138 zeroes)*/\n    for(i = 0; i != numcodes_lld; ++i) {\n      unsigned j = 0; /*amount of repetitions*/\n      while(i + j + 1 < numcodes_lld && bitlen_lld[i + j + 1] == bitlen_lld[i]) ++j;\n\n      if(bitlen_lld[i] == 0 && j >= 2) /*repeat code for zeroes*/ {\n        ++j; /*include the first zero*/\n        if(j <= 10) /*repeat code 17 supports max 10 zeroes*/ {\n          bitlen_lld_e[numcodes_lld_e++] = 17;\n          bitlen_lld_e[numcodes_lld_e++] = j - 3;\n        } else /*repeat code 18 supports max 138 zeroes*/ {\n          if(j > 138) j = 138;\n          bitlen_lld_e[numcodes_lld_e++] = 18;\n          bitlen_lld_e[numcodes_lld_e++] = j - 11;\n        }\n        i += (j - 1);\n      } else if(j >= 3) /*repeat code for value other than zero*/ {\n        size_t k;\n        unsigned num = j / 6u, rest = j % 6u;\n        bitlen_lld_e[numcodes_lld_e++] = bitlen_lld[i];\n        for(k = 0; k < num; ++k) {\n          bitlen_lld_e[numcodes_lld_e++] = 16;\n          bitlen_lld_e[numcodes_lld_e++] = 6 - 3;\n        }\n        if(rest >= 3) {\n          bitlen_lld_e[numcodes_lld_e++] = 16;\n          bitlen_lld_e[numcodes_lld_e++] = rest - 3;\n        }\n        else j -= rest;\n        i += j;\n      } else /*too short to benefit from repeat code*/ {\n        bitlen_lld_e[numcodes_lld_e++] = bitlen_lld[i];\n      }\n    }\n\n    /*generate tree_cl, the huffmantree of huffmantrees*/\n    for(i = 0; i != numcodes_lld_e; ++i) {\n      ++frequencies_cl[bitlen_lld_e[i]];\n      /*after a repeat code come the bits that specify the number of repetitions,\n      those don't need to be in the frequencies_cl calculation*/\n      if(bitlen_lld_e[i] >= 16) ++i;\n    }\n\n    error = HuffmanTree_makeFromFrequencies(&tree_cl, frequencies_cl,\n                                            NUM_CODE_LENGTH_CODES, NUM_CODE_LENGTH_CODES, 7);\n    if(error) break;\n\n    /*compute amount of code-length-code-lengths to output*/\n    numcodes_cl = NUM_CODE_LENGTH_CODES;\n    /*trim zeros at the end (using CLCL_ORDER), but minimum size must be 4 (see HCLEN below)*/\n    while(numcodes_cl > 4u && tree_cl.lengths[CLCL_ORDER[numcodes_cl - 1u]] == 0) {\n      numcodes_cl--;\n    }\n\n    /*\n    Write everything into the output\n\n    After the BFINAL and BTYPE, the dynamic block consists out of the following:\n    - 5 bits HLIT, 5 bits HDIST, 4 bits HCLEN\n    - (HCLEN+4)*3 bits code lengths of code length alphabet\n    - HLIT + 257 code lengths of lit/length alphabet (encoded using the code length\n      alphabet, + possible repetition codes 16, 17, 18)\n    - HDIST + 1 code lengths of distance alphabet (encoded using the code length\n      alphabet, + possible repetition codes 16, 17, 18)\n    - compressed data\n    - 256 (end code)\n    */\n\n    /*Write block type*/\n    writeBits(writer, BFINAL, 1);\n    writeBits(writer, 0, 1); /*first bit of BTYPE \"dynamic\"*/\n    writeBits(writer, 1, 1); /*second bit of BTYPE \"dynamic\"*/\n\n    /*write the HLIT, HDIST and HCLEN values*/\n    /*all three sizes take trimmed ending zeroes into account, done either by HuffmanTree_makeFromFrequencies\n    or in the loop for numcodes_cl above, which saves space. */\n    HLIT = (unsigned)(numcodes_ll - 257);\n    HDIST = (unsigned)(numcodes_d - 1);\n    HCLEN = (unsigned)(numcodes_cl - 4);\n    writeBits(writer, HLIT, 5);\n    writeBits(writer, HDIST, 5);\n    writeBits(writer, HCLEN, 4);\n\n    /*write the code lengths of the code length alphabet (\"bitlen_cl\")*/\n    for(i = 0; i != numcodes_cl; ++i) writeBits(writer, tree_cl.lengths[CLCL_ORDER[i]], 3);\n\n    /*write the lengths of the lit/len AND the dist alphabet*/\n    for(i = 0; i != numcodes_lld_e; ++i) {\n      writeBitsReversed(writer, tree_cl.codes[bitlen_lld_e[i]], tree_cl.lengths[bitlen_lld_e[i]]);\n      /*extra bits of repeat codes*/\n      if(bitlen_lld_e[i] == 16) writeBits(writer, bitlen_lld_e[++i], 2);\n      else if(bitlen_lld_e[i] == 17) writeBits(writer, bitlen_lld_e[++i], 3);\n      else if(bitlen_lld_e[i] == 18) writeBits(writer, bitlen_lld_e[++i], 7);\n    }\n\n    /*write the compressed data symbols*/\n    writeLZ77data(writer, &lz77_encoded, &tree_ll, &tree_d);\n    /*error: the length of the end code 256 must be larger than 0*/\n    if(tree_ll.lengths[256] == 0) ERROR_BREAK(64);\n\n    /*write the end code*/\n    writeBitsReversed(writer, tree_ll.codes[256], tree_ll.lengths[256]);\n\n    break; /*end of error-while*/\n  }\n\n  /*cleanup*/\n  uivector_cleanup(&lz77_encoded);\n  HuffmanTree_cleanup(&tree_ll);\n  HuffmanTree_cleanup(&tree_d);\n  HuffmanTree_cleanup(&tree_cl);\n  lodepng_free(frequencies_ll);\n  lodepng_free(frequencies_d);\n  lodepng_free(frequencies_cl);\n  lodepng_free(bitlen_lld);\n  lodepng_free(bitlen_lld_e);\n\n  return error;\n}\n\nstatic unsigned deflateFixed(LodePNGBitWriter* writer, Hash* hash,\n                             const unsigned char* data,\n                             size_t datapos, size_t dataend,\n                             const LodePNGCompressSettings* settings, unsigned final) {\n  HuffmanTree tree_ll; /*tree for literal values and length codes*/\n  HuffmanTree tree_d; /*tree for distance codes*/\n\n  unsigned BFINAL = final;\n  unsigned error = 0;\n  size_t i;\n\n  HuffmanTree_init(&tree_ll);\n  HuffmanTree_init(&tree_d);\n\n  error = generateFixedLitLenTree(&tree_ll);\n  if(!error) error = generateFixedDistanceTree(&tree_d);\n\n  if(!error) {\n    writeBits(writer, BFINAL, 1);\n    writeBits(writer, 1, 1); /*first bit of BTYPE*/\n    writeBits(writer, 0, 1); /*second bit of BTYPE*/\n\n    if(settings->use_lz77) /*LZ77 encoded*/ {\n      uivector lz77_encoded;\n      uivector_init(&lz77_encoded);\n      error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize,\n                         settings->minmatch, settings->nicematch, settings->lazymatching);\n      if(!error) writeLZ77data(writer, &lz77_encoded, &tree_ll, &tree_d);\n      uivector_cleanup(&lz77_encoded);\n    } else /*no LZ77, but still will be Huffman compressed*/ {\n      for(i = datapos; i < dataend; ++i) {\n        writeBitsReversed(writer, tree_ll.codes[data[i]], tree_ll.lengths[data[i]]);\n      }\n    }\n    /*add END code*/\n    if(!error) writeBitsReversed(writer,tree_ll.codes[256], tree_ll.lengths[256]);\n  }\n\n  /*cleanup*/\n  HuffmanTree_cleanup(&tree_ll);\n  HuffmanTree_cleanup(&tree_d);\n\n  return error;\n}\n\nstatic unsigned lodepng_deflatev(ucvector* out, const unsigned char* in, size_t insize,\n                                 const LodePNGCompressSettings* settings) {\n  unsigned error = 0;\n  size_t i, blocksize, numdeflateblocks;\n  Hash hash;\n  LodePNGBitWriter writer;\n\n  LodePNGBitWriter_init(&writer, out);\n\n  if(settings->btype > 2) return 61;\n  else if(settings->btype == 0) return deflateNoCompression(out, in, insize);\n  else if(settings->btype == 1) blocksize = insize;\n  else /*if(settings->btype == 2)*/ {\n    /*on PNGs, deflate blocks of 65-262k seem to give most dense encoding*/\n    blocksize = insize / 8u + 8;\n    if(blocksize < 65536) blocksize = 65536;\n    if(blocksize > 262144) blocksize = 262144;\n  }\n\n  numdeflateblocks = (insize + blocksize - 1) / blocksize;\n  if(numdeflateblocks == 0) numdeflateblocks = 1;\n\n  error = hash_init(&hash, settings->windowsize);\n\n  if(!error) {\n    for(i = 0; i != numdeflateblocks && !error; ++i) {\n      unsigned final = (i == numdeflateblocks - 1);\n      size_t start = i * blocksize;\n      size_t end = start + blocksize;\n      if(end > insize) end = insize;\n\n      if(settings->btype == 1) error = deflateFixed(&writer, &hash, in, start, end, settings, final);\n      else if(settings->btype == 2) error = deflateDynamic(&writer, &hash, in, start, end, settings, final);\n    }\n  }\n\n  hash_cleanup(&hash);\n\n  return error;\n}\n\nunsigned lodepng_deflate(unsigned char** out, size_t* outsize,\n                         const unsigned char* in, size_t insize,\n                         const LodePNGCompressSettings* settings) {\n  ucvector v = ucvector_init(*out, *outsize);\n  unsigned error = lodepng_deflatev(&v, in, insize, settings);\n  *out = v.data;\n  *outsize = v.size;\n  return error;\n}\n\nstatic unsigned deflate(unsigned char** out, size_t* outsize,\n                        const unsigned char* in, size_t insize,\n                        const LodePNGCompressSettings* settings) {\n  if(settings->custom_deflate) {\n    unsigned error = settings->custom_deflate(out, outsize, in, insize, settings);\n    /*the custom deflate is allowed to have its own error codes, however, we translate it to code 111*/\n    return error ? 111 : 0;\n  } else {\n    return lodepng_deflate(out, outsize, in, insize, settings);\n  }\n}\n\n#endif /*LODEPNG_COMPILE_DECODER*/\n\n/* ////////////////////////////////////////////////////////////////////////// */\n/* / Adler32                                                                / */\n/* ////////////////////////////////////////////////////////////////////////// */\n\nstatic unsigned update_adler32(unsigned adler, const unsigned char* data, unsigned len) {\n  unsigned s1 = adler & 0xffffu;\n  unsigned s2 = (adler >> 16u) & 0xffffu;\n\n  while(len != 0u) {\n    unsigned i;\n    /*at least 5552 sums can be done before the sums overflow, saving a lot of module divisions*/\n    unsigned amount = len > 5552u ? 5552u : len;\n    len -= amount;\n    for(i = 0; i != amount; ++i) {\n      s1 += (*data++);\n      s2 += s1;\n    }\n    s1 %= 65521u;\n    s2 %= 65521u;\n  }\n\n  return (s2 << 16u) | s1;\n}\n\n/*Return the adler32 of the bytes data[0..len-1]*/\nstatic unsigned adler32(const unsigned char* data, unsigned len) {\n  return update_adler32(1u, data, len);\n}\n\n/* ////////////////////////////////////////////////////////////////////////// */\n/* / Zlib                                                                   / */\n/* ////////////////////////////////////////////////////////////////////////// */\n\n#ifdef LODEPNG_COMPILE_DECODER\n\nstatic unsigned lodepng_zlib_decompressv(ucvector* out,\n                                         const unsigned char* in, size_t insize,\n                                         const LodePNGDecompressSettings* settings) {\n  unsigned error = 0;\n  unsigned CM, CINFO, FDICT;\n\n  if(insize < 2) return 53; /*error, size of zlib data too small*/\n  /*read information from zlib header*/\n  if((in[0] * 256 + in[1]) % 31 != 0) {\n    /*error: 256 * in[0] + in[1] must be a multiple of 31, the FCHECK value is supposed to be made that way*/\n    return 24;\n  }\n\n  CM = in[0] & 15;\n  CINFO = (in[0] >> 4) & 15;\n  /*FCHECK = in[1] & 31;*/ /*FCHECK is already tested above*/\n  FDICT = (in[1] >> 5) & 1;\n  /*FLEVEL = (in[1] >> 6) & 3;*/ /*FLEVEL is not used here*/\n\n  if(CM != 8 || CINFO > 7) {\n    /*error: only compression method 8: inflate with sliding window of 32k is supported by the PNG spec*/\n    return 25;\n  }\n  if(FDICT != 0) {\n    /*error: the specification of PNG says about the zlib stream:\n      \"The additional flags shall not specify a preset dictionary.\"*/\n    return 26;\n  }\n\n  error = inflatev(out, in + 2, insize - 2, settings);\n  if(error) return error;\n\n  if(!settings->ignore_adler32) {\n    unsigned ADLER32 = lodepng_read32bitInt(&in[insize - 4]);\n    unsigned checksum = adler32(out->data, (unsigned)(out->size));\n    if(checksum != ADLER32) return 58; /*error, adler checksum not correct, data must be corrupted*/\n  }\n\n  return 0; /*no error*/\n}\n\n\nunsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in,\n                                 size_t insize, const LodePNGDecompressSettings* settings) {\n  ucvector v = ucvector_init(*out, *outsize);\n  unsigned error = lodepng_zlib_decompressv(&v, in, insize, settings);\n  *out = v.data;\n  *outsize = v.size;\n  return error;\n}\n\n/*expected_size is expected output size, to avoid intermediate allocations. Set to 0 if not known. */\nstatic unsigned zlib_decompress(unsigned char** out, size_t* outsize, size_t expected_size,\n                                const unsigned char* in, size_t insize, const LodePNGDecompressSettings* settings) {\n  unsigned error;\n  if(settings->custom_zlib) {\n    error = settings->custom_zlib(out, outsize, in, insize, settings);\n    if(error) {\n      /*the custom zlib is allowed to have its own error codes, however, we translate it to code 110*/\n      error = 110;\n      /*if there's a max output size, and the custom zlib returned error, then indicate that error instead*/\n      if(settings->max_output_size && *outsize > settings->max_output_size) error = 109;\n    }\n  } else {\n    ucvector v = ucvector_init(*out, *outsize);\n    if(expected_size) {\n      /*reserve the memory to avoid intermediate reallocations*/\n      ucvector_resize(&v, *outsize + expected_size);\n      v.size = *outsize;\n    }\n    error = lodepng_zlib_decompressv(&v, in, insize, settings);\n    *out = v.data;\n    *outsize = v.size;\n  }\n  return error;\n}\n\n#endif /*LODEPNG_COMPILE_DECODER*/\n\n#ifdef LODEPNG_COMPILE_ENCODER\n\nunsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in,\n                               size_t insize, const LodePNGCompressSettings* settings) {\n  size_t i;\n  unsigned error;\n  unsigned char* deflatedata = 0;\n  size_t deflatesize = 0;\n\n  error = deflate(&deflatedata, &deflatesize, in, insize, settings);\n\n  *out = NULL;\n  *outsize = 0;\n  if(!error) {\n    *outsize = deflatesize + 6;\n    *out = (unsigned char*)lodepng_malloc(*outsize);\n    if(!*out) error = 83; /*alloc fail*/\n  }\n\n  if(!error) {\n    unsigned ADLER32 = adler32(in, (unsigned)insize);\n    /*zlib data: 1 byte CMF (CM+CINFO), 1 byte FLG, deflate data, 4 byte ADLER32 checksum of the Decompressed data*/\n    unsigned CMF = 120; /*0b01111000: CM 8, CINFO 7. With CINFO 7, any window size up to 32768 can be used.*/\n    unsigned FLEVEL = 0;\n    unsigned FDICT = 0;\n    unsigned CMFFLG = 256 * CMF + FDICT * 32 + FLEVEL * 64;\n    unsigned FCHECK = 31 - CMFFLG % 31;\n    CMFFLG += FCHECK;\n\n    (*out)[0] = (unsigned char)(CMFFLG >> 8);\n    (*out)[1] = (unsigned char)(CMFFLG & 255);\n    for(i = 0; i != deflatesize; ++i) (*out)[i + 2] = deflatedata[i];\n    lodepng_set32bitInt(&(*out)[*outsize - 4], ADLER32);\n  }\n\n  lodepng_free(deflatedata);\n  return error;\n}\n\n/* compress using the default or custom zlib function */\nstatic unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in,\n                              size_t insize, const LodePNGCompressSettings* settings) {\n  if(settings->custom_zlib) {\n    unsigned error = settings->custom_zlib(out, outsize, in, insize, settings);\n    /*the custom zlib is allowed to have its own error codes, however, we translate it to code 111*/\n    return error ? 111 : 0;\n  } else {\n    return lodepng_zlib_compress(out, outsize, in, insize, settings);\n  }\n}\n\n#endif /*LODEPNG_COMPILE_ENCODER*/\n\n#else /*no LODEPNG_COMPILE_ZLIB*/\n\n#ifdef LODEPNG_COMPILE_DECODER\nstatic unsigned zlib_decompress(unsigned char** out, size_t* outsize, size_t expected_size,\n                                const unsigned char* in, size_t insize, const LodePNGDecompressSettings* settings) {\n  if(!settings->custom_zlib) return 87; /*no custom zlib function provided */\n  (void)expected_size;\n  return settings->custom_zlib(out, outsize, in, insize, settings);\n}\n#endif /*LODEPNG_COMPILE_DECODER*/\n#ifdef LODEPNG_COMPILE_ENCODER\nstatic unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in,\n                              size_t insize, const LodePNGCompressSettings* settings) {\n  if(!settings->custom_zlib) return 87; /*no custom zlib function provided */\n  return settings->custom_zlib(out, outsize, in, insize, settings);\n}\n#endif /*LODEPNG_COMPILE_ENCODER*/\n\n#endif /*LODEPNG_COMPILE_ZLIB*/\n\n/* ////////////////////////////////////////////////////////////////////////// */\n\n#ifdef LODEPNG_COMPILE_ENCODER\n\n/*this is a good tradeoff between speed and compression ratio*/\n#define DEFAULT_WINDOWSIZE 2048\n\nvoid lodepng_compress_settings_init(LodePNGCompressSettings* settings) {\n  /*compress with dynamic huffman tree (not in the mathematical sense, just not the predefined one)*/\n  settings->btype = 2;\n  settings->use_lz77 = 1;\n  settings->windowsize = DEFAULT_WINDOWSIZE;\n  settings->minmatch = 3;\n  settings->nicematch = 128;\n  settings->lazymatching = 1;\n\n  settings->custom_zlib = 0;\n  settings->custom_deflate = 0;\n  settings->custom_context = 0;\n}\n\nconst LodePNGCompressSettings lodepng_default_compress_settings = {2, 1, DEFAULT_WINDOWSIZE, 3, 128, 1, 0, 0, 0};\n\n\n#endif /*LODEPNG_COMPILE_ENCODER*/\n\n#ifdef LODEPNG_COMPILE_DECODER\n\nvoid lodepng_decompress_settings_init(LodePNGDecompressSettings* settings) {\n  settings->ignore_adler32 = 0;\n  settings->ignore_nlen = 0;\n  settings->max_output_size = 0;\n\n  settings->custom_zlib = 0;\n  settings->custom_inflate = 0;\n  settings->custom_context = 0;\n}\n\nconst LodePNGDecompressSettings lodepng_default_decompress_settings = {0, 0, 0, 0, 0, 0};\n\n#endif /*LODEPNG_COMPILE_DECODER*/\n\n/* ////////////////////////////////////////////////////////////////////////// */\n/* ////////////////////////////////////////////////////////////////////////// */\n/* // End of Zlib related code. Begin of PNG related code.                 // */\n/* ////////////////////////////////////////////////////////////////////////// */\n/* ////////////////////////////////////////////////////////////////////////// */\n\n#ifdef LODEPNG_COMPILE_PNG\n\n/* ////////////////////////////////////////////////////////////////////////// */\n/* / CRC32                                                                  / */\n/* ////////////////////////////////////////////////////////////////////////// */\n\n\n#ifndef LODEPNG_NO_COMPILE_CRC\n/* CRC polynomial: 0xedb88320 */\nstatic unsigned lodepng_crc32_table[256] = {\n           0u, 1996959894u, 3993919788u, 2567524794u,  124634137u, 1886057615u, 3915621685u, 2657392035u,\n   249268274u, 2044508324u, 3772115230u, 2547177864u,  162941995u, 2125561021u, 3887607047u, 2428444049u,\n   498536548u, 1789927666u, 4089016648u, 2227061214u,  450548861u, 1843258603u, 4107580753u, 2211677639u,\n   325883990u, 1684777152u, 4251122042u, 2321926636u,  335633487u, 1661365465u, 4195302755u, 2366115317u,\n   997073096u, 1281953886u, 3579855332u, 2724688242u, 1006888145u, 1258607687u, 3524101629u, 2768942443u,\n   901097722u, 1119000684u, 3686517206u, 2898065728u,  853044451u, 1172266101u, 3705015759u, 2882616665u,\n   651767980u, 1373503546u, 3369554304u, 3218104598u,  565507253u, 1454621731u, 3485111705u, 3099436303u,\n   671266974u, 1594198024u, 3322730930u, 2970347812u,  795835527u, 1483230225u, 3244367275u, 3060149565u,\n  1994146192u,   31158534u, 2563907772u, 4023717930u, 1907459465u,  112637215u, 2680153253u, 3904427059u,\n  2013776290u,  251722036u, 2517215374u, 3775830040u, 2137656763u,  141376813u, 2439277719u, 3865271297u,\n  1802195444u,  476864866u, 2238001368u, 4066508878u, 1812370925u,  453092731u, 2181625025u, 4111451223u,\n  1706088902u,  314042704u, 2344532202u, 4240017532u, 1658658271u,  366619977u, 2362670323u, 4224994405u,\n  1303535960u,  984961486u, 2747007092u, 3569037538u, 1256170817u, 1037604311u, 2765210733u, 3554079995u,\n  1131014506u,  879679996u, 2909243462u, 3663771856u, 1141124467u,  855842277u, 2852801631u, 3708648649u,\n  1342533948u,  654459306u, 3188396048u, 3373015174u, 1466479909u,  544179635u, 3110523913u, 3462522015u,\n  1591671054u,  702138776u, 2966460450u, 3352799412u, 1504918807u,  783551873u, 3082640443u, 3233442989u,\n  3988292384u, 2596254646u,   62317068u, 1957810842u, 3939845945u, 2647816111u,   81470997u, 1943803523u,\n  3814918930u, 2489596804u,  225274430u, 2053790376u, 3826175755u, 2466906013u,  167816743u, 2097651377u,\n  4027552580u, 2265490386u,  503444072u, 1762050814u, 4150417245u, 2154129355u,  426522225u, 1852507879u,\n  4275313526u, 2312317920u,  282753626u, 1742555852u, 4189708143u, 2394877945u,  397917763u, 1622183637u,\n  3604390888u, 2714866558u,  953729732u, 1340076626u, 3518719985u, 2797360999u, 1068828381u, 1219638859u,\n  3624741850u, 2936675148u,  906185462u, 1090812512u, 3747672003u, 2825379669u,  829329135u, 1181335161u,\n  3412177804u, 3160834842u,  628085408u, 1382605366u, 3423369109u, 3138078467u,  570562233u, 1426400815u,\n  3317316542u, 2998733608u,  733239954u, 1555261956u, 3268935591u, 3050360625u,  752459403u, 1541320221u,\n  2607071920u, 3965973030u, 1969922972u,   40735498u, 2617837225u, 3943577151u, 1913087877u,   83908371u,\n  2512341634u, 3803740692u, 2075208622u,  213261112u, 2463272603u, 3855990285u, 2094854071u,  198958881u,\n  2262029012u, 4057260610u, 1759359992u,  534414190u, 2176718541u, 4139329115u, 1873836001u,  414664567u,\n  2282248934u, 4279200368u, 1711684554u,  285281116u, 2405801727u, 4167216745u, 1634467795u,  376229701u,\n  2685067896u, 3608007406u, 1308918612u,  956543938u, 2808555105u, 3495958263u, 1231636301u, 1047427035u,\n  2932959818u, 3654703836u, 1088359270u,  936918000u, 2847714899u, 3736837829u, 1202900863u,  817233897u,\n  3183342108u, 3401237130u, 1404277552u,  615818150u, 3134207493u, 3453421203u, 1423857449u,  601450431u,\n  3009837614u, 3294710456u, 1567103746u,  711928724u, 3020668471u, 3272380065u, 1510334235u,  755167117u\n};\n\n/*Return the CRC of the bytes buf[0..len-1].*/\nunsigned lodepng_crc32(const unsigned char* data, size_t length) {\n  unsigned r = 0xffffffffu;\n  size_t i;\n  for(i = 0; i < length; ++i) {\n    r = lodepng_crc32_table[(r ^ data[i]) & 0xffu] ^ (r >> 8u);\n  }\n  return r ^ 0xffffffffu;\n}\n#else /* !LODEPNG_NO_COMPILE_CRC */\nunsigned lodepng_crc32(const unsigned char* data, size_t length);\n#endif /* !LODEPNG_NO_COMPILE_CRC */\n\n/* ////////////////////////////////////////////////////////////////////////// */\n/* / Reading and writing PNG color channel bits                             / */\n/* ////////////////////////////////////////////////////////////////////////// */\n\n/* The color channel bits of less-than-8-bit pixels are read with the MSB of bytes first,\nso LodePNGBitWriter and LodePNGBitReader can't be used for those. */\n\nstatic unsigned char readBitFromReversedStream(size_t* bitpointer, const unsigned char* bitstream) {\n  unsigned char result = (unsigned char)((bitstream[(*bitpointer) >> 3] >> (7 - ((*bitpointer) & 0x7))) & 1);\n  ++(*bitpointer);\n  return result;\n}\n\n/* TODO: make this faster */\nstatic unsigned readBitsFromReversedStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits) {\n  unsigned result = 0;\n  size_t i;\n  for(i = 0 ; i < nbits; ++i) {\n    result <<= 1u;\n    result |= (unsigned)readBitFromReversedStream(bitpointer, bitstream);\n  }\n  return result;\n}\n\nstatic void setBitOfReversedStream(size_t* bitpointer, unsigned char* bitstream, unsigned char bit) {\n  /*the current bit in bitstream may be 0 or 1 for this to work*/\n  if(bit == 0) bitstream[(*bitpointer) >> 3u] &=  (unsigned char)(~(1u << (7u - ((*bitpointer) & 7u))));\n  else         bitstream[(*bitpointer) >> 3u] |=  (1u << (7u - ((*bitpointer) & 7u)));\n  ++(*bitpointer);\n}\n\n/* ////////////////////////////////////////////////////////////////////////// */\n/* / PNG chunks                                                             / */\n/* ////////////////////////////////////////////////////////////////////////// */\n\nunsigned lodepng_chunk_length(const unsigned char* chunk) {\n  return lodepng_read32bitInt(&chunk[0]);\n}\n\nvoid lodepng_chunk_type(char type[5], const unsigned char* chunk) {\n  unsigned i;\n  for(i = 0; i != 4; ++i) type[i] = (char)chunk[4 + i];\n  type[4] = 0; /*null termination char*/\n}\n\nunsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type) {\n  if(lodepng_strlen(type) != 4) return 0;\n  return (chunk[4] == type[0] && chunk[5] == type[1] && chunk[6] == type[2] && chunk[7] == type[3]);\n}\n\nunsigned char lodepng_chunk_ancillary(const unsigned char* chunk) {\n  return((chunk[4] & 32) != 0);\n}\n\nunsigned char lodepng_chunk_private(const unsigned char* chunk) {\n  return((chunk[6] & 32) != 0);\n}\n\nunsigned char lodepng_chunk_safetocopy(const unsigned char* chunk) {\n  return((chunk[7] & 32) != 0);\n}\n\nunsigned char* lodepng_chunk_data(unsigned char* chunk) {\n  return &chunk[8];\n}\n\nconst unsigned char* lodepng_chunk_data_const(const unsigned char* chunk) {\n  return &chunk[8];\n}\n\nunsigned lodepng_chunk_check_crc(const unsigned char* chunk) {\n  unsigned length = lodepng_chunk_length(chunk);\n  unsigned CRC = lodepng_read32bitInt(&chunk[length + 8]);\n  /*the CRC is taken of the data and the 4 chunk type letters, not the length*/\n  unsigned checksum = lodepng_crc32(&chunk[4], length + 4);\n  if(CRC != checksum) return 1;\n  else return 0;\n}\n\nvoid lodepng_chunk_generate_crc(unsigned char* chunk) {\n  unsigned length = lodepng_chunk_length(chunk);\n  unsigned CRC = lodepng_crc32(&chunk[4], length + 4);\n  lodepng_set32bitInt(chunk + 8 + length, CRC);\n}\n\nunsigned char* lodepng_chunk_next(unsigned char* chunk, unsigned char* end) {\n  if(chunk >= end || end - chunk < 12) return end; /*too small to contain a chunk*/\n  if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47\n    && chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) {\n    /* Is PNG magic header at start of PNG file. Jump to first actual chunk. */\n    return chunk + 8;\n  } else {\n    size_t total_chunk_length;\n    unsigned char* result;\n    if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return end;\n    result = chunk + total_chunk_length;\n    if(result < chunk) return end; /*pointer overflow*/\n    return result;\n  }\n}\n\nconst unsigned char* lodepng_chunk_next_const(const unsigned char* chunk, const unsigned char* end) {\n  if(chunk >= end || end - chunk < 12) return end; /*too small to contain a chunk*/\n  if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47\n    && chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) {\n    /* Is PNG magic header at start of PNG file. Jump to first actual chunk. */\n    return chunk + 8;\n  } else {\n    size_t total_chunk_length;\n    const unsigned char* result;\n    if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return end;\n    result = chunk + total_chunk_length;\n    if(result < chunk) return end; /*pointer overflow*/\n    return result;\n  }\n}\n\nunsigned char* lodepng_chunk_find(unsigned char* chunk, unsigned char* end, const char type[5]) {\n  for(;;) {\n    if(chunk >= end || end - chunk < 12) return 0; /* past file end: chunk + 12 > end */\n    if(lodepng_chunk_type_equals(chunk, type)) return chunk;\n    chunk = lodepng_chunk_next(chunk, end);\n  }\n}\n\nconst unsigned char* lodepng_chunk_find_const(const unsigned char* chunk, const unsigned char* end, const char type[5]) {\n  for(;;) {\n    if(chunk >= end || end - chunk < 12) return 0; /* past file end: chunk + 12 > end */\n    if(lodepng_chunk_type_equals(chunk, type)) return chunk;\n    chunk = lodepng_chunk_next_const(chunk, end);\n  }\n}\n\nunsigned lodepng_chunk_append(unsigned char** out, size_t* outsize, const unsigned char* chunk) {\n  unsigned i;\n  size_t total_chunk_length, new_length;\n  unsigned char *chunk_start, *new_buffer;\n\n  if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return 77;\n  if(lodepng_addofl(*outsize, total_chunk_length, &new_length)) return 77;\n\n  new_buffer = (unsigned char*)lodepng_realloc(*out, new_length);\n  if(!new_buffer) return 83; /*alloc fail*/\n  (*out) = new_buffer;\n  (*outsize) = new_length;\n  chunk_start = &(*out)[new_length - total_chunk_length];\n\n  for(i = 0; i != total_chunk_length; ++i) chunk_start[i] = chunk[i];\n\n  return 0;\n}\n\n/*Sets length and name and allocates the space for data and crc but does not\nset data or crc yet. Returns the start of the chunk in chunk. The start of\nthe data is at chunk + 8. To finalize chunk, add the data, then use\nlodepng_chunk_generate_crc */\nstatic unsigned lodepng_chunk_init(unsigned char** chunk,\n                                   ucvector* out,\n                                   unsigned length, const char* type) {\n  size_t new_length = out->size;\n  if(lodepng_addofl(new_length, length, &new_length)) return 77;\n  if(lodepng_addofl(new_length, 12, &new_length)) return 77;\n  if(!ucvector_resize(out, new_length)) return 83; /*alloc fail*/\n  *chunk = out->data + new_length - length - 12u;\n\n  /*1: length*/\n  lodepng_set32bitInt(*chunk, length);\n\n  /*2: chunk name (4 letters)*/\n  lodepng_memcpy(*chunk + 4, type, 4);\n\n  return 0;\n}\n\n/* like lodepng_chunk_create but with custom allocsize */\nstatic unsigned lodepng_chunk_createv(ucvector* out,\n                                      unsigned length, const char* type, const unsigned char* data) {\n  unsigned char* chunk;\n  CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, length, type));\n\n  /*3: the data*/\n  lodepng_memcpy(chunk + 8, data, length);\n\n  /*4: CRC (of the chunkname characters and the data)*/\n  lodepng_chunk_generate_crc(chunk);\n\n  return 0;\n}\n\nunsigned lodepng_chunk_create(unsigned char** out, size_t* outsize,\n                              unsigned length, const char* type, const unsigned char* data) {\n  ucvector v = ucvector_init(*out, *outsize);\n  unsigned error = lodepng_chunk_createv(&v, length, type, data);\n  *out = v.data;\n  *outsize = v.size;\n  return error;\n}\n\n/* ////////////////////////////////////////////////////////////////////////// */\n/* / Color types, channels, bits                                            / */\n/* ////////////////////////////////////////////////////////////////////////// */\n\n/*checks if the colortype is valid and the bitdepth bd is allowed for this colortype.\nReturn value is a LodePNG error code.*/\nstatic unsigned checkColorValidity(LodePNGColorType colortype, unsigned bd) {\n  switch(colortype) {\n    case LCT_GREY:       if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 || bd == 16)) return 37; break;\n    case LCT_RGB:        if(!(                                 bd == 8 || bd == 16)) return 37; break;\n    case LCT_PALETTE:    if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8            )) return 37; break;\n    case LCT_GREY_ALPHA: if(!(                                 bd == 8 || bd == 16)) return 37; break;\n    case LCT_RGBA:       if(!(                                 bd == 8 || bd == 16)) return 37; break;\n    case LCT_MAX_OCTET_VALUE: return 31; /* invalid color type */\n    default: return 31; /* invalid color type */\n  }\n  return 0; /*allowed color type / bits combination*/\n}\n\nstatic unsigned getNumColorChannels(LodePNGColorType colortype) {\n  switch(colortype) {\n    case LCT_GREY: return 1;\n    case LCT_RGB: return 3;\n    case LCT_PALETTE: return 1;\n    case LCT_GREY_ALPHA: return 2;\n    case LCT_RGBA: return 4;\n    case LCT_MAX_OCTET_VALUE: return 0; /* invalid color type */\n    default: return 0; /*invalid color type*/\n  }\n}\n\nstatic unsigned lodepng_get_bpp_lct(LodePNGColorType colortype, unsigned bitdepth) {\n  /*bits per pixel is amount of channels * bits per channel*/\n  return getNumColorChannels(colortype) * bitdepth;\n}\n\n/* ////////////////////////////////////////////////////////////////////////// */\n\nvoid lodepng_color_mode_init(LodePNGColorMode* info) {\n  info->key_defined = 0;\n  info->key_r = info->key_g = info->key_b = 0;\n  info->colortype = LCT_RGBA;\n  info->bitdepth = 8;\n  info->palette = 0;\n  info->palettesize = 0;\n}\n\n/*allocates palette memory if needed, and initializes all colors to black*/\nstatic void lodepng_color_mode_alloc_palette(LodePNGColorMode* info) {\n  size_t i;\n  /*if the palette is already allocated, it will have size 1024 so no reallocation needed in that case*/\n  /*the palette must have room for up to 256 colors with 4 bytes each.*/\n  if(!info->palette) info->palette = (unsigned char*)lodepng_malloc(1024);\n  if(!info->palette) return; /*alloc fail*/\n  for(i = 0; i != 256; ++i) {\n    /*Initialize all unused colors with black, the value used for invalid palette indices.\n    This is an error according to the PNG spec, but common PNG decoders make it black instead.\n    That makes color conversion slightly faster due to no error handling needed.*/\n    info->palette[i * 4 + 0] = 0;\n    info->palette[i * 4 + 1] = 0;\n    info->palette[i * 4 + 2] = 0;\n    info->palette[i * 4 + 3] = 255;\n  }\n}\n\nvoid lodepng_color_mode_cleanup(LodePNGColorMode* info) {\n  lodepng_palette_clear(info);\n}\n\nunsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source) {\n  lodepng_color_mode_cleanup(dest);\n  lodepng_memcpy(dest, source, sizeof(LodePNGColorMode));\n  if(source->palette) {\n    dest->palette = (unsigned char*)lodepng_malloc(1024);\n    if(!dest->palette && source->palettesize) return 83; /*alloc fail*/\n    lodepng_memcpy(dest->palette, source->palette, source->palettesize * 4);\n  }\n  return 0;\n}\n\nLodePNGColorMode lodepng_color_mode_make(LodePNGColorType colortype, unsigned bitdepth) {\n  LodePNGColorMode result;\n  lodepng_color_mode_init(&result);\n  result.colortype = colortype;\n  result.bitdepth = bitdepth;\n  return result;\n}\n\nstatic int lodepng_color_mode_equal(const LodePNGColorMode* a, const LodePNGColorMode* b) {\n  size_t i;\n  if(a->colortype != b->colortype) return 0;\n  if(a->bitdepth != b->bitdepth) return 0;\n  if(a->key_defined != b->key_defined) return 0;\n  if(a->key_defined) {\n    if(a->key_r != b->key_r) return 0;\n    if(a->key_g != b->key_g) return 0;\n    if(a->key_b != b->key_b) return 0;\n  }\n  if(a->palettesize != b->palettesize) return 0;\n  for(i = 0; i != a->palettesize * 4; ++i) {\n    if(a->palette[i] != b->palette[i]) return 0;\n  }\n  return 1;\n}\n\nvoid lodepng_palette_clear(LodePNGColorMode* info) {\n  if(info->palette) lodepng_free(info->palette);\n  info->palette = 0;\n  info->palettesize = 0;\n}\n\nunsigned lodepng_palette_add(LodePNGColorMode* info,\n                             unsigned char r, unsigned char g, unsigned char b, unsigned char a) {\n  if(!info->palette) /*allocate palette if empty*/ {\n    lodepng_color_mode_alloc_palette(info);\n    if(!info->palette) return 83; /*alloc fail*/\n  }\n  if(info->palettesize >= 256) {\n    return 108; /*too many palette values*/\n  }\n  info->palette[4 * info->palettesize + 0] = r;\n  info->palette[4 * info->palettesize + 1] = g;\n  info->palette[4 * info->palettesize + 2] = b;\n  info->palette[4 * info->palettesize + 3] = a;\n  ++info->palettesize;\n  return 0;\n}\n\n/*calculate bits per pixel out of colortype and bitdepth*/\nunsigned lodepng_get_bpp(const LodePNGColorMode* info) {\n  return lodepng_get_bpp_lct(info->colortype, info->bitdepth);\n}\n\nunsigned lodepng_get_channels(const LodePNGColorMode* info) {\n  return getNumColorChannels(info->colortype);\n}\n\nunsigned lodepng_is_greyscale_type(const LodePNGColorMode* info) {\n  return info->colortype == LCT_GREY || info->colortype == LCT_GREY_ALPHA;\n}\n\nunsigned lodepng_is_alpha_type(const LodePNGColorMode* info) {\n  return (info->colortype & 4) != 0; /*4 or 6*/\n}\n\nunsigned lodepng_is_palette_type(const LodePNGColorMode* info) {\n  return info->colortype == LCT_PALETTE;\n}\n\nunsigned lodepng_has_palette_alpha(const LodePNGColorMode* info) {\n  size_t i;\n  for(i = 0; i != info->palettesize; ++i) {\n    if(info->palette[i * 4 + 3] < 255) return 1;\n  }\n  return 0;\n}\n\nunsigned lodepng_can_have_alpha(const LodePNGColorMode* info) {\n  return info->key_defined\n      || lodepng_is_alpha_type(info)\n      || lodepng_has_palette_alpha(info);\n}\n\nstatic size_t lodepng_get_raw_size_lct(unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) {\n  size_t bpp = lodepng_get_bpp_lct(colortype, bitdepth);\n  size_t n = (size_t)w * (size_t)h;\n  return ((n / 8u) * bpp) + ((n & 7u) * bpp + 7u) / 8u;\n}\n\nsize_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color) {\n  return lodepng_get_raw_size_lct(w, h, color->colortype, color->bitdepth);\n}\n\n\n#ifdef LODEPNG_COMPILE_PNG\n\n/*in an idat chunk, each scanline is a multiple of 8 bits, unlike the lodepng output buffer,\nand in addition has one extra byte per line: the filter byte. So this gives a larger\nresult than lodepng_get_raw_size. Set h to 1 to get the size of 1 row including filter byte. */\nstatic size_t lodepng_get_raw_size_idat(unsigned w, unsigned h, unsigned bpp) {\n  /* + 1 for the filter byte, and possibly plus padding bits per line. */\n  /* Ignoring casts, the expression is equal to (w * bpp + 7) / 8 + 1, but avoids overflow of w * bpp */\n  size_t line = ((size_t)(w / 8u) * bpp) + 1u + ((w & 7u) * bpp + 7u) / 8u;\n  return (size_t)h * line;\n}\n\n#ifdef LODEPNG_COMPILE_DECODER\n/*Safely checks whether size_t overflow can be caused due to amount of pixels.\nThis check is overcautious rather than precise. If this check indicates no overflow,\nyou can safely compute in a size_t (but not an unsigned):\n-(size_t)w * (size_t)h * 8\n-amount of bytes in IDAT (including filter, padding and Adam7 bytes)\n-amount of bytes in raw color model\nReturns 1 if overflow possible, 0 if not.\n*/\nstatic int lodepng_pixel_overflow(unsigned w, unsigned h,\n                                  const LodePNGColorMode* pngcolor, const LodePNGColorMode* rawcolor) {\n  size_t bpp = LODEPNG_MAX(lodepng_get_bpp(pngcolor), lodepng_get_bpp(rawcolor));\n  size_t numpixels, total;\n  size_t line; /* bytes per line in worst case */\n\n  if(lodepng_mulofl((size_t)w, (size_t)h, &numpixels)) return 1;\n  if(lodepng_mulofl(numpixels, 8, &total)) return 1; /* bit pointer with 8-bit color, or 8 bytes per channel color */\n\n  /* Bytes per scanline with the expression \"(w / 8u) * bpp) + ((w & 7u) * bpp + 7u) / 8u\" */\n  if(lodepng_mulofl((size_t)(w / 8u), bpp, &line)) return 1;\n  if(lodepng_addofl(line, ((w & 7u) * bpp + 7u) / 8u, &line)) return 1;\n\n  if(lodepng_addofl(line, 5, &line)) return 1; /* 5 bytes overhead per line: 1 filterbyte, 4 for Adam7 worst case */\n  if(lodepng_mulofl(line, h, &total)) return 1; /* Total bytes in worst case */\n\n  return 0; /* no overflow */\n}\n#endif /*LODEPNG_COMPILE_DECODER*/\n#endif /*LODEPNG_COMPILE_PNG*/\n\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n\nstatic void LodePNGUnknownChunks_init(LodePNGInfo* info) {\n  unsigned i;\n  for(i = 0; i != 3; ++i) info->unknown_chunks_data[i] = 0;\n  for(i = 0; i != 3; ++i) info->unknown_chunks_size[i] = 0;\n}\n\nstatic void LodePNGUnknownChunks_cleanup(LodePNGInfo* info) {\n  unsigned i;\n  for(i = 0; i != 3; ++i) lodepng_free(info->unknown_chunks_data[i]);\n}\n\nstatic unsigned LodePNGUnknownChunks_copy(LodePNGInfo* dest, const LodePNGInfo* src) {\n  unsigned i;\n\n  LodePNGUnknownChunks_cleanup(dest);\n\n  for(i = 0; i != 3; ++i) {\n    size_t j;\n    dest->unknown_chunks_size[i] = src->unknown_chunks_size[i];\n    dest->unknown_chunks_data[i] = (unsigned char*)lodepng_malloc(src->unknown_chunks_size[i]);\n    if(!dest->unknown_chunks_data[i] && dest->unknown_chunks_size[i]) return 83; /*alloc fail*/\n    for(j = 0; j < src->unknown_chunks_size[i]; ++j) {\n      dest->unknown_chunks_data[i][j] = src->unknown_chunks_data[i][j];\n    }\n  }\n\n  return 0;\n}\n\n/******************************************************************************/\n\nstatic void LodePNGText_init(LodePNGInfo* info) {\n  info->text_num = 0;\n  info->text_keys = NULL;\n  info->text_strings = NULL;\n}\n\nstatic void LodePNGText_cleanup(LodePNGInfo* info) {\n  size_t i;\n  for(i = 0; i != info->text_num; ++i) {\n    string_cleanup(&info->text_keys[i]);\n    string_cleanup(&info->text_strings[i]);\n  }\n  lodepng_free(info->text_keys);\n  lodepng_free(info->text_strings);\n}\n\nstatic unsigned LodePNGText_copy(LodePNGInfo* dest, const LodePNGInfo* source) {\n  size_t i = 0;\n  dest->text_keys = NULL;\n  dest->text_strings = NULL;\n  dest->text_num = 0;\n  for(i = 0; i != source->text_num; ++i) {\n    CERROR_TRY_RETURN(lodepng_add_text(dest, source->text_keys[i], source->text_strings[i]));\n  }\n  return 0;\n}\n\nstatic unsigned lodepng_add_text_sized(LodePNGInfo* info, const char* key, const char* str, size_t size) {\n  char** new_keys = (char**)(lodepng_realloc(info->text_keys, sizeof(char*) * (info->text_num + 1)));\n  char** new_strings = (char**)(lodepng_realloc(info->text_strings, sizeof(char*) * (info->text_num + 1)));\n\n  if(new_keys) info->text_keys = new_keys;\n  if(new_strings) info->text_strings = new_strings;\n\n  if(!new_keys || !new_strings) return 83; /*alloc fail*/\n\n  ++info->text_num;\n  info->text_keys[info->text_num - 1] = alloc_string(key);\n  info->text_strings[info->text_num - 1] = alloc_string_sized(str, size);\n  if(!info->text_keys[info->text_num - 1] || !info->text_strings[info->text_num - 1]) return 83; /*alloc fail*/\n\n  return 0;\n}\n\nunsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str) {\n  return lodepng_add_text_sized(info, key, str, lodepng_strlen(str));\n}\n\nvoid lodepng_clear_text(LodePNGInfo* info) {\n  LodePNGText_cleanup(info);\n}\n\n/******************************************************************************/\n\nstatic void LodePNGIText_init(LodePNGInfo* info) {\n  info->itext_num = 0;\n  info->itext_keys = NULL;\n  info->itext_langtags = NULL;\n  info->itext_transkeys = NULL;\n  info->itext_strings = NULL;\n}\n\nstatic void LodePNGIText_cleanup(LodePNGInfo* info) {\n  size_t i;\n  for(i = 0; i != info->itext_num; ++i) {\n    string_cleanup(&info->itext_keys[i]);\n    string_cleanup(&info->itext_langtags[i]);\n    string_cleanup(&info->itext_transkeys[i]);\n    string_cleanup(&info->itext_strings[i]);\n  }\n  lodepng_free(info->itext_keys);\n  lodepng_free(info->itext_langtags);\n  lodepng_free(info->itext_transkeys);\n  lodepng_free(info->itext_strings);\n}\n\nstatic unsigned LodePNGIText_copy(LodePNGInfo* dest, const LodePNGInfo* source) {\n  size_t i = 0;\n  dest->itext_keys = NULL;\n  dest->itext_langtags = NULL;\n  dest->itext_transkeys = NULL;\n  dest->itext_strings = NULL;\n  dest->itext_num = 0;\n  for(i = 0; i != source->itext_num; ++i) {\n    CERROR_TRY_RETURN(lodepng_add_itext(dest, source->itext_keys[i], source->itext_langtags[i],\n                                        source->itext_transkeys[i], source->itext_strings[i]));\n  }\n  return 0;\n}\n\nvoid lodepng_clear_itext(LodePNGInfo* info) {\n  LodePNGIText_cleanup(info);\n}\n\nstatic unsigned lodepng_add_itext_sized(LodePNGInfo* info, const char* key, const char* langtag,\n                                        const char* transkey, const char* str, size_t size) {\n  char** new_keys = (char**)(lodepng_realloc(info->itext_keys, sizeof(char*) * (info->itext_num + 1)));\n  char** new_langtags = (char**)(lodepng_realloc(info->itext_langtags, sizeof(char*) * (info->itext_num + 1)));\n  char** new_transkeys = (char**)(lodepng_realloc(info->itext_transkeys, sizeof(char*) * (info->itext_num + 1)));\n  char** new_strings = (char**)(lodepng_realloc(info->itext_strings, sizeof(char*) * (info->itext_num + 1)));\n\n  if(new_keys) info->itext_keys = new_keys;\n  if(new_langtags) info->itext_langtags = new_langtags;\n  if(new_transkeys) info->itext_transkeys = new_transkeys;\n  if(new_strings) info->itext_strings = new_strings;\n\n  if(!new_keys || !new_langtags || !new_transkeys || !new_strings) return 83; /*alloc fail*/\n\n  ++info->itext_num;\n\n  info->itext_keys[info->itext_num - 1] = alloc_string(key);\n  info->itext_langtags[info->itext_num - 1] = alloc_string(langtag);\n  info->itext_transkeys[info->itext_num - 1] = alloc_string(transkey);\n  info->itext_strings[info->itext_num - 1] = alloc_string_sized(str, size);\n\n  return 0;\n}\n\nunsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag,\n                           const char* transkey, const char* str) {\n  return lodepng_add_itext_sized(info, key, langtag, transkey, str, lodepng_strlen(str));\n}\n\n/* same as set but does not delete */\nstatic unsigned lodepng_assign_icc(LodePNGInfo* info, const char* name, const unsigned char* profile, unsigned profile_size) {\n  if(profile_size == 0) return 100; /*invalid ICC profile size*/\n\n  info->iccp_name = alloc_string(name);\n  info->iccp_profile = (unsigned char*)lodepng_malloc(profile_size);\n\n  if(!info->iccp_name || !info->iccp_profile) return 83; /*alloc fail*/\n\n  lodepng_memcpy(info->iccp_profile, profile, profile_size);\n  info->iccp_profile_size = profile_size;\n\n  return 0; /*ok*/\n}\n\nunsigned lodepng_set_icc(LodePNGInfo* info, const char* name, const unsigned char* profile, unsigned profile_size) {\n  if(info->iccp_name) lodepng_clear_icc(info);\n  info->iccp_defined = 1;\n\n  return lodepng_assign_icc(info, name, profile, profile_size);\n}\n\nvoid lodepng_clear_icc(LodePNGInfo* info) {\n  string_cleanup(&info->iccp_name);\n  lodepng_free(info->iccp_profile);\n  info->iccp_profile = NULL;\n  info->iccp_profile_size = 0;\n  info->iccp_defined = 0;\n}\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n\nvoid lodepng_info_init(LodePNGInfo* info) {\n  lodepng_color_mode_init(&info->color);\n  info->interlace_method = 0;\n  info->compression_method = 0;\n  info->filter_method = 0;\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n  info->background_defined = 0;\n  info->background_r = info->background_g = info->background_b = 0;\n\n  LodePNGText_init(info);\n  LodePNGIText_init(info);\n\n  info->time_defined = 0;\n  info->phys_defined = 0;\n\n  info->gama_defined = 0;\n  info->chrm_defined = 0;\n  info->srgb_defined = 0;\n  info->iccp_defined = 0;\n  info->iccp_name = NULL;\n  info->iccp_profile = NULL;\n\n  LodePNGUnknownChunks_init(info);\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n}\n\nvoid lodepng_info_cleanup(LodePNGInfo* info) {\n  lodepng_color_mode_cleanup(&info->color);\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n  LodePNGText_cleanup(info);\n  LodePNGIText_cleanup(info);\n\n  lodepng_clear_icc(info);\n\n  LodePNGUnknownChunks_cleanup(info);\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n}\n\nunsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source) {\n  lodepng_info_cleanup(dest);\n  lodepng_memcpy(dest, source, sizeof(LodePNGInfo));\n  lodepng_color_mode_init(&dest->color);\n  CERROR_TRY_RETURN(lodepng_color_mode_copy(&dest->color, &source->color));\n\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n  CERROR_TRY_RETURN(LodePNGText_copy(dest, source));\n  CERROR_TRY_RETURN(LodePNGIText_copy(dest, source));\n  if(source->iccp_defined) {\n    CERROR_TRY_RETURN(lodepng_assign_icc(dest, source->iccp_name, source->iccp_profile, source->iccp_profile_size));\n  }\n\n  LodePNGUnknownChunks_init(dest);\n  CERROR_TRY_RETURN(LodePNGUnknownChunks_copy(dest, source));\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n  return 0;\n}\n\n/* ////////////////////////////////////////////////////////////////////////// */\n\n/*index: bitgroup index, bits: bitgroup size(1, 2 or 4), in: bitgroup value, out: octet array to add bits to*/\nstatic void addColorBits(unsigned char* out, size_t index, unsigned bits, unsigned in) {\n  unsigned m = bits == 1 ? 7 : bits == 2 ? 3 : 1; /*8 / bits - 1*/\n  /*p = the partial index in the byte, e.g. with 4 palettebits it is 0 for first half or 1 for second half*/\n  unsigned p = index & m;\n  in &= (1u << bits) - 1u; /*filter out any other bits of the input value*/\n  in = in << (bits * (m - p));\n  if(p == 0) out[index * bits / 8u] = in;\n  else out[index * bits / 8u] |= in;\n}\n\ntypedef struct ColorTree ColorTree;\n\n/*\nOne node of a color tree\nThis is the data structure used to count the number of unique colors and to get a palette\nindex for a color. It's like an octree, but because the alpha channel is used too, each\nnode has 16 instead of 8 children.\n*/\nstruct ColorTree {\n  ColorTree* children[16]; /*up to 16 pointers to ColorTree of next level*/\n  int index; /*the payload. Only has a meaningful value if this is in the last level*/\n};\n\nstatic void color_tree_init(ColorTree* tree) {\n  lodepng_memset(tree->children, 0, 16 * sizeof(*tree->children));\n  tree->index = -1;\n}\n\nstatic void color_tree_cleanup(ColorTree* tree) {\n  int i;\n  for(i = 0; i != 16; ++i) {\n    if(tree->children[i]) {\n      color_tree_cleanup(tree->children[i]);\n      lodepng_free(tree->children[i]);\n    }\n  }\n}\n\n/*returns -1 if color not present, its index otherwise*/\nstatic int color_tree_get(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) {\n  int bit = 0;\n  for(bit = 0; bit < 8; ++bit) {\n    int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1);\n    if(!tree->children[i]) return -1;\n    else tree = tree->children[i];\n  }\n  return tree ? tree->index : -1;\n}\n\n#ifdef LODEPNG_COMPILE_ENCODER\nstatic int color_tree_has(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) {\n  return color_tree_get(tree, r, g, b, a) >= 0;\n}\n#endif /*LODEPNG_COMPILE_ENCODER*/\n\n/*color is not allowed to already exist.\nIndex should be >= 0 (it's signed to be compatible with using -1 for \"doesn't exist\")\nReturns error code, or 0 if ok*/\nstatic unsigned color_tree_add(ColorTree* tree,\n                               unsigned char r, unsigned char g, unsigned char b, unsigned char a, unsigned index) {\n  int bit;\n  for(bit = 0; bit < 8; ++bit) {\n    int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1);\n    if(!tree->children[i]) {\n      tree->children[i] = (ColorTree*)lodepng_malloc(sizeof(ColorTree));\n      if(!tree->children[i]) return 83; /*alloc fail*/\n      color_tree_init(tree->children[i]);\n    }\n    tree = tree->children[i];\n  }\n  tree->index = (int)index;\n  return 0;\n}\n\n/*put a pixel, given its RGBA color, into image of any color type*/\nstatic unsigned rgba8ToPixel(unsigned char* out, size_t i,\n                             const LodePNGColorMode* mode, ColorTree* tree /*for palette*/,\n                             unsigned char r, unsigned char g, unsigned char b, unsigned char a) {\n  if(mode->colortype == LCT_GREY) {\n    unsigned char gray = r; /*((unsigned short)r + g + b) / 3u;*/\n    if(mode->bitdepth == 8) out[i] = gray;\n    else if(mode->bitdepth == 16) out[i * 2 + 0] = out[i * 2 + 1] = gray;\n    else {\n      /*take the most significant bits of gray*/\n      gray = ((unsigned)gray >> (8u - mode->bitdepth)) & ((1u << mode->bitdepth) - 1u);\n      addColorBits(out, i, mode->bitdepth, gray);\n    }\n  } else if(mode->colortype == LCT_RGB) {\n    if(mode->bitdepth == 8) {\n      out[i * 3 + 0] = r;\n      out[i * 3 + 1] = g;\n      out[i * 3 + 2] = b;\n    } else {\n      out[i * 6 + 0] = out[i * 6 + 1] = r;\n      out[i * 6 + 2] = out[i * 6 + 3] = g;\n      out[i * 6 + 4] = out[i * 6 + 5] = b;\n    }\n  } else if(mode->colortype == LCT_PALETTE) {\n    int index = color_tree_get(tree, r, g, b, a);\n    if(index < 0) return 82; /*color not in palette*/\n    if(mode->bitdepth == 8) out[i] = index;\n    else addColorBits(out, i, mode->bitdepth, (unsigned)index);\n  } else if(mode->colortype == LCT_GREY_ALPHA) {\n    unsigned char gray = r; /*((unsigned short)r + g + b) / 3u;*/\n    if(mode->bitdepth == 8) {\n      out[i * 2 + 0] = gray;\n      out[i * 2 + 1] = a;\n    } else if(mode->bitdepth == 16) {\n      out[i * 4 + 0] = out[i * 4 + 1] = gray;\n      out[i * 4 + 2] = out[i * 4 + 3] = a;\n    }\n  } else if(mode->colortype == LCT_RGBA) {\n    if(mode->bitdepth == 8) {\n      out[i * 4 + 0] = r;\n      out[i * 4 + 1] = g;\n      out[i * 4 + 2] = b;\n      out[i * 4 + 3] = a;\n    } else {\n      out[i * 8 + 0] = out[i * 8 + 1] = r;\n      out[i * 8 + 2] = out[i * 8 + 3] = g;\n      out[i * 8 + 4] = out[i * 8 + 5] = b;\n      out[i * 8 + 6] = out[i * 8 + 7] = a;\n    }\n  }\n\n  return 0; /*no error*/\n}\n\n/*put a pixel, given its RGBA16 color, into image of any color 16-bitdepth type*/\nstatic void rgba16ToPixel(unsigned char* out, size_t i,\n                         const LodePNGColorMode* mode,\n                         unsigned short r, unsigned short g, unsigned short b, unsigned short a) {\n  if(mode->colortype == LCT_GREY) {\n    unsigned short gray = r; /*((unsigned)r + g + b) / 3u;*/\n    out[i * 2 + 0] = (gray >> 8) & 255;\n    out[i * 2 + 1] = gray & 255;\n  } else if(mode->colortype == LCT_RGB) {\n    out[i * 6 + 0] = (r >> 8) & 255;\n    out[i * 6 + 1] = r & 255;\n    out[i * 6 + 2] = (g >> 8) & 255;\n    out[i * 6 + 3] = g & 255;\n    out[i * 6 + 4] = (b >> 8) & 255;\n    out[i * 6 + 5] = b & 255;\n  } else if(mode->colortype == LCT_GREY_ALPHA) {\n    unsigned short gray = r; /*((unsigned)r + g + b) / 3u;*/\n    out[i * 4 + 0] = (gray >> 8) & 255;\n    out[i * 4 + 1] = gray & 255;\n    out[i * 4 + 2] = (a >> 8) & 255;\n    out[i * 4 + 3] = a & 255;\n  } else if(mode->colortype == LCT_RGBA) {\n    out[i * 8 + 0] = (r >> 8) & 255;\n    out[i * 8 + 1] = r & 255;\n    out[i * 8 + 2] = (g >> 8) & 255;\n    out[i * 8 + 3] = g & 255;\n    out[i * 8 + 4] = (b >> 8) & 255;\n    out[i * 8 + 5] = b & 255;\n    out[i * 8 + 6] = (a >> 8) & 255;\n    out[i * 8 + 7] = a & 255;\n  }\n}\n\n/*Get RGBA8 color of pixel with index i (y * width + x) from the raw image with given color type.*/\nstatic void getPixelColorRGBA8(unsigned char* r, unsigned char* g,\n                               unsigned char* b, unsigned char* a,\n                               const unsigned char* in, size_t i,\n                               const LodePNGColorMode* mode) {\n  if(mode->colortype == LCT_GREY) {\n    if(mode->bitdepth == 8) {\n      *r = *g = *b = in[i];\n      if(mode->key_defined && *r == mode->key_r) *a = 0;\n      else *a = 255;\n    } else if(mode->bitdepth == 16) {\n      *r = *g = *b = in[i * 2 + 0];\n      if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0;\n      else *a = 255;\n    } else {\n      unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/\n      size_t j = i * mode->bitdepth;\n      unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth);\n      *r = *g = *b = (value * 255) / highest;\n      if(mode->key_defined && value == mode->key_r) *a = 0;\n      else *a = 255;\n    }\n  } else if(mode->colortype == LCT_RGB) {\n    if(mode->bitdepth == 8) {\n      *r = in[i * 3 + 0]; *g = in[i * 3 + 1]; *b = in[i * 3 + 2];\n      if(mode->key_defined && *r == mode->key_r && *g == mode->key_g && *b == mode->key_b) *a = 0;\n      else *a = 255;\n    } else {\n      *r = in[i * 6 + 0];\n      *g = in[i * 6 + 2];\n      *b = in[i * 6 + 4];\n      if(mode->key_defined && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r\n         && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g\n         && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0;\n      else *a = 255;\n    }\n  } else if(mode->colortype == LCT_PALETTE) {\n    unsigned index;\n    if(mode->bitdepth == 8) index = in[i];\n    else {\n      size_t j = i * mode->bitdepth;\n      index = readBitsFromReversedStream(&j, in, mode->bitdepth);\n    }\n    /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/\n    *r = mode->palette[index * 4 + 0];\n    *g = mode->palette[index * 4 + 1];\n    *b = mode->palette[index * 4 + 2];\n    *a = mode->palette[index * 4 + 3];\n  } else if(mode->colortype == LCT_GREY_ALPHA) {\n    if(mode->bitdepth == 8) {\n      *r = *g = *b = in[i * 2 + 0];\n      *a = in[i * 2 + 1];\n    } else {\n      *r = *g = *b = in[i * 4 + 0];\n      *a = in[i * 4 + 2];\n    }\n  } else if(mode->colortype == LCT_RGBA) {\n    if(mode->bitdepth == 8) {\n      *r = in[i * 4 + 0];\n      *g = in[i * 4 + 1];\n      *b = in[i * 4 + 2];\n      *a = in[i * 4 + 3];\n    } else {\n      *r = in[i * 8 + 0];\n      *g = in[i * 8 + 2];\n      *b = in[i * 8 + 4];\n      *a = in[i * 8 + 6];\n    }\n  }\n}\n\n/*Similar to getPixelColorRGBA8, but with all the for loops inside of the color\nmode test cases, optimized to convert the colors much faster, when converting\nto the common case of RGBA with 8 bit per channel. buffer must be RGBA with\nenough memory.*/\nstatic void getPixelColorsRGBA8(unsigned char* LODEPNG_RESTRICT buffer, size_t numpixels,\n                                const unsigned char* LODEPNG_RESTRICT in,\n                                const LodePNGColorMode* mode) {\n  unsigned num_channels = 4;\n  size_t i;\n  if(mode->colortype == LCT_GREY) {\n    if(mode->bitdepth == 8) {\n      for(i = 0; i != numpixels; ++i, buffer += num_channels) {\n        buffer[0] = buffer[1] = buffer[2] = in[i];\n        buffer[3] = 255;\n      }\n      if(mode->key_defined) {\n        buffer -= numpixels * num_channels;\n        for(i = 0; i != numpixels; ++i, buffer += num_channels) {\n          if(buffer[0] == mode->key_r) buffer[3] = 0;\n        }\n      }\n    } else if(mode->bitdepth == 16) {\n      for(i = 0; i != numpixels; ++i, buffer += num_channels) {\n        buffer[0] = buffer[1] = buffer[2] = in[i * 2];\n        buffer[3] = mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r ? 0 : 255;\n      }\n    } else {\n      unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/\n      size_t j = 0;\n      for(i = 0; i != numpixels; ++i, buffer += num_channels) {\n        unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth);\n        buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest;\n        buffer[3] = mode->key_defined && value == mode->key_r ? 0 : 255;\n      }\n    }\n  } else if(mode->colortype == LCT_RGB) {\n    if(mode->bitdepth == 8) {\n      for(i = 0; i != numpixels; ++i, buffer += num_channels) {\n        lodepng_memcpy(buffer, &in[i * 3], 3);\n        buffer[3] = 255;\n      }\n      if(mode->key_defined) {\n        buffer -= numpixels * num_channels;\n        for(i = 0; i != numpixels; ++i, buffer += num_channels) {\n          if(buffer[0] == mode->key_r && buffer[1]== mode->key_g && buffer[2] == mode->key_b) buffer[3] = 0;\n        }\n      }\n    } else {\n      for(i = 0; i != numpixels; ++i, buffer += num_channels) {\n        buffer[0] = in[i * 6 + 0];\n        buffer[1] = in[i * 6 + 2];\n        buffer[2] = in[i * 6 + 4];\n        buffer[3] = mode->key_defined\n           && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r\n           && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g\n           && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b ? 0 : 255;\n      }\n    }\n  } else if(mode->colortype == LCT_PALETTE) {\n    if(mode->bitdepth == 8) {\n      for(i = 0; i != numpixels; ++i, buffer += num_channels) {\n        unsigned index = in[i];\n        /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/\n        lodepng_memcpy(buffer, &mode->palette[index * 4], 4);\n      }\n    } else {\n      size_t j = 0;\n      for(i = 0; i != numpixels; ++i, buffer += num_channels) {\n        unsigned index = readBitsFromReversedStream(&j, in, mode->bitdepth);\n        /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/\n        lodepng_memcpy(buffer, &mode->palette[index * 4], 4);\n      }\n    }\n  } else if(mode->colortype == LCT_GREY_ALPHA) {\n    if(mode->bitdepth == 8) {\n      for(i = 0; i != numpixels; ++i, buffer += num_channels) {\n        buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0];\n        buffer[3] = in[i * 2 + 1];\n      }\n    } else {\n      for(i = 0; i != numpixels; ++i, buffer += num_channels) {\n        buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0];\n        buffer[3] = in[i * 4 + 2];\n      }\n    }\n  } else if(mode->colortype == LCT_RGBA) {\n    if(mode->bitdepth == 8) {\n      lodepng_memcpy(buffer, in, numpixels * 4);\n    } else {\n      for(i = 0; i != numpixels; ++i, buffer += num_channels) {\n        buffer[0] = in[i * 8 + 0];\n        buffer[1] = in[i * 8 + 2];\n        buffer[2] = in[i * 8 + 4];\n        buffer[3] = in[i * 8 + 6];\n      }\n    }\n  }\n}\n\n/*Similar to getPixelColorsRGBA8, but with 3-channel RGB output.*/\nstatic void getPixelColorsRGB8(unsigned char* LODEPNG_RESTRICT buffer, size_t numpixels,\n                               const unsigned char* LODEPNG_RESTRICT in,\n                               const LodePNGColorMode* mode) {\n  const unsigned num_channels = 3;\n  size_t i;\n  if(mode->colortype == LCT_GREY) {\n    if(mode->bitdepth == 8) {\n      for(i = 0; i != numpixels; ++i, buffer += num_channels) {\n        buffer[0] = buffer[1] = buffer[2] = in[i];\n      }\n    } else if(mode->bitdepth == 16) {\n      for(i = 0; i != numpixels; ++i, buffer += num_channels) {\n        buffer[0] = buffer[1] = buffer[2] = in[i * 2];\n      }\n    } else {\n      unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/\n      size_t j = 0;\n      for(i = 0; i != numpixels; ++i, buffer += num_channels) {\n        unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth);\n        buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest;\n      }\n    }\n  } else if(mode->colortype == LCT_RGB) {\n    if(mode->bitdepth == 8) {\n      lodepng_memcpy(buffer, in, numpixels * 3);\n    } else {\n      for(i = 0; i != numpixels; ++i, buffer += num_channels) {\n        buffer[0] = in[i * 6 + 0];\n        buffer[1] = in[i * 6 + 2];\n        buffer[2] = in[i * 6 + 4];\n      }\n    }\n  } else if(mode->colortype == LCT_PALETTE) {\n    if(mode->bitdepth == 8) {\n      for(i = 0; i != numpixels; ++i, buffer += num_channels) {\n        unsigned index = in[i];\n        /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/\n        lodepng_memcpy(buffer, &mode->palette[index * 4], 3);\n      }\n    } else {\n      size_t j = 0;\n      for(i = 0; i != numpixels; ++i, buffer += num_channels) {\n        unsigned index = readBitsFromReversedStream(&j, in, mode->bitdepth);\n        /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/\n        lodepng_memcpy(buffer, &mode->palette[index * 4], 3);\n      }\n    }\n  } else if(mode->colortype == LCT_GREY_ALPHA) {\n    if(mode->bitdepth == 8) {\n      for(i = 0; i != numpixels; ++i, buffer += num_channels) {\n        buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0];\n      }\n    } else {\n      for(i = 0; i != numpixels; ++i, buffer += num_channels) {\n        buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0];\n      }\n    }\n  } else if(mode->colortype == LCT_RGBA) {\n    if(mode->bitdepth == 8) {\n      for(i = 0; i != numpixels; ++i, buffer += num_channels) {\n        lodepng_memcpy(buffer, &in[i * 4], 3);\n      }\n    } else {\n      for(i = 0; i != numpixels; ++i, buffer += num_channels) {\n        buffer[0] = in[i * 8 + 0];\n        buffer[1] = in[i * 8 + 2];\n        buffer[2] = in[i * 8 + 4];\n      }\n    }\n  }\n}\n\n/*Get RGBA16 color of pixel with index i (y * width + x) from the raw image with\ngiven color type, but the given color type must be 16-bit itself.*/\nstatic void getPixelColorRGBA16(unsigned short* r, unsigned short* g, unsigned short* b, unsigned short* a,\n                                const unsigned char* in, size_t i, const LodePNGColorMode* mode) {\n  if(mode->colortype == LCT_GREY) {\n    *r = *g = *b = 256 * in[i * 2 + 0] + in[i * 2 + 1];\n    if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0;\n    else *a = 65535;\n  } else if(mode->colortype == LCT_RGB) {\n    *r = 256u * in[i * 6 + 0] + in[i * 6 + 1];\n    *g = 256u * in[i * 6 + 2] + in[i * 6 + 3];\n    *b = 256u * in[i * 6 + 4] + in[i * 6 + 5];\n    if(mode->key_defined\n       && 256u * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r\n       && 256u * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g\n       && 256u * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0;\n    else *a = 65535;\n  } else if(mode->colortype == LCT_GREY_ALPHA) {\n    *r = *g = *b = 256u * in[i * 4 + 0] + in[i * 4 + 1];\n    *a = 256u * in[i * 4 + 2] + in[i * 4 + 3];\n  } else if(mode->colortype == LCT_RGBA) {\n    *r = 256u * in[i * 8 + 0] + in[i * 8 + 1];\n    *g = 256u * in[i * 8 + 2] + in[i * 8 + 3];\n    *b = 256u * in[i * 8 + 4] + in[i * 8 + 5];\n    *a = 256u * in[i * 8 + 6] + in[i * 8 + 7];\n  }\n}\n\nunsigned lodepng_convert(unsigned char* out, const unsigned char* in,\n                         const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in,\n                         unsigned w, unsigned h) {\n  size_t i;\n  ColorTree tree;\n  size_t numpixels = (size_t)w * (size_t)h;\n  unsigned error = 0;\n\n  if(mode_in->colortype == LCT_PALETTE && !mode_in->palette) {\n    return 107; /* error: must provide palette if input mode is palette */\n  }\n\n  if(lodepng_color_mode_equal(mode_out, mode_in)) {\n    size_t numbytes = lodepng_get_raw_size(w, h, mode_in);\n    lodepng_memcpy(out, in, numbytes);\n    return 0;\n  }\n\n  if(mode_out->colortype == LCT_PALETTE) {\n    size_t palettesize = mode_out->palettesize;\n    const unsigned char* palette = mode_out->palette;\n    size_t palsize = (size_t)1u << mode_out->bitdepth;\n    /*if the user specified output palette but did not give the values, assume\n    they want the values of the input color type (assuming that one is palette).\n    Note that we never create a new palette ourselves.*/\n    if(palettesize == 0) {\n      palettesize = mode_in->palettesize;\n      palette = mode_in->palette;\n      /*if the input was also palette with same bitdepth, then the color types are also\n      equal, so copy literally. This to preserve the exact indices that were in the PNG\n      even in case there are duplicate colors in the palette.*/\n      if(mode_in->colortype == LCT_PALETTE && mode_in->bitdepth == mode_out->bitdepth) {\n        size_t numbytes = lodepng_get_raw_size(w, h, mode_in);\n        lodepng_memcpy(out, in, numbytes);\n        return 0;\n      }\n    }\n    if(palettesize < palsize) palsize = palettesize;\n    color_tree_init(&tree);\n    for(i = 0; i != palsize; ++i) {\n      const unsigned char* p = &palette[i * 4];\n      error = color_tree_add(&tree, p[0], p[1], p[2], p[3], (unsigned)i);\n      if(error) break;\n    }\n  }\n\n  if(!error) {\n    if(mode_in->bitdepth == 16 && mode_out->bitdepth == 16) {\n      for(i = 0; i != numpixels; ++i) {\n        unsigned short r = 0, g = 0, b = 0, a = 0;\n        getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in);\n        rgba16ToPixel(out, i, mode_out, r, g, b, a);\n      }\n    } else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGBA) {\n      getPixelColorsRGBA8(out, numpixels, in, mode_in);\n    } else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGB) {\n      getPixelColorsRGB8(out, numpixels, in, mode_in);\n    } else {\n      unsigned char r = 0, g = 0, b = 0, a = 0;\n      for(i = 0; i != numpixels; ++i) {\n        getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in);\n        error = rgba8ToPixel(out, i, mode_out, &tree, r, g, b, a);\n        if(error) break;\n      }\n    }\n  }\n\n  if(mode_out->colortype == LCT_PALETTE) {\n    color_tree_cleanup(&tree);\n  }\n\n  return error;\n}\n\n\n/* Converts a single rgb color without alpha from one type to another, color bits truncated to\ntheir bitdepth. In case of single channel (gray or palette), only the r channel is used. Slow\nfunction, do not use to process all pixels of an image. Alpha channel not supported on purpose:\nthis is for bKGD, supporting alpha may prevent it from finding a color in the palette, from the\nspecification it looks like bKGD should ignore the alpha values of the palette since it can use\nany palette index but doesn't have an alpha channel. Idem with ignoring color key. */\nunsigned lodepng_convert_rgb(\n    unsigned* r_out, unsigned* g_out, unsigned* b_out,\n    unsigned r_in, unsigned g_in, unsigned b_in,\n    const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in) {\n  unsigned r = 0, g = 0, b = 0;\n  unsigned mul = 65535 / ((1u << mode_in->bitdepth) - 1u); /*65535, 21845, 4369, 257, 1*/\n  unsigned shift = 16 - mode_out->bitdepth;\n\n  if(mode_in->colortype == LCT_GREY || mode_in->colortype == LCT_GREY_ALPHA) {\n    r = g = b = r_in * mul;\n  } else if(mode_in->colortype == LCT_RGB || mode_in->colortype == LCT_RGBA) {\n    r = r_in * mul;\n    g = g_in * mul;\n    b = b_in * mul;\n  } else if(mode_in->colortype == LCT_PALETTE) {\n    if(r_in >= mode_in->palettesize) return 82;\n    r = mode_in->palette[r_in * 4 + 0] * 257u;\n    g = mode_in->palette[r_in * 4 + 1] * 257u;\n    b = mode_in->palette[r_in * 4 + 2] * 257u;\n  } else {\n    return 31;\n  }\n\n  /* now convert to output format */\n  if(mode_out->colortype == LCT_GREY || mode_out->colortype == LCT_GREY_ALPHA) {\n    *r_out = r >> shift ;\n  } else if(mode_out->colortype == LCT_RGB || mode_out->colortype == LCT_RGBA) {\n    *r_out = r >> shift ;\n    *g_out = g >> shift ;\n    *b_out = b >> shift ;\n  } else if(mode_out->colortype == LCT_PALETTE) {\n    unsigned i;\n    /* a 16-bit color cannot be in the palette */\n    if((r >> 8) != (r & 255) || (g >> 8) != (g & 255) || (b >> 8) != (b & 255)) return 82;\n    for(i = 0; i < mode_out->palettesize; i++) {\n      unsigned j = i * 4;\n      if((r >> 8) == mode_out->palette[j + 0] && (g >> 8) == mode_out->palette[j + 1] &&\n          (b >> 8) == mode_out->palette[j + 2]) {\n        *r_out = i;\n        return 0;\n      }\n    }\n    return 82;\n  } else {\n    return 31;\n  }\n\n  return 0;\n}\n\n#ifdef LODEPNG_COMPILE_ENCODER\n\nvoid lodepng_color_stats_init(LodePNGColorStats* stats) {\n  /*stats*/\n  stats->colored = 0;\n  stats->key = 0;\n  stats->key_r = stats->key_g = stats->key_b = 0;\n  stats->alpha = 0;\n  stats->numcolors = 0;\n  stats->bits = 1;\n  stats->numpixels = 0;\n  /*settings*/\n  stats->allow_palette = 1;\n  stats->allow_greyscale = 1;\n}\n\n/*function used for debug purposes with C++*/\n/*void printColorStats(LodePNGColorStats* p) {\n  std::cout << \"colored: \" << (int)p->colored << \", \";\n  std::cout << \"key: \" << (int)p->key << \", \";\n  std::cout << \"key_r: \" << (int)p->key_r << \", \";\n  std::cout << \"key_g: \" << (int)p->key_g << \", \";\n  std::cout << \"key_b: \" << (int)p->key_b << \", \";\n  std::cout << \"alpha: \" << (int)p->alpha << \", \";\n  std::cout << \"numcolors: \" << (int)p->numcolors << \", \";\n  std::cout << \"bits: \" << (int)p->bits << std::endl;\n}*/\n\n/*Returns how many bits needed to represent given value (max 8 bit)*/\nstatic unsigned getValueRequiredBits(unsigned char value) {\n  if(value == 0 || value == 255) return 1;\n  /*The scaling of 2-bit and 4-bit values uses multiples of 85 and 17*/\n  if(value % 17 == 0) return value % 85 == 0 ? 2 : 4;\n  return 8;\n}\n\n/*stats must already have been inited. */\nunsigned lodepng_compute_color_stats(LodePNGColorStats* stats,\n                                     const unsigned char* in, unsigned w, unsigned h,\n                                     const LodePNGColorMode* mode_in) {\n  size_t i;\n  ColorTree tree;\n  size_t numpixels = (size_t)w * (size_t)h;\n  unsigned error = 0;\n\n  /* mark things as done already if it would be impossible to have a more expensive case */\n  unsigned colored_done = lodepng_is_greyscale_type(mode_in) ? 1 : 0;\n  unsigned alpha_done = lodepng_can_have_alpha(mode_in) ? 0 : 1;\n  unsigned numcolors_done = 0;\n  unsigned bpp = lodepng_get_bpp(mode_in);\n  unsigned bits_done = (stats->bits == 1 && bpp == 1) ? 1 : 0;\n  unsigned sixteen = 0; /* whether the input image is 16 bit */\n  unsigned maxnumcolors = 257;\n  if(bpp <= 8) maxnumcolors = LODEPNG_MIN(257, stats->numcolors + (1u << bpp));\n\n  stats->numpixels += numpixels;\n\n  /*if palette not allowed, no need to compute numcolors*/\n  if(!stats->allow_palette) numcolors_done = 1;\n\n  color_tree_init(&tree);\n\n  /*If the stats was already filled in from previous data, fill its palette in tree\n  and mark things as done already if we know they are the most expensive case already*/\n  if(stats->alpha) alpha_done = 1;\n  if(stats->colored) colored_done = 1;\n  if(stats->bits == 16) numcolors_done = 1;\n  if(stats->bits >= bpp) bits_done = 1;\n  if(stats->numcolors >= maxnumcolors) numcolors_done = 1;\n\n  if(!numcolors_done) {\n    for(i = 0; i < stats->numcolors; i++) {\n      const unsigned char* color = &stats->palette[i * 4];\n      error = color_tree_add(&tree, color[0], color[1], color[2], color[3], i);\n      if(error) goto cleanup;\n    }\n  }\n\n  /*Check if the 16-bit input is truly 16-bit*/\n  if(mode_in->bitdepth == 16 && !sixteen) {\n    unsigned short r = 0, g = 0, b = 0, a = 0;\n    for(i = 0; i != numpixels; ++i) {\n      getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in);\n      if((r & 255) != ((r >> 8) & 255) || (g & 255) != ((g >> 8) & 255) ||\n         (b & 255) != ((b >> 8) & 255) || (a & 255) != ((a >> 8) & 255)) /*first and second byte differ*/ {\n        stats->bits = 16;\n        sixteen = 1;\n        bits_done = 1;\n        numcolors_done = 1; /*counting colors no longer useful, palette doesn't support 16-bit*/\n        break;\n      }\n    }\n  }\n\n  if(sixteen) {\n    unsigned short r = 0, g = 0, b = 0, a = 0;\n\n    for(i = 0; i != numpixels; ++i) {\n      getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in);\n\n      if(!colored_done && (r != g || r != b)) {\n        stats->colored = 1;\n        colored_done = 1;\n      }\n\n      if(!alpha_done) {\n        unsigned matchkey = (r == stats->key_r && g == stats->key_g && b == stats->key_b);\n        if(a != 65535 && (a != 0 || (stats->key && !matchkey))) {\n          stats->alpha = 1;\n          stats->key = 0;\n          alpha_done = 1;\n        } else if(a == 0 && !stats->alpha && !stats->key) {\n          stats->key = 1;\n          stats->key_r = r;\n          stats->key_g = g;\n          stats->key_b = b;\n        } else if(a == 65535 && stats->key && matchkey) {\n          /* Color key cannot be used if an opaque pixel also has that RGB color. */\n          stats->alpha = 1;\n          stats->key = 0;\n          alpha_done = 1;\n        }\n      }\n      if(alpha_done && numcolors_done && colored_done && bits_done) break;\n    }\n\n    if(stats->key && !stats->alpha) {\n      for(i = 0; i != numpixels; ++i) {\n        getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in);\n        if(a != 0 && r == stats->key_r && g == stats->key_g && b == stats->key_b) {\n          /* Color key cannot be used if an opaque pixel also has that RGB color. */\n          stats->alpha = 1;\n          stats->key = 0;\n          alpha_done = 1;\n        }\n      }\n    }\n  } else /* < 16-bit */ {\n    unsigned char r = 0, g = 0, b = 0, a = 0;\n    for(i = 0; i != numpixels; ++i) {\n      getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in);\n\n      if(!bits_done && stats->bits < 8) {\n        /*only r is checked, < 8 bits is only relevant for grayscale*/\n        unsigned bits = getValueRequiredBits(r);\n        if(bits > stats->bits) stats->bits = bits;\n      }\n      bits_done = (stats->bits >= bpp);\n\n      if(!colored_done && (r != g || r != b)) {\n        stats->colored = 1;\n        colored_done = 1;\n        if(stats->bits < 8) stats->bits = 8; /*PNG has no colored modes with less than 8-bit per channel*/\n      }\n\n      if(!alpha_done) {\n        unsigned matchkey = (r == stats->key_r && g == stats->key_g && b == stats->key_b);\n        if(a != 255 && (a != 0 || (stats->key && !matchkey))) {\n          stats->alpha = 1;\n          stats->key = 0;\n          alpha_done = 1;\n          if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/\n        } else if(a == 0 && !stats->alpha && !stats->key) {\n          stats->key = 1;\n          stats->key_r = r;\n          stats->key_g = g;\n          stats->key_b = b;\n        } else if(a == 255 && stats->key && matchkey) {\n          /* Color key cannot be used if an opaque pixel also has that RGB color. */\n          stats->alpha = 1;\n          stats->key = 0;\n          alpha_done = 1;\n          if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/\n        }\n      }\n\n      if(!numcolors_done) {\n        if(!color_tree_has(&tree, r, g, b, a)) {\n          error = color_tree_add(&tree, r, g, b, a, stats->numcolors);\n          if(error) goto cleanup;\n          if(stats->numcolors < 256) {\n            unsigned char* p = stats->palette;\n            unsigned n = stats->numcolors;\n            p[n * 4 + 0] = r;\n            p[n * 4 + 1] = g;\n            p[n * 4 + 2] = b;\n            p[n * 4 + 3] = a;\n          }\n          ++stats->numcolors;\n          numcolors_done = stats->numcolors >= maxnumcolors;\n        }\n      }\n\n      if(alpha_done && numcolors_done && colored_done && bits_done) break;\n    }\n\n    if(stats->key && !stats->alpha) {\n      for(i = 0; i != numpixels; ++i) {\n        getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in);\n        if(a != 0 && r == stats->key_r && g == stats->key_g && b == stats->key_b) {\n          /* Color key cannot be used if an opaque pixel also has that RGB color. */\n          stats->alpha = 1;\n          stats->key = 0;\n          alpha_done = 1;\n          if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/\n        }\n      }\n    }\n\n    /*make the stats's key always 16-bit for consistency - repeat each byte twice*/\n    stats->key_r += (stats->key_r << 8);\n    stats->key_g += (stats->key_g << 8);\n    stats->key_b += (stats->key_b << 8);\n  }\n\ncleanup:\n  color_tree_cleanup(&tree);\n  return error;\n}\n\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n/*Adds a single color to the color stats. The stats must already have been inited. The color must be given as 16-bit\n(with 2 bytes repeating for 8-bit and 65535 for opaque alpha channel). This function is expensive, do not call it for\nall pixels of an image but only for a few additional values. */\nstatic unsigned lodepng_color_stats_add(LodePNGColorStats* stats,\n                                        unsigned r, unsigned g, unsigned b, unsigned a) {\n  unsigned error = 0;\n  unsigned char image[8];\n  LodePNGColorMode mode;\n  lodepng_color_mode_init(&mode);\n  image[0] = r >> 8; image[1] = r; image[2] = g >> 8; image[3] = g;\n  image[4] = b >> 8; image[5] = b; image[6] = a >> 8; image[7] = a;\n  mode.bitdepth = 16;\n  mode.colortype = LCT_RGBA;\n  error = lodepng_compute_color_stats(stats, image, 1, 1, &mode);\n  lodepng_color_mode_cleanup(&mode);\n  return error;\n}\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n\n/*Computes a minimal PNG color model that can contain all colors as indicated by the stats.\nThe stats should be computed with lodepng_compute_color_stats.\nmode_in is raw color profile of the image the stats were computed on, to copy palette order from when relevant.\nMinimal PNG color model means the color type and bit depth that gives smallest amount of bits in the output image,\ne.g. gray if only grayscale pixels, palette if less than 256 colors, color key if only single transparent color, ...\nThis is used if auto_convert is enabled (it is by default).\n*/\nstatic unsigned auto_choose_color(LodePNGColorMode* mode_out,\n                                  const LodePNGColorMode* mode_in,\n                                  const LodePNGColorStats* stats) {\n  unsigned error = 0;\n  unsigned palettebits;\n  size_t i, n;\n  size_t numpixels = stats->numpixels;\n  unsigned palette_ok, gray_ok;\n\n  unsigned alpha = stats->alpha;\n  unsigned key = stats->key;\n  unsigned bits = stats->bits;\n\n  mode_out->key_defined = 0;\n\n  if(key && numpixels <= 16) {\n    alpha = 1; /*too few pixels to justify tRNS chunk overhead*/\n    key = 0;\n    if(bits < 8) bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/\n  }\n\n  gray_ok = !stats->colored;\n  if(!stats->allow_greyscale) gray_ok = 0;\n  if(!gray_ok && bits < 8) bits = 8;\n\n  n = stats->numcolors;\n  palettebits = n <= 2 ? 1 : (n <= 4 ? 2 : (n <= 16 ? 4 : 8));\n  palette_ok = n <= 256 && bits <= 8 && n != 0; /*n==0 means likely numcolors wasn't computed*/\n  if(numpixels < n * 2) palette_ok = 0; /*don't add palette overhead if image has only a few pixels*/\n  if(gray_ok && !alpha && bits <= palettebits) palette_ok = 0; /*gray is less overhead*/\n  if(!stats->allow_palette) palette_ok = 0;\n\n  if(palette_ok) {\n    const unsigned char* p = stats->palette;\n    lodepng_palette_clear(mode_out); /*remove potential earlier palette*/\n    for(i = 0; i != stats->numcolors; ++i) {\n      error = lodepng_palette_add(mode_out, p[i * 4 + 0], p[i * 4 + 1], p[i * 4 + 2], p[i * 4 + 3]);\n      if(error) break;\n    }\n\n    mode_out->colortype = LCT_PALETTE;\n    mode_out->bitdepth = palettebits;\n\n    if(mode_in->colortype == LCT_PALETTE && mode_in->palettesize >= mode_out->palettesize\n        && mode_in->bitdepth == mode_out->bitdepth) {\n      /*If input should have same palette colors, keep original to preserve its order and prevent conversion*/\n      lodepng_color_mode_cleanup(mode_out);\n      lodepng_color_mode_copy(mode_out, mode_in);\n    }\n  } else /*8-bit or 16-bit per channel*/ {\n    mode_out->bitdepth = bits;\n    mode_out->colortype = alpha ? (gray_ok ? LCT_GREY_ALPHA : LCT_RGBA)\n                                : (gray_ok ? LCT_GREY : LCT_RGB);\n    if(key) {\n      unsigned mask = (1u << mode_out->bitdepth) - 1u; /*stats always uses 16-bit, mask converts it*/\n      mode_out->key_r = stats->key_r & mask;\n      mode_out->key_g = stats->key_g & mask;\n      mode_out->key_b = stats->key_b & mask;\n      mode_out->key_defined = 1;\n    }\n  }\n\n  return error;\n}\n\n#endif /* #ifdef LODEPNG_COMPILE_ENCODER */\n\n/*\nPaeth predictor, used by PNG filter type 4\nThe parameters are of type short, but should come from unsigned chars, the shorts\nare only needed to make the paeth calculation correct.\n*/\nstatic unsigned char paethPredictor(short a, short b, short c) {\n  short pa = LODEPNG_ABS(b - c);\n  short pb = LODEPNG_ABS(a - c);\n  short pc = LODEPNG_ABS(a + b - c - c);\n  /* return input value associated with smallest of pa, pb, pc (with certain priority if equal) */\n  if(pb < pa) { a = b; pa = pb; }\n  return (pc < pa) ? c : a;\n}\n\n/*shared values used by multiple Adam7 related functions*/\n\nstatic const unsigned ADAM7_IX[7] = { 0, 4, 0, 2, 0, 1, 0 }; /*x start values*/\nstatic const unsigned ADAM7_IY[7] = { 0, 0, 4, 0, 2, 0, 1 }; /*y start values*/\nstatic const unsigned ADAM7_DX[7] = { 8, 8, 4, 4, 2, 2, 1 }; /*x delta values*/\nstatic const unsigned ADAM7_DY[7] = { 8, 8, 8, 4, 4, 2, 2 }; /*y delta values*/\n\n/*\nOutputs various dimensions and positions in the image related to the Adam7 reduced images.\npassw: output containing the width of the 7 passes\npassh: output containing the height of the 7 passes\nfilter_passstart: output containing the index of the start and end of each\n reduced image with filter bytes\npadded_passstart output containing the index of the start and end of each\n reduced image when without filter bytes but with padded scanlines\npassstart: output containing the index of the start and end of each reduced\n image without padding between scanlines, but still padding between the images\nw, h: width and height of non-interlaced image\nbpp: bits per pixel\n\"padded\" is only relevant if bpp is less than 8 and a scanline or image does not\n end at a full byte\n*/\nstatic void Adam7_getpassvalues(unsigned passw[7], unsigned passh[7], size_t filter_passstart[8],\n                                size_t padded_passstart[8], size_t passstart[8], unsigned w, unsigned h, unsigned bpp) {\n  /*the passstart values have 8 values: the 8th one indicates the byte after the end of the 7th (= last) pass*/\n  unsigned i;\n\n  /*calculate width and height in pixels of each pass*/\n  for(i = 0; i != 7; ++i) {\n    passw[i] = (w + ADAM7_DX[i] - ADAM7_IX[i] - 1) / ADAM7_DX[i];\n    passh[i] = (h + ADAM7_DY[i] - ADAM7_IY[i] - 1) / ADAM7_DY[i];\n    if(passw[i] == 0) passh[i] = 0;\n    if(passh[i] == 0) passw[i] = 0;\n  }\n\n  filter_passstart[0] = padded_passstart[0] = passstart[0] = 0;\n  for(i = 0; i != 7; ++i) {\n    /*if passw[i] is 0, it's 0 bytes, not 1 (no filtertype-byte)*/\n    filter_passstart[i + 1] = filter_passstart[i]\n                            + ((passw[i] && passh[i]) ? passh[i] * (1u + (passw[i] * bpp + 7u) / 8u) : 0);\n    /*bits padded if needed to fill full byte at end of each scanline*/\n    padded_passstart[i + 1] = padded_passstart[i] + passh[i] * ((passw[i] * bpp + 7u) / 8u);\n    /*only padded at end of reduced image*/\n    passstart[i + 1] = passstart[i] + (passh[i] * passw[i] * bpp + 7u) / 8u;\n  }\n}\n\n#ifdef LODEPNG_COMPILE_DECODER\n\n/* ////////////////////////////////////////////////////////////////////////// */\n/* / PNG Decoder                                                            / */\n/* ////////////////////////////////////////////////////////////////////////// */\n\n/*read the information from the header and store it in the LodePNGInfo. return value is error*/\nunsigned lodepng_inspect(unsigned* w, unsigned* h, LodePNGState* state,\n                         const unsigned char* in, size_t insize) {\n  unsigned width, height;\n  LodePNGInfo* info = &state->info_png;\n  if(insize == 0 || in == 0) {\n    CERROR_RETURN_ERROR(state->error, 48); /*error: the given data is empty*/\n  }\n  if(insize < 33) {\n    CERROR_RETURN_ERROR(state->error, 27); /*error: the data length is smaller than the length of a PNG header*/\n  }\n\n  /*when decoding a new PNG image, make sure all parameters created after previous decoding are reset*/\n  /* TODO: remove this. One should use a new LodePNGState for new sessions */\n  lodepng_info_cleanup(info);\n  lodepng_info_init(info);\n\n  if(in[0] != 137 || in[1] != 80 || in[2] != 78 || in[3] != 71\n     || in[4] != 13 || in[5] != 10 || in[6] != 26 || in[7] != 10) {\n    CERROR_RETURN_ERROR(state->error, 28); /*error: the first 8 bytes are not the correct PNG signature*/\n  }\n  if(lodepng_chunk_length(in + 8) != 13) {\n    CERROR_RETURN_ERROR(state->error, 94); /*error: header size must be 13 bytes*/\n  }\n  if(!lodepng_chunk_type_equals(in + 8, \"IHDR\")) {\n    CERROR_RETURN_ERROR(state->error, 29); /*error: it doesn't start with a IHDR chunk!*/\n  }\n\n  /*read the values given in the header*/\n  width = lodepng_read32bitInt(&in[16]);\n  height = lodepng_read32bitInt(&in[20]);\n  /*TODO: remove the undocumented feature that allows to give null pointers to width or height*/\n  if(w) *w = width;\n  if(h) *h = height;\n  info->color.bitdepth = in[24];\n  info->color.colortype = (LodePNGColorType)in[25];\n  info->compression_method = in[26];\n  info->filter_method = in[27];\n  info->interlace_method = in[28];\n\n  /*errors returned only after the parsing so other values are still output*/\n\n  /*error: invalid image size*/\n  if(width == 0 || height == 0) CERROR_RETURN_ERROR(state->error, 93);\n  /*error: invalid colortype or bitdepth combination*/\n  state->error = checkColorValidity(info->color.colortype, info->color.bitdepth);\n  if(state->error) return state->error;\n  /*error: only compression method 0 is allowed in the specification*/\n  if(info->compression_method != 0) CERROR_RETURN_ERROR(state->error, 32);\n  /*error: only filter method 0 is allowed in the specification*/\n  if(info->filter_method != 0) CERROR_RETURN_ERROR(state->error, 33);\n  /*error: only interlace methods 0 and 1 exist in the specification*/\n  if(info->interlace_method > 1) CERROR_RETURN_ERROR(state->error, 34);\n\n  if(!state->decoder.ignore_crc) {\n    unsigned CRC = lodepng_read32bitInt(&in[29]);\n    unsigned checksum = lodepng_crc32(&in[12], 17);\n    if(CRC != checksum) {\n      CERROR_RETURN_ERROR(state->error, 57); /*invalid CRC*/\n    }\n  }\n\n  return state->error;\n}\n\nstatic unsigned unfilterScanline(unsigned char* recon, const unsigned char* scanline, const unsigned char* precon,\n                                 size_t bytewidth, unsigned char filterType, size_t length) {\n  /*\n  For PNG filter method 0\n  unfilter a PNG image scanline by scanline. when the pixels are smaller than 1 byte,\n  the filter works byte per byte (bytewidth = 1)\n  precon is the previous unfiltered scanline, recon the result, scanline the current one\n  the incoming scanlines do NOT include the filtertype byte, that one is given in the parameter filterType instead\n  recon and scanline MAY be the same memory address! precon must be disjoint.\n  */\n\n  size_t i;\n  switch(filterType) {\n    case 0:\n      for(i = 0; i != length; ++i) recon[i] = scanline[i];\n      break;\n    case 1: {\n      size_t j = 0;\n      for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i];\n      for(i = bytewidth; i != length; ++i, ++j) recon[i] = scanline[i] + recon[j];\n      break;\n    }\n    case 2:\n      if(precon) {\n        for(i = 0; i != length; ++i) recon[i] = scanline[i] + precon[i];\n      } else {\n        for(i = 0; i != length; ++i) recon[i] = scanline[i];\n      }\n      break;\n    case 3:\n      if(precon) {\n        size_t j = 0;\n        for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i] + (precon[i] >> 1u);\n        /* Unroll independent paths of this predictor. A 6x and 8x version is also possible but that adds\n        too much code. Whether this speeds up anything depends on compiler and settings. */\n        if(bytewidth >= 4) {\n          for(; i + 3 < length; i += 4, j += 4) {\n            unsigned char s0 = scanline[i + 0], r0 = recon[j + 0], p0 = precon[i + 0];\n            unsigned char s1 = scanline[i + 1], r1 = recon[j + 1], p1 = precon[i + 1];\n            unsigned char s2 = scanline[i + 2], r2 = recon[j + 2], p2 = precon[i + 2];\n            unsigned char s3 = scanline[i + 3], r3 = recon[j + 3], p3 = precon[i + 3];\n            recon[i + 0] = s0 + ((r0 + p0) >> 1u);\n            recon[i + 1] = s1 + ((r1 + p1) >> 1u);\n            recon[i + 2] = s2 + ((r2 + p2) >> 1u);\n            recon[i + 3] = s3 + ((r3 + p3) >> 1u);\n          }\n        } else if(bytewidth >= 3) {\n          for(; i + 2 < length; i += 3, j += 3) {\n            unsigned char s0 = scanline[i + 0], r0 = recon[j + 0], p0 = precon[i + 0];\n            unsigned char s1 = scanline[i + 1], r1 = recon[j + 1], p1 = precon[i + 1];\n            unsigned char s2 = scanline[i + 2], r2 = recon[j + 2], p2 = precon[i + 2];\n            recon[i + 0] = s0 + ((r0 + p0) >> 1u);\n            recon[i + 1] = s1 + ((r1 + p1) >> 1u);\n            recon[i + 2] = s2 + ((r2 + p2) >> 1u);\n          }\n        } else if(bytewidth >= 2) {\n          for(; i + 1 < length; i += 2, j += 2) {\n            unsigned char s0 = scanline[i + 0], r0 = recon[j + 0], p0 = precon[i + 0];\n            unsigned char s1 = scanline[i + 1], r1 = recon[j + 1], p1 = precon[i + 1];\n            recon[i + 0] = s0 + ((r0 + p0) >> 1u);\n            recon[i + 1] = s1 + ((r1 + p1) >> 1u);\n          }\n        }\n        for(; i != length; ++i, ++j) recon[i] = scanline[i] + ((recon[j] + precon[i]) >> 1u);\n      } else {\n        size_t j = 0;\n        for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i];\n        for(i = bytewidth; i != length; ++i, ++j) recon[i] = scanline[i] + (recon[j] >> 1u);\n      }\n      break;\n    case 4:\n      if(precon) {\n        size_t j = 0;\n        for(i = 0; i != bytewidth; ++i) {\n          recon[i] = (scanline[i] + precon[i]); /*paethPredictor(0, precon[i], 0) is always precon[i]*/\n        }\n\n        /* Unroll independent paths of the paeth predictor. A 6x and 8x version is also possible but that\n        adds too much code. Whether this speeds up anything depends on compiler and settings. */\n        if(bytewidth >= 4) {\n          for(; i + 3 < length; i += 4, j += 4) {\n            unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1], s2 = scanline[i + 2], s3 = scanline[i + 3];\n            unsigned char r0 = recon[j + 0], r1 = recon[j + 1], r2 = recon[j + 2], r3 = recon[j + 3];\n            unsigned char p0 = precon[i + 0], p1 = precon[i + 1], p2 = precon[i + 2], p3 = precon[i + 3];\n            unsigned char q0 = precon[j + 0], q1 = precon[j + 1], q2 = precon[j + 2], q3 = precon[j + 3];\n            recon[i + 0] = s0 + paethPredictor(r0, p0, q0);\n            recon[i + 1] = s1 + paethPredictor(r1, p1, q1);\n            recon[i + 2] = s2 + paethPredictor(r2, p2, q2);\n            recon[i + 3] = s3 + paethPredictor(r3, p3, q3);\n          }\n        } else if(bytewidth >= 3) {\n          for(; i + 2 < length; i += 3, j += 3) {\n            unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1], s2 = scanline[i + 2];\n            unsigned char r0 = recon[j + 0], r1 = recon[j + 1], r2 = recon[j + 2];\n            unsigned char p0 = precon[i + 0], p1 = precon[i + 1], p2 = precon[i + 2];\n            unsigned char q0 = precon[j + 0], q1 = precon[j + 1], q2 = precon[j + 2];\n            recon[i + 0] = s0 + paethPredictor(r0, p0, q0);\n            recon[i + 1] = s1 + paethPredictor(r1, p1, q1);\n            recon[i + 2] = s2 + paethPredictor(r2, p2, q2);\n          }\n        } else if(bytewidth >= 2) {\n          for(; i + 1 < length; i += 2, j += 2) {\n            unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1];\n            unsigned char r0 = recon[j + 0], r1 = recon[j + 1];\n            unsigned char p0 = precon[i + 0], p1 = precon[i + 1];\n            unsigned char q0 = precon[j + 0], q1 = precon[j + 1];\n            recon[i + 0] = s0 + paethPredictor(r0, p0, q0);\n            recon[i + 1] = s1 + paethPredictor(r1, p1, q1);\n          }\n        }\n\n        for(; i != length; ++i, ++j) {\n          recon[i] = (scanline[i] + paethPredictor(recon[i - bytewidth], precon[i], precon[j]));\n        }\n      } else {\n        size_t j = 0;\n        for(i = 0; i != bytewidth; ++i) {\n          recon[i] = scanline[i];\n        }\n        for(i = bytewidth; i != length; ++i, ++j) {\n          /*paethPredictor(recon[i - bytewidth], 0, 0) is always recon[i - bytewidth]*/\n          recon[i] = (scanline[i] + recon[j]);\n        }\n      }\n      break;\n    default: return 36; /*error: invalid filter type given*/\n  }\n  return 0;\n}\n\nstatic unsigned unfilter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) {\n  /*\n  For PNG filter method 0\n  this function unfilters a single image (e.g. without interlacing this is called once, with Adam7 seven times)\n  out must have enough bytes allocated already, in must have the scanlines + 1 filtertype byte per scanline\n  w and h are image dimensions or dimensions of reduced image, bpp is bits per pixel\n  in and out are allowed to be the same memory address (but aren't the same size since in has the extra filter bytes)\n  */\n\n  unsigned y;\n  unsigned char* prevline = 0;\n\n  /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/\n  size_t bytewidth = (bpp + 7u) / 8u;\n  /*the width of a scanline in bytes, not including the filter type*/\n  size_t linebytes = lodepng_get_raw_size_idat(w, 1, bpp) - 1u;\n\n  for(y = 0; y < h; ++y) {\n    size_t outindex = linebytes * y;\n    size_t inindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/\n    unsigned char filterType = in[inindex];\n\n    CERROR_TRY_RETURN(unfilterScanline(&out[outindex], &in[inindex + 1], prevline, bytewidth, filterType, linebytes));\n\n    prevline = &out[outindex];\n  }\n\n  return 0;\n}\n\n/*\nin: Adam7 interlaced image, with no padding bits between scanlines, but between\n reduced images so that each reduced image starts at a byte.\nout: the same pixels, but re-ordered so that they're now a non-interlaced image with size w*h\nbpp: bits per pixel\nout has the following size in bits: w * h * bpp.\nin is possibly bigger due to padding bits between reduced images.\nout must be big enough AND must be 0 everywhere if bpp < 8 in the current implementation\n(because that's likely a little bit faster)\nNOTE: comments about padding bits are only relevant if bpp < 8\n*/\nstatic void Adam7_deinterlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) {\n  unsigned passw[7], passh[7];\n  size_t filter_passstart[8], padded_passstart[8], passstart[8];\n  unsigned i;\n\n  Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp);\n\n  if(bpp >= 8) {\n    for(i = 0; i != 7; ++i) {\n      unsigned x, y, b;\n      size_t bytewidth = bpp / 8u;\n      for(y = 0; y < passh[i]; ++y)\n      for(x = 0; x < passw[i]; ++x) {\n        size_t pixelinstart = passstart[i] + (y * passw[i] + x) * bytewidth;\n        size_t pixeloutstart = ((ADAM7_IY[i] + (size_t)y * ADAM7_DY[i]) * (size_t)w\n                             + ADAM7_IX[i] + (size_t)x * ADAM7_DX[i]) * bytewidth;\n        for(b = 0; b < bytewidth; ++b) {\n          out[pixeloutstart + b] = in[pixelinstart + b];\n        }\n      }\n    }\n  } else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ {\n    for(i = 0; i != 7; ++i) {\n      unsigned x, y, b;\n      unsigned ilinebits = bpp * passw[i];\n      unsigned olinebits = bpp * w;\n      size_t obp, ibp; /*bit pointers (for out and in buffer)*/\n      for(y = 0; y < passh[i]; ++y)\n      for(x = 0; x < passw[i]; ++x) {\n        ibp = (8 * passstart[i]) + (y * ilinebits + x * bpp);\n        obp = (ADAM7_IY[i] + (size_t)y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + (size_t)x * ADAM7_DX[i]) * bpp;\n        for(b = 0; b < bpp; ++b) {\n          unsigned char bit = readBitFromReversedStream(&ibp, in);\n          setBitOfReversedStream(&obp, out, bit);\n        }\n      }\n    }\n  }\n}\n\nstatic void removePaddingBits(unsigned char* out, const unsigned char* in,\n                              size_t olinebits, size_t ilinebits, unsigned h) {\n  /*\n  After filtering there are still padding bits if scanlines have non multiple of 8 bit amounts. They need\n  to be removed (except at last scanline of (Adam7-reduced) image) before working with pure image buffers\n  for the Adam7 code, the color convert code and the output to the user.\n  in and out are allowed to be the same buffer, in may also be higher but still overlapping; in must\n  have >= ilinebits*h bits, out must have >= olinebits*h bits, olinebits must be <= ilinebits\n  also used to move bits after earlier such operations happened, e.g. in a sequence of reduced images from Adam7\n  only useful if (ilinebits - olinebits) is a value in the range 1..7\n  */\n  unsigned y;\n  size_t diff = ilinebits - olinebits;\n  size_t ibp = 0, obp = 0; /*input and output bit pointers*/\n  for(y = 0; y < h; ++y) {\n    size_t x;\n    for(x = 0; x < olinebits; ++x) {\n      unsigned char bit = readBitFromReversedStream(&ibp, in);\n      setBitOfReversedStream(&obp, out, bit);\n    }\n    ibp += diff;\n  }\n}\n\n/*out must be buffer big enough to contain full image, and in must contain the full decompressed data from\nthe IDAT chunks (with filter index bytes and possible padding bits)\nreturn value is error*/\nstatic unsigned postProcessScanlines(unsigned char* out, unsigned char* in,\n                                     unsigned w, unsigned h, const LodePNGInfo* info_png) {\n  /*\n  This function converts the filtered-padded-interlaced data into pure 2D image buffer with the PNG's colortype.\n  Steps:\n  *) if no Adam7: 1) unfilter 2) remove padding bits (= possible extra bits per scanline if bpp < 8)\n  *) if adam7: 1) 7x unfilter 2) 7x remove padding bits 3) Adam7_deinterlace\n  NOTE: the in buffer will be overwritten with intermediate data!\n  */\n  unsigned bpp = lodepng_get_bpp(&info_png->color);\n  if(bpp == 0) return 31; /*error: invalid colortype*/\n\n  if(info_png->interlace_method == 0) {\n    if(bpp < 8 && w * bpp != ((w * bpp + 7u) / 8u) * 8u) {\n      CERROR_TRY_RETURN(unfilter(in, in, w, h, bpp));\n      removePaddingBits(out, in, w * bpp, ((w * bpp + 7u) / 8u) * 8u, h);\n    }\n    /*we can immediately filter into the out buffer, no other steps needed*/\n    else CERROR_TRY_RETURN(unfilter(out, in, w, h, bpp));\n  } else /*interlace_method is 1 (Adam7)*/ {\n    unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8];\n    unsigned i;\n\n    Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp);\n\n    for(i = 0; i != 7; ++i) {\n      CERROR_TRY_RETURN(unfilter(&in[padded_passstart[i]], &in[filter_passstart[i]], passw[i], passh[i], bpp));\n      /*TODO: possible efficiency improvement: if in this reduced image the bits fit nicely in 1 scanline,\n      move bytes instead of bits or move not at all*/\n      if(bpp < 8) {\n        /*remove padding bits in scanlines; after this there still may be padding\n        bits between the different reduced images: each reduced image still starts nicely at a byte*/\n        removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]], passw[i] * bpp,\n                          ((passw[i] * bpp + 7u) / 8u) * 8u, passh[i]);\n      }\n    }\n\n    Adam7_deinterlace(out, in, w, h, bpp);\n  }\n\n  return 0;\n}\n\nstatic unsigned readChunk_PLTE(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) {\n  unsigned pos = 0, i;\n  color->palettesize = chunkLength / 3u;\n  if(color->palettesize == 0 || color->palettesize > 256) return 38; /*error: palette too small or big*/\n  lodepng_color_mode_alloc_palette(color);\n  if(!color->palette && color->palettesize) {\n    color->palettesize = 0;\n    return 83; /*alloc fail*/\n  }\n\n  for(i = 0; i != color->palettesize; ++i) {\n    color->palette[4 * i + 0] = data[pos++]; /*R*/\n    color->palette[4 * i + 1] = data[pos++]; /*G*/\n    color->palette[4 * i + 2] = data[pos++]; /*B*/\n    color->palette[4 * i + 3] = 255; /*alpha*/\n  }\n\n  return 0; /* OK */\n}\n\nstatic unsigned readChunk_tRNS(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) {\n  unsigned i;\n  if(color->colortype == LCT_PALETTE) {\n    /*error: more alpha values given than there are palette entries*/\n    if(chunkLength > color->palettesize) return 39;\n\n    for(i = 0; i != chunkLength; ++i) color->palette[4 * i + 3] = data[i];\n  } else if(color->colortype == LCT_GREY) {\n    /*error: this chunk must be 2 bytes for grayscale image*/\n    if(chunkLength != 2) return 30;\n\n    color->key_defined = 1;\n    color->key_r = color->key_g = color->key_b = 256u * data[0] + data[1];\n  } else if(color->colortype == LCT_RGB) {\n    /*error: this chunk must be 6 bytes for RGB image*/\n    if(chunkLength != 6) return 41;\n\n    color->key_defined = 1;\n    color->key_r = 256u * data[0] + data[1];\n    color->key_g = 256u * data[2] + data[3];\n    color->key_b = 256u * data[4] + data[5];\n  }\n  else return 42; /*error: tRNS chunk not allowed for other color models*/\n\n  return 0; /* OK */\n}\n\n\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n/*background color chunk (bKGD)*/\nstatic unsigned readChunk_bKGD(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {\n  if(info->color.colortype == LCT_PALETTE) {\n    /*error: this chunk must be 1 byte for indexed color image*/\n    if(chunkLength != 1) return 43;\n\n    /*error: invalid palette index, or maybe this chunk appeared before PLTE*/\n    if(data[0] >= info->color.palettesize) return 103;\n\n    info->background_defined = 1;\n    info->background_r = info->background_g = info->background_b = data[0];\n  } else if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) {\n    /*error: this chunk must be 2 bytes for grayscale image*/\n    if(chunkLength != 2) return 44;\n\n    /*the values are truncated to bitdepth in the PNG file*/\n    info->background_defined = 1;\n    info->background_r = info->background_g = info->background_b = 256u * data[0] + data[1];\n  } else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) {\n    /*error: this chunk must be 6 bytes for grayscale image*/\n    if(chunkLength != 6) return 45;\n\n    /*the values are truncated to bitdepth in the PNG file*/\n    info->background_defined = 1;\n    info->background_r = 256u * data[0] + data[1];\n    info->background_g = 256u * data[2] + data[3];\n    info->background_b = 256u * data[4] + data[5];\n  }\n\n  return 0; /* OK */\n}\n\n/*text chunk (tEXt)*/\nstatic unsigned readChunk_tEXt(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {\n  unsigned error = 0;\n  char *key = 0, *str = 0;\n\n  while(!error) /*not really a while loop, only used to break on error*/ {\n    unsigned length, string2_begin;\n\n    length = 0;\n    while(length < chunkLength && data[length] != 0) ++length;\n    /*even though it's not allowed by the standard, no error is thrown if\n    there's no null termination char, if the text is empty*/\n    if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/\n\n    key = (char*)lodepng_malloc(length + 1);\n    if(!key) CERROR_BREAK(error, 83); /*alloc fail*/\n\n    lodepng_memcpy(key, data, length);\n    key[length] = 0;\n\n    string2_begin = length + 1; /*skip keyword null terminator*/\n\n    length = (unsigned)(chunkLength < string2_begin ? 0 : chunkLength - string2_begin);\n    str = (char*)lodepng_malloc(length + 1);\n    if(!str) CERROR_BREAK(error, 83); /*alloc fail*/\n\n    lodepng_memcpy(str, data + string2_begin, length);\n    str[length] = 0;\n\n    error = lodepng_add_text(info, key, str);\n\n    break;\n  }\n\n  lodepng_free(key);\n  lodepng_free(str);\n\n  return error;\n}\n\n/*compressed text chunk (zTXt)*/\nstatic unsigned readChunk_zTXt(LodePNGInfo* info, const LodePNGDecoderSettings* decoder,\n                               const unsigned char* data, size_t chunkLength) {\n  unsigned error = 0;\n\n  /*copy the object to change parameters in it*/\n  LodePNGDecompressSettings zlibsettings = decoder->zlibsettings;\n\n  unsigned length, string2_begin;\n  char *key = 0;\n  unsigned char* str = 0;\n  size_t size = 0;\n\n  while(!error) /*not really a while loop, only used to break on error*/ {\n    for(length = 0; length < chunkLength && data[length] != 0; ++length) ;\n    if(length + 2 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/\n    if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/\n\n    key = (char*)lodepng_malloc(length + 1);\n    if(!key) CERROR_BREAK(error, 83); /*alloc fail*/\n\n    lodepng_memcpy(key, data, length);\n    key[length] = 0;\n\n    if(data[length + 1] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/\n\n    string2_begin = length + 2;\n    if(string2_begin > chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/\n\n    length = (unsigned)chunkLength - string2_begin;\n    zlibsettings.max_output_size = decoder->max_text_size;\n    /*will fail if zlib error, e.g. if length is too small*/\n    error = zlib_decompress(&str, &size, 0, &data[string2_begin],\n                            length, &zlibsettings);\n    /*error: compressed text larger than  decoder->max_text_size*/\n    if(error && size > zlibsettings.max_output_size) error = 112;\n    if(error) break;\n    error = lodepng_add_text_sized(info, key, (char*)str, size);\n    break;\n  }\n\n  lodepng_free(key);\n  lodepng_free(str);\n\n  return error;\n}\n\n/*international text chunk (iTXt)*/\nstatic unsigned readChunk_iTXt(LodePNGInfo* info, const LodePNGDecoderSettings* decoder,\n                               const unsigned char* data, size_t chunkLength) {\n  unsigned error = 0;\n  unsigned i;\n\n  /*copy the object to change parameters in it*/\n  LodePNGDecompressSettings zlibsettings = decoder->zlibsettings;\n\n  unsigned length, begin, compressed;\n  char *key = 0, *langtag = 0, *transkey = 0;\n\n  while(!error) /*not really a while loop, only used to break on error*/ {\n    /*Quick check if the chunk length isn't too small. Even without check\n    it'd still fail with other error checks below if it's too short. This just gives a different error code.*/\n    if(chunkLength < 5) CERROR_BREAK(error, 30); /*iTXt chunk too short*/\n\n    /*read the key*/\n    for(length = 0; length < chunkLength && data[length] != 0; ++length) ;\n    if(length + 3 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination char, corrupt?*/\n    if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/\n\n    key = (char*)lodepng_malloc(length + 1);\n    if(!key) CERROR_BREAK(error, 83); /*alloc fail*/\n\n    lodepng_memcpy(key, data, length);\n    key[length] = 0;\n\n    /*read the compression method*/\n    compressed = data[length + 1];\n    if(data[length + 2] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/\n\n    /*even though it's not allowed by the standard, no error is thrown if\n    there's no null termination char, if the text is empty for the next 3 texts*/\n\n    /*read the langtag*/\n    begin = length + 3;\n    length = 0;\n    for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length;\n\n    langtag = (char*)lodepng_malloc(length + 1);\n    if(!langtag) CERROR_BREAK(error, 83); /*alloc fail*/\n\n    lodepng_memcpy(langtag, data + begin, length);\n    langtag[length] = 0;\n\n    /*read the transkey*/\n    begin += length + 1;\n    length = 0;\n    for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length;\n\n    transkey = (char*)lodepng_malloc(length + 1);\n    if(!transkey) CERROR_BREAK(error, 83); /*alloc fail*/\n\n    lodepng_memcpy(transkey, data + begin, length);\n    transkey[length] = 0;\n\n    /*read the actual text*/\n    begin += length + 1;\n\n    length = (unsigned)chunkLength < begin ? 0 : (unsigned)chunkLength - begin;\n\n    if(compressed) {\n      unsigned char* str = 0;\n      size_t size = 0;\n      zlibsettings.max_output_size = decoder->max_text_size;\n      /*will fail if zlib error, e.g. if length is too small*/\n      error = zlib_decompress(&str, &size, 0, &data[begin],\n                              length, &zlibsettings);\n      /*error: compressed text larger than  decoder->max_text_size*/\n      if(error && size > zlibsettings.max_output_size) error = 112;\n      if(!error) error = lodepng_add_itext_sized(info, key, langtag, transkey, (char*)str, size);\n      lodepng_free(str);\n    } else {\n      error = lodepng_add_itext_sized(info, key, langtag, transkey, (char*)(data + begin), length);\n    }\n\n    break;\n  }\n\n  lodepng_free(key);\n  lodepng_free(langtag);\n  lodepng_free(transkey);\n\n  return error;\n}\n\nstatic unsigned readChunk_tIME(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {\n  if(chunkLength != 7) return 73; /*invalid tIME chunk size*/\n\n  info->time_defined = 1;\n  info->time.year = 256u * data[0] + data[1];\n  info->time.month = data[2];\n  info->time.day = data[3];\n  info->time.hour = data[4];\n  info->time.minute = data[5];\n  info->time.second = data[6];\n\n  return 0; /* OK */\n}\n\nstatic unsigned readChunk_pHYs(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {\n  if(chunkLength != 9) return 74; /*invalid pHYs chunk size*/\n\n  info->phys_defined = 1;\n  info->phys_x = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3];\n  info->phys_y = 16777216u * data[4] + 65536u * data[5] + 256u * data[6] + data[7];\n  info->phys_unit = data[8];\n\n  return 0; /* OK */\n}\n\nstatic unsigned readChunk_gAMA(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {\n  if(chunkLength != 4) return 96; /*invalid gAMA chunk size*/\n\n  info->gama_defined = 1;\n  info->gama_gamma = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3];\n\n  return 0; /* OK */\n}\n\nstatic unsigned readChunk_cHRM(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {\n  if(chunkLength != 32) return 97; /*invalid cHRM chunk size*/\n\n  info->chrm_defined = 1;\n  info->chrm_white_x = 16777216u * data[ 0] + 65536u * data[ 1] + 256u * data[ 2] + data[ 3];\n  info->chrm_white_y = 16777216u * data[ 4] + 65536u * data[ 5] + 256u * data[ 6] + data[ 7];\n  info->chrm_red_x   = 16777216u * data[ 8] + 65536u * data[ 9] + 256u * data[10] + data[11];\n  info->chrm_red_y   = 16777216u * data[12] + 65536u * data[13] + 256u * data[14] + data[15];\n  info->chrm_green_x = 16777216u * data[16] + 65536u * data[17] + 256u * data[18] + data[19];\n  info->chrm_green_y = 16777216u * data[20] + 65536u * data[21] + 256u * data[22] + data[23];\n  info->chrm_blue_x  = 16777216u * data[24] + 65536u * data[25] + 256u * data[26] + data[27];\n  info->chrm_blue_y  = 16777216u * data[28] + 65536u * data[29] + 256u * data[30] + data[31];\n\n  return 0; /* OK */\n}\n\nstatic unsigned readChunk_sRGB(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {\n  if(chunkLength != 1) return 98; /*invalid sRGB chunk size (this one is never ignored)*/\n\n  info->srgb_defined = 1;\n  info->srgb_intent = data[0];\n\n  return 0; /* OK */\n}\n\nstatic unsigned readChunk_iCCP(LodePNGInfo* info, const LodePNGDecoderSettings* decoder,\n                               const unsigned char* data, size_t chunkLength) {\n  unsigned error = 0;\n  unsigned i;\n  size_t size = 0;\n  /*copy the object to change parameters in it*/\n  LodePNGDecompressSettings zlibsettings = decoder->zlibsettings;\n\n  unsigned length, string2_begin;\n\n  info->iccp_defined = 1;\n  if(info->iccp_name) lodepng_clear_icc(info);\n\n  for(length = 0; length < chunkLength && data[length] != 0; ++length) ;\n  if(length + 2 >= chunkLength) return 75; /*no null termination, corrupt?*/\n  if(length < 1 || length > 79) return 89; /*keyword too short or long*/\n\n  info->iccp_name = (char*)lodepng_malloc(length + 1);\n  if(!info->iccp_name) return 83; /*alloc fail*/\n\n  info->iccp_name[length] = 0;\n  for(i = 0; i != length; ++i) info->iccp_name[i] = (char)data[i];\n\n  if(data[length + 1] != 0) return 72; /*the 0 byte indicating compression must be 0*/\n\n  string2_begin = length + 2;\n  if(string2_begin > chunkLength) return 75; /*no null termination, corrupt?*/\n\n  length = (unsigned)chunkLength - string2_begin;\n  zlibsettings.max_output_size = decoder->max_icc_size;\n  error = zlib_decompress(&info->iccp_profile, &size, 0,\n                          &data[string2_begin],\n                          length, &zlibsettings);\n  /*error: ICC profile larger than  decoder->max_icc_size*/\n  if(error && size > zlibsettings.max_output_size) error = 113;\n  info->iccp_profile_size = size;\n  if(!error && !info->iccp_profile_size) error = 100; /*invalid ICC profile size*/\n  return error;\n}\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n\nunsigned lodepng_inspect_chunk(LodePNGState* state, size_t pos,\n                               const unsigned char* in, size_t insize) {\n  const unsigned char* chunk = in + pos;\n  unsigned chunkLength;\n  const unsigned char* data;\n  unsigned unhandled = 0;\n  unsigned error = 0;\n\n  if(pos + 4 > insize) return 30;\n  chunkLength = lodepng_chunk_length(chunk);\n  if(chunkLength > 2147483647) return 63;\n  data = lodepng_chunk_data_const(chunk);\n  if(data + chunkLength + 4 > in + insize) return 30;\n\n  if(lodepng_chunk_type_equals(chunk, \"PLTE\")) {\n    error = readChunk_PLTE(&state->info_png.color, data, chunkLength);\n  } else if(lodepng_chunk_type_equals(chunk, \"tRNS\")) {\n    error = readChunk_tRNS(&state->info_png.color, data, chunkLength);\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n  } else if(lodepng_chunk_type_equals(chunk, \"bKGD\")) {\n    error = readChunk_bKGD(&state->info_png, data, chunkLength);\n  } else if(lodepng_chunk_type_equals(chunk, \"tEXt\")) {\n    error = readChunk_tEXt(&state->info_png, data, chunkLength);\n  } else if(lodepng_chunk_type_equals(chunk, \"zTXt\")) {\n    error = readChunk_zTXt(&state->info_png, &state->decoder, data, chunkLength);\n  } else if(lodepng_chunk_type_equals(chunk, \"iTXt\")) {\n    error = readChunk_iTXt(&state->info_png, &state->decoder, data, chunkLength);\n  } else if(lodepng_chunk_type_equals(chunk, \"tIME\")) {\n    error = readChunk_tIME(&state->info_png, data, chunkLength);\n  } else if(lodepng_chunk_type_equals(chunk, \"pHYs\")) {\n    error = readChunk_pHYs(&state->info_png, data, chunkLength);\n  } else if(lodepng_chunk_type_equals(chunk, \"gAMA\")) {\n    error = readChunk_gAMA(&state->info_png, data, chunkLength);\n  } else if(lodepng_chunk_type_equals(chunk, \"cHRM\")) {\n    error = readChunk_cHRM(&state->info_png, data, chunkLength);\n  } else if(lodepng_chunk_type_equals(chunk, \"sRGB\")) {\n    error = readChunk_sRGB(&state->info_png, data, chunkLength);\n  } else if(lodepng_chunk_type_equals(chunk, \"iCCP\")) {\n    error = readChunk_iCCP(&state->info_png, &state->decoder, data, chunkLength);\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n  } else {\n    /* unhandled chunk is ok (is not an error) */\n    unhandled = 1;\n  }\n\n  if(!error && !unhandled && !state->decoder.ignore_crc) {\n    if(lodepng_chunk_check_crc(chunk)) return 57; /*invalid CRC*/\n  }\n\n  return error;\n}\n\n/*read a PNG, the result will be in the same color type as the PNG (hence \"generic\")*/\nstatic void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h,\n                          LodePNGState* state,\n                          const unsigned char* in, size_t insize) {\n  unsigned char IEND = 0;\n  const unsigned char* chunk;\n  unsigned char* idat; /*the data from idat chunks, zlib compressed*/\n  size_t idatsize = 0;\n  unsigned char* scanlines = 0;\n  size_t scanlines_size = 0, expected_size = 0;\n  size_t outsize = 0;\n\n  /*for unknown chunk order*/\n  unsigned unknown = 0;\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n  unsigned critical_pos = 1; /*1 = after IHDR, 2 = after PLTE, 3 = after IDAT*/\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n\n\n  /* safe output values in case error happens */\n  *out = 0;\n  *w = *h = 0;\n\n  state->error = lodepng_inspect(w, h, state, in, insize); /*reads header and resets other parameters in state->info_png*/\n  if(state->error) return;\n\n  if(lodepng_pixel_overflow(*w, *h, &state->info_png.color, &state->info_raw)) {\n    CERROR_RETURN(state->error, 92); /*overflow possible due to amount of pixels*/\n  }\n\n  /*the input filesize is a safe upper bound for the sum of idat chunks size*/\n  idat = (unsigned char*)lodepng_malloc(insize);\n  if(!idat) CERROR_RETURN(state->error, 83); /*alloc fail*/\n\n  chunk = &in[33]; /*first byte of the first chunk after the header*/\n\n  /*loop through the chunks, ignoring unknown chunks and stopping at IEND chunk.\n  IDAT data is put at the start of the in buffer*/\n  while(!IEND && !state->error) {\n    unsigned chunkLength;\n    const unsigned char* data; /*the data in the chunk*/\n\n    /*error: size of the in buffer too small to contain next chunk*/\n    if((size_t)((chunk - in) + 12) > insize || chunk < in) {\n      if(state->decoder.ignore_end) break; /*other errors may still happen though*/\n      CERROR_BREAK(state->error, 30);\n    }\n\n    /*length of the data of the chunk, excluding the length bytes, chunk type and CRC bytes*/\n    chunkLength = lodepng_chunk_length(chunk);\n    /*error: chunk length larger than the max PNG chunk size*/\n    if(chunkLength > 2147483647) {\n      if(state->decoder.ignore_end) break; /*other errors may still happen though*/\n      CERROR_BREAK(state->error, 63);\n    }\n\n    if((size_t)((chunk - in) + chunkLength + 12) > insize || (chunk + chunkLength + 12) < in) {\n      CERROR_BREAK(state->error, 64); /*error: size of the in buffer too small to contain next chunk*/\n    }\n\n    data = lodepng_chunk_data_const(chunk);\n\n    unknown = 0;\n\n    /*IDAT chunk, containing compressed image data*/\n    if(lodepng_chunk_type_equals(chunk, \"IDAT\")) {\n      size_t newsize;\n      if(lodepng_addofl(idatsize, chunkLength, &newsize)) CERROR_BREAK(state->error, 95);\n      if(newsize > insize) CERROR_BREAK(state->error, 95);\n      lodepng_memcpy(idat + idatsize, data, chunkLength);\n      idatsize += chunkLength;\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n      critical_pos = 3;\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n    } else if(lodepng_chunk_type_equals(chunk, \"IEND\")) {\n      /*IEND chunk*/\n      IEND = 1;\n    } else if(lodepng_chunk_type_equals(chunk, \"PLTE\")) {\n      /*palette chunk (PLTE)*/\n      state->error = readChunk_PLTE(&state->info_png.color, data, chunkLength);\n      if(state->error) break;\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n      critical_pos = 2;\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n    } else if(lodepng_chunk_type_equals(chunk, \"tRNS\")) {\n      /*palette transparency chunk (tRNS). Even though this one is an ancillary chunk , it is still compiled\n      in without 'LODEPNG_COMPILE_ANCILLARY_CHUNKS' because it contains essential color information that\n      affects the alpha channel of pixels. */\n      state->error = readChunk_tRNS(&state->info_png.color, data, chunkLength);\n      if(state->error) break;\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n      /*background color chunk (bKGD)*/\n    } else if(lodepng_chunk_type_equals(chunk, \"bKGD\")) {\n      state->error = readChunk_bKGD(&state->info_png, data, chunkLength);\n      if(state->error) break;\n    } else if(lodepng_chunk_type_equals(chunk, \"tEXt\")) {\n      /*text chunk (tEXt)*/\n      if(state->decoder.read_text_chunks) {\n        state->error = readChunk_tEXt(&state->info_png, data, chunkLength);\n        if(state->error) break;\n      }\n    } else if(lodepng_chunk_type_equals(chunk, \"zTXt\")) {\n      /*compressed text chunk (zTXt)*/\n      if(state->decoder.read_text_chunks) {\n        state->error = readChunk_zTXt(&state->info_png, &state->decoder, data, chunkLength);\n        if(state->error) break;\n      }\n    } else if(lodepng_chunk_type_equals(chunk, \"iTXt\")) {\n      /*international text chunk (iTXt)*/\n      if(state->decoder.read_text_chunks) {\n        state->error = readChunk_iTXt(&state->info_png, &state->decoder, data, chunkLength);\n        if(state->error) break;\n      }\n    } else if(lodepng_chunk_type_equals(chunk, \"tIME\")) {\n      state->error = readChunk_tIME(&state->info_png, data, chunkLength);\n      if(state->error) break;\n    } else if(lodepng_chunk_type_equals(chunk, \"pHYs\")) {\n      state->error = readChunk_pHYs(&state->info_png, data, chunkLength);\n      if(state->error) break;\n    } else if(lodepng_chunk_type_equals(chunk, \"gAMA\")) {\n      state->error = readChunk_gAMA(&state->info_png, data, chunkLength);\n      if(state->error) break;\n    } else if(lodepng_chunk_type_equals(chunk, \"cHRM\")) {\n      state->error = readChunk_cHRM(&state->info_png, data, chunkLength);\n      if(state->error) break;\n    } else if(lodepng_chunk_type_equals(chunk, \"sRGB\")) {\n      state->error = readChunk_sRGB(&state->info_png, data, chunkLength);\n      if(state->error) break;\n    } else if(lodepng_chunk_type_equals(chunk, \"iCCP\")) {\n      state->error = readChunk_iCCP(&state->info_png, &state->decoder, data, chunkLength);\n      if(state->error) break;\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n    } else /*it's not an implemented chunk type, so ignore it: skip over the data*/ {\n      /*error: unknown critical chunk (5th bit of first byte of chunk type is 0)*/\n      if(!state->decoder.ignore_critical && !lodepng_chunk_ancillary(chunk)) {\n        CERROR_BREAK(state->error, 69);\n      }\n\n      unknown = 1;\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n      if(state->decoder.remember_unknown_chunks) {\n        state->error = lodepng_chunk_append(&state->info_png.unknown_chunks_data[critical_pos - 1],\n                                            &state->info_png.unknown_chunks_size[critical_pos - 1], chunk);\n        if(state->error) break;\n      }\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n    }\n\n    if(!state->decoder.ignore_crc && !unknown) /*check CRC if wanted, only on known chunk types*/ {\n      if(lodepng_chunk_check_crc(chunk)) CERROR_BREAK(state->error, 57); /*invalid CRC*/\n    }\n\n    if(!IEND) chunk = lodepng_chunk_next_const(chunk, in + insize);\n  }\n\n  if(!state->error && state->info_png.color.colortype == LCT_PALETTE && !state->info_png.color.palette) {\n    state->error = 106; /* error: PNG file must have PLTE chunk if color type is palette */\n  }\n\n  if(!state->error) {\n    /*predict output size, to allocate exact size for output buffer to avoid more dynamic allocation.\n    If the decompressed size does not match the prediction, the image must be corrupt.*/\n    if(state->info_png.interlace_method == 0) {\n      size_t bpp = lodepng_get_bpp(&state->info_png.color);\n      expected_size = lodepng_get_raw_size_idat(*w, *h, bpp);\n    } else {\n      size_t bpp = lodepng_get_bpp(&state->info_png.color);\n      /*Adam-7 interlaced: expected size is the sum of the 7 sub-images sizes*/\n      expected_size = 0;\n      expected_size += lodepng_get_raw_size_idat((*w + 7) >> 3, (*h + 7) >> 3, bpp);\n      if(*w > 4) expected_size += lodepng_get_raw_size_idat((*w + 3) >> 3, (*h + 7) >> 3, bpp);\n      expected_size += lodepng_get_raw_size_idat((*w + 3) >> 2, (*h + 3) >> 3, bpp);\n      if(*w > 2) expected_size += lodepng_get_raw_size_idat((*w + 1) >> 2, (*h + 3) >> 2, bpp);\n      expected_size += lodepng_get_raw_size_idat((*w + 1) >> 1, (*h + 1) >> 2, bpp);\n      if(*w > 1) expected_size += lodepng_get_raw_size_idat((*w + 0) >> 1, (*h + 1) >> 1, bpp);\n      expected_size += lodepng_get_raw_size_idat((*w + 0), (*h + 0) >> 1, bpp);\n    }\n\n    state->error = zlib_decompress(&scanlines, &scanlines_size, expected_size, idat, idatsize, &state->decoder.zlibsettings);\n  }\n  if(!state->error && scanlines_size != expected_size) state->error = 91; /*decompressed size doesn't match prediction*/\n  lodepng_free(idat);\n\n  if(!state->error) {\n    outsize = lodepng_get_raw_size(*w, *h, &state->info_png.color);\n    *out = (unsigned char*)lodepng_malloc(outsize);\n    if(!*out) state->error = 83; /*alloc fail*/\n  }\n  if(!state->error) {\n    lodepng_memset(*out, 0, outsize);\n    state->error = postProcessScanlines(*out, scanlines, *w, *h, &state->info_png);\n  }\n  lodepng_free(scanlines);\n}\n\nunsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h,\n                        LodePNGState* state,\n                        const unsigned char* in, size_t insize) {\n  *out = 0;\n  decodeGeneric(out, w, h, state, in, insize);\n  if(state->error) return state->error;\n  if(!state->decoder.color_convert || lodepng_color_mode_equal(&state->info_raw, &state->info_png.color)) {\n    /*same color type, no copying or converting of data needed*/\n    /*store the info_png color settings on the info_raw so that the info_raw still reflects what colortype\n    the raw image has to the end user*/\n    if(!state->decoder.color_convert) {\n      state->error = lodepng_color_mode_copy(&state->info_raw, &state->info_png.color);\n      if(state->error) return state->error;\n    }\n  } else { /*color conversion needed*/\n    unsigned char* data = *out;\n    size_t outsize;\n\n    /*TODO: check if this works according to the statement in the documentation: \"The converter can convert\n    from grayscale input color type, to 8-bit grayscale or grayscale with alpha\"*/\n    if(!(state->info_raw.colortype == LCT_RGB || state->info_raw.colortype == LCT_RGBA)\n       && !(state->info_raw.bitdepth == 8)) {\n      return 56; /*unsupported color mode conversion*/\n    }\n\n    outsize = lodepng_get_raw_size(*w, *h, &state->info_raw);\n    *out = (unsigned char*)lodepng_malloc(outsize);\n    if(!(*out)) {\n      state->error = 83; /*alloc fail*/\n    }\n    else state->error = lodepng_convert(*out, data, &state->info_raw,\n                                        &state->info_png.color, *w, *h);\n    lodepng_free(data);\n  }\n  return state->error;\n}\n\nunsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in,\n                               size_t insize, LodePNGColorType colortype, unsigned bitdepth) {\n  unsigned error;\n  LodePNGState state;\n  lodepng_state_init(&state);\n  state.info_raw.colortype = colortype;\n  state.info_raw.bitdepth = bitdepth;\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n  /*disable reading things that this function doesn't output*/\n  state.decoder.read_text_chunks = 0;\n  state.decoder.remember_unknown_chunks = 0;\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n  error = lodepng_decode(out, w, h, &state, in, insize);\n  lodepng_state_cleanup(&state);\n  return error;\n}\n\nunsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) {\n  return lodepng_decode_memory(out, w, h, in, insize, LCT_RGBA, 8);\n}\n\nunsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) {\n  return lodepng_decode_memory(out, w, h, in, insize, LCT_RGB, 8);\n}\n\n#ifdef LODEPNG_COMPILE_DISK\nunsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename,\n                             LodePNGColorType colortype, unsigned bitdepth) {\n  unsigned char* buffer = 0;\n  size_t buffersize;\n  unsigned error;\n  /* safe output values in case error happens */\n  *out = 0;\n  *w = *h = 0;\n  error = lodepng_load_file(&buffer, &buffersize, filename);\n  if(!error) error = lodepng_decode_memory(out, w, h, buffer, buffersize, colortype, bitdepth);\n  lodepng_free(buffer);\n  return error;\n}\n\nunsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) {\n  return lodepng_decode_file(out, w, h, filename, LCT_RGBA, 8);\n}\n\nunsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) {\n  return lodepng_decode_file(out, w, h, filename, LCT_RGB, 8);\n}\n#endif /*LODEPNG_COMPILE_DISK*/\n\nvoid lodepng_decoder_settings_init(LodePNGDecoderSettings* settings) {\n  settings->color_convert = 1;\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n  settings->read_text_chunks = 1;\n  settings->remember_unknown_chunks = 0;\n  settings->max_text_size = 16777216;\n  settings->max_icc_size = 16777216; /* 16MB is much more than enough for any reasonable ICC profile */\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n  settings->ignore_crc = 0;\n  settings->ignore_critical = 0;\n  settings->ignore_end = 0;\n  lodepng_decompress_settings_init(&settings->zlibsettings);\n}\n\n#endif /*LODEPNG_COMPILE_DECODER*/\n\n#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER)\n\nvoid lodepng_state_init(LodePNGState* state) {\n#ifdef LODEPNG_COMPILE_DECODER\n  lodepng_decoder_settings_init(&state->decoder);\n#endif /*LODEPNG_COMPILE_DECODER*/\n#ifdef LODEPNG_COMPILE_ENCODER\n  lodepng_encoder_settings_init(&state->encoder);\n#endif /*LODEPNG_COMPILE_ENCODER*/\n  lodepng_color_mode_init(&state->info_raw);\n  lodepng_info_init(&state->info_png);\n  state->error = 1;\n}\n\nvoid lodepng_state_cleanup(LodePNGState* state) {\n  lodepng_color_mode_cleanup(&state->info_raw);\n  lodepng_info_cleanup(&state->info_png);\n}\n\nvoid lodepng_state_copy(LodePNGState* dest, const LodePNGState* source) {\n  lodepng_state_cleanup(dest);\n  *dest = *source;\n  lodepng_color_mode_init(&dest->info_raw);\n  lodepng_info_init(&dest->info_png);\n  dest->error = lodepng_color_mode_copy(&dest->info_raw, &source->info_raw); if(dest->error) return;\n  dest->error = lodepng_info_copy(&dest->info_png, &source->info_png); if(dest->error) return;\n}\n\n#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */\n\n#ifdef LODEPNG_COMPILE_ENCODER\n\n/* ////////////////////////////////////////////////////////////////////////// */\n/* / PNG Encoder                                                            / */\n/* ////////////////////////////////////////////////////////////////////////// */\n\n\nstatic unsigned writeSignature(ucvector* out) {\n  size_t pos = out->size;\n  const unsigned char signature[] = {137, 80, 78, 71, 13, 10, 26, 10};\n  /*8 bytes PNG signature, aka the magic bytes*/\n  if(!ucvector_resize(out, out->size + 8)) return 83; /*alloc fail*/\n  lodepng_memcpy(out->data + pos, signature, 8);\n  return 0;\n}\n\nstatic unsigned addChunk_IHDR(ucvector* out, unsigned w, unsigned h,\n                              LodePNGColorType colortype, unsigned bitdepth, unsigned interlace_method) {\n  unsigned char *chunk, *data;\n  CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 13, \"IHDR\"));\n  data = chunk + 8;\n\n  lodepng_set32bitInt(data + 0, w); /*width*/\n  lodepng_set32bitInt(data + 4, h); /*height*/\n  data[8] = (unsigned char)bitdepth; /*bit depth*/\n  data[9] = (unsigned char)colortype; /*color type*/\n  data[10] = 0; /*compression method*/\n  data[11] = 0; /*filter method*/\n  data[12] = interlace_method; /*interlace method*/\n\n  lodepng_chunk_generate_crc(chunk);\n  return 0;\n}\n\n/* only adds the chunk if needed (there is a key or palette with alpha) */\nstatic unsigned addChunk_PLTE(ucvector* out, const LodePNGColorMode* info) {\n  unsigned char* chunk;\n  size_t i, j = 8;\n\n  CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, info->palettesize * 3, \"PLTE\"));\n\n  for(i = 0; i != info->palettesize; ++i) {\n    /*add all channels except alpha channel*/\n    chunk[j++] = info->palette[i * 4 + 0];\n    chunk[j++] = info->palette[i * 4 + 1];\n    chunk[j++] = info->palette[i * 4 + 2];\n  }\n\n  lodepng_chunk_generate_crc(chunk);\n  return 0;\n}\n\nstatic unsigned addChunk_tRNS(ucvector* out, const LodePNGColorMode* info) {\n  unsigned char* chunk = 0;\n\n  if(info->colortype == LCT_PALETTE) {\n    size_t i, amount = info->palettesize;\n    /*the tail of palette values that all have 255 as alpha, does not have to be encoded*/\n    for(i = info->palettesize; i != 0; --i) {\n      if(info->palette[4 * (i - 1) + 3] != 255) break;\n      --amount;\n    }\n    if(amount) {\n      CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, amount, \"tRNS\"));\n      /*add the alpha channel values from the palette*/\n      for(i = 0; i != amount; ++i) chunk[8 + i] = info->palette[4 * i + 3];\n    }\n  } else if(info->colortype == LCT_GREY) {\n    if(info->key_defined) {\n      CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 2, \"tRNS\"));\n      chunk[8] = (unsigned char)(info->key_r >> 8);\n      chunk[9] = (unsigned char)(info->key_r & 255);\n    }\n  } else if(info->colortype == LCT_RGB) {\n    if(info->key_defined) {\n      CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 6, \"tRNS\"));\n      chunk[8] = (unsigned char)(info->key_r >> 8);\n      chunk[9] = (unsigned char)(info->key_r & 255);\n      chunk[10] = (unsigned char)(info->key_g >> 8);\n      chunk[11] = (unsigned char)(info->key_g & 255);\n      chunk[12] = (unsigned char)(info->key_b >> 8);\n      chunk[13] = (unsigned char)(info->key_b & 255);\n    }\n  }\n\n  if(chunk) lodepng_chunk_generate_crc(chunk);\n  return 0;\n}\n\nstatic unsigned addChunk_IDAT(ucvector* out, const unsigned char* data, size_t datasize,\n                              LodePNGCompressSettings* zlibsettings) {\n  unsigned error = 0;\n  unsigned char* zlib = 0;\n  size_t zlibsize = 0;\n\n  error = zlib_compress(&zlib, &zlibsize, data, datasize, zlibsettings);\n  if(!error) {\n    error = lodepng_chunk_createv(out, zlibsize, \"IDAT\", zlib);\n  }\n  lodepng_free(zlib);\n  return error;\n}\n\nstatic unsigned addChunk_IEND(ucvector* out) {\n  return lodepng_chunk_createv(out, 0, \"IEND\", 0);\n}\n\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n\nstatic unsigned addChunk_tEXt(ucvector* out, const char* keyword, const char* textstring) {\n  unsigned char* chunk = 0;\n  size_t keysize = lodepng_strlen(keyword), textsize = lodepng_strlen(textstring);\n  size_t size = keysize + 1 + textsize;\n  if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/\n  CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, size, \"tEXt\"));\n  lodepng_memcpy(chunk + 8, keyword, keysize);\n  chunk[8 + keysize] = 0; /*null termination char*/\n  lodepng_memcpy(chunk + 9 + keysize, textstring, textsize);\n  lodepng_chunk_generate_crc(chunk);\n  return 0;\n}\n\nstatic unsigned addChunk_zTXt(ucvector* out, const char* keyword, const char* textstring,\n                              LodePNGCompressSettings* zlibsettings) {\n  unsigned error = 0;\n  unsigned char* chunk = 0;\n  unsigned char* compressed = 0;\n  size_t compressedsize = 0;\n  size_t textsize = lodepng_strlen(textstring);\n  size_t keysize = lodepng_strlen(keyword);\n  if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/\n\n  error = zlib_compress(&compressed, &compressedsize,\n                        (const unsigned char*)textstring, textsize, zlibsettings);\n  if(!error) {\n    size_t size = keysize + 2 + compressedsize;\n    error = lodepng_chunk_init(&chunk, out, size, \"zTXt\");\n  }\n  if(!error) {\n    lodepng_memcpy(chunk + 8, keyword, keysize);\n    chunk[8 + keysize] = 0; /*null termination char*/\n    chunk[9 + keysize] = 0; /*compression method: 0*/\n    lodepng_memcpy(chunk + 10 + keysize, compressed, compressedsize);\n    lodepng_chunk_generate_crc(chunk);\n  }\n\n  lodepng_free(compressed);\n  return error;\n}\n\nstatic unsigned addChunk_iTXt(ucvector* out, unsigned compress, const char* keyword, const char* langtag,\n                              const char* transkey, const char* textstring, LodePNGCompressSettings* zlibsettings) {\n  unsigned error = 0;\n  unsigned char* chunk = 0;\n  unsigned char* compressed = 0;\n  size_t compressedsize = 0;\n  size_t textsize = lodepng_strlen(textstring);\n  size_t keysize = lodepng_strlen(keyword), langsize = lodepng_strlen(langtag), transsize = lodepng_strlen(transkey);\n\n  if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/\n\n  if(compress) {\n    error = zlib_compress(&compressed, &compressedsize,\n                          (const unsigned char*)textstring, textsize, zlibsettings);\n  }\n  if(!error) {\n    size_t size = keysize + 3 + langsize + 1 + transsize + 1 + (compress ? compressedsize : textsize);\n    error = lodepng_chunk_init(&chunk, out, size, \"iTXt\");\n  }\n  if(!error) {\n    size_t pos = 8;\n    lodepng_memcpy(chunk + pos, keyword, keysize);\n    pos += keysize;\n    chunk[pos++] = 0; /*null termination char*/\n    chunk[pos++] = (compress ? 1 : 0); /*compression flag*/\n    chunk[pos++] = 0; /*compression method: 0*/\n    lodepng_memcpy(chunk + pos, langtag, langsize);\n    pos += langsize;\n    chunk[pos++] = 0; /*null termination char*/\n    lodepng_memcpy(chunk + pos, transkey, transsize);\n    pos += transsize;\n    chunk[pos++] = 0; /*null termination char*/\n    if(compress) {\n      lodepng_memcpy(chunk + pos, compressed, compressedsize);\n    } else {\n      lodepng_memcpy(chunk + pos, textstring, textsize);\n    }\n    lodepng_chunk_generate_crc(chunk);\n  }\n\n  lodepng_free(compressed);\n  return error;\n}\n\nstatic unsigned addChunk_bKGD(ucvector* out, const LodePNGInfo* info) {\n  unsigned char* chunk = 0;\n  if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) {\n    CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 2, \"bKGD\"));\n    chunk[8] = (unsigned char)(info->background_r >> 8);\n    chunk[9] = (unsigned char)(info->background_r & 255);\n  } else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) {\n    CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 6, \"bKGD\"));\n    chunk[8] = (unsigned char)(info->background_r >> 8);\n    chunk[9] = (unsigned char)(info->background_r & 255);\n    chunk[10] = (unsigned char)(info->background_g >> 8);\n    chunk[11] = (unsigned char)(info->background_g & 255);\n    chunk[12] = (unsigned char)(info->background_b >> 8);\n    chunk[13] = (unsigned char)(info->background_b & 255);\n  } else if(info->color.colortype == LCT_PALETTE) {\n    CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 1, \"bKGD\"));\n    chunk[8] = (unsigned char)(info->background_r & 255); /*palette index*/\n  }\n  if(chunk) lodepng_chunk_generate_crc(chunk);\n  return 0;\n}\n\nstatic unsigned addChunk_tIME(ucvector* out, const LodePNGTime* time) {\n  unsigned char* chunk;\n  CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 7, \"tIME\"));\n  chunk[8] = (unsigned char)(time->year >> 8);\n  chunk[9] = (unsigned char)(time->year & 255);\n  chunk[10] = (unsigned char)time->month;\n  chunk[11] = (unsigned char)time->day;\n  chunk[12] = (unsigned char)time->hour;\n  chunk[13] = (unsigned char)time->minute;\n  chunk[14] = (unsigned char)time->second;\n  lodepng_chunk_generate_crc(chunk);\n  return 0;\n}\n\nstatic unsigned addChunk_pHYs(ucvector* out, const LodePNGInfo* info) {\n  unsigned char* chunk;\n  CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 9, \"pHYs\"));\n  lodepng_set32bitInt(chunk + 8, info->phys_x);\n  lodepng_set32bitInt(chunk + 12, info->phys_y);\n  chunk[16] = info->phys_unit;\n  lodepng_chunk_generate_crc(chunk);\n  return 0;\n}\n\nstatic unsigned addChunk_gAMA(ucvector* out, const LodePNGInfo* info) {\n  unsigned char* chunk;\n  CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 4, \"gAMA\"));\n  lodepng_set32bitInt(chunk + 8, info->gama_gamma);\n  lodepng_chunk_generate_crc(chunk);\n  return 0;\n}\n\nstatic unsigned addChunk_cHRM(ucvector* out, const LodePNGInfo* info) {\n  unsigned char* chunk;\n  CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 32, \"cHRM\"));\n  lodepng_set32bitInt(chunk + 8, info->chrm_white_x);\n  lodepng_set32bitInt(chunk + 12, info->chrm_white_y);\n  lodepng_set32bitInt(chunk + 16, info->chrm_red_x);\n  lodepng_set32bitInt(chunk + 20, info->chrm_red_y);\n  lodepng_set32bitInt(chunk + 24, info->chrm_green_x);\n  lodepng_set32bitInt(chunk + 28, info->chrm_green_y);\n  lodepng_set32bitInt(chunk + 32, info->chrm_blue_x);\n  lodepng_set32bitInt(chunk + 36, info->chrm_blue_y);\n  lodepng_chunk_generate_crc(chunk);\n  return 0;\n}\n\nstatic unsigned addChunk_sRGB(ucvector* out, const LodePNGInfo* info) {\n  unsigned char data = info->srgb_intent;\n  return lodepng_chunk_createv(out, 1, \"sRGB\", &data);\n}\n\nstatic unsigned addChunk_iCCP(ucvector* out, const LodePNGInfo* info, LodePNGCompressSettings* zlibsettings) {\n  unsigned error = 0;\n  unsigned char* chunk = 0;\n  unsigned char* compressed = 0;\n  size_t compressedsize = 0;\n  size_t keysize = lodepng_strlen(info->iccp_name);\n\n  if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/\n  error = zlib_compress(&compressed, &compressedsize,\n                        info->iccp_profile, info->iccp_profile_size, zlibsettings);\n  if(!error) {\n    size_t size = keysize + 2 + compressedsize;\n    error = lodepng_chunk_init(&chunk, out, size, \"iCCP\");\n  }\n  if(!error) {\n    lodepng_memcpy(chunk + 8, info->iccp_name, keysize);\n    chunk[8 + keysize] = 0; /*null termination char*/\n    chunk[9 + keysize] = 0; /*compression method: 0*/\n    lodepng_memcpy(chunk + 10 + keysize, compressed, compressedsize);\n    lodepng_chunk_generate_crc(chunk);\n  }\n\n  lodepng_free(compressed);\n  return error;\n}\n\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n\nstatic void filterScanline(unsigned char* out, const unsigned char* scanline, const unsigned char* prevline,\n                           size_t length, size_t bytewidth, unsigned char filterType) {\n  size_t i;\n  switch(filterType) {\n    case 0: /*None*/\n      for(i = 0; i != length; ++i) out[i] = scanline[i];\n      break;\n    case 1: /*Sub*/\n      for(i = 0; i != bytewidth; ++i) out[i] = scanline[i];\n      for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - scanline[i - bytewidth];\n      break;\n    case 2: /*Up*/\n      if(prevline) {\n        for(i = 0; i != length; ++i) out[i] = scanline[i] - prevline[i];\n      } else {\n        for(i = 0; i != length; ++i) out[i] = scanline[i];\n      }\n      break;\n    case 3: /*Average*/\n      if(prevline) {\n        for(i = 0; i != bytewidth; ++i) out[i] = scanline[i] - (prevline[i] >> 1);\n        for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - ((scanline[i - bytewidth] + prevline[i]) >> 1);\n      } else {\n        for(i = 0; i != bytewidth; ++i) out[i] = scanline[i];\n        for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - (scanline[i - bytewidth] >> 1);\n      }\n      break;\n    case 4: /*Paeth*/\n      if(prevline) {\n        /*paethPredictor(0, prevline[i], 0) is always prevline[i]*/\n        for(i = 0; i != bytewidth; ++i) out[i] = (scanline[i] - prevline[i]);\n        for(i = bytewidth; i < length; ++i) {\n          out[i] = (scanline[i] - paethPredictor(scanline[i - bytewidth], prevline[i], prevline[i - bytewidth]));\n        }\n      } else {\n        for(i = 0; i != bytewidth; ++i) out[i] = scanline[i];\n        /*paethPredictor(scanline[i - bytewidth], 0, 0) is always scanline[i - bytewidth]*/\n        for(i = bytewidth; i < length; ++i) out[i] = (scanline[i] - scanline[i - bytewidth]);\n      }\n      break;\n    default: return; /*invalid filter type given*/\n  }\n}\n\n/* integer binary logarithm, max return value is 31 */\nstatic size_t ilog2(size_t i) {\n  size_t result = 0;\n  if(i >= 65536) { result += 16; i >>= 16; }\n  if(i >= 256) { result += 8; i >>= 8; }\n  if(i >= 16) { result += 4; i >>= 4; }\n  if(i >= 4) { result += 2; i >>= 2; }\n  if(i >= 2) { result += 1; /*i >>= 1;*/ }\n  return result;\n}\n\n/* integer approximation for i * log2(i), helper function for LFS_ENTROPY */\nstatic size_t ilog2i(size_t i) {\n  size_t l;\n  if(i == 0) return 0;\n  l = ilog2(i);\n  /* approximate i*log2(i): l is integer logarithm, ((i - (1u << l)) << 1u)\n  linearly approximates the missing fractional part multiplied by i */\n  return i * l + ((i - (1u << l)) << 1u);\n}\n\nstatic unsigned filter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h,\n                       const LodePNGColorMode* color, const LodePNGEncoderSettings* settings) {\n  /*\n  For PNG filter method 0\n  out must be a buffer with as size: h + (w * h * bpp + 7u) / 8u, because there are\n  the scanlines with 1 extra byte per scanline\n  */\n\n  unsigned bpp = lodepng_get_bpp(color);\n  /*the width of a scanline in bytes, not including the filter type*/\n  size_t linebytes = lodepng_get_raw_size_idat(w, 1, bpp) - 1u;\n\n  /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/\n  size_t bytewidth = (bpp + 7u) / 8u;\n  const unsigned char* prevline = 0;\n  unsigned x, y;\n  unsigned error = 0;\n  LodePNGFilterStrategy strategy = settings->filter_strategy;\n\n  /*\n  There is a heuristic called the minimum sum of absolute differences heuristic, suggested by the PNG standard:\n   *  If the image type is Palette, or the bit depth is smaller than 8, then do not filter the image (i.e.\n      use fixed filtering, with the filter None).\n   * (The other case) If the image type is Grayscale or RGB (with or without Alpha), and the bit depth is\n     not smaller than 8, then use adaptive filtering heuristic as follows: independently for each row, apply\n     all five filters and select the filter that produces the smallest sum of absolute values per row.\n  This heuristic is used if filter strategy is LFS_MINSUM and filter_palette_zero is true.\n\n  If filter_palette_zero is true and filter_strategy is not LFS_MINSUM, the above heuristic is followed,\n  but for \"the other case\", whatever strategy filter_strategy is set to instead of the minimum sum\n  heuristic is used.\n  */\n  if(settings->filter_palette_zero &&\n     (color->colortype == LCT_PALETTE || color->bitdepth < 8)) strategy = LFS_ZERO;\n\n  if(bpp == 0) return 31; /*error: invalid color type*/\n\n  if(strategy >= LFS_ZERO && strategy <= LFS_FOUR) {\n    unsigned char type = (unsigned char)strategy;\n    for(y = 0; y != h; ++y) {\n      size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/\n      size_t inindex = linebytes * y;\n      out[outindex] = type; /*filter type byte*/\n      filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type);\n      prevline = &in[inindex];\n    }\n  } else if(strategy == LFS_MINSUM) {\n    /*adaptive filtering*/\n    unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/\n    size_t smallest = 0;\n    unsigned char type, bestType = 0;\n\n    for(type = 0; type != 5; ++type) {\n      attempt[type] = (unsigned char*)lodepng_malloc(linebytes);\n      if(!attempt[type]) error = 83; /*alloc fail*/\n    }\n\n    if(!error) {\n      for(y = 0; y != h; ++y) {\n        /*try the 5 filter types*/\n        for(type = 0; type != 5; ++type) {\n          size_t sum = 0;\n          filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type);\n\n          /*calculate the sum of the result*/\n          if(type == 0) {\n            for(x = 0; x != linebytes; ++x) sum += (unsigned char)(attempt[type][x]);\n          } else {\n            for(x = 0; x != linebytes; ++x) {\n              /*For differences, each byte should be treated as signed, values above 127 are negative\n              (converted to signed char). Filtertype 0 isn't a difference though, so use unsigned there.\n              This means filtertype 0 is almost never chosen, but that is justified.*/\n              unsigned char s = attempt[type][x];\n              sum += s < 128 ? s : (255U - s);\n            }\n          }\n\n          /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/\n          if(type == 0 || sum < smallest) {\n            bestType = type;\n            smallest = sum;\n          }\n        }\n\n        prevline = &in[y * linebytes];\n\n        /*now fill the out values*/\n        out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/\n        for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x];\n      }\n    }\n\n    for(type = 0; type != 5; ++type) lodepng_free(attempt[type]);\n  } else if(strategy == LFS_ENTROPY) {\n    unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/\n    size_t bestSum = 0;\n    unsigned type, bestType = 0;\n    unsigned count[256];\n\n    for(type = 0; type != 5; ++type) {\n      attempt[type] = (unsigned char*)lodepng_malloc(linebytes);\n      if(!attempt[type]) error = 83; /*alloc fail*/\n    }\n\n    if(!error) {\n      for(y = 0; y != h; ++y) {\n        /*try the 5 filter types*/\n        for(type = 0; type != 5; ++type) {\n          size_t sum = 0;\n          filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type);\n          lodepng_memset(count, 0, 256 * sizeof(*count));\n          for(x = 0; x != linebytes; ++x) ++count[attempt[type][x]];\n          ++count[type]; /*the filter type itself is part of the scanline*/\n          for(x = 0; x != 256; ++x) {\n            sum += ilog2i(count[x]);\n          }\n          /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/\n          if(type == 0 || sum > bestSum) {\n            bestType = type;\n            bestSum = sum;\n          }\n        }\n\n        prevline = &in[y * linebytes];\n\n        /*now fill the out values*/\n        out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/\n        for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x];\n      }\n    }\n\n    for(type = 0; type != 5; ++type) lodepng_free(attempt[type]);\n  } else if(strategy == LFS_PREDEFINED) {\n    for(y = 0; y != h; ++y) {\n      size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/\n      size_t inindex = linebytes * y;\n      unsigned char type = settings->predefined_filters[y];\n      out[outindex] = type; /*filter type byte*/\n      filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type);\n      prevline = &in[inindex];\n    }\n  } else if(strategy == LFS_BRUTE_FORCE) {\n    /*brute force filter chooser.\n    deflate the scanline after every filter attempt to see which one deflates best.\n    This is very slow and gives only slightly smaller, sometimes even larger, result*/\n    size_t size[5];\n    unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/\n    size_t smallest = 0;\n    unsigned type = 0, bestType = 0;\n    unsigned char* dummy;\n    LodePNGCompressSettings zlibsettings;\n    lodepng_memcpy(&zlibsettings, &settings->zlibsettings, sizeof(LodePNGCompressSettings));\n    /*use fixed tree on the attempts so that the tree is not adapted to the filtertype on purpose,\n    to simulate the true case where the tree is the same for the whole image. Sometimes it gives\n    better result with dynamic tree anyway. Using the fixed tree sometimes gives worse, but in rare\n    cases better compression. It does make this a bit less slow, so it's worth doing this.*/\n    zlibsettings.btype = 1;\n    /*a custom encoder likely doesn't read the btype setting and is optimized for complete PNG\n    images only, so disable it*/\n    zlibsettings.custom_zlib = 0;\n    zlibsettings.custom_deflate = 0;\n    for(type = 0; type != 5; ++type) {\n      attempt[type] = (unsigned char*)lodepng_malloc(linebytes);\n      if(!attempt[type]) error = 83; /*alloc fail*/\n    }\n    if(!error) {\n      for(y = 0; y != h; ++y) /*try the 5 filter types*/ {\n        for(type = 0; type != 5; ++type) {\n          unsigned testsize = (unsigned)linebytes;\n          /*if(testsize > 8) testsize /= 8;*/ /*it already works good enough by testing a part of the row*/\n\n          filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type);\n          size[type] = 0;\n          dummy = 0;\n          zlib_compress(&dummy, &size[type], attempt[type], testsize, &zlibsettings);\n          lodepng_free(dummy);\n          /*check if this is smallest size (or if type == 0 it's the first case so always store the values)*/\n          if(type == 0 || size[type] < smallest) {\n            bestType = type;\n            smallest = size[type];\n          }\n        }\n        prevline = &in[y * linebytes];\n        out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/\n        for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x];\n      }\n    }\n    for(type = 0; type != 5; ++type) lodepng_free(attempt[type]);\n  }\n  else return 88; /* unknown filter strategy */\n\n  return error;\n}\n\nstatic void addPaddingBits(unsigned char* out, const unsigned char* in,\n                           size_t olinebits, size_t ilinebits, unsigned h) {\n  /*The opposite of the removePaddingBits function\n  olinebits must be >= ilinebits*/\n  unsigned y;\n  size_t diff = olinebits - ilinebits;\n  size_t obp = 0, ibp = 0; /*bit pointers*/\n  for(y = 0; y != h; ++y) {\n    size_t x;\n    for(x = 0; x < ilinebits; ++x) {\n      unsigned char bit = readBitFromReversedStream(&ibp, in);\n      setBitOfReversedStream(&obp, out, bit);\n    }\n    /*obp += diff; --> no, fill in some value in the padding bits too, to avoid\n    \"Use of uninitialised value of size ###\" warning from valgrind*/\n    for(x = 0; x != diff; ++x) setBitOfReversedStream(&obp, out, 0);\n  }\n}\n\n/*\nin: non-interlaced image with size w*h\nout: the same pixels, but re-ordered according to PNG's Adam7 interlacing, with\n no padding bits between scanlines, but between reduced images so that each\n reduced image starts at a byte.\nbpp: bits per pixel\nthere are no padding bits, not between scanlines, not between reduced images\nin has the following size in bits: w * h * bpp.\nout is possibly bigger due to padding bits between reduced images\nNOTE: comments about padding bits are only relevant if bpp < 8\n*/\nstatic void Adam7_interlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) {\n  unsigned passw[7], passh[7];\n  size_t filter_passstart[8], padded_passstart[8], passstart[8];\n  unsigned i;\n\n  Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp);\n\n  if(bpp >= 8) {\n    for(i = 0; i != 7; ++i) {\n      unsigned x, y, b;\n      size_t bytewidth = bpp / 8u;\n      for(y = 0; y < passh[i]; ++y)\n      for(x = 0; x < passw[i]; ++x) {\n        size_t pixelinstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth;\n        size_t pixeloutstart = passstart[i] + (y * passw[i] + x) * bytewidth;\n        for(b = 0; b < bytewidth; ++b) {\n          out[pixeloutstart + b] = in[pixelinstart + b];\n        }\n      }\n    }\n  } else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ {\n    for(i = 0; i != 7; ++i) {\n      unsigned x, y, b;\n      unsigned ilinebits = bpp * passw[i];\n      unsigned olinebits = bpp * w;\n      size_t obp, ibp; /*bit pointers (for out and in buffer)*/\n      for(y = 0; y < passh[i]; ++y)\n      for(x = 0; x < passw[i]; ++x) {\n        ibp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp;\n        obp = (8 * passstart[i]) + (y * ilinebits + x * bpp);\n        for(b = 0; b < bpp; ++b) {\n          unsigned char bit = readBitFromReversedStream(&ibp, in);\n          setBitOfReversedStream(&obp, out, bit);\n        }\n      }\n    }\n  }\n}\n\n/*out must be buffer big enough to contain uncompressed IDAT chunk data, and in must contain the full image.\nreturn value is error**/\nstatic unsigned preProcessScanlines(unsigned char** out, size_t* outsize, const unsigned char* in,\n                                    unsigned w, unsigned h,\n                                    const LodePNGInfo* info_png, const LodePNGEncoderSettings* settings) {\n  /*\n  This function converts the pure 2D image with the PNG's colortype, into filtered-padded-interlaced data. Steps:\n  *) if no Adam7: 1) add padding bits (= possible extra bits per scanline if bpp < 8) 2) filter\n  *) if adam7: 1) Adam7_interlace 2) 7x add padding bits 3) 7x filter\n  */\n  unsigned bpp = lodepng_get_bpp(&info_png->color);\n  unsigned error = 0;\n\n  if(info_png->interlace_method == 0) {\n    *outsize = h + (h * ((w * bpp + 7u) / 8u)); /*image size plus an extra byte per scanline + possible padding bits*/\n    *out = (unsigned char*)lodepng_malloc(*outsize);\n    if(!(*out) && (*outsize)) error = 83; /*alloc fail*/\n\n    if(!error) {\n      /*non multiple of 8 bits per scanline, padding bits needed per scanline*/\n      if(bpp < 8 && w * bpp != ((w * bpp + 7u) / 8u) * 8u) {\n        unsigned char* padded = (unsigned char*)lodepng_malloc(h * ((w * bpp + 7u) / 8u));\n        if(!padded) error = 83; /*alloc fail*/\n        if(!error) {\n          addPaddingBits(padded, in, ((w * bpp + 7u) / 8u) * 8u, w * bpp, h);\n          error = filter(*out, padded, w, h, &info_png->color, settings);\n        }\n        lodepng_free(padded);\n      } else {\n        /*we can immediately filter into the out buffer, no other steps needed*/\n        error = filter(*out, in, w, h, &info_png->color, settings);\n      }\n    }\n  } else /*interlace_method is 1 (Adam7)*/ {\n    unsigned passw[7], passh[7];\n    size_t filter_passstart[8], padded_passstart[8], passstart[8];\n    unsigned char* adam7;\n\n    Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp);\n\n    *outsize = filter_passstart[7]; /*image size plus an extra byte per scanline + possible padding bits*/\n    *out = (unsigned char*)lodepng_malloc(*outsize);\n    if(!(*out)) error = 83; /*alloc fail*/\n\n    adam7 = (unsigned char*)lodepng_malloc(passstart[7]);\n    if(!adam7 && passstart[7]) error = 83; /*alloc fail*/\n\n    if(!error) {\n      unsigned i;\n\n      Adam7_interlace(adam7, in, w, h, bpp);\n      for(i = 0; i != 7; ++i) {\n        if(bpp < 8) {\n          unsigned char* padded = (unsigned char*)lodepng_malloc(padded_passstart[i + 1] - padded_passstart[i]);\n          if(!padded) ERROR_BREAK(83); /*alloc fail*/\n          addPaddingBits(padded, &adam7[passstart[i]],\n                         ((passw[i] * bpp + 7u) / 8u) * 8u, passw[i] * bpp, passh[i]);\n          error = filter(&(*out)[filter_passstart[i]], padded,\n                         passw[i], passh[i], &info_png->color, settings);\n          lodepng_free(padded);\n        } else {\n          error = filter(&(*out)[filter_passstart[i]], &adam7[padded_passstart[i]],\n                         passw[i], passh[i], &info_png->color, settings);\n        }\n\n        if(error) break;\n      }\n    }\n\n    lodepng_free(adam7);\n  }\n\n  return error;\n}\n\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\nstatic unsigned addUnknownChunks(ucvector* out, unsigned char* data, size_t datasize) {\n  unsigned char* inchunk = data;\n  while((size_t)(inchunk - data) < datasize) {\n    CERROR_TRY_RETURN(lodepng_chunk_append(&out->data, &out->size, inchunk));\n    out->allocsize = out->size; /*fix the allocsize again*/\n    inchunk = lodepng_chunk_next(inchunk, data + datasize);\n  }\n  return 0;\n}\n\nstatic unsigned isGrayICCProfile(const unsigned char* profile, unsigned size) {\n  /*\n  It is a gray profile if bytes 16-19 are \"GRAY\", rgb profile if bytes 16-19\n  are \"RGB \". We do not perform any full parsing of the ICC profile here, other\n  than check those 4 bytes to grayscale profile. Other than that, validity of\n  the profile is not checked. This is needed only because the PNG specification\n  requires using a non-gray color model if there is an ICC profile with \"RGB \"\n  (sadly limiting compression opportunities if the input data is grayscale RGB\n  data), and requires using a gray color model if it is \"GRAY\".\n  */\n  if(size < 20) return 0;\n  return profile[16] == 'G' &&  profile[17] == 'R' &&  profile[18] == 'A' &&  profile[19] == 'Y';\n}\n\nstatic unsigned isRGBICCProfile(const unsigned char* profile, unsigned size) {\n  /* See comment in isGrayICCProfile*/\n  if(size < 20) return 0;\n  return profile[16] == 'R' &&  profile[17] == 'G' &&  profile[18] == 'B' &&  profile[19] == ' ';\n}\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n\nunsigned lodepng_encode(unsigned char** out, size_t* outsize,\n                        const unsigned char* image, unsigned w, unsigned h,\n                        LodePNGState* state) {\n  unsigned char* data = 0; /*uncompressed version of the IDAT chunk data*/\n  size_t datasize = 0;\n  ucvector outv = ucvector_init(NULL, 0);\n  LodePNGInfo info;\n  const LodePNGInfo* info_png = &state->info_png;\n\n  lodepng_info_init(&info);\n\n  /*provide some proper output values if error will happen*/\n  *out = 0;\n  *outsize = 0;\n  state->error = 0;\n\n  /*check input values validity*/\n  if((info_png->color.colortype == LCT_PALETTE || state->encoder.force_palette)\n      && (info_png->color.palettesize == 0 || info_png->color.palettesize > 256)) {\n    state->error = 68; /*invalid palette size, it is only allowed to be 1-256*/\n    goto cleanup;\n  }\n  if(state->encoder.zlibsettings.btype > 2) {\n    state->error = 61; /*error: invalid btype*/\n    goto cleanup;\n  }\n  if(info_png->interlace_method > 1) {\n    state->error = 71; /*error: invalid interlace mode*/\n    goto cleanup;\n  }\n  state->error = checkColorValidity(info_png->color.colortype, info_png->color.bitdepth);\n  if(state->error) goto cleanup; /*error: invalid color type given*/\n  state->error = checkColorValidity(state->info_raw.colortype, state->info_raw.bitdepth);\n  if(state->error) goto cleanup; /*error: invalid color type given*/\n\n  /* color convert and compute scanline filter types */\n  lodepng_info_copy(&info, &state->info_png);\n  if(state->encoder.auto_convert) {\n    LodePNGColorStats stats;\n    lodepng_color_stats_init(&stats);\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n    if(info_png->iccp_defined &&\n        isGrayICCProfile(info_png->iccp_profile, info_png->iccp_profile_size)) {\n      /*the PNG specification does not allow to use palette with a GRAY ICC profile, even\n      if the palette has only gray colors, so disallow it.*/\n      stats.allow_palette = 0;\n    }\n    if(info_png->iccp_defined &&\n        isRGBICCProfile(info_png->iccp_profile, info_png->iccp_profile_size)) {\n      /*the PNG specification does not allow to use grayscale color with RGB ICC profile, so disallow gray.*/\n      stats.allow_greyscale = 0;\n    }\n#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */\n    state->error = lodepng_compute_color_stats(&stats, image, w, h, &state->info_raw);\n    if(state->error) goto cleanup;\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n    if(info_png->background_defined) {\n      /*the background chunk's color must be taken into account as well*/\n      unsigned r = 0, g = 0, b = 0;\n      LodePNGColorMode mode16 = lodepng_color_mode_make(LCT_RGB, 16);\n      lodepng_convert_rgb(&r, &g, &b, info_png->background_r, info_png->background_g, info_png->background_b, &mode16, &info_png->color);\n      state->error = lodepng_color_stats_add(&stats, r, g, b, 65535);\n      if(state->error) goto cleanup;\n    }\n#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */\n    state->error = auto_choose_color(&info.color, &state->info_raw, &stats);\n    if(state->error) goto cleanup;\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n    /*also convert the background chunk*/\n    if(info_png->background_defined) {\n      if(lodepng_convert_rgb(&info.background_r, &info.background_g, &info.background_b,\n          info_png->background_r, info_png->background_g, info_png->background_b, &info.color, &info_png->color)) {\n        state->error = 104;\n        goto cleanup;\n      }\n    }\n#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */\n  }\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n  if(info_png->iccp_defined) {\n    unsigned gray_icc = isGrayICCProfile(info_png->iccp_profile, info_png->iccp_profile_size);\n    unsigned rgb_icc = isRGBICCProfile(info_png->iccp_profile, info_png->iccp_profile_size);\n    unsigned gray_png = info.color.colortype == LCT_GREY || info.color.colortype == LCT_GREY_ALPHA;\n    if(!gray_icc && !rgb_icc) {\n      state->error = 100; /* Disallowed profile color type for PNG */\n      goto cleanup;\n    }\n    if(gray_icc != gray_png) {\n      /*Not allowed to use RGB/RGBA/palette with GRAY ICC profile or vice versa,\n      or in case of auto_convert, it wasn't possible to find appropriate model*/\n      state->error = state->encoder.auto_convert ? 102 : 101;\n      goto cleanup;\n    }\n  }\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n  if(!lodepng_color_mode_equal(&state->info_raw, &info.color)) {\n    unsigned char* converted;\n    size_t size = ((size_t)w * (size_t)h * (size_t)lodepng_get_bpp(&info.color) + 7u) / 8u;\n\n    converted = (unsigned char*)lodepng_malloc(size);\n    if(!converted && size) state->error = 83; /*alloc fail*/\n    if(!state->error) {\n      state->error = lodepng_convert(converted, image, &info.color, &state->info_raw, w, h);\n    }\n    if(!state->error) {\n      state->error = preProcessScanlines(&data, &datasize, converted, w, h, &info, &state->encoder);\n    }\n    lodepng_free(converted);\n    if(state->error) goto cleanup;\n  } else {\n    state->error = preProcessScanlines(&data, &datasize, image, w, h, &info, &state->encoder);\n    if(state->error) goto cleanup;\n  }\n\n  /* output all PNG chunks */ {\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n    size_t i;\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n    /*write signature and chunks*/\n    state->error = writeSignature(&outv);\n    if(state->error) goto cleanup;\n    /*IHDR*/\n    state->error = addChunk_IHDR(&outv, w, h, info.color.colortype, info.color.bitdepth, info.interlace_method);\n    if(state->error) goto cleanup;\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n    /*unknown chunks between IHDR and PLTE*/\n    if(info.unknown_chunks_data[0]) {\n      state->error = addUnknownChunks(&outv, info.unknown_chunks_data[0], info.unknown_chunks_size[0]);\n      if(state->error) goto cleanup;\n    }\n    /*color profile chunks must come before PLTE */\n    if(info.iccp_defined) {\n      state->error = addChunk_iCCP(&outv, &info, &state->encoder.zlibsettings);\n      if(state->error) goto cleanup;\n    }\n    if(info.srgb_defined) {\n      state->error = addChunk_sRGB(&outv, &info);\n      if(state->error) goto cleanup;\n    }\n    if(info.gama_defined) {\n      state->error = addChunk_gAMA(&outv, &info);\n      if(state->error) goto cleanup;\n    }\n    if(info.chrm_defined) {\n      state->error = addChunk_cHRM(&outv, &info);\n      if(state->error) goto cleanup;\n    }\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n    /*PLTE*/\n    if(info.color.colortype == LCT_PALETTE) {\n      state->error = addChunk_PLTE(&outv, &info.color);\n      if(state->error) goto cleanup;\n    }\n    if(state->encoder.force_palette && (info.color.colortype == LCT_RGB || info.color.colortype == LCT_RGBA)) {\n      /*force_palette means: write suggested palette for truecolor in PLTE chunk*/\n      state->error = addChunk_PLTE(&outv, &info.color);\n      if(state->error) goto cleanup;\n    }\n    /*tRNS (this will only add if when necessary) */\n    state->error = addChunk_tRNS(&outv, &info.color);\n    if(state->error) goto cleanup;\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n    /*bKGD (must come between PLTE and the IDAt chunks*/\n    if(info.background_defined) {\n      state->error = addChunk_bKGD(&outv, &info);\n      if(state->error) goto cleanup;\n    }\n    /*pHYs (must come before the IDAT chunks)*/\n    if(info.phys_defined) {\n      state->error = addChunk_pHYs(&outv, &info);\n      if(state->error) goto cleanup;\n    }\n\n    /*unknown chunks between PLTE and IDAT*/\n    if(info.unknown_chunks_data[1]) {\n      state->error = addUnknownChunks(&outv, info.unknown_chunks_data[1], info.unknown_chunks_size[1]);\n      if(state->error) goto cleanup;\n    }\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n    /*IDAT (multiple IDAT chunks must be consecutive)*/\n    state->error = addChunk_IDAT(&outv, data, datasize, &state->encoder.zlibsettings);\n    if(state->error) goto cleanup;\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n    /*tIME*/\n    if(info.time_defined) {\n      state->error = addChunk_tIME(&outv, &info.time);\n      if(state->error) goto cleanup;\n    }\n    /*tEXt and/or zTXt*/\n    for(i = 0; i != info.text_num; ++i) {\n      if(lodepng_strlen(info.text_keys[i]) > 79) {\n        state->error = 66; /*text chunk too large*/\n        goto cleanup;\n      }\n      if(lodepng_strlen(info.text_keys[i]) < 1) {\n        state->error = 67; /*text chunk too small*/\n        goto cleanup;\n      }\n      if(state->encoder.text_compression) {\n        state->error = addChunk_zTXt(&outv, info.text_keys[i], info.text_strings[i], &state->encoder.zlibsettings);\n        if(state->error) goto cleanup;\n      } else {\n        state->error = addChunk_tEXt(&outv, info.text_keys[i], info.text_strings[i]);\n        if(state->error) goto cleanup;\n      }\n    }\n    /*LodePNG version id in text chunk*/\n    if(state->encoder.add_id) {\n      unsigned already_added_id_text = 0;\n      for(i = 0; i != info.text_num; ++i) {\n        const char* k = info.text_keys[i];\n        /* Could use strcmp, but we're not calling or reimplementing this C library function for this use only */\n        if(k[0] == 'L' && k[1] == 'o' && k[2] == 'd' && k[3] == 'e' &&\n           k[4] == 'P' && k[5] == 'N' && k[6] == 'G' && k[7] == '\\0') {\n          already_added_id_text = 1;\n          break;\n        }\n      }\n      if(already_added_id_text == 0) {\n        state->error = addChunk_tEXt(&outv, \"LodePNG\", LODEPNG_VERSION_STRING); /*it's shorter as tEXt than as zTXt chunk*/\n        if(state->error) goto cleanup;\n      }\n    }\n    /*iTXt*/\n    for(i = 0; i != info.itext_num; ++i) {\n      if(lodepng_strlen(info.itext_keys[i]) > 79) {\n        state->error = 66; /*text chunk too large*/\n        goto cleanup;\n      }\n      if(lodepng_strlen(info.itext_keys[i]) < 1) {\n        state->error = 67; /*text chunk too small*/\n        goto cleanup;\n      }\n      state->error = addChunk_iTXt(\n          &outv, state->encoder.text_compression,\n          info.itext_keys[i], info.itext_langtags[i], info.itext_transkeys[i], info.itext_strings[i],\n          &state->encoder.zlibsettings);\n      if(state->error) goto cleanup;\n    }\n\n    /*unknown chunks between IDAT and IEND*/\n    if(info.unknown_chunks_data[2]) {\n      state->error = addUnknownChunks(&outv, info.unknown_chunks_data[2], info.unknown_chunks_size[2]);\n      if(state->error) goto cleanup;\n    }\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n    state->error = addChunk_IEND(&outv);\n    if(state->error) goto cleanup;\n  }\n\ncleanup:\n  lodepng_info_cleanup(&info);\n  lodepng_free(data);\n\n  /*instead of cleaning the vector up, give it to the output*/\n  *out = outv.data;\n  *outsize = outv.size;\n\n  return state->error;\n}\n\nunsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, const unsigned char* image,\n                               unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) {\n  unsigned error;\n  LodePNGState state;\n  lodepng_state_init(&state);\n  state.info_raw.colortype = colortype;\n  state.info_raw.bitdepth = bitdepth;\n  state.info_png.color.colortype = colortype;\n  state.info_png.color.bitdepth = bitdepth;\n  lodepng_encode(out, outsize, image, w, h, &state);\n  error = state.error;\n  lodepng_state_cleanup(&state);\n  return error;\n}\n\nunsigned lodepng_encode32(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) {\n  return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGBA, 8);\n}\n\nunsigned lodepng_encode24(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) {\n  return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGB, 8);\n}\n\n#ifdef LODEPNG_COMPILE_DISK\nunsigned lodepng_encode_file(const char* filename, const unsigned char* image, unsigned w, unsigned h,\n                             LodePNGColorType colortype, unsigned bitdepth) {\n  unsigned char* buffer;\n  size_t buffersize;\n  unsigned error = lodepng_encode_memory(&buffer, &buffersize, image, w, h, colortype, bitdepth);\n  if(!error) error = lodepng_save_file(buffer, buffersize, filename);\n  lodepng_free(buffer);\n  return error;\n}\n\nunsigned lodepng_encode32_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) {\n  return lodepng_encode_file(filename, image, w, h, LCT_RGBA, 8);\n}\n\nunsigned lodepng_encode24_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) {\n  return lodepng_encode_file(filename, image, w, h, LCT_RGB, 8);\n}\n#endif /*LODEPNG_COMPILE_DISK*/\n\nvoid lodepng_encoder_settings_init(LodePNGEncoderSettings* settings) {\n  lodepng_compress_settings_init(&settings->zlibsettings);\n  settings->filter_palette_zero = 1;\n  settings->filter_strategy = LFS_MINSUM;\n  settings->auto_convert = 1;\n  settings->force_palette = 0;\n  settings->predefined_filters = 0;\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n  settings->add_id = 0;\n  settings->text_compression = 1;\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n}\n\n#endif /*LODEPNG_COMPILE_ENCODER*/\n#endif /*LODEPNG_COMPILE_PNG*/\n\n#ifdef LODEPNG_COMPILE_ERROR_TEXT\n/*\nThis returns the description of a numerical error code in English. This is also\nthe documentation of all the error codes.\n*/\nconst char* lodepng_error_text(unsigned code) {\n  switch(code) {\n    case 0: return \"no error, everything went ok\";\n    case 1: return \"nothing done yet\"; /*the Encoder/Decoder has done nothing yet, error checking makes no sense yet*/\n    case 10: return \"end of input memory reached without huffman end code\"; /*while huffman decoding*/\n    case 11: return \"error in code tree made it jump outside of huffman tree\"; /*while huffman decoding*/\n    case 13: return \"problem while processing dynamic deflate block\";\n    case 14: return \"problem while processing dynamic deflate block\";\n    case 15: return \"problem while processing dynamic deflate block\";\n    /*this error could happen if there are only 0 or 1 symbols present in the huffman code:*/\n    case 16: return \"invalid code while processing dynamic deflate block\";\n    case 17: return \"end of out buffer memory reached while inflating\";\n    case 18: return \"invalid distance code while inflating\";\n    case 19: return \"end of out buffer memory reached while inflating\";\n    case 20: return \"invalid deflate block BTYPE encountered while decoding\";\n    case 21: return \"NLEN is not ones complement of LEN in a deflate block\";\n\n    /*end of out buffer memory reached while inflating:\n    This can happen if the inflated deflate data is longer than the amount of bytes required to fill up\n    all the pixels of the image, given the color depth and image dimensions. Something that doesn't\n    happen in a normal, well encoded, PNG image.*/\n    case 22: return \"end of out buffer memory reached while inflating\";\n    case 23: return \"end of in buffer memory reached while inflating\";\n    case 24: return \"invalid FCHECK in zlib header\";\n    case 25: return \"invalid compression method in zlib header\";\n    case 26: return \"FDICT encountered in zlib header while it's not used for PNG\";\n    case 27: return \"PNG file is smaller than a PNG header\";\n    /*Checks the magic file header, the first 8 bytes of the PNG file*/\n    case 28: return \"incorrect PNG signature, it's no PNG or corrupted\";\n    case 29: return \"first chunk is not the header chunk\";\n    case 30: return \"chunk length too large, chunk broken off at end of file\";\n    case 31: return \"illegal PNG color type or bpp\";\n    case 32: return \"illegal PNG compression method\";\n    case 33: return \"illegal PNG filter method\";\n    case 34: return \"illegal PNG interlace method\";\n    case 35: return \"chunk length of a chunk is too large or the chunk too small\";\n    case 36: return \"illegal PNG filter type encountered\";\n    case 37: return \"illegal bit depth for this color type given\";\n    case 38: return \"the palette is too small or too big\"; /*0, or more than 256 colors*/\n    case 39: return \"tRNS chunk before PLTE or has more entries than palette size\";\n    case 40: return \"tRNS chunk has wrong size for grayscale image\";\n    case 41: return \"tRNS chunk has wrong size for RGB image\";\n    case 42: return \"tRNS chunk appeared while it was not allowed for this color type\";\n    case 43: return \"bKGD chunk has wrong size for palette image\";\n    case 44: return \"bKGD chunk has wrong size for grayscale image\";\n    case 45: return \"bKGD chunk has wrong size for RGB image\";\n    case 48: return \"empty input buffer given to decoder. Maybe caused by non-existing file?\";\n    case 49: return \"jumped past memory while generating dynamic huffman tree\";\n    case 50: return \"jumped past memory while generating dynamic huffman tree\";\n    case 51: return \"jumped past memory while inflating huffman block\";\n    case 52: return \"jumped past memory while inflating\";\n    case 53: return \"size of zlib data too small\";\n    case 54: return \"repeat symbol in tree while there was no value symbol yet\";\n    /*jumped past tree while generating huffman tree, this could be when the\n    tree will have more leaves than symbols after generating it out of the\n    given lengths. They call this an oversubscribed dynamic bit lengths tree in zlib.*/\n    case 55: return \"jumped past tree while generating huffman tree\";\n    case 56: return \"given output image colortype or bitdepth not supported for color conversion\";\n    case 57: return \"invalid CRC encountered (checking CRC can be disabled)\";\n    case 58: return \"invalid ADLER32 encountered (checking ADLER32 can be disabled)\";\n    case 59: return \"requested color conversion not supported\";\n    case 60: return \"invalid window size given in the settings of the encoder (must be 0-32768)\";\n    case 61: return \"invalid BTYPE given in the settings of the encoder (only 0, 1 and 2 are allowed)\";\n    /*LodePNG leaves the choice of RGB to grayscale conversion formula to the user.*/\n    case 62: return \"conversion from color to grayscale not supported\";\n    /*(2^31-1)*/\n    case 63: return \"length of a chunk too long, max allowed for PNG is 2147483647 bytes per chunk\";\n    /*this would result in the inability of a deflated block to ever contain an end code. It must be at least 1.*/\n    case 64: return \"the length of the END symbol 256 in the Huffman tree is 0\";\n    case 66: return \"the length of a text chunk keyword given to the encoder is longer than the maximum of 79 bytes\";\n    case 67: return \"the length of a text chunk keyword given to the encoder is smaller than the minimum of 1 byte\";\n    case 68: return \"tried to encode a PLTE chunk with a palette that has less than 1 or more than 256 colors\";\n    case 69: return \"unknown chunk type with 'critical' flag encountered by the decoder\";\n    case 71: return \"invalid interlace mode given to encoder (must be 0 or 1)\";\n    case 72: return \"while decoding, invalid compression method encountering in zTXt or iTXt chunk (it must be 0)\";\n    case 73: return \"invalid tIME chunk size\";\n    case 74: return \"invalid pHYs chunk size\";\n    /*length could be wrong, or data chopped off*/\n    case 75: return \"no null termination char found while decoding text chunk\";\n    case 76: return \"iTXt chunk too short to contain required bytes\";\n    case 77: return \"integer overflow in buffer size\";\n    case 78: return \"failed to open file for reading\"; /*file doesn't exist or couldn't be opened for reading*/\n    case 79: return \"failed to open file for writing\";\n    case 80: return \"tried creating a tree of 0 symbols\";\n    case 81: return \"lazy matching at pos 0 is impossible\";\n    case 82: return \"color conversion to palette requested while a color isn't in palette, or index out of bounds\";\n    case 83: return \"memory allocation failed\";\n    case 84: return \"given image too small to contain all pixels to be encoded\";\n    case 86: return \"impossible offset in lz77 encoding (internal bug)\";\n    case 87: return \"must provide custom zlib function pointer if LODEPNG_COMPILE_ZLIB is not defined\";\n    case 88: return \"invalid filter strategy given for LodePNGEncoderSettings.filter_strategy\";\n    case 89: return \"text chunk keyword too short or long: must have size 1-79\";\n    /*the windowsize in the LodePNGCompressSettings. Requiring POT(==> & instead of %) makes encoding 12% faster.*/\n    case 90: return \"windowsize must be a power of two\";\n    case 91: return \"invalid decompressed idat size\";\n    case 92: return \"integer overflow due to too many pixels\";\n    case 93: return \"zero width or height is invalid\";\n    case 94: return \"header chunk must have a size of 13 bytes\";\n    case 95: return \"integer overflow with combined idat chunk size\";\n    case 96: return \"invalid gAMA chunk size\";\n    case 97: return \"invalid cHRM chunk size\";\n    case 98: return \"invalid sRGB chunk size\";\n    case 99: return \"invalid sRGB rendering intent\";\n    case 100: return \"invalid ICC profile color type, the PNG specification only allows RGB or GRAY\";\n    case 101: return \"PNG specification does not allow RGB ICC profile on gray color types and vice versa\";\n    case 102: return \"not allowed to set grayscale ICC profile with colored pixels by PNG specification\";\n    case 103: return \"invalid palette index in bKGD chunk. Maybe it came before PLTE chunk?\";\n    case 104: return \"invalid bKGD color while encoding (e.g. palette index out of range)\";\n    case 105: return \"integer overflow of bitsize\";\n    case 106: return \"PNG file must have PLTE chunk if color type is palette\";\n    case 107: return \"color convert from palette mode requested without setting the palette data in it\";\n    case 108: return \"tried to add more than 256 values to a palette\";\n    /*this limit can be configured in LodePNGDecompressSettings*/\n    case 109: return \"tried to decompress zlib or deflate data larger than desired max_output_size\";\n    case 110: return \"custom zlib or inflate decompression failed\";\n    case 111: return \"custom zlib or deflate compression failed\";\n    /*max text size limit can be configured in LodePNGDecoderSettings. This error prevents\n    unreasonable memory consumption when decoding due to impossibly large text sizes.*/\n    case 112: return \"compressed text unreasonably large\";\n    /*max ICC size limit can be configured in LodePNGDecoderSettings. This error prevents\n    unreasonable memory consumption when decoding due to impossibly large ICC profile*/\n    case 113: return \"ICC profile unreasonably large\";\n  }\n  return \"unknown error code\";\n}\n#endif /*LODEPNG_COMPILE_ERROR_TEXT*/\n\n/* ////////////////////////////////////////////////////////////////////////// */\n/* ////////////////////////////////////////////////////////////////////////// */\n/* // C++ Wrapper                                                          // */\n/* ////////////////////////////////////////////////////////////////////////// */\n/* ////////////////////////////////////////////////////////////////////////// */\n\n#ifdef LODEPNG_COMPILE_CPP\nnamespace lodepng {\n\n#ifdef LODEPNG_COMPILE_DISK\nunsigned load_file(std::vector<unsigned char>& buffer, const std::string& filename) {\n  long size = lodepng_filesize(filename.c_str());\n  if(size < 0) return 78;\n  buffer.resize((size_t)size);\n  return size == 0 ? 0 : lodepng_buffer_file(&buffer[0], (size_t)size, filename.c_str());\n}\n\n/*write given buffer to the file, overwriting the file, it doesn't append to it.*/\nunsigned save_file(const std::vector<unsigned char>& buffer, const std::string& filename) {\n  return lodepng_save_file(buffer.empty() ? 0 : &buffer[0], buffer.size(), filename.c_str());\n}\n#endif /* LODEPNG_COMPILE_DISK */\n\n#ifdef LODEPNG_COMPILE_ZLIB\n#ifdef LODEPNG_COMPILE_DECODER\nunsigned decompress(std::vector<unsigned char>& out, const unsigned char* in, size_t insize,\n                    const LodePNGDecompressSettings& settings) {\n  unsigned char* buffer = 0;\n  size_t buffersize = 0;\n  unsigned error = zlib_decompress(&buffer, &buffersize, 0, in, insize, &settings);\n  if(buffer) {\n    out.insert(out.end(), &buffer[0], &buffer[buffersize]);\n    lodepng_free(buffer);\n  }\n  return error;\n}\n\nunsigned decompress(std::vector<unsigned char>& out, const std::vector<unsigned char>& in,\n                    const LodePNGDecompressSettings& settings) {\n  return decompress(out, in.empty() ? 0 : &in[0], in.size(), settings);\n}\n#endif /* LODEPNG_COMPILE_DECODER */\n\n#ifdef LODEPNG_COMPILE_ENCODER\nunsigned compress(std::vector<unsigned char>& out, const unsigned char* in, size_t insize,\n                  const LodePNGCompressSettings& settings) {\n  unsigned char* buffer = 0;\n  size_t buffersize = 0;\n  unsigned error = zlib_compress(&buffer, &buffersize, in, insize, &settings);\n  if(buffer) {\n    out.insert(out.end(), &buffer[0], &buffer[buffersize]);\n    lodepng_free(buffer);\n  }\n  return error;\n}\n\nunsigned compress(std::vector<unsigned char>& out, const std::vector<unsigned char>& in,\n                  const LodePNGCompressSettings& settings) {\n  return compress(out, in.empty() ? 0 : &in[0], in.size(), settings);\n}\n#endif /* LODEPNG_COMPILE_ENCODER */\n#endif /* LODEPNG_COMPILE_ZLIB */\n\n\n#ifdef LODEPNG_COMPILE_PNG\n\nState::State() {\n  lodepng_state_init(this);\n}\n\nState::State(const State& other) {\n  lodepng_state_init(this);\n  lodepng_state_copy(this, &other);\n}\n\nState::~State() {\n  lodepng_state_cleanup(this);\n}\n\nState& State::operator=(const State& other) {\n  lodepng_state_copy(this, &other);\n  return *this;\n}\n\n#ifdef LODEPNG_COMPILE_DECODER\n\nunsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h, const unsigned char* in,\n                size_t insize, LodePNGColorType colortype, unsigned bitdepth) {\n  unsigned char* buffer = 0;\n  unsigned error = lodepng_decode_memory(&buffer, &w, &h, in, insize, colortype, bitdepth);\n  if(buffer && !error) {\n    State state;\n    state.info_raw.colortype = colortype;\n    state.info_raw.bitdepth = bitdepth;\n    size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw);\n    out.insert(out.end(), &buffer[0], &buffer[buffersize]);\n  }\n  lodepng_free(buffer);\n  return error;\n}\n\nunsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h,\n                const std::vector<unsigned char>& in, LodePNGColorType colortype, unsigned bitdepth) {\n  return decode(out, w, h, in.empty() ? 0 : &in[0], (unsigned)in.size(), colortype, bitdepth);\n}\n\nunsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h,\n                State& state,\n                const unsigned char* in, size_t insize) {\n  unsigned char* buffer = NULL;\n  unsigned error = lodepng_decode(&buffer, &w, &h, &state, in, insize);\n  if(buffer && !error) {\n    size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw);\n    out.insert(out.end(), &buffer[0], &buffer[buffersize]);\n  }\n  lodepng_free(buffer);\n  return error;\n}\n\nunsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h,\n                State& state,\n                const std::vector<unsigned char>& in) {\n  return decode(out, w, h, state, in.empty() ? 0 : &in[0], in.size());\n}\n\n#ifdef LODEPNG_COMPILE_DISK\nunsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h, const std::string& filename,\n                LodePNGColorType colortype, unsigned bitdepth) {\n  std::vector<unsigned char> buffer;\n  /* safe output values in case error happens */\n  w = h = 0;\n  unsigned error = load_file(buffer, filename);\n  if(error) return error;\n  return decode(out, w, h, buffer, colortype, bitdepth);\n}\n#endif /* LODEPNG_COMPILE_DECODER */\n#endif /* LODEPNG_COMPILE_DISK */\n\n#ifdef LODEPNG_COMPILE_ENCODER\nunsigned encode(std::vector<unsigned char>& out, const unsigned char* in, unsigned w, unsigned h,\n                LodePNGColorType colortype, unsigned bitdepth) {\n  unsigned char* buffer;\n  size_t buffersize;\n  unsigned error = lodepng_encode_memory(&buffer, &buffersize, in, w, h, colortype, bitdepth);\n  if(buffer) {\n    out.insert(out.end(), &buffer[0], &buffer[buffersize]);\n    lodepng_free(buffer);\n  }\n  return error;\n}\n\nunsigned encode(std::vector<unsigned char>& out,\n                const std::vector<unsigned char>& in, unsigned w, unsigned h,\n                LodePNGColorType colortype, unsigned bitdepth) {\n  if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84;\n  return encode(out, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth);\n}\n\nunsigned encode(std::vector<unsigned char>& out,\n                const unsigned char* in, unsigned w, unsigned h,\n                State& state) {\n  unsigned char* buffer;\n  size_t buffersize;\n  unsigned error = lodepng_encode(&buffer, &buffersize, in, w, h, &state);\n  if(buffer) {\n    out.insert(out.end(), &buffer[0], &buffer[buffersize]);\n    lodepng_free(buffer);\n  }\n  return error;\n}\n\nunsigned encode(std::vector<unsigned char>& out,\n                const std::vector<unsigned char>& in, unsigned w, unsigned h,\n                State& state) {\n  if(lodepng_get_raw_size(w, h, &state.info_raw) > in.size()) return 84;\n  return encode(out, in.empty() ? 0 : &in[0], w, h, state);\n}\n\n#ifdef LODEPNG_COMPILE_DISK\nunsigned encode(const std::string& filename,\n                const unsigned char* in, unsigned w, unsigned h,\n                LodePNGColorType colortype, unsigned bitdepth) {\n  std::vector<unsigned char> buffer;\n  unsigned error = encode(buffer, in, w, h, colortype, bitdepth);\n  if(!error) error = save_file(buffer, filename);\n  return error;\n}\n\nunsigned encode(const std::string& filename,\n                const std::vector<unsigned char>& in, unsigned w, unsigned h,\n                LodePNGColorType colortype, unsigned bitdepth) {\n  if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84;\n  return encode(filename, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth);\n}\n#endif /* LODEPNG_COMPILE_DISK */\n#endif /* LODEPNG_COMPILE_ENCODER */\n#endif /* LODEPNG_COMPILE_PNG */\n} /* namespace lodepng */\n#endif /*LODEPNG_COMPILE_CPP*/\n"
  },
  {
    "path": "src/libraries/lodepng/lodepng.h",
    "content": "/*\nLodePNG version 20210627\n\nCopyright (c) 2005-2021 Lode Vandevenne\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n    1. The origin of this software must not be misrepresented; you must not\n    claim that you wrote the original software. If you use this software\n    in a product, an acknowledgment in the product documentation would be\n    appreciated but is not required.\n\n    2. Altered source versions must be plainly marked as such, and must not be\n    misrepresented as being the original software.\n\n    3. This notice may not be removed or altered from any source\n    distribution.\n*/\n\n#ifndef LODEPNG_H\n#define LODEPNG_H\n\n#include <string.h> /*for size_t*/\n\nextern const char* LODEPNG_VERSION_STRING;\n\n/*\nThe following #defines are used to create code sections. They can be disabled\nto disable code sections, which can give faster compile time and smaller binary.\nThe \"NO_COMPILE\" defines are designed to be used to pass as defines to the\ncompiler command to disable them without modifying this header, e.g.\n-DLODEPNG_NO_COMPILE_ZLIB for gcc.\nIn addition to those below, you can also define LODEPNG_NO_COMPILE_CRC to\nallow implementing a custom lodepng_crc32.\n*/\n/*deflate & zlib. If disabled, you must specify alternative zlib functions in\nthe custom_zlib field of the compress and decompress settings*/\n#ifndef LODEPNG_NO_COMPILE_ZLIB\n#define LODEPNG_COMPILE_ZLIB\n#endif\n\n/*png encoder and png decoder*/\n#ifndef LODEPNG_NO_COMPILE_PNG\n#define LODEPNG_COMPILE_PNG\n#endif\n\n/*deflate&zlib decoder and png decoder*/\n#ifndef LODEPNG_NO_COMPILE_DECODER\n#define LODEPNG_COMPILE_DECODER\n#endif\n\n/*deflate&zlib encoder and png encoder*/\n#ifndef LODEPNG_NO_COMPILE_ENCODER\n#define LODEPNG_COMPILE_ENCODER\n#endif\n\n/*the optional built in harddisk file loading and saving functions*/\n#ifndef LODEPNG_NO_COMPILE_DISK\n#define LODEPNG_COMPILE_DISK\n#endif\n\n/*support for chunks other than IHDR, IDAT, PLTE, tRNS, IEND: ancillary and unknown chunks*/\n#ifndef LODEPNG_NO_COMPILE_ANCILLARY_CHUNKS\n#define LODEPNG_COMPILE_ANCILLARY_CHUNKS\n#endif\n\n/*ability to convert error numerical codes to English text string*/\n#ifndef LODEPNG_NO_COMPILE_ERROR_TEXT\n#define LODEPNG_COMPILE_ERROR_TEXT\n#endif\n\n/*Compile the default allocators (C's free, malloc and realloc). If you disable this,\nyou can define the functions lodepng_free, lodepng_malloc and lodepng_realloc in your\nsource files with custom allocators.*/\n#ifndef LODEPNG_NO_COMPILE_ALLOCATORS\n#define LODEPNG_COMPILE_ALLOCATORS\n#endif\n\n/*compile the C++ version (you can disable the C++ wrapper here even when compiling for C++)*/\n#ifdef __cplusplus\n#ifndef LODEPNG_NO_COMPILE_CPP\n#define LODEPNG_COMPILE_CPP\n#endif\n#endif\n\n#ifdef LODEPNG_COMPILE_CPP\n#include <vector>\n#include <string>\n#endif /*LODEPNG_COMPILE_CPP*/\n\n#ifdef LODEPNG_COMPILE_PNG\n/*The PNG color types (also used for raw image).*/\ntypedef enum LodePNGColorType {\n  LCT_GREY = 0, /*grayscale: 1,2,4,8,16 bit*/\n  LCT_RGB = 2, /*RGB: 8,16 bit*/\n  LCT_PALETTE = 3, /*palette: 1,2,4,8 bit*/\n  LCT_GREY_ALPHA = 4, /*grayscale with alpha: 8,16 bit*/\n  LCT_RGBA = 6, /*RGB with alpha: 8,16 bit*/\n  /*LCT_MAX_OCTET_VALUE lets the compiler allow this enum to represent any invalid\n  byte value from 0 to 255 that could be present in an invalid PNG file header. Do\n  not use, compare with or set the name LCT_MAX_OCTET_VALUE, instead either use\n  the valid color type names above, or numeric values like 1 or 7 when checking for\n  particular disallowed color type byte values, or cast to integer to print it.*/\n  LCT_MAX_OCTET_VALUE = 255\n} LodePNGColorType;\n\n#ifdef LODEPNG_COMPILE_DECODER\n/*\nConverts PNG data in memory to raw pixel data.\nout: Output parameter. Pointer to buffer that will contain the raw pixel data.\n     After decoding, its size is w * h * (bytes per pixel) bytes larger than\n     initially. Bytes per pixel depends on colortype and bitdepth.\n     Must be freed after usage with free(*out).\n     Note: for 16-bit per channel colors, uses big endian format like PNG does.\nw: Output parameter. Pointer to width of pixel data.\nh: Output parameter. Pointer to height of pixel data.\nin: Memory buffer with the PNG file.\ninsize: size of the in buffer.\ncolortype: the desired color type for the raw output image. See explanation on PNG color types.\nbitdepth: the desired bit depth for the raw output image. See explanation on PNG color types.\nReturn value: LodePNG error code (0 means no error).\n*/\nunsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h,\n                               const unsigned char* in, size_t insize,\n                               LodePNGColorType colortype, unsigned bitdepth);\n\n/*Same as lodepng_decode_memory, but always decodes to 32-bit RGBA raw image*/\nunsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h,\n                          const unsigned char* in, size_t insize);\n\n/*Same as lodepng_decode_memory, but always decodes to 24-bit RGB raw image*/\nunsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h,\n                          const unsigned char* in, size_t insize);\n\n#ifdef LODEPNG_COMPILE_DISK\n/*\nLoad PNG from disk, from file with given name.\nSame as the other decode functions, but instead takes a filename as input.\n\nNOTE: Wide-character filenames are not supported, you can use an external method\nto handle such files and decode in-memory.*/\nunsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h,\n                             const char* filename,\n                             LodePNGColorType colortype, unsigned bitdepth);\n\n/*Same as lodepng_decode_file, but always decodes to 32-bit RGBA raw image.\n\nNOTE: Wide-character filenames are not supported, you can use an external method\nto handle such files and decode in-memory.*/\nunsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h,\n                               const char* filename);\n\n/*Same as lodepng_decode_file, but always decodes to 24-bit RGB raw image.\n\nNOTE: Wide-character filenames are not supported, you can use an external method\nto handle such files and decode in-memory.*/\nunsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h,\n                               const char* filename);\n#endif /*LODEPNG_COMPILE_DISK*/\n#endif /*LODEPNG_COMPILE_DECODER*/\n\n\n#ifdef LODEPNG_COMPILE_ENCODER\n/*\nConverts raw pixel data into a PNG image in memory. The colortype and bitdepth\n  of the output PNG image cannot be chosen, they are automatically determined\n  by the colortype, bitdepth and content of the input pixel data.\n  Note: for 16-bit per channel colors, needs big endian format like PNG does.\nout: Output parameter. Pointer to buffer that will contain the PNG image data.\n     Must be freed after usage with free(*out).\noutsize: Output parameter. Pointer to the size in bytes of the out buffer.\nimage: The raw pixel data to encode. The size of this buffer should be\n       w * h * (bytes per pixel), bytes per pixel depends on colortype and bitdepth.\nw: width of the raw pixel data in pixels.\nh: height of the raw pixel data in pixels.\ncolortype: the color type of the raw input image. See explanation on PNG color types.\nbitdepth: the bit depth of the raw input image. See explanation on PNG color types.\nReturn value: LodePNG error code (0 means no error).\n*/\nunsigned lodepng_encode_memory(unsigned char** out, size_t* outsize,\n                               const unsigned char* image, unsigned w, unsigned h,\n                               LodePNGColorType colortype, unsigned bitdepth);\n\n/*Same as lodepng_encode_memory, but always encodes from 32-bit RGBA raw image.*/\nunsigned lodepng_encode32(unsigned char** out, size_t* outsize,\n                          const unsigned char* image, unsigned w, unsigned h);\n\n/*Same as lodepng_encode_memory, but always encodes from 24-bit RGB raw image.*/\nunsigned lodepng_encode24(unsigned char** out, size_t* outsize,\n                          const unsigned char* image, unsigned w, unsigned h);\n\n#ifdef LODEPNG_COMPILE_DISK\n/*\nConverts raw pixel data into a PNG file on disk.\nSame as the other encode functions, but instead takes a filename as output.\n\nNOTE: This overwrites existing files without warning!\n\nNOTE: Wide-character filenames are not supported, you can use an external method\nto handle such files and encode in-memory.*/\nunsigned lodepng_encode_file(const char* filename,\n                             const unsigned char* image, unsigned w, unsigned h,\n                             LodePNGColorType colortype, unsigned bitdepth);\n\n/*Same as lodepng_encode_file, but always encodes from 32-bit RGBA raw image.\n\nNOTE: Wide-character filenames are not supported, you can use an external method\nto handle such files and encode in-memory.*/\nunsigned lodepng_encode32_file(const char* filename,\n                               const unsigned char* image, unsigned w, unsigned h);\n\n/*Same as lodepng_encode_file, but always encodes from 24-bit RGB raw image.\n\nNOTE: Wide-character filenames are not supported, you can use an external method\nto handle such files and encode in-memory.*/\nunsigned lodepng_encode24_file(const char* filename,\n                               const unsigned char* image, unsigned w, unsigned h);\n#endif /*LODEPNG_COMPILE_DISK*/\n#endif /*LODEPNG_COMPILE_ENCODER*/\n\n\n#ifdef LODEPNG_COMPILE_CPP\nnamespace lodepng {\n#ifdef LODEPNG_COMPILE_DECODER\n/*Same as lodepng_decode_memory, but decodes to an std::vector. The colortype\nis the format to output the pixels to. Default is RGBA 8-bit per channel.*/\nunsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h,\n                const unsigned char* in, size_t insize,\n                LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8);\nunsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h,\n                const std::vector<unsigned char>& in,\n                LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8);\n#ifdef LODEPNG_COMPILE_DISK\n/*\nConverts PNG file from disk to raw pixel data in memory.\nSame as the other decode functions, but instead takes a filename as input.\n\nNOTE: Wide-character filenames are not supported, you can use an external method\nto handle such files and decode in-memory.\n*/\nunsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h,\n                const std::string& filename,\n                LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8);\n#endif /* LODEPNG_COMPILE_DISK */\n#endif /* LODEPNG_COMPILE_DECODER */\n\n#ifdef LODEPNG_COMPILE_ENCODER\n/*Same as lodepng_encode_memory, but encodes to an std::vector. colortype\nis that of the raw input data. The output PNG color type will be auto chosen.*/\nunsigned encode(std::vector<unsigned char>& out,\n                const unsigned char* in, unsigned w, unsigned h,\n                LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8);\nunsigned encode(std::vector<unsigned char>& out,\n                const std::vector<unsigned char>& in, unsigned w, unsigned h,\n                LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8);\n#ifdef LODEPNG_COMPILE_DISK\n/*\nConverts 32-bit RGBA raw pixel data into a PNG file on disk.\nSame as the other encode functions, but instead takes a filename as output.\n\nNOTE: This overwrites existing files without warning!\n\nNOTE: Wide-character filenames are not supported, you can use an external method\nto handle such files and decode in-memory.\n*/\nunsigned encode(const std::string& filename,\n                const unsigned char* in, unsigned w, unsigned h,\n                LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8);\nunsigned encode(const std::string& filename,\n                const std::vector<unsigned char>& in, unsigned w, unsigned h,\n                LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8);\n#endif /* LODEPNG_COMPILE_DISK */\n#endif /* LODEPNG_COMPILE_ENCODER */\n} /* namespace lodepng */\n#endif /*LODEPNG_COMPILE_CPP*/\n#endif /*LODEPNG_COMPILE_PNG*/\n\n#ifdef LODEPNG_COMPILE_ERROR_TEXT\n/*Returns an English description of the numerical error code.*/\nconst char* lodepng_error_text(unsigned code);\n#endif /*LODEPNG_COMPILE_ERROR_TEXT*/\n\n#ifdef LODEPNG_COMPILE_DECODER\n/*Settings for zlib decompression*/\ntypedef struct LodePNGDecompressSettings LodePNGDecompressSettings;\nstruct LodePNGDecompressSettings {\n  /* Check LodePNGDecoderSettings for more ignorable errors such as ignore_crc */\n  unsigned ignore_adler32; /*if 1, continue and don't give an error message if the Adler32 checksum is corrupted*/\n  unsigned ignore_nlen; /*ignore complement of len checksum in uncompressed blocks*/\n\n  /*Maximum decompressed size, beyond this the decoder may (and is encouraged to) stop decoding,\n  return an error, output a data size > max_output_size and all the data up to that point. This is\n  not hard limit nor a guarantee, but can prevent excessive memory usage. This setting is\n  ignored by the PNG decoder, but is used by the deflate/zlib decoder and can be used by custom ones.\n  Set to 0 to impose no limit (the default).*/\n  size_t max_output_size;\n\n  /*use custom zlib decoder instead of built in one (default: null).\n  Should return 0 if success, any non-0 if error (numeric value not exposed).*/\n  unsigned (*custom_zlib)(unsigned char**, size_t*,\n                          const unsigned char*, size_t,\n                          const LodePNGDecompressSettings*);\n  /*use custom deflate decoder instead of built in one (default: null)\n  if custom_zlib is not null, custom_inflate is ignored (the zlib format uses deflate).\n  Should return 0 if success, any non-0 if error (numeric value not exposed).*/\n  unsigned (*custom_inflate)(unsigned char**, size_t*,\n                             const unsigned char*, size_t,\n                             const LodePNGDecompressSettings*);\n\n  const void* custom_context; /*optional custom settings for custom functions*/\n};\n\nextern const LodePNGDecompressSettings lodepng_default_decompress_settings;\nvoid lodepng_decompress_settings_init(LodePNGDecompressSettings* settings);\n#endif /*LODEPNG_COMPILE_DECODER*/\n\n#ifdef LODEPNG_COMPILE_ENCODER\n/*\nSettings for zlib compression. Tweaking these settings tweaks the balance\nbetween speed and compression ratio.\n*/\ntypedef struct LodePNGCompressSettings LodePNGCompressSettings;\nstruct LodePNGCompressSettings /*deflate = compress*/ {\n  /*LZ77 related settings*/\n  unsigned btype; /*the block type for LZ (0, 1, 2 or 3, see zlib standard). Should be 2 for proper compression.*/\n  unsigned use_lz77; /*whether or not to use LZ77. Should be 1 for proper compression.*/\n  unsigned windowsize; /*must be a power of two <= 32768. higher compresses more but is slower. Default value: 2048.*/\n  unsigned minmatch; /*minimum lz77 length. 3 is normally best, 6 can be better for some PNGs. Default: 0*/\n  unsigned nicematch; /*stop searching if >= this length found. Set to 258 for best compression. Default: 128*/\n  unsigned lazymatching; /*use lazy matching: better compression but a bit slower. Default: true*/\n\n  /*use custom zlib encoder instead of built in one (default: null)*/\n  unsigned (*custom_zlib)(unsigned char**, size_t*,\n                          const unsigned char*, size_t,\n                          const LodePNGCompressSettings*);\n  /*use custom deflate encoder instead of built in one (default: null)\n  if custom_zlib is used, custom_deflate is ignored since only the built in\n  zlib function will call custom_deflate*/\n  unsigned (*custom_deflate)(unsigned char**, size_t*,\n                             const unsigned char*, size_t,\n                             const LodePNGCompressSettings*);\n\n  const void* custom_context; /*optional custom settings for custom functions*/\n};\n\nextern const LodePNGCompressSettings lodepng_default_compress_settings;\nvoid lodepng_compress_settings_init(LodePNGCompressSettings* settings);\n#endif /*LODEPNG_COMPILE_ENCODER*/\n\n#ifdef LODEPNG_COMPILE_PNG\n/*\nColor mode of an image. Contains all information required to decode the pixel\nbits to RGBA colors. This information is the same as used in the PNG file\nformat, and is used both for PNG and raw image data in LodePNG.\n*/\ntypedef struct LodePNGColorMode {\n  /*header (IHDR)*/\n  LodePNGColorType colortype; /*color type, see PNG standard or documentation further in this header file*/\n  unsigned bitdepth;  /*bits per sample, see PNG standard or documentation further in this header file*/\n\n  /*\n  palette (PLTE and tRNS)\n\n  Dynamically allocated with the colors of the palette, including alpha.\n  This field may not be allocated directly, use lodepng_color_mode_init first,\n  then lodepng_palette_add per color to correctly initialize it (to ensure size\n  of exactly 1024 bytes).\n\n  The alpha channels must be set as well, set them to 255 for opaque images.\n\n  When decoding, by default you can ignore this palette, since LodePNG already\n  fills the palette colors in the pixels of the raw RGBA output.\n\n  The palette is only supported for color type 3.\n  */\n  unsigned char* palette; /*palette in RGBARGBA... order. Must be either 0, or when allocated must have 1024 bytes*/\n  size_t palettesize; /*palette size in number of colors (amount of used bytes is 4 * palettesize)*/\n\n  /*\n  transparent color key (tRNS)\n\n  This color uses the same bit depth as the bitdepth value in this struct, which can be 1-bit to 16-bit.\n  For grayscale PNGs, r, g and b will all 3 be set to the same.\n\n  When decoding, by default you can ignore this information, since LodePNG sets\n  pixels with this key to transparent already in the raw RGBA output.\n\n  The color key is only supported for color types 0 and 2.\n  */\n  unsigned key_defined; /*is a transparent color key given? 0 = false, 1 = true*/\n  unsigned key_r;       /*red/grayscale component of color key*/\n  unsigned key_g;       /*green component of color key*/\n  unsigned key_b;       /*blue component of color key*/\n} LodePNGColorMode;\n\n/*init, cleanup and copy functions to use with this struct*/\nvoid lodepng_color_mode_init(LodePNGColorMode* info);\nvoid lodepng_color_mode_cleanup(LodePNGColorMode* info);\n/*return value is error code (0 means no error)*/\nunsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source);\n/* Makes a temporary LodePNGColorMode that does not need cleanup (no palette) */\nLodePNGColorMode lodepng_color_mode_make(LodePNGColorType colortype, unsigned bitdepth);\n\nvoid lodepng_palette_clear(LodePNGColorMode* info);\n/*add 1 color to the palette*/\nunsigned lodepng_palette_add(LodePNGColorMode* info,\n                             unsigned char r, unsigned char g, unsigned char b, unsigned char a);\n\n/*get the total amount of bits per pixel, based on colortype and bitdepth in the struct*/\nunsigned lodepng_get_bpp(const LodePNGColorMode* info);\n/*get the amount of color channels used, based on colortype in the struct.\nIf a palette is used, it counts as 1 channel.*/\nunsigned lodepng_get_channels(const LodePNGColorMode* info);\n/*is it a grayscale type? (only colortype 0 or 4)*/\nunsigned lodepng_is_greyscale_type(const LodePNGColorMode* info);\n/*has it got an alpha channel? (only colortype 2 or 6)*/\nunsigned lodepng_is_alpha_type(const LodePNGColorMode* info);\n/*has it got a palette? (only colortype 3)*/\nunsigned lodepng_is_palette_type(const LodePNGColorMode* info);\n/*only returns true if there is a palette and there is a value in the palette with alpha < 255.\nLoops through the palette to check this.*/\nunsigned lodepng_has_palette_alpha(const LodePNGColorMode* info);\n/*\nCheck if the given color info indicates the possibility of having non-opaque pixels in the PNG image.\nReturns true if the image can have translucent or invisible pixels (it still be opaque if it doesn't use such pixels).\nReturns false if the image can only have opaque pixels.\nIn detail, it returns true only if it's a color type with alpha, or has a palette with non-opaque values,\nor if \"key_defined\" is true.\n*/\nunsigned lodepng_can_have_alpha(const LodePNGColorMode* info);\n/*Returns the byte size of a raw image buffer with given width, height and color mode*/\nsize_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color);\n\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n/*The information of a Time chunk in PNG.*/\ntypedef struct LodePNGTime {\n  unsigned year;    /*2 bytes used (0-65535)*/\n  unsigned month;   /*1-12*/\n  unsigned day;     /*1-31*/\n  unsigned hour;    /*0-23*/\n  unsigned minute;  /*0-59*/\n  unsigned second;  /*0-60 (to allow for leap seconds)*/\n} LodePNGTime;\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n\n/*Information about the PNG image, except pixels, width and height.*/\ntypedef struct LodePNGInfo {\n  /*header (IHDR), palette (PLTE) and transparency (tRNS) chunks*/\n  unsigned compression_method;/*compression method of the original file. Always 0.*/\n  unsigned filter_method;     /*filter method of the original file*/\n  unsigned interlace_method;  /*interlace method of the original file: 0=none, 1=Adam7*/\n  LodePNGColorMode color;     /*color type and bits, palette and transparency of the PNG file*/\n\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n  /*\n  Suggested background color chunk (bKGD)\n\n  This uses the same color mode and bit depth as the PNG (except no alpha channel),\n  with values truncated to the bit depth in the unsigned integer.\n\n  For grayscale and palette PNGs, the value is stored in background_r. The values\n  in background_g and background_b are then unused.\n\n  So when decoding, you may get these in a different color mode than the one you requested\n  for the raw pixels.\n\n  When encoding with auto_convert, you must use the color model defined in info_png.color for\n  these values. The encoder normally ignores info_png.color when auto_convert is on, but will\n  use it to interpret these values (and convert copies of them to its chosen color model).\n\n  When encoding, avoid setting this to an expensive color, such as a non-gray value\n  when the image is gray, or the compression will be worse since it will be forced to\n  write the PNG with a more expensive color mode (when auto_convert is on).\n\n  The decoder does not use this background color to edit the color of pixels. This is a\n  completely optional metadata feature.\n  */\n  unsigned background_defined; /*is a suggested background color given?*/\n  unsigned background_r;       /*red/gray/palette component of suggested background color*/\n  unsigned background_g;       /*green component of suggested background color*/\n  unsigned background_b;       /*blue component of suggested background color*/\n\n  /*\n  Non-international text chunks (tEXt and zTXt)\n\n  The char** arrays each contain num strings. The actual messages are in\n  text_strings, while text_keys are keywords that give a short description what\n  the actual text represents, e.g. Title, Author, Description, or anything else.\n\n  All the string fields below including strings, keys, names and language tags are null terminated.\n  The PNG specification uses null characters for the keys, names and tags, and forbids null\n  characters to appear in the main text which is why we can use null termination everywhere here.\n\n  A keyword is minimum 1 character and maximum 79 characters long (plus the\n  additional null terminator). It's discouraged to use a single line length\n  longer than 79 characters for texts.\n\n  Don't allocate these text buffers yourself. Use the init/cleanup functions\n  correctly and use lodepng_add_text and lodepng_clear_text.\n\n  Standard text chunk keywords and strings are encoded using Latin-1.\n  */\n  size_t text_num; /*the amount of texts in these char** buffers (there may be more texts in itext)*/\n  char** text_keys; /*the keyword of a text chunk (e.g. \"Comment\")*/\n  char** text_strings; /*the actual text*/\n\n  /*\n  International text chunks (iTXt)\n  Similar to the non-international text chunks, but with additional strings\n  \"langtags\" and \"transkeys\", and the following text encodings are used:\n  keys: Latin-1, langtags: ASCII, transkeys and strings: UTF-8.\n  keys must be 1-79 characters (plus the additional null terminator), the other\n  strings are any length.\n  */\n  size_t itext_num; /*the amount of international texts in this PNG*/\n  char** itext_keys; /*the English keyword of the text chunk (e.g. \"Comment\")*/\n  char** itext_langtags; /*language tag for this text's language, ISO/IEC 646 string, e.g. ISO 639 language tag*/\n  char** itext_transkeys; /*keyword translated to the international language - UTF-8 string*/\n  char** itext_strings; /*the actual international text - UTF-8 string*/\n\n  /*time chunk (tIME)*/\n  unsigned time_defined; /*set to 1 to make the encoder generate a tIME chunk*/\n  LodePNGTime time;\n\n  /*phys chunk (pHYs)*/\n  unsigned phys_defined; /*if 0, there is no pHYs chunk and the values below are undefined, if 1 else there is one*/\n  unsigned phys_x; /*pixels per unit in x direction*/\n  unsigned phys_y; /*pixels per unit in y direction*/\n  unsigned phys_unit; /*may be 0 (unknown unit) or 1 (metre)*/\n\n  /*\n  Color profile related chunks: gAMA, cHRM, sRGB, iCPP\n\n  LodePNG does not apply any color conversions on pixels in the encoder or decoder and does not interpret these color\n  profile values. It merely passes on the information. If you wish to use color profiles and convert colors, please\n  use these values with a color management library.\n\n  See the PNG, ICC and sRGB specifications for more information about the meaning of these values.\n  */\n\n  /* gAMA chunk: optional, overridden by sRGB or iCCP if those are present. */\n  unsigned gama_defined; /* Whether a gAMA chunk is present (0 = not present, 1 = present). */\n  unsigned gama_gamma;   /* Gamma exponent times 100000 */\n\n  /* cHRM chunk: optional, overridden by sRGB or iCCP if those are present. */\n  unsigned chrm_defined; /* Whether a cHRM chunk is present (0 = not present, 1 = present). */\n  unsigned chrm_white_x; /* White Point x times 100000 */\n  unsigned chrm_white_y; /* White Point y times 100000 */\n  unsigned chrm_red_x;   /* Red x times 100000 */\n  unsigned chrm_red_y;   /* Red y times 100000 */\n  unsigned chrm_green_x; /* Green x times 100000 */\n  unsigned chrm_green_y; /* Green y times 100000 */\n  unsigned chrm_blue_x;  /* Blue x times 100000 */\n  unsigned chrm_blue_y;  /* Blue y times 100000 */\n\n  /*\n  sRGB chunk: optional. May not appear at the same time as iCCP.\n  If gAMA is also present gAMA must contain value 45455.\n  If cHRM is also present cHRM must contain respectively 31270,32900,64000,33000,30000,60000,15000,6000.\n  */\n  unsigned srgb_defined; /* Whether an sRGB chunk is present (0 = not present, 1 = present). */\n  unsigned srgb_intent;  /* Rendering intent: 0=perceptual, 1=rel. colorimetric, 2=saturation, 3=abs. colorimetric */\n\n  /*\n  iCCP chunk: optional. May not appear at the same time as sRGB.\n\n  LodePNG does not parse or use the ICC profile (except its color space header field for an edge case), a\n  separate library to handle the ICC data (not included in LodePNG) format is needed to use it for color\n  management and conversions.\n\n  For encoding, if iCCP is present, gAMA and cHRM are recommended to be added as well with values that match the ICC\n  profile as closely as possible, if you wish to do this you should provide the correct values for gAMA and cHRM and\n  enable their '_defined' flags since LodePNG will not automatically compute them from the ICC profile.\n\n  For encoding, the ICC profile is required by the PNG specification to be an \"RGB\" profile for non-gray\n  PNG color types and a \"GRAY\" profile for gray PNG color types. If you disable auto_convert, you must ensure\n  the ICC profile type matches your requested color type, else the encoder gives an error. If auto_convert is\n  enabled (the default), and the ICC profile is not a good match for the pixel data, this will result in an encoder\n  error if the pixel data has non-gray pixels for a GRAY profile, or a silent less-optimal compression of the pixel\n  data if the pixels could be encoded as grayscale but the ICC profile is RGB.\n\n  To avoid this do not set an ICC profile in the image unless there is a good reason for it, and when doing so\n  make sure you compute it carefully to avoid the above problems.\n  */\n  unsigned iccp_defined;      /* Whether an iCCP chunk is present (0 = not present, 1 = present). */\n  char* iccp_name;            /* Null terminated string with profile name, 1-79 bytes */\n  /*\n  The ICC profile in iccp_profile_size bytes.\n  Don't allocate this buffer yourself. Use the init/cleanup functions\n  correctly and use lodepng_set_icc and lodepng_clear_icc.\n  */\n  unsigned char* iccp_profile;\n  unsigned iccp_profile_size; /* The size of iccp_profile in bytes */\n\n  /* End of color profile related chunks */\n\n\n  /*\n  unknown chunks: chunks not known by LodePNG, passed on byte for byte.\n\n  There are 3 buffers, one for each position in the PNG where unknown chunks can appear.\n  Each buffer contains all unknown chunks for that position consecutively.\n  The 3 positions are:\n  0: between IHDR and PLTE, 1: between PLTE and IDAT, 2: between IDAT and IEND.\n\n  For encoding, do not store critical chunks or known chunks that are enabled with a \"_defined\" flag\n  above in here, since the encoder will blindly follow this and could then encode an invalid PNG file\n  (such as one with two IHDR chunks or the disallowed combination of sRGB with iCCP). But do use\n  this if you wish to store an ancillary chunk that is not supported by LodePNG (such as sPLT or hIST),\n  or any non-standard PNG chunk.\n\n  Do not allocate or traverse this data yourself. Use the chunk traversing functions declared\n  later, such as lodepng_chunk_next and lodepng_chunk_append, to read/write this struct.\n  */\n  unsigned char* unknown_chunks_data[3];\n  size_t unknown_chunks_size[3]; /*size in bytes of the unknown chunks, given for protection*/\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n} LodePNGInfo;\n\n/*init, cleanup and copy functions to use with this struct*/\nvoid lodepng_info_init(LodePNGInfo* info);\nvoid lodepng_info_cleanup(LodePNGInfo* info);\n/*return value is error code (0 means no error)*/\nunsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source);\n\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\nunsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str); /*push back both texts at once*/\nvoid lodepng_clear_text(LodePNGInfo* info); /*use this to clear the texts again after you filled them in*/\n\nunsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag,\n                           const char* transkey, const char* str); /*push back the 4 texts of 1 chunk at once*/\nvoid lodepng_clear_itext(LodePNGInfo* info); /*use this to clear the itexts again after you filled them in*/\n\n/*replaces if exists*/\nunsigned lodepng_set_icc(LodePNGInfo* info, const char* name, const unsigned char* profile, unsigned profile_size);\nvoid lodepng_clear_icc(LodePNGInfo* info); /*use this to clear the texts again after you filled them in*/\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n\n/*\nConverts raw buffer from one color type to another color type, based on\nLodePNGColorMode structs to describe the input and output color type.\nSee the reference manual at the end of this header file to see which color conversions are supported.\nreturn value = LodePNG error code (0 if all went ok, an error if the conversion isn't supported)\nThe out buffer must have size (w * h * bpp + 7) / 8, where bpp is the bits per pixel\nof the output color type (lodepng_get_bpp).\nFor < 8 bpp images, there should not be padding bits at the end of scanlines.\nFor 16-bit per channel colors, uses big endian format like PNG does.\nReturn value is LodePNG error code\n*/\nunsigned lodepng_convert(unsigned char* out, const unsigned char* in,\n                         const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in,\n                         unsigned w, unsigned h);\n\n#ifdef LODEPNG_COMPILE_DECODER\n/*\nSettings for the decoder. This contains settings for the PNG and the Zlib\ndecoder, but not the Info settings from the Info structs.\n*/\ntypedef struct LodePNGDecoderSettings {\n  LodePNGDecompressSettings zlibsettings; /*in here is the setting to ignore Adler32 checksums*/\n\n  /* Check LodePNGDecompressSettings for more ignorable errors such as ignore_adler32 */\n  unsigned ignore_crc; /*ignore CRC checksums*/\n  unsigned ignore_critical; /*ignore unknown critical chunks*/\n  unsigned ignore_end; /*ignore issues at end of file if possible (missing IEND chunk, too large chunk, ...)*/\n  /* TODO: make a system involving warnings with levels and a strict mode instead. Other potentially recoverable\n     errors: srgb rendering intent value, size of content of ancillary chunks, more than 79 characters for some\n     strings, placement/combination rules for ancillary chunks, crc of unknown chunks, allowed characters\n     in string keys, etc... */\n\n  unsigned color_convert; /*whether to convert the PNG to the color type you want. Default: yes*/\n\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n  unsigned read_text_chunks; /*if false but remember_unknown_chunks is true, they're stored in the unknown chunks*/\n\n  /*store all bytes from unknown chunks in the LodePNGInfo (off by default, useful for a png editor)*/\n  unsigned remember_unknown_chunks;\n\n  /* maximum size for decompressed text chunks. If a text chunk's text is larger than this, an error is returned,\n  unless reading text chunks is disabled or this limit is set higher or disabled. Set to 0 to allow any size.\n  By default it is a value that prevents unreasonably large strings from hogging memory. */\n  size_t max_text_size;\n\n  /* maximum size for compressed ICC chunks. If the ICC profile is larger than this, an error will be returned. Set to\n  0 to allow any size. By default this is a value that prevents ICC profiles that would be much larger than any\n  legitimate profile could be to hog memory. */\n  size_t max_icc_size;\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n} LodePNGDecoderSettings;\n\nvoid lodepng_decoder_settings_init(LodePNGDecoderSettings* settings);\n#endif /*LODEPNG_COMPILE_DECODER*/\n\n#ifdef LODEPNG_COMPILE_ENCODER\n/*automatically use color type with less bits per pixel if losslessly possible. Default: AUTO*/\ntypedef enum LodePNGFilterStrategy {\n  /*every filter at zero*/\n  LFS_ZERO = 0,\n  /*every filter at 1, 2, 3 or 4 (paeth), unlike LFS_ZERO not a good choice, but for testing*/\n  LFS_ONE = 1,\n  LFS_TWO = 2,\n  LFS_THREE = 3,\n  LFS_FOUR = 4,\n  /*Use filter that gives minimum sum, as described in the official PNG filter heuristic.*/\n  LFS_MINSUM,\n  /*Use the filter type that gives smallest Shannon entropy for this scanline. Depending\n  on the image, this is better or worse than minsum.*/\n  LFS_ENTROPY,\n  /*\n  Brute-force-search PNG filters by compressing each filter for each scanline.\n  Experimental, very slow, and only rarely gives better compression than MINSUM.\n  */\n  LFS_BRUTE_FORCE,\n  /*use predefined_filters buffer: you specify the filter type for each scanline*/\n  LFS_PREDEFINED\n} LodePNGFilterStrategy;\n\n/*Gives characteristics about the integer RGBA colors of the image (count, alpha channel usage, bit depth, ...),\nwhich helps decide which color model to use for encoding.\nUsed internally by default if \"auto_convert\" is enabled. Public because it's useful for custom algorithms.*/\ntypedef struct LodePNGColorStats {\n  unsigned colored; /*not grayscale*/\n  unsigned key; /*image is not opaque and color key is possible instead of full alpha*/\n  unsigned short key_r; /*key values, always as 16-bit, in 8-bit case the byte is duplicated, e.g. 65535 means 255*/\n  unsigned short key_g;\n  unsigned short key_b;\n  unsigned alpha; /*image is not opaque and alpha channel or alpha palette required*/\n  unsigned numcolors; /*amount of colors, up to 257. Not valid if bits == 16 or allow_palette is disabled.*/\n  unsigned char palette[1024]; /*Remembers up to the first 256 RGBA colors, in no particular order, only valid when numcolors is valid*/\n  unsigned bits; /*bits per channel (not for palette). 1,2 or 4 for grayscale only. 16 if 16-bit per channel required.*/\n  size_t numpixels;\n\n  /*user settings for computing/using the stats*/\n  unsigned allow_palette; /*default 1. if 0, disallow choosing palette colortype in auto_choose_color, and don't count numcolors*/\n  unsigned allow_greyscale; /*default 1. if 0, choose RGB or RGBA even if the image only has gray colors*/\n} LodePNGColorStats;\n\nvoid lodepng_color_stats_init(LodePNGColorStats* stats);\n\n/*Get a LodePNGColorStats of the image. The stats must already have been inited.\nReturns error code (e.g. alloc fail) or 0 if ok.*/\nunsigned lodepng_compute_color_stats(LodePNGColorStats* stats,\n                                     const unsigned char* image, unsigned w, unsigned h,\n                                     const LodePNGColorMode* mode_in);\n\n/*Settings for the encoder.*/\ntypedef struct LodePNGEncoderSettings {\n  LodePNGCompressSettings zlibsettings; /*settings for the zlib encoder, such as window size, ...*/\n\n  unsigned auto_convert; /*automatically choose output PNG color type. Default: true*/\n\n  /*If true, follows the official PNG heuristic: if the PNG uses a palette or lower than\n  8 bit depth, set all filters to zero. Otherwise use the filter_strategy. Note that to\n  completely follow the official PNG heuristic, filter_palette_zero must be true and\n  filter_strategy must be LFS_MINSUM*/\n  unsigned filter_palette_zero;\n  /*Which filter strategy to use when not using zeroes due to filter_palette_zero.\n  Set filter_palette_zero to 0 to ensure always using your chosen strategy. Default: LFS_MINSUM*/\n  LodePNGFilterStrategy filter_strategy;\n  /*used if filter_strategy is LFS_PREDEFINED. In that case, this must point to a buffer with\n  the same length as the amount of scanlines in the image, and each value must <= 5. You\n  have to cleanup this buffer, LodePNG will never free it. Don't forget that filter_palette_zero\n  must be set to 0 to ensure this is also used on palette or low bitdepth images.*/\n  const unsigned char* predefined_filters;\n\n  /*force creating a PLTE chunk if colortype is 2 or 6 (= a suggested palette).\n  If colortype is 3, PLTE is _always_ created.*/\n  unsigned force_palette;\n#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS\n  /*add LodePNG identifier and version as a text chunk, for debugging*/\n  unsigned add_id;\n  /*encode text chunks as zTXt chunks instead of tEXt chunks, and use compression in iTXt chunks*/\n  unsigned text_compression;\n#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/\n} LodePNGEncoderSettings;\n\nvoid lodepng_encoder_settings_init(LodePNGEncoderSettings* settings);\n#endif /*LODEPNG_COMPILE_ENCODER*/\n\n\n#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER)\n/*The settings, state and information for extended encoding and decoding.*/\ntypedef struct LodePNGState {\n#ifdef LODEPNG_COMPILE_DECODER\n  LodePNGDecoderSettings decoder; /*the decoding settings*/\n#endif /*LODEPNG_COMPILE_DECODER*/\n#ifdef LODEPNG_COMPILE_ENCODER\n  LodePNGEncoderSettings encoder; /*the encoding settings*/\n#endif /*LODEPNG_COMPILE_ENCODER*/\n  LodePNGColorMode info_raw; /*specifies the format in which you would like to get the raw pixel buffer*/\n  LodePNGInfo info_png; /*info of the PNG image obtained after decoding*/\n  unsigned error;\n} LodePNGState;\n\n/*init, cleanup and copy functions to use with this struct*/\nvoid lodepng_state_init(LodePNGState* state);\nvoid lodepng_state_cleanup(LodePNGState* state);\nvoid lodepng_state_copy(LodePNGState* dest, const LodePNGState* source);\n#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */\n\n#ifdef LODEPNG_COMPILE_DECODER\n/*\nSame as lodepng_decode_memory, but uses a LodePNGState to allow custom settings and\ngetting much more information about the PNG image and color mode.\n*/\nunsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h,\n                        LodePNGState* state,\n                        const unsigned char* in, size_t insize);\n\n/*\nRead the PNG header, but not the actual data. This returns only the information\nthat is in the IHDR chunk of the PNG, such as width, height and color type. The\ninformation is placed in the info_png field of the LodePNGState.\n*/\nunsigned lodepng_inspect(unsigned* w, unsigned* h,\n                         LodePNGState* state,\n                         const unsigned char* in, size_t insize);\n#endif /*LODEPNG_COMPILE_DECODER*/\n\n/*\nReads one metadata chunk (other than IHDR) of the PNG file and outputs what it\nread in the state. Returns error code on failure.\nUse lodepng_inspect first with a new state, then e.g. lodepng_chunk_find_const\nto find the desired chunk type, and if non null use lodepng_inspect_chunk (with\nchunk_pointer - start_of_file as pos).\nSupports most metadata chunks from the PNG standard (gAMA, bKGD, tEXt, ...).\nIgnores unsupported, unknown, non-metadata or IHDR chunks (without error).\nRequirements: &in[pos] must point to start of a chunk, must use regular\nlodepng_inspect first since format of most other chunks depends on IHDR, and if\nthere is a PLTE chunk, that one must be inspected before tRNS or bKGD.\n*/\nunsigned lodepng_inspect_chunk(LodePNGState* state, size_t pos,\n                               const unsigned char* in, size_t insize);\n\n#ifdef LODEPNG_COMPILE_ENCODER\n/*This function allocates the out buffer with standard malloc and stores the size in *outsize.*/\nunsigned lodepng_encode(unsigned char** out, size_t* outsize,\n                        const unsigned char* image, unsigned w, unsigned h,\n                        LodePNGState* state);\n#endif /*LODEPNG_COMPILE_ENCODER*/\n\n/*\nThe lodepng_chunk functions are normally not needed, except to traverse the\nunknown chunks stored in the LodePNGInfo struct, or add new ones to it.\nIt also allows traversing the chunks of an encoded PNG file yourself.\n\nThe chunk pointer always points to the beginning of the chunk itself, that is\nthe first byte of the 4 length bytes.\n\nIn the PNG file format, chunks have the following format:\n-4 bytes length: length of the data of the chunk in bytes (chunk itself is 12 bytes longer)\n-4 bytes chunk type (ASCII a-z,A-Z only, see below)\n-length bytes of data (may be 0 bytes if length was 0)\n-4 bytes of CRC, computed on chunk name + data\n\nThe first chunk starts at the 8th byte of the PNG file, the entire rest of the file\nexists out of concatenated chunks with the above format.\n\nPNG standard chunk ASCII naming conventions:\n-First byte: uppercase = critical, lowercase = ancillary\n-Second byte: uppercase = public, lowercase = private\n-Third byte: must be uppercase\n-Fourth byte: uppercase = unsafe to copy, lowercase = safe to copy\n*/\n\n/*\nGets the length of the data of the chunk. Total chunk length has 12 bytes more.\nThere must be at least 4 bytes to read from. If the result value is too large,\nit may be corrupt data.\n*/\nunsigned lodepng_chunk_length(const unsigned char* chunk);\n\n/*puts the 4-byte type in null terminated string*/\nvoid lodepng_chunk_type(char type[5], const unsigned char* chunk);\n\n/*check if the type is the given type*/\nunsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type);\n\n/*0: it's one of the critical chunk types, 1: it's an ancillary chunk (see PNG standard)*/\nunsigned char lodepng_chunk_ancillary(const unsigned char* chunk);\n\n/*0: public, 1: private (see PNG standard)*/\nunsigned char lodepng_chunk_private(const unsigned char* chunk);\n\n/*0: the chunk is unsafe to copy, 1: the chunk is safe to copy (see PNG standard)*/\nunsigned char lodepng_chunk_safetocopy(const unsigned char* chunk);\n\n/*get pointer to the data of the chunk, where the input points to the header of the chunk*/\nunsigned char* lodepng_chunk_data(unsigned char* chunk);\nconst unsigned char* lodepng_chunk_data_const(const unsigned char* chunk);\n\n/*returns 0 if the crc is correct, 1 if it's incorrect (0 for OK as usual!)*/\nunsigned lodepng_chunk_check_crc(const unsigned char* chunk);\n\n/*generates the correct CRC from the data and puts it in the last 4 bytes of the chunk*/\nvoid lodepng_chunk_generate_crc(unsigned char* chunk);\n\n/*\nIterate to next chunks, allows iterating through all chunks of the PNG file.\nInput must be at the beginning of a chunk (result of a previous lodepng_chunk_next call,\nor the 8th byte of a PNG file which always has the first chunk), or alternatively may\npoint to the first byte of the PNG file (which is not a chunk but the magic header, the\nfunction will then skip over it and return the first real chunk).\nWill output pointer to the start of the next chunk, or at or beyond end of the file if there\nis no more chunk after this or possibly if the chunk is corrupt.\nStart this process at the 8th byte of the PNG file.\nIn a non-corrupt PNG file, the last chunk should have name \"IEND\".\n*/\nunsigned char* lodepng_chunk_next(unsigned char* chunk, unsigned char* end);\nconst unsigned char* lodepng_chunk_next_const(const unsigned char* chunk, const unsigned char* end);\n\n/*Finds the first chunk with the given type in the range [chunk, end), or returns NULL if not found.*/\nunsigned char* lodepng_chunk_find(unsigned char* chunk, unsigned char* end, const char type[5]);\nconst unsigned char* lodepng_chunk_find_const(const unsigned char* chunk, const unsigned char* end, const char type[5]);\n\n/*\nAppends chunk to the data in out. The given chunk should already have its chunk header.\nThe out variable and outsize are updated to reflect the new reallocated buffer.\nReturns error code (0 if it went ok)\n*/\nunsigned lodepng_chunk_append(unsigned char** out, size_t* outsize, const unsigned char* chunk);\n\n/*\nAppends new chunk to out. The chunk to append is given by giving its length, type\nand data separately. The type is a 4-letter string.\nThe out variable and outsize are updated to reflect the new reallocated buffer.\nReturne error code (0 if it went ok)\n*/\nunsigned lodepng_chunk_create(unsigned char** out, size_t* outsize, unsigned length,\n                              const char* type, const unsigned char* data);\n\n\n/*Calculate CRC32 of buffer*/\nunsigned lodepng_crc32(const unsigned char* buf, size_t len);\n#endif /*LODEPNG_COMPILE_PNG*/\n\n\n#ifdef LODEPNG_COMPILE_ZLIB\n/*\nThis zlib part can be used independently to zlib compress and decompress a\nbuffer. It cannot be used to create gzip files however, and it only supports the\npart of zlib that is required for PNG, it does not support dictionaries.\n*/\n\n#ifdef LODEPNG_COMPILE_DECODER\n/*Inflate a buffer. Inflate is the decompression step of deflate. Out buffer must be freed after use.*/\nunsigned lodepng_inflate(unsigned char** out, size_t* outsize,\n                         const unsigned char* in, size_t insize,\n                         const LodePNGDecompressSettings* settings);\n\n/*\nDecompresses Zlib data. Reallocates the out buffer and appends the data. The\ndata must be according to the zlib specification.\nEither, *out must be NULL and *outsize must be 0, or, *out must be a valid\nbuffer and *outsize its size in bytes. out must be freed by user after usage.\n*/\nunsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize,\n                                 const unsigned char* in, size_t insize,\n                                 const LodePNGDecompressSettings* settings);\n#endif /*LODEPNG_COMPILE_DECODER*/\n\n#ifdef LODEPNG_COMPILE_ENCODER\n/*\nCompresses data with Zlib. Reallocates the out buffer and appends the data.\nZlib adds a small header and trailer around the deflate data.\nThe data is output in the format of the zlib specification.\nEither, *out must be NULL and *outsize must be 0, or, *out must be a valid\nbuffer and *outsize its size in bytes. out must be freed by user after usage.\n*/\nunsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize,\n                               const unsigned char* in, size_t insize,\n                               const LodePNGCompressSettings* settings);\n\n/*\nFind length-limited Huffman code for given frequencies. This function is in the\npublic interface only for tests, it's used internally by lodepng_deflate.\n*/\nunsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies,\n                                      size_t numcodes, unsigned maxbitlen);\n\n/*Compress a buffer with deflate. See RFC 1951. Out buffer must be freed after use.*/\nunsigned lodepng_deflate(unsigned char** out, size_t* outsize,\n                         const unsigned char* in, size_t insize,\n                         const LodePNGCompressSettings* settings);\n\n#endif /*LODEPNG_COMPILE_ENCODER*/\n#endif /*LODEPNG_COMPILE_ZLIB*/\n\n#ifdef LODEPNG_COMPILE_DISK\n/*\nLoad a file from disk into buffer. The function allocates the out buffer, and\nafter usage you should free it.\nout: output parameter, contains pointer to loaded buffer.\noutsize: output parameter, size of the allocated out buffer\nfilename: the path to the file to load\nreturn value: error code (0 means ok)\n\nNOTE: Wide-character filenames are not supported, you can use an external method\nto handle such files and decode in-memory.\n*/\nunsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename);\n\n/*\nSave a file from buffer to disk. Warning, if it exists, this function overwrites\nthe file without warning!\nbuffer: the buffer to write\nbuffersize: size of the buffer to write\nfilename: the path to the file to save to\nreturn value: error code (0 means ok)\n\nNOTE: Wide-character filenames are not supported, you can use an external method\nto handle such files and encode in-memory\n*/\nunsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename);\n#endif /*LODEPNG_COMPILE_DISK*/\n\n#ifdef LODEPNG_COMPILE_CPP\n/* The LodePNG C++ wrapper uses std::vectors instead of manually allocated memory buffers. */\nnamespace lodepng {\n#ifdef LODEPNG_COMPILE_PNG\nclass State : public LodePNGState {\n  public:\n    State();\n    State(const State& other);\n    ~State();\n    State& operator=(const State& other);\n};\n\n#ifdef LODEPNG_COMPILE_DECODER\n/* Same as other lodepng::decode, but using a State for more settings and information. */\nunsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h,\n                State& state,\n                const unsigned char* in, size_t insize);\nunsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h,\n                State& state,\n                const std::vector<unsigned char>& in);\n#endif /*LODEPNG_COMPILE_DECODER*/\n\n#ifdef LODEPNG_COMPILE_ENCODER\n/* Same as other lodepng::encode, but using a State for more settings and information. */\nunsigned encode(std::vector<unsigned char>& out,\n                const unsigned char* in, unsigned w, unsigned h,\n                State& state);\nunsigned encode(std::vector<unsigned char>& out,\n                const std::vector<unsigned char>& in, unsigned w, unsigned h,\n                State& state);\n#endif /*LODEPNG_COMPILE_ENCODER*/\n\n#ifdef LODEPNG_COMPILE_DISK\n/*\nLoad a file from disk into an std::vector.\nreturn value: error code (0 means ok)\n\nNOTE: Wide-character filenames are not supported, you can use an external method\nto handle such files and decode in-memory\n*/\nunsigned load_file(std::vector<unsigned char>& buffer, const std::string& filename);\n\n/*\nSave the binary data in an std::vector to a file on disk. The file is overwritten\nwithout warning.\n\nNOTE: Wide-character filenames are not supported, you can use an external method\nto handle such files and encode in-memory\n*/\nunsigned save_file(const std::vector<unsigned char>& buffer, const std::string& filename);\n#endif /* LODEPNG_COMPILE_DISK */\n#endif /* LODEPNG_COMPILE_PNG */\n\n#ifdef LODEPNG_COMPILE_ZLIB\n#ifdef LODEPNG_COMPILE_DECODER\n/* Zlib-decompress an unsigned char buffer */\nunsigned decompress(std::vector<unsigned char>& out, const unsigned char* in, size_t insize,\n                    const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings);\n\n/* Zlib-decompress an std::vector */\nunsigned decompress(std::vector<unsigned char>& out, const std::vector<unsigned char>& in,\n                    const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings);\n#endif /* LODEPNG_COMPILE_DECODER */\n\n#ifdef LODEPNG_COMPILE_ENCODER\n/* Zlib-compress an unsigned char buffer */\nunsigned compress(std::vector<unsigned char>& out, const unsigned char* in, size_t insize,\n                  const LodePNGCompressSettings& settings = lodepng_default_compress_settings);\n\n/* Zlib-compress an std::vector */\nunsigned compress(std::vector<unsigned char>& out, const std::vector<unsigned char>& in,\n                  const LodePNGCompressSettings& settings = lodepng_default_compress_settings);\n#endif /* LODEPNG_COMPILE_ENCODER */\n#endif /* LODEPNG_COMPILE_ZLIB */\n} /* namespace lodepng */\n#endif /*LODEPNG_COMPILE_CPP*/\n\n/*\nTODO:\n[.] test if there are no memory leaks or security exploits - done a lot but needs to be checked often\n[.] check compatibility with various compilers  - done but needs to be redone for every newer version\n[X] converting color to 16-bit per channel types\n[X] support color profile chunk types (but never let them touch RGB values by default)\n[ ] support all public PNG chunk types (almost done except sBIT, sPLT and hIST)\n[ ] make sure encoder generates no chunks with size > (2^31)-1\n[ ] partial decoding (stream processing)\n[X] let the \"isFullyOpaque\" function check color keys and transparent palettes too\n[X] better name for the variables \"codes\", \"codesD\", \"codelengthcodes\", \"clcl\" and \"lldl\"\n[ ] allow treating some errors like warnings, when image is recoverable (e.g. 69, 57, 58)\n[ ] make warnings like: oob palette, checksum fail, data after iend, wrong/unknown crit chunk, no null terminator in text, ...\n[ ] error messages with line numbers (and version)\n[ ] errors in state instead of as return code?\n[ ] new errors/warnings like suspiciously big decompressed ztxt or iccp chunk\n[ ] let the C++ wrapper catch exceptions coming from the standard library and return LodePNG error codes\n[ ] allow user to provide custom color conversion functions, e.g. for premultiplied alpha, padding bits or not, ...\n[ ] allow user to give data (void*) to custom allocator\n[X] provide alternatives for C library functions not present on some platforms (memcpy, ...)\n*/\n\n#endif /*LODEPNG_H inclusion guard*/\n\n/*\nLodePNG Documentation\n---------------------\n\n0. table of contents\n--------------------\n\n  1. about\n   1.1. supported features\n   1.2. features not supported\n  2. C and C++ version\n  3. security\n  4. decoding\n  5. encoding\n  6. color conversions\n    6.1. PNG color types\n    6.2. color conversions\n    6.3. padding bits\n    6.4. A note about 16-bits per channel and endianness\n  7. error values\n  8. chunks and PNG editing\n  9. compiler support\n  10. examples\n   10.1. decoder C++ example\n   10.2. decoder C example\n  11. state settings reference\n  12. changes\n  13. contact information\n\n\n1. about\n--------\n\nPNG is a file format to store raster images losslessly with good compression,\nsupporting different color types and alpha channel.\n\nLodePNG is a PNG codec according to the Portable Network Graphics (PNG)\nSpecification (Second Edition) - W3C Recommendation 10 November 2003.\n\nThe specifications used are:\n\n*) Portable Network Graphics (PNG) Specification (Second Edition):\n     http://www.w3.org/TR/2003/REC-PNG-20031110\n*) RFC 1950 ZLIB Compressed Data Format version 3.3:\n     http://www.gzip.org/zlib/rfc-zlib.html\n*) RFC 1951 DEFLATE Compressed Data Format Specification ver 1.3:\n     http://www.gzip.org/zlib/rfc-deflate.html\n\nThe most recent version of LodePNG can currently be found at\nhttp://lodev.org/lodepng/\n\nLodePNG works both in C (ISO C90) and C++, with a C++ wrapper that adds\nextra functionality.\n\nLodePNG exists out of two files:\n-lodepng.h: the header file for both C and C++\n-lodepng.c(pp): give it the name lodepng.c or lodepng.cpp (or .cc) depending on your usage\n\nIf you want to start using LodePNG right away without reading this doc, get the\nexamples from the LodePNG website to see how to use it in code, or check the\nsmaller examples in chapter 13 here.\n\nLodePNG is simple but only supports the basic requirements. To achieve\nsimplicity, the following design choices were made: There are no dependencies\non any external library. There are functions to decode and encode a PNG with\na single function call, and extended versions of these functions taking a\nLodePNGState struct allowing to specify or get more information. By default\nthe colors of the raw image are always RGB or RGBA, no matter what color type\nthe PNG file uses. To read and write files, there are simple functions to\nconvert the files to/from buffers in memory.\n\nThis all makes LodePNG suitable for loading textures in games, demos and small\nprograms, ... It's less suitable for full fledged image editors, loading PNGs\nover network (it requires all the image data to be available before decoding can\nbegin), life-critical systems, ...\n\n1.1. supported features\n-----------------------\n\nThe following features are supported by the decoder:\n\n*) decoding of PNGs with any color type, bit depth and interlace mode, to a 24- or 32-bit color raw image,\n   or the same color type as the PNG\n*) encoding of PNGs, from any raw image to 24- or 32-bit color, or the same color type as the raw image\n*) Adam7 interlace and deinterlace for any color type\n*) loading the image from harddisk or decoding it from a buffer from other sources than harddisk\n*) support for alpha channels, including RGBA color model, translucent palettes and color keying\n*) zlib decompression (inflate)\n*) zlib compression (deflate)\n*) CRC32 and ADLER32 checksums\n*) colorimetric color profile conversions: currently experimentally available in lodepng_util.cpp only,\n   plus alternatively ability to pass on chroma/gamma/ICC profile information to other color management system.\n*) handling of unknown chunks, allowing making a PNG editor that stores custom and unknown chunks.\n*) the following chunks are supported by both encoder and decoder:\n    IHDR: header information\n    PLTE: color palette\n    IDAT: pixel data\n    IEND: the final chunk\n    tRNS: transparency for palettized images\n    tEXt: textual information\n    zTXt: compressed textual information\n    iTXt: international textual information\n    bKGD: suggested background color\n    pHYs: physical dimensions\n    tIME: modification time\n    cHRM: RGB chromaticities\n    gAMA: RGB gamma correction\n    iCCP: ICC color profile\n    sRGB: rendering intent\n\n1.2. features not supported\n---------------------------\n\nThe following features are _not_ supported:\n\n*) some features needed to make a conformant PNG-Editor might be still missing.\n*) partial loading/stream processing. All data must be available and is processed in one call.\n*) The following public chunks are not (yet) supported but treated as unknown chunks by LodePNG:\n    sBIT\n    hIST\n    sPLT\n\n\n2. C and C++ version\n--------------------\n\nThe C version uses buffers allocated with alloc that you need to free()\nyourself. You need to use init and cleanup functions for each struct whenever\nusing a struct from the C version to avoid exploits and memory leaks.\n\nThe C++ version has extra functions with std::vectors in the interface and the\nlodepng::State class which is a LodePNGState with constructor and destructor.\n\nThese files work without modification for both C and C++ compilers because all\nthe additional C++ code is in \"#ifdef __cplusplus\" blocks that make C-compilers\nignore it, and the C code is made to compile both with strict ISO C90 and C++.\n\nTo use the C++ version, you need to rename the source file to lodepng.cpp\n(instead of lodepng.c), and compile it with a C++ compiler.\n\nTo use the C version, you need to rename the source file to lodepng.c (instead\nof lodepng.cpp), and compile it with a C compiler.\n\n\n3. Security\n-----------\n\nEven if carefully designed, it's always possible that LodePNG contains possible\nexploits. If you discover one, please let me know, and it will be fixed.\n\nWhen using LodePNG, care has to be taken with the C version of LodePNG, as well\nas the C-style structs when working with C++. The following conventions are used\nfor all C-style structs:\n\n-if a struct has a corresponding init function, always call the init function when making a new one\n-if a struct has a corresponding cleanup function, call it before the struct disappears to avoid memory leaks\n-if a struct has a corresponding copy function, use the copy function instead of \"=\".\n The destination must also be inited already.\n\n\n4. Decoding\n-----------\n\nDecoding converts a PNG compressed image to a raw pixel buffer.\n\nMost documentation on using the decoder is at its declarations in the header\nabove. For C, simple decoding can be done with functions such as\nlodepng_decode32, and more advanced decoding can be done with the struct\nLodePNGState and lodepng_decode. For C++, all decoding can be done with the\nvarious lodepng::decode functions, and lodepng::State can be used for advanced\nfeatures.\n\nWhen using the LodePNGState, it uses the following fields for decoding:\n*) LodePNGInfo info_png: it stores extra information about the PNG (the input) in here\n*) LodePNGColorMode info_raw: here you can say what color mode of the raw image (the output) you want to get\n*) LodePNGDecoderSettings decoder: you can specify a few extra settings for the decoder to use\n\nLodePNGInfo info_png\n--------------------\n\nAfter decoding, this contains extra information of the PNG image, except the actual\npixels, width and height because these are already gotten directly from the decoder\nfunctions.\n\nIt contains for example the original color type of the PNG image, text comments,\nsuggested background color, etc... More details about the LodePNGInfo struct are\nat its declaration documentation.\n\nLodePNGColorMode info_raw\n-------------------------\n\nWhen decoding, here you can specify which color type you want\nthe resulting raw image to be. If this is different from the colortype of the\nPNG, then the decoder will automatically convert the result. This conversion\nalways works, except if you want it to convert a color PNG to grayscale or to\na palette with missing colors.\n\nBy default, 32-bit color is used for the result.\n\nLodePNGDecoderSettings decoder\n------------------------------\n\nThe settings can be used to ignore the errors created by invalid CRC and Adler32\nchunks, and to disable the decoding of tEXt chunks.\n\nThere's also a setting color_convert, true by default. If false, no conversion\nis done, the resulting data will be as it was in the PNG (after decompression)\nand you'll have to puzzle the colors of the pixels together yourself using the\ncolor type information in the LodePNGInfo.\n\n\n5. Encoding\n-----------\n\nEncoding converts a raw pixel buffer to a PNG compressed image.\n\nMost documentation on using the encoder is at its declarations in the header\nabove. For C, simple encoding can be done with functions such as\nlodepng_encode32, and more advanced decoding can be done with the struct\nLodePNGState and lodepng_encode. For C++, all encoding can be done with the\nvarious lodepng::encode functions, and lodepng::State can be used for advanced\nfeatures.\n\nLike the decoder, the encoder can also give errors. However it gives less errors\nsince the encoder input is trusted, the decoder input (a PNG image that could\nbe forged by anyone) is not trusted.\n\nWhen using the LodePNGState, it uses the following fields for encoding:\n*) LodePNGInfo info_png: here you specify how you want the PNG (the output) to be.\n*) LodePNGColorMode info_raw: here you say what color type of the raw image (the input) has\n*) LodePNGEncoderSettings encoder: you can specify a few settings for the encoder to use\n\nLodePNGInfo info_png\n--------------------\n\nWhen encoding, you use this the opposite way as when decoding: for encoding,\nyou fill in the values you want the PNG to have before encoding. By default it's\nnot needed to specify a color type for the PNG since it's automatically chosen,\nbut it's possible to choose it yourself given the right settings.\n\nThe encoder will not always exactly match the LodePNGInfo struct you give,\nit tries as close as possible. Some things are ignored by the encoder. The\nencoder uses, for example, the following settings from it when applicable:\ncolortype and bitdepth, text chunks, time chunk, the color key, the palette, the\nbackground color, the interlace method, unknown chunks, ...\n\nWhen encoding to a PNG with colortype 3, the encoder will generate a PLTE chunk.\nIf the palette contains any colors for which the alpha channel is not 255 (so\nthere are translucent colors in the palette), it'll add a tRNS chunk.\n\nLodePNGColorMode info_raw\n-------------------------\n\nYou specify the color type of the raw image that you give to the input here,\nincluding a possible transparent color key and palette you happen to be using in\nyour raw image data.\n\nBy default, 32-bit color is assumed, meaning your input has to be in RGBA\nformat with 4 bytes (unsigned chars) per pixel.\n\nLodePNGEncoderSettings encoder\n------------------------------\n\nThe following settings are supported (some are in sub-structs):\n*) auto_convert: when this option is enabled, the encoder will\nautomatically choose the smallest possible color mode (including color key) that\ncan encode the colors of all pixels without information loss.\n*) btype: the block type for LZ77. 0 = uncompressed, 1 = fixed huffman tree,\n   2 = dynamic huffman tree (best compression). Should be 2 for proper\n   compression.\n*) use_lz77: whether or not to use LZ77 for compressed block types. Should be\n   true for proper compression.\n*) windowsize: the window size used by the LZ77 encoder (1 - 32768). Has value\n   2048 by default, but can be set to 32768 for better, but slow, compression.\n*) force_palette: if colortype is 2 or 6, you can make the encoder write a PLTE\n   chunk if force_palette is true. This can used as suggested palette to convert\n   to by viewers that don't support more than 256 colors (if those still exist)\n*) add_id: add text chunk \"Encoder: LodePNG <version>\" to the image.\n*) text_compression: default 1. If 1, it'll store texts as zTXt instead of tEXt chunks.\n  zTXt chunks use zlib compression on the text. This gives a smaller result on\n  large texts but a larger result on small texts (such as a single program name).\n  It's all tEXt or all zTXt though, there's no separate setting per text yet.\n\n\n6. color conversions\n--------------------\n\nAn important thing to note about LodePNG, is that the color type of the PNG, and\nthe color type of the raw image, are completely independent. By default, when\nyou decode a PNG, you get the result as a raw image in the color type you want,\nno matter whether the PNG was encoded with a palette, grayscale or RGBA color.\nAnd if you encode an image, by default LodePNG will automatically choose the PNG\ncolor type that gives good compression based on the values of colors and amount\nof colors in the image. It can be configured to let you control it instead as\nwell, though.\n\nTo be able to do this, LodePNG does conversions from one color mode to another.\nIt can convert from almost any color type to any other color type, except the\nfollowing conversions: RGB to grayscale is not supported, and converting to a\npalette when the palette doesn't have a required color is not supported. This is\nnot supported on purpose: this is information loss which requires a color\nreduction algorithm that is beyond the scope of a PNG encoder (yes, RGB to gray\nis easy, but there are multiple ways if you want to give some channels more\nweight).\n\nBy default, when decoding, you get the raw image in 32-bit RGBA or 24-bit RGB\ncolor, no matter what color type the PNG has. And by default when encoding,\nLodePNG automatically picks the best color model for the output PNG, and expects\nthe input image to be 32-bit RGBA or 24-bit RGB. So, unless you want to control\nthe color format of the images yourself, you can skip this chapter.\n\n6.1. PNG color types\n--------------------\n\nA PNG image can have many color types, ranging from 1-bit color to 64-bit color,\nas well as palettized color modes. After the zlib decompression and unfiltering\nin the PNG image is done, the raw pixel data will have that color type and thus\na certain amount of bits per pixel. If you want the output raw image after\ndecoding to have another color type, a conversion is done by LodePNG.\n\nThe PNG specification gives the following color types:\n\n0: grayscale, bit depths 1, 2, 4, 8, 16\n2: RGB, bit depths 8 and 16\n3: palette, bit depths 1, 2, 4 and 8\n4: grayscale with alpha, bit depths 8 and 16\n6: RGBA, bit depths 8 and 16\n\nBit depth is the amount of bits per pixel per color channel. So the total amount\nof bits per pixel is: amount of channels * bitdepth.\n\n6.2. color conversions\n----------------------\n\nAs explained in the sections about the encoder and decoder, you can specify\ncolor types and bit depths in info_png and info_raw to change the default\nbehaviour.\n\nIf, when decoding, you want the raw image to be something else than the default,\nyou need to set the color type and bit depth you want in the LodePNGColorMode,\nor the parameters colortype and bitdepth of the simple decoding function.\n\nIf, when encoding, you use another color type than the default in the raw input\nimage, you need to specify its color type and bit depth in the LodePNGColorMode\nof the raw image, or use the parameters colortype and bitdepth of the simple\nencoding function.\n\nIf, when encoding, you don't want LodePNG to choose the output PNG color type\nbut control it yourself, you need to set auto_convert in the encoder settings\nto false, and specify the color type you want in the LodePNGInfo of the\nencoder (including palette: it can generate a palette if auto_convert is true,\notherwise not).\n\nIf the input and output color type differ (whether user chosen or auto chosen),\nLodePNG will do a color conversion, which follows the rules below, and may\nsometimes result in an error.\n\nTo avoid some confusion:\n-the decoder converts from PNG to raw image\n-the encoder converts from raw image to PNG\n-the colortype and bitdepth in LodePNGColorMode info_raw, are those of the raw image\n-the colortype and bitdepth in the color field of LodePNGInfo info_png, are those of the PNG\n-when encoding, the color type in LodePNGInfo is ignored if auto_convert\n is enabled, it is automatically generated instead\n-when decoding, the color type in LodePNGInfo is set by the decoder to that of the original\n PNG image, but it can be ignored since the raw image has the color type you requested instead\n-if the color type of the LodePNGColorMode and PNG image aren't the same, a conversion\n between the color types is done if the color types are supported. If it is not\n supported, an error is returned. If the types are the same, no conversion is done.\n-even though some conversions aren't supported, LodePNG supports loading PNGs from any\n colortype and saving PNGs to any colortype, sometimes it just requires preparing\n the raw image correctly before encoding.\n-both encoder and decoder use the same color converter.\n\nThe function lodepng_convert does the color conversion. It is available in the\ninterface but normally isn't needed since the encoder and decoder already call\nit.\n\nNon supported color conversions:\n-color to grayscale when non-gray pixels are present: no error is thrown, but\nthe result will look ugly because only the red channel is taken (it assumes all\nthree channels are the same in this case so ignores green and blue). The reason\nno error is given is to allow converting from three-channel grayscale images to\none-channel even if there are numerical imprecisions.\n-anything to palette when the palette does not have an exact match for a from-color\nin it: in this case an error is thrown\n\nSupported color conversions:\n-anything to 8-bit RGB, 8-bit RGBA, 16-bit RGB, 16-bit RGBA\n-any gray or gray+alpha, to gray or gray+alpha\n-anything to a palette, as long as the palette has the requested colors in it\n-removing alpha channel\n-higher to smaller bitdepth, and vice versa\n\nIf you want no color conversion to be done (e.g. for speed or control):\n-In the encoder, you can make it save a PNG with any color type by giving the\nraw color mode and LodePNGInfo the same color mode, and setting auto_convert to\nfalse.\n-In the decoder, you can make it store the pixel data in the same color type\nas the PNG has, by setting the color_convert setting to false. Settings in\ninfo_raw are then ignored.\n\n6.3. padding bits\n-----------------\n\nIn the PNG file format, if a less than 8-bit per pixel color type is used and the scanlines\nhave a bit amount that isn't a multiple of 8, then padding bits are used so that each\nscanline starts at a fresh byte. But that is NOT true for the LodePNG raw input and output.\nThe raw input image you give to the encoder, and the raw output image you get from the decoder\nwill NOT have these padding bits, e.g. in the case of a 1-bit image with a width\nof 7 pixels, the first pixel of the second scanline will the 8th bit of the first byte,\nnot the first bit of a new byte.\n\n6.4. A note about 16-bits per channel and endianness\n----------------------------------------------------\n\nLodePNG uses unsigned char arrays for 16-bit per channel colors too, just like\nfor any other color format. The 16-bit values are stored in big endian (most\nsignificant byte first) in these arrays. This is the opposite order of the\nlittle endian used by x86 CPU's.\n\nLodePNG always uses big endian because the PNG file format does so internally.\nConversions to other formats than PNG uses internally are not supported by\nLodePNG on purpose, there are myriads of formats, including endianness of 16-bit\ncolors, the order in which you store R, G, B and A, and so on. Supporting and\nconverting to/from all that is outside the scope of LodePNG.\n\nThis may mean that, depending on your use case, you may want to convert the big\nendian output of LodePNG to little endian with a for loop. This is certainly not\nalways needed, many applications and libraries support big endian 16-bit colors\nanyway, but it means you cannot simply cast the unsigned char* buffer to an\nunsigned short* buffer on x86 CPUs.\n\n\n7. error values\n---------------\n\nAll functions in LodePNG that return an error code, return 0 if everything went\nOK, or a non-zero code if there was an error.\n\nThe meaning of the LodePNG error values can be retrieved with the function\nlodepng_error_text: given the numerical error code, it returns a description\nof the error in English as a string.\n\nCheck the implementation of lodepng_error_text to see the meaning of each code.\n\nIt is not recommended to use the numerical values to programmatically make\ndifferent decisions based on error types as the numbers are not guaranteed to\nstay backwards compatible. They are for human consumption only. Programmatically\nonly 0 or non-0 matter.\n\n\n8. chunks and PNG editing\n-------------------------\n\nIf you want to add extra chunks to a PNG you encode, or use LodePNG for a PNG\neditor that should follow the rules about handling of unknown chunks, or if your\nprogram is able to read other types of chunks than the ones handled by LodePNG,\nthen that's possible with the chunk functions of LodePNG.\n\nA PNG chunk has the following layout:\n\n4 bytes length\n4 bytes type name\nlength bytes data\n4 bytes CRC\n\n8.1. iterating through chunks\n-----------------------------\n\nIf you have a buffer containing the PNG image data, then the first chunk (the\nIHDR chunk) starts at byte number 8 of that buffer. The first 8 bytes are the\nsignature of the PNG and are not part of a chunk. But if you start at byte 8\nthen you have a chunk, and can check the following things of it.\n\nNOTE: none of these functions check for memory buffer boundaries. To avoid\nexploits, always make sure the buffer contains all the data of the chunks.\nWhen using lodepng_chunk_next, make sure the returned value is within the\nallocated memory.\n\nunsigned lodepng_chunk_length(const unsigned char* chunk):\n\nGet the length of the chunk's data. The total chunk length is this length + 12.\n\nvoid lodepng_chunk_type(char type[5], const unsigned char* chunk):\nunsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type):\n\nGet the type of the chunk or compare if it's a certain type\n\nunsigned char lodepng_chunk_critical(const unsigned char* chunk):\nunsigned char lodepng_chunk_private(const unsigned char* chunk):\nunsigned char lodepng_chunk_safetocopy(const unsigned char* chunk):\n\nCheck if the chunk is critical in the PNG standard (only IHDR, PLTE, IDAT and IEND are).\nCheck if the chunk is private (public chunks are part of the standard, private ones not).\nCheck if the chunk is safe to copy. If it's not, then, when modifying data in a critical\nchunk, unsafe to copy chunks of the old image may NOT be saved in the new one if your\nprogram doesn't handle that type of unknown chunk.\n\nunsigned char* lodepng_chunk_data(unsigned char* chunk):\nconst unsigned char* lodepng_chunk_data_const(const unsigned char* chunk):\n\nGet a pointer to the start of the data of the chunk.\n\nunsigned lodepng_chunk_check_crc(const unsigned char* chunk):\nvoid lodepng_chunk_generate_crc(unsigned char* chunk):\n\nCheck if the crc is correct or generate a correct one.\n\nunsigned char* lodepng_chunk_next(unsigned char* chunk):\nconst unsigned char* lodepng_chunk_next_const(const unsigned char* chunk):\n\nIterate to the next chunk. This works if you have a buffer with consecutive chunks. Note that these\nfunctions do no boundary checking of the allocated data whatsoever, so make sure there is enough\ndata available in the buffer to be able to go to the next chunk.\n\nunsigned lodepng_chunk_append(unsigned char** out, size_t* outsize, const unsigned char* chunk):\nunsigned lodepng_chunk_create(unsigned char** out, size_t* outsize, unsigned length,\n                              const char* type, const unsigned char* data):\n\nThese functions are used to create new chunks that are appended to the data in *out that has\nlength *outsize. The append function appends an existing chunk to the new data. The create\nfunction creates a new chunk with the given parameters and appends it. Type is the 4-letter\nname of the chunk.\n\n8.2. chunks in info_png\n-----------------------\n\nThe LodePNGInfo struct contains fields with the unknown chunk in it. It has 3\nbuffers (each with size) to contain 3 types of unknown chunks:\nthe ones that come before the PLTE chunk, the ones that come between the PLTE\nand the IDAT chunks, and the ones that come after the IDAT chunks.\nIt's necessary to make the distinction between these 3 cases because the PNG\nstandard forces to keep the ordering of unknown chunks compared to the critical\nchunks, but does not force any other ordering rules.\n\ninfo_png.unknown_chunks_data[0] is the chunks before PLTE\ninfo_png.unknown_chunks_data[1] is the chunks after PLTE, before IDAT\ninfo_png.unknown_chunks_data[2] is the chunks after IDAT\n\nThe chunks in these 3 buffers can be iterated through and read by using the same\nway described in the previous subchapter.\n\nWhen using the decoder to decode a PNG, you can make it store all unknown chunks\nif you set the option settings.remember_unknown_chunks to 1. By default, this\noption is off (0).\n\nThe encoder will always encode unknown chunks that are stored in the info_png.\nIf you need it to add a particular chunk that isn't known by LodePNG, you can\nuse lodepng_chunk_append or lodepng_chunk_create to the chunk data in\ninfo_png.unknown_chunks_data[x].\n\nChunks that are known by LodePNG should not be added in that way. E.g. to make\nLodePNG add a bKGD chunk, set background_defined to true and add the correct\nparameters there instead.\n\n\n9. compiler support\n-------------------\n\nNo libraries other than the current standard C library are needed to compile\nLodePNG. For the C++ version, only the standard C++ library is needed on top.\nAdd the files lodepng.c(pp) and lodepng.h to your project, include\nlodepng.h where needed, and your program can read/write PNG files.\n\nIt is compatible with C90 and up, and C++03 and up.\n\nIf performance is important, use optimization when compiling! For both the\nencoder and decoder, this makes a large difference.\n\nMake sure that LodePNG is compiled with the same compiler of the same version\nand with the same settings as the rest of the program, or the interfaces with\nstd::vectors and std::strings in C++ can be incompatible.\n\nCHAR_BITS must be 8 or higher, because LodePNG uses unsigned chars for octets.\n\n*) gcc and g++\n\nLodePNG is developed in gcc so this compiler is natively supported. It gives no\nwarnings with compiler options \"-Wall -Wextra -pedantic -ansi\", with gcc and g++\nversion 4.7.1 on Linux, 32-bit and 64-bit.\n\n*) Clang\n\nFully supported and warning-free.\n\n*) Mingw\n\nThe Mingw compiler (a port of gcc for Windows) should be fully supported by\nLodePNG.\n\n*) Visual Studio and Visual C++ Express Edition\n\nLodePNG should be warning-free with warning level W4. Two warnings were disabled\nwith pragmas though: warning 4244 about implicit conversions, and warning 4996\nwhere it wants to use a non-standard function fopen_s instead of the standard C\nfopen.\n\nVisual Studio may want \"stdafx.h\" files to be included in each source file and\ngive an error \"unexpected end of file while looking for precompiled header\".\nThis is not standard C++ and will not be added to the stock LodePNG. You can\ndisable it for lodepng.cpp only by right clicking it, Properties, C/C++,\nPrecompiled Headers, and set it to Not Using Precompiled Headers there.\n\nNOTE: Modern versions of VS should be fully supported, but old versions, e.g.\nVS6, are not guaranteed to work.\n\n*) Compilers on Macintosh\n\nLodePNG has been reported to work both with gcc and LLVM for Macintosh, both for\nC and C++.\n\n*) Other Compilers\n\nIf you encounter problems on any compilers, feel free to let me know and I may\ntry to fix it if the compiler is modern and standards compliant.\n\n\n10. examples\n------------\n\nThis decoder example shows the most basic usage of LodePNG. More complex\nexamples can be found on the LodePNG website.\n\nNOTE: these examples do not support wide-character filenames, you can use an\nexternal method to handle such files and encode or decode in-memory\n\n10.1. decoder C++ example\n-------------------------\n\n#include \"lodepng.h\"\n#include <iostream>\n\nint main(int argc, char *argv[]) {\n  const char* filename = argc > 1 ? argv[1] : \"test.png\";\n\n  //load and decode\n  std::vector<unsigned char> image;\n  unsigned width, height;\n  unsigned error = lodepng::decode(image, width, height, filename);\n\n  //if there's an error, display it\n  if(error) std::cout << \"decoder error \" << error << \": \" << lodepng_error_text(error) << std::endl;\n\n  //the pixels are now in the vector \"image\", 4 bytes per pixel, ordered RGBARGBA..., use it as texture, draw it, ...\n}\n\n10.2. decoder C example\n-----------------------\n\n#include \"lodepng.h\"\n\nint main(int argc, char *argv[]) {\n  unsigned error;\n  unsigned char* image;\n  size_t width, height;\n  const char* filename = argc > 1 ? argv[1] : \"test.png\";\n\n  error = lodepng_decode32_file(&image, &width, &height, filename);\n\n  if(error) printf(\"decoder error %u: %s\\n\", error, lodepng_error_text(error));\n\n  / * use image here * /\n\n  free(image);\n  return 0;\n}\n\n11. state settings reference\n----------------------------\n\nA quick reference of some settings to set on the LodePNGState\n\nFor decoding:\n\nstate.decoder.zlibsettings.ignore_adler32: ignore ADLER32 checksums\nstate.decoder.zlibsettings.custom_...: use custom inflate function\nstate.decoder.ignore_crc: ignore CRC checksums\nstate.decoder.ignore_critical: ignore unknown critical chunks\nstate.decoder.ignore_end: ignore missing IEND chunk. May fail if this corruption causes other errors\nstate.decoder.color_convert: convert internal PNG color to chosen one\nstate.decoder.read_text_chunks: whether to read in text metadata chunks\nstate.decoder.remember_unknown_chunks: whether to read in unknown chunks\nstate.info_raw.colortype: desired color type for decoded image\nstate.info_raw.bitdepth: desired bit depth for decoded image\nstate.info_raw....: more color settings, see struct LodePNGColorMode\nstate.info_png....: no settings for decoder but ouput, see struct LodePNGInfo\n\nFor encoding:\n\nstate.encoder.zlibsettings.btype: disable compression by setting it to 0\nstate.encoder.zlibsettings.use_lz77: use LZ77 in compression\nstate.encoder.zlibsettings.windowsize: tweak LZ77 windowsize\nstate.encoder.zlibsettings.minmatch: tweak min LZ77 length to match\nstate.encoder.zlibsettings.nicematch: tweak LZ77 match where to stop searching\nstate.encoder.zlibsettings.lazymatching: try one more LZ77 matching\nstate.encoder.zlibsettings.custom_...: use custom deflate function\nstate.encoder.auto_convert: choose optimal PNG color type, if 0 uses info_png\nstate.encoder.filter_palette_zero: PNG filter strategy for palette\nstate.encoder.filter_strategy: PNG filter strategy to encode with\nstate.encoder.force_palette: add palette even if not encoding to one\nstate.encoder.add_id: add LodePNG identifier and version as a text chunk\nstate.encoder.text_compression: use compressed text chunks for metadata\nstate.info_raw.colortype: color type of raw input image you provide\nstate.info_raw.bitdepth: bit depth of raw input image you provide\nstate.info_raw: more color settings, see struct LodePNGColorMode\nstate.info_png.color.colortype: desired color type if auto_convert is false\nstate.info_png.color.bitdepth: desired bit depth if auto_convert is false\nstate.info_png.color....: more color settings, see struct LodePNGColorMode\nstate.info_png....: more PNG related settings, see struct LodePNGInfo\n\n\n12. changes\n-----------\n\nThe version number of LodePNG is the date of the change given in the format\nyyyymmdd.\n\nSome changes aren't backwards compatible. Those are indicated with a (!)\nsymbol.\n\nNot all changes are listed here, the commit history in github lists more:\nhttps://github.com/lvandeve/lodepng\n\n*) 27 jun 2021: added warnings that file reading/writing functions don't support\n   wide-character filenames (support for this is not planned, opening files is\n   not the core part of PNG decoding/decoding and is platform dependent).\n*) 17 okt 2020: prevent decoding too large text/icc chunks by default.\n*) 06 mar 2020: simplified some of the dynamic memory allocations.\n*) 12 jan 2020: (!) added 'end' argument to lodepng_chunk_next to allow correct\n   overflow checks.\n*) 14 aug 2019: around 25% faster decoding thanks to huffman lookup tables.\n*) 15 jun 2019: (!) auto_choose_color API changed (for bugfix: don't use palette\n   if gray ICC profile) and non-ICC LodePNGColorProfile renamed to\n   LodePNGColorStats.\n*) 30 dec 2018: code style changes only: removed newlines before opening braces.\n*) 10 sep 2018: added way to inspect metadata chunks without full decoding.\n*) 19 aug 2018: (!) fixed color mode bKGD is encoded with and made it use\n   palette index in case of palette.\n*) 10 aug 2018: (!) added support for gAMA, cHRM, sRGB and iCCP chunks. This\n   change is backwards compatible unless you relied on unknown_chunks for those.\n*) 11 jun 2018: less restrictive check for pixel size integer overflow\n*) 14 jan 2018: allow optionally ignoring a few more recoverable errors\n*) 17 sep 2017: fix memory leak for some encoder input error cases\n*) 27 nov 2016: grey+alpha auto color model detection bugfix\n*) 18 apr 2016: Changed qsort to custom stable sort (for platforms w/o qsort).\n*) 09 apr 2016: Fixed colorkey usage detection, and better file loading (within\n   the limits of pure C90).\n*) 08 dec 2015: Made load_file function return error if file can't be opened.\n*) 24 okt 2015: Bugfix with decoding to palette output.\n*) 18 apr 2015: Boundary PM instead of just package-merge for faster encoding.\n*) 24 aug 2014: Moved to github\n*) 23 aug 2014: Reduced needless memory usage of decoder.\n*) 28 jun 2014: Removed fix_png setting, always support palette OOB for\n    simplicity. Made ColorProfile public.\n*) 09 jun 2014: Faster encoder by fixing hash bug and more zeros optimization.\n*) 22 dec 2013: Power of two windowsize required for optimization.\n*) 15 apr 2013: Fixed bug with LAC_ALPHA and color key.\n*) 25 mar 2013: Added an optional feature to ignore some PNG errors (fix_png).\n*) 11 mar 2013: (!) Bugfix with custom free. Changed from \"my\" to \"lodepng_\"\n    prefix for the custom allocators and made it possible with a new #define to\n    use custom ones in your project without needing to change lodepng's code.\n*) 28 jan 2013: Bugfix with color key.\n*) 27 okt 2012: Tweaks in text chunk keyword length error handling.\n*) 8 okt 2012: (!) Added new filter strategy (entropy) and new auto color mode.\n    (no palette). Better deflate tree encoding. New compression tweak settings.\n    Faster color conversions while decoding. Some internal cleanups.\n*) 23 sep 2012: Reduced warnings in Visual Studio a little bit.\n*) 1 sep 2012: (!) Removed #define's for giving custom (de)compression functions\n    and made it work with function pointers instead.\n*) 23 jun 2012: Added more filter strategies. Made it easier to use custom alloc\n    and free functions and toggle #defines from compiler flags. Small fixes.\n*) 6 may 2012: (!) Made plugging in custom zlib/deflate functions more flexible.\n*) 22 apr 2012: (!) Made interface more consistent, renaming a lot. Removed\n    redundant C++ codec classes. Reduced amount of structs. Everything changed,\n    but it is cleaner now imho and functionality remains the same. Also fixed\n    several bugs and shrunk the implementation code. Made new samples.\n*) 6 nov 2011: (!) By default, the encoder now automatically chooses the best\n    PNG color model and bit depth, based on the amount and type of colors of the\n    raw image. For this, autoLeaveOutAlphaChannel replaced by auto_choose_color.\n*) 9 okt 2011: simpler hash chain implementation for the encoder.\n*) 8 sep 2011: lz77 encoder lazy matching instead of greedy matching.\n*) 23 aug 2011: tweaked the zlib compression parameters after benchmarking.\n    A bug with the PNG filtertype heuristic was fixed, so that it chooses much\n    better ones (it's quite significant). A setting to do an experimental, slow,\n    brute force search for PNG filter types is added.\n*) 17 aug 2011: (!) changed some C zlib related function names.\n*) 16 aug 2011: made the code less wide (max 120 characters per line).\n*) 17 apr 2011: code cleanup. Bugfixes. Convert low to 16-bit per sample colors.\n*) 21 feb 2011: fixed compiling for C90. Fixed compiling with sections disabled.\n*) 11 dec 2010: encoding is made faster, based on suggestion by Peter Eastman\n    to optimize long sequences of zeros.\n*) 13 nov 2010: added LodePNG_InfoColor_hasPaletteAlpha and\n    LodePNG_InfoColor_canHaveAlpha functions for convenience.\n*) 7 nov 2010: added LodePNG_error_text function to get error code description.\n*) 30 okt 2010: made decoding slightly faster\n*) 26 okt 2010: (!) changed some C function and struct names (more consistent).\n     Reorganized the documentation and the declaration order in the header.\n*) 08 aug 2010: only changed some comments and external samples.\n*) 05 jul 2010: fixed bug thanks to warnings in the new gcc version.\n*) 14 mar 2010: fixed bug where too much memory was allocated for char buffers.\n*) 02 sep 2008: fixed bug where it could create empty tree that linux apps could\n    read by ignoring the problem but windows apps couldn't.\n*) 06 jun 2008: added more error checks for out of memory cases.\n*) 26 apr 2008: added a few more checks here and there to ensure more safety.\n*) 06 mar 2008: crash with encoding of strings fixed\n*) 02 feb 2008: support for international text chunks added (iTXt)\n*) 23 jan 2008: small cleanups, and #defines to divide code in sections\n*) 20 jan 2008: support for unknown chunks allowing using LodePNG for an editor.\n*) 18 jan 2008: support for tIME and pHYs chunks added to encoder and decoder.\n*) 17 jan 2008: ability to encode and decode compressed zTXt chunks added\n    Also various fixes, such as in the deflate and the padding bits code.\n*) 13 jan 2008: Added ability to encode Adam7-interlaced images. Improved\n    filtering code of encoder.\n*) 07 jan 2008: (!) changed LodePNG to use ISO C90 instead of C++. A\n    C++ wrapper around this provides an interface almost identical to before.\n    Having LodePNG be pure ISO C90 makes it more portable. The C and C++ code\n    are together in these files but it works both for C and C++ compilers.\n*) 29 dec 2007: (!) changed most integer types to unsigned int + other tweaks\n*) 30 aug 2007: bug fixed which makes this Borland C++ compatible\n*) 09 aug 2007: some VS2005 warnings removed again\n*) 21 jul 2007: deflate code placed in new namespace separate from zlib code\n*) 08 jun 2007: fixed bug with 2- and 4-bit color, and small interlaced images\n*) 04 jun 2007: improved support for Visual Studio 2005: crash with accessing\n    invalid std::vector element [0] fixed, and level 3 and 4 warnings removed\n*) 02 jun 2007: made the encoder add a tag with version by default\n*) 27 may 2007: zlib and png code separated (but still in the same file),\n    simple encoder/decoder functions added for more simple usage cases\n*) 19 may 2007: minor fixes, some code cleaning, new error added (error 69),\n    moved some examples from here to lodepng_examples.cpp\n*) 12 may 2007: palette decoding bug fixed\n*) 24 apr 2007: changed the license from BSD to the zlib license\n*) 11 mar 2007: very simple addition: ability to encode bKGD chunks.\n*) 04 mar 2007: (!) tEXt chunk related fixes, and support for encoding\n    palettized PNG images. Plus little interface change with palette and texts.\n*) 03 mar 2007: Made it encode dynamic Huffman shorter with repeat codes.\n    Fixed a bug where the end code of a block had length 0 in the Huffman tree.\n*) 26 feb 2007: Huffman compression with dynamic trees (BTYPE 2) now implemented\n    and supported by the encoder, resulting in smaller PNGs at the output.\n*) 27 jan 2007: Made the Adler-32 test faster so that a timewaste is gone.\n*) 24 jan 2007: gave encoder an error interface. Added color conversion from any\n    greyscale type to 8-bit greyscale with or without alpha.\n*) 21 jan 2007: (!) Totally changed the interface. It allows more color types\n    to convert to and is more uniform. See the manual for how it works now.\n*) 07 jan 2007: Some cleanup & fixes, and a few changes over the last days:\n    encode/decode custom tEXt chunks, separate classes for zlib & deflate, and\n    at last made the decoder give errors for incorrect Adler32 or Crc.\n*) 01 jan 2007: Fixed bug with encoding PNGs with less than 8 bits per channel.\n*) 29 dec 2006: Added support for encoding images without alpha channel, and\n    cleaned out code as well as making certain parts faster.\n*) 28 dec 2006: Added \"Settings\" to the encoder.\n*) 26 dec 2006: The encoder now does LZ77 encoding and produces much smaller files now.\n    Removed some code duplication in the decoder. Fixed little bug in an example.\n*) 09 dec 2006: (!) Placed output parameters of public functions as first parameter.\n    Fixed a bug of the decoder with 16-bit per color.\n*) 15 okt 2006: Changed documentation structure\n*) 09 okt 2006: Encoder class added. It encodes a valid PNG image from the\n    given image buffer, however for now it's not compressed.\n*) 08 sep 2006: (!) Changed to interface with a Decoder class\n*) 30 jul 2006: (!) LodePNG_InfoPng , width and height are now retrieved in different\n    way. Renamed decodePNG to decodePNGGeneric.\n*) 29 jul 2006: (!) Changed the interface: image info is now returned as a\n    struct of type LodePNG::LodePNG_Info, instead of a vector, which was a bit clumsy.\n*) 28 jul 2006: Cleaned the code and added new error checks.\n    Corrected terminology \"deflate\" into \"inflate\".\n*) 23 jun 2006: Added SDL example in the documentation in the header, this\n    example allows easy debugging by displaying the PNG and its transparency.\n*) 22 jun 2006: (!) Changed way to obtain error value. Added\n    loadFile function for convenience. Made decodePNG32 faster.\n*) 21 jun 2006: (!) Changed type of info vector to unsigned.\n    Changed position of palette in info vector. Fixed an important bug that\n    happened on PNGs with an uncompressed block.\n*) 16 jun 2006: Internally changed unsigned into unsigned where\n    needed, and performed some optimizations.\n*) 07 jun 2006: (!) Renamed functions to decodePNG and placed them\n    in LodePNG namespace. Changed the order of the parameters. Rewrote the\n    documentation in the header. Renamed files to lodepng.cpp and lodepng.h\n*) 22 apr 2006: Optimized and improved some code\n*) 07 sep 2005: (!) Changed to std::vector interface\n*) 12 aug 2005: Initial release (C++, decoder only)\n\n\n13. contact information\n-----------------------\n\nFeel free to contact me with suggestions, problems, comments, ... concerning\nLodePNG. If you encounter a PNG image that doesn't work properly with this\ndecoder, feel free to send it and I'll use it to find and fix the problem.\n\nMy email address is (puzzle the account and domain together with an @ symbol):\nDomain: gmail dot com.\nAccount: lode dot vandevenne.\n\n\nCopyright (c) 2005-2021 Lode Vandevenne\n*/\n"
  },
  {
    "path": "src/libraries/lua53/lprefix.h",
    "content": "/*\n** $Id: lprefix.h,v 1.2 2014/12/29 16:54:13 roberto Exp $\n** Definitions for Lua code that must come before any other header file\n** See Copyright Notice in lutf8lib.c\n*/\n\n#ifndef lprefix_h\n#define lprefix_h\n\n\n/*\n** Allows POSIX/XSI stuff\n*/\n#if !defined(LUA_USE_C89)\t/* { */\n\n#if !defined(_XOPEN_SOURCE)\n#define _XOPEN_SOURCE           600\n#elif _XOPEN_SOURCE == 0\n#undef _XOPEN_SOURCE  /* use -D_XOPEN_SOURCE=0 to undefine it */\n#endif\n\n/*\n** Allows manipulation of large files in gcc and some other compilers\n*/\n#if !defined(LUA_32BITS) && !defined(_FILE_OFFSET_BITS)\n#define _LARGEFILE_SOURCE       1\n#define _FILE_OFFSET_BITS       64\n#endif\n\n#endif\t\t\t\t/* } */\n\n\n/*\n** Windows stuff\n*/\n#if defined(_WIN32) \t/* { */\n\n#if !defined(_CRT_SECURE_NO_WARNINGS)\n#define _CRT_SECURE_NO_WARNINGS  /* avoid warnings about ISO C functions */\n#endif\n\n#endif\t\t\t/* } */\n\n#endif\n\n"
  },
  {
    "path": "src/libraries/lua53/lstrlib.c",
    "content": "/*\n** $Id: lstrlib.c,v 1.254 2016/12/22 13:08:50 roberto Exp $\n** Standard library for string operations and pattern-matching\n** Modified by the Kepler Project and the LOVE Development Team to work with\n** Lua 5.1's API\n*/\n\n/*********************************************************************\n * The MIT License (MIT)\n *\n * Copyright (c) 2015 Kepler Project.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *********************************************************************/\n\n/*********************************************************************\n * This file contains parts of Lua 5.2's and Lua 5.3's source code:\n *\n * Copyright (C) 1994-2014 Lua.org, PUC-Rio.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *********************************************************************/\n\n#include \"lprefix.h\"\n\n\n#include <ctype.h>\n#include <float.h>\n#include <limits.h>\n#include <stddef.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"lua.h\"\n\n#include \"lauxlib.h\"\n#include \"lualib.h\"\n#include \"lstrlib.h\"\n\n#if LUA_VERSION_NUM == 501\ntypedef size_t lua_Unsigned;\n#endif\n\n#if LUA_VERSION_NUM >= 504\n#   define LUAL_BUFFER53_BUFFER(B) (B)->b.b\n#elif LUA_VERSION_NUM == 501\n#\tdefine LUAL_BUFFER53_BUFFER(B) (B)->b.buffer\n#else\n#\tdefine LUAL_BUFFER53_BUFFER(B) (B)->b.initb\n#endif\n\nstatic void luaL_buffinit_53 (lua_State *L, luaL_Buffer_53 *B) {\n#if LUA_VERSION_NUM == 501\n\t/* make it crash if used via pointer to a 5.1-style luaL_Buffer */\n\tB->b.p = NULL;\n\tB->b.L = NULL;\n\tB->b.lvl = 0;\n\t/* reuse the buffer from the 5.1-style luaL_Buffer though! */\n\tB->ptr = B->b.buffer;\n\tB->capacity = LUAL_BUFFERSIZE;\n\tB->nelems = 0;\n\tB->L2 = L;\n#else\n\treturn luaL_buffinit(L, (luaL_Buffer*) B);\n#endif\n}\n\n\nstatic char *luaL_prepbuffsize_53 (luaL_Buffer_53 *B, size_t s) {\n#if LUA_VERSION_NUM == 501\n\tif (B->capacity - B->nelems < s) { /* needs to grow */\n\t\tchar* newptr = NULL;\n\t\tsize_t newcap = B->capacity * 2;\n\t\tif (newcap - B->nelems < s)\n\t\t\tnewcap = B->nelems + s;\n\t\tif (newcap < B->capacity) /* overflow */\n\t\t\tluaL_error(B->L2, \"buffer too large\");\n\t\tnewptr = (char*)lua_newuserdata(B->L2, newcap);\n\t\tmemcpy(newptr, B->ptr, B->nelems);\n\t\tif (B->ptr != B->b.buffer)\n\t\t\tlua_replace(B->L2, -2); /* remove old buffer */\n\t\tB->ptr = newptr;\n\t\tB->capacity = newcap;\n\t}\n\treturn B->ptr+B->nelems;\n#else\n\treturn luaL_prepbuffsize((luaL_Buffer*) B, s);\n#endif\n}\n\n\n#define luaL_addsize_53(B, s) \\\n\t((B)->nelems += (s))\n\n#define luaL_addchar_53(B, c) \\\n\t((void)((B)->nelems < (B)->capacity || luaL_prepbuffsize_53((B), 1)), \\\n\t((B)->ptr[(B)->nelems++] = (c)))\n\n\nstatic void luaL_addlstring_53 (luaL_Buffer_53 *B, const char *s, size_t l) {\n\tmemcpy(luaL_prepbuffsize_53(B, l), s, l);\n\tluaL_addsize_53(B, l);\n}\n\n\nvoid lua53_pushresult (luaL_Buffer_53 *B) {\n\tlua_pushlstring(B->L2, B->ptr, B->nelems);\n\tif (B->ptr != LUAL_BUFFER53_BUFFER(B))\n\t\tlua_replace(B->L2, -2); /* remove userdata buffer */\n}\n\nvoid lua53_cleanupbuffer (luaL_Buffer_53 *B) {\n\tif (B->ptr != LUAL_BUFFER53_BUFFER(B))\n\t\tlua_replace(B->L2, -1); /* remove userdata buffer */\n}\n\n/*\n** Some sizes are better limited to fit in 'int', but must also fit in\n** 'size_t'. (We assume that 'lua_Integer' cannot be smaller than 'int'.)\n*/\n#define MAX_SIZET\t((size_t)(~(size_t)0))\n\n#define MAXSIZE  \\\n\t(sizeof(size_t) < sizeof(int) ? MAX_SIZET : (size_t)(INT_MAX))\n\n\n/* translate a relative string position: negative means back from end */\nstatic lua_Integer posrelat (lua_Integer pos, size_t len) {\n  if (pos >= 0) return pos;\n  else if (0u - (size_t)pos > len) return 0;\n  else return (lua_Integer)len + pos + 1;\n}\n\n\n/*\n** {======================================================\n** PACK/UNPACK\n** =======================================================\n*/\n\n\n/* value used for padding */\n#if !defined(LUAL_PACKPADBYTE)\n#define LUAL_PACKPADBYTE\t\t0x00\n#endif\n\n/* maximum size for the binary representation of an integer */\n#define MAXINTSIZE\t16\n\n/* number of bits in a character */\n#define NB\tCHAR_BIT\n\n/* mask for one character (NB 1's) */\n#define MC\t((1 << NB) - 1)\n\n/* size of a lua_Integer */\n#define SZINT\t((int)sizeof(lua_Integer))\n\n\n/* dummy union to get native endianness */\nstatic const union {\n  int dummy;\n  char little;  /* true iff machine is little endian */\n} nativeendian = {1};\n\n\n/* dummy structure to get native alignment requirements */\nstruct cD {\n  char c;\n  union { double d; void *p; lua_Integer i; lua_Number n; } u;\n};\n\n#define MAXALIGN\t(offsetof(struct cD, u))\n\n\n/*\n** Union for serializing floats\n*/\ntypedef union Ftypes {\n  float f;\n  double d;\n  lua_Number n;\n  char buff[5 * sizeof(lua_Number)];  /* enough for any float type */\n} Ftypes;\n\n\n/*\n** information to pack/unpack stuff\n*/\ntypedef struct Header {\n  lua_State *L;\n  int islittle;\n  int maxalign;\n} Header;\n\n\n/*\n** options for pack/unpack\n*/\ntypedef enum KOption {\n  Kint,\t\t/* signed integers */\n  Kuint,\t/* unsigned integers */\n  Kfloat,\t/* floating-point numbers */\n  Kchar,\t/* fixed-length strings */\n  Kstring,\t/* strings with prefixed length */\n  Kzstr,\t/* zero-terminated strings */\n  Kpadding,\t/* padding */\n  Kpaddalign,\t/* padding for alignment */\n  Knop\t\t/* no-op (configuration or spaces) */\n} KOption;\n\n\n/*\n** Read an integer numeral from string 'fmt' or return 'df' if\n** there is no numeral\n*/\nstatic int digit (int c) { return '0' <= c && c <= '9'; }\n\nstatic int getnum (const char **fmt, int df) {\n  if (!digit(**fmt))  /* no number? */\n    return df;  /* return default value */\n  else {\n    int a = 0;\n    do {\n      a = a*10 + (*((*fmt)++) - '0');\n    } while (digit(**fmt) && a <= ((int)MAXSIZE - 9)/10);\n    return a;\n  }\n}\n\n\n/*\n** Read an integer numeral and raises an error if it is larger\n** than the maximum size for integers.\n*/\nstatic int getnumlimit (Header *h, const char **fmt, int df) {\n  int sz = getnum(fmt, df);\n  if (sz > MAXINTSIZE || sz <= 0)\n    luaL_error(h->L, \"integral size (%d) out of limits [1,%d]\",\n                     sz, MAXINTSIZE);\n  return sz;\n}\n\n\n/*\n** Initialize Header\n*/\nstatic void initheader (lua_State *L, Header *h) {\n  h->L = L;\n  h->islittle = nativeendian.little;\n  h->maxalign = 1;\n}\n\n\n/*\n** Read and classify next option. 'size' is filled with option's size.\n*/\nstatic KOption getoption (Header *h, const char **fmt, int *size) {\n  int opt = *((*fmt)++);\n  *size = 0;  /* default */\n  switch (opt) {\n    case 'b': *size = sizeof(char); return Kint;\n    case 'B': *size = sizeof(char); return Kuint;\n    case 'h': *size = sizeof(short); return Kint;\n    case 'H': *size = sizeof(short); return Kuint;\n    case 'l': *size = sizeof(long); return Kint;\n    case 'L': *size = sizeof(long); return Kuint;\n    case 'j': *size = sizeof(lua_Integer); return Kint;\n    case 'J': *size = sizeof(lua_Integer); return Kuint;\n    case 'T': *size = sizeof(size_t); return Kuint;\n    case 'f': *size = sizeof(float); return Kfloat;\n    case 'd': *size = sizeof(double); return Kfloat;\n    case 'n': *size = sizeof(lua_Number); return Kfloat;\n    case 'i': *size = getnumlimit(h, fmt, sizeof(int)); return Kint;\n    case 'I': *size = getnumlimit(h, fmt, sizeof(int)); return Kuint;\n    case 's': *size = getnumlimit(h, fmt, sizeof(size_t)); return Kstring;\n    case 'c':\n      *size = getnum(fmt, -1);\n      if (*size == -1)\n        luaL_error(h->L, \"missing size for format option 'c'\");\n      return Kchar;\n    case 'z': return Kzstr;\n    case 'x': *size = 1; return Kpadding;\n    case 'X': return Kpaddalign;\n    case ' ': break;\n    case '<': h->islittle = 1; break;\n    case '>': h->islittle = 0; break;\n    case '=': h->islittle = nativeendian.little; break;\n    case '!': h->maxalign = getnumlimit(h, fmt, MAXALIGN); break;\n    default: luaL_error(h->L, \"invalid format option '%c'\", opt);\n  }\n  return Knop;\n}\n\n\n/*\n** Read, classify, and fill other details about the next option.\n** 'psize' is filled with option's size, 'notoalign' with its\n** alignment requirements.\n** Local variable 'size' gets the size to be aligned. (Kpadal option\n** always gets its full alignment, other options are limited by\n** the maximum alignment ('maxalign'). Kchar option needs no alignment\n** despite its size.\n*/\nstatic KOption getdetails (Header *h, size_t totalsize,\n                           const char **fmt, int *psize, int *ntoalign) {\n  KOption opt = getoption(h, fmt, psize);\n  int align = *psize;  /* usually, alignment follows size */\n  if (opt == Kpaddalign) {  /* 'X' gets alignment from following option */\n    if (**fmt == '\\0' || getoption(h, fmt, &align) == Kchar || align == 0)\n      luaL_argerror(h->L, 1, \"invalid next option for option 'X'\");\n  }\n  if (align <= 1 || opt == Kchar)  /* need no alignment? */\n    *ntoalign = 0;\n  else {\n    if (align > h->maxalign)  /* enforce maximum alignment */\n      align = h->maxalign;\n    if ((align & (align - 1)) != 0)  /* is 'align' not a power of 2? */\n      luaL_argerror(h->L, 1, \"format asks for alignment not power of 2\");\n    *ntoalign = (align - (int)(totalsize & (align - 1))) & (align - 1);\n  }\n  return opt;\n}\n\n\n/*\n** Pack integer 'n' with 'size' bytes and 'islittle' endianness.\n** The final 'if' handles the case when 'size' is larger than\n** the size of a Lua integer, correcting the extra sign-extension\n** bytes if necessary (by default they would be zeros).\n*/\nstatic void packint (luaL_Buffer_53 *b, lua_Unsigned n,\n                     int islittle, int size, int neg) {\n  char *buff = luaL_prepbuffsize_53(b, size);\n  int i;\n  buff[islittle ? 0 : size - 1] = (char)(n & MC);  /* first byte */\n  for (i = 1; i < size; i++) {\n    n >>= NB;\n    buff[islittle ? i : size - 1 - i] = (char)(n & MC);\n  }\n  if (neg && size > SZINT) {  /* negative number need sign extension? */\n    for (i = SZINT; i < size; i++)  /* correct extra bytes */\n      buff[islittle ? i : size - 1 - i] = (char)MC;\n  }\n  luaL_addsize_53(b, size);  /* add result to buffer */\n}\n\n\n/*\n** Copy 'size' bytes from 'src' to 'dest', correcting endianness if\n** given 'islittle' is different from native endianness.\n*/\nstatic void copywithendian (volatile char *dest, volatile const char *src,\n                            int size, int islittle) {\n  if (islittle == nativeendian.little) {\n    while (size-- != 0)\n      *(dest++) = *(src++);\n  }\n  else {\n    dest += size - 1;\n    while (size-- != 0)\n      *(dest--) = *(src++);\n  }\n}\n\n\nvoid lua53_str_pack (lua_State *L, const char *fmt, int startidx, luaL_Buffer_53 *b) {\n  Header h;\n  int arg = startidx - 1;  /* current argument to pack */\n  size_t totalsize = 0;  /* accumulate total size of result */\n  initheader(L, &h);\n  lua_pushnil(L);  /* mark to separate arguments from string buffer */\n  luaL_buffinit_53(L, b);\n  while (*fmt != '\\0') {\n    int size, ntoalign;\n    KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign);\n    totalsize += ntoalign + size;\n    while (ntoalign-- > 0)\n     luaL_addchar_53(b, LUAL_PACKPADBYTE);  /* fill alignment */\n    arg++;\n    switch (opt) {\n      case Kint: {  /* signed integers */\n        lua_Integer n = luaL_checkinteger(L, arg);\n        if (size < SZINT) {  /* need overflow check? */\n          lua_Integer lim = (lua_Integer)1 << ((size * NB) - 1);\n          luaL_argcheck(L, -lim <= n && n < lim, arg, \"integer overflow\");\n        }\n        packint(b, (lua_Unsigned)n, h.islittle, size, (n < 0));\n        break;\n      }\n      case Kuint: {  /* unsigned integers */\n        lua_Integer n = luaL_checkinteger(L, arg);\n        if (size < SZINT)  /* need overflow check? */\n          luaL_argcheck(L, (lua_Unsigned)n < ((lua_Unsigned)1 << (size * NB)),\n                           arg, \"unsigned overflow\");\n        packint(b, (lua_Unsigned)n, h.islittle, size, 0);\n        break;\n      }\n      case Kfloat: {  /* floating-point options */\n        volatile Ftypes u;\n        char *buff = luaL_prepbuffsize_53(b, size);\n        lua_Number n = luaL_checknumber(L, arg);  /* get argument */\n        if (size == sizeof(u.f)) u.f = (float)n;  /* copy it into 'u' */\n        else if (size == sizeof(u.d)) u.d = (double)n;\n        else u.n = n;\n        /* move 'u' to final result, correcting endianness if needed */\n        copywithendian(buff, u.buff, size, h.islittle);\n        luaL_addsize_53(b, size);\n        break;\n      }\n      case Kchar: {  /* fixed-size string */\n        size_t len;\n        const char *s = luaL_checklstring(L, arg, &len);\n        luaL_argcheck(L, len <= (size_t)size, arg,\n                         \"string longer than given size\");\n        luaL_addlstring_53(b, s, len);  /* add string */\n        while (len++ < (size_t)size)  /* pad extra space */\n          luaL_addchar_53(b, LUAL_PACKPADBYTE);\n        break;\n      }\n      case Kstring: {  /* strings with length count */\n        size_t len;\n        const char *s = luaL_checklstring(L, arg, &len);\n        luaL_argcheck(L, size >= (int)sizeof(size_t) ||\n                         len < ((size_t)1 << (size * NB)),\n                         arg, \"string length does not fit in given size\");\n        packint(b, (lua_Unsigned)len, h.islittle, size, 0);  /* pack length */\n        luaL_addlstring_53(b, s, len);\n        totalsize += len;\n        break;\n      }\n      case Kzstr: {  /* zero-terminated string */\n        size_t len;\n        const char *s = luaL_checklstring(L, arg, &len);\n        luaL_argcheck(L, strlen(s) == len, arg, \"string contains zeros\");\n        luaL_addlstring_53(b, s, len);\n        luaL_addchar_53(b, '\\0');  /* add zero at the end */\n        totalsize += len + 1;\n        break;\n      }\n      case Kpadding: luaL_addchar_53(b, LUAL_PACKPADBYTE);  /* FALLTHROUGH */\n      case Kpaddalign: case Knop:\n        arg--;  /* undo increment */\n        break;\n    }\n  }\n}\n\n\nint lua53_str_packsize (lua_State *L) {\n  Header h;\n  const char *fmt = luaL_checkstring(L, 1);  /* format string */\n  size_t totalsize = 0;  /* accumulate total size of result */\n  initheader(L, &h);\n  while (*fmt != '\\0') {\n    int size, ntoalign;\n    KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign);\n    size += ntoalign;  /* total space used by option */\n    luaL_argcheck(L, totalsize <= MAXSIZE - size, 1,\n                     \"format result too large\");\n    totalsize += size;\n    switch (opt) {\n      case Kstring:  /* strings with length count */\n      case Kzstr:    /* zero-terminated string */\n        luaL_argerror(L, 1, \"variable-length format\");\n        /* call never return, but to avoid warnings: *//* FALLTHROUGH */\n      default:  break;\n    }\n  }\n  lua_pushinteger(L, (lua_Integer)totalsize);\n  return 1;\n}\n\n\n/*\n** Unpack an integer with 'size' bytes and 'islittle' endianness.\n** If size is smaller than the size of a Lua integer and integer\n** is signed, must do sign extension (propagating the sign to the\n** higher bits); if size is larger than the size of a Lua integer,\n** it must check the unread bytes to see whether they do not cause an\n** overflow.\n*/\nstatic lua_Integer unpackint (lua_State *L, const char *str,\n                              int islittle, int size, int issigned) {\n  lua_Unsigned res = 0;\n  int i;\n  int limit = (size  <= SZINT) ? size : SZINT;\n  for (i = limit - 1; i >= 0; i--) {\n    res <<= NB;\n    res |= (lua_Unsigned)(unsigned char)str[islittle ? i : size - 1 - i];\n  }\n  if (size < SZINT) {  /* real size smaller than lua_Integer? */\n    if (issigned) {  /* needs sign extension? */\n      lua_Unsigned mask = (lua_Unsigned)1 << (size*NB - 1);\n      res = ((res ^ mask) - mask);  /* do sign extension */\n    }\n  }\n  else if (size > SZINT) {  /* must check unread bytes */\n    int mask = (!issigned || (lua_Integer)res >= 0) ? 0 : MC;\n    for (i = limit; i < size; i++) {\n      if ((unsigned char)str[islittle ? i : size - 1 - i] != mask)\n        luaL_error(L, \"%d-byte integer does not fit into Lua Integer\", size);\n    }\n  }\n  return (lua_Integer)res;\n}\n\n\nint lua53_str_unpack (lua_State *L, const char *fmt, const char *data, size_t ld, int dataidx, int posidx) {\n  Header h;\n  size_t pos = (size_t)posrelat(luaL_optinteger(L, posidx, 1), ld) - 1;\n  int n = 0;  /* number of results */\n  luaL_argcheck(L, pos <= ld, posidx, \"initial position out of string\");\n  initheader(L, &h);\n  while (*fmt != '\\0') {\n    int size, ntoalign;\n    KOption opt = getdetails(&h, pos, &fmt, &size, &ntoalign);\n    if ((size_t)ntoalign + size > ~pos || pos + ntoalign + size > ld)\n      luaL_argerror(L, dataidx, \"data string too short\");\n    pos += ntoalign;  /* skip alignment */\n    /* stack space for item + next position */\n    luaL_checkstack(L, dataidx, \"too many results\");\n    n++;\n    switch (opt) {\n      case Kint:\n      case Kuint: {\n        lua_Integer res = unpackint(L, data + pos, h.islittle, size,\n                                       (opt == Kint));\n        lua_pushinteger(L, res);\n        break;\n      }\n      case Kfloat: {\n        volatile Ftypes u;\n        lua_Number num;\n        copywithendian(u.buff, data + pos, size, h.islittle);\n        if (size == sizeof(u.f)) num = (lua_Number)u.f;\n        else if (size == sizeof(u.d)) num = (lua_Number)u.d;\n        else num = u.n;\n        lua_pushnumber(L, num);\n        break;\n      }\n      case Kchar: {\n        lua_pushlstring(L, data + pos, size);\n        break;\n      }\n      case Kstring: {\n        size_t len = (size_t)unpackint(L, data + pos, h.islittle, size, 0);\n        luaL_argcheck(L, pos + len + size <= ld, dataidx, \"data string too short\");\n        lua_pushlstring(L, data + pos + size, len);\n        pos += len;  /* skip string */\n        break;\n      }\n      case Kzstr: {\n        size_t len = (int)strlen(data + pos);\n        lua_pushlstring(L, data + pos, len);\n        pos += len + 1;  /* skip string plus final '\\0' */\n        break;\n      }\n      case Kpaddalign: case Kpadding: case Knop:\n        n--;  /* undo increment */\n        break;\n    }\n    pos += size;\n  }\n  lua_pushinteger(L, pos + 1);  /* next position */\n  return n + 1;\n}\n\n/* }====================================================== */\n\n"
  },
  {
    "path": "src/libraries/lua53/lstrlib.h",
    "content": "\n#ifndef LUA53_LSTRLIB_H\n#define LUA53_LSTRLIB_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"lua.h\"\n\ntypedef struct luaL_Buffer_53 {\n\tluaL_Buffer b; /* make incorrect code crash! */\n\tchar *ptr;\n\tsize_t nelems;\n\tsize_t capacity;\n\tlua_State *L2;\n} luaL_Buffer_53;\n\nvoid lua53_pushresult (luaL_Buffer_53 *B);\nvoid lua53_cleanupbuffer (luaL_Buffer_53 *B);\n\nvoid lua53_str_pack (lua_State *L, const char *fmt, int startidx, luaL_Buffer_53 *b);\nint lua53_str_packsize (lua_State *L);\nint lua53_str_unpack (lua_State *L, const char *fmt, const char *data, size_t ld, int dataidx, int posidx);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LUA53_LSTRLIB_H */\n"
  },
  {
    "path": "src/libraries/lua53/lutf8lib.c",
    "content": "/*\n** $Id: lutf8lib.c,v 1.13 2014/11/02 19:19:04 roberto Exp $\n** Standard library for UTF-8 manipulation\n** Modified by the LOVE Development Team to work with Lua 5.1's API\n*/\n\n/******************************************************************************\n * Copyright (C) 1994-2015 Lua.org, PUC-Rio, 2015 LOVE Development Team.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n ******************************************************************************/\n\n#define lutf8lib_c\n\n#include \"lprefix.h\"\n\n\n#include <assert.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"lutf8lib.h\"\n\n#include \"lauxlib.h\"\n#include \"lualib.h\"\n\n#define MAXUNICODE\t0x10FFFF\n\n/* size of buffer for 'utf8esc' function (taken from lobject.h) */\n#define UTF8BUFFSZ\t8\n\n#define iscont(p)\t((*(p) & 0xC0) == 0x80)\n\n\n/* from strlib */\n/* translate a relative string position: negative means back from end */\nstatic lua_Integer u_posrelat (lua_Integer pos, size_t len) {\n  if (pos >= 0) return pos;\n  else if (0u - (size_t)pos > len) return 0;\n  else return (lua_Integer)len + pos + 1;\n}\n\n\n/*\n** Decode one UTF-8 sequence, returning NULL if byte sequence is invalid.\n*/\nstatic const char *utf8_decode (const char *o, int *val) {\n  static unsigned int limits[] = {0xFF, 0x7F, 0x7FF, 0xFFFF};\n  const unsigned char *s = (const unsigned char *)o;\n  unsigned int c = s[0];\n  unsigned int res = 0;  /* final result */\n  if (c < 0x80)  /* ascii? */\n    res = c;\n  else {\n    int count = 0;  /* to count number of continuation bytes */\n    while (c & 0x40) {  /* still have continuation bytes? */\n      int cc = s[++count];  /* read next byte */\n      if ((cc & 0xC0) != 0x80)  /* not a continuation byte? */\n        return NULL;  /* invalid byte sequence */\n      res = (res << 6) | (cc & 0x3F);  /* add lower 6 bits from cont. byte */\n      c <<= 1;  /* to test next bit */\n    }\n    res |= ((c & 0x7F) << (count * 5));  /* add first byte */\n    if (count > 3 || res > MAXUNICODE || res <= limits[count])\n      return NULL;  /* invalid byte sequence */\n    s += count;  /* skip continuation bytes read */\n  }\n  if (val) *val = res;\n  return (const char *)s + 1;  /* +1 to include first byte */\n}\n\n\n/*\n** utf8len(s [, i [, j]]) --> number of characters that start in the\n** range [i,j], or nil + current position if 's' is not well formed in\n** that interval\n*/\nstatic int utflen (lua_State *L) {\n  int n = 0;\n  size_t len;\n  const char *s = luaL_checklstring(L, 1, &len);\n  lua_Integer posi = u_posrelat(luaL_optinteger(L, 2, 1), len);\n  lua_Integer posj = u_posrelat(luaL_optinteger(L, 3, -1), len);\n  luaL_argcheck(L, 1 <= posi && --posi <= (lua_Integer)len, 2,\n                   \"initial position out of string\");\n  luaL_argcheck(L, --posj < (lua_Integer)len, 3,\n                   \"final position out of string\");\n  while (posi <= posj) {\n    const char *s1 = utf8_decode(s + posi, NULL);\n    if (s1 == NULL) {  /* conversion error? */\n      lua_pushnil(L);  /* return nil ... */\n      lua_pushinteger(L, posi + 1);  /* ... and current position */\n      return 2;\n    }\n    posi = s1 - s;\n    n++;\n  }\n  lua_pushinteger(L, n);\n  return 1;\n}\n\n\n/*\n** codepoint(s, [i, [j]])  -> returns codepoints for all characters\n** that start in the range [i,j]\n*/\nstatic int codepoint (lua_State *L) {\n  size_t len;\n  const char *s = luaL_checklstring(L, 1, &len);\n  lua_Integer posi = u_posrelat(luaL_optinteger(L, 2, 1), len);\n  lua_Integer pose = u_posrelat(luaL_optinteger(L, 3, posi), len);\n  int n;\n  const char *se;\n  luaL_argcheck(L, posi >= 1, 2, \"out of range\");\n  luaL_argcheck(L, pose <= (lua_Integer)len, 3, \"out of range\");\n  if (posi > pose) return 0;  /* empty interval; return no values */\n  n = (int)(pose -  posi + 1);\n  if (posi + n <= pose)  /* (lua_Integer -> int) overflow? */\n    return luaL_error(L, \"string slice too long\");\n  luaL_checkstack(L, n, \"string slice too long\");\n  n = 0;\n  se = s + pose;\n  for (s += posi - 1; s < se;) {\n    int code;\n    s = utf8_decode(s, &code);\n    if (s == NULL)\n      return luaL_error(L, \"invalid UTF-8 code\");\n    lua_pushinteger(L, code);\n    n++;\n  }\n  return n;\n}\n\n\n/* taken from lobject.c */\nstatic int utf8esc (char *buff, unsigned long x) {\n\tint n = 1;  /* number of bytes put in buffer (backwards) */\n\tlua_assert(x <= 0x10FFFF);\n\tif (x < 0x80)  /* ascii? */\n\t\tbuff[UTF8BUFFSZ - 1] = (char) x;\n\telse {  /* need continuation bytes */\n\t\tunsigned int mfb = 0x3f;  /* maximum that fits in first byte */\n\t\tdo {  /* add continuation bytes */\n\t\t\tbuff[UTF8BUFFSZ - (n++)] = (char) (0x80 | (x & 0x3f));\n\t\t\tx >>= 6;  /* remove added bits */\n\t\t\tmfb >>= 1;  /* now there is one less bit available in first byte */\n\t\t} while (x > mfb);  /* still needs continuation byte? */\n\t\tbuff[UTF8BUFFSZ - n] = (char) ((~mfb << 1) | x);  /* add first byte */\n\t}\n\treturn n;\n}\n\nstatic void pushutfchar (lua_State *L, int arg) {\n  lua_Integer code = luaL_checkinteger(L, arg);\n  luaL_argcheck(L, 0 <= code && code <= MAXUNICODE, arg, \"value out of range\");\n\n  /* the %U string format does not exist in lua 5.1 or 5.2, so we emulate it */\n  /* (code from luaO_pushvfstring in lobject.c) */\n  char buff[UTF8BUFFSZ];\n  int l = utf8esc(buff, (long) code);\n  lua_pushlstring(L, buff + UTF8BUFFSZ - l, l);\n}\n\n\n/*\n** utfchar(n1, n2, ...)  -> char(n1)..char(n2)...\n*/\nstatic int utfchar (lua_State *L) {\n  int n = lua_gettop(L);  /* number of arguments */\n  if (n == 1)  /* optimize common case of single char */\n    pushutfchar(L, 1);\n  else {\n    int i;\n    luaL_Buffer b;\n    luaL_buffinit(L, &b);\n    for (i = 1; i <= n; i++) {\n      pushutfchar(L, i);\n      luaL_addvalue(&b);\n    }\n    luaL_pushresult(&b);\n  }\n  return 1;\n}\n\n\n/*\n** offset(s, n, [i])  -> index where n-th character counting from\n**   position 'i' starts; 0 means character at 'i'.\n*/\nstatic int byteoffset (lua_State *L) {\n  size_t len;\n  const char *s = luaL_checklstring(L, 1, &len);\n  lua_Integer n  = luaL_checkinteger(L, 2);\n  lua_Integer posi = (n >= 0) ? 1 : len + 1;\n  posi = u_posrelat(luaL_optinteger(L, 3, posi), len);\n  luaL_argcheck(L, 1 <= posi && --posi <= (lua_Integer)len, 3,\n                   \"position out of range\");\n  if (n == 0) {\n    /* find beginning of current byte sequence */\n    while (posi > 0 && iscont(s + posi)) posi--;\n  }\n  else {\n    if (iscont(s + posi))\n      luaL_error(L, \"initial position is a continuation byte\");\n    if (n < 0) {\n       while (n < 0 && posi > 0) {  /* move back */\n         do {  /* find beginning of previous character */\n           posi--;\n         } while (posi > 0 && iscont(s + posi));\n         n++;\n       }\n     }\n     else {\n       n--;  /* do not move for 1st character */\n       while (n > 0 && posi < (lua_Integer)len) {\n         do {  /* find beginning of next character */\n           posi++;\n         } while (iscont(s + posi));  /* (cannot pass final '\\0') */\n         n--;\n       }\n     }\n  }\n  if (n == 0)  /* did it find given character? */\n    lua_pushinteger(L, posi + 1);\n  else  /* no such character */\n    lua_pushnil(L);\n  return 1;  \n}\n\n\nstatic int iter_aux (lua_State *L) {\n  size_t len;\n  const char *s = luaL_checklstring(L, 1, &len);\n  lua_Integer n = lua_tointeger(L, 2) - 1;\n  if (n < 0)  /* first iteration? */\n    n = 0;  /* start from here */\n  else if (n < (lua_Integer)len) {\n    n++;  /* skip current byte */\n    while (iscont(s + n)) n++;  /* and its continuations */\n  }\n  if (n >= (lua_Integer)len)\n    return 0;  /* no more codepoints */\n  else {\n    int code;\n    const char *next = utf8_decode(s + n, &code);\n    if (next == NULL || iscont(next))\n      return luaL_error(L, \"invalid UTF-8 code\");\n    lua_pushinteger(L, n + 1);\n    lua_pushinteger(L, code);\n    return 2;\n  }\n}\n\n\nstatic int iter_codes (lua_State *L) {\n  luaL_checkstring(L, 1);\n  lua_pushcfunction(L, iter_aux);\n  lua_pushvalue(L, 1);\n  lua_pushinteger(L, 0);\n  return 3;\n}\n\n\n/* pattern to match a single UTF-8 character */\n#if LUA_VERSION_NUM >= 502\n#define UTF8PATT\t\"[\\0-\\x7F\\xC2-\\xF4][\\x80-\\xBF]*\"\n#else\n/* lua 5.1 doesn't support literal null bytes in patterns */\n#define UTF8PATT\t\"[%z\\x01-\\x7F\\xC2-\\xF4][\\x80-\\xBF]*\"\n#endif\n\n\nstatic struct luaL_Reg funcs[] = {\n  {\"offset\", byteoffset},\n  {\"codepoint\", codepoint},\n  {\"char\", utfchar},\n  {\"len\", utflen},\n  {\"codes\", iter_codes},\n  /* placeholders */\n  {\"charpattern\", NULL},\n  {NULL, NULL}\n};\n\n\n/* modified version of luaopen_utf8, designed to work with lua 5.1-5.3 */\nint luaopen_luautf8 (lua_State *L) {\n  luaL_Reg *l;\n  lua_createtable(L, 0, (int) (sizeof(funcs) / sizeof(luaL_Reg)) - 1);\n  for (l = funcs; l->name != NULL; l++) {\n    if (l->func != NULL) {\n      lua_pushcfunction(L, l->func);\n      lua_setfield(L, -2, l->name);\n    }\n  }\n  lua_pushlstring(L, UTF8PATT, sizeof(UTF8PATT) / sizeof(char) - 1);\n  lua_setfield(L, -2, \"charpattern\");\n  return 1;\n}\n"
  },
  {
    "path": "src/libraries/lua53/lutf8lib.h",
    "content": "\n#ifndef LUA53_LUTF8LIB_H\n#define LUA53_LUTF8LIB_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"lua.h\"\n\nLUALIB_API int luaopen_luautf8(lua_State *L);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LUA53_LUTF8LIB_H */\n"
  },
  {
    "path": "src/libraries/luahttps/Android.mk",
    "content": "LOCAL_PATH := $(call my-dir)\ninclude $(CLEAR_VARS)\n\nLOCAL_MODULE    := https\nLOCAL_MODULE_FILENAME := https\n\nLOCAL_CFLAGS    := -DNOMINMAX\nLOCAL_CPPFLAGS  := -std=c++11\n\nLOCAL_ARM_NEON := true\n\nLOCAL_C_INCLUDES := \\\n\t${LOCAL_PATH}/src \\\n\t${LOCAL_PATH}/src/android\n\nLOCAL_SRC_FILES := \\\n\tsrc/lua/main.cpp \\\n\tsrc/common/HTTPS.cpp \\\n\tsrc/common/HTTPRequest.cpp \\\n\tsrc/common/HTTPSClient.cpp \\\n\tsrc/common/PlaintextConnection.cpp \\\n\tsrc/android/AndroidClient.cpp\n\nLOCAL_SHARED_LIBRARIES := liblove\n\ninclude $(BUILD_SHARED_LIBRARY)\n"
  },
  {
    "path": "src/libraries/luahttps/java.txt",
    "content": "src/android/java"
  },
  {
    "path": "src/libraries/luahttps/license.txt",
    "content": "Copyright (c) 2019-2023 LOVE Development Team\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n"
  },
  {
    "path": "src/libraries/luahttps/src/android/AndroidClient.cpp",
    "content": "#include \"AndroidClient.h\"\n\n#ifdef HTTPS_BACKEND_ANDROID\n\n#include <sstream>\n#include <type_traits>\n\n#include \"../common/LibraryLoader.h\"\n\n// We want std::string that contains null byte, hence length of 1.\n// NOLINTNEXTLINE\nstatic std::string null(\"\", 1);\n\nstatic std::string replace(const std::string &str, const std::string &from, const std::string &to)\n{\n\tstd::stringstream ss;\n\tsize_t oldpos = 0;\n\n\twhile (true)\n\t{\n\t\tsize_t pos = str.find(from, oldpos);\n\n\t\tif (pos == std::string::npos)\n\t\t{\n\t\t\tss << str.substr(oldpos);\n\t\t\tbreak;\n\t\t}\n\n\t\tss << str.substr(oldpos, pos - oldpos) << to;\n\t\toldpos = pos + from.length();\n\t}\n\n\treturn ss.str();\n}\n\nstatic jstring newStringUTF(JNIEnv *env, const std::string &str)\n{\n\tstd::string newStr = replace(str, null, \"\\xC0\\x80\");\n\tjstring jstr = env->NewStringUTF(newStr.c_str());\n\treturn jstr;\n}\n\nstatic std::string getStringUTF(JNIEnv *env, jstring str)\n{\n\tconst char *c = env->GetStringUTFChars(str, nullptr);\n\tstd::string result = replace(c, \"\\xC0\\x80\", null);\n\n\tenv->ReleaseStringUTFChars(str, c);\n\treturn result;\n}\n\nAndroidClient::AndroidClient()\n: HTTPSClient()\n{\n\tLibraryLoader::handle *library = LibraryLoader::GetCurrentProcessHandle();\n\n\t// Look for SDL_GetAndroidJNIEnv and SDL_GetAndroidActivity (SDL3)\n\tif (!(\n\t\tLibraryLoader::LoadSymbol(SDL_AndroidGetJNIEnv, library, \"SDL_GetAndroidJNIEnv\") &&\n\t\tLibraryLoader::LoadSymbol(SDL_AndroidGetActivity, library, \"SDL_GetAndroidActivity\")\n\t))\n\t{\n\t\t// Probably running SDL2.\n\t\tLibraryLoader::LoadSymbol(SDL_AndroidGetJNIEnv, library, \"SDL_AndroidGetJNIEnv\");\n\t\tLibraryLoader::LoadSymbol(SDL_AndroidGetActivity, library, \"SDL_AndroidGetActivity\");\n\t}\n}\n\nbool AndroidClient::valid() const\n{\n\tif (SDL_AndroidGetJNIEnv && SDL_AndroidGetActivity)\n\t{\n\t\tJNIEnv *env = SDL_AndroidGetJNIEnv();\n\n\t\tif (env)\n\t\t{\n\t\t\tjclass httpsClass = getHTTPSClass();\n\t\t\tif (env->ExceptionCheck())\n\t\t\t{\n\t\t\t\tenv->ExceptionClear();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tenv->DeleteLocalRef(httpsClass);\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nHTTPSClient::Reply AndroidClient::request(const HTTPSClient::Request &req)\n{\n\tJNIEnv *env = SDL_AndroidGetJNIEnv();\n\tjclass httpsClass = getHTTPSClass();\n\n\tif (httpsClass == nullptr)\n\t{\n\t\tenv->ExceptionClear();\n\t\tthrow std::runtime_error(\"Could not find class 'org.love2d.luahttps.LuaHTTPS'\");\n\t}\n\n\tjmethodID constructor = env->GetMethodID(httpsClass, \"<init>\", \"()V\");\n\tjmethodID setURL = env->GetMethodID(httpsClass, \"setUrl\", \"(Ljava/lang/String;)V\");\n\tjmethodID setMethod = env->GetMethodID(httpsClass, \"setMethod\", \"(Ljava/lang/String;)V\");\n\tjmethodID request = env->GetMethodID(httpsClass, \"request\", \"()Z\");\n\tjmethodID getInterleavedHeaders = env->GetMethodID(httpsClass, \"getInterleavedHeaders\", \"()[Ljava/lang/String;\");\n\tjmethodID getResponse = env->GetMethodID(httpsClass, \"getResponse\", \"()[B\");\n\tjmethodID getResponseCode = env->GetMethodID(httpsClass, \"getResponseCode\", \"()I\");\n\n\tjobject httpsObject = env->NewObject(httpsClass, constructor);\n\n\t// Set URL\n\tjstring url = env->NewStringUTF(req.url.c_str());\n\tenv->CallVoidMethod(httpsObject, setURL, url);\n\tenv->DeleteLocalRef(url);\n\n\t// Set method\n\tjstring method = env->NewStringUTF(req.method.c_str());\n\tenv->CallVoidMethod(httpsObject, setMethod, method);\n\tenv->DeleteLocalRef(method);\n\n\t// Set post data\n\tif (!req.postdata.empty())\n\t{\n\t\tjmethodID setPostData = env->GetMethodID(httpsClass, \"setPostData\", \"([B)V\");\n\t\tjbyteArray byteArray = env->NewByteArray((jsize) req.postdata.length());\n\t\tjbyte *byteArrayData = env->GetByteArrayElements(byteArray, nullptr);\n\n\t\t// The usage of memcpy is intentional.\n\t\t// NOLINTNEXTLINE\n\t\tmemcpy(byteArrayData, req.postdata.data(), req.postdata.length());\n\t\tenv->ReleaseByteArrayElements(byteArray, byteArrayData, 0);\n\n\t\tenv->CallVoidMethod(httpsObject, setPostData, byteArray);\n\t\tenv->DeleteLocalRef(byteArray);\n\t}\n\n\t// Set headers\n\tif (!req.headers.empty())\n\t{\n\t\tjmethodID addHeader = env->GetMethodID(httpsClass, \"addHeader\", \"(Ljava/lang/String;Ljava/lang/String;)V\");\n\n\t\tfor (auto &header : req.headers)\n\t\t{\n\t\t\tjstring headerKey = newStringUTF(env, header.first);\n\t\t\tjstring headerValue = newStringUTF(env, header.second);\n\n\t\t\tenv->CallVoidMethod(httpsObject, addHeader, headerKey, headerValue);\n\t\t\tenv->DeleteLocalRef(headerKey);\n\t\t\tenv->DeleteLocalRef(headerValue);\n\t\t}\n\t}\n\n\t// Do request\n\tHTTPSClient::Reply response;\n\tjboolean status = env->CallBooleanMethod(httpsObject, request);\n\n\t// Get response\n\tresponse.responseCode = env->CallIntMethod(httpsObject, getResponseCode);\n\n\tif (status)\n\t{\n\t\t// Get headers\n\t\tjobjectArray interleavedHeaders = (jobjectArray) env->CallObjectMethod(httpsObject, getInterleavedHeaders);\n\t\tint headerLen = env->GetArrayLength(interleavedHeaders);\n\n\t\tfor (int i = 0; i < headerLen; i += 2)\n\t\t{\n\t\t\tjstring key = (jstring) env->GetObjectArrayElement(interleavedHeaders, i);\n\t\t\tjstring value = (jstring) env->GetObjectArrayElement(interleavedHeaders, i + 1);\n\n\t\t\tresponse.headers[getStringUTF(env, key)] = getStringUTF(env, value);\n\n\t\t\tenv->DeleteLocalRef(key);\n\t\t\tenv->DeleteLocalRef(value);\n\t\t}\n\n\t\tenv->DeleteLocalRef(interleavedHeaders);\n\n\t\t// Get response data\n\t\tjbyteArray responseData = (jbyteArray) env->CallObjectMethod(httpsObject, getResponse);\n\n\t\tif (responseData)\n\t\t{\n\t\t\tint responseLen = env->GetArrayLength(responseData);\n\t\t\tjbyte *responseByte = env->GetByteArrayElements(responseData, nullptr);\n\n\t\t\tresponse.body = std::string((char *) responseByte, responseLen);\n\n\t\t\tenv->DeleteLocalRef(responseData);\n\t\t}\n\t}\n\n\tenv->DeleteLocalRef(httpsObject);\n\n\treturn response;\n}\n\njclass AndroidClient::getHTTPSClass() const\n{\n\tJNIEnv *env = SDL_AndroidGetJNIEnv();\n\n\tjclass classLoaderClass = env->FindClass(\"java/lang/ClassLoader\");\n\tjmethodID loadClass = env->GetMethodID(classLoaderClass, \"loadClass\", \"(Ljava/lang/String;)Ljava/lang/Class;\");\n\n\tjobject activity = SDL_AndroidGetActivity();\n\n\tif (activity == nullptr)\n\t\treturn nullptr;\n\n\tjclass gameActivity = env->GetObjectClass(activity);\n\tjmethodID getLoader = env->GetMethodID(gameActivity, \"getClassLoader\", \"()Ljava/lang/ClassLoader;\");\n\tjobject classLoader = env->CallObjectMethod(activity, getLoader);\n\n\tjstring httpsClassName = env->NewStringUTF(\"org.love2d.luahttps.LuaHTTPS\");\n\tjclass httpsClass = (jclass) env->CallObjectMethod(classLoader, loadClass, httpsClassName);\n\n\tenv->DeleteLocalRef(gameActivity);\n\tenv->DeleteLocalRef(httpsClassName);\n\tenv->DeleteLocalRef(activity);\n\tenv->DeleteLocalRef(classLoaderClass);\n\n\treturn httpsClass;\n}\n\n#endif // HTTPS_BACKEND_ANDROID\n"
  },
  {
    "path": "src/libraries/luahttps/src/android/AndroidClient.h",
    "content": "#pragma once\n\n#include \"../common/config.h\"\n\n#ifdef HTTPS_BACKEND_ANDROID\n\n#include <jni.h>\n\n#include \"../common/HTTPSClient.h\"\n\nclass AndroidClient: public HTTPSClient\n{\npublic:\n\tAndroidClient();\n\n\tbool valid() const override;\n\tHTTPSClient::Reply request(const HTTPSClient::Request &req) override;\n\nprivate:\n\tJNIEnv *(*SDL_AndroidGetJNIEnv)();\n\tjobject (*SDL_AndroidGetActivity)();\n\n\tjclass getHTTPSClass() const;\n};\n\n#endif\n"
  },
  {
    "path": "src/libraries/luahttps/src/android/java/org/love2d/luahttps/LuaHTTPS.java",
    "content": "package org.love2d.luahttps;\n\nimport android.text.TextUtils;\nimport android.util.Log;\n\nimport androidx.annotation.Keep;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputStream;\nimport java.net.HttpURLConnection;\nimport java.net.MalformedURLException;\nimport java.net.ProtocolException;\nimport java.net.URL;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n@Keep\nclass LuaHTTPS {\n    static private String TAG = \"LuaHTTPS\";\n\n    private String urlString;\n    private String method;\n    private byte[] postData;\n    private byte[] response;\n    private int responseCode;\n    private HashMap<String, String> headers;\n\n    public LuaHTTPS() {\n        headers = new HashMap<String, String>();\n        reset();\n    }\n\n    public void reset() {\n        urlString = null;\n        method = \"GET\";\n        postData = null;\n        response = null;\n        responseCode = 0;\n        headers.clear();\n    }\n\n    @Keep\n    public void setUrl(String url) {\n        urlString = url;\n    }\n\n    @Keep\n    public void setPostData(byte[] postData) {\n        this.postData = postData;\n    }\n\n    @Keep\n    public void setMethod(String method) {\n        this.method = method.toUpperCase();\n    }\n\n    @Keep\n    public void addHeader(String key, String value) {\n        headers.put(key, value);\n    }\n\n    @Keep\n    public String[] getInterleavedHeaders() {\n        ArrayList<String> resultInterleaved = new ArrayList<String>();\n\n        for (Map.Entry<String, String> header: headers.entrySet()) {\n            String key = header.getKey();\n            String value = header.getValue();\n\n            if (key != null && value != null) {\n                resultInterleaved.add(key);\n                resultInterleaved.add(value);\n            }\n        }\n\n        String[] result = new String[resultInterleaved.size()];\n        resultInterleaved.toArray(result);\n        return result;\n    }\n\n    @Keep\n    public int getResponseCode() {\n        return responseCode;\n    }\n\n    @Keep\n    public byte[] getResponse() {\n        return response;\n    }\n\n    @Keep\n    public boolean request() {\n        if (urlString == null) {\n            return false;\n        }\n\n        URL url;\n        try {\n            url = new URL(urlString);\n\n            if (!url.getProtocol().equals(\"http\") && !url.getProtocol().equals(\"https\")) {\n                return false;\n            }\n        } catch (MalformedURLException e) {\n            Log.e(TAG, \"Error\", e);\n            return false;\n        }\n\n        HttpURLConnection connection;\n        try {\n            connection = (HttpURLConnection) url.openConnection();\n        } catch (IOException e) {\n            Log.e(TAG, \"Error\", e);\n            return false;\n        }\n\n        // Set request method\n        try {\n            connection.setRequestMethod(method);\n        } catch (ProtocolException e) {\n            Log.e(TAG, \"Error\", e);\n            return false;\n        }\n\n        // Set header\n        for (Map.Entry<String, String> headerData: headers.entrySet()) {\n            connection.setRequestProperty(headerData.getKey(), headerData.getValue());\n        }\n\n        // Set post data\n        if (postData != null && canSendData()) {\n            connection.setDoOutput(true);\n\n            try {\n                OutputStream out = connection.getOutputStream();\n                out.write(postData);\n            } catch (Exception e) {\n                Log.e(TAG, \"Error\", e);\n                connection.disconnect();\n                return false;\n            }\n        }\n\n        // Request\n        try {\n            InputStream in;\n\n            // Set response code\n            responseCode = connection.getResponseCode();\n            if (responseCode >= 400) {\n                in = connection.getErrorStream();\n            } else {\n                in = connection.getInputStream();\n            }\n\n            // Read response\n            int readed;\n            byte[] temp = new byte[4096];\n            ByteArrayOutputStream response = new ByteArrayOutputStream();\n\n            while ((readed = in.read(temp)) != -1) {\n                response.write(temp, 0, readed);\n            }\n\n            this.response = response.toByteArray();\n            response.close();\n\n            // Read headers\n            headers.clear();\n            for (Map.Entry<String, List<String>> header: connection.getHeaderFields().entrySet()) {\n                headers.put(header.getKey(), TextUtils.join(\", \", header.getValue()));\n            }\n        } catch (Exception e) {\n            Log.e(TAG, \"Error\", e);\n            connection.disconnect();\n            return false;\n        }\n\n        connection.disconnect();\n        return true;\n    }\n\n    private boolean canSendData() {\n        return !method.equals(\"GET\") && !method.equals(\"HEAD\");\n    }\n}\n"
  },
  {
    "path": "src/libraries/luahttps/src/apple/NSURLClient.h",
    "content": "#pragma once\n\n#include \"../common/config.h\"\n\n#ifdef HTTPS_BACKEND_NSURL\n\n#include \"../common/HTTPSClient.h\"\n\nclass NSURLClient : public HTTPSClient\n{\npublic:\n\tvirtual bool valid() const override;\n\tvirtual HTTPSClient::Reply request(const HTTPSClient::Request &req) override;\n};\n\n#endif // HTTPS_BACKEND_NSURL\n"
  },
  {
    "path": "src/libraries/luahttps/src/apple/NSURLClient.mm",
    "content": "#include \"NSURLClient.h\"\n\n#ifdef HTTPS_BACKEND_NSURL\n\n#import <Foundation/Foundation.h>\n\n#if ! __has_feature(objc_arc)\n#error \"ARC is off\"\n#endif\n\nbool NSURLClient::valid() const\n{\n\treturn true;\n}\n\nstatic std::string toCppString(NSData *data)\n{\n\treturn std::string((const char*) data.bytes, (size_t) data.length);\n}\n\nstatic std::string toCppString(NSString *str)\n{\n\treturn std::string([str UTF8String]);\n}\n\nHTTPSClient::Reply NSURLClient::request(const HTTPSClient::Request &req)\n{ @autoreleasepool {\n\tNSURL *url = [NSURL URLWithString:@(req.url.c_str())];\n\tNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];\n\n\tNSData *bodydata = nil;\n\t[request setHTTPMethod:@(req.method.c_str())];\n\n\tif (req.postdata.size() > 0 && (req.method != \"GET\" && req.method != \"HEAD\"))\n\t{\n\t\tbodydata = [NSData dataWithBytesNoCopy:(void*) req.postdata.data() length:req.postdata.size() freeWhenDone:NO];\n\t\t[request setHTTPBody:bodydata];\n\t}\n\n\tfor (auto &header : req.headers)\n\t\t[request setValue:@(header.second.c_str()) forHTTPHeaderField:@(header.first.c_str())];\n\n\t__block NSHTTPURLResponse *response = nil;\n\t__block NSError *error = nil;\n\t__block NSData *body = nil;\n\n\tdispatch_semaphore_t sem = dispatch_semaphore_create(0);\n\n\tNSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request\n\t\tcompletionHandler:^(NSData *data, NSURLResponse *resp, NSError *err) {\n\t\t\tbody = data;\n\t\t\tresponse = (NSHTTPURLResponse *)resp;\n\t\t\terror = err;\n\t\t\tdispatch_semaphore_signal(sem);\n\t}];\n\n\t[task resume];\n\n\tdispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);\n\n\tHTTPSClient::Reply reply;\n\treply.responseCode = 0;\n\n\tif (body)\n\t{\n\t\treply.body = toCppString(body);\n\t}\n\n\tif (response)\n\t{\n\t\treply.responseCode = [response statusCode];\n\n\t\tNSDictionary *headers = [response allHeaderFields];\n\t\tfor (NSString *key in headers)\n\t\t{\n\t\t\tNSString *value = headers[key];\n\t\t\treply.headers[toCppString(key)] = toCppString(value);\n\t\t}\n\t}\n\n\tif (reply.responseCode == 0 && body == nil && error != nil)\n\t{\n\t\treply.body = toCppString(error.localizedDescription);\n\t}\n\n\treturn reply;\n}}\n\n#endif // HTTPS_BACKEND_NSURL\n"
  },
  {
    "path": "src/libraries/luahttps/src/common/Connection.h",
    "content": "#pragma once\n\n#include <cstdint>\n#include <string>\n\nclass Connection\n{\npublic:\n\tvirtual bool connect(const std::string &hostname, uint16_t port) = 0;\n\tvirtual size_t read(char *buffer, size_t size) = 0;\n\tvirtual size_t write(const char *buffer, size_t size) = 0;\n\tvirtual void close() = 0;\n\tvirtual ~Connection() {};\n};\n"
  },
  {
    "path": "src/libraries/luahttps/src/common/ConnectionClient.h",
    "content": "#pragma once\n\n#include \"HTTPSClient.h\"\n#include \"HTTPRequest.h\"\n#include \"Connection.h\"\n\ntemplate<typename Connection>\nclass ConnectionClient : public HTTPSClient\n{\npublic:\n\tvirtual bool valid() const override;\n\tvirtual HTTPSClient::Reply request(const HTTPSClient::Request &req) override;\n\nprivate:\n\tstatic Connection *factory();\n};\n\ntemplate<typename Connection>\nbool ConnectionClient<Connection>::valid() const\n{\n\treturn Connection::valid();\n}\n\ntemplate<typename Connection>\nConnection *ConnectionClient<Connection>::factory()\n{\n\treturn new Connection();\n}\n\ntemplate<typename Connection>\nHTTPSClient::Reply ConnectionClient<Connection>::request(const HTTPSClient::Request &req)\n{\n\tHTTPRequest request(factory);\n\treturn request.request(req);\n}\n"
  },
  {
    "path": "src/libraries/luahttps/src/common/HTTPRequest.cpp",
    "content": "#include <sstream>\n#include <string>\n#include <memory>\n#include <limits>\n#include <stdexcept>\n\n#include \"HTTPRequest.h\"\n#include \"PlaintextConnection.h\"\n\nHTTPRequest::HTTPRequest(ConnectionFactory factory)\n\t: factory(factory)\n{\n}\n\nHTTPSClient::Reply HTTPRequest::request(const HTTPSClient::Request &req)\n{\n\tHTTPSClient::Reply reply;\n\treply.responseCode = 0;\n\n\tauto info = parseUrl(req.url);\n\tif (!info.valid)\n\t\treturn reply;\n\n\tstd::unique_ptr<Connection> conn;\n\tif (info.schema == \"http\")\n\t\tconn.reset(new PlaintextConnection());\n\telse if (info.schema == \"https\")\n\t\tconn.reset(factory());\n\telse\n\t\tthrow std::runtime_error(\"Unknown url schema\");\n\n\tif (!conn->connect(info.hostname, info.port))\n\t\treturn reply;\n\n\t// Build the request\n\t{\n\t\tstd::stringstream request;\n\t\tstd::string method = req.method;\n\t\tbool hasData = req.postdata.length() > 0;\n\n\t\tif (method.length() == 0)\n\t\t\tmethod = hasData ? \"POST\" : \"GET\";\n\n\t\trequest << method << \" \" << info.query << \" HTTP/1.1\\r\\n\";\n\n\t\tfor (auto &header : req.headers)\n\t\t\trequest << header.first << \": \" << header.second << \"\\r\\n\";\n\n\t\trequest << \"Connection: Close\\r\\n\";\n\n\t\trequest << \"Host: \" << info.hostname << \"\\r\\n\";\n\n\t\tif (hasData)\n\t\t\trequest << \"Content-Length: \" << req.postdata.size() << \"\\r\\n\";\n\n\t\trequest << \"\\r\\n\";\n\n\t\tif (hasData)\n\t\t\trequest << req.postdata;\n\n\t\t// Send it\n\t\tstd::string requestData = request.str();\n\t\tconn->write(requestData.c_str(), requestData.size());\n\t}\n\n\t// Now receive the reply\n\tstd::stringstream response;\n\t{\n\t\tchar buffer[8192];\n\n\t\twhile (true)\n\t\t{\n\t\t\tsize_t read = conn->read(buffer, sizeof(buffer));\n\t\t\tresponse.write(buffer, read);\n\t\t\tif (read == 0)\n\t\t\t\tbreak;\n\t\t}\n\n\t\tconn->close();\n\t}\n\n\treply.responseCode = 500;\n\t// And parse it\n\t{\n\t\tstd::string protocol;\n\t\tresponse >> protocol;\n\t\tif (protocol != \"HTTP/1.1\")\n\t\t\treturn reply;\n\n\t\tresponse >> reply.responseCode;\n\t\tresponse.ignore(std::numeric_limits<std::streamsize>::max(), '\\n');\n\n\t\tfor (std::string line; getline(response, line, '\\n') && line != \"\\r\"; )\n\t\t{\n\t\t\tauto sep = line.find(':');\n\t\t\treply.headers[line.substr(0, sep)] = line.substr(sep+1, line.size()-sep-1);\n\t\t}\n\n\t\tauto begin = std::istreambuf_iterator<char>(response);\n\t\tauto end = std::istreambuf_iterator<char>();\n\t\treply.body = std::string(begin, end);\n\t}\n\n\treturn reply;\n}\n\nHTTPRequest::DissectedURL HTTPRequest::parseUrl(const std::string &url)\n{\n\tDissectedURL dis;\n\tdis.valid = false;\n\n\t// Schema\n\tauto schemaStart = 0;\n\tauto schemaEnd = url.find(\"://\");\n\tdis.schema = url.substr(schemaStart, schemaEnd-schemaStart);\n\n\t// Auth+Hostname+Port\n\tauto connStart = schemaEnd+3;\n\tauto connEnd = url.find('/', connStart);\n\tif (connEnd == std::string::npos)\n\t\tconnEnd = url.size();\n\n\t// TODO: Auth\n\tif (url.find(\"@\", connStart, connEnd-connStart) != std::string::npos)\n\t\treturn dis;\n\n\t// Port\n\tauto portStart = url.find(':', connStart);\n\tauto portEnd = connEnd;\n\tif (portStart == std::string::npos || portStart > portEnd)\n\t{\n\t\tdis.port = dis.schema == \"http\" ? 80 : 443;\n\t\tportStart = portEnd;\n\t}\n\telse\n\t\tdis.port = std::stoi(url.substr(portStart+1, portEnd-portStart-1));\n\n\t// Hostname\n\tauto hostnameStart = connStart;\n\tauto hostnameEnd = portStart;\n\tdis.hostname = url.substr(hostnameStart, hostnameEnd-hostnameStart);\n\n\t// And the query\n\tdis.query = url.substr(connEnd);\n\tif (dis.query.size() == 0)\n\t\tdis.query = \"/\";\n\n\tdis.valid = true;\n\t\n\treturn dis;\n}\n"
  },
  {
    "path": "src/libraries/luahttps/src/common/HTTPRequest.h",
    "content": "#pragma once\n\n#include <functional>\n\n#include \"HTTPSClient.h\"\n#include \"Connection.h\"\n\nclass HTTPRequest\n{\npublic:\n\tstruct DissectedURL\n\t{\n\t\tbool valid;\n\t\tstd::string schema;\n\t\tstd::string hostname;\n\t\tuint16_t port;\n\t\tstd::string query;\n\t\t// TODO: Auth?\n\t};\n\ttypedef std::function<Connection *()> ConnectionFactory;\n\n\tHTTPRequest(ConnectionFactory factory);\n\n\tHTTPSClient::Reply request(const HTTPSClient::Request &req);\n\n\tstatic DissectedURL parseUrl(const std::string &url);\n\nprivate:\n\tConnectionFactory factory;\n};\n"
  },
  {
    "path": "src/libraries/luahttps/src/common/HTTPS.cpp",
    "content": "#include \"HTTPS.h\"\n#include \"config.h\"\n#include \"ConnectionClient.h\"\n#include \"LibraryLoader.h\"\n\n#include <stdexcept>\n\n#ifdef HTTPS_BACKEND_CURL\n#\tinclude \"../generic/CurlClient.h\"\n#endif\n#ifdef HTTPS_BACKEND_OPENSSL\n#\tinclude \"../generic/OpenSSLConnection.h\"\n#endif\n#ifdef HTTPS_BACKEND_SCHANNEL\n#\tinclude \"../windows/SChannelConnection.h\"\n#endif\n#ifdef HTTPS_BACKEND_NSURL\n#\tinclude \"../apple/NSURLClient.h\"\n#endif\n#ifdef HTTPS_BACKEND_ANDROID\n#\tinclude \"../android/AndroidClient.h\"\n#endif\n#ifdef HTTPS_BACKEND_WININET\n#\tinclude \"../windows/WinINetClient.h\"\n#endif\n\n#ifdef HTTPS_BACKEND_CURL\n\tstatic CurlClient curlclient;\n#endif\n#ifdef HTTPS_BACKEND_OPENSSL\n\tstatic ConnectionClient<OpenSSLConnection> opensslclient;\n#endif\n#ifdef HTTPS_BACKEND_SCHANNEL\n\tstatic ConnectionClient<SChannelConnection> schannelclient;\n#endif\n#ifdef HTTPS_BACKEND_NSURL\n\tstatic NSURLClient nsurlclient;\n#endif\n#ifdef HTTPS_BACKEND_ANDROID\n\tstatic AndroidClient androidclient;\n#endif\n#ifdef HTTPS_BACKEND_WININET\n\tstatic WinINetClient wininetclient;\n#endif\n\nstatic HTTPSClient *clients[] = {\n#ifdef HTTPS_BACKEND_CURL\n\t&curlclient,\n#endif\n#ifdef HTTPS_BACKEND_OPENSSL\n\t&opensslclient,\n#endif\n\t// WinINet must be above SChannel\n#ifdef HTTPS_BACKEND_WININET\n\t&wininetclient,\n#endif\n#ifdef HTTPS_BACKEND_SCHANNEL\n\t&schannelclient,\n#endif\n#ifdef HTTPS_BACKEND_NSURL\n\t&nsurlclient,\n#endif\n#ifdef HTTPS_BACKEND_ANDROID\n\t&androidclient,\n#endif\n\tnullptr,\n};\n\n// Call into the library loader to make sure it is linked in\nstatic LibraryLoader::handle* dummyProcessHandle = LibraryLoader::GetCurrentProcessHandle();\n\nHTTPSClient::Reply request(const HTTPSClient::Request &req)\n{\n\tfor (size_t i = 0; clients[i]; ++i)\n\t{\n\t\tHTTPSClient &client = *clients[i];\n\n\t\tif (client.valid())\n\t\t\treturn client.request(req);\n\t}\n\n\tthrow std::runtime_error(\"No applicable HTTPS implementation found\");\n}\n"
  },
  {
    "path": "src/libraries/luahttps/src/common/HTTPS.h",
    "content": "#pragma once\n\n#include \"HTTPSClient.h\"\n\nHTTPSClient::Reply request(const HTTPSClient::Request &req);\n"
  },
  {
    "path": "src/libraries/luahttps/src/common/HTTPSClient.cpp",
    "content": "#include <algorithm>\n#include <cctype>\n\n#include \"HTTPSClient.h\"\n\n// This may not be the order you expect, as shorter strings always compare less,\n// but it's sufficient for our map\nbool HTTPSClient::ci_string_less::operator()(const std::string &lhs, const std::string &rhs) const\n{\n\tconst size_t lhs_size = lhs.size();\n\tconst size_t rhs_size = rhs.size();\n\tconst size_t steps = std::min(lhs_size, rhs_size);\n\n\tif (lhs_size < rhs_size)\n\t\treturn true;\n\telse if (lhs_size > rhs_size)\n\t\treturn false;\n\n\tfor (size_t i = 0; i < steps; ++i)\n\t{\n\t\tchar l = std::tolower(lhs[i]);\n\t\tchar r = std::tolower(rhs[i]);\n\t\tif (l < r)\n\t\t\treturn true;\n\t\telse if (l > r)\n\t\t\treturn false;\n\t}\n\n\treturn false;\n}\n\nHTTPSClient::Request::Request(const std::string &url)\n: url(url)\n, method(\"GET\")\n{\n}\n\n"
  },
  {
    "path": "src/libraries/luahttps/src/common/HTTPSClient.h",
    "content": "#pragma once\n\n#include <cstdint>\n#include <string>\n#include <map>\n\nclass HTTPSClient\n{\npublic:\n\tstruct ci_string_less\n\t{\n\t\tbool operator()(const std::string &lhs, const std::string &rhs) const;\n\t};\n\tusing header_map = std::map<std::string, std::string, ci_string_less>;\n\n\tstruct Request\n\t{\n\t\tRequest(const std::string &url);\n\n\t\theader_map headers;\n\t\tstd::string url;\n\t\tstd::string postdata;\n\t\tstd::string method;\n\t};\n\n\tstruct Reply\n\t{\n\t\theader_map headers;\n\t\tstd::string body;\n\t\tint responseCode;\n\t};\n\n\tvirtual ~HTTPSClient() {}\n\tvirtual bool valid() const = 0;\n\tvirtual Reply request(const Request &req) = 0;\n};\n"
  },
  {
    "path": "src/libraries/luahttps/src/common/LibraryLoader.h",
    "content": "#pragma once\n\nnamespace LibraryLoader\n{\n\tusing handle = void;\n\tusing function = void();\n\n\thandle *OpenLibrary(const char *name);\n\tvoid CloseLibrary(handle *handle);\n\thandle* GetCurrentProcessHandle();\n\n\tfunction *GetFunction(handle *handle, const char *name);\n\n\ttemplate<class T>\n\tinline bool LoadSymbol(T& var, handle *handle, const char *name)\n\t{\n\t\tvar = reinterpret_cast<T>(GetFunction(handle, name));\n\t\treturn var != nullptr;\n\t}\n}\n"
  },
  {
    "path": "src/libraries/luahttps/src/common/PlaintextConnection.cpp",
    "content": "#include \"config.h\"\n#include <cstring>\n#ifndef HTTPS_USE_WINSOCK\n#\tinclude <netdb.h>\n#\tinclude <unistd.h>\n#\tinclude <sys/types.h>\n#\tinclude <sys/socket.h>\n#else\n#\tinclude <winsock2.h>\n#\tinclude <ws2tcpip.h>\n#endif // HTTPS_USE_WINSOCK\n\n#include \"PlaintextConnection.h\"\n\n#ifdef HTTPS_USE_WINSOCK\n\tstatic void close(int fd)\n\t{\n\t\tclosesocket(fd);\n\t}\n#endif // HTTPS_USE_WINSOCK\n\nPlaintextConnection::PlaintextConnection()\n\t: fd(-1)\n{\n#ifdef HTTPS_USE_WINSOCK\n\tstatic bool wsaInit = false;\n\tif (!wsaInit)\n\t{\n\t\tWSADATA data;\n\t\tWSAStartup(MAKEWORD(2, 2), &data);\n\t}\n#endif // HTTPS_USE_WINSOCK\n}\n\nPlaintextConnection::~PlaintextConnection()\n{\n\tif (fd != -1)\n\t\t::close(fd);\n}\n\nbool PlaintextConnection::connect(const std::string &hostname, uint16_t port)\n{\n\taddrinfo hints;\n\tstd::memset(&hints, 0, sizeof(hints));\n\thints.ai_flags = hints.ai_protocol = 0;\n\thints.ai_family = AF_UNSPEC;\n\thints.ai_socktype = SOCK_STREAM;\n\n\taddrinfo *addrs = nullptr;\n\tstd::string portString = std::to_string(port);\n\tgetaddrinfo(hostname.c_str(), portString.c_str(), &hints, &addrs);\n\n\t// Try all addresses returned\n\tbool connected = false;\n\tfor (addrinfo *addr = addrs; !connected && addr; addr = addr->ai_next)\n\t{\n\t\tfd = socket(addr->ai_family, SOCK_STREAM, 0);\n\t\tconnected = ::connect(fd, addr->ai_addr, addr->ai_addrlen) == 0;\n\t\tif (!connected)\n\t\t\t::close(fd);\n\t}\n\n\tfreeaddrinfo(addrs);\n\n\tif (!connected)\n\t{\n\t\tfd = -1;\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nsize_t PlaintextConnection::read(char *buffer, size_t size)\n{\n\tauto read = ::recv(fd, buffer, size, 0);\n\tif (read < 0)\n\t\tread = 0;\n\treturn static_cast<size_t>(read);\n}\n\nsize_t PlaintextConnection::write(const char *buffer, size_t size)\n{\n\tauto written = ::send(fd, buffer, size, 0);\n\tif (written < 0)\n\t\twritten = 0;\n\treturn static_cast<size_t>(written);\n}\n\nvoid PlaintextConnection::close()\n{\n\t::close(fd);\n\tfd = -1;\n}\n\nint PlaintextConnection::getFd() const\n{\n\treturn fd;\n}\n"
  },
  {
    "path": "src/libraries/luahttps/src/common/PlaintextConnection.h",
    "content": "#pragma once\n\n#include \"Connection.h\"\n\nclass PlaintextConnection : public Connection\n{\npublic:\n\tPlaintextConnection();\n\tvirtual bool connect(const std::string &hostname, uint16_t port);\n\tvirtual size_t read(char *buffer, size_t size);\n\tvirtual size_t write(const char *buffer, size_t size);\n\tvirtual void close();\n\tvirtual ~PlaintextConnection();\n\n\tint getFd() const;\n\nprivate:\n\tint fd;\n};\n"
  },
  {
    "path": "src/libraries/luahttps/src/common/config.h",
    "content": "#pragma once\n\n// MSVC warnings\n#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)\n\t#define _CRT_SECURE_NO_WARNINGS\n#endif\n\n#if defined(HTTPS_HAVE_CONFIG_GENERATED_H)\n\t#include \"common/config-generated.h\"\n#elif defined(WIN32) || defined(_WIN32)\n\t#define HTTPS_BACKEND_SCHANNEL\n\t#define HTTPS_USE_WINSOCK\n\t#define HTTPS_LIBRARY_LOADER_WINDOWS\n\t#include <winapifamily.h>\n\t#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP)\n\t\t// WinINet is only supported on desktop.\n\t\t#define HTTPS_BACKEND_WININET\n\t#endif\n\t// Visual Studio 2017 supports __has_include\n\t#if defined __has_include\n\t\t#if __has_include(<curl/curl.h>)\n\t\t\t#define HTTPS_BACKEND_CURL\n\t\t#endif\n\t#endif\n#elif defined(__ANDROID__)\n\t#define HTTPS_BACKEND_ANDROID\n\t#define HTTPS_LIBRARY_LOADER_UNIX\n#elif defined(__APPLE__)\n\t#define HTTPS_BACKEND_NSURL\n\t#define HTTPS_LIBRARY_LOADER_UNIX\n#elif defined(linux) || defined(__linux) || defined(__linux__)\n\t#define HTTPS_LIBRARY_LOADER_UNIX\n\n\t#if defined __has_include\n\t\t#if __has_include(<curl/curl.h>)\n\t\t\t#define HTTPS_BACKEND_CURL\n\t\t#endif\n\t\t#if __has_include(<openssl/ssl.h>)\n\t\t\t#define HTTPS_BACKEND_OPENSSL\n\t\t#endif\n\t#else\n\t\t// Hope for the best...\n\t\t#define HTTPS_BACKEND_CURL\n\t\t#define HTTPS_BACKEND_OPENSSL\n\t#endif\n#endif\n\n#if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__)\n\t#define HTTPS_DLLEXPORT __declspec(dllexport)\n#elif defined(__GNUC__) || defined(__clang__)\n\t#define HTTPS_DLLEXPORT __attribute__ ((visibility(\"default\")))\n#else\n\t#define HTTPS_DLLEXPORT\n#endif\n"
  },
  {
    "path": "src/libraries/luahttps/src/generic/CurlClient.cpp",
    "content": "#include \"CurlClient.h\"\n\n#ifdef HTTPS_BACKEND_CURL\n\n#include <algorithm>\n#include <stdexcept>\n#include <sstream>\n#include <vector>\n\ntypedef struct StringReader\n{\n\tconst std::string *str;\n\tsize_t pos;\n} StringReader;\n\nCurlClient::Curl::Curl()\n: handle(nullptr)\n, loaded(false)\n, global_cleanup(nullptr)\n, easy_init(nullptr)\n, easy_cleanup(nullptr)\n, easy_setopt(nullptr)\n, easy_perform(nullptr)\n, easy_getinfo(nullptr)\n, slist_append(nullptr)\n, slist_free_all(nullptr)\n{\n\tusing namespace LibraryLoader;\n\n#ifdef _WIN32\n\thandle = OpenLibrary(\"libcurl.dll\");\n#else\n\thandle = OpenLibrary(\"libcurl.so.4\");\n#endif\n\tif (!handle)\n\t\treturn;\n\n\t// Load symbols\n\tdecltype(&curl_global_init) global_init = nullptr;\n\tif (!LoadSymbol(global_init, handle, \"curl_global_init\"))\n\t\treturn;\n\tif (!LoadSymbol(global_cleanup, handle, \"curl_global_cleanup\"))\n\t\treturn;\n\tif (!LoadSymbol(easy_init, handle, \"curl_easy_init\"))\n\t\treturn;\n\tif (!LoadSymbol(easy_cleanup, handle, \"curl_easy_cleanup\"))\n\t\treturn;\n\tif (!LoadSymbol(easy_setopt, handle, \"curl_easy_setopt\"))\n\t\treturn;\n\tif (!LoadSymbol(easy_perform, handle, \"curl_easy_perform\"))\n\t\treturn;\n\tif (!LoadSymbol(easy_getinfo, handle, \"curl_easy_getinfo\"))\n\t\treturn;\n\tif (!LoadSymbol(slist_append, handle, \"curl_slist_append\"))\n\t\treturn;\n\tif (!LoadSymbol(slist_free_all, handle, \"curl_slist_free_all\"))\n\t\treturn;\n\n\tglobal_init(CURL_GLOBAL_DEFAULT);\n\tloaded = true;\n}\n\nCurlClient::Curl::~Curl()\n{\n\tif (loaded)\n\t\tglobal_cleanup();\n\n\tif (handle)\n\t\tLibraryLoader::CloseLibrary(handle);\n}\n\nstatic char toUppercase(char c)\n{\n\tint ch = (unsigned char) c;\n\treturn toupper(ch);\n}\n\nstatic size_t stringReader(char *ptr, size_t size, size_t nmemb, StringReader *reader)\n{\n\tconst char *data = reader->str->data();\n\tsize_t len = reader->str->length();\n\tsize_t maxCount = (len - reader->pos) / size;\n\tsize_t desiredCount = std::min(maxCount, nmemb);\n\tsize_t desiredBytes = desiredCount * size;\n\n\tstd::copy(data + reader->pos, data + desiredBytes, ptr);\n\treader->pos += desiredBytes;\n\n\treturn desiredCount;\n}\n\nstatic size_t stringstreamWriter(char *ptr, size_t size, size_t nmemb, std::stringstream *ss)\n{\n\tsize_t count = size*nmemb;\n\tss->write(ptr, count);\n\treturn count;\n}\n\nstatic size_t headerWriter(char *ptr, size_t size, size_t nmemb, std::map<std::string,std::string> *userdata)\n{\n\tstd::map<std::string, std::string> &headers = *userdata;\n\tsize_t count = size*nmemb;\n\tstd::string line(ptr, count);\n\tsize_t split = line.find(':');\n\tsize_t newline = line.find('\\r');\n\tif (newline == std::string::npos)\n\t\tnewline = line.size();\n\n\tif (split != std::string::npos)\n\t\theaders[line.substr(0, split)] = line.substr(split+1, newline-split-1);\n\treturn count;\n}\n\nbool CurlClient::valid() const\n{\n\treturn curl.loaded;\n}\n\nHTTPSClient::Reply CurlClient::request(const HTTPSClient::Request &req)\n{\n\tReply reply;\n\treply.responseCode = 0;\n\n\t// Use sensible default header for later\n\tHTTPSClient::header_map newHeaders = req.headers;\n\n\tCURL *handle = curl.easy_init();\n\tif (!handle)\n\t\tthrow std::runtime_error(\"Could not create curl request\");\n\n\tcurl.easy_setopt(handle, CURLOPT_URL, req.url.c_str());\n\tcurl.easy_setopt(handle, CURLOPT_FOLLOWLOCATION, 1L);\n\tcurl.easy_setopt(handle, CURLOPT_CUSTOMREQUEST, req.method.c_str());\n\n\tStringReader reader {};\n\n\tif (req.postdata.size() > 0 && (req.method != \"GET\" && req.method != \"HEAD\"))\n\t{\n\t\treader.str = &req.postdata;\n\t\treader.pos = 0;\n\t\tcurl.easy_setopt(handle, CURLOPT_UPLOAD, 1L);\n\t\tcurl.easy_setopt(handle, CURLOPT_READFUNCTION, stringReader);\n\t\tcurl.easy_setopt(handle, CURLOPT_READDATA, &reader);\n\t\tcurl.easy_setopt(handle, CURLOPT_INFILESIZE_LARGE, (curl_off_t) req.postdata.length());\n\t}\n\n\tif (req.method == \"HEAD\")\n\t\tcurl.easy_setopt(handle, CURLOPT_NOBODY, 1L);\n\n\t// Curl doesn't copy memory, keep the strings around\n\tstd::vector<std::string> lines;\n\tfor (auto &header : newHeaders)\n\t{\n\t\tstd::stringstream line;\n\t\tline << header.first << \": \" << header.second;\n\t\tlines.push_back(line.str());\n\t}\n\n\tcurl_slist *sendHeaders = nullptr;\n\tfor (auto &line : lines)\n\t\tsendHeaders = curl.slist_append(sendHeaders, line.c_str());\n\n\tif (sendHeaders)\n\t\tcurl.easy_setopt(handle, CURLOPT_HTTPHEADER, sendHeaders);\n\n\tstd::stringstream body;\n\n\tcurl.easy_setopt(handle, CURLOPT_WRITEFUNCTION, stringstreamWriter);\n\tcurl.easy_setopt(handle, CURLOPT_WRITEDATA, &body);\n\n\tcurl.easy_setopt(handle, CURLOPT_HEADERFUNCTION, headerWriter);\n\tcurl.easy_setopt(handle, CURLOPT_HEADERDATA, &reply.headers);\n\n\tcurl.easy_perform(handle);\n\n\tif (sendHeaders)\n\t\tcurl.slist_free_all(sendHeaders);\n\n\t{\n\t\tlong responseCode;\n\t\tcurl.easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &responseCode);\n\t\treply.responseCode = (int) responseCode;\n\t}\n\n\treply.body = body.str();\n\n\tcurl.easy_cleanup(handle);\n\treturn reply;\n}\n\nCurlClient::Curl CurlClient::curl;\n\n#endif // HTTPS_BACKEND_CURL\n"
  },
  {
    "path": "src/libraries/luahttps/src/generic/CurlClient.h",
    "content": "#pragma once\n\n#include \"../common/config.h\"\n\n#ifdef HTTPS_BACKEND_CURL\n\n#include <curl/curl.h>\n\n#include \"../common/HTTPSClient.h\"\n#include \"../common/LibraryLoader.h\"\n\nclass CurlClient : public HTTPSClient\n{\npublic:\n\tvirtual bool valid() const override;\n\tvirtual HTTPSClient::Reply request(const HTTPSClient::Request &req) override;\n\nprivate:\n\tstatic struct Curl\n\t{\n\t\tCurl();\n\t\t~Curl();\n\t\tLibraryLoader::handle *handle;\n\t\tbool loaded;\n\n\t\tdecltype(&curl_global_cleanup) global_cleanup;\n\n\t\tdecltype(&curl_easy_init) easy_init;\n\t\tdecltype(&curl_easy_cleanup) easy_cleanup;\n\t\tdecltype(&curl_easy_setopt) easy_setopt;\n\t\tdecltype(&curl_easy_perform) easy_perform;\n\t\tdecltype(&curl_easy_getinfo) easy_getinfo;\n\n\t\tdecltype(&curl_slist_append) slist_append;\n\t\tdecltype(&curl_slist_free_all) slist_free_all;\n\t} curl;\n};\n\n#endif // HTTPS_BACKEND_CURL\n"
  },
  {
    "path": "src/libraries/luahttps/src/generic/LinktimeLibraryLoader.cpp",
    "content": "#include \"../common/config.h\"\n#include \"../common/LibraryLoader.h\"\n\n#ifdef HTTPS_LIBRARY_LOADER_LINKTIME\n\n#include <cstring>\n\n#ifdef HTTPS_BACKEND_CURL\n#include <curl/curl.h>\n\nstatic char CurlHandle;\n#endif\n\n#if defined(HTTPS_BACKEND_OPENSSL) || defined(HTTPS_BACKEND_ANDROID)\n#\terror \"Selected backends that are not compatible with this loader\"\n#endif\n\nnamespace LibraryLoader\n{\n\thandle *OpenLibrary(const char *name)\n\t{\n#ifdef HTTPS_BACKEND_CURL\n\t\tif (strstr(name, \"libcurl\") == name)\n\t\t\treturn reinterpret_cast<handle *>(&CurlHandle);\n#endif\n\t\treturn nullptr;\n\t}\n\n\tvoid CloseLibrary(handle *)\n\t{\n\t}\n\n\thandle* GetCurrentProcessHandle()\n\t{\n\t\treturn nullptr;\n\t}\n\n\tfunction *GetFunction(handle *handle, const char *name)\n\t{\n#define RETURN_MATCHING_FUNCTION(func) \\\n\tif (strcmp(name, #func) == 0) \\\n\t\treturn reinterpret_cast<function *>(&func);\n\n#ifdef HTTPS_BACKEND_CURL\n\t\tif (handle == &CurlHandle)\n\t\t{\n\t\t\tRETURN_MATCHING_FUNCTION(curl_global_init);\n\t\t\tRETURN_MATCHING_FUNCTION(curl_global_cleanup);\n\t\t\tRETURN_MATCHING_FUNCTION(curl_easy_init);\n\t\t\tRETURN_MATCHING_FUNCTION(curl_easy_cleanup);\n\t\t\tRETURN_MATCHING_FUNCTION(curl_easy_setopt);\n\t\t\tRETURN_MATCHING_FUNCTION(curl_easy_perform);\n\t\t\tRETURN_MATCHING_FUNCTION(curl_easy_getinfo);\n\t\t\tRETURN_MATCHING_FUNCTION(curl_slist_append);\n\t\t\tRETURN_MATCHING_FUNCTION(curl_slist_free_all);\n\t\t}\n#endif\n\n#undef RETURN_MATCHING_FUNCTION\n\n\t\treturn nullptr;\n\t}\n}\n\n#endif // HTTPS_LIBRARY_LOADER_LINKTIME\n\n"
  },
  {
    "path": "src/libraries/luahttps/src/generic/OpenSSLConnection.cpp",
    "content": "#include \"OpenSSLConnection.h\"\n\n#ifdef HTTPS_BACKEND_OPENSSL\n\n#include \"../common/LibraryLoader.h\"\n\n// Not present in openssl 1.1 headers\n#define SSL_CTRL_OPTIONS 32\n\nstatic bool TryOpenLibraries(const char *sslName, LibraryLoader::handle *& sslHandle, const char *cryptoName, LibraryLoader::handle *&cryptoHandle)\n{\n\tsslHandle = LibraryLoader::OpenLibrary(sslName);\n\tcryptoHandle = LibraryLoader::OpenLibrary(cryptoName);\n\n\tif (sslHandle && cryptoHandle)\n\t\treturn true;\n\n\tif (sslHandle)\n\t\tLibraryLoader::CloseLibrary(sslHandle);\n\tif (cryptoHandle)\n\t\tLibraryLoader::CloseLibrary(cryptoHandle);\n\treturn false;\n}\n\nOpenSSLConnection::SSLFuncs::SSLFuncs()\n{\n\tusing namespace LibraryLoader;\n\n\thandle *sslhandle = nullptr;\n\thandle *cryptohandle = nullptr;\n\n\tvalid = TryOpenLibraries(\"libssl.so.3\", sslhandle, \"libcrypto.so.3\", cryptohandle)\n\t\t|| TryOpenLibraries(\"libssl.so.1.1\", sslhandle, \"libcrypto.so.1.1\", cryptohandle)\n\t\t|| TryOpenLibraries(\"libssl.so.1.0.0\", sslhandle, \"libcrypto.so.1.0.0\", cryptohandle)\n\t\t// Try the version-less name last, it may not be compatible or tested\n\t\t|| TryOpenLibraries(\"libssl.so\", sslhandle, \"libcrypto.so\", cryptohandle);\n\tif (!valid)\n\t\treturn;\n\n\tvalid = true;\n\tvalid = valid && (\n\t\t\tLoadSymbol(init_ssl, sslhandle, \"OPENSSL_init_ssl\") ||\n\t\t\tLoadSymbol(library_init, sslhandle, \"SSL_library_init\"));\n\n\tvalid = valid && LoadSymbol(CTX_new, sslhandle, \"SSL_CTX_new\");\n\tvalid = valid && LoadSymbol(CTX_ctrl, sslhandle, \"SSL_CTX_ctrl\");\n\tif (valid)\n\t\tLoadSymbol(CTX_set_options, sslhandle, \"SSL_CTX_set_options\");\n\tvalid = valid && LoadSymbol(CTX_set_verify, sslhandle, \"SSL_CTX_set_verify\");\n\tvalid = valid && LoadSymbol(CTX_set_default_verify_paths, sslhandle, \"SSL_CTX_set_default_verify_paths\");\n\tvalid = valid && LoadSymbol(CTX_free, sslhandle, \"SSL_CTX_free\");\n\n\tvalid = valid && LoadSymbol(SSL_new, sslhandle, \"SSL_new\");\n\tvalid = valid && LoadSymbol(SSL_free, sslhandle, \"SSL_free\");\n\tvalid = valid && LoadSymbol(set_fd, sslhandle, \"SSL_set_fd\");\n\tvalid = valid && LoadSymbol(connect, sslhandle, \"SSL_connect\");\n\tvalid = valid && LoadSymbol(read, sslhandle, \"SSL_read\");\n\tvalid = valid && LoadSymbol(write, sslhandle, \"SSL_write\");\n\tvalid = valid && LoadSymbol(shutdown, sslhandle, \"SSL_shutdown\");\n\tvalid = valid && LoadSymbol(get_verify_result, sslhandle, \"SSL_get_verify_result\");\n\tvalid = valid && (LoadSymbol(get_peer_certificate, sslhandle, \"SSL_get1_peer_certificate\") ||\n\t\t\tLoadSymbol(get_peer_certificate, sslhandle, \"SSL_get_peer_certificate\"));\n\n\tvalid = valid && (\n\t\t\tLoadSymbol(SSLv23_method, sslhandle, \"TLS_client_method\") ||\n\t\t\tLoadSymbol(SSLv23_method, sslhandle, \"TLS_method\") ||\n\t\t\tLoadSymbol(SSLv23_method, sslhandle, \"SSLv23_method\"));\n\n\tvalid = valid && LoadSymbol(check_host, cryptohandle, \"X509_check_host\");\n\tvalid = valid && LoadSymbol(X509_free, cryptohandle, \"X509_free\");\n\n\tif (library_init)\n\t\tlibrary_init();\n\telse if(init_ssl)\n\t\tinit_ssl(0, nullptr);\n\t// else not valid\n}\n\nbool OpenSSLConnection::valid()\n{\n\treturn ssl.valid;\n}\n\nOpenSSLConnection::OpenSSLConnection()\n\t: conn(nullptr)\n{\n\tcontext = ssl.CTX_new(ssl.SSLv23_method());\n\tif (!context)\n\t\treturn;\n\n\tif (ssl.CTX_set_options)\n\t\tssl.CTX_set_options(context, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3);\n\telse\n\t\tssl.CTX_ctrl(context, SSL_CTRL_OPTIONS, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3, nullptr);\n\tssl.CTX_set_verify(context, SSL_VERIFY_PEER, nullptr);\n\tssl.CTX_set_default_verify_paths(context);\n}\n\nOpenSSLConnection::~OpenSSLConnection()\n{\n\tif (conn)\n\t\tssl.SSL_free(conn);\n\n\tif (context)\n\t\tssl.CTX_free(context);\n}\n\nbool OpenSSLConnection::connect(const std::string &hostname, uint16_t port)\n{\n\tif (!context)\n\t\treturn false;\n\n\tif (!socket.connect(hostname, port))\n\t\treturn false;\n\n\tconn = ssl.SSL_new(context);\n\tif (!conn)\n\t{\n\t\tsocket.close();\n\t\treturn false;\n\t}\n\n\tssl.set_fd(conn, socket.getFd());\n\tif (ssl.connect(conn) != 1 || ssl.get_verify_result(conn) != X509_V_OK)\n\t{\n\t\tsocket.close();\n\t\treturn false;\n\t}\n\n\tX509 *cert = ssl.get_peer_certificate(conn);\n\tif (ssl.check_host(cert, hostname.c_str(), hostname.size(), 0, nullptr) != 1)\n\t{\n\t\tclose();\n\t\treturn false;\n\t}\n\tssl.X509_free(cert);\n\n\treturn true;\n}\n\nsize_t OpenSSLConnection::read(char *buffer, size_t size)\n{\n\treturn ssl.read(conn, buffer, (int) size);\n}\n\nsize_t OpenSSLConnection::write(const char *buffer, size_t size)\n{\n\treturn ssl.write(conn, buffer, (int) size);\n}\n\nvoid OpenSSLConnection::close()\n{\n\tssl.shutdown(conn);\n\tsocket.close();\n}\n\nOpenSSLConnection::SSLFuncs OpenSSLConnection::ssl;\n\n#endif // HTTPS_BACKEND_OPENSSL\n"
  },
  {
    "path": "src/libraries/luahttps/src/generic/OpenSSLConnection.h",
    "content": "#pragma once\n\n#include \"../common/config.h\"\n\n#ifdef HTTPS_BACKEND_OPENSSL\n\n#include <openssl/ssl.h>\n\n#include \"../common/Connection.h\"\n#include \"../common/PlaintextConnection.h\"\n\nclass OpenSSLConnection : public Connection\n{\npublic:\n\tOpenSSLConnection();\n\tvirtual bool connect(const std::string &hostname, uint16_t port) override;\n\tvirtual size_t read(char *buffer, size_t size) override;\n\tvirtual size_t write(const char *buffer, size_t size) override;\n\tvirtual void close() override;\n\tvirtual ~OpenSSLConnection();\n\n\tstatic bool valid();\n\nprivate:\n\tPlaintextConnection socket;\n\tSSL_CTX *context;\n\tSSL *conn;\n\n\tstruct SSLFuncs\n\t{\n\t\tSSLFuncs();\n\t\tbool valid;\n\n\t\tint (*library_init)();\n\t\tint (*init_ssl)(uint64_t opts, const void *settings);\n\n\t\tSSL_CTX *(*CTX_new)(const SSL_METHOD *method);\n\t\tlong (*CTX_ctrl)(SSL_CTX *ctx, int cmd, long larg, void *parg);\n\t\tlong (*CTX_set_options)(SSL_CTX *ctx, long options);\n\t\tvoid (*CTX_set_verify)(SSL_CTX *ctx, int mode, void *verify_callback);\n\t\tint (*CTX_set_default_verify_paths)(SSL_CTX *ctx);\n\t\tvoid (*CTX_free)(SSL_CTX *ctx);\n\n\t\tSSL *(*SSL_new)(SSL_CTX *ctx);\n\t\tvoid (*SSL_free)(SSL *ctx);\n\t\tint (*set_fd)(SSL *ssl, int fd);\n\t\tint (*connect)(SSL *ssl);\n\t\tint (*read)(SSL *ssl, void *buf, int num);\n\t\tint (*write)(SSL *ssl, const void *buf, int num);\n\t\tint (*shutdown)(SSL *ssl);\n\t\tlong (*get_verify_result)(const SSL *ssl);\n\t\tX509 *(*get_peer_certificate)(const SSL *ssl);\n\n\t\tconst SSL_METHOD *(*SSLv23_method)();\n\n\t\tint (*check_host)(X509 *cert, const char *name, size_t namelen, unsigned int flags, char **peername);\n\t\tvoid (*X509_free)(X509* cert);\n\t};\n\tstatic SSLFuncs ssl;\n};\n\n#endif // HTTPS_BACKEND_OPENSSL\n"
  },
  {
    "path": "src/libraries/luahttps/src/generic/UnixLibraryLoader.cpp",
    "content": "#include \"../common/config.h\"\n#include \"../common/LibraryLoader.h\"\n\n#ifdef HTTPS_LIBRARY_LOADER_UNIX\n\n#include <dlfcn.h>\n\nnamespace LibraryLoader\n{\n\thandle *OpenLibrary(const char *name)\n\t{\n\t\treturn dlopen(name, RTLD_LAZY);\n\t}\n\n\tvoid CloseLibrary(handle *handle)\n\t{\n\t\tif (handle)\n\t\t\tdlclose(handle);\n\t}\n\n\thandle* GetCurrentProcessHandle()\n\t{\n\t\treturn RTLD_DEFAULT;\n\t}\n\n\tfunction *GetFunction(handle *handle, const char *name)\n\t{\n\t\treturn reinterpret_cast<function *>(dlsym(handle, name));\n\t}\n}\n\n#endif // HTTPS_LIBRARY_LOADER_UNIX\n\n"
  },
  {
    "path": "src/libraries/luahttps/src/lua/main.cpp",
    "content": "#include <algorithm>\n#include <set>\n\nextern \"C\"\n{\n#include <lua.h>\n#include <lauxlib.h>\n}\n\n#include \"../common/HTTPS.h\"\n#include \"../common/config.h\"\n\nstatic std::string validMethod[] = {\"GET\", \"HEAD\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"};\n\nstatic int str_toupper(char c)\n{\n\tunsigned char uc = (unsigned char) c;\n\treturn toupper(uc);\n}\n\nstatic std::string w_checkstring(lua_State *L, int idx)\n{\n\tsize_t len;\n\tconst char *str = luaL_checklstring(L, idx, &len);\n\treturn std::string(str, len);\n}\n\nstatic void w_pushstring(lua_State *L, const std::string &str)\n{\n\tlua_pushlstring(L, str.data(), str.size());\n}\n\nstatic void w_readheaders(lua_State *L, int idx, HTTPSClient::header_map &headers)\n{\n\tif (idx < 0)\n\t\tidx += lua_gettop(L) + 1;\n\n\tlua_pushnil(L);\n\twhile (lua_next(L, idx))\n\t{\n\t\tauto header = w_checkstring(L, -2);\n\t\theaders[header] = w_checkstring(L, -1);\n\t\tlua_pop(L, 1);\n\t}\n\tlua_pop(L, 1);\n}\n\nstatic std::string w_optmethod(lua_State *L, int idx, const std::string &defaultMethod)\n{\n\tstd::string *const validMethodEnd = validMethod + sizeof(validMethod) / sizeof(std::string);\n\n\tif (lua_isnoneornil(L, idx))\n\t\treturn defaultMethod;\n\n\tstd::string str = w_checkstring(L, idx);\n\tstd::transform(str.begin(), str.end(), str.begin(), str_toupper);\n\n\tif (std::find(validMethod, validMethodEnd, str) == validMethodEnd)\n\t\tluaL_argerror(L, idx, \"expected one of \\\"get\\\", \\\"head\\\", \\\"post\\\", \\\"put\\\", \\\"delete\\\", or \\\"patch\\\"\");\n\n\treturn str;\n}\n\nstatic int w_request(lua_State *L)\n{\n\tauto url = w_checkstring(L, 1);\n\tHTTPSClient::Request req(url);\n\n\tbool advanced = false;\n\n\tif (lua_istable(L, 2))\n\t{\n\t\tadvanced = true;\n\n\t\tstd::string defaultMethod = \"GET\";\n\n\t\tlua_getfield(L, 2, \"data\");\n\t\tif (!lua_isnoneornil(L, -1))\n\t\t{\n\t\t\treq.postdata = w_checkstring(L, -1);\n\t\t\treq.headers[\"Content-Type\"] = \"application/x-www-form-urlencoded\";\n\t\t\tdefaultMethod = \"POST\";\n\t\t}\n\t\tlua_pop(L, 1);\n\n\t\tlua_getfield(L, 2, \"method\");\n\t\treq.method = w_optmethod(L, -1, defaultMethod);\n\t\tlua_pop(L, 1);\n\n\t\tlua_getfield(L, 2, \"headers\");\n\t\tif (!lua_isnoneornil(L, -1))\n\t\t\tw_readheaders(L, -1, req.headers);\n\t\tlua_pop(L, 1);\n\t}\n\n\tHTTPSClient::Reply reply;\n\n\ttry\n\t{\n\t\treply = request(req);\n\t}\n\tcatch (const std::exception& e)\n\t{\n\t\tstd::string errorMessage = e.what();\n\t\tlua_pushnil(L);\n\t\tlua_pushstring(L, errorMessage.c_str());\n\t\treturn 2;\n\t}\n\n\tlua_pushinteger(L, reply.responseCode);\n\tw_pushstring(L, reply.body);\n\n\tif (advanced)\n\t{\n\t\tlua_newtable(L);\n\t\tfor (const auto &header : reply.headers)\n\t\t{\n\t\t\tw_pushstring(L, header.first);\n\t\t\tw_pushstring(L, header.second);\n\t\t\tlua_settable(L, -3);\n\t\t}\n\t}\n\n\treturn advanced ? 3 : 2;\n}\n\nextern \"C\" int HTTPS_DLLEXPORT luaopen_https(lua_State *L)\n{\n\tlua_newtable(L);\n\n\tlua_pushcfunction(L, w_request);\n\tlua_setfield(L, -2, \"request\");\n\n\treturn 1;\n}\n"
  },
  {
    "path": "src/libraries/luahttps/src/windows/SChannelConnection.cpp",
    "content": "#define SECURITY_WIN32\n#define NOMINMAX\n\n#include \"SChannelConnection.h\"\n\n#ifdef HTTPS_BACKEND_SCHANNEL\n\n#include <windows.h>\n#include <security.h>\n#include <schnlsp.h>\n#include <assert.h>\n#include <algorithm>\n#include <memory>\n#include <array>\n\n#ifndef SCH_USE_STRONG_CRYPTO\n#\tdefine SCH_USE_STRONG_CRYPTO 0x00400000\n#endif\n#ifndef SP_PROT_TLS1_1_CLIENT\n#\tdefine SP_PROT_TLS1_1_CLIENT 0x00000200\n#endif\n#ifndef SP_PROT_TLS1_2_CLIENT\n#\tdefine SP_PROT_TLS1_2_CLIENT 0x00000800\n#endif\n\n#ifdef DEBUG_SCHANNEL\n#include <iostream>\nstd::ostream &debug = std::cout;\n#else\nstruct Debug\n{\n\ttemplate<typename T>\n\tDebug &operator<<(const T&) { return *this; }\n} debug;\n#endif\n\nstatic void enqueue(std::vector<char> &buffer, char *data, size_t size)\n{\n\tsize_t oldSize = buffer.size();\n\tbuffer.resize(oldSize + size);\n\tmemcpy(&buffer[oldSize], data, size);\n}\n\nstatic void enqueue_prepend(std::vector<char> &buffer, char *data, size_t size)\n{\n\tsize_t oldSize = buffer.size();\n\tbuffer.resize(oldSize + size);\n\tif (oldSize > 0)\n\t\tmemmove(&buffer[size], &buffer[0], oldSize);\n\tmemcpy(&buffer[0], data, size);\n}\n\nstatic size_t dequeue(std::vector<char> &buffer, char *data, size_t size)\n{\n\tsize = std::min(size, buffer.size());\n\tsize_t remaining = buffer.size() - size;\n\n\tmemcpy(data, &buffer[0], size);\n\n\tif (remaining > 0)\n\t{\n\t\tmemmove(&buffer[0], &buffer[size], remaining);\n\t\tbuffer.resize(remaining);\n\t}\n\telse\n\t{\n\t\tbuffer.resize(0);\n\t}\n\n\treturn size;\n}\n\nSChannelConnection::SChannelConnection()\n\t: context(nullptr)\n{\n}\n\nSChannelConnection::~SChannelConnection()\n{\n\tdestroyContext();\n}\n\nSECURITY_STATUS InitializeSecurityContext(CredHandle *phCredential, std::unique_ptr<CtxtHandle>& phContext, const std::string& szTargetName, ULONG fContextReq, std::vector<char>& inputBuffer, std::vector<char>& outputBuffer, ULONG *pfContextAttr)\n{\n\tstd::array<SecBuffer, 1> recvBuffers;\n\trecvBuffers[0].BufferType = SECBUFFER_TOKEN;\n\trecvBuffers[0].pvBuffer = outputBuffer.data();\n\trecvBuffers[0].cbBuffer = outputBuffer.size();\n\n\tstd::array<SecBuffer, 2> sendBuffers;\n\tsendBuffers[0].BufferType = SECBUFFER_TOKEN;\n\tsendBuffers[0].pvBuffer = inputBuffer.data();\n\tsendBuffers[0].cbBuffer = inputBuffer.size();\n\tsendBuffers[1].BufferType = SECBUFFER_EMPTY;\n\tsendBuffers[1].pvBuffer = nullptr;\n\tsendBuffers[1].cbBuffer = 0;\n\n\tSecBufferDesc recvBufferDesc, sendBufferDesc;\n\trecvBufferDesc.ulVersion = sendBufferDesc.ulVersion = SECBUFFER_VERSION;\n\trecvBufferDesc.pBuffers = &recvBuffers[0];\n\trecvBufferDesc.cBuffers = recvBuffers.size();\n\n\tif (!inputBuffer.empty())\n\t{\n\t\tsendBufferDesc.pBuffers = &sendBuffers[0];\n\t\tsendBufferDesc.cBuffers = sendBuffers.size();\n\t}\n\telse\n\t{\n\t\tsendBufferDesc.pBuffers = nullptr;\n\t\tsendBufferDesc.cBuffers = 0;\n\t}\n\n\tCtxtHandle* phOldContext = nullptr;\n\tCtxtHandle* phNewContext = nullptr;\n\tif (!phContext)\n\t{\n\t\tphContext = std::make_unique<CtxtHandle>();\n\t\tphNewContext = phContext.get();\n\t}\n\telse\n\t{\n\t\tphOldContext = phContext.get();\n\t}\n\n\tauto ret = InitializeSecurityContext(phCredential, phOldContext, const_cast<char*>(szTargetName.c_str()), fContextReq, 0, 0, &sendBufferDesc, 0, phNewContext, &recvBufferDesc, pfContextAttr, nullptr);\n\n\toutputBuffer.resize(recvBuffers[0].cbBuffer);\n\n\t// Clear the input buffer, so the reader can append\n\t// If we have unprocessed data, leave it in the buffer\n\tsize_t unprocessed = 0;\n\tif (sendBuffers[1].BufferType == SECBUFFER_EXTRA)\n\t\tunprocessed = sendBuffers[1].cbBuffer;\n\n\tif (unprocessed > 0)\n\t\tmemmove(inputBuffer.data(), inputBuffer.data() + inputBuffer.size() - unprocessed, unprocessed);\n\n\tinputBuffer.resize(unprocessed);\n\n\treturn ret;\n}\n\nbool SChannelConnection::connect(const std::string &hostname, uint16_t port)\n{\n\tdebug << \"Trying to connect to \" << hostname << \":\" << port << \"\\n\";\n\tif (!socket.connect(hostname, port))\n\t\treturn false;\n\tdebug << \"Connected\\n\";\n\n\tSCHANNEL_CRED cred;\n\tmemset(&cred, 0, sizeof(cred));\n\n\tcred.dwVersion = SCHANNEL_CRED_VERSION;\n\tcred.grbitEnabledProtocols = SP_PROT_TLS1_CLIENT | SP_PROT_TLS1_1_CLIENT | SP_PROT_TLS1_2_CLIENT;\n\tcred.dwFlags = SCH_CRED_AUTO_CRED_VALIDATION | SCH_CRED_NO_DEFAULT_CREDS | SCH_USE_STRONG_CRYPTO | SCH_CRED_REVOCATION_CHECK_CHAIN;\n\n\tCredHandle credHandle;\n\tif (AcquireCredentialsHandle(nullptr, (char*) UNISP_NAME, SECPKG_CRED_OUTBOUND, nullptr, &cred, nullptr, nullptr, &credHandle, nullptr) != SEC_E_OK)\n\t{\n\t\tdebug << \"Failed to acquire handle\\n\";\n\t\tsocket.close();\n\t\treturn false;\n\t}\n\tdebug << \"Acquired handle\\n\";\n\n\n\tstatic constexpr size_t bufferSize = 8192;\n\tbool done = false, success = false, contextCreated = false;\n\n\tULONG contextAttr;\n\tstd::unique_ptr<CtxtHandle> context;\n\tstd::vector<char> inputBuffer;\n\tstd::vector<char> outputBuffer;\n\n\tdo\n\t{\n\t\toutputBuffer.resize(bufferSize);\n\n\t\tbool recvData = false;\n\t\tbool sendData = false;\n\t\tauto ret = InitializeSecurityContext(&credHandle, context, hostname, ISC_REQ_STREAM, inputBuffer, outputBuffer, &contextAttr);\n\t\tswitch (ret)\n\t\t{\n\t\t/*case SEC_I_COMPLETE_NEEDED:\n\t\tcase SEC_I_COMPLETE_AND_CONTINUE:\n\t\t\tif (CompleteAuthToken(context.get(), &outputBuffer) != SEC_E_OK)\n\t\t\t\tdone = true;\n\t\t\telse if (ret == SEC_I_COMPLETE_NEEDED)\n\t\t\t\tsuccess = done = true;\n\t\t\tbreak;*/\n\t\tcase SEC_I_CONTINUE_NEEDED:\n\t\t\tdebug << \"Initialize: continue needed\\n\";\n\t\t\trecvData = true;\n\t\t\tsendData = true;\n\t\t\tbreak;\n\t\tcase SEC_E_INCOMPLETE_CREDENTIALS:\n\t\t\tdebug << \"Initialize failed: incomplete credentials\\n\";\n\t\t\tdone = true;\n\t\t\tbreak;\n\t\tcase SEC_E_INCOMPLETE_MESSAGE:\n\t\t\tdebug << \"Initialize: incomplete message\\n\";\n\t\t\trecvData = true;\n\t\t\tbreak;\n\t\tcase SEC_E_OK:\n\t\t\tdebug << \"Initialize succeeded\\n\";\n\t\t\tsuccess = done = true;\n\t\t\tsendData = true;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tdebug << \"Initialize done: \" << outputBuffer.size() << \" bytes of output and unknown status \" << ret << \"\\n\";\n\t\t\tdone = true;\n\t\t\tsuccess = false;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (!done)\n\t\t\tcontextCreated = true;\n\n\t\tif (sendData && !outputBuffer.empty())\n\t\t{\n\t\t\tsocket.write(outputBuffer.data(), outputBuffer.size());\n\t\t\tdebug << \"Sent \" << outputBuffer.size() << \" bytes of data\\n\";\n\t\t}\n\n\t\tif (recvData)\n\t\t{\n\t\t\tsize_t unprocessed = inputBuffer.size();\n\t\t\tinputBuffer.resize(unprocessed + bufferSize);\n\t\t\tsize_t actual = socket.read(inputBuffer.data() + unprocessed, bufferSize);\n\t\t\tinputBuffer.resize(actual + unprocessed);\n\n\t\t\tdebug << \"Received \" << actual << \" bytes of data\\n\";\n\t\t\tif (unprocessed > 0)\n\t\t\t\tdebug << \"  had \" << unprocessed << \" bytes of remaining, unprocessed data\\n\";\n\n\t\t\tif (actual + unprocessed == 0)\n\t\t\t{\n\t\t\t\tdebug << \"No data to submit, break\\n\";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} while (!done);\n\n\tdebug << \"Done!\\n\";\n\n\tif (success)\n\t{\n\t\tSecPkgContext_Flags resultFlags;\n\t\tQueryContextAttributes(context.get(), SECPKG_ATTR_FLAGS, &resultFlags);\n\t\tif (resultFlags.Flags & ISC_REQ_CONFIDENTIALITY == 0)\n\t\t{\n\t\t\tdebug << \"Resulting context is not encrypted, marking as failed\\n\";\n\t\t\tsuccess = false;\n\t\t}\n\t\tif (resultFlags.Flags & ISC_REQ_INTEGRITY == 0)\n\t\t{\n\t\t\tdebug << \"Resulting context is not signed, marking as failed\\n\";\n\t\t\tsuccess = false;\n\t\t}\n\t}\n\n\tif (success)\n\t\tthis->context = context.release();\n\telse if (contextCreated)\n\t\tDeleteSecurityContext(context.get());\n\n\treturn success;\n}\n\nsize_t SChannelConnection::read(char *buffer, size_t size)\n{\n\tif (decRecvBuffer.size() > 0)\n\t{\n\t\tsize = dequeue(decRecvBuffer, buffer, size);\n\t\tdebug << \"Read \" << size << \" bytes of previously decoded data\\n\";\n\t\treturn size;\n\t}\n\telse if (encRecvBuffer.size() > 0)\n\t{\n\t\tsize = dequeue(encRecvBuffer, buffer, size);\n\t\tdebug << \"Read \" << size << \" bytes of extra data\\n\";\n\t}\n\telse\n\t{\n\t\tsize = socket.read(buffer, size);\n\t\tdebug << \"Received \" << size << \" bytes of data\\n\";\n\t}\n\n\treturn decrypt(buffer, size);\n}\n\nsize_t SChannelConnection::decrypt(char *buffer, size_t size, bool recurse)\n{\n\tif (size == 0)\n\t\treturn 0;\n\n\tSecBuffer secBuffers[4];\n\tsecBuffers[0].cbBuffer = size;\n\tsecBuffers[0].BufferType = SECBUFFER_DATA;\n\tsecBuffers[0].pvBuffer = buffer;\n\n\tfor (size_t i = 1; i < 4; ++i)\n\t{\n\t\tsecBuffers[i].BufferType = SECBUFFER_EMPTY;\n\t\tsecBuffers[i].pvBuffer = nullptr;\n\t\tsecBuffers[i].cbBuffer = 0;\n\t}\n\n\tSecBufferDesc secBufferDesc;\n\tsecBufferDesc.ulVersion = SECBUFFER_VERSION;\n\tsecBufferDesc.cBuffers = 4;\n\tsecBufferDesc.pBuffers = &secBuffers[0];\n\n\tauto ret = DecryptMessage(static_cast<CtxtHandle*>(context), &secBufferDesc, 0, nullptr); // FIXME\n\tdebug << \"DecryptMessage returns: \" << ret << \"\\n\";\n\tswitch (ret)\n\t{\n\tcase SEC_E_OK:\n\t{\n\t\tvoid *actualDataStart = buffer;\n\t\tfor (size_t i = 0; i < 4; ++i)\n\t\t{\n\t\t\tauto &buffer = secBuffers[i];\n\t\t\tif (buffer.BufferType == SECBUFFER_DATA)\n\t\t\t{\n\t\t\t\tactualDataStart = buffer.pvBuffer;\n\t\t\t\tsize = buffer.cbBuffer;\n\t\t\t}\n\t\t\telse if (buffer.BufferType == SECBUFFER_EXTRA)\n\t\t\t{\n\t\t\t\tdebug << \"\\tExtra data in buffer \" << i << \" (\" << buffer.cbBuffer << \" bytes)\\n\";\n\t\t\t\tenqueue(encRecvBuffer, static_cast<char*>(buffer.pvBuffer), buffer.cbBuffer);\n\t\t\t}\n\t\t\telse if (buffer.BufferType != SECBUFFER_EMPTY)\n\t\t\t\tdebug << \"\\tBuffer of type \" << buffer.BufferType << \"\\n\";\n\t\t}\n\n\t\tif (actualDataStart)\n\t\t\tmemmove(buffer, actualDataStart, size);\n\n\t\tbreak;\n\t}\n\tcase SEC_E_INCOMPLETE_MESSAGE:\n\t{\n\t\t// Move all our current data to encRecvBuffer\n\t\tenqueue(encRecvBuffer, buffer, size);\n\n\t\t// Now try to read some more data from the socket\n\t\tsize_t bufferSize = encRecvBuffer.size() + 8192;\n\t\tchar *recvBuffer = new char[bufferSize];\n\t\tsize_t recvd = socket.read(recvBuffer+encRecvBuffer.size(), 8192);\n\t\tdebug << recvd << \" bytes of extra data read from socket\\n\";\n\n\t\tif (recvd == 0 && !recurse)\n\t\t{\n\t\t\tdebug << \"Recursion prevented, bailing\\n\";\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Fill our buffer with the queued data and the newly received data\n\t\tsize_t totalSize = encRecvBuffer.size() + recvd;\n\t\tdequeue(encRecvBuffer, recvBuffer, encRecvBuffer.size());\n\t\tdebug << \"Trying to decrypt with \" << totalSize << \" bytes of data\\n\";\n\n\t\t// Now try to decrypt that\n\t\tsize_t decrypted = decrypt(recvBuffer, totalSize, false);\n\t\tdebug << \"\\tObtained \" << decrypted << \" bytes of decrypted data\\n\";\n\n\t\t// Copy the first size bytes to the output buffer\n\t\tsize = std::min(size, decrypted);\n\t\tmemcpy(buffer, recvBuffer, size);\n\n\t\t// And write the remainder to our queued decrypted data...\n\t\t// Note: we prepend, since our recursive call may already have written\n\t\t// something and we can be sure decrypt wasn't called if the buffer was\n\t\t// non-empty in read\n\t\tenqueue_prepend(decRecvBuffer, recvBuffer+size, decrypted-size);\n\t\tdebug << \"\\tStoring \" << decrypted-size << \" bytes of extra decrypted data\\n\";\n\t\treturn size;\n\t}\n\t// TODO: More?\n\tdefault:\n\t\tsize = 0;\n\t\tbreak;\n\t}\n\n\tdebug << \"\\tDecrypted \" << size << \" bytes of data\\n\";\n\n\treturn size;\n}\n\nsize_t SChannelConnection::write(const char *buffer, size_t size)\n{\n\tstatic constexpr size_t bufferSize = 8192;\n\tassert(size <= bufferSize);\n\n\tSecPkgContext_StreamSizes Sizes;\n\tQueryContextAttributes(\n            static_cast<CtxtHandle*>(context),\n            SECPKG_ATTR_STREAM_SIZES,\n            &Sizes);\n\tdebug << \"stream sizes:\\n\\theader: \" << Sizes.cbHeader << \"\\n\\tfooter: \" << Sizes.cbTrailer << \"\\n\";\n\n\tchar *sendBuffer = new char[bufferSize + Sizes.cbHeader + Sizes.cbTrailer];\n\tmemcpy(sendBuffer+Sizes.cbHeader, buffer, size);\n\n\tSecBuffer secBuffers[4];\n\tsecBuffers[0].cbBuffer = Sizes.cbHeader;\n\tsecBuffers[0].BufferType = SECBUFFER_STREAM_HEADER;\n\tsecBuffers[0].pvBuffer = sendBuffer;\n\n\tsecBuffers[1].cbBuffer = size;\n\tsecBuffers[1].BufferType = SECBUFFER_DATA;\n\tsecBuffers[1].pvBuffer = sendBuffer+Sizes.cbHeader;\n\n\tsecBuffers[2].cbBuffer = Sizes.cbTrailer;\n\tsecBuffers[2].pvBuffer = sendBuffer+Sizes.cbHeader+size;\n\tsecBuffers[2].BufferType = SECBUFFER_STREAM_TRAILER;\n\n\tsecBuffers[3].cbBuffer = 0;\n\tsecBuffers[3].BufferType = SECBUFFER_EMPTY;\n\tsecBuffers[3].pvBuffer = nullptr;\n\n\tSecBufferDesc secBufferDesc;\n\tsecBufferDesc.ulVersion = SECBUFFER_VERSION;\n\tsecBufferDesc.cBuffers = 4;\n\tsecBufferDesc.pBuffers = secBuffers;\n\n\tauto ret = EncryptMessage(static_cast<CtxtHandle*>(context), 0, &secBufferDesc, 0); // FIXME\n\tdebug << \"Send:\\n\\tHeader size: \" << secBuffers[0].cbBuffer << \"\\n\\t\\ttype: \" << secBuffers[0].BufferType << \"\\n\\tData size: \" << secBuffers[1].cbBuffer << \"\\n\\t\\ttype: \" << secBuffers[1].BufferType << \"\\n\\tFooter size: \" << secBuffers[2].cbBuffer << \"\\n\\t\\ttype: \" << secBuffers[2].BufferType << \"\\n\";\n\n\tsize_t sendSize = 0;\n\tfor (size_t i = 0; i < 4; ++i)\n\t\tif (secBuffers[i].cbBuffer != bufferSize)\n\t\t\tsendSize += secBuffers[i].cbBuffer;\n\n\tdebug << \"\\tReal length? \" << sendSize << \"\\n\";\n\tswitch (ret)\n\t{\n\tcase SEC_E_OK:\n\t\tsocket.write(sendBuffer, sendSize);\n\t\tbreak;\n\t// TODO: More?\n\tdefault:\n\t\tsize = 0;\n\t\tbreak;\n\t}\n\n\tdelete[] sendBuffer;\n\treturn size;\n}\n\nvoid SChannelConnection::destroyContext()\n{\n\tif (context)\n\t{\n\t\tDeleteSecurityContext(context);\n\t\tdelete context;\n\t\tcontext = nullptr;\n\t}\n}\n\nvoid SChannelConnection::close()\n{\n\tdestroyContext();\n\tsocket.close();\n}\n\nbool SChannelConnection::valid()\n{\n\treturn true;\n}\n\n#endif // HTTPS_BACKEND_SCHANNEL\n"
  },
  {
    "path": "src/libraries/luahttps/src/windows/SChannelConnection.h",
    "content": "#pragma once\n\n#include \"../common/config.h\"\n\n#ifdef HTTPS_BACKEND_SCHANNEL\n\n#include \"../common/Connection.h\"\n#include \"../common/PlaintextConnection.h\"\n\n#include <vector>\n\nstruct _SecHandle;\nusing CtxtHandle = _SecHandle;\n\nclass SChannelConnection : public Connection\n{\npublic:\n\tSChannelConnection();\n\tvirtual bool connect(const std::string &hostname, uint16_t port) override;\n\tvirtual size_t read(char *buffer, size_t size) override;\n\tvirtual size_t write(const char *buffer, size_t size) override;\n\tvirtual void close() override;\n\tvirtual ~SChannelConnection();\n\n\tstatic bool valid();\n\nprivate:\n\tPlaintextConnection socket;\n\tCtxtHandle *context;\n\tstd::vector<char> encRecvBuffer;\n\tstd::vector<char> decRecvBuffer;\n\n\tsize_t decrypt(char *buffer, size_t size, bool recurse = true);\n\tvoid destroyContext();\n};\n\n#endif // HTTPS_BACKEND_SCHANNEL\n"
  },
  {
    "path": "src/libraries/luahttps/src/windows/WinINetClient.cpp",
    "content": "#include \"WinINetClient.h\"\n\n#ifdef HTTPS_BACKEND_WININET\n\n#include <algorithm>\n#include <stdexcept>\n#include <sstream>\n#include <vector>\n\n#include <Windows.h>\n#include <wininet.h>\n\n#include \"../common/HTTPRequest.h\"\n\nclass LazyHInternetLoader final\n{\npublic:\n\tLazyHInternetLoader(): hInternet(nullptr) { }\n\t~LazyHInternetLoader()\n\t{\n\t\tif (hInternet)\n\t\t\tInternetCloseHandle(hInternet);\n\t}\n\n\tHINTERNET getInstance()\n\t{\n\t\tif (!init)\n\t\t{\n\t\t\thInternet = InternetOpenA(\"\", INTERNET_OPEN_TYPE_PRECONFIG, nullptr, nullptr, 0);\n\t\t\tif (hInternet)\n\t\t\t{\n\t\t\t\t// Try to enable HTTP2\n\t\t\t\tDWORD httpProtocol = HTTP_PROTOCOL_FLAG_HTTP2;\n\t\t\t\tInternetSetOptionA(hInternet, INTERNET_OPTION_ENABLE_HTTP_PROTOCOL, &httpProtocol, sizeof(DWORD));\n\t\t\t\tSetLastError(0); // If it errors, ignore.\n\t\t\t}\n\t\t}\n\n\t\treturn hInternet;\n\t}\n\nprivate:\n\tbool init;\n\tHINTERNET hInternet;\n};\n\nstatic thread_local LazyHInternetLoader hInternetCache;\n\nbool WinINetClient::valid() const\n{\n\t// Allow disablement of WinINet backend.\n\tconst char *disabler = getenv(\"LUAHTTPS_DISABLE_WININET\");\n\tif (disabler && strcmp(disabler, \"1\") == 0)\n\t\treturn false;\n\n\treturn hInternetCache.getInstance() != nullptr;\n}\n\nHTTPSClient::Reply WinINetClient::request(const HTTPSClient::Request &req)\n{\n\tReply reply;\n\treply.responseCode = 0;\n\n\t// Parse URL\n\tauto parsedUrl = HTTPRequest::parseUrl(req.url);\n\n\t// Default flags\n\tDWORD inetFlags =\n\t\tINTERNET_FLAG_NO_AUTH |\n\t\tINTERNET_FLAG_NO_CACHE_WRITE |\n\t\tINTERNET_FLAG_NO_COOKIES |\n\t\tINTERNET_FLAG_NO_UI;\n\n\tif (parsedUrl.schema == \"https\")\n\t\tinetFlags |= INTERNET_FLAG_SECURE;\n\telse if (parsedUrl.schema != \"http\")\n\t\treturn reply;\n\n\t// Keep-Alive\n\tauto connectHeader = req.headers.find(\"Connection\");\n\tauto headerEnd = req.headers.end();\n\tif ((connectHeader != headerEnd && connectHeader->second != \"close\") || connectHeader == headerEnd)\n\t\tinetFlags |= INTERNET_FLAG_KEEP_CONNECTION;\n\n\t// Open internet\n\tHINTERNET hInternet = hInternetCache.getInstance();\n\tif (hInternet == nullptr)\n\t\treturn reply;\n\n\t// Connect\n\tHINTERNET hConnect = InternetConnectA(\n\t\thInternet,\n\t\tparsedUrl.hostname.c_str(),\n\t\tparsedUrl.port,\n\t\tnullptr, nullptr,\n\t\tINTERNET_SERVICE_HTTP,\n\t\tINTERNET_FLAG_EXISTING_CONNECT,\n\t\t(DWORD_PTR) this\n\t);\n\tif (!hConnect)\n\t\treturn reply;\n\n\tstd::string httpMethod = req.method;\n\tstd::transform(\n\t\thttpMethod.begin(),\n\t\thttpMethod.end(),\n\t\thttpMethod.begin(),\n\t\t[](char c) {return (char)toupper((unsigned char) c); }\n\t);\n\n\t// Open HTTP request\n\tHINTERNET hHTTP = HttpOpenRequestA(\n\t\thConnect,\n\t\thttpMethod.c_str(),\n\t\tparsedUrl.query.c_str(),\n\t\tnullptr,\n\t\tnullptr,\n\t\tnullptr,\n\t\tinetFlags,\n\t\t(DWORD_PTR) this\n\t);\n\tif (!hHTTP)\n\t{\n\t\tInternetCloseHandle(hConnect);\n\t\treturn reply;\n\t}\n\n\t// Send additional headers\n\tHttpAddRequestHeadersA(hHTTP, \"User-Agent:\", 0, HTTP_ADDREQ_FLAG_REPLACE);\n\tfor (const auto &header: req.headers)\n\t{\n\t\tstd::string headerString = header.first + \": \" + header.second + \"\\r\\n\";\n\t\tHttpAddRequestHeadersA(hHTTP, headerString.c_str(), headerString.length(), HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE);\n\t}\n\n\t// POST data\n\tconst char *postData = nullptr;\n\tif (req.postdata.length() > 0 && (httpMethod != \"GET\" && httpMethod != \"HEAD\"))\n\t{\n\t\tchar temp[48];\n\t\tint len = sprintf(temp, \"Content-Length: %u\\r\\n\", (unsigned int) req.postdata.length());\n\t\tpostData = req.postdata.c_str();\n\n\t\tHttpAddRequestHeadersA(hHTTP, temp, len, HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE);\n\t}\n\n\t// Send away!\n\tBOOL result = HttpSendRequestA(hHTTP, nullptr, 0, (void *) postData, (DWORD) req.postdata.length());\n\tif (!result)\n\t{\n\t\tInternetCloseHandle(hHTTP);\n\t\tInternetCloseHandle(hConnect);\n\t\treturn reply;\n\t}\n\n\tDWORD bufferLength = sizeof(DWORD);\n\tDWORD headerCounter = 0;\n\n\t// Status code\n\tDWORD statusCode = 0;\n\tif (!HttpQueryInfoA(hHTTP, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &statusCode, &bufferLength, &headerCounter))\n\t{\n\t\tInternetCloseHandle(hHTTP);\n\t\tInternetCloseHandle(hConnect);\n\t\treturn reply;\n\t}\n\n\t// Query headers\n\tstd::vector<char> responseHeaders;\n\tbufferLength = 0;\n\tHttpQueryInfoA(hHTTP, HTTP_QUERY_RAW_HEADERS, responseHeaders.data(), &bufferLength, &headerCounter);\n\tif (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\n\t{\n\t\tInternetCloseHandle(hHTTP);\n\t\tInternetCloseHandle(hConnect);\n\t\treturn reply;\n\t}\n\n\tresponseHeaders.resize(bufferLength);\n\tif (!HttpQueryInfoA(hHTTP, HTTP_QUERY_RAW_HEADERS, responseHeaders.data(), &bufferLength, &headerCounter))\n\t{\n\t\tInternetCloseHandle(hHTTP);\n\t\tInternetCloseHandle(hConnect);\n\t\treturn reply;\n\t}\n\n\tfor (const char *headerData = responseHeaders.data(); *headerData; headerData += strlen(headerData) + 1)\n\t{\n\t\tconst char *value = strchr(headerData, ':');\n\t\tif (value)\n\t\t{\n\t\t\tptrdiff_t keyLen = (ptrdiff_t) (value - headerData);\n\t\t\treply.headers[std::string(headerData, keyLen)] = value + 2; // +2, colon and 1 space character.\n\t\t}\n\t}\n\tresponseHeaders.resize(1);\n\n\t// Read response\n\tstd::stringstream responseData;\n\tfor (;;)\n\t{\n\t\tconstexpr DWORD BUFFER_SIZE = 4096;\n\t\tchar buffer[BUFFER_SIZE];\n\t\tDWORD readed = 0;\n\n\t\tBOOL ret = InternetQueryDataAvailable(hHTTP, &readed, 0, 0);\n\t\tif (!ret || readed == 0)\n\t\t\tbreak;\n\n\t\tif (!InternetReadFile(hHTTP, buffer, BUFFER_SIZE, &readed))\n\t\t\tbreak;\n\n\t\tresponseData.write(buffer, readed);\n\t}\n\n\treply.body = responseData.str();\n\treply.responseCode = statusCode;\n\n\tInternetCloseHandle(hHTTP);\n\tInternetCloseHandle(hConnect);\n\treturn reply;\n}\n\n#endif // HTTPS_BACKEND_WININET\n"
  },
  {
    "path": "src/libraries/luahttps/src/windows/WinINetClient.h",
    "content": "#pragma once\n\n#include \"../common/config.h\"\n\n#ifdef HTTPS_BACKEND_WININET\n\n#include \"../common/HTTPSClient.h\"\n\nclass WinINetClient: public HTTPSClient\n{\npublic:\n\tbool valid() const override;\n\tHTTPSClient::Reply request(const HTTPSClient::Request &req) override;\n};\n\n#endif // HTTPS_BACKEND_WININET\n"
  },
  {
    "path": "src/libraries/luahttps/src/windows/WindowsLibraryLoader.cpp",
    "content": "#include \"../common/config.h\"\n#include \"../common/LibraryLoader.h\"\n\n#ifdef HTTPS_LIBRARY_LOADER_WINDOWS\n#define NOMINMAX\n#define WIN32_LEAN_AND_MEAN\n\n#include <windows.h>\n\nnamespace LibraryLoader\n{\n\thandle *OpenLibrary(const char *name)\n\t{\n\t\treturn reinterpret_cast<handle *>(LoadLibraryA(name));\n\t}\n\n\tvoid CloseLibrary(handle *handle)\n\t{\n\t\tif (handle)\n\t\t\tFreeLibrary(reinterpret_cast<HMODULE>(handle));\n\t}\n\n\thandle* GetCurrentProcessHandle()\n\t{\n\t\treturn reinterpret_cast<handle *>(GetModuleHandle(nullptr));\n\t}\n\n\tfunction *GetFunction(handle *handle, const char *name)\n\t{\n\t\tHMODULE nativeHandle = reinterpret_cast<HMODULE>(handle);\n\t\treturn reinterpret_cast<function *>(GetProcAddress(nativeHandle, name));\n\t}\n}\n\n#endif // HTTPS_LIBRARY_LOADER_WINDOWS\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/auxiliar.c",
    "content": "/*=========================================================================*\\\n* Auxiliar routines for class hierarchy manipulation\n* LuaSocket toolkit\n\\*=========================================================================*/\n#include \"luasocket.h\"\n#include \"auxiliar.h\"\n#include <string.h>\n#include <stdio.h>\n\n/*-------------------------------------------------------------------------*\\\n* Initializes the module\n\\*-------------------------------------------------------------------------*/\nint auxiliar_open(lua_State *L) {\n    (void) L;\n    return 0;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Creates a new class with given methods\n* Methods whose names start with __ are passed directly to the metatable.\n\\*-------------------------------------------------------------------------*/\nvoid auxiliar_newclass(lua_State *L, const char *classname, luaL_Reg *func) {\n    luaL_newmetatable(L, classname); /* mt */\n    /* create __index table to place methods */\n    lua_pushstring(L, \"__index\");    /* mt,\"__index\" */\n    lua_newtable(L);                 /* mt,\"__index\",it */\n    /* put class name into class metatable */\n    lua_pushstring(L, \"class\");      /* mt,\"__index\",it,\"class\" */\n    lua_pushstring(L, classname);    /* mt,\"__index\",it,\"class\",classname */\n    lua_rawset(L, -3);               /* mt,\"__index\",it */\n    /* pass all methods that start with _ to the metatable, and all others\n     * to the index table */\n    for (; func->name; func++) {     /* mt,\"__index\",it */\n        lua_pushstring(L, func->name);\n        lua_pushcfunction(L, func->func);\n        lua_rawset(L, func->name[0] == '_' ? -5: -3);\n    }\n    lua_rawset(L, -3);               /* mt */\n    lua_pop(L, 1);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Prints the value of a class in a nice way\n\\*-------------------------------------------------------------------------*/\nint auxiliar_tostring(lua_State *L) {\n    char buf[32];\n    if (!lua_getmetatable(L, 1)) goto error;\n    lua_pushstring(L, \"__index\");\n    lua_gettable(L, -2);\n    if (!lua_istable(L, -1)) goto error;\n    lua_pushstring(L, \"class\");\n    lua_gettable(L, -2);\n    if (!lua_isstring(L, -1)) goto error;\n    sprintf(buf, \"%p\", lua_touserdata(L, 1));\n    lua_pushfstring(L, \"%s: %s\", lua_tostring(L, -1), buf);\n    return 1;\nerror:\n    lua_pushstring(L, \"invalid object passed to 'auxiliar.c:__tostring'\");\n    lua_error(L);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Insert class into group\n\\*-------------------------------------------------------------------------*/\nvoid auxiliar_add2group(lua_State *L, const char *classname, const char *groupname) {\n    luaL_getmetatable(L, classname);\n    lua_pushstring(L, groupname);\n    lua_pushboolean(L, 1);\n    lua_rawset(L, -3);\n    lua_pop(L, 1);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Make sure argument is a boolean\n\\*-------------------------------------------------------------------------*/\nint auxiliar_checkboolean(lua_State *L, int objidx) {\n    if (!lua_isboolean(L, objidx))\n        auxiliar_typeerror(L, objidx, lua_typename(L, LUA_TBOOLEAN));\n    return lua_toboolean(L, objidx);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Return userdata pointer if object belongs to a given class, abort with\n* error otherwise\n\\*-------------------------------------------------------------------------*/\nvoid *auxiliar_checkclass(lua_State *L, const char *classname, int objidx) {\n    void *data = auxiliar_getclassudata(L, classname, objidx);\n    if (!data) {\n        char msg[45];\n        sprintf(msg, \"%.35s expected\", classname);\n        luaL_argerror(L, objidx, msg);\n    }\n    return data;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Return userdata pointer if object belongs to a given group, abort with\n* error otherwise\n\\*-------------------------------------------------------------------------*/\nvoid *auxiliar_checkgroup(lua_State *L, const char *groupname, int objidx) {\n    void *data = auxiliar_getgroupudata(L, groupname, objidx);\n    if (!data) {\n        char msg[45];\n        sprintf(msg, \"%.35s expected\", groupname);\n        luaL_argerror(L, objidx, msg);\n    }\n    return data;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Set object class\n\\*-------------------------------------------------------------------------*/\nvoid auxiliar_setclass(lua_State *L, const char *classname, int objidx) {\n    luaL_getmetatable(L, classname);\n    if (objidx < 0) objidx--;\n    lua_setmetatable(L, objidx);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Get a userdata pointer if object belongs to a given group. Return NULL\n* otherwise\n\\*-------------------------------------------------------------------------*/\nvoid *auxiliar_getgroupudata(lua_State *L, const char *groupname, int objidx) {\n    if (!lua_getmetatable(L, objidx))\n        return NULL;\n    lua_pushstring(L, groupname);\n    lua_rawget(L, -2);\n    if (lua_isnil(L, -1)) {\n        lua_pop(L, 2);\n        return NULL;\n    } else {\n        lua_pop(L, 2);\n        return lua_touserdata(L, objidx);\n    }\n}\n\n/*-------------------------------------------------------------------------*\\\n* Get a userdata pointer if object belongs to a given class. Return NULL\n* otherwise\n\\*-------------------------------------------------------------------------*/\nvoid *auxiliar_getclassudata(lua_State *L, const char *classname, int objidx) {\n    return luaL_testudata(L, objidx, classname);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Throws error when argument does not have correct type.\n* Used to be part of lauxlib in Lua 5.1, was dropped from 5.2.\n\\*-------------------------------------------------------------------------*/\nint auxiliar_typeerror (lua_State *L, int narg, const char *tname) {\n  const char *msg = lua_pushfstring(L, \"%s expected, got %s\", tname,\n      luaL_typename(L, narg));\n  return luaL_argerror(L, narg, msg);\n}\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/auxiliar.h",
    "content": "#ifndef AUXILIAR_H\n#define AUXILIAR_H\n/*=========================================================================*\\\n* Auxiliar routines for class hierarchy manipulation\n* LuaSocket toolkit (but completely independent of other LuaSocket modules)\n*\n* A LuaSocket class is a name associated with Lua metatables. A LuaSocket\n* group is a name associated with a class. A class can belong to any number\n* of groups. This module provides the functionality to:\n*\n*   - create new classes\n*   - add classes to groups\n*   - set the class of objects\n*   - check if an object belongs to a given class or group\n*   - get the userdata associated to objects\n*   - print objects in a pretty way\n*\n* LuaSocket class names follow the convention <module>{<class>}. Modules\n* can define any number of classes and groups. The module tcp.c, for\n* example, defines the classes tcp{master}, tcp{client} and tcp{server} and\n* the groups tcp{client,server} and tcp{any}. Module functions can then\n* perform type-checking on their arguments by either class or group.\n*\n* LuaSocket metatables define the __index metamethod as being a table. This\n* table has one field for each method supported by the class, and a field\n* \"class\" with the class name.\n*\n* The mapping from class name to the corresponding metatable and the\n* reverse mapping are done using lauxlib.\n\\*=========================================================================*/\n\n#include \"luasocket.h\"\n\n#ifndef _WIN32\n#pragma GCC visibility push(hidden)\n#endif\n\nint auxiliar_open(lua_State *L);\nvoid auxiliar_newclass(lua_State *L, const char *classname, luaL_Reg *func);\nint auxiliar_tostring(lua_State *L);\nvoid auxiliar_add2group(lua_State *L, const char *classname, const char *group);\nint auxiliar_checkboolean(lua_State *L, int objidx);\nvoid *auxiliar_checkclass(lua_State *L, const char *classname, int objidx);\nvoid *auxiliar_checkgroup(lua_State *L, const char *groupname, int objidx);\nvoid auxiliar_setclass(lua_State *L, const char *classname, int objidx);\nvoid *auxiliar_getgroupudata(lua_State *L, const char *groupname, int objidx);\nvoid *auxiliar_getclassudata(lua_State *L, const char *groupname, int objidx);\nint auxiliar_typeerror(lua_State *L, int narg, const char *tname);\n\n#ifndef _WIN32\n#pragma GCC visibility pop\n#endif\n\n#endif /* AUXILIAR_H */\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/buffer.c",
    "content": "/*=========================================================================*\\\n* Input/Output interface for Lua programs\n* LuaSocket toolkit\n\\*=========================================================================*/\n#include \"luasocket.h\"\n#include \"buffer.h\"\n\n/*=========================================================================*\\\n* Internal function prototypes\n\\*=========================================================================*/\nstatic int recvraw(p_buffer buf, size_t wanted, luaL_Buffer *b);\nstatic int recvline(p_buffer buf, luaL_Buffer *b);\nstatic int recvall(p_buffer buf, luaL_Buffer *b);\nstatic int buffer_get(p_buffer buf, const char **data, size_t *count);\nstatic void buffer_skip(p_buffer buf, size_t count);\nstatic int sendraw(p_buffer buf, const char *data, size_t count, size_t *sent);\n\n/* min and max macros */\n#ifndef MIN\n#define MIN(x, y) ((x) < (y) ? x : y)\n#endif\n#ifndef MAX\n#define MAX(x, y) ((x) > (y) ? x : y)\n#endif\n\n/*=========================================================================*\\\n* Exported functions\n\\*=========================================================================*/\n/*-------------------------------------------------------------------------*\\\n* Initializes module\n\\*-------------------------------------------------------------------------*/\nint buffer_open(lua_State *L) {\n    (void) L;\n    return 0;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Initializes C structure\n\\*-------------------------------------------------------------------------*/\nvoid buffer_init(p_buffer buf, p_io io, p_timeout tm) {\n    buf->first = buf->last = 0;\n    buf->io = io;\n    buf->tm = tm;\n    buf->received = buf->sent = 0;\n    buf->birthday = timeout_gettime();\n}\n\n/*-------------------------------------------------------------------------*\\\n* object:getstats() interface\n\\*-------------------------------------------------------------------------*/\nint buffer_meth_getstats(lua_State *L, p_buffer buf) {\n    lua_pushnumber(L, (lua_Number) buf->received);\n    lua_pushnumber(L, (lua_Number) buf->sent);\n    lua_pushnumber(L, timeout_gettime() - buf->birthday);\n    return 3;\n}\n\n/*-------------------------------------------------------------------------*\\\n* object:setstats() interface\n\\*-------------------------------------------------------------------------*/\nint buffer_meth_setstats(lua_State *L, p_buffer buf) {\n    buf->received = (long) luaL_optnumber(L, 2, (lua_Number) buf->received);\n    buf->sent = (long) luaL_optnumber(L, 3, (lua_Number) buf->sent);\n    if (lua_isnumber(L, 4)) buf->birthday = timeout_gettime() - lua_tonumber(L, 4);\n    lua_pushnumber(L, 1);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* object:send() interface\n\\*-------------------------------------------------------------------------*/\nint buffer_meth_send(lua_State *L, p_buffer buf) {\n    int top = lua_gettop(L);\n    int err = IO_DONE;\n    size_t size = 0, sent = 0;\n    const char *data = luaL_checklstring(L, 2, &size);\n    long start = (long) luaL_optnumber(L, 3, 1);\n    long end = (long) luaL_optnumber(L, 4, -1);\n    timeout_markstart(buf->tm);\n    if (start < 0) start = (long) (size+start+1);\n    if (end < 0) end = (long) (size+end+1);\n    if (start < 1) start = (long) 1;\n    if (end > (long) size) end = (long) size;\n    if (start <= end) err = sendraw(buf, data+start-1, end-start+1, &sent);\n    /* check if there was an error */\n    if (err != IO_DONE) {\n        lua_pushnil(L);\n        lua_pushstring(L, buf->io->error(buf->io->ctx, err));\n        lua_pushnumber(L, (lua_Number) (sent+start-1));\n    } else {\n        lua_pushnumber(L, (lua_Number) (sent+start-1));\n        lua_pushnil(L);\n        lua_pushnil(L);\n    }\n#ifdef LUASOCKET_DEBUG\n    /* push time elapsed during operation as the last return value */\n    lua_pushnumber(L, timeout_gettime() - timeout_getstart(buf->tm));\n#endif\n    return lua_gettop(L) - top;\n}\n\n/*-------------------------------------------------------------------------*\\\n* object:receive() interface\n\\*-------------------------------------------------------------------------*/\nint buffer_meth_receive(lua_State *L, p_buffer buf) {\n    int err = IO_DONE, top;\n    luaL_Buffer b;\n    size_t size;\n    const char *part = luaL_optlstring(L, 3, \"\", &size);\n    timeout_markstart(buf->tm);\n    /* make sure we don't confuse buffer stuff with arguments */\n    lua_settop(L, 3);\n    top = lua_gettop(L);\n    /* initialize buffer with optional extra prefix\n     * (useful for concatenating previous partial results) */\n    luaL_buffinit(L, &b);\n    luaL_addlstring(&b, part, size);\n    /* receive new patterns */\n    if (!lua_isnumber(L, 2)) {\n        const char *p= luaL_optstring(L, 2, \"*l\");\n        if (p[0] == '*' && p[1] == 'l') err = recvline(buf, &b);\n        else if (p[0] == '*' && p[1] == 'a') err = recvall(buf, &b);\n        else luaL_argcheck(L, 0, 2, \"invalid receive pattern\");\n    /* get a fixed number of bytes (minus what was already partially\n     * received) */\n    } else {\n        double n = lua_tonumber(L, 2);\n        size_t wanted = (size_t) n;\n        luaL_argcheck(L, n >= 0, 2, \"invalid receive pattern\");\n        if (size == 0 || wanted > size)\n            err = recvraw(buf, wanted-size, &b);\n    }\n    /* check if there was an error */\n    if (err != IO_DONE) {\n        /* we can't push anyting in the stack before pushing the\n         * contents of the buffer. this is the reason for the complication */\n        luaL_pushresult(&b);\n        lua_pushstring(L, buf->io->error(buf->io->ctx, err));\n        lua_pushvalue(L, -2);\n        lua_pushnil(L);\n        lua_replace(L, -4);\n    } else {\n        luaL_pushresult(&b);\n        lua_pushnil(L);\n        lua_pushnil(L);\n    }\n#ifdef LUASOCKET_DEBUG\n    /* push time elapsed during operation as the last return value */\n    lua_pushnumber(L, timeout_gettime() - timeout_getstart(buf->tm));\n#endif\n    return lua_gettop(L) - top;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Determines if there is any data in the read buffer\n\\*-------------------------------------------------------------------------*/\nint buffer_isempty(p_buffer buf) {\n    return buf->first >= buf->last;\n}\n\n/*=========================================================================*\\\n* Internal functions\n\\*=========================================================================*/\n/*-------------------------------------------------------------------------*\\\n* Sends a block of data (unbuffered)\n\\*-------------------------------------------------------------------------*/\n#define STEPSIZE 8192\nstatic int sendraw(p_buffer buf, const char *data, size_t count, size_t *sent) {\n    p_io io = buf->io;\n    p_timeout tm = buf->tm;\n    size_t total = 0;\n    int err = IO_DONE;\n    while (total < count && err == IO_DONE) {\n        size_t done = 0;\n        size_t step = (count-total <= STEPSIZE)? count-total: STEPSIZE;\n        err = io->send(io->ctx, data+total, step, &done, tm);\n        total += done;\n    }\n    *sent = total;\n    buf->sent += total;\n    return err;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Reads a fixed number of bytes (buffered)\n\\*-------------------------------------------------------------------------*/\nstatic int recvraw(p_buffer buf, size_t wanted, luaL_Buffer *b) {\n    int err = IO_DONE;\n    size_t total = 0;\n    while (err == IO_DONE) {\n        size_t count; const char *data;\n        err = buffer_get(buf, &data, &count);\n        count = MIN(count, wanted - total);\n        luaL_addlstring(b, data, count);\n        buffer_skip(buf, count);\n        total += count;\n        if (total >= wanted) break;\n    }\n    return err;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Reads everything until the connection is closed (buffered)\n\\*-------------------------------------------------------------------------*/\nstatic int recvall(p_buffer buf, luaL_Buffer *b) {\n    int err = IO_DONE;\n    size_t total = 0;\n    while (err == IO_DONE) {\n        const char *data; size_t count;\n        err = buffer_get(buf, &data, &count);\n        total += count;\n        luaL_addlstring(b, data, count);\n        buffer_skip(buf, count);\n    }\n    if (err == IO_CLOSED) {\n        if (total > 0) return IO_DONE;\n        else return IO_CLOSED;\n    } else return err;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Reads a line terminated by a CR LF pair or just by a LF. The CR and LF\n* are not returned by the function and are discarded from the buffer\n\\*-------------------------------------------------------------------------*/\nstatic int recvline(p_buffer buf, luaL_Buffer *b) {\n    int err = IO_DONE;\n    while (err == IO_DONE) {\n        size_t count, pos; const char *data;\n        err = buffer_get(buf, &data, &count);\n        pos = 0;\n        while (pos < count && data[pos] != '\\n') {\n            /* we ignore all \\r's */\n            if (data[pos] != '\\r') luaL_addchar(b, data[pos]);\n            pos++;\n        }\n        if (pos < count) { /* found '\\n' */\n            buffer_skip(buf, pos+1); /* skip '\\n' too */\n            break; /* we are done */\n        } else /* reached the end of the buffer */\n            buffer_skip(buf, pos);\n    }\n    return err;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Skips a given number of bytes from read buffer. No data is read from the\n* transport layer\n\\*-------------------------------------------------------------------------*/\nstatic void buffer_skip(p_buffer buf, size_t count) {\n    buf->received += count;\n    buf->first += count;\n    if (buffer_isempty(buf))\n        buf->first = buf->last = 0;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Return any data available in buffer, or get more data from transport layer\n* if buffer is empty\n\\*-------------------------------------------------------------------------*/\nstatic int buffer_get(p_buffer buf, const char **data, size_t *count) {\n    int err = IO_DONE;\n    p_io io = buf->io;\n    p_timeout tm = buf->tm;\n    if (buffer_isempty(buf)) {\n        size_t got;\n        err = io->recv(io->ctx, buf->data, BUF_SIZE, &got, tm);\n        buf->first = 0;\n        buf->last = got;\n    }\n    *count = buf->last - buf->first;\n    *data = buf->data + buf->first;\n    return err;\n}\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/buffer.h",
    "content": "#ifndef BUF_H\n#define BUF_H \n/*=========================================================================*\\\n* Input/Output interface for Lua programs\n* LuaSocket toolkit\n*\n* Line patterns require buffering. Reading one character at a time involves\n* too many system calls and is very slow. This module implements the\n* LuaSocket interface for input/output on connected objects, as seen by \n* Lua programs. \n*\n* Input is buffered. Output is *not* buffered because there was no simple\n* way of making sure the buffered output data would ever be sent.\n*\n* The module is built on top of the I/O abstraction defined in io.h and the\n* timeout management is done with the timeout.h interface.\n\\*=========================================================================*/\n#include \"luasocket.h\"\n#include \"io.h\"\n#include \"timeout.h\"\n\n/* buffer size in bytes */\n#define BUF_SIZE 8192\n\n/* buffer control structure */\ntypedef struct t_buffer_ {\n    double birthday;        /* throttle support info: creation time, */\n    size_t sent, received;  /* bytes sent, and bytes received */\n    p_io io;                /* IO driver used for this buffer */\n    p_timeout tm;           /* timeout management for this buffer */\n    size_t first, last;     /* index of first and last bytes of stored data */\n    char data[BUF_SIZE];    /* storage space for buffer data */\n} t_buffer;\ntypedef t_buffer *p_buffer;\n\n#ifndef _WIN32\n#pragma GCC visibility push(hidden)\n#endif\n\nint buffer_open(lua_State *L);\nvoid buffer_init(p_buffer buf, p_io io, p_timeout tm);\nint buffer_meth_getstats(lua_State *L, p_buffer buf);\nint buffer_meth_setstats(lua_State *L, p_buffer buf);\nint buffer_meth_send(lua_State *L, p_buffer buf);\nint buffer_meth_receive(lua_State *L, p_buffer buf);\nint buffer_isempty(p_buffer buf);\n\n#ifndef _WIN32\n#pragma GCC visibility pop\n#endif\n\n#endif /* BUF_H */\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/compat.c",
    "content": "#include \"luasocket.h\"\n#include \"compat.h\"\n\n#if LUA_VERSION_NUM==501\n\n/*\n** Adapted from Lua 5.2\n*/\nvoid luasocket_setfuncs (lua_State *L, const luaL_Reg *l, int nup) {\n  luaL_checkstack(L, nup+1, \"too many upvalues\");\n  for (; l->name != NULL; l++) {  /* fill the table with given functions */\n    int i;\n    lua_pushstring(L, l->name);\n    for (i = 0; i < nup; i++)  /* copy upvalues to the top */\n      lua_pushvalue(L, -(nup+1));\n    lua_pushcclosure(L, l->func, nup);  /* closure with those upvalues */\n    lua_settable(L, -(nup + 3));\n  }\n  lua_pop(L, nup);  /* remove upvalues */\n}\n\n/*\n** Duplicated from Lua 5.2\n*/\nvoid *luasocket_testudata (lua_State *L, int ud, const char *tname) {\n  void *p = lua_touserdata(L, ud);\n  if (p != NULL) {  /* value is a userdata? */\n    if (lua_getmetatable(L, ud)) {  /* does it have a metatable? */\n      luaL_getmetatable(L, tname);  /* get correct metatable */\n      if (!lua_rawequal(L, -1, -2))  /* not the same? */\n        p = NULL;  /* value is a userdata with wrong metatable */\n      lua_pop(L, 2);  /* remove both metatables */\n      return p;\n    }\n  }\n  return NULL;  /* value is not a userdata with a metatable */\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/compat.h",
    "content": "#ifndef COMPAT_H\n#define COMPAT_H\n\n#if LUA_VERSION_NUM==501\n\n#ifndef _WIN32\n#pragma GCC visibility push(hidden)\n#endif\n\nvoid luasocket_setfuncs (lua_State *L, const luaL_Reg *l, int nup);\nvoid *luasocket_testudata ( lua_State *L, int arg, const char *tname);\n\n#ifndef _WIN32\n#pragma GCC visibility pop\n#endif\n\n#define luaL_setfuncs luasocket_setfuncs\n#define luaL_testudata luasocket_testudata\n\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/except.c",
    "content": "/*=========================================================================*\\\n* Simple exception support\n* LuaSocket toolkit\n\\*=========================================================================*/\n#include \"luasocket.h\"\n#include \"except.h\"\n#include <stdio.h>\n\n#if LUA_VERSION_NUM < 502\n#define lua_pcallk(L, na, nr, err, ctx, cont) \\\n    (((void)ctx),((void)cont),lua_pcall(L, na, nr, err))\n#endif\n\n#if LUA_VERSION_NUM < 503\ntypedef int lua_KContext;\n#endif\n\n/*=========================================================================*\\\n* Internal function prototypes.\n\\*=========================================================================*/\nstatic int global_protect(lua_State *L);\nstatic int global_newtry(lua_State *L);\nstatic int protected_(lua_State *L);\nstatic int finalize(lua_State *L);\nstatic int do_nothing(lua_State *L);\n\n/* except functions */\nstatic luaL_Reg func[] = {\n    {\"newtry\",    global_newtry},\n    {\"protect\",   global_protect},\n    {NULL,        NULL}\n};\n\n/*-------------------------------------------------------------------------*\\\n* Try factory\n\\*-------------------------------------------------------------------------*/\nstatic void wrap(lua_State *L) {\n    lua_createtable(L, 1, 0);\n    lua_pushvalue(L, -2);\n    lua_rawseti(L, -2, 1);\n    lua_pushvalue(L, lua_upvalueindex(1));\n    lua_setmetatable(L, -2);\n}\n\nstatic int finalize(lua_State *L) {\n    if (!lua_toboolean(L, 1)) {\n        lua_pushvalue(L, lua_upvalueindex(2));\n        lua_call(L, 0, 0);\n        lua_settop(L, 2);\n        wrap(L);\n        lua_error(L);\n        return 0;\n    } else return lua_gettop(L);\n}\n\nstatic int do_nothing(lua_State *L) {\n    (void) L;\n    return 0;\n}\n\nstatic int global_newtry(lua_State *L) {\n    lua_settop(L, 1);\n    if (lua_isnil(L, 1)) lua_pushcfunction(L, do_nothing);\n    lua_pushvalue(L, lua_upvalueindex(1));\n    lua_insert(L, -2);\n    lua_pushcclosure(L, finalize, 2);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Protect factory\n\\*-------------------------------------------------------------------------*/\nstatic int unwrap(lua_State *L) {\n    if (lua_istable(L, -1) && lua_getmetatable(L, -1)) {\n        int r = lua_rawequal(L, -1, lua_upvalueindex(1));\n        lua_pop(L, 1);\n        if (r) {\n            lua_pushnil(L);\n            lua_rawgeti(L, -2, 1);\n            return 1;\n        }\n    }\n    return 0;\n}\n\nstatic int protected_finish(lua_State *L, int status, lua_KContext ctx) {\n    (void)ctx;\n    if (status != 0 && status != LUA_YIELD) {\n        if (unwrap(L)) return 2;\n        else return lua_error(L);\n    } else return lua_gettop(L);\n}\n\n#if LUA_VERSION_NUM == 502\nstatic int protected_cont(lua_State *L) {\n    int ctx = 0;\n    int status = lua_getctx(L, &ctx);\n    return protected_finish(L, status, ctx);\n}\n#else\n#define protected_cont protected_finish\n#endif\n\nstatic int protected_(lua_State *L) {\n    int status;\n    lua_pushvalue(L, lua_upvalueindex(2));\n    lua_insert(L, 1);\n    status = lua_pcallk(L, lua_gettop(L) - 1, LUA_MULTRET, 0, 0, protected_cont);\n    return protected_finish(L, status, 0);\n}\n\nstatic int global_protect(lua_State *L) {\n    lua_settop(L, 1);\n    lua_pushvalue(L, lua_upvalueindex(1));\n    lua_insert(L, 1);\n    lua_pushcclosure(L, protected_, 2);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Init module\n\\*-------------------------------------------------------------------------*/\nint except_open(lua_State *L) {\n    lua_newtable(L); /* metatable for wrapped exceptions */\n    lua_pushboolean(L, 0);\n    lua_setfield(L, -2, \"__metatable\");\n    luaL_setfuncs(L, func, 1);\n    return 0;\n}\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/except.h",
    "content": "#ifndef EXCEPT_H\n#define EXCEPT_H\n/*=========================================================================*\\\n* Exception control\n* LuaSocket toolkit (but completely independent from other modules)\n*\n* This provides support for simple exceptions in Lua. During the\n* development of the HTTP/FTP/SMTP support, it became aparent that\n* error checking was taking a substantial amount of the coding. These\n* function greatly simplify the task of checking errors.\n*\n* The main idea is that functions should return nil as their first return\n* values when they find an error, and return an error message (or value)\n* following nil. In case of success, as long as the first value is not nil,\n* the other values don't matter.\n*\n* The idea is to nest function calls with the \"try\" function. This function\n* checks the first value, and, if it's falsy, wraps the second value in a\n* table with metatable and calls \"error\" on it. Otherwise, it returns all\n* values it received. Basically, it works like the Lua \"assert\" function,\n* but it creates errors targeted specifically at \"protect\".\n*\n* The \"newtry\" function is a factory for \"try\" functions that call a\n* finalizer in protected mode before calling \"error\".\n*\n* The \"protect\" function returns a new function that behaves exactly like\n* the function it receives, but the new function catches exceptions thrown\n* by \"try\" functions and returns nil followed by the error message instead.\n*\n* With these three functions, it's easy to write functions that throw\n* exceptions on error, but that don't interrupt the user script.\n\\*=========================================================================*/\n\n#include \"luasocket.h\"\n\n#ifndef _WIN32\n#pragma GCC visibility push(hidden)\n#endif\n\nint except_open(lua_State *L);\n\n#ifndef _WIN32\n#pragma GCC visibility pop\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/ftp.lua",
    "content": "-----------------------------------------------------------------------------\n-- FTP support for the Lua language\n-- LuaSocket toolkit.\n-- Author: Diego Nehab\n-----------------------------------------------------------------------------\n\n-----------------------------------------------------------------------------\n-- Declare module and import dependencies\n-----------------------------------------------------------------------------\nlocal base = _G\nlocal table = require(\"table\")\nlocal string = require(\"string\")\nlocal math = require(\"math\")\nlocal socket = require(\"socket\")\nlocal url = require(\"socket.url\")\nlocal tp = require(\"socket.tp\")\nlocal ltn12 = require(\"ltn12\")\nsocket.ftp = {}\nlocal _M = socket.ftp\n-----------------------------------------------------------------------------\n-- Program constants\n-----------------------------------------------------------------------------\n-- timeout in seconds before the program gives up on a connection\n_M.TIMEOUT = 60\n-- default port for ftp service\nlocal PORT = 21\n-- this is the default anonymous password. used when no password is\n-- provided in url. should be changed to your e-mail.\n_M.USER = \"ftp\"\n_M.PASSWORD = \"anonymous@anonymous.org\"\n\n-----------------------------------------------------------------------------\n-- Low level FTP API\n-----------------------------------------------------------------------------\nlocal metat = { __index = {} }\n\nfunction _M.open(server, port, create)\n    local tp = socket.try(tp.connect(server, port or PORT, _M.TIMEOUT, create))\n    local f = base.setmetatable({ tp = tp }, metat)\n    -- make sure everything gets closed in an exception\n    f.try = socket.newtry(function() f:close() end)\n    return f\nend\n\nfunction metat.__index:portconnect()\n    self.try(self.server:settimeout(_M.TIMEOUT))\n    self.data = self.try(self.server:accept())\n    self.try(self.data:settimeout(_M.TIMEOUT))\nend\n\nfunction metat.__index:pasvconnect()\n    self.data = self.try(socket.tcp())\n    self.try(self.data:settimeout(_M.TIMEOUT))\n    self.try(self.data:connect(self.pasvt.address, self.pasvt.port))\nend\n\nfunction metat.__index:login(user, password)\n    self.try(self.tp:command(\"user\", user or _M.USER))\n    local code, _ = self.try(self.tp:check{\"2..\", 331})\n    if code == 331 then\n        self.try(self.tp:command(\"pass\", password or _M.PASSWORD))\n        self.try(self.tp:check(\"2..\"))\n    end\n    return 1\nend\n\nfunction metat.__index:pasv()\n    self.try(self.tp:command(\"pasv\"))\n    local _, reply = self.try(self.tp:check(\"2..\"))\n    local pattern = \"(%d+)%D(%d+)%D(%d+)%D(%d+)%D(%d+)%D(%d+)\"\n    local a, b, c, d, p1, p2 = socket.skip(2, string.find(reply, pattern))\n    self.try(a and b and c and d and p1 and p2, reply)\n    self.pasvt = {\n        address = string.format(\"%d.%d.%d.%d\", a, b, c, d),\n        port = p1*256 + p2\n    }\n    if self.server then\n        self.server:close()\n        self.server = nil\n    end\n    return self.pasvt.address, self.pasvt.port\nend\n\nfunction metat.__index:epsv()\n    self.try(self.tp:command(\"epsv\"))\n    local _, reply = self.try(self.tp:check(\"229\"))\n    local pattern = \"%((.)(.-)%1(.-)%1(.-)%1%)\"\n    local _, _, _, port = string.match(reply, pattern)\n    self.try(port, \"invalid epsv response\")\n    self.pasvt = {\n        address = self.tp:getpeername(),\n        port = port\n    }\n    if self.server then\n        self.server:close()\n        self.server = nil\n    end\n    return self.pasvt.address, self.pasvt.port\nend\n\n\nfunction metat.__index:port(address, port)\n    self.pasvt = nil\n    if not address then\n        address = self.try(self.tp:getsockname())\n        self.server = self.try(socket.bind(address, 0))\n        address, port = self.try(self.server:getsockname())\n        self.try(self.server:settimeout(_M.TIMEOUT))\n    end\n    local pl = math.mod(port, 256)\n    local ph = (port - pl)/256\n    local arg = string.gsub(string.format(\"%s,%d,%d\", address, ph, pl), \"%.\", \",\")\n    self.try(self.tp:command(\"port\", arg))\n    self.try(self.tp:check(\"2..\"))\n    return 1\nend\n\nfunction metat.__index:eprt(family, address, port)\n    self.pasvt = nil\n    if not address then\n        address = self.try(self.tp:getsockname())\n        self.server = self.try(socket.bind(address, 0))\n        address, port = self.try(self.server:getsockname())\n        self.try(self.server:settimeout(_M.TIMEOUT))\n    end\n    local arg = string.format(\"|%s|%s|%d|\", family, address, port)\n    self.try(self.tp:command(\"eprt\", arg))\n    self.try(self.tp:check(\"2..\"))\n    return 1\nend\n\n\nfunction metat.__index:send(sendt)\n    self.try(self.pasvt or self.server, \"need port or pasv first\")\n    -- if there is a pasvt table, we already sent a PASV command\n    -- we just get the data connection into self.data\n    if self.pasvt then self:pasvconnect() end\n    -- get the transfer argument and command\n    local argument = sendt.argument or\n        url.unescape(string.gsub(sendt.path or \"\", \"^[/\\\\]\", \"\"))\n    if argument == \"\" then argument = nil end\n    local command = sendt.command or \"stor\"\n    -- send the transfer command and check the reply\n    self.try(self.tp:command(command, argument))\n    local code, _ = self.try(self.tp:check{\"2..\", \"1..\"})\n    -- if there is not a pasvt table, then there is a server\n    -- and we already sent a PORT command\n    if not self.pasvt then self:portconnect() end\n    -- get the sink, source and step for the transfer\n    local step = sendt.step or ltn12.pump.step\n    local readt = { self.tp }\n    local checkstep = function(src, snk)\n        -- check status in control connection while downloading\n        local readyt = socket.select(readt, nil, 0)\n        if readyt[tp] then code = self.try(self.tp:check(\"2..\")) end\n        return step(src, snk)\n    end\n    local sink = socket.sink(\"close-when-done\", self.data)\n    -- transfer all data and check error\n    self.try(ltn12.pump.all(sendt.source, sink, checkstep))\n    if string.find(code, \"1..\") then self.try(self.tp:check(\"2..\")) end\n    -- done with data connection\n    self.data:close()\n    -- find out how many bytes were sent\n    local sent = socket.skip(1, self.data:getstats())\n    self.data = nil\n    return sent\nend\n\nfunction metat.__index:receive(recvt)\n    self.try(self.pasvt or self.server, \"need port or pasv first\")\n    if self.pasvt then self:pasvconnect() end\n    local argument = recvt.argument or\n        url.unescape(string.gsub(recvt.path or \"\", \"^[/\\\\]\", \"\"))\n    if argument == \"\" then argument = nil end\n    local command = recvt.command or \"retr\"\n    self.try(self.tp:command(command, argument))\n    local code,reply = self.try(self.tp:check{\"1..\", \"2..\"})\n    if (code >= 200) and (code <= 299) then\n        recvt.sink(reply)\n        return 1\n    end\n    if not self.pasvt then self:portconnect() end\n    local source = socket.source(\"until-closed\", self.data)\n    local step = recvt.step or ltn12.pump.step\n    self.try(ltn12.pump.all(source, recvt.sink, step))\n    if string.find(code, \"1..\") then self.try(self.tp:check(\"2..\")) end\n    self.data:close()\n    self.data = nil\n    return 1\nend\n\nfunction metat.__index:cwd(dir)\n    self.try(self.tp:command(\"cwd\", dir))\n    self.try(self.tp:check(250))\n    return 1\nend\n\nfunction metat.__index:type(type)\n    self.try(self.tp:command(\"type\", type))\n    self.try(self.tp:check(200))\n    return 1\nend\n\nfunction metat.__index:greet()\n    local code = self.try(self.tp:check{\"1..\", \"2..\"})\n    if string.find(code, \"1..\") then self.try(self.tp:check(\"2..\")) end\n    return 1\nend\n\nfunction metat.__index:quit()\n    self.try(self.tp:command(\"quit\"))\n    self.try(self.tp:check(\"2..\"))\n    return 1\nend\n\nfunction metat.__index:close()\n    if self.data then self.data:close() end\n    if self.server then self.server:close() end\n    return self.tp:close()\nend\n\n-----------------------------------------------------------------------------\n-- High level FTP API\n-----------------------------------------------------------------------------\nlocal function override(t)\n    if t.url then\n        local u = url.parse(t.url)\n        for i,v in base.pairs(t) do\n            u[i] = v\n        end\n        return u\n    else return t end\nend\n\nlocal function tput(putt)\n    putt = override(putt)\n    socket.try(putt.host, \"missing hostname\")\n    local f = _M.open(putt.host, putt.port, putt.create)\n    f:greet()\n    f:login(putt.user, putt.password)\n    if putt.type then f:type(putt.type) end\n    f:epsv()\n    local sent = f:send(putt)\n    f:quit()\n    f:close()\n    return sent\nend\n\nlocal default = {\n    path = \"/\",\n    scheme = \"ftp\"\n}\n\nlocal function genericform(u)\n    local t = socket.try(url.parse(u, default))\n    socket.try(t.scheme == \"ftp\", \"wrong scheme '\" .. t.scheme .. \"'\")\n    socket.try(t.host, \"missing hostname\")\n    local pat = \"^type=(.)$\"\n    if t.params then\n        t.type = socket.skip(2, string.find(t.params, pat))\n        socket.try(t.type == \"a\" or t.type == \"i\",\n            \"invalid type '\" .. t.type .. \"'\")\n    end\n    return t\nend\n\n_M.genericform = genericform\n\nlocal function sput(u, body)\n    local putt = genericform(u)\n    putt.source = ltn12.source.string(body)\n    return tput(putt)\nend\n\n_M.put = socket.protect(function(putt, body)\n    if base.type(putt) == \"string\" then return sput(putt, body)\n    else return tput(putt) end\nend)\n\nlocal function tget(gett)\n    gett = override(gett)\n    socket.try(gett.host, \"missing hostname\")\n    local f = _M.open(gett.host, gett.port, gett.create)\n    f:greet()\n    f:login(gett.user, gett.password)\n    if gett.type then f:type(gett.type) end\n    f:epsv()\n    f:receive(gett)\n    f:quit()\n    return f:close()\nend\n\nlocal function sget(u)\n    local gett = genericform(u)\n    local t = {}\n    gett.sink = ltn12.sink.table(t)\n    tget(gett)\n    return table.concat(t)\nend\n\n_M.command = socket.protect(function(cmdt)\n    cmdt = override(cmdt)\n    socket.try(cmdt.host, \"missing hostname\")\n    socket.try(cmdt.command, \"missing command\")\n    local f = _M.open(cmdt.host, cmdt.port, cmdt.create)\n    f:greet()\n    f:login(cmdt.user, cmdt.password)\n    if type(cmdt.command) == \"table\" then\n        local argument = cmdt.argument or {}\n        local check = cmdt.check or {}\n        for i,cmd in ipairs(cmdt.command) do\n            f.try(f.tp:command(cmd, argument[i]))\n            if check[i] then f.try(f.tp:check(check[i])) end\n        end\n    else\n        f.try(f.tp:command(cmdt.command, cmdt.argument))\n        if cmdt.check then f.try(f.tp:check(cmdt.check)) end\n    end\n    f:quit()\n    return f:close()\nend)\n\n_M.get = socket.protect(function(gett)\n    if base.type(gett) == \"string\" then return sget(gett)\n    else return tget(gett) end\nend)\n\nreturn _M\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/ftp.lua.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n * \n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n * \n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n * \n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\nnamespace love\n{\n\n// [ftp.lua]\nconst unsigned char ftp_lua[] = \n{\n\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x46, 0x54, 0x50, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x66, 0x6f, 0x72, \n\t0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x4c, 0x75, 0x61, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0x6b, \n\t0x69, 0x74, 0x2e, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x3a, 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x20, 0x4e, \n\t0x65, 0x68, 0x61, 0x62, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, \n\t0x61, 0x6e, 0x64, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, \n\t0x6e, 0x63, 0x69, 0x65, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x47, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, \n\t0x69, 0x72, 0x65, 0x28, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, \n\t0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, \n\t0x72, 0x65, 0x28, 0x22, 0x6d, 0x61, 0x74, 0x68, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, \n\t0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, \n\t0x65, 0x28, 0x22, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x75, 0x72, 0x6c, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x70, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, \n\t0x28, 0x22, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x74, 0x70, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, \n\t0x69, 0x72, 0x65, 0x28, 0x22, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x22, 0x29, 0x0a,\n\t0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x66, 0x74, 0x70, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x4d, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, \n\t0x66, 0x74, 0x70, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, \n\t0x74, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x63, 0x6f, \n\t0x6e, 0x64, 0x73, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, \n\t0x67, 0x72, 0x61, 0x6d, 0x20, 0x67, 0x69, 0x76, 0x65, 0x73, 0x20, 0x75, 0x70, 0x20, 0x6f, 0x6e, 0x20, 0x61, \n\t0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x20, 0x3d, 0x20, 0x36, 0x30, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x66, 0x6f, \n\t0x72, 0x20, 0x66, 0x74, 0x70, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x50, 0x4f, 0x52, 0x54, 0x20, 0x3d, 0x20, 0x32, 0x31, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x66, \n\t0x61, 0x75, 0x6c, 0x74, 0x20, 0x61, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x20, 0x70, 0x61, 0x73, \n\t0x73, 0x77, 0x6f, 0x72, 0x64, 0x2e, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x6e, \n\t0x6f, 0x20, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x69, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x72, 0x6c, \n\t0x2e, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, \n\t0x64, 0x20, 0x74, 0x6f, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x65, 0x2d, 0x6d, 0x61, 0x69, 0x6c, 0x2e, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x55, 0x53, 0x45, 0x52, 0x20, 0x3d, 0x20, 0x22, 0x66, 0x74, 0x70, 0x22, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x50, 0x41, 0x53, 0x53, 0x57, 0x4f, 0x52, 0x44, 0x20, 0x3d, 0x20, 0x22, 0x61, 0x6e, 0x6f, \n\t0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x40, 0x61, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x2e, 0x6f, \n\t0x72, 0x67, 0x22, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x4c, 0x6f, 0x77, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x46, 0x54, 0x50, 0x20, 0x41, \n\t0x50, 0x49, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x5f, 0x5f, \n\t0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x20, 0x7d, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x73, \n\t0x65, 0x72, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x2c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, \n\t0x65, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x70, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, \n\t0x6b, 0x65, 0x74, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x74, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, \n\t0x28, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x50, \n\t0x4f, 0x52, 0x54, 0x2c, 0x20, 0x5f, 0x4d, 0x2e, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x2c, 0x20, 0x63, \n\t0x72, 0x65, 0x61, 0x74, 0x65, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x62, 0x61, 0x73, 0x65, \n\t0x2e, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x20, 0x74, 0x70, \n\t0x20, 0x3d, 0x20, 0x74, 0x70, 0x20, 0x7d, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x65, \n\t0x76, 0x65, 0x72, 0x79, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x67, 0x65, 0x74, 0x73, 0x20, 0x63, 0x6c, 0x6f, \n\t0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, \n\t0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, \n\t0x2e, 0x6e, 0x65, 0x77, 0x74, 0x72, 0x79, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, \n\t0x20, 0x66, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x70, 0x6f, 0x72, 0x74, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, \n\t0x5f, 0x4d, 0x2e, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x73, 0x65, \n\t0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, \n\t0x3a, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x28, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x64, 0x61, 0x74, 0x61, 0x3a, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x5f, 0x4d, \n\t0x2e, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x29, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x70, 0x61, 0x73, 0x76, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x73, 0x65, \n\t0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x74, 0x63, 0x70, 0x28, \n\t0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x64, 0x61, 0x74, 0x61, 0x3a, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x5f, 0x4d, \n\t0x2e, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x64, 0x61, 0x74, 0x61, 0x3a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x70, 0x61, 0x73, 0x76, 0x74, 0x2e, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x73, 0x65, 0x6c, \n\t0x66, 0x2e, 0x70, 0x61, 0x73, 0x76, 0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x29, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x28, 0x75, 0x73, 0x65, 0x72, 0x2c, 0x20, 0x70, \n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x22, 0x75, 0x73, 0x65, 0x72, 0x22, 0x2c, \n\t0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x4d, 0x2e, 0x55, 0x53, 0x45, 0x52, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x5f, 0x20, \n\t0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x70, \n\t0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x7b, 0x22, 0x32, 0x2e, 0x2e, 0x22, 0x2c, 0x20, 0x33, 0x33, 0x31, 0x7d, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x33, 0x31, \n\t0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, \n\t0x65, 0x6c, 0x66, 0x2e, 0x74, 0x70, 0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x22, 0x70, 0x61, \n\t0x73, 0x73, 0x22, 0x2c, 0x20, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x5f, \n\t0x4d, 0x2e, 0x50, 0x41, 0x53, 0x53, 0x57, 0x4f, 0x52, 0x44, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, \n\t0x65, 0x6c, 0x66, 0x2e, 0x74, 0x70, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x22, 0x32, 0x2e, 0x2e, 0x22, \n\t0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x70, 0x61, 0x73, 0x76, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x22, 0x70, 0x61, 0x73, 0x76, 0x22, 0x29, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x2c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x79, \n\t0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, \n\t0x70, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x22, 0x32, 0x2e, 0x2e, 0x22, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, \n\t0x3d, 0x20, 0x22, 0x28, 0x25, 0x64, 0x2b, 0x29, 0x25, 0x44, 0x28, 0x25, 0x64, 0x2b, 0x29, 0x25, 0x44, 0x28, \n\t0x25, 0x64, 0x2b, 0x29, 0x25, 0x44, 0x28, 0x25, 0x64, 0x2b, 0x29, 0x25, 0x44, 0x28, 0x25, 0x64, 0x2b, 0x29, \n\t0x25, 0x44, 0x28, 0x25, 0x64, 0x2b, 0x29, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x63, 0x2c, \n\t0x20, 0x64, 0x2c, 0x20, 0x70, 0x31, 0x2c, 0x20, 0x70, 0x32, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, \n\t0x74, 0x2e, 0x73, 0x6b, 0x69, 0x70, 0x28, 0x32, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, \n\t0x69, 0x6e, 0x64, 0x28, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, \n\t0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x61, 0x20, 0x61, 0x6e, 0x64, \n\t0x20, 0x62, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x20, 0x61, 0x6e, 0x64, \n\t0x20, 0x70, 0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x32, 0x2c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x61, 0x73, 0x76, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, \n\t0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x64, 0x2e, \n\t0x25, 0x64, 0x2e, 0x25, 0x64, 0x2e, 0x25, 0x64, 0x22, 0x2c, 0x20, 0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x63, \n\t0x2c, 0x20, 0x64, 0x29, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x31, 0x2a, \n\t0x32, 0x35, 0x36, 0x20, 0x2b, 0x20, 0x70, 0x32, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, \n\t0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, \n\t0x72, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, \n\t0x72, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x61, \n\t0x73, 0x76, 0x74, 0x2e, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x70, 0x61, 0x73, 0x76, 0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x65, 0x70, 0x73, 0x76, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x22, 0x65, 0x70, 0x73, 0x76, 0x22, 0x29, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x2c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x79, \n\t0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, \n\t0x70, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x22, 0x32, 0x32, 0x39, 0x22, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, \n\t0x3d, 0x20, 0x22, 0x25, 0x28, 0x28, 0x2e, 0x29, 0x28, 0x2e, 0x2d, 0x29, 0x25, 0x31, 0x28, 0x2e, 0x2d, 0x29, \n\t0x25, 0x31, 0x28, 0x2e, 0x2d, 0x29, 0x25, 0x31, 0x25, 0x29, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x2c, 0x20, 0x5f, 0x2c, 0x20, 0x5f, 0x2c, \n\t0x20, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x6d, 0x61, 0x74, \n\t0x63, 0x68, 0x28, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x70, 0x6f, 0x72, 0x74, 0x2c, \n\t0x20, 0x22, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x65, 0x70, 0x73, 0x76, 0x20, 0x72, 0x65, 0x73, \n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x61, 0x73, 0x76, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, \n\t0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x70, 0x3a, 0x67, 0x65, 0x74, 0x70, 0x65, 0x65, 0x72, 0x6e, 0x61, 0x6d, \n\t0x65, 0x28, 0x29, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x72, \n\t0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, \n\t0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, \n\t0x72, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, \n\t0x72, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x61, \n\t0x73, 0x76, 0x74, 0x2e, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x70, 0x61, 0x73, 0x76, 0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, \n\t0x20, 0x70, 0x6f, 0x72, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x61, 0x73, 0x76, 0x74, 0x20, 0x3d, 0x20, 0x6e, \n\t0x69, 0x6c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, \n\t0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, \n\t0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x70, 0x3a, 0x67, \n\t0x65, 0x74, 0x73, 0x6f, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, \n\t0x72, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x6f, 0x63, 0x6b, 0x65, \n\t0x74, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x30, 0x29, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x70, \n\t0x6f, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, \n\t0x66, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x67, 0x65, 0x74, 0x73, 0x6f, 0x63, 0x6b, 0x6e, 0x61, \n\t0x6d, 0x65, 0x28, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, \n\t0x65, 0x6c, 0x66, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6d, 0x65, \n\t0x6f, 0x75, 0x74, 0x28, 0x5f, 0x4d, 0x2e, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6c, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, \n\t0x68, 0x2e, 0x6d, 0x6f, 0x64, 0x28, 0x70, 0x6f, 0x72, 0x74, 0x2c, 0x20, 0x32, 0x35, 0x36, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x68, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x6f, \n\t0x72, 0x74, 0x20, 0x2d, 0x20, 0x70, 0x6c, 0x29, 0x2f, 0x32, 0x35, 0x36, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x73, 0x74, \n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, \n\t0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x73, 0x2c, 0x25, 0x64, 0x2c, 0x25, 0x64, 0x22, 0x2c, 0x20, \n\t0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x70, 0x68, 0x2c, 0x20, 0x70, 0x6c, 0x29, 0x2c, 0x20, \n\t0x22, 0x25, 0x2e, 0x22, 0x2c, 0x20, 0x22, 0x2c, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x22, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x2c, \n\t0x20, 0x61, 0x72, 0x67, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x22, 0x32, 0x2e, 0x2e, 0x22, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x65, 0x70, 0x72, 0x74, 0x28, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x2c, 0x20, \n\t0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x61, 0x73, 0x76, 0x74, 0x20, 0x3d, 0x20, 0x6e, \n\t0x69, 0x6c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, \n\t0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, \n\t0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x70, 0x3a, 0x67, \n\t0x65, 0x74, 0x73, 0x6f, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, \n\t0x72, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x6f, 0x63, 0x6b, 0x65, \n\t0x74, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x30, 0x29, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x70, \n\t0x6f, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, \n\t0x66, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x67, 0x65, 0x74, 0x73, 0x6f, 0x63, 0x6b, 0x6e, 0x61, \n\t0x6d, 0x65, 0x28, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, \n\t0x65, 0x6c, 0x66, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6d, 0x65, \n\t0x6f, 0x75, 0x74, 0x28, 0x5f, 0x4d, 0x2e, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x73, 0x74, \n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x7c, 0x25, 0x73, 0x7c, 0x25, \n\t0x73, 0x7c, 0x25, 0x64, 0x7c, 0x22, 0x2c, 0x20, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x2c, 0x20, 0x61, 0x64, \n\t0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x22, 0x65, 0x70, 0x72, 0x74, 0x22, 0x2c, \n\t0x20, 0x61, 0x72, 0x67, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x22, 0x32, 0x2e, 0x2e, 0x22, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x28, 0x73, 0x65, 0x6e, 0x64, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x70, 0x61, 0x73, 0x76, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x65, 0x72, 0x76, \n\t0x65, 0x72, 0x2c, 0x20, 0x22, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, \n\t0x70, 0x61, 0x73, 0x76, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, \n\t0x20, 0x61, 0x20, 0x70, 0x61, 0x73, 0x76, 0x74, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x77, 0x65, \n\t0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x20, 0x50, 0x41, \n\t0x53, 0x56, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x77, 0x65, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x67, 0x65, 0x74, \n\t0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, \n\t0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x61, 0x73, 0x76, 0x74, 0x20, \n\t0x74, 0x68, 0x65, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x70, 0x61, 0x73, 0x76, 0x63, 0x6f, 0x6e, 0x6e, \n\t0x65, 0x63, 0x74, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x67, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, \n\t0x6e, 0x73, 0x66, 0x65, 0x72, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, \n\t0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, \n\t0x20, 0x3d, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x74, 0x2e, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, \n\t0x6f, 0x72, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x72, 0x6c, 0x2e, 0x75, 0x6e, 0x65, 0x73, 0x63, 0x61, \n\t0x70, 0x65, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, 0x65, 0x6e, \n\t0x64, 0x74, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x2c, 0x20, 0x22, 0x5e, 0x5b, \n\t0x2f, 0x5c, 0x5c, 0x5d, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x3d, \n\t0x20, 0x22, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, \n\t0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, \n\t0x3d, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x72, \n\t0x20, 0x22, 0x73, 0x74, 0x6f, 0x72, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, \n\t0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x64, \n\t0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, \n\t0x2c, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x5f, 0x20, \n\t0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x70, \n\t0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x7b, 0x22, 0x32, 0x2e, 0x2e, 0x22, 0x2c, 0x20, 0x22, 0x31, 0x2e, 0x2e, \n\t0x22, 0x7d, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, \n\t0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x70, 0x61, 0x73, 0x76, 0x74, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, \n\t0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, \n\t0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x65, 0x20, 0x61, 0x6c, 0x72, 0x65, \n\t0x61, 0x64, 0x79, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x20, 0x50, 0x4f, 0x52, 0x54, 0x20, 0x63, 0x6f, \n\t0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x61, \n\t0x73, 0x76, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x70, 0x6f, 0x72, 0x74, \n\t0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x67, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x6e, \n\t0x6b, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x74, 0x65, 0x70, \n\t0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x73, \n\t0x65, 0x6e, 0x64, 0x74, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, \n\t0x2e, 0x70, 0x75, 0x6d, 0x70, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x74, 0x20, 0x3d, 0x20, \n\t0x7b, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x70, 0x20, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x74, 0x65, \n\t0x70, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, \n\t0x73, 0x6e, 0x6b, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x73, \n\t0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x63, \n\t0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x64, 0x6f, \n\t0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, \n\t0x79, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, \n\t0x28, 0x72, 0x65, 0x61, 0x64, 0x74, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x30, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x72, 0x65, 0x61, 0x64, 0x79, 0x74, 0x5b, \n\t0x74, 0x70, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, \n\t0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x70, 0x3a, 0x63, 0x68, 0x65, \n\t0x63, 0x6b, 0x28, 0x22, 0x32, 0x2e, 0x2e, 0x22, 0x29, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x65, \n\t0x70, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x6e, 0x6b, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x73, \n\t0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x69, 0x6e, 0x6b, 0x28, 0x22, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x2d, \n\t0x77, 0x68, 0x65, 0x6e, 0x2d, 0x64, 0x6f, 0x6e, 0x65, 0x22, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x64, \n\t0x61, 0x74, 0x61, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x20, 0x61, 0x6c, \n\t0x6c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x65, \n\t0x72, 0x72, 0x6f, 0x72, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x6c, 0x74, 0x6e, 0x31, 0x32, \n\t0x2e, 0x70, 0x75, 0x6d, 0x70, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x73, 0x65, 0x6e, 0x64, 0x74, 0x2e, 0x73, 0x6f, \n\t0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x2c, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, \n\t0x74, 0x65, 0x70, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, \n\t0x28, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x22, 0x31, 0x2e, 0x2e, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, \n\t0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x70, 0x3a, \n\t0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x22, 0x32, 0x2e, 0x2e, 0x22, 0x29, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x64, \n\t0x61, 0x74, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x63, 0x6c, 0x6f, 0x73, \n\t0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x6f, \n\t0x77, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x77, 0x65, 0x72, 0x65, 0x20, \n\t0x73, 0x65, 0x6e, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x73, \n\t0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x6b, 0x69, 0x70, 0x28, 0x31, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x66, \n\t0x2e, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x67, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x73, 0x28, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x6e, 0x69, \n\t0x6c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x28, 0x72, 0x65, 0x63, 0x76, 0x74, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x70, 0x61, 0x73, 0x76, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x65, 0x72, 0x76, \n\t0x65, 0x72, 0x2c, 0x20, 0x22, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, \n\t0x70, 0x61, 0x73, 0x76, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x61, 0x73, 0x76, 0x74, 0x20, \n\t0x74, 0x68, 0x65, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x70, 0x61, 0x73, 0x76, 0x63, 0x6f, 0x6e, 0x6e, \n\t0x65, 0x63, 0x74, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, \n\t0x20, 0x3d, 0x20, 0x72, 0x65, 0x63, 0x76, 0x74, 0x2e, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, \n\t0x6f, 0x72, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x72, 0x6c, 0x2e, 0x75, 0x6e, 0x65, 0x73, 0x63, 0x61, \n\t0x70, 0x65, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x72, 0x65, 0x63, \n\t0x76, 0x74, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x2c, 0x20, 0x22, 0x5e, 0x5b, \n\t0x2f, 0x5c, 0x5c, 0x5d, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x3d, \n\t0x20, 0x22, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, \n\t0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, \n\t0x3d, 0x20, 0x72, 0x65, 0x63, 0x76, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x72, \n\t0x20, 0x22, 0x72, 0x65, 0x74, 0x72, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, \n\t0x2c, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x72, 0x65, 0x70, \n\t0x6c, 0x79, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, \n\t0x2e, 0x74, 0x70, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x7b, 0x22, 0x31, 0x2e, 0x2e, 0x22, 0x2c, 0x20, 0x22, \n\t0x32, 0x2e, 0x2e, 0x22, 0x7d, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3e, 0x3d, 0x20, 0x32, 0x30, \n\t0x30, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3c, 0x3d, 0x20, 0x32, 0x39, \n\t0x39, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x63, 0x76, 0x74, 0x2e, 0x73, 0x69, 0x6e, 0x6b, \n\t0x28, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x61, \n\t0x73, 0x76, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x70, 0x6f, 0x72, 0x74, \n\t0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, \n\t0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x22, 0x75, 0x6e, \n\t0x74, 0x69, 0x6c, 0x2d, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x64, 0x61, 0x74, 0x61, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x72, \n\t0x65, 0x63, 0x76, 0x74, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, \n\t0x2e, 0x70, 0x75, 0x6d, 0x70, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x6c, 0x74, 0x6e, 0x31, 0x32, \n\t0x2e, 0x70, 0x75, 0x6d, 0x70, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, \n\t0x72, 0x65, 0x63, 0x76, 0x74, 0x2e, 0x73, 0x69, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x74, 0x65, 0x70, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, \n\t0x28, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x22, 0x31, 0x2e, 0x2e, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, \n\t0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x70, 0x3a, \n\t0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x22, 0x32, 0x2e, 0x2e, 0x22, 0x29, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x63, 0x6c, 0x6f, 0x73, \n\t0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x6e, 0x69, \n\t0x6c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x63, 0x77, 0x64, 0x28, 0x64, 0x69, 0x72, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x22, 0x63, 0x77, 0x64, 0x22, 0x2c, 0x20, \n\t0x64, 0x69, 0x72, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x32, 0x35, 0x30, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x74, 0x79, 0x70, 0x65, 0x28, 0x74, 0x79, 0x70, 0x65, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x2c, \n\t0x20, 0x74, 0x79, 0x70, 0x65, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x32, 0x30, 0x30, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x67, 0x72, 0x65, 0x65, 0x74, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x73, \n\t0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x70, 0x3a, 0x63, 0x68, \n\t0x65, 0x63, 0x6b, 0x7b, 0x22, 0x31, 0x2e, 0x2e, 0x22, 0x2c, 0x20, 0x22, 0x32, 0x2e, 0x2e, 0x22, 0x7d, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, \n\t0x28, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x22, 0x31, 0x2e, 0x2e, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, \n\t0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x70, 0x3a, \n\t0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x22, 0x32, 0x2e, 0x2e, 0x22, 0x29, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x71, 0x75, 0x69, 0x74, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x22, 0x71, 0x75, 0x69, 0x74, 0x22, 0x29, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x22, 0x32, 0x2e, 0x2e, 0x22, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x20, 0x74, \n\t0x68, 0x65, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x63, 0x6c, 0x6f, 0x73, \n\t0x65, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, \n\t0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, \n\t0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x70, \n\t0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x48, 0x69, 0x67, 0x68, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x46, 0x54, 0x50, 0x20, \n\t0x41, 0x50, 0x49, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x76, 0x65, \n\t0x72, 0x72, 0x69, 0x64, 0x65, 0x28, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x2e, 0x75, 0x72, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x20, 0x3d, 0x20, \n\t0x75, 0x72, 0x6c, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x74, 0x2e, 0x75, 0x72, 0x6c, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x76, 0x20, 0x69, 0x6e, \n\t0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x5b, 0x69, 0x5d, 0x20, 0x3d, \n\t0x20, 0x76, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x20, \n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x70, 0x75, \n\t0x74, 0x28, 0x70, 0x75, 0x74, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x70, 0x75, 0x74, 0x74, 0x20, 0x3d, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, \n\t0x65, 0x28, 0x70, 0x75, 0x74, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x70, 0x75, 0x74, \n\t0x74, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x22, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x68, \n\t0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x5f, 0x4d, 0x2e, 0x6f, \n\t0x70, 0x65, 0x6e, 0x28, 0x70, 0x75, 0x74, 0x74, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x70, 0x75, 0x74, \n\t0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x2c, 0x20, 0x70, 0x75, 0x74, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, \n\t0x65, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x3a, 0x67, 0x72, 0x65, 0x65, 0x74, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x3a, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x28, 0x70, 0x75, 0x74, 0x74, 0x2e, 0x75, \n\t0x73, 0x65, 0x72, 0x2c, 0x20, 0x70, 0x75, 0x74, 0x74, 0x2e, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x75, 0x74, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x74, \n\t0x68, 0x65, 0x6e, 0x20, 0x66, 0x3a, 0x74, 0x79, 0x70, 0x65, 0x28, 0x70, 0x75, 0x74, 0x74, 0x2e, 0x74, 0x79, \n\t0x70, 0x65, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x3a, 0x65, 0x70, 0x73, 0x76, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x66, \n\t0x3a, 0x73, 0x65, 0x6e, 0x64, 0x28, 0x70, 0x75, 0x74, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x3a, 0x71, 0x75, 0x69, 0x74, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x22, 0x2f, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x66, 0x74, 0x70, 0x22, 0x0a,\n\t0x7d, 0x0a,\n\t0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x6e, \n\t0x65, 0x72, 0x69, 0x63, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x75, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, \n\t0x65, 0x74, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x75, 0x72, 0x6c, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x75, \n\t0x2c, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x74, 0x2e, 0x73, \n\t0x63, 0x68, 0x65, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x74, 0x70, 0x22, 0x2c, 0x20, 0x22, 0x77, \n\t0x72, 0x6f, 0x6e, 0x67, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x20, 0x27, 0x22, 0x20, 0x2e, 0x2e, 0x20, \n\t0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x27, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x74, 0x2e, 0x68, \n\t0x6f, 0x73, 0x74, 0x2c, 0x20, 0x22, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x6f, 0x73, 0x74, \n\t0x6e, 0x61, 0x6d, 0x65, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x22, 0x5e, \n\t0x74, 0x79, 0x70, 0x65, 0x3d, 0x28, 0x2e, 0x29, 0x24, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x74, 0x68, \n\t0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x73, \n\t0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x6b, 0x69, 0x70, 0x28, 0x32, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, \n\t0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x20, \n\t0x70, 0x61, 0x74, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x74, 0x72, 0x79, \n\t0x28, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x61, 0x22, 0x20, 0x6f, 0x72, 0x20, \n\t0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x69, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x76, 0x61, 0x6c, \n\t0x69, 0x64, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x27, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x2e, 0x74, 0x79, \n\t0x70, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x27, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x5f, 0x4d, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x3d, 0x20, 0x67, \n\t0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x66, 0x6f, 0x72, 0x6d, 0x0a,\n\t0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x75, \n\t0x74, 0x28, 0x75, 0x2c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x75, 0x74, 0x74, 0x20, 0x3d, 0x20, 0x67, \n\t0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x75, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x70, 0x75, 0x74, 0x74, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, \n\t0x6c, 0x74, 0x6e, 0x31, 0x32, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, \n\t0x67, 0x28, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x70, 0x75, 0x74, 0x28, 0x70, 0x75, \n\t0x74, 0x74, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x5f, 0x4d, 0x2e, 0x70, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x70, 0x72, \n\t0x6f, 0x74, 0x65, 0x63, 0x74, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x70, 0x75, 0x74, \n\t0x74, 0x2c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x70, \n\t0x75, 0x74, 0x74, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x74, \n\t0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x70, 0x75, 0x74, 0x28, 0x70, 0x75, \n\t0x74, 0x74, 0x2c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x70, \n\t0x75, 0x74, 0x28, 0x70, 0x75, 0x74, 0x74, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x29, 0x0a,\n\t0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x67, 0x65, \n\t0x74, 0x28, 0x67, 0x65, 0x74, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x74, 0x20, 0x3d, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, \n\t0x65, 0x28, 0x67, 0x65, 0x74, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x67, 0x65, 0x74, \n\t0x74, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x22, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x68, \n\t0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x5f, 0x4d, 0x2e, 0x6f, \n\t0x70, 0x65, 0x6e, 0x28, 0x67, 0x65, 0x74, 0x74, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x67, 0x65, 0x74, \n\t0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, \n\t0x65, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x3a, 0x67, 0x72, 0x65, 0x65, 0x74, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x3a, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x28, 0x67, 0x65, 0x74, 0x74, 0x2e, 0x75, \n\t0x73, 0x65, 0x72, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x74, 0x2e, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x67, 0x65, 0x74, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x74, \n\t0x68, 0x65, 0x6e, 0x20, 0x66, 0x3a, 0x74, 0x79, 0x70, 0x65, 0x28, 0x67, 0x65, 0x74, 0x74, 0x2e, 0x74, 0x79, \n\t0x70, 0x65, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x3a, 0x65, 0x70, 0x73, 0x76, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x28, 0x67, 0x65, 0x74, 0x74, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x3a, 0x71, 0x75, 0x69, 0x74, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, \n\t0x28, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x67, 0x65, \n\t0x74, 0x28, 0x75, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x65, 0x74, 0x74, 0x20, 0x3d, 0x20, 0x67, \n\t0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x75, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x74, 0x2e, 0x73, 0x69, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x6c, 0x74, \n\t0x6e, 0x31, 0x32, 0x2e, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x74, 0x67, 0x65, 0x74, 0x28, 0x67, 0x65, 0x74, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, \n\t0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x74, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x5f, 0x4d, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, \n\t0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, \n\t0x28, 0x63, 0x6d, 0x64, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x63, 0x6d, 0x64, 0x74, 0x20, 0x3d, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, \n\t0x65, 0x28, 0x63, 0x6d, 0x64, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x63, 0x6d, 0x64, \n\t0x74, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x22, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x68, \n\t0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x63, 0x6d, 0x64, \n\t0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2c, 0x20, 0x22, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, \n\t0x67, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x5f, 0x4d, 0x2e, 0x6f, \n\t0x70, 0x65, 0x6e, 0x28, 0x63, 0x6d, 0x64, 0x74, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x63, 0x6d, 0x64, \n\t0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x2c, 0x20, 0x63, 0x6d, 0x64, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, \n\t0x65, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x3a, 0x67, 0x72, 0x65, 0x65, 0x74, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x3a, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x28, 0x63, 0x6d, 0x64, 0x74, 0x2e, 0x75, \n\t0x73, 0x65, 0x72, 0x2c, 0x20, 0x63, 0x6d, 0x64, 0x74, 0x2e, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x63, 0x6d, 0x64, 0x74, 0x2e, 0x63, \n\t0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, \n\t0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x75, \n\t0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6d, 0x64, 0x74, 0x2e, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, \n\t0x6e, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x65, 0x63, \n\t0x6b, 0x20, 0x3d, 0x20, 0x63, 0x6d, 0x64, 0x74, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x6f, 0x72, 0x20, \n\t0x7b, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x63, 0x6d, 0x64, 0x20, \n\t0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x63, 0x6d, 0x64, 0x74, 0x2e, 0x63, 0x6f, 0x6d, \n\t0x6d, 0x61, 0x6e, 0x64, 0x29, 0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, \n\t0x66, 0x2e, 0x74, 0x70, 0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x63, 0x6d, 0x64, 0x2c, 0x20, \n\t0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5b, 0x69, 0x5d, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x68, 0x65, \n\t0x63, 0x6b, 0x5b, 0x69, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x66, \n\t0x2e, 0x74, 0x70, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5b, 0x69, 0x5d, \n\t0x29, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x66, 0x2e, 0x74, 0x70, \n\t0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x63, 0x6d, 0x64, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, \n\t0x61, 0x6e, 0x64, 0x2c, 0x20, 0x63, 0x6d, 0x64, 0x74, 0x2e, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, \n\t0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6d, 0x64, 0x74, 0x2e, 0x63, 0x68, \n\t0x65, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x66, 0x2e, 0x74, \n\t0x70, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x63, 0x6d, 0x64, 0x74, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, \n\t0x29, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x3a, 0x71, 0x75, 0x69, 0x74, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, \n\t0x28, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x29, 0x0a,\n\t0x0a,\n\t0x5f, 0x4d, 0x2e, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x70, 0x72, \n\t0x6f, 0x74, 0x65, 0x63, 0x74, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x67, 0x65, 0x74, \n\t0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x67, \n\t0x65, 0x74, 0x74, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x74, \n\t0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x67, 0x65, 0x74, 0x28, 0x67, 0x65, \n\t0x74, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x67, \n\t0x65, 0x74, 0x28, 0x67, 0x65, 0x74, 0x74, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x29, 0x0a,\n\t0x0a,\n\t0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x4d, 0x0a,\n}; // [ftp.lua]\n} // love\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/headers.lua",
    "content": "-----------------------------------------------------------------------------\n-- Canonic header field capitalization\n-- LuaSocket toolkit.\n-- Author: Diego Nehab\n-----------------------------------------------------------------------------\nlocal socket = require(\"socket\")\nsocket.headers = {}\nlocal _M = socket.headers\n\n_M.canonic = {\n    [\"accept\"] = \"Accept\",\n    [\"accept-charset\"] = \"Accept-Charset\",\n    [\"accept-encoding\"] = \"Accept-Encoding\",\n    [\"accept-language\"] = \"Accept-Language\",\n    [\"accept-ranges\"] = \"Accept-Ranges\",\n    [\"action\"] = \"Action\",\n    [\"alternate-recipient\"] = \"Alternate-Recipient\",\n    [\"age\"] = \"Age\",\n    [\"allow\"] = \"Allow\",\n    [\"arrival-date\"] = \"Arrival-Date\",\n    [\"authorization\"] = \"Authorization\",\n    [\"bcc\"] = \"Bcc\",\n    [\"cache-control\"] = \"Cache-Control\",\n    [\"cc\"] = \"Cc\",\n    [\"comments\"] = \"Comments\",\n    [\"connection\"] = \"Connection\",\n    [\"content-description\"] = \"Content-Description\",\n    [\"content-disposition\"] = \"Content-Disposition\",\n    [\"content-encoding\"] = \"Content-Encoding\",\n    [\"content-id\"] = \"Content-ID\",\n    [\"content-language\"] = \"Content-Language\",\n    [\"content-length\"] = \"Content-Length\",\n    [\"content-location\"] = \"Content-Location\",\n    [\"content-md5\"] = \"Content-MD5\",\n    [\"content-range\"] = \"Content-Range\",\n    [\"content-transfer-encoding\"] = \"Content-Transfer-Encoding\",\n    [\"content-type\"] = \"Content-Type\",\n    [\"cookie\"] = \"Cookie\",\n    [\"date\"] = \"Date\",\n    [\"diagnostic-code\"] = \"Diagnostic-Code\",\n    [\"dsn-gateway\"] = \"DSN-Gateway\",\n    [\"etag\"] = \"ETag\",\n    [\"expect\"] = \"Expect\",\n    [\"expires\"] = \"Expires\",\n    [\"final-log-id\"] = \"Final-Log-ID\",\n    [\"final-recipient\"] = \"Final-Recipient\",\n    [\"from\"] = \"From\",\n    [\"host\"] = \"Host\",\n    [\"if-match\"] = \"If-Match\",\n    [\"if-modified-since\"] = \"If-Modified-Since\",\n    [\"if-none-match\"] = \"If-None-Match\",\n    [\"if-range\"] = \"If-Range\",\n    [\"if-unmodified-since\"] = \"If-Unmodified-Since\",\n    [\"in-reply-to\"] = \"In-Reply-To\",\n    [\"keywords\"] = \"Keywords\",\n    [\"last-attempt-date\"] = \"Last-Attempt-Date\",\n    [\"last-modified\"] = \"Last-Modified\",\n    [\"location\"] = \"Location\",\n    [\"max-forwards\"] = \"Max-Forwards\",\n    [\"message-id\"] = \"Message-ID\",\n    [\"mime-version\"] = \"MIME-Version\",\n    [\"original-envelope-id\"] = \"Original-Envelope-ID\",\n    [\"original-recipient\"] = \"Original-Recipient\",\n    [\"pragma\"] = \"Pragma\",\n    [\"proxy-authenticate\"] = \"Proxy-Authenticate\",\n    [\"proxy-authorization\"] = \"Proxy-Authorization\",\n    [\"range\"] = \"Range\",\n    [\"received\"] = \"Received\",\n    [\"received-from-mta\"] = \"Received-From-MTA\",\n    [\"references\"] = \"References\",\n    [\"referer\"] = \"Referer\",\n    [\"remote-mta\"] = \"Remote-MTA\",\n    [\"reply-to\"] = \"Reply-To\",\n    [\"reporting-mta\"] = \"Reporting-MTA\",\n    [\"resent-bcc\"] = \"Resent-Bcc\",\n    [\"resent-cc\"] = \"Resent-Cc\",\n    [\"resent-date\"] = \"Resent-Date\",\n    [\"resent-from\"] = \"Resent-From\",\n    [\"resent-message-id\"] = \"Resent-Message-ID\",\n    [\"resent-reply-to\"] = \"Resent-Reply-To\",\n    [\"resent-sender\"] = \"Resent-Sender\",\n    [\"resent-to\"] = \"Resent-To\",\n    [\"retry-after\"] = \"Retry-After\",\n    [\"return-path\"] = \"Return-Path\",\n    [\"sender\"] = \"Sender\",\n    [\"server\"] = \"Server\",\n    [\"smtp-remote-recipient\"] = \"SMTP-Remote-Recipient\",\n    [\"status\"] = \"Status\",\n    [\"subject\"] = \"Subject\",\n    [\"te\"] = \"TE\",\n    [\"to\"] = \"To\",\n    [\"trailer\"] = \"Trailer\",\n    [\"transfer-encoding\"] = \"Transfer-Encoding\",\n    [\"upgrade\"] = \"Upgrade\",\n    [\"user-agent\"] = \"User-Agent\",\n    [\"vary\"] = \"Vary\",\n    [\"via\"] = \"Via\",\n    [\"warning\"] = \"Warning\",\n    [\"will-retry-until\"] = \"Will-Retry-Until\",\n    [\"www-authenticate\"] = \"WWW-Authenticate\",\n    [\"x-mailer\"] = \"X-Mailer\",\n}\n\nreturn _M"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/headers.lua.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n * \n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n * \n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n * \n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\nnamespace love\n{\n\n// [headers.lua]\nconst unsigned char headers_lua[] = \n{\n\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x43, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, \n\t0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x63, 0x61, 0x70, 0x69, 0x74, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, \n\t0x6f, 0x6e, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x4c, 0x75, 0x61, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0x6b, \n\t0x69, 0x74, 0x2e, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x3a, 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x20, 0x4e, \n\t0x65, 0x68, 0x61, 0x62, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, \n\t0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x29, 0x0a,\n\t0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, \n\t0x7d, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x4d, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, \n\t0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x0a,\n\t0x0a,\n\t0x5f, 0x4d, 0x2e, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x20, 0x3d, 0x20, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, \n\t0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x73, \n\t0x65, 0x74, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x43, 0x68, 0x61, \n\t0x72, 0x73, 0x65, 0x74, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, \n\t0x69, 0x6e, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x45, 0x6e, \n\t0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x6c, 0x61, 0x6e, 0x67, 0x75, \n\t0x61, 0x67, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x4c, 0x61, \n\t0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x72, 0x61, 0x6e, 0x67, 0x65, \n\t0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x52, 0x61, 0x6e, 0x67, \n\t0x65, 0x73, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, \n\t0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x2d, 0x72, 0x65, \n\t0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x41, 0x6c, 0x74, 0x65, 0x72, \n\t0x6e, 0x61, 0x74, 0x65, 0x2d, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x61, 0x67, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x41, 0x67, 0x65, \n\t0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x41, \n\t0x6c, 0x6c, 0x6f, 0x77, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x61, 0x72, 0x72, 0x69, 0x76, 0x61, 0x6c, 0x2d, 0x64, 0x61, 0x74, 0x65, \n\t0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x41, 0x72, 0x72, 0x69, 0x76, 0x61, 0x6c, 0x2d, 0x44, 0x61, 0x74, 0x65, \n\t0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, \n\t0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, \n\t0x6f, 0x6e, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x62, 0x63, 0x63, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x42, 0x63, 0x63, \n\t0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, \n\t0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2d, 0x43, 0x6f, 0x6e, 0x74, 0x72, \n\t0x6f, 0x6c, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x63, 0x63, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x43, 0x63, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x5d, 0x20, 0x3d, \n\t0x20, 0x22, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5d, \n\t0x20, 0x3d, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x64, 0x65, 0x73, 0x63, \n\t0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, \n\t0x6e, 0x74, 0x2d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x64, 0x69, 0x73, 0x70, \n\t0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, \n\t0x6e, 0x74, 0x2d, 0x44, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x65, 0x6e, 0x63, 0x6f, \n\t0x64, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, \n\t0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x69, 0x64, 0x22, 0x5d, \n\t0x20, 0x3d, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x49, 0x44, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x61, 0x6e, 0x67, \n\t0x75, 0x61, 0x67, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, \n\t0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x65, 0x6e, 0x67, \n\t0x74, 0x68, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x4c, 0x65, \n\t0x6e, 0x67, 0x74, 0x68, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x6f, 0x63, 0x61, \n\t0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, \n\t0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x6d, 0x64, 0x35, 0x22, \n\t0x5d, 0x20, 0x3d, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x4d, 0x44, 0x35, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x72, 0x61, 0x6e, 0x67, \n\t0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x52, 0x61, 0x6e, \n\t0x67, 0x65, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x72, 0x61, 0x6e, \n\t0x73, 0x66, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, \n\t0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2d, \n\t0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, \n\t0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70, 0x65, \n\t0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, \n\t0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x64, 0x61, 0x74, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x44, 0x61, \n\t0x74, 0x65, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x2d, 0x63, \n\t0x6f, 0x64, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, \n\t0x63, 0x2d, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x64, 0x73, 0x6e, 0x2d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x22, \n\t0x5d, 0x20, 0x3d, 0x20, 0x22, 0x44, 0x53, 0x4e, 0x2d, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x65, 0x74, 0x61, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x45, 0x54, \n\t0x61, 0x67, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, \n\t0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, \n\t0x22, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x2d, 0x6c, 0x6f, 0x67, 0x2d, 0x69, 0x64, \n\t0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x2d, 0x4c, 0x6f, 0x67, 0x2d, 0x49, 0x44, \n\t0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x2d, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, \n\t0x65, 0x6e, 0x74, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x2d, 0x52, 0x65, 0x63, \n\t0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x66, 0x72, 0x6f, 0x6d, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x46, 0x72, \n\t0x6f, 0x6d, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x68, 0x6f, 0x73, 0x74, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x48, 0x6f, \n\t0x73, 0x74, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x69, 0x66, 0x2d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0x5d, 0x20, 0x3d, \n\t0x20, 0x22, 0x49, 0x66, 0x2d, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x69, 0x66, 0x2d, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2d, \n\t0x73, 0x69, 0x6e, 0x63, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x49, 0x66, 0x2d, 0x4d, 0x6f, 0x64, 0x69, \n\t0x66, 0x69, 0x65, 0x64, 0x2d, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x69, 0x66, 0x2d, 0x6e, 0x6f, 0x6e, 0x65, 0x2d, 0x6d, 0x61, 0x74, 0x63, \n\t0x68, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x49, 0x66, 0x2d, 0x4e, 0x6f, 0x6e, 0x65, 0x2d, 0x4d, 0x61, 0x74, \n\t0x63, 0x68, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x69, 0x66, 0x2d, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x5d, 0x20, 0x3d, \n\t0x20, 0x22, 0x49, 0x66, 0x2d, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x69, 0x66, 0x2d, 0x75, 0x6e, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, \n\t0x64, 0x2d, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x49, 0x66, 0x2d, 0x55, 0x6e, \n\t0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2d, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x69, 0x6e, 0x2d, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x2d, 0x74, 0x6f, 0x22, \n\t0x5d, 0x20, 0x3d, 0x20, 0x22, 0x49, 0x6e, 0x2d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2d, 0x54, 0x6f, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x22, 0x5d, 0x20, 0x3d, \n\t0x20, 0x22, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, \n\t0x2d, 0x64, 0x61, 0x74, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x4c, 0x61, 0x73, 0x74, 0x2d, 0x41, 0x74, \n\t0x74, 0x65, 0x6d, 0x70, 0x74, 0x2d, 0x44, 0x61, 0x74, 0x65, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, \n\t0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x4c, 0x61, 0x73, 0x74, 0x2d, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, \n\t0x65, 0x64, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x20, 0x3d, \n\t0x20, 0x22, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x78, 0x2d, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x73, \n\t0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x2d, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x73, \n\t0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2d, 0x69, 0x64, 0x22, 0x5d, \n\t0x20, 0x3d, 0x20, 0x22, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2d, 0x49, 0x44, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x6d, 0x69, 0x6d, 0x65, 0x2d, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, \n\t0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x4d, 0x49, 0x4d, 0x45, 0x2d, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, \n\t0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x2d, 0x65, 0x6e, 0x76, \n\t0x65, 0x6c, 0x6f, 0x70, 0x65, 0x2d, 0x69, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x4f, 0x72, 0x69, 0x67, \n\t0x69, 0x6e, 0x61, 0x6c, 0x2d, 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x2d, 0x49, 0x44, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x2d, 0x72, 0x65, 0x63, \n\t0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, \n\t0x61, 0x6c, 0x2d, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, \n\t0x50, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, \n\t0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2d, \n\t0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, \n\t0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x78, 0x79, \n\t0x2d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x52, \n\t0x61, 0x6e, 0x67, 0x65, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x22, 0x5d, 0x20, 0x3d, \n\t0x20, 0x22, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x2d, 0x66, 0x72, 0x6f, \n\t0x6d, 0x2d, 0x6d, 0x74, 0x61, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, \n\t0x64, 0x2d, 0x46, 0x72, 0x6f, 0x6d, 0x2d, 0x4d, 0x54, 0x41, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x5d, \n\t0x20, 0x3d, 0x20, 0x22, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, \n\t0x22, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x72, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2d, 0x6d, 0x74, 0x61, 0x22, 0x5d, \n\t0x20, 0x3d, 0x20, 0x22, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2d, 0x4d, 0x54, 0x41, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x2d, 0x74, 0x6f, 0x22, 0x5d, 0x20, 0x3d, \n\t0x20, 0x22, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2d, 0x54, 0x6f, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2d, 0x6d, 0x74, \n\t0x61, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2d, 0x4d, \n\t0x54, 0x41, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x2d, 0x62, 0x63, 0x63, 0x22, 0x5d, \n\t0x20, 0x3d, 0x20, 0x22, 0x52, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x2d, 0x42, 0x63, 0x63, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x2d, 0x63, 0x63, 0x22, 0x5d, 0x20, \n\t0x3d, 0x20, 0x22, 0x52, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x2d, 0x43, 0x63, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x2d, 0x64, 0x61, 0x74, 0x65, 0x22, \n\t0x5d, 0x20, 0x3d, 0x20, 0x22, 0x52, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x2d, 0x44, 0x61, 0x74, 0x65, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x2d, 0x66, 0x72, 0x6f, 0x6d, 0x22, \n\t0x5d, 0x20, 0x3d, 0x20, 0x22, 0x52, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x2d, 0x46, 0x72, 0x6f, 0x6d, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x2d, 0x6d, 0x65, 0x73, 0x73, 0x61, \n\t0x67, 0x65, 0x2d, 0x69, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x52, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x2d, \n\t0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2d, 0x49, 0x44, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x2d, 0x72, 0x65, 0x70, 0x6c, 0x79, \n\t0x2d, 0x74, 0x6f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x52, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x2d, 0x52, 0x65, \n\t0x70, 0x6c, 0x79, 0x2d, 0x54, 0x6f, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x2d, 0x73, 0x65, 0x6e, 0x64, 0x65, \n\t0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x52, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x2d, 0x53, 0x65, 0x6e, 0x64, \n\t0x65, 0x72, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x6f, 0x22, 0x5d, 0x20, \n\t0x3d, 0x20, 0x22, 0x52, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x2d, 0x54, 0x6f, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x72, 0x65, 0x74, 0x72, 0x79, 0x2d, 0x61, 0x66, 0x74, 0x65, 0x72, 0x22, \n\t0x5d, 0x20, 0x3d, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x79, 0x2d, 0x41, 0x66, 0x74, 0x65, 0x72, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2d, 0x70, 0x61, 0x74, 0x68, 0x22, \n\t0x5d, 0x20, 0x3d, 0x20, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2d, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, \n\t0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, \n\t0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x73, 0x6d, 0x74, 0x70, 0x2d, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2d, \n\t0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x53, 0x4d, 0x54, \n\t0x50, 0x2d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2d, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, \n\t0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, \n\t0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x5d, 0x20, 0x3d, 0x20, \n\t0x22, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x74, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x54, 0x45, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x74, 0x6f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x54, 0x6f, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, \n\t0x22, 0x54, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x63, \n\t0x6f, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, \n\t0x72, 0x2d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, \n\t0x22, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x75, 0x73, 0x65, 0x72, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, 0x5d, \n\t0x20, 0x3d, 0x20, 0x22, 0x55, 0x73, 0x65, 0x72, 0x2d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x76, 0x61, 0x72, 0x79, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x56, 0x61, \n\t0x72, 0x79, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x76, 0x69, 0x61, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x56, 0x69, 0x61, \n\t0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, \n\t0x22, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x77, 0x69, 0x6c, 0x6c, 0x2d, 0x72, 0x65, 0x74, 0x72, 0x79, 0x2d, 0x75, \n\t0x6e, 0x74, 0x69, 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x57, 0x69, 0x6c, 0x6c, 0x2d, 0x52, 0x65, 0x74, \n\t0x72, 0x79, 0x2d, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x77, 0x77, 0x77, 0x2d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, \n\t0x63, 0x61, 0x74, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x57, 0x57, 0x57, 0x2d, 0x41, 0x75, 0x74, 0x68, \n\t0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x78, 0x2d, 0x6d, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x22, 0x5d, 0x20, 0x3d, \n\t0x20, 0x22, 0x58, 0x2d, 0x4d, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x22, 0x2c, 0x0a,\n\t0x7d, 0x0a,\n\t0x0a,\n\t0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x4d, 0x0a,\n}; // [headers.lua]\n} // love\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/http.lua",
    "content": "-----------------------------------------------------------------------------\n-- HTTP/1.1 client support for the Lua language.\n-- LuaSocket toolkit.\n-- Author: Diego Nehab\n-----------------------------------------------------------------------------\n\n-----------------------------------------------------------------------------\n-- Declare module and import dependencies\n-------------------------------------------------------------------------------\nlocal socket = require(\"socket\")\nlocal url = require(\"socket.url\")\nlocal ltn12 = require(\"ltn12\")\nlocal mime = require(\"mime\")\nlocal string = require(\"string\")\nlocal headers = require(\"socket.headers\")\nlocal base = _G\nlocal table = require(\"table\")\nsocket.http = {}\nlocal _M = socket.http\n\n-----------------------------------------------------------------------------\n-- Program constants\n-----------------------------------------------------------------------------\n-- connection timeout in seconds\n_M.TIMEOUT = 60\n-- user agent field sent in request\n_M.USERAGENT = socket._VERSION\n\n-- supported schemes and their particulars\nlocal SCHEMES = {\n    http = {\n        port = 80\n        , create = function(t)\n            return socket.tcp end }\n    , https = {\n        port = 443\n        , create = function(t)\n          local https = assert(\n            require(\"ssl.https\"), 'LuaSocket: LuaSec not found')\n          local tcp = assert(\n            https.tcp, 'LuaSocket: Function tcp() not available from LuaSec')\n          return tcp(t) end }}\n\n-----------------------------------------------------------------------------\n-- Reads MIME headers from a connection, unfolding where needed\n-----------------------------------------------------------------------------\nlocal function receiveheaders(sock, headers)\n    local line, name, value, err\n    headers = headers or {}\n    -- get first line\n    line, err = sock:receive()\n    if err then return nil, err end\n    -- headers go until a blank line is found\n    while line ~= \"\" do\n        -- get field-name and value\n        name, value = socket.skip(2, string.find(line, \"^(.-):%s*(.*)\"))\n        if not (name and value) then return nil, \"malformed response headers\" end\n        name = string.lower(name)\n        -- get next line (value might be folded)\n        line, err  = sock:receive()\n        if err then return nil, err end\n        -- unfold any folded values\n        while string.find(line, \"^%s\") do\n            value = value .. line\n            line, err = sock:receive()\n            if err then return nil, err end\n        end\n        -- save pair in table\n        if headers[name] then headers[name] = headers[name] .. \", \" .. value\n        else headers[name] = value end\n    end\n    return headers\nend\n\n-----------------------------------------------------------------------------\n-- Extra sources and sinks\n-----------------------------------------------------------------------------\nsocket.sourcet[\"http-chunked\"] = function(sock, headers)\n    return base.setmetatable({\n        getfd = function() return sock:getfd() end,\n        dirty = function() return sock:dirty() end\n    }, {\n        __call = function()\n            -- get chunk size, skip extension\n            local line, err = sock:receive()\n            if err then return nil, err end\n            local size = base.tonumber(string.gsub(line, \";.*\", \"\"), 16)\n            if not size then return nil, \"invalid chunk size\" end\n            -- was it the last chunk?\n            if size > 0 then\n                -- if not, get chunk and skip terminating CRLF\n                local chunk, err, _ = sock:receive(size)\n                if chunk then sock:receive() end\n                return chunk, err\n            else\n                -- if it was, read trailers into headers table\n                headers, err = receiveheaders(sock, headers)\n                if not headers then return nil, err end\n            end\n        end\n    })\nend\n\nsocket.sinkt[\"http-chunked\"] = function(sock)\n    return base.setmetatable({\n        getfd = function() return sock:getfd() end,\n        dirty = function() return sock:dirty() end\n    }, {\n        __call = function(self, chunk, err)\n            if not chunk then return sock:send(\"0\\r\\n\\r\\n\") end\n            local size = string.format(\"%X\\r\\n\", string.len(chunk))\n            return sock:send(size ..  chunk .. \"\\r\\n\")\n        end\n    })\nend\n\n-----------------------------------------------------------------------------\n-- Low level HTTP API\n-----------------------------------------------------------------------------\nlocal metat = { __index = {} }\n\nfunction _M.open(host, port, create)\n    -- create socket with user connect function, or with default\n    local c = socket.try(create())\n    local h = base.setmetatable({ c = c }, metat)\n    -- create finalized try\n    h.try = socket.newtry(function() h:close() end)\n    -- set timeout before connecting\n    h.try(c:settimeout(_M.TIMEOUT))\n    h.try(c:connect(host, port))\n    -- here everything worked\n    return h\nend\n\nfunction metat.__index:sendrequestline(method, uri)\n    local reqline = string.format(\"%s %s HTTP/1.1\\r\\n\", method or \"GET\", uri)\n    return self.try(self.c:send(reqline))\nend\n\nfunction metat.__index:sendheaders(tosend)\n    local canonic = headers.canonic\n    local h = \"\\r\\n\"\n    for f, v in base.pairs(tosend) do\n        h = (canonic[f] or f) .. \": \" .. v .. \"\\r\\n\" .. h\n    end\n    self.try(self.c:send(h))\n    return 1\nend\n\nfunction metat.__index:sendbody(headers, source, step)\n    source = source or ltn12.source.empty()\n    step = step or ltn12.pump.step\n    -- if we don't know the size in advance, send chunked and hope for the best\n    local mode = \"http-chunked\"\n    if headers[\"content-length\"] then mode = \"keep-open\" end\n    return self.try(ltn12.pump.all(source, socket.sink(mode, self.c), step))\nend\n\nfunction metat.__index:receivestatusline()\n    local status,ec = self.try(self.c:receive(5))\n    -- identify HTTP/0.9 responses, which do not contain a status line\n    -- this is just a heuristic, but is what the RFC recommends\n    if status ~= \"HTTP/\" then\n        if ec == \"timeout\" then\n            return 408\n        end\n        return nil, status\n    end\n    -- otherwise proceed reading a status line\n    status = self.try(self.c:receive(\"*l\", status))\n    local code = socket.skip(2, string.find(status, \"HTTP/%d*%.%d* (%d%d%d)\"))\n    return self.try(base.tonumber(code), status)\nend\n\nfunction metat.__index:receiveheaders()\n    return self.try(receiveheaders(self.c))\nend\n\nfunction metat.__index:receivebody(headers, sink, step)\n    sink = sink or ltn12.sink.null()\n    step = step or ltn12.pump.step\n    local length = base.tonumber(headers[\"content-length\"])\n    local t = headers[\"transfer-encoding\"] -- shortcut\n    local mode = \"default\" -- connection close\n    if t and t ~= \"identity\" then mode = \"http-chunked\"\n    elseif base.tonumber(headers[\"content-length\"]) then mode = \"by-length\" end\n    return self.try(ltn12.pump.all(socket.source(mode, self.c, length),\n        sink, step))\nend\n\nfunction metat.__index:receive09body(status, sink, step)\n    local source = ltn12.source.rewind(socket.source(\"until-closed\", self.c))\n    source(status)\n    return self.try(ltn12.pump.all(source, sink, step))\nend\n\nfunction metat.__index:close()\n    return self.c:close()\nend\n\n-----------------------------------------------------------------------------\n-- High level HTTP API\n-----------------------------------------------------------------------------\nlocal function adjusturi(reqt)\n    local u = reqt\n    -- if there is a proxy, we need the full url. otherwise, just a part.\n    if not reqt.proxy and not _M.PROXY then\n        u = {\n           path = socket.try(reqt.path, \"invalid path 'nil'\"),\n           params = reqt.params,\n           query = reqt.query,\n           fragment = reqt.fragment\n        }\n    end\n    return url.build(u)\nend\n\nlocal function adjustproxy(reqt)\n    local proxy = reqt.proxy or _M.PROXY\n    if proxy then\n        proxy = url.parse(proxy)\n        proxy.port = proxy.port or 3128\n        proxy.create = SCHEMES[proxy.scheme].create(reqt)\n        return proxy.host, proxy.port, proxy.create\n    else\n        return reqt.host, reqt.port, reqt.create\n    end\nend\n\nlocal function adjustheaders(reqt)\n    -- default headers\n    local host = reqt.host\n    local port = tostring(reqt.port)\n    if port ~= tostring(SCHEMES[reqt.scheme].port) then\n        host = host .. ':' .. port end\n    local lower = {\n        [\"user-agent\"] = _M.USERAGENT,\n        [\"host\"] = host,\n        [\"connection\"] = \"close, TE\",\n        [\"te\"] = \"trailers\"\n    }\n    -- if we have authentication information, pass it along\n    if reqt.user and reqt.password then\n        lower[\"authorization\"] =\n            \"Basic \" ..  (mime.b64(reqt.user .. \":\" ..\n\t\turl.unescape(reqt.password)))\n    end\n    -- if we have proxy authentication information, pass it along\n    local proxy = reqt.proxy or _M.PROXY\n    if proxy then\n        proxy = url.parse(proxy)\n        if proxy.user and proxy.password then\n            lower[\"proxy-authorization\"] =\n                \"Basic \" ..  (mime.b64(proxy.user .. \":\" .. proxy.password))\n        end\n    end\n    -- override with user headers\n    for i,v in base.pairs(reqt.headers or lower) do\n        lower[string.lower(i)] = v\n    end\n    return lower\nend\n\n-- default url parts\nlocal default = {\n    path =\"/\"\n    , scheme = \"http\"\n}\n\nlocal function adjustrequest(reqt)\n    -- parse url if provided\n    local nreqt = reqt.url and url.parse(reqt.url, default) or {}\n    -- explicit components override url\n    for i,v in base.pairs(reqt) do nreqt[i] = v end\n    -- default to scheme particulars\n    local schemedefs, host, port, method\n        = SCHEMES[nreqt.scheme], nreqt.host, nreqt.port, nreqt.method\n    if not nreqt.create then nreqt.create = schemedefs.create(nreqt) end\n    if not (port and port ~= '') then nreqt.port = schemedefs.port end\n    if not (method and method ~= '') then nreqt.method = 'GET' end\n    if not (host and host ~= \"\") then\n        socket.try(nil, \"invalid host '\" .. base.tostring(nreqt.host) .. \"'\")\n    end\n    -- compute uri if user hasn't overridden\n    nreqt.uri = reqt.uri or adjusturi(nreqt)\n    -- adjust headers in request\n    nreqt.headers = adjustheaders(nreqt)\n    if nreqt.source\n        and not nreqt.headers[\"content-length\"]\n        and not nreqt.headers[\"transfer-encoding\"]\n    then\n        nreqt.headers[\"transfer-encoding\"] = \"chunked\"\n    end\n\n    -- ajust host and port if there is a proxy\n    local proxy_create\n    nreqt.host, nreqt.port, proxy_create = adjustproxy(nreqt)\n    if not reqt.create then nreqt.create = proxy_create end\n\n    return nreqt\nend\n\nlocal function shouldredirect(reqt, code, headers)\n    local location = headers.location\n    if not location then return false end\n    location = string.gsub(location, \"%s\", \"\")\n    if location == \"\" then return false end\n    -- the RFC says the redirect URL may be relative\n    location = url.absolute(reqt.url, location)\n    local scheme = url.parse(location).scheme\n    if scheme and (not SCHEMES[scheme]) then return false end\n    -- avoid https downgrades\n    if ('https' == reqt.scheme) and ('https' ~= scheme) then return false end\n    return (reqt.redirect ~= false) and\n           (code == 301 or code == 302 or code == 303 or code == 307) and\n           (not reqt.method or reqt.method == \"GET\" or reqt.method == \"HEAD\")\n        and ((false == reqt.maxredirects)\n                or ((reqt.nredirects or 0)\n                        < (reqt.maxredirects or 5)))\nend\n\nlocal function shouldreceivebody(reqt, code)\n    if reqt.method == \"HEAD\" then return nil end\n    if code == 204 or code == 304 then return nil end\n    if code >= 100 and code < 200 then return nil end\n    return 1\nend\n\n-- forward declarations\nlocal trequest, tredirect\n\n--[[local]] function tredirect(reqt, location)\n    -- the RFC says the redirect URL may be relative\n    local newurl = url.absolute(reqt.url, location)\n    -- if switching schemes, reset port and create function\n    if url.parse(newurl).scheme ~= reqt.scheme then\n        reqt.port = nil\n        reqt.create = nil end\n    -- make new request\n    local result, code, headers, status = trequest {\n        url = newurl,\n        source = reqt.source,\n        sink = reqt.sink,\n        headers = reqt.headers,\n        proxy = reqt.proxy,\n        maxredirects = reqt.maxredirects,\n        nredirects = (reqt.nredirects or 0) + 1,\n        create = reqt.create\n    }\n    -- pass location header back as a hint we redirected\n    headers = headers or {}\n    headers.location = headers.location or location\n    return result, code, headers, status\nend\n\n--[[local]] function trequest(reqt)\n    -- we loop until we get what we want, or\n    -- until we are sure there is no way to get it\n    local nreqt = adjustrequest(reqt)\n    local h = _M.open(nreqt.host, nreqt.port, nreqt.create)\n    -- send request line and headers\n    h:sendrequestline(nreqt.method, nreqt.uri)\n    h:sendheaders(nreqt.headers)\n    -- if there is a body, send it\n    if nreqt.source then\n        h:sendbody(nreqt.headers, nreqt.source, nreqt.step)\n    end\n    local code, status = h:receivestatusline()\n    -- if it is an HTTP/0.9 server, simply get the body and we are done\n    if not code then\n        h:receive09body(status, nreqt.sink, nreqt.step)\n        return 1, 200\n    elseif code == 408 then\n        return 1, code\n    end\n    local headers\n    -- ignore any 100-continue messages\n    while code == 100 do\n        h:receiveheaders()\n        code, status = h:receivestatusline()\n    end\n    headers = h:receiveheaders()\n    -- at this point we should have a honest reply from the server\n    -- we can't redirect if we already used the source, so we report the error\n    if shouldredirect(nreqt, code, headers) and not nreqt.source then\n        h:close()\n        return tredirect(reqt, headers.location)\n    end\n    -- here we are finally done\n    if shouldreceivebody(nreqt, code) then\n        h:receivebody(headers, nreqt.sink, nreqt.step)\n    end\n    h:close()\n    return 1, code, headers, status\nend\n\n-- turns an url and a body into a generic request\nlocal function genericform(u, b)\n    local t = {}\n    local reqt = {\n        url = u,\n        sink = ltn12.sink.table(t),\n        target = t\n    }\n    if b then\n        reqt.source = ltn12.source.string(b)\n        reqt.headers = {\n            [\"content-length\"] = string.len(b),\n            [\"content-type\"] = \"application/x-www-form-urlencoded\"\n        }\n        reqt.method = \"POST\"\n    end\n    return reqt\nend\n\n_M.genericform = genericform\n\nlocal function srequest(u, b)\n    local reqt = genericform(u, b)\n    local _, code, headers, status = trequest(reqt)\n    return table.concat(reqt.target), code, headers, status\nend\n\n_M.request = socket.protect(function(reqt, body)\n    if base.type(reqt) == \"string\" then return srequest(reqt, body)\n    else return trequest(reqt) end\nend)\n\n_M.schemes = SCHEMES\nreturn _M\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/http.lua.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n * \n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n * \n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n * \n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\nnamespace love\n{\n\n// [http.lua]\nconst unsigned char http_lua[] = \n{\n\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, \n\t0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, \n\t0x75, 0x61, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x4c, 0x75, 0x61, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0x6b, \n\t0x69, 0x74, 0x2e, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x3a, 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x20, 0x4e, \n\t0x65, 0x68, 0x61, 0x62, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, \n\t0x61, 0x6e, 0x64, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, \n\t0x6e, 0x63, 0x69, 0x65, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, \n\t0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, \n\t0x65, 0x28, 0x22, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x75, 0x72, 0x6c, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, \n\t0x69, 0x72, 0x65, 0x28, 0x22, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, \n\t0x72, 0x65, 0x28, 0x22, 0x6d, 0x69, 0x6d, 0x65, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, \n\t0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, \n\t0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, \n\t0x65, 0x72, 0x73, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x47, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, \n\t0x69, 0x72, 0x65, 0x28, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x0a,\n\t0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x4d, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, \n\t0x68, 0x74, 0x74, 0x70, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, \n\t0x74, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x69, 0x6d, 0x65, \n\t0x6f, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x20, 0x3d, 0x20, 0x36, 0x30, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x69, 0x65, 0x6c, \n\t0x64, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x55, 0x53, 0x45, 0x52, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, \n\t0x6b, 0x65, 0x74, 0x2e, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, \n\t0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, \n\t0x63, 0x75, 0x6c, 0x61, 0x72, 0x73, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x53, 0x43, 0x48, 0x45, 0x4d, 0x45, 0x53, 0x20, 0x3d, 0x20, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x68, 0x74, 0x74, 0x70, 0x20, 0x3d, 0x20, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x38, 0x30, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x3d, \n\t0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, \n\t0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x74, 0x63, 0x70, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2c, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x34, 0x34, 0x33, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x3d, \n\t0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x74, \n\t0x74, 0x70, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, \n\t0x65, 0x28, 0x22, 0x73, 0x73, 0x6c, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x73, 0x22, 0x29, 0x2c, 0x20, 0x27, 0x4c, \n\t0x75, 0x61, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x3a, 0x20, 0x4c, 0x75, 0x61, 0x53, 0x65, 0x63, 0x20, 0x6e, \n\t0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x27, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x63, \n\t0x70, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x2e, \n\t0x74, 0x63, 0x70, 0x2c, 0x20, 0x27, 0x4c, 0x75, 0x61, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x3a, 0x20, 0x46, \n\t0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x63, 0x70, 0x28, 0x29, 0x20, 0x6e, 0x6f, 0x74, 0x20, \n\t0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x4c, 0x75, 0x61, \n\t0x53, 0x65, 0x63, 0x27, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, \n\t0x63, 0x70, 0x28, 0x74, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x7d, 0x7d, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x52, 0x65, 0x61, 0x64, 0x73, 0x20, 0x4d, 0x49, 0x4d, 0x45, 0x20, 0x68, 0x65, 0x61, 0x64, \n\t0x65, 0x72, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, \n\t0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x75, 0x6e, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68, 0x65, \n\t0x72, 0x65, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x63, \n\t0x65, 0x69, 0x76, 0x65, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x28, 0x73, 0x6f, 0x63, 0x6b, 0x2c, 0x20, \n\t0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x6e, 0x61, \n\t0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x68, 0x65, 0x61, 0x64, \n\t0x65, 0x72, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x67, 0x65, 0x74, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6c, \n\t0x69, 0x6e, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x6f, \n\t0x63, 0x6b, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x65, 0x72, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, \n\t0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x67, 0x6f, 0x20, \n\t0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x61, 0x20, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x20, 0x6c, 0x69, 0x6e, 0x65, \n\t0x20, 0x69, 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x7e, 0x3d, 0x20, \n\t0x22, 0x22, 0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x67, 0x65, 0x74, 0x20, 0x66, 0x69, 0x65, \n\t0x6c, 0x64, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, \n\t0x65, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x6b, 0x69, 0x70, 0x28, 0x32, 0x2c, \n\t0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x2c, \n\t0x20, 0x22, 0x5e, 0x28, 0x2e, 0x2d, 0x29, 0x3a, 0x25, 0x73, 0x2a, 0x28, 0x2e, 0x2a, 0x29, 0x22, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x6e, 0x61, \n\t0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, \n\t0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x22, 0x6d, 0x61, 0x6c, 0x66, \n\t0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x68, 0x65, 0x61, \n\t0x64, 0x65, 0x72, 0x73, 0x22, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, \n\t0x69, 0x6e, 0x67, 0x2e, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x67, 0x65, 0x74, 0x20, 0x6e, 0x65, 0x78, \n\t0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x69, 0x67, 0x68, \n\t0x74, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, \n\t0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x65, 0x72, 0x72, 0x20, 0x74, 0x68, 0x65, \n\t0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, \n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x75, 0x6e, 0x66, 0x6f, 0x6c, 0x64, 0x20, \n\t0x61, 0x6e, 0x79, 0x20, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, \n\t0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x22, 0x5e, 0x25, 0x73, \n\t0x22, 0x29, 0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, \n\t0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, \n\t0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, \n\t0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x65, 0x72, 0x72, \n\t0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, \n\t0x65, 0x72, 0x72, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x61, 0x76, 0x65, 0x20, 0x70, 0x61, \n\t0x69, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, \n\t0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, \n\t0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5b, \n\t0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x76, \n\t0x61, 0x6c, 0x75, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, \n\t0x72, 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x65, \n\t0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x45, 0x78, 0x74, 0x72, 0x61, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, 0x61, \n\t0x6e, 0x64, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x74, 0x5b, 0x22, 0x68, 0x74, \n\t0x74, 0x70, 0x2d, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x65, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, \n\t0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, \n\t0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x73, 0x65, \n\t0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, \n\t0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, \n\t0x63, 0x6b, 0x3a, 0x67, 0x65, 0x74, 0x66, 0x64, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x72, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x66, 0x75, \n\t0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, \n\t0x63, 0x6b, 0x3a, 0x64, 0x69, 0x72, 0x74, 0x79, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, \n\t0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x67, 0x65, 0x74, \n\t0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x73, 0x6b, 0x69, 0x70, 0x20, \n\t0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, \n\t0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x3a, 0x72, \n\t0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x65, 0x72, 0x72, \n\t0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, \n\t0x65, 0x72, 0x72, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, \n\t0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, \n\t0x65, 0x72, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x6c, 0x69, 0x6e, \n\t0x65, 0x2c, 0x20, 0x22, 0x3b, 0x2e, 0x2a, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x2c, 0x20, 0x31, 0x36, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, \n\t0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, \n\t0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x22, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x63, 0x68, 0x75, 0x6e, \n\t0x6b, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x77, 0x61, 0x73, \n\t0x20, 0x69, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, \n\t0x3f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x69, 0x7a, \n\t0x65, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, \n\t0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, \n\t0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x6b, 0x69, 0x70, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, \n\t0x69, 0x6e, 0x67, 0x20, 0x43, 0x52, 0x4c, 0x46, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, \n\t0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x2c, 0x20, 0x5f, 0x20, \n\t0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x28, 0x73, 0x69, 0x7a, \n\t0x65, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, \n\t0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x3a, 0x72, \n\t0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, \n\t0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, \n\t0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x77, 0x61, 0x73, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x74, \n\t0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, \n\t0x72, 0x73, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, \n\t0x61, 0x64, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, \n\t0x76, 0x65, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x28, 0x73, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x68, 0x65, \n\t0x61, 0x64, 0x65, 0x72, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, \n\t0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, \n\t0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x65, 0x6e, \n\t0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x69, 0x6e, 0x6b, 0x74, 0x5b, 0x22, 0x68, 0x74, 0x74, 0x70, \n\t0x2d, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x65, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, \n\t0x69, 0x6f, 0x6e, 0x28, 0x73, 0x6f, 0x63, 0x6b, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x73, 0x65, \n\t0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, \n\t0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, \n\t0x63, 0x6b, 0x3a, 0x67, 0x65, 0x74, 0x66, 0x64, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x72, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x66, 0x75, \n\t0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, \n\t0x63, 0x6b, 0x3a, 0x64, 0x69, 0x72, 0x74, 0x79, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, \n\t0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, \n\t0x6b, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, \n\t0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, \n\t0x20, 0x73, 0x6f, 0x63, 0x6b, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x28, 0x22, 0x30, 0x5c, 0x72, 0x5c, 0x6e, 0x5c, \n\t0x72, 0x5c, 0x6e, 0x22, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, \n\t0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, \n\t0x61, 0x74, 0x28, 0x22, 0x25, 0x58, 0x5c, 0x72, 0x5c, 0x6e, 0x22, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, \n\t0x67, 0x2e, 0x6c, 0x65, 0x6e, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, \n\t0x20, 0x73, 0x6f, 0x63, 0x6b, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2e, 0x2e, \n\t0x20, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x72, 0x5c, 0x6e, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x4c, 0x6f, 0x77, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, \n\t0x41, 0x50, 0x49, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x5f, 0x5f, \n\t0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x20, 0x7d, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x68, \n\t0x6f, 0x73, 0x74, 0x2c, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x2c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x73, 0x6f, 0x63, 0x6b, \n\t0x65, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, \n\t0x63, 0x74, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x77, 0x69, \n\t0x74, 0x68, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, \n\t0x65, 0x74, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x28, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x20, 0x3d, 0x20, 0x62, 0x61, 0x73, 0x65, \n\t0x2e, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x20, 0x63, 0x20, \n\t0x3d, 0x20, 0x63, 0x20, 0x7d, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x66, 0x69, 0x6e, 0x61, \n\t0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x74, 0x72, 0x79, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x68, 0x2e, 0x74, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, \n\t0x2e, 0x6e, 0x65, 0x77, 0x74, 0x72, 0x79, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, \n\t0x20, 0x68, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x65, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, \n\t0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x68, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x63, 0x3a, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6d, \n\t0x65, 0x6f, 0x75, 0x74, 0x28, 0x5f, 0x4d, 0x2e, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x68, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x63, 0x3a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, \n\t0x74, 0x28, 0x68, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x65, 0x76, 0x65, 0x72, 0x79, 0x74, \n\t0x68, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x6c, 0x69, \n\t0x6e, 0x65, 0x28, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2c, 0x20, 0x75, 0x72, 0x69, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x71, 0x6c, 0x69, 0x6e, 0x65, 0x20, \n\t0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, \n\t0x73, 0x20, 0x25, 0x73, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, 0x5c, 0x72, 0x5c, 0x6e, 0x22, \n\t0x2c, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x47, 0x45, 0x54, 0x22, 0x2c, \n\t0x20, 0x75, 0x72, 0x69, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, \n\t0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x28, 0x72, 0x65, 0x71, 0x6c, \n\t0x69, 0x6e, 0x65, 0x29, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x28, 0x74, \n\t0x6f, 0x73, 0x65, 0x6e, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x20, \n\t0x3d, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x72, 0x5c, \n\t0x6e, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x66, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x62, 0x61, \n\t0x73, 0x65, 0x2e, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x6f, 0x73, 0x65, 0x6e, 0x64, 0x29, 0x20, 0x64, \n\t0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x61, 0x6e, 0x6f, 0x6e, \n\t0x69, 0x63, 0x5b, 0x66, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x3a, 0x20, \n\t0x22, 0x20, 0x2e, 0x2e, 0x20, 0x76, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x72, 0x5c, 0x6e, 0x22, 0x20, 0x2e, \n\t0x2e, 0x20, 0x68, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x63, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x28, 0x68, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x62, 0x6f, 0x64, 0x79, 0x28, 0x68, 0x65, 0x61, 0x64, \n\t0x65, 0x72, 0x73, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x65, 0x70, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, \n\t0x65, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, \n\t0x65, 0x6d, 0x70, 0x74, 0x79, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x65, 0x70, 0x20, 0x6f, 0x72, \n\t0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x2e, 0x70, 0x75, 0x6d, 0x70, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x69, 0x66, 0x20, 0x77, 0x65, 0x20, 0x64, 0x6f, 0x6e, 0x27, 0x74, \n\t0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x69, 0x6e, 0x20, \n\t0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x2c, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x63, 0x68, 0x75, 0x6e, \n\t0x6b, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68, 0x6f, 0x70, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, \n\t0x68, 0x65, 0x20, 0x62, 0x65, 0x73, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x22, \n\t0x68, 0x74, 0x74, 0x70, 0x2d, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x65, 0x64, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5b, 0x22, 0x63, 0x6f, \n\t0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x5d, 0x20, 0x74, 0x68, 0x65, \n\t0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6b, 0x65, 0x65, 0x70, 0x2d, 0x6f, 0x70, 0x65, \n\t0x6e, 0x22, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, \n\t0x79, 0x28, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x2e, 0x70, 0x75, 0x6d, 0x70, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x73, \n\t0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x69, 0x6e, 0x6b, \n\t0x28, 0x6d, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x29, 0x2c, 0x20, 0x73, 0x74, \n\t0x65, 0x70, 0x29, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, \n\t0x6c, 0x69, 0x6e, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2c, 0x65, \n\t0x63, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x63, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x28, 0x35, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x20, 0x48, 0x54, \n\t0x54, 0x50, 0x2f, 0x30, 0x2e, 0x39, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x2c, 0x20, \n\t0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, \n\t0x69, 0x6e, 0x20, 0x61, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, \n\t0x74, 0x20, 0x61, 0x20, 0x68, 0x65, 0x75, 0x72, 0x69, 0x73, 0x74, 0x69, 0x63, 0x2c, 0x20, 0x62, 0x75, 0x74, \n\t0x20, 0x69, 0x73, 0x20, 0x77, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x52, 0x46, 0x43, 0x20, 0x72, \n\t0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x73, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x7e, 0x3d, 0x20, 0x22, \n\t0x48, 0x54, 0x54, 0x50, 0x2f, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x65, 0x63, 0x20, 0x3d, 0x3d, 0x20, 0x22, \n\t0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, \n\t0x20, 0x34, 0x30, 0x38, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, \n\t0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x77, 0x69, 0x73, 0x65, 0x20, 0x70, \n\t0x72, 0x6f, 0x63, 0x65, 0x65, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x73, \n\t0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, \n\t0x28, 0x22, 0x2a, 0x6c, 0x22, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x73, \n\t0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x6b, 0x69, 0x70, 0x28, 0x32, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, \n\t0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2c, 0x20, 0x22, 0x48, \n\t0x54, 0x54, 0x50, 0x2f, 0x25, 0x64, 0x2a, 0x25, 0x2e, 0x25, 0x64, 0x2a, 0x20, 0x28, 0x25, 0x64, 0x25, 0x64, \n\t0x25, 0x64, 0x29, 0x22, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, \n\t0x79, 0x28, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x63, 0x6f, \n\t0x64, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, \n\t0x73, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, \n\t0x79, 0x28, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x28, 0x73, \n\t0x65, 0x6c, 0x66, 0x2e, 0x63, 0x29, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x62, 0x6f, 0x64, 0x79, 0x28, 0x68, \n\t0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x74, 0x65, 0x70, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x20, 0x6f, 0x72, \n\t0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x2e, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x6e, 0x75, 0x6c, 0x6c, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x65, 0x70, 0x20, 0x6f, 0x72, \n\t0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x2e, 0x70, 0x75, 0x6d, 0x70, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, \n\t0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x68, 0x65, 0x61, \n\t0x64, 0x65, 0x72, 0x73, 0x5b, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x65, 0x6e, 0x67, \n\t0x74, 0x68, 0x22, 0x5d, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x68, 0x65, 0x61, 0x64, \n\t0x65, 0x72, 0x73, 0x5b, 0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x63, 0x6f, \n\t0x64, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x22, \n\t0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x20, 0x2d, 0x2d, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, \n\t0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x20, 0x7e, 0x3d, 0x20, \n\t0x22, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6d, 0x6f, \n\t0x64, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x65, 0x64, \n\t0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x74, 0x6f, \n\t0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5b, 0x22, 0x63, 0x6f, \n\t0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x5d, 0x29, 0x20, 0x74, 0x68, \n\t0x65, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x62, 0x79, 0x2d, 0x6c, 0x65, 0x6e, 0x67, \n\t0x74, 0x68, 0x22, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, \n\t0x79, 0x28, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x2e, 0x70, 0x75, 0x6d, 0x70, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x73, \n\t0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x2c, \n\t0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x74, 0x65, 0x70, \n\t0x29, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x30, 0x39, 0x62, 0x6f, 0x64, 0x79, \n\t0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2c, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x74, 0x65, \n\t0x70, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, \n\t0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x72, 0x65, 0x77, 0x69, \n\t0x6e, 0x64, 0x28, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x22, \n\t0x75, 0x6e, 0x74, 0x69, 0x6c, 0x2d, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x73, 0x65, 0x6c, \n\t0x66, 0x2e, 0x63, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, \n\t0x79, 0x28, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x2e, 0x70, 0x75, 0x6d, 0x70, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x73, \n\t0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x74, 0x65, 0x70, 0x29, \n\t0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x3a, \n\t0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x48, 0x69, 0x67, 0x68, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x48, 0x54, 0x54, 0x50, \n\t0x20, 0x41, 0x50, 0x49, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x6a, \n\t0x75, 0x73, 0x74, 0x75, 0x72, 0x69, 0x28, 0x72, 0x65, 0x71, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, \n\t0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2c, 0x20, 0x77, 0x65, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, \n\t0x74, 0x68, 0x65, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x75, 0x72, 0x6c, 0x2e, 0x20, 0x6f, 0x74, 0x68, 0x65, \n\t0x72, 0x77, 0x69, 0x73, 0x65, 0x2c, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x74, \n\t0x2e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x70, 0x72, \n\t0x6f, 0x78, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x5f, 0x4d, 0x2e, 0x50, 0x52, 0x4f, \n\t0x58, 0x59, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x20, 0x3d, 0x20, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, \n\t0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x70, 0x61, \n\t0x74, 0x68, 0x2c, 0x20, 0x22, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, \n\t0x27, 0x6e, 0x69, 0x6c, 0x27, 0x22, 0x29, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, \n\t0x3d, 0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x20, 0x3d, \n\t0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, \n\t0x74, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x72, 0x6c, 0x2e, 0x62, 0x75, 0x69, \n\t0x6c, 0x64, 0x28, 0x75, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x6a, \n\t0x75, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x28, 0x72, 0x65, 0x71, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x3d, 0x20, \n\t0x72, 0x65, 0x71, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x4d, 0x2e, 0x50, \n\t0x52, 0x4f, 0x58, 0x59, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x75, 0x72, \n\t0x6c, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x70, 0x6f, 0x72, 0x74, \n\t0x20, 0x3d, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x33, \n\t0x31, 0x32, 0x38, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x63, 0x72, 0x65, 0x61, \n\t0x74, 0x65, 0x20, 0x3d, 0x20, 0x53, 0x43, 0x48, 0x45, 0x4d, 0x45, 0x53, 0x5b, 0x70, 0x72, 0x6f, 0x78, 0x79, \n\t0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x5d, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x28, 0x72, 0x65, \n\t0x71, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x72, 0x6f, \n\t0x78, 0x79, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x70, 0x6f, 0x72, \n\t0x74, 0x2c, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x71, \n\t0x74, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x2c, \n\t0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x6a, \n\t0x75, 0x73, 0x74, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x28, 0x72, 0x65, 0x71, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x68, 0x65, 0x61, \n\t0x64, 0x65, 0x72, 0x73, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x72, \n\t0x65, 0x71, 0x74, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x74, \n\t0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7e, 0x3d, 0x20, 0x74, 0x6f, 0x73, \n\t0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x53, 0x43, 0x48, 0x45, 0x4d, 0x45, 0x53, 0x5b, 0x72, 0x65, 0x71, 0x74, \n\t0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x5d, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, \n\t0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x68, 0x6f, 0x73, \n\t0x74, 0x20, 0x2e, 0x2e, 0x20, 0x27, 0x3a, 0x27, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x65, \n\t0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x3d, 0x20, \n\t0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x75, 0x73, 0x65, 0x72, 0x2d, 0x61, 0x67, 0x65, \n\t0x6e, 0x74, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x4d, 0x2e, 0x55, 0x53, 0x45, 0x52, 0x41, 0x47, 0x45, 0x4e, \n\t0x54, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x68, 0x6f, 0x73, 0x74, 0x22, 0x5d, 0x20, 0x3d, \n\t0x20, 0x68, 0x6f, 0x73, 0x74, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, \n\t0x6f, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x2c, 0x20, 0x54, 0x45, 0x22, \n\t0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x74, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, \n\t0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x69, 0x66, 0x20, 0x77, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, \n\t0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x66, \n\t0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20, 0x69, 0x74, 0x20, \n\t0x61, 0x6c, 0x6f, 0x6e, 0x67, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x20, 0x61, \n\t0x6e, 0x64, 0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x74, \n\t0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5b, 0x22, 0x61, 0x75, 0x74, \n\t0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x42, 0x61, 0x73, 0x69, 0x63, \n\t0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x20, 0x28, 0x6d, 0x69, 0x6d, 0x65, 0x2e, 0x62, 0x36, 0x34, 0x28, 0x72, \n\t0x65, 0x71, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x3a, 0x22, 0x20, 0x2e, 0x2e, 0x0a,\n\t0x09, 0x09, 0x75, 0x72, 0x6c, 0x2e, 0x75, 0x6e, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x28, 0x72, 0x65, 0x71, \n\t0x74, 0x2e, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x29, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x69, 0x66, 0x20, 0x77, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, \n\t0x70, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, \n\t0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x70, 0x61, \n\t0x73, 0x73, 0x20, 0x69, 0x74, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x3d, 0x20, \n\t0x72, 0x65, 0x71, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x4d, 0x2e, 0x50, \n\t0x52, 0x4f, 0x58, 0x59, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x75, 0x72, \n\t0x6c, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x75, \n\t0x73, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x70, 0x61, 0x73, 0x73, \n\t0x77, 0x6f, 0x72, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5b, \n\t0x22, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, \n\t0x6f, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x42, \n\t0x61, 0x73, 0x69, 0x63, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x20, 0x28, 0x6d, 0x69, 0x6d, 0x65, 0x2e, 0x62, \n\t0x36, 0x34, 0x28, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x20, 0x2e, 0x2e, 0x20, 0x22, \n\t0x3a, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, \n\t0x72, 0x64, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x77, 0x69, \n\t0x74, 0x68, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x62, 0x61, 0x73, \n\t0x65, 0x2e, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, \n\t0x72, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x29, 0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5b, 0x73, 0x74, 0x72, 0x69, \n\t0x6e, 0x67, 0x2e, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x28, 0x69, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x70, 0x61, 0x72, \n\t0x74, 0x73, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x22, 0x2f, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2c, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x68, 0x74, \n\t0x74, 0x70, 0x22, 0x0a,\n\t0x7d, 0x0a,\n\t0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x6a, \n\t0x75, 0x73, 0x74, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x28, 0x72, 0x65, 0x71, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x69, \n\t0x66, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x20, 0x3d, 0x20, \n\t0x72, 0x65, 0x71, 0x74, 0x2e, 0x75, 0x72, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x72, 0x6c, 0x2e, 0x70, \n\t0x61, 0x72, 0x73, 0x65, 0x28, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x75, 0x72, 0x6c, 0x2c, 0x20, 0x64, 0x65, 0x66, \n\t0x61, 0x75, 0x6c, 0x74, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x65, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x20, 0x63, 0x6f, \n\t0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, \n\t0x75, 0x72, 0x6c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x62, 0x61, 0x73, \n\t0x65, 0x2e, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x72, 0x65, 0x71, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x20, 0x6e, \n\t0x72, 0x65, 0x71, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x6f, 0x20, \n\t0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x73, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x64, 0x65, \n\t0x66, 0x73, 0x2c, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x2c, 0x20, 0x6d, 0x65, \n\t0x74, 0x68, 0x6f, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x53, 0x43, 0x48, 0x45, 0x4d, 0x45, 0x53, 0x5b, \n\t0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x5d, 0x2c, 0x20, 0x6e, 0x72, 0x65, \n\t0x71, 0x74, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x70, 0x6f, 0x72, \n\t0x74, 0x2c, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x63, \n\t0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x63, \n\t0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x64, 0x65, 0x66, 0x73, \n\t0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x28, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x61, \n\t0x6e, 0x64, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7e, 0x3d, 0x20, 0x27, 0x27, 0x29, 0x20, 0x74, 0x68, 0x65, \n\t0x6e, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x68, \n\t0x65, 0x6d, 0x65, 0x64, 0x65, 0x66, 0x73, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, \n\t0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x7e, 0x3d, 0x20, 0x27, 0x27, 0x29, \n\t0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, \n\t0x20, 0x3d, 0x20, 0x27, 0x47, 0x45, 0x54, 0x27, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x68, 0x6f, 0x73, 0x74, 0x20, 0x61, \n\t0x6e, 0x64, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, \n\t0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x74, 0x72, 0x79, \n\t0x28, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x22, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x68, 0x6f, 0x73, \n\t0x74, 0x20, 0x27, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x74, 0x6f, 0x73, 0x74, 0x72, \n\t0x69, 0x6e, 0x67, 0x28, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x29, 0x20, 0x2e, 0x2e, \n\t0x20, 0x22, 0x27, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x75, 0x72, 0x69, \n\t0x20, 0x69, 0x66, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x6f, 0x76, \n\t0x65, 0x72, 0x72, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x75, 0x72, 0x69, 0x20, 0x3d, 0x20, 0x72, 0x65, \n\t0x71, 0x74, 0x2e, 0x75, 0x72, 0x69, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x75, 0x72, \n\t0x69, 0x28, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x68, 0x65, 0x61, 0x64, \n\t0x65, 0x72, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, \n\t0x3d, 0x20, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x28, 0x6e, 0x72, \n\t0x65, 0x71, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, \n\t0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6e, 0x72, \n\t0x65, 0x71, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5b, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, \n\t0x6e, 0x74, 0x2d, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x5d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6e, 0x72, \n\t0x65, 0x71, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5b, 0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, \n\t0x66, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, \n\t0x65, 0x72, 0x73, 0x5b, 0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x63, 0x6f, \n\t0x64, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x65, 0x64, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x61, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x20, \n\t0x61, 0x6e, 0x64, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, \n\t0x69, 0x73, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x63, 0x72, \n\t0x65, 0x61, 0x74, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x6e, 0x72, \n\t0x65, 0x71, 0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x2c, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x63, 0x72, \n\t0x65, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x78, 0x79, \n\t0x28, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x63, 0x72, \n\t0x65, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x63, 0x72, \n\t0x65, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, \n\t0x65, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x6f, \n\t0x75, 0x6c, 0x64, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x28, 0x72, 0x65, 0x71, 0x74, 0x2c, 0x20, \n\t0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, \n\t0x20, 0x3d, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, \n\t0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, \n\t0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, \n\t0x65, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, \n\t0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, \n\t0x20, 0x22, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x3d, \n\t0x20, 0x22, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, \n\t0x6c, 0x73, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x52, 0x46, 0x43, 0x20, 0x73, 0x61, 0x79, \n\t0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x20, 0x55, 0x52, 0x4c, \n\t0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x72, 0x6c, \n\t0x2e, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x28, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x75, 0x72, 0x6c, \n\t0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x20, 0x3d, \n\t0x20, 0x75, 0x72, 0x6c, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, \n\t0x6e, 0x29, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, \n\t0x28, 0x6e, 0x6f, 0x74, 0x20, 0x53, 0x43, 0x48, 0x45, 0x4d, 0x45, 0x53, 0x5b, 0x73, 0x63, 0x68, 0x65, 0x6d, \n\t0x65, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, \n\t0x6c, 0x73, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, \n\t0x20, 0x64, 0x6f, 0x77, 0x6e, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x27, 0x68, 0x74, 0x74, 0x70, 0x73, 0x27, 0x20, 0x3d, 0x3d, \n\t0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, \n\t0x28, 0x27, 0x68, 0x74, 0x74, 0x70, 0x73, 0x27, 0x20, 0x7e, 0x3d, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, \n\t0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, \n\t0x65, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x72, \n\t0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x20, 0x7e, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, \n\t0x61, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, \n\t0x3d, 0x20, 0x33, 0x30, 0x31, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x33, \n\t0x30, 0x32, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x30, 0x33, 0x20, \n\t0x6f, 0x72, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x30, 0x37, 0x29, 0x20, 0x61, 0x6e, \n\t0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, \n\t0x71, 0x74, 0x2e, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, \n\t0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x47, 0x45, 0x54, 0x22, 0x20, 0x6f, 0x72, \n\t0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x48, \n\t0x45, 0x41, 0x44, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x28, 0x66, 0x61, 0x6c, 0x73, \n\t0x65, 0x20, 0x3d, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x6d, 0x61, 0x78, 0x72, 0x65, 0x64, 0x69, 0x72, \n\t0x65, 0x63, 0x74, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x72, \n\t0x20, 0x28, 0x28, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x6e, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x73, \n\t0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x20, 0x28, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x6d, 0x61, 0x78, 0x72, \n\t0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x35, 0x29, 0x29, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x6f, \n\t0x75, 0x6c, 0x64, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x62, 0x6f, 0x64, 0x79, 0x28, 0x72, 0x65, 0x71, \n\t0x74, 0x2c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, \n\t0x20, 0x3d, 0x3d, 0x20, 0x22, 0x48, 0x45, 0x41, 0x44, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, \n\t0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x30, 0x34, \n\t0x20, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x30, 0x34, 0x20, 0x74, 0x68, \n\t0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3e, 0x3d, 0x20, 0x31, 0x30, 0x30, \n\t0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3c, 0x20, 0x32, 0x30, 0x30, 0x20, 0x74, 0x68, \n\t0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, \n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2c, 0x20, 0x74, 0x72, \n\t0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x5b, 0x5b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5d, 0x5d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, \n\t0x6f, 0x6e, 0x20, 0x74, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x28, 0x72, 0x65, 0x71, 0x74, 0x2c, \n\t0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x52, 0x46, 0x43, 0x20, 0x73, 0x61, 0x79, \n\t0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x20, 0x55, 0x52, 0x4c, \n\t0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x77, 0x75, 0x72, 0x6c, 0x20, 0x3d, \n\t0x20, 0x75, 0x72, 0x6c, 0x2e, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x28, 0x72, 0x65, 0x71, 0x74, \n\t0x2e, 0x75, 0x72, 0x6c, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x69, 0x66, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x69, 0x6e, \n\t0x67, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x20, 0x70, \n\t0x6f, 0x72, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x66, 0x75, 0x6e, \n\t0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x72, 0x6c, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x6e, \n\t0x65, 0x77, 0x75, 0x72, 0x6c, 0x29, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x72, \n\t0x65, 0x71, 0x74, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x20, \n\t0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, \n\t0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x72, 0x65, \n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, \n\t0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x73, 0x74, 0x61, \n\t0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x75, \n\t0x72, 0x6c, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x72, \n\t0x65, 0x71, 0x74, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, \n\t0x74, 0x2e, 0x73, 0x69, 0x6e, 0x6b, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, \n\t0x72, 0x65, 0x71, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x72, 0x65, \n\t0x71, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, \n\t0x74, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x6d, 0x61, 0x78, 0x72, 0x65, 0x64, 0x69, 0x72, \n\t0x65, 0x63, 0x74, 0x73, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x73, \n\t0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x6e, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, \n\t0x73, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x72, \n\t0x65, 0x71, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, \n\t0x6f, 0x6e, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x61, 0x73, 0x20, \n\t0x61, 0x20, 0x68, 0x69, 0x6e, 0x74, 0x20, 0x77, 0x65, 0x20, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, \n\t0x65, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x68, 0x65, 0x61, 0x64, \n\t0x65, 0x72, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, \n\t0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, \n\t0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, \n\t0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x73, 0x74, \n\t0x61, 0x74, 0x75, 0x73, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x5b, 0x5b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5d, 0x5d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, \n\t0x6f, 0x6e, 0x20, 0x74, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x28, 0x72, 0x65, 0x71, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x77, 0x65, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x75, 0x6e, 0x74, \n\t0x69, 0x6c, 0x20, 0x77, 0x65, 0x20, 0x67, 0x65, 0x74, 0x20, 0x77, 0x68, 0x61, 0x74, 0x20, 0x77, 0x65, 0x20, \n\t0x77, 0x61, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x72, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x77, 0x65, 0x20, 0x61, 0x72, \n\t0x65, 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, \n\t0x20, 0x77, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x65, 0x74, 0x20, 0x69, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x20, 0x3d, 0x20, \n\t0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x28, 0x72, 0x65, 0x71, 0x74, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x20, 0x3d, 0x20, 0x5f, 0x4d, 0x2e, 0x6f, \n\t0x70, 0x65, 0x6e, 0x28, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x6e, 0x72, \n\t0x65, 0x71, 0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x2c, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x63, 0x72, \n\t0x65, 0x61, 0x74, 0x65, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, \n\t0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x68, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x6c, \n\t0x69, 0x6e, 0x65, 0x28, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2c, 0x20, \n\t0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x75, 0x72, 0x69, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x68, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x28, \n\t0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, \n\t0x20, 0x61, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x2c, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, \n\t0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x62, 0x6f, 0x64, 0x79, \n\t0x28, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x6e, 0x72, \n\t0x65, 0x71, 0x74, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, \n\t0x73, 0x74, 0x65, 0x70, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x73, 0x74, \n\t0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x68, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x74, \n\t0x61, 0x74, 0x75, 0x73, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6e, \n\t0x20, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x30, 0x2e, 0x39, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2c, 0x20, \n\t0x73, 0x69, 0x6d, 0x70, 0x6c, 0x79, 0x20, 0x67, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, \n\t0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x74, 0x68, \n\t0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x30, \n\t0x39, 0x62, 0x6f, 0x64, 0x79, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2c, 0x20, 0x6e, 0x72, 0x65, 0x71, \n\t0x74, 0x2e, 0x73, 0x69, 0x6e, 0x6b, 0x2c, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x73, 0x74, 0x65, 0x70, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x2c, 0x20, \n\t0x32, 0x30, 0x30, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, \n\t0x20, 0x34, 0x30, 0x38, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x2c, 0x20, \n\t0x63, 0x6f, 0x64, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, \n\t0x31, 0x30, 0x30, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, \n\t0x67, 0x65, 0x73, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, \n\t0x31, 0x30, 0x30, 0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x68, \n\t0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, \n\t0x75, 0x73, 0x20, 0x3d, 0x20, 0x68, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x74, 0x61, 0x74, \n\t0x75, 0x73, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x68, 0x3a, 0x72, 0x65, \n\t0x63, 0x65, 0x69, 0x76, 0x65, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x61, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x6f, 0x69, \n\t0x6e, 0x74, 0x20, 0x77, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, \n\t0x61, 0x20, 0x68, 0x6f, 0x6e, 0x65, 0x73, 0x74, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x20, 0x66, 0x72, 0x6f, \n\t0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x77, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x27, 0x74, 0x20, 0x72, 0x65, \n\t0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x20, 0x69, 0x66, 0x20, 0x77, 0x65, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, \n\t0x64, 0x79, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, \n\t0x2c, 0x20, 0x73, 0x6f, 0x20, 0x77, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, \n\t0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x72, 0x65, 0x64, 0x69, 0x72, \n\t0x65, 0x63, 0x74, 0x28, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x68, \n\t0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6e, 0x72, \n\t0x65, 0x71, 0x74, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x65, \n\t0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x28, 0x72, 0x65, 0x71, 0x74, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, \n\t0x72, 0x73, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x77, 0x65, 0x20, 0x61, 0x72, 0x65, \n\t0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x72, 0x65, 0x63, 0x65, 0x69, \n\t0x76, 0x65, 0x62, 0x6f, 0x64, 0x79, 0x28, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x64, 0x65, \n\t0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x62, \n\t0x6f, 0x64, 0x79, 0x28, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, \n\t0x2e, 0x73, 0x69, 0x6e, 0x6b, 0x2c, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x68, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x2c, 0x20, 0x63, 0x6f, 0x64, 0x65, \n\t0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x61, 0x6e, \n\t0x64, 0x20, 0x61, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x67, 0x65, \n\t0x6e, 0x65, 0x72, 0x69, 0x63, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x6e, \n\t0x65, 0x72, 0x69, 0x63, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x75, 0x2c, 0x20, 0x62, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x71, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x3d, 0x20, 0x75, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x6c, 0x74, 0x6e, \n\t0x31, 0x32, 0x2e, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x29, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, \n\t0x65, 0x20, 0x3d, 0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x73, \n\t0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x62, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, \n\t0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6e, 0x74, \n\t0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, \n\t0x69, 0x6e, 0x67, 0x2e, 0x6c, 0x65, 0x6e, 0x28, 0x62, 0x29, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6e, 0x74, \n\t0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, \n\t0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78, 0x2d, 0x77, 0x77, 0x77, 0x2d, 0x66, 0x6f, 0x72, 0x6d, \n\t0x2d, 0x75, 0x72, 0x6c, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x6d, 0x65, 0x74, 0x68, 0x6f, \n\t0x64, 0x20, 0x3d, 0x20, 0x22, 0x50, 0x4f, 0x53, 0x54, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x74, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x5f, 0x4d, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x3d, 0x20, 0x67, \n\t0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x66, 0x6f, 0x72, 0x6d, 0x0a,\n\t0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x72, 0x65, \n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x28, 0x75, 0x2c, 0x20, 0x62, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x71, 0x74, 0x20, 0x3d, 0x20, 0x67, \n\t0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x75, 0x2c, 0x20, 0x62, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x2c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, \n\t0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, \n\t0x20, 0x74, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x28, 0x72, 0x65, 0x71, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, \n\t0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, \n\t0x2c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x73, \n\t0x74, 0x61, 0x74, 0x75, 0x73, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x5f, 0x4d, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, \n\t0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, \n\t0x28, 0x72, 0x65, 0x71, 0x74, 0x2c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x72, \n\t0x65, 0x71, 0x74, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x74, \n\t0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, \n\t0x74, 0x28, 0x72, 0x65, 0x71, 0x74, 0x2c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, \n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x28, 0x72, 0x65, 0x71, 0x74, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x29, 0x0a,\n\t0x0a,\n\t0x5f, 0x4d, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x53, 0x43, 0x48, 0x45, 0x4d, \n\t0x45, 0x53, 0x0a,\n\t0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x4d, 0x0a,\n}; // [http.lua]\n} // love\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/inet.c",
    "content": "/*=========================================================================*\\\n* Internet domain functions\n* LuaSocket toolkit\n\\*=========================================================================*/\n#include \"luasocket.h\"\n#include \"inet.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n/*=========================================================================*\\\n* Internal function prototypes.\n\\*=========================================================================*/\nstatic int inet_global_toip(lua_State *L);\nstatic int inet_global_getaddrinfo(lua_State *L);\nstatic int inet_global_tohostname(lua_State *L);\nstatic int inet_global_getnameinfo(lua_State *L);\nstatic void inet_pushresolved(lua_State *L, struct hostent *hp);\nstatic int inet_global_gethostname(lua_State *L);\n\n/* DNS functions */\nstatic luaL_Reg func[] = {\n    { \"toip\", inet_global_toip},\n    { \"getaddrinfo\", inet_global_getaddrinfo},\n    { \"tohostname\", inet_global_tohostname},\n    { \"getnameinfo\", inet_global_getnameinfo},\n    { \"gethostname\", inet_global_gethostname},\n    { NULL, NULL}\n};\n\n/*-------------------------------------------------------------------------*\\\n* Initializes module\n\\*-------------------------------------------------------------------------*/\nint inet_open(lua_State *L)\n{\n    lua_pushstring(L, \"dns\");\n    lua_newtable(L);\n    luaL_setfuncs(L, func, 0);\n    lua_settable(L, -3);\n    return 0;\n}\n\n/*=========================================================================*\\\n* Global Lua functions\n\\*=========================================================================*/\n/*-------------------------------------------------------------------------*\\\n* Returns all information provided by the resolver given a host name\n* or ip address\n\\*-------------------------------------------------------------------------*/\nstatic int inet_gethost(const char *address, struct hostent **hp) {\n    struct in_addr addr;\n    if (inet_aton(address, &addr))\n        return socket_gethostbyaddr((char *) &addr, sizeof(addr), hp);\n    else\n        return socket_gethostbyname(address, hp);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Returns all information provided by the resolver given a host name\n* or ip address\n\\*-------------------------------------------------------------------------*/\nstatic int inet_global_tohostname(lua_State *L) {\n    const char *address = luaL_checkstring(L, 1);\n    struct hostent *hp = NULL;\n    int err = inet_gethost(address, &hp);\n    if (err != IO_DONE) {\n        lua_pushnil(L);\n        lua_pushstring(L, socket_hoststrerror(err));\n        return 2;\n    }\n    lua_pushstring(L, hp->h_name);\n    inet_pushresolved(L, hp);\n    return 2;\n}\n\nstatic int inet_global_getnameinfo(lua_State *L) {\n    char hbuf[NI_MAXHOST];\n    char sbuf[NI_MAXSERV];\n    int i, ret;\n    struct addrinfo hints;\n    struct addrinfo *resolved, *iter;\n    const char *host = luaL_optstring(L, 1, NULL);\n    const char *serv = luaL_optstring(L, 2, NULL);\n\n    if (!(host || serv))\n        luaL_error(L, \"host and serv cannot be both nil\");\n\n    memset(&hints, 0, sizeof(hints));\n    hints.ai_socktype = SOCK_STREAM;\n    hints.ai_family = AF_UNSPEC;\n\n    ret = getaddrinfo(host, serv, &hints, &resolved);\n    if (ret != 0) {\n        lua_pushnil(L);\n        lua_pushstring(L, socket_gaistrerror(ret));\n        return 2;\n    }\n\n    lua_newtable(L);\n    for (i = 1, iter = resolved; iter; i++, iter = iter->ai_next) {\n        getnameinfo(iter->ai_addr, (socklen_t) iter->ai_addrlen,\n            hbuf, host? (socklen_t) sizeof(hbuf): 0,\n            sbuf, serv? (socklen_t) sizeof(sbuf): 0, 0);\n        if (host) {\n            lua_pushnumber(L, i);\n            lua_pushstring(L, hbuf);\n            lua_settable(L, -3);\n        }\n    }\n    freeaddrinfo(resolved);\n\n    if (serv) {\n        lua_pushstring(L, sbuf);\n        return 2;\n    } else {\n        return 1;\n    }\n}\n\n/*-------------------------------------------------------------------------*\\\n* Returns all information provided by the resolver given a host name\n* or ip address\n\\*-------------------------------------------------------------------------*/\nstatic int inet_global_toip(lua_State *L)\n{\n    const char *address = luaL_checkstring(L, 1);\n    struct hostent *hp = NULL;\n    int err = inet_gethost(address, &hp);\n    if (err != IO_DONE) {\n        lua_pushnil(L);\n        lua_pushstring(L, socket_hoststrerror(err));\n        return 2;\n    }\n    lua_pushstring(L, inet_ntoa(*((struct in_addr *) hp->h_addr)));\n    inet_pushresolved(L, hp);\n    return 2;\n}\n\nint inet_optfamily(lua_State* L, int narg, const char* def)\n{\n    static const char* optname[] = { \"unspec\", \"inet\", \"inet6\", NULL };\n    static int optvalue[] = { AF_UNSPEC, AF_INET, AF_INET6, 0 };\n\n    return optvalue[luaL_checkoption(L, narg, def, optname)];\n}\n\nint inet_optsocktype(lua_State* L, int narg, const char* def)\n{\n    static const char* optname[] = { \"stream\", \"dgram\", NULL };\n    static int optvalue[] = { SOCK_STREAM, SOCK_DGRAM, 0 };\n\n    return optvalue[luaL_checkoption(L, narg, def, optname)];\n}\n\nstatic int inet_global_getaddrinfo(lua_State *L)\n{\n    const char *hostname = luaL_checkstring(L, 1);\n    struct addrinfo *iterator = NULL, *resolved = NULL;\n    struct addrinfo hints;\n    int i = 1, ret = 0;\n    memset(&hints, 0, sizeof(hints));\n    hints.ai_socktype = SOCK_STREAM;\n    hints.ai_family = AF_UNSPEC;\n    ret = getaddrinfo(hostname, NULL, &hints, &resolved);\n    if (ret != 0) {\n        lua_pushnil(L);\n        lua_pushstring(L, socket_gaistrerror(ret));\n        return 2;\n    }\n    lua_newtable(L);\n    for (iterator = resolved; iterator; iterator = iterator->ai_next) {\n        char hbuf[NI_MAXHOST];\n        ret = getnameinfo(iterator->ai_addr, (socklen_t) iterator->ai_addrlen,\n            hbuf, (socklen_t) sizeof(hbuf), NULL, 0, NI_NUMERICHOST);\n        if (ret){\n          freeaddrinfo(resolved);\n          lua_pushnil(L);\n          lua_pushstring(L, socket_gaistrerror(ret));\n          return 2;\n        }\n        lua_pushnumber(L, i);\n        lua_newtable(L);\n        switch (iterator->ai_family) {\n            case AF_INET:\n                lua_pushliteral(L, \"family\");\n                lua_pushliteral(L, \"inet\");\n                lua_settable(L, -3);\n                break;\n            case AF_INET6:\n                lua_pushliteral(L, \"family\");\n                lua_pushliteral(L, \"inet6\");\n                lua_settable(L, -3);\n                break;\n            case AF_UNSPEC:\n                lua_pushliteral(L, \"family\");\n                lua_pushliteral(L, \"unspec\");\n                lua_settable(L, -3);\n                break;\n            default:\n                lua_pushliteral(L, \"family\");\n                lua_pushliteral(L, \"unknown\");\n                lua_settable(L, -3);\n                break;\n        }\n        lua_pushliteral(L, \"addr\");\n        lua_pushstring(L, hbuf);\n        lua_settable(L, -3);\n        lua_settable(L, -3);\n        i++;\n    }\n    freeaddrinfo(resolved);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Gets the host name\n\\*-------------------------------------------------------------------------*/\nstatic int inet_global_gethostname(lua_State *L)\n{\n    char name[257];\n    name[256] = '\\0';\n    if (gethostname(name, 256) < 0) {\n        lua_pushnil(L);\n        lua_pushstring(L, socket_strerror(errno));\n        return 2;\n    } else {\n        lua_pushstring(L, name);\n        return 1;\n    }\n}\n\n/*=========================================================================*\\\n* Lua methods\n\\*=========================================================================*/\n/*-------------------------------------------------------------------------*\\\n* Retrieves socket peer name\n\\*-------------------------------------------------------------------------*/\nint inet_meth_getpeername(lua_State *L, p_socket ps, int family)\n{\n    int err;\n    struct sockaddr_storage peer;\n    socklen_t peer_len = sizeof(peer);\n    char name[INET6_ADDRSTRLEN];\n    char port[6]; /* 65535 = 5 bytes + 0 to terminate it */\n    if (getpeername(*ps, (SA *) &peer, &peer_len) < 0) {\n        lua_pushnil(L);\n        lua_pushstring(L, socket_strerror(errno));\n        return 2;\n    }\n\terr = getnameinfo((struct sockaddr *) &peer, peer_len,\n        name, INET6_ADDRSTRLEN,\n        port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV);\n    if (err) {\n        lua_pushnil(L);\n        lua_pushstring(L, LUA_GAI_STRERROR(err));\n        return 2;\n    }\n    lua_pushstring(L, name);\n    lua_pushinteger(L, (int) strtol(port, (char **) NULL, 10));\n    switch (family) {\n        case AF_INET: lua_pushliteral(L, \"inet\"); break;\n        case AF_INET6: lua_pushliteral(L, \"inet6\"); break;\n        case AF_UNSPEC: lua_pushliteral(L, \"unspec\"); break;\n        default: lua_pushliteral(L, \"unknown\"); break;\n    }\n    return 3;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Retrieves socket local name\n\\*-------------------------------------------------------------------------*/\nint inet_meth_getsockname(lua_State *L, p_socket ps, int family)\n{\n    int err;\n    struct sockaddr_storage peer;\n    socklen_t peer_len = sizeof(peer);\n    char name[INET6_ADDRSTRLEN];\n    char port[6]; /* 65535 = 5 bytes + 0 to terminate it */\n    if (getsockname(*ps, (SA *) &peer, &peer_len) < 0) {\n        lua_pushnil(L);\n        lua_pushstring(L, socket_strerror(errno));\n        return 2;\n    }\n\terr=getnameinfo((struct sockaddr *)&peer, peer_len,\n\t\tname, INET6_ADDRSTRLEN, port, 6, NI_NUMERICHOST | NI_NUMERICSERV);\n    if (err) {\n        lua_pushnil(L);\n        lua_pushstring(L, LUA_GAI_STRERROR(err));\n        return 2;\n    }\n    lua_pushstring(L, name);\n    lua_pushinteger(L, (int) strtol(port, (char **) NULL, 10));\n    switch (family) {\n        case AF_INET: lua_pushliteral(L, \"inet\"); break;\n        case AF_INET6: lua_pushliteral(L, \"inet6\"); break;\n        case AF_UNSPEC: lua_pushliteral(L, \"unspec\"); break;\n        default: lua_pushliteral(L, \"unknown\"); break;\n    }\n    return 3;\n}\n\n/*=========================================================================*\\\n* Internal functions\n\\*=========================================================================*/\n/*-------------------------------------------------------------------------*\\\n* Passes all resolver information to Lua as a table\n\\*-------------------------------------------------------------------------*/\nstatic void inet_pushresolved(lua_State *L, struct hostent *hp)\n{\n    char **alias;\n    struct in_addr **addr;\n    int i, resolved;\n    lua_newtable(L); resolved = lua_gettop(L);\n    lua_pushstring(L, \"name\");\n    lua_pushstring(L, hp->h_name);\n    lua_settable(L, resolved);\n    lua_pushstring(L, \"ip\");\n    lua_pushstring(L, \"alias\");\n    i = 1;\n    alias = hp->h_aliases;\n    lua_newtable(L);\n    if (alias) {\n        while (*alias) {\n            lua_pushnumber(L, i);\n            lua_pushstring(L, *alias);\n            lua_settable(L, -3);\n            i++; alias++;\n        }\n    }\n    lua_settable(L, resolved);\n    i = 1;\n    lua_newtable(L);\n    addr = (struct in_addr **) hp->h_addr_list;\n    if (addr) {\n        while (*addr) {\n            lua_pushnumber(L, i);\n            lua_pushstring(L, inet_ntoa(**addr));\n            lua_settable(L, -3);\n            i++; addr++;\n        }\n    }\n    lua_settable(L, resolved);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Tries to create a new inet socket\n\\*-------------------------------------------------------------------------*/\nconst char *inet_trycreate(p_socket ps, int family, int type, int protocol) {\n    const char *err = socket_strerror(socket_create(ps, family, type, protocol));\n    if (err == NULL && family == AF_INET6) {\n        int yes = 1;\n        setsockopt(*ps, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&yes, sizeof(yes));\n    }\n    return err;\n}\n\n/*-------------------------------------------------------------------------*\\\n* \"Disconnects\" a DGRAM socket\n\\*-------------------------------------------------------------------------*/\nconst char *inet_trydisconnect(p_socket ps, int family, p_timeout tm)\n{\n    switch (family) {\n        case AF_INET: {\n            struct sockaddr_in sin;\n            memset((char *) &sin, 0, sizeof(sin));\n            sin.sin_family = AF_UNSPEC;\n            sin.sin_addr.s_addr = INADDR_ANY;\n            return socket_strerror(socket_connect(ps, (SA *) &sin,\n                sizeof(sin), tm));\n        }\n        case AF_INET6: {\n            struct sockaddr_in6 sin6;\n            struct in6_addr addrany = IN6ADDR_ANY_INIT;\n            memset((char *) &sin6, 0, sizeof(sin6));\n            sin6.sin6_family = AF_UNSPEC;\n            sin6.sin6_addr = addrany;\n            return socket_strerror(socket_connect(ps, (SA *) &sin6,\n                sizeof(sin6), tm));\n        }\n    }\n    return NULL;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Tries to connect to remote address (address, port)\n\\*-------------------------------------------------------------------------*/\nconst char *inet_tryconnect(p_socket ps, int *family, const char *address,\n        const char *serv, p_timeout tm, struct addrinfo *connecthints)\n{\n    struct addrinfo *iterator = NULL, *resolved = NULL;\n    const char *err = NULL;\n    int current_family = *family;\n    /* try resolving */\n    err = socket_gaistrerror(getaddrinfo(address, serv,\n                connecthints, &resolved));\n    if (err != NULL) {\n        if (resolved) freeaddrinfo(resolved);\n        return err;\n    }\n    for (iterator = resolved; iterator; iterator = iterator->ai_next) {\n        timeout_markstart(tm);\n        /* create new socket if necessary. if there was no\n         * bind, we need to create one for every new family\n         * that shows up while iterating. if there was a\n         * bind, all families will be the same and we will\n         * not enter this branch. */\n        if (current_family != iterator->ai_family || *ps == SOCKET_INVALID) {\n            socket_destroy(ps);\n            err = inet_trycreate(ps, iterator->ai_family,\n                iterator->ai_socktype, iterator->ai_protocol);\n            if (err) continue;\n            current_family = iterator->ai_family;\n            /* set non-blocking before connect */\n            socket_setnonblocking(ps);\n        }\n        /* try connecting to remote address */\n        err = socket_strerror(socket_connect(ps, (SA *) iterator->ai_addr,\n            (socklen_t) iterator->ai_addrlen, tm));\n        /* if success or timeout is zero, break out of loop */\n        if (err == NULL || timeout_iszero(tm)) {\n            *family = current_family;\n            break;\n        }\n    }\n    freeaddrinfo(resolved);\n    /* here, if err is set, we failed */\n    return err;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Tries to accept a socket\n\\*-------------------------------------------------------------------------*/\nconst char *inet_tryaccept(p_socket server, int family, p_socket client,\n    p_timeout tm) {\n\tsocklen_t len;\n\tt_sockaddr_storage addr;\n    switch (family) {\n        case AF_INET6: len = sizeof(struct sockaddr_in6); break;\n        case AF_INET: len = sizeof(struct sockaddr_in); break;\n        default: len = sizeof(addr); break;\n    }\n\treturn socket_strerror(socket_accept(server, client, (SA *) &addr,\n        &len, tm));\n}\n\n/*-------------------------------------------------------------------------*\\\n* Tries to bind socket to (address, port)\n\\*-------------------------------------------------------------------------*/\nconst char *inet_trybind(p_socket ps, int *family, const char *address,\n    const char *serv, struct addrinfo *bindhints) {\n    struct addrinfo *iterator = NULL, *resolved = NULL;\n    const char *err = NULL;\n    int current_family = *family;\n    /* translate luasocket special values to C */\n    if (strcmp(address, \"*\") == 0) address = NULL;\n    if (!serv) serv = \"0\";\n    /* try resolving */\n    err = socket_gaistrerror(getaddrinfo(address, serv, bindhints, &resolved));\n    if (err) {\n        if (resolved) freeaddrinfo(resolved);\n        return err;\n    }\n    /* iterate over resolved addresses until one is good */\n    for (iterator = resolved; iterator; iterator = iterator->ai_next) {\n        if (current_family != iterator->ai_family || *ps == SOCKET_INVALID) {\n            socket_destroy(ps);\n            err = inet_trycreate(ps, iterator->ai_family,\n                        iterator->ai_socktype, iterator->ai_protocol);\n            if (err) continue;\n            current_family = iterator->ai_family;\n        }\n        /* try binding to local address */\n        err = socket_strerror(socket_bind(ps, (SA *) iterator->ai_addr,\n            (socklen_t) iterator->ai_addrlen));\n        /* keep trying unless bind succeeded */\n        if (err == NULL) {\n            *family = current_family;\n            /* set to non-blocking after bind */\n            socket_setnonblocking(ps);\n            break;\n        }\n    }\n    /* cleanup and return error */\n    freeaddrinfo(resolved);\n    /* here, if err is set, we failed */\n    return err;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Some systems do not provide these so that we provide our own.\n\\*-------------------------------------------------------------------------*/\n#ifdef LUASOCKET_INET_ATON\nint inet_aton(const char *cp, struct in_addr *inp)\n{\n    unsigned int a = 0, b = 0, c = 0, d = 0;\n    int n = 0, r;\n    unsigned long int addr = 0;\n    r = sscanf(cp, \"%u.%u.%u.%u%n\", &a, &b, &c, &d, &n);\n    if (r == 0 || n == 0) return 0;\n    cp += n;\n    if (*cp) return 0;\n    if (a > 255 || b > 255 || c > 255 || d > 255) return 0;\n    if (inp) {\n        addr += a; addr <<= 8;\n        addr += b; addr <<= 8;\n        addr += c; addr <<= 8;\n        addr += d;\n        inp->s_addr = htonl(addr);\n    }\n    return 1;\n}\n#endif\n\n#ifdef LUASOCKET_INET_PTON\nint inet_pton(int af, const char *src, void *dst)\n{\n    struct addrinfo hints, *res;\n    int ret = 1;\n    memset(&hints, 0, sizeof(struct addrinfo));\n    hints.ai_family = af;\n    hints.ai_flags = AI_NUMERICHOST;\n    if (getaddrinfo(src, NULL, &hints, &res) != 0) return -1;\n    if (af == AF_INET) {\n        struct sockaddr_in *in = (struct sockaddr_in *) res->ai_addr;\n        memcpy(dst, &in->sin_addr, sizeof(in->sin_addr));\n    } else if (af == AF_INET6) {\n        struct sockaddr_in6 *in = (struct sockaddr_in6 *) res->ai_addr;\n        memcpy(dst, &in->sin6_addr, sizeof(in->sin6_addr));\n    } else {\n        ret = -1;\n    }\n    freeaddrinfo(res);\n    return ret;\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/inet.h",
    "content": "#ifndef INET_H\n#define INET_H\n/*=========================================================================*\\\n* Internet domain functions\n* LuaSocket toolkit\n*\n* This module implements the creation and connection of internet domain\n* sockets, on top of the socket.h interface, and the interface of with the\n* resolver.\n*\n* The function inet_aton is provided for the platforms where it is not\n* available. The module also implements the interface of the internet\n* getpeername and getsockname functions as seen by Lua programs.\n*\n* The Lua functions toip and tohostname are also implemented here.\n\\*=========================================================================*/\n#include \"luasocket.h\"\n#include \"socket.h\"\n#include \"timeout.h\"\n\n#ifdef _WIN32\n#define LUASOCKET_INET_ATON\n#endif\n\n#ifndef _WIN32\n#pragma GCC visibility push(hidden)\n#endif\n\nint inet_open(lua_State *L);\n\nint inet_optfamily(lua_State* L, int narg, const char* def);\nint inet_optsocktype(lua_State* L, int narg, const char* def);\n\nint inet_meth_getpeername(lua_State *L, p_socket ps, int family);\nint inet_meth_getsockname(lua_State *L, p_socket ps, int family);\n\nconst char *inet_trycreate(p_socket ps, int family, int type, int protocol);\nconst char *inet_trydisconnect(p_socket ps, int family, p_timeout tm);\nconst char *inet_tryconnect(p_socket ps, int *family, const char *address, const char *serv, p_timeout tm, struct addrinfo *connecthints);\nconst char *inet_tryaccept(p_socket server, int family, p_socket client, p_timeout tm);\nconst char *inet_trybind(p_socket ps, int *family, const char *address, const char *serv, struct addrinfo *bindhints);\n\n#ifdef LUASOCKET_INET_ATON\nint inet_aton(const char *cp, struct in_addr *inp);\n#endif\n\n#ifdef LUASOCKET_INET_PTON\nconst char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);\nint inet_pton(int af, const char *src, void *dst);\n#endif\n\n#ifndef _WIN32\n#pragma GCC visibility pop\n#endif\n\n#endif /* INET_H */\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/io.c",
    "content": "/*=========================================================================*\\\n* Input/Output abstraction\n* LuaSocket toolkit\n\\*=========================================================================*/\n#include \"luasocket.h\"\n#include \"io.h\"\n\n/*-------------------------------------------------------------------------*\\\n* Initializes C structure\n\\*-------------------------------------------------------------------------*/\nvoid io_init(p_io io, p_send send, p_recv recv, p_error error, void *ctx) {\n    io->send = send;\n    io->recv = recv;\n    io->error = error;\n    io->ctx = ctx;\n}\n\n/*-------------------------------------------------------------------------*\\\n* I/O error strings\n\\*-------------------------------------------------------------------------*/\nconst char *io_strerror(int err) {\n    switch (err) {\n        case IO_DONE: return NULL;\n        case IO_CLOSED: return \"closed\";\n        case IO_TIMEOUT: return \"timeout\";\n        default: return \"unknown error\";\n    }\n}\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/io.h",
    "content": "#ifndef IO_H\n#define IO_H\n/*=========================================================================*\\\n* Input/Output abstraction\n* LuaSocket toolkit\n*\n* This module defines the interface that LuaSocket expects from the\n* transport layer for streamed input/output. The idea is that if any\n* transport implements this interface, then the buffer.c functions\n* automatically work on it.\n*\n* The module socket.h implements this interface, and thus the module tcp.h\n* is very simple.\n\\*=========================================================================*/\n#include \"luasocket.h\"\n#include \"timeout.h\"\n\n/* IO error codes */\nenum {\n    IO_DONE = 0,        /* operation completed successfully */\n    IO_TIMEOUT = -1,    /* operation timed out */\n    IO_CLOSED = -2,     /* the connection has been closed */\n\tIO_UNKNOWN = -3\n};\n\n/* interface to error message function */\ntypedef const char *(*p_error) (\n    void *ctx,          /* context needed by send */\n    int err             /* error code */\n);\n\n/* interface to send function */\ntypedef int (*p_send) (\n    void *ctx,          /* context needed by send */\n    const char *data,   /* pointer to buffer with data to send */\n    size_t count,       /* number of bytes to send from buffer */\n    size_t *sent,       /* number of bytes sent uppon return */\n    p_timeout tm        /* timeout control */\n);\n\n/* interface to recv function */\ntypedef int (*p_recv) (\n    void *ctx,          /* context needed by recv */\n    char *data,         /* pointer to buffer where data will be writen */\n    size_t count,       /* number of bytes to receive into buffer */\n    size_t *got,        /* number of bytes received uppon return */\n    p_timeout tm        /* timeout control */\n);\n\n/* IO driver definition */\ntypedef struct t_io_ {\n    void *ctx;          /* context needed by send/recv */\n    p_send send;        /* send function pointer */\n    p_recv recv;        /* receive function pointer */\n    p_error error;      /* strerror function */\n} t_io;\ntypedef t_io *p_io;\n\n#ifndef _WIN32\n#pragma GCC visibility push(hidden)\n#endif\n\nvoid io_init(p_io io, p_send send, p_recv recv, p_error error, void *ctx);\nconst char *io_strerror(int err);\n\n#ifndef _WIN32\n#pragma GCC visibility pop\n#endif\n\n#endif /* IO_H */\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/ltn12.lua",
    "content": "-----------------------------------------------------------------------------\n-- LTN12 - Filters, sources, sinks and pumps.\n-- LuaSocket toolkit.\n-- Author: Diego Nehab\n-----------------------------------------------------------------------------\n\n-----------------------------------------------------------------------------\n-- Declare module\n-----------------------------------------------------------------------------\nlocal string = require(\"string\")\nlocal table = require(\"table\")\nlocal unpack = unpack or table.unpack\nlocal base = _G\nlocal select = select\n\nlocal _M = {}\nif module then -- heuristic for exporting a global package table\n    ltn12 = _M  -- luacheck: ignore\nend\nlocal filter,source,sink,pump = {},{},{},{}\n\n_M.filter = filter\n_M.source = source\n_M.sink = sink\n_M.pump = pump\n\n-- 2048 seems to be better in windows...\n_M.BLOCKSIZE = 2048\n_M._VERSION = \"LTN12 1.0.3\"\n\n-----------------------------------------------------------------------------\n-- Filter stuff\n-----------------------------------------------------------------------------\n-- returns a high level filter that cycles a low-level filter\nfunction filter.cycle(low, ctx, extra)\n    base.assert(low)\n    return function(chunk)\n        local ret\n        ret, ctx = low(ctx, chunk, extra)\n        return ret\n    end\nend\n\n-- chains a bunch of filters together\n-- (thanks to Wim Couwenberg)\nfunction filter.chain(...)\n    local arg = {...}\n    local n = select('#',...)\n    local top, index = 1, 1\n    local retry = \"\"\n    return function(chunk)\n        retry = chunk and retry\n        while true do\n            if index == top then\n                chunk = arg[index](chunk)\n                if chunk == \"\" or top == n then return chunk\n                elseif chunk then index = index + 1\n                else\n                    top = top+1\n                    index = top\n                end\n            else\n                chunk = arg[index](chunk or \"\")\n                if chunk == \"\" then\n                    index = index - 1\n                    chunk = retry\n                elseif chunk then\n                    if index == n then return chunk\n                    else index = index + 1 end\n                else base.error(\"filter returned inappropriate nil\") end\n            end\n        end\n    end\nend\n\n-----------------------------------------------------------------------------\n-- Source stuff\n-----------------------------------------------------------------------------\n-- create an empty source\nlocal function empty()\n    return nil\nend\n\nfunction source.empty()\n    return empty\nend\n\n-- returns a source that just outputs an error\nfunction source.error(err)\n    return function()\n        return nil, err\n    end\nend\n\n-- creates a file source\nfunction source.file(handle, io_err)\n    if handle then\n        return function()\n            local chunk = handle:read(_M.BLOCKSIZE)\n            if not chunk then handle:close() end\n            return chunk\n        end\n    else return source.error(io_err or \"unable to open file\") end\nend\n\n-- turns a fancy source into a simple source\nfunction source.simplify(src)\n    base.assert(src)\n    return function()\n        local chunk, err_or_new = src()\n        src = err_or_new or src\n        if not chunk then return nil, err_or_new\n        else return chunk end\n    end\nend\n\n-- creates string source\nfunction source.string(s)\n    if s then\n        local i = 1\n        return function()\n            local chunk = string.sub(s, i, i+_M.BLOCKSIZE-1)\n            i = i + _M.BLOCKSIZE\n            if chunk ~= \"\" then return chunk\n            else return nil end\n        end\n    else return source.empty() end\nend\n\n-- creates table source\nfunction source.table(t)\n    base.assert('table' == type(t))\n    local i = 0\n    return function()\n        i = i + 1\n        return t[i]\n    end\nend\n\n-- creates rewindable source\nfunction source.rewind(src)\n    base.assert(src)\n    local t = {}\n    return function(chunk)\n        if not chunk then\n            chunk = table.remove(t)\n            if not chunk then return src()\n            else return chunk end\n        else\n            table.insert(t, chunk)\n        end\n    end\nend\n\n-- chains a source with one or several filter(s)\nfunction source.chain(src, f, ...)\n    if ... then f=filter.chain(f, ...) end\n    base.assert(src and f)\n    local last_in, last_out = \"\", \"\"\n    local state = \"feeding\"\n    local err\n    return function()\n        if not last_out then\n            base.error('source is empty!', 2)\n        end\n        while true do\n            if state == \"feeding\" then\n                last_in, err = src()\n                if err then return nil, err end\n                last_out = f(last_in)\n                if not last_out then\n                    if last_in then\n                        base.error('filter returned inappropriate nil')\n                    else\n                        return nil\n                    end\n                elseif last_out ~= \"\" then\n                    state = \"eating\"\n                    if last_in then last_in = \"\" end\n                    return last_out\n                end\n            else\n                last_out = f(last_in)\n                if last_out == \"\" then\n                    if last_in == \"\" then\n                        state = \"feeding\"\n                    else\n                        base.error('filter returned \"\"')\n                    end\n                elseif not last_out then\n                    if last_in then\n                        base.error('filter returned inappropriate nil')\n                    else\n                        return nil\n                    end\n                else\n                    return last_out\n                end\n            end\n        end\n    end\nend\n\n-- creates a source that produces contents of several sources, one after the\n-- other, as if they were concatenated\n-- (thanks to Wim Couwenberg)\nfunction source.cat(...)\n    local arg = {...}\n    local src = table.remove(arg, 1)\n    return function()\n        while src do\n            local chunk, err = src()\n            if chunk then return chunk end\n            if err then return nil, err end\n            src = table.remove(arg, 1)\n        end\n    end\nend\n\n-----------------------------------------------------------------------------\n-- Sink stuff\n-----------------------------------------------------------------------------\n-- creates a sink that stores into a table\nfunction sink.table(t)\n    t = t or {}\n    local f = function(chunk, err)\n        if chunk then table.insert(t, chunk) end\n        return 1\n    end\n    return f, t\nend\n\n-- turns a fancy sink into a simple sink\nfunction sink.simplify(snk)\n    base.assert(snk)\n    return function(chunk, err)\n        local ret, err_or_new = snk(chunk, err)\n        if not ret then return nil, err_or_new end\n        snk = err_or_new or snk\n        return 1\n    end\nend\n\n-- creates a file sink\nfunction sink.file(handle, io_err)\n    if handle then\n        return function(chunk, err)\n            if not chunk then\n                handle:close()\n                return 1\n            else return handle:write(chunk) end\n        end\n    else return sink.error(io_err or \"unable to open file\") end\nend\n\n-- creates a sink that discards data\nlocal function null()\n    return 1\nend\n\nfunction sink.null()\n    return null\nend\n\n-- creates a sink that just returns an error\nfunction sink.error(err)\n    return function()\n        return nil, err\n    end\nend\n\n-- chains a sink with one or several filter(s)\nfunction sink.chain(f, snk, ...)\n    if ... then\n        local args = { f, snk, ... }\n        snk = table.remove(args, #args)\n        f = filter.chain(unpack(args))\n    end\n    base.assert(f and snk)\n    return function(chunk, err)\n        if chunk ~= \"\" then\n            local filtered = f(chunk)\n            local done = chunk and \"\"\n            while true do\n                local ret, snkerr = snk(filtered, err)\n                if not ret then return nil, snkerr end\n                if filtered == done then return 1 end\n                filtered = f(done)\n            end\n        else return 1 end\n    end\nend\n\n-----------------------------------------------------------------------------\n-- Pump stuff\n-----------------------------------------------------------------------------\n-- pumps one chunk from the source to the sink\nfunction pump.step(src, snk)\n    local chunk, src_err = src()\n    local ret, snk_err = snk(chunk, src_err)\n    if chunk and ret then return 1\n    else return nil, src_err or snk_err end\nend\n\n-- pumps all data from a source to a sink, using a step function\nfunction pump.all(src, snk, step)\n    base.assert(src and snk)\n    step = step or pump.step\n    while true do\n        local ret, err = step(src, snk)\n        if not ret then\n            if err then return nil, err\n            else return 1 end\n        end\n    end\nend\n\nreturn _M\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/ltn12.lua.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n * \n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n * \n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n * \n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\nnamespace love\n{\n\n// [ltn12.lua]\nconst unsigned char ltn12_lua[] = \n{\n\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x4c, 0x54, 0x4e, 0x31, 0x32, 0x20, 0x2d, 0x20, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, \n\t0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x73, 0x20, 0x61, \n\t0x6e, 0x64, 0x20, 0x70, 0x75, 0x6d, 0x70, 0x73, 0x2e, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x4c, 0x75, 0x61, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0x6b, \n\t0x69, 0x74, 0x2e, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x3a, 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x20, 0x4e, \n\t0x65, 0x68, 0x61, 0x62, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, \n\t0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, \n\t0x69, 0x72, 0x65, 0x28, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, \n\t0x61, 0x63, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, \n\t0x6b, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x47, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, \n\t0x65, 0x63, 0x74, 0x0a,\n\t0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x4d, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x69, 0x66, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x2d, 0x2d, 0x20, \n\t0x68, 0x65, 0x75, 0x72, 0x69, 0x73, 0x74, 0x69, 0x63, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x70, 0x6f, \n\t0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x63, \n\t0x6b, 0x61, 0x67, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x4d, 0x20, 0x20, 0x2d, 0x2d, \n\t0x20, 0x6c, 0x75, 0x61, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x3a, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2c, 0x73, 0x6f, 0x75, 0x72, 0x63, \n\t0x65, 0x2c, 0x73, 0x69, 0x6e, 0x6b, 0x2c, 0x70, 0x75, 0x6d, 0x70, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x2c, 0x7b, \n\t0x7d, 0x2c, 0x7b, 0x7d, 0x2c, 0x7b, 0x7d, 0x0a,\n\t0x0a,\n\t0x5f, 0x4d, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x73, 0x69, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x70, 0x75, 0x6d, 0x70, 0x20, 0x3d, 0x20, 0x70, 0x75, 0x6d, 0x70, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x32, 0x30, 0x34, 0x38, 0x20, 0x73, 0x65, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, \n\t0x65, 0x20, 0x62, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, \n\t0x73, 0x2e, 0x2e, 0x2e, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x53, 0x49, 0x5a, 0x45, 0x20, 0x3d, 0x20, 0x32, 0x30, 0x34, \n\t0x38, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x20, 0x3d, 0x20, 0x22, 0x4c, 0x54, 0x4e, \n\t0x31, 0x32, 0x20, 0x31, 0x2e, 0x30, 0x2e, 0x33, 0x22, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x73, 0x74, 0x75, 0x66, 0x66, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x68, 0x69, 0x67, 0x68, 0x20, \n\t0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, \n\t0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x6f, 0x77, 0x2d, 0x6c, 0x65, 0x76, 0x65, 0x6c, \n\t0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x79, \n\t0x63, 0x6c, 0x65, 0x28, 0x6c, 0x6f, 0x77, 0x2c, 0x20, 0x63, 0x74, 0x78, 0x2c, 0x20, 0x65, 0x78, 0x74, 0x72, \n\t0x61, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x6f, \n\t0x77, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, \n\t0x6e, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x2c, 0x20, 0x63, 0x74, 0x78, 0x20, 0x3d, \n\t0x20, 0x6c, 0x6f, 0x77, 0x28, 0x63, 0x74, 0x78, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x65, \n\t0x78, 0x74, 0x72, 0x61, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x62, 0x75, 0x6e, 0x63, 0x68, 0x20, \n\t0x6f, 0x66, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x67, 0x65, 0x74, 0x68, 0x65, \n\t0x72, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x28, 0x74, 0x68, 0x61, 0x6e, 0x6b, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x57, 0x69, 0x6d, 0x20, \n\t0x43, 0x6f, 0x75, 0x77, 0x65, 0x6e, 0x62, 0x65, 0x72, 0x67, 0x29, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x68, \n\t0x61, 0x69, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x7b, 0x2e, \n\t0x2e, 0x2e, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, \n\t0x63, 0x74, 0x28, 0x27, 0x23, 0x27, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x69, 0x6e, 0x64, \n\t0x65, 0x78, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x72, 0x79, 0x20, 0x3d, 0x20, \n\t0x22, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, \n\t0x6e, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x63, 0x68, \n\t0x75, 0x6e, 0x6b, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x74, 0x72, 0x79, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x72, 0x75, 0x65, \n\t0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x6e, 0x64, \n\t0x65, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x6f, 0x70, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, \n\t0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x28, 0x63, \n\t0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, \n\t0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x6f, \n\t0x70, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, \n\t0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, \n\t0x73, 0x65, 0x69, 0x66, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x69, 0x6e, \n\t0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, \n\t0x73, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x74, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x70, 0x2b, 0x31, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x70, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, \n\t0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, \n\t0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x28, 0x63, \n\t0x68, 0x75, 0x6e, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, \n\t0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2d, 0x20, \n\t0x31, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x74, 0x72, 0x79, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, \n\t0x73, 0x65, 0x69, 0x66, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x20, 0x74, 0x68, \n\t0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, \n\t0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, \n\t0x73, 0x65, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x66, 0x69, 0x6c, \n\t0x74, 0x65, 0x72, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x61, 0x70, 0x70, \n\t0x72, 0x6f, 0x70, 0x72, 0x69, 0x61, 0x74, 0x65, 0x20, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x73, 0x74, 0x75, 0x66, 0x66, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, \n\t0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x6d, 0x70, \n\t0x74, 0x79, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x65, 0x6d, \n\t0x70, 0x74, 0x79, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, \n\t0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, \n\t0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x65, 0x72, \n\t0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, \n\t0x6e, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, \n\t0x2c, 0x20, 0x65, 0x72, 0x72, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, \n\t0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x66, 0x69, \n\t0x6c, 0x65, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6f, 0x5f, 0x65, 0x72, 0x72, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, \n\t0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, \n\t0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x3a, 0x72, 0x65, 0x61, \n\t0x64, 0x28, 0x5f, 0x4d, 0x2e, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x53, 0x49, 0x5a, 0x45, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, \n\t0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, \n\t0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, \n\t0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, \n\t0x75, 0x72, 0x63, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x69, 0x6f, 0x5f, 0x65, 0x72, 0x72, 0x20, \n\t0x6f, 0x72, 0x20, 0x22, 0x75, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x70, 0x65, 0x6e, \n\t0x20, 0x66, 0x69, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x66, 0x61, 0x6e, 0x63, 0x79, 0x20, 0x73, \n\t0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6d, 0x70, 0x6c, \n\t0x65, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x73, 0x69, \n\t0x6d, 0x70, 0x6c, 0x69, 0x66, 0x79, 0x28, 0x73, 0x72, 0x63, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x72, \n\t0x63, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, \n\t0x6e, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, \n\t0x6b, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x5f, 0x6f, 0x72, 0x5f, 0x6e, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x73, 0x72, \n\t0x63, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x5f, \n\t0x6f, 0x72, 0x5f, 0x6e, 0x65, 0x77, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x72, 0x63, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x68, 0x75, \n\t0x6e, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, \n\t0x2c, 0x20, 0x65, 0x72, 0x72, 0x5f, 0x6f, 0x72, 0x5f, 0x6e, 0x65, 0x77, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, \n\t0x6e, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, \n\t0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x73, 0x74, \n\t0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x20, 0x3d, 0x20, \n\t0x31, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, \n\t0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, \n\t0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x73, 0x75, 0x62, \n\t0x28, 0x73, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x69, 0x2b, 0x5f, 0x4d, 0x2e, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x53, \n\t0x49, 0x5a, 0x45, 0x2d, 0x31, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x69, 0x20, \n\t0x2b, 0x20, 0x5f, 0x4d, 0x2e, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x53, 0x49, 0x5a, 0x45, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x68, 0x75, \n\t0x6e, 0x6b, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, \n\t0x72, 0x6e, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, \n\t0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, \n\t0x75, 0x72, 0x63, 0x65, 0x2e, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x73, \n\t0x6f, 0x75, 0x72, 0x63, 0x65, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x74, 0x61, \n\t0x62, 0x6c, 0x65, 0x28, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x27, 0x74, \n\t0x61, 0x62, 0x6c, 0x65, 0x27, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x74, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, \n\t0x6e, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x5b, 0x69, \n\t0x5d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x20, 0x72, 0x65, 0x77, 0x69, 0x6e, 0x64, 0x61, \n\t0x62, 0x6c, 0x65, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x72, 0x65, \n\t0x77, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x72, 0x63, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x72, \n\t0x63, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, \n\t0x6e, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x68, 0x75, \n\t0x6e, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, \n\t0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, \n\t0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, \n\t0x20, 0x73, 0x72, 0x63, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, \n\t0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, \n\t0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x74, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, \n\t0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x76, 0x65, 0x72, \n\t0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x73, 0x29, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x63, 0x68, \n\t0x61, 0x69, 0x6e, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x66, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x66, 0x3d, \n\t0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x28, 0x66, 0x2c, 0x20, 0x2e, 0x2e, \n\t0x2e, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x72, \n\t0x63, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x2c, \n\t0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, \n\t0x22, 0x66, 0x65, 0x65, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x72, 0x72, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, \n\t0x6e, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x61, 0x73, \n\t0x74, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x65, \n\t0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, \n\t0x70, 0x74, 0x79, 0x21, 0x27, 0x2c, 0x20, 0x32, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x72, 0x75, 0x65, \n\t0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x74, 0x61, \n\t0x74, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x65, 0x65, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x74, 0x68, \n\t0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, \n\t0x73, 0x74, 0x5f, 0x69, 0x6e, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, \n\t0x20, 0x65, 0x72, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, \n\t0x69, 0x6c, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, \n\t0x73, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, \n\t0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, \n\t0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, \n\t0x61, 0x70, 0x70, 0x72, 0x6f, 0x70, 0x72, 0x69, 0x61, 0x74, 0x65, 0x20, 0x6e, 0x69, 0x6c, 0x27, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, \n\t0x73, 0x65, 0x69, 0x66, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x7e, 0x3d, 0x20, 0x22, \n\t0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x65, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, \n\t0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, \n\t0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, \n\t0x73, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, \n\t0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x22, 0x20, 0x74, 0x68, \n\t0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x22, \n\t0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x66, 0x65, 0x65, \n\t0x64, 0x69, 0x6e, 0x67, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, \n\t0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x22, 0x22, \n\t0x27, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, \n\t0x73, 0x65, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x20, \n\t0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, \n\t0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, \n\t0x61, 0x70, 0x70, 0x72, 0x6f, 0x70, 0x72, 0x69, 0x61, 0x74, 0x65, 0x20, 0x6e, 0x69, 0x6c, 0x27, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, \n\t0x73, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, \n\t0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, \n\t0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x20, 0x63, 0x6f, \n\t0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x20, \n\t0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, \n\t0x20, 0x74, 0x68, 0x65, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x2c, 0x20, 0x61, 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, \n\t0x65, 0x79, 0x20, 0x77, 0x65, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x6e, 0x61, 0x74, \n\t0x65, 0x64, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x28, 0x74, 0x68, 0x61, 0x6e, 0x6b, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x57, 0x69, 0x6d, 0x20, \n\t0x43, 0x6f, 0x75, 0x77, 0x65, 0x6e, 0x62, 0x65, 0x72, 0x67, 0x29, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x63, 0x61, \n\t0x74, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x7b, 0x2e, \n\t0x2e, 0x2e, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x74, 0x61, \n\t0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x61, 0x72, 0x67, 0x2c, 0x20, 0x31, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, \n\t0x6e, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x73, 0x72, 0x63, 0x20, \n\t0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, \n\t0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x68, 0x75, \n\t0x6e, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x75, \n\t0x6e, 0x6b, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x65, 0x72, 0x72, \n\t0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, \n\t0x65, 0x72, 0x72, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, \n\t0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x61, 0x72, 0x67, 0x2c, 0x20, \n\t0x31, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x53, 0x69, 0x6e, 0x6b, 0x20, 0x73, 0x74, 0x75, 0x66, 0x66, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x20, \n\t0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x61, \n\t0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x74, 0x61, 0x62, 0x6c, \n\t0x65, 0x28, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, \n\t0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x74, \n\t0x68, 0x65, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x74, \n\t0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x2c, 0x20, 0x74, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x66, 0x61, 0x6e, 0x63, 0x79, 0x20, 0x73, \n\t0x69, 0x6e, 0x6b, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, \n\t0x73, 0x69, 0x6e, 0x6b, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x73, 0x69, 0x6d, 0x70, \n\t0x6c, 0x69, 0x66, 0x79, 0x28, 0x73, 0x6e, 0x6b, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x6e, \n\t0x6b, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, \n\t0x6e, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x2c, \n\t0x20, 0x65, 0x72, 0x72, 0x5f, 0x6f, 0x72, 0x5f, 0x6e, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x73, 0x6e, 0x6b, 0x28, \n\t0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x74, \n\t0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, \n\t0x65, 0x72, 0x72, 0x5f, 0x6f, 0x72, 0x5f, 0x6e, 0x65, 0x77, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x5f, \n\t0x6f, 0x72, 0x5f, 0x6e, 0x65, 0x77, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x6e, 0x6b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, \n\t0x73, 0x69, 0x6e, 0x6b, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x66, 0x69, 0x6c, 0x65, \n\t0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6f, 0x5f, 0x65, 0x72, 0x72, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, \n\t0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, \n\t0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, \n\t0x6e, 0x64, 0x6c, 0x65, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, \n\t0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, \n\t0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x3a, 0x77, 0x72, 0x69, 0x74, 0x65, \n\t0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x69, \n\t0x6e, 0x6b, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x69, 0x6f, 0x5f, 0x65, 0x72, 0x72, 0x20, 0x6f, 0x72, \n\t0x20, 0x22, 0x75, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x66, \n\t0x69, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x20, \n\t0x74, 0x68, 0x61, 0x74, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x73, 0x20, 0x64, 0x61, 0x74, 0x61, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x75, 0x6c, \n\t0x6c, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x6e, 0x75, 0x6c, 0x6c, \n\t0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x20, \n\t0x74, 0x68, 0x61, 0x74, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, \n\t0x61, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x65, 0x72, 0x72, 0x6f, \n\t0x72, 0x28, 0x65, 0x72, 0x72, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, \n\t0x6e, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, \n\t0x2c, 0x20, 0x65, 0x72, 0x72, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x20, 0x77, \n\t0x69, 0x74, 0x68, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x76, 0x65, 0x72, 0x61, 0x6c, \n\t0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x73, 0x29, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x63, 0x68, 0x61, 0x69, \n\t0x6e, 0x28, 0x66, 0x2c, 0x20, 0x73, 0x6e, 0x6b, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x73, \n\t0x20, 0x3d, 0x20, 0x7b, 0x20, 0x66, 0x2c, 0x20, 0x73, 0x6e, 0x6b, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, \n\t0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x23, 0x61, 0x72, \n\t0x67, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, \n\t0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x61, 0x72, 0x67, 0x73, \n\t0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x20, \n\t0x61, 0x6e, 0x64, 0x20, 0x73, 0x6e, 0x6b, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, \n\t0x6e, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x7e, \n\t0x3d, 0x20, 0x22, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, \n\t0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, \n\t0x64, 0x6f, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x22, \n\t0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, \n\t0x74, 0x72, 0x75, 0x65, 0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, \n\t0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x2c, 0x20, 0x73, 0x6e, 0x6b, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, \n\t0x73, 0x6e, 0x6b, 0x28, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, \n\t0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, \n\t0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x73, 0x6e, 0x6b, 0x65, 0x72, 0x72, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, \n\t0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x20, \n\t0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, \n\t0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x28, 0x64, 0x6f, 0x6e, 0x65, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, \n\t0x6e, 0x20, 0x31, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x50, 0x75, 0x6d, 0x70, 0x20, 0x73, 0x74, 0x75, 0x66, 0x66, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x70, 0x75, 0x6d, 0x70, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, \n\t0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x74, \n\t0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x75, 0x6d, 0x70, 0x2e, 0x73, 0x74, 0x65, 0x70, \n\t0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x6e, 0x6b, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, \n\t0x72, 0x63, 0x5f, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x2c, 0x20, 0x73, 0x6e, 0x6b, \n\t0x5f, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x6e, 0x6b, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, \n\t0x73, 0x72, 0x63, 0x5f, 0x65, 0x72, 0x72, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, \n\t0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, \n\t0x6c, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x65, 0x72, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x6e, 0x6b, 0x5f, \n\t0x65, 0x72, 0x72, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x70, 0x75, 0x6d, 0x70, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, \n\t0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x61, \n\t0x20, 0x73, 0x69, 0x6e, 0x6b, 0x2c, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x73, 0x74, 0x65, \n\t0x70, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x75, 0x6d, 0x70, 0x2e, 0x61, 0x6c, 0x6c, 0x28, \n\t0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x74, 0x65, 0x70, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x72, \n\t0x63, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x6e, 0x6b, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x65, 0x70, 0x20, 0x6f, 0x72, \n\t0x20, 0x70, 0x75, 0x6d, 0x70, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x2c, \n\t0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x65, 0x70, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, \n\t0x6e, 0x6b, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x74, \n\t0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x65, 0x72, 0x72, \n\t0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, \n\t0x65, 0x72, 0x72, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, \n\t0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x4d, 0x0a,\n}; // [ltn12.lua]\n} // love\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/luasocket.c",
    "content": "/*=========================================================================*\\\n* LuaSocket toolkit\n* Networking support for the Lua language\n* Diego Nehab\n* 26/11/1999\n*\n* This library is part of an  effort to progressively increase the network\n* connectivity  of  the Lua  language.  The  Lua interface  to  networking\n* functions follows the Sockets API  closely, trying to simplify all tasks\n* involved in setting up both  client and server connections. The provided\n* IO routines, however, follow the Lua  style, being very similar  to the\n* standard Lua read and write functions.\n\\*=========================================================================*/\n\n#include \"luasocket.h\"\n#include \"auxiliar.h\"\n#include \"except.h\"\n#include \"timeout.h\"\n#include \"buffer.h\"\n#include \"inet.h\"\n#include \"tcp.h\"\n#include \"udp.h\"\n#include \"select.h\"\n\n/*-------------------------------------------------------------------------*\\\n* Internal function prototypes\n\\*-------------------------------------------------------------------------*/\nstatic int global_skip(lua_State *L);\nstatic int global_unload(lua_State *L);\nstatic int base_open(lua_State *L);\n\n/*-------------------------------------------------------------------------*\\\n* Modules and functions\n\\*-------------------------------------------------------------------------*/\nstatic const luaL_Reg mod[] = {\n    {\"auxiliar\", auxiliar_open},\n    {\"except\", except_open},\n    {\"timeout\", timeout_open},\n    {\"buffer\", buffer_open},\n    {\"inet\", inet_open},\n    {\"tcp\", tcp_open},\n    {\"udp\", udp_open},\n    {\"select\", select_open},\n    {NULL, NULL}\n};\n\nstatic luaL_Reg func[] = {\n    {\"skip\",      global_skip},\n    {\"__unload\",  global_unload},\n    {NULL,        NULL}\n};\n\n/*-------------------------------------------------------------------------*\\\n* Skip a few arguments\n\\*-------------------------------------------------------------------------*/\nstatic int global_skip(lua_State *L) {\n    int amount = (int) luaL_checkinteger(L, 1);\n    int ret = lua_gettop(L) - amount - 1;\n    return ret >= 0 ? ret : 0;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Unloads the library\n\\*-------------------------------------------------------------------------*/\nstatic int global_unload(lua_State *L) {\n    (void) L;\n    socket_close();\n    return 0;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Setup basic stuff.\n\\*-------------------------------------------------------------------------*/\nstatic int base_open(lua_State *L) {\n    if (socket_open()) {\n        /* export functions (and leave namespace table on top of stack) */\n        lua_newtable(L);\n        luaL_setfuncs(L, func, 0);\n#ifdef LUASOCKET_DEBUG\n        lua_pushstring(L, \"_DEBUG\");\n        lua_pushboolean(L, 1);\n        lua_rawset(L, -3);\n#endif\n        /* make version string available to scripts */\n        lua_pushstring(L, \"_VERSION\");\n        lua_pushstring(L, LUASOCKET_VERSION);\n        lua_rawset(L, -3);\n        return 1;\n    } else {\n        lua_pushstring(L, \"unable to initialize library\");\n        lua_error(L);\n        return 0;\n    }\n}\n\n/*-------------------------------------------------------------------------*\\\n* Initializes all library modules.\n\\*-------------------------------------------------------------------------*/\nLUASOCKET_API int luaopen_socket_core(lua_State *L) {\n    int i;\n    base_open(L);\n    for (i = 0; mod[i].name; i++) mod[i].func(L);\n    return 1;\n}\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/luasocket.h",
    "content": "#ifndef LUASOCKET_H\n#define LUASOCKET_H\n/*=========================================================================*\\\n* LuaSocket toolkit\n* Networking support for the Lua language\n* Diego Nehab\n* 9/11/1999\n\\*=========================================================================*/\n\n/*-------------------------------------------------------------------------* \\\n* Current socket library version\n\\*-------------------------------------------------------------------------*/\n#define LUASOCKET_VERSION    \"LuaSocket 3.1.0\"\n#define LUASOCKET_COPYRIGHT  \"Copyright (C) 1999-2013 Diego Nehab\"\n\n/*-------------------------------------------------------------------------*\\\n* This macro prefixes all exported API functions\n\\*-------------------------------------------------------------------------*/\n#ifndef LUASOCKET_API\n#ifdef _WIN32\n#define LUASOCKET_API __declspec(dllexport)\n#else\n#define LUASOCKET_API __attribute__ ((visibility (\"default\")))\n#endif\n#endif\n\n#include \"lua.h\"\n#include \"lauxlib.h\"\n#include \"compat.h\"\n\n/*-------------------------------------------------------------------------*\\\n* Initializes the library.\n\\*-------------------------------------------------------------------------*/\nLUASOCKET_API int luaopen_socket_core(lua_State *L);\n\n#endif /* LUASOCKET_H */\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/makefile",
    "content": "# luasocket src/makefile\n#\n# Definitions in this section can be overridden on the command line or in the\n# environment.\n#\n# These are equivalent:\n#\n#    export PLAT=linux DEBUG=DEBUG LUAV=5.2 prefix=/sw\n#    make\n#\n# and\n#\n#   make PLAT=linux DEBUG=DEBUG LUAV=5.2 prefix=/sw\n\n# PLAT: linux macosx win32 win64 mingw\n# platform to build for\nPLAT?=linux\n\n# LUAV: 5.1 5.2 5.3 5.4\n# lua version to build against\nLUAV?=5.1\n\n# MYCFLAGS: to be set by user if needed\nMYCFLAGS?=\n\n# MYLDFLAGS: to be set by user if needed\nMYLDFLAGS?=\n\n# DEBUG: NODEBUG DEBUG\n# debug mode causes luasocket to collect and returns timing information useful\n# for testing and debugging luasocket itself\nDEBUG?=NODEBUG\n\n# where lua headers are found for macosx builds\n# LUAINC_macosx:\n# /opt/local/include\nLUAINC_macosx_base?=/opt/local/include\nLUAINC_macosx?=$(LUAINC_macosx_base)/lua/$(LUAV) $(LUAINC_macosx_base)/lua$(LUAV) $(LUAINC_macosx_base)/lua-$(LUAV)\n\n# FIXME default should this default to fink or to macports?\n# What happens when more than one Lua version is installed?\nLUAPREFIX_macosx?=/opt/local\nCDIR_macosx?=lib/lua/$(LUAV)\nLDIR_macosx?=share/lua/$(LUAV)\n\n# LUAINC_linux:\n# /usr/include/lua$(LUAV)\n# /usr/local/include\n# /usr/local/include/lua$(LUAV)\n# where lua headers are found for linux builds\nLUAINC_linux_base?=/usr/include\nLUAINC_linux?=$(LUAINC_linux_base)/lua/$(LUAV) $(LUAINC_linux_base)/lua$(LUAV)\nLUAPREFIX_linux?=/usr/local\nCDIR_linux?=lib/lua/$(LUAV)\nLDIR_linux?=share/lua/$(LUAV)\n\n# LUAINC_freebsd:\n# /usr/local/include/lua$(LUAV)\n# where lua headers are found for freebsd builds\nLUAINC_freebsd_base?=/usr/local/include/\nLUAINC_freebsd?=$(LUAINC_freebsd_base)/lua/$(LUAV) $(LUAINC_freebsd_base)/lua$(LUAV)\nLUAPREFIX_freebsd?=/usr/local/\nCDIR_freebsd?=lib/lua/$(LUAV)\nLDIR_freebsd?=share/lua/$(LUAV)\n\n# where lua headers are found for mingw builds\n# LUAINC_mingw:\n# /opt/local/include\nLUAINC_mingw_base?=/usr/include\nLUAINC_mingw?=$(LUAINC_mingw_base)/lua/$(LUAV) $(LUAINC_mingw_base)/lua$(LUAV)\nLUALIB_mingw_base?=/usr/bin\nLUALIB_mingw?=$(LUALIB_mingw_base)/lua/$(LUAV)/lua$(subst .,,$(LUAV)).dll\nLUAPREFIX_mingw?=/usr\nCDIR_mingw?=lua/$(LUAV)\nLDIR_mingw?=lua/$(LUAV)/lua\n\n\n# LUAINC_win32:\n# LUALIB_win32:\n# where lua headers and libraries are found for win32 builds\nLUAPREFIX_win32?=\nLUAINC_win32?=$(LUAPREFIX_win32)/include/lua/$(LUAV) $(LUAPREFIX_win32)/include/lua$(LUAV)\nPLATFORM_win32?=Release\nCDIR_win32?=bin/lua/$(LUAV)/$(PLATFORM_win32)\nLDIR_win32?=bin/lua/$(LUAV)/$(PLATFORM_win32)/lua\nLUALIB_win32?=$(LUAPREFIX_win32)/lib/lua/$(LUAV)/$(PLATFORM_win32)\nLUALIBNAME_win32?=lua$(subst .,,$(LUAV)).lib\n\n# LUAINC_win64:\n# LUALIB_win64:\n# where lua headers and libraries are found for win64 builds\nLUAPREFIX_win64?=\nLUAINC_win64?=$(LUAPREFIX_win64)/include/lua/$(LUAV) $(LUAPREFIX_win64)/include/lua$(LUAV)\nPLATFORM_win64?=x64/Release\nCDIR_win64?=bin/lua/$(LUAV)/$(PLATFORM_win64)\nLDIR_win64?=bin/lua/$(LUAV)/$(PLATFORM_win64)/lua\nLUALIB_win64?=$(LUAPREFIX_win64)/lib/lua/$(LUAV)/$(PLATFORM_win64)\nLUALIBNAME_win64?=lua$(subst .,,$(LUAV)).lib\n\n\n# LUAINC_solaris:\nLUAINC_solaris_base?=/usr/include\nLUAINC_solaris?=$(LUAINC_solaris_base)/lua/$(LUAV) $(LUAINC_solaris_base)/lua$(LUAV)\nLUAPREFIX_solaris?=/usr/local\nCDIR_solaris?=lib/lua/$(LUAV)\nLDIR_solaris?=share/lua/$(LUAV)\n\n# prefix: /usr/local /usr /opt/local /sw\n# the top of the default install tree\nprefix?=$(LUAPREFIX_$(PLAT))\n\nCDIR?=$(CDIR_$(PLAT))\nLDIR?=$(LDIR_$(PLAT))\n\n# DESTDIR: (no default)\n# used by package managers to install into a temporary destination\nDESTDIR?=\n\n#------\n# Definitions below can be overridden on the make command line, but\n# shouldn't have to be.\n\n\n#------\n# Install directories\n#\n\nINSTALL_DIR=install -d\nINSTALL_DATA=install -m644\nINSTALL_EXEC=install\nINSTALL_TOP=$(DESTDIR)$(prefix)\n\nINSTALL_TOP_LDIR=$(INSTALL_TOP)/$(LDIR)\nINSTALL_TOP_CDIR=$(INSTALL_TOP)/$(CDIR)\n\nINSTALL_SOCKET_LDIR=$(INSTALL_TOP_LDIR)/socket\nINSTALL_SOCKET_CDIR=$(INSTALL_TOP_CDIR)/socket\nINSTALL_MIME_LDIR=$(INSTALL_TOP_LDIR)/mime\nINSTALL_MIME_CDIR=$(INSTALL_TOP_CDIR)/mime\n\nprint:\n\t@echo PLAT=$(PLAT)\n\t@echo LUAV=$(LUAV)\n\t@echo DEBUG=$(DEBUG)\n\t@echo prefix=$(prefix)\n\t@echo LUAINC_$(PLAT)=$(LUAINC_$(PLAT))\n\t@echo LUALIB_$(PLAT)=$(LUALIB_$(PLAT))\n\t@echo INSTALL_TOP_CDIR=$(INSTALL_TOP_CDIR)\n\t@echo INSTALL_TOP_LDIR=$(INSTALL_TOP_LDIR)\n\t@echo CFLAGS=$(CFLAGS)\n\t@echo LDFLAGS=$(LDFLAGS)\n\n#------\n# Supported platforms\n#\nPLATS= macosx linux win32 win64 mingw solaris\n\n#------\n# Compiler and linker settings\n# for Mac OS X\nSO_macosx=so\nO_macosx=o\nCC_macosx=gcc\nDEF_macosx= -DLUASOCKET_$(DEBUG) -DUNIX_HAS_SUN_LEN\nCFLAGS_macosx=$(LUAINC:%=-I%) $(DEF) -Wall -O2 -fno-common\nLDFLAGS_macosx= -bundle -undefined dynamic_lookup -o\nLD_macosx=gcc\nSOCKET_macosx=usocket.o\n\n#------\n# Compiler and linker settings\n# for Linux\nSO_linux=so\nO_linux=o\nCC_linux=gcc\nDEF_linux=-DLUASOCKET_$(DEBUG)\nCFLAGS_linux=$(LUAINC:%=-I%) $(DEF) -Wall -Wshadow -Wextra \\\n\t-Wimplicit -O2 -ggdb3 -fpic\nLDFLAGS_linux=-O -shared -fpic -o\nLD_linux=gcc\nSOCKET_linux=usocket.o\n\n#------\n# Compiler and linker settings\n# for FreeBSD\nSO_freebsd=so\nO_freebsd=o\nCC_freebsd=gcc\nDEF_freebsd=-DLUASOCKET_$(DEBUG) -DUNIX_HAS_SUN_LEN\nCFLAGS_freebsd=$(LUAINC:%=-I%) $(DEF) -Wall -Wshadow -Wextra \\\n\t-Wimplicit -O2 -ggdb3 -fpic\nLDFLAGS_freebsd=-O -shared -fpic -o\nLD_freebsd=gcc\nSOCKET_freebsd=usocket.o\n\n#------\n# Compiler and linker settings\n# for Solaris\nSO_solaris=so\nO_solaris=o\nCC_solaris=gcc\nDEF_solaris=-DLUASOCKET_$(DEBUG)\nCFLAGS_solaris=$(LUAINC:%=-I%) $(DEF) -Wall -Wshadow -Wextra \\\n\t-Wimplicit -O2 -ggdb3 -fpic\nLDFLAGS_solaris=-lnsl -lsocket -lresolv -O -shared -fpic -o\nLD_solaris=gcc\nSOCKET_solaris=usocket.o\n\n#------\n# Compiler and linker settings\n# for MingW\nSO_mingw=dll\nO_mingw=o\nCC_mingw=gcc\nDEF_mingw= -DLUASOCKET_$(DEBUG) \\\n\t-DWINVER=0x0501\nCFLAGS_mingw=$(LUAINC:%=-I%) $(DEF) -Wall -O2 -fno-common\nLDFLAGS_mingw= $(LUALIB) -shared -Wl,-s -lws2_32 -o\nLD_mingw=gcc\nSOCKET_mingw=wsocket.o\n\n\n#------\n# Compiler and linker settings\n# for Win32\nSO_win32=dll\nO_win32=obj\nCC_win32=cl\nDEF_win32= //D \"WIN32\" //D \"NDEBUG\" //D \"_WINDOWS\" //D \"_USRDLL\" \\\n     //D \"_CRT_SECURE_NO_WARNINGS\" \\\n     //D \"_WINDLL\"  \\\n     //D \"LUASOCKET_$(DEBUG)\"\nCFLAGS_win32=$(LUAINC:%=//I \"%\") $(DEF) //O2 //Ot //MD //W3 //nologo\nLDFLAGS_win32= //nologo //link //NOLOGO //DLL //INCREMENTAL:NO \\\n    //MANIFEST //MANIFESTFILE:\"intermediate.manifest\" \\\n    /MANIFESTUAC:\"level='asInvoker' uiAccess='false'\" \\\n\t//SUBSYSTEM:WINDOWS //OPT:REF //OPT:ICF //DYNAMICBASE:NO \\\n    //MACHINE:X86 /LIBPATH:\"$(LUALIB)\" \\\n\t$(LUALIBNAME_win32) ws2_32.lib //OUT:\n\nLD_win32=cl\nSOCKET_win32=wsocket.obj\n\n#------\n# Compiler and linker settings\n# for Win64\nSO_win64=dll\nO_win64=obj\nCC_win64=cl\nDEF_win64= //D \"WIN32\" //D \"NDEBUG\" //D \"_WINDOWS\" //D \"_USRDLL\" \\\n     //D \"_CRT_SECURE_NO_WARNINGS\" \\\n     //D \"_WINDLL\"  \\\n     //D \"LUASOCKET_$(DEBUG)\"\nCFLAGS_win64=$(LUAINC:%=//I \"%\") $(DEF) //O2 //Ot //MD //W3 //nologo\nLDFLAGS_win64= //nologo //link //NOLOGO //DLL //INCREMENTAL:NO \\\n    //MANIFEST //MANIFESTFILE:\"intermediate.manifest\" \\\n    /MANIFESTUAC:\"level='asInvoker' uiAccess='false'\" \\\n\t//SUBSYSTEM:WINDOWS //OPT:REF //OPT:ICF //DYNAMICBASE:NO \\\n    /LIBPATH:\"$(LUALIB)\" \\\n\t$(LUALIBNAME_win64) ws2_32.lib //OUT:\n\nLD_win64=cl\nSOCKET_win64=wsocket.obj\n\n.SUFFIXES: .obj\n\n.c.obj:\n\t$(CC) $(CFLAGS) //Fo\"$@\" //c $<\n\n#------\n# Output file names\n#\nSO=$(SO_$(PLAT))\nO=$(O_$(PLAT))\nSOCKET_V=3.1.0\nMIME_V=1.0.3\nSOCKET_SO=socket-$(SOCKET_V).$(SO)\nMIME_SO=mime-$(MIME_V).$(SO)\nUNIX_SO=unix.$(SO)\nSERIAL_SO=serial.$(SO)\nSOCKET=$(SOCKET_$(PLAT))\n\n#------\n# Settings selected for platform\n#\nCC=$(CC_$(PLAT))\nDEF=$(DEF_$(PLAT))\nCFLAGS=$(MYCFLAGS) $(CFLAGS_$(PLAT))\nLDFLAGS=$(MYLDFLAGS) $(LDFLAGS_$(PLAT))\nLD=$(LD_$(PLAT))\nLUAINC= $(LUAINC_$(PLAT))\nLUALIB= $(LUALIB_$(PLAT))\n\n#------\n# Modules belonging to socket-core\n#\nSOCKET_OBJS= \\\n\tluasocket.$(O) \\\n\ttimeout.$(O) \\\n\tbuffer.$(O) \\\n\tio.$(O) \\\n\tauxiliar.$(O) \\\n\tcompat.$(O) \\\n\toptions.$(O) \\\n\tinet.$(O) \\\n\t$(SOCKET) \\\n\texcept.$(O) \\\n\tselect.$(O) \\\n\ttcp.$(O) \\\n\tudp.$(O)\n\n#------\n# Modules belonging mime-core\n#\nMIME_OBJS= \\\n\tmime.$(O) \\\n\tcompat.$(O)\n\n#------\n# Modules belonging unix (local domain sockets)\n#\nUNIX_OBJS=\\\n\tbuffer.$(O) \\\n\tauxiliar.$(O) \\\n\toptions.$(O) \\\n\ttimeout.$(O) \\\n\tio.$(O) \\\n\tusocket.$(O) \\\n\tunixstream.$(O) \\\n\tunixdgram.$(O) \\\n\tcompat.$(O) \\\n\tunix.$(O)\n\n#------\n# Modules belonging to serial (device streams)\n#\nSERIAL_OBJS=\\\n\tbuffer.$(O) \\\n\tcompat.$(O) \\\n\tauxiliar.$(O) \\\n\toptions.$(O) \\\n\ttimeout.$(O) \\\n\tio.$(O) \\\n\tusocket.$(O) \\\n\tserial.$(O)\n\n#------\n# Files to install\n#\nTO_SOCKET_LDIR= \\\n\thttp.lua \\\n\turl.lua \\\n\ttp.lua \\\n\tftp.lua \\\n\theaders.lua \\\n\tsmtp.lua\n\nTO_TOP_LDIR= \\\n\tltn12.lua \\\n\tsocket.lua \\\n\tmime.lua\n\n#------\n# Targets\n#\ndefault: $(PLAT)\n\n\nfreebsd:\n\t$(MAKE) all-unix PLAT=freebsd\n\nmacosx:\n\t$(MAKE) all-unix PLAT=macosx\n\nwin32:\n\t$(MAKE) all PLAT=win32\n\nwin64:\n\t$(MAKE) all PLAT=win64\n\nlinux:\n\t$(MAKE) all-unix PLAT=linux\n\nmingw:\n\t$(MAKE) all PLAT=mingw\n\nsolaris:\n\t$(MAKE) all-unix PLAT=solaris\n\nnone:\n\t@echo \"Please run\"\n\t@echo \"   make PLATFORM\"\n\t@echo \"where PLATFORM is one of these:\"\n\t@echo \"   $(PLATS)\"\n\nall: $(SOCKET_SO) $(MIME_SO)\n\n$(SOCKET_SO): $(SOCKET_OBJS)\n\t$(LD) $(SOCKET_OBJS) $(LDFLAGS)$@\n\n$(MIME_SO): $(MIME_OBJS)\n\t$(LD) $(MIME_OBJS) $(LDFLAGS)$@\n\nall-unix: all $(UNIX_SO) $(SERIAL_SO)\n\n$(UNIX_SO): $(UNIX_OBJS)\n\t$(LD) $(UNIX_OBJS) $(LDFLAGS)$@\n\n$(SERIAL_SO): $(SERIAL_OBJS)\n\t$(LD) $(SERIAL_OBJS) $(LDFLAGS)$@\n\ninstall:\n\t$(INSTALL_DIR) $(INSTALL_TOP_LDIR)\n\t$(INSTALL_DATA) $(TO_TOP_LDIR) $(INSTALL_TOP_LDIR)\n\t$(INSTALL_DIR) $(INSTALL_SOCKET_LDIR)\n\t$(INSTALL_DATA) $(TO_SOCKET_LDIR) $(INSTALL_SOCKET_LDIR)\n\t$(INSTALL_DIR) $(INSTALL_SOCKET_CDIR)\n\t$(INSTALL_EXEC) $(SOCKET_SO) $(INSTALL_SOCKET_CDIR)/core.$(SO)\n\t$(INSTALL_DIR) $(INSTALL_MIME_CDIR)\n\t$(INSTALL_EXEC) $(MIME_SO) $(INSTALL_MIME_CDIR)/core.$(SO)\n\ninstall-unix: install\n\t$(INSTALL_EXEC) $(UNIX_SO) $(INSTALL_SOCKET_CDIR)/$(UNIX_SO)\n\t$(INSTALL_EXEC) $(SERIAL_SO) $(INSTALL_SOCKET_CDIR)/$(SERIAL_SO)\n\nlocal:\n\t$(MAKE) install INSTALL_TOP_CDIR=.. INSTALL_TOP_LDIR=..\n\nclean:\n\trm -f $(SOCKET_SO) $(SOCKET_OBJS) $(SERIAL_OBJS)\n\trm -f $(MIME_SO) $(UNIX_SO) $(SERIAL_SO) $(MIME_OBJS) $(UNIX_OBJS)\n\n.PHONY: all $(PLATS) default clean echo none\n\n#------\n# List of dependencies\n#\ncompat.$(O): compat.c compat.h\nauxiliar.$(O): auxiliar.c auxiliar.h\nbuffer.$(O): buffer.c buffer.h io.h timeout.h\nexcept.$(O): except.c except.h\ninet.$(O): inet.c inet.h socket.h io.h timeout.h usocket.h\nio.$(O): io.c io.h timeout.h\nluasocket.$(O): luasocket.c luasocket.h auxiliar.h except.h \\\n\ttimeout.h buffer.h io.h inet.h socket.h usocket.h tcp.h \\\n\tudp.h select.h\nmime.$(O): mime.c mime.h\noptions.$(O): options.c auxiliar.h options.h socket.h io.h \\\n\ttimeout.h usocket.h inet.h\nselect.$(O): select.c socket.h io.h timeout.h usocket.h select.h\nserial.$(O): serial.c auxiliar.h socket.h io.h timeout.h usocket.h \\\n  options.h unix.h buffer.h\ntcp.$(O): tcp.c auxiliar.h socket.h io.h timeout.h usocket.h \\\n\tinet.h options.h tcp.h buffer.h\ntimeout.$(O): timeout.c auxiliar.h timeout.h\nudp.$(O): udp.c auxiliar.h socket.h io.h timeout.h usocket.h \\\n\tinet.h options.h udp.h\nunix.$(O): unix.c auxiliar.h socket.h io.h timeout.h usocket.h \\\n\toptions.h unix.h buffer.h\nusocket.$(O): usocket.c socket.h io.h timeout.h usocket.h\nwsocket.$(O): wsocket.c socket.h io.h timeout.h usocket.h\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/mbox.lua",
    "content": "local _M = {}\n\nif module then\n    mbox = _M   -- luacheck: ignore\nend\n\nfunction _M.split_message(message_s)\n    local message = {}\n    message_s = string.gsub(message_s, \"\\r\\n\", \"\\n\")\n    string.gsub(message_s, \"^(.-\\n)\\n\", function (h) message.headers = h end)\n    string.gsub(message_s, \"^.-\\n\\n(.*)\", function (b) message.body = b end)\n    if not message.body then\n        string.gsub(message_s, \"^\\n(.*)\", function (b) message.body = b end)\n    end\n    if not message.headers and not message.body then\n        message.headers = message_s\n    end\n    return message.headers or \"\", message.body or \"\"\nend\n\nfunction _M.split_headers(headers_s)\n    local headers = {}\n    headers_s = string.gsub(headers_s, \"\\r\\n\", \"\\n\")\n    headers_s = string.gsub(headers_s, \"\\n[ ]+\", \" \")\n    string.gsub(\"\\n\" .. headers_s, \"\\n([^\\n]+)\", function (h) table.insert(headers, h) end)\n    return headers\nend\n\nfunction _M.parse_header(header_s)\n    header_s = string.gsub(header_s, \"\\n[ ]+\", \" \")\n    header_s = string.gsub(header_s, \"\\n+\", \"\")\n    local _, _, name, value = string.find(header_s, \"([^%s:]-):%s*(.*)\")\n    return name, value\nend\n\nfunction _M.parse_headers(headers_s)\n    local headers_t = _M.split_headers(headers_s)\n    local headers = {}\n    for i = 1, #headers_t do\n        local name, value = _M.parse_header(headers_t[i])\n        if name then\n            name = string.lower(name)\n            if headers[name] then\n                headers[name] = headers[name] .. \", \" .. value\n            else headers[name] = value end\n        end\n    end\n    return headers\nend\n\nfunction _M.parse_from(from)\n    local _, _, name, address = string.find(from, \"^%s*(.-)%s*%<(.-)%>\")\n    if not address then\n        _, _, address = string.find(from, \"%s*(.+)%s*\")\n    end\n    name = name or \"\"\n    address = address or \"\"\n    if name == \"\" then name = address end\n    name = string.gsub(name, '\"', \"\")\n    return name, address\nend\n\nfunction _M.split_mbox(mbox_s)\n    local mbox = {}\n    mbox_s = string.gsub(mbox_s, \"\\r\\n\", \"\\n\") ..\"\\n\\nFrom \\n\"\n    local nj, i\n    local j = 1\n    while 1 do\n        i, nj = string.find(mbox_s, \"\\n\\nFrom .-\\n\", j)\n        if not i then break end\n        local message = string.sub(mbox_s, j, i-1)\n        table.insert(mbox, message)\n        j = nj+1\n    end\n    return mbox\nend\n\nfunction _M.parse(mbox_s)\n    local mbox = _M.split_mbox(mbox_s)\n    for i = 1, #mbox do\n        mbox[i] = _M.parse_message(mbox[i])\n    end\n    return mbox\nend\n\nfunction _M.parse_message(message_s)\n    local message = {}\n    message.headers, message.body = _M.split_message(message_s)\n    message.headers = _M.parse_headers(message.headers)\n    return message\nend\n\nreturn _M\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/mbox.lua.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n * \n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n * \n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n * \n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\nnamespace love\n{\n\n// [mbox.lua]\nconst unsigned char mbox_lua[] = \n{\n\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x4d, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x0a,\n\t0x69, 0x66, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6d, 0x62, 0x6f, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x4d, 0x20, 0x20, 0x20, 0x2d, 0x2d, \n\t0x20, 0x6c, 0x75, 0x61, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x3a, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, \n\t0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, \n\t0x3d, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, \n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, \n\t0x73, 0x2c, 0x20, 0x22, 0x5c, 0x72, 0x5c, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x6d, 0x65, \n\t0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x2c, 0x20, 0x22, 0x5e, 0x28, 0x2e, 0x2d, 0x5c, 0x6e, 0x29, 0x5c, \n\t0x6e, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x68, 0x29, 0x20, 0x6d, \n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x68, \n\t0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x6d, 0x65, \n\t0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x2c, 0x20, 0x22, 0x5e, 0x2e, 0x2d, 0x5c, 0x6e, 0x5c, 0x6e, 0x28, \n\t0x2e, 0x2a, 0x29, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x62, 0x29, \n\t0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, 0x62, 0x20, \n\t0x65, 0x6e, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, \n\t0x2e, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, \n\t0x62, 0x28, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x2c, 0x20, 0x22, 0x5e, 0x5c, 0x6e, 0x28, \n\t0x2e, 0x2a, 0x29, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x62, 0x29, \n\t0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, 0x62, 0x20, \n\t0x65, 0x6e, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, \n\t0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, \n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x68, 0x65, \n\t0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, \n\t0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x2c, 0x20, 0x6d, 0x65, \n\t0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, \n\t0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x28, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, \n\t0x3d, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, \n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, \n\t0x73, 0x2c, 0x20, 0x22, 0x5c, 0x72, 0x5c, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, \n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, \n\t0x73, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x5b, 0x20, 0x5d, 0x2b, 0x22, 0x2c, 0x20, 0x22, 0x20, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, \n\t0x6e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x73, 0x2c, 0x20, 0x22, \n\t0x5c, 0x6e, 0x28, 0x5b, 0x5e, 0x5c, 0x6e, 0x5d, 0x2b, 0x29, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, \n\t0x69, 0x6f, 0x6e, 0x20, 0x28, 0x68, 0x29, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, \n\t0x72, 0x74, 0x28, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x68, 0x29, 0x20, 0x65, 0x6e, 0x64, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, \n\t0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x28, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, \n\t0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x2c, \n\t0x20, 0x22, 0x5c, 0x6e, 0x5b, 0x20, 0x5d, 0x2b, 0x22, 0x2c, 0x20, 0x22, 0x20, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, \n\t0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x2c, \n\t0x20, 0x22, 0x5c, 0x6e, 0x2b, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x2c, 0x20, 0x5f, 0x2c, 0x20, 0x6e, 0x61, \n\t0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, \n\t0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x2c, 0x20, 0x22, 0x28, \n\t0x5b, 0x5e, 0x25, 0x73, 0x3a, 0x5d, 0x2d, 0x29, 0x3a, 0x25, 0x73, 0x2a, 0x28, 0x2e, 0x2a, 0x29, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, \n\t0x61, 0x6c, 0x75, 0x65, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, \n\t0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x28, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, \n\t0x74, 0x20, 0x3d, 0x20, 0x5f, 0x4d, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, \n\t0x72, 0x73, 0x28, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, \n\t0x3d, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x68, 0x65, \n\t0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x74, 0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, \n\t0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x4d, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, \n\t0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x28, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x74, 0x5b, \n\t0x69, 0x5d, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, \n\t0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, \n\t0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x28, 0x6e, 0x61, 0x6d, 0x65, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x68, 0x65, 0x61, \n\t0x64, 0x65, 0x72, 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, \n\t0x61, 0x64, 0x65, 0x72, 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x68, 0x65, 0x61, 0x64, \n\t0x65, 0x72, 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x20, \n\t0x2e, 0x2e, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x68, \n\t0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, \n\t0x75, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, \n\t0x66, 0x72, 0x6f, 0x6d, 0x28, 0x66, 0x72, 0x6f, 0x6d, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x2c, 0x20, 0x5f, 0x2c, 0x20, 0x6e, 0x61, \n\t0x6d, 0x65, 0x2c, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, \n\t0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x66, 0x72, 0x6f, 0x6d, 0x2c, 0x20, 0x22, 0x5e, 0x25, 0x73, \n\t0x2a, 0x28, 0x2e, 0x2d, 0x29, 0x25, 0x73, 0x2a, 0x25, 0x3c, 0x28, 0x2e, 0x2d, 0x29, 0x25, 0x3e, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, \n\t0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x2c, 0x20, 0x5f, 0x2c, 0x20, 0x61, 0x64, 0x64, 0x72, \n\t0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, \n\t0x66, 0x72, 0x6f, 0x6d, 0x2c, 0x20, 0x22, 0x25, 0x73, 0x2a, 0x28, 0x2e, 0x2b, 0x29, 0x25, 0x73, 0x2a, 0x22, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, \n\t0x20, 0x22, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x72, \n\t0x65, 0x73, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x22, 0x20, \n\t0x74, 0x68, 0x65, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, \n\t0x73, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, \n\t0x67, 0x73, 0x75, 0x62, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x27, 0x22, 0x27, 0x2c, 0x20, 0x22, 0x22, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, \n\t0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, \n\t0x6d, 0x62, 0x6f, 0x78, 0x28, 0x6d, 0x62, 0x6f, 0x78, 0x5f, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x62, 0x6f, 0x78, 0x20, 0x3d, 0x20, 0x7b, \n\t0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6d, 0x62, 0x6f, 0x78, 0x5f, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, \n\t0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x6d, 0x62, 0x6f, 0x78, 0x5f, 0x73, 0x2c, 0x20, 0x22, 0x5c, 0x72, \n\t0x5c, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x22, 0x5c, 0x6e, 0x5c, 0x6e, \n\t0x46, 0x72, 0x6f, 0x6d, 0x20, 0x5c, 0x6e, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x6a, 0x2c, 0x20, 0x69, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x31, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x31, 0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x2c, 0x20, 0x6e, 0x6a, 0x20, 0x3d, 0x20, 0x73, 0x74, \n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x6d, 0x62, 0x6f, 0x78, 0x5f, 0x73, 0x2c, 0x20, \n\t0x22, 0x5c, 0x6e, 0x5c, 0x6e, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x2e, 0x2d, 0x5c, 0x6e, 0x22, 0x2c, 0x20, 0x6a, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x20, 0x74, \n\t0x68, 0x65, 0x6e, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x73, 0x73, \n\t0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x73, 0x75, 0x62, 0x28, 0x6d, \n\t0x62, 0x6f, 0x78, 0x5f, 0x73, 0x2c, 0x20, 0x6a, 0x2c, 0x20, 0x69, 0x2d, 0x31, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, \n\t0x72, 0x74, 0x28, 0x6d, 0x62, 0x6f, 0x78, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x6e, 0x6a, 0x2b, 0x31, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x62, 0x6f, 0x78, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, \n\t0x6d, 0x62, 0x6f, 0x78, 0x5f, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x62, 0x6f, 0x78, 0x20, 0x3d, 0x20, 0x5f, \n\t0x4d, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x6d, 0x62, 0x6f, 0x78, 0x28, 0x6d, 0x62, 0x6f, 0x78, 0x5f, \n\t0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x6d, 0x62, \n\t0x6f, 0x78, 0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x62, 0x6f, 0x78, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, \n\t0x5f, 0x4d, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, 0x6d, \n\t0x62, 0x6f, 0x78, 0x5b, 0x69, 0x5d, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x62, 0x6f, 0x78, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, \n\t0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, \n\t0x3d, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, \n\t0x73, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, \n\t0x5f, 0x4d, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, 0x6d, \n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, \n\t0x73, 0x20, 0x3d, 0x20, 0x5f, 0x4d, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, \n\t0x72, 0x73, 0x28, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x4d, 0x0a,\n}; // [mbox.lua]\n} // love\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/mime.c",
    "content": "/*=========================================================================*\\\n* MIME support functions\n* LuaSocket toolkit\n\\*=========================================================================*/\n#include \"luasocket.h\"\n#include \"mime.h\"\n#include <string.h>\n#include <ctype.h>\n\n/*=========================================================================*\\\n* Don't want to trust escape character constants\n\\*=========================================================================*/\ntypedef unsigned char UC;\nstatic const char CRLF[] = \"\\r\\n\";\nstatic const char EQCRLF[] = \"=\\r\\n\";\n\n/*=========================================================================*\\\n* Internal function prototypes.\n\\*=========================================================================*/\nstatic int mime_global_wrp(lua_State *L);\nstatic int mime_global_b64(lua_State *L);\nstatic int mime_global_unb64(lua_State *L);\nstatic int mime_global_qp(lua_State *L);\nstatic int mime_global_unqp(lua_State *L);\nstatic int mime_global_qpwrp(lua_State *L);\nstatic int mime_global_eol(lua_State *L);\nstatic int mime_global_dot(lua_State *L);\n\nstatic size_t dot(int c, size_t state, luaL_Buffer *buffer);\n/*static void b64setup(UC *base);*/\nstatic size_t b64encode(UC c, UC *input, size_t size, luaL_Buffer *buffer);\nstatic size_t b64pad(const UC *input, size_t size, luaL_Buffer *buffer);\nstatic size_t b64decode(UC c, UC *input, size_t size, luaL_Buffer *buffer);\n\n/*static void qpsetup(UC *class, UC *unbase);*/\nstatic void qpquote(UC c, luaL_Buffer *buffer);\nstatic size_t qpdecode(UC c, UC *input, size_t size, luaL_Buffer *buffer);\nstatic size_t qpencode(UC c, UC *input, size_t size,\n        const char *marker, luaL_Buffer *buffer);\nstatic size_t qppad(UC *input, size_t size, luaL_Buffer *buffer);\n\n/* code support functions */\nstatic luaL_Reg func[] = {\n    { \"dot\", mime_global_dot },\n    { \"b64\", mime_global_b64 },\n    { \"eol\", mime_global_eol },\n    { \"qp\", mime_global_qp },\n    { \"qpwrp\", mime_global_qpwrp },\n    { \"unb64\", mime_global_unb64 },\n    { \"unqp\", mime_global_unqp },\n    { \"wrp\", mime_global_wrp },\n    { NULL, NULL }\n};\n\n/*-------------------------------------------------------------------------*\\\n* Quoted-printable globals\n\\*-------------------------------------------------------------------------*/\nenum {QP_PLAIN, QP_QUOTED, QP_CR, QP_IF_LAST};\n\nstatic const UC qpclass[] = {\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_IF_LAST, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_CR, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_IF_LAST, QP_PLAIN, QP_PLAIN, QP_PLAIN,\n    QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN,\n    QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN,\n    QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN,\n    QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN,\n    QP_PLAIN, QP_QUOTED, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN,\n    QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN,\n    QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN,\n    QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN,\n    QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN,\n    QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN,\n    QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN,\n    QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN,\n    QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN,\n    QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN,\n    QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN,\n    QP_PLAIN, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED,\n    QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED\n};\n\nstatic const UC qpbase[] = \"0123456789ABCDEF\";\n\nstatic const UC qpunbase[] = {\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 255,\n    255, 255, 255, 255, 255, 255, 10, 11, 12, 13, 14, 15,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 10, 11, 12, 13, 14, 15, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255\n};\n\n/*-------------------------------------------------------------------------*\\\n* Base64 globals\n\\*-------------------------------------------------------------------------*/\nstatic const UC b64base[] =\n        \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\nstatic const UC b64unbase[] = {\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63,\n    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, 255, 0,\n    255, 255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,\n    14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255,\n    255, 255, 255, 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n    36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,\n    51, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n    255, 255\n};\n\n/*=========================================================================*\\\n* Exported functions\n\\*=========================================================================*/\n/*-------------------------------------------------------------------------*\\\n* Initializes module\n\\*-------------------------------------------------------------------------*/\nLUASOCKET_API int luaopen_mime_core(lua_State *L)\n{\n    lua_newtable(L);\n    luaL_setfuncs(L, func, 0);\n    /* make version string available to scripts */\n    lua_pushstring(L, \"_VERSION\");\n    lua_pushstring(L, MIME_VERSION);\n    lua_rawset(L, -3);\n    /* initialize lookup tables */\n    /*qpsetup(qpclass, qpunbase);*/\n    /*b64setup(b64unbase);*/\n    return 1;\n}\n\n/*=========================================================================*\\\n* Global Lua functions\n\\*=========================================================================*/\n/*-------------------------------------------------------------------------*\\\n* Incrementaly breaks a string into lines. The string can have CRLF breaks.\n* A, n = wrp(l, B, length)\n* A is a copy of B, broken into lines of at most 'length' bytes.\n* 'l' is how many bytes are left for the first line of B.\n* 'n' is the number of bytes left in the last line of A.\n\\*-------------------------------------------------------------------------*/\nstatic int mime_global_wrp(lua_State *L)\n{\n    size_t size = 0;\n    int left = (int) luaL_checknumber(L, 1);\n    const UC *input = (const UC *) luaL_optlstring(L, 2, NULL, &size);\n    const UC *last = input + size;\n    int length = (int) luaL_optnumber(L, 3, 76);\n    luaL_Buffer buffer;\n    /* end of input black-hole */\n    if (!input) {\n        /* if last line has not been terminated, add a line break */\n        if (left < length) lua_pushstring(L, CRLF);\n        /* otherwise, we are done */\n        else lua_pushnil(L);\n        lua_pushnumber(L, length);\n        return 2;\n    }\n    luaL_buffinit(L, &buffer);\n    while (input < last) {\n        switch (*input) {\n            case '\\r':\n                break;\n            case '\\n':\n                luaL_addstring(&buffer, CRLF);\n                left = length;\n                break;\n            default:\n                if (left <= 0) {\n                    left = length;\n                    luaL_addstring(&buffer, CRLF);\n                }\n                luaL_addchar(&buffer, *input);\n                left--;\n                break;\n        }\n        input++;\n    }\n    luaL_pushresult(&buffer);\n    lua_pushnumber(L, left);\n    return 2;\n}\n\n#if 0\n/*-------------------------------------------------------------------------*\\\n* Fill base64 decode map.\n\\*-------------------------------------------------------------------------*/\nstatic void b64setup(UC *unbase)\n{\n    int i;\n    for (i = 0; i <= 255; i++) unbase[i] = (UC) 255;\n    for (i = 0; i < 64; i++) unbase[b64base[i]] = (UC) i;\n    unbase['='] = 0;\n\n    printf(\"static const UC b64unbase[] = {\\n\");\n    for (int i = 0; i < 256; i++) {\n        printf(\"%d, \", unbase[i]);\n    }\n    printf(\"\\n}\\n;\");\n}\n#endif\n\n/*-------------------------------------------------------------------------*\\\n* Acumulates bytes in input buffer until 3 bytes are available.\n* Translate the 3 bytes into Base64 form and append to buffer.\n* Returns new number of bytes in buffer.\n\\*-------------------------------------------------------------------------*/\nstatic size_t b64encode(UC c, UC *input, size_t size,\n        luaL_Buffer *buffer)\n{\n    input[size++] = c;\n    if (size == 3) {\n        UC code[4];\n        unsigned long value = 0;\n        value += input[0]; value <<= 8;\n        value += input[1]; value <<= 8;\n        value += input[2];\n        code[3] = b64base[value & 0x3f]; value >>= 6;\n        code[2] = b64base[value & 0x3f]; value >>= 6;\n        code[1] = b64base[value & 0x3f]; value >>= 6;\n        code[0] = b64base[value];\n        luaL_addlstring(buffer, (char *) code, 4);\n        size = 0;\n    }\n    return size;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Encodes the Base64 last 1 or 2 bytes and adds padding '='\n* Result, if any, is appended to buffer.\n* Returns 0.\n\\*-------------------------------------------------------------------------*/\nstatic size_t b64pad(const UC *input, size_t size,\n        luaL_Buffer *buffer)\n{\n    unsigned long value = 0;\n    UC code[4] = {'=', '=', '=', '='};\n    switch (size) {\n        case 1:\n            value = input[0] << 4;\n            code[1] = b64base[value & 0x3f]; value >>= 6;\n            code[0] = b64base[value];\n            luaL_addlstring(buffer, (char *) code, 4);\n            break;\n        case 2:\n            value = input[0]; value <<= 8;\n            value |= input[1]; value <<= 2;\n            code[2] = b64base[value & 0x3f]; value >>= 6;\n            code[1] = b64base[value & 0x3f]; value >>= 6;\n            code[0] = b64base[value];\n            luaL_addlstring(buffer, (char *) code, 4);\n            break;\n        default:\n            break;\n    }\n    return 0;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Acumulates bytes in input buffer until 4 bytes are available.\n* Translate the 4 bytes from Base64 form and append to buffer.\n* Returns new number of bytes in buffer.\n\\*-------------------------------------------------------------------------*/\nstatic size_t b64decode(UC c, UC *input, size_t size,\n        luaL_Buffer *buffer)\n{\n    /* ignore invalid characters */\n    if (b64unbase[c] > 64) return size;\n    input[size++] = c;\n    /* decode atom */\n    if (size == 4) {\n        UC decoded[3];\n        int valid, value = 0;\n        value =  b64unbase[input[0]]; value <<= 6;\n        value |= b64unbase[input[1]]; value <<= 6;\n        value |= b64unbase[input[2]]; value <<= 6;\n        value |= b64unbase[input[3]];\n        decoded[2] = (UC) (value & 0xff); value >>= 8;\n        decoded[1] = (UC) (value & 0xff); value >>= 8;\n        decoded[0] = (UC) value;\n        /* take care of paddding */\n        valid = (input[2] == '=') ? 1 : (input[3] == '=') ? 2 : 3;\n        luaL_addlstring(buffer, (char *) decoded, valid);\n        return 0;\n    /* need more data */\n    } else return size;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Incrementally applies the Base64 transfer content encoding to a string\n* A, B = b64(C, D)\n* A is the encoded version of the largest prefix of C .. D that is\n* divisible by 3. B has the remaining bytes of C .. D, *without* encoding.\n* The easiest thing would be to concatenate the two strings and\n* encode the result, but we can't afford that or Lua would dupplicate\n* every chunk we received.\n\\*-------------------------------------------------------------------------*/\nstatic int mime_global_b64(lua_State *L)\n{\n    UC atom[3];\n    size_t isize = 0, asize = 0;\n    const UC *input = (const UC *) luaL_optlstring(L, 1, NULL, &isize);\n    const UC *last = input + isize;\n    luaL_Buffer buffer;\n    /* end-of-input blackhole */\n    if (!input) {\n        lua_pushnil(L);\n        lua_pushnil(L);\n        return 2;\n    }\n    /* make sure we don't confuse buffer stuff with arguments */\n    lua_settop(L, 2);\n    /* process first part of the input */\n    luaL_buffinit(L, &buffer);\n    while (input < last)\n        asize = b64encode(*input++, atom, asize, &buffer);\n    input = (const UC *) luaL_optlstring(L, 2, NULL, &isize);\n    /* if second part is nil, we are done */\n    if (!input) {\n        size_t osize = 0;\n        asize = b64pad(atom, asize, &buffer);\n        luaL_pushresult(&buffer);\n        /* if the output is empty  and the input is nil, return nil */\n        lua_tolstring(L, -1, &osize);\n        if (osize == 0) lua_pushnil(L);\n        lua_pushnil(L);\n        return 2;\n    }\n    /* otherwise process the second part */\n    last = input + isize;\n    while (input < last)\n        asize = b64encode(*input++, atom, asize, &buffer);\n    luaL_pushresult(&buffer);\n    lua_pushlstring(L, (char *) atom, asize);\n    return 2;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Incrementally removes the Base64 transfer content encoding from a string\n* A, B = b64(C, D)\n* A is the encoded version of the largest prefix of C .. D that is\n* divisible by 4. B has the remaining bytes of C .. D, *without* encoding.\n\\*-------------------------------------------------------------------------*/\nstatic int mime_global_unb64(lua_State *L)\n{\n    UC atom[4];\n    size_t isize = 0, asize = 0;\n    const UC *input = (const UC *) luaL_optlstring(L, 1, NULL, &isize);\n    const UC *last = input + isize;\n    luaL_Buffer buffer;\n    /* end-of-input blackhole */\n    if (!input) {\n        lua_pushnil(L);\n        lua_pushnil(L);\n        return 2;\n    }\n    /* make sure we don't confuse buffer stuff with arguments */\n    lua_settop(L, 2);\n    /* process first part of the input */\n    luaL_buffinit(L, &buffer);\n    while (input < last)\n        asize = b64decode(*input++, atom, asize, &buffer);\n    input = (const UC *) luaL_optlstring(L, 2, NULL, &isize);\n    /* if second is nil, we are done */\n    if (!input) {\n        size_t osize = 0;\n        luaL_pushresult(&buffer);\n        /* if the output is empty  and the input is nil, return nil */\n        lua_tolstring(L, -1, &osize);\n        if (osize == 0) lua_pushnil(L);\n        lua_pushnil(L);\n        return 2;\n    }\n    /* otherwise, process the rest of the input */\n    last = input + isize;\n    while (input < last)\n        asize = b64decode(*input++, atom, asize, &buffer);\n    luaL_pushresult(&buffer);\n    lua_pushlstring(L, (char *) atom, asize);\n    return 2;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Quoted-printable encoding scheme\n* all (except CRLF in text) can be =XX\n* CLRL in not text must be =XX=XX\n* 33 through 60 inclusive can be plain\n* 62 through 126 inclusive can be plain\n* 9 and 32 can be plain, unless in the end of a line, where must be =XX\n* encoded lines must be no longer than 76 not counting CRLF\n* soft line-break are =CRLF\n* To encode one byte, we need to see the next two.\n* Worst case is when we see a space, and wonder if a CRLF is comming\n\\*-------------------------------------------------------------------------*/\n#if 0\n/*-------------------------------------------------------------------------*\\\n* Split quoted-printable characters into classes\n* Precompute reverse map for encoding\n\\*-------------------------------------------------------------------------*/\nstatic void qpsetup(UC *cl, UC *unbase)\n{\n\n    int i;\n    for (i = 0; i < 256; i++) cl[i] = QP_QUOTED;\n    for (i = 33; i <= 60; i++) cl[i] = QP_PLAIN;\n    for (i = 62; i <= 126; i++) cl[i] = QP_PLAIN;\n    cl['\\t'] = QP_IF_LAST;\n    cl[' '] = QP_IF_LAST;\n    cl['\\r'] = QP_CR;\n    for (i = 0; i < 256; i++) unbase[i] = 255;\n    unbase['0'] = 0; unbase['1'] = 1; unbase['2'] = 2;\n    unbase['3'] = 3; unbase['4'] = 4; unbase['5'] = 5;\n    unbase['6'] = 6; unbase['7'] = 7; unbase['8'] = 8;\n    unbase['9'] = 9; unbase['A'] = 10; unbase['a'] = 10;\n    unbase['B'] = 11; unbase['b'] = 11; unbase['C'] = 12;\n    unbase['c'] = 12; unbase['D'] = 13; unbase['d'] = 13;\n    unbase['E'] = 14; unbase['e'] = 14; unbase['F'] = 15;\n    unbase['f'] = 15;\n\nprintf(\"static UC qpclass[] = {\");\n    for (int i = 0; i < 256; i++) {\n        if (i % 6 == 0) {\n            printf(\"\\n    \");\n        }\n        switch(cl[i]) {\n            case QP_QUOTED:\n                printf(\"QP_QUOTED, \");\n                break;\n            case QP_PLAIN:\n                printf(\"QP_PLAIN, \");\n                break;\n            case QP_CR:\n                printf(\"QP_CR, \");\n                break;\n            case QP_IF_LAST:\n                printf(\"QP_IF_LAST, \");\n                break;\n        }\n    }\nprintf(\"\\n};\\n\");\n\nprintf(\"static const UC qpunbase[] = {\");\n    for (int i = 0; i < 256; i++) {\n        int c = qpunbase[i];\n        printf(\"%d, \", c);\n    }\nprintf(\"\\\";\\n\");\n}\n#endif\n\n/*-------------------------------------------------------------------------*\\\n* Output one character in form =XX\n\\*-------------------------------------------------------------------------*/\nstatic void qpquote(UC c, luaL_Buffer *buffer)\n{\n    luaL_addchar(buffer, '=');\n    luaL_addchar(buffer, qpbase[c >> 4]);\n    luaL_addchar(buffer, qpbase[c & 0x0F]);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Accumulate characters until we are sure about how to deal with them.\n* Once we are sure, output to the buffer, in the correct form.\n\\*-------------------------------------------------------------------------*/\nstatic size_t qpencode(UC c, UC *input, size_t size,\n        const char *marker, luaL_Buffer *buffer)\n{\n    input[size++] = c;\n    /* deal with all characters we can have */\n    while (size > 0) {\n        switch (qpclass[input[0]]) {\n            /* might be the CR of a CRLF sequence */\n            case QP_CR:\n                if (size < 2) return size;\n                if (input[1] == '\\n') {\n                    luaL_addstring(buffer, marker);\n                    return 0;\n                } else qpquote(input[0], buffer);\n                break;\n            /* might be a space and that has to be quoted if last in line */\n            case QP_IF_LAST:\n                if (size < 3) return size;\n                /* if it is the last, quote it and we are done */\n                if (input[1] == '\\r' && input[2] == '\\n') {\n                    qpquote(input[0], buffer);\n                    luaL_addstring(buffer, marker);\n                    return 0;\n                } else luaL_addchar(buffer, input[0]);\n                break;\n                /* might have to be quoted always */\n            case QP_QUOTED:\n                qpquote(input[0], buffer);\n                break;\n                /* might never have to be quoted */\n            default:\n                luaL_addchar(buffer, input[0]);\n                break;\n        }\n        input[0] = input[1]; input[1] = input[2];\n        size--;\n    }\n    return 0;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Deal with the final characters\n\\*-------------------------------------------------------------------------*/\nstatic size_t qppad(UC *input, size_t size, luaL_Buffer *buffer)\n{\n    size_t i;\n    for (i = 0; i < size; i++) {\n        if (qpclass[input[i]] == QP_PLAIN) luaL_addchar(buffer, input[i]);\n        else qpquote(input[i], buffer);\n    }\n    if (size > 0) luaL_addstring(buffer, EQCRLF);\n    return 0;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Incrementally converts a string to quoted-printable\n* A, B = qp(C, D, marker)\n* Marker is the text to be used to replace CRLF sequences found in A.\n* A is the encoded version of the largest prefix of C .. D that\n* can be encoded without doubts.\n* B has the remaining bytes of C .. D, *without* encoding.\n\\*-------------------------------------------------------------------------*/\nstatic int mime_global_qp(lua_State *L)\n{\n    size_t asize = 0, isize = 0;\n    UC atom[3];\n    const UC *input = (const UC *) luaL_optlstring(L, 1, NULL, &isize);\n    const UC *last = input + isize;\n    const char *marker = luaL_optstring(L, 3, CRLF);\n    luaL_Buffer buffer;\n    /* end-of-input blackhole */\n    if (!input) {\n        lua_pushnil(L);\n        lua_pushnil(L);\n        return 2;\n    }\n    /* make sure we don't confuse buffer stuff with arguments */\n    lua_settop(L, 3);\n    /* process first part of input */\n    luaL_buffinit(L, &buffer);\n    while (input < last)\n        asize = qpencode(*input++, atom, asize, marker, &buffer);\n    input = (const UC *) luaL_optlstring(L, 2, NULL, &isize);\n    /* if second part is nil, we are done */\n    if (!input) {\n        asize = qppad(atom, asize, &buffer);\n        luaL_pushresult(&buffer);\n        if (!(*lua_tostring(L, -1))) lua_pushnil(L);\n        lua_pushnil(L);\n        return 2;\n    }\n    /* otherwise process rest of input */\n    last = input + isize;\n    while (input < last)\n        asize = qpencode(*input++, atom, asize, marker, &buffer);\n    luaL_pushresult(&buffer);\n    lua_pushlstring(L, (char *) atom, asize);\n    return 2;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Accumulate characters until we are sure about how to deal with them.\n* Once we are sure, output the to the buffer, in the correct form.\n\\*-------------------------------------------------------------------------*/\nstatic size_t qpdecode(UC c, UC *input, size_t size, luaL_Buffer *buffer) {\n    int d;\n    input[size++] = c;\n    /* deal with all characters we can deal */\n    switch (input[0]) {\n        /* if we have an escape character */\n        case '=':\n            if (size < 3) return size;\n            /* eliminate soft line break */\n            if (input[1] == '\\r' && input[2] == '\\n') return 0;\n            /* decode quoted representation */\n            c = qpunbase[input[1]]; d = qpunbase[input[2]];\n            /* if it is an invalid, do not decode */\n            if (c > 15 || d > 15) luaL_addlstring(buffer, (char *)input, 3);\n            else luaL_addchar(buffer, (char) ((c << 4) + d));\n            return 0;\n        case '\\r':\n            if (size < 2) return size;\n            if (input[1] == '\\n') luaL_addlstring(buffer, (char *)input, 2);\n            return 0;\n        default:\n            if (input[0] == '\\t' || (input[0] > 31 && input[0] < 127))\n                luaL_addchar(buffer, input[0]);\n            return 0;\n    }\n}\n\n/*-------------------------------------------------------------------------*\\\n* Incrementally decodes a string in quoted-printable\n* A, B = qp(C, D)\n* A is the decoded version of the largest prefix of C .. D that\n* can be decoded without doubts.\n* B has the remaining bytes of C .. D, *without* decoding.\n\\*-------------------------------------------------------------------------*/\nstatic int mime_global_unqp(lua_State *L)\n{\n    size_t asize = 0, isize = 0;\n    UC atom[3];\n    const UC *input = (const UC *) luaL_optlstring(L, 1, NULL, &isize);\n    const UC *last = input + isize;\n    luaL_Buffer buffer;\n    /* end-of-input blackhole */\n    if (!input) {\n        lua_pushnil(L);\n        lua_pushnil(L);\n        return 2;\n    }\n    /* make sure we don't confuse buffer stuff with arguments */\n    lua_settop(L, 2);\n    /* process first part of input */\n    luaL_buffinit(L, &buffer);\n    while (input < last)\n        asize = qpdecode(*input++, atom, asize, &buffer);\n    input = (const UC *) luaL_optlstring(L, 2, NULL, &isize);\n    /* if second part is nil, we are done */\n    if (!input) {\n        luaL_pushresult(&buffer);\n        if (!(*lua_tostring(L, -1))) lua_pushnil(L);\n        lua_pushnil(L);\n        return 2;\n    }\n    /* otherwise process rest of input */\n    last = input + isize;\n    while (input < last)\n        asize = qpdecode(*input++, atom, asize, &buffer);\n    luaL_pushresult(&buffer);\n    lua_pushlstring(L, (char *) atom, asize);\n    return 2;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Incrementally breaks a quoted-printed string into lines\n* A, n = qpwrp(l, B, length)\n* A is a copy of B, broken into lines of at most 'length' bytes.\n* 'l' is how many bytes are left for the first line of B.\n* 'n' is the number of bytes left in the last line of A.\n* There are two complications: lines can't be broken in the middle\n* of an encoded =XX, and there might be line breaks already\n\\*-------------------------------------------------------------------------*/\nstatic int mime_global_qpwrp(lua_State *L)\n{\n    size_t size = 0;\n    int left = (int) luaL_checknumber(L, 1);\n    const UC *input = (const UC *) luaL_optlstring(L, 2, NULL, &size);\n    const UC *last = input + size;\n    int length = (int) luaL_optnumber(L, 3, 76);\n    luaL_Buffer buffer;\n    /* end-of-input blackhole */\n    if (!input) {\n        if (left < length) lua_pushstring(L, EQCRLF);\n        else lua_pushnil(L);\n        lua_pushnumber(L, length);\n        return 2;\n    }\n    /* process all input */\n    luaL_buffinit(L, &buffer);\n    while (input < last) {\n        switch (*input) {\n            case '\\r':\n                break;\n            case '\\n':\n                left = length;\n                luaL_addstring(&buffer, CRLF);\n                break;\n            case '=':\n                if (left <= 3) {\n                    left = length;\n                    luaL_addstring(&buffer, EQCRLF);\n                }\n                luaL_addchar(&buffer, *input);\n                left--;\n                break;\n            default:\n                if (left <= 1) {\n                    left = length;\n                    luaL_addstring(&buffer, EQCRLF);\n                }\n                luaL_addchar(&buffer, *input);\n                left--;\n                break;\n        }\n        input++;\n    }\n    luaL_pushresult(&buffer);\n    lua_pushnumber(L, left);\n    return 2;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Here is what we do: \\n, and \\r are considered candidates for line\n* break. We issue *one* new line marker if any of them is seen alone, or\n* followed by a different one. That is, \\n\\n and \\r\\r will issue two\n* end of line markers each, but \\r\\n, \\n\\r etc will only issue *one*\n* marker.  This covers Mac OS, Mac OS X, VMS, Unix and DOS, as well as\n* probably other more obscure conventions.\n*\n* c is the current character being processed\n* last is the previous character\n\\*-------------------------------------------------------------------------*/\n#define eolcandidate(c) (c == '\\r' || c == '\\n')\nstatic int eolprocess(int c, int last, const char *marker,\n        luaL_Buffer *buffer)\n{\n    if (eolcandidate(c)) {\n        if (eolcandidate(last)) {\n            if (c == last) luaL_addstring(buffer, marker);\n            return 0;\n        } else {\n            luaL_addstring(buffer, marker);\n            return c;\n        }\n    } else {\n        luaL_addchar(buffer, (char) c);\n        return 0;\n    }\n}\n\n/*-------------------------------------------------------------------------*\\\n* Converts a string to uniform EOL convention.\n* A, n = eol(o, B, marker)\n* A is the converted version of the largest prefix of B that can be\n* converted unambiguously. 'o' is the context returned by the previous\n* call. 'n' is the new context.\n\\*-------------------------------------------------------------------------*/\nstatic int mime_global_eol(lua_State *L)\n{\n    int ctx = (int) luaL_checkinteger(L, 1);\n    size_t isize = 0;\n    const char *input = luaL_optlstring(L, 2, NULL, &isize);\n    const char *last = input + isize;\n    const char *marker = luaL_optstring(L, 3, CRLF);\n    luaL_Buffer buffer;\n    luaL_buffinit(L, &buffer);\n    /* end of input blackhole */\n    if (!input) {\n       lua_pushnil(L);\n       lua_pushnumber(L, 0);\n       return 2;\n    }\n    /* process all input */\n    while (input < last)\n        ctx = eolprocess(*input++, ctx, marker, &buffer);\n    luaL_pushresult(&buffer);\n    lua_pushnumber(L, ctx);\n    return 2;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Takes one byte and stuff it if needed.\n\\*-------------------------------------------------------------------------*/\nstatic size_t dot(int c, size_t state, luaL_Buffer *buffer)\n{\n    luaL_addchar(buffer, (char) c);\n    switch (c) {\n        case '\\r':\n            return 1;\n        case '\\n':\n            return (state == 1)? 2: 0;\n        case '.':\n            if (state == 2)\n                luaL_addchar(buffer, '.');\n            /* Falls through. */\n        default:\n            return 0;\n    }\n}\n\n/*-------------------------------------------------------------------------*\\\n* Incrementally applies smtp stuffing to a string\n* A, n = dot(l, D)\n\\*-------------------------------------------------------------------------*/\nstatic int mime_global_dot(lua_State *L)\n{\n    size_t isize = 0, state = (size_t) luaL_checknumber(L, 1);\n    const char *input = luaL_optlstring(L, 2, NULL, &isize);\n    const char *last = input + isize;\n    luaL_Buffer buffer;\n    /* end-of-input blackhole */\n    if (!input) {\n        lua_pushnil(L);\n        lua_pushnumber(L, 2);\n        return 2;\n    }\n    /* process all input */\n    luaL_buffinit(L, &buffer);\n    while (input < last)\n        state = dot(*input++, state, &buffer);\n    luaL_pushresult(&buffer);\n    lua_pushnumber(L, (lua_Number) state);\n    return 2;\n}\n\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/mime.h",
    "content": "#ifndef MIME_H \n#define MIME_H \n/*=========================================================================*\\\n* Core MIME support\n* LuaSocket toolkit\n*\n* This module provides functions to implement transfer content encodings\n* and formatting conforming to RFC 2045. It is used by mime.lua, which\n* provide a higher level interface to this functionality. \n\\*=========================================================================*/\n#include \"luasocket.h\"\n\n/*-------------------------------------------------------------------------*\\\n* Current MIME library version\n\\*-------------------------------------------------------------------------*/\n#define MIME_VERSION    \"MIME 1.0.3\"\n#define MIME_COPYRIGHT  \"Copyright (C) 2004-2013 Diego Nehab\"\n#define MIME_AUTHORS    \"Diego Nehab\"\n\nLUASOCKET_API int luaopen_mime_core(lua_State *L);\n\n#endif /* MIME_H */\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/mime.lua",
    "content": "-----------------------------------------------------------------------------\n-- MIME support for the Lua language.\n-- Author: Diego Nehab\n-- Conforming to RFCs 2045-2049\n-----------------------------------------------------------------------------\n\n-----------------------------------------------------------------------------\n-- Declare module and import dependencies\n-----------------------------------------------------------------------------\nlocal base = _G\nlocal ltn12 = require(\"ltn12\")\nlocal mime = require(\"mime.core\")\nlocal _M = mime\n\n-- encode, decode and wrap algorithm tables\nlocal encodet, decodet, wrapt = {},{},{}\n\n_M.encodet = encodet\n_M.decodet = decodet\n_M.wrapt   = wrapt\n\n-- creates a function that chooses a filter by name from a given table\nlocal function choose(table)\n    return function(name, opt1, opt2)\n        if base.type(name) ~= \"string\" then\n            name, opt1, opt2 = \"default\", name, opt1\n        end\n        local f = table[name or \"nil\"]\n        if not f then\n            base.error(\"unknown key (\" .. base.tostring(name) .. \")\", 3)\n        else return f(opt1, opt2) end\n    end\nend\n\n-- define the encoding filters\nencodet['base64'] = function()\n    return ltn12.filter.cycle(_M.b64, \"\")\nend\n\nencodet['quoted-printable'] = function(mode)\n    return ltn12.filter.cycle(_M.qp, \"\",\n        (mode == \"binary\") and \"=0D=0A\" or \"\\r\\n\")\nend\n\n-- define the decoding filters\ndecodet['base64'] = function()\n    return ltn12.filter.cycle(_M.unb64, \"\")\nend\n\ndecodet['quoted-printable'] = function()\n    return ltn12.filter.cycle(_M.unqp, \"\")\nend\n\n-- define the line-wrap filters\nwrapt['text'] = function(length)\n    length = length or 76\n    return ltn12.filter.cycle(_M.wrp, length, length)\nend\nwrapt['base64'] = wrapt['text']\nwrapt['default'] = wrapt['text']\n\nwrapt['quoted-printable'] = function()\n    return ltn12.filter.cycle(_M.qpwrp, 76, 76)\nend\n\n-- function that choose the encoding, decoding or wrap algorithm\n_M.encode = choose(encodet)\n_M.decode = choose(decodet)\n_M.wrap = choose(wrapt)\n\n-- define the end-of-line normalization filter\nfunction _M.normalize(marker)\n    return ltn12.filter.cycle(_M.eol, 0, marker)\nend\n\n-- high level stuffing filter\nfunction _M.stuff()\n    return ltn12.filter.cycle(_M.dot, 2)\nend\n\nreturn _M\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/mime.lua.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n * \n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n * \n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n * \n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\nnamespace love\n{\n\n// [mime.lua]\nconst unsigned char mime_lua[] = \n{\n\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x4d, 0x49, 0x4d, 0x45, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x66, 0x6f, \n\t0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, \n\t0x2e, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x3a, 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x20, 0x4e, \n\t0x65, 0x68, 0x61, 0x62, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x52, \n\t0x46, 0x43, 0x73, 0x20, 0x32, 0x30, 0x34, 0x35, 0x2d, 0x32, 0x30, 0x34, 0x39, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, \n\t0x61, 0x6e, 0x64, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, \n\t0x6e, 0x63, 0x69, 0x65, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x47, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, \n\t0x69, 0x72, 0x65, 0x28, 0x22, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, \n\t0x72, 0x65, 0x28, 0x22, 0x6d, 0x69, 0x6d, 0x65, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x4d, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6d, 0x65, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x20, \n\t0x61, 0x6e, 0x64, 0x20, 0x77, 0x72, 0x61, 0x70, 0x20, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, \n\t0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x74, 0x2c, 0x20, 0x64, 0x65, 0x63, \n\t0x6f, 0x64, 0x65, 0x74, 0x2c, 0x20, 0x77, 0x72, 0x61, 0x70, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x2c, 0x7b, \n\t0x7d, 0x2c, 0x7b, 0x7d, 0x0a,\n\t0x0a,\n\t0x5f, 0x4d, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, \n\t0x65, 0x74, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, \n\t0x65, 0x74, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x74, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x74, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, \n\t0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x68, 0x6f, 0x6f, 0x73, 0x65, 0x73, 0x20, 0x61, \n\t0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x62, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x66, 0x72, \n\t0x6f, 0x6d, 0x20, 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x68, 0x6f, \n\t0x6f, 0x73, 0x65, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, \n\t0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x31, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x32, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x74, 0x79, \n\t0x70, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, \n\t0x67, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, \n\t0x6f, 0x70, 0x74, 0x31, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x32, 0x20, 0x3d, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, \n\t0x75, 0x6c, 0x74, 0x22, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x31, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, \n\t0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x6e, 0x69, 0x6c, \n\t0x22, 0x5d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x20, 0x74, \n\t0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x65, \n\t0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x6b, 0x65, 0x79, 0x20, \n\t0x28, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, \n\t0x67, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x29, 0x22, 0x2c, 0x20, 0x33, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, \n\t0x6e, 0x20, 0x66, 0x28, 0x6f, 0x70, 0x74, 0x31, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x32, 0x29, 0x20, 0x65, 0x6e, \n\t0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x63, 0x6f, \n\t0x64, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x0a,\n\t0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x74, 0x5b, 0x27, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x27, 0x5d, 0x20, \n\t0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x2e, 0x66, \n\t0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x28, 0x5f, 0x4d, 0x2e, 0x62, 0x36, 0x34, \n\t0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x74, 0x5b, 0x27, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x2d, 0x70, 0x72, \n\t0x69, 0x6e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, \n\t0x6f, 0x6e, 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x2e, 0x66, \n\t0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x28, 0x5f, 0x4d, 0x2e, 0x71, 0x70, 0x2c, \n\t0x20, 0x22, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, \n\t0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x22, 0x3d, 0x30, 0x44, 0x3d, \n\t0x30, 0x41, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x5c, 0x72, 0x5c, 0x6e, 0x22, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6f, \n\t0x64, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x0a,\n\t0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x74, 0x5b, 0x27, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x27, 0x5d, 0x20, \n\t0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x2e, 0x66, \n\t0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x28, 0x5f, 0x4d, 0x2e, 0x75, 0x6e, 0x62, \n\t0x36, 0x34, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x74, 0x5b, 0x27, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x2d, 0x70, 0x72, \n\t0x69, 0x6e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, \n\t0x6f, 0x6e, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x2e, 0x66, \n\t0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x28, 0x5f, 0x4d, 0x2e, 0x75, 0x6e, 0x71, \n\t0x70, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x65, \n\t0x2d, 0x77, 0x72, 0x61, 0x70, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x0a,\n\t0x77, 0x72, 0x61, 0x70, 0x74, 0x5b, 0x27, 0x74, 0x65, 0x78, 0x74, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, \n\t0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, \n\t0x68, 0x20, 0x6f, 0x72, 0x20, 0x37, 0x36, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x2e, 0x66, \n\t0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x28, 0x5f, 0x4d, 0x2e, 0x77, 0x72, 0x70, \n\t0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x77, 0x72, 0x61, 0x70, 0x74, 0x5b, 0x27, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x27, 0x5d, 0x20, 0x3d, 0x20, \n\t0x77, 0x72, 0x61, 0x70, 0x74, 0x5b, 0x27, 0x74, 0x65, 0x78, 0x74, 0x27, 0x5d, 0x0a,\n\t0x77, 0x72, 0x61, 0x70, 0x74, 0x5b, 0x27, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x27, 0x5d, 0x20, 0x3d, \n\t0x20, 0x77, 0x72, 0x61, 0x70, 0x74, 0x5b, 0x27, 0x74, 0x65, 0x78, 0x74, 0x27, 0x5d, 0x0a,\n\t0x0a,\n\t0x77, 0x72, 0x61, 0x70, 0x74, 0x5b, 0x27, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x2d, 0x70, 0x72, 0x69, 0x6e, \n\t0x74, 0x61, 0x62, 0x6c, 0x65, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, \n\t0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x2e, 0x66, \n\t0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x28, 0x5f, 0x4d, 0x2e, 0x71, 0x70, 0x77, \n\t0x72, 0x70, 0x2c, 0x20, 0x37, 0x36, 0x2c, 0x20, 0x37, 0x36, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, \n\t0x68, 0x6f, 0x6f, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, \n\t0x2c, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x77, 0x72, 0x61, 0x70, \n\t0x20, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x6f, 0x6f, 0x73, 0x65, \n\t0x28, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x74, 0x29, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x6f, 0x6f, 0x73, 0x65, \n\t0x28, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x74, 0x29, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x6f, 0x6f, 0x73, 0x65, 0x28, 0x77, \n\t0x72, 0x61, 0x70, 0x74, 0x29, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x2d, \n\t0x6f, 0x66, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, \n\t0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, \n\t0x69, 0x7a, 0x65, 0x28, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x2e, 0x66, \n\t0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x28, 0x5f, 0x4d, 0x2e, 0x65, 0x6f, 0x6c, \n\t0x2c, 0x20, 0x30, 0x2c, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x73, 0x74, 0x75, 0x66, \n\t0x66, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x73, 0x74, 0x75, 0x66, 0x66, 0x28, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x2e, 0x66, \n\t0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x28, 0x5f, 0x4d, 0x2e, 0x64, 0x6f, 0x74, \n\t0x2c, 0x20, 0x32, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x4d, 0x0a,\n}; // [mime.lua]\n} // love\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/options.c",
    "content": "/*=========================================================================*\\\n* Common option interface\n* LuaSocket toolkit\n\\*=========================================================================*/\n#include \"luasocket.h\"\n#include \"auxiliar.h\"\n#include \"options.h\"\n#include \"inet.h\"\n#include <string.h>\n\n/*=========================================================================*\\\n* Internal functions prototypes\n\\*=========================================================================*/\nstatic int opt_setmembership(lua_State *L, p_socket ps, int level, int name);\nstatic int opt_ip6_setmembership(lua_State *L, p_socket ps, int level, int name);\nstatic int opt_setboolean(lua_State *L, p_socket ps, int level, int name);\nstatic int opt_getboolean(lua_State *L, p_socket ps, int level, int name);\nstatic int opt_setint(lua_State *L, p_socket ps, int level, int name);\nstatic int opt_getint(lua_State *L, p_socket ps, int level, int name);\nstatic int opt_set(lua_State *L, p_socket ps, int level, int name,\n        void *val, int len);\nstatic int opt_get(lua_State *L, p_socket ps, int level, int name,\n        void *val, int* len);\n\n/*=========================================================================*\\\n* Exported functions\n\\*=========================================================================*/\n/*-------------------------------------------------------------------------*\\\n* Calls appropriate option handler\n\\*-------------------------------------------------------------------------*/\nint opt_meth_setoption(lua_State *L, p_opt opt, p_socket ps)\n{\n    const char *name = luaL_checkstring(L, 2);      /* obj, name, ... */\n    while (opt->name && strcmp(name, opt->name))\n        opt++;\n    if (!opt->func) {\n        char msg[57];\n        sprintf(msg, \"unsupported option `%.35s'\", name);\n        luaL_argerror(L, 2, msg);\n    }\n    return opt->func(L, ps);\n}\n\nint opt_meth_getoption(lua_State *L, p_opt opt, p_socket ps)\n{\n    const char *name = luaL_checkstring(L, 2);      /* obj, name, ... */\n    while (opt->name && strcmp(name, opt->name))\n        opt++;\n    if (!opt->func) {\n        char msg[57];\n        sprintf(msg, \"unsupported option `%.35s'\", name);\n        luaL_argerror(L, 2, msg);\n    }\n    return opt->func(L, ps);\n}\n\n/*------------------------------------------------------*/\n/* binds socket to network interface */\nint opt_set_bindtodevice(lua_State *L, p_socket ps)\n{\n#ifndef SO_BINDTODEVICE\n    return luaL_error(L, \"SO_BINDTODEVICE is not supported on this operating system\");\n#else\n    const char *dev = luaL_checkstring(L, 3);\n    return opt_set(L, ps, SOL_SOCKET, SO_BINDTODEVICE, (char*)dev, strlen(dev)+1);\n#endif\n}\n\nint opt_get_bindtodevice(lua_State *L, p_socket ps)\n{\n#ifndef SO_BINDTODEVICE\n    return luaL_error(L, \"SO_BINDTODEVICE is not supported on this operating system\");\n#else\n    char dev[IFNAMSIZ];\n    int len = sizeof(dev);\n    int err = opt_get(L, ps, SOL_SOCKET, SO_BINDTODEVICE, &dev, &len);\n    if (err)\n        return err;\n    lua_pushstring(L, dev);\n    return 1;\n#endif\n}\n\n/*------------------------------------------------------*/\n/* enables reuse of local address */\nint opt_set_reuseaddr(lua_State *L, p_socket ps)\n{\n    return opt_setboolean(L, ps, SOL_SOCKET, SO_REUSEADDR);\n}\n\nint opt_get_reuseaddr(lua_State *L, p_socket ps)\n{\n    return opt_getboolean(L, ps, SOL_SOCKET, SO_REUSEADDR);\n}\n\n/*------------------------------------------------------*/\n/* enables reuse of local port */\nint opt_set_reuseport(lua_State *L, p_socket ps)\n{\n    return opt_setboolean(L, ps, SOL_SOCKET, SO_REUSEPORT);\n}\n\nint opt_get_reuseport(lua_State *L, p_socket ps)\n{\n    return opt_getboolean(L, ps, SOL_SOCKET, SO_REUSEPORT);\n}\n\n/*------------------------------------------------------*/\n/* disables the Nagle algorithm */\nint opt_set_tcp_nodelay(lua_State *L, p_socket ps)\n{\n    return opt_setboolean(L, ps, IPPROTO_TCP, TCP_NODELAY);\n}\n\nint opt_get_tcp_nodelay(lua_State *L, p_socket ps)\n{\n    return opt_getboolean(L, ps, IPPROTO_TCP, TCP_NODELAY);\n}\n\n/*------------------------------------------------------*/\n#ifdef TCP_KEEPIDLE\n\nint opt_get_tcp_keepidle(lua_State *L, p_socket ps)\n{\n    return opt_getint(L, ps, IPPROTO_TCP, TCP_KEEPIDLE);\n}\n\nint opt_set_tcp_keepidle(lua_State *L, p_socket ps)\n{\n    return opt_setint(L, ps, IPPROTO_TCP, TCP_KEEPIDLE);\n}\n\n#endif\n\n/*------------------------------------------------------*/\n#ifdef TCP_KEEPCNT\n\nint opt_get_tcp_keepcnt(lua_State *L, p_socket ps)\n{\n    return opt_getint(L, ps, IPPROTO_TCP, TCP_KEEPCNT);\n}\n\nint opt_set_tcp_keepcnt(lua_State *L, p_socket ps)\n{\n    return opt_setint(L, ps, IPPROTO_TCP, TCP_KEEPCNT);\n}\n\n#endif\n\n/*------------------------------------------------------*/\n#ifdef TCP_KEEPINTVL\n\nint opt_get_tcp_keepintvl(lua_State *L, p_socket ps)\n{\n    return opt_getint(L, ps, IPPROTO_TCP, TCP_KEEPINTVL);\n}\n\nint opt_set_tcp_keepintvl(lua_State *L, p_socket ps)\n{\n    return opt_setint(L, ps, IPPROTO_TCP, TCP_KEEPINTVL);\n}\n\n#endif\n\n/*------------------------------------------------------*/\nint opt_set_keepalive(lua_State *L, p_socket ps)\n{\n    return opt_setboolean(L, ps, SOL_SOCKET, SO_KEEPALIVE);\n}\n\nint opt_get_keepalive(lua_State *L, p_socket ps)\n{\n    return opt_getboolean(L, ps, SOL_SOCKET, SO_KEEPALIVE);\n}\n\n/*------------------------------------------------------*/\nint opt_set_dontroute(lua_State *L, p_socket ps)\n{\n    return opt_setboolean(L, ps, SOL_SOCKET, SO_DONTROUTE);\n}\n\nint opt_get_dontroute(lua_State *L, p_socket ps)\n{\n    return opt_getboolean(L, ps, SOL_SOCKET, SO_DONTROUTE);\n}\n\n/*------------------------------------------------------*/\nint opt_set_broadcast(lua_State *L, p_socket ps)\n{\n    return opt_setboolean(L, ps, SOL_SOCKET, SO_BROADCAST);\n}\n\nint opt_get_broadcast(lua_State *L, p_socket ps)\n{\n    return opt_getboolean(L, ps, SOL_SOCKET, SO_BROADCAST);\n}\n\n/*------------------------------------------------------*/\nint opt_set_recv_buf_size(lua_State *L, p_socket ps)\n{\n\treturn opt_setint(L, ps, SOL_SOCKET, SO_RCVBUF);\n}\n\nint opt_get_recv_buf_size(lua_State *L, p_socket ps)\n{\n\treturn opt_getint(L, ps, SOL_SOCKET, SO_RCVBUF);\n}\n\n/*------------------------------------------------------*/\nint opt_get_send_buf_size(lua_State *L, p_socket ps)\n{\n\treturn opt_getint(L, ps, SOL_SOCKET, SO_SNDBUF);\n}\n\nint opt_set_send_buf_size(lua_State *L, p_socket ps)\n{\n\treturn opt_setint(L, ps, SOL_SOCKET, SO_SNDBUF);\n}\n\n/*------------------------------------------------------*/\n\n#ifdef TCP_FASTOPEN\nint opt_set_tcp_fastopen(lua_State *L, p_socket ps)\n{\n    return opt_setint(L, ps, IPPROTO_TCP, TCP_FASTOPEN);\n}\n#endif\n\n#ifdef TCP_FASTOPEN_CONNECT\nint opt_set_tcp_fastopen_connect(lua_State *L, p_socket ps)\n{\n    return opt_setint(L, ps, IPPROTO_TCP, TCP_FASTOPEN_CONNECT);\n}\n#endif\n\n/*------------------------------------------------------*/\n\n#ifdef TCP_DEFER_ACCEPT\nint opt_set_tcp_defer_accept(lua_State *L, p_socket ps)\n{\n    return opt_setint(L, ps, IPPROTO_TCP, TCP_DEFER_ACCEPT);\n}\n#endif\n\n/*------------------------------------------------------*/\nint opt_set_ip6_unicast_hops(lua_State *L, p_socket ps)\n{\n  return opt_setint(L, ps, IPPROTO_IPV6, IPV6_UNICAST_HOPS);\n}\n\nint opt_get_ip6_unicast_hops(lua_State *L, p_socket ps)\n{\n  return opt_getint(L, ps, IPPROTO_IPV6, IPV6_UNICAST_HOPS);\n}\n\n/*------------------------------------------------------*/\nint opt_set_ip6_multicast_hops(lua_State *L, p_socket ps)\n{\n  return opt_setint(L, ps, IPPROTO_IPV6, IPV6_MULTICAST_HOPS);\n}\n\nint opt_get_ip6_multicast_hops(lua_State *L, p_socket ps)\n{\n  return opt_getint(L, ps, IPPROTO_IPV6, IPV6_MULTICAST_HOPS);\n}\n\n/*------------------------------------------------------*/\nint opt_set_ip_multicast_loop(lua_State *L, p_socket ps)\n{\n    return opt_setboolean(L, ps, IPPROTO_IP, IP_MULTICAST_LOOP);\n}\n\nint opt_get_ip_multicast_loop(lua_State *L, p_socket ps)\n{\n    return opt_getboolean(L, ps, IPPROTO_IP, IP_MULTICAST_LOOP);\n}\n\n/*------------------------------------------------------*/\nint opt_set_ip6_multicast_loop(lua_State *L, p_socket ps)\n{\n    return opt_setboolean(L, ps, IPPROTO_IPV6, IPV6_MULTICAST_LOOP);\n}\n\nint opt_get_ip6_multicast_loop(lua_State *L, p_socket ps)\n{\n    return opt_getboolean(L, ps, IPPROTO_IPV6, IPV6_MULTICAST_LOOP);\n}\n\n/*------------------------------------------------------*/\nint opt_set_linger(lua_State *L, p_socket ps)\n{\n    struct linger li;                      /* obj, name, table */\n    if (!lua_istable(L, 3)) auxiliar_typeerror(L,3,lua_typename(L, LUA_TTABLE));\n    lua_pushstring(L, \"on\");\n    lua_gettable(L, 3);\n    if (!lua_isboolean(L, -1))\n        luaL_argerror(L, 3, \"boolean 'on' field expected\");\n    li.l_onoff = (u_short) lua_toboolean(L, -1);\n    lua_pushstring(L, \"timeout\");\n    lua_gettable(L, 3);\n    if (!lua_isnumber(L, -1))\n        luaL_argerror(L, 3, \"number 'timeout' field expected\");\n    li.l_linger = (u_short) lua_tonumber(L, -1);\n    return opt_set(L, ps, SOL_SOCKET, SO_LINGER, (char *) &li, sizeof(li));\n}\n\nint opt_get_linger(lua_State *L, p_socket ps)\n{\n    struct linger li;                      /* obj, name */\n    int len = sizeof(li);\n    int err = opt_get(L, ps, SOL_SOCKET, SO_LINGER, (char *) &li, &len);\n    if (err)\n        return err;\n    lua_newtable(L);\n    lua_pushboolean(L, li.l_onoff);\n    lua_setfield(L, -2, \"on\");\n    lua_pushinteger(L, li.l_linger);\n    lua_setfield(L, -2, \"timeout\");\n    return 1;\n}\n\n/*------------------------------------------------------*/\nint opt_set_ip_multicast_ttl(lua_State *L, p_socket ps)\n{\n    return opt_setint(L, ps, IPPROTO_IP, IP_MULTICAST_TTL);\n}\n\n/*------------------------------------------------------*/\nint opt_set_ip_multicast_if(lua_State *L, p_socket ps)\n{\n    const char *address = luaL_checkstring(L, 3);    /* obj, name, ip */\n    struct in_addr val;\n    val.s_addr = htonl(INADDR_ANY);\n    if (strcmp(address, \"*\") && !inet_aton(address, &val))\n        luaL_argerror(L, 3, \"ip expected\");\n    return opt_set(L, ps, IPPROTO_IP, IP_MULTICAST_IF,\n        (char *) &val, sizeof(val));\n}\n\nint opt_get_ip_multicast_if(lua_State *L, p_socket ps)\n{\n    struct in_addr val;\n    socklen_t len = sizeof(val);\n    if (getsockopt(*ps, IPPROTO_IP, IP_MULTICAST_IF, (char *) &val, &len) < 0) {\n        lua_pushnil(L);\n        lua_pushstring(L, \"getsockopt failed\");\n        return 2;\n    }\n    lua_pushstring(L, inet_ntoa(val));\n    return 1;\n}\n\n/*------------------------------------------------------*/\nint opt_set_ip_add_membership(lua_State *L, p_socket ps)\n{\n    return opt_setmembership(L, ps, IPPROTO_IP, IP_ADD_MEMBERSHIP);\n}\n\nint opt_set_ip_drop_membersip(lua_State *L, p_socket ps)\n{\n    return opt_setmembership(L, ps, IPPROTO_IP, IP_DROP_MEMBERSHIP);\n}\n\n/*------------------------------------------------------*/\nint opt_set_ip6_add_membership(lua_State *L, p_socket ps)\n{\n    return opt_ip6_setmembership(L, ps, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP);\n}\n\nint opt_set_ip6_drop_membersip(lua_State *L, p_socket ps)\n{\n    return opt_ip6_setmembership(L, ps, IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP);\n}\n\n/*------------------------------------------------------*/\nint opt_get_ip6_v6only(lua_State *L, p_socket ps)\n{\n    return opt_getboolean(L, ps, IPPROTO_IPV6, IPV6_V6ONLY);\n}\n\nint opt_set_ip6_v6only(lua_State *L, p_socket ps)\n{\n    return opt_setboolean(L, ps, IPPROTO_IPV6, IPV6_V6ONLY);\n}\n\n/*------------------------------------------------------*/\nint opt_get_error(lua_State *L, p_socket ps)\n{\n    int val = 0;\n    socklen_t len = sizeof(val);\n    if (getsockopt(*ps, SOL_SOCKET, SO_ERROR, (char *) &val, &len) < 0) {\n        lua_pushnil(L);\n        lua_pushstring(L, \"getsockopt failed\");\n        return 2;\n    }\n    lua_pushstring(L, socket_strerror(val));\n    return 1;\n}\n\n/*=========================================================================*\\\n* Auxiliar functions\n\\*=========================================================================*/\nstatic int opt_setmembership(lua_State *L, p_socket ps, int level, int name)\n{\n    struct ip_mreq val;                   /* obj, name, table */\n    if (!lua_istable(L, 3)) auxiliar_typeerror(L,3,lua_typename(L, LUA_TTABLE));\n    lua_pushstring(L, \"multiaddr\");\n    lua_gettable(L, 3);\n    if (!lua_isstring(L, -1))\n        luaL_argerror(L, 3, \"string 'multiaddr' field expected\");\n    if (!inet_aton(lua_tostring(L, -1), &val.imr_multiaddr))\n        luaL_argerror(L, 3, \"invalid 'multiaddr' ip address\");\n    lua_pushstring(L, \"interface\");\n    lua_gettable(L, 3);\n    if (!lua_isstring(L, -1))\n        luaL_argerror(L, 3, \"string 'interface' field expected\");\n    val.imr_interface.s_addr = htonl(INADDR_ANY);\n    if (strcmp(lua_tostring(L, -1), \"*\") &&\n            !inet_aton(lua_tostring(L, -1), &val.imr_interface))\n        luaL_argerror(L, 3, \"invalid 'interface' ip address\");\n    return opt_set(L, ps, level, name, (char *) &val, sizeof(val));\n}\n\nstatic int opt_ip6_setmembership(lua_State *L, p_socket ps, int level, int name)\n{\n    struct ipv6_mreq val;                   /* obj, opt-name, table */\n    memset(&val, 0, sizeof(val));\n    if (!lua_istable(L, 3)) auxiliar_typeerror(L,3,lua_typename(L, LUA_TTABLE));\n    lua_pushstring(L, \"multiaddr\");\n    lua_gettable(L, 3);\n    if (!lua_isstring(L, -1))\n        luaL_argerror(L, 3, \"string 'multiaddr' field expected\");\n    if (!inet_pton(AF_INET6, lua_tostring(L, -1), &val.ipv6mr_multiaddr))\n        luaL_argerror(L, 3, \"invalid 'multiaddr' ip address\");\n    lua_pushstring(L, \"interface\");\n    lua_gettable(L, 3);\n    /* By default we listen to interface on default route\n     * (sigh). However, interface= can override it. We should\n     * support either number, or name for it. Waiting for\n     * windows port of if_nametoindex */\n    if (!lua_isnil(L, -1)) {\n        if (lua_isnumber(L, -1)) {\n            val.ipv6mr_interface = (unsigned int) lua_tonumber(L, -1);\n        } else\n          luaL_argerror(L, -1, \"number 'interface' field expected\");\n    }\n    return opt_set(L, ps, level, name, (char *) &val, sizeof(val));\n}\n\nstatic\nint opt_get(lua_State *L, p_socket ps, int level, int name, void *val, int* len)\n{\n    socklen_t socklen = *len;\n    if (getsockopt(*ps, level, name, (char *) val, &socklen) < 0) {\n        lua_pushnil(L);\n        lua_pushstring(L, \"getsockopt failed\");\n        return 2;\n    }\n    *len = socklen;\n    return 0;\n}\n\nstatic\nint opt_set(lua_State *L, p_socket ps, int level, int name, void *val, int len)\n{\n    if (setsockopt(*ps, level, name, (char *) val, len) < 0) {\n        lua_pushnil(L);\n        lua_pushstring(L, \"setsockopt failed\");\n        return 2;\n    }\n    lua_pushnumber(L, 1);\n    return 1;\n}\n\nstatic int opt_getboolean(lua_State *L, p_socket ps, int level, int name)\n{\n    int val = 0;\n    int len = sizeof(val);\n    int err = opt_get(L, ps, level, name, (char *) &val, &len);\n    if (err)\n        return err;\n    lua_pushboolean(L, val);\n    return 1;\n}\n\nstatic int opt_setboolean(lua_State *L, p_socket ps, int level, int name)\n{\n    int val = auxiliar_checkboolean(L, 3);             /* obj, name, bool */\n    return opt_set(L, ps, level, name, (char *) &val, sizeof(val));\n}\n\nstatic int opt_getint(lua_State *L, p_socket ps, int level, int name)\n{\n    int val = 0;\n    int len = sizeof(val);\n    int err = opt_get(L, ps, level, name, (char *) &val, &len);\n    if (err)\n        return err;\n    lua_pushnumber(L, val);\n    return 1;\n}\n\nstatic int opt_setint(lua_State *L, p_socket ps, int level, int name)\n{\n    int val = (int) lua_tonumber(L, 3);             /* obj, name, int */\n    return opt_set(L, ps, level, name, (char *) &val, sizeof(val));\n}\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/options.h",
    "content": "#ifndef OPTIONS_H\n#define OPTIONS_H\n/*=========================================================================*\\\n* Common option interface \n* LuaSocket toolkit\n*\n* This module provides a common interface to socket options, used mainly by\n* modules UDP and TCP. \n\\*=========================================================================*/\n\n#include \"luasocket.h\"\n#include \"socket.h\"\n\n/* option registry */\ntypedef struct t_opt {\n  const char *name;\n  int (*func)(lua_State *L, p_socket ps);\n} t_opt;\ntypedef t_opt *p_opt;\n\n#ifndef _WIN32\n#pragma GCC visibility push(hidden)\n#endif\n\nint opt_meth_setoption(lua_State *L, p_opt opt, p_socket ps);\nint opt_meth_getoption(lua_State *L, p_opt opt, p_socket ps);\n\nint opt_set_reuseaddr(lua_State *L, p_socket ps);\nint opt_get_reuseaddr(lua_State *L, p_socket ps);\n\nint opt_set_reuseport(lua_State *L, p_socket ps);\nint opt_get_reuseport(lua_State *L, p_socket ps);\n\nint opt_set_tcp_nodelay(lua_State *L, p_socket ps);\nint opt_get_tcp_nodelay(lua_State *L, p_socket ps);\n\n#ifdef TCP_KEEPIDLE\nint opt_set_tcp_keepidle(lua_State *L, p_socket ps);\nint opt_get_tcp_keepidle(lua_State *L, p_socket ps);\n#endif\n\n#ifdef TCP_KEEPCNT\nint opt_set_tcp_keepcnt(lua_State *L, p_socket ps);\nint opt_get_tcp_keepcnt(lua_State *L, p_socket ps);\n#endif\n\n#ifdef TCP_KEEPINTVL\nint opt_set_tcp_keepintvl(lua_State *L, p_socket ps);\nint opt_get_tcp_keepintvl(lua_State *L, p_socket ps);\n#endif\n\n#ifdef TCP_DEFER_ACCEPT\nint opt_set_tcp_defer_accept(lua_State *L, p_socket ps);\n#endif\n\nint opt_set_bindtodevice(lua_State *L, p_socket ps);\nint opt_get_bindtodevice(lua_State *L, p_socket ps);\n\nint opt_set_keepalive(lua_State *L, p_socket ps);\nint opt_get_keepalive(lua_State *L, p_socket ps);\n\nint opt_set_dontroute(lua_State *L, p_socket ps);\nint opt_get_dontroute(lua_State *L, p_socket ps);\n\nint opt_set_broadcast(lua_State *L, p_socket ps);\nint opt_get_broadcast(lua_State *L, p_socket ps);\n\nint opt_set_recv_buf_size(lua_State *L, p_socket ps);\nint opt_get_recv_buf_size(lua_State *L, p_socket ps);\n\nint opt_set_send_buf_size(lua_State *L, p_socket ps);\nint opt_get_send_buf_size(lua_State *L, p_socket ps);\n\n#ifdef TCP_FASTOPEN\nint opt_set_tcp_fastopen(lua_State *L, p_socket ps);\n#endif\n#ifdef TCP_FASTOPEN_CONNECT\nint opt_set_tcp_fastopen_connect(lua_State *L, p_socket ps);\n#endif\n\nint opt_set_ip6_unicast_hops(lua_State *L, p_socket ps);\nint opt_get_ip6_unicast_hops(lua_State *L, p_socket ps);\n\nint opt_set_ip6_multicast_hops(lua_State *L, p_socket ps);\nint opt_get_ip6_multicast_hops(lua_State *L, p_socket ps);\n\nint opt_set_ip_multicast_loop(lua_State *L, p_socket ps);\nint opt_get_ip_multicast_loop(lua_State *L, p_socket ps);\n\nint opt_set_ip6_multicast_loop(lua_State *L, p_socket ps);\nint opt_get_ip6_multicast_loop(lua_State *L, p_socket ps);\n\nint opt_set_linger(lua_State *L, p_socket ps);\nint opt_get_linger(lua_State *L, p_socket ps);\n\nint opt_set_ip_multicast_ttl(lua_State *L, p_socket ps);\n\nint opt_set_ip_multicast_if(lua_State *L, p_socket ps);\nint opt_get_ip_multicast_if(lua_State *L, p_socket ps);\n\nint opt_set_ip_add_membership(lua_State *L, p_socket ps);\nint opt_set_ip_drop_membersip(lua_State *L, p_socket ps);\n\nint opt_set_ip6_add_membership(lua_State *L, p_socket ps);\nint opt_set_ip6_drop_membersip(lua_State *L, p_socket ps);\n\nint opt_set_ip6_v6only(lua_State *L, p_socket ps);\nint opt_get_ip6_v6only(lua_State *L, p_socket ps);\n\nint opt_get_error(lua_State *L, p_socket ps);\n\n#ifndef _WIN32\n#pragma GCC visibility pop\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/pierror.h",
    "content": "#ifndef PIERROR_H\n#define PIERROR_H\n/*=========================================================================*\\\n* Error messages\n* Defines platform independent error messages\n\\*=========================================================================*/\n\n#define PIE_HOST_NOT_FOUND \"host not found\"\n#define PIE_ADDRINUSE      \"address already in use\"\n#define PIE_ISCONN         \"already connected\"\n#define PIE_ACCESS         \"permission denied\"\n#define PIE_CONNREFUSED    \"connection refused\"\n#define PIE_CONNABORTED    \"closed\"\n#define PIE_CONNRESET      \"closed\"\n#define PIE_TIMEDOUT       \"timeout\"\n#define PIE_AGAIN          \"temporary failure in name resolution\"\n#define PIE_BADFLAGS       \"invalid value for ai_flags\"\n#define PIE_BADHINTS       \"invalid value for hints\"\n#define PIE_FAIL           \"non-recoverable failure in name resolution\"\n#define PIE_FAMILY         \"ai_family not supported\"\n#define PIE_MEMORY         \"memory allocation failure\"\n#define PIE_NONAME         \"host or service not provided, or not known\"\n#define PIE_OVERFLOW       \"argument buffer overflow\"\n#define PIE_PROTOCOL       \"resolved protocol is unknown\"\n#define PIE_SERVICE        \"service not supported for socket type\"\n#define PIE_SOCKTYPE       \"ai_socktype not supported\"\n\n#endif\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/select.c",
    "content": "/*=========================================================================*\\\n* Select implementation\n* LuaSocket toolkit\n\\*=========================================================================*/\n#include \"luasocket.h\"\n\n#include \"socket.h\"\n#include \"timeout.h\"\n#include \"select.h\"\n\n#include <string.h>\n\n/*=========================================================================*\\\n* Internal function prototypes.\n\\*=========================================================================*/\nstatic t_socket getfd(lua_State *L);\nstatic int dirty(lua_State *L);\nstatic void collect_fd(lua_State *L, int tab, int itab,\n        fd_set *set, t_socket *max_fd);\nstatic int check_dirty(lua_State *L, int tab, int dtab, fd_set *set);\nstatic void return_fd(lua_State *L, fd_set *set, t_socket max_fd,\n        int itab, int tab, int start);\nstatic void make_assoc(lua_State *L, int tab);\nstatic int global_select(lua_State *L);\n\n/* functions in library namespace */\nstatic luaL_Reg func[] = {\n    {\"select\", global_select},\n    {NULL,     NULL}\n};\n\n/*-------------------------------------------------------------------------*\\\n* Initializes module\n\\*-------------------------------------------------------------------------*/\nint select_open(lua_State *L) {\n    lua_pushstring(L, \"_SETSIZE\");\n    lua_pushinteger(L, FD_SETSIZE);\n    lua_rawset(L, -3);\n    lua_pushstring(L, \"_SOCKETINVALID\");\n    lua_pushinteger(L, SOCKET_INVALID);\n    lua_rawset(L, -3);\n    luaL_setfuncs(L, func, 0);\n    return 0;\n}\n\n/*=========================================================================*\\\n* Global Lua functions\n\\*=========================================================================*/\n/*-------------------------------------------------------------------------*\\\n* Waits for a set of sockets until a condition is met or timeout.\n\\*-------------------------------------------------------------------------*/\nstatic int global_select(lua_State *L) {\n    int rtab, wtab, itab, ret, ndirty;\n    t_socket max_fd = SOCKET_INVALID;\n    fd_set rset, wset;\n    t_timeout tm;\n    double t = luaL_optnumber(L, 3, -1);\n    FD_ZERO(&rset); FD_ZERO(&wset);\n    lua_settop(L, 3);\n    lua_newtable(L); itab = lua_gettop(L);\n    lua_newtable(L); rtab = lua_gettop(L);\n    lua_newtable(L); wtab = lua_gettop(L);\n    collect_fd(L, 1, itab, &rset, &max_fd);\n    collect_fd(L, 2, itab, &wset, &max_fd);\n    ndirty = check_dirty(L, 1, rtab, &rset);\n    t = ndirty > 0? 0.0: t;\n    timeout_init(&tm, t, -1);\n    timeout_markstart(&tm);\n    ret = socket_select(max_fd+1, &rset, &wset, NULL, &tm);\n    if (ret > 0 || ndirty > 0) {\n        return_fd(L, &rset, max_fd+1, itab, rtab, ndirty);\n        return_fd(L, &wset, max_fd+1, itab, wtab, 0);\n        make_assoc(L, rtab);\n        make_assoc(L, wtab);\n        return 2;\n    } else if (ret == 0) {\n        lua_pushstring(L, \"timeout\");\n        return 3;\n    } else {\n        luaL_error(L, \"select failed\");\n        return 3;\n    }\n}\n\n/*=========================================================================*\\\n* Internal functions\n\\*=========================================================================*/\nstatic t_socket getfd(lua_State *L) {\n    t_socket fd = SOCKET_INVALID;\n    lua_pushstring(L, \"getfd\");\n    lua_gettable(L, -2);\n    if (!lua_isnil(L, -1)) {\n        lua_pushvalue(L, -2);\n        lua_call(L, 1, 1);\n        if (lua_isnumber(L, -1)) {\n            double numfd = lua_tonumber(L, -1);\n            fd = (numfd >= 0.0)? (t_socket) numfd: SOCKET_INVALID;\n        }\n    }\n    lua_pop(L, 1);\n    return fd;\n}\n\nstatic int dirty(lua_State *L) {\n    int is = 0;\n    lua_pushstring(L, \"dirty\");\n    lua_gettable(L, -2);\n    if (!lua_isnil(L, -1)) {\n        lua_pushvalue(L, -2);\n        lua_call(L, 1, 1);\n        is = lua_toboolean(L, -1);\n    }\n    lua_pop(L, 1);\n    return is;\n}\n\nstatic void collect_fd(lua_State *L, int tab, int itab,\n        fd_set *set, t_socket *max_fd) {\n    int i = 1, n = 0;\n    /* nil is the same as an empty table */\n    if (lua_isnil(L, tab)) return;\n    /* otherwise we need it to be a table */\n    luaL_checktype(L, tab, LUA_TTABLE);\n    for ( ;; ) {\n        t_socket fd;\n        lua_pushnumber(L, i);\n        lua_gettable(L, tab);\n        if (lua_isnil(L, -1)) {\n            lua_pop(L, 1);\n            break;\n        }\n        /* getfd figures out if this is a socket */\n        fd = getfd(L);\n        if (fd != SOCKET_INVALID) {\n            /* make sure we don't overflow the fd_set */\n#ifdef _WIN32\n            if (n >= FD_SETSIZE)\n                luaL_argerror(L, tab, \"too many sockets\");\n#else\n            if (fd >= FD_SETSIZE)\n                luaL_argerror(L, tab, \"descriptor too large for set size\");\n#endif\n            FD_SET(fd, set);\n            n++;\n            /* keep track of the largest descriptor so far */\n            if (*max_fd == SOCKET_INVALID || *max_fd < fd)\n                *max_fd = fd;\n            /* make sure we can map back from descriptor to the object */\n            lua_pushnumber(L, (lua_Number) fd);\n            lua_pushvalue(L, -2);\n            lua_settable(L, itab);\n        }\n        lua_pop(L, 1);\n        i = i + 1;\n    }\n}\n\nstatic int check_dirty(lua_State *L, int tab, int dtab, fd_set *set) {\n    int ndirty = 0, i = 1;\n    if (lua_isnil(L, tab))\n        return 0;\n    for ( ;; ) {\n        t_socket fd;\n        lua_pushnumber(L, i);\n        lua_gettable(L, tab);\n        if (lua_isnil(L, -1)) {\n            lua_pop(L, 1);\n            break;\n        }\n        fd = getfd(L);\n        if (fd != SOCKET_INVALID && dirty(L)) {\n            lua_pushnumber(L, ++ndirty);\n            lua_pushvalue(L, -2);\n            lua_settable(L, dtab);\n            FD_CLR(fd, set);\n        }\n        lua_pop(L, 1);\n        i = i + 1;\n    }\n    return ndirty;\n}\n\nstatic void return_fd(lua_State *L, fd_set *set, t_socket max_fd,\n        int itab, int tab, int start) {\n    t_socket fd;\n    for (fd = 0; fd < max_fd; fd++) {\n        if (FD_ISSET(fd, set)) {\n            lua_pushnumber(L, ++start);\n            lua_pushnumber(L, (lua_Number) fd);\n            lua_gettable(L, itab);\n            lua_settable(L, tab);\n        }\n    }\n}\n\nstatic void make_assoc(lua_State *L, int tab) {\n    int i = 1, atab;\n    lua_newtable(L); atab = lua_gettop(L);\n    for ( ;; ) {\n        lua_pushnumber(L, i);\n        lua_gettable(L, tab);\n        if (!lua_isnil(L, -1)) {\n            lua_pushnumber(L, i);\n            lua_pushvalue(L, -2);\n            lua_settable(L, atab);\n            lua_pushnumber(L, i);\n            lua_settable(L, atab);\n        } else {\n            lua_pop(L, 1);\n            break;\n        }\n        i = i+1;\n    }\n}\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/select.h",
    "content": "#ifndef SELECT_H\n#define SELECT_H\n/*=========================================================================*\\\n* Select implementation\n* LuaSocket toolkit\n*\n* Each object that can be passed to the select function has to export \n* method getfd() which returns the descriptor to be passed to the\n* underlying select function. Another method, dirty(), should return \n* true if there is data ready for reading (required for buffered input).\n\\*=========================================================================*/\n\n#ifndef _WIN32\n#pragma GCC visibility push(hidden)\n#endif\n\nint select_open(lua_State *L);\n\n#ifndef _WIN32\n#pragma GCC visibility pop\n#endif\n\n#endif /* SELECT_H */\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/serial.c",
    "content": "/*=========================================================================*\\\n* Serial stream\n* LuaSocket toolkit\n\\*=========================================================================*/\n#include \"luasocket.h\"\n\n#include \"auxiliar.h\"\n#include \"socket.h\"\n#include \"options.h\"\n#include \"unix.h\"\n\n#include <string.h>\n#include <sys/un.h>\n\n/*\nReuses userdata definition from unix.h, since it is useful for all\nstream-like objects.\n\nIf we stored the serial path for use in error messages or userdata\nprinting, we might need our own userdata definition.\n\nGroup usage is semi-inherited from unix.c, but unnecessary since we\nhave only one object type.\n*/\n\n/*=========================================================================*\\\n* Internal function prototypes\n\\*=========================================================================*/\nstatic int global_create(lua_State *L);\nstatic int meth_send(lua_State *L);\nstatic int meth_receive(lua_State *L);\nstatic int meth_close(lua_State *L);\nstatic int meth_settimeout(lua_State *L);\nstatic int meth_getfd(lua_State *L);\nstatic int meth_setfd(lua_State *L);\nstatic int meth_dirty(lua_State *L);\nstatic int meth_getstats(lua_State *L);\nstatic int meth_setstats(lua_State *L);\n\n/* serial object methods */\nstatic luaL_Reg serial_methods[] = {\n    {\"__gc\",        meth_close},\n    {\"__tostring\",  auxiliar_tostring},\n    {\"close\",       meth_close},\n    {\"dirty\",       meth_dirty},\n    {\"getfd\",       meth_getfd},\n    {\"getstats\",    meth_getstats},\n    {\"setstats\",    meth_setstats},\n    {\"receive\",     meth_receive},\n    {\"send\",        meth_send},\n    {\"setfd\",       meth_setfd},\n    {\"settimeout\",  meth_settimeout},\n    {NULL,          NULL}\n};\n\n/*-------------------------------------------------------------------------*\\\n* Initializes module\n\\*-------------------------------------------------------------------------*/\nLUASOCKET_API int luaopen_socket_serial(lua_State *L) {\n    /* create classes */\n    auxiliar_newclass(L, \"serial{client}\", serial_methods);\n    /* create class groups */\n    auxiliar_add2group(L, \"serial{client}\", \"serial{any}\");\n    lua_pushcfunction(L, global_create);\n    return 1;\n}\n\n/*=========================================================================*\\\n* Lua methods\n\\*=========================================================================*/\n/*-------------------------------------------------------------------------*\\\n* Just call buffered IO methods\n\\*-------------------------------------------------------------------------*/\nstatic int meth_send(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkclass(L, \"serial{client}\", 1);\n    return buffer_meth_send(L, &un->buf);\n}\n\nstatic int meth_receive(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkclass(L, \"serial{client}\", 1);\n    return buffer_meth_receive(L, &un->buf);\n}\n\nstatic int meth_getstats(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkclass(L, \"serial{client}\", 1);\n    return buffer_meth_getstats(L, &un->buf);\n}\n\nstatic int meth_setstats(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkclass(L, \"serial{client}\", 1);\n    return buffer_meth_setstats(L, &un->buf);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Select support methods\n\\*-------------------------------------------------------------------------*/\nstatic int meth_getfd(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkgroup(L, \"serial{any}\", 1);\n    lua_pushnumber(L, (int) un->sock);\n    return 1;\n}\n\n/* this is very dangerous, but can be handy for those that are brave enough */\nstatic int meth_setfd(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkgroup(L, \"serial{any}\", 1);\n    un->sock = (t_socket) luaL_checknumber(L, 2);\n    return 0;\n}\n\nstatic int meth_dirty(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkgroup(L, \"serial{any}\", 1);\n    lua_pushboolean(L, !buffer_isempty(&un->buf));\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Closes socket used by object\n\\*-------------------------------------------------------------------------*/\nstatic int meth_close(lua_State *L)\n{\n    p_unix un = (p_unix) auxiliar_checkgroup(L, \"serial{any}\", 1);\n    socket_destroy(&un->sock);\n    lua_pushnumber(L, 1);\n    return 1;\n}\n\n\n/*-------------------------------------------------------------------------*\\\n* Just call tm methods\n\\*-------------------------------------------------------------------------*/\nstatic int meth_settimeout(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkgroup(L, \"serial{any}\", 1);\n    return timeout_meth_settimeout(L, &un->tm);\n}\n\n/*=========================================================================*\\\n* Library functions\n\\*=========================================================================*/\n\n\n/*-------------------------------------------------------------------------*\\\n* Creates a serial object\n\\*-------------------------------------------------------------------------*/\nstatic int global_create(lua_State *L) {\n    const char* path = luaL_checkstring(L, 1);\n\n    /* allocate unix object */\n    p_unix un = (p_unix) lua_newuserdata(L, sizeof(t_unix));\n\n    /* open serial device */\n    t_socket sock = open(path, O_NOCTTY|O_RDWR);\n\n    /*printf(\"open %s on %d\\n\", path, sock);*/\n\n    if (sock < 0)  {\n        lua_pushnil(L);\n        lua_pushstring(L, socket_strerror(errno));\n        lua_pushnumber(L, errno);\n        return 3;\n    }\n    /* set its type as client object */\n    auxiliar_setclass(L, \"serial{client}\", -1);\n    /* initialize remaining structure fields */\n    socket_setnonblocking(&sock);\n    un->sock = sock;\n    io_init(&un->io, (p_send) socket_write, (p_recv) socket_read,\n            (p_error) socket_ioerror, &un->sock);\n    timeout_init(&un->tm, -1, -1);\n    buffer_init(&un->buf, &un->io, &un->tm);\n    return 1;\n}\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/smtp.lua",
    "content": "-----------------------------------------------------------------------------\n-- SMTP client support for the Lua language.\n-- LuaSocket toolkit.\n-- Author: Diego Nehab\n-----------------------------------------------------------------------------\n\n-----------------------------------------------------------------------------\n-- Declare module and import dependencies\n-----------------------------------------------------------------------------\nlocal base = _G\nlocal coroutine = require(\"coroutine\")\nlocal string = require(\"string\")\nlocal math = require(\"math\")\nlocal os = require(\"os\")\nlocal socket = require(\"socket\")\nlocal tp = require(\"socket.tp\")\nlocal ltn12 = require(\"ltn12\")\nlocal headers = require(\"socket.headers\")\nlocal mime = require(\"mime\")\n\nsocket.smtp = {}\nlocal _M = socket.smtp\n\n-----------------------------------------------------------------------------\n-- Program constants\n-----------------------------------------------------------------------------\n-- timeout for connection\n_M.TIMEOUT = 60\n-- default server used to send e-mails\n_M.SERVER = \"localhost\"\n-- default port\n_M.PORT = 25\n-- domain used in HELO command and default sendmail\n-- If we are under a CGI, try to get from environment\n_M.DOMAIN = os.getenv(\"SERVER_NAME\") or \"localhost\"\n-- default time zone (means we don't know)\n_M.ZONE = \"-0000\"\n\n---------------------------------------------------------------------------\n-- Low level SMTP API\n-----------------------------------------------------------------------------\nlocal metat = { __index = {} }\n\nfunction metat.__index:greet(domain)\n    self.try(self.tp:check(\"2..\"))\n    self.try(self.tp:command(\"EHLO\", domain or _M.DOMAIN))\n    return socket.skip(1, self.try(self.tp:check(\"2..\")))\nend\n\nfunction metat.__index:mail(from)\n    self.try(self.tp:command(\"MAIL\", \"FROM:\" .. from))\n    return self.try(self.tp:check(\"2..\"))\nend\n\nfunction metat.__index:rcpt(to)\n    self.try(self.tp:command(\"RCPT\", \"TO:\" .. to))\n    return self.try(self.tp:check(\"2..\"))\nend\n\nfunction metat.__index:data(src, step)\n    self.try(self.tp:command(\"DATA\"))\n    self.try(self.tp:check(\"3..\"))\n    self.try(self.tp:source(src, step))\n    self.try(self.tp:send(\"\\r\\n.\\r\\n\"))\n    return self.try(self.tp:check(\"2..\"))\nend\n\nfunction metat.__index:quit()\n    self.try(self.tp:command(\"QUIT\"))\n    return self.try(self.tp:check(\"2..\"))\nend\n\nfunction metat.__index:close()\n    return self.tp:close()\nend\n\nfunction metat.__index:login(user, password)\n    self.try(self.tp:command(\"AUTH\", \"LOGIN\"))\n    self.try(self.tp:check(\"3..\"))\n    self.try(self.tp:send(mime.b64(user) .. \"\\r\\n\"))\n    self.try(self.tp:check(\"3..\"))\n    self.try(self.tp:send(mime.b64(password) .. \"\\r\\n\"))\n    return self.try(self.tp:check(\"2..\"))\nend\n\nfunction metat.__index:plain(user, password)\n    local auth = \"PLAIN \" .. mime.b64(\"\\0\" .. user .. \"\\0\" .. password)\n    self.try(self.tp:command(\"AUTH\", auth))\n    return self.try(self.tp:check(\"2..\"))\nend\n\nfunction metat.__index:auth(user, password, ext)\n    if not user or not password then return 1 end\n    if string.find(ext, \"AUTH[^\\n]+LOGIN\") then\n        return self:login(user, password)\n    elseif string.find(ext, \"AUTH[^\\n]+PLAIN\") then\n        return self:plain(user, password)\n    else\n        self.try(nil, \"authentication not supported\")\n    end\nend\n\n-- send message or throw an exception\nfunction metat.__index:send(mailt)\n    self:mail(mailt.from)\n    if base.type(mailt.rcpt) == \"table\" then\n        for i,v in base.ipairs(mailt.rcpt) do\n            self:rcpt(v)\n        end\n    else\n        self:rcpt(mailt.rcpt)\n    end\n    self:data(ltn12.source.chain(mailt.source, mime.stuff()), mailt.step)\nend\n\nfunction _M.open(server, port, create)\n    local tp = socket.try(tp.connect(server or _M.SERVER, port or _M.PORT,\n        _M.TIMEOUT, create))\n    local s = base.setmetatable({tp = tp}, metat)\n    -- make sure tp is closed if we get an exception\n    s.try = socket.newtry(function()\n        s:close()\n    end)\n    return s\nend\n\n-- convert headers to lowercase\nlocal function lower_headers(headers)\n    local lower = {}\n    for i,v in base.pairs(headers or lower) do\n        lower[string.lower(i)] = v\n    end\n    return lower\nend\n\n---------------------------------------------------------------------------\n-- Multipart message source\n-----------------------------------------------------------------------------\n-- returns a hopefully unique mime boundary\nlocal seqno = 0\nlocal function newboundary()\n    seqno = seqno + 1\n    return string.format('%s%05d==%05u', os.date('%d%m%Y%H%M%S'),\n        math.random(0, 99999), seqno)\nend\n\n-- send_message forward declaration\nlocal send_message\n\n-- yield the headers all at once, it's faster\nlocal function send_headers(tosend)\n    local canonic = headers.canonic\n    local h = \"\\r\\n\"\n    for f,v in base.pairs(tosend) do\n        h = (canonic[f] or f) .. ': ' .. v .. \"\\r\\n\" .. h\n    end\n    coroutine.yield(h)\nend\n\n-- yield multipart message body from a multipart message table\nlocal function send_multipart(mesgt)\n    -- make sure we have our boundary and send headers\n    local bd = newboundary()\n    local headers = lower_headers(mesgt.headers or {})\n    headers['content-type'] = headers['content-type'] or 'multipart/mixed'\n    headers['content-type'] = headers['content-type'] ..\n        '; boundary=\"' ..  bd .. '\"'\n    send_headers(headers)\n    -- send preamble\n    if mesgt.body.preamble then\n        coroutine.yield(mesgt.body.preamble)\n        coroutine.yield(\"\\r\\n\")\n    end\n    -- send each part separated by a boundary\n    for i, m in base.ipairs(mesgt.body) do\n        coroutine.yield(\"\\r\\n--\" .. bd .. \"\\r\\n\")\n        send_message(m)\n    end\n    -- send last boundary\n    coroutine.yield(\"\\r\\n--\" .. bd .. \"--\\r\\n\\r\\n\")\n    -- send epilogue\n    if mesgt.body.epilogue then\n        coroutine.yield(mesgt.body.epilogue)\n        coroutine.yield(\"\\r\\n\")\n    end\nend\n\n-- yield message body from a source\nlocal function send_source(mesgt)\n    -- make sure we have a content-type\n    local headers = lower_headers(mesgt.headers or {})\n    headers['content-type'] = headers['content-type'] or\n        'text/plain; charset=\"iso-8859-1\"'\n    send_headers(headers)\n    -- send body from source\n    while true do\n        local chunk, err = mesgt.body()\n        if err then coroutine.yield(nil, err)\n        elseif chunk then coroutine.yield(chunk)\n        else break end\n    end\nend\n\n-- yield message body from a string\nlocal function send_string(mesgt)\n    -- make sure we have a content-type\n    local headers = lower_headers(mesgt.headers or {})\n    headers['content-type'] = headers['content-type'] or\n        'text/plain; charset=\"iso-8859-1\"'\n    send_headers(headers)\n    -- send body from string\n    coroutine.yield(mesgt.body)\nend\n\n-- message source\nfunction send_message(mesgt)\n    if base.type(mesgt.body) == \"table\" then send_multipart(mesgt)\n    elseif base.type(mesgt.body) == \"function\" then send_source(mesgt)\n    else send_string(mesgt) end\nend\n\n-- set defaul headers\nlocal function adjust_headers(mesgt)\n    local lower = lower_headers(mesgt.headers)\n    lower[\"date\"] = lower[\"date\"] or\n        os.date(\"!%a, %d %b %Y %H:%M:%S \") .. (mesgt.zone or _M.ZONE)\n    lower[\"x-mailer\"] = lower[\"x-mailer\"] or socket._VERSION\n    -- this can't be overridden\n    lower[\"mime-version\"] = \"1.0\"\n    return lower\nend\n\nfunction _M.message(mesgt)\n    mesgt.headers = adjust_headers(mesgt)\n    -- create and return message source\n    local co = coroutine.create(function() send_message(mesgt) end)\n    return function()\n        local ret, a, b = coroutine.resume(co)\n        if ret then return a, b\n        else return nil, a end\n    end\nend\n\n---------------------------------------------------------------------------\n-- High level SMTP API\n-----------------------------------------------------------------------------\n_M.send = socket.protect(function(mailt)\n    local s = _M.open(mailt.server, mailt.port, mailt.create)\n    local ext = s:greet(mailt.domain)\n    s:auth(mailt.user, mailt.password, ext)\n    s:send(mailt)\n    s:quit()\n    return s:close()\nend)\n\nreturn _M\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/smtp.lua.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n * \n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n * \n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n * \n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\nnamespace love\n{\n\n// [smtp.lua]\nconst unsigned char smtp_lua[] = \n{\n\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x53, 0x4d, 0x54, 0x50, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x75, 0x70, \n\t0x70, 0x6f, 0x72, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x6c, \n\t0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x4c, 0x75, 0x61, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0x6b, \n\t0x69, 0x74, 0x2e, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x3a, 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x20, 0x4e, \n\t0x65, 0x68, 0x61, 0x62, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, \n\t0x61, 0x6e, 0x64, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, \n\t0x6e, 0x63, 0x69, 0x65, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x47, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, \n\t0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, \n\t0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, \n\t0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, \n\t0x72, 0x65, 0x28, 0x22, 0x6d, 0x61, 0x74, 0x68, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, \n\t0x28, 0x22, 0x6f, 0x73, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, \n\t0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x70, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, \n\t0x28, 0x22, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x74, 0x70, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, \n\t0x69, 0x72, 0x65, 0x28, 0x22, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, \n\t0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, \n\t0x65, 0x72, 0x73, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, \n\t0x72, 0x65, 0x28, 0x22, 0x6d, 0x69, 0x6d, 0x65, 0x22, 0x29, 0x0a,\n\t0x0a,\n\t0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x6d, 0x74, 0x70, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x4d, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, \n\t0x73, 0x6d, 0x74, 0x70, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, \n\t0x74, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6e, \n\t0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x20, 0x3d, 0x20, 0x36, 0x30, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, \n\t0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x65, 0x2d, 0x6d, 0x61, 0x69, \n\t0x6c, 0x73, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x20, 0x3d, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, \n\t0x68, 0x6f, 0x73, 0x74, 0x22, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x50, 0x4f, 0x52, 0x54, 0x20, 0x3d, 0x20, 0x32, 0x35, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, \n\t0x48, 0x45, 0x4c, 0x4f, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, \n\t0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x6d, 0x61, 0x69, 0x6c, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x49, 0x66, 0x20, 0x77, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, \n\t0x20, 0x61, 0x20, 0x43, 0x47, 0x49, 0x2c, 0x20, 0x74, 0x72, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x65, 0x74, \n\t0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x20, 0x3d, 0x20, 0x6f, 0x73, 0x2e, 0x67, 0x65, 0x74, \n\t0x65, 0x6e, 0x76, 0x28, 0x22, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x22, 0x29, \n\t0x20, 0x6f, 0x72, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x22, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x7a, 0x6f, \n\t0x6e, 0x65, 0x20, 0x28, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x77, 0x65, 0x20, 0x64, 0x6f, 0x6e, 0x27, 0x74, \n\t0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x29, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x5a, 0x4f, 0x4e, 0x45, 0x20, 0x3d, 0x20, 0x22, 0x2d, 0x30, 0x30, 0x30, 0x30, 0x22, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x4c, 0x6f, 0x77, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x53, 0x4d, 0x54, 0x50, 0x20, \n\t0x41, 0x50, 0x49, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x5f, 0x5f, \n\t0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x20, 0x7d, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x67, 0x72, 0x65, 0x65, 0x74, 0x28, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x22, 0x32, 0x2e, 0x2e, 0x22, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x22, 0x45, 0x48, 0x4c, 0x4f, 0x22, 0x2c, \n\t0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x4d, 0x2e, 0x44, 0x4f, 0x4d, 0x41, \n\t0x49, 0x4e, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, \n\t0x73, 0x6b, 0x69, 0x70, 0x28, 0x31, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, \n\t0x65, 0x6c, 0x66, 0x2e, 0x74, 0x70, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x22, 0x32, 0x2e, 0x2e, 0x22, \n\t0x29, 0x29, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x6d, 0x61, 0x69, 0x6c, 0x28, 0x66, 0x72, 0x6f, 0x6d, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x22, 0x4d, 0x41, 0x49, 0x4c, 0x22, 0x2c, \n\t0x20, 0x22, 0x46, 0x52, 0x4f, 0x4d, 0x3a, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, \n\t0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x70, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x22, 0x32, \n\t0x2e, 0x2e, 0x22, 0x29, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x72, 0x63, 0x70, 0x74, 0x28, 0x74, 0x6f, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x22, 0x52, 0x43, 0x50, 0x54, 0x22, 0x2c, \n\t0x20, 0x22, 0x54, 0x4f, 0x3a, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, \n\t0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x70, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x22, 0x32, \n\t0x2e, 0x2e, 0x22, 0x29, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x64, 0x61, 0x74, 0x61, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x74, 0x65, \n\t0x70, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x22, 0x44, 0x41, 0x54, 0x41, 0x22, 0x29, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x22, 0x33, 0x2e, 0x2e, 0x22, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x74, 0x65, \n\t0x70, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x28, 0x22, 0x5c, 0x72, 0x5c, 0x6e, 0x2e, 0x5c, 0x72, 0x5c, 0x6e, \n\t0x22, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, \n\t0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x70, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x22, 0x32, \n\t0x2e, 0x2e, 0x22, 0x29, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x71, 0x75, 0x69, 0x74, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x22, 0x51, 0x55, 0x49, 0x54, 0x22, 0x29, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, \n\t0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x70, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x22, 0x32, \n\t0x2e, 0x2e, 0x22, 0x29, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x70, \n\t0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x28, 0x75, 0x73, 0x65, 0x72, 0x2c, 0x20, 0x70, \n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x22, 0x41, 0x55, 0x54, 0x48, 0x22, 0x2c, \n\t0x20, 0x22, 0x4c, 0x4f, 0x47, 0x49, 0x4e, 0x22, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x22, 0x33, 0x2e, 0x2e, 0x22, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x28, 0x6d, 0x69, 0x6d, 0x65, 0x2e, 0x62, 0x36, 0x34, 0x28, 0x75, \n\t0x73, 0x65, 0x72, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x72, 0x5c, 0x6e, 0x22, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x22, 0x33, 0x2e, 0x2e, 0x22, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x28, 0x6d, 0x69, 0x6d, 0x65, 0x2e, 0x62, 0x36, 0x34, 0x28, 0x70, \n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x72, 0x5c, 0x6e, 0x22, \n\t0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, \n\t0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x70, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x22, 0x32, \n\t0x2e, 0x2e, 0x22, 0x29, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x28, 0x75, 0x73, 0x65, 0x72, 0x2c, 0x20, 0x70, \n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x75, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x22, \n\t0x50, 0x4c, 0x41, 0x49, 0x4e, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6d, 0x69, 0x6d, 0x65, 0x2e, 0x62, 0x36, \n\t0x34, 0x28, 0x22, 0x5c, 0x30, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x2e, 0x2e, 0x20, \n\t0x22, 0x5c, 0x30, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x74, 0x70, 0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x22, 0x41, 0x55, 0x54, 0x48, 0x22, 0x2c, \n\t0x20, 0x61, 0x75, 0x74, 0x68, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, \n\t0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x70, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x22, 0x32, \n\t0x2e, 0x2e, 0x22, 0x29, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x61, 0x75, 0x74, 0x68, 0x28, 0x75, 0x73, 0x65, 0x72, 0x2c, 0x20, 0x70, 0x61, \n\t0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x65, 0x78, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x6f, 0x72, \n\t0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, \n\t0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, \n\t0x28, 0x65, 0x78, 0x74, 0x2c, 0x20, 0x22, 0x41, 0x55, 0x54, 0x48, 0x5b, 0x5e, 0x5c, 0x6e, 0x5d, 0x2b, 0x4c, \n\t0x4f, 0x47, 0x49, 0x4e, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, \n\t0x66, 0x3a, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x28, 0x75, 0x73, 0x65, 0x72, 0x2c, 0x20, 0x70, 0x61, 0x73, 0x73, \n\t0x77, 0x6f, 0x72, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, \n\t0x66, 0x69, 0x6e, 0x64, 0x28, 0x65, 0x78, 0x74, 0x2c, 0x20, 0x22, 0x41, 0x55, 0x54, 0x48, 0x5b, 0x5e, 0x5c, \n\t0x6e, 0x5d, 0x2b, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, \n\t0x66, 0x3a, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x28, 0x75, 0x73, 0x65, 0x72, 0x2c, 0x20, 0x70, 0x61, 0x73, 0x73, \n\t0x77, 0x6f, 0x72, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x6e, \n\t0x69, 0x6c, 0x2c, 0x20, 0x22, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, \n\t0x6e, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x6f, 0x72, \n\t0x20, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, \n\t0x6e, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x28, 0x6d, 0x61, 0x69, 0x6c, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6d, 0x61, 0x69, 0x6c, 0x28, 0x6d, 0x61, 0x69, 0x6c, \n\t0x74, 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6d, \n\t0x61, 0x69, 0x6c, 0x74, 0x2e, 0x72, 0x63, 0x70, 0x74, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, \n\t0x6c, 0x65, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x76, 0x20, 0x69, 0x6e, \n\t0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6d, 0x61, 0x69, 0x6c, 0x74, \n\t0x2e, 0x72, 0x63, 0x70, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x72, \n\t0x63, 0x70, 0x74, 0x28, 0x76, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x72, 0x63, 0x70, 0x74, 0x28, \n\t0x6d, 0x61, 0x69, 0x6c, 0x74, 0x2e, 0x72, 0x63, 0x70, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x64, 0x61, 0x74, 0x61, 0x28, 0x6c, 0x74, 0x6e, 0x31, \n\t0x32, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x28, 0x6d, 0x61, 0x69, \n\t0x6c, 0x74, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x6d, 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x74, \n\t0x75, 0x66, 0x66, 0x28, 0x29, 0x29, 0x2c, 0x20, 0x6d, 0x61, 0x69, 0x6c, 0x74, 0x2e, 0x73, 0x74, 0x65, 0x70, \n\t0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x73, \n\t0x65, 0x72, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x2c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, \n\t0x65, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x70, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, \n\t0x6b, 0x65, 0x74, 0x2e, 0x74, 0x72, 0x79, 0x28, 0x74, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, \n\t0x28, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x4d, 0x2e, 0x53, 0x45, 0x52, 0x56, \n\t0x45, 0x52, 0x2c, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x4d, 0x2e, 0x50, 0x4f, 0x52, \n\t0x54, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x4d, 0x2e, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, \n\t0x2c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x62, 0x61, 0x73, 0x65, \n\t0x2e, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x74, 0x70, 0x20, \n\t0x3d, 0x20, 0x74, 0x70, 0x7d, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x74, \n\t0x70, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x20, 0x69, 0x66, 0x20, 0x77, 0x65, 0x20, \n\t0x67, 0x65, 0x74, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x2e, 0x74, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, \n\t0x2e, 0x6e, 0x65, 0x77, 0x74, 0x72, 0x79, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, \n\t0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x77, \n\t0x65, 0x72, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x28, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x3d, 0x20, \n\t0x7b, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x62, 0x61, 0x73, \n\t0x65, 0x2e, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x72, \n\t0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x29, 0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5b, 0x73, 0x74, 0x72, 0x69, \n\t0x6e, 0x67, 0x2e, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x28, 0x69, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, \n\t0x67, 0x65, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x68, 0x6f, 0x70, 0x65, 0x66, \n\t0x75, 0x6c, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x6d, 0x69, 0x6d, 0x65, 0x20, 0x62, \n\t0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x71, 0x6e, 0x6f, 0x20, 0x3d, 0x20, 0x30, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x77, \n\t0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x71, 0x6e, 0x6f, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x71, 0x6e, 0x6f, 0x20, \n\t0x2b, 0x20, 0x31, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, \n\t0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x27, 0x25, 0x73, 0x25, 0x30, 0x35, 0x64, 0x3d, 0x3d, 0x25, 0x30, \n\t0x35, 0x75, 0x27, 0x2c, 0x20, 0x6f, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x65, 0x28, 0x27, 0x25, 0x64, 0x25, 0x6d, \n\t0x25, 0x59, 0x25, 0x48, 0x25, 0x4d, 0x25, 0x53, 0x27, 0x29, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, \n\t0x6d, 0x28, 0x30, 0x2c, 0x20, 0x39, 0x39, 0x39, 0x39, 0x39, 0x29, 0x2c, 0x20, 0x73, 0x65, 0x71, 0x6e, 0x6f, \n\t0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, \n\t0x72, 0x77, 0x61, 0x72, 0x64, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, \n\t0x72, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x61, 0x74, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x2c, 0x20, 0x69, 0x74, \n\t0x27, 0x73, 0x20, 0x66, 0x61, 0x73, 0x74, 0x65, 0x72, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x6e, \n\t0x64, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x28, 0x74, 0x6f, 0x73, 0x65, 0x6e, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x20, \n\t0x3d, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x72, 0x5c, \n\t0x6e, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x66, 0x2c, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x62, 0x61, 0x73, \n\t0x65, 0x2e, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x6f, 0x73, 0x65, 0x6e, 0x64, 0x29, 0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x61, 0x6e, 0x6f, 0x6e, \n\t0x69, 0x63, 0x5b, 0x66, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x27, 0x3a, 0x20, \n\t0x27, 0x20, 0x2e, 0x2e, 0x20, 0x76, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x72, 0x5c, 0x6e, 0x22, 0x20, 0x2e, \n\t0x2e, 0x20, 0x68, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, 0x79, 0x69, 0x65, 0x6c, \n\t0x64, 0x28, 0x68, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, \n\t0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x66, 0x72, 0x6f, 0x6d, \n\t0x20, 0x61, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, \n\t0x67, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x6e, \n\t0x64, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x28, 0x6d, 0x65, 0x73, 0x67, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x77, \n\t0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x6f, 0x75, 0x72, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, \n\t0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x64, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, \n\t0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, \n\t0x3d, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x28, 0x6d, 0x65, \n\t0x73, 0x67, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5b, 0x27, 0x63, 0x6f, 0x6e, 0x74, 0x65, \n\t0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, \n\t0x73, 0x5b, 0x27, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x27, 0x5d, 0x20, \n\t0x6f, 0x72, 0x20, 0x27, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x2f, 0x6d, 0x69, 0x78, 0x65, \n\t0x64, 0x27, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5b, 0x27, 0x63, 0x6f, 0x6e, 0x74, 0x65, \n\t0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, \n\t0x73, 0x5b, 0x27, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x27, 0x5d, 0x20, \n\t0x2e, 0x2e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x27, 0x3b, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, \n\t0x79, 0x3d, 0x22, 0x27, 0x20, 0x2e, 0x2e, 0x20, 0x20, 0x62, 0x64, 0x20, 0x2e, 0x2e, 0x20, 0x27, 0x22, 0x27, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x28, 0x68, \n\t0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x65, 0x61, 0x6d, 0x62, \n\t0x6c, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6d, 0x65, 0x73, 0x67, 0x74, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2e, \n\t0x70, 0x72, 0x65, 0x61, 0x6d, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, \n\t0x79, 0x69, 0x65, 0x6c, 0x64, 0x28, 0x6d, 0x65, 0x73, 0x67, 0x74, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x70, \n\t0x72, 0x65, 0x61, 0x6d, 0x62, 0x6c, 0x65, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, \n\t0x79, 0x69, 0x65, 0x6c, 0x64, 0x28, 0x22, 0x5c, 0x72, 0x5c, 0x6e, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x70, \n\t0x61, 0x72, 0x74, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, \n\t0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, 0x6d, 0x20, 0x69, 0x6e, 0x20, 0x62, 0x61, \n\t0x73, 0x65, 0x2e, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6d, 0x65, 0x73, 0x67, 0x74, 0x2e, 0x62, 0x6f, \n\t0x64, 0x79, 0x29, 0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, \n\t0x79, 0x69, 0x65, 0x6c, 0x64, 0x28, 0x22, 0x5c, 0x72, 0x5c, 0x6e, 0x2d, 0x2d, 0x22, 0x20, 0x2e, 0x2e, 0x20, \n\t0x62, 0x64, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x72, 0x5c, 0x6e, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, \n\t0x67, 0x65, 0x28, 0x6d, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x62, \n\t0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, 0x79, 0x69, 0x65, 0x6c, \n\t0x64, 0x28, 0x22, 0x5c, 0x72, 0x5c, 0x6e, 0x2d, 0x2d, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x62, 0x64, 0x20, 0x2e, \n\t0x2e, 0x20, 0x22, 0x2d, 0x2d, 0x5c, 0x72, 0x5c, 0x6e, 0x5c, 0x72, 0x5c, 0x6e, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x65, 0x70, 0x69, 0x6c, 0x6f, 0x67, \n\t0x75, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6d, 0x65, 0x73, 0x67, 0x74, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2e, \n\t0x65, 0x70, 0x69, 0x6c, 0x6f, 0x67, 0x75, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, \n\t0x79, 0x69, 0x65, 0x6c, 0x64, 0x28, 0x6d, 0x65, 0x73, 0x67, 0x74, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x65, \n\t0x70, 0x69, 0x6c, 0x6f, 0x67, 0x75, 0x65, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, \n\t0x79, 0x69, 0x65, 0x6c, 0x64, 0x28, 0x22, 0x5c, 0x72, 0x5c, 0x6e, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x62, \n\t0x6f, 0x64, 0x79, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x6e, \n\t0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x6d, 0x65, 0x73, 0x67, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x77, \n\t0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, \n\t0x79, 0x70, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, \n\t0x3d, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x28, 0x6d, 0x65, \n\t0x73, 0x67, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5b, 0x27, 0x63, 0x6f, 0x6e, 0x74, 0x65, \n\t0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, \n\t0x73, 0x5b, 0x27, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x27, 0x5d, 0x20, \n\t0x6f, 0x72, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x27, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69, \n\t0x6e, 0x3b, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x69, 0x73, 0x6f, 0x2d, 0x38, 0x38, \n\t0x35, 0x39, 0x2d, 0x31, 0x22, 0x27, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x28, 0x68, \n\t0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x66, \n\t0x72, 0x6f, 0x6d, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, \n\t0x6b, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x67, 0x74, 0x2e, 0x62, 0x6f, 0x64, \n\t0x79, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x65, 0x72, 0x72, 0x20, 0x74, 0x68, 0x65, \n\t0x6e, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x28, \n\t0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x63, 0x68, 0x75, \n\t0x6e, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, \n\t0x79, 0x69, 0x65, 0x6c, 0x64, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, \n\t0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x62, \n\t0x6f, 0x64, 0x79, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x6e, \n\t0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6d, 0x65, 0x73, 0x67, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x77, \n\t0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, \n\t0x79, 0x70, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, \n\t0x3d, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x28, 0x6d, 0x65, \n\t0x73, 0x67, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5b, 0x27, 0x63, 0x6f, 0x6e, 0x74, 0x65, \n\t0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, \n\t0x73, 0x5b, 0x27, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x27, 0x5d, 0x20, \n\t0x6f, 0x72, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x27, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69, \n\t0x6e, 0x3b, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x69, 0x73, 0x6f, 0x2d, 0x38, 0x38, \n\t0x35, 0x39, 0x2d, 0x31, 0x22, 0x27, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x28, 0x68, \n\t0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x66, \n\t0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, 0x79, 0x69, 0x65, 0x6c, \n\t0x64, 0x28, 0x6d, 0x65, 0x73, 0x67, 0x74, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, \n\t0x61, 0x67, 0x65, 0x28, 0x6d, 0x65, 0x73, 0x67, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6d, \n\t0x65, 0x73, 0x67, 0x74, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, \n\t0x6c, 0x65, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x75, 0x6c, 0x74, \n\t0x69, 0x70, 0x61, 0x72, 0x74, 0x28, 0x6d, 0x65, 0x73, 0x67, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x74, 0x79, \n\t0x70, 0x65, 0x28, 0x6d, 0x65, 0x73, 0x67, 0x74, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x20, 0x3d, 0x3d, 0x20, \n\t0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x73, 0x65, \n\t0x6e, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x6d, 0x65, 0x73, 0x67, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, \n\t0x6e, 0x67, 0x28, 0x6d, 0x65, 0x73, 0x67, 0x74, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x73, 0x65, 0x74, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x20, 0x68, 0x65, 0x61, 0x64, \n\t0x65, 0x72, 0x73, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x6a, \n\t0x75, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x28, 0x6d, 0x65, 0x73, 0x67, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x3d, 0x20, \n\t0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x28, 0x6d, 0x65, 0x73, 0x67, \n\t0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5b, 0x22, 0x64, 0x61, 0x74, 0x65, 0x22, 0x5d, 0x20, \n\t0x3d, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5b, 0x22, 0x64, 0x61, 0x74, 0x65, 0x22, 0x5d, 0x20, 0x6f, 0x72, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x65, 0x28, 0x22, 0x21, \n\t0x25, 0x61, 0x2c, 0x20, 0x25, 0x64, 0x20, 0x25, 0x62, 0x20, 0x25, 0x59, 0x20, 0x25, 0x48, 0x3a, 0x25, 0x4d, \n\t0x3a, 0x25, 0x53, 0x20, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x28, 0x6d, 0x65, 0x73, 0x67, 0x74, 0x2e, 0x7a, \n\t0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x4d, 0x2e, 0x5a, 0x4f, 0x4e, 0x45, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5b, 0x22, 0x78, 0x2d, 0x6d, 0x61, 0x69, 0x6c, 0x65, \n\t0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5b, 0x22, 0x78, 0x2d, 0x6d, 0x61, 0x69, \n\t0x6c, 0x65, 0x72, 0x22, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x5f, 0x56, \n\t0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x27, 0x74, 0x20, \n\t0x62, 0x65, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x69, 0x6d, 0x65, 0x2d, 0x76, 0x65, \n\t0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x31, 0x2e, 0x30, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, \n\t0x65, 0x28, 0x6d, 0x65, 0x73, 0x67, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6d, 0x65, 0x73, 0x67, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, \n\t0x3d, 0x20, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x28, 0x6d, \n\t0x65, 0x73, 0x67, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, \n\t0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x73, 0x6f, 0x75, \n\t0x72, 0x63, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, \n\t0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, \n\t0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, \n\t0x65, 0x28, 0x6d, 0x65, 0x73, 0x67, 0x74, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, \n\t0x6e, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x2c, \n\t0x20, 0x61, 0x2c, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, \n\t0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x28, 0x63, 0x6f, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x72, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, \n\t0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x2c, 0x20, 0x62, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, \n\t0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x61, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x48, 0x69, 0x67, 0x68, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x53, 0x4d, 0x54, 0x50, \n\t0x20, 0x41, 0x50, 0x49, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x70, \n\t0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6d, 0x61, \n\t0x69, 0x6c, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x4d, 0x2e, 0x6f, \n\t0x70, 0x65, 0x6e, 0x28, 0x6d, 0x61, 0x69, 0x6c, 0x74, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2c, 0x20, \n\t0x6d, 0x61, 0x69, 0x6c, 0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x2c, 0x20, 0x6d, 0x61, 0x69, 0x6c, 0x74, 0x2e, \n\t0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x3a, \n\t0x67, 0x72, 0x65, 0x65, 0x74, 0x28, 0x6d, 0x61, 0x69, 0x6c, 0x74, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x3a, 0x61, 0x75, 0x74, 0x68, 0x28, 0x6d, 0x61, 0x69, 0x6c, 0x74, 0x2e, 0x75, \n\t0x73, 0x65, 0x72, 0x2c, 0x20, 0x6d, 0x61, 0x69, 0x6c, 0x74, 0x2e, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, \n\t0x64, 0x2c, 0x20, 0x65, 0x78, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x28, 0x6d, 0x61, 0x69, 0x6c, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x3a, 0x71, 0x75, 0x69, 0x74, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, \n\t0x28, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x29, 0x0a,\n\t0x0a,\n\t0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x4d, 0x0a,\n}; // [smtp.lua]\n} // love\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/socket.h",
    "content": "#ifndef SOCKET_H\n#define SOCKET_H\n/*=========================================================================*\\\n* Socket compatibilization module\n* LuaSocket toolkit\n*\n* BSD Sockets and WinSock are similar, but there are a few irritating\n* differences. Also, not all *nix platforms behave the same. This module\n* (and the associated usocket.h and wsocket.h) factor these differences and\n* creates a interface compatible with the io.h module.\n\\*=========================================================================*/\n#include \"io.h\"\n\n/*=========================================================================*\\\n* Platform specific compatibilization\n\\*=========================================================================*/\n#ifdef _WIN32\n#include \"wsocket.h\"\n#define LUA_GAI_STRERROR gai_strerrorA\n#else\n#include \"usocket.h\"\n#define LUA_GAI_STRERROR gai_strerror\n#endif\n\n/*=========================================================================*\\\n* The connect and accept functions accept a timeout and their\n* implementations are somewhat complicated. We chose to move\n* the timeout control into this module for these functions in\n* order to simplify the modules that use them. \n\\*=========================================================================*/\n#include \"timeout.h\"\n\n/* convenient shorthand */\ntypedef struct sockaddr SA;\n\n/*=========================================================================*\\\n* Functions bellow implement a comfortable platform independent \n* interface to sockets\n\\*=========================================================================*/\n\n#ifndef _WIN32\n#pragma GCC visibility push(hidden)\n#endif\n\nint socket_waitfd(p_socket ps, int sw, p_timeout tm);\nint socket_open(void);\nint socket_close(void);\nvoid socket_destroy(p_socket ps);\nint socket_select(t_socket n, fd_set *rfds, fd_set *wfds, fd_set *efds, p_timeout tm);\nint socket_create(p_socket ps, int domain, int type, int protocol);\nint socket_bind(p_socket ps, SA *addr, socklen_t addr_len); \nint socket_listen(p_socket ps, int backlog);\nvoid socket_shutdown(p_socket ps, int how); \nint socket_connect(p_socket ps, SA *addr, socklen_t addr_len, p_timeout tm); \nint socket_accept(p_socket ps, p_socket pa, SA *addr, socklen_t *addr_len, p_timeout tm);\nint socket_send(p_socket ps, const char *data, size_t count, size_t *sent, p_timeout tm);\nint socket_sendto(p_socket ps, const char *data, size_t count, size_t *sent, SA *addr, socklen_t addr_len, p_timeout tm);\nint socket_recv(p_socket ps, char *data, size_t count, size_t *got, p_timeout tm);\nint socket_recvfrom(p_socket ps, char *data, size_t count, size_t *got, SA *addr, socklen_t *addr_len, p_timeout tm);\nint socket_write(p_socket ps, const char *data, size_t count, size_t *sent, p_timeout tm);\nint socket_read(p_socket ps, char *data, size_t count, size_t *got, p_timeout tm);\nvoid socket_setblocking(p_socket ps);\nvoid socket_setnonblocking(p_socket ps);\nint socket_gethostbyaddr(const char *addr, socklen_t len, struct hostent **hp);\nint socket_gethostbyname(const char *addr, struct hostent **hp);\nconst char *socket_hoststrerror(int err);\nconst char *socket_strerror(int err);\nconst char *socket_ioerror(p_socket ps, int err);\nconst char *socket_gaistrerror(int err);\n\n#ifndef _WIN32\n#pragma GCC visibility pop\n#endif\n\n#endif /* SOCKET_H */\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/socket.lua",
    "content": "-----------------------------------------------------------------------------\n-- LuaSocket helper module\n-- Author: Diego Nehab\n-----------------------------------------------------------------------------\n\n-----------------------------------------------------------------------------\n-- Declare module and import dependencies\n-----------------------------------------------------------------------------\nlocal base = _G\nlocal string = require(\"string\")\nlocal math = require(\"math\")\nlocal socket = require(\"socket.core\")\n\nlocal _M = socket\n\n-----------------------------------------------------------------------------\n-- Exported auxiliar functions\n-----------------------------------------------------------------------------\nfunction _M.connect4(address, port, laddress, lport)\n    return socket.connect(address, port, laddress, lport, \"inet\")\nend\n\nfunction _M.connect6(address, port, laddress, lport)\n    return socket.connect(address, port, laddress, lport, \"inet6\")\nend\n\nfunction _M.bind(host, port, backlog)\n    if host == \"*\" then host = \"0.0.0.0\" end\n    local addrinfo, err = socket.dns.getaddrinfo(host);\n    if not addrinfo then return nil, err end\n    local sock, res\n    err = \"no info on address\"\n    for i, alt in base.ipairs(addrinfo) do\n        if alt.family == \"inet\" then\n            sock, err = socket.tcp4()\n        else\n            sock, err = socket.tcp6()\n        end\n        if not sock then return nil, err end\n        sock:setoption(\"reuseaddr\", true)\n        res, err = sock:bind(alt.addr, port)\n        if not res then\n            sock:close()\n        else\n            res, err = sock:listen(backlog)\n            if not res then\n                sock:close()\n            else\n                return sock\n            end\n        end\n    end\n    return nil, err\nend\n\n_M.try = _M.newtry()\n\nfunction _M.choose(table)\n    return function(name, opt1, opt2)\n        if base.type(name) ~= \"string\" then\n            name, opt1, opt2 = \"default\", name, opt1\n        end\n        local f = table[name or \"nil\"]\n        if not f then base.error(\"unknown key (\".. base.tostring(name) ..\")\", 3)\n        else return f(opt1, opt2) end\n    end\nend\n\n-----------------------------------------------------------------------------\n-- Socket sources and sinks, conforming to LTN12\n-----------------------------------------------------------------------------\n-- create namespaces inside LuaSocket namespace\nlocal sourcet, sinkt = {}, {}\n_M.sourcet = sourcet\n_M.sinkt = sinkt\n\n_M.BLOCKSIZE = 2048\n\nsinkt[\"close-when-done\"] = function(sock)\n    return base.setmetatable({\n        getfd = function() return sock:getfd() end,\n        dirty = function() return sock:dirty() end\n    }, {\n        __call = function(self, chunk, err)\n            if not chunk then\n                sock:close()\n                return 1\n            else return sock:send(chunk) end\n        end\n    })\nend\n\nsinkt[\"keep-open\"] = function(sock)\n    return base.setmetatable({\n        getfd = function() return sock:getfd() end,\n        dirty = function() return sock:dirty() end\n    }, {\n        __call = function(self, chunk, err)\n            if chunk then return sock:send(chunk)\n            else return 1 end\n        end\n    })\nend\n\nsinkt[\"default\"] = sinkt[\"keep-open\"]\n\n_M.sink = _M.choose(sinkt)\n\nsourcet[\"by-length\"] = function(sock, length)\n    return base.setmetatable({\n        getfd = function() return sock:getfd() end,\n        dirty = function() return sock:dirty() end\n    }, {\n        __call = function()\n            if length <= 0 then return nil end\n            local size = math.min(socket.BLOCKSIZE, length)\n            local chunk, err = sock:receive(size)\n            if err then return nil, err end\n            length = length - string.len(chunk)\n            return chunk\n        end\n    })\nend\n\nsourcet[\"until-closed\"] = function(sock)\n    local done\n    return base.setmetatable({\n        getfd = function() return sock:getfd() end,\n        dirty = function() return sock:dirty() end\n    }, {\n        __call = function()\n            if done then return nil end\n            local chunk, err, partial = sock:receive(socket.BLOCKSIZE)\n            if not err then return chunk\n            elseif err == \"closed\" then\n                sock:close()\n                done = 1\n                return partial\n            else return nil, err end\n        end\n    })\nend\n\n\nsourcet[\"default\"] = sourcet[\"until-closed\"]\n\n_M.source = _M.choose(sourcet)\n\nreturn _M\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/socket.lua.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n * \n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n * \n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n * \n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\nnamespace love\n{\n\n// [socket.lua]\nconst unsigned char socket_lua[] = \n{\n\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x4c, 0x75, 0x61, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x68, 0x65, 0x6c, 0x70, 0x65, \n\t0x72, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x3a, 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x20, 0x4e, \n\t0x65, 0x68, 0x61, 0x62, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, \n\t0x61, 0x6e, 0x64, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, \n\t0x6e, 0x63, 0x69, 0x65, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x47, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, \n\t0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, \n\t0x72, 0x65, 0x28, 0x22, 0x6d, 0x61, 0x74, 0x68, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, \n\t0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x22, \n\t0x29, 0x0a,\n\t0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x4d, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x61, 0x75, 0x78, 0x69, 0x6c, 0x69, \n\t0x61, 0x72, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, \n\t0x74, 0x34, 0x28, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x2c, 0x20, \n\t0x6c, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x6c, 0x70, 0x6f, 0x72, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, \n\t0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x28, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x70, \n\t0x6f, 0x72, 0x74, 0x2c, 0x20, 0x6c, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x6c, 0x70, 0x6f, \n\t0x72, 0x74, 0x2c, 0x20, 0x22, 0x69, 0x6e, 0x65, 0x74, 0x22, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, \n\t0x74, 0x36, 0x28, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x2c, 0x20, \n\t0x6c, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x6c, 0x70, 0x6f, 0x72, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, \n\t0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x28, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x70, \n\t0x6f, 0x72, 0x74, 0x2c, 0x20, 0x6c, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x6c, 0x70, 0x6f, \n\t0x72, 0x74, 0x2c, 0x20, 0x22, 0x69, 0x6e, 0x65, 0x74, 0x36, 0x22, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x68, \n\t0x6f, 0x73, 0x74, 0x2c, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x2c, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x6c, 0x6f, 0x67, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x2a, 0x22, \n\t0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x22, 0x30, 0x2e, 0x30, 0x2e, \n\t0x30, 0x2e, 0x30, 0x22, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x72, 0x69, 0x6e, 0x66, 0x6f, \n\t0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x64, 0x6e, 0x73, \n\t0x2e, 0x67, 0x65, 0x74, 0x61, 0x64, 0x64, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x28, 0x68, 0x6f, 0x73, 0x74, 0x29, \n\t0x3b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x69, 0x6e, 0x66, \n\t0x6f, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, \n\t0x20, 0x65, 0x72, 0x72, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x72, 0x65, \n\t0x73, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x6e, 0x6f, 0x20, 0x69, 0x6e, 0x66, 0x6f, \n\t0x20, 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, 0x61, 0x6c, 0x74, 0x20, 0x69, 0x6e, 0x20, \n\t0x62, 0x61, 0x73, 0x65, 0x2e, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x61, 0x64, 0x64, 0x72, 0x69, 0x6e, \n\t0x66, 0x6f, 0x29, 0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x61, 0x6c, 0x74, 0x2e, 0x66, 0x61, 0x6d, \n\t0x69, 0x6c, 0x79, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x69, 0x6e, 0x65, 0x74, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x2c, 0x20, \n\t0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x74, 0x63, 0x70, 0x34, 0x28, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x2c, 0x20, \n\t0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x74, 0x63, 0x70, 0x36, 0x28, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x6f, 0x63, \n\t0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, \n\t0x20, 0x65, 0x72, 0x72, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x3a, 0x73, 0x65, 0x74, 0x6f, 0x70, \n\t0x74, 0x69, 0x6f, 0x6e, 0x28, 0x22, 0x72, 0x65, 0x75, 0x73, 0x65, 0x61, 0x64, 0x64, 0x72, 0x22, 0x2c, 0x20, \n\t0x74, 0x72, 0x75, 0x65, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, \n\t0x20, 0x73, 0x6f, 0x63, 0x6b, 0x3a, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x61, 0x6c, 0x74, 0x2e, 0x61, 0x64, 0x64, \n\t0x72, 0x2c, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x73, \n\t0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x3a, 0x63, \n\t0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x2c, 0x20, 0x65, \n\t0x72, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x3a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x28, 0x62, \n\t0x61, 0x63, 0x6b, 0x6c, 0x6f, 0x67, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, \n\t0x20, 0x72, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, \n\t0x63, 0x6b, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, \n\t0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x65, 0x72, \n\t0x72, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x5f, 0x4d, 0x2e, 0x74, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x4d, 0x2e, 0x6e, 0x65, 0x77, 0x74, 0x72, 0x79, \n\t0x28, 0x29, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x63, 0x68, 0x6f, 0x6f, 0x73, 0x65, \n\t0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, \n\t0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x31, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x32, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x74, 0x79, \n\t0x70, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, \n\t0x67, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, \n\t0x6f, 0x70, 0x74, 0x31, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x32, 0x20, 0x3d, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, \n\t0x75, 0x6c, 0x74, 0x22, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x31, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, \n\t0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x6e, 0x69, 0x6c, \n\t0x22, 0x5d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x20, 0x74, \n\t0x68, 0x65, 0x6e, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x75, 0x6e, \n\t0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x28, 0x22, 0x2e, 0x2e, 0x20, 0x62, 0x61, 0x73, \n\t0x65, 0x2e, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x2e, \n\t0x2e, 0x22, 0x29, 0x22, 0x2c, 0x20, 0x33, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, \n\t0x6e, 0x20, 0x66, 0x28, 0x6f, 0x70, 0x74, 0x31, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x32, 0x29, 0x20, 0x65, 0x6e, \n\t0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, \n\t0x61, 0x6e, 0x64, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, \n\t0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x4c, 0x54, 0x4e, 0x31, 0x32, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, \n\t0x65, 0x73, 0x20, 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x20, 0x4c, 0x75, 0x61, 0x53, 0x6f, 0x63, 0x6b, 0x65, \n\t0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x74, 0x2c, 0x20, 0x73, 0x69, 0x6e, \n\t0x6b, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, \n\t0x65, 0x74, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x73, 0x69, 0x6e, 0x6b, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x74, 0x0a,\n\t0x0a,\n\t0x5f, 0x4d, 0x2e, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x53, 0x49, 0x5a, 0x45, 0x20, 0x3d, 0x20, 0x32, 0x30, 0x34, \n\t0x38, 0x0a,\n\t0x0a,\n\t0x73, 0x69, 0x6e, 0x6b, 0x74, 0x5b, 0x22, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x2d, 0x77, 0x68, 0x65, 0x6e, 0x2d, \n\t0x64, 0x6f, 0x6e, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, \n\t0x73, 0x6f, 0x63, 0x6b, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x73, 0x65, \n\t0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, \n\t0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, \n\t0x63, 0x6b, 0x3a, 0x67, 0x65, 0x74, 0x66, 0x64, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x72, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x66, 0x75, \n\t0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, \n\t0x63, 0x6b, 0x3a, 0x64, 0x69, 0x72, 0x74, 0x79, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, \n\t0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, \n\t0x6b, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, \n\t0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, \n\t0x63, 0x6b, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, \n\t0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, \n\t0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x28, 0x63, 0x68, \n\t0x75, 0x6e, 0x6b, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x73, 0x69, 0x6e, 0x6b, 0x74, 0x5b, 0x22, 0x6b, 0x65, 0x65, 0x70, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x22, 0x5d, \n\t0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x6f, 0x63, 0x6b, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x73, 0x65, \n\t0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, \n\t0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, \n\t0x63, 0x6b, 0x3a, 0x67, 0x65, 0x74, 0x66, 0x64, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x72, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x66, 0x75, \n\t0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, \n\t0x63, 0x6b, 0x3a, 0x64, 0x69, 0x72, 0x74, 0x79, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, \n\t0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, \n\t0x6b, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x68, 0x75, \n\t0x6e, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, 0x63, \n\t0x6b, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, \n\t0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x73, 0x69, 0x6e, 0x6b, 0x74, 0x5b, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x5d, 0x20, 0x3d, \n\t0x20, 0x73, 0x69, 0x6e, 0x6b, 0x74, 0x5b, 0x22, 0x6b, 0x65, 0x65, 0x70, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x22, \n\t0x5d, 0x0a,\n\t0x0a,\n\t0x5f, 0x4d, 0x2e, 0x73, 0x69, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x5f, 0x4d, 0x2e, 0x63, 0x68, 0x6f, 0x6f, 0x73, \n\t0x65, 0x28, 0x73, 0x69, 0x6e, 0x6b, 0x74, 0x29, 0x0a,\n\t0x0a,\n\t0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x74, 0x5b, 0x22, 0x62, 0x79, 0x2d, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, \n\t0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x6f, 0x63, 0x6b, \n\t0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x73, 0x65, \n\t0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, \n\t0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, \n\t0x63, 0x6b, 0x3a, 0x67, 0x65, 0x74, 0x66, 0x64, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x72, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x66, 0x75, \n\t0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, \n\t0x63, 0x6b, 0x3a, 0x64, 0x69, 0x72, 0x74, 0x79, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, \n\t0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x65, 0x6e, \n\t0x67, 0x74, 0x68, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, \n\t0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, \n\t0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x73, 0x6f, \n\t0x63, 0x6b, 0x65, 0x74, 0x2e, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x53, 0x49, 0x5a, 0x45, 0x2c, 0x20, 0x6c, 0x65, \n\t0x6e, 0x67, 0x74, 0x68, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, \n\t0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x3a, \n\t0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x65, 0x72, 0x72, \n\t0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, \n\t0x65, 0x72, 0x72, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, \n\t0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, \n\t0x2e, 0x6c, 0x65, 0x6e, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, \n\t0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x74, 0x5b, 0x22, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x2d, 0x63, 0x6c, 0x6f, \n\t0x73, 0x65, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, \n\t0x6f, 0x63, 0x6b, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x73, 0x65, \n\t0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, \n\t0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, \n\t0x63, 0x6b, 0x3a, 0x67, 0x65, 0x74, 0x66, 0x64, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x72, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x66, 0x75, \n\t0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, \n\t0x63, 0x6b, 0x3a, 0x64, 0x69, 0x72, 0x74, 0x79, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, \n\t0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x64, 0x6f, 0x6e, \n\t0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x20, \n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, \n\t0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, \n\t0x6c, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x28, 0x73, \n\t0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x53, 0x49, 0x5a, 0x45, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, \n\t0x20, 0x65, 0x72, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, \n\t0x68, 0x75, 0x6e, 0x6b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, \n\t0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x22, 0x20, 0x74, \n\t0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, \n\t0x63, 0x6b, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, \n\t0x6e, 0x65, 0x20, 0x3d, 0x20, 0x31, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, \n\t0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, \n\t0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x0a,\n\t0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x74, 0x5b, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x5d, \n\t0x20, 0x3d, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x74, 0x5b, 0x22, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x2d, \n\t0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x22, 0x5d, 0x0a,\n\t0x0a,\n\t0x5f, 0x4d, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x4d, 0x2e, 0x63, 0x68, 0x6f, \n\t0x6f, 0x73, 0x65, 0x28, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x74, 0x29, 0x0a,\n\t0x0a,\n\t0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x4d, 0x0a,\n}; // [socket.lua]\n} // love\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/tcp.c",
    "content": "/*=========================================================================*\\\n* TCP object\n* LuaSocket toolkit\n\\*=========================================================================*/\n#include \"luasocket.h\"\n\n#include \"auxiliar.h\"\n#include \"socket.h\"\n#include \"inet.h\"\n#include \"options.h\"\n#include \"tcp.h\"\n\n#include <string.h>\n\n/*=========================================================================*\\\n* Internal function prototypes\n\\*=========================================================================*/\nstatic int global_create(lua_State *L);\nstatic int global_create4(lua_State *L);\nstatic int global_create6(lua_State *L);\nstatic int global_connect(lua_State *L);\nstatic int meth_connect(lua_State *L);\nstatic int meth_listen(lua_State *L);\nstatic int meth_getfamily(lua_State *L);\nstatic int meth_bind(lua_State *L);\nstatic int meth_send(lua_State *L);\nstatic int meth_getstats(lua_State *L);\nstatic int meth_setstats(lua_State *L);\nstatic int meth_getsockname(lua_State *L);\nstatic int meth_getpeername(lua_State *L);\nstatic int meth_shutdown(lua_State *L);\nstatic int meth_receive(lua_State *L);\nstatic int meth_accept(lua_State *L);\nstatic int meth_close(lua_State *L);\nstatic int meth_getoption(lua_State *L);\nstatic int meth_setoption(lua_State *L);\nstatic int meth_gettimeout(lua_State *L);\nstatic int meth_settimeout(lua_State *L);\nstatic int meth_getfd(lua_State *L);\nstatic int meth_setfd(lua_State *L);\nstatic int meth_dirty(lua_State *L);\n\n/* tcp object methods */\nstatic luaL_Reg tcp_methods[] = {\n    {\"__gc\",        meth_close},\n    {\"__tostring\",  auxiliar_tostring},\n    {\"accept\",      meth_accept},\n    {\"bind\",        meth_bind},\n    {\"close\",       meth_close},\n    {\"connect\",     meth_connect},\n    {\"dirty\",       meth_dirty},\n    {\"getfamily\",   meth_getfamily},\n    {\"getfd\",       meth_getfd},\n    {\"getoption\",   meth_getoption},\n    {\"getpeername\", meth_getpeername},\n    {\"getsockname\", meth_getsockname},\n    {\"getstats\",    meth_getstats},\n    {\"setstats\",    meth_setstats},\n    {\"listen\",      meth_listen},\n    {\"receive\",     meth_receive},\n    {\"send\",        meth_send},\n    {\"setfd\",       meth_setfd},\n    {\"setoption\",   meth_setoption},\n    {\"setpeername\", meth_connect},\n    {\"setsockname\", meth_bind},\n    {\"settimeout\",  meth_settimeout},\n    {\"gettimeout\",  meth_gettimeout},\n    {\"shutdown\",    meth_shutdown},\n    {NULL,          NULL}\n};\n\n/* socket option handlers */\nstatic t_opt optget[] = {\n    {\"bindtodevice\", opt_get_bindtodevice},\n    {\"keepalive\",   opt_get_keepalive},\n    {\"reuseaddr\",   opt_get_reuseaddr},\n    {\"reuseport\",   opt_get_reuseport},\n    {\"tcp-nodelay\", opt_get_tcp_nodelay},\n#ifdef TCP_KEEPIDLE\n    {\"tcp-keepidle\", opt_get_tcp_keepidle},\n#endif\n#ifdef TCP_KEEPCNT\n    {\"tcp-keepcnt\", opt_get_tcp_keepcnt},\n#endif\n#ifdef TCP_KEEPINTVL\n    {\"tcp-keepintvl\", opt_get_tcp_keepintvl},\n#endif\n    {\"linger\",      opt_get_linger},\n    {\"error\",       opt_get_error},\n\t{\"recv-buffer-size\",     opt_get_recv_buf_size},\n\t{\"send-buffer-size\",     opt_get_send_buf_size},\n    {NULL,          NULL}\n};\n\nstatic t_opt optset[] = {\n    {\"bindtodevice\", opt_set_bindtodevice},\n    {\"keepalive\",   opt_set_keepalive},\n    {\"reuseaddr\",   opt_set_reuseaddr},\n    {\"reuseport\",   opt_set_reuseport},\n    {\"tcp-nodelay\", opt_set_tcp_nodelay},\n#ifdef TCP_KEEPIDLE\n    {\"tcp-keepidle\", opt_set_tcp_keepidle},\n#endif\n#ifdef TCP_KEEPCNT\n    {\"tcp-keepcnt\", opt_set_tcp_keepcnt},\n#endif\n#ifdef TCP_KEEPINTVL\n    {\"tcp-keepintvl\", opt_set_tcp_keepintvl},\n#endif\n    {\"ipv6-v6only\", opt_set_ip6_v6only},\n    {\"linger\",      opt_set_linger},\n\t{\"recv-buffer-size\",     opt_set_recv_buf_size},\n\t{\"send-buffer-size\",     opt_set_send_buf_size},\n#ifdef TCP_DEFER_ACCEPT\n    {\"tcp-defer-accept\", opt_set_tcp_defer_accept},\n#endif\n#ifdef TCP_FASTOPEN\n    {\"tcp-fastopen\", opt_set_tcp_fastopen},\n#endif\n#ifdef TCP_FASTOPEN_CONNECT\n    {\"tcp-fastopen-connect\", opt_set_tcp_fastopen_connect},\n#endif\n    {NULL,          NULL}\n};\n\n/* functions in library namespace */\nstatic luaL_Reg func[] = {\n    {\"tcp\", global_create},\n    {\"tcp4\", global_create4},\n    {\"tcp6\", global_create6},\n    {\"connect\", global_connect},\n    {NULL, NULL}\n};\n\n/*-------------------------------------------------------------------------*\\\n* Initializes module\n\\*-------------------------------------------------------------------------*/\nint tcp_open(lua_State *L)\n{\n    /* create classes */\n    auxiliar_newclass(L, \"tcp{master}\", tcp_methods);\n    auxiliar_newclass(L, \"tcp{client}\", tcp_methods);\n    auxiliar_newclass(L, \"tcp{server}\", tcp_methods);\n    /* create class groups */\n    auxiliar_add2group(L, \"tcp{master}\", \"tcp{any}\");\n    auxiliar_add2group(L, \"tcp{client}\", \"tcp{any}\");\n    auxiliar_add2group(L, \"tcp{server}\", \"tcp{any}\");\n    /* define library functions */\n    luaL_setfuncs(L, func, 0);\n    return 0;\n}\n\n/*=========================================================================*\\\n* Lua methods\n\\*=========================================================================*/\n/*-------------------------------------------------------------------------*\\\n* Just call buffered IO methods\n\\*-------------------------------------------------------------------------*/\nstatic int meth_send(lua_State *L) {\n    p_tcp tcp = (p_tcp) auxiliar_checkclass(L, \"tcp{client}\", 1);\n    return buffer_meth_send(L, &tcp->buf);\n}\n\nstatic int meth_receive(lua_State *L) {\n    p_tcp tcp = (p_tcp) auxiliar_checkclass(L, \"tcp{client}\", 1);\n    return buffer_meth_receive(L, &tcp->buf);\n}\n\nstatic int meth_getstats(lua_State *L) {\n    p_tcp tcp = (p_tcp) auxiliar_checkclass(L, \"tcp{client}\", 1);\n    return buffer_meth_getstats(L, &tcp->buf);\n}\n\nstatic int meth_setstats(lua_State *L) {\n    p_tcp tcp = (p_tcp) auxiliar_checkclass(L, \"tcp{client}\", 1);\n    return buffer_meth_setstats(L, &tcp->buf);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Just call option handler\n\\*-------------------------------------------------------------------------*/\nstatic int meth_getoption(lua_State *L)\n{\n    p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, \"tcp{any}\", 1);\n    return opt_meth_getoption(L, optget, &tcp->sock);\n}\n\nstatic int meth_setoption(lua_State *L)\n{\n    p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, \"tcp{any}\", 1);\n    return opt_meth_setoption(L, optset, &tcp->sock);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Select support methods\n\\*-------------------------------------------------------------------------*/\nstatic int meth_getfd(lua_State *L)\n{\n    p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, \"tcp{any}\", 1);\n    lua_pushnumber(L, (int) tcp->sock);\n    return 1;\n}\n\n/* this is very dangerous, but can be handy for those that are brave enough */\nstatic int meth_setfd(lua_State *L)\n{\n    p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, \"tcp{any}\", 1);\n    tcp->sock = (t_socket) luaL_checknumber(L, 2);\n    return 0;\n}\n\nstatic int meth_dirty(lua_State *L)\n{\n    p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, \"tcp{any}\", 1);\n    lua_pushboolean(L, !buffer_isempty(&tcp->buf));\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Waits for and returns a client object attempting connection to the\n* server object\n\\*-------------------------------------------------------------------------*/\nstatic int meth_accept(lua_State *L)\n{\n    p_tcp server = (p_tcp) auxiliar_checkclass(L, \"tcp{server}\", 1);\n    p_timeout tm = timeout_markstart(&server->tm);\n    t_socket sock;\n    const char *err = inet_tryaccept(&server->sock, server->family, &sock, tm);\n    /* if successful, push client socket */\n    if (err == NULL) {\n        p_tcp clnt = (p_tcp) lua_newuserdata(L, sizeof(t_tcp));\n        auxiliar_setclass(L, \"tcp{client}\", -1);\n        /* initialize structure fields */\n        memset(clnt, 0, sizeof(t_tcp));\n        socket_setnonblocking(&sock);\n        clnt->sock = sock;\n        io_init(&clnt->io, (p_send) socket_send, (p_recv) socket_recv,\n                (p_error) socket_ioerror, &clnt->sock);\n        timeout_init(&clnt->tm, -1, -1);\n        buffer_init(&clnt->buf, &clnt->io, &clnt->tm);\n        clnt->family = server->family;\n        return 1;\n    } else {\n        lua_pushnil(L);\n        lua_pushstring(L, err);\n        return 2;\n    }\n}\n\n/*-------------------------------------------------------------------------*\\\n* Binds an object to an address\n\\*-------------------------------------------------------------------------*/\nstatic int meth_bind(lua_State *L) {\n    p_tcp tcp = (p_tcp) auxiliar_checkclass(L, \"tcp{master}\", 1);\n    const char *address =  luaL_checkstring(L, 2);\n    const char *port = luaL_checkstring(L, 3);\n    const char *err;\n    struct addrinfo bindhints;\n    memset(&bindhints, 0, sizeof(bindhints));\n    bindhints.ai_socktype = SOCK_STREAM;\n    bindhints.ai_family = tcp->family;\n    bindhints.ai_flags = AI_PASSIVE;\n    err = inet_trybind(&tcp->sock, &tcp->family, address, port, &bindhints);\n    if (err) {\n        lua_pushnil(L);\n        lua_pushstring(L, err);\n        return 2;\n    }\n    lua_pushnumber(L, 1);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Turns a master tcp object into a client object.\n\\*-------------------------------------------------------------------------*/\nstatic int meth_connect(lua_State *L) {\n    p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, \"tcp{any}\", 1);\n    const char *address =  luaL_checkstring(L, 2);\n    const char *port = luaL_checkstring(L, 3);\n    struct addrinfo connecthints;\n    const char *err;\n    memset(&connecthints, 0, sizeof(connecthints));\n    connecthints.ai_socktype = SOCK_STREAM;\n    /* make sure we try to connect only to the same family */\n    connecthints.ai_family = tcp->family;\n    timeout_markstart(&tcp->tm);\n    err = inet_tryconnect(&tcp->sock, &tcp->family, address, port,\n        &tcp->tm, &connecthints);\n    /* have to set the class even if it failed due to non-blocking connects */\n    auxiliar_setclass(L, \"tcp{client}\", 1);\n    if (err) {\n        lua_pushnil(L);\n        lua_pushstring(L, err);\n        return 2;\n    }\n    lua_pushnumber(L, 1);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Closes socket used by object\n\\*-------------------------------------------------------------------------*/\nstatic int meth_close(lua_State *L)\n{\n    p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, \"tcp{any}\", 1);\n    socket_destroy(&tcp->sock);\n    lua_pushnumber(L, 1);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Returns family as string\n\\*-------------------------------------------------------------------------*/\nstatic int meth_getfamily(lua_State *L)\n{\n    p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, \"tcp{any}\", 1);\n    if (tcp->family == AF_INET6) {\n        lua_pushliteral(L, \"inet6\");\n        return 1;\n    } else if (tcp->family == AF_INET) {\n        lua_pushliteral(L, \"inet4\");\n        return 1;\n    } else {\n        lua_pushliteral(L, \"inet4\");\n        return 1;\n    }\n}\n\n/*-------------------------------------------------------------------------*\\\n* Puts the sockt in listen mode\n\\*-------------------------------------------------------------------------*/\nstatic int meth_listen(lua_State *L)\n{\n    p_tcp tcp = (p_tcp) auxiliar_checkclass(L, \"tcp{master}\", 1);\n    int backlog = (int) luaL_optnumber(L, 2, 32);\n    int err = socket_listen(&tcp->sock, backlog);\n    if (err != IO_DONE) {\n        lua_pushnil(L);\n        lua_pushstring(L, socket_strerror(err));\n        return 2;\n    }\n    /* turn master object into a server object */\n    auxiliar_setclass(L, \"tcp{server}\", 1);\n    lua_pushnumber(L, 1);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Shuts the connection down partially\n\\*-------------------------------------------------------------------------*/\nstatic int meth_shutdown(lua_State *L)\n{\n    /* SHUT_RD,  SHUT_WR,  SHUT_RDWR  have  the value 0, 1, 2, so we can use method index directly */\n    static const char* methods[] = { \"receive\", \"send\", \"both\", NULL };\n    p_tcp tcp = (p_tcp) auxiliar_checkclass(L, \"tcp{client}\", 1);\n    int how = luaL_checkoption(L, 2, \"both\", methods);\n    socket_shutdown(&tcp->sock, how);\n    lua_pushnumber(L, 1);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Just call inet methods\n\\*-------------------------------------------------------------------------*/\nstatic int meth_getpeername(lua_State *L)\n{\n    p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, \"tcp{any}\", 1);\n    return inet_meth_getpeername(L, &tcp->sock, tcp->family);\n}\n\nstatic int meth_getsockname(lua_State *L)\n{\n    p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, \"tcp{any}\", 1);\n    return inet_meth_getsockname(L, &tcp->sock, tcp->family);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Just call tm methods\n\\*-------------------------------------------------------------------------*/\nstatic int meth_settimeout(lua_State *L)\n{\n    p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, \"tcp{any}\", 1);\n    return timeout_meth_settimeout(L, &tcp->tm);\n}\n\nstatic int meth_gettimeout(lua_State *L)\n{\n    p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, \"tcp{any}\", 1);\n    return timeout_meth_gettimeout(L, &tcp->tm);\n}\n\n/*=========================================================================*\\\n* Library functions\n\\*=========================================================================*/\n/*-------------------------------------------------------------------------*\\\n* Creates a master tcp object\n\\*-------------------------------------------------------------------------*/\nstatic int tcp_create(lua_State *L, int family) {\n    p_tcp tcp = (p_tcp) lua_newuserdata(L, sizeof(t_tcp));\n    memset(tcp, 0, sizeof(t_tcp));\n    /* set its type as master object */\n    auxiliar_setclass(L, \"tcp{master}\", -1);\n    /* if family is AF_UNSPEC, we leave the socket invalid and\n     * store AF_UNSPEC into family. This will allow it to later be\n     * replaced with an AF_INET6 or AF_INET socket upon first use. */\n    tcp->sock = SOCKET_INVALID;\n    tcp->family = family;\n    io_init(&tcp->io, (p_send) socket_send, (p_recv) socket_recv,\n            (p_error) socket_ioerror, &tcp->sock);\n    timeout_init(&tcp->tm, -1, -1);\n    buffer_init(&tcp->buf, &tcp->io, &tcp->tm);\n    if (family != AF_UNSPEC) {\n        const char *err = inet_trycreate(&tcp->sock, family, SOCK_STREAM, 0);\n        if (err != NULL) {\n            lua_pushnil(L);\n            lua_pushstring(L, err);\n            return 2;\n        }\n        socket_setnonblocking(&tcp->sock);\n    }\n    return 1;\n}\n\nstatic int global_create(lua_State *L) {\n    return tcp_create(L, AF_UNSPEC);\n}\n\nstatic int global_create4(lua_State *L) {\n    return tcp_create(L, AF_INET);\n}\n\nstatic int global_create6(lua_State *L) {\n    return tcp_create(L, AF_INET6);\n}\n\nstatic int global_connect(lua_State *L) {\n    const char *remoteaddr = luaL_checkstring(L, 1);\n    const char *remoteserv = luaL_checkstring(L, 2);\n    const char *localaddr  = luaL_optstring(L, 3, NULL);\n    const char *localserv  = luaL_optstring(L, 4, \"0\");\n    int family = inet_optfamily(L, 5, \"unspec\");\n    p_tcp tcp = (p_tcp) lua_newuserdata(L, sizeof(t_tcp));\n    struct addrinfo bindhints, connecthints;\n    const char *err = NULL;\n    /* initialize tcp structure */\n    memset(tcp, 0, sizeof(t_tcp));\n    io_init(&tcp->io, (p_send) socket_send, (p_recv) socket_recv,\n            (p_error) socket_ioerror, &tcp->sock);\n    timeout_init(&tcp->tm, -1, -1);\n    buffer_init(&tcp->buf, &tcp->io, &tcp->tm);\n    tcp->sock = SOCKET_INVALID;\n    tcp->family = AF_UNSPEC;\n    /* allow user to pick local address and port */\n    memset(&bindhints, 0, sizeof(bindhints));\n    bindhints.ai_socktype = SOCK_STREAM;\n    bindhints.ai_family = family;\n    bindhints.ai_flags = AI_PASSIVE;\n    if (localaddr) {\n        err = inet_trybind(&tcp->sock, &tcp->family, localaddr,\n            localserv, &bindhints);\n        if (err) {\n            lua_pushnil(L);\n            lua_pushstring(L, err);\n            return 2;\n        }\n    }\n    /* try to connect to remote address and port */\n    memset(&connecthints, 0, sizeof(connecthints));\n    connecthints.ai_socktype = SOCK_STREAM;\n    /* make sure we try to connect only to the same family */\n    connecthints.ai_family = tcp->family;\n    err = inet_tryconnect(&tcp->sock, &tcp->family, remoteaddr, remoteserv,\n         &tcp->tm, &connecthints);\n    if (err) {\n        socket_destroy(&tcp->sock);\n        lua_pushnil(L);\n        lua_pushstring(L, err);\n        return 2;\n    }\n    auxiliar_setclass(L, \"tcp{client}\", -1);\n    return 1;\n}\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/tcp.h",
    "content": "#ifndef TCP_H\n#define TCP_H\n/*=========================================================================*\\\n* TCP object\n* LuaSocket toolkit\n*\n* The tcp.h module is basicly a glue that puts together modules buffer.h,\n* timeout.h socket.h and inet.h to provide the LuaSocket TCP (AF_INET,\n* SOCK_STREAM) support.\n*\n* Three classes are defined: master, client and server. The master class is\n* a newly created tcp object, that has not been bound or connected. Server\n* objects are tcp objects bound to some local address. Client objects are\n* tcp objects either connected to some address or returned by the accept\n* method of a server object.\n\\*=========================================================================*/\n#include \"luasocket.h\"\n\n#include \"buffer.h\"\n#include \"timeout.h\"\n#include \"socket.h\"\n\ntypedef struct t_tcp_ {\n    t_socket sock;\n    t_io io;\n    t_buffer buf;\n    t_timeout tm;\n    int family;\n} t_tcp;\n\ntypedef t_tcp *p_tcp;\n\n#ifndef _WIN32\n#pragma GCC visibility push(hidden)\n#endif\n\nint tcp_open(lua_State *L);\n\n#ifndef _WIN32\n#pragma GCC visibility pop\n#endif\n\n#endif /* TCP_H */\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/timeout.c",
    "content": "/*=========================================================================*\\\n* Timeout management functions\n* LuaSocket toolkit\n\\*=========================================================================*/\n#include \"luasocket.h\"\n\n#include \"auxiliar.h\"\n#include \"timeout.h\"\n\n#include <stdio.h>\n#include <limits.h>\n#include <float.h>\n\n#ifdef _WIN32\n#include <windows.h>\n#else\n#include <time.h>\n#include <sys/time.h>\n#endif\n\n/* min and max macros */\n#ifndef MIN\n#define MIN(x, y) ((x) < (y) ? x : y)\n#endif\n#ifndef MAX\n#define MAX(x, y) ((x) > (y) ? x : y)\n#endif\n\n/*=========================================================================*\\\n* Internal function prototypes\n\\*=========================================================================*/\nstatic int timeout_lua_gettime(lua_State *L);\nstatic int timeout_lua_sleep(lua_State *L);\n\nstatic luaL_Reg func[] = {\n    { \"gettime\", timeout_lua_gettime },\n    { \"sleep\", timeout_lua_sleep },\n    { NULL, NULL }\n};\n\n/*=========================================================================*\\\n* Exported functions.\n\\*=========================================================================*/\n/*-------------------------------------------------------------------------*\\\n* Initialize structure\n\\*-------------------------------------------------------------------------*/\nvoid timeout_init(p_timeout tm, double block, double total) {\n    tm->block = block;\n    tm->total = total;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Determines how much time we have left for the next system call,\n* if the previous call was successful\n* Input\n*   tm: timeout control structure\n* Returns\n*   the number of ms left or -1 if there is no time limit\n\\*-------------------------------------------------------------------------*/\ndouble timeout_get(p_timeout tm) {\n    if (tm->block < 0.0 && tm->total < 0.0) {\n        return -1;\n    } else if (tm->block < 0.0) {\n        double t = tm->total - timeout_gettime() + tm->start;\n        return MAX(t, 0.0);\n    } else if (tm->total < 0.0) {\n        return tm->block;\n    } else {\n        double t = tm->total - timeout_gettime() + tm->start;\n        return MIN(tm->block, MAX(t, 0.0));\n    }\n}\n\n/*-------------------------------------------------------------------------*\\\n* Returns time since start of operation\n* Input\n*   tm: timeout control structure\n* Returns\n*   start field of structure\n\\*-------------------------------------------------------------------------*/\ndouble timeout_getstart(p_timeout tm) {\n    return tm->start;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Determines how much time we have left for the next system call,\n* if the previous call was a failure\n* Input\n*   tm: timeout control structure\n* Returns\n*   the number of ms left or -1 if there is no time limit\n\\*-------------------------------------------------------------------------*/\ndouble timeout_getretry(p_timeout tm) {\n    if (tm->block < 0.0 && tm->total < 0.0) {\n        return -1;\n    } else if (tm->block < 0.0) {\n        double t = tm->total - timeout_gettime() + tm->start;\n        return MAX(t, 0.0);\n    } else if (tm->total < 0.0) {\n        double t = tm->block - timeout_gettime() + tm->start;\n        return MAX(t, 0.0);\n    } else {\n        double t = tm->total - timeout_gettime() + tm->start;\n        return MIN(tm->block, MAX(t, 0.0));\n    }\n}\n\n/*-------------------------------------------------------------------------*\\\n* Marks the operation start time in structure\n* Input\n*   tm: timeout control structure\n\\*-------------------------------------------------------------------------*/\np_timeout timeout_markstart(p_timeout tm) {\n    tm->start = timeout_gettime();\n    return tm;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Gets time in s, relative to January 1, 1970 (UTC)\n* Returns\n*   time in s.\n\\*-------------------------------------------------------------------------*/\n#ifdef _WIN32\ndouble timeout_gettime(void) {\n    FILETIME ft;\n    double t;\n    GetSystemTimeAsFileTime(&ft);\n    /* Windows file time (time since January 1, 1601 (UTC)) */\n    t  = ft.dwLowDateTime/1.0e7 + ft.dwHighDateTime*(4294967296.0/1.0e7);\n    /* convert to Unix Epoch time (time since January 1, 1970 (UTC)) */\n    return (t - 11644473600.0);\n}\n#else\ndouble timeout_gettime(void) {\n    struct timeval v;\n    gettimeofday(&v, (struct timezone *) NULL);\n    /* Unix Epoch time (time since January 1, 1970 (UTC)) */\n    return v.tv_sec + v.tv_usec/1.0e6;\n}\n#endif\n\n/*-------------------------------------------------------------------------*\\\n* Initializes module\n\\*-------------------------------------------------------------------------*/\nint timeout_open(lua_State *L) {\n    luaL_setfuncs(L, func, 0);\n    return 0;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Sets timeout values for IO operations\n* Lua Input: base, time [, mode]\n*   time: time out value in seconds\n*   mode: \"b\" for block timeout, \"t\" for total timeout. (default: b)\n\\*-------------------------------------------------------------------------*/\nint timeout_meth_settimeout(lua_State *L, p_timeout tm) {\n    double t = luaL_optnumber(L, 2, -1);\n    const char *mode = luaL_optstring(L, 3, \"b\");\n    switch (*mode) {\n        case 'b':\n            tm->block = t;\n            break;\n        case 'r': case 't':\n            tm->total = t;\n            break;\n        default:\n            luaL_argcheck(L, 0, 3, \"invalid timeout mode\");\n            break;\n    }\n    lua_pushnumber(L, 1);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Gets timeout values for IO operations\n* Lua Output: block, total\n\\*-------------------------------------------------------------------------*/\nint timeout_meth_gettimeout(lua_State *L, p_timeout tm) {\n    lua_pushnumber(L, tm->block);\n    lua_pushnumber(L, tm->total);\n    return 2;\n}\n\n/*=========================================================================*\\\n* Test support functions\n\\*=========================================================================*/\n/*-------------------------------------------------------------------------*\\\n* Returns the time the system has been up, in secconds.\n\\*-------------------------------------------------------------------------*/\nstatic int timeout_lua_gettime(lua_State *L)\n{\n    lua_pushnumber(L, timeout_gettime());\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Sleep for n seconds.\n\\*-------------------------------------------------------------------------*/\n#ifdef _WIN32\nint timeout_lua_sleep(lua_State *L)\n{\n    double n = luaL_checknumber(L, 1);\n    if (n < 0.0) n = 0.0;\n    if (n < DBL_MAX/1000.0) n *= 1000.0;\n    if (n > INT_MAX) n = INT_MAX;\n    Sleep((int)n);\n    return 0;\n}\n#else\nint timeout_lua_sleep(lua_State *L)\n{\n    double n = luaL_checknumber(L, 1);\n    struct timespec t, r;\n    if (n < 0.0) n = 0.0;\n    if (n > INT_MAX) n = INT_MAX;\n    t.tv_sec = (int) n;\n    n -= t.tv_sec;\n    t.tv_nsec = (int) (n * 1000000000);\n    if (t.tv_nsec >= 1000000000) t.tv_nsec = 999999999;\n    while (nanosleep(&t, &r) != 0) {\n        t.tv_sec = r.tv_sec;\n        t.tv_nsec = r.tv_nsec;\n    }\n    return 0;\n}\n#endif\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/timeout.h",
    "content": "#ifndef TIMEOUT_H\n#define TIMEOUT_H\n/*=========================================================================*\\\n* Timeout management functions\n* LuaSocket toolkit\n\\*=========================================================================*/\n#include \"luasocket.h\"\n\n/* timeout control structure */\ntypedef struct t_timeout_ {\n    double block;          /* maximum time for blocking calls */\n    double total;          /* total number of miliseconds for operation */\n    double start;          /* time of start of operation */\n} t_timeout;\ntypedef t_timeout *p_timeout;\n\n#ifndef _WIN32\n#pragma GCC visibility push(hidden)\n#endif\n\nvoid timeout_init(p_timeout tm, double block, double total);\ndouble timeout_get(p_timeout tm);\ndouble timeout_getstart(p_timeout tm);\ndouble timeout_getretry(p_timeout tm);\np_timeout timeout_markstart(p_timeout tm);\n\ndouble timeout_gettime(void);\n\nint timeout_open(lua_State *L);\n\nint timeout_meth_settimeout(lua_State *L, p_timeout tm);\nint timeout_meth_gettimeout(lua_State *L, p_timeout tm);\n\n#ifndef _WIN32\n#pragma GCC visibility pop\n#endif\n\n#define timeout_iszero(tm)   ((tm)->block == 0.0)\n\n#endif /* TIMEOUT_H */\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/tp.lua",
    "content": "-----------------------------------------------------------------------------\n-- Unified SMTP/FTP subsystem\n-- LuaSocket toolkit.\n-- Author: Diego Nehab\n-----------------------------------------------------------------------------\n\n-----------------------------------------------------------------------------\n-- Declare module and import dependencies\n-----------------------------------------------------------------------------\nlocal base = _G\nlocal string = require(\"string\")\nlocal socket = require(\"socket\")\nlocal ltn12 = require(\"ltn12\")\n\nsocket.tp = {}\nlocal _M = socket.tp\n\n-----------------------------------------------------------------------------\n-- Program constants\n-----------------------------------------------------------------------------\n_M.TIMEOUT = 60\n\n-----------------------------------------------------------------------------\n-- Implementation\n-----------------------------------------------------------------------------\n-- gets server reply (works for SMTP and FTP)\nlocal function get_reply(c)\n    local code, current, sep\n    local line, err = c:receive()\n    local reply = line\n    if err then return nil, err end\n    code, sep = socket.skip(2, string.find(line, \"^(%d%d%d)(.?)\"))\n    if not code then return nil, \"invalid server reply\" end\n    if sep == \"-\" then -- reply is multiline\n        repeat\n            line, err = c:receive()\n            if err then return nil, err end\n            current, sep = socket.skip(2, string.find(line, \"^(%d%d%d)(.?)\"))\n            reply = reply .. \"\\n\" .. line\n        -- reply ends with same code\n        until code == current and sep == \" \"\n    end\n    return code, reply\nend\n\n-- metatable for sock object\nlocal metat = { __index = {} }\n\nfunction metat.__index:getpeername()\n    return self.c:getpeername()\nend\n\nfunction metat.__index:getsockname()\n    return self.c:getpeername()\nend\n\nfunction metat.__index:check(ok)\n    local code, reply = get_reply(self.c)\n    if not code then return nil, reply end\n    if base.type(ok) ~= \"function\" then\n        if base.type(ok) == \"table\" then\n            for i, v in base.ipairs(ok) do\n                if string.find(code, v) then\n                    return base.tonumber(code), reply\n                end\n            end\n            return nil, reply\n        else\n            if string.find(code, ok) then return base.tonumber(code), reply\n            else return nil, reply end\n        end\n    else return ok(base.tonumber(code), reply) end\nend\n\nfunction metat.__index:command(cmd, arg)\n    cmd = string.upper(cmd)\n    if arg then\n        return self.c:send(cmd .. \" \" .. arg.. \"\\r\\n\")\n    else\n        return self.c:send(cmd .. \"\\r\\n\")\n    end\nend\n\nfunction metat.__index:sink(snk, pat)\n    local chunk, err = self.c:receive(pat)\n    return snk(chunk, err)\nend\n\nfunction metat.__index:send(data)\n    return self.c:send(data)\nend\n\nfunction metat.__index:receive(pat)\n    return self.c:receive(pat)\nend\n\nfunction metat.__index:getfd()\n    return self.c:getfd()\nend\n\nfunction metat.__index:dirty()\n    return self.c:dirty()\nend\n\nfunction metat.__index:getcontrol()\n    return self.c\nend\n\nfunction metat.__index:source(source, step)\n    local sink = socket.sink(\"keep-open\", self.c)\n    local ret, err = ltn12.pump.all(source, sink, step or ltn12.pump.step)\n    return ret, err\nend\n\n-- closes the underlying c\nfunction metat.__index:close()\n    self.c:close()\n    return 1\nend\n\n-- connect with server and return c object\nfunction _M.connect(host, port, timeout, create)\n    local c, e = (create or socket.tcp)()\n    if not c then return nil, e end\n    c:settimeout(timeout or _M.TIMEOUT)\n    local r, e = c:connect(host, port)\n    if not r then\n        c:close()\n        return nil, e\n    end\n    return base.setmetatable({c = c}, metat)\nend\n\nreturn _M\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/tp.lua.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n * \n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n * \n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n * \n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\nnamespace love\n{\n\n// [tp.lua]\nconst unsigned char tp_lua[] = \n{\n\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x55, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x53, 0x4d, 0x54, 0x50, 0x2f, 0x46, 0x54, \n\t0x50, 0x20, 0x73, 0x75, 0x62, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x4c, 0x75, 0x61, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0x6b, \n\t0x69, 0x74, 0x2e, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x3a, 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x20, 0x4e, \n\t0x65, 0x68, 0x61, 0x62, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, \n\t0x61, 0x6e, 0x64, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, \n\t0x6e, 0x63, 0x69, 0x65, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x47, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, \n\t0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, \n\t0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, \n\t0x69, 0x72, 0x65, 0x28, 0x22, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x22, 0x29, 0x0a,\n\t0x0a,\n\t0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x74, 0x70, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x4d, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, \n\t0x74, 0x70, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, \n\t0x74, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x20, 0x3d, 0x20, 0x36, 0x30, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x49, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x67, 0x65, 0x74, 0x73, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x72, 0x65, 0x70, \n\t0x6c, 0x79, 0x20, 0x28, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x53, 0x4d, 0x54, 0x50, \n\t0x20, 0x61, 0x6e, 0x64, 0x20, 0x46, 0x54, 0x50, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, \n\t0x5f, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x28, 0x63, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x63, 0x75, \n\t0x72, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x65, 0x70, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x65, 0x72, \n\t0x72, 0x20, 0x3d, 0x20, 0x63, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x20, 0x3d, 0x20, \n\t0x6c, 0x69, 0x6e, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x65, 0x72, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, \n\t0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x73, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x73, 0x6f, \n\t0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x6b, 0x69, 0x70, 0x28, 0x32, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, \n\t0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x22, 0x5e, 0x28, 0x25, 0x64, \n\t0x25, 0x64, 0x25, 0x64, 0x29, 0x28, 0x2e, 0x3f, 0x29, 0x22, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x74, 0x68, \n\t0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x22, 0x69, 0x6e, \n\t0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x79, \n\t0x22, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, 0x70, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x2d, 0x22, 0x20, \n\t0x74, 0x68, 0x65, 0x6e, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x20, 0x69, 0x73, 0x20, 0x6d, \n\t0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, \n\t0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x65, 0x72, 0x72, \n\t0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, \n\t0x65, 0x72, 0x72, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, \n\t0x74, 0x2c, 0x20, 0x73, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x6b, \n\t0x69, 0x70, 0x28, 0x32, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, \n\t0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x22, 0x5e, 0x28, 0x25, 0x64, 0x25, 0x64, 0x25, 0x64, 0x29, 0x28, 0x2e, \n\t0x3f, 0x29, 0x22, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x20, \n\t0x3d, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x20, 0x2e, 0x2e, \n\t0x20, 0x6c, 0x69, 0x6e, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x20, 0x65, \n\t0x6e, 0x64, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, \n\t0x20, 0x3d, 0x3d, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, \n\t0x70, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x20, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x72, \n\t0x65, 0x70, 0x6c, 0x79, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, \n\t0x6f, 0x63, 0x6b, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x5f, 0x5f, \n\t0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x20, 0x7d, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x67, 0x65, 0x74, 0x70, 0x65, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x3a, \n\t0x67, 0x65, 0x74, 0x70, 0x65, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x67, 0x65, 0x74, 0x73, 0x6f, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x3a, \n\t0x67, 0x65, 0x74, 0x70, 0x65, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x6f, 0x6b, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x72, 0x65, \n\t0x70, 0x6c, 0x79, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x28, 0x73, 0x65, \n\t0x6c, 0x66, 0x2e, 0x63, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x74, 0x68, \n\t0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x72, 0x65, 0x70, \n\t0x6c, 0x79, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6f, \n\t0x6b, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, \n\t0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x74, 0x79, \n\t0x70, 0x65, 0x28, 0x6f, 0x6b, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, \n\t0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, \n\t0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, \n\t0x6f, 0x6b, 0x29, 0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, \n\t0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x2c, \n\t0x20, 0x76, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x74, 0x6f, 0x6e, 0x75, \n\t0x6d, 0x62, 0x65, 0x72, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x2c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, \n\t0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, \n\t0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x74, 0x72, \n\t0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x6f, 0x6b, 0x29, \n\t0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, \n\t0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x2c, 0x20, 0x72, 0x65, \n\t0x70, 0x6c, 0x79, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, \n\t0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x20, 0x65, \n\t0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6b, \n\t0x28, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x63, 0x6f, 0x64, \n\t0x65, 0x29, 0x2c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x63, 0x6d, 0x64, 0x2c, 0x20, \n\t0x61, 0x72, 0x67, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x63, 0x6d, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x75, \n\t0x70, 0x70, 0x65, 0x72, 0x28, 0x63, 0x6d, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x61, 0x72, 0x67, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, \n\t0x66, 0x2e, 0x63, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x28, 0x63, 0x6d, 0x64, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, \n\t0x22, 0x20, 0x2e, 0x2e, 0x20, 0x61, 0x72, 0x67, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x72, 0x5c, 0x6e, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, \n\t0x66, 0x2e, 0x63, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x28, 0x63, 0x6d, 0x64, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, \n\t0x72, 0x5c, 0x6e, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x73, 0x69, 0x6e, 0x6b, 0x28, 0x73, 0x6e, 0x6b, 0x2c, 0x20, 0x70, 0x61, 0x74, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x65, \n\t0x72, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, \n\t0x65, 0x28, 0x70, 0x61, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6e, 0x6b, 0x28, 0x63, 0x68, 0x75, \n\t0x6e, 0x6b, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x3a, \n\t0x73, 0x65, 0x6e, 0x64, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x28, 0x70, 0x61, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x3a, \n\t0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x28, 0x70, 0x61, 0x74, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x67, 0x65, 0x74, 0x66, 0x64, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x3a, \n\t0x67, 0x65, 0x74, 0x66, 0x64, 0x28, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x64, 0x69, 0x72, 0x74, 0x79, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x3a, \n\t0x64, 0x69, 0x72, 0x74, 0x79, 0x28, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x67, 0x65, 0x74, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, \n\t0x2c, 0x20, 0x73, 0x74, 0x65, 0x70, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x73, \n\t0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x69, 0x6e, 0x6b, 0x28, 0x22, 0x6b, 0x65, 0x65, 0x70, 0x2d, 0x6f, \n\t0x70, 0x65, 0x6e, 0x22, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x2c, 0x20, 0x65, 0x72, 0x72, \n\t0x20, 0x3d, 0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x2e, 0x70, 0x75, 0x6d, 0x70, 0x2e, 0x61, 0x6c, 0x6c, 0x28, \n\t0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x73, 0x69, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x74, 0x65, 0x70, \n\t0x20, 0x6f, 0x72, 0x20, 0x6c, 0x74, 0x6e, 0x31, 0x32, 0x2e, 0x70, 0x75, 0x6d, 0x70, 0x2e, 0x73, 0x74, 0x65, \n\t0x70, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x2c, 0x20, 0x65, 0x72, \n\t0x72, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x6e, 0x64, 0x65, \n\t0x72, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x2e, 0x5f, 0x5f, 0x69, \n\t0x6e, 0x64, 0x65, 0x78, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x73, 0x65, \n\t0x72, 0x76, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x20, \n\t0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, \n\t0x74, 0x28, 0x68, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x2c, 0x20, 0x74, 0x69, 0x6d, 0x65, \n\t0x6f, 0x75, 0x74, 0x2c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x2c, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x28, \n\t0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x74, \n\t0x63, 0x70, 0x29, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, \n\t0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x63, 0x3a, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x74, \n\t0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x4d, 0x2e, 0x54, 0x49, 0x4d, 0x45, 0x4f, \n\t0x55, 0x54, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x2c, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x63, \n\t0x3a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x28, 0x68, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x70, 0x6f, 0x72, \n\t0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, \n\t0x2c, 0x20, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x73, 0x65, \n\t0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x63, 0x20, 0x3d, 0x20, 0x63, 0x7d, \n\t0x2c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x4d, 0x0a,\n}; // [tp.lua]\n} // love\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/udp.c",
    "content": "/*=========================================================================*\\\n* UDP object\n* LuaSocket toolkit\n\\*=========================================================================*/\n#include \"luasocket.h\"\n\n#include \"auxiliar.h\"\n#include \"socket.h\"\n#include \"inet.h\"\n#include \"options.h\"\n#include \"udp.h\"\n\n#include <string.h>\n#include <stdlib.h>\n\n/* min and max macros */\n#ifndef MIN\n#define MIN(x, y) ((x) < (y) ? x : y)\n#endif\n#ifndef MAX\n#define MAX(x, y) ((x) > (y) ? x : y)\n#endif\n\n/*=========================================================================*\\\n* Internal function prototypes\n\\*=========================================================================*/\nstatic int global_create(lua_State *L);\nstatic int global_create4(lua_State *L);\nstatic int global_create6(lua_State *L);\nstatic int meth_send(lua_State *L);\nstatic int meth_sendto(lua_State *L);\nstatic int meth_receive(lua_State *L);\nstatic int meth_receivefrom(lua_State *L);\nstatic int meth_getfamily(lua_State *L);\nstatic int meth_getsockname(lua_State *L);\nstatic int meth_getpeername(lua_State *L);\nstatic int meth_gettimeout(lua_State *L);\nstatic int meth_setsockname(lua_State *L);\nstatic int meth_setpeername(lua_State *L);\nstatic int meth_close(lua_State *L);\nstatic int meth_setoption(lua_State *L);\nstatic int meth_getoption(lua_State *L);\nstatic int meth_settimeout(lua_State *L);\nstatic int meth_getfd(lua_State *L);\nstatic int meth_setfd(lua_State *L);\nstatic int meth_dirty(lua_State *L);\n\n/* udp object methods */\nstatic luaL_Reg udp_methods[] = {\n    {\"__gc\",        meth_close},\n    {\"__tostring\",  auxiliar_tostring},\n    {\"close\",       meth_close},\n    {\"dirty\",       meth_dirty},\n    {\"getfamily\",   meth_getfamily},\n    {\"getfd\",       meth_getfd},\n    {\"getpeername\", meth_getpeername},\n    {\"getsockname\", meth_getsockname},\n    {\"receive\",     meth_receive},\n    {\"receivefrom\", meth_receivefrom},\n    {\"send\",        meth_send},\n    {\"sendto\",      meth_sendto},\n    {\"setfd\",       meth_setfd},\n    {\"setoption\",   meth_setoption},\n    {\"getoption\",   meth_getoption},\n    {\"setpeername\", meth_setpeername},\n    {\"setsockname\", meth_setsockname},\n    {\"settimeout\",  meth_settimeout},\n    {\"gettimeout\",  meth_gettimeout},\n    {NULL,          NULL}\n};\n\n/* socket options for setoption */\nstatic t_opt optset[] = {\n    {\"dontroute\",            opt_set_dontroute},\n    {\"broadcast\",            opt_set_broadcast},\n    {\"reuseaddr\",            opt_set_reuseaddr},\n    {\"reuseport\",            opt_set_reuseport},\n    {\"ip-multicast-if\",      opt_set_ip_multicast_if},\n    {\"ip-multicast-ttl\",     opt_set_ip_multicast_ttl},\n    {\"ip-multicast-loop\",    opt_set_ip_multicast_loop},\n    {\"ip-add-membership\",    opt_set_ip_add_membership},\n    {\"ip-drop-membership\",   opt_set_ip_drop_membersip},\n    {\"ipv6-unicast-hops\",    opt_set_ip6_unicast_hops},\n    {\"ipv6-multicast-hops\",  opt_set_ip6_unicast_hops},\n    {\"ipv6-multicast-loop\",  opt_set_ip6_multicast_loop},\n    {\"ipv6-add-membership\",  opt_set_ip6_add_membership},\n    {\"ipv6-drop-membership\", opt_set_ip6_drop_membersip},\n    {\"ipv6-v6only\",          opt_set_ip6_v6only},\n\t{\"recv-buffer-size\",     opt_set_recv_buf_size},\n\t{\"send-buffer-size\",     opt_set_send_buf_size},\n    {NULL,                   NULL}\n};\n\n/* socket options for getoption */\nstatic t_opt optget[] = {\n    {\"dontroute\",            opt_get_dontroute},\n    {\"broadcast\",            opt_get_broadcast},\n    {\"reuseaddr\",            opt_get_reuseaddr},\n    {\"reuseport\",            opt_get_reuseport},\n    {\"ip-multicast-if\",      opt_get_ip_multicast_if},\n    {\"ip-multicast-loop\",    opt_get_ip_multicast_loop},\n    {\"error\",                opt_get_error},\n    {\"ipv6-unicast-hops\",    opt_get_ip6_unicast_hops},\n    {\"ipv6-multicast-hops\",  opt_get_ip6_unicast_hops},\n    {\"ipv6-multicast-loop\",  opt_get_ip6_multicast_loop},\n    {\"ipv6-v6only\",          opt_get_ip6_v6only},\n\t{\"recv-buffer-size\",     opt_get_recv_buf_size},\n\t{\"send-buffer-size\",     opt_get_send_buf_size},\n    {NULL,                   NULL}\n};\n\n/* functions in library namespace */\nstatic luaL_Reg func[] = {\n    {\"udp\", global_create},\n    {\"udp4\", global_create4},\n    {\"udp6\", global_create6},\n    {NULL, NULL}\n};\n\n/*-------------------------------------------------------------------------*\\\n* Initializes module\n\\*-------------------------------------------------------------------------*/\nint udp_open(lua_State *L) {\n    /* create classes */\n    auxiliar_newclass(L, \"udp{connected}\", udp_methods);\n    auxiliar_newclass(L, \"udp{unconnected}\", udp_methods);\n    /* create class groups */\n    auxiliar_add2group(L, \"udp{connected}\",   \"udp{any}\");\n    auxiliar_add2group(L, \"udp{unconnected}\", \"udp{any}\");\n    auxiliar_add2group(L, \"udp{connected}\",   \"select{able}\");\n    auxiliar_add2group(L, \"udp{unconnected}\", \"select{able}\");\n    /* define library functions */\n    luaL_setfuncs(L, func, 0);\n    /* export default UDP size */\n    lua_pushliteral(L, \"_DATAGRAMSIZE\");\n    lua_pushinteger(L, UDP_DATAGRAMSIZE);\n    lua_rawset(L, -3);\n    return 0;\n}\n\n/*=========================================================================*\\\n* Lua methods\n\\*=========================================================================*/\nstatic const char *udp_strerror(int err) {\n    /* a 'closed' error on an unconnected means the target address was not\n     * accepted by the transport layer */\n    if (err == IO_CLOSED) return \"refused\";\n    else return socket_strerror(err);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Send data through connected udp socket\n\\*-------------------------------------------------------------------------*/\nstatic int meth_send(lua_State *L) {\n    p_udp udp = (p_udp) auxiliar_checkclass(L, \"udp{connected}\", 1);\n    p_timeout tm = &udp->tm;\n    size_t count, sent = 0;\n    int err;\n    const char *data = luaL_checklstring(L, 2, &count);\n    timeout_markstart(tm);\n    err = socket_send(&udp->sock, data, count, &sent, tm);\n    if (err != IO_DONE) {\n        lua_pushnil(L);\n        lua_pushstring(L, udp_strerror(err));\n        return 2;\n    }\n    lua_pushnumber(L, (lua_Number) sent);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Send data through unconnected udp socket\n\\*-------------------------------------------------------------------------*/\nstatic int meth_sendto(lua_State *L) {\n    p_udp udp = (p_udp) auxiliar_checkclass(L, \"udp{unconnected}\", 1);\n    size_t count, sent = 0;\n    const char *data = luaL_checklstring(L, 2, &count);\n    const char *ip = luaL_checkstring(L, 3);\n    const char *port = luaL_checkstring(L, 4);\n    p_timeout tm = &udp->tm;\n    int err;\n    struct addrinfo aihint;\n    struct addrinfo *ai;\n    memset(&aihint, 0, sizeof(aihint));\n    aihint.ai_family = udp->family;\n    aihint.ai_socktype = SOCK_DGRAM;\n    aihint.ai_flags = AI_NUMERICHOST;\n#ifdef AI_NUMERICSERV\n    aihint.ai_flags |= AI_NUMERICSERV;\n#endif\n    err = getaddrinfo(ip, port, &aihint, &ai);\n\tif (err) {\n        lua_pushnil(L);\n        lua_pushstring(L, LUA_GAI_STRERROR(err));\n        return 2;\n    }\n\n    /* create socket if on first sendto if AF_UNSPEC was set */\n    if (udp->family == AF_UNSPEC && udp->sock == SOCKET_INVALID) {\n        struct addrinfo *ap;\n        const char *errstr = NULL;\n        for (ap = ai; ap != NULL; ap = ap->ai_next) {\n            errstr = inet_trycreate(&udp->sock, ap->ai_family, SOCK_DGRAM, 0);\n            if (errstr == NULL) {\n                socket_setnonblocking(&udp->sock);\n                udp->family = ap->ai_family;\n                break;\n            }\n        }\n        if (errstr != NULL) {\n            lua_pushnil(L);\n            lua_pushstring(L, errstr);\n            freeaddrinfo(ai);\n            return 2;\n        }\n    }\n\n    timeout_markstart(tm);\n    err = socket_sendto(&udp->sock, data, count, &sent, ai->ai_addr,\n        (socklen_t) ai->ai_addrlen, tm);\n    freeaddrinfo(ai);\n    if (err != IO_DONE) {\n        lua_pushnil(L);\n        lua_pushstring(L, udp_strerror(err));\n        return 2;\n    }\n    lua_pushnumber(L, (lua_Number) sent);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Receives data from a UDP socket\n\\*-------------------------------------------------------------------------*/\nstatic int meth_receive(lua_State *L) {\n    p_udp udp = (p_udp) auxiliar_checkgroup(L, \"udp{any}\", 1);\n    char buf[UDP_DATAGRAMSIZE];\n    size_t got, wanted = (size_t) luaL_optnumber(L, 2, sizeof(buf));\n    char *dgram = wanted > sizeof(buf)? (char *) malloc(wanted): buf;\n    int err;\n    p_timeout tm = &udp->tm;\n    timeout_markstart(tm);\n    if (!dgram) {\n        lua_pushnil(L);\n        lua_pushliteral(L, \"out of memory\");\n        return 2;\n    }\n    err = socket_recv(&udp->sock, dgram, wanted, &got, tm);\n    /* Unlike TCP, recv() of zero is not closed, but a zero-length packet. */\n    if (err != IO_DONE && err != IO_CLOSED) {\n        lua_pushnil(L);\n        lua_pushstring(L, udp_strerror(err));\n        if (wanted > sizeof(buf)) free(dgram);\n        return 2;\n    }\n    lua_pushlstring(L, dgram, got);\n    if (wanted > sizeof(buf)) free(dgram);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Receives data and sender from a UDP socket\n\\*-------------------------------------------------------------------------*/\nstatic int meth_receivefrom(lua_State *L) {\n    p_udp udp = (p_udp) auxiliar_checkclass(L, \"udp{unconnected}\", 1);\n    char buf[UDP_DATAGRAMSIZE];\n    size_t got, wanted = (size_t) luaL_optnumber(L, 2, sizeof(buf));\n    char *dgram = wanted > sizeof(buf)? (char *) malloc(wanted): buf;\n    struct sockaddr_storage addr;\n    socklen_t addr_len = sizeof(addr);\n    char addrstr[INET6_ADDRSTRLEN];\n    char portstr[6];\n    int err;\n    p_timeout tm = &udp->tm;\n    timeout_markstart(tm);\n    if (!dgram) {\n        lua_pushnil(L);\n        lua_pushliteral(L, \"out of memory\");\n        return 2;\n    }\n    err = socket_recvfrom(&udp->sock, dgram, wanted, &got, (SA *) &addr,\n            &addr_len, tm);\n    /* Unlike TCP, recv() of zero is not closed, but a zero-length packet. */\n    if (err != IO_DONE && err != IO_CLOSED) {\n        lua_pushnil(L);\n        lua_pushstring(L, udp_strerror(err));\n        if (wanted > sizeof(buf)) free(dgram);\n        return 2;\n    }\n    err = getnameinfo((struct sockaddr *)&addr, addr_len, addrstr,\n        INET6_ADDRSTRLEN, portstr, 6, NI_NUMERICHOST | NI_NUMERICSERV);\n\tif (err) {\n        lua_pushnil(L);\n        lua_pushstring(L, LUA_GAI_STRERROR(err));\n        if (wanted > sizeof(buf)) free(dgram);\n        return 2;\n    }\n    lua_pushlstring(L, dgram, got);\n    lua_pushstring(L, addrstr);\n    lua_pushinteger(L, (int) strtol(portstr, (char **) NULL, 10));\n    if (wanted > sizeof(buf)) free(dgram);\n    return 3;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Returns family as string\n\\*-------------------------------------------------------------------------*/\nstatic int meth_getfamily(lua_State *L) {\n    p_udp udp = (p_udp) auxiliar_checkgroup(L, \"udp{any}\", 1);\n    if (udp->family == AF_INET6) {\n        lua_pushliteral(L, \"inet6\");\n        return 1;\n    } else {\n        lua_pushliteral(L, \"inet4\");\n        return 1;\n    }\n}\n\n/*-------------------------------------------------------------------------*\\\n* Select support methods\n\\*-------------------------------------------------------------------------*/\nstatic int meth_getfd(lua_State *L) {\n    p_udp udp = (p_udp) auxiliar_checkgroup(L, \"udp{any}\", 1);\n    lua_pushnumber(L, (int) udp->sock);\n    return 1;\n}\n\n/* this is very dangerous, but can be handy for those that are brave enough */\nstatic int meth_setfd(lua_State *L) {\n    p_udp udp = (p_udp) auxiliar_checkgroup(L, \"udp{any}\", 1);\n    udp->sock = (t_socket) luaL_checknumber(L, 2);\n    return 0;\n}\n\nstatic int meth_dirty(lua_State *L) {\n    p_udp udp = (p_udp) auxiliar_checkgroup(L, \"udp{any}\", 1);\n    (void) udp;\n    lua_pushboolean(L, 0);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Just call inet methods\n\\*-------------------------------------------------------------------------*/\nstatic int meth_getpeername(lua_State *L) {\n    p_udp udp = (p_udp) auxiliar_checkclass(L, \"udp{connected}\", 1);\n    return inet_meth_getpeername(L, &udp->sock, udp->family);\n}\n\nstatic int meth_getsockname(lua_State *L) {\n    p_udp udp = (p_udp) auxiliar_checkgroup(L, \"udp{any}\", 1);\n    return inet_meth_getsockname(L, &udp->sock, udp->family);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Just call option handler\n\\*-------------------------------------------------------------------------*/\nstatic int meth_setoption(lua_State *L) {\n    p_udp udp = (p_udp) auxiliar_checkgroup(L, \"udp{any}\", 1);\n    return opt_meth_setoption(L, optset, &udp->sock);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Just call option handler\n\\*-------------------------------------------------------------------------*/\nstatic int meth_getoption(lua_State *L) {\n    p_udp udp = (p_udp) auxiliar_checkgroup(L, \"udp{any}\", 1);\n    return opt_meth_getoption(L, optget, &udp->sock);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Just call tm methods\n\\*-------------------------------------------------------------------------*/\nstatic int meth_settimeout(lua_State *L) {\n    p_udp udp = (p_udp) auxiliar_checkgroup(L, \"udp{any}\", 1);\n    return timeout_meth_settimeout(L, &udp->tm);\n}\n\nstatic int meth_gettimeout(lua_State *L) {\n    p_udp udp = (p_udp) auxiliar_checkgroup(L, \"udp{any}\", 1);\n    return timeout_meth_gettimeout(L, &udp->tm);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Turns a master udp object into a client object.\n\\*-------------------------------------------------------------------------*/\nstatic int meth_setpeername(lua_State *L) {\n    p_udp udp = (p_udp) auxiliar_checkgroup(L, \"udp{any}\", 1);\n    p_timeout tm = &udp->tm;\n    const char *address = luaL_checkstring(L, 2);\n    int connecting = strcmp(address, \"*\");\n    const char *port = connecting? luaL_checkstring(L, 3): \"0\";\n    struct addrinfo connecthints;\n    const char *err;\n    memset(&connecthints, 0, sizeof(connecthints));\n    connecthints.ai_socktype = SOCK_DGRAM;\n    /* make sure we try to connect only to the same family */\n    connecthints.ai_family = udp->family;\n    if (connecting) {\n        err = inet_tryconnect(&udp->sock, &udp->family, address,\n            port, tm, &connecthints);\n        if (err) {\n            lua_pushnil(L);\n            lua_pushstring(L, err);\n            return 2;\n        }\n        auxiliar_setclass(L, \"udp{connected}\", 1);\n    } else {\n        /* we ignore possible errors because Mac OS X always\n         * returns EAFNOSUPPORT */\n        inet_trydisconnect(&udp->sock, udp->family, tm);\n        auxiliar_setclass(L, \"udp{unconnected}\", 1);\n    }\n    lua_pushnumber(L, 1);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Closes socket used by object\n\\*-------------------------------------------------------------------------*/\nstatic int meth_close(lua_State *L) {\n    p_udp udp = (p_udp) auxiliar_checkgroup(L, \"udp{any}\", 1);\n    socket_destroy(&udp->sock);\n    lua_pushnumber(L, 1);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Turns a master object into a server object\n\\*-------------------------------------------------------------------------*/\nstatic int meth_setsockname(lua_State *L) {\n    p_udp udp = (p_udp) auxiliar_checkclass(L, \"udp{unconnected}\", 1);\n    const char *address =  luaL_checkstring(L, 2);\n    const char *port = luaL_checkstring(L, 3);\n    const char *err;\n    struct addrinfo bindhints;\n    memset(&bindhints, 0, sizeof(bindhints));\n    bindhints.ai_socktype = SOCK_DGRAM;\n    bindhints.ai_family = udp->family;\n    bindhints.ai_flags = AI_PASSIVE;\n    err = inet_trybind(&udp->sock, &udp->family, address, port, &bindhints);\n    if (err) {\n        lua_pushnil(L);\n        lua_pushstring(L, err);\n        return 2;\n    }\n    lua_pushnumber(L, 1);\n    return 1;\n}\n\n/*=========================================================================*\\\n* Library functions\n\\*=========================================================================*/\n/*-------------------------------------------------------------------------*\\\n* Creates a master udp object\n\\*-------------------------------------------------------------------------*/\nstatic int udp_create(lua_State *L, int family) {\n    /* allocate udp object */\n    p_udp udp = (p_udp) lua_newuserdata(L, sizeof(t_udp));\n    auxiliar_setclass(L, \"udp{unconnected}\", -1);\n    /* if family is AF_UNSPEC, we leave the socket invalid and\n     * store AF_UNSPEC into family. This will allow it to later be\n     * replaced with an AF_INET6 or AF_INET socket upon first use. */\n    udp->sock = SOCKET_INVALID;\n    timeout_init(&udp->tm, -1, -1);\n    udp->family = family;\n    if (family != AF_UNSPEC) {\n        const char *err = inet_trycreate(&udp->sock, family, SOCK_DGRAM, 0);\n        if (err != NULL) {\n            lua_pushnil(L);\n            lua_pushstring(L, err);\n            return 2;\n        }\n        socket_setnonblocking(&udp->sock);\n    }\n    return 1;\n}\n\nstatic int global_create(lua_State *L) {\n    return udp_create(L, AF_UNSPEC);\n}\n\nstatic int global_create4(lua_State *L) {\n    return udp_create(L, AF_INET);\n}\n\nstatic int global_create6(lua_State *L) {\n    return udp_create(L, AF_INET6);\n}\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/udp.h",
    "content": "#ifndef UDP_H\n#define UDP_H\n/*=========================================================================*\\\n* UDP object\n* LuaSocket toolkit\n*\n* The udp.h module provides LuaSocket with support for UDP protocol\n* (AF_INET, SOCK_DGRAM).\n*\n* Two classes are defined: connected and unconnected. UDP objects are\n* originally unconnected. They can be \"connected\" to a given address\n* with a call to the setpeername function. The same function can be used to\n* break the connection.\n\\*=========================================================================*/\n#include \"luasocket.h\"\n\n#include \"timeout.h\"\n#include \"socket.h\"\n\n#define UDP_DATAGRAMSIZE 8192\n\ntypedef struct t_udp_ {\n    t_socket sock;\n    t_timeout tm;\n    int family;\n} t_udp;\ntypedef t_udp *p_udp;\n\n#ifndef _WIN32\n#pragma GCC visibility push(hidden)\n#endif\n\nint udp_open(lua_State *L);\n\n#ifndef _WIN32\n#pragma GCC visibility pop\n#endif\n\n#endif /* UDP_H */\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/unix.c",
    "content": "/*=========================================================================*\\\n* Unix domain socket\n* LuaSocket toolkit\n\\*=========================================================================*/\n#include \"luasocket.h\"\n\n#include \"unixstream.h\"\n#include \"unixdgram.h\"\n\n/*-------------------------------------------------------------------------*\\\n* Modules and functions\n\\*-------------------------------------------------------------------------*/\nstatic const luaL_Reg mod[] = {\n    {\"stream\", unixstream_open},\n    {\"dgram\", unixdgram_open},\n    {NULL, NULL}\n};\n\nstatic void add_alias(lua_State *L, int index, const char *name, const char *target)\n{\n    lua_getfield(L, index, target);\n    lua_setfield(L, index, name);\n}\n\nstatic int compat_socket_unix_call(lua_State *L)\n{\n    /* Look up socket.unix.stream in the socket.unix table (which is the first\n     * argument). */\n    lua_getfield(L, 1, \"stream\");\n\n    /* Replace the stack entry for the socket.unix table with the\n     * socket.unix.stream function. */\n    lua_replace(L, 1);\n\n    /* Call socket.unix.stream, passing along any arguments. */\n    int n = lua_gettop(L);\n    lua_call(L, n-1, LUA_MULTRET);\n\n    /* Pass along the return values from socket.unix.stream. */\n    n = lua_gettop(L);\n    return n;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Initializes module\n\\*-------------------------------------------------------------------------*/\nLUASOCKET_API int luaopen_socket_unix(lua_State *L)\n{\n    int i;\n    lua_newtable(L);\n    int socket_unix_table = lua_gettop(L);\n\n    for (i = 0; mod[i].name; i++)\n        mod[i].func(L);\n\n    /* Add backwards compatibility aliases \"tcp\" and \"udp\" for the \"stream\" and\n     * \"dgram\" functions. */\n    add_alias(L, socket_unix_table, \"tcp\", \"stream\");\n    add_alias(L, socket_unix_table, \"udp\", \"dgram\");\n\n    /* Add a backwards compatibility function and a metatable setup to call it\n     * for the old socket.unix() interface. */\n    lua_pushcfunction(L, compat_socket_unix_call);\n    lua_setfield(L, socket_unix_table, \"__call\");\n    lua_pushvalue(L, socket_unix_table);\n    lua_setmetatable(L, socket_unix_table);\n\n    return 1;\n}\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/unix.h",
    "content": "#ifndef UNIX_H\n#define UNIX_H\n/*=========================================================================*\\\n* Unix domain object\n* LuaSocket toolkit\n*\n* This module is just an example of how to extend LuaSocket with a new \n* domain.\n\\*=========================================================================*/\n#include \"luasocket.h\"\n\n#include \"buffer.h\"\n#include \"timeout.h\"\n#include \"socket.h\"\n\ntypedef struct t_unix_ {\n    t_socket sock;\n    t_io io;\n    t_buffer buf;\n    t_timeout tm;\n} t_unix;\ntypedef t_unix *p_unix;\n\nLUASOCKET_API int luaopen_socket_unix(lua_State *L);\n\n#endif /* UNIX_H */\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/unixdgram.c",
    "content": "/*=========================================================================*\\\n* Unix domain socket dgram submodule\n* LuaSocket toolkit\n\\*=========================================================================*/\n#include \"luasocket.h\"\n\n#include \"auxiliar.h\"\n#include \"socket.h\"\n#include \"options.h\"\n#include \"unix.h\"\n\n#include <string.h>\n#include <stdlib.h>\n\n#ifdef _WIN32\n#include <afunix.h>\n#else\n#include <sys/un.h>\n#endif\n\n#define UNIXDGRAM_DATAGRAMSIZE 8192\n\n/* provide a SUN_LEN macro if sys/un.h doesn't (e.g. Android) */\n#ifndef SUN_LEN\n#define SUN_LEN(ptr) \\\n  ((size_t) (((struct sockaddr_un *) 0)->sun_path)  \\\n   + strlen ((ptr)->sun_path))\n#endif\n\n/*=========================================================================*\\\n* Internal function prototypes\n\\*=========================================================================*/\nstatic int global_create(lua_State *L);\nstatic int meth_connect(lua_State *L);\nstatic int meth_bind(lua_State *L);\nstatic int meth_send(lua_State *L);\nstatic int meth_receive(lua_State *L);\nstatic int meth_close(lua_State *L);\nstatic int meth_setoption(lua_State *L);\nstatic int meth_settimeout(lua_State *L);\nstatic int meth_gettimeout(lua_State *L);\nstatic int meth_getfd(lua_State *L);\nstatic int meth_setfd(lua_State *L);\nstatic int meth_dirty(lua_State *L);\nstatic int meth_receivefrom(lua_State *L);\nstatic int meth_sendto(lua_State *L);\nstatic int meth_getsockname(lua_State *L);\n\nstatic const char *unixdgram_tryconnect(p_unix un, const char *path);\nstatic const char *unixdgram_trybind(p_unix un, const char *path);\n\n/* unixdgram object methods */\nstatic luaL_Reg unixdgram_methods[] = {\n    {\"__gc\",        meth_close},\n    {\"__tostring\",  auxiliar_tostring},\n    {\"bind\",        meth_bind},\n    {\"close\",       meth_close},\n    {\"connect\",     meth_connect},\n    {\"dirty\",       meth_dirty},\n    {\"getfd\",       meth_getfd},\n    {\"send\",        meth_send},\n    {\"sendto\",      meth_sendto},\n    {\"receive\",     meth_receive},\n    {\"receivefrom\", meth_receivefrom},\n    {\"setfd\",       meth_setfd},\n    {\"setoption\",   meth_setoption},\n    {\"setpeername\", meth_connect},\n    {\"setsockname\", meth_bind},\n    {\"getsockname\", meth_getsockname},\n    {\"settimeout\",  meth_settimeout},\n    {\"gettimeout\",  meth_gettimeout},\n    {NULL,          NULL}\n};\n\n/* socket option handlers */\nstatic t_opt optset[] = {\n    {\"reuseaddr\",   opt_set_reuseaddr},\n    {NULL,          NULL}\n};\n\n/* functions in library namespace */\nstatic luaL_Reg func[] = {\n    {\"dgram\", global_create},\n    {NULL, NULL}\n};\n\n/*-------------------------------------------------------------------------*\\\n* Initializes module\n\\*-------------------------------------------------------------------------*/\nint unixdgram_open(lua_State *L)\n{\n    /* create classes */\n    auxiliar_newclass(L, \"unixdgram{connected}\", unixdgram_methods);\n    auxiliar_newclass(L, \"unixdgram{unconnected}\", unixdgram_methods);\n    /* create class groups */\n    auxiliar_add2group(L, \"unixdgram{connected}\",   \"unixdgram{any}\");\n    auxiliar_add2group(L, \"unixdgram{unconnected}\", \"unixdgram{any}\");\n    auxiliar_add2group(L, \"unixdgram{connected}\",   \"select{able}\");\n    auxiliar_add2group(L, \"unixdgram{unconnected}\", \"select{able}\");\n\n    luaL_setfuncs(L, func, 0);\n    return 0;\n}\n\n/*=========================================================================*\\\n* Lua methods\n\\*=========================================================================*/\nstatic const char *unixdgram_strerror(int err)\n{\n    /* a 'closed' error on an unconnected means the target address was not\n     * accepted by the transport layer */\n    if (err == IO_CLOSED) return \"refused\";\n    else return socket_strerror(err);\n}\n\nstatic int meth_send(lua_State *L)\n{\n    p_unix un = (p_unix) auxiliar_checkclass(L, \"unixdgram{connected}\", 1);\n    p_timeout tm = &un->tm;\n    size_t count, sent = 0;\n    int err;\n    const char *data = luaL_checklstring(L, 2, &count);\n    timeout_markstart(tm);\n    err = socket_send(&un->sock, data, count, &sent, tm);\n    if (err != IO_DONE) {\n        lua_pushnil(L);\n        lua_pushstring(L, unixdgram_strerror(err));\n        return 2;\n    }\n    lua_pushnumber(L, (lua_Number) sent);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Send data through unconnected unixdgram socket\n\\*-------------------------------------------------------------------------*/\nstatic int meth_sendto(lua_State *L)\n{\n    p_unix un = (p_unix) auxiliar_checkclass(L, \"unixdgram{unconnected}\", 1);\n    size_t count, sent = 0;\n    const char *data = luaL_checklstring(L, 2, &count);\n    const char *path = luaL_checkstring(L, 3);\n    p_timeout tm = &un->tm;\n    int err;\n    struct sockaddr_un remote;\n    size_t len = strlen(path);\n\n    if (len >= sizeof(remote.sun_path)) {\n\t\tlua_pushnil(L);\n\t\tlua_pushstring(L, \"path too long\");\n\t\treturn 2;\n\t}\n\n    memset(&remote, 0, sizeof(remote));\n    strcpy(remote.sun_path, path);\n    remote.sun_family = AF_UNIX;\n    timeout_markstart(tm);\n#ifdef UNIX_HAS_SUN_LEN\n    remote.sun_len = sizeof(remote.sun_family) + sizeof(remote.sun_len)\n        + len + 1;\n    err = socket_sendto(&un->sock, data, count, &sent, (SA *) &remote, remote.sun_len, tm);\n#else\n    err = socket_sendto(&un->sock, data, count, &sent, (SA *) &remote,\n\t\t   \tsizeof(remote.sun_family) + len, tm);\n#endif\n    if (err != IO_DONE) {\n        lua_pushnil(L);\n        lua_pushstring(L, unixdgram_strerror(err));\n        return 2;\n    }\n    lua_pushnumber(L, (lua_Number) sent);\n    return 1;\n}\n\nstatic int meth_receive(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkgroup(L, \"unixdgram{any}\", 1);\n    char buf[UNIXDGRAM_DATAGRAMSIZE];\n    size_t got, wanted = (size_t) luaL_optnumber(L, 2, sizeof(buf));\n    char *dgram = wanted > sizeof(buf)? (char *) malloc(wanted): buf;\n    int err;\n    p_timeout tm = &un->tm;\n    timeout_markstart(tm);\n    if (!dgram) {\n        lua_pushnil(L);\n        lua_pushliteral(L, \"out of memory\");\n        return 2;\n    }\n    err = socket_recv(&un->sock, dgram, wanted, &got, tm);\n    /* Unlike STREAM, recv() of zero is not closed, but a zero-length packet. */\n    if (err != IO_DONE && err != IO_CLOSED) {\n        lua_pushnil(L);\n        lua_pushstring(L, unixdgram_strerror(err));\n        if (wanted > sizeof(buf)) free(dgram);\n        return 2;\n    }\n    lua_pushlstring(L, dgram, got);\n    if (wanted > sizeof(buf)) free(dgram);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Receives data and sender from a DGRAM socket\n\\*-------------------------------------------------------------------------*/\nstatic int meth_receivefrom(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkclass(L, \"unixdgram{unconnected}\", 1);\n    char buf[UNIXDGRAM_DATAGRAMSIZE];\n    size_t got, wanted = (size_t) luaL_optnumber(L, 2, sizeof(buf));\n    char *dgram = wanted > sizeof(buf)? (char *) malloc(wanted): buf;\n    struct sockaddr_un addr;\n    socklen_t addr_len = sizeof(addr);\n    int err;\n    p_timeout tm = &un->tm;\n    timeout_markstart(tm);\n    if (!dgram) {\n        lua_pushnil(L);\n        lua_pushliteral(L, \"out of memory\");\n        return 2;\n    }\n    addr.sun_path[0] = '\\0';\n    err = socket_recvfrom(&un->sock, dgram, wanted, &got, (SA *) &addr,\n            &addr_len, tm);\n    /* Unlike STREAM, recv() of zero is not closed, but a zero-length packet. */\n    if (err != IO_DONE && err != IO_CLOSED) {\n        lua_pushnil(L);\n        lua_pushstring(L, unixdgram_strerror(err));\n        if (wanted > sizeof(buf)) free(dgram);\n        return 2;\n    }\n\n    lua_pushlstring(L, dgram, got);\n\t/* the path may be empty, when client send without bind */\n    lua_pushstring(L, addr.sun_path);\n    if (wanted > sizeof(buf)) free(dgram);\n    return 2;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Just call option handler\n\\*-------------------------------------------------------------------------*/\nstatic int meth_setoption(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkgroup(L, \"unixdgram{any}\", 1);\n    return opt_meth_setoption(L, optset, &un->sock);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Select support methods\n\\*-------------------------------------------------------------------------*/\nstatic int meth_getfd(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkgroup(L, \"unixdgram{any}\", 1);\n    lua_pushnumber(L, (int) un->sock);\n    return 1;\n}\n\n/* this is very dangerous, but can be handy for those that are brave enough */\nstatic int meth_setfd(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkgroup(L, \"unixdgram{any}\", 1);\n    un->sock = (t_socket) luaL_checknumber(L, 2);\n    return 0;\n}\n\nstatic int meth_dirty(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkgroup(L, \"unixdgram{any}\", 1);\n    (void) un;\n    lua_pushboolean(L, 0);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Binds an object to an address\n\\*-------------------------------------------------------------------------*/\nstatic const char *unixdgram_trybind(p_unix un, const char *path) {\n    struct sockaddr_un local;\n    size_t len = strlen(path);\n    if (len >= sizeof(local.sun_path)) return \"path too long\";\n    memset(&local, 0, sizeof(local));\n    strcpy(local.sun_path, path);\n    local.sun_family = AF_UNIX;\n    size_t addrlen = SUN_LEN(&local);\n#ifdef UNIX_HAS_SUN_LEN\n    local.sun_len = addrlen + 1;\n#endif\n    int err = socket_bind(&un->sock, (SA *) &local, addrlen);\n    if (err != IO_DONE) socket_destroy(&un->sock);\n    return socket_strerror(err);\n}\n\nstatic int meth_bind(lua_State *L)\n{\n    p_unix un = (p_unix) auxiliar_checkclass(L, \"unixdgram{unconnected}\", 1);\n    const char *path =  luaL_checkstring(L, 2);\n    const char *err = unixdgram_trybind(un, path);\n    if (err) {\n        lua_pushnil(L);\n        lua_pushstring(L, err);\n        return 2;\n    }\n    lua_pushnumber(L, 1);\n    return 1;\n}\n\nstatic int meth_getsockname(lua_State *L)\n{\n    p_unix un = (p_unix) auxiliar_checkgroup(L, \"unixdgram{any}\", 1);\n    struct sockaddr_un peer = {0};\n    socklen_t peer_len = sizeof(peer);\n\n    if (getsockname(un->sock, (SA *) &peer, &peer_len) < 0) {\n        lua_pushnil(L);\n        lua_pushstring(L, socket_strerror(errno));\n        return 2;\n    }\n\n    lua_pushstring(L, peer.sun_path);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Turns a master unixdgram object into a client object.\n\\*-------------------------------------------------------------------------*/\nstatic const char *unixdgram_tryconnect(p_unix un, const char *path)\n{\n    struct sockaddr_un remote;\n    size_t len = strlen(path);\n    if (len >= sizeof(remote.sun_path)) return \"path too long\";\n    memset(&remote, 0, sizeof(remote));\n    strcpy(remote.sun_path, path);\n    remote.sun_family = AF_UNIX;\n    timeout_markstart(&un->tm);\n    size_t addrlen = SUN_LEN(&remote);\n#ifdef UNIX_HAS_SUN_LEN\n    remote.sun_len = addrlen + 1;\n#endif\n    int err = socket_connect(&un->sock, (SA *) &remote, addrlen, &un->tm);\n    if (err != IO_DONE) socket_destroy(&un->sock);\n    return socket_strerror(err);\n}\n\nstatic int meth_connect(lua_State *L)\n{\n    p_unix un = (p_unix) auxiliar_checkgroup(L, \"unixdgram{any}\", 1);\n    const char *path =  luaL_checkstring(L, 2);\n    const char *err = unixdgram_tryconnect(un, path);\n    if (err) {\n        lua_pushnil(L);\n        lua_pushstring(L, err);\n        return 2;\n    }\n    /* turn unconnected object into a connected object */\n    auxiliar_setclass(L, \"unixdgram{connected}\", 1);\n    lua_pushnumber(L, 1);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Closes socket used by object\n\\*-------------------------------------------------------------------------*/\nstatic int meth_close(lua_State *L)\n{\n    p_unix un = (p_unix) auxiliar_checkgroup(L, \"unixdgram{any}\", 1);\n    socket_destroy(&un->sock);\n    lua_pushnumber(L, 1);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Just call tm methods\n\\*-------------------------------------------------------------------------*/\nstatic int meth_settimeout(lua_State *L)\n{\n    p_unix un = (p_unix) auxiliar_checkgroup(L, \"unixdgram{any}\", 1);\n    return timeout_meth_settimeout(L, &un->tm);\n}\n\nstatic int meth_gettimeout(lua_State *L)\n{\n    p_unix un = (p_unix) auxiliar_checkgroup(L, \"unixdgram{any}\", 1);\n    return timeout_meth_gettimeout(L, &un->tm);\n}\n\n/*=========================================================================*\\\n* Library functions\n\\*=========================================================================*/\n/*-------------------------------------------------------------------------*\\\n* Creates a master unixdgram object\n\\*-------------------------------------------------------------------------*/\nstatic int global_create(lua_State *L)\n{\n    t_socket sock;\n    int err = socket_create(&sock, AF_UNIX, SOCK_DGRAM, 0);\n    /* try to allocate a system socket */\n    if (err == IO_DONE) {\n        /* allocate unixdgram object */\n        p_unix un = (p_unix) lua_newuserdata(L, sizeof(t_unix));\n        /* set its type as master object */\n        auxiliar_setclass(L, \"unixdgram{unconnected}\", -1);\n        /* initialize remaining structure fields */\n        socket_setnonblocking(&sock);\n        un->sock = sock;\n        io_init(&un->io, (p_send) socket_send, (p_recv) socket_recv,\n                (p_error) socket_ioerror, &un->sock);\n        timeout_init(&un->tm, -1, -1);\n        buffer_init(&un->buf, &un->io, &un->tm);\n        return 1;\n    } else {\n        lua_pushnil(L);\n        lua_pushstring(L, socket_strerror(err));\n        return 2;\n    }\n}\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/unixdgram.h",
    "content": "#ifndef UNIXDGRAM_H\n#define UNIXDGRAM_H\n/*=========================================================================*\\\n* DGRAM object\n* LuaSocket toolkit\n*\n* The dgram.h module provides LuaSocket with support for DGRAM protocol\n* (AF_INET, SOCK_DGRAM).\n*\n* Two classes are defined: connected and unconnected. DGRAM objects are\n* originally unconnected. They can be \"connected\" to a given address\n* with a call to the setpeername function. The same function can be used to\n* break the connection.\n\\*=========================================================================*/\n\n#include \"unix.h\"\n\n#ifndef _WIN32\n#pragma GCC visibility push(hidden)\n#endif\n\nint unixdgram_open(lua_State *L);\n\n#ifndef _WIN32\n#pragma GCC visibility pop\n#endif\n\n#endif /* UNIXDGRAM_H */\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/unixstream.c",
    "content": "/*=========================================================================*\\\n* Unix domain socket stream sub module\n* LuaSocket toolkit\n\\*=========================================================================*/\n#include \"luasocket.h\"\n\n#include \"auxiliar.h\"\n#include \"socket.h\"\n#include \"options.h\"\n#include \"unixstream.h\"\n\n#include <string.h>\n\n#ifdef _WIN32\n#include <afunix.h>\n#else\n#include <sys/un.h>\n#endif\n\n/*=========================================================================*\\\n* Internal function prototypes\n\\*=========================================================================*/\nstatic int global_create(lua_State *L);\nstatic int meth_connect(lua_State *L);\nstatic int meth_listen(lua_State *L);\nstatic int meth_bind(lua_State *L);\nstatic int meth_send(lua_State *L);\nstatic int meth_shutdown(lua_State *L);\nstatic int meth_receive(lua_State *L);\nstatic int meth_accept(lua_State *L);\nstatic int meth_close(lua_State *L);\nstatic int meth_setoption(lua_State *L);\nstatic int meth_settimeout(lua_State *L);\nstatic int meth_getfd(lua_State *L);\nstatic int meth_setfd(lua_State *L);\nstatic int meth_dirty(lua_State *L);\nstatic int meth_getstats(lua_State *L);\nstatic int meth_setstats(lua_State *L);\nstatic int meth_getsockname(lua_State *L);\n\nstatic const char *unixstream_tryconnect(p_unix un, const char *path);\nstatic const char *unixstream_trybind(p_unix un, const char *path);\n\n/* unixstream object methods */\nstatic luaL_Reg unixstream_methods[] = {\n    {\"__gc\",        meth_close},\n    {\"__tostring\",  auxiliar_tostring},\n    {\"accept\",      meth_accept},\n    {\"bind\",        meth_bind},\n    {\"close\",       meth_close},\n    {\"connect\",     meth_connect},\n    {\"dirty\",       meth_dirty},\n    {\"getfd\",       meth_getfd},\n    {\"getstats\",    meth_getstats},\n    {\"setstats\",    meth_setstats},\n    {\"listen\",      meth_listen},\n    {\"receive\",     meth_receive},\n    {\"send\",        meth_send},\n    {\"setfd\",       meth_setfd},\n    {\"setoption\",   meth_setoption},\n    {\"setpeername\", meth_connect},\n    {\"setsockname\", meth_bind},\n    {\"getsockname\", meth_getsockname},\n    {\"settimeout\",  meth_settimeout},\n    {\"shutdown\",    meth_shutdown},\n    {NULL,          NULL}\n};\n\n/* socket option handlers */\nstatic t_opt optset[] = {\n    {\"keepalive\",   opt_set_keepalive},\n    {\"reuseaddr\",   opt_set_reuseaddr},\n    {\"linger\",      opt_set_linger},\n    {NULL,          NULL}\n};\n\n/* functions in library namespace */\nstatic luaL_Reg func[] = {\n    {\"stream\", global_create},\n    {NULL, NULL}\n};\n\n/*-------------------------------------------------------------------------*\\\n* Initializes module\n\\*-------------------------------------------------------------------------*/\nint unixstream_open(lua_State *L)\n{\n    /* create classes */\n    auxiliar_newclass(L, \"unixstream{master}\", unixstream_methods);\n    auxiliar_newclass(L, \"unixstream{client}\", unixstream_methods);\n    auxiliar_newclass(L, \"unixstream{server}\", unixstream_methods);\n\n    /* create class groups */\n    auxiliar_add2group(L, \"unixstream{master}\", \"unixstream{any}\");\n    auxiliar_add2group(L, \"unixstream{client}\", \"unixstream{any}\");\n    auxiliar_add2group(L, \"unixstream{server}\", \"unixstream{any}\");\n\n    luaL_setfuncs(L, func, 0);\n    return 0;\n}\n\n/*=========================================================================*\\\n* Lua methods\n\\*=========================================================================*/\n/*-------------------------------------------------------------------------*\\\n* Just call buffered IO methods\n\\*-------------------------------------------------------------------------*/\nstatic int meth_send(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkclass(L, \"unixstream{client}\", 1);\n    return buffer_meth_send(L, &un->buf);\n}\n\nstatic int meth_receive(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkclass(L, \"unixstream{client}\", 1);\n    return buffer_meth_receive(L, &un->buf);\n}\n\nstatic int meth_getstats(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkclass(L, \"unixstream{client}\", 1);\n    return buffer_meth_getstats(L, &un->buf);\n}\n\nstatic int meth_setstats(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkclass(L, \"unixstream{client}\", 1);\n    return buffer_meth_setstats(L, &un->buf);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Just call option handler\n\\*-------------------------------------------------------------------------*/\nstatic int meth_setoption(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkgroup(L, \"unixstream{any}\", 1);\n    return opt_meth_setoption(L, optset, &un->sock);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Select support methods\n\\*-------------------------------------------------------------------------*/\nstatic int meth_getfd(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkgroup(L, \"unixstream{any}\", 1);\n    lua_pushnumber(L, (int) un->sock);\n    return 1;\n}\n\n/* this is very dangerous, but can be handy for those that are brave enough */\nstatic int meth_setfd(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkgroup(L, \"unixstream{any}\", 1);\n    un->sock = (t_socket) luaL_checknumber(L, 2);\n    return 0;\n}\n\nstatic int meth_dirty(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkgroup(L, \"unixstream{any}\", 1);\n    lua_pushboolean(L, !buffer_isempty(&un->buf));\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Waits for and returns a client object attempting connection to the\n* server object\n\\*-------------------------------------------------------------------------*/\nstatic int meth_accept(lua_State *L) {\n    p_unix server = (p_unix) auxiliar_checkclass(L, \"unixstream{server}\", 1);\n    p_timeout tm = timeout_markstart(&server->tm);\n    t_socket sock;\n    int err = socket_accept(&server->sock, &sock, NULL, NULL, tm);\n    /* if successful, push client socket */\n    if (err == IO_DONE) {\n        p_unix clnt = (p_unix) lua_newuserdata(L, sizeof(t_unix));\n        auxiliar_setclass(L, \"unixstream{client}\", -1);\n        /* initialize structure fields */\n        socket_setnonblocking(&sock);\n        clnt->sock = sock;\n        io_init(&clnt->io, (p_send)socket_send, (p_recv)socket_recv,\n                (p_error) socket_ioerror, &clnt->sock);\n        timeout_init(&clnt->tm, -1, -1);\n        buffer_init(&clnt->buf, &clnt->io, &clnt->tm);\n        return 1;\n    } else {\n        lua_pushnil(L);\n        lua_pushstring(L, socket_strerror(err));\n        return 2;\n    }\n}\n\n/*-------------------------------------------------------------------------*\\\n* Binds an object to an address\n\\*-------------------------------------------------------------------------*/\nstatic const char *unixstream_trybind(p_unix un, const char *path) {\n    struct sockaddr_un local;\n    size_t len = strlen(path);\n    int err;\n    if (len >= sizeof(local.sun_path)) return \"path too long\";\n    memset(&local, 0, sizeof(local));\n    strcpy(local.sun_path, path);\n    local.sun_family = AF_UNIX;\n#ifdef UNIX_HAS_SUN_LEN\n    local.sun_len = sizeof(local.sun_family) + sizeof(local.sun_len)\n        + len + 1;\n    err = socket_bind(&un->sock, (SA *) &local, local.sun_len);\n\n#else\n    err = socket_bind(&un->sock, (SA *) &local,\n            sizeof(local.sun_family) + len);\n#endif\n    if (err != IO_DONE) socket_destroy(&un->sock);\n    return socket_strerror(err);\n}\n\nstatic int meth_bind(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkclass(L, \"unixstream{master}\", 1);\n    const char *path =  luaL_checkstring(L, 2);\n    const char *err = unixstream_trybind(un, path);\n    if (err) {\n        lua_pushnil(L);\n        lua_pushstring(L, err);\n        return 2;\n    }\n    lua_pushnumber(L, 1);\n    return 1;\n}\n\nstatic int meth_getsockname(lua_State *L)\n{\n    p_unix un = (p_unix) auxiliar_checkgroup(L, \"unixstream{any}\", 1);\n    struct sockaddr_un peer = {0};\n    socklen_t peer_len = sizeof(peer);\n\n    if (getsockname(un->sock, (SA *) &peer, &peer_len) < 0) {\n        lua_pushnil(L);\n        lua_pushstring(L, socket_strerror(errno));\n        return 2;\n    }\n\n    lua_pushstring(L, peer.sun_path);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Turns a master unixstream object into a client object.\n\\*-------------------------------------------------------------------------*/\nstatic const char *unixstream_tryconnect(p_unix un, const char *path)\n{\n    struct sockaddr_un remote;\n    int err;\n    size_t len = strlen(path);\n    if (len >= sizeof(remote.sun_path)) return \"path too long\";\n    memset(&remote, 0, sizeof(remote));\n    strcpy(remote.sun_path, path);\n    remote.sun_family = AF_UNIX;\n    timeout_markstart(&un->tm);\n#ifdef UNIX_HAS_SUN_LEN\n    remote.sun_len = sizeof(remote.sun_family) + sizeof(remote.sun_len)\n        + len + 1;\n    err = socket_connect(&un->sock, (SA *) &remote, remote.sun_len, &un->tm);\n#else\n    err = socket_connect(&un->sock, (SA *) &remote,\n            sizeof(remote.sun_family) + len, &un->tm);\n#endif\n    if (err != IO_DONE) socket_destroy(&un->sock);\n    return socket_strerror(err);\n}\n\nstatic int meth_connect(lua_State *L)\n{\n    p_unix un = (p_unix) auxiliar_checkclass(L, \"unixstream{master}\", 1);\n    const char *path =  luaL_checkstring(L, 2);\n    const char *err = unixstream_tryconnect(un, path);\n    if (err) {\n        lua_pushnil(L);\n        lua_pushstring(L, err);\n        return 2;\n    }\n    /* turn master object into a client object */\n    auxiliar_setclass(L, \"unixstream{client}\", 1);\n    lua_pushnumber(L, 1);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Closes socket used by object\n\\*-------------------------------------------------------------------------*/\nstatic int meth_close(lua_State *L)\n{\n    p_unix un = (p_unix) auxiliar_checkgroup(L, \"unixstream{any}\", 1);\n    socket_destroy(&un->sock);\n    lua_pushnumber(L, 1);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Puts the sockt in listen mode\n\\*-------------------------------------------------------------------------*/\nstatic int meth_listen(lua_State *L)\n{\n    p_unix un = (p_unix) auxiliar_checkclass(L, \"unixstream{master}\", 1);\n    int backlog = (int) luaL_optnumber(L, 2, 32);\n    int err = socket_listen(&un->sock, backlog);\n    if (err != IO_DONE) {\n        lua_pushnil(L);\n        lua_pushstring(L, socket_strerror(err));\n        return 2;\n    }\n    /* turn master object into a server object */\n    auxiliar_setclass(L, \"unixstream{server}\", 1);\n    lua_pushnumber(L, 1);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Shuts the connection down partially\n\\*-------------------------------------------------------------------------*/\nstatic int meth_shutdown(lua_State *L)\n{\n    /* SHUT_RD,  SHUT_WR,  SHUT_RDWR  have  the value 0, 1, 2, so we can use method index directly */\n    static const char* methods[] = { \"receive\", \"send\", \"both\", NULL };\n    p_unix stream = (p_unix) auxiliar_checkclass(L, \"unixstream{client}\", 1);\n    int how = luaL_checkoption(L, 2, \"both\", methods);\n    socket_shutdown(&stream->sock, how);\n    lua_pushnumber(L, 1);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Just call tm methods\n\\*-------------------------------------------------------------------------*/\nstatic int meth_settimeout(lua_State *L) {\n    p_unix un = (p_unix) auxiliar_checkgroup(L, \"unixstream{any}\", 1);\n    return timeout_meth_settimeout(L, &un->tm);\n}\n\n/*=========================================================================*\\\n* Library functions\n\\*=========================================================================*/\n/*-------------------------------------------------------------------------*\\\n* Creates a master unixstream object\n\\*-------------------------------------------------------------------------*/\nstatic int global_create(lua_State *L) {\n    t_socket sock;\n    int err = socket_create(&sock, AF_UNIX, SOCK_STREAM, 0);\n    /* try to allocate a system socket */\n    if (err == IO_DONE) {\n        /* allocate unixstream object */\n        p_unix un = (p_unix) lua_newuserdata(L, sizeof(t_unix));\n        /* set its type as master object */\n        auxiliar_setclass(L, \"unixstream{master}\", -1);\n        /* initialize remaining structure fields */\n        socket_setnonblocking(&sock);\n        un->sock = sock;\n        io_init(&un->io, (p_send) socket_send, (p_recv) socket_recv,\n                (p_error) socket_ioerror, &un->sock);\n        timeout_init(&un->tm, -1, -1);\n        buffer_init(&un->buf, &un->io, &un->tm);\n        return 1;\n    } else {\n        lua_pushnil(L);\n        lua_pushstring(L, socket_strerror(err));\n        return 2;\n    }\n}\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/unixstream.h",
    "content": "#ifndef UNIXSTREAM_H\n#define UNIXSTREAM_H\n/*=========================================================================*\\\n* UNIX STREAM object\n* LuaSocket toolkit\n*\n* The unixstream.h module is basicly a glue that puts together modules buffer.h,\n* timeout.h socket.h and inet.h to provide the LuaSocket UNIX STREAM (AF_UNIX,\n* SOCK_STREAM) support.\n*\n* Three classes are defined: master, client and server. The master class is\n* a newly created unixstream object, that has not been bound or connected. Server\n* objects are unixstream objects bound to some local address. Client objects are\n* unixstream objects either connected to some address or returned by the accept\n* method of a server object.\n\\*=========================================================================*/\n#include \"unix.h\"\n\n#ifndef _WIN32\n#pragma GCC visibility push(hidden)\n#endif\n\nint unixstream_open(lua_State *L);\n\n#ifndef _WIN32\n#pragma GCC visibility pop\n#endif\n\n#endif /* UNIXSTREAM_H */\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/url.lua",
    "content": "-----------------------------------------------------------------------------\n-- URI parsing, composition and relative URL resolution\n-- LuaSocket toolkit.\n-- Author: Diego Nehab\n-----------------------------------------------------------------------------\n\n-----------------------------------------------------------------------------\n-- Declare module\n-----------------------------------------------------------------------------\nlocal string = require(\"string\")\nlocal base = _G\nlocal table = require(\"table\")\nlocal socket = require(\"socket\")\n\nsocket.url = {}\nlocal _M = socket.url\n\n-----------------------------------------------------------------------------\n-- Module version\n-----------------------------------------------------------------------------\n_M._VERSION = \"URL 1.0.3\"\n\n-----------------------------------------------------------------------------\n-- Encodes a string into its escaped hexadecimal representation\n-- Input\n--   s: binary string to be encoded\n-- Returns\n--   escaped representation of string binary\n-----------------------------------------------------------------------------\nfunction _M.escape(s)\n    return (string.gsub(s, \"([^A-Za-z0-9_])\", function(c)\n        return string.format(\"%%%02x\", string.byte(c))\n    end))\nend\n\n-----------------------------------------------------------------------------\n-- Protects a path segment, to prevent it from interfering with the\n-- url parsing.\n-- Input\n--   s: binary string to be encoded\n-- Returns\n--   escaped representation of string binary\n-----------------------------------------------------------------------------\nlocal function make_set(t)\n    local s = {}\n    for i,v in base.ipairs(t) do\n        s[t[i]] = 1\n    end\n    return s\nend\n\n-- these are allowed within a path segment, along with alphanum\n-- other characters must be escaped\nlocal segment_set = make_set {\n    \"-\", \"_\", \".\", \"!\", \"~\", \"*\", \"'\", \"(\",\n    \")\", \":\", \"@\", \"&\", \"=\", \"+\", \"$\", \",\",\n}\n\nlocal function protect_segment(s)\n    return string.gsub(s, \"([^A-Za-z0-9_])\", function (c)\n        if segment_set[c] then return c\n        else return string.format(\"%%%02X\", string.byte(c)) end\n    end)\nend\n\n-----------------------------------------------------------------------------\n-- Unencodes a escaped hexadecimal string into its binary representation\n-- Input\n--   s: escaped hexadecimal string to be unencoded\n-- Returns\n--   unescaped binary representation of escaped hexadecimal  binary\n-----------------------------------------------------------------------------\nfunction _M.unescape(s)\n    return (string.gsub(s, \"%%(%x%x)\", function(hex)\n        return string.char(base.tonumber(hex, 16))\n    end))\nend\n\n-----------------------------------------------------------------------------\n-- Removes '..' and '.' components appropriately from a path.\n-- Input\n--   path\n-- Returns\n--   dot-normalized path\nlocal function remove_dot_components(path)\n    local marker = string.char(1)\n    repeat\n        local was = path\n        path = path:gsub('//', '/'..marker..'/', 1)\n    until path == was\n    repeat\n        local was = path\n        path = path:gsub('/%./', '/', 1)\n    until path == was\n    repeat\n        local was = path\n        path = path:gsub('[^/]+/%.%./([^/]+)', '%1', 1)\n    until path == was\n    path = path:gsub('[^/]+/%.%./*$', '')\n    path = path:gsub('/%.%.$', '/')\n    path = path:gsub('/%.$', '/')\n    path = path:gsub('^/%.%./', '/')\n    path = path:gsub(marker, '')\n    return path\nend\n\n-----------------------------------------------------------------------------\n-- Builds a path from a base path and a relative path\n-- Input\n--   base_path\n--   relative_path\n-- Returns\n--   corresponding absolute path\n-----------------------------------------------------------------------------\nlocal function absolute_path(base_path, relative_path)\n    if string.sub(relative_path, 1, 1) == \"/\" then\n      return remove_dot_components(relative_path) end\n    base_path = base_path:gsub(\"[^/]*$\", \"\")\n    if not base_path:find'/$' then base_path = base_path .. '/' end\n    local path = base_path .. relative_path\n    path = remove_dot_components(path)\n    return path\nend\n\n-----------------------------------------------------------------------------\n-- Parses a url and returns a table with all its parts according to RFC 2396\n-- The following grammar describes the names given to the URL parts\n-- <url> ::= <scheme>://<authority>/<path>;<params>?<query>#<fragment>\n-- <authority> ::= <userinfo>@<host>:<port>\n-- <userinfo> ::= <user>[:<password>]\n-- <path> :: = {<segment>/}<segment>\n-- Input\n--   url: uniform resource locator of request\n--   default: table with default values for each field\n-- Returns\n--   table with the following fields, where RFC naming conventions have\n--   been preserved:\n--     scheme, authority, userinfo, user, password, host, port,\n--     path, params, query, fragment\n-- Obs:\n--   the leading '/' in {/<path>} is considered part of <path>\n-----------------------------------------------------------------------------\nfunction _M.parse(url, default)\n    -- initialize default parameters\n    local parsed = {}\n    for i,v in base.pairs(default or parsed) do parsed[i] = v end\n    -- empty url is parsed to nil\n    if not url or url == \"\" then return nil, \"invalid url\" end\n    -- remove whitespace\n    -- url = string.gsub(url, \"%s\", \"\")\n    -- get scheme\n    url = string.gsub(url, \"^([%w][%w%+%-%.]*)%:\",\n        function(s) parsed.scheme = s; return \"\" end)\n    -- get authority\n    url = string.gsub(url, \"^//([^/%?#]*)\", function(n)\n        parsed.authority = n\n        return \"\"\n    end)\n    -- get fragment\n    url = string.gsub(url, \"#(.*)$\", function(f)\n        parsed.fragment = f\n        return \"\"\n    end)\n    -- get query string\n    url = string.gsub(url, \"%?(.*)\", function(q)\n        parsed.query = q\n        return \"\"\n    end)\n    -- get params\n    url = string.gsub(url, \"%;(.*)\", function(p)\n        parsed.params = p\n        return \"\"\n    end)\n    -- path is whatever was left\n    if url ~= \"\" then parsed.path = url end\n    local authority = parsed.authority\n    if not authority then return parsed end\n    authority = string.gsub(authority,\"^([^@]*)@\",\n        function(u) parsed.userinfo = u; return \"\" end)\n    authority = string.gsub(authority, \":([^:%]]*)$\",\n        function(p) parsed.port = p; return \"\" end)\n    if authority ~= \"\" then\n        -- IPv6?\n        parsed.host = string.match(authority, \"^%[(.+)%]$\") or authority\n    end\n    local userinfo = parsed.userinfo\n    if not userinfo then return parsed end\n    userinfo = string.gsub(userinfo, \":([^:]*)$\",\n        function(p) parsed.password = p; return \"\" end)\n    parsed.user = userinfo\n    return parsed\nend\n\n-----------------------------------------------------------------------------\n-- Rebuilds a parsed URL from its components.\n-- Components are protected if any reserved or unallowed characters are found\n-- Input\n--   parsed: parsed URL, as returned by parse\n-- Returns\n--   a stringing with the corresponding URL\n-----------------------------------------------------------------------------\nfunction _M.build(parsed)\n    --local ppath = _M.parse_path(parsed.path or \"\")\n    --local url = _M.build_path(ppath)\n    local url = parsed.path or \"\"\n    if parsed.params then url = url .. \";\" .. parsed.params end\n    if parsed.query then url = url .. \"?\" .. parsed.query end\n    local authority = parsed.authority\n    if parsed.host then\n        authority = parsed.host\n        if string.find(authority, \":\") then -- IPv6?\n            authority = \"[\" .. authority .. \"]\"\n        end\n        if parsed.port then authority = authority .. \":\" .. base.tostring(parsed.port) end\n        local userinfo = parsed.userinfo\n        if parsed.user then\n            userinfo = parsed.user\n            if parsed.password then\n                userinfo = userinfo .. \":\" .. parsed.password\n            end\n        end\n        if userinfo then authority = userinfo .. \"@\" .. authority end\n    end\n    if authority then url = \"//\" .. authority .. url end\n    if parsed.scheme then url = parsed.scheme .. \":\" .. url end\n    if parsed.fragment then url = url .. \"#\" .. parsed.fragment end\n    -- url = string.gsub(url, \"%s\", \"\")\n    return url\nend\n\n-----------------------------------------------------------------------------\n-- Builds a absolute URL from a base and a relative URL according to RFC 2396\n-- Input\n--   base_url\n--   relative_url\n-- Returns\n--   corresponding absolute url\n-----------------------------------------------------------------------------\nfunction _M.absolute(base_url, relative_url)\n    local base_parsed\n    if base.type(base_url) == \"table\" then\n        base_parsed = base_url\n        base_url = _M.build(base_parsed)\n    else\n        base_parsed = _M.parse(base_url)\n    end\n    local result\n    local relative_parsed = _M.parse(relative_url)\n    if not base_parsed then\n        result = relative_url\n    elseif not relative_parsed then\n        result = base_url\n    elseif relative_parsed.scheme then\n        result = relative_url\n    else\n        relative_parsed.scheme = base_parsed.scheme\n        if not relative_parsed.authority then\n            relative_parsed.authority = base_parsed.authority\n            if not relative_parsed.path then\n                relative_parsed.path = base_parsed.path\n                if not relative_parsed.params then\n                    relative_parsed.params = base_parsed.params\n                    if not relative_parsed.query then\n                        relative_parsed.query = base_parsed.query\n                    end\n                end\n            else\n                relative_parsed.path = absolute_path(base_parsed.path or \"\",\n                    relative_parsed.path)\n            end\n        end\n        result = _M.build(relative_parsed)\n    end\n    return remove_dot_components(result)\nend\n\n-----------------------------------------------------------------------------\n-- Breaks a path into its segments, unescaping the segments\n-- Input\n--   path\n-- Returns\n--   segment: a table with one entry per segment\n-----------------------------------------------------------------------------\nfunction _M.parse_path(path)\n    local parsed = {}\n    path = path or \"\"\n    --path = string.gsub(path, \"%s\", \"\")\n    string.gsub(path, \"([^/]+)\", function (s) table.insert(parsed, s) end)\n    for i = 1, #parsed do\n        parsed[i] = _M.unescape(parsed[i])\n    end\n    if string.sub(path, 1, 1) == \"/\" then parsed.is_absolute = 1 end\n    if string.sub(path, -1, -1) == \"/\" then parsed.is_directory = 1 end\n    return parsed\nend\n\n-----------------------------------------------------------------------------\n-- Builds a path component from its segments, escaping protected characters.\n-- Input\n--   parsed: path segments\n--   unsafe: if true, segments are not protected before path is built\n-- Returns\n--   path: corresponding path stringing\n-----------------------------------------------------------------------------\nfunction _M.build_path(parsed, unsafe)\n    local path = \"\"\n    local n = #parsed\n    if unsafe then\n        for i = 1, n-1 do\n            path = path .. parsed[i]\n            path = path .. \"/\"\n        end\n        if n > 0 then\n            path = path .. parsed[n]\n            if parsed.is_directory then path = path .. \"/\" end\n        end\n    else\n        for i = 1, n-1 do\n            path = path .. protect_segment(parsed[i])\n            path = path .. \"/\"\n        end\n        if n > 0 then\n            path = path .. protect_segment(parsed[n])\n            if parsed.is_directory then path = path .. \"/\" end\n        end\n    end\n    if parsed.is_absolute then path = \"/\" .. path end\n    return path\nend\n\nreturn _M\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/url.lua.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n * \n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n * \n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n * \n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\nnamespace love\n{\n\n// [url.lua]\nconst unsigned char url_lua[] = \n{\n\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x55, 0x52, 0x49, 0x20, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x63, 0x6f, \n\t0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x6c, 0x61, \n\t0x74, 0x69, 0x76, 0x65, 0x20, 0x55, 0x52, 0x4c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, \n\t0x6e, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x4c, 0x75, 0x61, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0x6b, \n\t0x69, 0x74, 0x2e, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x3a, 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x20, 0x4e, \n\t0x65, 0x68, 0x61, 0x62, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, \n\t0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x47, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, \n\t0x69, 0x72, 0x65, 0x28, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, \n\t0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x29, 0x0a,\n\t0x0a,\n\t0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x75, 0x72, 0x6c, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x4d, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, \n\t0x75, 0x72, 0x6c, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x5f, 0x4d, 0x2e, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x20, 0x3d, 0x20, 0x22, 0x55, 0x52, 0x4c, \n\t0x20, 0x31, 0x2e, 0x30, 0x2e, 0x33, 0x22, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x61, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, \n\t0x67, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x69, 0x74, 0x73, 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x64, \n\t0x20, 0x68, 0x65, 0x78, 0x61, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, \n\t0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x73, 0x3a, 0x20, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x20, 0x73, 0x74, 0x72, \n\t0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x64, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, \n\t0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, \n\t0x67, 0x20, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, \n\t0x28, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, \n\t0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x20, 0x22, 0x28, 0x5b, 0x5e, 0x41, 0x2d, 0x5a, 0x61, 0x2d, \n\t0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x5d, 0x29, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, \n\t0x28, 0x63, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, \n\t0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x25, 0x25, 0x30, 0x32, 0x78, \n\t0x22, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x28, 0x63, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x73, 0x20, 0x61, 0x20, 0x70, 0x61, 0x74, 0x68, \n\t0x20, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x65, 0x76, 0x65, \n\t0x6e, 0x74, 0x20, 0x69, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x65, \n\t0x72, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x2e, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x73, 0x3a, 0x20, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x20, 0x73, 0x74, 0x72, \n\t0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x64, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, \n\t0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, \n\t0x67, 0x20, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x6b, \n\t0x65, 0x5f, 0x73, 0x65, 0x74, 0x28, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x62, 0x61, 0x73, \n\t0x65, 0x2e, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x5b, 0x74, 0x5b, 0x69, 0x5d, 0x5d, 0x20, 0x3d, 0x20, \n\t0x31, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, \n\t0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x73, \n\t0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, \n\t0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x6e, 0x75, 0x6d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, \n\t0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x64, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x20, \n\t0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x7b, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x22, 0x2d, 0x22, 0x2c, 0x20, 0x22, 0x5f, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x2c, \n\t0x20, 0x22, 0x21, 0x22, 0x2c, 0x20, 0x22, 0x7e, 0x22, 0x2c, 0x20, 0x22, 0x2a, 0x22, 0x2c, 0x20, 0x22, 0x27, \n\t0x22, 0x2c, 0x20, 0x22, 0x28, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x22, 0x29, 0x22, 0x2c, 0x20, 0x22, 0x3a, 0x22, 0x2c, 0x20, 0x22, 0x40, 0x22, 0x2c, \n\t0x20, 0x22, 0x26, 0x22, 0x2c, 0x20, 0x22, 0x3d, 0x22, 0x2c, 0x20, 0x22, 0x2b, 0x22, 0x2c, 0x20, 0x22, 0x24, \n\t0x22, 0x2c, 0x20, 0x22, 0x2c, 0x22, 0x2c, 0x0a,\n\t0x7d, 0x0a,\n\t0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, \n\t0x74, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, \n\t0x67, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x20, 0x22, 0x28, 0x5b, 0x5e, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, \n\t0x30, 0x2d, 0x39, 0x5f, 0x5d, 0x29, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, \n\t0x28, 0x63, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, \n\t0x5f, 0x73, 0x65, 0x74, 0x5b, 0x63, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, \n\t0x6e, 0x20, 0x63, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, \n\t0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, \n\t0x25, 0x25, 0x30, 0x32, 0x58, 0x22, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x79, 0x74, \n\t0x65, 0x28, 0x63, 0x29, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x55, 0x6e, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x61, 0x20, 0x65, 0x73, 0x63, \n\t0x61, 0x70, 0x65, 0x64, 0x20, 0x68, 0x65, 0x78, 0x61, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x73, \n\t0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x69, 0x74, 0x73, 0x20, 0x62, 0x69, 0x6e, \n\t0x61, 0x72, 0x79, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x73, 0x3a, 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x64, 0x20, 0x68, 0x65, \n\t0x78, 0x61, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, \n\t0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, 0x6e, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x64, 0x20, 0x62, 0x69, 0x6e, \n\t0x61, 0x72, 0x79, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, \n\t0x20, 0x6f, 0x66, 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x64, 0x20, 0x68, 0x65, 0x78, 0x61, 0x64, 0x65, \n\t0x63, 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x20, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x75, 0x6e, 0x65, 0x73, 0x63, 0x61, \n\t0x70, 0x65, 0x28, 0x73, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, \n\t0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x20, 0x22, 0x25, 0x25, 0x28, 0x25, 0x78, 0x25, 0x78, 0x29, \n\t0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x68, 0x65, 0x78, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, \n\t0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x74, 0x6f, 0x6e, 0x75, \n\t0x6d, 0x62, 0x65, 0x72, 0x28, 0x68, 0x65, 0x78, 0x2c, 0x20, 0x31, 0x36, 0x29, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x20, 0x27, 0x2e, 0x2e, 0x27, 0x20, 0x61, 0x6e, \n\t0x64, 0x20, 0x27, 0x2e, 0x27, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, \n\t0x70, 0x70, 0x72, 0x6f, 0x70, 0x72, 0x69, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, \n\t0x61, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x74, 0x2d, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, \n\t0x64, 0x20, 0x70, 0x61, 0x74, 0x68, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x6d, \n\t0x6f, 0x76, 0x65, 0x5f, 0x64, 0x6f, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, \n\t0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x20, 0x3d, \n\t0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x31, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x61, 0x73, 0x20, \n\t0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, \n\t0x68, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x27, 0x2f, 0x2f, 0x27, 0x2c, 0x20, 0x27, 0x2f, 0x27, 0x2e, 0x2e, \n\t0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2e, 0x2e, 0x27, 0x2f, 0x27, 0x2c, 0x20, 0x31, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x20, \n\t0x77, 0x61, 0x73, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x61, 0x73, 0x20, \n\t0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, \n\t0x68, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x27, 0x2f, 0x25, 0x2e, 0x2f, 0x27, 0x2c, 0x20, 0x27, 0x2f, 0x27, \n\t0x2c, 0x20, 0x31, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x20, \n\t0x77, 0x61, 0x73, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x61, 0x73, 0x20, \n\t0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, \n\t0x68, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x27, 0x5b, 0x5e, 0x2f, 0x5d, 0x2b, 0x2f, 0x25, 0x2e, 0x25, 0x2e, \n\t0x2f, 0x28, 0x5b, 0x5e, 0x2f, 0x5d, 0x2b, 0x29, 0x27, 0x2c, 0x20, 0x27, 0x25, 0x31, 0x27, 0x2c, 0x20, 0x31, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x20, \n\t0x77, 0x61, 0x73, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x67, 0x73, \n\t0x75, 0x62, 0x28, 0x27, 0x5b, 0x5e, 0x2f, 0x5d, 0x2b, 0x2f, 0x25, 0x2e, 0x25, 0x2e, 0x2f, 0x2a, 0x24, 0x27, \n\t0x2c, 0x20, 0x27, 0x27, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x67, 0x73, \n\t0x75, 0x62, 0x28, 0x27, 0x2f, 0x25, 0x2e, 0x25, 0x2e, 0x24, 0x27, 0x2c, 0x20, 0x27, 0x2f, 0x27, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x67, 0x73, \n\t0x75, 0x62, 0x28, 0x27, 0x2f, 0x25, 0x2e, 0x24, 0x27, 0x2c, 0x20, 0x27, 0x2f, 0x27, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x67, 0x73, \n\t0x75, 0x62, 0x28, 0x27, 0x5e, 0x2f, 0x25, 0x2e, 0x25, 0x2e, 0x2f, 0x27, 0x2c, 0x20, 0x27, 0x2f, 0x27, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x67, 0x73, \n\t0x75, 0x62, 0x28, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2c, 0x20, 0x27, 0x27, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x20, 0x61, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x66, \n\t0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x61, 0x6e, \n\t0x64, 0x20, 0x61, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x70, 0x61, 0x74, 0x68, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, \n\t0x20, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x20, 0x70, 0x61, 0x74, 0x68, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x73, \n\t0x6f, 0x6c, 0x75, 0x74, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x70, 0x61, \n\t0x74, 0x68, 0x2c, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x73, 0x75, 0x62, 0x28, \n\t0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x31, 0x2c, 0x20, \n\t0x31, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x2f, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, \n\t0x65, 0x5f, 0x64, 0x6f, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x28, 0x72, \n\t0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x62, 0x61, \n\t0x73, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5b, 0x5e, 0x2f, 0x5d, \n\t0x2a, 0x24, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x70, 0x61, \n\t0x74, 0x68, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x27, 0x2f, 0x24, 0x27, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x62, \n\t0x61, 0x73, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x70, 0x61, \n\t0x74, 0x68, 0x20, 0x2e, 0x2e, 0x20, 0x27, 0x2f, 0x27, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x62, \n\t0x61, 0x73, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x2e, 0x2e, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, \n\t0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, \n\t0x64, 0x6f, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x28, 0x70, 0x61, 0x74, \n\t0x68, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x50, 0x61, 0x72, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x61, 0x6e, \n\t0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, \n\t0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x69, 0x74, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, \n\t0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x52, 0x46, 0x43, 0x20, \n\t0x32, 0x33, 0x39, 0x36, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x54, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x67, \n\t0x72, 0x61, 0x6d, 0x6d, 0x61, 0x72, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x73, 0x20, 0x74, \n\t0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x74, 0x6f, 0x20, \n\t0x74, 0x68, 0x65, 0x20, 0x55, 0x52, 0x4c, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x3c, 0x75, 0x72, 0x6c, 0x3e, 0x20, 0x3a, 0x3a, 0x3d, 0x20, 0x3c, 0x73, 0x63, 0x68, 0x65, \n\t0x6d, 0x65, 0x3e, 0x3a, 0x2f, 0x2f, 0x3c, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x3e, 0x2f, \n\t0x3c, 0x70, 0x61, 0x74, 0x68, 0x3e, 0x3b, 0x3c, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3e, 0x3f, 0x3c, 0x71, \n\t0x75, 0x65, 0x72, 0x79, 0x3e, 0x23, 0x3c, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x3e, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x3c, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x3e, 0x20, 0x3a, 0x3a, 0x3d, \n\t0x20, 0x3c, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x3e, 0x40, 0x3c, 0x68, 0x6f, 0x73, 0x74, 0x3e, \n\t0x3a, 0x3c, 0x70, 0x6f, 0x72, 0x74, 0x3e, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x3c, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x3e, 0x20, 0x3a, 0x3a, 0x3d, 0x20, \n\t0x3c, 0x75, 0x73, 0x65, 0x72, 0x3e, 0x5b, 0x3a, 0x3c, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x3e, \n\t0x5d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x3c, 0x70, 0x61, 0x74, 0x68, 0x3e, 0x20, 0x3a, 0x3a, 0x20, 0x3d, 0x20, 0x7b, 0x3c, 0x73, \n\t0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x3e, 0x2f, 0x7d, 0x3c, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x3e, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x75, 0x72, 0x6c, 0x3a, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, \n\t0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x6f, \n\t0x66, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x20, 0x74, 0x61, 0x62, 0x6c, \n\t0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, \n\t0x75, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, \n\t0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, \n\t0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x52, 0x46, 0x43, 0x20, 0x6e, 0x61, 0x6d, 0x69, 0x6e, 0x67, \n\t0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x68, 0x61, 0x76, 0x65, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, \n\t0x64, 0x3a, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x75, 0x74, \n\t0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x2c, 0x20, \n\t0x75, 0x73, 0x65, 0x72, 0x2c, 0x20, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x68, 0x6f, \n\t0x73, 0x74, 0x2c, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x2c, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, \n\t0x73, 0x2c, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x4f, 0x62, 0x73, 0x3a, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x27, \n\t0x2f, 0x27, 0x20, 0x69, 0x6e, 0x20, 0x7b, 0x2f, 0x3c, 0x70, 0x61, 0x74, 0x68, 0x3e, 0x7d, 0x20, 0x69, 0x73, \n\t0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, \n\t0x66, 0x20, 0x3c, 0x70, 0x61, 0x74, 0x68, 0x3e, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, \n\t0x75, 0x72, 0x6c, 0x2c, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x20, \n\t0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x3d, \n\t0x20, 0x7b, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x62, 0x61, 0x73, \n\t0x65, 0x2e, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x6f, 0x72, \n\t0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x29, 0x20, 0x64, 0x6f, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, \n\t0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x69, \n\t0x73, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6e, 0x69, 0x6c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x6f, 0x72, 0x20, \n\t0x75, 0x72, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, \n\t0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x22, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, \n\t0x75, 0x72, 0x6c, 0x22, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x77, 0x68, 0x69, 0x74, \n\t0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, \n\t0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x75, 0x72, 0x6c, 0x2c, 0x20, 0x22, 0x25, 0x73, 0x22, 0x2c, 0x20, \n\t0x22, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x67, 0x65, 0x74, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, \n\t0x73, 0x75, 0x62, 0x28, 0x75, 0x72, 0x6c, 0x2c, 0x20, 0x22, 0x5e, 0x28, 0x5b, 0x25, 0x77, 0x5d, 0x5b, 0x25, \n\t0x77, 0x25, 0x2b, 0x25, 0x2d, 0x25, 0x2e, 0x5d, 0x2a, 0x29, 0x25, 0x3a, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, \n\t0x29, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x20, 0x3d, 0x20, \n\t0x73, 0x3b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x22, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x67, 0x65, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, \n\t0x74, 0x79, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, \n\t0x73, 0x75, 0x62, 0x28, 0x75, 0x72, 0x6c, 0x2c, 0x20, 0x22, 0x5e, 0x2f, 0x2f, 0x28, 0x5b, 0x5e, 0x2f, 0x25, \n\t0x3f, 0x23, 0x5d, 0x2a, 0x29, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x61, 0x75, 0x74, \n\t0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x67, 0x65, 0x74, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, \n\t0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, \n\t0x73, 0x75, 0x62, 0x28, 0x75, 0x72, 0x6c, 0x2c, 0x20, 0x22, 0x23, 0x28, 0x2e, 0x2a, 0x29, 0x24, 0x22, 0x2c, \n\t0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x66, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x66, 0x72, 0x61, \n\t0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x67, 0x65, 0x74, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x20, 0x73, \n\t0x74, 0x72, 0x69, 0x6e, 0x67, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, \n\t0x73, 0x75, 0x62, 0x28, 0x75, 0x72, 0x6c, 0x2c, 0x20, 0x22, 0x25, 0x3f, 0x28, 0x2e, 0x2a, 0x29, 0x22, 0x2c, \n\t0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x71, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x71, 0x75, 0x65, \n\t0x72, 0x79, 0x20, 0x3d, 0x20, 0x71, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x67, 0x65, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, \n\t0x73, 0x75, 0x62, 0x28, 0x75, 0x72, 0x6c, 0x2c, 0x20, 0x22, 0x25, 0x3b, 0x28, 0x2e, 0x2a, 0x29, 0x22, 0x2c, \n\t0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x70, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x70, 0x61, 0x72, \n\t0x61, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x69, 0x73, 0x20, 0x77, 0x68, 0x61, \n\t0x74, 0x65, 0x76, 0x65, 0x72, 0x20, 0x77, 0x61, 0x73, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x22, 0x20, 0x74, \n\t0x68, 0x65, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, \n\t0x75, 0x72, 0x6c, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, \n\t0x79, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, \n\t0x74, 0x79, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, \n\t0x74, 0x79, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, \n\t0x73, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x73, 0x74, \n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, \n\t0x79, 0x2c, 0x22, 0x5e, 0x28, 0x5b, 0x5e, 0x40, 0x5d, 0x2a, 0x29, 0x40, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x75, \n\t0x29, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x20, \n\t0x3d, 0x20, 0x75, 0x3b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x22, 0x20, 0x65, 0x6e, 0x64, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x73, 0x74, \n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, \n\t0x79, 0x2c, 0x20, 0x22, 0x3a, 0x28, 0x5b, 0x5e, 0x3a, 0x25, 0x5d, 0x5d, 0x2a, 0x29, 0x24, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x70, \n\t0x29, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x3b, \n\t0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x22, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x7e, \n\t0x3d, 0x20, 0x22, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x49, 0x50, 0x76, 0x36, 0x3f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x68, 0x6f, 0x73, \n\t0x74, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x61, \n\t0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x22, 0x5e, 0x25, 0x5b, 0x28, 0x2e, 0x2b, 0x29, \n\t0x25, 0x5d, 0x24, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, \n\t0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, \n\t0x6f, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, \n\t0x65, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, \n\t0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x2c, \n\t0x20, 0x22, 0x3a, 0x28, 0x5b, 0x5e, 0x3a, 0x5d, 0x2a, 0x29, 0x24, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x70, \n\t0x29, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x20, \n\t0x3d, 0x20, 0x70, 0x3b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x22, 0x20, 0x65, 0x6e, 0x64, \n\t0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x20, 0x3d, 0x20, \n\t0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x73, \n\t0x65, 0x64, 0x20, 0x55, 0x52, 0x4c, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x69, 0x74, 0x73, 0x20, 0x63, 0x6f, \n\t0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, \n\t0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x69, 0x66, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x72, \n\t0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, \n\t0x65, 0x64, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, \n\t0x66, 0x6f, 0x75, 0x6e, 0x64, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x3a, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, \n\t0x64, 0x20, 0x55, 0x52, 0x4c, 0x2c, 0x20, 0x61, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, \n\t0x20, 0x62, 0x79, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x61, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x77, \n\t0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, \n\t0x69, 0x6e, 0x67, 0x20, 0x55, 0x52, 0x4c, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x28, \n\t0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x70, 0x61, 0x74, 0x68, 0x20, \n\t0x3d, 0x20, 0x5f, 0x4d, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x70, 0x61, \n\t0x72, 0x73, 0x65, 0x64, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x3d, 0x20, \n\t0x5f, 0x4d, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x70, 0x70, 0x61, 0x74, \n\t0x68, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x3d, 0x20, 0x70, 0x61, \n\t0x72, 0x73, 0x65, 0x64, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, \n\t0x6d, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x3d, 0x20, 0x75, 0x72, 0x6c, 0x20, \n\t0x2e, 0x2e, 0x20, 0x22, 0x3b, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x70, \n\t0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x71, 0x75, 0x65, 0x72, \n\t0x79, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x3d, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x2e, \n\t0x2e, 0x20, 0x22, 0x3f, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x71, 0x75, \n\t0x65, 0x72, 0x79, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, \n\t0x79, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, \n\t0x74, 0x79, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x68, 0x6f, 0x73, 0x74, \n\t0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, \n\t0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, \n\t0x66, 0x69, 0x6e, 0x64, 0x28, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x22, 0x3a, \n\t0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x2d, 0x2d, 0x20, 0x49, 0x50, 0x76, 0x36, 0x3f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, \n\t0x69, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x22, 0x5b, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, \n\t0x72, 0x69, 0x74, 0x79, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5d, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, \n\t0x70, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, \n\t0x79, 0x20, 0x3d, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2e, 0x2e, 0x20, 0x22, \n\t0x3a, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, \n\t0x67, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x73, 0x65, 0x72, \n\t0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, \n\t0x69, 0x6e, 0x66, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, \n\t0x75, 0x73, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, \n\t0x66, 0x6f, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x61, 0x72, \n\t0x73, 0x65, 0x64, 0x2e, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x73, \n\t0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x20, \n\t0x2e, 0x2e, 0x20, 0x22, 0x3a, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x70, \n\t0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, \n\t0x6f, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x3d, \n\t0x20, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x40, 0x22, 0x20, 0x2e, \n\t0x2e, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x74, \n\t0x68, 0x65, 0x6e, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x3d, 0x20, 0x22, 0x2f, 0x2f, 0x22, 0x20, 0x2e, 0x2e, 0x20, \n\t0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2e, 0x2e, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x65, \n\t0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x73, 0x63, 0x68, 0x65, \n\t0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, \n\t0x65, 0x64, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x3a, 0x22, 0x20, 0x2e, \n\t0x2e, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x66, 0x72, 0x61, 0x67, \n\t0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x3d, 0x20, 0x75, 0x72, \n\t0x6c, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x23, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, \n\t0x2e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, \n\t0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x75, 0x72, 0x6c, 0x2c, 0x20, 0x22, 0x25, 0x73, 0x22, 0x2c, 0x20, \n\t0x22, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x72, 0x6c, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x20, 0x61, 0x20, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, \n\t0x74, 0x65, 0x20, 0x55, 0x52, 0x4c, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x62, 0x61, 0x73, 0x65, \n\t0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x55, 0x52, \n\t0x4c, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x52, 0x46, 0x43, \n\t0x20, 0x32, 0x33, 0x39, 0x36, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, \n\t0x20, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x20, 0x75, 0x72, 0x6c, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, \n\t0x74, 0x65, 0x28, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x2c, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, \n\t0x69, 0x76, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x70, 0x61, 0x72, \n\t0x73, 0x65, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x62, \n\t0x61, 0x73, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, \n\t0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, \n\t0x64, 0x20, 0x3d, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x20, 0x3d, \n\t0x20, 0x5f, 0x4d, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x28, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x70, 0x61, 0x72, \n\t0x73, 0x65, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, \n\t0x64, 0x20, 0x3d, 0x20, 0x5f, 0x4d, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x62, 0x61, 0x73, 0x65, 0x5f, \n\t0x75, 0x72, 0x6c, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, \n\t0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x5f, 0x4d, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, \n\t0x28, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x70, 0x61, \n\t0x72, 0x73, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x20, 0x72, \n\t0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x6c, \n\t0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x20, 0x62, \n\t0x61, 0x73, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, \n\t0x65, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x20, 0x74, 0x68, \n\t0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x20, 0x72, \n\t0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, \n\t0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x62, 0x61, 0x73, \n\t0x65, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x6c, \n\t0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x6f, \n\t0x72, 0x69, 0x74, 0x79, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, \n\t0x76, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, \n\t0x79, 0x20, 0x3d, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x61, 0x75, \n\t0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, \n\t0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x70, \n\t0x61, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, \n\t0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x70, 0x61, 0x74, 0x68, \n\t0x20, 0x3d, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x70, 0x61, 0x74, \n\t0x68, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, \n\t0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x73, \n\t0x65, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, \n\t0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x73, \n\t0x65, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, \n\t0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x72, \n\t0x73, 0x65, 0x64, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x70, \n\t0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, \n\t0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, \n\t0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x70, 0x61, 0x74, 0x68, \n\t0x20, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x62, \n\t0x61, 0x73, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x20, 0x6f, 0x72, \n\t0x20, 0x22, 0x22, 0x2c, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \n\t0x20, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, \n\t0x70, 0x61, 0x74, 0x68, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x20, 0x5f, \n\t0x4d, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x28, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, \n\t0x61, 0x72, 0x73, 0x65, 0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, \n\t0x64, 0x6f, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x28, 0x72, 0x65, 0x73, \n\t0x75, 0x6c, 0x74, 0x29, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x73, 0x20, 0x61, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x69, \n\t0x6e, 0x74, 0x6f, 0x20, 0x69, 0x74, 0x73, 0x20, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, \n\t0x75, 0x6e, 0x65, 0x73, 0x63, 0x61, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x67, \n\t0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x61, 0x20, 0x74, 0x61, \n\t0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x79, \n\t0x20, 0x70, 0x65, 0x72, 0x20, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, \n\t0x70, 0x61, 0x74, 0x68, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x3d, \n\t0x20, 0x7b, 0x7d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x6f, 0x72, \n\t0x20, 0x22, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, \n\t0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x22, 0x25, 0x73, 0x22, 0x2c, \n\t0x20, 0x22, 0x22, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x70, 0x61, \n\t0x74, 0x68, 0x2c, 0x20, 0x22, 0x28, 0x5b, 0x5e, 0x2f, 0x5d, 0x2b, 0x29, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, \n\t0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x73, 0x29, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, \n\t0x73, 0x65, 0x72, 0x74, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2c, 0x20, 0x73, 0x29, 0x20, 0x65, 0x6e, \n\t0x64, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x70, 0x61, \n\t0x72, 0x73, 0x65, 0x64, 0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x5b, 0x69, 0x5d, 0x20, \n\t0x3d, 0x20, 0x5f, 0x4d, 0x2e, 0x75, 0x6e, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x28, 0x70, 0x61, 0x72, 0x73, \n\t0x65, 0x64, 0x5b, 0x69, 0x5d, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x73, 0x75, 0x62, 0x28, \n\t0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x2f, 0x22, \n\t0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x69, 0x73, 0x5f, 0x61, 0x62, \n\t0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x31, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x73, 0x75, 0x62, 0x28, \n\t0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x2d, 0x31, 0x2c, 0x20, 0x2d, 0x31, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, \n\t0x2f, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x69, 0x73, 0x5f, \n\t0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x31, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x20, 0x61, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x63, \n\t0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x69, 0x74, 0x73, 0x20, \n\t0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x69, 0x6e, 0x67, \n\t0x20, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, \n\t0x65, 0x72, 0x73, 0x2e, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, \n\t0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x3a, 0x20, 0x69, 0x66, 0x20, 0x74, 0x72, \n\t0x75, 0x65, 0x2c, 0x20, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, \n\t0x6f, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, \n\t0x65, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x69, 0x73, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x0a,\n\t0x2d, 0x2d, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, \n\t0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, \n\t0x69, 0x6e, 0x67, 0x0a,\n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, \n\t0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x4d, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, \n\t0x70, 0x61, 0x74, 0x68, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2c, 0x20, 0x75, 0x6e, 0x73, 0x61, 0x66, \n\t0x65, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x22, \n\t0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x20, 0x3d, 0x20, 0x23, 0x70, 0x61, 0x72, \n\t0x73, 0x65, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, \n\t0x20, 0x6e, 0x2d, 0x31, 0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, \n\t0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x5b, 0x69, 0x5d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, \n\t0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2f, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x74, \n\t0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, \n\t0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x5b, 0x6e, 0x5d, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x61, 0x72, \n\t0x73, 0x65, 0x64, 0x2e, 0x69, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x74, \n\t0x68, 0x65, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x2e, 0x2e, \n\t0x20, 0x22, 0x2f, 0x22, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, \n\t0x20, 0x6e, 0x2d, 0x31, 0x20, 0x64, 0x6f, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, \n\t0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x5f, 0x73, \n\t0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x5b, 0x69, 0x5d, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, \n\t0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2f, 0x22, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x74, \n\t0x68, 0x65, 0x6e, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, \n\t0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x5f, 0x73, \n\t0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x5b, 0x6e, 0x5d, 0x29, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x61, 0x72, \n\t0x73, 0x65, 0x64, 0x2e, 0x69, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x74, \n\t0x68, 0x65, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x2e, 0x2e, \n\t0x20, 0x22, 0x2f, 0x22, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x69, 0x73, 0x5f, 0x61, \n\t0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, \n\t0x3d, 0x20, 0x22, 0x2f, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x4d, 0x0a,\n}; // [url.lua]\n} // love\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/usocket.c",
    "content": "/*=========================================================================*\\\n* Socket compatibilization module for Unix\n* LuaSocket toolkit\n*\n* The code is now interrupt-safe.\n* The penalty of calling select to avoid busy-wait is only paid when\n* the I/O call fail in the first place.\n\\*=========================================================================*/\n#include \"luasocket.h\"\n\n#include \"socket.h\"\n#include \"pierror.h\"\n\n#include <string.h>\n#include <signal.h>\n\n/*-------------------------------------------------------------------------*\\\n* Wait for readable/writable/connected socket with timeout\n\\*-------------------------------------------------------------------------*/\n#ifndef SOCKET_SELECT\n#include <sys/poll.h>\n\n#define WAITFD_R        POLLIN\n#define WAITFD_W        POLLOUT\n#define WAITFD_C        (POLLIN|POLLOUT)\nint socket_waitfd(p_socket ps, int sw, p_timeout tm) {\n    int ret;\n    struct pollfd pfd;\n    pfd.fd = *ps;\n    pfd.events = sw;\n    pfd.revents = 0;\n    if (timeout_iszero(tm)) return IO_TIMEOUT;  /* optimize timeout == 0 case */\n    do {\n        int t = (int)(timeout_getretry(tm)*1e3);\n        ret = poll(&pfd, 1, t >= 0? t: -1);\n    } while (ret == -1 && errno == EINTR);\n    if (ret == -1) return errno;\n    if (ret == 0) return IO_TIMEOUT;\n    if (sw == WAITFD_C && (pfd.revents & (POLLIN|POLLERR))) return IO_CLOSED;\n    return IO_DONE;\n}\n#else\n\n#define WAITFD_R        1\n#define WAITFD_W        2\n#define WAITFD_C        (WAITFD_R|WAITFD_W)\n\nint socket_waitfd(p_socket ps, int sw, p_timeout tm) {\n    int ret;\n    fd_set rfds, wfds, *rp, *wp;\n    struct timeval tv, *tp;\n    double t;\n    if (*ps >= FD_SETSIZE) return EINVAL;\n    if (timeout_iszero(tm)) return IO_TIMEOUT;  /* optimize timeout == 0 case */\n    do {\n        /* must set bits within loop, because select may have modifed them */\n        rp = wp = NULL;\n        if (sw & WAITFD_R) { FD_ZERO(&rfds); FD_SET(*ps, &rfds); rp = &rfds; }\n        if (sw & WAITFD_W) { FD_ZERO(&wfds); FD_SET(*ps, &wfds); wp = &wfds; }\n        t = timeout_getretry(tm);\n        tp = NULL;\n        if (t >= 0.0) {\n            tv.tv_sec = (int)t;\n            tv.tv_usec = (int)((t-tv.tv_sec)*1.0e6);\n            tp = &tv;\n        }\n        ret = select(*ps+1, rp, wp, NULL, tp);\n    } while (ret == -1 && errno == EINTR);\n    if (ret == -1) return errno;\n    if (ret == 0) return IO_TIMEOUT;\n    if (sw == WAITFD_C && FD_ISSET(*ps, &rfds)) return IO_CLOSED;\n    return IO_DONE;\n}\n#endif\n\n\n/*-------------------------------------------------------------------------*\\\n* Initializes module\n\\*-------------------------------------------------------------------------*/\nint socket_open(void) {\n    /* installs a handler to ignore sigpipe or it will crash us */\n    signal(SIGPIPE, SIG_IGN);\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Close module\n\\*-------------------------------------------------------------------------*/\nint socket_close(void) {\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Close and inutilize socket\n\\*-------------------------------------------------------------------------*/\nvoid socket_destroy(p_socket ps) {\n    if (*ps != SOCKET_INVALID) {\n        close(*ps);\n        *ps = SOCKET_INVALID;\n    }\n}\n\n/*-------------------------------------------------------------------------*\\\n* Select with timeout control\n\\*-------------------------------------------------------------------------*/\nint socket_select(t_socket n, fd_set *rfds, fd_set *wfds, fd_set *efds,\n        p_timeout tm) {\n    int ret;\n    do {\n        struct timeval tv;\n        double t = timeout_getretry(tm);\n        tv.tv_sec = (int) t;\n        tv.tv_usec = (int) ((t - tv.tv_sec) * 1.0e6);\n        /* timeout = 0 means no wait */\n        ret = select(n, rfds, wfds, efds, t >= 0.0 ? &tv: NULL);\n    } while (ret < 0 && errno == EINTR);\n    return ret;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Creates and sets up a socket\n\\*-------------------------------------------------------------------------*/\nint socket_create(p_socket ps, int domain, int type, int protocol) {\n    *ps = socket(domain, type, protocol);\n    if (*ps != SOCKET_INVALID) return IO_DONE;\n    else return errno;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Binds or returns error message\n\\*-------------------------------------------------------------------------*/\nint socket_bind(p_socket ps, SA *addr, socklen_t len) {\n    int err = IO_DONE;\n    socket_setblocking(ps);\n    if (bind(*ps, addr, len) < 0) err = errno;\n    socket_setnonblocking(ps);\n    return err;\n}\n\n/*-------------------------------------------------------------------------*\\\n*\n\\*-------------------------------------------------------------------------*/\nint socket_listen(p_socket ps, int backlog) {\n    int err = IO_DONE;\n    if (listen(*ps, backlog)) err = errno;\n    return err;\n}\n\n/*-------------------------------------------------------------------------*\\\n*\n\\*-------------------------------------------------------------------------*/\nvoid socket_shutdown(p_socket ps, int how) {\n    shutdown(*ps, how);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Connects or returns error message\n\\*-------------------------------------------------------------------------*/\nint socket_connect(p_socket ps, SA *addr, socklen_t len, p_timeout tm) {\n    int err;\n    /* avoid calling on closed sockets */\n    if (*ps == SOCKET_INVALID) return IO_CLOSED;\n    /* call connect until done or failed without being interrupted */\n    do if (connect(*ps, addr, len) == 0) return IO_DONE;\n    while ((err = errno) == EINTR);\n    /* if connection failed immediately, return error code */\n    if (err != EINPROGRESS && err != EAGAIN) return err;\n    /* zero timeout case optimization */\n    if (timeout_iszero(tm)) return IO_TIMEOUT;\n    /* wait until we have the result of the connection attempt or timeout */\n    err = socket_waitfd(ps, WAITFD_C, tm);\n    if (err == IO_CLOSED) {\n        if (recv(*ps, (char *) &err, 0, 0) == 0) return IO_DONE;\n        else return errno;\n    } else return err;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Accept with timeout\n\\*-------------------------------------------------------------------------*/\nint socket_accept(p_socket ps, p_socket pa, SA *addr, socklen_t *len, p_timeout tm) {\n    if (*ps == SOCKET_INVALID) return IO_CLOSED;\n    for ( ;; ) {\n        int err;\n        if ((*pa = accept(*ps, addr, len)) != SOCKET_INVALID) return IO_DONE;\n        err = errno;\n        if (err == EINTR) continue;\n        if (err != EAGAIN && err != ECONNABORTED) return err;\n        if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;\n    }\n    /* can't reach here */\n    return IO_UNKNOWN;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Send with timeout\n\\*-------------------------------------------------------------------------*/\nint socket_send(p_socket ps, const char *data, size_t count,\n        size_t *sent, p_timeout tm)\n{\n    int err;\n    *sent = 0;\n    /* avoid making system calls on closed sockets */\n    if (*ps == SOCKET_INVALID) return IO_CLOSED;\n    /* loop until we send something or we give up on error */\n    for ( ;; ) {\n        long put = (long) send(*ps, data, count, 0);\n        /* if we sent anything, we are done */\n        if (put >= 0) {\n            *sent = put;\n            return IO_DONE;\n        }\n        err = errno;\n        /* EPIPE means the connection was closed */\n        if (err == EPIPE) return IO_CLOSED;\n        /* EPROTOTYPE means the connection is being closed (on Yosemite!)*/\n        if (err == EPROTOTYPE) continue;\n        /* we call was interrupted, just try again */\n        if (err == EINTR) continue;\n        /* if failed fatal reason, report error */\n        if (err != EAGAIN) return err;\n        /* wait until we can send something or we timeout */\n        if ((err = socket_waitfd(ps, WAITFD_W, tm)) != IO_DONE) return err;\n    }\n    /* can't reach here */\n    return IO_UNKNOWN;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Sendto with timeout\n\\*-------------------------------------------------------------------------*/\nint socket_sendto(p_socket ps, const char *data, size_t count, size_t *sent,\n        SA *addr, socklen_t len, p_timeout tm)\n{\n    int err;\n    *sent = 0;\n    if (*ps == SOCKET_INVALID) return IO_CLOSED;\n    for ( ;; ) {\n        long put = (long) sendto(*ps, data, count, 0, addr, len);\n        if (put >= 0) {\n            *sent = put;\n            return IO_DONE;\n        }\n        err = errno;\n        if (err == EPIPE) return IO_CLOSED;\n        if (err == EPROTOTYPE) continue;\n        if (err == EINTR) continue;\n        if (err != EAGAIN) return err;\n        if ((err = socket_waitfd(ps, WAITFD_W, tm)) != IO_DONE) return err;\n    }\n    return IO_UNKNOWN;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Receive with timeout\n\\*-------------------------------------------------------------------------*/\nint socket_recv(p_socket ps, char *data, size_t count, size_t *got, p_timeout tm) {\n    int err;\n    *got = 0;\n    if (*ps == SOCKET_INVALID) return IO_CLOSED;\n    for ( ;; ) {\n        long taken = (long) recv(*ps, data, count, 0);\n        if (taken > 0) {\n            *got = taken;\n            return IO_DONE;\n        }\n        err = errno;\n        if (taken == 0) return IO_CLOSED;\n        if (err == EINTR) continue;\n        if (err != EAGAIN) return err;\n        if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;\n    }\n    return IO_UNKNOWN;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Recvfrom with timeout\n\\*-------------------------------------------------------------------------*/\nint socket_recvfrom(p_socket ps, char *data, size_t count, size_t *got,\n        SA *addr, socklen_t *len, p_timeout tm) {\n    int err;\n    *got = 0;\n    if (*ps == SOCKET_INVALID) return IO_CLOSED;\n    for ( ;; ) {\n        long taken = (long) recvfrom(*ps, data, count, 0, addr, len);\n        if (taken > 0) {\n            *got = taken;\n            return IO_DONE;\n        }\n        err = errno;\n        if (taken == 0) return IO_CLOSED;\n        if (err == EINTR) continue;\n        if (err != EAGAIN) return err;\n        if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;\n    }\n    return IO_UNKNOWN;\n}\n\n\n/*-------------------------------------------------------------------------*\\\n* Write with timeout\n*\n* socket_read and socket_write are cut-n-paste of socket_send and socket_recv,\n* with send/recv replaced with write/read. We can't just use write/read\n* in the socket version, because behaviour when size is zero is different.\n\\*-------------------------------------------------------------------------*/\nint socket_write(p_socket ps, const char *data, size_t count,\n        size_t *sent, p_timeout tm)\n{\n    int err;\n    *sent = 0;\n    /* avoid making system calls on closed sockets */\n    if (*ps == SOCKET_INVALID) return IO_CLOSED;\n    /* loop until we send something or we give up on error */\n    for ( ;; ) {\n        long put = (long) write(*ps, data, count);\n        /* if we sent anything, we are done */\n        if (put >= 0) {\n            *sent = put;\n            return IO_DONE;\n        }\n        err = errno;\n        /* EPIPE means the connection was closed */\n        if (err == EPIPE) return IO_CLOSED;\n        /* EPROTOTYPE means the connection is being closed (on Yosemite!)*/\n        if (err == EPROTOTYPE) continue;\n        /* we call was interrupted, just try again */\n        if (err == EINTR) continue;\n        /* if failed fatal reason, report error */\n        if (err != EAGAIN) return err;\n        /* wait until we can send something or we timeout */\n        if ((err = socket_waitfd(ps, WAITFD_W, tm)) != IO_DONE) return err;\n    }\n    /* can't reach here */\n    return IO_UNKNOWN;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Read with timeout\n* See note for socket_write\n\\*-------------------------------------------------------------------------*/\nint socket_read(p_socket ps, char *data, size_t count, size_t *got, p_timeout tm) {\n    int err;\n    *got = 0;\n    if (*ps == SOCKET_INVALID) return IO_CLOSED;\n    for ( ;; ) {\n        long taken = (long) read(*ps, data, count);\n        if (taken > 0) {\n            *got = taken;\n            return IO_DONE;\n        }\n        err = errno;\n        if (taken == 0) return IO_CLOSED;\n        if (err == EINTR) continue;\n        if (err != EAGAIN) return err;\n        if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;\n    }\n    return IO_UNKNOWN;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Put socket into blocking mode\n\\*-------------------------------------------------------------------------*/\nvoid socket_setblocking(p_socket ps) {\n    int flags = fcntl(*ps, F_GETFL, 0);\n    flags &= (~(O_NONBLOCK));\n    fcntl(*ps, F_SETFL, flags);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Put socket into non-blocking mode\n\\*-------------------------------------------------------------------------*/\nvoid socket_setnonblocking(p_socket ps) {\n    int flags = fcntl(*ps, F_GETFL, 0);\n    flags |= O_NONBLOCK;\n    fcntl(*ps, F_SETFL, flags);\n}\n\n/*-------------------------------------------------------------------------*\\\n* DNS helpers\n\\*-------------------------------------------------------------------------*/\nint socket_gethostbyaddr(const char *addr, socklen_t len, struct hostent **hp) {\n    *hp = gethostbyaddr(addr, len, AF_INET);\n    if (*hp) return IO_DONE;\n    else if (h_errno) return h_errno;\n    else if (errno) return errno;\n    else return IO_UNKNOWN;\n}\n\nint socket_gethostbyname(const char *addr, struct hostent **hp) {\n    *hp = gethostbyname(addr);\n    if (*hp) return IO_DONE;\n    else if (h_errno) return h_errno;\n    else if (errno) return errno;\n    else return IO_UNKNOWN;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Error translation functions\n* Make sure important error messages are standard\n\\*-------------------------------------------------------------------------*/\nconst char *socket_hoststrerror(int err) {\n    if (err <= 0) return io_strerror(err);\n    switch (err) {\n        case HOST_NOT_FOUND: return PIE_HOST_NOT_FOUND;\n        default: return hstrerror(err);\n    }\n}\n\nconst char *socket_strerror(int err) {\n    if (err <= 0) return io_strerror(err);\n    switch (err) {\n        case EADDRINUSE: return PIE_ADDRINUSE;\n        case EISCONN: return PIE_ISCONN;\n        case EACCES: return PIE_ACCESS;\n        case ECONNREFUSED: return PIE_CONNREFUSED;\n        case ECONNABORTED: return PIE_CONNABORTED;\n        case ECONNRESET: return PIE_CONNRESET;\n        case ETIMEDOUT: return PIE_TIMEDOUT;\n        default: {\n            return strerror(err);\n        }\n    }\n}\n\nconst char *socket_ioerror(p_socket ps, int err) {\n    (void) ps;\n    return socket_strerror(err);\n}\n\nconst char *socket_gaistrerror(int err) {\n    if (err == 0) return NULL;\n    switch (err) {\n        case EAI_AGAIN: return PIE_AGAIN;\n        case EAI_BADFLAGS: return PIE_BADFLAGS;\n#ifdef EAI_BADHINTS\n        case EAI_BADHINTS: return PIE_BADHINTS;\n#endif\n        case EAI_FAIL: return PIE_FAIL;\n        case EAI_FAMILY: return PIE_FAMILY;\n        case EAI_MEMORY: return PIE_MEMORY;\n        case EAI_NONAME: return PIE_NONAME;\n#ifdef EAI_OVERFLOW\n        case EAI_OVERFLOW: return PIE_OVERFLOW;\n#endif\n#ifdef EAI_PROTOCOL\n        case EAI_PROTOCOL: return PIE_PROTOCOL;\n#endif\n        case EAI_SERVICE: return PIE_SERVICE;\n        case EAI_SOCKTYPE: return PIE_SOCKTYPE;\n        case EAI_SYSTEM: return strerror(errno);\n        default: return LUA_GAI_STRERROR(err);\n    }\n}\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/usocket.h",
    "content": "#ifndef USOCKET_H\n#define USOCKET_H\n/*=========================================================================*\\\n* Socket compatibilization module for Unix\n* LuaSocket toolkit\n\\*=========================================================================*/\n\n/*=========================================================================*\\\n* BSD include files\n\\*=========================================================================*/\n/* error codes */\n#include <errno.h>\n/* close function */\n#include <unistd.h>\n/* fnctnl function and associated constants */\n#include <fcntl.h>\n/* struct sockaddr */\n#include <sys/types.h>\n/* socket function */\n#include <sys/socket.h>\n/* struct timeval */\n#include <sys/time.h>\n/* gethostbyname and gethostbyaddr functions */\n#include <netdb.h>\n/* sigpipe handling */\n#include <signal.h>\n/* IP stuff*/\n#include <netinet/in.h>\n#include <arpa/inet.h>\n/* TCP options (nagle algorithm disable) */\n#include <netinet/tcp.h>\n#include <net/if.h>\n\n#ifndef SO_REUSEPORT\n#define SO_REUSEPORT SO_REUSEADDR\n#endif\n\n/* Some platforms use IPV6_JOIN_GROUP instead if\n * IPV6_ADD_MEMBERSHIP. The semantics are same, though. */\n#ifndef IPV6_ADD_MEMBERSHIP\n#ifdef IPV6_JOIN_GROUP\n#define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP\n#endif /* IPV6_JOIN_GROUP */\n#endif /* !IPV6_ADD_MEMBERSHIP */\n\n/* Same with IPV6_DROP_MEMBERSHIP / IPV6_LEAVE_GROUP. */\n#ifndef IPV6_DROP_MEMBERSHIP\n#ifdef IPV6_LEAVE_GROUP\n#define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP\n#endif /* IPV6_LEAVE_GROUP */\n#endif /* !IPV6_DROP_MEMBERSHIP */\n\ntypedef int t_socket;\ntypedef t_socket *p_socket;\ntypedef struct sockaddr_storage t_sockaddr_storage;\n\n#define SOCKET_INVALID (-1)\n\n#endif /* USOCKET_H */\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/wsocket.c",
    "content": "/*=========================================================================*\\\n* Socket compatibilization module for Win32\n* LuaSocket toolkit\n*\n* The penalty of calling select to avoid busy-wait is only paid when\n* the I/O call fail in the first place.\n\\*=========================================================================*/\n#include \"luasocket.h\"\n\n#include <string.h>\n\n#include \"socket.h\"\n#include \"pierror.h\"\n\n/* WinSock doesn't have a strerror... */\nstatic const char *wstrerror(int err);\n\n/*-------------------------------------------------------------------------*\\\n* Initializes module\n\\*-------------------------------------------------------------------------*/\nint socket_open(void) {\n    WSADATA wsaData;\n    WORD wVersionRequested = MAKEWORD(2, 0);\n    int err = WSAStartup(wVersionRequested, &wsaData );\n    if (err != 0) return 0;\n    if ((LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 0) &&\n        (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)) {\n        WSACleanup();\n        return 0;\n    }\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Close module\n\\*-------------------------------------------------------------------------*/\nint socket_close(void) {\n    WSACleanup();\n    return 1;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Wait for readable/writable/connected socket with timeout\n\\*-------------------------------------------------------------------------*/\n#define WAITFD_R        1\n#define WAITFD_W        2\n#define WAITFD_E        4\n#define WAITFD_C        (WAITFD_E|WAITFD_W)\n\nint socket_waitfd(p_socket ps, int sw, p_timeout tm) {\n    int ret;\n    fd_set rfds, wfds, efds, *rp = NULL, *wp = NULL, *ep = NULL;\n    struct timeval tv, *tp = NULL;\n    double t;\n    if (timeout_iszero(tm)) return IO_TIMEOUT;  /* optimize timeout == 0 case */\n    if (sw & WAITFD_R) {\n        FD_ZERO(&rfds);\n        FD_SET(*ps, &rfds);\n        rp = &rfds;\n    }\n    if (sw & WAITFD_W) { FD_ZERO(&wfds); FD_SET(*ps, &wfds); wp = &wfds; }\n    if (sw & WAITFD_C) { FD_ZERO(&efds); FD_SET(*ps, &efds); ep = &efds; }\n    if ((t = timeout_get(tm)) >= 0.0) {\n        tv.tv_sec = (int) t;\n        tv.tv_usec = (int) ((t-tv.tv_sec)*1.0e6);\n        tp = &tv;\n    }\n    ret = select(0, rp, wp, ep, tp);\n    if (ret == -1) return WSAGetLastError();\n    if (ret == 0) return IO_TIMEOUT;\n    if (sw == WAITFD_C && FD_ISSET(*ps, &efds)) return IO_CLOSED;\n    return IO_DONE;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Select with int timeout in ms\n\\*-------------------------------------------------------------------------*/\nint socket_select(t_socket n, fd_set *rfds, fd_set *wfds, fd_set *efds,\n        p_timeout tm) {\n    struct timeval tv;\n    double t = timeout_get(tm);\n    tv.tv_sec = (int) t;\n    tv.tv_usec = (int) ((t - tv.tv_sec) * 1.0e6);\n    if (n <= 0) {\n        Sleep((DWORD) (1000*t));\n        return 0;\n    } else return select(0, rfds, wfds, efds, t >= 0.0? &tv: NULL);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Close and inutilize socket\n\\*-------------------------------------------------------------------------*/\nvoid socket_destroy(p_socket ps) {\n    if (*ps != SOCKET_INVALID) {\n        socket_setblocking(ps); /* close can take a long time on WIN32 */\n        closesocket(*ps);\n        *ps = SOCKET_INVALID;\n    }\n}\n\n/*-------------------------------------------------------------------------*\\\n*\n\\*-------------------------------------------------------------------------*/\nvoid socket_shutdown(p_socket ps, int how) {\n    socket_setblocking(ps);\n    shutdown(*ps, how);\n    socket_setnonblocking(ps);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Creates and sets up a socket\n\\*-------------------------------------------------------------------------*/\nint socket_create(p_socket ps, int domain, int type, int protocol) {\n    *ps = socket(domain, type, protocol);\n    if (*ps != SOCKET_INVALID) return IO_DONE;\n    else return WSAGetLastError();\n}\n\n/*-------------------------------------------------------------------------*\\\n* Connects or returns error message\n\\*-------------------------------------------------------------------------*/\nint socket_connect(p_socket ps, SA *addr, socklen_t len, p_timeout tm) {\n    int err;\n    /* don't call on closed socket */\n    if (*ps == SOCKET_INVALID) return IO_CLOSED;\n    /* ask system to connect */\n    if (connect(*ps, addr, len) == 0) return IO_DONE;\n    /* make sure the system is trying to connect */\n    err = WSAGetLastError();\n    if (err != WSAEWOULDBLOCK && err != WSAEINPROGRESS) return err;\n    /* zero timeout case optimization */\n    if (timeout_iszero(tm)) return IO_TIMEOUT;\n    /* we wait until something happens */\n    err = socket_waitfd(ps, WAITFD_C, tm);\n    if (err == IO_CLOSED) {\n        int elen = sizeof(err);\n        /* give windows time to set the error (yes, disgusting) */\n        Sleep(10);\n        /* find out why we failed */\n        getsockopt(*ps, SOL_SOCKET, SO_ERROR, (char *)&err, &elen);\n        /* we KNOW there was an error. if 'why' is 0, we will return\n        * \"unknown error\", but it's not really our fault */\n        return err > 0? err: IO_UNKNOWN;\n    } else return err;\n\n}\n\n/*-------------------------------------------------------------------------*\\\n* Binds or returns error message\n\\*-------------------------------------------------------------------------*/\nint socket_bind(p_socket ps, SA *addr, socklen_t len) {\n    int err = IO_DONE;\n    socket_setblocking(ps);\n    if (bind(*ps, addr, len) < 0) err = WSAGetLastError();\n    socket_setnonblocking(ps);\n    return err;\n}\n\n/*-------------------------------------------------------------------------*\\\n*\n\\*-------------------------------------------------------------------------*/\nint socket_listen(p_socket ps, int backlog) {\n    int err = IO_DONE;\n    socket_setblocking(ps);\n    if (listen(*ps, backlog) < 0) err = WSAGetLastError();\n    socket_setnonblocking(ps);\n    return err;\n}\n\n/*-------------------------------------------------------------------------*\\\n* Accept with timeout\n\\*-------------------------------------------------------------------------*/\nint socket_accept(p_socket ps, p_socket pa, SA *addr, socklen_t *len,\n        p_timeout tm) {\n    if (*ps == SOCKET_INVALID) return IO_CLOSED;\n    for ( ;; ) {\n        int err;\n        /* try to get client socket */\n        if ((*pa = accept(*ps, addr, len)) != SOCKET_INVALID) return IO_DONE;\n        /* find out why we failed */\n        err = WSAGetLastError();\n        /* if we failed because there was no connectoin, keep trying */\n        if (err != WSAEWOULDBLOCK && err != WSAECONNABORTED) return err;\n        /* call select to avoid busy wait */\n        if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;\n    }\n}\n\n/*-------------------------------------------------------------------------*\\\n* Send with timeout\n* On windows, if you try to send 10MB, the OS will buffer EVERYTHING\n* this can take an awful lot of time and we will end up blocked.\n* Therefore, whoever calls this function should not pass a huge buffer.\n\\*-------------------------------------------------------------------------*/\nint socket_send(p_socket ps, const char *data, size_t count,\n        size_t *sent, p_timeout tm)\n{\n    int err;\n    *sent = 0;\n    /* avoid making system calls on closed sockets */\n    if (*ps == SOCKET_INVALID) return IO_CLOSED;\n    /* loop until we send something or we give up on error */\n    for ( ;; ) {\n        /* try to send something */\n        int put = send(*ps, data, (int) count, 0);\n        /* if we sent something, we are done */\n        if (put > 0) {\n            *sent = put;\n            return IO_DONE;\n        }\n        /* deal with failure */\n        err = WSAGetLastError();\n        /* we can only proceed if there was no serious error */\n        if (err != WSAEWOULDBLOCK) return err;\n        /* avoid busy wait */\n        if ((err = socket_waitfd(ps, WAITFD_W, tm)) != IO_DONE) return err;\n    }\n}\n\n/*-------------------------------------------------------------------------*\\\n* Sendto with timeout\n\\*-------------------------------------------------------------------------*/\nint socket_sendto(p_socket ps, const char *data, size_t count, size_t *sent,\n        SA *addr, socklen_t len, p_timeout tm)\n{\n    int err;\n    *sent = 0;\n    if (*ps == SOCKET_INVALID) return IO_CLOSED;\n    for ( ;; ) {\n        int put = sendto(*ps, data, (int) count, 0, addr, len);\n        if (put > 0) {\n            *sent = put;\n            return IO_DONE;\n        }\n        err = WSAGetLastError();\n        if (err != WSAEWOULDBLOCK) return err;\n        if ((err = socket_waitfd(ps, WAITFD_W, tm)) != IO_DONE) return err;\n    }\n}\n\n/*-------------------------------------------------------------------------*\\\n* Receive with timeout\n\\*-------------------------------------------------------------------------*/\nint socket_recv(p_socket ps, char *data, size_t count, size_t *got,\n        p_timeout tm)\n{\n    int err, prev = IO_DONE;\n    *got = 0;\n    if (*ps == SOCKET_INVALID) return IO_CLOSED;\n    for ( ;; ) {\n        int taken = recv(*ps, data, (int) count, 0);\n        if (taken > 0) {\n            *got = taken;\n            return IO_DONE;\n        }\n        if (taken == 0) return IO_CLOSED;\n        err = WSAGetLastError();\n        /* On UDP, a connreset simply means the previous send failed.\n         * So we try again.\n         * On TCP, it means our socket is now useless, so the error passes.\n         * (We will loop again, exiting because the same error will happen) */\n        if (err != WSAEWOULDBLOCK) {\n            if (err != WSAECONNRESET || prev == WSAECONNRESET) return err;\n            prev = err;\n            continue;\n        }\n        if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;\n    }\n}\n\n/*-------------------------------------------------------------------------*\\\n* Recvfrom with timeout\n\\*-------------------------------------------------------------------------*/\nint socket_recvfrom(p_socket ps, char *data, size_t count, size_t *got,\n        SA *addr, socklen_t *len, p_timeout tm)\n{\n    int err, prev = IO_DONE;\n    *got = 0;\n    if (*ps == SOCKET_INVALID) return IO_CLOSED;\n    for ( ;; ) {\n        int taken = recvfrom(*ps, data, (int) count, 0, addr, len);\n        if (taken > 0) {\n            *got = taken;\n            return IO_DONE;\n        }\n        if (taken == 0) return IO_CLOSED;\n        err = WSAGetLastError();\n        /* On UDP, a connreset simply means the previous send failed.\n         * So we try again.\n         * On TCP, it means our socket is now useless, so the error passes.\n         * (We will loop again, exiting because the same error will happen) */\n        if (err != WSAEWOULDBLOCK) {\n            if (err != WSAECONNRESET || prev == WSAECONNRESET) return err;\n            prev = err;\n            continue;\n        }\n        if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;\n    }\n}\n\n/*-------------------------------------------------------------------------*\\\n* Put socket into blocking mode\n\\*-------------------------------------------------------------------------*/\nvoid socket_setblocking(p_socket ps) {\n    u_long argp = 0;\n    ioctlsocket(*ps, FIONBIO, &argp);\n}\n\n/*-------------------------------------------------------------------------*\\\n* Put socket into non-blocking mode\n\\*-------------------------------------------------------------------------*/\nvoid socket_setnonblocking(p_socket ps) {\n    u_long argp = 1;\n    ioctlsocket(*ps, FIONBIO, &argp);\n}\n\n/*-------------------------------------------------------------------------*\\\n* DNS helpers\n\\*-------------------------------------------------------------------------*/\nint socket_gethostbyaddr(const char *addr, socklen_t len, struct hostent **hp) {\n    *hp = gethostbyaddr(addr, len, AF_INET);\n    if (*hp) return IO_DONE;\n    else return WSAGetLastError();\n}\n\nint socket_gethostbyname(const char *addr, struct hostent **hp) {\n    *hp = gethostbyname(addr);\n    if (*hp) return IO_DONE;\n    else return  WSAGetLastError();\n}\n\n/*-------------------------------------------------------------------------*\\\n* Error translation functions\n\\*-------------------------------------------------------------------------*/\nconst char *socket_hoststrerror(int err) {\n    if (err <= 0) return io_strerror(err);\n    switch (err) {\n        case WSAHOST_NOT_FOUND: return PIE_HOST_NOT_FOUND;\n        default: return wstrerror(err);\n    }\n}\n\nconst char *socket_strerror(int err) {\n    if (err <= 0) return io_strerror(err);\n    switch (err) {\n        case WSAEADDRINUSE: return PIE_ADDRINUSE;\n        case WSAECONNREFUSED : return PIE_CONNREFUSED;\n        case WSAEISCONN: return PIE_ISCONN;\n        case WSAEACCES: return PIE_ACCESS;\n        case WSAECONNABORTED: return PIE_CONNABORTED;\n        case WSAECONNRESET: return PIE_CONNRESET;\n        case WSAETIMEDOUT: return PIE_TIMEDOUT;\n        default: return wstrerror(err);\n    }\n}\n\nconst char *socket_ioerror(p_socket ps, int err) {\n    (void) ps;\n    return socket_strerror(err);\n}\n\nstatic const char *wstrerror(int err) {\n    switch (err) {\n        case WSAEINTR: return \"Interrupted function call\";\n        case WSAEACCES: return PIE_ACCESS; /* \"Permission denied\"; */\n        case WSAEFAULT: return \"Bad address\";\n        case WSAEINVAL: return \"Invalid argument\";\n        case WSAEMFILE: return \"Too many open files\";\n        case WSAEWOULDBLOCK: return \"Resource temporarily unavailable\";\n        case WSAEINPROGRESS: return \"Operation now in progress\";\n        case WSAEALREADY: return \"Operation already in progress\";\n        case WSAENOTSOCK: return \"Socket operation on nonsocket\";\n        case WSAEDESTADDRREQ: return \"Destination address required\";\n        case WSAEMSGSIZE: return \"Message too long\";\n        case WSAEPROTOTYPE: return \"Protocol wrong type for socket\";\n        case WSAENOPROTOOPT: return \"Bad protocol option\";\n        case WSAEPROTONOSUPPORT: return \"Protocol not supported\";\n        case WSAESOCKTNOSUPPORT: return PIE_SOCKTYPE; /* \"Socket type not supported\"; */\n        case WSAEOPNOTSUPP: return \"Operation not supported\";\n        case WSAEPFNOSUPPORT: return \"Protocol family not supported\";\n        case WSAEAFNOSUPPORT: return PIE_FAMILY; /* \"Address family not supported by protocol family\"; */\n        case WSAEADDRINUSE: return PIE_ADDRINUSE; /* \"Address already in use\"; */\n        case WSAEADDRNOTAVAIL: return \"Cannot assign requested address\";\n        case WSAENETDOWN: return \"Network is down\";\n        case WSAENETUNREACH: return \"Network is unreachable\";\n        case WSAENETRESET: return \"Network dropped connection on reset\";\n        case WSAECONNABORTED: return \"Software caused connection abort\";\n        case WSAECONNRESET: return PIE_CONNRESET; /* \"Connection reset by peer\"; */\n        case WSAENOBUFS: return \"No buffer space available\";\n        case WSAEISCONN: return PIE_ISCONN; /* \"Socket is already connected\"; */\n        case WSAENOTCONN: return \"Socket is not connected\";\n        case WSAESHUTDOWN: return \"Cannot send after socket shutdown\";\n        case WSAETIMEDOUT: return PIE_TIMEDOUT; /* \"Connection timed out\"; */\n        case WSAECONNREFUSED: return PIE_CONNREFUSED; /* \"Connection refused\"; */\n        case WSAEHOSTDOWN: return \"Host is down\";\n        case WSAEHOSTUNREACH: return \"No route to host\";\n        case WSAEPROCLIM: return \"Too many processes\";\n        case WSASYSNOTREADY: return \"Network subsystem is unavailable\";\n        case WSAVERNOTSUPPORTED: return \"Winsock.dll version out of range\";\n        case WSANOTINITIALISED:\n            return \"Successful WSAStartup not yet performed\";\n        case WSAEDISCON: return \"Graceful shutdown in progress\";\n        case WSAHOST_NOT_FOUND: return PIE_HOST_NOT_FOUND; /* \"Host not found\"; */\n        case WSATRY_AGAIN: return \"Nonauthoritative host not found\";\n        case WSANO_RECOVERY: return PIE_FAIL; /* \"Nonrecoverable name lookup error\"; */\n        case WSANO_DATA: return \"Valid name, no data record of requested type\";\n        default: return \"Unknown error\";\n    }\n}\n\nconst char *socket_gaistrerror(int err) {\n    if (err == 0) return NULL;\n    switch (err) {\n        case EAI_AGAIN: return PIE_AGAIN;\n        case EAI_BADFLAGS: return PIE_BADFLAGS;\n#ifdef EAI_BADHINTS\n        case EAI_BADHINTS: return PIE_BADHINTS;\n#endif\n        case EAI_FAIL: return PIE_FAIL;\n        case EAI_FAMILY: return PIE_FAMILY;\n        case EAI_MEMORY: return PIE_MEMORY;\n        case EAI_NONAME: return PIE_NONAME;\n#ifdef EAI_OVERFLOW\n        case EAI_OVERFLOW: return PIE_OVERFLOW;\n#endif\n#ifdef EAI_PROTOCOL\n        case EAI_PROTOCOL: return PIE_PROTOCOL;\n#endif\n        case EAI_SERVICE: return PIE_SERVICE;\n        case EAI_SOCKTYPE: return PIE_SOCKTYPE;\n#ifdef EAI_SYSTEM\n        case EAI_SYSTEM: return strerror(errno);\n#endif\n        default: return LUA_GAI_STRERROR(err);\n    }\n}\n"
  },
  {
    "path": "src/libraries/luasocket/libluasocket/wsocket.h",
    "content": "#ifndef WSOCKET_H\n#define WSOCKET_H\n/*=========================================================================*\\\n* Socket compatibilization module for Win32\n* LuaSocket toolkit\n\\*=========================================================================*/\n\n/*=========================================================================*\\\n* WinSock include files\n\\*=========================================================================*/\n#include <winsock2.h>\n#include <ws2tcpip.h>\n\ntypedef int socklen_t;\ntypedef SOCKADDR_STORAGE t_sockaddr_storage;\ntypedef SOCKET t_socket;\ntypedef t_socket *p_socket;\n\n#ifndef IPV6_V6ONLY\n#define IPV6_V6ONLY 27\n#endif\n\n#define SOCKET_INVALID (INVALID_SOCKET)\n\n#ifndef SO_REUSEPORT\n#define SO_REUSEPORT SO_REUSEADDR\n#endif\n\n#ifndef AI_NUMERICSERV\n#define AI_NUMERICSERV (0)\n#endif\n\n#endif /* WSOCKET_H */\n"
  },
  {
    "path": "src/libraries/luasocket/luasocket.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"luasocket.h\"\n\n// LuaSocket\nextern \"C\" {\n#include \"libluasocket/luasocket.h\"\n#include \"libluasocket/mime.h\"\n#include \"libluasocket/unix.h\"\n}\n\n// Lua files\n#include \"libluasocket/ftp.lua.h\"\n#include \"libluasocket/headers.lua.h\"\n#include \"libluasocket/http.lua.h\"\n#include \"libluasocket/ltn12.lua.h\"\n#include \"libluasocket/mbox.lua.h\"\n#include \"libluasocket/mime.lua.h\"\n#include \"libluasocket/smtp.lua.h\"\n#include \"libluasocket/socket.lua.h\"\n#include \"libluasocket/tp.lua.h\"\n#include \"libluasocket/url.lua.h\"\n\nstatic void preload(lua_State* L, const char* name, lua_CFunction func)\n{\n\tlua_getglobal(L, \"package\");\n\tlua_getfield(L, -1, \"preload\");\n\tlua_pushcfunction(L, func);\n\tlua_setfield(L, -2, name);\n\tlua_pop(L, 2);\n}\n\nstatic void preload(lua_State *L, const char *name, const char *chunkname, const void *lua, size_t size)\n{\n\tif (luaL_loadbuffer(L, (const char *) lua, size, name) != 0)\n\t{\n\t\tluaL_loadstring(L, \"local name, msg = ... return function() error(name..\\\": \\\"..msg) end\");\n\t\tlua_pushstring(L, name);\n\t\tlua_pushvalue(L, -3);\n\t\t// Before:\n\t\t// -1: error message\n\t\t// -2: module name\n\t\t// -3: loadstring function\n\t\t// -4: error message\n\t\tlua_call(L, 2, 1);\n\t\t// After:\n\t\t// -1: function\n\t\t// -2: error message\n\t\tlua_remove(L, -2);\n\t}\n\n\tlua_getglobal(L, \"package\");\n\tlua_getfield(L, -1, \"preload\");\n\tlua_pushvalue(L, -3);\n\tlua_setfield(L, -2, name);\n\tlua_pop(L, 3);\n}\n\nnamespace love\n{\n\nnamespace luasocket\n{\n\nint preload(lua_State * L)\n{\n\n\t// Preload code from LuaSocket.\n\tpreload(L, \"socket.core\", luaopen_socket_core);\n\tpreload(L, \"socket.unix\", luaopen_socket_unix);\n\tpreload(L, \"mime.core\",   luaopen_mime_core);\n\n\tpreload(L, \"socket\",         \"=[socket \\\"socket.lua\\\"]\",  socket_lua,  sizeof(socket_lua));\n\tpreload(L, \"socket.ftp\",     \"=[socket \\\"ftp.lua\\\"]\",     ftp_lua,     sizeof(ftp_lua));\n\tpreload(L, \"socket.http\",    \"=[socket \\\"http.lua\\\"]\",    http_lua,    sizeof(http_lua));\n\tpreload(L, \"ltn12\",          \"=[socket \\\"ltn12.lua\\\"]\",   ltn12_lua,   sizeof(ltn12_lua));\n\tpreload(L, \"mime\",           \"=[socket \\\"mime.lua\\\"]\",    mime_lua,    sizeof(mime_lua));\n\tpreload(L, \"socket.smtp\",    \"=[socket \\\"smtp.lua\\\"]\",    smtp_lua,    sizeof(smtp_lua));\n\tpreload(L, \"socket.tp\",      \"=[socket \\\"tp.lua\\\"]\",      tp_lua,      sizeof(tp_lua));\n\tpreload(L, \"socket.url\",     \"=[socket \\\"url.lua\\\"]\",     url_lua,     sizeof(url_lua));\n\tpreload(L, \"socket.headers\", \"=[socket \\\"headers.lua\\\"]\", headers_lua, sizeof(headers_lua));\n\tpreload(L, \"mbox\",           \"=[socket \\\"mbox.lua\\\"]\",    mbox_lua,    sizeof(mbox_lua));\n\n\t// No need to register garbage collector function.\n\n\treturn 0;\n}\n\n} // luasocket\n} // love\n"
  },
  {
    "path": "src/libraries/luasocket/luasocket.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_LUASOCKET_LUASOCKET_H\n#define LOVE_LUASOCKET_LUASOCKET_H\n\n// LOVE\n#include <common/runtime.h>\n\nnamespace love\n{\nnamespace luasocket\n{\n\nint preload(lua_State * L);\n\n} // luasocket\n} // love\n\n#endif // LOVE_LUASOCKET_LUASOCKET_H\n"
  },
  {
    "path": "src/libraries/lz4/lz4.c",
    "content": "/*\n   LZ4 - Fast LZ compression algorithm\n   Copyright (C) 2011-2017, Yann Collet.\n\n   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)\n\n   Redistribution and use in source and binary forms, with or without\n   modification, are permitted provided that the following conditions are\n   met:\n\n       * Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n       * Redistributions in binary form must reproduce the above\n   copyright notice, this list of conditions and the following disclaimer\n   in the documentation and/or other materials provided with the\n   distribution.\n\n   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n   \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n   You can contact the author at :\n    - LZ4 homepage : http://www.lz4.org\n    - LZ4 source repository : https://github.com/lz4/lz4\n*/\n\n\n/*-************************************\n*  Tuning parameters\n**************************************/\n/*\n * LZ4_HEAPMODE :\n * Select how default compression functions will allocate memory for their hash table,\n * in memory stack (0:default, fastest), or in memory heap (1:requires malloc()).\n */\n#ifndef LZ4_HEAPMODE\n#  define LZ4_HEAPMODE 0\n#endif\n\n/*\n * ACCELERATION_DEFAULT :\n * Select \"acceleration\" for LZ4_compress_fast() when parameter value <= 0\n */\n#define ACCELERATION_DEFAULT 1\n\n\n/*-************************************\n*  CPU Feature Detection\n**************************************/\n/* LZ4_FORCE_MEMORY_ACCESS\n * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable.\n * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal.\n * The below switch allow to select different access method for improved performance.\n * Method 0 (default) : use `memcpy()`. Safe and portable.\n * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable).\n *            This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`.\n * Method 2 : direct access. This method is portable but violate C standard.\n *            It can generate buggy code on targets which assembly generation depends on alignment.\n *            But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6)\n * See https://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details.\n * Prefer these methods in priority order (0 > 1 > 2)\n */\n#ifndef LZ4_FORCE_MEMORY_ACCESS   /* can be defined externally */\n#  if defined(__GNUC__) && ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) )\n#    define LZ4_FORCE_MEMORY_ACCESS 2\n#  elif defined(__INTEL_COMPILER) || defined(__GNUC__)\n#    define LZ4_FORCE_MEMORY_ACCESS 1\n#  endif\n#endif\n\n/*\n * LZ4_FORCE_SW_BITCOUNT\n * Define this parameter if your target system or compiler does not support hardware bit count\n */\n#if defined(_MSC_VER) && defined(_WIN32_WCE)   /* Visual Studio for Windows CE does not support Hardware bit count */\n#  define LZ4_FORCE_SW_BITCOUNT\n#endif\n\n\n\n/*-************************************\n*  Dependency\n**************************************/\n#include \"lz4.h\"\n/* see also \"memory routines\" below */\n\n\n/*-************************************\n*  Compiler Options\n**************************************/\n#ifdef _MSC_VER    /* Visual Studio */\n#  include <intrin.h>\n#  pragma warning(disable : 4127)        /* disable: C4127: conditional expression is constant */\n#  pragma warning(disable : 4293)        /* disable: C4293: too large shift (32-bits) */\n#endif  /* _MSC_VER */\n\n#ifndef LZ4_FORCE_INLINE\n#  ifdef _MSC_VER    /* Visual Studio */\n#    define LZ4_FORCE_INLINE static __forceinline\n#  else\n#    if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L   /* C99 */\n#      ifdef __GNUC__\n#        define LZ4_FORCE_INLINE static inline __attribute__((always_inline))\n#      else\n#        define LZ4_FORCE_INLINE static inline\n#      endif\n#    else\n#      define LZ4_FORCE_INLINE static\n#    endif /* __STDC_VERSION__ */\n#  endif  /* _MSC_VER */\n#endif /* LZ4_FORCE_INLINE */\n\n/* LZ4_FORCE_O2_GCC_PPC64LE and LZ4_FORCE_O2_INLINE_GCC_PPC64LE\n * Gcc on ppc64le generates an unrolled SIMDized loop for LZ4_wildCopy,\n * together with a simple 8-byte copy loop as a fall-back path.\n * However, this optimization hurts the decompression speed by >30%,\n * because the execution does not go to the optimized loop\n * for typical compressible data, and all of the preamble checks\n * before going to the fall-back path become useless overhead.\n * This optimization happens only with the -O3 flag, and -O2 generates\n * a simple 8-byte copy loop.\n * With gcc on ppc64le, all of the LZ4_decompress_* and LZ4_wildCopy\n * functions are annotated with __attribute__((optimize(\"O2\"))),\n * and also LZ4_wildCopy is forcibly inlined, so that the O2 attribute\n * of LZ4_wildCopy does not affect the compression speed.\n */\n#if defined(__PPC64__) && defined(__LITTLE_ENDIAN__) && defined(__GNUC__)\n#  define LZ4_FORCE_O2_GCC_PPC64LE __attribute__((optimize(\"O2\")))\n#  define LZ4_FORCE_O2_INLINE_GCC_PPC64LE __attribute__((optimize(\"O2\"))) LZ4_FORCE_INLINE\n#else\n#  define LZ4_FORCE_O2_GCC_PPC64LE\n#  define LZ4_FORCE_O2_INLINE_GCC_PPC64LE static\n#endif\n\n#if (defined(__GNUC__) && (__GNUC__ >= 3)) || (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 800)) || defined(__clang__)\n#  define expect(expr,value)    (__builtin_expect ((expr),(value)) )\n#else\n#  define expect(expr,value)    (expr)\n#endif\n\n#define likely(expr)     expect((expr) != 0, 1)\n#define unlikely(expr)   expect((expr) != 0, 0)\n\n\n/*-************************************\n*  Memory routines\n**************************************/\n#include <stdlib.h>   /* malloc, calloc, free */\n#define ALLOCATOR(n,s) calloc(n,s)\n#define FREEMEM        free\n#include <string.h>   /* memset, memcpy */\n#define MEM_INIT       memset\n\n\n/*-************************************\n*  Basic Types\n**************************************/\n#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)\n# include <stdint.h>\n  typedef  uint8_t BYTE;\n  typedef uint16_t U16;\n  typedef uint32_t U32;\n  typedef  int32_t S32;\n  typedef uint64_t U64;\n  typedef uintptr_t uptrval;\n#else\n  typedef unsigned char       BYTE;\n  typedef unsigned short      U16;\n  typedef unsigned int        U32;\n  typedef   signed int        S32;\n  typedef unsigned long long  U64;\n  typedef size_t              uptrval;   /* generally true, except OpenVMS-64 */\n#endif\n\n#if defined(__x86_64__)\n  typedef U64    reg_t;   /* 64-bits in x32 mode */\n#else\n  typedef size_t reg_t;   /* 32-bits in x32 mode */\n#endif\n\n/*-************************************\n*  Reading and writing into memory\n**************************************/\nstatic unsigned LZ4_isLittleEndian(void)\n{\n    const union { U32 u; BYTE c[4]; } one = { 1 };   /* don't use static : performance detrimental */\n    return one.c[0];\n}\n\n\n#if defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==2)\n/* lie to the compiler about data alignment; use with caution */\n\nstatic U16 LZ4_read16(const void* memPtr) { return *(const U16*) memPtr; }\nstatic U32 LZ4_read32(const void* memPtr) { return *(const U32*) memPtr; }\nstatic reg_t LZ4_read_ARCH(const void* memPtr) { return *(const reg_t*) memPtr; }\n\nstatic void LZ4_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; }\nstatic void LZ4_write32(void* memPtr, U32 value) { *(U32*)memPtr = value; }\n\n#elif defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==1)\n\n/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */\n/* currently only defined for gcc and icc */\ntypedef union { U16 u16; U32 u32; reg_t uArch; } __attribute__((packed)) unalign;\n\nstatic U16 LZ4_read16(const void* ptr) { return ((const unalign*)ptr)->u16; }\nstatic U32 LZ4_read32(const void* ptr) { return ((const unalign*)ptr)->u32; }\nstatic reg_t LZ4_read_ARCH(const void* ptr) { return ((const unalign*)ptr)->uArch; }\n\nstatic void LZ4_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; }\nstatic void LZ4_write32(void* memPtr, U32 value) { ((unalign*)memPtr)->u32 = value; }\n\n#else  /* safe and portable access through memcpy() */\n\nstatic U16 LZ4_read16(const void* memPtr)\n{\n    U16 val; memcpy(&val, memPtr, sizeof(val)); return val;\n}\n\nstatic U32 LZ4_read32(const void* memPtr)\n{\n    U32 val; memcpy(&val, memPtr, sizeof(val)); return val;\n}\n\nstatic reg_t LZ4_read_ARCH(const void* memPtr)\n{\n    reg_t val; memcpy(&val, memPtr, sizeof(val)); return val;\n}\n\nstatic void LZ4_write16(void* memPtr, U16 value)\n{\n    memcpy(memPtr, &value, sizeof(value));\n}\n\nstatic void LZ4_write32(void* memPtr, U32 value)\n{\n    memcpy(memPtr, &value, sizeof(value));\n}\n\n#endif /* LZ4_FORCE_MEMORY_ACCESS */\n\n\nstatic U16 LZ4_readLE16(const void* memPtr)\n{\n    if (LZ4_isLittleEndian()) {\n        return LZ4_read16(memPtr);\n    } else {\n        const BYTE* p = (const BYTE*)memPtr;\n        return (U16)((U16)p[0] + (p[1]<<8));\n    }\n}\n\nstatic void LZ4_writeLE16(void* memPtr, U16 value)\n{\n    if (LZ4_isLittleEndian()) {\n        LZ4_write16(memPtr, value);\n    } else {\n        BYTE* p = (BYTE*)memPtr;\n        p[0] = (BYTE) value;\n        p[1] = (BYTE)(value>>8);\n    }\n}\n\nstatic void LZ4_copy8(void* dst, const void* src)\n{\n    memcpy(dst,src,8);\n}\n\n/* customized variant of memcpy, which can overwrite up to 8 bytes beyond dstEnd */\nLZ4_FORCE_O2_INLINE_GCC_PPC64LE\nvoid LZ4_wildCopy(void* dstPtr, const void* srcPtr, void* dstEnd)\n{\n    BYTE* d = (BYTE*)dstPtr;\n    const BYTE* s = (const BYTE*)srcPtr;\n    BYTE* const e = (BYTE*)dstEnd;\n\n    do { LZ4_copy8(d,s); d+=8; s+=8; } while (d<e);\n}\n\n\n/*-************************************\n*  Common Constants\n**************************************/\n#define MINMATCH 4\n\n#define WILDCOPYLENGTH 8\n#define LASTLITERALS 5\n#define MFLIMIT (WILDCOPYLENGTH+MINMATCH)\nstatic const int LZ4_minLength = (MFLIMIT+1);\n\n#define KB *(1 <<10)\n#define MB *(1 <<20)\n#define GB *(1U<<30)\n\n#define MAXD_LOG 16\n#define MAX_DISTANCE ((1 << MAXD_LOG) - 1)\n\n#define ML_BITS  4\n#define ML_MASK  ((1U<<ML_BITS)-1)\n#define RUN_BITS (8-ML_BITS)\n#define RUN_MASK ((1U<<RUN_BITS)-1)\n\n\n/*-************************************\n*  Error detection\n**************************************/\n#if defined(LZ4_DEBUG) && (LZ4_DEBUG>=1)\n#  include <assert.h>\n#else\n#  ifndef assert\n#    define assert(condition) ((void)0)\n#  endif\n#endif\n\n#define LZ4_STATIC_ASSERT(c)   { enum { LZ4_static_assert = 1/(int)(!!(c)) }; }   /* use only *after* variable declarations */\n\n#if defined(LZ4_DEBUG) && (LZ4_DEBUG>=2)\n#  include <stdio.h>\nstatic int g_debuglog_enable = 1;\n#  define DEBUGLOG(l, ...) {                                  \\\n                if ((g_debuglog_enable) && (l<=LZ4_DEBUG)) {  \\\n                    fprintf(stderr, __FILE__ \": \");           \\\n                    fprintf(stderr, __VA_ARGS__);             \\\n                    fprintf(stderr, \" \\n\");                   \\\n            }   }\n#else\n#  define DEBUGLOG(l, ...)      {}    /* disabled */\n#endif\n\n\n/*-************************************\n*  Common functions\n**************************************/\nstatic unsigned LZ4_NbCommonBytes (reg_t val)\n{\n    if (LZ4_isLittleEndian()) {\n        if (sizeof(val)==8) {\n#       if defined(_MSC_VER) && defined(_WIN64) && !defined(LZ4_FORCE_SW_BITCOUNT)\n            unsigned long r = 0;\n            _BitScanForward64( &r, (U64)val );\n            return (int)(r>>3);\n#       elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT)\n            return (__builtin_ctzll((U64)val) >> 3);\n#       else\n            static const int DeBruijnBytePos[64] = { 0, 0, 0, 0, 0, 1, 1, 2,\n                                                     0, 3, 1, 3, 1, 4, 2, 7,\n                                                     0, 2, 3, 6, 1, 5, 3, 5,\n                                                     1, 3, 4, 4, 2, 5, 6, 7,\n                                                     7, 0, 1, 2, 3, 3, 4, 6,\n                                                     2, 6, 5, 5, 3, 4, 5, 6,\n                                                     7, 1, 2, 4, 6, 4, 4, 5,\n                                                     7, 2, 6, 5, 7, 6, 7, 7 };\n            return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58];\n#       endif\n        } else /* 32 bits */ {\n#       if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT)\n            unsigned long r;\n            _BitScanForward( &r, (U32)val );\n            return (int)(r>>3);\n#       elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT)\n            return (__builtin_ctz((U32)val) >> 3);\n#       else\n            static const int DeBruijnBytePos[32] = { 0, 0, 3, 0, 3, 1, 3, 0,\n                                                     3, 2, 2, 1, 3, 2, 0, 1,\n                                                     3, 3, 1, 2, 2, 2, 2, 0,\n                                                     3, 1, 2, 0, 1, 0, 1, 1 };\n            return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27];\n#       endif\n        }\n    } else   /* Big Endian CPU */ {\n        if (sizeof(val)==8) {   /* 64-bits */\n#       if defined(_MSC_VER) && defined(_WIN64) && !defined(LZ4_FORCE_SW_BITCOUNT)\n            unsigned long r = 0;\n            _BitScanReverse64( &r, val );\n            return (unsigned)(r>>3);\n#       elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT)\n            return (__builtin_clzll((U64)val) >> 3);\n#       else\n            static const U32 by32 = sizeof(val)*4;  /* 32 on 64 bits (goal), 16 on 32 bits.\n                Just to avoid some static analyzer complaining about shift by 32 on 32-bits target.\n                Note that this code path is never triggered in 32-bits mode. */\n            unsigned r;\n            if (!(val>>by32)) { r=4; } else { r=0; val>>=by32; }\n            if (!(val>>16)) { r+=2; val>>=8; } else { val>>=24; }\n            r += (!val);\n            return r;\n#       endif\n        } else /* 32 bits */ {\n#       if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT)\n            unsigned long r = 0;\n            _BitScanReverse( &r, (unsigned long)val );\n            return (unsigned)(r>>3);\n#       elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT)\n            return (__builtin_clz((U32)val) >> 3);\n#       else\n            unsigned r;\n            if (!(val>>16)) { r=2; val>>=8; } else { r=0; val>>=24; }\n            r += (!val);\n            return r;\n#       endif\n        }\n    }\n}\n\n#define STEPSIZE sizeof(reg_t)\nLZ4_FORCE_INLINE\nunsigned LZ4_count(const BYTE* pIn, const BYTE* pMatch, const BYTE* pInLimit)\n{\n    const BYTE* const pStart = pIn;\n\n    if (likely(pIn < pInLimit-(STEPSIZE-1))) {\n        reg_t const diff = LZ4_read_ARCH(pMatch) ^ LZ4_read_ARCH(pIn);\n        if (!diff) {\n            pIn+=STEPSIZE; pMatch+=STEPSIZE;\n        } else {\n            return LZ4_NbCommonBytes(diff);\n    }   }\n\n    while (likely(pIn < pInLimit-(STEPSIZE-1))) {\n        reg_t const diff = LZ4_read_ARCH(pMatch) ^ LZ4_read_ARCH(pIn);\n        if (!diff) { pIn+=STEPSIZE; pMatch+=STEPSIZE; continue; }\n        pIn += LZ4_NbCommonBytes(diff);\n        return (unsigned)(pIn - pStart);\n    }\n\n    if ((STEPSIZE==8) && (pIn<(pInLimit-3)) && (LZ4_read32(pMatch) == LZ4_read32(pIn))) { pIn+=4; pMatch+=4; }\n    if ((pIn<(pInLimit-1)) && (LZ4_read16(pMatch) == LZ4_read16(pIn))) { pIn+=2; pMatch+=2; }\n    if ((pIn<pInLimit) && (*pMatch == *pIn)) pIn++;\n    return (unsigned)(pIn - pStart);\n}\n\n\n#ifndef LZ4_COMMONDEFS_ONLY\n/*-************************************\n*  Local Constants\n**************************************/\nstatic const int LZ4_64Klimit = ((64 KB) + (MFLIMIT-1));\nstatic const U32 LZ4_skipTrigger = 6;  /* Increase this value ==> compression run slower on incompressible data */\n\n\n/*-************************************\n*  Local Structures and types\n**************************************/\ntypedef enum { notLimited = 0, limitedOutput = 1 } limitedOutput_directive;\ntypedef enum { byPtr, byU32, byU16 } tableType_t;\n\ntypedef enum { noDict = 0, withPrefix64k, usingExtDict } dict_directive;\ntypedef enum { noDictIssue = 0, dictSmall } dictIssue_directive;\n\ntypedef enum { endOnOutputSize = 0, endOnInputSize = 1 } endCondition_directive;\ntypedef enum { full = 0, partial = 1 } earlyEnd_directive;\n\n\n/*-************************************\n*  Local Utils\n**************************************/\nint LZ4_versionNumber (void) { return LZ4_VERSION_NUMBER; }\nconst char* LZ4_versionString(void) { return LZ4_VERSION_STRING; }\nint LZ4_compressBound(int isize)  { return LZ4_COMPRESSBOUND(isize); }\nint LZ4_sizeofState() { return LZ4_STREAMSIZE; }\n\n\n/*-******************************\n*  Compression functions\n********************************/\nstatic U32 LZ4_hash4(U32 sequence, tableType_t const tableType)\n{\n    if (tableType == byU16)\n        return ((sequence * 2654435761U) >> ((MINMATCH*8)-(LZ4_HASHLOG+1)));\n    else\n        return ((sequence * 2654435761U) >> ((MINMATCH*8)-LZ4_HASHLOG));\n}\n\nstatic U32 LZ4_hash5(U64 sequence, tableType_t const tableType)\n{\n    static const U64 prime5bytes = 889523592379ULL;\n    static const U64 prime8bytes = 11400714785074694791ULL;\n    const U32 hashLog = (tableType == byU16) ? LZ4_HASHLOG+1 : LZ4_HASHLOG;\n    if (LZ4_isLittleEndian())\n        return (U32)(((sequence << 24) * prime5bytes) >> (64 - hashLog));\n    else\n        return (U32)(((sequence >> 24) * prime8bytes) >> (64 - hashLog));\n}\n\nLZ4_FORCE_INLINE U32 LZ4_hashPosition(const void* const p, tableType_t const tableType)\n{\n    if ((sizeof(reg_t)==8) && (tableType != byU16)) return LZ4_hash5(LZ4_read_ARCH(p), tableType);\n    return LZ4_hash4(LZ4_read32(p), tableType);\n}\n\nstatic void LZ4_putPositionOnHash(const BYTE* p, U32 h, void* tableBase, tableType_t const tableType, const BYTE* srcBase)\n{\n    switch (tableType)\n    {\n    case byPtr: { const BYTE** hashTable = (const BYTE**)tableBase; hashTable[h] = p; return; }\n    case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = (U32)(p-srcBase); return; }\n    case byU16: { U16* hashTable = (U16*) tableBase; hashTable[h] = (U16)(p-srcBase); return; }\n    }\n}\n\nLZ4_FORCE_INLINE void LZ4_putPosition(const BYTE* p, void* tableBase, tableType_t tableType, const BYTE* srcBase)\n{\n    U32 const h = LZ4_hashPosition(p, tableType);\n    LZ4_putPositionOnHash(p, h, tableBase, tableType, srcBase);\n}\n\nstatic const BYTE* LZ4_getPositionOnHash(U32 h, void* tableBase, tableType_t tableType, const BYTE* srcBase)\n{\n    if (tableType == byPtr) { const BYTE** hashTable = (const BYTE**) tableBase; return hashTable[h]; }\n    if (tableType == byU32) { const U32* const hashTable = (U32*) tableBase; return hashTable[h] + srcBase; }\n    { const U16* const hashTable = (U16*) tableBase; return hashTable[h] + srcBase; }   /* default, to ensure a return */\n}\n\nLZ4_FORCE_INLINE const BYTE* LZ4_getPosition(const BYTE* p, void* tableBase, tableType_t tableType, const BYTE* srcBase)\n{\n    U32 const h = LZ4_hashPosition(p, tableType);\n    return LZ4_getPositionOnHash(h, tableBase, tableType, srcBase);\n}\n\n\n/** LZ4_compress_generic() :\n    inlined, to ensure branches are decided at compilation time */\nLZ4_FORCE_INLINE int LZ4_compress_generic(\n                 LZ4_stream_t_internal* const cctx,\n                 const char* const source,\n                 char* const dest,\n                 const int inputSize,\n                 const int maxOutputSize,\n                 const limitedOutput_directive outputLimited,\n                 const tableType_t tableType,\n                 const dict_directive dict,\n                 const dictIssue_directive dictIssue,\n                 const U32 acceleration)\n{\n    const BYTE* ip = (const BYTE*) source;\n    const BYTE* base;\n    const BYTE* lowLimit;\n    const BYTE* const lowRefLimit = ip - cctx->dictSize;\n    const BYTE* const dictionary = cctx->dictionary;\n    const BYTE* const dictEnd = dictionary + cctx->dictSize;\n    const ptrdiff_t dictDelta = dictEnd - (const BYTE*)source;\n    const BYTE* anchor = (const BYTE*) source;\n    const BYTE* const iend = ip + inputSize;\n    const BYTE* const mflimit = iend - MFLIMIT;\n    const BYTE* const matchlimit = iend - LASTLITERALS;\n\n    BYTE* op = (BYTE*) dest;\n    BYTE* const olimit = op + maxOutputSize;\n\n    U32 forwardH;\n\n    /* Init conditions */\n    if ((U32)inputSize > (U32)LZ4_MAX_INPUT_SIZE) return 0;   /* Unsupported inputSize, too large (or negative) */\n    switch(dict)\n    {\n    case noDict:\n    default:\n        base = (const BYTE*)source;\n        lowLimit = (const BYTE*)source;\n        break;\n    case withPrefix64k:\n        base = (const BYTE*)source - cctx->currentOffset;\n        lowLimit = (const BYTE*)source - cctx->dictSize;\n        break;\n    case usingExtDict:\n        base = (const BYTE*)source - cctx->currentOffset;\n        lowLimit = (const BYTE*)source;\n        break;\n    }\n    if ((tableType == byU16) && (inputSize>=LZ4_64Klimit)) return 0;   /* Size too large (not within 64K limit) */\n    if (inputSize<LZ4_minLength) goto _last_literals;                  /* Input too small, no compression (all literals) */\n\n    /* First Byte */\n    LZ4_putPosition(ip, cctx->hashTable, tableType, base);\n    ip++; forwardH = LZ4_hashPosition(ip, tableType);\n\n    /* Main Loop */\n    for ( ; ; ) {\n        ptrdiff_t refDelta = 0;\n        const BYTE* match;\n        BYTE* token;\n\n        /* Find a match */\n        {   const BYTE* forwardIp = ip;\n            unsigned step = 1;\n            unsigned searchMatchNb = acceleration << LZ4_skipTrigger;\n            do {\n                U32 const h = forwardH;\n                ip = forwardIp;\n                forwardIp += step;\n                step = (searchMatchNb++ >> LZ4_skipTrigger);\n\n                if (unlikely(forwardIp > mflimit)) goto _last_literals;\n\n                match = LZ4_getPositionOnHash(h, cctx->hashTable, tableType, base);\n                if (dict==usingExtDict) {\n                    if (match < (const BYTE*)source) {\n                        refDelta = dictDelta;\n                        lowLimit = dictionary;\n                    } else {\n                        refDelta = 0;\n                        lowLimit = (const BYTE*)source;\n                }   }\n                forwardH = LZ4_hashPosition(forwardIp, tableType);\n                LZ4_putPositionOnHash(ip, h, cctx->hashTable, tableType, base);\n\n            } while ( ((dictIssue==dictSmall) ? (match < lowRefLimit) : 0)\n                || ((tableType==byU16) ? 0 : (match + MAX_DISTANCE < ip))\n                || (LZ4_read32(match+refDelta) != LZ4_read32(ip)) );\n        }\n\n        /* Catch up */\n        while (((ip>anchor) & (match+refDelta > lowLimit)) && (unlikely(ip[-1]==match[refDelta-1]))) { ip--; match--; }\n\n        /* Encode Literals */\n        {   unsigned const litLength = (unsigned)(ip - anchor);\n            token = op++;\n            if ((outputLimited) &&  /* Check output buffer overflow */\n                (unlikely(op + litLength + (2 + 1 + LASTLITERALS) + (litLength/255) > olimit)))\n                return 0;\n            if (litLength >= RUN_MASK) {\n                int len = (int)litLength-RUN_MASK;\n                *token = (RUN_MASK<<ML_BITS);\n                for(; len >= 255 ; len-=255) *op++ = 255;\n                *op++ = (BYTE)len;\n            }\n            else *token = (BYTE)(litLength<<ML_BITS);\n\n            /* Copy Literals */\n            LZ4_wildCopy(op, anchor, op+litLength);\n            op+=litLength;\n        }\n\n_next_match:\n        /* Encode Offset */\n        LZ4_writeLE16(op, (U16)(ip-match)); op+=2;\n\n        /* Encode MatchLength */\n        {   unsigned matchCode;\n\n            if ((dict==usingExtDict) && (lowLimit==dictionary)) {\n                const BYTE* limit;\n                match += refDelta;\n                limit = ip + (dictEnd-match);\n                if (limit > matchlimit) limit = matchlimit;\n                matchCode = LZ4_count(ip+MINMATCH, match+MINMATCH, limit);\n                ip += MINMATCH + matchCode;\n                if (ip==limit) {\n                    unsigned const more = LZ4_count(ip, (const BYTE*)source, matchlimit);\n                    matchCode += more;\n                    ip += more;\n                }\n            } else {\n                matchCode = LZ4_count(ip+MINMATCH, match+MINMATCH, matchlimit);\n                ip += MINMATCH + matchCode;\n            }\n\n            if ( outputLimited &&    /* Check output buffer overflow */\n                (unlikely(op + (1 + LASTLITERALS) + (matchCode>>8) > olimit)) )\n                return 0;\n            if (matchCode >= ML_MASK) {\n                *token += ML_MASK;\n                matchCode -= ML_MASK;\n                LZ4_write32(op, 0xFFFFFFFF);\n                while (matchCode >= 4*255) {\n                    op+=4;\n                    LZ4_write32(op, 0xFFFFFFFF);\n                    matchCode -= 4*255;\n                }\n                op += matchCode / 255;\n                *op++ = (BYTE)(matchCode % 255);\n            } else\n                *token += (BYTE)(matchCode);\n        }\n\n        anchor = ip;\n\n        /* Test end of chunk */\n        if (ip > mflimit) break;\n\n        /* Fill table */\n        LZ4_putPosition(ip-2, cctx->hashTable, tableType, base);\n\n        /* Test next position */\n        match = LZ4_getPosition(ip, cctx->hashTable, tableType, base);\n        if (dict==usingExtDict) {\n            if (match < (const BYTE*)source) {\n                refDelta = dictDelta;\n                lowLimit = dictionary;\n            } else {\n                refDelta = 0;\n                lowLimit = (const BYTE*)source;\n        }   }\n        LZ4_putPosition(ip, cctx->hashTable, tableType, base);\n        if ( ((dictIssue==dictSmall) ? (match>=lowRefLimit) : 1)\n            && (match+MAX_DISTANCE>=ip)\n            && (LZ4_read32(match+refDelta)==LZ4_read32(ip)) )\n        { token=op++; *token=0; goto _next_match; }\n\n        /* Prepare next loop */\n        forwardH = LZ4_hashPosition(++ip, tableType);\n    }\n\n_last_literals:\n    /* Encode Last Literals */\n    {   size_t const lastRun = (size_t)(iend - anchor);\n        if ( (outputLimited) &&  /* Check output buffer overflow */\n            ((op - (BYTE*)dest) + lastRun + 1 + ((lastRun+255-RUN_MASK)/255) > (U32)maxOutputSize) )\n            return 0;\n        if (lastRun >= RUN_MASK) {\n            size_t accumulator = lastRun - RUN_MASK;\n            *op++ = RUN_MASK << ML_BITS;\n            for(; accumulator >= 255 ; accumulator-=255) *op++ = 255;\n            *op++ = (BYTE) accumulator;\n        } else {\n            *op++ = (BYTE)(lastRun<<ML_BITS);\n        }\n        memcpy(op, anchor, lastRun);\n        op += lastRun;\n    }\n\n    /* End */\n    return (int) (((char*)op)-dest);\n}\n\n\nint LZ4_compress_fast_extState(void* state, const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration)\n{\n    LZ4_stream_t_internal* ctx = &((LZ4_stream_t*)state)->internal_donotuse;\n    LZ4_resetStream((LZ4_stream_t*)state);\n    if (acceleration < 1) acceleration = ACCELERATION_DEFAULT;\n\n    if (maxOutputSize >= LZ4_compressBound(inputSize)) {\n        if (inputSize < LZ4_64Klimit)\n            return LZ4_compress_generic(ctx, source, dest, inputSize,             0,    notLimited,                        byU16, noDict, noDictIssue, acceleration);\n        else\n            return LZ4_compress_generic(ctx, source, dest, inputSize,             0,    notLimited, (sizeof(void*)==8) ? byU32 : byPtr, noDict, noDictIssue, acceleration);\n    } else {\n        if (inputSize < LZ4_64Klimit)\n            return LZ4_compress_generic(ctx, source, dest, inputSize, maxOutputSize, limitedOutput,                        byU16, noDict, noDictIssue, acceleration);\n        else\n            return LZ4_compress_generic(ctx, source, dest, inputSize, maxOutputSize, limitedOutput, (sizeof(void*)==8) ? byU32 : byPtr, noDict, noDictIssue, acceleration);\n    }\n}\n\n\nint LZ4_compress_fast(const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration)\n{\n#if (LZ4_HEAPMODE)\n    void* ctxPtr = ALLOCATOR(1, sizeof(LZ4_stream_t));   /* malloc-calloc always properly aligned */\n#else\n    LZ4_stream_t ctx;\n    void* const ctxPtr = &ctx;\n#endif\n\n    int const result = LZ4_compress_fast_extState(ctxPtr, source, dest, inputSize, maxOutputSize, acceleration);\n\n#if (LZ4_HEAPMODE)\n    FREEMEM(ctxPtr);\n#endif\n    return result;\n}\n\n\nint LZ4_compress_default(const char* source, char* dest, int inputSize, int maxOutputSize)\n{\n    return LZ4_compress_fast(source, dest, inputSize, maxOutputSize, 1);\n}\n\n\n/* hidden debug function */\n/* strangely enough, gcc generates faster code when this function is uncommented, even if unused */\nint LZ4_compress_fast_force(const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration)\n{\n    LZ4_stream_t ctx;\n    LZ4_resetStream(&ctx);\n\n    if (inputSize < LZ4_64Klimit)\n        return LZ4_compress_generic(&ctx.internal_donotuse, source, dest, inputSize, maxOutputSize, limitedOutput, byU16,                        noDict, noDictIssue, acceleration);\n    else\n        return LZ4_compress_generic(&ctx.internal_donotuse, source, dest, inputSize, maxOutputSize, limitedOutput, sizeof(void*)==8 ? byU32 : byPtr, noDict, noDictIssue, acceleration);\n}\n\n\n/*-******************************\n*  *_destSize() variant\n********************************/\n\nstatic int LZ4_compress_destSize_generic(\n                       LZ4_stream_t_internal* const ctx,\n                 const char* const src,\n                       char* const dst,\n                       int*  const srcSizePtr,\n                 const int targetDstSize,\n                 const tableType_t tableType)\n{\n    const BYTE* ip = (const BYTE*) src;\n    const BYTE* base = (const BYTE*) src;\n    const BYTE* lowLimit = (const BYTE*) src;\n    const BYTE* anchor = ip;\n    const BYTE* const iend = ip + *srcSizePtr;\n    const BYTE* const mflimit = iend - MFLIMIT;\n    const BYTE* const matchlimit = iend - LASTLITERALS;\n\n    BYTE* op = (BYTE*) dst;\n    BYTE* const oend = op + targetDstSize;\n    BYTE* const oMaxLit = op + targetDstSize - 2 /* offset */ - 8 /* because 8+MINMATCH==MFLIMIT */ - 1 /* token */;\n    BYTE* const oMaxMatch = op + targetDstSize - (LASTLITERALS + 1 /* token */);\n    BYTE* const oMaxSeq = oMaxLit - 1 /* token */;\n\n    U32 forwardH;\n\n\n    /* Init conditions */\n    if (targetDstSize < 1) return 0;                                     /* Impossible to store anything */\n    if ((U32)*srcSizePtr > (U32)LZ4_MAX_INPUT_SIZE) return 0;            /* Unsupported input size, too large (or negative) */\n    if ((tableType == byU16) && (*srcSizePtr>=LZ4_64Klimit)) return 0;   /* Size too large (not within 64K limit) */\n    if (*srcSizePtr<LZ4_minLength) goto _last_literals;                  /* Input too small, no compression (all literals) */\n\n    /* First Byte */\n    *srcSizePtr = 0;\n    LZ4_putPosition(ip, ctx->hashTable, tableType, base);\n    ip++; forwardH = LZ4_hashPosition(ip, tableType);\n\n    /* Main Loop */\n    for ( ; ; ) {\n        const BYTE* match;\n        BYTE* token;\n\n        /* Find a match */\n        {   const BYTE* forwardIp = ip;\n            unsigned step = 1;\n            unsigned searchMatchNb = 1 << LZ4_skipTrigger;\n\n            do {\n                U32 h = forwardH;\n                ip = forwardIp;\n                forwardIp += step;\n                step = (searchMatchNb++ >> LZ4_skipTrigger);\n\n                if (unlikely(forwardIp > mflimit)) goto _last_literals;\n\n                match = LZ4_getPositionOnHash(h, ctx->hashTable, tableType, base);\n                forwardH = LZ4_hashPosition(forwardIp, tableType);\n                LZ4_putPositionOnHash(ip, h, ctx->hashTable, tableType, base);\n\n            } while ( ((tableType==byU16) ? 0 : (match + MAX_DISTANCE < ip))\n                || (LZ4_read32(match) != LZ4_read32(ip)) );\n        }\n\n        /* Catch up */\n        while ((ip>anchor) && (match > lowLimit) && (unlikely(ip[-1]==match[-1]))) { ip--; match--; }\n\n        /* Encode Literal length */\n        {   unsigned litLength = (unsigned)(ip - anchor);\n            token = op++;\n            if (op + ((litLength+240)/255) + litLength > oMaxLit) {\n                /* Not enough space for a last match */\n                op--;\n                goto _last_literals;\n            }\n            if (litLength>=RUN_MASK) {\n                unsigned len = litLength - RUN_MASK;\n                *token=(RUN_MASK<<ML_BITS);\n                for(; len >= 255 ; len-=255) *op++ = 255;\n                *op++ = (BYTE)len;\n            }\n            else *token = (BYTE)(litLength<<ML_BITS);\n\n            /* Copy Literals */\n            LZ4_wildCopy(op, anchor, op+litLength);\n            op += litLength;\n        }\n\n_next_match:\n        /* Encode Offset */\n        LZ4_writeLE16(op, (U16)(ip-match)); op+=2;\n\n        /* Encode MatchLength */\n        {   size_t matchLength = LZ4_count(ip+MINMATCH, match+MINMATCH, matchlimit);\n\n            if (op + ((matchLength+240)/255) > oMaxMatch) {\n                /* Match description too long : reduce it */\n                matchLength = (15-1) + (oMaxMatch-op) * 255;\n            }\n            ip += MINMATCH + matchLength;\n\n            if (matchLength>=ML_MASK) {\n                *token += ML_MASK;\n                matchLength -= ML_MASK;\n                while (matchLength >= 255) { matchLength-=255; *op++ = 255; }\n                *op++ = (BYTE)matchLength;\n            }\n            else *token += (BYTE)(matchLength);\n        }\n\n        anchor = ip;\n\n        /* Test end of block */\n        if (ip > mflimit) break;\n        if (op > oMaxSeq) break;\n\n        /* Fill table */\n        LZ4_putPosition(ip-2, ctx->hashTable, tableType, base);\n\n        /* Test next position */\n        match = LZ4_getPosition(ip, ctx->hashTable, tableType, base);\n        LZ4_putPosition(ip, ctx->hashTable, tableType, base);\n        if ( (match+MAX_DISTANCE>=ip)\n            && (LZ4_read32(match)==LZ4_read32(ip)) )\n        { token=op++; *token=0; goto _next_match; }\n\n        /* Prepare next loop */\n        forwardH = LZ4_hashPosition(++ip, tableType);\n    }\n\n_last_literals:\n    /* Encode Last Literals */\n    {   size_t lastRunSize = (size_t)(iend - anchor);\n        if (op + 1 /* token */ + ((lastRunSize+240)/255) /* litLength */ + lastRunSize /* literals */ > oend) {\n            /* adapt lastRunSize to fill 'dst' */\n            lastRunSize  = (oend-op) - 1;\n            lastRunSize -= (lastRunSize+240)/255;\n        }\n        ip = anchor + lastRunSize;\n\n        if (lastRunSize >= RUN_MASK) {\n            size_t accumulator = lastRunSize - RUN_MASK;\n            *op++ = RUN_MASK << ML_BITS;\n            for(; accumulator >= 255 ; accumulator-=255) *op++ = 255;\n            *op++ = (BYTE) accumulator;\n        } else {\n            *op++ = (BYTE)(lastRunSize<<ML_BITS);\n        }\n        memcpy(op, anchor, lastRunSize);\n        op += lastRunSize;\n    }\n\n    /* End */\n    *srcSizePtr = (int) (((const char*)ip)-src);\n    return (int) (((char*)op)-dst);\n}\n\n\nstatic int LZ4_compress_destSize_extState (LZ4_stream_t* state, const char* src, char* dst, int* srcSizePtr, int targetDstSize)\n{\n    LZ4_resetStream(state);\n\n    if (targetDstSize >= LZ4_compressBound(*srcSizePtr)) {  /* compression success is guaranteed */\n        return LZ4_compress_fast_extState(state, src, dst, *srcSizePtr, targetDstSize, 1);\n    } else {\n        if (*srcSizePtr < LZ4_64Klimit)\n            return LZ4_compress_destSize_generic(&state->internal_donotuse, src, dst, srcSizePtr, targetDstSize, byU16);\n        else\n            return LZ4_compress_destSize_generic(&state->internal_donotuse, src, dst, srcSizePtr, targetDstSize, sizeof(void*)==8 ? byU32 : byPtr);\n    }\n}\n\n\nint LZ4_compress_destSize(const char* src, char* dst, int* srcSizePtr, int targetDstSize)\n{\n#if (LZ4_HEAPMODE)\n    LZ4_stream_t* ctx = (LZ4_stream_t*)ALLOCATOR(1, sizeof(LZ4_stream_t));   /* malloc-calloc always properly aligned */\n#else\n    LZ4_stream_t ctxBody;\n    LZ4_stream_t* ctx = &ctxBody;\n#endif\n\n    int result = LZ4_compress_destSize_extState(ctx, src, dst, srcSizePtr, targetDstSize);\n\n#if (LZ4_HEAPMODE)\n    FREEMEM(ctx);\n#endif\n    return result;\n}\n\n\n\n/*-******************************\n*  Streaming functions\n********************************/\n\nLZ4_stream_t* LZ4_createStream(void)\n{\n    LZ4_stream_t* lz4s = (LZ4_stream_t*)ALLOCATOR(8, LZ4_STREAMSIZE_U64);\n    LZ4_STATIC_ASSERT(LZ4_STREAMSIZE >= sizeof(LZ4_stream_t_internal));    /* A compilation error here means LZ4_STREAMSIZE is not large enough */\n    LZ4_resetStream(lz4s);\n    return lz4s;\n}\n\nvoid LZ4_resetStream (LZ4_stream_t* LZ4_stream)\n{\n    DEBUGLOG(4, \"LZ4_resetStream\");\n    MEM_INIT(LZ4_stream, 0, sizeof(LZ4_stream_t));\n}\n\nint LZ4_freeStream (LZ4_stream_t* LZ4_stream)\n{\n    if (!LZ4_stream) return 0;   /* support free on NULL */\n    FREEMEM(LZ4_stream);\n    return (0);\n}\n\n\n#define HASH_UNIT sizeof(reg_t)\nint LZ4_loadDict (LZ4_stream_t* LZ4_dict, const char* dictionary, int dictSize)\n{\n    LZ4_stream_t_internal* dict = &LZ4_dict->internal_donotuse;\n    const BYTE* p = (const BYTE*)dictionary;\n    const BYTE* const dictEnd = p + dictSize;\n    const BYTE* base;\n\n    if ((dict->initCheck) || (dict->currentOffset > 1 GB))  /* Uninitialized structure, or reuse overflow */\n        LZ4_resetStream(LZ4_dict);\n\n    if (dictSize < (int)HASH_UNIT) {\n        dict->dictionary = NULL;\n        dict->dictSize = 0;\n        return 0;\n    }\n\n    if ((dictEnd - p) > 64 KB) p = dictEnd - 64 KB;\n    dict->currentOffset += 64 KB;\n    base = p - dict->currentOffset;\n    dict->dictionary = p;\n    dict->dictSize = (U32)(dictEnd - p);\n    dict->currentOffset += dict->dictSize;\n\n    while (p <= dictEnd-HASH_UNIT) {\n        LZ4_putPosition(p, dict->hashTable, byU32, base);\n        p+=3;\n    }\n\n    return dict->dictSize;\n}\n\n\nstatic void LZ4_renormDictT(LZ4_stream_t_internal* LZ4_dict, const BYTE* src)\n{\n    if ((LZ4_dict->currentOffset > 0x80000000) ||\n        ((uptrval)LZ4_dict->currentOffset > (uptrval)src)) {   /* address space overflow */\n        /* rescale hash table */\n        U32 const delta = LZ4_dict->currentOffset - 64 KB;\n        const BYTE* dictEnd = LZ4_dict->dictionary + LZ4_dict->dictSize;\n        int i;\n        for (i=0; i<LZ4_HASH_SIZE_U32; i++) {\n            if (LZ4_dict->hashTable[i] < delta) LZ4_dict->hashTable[i]=0;\n            else LZ4_dict->hashTable[i] -= delta;\n        }\n        LZ4_dict->currentOffset = 64 KB;\n        if (LZ4_dict->dictSize > 64 KB) LZ4_dict->dictSize = 64 KB;\n        LZ4_dict->dictionary = dictEnd - LZ4_dict->dictSize;\n    }\n}\n\n\nint LZ4_compress_fast_continue (LZ4_stream_t* LZ4_stream, const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration)\n{\n    LZ4_stream_t_internal* streamPtr = &LZ4_stream->internal_donotuse;\n    const BYTE* const dictEnd = streamPtr->dictionary + streamPtr->dictSize;\n\n    const BYTE* smallest = (const BYTE*) source;\n    if (streamPtr->initCheck) return 0;   /* Uninitialized structure detected */\n    if ((streamPtr->dictSize>0) && (smallest>dictEnd)) smallest = dictEnd;\n    LZ4_renormDictT(streamPtr, smallest);\n    if (acceleration < 1) acceleration = ACCELERATION_DEFAULT;\n\n    /* Check overlapping input/dictionary space */\n    {   const BYTE* sourceEnd = (const BYTE*) source + inputSize;\n        if ((sourceEnd > streamPtr->dictionary) && (sourceEnd < dictEnd)) {\n            streamPtr->dictSize = (U32)(dictEnd - sourceEnd);\n            if (streamPtr->dictSize > 64 KB) streamPtr->dictSize = 64 KB;\n            if (streamPtr->dictSize < 4) streamPtr->dictSize = 0;\n            streamPtr->dictionary = dictEnd - streamPtr->dictSize;\n        }\n    }\n\n    /* prefix mode : source data follows dictionary */\n    if (dictEnd == (const BYTE*)source) {\n        int result;\n        if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset))\n            result = LZ4_compress_generic(streamPtr, source, dest, inputSize, maxOutputSize, limitedOutput, byU32, withPrefix64k, dictSmall, acceleration);\n        else\n            result = LZ4_compress_generic(streamPtr, source, dest, inputSize, maxOutputSize, limitedOutput, byU32, withPrefix64k, noDictIssue, acceleration);\n        streamPtr->dictSize += (U32)inputSize;\n        streamPtr->currentOffset += (U32)inputSize;\n        return result;\n    }\n\n    /* external dictionary mode */\n    {   int result;\n        if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset))\n            result = LZ4_compress_generic(streamPtr, source, dest, inputSize, maxOutputSize, limitedOutput, byU32, usingExtDict, dictSmall, acceleration);\n        else\n            result = LZ4_compress_generic(streamPtr, source, dest, inputSize, maxOutputSize, limitedOutput, byU32, usingExtDict, noDictIssue, acceleration);\n        streamPtr->dictionary = (const BYTE*)source;\n        streamPtr->dictSize = (U32)inputSize;\n        streamPtr->currentOffset += (U32)inputSize;\n        return result;\n    }\n}\n\n\n/* Hidden debug function, to force external dictionary mode */\nint LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* dest, int inputSize)\n{\n    LZ4_stream_t_internal* streamPtr = &LZ4_dict->internal_donotuse;\n    int result;\n    const BYTE* const dictEnd = streamPtr->dictionary + streamPtr->dictSize;\n\n    const BYTE* smallest = dictEnd;\n    if (smallest > (const BYTE*) source) smallest = (const BYTE*) source;\n    LZ4_renormDictT(streamPtr, smallest);\n\n    result = LZ4_compress_generic(streamPtr, source, dest, inputSize, 0, notLimited, byU32, usingExtDict, noDictIssue, 1);\n\n    streamPtr->dictionary = (const BYTE*)source;\n    streamPtr->dictSize = (U32)inputSize;\n    streamPtr->currentOffset += (U32)inputSize;\n\n    return result;\n}\n\n\n/*! LZ4_saveDict() :\n *  If previously compressed data block is not guaranteed to remain available at its memory location,\n *  save it into a safer place (char* safeBuffer).\n *  Note : you don't need to call LZ4_loadDict() afterwards,\n *         dictionary is immediately usable, you can therefore call LZ4_compress_fast_continue().\n *  Return : saved dictionary size in bytes (necessarily <= dictSize), or 0 if error.\n */\nint LZ4_saveDict (LZ4_stream_t* LZ4_dict, char* safeBuffer, int dictSize)\n{\n    LZ4_stream_t_internal* const dict = &LZ4_dict->internal_donotuse;\n    const BYTE* const previousDictEnd = dict->dictionary + dict->dictSize;\n\n    if ((U32)dictSize > 64 KB) dictSize = 64 KB;   /* useless to define a dictionary > 64 KB */\n    if ((U32)dictSize > dict->dictSize) dictSize = dict->dictSize;\n\n    memmove(safeBuffer, previousDictEnd - dictSize, dictSize);\n\n    dict->dictionary = (const BYTE*)safeBuffer;\n    dict->dictSize = (U32)dictSize;\n\n    return dictSize;\n}\n\n\n\n/*-*****************************\n*  Decompression functions\n*******************************/\n/*! LZ4_decompress_generic() :\n *  This generic decompression function covers all use cases.\n *  It shall be instantiated several times, using different sets of directives.\n *  Note that it is important for performance that this function really get inlined,\n *  in order to remove useless branches during compilation optimization.\n */\nLZ4_FORCE_O2_GCC_PPC64LE\nLZ4_FORCE_INLINE int LZ4_decompress_generic(\n                 const char* const src,\n                 char* const dst,\n                 int srcSize,\n                 int outputSize,         /* If endOnInput==endOnInputSize, this value is `dstCapacity` */\n\n                 int endOnInput,         /* endOnOutputSize, endOnInputSize */\n                 int partialDecoding,    /* full, partial */\n                 int targetOutputSize,   /* only used if partialDecoding==partial */\n                 int dict,               /* noDict, withPrefix64k, usingExtDict */\n                 const BYTE* const lowPrefix,  /* always <= dst, == dst when no prefix */\n                 const BYTE* const dictStart,  /* only if dict==usingExtDict */\n                 const size_t dictSize         /* note : = 0 if noDict */\n                 )\n{\n    const BYTE* ip = (const BYTE*) src;\n    const BYTE* const iend = ip + srcSize;\n\n    BYTE* op = (BYTE*) dst;\n    BYTE* const oend = op + outputSize;\n    BYTE* cpy;\n    BYTE* oexit = op + targetOutputSize;\n\n    const BYTE* const dictEnd = (const BYTE*)dictStart + dictSize;\n    const unsigned inc32table[8] = {0, 1, 2,  1,  0,  4, 4, 4};\n    const int      dec64table[8] = {0, 0, 0, -1, -4,  1, 2, 3};\n\n    const int safeDecode = (endOnInput==endOnInputSize);\n    const int checkOffset = ((safeDecode) && (dictSize < (int)(64 KB)));\n\n\n    /* Special cases */\n    if ((partialDecoding) && (oexit > oend-MFLIMIT)) oexit = oend-MFLIMIT;                      /* targetOutputSize too high => just decode everything */\n    if ((endOnInput) && (unlikely(outputSize==0))) return ((srcSize==1) && (*ip==0)) ? 0 : -1;  /* Empty output buffer */\n    if ((!endOnInput) && (unlikely(outputSize==0))) return (*ip==0?1:-1);\n\n    /* Main Loop : decode sequences */\n    while (1) {\n        size_t length;\n        const BYTE* match;\n        size_t offset;\n\n        unsigned const token = *ip++;\n\n        /* shortcut for common case :\n         * in most circumstances, we expect to decode small matches (<= 18 bytes) separated by few literals (<= 14 bytes).\n         * this shortcut was tested on x86 and x64, where it improves decoding speed.\n         * it has not yet been benchmarked on ARM, Power, mips, etc. */\n        if (((ip + 14 /*maxLL*/ + 2 /*offset*/ <= iend)\n          & (op + 14 /*maxLL*/ + 18 /*maxML*/ <= oend))\n          & ((token < (15<<ML_BITS)) & ((token & ML_MASK) != 15)) ) {\n            size_t const ll = token >> ML_BITS;\n            size_t const off = LZ4_readLE16(ip+ll);\n            const BYTE* const matchPtr = op + ll - off;  /* pointer underflow risk ? */\n            if ((off >= 18) /* do not deal with overlapping matches */ & (matchPtr >= lowPrefix)) {\n                size_t const ml = (token & ML_MASK) + MINMATCH;\n                memcpy(op, ip, 16); op += ll; ip += ll + 2 /*offset*/;\n                memcpy(op, matchPtr, 18); op += ml;\n                continue;\n            }\n        }\n\n        /* decode literal length */\n        if ((length=(token>>ML_BITS)) == RUN_MASK) {\n            unsigned s;\n            do {\n                s = *ip++;\n                length += s;\n            } while ( likely(endOnInput ? ip<iend-RUN_MASK : 1) & (s==255) );\n            if ((safeDecode) && unlikely((uptrval)(op)+length<(uptrval)(op))) goto _output_error;   /* overflow detection */\n            if ((safeDecode) && unlikely((uptrval)(ip)+length<(uptrval)(ip))) goto _output_error;   /* overflow detection */\n        }\n\n        /* copy literals */\n        cpy = op+length;\n        if ( ((endOnInput) && ((cpy>(partialDecoding?oexit:oend-MFLIMIT)) || (ip+length>iend-(2+1+LASTLITERALS))) )\n            || ((!endOnInput) && (cpy>oend-WILDCOPYLENGTH)) )\n        {\n            if (partialDecoding) {\n                if (cpy > oend) goto _output_error;                           /* Error : write attempt beyond end of output buffer */\n                if ((endOnInput) && (ip+length > iend)) goto _output_error;   /* Error : read attempt beyond end of input buffer */\n            } else {\n                if ((!endOnInput) && (cpy != oend)) goto _output_error;       /* Error : block decoding must stop exactly there */\n                if ((endOnInput) && ((ip+length != iend) || (cpy > oend))) goto _output_error;   /* Error : input must be consumed */\n            }\n            memcpy(op, ip, length);\n            ip += length;\n            op += length;\n            break;     /* Necessarily EOF, due to parsing restrictions */\n        }\n        LZ4_wildCopy(op, ip, cpy);\n        ip += length; op = cpy;\n\n        /* get offset */\n        offset = LZ4_readLE16(ip); ip+=2;\n        match = op - offset;\n        if ((checkOffset) && (unlikely(match + dictSize < lowPrefix))) goto _output_error;   /* Error : offset outside buffers */\n        LZ4_write32(op, (U32)offset);   /* costs ~1%; silence an msan warning when offset==0 */\n\n        /* get matchlength */\n        length = token & ML_MASK;\n        if (length == ML_MASK) {\n            unsigned s;\n            do {\n                s = *ip++;\n                if ((endOnInput) && (ip > iend-LASTLITERALS)) goto _output_error;\n                length += s;\n            } while (s==255);\n            if ((safeDecode) && unlikely((uptrval)(op)+length<(uptrval)op)) goto _output_error;   /* overflow detection */\n        }\n        length += MINMATCH;\n\n        /* check external dictionary */\n        if ((dict==usingExtDict) && (match < lowPrefix)) {\n            if (unlikely(op+length > oend-LASTLITERALS)) goto _output_error;   /* doesn't respect parsing restriction */\n\n            if (length <= (size_t)(lowPrefix-match)) {\n                /* match can be copied as a single segment from external dictionary */\n                memmove(op, dictEnd - (lowPrefix-match), length);\n                op += length;\n            } else {\n                /* match encompass external dictionary and current block */\n                size_t const copySize = (size_t)(lowPrefix-match);\n                size_t const restSize = length - copySize;\n                memcpy(op, dictEnd - copySize, copySize);\n                op += copySize;\n                if (restSize > (size_t)(op-lowPrefix)) {  /* overlap copy */\n                    BYTE* const endOfMatch = op + restSize;\n                    const BYTE* copyFrom = lowPrefix;\n                    while (op < endOfMatch) *op++ = *copyFrom++;\n                } else {\n                    memcpy(op, lowPrefix, restSize);\n                    op += restSize;\n            }   }\n            continue;\n        }\n\n        /* copy match within block */\n        cpy = op + length;\n        if (unlikely(offset<8)) {\n            op[0] = match[0];\n            op[1] = match[1];\n            op[2] = match[2];\n            op[3] = match[3];\n            match += inc32table[offset];\n            memcpy(op+4, match, 4);\n            match -= dec64table[offset];\n        } else { LZ4_copy8(op, match); match+=8; }\n        op += 8;\n\n        if (unlikely(cpy>oend-12)) {\n            BYTE* const oCopyLimit = oend-(WILDCOPYLENGTH-1);\n            if (cpy > oend-LASTLITERALS) goto _output_error;    /* Error : last LASTLITERALS bytes must be literals (uncompressed) */\n            if (op < oCopyLimit) {\n                LZ4_wildCopy(op, match, oCopyLimit);\n                match += oCopyLimit - op;\n                op = oCopyLimit;\n            }\n            while (op<cpy) *op++ = *match++;\n        } else {\n            LZ4_copy8(op, match);\n            if (length>16) LZ4_wildCopy(op+8, match+8, cpy);\n        }\n        op = cpy;   /* correction */\n    }\n\n    /* end of decoding */\n    if (endOnInput)\n       return (int) (((char*)op)-dst);     /* Nb of output bytes decoded */\n    else\n       return (int) (((const char*)ip)-src);   /* Nb of input bytes read */\n\n    /* Overflow error detected */\n_output_error:\n    return (int) (-(((const char*)ip)-src))-1;\n}\n\n\nLZ4_FORCE_O2_GCC_PPC64LE\nint LZ4_decompress_safe(const char* source, char* dest, int compressedSize, int maxDecompressedSize)\n{\n    return LZ4_decompress_generic(source, dest, compressedSize, maxDecompressedSize, endOnInputSize, full, 0, noDict, (BYTE*)dest, NULL, 0);\n}\n\nLZ4_FORCE_O2_GCC_PPC64LE\nint LZ4_decompress_safe_partial(const char* source, char* dest, int compressedSize, int targetOutputSize, int maxDecompressedSize)\n{\n    return LZ4_decompress_generic(source, dest, compressedSize, maxDecompressedSize, endOnInputSize, partial, targetOutputSize, noDict, (BYTE*)dest, NULL, 0);\n}\n\nLZ4_FORCE_O2_GCC_PPC64LE\nint LZ4_decompress_fast(const char* source, char* dest, int originalSize)\n{\n    return LZ4_decompress_generic(source, dest, 0, originalSize, endOnOutputSize, full, 0, withPrefix64k, (BYTE*)(dest - 64 KB), NULL, 64 KB);\n}\n\n\n/*===== streaming decompression functions =====*/\n\nLZ4_streamDecode_t* LZ4_createStreamDecode(void)\n{\n    LZ4_streamDecode_t* lz4s = (LZ4_streamDecode_t*) ALLOCATOR(1, sizeof(LZ4_streamDecode_t));\n    return lz4s;\n}\n\nint LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream)\n{\n    if (!LZ4_stream) return 0;   /* support free on NULL */\n    FREEMEM(LZ4_stream);\n    return 0;\n}\n\n/*!\n * LZ4_setStreamDecode() :\n * Use this function to instruct where to find the dictionary.\n * This function is not necessary if previous data is still available where it was decoded.\n * Loading a size of 0 is allowed (same effect as no dictionary).\n * Return : 1 if OK, 0 if error\n */\nint LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize)\n{\n    LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse;\n    lz4sd->prefixSize = (size_t) dictSize;\n    lz4sd->prefixEnd = (const BYTE*) dictionary + dictSize;\n    lz4sd->externalDict = NULL;\n    lz4sd->extDictSize  = 0;\n    return 1;\n}\n\n/*\n*_continue() :\n    These decoding functions allow decompression of multiple blocks in \"streaming\" mode.\n    Previously decoded blocks must still be available at the memory position where they were decoded.\n    If it's not possible, save the relevant part of decoded data into a safe buffer,\n    and indicate where it stands using LZ4_setStreamDecode()\n*/\nLZ4_FORCE_O2_GCC_PPC64LE\nint LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int compressedSize, int maxOutputSize)\n{\n    LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse;\n    int result;\n\n    if (lz4sd->prefixEnd == (BYTE*)dest) {\n        result = LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize,\n                                        endOnInputSize, full, 0,\n                                        usingExtDict, lz4sd->prefixEnd - lz4sd->prefixSize, lz4sd->externalDict, lz4sd->extDictSize);\n        if (result <= 0) return result;\n        lz4sd->prefixSize += result;\n        lz4sd->prefixEnd  += result;\n    } else {\n        lz4sd->extDictSize = lz4sd->prefixSize;\n        lz4sd->externalDict = lz4sd->prefixEnd - lz4sd->extDictSize;\n        result = LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize,\n                                        endOnInputSize, full, 0,\n                                        usingExtDict, (BYTE*)dest, lz4sd->externalDict, lz4sd->extDictSize);\n        if (result <= 0) return result;\n        lz4sd->prefixSize = result;\n        lz4sd->prefixEnd  = (BYTE*)dest + result;\n    }\n\n    return result;\n}\n\nLZ4_FORCE_O2_GCC_PPC64LE\nint LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int originalSize)\n{\n    LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse;\n    int result;\n\n    if (lz4sd->prefixEnd == (BYTE*)dest) {\n        result = LZ4_decompress_generic(source, dest, 0, originalSize,\n                                        endOnOutputSize, full, 0,\n                                        usingExtDict, lz4sd->prefixEnd - lz4sd->prefixSize, lz4sd->externalDict, lz4sd->extDictSize);\n        if (result <= 0) return result;\n        lz4sd->prefixSize += originalSize;\n        lz4sd->prefixEnd  += originalSize;\n    } else {\n        lz4sd->extDictSize = lz4sd->prefixSize;\n        lz4sd->externalDict = lz4sd->prefixEnd - lz4sd->extDictSize;\n        result = LZ4_decompress_generic(source, dest, 0, originalSize,\n                                        endOnOutputSize, full, 0,\n                                        usingExtDict, (BYTE*)dest, lz4sd->externalDict, lz4sd->extDictSize);\n        if (result <= 0) return result;\n        lz4sd->prefixSize = originalSize;\n        lz4sd->prefixEnd  = (BYTE*)dest + originalSize;\n    }\n\n    return result;\n}\n\n\n/*\nAdvanced decoding functions :\n*_usingDict() :\n    These decoding functions work the same as \"_continue\" ones,\n    the dictionary must be explicitly provided within parameters\n*/\n\nLZ4_FORCE_O2_GCC_PPC64LE\nLZ4_FORCE_INLINE int LZ4_decompress_usingDict_generic(const char* source, char* dest, int compressedSize, int maxOutputSize, int safe, const char* dictStart, int dictSize)\n{\n    if (dictSize==0)\n        return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, full, 0, noDict, (BYTE*)dest, NULL, 0);\n    if (dictStart+dictSize == dest) {\n        if (dictSize >= (int)(64 KB - 1))\n            return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, full, 0, withPrefix64k, (BYTE*)dest-64 KB, NULL, 0);\n        return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, full, 0, noDict, (BYTE*)dest-dictSize, NULL, 0);\n    }\n    return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, full, 0, usingExtDict, (BYTE*)dest, (const BYTE*)dictStart, dictSize);\n}\n\nLZ4_FORCE_O2_GCC_PPC64LE\nint LZ4_decompress_safe_usingDict(const char* source, char* dest, int compressedSize, int maxOutputSize, const char* dictStart, int dictSize)\n{\n    return LZ4_decompress_usingDict_generic(source, dest, compressedSize, maxOutputSize, 1, dictStart, dictSize);\n}\n\nLZ4_FORCE_O2_GCC_PPC64LE\nint LZ4_decompress_fast_usingDict(const char* source, char* dest, int originalSize, const char* dictStart, int dictSize)\n{\n    return LZ4_decompress_usingDict_generic(source, dest, 0, originalSize, 0, dictStart, dictSize);\n}\n\n/* debug function */\nLZ4_FORCE_O2_GCC_PPC64LE\nint LZ4_decompress_safe_forceExtDict(const char* source, char* dest, int compressedSize, int maxOutputSize, const char* dictStart, int dictSize)\n{\n    return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, endOnInputSize, full, 0, usingExtDict, (BYTE*)dest, (const BYTE*)dictStart, dictSize);\n}\n\n\n/*=*************************************************\n*  Obsolete Functions\n***************************************************/\n/* obsolete compression functions */\nint LZ4_compress_limitedOutput(const char* source, char* dest, int inputSize, int maxOutputSize) { return LZ4_compress_default(source, dest, inputSize, maxOutputSize); }\nint LZ4_compress(const char* source, char* dest, int inputSize) { return LZ4_compress_default(source, dest, inputSize, LZ4_compressBound(inputSize)); }\nint LZ4_compress_limitedOutput_withState (void* state, const char* src, char* dst, int srcSize, int dstSize) { return LZ4_compress_fast_extState(state, src, dst, srcSize, dstSize, 1); }\nint LZ4_compress_withState (void* state, const char* src, char* dst, int srcSize) { return LZ4_compress_fast_extState(state, src, dst, srcSize, LZ4_compressBound(srcSize), 1); }\nint LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_stream, const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_fast_continue(LZ4_stream, src, dst, srcSize, maxDstSize, 1); }\nint LZ4_compress_continue (LZ4_stream_t* LZ4_stream, const char* source, char* dest, int inputSize) { return LZ4_compress_fast_continue(LZ4_stream, source, dest, inputSize, LZ4_compressBound(inputSize), 1); }\n\n/*\nThese function names are deprecated and should no longer be used.\nThey are only provided here for compatibility with older user programs.\n- LZ4_uncompress is totally equivalent to LZ4_decompress_fast\n- LZ4_uncompress_unknownOutputSize is totally equivalent to LZ4_decompress_safe\n*/\nint LZ4_uncompress (const char* source, char* dest, int outputSize) { return LZ4_decompress_fast(source, dest, outputSize); }\nint LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize) { return LZ4_decompress_safe(source, dest, isize, maxOutputSize); }\n\n\n/* Obsolete Streaming functions */\n\nint LZ4_sizeofStreamState() { return LZ4_STREAMSIZE; }\n\nstatic void LZ4_init(LZ4_stream_t* lz4ds, BYTE* base)\n{\n    MEM_INIT(lz4ds, 0, sizeof(LZ4_stream_t));\n    lz4ds->internal_donotuse.bufferStart = base;\n}\n\nint LZ4_resetStreamState(void* state, char* inputBuffer)\n{\n    if ((((uptrval)state) & 3) != 0) return 1;   /* Error : pointer is not aligned on 4-bytes boundary */\n    LZ4_init((LZ4_stream_t*)state, (BYTE*)inputBuffer);\n    return 0;\n}\n\nvoid* LZ4_create (char* inputBuffer)\n{\n    LZ4_stream_t* lz4ds = (LZ4_stream_t*)ALLOCATOR(8, sizeof(LZ4_stream_t));\n    LZ4_init (lz4ds, (BYTE*)inputBuffer);\n    return lz4ds;\n}\n\nchar* LZ4_slideInputBuffer (void* LZ4_Data)\n{\n    LZ4_stream_t_internal* ctx = &((LZ4_stream_t*)LZ4_Data)->internal_donotuse;\n    int dictSize = LZ4_saveDict((LZ4_stream_t*)LZ4_Data, (char*)ctx->bufferStart, 64 KB);\n    return (char*)(ctx->bufferStart + dictSize);\n}\n\n/* Obsolete streaming decompression functions */\n\nint LZ4_decompress_safe_withPrefix64k(const char* source, char* dest, int compressedSize, int maxOutputSize)\n{\n    return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, endOnInputSize, full, 0, withPrefix64k, (BYTE*)dest - 64 KB, NULL, 64 KB);\n}\n\nint LZ4_decompress_fast_withPrefix64k(const char* source, char* dest, int originalSize)\n{\n    return LZ4_decompress_generic(source, dest, 0, originalSize, endOnOutputSize, full, 0, withPrefix64k, (BYTE*)dest - 64 KB, NULL, 64 KB);\n}\n\n#endif   /* LZ4_COMMONDEFS_ONLY */\n"
  },
  {
    "path": "src/libraries/lz4/lz4.h",
    "content": "/*\n *  LZ4 - Fast LZ compression algorithm\n *  Header File\n *  Copyright (C) 2011-2017, Yann Collet.\n\n   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)\n\n   Redistribution and use in source and binary forms, with or without\n   modification, are permitted provided that the following conditions are\n   met:\n\n       * Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n       * Redistributions in binary form must reproduce the above\n   copyright notice, this list of conditions and the following disclaimer\n   in the documentation and/or other materials provided with the\n   distribution.\n\n   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n   \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n   You can contact the author at :\n    - LZ4 homepage : http://www.lz4.org\n    - LZ4 source repository : https://github.com/lz4/lz4\n*/\n#if defined (__cplusplus)\nextern \"C\" {\n#endif\n\n#ifndef LZ4_H_2983827168210\n#define LZ4_H_2983827168210\n\n/* --- Dependency --- */\n#include <stddef.h>   /* size_t */\n\n\n/**\n  Introduction\n\n  LZ4 is lossless compression algorithm, providing compression speed at 400 MB/s per core,\n  scalable with multi-cores CPU. It features an extremely fast decoder, with speed in\n  multiple GB/s per core, typically reaching RAM speed limits on multi-core systems.\n\n  The LZ4 compression library provides in-memory compression and decompression functions.\n  Compression can be done in:\n    - a single step (described as Simple Functions)\n    - a single step, reusing a context (described in Advanced Functions)\n    - unbounded multiple steps (described as Streaming compression)\n\n  lz4.h provides block compression functions. It gives full buffer control to user.\n  Decompressing an lz4-compressed block also requires metadata (such as compressed size).\n  Each application is free to encode such metadata in whichever way it wants.\n\n  An additional format, called LZ4 frame specification (doc/lz4_Frame_format.md),\n  take care of encoding standard metadata alongside LZ4-compressed blocks.\n  If your application requires interoperability, it's recommended to use it.\n  A library is provided to take care of it, see lz4frame.h.\n*/\n\n/*^***************************************************************\n*  Export parameters\n*****************************************************************/\n/*\n*  LZ4_DLL_EXPORT :\n*  Enable exporting of functions when building a Windows DLL\n*  LZ4LIB_VISIBILITY :\n*  Control library symbols visibility.\n*/\n#ifndef LZ4LIB_VISIBILITY\n#  if defined(__GNUC__) && (__GNUC__ >= 4)\n#    define LZ4LIB_VISIBILITY __attribute__ ((visibility (\"default\")))\n#  else\n#    define LZ4LIB_VISIBILITY\n#  endif\n#endif\n#if defined(LZ4_DLL_EXPORT) && (LZ4_DLL_EXPORT==1)\n#  define LZ4LIB_API __declspec(dllexport) LZ4LIB_VISIBILITY\n#elif defined(LZ4_DLL_IMPORT) && (LZ4_DLL_IMPORT==1)\n#  define LZ4LIB_API __declspec(dllimport) LZ4LIB_VISIBILITY /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/\n#else\n#  define LZ4LIB_API LZ4LIB_VISIBILITY\n#endif\n\n/*------   Version   ------*/\n#define LZ4_VERSION_MAJOR    1    /* for breaking interface changes  */\n#define LZ4_VERSION_MINOR    8    /* for new (non-breaking) interface capabilities */\n#define LZ4_VERSION_RELEASE  0    /* for tweaks, bug-fixes, or development */\n\n#define LZ4_VERSION_NUMBER (LZ4_VERSION_MAJOR *100*100 + LZ4_VERSION_MINOR *100 + LZ4_VERSION_RELEASE)\n\n#define LZ4_LIB_VERSION LZ4_VERSION_MAJOR.LZ4_VERSION_MINOR.LZ4_VERSION_RELEASE\n#define LZ4_QUOTE(str) #str\n#define LZ4_EXPAND_AND_QUOTE(str) LZ4_QUOTE(str)\n#define LZ4_VERSION_STRING LZ4_EXPAND_AND_QUOTE(LZ4_LIB_VERSION)\n\nLZ4LIB_API int LZ4_versionNumber (void);  /**< library version number; to be used when checking dll version */\nLZ4LIB_API const char* LZ4_versionString (void);   /**< library version string; to be used when checking dll version */\n\n\n/*-************************************\n*  Tuning parameter\n**************************************/\n/*!\n * LZ4_MEMORY_USAGE :\n * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.)\n * Increasing memory usage improves compression ratio\n * Reduced memory usage can improve speed, due to cache effect\n * Default value is 14, for 16KB, which nicely fits into Intel x86 L1 cache\n */\n#ifndef LZ4_MEMORY_USAGE\n# define LZ4_MEMORY_USAGE 14\n#endif\n\n/*-************************************\n*  Simple Functions\n**************************************/\n/*! LZ4_compress_default() :\n    Compresses 'srcSize' bytes from buffer 'src'\n    into already allocated 'dst' buffer of size 'dstCapacity'.\n    Compression is guaranteed to succeed if 'dstCapacity' >= LZ4_compressBound(srcSize).\n    It also runs faster, so it's a recommended setting.\n    If the function cannot compress 'src' into a limited 'dst' budget,\n    compression stops *immediately*, and the function result is zero.\n    As a consequence, 'dst' content is not valid.\n    This function never writes outside 'dst' buffer, nor read outside 'source' buffer.\n        srcSize : supported max value is LZ4_MAX_INPUT_VALUE\n        dstCapacity : full or partial size of buffer 'dst' (which must be already allocated)\n        return  : the number of bytes written into buffer 'dst' (necessarily <= dstCapacity)\n                  or 0 if compression fails */\nLZ4LIB_API int LZ4_compress_default(const char* src, char* dst, int srcSize, int dstCapacity);\n\n/*! LZ4_decompress_safe() :\n    compressedSize : is the exact complete size of the compressed block.\n    dstCapacity : is the size of destination buffer, which must be already allocated.\n    return : the number of bytes decompressed into destination buffer (necessarily <= dstCapacity)\n             If destination buffer is not large enough, decoding will stop and output an error code (negative value).\n             If the source stream is detected malformed, the function will stop decoding and return a negative result.\n             This function is protected against buffer overflow exploits, including malicious data packets.\n             It never writes outside output buffer, nor reads outside input buffer.\n*/\nLZ4LIB_API int LZ4_decompress_safe (const char* src, char* dst, int compressedSize, int dstCapacity);\n\n\n/*-************************************\n*  Advanced Functions\n**************************************/\n#define LZ4_MAX_INPUT_SIZE        0x7E000000   /* 2 113 929 216 bytes */\n#define LZ4_COMPRESSBOUND(isize)  ((unsigned)(isize) > (unsigned)LZ4_MAX_INPUT_SIZE ? 0 : (isize) + ((isize)/255) + 16)\n\n/*!\nLZ4_compressBound() :\n    Provides the maximum size that LZ4 compression may output in a \"worst case\" scenario (input data not compressible)\n    This function is primarily useful for memory allocation purposes (destination buffer size).\n    Macro LZ4_COMPRESSBOUND() is also provided for compilation-time evaluation (stack memory allocation for example).\n    Note that LZ4_compress_default() compress faster when dest buffer size is >= LZ4_compressBound(srcSize)\n        inputSize  : max supported value is LZ4_MAX_INPUT_SIZE\n        return : maximum output size in a \"worst case\" scenario\n              or 0, if input size is too large ( > LZ4_MAX_INPUT_SIZE)\n*/\nLZ4LIB_API int LZ4_compressBound(int inputSize);\n\n/*!\nLZ4_compress_fast() :\n    Same as LZ4_compress_default(), but allows to select an \"acceleration\" factor.\n    The larger the acceleration value, the faster the algorithm, but also the lesser the compression.\n    It's a trade-off. It can be fine tuned, with each successive value providing roughly +~3% to speed.\n    An acceleration value of \"1\" is the same as regular LZ4_compress_default()\n    Values <= 0 will be replaced by ACCELERATION_DEFAULT (see lz4.c), which is 1.\n*/\nLZ4LIB_API int LZ4_compress_fast (const char* src, char* dst, int srcSize, int dstCapacity, int acceleration);\n\n\n/*!\nLZ4_compress_fast_extState() :\n    Same compression function, just using an externally allocated memory space to store compression state.\n    Use LZ4_sizeofState() to know how much memory must be allocated,\n    and allocate it on 8-bytes boundaries (using malloc() typically).\n    Then, provide it as 'void* state' to compression function.\n*/\nLZ4LIB_API int LZ4_sizeofState(void);\nLZ4LIB_API int LZ4_compress_fast_extState (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration);\n\n\n/*!\nLZ4_compress_destSize() :\n    Reverse the logic : compresses as much data as possible from 'src' buffer\n    into already allocated buffer 'dst' of size 'targetDestSize'.\n    This function either compresses the entire 'src' content into 'dst' if it's large enough,\n    or fill 'dst' buffer completely with as much data as possible from 'src'.\n        *srcSizePtr : will be modified to indicate how many bytes where read from 'src' to fill 'dst'.\n                      New value is necessarily <= old value.\n        return : Nb bytes written into 'dst' (necessarily <= targetDestSize)\n                 or 0 if compression fails\n*/\nLZ4LIB_API int LZ4_compress_destSize (const char* src, char* dst, int* srcSizePtr, int targetDstSize);\n\n\n/*!\nLZ4_decompress_fast() : (unsafe!!)\n    originalSize : is the original uncompressed size\n    return : the number of bytes read from the source buffer (in other words, the compressed size)\n             If the source stream is detected malformed, the function will stop decoding and return a negative result.\n             Destination buffer must be already allocated. Its size must be >= 'originalSize' bytes.\n    note : This function respects memory boundaries for *properly formed* compressed data.\n           It is a bit faster than LZ4_decompress_safe().\n           However, it does not provide any protection against intentionally modified data stream (malicious input).\n           Use this function in trusted environment only (data to decode comes from a trusted source).\n*/\nLZ4LIB_API int LZ4_decompress_fast (const char* src, char* dst, int originalSize);\n\n/*!\nLZ4_decompress_safe_partial() :\n    This function decompress a compressed block of size 'srcSize' at position 'src'\n    into destination buffer 'dst' of size 'dstCapacity'.\n    The function will decompress a minimum of 'targetOutputSize' bytes, and stop after that.\n    However, it's not accurate, and may write more than 'targetOutputSize' (but <= dstCapacity).\n   @return : the number of bytes decoded in the destination buffer (necessarily <= dstCapacity)\n       Note : this number can be < 'targetOutputSize' should the compressed block contain less data.\n             Always control how many bytes were decoded.\n             If the source stream is detected malformed, the function will stop decoding and return a negative result.\n             This function never writes outside of output buffer, and never reads outside of input buffer. It is therefore protected against malicious data packets.\n*/\nLZ4LIB_API int LZ4_decompress_safe_partial (const char* src, char* dst, int srcSize, int targetOutputSize, int dstCapacity);\n\n\n/*-*********************************************\n*  Streaming Compression Functions\n***********************************************/\ntypedef union LZ4_stream_u LZ4_stream_t;   /* incomplete type (defined later) */\n\n/*! LZ4_createStream() and LZ4_freeStream() :\n *  LZ4_createStream() will allocate and initialize an `LZ4_stream_t` structure.\n *  LZ4_freeStream() releases its memory.\n */\nLZ4LIB_API LZ4_stream_t* LZ4_createStream(void);\nLZ4LIB_API int           LZ4_freeStream (LZ4_stream_t* streamPtr);\n\n/*! LZ4_resetStream() :\n *  An LZ4_stream_t structure can be allocated once and re-used multiple times.\n *  Use this function to start compressing a new stream.\n */\nLZ4LIB_API void LZ4_resetStream (LZ4_stream_t* streamPtr);\n\n/*! LZ4_loadDict() :\n *  Use this function to load a static dictionary into LZ4_stream_t.\n *  Any previous data will be forgotten, only 'dictionary' will remain in memory.\n *  Loading a size of 0 is allowed, and is the same as reset.\n * @return : dictionary size, in bytes (necessarily <= 64 KB)\n */\nLZ4LIB_API int LZ4_loadDict (LZ4_stream_t* streamPtr, const char* dictionary, int dictSize);\n\n/*! LZ4_compress_fast_continue() :\n *  Compress content into 'src' using data from previously compressed blocks, improving compression ratio.\n *  'dst' buffer must be already allocated.\n *  If dstCapacity >= LZ4_compressBound(srcSize), compression is guaranteed to succeed, and runs faster.\n *\n *  Important : Up to 64KB of previously compressed data is assumed to remain present and unmodified in memory !\n *  Special 1 : If input buffer is a double-buffer, it can have any size, including < 64 KB.\n *  Special 2 : If input buffer is a ring-buffer, it can have any size, including < 64 KB.\n *\n * @return : size of compressed block\n *           or 0 if there is an error (typically, compressed data cannot fit into 'dst')\n *  After an error, the stream status is invalid, it can only be reset or freed.\n */\nLZ4LIB_API int LZ4_compress_fast_continue (LZ4_stream_t* streamPtr, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration);\n\n/*! LZ4_saveDict() :\n *  If previously compressed data block is not guaranteed to remain available at its current memory location,\n *  save it into a safer place (char* safeBuffer).\n *  Note : it's not necessary to call LZ4_loadDict() after LZ4_saveDict(), dictionary is immediately usable.\n *  @return : saved dictionary size in bytes (necessarily <= dictSize), or 0 if error.\n */\nLZ4LIB_API int LZ4_saveDict (LZ4_stream_t* streamPtr, char* safeBuffer, int dictSize);\n\n\n/*-**********************************************\n*  Streaming Decompression Functions\n*  Bufferless synchronous API\n************************************************/\ntypedef union LZ4_streamDecode_u LZ4_streamDecode_t;   /* incomplete type (defined later) */\n\n/*! LZ4_createStreamDecode() and LZ4_freeStreamDecode() :\n *  creation / destruction of streaming decompression tracking structure.\n *  A tracking structure can be re-used multiple times sequentially. */\nLZ4LIB_API LZ4_streamDecode_t* LZ4_createStreamDecode(void);\nLZ4LIB_API int                 LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream);\n\n/*! LZ4_setStreamDecode() :\n *  An LZ4_streamDecode_t structure can be allocated once and re-used multiple times.\n *  Use this function to start decompression of a new stream of blocks.\n *  A dictionary can optionnally be set. Use NULL or size 0 for a simple reset order.\n * @return : 1 if OK, 0 if error\n */\nLZ4LIB_API int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize);\n\n/*! LZ4_decompress_*_continue() :\n *  These decoding functions allow decompression of consecutive blocks in \"streaming\" mode.\n *  A block is an unsplittable entity, it must be presented entirely to a decompression function.\n *  Decompression functions only accept one block at a time.\n *  Previously decoded blocks *must* remain available at the memory position where they were decoded (up to 64 KB).\n *\n *  Special : if application sets a ring buffer for decompression, it must respect one of the following conditions :\n *  - Exactly same size as encoding buffer, with same update rule (block boundaries at same positions)\n *    In which case, the decoding & encoding ring buffer can have any size, including very small ones ( < 64 KB).\n *  - Larger than encoding buffer, by a minimum of maxBlockSize more bytes.\n *    maxBlockSize is implementation dependent. It's the maximum size of any single block.\n *    In which case, encoding and decoding buffers do not need to be synchronized,\n *    and encoding ring buffer can have any size, including small ones ( < 64 KB).\n *  - _At least_ 64 KB + 8 bytes + maxBlockSize.\n *    In which case, encoding and decoding buffers do not need to be synchronized,\n *    and encoding ring buffer can have any size, including larger than decoding buffer.\n *  Whenever these conditions are not possible, save the last 64KB of decoded data into a safe buffer,\n *  and indicate where it is saved using LZ4_setStreamDecode() before decompressing next block.\n*/\nLZ4LIB_API int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* src, char* dst, int srcSize, int dstCapacity);\nLZ4LIB_API int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* src, char* dst, int originalSize);\n\n\n/*! LZ4_decompress_*_usingDict() :\n *  These decoding functions work the same as\n *  a combination of LZ4_setStreamDecode() followed by LZ4_decompress_*_continue()\n *  They are stand-alone, and don't need an LZ4_streamDecode_t structure.\n */\nLZ4LIB_API int LZ4_decompress_safe_usingDict (const char* src, char* dst, int srcSize, int dstCapcity, const char* dictStart, int dictSize);\nLZ4LIB_API int LZ4_decompress_fast_usingDict (const char* src, char* dst, int originalSize, const char* dictStart, int dictSize);\n\n\n/*^**********************************************\n * !!!!!!   STATIC LINKING ONLY   !!!!!!\n ***********************************************/\n/*-************************************\n *  Private definitions\n **************************************\n * Do not use these definitions.\n * They are exposed to allow static allocation of `LZ4_stream_t` and `LZ4_streamDecode_t`.\n * Using these definitions will expose code to API and/or ABI break in future versions of the library.\n **************************************/\n#define LZ4_HASHLOG   (LZ4_MEMORY_USAGE-2)\n#define LZ4_HASHTABLESIZE (1 << LZ4_MEMORY_USAGE)\n#define LZ4_HASH_SIZE_U32 (1 << LZ4_HASHLOG)       /* required as macro for static allocation */\n\n#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)\n#include <stdint.h>\n\ntypedef struct {\n    uint32_t hashTable[LZ4_HASH_SIZE_U32];\n    uint32_t currentOffset;\n    uint32_t initCheck;\n    const uint8_t* dictionary;\n    uint8_t* bufferStart;   /* obsolete, used for slideInputBuffer */\n    uint32_t dictSize;\n} LZ4_stream_t_internal;\n\ntypedef struct {\n    const uint8_t* externalDict;\n    size_t extDictSize;\n    const uint8_t* prefixEnd;\n    size_t prefixSize;\n} LZ4_streamDecode_t_internal;\n\n#else\n\ntypedef struct {\n    unsigned int hashTable[LZ4_HASH_SIZE_U32];\n    unsigned int currentOffset;\n    unsigned int initCheck;\n    const unsigned char* dictionary;\n    unsigned char* bufferStart;   /* obsolete, used for slideInputBuffer */\n    unsigned int dictSize;\n} LZ4_stream_t_internal;\n\ntypedef struct {\n    const unsigned char* externalDict;\n    size_t extDictSize;\n    const unsigned char* prefixEnd;\n    size_t prefixSize;\n} LZ4_streamDecode_t_internal;\n\n#endif\n\n/*!\n * LZ4_stream_t :\n * information structure to track an LZ4 stream.\n * init this structure before first use.\n * note : only use in association with static linking !\n *        this definition is not API/ABI safe,\n *        it may change in a future version !\n */\n#define LZ4_STREAMSIZE_U64 ((1 << (LZ4_MEMORY_USAGE-3)) + 4)\n#define LZ4_STREAMSIZE     (LZ4_STREAMSIZE_U64 * sizeof(unsigned long long))\nunion LZ4_stream_u {\n    unsigned long long table[LZ4_STREAMSIZE_U64];\n    LZ4_stream_t_internal internal_donotuse;\n} ;  /* previously typedef'd to LZ4_stream_t */\n\n\n/*!\n * LZ4_streamDecode_t :\n * information structure to track an LZ4 stream during decompression.\n * init this structure  using LZ4_setStreamDecode (or memset()) before first use\n * note : only use in association with static linking !\n *        this definition is not API/ABI safe,\n *        and may change in a future version !\n */\n#define LZ4_STREAMDECODESIZE_U64  4\n#define LZ4_STREAMDECODESIZE     (LZ4_STREAMDECODESIZE_U64 * sizeof(unsigned long long))\nunion LZ4_streamDecode_u {\n    unsigned long long table[LZ4_STREAMDECODESIZE_U64];\n    LZ4_streamDecode_t_internal internal_donotuse;\n} ;   /* previously typedef'd to LZ4_streamDecode_t */\n\n\n/*-************************************\n*  Obsolete Functions\n**************************************/\n\n/*! Deprecation warnings\n   Should deprecation warnings be a problem,\n   it is generally possible to disable them,\n   typically with -Wno-deprecated-declarations for gcc\n   or _CRT_SECURE_NO_WARNINGS in Visual.\n   Otherwise, it's also possible to define LZ4_DISABLE_DEPRECATE_WARNINGS */\n#ifdef LZ4_DISABLE_DEPRECATE_WARNINGS\n#  define LZ4_DEPRECATED(message)   /* disable deprecation warnings */\n#else\n#  define LZ4_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)\n#  if defined(__clang__) /* clang doesn't handle mixed C++11 and CNU attributes */\n#    define LZ4_DEPRECATED(message) __attribute__((deprecated(message)))\n#  elif defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */\n#    define LZ4_DEPRECATED(message) [[deprecated(message)]]\n#  elif (LZ4_GCC_VERSION >= 405)\n#    define LZ4_DEPRECATED(message) __attribute__((deprecated(message)))\n#  elif (LZ4_GCC_VERSION >= 301)\n#    define LZ4_DEPRECATED(message) __attribute__((deprecated))\n#  elif defined(_MSC_VER)\n#    define LZ4_DEPRECATED(message) __declspec(deprecated(message))\n#  else\n#    pragma message(\"WARNING: You need to implement LZ4_DEPRECATED for this compiler\")\n#    define LZ4_DEPRECATED(message)\n#  endif\n#endif /* LZ4_DISABLE_DEPRECATE_WARNINGS */\n\n/* Obsolete compression functions */\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_compress_default() instead\") int LZ4_compress               (const char* source, char* dest, int sourceSize);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_compress_default() instead\") int LZ4_compress_limitedOutput (const char* source, char* dest, int sourceSize, int maxOutputSize);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_compress_fast_extState() instead\") int LZ4_compress_withState               (void* state, const char* source, char* dest, int inputSize);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_compress_fast_extState() instead\") int LZ4_compress_limitedOutput_withState (void* state, const char* source, char* dest, int inputSize, int maxOutputSize);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_compress_fast_continue() instead\") int LZ4_compress_continue                (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_compress_fast_continue() instead\") int LZ4_compress_limitedOutput_continue  (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize, int maxOutputSize);\n\n/* Obsolete decompression functions */\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_decompress_fast() instead\") int LZ4_uncompress (const char* source, char* dest, int outputSize);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_decompress_safe() instead\") int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize);\n\n/* Obsolete streaming functions; use new streaming interface whenever possible */\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_createStream() instead\") void* LZ4_create (char* inputBuffer);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_createStream() instead\") int   LZ4_sizeofStreamState(void);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_resetStream() instead\")  int   LZ4_resetStreamState(void* state, char* inputBuffer);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_saveDict() instead\")     char* LZ4_slideInputBuffer (void* state);\n\n/* Obsolete streaming decoding functions */\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_decompress_safe_usingDict() instead\") int LZ4_decompress_safe_withPrefix64k (const char* src, char* dst, int compressedSize, int maxDstSize);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_decompress_fast_usingDict() instead\") int LZ4_decompress_fast_withPrefix64k (const char* src, char* dst, int originalSize);\n\n#endif /* LZ4_H_2983827168210 */\n\n\n#if defined (__cplusplus)\n}\n#endif\n"
  },
  {
    "path": "src/libraries/lz4/lz4hc.c",
    "content": "/*\n    LZ4 HC - High Compression Mode of LZ4\n    Copyright (C) 2011-2017, Yann Collet.\n\n    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions are\n    met:\n\n    * Redistributions of source code must retain the above copyright\n    notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n    copyright notice, this list of conditions and the following disclaimer\n    in the documentation and/or other materials provided with the\n    distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n    \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n    You can contact the author at :\n       - LZ4 source repository : https://github.com/lz4/lz4\n       - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c\n*/\n/* note : lz4hc is not an independent module, it requires lz4.h/lz4.c for proper compilation */\n\n\n/* *************************************\n*  Tuning Parameter\n***************************************/\n\n/*! HEAPMODE :\n *  Select how default compression function will allocate workplace memory,\n *  in stack (0:fastest), or in heap (1:requires malloc()).\n *  Since workplace is rather large, heap mode is recommended.\n */\n#ifndef LZ4HC_HEAPMODE\n#  define LZ4HC_HEAPMODE 1\n#endif\n\n\n/*===    Dependency    ===*/\n#define LZ4_HC_STATIC_LINKING_ONLY\n#include \"lz4hc.h\"\n\n\n/*===   Common LZ4 definitions   ===*/\n#if defined(__GNUC__)\n#  pragma GCC diagnostic ignored \"-Wunused-function\"\n#endif\n#if defined (__clang__)\n#  pragma clang diagnostic ignored \"-Wunused-function\"\n#endif\n\n#define LZ4_COMMONDEFS_ONLY\n#include \"lz4.c\"   /* LZ4_count, constants, mem */\n\n\n/*===   Constants   ===*/\n#define OPTIMAL_ML (int)((ML_MASK-1)+MINMATCH)\n\n\n/*===   Macros   ===*/\n#define MIN(a,b)   ( (a) < (b) ? (a) : (b) )\n#define MAX(a,b)   ( (a) > (b) ? (a) : (b) )\n#define HASH_FUNCTION(i)         (((i) * 2654435761U) >> ((MINMATCH*8)-LZ4HC_HASH_LOG))\n#define DELTANEXTMAXD(p)         chainTable[(p) & LZ4HC_MAXD_MASK]    /* flexible, LZ4HC_MAXD dependent */\n#define DELTANEXTU16(table, pos) table[(U16)(pos)]   /* faster */\n\nstatic U32 LZ4HC_hashPtr(const void* ptr) { return HASH_FUNCTION(LZ4_read32(ptr)); }\n\n\n\n/**************************************\n*  HC Compression\n**************************************/\nstatic void LZ4HC_init (LZ4HC_CCtx_internal* hc4, const BYTE* start)\n{\n    MEM_INIT((void*)hc4->hashTable, 0, sizeof(hc4->hashTable));\n    MEM_INIT(hc4->chainTable, 0xFF, sizeof(hc4->chainTable));\n    hc4->nextToUpdate = 64 KB;\n    hc4->base = start - 64 KB;\n    hc4->end = start;\n    hc4->dictBase = start - 64 KB;\n    hc4->dictLimit = 64 KB;\n    hc4->lowLimit = 64 KB;\n}\n\n\n/* Update chains up to ip (excluded) */\nLZ4_FORCE_INLINE void LZ4HC_Insert (LZ4HC_CCtx_internal* hc4, const BYTE* ip)\n{\n    U16* const chainTable = hc4->chainTable;\n    U32* const hashTable  = hc4->hashTable;\n    const BYTE* const base = hc4->base;\n    U32 const target = (U32)(ip - base);\n    U32 idx = hc4->nextToUpdate;\n\n    while (idx < target) {\n        U32 const h = LZ4HC_hashPtr(base+idx);\n        size_t delta = idx - hashTable[h];\n        if (delta>MAX_DISTANCE) delta = MAX_DISTANCE;\n        DELTANEXTU16(chainTable, idx) = (U16)delta;\n        hashTable[h] = idx;\n        idx++;\n    }\n\n    hc4->nextToUpdate = target;\n}\n\n/** LZ4HC_countBack() :\n * @return : negative value, nb of common bytes before ip/match */\nLZ4_FORCE_INLINE\nint LZ4HC_countBack(const BYTE* const ip, const BYTE* const match,\n                    const BYTE* const iMin, const BYTE* const mMin)\n{\n    int back=0;\n    while ( (ip+back > iMin)\n         && (match+back > mMin)\n         && (ip[back-1] == match[back-1]))\n            back--;\n    return back;\n}\n\n/* LZ4HC_countPattern() :\n * pattern32 must be a sample of repetitive pattern of length 1, 2 or 4 (but not 3!) */\nstatic unsigned LZ4HC_countPattern(const BYTE* ip, const BYTE* const iEnd, U32 const pattern32)\n{\n    const BYTE* const iStart = ip;\n    reg_t const pattern = (sizeof(pattern)==8) ? (reg_t)pattern32 + (((reg_t)pattern32) << 32) : pattern32;\n\n    while (likely(ip < iEnd-(sizeof(pattern)-1))) {\n        reg_t const diff = LZ4_read_ARCH(ip) ^ pattern;\n        if (!diff) { ip+=sizeof(pattern); continue; }\n        ip += LZ4_NbCommonBytes(diff);\n        return (unsigned)(ip - iStart);\n    }\n\n    if (LZ4_isLittleEndian()) {\n        reg_t patternByte = pattern;\n        while ((ip<iEnd) && (*ip == (BYTE)patternByte)) {\n            ip++; patternByte >>= 8;\n        }\n    } else {  /* big endian */\n        U32 bitOffset = (sizeof(pattern)*8) - 8;\n        while (ip < iEnd) {\n            BYTE const byte = (BYTE)(pattern >> bitOffset);\n            if (*ip != byte) break;\n            ip ++; bitOffset -= 8;\n        }\n    }\n\n    return (unsigned)(ip - iStart);\n}\n\n/* LZ4HC_reverseCountPattern() :\n * pattern must be a sample of repetitive pattern of length 1, 2 or 4 (but not 3!)\n * read using natural platform endianess */\nstatic unsigned LZ4HC_reverseCountPattern(const BYTE* ip, const BYTE* const iLow, U32 pattern)\n{\n    const BYTE* const iStart = ip;\n\n    while (likely(ip >= iLow+4)) {\n        if (LZ4_read32(ip-4) != pattern) break;\n        ip -= 4;\n    }\n    {   const BYTE* bytePtr = (const BYTE*)(&pattern) + 3; /* works for any endianess */\n        while (likely(ip>iLow)) {\n            if (ip[-1] != *bytePtr) break;\n            ip--; bytePtr--;\n    }   }\n    return (unsigned)(iStart - ip);\n}\n\ntypedef enum { rep_untested, rep_not, rep_confirmed } repeat_state_e;\n\nLZ4_FORCE_INLINE int LZ4HC_InsertAndGetWiderMatch (\n    LZ4HC_CCtx_internal* hc4,\n    const BYTE* const ip,\n    const BYTE* const iLowLimit,\n    const BYTE* const iHighLimit,\n    int longest,\n    const BYTE** matchpos,\n    const BYTE** startpos,\n    const int maxNbAttempts)\n{\n    U16* const chainTable = hc4->chainTable;\n    U32* const HashTable = hc4->hashTable;\n    const BYTE* const base = hc4->base;\n    const U32 dictLimit = hc4->dictLimit;\n    const BYTE* const lowPrefixPtr = base + dictLimit;\n    const U32 lowLimit = (hc4->lowLimit + 64 KB > (U32)(ip-base)) ? hc4->lowLimit : (U32)(ip - base) - MAX_DISTANCE;\n    const BYTE* const dictBase = hc4->dictBase;\n    int const delta = (int)(ip-iLowLimit);\n    int nbAttempts = maxNbAttempts;\n    U32 const pattern = LZ4_read32(ip);\n    U32 matchIndex;\n    repeat_state_e repeat = rep_untested;\n    size_t srcPatternLength = 0;\n\n    DEBUGLOG(7, \"LZ4HC_InsertAndGetWiderMatch\");\n    /* First Match */\n    LZ4HC_Insert(hc4, ip);\n    matchIndex = HashTable[LZ4HC_hashPtr(ip)];\n    DEBUGLOG(7, \"First match at index %u / %u (lowLimit)\",\n                matchIndex, lowLimit);\n\n    while ((matchIndex>=lowLimit) && (nbAttempts)) {\n        DEBUGLOG(7, \"remaining attempts : %i\", nbAttempts);\n        nbAttempts--;\n        if (matchIndex >= dictLimit) {\n            const BYTE* const matchPtr = base + matchIndex;\n            if (*(iLowLimit + longest) == *(matchPtr - delta + longest)) {\n                if (LZ4_read32(matchPtr) == pattern) {\n                    int mlt = MINMATCH + LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, iHighLimit);\n    #if 0\n                    /* more generic but unfortunately slower on clang */\n                    int const back = LZ4HC_countBack(ip, matchPtr, iLowLimit, lowPrefixPtr);\n    #else\n                    int back = 0;\n                    while ( (ip+back > iLowLimit)\n                         && (matchPtr+back > lowPrefixPtr)\n                         && (ip[back-1] == matchPtr[back-1])) {\n                            back--;\n                    }\n    #endif\n                    mlt -= back;\n\n                    if (mlt > longest) {\n                        longest = mlt;\n                        *matchpos = matchPtr+back;\n                        *startpos = ip+back;\n                }   }\n            }\n        } else {   /* matchIndex < dictLimit */\n            const BYTE* const matchPtr = dictBase + matchIndex;\n            if (LZ4_read32(matchPtr) == pattern) {\n                int mlt;\n                int back = 0;\n                const BYTE* vLimit = ip + (dictLimit - matchIndex);\n                if (vLimit > iHighLimit) vLimit = iHighLimit;\n                mlt = LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, vLimit) + MINMATCH;\n                if ((ip+mlt == vLimit) && (vLimit < iHighLimit))\n                    mlt += LZ4_count(ip+mlt, base+dictLimit, iHighLimit);\n                while ( (ip+back > iLowLimit)\n                     && (matchIndex+back > lowLimit)\n                     && (ip[back-1] == matchPtr[back-1]))\n                        back--;\n                mlt -= back;\n                if (mlt > longest) {\n                    longest = mlt;\n                    *matchpos = base + matchIndex + back;\n                    *startpos = ip + back;\n        }   }   }\n\n        {   U32 const nextOffset = DELTANEXTU16(chainTable, matchIndex);\n            matchIndex -= nextOffset;\n            if (nextOffset==1) {\n                /* may be a repeated pattern */\n                if (repeat == rep_untested) {\n                    if ( ((pattern & 0xFFFF) == (pattern >> 16))\n                      &  ((pattern & 0xFF)   == (pattern >> 24)) ) {\n                        repeat = rep_confirmed;\n                        srcPatternLength = LZ4HC_countPattern(ip+4, iHighLimit, pattern) + 4;\n                    } else {\n                        repeat = rep_not;\n                }   }\n                if ( (repeat == rep_confirmed)\n                  && (matchIndex >= dictLimit) ) {   /* same segment only */\n                    const BYTE* const matchPtr = base + matchIndex;\n                    if (LZ4_read32(matchPtr) == pattern) {  /* good candidate */\n                        size_t const forwardPatternLength = LZ4HC_countPattern(matchPtr+sizeof(pattern), iHighLimit, pattern) + sizeof(pattern);\n                        const BYTE* const maxLowPtr = (lowPrefixPtr + MAX_DISTANCE >= ip) ? lowPrefixPtr : ip - MAX_DISTANCE;\n                        size_t const backLength = LZ4HC_reverseCountPattern(matchPtr, maxLowPtr, pattern);\n                        size_t const currentSegmentLength = backLength + forwardPatternLength;\n\n                        if ( (currentSegmentLength >= srcPatternLength)   /* current pattern segment large enough to contain full srcPatternLength */\n                          && (forwardPatternLength <= srcPatternLength) ) { /* haven't reached this position yet */\n                            matchIndex += (U32)forwardPatternLength - (U32)srcPatternLength;  /* best position, full pattern, might be followed by more match */\n                        } else {\n                            matchIndex -= (U32)backLength;   /* let's go to farthest segment position, will find a match of length currentSegmentLength + maybe some back */\n                        }\n        }   }   }   }\n    }  /* while ((matchIndex>=lowLimit) && (nbAttempts)) */\n\n    return longest;\n}\n\nLZ4_FORCE_INLINE\nint LZ4HC_InsertAndFindBestMatch(LZ4HC_CCtx_internal* const hc4,   /* Index table will be updated */\n                                 const BYTE* const ip, const BYTE* const iLimit,\n                                 const BYTE** matchpos,\n                                 const int maxNbAttempts)\n{\n    const BYTE* uselessPtr = ip;\n    /* note : LZ4HC_InsertAndGetWiderMatch() is able to modify the starting position of a match (*startpos),\n     * but this won't be the case here, as we define iLowLimit==ip,\n     * so LZ4HC_InsertAndGetWiderMatch() won't be allowed to search past ip */\n    return LZ4HC_InsertAndGetWiderMatch(hc4, ip, ip, iLimit, MINMATCH-1, matchpos, &uselessPtr, maxNbAttempts);\n}\n\n\n\ntypedef enum {\n    noLimit = 0,\n    limitedOutput = 1,\n    limitedDestSize = 2,\n} limitedOutput_directive;\n\n/* LZ4HC_encodeSequence() :\n * @return : 0 if ok,\n *           1 if buffer issue detected */\nLZ4_FORCE_INLINE int LZ4HC_encodeSequence (\n    const BYTE** ip,\n    BYTE** op,\n    const BYTE** anchor,\n    int matchLength,\n    const BYTE* const match,\n    limitedOutput_directive limit,\n    BYTE* oend)\n{\n    size_t length;\n    BYTE* const token = (*op)++;\n\n#if defined(LZ4_DEBUG) && (LZ4_DEBUG >= 2)\n    static const BYTE* start = NULL;\n    static U32 totalCost = 0;\n    U32 const pos = (start==NULL) ? 0 : (U32)(*anchor - start);\n    U32 const ll = (U32)(*ip - *anchor);\n    U32 const llAdd = (ll>=15) ? ((ll-15) / 255) + 1 : 0;\n    U32 const mlAdd = (matchLength>=19) ? ((matchLength-19) / 255) + 1 : 0;\n    U32 const cost = 1 + llAdd + ll + 2 + mlAdd;\n    if (start==NULL) start = *anchor;  /* only works for single segment */\n    //g_debuglog_enable = (pos >= 2228) & (pos <= 2262);\n    DEBUGLOG(2, \"pos:%7u -- literals:%3u, match:%4i, offset:%5u, cost:%3u + %u\",\n                pos,\n                (U32)(*ip - *anchor), matchLength, (U32)(*ip-match),\n                cost, totalCost);\n    totalCost += cost;\n#endif\n\n    /* Encode Literal length */\n    length = (size_t)(*ip - *anchor);\n    if ((limit) && ((*op + (length >> 8) + length + (2 + 1 + LASTLITERALS)) > oend)) return 1;   /* Check output limit */\n    if (length >= RUN_MASK) {\n        size_t len = length - RUN_MASK;\n        *token = (RUN_MASK << ML_BITS);\n        for(; len >= 255 ; len -= 255) *(*op)++ = 255;\n        *(*op)++ = (BYTE)len;\n    } else {\n        *token = (BYTE)(length << ML_BITS);\n    }\n\n    /* Copy Literals */\n    LZ4_wildCopy(*op, *anchor, (*op) + length);\n    *op += length;\n\n    /* Encode Offset */\n    LZ4_writeLE16(*op, (U16)(*ip-match)); *op += 2;\n\n    /* Encode MatchLength */\n    assert(matchLength >= MINMATCH);\n    length = (size_t)(matchLength - MINMATCH);\n    if ((limit) && (*op + (length >> 8) + (1 + LASTLITERALS) > oend)) return 1;   /* Check output limit */\n    if (length >= ML_MASK) {\n        *token += ML_MASK;\n        length -= ML_MASK;\n        for(; length >= 510 ; length -= 510) { *(*op)++ = 255; *(*op)++ = 255; }\n        if (length >= 255) { length -= 255; *(*op)++ = 255; }\n        *(*op)++ = (BYTE)length;\n    } else {\n        *token += (BYTE)(length);\n    }\n\n    /* Prepare next loop */\n    *ip += matchLength;\n    *anchor = *ip;\n\n    return 0;\n}\n\n/* btopt */\n#include \"lz4opt.h\"\n\n\nstatic int LZ4HC_compress_hashChain (\n    LZ4HC_CCtx_internal* const ctx,\n    const char* const source,\n    char* const dest,\n    int* srcSizePtr,\n    int const maxOutputSize,\n    unsigned maxNbAttempts,\n    limitedOutput_directive limit\n    )\n{\n    const int inputSize = *srcSizePtr;\n\n    const BYTE* ip = (const BYTE*) source;\n    const BYTE* anchor = ip;\n    const BYTE* const iend = ip + inputSize;\n    const BYTE* const mflimit = iend - MFLIMIT;\n    const BYTE* const matchlimit = (iend - LASTLITERALS);\n\n    BYTE* optr = (BYTE*) dest;\n    BYTE* op = (BYTE*) dest;\n    BYTE* oend = op + maxOutputSize;\n\n    int   ml, ml2, ml3, ml0;\n    const BYTE* ref = NULL;\n    const BYTE* start2 = NULL;\n    const BYTE* ref2 = NULL;\n    const BYTE* start3 = NULL;\n    const BYTE* ref3 = NULL;\n    const BYTE* start0;\n    const BYTE* ref0;\n\n    /* init */\n    *srcSizePtr = 0;\n    if (limit == limitedDestSize && maxOutputSize < 1) return 0;         /* Impossible to store anything */\n    if ((U32)inputSize > (U32)LZ4_MAX_INPUT_SIZE) return 0;              /* Unsupported input size, too large (or negative) */\n\n    if (limit == limitedDestSize) oend -= LASTLITERALS;                  /* Hack for support limitations LZ4 decompressor */\n    if (inputSize < LZ4_minLength) goto _last_literals;                  /* Input too small, no compression (all literals) */\n\n    /* Main Loop */\n    while (ip < mflimit) {\n        ml = LZ4HC_InsertAndFindBestMatch (ctx, ip, matchlimit, &ref, maxNbAttempts);\n        if (ml<MINMATCH) { ip++; continue; }\n\n        /* saved, in case we would skip too much */\n        start0 = ip;\n        ref0 = ref;\n        ml0 = ml;\n\n_Search2:\n        if (ip+ml < mflimit)\n            ml2 = LZ4HC_InsertAndGetWiderMatch(ctx, ip + ml - 2, ip + 0, matchlimit, ml, &ref2, &start2, maxNbAttempts);\n        else\n            ml2 = ml;\n\n        if (ml2 == ml) { /* No better match */\n            optr = op;\n            if (LZ4HC_encodeSequence(&ip, &op, &anchor, ml, ref, limit, oend)) goto _dest_overflow;\n            continue;\n        }\n\n        if (start0 < ip) {\n            if (start2 < ip + ml0) {  /* empirical */\n                ip = start0;\n                ref = ref0;\n                ml = ml0;\n            }\n        }\n\n        /* Here, start0==ip */\n        if ((start2 - ip) < 3) {  /* First Match too small : removed */\n            ml = ml2;\n            ip = start2;\n            ref =ref2;\n            goto _Search2;\n        }\n\n_Search3:\n        /* At this stage, we have :\n        *  ml2 > ml1, and\n        *  ip1+3 <= ip2 (usually < ip1+ml1) */\n        if ((start2 - ip) < OPTIMAL_ML) {\n            int correction;\n            int new_ml = ml;\n            if (new_ml > OPTIMAL_ML) new_ml = OPTIMAL_ML;\n            if (ip+new_ml > start2 + ml2 - MINMATCH) new_ml = (int)(start2 - ip) + ml2 - MINMATCH;\n            correction = new_ml - (int)(start2 - ip);\n            if (correction > 0) {\n                start2 += correction;\n                ref2 += correction;\n                ml2 -= correction;\n            }\n        }\n        /* Now, we have start2 = ip+new_ml, with new_ml = min(ml, OPTIMAL_ML=18) */\n\n        if (start2 + ml2 < mflimit)\n            ml3 = LZ4HC_InsertAndGetWiderMatch(ctx, start2 + ml2 - 3, start2, matchlimit, ml2, &ref3, &start3, maxNbAttempts);\n        else\n            ml3 = ml2;\n\n        if (ml3 == ml2) {  /* No better match : 2 sequences to encode */\n            /* ip & ref are known; Now for ml */\n            if (start2 < ip+ml)  ml = (int)(start2 - ip);\n            /* Now, encode 2 sequences */\n            optr = op;\n            if (LZ4HC_encodeSequence(&ip, &op, &anchor, ml, ref, limit, oend)) goto _dest_overflow;\n            ip = start2;\n            optr = op;\n            if (LZ4HC_encodeSequence(&ip, &op, &anchor, ml2, ref2, limit, oend)) goto _dest_overflow;\n            continue;\n        }\n\n        if (start3 < ip+ml+3) {  /* Not enough space for match 2 : remove it */\n            if (start3 >= (ip+ml)) {  /* can write Seq1 immediately ==> Seq2 is removed, so Seq3 becomes Seq1 */\n                if (start2 < ip+ml) {\n                    int correction = (int)(ip+ml - start2);\n                    start2 += correction;\n                    ref2 += correction;\n                    ml2 -= correction;\n                    if (ml2 < MINMATCH) {\n                        start2 = start3;\n                        ref2 = ref3;\n                        ml2 = ml3;\n                    }\n                }\n\n                optr = op;\n                if (LZ4HC_encodeSequence(&ip, &op, &anchor, ml, ref, limit, oend)) goto _dest_overflow;\n                ip  = start3;\n                ref = ref3;\n                ml  = ml3;\n\n                start0 = start2;\n                ref0 = ref2;\n                ml0 = ml2;\n                goto _Search2;\n            }\n\n            start2 = start3;\n            ref2 = ref3;\n            ml2 = ml3;\n            goto _Search3;\n        }\n\n        /*\n        * OK, now we have 3 ascending matches; let's write at least the first one\n        * ip & ref are known; Now for ml\n        */\n        if (start2 < ip+ml) {\n            if ((start2 - ip) < (int)ML_MASK) {\n                int correction;\n                if (ml > OPTIMAL_ML) ml = OPTIMAL_ML;\n                if (ip + ml > start2 + ml2 - MINMATCH) ml = (int)(start2 - ip) + ml2 - MINMATCH;\n                correction = ml - (int)(start2 - ip);\n                if (correction > 0) {\n                    start2 += correction;\n                    ref2 += correction;\n                    ml2 -= correction;\n                }\n            } else {\n                ml = (int)(start2 - ip);\n            }\n        }\n        optr = op;\n        if (LZ4HC_encodeSequence(&ip, &op, &anchor, ml, ref, limit, oend)) goto _dest_overflow;\n\n        ip = start2;\n        ref = ref2;\n        ml = ml2;\n\n        start2 = start3;\n        ref2 = ref3;\n        ml2 = ml3;\n\n        goto _Search3;\n    }\n\n_last_literals:\n    /* Encode Last Literals */\n    {   size_t lastRunSize = (size_t)(iend - anchor);  /* literals */\n        size_t litLength = (lastRunSize + 255 - RUN_MASK) / 255;\n        size_t const totalSize = 1 + litLength + lastRunSize;\n        if (limit == limitedDestSize) oend += LASTLITERALS;  /* restore correct value */\n        if (limit && (op + totalSize > oend)) {\n            if (limit == limitedOutput) return 0;  /* Check output limit */\n            /* adapt lastRunSize to fill 'dest' */\n            lastRunSize  = (size_t)(oend - op) - 1;\n            litLength = (lastRunSize + 255 - RUN_MASK) / 255;\n            lastRunSize -= litLength;\n        }\n        ip = anchor + lastRunSize;\n\n        if (lastRunSize >= RUN_MASK) {\n            size_t accumulator = lastRunSize - RUN_MASK;\n            *op++ = (RUN_MASK << ML_BITS);\n            for(; accumulator >= 255 ; accumulator -= 255) *op++ = 255;\n            *op++ = (BYTE) accumulator;\n        } else {\n            *op++ = (BYTE)(lastRunSize << ML_BITS);\n        }\n        memcpy(op, anchor, lastRunSize);\n        op += lastRunSize;\n    }\n\n    /* End */\n    *srcSizePtr = (int) (((const char*)ip) - source);\n    return (int) (((char*)op)-dest);\n\n_dest_overflow:\n    if (limit == limitedDestSize) {\n        op = optr;  /* restore correct out pointer */\n        goto _last_literals;\n    }\n    return 0;\n}\n\n\nstatic int LZ4HC_compress_generic (\n    LZ4HC_CCtx_internal* const ctx,\n    const char* const src,\n    char* const dst,\n    int* const srcSizePtr,\n    int const dstCapacity,\n    int cLevel,\n    limitedOutput_directive limit\n    )\n{\n    ctx->end += *srcSizePtr;\n    if (cLevel < 1) cLevel = LZ4HC_CLEVEL_DEFAULT;   /* note : convention is different from lz4frame, maybe something to review */\n    if (cLevel > 9) {\n        if (limit == limitedDestSize) cLevel = 10;\n        switch (cLevel) {\n            case 10:\n                return LZ4HC_compress_hashChain(ctx, src, dst, srcSizePtr, dstCapacity, 1<<12, limit);\n            case 11:\n                return LZ4HC_compress_optimal(ctx, src, dst, *srcSizePtr, dstCapacity, limit, 512, 128, 0);\n            default:\n                /* fall-through */\n            case 12:\n                return LZ4HC_compress_optimal(ctx, src, dst, *srcSizePtr, dstCapacity, limit, 1<<13, LZ4_OPT_NUM, 1);\n        }\n    }\n    return LZ4HC_compress_hashChain(ctx, src, dst, srcSizePtr, dstCapacity, 1 << (cLevel-1), limit);  /* levels 1-9 */\n}\n\n\nint LZ4_sizeofStateHC(void) { return sizeof(LZ4_streamHC_t); }\n\nint LZ4_compress_HC_extStateHC (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel)\n{\n    LZ4HC_CCtx_internal* const ctx = &((LZ4_streamHC_t*)state)->internal_donotuse;\n    if (((size_t)(state)&(sizeof(void*)-1)) != 0) return 0;   /* Error : state is not aligned for pointers (32 or 64 bits) */\n    LZ4HC_init (ctx, (const BYTE*)src);\n    if (dstCapacity < LZ4_compressBound(srcSize))\n        return LZ4HC_compress_generic (ctx, src, dst, &srcSize, dstCapacity, compressionLevel, limitedOutput);\n    else\n        return LZ4HC_compress_generic (ctx, src, dst, &srcSize, dstCapacity, compressionLevel, noLimit);\n}\n\nint LZ4_compress_HC(const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel)\n{\n#if defined(LZ4HC_HEAPMODE) && LZ4HC_HEAPMODE==1\n    LZ4_streamHC_t* const statePtr = (LZ4_streamHC_t*)malloc(sizeof(LZ4_streamHC_t));\n#else\n    LZ4_streamHC_t state;\n    LZ4_streamHC_t* const statePtr = &state;\n#endif\n    int const cSize = LZ4_compress_HC_extStateHC(statePtr, src, dst, srcSize, dstCapacity, compressionLevel);\n#if defined(LZ4HC_HEAPMODE) && LZ4HC_HEAPMODE==1\n    free(statePtr);\n#endif\n    return cSize;\n}\n\n/* LZ4_compress_HC_destSize() :\n * only compatible with Hash Chain match finder */\nint LZ4_compress_HC_destSize(void* LZ4HC_Data, const char* source, char* dest, int* sourceSizePtr, int targetDestSize, int cLevel)\n{\n    LZ4HC_CCtx_internal* const ctx = &((LZ4_streamHC_t*)LZ4HC_Data)->internal_donotuse;\n    LZ4HC_init(ctx, (const BYTE*) source);\n    return LZ4HC_compress_generic(ctx, source, dest, sourceSizePtr, targetDestSize, cLevel, limitedDestSize);\n}\n\n\n\n/**************************************\n*  Streaming Functions\n**************************************/\n/* allocation */\nLZ4_streamHC_t* LZ4_createStreamHC(void) { return (LZ4_streamHC_t*)malloc(sizeof(LZ4_streamHC_t)); }\nint             LZ4_freeStreamHC (LZ4_streamHC_t* LZ4_streamHCPtr) {\n    if (!LZ4_streamHCPtr) return 0;  /* support free on NULL */\n    free(LZ4_streamHCPtr);\n    return 0;\n}\n\n\n/* initialization */\nvoid LZ4_resetStreamHC (LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel)\n{\n    LZ4_STATIC_ASSERT(sizeof(LZ4HC_CCtx_internal) <= sizeof(size_t) * LZ4_STREAMHCSIZE_SIZET);   /* if compilation fails here, LZ4_STREAMHCSIZE must be increased */\n    LZ4_streamHCPtr->internal_donotuse.base = NULL;\n    LZ4_setCompressionLevel(LZ4_streamHCPtr, compressionLevel);\n}\n\nvoid LZ4_setCompressionLevel(LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel)\n{\n    if (compressionLevel < 1) compressionLevel = 1;\n    if (compressionLevel > LZ4HC_CLEVEL_MAX) compressionLevel = LZ4HC_CLEVEL_MAX;\n    LZ4_streamHCPtr->internal_donotuse.compressionLevel = compressionLevel;\n}\n\nint LZ4_loadDictHC (LZ4_streamHC_t* LZ4_streamHCPtr, const char* dictionary, int dictSize)\n{\n    LZ4HC_CCtx_internal* const ctxPtr = &LZ4_streamHCPtr->internal_donotuse;\n    if (dictSize > 64 KB) {\n        dictionary += dictSize - 64 KB;\n        dictSize = 64 KB;\n    }\n    LZ4HC_init (ctxPtr, (const BYTE*)dictionary);\n    ctxPtr->end = (const BYTE*)dictionary + dictSize;\n    if (dictSize >= 4) LZ4HC_Insert (ctxPtr, ctxPtr->end-3);\n    return dictSize;\n}\n\n\n/* compression */\n\nstatic void LZ4HC_setExternalDict(LZ4HC_CCtx_internal* ctxPtr, const BYTE* newBlock)\n{\n    if (ctxPtr->end >= ctxPtr->base + 4) LZ4HC_Insert (ctxPtr, ctxPtr->end-3);   /* Referencing remaining dictionary content */\n\n    /* Only one memory segment for extDict, so any previous extDict is lost at this stage */\n    ctxPtr->lowLimit  = ctxPtr->dictLimit;\n    ctxPtr->dictLimit = (U32)(ctxPtr->end - ctxPtr->base);\n    ctxPtr->dictBase  = ctxPtr->base;\n    ctxPtr->base = newBlock - ctxPtr->dictLimit;\n    ctxPtr->end  = newBlock;\n    ctxPtr->nextToUpdate = ctxPtr->dictLimit;   /* match referencing will resume from there */\n}\n\nstatic int LZ4_compressHC_continue_generic (LZ4_streamHC_t* LZ4_streamHCPtr,\n                                            const char* src, char* dst,\n                                            int* srcSizePtr, int dstCapacity,\n                                            limitedOutput_directive limit)\n{\n    LZ4HC_CCtx_internal* const ctxPtr = &LZ4_streamHCPtr->internal_donotuse;\n    /* auto-init if forgotten */\n    if (ctxPtr->base == NULL) LZ4HC_init (ctxPtr, (const BYTE*) src);\n\n    /* Check overflow */\n    if ((size_t)(ctxPtr->end - ctxPtr->base) > 2 GB) {\n        size_t dictSize = (size_t)(ctxPtr->end - ctxPtr->base) - ctxPtr->dictLimit;\n        if (dictSize > 64 KB) dictSize = 64 KB;\n        LZ4_loadDictHC(LZ4_streamHCPtr, (const char*)(ctxPtr->end) - dictSize, (int)dictSize);\n    }\n\n    /* Check if blocks follow each other */\n    if ((const BYTE*)src != ctxPtr->end) LZ4HC_setExternalDict(ctxPtr, (const BYTE*)src);\n\n    /* Check overlapping input/dictionary space */\n    {   const BYTE* sourceEnd = (const BYTE*) src + *srcSizePtr;\n        const BYTE* const dictBegin = ctxPtr->dictBase + ctxPtr->lowLimit;\n        const BYTE* const dictEnd   = ctxPtr->dictBase + ctxPtr->dictLimit;\n        if ((sourceEnd > dictBegin) && ((const BYTE*)src < dictEnd)) {\n            if (sourceEnd > dictEnd) sourceEnd = dictEnd;\n            ctxPtr->lowLimit = (U32)(sourceEnd - ctxPtr->dictBase);\n            if (ctxPtr->dictLimit - ctxPtr->lowLimit < 4) ctxPtr->lowLimit = ctxPtr->dictLimit;\n        }\n    }\n\n    return LZ4HC_compress_generic (ctxPtr, src, dst, srcSizePtr, dstCapacity, ctxPtr->compressionLevel, limit);\n}\n\nint LZ4_compress_HC_continue (LZ4_streamHC_t* LZ4_streamHCPtr, const char* src, char* dst, int srcSize, int dstCapacity)\n{\n    if (dstCapacity < LZ4_compressBound(srcSize))\n        return LZ4_compressHC_continue_generic (LZ4_streamHCPtr, src, dst, &srcSize, dstCapacity, limitedOutput);\n    else\n        return LZ4_compressHC_continue_generic (LZ4_streamHCPtr, src, dst, &srcSize, dstCapacity, noLimit);\n}\n\nint LZ4_compress_HC_continue_destSize (LZ4_streamHC_t* LZ4_streamHCPtr, const char* src, char* dst, int* srcSizePtr, int targetDestSize)\n{\n    return LZ4_compressHC_continue_generic(LZ4_streamHCPtr, src, dst, srcSizePtr, targetDestSize, limitedDestSize);\n}\n\n\n\n/* dictionary saving */\n\nint LZ4_saveDictHC (LZ4_streamHC_t* LZ4_streamHCPtr, char* safeBuffer, int dictSize)\n{\n    LZ4HC_CCtx_internal* const streamPtr = &LZ4_streamHCPtr->internal_donotuse;\n    int const prefixSize = (int)(streamPtr->end - (streamPtr->base + streamPtr->dictLimit));\n    if (dictSize > 64 KB) dictSize = 64 KB;\n    if (dictSize < 4) dictSize = 0;\n    if (dictSize > prefixSize) dictSize = prefixSize;\n    memmove(safeBuffer, streamPtr->end - dictSize, dictSize);\n    {   U32 const endIndex = (U32)(streamPtr->end - streamPtr->base);\n        streamPtr->end = (const BYTE*)safeBuffer + dictSize;\n        streamPtr->base = streamPtr->end - endIndex;\n        streamPtr->dictLimit = endIndex - dictSize;\n        streamPtr->lowLimit = endIndex - dictSize;\n        if (streamPtr->nextToUpdate < streamPtr->dictLimit) streamPtr->nextToUpdate = streamPtr->dictLimit;\n    }\n    return dictSize;\n}\n\n\n/***********************************\n*  Deprecated Functions\n***********************************/\n/* These functions currently generate deprecation warnings */\n/* Deprecated compression functions */\nint LZ4_compressHC(const char* src, char* dst, int srcSize) { return LZ4_compress_HC (src, dst, srcSize, LZ4_compressBound(srcSize), 0); }\nint LZ4_compressHC_limitedOutput(const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_HC(src, dst, srcSize, maxDstSize, 0); }\nint LZ4_compressHC2(const char* src, char* dst, int srcSize, int cLevel) { return LZ4_compress_HC (src, dst, srcSize, LZ4_compressBound(srcSize), cLevel); }\nint LZ4_compressHC2_limitedOutput(const char* src, char* dst, int srcSize, int maxDstSize, int cLevel) { return LZ4_compress_HC(src, dst, srcSize, maxDstSize, cLevel); }\nint LZ4_compressHC_withStateHC (void* state, const char* src, char* dst, int srcSize) { return LZ4_compress_HC_extStateHC (state, src, dst, srcSize, LZ4_compressBound(srcSize), 0); }\nint LZ4_compressHC_limitedOutput_withStateHC (void* state, const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_HC_extStateHC (state, src, dst, srcSize, maxDstSize, 0); }\nint LZ4_compressHC2_withStateHC (void* state, const char* src, char* dst, int srcSize, int cLevel) { return LZ4_compress_HC_extStateHC(state, src, dst, srcSize, LZ4_compressBound(srcSize), cLevel); }\nint LZ4_compressHC2_limitedOutput_withStateHC (void* state, const char* src, char* dst, int srcSize, int maxDstSize, int cLevel) { return LZ4_compress_HC_extStateHC(state, src, dst, srcSize, maxDstSize, cLevel); }\nint LZ4_compressHC_continue (LZ4_streamHC_t* ctx, const char* src, char* dst, int srcSize) { return LZ4_compress_HC_continue (ctx, src, dst, srcSize, LZ4_compressBound(srcSize)); }\nint LZ4_compressHC_limitedOutput_continue (LZ4_streamHC_t* ctx, const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_HC_continue (ctx, src, dst, srcSize, maxDstSize); }\n\n\n/* Deprecated streaming functions */\nint LZ4_sizeofStreamStateHC(void) { return LZ4_STREAMHCSIZE; }\n\nint LZ4_resetStreamStateHC(void* state, char* inputBuffer)\n{\n    LZ4HC_CCtx_internal *ctx = &((LZ4_streamHC_t*)state)->internal_donotuse;\n    if ((((size_t)state) & (sizeof(void*)-1)) != 0) return 1;   /* Error : pointer is not aligned for pointer (32 or 64 bits) */\n    LZ4HC_init(ctx, (const BYTE*)inputBuffer);\n    ctx->inputBuffer = (BYTE*)inputBuffer;\n    return 0;\n}\n\nvoid* LZ4_createHC (char* inputBuffer)\n{\n    LZ4_streamHC_t* hc4 = (LZ4_streamHC_t*)ALLOCATOR(1, sizeof(LZ4_streamHC_t));\n    if (hc4 == NULL) return NULL;   /* not enough memory */\n    LZ4HC_init (&hc4->internal_donotuse, (const BYTE*)inputBuffer);\n    hc4->internal_donotuse.inputBuffer = (BYTE*)inputBuffer;\n    return hc4;\n}\n\nint LZ4_freeHC (void* LZ4HC_Data) {\n    if (!LZ4HC_Data) return 0;  /* support free on NULL */\n    FREEMEM(LZ4HC_Data);\n    return 0;\n}\n\nint LZ4_compressHC2_continue (void* LZ4HC_Data, const char* src, char* dst, int srcSize, int cLevel)\n{\n    return LZ4HC_compress_generic (&((LZ4_streamHC_t*)LZ4HC_Data)->internal_donotuse, src, dst, &srcSize, 0, cLevel, noLimit);\n}\n\nint LZ4_compressHC2_limitedOutput_continue (void* LZ4HC_Data, const char* src, char* dst, int srcSize, int dstCapacity, int cLevel)\n{\n    return LZ4HC_compress_generic (&((LZ4_streamHC_t*)LZ4HC_Data)->internal_donotuse, src, dst, &srcSize, dstCapacity, cLevel, limitedOutput);\n}\n\nchar* LZ4_slideInputBufferHC(void* LZ4HC_Data)\n{\n    LZ4HC_CCtx_internal* const hc4 = &((LZ4_streamHC_t*)LZ4HC_Data)->internal_donotuse;\n    int const dictSize = LZ4_saveDictHC((LZ4_streamHC_t*)LZ4HC_Data, (char*)(hc4->inputBuffer), 64 KB);\n    return (char*)(hc4->inputBuffer + dictSize);\n}\n"
  },
  {
    "path": "src/libraries/lz4/lz4hc.h",
    "content": "/*\n   LZ4 HC - High Compression Mode of LZ4\n   Header File\n   Copyright (C) 2011-2017, Yann Collet.\n   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)\n\n   Redistribution and use in source and binary forms, with or without\n   modification, are permitted provided that the following conditions are\n   met:\n\n       * Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n       * Redistributions in binary form must reproduce the above\n   copyright notice, this list of conditions and the following disclaimer\n   in the documentation and/or other materials provided with the\n   distribution.\n\n   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n   \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n   You can contact the author at :\n   - LZ4 source repository : https://github.com/lz4/lz4\n   - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c\n*/\n#ifndef LZ4_HC_H_19834876238432\n#define LZ4_HC_H_19834876238432\n\n#if defined (__cplusplus)\nextern \"C\" {\n#endif\n\n/* --- Dependency --- */\n/* note : lz4hc requires lz4.h/lz4.c for compilation */\n#include \"lz4.h\"   /* stddef, LZ4LIB_API, LZ4_DEPRECATED */\n\n\n/* --- Useful constants --- */\n#define LZ4HC_CLEVEL_MIN         3\n#define LZ4HC_CLEVEL_DEFAULT     9\n#define LZ4HC_CLEVEL_OPT_MIN    11\n#define LZ4HC_CLEVEL_MAX        12\n\n\n/*-************************************\n *  Block Compression\n **************************************/\n/*! LZ4_compress_HC() :\n *  Compress data from `src` into `dst`, using the more powerful but slower \"HC\" algorithm.\n * `dst` must be already allocated.\n *  Compression is guaranteed to succeed if `dstCapacity >= LZ4_compressBound(srcSize)` (see \"lz4.h\")\n *  Max supported `srcSize` value is LZ4_MAX_INPUT_SIZE (see \"lz4.h\")\n * `compressionLevel` : any value between 1 and LZ4HC_CLEVEL_MAX will work.\n *                      Values > LZ4HC_CLEVEL_MAX behave the same as LZ4HC_CLEVEL_MAX.\n * @return : the number of bytes written into 'dst'\n *           or 0 if compression fails.\n */\nLZ4LIB_API int LZ4_compress_HC (const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel);\n\n\n/* Note :\n *   Decompression functions are provided within \"lz4.h\" (BSD license)\n */\n\n\n/*! LZ4_compress_HC_extStateHC() :\n *  Same as LZ4_compress_HC(), but using an externally allocated memory segment for `state`.\n * `state` size is provided by LZ4_sizeofStateHC().\n *  Memory segment must be aligned on 8-bytes boundaries (which a normal malloc() should do properly).\n */\nLZ4LIB_API int LZ4_sizeofStateHC(void);\nLZ4LIB_API int LZ4_compress_HC_extStateHC(void* state, const char* src, char* dst, int srcSize, int maxDstSize, int compressionLevel);\n\n\n/*-************************************\n *  Streaming Compression\n *  Bufferless synchronous API\n **************************************/\n typedef union LZ4_streamHC_u LZ4_streamHC_t;   /* incomplete type (defined later) */\n\n/*! LZ4_createStreamHC() and LZ4_freeStreamHC() :\n *  These functions create and release memory for LZ4 HC streaming state.\n *  Newly created states are automatically initialized.\n *  Existing states can be re-used several times, using LZ4_resetStreamHC().\n *  These methods are API and ABI stable, they can be used in combination with a DLL.\n */\nLZ4LIB_API LZ4_streamHC_t* LZ4_createStreamHC(void);\nLZ4LIB_API int             LZ4_freeStreamHC (LZ4_streamHC_t* streamHCPtr);\n\nLZ4LIB_API void LZ4_resetStreamHC (LZ4_streamHC_t* streamHCPtr, int compressionLevel);\nLZ4LIB_API int  LZ4_loadDictHC (LZ4_streamHC_t* streamHCPtr, const char* dictionary, int dictSize);\n\nLZ4LIB_API int LZ4_compress_HC_continue (LZ4_streamHC_t* streamHCPtr, const char* src, char* dst, int srcSize, int maxDstSize);\n\nLZ4LIB_API int LZ4_saveDictHC (LZ4_streamHC_t* streamHCPtr, char* safeBuffer, int maxDictSize);\n\n/*\n  These functions compress data in successive blocks of any size, using previous blocks as dictionary.\n  One key assumption is that previous blocks (up to 64 KB) remain read-accessible while compressing next blocks.\n  There is an exception for ring buffers, which can be smaller than 64 KB.\n  Ring buffers scenario is automatically detected and handled by LZ4_compress_HC_continue().\n\n  Before starting compression, state must be properly initialized, using LZ4_resetStreamHC().\n  A first \"fictional block\" can then be designated as initial dictionary, using LZ4_loadDictHC() (Optional).\n\n  Then, use LZ4_compress_HC_continue() to compress each successive block.\n  Previous memory blocks (including initial dictionary when present) must remain accessible and unmodified during compression.\n  'dst' buffer should be sized to handle worst case scenarios (see LZ4_compressBound()), to ensure operation success.\n  Because in case of failure, the API does not guarantee context recovery, and context will have to be reset.\n  If `dst` buffer budget cannot be >= LZ4_compressBound(), consider using LZ4_compress_HC_continue_destSize() instead.\n\n  If, for any reason, previous data block can't be preserved unmodified in memory for next compression block,\n  you can save it to a more stable memory space, using LZ4_saveDictHC().\n  Return value of LZ4_saveDictHC() is the size of dictionary effectively saved into 'safeBuffer'.\n*/\n\n\n/*-**************************************************************\n * PRIVATE DEFINITIONS :\n * Do not use these definitions.\n * They are exposed to allow static allocation of `LZ4_streamHC_t`.\n * Using these definitions makes the code vulnerable to potential API break when upgrading LZ4\n ****************************************************************/\n#define LZ4HC_DICTIONARY_LOGSIZE 16\n#define LZ4HC_MAXD (1<<LZ4HC_DICTIONARY_LOGSIZE)\n#define LZ4HC_MAXD_MASK (LZ4HC_MAXD - 1)\n\n#define LZ4HC_HASH_LOG 15\n#define LZ4HC_HASHTABLESIZE (1 << LZ4HC_HASH_LOG)\n#define LZ4HC_HASH_MASK (LZ4HC_HASHTABLESIZE - 1)\n\n\n#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)\n#include <stdint.h>\n\ntypedef struct\n{\n    uint32_t   hashTable[LZ4HC_HASHTABLESIZE];\n    uint16_t   chainTable[LZ4HC_MAXD];\n    const uint8_t* end;         /* next block here to continue on current prefix */\n    const uint8_t* base;        /* All index relative to this position */\n    const uint8_t* dictBase;    /* alternate base for extDict */\n    uint8_t* inputBuffer;       /* deprecated */\n    uint32_t   dictLimit;       /* below that point, need extDict */\n    uint32_t   lowLimit;        /* below that point, no more dict */\n    uint32_t   nextToUpdate;    /* index from which to continue dictionary update */\n    int        compressionLevel;\n} LZ4HC_CCtx_internal;\n\n#else\n\ntypedef struct\n{\n    unsigned int   hashTable[LZ4HC_HASHTABLESIZE];\n    unsigned short chainTable[LZ4HC_MAXD];\n    const unsigned char* end;        /* next block here to continue on current prefix */\n    const unsigned char* base;       /* All index relative to this position */\n    const unsigned char* dictBase;   /* alternate base for extDict */\n    unsigned char* inputBuffer;      /* deprecated */\n    unsigned int   dictLimit;        /* below that point, need extDict */\n    unsigned int   lowLimit;         /* below that point, no more dict */\n    unsigned int   nextToUpdate;     /* index from which to continue dictionary update */\n    int            compressionLevel;\n} LZ4HC_CCtx_internal;\n\n#endif\n\n#define LZ4_STREAMHCSIZE       (4*LZ4HC_HASHTABLESIZE + 2*LZ4HC_MAXD + 56) /* 262200 */\n#define LZ4_STREAMHCSIZE_SIZET (LZ4_STREAMHCSIZE / sizeof(size_t))\nunion LZ4_streamHC_u {\n    size_t table[LZ4_STREAMHCSIZE_SIZET];\n    LZ4HC_CCtx_internal internal_donotuse;\n};   /* previously typedef'd to LZ4_streamHC_t */\n/*\n  LZ4_streamHC_t :\n  This structure allows static allocation of LZ4 HC streaming state.\n  State must be initialized using LZ4_resetStreamHC() before first use.\n\n  Static allocation shall only be used in combination with static linking.\n  When invoking LZ4 from a DLL, use create/free functions instead, which are API and ABI stable.\n*/\n\n\n/*-************************************\n*  Deprecated Functions\n**************************************/\n/* see lz4.h LZ4_DISABLE_DEPRECATE_WARNINGS to turn off deprecation warnings */\n\n/* deprecated compression functions */\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_compress_HC() instead\") int LZ4_compressHC               (const char* source, char* dest, int inputSize);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_compress_HC() instead\") int LZ4_compressHC_limitedOutput (const char* source, char* dest, int inputSize, int maxOutputSize);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_compress_HC() instead\") int LZ4_compressHC2 (const char* source, char* dest, int inputSize, int compressionLevel);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_compress_HC() instead\") int LZ4_compressHC2_limitedOutput (const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_compress_HC_extStateHC() instead\") int LZ4_compressHC_withStateHC               (void* state, const char* source, char* dest, int inputSize);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_compress_HC_extStateHC() instead\") int LZ4_compressHC_limitedOutput_withStateHC (void* state, const char* source, char* dest, int inputSize, int maxOutputSize);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_compress_HC_extStateHC() instead\") int LZ4_compressHC2_withStateHC (void* state, const char* source, char* dest, int inputSize, int compressionLevel);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_compress_HC_extStateHC() instead\") int LZ4_compressHC2_limitedOutput_withStateHC(void* state, const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_compress_HC_continue() instead\") int LZ4_compressHC_continue               (LZ4_streamHC_t* LZ4_streamHCPtr, const char* source, char* dest, int inputSize);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_compress_HC_continue() instead\") int LZ4_compressHC_limitedOutput_continue (LZ4_streamHC_t* LZ4_streamHCPtr, const char* source, char* dest, int inputSize, int maxOutputSize);\n\n/* Deprecated Streaming functions using older model; should no longer be used */\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_createStreamHC() instead\") void* LZ4_createHC (char* inputBuffer);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_saveDictHC() instead\")     char* LZ4_slideInputBufferHC (void* LZ4HC_Data);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_freeStreamHC() instead\")   int   LZ4_freeHC (void* LZ4HC_Data);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_compress_HC_continue() instead\") int LZ4_compressHC2_continue (void* LZ4HC_Data, const char* source, char* dest, int inputSize, int compressionLevel);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_compress_HC_continue() instead\") int LZ4_compressHC2_limitedOutput_continue (void* LZ4HC_Data, const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_createStreamHC() instead\") int   LZ4_sizeofStreamStateHC(void);\nLZ4LIB_API LZ4_DEPRECATED(\"use LZ4_resetStreamHC() instead\")  int   LZ4_resetStreamStateHC(void* state, char* inputBuffer);\n\n\n#if defined (__cplusplus)\n}\n#endif\n\n#endif /* LZ4_HC_H_19834876238432 */\n\n\n/*-**************************************************\n * !!!!!     STATIC LINKING ONLY     !!!!!\n * Following definitions are considered experimental.\n * They should not be linked from DLL,\n * as there is no guarantee of API stability yet.\n * Prototypes will be promoted to \"stable\" status\n * after successfull usage in real-life scenarios.\n ***************************************************/\n#ifdef LZ4_HC_STATIC_LINKING_ONLY   /* protection macro */\n#ifndef LZ4_HC_SLO_098092834\n#define LZ4_HC_SLO_098092834\n\n/*! LZ4_compress_HC_destSize() : v1.8.0 (experimental)\n *  Will try to compress as much data from `src` as possible\n *  that can fit into `targetDstSize` budget.\n *  Result is provided in 2 parts :\n * @return : the number of bytes written into 'dst'\n *           or 0 if compression fails.\n * `srcSizePtr` : value will be updated to indicate how much bytes were read from `src`\n */\nint LZ4_compress_HC_destSize(void* LZ4HC_Data,\n                            const char* src, char* dst,\n                            int* srcSizePtr, int targetDstSize,\n                            int compressionLevel);\n\n/*! LZ4_compress_HC_continue_destSize() : v1.8.0 (experimental)\n *  Similar as LZ4_compress_HC_continue(),\n *  but will read a variable nb of bytes from `src`\n *  to fit into `targetDstSize` budget.\n *  Result is provided in 2 parts :\n * @return : the number of bytes written into 'dst'\n *           or 0 if compression fails.\n * `srcSizePtr` : value will be updated to indicate how much bytes were read from `src`.\n */\nint LZ4_compress_HC_continue_destSize(LZ4_streamHC_t* LZ4_streamHCPtr,\n                            const char* src, char* dst,\n                            int* srcSizePtr, int targetDstSize);\n\n/*! LZ4_setCompressionLevel() : v1.8.0 (experimental)\n *  It's possible to change compression level between 2 invocations of LZ4_compress_HC_continue*()\n */\nvoid LZ4_setCompressionLevel(LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel);\n\n\n\n#endif   /* LZ4_HC_SLO_098092834 */\n#endif   /* LZ4_HC_STATIC_LINKING_ONLY */\n"
  },
  {
    "path": "src/libraries/lz4/lz4opt.h",
    "content": "/*\n    lz4opt.h - Optimal Mode of LZ4\n    Copyright (C) 2015-2017, Przemyslaw Skibinski <inikep@gmail.com>\n    Note : this file is intended to be included within lz4hc.c\n\n    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions are\n    met:\n\n    * Redistributions of source code must retain the above copyright\n    notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n    copyright notice, this list of conditions and the following disclaimer\n    in the documentation and/or other materials provided with the\n    distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n    \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n    You can contact the author at :\n       - LZ4 source repository : https://github.com/lz4/lz4\n       - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c\n*/\n\n#define LZ4_OPT_NUM   (1<<12)\n\ntypedef struct {\n    int price;\n    int off;\n    int mlen;\n    int litlen;\n} LZ4HC_optimal_t;\n\n\n/* price in bytes */\nLZ4_FORCE_INLINE int LZ4HC_literalsPrice(int const litlen)\n{\n    int price = litlen;\n    if (litlen >= (int)RUN_MASK)\n        price += 1 + (litlen-RUN_MASK)/255;\n    return price;\n}\n\n\n/* requires mlen >= MINMATCH */\nLZ4_FORCE_INLINE int LZ4HC_sequencePrice(int litlen, int mlen)\n{\n    int price = 1 + 2 ; /* token + 16-bit offset */\n\n    price += LZ4HC_literalsPrice(litlen);\n\n    if (mlen >= (int)(ML_MASK+MINMATCH))\n        price += 1 + (mlen-(ML_MASK+MINMATCH))/255;\n\n    return price;\n}\n\n\n/*-*************************************\n*  Match finder\n***************************************/\ntypedef struct {\n    int off;\n    int len;\n} LZ4HC_match_t;\n\nLZ4_FORCE_INLINE\nLZ4HC_match_t LZ4HC_FindLongerMatch(LZ4HC_CCtx_internal* const ctx,\n                        const BYTE* ip, const BYTE* const iHighLimit,\n                        int minLen, int nbSearches)\n{\n    LZ4HC_match_t match = { 0 , 0 };\n    const BYTE* matchPtr = NULL;\n    /* note : LZ4HC_InsertAndGetWiderMatch() is able to modify the starting position of a match (*startpos),\n     * but this won't be the case here, as we define iLowLimit==ip,\n     * so LZ4HC_InsertAndGetWiderMatch() won't be allowed to search past ip */\n    int const matchLength = LZ4HC_InsertAndGetWiderMatch(ctx, ip, ip, iHighLimit, minLen, &matchPtr, &ip, nbSearches);\n    if (matchLength <= minLen) return match;\n    match.len = matchLength;\n    match.off = (int)(ip-matchPtr);\n    return match;\n}\n\n\nstatic int LZ4HC_compress_optimal (\n    LZ4HC_CCtx_internal* ctx,\n    const char* const source,\n    char* dst,\n    int inputSize,\n    int dstCapacity,\n    limitedOutput_directive limit,\n    int const nbSearches,\n    size_t sufficient_len,\n    int const fullUpdate\n    )\n{\n#define TRAILING_LITERALS 3\n    LZ4HC_optimal_t opt[LZ4_OPT_NUM + TRAILING_LITERALS];   /* this uses a bit too much stack memory to my taste ... */\n\n    const BYTE* ip = (const BYTE*) source;\n    const BYTE* anchor = ip;\n    const BYTE* const iend = ip + inputSize;\n    const BYTE* const mflimit = iend - MFLIMIT;\n    const BYTE* const matchlimit = iend - LASTLITERALS;\n    BYTE* op = (BYTE*) dst;\n    BYTE* const oend = op + dstCapacity;\n\n    /* init */\n    DEBUGLOG(5, \"LZ4HC_compress_optimal\");\n    if (sufficient_len >= LZ4_OPT_NUM) sufficient_len = LZ4_OPT_NUM-1;\n\n    /* Main Loop */\n    assert(ip - anchor < LZ4_MAX_INPUT_SIZE);\n    while (ip < mflimit) {\n        int const llen = (int)(ip - anchor);\n        int best_mlen, best_off;\n        int cur, last_match_pos = 0;\n\n        LZ4HC_match_t const firstMatch = LZ4HC_FindLongerMatch(ctx, ip, matchlimit, MINMATCH-1, nbSearches);\n        if (firstMatch.len==0) { ip++; continue; }\n\n        if ((size_t)firstMatch.len > sufficient_len) {\n            /* good enough solution : immediate encoding */\n            int const firstML = firstMatch.len;\n            const BYTE* const matchPos = ip - firstMatch.off;\n            if ( LZ4HC_encodeSequence(&ip, &op, &anchor, firstML, matchPos, limit, oend) )   /* updates ip, op and anchor */\n                return 0;  /* error */\n            continue;\n        }\n\n        /* set prices for first positions (literals) */\n        {   int rPos;\n            for (rPos = 0 ; rPos < MINMATCH ; rPos++) {\n                int const cost = LZ4HC_literalsPrice(llen + rPos);\n                opt[rPos].mlen = 1;\n                opt[rPos].off = 0;\n                opt[rPos].litlen = llen + rPos;\n                opt[rPos].price = cost;\n                DEBUGLOG(7, \"rPos:%3i => price:%3i (litlen=%i) -- initial setup\",\n                            rPos, cost, opt[rPos].litlen);\n        }   }\n        /* set prices using initial match */\n        {   int mlen = MINMATCH;\n            int const matchML = firstMatch.len;   /* necessarily < sufficient_len < LZ4_OPT_NUM */\n            int const offset = firstMatch.off;\n            assert(matchML < LZ4_OPT_NUM);\n            for ( ; mlen <= matchML ; mlen++) {\n                int const cost = LZ4HC_sequencePrice(llen, mlen);\n                opt[mlen].mlen = mlen;\n                opt[mlen].off = offset;\n                opt[mlen].litlen = llen;\n                opt[mlen].price = cost;\n                DEBUGLOG(7, \"rPos:%3i => price:%3i (matchlen=%i) -- initial setup\",\n                            mlen, cost, mlen);\n        }   }\n        last_match_pos = firstMatch.len;\n        {   int addLit;\n            for (addLit = 1; addLit <= TRAILING_LITERALS; addLit ++) {\n                opt[last_match_pos+addLit].mlen = 1; /* literal */\n                opt[last_match_pos+addLit].off = 0;\n                opt[last_match_pos+addLit].litlen = addLit;\n                opt[last_match_pos+addLit].price = opt[last_match_pos].price + LZ4HC_literalsPrice(addLit);\n                DEBUGLOG(7, \"rPos:%3i => price:%3i (litlen=%i) -- initial setup\",\n                            last_match_pos+addLit, opt[last_match_pos+addLit].price, addLit);\n        }   }\n\n        /* check further positions */\n        for (cur = 1; cur < last_match_pos; cur++) {\n            const BYTE* const curPtr = ip + cur;\n            LZ4HC_match_t newMatch;\n\n            if (curPtr >= mflimit) break;\n            DEBUGLOG(7, \"rPos:%u[%u] vs [%u]%u\",\n                    cur, opt[cur].price, opt[cur+1].price, cur+1);\n            if (fullUpdate) {\n                /* not useful to search here if next position has same (or lower) cost */\n                if ( (opt[cur+1].price <= opt[cur].price)\n                  /* in some cases, next position has same cost, but cost rises sharply after, so a small match would still be beneficial */\n                  && (opt[cur+MINMATCH].price < opt[cur].price + 3/*min seq price*/) )\n                    continue;\n            } else {\n                /* not useful to search here if next position has same (or lower) cost */\n                if (opt[cur+1].price <= opt[cur].price) continue;\n            }\n\n            DEBUGLOG(7, \"search at rPos:%u\", cur);\n            if (fullUpdate)\n                newMatch = LZ4HC_FindLongerMatch(ctx, curPtr, matchlimit, MINMATCH-1, nbSearches);\n            else\n                /* only test matches of minimum length; slightly faster, but misses a few bytes */\n                newMatch = LZ4HC_FindLongerMatch(ctx, curPtr, matchlimit, last_match_pos - cur, nbSearches);\n            if (!newMatch.len) continue;\n\n            if ( ((size_t)newMatch.len > sufficient_len)\n              || (newMatch.len + cur >= LZ4_OPT_NUM) ) {\n                /* immediate encoding */\n                best_mlen = newMatch.len;\n                best_off = newMatch.off;\n                last_match_pos = cur + 1;\n                goto encode;\n            }\n\n            /* before match : set price with literals at beginning */\n            {   int const baseLitlen = opt[cur].litlen;\n                int litlen;\n                for (litlen = 1; litlen < MINMATCH; litlen++) {\n                    int const price = opt[cur].price - LZ4HC_literalsPrice(baseLitlen) + LZ4HC_literalsPrice(baseLitlen+litlen);\n                    int const pos = cur + litlen;\n                    if (price < opt[pos].price) {\n                        opt[pos].mlen = 1; /* literal */\n                        opt[pos].off = 0;\n                        opt[pos].litlen = baseLitlen+litlen;\n                        opt[pos].price = price;\n                        DEBUGLOG(7, \"rPos:%3i => price:%3i (litlen=%i)\",\n                                    pos, price, opt[pos].litlen);\n            }   }   }\n\n            /* set prices using match at position = cur */\n            {   int const matchML = newMatch.len;\n                int ml = MINMATCH;\n\n                assert(cur + newMatch.len < LZ4_OPT_NUM);\n                for ( ; ml <= matchML ; ml++) {\n                    int const pos = cur + ml;\n                    int const offset = newMatch.off;\n                    int price;\n                    int ll;\n                    DEBUGLOG(7, \"testing price rPos %i (last_match_pos=%i)\",\n                                pos, last_match_pos);\n                    if (opt[cur].mlen == 1) {\n                        ll = opt[cur].litlen;\n                        price = ((cur > ll) ? opt[cur - ll].price : 0)\n                              + LZ4HC_sequencePrice(ll, ml);\n                    } else {\n                        ll = 0;\n                        price = opt[cur].price + LZ4HC_sequencePrice(0, ml);\n                    }\n\n                    if (pos > last_match_pos+TRAILING_LITERALS || price <= opt[pos].price) {\n                        DEBUGLOG(7, \"rPos:%3i => price:%3i (matchlen=%i)\",\n                                    pos, price, ml);\n                        assert(pos < LZ4_OPT_NUM);\n                        if ( (ml == matchML)  /* last pos of last match */\n                          && (last_match_pos < pos) )\n                            last_match_pos = pos;\n                        opt[pos].mlen = ml;\n                        opt[pos].off = offset;\n                        opt[pos].litlen = ll;\n                        opt[pos].price = price;\n            }   }   }\n            /* complete following positions with literals */\n            {   int addLit;\n                for (addLit = 1; addLit <= TRAILING_LITERALS; addLit ++) {\n                    opt[last_match_pos+addLit].mlen = 1; /* literal */\n                    opt[last_match_pos+addLit].off = 0;\n                    opt[last_match_pos+addLit].litlen = addLit;\n                    opt[last_match_pos+addLit].price = opt[last_match_pos].price + LZ4HC_literalsPrice(addLit);\n                    DEBUGLOG(7, \"rPos:%3i => price:%3i (litlen=%i)\", last_match_pos+addLit, opt[last_match_pos+addLit].price, addLit);\n            }   }\n        }  /* for (cur = 1; cur <= last_match_pos; cur++) */\n\n        best_mlen = opt[last_match_pos].mlen;\n        best_off = opt[last_match_pos].off;\n        cur = last_match_pos - best_mlen;\n\nencode: /* cur, last_match_pos, best_mlen, best_off must be set */\n        assert(cur < LZ4_OPT_NUM);\n        assert(last_match_pos >= 1);  /* == 1 when only one candidate */\n        DEBUGLOG(6, \"reverse traversal, looking for shortest path\")\n        DEBUGLOG(6, \"last_match_pos = %i\", last_match_pos);\n        {   int candidate_pos = cur;\n            int selected_matchLength = best_mlen;\n            int selected_offset = best_off;\n            while (1) {  /* from end to beginning */\n                int const next_matchLength = opt[candidate_pos].mlen;  /* can be 1, means literal */\n                int const next_offset = opt[candidate_pos].off;\n                DEBUGLOG(6, \"pos %i: sequence length %i\", candidate_pos, selected_matchLength);\n                opt[candidate_pos].mlen = selected_matchLength;\n                opt[candidate_pos].off = selected_offset;\n                selected_matchLength = next_matchLength;\n                selected_offset = next_offset;\n                if (next_matchLength > candidate_pos) break; /* last match elected, first match to encode */\n                assert(next_matchLength > 0);  /* can be 1, means literal */\n                candidate_pos -= next_matchLength;\n        }   }\n\n        /* encode all recorded sequences in order */\n        {   int rPos = 0;  /* relative position (to ip) */\n            while (rPos < last_match_pos) {\n                int const ml = opt[rPos].mlen;\n                int const offset = opt[rPos].off;\n                if (ml == 1) { ip++; rPos++; continue; }  /* literal; note: can end up with several literals, in which case, skip them */\n                rPos += ml;\n                assert(ml >= MINMATCH);\n                assert((offset >= 1) && (offset <= MAX_DISTANCE));\n                if ( LZ4HC_encodeSequence(&ip, &op, &anchor, ml, ip - offset, limit, oend) )   /* updates ip, op and anchor */\n                    return 0;  /* error */\n        }   }\n    }  /* while (ip < mflimit) */\n\n    /* Encode Last Literals */\n    {   int lastRun = (int)(iend - anchor);\n        if ( (limit)\n          && (((char*)op - dst) + lastRun + 1 + ((lastRun+255-RUN_MASK)/255) > (U32)dstCapacity))\n            return 0;  /* Check output limit */\n        if (lastRun >= (int)RUN_MASK) {\n            *op++=(RUN_MASK<<ML_BITS);\n            lastRun-=RUN_MASK;\n            for (; lastRun > 254 ; lastRun-=255) *op++ = 255;\n            *op++ = (BYTE) lastRun;\n        } else *op++ = (BYTE)(lastRun<<ML_BITS);\n        memcpy(op, anchor, iend - anchor);\n        op += iend-anchor;\n    }\n\n    /* End */\n    return (int) ((char*)op-dst);\n}\n"
  },
  {
    "path": "src/libraries/noise1234/noise1234.cpp",
    "content": "// Noise1234\n// Author: Stefan Gustavson (stegu@itn.liu.se)\n//\n// This library is public domain software, released by the author\n// into the public domain in February 2011. You may do anything\n// you like with it. You may even remove all attributions,\n// but of course I'd appreciate it if you kept my name somewhere.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n\n// Modified by the LOVE Development Team to use double precision.\n\n/** \\file\n\t\t\\brief Implements the Noise1234 class for producing Perlin noise.\n\t\t\\author Stefan Gustavson (stegu@itn.liu.se)\n*/\n\n/*\n * This implementation is \"Improved Noise\" as presented by\n * Ken Perlin at Siggraph 2002. The 3D function is a direct port\n * of his Java reference code available on www.noisemachine.com\n * (although I cleaned it up and made the code more readable),\n * but the 1D, 2D and 4D cases were implemented from scratch\n * by me.\n *\n * This is a highly reusable class. It has no dependencies\n * on any other file, apart from its own header file.\n */\n\n\n#include\t\"noise1234.h\"\n\n// This is the new and improved, C(2) continuous interpolant\n#define FADE(t) ( t * t * t * ( t * ( t * 6 - 15 ) + 10 ) )\n\n#define FASTFLOOR(x) ( ((x)>0) ? ((int)x) : ((int)x-1 ) )\n#define LERP(t, a, b) ((a) + (t)*((b)-(a)))\n\n\n//---------------------------------------------------------------------\n// Static data\n\n/*\n * Permutation table. This is just a random jumble of all numbers 0-255,\n * repeated twice to avoid wrapping the index at 255 for each lookup.\n * This needs to be exactly the same for all instances on all platforms,\n * so it's easiest to just keep it as static explicit data.\n * This also removes the need for any initialisation of this class.\n *\n * Note that making this an int[] instead of a char[] might make the\n * code run faster on platforms with a high penalty for unaligned single\n * byte addressing. Intel x86 is generally single-byte-friendly, but\n * some other CPUs are faster with 4-aligned reads.\n * However, a char[] is smaller, which avoids cache trashing, and that\n * is probably the most important aspect on most architectures.\n * This array is accessed a *lot* by the noise functions.\n * A vector-valued noise over 3D accesses it 96 times, and a\n * float-valued 4D noise 64 times. We want this to fit in the cache!\n */\nunsigned char Noise1234::perm[] = {151,160,137,91,90,15,\n  131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,\n  190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,\n  88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,\n  77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,\n  102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,\n  135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,\n  5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,\n  223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,\n  129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,\n  251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,\n  49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,\n  138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180,\n  151,160,137,91,90,15,\n  131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,\n  190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,\n  88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,\n  77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,\n  102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,\n  135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,\n  5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,\n  223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,\n  129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,\n  251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,\n  49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,\n  138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180\n};\n\n//---------------------------------------------------------------------\n\n/*\n * Helper functions to compute gradients-dot-residualvectors (1D to 4D)\n * Note that these generate gradients of more than unit length. To make\n * a close match with the value range of classic Perlin noise, the final\n * noise values need to be rescaled. To match the RenderMan noise in a\n * statistical sense, the approximate scaling values (empirically\n * determined from test renderings) are:\n * 1D noise needs rescaling with 0.188\n * 2D noise needs rescaling with 0.507\n * 3D noise needs rescaling with 0.936\n * 4D noise needs rescaling with 0.87\n * Note that these noise functions are the most practical and useful\n * signed version of Perlin noise. To return values according to the\n * RenderMan specification from the SL noise() and pnoise() functions,\n * the noise values need to be scaled and offset to [0,1], like this:\n * float SLnoise = (Noise1234::noise(x,y,z) + 1.0) * 0.5;\n */\n\ndouble  Noise1234::grad( int hash, double x ) {\n    int h = hash & 15;\n    double grad = 1.0 + (h & 7);   // Gradient value 1.0, 2.0, ..., 8.0\n    if (h&8) grad = -grad;         // and a random sign for the gradient\n    return ( grad * x );           // Multiply the gradient with the distance\n}\n\ndouble  Noise1234::grad( int hash, double x, double y ) {\n    int h = hash & 7;        // Convert low 3 bits of hash code\n    double u = h<4 ? x : y;  // into 8 simple gradient directions,\n    double v = h<4 ? y : x;  // and compute the dot product with (x,y).\n    return ((h&1)? -u : u) + ((h&2)? -2.0*v : 2.0*v);\n}\n\ndouble  Noise1234::grad( int hash, double x, double y , double z ) {\n    int h = hash & 15;      // Convert low 4 bits of hash code into 12 simple\n    double u = h<8 ? x : y; // gradient directions, and compute dot product.\n    double v = h<4 ? y : h==12||h==14 ? x : z; // Fix repeats at h = 12 to 15\n    return ((h&1)? -u : u) + ((h&2)? -v : v);\n}\n\ndouble  Noise1234::grad( int hash, double x, double y, double z, double t ) {\n    int h = hash & 31;       // Convert low 5 bits of hash code into 32 simple\n    double u = h<24 ? x : y; // gradient directions, and compute dot product.\n    double v = h<16 ? y : z;\n    double w = h<8 ? z : t;\n    return ((h&1)? -u : u) + ((h&2)? -v : v) + ((h&4)? -w : w);\n}\n\n//---------------------------------------------------------------------\n/** 1D float Perlin noise, SL \"noise()\"\n */\ndouble Noise1234::noise( double x )\n{\n    int ix0, ix1;\n    double fx0, fx1;\n    double s, n0, n1;\n\n    ix0 = FASTFLOOR( x ); // Integer part of x\n    fx0 = x - ix0;        // Fractional part of x\n    fx1 = fx0 - 1.0;\n    ix1 = ( ix0+1 ) & 0xff;\n    ix0 = ix0 & 0xff;    // Wrap to 0..255\n\n    s = FADE( fx0 );\n\n    n0 = grad( perm[ ix0 ], fx0 );\n    n1 = grad( perm[ ix1 ], fx1 );\n    return 0.188 * ( LERP( s, n0, n1 ) );\n}\n\n//---------------------------------------------------------------------\n/** 1D float Perlin periodic noise, SL \"pnoise()\"\n */\ndouble Noise1234::pnoise( double x, int px )\n{\n    int ix0, ix1;\n    double fx0, fx1;\n    double s, n0, n1;\n\n    ix0 = FASTFLOOR( x ); // Integer part of x\n    fx0 = x - ix0;        // Fractional part of x\n    fx1 = fx0 - 1.0;\n    ix1 = (( ix0 + 1 ) % px) & 0xff; // Wrap to 0..px-1 *and* wrap to 0..255\n    ix0 = ( ix0 % px ) & 0xff;       // (because px might be greater than 256)\n\n    s = FADE( fx0 );\n\n    n0 = grad( perm[ ix0 ], fx0 );\n    n1 = grad( perm[ ix1 ], fx1 );\n    return 0.188 * ( LERP( s, n0, n1 ) );\n}\n\n\n//---------------------------------------------------------------------\n/** 2D float Perlin noise.\n */\ndouble Noise1234::noise( double x, double y )\n{\n    int ix0, iy0, ix1, iy1;\n    double fx0, fy0, fx1, fy1;\n    double s, t, nx0, nx1, n0, n1;\n\n    ix0 = FASTFLOOR( x ); // Integer part of x\n    iy0 = FASTFLOOR( y ); // Integer part of y\n    fx0 = x - ix0;        // Fractional part of x\n    fy0 = y - iy0;        // Fractional part of y\n    fx1 = fx0 - 1.0;\n    fy1 = fy0 - 1.0;\n    ix1 = (ix0 + 1) & 0xff;  // Wrap to 0..255\n    iy1 = (iy0 + 1) & 0xff;\n    ix0 = ix0 & 0xff;\n    iy0 = iy0 & 0xff;\n\n    t = FADE( fy0 );\n    s = FADE( fx0 );\n\n    nx0 = grad(perm[ix0 + perm[iy0]], fx0, fy0);\n    nx1 = grad(perm[ix0 + perm[iy1]], fx0, fy1);\n    n0 = LERP( t, nx0, nx1 );\n\n    nx0 = grad(perm[ix1 + perm[iy0]], fx1, fy0);\n    nx1 = grad(perm[ix1 + perm[iy1]], fx1, fy1);\n    n1 = LERP(t, nx0, nx1);\n\n    return 0.507 * ( LERP( s, n0, n1 ) );\n}\n\n//---------------------------------------------------------------------\n/** 2D float Perlin periodic noise.\n */\ndouble Noise1234::pnoise( double x, double y, int px, int py )\n{\n    int ix0, iy0, ix1, iy1;\n    double fx0, fy0, fx1, fy1;\n    double s, t, nx0, nx1, n0, n1;\n\n    ix0 = FASTFLOOR( x ); // Integer part of x\n    iy0 = FASTFLOOR( y ); // Integer part of y\n    fx0 = x - ix0;        // Fractional part of x\n    fy0 = y - iy0;        // Fractional part of y\n    fx1 = fx0 - 1.0;\n    fy1 = fy0 - 1.0;\n    ix1 = (( ix0 + 1 ) % px) & 0xff;  // Wrap to 0..px-1 and wrap to 0..255\n    iy1 = (( iy0 + 1 ) % py) & 0xff;  // Wrap to 0..py-1 and wrap to 0..255\n    ix0 = ( ix0 % px ) & 0xff;\n    iy0 = ( iy0 % py ) & 0xff;\n\n    t = FADE( fy0 );\n    s = FADE( fx0 );\n\n    nx0 = grad(perm[ix0 + perm[iy0]], fx0, fy0);\n    nx1 = grad(perm[ix0 + perm[iy1]], fx0, fy1);\n    n0 = LERP( t, nx0, nx1 );\n\n    nx0 = grad(perm[ix1 + perm[iy0]], fx1, fy0);\n    nx1 = grad(perm[ix1 + perm[iy1]], fx1, fy1);\n    n1 = LERP(t, nx0, nx1);\n\n    return 0.507 * ( LERP( s, n0, n1 ) );\n}\n\n\n//---------------------------------------------------------------------\n/** 3D float Perlin noise.\n */\ndouble Noise1234::noise( double x, double y, double z )\n{\n    int ix0, iy0, ix1, iy1, iz0, iz1;\n    double fx0, fy0, fz0, fx1, fy1, fz1;\n    double s, t, r;\n    double nxy0, nxy1, nx0, nx1, n0, n1;\n\n    ix0 = FASTFLOOR( x ); // Integer part of x\n    iy0 = FASTFLOOR( y ); // Integer part of y\n    iz0 = FASTFLOOR( z ); // Integer part of z\n    fx0 = x - ix0;        // Fractional part of x\n    fy0 = y - iy0;        // Fractional part of y\n    fz0 = z - iz0;        // Fractional part of z\n    fx1 = fx0 - 1.0;\n    fy1 = fy0 - 1.0;\n    fz1 = fz0 - 1.0;\n    ix1 = ( ix0 + 1 ) & 0xff; // Wrap to 0..255\n    iy1 = ( iy0 + 1 ) & 0xff;\n    iz1 = ( iz0 + 1 ) & 0xff;\n    ix0 = ix0 & 0xff;\n    iy0 = iy0 & 0xff;\n    iz0 = iz0 & 0xff;\n\n    r = FADE( fz0 );\n    t = FADE( fy0 );\n    s = FADE( fx0 );\n\n    nxy0 = grad(perm[ix0 + perm[iy0 + perm[iz0]]], fx0, fy0, fz0);\n    nxy1 = grad(perm[ix0 + perm[iy0 + perm[iz1]]], fx0, fy0, fz1);\n    nx0 = LERP( r, nxy0, nxy1 );\n\n    nxy0 = grad(perm[ix0 + perm[iy1 + perm[iz0]]], fx0, fy1, fz0);\n    nxy1 = grad(perm[ix0 + perm[iy1 + perm[iz1]]], fx0, fy1, fz1);\n    nx1 = LERP( r, nxy0, nxy1 );\n\n    n0 = LERP( t, nx0, nx1 );\n\n    nxy0 = grad(perm[ix1 + perm[iy0 + perm[iz0]]], fx1, fy0, fz0);\n    nxy1 = grad(perm[ix1 + perm[iy0 + perm[iz1]]], fx1, fy0, fz1);\n    nx0 = LERP( r, nxy0, nxy1 );\n\n    nxy0 = grad(perm[ix1 + perm[iy1 + perm[iz0]]], fx1, fy1, fz0);\n    nxy1 = grad(perm[ix1 + perm[iy1 + perm[iz1]]], fx1, fy1, fz1);\n    nx1 = LERP( r, nxy0, nxy1 );\n\n    n1 = LERP( t, nx0, nx1 );\n\n    return 0.936 * ( LERP( s, n0, n1 ) );\n}\n\n//---------------------------------------------------------------------\n/** 3D float Perlin periodic noise.\n */\ndouble Noise1234::pnoise( double x, double y, double z, int px, int py, int pz )\n{\n    int ix0, iy0, ix1, iy1, iz0, iz1;\n    double fx0, fy0, fz0, fx1, fy1, fz1;\n    double s, t, r;\n    double nxy0, nxy1, nx0, nx1, n0, n1;\n\n    ix0 = FASTFLOOR( x ); // Integer part of x\n    iy0 = FASTFLOOR( y ); // Integer part of y\n    iz0 = FASTFLOOR( z ); // Integer part of z\n    fx0 = x - ix0;        // Fractional part of x\n    fy0 = y - iy0;        // Fractional part of y\n    fz0 = z - iz0;        // Fractional part of z\n    fx1 = fx0 - 1.0;\n    fy1 = fy0 - 1.0;\n    fz1 = fz0 - 1.0;\n    ix1 = (( ix0 + 1 ) % px ) & 0xff; // Wrap to 0..px-1 and wrap to 0..255\n    iy1 = (( iy0 + 1 ) % py ) & 0xff; // Wrap to 0..py-1 and wrap to 0..255\n    iz1 = (( iz0 + 1 ) % pz ) & 0xff; // Wrap to 0..pz-1 and wrap to 0..255\n    ix0 = ( ix0 % px ) & 0xff;\n    iy0 = ( iy0 % py ) & 0xff;\n    iz0 = ( iz0 % pz ) & 0xff;\n\n    r = FADE( fz0 );\n    t = FADE( fy0 );\n    s = FADE( fx0 );\n\n    nxy0 = grad(perm[ix0 + perm[iy0 + perm[iz0]]], fx0, fy0, fz0);\n    nxy1 = grad(perm[ix0 + perm[iy0 + perm[iz1]]], fx0, fy0, fz1);\n    nx0 = LERP( r, nxy0, nxy1 );\n\n    nxy0 = grad(perm[ix0 + perm[iy1 + perm[iz0]]], fx0, fy1, fz0);\n    nxy1 = grad(perm[ix0 + perm[iy1 + perm[iz1]]], fx0, fy1, fz1);\n    nx1 = LERP( r, nxy0, nxy1 );\n\n    n0 = LERP( t, nx0, nx1 );\n\n    nxy0 = grad(perm[ix1 + perm[iy0 + perm[iz0]]], fx1, fy0, fz0);\n    nxy1 = grad(perm[ix1 + perm[iy0 + perm[iz1]]], fx1, fy0, fz1);\n    nx0 = LERP( r, nxy0, nxy1 );\n\n    nxy0 = grad(perm[ix1 + perm[iy1 + perm[iz0]]], fx1, fy1, fz0);\n    nxy1 = grad(perm[ix1 + perm[iy1 + perm[iz1]]], fx1, fy1, fz1);\n    nx1 = LERP( r, nxy0, nxy1 );\n\n    n1 = LERP( t, nx0, nx1 );\n\n    return 0.936 * ( LERP( s, n0, n1 ) );\n}\n\n\n//---------------------------------------------------------------------\n/** 4D float Perlin noise.\n */\n\ndouble Noise1234::noise( double x, double y, double z, double w )\n{\n    int ix0, iy0, iz0, iw0, ix1, iy1, iz1, iw1;\n    double fx0, fy0, fz0, fw0, fx1, fy1, fz1, fw1;\n    double s, t, r, q;\n    double nxyz0, nxyz1, nxy0, nxy1, nx0, nx1, n0, n1;\n\n    ix0 = FASTFLOOR( x ); // Integer part of x\n    iy0 = FASTFLOOR( y ); // Integer part of y\n    iz0 = FASTFLOOR( z ); // Integer part of y\n    iw0 = FASTFLOOR( w ); // Integer part of w\n    fx0 = x - ix0;        // Fractional part of x\n    fy0 = y - iy0;        // Fractional part of y\n    fz0 = z - iz0;        // Fractional part of z\n    fw0 = w - iw0;        // Fractional part of w\n    fx1 = fx0 - 1.0;\n    fy1 = fy0 - 1.0;\n    fz1 = fz0 - 1.0;\n    fw1 = fw0 - 1.0;\n    ix1 = ( ix0 + 1 ) & 0xff;  // Wrap to 0..255\n    iy1 = ( iy0 + 1 ) & 0xff;\n    iz1 = ( iz0 + 1 ) & 0xff;\n    iw1 = ( iw0 + 1 ) & 0xff;\n    ix0 = ix0 & 0xff;\n    iy0 = iy0 & 0xff;\n    iz0 = iz0 & 0xff;\n    iw0 = iw0 & 0xff;\n\n    q = FADE( fw0 );\n    r = FADE( fz0 );\n    t = FADE( fy0 );\n    s = FADE( fx0 );\n\n    nxyz0 = grad(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx0, fy0, fz0, fw0);\n    nxyz1 = grad(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx0, fy0, fz0, fw1);\n    nxy0 = LERP( q, nxyz0, nxyz1 );\n\n    nxyz0 = grad(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx0, fy0, fz1, fw0);\n    nxyz1 = grad(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx0, fy0, fz1, fw1);\n    nxy1 = LERP( q, nxyz0, nxyz1 );\n\n    nx0 = LERP ( r, nxy0, nxy1 );\n\n    nxyz0 = grad(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx0, fy1, fz0, fw0);\n    nxyz1 = grad(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx0, fy1, fz0, fw1);\n    nxy0 = LERP( q, nxyz0, nxyz1 );\n\n    nxyz0 = grad(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx0, fy1, fz1, fw0);\n    nxyz1 = grad(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx0, fy1, fz1, fw1);\n    nxy1 = LERP( q, nxyz0, nxyz1 );\n\n    nx1 = LERP ( r, nxy0, nxy1 );\n\n    n0 = LERP( t, nx0, nx1 );\n\n    nxyz0 = grad(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx1, fy0, fz0, fw0);\n    nxyz1 = grad(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx1, fy0, fz0, fw1);\n    nxy0 = LERP( q, nxyz0, nxyz1 );\n\n    nxyz0 = grad(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx1, fy0, fz1, fw0);\n    nxyz1 = grad(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx1, fy0, fz1, fw1);\n    nxy1 = LERP( q, nxyz0, nxyz1 );\n\n    nx0 = LERP ( r, nxy0, nxy1 );\n\n    nxyz0 = grad(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx1, fy1, fz0, fw0);\n    nxyz1 = grad(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx1, fy1, fz0, fw1);\n    nxy0 = LERP( q, nxyz0, nxyz1 );\n\n    nxyz0 = grad(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx1, fy1, fz1, fw0);\n    nxyz1 = grad(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx1, fy1, fz1, fw1);\n    nxy1 = LERP( q, nxyz0, nxyz1 );\n\n    nx1 = LERP ( r, nxy0, nxy1 );\n\n    n1 = LERP( t, nx0, nx1 );\n\n    return 0.87 * ( LERP( s, n0, n1 ) );\n}\n\n//---------------------------------------------------------------------\n/** 4D float Perlin periodic noise.\n */\n\ndouble Noise1234::pnoise( double x, double y, double z, double w,\n                            int px, int py, int pz, int pw )\n{\n    int ix0, iy0, iz0, iw0, ix1, iy1, iz1, iw1;\n    double fx0, fy0, fz0, fw0, fx1, fy1, fz1, fw1;\n    double s, t, r, q;\n    double nxyz0, nxyz1, nxy0, nxy1, nx0, nx1, n0, n1;\n\n    ix0 = FASTFLOOR( x ); // Integer part of x\n    iy0 = FASTFLOOR( y ); // Integer part of y\n    iz0 = FASTFLOOR( z ); // Integer part of y\n    iw0 = FASTFLOOR( w ); // Integer part of w\n    fx0 = x - ix0;        // Fractional part of x\n    fy0 = y - iy0;        // Fractional part of y\n    fz0 = z - iz0;        // Fractional part of z\n    fw0 = w - iw0;        // Fractional part of w\n    fx1 = fx0 - 1.0;\n    fy1 = fy0 - 1.0;\n    fz1 = fz0 - 1.0;\n    fw1 = fw0 - 1.0;\n    ix1 = (( ix0 + 1 ) % px ) & 0xff;  // Wrap to 0..px-1 and wrap to 0..255\n    iy1 = (( iy0 + 1 ) % py ) & 0xff;  // Wrap to 0..py-1 and wrap to 0..255\n    iz1 = (( iz0 + 1 ) % pz ) & 0xff;  // Wrap to 0..pz-1 and wrap to 0..255\n    iw1 = (( iw0 + 1 ) % pw ) & 0xff;  // Wrap to 0..pw-1 and wrap to 0..255\n    ix0 = ( ix0 % px ) & 0xff;\n    iy0 = ( iy0 % py ) & 0xff;\n    iz0 = ( iz0 % pz ) & 0xff;\n    iw0 = ( iw0 % pw ) & 0xff;\n\n    q = FADE( fw0 );\n    r = FADE( fz0 );\n    t = FADE( fy0 );\n    s = FADE( fx0 );\n\n    nxyz0 = grad(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx0, fy0, fz0, fw0);\n    nxyz1 = grad(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx0, fy0, fz0, fw1);\n    nxy0 = LERP( q, nxyz0, nxyz1 );\n\n    nxyz0 = grad(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx0, fy0, fz1, fw0);\n    nxyz1 = grad(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx0, fy0, fz1, fw1);\n    nxy1 = LERP( q, nxyz0, nxyz1 );\n\n    nx0 = LERP ( r, nxy0, nxy1 );\n\n    nxyz0 = grad(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx0, fy1, fz0, fw0);\n    nxyz1 = grad(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx0, fy1, fz0, fw1);\n    nxy0 = LERP( q, nxyz0, nxyz1 );\n\n    nxyz0 = grad(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx0, fy1, fz1, fw0);\n    nxyz1 = grad(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx0, fy1, fz1, fw1);\n    nxy1 = LERP( q, nxyz0, nxyz1 );\n\n    nx1 = LERP ( r, nxy0, nxy1 );\n\n    n0 = LERP( t, nx0, nx1 );\n\n    nxyz0 = grad(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx1, fy0, fz0, fw0);\n    nxyz1 = grad(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx1, fy0, fz0, fw1);\n    nxy0 = LERP( q, nxyz0, nxyz1 );\n\n    nxyz0 = grad(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx1, fy0, fz1, fw0);\n    nxyz1 = grad(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx1, fy0, fz1, fw1);\n    nxy1 = LERP( q, nxyz0, nxyz1 );\n\n    nx0 = LERP ( r, nxy0, nxy1 );\n\n    nxyz0 = grad(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx1, fy1, fz0, fw0);\n    nxyz1 = grad(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx1, fy1, fz0, fw1);\n    nxy0 = LERP( q, nxyz0, nxyz1 );\n\n    nxyz0 = grad(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx1, fy1, fz1, fw0);\n    nxyz1 = grad(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx1, fy1, fz1, fw1);\n    nxy1 = LERP( q, nxyz0, nxyz1 );\n\n    nx1 = LERP ( r, nxy0, nxy1 );\n\n    n1 = LERP( t, nx0, nx1 );\n\n    return 0.87 * ( LERP( s, n0, n1 ) );\n}\n\n//---------------------------------------------------------------------\n"
  },
  {
    "path": "src/libraries/noise1234/noise1234.h",
    "content": "// Noise1234\n// Author: Stefan Gustavson (stegu@itn.liu.se)\n//\n// This library is public domain software, released by the author\n// into the public domain in February 2011. You may do anything\n// you like with it. You may even remove all attributions,\n// but of course I'd appreciate it if you kept my name somewhere.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n\n// Modified by the LOVE Development Team to use double precision.\n\n/** \\file\n\t\t\\brief Declares the Noise1234 class for producing Perlin noise.\n\t\t\\author Stefan Gustavson (stegu@itn.liu.se)\n*/\n\n/*\n * This is a clean, fast, modern and free Perlin noise class in C++.\n * Being a stand-alone class with no external dependencies, it is\n * highly reusable without source code modifications.\n */\n\nclass Noise1234 {\n\n  public:\n    Noise1234() {}\n    ~Noise1234() {}\n\n/** 1D, 2D, 3D and 4D float Perlin noise, SL \"noise()\"\n */\n    static double noise( double x );\n    static double noise( double x, double y );\n    static double noise( double x, double y, double z );\n    static double noise( double x, double y, double z, double w );\n\n/** 1D, 2D, 3D and 4D float Perlin periodic noise, SL \"pnoise()\"\n */\n    static double pnoise( double x, int px );\n    static double pnoise( double x, double y, int px, int py );\n    static double pnoise( double x, double y, double z, int px, int py, int pz );\n    static double pnoise( double x, double y, double z, double w,\n                              int px, int py, int pz, int pw );\n\n  private:\n    static unsigned char perm[];\n    static double  grad( int hash, double x );\n    static double  grad( int hash, double x, double y );\n    static double  grad( int hash, double x, double y , double z );\n    static double  grad( int hash, double x, double y, double z, double t );\n\n};\n"
  },
  {
    "path": "src/libraries/noise1234/simplexnoise1234.cpp",
    "content": "// SimplexNoise1234\n// Copyright © 2003-2011, Stefan Gustavson\n//\n// Contact: stegu@itn.liu.se\n//\n// This library is public domain software, released by the author\n// into the public domain in February 2011. You may do anything\n// you like with it. You may even remove all attributions,\n// but of course I'd appreciate it if you kept my name somewhere.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n\n// Modified by the LOVE Development Team to use double precision.\n\n/** \\file\n\t\t\\brief Implements the SimplexNoise1234 class for producing Perlin simplex noise.\n\t\t\\author Stefan Gustavson (stegu@itn.liu.se)\n*/\n\n/*\n * This implementation is \"Simplex Noise\" as presented by\n * Ken Perlin at a relatively obscure and not often cited course\n * session \"Real-Time Shading\" at Siggraph 2001 (before real\n * time shading actually took on), under the title \"hardware noise\".\n * The 3D function is numerically equivalent to his Java reference\n * code available in the PDF course notes, although I re-implemented\n * it from scratch to get more readable code. The 1D, 2D and 4D cases\n * were implemented from scratch by me from Ken Perlin's text.\n *\n * This is a highly reusable class. It has no dependencies\n * on any other file, apart from its own header file.\n */\n\n\n#include\t\"simplexnoise1234.h\"\n\n#define FASTFLOOR(x) ( ((x)>0) ? ((int)x) : (((int)x)-1) )\n\n//---------------------------------------------------------------------\n// Static data\n\n/*\n * Permutation table. This is just a random jumble of all numbers 0-255,\n * repeated twice to avoid wrapping the index at 255 for each lookup.\n * This needs to be exactly the same for all instances on all platforms,\n * so it's easiest to just keep it as static explicit data.\n * This also removes the need for any initialisation of this class.\n *\n * Note that making this an int[] instead of a char[] might make the\n * code run faster on platforms with a high penalty for unaligned single\n * byte addressing. Intel x86 is generally single-byte-friendly, but\n * some other CPUs are faster with 4-aligned reads.\n * However, a char[] is smaller, which avoids cache trashing, and that\n * is probably the most important aspect on most architectures.\n * This array is accessed a *lot* by the noise functions.\n * A vector-valued noise over 3D accesses it 96 times, and a\n * float-valued 4D noise 64 times. We want this to fit in the cache!\n */\nunsigned char SimplexNoise1234::perm[512] = {151,160,137,91,90,15,\n  131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,\n  190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,\n  88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,\n  77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,\n  102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,\n  135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,\n  5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,\n  223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,\n  129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,\n  251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,\n  49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,\n  138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180,\n  151,160,137,91,90,15,\n  131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,\n  190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,\n  88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,\n  77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,\n  102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,\n  135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,\n  5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,\n  223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,\n  129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,\n  251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,\n  49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,\n  138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180\n};\n\n//---------------------------------------------------------------------\n\n/*\n * Helper functions to compute gradients-dot-residualvectors (1D to 4D)\n * Note that these generate gradients of more than unit length. To make\n * a close match with the value range of classic Perlin noise, the final\n * noise values need to be rescaled to fit nicely within [-1,1].\n * (The simplex noise functions as such also have different scaling.)\n * Note also that these noise functions are the most practical and useful\n * signed version of Perlin noise. To return values according to the\n * RenderMan specification from the SL noise() and pnoise() functions,\n * the noise values need to be scaled and offset to [0,1], like this:\n * float SLnoise = (SimplexNoise1234::noise(x,y,z) + 1.0) * 0.5;\n */\n\ndouble  SimplexNoise1234::grad( int hash, double x ) {\n    int h = hash & 15;\n    double grad = 1.0 + (h & 7);   // Gradient value 1.0, 2.0, ..., 8.0\n    if (h&8) grad = -grad;         // Set a random sign for the gradient\n    return ( grad * x );           // Multiply the gradient with the distance\n}\n\ndouble  SimplexNoise1234::grad( int hash, double x, double y ) {\n    int h = hash & 7;      // Convert low 3 bits of hash code\n    double u = h<4 ? x : y;  // into 8 simple gradient directions,\n    double v = h<4 ? y : x;  // and compute the dot product with (x,y).\n    return ((h&1)? -u : u) + ((h&2)? -2.0*v : 2.0*v);\n}\n\ndouble  SimplexNoise1234::grad( int hash, double x, double y , double z ) {\n    int h = hash & 15;     // Convert low 4 bits of hash code into 12 simple\n    double u = h<8 ? x : y; // gradient directions, and compute dot product.\n    double v = h<4 ? y : h==12||h==14 ? x : z; // Fix repeats at h = 12 to 15\n    return ((h&1)? -u : u) + ((h&2)? -v : v);\n}\n\ndouble  SimplexNoise1234::grad( int hash, double x, double y, double z, double t ) {\n    int h = hash & 31;      // Convert low 5 bits of hash code into 32 simple\n    double u = h<24 ? x : y; // gradient directions, and compute dot product.\n    double v = h<16 ? y : z;\n    double w = h<8 ? z : t;\n    return ((h&1)? -u : u) + ((h&2)? -v : v) + ((h&4)? -w : w);\n}\n\n// A lookup table to traverse the simplex around a given point in 4D.\n// Details can be found where this table is used, in the 4D noise method.\n/* TODO: This should not be required, backport it from Bill's GLSL code! */\nstatic unsigned char simplex[64][4] = {\n    {0,1,2,3},{0,1,3,2},{0,0,0,0},{0,2,3,1},{0,0,0,0},{0,0,0,0},{0,0,0,0},{1,2,3,0},\n    {0,2,1,3},{0,0,0,0},{0,3,1,2},{0,3,2,1},{0,0,0,0},{0,0,0,0},{0,0,0,0},{1,3,2,0},\n    {0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},\n    {1,2,0,3},{0,0,0,0},{1,3,0,2},{0,0,0,0},{0,0,0,0},{0,0,0,0},{2,3,0,1},{2,3,1,0},\n    {1,0,2,3},{1,0,3,2},{0,0,0,0},{0,0,0,0},{0,0,0,0},{2,0,3,1},{0,0,0,0},{2,1,3,0},\n    {0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},\n    {2,0,1,3},{0,0,0,0},{0,0,0,0},{0,0,0,0},{3,0,1,2},{3,0,2,1},{0,0,0,0},{3,1,2,0},\n    {2,1,0,3},{0,0,0,0},{0,0,0,0},{0,0,0,0},{3,1,0,2},{0,0,0,0},{3,2,0,1},{3,2,1,0}};\n\n// 1D simplex noise\ndouble SimplexNoise1234::noise(double x) {\n\n  int i0 = FASTFLOOR(x);\n  int i1 = i0 + 1;\n  double x0 = x - i0;\n  double x1 = x0 - 1.0;\n\n  double n0, n1;\n\n  double t0 = 1.0 - x0*x0;\n  t0 *= t0;\n  n0 = t0 * t0 * grad(perm[i0 & 0xff], x0);\n\n  double t1 = 1.0 - x1*x1;\n  t1 *= t1;\n  n1 = t1 * t1 * grad(perm[i1 & 0xff], x1);\n  // The maximum value of this noise is 8*(3/4)^4 = 2.53125\n  // A factor of 0.395 will scale to fit exactly within [-1,1]\n  return 0.395 * (n0 + n1);\n\n}\n\n// 2D simplex noise\ndouble SimplexNoise1234::noise(double x, double y) {\n\n#define F2 0.366025403 // F2 = 0.5*(sqrt(3.0)-1.0)\n#define G2 0.211324865 // G2 = (3.0-Math.sqrt(3.0))/6.0\n\n    double n0, n1, n2; // Noise contributions from the three corners\n\n    // Skew the input space to determine which simplex cell we're in\n    double s = (x+y)*F2; // Hairy factor for 2D\n    double xs = x + s;\n    double ys = y + s;\n    int i = FASTFLOOR(xs);\n    int j = FASTFLOOR(ys);\n\n    double t = (i+j)*G2;\n    double X0 = i-t; // Unskew the cell origin back to (x,y) space\n    double Y0 = j-t;\n    double x0 = x-X0; // The x,y distances from the cell origin\n    double y0 = y-Y0;\n\n    // For the 2D case, the simplex shape is an equilateral triangle.\n    // Determine which simplex we are in.\n    int i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords\n    if(x0>y0) {i1=1; j1=0;} // lower triangle, XY order: (0,0)->(1,0)->(1,1)\n    else {i1=0; j1=1;}      // upper triangle, YX order: (0,0)->(0,1)->(1,1)\n\n    // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and\n    // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where\n    // c = (3-sqrt(3))/6\n\n    double x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords\n    double y1 = y0 - j1 + G2;\n    double x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords\n    double y2 = y0 - 1.0 + 2.0 * G2;\n\n    // Wrap the integer indices at 256, to avoid indexing perm[] out of bounds\n    int ii = i & 0xff;\n    int jj = j & 0xff;\n\n    // Calculate the contribution from the three corners\n    double t0 = 0.5 - x0*x0-y0*y0;\n    if(t0 < 0.0) n0 = 0.0;\n    else {\n      t0 *= t0;\n      n0 = t0 * t0 * grad(perm[ii+perm[jj]], x0, y0);\n    }\n\n    double t1 = 0.5 - x1*x1-y1*y1;\n    if(t1 < 0.0) n1 = 0.0;\n    else {\n      t1 *= t1;\n      n1 = t1 * t1 * grad(perm[ii+i1+perm[jj+j1]], x1, y1);\n    }\n\n    double t2 = 0.5 - x2*x2-y2*y2;\n    if(t2 < 0.0) n2 = 0.0;\n    else {\n      t2 *= t2;\n      n2 = t2 * t2 * grad(perm[ii+1+perm[jj+1]], x2, y2);\n    }\n\n    // Add contributions from each corner to get the final noise value.\n    // The result is scaled to return values in the interval [-1,1].\n    return 45.23 * (n0 + n1 + n2); // TODO: The scale factor is preliminary!\n  }\n\n// 3D simplex noise\ndouble SimplexNoise1234::noise(double x, double y, double z) {\n\n    // Simple skewing factors for the 3D case\n#define F3 0.333333333\n#define G3 0.166666667\n\n    double n0, n1, n2, n3; // Noise contributions from the four corners\n\n    // Skew the input space to determine which simplex cell we're in\n    double s = (x+y+z)*F3; // Very nice and simple skew factor for 3D\n    double xs = x+s;\n    double ys = y+s;\n    double zs = z+s;\n    int i = FASTFLOOR(xs);\n    int j = FASTFLOOR(ys);\n    int k = FASTFLOOR(zs);\n\n    double t = (float)(i+j+k)*G3; \n    double X0 = i-t; // Unskew the cell origin back to (x,y,z) space\n    double Y0 = j-t;\n    double Z0 = k-t;\n    double x0 = x-X0; // The x,y,z distances from the cell origin\n    double y0 = y-Y0;\n    double z0 = z-Z0;\n\n    // For the 3D case, the simplex shape is a slightly irregular tetrahedron.\n    // Determine which simplex we are in.\n    int i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords\n    int i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords\n\n    /* This code would benefit from a backport from the GLSL version! */\n    if(x0>=y0) {\n        if(y0>=z0)\n        { i1=1; j1=0; k1=0; i2=1; j2=1; k2=0; } // X Y Z order\n        else if(x0>=z0) { i1=1; j1=0; k1=0; i2=1; j2=0; k2=1; } // X Z Y order\n        else { i1=0; j1=0; k1=1; i2=1; j2=0; k2=1; } // Z X Y order\n    }\n    else { // x0<y0\n        if(y0<z0) { i1=0; j1=0; k1=1; i2=0; j2=1; k2=1; } // Z Y X order\n        else if(x0<z0) { i1=0; j1=1; k1=0; i2=0; j2=1; k2=1; } // Y Z X order\n        else { i1=0; j1=1; k1=0; i2=1; j2=1; k2=0; } // Y X Z order\n    }\n\n    // A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in (x,y,z),\n    // a step of (0,1,0) in (i,j,k) means a step of (-c,1-c,-c) in (x,y,z), and\n    // a step of (0,0,1) in (i,j,k) means a step of (-c,-c,1-c) in (x,y,z), where\n    // c = 1/6.\n\n    double x1 = x0 - i1 + G3; // Offsets for second corner in (x,y,z) coords\n    double y1 = y0 - j1 + G3;\n    double z1 = z0 - k1 + G3;\n    double x2 = x0 - i2 + 2.0f*G3; // Offsets for third corner in (x,y,z) coords\n    double y2 = y0 - j2 + 2.0f*G3;\n    double z2 = z0 - k2 + 2.0f*G3;\n    double x3 = x0 - 1.0f + 3.0f*G3; // Offsets for last corner in (x,y,z) coords\n    double y3 = y0 - 1.0f + 3.0f*G3;\n    double z3 = z0 - 1.0f + 3.0f*G3;\n\n    // Wrap the integer indices at 256, to avoid indexing perm[] out of bounds\n    int ii = i & 0xff;\n    int jj = j & 0xff;\n    int kk = k & 0xff;\n\n    // Calculate the contribution from the four corners\n    double t0 = 0.6f - x0*x0 - y0*y0 - z0*z0;\n    if(t0 < 0.0f) n0 = 0.0f;\n    else {\n        t0 *= t0;\n        n0 = t0 * t0 * grad(perm[ii+perm[jj+perm[kk]]], x0, y0, z0);\n    }\n\n    double t1 = 0.6f - x1*x1 - y1*y1 - z1*z1;\n    if(t1 < 0.0f) n1 = 0.0f;\n    else {\n        t1 *= t1;\n        n1 = t1 * t1 * grad(perm[ii+i1+perm[jj+j1+perm[kk+k1]]], x1, y1, z1);\n    }\n\n    double t2 = 0.6f - x2*x2 - y2*y2 - z2*z2;\n    if(t2 < 0.0f) n2 = 0.0f;\n    else {\n        t2 *= t2;\n        n2 = t2 * t2 * grad(perm[ii+i2+perm[jj+j2+perm[kk+k2]]], x2, y2, z2);\n    }\n\n    double t3 = 0.6f - x3*x3 - y3*y3 - z3*z3;\n    if(t3<0.0f) n3 = 0.0f;\n    else {\n        t3 *= t3;\n        n3 = t3 * t3 * grad(perm[ii+1+perm[jj+1+perm[kk+1]]], x3, y3, z3);\n    }\n\n    // Add contributions from each corner to get the final noise value.\n    // The result is scaled to stay just inside [-1,1]\n    return 32.74 * (n0 + n1 + n2 + n3); // TODO: The scale factor is preliminary!\n}\n\n\n// 4D simplex noise\ndouble SimplexNoise1234::noise(double x, double y, double z, double w) {\n\n    // The skewing and unskewing factors are hairy again for the 4D case\n#define F4 0.309016994 // F4 = (Math.sqrt(5.0)-1.0)/4.0\n#define G4 0.138196601 // G4 = (5.0-Math.sqrt(5.0))/20.0\n\n    double n0, n1, n2, n3, n4; // Noise contributions from the five corners\n\n    // Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in\n    double s = (x + y + z + w) * F4; // Factor for 4D skewing\n    double xs = x + s;\n    double ys = y + s;\n    double zs = z + s;\n    double ws = w + s;\n    int i = FASTFLOOR(xs);\n    int j = FASTFLOOR(ys);\n    int k = FASTFLOOR(zs);\n    int l = FASTFLOOR(ws);\n\n    double t = (i + j + k + l) * G4; // Factor for 4D unskewing\n    double X0 = i - t; // Unskew the cell origin back to (x,y,z,w) space\n    double Y0 = j - t;\n    double Z0 = k - t;\n    double W0 = l - t;\n\n    double x0 = x - X0;  // The x,y,z,w distances from the cell origin\n    double y0 = y - Y0;\n    double z0 = z - Z0;\n    double w0 = w - W0;\n\n    // For the 4D case, the simplex is a 4D shape I won't even try to describe.\n    // To find out which of the 24 possible simplices we're in, we need to\n    // determine the magnitude ordering of x0, y0, z0 and w0.\n    // The method below is a good way of finding the ordering of x,y,z,w and\n    // then find the correct traversal order for the simplex were in.\n    // First, six pair-wise comparisons are performed between each possible pair\n    // of the four coordinates, and the results are used to add up binary bits\n    // for an integer index.\n    int c1 = (x0 > y0) ? 32 : 0;\n    int c2 = (x0 > z0) ? 16 : 0;\n    int c3 = (y0 > z0) ? 8 : 0;\n    int c4 = (x0 > w0) ? 4 : 0;\n    int c5 = (y0 > w0) ? 2 : 0;\n    int c6 = (z0 > w0) ? 1 : 0;\n    int c = c1 + c2 + c3 + c4 + c5 + c6;\n\n    int i1, j1, k1, l1; // The integer offsets for the second simplex corner\n    int i2, j2, k2, l2; // The integer offsets for the third simplex corner\n    int i3, j3, k3, l3; // The integer offsets for the fourth simplex corner\n\n    // simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order.\n    // Many values of c will never occur, since e.g. x>y>z>w makes x<z, y<w and x<w\n    // impossible. Only the 24 indices which have non-zero entries make any sense.\n    // We use a thresholding to set the coordinates in turn from the largest magnitude.\n    // The number 3 in the \"simplex\" array is at the position of the largest coordinate.\n    i1 = simplex[c][0]>=3 ? 1 : 0;\n    j1 = simplex[c][1]>=3 ? 1 : 0;\n    k1 = simplex[c][2]>=3 ? 1 : 0;\n    l1 = simplex[c][3]>=3 ? 1 : 0;\n    // The number 2 in the \"simplex\" array is at the second largest coordinate.\n    i2 = simplex[c][0]>=2 ? 1 : 0;\n    j2 = simplex[c][1]>=2 ? 1 : 0;\n    k2 = simplex[c][2]>=2 ? 1 : 0;\n    l2 = simplex[c][3]>=2 ? 1 : 0;\n    // The number 1 in the \"simplex\" array is at the second smallest coordinate.\n    i3 = simplex[c][0]>=1 ? 1 : 0;\n    j3 = simplex[c][1]>=1 ? 1 : 0;\n    k3 = simplex[c][2]>=1 ? 1 : 0;\n    l3 = simplex[c][3]>=1 ? 1 : 0;\n    // The fifth corner has all coordinate offsets = 1, so no need to look that up.\n\n    double x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords\n    double y1 = y0 - j1 + G4;\n    double z1 = z0 - k1 + G4;\n    double w1 = w0 - l1 + G4;\n    double x2 = x0 - i2 + 2.0f*G4; // Offsets for third corner in (x,y,z,w) coords\n    double y2 = y0 - j2 + 2.0f*G4;\n    double z2 = z0 - k2 + 2.0f*G4;\n    double w2 = w0 - l2 + 2.0f*G4;\n    double x3 = x0 - i3 + 3.0f*G4; // Offsets for fourth corner in (x,y,z,w) coords\n    double y3 = y0 - j3 + 3.0f*G4;\n    double z3 = z0 - k3 + 3.0f*G4;\n    double w3 = w0 - l3 + 3.0f*G4;\n    double x4 = x0 - 1.0f + 4.0f*G4; // Offsets for last corner in (x,y,z,w) coords\n    double y4 = y0 - 1.0f + 4.0f*G4;\n    double z4 = z0 - 1.0f + 4.0f*G4;\n    double w4 = w0 - 1.0f + 4.0f*G4;\n\n    // Wrap the integer indices at 256, to avoid indexing perm[] out of bounds\n    int ii = i & 0xff;\n    int jj = j & 0xff;\n    int kk = k & 0xff;\n    int ll = l & 0xff;\n\n    // Calculate the contribution from the five corners\n    double t0 = 0.6f - x0*x0 - y0*y0 - z0*z0 - w0*w0;\n    if(t0 < 0.0f) n0 = 0.0f;\n    else {\n        t0 *= t0;\n        n0 = t0 * t0 * grad(perm[ii+perm[jj+perm[kk+perm[ll]]]], x0, y0, z0, w0);\n    }\n\n    double t1 = 0.6f - x1*x1 - y1*y1 - z1*z1 - w1*w1;\n    if(t1 < 0.0f) n1 = 0.0f;\n    else {\n        t1 *= t1;\n        n1 = t1 * t1 * grad(perm[ii+i1+perm[jj+j1+perm[kk+k1+perm[ll+l1]]]], x1, y1, z1, w1);\n    }\n\n    double t2 = 0.6f - x2*x2 - y2*y2 - z2*z2 - w2*w2;\n    if(t2 < 0.0f) n2 = 0.0f;\n    else {\n        t2 *= t2;\n        n2 = t2 * t2 * grad(perm[ii+i2+perm[jj+j2+perm[kk+k2+perm[ll+l2]]]], x2, y2, z2, w2);\n    }\n\n    double t3 = 0.6f - x3*x3 - y3*y3 - z3*z3 - w3*w3;\n    if(t3 < 0.0f) n3 = 0.0f;\n    else {\n        t3 *= t3;\n        n3 = t3 * t3 * grad(perm[ii+i3+perm[jj+j3+perm[kk+k3+perm[ll+l3]]]], x3, y3, z3, w3);\n    }\n\n    double t4 = 0.6f - x4*x4 - y4*y4 - z4*z4 - w4*w4;\n    if(t4 < 0.0f) n4 = 0.0f;\n    else {\n        t4 *= t4;\n        n4 = t4 * t4 * grad(perm[ii+1+perm[jj+1+perm[kk+1+perm[ll+1]]]], x4, y4, z4, w4);\n    }\n\n    // Sum up and scale the result to cover the range [-1,1]\n    return 27.3 * (n0 + n1 + n2 + n3 + n4); // TODO: The scale factor is preliminary!\n}\n//---------------------------------------------------------------------\n"
  },
  {
    "path": "src/libraries/noise1234/simplexnoise1234.h",
    "content": "// SimplexNoise1234\n// Copyright © 2003-2011, Stefan Gustavson\n//\n// Contact: stegu@itn.liu.se\n//\n// This library is public domain software, released by the author\n// into the public domain in February 2011. You may do anything\n// you like with it. You may even remove all attributions,\n// but of course I'd appreciate it if you kept my name somewhere.\n//\n// This library is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n\n// Modified by the LOVE Development Team to use double precision.\n\n/** \\file\n\t\t\\brief Declares the SimplexNoise1234 class for producing Perlin simplex noise.\n\t\t\\author Stefan Gustavson (stegu@itn.liu.se)\n*/\n\n/*\n * This is a clean, fast, modern and free Perlin Simplex noise class in C++.\n * Being a stand-alone class with no external dependencies, it is\n * highly reusable without source code modifications.\n */\n\nclass SimplexNoise1234 {\n\n  public:\n    SimplexNoise1234() {}\n    ~SimplexNoise1234() {}\n\n/** 1D and 2D float Perlin noise\n */\n    static double noise( double x );\n    static double noise( double x, double y );\n    static double noise( double x, double y, double z );\n    static double noise( double x, double y, double z, double w);\n\n  private:\n    static unsigned char perm[];\n    static double  grad( int hash, double x );\n    static double  grad( int hash, double x, double y );\n    static double  grad( int hash, double x, double y, double z );\n    static double  grad( int hash, double x, double y, double z, double t );\n};\n"
  },
  {
    "path": "src/libraries/physfs/physfs.c",
    "content": "/**\n * PhysicsFS; a portable, flexible file i/o abstraction.\n *\n * Documentation is in physfs.h. It's verbose, honest.  :)\n *\n * Please see the file LICENSE.txt in the source's root directory.\n *\n *  This file written by Ryan C. Gordon.\n */\n\n#define __PHYSICSFS_INTERNAL__\n#include \"physfs_internal.h\"\n\n#if defined(_MSC_VER)\n/* this code came from https://stackoverflow.com/a/8712996 */\nint __PHYSFS_msvc_vsnprintf(char *outBuf, size_t size, const char *format, va_list ap)\n{\n    int count = -1;\n\n    if (size != 0)\n        count = _vsnprintf_s(outBuf, size, _TRUNCATE, format, ap);\n    if (count == -1)\n        count = _vscprintf(format, ap);\n\n    return count;\n}\n\nint __PHYSFS_msvc_snprintf(char *outBuf, size_t size, const char *format, ...)\n{\n    int count;\n    va_list ap;\n\n    va_start(ap, format);\n    count = __PHYSFS_msvc_vsnprintf(outBuf, size, format, ap);\n    va_end(ap);\n\n    return count;\n}\n#endif\n\n\ntypedef struct __PHYSFS_DIRHANDLE__\n{\n    void *opaque;  /* Instance data unique to the archiver. */\n    char *dirName;  /* Path to archive in platform-dependent notation. */\n    char *mountPoint; /* Mountpoint in virtual file tree. */\n    char *root;  /* subdirectory of archiver to use as root of archive (NULL for actual root) */\n    size_t rootlen;  /* subdirectory of archiver to use as root of archive (NULL for actual root) */\n    const PHYSFS_Archiver *funcs;  /* Ptr to archiver info for this handle. */\n    int forWriting; /* Whether this was opened for writing or not. */\n    struct __PHYSFS_DIRHANDLE__ *next;  /* linked list stuff. */\n} DirHandle;\n\n\ntypedef struct __PHYSFS_FILEHANDLE__\n{\n    PHYSFS_Io *io;  /* Instance data unique to the archiver for this file. */\n    PHYSFS_uint8 forReading; /* Non-zero if reading, zero if write/append */\n    const DirHandle *dirHandle;  /* Archiver instance that created this */\n    PHYSFS_uint8 *buffer;  /* Buffer, if set (NULL otherwise). Don't touch! */\n    size_t bufsize;  /* Bufsize, if set (0 otherwise). Don't touch! */\n    size_t buffill;  /* Buffer fill size. Don't touch! */\n    size_t bufpos;  /* Buffer position. Don't touch! */\n    struct __PHYSFS_FILEHANDLE__ *next;  /* linked list stuff. */\n} FileHandle;\n\n\ntypedef struct __PHYSFS_ERRSTATETYPE__\n{\n    void *tid;\n    PHYSFS_ErrorCode code;\n    struct __PHYSFS_ERRSTATETYPE__ *next;\n} ErrState;\n\n\n/* General PhysicsFS state ... */\nstatic int initialized = 0;\nstatic ErrState *errorStates = NULL;\nstatic DirHandle *searchPath = NULL;\nstatic DirHandle *writeDir = NULL;\nstatic FileHandle *openWriteList = NULL;\nstatic FileHandle *openReadList = NULL;\nstatic char *baseDir = NULL;\nstatic char *userDir = NULL;\nstatic char *prefDir = NULL;\nstatic int allowSymLinks = 0;\nstatic PHYSFS_Archiver **archivers = NULL;\nstatic PHYSFS_ArchiveInfo **archiveInfo = NULL;\nstatic volatile size_t numArchivers = 0;\nstatic size_t longest_root = 0;\n\n/* mutexes ... */\nstatic void *errorLock = NULL;     /* protects error message list.        */\nstatic void *stateLock = NULL;     /* protects other PhysFS static state. */\n\n/* allocator ... */\nstatic int externalAllocator = 0;\nPHYSFS_Allocator allocator;\n\n\n#ifdef PHYSFS_NEED_ATOMIC_OP_FALLBACK\nstatic inline int __PHYSFS_atomicAdd(int *ptrval, const int val)\n{\n    int retval;\n    __PHYSFS_platformGrabMutex(stateLock);\n    *ptrval += val;\n    retval = *ptrval;\n    __PHYSFS_platformReleaseMutex(stateLock);\n    return retval;\n} /* __PHYSFS_atomicAdd */\n\nint __PHYSFS_ATOMIC_INCR(int *ptrval)\n{\n    return __PHYSFS_atomicAdd(ptrval, 1);\n} /* __PHYSFS_ATOMIC_INCR */\n\nint __PHYSFS_ATOMIC_DECR(int *ptrval)\n{\n    return __PHYSFS_atomicAdd(ptrval, -1);\n} /* __PHYSFS_ATOMIC_DECR */\n#endif\n\n\n\n/* PHYSFS_Io implementation for i/o to physical filesystem... */\n\n/* !!! FIXME: maybe refcount the paths in a string pool? */\ntypedef struct __PHYSFS_NativeIoInfo\n{\n    void *handle;\n    const char *path;\n    int mode;   /* 'r', 'w', or 'a' */\n} NativeIoInfo;\n\nstatic PHYSFS_sint64 nativeIo_read(PHYSFS_Io *io, void *buf, PHYSFS_uint64 len)\n{\n    NativeIoInfo *info = (NativeIoInfo *) io->opaque;\n    return __PHYSFS_platformRead(info->handle, buf, len);\n} /* nativeIo_read */\n\nstatic PHYSFS_sint64 nativeIo_write(PHYSFS_Io *io, const void *buffer,\n                                    PHYSFS_uint64 len)\n{\n    NativeIoInfo *info = (NativeIoInfo *) io->opaque;\n    return __PHYSFS_platformWrite(info->handle, buffer, len);\n} /* nativeIo_write */\n\nstatic int nativeIo_seek(PHYSFS_Io *io, PHYSFS_uint64 offset)\n{\n    NativeIoInfo *info = (NativeIoInfo *) io->opaque;\n    return __PHYSFS_platformSeek(info->handle, offset);\n} /* nativeIo_seek */\n\nstatic PHYSFS_sint64 nativeIo_tell(PHYSFS_Io *io)\n{\n    NativeIoInfo *info = (NativeIoInfo *) io->opaque;\n    return __PHYSFS_platformTell(info->handle);\n} /* nativeIo_tell */\n\nstatic PHYSFS_sint64 nativeIo_length(PHYSFS_Io *io)\n{\n    NativeIoInfo *info = (NativeIoInfo *) io->opaque;\n    return __PHYSFS_platformFileLength(info->handle);\n} /* nativeIo_length */\n\nstatic PHYSFS_Io *nativeIo_duplicate(PHYSFS_Io *io)\n{\n    NativeIoInfo *info = (NativeIoInfo *) io->opaque;\n    return __PHYSFS_createNativeIo(info->path, info->mode);\n} /* nativeIo_duplicate */\n\nstatic int nativeIo_flush(PHYSFS_Io *io)\n{\n    NativeIoInfo *info = (NativeIoInfo *) io->opaque;\n    return __PHYSFS_platformFlush(info->handle);\n} /* nativeIo_flush */\n\nstatic void nativeIo_destroy(PHYSFS_Io *io)\n{\n    NativeIoInfo *info = (NativeIoInfo *) io->opaque;\n    __PHYSFS_platformClose(info->handle);\n    allocator.Free((void *) info->path);\n    allocator.Free(info);\n    allocator.Free(io);\n} /* nativeIo_destroy */\n\nstatic const PHYSFS_Io __PHYSFS_nativeIoInterface =\n{\n    CURRENT_PHYSFS_IO_API_VERSION, NULL,\n    nativeIo_read,\n    nativeIo_write,\n    nativeIo_seek,\n    nativeIo_tell,\n    nativeIo_length,\n    nativeIo_duplicate,\n    nativeIo_flush,\n    nativeIo_destroy\n};\n\nPHYSFS_Io *__PHYSFS_createNativeIo(const char *path, const int mode)\n{\n    PHYSFS_Io *io = NULL;\n    NativeIoInfo *info = NULL;\n    void *handle = NULL;\n    char *pathdup = NULL;\n\n    assert((mode == 'r') || (mode == 'w') || (mode == 'a'));\n\n    io = (PHYSFS_Io *) allocator.Malloc(sizeof (PHYSFS_Io));\n    GOTO_IF(!io, PHYSFS_ERR_OUT_OF_MEMORY, createNativeIo_failed);\n    info = (NativeIoInfo *) allocator.Malloc(sizeof (NativeIoInfo));\n    GOTO_IF(!info, PHYSFS_ERR_OUT_OF_MEMORY, createNativeIo_failed);\n    pathdup = (char *) allocator.Malloc(strlen(path) + 1);\n    GOTO_IF(!pathdup, PHYSFS_ERR_OUT_OF_MEMORY, createNativeIo_failed);\n\n    if (mode == 'r')\n        handle = __PHYSFS_platformOpenRead(path);\n    else if (mode == 'w')\n        handle = __PHYSFS_platformOpenWrite(path);\n    else if (mode == 'a')\n        handle = __PHYSFS_platformOpenAppend(path);\n\n    GOTO_IF_ERRPASS(!handle, createNativeIo_failed);\n\n    strcpy(pathdup, path);\n    info->handle = handle;\n    info->path = pathdup;\n    info->mode = mode;\n    memcpy(io, &__PHYSFS_nativeIoInterface, sizeof (*io));\n    io->opaque = info;\n    return io;\n\ncreateNativeIo_failed:\n    if (handle != NULL) __PHYSFS_platformClose(handle);\n    if (pathdup != NULL) allocator.Free(pathdup);\n    if (info != NULL) allocator.Free(info);\n    if (io != NULL) allocator.Free(io);\n    return NULL;\n} /* __PHYSFS_createNativeIo */\n\n\n/* PHYSFS_Io implementation for i/o to a memory buffer... */\n\ntypedef struct __PHYSFS_MemoryIoInfo\n{\n    const PHYSFS_uint8 *buf;\n    PHYSFS_uint64 len;\n    PHYSFS_uint64 pos;\n    PHYSFS_Io *parent;\n    int refcount;\n    void (*destruct)(void *);\n} MemoryIoInfo;\n\nstatic PHYSFS_sint64 memoryIo_read(PHYSFS_Io *io, void *buf, PHYSFS_uint64 len)\n{\n    MemoryIoInfo *info = (MemoryIoInfo *) io->opaque;\n    const PHYSFS_uint64 avail = info->len - info->pos;\n    assert(avail <= info->len);\n\n    if (avail == 0)\n        return 0;  /* we're at EOF; nothing to do. */\n\n    if (len > avail)\n        len = avail;\n\n    memcpy(buf, info->buf + info->pos, (size_t) len);\n    info->pos += len;\n    return len;\n} /* memoryIo_read */\n\nstatic PHYSFS_sint64 memoryIo_write(PHYSFS_Io *io, const void *buffer,\n                                    PHYSFS_uint64 len)\n{\n    BAIL(PHYSFS_ERR_OPEN_FOR_READING, -1);\n} /* memoryIo_write */\n\nstatic int memoryIo_seek(PHYSFS_Io *io, PHYSFS_uint64 offset)\n{\n    MemoryIoInfo *info = (MemoryIoInfo *) io->opaque;\n    BAIL_IF(offset > info->len, PHYSFS_ERR_PAST_EOF, 0);\n    info->pos = offset;\n    return 1;\n} /* memoryIo_seek */\n\nstatic PHYSFS_sint64 memoryIo_tell(PHYSFS_Io *io)\n{\n    const MemoryIoInfo *info = (MemoryIoInfo *) io->opaque;\n    return (PHYSFS_sint64) info->pos;\n} /* memoryIo_tell */\n\nstatic PHYSFS_sint64 memoryIo_length(PHYSFS_Io *io)\n{\n    const MemoryIoInfo *info = (MemoryIoInfo *) io->opaque;\n    return (PHYSFS_sint64) info->len;\n} /* memoryIo_length */\n\nstatic PHYSFS_Io *memoryIo_duplicate(PHYSFS_Io *io)\n{\n    MemoryIoInfo *info = (MemoryIoInfo *) io->opaque;\n    MemoryIoInfo *newinfo = NULL;\n    PHYSFS_Io *parent = info->parent;\n    PHYSFS_Io *retval = NULL;\n\n    /* avoid deep copies. */\n    assert((!parent) || (!((MemoryIoInfo *) parent->opaque)->parent) );\n\n    /* share the buffer between duplicates. */\n    if (parent != NULL)  /* dup the parent, increment its refcount. */\n        return parent->duplicate(parent);\n\n    /* we're the parent. */\n\n    retval = (PHYSFS_Io *) allocator.Malloc(sizeof (PHYSFS_Io));\n    BAIL_IF(!retval, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n    newinfo = (MemoryIoInfo *) allocator.Malloc(sizeof (MemoryIoInfo));\n    if (!newinfo)\n    {\n        allocator.Free(retval);\n        BAIL(PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n    } /* if */\n\n    __PHYSFS_ATOMIC_INCR(&info->refcount);\n\n    memset(newinfo, '\\0', sizeof (*info));\n    newinfo->buf = info->buf;\n    newinfo->len = info->len;\n    newinfo->pos = 0;\n    newinfo->parent = io;\n    newinfo->refcount = 0;\n    newinfo->destruct = NULL;\n\n    memcpy(retval, io, sizeof (*retval));\n    retval->opaque = newinfo;\n    return retval;\n} /* memoryIo_duplicate */\n\nstatic int memoryIo_flush(PHYSFS_Io *io) { return 1;  /* it's read-only. */ }\n\nstatic void memoryIo_destroy(PHYSFS_Io *io)\n{\n    MemoryIoInfo *info = (MemoryIoInfo *) io->opaque;\n    PHYSFS_Io *parent = info->parent;\n\n    if (parent != NULL)\n    {\n        assert(info->buf == ((MemoryIoInfo *) info->parent->opaque)->buf);\n        assert(info->len == ((MemoryIoInfo *) info->parent->opaque)->len);\n        assert(info->refcount == 0);\n        assert(info->destruct == NULL);\n        allocator.Free(info);\n        allocator.Free(io);\n        parent->destroy(parent);  /* decrements refcount. */\n        return;\n    } /* if */\n\n    /* we _are_ the parent. */\n    assert(info->refcount > 0);  /* even in a race, we hold a reference. */\n\n    if (__PHYSFS_ATOMIC_DECR(&info->refcount) == 0)\n    {\n        void (*destruct)(void *) = info->destruct;\n        void *buf = (void *) info->buf;\n        io->opaque = NULL;  /* kill this here in case of race. */\n        allocator.Free(info);\n        allocator.Free(io);\n        if (destruct != NULL)\n            destruct(buf);\n    } /* if */\n} /* memoryIo_destroy */\n\n\nstatic const PHYSFS_Io __PHYSFS_memoryIoInterface =\n{\n    CURRENT_PHYSFS_IO_API_VERSION, NULL,\n    memoryIo_read,\n    memoryIo_write,\n    memoryIo_seek,\n    memoryIo_tell,\n    memoryIo_length,\n    memoryIo_duplicate,\n    memoryIo_flush,\n    memoryIo_destroy\n};\n\nPHYSFS_Io *__PHYSFS_createMemoryIo(const void *buf, PHYSFS_uint64 len,\n                                   void (*destruct)(void *))\n{\n    PHYSFS_Io *io = NULL;\n    MemoryIoInfo *info = NULL;\n\n    io = (PHYSFS_Io *) allocator.Malloc(sizeof (PHYSFS_Io));\n    GOTO_IF(!io, PHYSFS_ERR_OUT_OF_MEMORY, createMemoryIo_failed);\n    info = (MemoryIoInfo *) allocator.Malloc(sizeof (MemoryIoInfo));\n    GOTO_IF(!info, PHYSFS_ERR_OUT_OF_MEMORY, createMemoryIo_failed);\n\n    memset(info, '\\0', sizeof (*info));\n    info->buf = (const PHYSFS_uint8 *) buf;\n    info->len = len;\n    info->pos = 0;\n    info->parent = NULL;\n    info->refcount = 1;\n    info->destruct = destruct;\n\n    memcpy(io, &__PHYSFS_memoryIoInterface, sizeof (*io));\n    io->opaque = info;\n    return io;\n\ncreateMemoryIo_failed:\n    if (info != NULL) allocator.Free(info);\n    if (io != NULL) allocator.Free(io);\n    return NULL;\n} /* __PHYSFS_createMemoryIo */\n\n\n/* PHYSFS_Io implementation for i/o to a PHYSFS_File... */\n\nstatic PHYSFS_sint64 handleIo_read(PHYSFS_Io *io, void *buf, PHYSFS_uint64 len)\n{\n    return PHYSFS_readBytes((PHYSFS_File *) io->opaque, buf, len);\n} /* handleIo_read */\n\nstatic PHYSFS_sint64 handleIo_write(PHYSFS_Io *io, const void *buffer,\n                                    PHYSFS_uint64 len)\n{\n    return PHYSFS_writeBytes((PHYSFS_File *) io->opaque, buffer, len);\n} /* handleIo_write */\n\nstatic int handleIo_seek(PHYSFS_Io *io, PHYSFS_uint64 offset)\n{\n    return PHYSFS_seek((PHYSFS_File *) io->opaque, offset);\n} /* handleIo_seek */\n\nstatic PHYSFS_sint64 handleIo_tell(PHYSFS_Io *io)\n{\n    return PHYSFS_tell((PHYSFS_File *) io->opaque);\n} /* handleIo_tell */\n\nstatic PHYSFS_sint64 handleIo_length(PHYSFS_Io *io)\n{\n    return PHYSFS_fileLength((PHYSFS_File *) io->opaque);\n} /* handleIo_length */\n\nstatic PHYSFS_Io *handleIo_duplicate(PHYSFS_Io *io)\n{\n    /*\n     * There's no duplicate at the PHYSFS_File level, so we break the\n     *  abstraction. We're allowed to: we're physfs.c!\n     */\n    FileHandle *origfh = (FileHandle *) io->opaque;\n    FileHandle *newfh = (FileHandle *) allocator.Malloc(sizeof (FileHandle));\n    PHYSFS_Io *retval = NULL;\n\n    GOTO_IF(!newfh, PHYSFS_ERR_OUT_OF_MEMORY, handleIo_dupe_failed);\n    memset(newfh, '\\0', sizeof (*newfh));\n\n    retval = (PHYSFS_Io *) allocator.Malloc(sizeof (PHYSFS_Io));\n    GOTO_IF(!retval, PHYSFS_ERR_OUT_OF_MEMORY, handleIo_dupe_failed);\n\n#if 0  /* we don't buffer the duplicate, at least not at the moment. */\n    if (origfh->buffer != NULL)\n    {\n        newfh->buffer = (PHYSFS_uint8 *) allocator.Malloc(origfh->bufsize);\n        if (!newfh->buffer)\n            GOTO(PHYSFS_ERR_OUT_OF_MEMORY, handleIo_dupe_failed);\n        newfh->bufsize = origfh->bufsize;\n    } /* if */\n#endif\n\n    newfh->io = origfh->io->duplicate(origfh->io);\n    GOTO_IF_ERRPASS(!newfh->io, handleIo_dupe_failed);\n\n    newfh->forReading = origfh->forReading;\n    newfh->dirHandle = origfh->dirHandle;\n\n    __PHYSFS_platformGrabMutex(stateLock);\n    if (newfh->forReading)\n    {\n        newfh->next = openReadList;\n        openReadList = newfh;\n    } /* if */\n    else\n    {\n        newfh->next = openWriteList;\n        openWriteList = newfh;\n    } /* else */\n    __PHYSFS_platformReleaseMutex(stateLock);\n\n    memcpy(retval, io, sizeof (PHYSFS_Io));\n    retval->opaque = newfh;\n    return retval;\n    \nhandleIo_dupe_failed:\n    if (newfh)\n    {\n        if (newfh->io != NULL) newfh->io->destroy(newfh->io);\n        if (newfh->buffer != NULL) allocator.Free(newfh->buffer);\n        allocator.Free(newfh);\n    } /* if */\n\n    return NULL;\n} /* handleIo_duplicate */\n\nstatic int handleIo_flush(PHYSFS_Io *io)\n{\n    return PHYSFS_flush((PHYSFS_File *) io->opaque);\n} /* handleIo_flush */\n\nstatic void handleIo_destroy(PHYSFS_Io *io)\n{\n    if (io->opaque != NULL)\n        PHYSFS_close((PHYSFS_File *) io->opaque);\n    allocator.Free(io);\n} /* handleIo_destroy */\n\nstatic const PHYSFS_Io __PHYSFS_handleIoInterface =\n{\n    CURRENT_PHYSFS_IO_API_VERSION, NULL,\n    handleIo_read,\n    handleIo_write,\n    handleIo_seek,\n    handleIo_tell,\n    handleIo_length,\n    handleIo_duplicate,\n    handleIo_flush,\n    handleIo_destroy\n};\n\nstatic PHYSFS_Io *__PHYSFS_createHandleIo(PHYSFS_File *f)\n{\n    PHYSFS_Io *io = (PHYSFS_Io *) allocator.Malloc(sizeof (PHYSFS_Io));\n    BAIL_IF(!io, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n    memcpy(io, &__PHYSFS_handleIoInterface, sizeof (*io));\n    io->opaque = f;\n    return io;\n} /* __PHYSFS_createHandleIo */\n\n\n/* functions ... */\n\ntypedef struct\n{\n    char **list;\n    PHYSFS_uint32 size;\n    PHYSFS_ErrorCode errcode;\n} EnumStringListCallbackData;\n\nstatic void enumStringListCallback(void *data, const char *str)\n{\n    void *ptr;\n    char *newstr;\n    EnumStringListCallbackData *pecd = (EnumStringListCallbackData *) data;\n\n    if (pecd->errcode)\n        return;\n\n    ptr = allocator.Realloc(pecd->list, (pecd->size + 2) * sizeof (char *));\n    newstr = (char *) allocator.Malloc(strlen(str) + 1);\n    if (ptr != NULL)\n        pecd->list = (char **) ptr;\n\n    if ((ptr == NULL) || (newstr == NULL))\n    {\n        pecd->errcode = PHYSFS_ERR_OUT_OF_MEMORY;\n        pecd->list[pecd->size] = NULL;\n        PHYSFS_freeList(pecd->list);\n        return;\n    } /* if */\n\n    strcpy(newstr, str);\n    pecd->list[pecd->size] = newstr;\n    pecd->size++;\n} /* enumStringListCallback */\n\n\nstatic char **doEnumStringList(void (*func)(PHYSFS_StringCallback, void *))\n{\n    EnumStringListCallbackData ecd;\n    memset(&ecd, '\\0', sizeof (ecd));\n    ecd.list = (char **) allocator.Malloc(sizeof (char *));\n    BAIL_IF(!ecd.list, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n    func(enumStringListCallback, &ecd);\n\n    if (ecd.errcode)\n    {\n        PHYSFS_setErrorCode(ecd.errcode);\n        return NULL;\n    } /* if */\n\n    ecd.list[ecd.size] = NULL;\n    return ecd.list;\n} /* doEnumStringList */\n\n\nstatic void __PHYSFS_bubble_sort(void *a, size_t lo, size_t hi,\n                                 int (*cmpfn)(void *, size_t, size_t),\n                                 void (*swapfn)(void *, size_t, size_t))\n{\n    size_t i;\n    int sorted;\n\n    do\n    {\n        sorted = 1;\n        for (i = lo; i < hi; i++)\n        {\n            if (cmpfn(a, i, i + 1) > 0)\n            {\n                swapfn(a, i, i + 1);\n                sorted = 0;\n            } /* if */\n        } /* for */\n    } while (!sorted);\n} /* __PHYSFS_bubble_sort */\n\n\nstatic void __PHYSFS_quick_sort(void *a, size_t lo, size_t hi,\n                         int (*cmpfn)(void *, size_t, size_t),\n                         void (*swapfn)(void *, size_t, size_t))\n{\n    size_t i;\n    size_t j;\n    size_t v;\n\n    if ((hi - lo) <= PHYSFS_QUICKSORT_THRESHOLD)\n        __PHYSFS_bubble_sort(a, lo, hi, cmpfn, swapfn);\n    else\n    {\n        i = (hi + lo) / 2;\n\n        if (cmpfn(a, lo, i) > 0) swapfn(a, lo, i);\n        if (cmpfn(a, lo, hi) > 0) swapfn(a, lo, hi);\n        if (cmpfn(a, i, hi) > 0) swapfn(a, i, hi);\n\n        j = hi - 1;\n        swapfn(a, i, j);\n        i = lo;\n        v = j;\n        while (1)\n        {\n            while(cmpfn(a, ++i, v) < 0) { /* do nothing */ }\n            while(cmpfn(a, --j, v) > 0) { /* do nothing */ }\n            if (j < i)\n                break;\n            swapfn(a, i, j);\n        } /* while */\n        if (i != (hi-1))\n            swapfn(a, i, hi-1);\n        __PHYSFS_quick_sort(a, lo, j, cmpfn, swapfn);\n        __PHYSFS_quick_sort(a, i+1, hi, cmpfn, swapfn);\n    } /* else */\n} /* __PHYSFS_quick_sort */\n\n\nvoid __PHYSFS_sort(void *entries, size_t max,\n                   int (*cmpfn)(void *, size_t, size_t),\n                   void (*swapfn)(void *, size_t, size_t))\n{\n    /*\n     * Quicksort w/ Bubblesort fallback algorithm inspired by code from here:\n     *   https://www.cs.ubc.ca/spider/harrison/Java/sorting-demo.html\n     */\n    if (max > 0)\n        __PHYSFS_quick_sort(entries, 0, max - 1, cmpfn, swapfn);\n} /* __PHYSFS_sort */\n\n\nstatic ErrState *findErrorForCurrentThread(void)\n{\n    ErrState *i;\n    void *tid;\n\n    if (errorLock != NULL)\n        __PHYSFS_platformGrabMutex(errorLock);\n\n    if (errorStates != NULL)\n    {\n        tid = __PHYSFS_platformGetThreadID();\n\n        for (i = errorStates; i != NULL; i = i->next)\n        {\n            if (i->tid == tid)\n            {\n                if (errorLock != NULL)\n                    __PHYSFS_platformReleaseMutex(errorLock);\n                return i;\n            } /* if */\n        } /* for */\n    } /* if */\n\n    if (errorLock != NULL)\n        __PHYSFS_platformReleaseMutex(errorLock);\n\n    return NULL;   /* no error available. */\n} /* findErrorForCurrentThread */\n\n\n/* this doesn't reset the error state. */\nstatic inline PHYSFS_ErrorCode currentErrorCode(void)\n{\n    const ErrState *err = findErrorForCurrentThread();\n    return err ? err->code : PHYSFS_ERR_OK;\n} /* currentErrorCode */\n\n\nPHYSFS_ErrorCode PHYSFS_getLastErrorCode(void)\n{\n    ErrState *err = findErrorForCurrentThread();\n    const PHYSFS_ErrorCode retval = (err) ? err->code : PHYSFS_ERR_OK;\n    if (err)\n        err->code = PHYSFS_ERR_OK;\n    return retval;\n} /* PHYSFS_getLastErrorCode */\n\n\nPHYSFS_DECL const char *PHYSFS_getErrorByCode(PHYSFS_ErrorCode code)\n{\n    switch (code)\n    {\n        case PHYSFS_ERR_OK: return \"no error\";\n        case PHYSFS_ERR_OTHER_ERROR: return \"unknown error\";\n        case PHYSFS_ERR_OUT_OF_MEMORY: return \"out of memory\";\n        case PHYSFS_ERR_NOT_INITIALIZED: return \"not initialized\";\n        case PHYSFS_ERR_IS_INITIALIZED: return \"already initialized\";\n        case PHYSFS_ERR_ARGV0_IS_NULL: return \"argv[0] is NULL\";\n        case PHYSFS_ERR_UNSUPPORTED: return \"unsupported\";\n        case PHYSFS_ERR_PAST_EOF: return \"past end of file\";\n        case PHYSFS_ERR_FILES_STILL_OPEN: return \"files still open\";\n        case PHYSFS_ERR_INVALID_ARGUMENT: return \"invalid argument\";\n        case PHYSFS_ERR_NOT_MOUNTED: return \"not mounted\";\n        case PHYSFS_ERR_NOT_FOUND: return \"not found\";\n        case PHYSFS_ERR_SYMLINK_FORBIDDEN: return \"symlinks are forbidden\";\n        case PHYSFS_ERR_NO_WRITE_DIR: return \"write directory is not set\";\n        case PHYSFS_ERR_OPEN_FOR_READING: return \"file open for reading\";\n        case PHYSFS_ERR_OPEN_FOR_WRITING: return \"file open for writing\";\n        case PHYSFS_ERR_NOT_A_FILE: return \"not a file\";\n        case PHYSFS_ERR_READ_ONLY: return \"read-only filesystem\";\n        case PHYSFS_ERR_CORRUPT: return \"corrupted\";\n        case PHYSFS_ERR_SYMLINK_LOOP: return \"infinite symbolic link loop\";\n        case PHYSFS_ERR_IO: return \"i/o error\";\n        case PHYSFS_ERR_PERMISSION: return \"permission denied\";\n        case PHYSFS_ERR_NO_SPACE: return \"no space available for writing\";\n        case PHYSFS_ERR_BAD_FILENAME: return \"filename is illegal or insecure\";\n        case PHYSFS_ERR_BUSY: return \"tried to modify a file the OS needs\";\n        case PHYSFS_ERR_DIR_NOT_EMPTY: return \"directory isn't empty\";\n        case PHYSFS_ERR_OS_ERROR: return \"OS reported an error\";\n        case PHYSFS_ERR_DUPLICATE: return \"duplicate resource\";\n        case PHYSFS_ERR_BAD_PASSWORD: return \"bad password\";\n        case PHYSFS_ERR_APP_CALLBACK: return \"app callback reported error\";\n    } /* switch */\n\n    return NULL;  /* don't know this error code. */\n} /* PHYSFS_getErrorByCode */\n\n\nvoid PHYSFS_setErrorCode(PHYSFS_ErrorCode errcode)\n{\n    ErrState *err;\n\n    if (!errcode)\n        return;\n\n    err = findErrorForCurrentThread();\n    if (err == NULL)\n    {\n        err = (ErrState *) allocator.Malloc(sizeof (ErrState));\n        if (err == NULL)\n            return;   /* uhh...? */\n\n        memset(err, '\\0', sizeof (ErrState));\n        err->tid = __PHYSFS_platformGetThreadID();\n\n        if (errorLock != NULL)\n            __PHYSFS_platformGrabMutex(errorLock);\n\n        err->next = errorStates;\n        errorStates = err;\n\n        if (errorLock != NULL)\n            __PHYSFS_platformReleaseMutex(errorLock);\n    } /* if */\n\n    err->code = errcode;\n} /* PHYSFS_setErrorCode */\n\n\nconst char *PHYSFS_getLastError(void)\n{\n    const PHYSFS_ErrorCode err = PHYSFS_getLastErrorCode();\n    return (err) ? PHYSFS_getErrorByCode(err) : NULL;\n} /* PHYSFS_getLastError */\n\n\n/* MAKE SURE that errorLock is held before calling this! */\nstatic void freeErrorStates(void)\n{\n    ErrState *i;\n    ErrState *next;\n\n    for (i = errorStates; i != NULL; i = next)\n    {\n        next = i->next;\n        allocator.Free(i);\n    } /* for */\n\n    errorStates = NULL;\n} /* freeErrorStates */\n\n\nvoid PHYSFS_getLinkedVersion(PHYSFS_Version *ver)\n{\n    if (ver != NULL)\n    {\n        ver->major = PHYSFS_VER_MAJOR;\n        ver->minor = PHYSFS_VER_MINOR;\n        ver->patch = PHYSFS_VER_PATCH;\n    } /* if */\n} /* PHYSFS_getLinkedVersion */\n\n\nstatic const char *find_filename_extension(const char *fname)\n{\n    const char *retval = NULL;\n    if (fname != NULL)\n    {\n        const char *p = strchr(fname, '.');\n        retval = p;\n\n        while (p != NULL)\n        {\n            p = strchr(p + 1, '.');\n            if (p != NULL)\n                retval = p;\n        } /* while */\n\n        if (retval != NULL)\n            retval++;  /* skip '.' */\n    } /* if */\n\n    return retval;\n} /* find_filename_extension */\n\n\nstatic DirHandle *tryOpenDir(PHYSFS_Io *io, const PHYSFS_Archiver *funcs,\n                             const char *d, int forWriting, int *_claimed)\n{\n    DirHandle *retval = NULL;\n    void *opaque = NULL;\n\n    if (io != NULL)\n        BAIL_IF_ERRPASS(!io->seek(io, 0), NULL);\n\n    opaque = funcs->openArchive(io, d, forWriting, _claimed);\n    if (opaque != NULL)\n    {\n        retval = (DirHandle *) allocator.Malloc(sizeof (DirHandle));\n        if (retval == NULL)\n            funcs->closeArchive(opaque);\n        else\n        {\n            memset(retval, '\\0', sizeof (DirHandle));\n            retval->mountPoint = NULL;\n            retval->funcs = funcs;\n            retval->opaque = opaque;\n            retval->forWriting = forWriting;\n        } /* else */\n    } /* if */\n\n    return retval;\n} /* tryOpenDir */\n\n\nstatic DirHandle *openDirectory(PHYSFS_Io *io, const char *d, int forWriting)\n{\n    DirHandle *retval = NULL;\n    PHYSFS_Archiver **i;\n    const char *ext;\n    int created_io = 0;\n    int claimed = 0;\n    PHYSFS_ErrorCode errcode;\n\n    assert((io != NULL) || (d != NULL));\n\n    if (io == NULL)\n    {\n        /* file doesn't exist, etc? Just fail out. */\n        PHYSFS_Stat statbuf;\n        BAIL_IF_ERRPASS(!__PHYSFS_platformStat(d, &statbuf, 1), NULL);\n\n        /* DIR gets first shot (unlike the rest, it doesn't deal with files). */\n        if (statbuf.filetype == PHYSFS_FILETYPE_DIRECTORY)\n        {\n            retval = tryOpenDir(io, &__PHYSFS_Archiver_DIR, d, forWriting, &claimed);\n            if (retval || claimed)\n                return retval;\n        } /* if */\n\n        io = __PHYSFS_createNativeIo(d, forWriting ? 'w' : 'r');\n        BAIL_IF_ERRPASS(!io, NULL);\n        created_io = 1;\n    } /* if */\n\n    ext = find_filename_extension(d);\n    if (ext != NULL)\n    {\n        /* Look for archivers with matching file extensions first... */\n        for (i = archivers; (*i != NULL) && (retval == NULL) && !claimed; i++)\n        {\n            if (PHYSFS_utf8stricmp(ext, (*i)->info.extension) == 0)\n                retval = tryOpenDir(io, *i, d, forWriting, &claimed);\n        } /* for */\n\n        /* failing an exact file extension match, try all the others... */\n        for (i = archivers; (*i != NULL) && (retval == NULL) && !claimed; i++)\n        {\n            if (PHYSFS_utf8stricmp(ext, (*i)->info.extension) != 0)\n                retval = tryOpenDir(io, *i, d, forWriting, &claimed);\n        } /* for */\n    } /* if */\n\n    else  /* no extension? Try them all. */\n    {\n        for (i = archivers; (*i != NULL) && (retval == NULL) && !claimed; i++)\n            retval = tryOpenDir(io, *i, d, forWriting, &claimed);\n    } /* else */\n\n    errcode = claimed ? currentErrorCode() : PHYSFS_ERR_UNSUPPORTED;\n\n    if ((!retval) && (created_io))\n        io->destroy(io);\n\n    BAIL_IF(!retval, errcode, NULL);\n    return retval;\n} /* openDirectory */\n\n\n/*\n * Make a platform-independent path string sane. Doesn't actually check the\n *  file hierarchy, it just cleans up the string.\n *  (dst) must be a buffer at least as big as (src), as this is where the\n *  cleaned up string is deposited.\n * If there are illegal bits in the path (\"..\" entries, etc) then we\n *  return zero and (dst) is undefined. Non-zero if the path was sanitized.\n */\nstatic int sanitizePlatformIndependentPath(const char *src, char *dst)\n{\n    char *prev;\n    char ch;\n\n    while (*src == '/')  /* skip initial '/' chars... */\n        src++;\n\n    /* Make sure the entire string isn't \".\" or \"..\" */\n    if ((strcmp(src, \".\") == 0) || (strcmp(src, \"..\") == 0))\n        BAIL(PHYSFS_ERR_BAD_FILENAME, 0);\n\n    prev = dst;\n    do\n    {\n        ch = *(src++);\n\n        if ((ch == ':') || (ch == '\\\\'))  /* illegal chars in a physfs path. */\n            BAIL(PHYSFS_ERR_BAD_FILENAME, 0);\n\n        if (ch == '/')   /* path separator. */\n        {\n            *dst = '\\0';  /* \".\" and \"..\" are illegal pathnames. */\n            if ((strcmp(prev, \".\") == 0) || (strcmp(prev, \"..\") == 0))\n                BAIL(PHYSFS_ERR_BAD_FILENAME, 0);\n\n            while (*src == '/')   /* chop out doubles... */\n                src++;\n\n            if (*src == '\\0') /* ends with a pathsep? */\n                break;  /* we're done, don't add final pathsep to dst. */\n\n            prev = dst + 1;\n        } /* if */\n\n        *(dst++) = ch;\n    } while (ch != '\\0');\n\n    return 1;\n} /* sanitizePlatformIndependentPath */\n\n\nstatic inline size_t dirHandleRootLen(const DirHandle *h)\n{\n    return h ? h->rootlen : 0;\n} /* dirHandleRootLen */\n\nstatic inline int sanitizePlatformIndependentPathWithRoot(const DirHandle *h, const char *src, char *dst)\n{\n    return sanitizePlatformIndependentPath(src, dst + dirHandleRootLen(h));\n} /* sanitizePlatformIndependentPathWithRoot */\n\n\n\n/*\n * Figure out if (fname) is part of (h)'s mountpoint. (fname) must be an\n *  output from sanitizePlatformIndependentPath(), so that it is in a known\n *  state.\n *\n * This only finds legitimate segments of a mountpoint. If the mountpoint is\n *  \"/a/b/c\" and (fname) is \"/a/b/c\", \"/\", or \"/a/b/c/d\", then the results are\n *  all zero. \"/a/b\" will succeed, though.\n */\nstatic int partOfMountPoint(DirHandle *h, char *fname)\n{\n    int rc;\n    size_t len, mntpntlen;\n\n    if (h->mountPoint == NULL)\n        return 0;\n    else if (*fname == '\\0')\n        return 1;\n\n    len = strlen(fname);\n    mntpntlen = strlen(h->mountPoint);\n    if (len > mntpntlen)  /* can't be a subset of mountpoint. */\n        return 0;\n\n    /* if true, must be not a match or a complete match, but not a subset. */\n    if ((len + 1) == mntpntlen)\n        return 0;\n\n    rc = strncmp(fname, h->mountPoint, len); /* !!! FIXME: case insensitive? */\n    if (rc != 0)\n        return 0;  /* not a match. */\n\n    /* make sure /a/b matches /a/b/ and not /a/bc ... */\n    return h->mountPoint[len] == '/';\n} /* partOfMountPoint */\n\n\nstatic DirHandle *createDirHandle(PHYSFS_Io *io, const char *newDir,\n                                  const char *mountPoint, int forWriting)\n{\n    DirHandle *dirHandle = NULL;\n    char *tmpmntpnt = NULL;\n\n    assert(newDir != NULL);  /* should have caught this higher up. */\n\n    if (mountPoint != NULL)\n    {\n        const size_t len = strlen(mountPoint) + 1;\n        tmpmntpnt = (char *) __PHYSFS_smallAlloc(len);\n        GOTO_IF(!tmpmntpnt, PHYSFS_ERR_OUT_OF_MEMORY, badDirHandle);\n        if (!sanitizePlatformIndependentPath(mountPoint, tmpmntpnt))\n            goto badDirHandle;\n        mountPoint = tmpmntpnt;  /* sanitized version. */\n    } /* if */\n\n    dirHandle = openDirectory(io, newDir, forWriting);\n    GOTO_IF_ERRPASS(!dirHandle, badDirHandle);\n\n    dirHandle->dirName = (char *) allocator.Malloc(strlen(newDir) + 1);\n    GOTO_IF(!dirHandle->dirName, PHYSFS_ERR_OUT_OF_MEMORY, badDirHandle);\n    strcpy(dirHandle->dirName, newDir);\n\n    if ((mountPoint != NULL) && (*mountPoint != '\\0'))\n    {\n        dirHandle->mountPoint = (char *)allocator.Malloc(strlen(mountPoint)+2);\n        if (!dirHandle->mountPoint)\n            GOTO(PHYSFS_ERR_OUT_OF_MEMORY, badDirHandle);\n        strcpy(dirHandle->mountPoint, mountPoint);\n        strcat(dirHandle->mountPoint, \"/\");\n    } /* if */\n\n    __PHYSFS_smallFree(tmpmntpnt);\n    return dirHandle;\n\nbadDirHandle:\n    if (dirHandle != NULL)\n    {\n        dirHandle->funcs->closeArchive(dirHandle->opaque);\n        allocator.Free(dirHandle->dirName);\n        allocator.Free(dirHandle->mountPoint);\n        allocator.Free(dirHandle);\n    } /* if */\n\n    __PHYSFS_smallFree(tmpmntpnt);\n    return NULL;\n} /* createDirHandle */\n\n\n/* MAKE SURE you've got the stateLock held before calling this! */\nstatic int freeDirHandle(DirHandle *dh, FileHandle *openList)\n{\n    FileHandle *i;\n\n    if (dh == NULL)\n        return 1;\n\n    for (i = openList; i != NULL; i = i->next)\n        BAIL_IF(i->dirHandle == dh, PHYSFS_ERR_FILES_STILL_OPEN, 0);\n\n    dh->funcs->closeArchive(dh->opaque);\n\n    if (dh->root) allocator.Free(dh->root);\n    allocator.Free(dh->dirName);\n    allocator.Free(dh->mountPoint);\n    allocator.Free(dh);\n    return 1;\n} /* freeDirHandle */\n\n\nstatic int dirHandleFilesOpen(DirHandle *dh, FileHandle *openList)\n{\n    FileHandle *i;\n\n    if (dh == NULL)\n        return 0;\n\n    for (i = openList; i != NULL; i = i->next)\n    {\n        if (i->dirHandle == dh)\n            return 1;\n    }\n\n    return 0;\n} /* dirHandleFilesOpen */\n\n\nstatic char *calculateBaseDir(const char *argv0)\n{\n    const char dirsep = __PHYSFS_platformDirSeparator;\n    char *retval = NULL;\n    char *ptr = NULL;\n\n    /* Give the platform layer first shot at this. */\n    retval = __PHYSFS_platformCalcBaseDir(argv0);\n    if (retval != NULL)\n        return retval;\n\n    /* We need argv0 to go on. */\n    BAIL_IF(argv0 == NULL, PHYSFS_ERR_ARGV0_IS_NULL, NULL);\n\n    ptr = strrchr(argv0, dirsep);\n    if (ptr != NULL)\n    {\n        const size_t size = ((size_t) (ptr - argv0)) + 1;\n        retval = (char *) allocator.Malloc(size + 1);\n        BAIL_IF(!retval, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n        memcpy(retval, argv0, size);\n        retval[size] = '\\0';\n        return retval;\n    } /* if */\n\n    /* argv0 wasn't helpful. */\n    BAIL(PHYSFS_ERR_INVALID_ARGUMENT, NULL);\n} /* calculateBaseDir */\n\n\nstatic int initializeMutexes(void)\n{\n    errorLock = __PHYSFS_platformCreateMutex();\n    if (errorLock == NULL)\n        goto initializeMutexes_failed;\n\n    stateLock = __PHYSFS_platformCreateMutex();\n    if (stateLock == NULL)\n        goto initializeMutexes_failed;\n\n    return 1;  /* success. */\n\ninitializeMutexes_failed:\n    if (errorLock != NULL)\n        __PHYSFS_platformDestroyMutex(errorLock);\n\n    if (stateLock != NULL)\n        __PHYSFS_platformDestroyMutex(stateLock);\n\n    errorLock = stateLock = NULL;\n    return 0;  /* failed. */\n} /* initializeMutexes */\n\n\nstatic int doRegisterArchiver(const PHYSFS_Archiver *_archiver);\n\nstatic int initStaticArchivers(void)\n{\n    #define REGISTER_STATIC_ARCHIVER(arc) { \\\n        if (!doRegisterArchiver(&__PHYSFS_Archiver_##arc)) { \\\n            return 0; \\\n        } \\\n    }\n\n    #if PHYSFS_SUPPORTS_ZIP\n        REGISTER_STATIC_ARCHIVER(ZIP);\n    #endif\n    #if PHYSFS_SUPPORTS_7Z\n        SZIP_global_init();\n        REGISTER_STATIC_ARCHIVER(7Z);\n    #endif\n    #if PHYSFS_SUPPORTS_GRP\n        REGISTER_STATIC_ARCHIVER(GRP);\n    #endif\n    #if PHYSFS_SUPPORTS_QPAK\n        REGISTER_STATIC_ARCHIVER(QPAK);\n    #endif\n    #if PHYSFS_SUPPORTS_HOG\n        REGISTER_STATIC_ARCHIVER(HOG);\n    #endif\n    #if PHYSFS_SUPPORTS_MVL\n        REGISTER_STATIC_ARCHIVER(MVL);\n    #endif\n    #if PHYSFS_SUPPORTS_WAD\n        REGISTER_STATIC_ARCHIVER(WAD);\n    #endif\n    #if PHYSFS_SUPPORTS_SLB\n        REGISTER_STATIC_ARCHIVER(SLB);\n    #endif\n    #if PHYSFS_SUPPORTS_ISO9660\n        REGISTER_STATIC_ARCHIVER(ISO9660);\n    #endif\n    #if PHYSFS_SUPPORTS_VDF\n        REGISTER_STATIC_ARCHIVER(VDF)\n    #endif\n\n    #undef REGISTER_STATIC_ARCHIVER\n\n    return 1;\n} /* initStaticArchivers */\n\n\nstatic void setDefaultAllocator(void);\nstatic int doDeinit(void);\n\nint PHYSFS_init(const char *argv0)\n{\n    BAIL_IF(initialized, PHYSFS_ERR_IS_INITIALIZED, 0);\n\n    if (!externalAllocator)\n        setDefaultAllocator();\n\n    if ((allocator.Init != NULL) && (!allocator.Init())) return 0;\n\n    if (!__PHYSFS_platformInit())\n    {\n        if (allocator.Deinit != NULL) allocator.Deinit();\n        return 0;\n    } /* if */\n\n    /* everything below here can be cleaned up safely by doDeinit(). */\n\n    if (!initializeMutexes()) goto initFailed;\n\n    baseDir = calculateBaseDir(argv0);\n    if (!baseDir) goto initFailed;\n\n    userDir = __PHYSFS_platformCalcUserDir();\n    if (!userDir) goto initFailed;\n\n    /* Platform layer is required to append a dirsep. */\n    #ifndef __ANDROID__  /* it's an APK file, not a directory, on Android. */\n    assert(baseDir[strlen(baseDir) - 1] == __PHYSFS_platformDirSeparator);\n    #endif\n    assert(userDir[strlen(userDir) - 1] == __PHYSFS_platformDirSeparator);\n\n    if (!initStaticArchivers()) goto initFailed;\n\n    initialized = 1;\n\n    /* This makes sure that the error subsystem is initialized. */\n    PHYSFS_setErrorCode(PHYSFS_getLastErrorCode());\n\n    return 1;\n\ninitFailed:\n    doDeinit();\n    return 0;\n} /* PHYSFS_init */\n\n\n/* MAKE SURE you hold stateLock before calling this! */\nstatic int closeFileHandleList(FileHandle **list)\n{\n    FileHandle *i;\n    FileHandle *next = NULL;\n\n    for (i = *list; i != NULL; i = next)\n    {\n        PHYSFS_Io *io = i->io;\n        next = i->next;\n\n        if (io->flush && !io->flush(io))\n        {\n            *list = i;\n            return 0;\n        } /* if */\n\n        io->destroy(io);\n        allocator.Free(i);\n    } /* for */\n\n    *list = NULL;\n    return 1;\n} /* closeFileHandleList */\n\n\n/* MAKE SURE you hold the stateLock before calling this! */\nstatic void freeSearchPath(void)\n{\n    DirHandle *i;\n    DirHandle *next = NULL;\n\n    closeFileHandleList(&openReadList);\n\n    if (searchPath != NULL)\n    {\n        for (i = searchPath; i != NULL; i = next)\n        {\n            next = i->next;\n            freeDirHandle(i, openReadList);\n        } /* for */\n        searchPath = NULL;\n    } /* if */\n} /* freeSearchPath */\n\n\n/* MAKE SURE you hold stateLock before calling this! */\nstatic int archiverInUse(const PHYSFS_Archiver *arc, const DirHandle *list)\n{\n    const DirHandle *i;\n    for (i = list; i != NULL; i = i->next)\n    {\n        if (i->funcs == arc)\n            return 1;\n    } /* for */\n\n    return 0;  /* not in use */\n} /* archiverInUse */\n\n\n/* MAKE SURE you hold stateLock before calling this! */\nstatic int doDeregisterArchiver(const size_t idx)\n{\n    const size_t len = (numArchivers - idx) * sizeof (void *);\n    PHYSFS_ArchiveInfo *info = archiveInfo[idx];\n    PHYSFS_Archiver *arc = archivers[idx];\n\n    /* make sure nothing is still using this archiver */\n    if (archiverInUse(arc, searchPath) || archiverInUse(arc, writeDir))\n        BAIL(PHYSFS_ERR_FILES_STILL_OPEN, 0);\n\n    allocator.Free((void *) info->extension);\n    allocator.Free((void *) info->description);\n    allocator.Free((void *) info->author);\n    allocator.Free((void *) info->url);\n    allocator.Free((void *) arc);\n\n    memmove(&archiveInfo[idx], &archiveInfo[idx+1], len);\n    memmove(&archivers[idx], &archivers[idx+1], len);\n\n    assert(numArchivers > 0);\n    numArchivers--;\n\n    return 1;\n} /* doDeregisterArchiver */\n\n\n/* Does NOT hold the state lock; we're shutting down. */\nstatic void freeArchivers(void)\n{\n    while (numArchivers > 0)\n    {\n        if (!doDeregisterArchiver(numArchivers - 1))\n            assert(!\"nothing should be mounted during shutdown.\");\n    } /* while */\n\n    allocator.Free(archivers);\n    allocator.Free(archiveInfo);\n    archivers = NULL;\n    archiveInfo = NULL;\n} /* freeArchivers */\n\n\nstatic int doDeinit(void)\n{\n    closeFileHandleList(&openWriteList);\n    BAIL_IF(!PHYSFS_setWriteDir(NULL), PHYSFS_ERR_FILES_STILL_OPEN, 0);\n\n    freeSearchPath();\n    freeArchivers();\n    freeErrorStates();\n\n    if (baseDir != NULL)\n    {\n        allocator.Free(baseDir);\n        baseDir = NULL;\n    } /* if */\n\n    if (userDir != NULL)\n    {\n        allocator.Free(userDir);\n        userDir = NULL;\n    } /* if */\n\n    if (prefDir != NULL)\n    {\n        allocator.Free(prefDir);\n        prefDir = NULL;\n    } /* if */\n\n    if (archiveInfo != NULL)\n    {\n        allocator.Free(archiveInfo);\n        archiveInfo = NULL;\n    } /* if */\n\n    if (archivers != NULL)\n    {\n        allocator.Free(archivers);\n        archivers = NULL;\n    } /* if */\n\n    longest_root = 0;\n    allowSymLinks = 0;\n    initialized = 0;\n\n    if (errorLock) __PHYSFS_platformDestroyMutex(errorLock);\n    if (stateLock) __PHYSFS_platformDestroyMutex(stateLock);\n\n    if (allocator.Deinit != NULL)\n        allocator.Deinit();\n\n    errorLock = stateLock = NULL;\n\n    __PHYSFS_platformDeinit();\n\n    return 1;\n} /* doDeinit */\n\n\nint PHYSFS_deinit(void)\n{\n    BAIL_IF(!initialized, PHYSFS_ERR_NOT_INITIALIZED, 0);\n    return doDeinit();\n} /* PHYSFS_deinit */\n\n\nint PHYSFS_isInit(void)\n{\n    return initialized;\n} /* PHYSFS_isInit */\n\n\nchar *__PHYSFS_strdup(const char *str)\n{\n    char *retval = (char *) allocator.Malloc(strlen(str) + 1);\n    if (retval)\n        strcpy(retval, str);\n    return retval;\n} /* __PHYSFS_strdup */\n\n\nPHYSFS_uint32 __PHYSFS_hashString(const char *str)\n{\n    PHYSFS_uint32 hash = 5381;\n    while (1)\n    {\n        const char ch = *(str++);\n        if (ch == 0)\n            break;\n        hash = ((hash << 5) + hash) ^ ch;\n    } /* while */\n    return hash;\n} /* __PHYSFS_hashString */\n\n\nPHYSFS_uint32 __PHYSFS_hashStringCaseFold(const char *str)\n{\n    PHYSFS_uint32 hash = 5381;\n    while (1)\n    {\n        const PHYSFS_uint32 cp = __PHYSFS_utf8codepoint(&str);\n        if (cp == 0)\n            break;\n        else\n        {\n            PHYSFS_uint32 folded[3];\n            const int numbytes = (int) (PHYSFS_caseFold(cp, folded) * sizeof (PHYSFS_uint32));\n            const char *bytes = (const char *) folded;\n            int i;\n            for (i = 0; i < numbytes; i++)\n                hash = ((hash << 5) + hash) ^ *(bytes++);\n        } /* else */\n    } /* while */\n\n    return hash;\n} /* __PHYSFS_hashStringCaseFold */\n\n\nPHYSFS_uint32 __PHYSFS_hashStringCaseFoldUSAscii(const char *str)\n{\n    PHYSFS_uint32 hash = 5381;\n    while (1)\n    {\n        char ch = *(str++);\n        if (ch == 0)\n            break;\n        else if ((ch >= 'A') && (ch <= 'Z'))\n            ch -= ('A' - 'a');\n\n        hash = ((hash << 5) + hash) ^ ch;\n    } /* while */\n    return hash;\n} /* __PHYSFS_hashStringCaseFoldUSAscii */\n\n\n/* MAKE SURE you hold stateLock before calling this! */\nstatic int doRegisterArchiver(const PHYSFS_Archiver *_archiver)\n{\n    const PHYSFS_uint32 maxver = CURRENT_PHYSFS_ARCHIVER_API_VERSION;\n    const size_t len = (numArchivers + 2) * sizeof (void *);\n    PHYSFS_Archiver *archiver = NULL;\n    PHYSFS_ArchiveInfo *info = NULL;\n    const char *ext = NULL;\n    void *ptr = NULL;\n    size_t i;\n\n    BAIL_IF(!_archiver, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n    BAIL_IF(_archiver->version > maxver, PHYSFS_ERR_UNSUPPORTED, 0);\n    BAIL_IF(!_archiver->info.extension, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n    BAIL_IF(!_archiver->info.description, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n    BAIL_IF(!_archiver->info.author, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n    BAIL_IF(!_archiver->info.url, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n    BAIL_IF(!_archiver->openArchive, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n    BAIL_IF(!_archiver->enumerate, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n    BAIL_IF(!_archiver->openRead, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n    BAIL_IF(!_archiver->openWrite, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n    BAIL_IF(!_archiver->openAppend, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n    BAIL_IF(!_archiver->remove, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n    BAIL_IF(!_archiver->mkdir, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n    BAIL_IF(!_archiver->closeArchive, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n    BAIL_IF(!_archiver->stat, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n\n    ext = _archiver->info.extension;\n    for (i = 0; i < numArchivers; i++)\n    {\n        if (PHYSFS_utf8stricmp(archiveInfo[i]->extension, ext) == 0)\n            BAIL(PHYSFS_ERR_DUPLICATE, 0);\n    } /* for */\n\n    /* make a copy of the data. */\n    archiver = (PHYSFS_Archiver *) allocator.Malloc(sizeof (*archiver));\n    GOTO_IF(!archiver, PHYSFS_ERR_OUT_OF_MEMORY, regfailed);\n\n    /* Must copy sizeof (OLD_VERSION_OF_STRUCT) when version changes! */\n    memcpy(archiver, _archiver, sizeof (*archiver));\n\n    info = (PHYSFS_ArchiveInfo *) &archiver->info;\n    memset(info, '\\0', sizeof (*info));  /* NULL in case an alloc fails. */\n    #define CPYSTR(item) \\\n        info->item = __PHYSFS_strdup(_archiver->info.item); \\\n        GOTO_IF(!info->item, PHYSFS_ERR_OUT_OF_MEMORY, regfailed);\n    CPYSTR(extension);\n    CPYSTR(description);\n    CPYSTR(author);\n    CPYSTR(url);\n    info->supportsSymlinks = _archiver->info.supportsSymlinks;\n    #undef CPYSTR\n\n    ptr = allocator.Realloc(archiveInfo, len);\n    GOTO_IF(!ptr, PHYSFS_ERR_OUT_OF_MEMORY, regfailed);\n    archiveInfo = (PHYSFS_ArchiveInfo **) ptr;\n\n    ptr = allocator.Realloc(archivers, len);\n    GOTO_IF(!ptr, PHYSFS_ERR_OUT_OF_MEMORY, regfailed);\n    archivers = (PHYSFS_Archiver **) ptr;\n\n    archiveInfo[numArchivers] = info;\n    archiveInfo[numArchivers + 1] = NULL;\n\n    archivers[numArchivers] = archiver;\n    archivers[numArchivers + 1] = NULL;\n\n    numArchivers++;\n\n    return 1;\n\nregfailed:\n    if (info != NULL)\n    {\n        allocator.Free((void *) info->extension);\n        allocator.Free((void *) info->description);\n        allocator.Free((void *) info->author);\n        allocator.Free((void *) info->url);\n    } /* if */\n    allocator.Free(archiver);\n\n    return 0;\n} /* doRegisterArchiver */\n\n\nint PHYSFS_registerArchiver(const PHYSFS_Archiver *archiver)\n{\n    int retval;\n    BAIL_IF(!initialized, PHYSFS_ERR_NOT_INITIALIZED, 0);\n    __PHYSFS_platformGrabMutex(stateLock);\n    retval = doRegisterArchiver(archiver);\n    __PHYSFS_platformReleaseMutex(stateLock);\n    return retval;\n} /* PHYSFS_registerArchiver */\n\n\nint PHYSFS_deregisterArchiver(const char *ext)\n{\n    size_t i;\n\n    BAIL_IF(!initialized, PHYSFS_ERR_NOT_INITIALIZED, 0);\n    BAIL_IF(!ext, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n\n    __PHYSFS_platformGrabMutex(stateLock);\n    for (i = 0; i < numArchivers; i++)\n    {\n        if (PHYSFS_utf8stricmp(archiveInfo[i]->extension, ext) == 0)\n        {\n            const int retval = doDeregisterArchiver(i);\n            __PHYSFS_platformReleaseMutex(stateLock);\n            return retval;\n        } /* if */\n    } /* for */\n    __PHYSFS_platformReleaseMutex(stateLock);\n\n    BAIL(PHYSFS_ERR_NOT_FOUND, 0);\n} /* PHYSFS_deregisterArchiver */\n\n\nconst PHYSFS_ArchiveInfo **PHYSFS_supportedArchiveTypes(void)\n{\n    BAIL_IF(!initialized, PHYSFS_ERR_NOT_INITIALIZED, NULL);\n    return (const PHYSFS_ArchiveInfo **) archiveInfo;\n} /* PHYSFS_supportedArchiveTypes */\n\n\nvoid PHYSFS_freeList(void *list)\n{\n    void **i;\n    if (list != NULL)\n    {\n        for (i = (void **) list; *i != NULL; i++)\n            allocator.Free(*i);\n\n        allocator.Free(list);\n    } /* if */\n} /* PHYSFS_freeList */\n\n\nconst char *PHYSFS_getDirSeparator(void)\n{\n    static char retval[2] = { __PHYSFS_platformDirSeparator, '\\0' };\n    return retval;\n} /* PHYSFS_getDirSeparator */\n\n\nchar **PHYSFS_getCdRomDirs(void)\n{\n    return doEnumStringList(__PHYSFS_platformDetectAvailableCDs);\n} /* PHYSFS_getCdRomDirs */\n\n\nvoid PHYSFS_getCdRomDirsCallback(PHYSFS_StringCallback callback, void *data)\n{\n    __PHYSFS_platformDetectAvailableCDs(callback, data);\n} /* PHYSFS_getCdRomDirsCallback */\n\n\nconst char *PHYSFS_getPrefDir(const char *org, const char *app)\n{\n    const char dirsep = __PHYSFS_platformDirSeparator;\n    PHYSFS_Stat statbuf;\n    char *ptr = NULL;\n    char *endstr = NULL;\n\n    BAIL_IF(!initialized, PHYSFS_ERR_NOT_INITIALIZED, 0);\n    BAIL_IF(!org, PHYSFS_ERR_INVALID_ARGUMENT, NULL);\n    BAIL_IF(*org == '\\0', PHYSFS_ERR_INVALID_ARGUMENT, NULL);\n    BAIL_IF(!app, PHYSFS_ERR_INVALID_ARGUMENT, NULL);\n    BAIL_IF(*app == '\\0', PHYSFS_ERR_INVALID_ARGUMENT, NULL);\n\n    allocator.Free(prefDir);\n    prefDir = __PHYSFS_platformCalcPrefDir(org, app);\n    BAIL_IF_ERRPASS(!prefDir, NULL);\n\n    assert(strlen(prefDir) > 0);\n    endstr = prefDir + (strlen(prefDir) - 1);\n    assert(*endstr == dirsep);\n    *endstr = '\\0';  /* mask out the final dirsep for now. */\n\n    if (!__PHYSFS_platformStat(prefDir, &statbuf, 1))\n    {\n        for (ptr = strchr(prefDir, dirsep); ptr; ptr = strchr(ptr+1, dirsep))\n        {\n            *ptr = '\\0';\n            __PHYSFS_platformMkDir(prefDir);\n            *ptr = dirsep;\n        } /* for */\n\n        if (!__PHYSFS_platformMkDir(prefDir))\n        {\n            allocator.Free(prefDir);\n            prefDir = NULL;\n        } /* if */\n    } /* if */\n\n    *endstr = dirsep;  /* readd the final dirsep. */\n\n    return prefDir;\n} /* PHYSFS_getPrefDir */\n\n\nconst char *PHYSFS_getBaseDir(void)\n{\n    return baseDir;   /* this is calculated in PHYSFS_init()... */\n} /* PHYSFS_getBaseDir */\n\n\nconst char *__PHYSFS_getUserDir(void)  /* not deprecated internal version. */\n{\n    return userDir;   /* this is calculated in PHYSFS_init()... */\n} /* __PHYSFS_getUserDir */\n\n\nconst char *PHYSFS_getUserDir(void)\n{\n    return __PHYSFS_getUserDir();\n} /* PHYSFS_getUserDir */\n\n\nconst char *PHYSFS_getWriteDir(void)\n{\n    const char *retval = NULL;\n\n    __PHYSFS_platformGrabMutex(stateLock);\n    if (writeDir != NULL)\n        retval = writeDir->dirName;\n    __PHYSFS_platformReleaseMutex(stateLock);\n\n    return retval;\n} /* PHYSFS_getWriteDir */\n\n\nint PHYSFS_setWriteDir(const char *newDir)\n{\n    int retval = 1;\n\n    __PHYSFS_platformGrabMutex(stateLock);\n\n    if (writeDir != NULL)\n    {\n        BAIL_IF_MUTEX_ERRPASS(!freeDirHandle(writeDir, openWriteList),\n                            stateLock, 0);\n        writeDir = NULL;\n    } /* if */\n\n    if (newDir != NULL)\n    {\n        writeDir = createDirHandle(NULL, newDir, NULL, 1);\n        retval = (writeDir != NULL);\n    } /* if */\n\n    __PHYSFS_platformReleaseMutex(stateLock);\n\n    return retval;\n} /* PHYSFS_setWriteDir */\n\n\nint PHYSFS_setRoot(const char *archive, const char *subdir)\n{\n    DirHandle *i;\n\n    BAIL_IF(!archive, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n\n    __PHYSFS_platformGrabMutex(stateLock);\n\n    for (i = searchPath; i != NULL; i = i->next)\n    {\n        if ((i->dirName != NULL) && (strcmp(archive, i->dirName) == 0))\n        {\n            if (!subdir || (strcmp(subdir, \"/\") == 0))\n            {\n                if (i->root)\n                    allocator.Free(i->root);\n                i->root = NULL;\n                i->rootlen = 0;\n            } /* if */\n            else\n            {\n                const size_t len = strlen(subdir) + 1;\n                char *ptr = (char *) allocator.Malloc(len);\n                BAIL_IF_MUTEX(!ptr, PHYSFS_ERR_OUT_OF_MEMORY, stateLock, 0);\n                if (!sanitizePlatformIndependentPath(subdir, ptr))\n                {\n                    allocator.Free(ptr);\n                    BAIL_MUTEX_ERRPASS(stateLock, 0);\n                } /* if */\n\n                if (i->root)\n                    allocator.Free(i->root);\n                i->root = ptr;\n                i->rootlen = strlen(i->root);  /* in case sanitizePlatformIndependentPath changed subdir */\n\n                if (longest_root < i->rootlen)\n                    longest_root = i->rootlen;\n            } /* else */\n\n            break;\n        } /* if */\n    } /* for */\n\n    __PHYSFS_platformReleaseMutex(stateLock);\n    return 1;\n} /* PHYSFS_setRoot */\n\n\nstatic int doMount(PHYSFS_Io *io, const char *fname,\n                   const char *mountPoint, int appendToPath, int forWriting)\n{\n    DirHandle *dh;\n    DirHandle *prev = NULL;\n    DirHandle *i;\n\n    BAIL_IF(!fname, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n\n    if (mountPoint == NULL)\n        mountPoint = \"/\";\n\n    __PHYSFS_platformGrabMutex(stateLock);\n\n    for (i = searchPath; i != NULL; i = i->next)\n    {\n        /* already in search path? */\n        if ((i->dirName != NULL) && (strcmp(fname, i->dirName) == 0))\n            BAIL_MUTEX_ERRPASS(stateLock, 1);\n        prev = i;\n    } /* for */\n\n    dh = createDirHandle(io, fname, mountPoint, forWriting);\n    BAIL_IF_MUTEX_ERRPASS(!dh, stateLock, 0);\n\n    if (appendToPath)\n    {\n        if (prev == NULL)\n            searchPath = dh;\n        else\n            prev->next = dh;\n    } /* if */\n    else\n    {\n        dh->next = searchPath;\n        searchPath = dh;\n    } /* else */\n\n    __PHYSFS_platformReleaseMutex(stateLock);\n    return 1;\n} /* doMount */\n\n\nint PHYSFS_mountIo(PHYSFS_Io *io, const char *fname,\n                   const char *mountPoint, int appendToPath)\n{\n    BAIL_IF(!io, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n    BAIL_IF(!fname, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n    BAIL_IF(io->version != 0, PHYSFS_ERR_UNSUPPORTED, 0);\n    return doMount(io, fname, mountPoint, appendToPath, 0);\n} /* PHYSFS_mountIo */\n\n\nint PHYSFS_mountMemory(const void *buf, PHYSFS_uint64 len, void (*del)(void *),\n                       const char *fname, const char *mountPoint,\n                       int appendToPath)\n{\n    int retval = 0;\n    PHYSFS_Io *io = NULL;\n\n    BAIL_IF(!buf, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n    BAIL_IF(!fname, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n\n    io = __PHYSFS_createMemoryIo(buf, len, del);\n    BAIL_IF_ERRPASS(!io, 0);\n    retval = doMount(io, fname, mountPoint, appendToPath, 0);\n    if (!retval)\n    {\n        /* docs say not to call (del) in case of failure, so cheat. */\n        MemoryIoInfo *info = (MemoryIoInfo *) io->opaque;\n        info->destruct = NULL;\n        io->destroy(io);\n    } /* if */\n\n    return retval;\n} /* PHYSFS_mountMemory */\n\n\nint PHYSFS_mountHandle(PHYSFS_File *file, const char *fname,\n                       const char *mountPoint, int appendToPath)\n{\n    int retval = 0;\n    PHYSFS_Io *io = NULL;\n\n    BAIL_IF(!file, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n    BAIL_IF(!fname, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n\n    io = __PHYSFS_createHandleIo(file);\n    BAIL_IF_ERRPASS(!io, 0);\n    retval = doMount(io, fname, mountPoint, appendToPath, 0);\n    if (!retval)\n    {\n        /* docs say not to destruct in case of failure, so cheat. */\n        io->opaque = NULL;\n        io->destroy(io);\n    } /* if */\n\n    return retval;\n} /* PHYSFS_mountHandle */\n\n\nint PHYSFS_mount(const char *newDir, const char *mountPoint, int appendToPath)\n{\n    BAIL_IF(!newDir, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n    return doMount(NULL, newDir, mountPoint, appendToPath, 0);\n} /* PHYSFS_mount */\n\n\nint PHYSFS_mountRW(const char *newDir, const char *mountPoint, int appendToPath)\n{\n    BAIL_IF(!newDir, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n    return doMount(NULL, newDir, mountPoint, appendToPath, 1);\n} /* PHYSFS_mount */\n\n\nint PHYSFS_addToSearchPath(const char *newDir, int appendToPath)\n{\n    return PHYSFS_mount(newDir, NULL, appendToPath);\n} /* PHYSFS_addToSearchPath */\n\n\nint PHYSFS_removeFromSearchPath(const char *oldDir)\n{\n    return PHYSFS_unmount(oldDir);\n} /* PHYSFS_removeFromSearchPath */\n\n\nint PHYSFS_unmount(const char *oldDir)\n{\n    DirHandle *i;\n    DirHandle *prev = NULL;\n    DirHandle *next = NULL;\n\n    BAIL_IF(oldDir == NULL, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n\n    __PHYSFS_platformGrabMutex(stateLock);\n    for (i = searchPath; i != NULL; i = i->next)\n    {\n        if (strcmp(i->dirName, oldDir) == 0)\n        {\n            next = i->next;\n            if (i->forWriting && dirHandleFilesOpen(i, openWriteList))\n                BAIL_MUTEX(PHYSFS_ERR_FILES_STILL_OPEN, stateLock, 0);\n            BAIL_IF_MUTEX_ERRPASS(!freeDirHandle(i, openReadList),\n                                stateLock, 0);\n\n            if (prev == NULL)\n                searchPath = next;\n            else\n                prev->next = next;\n\n            BAIL_MUTEX_ERRPASS(stateLock, 1);\n        } /* if */\n        prev = i;\n    } /* for */\n\n    BAIL_MUTEX(PHYSFS_ERR_NOT_MOUNTED, stateLock, 0);\n} /* PHYSFS_unmount */\n\n\nint PHYSFS_canUnmount(const char *oldDir)\n{\n    DirHandle *i;\n\n    BAIL_IF(oldDir == NULL, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n\n    __PHYSFS_platformGrabMutex(stateLock);\n    for (i = searchPath; i != NULL; i = i->next)\n    {\n        if (strcmp(i->dirName, oldDir) == 0)\n        {\n            if (i->forWriting && dirHandleFilesOpen(i, openWriteList))\n                BAIL_MUTEX(PHYSFS_ERR_OK, stateLock, 0);\n            if (dirHandleFilesOpen(i, openReadList))\n                BAIL_MUTEX(PHYSFS_ERR_OK, stateLock, 0);\n            BAIL_MUTEX(PHYSFS_ERR_OK, stateLock, 1);\n        }\n    }\n\n    BAIL_MUTEX(PHYSFS_ERR_NOT_MOUNTED, stateLock, 0);\n} /* PHYSFS_canUnmount */\n\nchar **PHYSFS_getSearchPath(void)\n{\n    return doEnumStringList(PHYSFS_getSearchPathCallback);\n} /* PHYSFS_getSearchPath */\n\n\nconst char *PHYSFS_getMountPoint(const char *dir)\n{\n    DirHandle *i;\n    __PHYSFS_platformGrabMutex(stateLock);\n    for (i = searchPath; i != NULL; i = i->next)\n    {\n        if (strcmp(i->dirName, dir) == 0)\n        {\n            const char *retval = ((i->mountPoint) ? i->mountPoint : \"/\");\n            __PHYSFS_platformReleaseMutex(stateLock);\n            return retval;\n        } /* if */\n    } /* for */\n    __PHYSFS_platformReleaseMutex(stateLock);\n\n    BAIL(PHYSFS_ERR_NOT_MOUNTED, NULL);\n} /* PHYSFS_getMountPoint */\n\n\nvoid PHYSFS_getSearchPathCallback(PHYSFS_StringCallback callback, void *data)\n{\n    DirHandle *i;\n\n    __PHYSFS_platformGrabMutex(stateLock);\n\n    for (i = searchPath; i != NULL; i = i->next)\n        callback(data, i->dirName);\n\n    __PHYSFS_platformReleaseMutex(stateLock);\n} /* PHYSFS_getSearchPathCallback */\n\n\ntypedef struct setSaneCfgEnumData\n{\n    const char *archiveExt;\n    size_t archiveExtLen;\n    int archivesFirst;\n    PHYSFS_ErrorCode errcode;\n} setSaneCfgEnumData;\n\nstatic PHYSFS_EnumerateCallbackResult setSaneCfgEnumCallback(void *_data,\n                                                const char *dir, const char *f)\n{\n    setSaneCfgEnumData *data = (setSaneCfgEnumData *) _data;\n    const size_t extlen = data->archiveExtLen;\n    const size_t l = strlen(f);\n    const char *ext;\n\n    if ((l > extlen) && (f[l - extlen - 1] == '.'))\n    {\n        ext = f + (l - extlen);\n        if (PHYSFS_utf8stricmp(ext, data->archiveExt) == 0)\n        {\n            const char dirsep = __PHYSFS_platformDirSeparator;\n            const char *d = PHYSFS_getRealDir(f);\n            const size_t allocsize = strlen(d) + l + 2;\n            char *str = (char *) __PHYSFS_smallAlloc(allocsize);\n            if (str == NULL)\n                data->errcode = PHYSFS_ERR_OUT_OF_MEMORY;\n            else\n            {\n                snprintf(str, allocsize, \"%s%c%s\", d, dirsep, f);\n                if (!PHYSFS_mount(str, NULL, data->archivesFirst == 0))\n                    data->errcode = currentErrorCode();\n                __PHYSFS_smallFree(str);\n            } /* else */\n        } /* if */\n    } /* if */\n\n    /* !!! FIXME: if we want to abort on errors... */\n    /*return (data->errcode != PHYSFS_ERR_OK) ? PHYSFS_ENUM_ERROR : PHYSFS_ENUM_OK;*/\n\n    return PHYSFS_ENUM_OK;  /* keep going */\n} /* setSaneCfgEnumCallback */\n\n\nint PHYSFS_setSaneConfig(const char *organization, const char *appName,\n                         const char *archiveExt, int includeCdRoms,\n                         int archivesFirst)\n{\n    const char *basedir;\n    const char *prefdir;\n\n    BAIL_IF(!initialized, PHYSFS_ERR_NOT_INITIALIZED, 0);\n\n    prefdir = PHYSFS_getPrefDir(organization, appName);\n    BAIL_IF_ERRPASS(!prefdir, 0);\n\n    basedir = PHYSFS_getBaseDir();\n    BAIL_IF_ERRPASS(!basedir, 0);\n\n    BAIL_IF(!PHYSFS_setWriteDir(prefdir), PHYSFS_ERR_NO_WRITE_DIR, 0);\n\n    /* !!! FIXME: these can fail and we should report that... */\n\n    /* Put write dir first in search path... */\n    PHYSFS_mount(prefdir, NULL, 0);\n\n    /* Put base path on search path... */\n    PHYSFS_mount(basedir, NULL, 1);\n\n    /* handle CD-ROMs... */\n    if (includeCdRoms)\n    {\n        char **cds = PHYSFS_getCdRomDirs();\n        char **i;\n        for (i = cds; *i != NULL; i++)\n            PHYSFS_mount(*i, NULL, 1);\n        PHYSFS_freeList(cds);\n    } /* if */\n\n    /* Root out archives, and add them to search path... */\n    if (archiveExt != NULL)\n    {\n        setSaneCfgEnumData data;\n        memset(&data, '\\0', sizeof (data));\n        data.archiveExt = archiveExt;\n        data.archiveExtLen = strlen(archiveExt);\n        data.archivesFirst = archivesFirst;\n        data.errcode = PHYSFS_ERR_OK;\n        if (!PHYSFS_enumerate(\"/\", setSaneCfgEnumCallback, &data))\n        {\n            /* !!! FIXME: use this if we're reporting errors.\n            PHYSFS_ErrorCode errcode = currentErrorCode();\n            if (errcode == PHYSFS_ERR_APP_CALLBACK)\n                errcode = data->errcode; */\n        } /* if */\n    } /* if */\n\n    return 1;\n} /* PHYSFS_setSaneConfig */\n\n\nvoid PHYSFS_permitSymbolicLinks(int allow)\n{\n    allowSymLinks = allow;\n} /* PHYSFS_permitSymbolicLinks */\n\n\nint PHYSFS_symbolicLinksPermitted(void)\n{\n    return allowSymLinks;\n} /* PHYSFS_symbolicLinksPermitted */\n\n\n/*\n * Verify that (fname) (in platform-independent notation), in relation\n *  to (h) is secure. That means that each element of fname is checked\n *  for symlinks (if they aren't permitted). This also allows for quick\n *  rejection of files that exist outside an archive's mountpoint.\n *\n * With some exceptions (like PHYSFS_mkdir(), which builds multiple subdirs\n *  at a time), you should always pass zero for \"allowMissing\" for efficiency.\n *\n * (fname) must point to an output from sanitizePlatformIndependentPath(),\n *  since it will make sure that path names are in the right format for\n *  passing certain checks. It will also do checks for \"insecure\" pathnames\n *  like \"..\" which should be done once instead of once per archive. This also\n *  gives us license to treat (fname) as scratch space in this function.\n *\n * (fname)'s buffer must have enough space available before it for this\n *  function to prepend any root directory for this DirHandle.\n *\n * Returns non-zero if string is safe, zero if there's a security issue.\n *  PHYSFS_getLastError() will specify what was wrong. (*fname) will be\n *  updated to point past any mount point elements so it is prepared to\n *  be used with the archiver directly.\n */\nstatic int verifyPath(DirHandle *h, char **_fname, int allowMissing)\n{\n    char *fname = *_fname;\n    int retval = 1;\n    char *start;\n    char *end;\n\n    if ((*fname == '\\0') && (!h->root))  /* quick rejection. */\n        return 1;\n\n    /* !!! FIXME: This codeblock sucks. */\n    if (h->mountPoint != NULL)  /* NULL mountpoint means \"/\". */\n    {\n        size_t mntpntlen = strlen(h->mountPoint);\n        size_t len = strlen(fname);\n        assert(mntpntlen > 1); /* root mount points should be NULL. */\n        /* not under the mountpoint, so skip this archive. */\n        BAIL_IF(len < mntpntlen-1, PHYSFS_ERR_NOT_FOUND, 0);\n        /* !!! FIXME: Case insensitive? */\n        retval = strncmp(h->mountPoint, fname, mntpntlen-1);\n        BAIL_IF(retval != 0, PHYSFS_ERR_NOT_FOUND, 0);\n        if (len > mntpntlen-1)  /* corner case... */\n            BAIL_IF(fname[mntpntlen-1]!='/', PHYSFS_ERR_NOT_FOUND, 0);\n        fname += mntpntlen-1;  /* move to start of actual archive path. */\n        if (*fname == '/')\n            fname++;\n        *_fname = fname;  /* skip mountpoint for later use. */\n        retval = 1;  /* may be reset, below. */\n    } /* if */\n\n    /* prepend the root directory, if any. */\n    if (h->root)\n    {\n        const int isempty = (*fname == '\\0');\n        fname -= h->rootlen + (isempty ? 0 : 1);\n        strcpy(fname, h->root);\n        if (!isempty)\n            fname[h->rootlen] = '/';\n        *_fname = fname;\n    } /* if */\n\n    start = fname;\n    if (!allowSymLinks)\n    {\n        while (1)\n        {\n            PHYSFS_Stat statbuf;\n            int rc = 0;\n            end = strchr(start, '/');\n\n            if (end != NULL) *end = '\\0';\n            rc = h->funcs->stat(h->opaque, fname, &statbuf);\n            if (rc)\n                rc = (statbuf.filetype == PHYSFS_FILETYPE_SYMLINK);\n            else if (currentErrorCode() == PHYSFS_ERR_NOT_FOUND)\n                retval = 0;\n\n            if (end != NULL) *end = '/';\n\n            /* insecure path (has a disallowed symlink in it)? */\n            BAIL_IF(rc, PHYSFS_ERR_SYMLINK_FORBIDDEN, 0);\n\n            /* break out early if path element is missing. */\n            if (!retval)\n            {\n                /*\n                 * We need to clear it if it's the last element of the path,\n                 *  since this might be a non-existant file we're opening\n                 *  for writing...\n                 */\n                if ((end == NULL) || (allowMissing))\n                    retval = 1;\n                break;\n            } /* if */\n\n            if (end == NULL)\n                break;\n\n            start = end + 1;\n        } /* while */\n    } /* if */\n\n    return retval;\n} /* verifyPath */\n\n\nstatic int countPathComponents(const char *path)\n{\n    int components = 0;\n    const char *start;\n    const char *end;\n\n    if (path == NULL)\n        return 0;\n\n    if (*path != '/')\n        components = 1;\n\n    start = path;\n    while (1)\n    {\n        end = strchr(start, '/');\n\n        if (end == NULL)\n            break;\n\n        components++;\n        start = end + 1;\n    }\n\n    return components;\n} /* countPathComponents */\n\n\nstatic DirHandle *findWriteHandle(const char *_fname)\n{\n    DirHandle *i = NULL;\n    int deepest_path_components = -1;\n    DirHandle *deepest_dirhandle = NULL;\n    char *allocated_fname;\n    char *fname;\n    size_t len;\n\n    len = strlen(_fname) + longest_root + 1;\n    allocated_fname = (char *) __PHYSFS_smallAlloc(len);\n    BAIL_IF(!allocated_fname, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n    fname = allocated_fname + longest_root;\n\n    if (sanitizePlatformIndependentPath(_fname, fname))\n    {\n        for (i = searchPath; i != NULL; i = i->next)\n        {\n            char *arcfname = fname;\n            if (i->forWriting && verifyPath(i, &arcfname, 0))\n            {\n                int path_components = 0;\n                if (i->mountPoint != NULL)\n                    path_components = countPathComponents(i->mountPoint);\n                if (path_components > deepest_path_components)\n                {\n                    deepest_path_components = path_components;\n                    deepest_dirhandle = i;\n                } /* if */\n            } /* if */\n        } /* for */\n    } /* if */\n\n    __PHYSFS_smallFree(allocated_fname);\n\n    return deepest_dirhandle != NULL ? deepest_dirhandle : writeDir;\n} /* findWriteHandle */\n\n\n/* This must hold the stateLock before calling. */\nstatic int doMkdir(const char *_dname, char *dname, DirHandle *h)\n{\n    char *start;\n    char *end;\n    int retval = 0;\n    int exists = 1;  /* force existance check on first path element. */\n\n    assert(h != NULL);\n\n    BAIL_IF_ERRPASS(!sanitizePlatformIndependentPathWithRoot(h, _dname, dname), 0);\n    BAIL_IF_ERRPASS(!verifyPath(h, &dname, 1), 0);\n\n    start = dname;\n    while (1)\n    {\n        end = strchr(start, '/');\n        if (end != NULL)\n            *end = '\\0';\n\n        /* only check for existance if all parent dirs existed, too... */\n        if (exists)\n        {\n            PHYSFS_Stat statbuf;\n            const int rc = h->funcs->stat(h->opaque, dname, &statbuf);\n            if ((!rc) && (currentErrorCode() == PHYSFS_ERR_NOT_FOUND))\n                exists = 0;\n            /* verifyPath made sure that (dname) doesn't have symlinks if they aren't\n               allowed, but it's possible the mounted writeDir itself has symlinks in it,\n               (for example \"/var\" on iOS is a symlink, and the prefpath will be somewhere\n               under that)...if we mounted that writeDir, we must allow those symlinks here\n               unconditionally. */\n            retval = ( (rc) && ((statbuf.filetype == PHYSFS_FILETYPE_DIRECTORY) || (statbuf.filetype == PHYSFS_FILETYPE_SYMLINK)) );\n        } /* if */\n\n        if (!exists)\n            retval = h->funcs->mkdir(h->opaque, dname);\n\n        if (!retval)\n            break;\n\n        if (end == NULL)\n            break;\n\n        *end = '/';\n        start = end + 1;\n    } /* while */\n\n    return retval;\n} /* doMkdir */\n\n\nint PHYSFS_mkdir(const char *_dname)\n{\n    int retval = 0;\n    char *dname;\n    size_t len;\n    DirHandle *h = NULL;\n\n    BAIL_IF(!_dname, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n\n    __PHYSFS_platformGrabMutex(stateLock);\n    h = findWriteHandle(_dname);\n    BAIL_IF_MUTEX(!h, PHYSFS_ERR_NO_WRITE_DIR, stateLock, 0);\n    len = strlen(_dname) + dirHandleRootLen(h) + 1;\n    dname = (char *) __PHYSFS_smallAlloc(len);\n    BAIL_IF_MUTEX(!dname, PHYSFS_ERR_OUT_OF_MEMORY, stateLock, 0);\n    retval = doMkdir(_dname, dname, h);\n    __PHYSFS_platformReleaseMutex(stateLock);\n    __PHYSFS_smallFree(dname);\n    return retval;\n} /* PHYSFS_mkdir */\n\n\n/* This must hold the stateLock before calling. */\nstatic int doDelete(const char *_fname, char *fname, DirHandle *h)\n{\n    BAIL_IF_ERRPASS(!sanitizePlatformIndependentPathWithRoot(h, _fname, fname), 0);\n    BAIL_IF_ERRPASS(!verifyPath(h, &fname, 0), 0);\n    return h->funcs->remove(h->opaque, fname);\n} /* doDelete */\n\n\nint PHYSFS_delete(const char *_fname)\n{\n    int retval;\n    char *fname;\n    size_t len;\n    DirHandle *h = NULL;\n\n    __PHYSFS_platformGrabMutex(stateLock);\n    h = findWriteHandle(_fname);\n    BAIL_IF_MUTEX(!h, PHYSFS_ERR_NO_WRITE_DIR, stateLock, 0);\n    len = strlen(_fname) + dirHandleRootLen(h) + 1;\n    fname = (char *) __PHYSFS_smallAlloc(len);\n    BAIL_IF_MUTEX(!fname, PHYSFS_ERR_OUT_OF_MEMORY, stateLock, 0);\n    retval = doDelete(_fname, fname, h);\n    __PHYSFS_platformReleaseMutex(stateLock);\n    __PHYSFS_smallFree(fname);\n    return retval;\n} /* PHYSFS_delete */\n\n\nstatic DirHandle *getRealDirHandle(const char *_fname)\n{\n    DirHandle *retval = NULL;\n    char *allocated_fname = NULL;\n    char *fname = NULL;\n    size_t len;\n\n    BAIL_IF(!_fname, PHYSFS_ERR_INVALID_ARGUMENT, NULL);\n\n    __PHYSFS_platformGrabMutex(stateLock);\n    len = strlen(_fname) + longest_root + 2;\n    allocated_fname = __PHYSFS_smallAlloc(len);\n    BAIL_IF_MUTEX(!allocated_fname, PHYSFS_ERR_OUT_OF_MEMORY, stateLock, NULL);\n    fname = allocated_fname + longest_root + 1;\n    if (sanitizePlatformIndependentPath(_fname, fname))\n    {\n        DirHandle *i;\n        for (i = searchPath; i != NULL; i = i->next)\n        {\n            char *arcfname = fname;\n            if (partOfMountPoint(i, arcfname))\n            {\n                retval = i;\n                break;\n            } /* if */\n            else if (verifyPath(i, &arcfname, 0))\n            {\n                PHYSFS_Stat statbuf;\n                if (i->funcs->stat(i->opaque, arcfname, &statbuf))\n                {\n                    retval = i;\n                    break;\n                } /* if */\n            } /* if */\n        } /* for */\n    } /* if */\n\n    __PHYSFS_platformReleaseMutex(stateLock);\n    __PHYSFS_smallFree(allocated_fname);\n    return retval;\n} /* getRealDirHandle */\n\nconst char *PHYSFS_getRealDir(const char *fname)\n{\n    DirHandle *dh = getRealDirHandle(fname);\n    return dh ? dh->dirName : NULL;\n} /* PHYSFS_getRealDir */\n\n\nstatic int locateInStringList(const char *str,\n                              char **list,\n                              PHYSFS_uint32 *pos)\n{\n    PHYSFS_uint32 len = *pos;\n    PHYSFS_uint32 half_len;\n    PHYSFS_uint32 lo = 0;\n    PHYSFS_uint32 middle;\n    int cmp;\n\n    while (len > 0)\n    {\n        half_len = len >> 1;\n        middle = lo + half_len;\n        cmp = strcmp(list[middle], str);\n\n        if (cmp == 0)  /* it's in the list already. */\n            return 1;\n        else if (cmp > 0)\n            len = half_len;\n        else\n        {\n            lo = middle + 1;\n            len -= half_len + 1;\n        } /* else */\n    } /* while */\n\n    *pos = lo;\n    return 0;\n} /* locateInStringList */\n\n\nstatic PHYSFS_EnumerateCallbackResult enumFilesCallback(void *data,\n                                        const char *origdir, const char *str)\n{\n    PHYSFS_uint32 pos;\n    void *ptr;\n    char *newstr;\n    EnumStringListCallbackData *pecd = (EnumStringListCallbackData *) data;\n\n    /*\n     * See if file is in the list already, and if not, insert it in there\n     *  alphabetically...\n     */\n    pos = pecd->size;\n    if (locateInStringList(str, pecd->list, &pos))\n        return PHYSFS_ENUM_OK;  /* already in the list, but keep going. */\n\n    ptr = allocator.Realloc(pecd->list, (pecd->size + 2) * sizeof (char *));\n    newstr = (char *) allocator.Malloc(strlen(str) + 1);\n    if (ptr != NULL)\n        pecd->list = (char **) ptr;\n\n    if ((ptr == NULL) || (newstr == NULL))\n    {\n        if (newstr)\n            allocator.Free(newstr);\n\n        pecd->errcode = PHYSFS_ERR_OUT_OF_MEMORY;\n        return PHYSFS_ENUM_ERROR;  /* better luck next time. */\n    } /* if */\n\n    strcpy(newstr, str);\n\n    if (pos != pecd->size)\n    {\n        memmove(&pecd->list[pos+1], &pecd->list[pos],\n                 sizeof (char *) * ((pecd->size) - pos));\n    } /* if */\n\n    pecd->list[pos] = newstr;\n    pecd->size++;\n\n    return PHYSFS_ENUM_OK;\n} /* enumFilesCallback */\n\n\nchar **PHYSFS_enumerateFiles(const char *path)\n{\n    EnumStringListCallbackData ecd;\n    memset(&ecd, '\\0', sizeof (ecd));\n    ecd.list = (char **) allocator.Malloc(sizeof (char *));\n    BAIL_IF(!ecd.list, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n    if (!PHYSFS_enumerate(path, enumFilesCallback, &ecd))\n    {\n        const PHYSFS_ErrorCode errcode = currentErrorCode();\n        PHYSFS_uint32 i;\n        for (i = 0; i < ecd.size; i++)\n            allocator.Free(ecd.list[i]);\n        allocator.Free(ecd.list);\n        BAIL_IF(errcode == PHYSFS_ERR_APP_CALLBACK, ecd.errcode, NULL);\n        return NULL;\n    } /* if */\n\n    ecd.list[ecd.size] = NULL;\n    return ecd.list;\n} /* PHYSFS_enumerateFiles */\n\n\n/*\n * Broke out to seperate function so we can use stack allocation gratuitously.\n */\nstatic PHYSFS_EnumerateCallbackResult enumerateFromMountPoint(DirHandle *i,\n                                    const char *arcfname,\n                                    PHYSFS_EnumerateCallback callback,\n                                    const char *_fname, void *data)\n{\n    PHYSFS_EnumerateCallbackResult retval;\n    const size_t len = strlen(arcfname);\n    char *ptr = NULL;\n    char *end = NULL;\n    const size_t slen = strlen(i->mountPoint) + 1;\n    char *mountPoint = (char *) __PHYSFS_smallAlloc(slen);\n\n    BAIL_IF(!mountPoint, PHYSFS_ERR_OUT_OF_MEMORY, PHYSFS_ENUM_ERROR);\n\n    strcpy(mountPoint, i->mountPoint);\n    ptr = mountPoint + ((len) ? len + 1 : 0);\n    end = strchr(ptr, '/');\n    assert(end);  /* should always find a terminating '/'. */\n    *end = '\\0';\n    retval = callback(data, _fname, ptr);\n    __PHYSFS_smallFree(mountPoint);\n\n    BAIL_IF(retval == PHYSFS_ENUM_ERROR, PHYSFS_ERR_APP_CALLBACK, retval);\n    return retval;\n} /* enumerateFromMountPoint */\n\n\ntypedef struct SymlinkFilterData\n{\n    PHYSFS_EnumerateCallback callback;\n    void *callbackData;\n    DirHandle *dirhandle;\n    const char *arcfname;\n    PHYSFS_ErrorCode errcode;\n} SymlinkFilterData;\n\nstatic PHYSFS_EnumerateCallbackResult enumCallbackFilterSymLinks(void *_data,\n                                    const char *origdir, const char *fname)\n{\n    SymlinkFilterData *data = (SymlinkFilterData *) _data;\n    const DirHandle *dh = data->dirhandle;\n    const char *arcfname = data->arcfname;\n    PHYSFS_Stat statbuf;\n    const char *trimmedDir = (*arcfname == '/') ? (arcfname + 1) : arcfname;\n    const size_t slen = strlen(trimmedDir) + strlen(fname) + 2;\n    char *path = (char *) __PHYSFS_smallAlloc(slen);\n    PHYSFS_EnumerateCallbackResult retval = PHYSFS_ENUM_OK;\n\n    if (path == NULL)\n    {\n        data->errcode = PHYSFS_ERR_OUT_OF_MEMORY;\n        return PHYSFS_ENUM_ERROR;\n    } /* if */\n\n    snprintf(path, slen, \"%s%s%s\", trimmedDir, *trimmedDir ? \"/\" : \"\", fname);\n\n    if (!dh->funcs->stat(dh->opaque, path, &statbuf))\n    {\n        data->errcode = currentErrorCode();\n        retval = PHYSFS_ENUM_ERROR;\n    } /* if */\n    else\n    {\n        /* Pass it on to the application if it's not a symlink. */\n        if (statbuf.filetype != PHYSFS_FILETYPE_SYMLINK)\n        {\n            retval = data->callback(data->callbackData, origdir, fname);\n            if (retval == PHYSFS_ENUM_ERROR)\n                data->errcode = PHYSFS_ERR_APP_CALLBACK;\n        } /* if */\n    } /* else */\n\n    __PHYSFS_smallFree(path);\n\n    return retval;\n} /* enumCallbackFilterSymLinks */\n\n\nint PHYSFS_enumerate(const char *_fn, PHYSFS_EnumerateCallback cb, void *data)\n{\n    PHYSFS_EnumerateCallbackResult retval = PHYSFS_ENUM_OK;\n    size_t len;\n    char *allocated_fname;\n    char *fname;\n\n    BAIL_IF(!_fn, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n    BAIL_IF(!cb, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n\n    __PHYSFS_platformGrabMutex(stateLock);\n\n    len = strlen(_fn) + longest_root + 2;\n    allocated_fname = (char *) __PHYSFS_smallAlloc(len);\n    BAIL_IF_MUTEX(!allocated_fname, PHYSFS_ERR_OUT_OF_MEMORY, stateLock, 0);\n    fname = allocated_fname + longest_root + 1;\n    if (!sanitizePlatformIndependentPath(_fn, fname))\n        retval = PHYSFS_ENUM_STOP;\n    else\n    {\n        DirHandle *i;\n        SymlinkFilterData filterdata;\n\n        if (!allowSymLinks)\n        {\n            memset(&filterdata, '\\0', sizeof (filterdata));\n            filterdata.callback = cb;\n            filterdata.callbackData = data;\n        } /* if */\n\n        for (i = searchPath; (retval == PHYSFS_ENUM_OK) && i; i = i->next)\n        {\n            char *arcfname = fname;\n\n            if (partOfMountPoint(i, arcfname))\n                retval = enumerateFromMountPoint(i, arcfname, cb, _fn, data);\n\n            else if (verifyPath(i, &arcfname, 0))\n            {\n                PHYSFS_Stat statbuf;\n                if (!i->funcs->stat(i->opaque, arcfname, &statbuf))\n                {\n                    if (currentErrorCode() == PHYSFS_ERR_NOT_FOUND)\n                        continue;  /* no such dir in this archive, skip it. */\n                } /* if */\n\n                if (statbuf.filetype != PHYSFS_FILETYPE_DIRECTORY)\n                    continue;  /* not a directory in this archive, skip it. */\n\n                else if ((!allowSymLinks) && (i->funcs->info.supportsSymlinks))\n                {\n                    filterdata.dirhandle = i;\n                    filterdata.arcfname = arcfname;\n                    filterdata.errcode = PHYSFS_ERR_OK;\n                    retval = i->funcs->enumerate(i->opaque, arcfname,\n                                                 enumCallbackFilterSymLinks,\n                                                 _fn, &filterdata);\n                    if (retval == PHYSFS_ENUM_ERROR)\n                    {\n                        if (currentErrorCode() == PHYSFS_ERR_APP_CALLBACK)\n                            PHYSFS_setErrorCode(filterdata.errcode);\n                    } /* if */\n                } /* else if */\n                else\n                {\n                    retval = i->funcs->enumerate(i->opaque, arcfname,\n                                                 cb, _fn, data);\n                } /* else */\n            } /* else if */\n        } /* for */\n\n    } /* if */\n\n    __PHYSFS_platformReleaseMutex(stateLock);\n\n    __PHYSFS_smallFree(allocated_fname);\n\n    return (retval == PHYSFS_ENUM_ERROR) ? 0 : 1;\n} /* PHYSFS_enumerate */\n\n\ntypedef struct\n{\n    PHYSFS_EnumFilesCallback callback;\n    void *data;\n} LegacyEnumFilesCallbackData;\n\nstatic PHYSFS_EnumerateCallbackResult enumFilesCallbackAlwaysSucceed(void *d,\n                                    const char *origdir, const char *fname)\n{\n    LegacyEnumFilesCallbackData *cbdata = (LegacyEnumFilesCallbackData *) d;\n    cbdata->callback(cbdata->data, origdir, fname);\n    return PHYSFS_ENUM_OK;\n} /* enumFilesCallbackAlwaysSucceed */\n\nvoid PHYSFS_enumerateFilesCallback(const char *fname,\n                                   PHYSFS_EnumFilesCallback callback,\n                                   void *data)\n{\n    LegacyEnumFilesCallbackData cbdata;\n    cbdata.callback = callback;\n    cbdata.data = data;\n    (void) PHYSFS_enumerate(fname, enumFilesCallbackAlwaysSucceed, &cbdata);\n} /* PHYSFS_enumerateFilesCallback */\n\n\nint PHYSFS_exists(const char *fname)\n{\n    return (getRealDirHandle(fname) != NULL);\n} /* PHYSFS_exists */\n\n\nPHYSFS_sint64 PHYSFS_getLastModTime(const char *fname)\n{\n    PHYSFS_Stat statbuf;\n    BAIL_IF_ERRPASS(!PHYSFS_stat(fname, &statbuf), -1);\n    return statbuf.modtime;\n} /* PHYSFS_getLastModTime */\n\n\nint PHYSFS_isDirectory(const char *fname)\n{\n    PHYSFS_Stat statbuf;\n    BAIL_IF_ERRPASS(!PHYSFS_stat(fname, &statbuf), 0);\n    return (statbuf.filetype == PHYSFS_FILETYPE_DIRECTORY);\n} /* PHYSFS_isDirectory */\n\n\nint PHYSFS_isSymbolicLink(const char *fname)\n{\n    PHYSFS_Stat statbuf;\n    BAIL_IF_ERRPASS(!PHYSFS_stat(fname, &statbuf), 0);\n    return (statbuf.filetype == PHYSFS_FILETYPE_SYMLINK);\n} /* PHYSFS_isSymbolicLink */\n\n\nstatic PHYSFS_File *doOpenWrite(const char *_fname, const int appending)\n{\n    FileHandle *fh = NULL;\n    DirHandle *h;\n    size_t len;\n    char *fname;\n\n    BAIL_IF(!_fname, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n\n    __PHYSFS_platformGrabMutex(stateLock);\n\n    h = findWriteHandle(_fname);\n    BAIL_IF_MUTEX(!h, PHYSFS_ERR_NO_WRITE_DIR, stateLock, 0);\n\n    len = strlen(_fname) + dirHandleRootLen(h) + 1;\n    fname = (char *) __PHYSFS_smallAlloc(len);\n    BAIL_IF_MUTEX(!fname, PHYSFS_ERR_OUT_OF_MEMORY, stateLock, 0);\n\n    if (sanitizePlatformIndependentPathWithRoot(h, _fname, fname))\n    {\n        PHYSFS_Io *io = NULL;\n        char *arcfname = fname;\n        if (verifyPath(h, &arcfname, 0))\n        {\n            const PHYSFS_Archiver *f = h->funcs;\n            if (appending)\n                io = f->openAppend(h->opaque, arcfname);\n            else\n                io = f->openWrite(h->opaque, arcfname);\n\n            if (io)\n            {\n                fh = (FileHandle *) allocator.Malloc(sizeof (FileHandle));\n                if (fh == NULL)\n                {\n                    io->destroy(io);\n                    PHYSFS_setErrorCode(PHYSFS_ERR_OUT_OF_MEMORY);\n                } /* if */\n                else\n                {\n                    memset(fh, '\\0', sizeof (FileHandle));\n                    fh->io = io;\n                    fh->dirHandle = h;\n                    fh->next = openWriteList;\n                    openWriteList = fh;\n                } /* else */\n            } /* if */\n        } /* if */\n    } /* if */\n\n    __PHYSFS_platformReleaseMutex(stateLock);\n\n    __PHYSFS_smallFree(fname);\n    return ((PHYSFS_File *) fh);\n} /* doOpenWrite */\n\n\nPHYSFS_File *PHYSFS_openWrite(const char *filename)\n{\n    return doOpenWrite(filename, 0);\n} /* PHYSFS_openWrite */\n\n\nPHYSFS_File *PHYSFS_openAppend(const char *filename)\n{\n    return doOpenWrite(filename, 1);\n} /* PHYSFS_openAppend */\n\n\nPHYSFS_File *PHYSFS_openRead(const char *_fname)\n{\n    FileHandle *fh = NULL;\n    char *allocated_fname;\n    char *fname;\n    size_t len;\n\n    BAIL_IF(!_fname, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n\n    __PHYSFS_platformGrabMutex(stateLock);\n\n    BAIL_IF_MUTEX(!searchPath, PHYSFS_ERR_NOT_FOUND, stateLock, 0);\n\n    len = strlen(_fname) + longest_root + 2;\n    allocated_fname = (char *) __PHYSFS_smallAlloc(len);\n    BAIL_IF_MUTEX(!allocated_fname, PHYSFS_ERR_OUT_OF_MEMORY, stateLock, 0);\n    fname = allocated_fname + longest_root + 1;\n\n    if (sanitizePlatformIndependentPath(_fname, fname))\n    {\n        PHYSFS_Io *io = NULL;\n        DirHandle *i;\n\n        for (i = searchPath; i != NULL; i = i->next)\n        {\n            char *arcfname = fname;\n            if (verifyPath(i, &arcfname, 0))\n            {\n                io = i->funcs->openRead(i->opaque, arcfname);\n                if (io)\n                    break;\n            } /* if */\n        } /* for */\n\n        if (io)\n        {\n            fh = (FileHandle *) allocator.Malloc(sizeof (FileHandle));\n            if (fh == NULL)\n            {\n                io->destroy(io);\n                PHYSFS_setErrorCode(PHYSFS_ERR_OUT_OF_MEMORY);\n            } /* if */\n            else\n            {\n                memset(fh, '\\0', sizeof (FileHandle));\n                fh->io = io;\n                fh->forReading = 1;\n                fh->dirHandle = i;\n                fh->next = openReadList;\n                openReadList = fh;\n            } /* else */\n        } /* if */\n    } /* if */\n\n    __PHYSFS_platformReleaseMutex(stateLock);\n    __PHYSFS_smallFree(allocated_fname);\n    return ((PHYSFS_File *) fh);\n} /* PHYSFS_openRead */\n\n\nstatic int closeHandleInOpenList(FileHandle **list, FileHandle *handle)\n{\n    FileHandle *prev = NULL;\n    FileHandle *i;\n\n    for (i = *list; i != NULL; i = i->next)\n    {\n        if (i == handle)  /* handle is in this list? */\n        {\n            PHYSFS_Io *io = handle->io;\n            PHYSFS_uint8 *tmp = handle->buffer;\n\n            /* send our buffer to io... */\n            if (!handle->forReading)\n            {\n                if (!PHYSFS_flush((PHYSFS_File *) handle))\n                    return -1;\n\n                /* ...then have io send it to the disk... */\n                else if (io->flush && !io->flush(io))\n                    return -1;\n            } /* if */\n\n            /* ...then close the underlying file. */\n            io->destroy(io);\n\n            if (tmp != NULL)  /* free any associated buffer. */\n                allocator.Free(tmp);\n\n            if (prev == NULL)\n                *list = handle->next;\n            else\n                prev->next = handle->next;\n\n            allocator.Free(handle);\n            return 1;\n        } /* if */\n        prev = i;\n    } /* for */\n\n    return 0;\n} /* closeHandleInOpenList */\n\n\nint PHYSFS_close(PHYSFS_File *_handle)\n{\n    FileHandle *handle = (FileHandle *) _handle;\n    int rc;\n\n    __PHYSFS_platformGrabMutex(stateLock);\n\n    /* -1 == close failure. 0 == not found. 1 == success. */\n    rc = closeHandleInOpenList(&openReadList, handle);\n    BAIL_IF_MUTEX_ERRPASS(rc == -1, stateLock, 0);\n    if (!rc)\n    {\n        rc = closeHandleInOpenList(&openWriteList, handle);\n        BAIL_IF_MUTEX_ERRPASS(rc == -1, stateLock, 0);\n    } /* if */\n\n    __PHYSFS_platformReleaseMutex(stateLock);\n    BAIL_IF(!rc, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n    return 1;\n} /* PHYSFS_close */\n\n\nstatic PHYSFS_sint64 doBufferedRead(FileHandle *fh, void *_buffer, size_t len)\n{\n    PHYSFS_uint8 *buffer = (PHYSFS_uint8 *) _buffer;\n    PHYSFS_sint64 retval = 0;\n\n    while (len > 0)\n    {\n        const size_t avail = fh->buffill - fh->bufpos;\n        if (avail > 0)  /* data available in the buffer. */\n        {\n            const size_t cpy = (len < avail) ? len : avail;\n            memcpy(buffer, fh->buffer + fh->bufpos, cpy);\n            assert(len >= cpy);\n            buffer += cpy;\n            len -= cpy;\n            fh->bufpos += cpy;\n            retval += cpy;\n        } /* if */\n\n        else   /* buffer is empty, refill it. */\n        {\n            PHYSFS_Io *io = fh->io;\n            const PHYSFS_sint64 rc = io->read(io, fh->buffer, fh->bufsize);\n            fh->bufpos = 0;\n            if (rc > 0)\n                fh->buffill = (size_t) rc;\n            else\n            {\n                fh->buffill = 0;\n                if (retval == 0)  /* report already-read data, or failure. */\n                    retval = rc;\n                break;\n            } /* else */\n        } /* else */\n    } /* while */\n\n    return retval;\n} /* doBufferedRead */\n\n\nPHYSFS_sint64 PHYSFS_read(PHYSFS_File *handle, void *buffer,\n                          PHYSFS_uint32 size, PHYSFS_uint32 count)\n{\n    const PHYSFS_uint64 len = ((PHYSFS_uint64) size) * ((PHYSFS_uint64) count);\n    const PHYSFS_sint64 retval = PHYSFS_readBytes(handle, buffer, len);\n    return ( (retval <= 0) ? retval : (retval / ((PHYSFS_sint64) size)) );\n} /* PHYSFS_read */\n\n\nPHYSFS_sint64 PHYSFS_readBytes(PHYSFS_File *handle, void *buffer,\n                               PHYSFS_uint64 _len)\n{\n    const size_t len = (size_t) _len;\n    FileHandle *fh = (FileHandle *) handle;\n\n#ifdef PHYSFS_NO_64BIT_SUPPORT\n    const PHYSFS_uint64 maxlen = __PHYSFS_UI64(0x7FFFFFFF);\n#else\n    const PHYSFS_uint64 maxlen = __PHYSFS_UI64(0x7FFFFFFFFFFFFFFF);\n#endif\n\n    if (!__PHYSFS_ui64FitsAddressSpace(_len))\n        BAIL(PHYSFS_ERR_INVALID_ARGUMENT, -1);\n\n    BAIL_IF(_len > maxlen, PHYSFS_ERR_INVALID_ARGUMENT, -1);\n    BAIL_IF(!fh->forReading, PHYSFS_ERR_OPEN_FOR_WRITING, -1);\n    BAIL_IF_ERRPASS(len == 0, 0);\n    if (fh->buffer)\n        return doBufferedRead(fh, buffer, len);\n\n    return fh->io->read(fh->io, buffer, len);\n} /* PHYSFS_readBytes */\n\n\nstatic PHYSFS_sint64 doBufferedWrite(PHYSFS_File *handle, const void *buffer,\n                                     const size_t len)\n{\n    FileHandle *fh = (FileHandle *) handle;\n\n    /* whole thing fits in the buffer? */\n    if ((fh->buffill + len) < fh->bufsize)\n    {\n        memcpy(fh->buffer + fh->buffill, buffer, len);\n        fh->buffill += len;\n        return (PHYSFS_sint64) len;\n    } /* if */\n\n    /* would overflow buffer. Flush and then write the new objects, too. */\n    BAIL_IF_ERRPASS(!PHYSFS_flush(handle), -1);\n    return fh->io->write(fh->io, buffer, len);\n} /* doBufferedWrite */\n\n\nPHYSFS_sint64 PHYSFS_write(PHYSFS_File *handle, const void *buffer,\n                           PHYSFS_uint32 size, PHYSFS_uint32 count)\n{\n    const PHYSFS_uint64 len = ((PHYSFS_uint64) size) * ((PHYSFS_uint64) count);\n    const PHYSFS_sint64 retval = PHYSFS_writeBytes(handle, buffer, len);\n    return ( (retval <= 0) ? retval : (retval / ((PHYSFS_sint64) size)) );\n} /* PHYSFS_write */\n\n\nPHYSFS_sint64 PHYSFS_writeBytes(PHYSFS_File *handle, const void *buffer,\n                                PHYSFS_uint64 _len)\n{\n    const size_t len = (size_t) _len;\n    FileHandle *fh = (FileHandle *) handle;\n\n#ifdef PHYSFS_NO_64BIT_SUPPORT\n    const PHYSFS_uint64 maxlen = __PHYSFS_UI64(0x7FFFFFFF);\n#else\n    const PHYSFS_uint64 maxlen = __PHYSFS_UI64(0x7FFFFFFFFFFFFFFF);\n#endif\n\n    if (!__PHYSFS_ui64FitsAddressSpace(_len))\n        BAIL(PHYSFS_ERR_INVALID_ARGUMENT, -1);\n\n    BAIL_IF(_len > maxlen, PHYSFS_ERR_INVALID_ARGUMENT, -1);\n    BAIL_IF(fh->forReading, PHYSFS_ERR_OPEN_FOR_READING, -1);\n    BAIL_IF_ERRPASS(len == 0, 0);\n    if (fh->buffer)\n        return doBufferedWrite(handle, buffer, len);\n\n    return fh->io->write(fh->io, buffer, len);\n} /* PHYSFS_write */\n\n\nint PHYSFS_eof(PHYSFS_File *handle)\n{\n    FileHandle *fh = (FileHandle *) handle;\n\n    if (!fh->forReading)  /* never EOF on files opened for write/append. */\n        return 0;\n\n    /* can't be eof if buffer isn't empty */\n    if (fh->bufpos == fh->buffill)\n    {\n        /* check the Io. */\n        PHYSFS_Io *io = fh->io;\n        const PHYSFS_sint64 pos = io->tell(io);\n        const PHYSFS_sint64 len = io->length(io);\n        if ((pos < 0) || (len < 0))\n            return 0;  /* beats me. */\n        return (pos >= len);\n    } /* if */\n\n    return 0;\n} /* PHYSFS_eof */\n\n\nPHYSFS_sint64 PHYSFS_tell(PHYSFS_File *handle)\n{\n    FileHandle *fh = (FileHandle *) handle;\n    const PHYSFS_sint64 pos = fh->io->tell(fh->io);\n    const PHYSFS_sint64 retval = fh->forReading ?\n                                 (pos - fh->buffill) + fh->bufpos :\n                                 (pos + fh->buffill);\n    return retval;\n} /* PHYSFS_tell */\n\n\nint PHYSFS_seek(PHYSFS_File *handle, PHYSFS_uint64 pos)\n{\n    FileHandle *fh = (FileHandle *) handle;\n    BAIL_IF_ERRPASS(!PHYSFS_flush(handle), 0);\n\n    if (fh->buffer && fh->forReading)\n    {\n        /* avoid throwing away our precious buffer if seeking within it. */\n        PHYSFS_sint64 offset = pos - PHYSFS_tell(handle);\n        if ( /* seeking within the already-buffered range? */\n             /* forward? */\n            ((offset >= 0) && (((size_t)offset) <= fh->buffill-fh->bufpos)) ||\n            /* backward? */\n            ((offset < 0) && (((size_t) -offset) <= fh->bufpos)) )\n        {\n            fh->bufpos = (size_t) (((PHYSFS_sint64) fh->bufpos) + offset);\n            return 1; /* successful seek */\n        } /* if */\n    } /* if */\n\n    /* we have to fall back to a 'raw' seek. */\n    fh->buffill = fh->bufpos = 0;\n    return fh->io->seek(fh->io, pos);\n} /* PHYSFS_seek */\n\n\nPHYSFS_sint64 PHYSFS_fileLength(PHYSFS_File *handle)\n{\n    PHYSFS_Io *io = ((FileHandle *) handle)->io;\n    return io->length(io);\n} /* PHYSFS_filelength */\n\n\nint PHYSFS_setBuffer(PHYSFS_File *handle, PHYSFS_uint64 _bufsize)\n{\n    FileHandle *fh = (FileHandle *) handle;\n    const size_t bufsize = (size_t) _bufsize;\n\n    if (!__PHYSFS_ui64FitsAddressSpace(_bufsize))\n        BAIL(PHYSFS_ERR_INVALID_ARGUMENT, 0);\n\n    BAIL_IF_ERRPASS(!PHYSFS_flush(handle), 0);\n\n    /*\n     * For reads, we need to move the file pointer to where it would be\n     *  if we weren't buffering, so that the next read will get the\n     *  right chunk of stuff from the file. PHYSFS_flush() handles writes.\n     */\n    if ((fh->forReading) && (fh->buffill != fh->bufpos))\n    {\n        PHYSFS_uint64 pos;\n        const PHYSFS_sint64 curpos = fh->io->tell(fh->io);\n        BAIL_IF_ERRPASS(curpos == -1, 0);\n        pos = ((curpos - fh->buffill) + fh->bufpos);\n        BAIL_IF_ERRPASS(!fh->io->seek(fh->io, pos), 0);\n    } /* if */\n\n    if (bufsize == 0)  /* delete existing buffer. */\n    {\n        if (fh->buffer)\n        {\n            allocator.Free(fh->buffer);\n            fh->buffer = NULL;\n        } /* if */\n    } /* if */\n\n    else\n    {\n        PHYSFS_uint8 *newbuf;\n        newbuf = (PHYSFS_uint8 *) allocator.Realloc(fh->buffer, bufsize);\n        BAIL_IF(!newbuf, PHYSFS_ERR_OUT_OF_MEMORY, 0);\n        fh->buffer = newbuf;\n    } /* else */\n\n    fh->bufsize = bufsize;\n    fh->buffill = fh->bufpos = 0;\n    return 1;\n} /* PHYSFS_setBuffer */\n\n\nint PHYSFS_flush(PHYSFS_File *handle)\n{\n    FileHandle *fh = (FileHandle *) handle;\n    PHYSFS_Io *io;\n    PHYSFS_sint64 rc;\n\n    if ((fh->forReading) || (fh->bufpos == fh->buffill))\n        return 1;  /* open for read or buffer empty are successful no-ops. */\n\n    /* dump buffer to disk. */\n    io = fh->io;\n    rc = io->write(io, fh->buffer + fh->bufpos, fh->buffill - fh->bufpos);\n    BAIL_IF_ERRPASS(rc <= 0, 0);\n    fh->bufpos = fh->buffill = 0;\n    return 1;\n} /* PHYSFS_flush */\n\n\nint PHYSFS_stat(const char *_fname, PHYSFS_Stat *stat)\n{\n    int retval = 0;\n    char *allocated_fname;\n    char *fname;\n    size_t len;\n\n    BAIL_IF(!_fname, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n    BAIL_IF(!stat, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n\n    /* set some sane defaults... */\n    stat->filesize = -1;\n    stat->modtime = -1;\n    stat->createtime = -1;\n    stat->accesstime = -1;\n    stat->filetype = PHYSFS_FILETYPE_OTHER;\n    stat->readonly = 1;\n\n    __PHYSFS_platformGrabMutex(stateLock);\n    len = strlen(_fname) + longest_root + 2;\n    allocated_fname = (char *) __PHYSFS_smallAlloc(len);\n    BAIL_IF_MUTEX(!allocated_fname, PHYSFS_ERR_OUT_OF_MEMORY, stateLock, 0);\n    fname = allocated_fname + longest_root + 1;\n\n    if (sanitizePlatformIndependentPath(_fname, fname))\n    {\n        if (*fname == '\\0')\n        {\n            stat->filetype = PHYSFS_FILETYPE_DIRECTORY;\n            stat->readonly = !writeDir; /* Writeable if we have a writeDir */\n            retval = 1;\n        } /* if */\n        else\n        {\n            DirHandle *i;\n            int exists = 0;\n            for (i = searchPath; ((i != NULL) && (!exists)); i = i->next)\n            {\n                char *arcfname = fname;\n                exists = partOfMountPoint(i, arcfname);\n                if (exists)\n                {\n                    stat->filetype = PHYSFS_FILETYPE_DIRECTORY;\n                    stat->readonly = !i->forWriting;\n                    retval = 1;\n                } /* if */\n                else if (verifyPath(i, &arcfname, 0))\n                {\n                    retval = i->funcs->stat(i->opaque, arcfname, stat);\n                    if ((retval) || (currentErrorCode() != PHYSFS_ERR_NOT_FOUND))\n                        exists = 1;\n                } /* else if */\n            } /* for */\n        } /* else */\n    } /* if */\n\n    __PHYSFS_platformReleaseMutex(stateLock);\n    __PHYSFS_smallFree(allocated_fname);\n    return retval;\n} /* PHYSFS_stat */\n\n\nint __PHYSFS_readAll(PHYSFS_Io *io, void *buf, const size_t _len)\n{\n    const PHYSFS_uint64 len = (PHYSFS_uint64) _len;\n    return (io->read(io, buf, len) == len);\n} /* __PHYSFS_readAll */\n\n\nvoid *__PHYSFS_initSmallAlloc(void *ptr, const size_t len)\n{\n    void *useHeap = ((ptr == NULL) ? ((void *) 1) : ((void *) 0));\n    if (useHeap)  /* too large for stack allocation or alloca() failed. */\n        ptr = allocator.Malloc(len+sizeof (void *));\n\n    if (ptr != NULL)\n    {\n        void **retval = (void **) ptr;\n        /*printf(\"%s alloc'd (%lld) bytes at (%p).\\n\",\n                useHeap ? \"heap\" : \"stack\", (long long) len, ptr);*/\n        *retval = useHeap;\n        return retval + 1;\n    } /* if */\n\n    return NULL;  /* allocation failed. */\n} /* __PHYSFS_initSmallAlloc */\n\n\nvoid __PHYSFS_smallFree(void *ptr)\n{\n    if (ptr != NULL)\n    {\n        void **block = ((void **) ptr) - 1;\n        const int useHeap = (*block != NULL);\n        if (useHeap)\n            allocator.Free(block);\n        /*printf(\"%s free'd (%p).\\n\", useHeap ? \"heap\" : \"stack\", block);*/\n    } /* if */\n} /* __PHYSFS_smallFree */\n\n\nint PHYSFS_setAllocator(const PHYSFS_Allocator *a)\n{\n    BAIL_IF(initialized, PHYSFS_ERR_IS_INITIALIZED, 0);\n    externalAllocator = (a != NULL);\n    if (externalAllocator)\n        memcpy(&allocator, a, sizeof (PHYSFS_Allocator));\n\n    return 1;\n} /* PHYSFS_setAllocator */\n\n\nconst PHYSFS_Allocator *PHYSFS_getAllocator(void)\n{\n    BAIL_IF(!initialized, PHYSFS_ERR_NOT_INITIALIZED, NULL);\n    return &allocator;\n} /* PHYSFS_getAllocator */\n\n\nstatic void *mallocAllocatorMalloc(PHYSFS_uint64 s)\n{\n    if (!__PHYSFS_ui64FitsAddressSpace(s))\n        BAIL(PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n    #undef malloc\n    return malloc((size_t) s);\n} /* mallocAllocatorMalloc */\n\n\nstatic void *mallocAllocatorRealloc(void *ptr, PHYSFS_uint64 s)\n{\n    if (!__PHYSFS_ui64FitsAddressSpace(s))\n        BAIL(PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n    #undef realloc\n    return realloc(ptr, (size_t) s);\n} /* mallocAllocatorRealloc */\n\n\nstatic void mallocAllocatorFree(void *ptr)\n{\n    #undef free\n    free(ptr);\n} /* mallocAllocatorFree */\n\n\nstatic void setDefaultAllocator(void)\n{\n    assert(!externalAllocator);\n    allocator.Init = NULL;\n    allocator.Deinit = NULL;\n    allocator.Malloc = mallocAllocatorMalloc;\n    allocator.Realloc = mallocAllocatorRealloc;\n    allocator.Free = mallocAllocatorFree;\n} /* setDefaultAllocator */\n\n\nint __PHYSFS_DirTreeInit(__PHYSFS_DirTree *dt, const size_t entrylen, const int case_sensitive, const int only_usascii)\n{\n    static char rootpath[2] = { '/', '\\0' };\n    size_t alloclen;\n\n    assert(entrylen >= sizeof (__PHYSFS_DirTreeEntry));\n\n    memset(dt, '\\0', sizeof (*dt));\n    dt->case_sensitive = case_sensitive;\n    dt->only_usascii = only_usascii;\n\n    dt->root = (__PHYSFS_DirTreeEntry *) allocator.Malloc(entrylen);\n    BAIL_IF(!dt->root, PHYSFS_ERR_OUT_OF_MEMORY, 0);\n    memset(dt->root, '\\0', entrylen);\n    dt->root->name = rootpath;\n    dt->root->isdir = 1;\n    dt->hashBuckets = 64;\n    if (!dt->hashBuckets)\n        dt->hashBuckets = 1;\n    dt->entrylen = entrylen;\n\n    alloclen = dt->hashBuckets * sizeof (__PHYSFS_DirTreeEntry *);\n    dt->hash = (__PHYSFS_DirTreeEntry **) allocator.Malloc(alloclen);\n    BAIL_IF(!dt->hash, PHYSFS_ERR_OUT_OF_MEMORY, 0);\n    memset(dt->hash, '\\0', alloclen);\n\n    return 1;\n} /* __PHYSFS_DirTreeInit */\n\n\nstatic PHYSFS_uint32 hashPathName(__PHYSFS_DirTree *dt, const char *name)\n{\n    const PHYSFS_uint32 hashval = dt->case_sensitive ? __PHYSFS_hashString(name) : dt->only_usascii ? __PHYSFS_hashStringCaseFoldUSAscii(name) : __PHYSFS_hashStringCaseFold(name);\n    return hashval % dt->hashBuckets;\n} /* hashPathName */\n\n\n/* Fill in missing parent directories. */\nstatic __PHYSFS_DirTreeEntry *addAncestors(__PHYSFS_DirTree *dt, char *name)\n{\n    __PHYSFS_DirTreeEntry *retval = dt->root;\n    char *sep = strrchr(name, '/');\n\n    if (sep)\n    {\n        *sep = '\\0';  /* chop off last piece. */\n        retval = (__PHYSFS_DirTreeEntry *) __PHYSFS_DirTreeFind(dt, name);\n\n        if (retval != NULL)\n        {\n            *sep = '/';\n            BAIL_IF(!retval->isdir, PHYSFS_ERR_CORRUPT, NULL);\n            return retval;  /* already hashed. */\n        } /* if */\n\n        /* okay, this is a new dir. Build and hash us. */\n        retval = (__PHYSFS_DirTreeEntry*)__PHYSFS_DirTreeAdd(dt, name, 1);\n        *sep = '/';\n    } /* if */\n\n    return retval;\n} /* addAncestors */\n\n\nvoid *__PHYSFS_DirTreeAdd(__PHYSFS_DirTree *dt, char *name, const int isdir)\n{\n    __PHYSFS_DirTreeEntry *retval = __PHYSFS_DirTreeFind(dt, name);\n    if (!retval)\n    {\n        const size_t alloclen = strlen(name) + 1 + dt->entrylen;\n        PHYSFS_uint32 hashval;\n        __PHYSFS_DirTreeEntry *parent = addAncestors(dt, name);\n        BAIL_IF_ERRPASS(!parent, NULL);\n        assert(dt->entrylen >= sizeof (__PHYSFS_DirTreeEntry));\n        retval = (__PHYSFS_DirTreeEntry *) allocator.Malloc(alloclen);\n        BAIL_IF(!retval, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n        memset(retval, '\\0', dt->entrylen);\n        retval->name = ((char *) retval) + dt->entrylen;\n        strcpy(retval->name, name);\n        hashval = hashPathName(dt, name);\n        retval->hashnext = dt->hash[hashval];\n        dt->hash[hashval] = retval;\n        retval->sibling = parent->children;\n        retval->isdir = isdir;\n        parent->children = retval;\n    } /* if */\n\n    return retval;\n} /* __PHYSFS_DirTreeAdd */\n\n\n/* Find the __PHYSFS_DirTreeEntry for a path in platform-independent notation. */\nvoid *__PHYSFS_DirTreeFind(__PHYSFS_DirTree *dt, const char *path)\n{\n    const int cs = dt->case_sensitive;\n    PHYSFS_uint32 hashval;\n    __PHYSFS_DirTreeEntry *prev = NULL;\n    __PHYSFS_DirTreeEntry *retval;\n\n    if (*path == '\\0')\n        return dt->root;\n\n    hashval = hashPathName(dt, path);\n    for (retval = dt->hash[hashval]; retval; retval = retval->hashnext)\n    {\n        const int cmp = cs ? strcmp(retval->name, path) : PHYSFS_utf8stricmp(retval->name, path);\n        if (cmp == 0)\n        {\n            if (prev != NULL)  /* move this to the front of the list */\n            {\n                prev->hashnext = retval->hashnext;\n                retval->hashnext = dt->hash[hashval];\n                dt->hash[hashval] = retval;\n            } /* if */\n\n            return retval;\n        } /* if */\n\n        prev = retval;\n    } /* for */\n\n    BAIL(PHYSFS_ERR_NOT_FOUND, NULL);\n} /* __PHYSFS_DirTreeFind */\n\nPHYSFS_EnumerateCallbackResult __PHYSFS_DirTreeEnumerate(void *opaque,\n                              const char *dname, PHYSFS_EnumerateCallback cb,\n                              const char *origdir, void *callbackdata)\n{\n    PHYSFS_EnumerateCallbackResult retval = PHYSFS_ENUM_OK;\n    __PHYSFS_DirTree *tree = (__PHYSFS_DirTree *) opaque;\n    const __PHYSFS_DirTreeEntry *entry = __PHYSFS_DirTreeFind(tree, dname);\n    BAIL_IF(!entry, PHYSFS_ERR_NOT_FOUND, PHYSFS_ENUM_ERROR);\n\n    entry = entry->children;\n\n    while (entry && (retval == PHYSFS_ENUM_OK))\n    {\n        const char *name = entry->name;\n        const char *ptr = strrchr(name, '/');\n        retval = cb(callbackdata, origdir, ptr ? ptr + 1 : name);\n        BAIL_IF(retval == PHYSFS_ENUM_ERROR, PHYSFS_ERR_APP_CALLBACK, retval);\n        entry = entry->sibling;\n    } /* while */\n\n    return retval;\n} /* __PHYSFS_DirTreeEnumerate */\n\n\nvoid __PHYSFS_DirTreeDeinit(__PHYSFS_DirTree *dt)\n{\n    if (!dt)\n        return;\n\n    if (dt->root)\n    {\n        assert(dt->root->sibling == NULL);\n        assert(dt->hash || (dt->root->children == NULL));\n        allocator.Free(dt->root);\n    } /* if */\n\n    if (dt->hash)\n    {\n        size_t i;\n        for (i = 0; i < dt->hashBuckets; i++)\n        {\n            __PHYSFS_DirTreeEntry *entry;\n            __PHYSFS_DirTreeEntry *next;\n            for (entry = dt->hash[i]; entry; entry = next)\n            {\n                next = entry->hashnext;\n                allocator.Free(entry);\n            } /* for */\n        } /* for */\n        allocator.Free(dt->hash);\n    } /* if */\n} /* __PHYSFS_DirTreeDeinit */\n\n/* end of physfs.c ... */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs.h",
    "content": "/**\n * \\file physfs.h\n *\n * Main header file for PhysicsFS.\n */\n\n/**\n * \\mainpage PhysicsFS\n *\n * The latest version of PhysicsFS can be found at:\n *     https://icculus.org/physfs/\n *\n * PhysicsFS; a portable, flexible file i/o abstraction.\n *\n * This API gives you access to a system file system in ways superior to the\n *  stdio or system i/o calls. The brief benefits:\n *\n *   - It's portable.\n *   - It's safe. No file access is permitted outside the specified dirs.\n *   - It's flexible. Archives (.ZIP files) can be used transparently as\n *      directory structures.\n *\n * With PhysicsFS, you have a single writing directory and multiple\n *  directories (the \"search path\") for reading. You can think of this as a\n *  filesystem within a filesystem. If (on Windows) you were to set the\n *  writing directory to \"C:\\MyGame\\MyWritingDirectory\", then no PHYSFS calls\n *  could touch anything above this directory, including the \"C:\\MyGame\" and\n *  \"C:\\\" directories. This prevents an application's internal scripting\n *  language from piddling over c:\\\\config.sys, for example. If you'd rather\n *  give PHYSFS full access to the system's REAL file system, set the writing\n *  dir to \"C:\\\", but that's generally A Bad Thing for several reasons.\n *\n * Drive letters are hidden in PhysicsFS once you set up your initial paths.\n *  The search path creates a single, hierarchical directory structure.\n *  Not only does this lend itself well to general abstraction with archives,\n *  it also gives better support to operating systems like MacOS and Unix.\n *  Generally speaking, you shouldn't ever hardcode a drive letter; not only\n *  does this hurt portability to non-Microsoft OSes, but it limits your win32\n *  users to a single drive, too. Use the PhysicsFS abstraction functions and\n *  allow user-defined configuration options, too. When opening a file, you\n *  specify it like it was on a Unix filesystem: if you want to write to\n *  \"C:\\MyGame\\MyConfigFiles\\game.cfg\", then you might set the write dir to\n *  \"C:\\MyGame\" and then open \"MyConfigFiles/game.cfg\". This gives an\n *  abstraction across all platforms. Specifying a file in this way is termed\n *  \"platform-independent notation\" in this documentation. Specifying a\n *  a filename in a form such as \"C:\\mydir\\myfile\" or\n *  \"MacOS hard drive:My Directory:My File\" is termed \"platform-dependent\n *  notation\". The only time you use platform-dependent notation is when\n *  setting up your write directory and search path; after that, all file\n *  access into those directories are done with platform-independent notation.\n *\n * All files opened for writing are opened in relation to the write directory,\n *  which is the root of the writable filesystem. When opening a file for\n *  reading, PhysicsFS goes through the search path. This is NOT the\n *  same thing as the PATH environment variable. An application using\n *  PhysicsFS specifies directories to be searched which may be actual\n *  directories, or archive files that contain files and subdirectories of\n *  their own. See the end of these docs for currently supported archive\n *  formats.\n *\n * Once the search path is defined, you may open files for reading. If you've\n *  got the following search path defined (to use a win32 example again):\n *\n *  - C:\\\\mygame\n *  - C:\\\\mygame\\\\myuserfiles\n *  - D:\\\\mygamescdromdatafiles\n *  - C:\\\\mygame\\\\installeddatafiles.zip\n *\n * Then a call to PHYSFS_openRead(\"textfiles/myfile.txt\") (note the directory\n *  separator, lack of drive letter, and lack of dir separator at the start of\n *  the string; this is platform-independent notation) will check for\n *  C:\\\\mygame\\\\textfiles\\\\myfile.txt, then\n *  C:\\\\mygame\\\\myuserfiles\\\\textfiles\\\\myfile.txt, then\n *  D:\\\\mygamescdromdatafiles\\\\textfiles\\\\myfile.txt, then, finally, for\n *  textfiles\\\\myfile.txt inside of C:\\\\mygame\\\\installeddatafiles.zip.\n *  Remember that most archive types and platform filesystems store their\n *  filenames in a case-sensitive manner, so you should be careful to specify\n *  it correctly.\n *\n * Files opened through PhysicsFS may NOT contain \".\" or \"..\" or \":\" as dir\n *  elements. Not only are these meaningless on MacOS Classic and/or Unix,\n *  they are a security hole. Also, symbolic links (which can be found in\n *  some archive types and directly in the filesystem on Unix platforms) are\n *  NOT followed until you call PHYSFS_permitSymbolicLinks(). That's left to\n *  your own discretion, as following a symlink can allow for access outside\n *  the write dir and search paths. For portability, there is no mechanism for\n *  creating new symlinks in PhysicsFS.\n *\n * The write dir is not included in the search path unless you specifically\n *  add it. While you CAN change the write dir as many times as you like,\n *  you should probably set it once and stick to it. Remember that your\n *  program will not have permission to write in every directory on Unix and\n *  NT systems.\n *\n * All files are opened in binary mode; there is no endline conversion for\n *  textfiles. Other than that, PhysicsFS has some convenience functions for\n *  platform-independence. There is a function to tell you the current\n *  platform's dir separator (\"\\\\\" on windows, \"/\" on Unix, \":\" on MacOS),\n *  which is needed only to set up your search/write paths. There is a\n *  function to tell you what CD-ROM drives contain accessible discs, and a\n *  function to recommend a good search path, etc.\n *\n * A recommended order for the search path is the write dir, then the base dir,\n *  then the cdrom dir, then any archives discovered. Quake 3 does something\n *  like this, but moves the archives to the start of the search path. Build\n *  Engine games, like Duke Nukem 3D and Blood, place the archives last, and\n *  use the base dir for both searching and writing. There is a helper\n *  function (PHYSFS_setSaneConfig()) that puts together a basic configuration\n *  for you, based on a few parameters. Also see the comments on\n *  PHYSFS_getBaseDir(), and PHYSFS_getPrefDir() for info on what those\n *  are and how they can help you determine an optimal search path.\n *\n * PhysicsFS 2.0 adds the concept of \"mounting\" archives to arbitrary points\n *  in the search path. If a zipfile contains \"maps/level.map\" and you mount\n *  that archive at \"mods/mymod\", then you would have to open\n *  \"mods/mymod/maps/level.map\" to access the file, even though \"mods/mymod\"\n *  isn't actually specified in the .zip file. Unlike the Unix mentality of\n *  mounting a filesystem, \"mods/mymod\" doesn't actually have to exist when\n *  mounting the zipfile. It's a \"virtual\" directory. The mounting mechanism\n *  allows the developer to seperate archives in the tree and avoid trampling\n *  over files when added new archives, such as including mod support in a\n *  game...keeping external content on a tight leash in this manner can be of\n *  utmost importance to some applications.\n *\n * PhysicsFS is mostly thread safe. The errors returned by\n *  PHYSFS_getLastErrorCode() are unique by thread, and library-state-setting\n *  functions are mutex'd. For efficiency, individual file accesses are \n *  not locked, so you can not safely read/write/seek/close/etc the same \n *  file from two threads at the same time. Other race conditions are bugs \n *  that should be reported/patched.\n *\n * While you CAN use stdio/syscall file access in a program that has PHYSFS_*\n *  calls, doing so is not recommended, and you can not directly use system\n *  filehandles with PhysicsFS and vice versa (but as of PhysicsFS 2.1, you\n *  can wrap them in a PHYSFS_Io interface yourself if you wanted to).\n *\n * Note that archives need not be named as such: if you have a ZIP file and\n *  rename it with a .PKG extension, the file will still be recognized as a\n *  ZIP archive by PhysicsFS; the file's contents are used to determine its\n *  type where possible.\n *\n * Currently supported archive types:\n *   - .ZIP (pkZip/WinZip/Info-ZIP compatible)\n *   - .7Z  (7zip archives)\n *   - .ISO (ISO9660 files, CD-ROM images)\n *   - .GRP (Build Engine groupfile archives)\n *   - .PAK (Quake I/II archive format)\n *   - .HOG (Descent I/II/III HOG file archives)\n *   - .MVL (Descent II movielib archives)\n *   - .WAD (DOOM engine archives)\n *   - .VDF (Gothic I/II engine archives)\n *   - .SLB (Independence War archives)\n *\n * String policy for PhysicsFS 2.0 and later:\n *\n * PhysicsFS 1.0 could only deal with null-terminated ASCII strings. All high\n *  ASCII chars resulted in undefined behaviour, and there was no Unicode\n *  support at all. PhysicsFS 2.0 supports Unicode without breaking binary\n *  compatibility with the 1.0 API by using UTF-8 encoding of all strings\n *  passed in and out of the library.\n *\n * All strings passed through PhysicsFS are in null-terminated UTF-8 format.\n *  This means that if all you care about is English (ASCII characters <= 127)\n *  then you just use regular C strings. If you care about Unicode (and you\n *  should!) then you need to figure out what your platform wants, needs, and\n *  offers. If you are on Windows before Win2000 and build with Unicode\n *  support, your TCHAR strings are two bytes per character (this is called\n *  \"UCS-2 encoding\"). Any modern Windows uses UTF-16, which is two bytes\n *  per character for most characters, but some characters are four. You\n *  should convert them to UTF-8 before handing them to PhysicsFS with\n *  PHYSFS_utf8FromUtf16(), which handles both UTF-16 and UCS-2. If you're\n *  using Unix or Mac OS X, your wchar_t strings are four bytes per character\n *  (\"UCS-4 encoding\", sometimes called \"UTF-32\"). Use PHYSFS_utf8FromUcs4().\n *  Mac OS X can give you UTF-8 directly from a CFString or NSString, and many\n *  Unixes generally give you C strings in UTF-8 format everywhere. If you\n *  have a single-byte high ASCII charset, like so-many European \"codepages\"\n *  you may be out of luck. We'll convert from \"Latin1\" to UTF-8 only, and\n *  never back to Latin1. If you're above ASCII 127, all bets are off: move\n *  to Unicode or use your platform's facilities. Passing a C string with\n *  high-ASCII data that isn't UTF-8 encoded will NOT do what you expect!\n *\n * Naturally, there's also PHYSFS_utf8ToUcs2(), PHYSFS_utf8ToUtf16(), and\n *  PHYSFS_utf8ToUcs4() to get data back into a format you like. Behind the\n *  scenes, PhysicsFS will use Unicode where possible: the UTF-8 strings on\n *  Windows will be converted and used with the multibyte Windows APIs, for\n *  example.\n *\n * PhysicsFS offers basic encoding conversion support, but not a whole string\n *  library. Get your stuff into whatever format you can work with.\n *\n * Most platforms supported by PhysicsFS 2.1 and later fully support Unicode.\n *  Some older platforms have been dropped (Windows 95, Mac OS 9). Some, like\n *  OS/2, might be able to convert to a local codepage or will just fail to\n *  open/create the file. Modern OSes (macOS, Linux, Windows, etc) should all\n *  be fine.\n *\n * Many game-specific archivers are seriously unprepared for Unicode (the\n *  Descent HOG/MVL and Build Engine GRP archivers, for example, only offer a\n *  DOS 8.3 filename, for example). Nothing can be done for these, but they\n *  tend to be legacy formats for existing content that was all ASCII (and\n *  thus, valid UTF-8) anyhow. Other formats, like .ZIP, don't explicitly\n *  offer Unicode support, but unofficially expect filenames to be UTF-8\n *  encoded, and thus Just Work. Most everything does the right thing without\n *  bothering you, but it's good to be aware of these nuances in case they\n *  don't.\n *\n *\n * Other stuff:\n *\n * Please see the file LICENSE.txt in the source's root directory for\n *  licensing and redistribution rights.\n *\n * Please see the file CREDITS.txt in the source's \"docs\" directory for\n *  a more or less complete list of who's responsible for this.\n *\n *  \\author Ryan C. Gordon.\n */\n\n#ifndef _INCLUDE_PHYSFS_H_\n#define _INCLUDE_PHYSFS_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if defined(PHYSFS_DECL)\n/* do nothing. */\n#elif defined(PHYSFS_STATIC)\n#define PHYSFS_DECL   /**/\n#elif defined(_WIN32) || defined(__OS2__)\n#define PHYSFS_DECL __declspec(dllexport)\n#elif defined(__SUNPRO_C)\n#define PHYSFS_DECL __global\n#elif ((__GNUC__ >= 3) && (!defined(__EMX__)) && (!defined(sun)))\n#define PHYSFS_DECL __attribute__((visibility(\"default\")))\n#else\n#define PHYSFS_DECL\n#endif\n\n#if defined(PHYSFS_DEPRECATED)\n/* do nothing. */\n#elif (__GNUC__ >= 4)  /* technically, this arrived in gcc 3.1, but oh well. */\n#define PHYSFS_DEPRECATED __attribute__((deprecated))\n#else\n#define PHYSFS_DEPRECATED\n#endif\n\n#if 0  /* !!! FIXME: look into this later. */\n#if defined(PHYSFS_CALL)\n/* do nothing. */\n#elif defined(__WIN32__) && !defined(__GNUC__)\n#define PHYSFS_CALL __cdecl\n#elif defined(__OS2__) || defined(OS2) /* should work across all compilers. */\n#define PHYSFS_CALL _System\n#else\n#define PHYSFS_CALL\n#endif\n#endif\n\n/**\n * \\typedef PHYSFS_uint8\n * \\brief An unsigned, 8-bit integer type.\n */\ntypedef unsigned char         PHYSFS_uint8;\n\n/**\n * \\typedef PHYSFS_sint8\n * \\brief A signed, 8-bit integer type.\n */\ntypedef signed char           PHYSFS_sint8;\n\n/**\n * \\typedef PHYSFS_uint16\n * \\brief An unsigned, 16-bit integer type.\n */\ntypedef unsigned short        PHYSFS_uint16;\n\n/**\n * \\typedef PHYSFS_sint16\n * \\brief A signed, 16-bit integer type.\n */\ntypedef signed short          PHYSFS_sint16;\n\n/**\n * \\typedef PHYSFS_uint32\n * \\brief An unsigned, 32-bit integer type.\n */\ntypedef unsigned int          PHYSFS_uint32;\n\n/**\n * \\typedef PHYSFS_sint32\n * \\brief A signed, 32-bit integer type.\n */\ntypedef signed int            PHYSFS_sint32;\n\n/**\n * \\typedef PHYSFS_uint64\n * \\brief An unsigned, 64-bit integer type.\n * \\warning on platforms without any sort of 64-bit datatype, this is\n *           equivalent to PHYSFS_uint32!\n */\n\n/**\n * \\typedef PHYSFS_sint64\n * \\brief A signed, 64-bit integer type.\n * \\warning on platforms without any sort of 64-bit datatype, this is\n *           equivalent to PHYSFS_sint32!\n */\n\n\n#if (defined PHYSFS_NO_64BIT_SUPPORT)  /* oh well. */\ntypedef PHYSFS_uint32         PHYSFS_uint64;\ntypedef PHYSFS_sint32         PHYSFS_sint64;\n#elif (defined _MSC_VER)\ntypedef signed __int64        PHYSFS_sint64;\ntypedef unsigned __int64      PHYSFS_uint64;\n#else\ntypedef unsigned long long    PHYSFS_uint64;\ntypedef signed long long      PHYSFS_sint64;\n#endif\n\n\n#ifndef DOXYGEN_SHOULD_IGNORE_THIS\n/* Make sure the types really have the right sizes */\n#define PHYSFS_COMPILE_TIME_ASSERT(name, x) \\\n       typedef int PHYSFS_compile_time_assert_##name[(x) * 2 - 1]\n\nPHYSFS_COMPILE_TIME_ASSERT(uint8IsOneByte, sizeof(PHYSFS_uint8) == 1);\nPHYSFS_COMPILE_TIME_ASSERT(sint8IsOneByte, sizeof(PHYSFS_sint8) == 1);\nPHYSFS_COMPILE_TIME_ASSERT(uint16IsTwoBytes, sizeof(PHYSFS_uint16) == 2);\nPHYSFS_COMPILE_TIME_ASSERT(sint16IsTwoBytes, sizeof(PHYSFS_sint16) == 2);\nPHYSFS_COMPILE_TIME_ASSERT(uint32IsFourBytes, sizeof(PHYSFS_uint32) == 4);\nPHYSFS_COMPILE_TIME_ASSERT(sint32IsFourBytes, sizeof(PHYSFS_sint32) == 4);\n\n#ifndef PHYSFS_NO_64BIT_SUPPORT\nPHYSFS_COMPILE_TIME_ASSERT(uint64IsEightBytes, sizeof(PHYSFS_uint64) == 8);\nPHYSFS_COMPILE_TIME_ASSERT(sint64IsEightBytes, sizeof(PHYSFS_sint64) == 8);\n#endif\n\n#undef PHYSFS_COMPILE_TIME_ASSERT\n\n#endif  /* DOXYGEN_SHOULD_IGNORE_THIS */\n\n\n/**\n * \\struct PHYSFS_File\n * \\brief A PhysicsFS file handle.\n *\n * You get a pointer to one of these when you open a file for reading,\n *  writing, or appending via PhysicsFS.\n *\n * As you can see from the lack of meaningful fields, you should treat this\n *  as opaque data. Don't try to manipulate the file handle, just pass the\n *  pointer you got, unmolested, to various PhysicsFS APIs.\n *\n * \\sa PHYSFS_openRead\n * \\sa PHYSFS_openWrite\n * \\sa PHYSFS_openAppend\n * \\sa PHYSFS_close\n * \\sa PHYSFS_read\n * \\sa PHYSFS_write\n * \\sa PHYSFS_seek\n * \\sa PHYSFS_tell\n * \\sa PHYSFS_eof\n * \\sa PHYSFS_setBuffer\n * \\sa PHYSFS_flush\n */\ntypedef struct PHYSFS_File\n{\n    void *opaque;  /**< That's all you get. Don't touch. */\n} PHYSFS_File;\n\n\n/**\n * \\def PHYSFS_file\n * \\brief 1.0 API compatibility define.\n *\n * PHYSFS_file is identical to PHYSFS_File. This #define is here for backwards\n *  compatibility with the 1.0 API, which had an inconsistent capitalization\n *  convention in this case. New code should use PHYSFS_File, as this #define\n *  may go away someday.\n *\n * \\sa PHYSFS_File\n */\n#define PHYSFS_file PHYSFS_File\n\n\n/**\n * \\struct PHYSFS_ArchiveInfo\n * \\brief Information on various PhysicsFS-supported archives.\n *\n * This structure gives you details on what sort of archives are supported\n *  by this implementation of PhysicsFS. Archives tend to be things like\n *  ZIP files and such.\n *\n * \\warning Not all binaries are created equal! PhysicsFS can be built with\n *          or without support for various archives. You can check with\n *          PHYSFS_supportedArchiveTypes() to see if your archive type is\n *          supported.\n *\n * \\sa PHYSFS_supportedArchiveTypes\n * \\sa PHYSFS_registerArchiver\n * \\sa PHYSFS_deregisterArchiver\n */\ntypedef struct PHYSFS_ArchiveInfo\n{\n    const char *extension;   /**< Archive file extension: \"ZIP\", for example. */\n    const char *description; /**< Human-readable archive description. */\n    const char *author;      /**< Person who did support for this archive. */\n    const char *url;         /**< URL related to this archive */\n    int supportsSymlinks;    /**< non-zero if archive offers symbolic links. */\n} PHYSFS_ArchiveInfo;\n\n\n/**\n * \\struct PHYSFS_Version\n * \\brief Information the version of PhysicsFS in use.\n *\n * Represents the library's version as three levels: major revision\n *  (increments with massive changes, additions, and enhancements),\n *  minor revision (increments with backwards-compatible changes to the\n *  major revision), and patchlevel (increments with fixes to the minor\n *  revision).\n *\n * \\sa PHYSFS_VERSION\n * \\sa PHYSFS_getLinkedVersion\n */\ntypedef struct PHYSFS_Version\n{\n    PHYSFS_uint8 major; /**< major revision */\n    PHYSFS_uint8 minor; /**< minor revision */\n    PHYSFS_uint8 patch; /**< patchlevel */\n} PHYSFS_Version;\n\n\n#ifndef DOXYGEN_SHOULD_IGNORE_THIS\n#define PHYSFS_VER_MAJOR 3\n#define PHYSFS_VER_MINOR 2\n#define PHYSFS_VER_PATCH 0\n#endif  /* DOXYGEN_SHOULD_IGNORE_THIS */\n\n\n/* PhysicsFS state stuff ... */\n\n/**\n * \\def PHYSFS_VERSION(x)\n * \\brief Macro to determine PhysicsFS version program was compiled against.\n *\n * This macro fills in a PHYSFS_Version structure with the version of the\n *  library you compiled against. This is determined by what header the\n *  compiler uses. Note that if you dynamically linked the library, you might\n *  have a slightly newer or older version at runtime. That version can be\n *  determined with PHYSFS_getLinkedVersion(), which, unlike PHYSFS_VERSION,\n *  is not a macro.\n *\n * \\param x A pointer to a PHYSFS_Version struct to initialize.\n *\n * \\sa PHYSFS_Version\n * \\sa PHYSFS_getLinkedVersion\n */\n#define PHYSFS_VERSION(x) \\\n{ \\\n    (x)->major = PHYSFS_VER_MAJOR; \\\n    (x)->minor = PHYSFS_VER_MINOR; \\\n    (x)->patch = PHYSFS_VER_PATCH; \\\n}\n\n\n/**\n * \\fn void PHYSFS_getLinkedVersion(PHYSFS_Version *ver)\n * \\brief Get the version of PhysicsFS that is linked against your program.\n *\n * If you are using a shared library (DLL) version of PhysFS, then it is\n *  possible that it will be different than the version you compiled against.\n *\n * This is a real function; the macro PHYSFS_VERSION tells you what version\n *  of PhysFS you compiled against:\n *\n * \\code\n * PHYSFS_Version compiled;\n * PHYSFS_Version linked;\n *\n * PHYSFS_VERSION(&compiled);\n * PHYSFS_getLinkedVersion(&linked);\n * printf(\"We compiled against PhysFS version %d.%d.%d ...\\n\",\n *           compiled.major, compiled.minor, compiled.patch);\n * printf(\"But we linked against PhysFS version %d.%d.%d.\\n\",\n *           linked.major, linked.minor, linked.patch);\n * \\endcode\n *\n * This function may be called safely at any time, even before PHYSFS_init().\n *\n * \\sa PHYSFS_VERSION\n */\nPHYSFS_DECL void PHYSFS_getLinkedVersion(PHYSFS_Version *ver);\n\n\n#ifdef __ANDROID__\ntypedef struct PHYSFS_AndroidInit\n{\n    void *jnienv;\n    void *context;\n} PHYSFS_AndroidInit;\n#endif\n\n/**\n * \\fn int PHYSFS_init(const char *argv0)\n * \\brief Initialize the PhysicsFS library.\n *\n * This must be called before any other PhysicsFS function.\n *\n * This should be called prior to any attempts to change your process's\n *  current working directory.\n *\n * \\warning On Android, argv0 should be a non-NULL pointer to a\n *          PHYSFS_AndroidInit struct. This struct must hold a valid JNIEnv *\n *          and a JNI jobject of a Context (either the application context or\n *          the current Activity is fine). Both are cast to a void * so we\n *          don't need jni.h included wherever physfs.h is. PhysicsFS\n *          uses these objects to query some system details. PhysicsFS does\n *          not hold a reference to the JNIEnv or Context past the call to\n *          PHYSFS_init(). If you pass a NULL here, PHYSFS_init can still\n *          succeed, but PHYSFS_getBaseDir() and PHYSFS_getPrefDir() will be\n *          incorrect.\n *\n *   \\param argv0 the argv[0] string passed to your program's mainline.\n *          This may be NULL on most platforms (such as ones without a\n *          standard main() function), but you should always try to pass\n *          something in here. Many Unix-like systems _need_ to pass argv[0]\n *          from main() in here. See warning about Android, too!\n *  \\return nonzero on success, zero on error. Specifics of the error can be\n *          gleaned from PHYSFS_getLastError().\n *\n * \\sa PHYSFS_deinit\n * \\sa PHYSFS_isInit\n */\nPHYSFS_DECL int PHYSFS_init(const char *argv0);\n\n\n/**\n * \\fn int PHYSFS_deinit(void)\n * \\brief Deinitialize the PhysicsFS library.\n *\n * This closes any files opened via PhysicsFS, blanks the search/write paths,\n *  frees memory, and invalidates all of your file handles.\n *\n * Note that this call can FAIL if there's a file open for writing that\n *  refuses to close (for example, the underlying operating system was\n *  buffering writes to network filesystem, and the fileserver has crashed,\n *  or a hard drive has failed, etc). It is usually best to close all write\n *  handles yourself before calling this function, so that you can gracefully\n *  handle a specific failure.\n *\n * Once successfully deinitialized, PHYSFS_init() can be called again to\n *  restart the subsystem. All default API states are restored at this\n *  point, with the exception of any custom allocator you might have\n *  specified, which survives between initializations.\n *\n *  \\return nonzero on success, zero on error. Specifics of the error can be\n *          gleaned from PHYSFS_getLastError(). If failure, state of PhysFS is\n *          undefined, and probably badly screwed up.\n *\n * \\sa PHYSFS_init\n * \\sa PHYSFS_isInit\n */\nPHYSFS_DECL int PHYSFS_deinit(void);\n\n\n/**\n * \\fn const PHYSFS_ArchiveInfo **PHYSFS_supportedArchiveTypes(void)\n * \\brief Get a list of supported archive types.\n *\n * Get a list of archive types supported by this implementation of PhysicFS.\n *  These are the file formats usable for search path entries. This is for\n *  informational purposes only. Note that the extension listed is merely\n *  convention: if we list \"ZIP\", you can open a PkZip-compatible archive\n *  with an extension of \"XYZ\", if you like.\n *\n * The returned value is an array of pointers to PHYSFS_ArchiveInfo structures,\n *  with a NULL entry to signify the end of the list:\n *\n * \\code\n * PHYSFS_ArchiveInfo **i;\n *\n * for (i = PHYSFS_supportedArchiveTypes(); *i != NULL; i++)\n * {\n *     printf(\"Supported archive: [%s], which is [%s].\\n\",\n *              (*i)->extension, (*i)->description);\n * }\n * \\endcode\n *\n * The return values are pointers to internal memory, and should\n *  be considered READ ONLY, and never freed. The returned values are\n *  valid until the next call to PHYSFS_deinit(), PHYSFS_registerArchiver(),\n *  or PHYSFS_deregisterArchiver().\n *\n *   \\return READ ONLY Null-terminated array of READ ONLY structures.\n *\n * \\sa PHYSFS_registerArchiver\n * \\sa PHYSFS_deregisterArchiver\n */\nPHYSFS_DECL const PHYSFS_ArchiveInfo **PHYSFS_supportedArchiveTypes(void);\n\n\n/**\n * \\fn void PHYSFS_freeList(void *listVar)\n * \\brief Deallocate resources of lists returned by PhysicsFS.\n *\n * Certain PhysicsFS functions return lists of information that are\n *  dynamically allocated. Use this function to free those resources.\n *\n * It is safe to pass a NULL here, but doing so will cause a crash in versions\n *  before PhysicsFS 2.1.0.\n *\n *   \\param listVar List of information specified as freeable by this function.\n *                  Passing NULL is safe; it is a valid no-op.\n *\n * \\sa PHYSFS_getCdRomDirs\n * \\sa PHYSFS_enumerateFiles\n * \\sa PHYSFS_getSearchPath\n */\nPHYSFS_DECL void PHYSFS_freeList(void *listVar);\n\n\n/**\n * \\fn const char *PHYSFS_getLastError(void)\n * \\brief Get human-readable error information.\n *\n * \\deprecated Use PHYSFS_getLastErrorCode() and PHYSFS_getErrorByCode() instead.\n *\n * \\warning As of PhysicsFS 2.1, this function has been nerfed.\n *          Before PhysicsFS 2.1, this function was the only way to get\n *          error details beyond a given function's basic return value.\n *          This was meant to be a human-readable string in one of several\n *          languages, and was not useful for application parsing. This was\n *          a problem, because the developer and not the user chose the\n *          language at compile time, and the PhysicsFS maintainers had\n *          to (poorly) maintain a significant amount of localization work.\n *          The app couldn't parse the strings, even if they counted on a\n *          specific language, since some were dynamically generated.\n *          In 2.1 and later, this always returns a static string in\n *          English; you may use it as a key string for your own\n *          localizations if you like, as we'll promise not to change\n *          existing error strings. Also, if your application wants to\n *          look at specific errors, we now offer a better option:\n *          use PHYSFS_getLastErrorCode() instead.\n *\n * Get the last PhysicsFS error message as a human-readable, null-terminated\n *  string. This will return NULL if there's been no error since the last call\n *  to this function. The pointer returned by this call points to an internal\n *  buffer. Each thread has a unique error state associated with it, but each\n *  time a new error message is set, it will overwrite the previous one\n *  associated with that thread. It is safe to call this function at anytime,\n *  even before PHYSFS_init().\n *\n * PHYSFS_getLastError() and PHYSFS_getLastErrorCode() both reset the same\n *  thread-specific error state. Calling one will wipe out the other's\n *  data. If you need both, call PHYSFS_getLastErrorCode(), then pass that\n *  value to PHYSFS_getErrorByCode().\n *\n * As of PhysicsFS 2.1, this function only presents text in the English\n *  language, but the strings are static, so you can use them as keys into\n *  your own localization dictionary. These strings are meant to be passed on\n *  directly to the user.\n *\n * Generally, applications should only concern themselves with whether a\n *  given function failed; however, if your code require more specifics, you\n *  should use PHYSFS_getLastErrorCode() instead of this function.\n *\n *   \\return READ ONLY string of last error message.\n *\n * \\sa PHYSFS_getLastErrorCode\n * \\sa PHYSFS_getErrorByCode\n */\nPHYSFS_DECL const char *PHYSFS_getLastError(void) PHYSFS_DEPRECATED;\n\n\n/**\n * \\fn const char *PHYSFS_getDirSeparator(void)\n * \\brief Get platform-dependent dir separator string.\n *\n * This returns \"\\\\\" on win32, \"/\" on Unix, and \":\" on MacOS. It may be more\n *  than one character, depending on the platform, and your code should take\n *  that into account. Note that this is only useful for setting up the\n *  search/write paths, since access into those dirs always use '/'\n *  (platform-independent notation) to separate directories. This is also\n *  handy for getting platform-independent access when using stdio calls.\n *\n *   \\return READ ONLY null-terminated string of platform's dir separator.\n */\nPHYSFS_DECL const char *PHYSFS_getDirSeparator(void);\n\n\n/**\n * \\fn void PHYSFS_permitSymbolicLinks(int allow)\n * \\brief Enable or disable following of symbolic links.\n *\n * Some physical filesystems and archives contain files that are just pointers\n *  to other files. On the physical filesystem, opening such a link will\n *  (transparently) open the file that is pointed to.\n *\n * By default, PhysicsFS will check if a file is really a symlink during open\n *  calls and fail if it is. Otherwise, the link could take you outside the\n *  write and search paths, and compromise security.\n *\n * If you want to take that risk, call this function with a non-zero parameter.\n *  Note that this is more for sandboxing a program's scripting language, in\n *  case untrusted scripts try to compromise the system. Generally speaking,\n *  a user could very well have a legitimate reason to set up a symlink, so\n *  unless you feel there's a specific danger in allowing them, you should\n *  permit them.\n *\n * Symlinks are only explicitly checked when dealing with filenames\n *  in platform-independent notation. That is, when setting up your\n *  search and write paths, etc, symlinks are never checked for.\n *\n * Please note that PHYSFS_stat() will always check the path specified; if\n *  that path is a symlink, it will not be followed in any case. If symlinks\n *  aren't permitted through this function, PHYSFS_stat() ignores them, and\n *  would treat the query as if the path didn't exist at all.\n *\n * Symbolic link permission can be enabled or disabled at any time after\n *  you've called PHYSFS_init(), and is disabled by default.\n *\n *   \\param allow nonzero to permit symlinks, zero to deny linking.\n *\n * \\sa PHYSFS_symbolicLinksPermitted\n */\nPHYSFS_DECL void PHYSFS_permitSymbolicLinks(int allow);\n\n\n/**\n * \\fn char **PHYSFS_getCdRomDirs(void)\n * \\brief Get an array of paths to available CD-ROM drives.\n *\n * The dirs returned are platform-dependent (\"D:\\\" on Win32, \"/cdrom\" or\n *  whatnot on Unix). Dirs are only returned if there is a disc ready and\n *  accessible in the drive. So if you've got two drives (D: and E:), and only\n *  E: has a disc in it, then that's all you get. If the user inserts a disc\n *  in D: and you call this function again, you get both drives. If, on a\n *  Unix box, the user unmounts a disc and remounts it elsewhere, the next\n *  call to this function will reflect that change.\n *\n * This function refers to \"CD-ROM\" media, but it really means \"inserted disc\n *  media,\" such as DVD-ROM, HD-DVD, CDRW, and Blu-Ray discs. It looks for\n *  filesystems, and as such won't report an audio CD, unless there's a\n *  mounted filesystem track on it.\n *\n * The returned value is an array of strings, with a NULL entry to signify the\n *  end of the list:\n *\n * \\code\n * char **cds = PHYSFS_getCdRomDirs();\n * char **i;\n *\n * for (i = cds; *i != NULL; i++)\n *     printf(\"cdrom dir [%s] is available.\\n\", *i);\n *\n * PHYSFS_freeList(cds);\n * \\endcode\n *\n * This call may block while drives spin up. Be forewarned.\n *\n * When you are done with the returned information, you may dispose of the\n *  resources by calling PHYSFS_freeList() with the returned pointer.\n *\n *   \\return Null-terminated array of null-terminated strings.\n *\n * \\sa PHYSFS_getCdRomDirsCallback\n */\nPHYSFS_DECL char **PHYSFS_getCdRomDirs(void);\n\n\n/**\n * \\fn const char *PHYSFS_getBaseDir(void)\n * \\brief Get the path where the application resides.\n *\n * Helper function.\n *\n * Get the \"base dir\". This is the directory where the application was run\n *  from, which is probably the installation directory, and may or may not\n *  be the process's current working directory.\n *\n * You should probably use the base dir in your search path.\n *\n * \\warning On most platforms, this is a directory; on Android, this gives\n *          you the path to the app's package (APK) file. As APK files are\n *          just .zip files, you can mount them in PhysicsFS like regular\n *          directories. You'll probably want to call\n *          PHYSFS_setRoot(basedir, \"/assets\") after mounting to make your\n *          app's actual data available directly without all the Android\n *          metadata and directory offset. Note that if you passed a NULL to\n *          PHYSFS_init(), you will not get the APK file here.\n *\n *  \\return READ ONLY string of base dir in platform-dependent notation.\n *\n * \\sa PHYSFS_getPrefDir\n */\nPHYSFS_DECL const char *PHYSFS_getBaseDir(void);\n\n\n/**\n * \\fn const char *PHYSFS_getUserDir(void)\n * \\brief Get the path where user's home directory resides.\n *\n * \\deprecated As of PhysicsFS 2.1, you probably want PHYSFS_getPrefDir().\n *\n * Helper function.\n *\n * Get the \"user dir\". This is meant to be a suggestion of where a specific\n *  user of the system can store files. On Unix, this is her home directory.\n *  On systems with no concept of multiple home directories (MacOS, win95),\n *  this will default to something like \"C:\\mybasedir\\users\\username\"\n *  where \"username\" will either be the login name, or \"default\" if the\n *  platform doesn't support multiple users, either.\n *\n *  \\return READ ONLY string of user dir in platform-dependent notation.\n *\n * \\sa PHYSFS_getBaseDir\n * \\sa PHYSFS_getPrefDir\n */\nPHYSFS_DECL const char *PHYSFS_getUserDir(void) PHYSFS_DEPRECATED;\n\n\n/**\n * \\fn const char *PHYSFS_getWriteDir(void)\n * \\brief Get path where PhysicsFS will allow file writing.\n *\n * Get the current write dir. The default write dir is NULL.\n *\n *  \\return READ ONLY string of write dir in platform-dependent notation,\n *           OR NULL IF NO WRITE PATH IS CURRENTLY SET.\n *\n * \\sa PHYSFS_setWriteDir\n */\nPHYSFS_DECL const char *PHYSFS_getWriteDir(void);\n\n\n/**\n * \\fn int PHYSFS_setWriteDir(const char *newDir)\n * \\brief Tell PhysicsFS where it may write files.\n *\n * Set a new write dir. This will override the previous setting.\n *\n * This call will fail (and fail to change the write dir) if the current\n *  write dir still has files open in it.\n *\n *   \\param newDir The new directory to be the root of the write dir,\n *                   specified in platform-dependent notation. Setting to NULL\n *                   disables the write dir, so no files can be opened for\n *                   writing via PhysicsFS.\n *  \\return non-zero on success, zero on failure. All attempts to open a file\n *           for writing via PhysicsFS will fail until this call succeeds.\n *           Use PHYSFS_getLastErrorCode() to obtain the specific error.\n *\n * \\sa PHYSFS_getWriteDir\n */\nPHYSFS_DECL int PHYSFS_setWriteDir(const char *newDir);\n\n\n/**\n * \\fn int PHYSFS_addToSearchPath(const char *newDir, int appendToPath)\n * \\brief Add an archive or directory to the search path.\n *\n * \\deprecated As of PhysicsFS 2.0, use PHYSFS_mount() instead. This\n *             function just wraps it anyhow.\n *\n * This function is equivalent to:\n *\n * \\code\n *  PHYSFS_mount(newDir, NULL, appendToPath);\n * \\endcode\n *\n * You must use this and not PHYSFS_mount if binary compatibility with\n *  PhysicsFS 1.0 is important (which it may not be for many people).\n *\n * \\sa PHYSFS_mount\n * \\sa PHYSFS_removeFromSearchPath\n * \\sa PHYSFS_getSearchPath\n */\nPHYSFS_DECL int PHYSFS_addToSearchPath(const char *newDir, int appendToPath)\n                                        PHYSFS_DEPRECATED;\n\n/**\n * \\fn int PHYSFS_removeFromSearchPath(const char *oldDir)\n * \\brief Remove a directory or archive from the search path.\n *\n * \\deprecated As of PhysicsFS 2.1, use PHYSFS_unmount() instead. This\n *             function just wraps it anyhow. There's no functional difference\n *             except the vocabulary changed from \"adding to the search path\"\n *             to \"mounting\" when that functionality was extended, and thus\n *             the preferred way to accomplish this function's work is now\n *             called \"unmounting.\"\n *\n * This function is equivalent to:\n *\n * \\code\n *  PHYSFS_unmount(oldDir);\n * \\endcode\n *\n * You must use this and not PHYSFS_unmount if binary compatibility with\n *  PhysicsFS 1.0 is important (which it may not be for many people).\n *\n * \\sa PHYSFS_addToSearchPath\n * \\sa PHYSFS_getSearchPath\n * \\sa PHYSFS_unmount\n */\nPHYSFS_DECL int PHYSFS_removeFromSearchPath(const char *oldDir)\n                                            PHYSFS_DEPRECATED;\n\n\n/**\n * \\fn char **PHYSFS_getSearchPath(void)\n * \\brief Get the current search path.\n *\n * The default search path is an empty list.\n *\n * The returned value is an array of strings, with a NULL entry to signify the\n *  end of the list:\n *\n * \\code\n * char **i;\n *\n * for (i = PHYSFS_getSearchPath(); *i != NULL; i++)\n *     printf(\"[%s] is in the search path.\\n\", *i);\n * \\endcode\n *\n * When you are done with the returned information, you may dispose of the\n *  resources by calling PHYSFS_freeList() with the returned pointer.\n *\n *   \\return Null-terminated array of null-terminated strings. NULL if there\n *            was a problem (read: OUT OF MEMORY).\n *\n * \\sa PHYSFS_getSearchPathCallback\n * \\sa PHYSFS_addToSearchPath\n * \\sa PHYSFS_removeFromSearchPath\n */\nPHYSFS_DECL char **PHYSFS_getSearchPath(void);\n\n\n/**\n * \\fn int PHYSFS_setSaneConfig(const char *organization, const char *appName, const char *archiveExt, int includeCdRoms, int archivesFirst)\n * \\brief Set up sane, default paths.\n *\n * Helper function.\n *\n * The write dir will be set to the pref dir returned by\n *  \\code PHYSFS_getPrefDir(organization, appName) \\endcode, which is\n *  created if it doesn't exist.\n *\n * The above is sufficient to make sure your program's configuration directory\n *  is separated from other clutter, and platform-independent.\n *\n *  The search path will be:\n *\n *    - The Write Dir (created if it doesn't exist)\n *    - The Base Dir (PHYSFS_getBaseDir())\n *    - All found CD-ROM dirs (optionally)\n *\n * These directories are then searched for files ending with the extension\n *  (archiveExt), which, if they are valid and supported archives, will also\n *  be added to the search path. If you specified \"PKG\" for (archiveExt), and\n *  there's a file named data.PKG in the base dir, it'll be checked. Archives\n *  can either be appended or prepended to the search path in alphabetical\n *  order, regardless of which directories they were found in. All archives\n *  are mounted in the root of the virtual file system (\"/\").\n *\n * All of this can be accomplished from the application, but this just does it\n *  all for you. Feel free to add more to the search path manually, too.\n *\n *    \\param organization Name of your company/group/etc to be used as a\n *                         dirname, so keep it small, and no-frills.\n *\n *    \\param appName Program-specific name of your program, to separate it\n *                   from other programs using PhysicsFS.\n *\n *    \\param archiveExt File extension used by your program to specify an\n *                      archive. For example, Quake 3 uses \"pk3\", even though\n *                      they are just zipfiles. Specify NULL to not dig out\n *                      archives automatically. Do not specify the '.' char;\n *                      If you want to look for ZIP files, specify \"ZIP\" and\n *                      not \".ZIP\" ... the archive search is case-insensitive.\n *\n *    \\param includeCdRoms Non-zero to include CD-ROMs in the search path, and\n *                         (if (archiveExt) != NULL) search them for archives.\n *                         This may cause a significant amount of blocking\n *                         while discs are accessed, and if there are no discs\n *                         in the drive (or even not mounted on Unix systems),\n *                         then they may not be made available anyhow. You may\n *                         want to specify zero and handle the disc setup\n *                         yourself.\n *\n *    \\param archivesFirst Non-zero to prepend the archives to the search path.\n *                         Zero to append them. Ignored if !(archiveExt).\n *\n *  \\return nonzero on success, zero on error. Use PHYSFS_getLastErrorCode()\n *          to obtain the specific error.\n */\nPHYSFS_DECL int PHYSFS_setSaneConfig(const char *organization,\n                                     const char *appName,\n                                     const char *archiveExt,\n                                     int includeCdRoms,\n                                     int archivesFirst);\n\n\n/* Directory management stuff ... */\n\n/**\n * \\fn int PHYSFS_mkdir(const char *dirName)\n * \\brief Create a directory.\n *\n * This is specified in platform-independent notation in relation to the\n *  write dir. All missing parent directories are also created if they\n *  don't exist.\n *\n * So if you've got the write dir set to \"C:\\mygame\\writedir\" and call\n *  PHYSFS_mkdir(\"downloads/maps\") then the directories\n *  \"C:\\mygame\\writedir\\downloads\" and \"C:\\mygame\\writedir\\downloads\\maps\"\n *  will be created if possible. If the creation of \"maps\" fails after we\n *  have successfully created \"downloads\", then the function leaves the\n *  created directory behind and reports failure.\n *\n *   \\param dirName New dir to create.\n *  \\return nonzero on success, zero on error. Use\n *          PHYSFS_getLastErrorCode() to obtain the specific error.\n *\n * \\sa PHYSFS_delete\n */\nPHYSFS_DECL int PHYSFS_mkdir(const char *dirName);\n\n\n/**\n * \\fn int PHYSFS_delete(const char *filename)\n * \\brief Delete a file or directory.\n *\n * (filename) is specified in platform-independent notation in relation to the\n *  write dir.\n *\n * A directory must be empty before this call can delete it.\n *\n * Deleting a symlink will remove the link, not what it points to, regardless\n *  of whether you \"permitSymLinks\" or not.\n *\n * So if you've got the write dir set to \"C:\\mygame\\writedir\" and call\n *  PHYSFS_delete(\"downloads/maps/level1.map\") then the file\n *  \"C:\\mygame\\writedir\\downloads\\maps\\level1.map\" is removed from the\n *  physical filesystem, if it exists and the operating system permits the\n *  deletion.\n *\n * Note that on Unix systems, deleting a file may be successful, but the\n *  actual file won't be removed until all processes that have an open\n *  filehandle to it (including your program) close their handles.\n *\n * Chances are, the bits that make up the file still exist, they are just\n *  made available to be written over at a later point. Don't consider this\n *  a security method or anything.  :)\n *\n *   \\param filename Filename to delete.\n *  \\return nonzero on success, zero on error. Use PHYSFS_getLastErrorCode()\n *          to obtain the specific error.\n */\nPHYSFS_DECL int PHYSFS_delete(const char *filename);\n\n\n/**\n * \\fn const char *PHYSFS_getRealDir(const char *filename)\n * \\brief Figure out where in the search path a file resides.\n *\n * The file is specified in platform-independent notation. The returned\n *  filename will be the element of the search path where the file was found,\n *  which may be a directory, or an archive. Even if there are multiple\n *  matches in different parts of the search path, only the first one found\n *  is used, just like when opening a file.\n *\n * So, if you look for \"maps/level1.map\", and C:\\\\mygame is in your search\n *  path and C:\\\\mygame\\\\maps\\\\level1.map exists, then \"C:\\mygame\" is returned.\n *\n * If a any part of a match is a symbolic link, and you've not explicitly\n *  permitted symlinks, then it will be ignored, and the search for a match\n *  will continue.\n *\n * If you specify a fake directory that only exists as a mount point, it'll\n *  be associated with the first archive mounted there, even though that\n *  directory isn't necessarily contained in a real archive.\n *\n * \\warning This will return NULL if there is no real directory associated\n *          with (filename). Specifically, PHYSFS_mountIo(),\n *          PHYSFS_mountMemory(), and PHYSFS_mountHandle() will return NULL\n *          even if the filename is found in the search path. Plan accordingly.\n *\n *     \\param filename file to look for.\n *    \\return READ ONLY string of element of search path containing the\n *             the file in question. NULL if not found.\n */\nPHYSFS_DECL const char *PHYSFS_getRealDir(const char *filename);\n\n\n/**\n * \\fn char **PHYSFS_enumerateFiles(const char *dir)\n * \\brief Get a file listing of a search path's directory.\n *\n * \\warning In PhysicsFS versions prior to 2.1, this function would return\n *          as many items as it could in the face of a failure condition\n *          (out of memory, disk i/o error, etc). Since this meant apps\n *          couldn't distinguish between complete success and partial failure,\n *          and since the function could always return NULL to report\n *          catastrophic failures anyway, in PhysicsFS 2.1 this function's\n *          policy changed: it will either return a list of complete results\n *          or it will return NULL for any failure of any kind, so we can\n *          guarantee that the enumeration ran to completion and has no gaps\n *          in its results.\n *\n * Matching directories are interpolated. That is, if \"C:\\mydir\" is in the\n *  search path and contains a directory \"savegames\" that contains \"x.sav\",\n *  \"y.sav\", and \"z.sav\", and there is also a \"C:\\userdir\" in the search path\n *  that has a \"savegames\" subdirectory with \"w.sav\", then the following code:\n *\n * \\code\n * char **rc = PHYSFS_enumerateFiles(\"savegames\");\n * char **i;\n *\n * for (i = rc; *i != NULL; i++)\n *     printf(\" * We've got [%s].\\n\", *i);\n *\n * PHYSFS_freeList(rc);\n * \\endcode\n *\n *  \\...will print:\n *\n * \\verbatim\n * We've got [x.sav].\n * We've got [y.sav].\n * We've got [z.sav].\n * We've got [w.sav].\\endverbatim\n *\n * Feel free to sort the list however you like. However, the returned data\n *  will always contain no duplicates, and will be always sorted in alphabetic\n *  (rather: case-sensitive Unicode) order for you.\n *\n * Don't forget to call PHYSFS_freeList() with the return value from this\n *  function when you are done with it.\n *\n *    \\param dir directory in platform-independent notation to enumerate.\n *   \\return Null-terminated array of null-terminated strings, or NULL for\n *           failure cases.\n *\n * \\sa PHYSFS_enumerate\n */\nPHYSFS_DECL char **PHYSFS_enumerateFiles(const char *dir);\n\n\n/**\n * \\fn int PHYSFS_exists(const char *fname)\n * \\brief Determine if a file exists in the search path.\n *\n * Reports true if there is an entry anywhere in the search path by the\n *  name of (fname).\n *\n * Note that entries that are symlinks are ignored if\n *  PHYSFS_permitSymbolicLinks(1) hasn't been called, so you\n *  might end up further down in the search path than expected.\n *\n *    \\param fname filename in platform-independent notation.\n *   \\return non-zero if filename exists. zero otherwise.\n */\nPHYSFS_DECL int PHYSFS_exists(const char *fname);\n\n\n/**\n * \\fn int PHYSFS_isDirectory(const char *fname)\n * \\brief Determine if a file in the search path is really a directory.\n *\n * \\deprecated As of PhysicsFS 2.1, use PHYSFS_stat() instead. This\n *             function just wraps it anyhow.\n *\n * Determine if the first occurence of (fname) in the search path is\n *  really a directory entry.\n *\n * Note that entries that are symlinks are ignored if\n *  PHYSFS_permitSymbolicLinks(1) hasn't been called, so you\n *  might end up further down in the search path than expected.\n *\n *    \\param fname filename in platform-independent notation.\n *   \\return non-zero if filename exists and is a directory.  zero otherwise.\n *\n * \\sa PHYSFS_stat\n * \\sa PHYSFS_exists\n */\nPHYSFS_DECL int PHYSFS_isDirectory(const char *fname) PHYSFS_DEPRECATED;\n\n\n/**\n * \\fn int PHYSFS_isSymbolicLink(const char *fname)\n * \\brief Determine if a file in the search path is really a symbolic link.\n *\n * \\deprecated As of PhysicsFS 2.1, use PHYSFS_stat() instead. This\n *             function just wraps it anyhow.\n *\n * Determine if the first occurence of (fname) in the search path is\n *  really a symbolic link.\n *\n * Note that entries that are symlinks are ignored if\n *  PHYSFS_permitSymbolicLinks(1) hasn't been called, and as such,\n *  this function will always return 0 in that case.\n *\n *    \\param fname filename in platform-independent notation.\n *   \\return non-zero if filename exists and is a symlink.  zero otherwise.\n *\n * \\sa PHYSFS_stat\n * \\sa PHYSFS_exists\n */\nPHYSFS_DECL int PHYSFS_isSymbolicLink(const char *fname) PHYSFS_DEPRECATED;\n\n\n/**\n * \\fn PHYSFS_sint64 PHYSFS_getLastModTime(const char *filename)\n * \\brief Get the last modification time of a file.\n *\n * \\deprecated As of PhysicsFS 2.1, use PHYSFS_stat() instead. This\n *             function just wraps it anyhow.\n *\n * The modtime is returned as a number of seconds since the Unix epoch\n *  (midnight, Jan 1, 1970). The exact derivation and accuracy of this time\n *  depends on the particular archiver. If there is no reasonable way to\n *  obtain this information for a particular archiver, or there was some sort\n *  of error, this function returns (-1).\n *\n * You must use this and not PHYSFS_stat() if binary compatibility with\n *  PhysicsFS 2.0 is important (which it may not be for many people).\n *\n *   \\param filename filename to check, in platform-independent notation.\n *  \\return last modified time of the file. -1 if it can't be determined.\n *\n * \\sa PHYSFS_stat\n */\nPHYSFS_DECL PHYSFS_sint64 PHYSFS_getLastModTime(const char *filename)\n                                                PHYSFS_DEPRECATED;\n\n\n/* i/o stuff... */\n\n/**\n * \\fn PHYSFS_File *PHYSFS_openWrite(const char *filename)\n * \\brief Open a file for writing.\n *\n * Open a file for writing, in platform-independent notation and in relation\n *  to the write dir as the root of the writable filesystem. The specified\n *  file is created if it doesn't exist. If it does exist, it is truncated to\n *  zero bytes, and the writing offset is set to the start.\n *\n * Note that entries that are symlinks are ignored if\n *  PHYSFS_permitSymbolicLinks(1) hasn't been called, and opening a\n *  symlink with this function will fail in such a case.\n *\n *   \\param filename File to open.\n *  \\return A valid PhysicsFS filehandle on success, NULL on error. Use\n *          PHYSFS_getLastErrorCode() to obtain the specific error.\n *\n * \\sa PHYSFS_openRead\n * \\sa PHYSFS_openAppend\n * \\sa PHYSFS_write\n * \\sa PHYSFS_close\n */\nPHYSFS_DECL PHYSFS_File *PHYSFS_openWrite(const char *filename);\n\n\n/**\n * \\fn PHYSFS_File *PHYSFS_openAppend(const char *filename)\n * \\brief Open a file for appending.\n *\n * Open a file for writing, in platform-independent notation and in relation\n *  to the write dir as the root of the writable filesystem. The specified\n *  file is created if it doesn't exist. If it does exist, the writing offset\n *  is set to the end of the file, so the first write will be the byte after\n *  the end.\n *\n * Note that entries that are symlinks are ignored if\n *  PHYSFS_permitSymbolicLinks(1) hasn't been called, and opening a\n *  symlink with this function will fail in such a case.\n *\n *   \\param filename File to open.\n *  \\return A valid PhysicsFS filehandle on success, NULL on error. Use\n *          PHYSFS_getLastErrorCode() to obtain the specific error.\n *\n * \\sa PHYSFS_openRead\n * \\sa PHYSFS_openWrite\n * \\sa PHYSFS_write\n * \\sa PHYSFS_close\n */\nPHYSFS_DECL PHYSFS_File *PHYSFS_openAppend(const char *filename);\n\n\n/**\n * \\fn PHYSFS_File *PHYSFS_openRead(const char *filename)\n * \\brief Open a file for reading.\n *\n * Open a file for reading, in platform-independent notation. The search path\n *  is checked one at a time until a matching file is found, in which case an\n *  abstract filehandle is associated with it, and reading may be done.\n *  The reading offset is set to the first byte of the file.\n *\n * Note that entries that are symlinks are ignored if\n *  PHYSFS_permitSymbolicLinks(1) hasn't been called, and opening a\n *  symlink with this function will fail in such a case.\n *\n *   \\param filename File to open.\n *  \\return A valid PhysicsFS filehandle on success, NULL on error.\n *          Use PHYSFS_getLastErrorCode() to obtain the specific error.\n *\n * \\sa PHYSFS_openWrite\n * \\sa PHYSFS_openAppend\n * \\sa PHYSFS_read\n * \\sa PHYSFS_close\n */\nPHYSFS_DECL PHYSFS_File *PHYSFS_openRead(const char *filename);\n\n\n/**\n * \\fn int PHYSFS_close(PHYSFS_File *handle)\n * \\brief Close a PhysicsFS filehandle.\n *\n * This call is capable of failing if the operating system was buffering\n *  writes to the physical media, and, now forced to write those changes to\n *  physical media, can not store the data for some reason. In such a case,\n *  the filehandle stays open. A well-written program should ALWAYS check the\n *  return value from the close call in addition to every writing call!\n *\n *   \\param handle handle returned from PHYSFS_open*().\n *  \\return nonzero on success, zero on error. Use PHYSFS_getLastErrorCode()\n *          to obtain the specific error.\n *\n * \\sa PHYSFS_openRead\n * \\sa PHYSFS_openWrite\n * \\sa PHYSFS_openAppend\n */\nPHYSFS_DECL int PHYSFS_close(PHYSFS_File *handle);\n\n\n/**\n * \\fn PHYSFS_sint64 PHYSFS_read(PHYSFS_File *handle, void *buffer, PHYSFS_uint32 objSize, PHYSFS_uint32 objCount)\n * \\brief Read data from a PhysicsFS filehandle\n *\n * The file must be opened for reading.\n *\n * \\deprecated As of PhysicsFS 2.1, use PHYSFS_readBytes() instead. This\n *             function just wraps it anyhow. This function never clarified\n *             what would happen if you managed to read a partial object, so\n *             working at the byte level makes this cleaner for everyone,\n *             especially now that PHYSFS_Io interfaces can be supplied by the\n *             application.\n *\n *   \\param handle handle returned from PHYSFS_openRead().\n *   \\param buffer buffer to store read data into.\n *   \\param objSize size in bytes of objects being read from (handle).\n *   \\param objCount number of (objSize) objects to read from (handle).\n *  \\return number of objects read. PHYSFS_getLastErrorCode() can shed light\n *          on the reason this might be < (objCount), as can PHYSFS_eof().\n *          -1 if complete failure.\n *\n * \\sa PHYSFS_readBytes\n * \\sa PHYSFS_eof\n */\nPHYSFS_DECL PHYSFS_sint64 PHYSFS_read(PHYSFS_File *handle,\n                                      void *buffer,\n                                      PHYSFS_uint32 objSize,\n                                      PHYSFS_uint32 objCount)\n                                        PHYSFS_DEPRECATED;\n\n/**\n * \\fn PHYSFS_sint64 PHYSFS_write(PHYSFS_File *handle, const void *buffer, PHYSFS_uint32 objSize, PHYSFS_uint32 objCount)\n * \\brief Write data to a PhysicsFS filehandle\n *\n * The file must be opened for writing.\n *\n * \\deprecated As of PhysicsFS 2.1, use PHYSFS_writeBytes() instead. This\n *             function just wraps it anyhow. This function never clarified\n *             what would happen if you managed to write a partial object, so\n *             working at the byte level makes this cleaner for everyone,\n *             especially now that PHYSFS_Io interfaces can be supplied by the\n *             application.\n *\n *   \\param handle retval from PHYSFS_openWrite() or PHYSFS_openAppend().\n *   \\param buffer buffer of bytes to write to (handle).\n *   \\param objSize size in bytes of objects being written to (handle).\n *   \\param objCount number of (objSize) objects to write to (handle).\n *  \\return number of objects written. PHYSFS_getLastErrorCode() can shed\n *          light on the reason this might be < (objCount). -1 if complete\n *          failure.\n *\n * \\sa PHYSFS_writeBytes\n */\nPHYSFS_DECL PHYSFS_sint64 PHYSFS_write(PHYSFS_File *handle,\n                                       const void *buffer,\n                                       PHYSFS_uint32 objSize,\n                                       PHYSFS_uint32 objCount)\n                                        PHYSFS_DEPRECATED;\n\n\n/* File position stuff... */\n\n/**\n * \\fn int PHYSFS_eof(PHYSFS_File *handle)\n * \\brief Check for end-of-file state on a PhysicsFS filehandle.\n *\n * Determine if the end of file has been reached in a PhysicsFS filehandle.\n *\n *   \\param handle handle returned from PHYSFS_openRead().\n *  \\return nonzero if EOF, zero if not.\n *\n * \\sa PHYSFS_read\n * \\sa PHYSFS_tell\n */\nPHYSFS_DECL int PHYSFS_eof(PHYSFS_File *handle);\n\n\n/**\n * \\fn PHYSFS_sint64 PHYSFS_tell(PHYSFS_File *handle)\n * \\brief Determine current position within a PhysicsFS filehandle.\n *\n *   \\param handle handle returned from PHYSFS_open*().\n *  \\return offset in bytes from start of file. -1 if error occurred.\n *           Use PHYSFS_getLastErrorCode() to obtain the specific error.\n *\n * \\sa PHYSFS_seek\n */\nPHYSFS_DECL PHYSFS_sint64 PHYSFS_tell(PHYSFS_File *handle);\n\n\n/**\n * \\fn int PHYSFS_seek(PHYSFS_File *handle, PHYSFS_uint64 pos)\n * \\brief Seek to a new position within a PhysicsFS filehandle.\n *\n * The next read or write will occur at that place. Seeking past the\n *  beginning or end of the file is not allowed, and causes an error.\n *\n *   \\param handle handle returned from PHYSFS_open*().\n *   \\param pos number of bytes from start of file to seek to.\n *  \\return nonzero on success, zero on error. Use PHYSFS_getLastErrorCode()\n *          to obtain the specific error.\n *\n * \\sa PHYSFS_tell\n */\nPHYSFS_DECL int PHYSFS_seek(PHYSFS_File *handle, PHYSFS_uint64 pos);\n\n\n/**\n * \\fn PHYSFS_sint64 PHYSFS_fileLength(PHYSFS_File *handle)\n * \\brief Get total length of a file in bytes.\n *\n * Note that if another process/thread is writing to this file at the same\n *  time, then the information this function supplies could be incorrect\n *  before you get it. Use with caution, or better yet, don't use at all.\n *\n *   \\param handle handle returned from PHYSFS_open*().\n *  \\return size in bytes of the file. -1 if can't be determined.\n *\n * \\sa PHYSFS_tell\n * \\sa PHYSFS_seek\n */\nPHYSFS_DECL PHYSFS_sint64 PHYSFS_fileLength(PHYSFS_File *handle);\n\n\n/* Buffering stuff... */\n\n/**\n * \\fn int PHYSFS_setBuffer(PHYSFS_File *handle, PHYSFS_uint64 bufsize)\n * \\brief Set up buffering for a PhysicsFS file handle.\n *\n * Define an i/o buffer for a file handle. A memory block of (bufsize) bytes\n *  will be allocated and associated with (handle).\n *\n * For files opened for reading, up to (bufsize) bytes are read from (handle)\n *  and stored in the internal buffer. Calls to PHYSFS_read() will pull\n *  from this buffer until it is empty, and then refill it for more reading.\n *  Note that compressed files, like ZIP archives, will decompress while\n *  buffering, so this can be handy for offsetting CPU-intensive operations.\n *  The buffer isn't filled until you do your next read.\n *\n * For files opened for writing, data will be buffered to memory until the\n *  buffer is full or the buffer is flushed. Closing a handle implicitly\n *  causes a flush...check your return values!\n *\n * Seeking, etc transparently accounts for buffering.\n *\n * You can resize an existing buffer by calling this function more than once\n *  on the same file. Setting the buffer size to zero will free an existing\n *  buffer.\n *\n * PhysicsFS file handles are unbuffered by default.\n *\n * Please check the return value of this function! Failures can include\n *  not being able to seek backwards in a read-only file when removing the\n *  buffer, not being able to allocate the buffer, and not being able to\n *  flush the buffer to disk, among other unexpected problems.\n *\n *   \\param handle handle returned from PHYSFS_open*().\n *   \\param bufsize size, in bytes, of buffer to allocate.\n *  \\return nonzero if successful, zero on error.\n *\n * \\sa PHYSFS_flush\n * \\sa PHYSFS_read\n * \\sa PHYSFS_write\n * \\sa PHYSFS_close\n */\nPHYSFS_DECL int PHYSFS_setBuffer(PHYSFS_File *handle, PHYSFS_uint64 bufsize);\n\n\n/**\n * \\fn int PHYSFS_flush(PHYSFS_File *handle)\n * \\brief Flush a buffered PhysicsFS file handle.\n *\n * For buffered files opened for writing, this will put the current contents\n *  of the buffer to disk and flag the buffer as empty if possible.\n *\n * For buffered files opened for reading or unbuffered files, this is a safe\n *  no-op, and will report success.\n *\n *   \\param handle handle returned from PHYSFS_open*().\n *  \\return nonzero if successful, zero on error.\n *\n * \\sa PHYSFS_setBuffer\n * \\sa PHYSFS_close\n */\nPHYSFS_DECL int PHYSFS_flush(PHYSFS_File *handle);\n\n\n/* Byteorder stuff... */\n\n/**\n * \\fn PHYSFS_sint16 PHYSFS_swapSLE16(PHYSFS_sint16 val)\n * \\brief Swap littleendian signed 16 to platform's native byte order.\n *\n * Take a 16-bit signed value in littleendian format and convert it to\n *  the platform's native byte order.\n *\n *    \\param val value to convert\n *   \\return converted value.\n */\nPHYSFS_DECL PHYSFS_sint16 PHYSFS_swapSLE16(PHYSFS_sint16 val);\n\n\n/**\n * \\fn PHYSFS_uint16 PHYSFS_swapULE16(PHYSFS_uint16 val)\n * \\brief Swap littleendian unsigned 16 to platform's native byte order.\n *\n * Take a 16-bit unsigned value in littleendian format and convert it to\n *  the platform's native byte order.\n *\n *    \\param val value to convert\n *   \\return converted value.\n */\nPHYSFS_DECL PHYSFS_uint16 PHYSFS_swapULE16(PHYSFS_uint16 val);\n\n/**\n * \\fn PHYSFS_sint32 PHYSFS_swapSLE32(PHYSFS_sint32 val)\n * \\brief Swap littleendian signed 32 to platform's native byte order.\n *\n * Take a 32-bit signed value in littleendian format and convert it to\n *  the platform's native byte order.\n *\n *    \\param val value to convert\n *   \\return converted value.\n */\nPHYSFS_DECL PHYSFS_sint32 PHYSFS_swapSLE32(PHYSFS_sint32 val);\n\n\n/**\n * \\fn PHYSFS_uint32 PHYSFS_swapULE32(PHYSFS_uint32 val)\n * \\brief Swap littleendian unsigned 32 to platform's native byte order.\n *\n * Take a 32-bit unsigned value in littleendian format and convert it to\n *  the platform's native byte order.\n *\n *    \\param val value to convert\n *   \\return converted value.\n */\nPHYSFS_DECL PHYSFS_uint32 PHYSFS_swapULE32(PHYSFS_uint32 val);\n\n/**\n * \\fn PHYSFS_sint64 PHYSFS_swapSLE64(PHYSFS_sint64 val)\n * \\brief Swap littleendian signed 64 to platform's native byte order.\n *\n * Take a 64-bit signed value in littleendian format and convert it to\n *  the platform's native byte order.\n *\n *    \\param val value to convert\n *   \\return converted value.\n *\n * \\warning Remember, PHYSFS_sint64 is only 32 bits on platforms without\n *          any sort of 64-bit support.\n */\nPHYSFS_DECL PHYSFS_sint64 PHYSFS_swapSLE64(PHYSFS_sint64 val);\n\n\n/**\n * \\fn PHYSFS_uint64 PHYSFS_swapULE64(PHYSFS_uint64 val)\n * \\brief Swap littleendian unsigned 64 to platform's native byte order.\n *\n * Take a 64-bit unsigned value in littleendian format and convert it to\n *  the platform's native byte order.\n *\n *    \\param val value to convert\n *   \\return converted value.\n *\n * \\warning Remember, PHYSFS_uint64 is only 32 bits on platforms without\n *          any sort of 64-bit support.\n */\nPHYSFS_DECL PHYSFS_uint64 PHYSFS_swapULE64(PHYSFS_uint64 val);\n\n\n/**\n * \\fn PHYSFS_sint16 PHYSFS_swapSBE16(PHYSFS_sint16 val)\n * \\brief Swap bigendian signed 16 to platform's native byte order.\n *\n * Take a 16-bit signed value in bigendian format and convert it to\n *  the platform's native byte order.\n *\n *    \\param val value to convert\n *   \\return converted value.\n */\nPHYSFS_DECL PHYSFS_sint16 PHYSFS_swapSBE16(PHYSFS_sint16 val);\n\n\n/**\n * \\fn PHYSFS_uint16 PHYSFS_swapUBE16(PHYSFS_uint16 val)\n * \\brief Swap bigendian unsigned 16 to platform's native byte order.\n *\n * Take a 16-bit unsigned value in bigendian format and convert it to\n *  the platform's native byte order.\n *\n *    \\param val value to convert\n *   \\return converted value.\n */\nPHYSFS_DECL PHYSFS_uint16 PHYSFS_swapUBE16(PHYSFS_uint16 val);\n\n/**\n * \\fn PHYSFS_sint32 PHYSFS_swapSBE32(PHYSFS_sint32 val)\n * \\brief Swap bigendian signed 32 to platform's native byte order.\n *\n * Take a 32-bit signed value in bigendian format and convert it to\n *  the platform's native byte order.\n *\n *    \\param val value to convert\n *   \\return converted value.\n */\nPHYSFS_DECL PHYSFS_sint32 PHYSFS_swapSBE32(PHYSFS_sint32 val);\n\n\n/**\n * \\fn PHYSFS_uint32 PHYSFS_swapUBE32(PHYSFS_uint32 val)\n * \\brief Swap bigendian unsigned 32 to platform's native byte order.\n *\n * Take a 32-bit unsigned value in bigendian format and convert it to\n *  the platform's native byte order.\n *\n *    \\param val value to convert\n *   \\return converted value.\n */\nPHYSFS_DECL PHYSFS_uint32 PHYSFS_swapUBE32(PHYSFS_uint32 val);\n\n\n/**\n * \\fn PHYSFS_sint64 PHYSFS_swapSBE64(PHYSFS_sint64 val)\n * \\brief Swap bigendian signed 64 to platform's native byte order.\n *\n * Take a 64-bit signed value in bigendian format and convert it to\n *  the platform's native byte order.\n *\n *    \\param val value to convert\n *   \\return converted value.\n *\n * \\warning Remember, PHYSFS_sint64 is only 32 bits on platforms without\n *          any sort of 64-bit support.\n */\nPHYSFS_DECL PHYSFS_sint64 PHYSFS_swapSBE64(PHYSFS_sint64 val);\n\n\n/**\n * \\fn PHYSFS_uint64 PHYSFS_swapUBE64(PHYSFS_uint64 val)\n * \\brief Swap bigendian unsigned 64 to platform's native byte order.\n *\n * Take a 64-bit unsigned value in bigendian format and convert it to\n *  the platform's native byte order.\n *\n *    \\param val value to convert\n *   \\return converted value.\n *\n * \\warning Remember, PHYSFS_uint64 is only 32 bits on platforms without\n *          any sort of 64-bit support.\n */\nPHYSFS_DECL PHYSFS_uint64 PHYSFS_swapUBE64(PHYSFS_uint64 val);\n\n\n/**\n * \\fn int PHYSFS_readSLE16(PHYSFS_File *file, PHYSFS_sint16 *val)\n * \\brief Read and convert a signed 16-bit littleendian value.\n *\n * Convenience function. Read a signed 16-bit littleendian value from a\n *  file and convert it to the platform's native byte order.\n *\n *    \\param file PhysicsFS file handle from which to read.\n *    \\param val pointer to where value should be stored.\n *   \\return zero on failure, non-zero on success. If successful, (*val) will\n *           store the result. On failure, you can find out what went wrong\n *           from PHYSFS_getLastErrorCode().\n */\nPHYSFS_DECL int PHYSFS_readSLE16(PHYSFS_File *file, PHYSFS_sint16 *val);\n\n\n/**\n * \\fn int PHYSFS_readULE16(PHYSFS_File *file, PHYSFS_uint16 *val)\n * \\brief Read and convert an unsigned 16-bit littleendian value.\n *\n * Convenience function. Read an unsigned 16-bit littleendian value from a\n *  file and convert it to the platform's native byte order.\n *\n *    \\param file PhysicsFS file handle from which to read.\n *    \\param val pointer to where value should be stored.\n *   \\return zero on failure, non-zero on success. If successful, (*val) will\n *           store the result. On failure, you can find out what went wrong\n *           from PHYSFS_getLastErrorCode().\n *\n */\nPHYSFS_DECL int PHYSFS_readULE16(PHYSFS_File *file, PHYSFS_uint16 *val);\n\n\n/**\n * \\fn int PHYSFS_readSBE16(PHYSFS_File *file, PHYSFS_sint16 *val)\n * \\brief Read and convert a signed 16-bit bigendian value.\n *\n * Convenience function. Read a signed 16-bit bigendian value from a\n *  file and convert it to the platform's native byte order.\n *\n *    \\param file PhysicsFS file handle from which to read.\n *    \\param val pointer to where value should be stored.\n *   \\return zero on failure, non-zero on success. If successful, (*val) will\n *           store the result. On failure, you can find out what went wrong\n *           from PHYSFS_getLastErrorCode().\n */\nPHYSFS_DECL int PHYSFS_readSBE16(PHYSFS_File *file, PHYSFS_sint16 *val);\n\n\n/**\n * \\fn int PHYSFS_readUBE16(PHYSFS_File *file, PHYSFS_uint16 *val)\n * \\brief Read and convert an unsigned 16-bit bigendian value.\n *\n * Convenience function. Read an unsigned 16-bit bigendian value from a\n *  file and convert it to the platform's native byte order.\n *\n *    \\param file PhysicsFS file handle from which to read.\n *    \\param val pointer to where value should be stored.\n *   \\return zero on failure, non-zero on success. If successful, (*val) will\n *           store the result. On failure, you can find out what went wrong\n *           from PHYSFS_getLastErrorCode().\n *\n */\nPHYSFS_DECL int PHYSFS_readUBE16(PHYSFS_File *file, PHYSFS_uint16 *val);\n\n\n/**\n * \\fn int PHYSFS_readSLE32(PHYSFS_File *file, PHYSFS_sint32 *val)\n * \\brief Read and convert a signed 32-bit littleendian value.\n *\n * Convenience function. Read a signed 32-bit littleendian value from a\n *  file and convert it to the platform's native byte order.\n *\n *    \\param file PhysicsFS file handle from which to read.\n *    \\param val pointer to where value should be stored.\n *   \\return zero on failure, non-zero on success. If successful, (*val) will\n *           store the result. On failure, you can find out what went wrong\n *           from PHYSFS_getLastErrorCode().\n */\nPHYSFS_DECL int PHYSFS_readSLE32(PHYSFS_File *file, PHYSFS_sint32 *val);\n\n\n/**\n * \\fn int PHYSFS_readULE32(PHYSFS_File *file, PHYSFS_uint32 *val)\n * \\brief Read and convert an unsigned 32-bit littleendian value.\n *\n * Convenience function. Read an unsigned 32-bit littleendian value from a\n *  file and convert it to the platform's native byte order.\n *\n *    \\param file PhysicsFS file handle from which to read.\n *    \\param val pointer to where value should be stored.\n *   \\return zero on failure, non-zero on success. If successful, (*val) will\n *           store the result. On failure, you can find out what went wrong\n *           from PHYSFS_getLastErrorCode().\n *\n */\nPHYSFS_DECL int PHYSFS_readULE32(PHYSFS_File *file, PHYSFS_uint32 *val);\n\n\n/**\n * \\fn int PHYSFS_readSBE32(PHYSFS_File *file, PHYSFS_sint32 *val)\n * \\brief Read and convert a signed 32-bit bigendian value.\n *\n * Convenience function. Read a signed 32-bit bigendian value from a\n *  file and convert it to the platform's native byte order.\n *\n *    \\param file PhysicsFS file handle from which to read.\n *    \\param val pointer to where value should be stored.\n *   \\return zero on failure, non-zero on success. If successful, (*val) will\n *           store the result. On failure, you can find out what went wrong\n *           from PHYSFS_getLastErrorCode().\n */\nPHYSFS_DECL int PHYSFS_readSBE32(PHYSFS_File *file, PHYSFS_sint32 *val);\n\n\n/**\n * \\fn int PHYSFS_readUBE32(PHYSFS_File *file, PHYSFS_uint32 *val)\n * \\brief Read and convert an unsigned 32-bit bigendian value.\n *\n * Convenience function. Read an unsigned 32-bit bigendian value from a\n *  file and convert it to the platform's native byte order.\n *\n *    \\param file PhysicsFS file handle from which to read.\n *    \\param val pointer to where value should be stored.\n *   \\return zero on failure, non-zero on success. If successful, (*val) will\n *           store the result. On failure, you can find out what went wrong\n *           from PHYSFS_getLastErrorCode().\n *\n */\nPHYSFS_DECL int PHYSFS_readUBE32(PHYSFS_File *file, PHYSFS_uint32 *val);\n\n\n/**\n * \\fn int PHYSFS_readSLE64(PHYSFS_File *file, PHYSFS_sint64 *val)\n * \\brief Read and convert a signed 64-bit littleendian value.\n *\n * Convenience function. Read a signed 64-bit littleendian value from a\n *  file and convert it to the platform's native byte order.\n *\n *    \\param file PhysicsFS file handle from which to read.\n *    \\param val pointer to where value should be stored.\n *   \\return zero on failure, non-zero on success. If successful, (*val) will\n *           store the result. On failure, you can find out what went wrong\n *           from PHYSFS_getLastErrorCode().\n *\n * \\warning Remember, PHYSFS_sint64 is only 32 bits on platforms without\n *          any sort of 64-bit support.\n */\nPHYSFS_DECL int PHYSFS_readSLE64(PHYSFS_File *file, PHYSFS_sint64 *val);\n\n\n/**\n * \\fn int PHYSFS_readULE64(PHYSFS_File *file, PHYSFS_uint64 *val)\n * \\brief Read and convert an unsigned 64-bit littleendian value.\n *\n * Convenience function. Read an unsigned 64-bit littleendian value from a\n *  file and convert it to the platform's native byte order.\n *\n *    \\param file PhysicsFS file handle from which to read.\n *    \\param val pointer to where value should be stored.\n *   \\return zero on failure, non-zero on success. If successful, (*val) will\n *           store the result. On failure, you can find out what went wrong\n *           from PHYSFS_getLastErrorCode().\n *\n * \\warning Remember, PHYSFS_uint64 is only 32 bits on platforms without\n *          any sort of 64-bit support.\n */\nPHYSFS_DECL int PHYSFS_readULE64(PHYSFS_File *file, PHYSFS_uint64 *val);\n\n\n/**\n * \\fn int PHYSFS_readSBE64(PHYSFS_File *file, PHYSFS_sint64 *val)\n * \\brief Read and convert a signed 64-bit bigendian value.\n *\n * Convenience function. Read a signed 64-bit bigendian value from a\n *  file and convert it to the platform's native byte order.\n *\n *    \\param file PhysicsFS file handle from which to read.\n *    \\param val pointer to where value should be stored.\n *   \\return zero on failure, non-zero on success. If successful, (*val) will\n *           store the result. On failure, you can find out what went wrong\n *           from PHYSFS_getLastErrorCode().\n *\n * \\warning Remember, PHYSFS_sint64 is only 32 bits on platforms without\n *          any sort of 64-bit support.\n */\nPHYSFS_DECL int PHYSFS_readSBE64(PHYSFS_File *file, PHYSFS_sint64 *val);\n\n\n/**\n * \\fn int PHYSFS_readUBE64(PHYSFS_File *file, PHYSFS_uint64 *val)\n * \\brief Read and convert an unsigned 64-bit bigendian value.\n *\n * Convenience function. Read an unsigned 64-bit bigendian value from a\n *  file and convert it to the platform's native byte order.\n *\n *    \\param file PhysicsFS file handle from which to read.\n *    \\param val pointer to where value should be stored.\n *   \\return zero on failure, non-zero on success. If successful, (*val) will\n *           store the result. On failure, you can find out what went wrong\n *           from PHYSFS_getLastErrorCode().\n *\n * \\warning Remember, PHYSFS_uint64 is only 32 bits on platforms without\n *          any sort of 64-bit support.\n */\nPHYSFS_DECL int PHYSFS_readUBE64(PHYSFS_File *file, PHYSFS_uint64 *val);\n\n\n/**\n * \\fn int PHYSFS_writeSLE16(PHYSFS_File *file, PHYSFS_sint16 val)\n * \\brief Convert and write a signed 16-bit littleendian value.\n *\n * Convenience function. Convert a signed 16-bit value from the platform's\n *  native byte order to littleendian and write it to a file.\n *\n *    \\param file PhysicsFS file handle to which to write.\n *    \\param val Value to convert and write.\n *   \\return zero on failure, non-zero on success. On failure, you can\n *           find out what went wrong from PHYSFS_getLastErrorCode().\n */\nPHYSFS_DECL int PHYSFS_writeSLE16(PHYSFS_File *file, PHYSFS_sint16 val);\n\n\n/**\n * \\fn int PHYSFS_writeULE16(PHYSFS_File *file, PHYSFS_uint16 val)\n * \\brief Convert and write an unsigned 16-bit littleendian value.\n *\n * Convenience function. Convert an unsigned 16-bit value from the platform's\n *  native byte order to littleendian and write it to a file.\n *\n *    \\param file PhysicsFS file handle to which to write.\n *    \\param val Value to convert and write.\n *   \\return zero on failure, non-zero on success. On failure, you can\n *           find out what went wrong from PHYSFS_getLastErrorCode().\n */\nPHYSFS_DECL int PHYSFS_writeULE16(PHYSFS_File *file, PHYSFS_uint16 val);\n\n\n/**\n * \\fn int PHYSFS_writeSBE16(PHYSFS_File *file, PHYSFS_sint16 val)\n * \\brief Convert and write a signed 16-bit bigendian value.\n *\n * Convenience function. Convert a signed 16-bit value from the platform's\n *  native byte order to bigendian and write it to a file.\n *\n *    \\param file PhysicsFS file handle to which to write.\n *    \\param val Value to convert and write.\n *   \\return zero on failure, non-zero on success. On failure, you can\n *           find out what went wrong from PHYSFS_getLastErrorCode().\n */\nPHYSFS_DECL int PHYSFS_writeSBE16(PHYSFS_File *file, PHYSFS_sint16 val);\n\n\n/**\n * \\fn int PHYSFS_writeUBE16(PHYSFS_File *file, PHYSFS_uint16 val)\n * \\brief Convert and write an unsigned 16-bit bigendian value.\n *\n * Convenience function. Convert an unsigned 16-bit value from the platform's\n *  native byte order to bigendian and write it to a file.\n *\n *    \\param file PhysicsFS file handle to which to write.\n *    \\param val Value to convert and write.\n *   \\return zero on failure, non-zero on success. On failure, you can\n *           find out what went wrong from PHYSFS_getLastErrorCode().\n */\nPHYSFS_DECL int PHYSFS_writeUBE16(PHYSFS_File *file, PHYSFS_uint16 val);\n\n\n/**\n * \\fn int PHYSFS_writeSLE32(PHYSFS_File *file, PHYSFS_sint32 val)\n * \\brief Convert and write a signed 32-bit littleendian value.\n *\n * Convenience function. Convert a signed 32-bit value from the platform's\n *  native byte order to littleendian and write it to a file.\n *\n *    \\param file PhysicsFS file handle to which to write.\n *    \\param val Value to convert and write.\n *   \\return zero on failure, non-zero on success. On failure, you can\n *           find out what went wrong from PHYSFS_getLastErrorCode().\n */\nPHYSFS_DECL int PHYSFS_writeSLE32(PHYSFS_File *file, PHYSFS_sint32 val);\n\n\n/**\n * \\fn int PHYSFS_writeULE32(PHYSFS_File *file, PHYSFS_uint32 val)\n * \\brief Convert and write an unsigned 32-bit littleendian value.\n *\n * Convenience function. Convert an unsigned 32-bit value from the platform's\n *  native byte order to littleendian and write it to a file.\n *\n *    \\param file PhysicsFS file handle to which to write.\n *    \\param val Value to convert and write.\n *   \\return zero on failure, non-zero on success. On failure, you can\n *           find out what went wrong from PHYSFS_getLastErrorCode().\n */\nPHYSFS_DECL int PHYSFS_writeULE32(PHYSFS_File *file, PHYSFS_uint32 val);\n\n\n/**\n * \\fn int PHYSFS_writeSBE32(PHYSFS_File *file, PHYSFS_sint32 val)\n * \\brief Convert and write a signed 32-bit bigendian value.\n *\n * Convenience function. Convert a signed 32-bit value from the platform's\n *  native byte order to bigendian and write it to a file.\n *\n *    \\param file PhysicsFS file handle to which to write.\n *    \\param val Value to convert and write.\n *   \\return zero on failure, non-zero on success. On failure, you can\n *           find out what went wrong from PHYSFS_getLastErrorCode().\n */\nPHYSFS_DECL int PHYSFS_writeSBE32(PHYSFS_File *file, PHYSFS_sint32 val);\n\n\n/**\n * \\fn int PHYSFS_writeUBE32(PHYSFS_File *file, PHYSFS_uint32 val)\n * \\brief Convert and write an unsigned 32-bit bigendian value.\n *\n * Convenience function. Convert an unsigned 32-bit value from the platform's\n *  native byte order to bigendian and write it to a file.\n *\n *    \\param file PhysicsFS file handle to which to write.\n *    \\param val Value to convert and write.\n *   \\return zero on failure, non-zero on success. On failure, you can\n *           find out what went wrong from PHYSFS_getLastErrorCode().\n */\nPHYSFS_DECL int PHYSFS_writeUBE32(PHYSFS_File *file, PHYSFS_uint32 val);\n\n\n/**\n * \\fn int PHYSFS_writeSLE64(PHYSFS_File *file, PHYSFS_sint64 val)\n * \\brief Convert and write a signed 64-bit littleendian value.\n *\n * Convenience function. Convert a signed 64-bit value from the platform's\n *  native byte order to littleendian and write it to a file.\n *\n *    \\param file PhysicsFS file handle to which to write.\n *    \\param val Value to convert and write.\n *   \\return zero on failure, non-zero on success. On failure, you can\n *           find out what went wrong from PHYSFS_getLastErrorCode().\n *\n * \\warning Remember, PHYSFS_sint64 is only 32 bits on platforms without\n *          any sort of 64-bit support.\n */\nPHYSFS_DECL int PHYSFS_writeSLE64(PHYSFS_File *file, PHYSFS_sint64 val);\n\n\n/**\n * \\fn int PHYSFS_writeULE64(PHYSFS_File *file, PHYSFS_uint64 val)\n * \\brief Convert and write an unsigned 64-bit littleendian value.\n *\n * Convenience function. Convert an unsigned 64-bit value from the platform's\n *  native byte order to littleendian and write it to a file.\n *\n *    \\param file PhysicsFS file handle to which to write.\n *    \\param val Value to convert and write.\n *   \\return zero on failure, non-zero on success. On failure, you can\n *           find out what went wrong from PHYSFS_getLastErrorCode().\n *\n * \\warning Remember, PHYSFS_uint64 is only 32 bits on platforms without\n *          any sort of 64-bit support.\n */\nPHYSFS_DECL int PHYSFS_writeULE64(PHYSFS_File *file, PHYSFS_uint64 val);\n\n\n/**\n * \\fn int PHYSFS_writeSBE64(PHYSFS_File *file, PHYSFS_sint64 val)\n * \\brief Convert and write a signed 64-bit bigending value.\n *\n * Convenience function. Convert a signed 64-bit value from the platform's\n *  native byte order to bigendian and write it to a file.\n *\n *    \\param file PhysicsFS file handle to which to write.\n *    \\param val Value to convert and write.\n *   \\return zero on failure, non-zero on success. On failure, you can\n *           find out what went wrong from PHYSFS_getLastErrorCode().\n *\n * \\warning Remember, PHYSFS_sint64 is only 32 bits on platforms without\n *          any sort of 64-bit support.\n */\nPHYSFS_DECL int PHYSFS_writeSBE64(PHYSFS_File *file, PHYSFS_sint64 val);\n\n\n/**\n * \\fn int PHYSFS_writeUBE64(PHYSFS_File *file, PHYSFS_uint64 val)\n * \\brief Convert and write an unsigned 64-bit bigendian value.\n *\n * Convenience function. Convert an unsigned 64-bit value from the platform's\n *  native byte order to bigendian and write it to a file.\n *\n *    \\param file PhysicsFS file handle to which to write.\n *    \\param val Value to convert and write.\n *   \\return zero on failure, non-zero on success. On failure, you can\n *           find out what went wrong from PHYSFS_getLastErrorCode().\n *\n * \\warning Remember, PHYSFS_uint64 is only 32 bits on platforms without\n *          any sort of 64-bit support.\n */\nPHYSFS_DECL int PHYSFS_writeUBE64(PHYSFS_File *file, PHYSFS_uint64 val);\n\n\n/* Everything above this line is part of the PhysicsFS 1.0 API. */\n\n/**\n * \\fn int PHYSFS_isInit(void)\n * \\brief Determine if the PhysicsFS library is initialized.\n *\n * Once PHYSFS_init() returns successfully, this will return non-zero.\n *  Before a successful PHYSFS_init() and after PHYSFS_deinit() returns\n *  successfully, this will return zero. This function is safe to call at\n *  any time.\n *\n *  \\return non-zero if library is initialized, zero if library is not.\n *\n * \\sa PHYSFS_init\n * \\sa PHYSFS_deinit\n */\nPHYSFS_DECL int PHYSFS_isInit(void);\n\n\n/**\n * \\fn int PHYSFS_symbolicLinksPermitted(void)\n * \\brief Determine if the symbolic links are permitted.\n *\n * This reports the setting from the last call to PHYSFS_permitSymbolicLinks().\n *  If PHYSFS_permitSymbolicLinks() hasn't been called since the library was\n *  last initialized, symbolic links are implicitly disabled.\n *\n *  \\return non-zero if symlinks are permitted, zero if not.\n *\n * \\sa PHYSFS_permitSymbolicLinks\n */\nPHYSFS_DECL int PHYSFS_symbolicLinksPermitted(void);\n\n\n/**\n * \\struct PHYSFS_Allocator\n * \\brief PhysicsFS allocation function pointers.\n *\n * (This is for limited, hardcore use. If you don't immediately see a need\n *  for it, you can probably ignore this forever.)\n *\n * You create one of these structures for use with PHYSFS_setAllocator.\n *  Allocators are assumed to be reentrant by the caller; please mutex\n *  accordingly.\n *\n * Allocations are always discussed in 64-bits, for future expansion...we're\n *  on the cusp of a 64-bit transition, and we'll probably be allocating 6\n *  gigabytes like it's nothing sooner or later, and I don't want to change\n *  this again at that point. If you're on a 32-bit platform and have to\n *  downcast, it's okay to return NULL if the allocation is greater than\n *  4 gigabytes, since you'd have to do so anyhow.\n *\n * \\sa PHYSFS_setAllocator\n */\ntypedef struct PHYSFS_Allocator\n{\n    int (*Init)(void);   /**< Initialize. Can be NULL. Zero on failure. */\n    void (*Deinit)(void);  /**< Deinitialize your allocator. Can be NULL. */\n    void *(*Malloc)(PHYSFS_uint64);  /**< Allocate like malloc(). */\n    void *(*Realloc)(void *, PHYSFS_uint64); /**< Reallocate like realloc(). */\n    void (*Free)(void *); /**< Free memory from Malloc or Realloc. */\n} PHYSFS_Allocator;\n\n\n/**\n * \\fn int PHYSFS_setAllocator(const PHYSFS_Allocator *allocator)\n * \\brief Hook your own allocation routines into PhysicsFS.\n *\n * (This is for limited, hardcore use. If you don't immediately see a need\n *  for it, you can probably ignore this forever.)\n *\n * By default, PhysicsFS will use whatever is reasonable for a platform\n *  to manage dynamic memory (usually ANSI C malloc/realloc/free, but\n *  some platforms might use something else), but in some uncommon cases, the\n *  app might want more control over the library's memory management. This\n *  lets you redirect PhysicsFS to use your own allocation routines instead.\n *  You can only call this function before PHYSFS_init(); if the library is\n *  initialized, it'll reject your efforts to change the allocator mid-stream.\n *  You may call this function after PHYSFS_deinit() if you are willing to\n *  shut down the library and restart it with a new allocator; this is a safe\n *  and supported operation. The allocator remains intact between deinit/init\n *  calls. If you want to return to the platform's default allocator, pass a\n *  NULL in here.\n *\n * If you aren't immediately sure what to do with this function, you can\n *  safely ignore it altogether.\n *\n *    \\param allocator Structure containing your allocator's entry points.\n *   \\return zero on failure, non-zero on success. This call only fails\n *           when used between PHYSFS_init() and PHYSFS_deinit() calls.\n */\nPHYSFS_DECL int PHYSFS_setAllocator(const PHYSFS_Allocator *allocator);\n\n\n/**\n * \\fn int PHYSFS_mount(const char *newDir, const char *mountPoint, int appendToPath)\n * \\brief Add an archive or directory to the search path.\n *\n * If this is a duplicate, the entry is not added again, even though the\n *  function succeeds. You may not add the same archive to two different\n *  mountpoints: duplicate checking is done against the archive and not the\n *  mountpoint.\n *\n * When you mount an archive, it is added to a virtual file system...all files\n *  in all of the archives are interpolated into a single hierachical file\n *  tree. Two archives mounted at the same place (or an archive with files\n *  overlapping another mountpoint) may have overlapping files: in such a case,\n *  the file earliest in the search path is selected, and the other files are\n *  inaccessible to the application. This allows archives to be used to\n *  override previous revisions; you can use the mounting mechanism to place\n *  archives at a specific point in the file tree and prevent overlap; this\n *  is useful for downloadable mods that might trample over application data\n *  or each other, for example.\n *\n * The mountpoint does not need to exist prior to mounting, which is different\n *  than those familiar with the Unix concept of \"mounting\" may expect.\n *  As well, more than one archive can be mounted to the same mountpoint, or\n *  mountpoints and archive contents can overlap...the interpolation mechanism\n *  still functions as usual.\n *\n * Specifying a symbolic link to an archive or directory is allowed here,\n *  regardless of the state of PHYSFS_permitSymbolicLinks(). That function\n *  only deals with symlinks inside the mounted directory or archive.\n *\n *   \\param newDir directory or archive to add to the path, in\n *                   platform-dependent notation.\n *   \\param mountPoint Location in the interpolated tree that this archive\n *                     will be \"mounted\", in platform-independent notation.\n *                     NULL or \"\" is equivalent to \"/\".\n *   \\param appendToPath nonzero to append to search path, zero to prepend.\n *  \\return nonzero if added to path, zero on failure (bogus archive, dir\n *          missing, etc). Use PHYSFS_getLastErrorCode() to obtain\n *          the specific error.\n *\n * \\sa PHYSFS_removeFromSearchPath\n * \\sa PHYSFS_getSearchPath\n * \\sa PHYSFS_getMountPoint\n * \\sa PHYSFS_mountIo\n */\nPHYSFS_DECL int PHYSFS_mount(const char *newDir,\n                             const char *mountPoint,\n                             int appendToPath);\n\n/**\n * Just like mount() but attempts to open the directory for writing as well as\n * reading.\n */\nPHYSFS_DECL int PHYSFS_mountRW(const char *newDir,\n                               const char *mountPoint,\n                               int appendToPath);\n\n/**\n * \\fn int PHYSFS_getMountPoint(const char *dir)\n * \\brief Determine a mounted archive's mountpoint.\n *\n * You give this function the name of an archive or dir you successfully\n *  added to the search path, and it reports the location in the interpolated\n *  tree where it is mounted. Files mounted with a NULL mountpoint or through\n *  PHYSFS_addToSearchPath() will report \"/\". The return value is READ ONLY\n *  and valid until the archive is removed from the search path.\n *\n *   \\param dir directory or archive previously added to the path, in\n *              platform-dependent notation. This must match the string\n *              used when adding, even if your string would also reference\n *              the same file with a different string of characters.\n *  \\return READ-ONLY string of mount point if added to path, NULL on failure\n *          (bogus archive, etc). Use PHYSFS_getLastErrorCode() to obtain the\n *          specific error.\n *\n * \\sa PHYSFS_removeFromSearchPath\n * \\sa PHYSFS_getSearchPath\n * \\sa PHYSFS_getMountPoint\n */\nPHYSFS_DECL const char *PHYSFS_getMountPoint(const char *dir);\n\n\n/**\n * \\typedef PHYSFS_StringCallback\n * \\brief Function signature for callbacks that report strings.\n *\n * These are used to report a list of strings to an original caller, one\n *  string per callback. All strings are UTF-8 encoded. Functions should not\n *  try to modify or free the string's memory.\n *\n * These callbacks are used, starting in PhysicsFS 1.1, as an alternative to\n *  functions that would return lists that need to be cleaned up with\n *  PHYSFS_freeList(). The callback means that the library doesn't need to\n *  allocate an entire list and all the strings up front.\n *\n * Be aware that promises data ordering in the list versions are not\n *  necessarily so in the callback versions. Check the documentation on\n *  specific APIs, but strings may not be sorted as you expect.\n *\n *    \\param data User-defined data pointer, passed through from the API\n *                that eventually called the callback.\n *    \\param str The string data about which the callback is meant to inform.\n *\n * \\sa PHYSFS_getCdRomDirsCallback\n * \\sa PHYSFS_getSearchPathCallback\n */\ntypedef void (*PHYSFS_StringCallback)(void *data, const char *str);\n\n\n/**\n * \\typedef PHYSFS_EnumFilesCallback\n * \\brief Function signature for callbacks that enumerate files.\n *\n * \\warning As of PhysicsFS 2.1, Use PHYSFS_EnumerateCallback with\n *  PHYSFS_enumerate() instead; it gives you more control over the process.\n *\n * These are used to report a list of directory entries to an original caller,\n *  one file/dir/symlink per callback. All strings are UTF-8 encoded.\n *  Functions should not try to modify or free any string's memory.\n *\n * These callbacks are used, starting in PhysicsFS 1.1, as an alternative to\n *  functions that would return lists that need to be cleaned up with\n *  PHYSFS_freeList(). The callback means that the library doesn't need to\n *  allocate an entire list and all the strings up front.\n *\n * Be aware that promised data ordering in the list versions are not\n *  necessarily so in the callback versions. Check the documentation on\n *  specific APIs, but strings may not be sorted as you expect and you might\n *  get duplicate strings.\n *\n *    \\param data User-defined data pointer, passed through from the API\n *                that eventually called the callback.\n *    \\param origdir A string containing the full path, in platform-independent\n *                   notation, of the directory containing this file. In most\n *                   cases, this is the directory on which you requested\n *                   enumeration, passed in the callback for your convenience.\n *    \\param fname The filename that is being enumerated. It may not be in\n *                 alphabetical order compared to other callbacks that have\n *                 fired, and it will not contain the full path. You can\n *                 recreate the fullpath with $origdir/$fname ... The file\n *                 can be a subdirectory, a file, a symlink, etc.\n *\n * \\sa PHYSFS_enumerateFilesCallback\n */\ntypedef void (*PHYSFS_EnumFilesCallback)(void *data, const char *origdir,\n                                         const char *fname);\n\n\n/**\n * \\fn void PHYSFS_getCdRomDirsCallback(PHYSFS_StringCallback c, void *d)\n * \\brief Enumerate CD-ROM directories, using an application-defined callback.\n *\n * Internally, PHYSFS_getCdRomDirs() just calls this function and then builds\n *  a list before returning to the application, so functionality is identical\n *  except for how the information is represented to the application.\n *\n * Unlike PHYSFS_getCdRomDirs(), this function does not return an array.\n *  Rather, it calls a function specified by the application once per\n *  detected disc:\n *\n * \\code\n *\n * static void foundDisc(void *data, const char *cddir)\n * {\n *     printf(\"cdrom dir [%s] is available.\\n\", cddir);\n * }\n *\n * // ...\n * PHYSFS_getCdRomDirsCallback(foundDisc, NULL);\n * \\endcode\n *\n * This call may block while drives spin up. Be forewarned.\n *\n *    \\param c Callback function to notify about detected drives.\n *    \\param d Application-defined data passed to callback. Can be NULL.\n *\n * \\sa PHYSFS_StringCallback\n * \\sa PHYSFS_getCdRomDirs\n */\nPHYSFS_DECL void PHYSFS_getCdRomDirsCallback(PHYSFS_StringCallback c, void *d);\n\n\n/**\n * \\fn void PHYSFS_getSearchPathCallback(PHYSFS_StringCallback c, void *d)\n * \\brief Enumerate the search path, using an application-defined callback.\n *\n * Internally, PHYSFS_getSearchPath() just calls this function and then builds\n *  a list before returning to the application, so functionality is identical\n *  except for how the information is represented to the application.\n *\n * Unlike PHYSFS_getSearchPath(), this function does not return an array.\n *  Rather, it calls a function specified by the application once per\n *  element of the search path:\n *\n * \\code\n *\n * static void printSearchPath(void *data, const char *pathItem)\n * {\n *     printf(\"[%s] is in the search path.\\n\", pathItem);\n * }\n *\n * // ...\n * PHYSFS_getSearchPathCallback(printSearchPath, NULL);\n * \\endcode\n *\n * Elements of the search path are reported in order search priority, so the\n *  first archive/dir that would be examined when looking for a file is the\n *  first element passed through the callback.\n *\n *    \\param c Callback function to notify about search path elements.\n *    \\param d Application-defined data passed to callback. Can be NULL.\n *\n * \\sa PHYSFS_StringCallback\n * \\sa PHYSFS_getSearchPath\n */\nPHYSFS_DECL void PHYSFS_getSearchPathCallback(PHYSFS_StringCallback c, void *d);\n\n\n/**\n * \\fn void PHYSFS_enumerateFilesCallback(const char *dir, PHYSFS_EnumFilesCallback c, void *d)\n * \\brief Get a file listing of a search path's directory, using an application-defined callback.\n *\n * \\deprecated As of PhysicsFS 2.1, use PHYSFS_enumerate() instead. This\n *  function has no way to report errors (or to have the callback signal an\n *  error or request a stop), so if data will be lost, your callback has no\n *  way to direct the process, and your calling app has no way to know.\n *\n * As of PhysicsFS 2.1, this function just wraps PHYSFS_enumerate() and\n *  ignores errors. Consider using PHYSFS_enumerate() or\n *  PHYSFS_enumerateFiles() instead.\n *\n * \\sa PHYSFS_enumerate\n * \\sa PHYSFS_enumerateFiles\n * \\sa PHYSFS_EnumFilesCallback\n */\nPHYSFS_DECL void PHYSFS_enumerateFilesCallback(const char *dir,\n                                               PHYSFS_EnumFilesCallback c,\n                                               void *d) PHYSFS_DEPRECATED;\n\n/**\n * \\fn void PHYSFS_utf8FromUcs4(const PHYSFS_uint32 *src, char *dst, PHYSFS_uint64 len)\n * \\brief Convert a UCS-4 string to a UTF-8 string.\n *\n * \\warning This function will not report an error if there are invalid UCS-4\n *          values in the source string. It will replace them with a '?'\n *          character and continue on.\n *\n * UCS-4 (aka UTF-32) strings are 32-bits per character: \\c wchar_t on Unix.\n *\n * To ensure that the destination buffer is large enough for the conversion,\n *  please allocate a buffer that is the same size as the source buffer. UTF-8\n *  never uses more than 32-bits per character, so while it may shrink a UCS-4\n *  string, it will never expand it.\n *\n * Strings that don't fit in the destination buffer will be truncated, but\n *  will always be null-terminated and never have an incomplete UTF-8\n *  sequence at the end. If the buffer length is 0, this function does nothing.\n *\n *   \\param src Null-terminated source string in UCS-4 format.\n *   \\param dst Buffer to store converted UTF-8 string.\n *   \\param len Size, in bytes, of destination buffer.\n */\nPHYSFS_DECL void PHYSFS_utf8FromUcs4(const PHYSFS_uint32 *src, char *dst,\n                                     PHYSFS_uint64 len);\n\n/**\n * \\fn void PHYSFS_utf8ToUcs4(const char *src, PHYSFS_uint32 *dst, PHYSFS_uint64 len)\n * \\brief Convert a UTF-8 string to a UCS-4 string.\n *\n * \\warning This function will not report an error if there are invalid UTF-8\n *          sequences in the source string. It will replace them with a '?'\n *          character and continue on.\n *\n * UCS-4 (aka UTF-32) strings are 32-bits per character: \\c wchar_t on Unix.\n *\n * To ensure that the destination buffer is large enough for the conversion,\n *  please allocate a buffer that is four times the size of the source buffer.\n *  UTF-8 uses from one to four bytes per character, but UCS-4 always uses\n *  four, so an entirely low-ASCII string will quadruple in size!\n *\n * Strings that don't fit in the destination buffer will be truncated, but\n *  will always be null-terminated and never have an incomplete UCS-4\n *  sequence at the end. If the buffer length is 0, this function does nothing.\n *\n *   \\param src Null-terminated source string in UTF-8 format.\n *   \\param dst Buffer to store converted UCS-4 string.\n *   \\param len Size, in bytes, of destination buffer.\n */\nPHYSFS_DECL void PHYSFS_utf8ToUcs4(const char *src, PHYSFS_uint32 *dst,\n                                   PHYSFS_uint64 len);\n\n/**\n * \\fn void PHYSFS_utf8FromUcs2(const PHYSFS_uint16 *src, char *dst, PHYSFS_uint64 len)\n * \\brief Convert a UCS-2 string to a UTF-8 string.\n *\n * \\warning you almost certainly should use PHYSFS_utf8FromUtf16(), which\n *  became available in PhysicsFS 2.1, unless you know what you're doing.\n *\n * \\warning This function will not report an error if there are invalid UCS-2\n *          values in the source string. It will replace them with a '?'\n *          character and continue on.\n *\n * UCS-2 strings are 16-bits per character: \\c TCHAR on Windows, when building\n *  with Unicode support. Please note that modern versions of Windows use\n *  UTF-16, which is an extended form of UCS-2, and not UCS-2 itself. You\n *  almost certainly want PHYSFS_utf8FromUtf16() instead.\n *\n * To ensure that the destination buffer is large enough for the conversion,\n *  please allocate a buffer that is double the size of the source buffer.\n *  UTF-8 never uses more than 32-bits per character, so while it may shrink\n *  a UCS-2 string, it may also expand it.\n *\n * Strings that don't fit in the destination buffer will be truncated, but\n *  will always be null-terminated and never have an incomplete UTF-8\n *  sequence at the end. If the buffer length is 0, this function does nothing.\n *\n *   \\param src Null-terminated source string in UCS-2 format.\n *   \\param dst Buffer to store converted UTF-8 string.\n *   \\param len Size, in bytes, of destination buffer.\n *\n * \\sa PHYSFS_utf8FromUtf16\n */\nPHYSFS_DECL void PHYSFS_utf8FromUcs2(const PHYSFS_uint16 *src, char *dst,\n                                     PHYSFS_uint64 len);\n\n/**\n * \\fn PHYSFS_utf8ToUcs2(const char *src, PHYSFS_uint16 *dst, PHYSFS_uint64 len)\n * \\brief Convert a UTF-8 string to a UCS-2 string.\n *\n * \\warning you almost certainly should use PHYSFS_utf8ToUtf16(), which\n *  became available in PhysicsFS 2.1, unless you know what you're doing.\n *\n * \\warning This function will not report an error if there are invalid UTF-8\n *          sequences in the source string. It will replace them with a '?'\n *          character and continue on.\n *\n * UCS-2 strings are 16-bits per character: \\c TCHAR on Windows, when building\n *  with Unicode support. Please note that modern versions of Windows use\n *  UTF-16, which is an extended form of UCS-2, and not UCS-2 itself. You\n *  almost certainly want PHYSFS_utf8ToUtf16() instead, but you need to\n *  understand how that changes things, too.\n *\n * To ensure that the destination buffer is large enough for the conversion,\n *  please allocate a buffer that is double the size of the source buffer.\n *  UTF-8 uses from one to four bytes per character, but UCS-2 always uses\n *  two, so an entirely low-ASCII string will double in size!\n *\n * Strings that don't fit in the destination buffer will be truncated, but\n *  will always be null-terminated and never have an incomplete UCS-2\n *  sequence at the end. If the buffer length is 0, this function does nothing.\n *\n *   \\param src Null-terminated source string in UTF-8 format.\n *   \\param dst Buffer to store converted UCS-2 string.\n *   \\param len Size, in bytes, of destination buffer.\n *\n * \\sa PHYSFS_utf8ToUtf16\n */\nPHYSFS_DECL void PHYSFS_utf8ToUcs2(const char *src, PHYSFS_uint16 *dst,\n                                   PHYSFS_uint64 len);\n\n/**\n * \\fn void PHYSFS_utf8FromLatin1(const char *src, char *dst, PHYSFS_uint64 len)\n * \\brief Convert a UTF-8 string to a Latin1 string.\n *\n * Latin1 strings are 8-bits per character: a popular \"high ASCII\" encoding.\n *\n * To ensure that the destination buffer is large enough for the conversion,\n *  please allocate a buffer that is double the size of the source buffer.\n *  UTF-8 expands latin1 codepoints over 127 from 1 to 2 bytes, so the string\n *  may grow in some cases.\n *\n * Strings that don't fit in the destination buffer will be truncated, but\n *  will always be null-terminated and never have an incomplete UTF-8\n *  sequence at the end. If the buffer length is 0, this function does nothing.\n *\n * Please note that we do not supply a UTF-8 to Latin1 converter, since Latin1\n *  can't express most Unicode codepoints. It's a legacy encoding; you should\n *  be converting away from it at all times.\n *\n *   \\param src Null-terminated source string in Latin1 format.\n *   \\param dst Buffer to store converted UTF-8 string.\n *   \\param len Size, in bytes, of destination buffer.\n */\nPHYSFS_DECL void PHYSFS_utf8FromLatin1(const char *src, char *dst,\n                                       PHYSFS_uint64 len);\n\n/* Everything above this line is part of the PhysicsFS 2.0 API. */\n\n/**\n * \\fn int PHYSFS_caseFold(const PHYSFS_uint32 from, PHYSFS_uint32 *to)\n * \\brief \"Fold\" a Unicode codepoint to a lowercase equivalent.\n *\n * (This is for limited, hardcore use. If you don't immediately see a need\n *  for it, you can probably ignore this forever.)\n *\n * This will convert a Unicode codepoint into its lowercase equivalent.\n *  Bogus codepoints and codepoints without a lowercase equivalent will\n *  be returned unconverted.\n *\n * Note that you might get multiple codepoints in return! The German Eszett,\n *  for example, will fold down to two lowercase latin 's' codepoints. The\n *  theory is that if you fold two strings, one with an Eszett and one with\n *  \"SS\" down, they will match.\n *\n * \\warning Anyone that is a student of Unicode knows about the \"Turkish I\"\n *          problem. This API does not handle it. Assume this one letter\n *          in all of Unicode will definitely fold sort of incorrectly. If\n *          you don't know what this is about, you can probably ignore this\n *          problem for most of the planet, but perfection is impossible.\n *\n *   \\param from The codepoint to fold.\n *   \\param to Buffer to store the folded codepoint values into. This should\n *             point to space for at least 3 PHYSFS_uint32 slots.\n *  \\return The number of codepoints the folding produced. Between 1 and 3.\n */\nPHYSFS_DECL int PHYSFS_caseFold(const PHYSFS_uint32 from, PHYSFS_uint32 *to);\n\n\n/**\n * \\fn int PHYSFS_utf8stricmp(const char *str1, const char *str2)\n * \\brief Case-insensitive compare of two UTF-8 strings.\n *\n * This is a strcasecmp/stricmp replacement that expects both strings\n *  to be in UTF-8 encoding. It will do \"case folding\" to decide if the\n *  Unicode codepoints in the strings match.\n *\n * If both strings are exclusively low-ASCII characters, this will do the\n *  right thing, as that is also valid UTF-8. If there are any high-ASCII\n *  chars, this will not do what you expect!\n *\n * It will report which string is \"greater than\" the other, but be aware that\n *  this doesn't necessarily mean anything: 'a' may be \"less than\" 'b', but\n *  a Japanese kuten has no meaningful alphabetically relationship to\n *  a Greek lambda, but being able to assign a reliable \"value\" makes sorting\n *  algorithms possible, if not entirely sane. Most cases should treat the\n *  return value as \"equal\" or \"not equal\".\n *\n * Like stricmp, this expects both strings to be NULL-terminated.\n *\n *   \\param str1 First string to compare.\n *   \\param str2 Second string to compare.\n *  \\return -1 if str1 is \"less than\" str2, 1 if \"greater than\", 0 if equal.\n */\nPHYSFS_DECL int PHYSFS_utf8stricmp(const char *str1, const char *str2);\n\n/**\n * \\fn int PHYSFS_utf16stricmp(const PHYSFS_uint16 *str1, const PHYSFS_uint16 *str2)\n * \\brief Case-insensitive compare of two UTF-16 strings.\n *\n * This is a strcasecmp/stricmp replacement that expects both strings\n *  to be in UTF-16 encoding. It will do \"case folding\" to decide if the\n *  Unicode codepoints in the strings match.\n *\n * It will report which string is \"greater than\" the other, but be aware that\n *  this doesn't necessarily mean anything: 'a' may be \"less than\" 'b', but\n *  a Japanese kuten has no meaningful alphabetically relationship to\n *  a Greek lambda, but being able to assign a reliable \"value\" makes sorting\n *  algorithms possible, if not entirely sane. Most cases should treat the\n *  return value as \"equal\" or \"not equal\".\n *\n * Like stricmp, this expects both strings to be NULL-terminated.\n *\n *   \\param str1 First string to compare.\n *   \\param str2 Second string to compare.\n *  \\return -1 if str1 is \"less than\" str2, 1 if \"greater than\", 0 if equal.\n */\nPHYSFS_DECL int PHYSFS_utf16stricmp(const PHYSFS_uint16 *str1,\n                                    const PHYSFS_uint16 *str2);\n\n/**\n * \\fn int PHYSFS_ucs4stricmp(const PHYSFS_uint32 *str1, const PHYSFS_uint32 *str2)\n * \\brief Case-insensitive compare of two UCS-4 strings.\n *\n * This is a strcasecmp/stricmp replacement that expects both strings\n *  to be in UCS-4 (aka UTF-32) encoding. It will do \"case folding\" to decide\n *  if the Unicode codepoints in the strings match.\n *\n * It will report which string is \"greater than\" the other, but be aware that\n *  this doesn't necessarily mean anything: 'a' may be \"less than\" 'b', but\n *  a Japanese kuten has no meaningful alphabetically relationship to\n *  a Greek lambda, but being able to assign a reliable \"value\" makes sorting\n *  algorithms possible, if not entirely sane. Most cases should treat the\n *  return value as \"equal\" or \"not equal\".\n *\n * Like stricmp, this expects both strings to be NULL-terminated.\n *\n *   \\param str1 First string to compare.\n *   \\param str2 Second string to compare.\n *  \\return -1 if str1 is \"less than\" str2, 1 if \"greater than\", 0 if equal.\n */\nPHYSFS_DECL int PHYSFS_ucs4stricmp(const PHYSFS_uint32 *str1,\n                                   const PHYSFS_uint32 *str2);\n\n\n/**\n * \\typedef PHYSFS_EnumerateCallback\n * \\brief Possible return values from PHYSFS_EnumerateCallback.\n *\n * These values dictate if an enumeration callback should continue to fire,\n *  or stop (and why it is stopping).\n *\n * \\sa PHYSFS_EnumerateCallback\n * \\sa PHYSFS_enumerate\n */\ntypedef enum PHYSFS_EnumerateCallbackResult\n{\n    PHYSFS_ENUM_ERROR = -1,   /**< Stop enumerating, report error to app. */\n    PHYSFS_ENUM_STOP = 0,     /**< Stop enumerating, report success to app. */\n    PHYSFS_ENUM_OK = 1        /**< Keep enumerating, no problems */\n} PHYSFS_EnumerateCallbackResult;\n\n/**\n * \\typedef PHYSFS_EnumerateCallback\n * \\brief Function signature for callbacks that enumerate and return results.\n *\n * This is the same thing as PHYSFS_EnumFilesCallback from PhysicsFS 2.0,\n *  except it can return a result from the callback: namely: if you're looking\n *  for something specific, once you find it, you can tell PhysicsFS to stop\n *  enumerating further. This is used with PHYSFS_enumerate(), which we\n *  hopefully got right this time.  :)\n *\n *    \\param data User-defined data pointer, passed through from the API\n *                that eventually called the callback.\n *    \\param origdir A string containing the full path, in platform-independent\n *                   notation, of the directory containing this file. In most\n *                   cases, this is the directory on which you requested\n *                   enumeration, passed in the callback for your convenience.\n *    \\param fname The filename that is being enumerated. It may not be in\n *                 alphabetical order compared to other callbacks that have\n *                 fired, and it will not contain the full path. You can\n *                 recreate the fullpath with $origdir/$fname ... The file\n *                 can be a subdirectory, a file, a symlink, etc.\n *   \\return A value from PHYSFS_EnumerateCallbackResult.\n *           All other values are (currently) undefined; don't use them.\n *\n * \\sa PHYSFS_enumerate\n * \\sa PHYSFS_EnumerateCallbackResult\n */\ntypedef PHYSFS_EnumerateCallbackResult (*PHYSFS_EnumerateCallback)(void *data,\n                                       const char *origdir, const char *fname);\n\n/**\n * \\fn int PHYSFS_enumerate(const char *dir, PHYSFS_EnumerateCallback c, void *d)\n * \\brief Get a file listing of a search path's directory, using an application-defined callback, with errors reported.\n *\n * Internally, PHYSFS_enumerateFiles() just calls this function and then builds\n *  a list before returning to the application, so functionality is identical\n *  except for how the information is represented to the application.\n *\n * Unlike PHYSFS_enumerateFiles(), this function does not return an array.\n *  Rather, it calls a function specified by the application once per\n *  element of the search path:\n *\n * \\code\n *\n * static PHYSFS_EnumerateCallbackResult printDir(void *data, const char *origdir, const char *fname)\n * {\n *     printf(\" * We've got [%s] in [%s].\\n\", fname, origdir);\n *     return PHYSFS_ENUM_OK;  // give me more data, please.\n * }\n *\n * // ...\n * PHYSFS_enumerate(\"/some/path\", printDir, NULL);\n * \\endcode\n *\n * Items sent to the callback are not guaranteed to be in any order whatsoever.\n *  There is no sorting done at this level, and if you need that, you should\n *  probably use PHYSFS_enumerateFiles() instead, which guarantees\n *  alphabetical sorting. This form reports whatever is discovered in each\n *  archive before moving on to the next. Even within one archive, we can't\n *  guarantee what order it will discover data. <em>Any sorting you find in\n *  these callbacks is just pure luck. Do not rely on it.</em> As this walks\n *  the entire list of archives, you may receive duplicate filenames.\n *\n * This API and the callbacks themselves are capable of reporting errors.\n *  Prior to this API, callbacks had to accept every enumerated item, even if\n *  they were only looking for a specific thing and wanted to stop after that,\n *  or had a serious error and couldn't alert anyone. Furthermore, if\n *  PhysicsFS itself had a problem (disk error or whatnot), it couldn't report\n *  it to the calling app, it would just have to skip items or stop\n *  enumerating outright, and the caller wouldn't know it had lost some data\n *  along the way.\n *\n * Now the caller can be sure it got a complete data set, and its callback has\n *  control if it wants enumeration to stop early. See the documentation for\n *  PHYSFS_EnumerateCallback for details on how your callback should behave.\n *\n *    \\param dir Directory, in platform-independent notation, to enumerate.\n *    \\param c Callback function to notify about search path elements.\n *    \\param d Application-defined data passed to callback. Can be NULL.\n *   \\return non-zero on success, zero on failure. Use\n *           PHYSFS_getLastErrorCode() to obtain the specific error. If the\n *           callback returns PHYSFS_ENUM_STOP to stop early, this will be\n *           considered success. Callbacks returning PHYSFS_ENUM_ERROR will\n *           make this function return zero and set the error code to\n *           PHYSFS_ERR_APP_CALLBACK.\n *\n * \\sa PHYSFS_EnumerateCallback\n * \\sa PHYSFS_enumerateFiles\n */\nPHYSFS_DECL int PHYSFS_enumerate(const char *dir, PHYSFS_EnumerateCallback c,\n                                 void *d);\n\n\n/**\n * \\fn int PHYSFS_unmount(const char *oldDir)\n * \\brief Remove a directory or archive from the search path.\n *\n * This is functionally equivalent to PHYSFS_removeFromSearchPath(), but that\n *  function is deprecated to keep the vocabulary paired with PHYSFS_mount().\n *\n * This must be a (case-sensitive) match to a dir or archive already in the\n *  search path, specified in platform-dependent notation.\n *\n * This call will fail (and fail to remove from the path) if the element still\n *  has files open in it.\n *\n * \\warning This function wants the path to the archive or directory that was\n *          mounted (the same string used for the \"newDir\" argument of\n *          PHYSFS_addToSearchPath or any of the mount functions), not the\n *          path where it is mounted in the tree (the \"mountPoint\" argument\n *          to any of the mount functions).\n *\n *    \\param oldDir dir/archive to remove.\n *   \\return nonzero on success, zero on failure. Use\n *           PHYSFS_getLastErrorCode() to obtain the specific error.\n *\n * \\sa PHYSFS_getSearchPath\n * \\sa PHYSFS_mount\n */\nPHYSFS_DECL int PHYSFS_unmount(const char *oldDir);\n\n/**\n * \\fn int PHYSFS_canUnmount(const char *oldDir)\n * \\brief Check whether a directory or archive can be unmounted.\n */\nPHYSFS_DECL int PHYSFS_canUnmount(const char *oldDir);\n\n\n/**\n * \\fn const PHYSFS_Allocator *PHYSFS_getAllocator(void)\n * \\brief Discover the current allocator.\n *\n * (This is for limited, hardcore use. If you don't immediately see a need\n *  for it, you can probably ignore this forever.)\n *\n * This function exposes the function pointers that make up the currently used\n *  allocator. This can be useful for apps that want to access PhysicsFS's\n *  internal, default allocation routines, as well as for external code that\n *  wants to share the same allocator, even if the application specified their\n *  own.\n *\n * This call is only valid between PHYSFS_init() and PHYSFS_deinit() calls;\n *  it will return NULL if the library isn't initialized. As we can't\n *  guarantee the state of the internal allocators unless the library is\n *  initialized, you shouldn't use any allocator returned here after a call\n *  to PHYSFS_deinit().\n *\n * Do not call the returned allocator's Init() or Deinit() methods under any\n *  circumstances.\n *\n * If you aren't immediately sure what to do with this function, you can\n *  safely ignore it altogether.\n *\n *  \\return Current allocator, as set by PHYSFS_setAllocator(), or PhysicsFS's\n *          internal, default allocator if no application defined allocator\n *          is currently set. Will return NULL if the library is not\n *          initialized.\n *\n * \\sa PHYSFS_Allocator\n * \\sa PHYSFS_setAllocator\n */\nPHYSFS_DECL const PHYSFS_Allocator *PHYSFS_getAllocator(void);\n\n\n/**\n * \\enum PHYSFS_FileType\n * \\brief Type of a File\n *\n * Possible types of a file.\n *\n * \\sa PHYSFS_stat\n */\ntypedef enum PHYSFS_FileType\n{\n\tPHYSFS_FILETYPE_REGULAR, /**< a normal file */\n\tPHYSFS_FILETYPE_DIRECTORY, /**< a directory */\n\tPHYSFS_FILETYPE_SYMLINK, /**< a symlink */\n\tPHYSFS_FILETYPE_OTHER /**< something completely different like a device */\n} PHYSFS_FileType;\n\n/**\n * \\struct PHYSFS_Stat\n * \\brief Meta data for a file or directory\n *\n * Container for various meta data about a file in the virtual file system.\n *  PHYSFS_stat() uses this structure for returning the information. The time\n *  data will be either the number of seconds since the Unix epoch (midnight,\n *  Jan 1, 1970), or -1 if the information isn't available or applicable.\n *  The (filesize) field is measured in bytes.\n *  The (readonly) field tells you whether the archive thinks a file is\n *  not writable, but tends to be only an estimate (for example, your write\n *  dir might overlap with a .zip file, meaning you _can_ successfully open\n *  that path for writing, as it gets created elsewhere.\n *\n * \\sa PHYSFS_stat\n * \\sa PHYSFS_FileType\n */\ntypedef struct PHYSFS_Stat\n{\n\tPHYSFS_sint64 filesize; /**< size in bytes, -1 for non-files and unknown */\n\tPHYSFS_sint64 modtime;  /**< last modification time */\n\tPHYSFS_sint64 createtime; /**< like modtime, but for file creation time */\n\tPHYSFS_sint64 accesstime; /**< like modtime, but for file access time */\n\tPHYSFS_FileType filetype; /**< File? Directory? Symlink? */\n\tint readonly; /**< non-zero if read only, zero if writable. */\n} PHYSFS_Stat;\n\n/**\n * \\fn int PHYSFS_stat(const char *fname, PHYSFS_Stat *stat)\n * \\brief Get various information about a directory or a file.\n *\n * Obtain various information about a file or directory from the meta data.\n *\n * This function will never follow symbolic links. If you haven't enabled\n *  symlinks with PHYSFS_permitSymbolicLinks(), stat'ing a symlink will be\n *  treated like stat'ing a non-existant file. If symlinks are enabled,\n *  stat'ing a symlink will give you information on the link itself and not\n *  what it points to.\n *\n *    \\param fname filename to check, in platform-indepedent notation.\n *    \\param stat pointer to structure to fill in with data about (fname).\n *   \\return non-zero on success, zero on failure. On failure, (stat)'s\n *           contents are undefined.\n *\n * \\sa PHYSFS_Stat\n */\nPHYSFS_DECL int PHYSFS_stat(const char *fname, PHYSFS_Stat *stat);\n\n\n/**\n * \\fn void PHYSFS_utf8FromUtf16(const PHYSFS_uint16 *src, char *dst, PHYSFS_uint64 len)\n * \\brief Convert a UTF-16 string to a UTF-8 string.\n *\n * \\warning This function will not report an error if there are invalid UTF-16\n *          sequences in the source string. It will replace them with a '?'\n *          character and continue on.\n *\n * UTF-16 strings are 16-bits per character (except some chars, which are\n *  32-bits): \\c TCHAR on Windows, when building with Unicode support. Modern\n *  Windows releases use UTF-16. Windows releases before 2000 used TCHAR, but\n *  only handled UCS-2. UTF-16 _is_ UCS-2, except for the characters that\n *  are 4 bytes, which aren't representable in UCS-2 at all anyhow. If you\n *  aren't sure, you should be using UTF-16 at this point on Windows.\n *\n * To ensure that the destination buffer is large enough for the conversion,\n *  please allocate a buffer that is double the size of the source buffer.\n *  UTF-8 never uses more than 32-bits per character, so while it may shrink\n *  a UTF-16 string, it may also expand it.\n *\n * Strings that don't fit in the destination buffer will be truncated, but\n *  will always be null-terminated and never have an incomplete UTF-8\n *  sequence at the end. If the buffer length is 0, this function does nothing.\n *\n *   \\param src Null-terminated source string in UTF-16 format.\n *   \\param dst Buffer to store converted UTF-8 string.\n *   \\param len Size, in bytes, of destination buffer.\n */\nPHYSFS_DECL void PHYSFS_utf8FromUtf16(const PHYSFS_uint16 *src, char *dst,\n                                      PHYSFS_uint64 len);\n\n/**\n * \\fn PHYSFS_utf8ToUtf16(const char *src, PHYSFS_uint16 *dst, PHYSFS_uint64 len)\n * \\brief Convert a UTF-8 string to a UTF-16 string.\n *\n * \\warning This function will not report an error if there are invalid UTF-8\n *          sequences in the source string. It will replace them with a '?'\n *          character and continue on.\n *\n * UTF-16 strings are 16-bits per character (except some chars, which are\n *  32-bits): \\c TCHAR on Windows, when building with Unicode support. Modern\n *  Windows releases use UTF-16. Windows releases before 2000 used TCHAR, but\n *  only handled UCS-2. UTF-16 _is_ UCS-2, except for the characters that\n *  are 4 bytes, which aren't representable in UCS-2 at all anyhow. If you\n *  aren't sure, you should be using UTF-16 at this point on Windows.\n *\n * To ensure that the destination buffer is large enough for the conversion,\n *  please allocate a buffer that is double the size of the source buffer.\n *  UTF-8 uses from one to four bytes per character, but UTF-16 always uses\n *  two to four, so an entirely low-ASCII string will double in size! The\n *  UTF-16 characters that would take four bytes also take four bytes in UTF-8,\n *  so you don't need to allocate 4x the space just in case: double will do.\n *\n * Strings that don't fit in the destination buffer will be truncated, but\n *  will always be null-terminated and never have an incomplete UTF-16\n *  surrogate pair at the end. If the buffer length is 0, this function does\n *  nothing.\n *\n *   \\param src Null-terminated source string in UTF-8 format.\n *   \\param dst Buffer to store converted UTF-16 string.\n *   \\param len Size, in bytes, of destination buffer.\n *\n * \\sa PHYSFS_utf8ToUtf16\n */\nPHYSFS_DECL void PHYSFS_utf8ToUtf16(const char *src, PHYSFS_uint16 *dst,\n                                    PHYSFS_uint64 len);\n\n\n/**\n * \\fn PHYSFS_sint64 PHYSFS_readBytes(PHYSFS_File *handle, void *buffer, PHYSFS_uint64 len)\n * \\brief Read bytes from a PhysicsFS filehandle\n *\n * The file must be opened for reading.\n *\n *   \\param handle handle returned from PHYSFS_openRead().\n *   \\param buffer buffer of at least (len) bytes to store read data into.\n *   \\param len number of bytes being read from (handle).\n *  \\return number of bytes read. This may be less than (len); this does not\n *          signify an error, necessarily (a short read may mean EOF).\n *          PHYSFS_getLastErrorCode() can shed light on the reason this might\n *          be < (len), as can PHYSFS_eof(). -1 if complete failure.\n *\n * \\sa PHYSFS_eof\n */\nPHYSFS_DECL PHYSFS_sint64 PHYSFS_readBytes(PHYSFS_File *handle, void *buffer,\n                                           PHYSFS_uint64 len);\n\n/**\n * \\fn PHYSFS_sint64 PHYSFS_writeBytes(PHYSFS_File *handle, const void *buffer, PHYSFS_uint64 len)\n * \\brief Write data to a PhysicsFS filehandle\n *\n * The file must be opened for writing.\n *\n * Please note that while (len) is an unsigned 64-bit integer, you are limited\n *  to 63 bits (9223372036854775807 bytes), so we can return a negative value\n *  on error. If length is greater than 0x7FFFFFFFFFFFFFFF, this function will\n *  immediately fail. For systems without a 64-bit datatype, you are limited\n *  to 31 bits (0x7FFFFFFF, or 2147483647 bytes). We trust most things won't\n *  need to do multiple gigabytes of i/o in one call anyhow, but why limit\n *  things?\n *\n *   \\param handle retval from PHYSFS_openWrite() or PHYSFS_openAppend().\n *   \\param buffer buffer of (len) bytes to write to (handle).\n *   \\param len number of bytes being written to (handle).\n *  \\return number of bytes written. This may be less than (len); in the case\n *          of an error, the system may try to write as many bytes as possible,\n *          so an incomplete write might occur. PHYSFS_getLastErrorCode() can\n *          shed light on the reason this might be < (len). -1 if complete\n *          failure.\n */\nPHYSFS_DECL PHYSFS_sint64 PHYSFS_writeBytes(PHYSFS_File *handle,\n                                            const void *buffer,\n                                            PHYSFS_uint64 len);\n\n\n/**\n * \\struct PHYSFS_Io\n * \\brief An abstract i/o interface.\n *\n * \\warning This is advanced, hardcore stuff. You don't need this unless you\n *          really know what you're doing. Most apps will not need this.\n *\n * Historically, PhysicsFS provided access to the physical filesystem and\n *  archives within that filesystem. However, sometimes you need more power\n *  than this. Perhaps you need to provide an archive that is entirely\n *  contained in RAM, or you need to bridge some other file i/o API to\n *  PhysicsFS, or you need to translate the bits (perhaps you have a\n *  a standard .zip file that's encrypted, and you need to decrypt on the fly\n *  for the unsuspecting zip archiver).\n *\n * A PHYSFS_Io is the interface that Archivers use to get archive data.\n *  Historically, this has mapped to file i/o to the physical filesystem, but\n *  as of PhysicsFS 2.1, applications can provide their own i/o implementations\n *  at runtime.\n *\n * This interface isn't necessarily a good universal fit for i/o. There are a\n *  few requirements of note:\n *\n *  - They only do blocking i/o (at least, for now).\n *  - They need to be able to duplicate. If you have a file handle from\n *    fopen(), you need to be able to create a unique clone of it (so we\n *    have two handles to the same file that can both seek/read/etc without\n *    stepping on each other).\n *  - They need to know the size of their entire data set.\n *  - They need to be able to seek and rewind on demand.\n *\n * ...in short, you're probably not going to write an HTTP implementation.\n *\n * Thread safety: PHYSFS_Io implementations are not guaranteed to be thread\n *  safe in themselves. Under the hood where PhysicsFS uses them, the library\n *  provides its own locks. If you plan to use them directly from separate\n *  threads, you should either use mutexes to protect them, or don't use the\n *  same PHYSFS_Io from two threads at the same time.\n *\n * \\sa PHYSFS_mountIo\n */\ntypedef struct PHYSFS_Io\n{\n    /**\n     * \\brief Binary compatibility information.\n     *\n     * This must be set to zero at this time. Future versions of this\n     *  struct will increment this field, so we know what a given\n     *  implementation supports. We'll presumably keep supporting older\n     *  versions as we offer new features, though.\n     */\n    PHYSFS_uint32 version;\n\n    /**\n     * \\brief Instance data for this struct.\n     *\n     * Each instance has a pointer associated with it that can be used to\n     *  store anything it likes. This pointer is per-instance of the stream,\n     *  so presumably it will change when calling duplicate(). This can be\n     *  deallocated during the destroy() method.\n     */\n    void *opaque;\n\n    /**\n     * \\brief Read more data.\n     *\n     * Read (len) bytes from the interface, at the current i/o position, and\n     *  store them in (buffer). The current i/o position should move ahead\n     *  by the number of bytes successfully read.\n     *\n     * You don't have to implement this; set it to NULL if not implemented.\n     *  This will only be used if the file is opened for reading. If set to\n     *  NULL, a default implementation that immediately reports failure will\n     *  be used.\n     *\n     *   \\param io The i/o instance to read from.\n     *   \\param buf The buffer to store data into. It must be at least\n     *                 (len) bytes long and can't be NULL.\n     *   \\param len The number of bytes to read from the interface.\n     *  \\return number of bytes read from file, 0 on EOF, -1 if complete\n     *          failure.\n     */\n    PHYSFS_sint64 (*read)(struct PHYSFS_Io *io, void *buf, PHYSFS_uint64 len);\n\n    /**\n     * \\brief Write more data.\n     *\n     * Write (len) bytes from (buffer) to the interface at the current i/o\n     *  position. The current i/o position should move ahead by the number of\n     *  bytes successfully written.\n     *\n     * You don't have to implement this; set it to NULL if not implemented.\n     *  This will only be used if the file is opened for writing. If set to\n     *  NULL, a default implementation that immediately reports failure will\n     *  be used.\n     *\n     * You are allowed to buffer; a write can succeed here and then later\n     *  fail when flushing. Note that PHYSFS_setBuffer() may be operating a\n     *  level above your i/o, so you should usually not implement your\n     *  own buffering routines.\n     *\n     *   \\param io The i/o instance to write to.\n     *   \\param buffer The buffer to read data from. It must be at least\n     *                 (len) bytes long and can't be NULL.\n     *   \\param len The number of bytes to read from (buffer).\n     *  \\return number of bytes written to file, -1 if complete failure.\n     */\n    PHYSFS_sint64 (*write)(struct PHYSFS_Io *io, const void *buffer,\n                           PHYSFS_uint64 len);\n\n    /**\n     * \\brief Move i/o position to a given byte offset from start.\n     *\n     * This method moves the i/o position, so the next read/write will\n     *  be of the byte at (offset) offset. Seeks past the end of file should\n     *  be treated as an error condition.\n     *\n     *   \\param io The i/o instance to seek.\n     *   \\param offset The new byte offset for the i/o position.\n     *  \\return non-zero on success, zero on error.\n     */\n    int (*seek)(struct PHYSFS_Io *io, PHYSFS_uint64 offset);\n\n    /**\n     * \\brief Report current i/o position.\n     *\n     * Return bytes offset, or -1 if you aren't able to determine. A failure\n     *  will almost certainly be fatal to further use of this stream, so you\n     *  may not leave this unimplemented.\n     *\n     *   \\param io The i/o instance to query.\n     *  \\return The current byte offset for the i/o position, -1 if unknown.\n     */\n    PHYSFS_sint64 (*tell)(struct PHYSFS_Io *io);\n\n    /**\n     * \\brief Determine size of the i/o instance's dataset.\n     *\n     * Return number of bytes available in the file, or -1 if you\n     *  aren't able to determine. A failure will almost certainly be fatal\n     *  to further use of this stream, so you may not leave this unimplemented.\n     *\n     *   \\param io The i/o instance to query.\n     *  \\return Total size, in bytes, of the dataset.\n     */\n    PHYSFS_sint64 (*length)(struct PHYSFS_Io *io);\n\n    /**\n     * \\brief Duplicate this i/o instance.\n     *\n     * This needs to result in a full copy of this PHYSFS_Io, that can live\n     *  completely independently. The copy needs to be able to perform all\n     *  its operations without altering the original, including either object\n     *  being destroyed separately (so, for example: they can't share a file\n     *  handle; they each need their own).\n     *\n     * If you can't duplicate a handle, it's legal to return NULL, but you\n     *  almost certainly need this functionality if you want to use this to\n     *  PHYSFS_Io to back an archive.\n     *\n     *   \\param io The i/o instance to duplicate.\n     *  \\return A new value for a stream's (opaque) field, or NULL on error.\n     */\n    struct PHYSFS_Io *(*duplicate)(struct PHYSFS_Io *io);\n\n    /**\n     * \\brief Flush resources to media, or wherever.\n     *\n     * This is the chance to report failure for writes that had claimed\n     *  success earlier, but still had a chance to actually fail. This method\n     *  can be NULL if flushing isn't necessary.\n     *\n     * This function may be called before destroy(), as it can report failure\n     *  and destroy() can not. It may be called at other times, too.\n     *\n     *   \\param io The i/o instance to flush.\n     *  \\return Zero on error, non-zero on success.\n     */\n    int (*flush)(struct PHYSFS_Io *io);\n\n    /**\n     * \\brief Cleanup and deallocate i/o instance.\n     *\n     * Free associated resources, including (opaque) if applicable.\n     *\n     * This function must always succeed: as such, it returns void. The\n     *  system may call your flush() method before this. You may report\n     *  failure there if necessary. This method may still be called if\n     *  flush() fails, in which case you'll have to abandon unflushed data\n     *  and other failing conditions and clean up.\n     *\n     * Once this method is called for a given instance, the system will assume\n     *  it is unsafe to touch that instance again and will discard any\n     *  references to it.\n     *\n     *   \\param s The i/o instance to destroy.\n     */\n    void (*destroy)(struct PHYSFS_Io *io);\n} PHYSFS_Io;\n\n\n/**\n * \\fn int PHYSFS_mountIo(PHYSFS_Io *io, const char *newDir, const char *mountPoint, int appendToPath)\n * \\brief Add an archive, built on a PHYSFS_Io, to the search path.\n *\n * \\warning Unless you have some special, low-level need, you should be using\n *          PHYSFS_mount() instead of this.\n *\n * This function operates just like PHYSFS_mount(), but takes a PHYSFS_Io\n *  instead of a pathname. Behind the scenes, PHYSFS_mount() calls this\n *  function with a physical-filesystem-based PHYSFS_Io.\n *\n * (newDir) must be a unique string to identify this archive. It is used\n *  to optimize archiver selection (if you name it XXXXX.zip, we might try\n *  the ZIP archiver first, for example, or directly choose an archiver that\n *  can only trust the data is valid by filename extension). It doesn't\n *  need to refer to a real file at all. If the filename extension isn't\n *  helpful, the system will try every archiver until one works or none\n *  of them do. This filename must be unique, as the system won't allow you\n *  to have two archives with the same name.\n *\n * (io) must remain until the archive is unmounted. When the archive is\n *  unmounted, the system will call (io)->destroy(io), which will give you\n *  a chance to free your resources.\n *\n * If this function fails, (io)->destroy(io) is not called.\n *\n *   \\param io i/o instance for archive to add to the path.\n *   \\param newDir Filename that can represent this stream.\n *   \\param mountPoint Location in the interpolated tree that this archive\n *                     will be \"mounted\", in platform-independent notation.\n *                     NULL or \"\" is equivalent to \"/\".\n *   \\param appendToPath nonzero to append to search path, zero to prepend.\n *  \\return nonzero if added to path, zero on failure (bogus archive, stream\n *                   i/o issue, etc). Use PHYSFS_getLastErrorCode() to obtain\n *                   the specific error.\n *\n * \\sa PHYSFS_unmount\n * \\sa PHYSFS_getSearchPath\n * \\sa PHYSFS_getMountPoint\n */\nPHYSFS_DECL int PHYSFS_mountIo(PHYSFS_Io *io, const char *newDir,\n                               const char *mountPoint, int appendToPath);\n\n\n/**\n * \\fn int PHYSFS_mountMemory(const void *buf, PHYSFS_uint64 len, void (*del)(void *), const char *newDir, const char *mountPoint, int appendToPath)\n * \\brief Add an archive, contained in a memory buffer, to the search path.\n *\n * \\warning Unless you have some special, low-level need, you should be using\n *          PHYSFS_mount() instead of this.\n *\n * This function operates just like PHYSFS_mount(), but takes a memory buffer\n *  instead of a pathname. This buffer contains all the data of the archive,\n *  and is used instead of a real file in the physical filesystem.\n *\n * (newDir) must be a unique string to identify this archive. It is used\n *  to optimize archiver selection (if you name it XXXXX.zip, we might try\n *  the ZIP archiver first, for example, or directly choose an archiver that\n *  can only trust the data is valid by filename extension). It doesn't\n *  need to refer to a real file at all. If the filename extension isn't\n *  helpful, the system will try every archiver until one works or none\n *  of them do. This filename must be unique, as the system won't allow you\n *  to have two archives with the same name.\n *\n * (ptr) must remain until the archive is unmounted. When the archive is\n *  unmounted, the system will call (del)(ptr), which will notify you that\n *  the system is done with the buffer, and give you a chance to free your\n *  resources. (del) can be NULL, in which case the system will make no\n *  attempt to free the buffer.\n *\n * If this function fails, (del) is not called.\n *\n *   \\param buf Address of the memory buffer containing the archive data.\n *   \\param len Size of memory buffer, in bytes.\n *   \\param del A callback that triggers upon unmount. Can be NULL.\n *   \\param newDir Filename that can represent this stream.\n *   \\param mountPoint Location in the interpolated tree that this archive\n *                     will be \"mounted\", in platform-independent notation.\n *                     NULL or \"\" is equivalent to \"/\".\n *   \\param appendToPath nonzero to append to search path, zero to prepend.\n *  \\return nonzero if added to path, zero on failure (bogus archive, etc).\n *          Use PHYSFS_getLastErrorCode() to obtain the specific error.\n *\n * \\sa PHYSFS_unmount\n * \\sa PHYSFS_getSearchPath\n * \\sa PHYSFS_getMountPoint\n */\nPHYSFS_DECL int PHYSFS_mountMemory(const void *buf, PHYSFS_uint64 len,\n                                   void (*del)(void *), const char *newDir,\n                                   const char *mountPoint, int appendToPath);\n\n\n/**\n * \\fn int PHYSFS_mountHandle(PHYSFS_File *file, const char *newDir, const char *mountPoint, int appendToPath)\n * \\brief Add an archive, contained in a PHYSFS_File handle, to the search path.\n *\n * \\warning Unless you have some special, low-level need, you should be using\n *          PHYSFS_mount() instead of this.\n *\n * \\warning Archives-in-archives may be very slow! While a PHYSFS_File can\n *          seek even when the data is compressed, it may do so by rewinding\n *          to the start and decompressing everything before the seek point.\n *          Normal archive usage may do a lot of seeking behind the scenes.\n *          As such, you might find normal archive usage extremely painful\n *          if mounted this way. Plan accordingly: if you, say, have a\n *          self-extracting .zip file, and want to mount something in it,\n *          compress the contents of the inner archive and make sure the outer\n *          .zip file doesn't compress the inner archive too.\n *\n * This function operates just like PHYSFS_mount(), but takes a PHYSFS_File\n *  handle instead of a pathname. This handle contains all the data of the\n *  archive, and is used instead of a real file in the physical filesystem.\n *  The PHYSFS_File may be backed by a real file in the physical filesystem,\n *  but isn't necessarily. The most popular use for this is likely to mount\n *  archives stored inside other archives.\n *\n * (newDir) must be a unique string to identify this archive. It is used\n *  to optimize archiver selection (if you name it XXXXX.zip, we might try\n *  the ZIP archiver first, for example, or directly choose an archiver that\n *  can only trust the data is valid by filename extension). It doesn't\n *  need to refer to a real file at all. If the filename extension isn't\n *  helpful, the system will try every archiver until one works or none\n *  of them do. This filename must be unique, as the system won't allow you\n *  to have two archives with the same name.\n *\n * (file) must remain until the archive is unmounted. When the archive is\n *  unmounted, the system will call PHYSFS_close(file). If you need this\n *  handle to survive, you will have to wrap this in a PHYSFS_Io and use\n *  PHYSFS_mountIo() instead.\n *\n * If this function fails, PHYSFS_close(file) is not called.\n *\n *   \\param file The PHYSFS_File handle containing archive data.\n *   \\param newDir Filename that can represent this stream.\n *   \\param mountPoint Location in the interpolated tree that this archive\n *                     will be \"mounted\", in platform-independent notation.\n *                     NULL or \"\" is equivalent to \"/\".\n *   \\param appendToPath nonzero to append to search path, zero to prepend.\n *  \\return nonzero if added to path, zero on failure (bogus archive, etc).\n *          Use PHYSFS_getLastErrorCode() to obtain the specific error.\n *\n * \\sa PHYSFS_unmount\n * \\sa PHYSFS_getSearchPath\n * \\sa PHYSFS_getMountPoint\n */\nPHYSFS_DECL int PHYSFS_mountHandle(PHYSFS_File *file, const char *newDir,\n                                   const char *mountPoint, int appendToPath);\n\n\n/**\n * \\enum PHYSFS_ErrorCode\n * \\brief Values that represent specific causes of failure.\n *\n * Most of the time, you should only concern yourself with whether a given\n *  operation failed or not, but there may be occasions where you plan to\n *  handle a specific failure case gracefully, so we provide specific error\n *  codes.\n *\n * Most of these errors are a little vague, and most aren't things you can\n *  fix...if there's a permission error, for example, all you can really do\n *  is pass that information on to the user and let them figure out how to\n *  handle it. In most these cases, your program should only care that it\n *  failed to accomplish its goals, and not care specifically why.\n *\n * \\sa PHYSFS_getLastErrorCode\n * \\sa PHYSFS_getErrorByCode\n */\ntypedef enum PHYSFS_ErrorCode\n{\n    PHYSFS_ERR_OK,               /**< Success; no error.                    */\n    PHYSFS_ERR_OTHER_ERROR,      /**< Error not otherwise covered here.     */\n    PHYSFS_ERR_OUT_OF_MEMORY,    /**< Memory allocation failed.             */\n    PHYSFS_ERR_NOT_INITIALIZED,  /**< PhysicsFS is not initialized.         */\n    PHYSFS_ERR_IS_INITIALIZED,   /**< PhysicsFS is already initialized.     */\n    PHYSFS_ERR_ARGV0_IS_NULL,    /**< Needed argv[0], but it is NULL.       */\n    PHYSFS_ERR_UNSUPPORTED,      /**< Operation or feature unsupported.     */\n    PHYSFS_ERR_PAST_EOF,         /**< Attempted to access past end of file. */\n    PHYSFS_ERR_FILES_STILL_OPEN, /**< Files still open.                     */\n    PHYSFS_ERR_INVALID_ARGUMENT, /**< Bad parameter passed to an function.  */\n    PHYSFS_ERR_NOT_MOUNTED,      /**< Requested archive/dir not mounted.    */\n    PHYSFS_ERR_NOT_FOUND,        /**< File (or whatever) not found.         */\n    PHYSFS_ERR_SYMLINK_FORBIDDEN,/**< Symlink seen when not permitted.      */\n    PHYSFS_ERR_NO_WRITE_DIR,     /**< No write dir has been specified.      */\n    PHYSFS_ERR_OPEN_FOR_READING, /**< Wrote to a file opened for reading.   */\n    PHYSFS_ERR_OPEN_FOR_WRITING, /**< Read from a file opened for writing.  */\n    PHYSFS_ERR_NOT_A_FILE,       /**< Needed a file, got a directory (etc). */\n    PHYSFS_ERR_READ_ONLY,        /**< Wrote to a read-only filesystem.      */\n    PHYSFS_ERR_CORRUPT,          /**< Corrupted data encountered.           */\n    PHYSFS_ERR_SYMLINK_LOOP,     /**< Infinite symbolic link loop.          */\n    PHYSFS_ERR_IO,               /**< i/o error (hardware failure, etc).    */\n    PHYSFS_ERR_PERMISSION,       /**< Permission denied.                    */\n    PHYSFS_ERR_NO_SPACE,         /**< No space (disk full, over quota, etc) */\n    PHYSFS_ERR_BAD_FILENAME,     /**< Filename is bogus/insecure.           */\n    PHYSFS_ERR_BUSY,             /**< Tried to modify a file the OS needs.  */\n    PHYSFS_ERR_DIR_NOT_EMPTY,    /**< Tried to delete dir with files in it. */\n    PHYSFS_ERR_OS_ERROR,         /**< Unspecified OS-level error.           */\n    PHYSFS_ERR_DUPLICATE,        /**< Duplicate entry.                      */\n    PHYSFS_ERR_BAD_PASSWORD,     /**< Bad password.                         */\n    PHYSFS_ERR_APP_CALLBACK      /**< Application callback reported error.  */\n} PHYSFS_ErrorCode;\n\n\n/**\n * \\fn PHYSFS_ErrorCode PHYSFS_getLastErrorCode(void)\n * \\brief Get machine-readable error information.\n *\n * Get the last PhysicsFS error message as an integer value. This will return\n *  PHYSFS_ERR_OK if there's been no error since the last call to this\n *  function. Each thread has a unique error state associated with it, but\n *  each time a new error message is set, it will overwrite the previous one\n *  associated with that thread. It is safe to call this function at anytime,\n *  even before PHYSFS_init().\n *\n * PHYSFS_getLastError() and PHYSFS_getLastErrorCode() both reset the same\n *  thread-specific error state. Calling one will wipe out the other's\n *  data. If you need both, call PHYSFS_getLastErrorCode(), then pass that\n *  value to PHYSFS_getErrorByCode().\n *\n * Generally, applications should only concern themselves with whether a\n *  given function failed; however, if you require more specifics, you can\n *  try this function to glean information, if there's some specific problem\n *  you're expecting and plan to handle. But with most things that involve\n *  file systems, the best course of action is usually to give up, report the\n *  problem to the user, and let them figure out what should be done about it.\n *  For that, you might prefer PHYSFS_getErrorByCode() instead.\n *\n *   \\return Enumeration value that represents last reported error.\n *\n * \\sa PHYSFS_getErrorByCode\n */\nPHYSFS_DECL PHYSFS_ErrorCode PHYSFS_getLastErrorCode(void);\n\n\n/**\n * \\fn const char *PHYSFS_getErrorByCode(PHYSFS_ErrorCode code)\n * \\brief Get human-readable description string for a given error code.\n *\n * Get a static string, in UTF-8 format, that represents an English\n *  description of a given error code.\n *\n * This string is guaranteed to never change (although we may add new strings\n *  for new error codes in later versions of PhysicsFS), so you can use it\n *  for keying a localization dictionary.\n *\n * It is safe to call this function at anytime, even before PHYSFS_init().\n *\n * These strings are meant to be passed on directly to the user.\n *  Generally, applications should only concern themselves with whether a\n *  given function failed, but not care about the specifics much.\n *\n * Do not attempt to free the returned strings; they are read-only and you\n *  don't own their memory pages.\n *\n *   \\param code Error code to convert to a string.\n *   \\return READ ONLY string of requested error message, NULL if this\n *           is not a valid PhysicsFS error code. Always check for NULL if\n *           you might be looking up an error code that didn't exist in an\n *           earlier version of PhysicsFS.\n *\n * \\sa PHYSFS_getLastErrorCode\n */\nPHYSFS_DECL const char *PHYSFS_getErrorByCode(PHYSFS_ErrorCode code);\n\n/**\n * \\fn void PHYSFS_setErrorCode(PHYSFS_ErrorCode code)\n * \\brief Set the current thread's error code.\n *\n * This lets you set the value that will be returned by the next call to\n *  PHYSFS_getLastErrorCode(). This will replace any existing error code,\n *  whether set by your application or internally by PhysicsFS.\n *\n * Error codes are stored per-thread; what you set here will not be\n *  accessible to another thread.\n *\n * Any call into PhysicsFS may change the current error code, so any code you\n *  set here is somewhat fragile, and thus you shouldn't build any serious\n *  error reporting framework on this function. The primary goal of this\n *  function is to allow PHYSFS_Io implementations to set the error state,\n *  which generally will be passed back to your application when PhysicsFS\n *  makes a PHYSFS_Io call that fails internally.\n *\n * This function doesn't care if the error code is a value known to PhysicsFS\n *  or not (but PHYSFS_getErrorByCode() will return NULL for unknown values).\n *  The value will be reported unmolested by PHYSFS_getLastErrorCode().\n *\n *   \\param code Error code to become the current thread's new error state.\n *\n * \\sa PHYSFS_getLastErrorCode\n * \\sa PHYSFS_getErrorByCode\n */\nPHYSFS_DECL void PHYSFS_setErrorCode(PHYSFS_ErrorCode code);\n\n\n/**\n * \\fn const char *PHYSFS_getPrefDir(const char *org, const char *app)\n * \\brief Get the user-and-app-specific path where files can be written.\n *\n * Helper function.\n *\n * Get the \"pref dir\". This is meant to be where users can write personal\n *  files (preferences and save games, etc) that are specific to your\n *  application. This directory is unique per user, per application.\n *\n * This function will decide the appropriate location in the native filesystem,\n *  create the directory if necessary, and return a string in\n *  platform-dependent notation, suitable for passing to PHYSFS_setWriteDir().\n *\n * On Windows, this might look like:\n *  \"C:\\\\Users\\\\bob\\\\AppData\\\\Roaming\\\\My Company\\\\My Program Name\"\n *\n * On Linux, this might look like:\n *  \"/home/bob/.local/share/My Program Name\"\n *\n * On Mac OS X, this might look like:\n *  \"/Users/bob/Library/Application Support/My Program Name\"\n *\n * (etc.)\n *\n * You should probably use the pref dir for your write dir, and also put it\n *  near the beginning of your search path. Older versions of PhysicsFS\n *  offered only PHYSFS_getUserDir() and left you to figure out where the\n *  files should go under that tree. This finds the correct location\n *  for whatever platform, which not only changes between operating systems,\n *  but also versions of the same operating system.\n *\n * You specify the name of your organization (if it's not a real organization,\n *  your name or an Internet domain you own might do) and the name of your\n *  application. These should be proper names.\n *\n * Both the (org) and (app) strings may become part of a directory name, so\n *  please follow these rules:\n *\n *    - Try to use the same org string (including case-sensitivity) for\n *      all your applications that use this function.\n *    - Always use a unique app string for each one, and make sure it never\n *      changes for an app once you've decided on it.\n *    - Unicode characters are legal, as long as it's UTF-8 encoded, but...\n *    - ...only use letters, numbers, and spaces. Avoid punctuation like\n *      \"Game Name 2: Bad Guy's Revenge!\" ... \"Game Name 2\" is sufficient.\n *\n * The pointer returned by this function remains valid until you call this\n *  function again, or call PHYSFS_deinit(). This is not necessarily a fast\n *  call, though, so you should call this once at startup and copy the string\n *  if you need it.\n *\n * You should assume the path returned by this function is the only safe\n *  place to write files (and that PHYSFS_getUserDir() and PHYSFS_getBaseDir(),\n *  while they might be writable, or even parents of the returned path, aren't\n *  where you should be writing things).\n *\n *   \\param org The name of your organization.\n *   \\param app The name of your application.\n *  \\return READ ONLY string of user dir in platform-dependent notation. NULL\n *          if there's a problem (creating directory failed, etc).\n *\n * \\sa PHYSFS_getBaseDir\n * \\sa PHYSFS_getUserDir\n */\nPHYSFS_DECL const char *PHYSFS_getPrefDir(const char *org, const char *app);\n\n\n/**\n * \\struct PHYSFS_Archiver\n * \\brief Abstract interface to provide support for user-defined archives.\n *\n * \\warning This is advanced, hardcore stuff. You don't need this unless you\n *          really know what you're doing. Most apps will not need this.\n *\n * Historically, PhysicsFS provided a means to mount various archive file\n *  formats, and physical directories in the native filesystem. However,\n *  applications have been limited to the file formats provided by the\n *  library. This interface allows an application to provide their own\n *  archive file types.\n *\n * Conceptually, a PHYSFS_Archiver provides directory entries, while\n *  PHYSFS_Io provides data streams for those directory entries. The most\n *  obvious use of PHYSFS_Archiver is to provide support for an archive\n *  file type that isn't provided by PhysicsFS directly: perhaps some\n *  proprietary format that only your application needs to understand.\n *\n * Internally, all the built-in archive support uses this interface, so the\n *  best examples for building a PHYSFS_Archiver is the source code to\n *  PhysicsFS itself.\n *\n * An archiver is added to the system with PHYSFS_registerArchiver(), and then\n *  it will be available for use automatically with PHYSFS_mount(); if a\n *  given archive can be handled with your archiver, it will be given control\n *  as appropriate.\n *\n * These methods deal with dir handles. You have one instance of your\n *  archiver, and it generates a unique, opaque handle for each opened\n *  archive in its openArchive() method. Since the lifetime of an Archiver\n *  (not an archive) is generally the entire lifetime of the process, and it's\n *  assumed to be a singleton, we do not provide any instance data for the\n *  archiver itself; the app can just use some static variables if necessary.\n *\n * Symlinks should always be followed (except in stat()); PhysicsFS will\n *  use the stat() method to check for symlinks and make a judgement on\n *  whether to continue to call other methods based on that.\n *\n * Archivers, when necessary, should set the PhysicsFS error state with\n *  PHYSFS_setErrorCode() before returning. PhysicsFS will pass these errors\n *  back to the application unmolested in most cases.\n *\n * Thread safety: PHYSFS_Archiver implementations are not guaranteed to be\n *  thread safe in themselves. PhysicsFS provides thread safety when it calls\n *  into a given archiver inside the library, but it does not promise that\n *  using the same PHYSFS_File from two threads at once is thread-safe; as\n *  such, your PHYSFS_Archiver can assume that locking is handled for you\n *  so long as the PHYSFS_Io you return from PHYSFS_open* doesn't change any\n *  of your Archiver state, as the PHYSFS_Io won't be as aggressively\n *  protected.\n *\n * \\sa PHYSFS_registerArchiver\n * \\sa PHYSFS_deregisterArchiver\n * \\sa PHYSFS_supportedArchiveTypes\n */\ntypedef struct PHYSFS_Archiver\n{\n    /**\n     * \\brief Binary compatibility information.\n     *\n     * This must be set to zero at this time. Future versions of this\n     *  struct will increment this field, so we know what a given\n     *  implementation supports. We'll presumably keep supporting older\n     *  versions as we offer new features, though.\n     */\n    PHYSFS_uint32 version;\n\n    /**\n     * \\brief Basic info about this archiver.\n     *\n     * This is used to identify your archive, and is returned in\n     *  PHYSFS_supportedArchiveTypes().\n     */\n    PHYSFS_ArchiveInfo info;\n\n    /**\n     * \\brief Open an archive provided by (io).\n     *\n     * This is where resources are allocated and data is parsed when mounting\n     *  an archive.\n     * (name) is a filename associated with (io), but doesn't necessarily\n     *  map to anything, let alone a real filename. This possibly-\n     *  meaningless name is in platform-dependent notation.\n     * (forWrite) is non-zero if this is to be used for\n     *  the write directory, and zero if this is to be used for an\n     *  element of the search path.\n     * (claimed) should be set to 1 if this is definitely an archive your\n     *  archiver implementation can handle, even if it fails. We use to\n     *  decide if we should stop trying other archivers if you fail to open\n     *  it. For example: the .zip archiver will set this to 1 for something\n     *  that's got a .zip file signature, even if it failed because the file\n     *  was also truncated. No sense in trying other archivers here, we\n     *  already tried to handle it with the appropriate implementation!.\n     * Return NULL on failure and set (claimed) appropriately. If no archiver\n     *  opened the archive or set (claimed), PHYSFS_mount() will report\n     *  PHYSFS_ERR_UNSUPPORTED. Otherwise, it will report the error from the\n     *  archiver that claimed the data through (claimed).\n     * Return non-NULL on success. The pointer returned will be\n     *  passed as the \"opaque\" parameter for later calls.\n     */\n    void *(*openArchive)(PHYSFS_Io *io, const char *name,\n                         int forWrite, int *claimed);\n\n    /**\n     * \\brief List all files in (dirname).\n     *\n     * Each file is passed to (cb), where a copy is made if appropriate, so\n     *  you can dispose of it upon return from the callback. (dirname) is in\n     *  platform-independent notation.\n     * If you have a failure, call PHYSFS_SetErrorCode() with whatever code\n     *  seem appropriate and return PHYSFS_ENUM_ERROR.\n     * If the callback returns PHYSFS_ENUM_ERROR, please call\n     *  PHYSFS_SetErrorCode(PHYSFS_ERR_APP_CALLBACK) and then return\n     *  PHYSFS_ENUM_ERROR as well. Don't call the callback again in any\n     *  circumstances.\n     * If the callback returns PHYSFS_ENUM_STOP, stop enumerating and return\n     *  PHYSFS_ENUM_STOP as well. Don't call the callback again in any\n     *  circumstances. Don't set an error code in this case.\n     * Callbacks are only supposed to return a value from\n     *  PHYSFS_EnumerateCallbackResult. Any other result has undefined\n     *  behavior.\n     * As long as the callback returned PHYSFS_ENUM_OK and you haven't\n     *  experienced any errors of your own, keep enumerating until you're done\n     *  and then return PHYSFS_ENUM_OK without setting an error code.\n     *\n     * \\warning PHYSFS_enumerate returns zero or non-zero (success or failure),\n     *          so be aware this function pointer returns different values!\n     */\n    PHYSFS_EnumerateCallbackResult (*enumerate)(void *opaque,\n                     const char *dirname, PHYSFS_EnumerateCallback cb,\n                     const char *origdir, void *callbackdata);\n\n    /**\n     * \\brief Open a file in this archive for reading.\n     *\n     * This filename, (fnm), is in platform-independent notation.\n     * Fail if the file does not exist.\n     * Returns NULL on failure, and calls PHYSFS_setErrorCode().\n     *  Returns non-NULL on success. The pointer returned will be\n     *  passed as the \"opaque\" parameter for later file calls.\n     */\n    PHYSFS_Io *(*openRead)(void *opaque, const char *fnm);\n\n    /**\n     * \\brief Open a file in this archive for writing.\n     *\n     * If the file does not exist, it should be created. If it exists,\n     *  it should be truncated to zero bytes. The writing offset should\n     *  be the start of the file.\n     * If the archive is read-only, this operation should fail.\n     * This filename is in platform-independent notation.\n     * Returns NULL on failure, and calls PHYSFS_setErrorCode().\n     *  Returns non-NULL on success. The pointer returned will be\n     *  passed as the \"opaque\" parameter for later file calls.\n     */\n    PHYSFS_Io *(*openWrite)(void *opaque, const char *filename);\n\n    /**\n     * \\brief Open a file in this archive for appending.\n     *\n     * If the file does not exist, it should be created. The writing\n     *  offset should be the end of the file.\n     * If the archive is read-only, this operation should fail.\n     * This filename is in platform-independent notation.\n     * Returns NULL on failure, and calls PHYSFS_setErrorCode().\n     *  Returns non-NULL on success. The pointer returned will be\n     *  passed as the \"opaque\" parameter for later file calls.\n     */\n    PHYSFS_Io *(*openAppend)(void *opaque, const char *filename);\n\n    /**\n     * \\brief Delete a file or directory in the archive.\n     *\n     * This same call is used for both files and directories; there is not a\n     *  separate rmdir() call. Directories are only meant to be removed if\n     *  they are empty.\n     * If the archive is read-only, this operation should fail.\n     *\n     * Return non-zero on success, zero on failure.\n     * This filename is in platform-independent notation.\n     * On failure, call PHYSFS_setErrorCode().\n     */\n    int (*remove)(void *opaque, const char *filename);\n\n    /**\n     * \\brief Create a directory in the archive.\n     *\n     * If the application is trying to make multiple dirs, PhysicsFS\n     *  will split them up into multiple calls before passing them to\n     *  your driver.\n     * If the archive is read-only, this operation should fail.\n     * Return non-zero on success, zero on failure.\n     *  This filename is in platform-independent notation.\n     * On failure, call PHYSFS_setErrorCode().\n     */\n    int (*mkdir)(void *opaque, const char *filename);\n\n    /**\n     * \\brief Obtain basic file metadata.\n     *\n     * On success, fill in all the fields in (stat), using\n     *  reasonable defaults for fields that apply to your archive.\n     *\n     * Returns non-zero on success, zero on failure.\n     * This filename is in platform-independent notation.\n     * On failure, call PHYSFS_setErrorCode().\n     */\n    int (*stat)(void *opaque, const char *fn, PHYSFS_Stat *stat);\n\n    /**\n     * \\brief Destruct a previously-opened archive.\n     *\n     * Close this archive, and free any associated memory,\n     *  including the original PHYSFS_Io and (opaque) itself, if\n     *  applicable. Implementation can assume that it won't be called if\n     *  there are still files open from this archive.\n     */\n    void (*closeArchive)(void *opaque);\n} PHYSFS_Archiver;\n\n/**\n * \\fn int PHYSFS_registerArchiver(const PHYSFS_Archiver *archiver)\n * \\brief Add a new archiver to the system.\n *\n * \\warning This is advanced, hardcore stuff. You don't need this unless you\n *          really know what you're doing. Most apps will not need this.\n *\n * If you want to provide your own archiver (for example, a custom archive\n *  file format, or some virtual thing you want to make look like a filesystem\n *  that you can access through the usual PhysicsFS APIs), this is where you\n *  start. Once an archiver is successfully registered, then you can use\n *  PHYSFS_mount() to add archives that your archiver supports to the\n *  search path, or perhaps use it as the write dir. Internally, PhysicsFS\n *  uses this function to register its own built-in archivers, like .zip\n *  support, etc.\n *\n * You may not have two archivers that handle the same extension. If you are\n *  going to have a clash, you can deregister the other archiver (including\n *  built-in ones) with PHYSFS_deregisterArchiver().\n *\n * The data in (archiver) is copied; you may free this pointer when this\n *  function returns.\n *\n * Once this function returns successfully, PhysicsFS will be able to support\n *  archives of this type until you deregister the archiver again.\n *\n *   \\param archiver The archiver to register.\n *  \\return Zero on error, non-zero on success.\n *\n * \\sa PHYSFS_Archiver\n * \\sa PHYSFS_deregisterArchiver\n */\nPHYSFS_DECL int PHYSFS_registerArchiver(const PHYSFS_Archiver *archiver);\n\n/**\n * \\fn int PHYSFS_deregisterArchiver(const char *ext)\n * \\brief Remove an archiver from the system.\n *\n * If for some reason, you only need your previously-registered archiver to\n *  live for a portion of your app's lifetime, you can remove it from the\n *  system once you're done with it through this function.\n *\n * This fails if there are any archives still open that use this archiver.\n *\n * This function can also remove internally-supplied archivers, like .zip\n *  support or whatnot. This could be useful in some situations, like\n *  disabling support for them outright or overriding them with your own\n *  implementation. Once an internal archiver is disabled like this,\n *  PhysicsFS provides no mechanism to recover them, short of calling\n *  PHYSFS_deinit() and PHYSFS_init() again.\n *\n * PHYSFS_deinit() will automatically deregister all archivers, so you don't\n *  need to explicitly deregister yours if you otherwise shut down cleanly.\n *\n *   \\param ext Filename extension that the archiver handles.\n *  \\return Zero on error, non-zero on success.\n *\n * \\sa PHYSFS_Archiver\n * \\sa PHYSFS_registerArchiver\n */\nPHYSFS_DECL int PHYSFS_deregisterArchiver(const char *ext);\n\n\n/* Everything above this line is part of the PhysicsFS 2.1 API. */\n\n\n/**\n * \\fn int PHYSFS_setRoot(const char *archive, const char *subdir)\n * \\brief Make a subdirectory of an archive its root directory.\n *\n * This lets you narrow down the accessible files in a specific archive. For\n *  example, if you have x.zip with a file in y/z.txt, mounted to /a, if you\n *  call PHYSFS_setRoot(\"x.zip\", \"/y\"), then the call\n *  PHYSFS_openRead(\"/a/z.txt\") will succeed.\n *\n * You can change an archive's root at any time, altering the interpolated\n *  file tree (depending on where paths shift, a different archive may be\n *  providing various files). If you set the root to NULL or \"/\", the\n *  archive will be treated as if no special root was set (as if the archive\n *  was just mounted normally).\n *\n * Changing the root only affects future operations on pathnames; a file\n *  that was opened from a path that changed due to a setRoot will not be\n *  affected.\n *\n * Setting a new root is not limited to archives in the search path; you may\n *  set one on the write dir, too, which might be useful if you have files\n *  open for write and thus can't change the write dir at the moment.\n *\n * It is not an error to set a subdirectory that does not exist to be the\n *  root of an archive; however, no files will be visible in this case. If\n *  the missing directories end up getting created (a mkdir to the physical\n *  filesystem, etc) then this will be reflected in the interpolated tree.\n *\n *    \\param archive dir/archive on which to change root.\n *    \\param subdir new subdirectory to make the root of this archive.\n *   \\return nonzero on success, zero on failure. Use\n *           PHYSFS_getLastErrorCode() to obtain the specific error.\n */\nPHYSFS_DECL int PHYSFS_setRoot(const char *archive, const char *subdir);\n\n\n/* Everything above this line is part of the PhysicsFS 3.1 API. */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif  /* !defined _INCLUDE_PHYSFS_H_ */\n\n/* end of physfs.h ... */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_archiver_7z.c",
    "content": "/*\n * 7zip support routines for PhysicsFS.\n *\n * Please see the file LICENSE.txt in the source's root directory.\n *\n *  This file was written by Ryan C. Gordon.\n */\n\n#define __PHYSICSFS_INTERNAL__\n#include \"physfs_internal.h\"\n\n#if PHYSFS_SUPPORTS_7Z\n\n#include \"physfs_lzmasdk.h\"\n\ntypedef struct\n{\n    ISeekInStream seekStream; /* lzma sdk i/o interface (lower level).  */\n    PHYSFS_Io *io;            /* physfs i/o interface for this archive. */\n    CLookToRead lookStream;   /* lzma sdk i/o interface (higher level). */\n} SZIPLookToRead;\n\n/* One SZIPentry is kept for each file in an open 7zip archive. */\ntypedef struct\n{\n    __PHYSFS_DirTreeEntry tree;   /* manages directory tree         */\n    PHYSFS_uint32 dbidx;          /* index into lzma sdk database   */\n} SZIPentry;\n\n/* One SZIPinfo is kept for each open 7zip archive. */\ntypedef struct\n{\n    __PHYSFS_DirTree tree;    /* manages directory tree.           */\n    PHYSFS_Io *io;            /* physfs i/o interface for this archive. */\n    CSzArEx db;               /* lzma sdk archive database object. */\n} SZIPinfo;\n\n\nstatic PHYSFS_ErrorCode szipErrorCode(const SRes rc)\n{\n    switch (rc)\n    {\n        case SZ_OK: return PHYSFS_ERR_OK;\n        case SZ_ERROR_DATA: return PHYSFS_ERR_CORRUPT;\n        case SZ_ERROR_MEM: return PHYSFS_ERR_OUT_OF_MEMORY;\n        case SZ_ERROR_CRC: return PHYSFS_ERR_CORRUPT;\n        case SZ_ERROR_UNSUPPORTED: return PHYSFS_ERR_UNSUPPORTED;\n        case SZ_ERROR_INPUT_EOF: return PHYSFS_ERR_CORRUPT;\n        case SZ_ERROR_OUTPUT_EOF: return PHYSFS_ERR_IO;\n        case SZ_ERROR_READ: return PHYSFS_ERR_IO;\n        case SZ_ERROR_WRITE: return PHYSFS_ERR_IO;\n        case SZ_ERROR_ARCHIVE: return PHYSFS_ERR_CORRUPT;\n        case SZ_ERROR_NO_ARCHIVE: return PHYSFS_ERR_UNSUPPORTED;\n        default: break;\n    } /* switch */\n\n    return PHYSFS_ERR_OTHER_ERROR;\n} /* szipErrorCode */\n\n\n/* LZMA SDK's ISzAlloc interface ... */\n\nstatic void *SZIP_ISzAlloc_Alloc(void *p, size_t size)\n{\n    return allocator.Malloc(size ? size : 1);\n} /* SZIP_ISzAlloc_Alloc */\n\nstatic void SZIP_ISzAlloc_Free(void *p, void *address)\n{\n    if (address)\n        allocator.Free(address);\n} /* SZIP_ISzAlloc_Free */\n\nstatic ISzAlloc SZIP_SzAlloc = {\n    SZIP_ISzAlloc_Alloc, SZIP_ISzAlloc_Free\n};\n\n\n/* we implement ISeekInStream, and then wrap that in LZMA SDK's CLookToRead,\n   which implements the higher-level ILookInStream on top of that, handling\n   buffering and such for us. */\n\n/* LZMA SDK's ISeekInStream interface ... */\n\nstatic SRes SZIP_ISeekInStream_Read(void *p, void *buf, size_t *size)\n{\n    SZIPLookToRead *stream = (SZIPLookToRead *) p;\n    PHYSFS_Io *io = stream->io;\n    const PHYSFS_uint64 len = (PHYSFS_uint64) *size;\n    const PHYSFS_sint64 rc = (len == 0) ? 0 : io->read(io, buf, len);\n\n    if (rc < 0)\n    {\n        *size = 0;\n        return SZ_ERROR_READ;\n    } /* if */\n\n    *size = (size_t) rc;\n    return SZ_OK;\n} /* SZIP_ISeekInStream_Read */\n\nstatic SRes SZIP_ISeekInStream_Seek(void *p, Int64 *pos, ESzSeek origin)\n{\n    SZIPLookToRead *stream = (SZIPLookToRead *) p;\n    PHYSFS_Io *io = stream->io;\n    PHYSFS_sint64 base;\n    PHYSFS_uint64 newpos;\n\n    switch (origin)\n    {\n        case SZ_SEEK_SET:\n            base = 0;\n            break;\n\n        case SZ_SEEK_CUR:\n            base = io->tell(io);\n            break;\n\n        case SZ_SEEK_END:\n            base = io->length(io);\n            break;\n\n        default:\n            return SZ_ERROR_FAIL;\n    } /* switch */\n\n    if (base < 0)\n        return SZ_ERROR_FAIL;\n    else if ((*pos < 0) && (((Int64) base) < -*pos))\n        return SZ_ERROR_FAIL;\n\n    newpos = (PHYSFS_uint64) (((Int64) base) + *pos);\n    if (!io->seek(io, newpos))\n        return SZ_ERROR_FAIL;\n\n    *pos = (Int64) newpos;\n    return SZ_OK;\n} /* SZIP_ISeekInStream_Seek */\n\n\nstatic void szipInitStream(SZIPLookToRead *stream, PHYSFS_Io *io)\n{\n    stream->seekStream.Read = SZIP_ISeekInStream_Read;\n    stream->seekStream.Seek = SZIP_ISeekInStream_Seek;\n\n    stream->io = io;\n\n    /* !!! FIXME: can we use lookahead? Is there value to it? */\n    LookToRead_Init(&stream->lookStream);\n    LookToRead_CreateVTable(&stream->lookStream, False);\n    stream->lookStream.realStream = &stream->seekStream;\n} /* szipInitStream */\n\n\n/* Do this in a separate function so we can smallAlloc without looping. */\nstatic int szipLoadEntry(SZIPinfo *info, const PHYSFS_uint32 idx)\n{\n    const size_t utf16len = SzArEx_GetFileNameUtf16(&info->db, idx, NULL);\n    const size_t utf16buflen = utf16len * 2;\n    PHYSFS_uint16 *utf16 = (PHYSFS_uint16 *) __PHYSFS_smallAlloc(utf16buflen);\n    const size_t utf8buflen = utf16len * 4;\n    char *utf8 = (char *) __PHYSFS_smallAlloc(utf8buflen);\n    int retval = 0;\n\n    if (utf16 && utf8)\n    {\n        const int isdir = SzArEx_IsDir(&info->db, idx) != 0;\n        SZIPentry *entry;\n        SzArEx_GetFileNameUtf16(&info->db, idx, (UInt16 *) utf16);\n        PHYSFS_utf8FromUtf16(utf16, utf8, utf8buflen);\n        entry = (SZIPentry*) __PHYSFS_DirTreeAdd(&info->tree, utf8, isdir);\n        retval = (entry != NULL);\n        if (retval)\n            entry->dbidx = idx;\n    } /* if */\n\n    __PHYSFS_smallFree(utf8);\n    __PHYSFS_smallFree(utf16);\n\n    return retval;\n} /* szipLoadEntry */\n\n\nstatic int szipLoadEntries(SZIPinfo *info)\n{\n    int retval = 0;\n\n    if (__PHYSFS_DirTreeInit(&info->tree, sizeof (SZIPentry), 1, 0))\n    {\n        const PHYSFS_uint32 count = info->db.NumFiles;\n        PHYSFS_uint32 i;\n        for (i = 0; i < count; i++)\n            BAIL_IF_ERRPASS(!szipLoadEntry(info, i), 0);\n        retval = 1;\n    } /* if */\n\n    return retval;\n} /* szipLoadEntries */\n\n\nstatic void SZIP_closeArchive(void *opaque)\n{\n    SZIPinfo *info = (SZIPinfo *) opaque;\n    if (info)\n    {\n        if (info->io)\n            info->io->destroy(info->io);\n        SzArEx_Free(&info->db, &SZIP_SzAlloc);\n        __PHYSFS_DirTreeDeinit(&info->tree);\n        allocator.Free(info);\n    } /* if */\n} /* SZIP_closeArchive */\n\n\nstatic void *SZIP_openArchive(PHYSFS_Io *io, const char *name,\n                              int forWriting, int *claimed)\n{\n    static const PHYSFS_uint8 wantedsig[] = { '7','z',0xBC,0xAF,0x27,0x1C };\n    SZIPLookToRead stream;\n    ISzAlloc *alloc = &SZIP_SzAlloc;\n    SZIPinfo *info = NULL;\n    SRes rc;\n    PHYSFS_uint8 sig[6];\n    PHYSFS_sint64 pos;\n\n    BAIL_IF(forWriting, PHYSFS_ERR_READ_ONLY, NULL);\n    pos = io->tell(io);\n    BAIL_IF_ERRPASS(pos == -1, NULL);\n    BAIL_IF_ERRPASS(io->read(io, sig, 6) != 6, NULL);\n    *claimed = (memcmp(sig, wantedsig, 6) == 0);\n    BAIL_IF_ERRPASS(!io->seek(io, pos), NULL);\n\n    info = (SZIPinfo *) allocator.Malloc(sizeof (SZIPinfo));\n    BAIL_IF(!info, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n    memset(info, '\\0', sizeof (*info));\n\n    SzArEx_Init(&info->db);\n\n    info->io = io;\n\n    szipInitStream(&stream, io);\n    rc = SzArEx_Open(&info->db, &stream.lookStream.s, alloc, alloc);\n    GOTO_IF(rc != SZ_OK, szipErrorCode(rc), failed);\n\n    GOTO_IF_ERRPASS(!szipLoadEntries(info), failed);\n\n    return info;\n\nfailed:\n    info->io = NULL;  /* don't let cleanup destroy the PHYSFS_Io. */\n    SZIP_closeArchive(info);\n    return NULL;\n} /* SZIP_openArchive */\n\n\nstatic PHYSFS_Io *SZIP_openRead(void *opaque, const char *path)\n{\n    /* !!! FIXME: the current lzma sdk C API only allows you to decompress\n       !!! FIXME:  the entire file at once, which isn't ideal. Fix this in the\n       !!! FIXME:  SDK and then convert this all to a streaming interface. */\n\n    SZIPinfo *info = (SZIPinfo *) opaque;\n    SZIPentry *entry = (SZIPentry *) __PHYSFS_DirTreeFind(&info->tree, path);\n    ISzAlloc *alloc = &SZIP_SzAlloc;\n    SZIPLookToRead stream;\n    PHYSFS_Io *retval = NULL;\n    PHYSFS_Io *io = NULL;\n    UInt32 blockIndex = 0xFFFFFFFF;\n    Byte *outBuffer = NULL;\n    size_t outBufferSize = 0;\n    size_t offset = 0;\n    size_t outSizeProcessed = 0;\n    void *buf = NULL;\n    SRes rc;\n\n    BAIL_IF_ERRPASS(!entry, NULL);\n    BAIL_IF(entry->tree.isdir, PHYSFS_ERR_NOT_A_FILE, NULL);\n\n    io = info->io->duplicate(info->io);\n    GOTO_IF_ERRPASS(!io, SZIP_openRead_failed);\n\n    szipInitStream(&stream, io);\n\n    rc = SzArEx_Extract(&info->db, &stream.lookStream.s, entry->dbidx,\n                        &blockIndex, &outBuffer, &outBufferSize, &offset,\n                        &outSizeProcessed, alloc, alloc);\n    GOTO_IF(rc != SZ_OK, szipErrorCode(rc), SZIP_openRead_failed);\n    GOTO_IF(outBuffer == NULL, PHYSFS_ERR_OUT_OF_MEMORY, SZIP_openRead_failed);\n\n    io->destroy(io);\n    io = NULL;\n\n    buf = allocator.Malloc(outSizeProcessed ? outSizeProcessed : 1);\n    GOTO_IF(buf == NULL, PHYSFS_ERR_OUT_OF_MEMORY, SZIP_openRead_failed);\n\n    if (outSizeProcessed > 0)\n        memcpy(buf, outBuffer + offset, outSizeProcessed);\n\n    alloc->Free(alloc, outBuffer);\n    outBuffer = NULL;\n\n    retval = __PHYSFS_createMemoryIo(buf, outSizeProcessed, allocator.Free);\n    GOTO_IF_ERRPASS(!retval, SZIP_openRead_failed);\n\n    return retval;\n\nSZIP_openRead_failed:\n    if (io != NULL)\n        io->destroy(io);\n\n    if (buf)\n        allocator.Free(buf);\n\n    if (outBuffer)\n        alloc->Free(alloc, outBuffer);\n\n    return NULL;\n} /* SZIP_openRead */\n\n\nstatic PHYSFS_Io *SZIP_openWrite(void *opaque, const char *filename)\n{\n    BAIL(PHYSFS_ERR_READ_ONLY, NULL);\n} /* SZIP_openWrite */\n\n\nstatic PHYSFS_Io *SZIP_openAppend(void *opaque, const char *filename)\n{\n    BAIL(PHYSFS_ERR_READ_ONLY, NULL);\n} /* SZIP_openAppend */\n\n\nstatic int SZIP_remove(void *opaque, const char *name)\n{\n    BAIL(PHYSFS_ERR_READ_ONLY, 0);\n} /* SZIP_remove */\n\n\nstatic int SZIP_mkdir(void *opaque, const char *name)\n{\n    BAIL(PHYSFS_ERR_READ_ONLY, 0);\n} /* SZIP_mkdir */\n\n\nstatic inline PHYSFS_uint64 lzmasdkTimeToPhysfsTime(const CNtfsFileTime *t)\n{\n    const PHYSFS_uint64 winEpochToUnixEpoch = __PHYSFS_UI64(0x019DB1DED53E8000);\n    const PHYSFS_uint64 nanosecToMillisec = __PHYSFS_UI64(10000000);\n    const PHYSFS_uint64 quad = (((PHYSFS_uint64) t->High) << 32) | t->Low;\n    return (quad - winEpochToUnixEpoch) / nanosecToMillisec;\n} /* lzmasdkTimeToPhysfsTime */\n\n\nstatic int SZIP_stat(void *opaque, const char *path, PHYSFS_Stat *stat)\n{\n    SZIPinfo *info = (SZIPinfo *) opaque;\n    SZIPentry *entry;\n    PHYSFS_uint32 idx;\n\n    entry = (SZIPentry *) __PHYSFS_DirTreeFind(&info->tree, path);\n    BAIL_IF_ERRPASS(!entry, 0);\n    idx = entry->dbidx;\n\n    if (entry->tree.isdir)\n    {\n        stat->filesize = -1;\n\t    stat->filetype = PHYSFS_FILETYPE_DIRECTORY;\n    } /* if */\n    else\n    {\n        stat->filesize = (PHYSFS_sint64) SzArEx_GetFileSize(&info->db, idx);\n\t    stat->filetype = PHYSFS_FILETYPE_REGULAR;\n    } /* else */\n\n    if (info->db.MTime.Vals != NULL)\n\t    stat->modtime = lzmasdkTimeToPhysfsTime(&info->db.MTime.Vals[idx]);\n    else if (info->db.CTime.Vals != NULL)\n\t    stat->modtime = lzmasdkTimeToPhysfsTime(&info->db.CTime.Vals[idx]);\n    else\n\t    stat->modtime = -1;\n\n    if (info->db.CTime.Vals != NULL)\n\t    stat->createtime = lzmasdkTimeToPhysfsTime(&info->db.CTime.Vals[idx]);\n    else if (info->db.MTime.Vals != NULL)\n\t    stat->createtime = lzmasdkTimeToPhysfsTime(&info->db.MTime.Vals[idx]);\n    else\n\t    stat->createtime = -1;\n\n\tstat->accesstime = -1;\n\tstat->readonly = 1;\n\n    return 1;\n} /* SZIP_stat */\n\n\nvoid SZIP_global_init(void)\n{\n    /* this just needs to calculate some things, so it only ever\n       has to run once, even after a deinit. */\n    static int generatedTable = 0;\n    if (!generatedTable)\n    {\n        generatedTable = 1;\n        CrcGenerateTable();\n    } /* if */\n} /* SZIP_global_init */\n\n\nconst PHYSFS_Archiver __PHYSFS_Archiver_7Z =\n{\n    CURRENT_PHYSFS_ARCHIVER_API_VERSION,\n    {\n        \"7Z\",\n        \"7zip archives\",\n        \"Ryan C. Gordon <icculus@icculus.org>\",\n        \"https://icculus.org/physfs/\",\n        0,  /* supportsSymlinks */\n    },\n    SZIP_openArchive,\n    __PHYSFS_DirTreeEnumerate,\n    SZIP_openRead,\n    SZIP_openWrite,\n    SZIP_openAppend,\n    SZIP_remove,\n    SZIP_mkdir,\n    SZIP_stat,\n    SZIP_closeArchive\n};\n\n#endif  /* defined PHYSFS_SUPPORTS_7Z */\n\n/* end of physfs_archiver_7z.c ... */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_archiver_dir.c",
    "content": "/*\n * Standard directory I/O support routines for PhysicsFS.\n *\n * Please see the file LICENSE.txt in the source's root directory.\n *\n *  This file written by Ryan C. Gordon.\n */\n\n#define __PHYSICSFS_INTERNAL__\n#include \"physfs_internal.h\"\n\n/* There's no PHYSFS_Io interface here. Use __PHYSFS_createNativeIo(). */\n\n\n\nstatic char *cvtToDependent(const char *prepend, const char *path,\n                            char *buf, const size_t buflen)\n{\n    BAIL_IF(buf == NULL, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n    snprintf(buf, buflen, \"%s%s\", prepend ? prepend : \"\", path);\n\n    #if !__PHYSFS_STANDARD_DIRSEP\n    assert(__PHYSFS_platformDirSeparator != '/');\n    {\n        char *p;\n        for (p = strchr(buf, '/'); p != NULL; p = strchr(p + 1, '/'))\n            *p = __PHYSFS_platformDirSeparator;\n    } /* if */\n    #endif\n\n    return buf;\n} /* cvtToDependent */\n\n\n#define CVT_TO_DEPENDENT(buf, pre, dir) { \\\n    const size_t len = ((pre) ? strlen((char *) pre) : 0) + strlen(dir) + 1; \\\n    buf = cvtToDependent((char*)pre,dir,(char*)__PHYSFS_smallAlloc(len),len); \\\n}\n\n\n\nstatic void *DIR_openArchive(PHYSFS_Io *io, const char *name,\n                             int forWriting, int *claimed)\n{\n    PHYSFS_Stat st;\n    const char dirsep = __PHYSFS_platformDirSeparator;\n    char *retval = NULL;\n    const size_t namelen = strlen(name);\n    const size_t seplen = 1;\n\n    assert(io == NULL);  /* shouldn't create an Io for these. */\n    BAIL_IF_ERRPASS(!__PHYSFS_platformStat(name, &st, 1), NULL);\n\n    if (st.filetype != PHYSFS_FILETYPE_DIRECTORY)\n        BAIL(PHYSFS_ERR_UNSUPPORTED, NULL);\n\n    *claimed = 1;\n    retval = allocator.Malloc(namelen + seplen + 1);\n    BAIL_IF(retval == NULL, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n\n    strcpy(retval, name);\n\n    /* make sure there's a dir separator at the end of the string */\n    if (retval[namelen - 1] != dirsep)\n    {\n        retval[namelen] = dirsep;\n        retval[namelen + 1] = '\\0';\n    } /* if */\n\n    return retval;\n} /* DIR_openArchive */\n\n\nstatic PHYSFS_EnumerateCallbackResult DIR_enumerate(void *opaque,\n                         const char *dname, PHYSFS_EnumerateCallback cb,\n                         const char *origdir, void *callbackdata)\n{\n    char *d;\n    PHYSFS_EnumerateCallbackResult retval;\n    CVT_TO_DEPENDENT(d, opaque, dname);\n    BAIL_IF_ERRPASS(!d, PHYSFS_ENUM_ERROR);\n    retval = __PHYSFS_platformEnumerate(d, cb, origdir, callbackdata);\n    __PHYSFS_smallFree(d);\n    return retval;\n} /* DIR_enumerate */\n\n\nstatic PHYSFS_Io *doOpen(void *opaque, const char *name, const int mode)\n{\n    PHYSFS_Io *io = NULL;\n    char *f = NULL;\n\n    CVT_TO_DEPENDENT(f, opaque, name);\n    BAIL_IF_ERRPASS(!f, NULL);\n\n    io = __PHYSFS_createNativeIo(f, mode);\n    if (io == NULL)\n    {\n        const PHYSFS_ErrorCode err = PHYSFS_getLastErrorCode();\n        PHYSFS_Stat statbuf;\n        __PHYSFS_platformStat(f, &statbuf, 0);  /* !!! FIXME: why are we stating here? */\n        PHYSFS_setErrorCode(err);\n    } /* if */\n\n    __PHYSFS_smallFree(f);\n\n    return io;\n} /* doOpen */\n\n\nstatic PHYSFS_Io *DIR_openRead(void *opaque, const char *filename)\n{\n    return doOpen(opaque, filename, 'r');\n} /* DIR_openRead */\n\n\nstatic PHYSFS_Io *DIR_openWrite(void *opaque, const char *filename)\n{\n    return doOpen(opaque, filename, 'w');\n} /* DIR_openWrite */\n\n\nstatic PHYSFS_Io *DIR_openAppend(void *opaque, const char *filename)\n{\n    return doOpen(opaque, filename, 'a');\n} /* DIR_openAppend */\n\n\nstatic int DIR_remove(void *opaque, const char *name)\n{\n    int retval;\n    char *f;\n\n    CVT_TO_DEPENDENT(f, opaque, name);\n    BAIL_IF_ERRPASS(!f, 0);\n    retval = __PHYSFS_platformDelete(f);\n    __PHYSFS_smallFree(f);\n    return retval;\n} /* DIR_remove */\n\n\nstatic int DIR_mkdir(void *opaque, const char *name)\n{\n    int retval;\n    char *f;\n\n    CVT_TO_DEPENDENT(f, opaque, name);\n    BAIL_IF_ERRPASS(!f, 0);\n    retval = __PHYSFS_platformMkDir(f);\n    __PHYSFS_smallFree(f);\n    return retval;\n} /* DIR_mkdir */\n\n\nstatic void DIR_closeArchive(void *opaque)\n{\n    allocator.Free(opaque);\n} /* DIR_closeArchive */\n\n\nstatic int DIR_stat(void *opaque, const char *name, PHYSFS_Stat *stat)\n{\n    int retval = 0;\n    char *d;\n\n    CVT_TO_DEPENDENT(d, opaque, name);\n    BAIL_IF_ERRPASS(!d, 0);\n    retval = __PHYSFS_platformStat(d, stat, 0);\n    __PHYSFS_smallFree(d);\n    return retval;\n} /* DIR_stat */\n\n\nconst PHYSFS_Archiver __PHYSFS_Archiver_DIR =\n{\n    CURRENT_PHYSFS_ARCHIVER_API_VERSION,\n    {\n        \"\",\n        \"Non-archive, direct filesystem I/O\",\n        \"Ryan C. Gordon <icculus@icculus.org>\",\n        \"https://icculus.org/physfs/\",\n        1,  /* supportsSymlinks */\n    },\n    DIR_openArchive,\n    DIR_enumerate,\n    DIR_openRead,\n    DIR_openWrite,\n    DIR_openAppend,\n    DIR_remove,\n    DIR_mkdir,\n    DIR_stat,\n    DIR_closeArchive\n};\n\n/* end of physfs_archiver_dir.c ... */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_archiver_grp.c",
    "content": "/*\n * GRP support routines for PhysicsFS.\n *\n * This driver handles BUILD engine archives (\"groupfiles\"). This format\n *  (but not this driver) was put together by Ken Silverman.\n *\n * The format is simple enough. In Ken's words:\n *\n *    What's the .GRP file format?\n *\n *     The \".grp\" file format is just a collection of a lot of files stored\n *     into 1 big one. I tried to make the format as simple as possible: The\n *     first 12 bytes contains my name, \"KenSilverman\". The next 4 bytes is\n *     the number of files that were compacted into the group file. Then for\n *     each file, there is a 16 byte structure, where the first 12 bytes are\n *     the filename, and the last 4 bytes are the file's size. The rest of\n *     the group file is just the raw data packed one after the other in the\n *     same order as the list of files.\n *\n * (That info is from http://www.advsys.net/ken/build.htm ...)\n *\n * Please see the file LICENSE.txt in the source's root directory.\n *\n *  This file written by Ryan C. Gordon.\n */\n\n#define __PHYSICSFS_INTERNAL__\n#include \"physfs_internal.h\"\n\n#if PHYSFS_SUPPORTS_GRP\n\nstatic int grpLoadEntries(PHYSFS_Io *io, const PHYSFS_uint32 count, void *arc)\n{\n    PHYSFS_uint32 pos = 16 + (16 * count);  /* past sig+metadata. */\n    PHYSFS_uint32 i;\n\n    for (i = 0; i < count; i++)\n    {\n        char *ptr;\n        char name[13];\n        PHYSFS_uint32 size;\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, name, 12), 0);\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &size, 4), 0);\n\n        name[12] = '\\0';  /* name isn't null-terminated in file. */\n        if ((ptr = strchr(name, ' ')) != NULL)\n            *ptr = '\\0';  /* trim extra spaces. */\n\n        size = PHYSFS_swapULE32(size);\n        BAIL_IF_ERRPASS(!UNPK_addEntry(arc, name, 0, -1, -1, pos, size), 0);\n\n        pos += size;\n    } /* for */\n\n    return 1;\n} /* grpLoadEntries */\n\n\nstatic void *GRP_openArchive(PHYSFS_Io *io, const char *name,\n                             int forWriting, int *claimed)\n{\n    PHYSFS_uint8 buf[12];\n    PHYSFS_uint32 count = 0;\n    void *unpkarc = NULL;\n\n    assert(io != NULL);  /* shouldn't ever happen. */\n\n    BAIL_IF(forWriting, PHYSFS_ERR_READ_ONLY, NULL);\n\n    BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, buf, sizeof (buf)), NULL);\n    if (memcmp(buf, \"KenSilverman\", sizeof (buf)) != 0)\n        BAIL(PHYSFS_ERR_UNSUPPORTED, NULL);\n\n    *claimed = 1;\n\n    BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &count, sizeof(count)), NULL);\n    count = PHYSFS_swapULE32(count);\n\n    unpkarc = UNPK_openArchive(io, 0, 1);\n    BAIL_IF_ERRPASS(!unpkarc, NULL);\n\n    if (!grpLoadEntries(io, count, unpkarc))\n    {\n        UNPK_abandonArchive(unpkarc);\n        return NULL;\n    } /* if */\n\n    return unpkarc;\n} /* GRP_openArchive */\n\n\nconst PHYSFS_Archiver __PHYSFS_Archiver_GRP =\n{\n    CURRENT_PHYSFS_ARCHIVER_API_VERSION,\n    {\n        \"GRP\",\n        \"Build engine Groupfile format\",\n        \"Ryan C. Gordon <icculus@icculus.org>\",\n        \"https://icculus.org/physfs/\",\n        0,  /* supportsSymlinks */\n    },\n    GRP_openArchive,\n    UNPK_enumerate,\n    UNPK_openRead,\n    UNPK_openWrite,\n    UNPK_openAppend,\n    UNPK_remove,\n    UNPK_mkdir,\n    UNPK_stat,\n    UNPK_closeArchive\n};\n\n#endif  /* defined PHYSFS_SUPPORTS_GRP */\n\n/* end of physfs_archiver_grp.c ... */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_archiver_hog.c",
    "content": "/*\n * HOG support routines for PhysicsFS.\n *\n * This driver handles Descent I/II/III HOG archives.\n *\n * The Descent I/II format is very simple:\n *\n *   The file always starts with the 3-byte signature \"DHF\" (Descent\n *   HOG file). After that the files of a HOG are just attached after\n *   another, divided by a 17 bytes header, which specifies the name\n *   and length (in bytes) of the forthcoming file! So you just read\n *   the header with its information of how big the following file is,\n *   and then skip exact that number of bytes to get to the next file\n *   in that HOG.\n *\n *    char sig[3] = {'D', 'H', 'F'}; // \"DHF\"=Descent HOG File\n *\n *    struct {\n *     char file_name[13]; // Filename, padded to 13 bytes with 0s\n *     int file_size; // filesize in bytes\n *     char data[file_size]; // The file data\n *    } FILE_STRUCT; // Repeated until the end of the file.\n *\n * (That info is from http://www.descent2.com/ddn/specs/hog/)\n *\n * Descent 3 moved to HOG2 format, which starts with the chars \"HOG2\",\n *  then 32-bits for the number of contained files, 32 bits for the offset\n *  to the first file's data, then 56 bytes of 0xFF (reserved?). Then for\n *  each file, there's 36 bytes for filename (null-terminated, rest of bytes\n *  are garbage), 32-bits unknown/reserved (always zero?), 32-bits of length\n *  of file data, 32-bits of time since Unix epoch. Then immediately following,\n *  for each file is their uncompressed content, you can find its offset\n *  by starting at the initial data offset and adding the filesize of each\n *  prior file.\n *\n * This information was found at:\n *  https://web.archive.org/web/20020213004051/http://descent-3.com/ddn/specs/hog/\n *\n *\n * Please see the file LICENSE.txt in the source's root directory.\n *\n * This file written by Bradley Bell and Ryan C. Gordon.\n */\n\n#define __PHYSICSFS_INTERNAL__\n#include \"physfs_internal.h\"\n\n#if PHYSFS_SUPPORTS_HOG\n\nstatic int readui32(PHYSFS_Io *io, PHYSFS_uint32 *val)\n{\n    PHYSFS_uint32 v;\n    BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &v, sizeof (v)), 0);\n    *val = PHYSFS_swapULE32(v);\n    return 1;\n} /* readui32 */\n\nstatic int hog1LoadEntries(PHYSFS_Io *io, void *arc)\n{\n    const PHYSFS_uint64 iolen = io->length(io);\n    PHYSFS_uint32 pos = 3;\n\n    while (pos < iolen)\n    {\n        PHYSFS_uint32 size;\n        char name[13];\n\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, name, 13), 0);\n        BAIL_IF_ERRPASS(!readui32(io, &size), 0);\n        name[12] = '\\0';  /* just in case. */\n        pos += 13 + 4;\n\n        BAIL_IF_ERRPASS(!UNPK_addEntry(arc, name, 0, -1, -1, pos, size), 0);\n        pos += size;\n\n        /* skip over entry */\n        BAIL_IF_ERRPASS(!io->seek(io, pos), 0);\n    } /* while */\n\n    return 1;\n} /* hogLoadEntries */\n\nstatic int hog2LoadEntries(PHYSFS_Io *io, void *arc)\n{\n    PHYSFS_uint32 numfiles;\n    PHYSFS_uint32 pos;\n    PHYSFS_uint32 i;\n\n    BAIL_IF_ERRPASS(!readui32(io, &numfiles), 0);\n    BAIL_IF_ERRPASS(!readui32(io, &pos), 0);\n    BAIL_IF_ERRPASS(!io->seek(io, 68), 0);  /* skip to end of header. */\n\n    for (i = 0; i < numfiles; i++) {\n        char name[37];\n        PHYSFS_uint32 reserved;\n        PHYSFS_uint32 size;\n        PHYSFS_uint32 mtime;\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, name, 36), 0);\n        BAIL_IF_ERRPASS(!readui32(io, &reserved), 0);\n        BAIL_IF_ERRPASS(!readui32(io, &size), 0);\n        BAIL_IF_ERRPASS(!readui32(io, &mtime), 0);\n        name[36] = '\\0';  /* just in case */\n        BAIL_IF_ERRPASS(!UNPK_addEntry(arc, name, 0, mtime, mtime, pos, size), 0);\n        pos += size;\n    }\n\n    return 1;\n} /* hog2LoadEntries */\n\n\nstatic void *HOG_openArchive(PHYSFS_Io *io, const char *name,\n                             int forWriting, int *claimed)\n{\n    PHYSFS_uint8 buf[3];\n    void *unpkarc = NULL;\n    int hog1 = 0;\n\n    assert(io != NULL);  /* shouldn't ever happen. */\n    BAIL_IF(forWriting, PHYSFS_ERR_READ_ONLY, NULL);\n    BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, buf, 3), NULL);\n\n    if (memcmp(buf, \"DHF\", 3) == 0)\n        hog1 = 1;  /* original HOG (Descent 1 and 2) archive */\n    else\n    {\n        BAIL_IF(memcmp(buf, \"HOG\", 3) != 0, PHYSFS_ERR_UNSUPPORTED, NULL); /* Not HOG2 */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, buf, 1), NULL);\n        BAIL_IF(buf[0] != '2', PHYSFS_ERR_UNSUPPORTED, NULL); /* Not HOG2 */\n    } /* else */\n\n    *claimed = 1;\n\n    unpkarc = UNPK_openArchive(io, 0, 1);\n    BAIL_IF_ERRPASS(!unpkarc, NULL);\n\n    if (!(hog1 ? hog1LoadEntries(io, unpkarc) : hog2LoadEntries(io, unpkarc)))\n    {\n        UNPK_abandonArchive(unpkarc);\n        return NULL;\n    } /* if */\n\n    return unpkarc;\n} /* HOG_openArchive */\n\n\nconst PHYSFS_Archiver __PHYSFS_Archiver_HOG =\n{\n    CURRENT_PHYSFS_ARCHIVER_API_VERSION,\n    {\n        \"HOG\",\n        \"Descent I/II/III HOG file format\",\n        \"Bradley Bell <btb@icculus.org>\",\n        \"https://icculus.org/physfs/\",\n        0,  /* supportsSymlinks */\n    },\n    HOG_openArchive,\n    UNPK_enumerate,\n    UNPK_openRead,\n    UNPK_openWrite,\n    UNPK_openAppend,\n    UNPK_remove,\n    UNPK_mkdir,\n    UNPK_stat,\n    UNPK_closeArchive\n};\n\n#endif  /* defined PHYSFS_SUPPORTS_HOG */\n\n/* end of physfs_archiver_hog.c ... */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_archiver_iso9660.c",
    "content": "/*\n * ISO9660 support routines for PhysicsFS.\n *\n * Please see the file LICENSE.txt in the source's root directory.\n *\n *  This file originally written by Christoph Nelles, but was largely\n *  rewritten by Ryan C. Gordon (so please harass Ryan about bugs and not\n *  Christoph).\n */\n\n/*\n * Handles CD-ROM disk images (and raw CD-ROM devices).\n *\n * Not supported:\n * - Rock Ridge (needed for sparse files, device nodes and symlinks, etc).\n * - Non 2048 Sectors\n * - TRANS.TBL (maps 8.3 filenames on old discs to long filenames).\n * - Multiextents (4gb max file size without it).\n * - UDF\n *\n * Deviations from the standard\n * - Ignores mandatory sort order\n * - Allows various invalid file names\n *\n * Problems\n * - Ambiguities in the standard\n */\n\n#define __PHYSICSFS_INTERNAL__\n#include \"physfs_internal.h\"\n\n#if PHYSFS_SUPPORTS_ISO9660\n\n#include <time.h>\n\n/* ISO9660 often stores values in both big and little endian formats: little\n   first, followed by big. While technically there might be different values\n   in each, we just always use the littleendian ones and swap ourselves. The\n   fields aren't aligned anyhow, so you have to serialize them in any case\n   to avoid crashes on many CPU archs in any case. */\n\nstatic int iso9660LoadEntries(PHYSFS_Io *io, const int joliet,\n                              const char *base, const PHYSFS_uint64 dirstart,\n                              const PHYSFS_uint64 dirend, void *unpkarc);\n\nstatic int iso9660AddEntry(PHYSFS_Io *io, const int joliet, const int isdir,\n                           const char *base, PHYSFS_uint8 *fname,\n                           const int fnamelen, const PHYSFS_sint64 ts,\n                           const PHYSFS_uint64 pos, const PHYSFS_uint64 len,\n                           void *unpkarc)\n{\n    char *fullpath;\n    char *fnamecpy;\n    size_t baselen;\n    size_t fullpathlen;\n    void *entry;\n    int i;\n\n    if (fnamelen == 1 && ((fname[0] == 0) || (fname[0] == 1)))\n        return 1;  /* Magic that represents \".\" and \"..\", ignore */\n\n    BAIL_IF(fnamelen == 0, PHYSFS_ERR_CORRUPT, 0);\n    assert(fnamelen > 0);\n    assert(fnamelen <= 255);\n    BAIL_IF(joliet && (fnamelen % 2), PHYSFS_ERR_CORRUPT, 0);\n\n    /* Joliet is UCS-2, so at most UTF-8 will double the byte size */\n    baselen = strlen(base);\n    fullpathlen = baselen + (fnamelen * (joliet ? 2 : 1)) + 2;\n    fullpath = (char *) __PHYSFS_smallAlloc(fullpathlen);\n    BAIL_IF(!fullpath, PHYSFS_ERR_OUT_OF_MEMORY, 0);\n    fnamecpy = fullpath;\n    if (baselen > 0)\n    {\n        snprintf(fullpath, fullpathlen, \"%s/\", base);\n        fnamecpy += baselen + 1;\n        fullpathlen -= baselen - 1;\n    } /* if */\n\n    if (joliet)\n    {\n        PHYSFS_uint16 *ucs2 = (PHYSFS_uint16 *) fname;\n        int total = fnamelen / 2;\n        for (i = 0; i < total; i++)\n            ucs2[i] = PHYSFS_swapUBE16(ucs2[i]);\n        ucs2[total] = '\\0';\n        PHYSFS_utf8FromUcs2(ucs2, fnamecpy, fullpathlen);\n    } /* if */\n    else\n    {\n        for (i = 0; i < fnamelen; i++)\n        {\n            /* We assume the filenames are low-ASCII; consider the archive\n               corrupt if we see something above 127, since we don't know the\n               encoding. (We can change this later if we find out these exist\n               and are intended to be, say, latin-1 or UTF-8 encoding). */\n            BAIL_IF(fname[i] > 127, PHYSFS_ERR_CORRUPT, 0);\n            fnamecpy[i] = fname[i];\n        } /* for */\n        fnamecpy[fnamelen] = '\\0';\n\n        if (!isdir)\n        {\n            /* find last SEPARATOR2 */\n            char *ptr = strrchr(fnamecpy, ';');\n            if (ptr && (ptr != fnamecpy))\n                *(ptr--) = '\\0';\n            else\n                ptr = fnamecpy + (fnamelen - 1);\n\n            /* chop out any trailing '.', as done in all implementations */\n            if (*ptr == '.')\n                *ptr = '\\0';\n        } /* if */\n    } /* else */\n\n    entry = UNPK_addEntry(unpkarc, fullpath, isdir, ts, ts, pos, len);\n    if ((entry) && (isdir))\n    {\n        if (!iso9660LoadEntries(io, joliet, fullpath, pos, pos + len, unpkarc))\n            entry = NULL;  /* so we report a failure later. */\n    } /* if */\n\n    __PHYSFS_smallFree(fullpath);\n    return entry != NULL;\n} /* iso9660AddEntry */\n\nstatic int iso9660LoadEntries(PHYSFS_Io *io, const int joliet,\n                              const char *base, const PHYSFS_uint64 dirstart,\n                              const PHYSFS_uint64 dirend, void *unpkarc)\n{\n    PHYSFS_uint64 readpos = dirstart;\n\n    while (1)\n    {\n        PHYSFS_uint8 recordlen;\n        PHYSFS_uint8 extattrlen;\n        PHYSFS_uint32 extent;\n        PHYSFS_uint32 datalen;\n        PHYSFS_uint8 ignore[4];\n        PHYSFS_uint8 year, month, day, hour, minute, second, offset;\n        PHYSFS_uint8 flags;\n        PHYSFS_uint8 fnamelen;\n        PHYSFS_uint8 fname[256];\n        PHYSFS_sint64 timestamp;\n        struct tm t;\n        int isdir;\n        int multiextent;\n\n        BAIL_IF_ERRPASS(!io->seek(io, readpos), 0);\n\n        /* recordlen = 0 -> no more entries or fill entry */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &recordlen, 1), 0);\n        if (recordlen > 0)\n            readpos += recordlen;  /* ready to seek to next record. */\n        else\n        {\n            PHYSFS_uint64 nextpos;\n\n            /* if we are in the last sector of the directory & it's 0 -> end */\n            if ((dirend - 2048) <= (readpos - 1))\n                break; /* finished */\n\n            /* else skip to the next sector & continue; */\n            nextpos = (((readpos - 1) / 2048) + 1) * 2048;\n\n            /* whoops, can't make forward progress! */\n            BAIL_IF(nextpos == readpos, PHYSFS_ERR_CORRUPT, 0);\n\n            readpos = nextpos;\n            continue;  /* start back at upper loop. */\n        } /* else */\n\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &extattrlen, 1), 0);\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &extent, 4), 0);\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 4), 0); /* extent be */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &datalen, 4), 0);\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 4), 0); /* datalen be */\n\n        /* record timestamp */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &year, 1), 0);\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &month, 1), 0);\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &day, 1), 0);\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &hour, 1), 0);\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &minute, 1), 0);\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &second, 1), 0);\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &offset, 1), 0);\n\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &flags, 1), 0);\n        isdir = (flags & (1 << 1)) != 0;\n        multiextent = (flags & (1 << 7)) != 0;\n        BAIL_IF(multiextent, PHYSFS_ERR_UNSUPPORTED, 0);  /* !!! FIXME */\n\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 1), 0); /* unit size */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 1), 0); /* interleave gap */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 2), 0); /* seqnum le */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 2), 0); /* seqnum be */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &fnamelen, 1), 0);\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, fname, fnamelen), 0);\n\n        t.tm_sec = second;\n        t.tm_min = minute;\n        t.tm_hour = hour;\n        t.tm_mday = day;\n        t.tm_mon = month - 1;\n        t.tm_year = year;\n        t.tm_wday = 0;\n        t.tm_yday = 0;\n        t.tm_isdst = -1;\n        timestamp = (PHYSFS_sint64) mktime(&t);\n\n        extent += extattrlen;  /* skip extended attribute record. */\n\n        /* infinite loop, corrupt file? */\n        BAIL_IF((extent * 2048) == dirstart, PHYSFS_ERR_CORRUPT, 0);\n\n        if (!iso9660AddEntry(io, joliet, isdir, base, fname, fnamelen,\n                             timestamp, extent * 2048, datalen, unpkarc))\n        {\n            return 0;\n        } /* if */\n    } /* while */\n\n    return 1;\n} /* iso9660LoadEntries */\n\n\nstatic int parseVolumeDescriptor(PHYSFS_Io *io, PHYSFS_uint64 *_rootpos,\n                                 PHYSFS_uint64 *_rootlen, int *_joliet,\n                                 int *_claimed)\n{\n    PHYSFS_uint64 pos = 32768; /* start at the Primary Volume Descriptor */\n    int found = 0;\n    int done = 0;\n\n    *_joliet = 0;\n\n    while (!done)\n    {\n        PHYSFS_uint8 type;\n        PHYSFS_uint8 identifier[5];\n        PHYSFS_uint8 version;\n        PHYSFS_uint8 flags;\n        PHYSFS_uint8 escapeseqs[32];\n        PHYSFS_uint8 ignore[32];\n        PHYSFS_uint16 blocksize;\n        PHYSFS_uint32 extent;\n        PHYSFS_uint32 datalen;\n\n        BAIL_IF_ERRPASS(!io->seek(io, pos), 0);\n        pos += 2048;  /* each volume descriptor is 2048 bytes */\n\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &type, 1), 0);\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, identifier, 5), 0);\n\n        if (memcmp(identifier, \"CD001\", 5) != 0)  /* maybe not an iso? */\n        {\n            BAIL_IF(!*_claimed, PHYSFS_ERR_UNSUPPORTED, 0);\n            continue;  /* just skip this one */\n        } /* if */\n\n        *_claimed = 1; /* okay, this is probably an iso. */\n\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &version, 1), 0);  /* version */\n        BAIL_IF(version != 1, PHYSFS_ERR_UNSUPPORTED, 0);\n\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &flags, 1), 0);\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 32), 0);  /* system id */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 32), 0);  /* volume id */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 8), 0);  /* reserved */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 4), 0);  /* space le */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 4), 0);  /* space be */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, escapeseqs, 32), 0);\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 2), 0);  /* setsize le */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 2), 0);  /* setsize be */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 2), 0);  /* seq num le */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 2), 0);  /* seq num be */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &blocksize, 2), 0);\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 2), 0); /* blocklen be */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 4), 0); /* pthtablen le */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 4), 0); /* pthtablen be */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 4), 0); /* pthtabpos le */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 4), 0); /* optpthtabpos le */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 4), 0); /* pthtabpos be */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 4), 0); /* optpthtabpos be */\n\n        /* root directory record... */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 1), 0); /* len */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 1), 0); /* attr len */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &extent, 4), 0);\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 4), 0); /* extent be */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &datalen, 4), 0);\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 4), 0); /* datalen be */\n\n        /* !!! FIXME: deal with this properly. */\n        blocksize = PHYSFS_swapULE32(blocksize);\n        BAIL_IF(blocksize && (blocksize != 2048), PHYSFS_ERR_UNSUPPORTED, 0);\n\n        switch (type)\n        {\n            case 1:  /* Primary Volume Descriptor */\n            case 2:  /* Supplementary Volume Descriptor */\n                if (found < type)\n                {\n                    *_rootpos = PHYSFS_swapULE32(extent) * 2048;\n                    *_rootlen = PHYSFS_swapULE32(datalen);\n                    found = type;\n\n                    if (found == 2)  /* possible Joliet volume */\n                    {\n                        const PHYSFS_uint8 *s = escapeseqs;\n                        *_joliet = !(flags & 1) &&\n                            (s[0] == 0x25) && (s[1] == 0x2F) &&\n                            ((s[2] == 0x40) || (s[2] == 0x43) || (s[2] == 0x45));\n                    } /* if */\n                } /* if */\n                break;\n\n            case 255: /* type 255 terminates the volume descriptor list */\n                done = 1;\n                break;\n\n            default:\n                break;  /* skip unknown types. */\n        } /* switch */\n    } /* while */\n\n    BAIL_IF(!found, PHYSFS_ERR_CORRUPT, 0);\n\n    return 1;\n} /* parseVolumeDescriptor */\n\n\nstatic void *ISO9660_openArchive(PHYSFS_Io *io, const char *filename,\n                                 int forWriting, int *claimed)\n{\n    PHYSFS_uint64 rootpos = 0;\n    PHYSFS_uint64 len = 0;\n    int joliet = 0;\n    void *unpkarc = NULL;\n\n    assert(io != NULL);  /* shouldn't ever happen. */\n\n    BAIL_IF(forWriting, PHYSFS_ERR_READ_ONLY, NULL);\n\n    if (!parseVolumeDescriptor(io, &rootpos, &len, &joliet, claimed))\n        return NULL;\n\n    /* !!! FIXME: check case_sensitive and only_usascii params for this archive. */\n    unpkarc = UNPK_openArchive(io, 1, 0);\n    BAIL_IF_ERRPASS(!unpkarc, NULL);\n\n    if (!iso9660LoadEntries(io, joliet, \"\", rootpos, rootpos + len, unpkarc))\n    {\n        UNPK_abandonArchive(unpkarc);\n        return NULL;\n    } /* if */\n\n    return unpkarc;\n} /* ISO9660_openArchive */\n\n\nconst PHYSFS_Archiver __PHYSFS_Archiver_ISO9660 =\n{\n    CURRENT_PHYSFS_ARCHIVER_API_VERSION,\n    {\n        \"ISO\",\n        \"ISO9660 image file\",\n        \"Ryan C. Gordon <icculus@icculus.org>\",\n        \"https://icculus.org/physfs/\",\n        0,  /* supportsSymlinks */\n    },\n    ISO9660_openArchive,\n    UNPK_enumerate,\n    UNPK_openRead,\n    UNPK_openWrite,\n    UNPK_openAppend,\n    UNPK_remove,\n    UNPK_mkdir,\n    UNPK_stat,\n    UNPK_closeArchive\n};\n\n#endif  /* defined PHYSFS_SUPPORTS_ISO9660 */\n\n/* end of physfs_archiver_iso9660.c ... */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_archiver_mvl.c",
    "content": "/*\n * MVL support routines for PhysicsFS.\n *\n * This driver handles Descent II Movielib archives.\n *\n * The file format of MVL is quite easy...\n *\n *   //MVL File format - Written by Heiko Herrmann\n *   char sig[4] = {'D','M', 'V', 'L'}; // \"DMVL\"=Descent MoVie Library\n *\n *   int num_files; // the number of files in this MVL\n *\n *   struct {\n *    char file_name[13]; // Filename, padded to 13 bytes with 0s\n *    int file_size; // filesize in bytes\n *   }DIR_STRUCT[num_files];\n *\n *   struct {\n *    char data[file_size]; // The file data\n *   }FILE_STRUCT[num_files];\n *\n * (That info is from http://www.descent2.com/ddn/specs/mvl/)\n *\n * Please see the file LICENSE.txt in the source's root directory.\n *\n *  This file written by Bradley Bell.\n *  Based on grp.c by Ryan C. Gordon.\n */\n\n#define __PHYSICSFS_INTERNAL__\n#include \"physfs_internal.h\"\n\n#if PHYSFS_SUPPORTS_MVL\n\nstatic int mvlLoadEntries(PHYSFS_Io *io, const PHYSFS_uint32 count, void *arc)\n{\n    PHYSFS_uint32 pos = 8 + (17 * count);   /* past sig+metadata. */\n    PHYSFS_uint32 i;\n\n    for (i = 0; i < count; i++)\n    {\n        PHYSFS_uint32 size;\n        char name[13];\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, name, 13), 0);\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &size, 4), 0);\n        name[12] = '\\0';  /* just in case. */\n        size = PHYSFS_swapULE32(size);\n        BAIL_IF_ERRPASS(!UNPK_addEntry(arc, name, 0, -1, -1, pos, size), 0);\n        pos += size;\n    } /* for */\n\n    return 1;\n} /* mvlLoadEntries */\n\n\nstatic void *MVL_openArchive(PHYSFS_Io *io, const char *name,\n                             int forWriting, int *claimed)\n{\n    PHYSFS_uint8 buf[4];\n    PHYSFS_uint32 count = 0;\n    void *unpkarc;\n\n    assert(io != NULL);  /* shouldn't ever happen. */\n    BAIL_IF(forWriting, PHYSFS_ERR_READ_ONLY, NULL);\n    BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, buf, 4), NULL);\n    BAIL_IF(memcmp(buf, \"DMVL\", 4) != 0, PHYSFS_ERR_UNSUPPORTED, NULL);\n\n    *claimed = 1;\n\n    BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &count, sizeof(count)), NULL);\n    count = PHYSFS_swapULE32(count);\n\n    unpkarc = UNPK_openArchive(io, 0, 1);\n    BAIL_IF_ERRPASS(!unpkarc, NULL);\n\n    if (!mvlLoadEntries(io, count, unpkarc))\n    {\n        UNPK_abandonArchive(unpkarc);\n        return NULL;\n    } /* if */\n\n    return unpkarc;\n} /* MVL_openArchive */\n\n\nconst PHYSFS_Archiver __PHYSFS_Archiver_MVL =\n{\n    CURRENT_PHYSFS_ARCHIVER_API_VERSION,\n    {\n        \"MVL\",\n        \"Descent II Movielib format\",\n        \"Bradley Bell <btb@icculus.org>\",\n        \"https://icculus.org/physfs/\",\n        0,  /* supportsSymlinks */\n    },\n    MVL_openArchive,\n    UNPK_enumerate,\n    UNPK_openRead,\n    UNPK_openWrite,\n    UNPK_openAppend,\n    UNPK_remove,\n    UNPK_mkdir,\n    UNPK_stat,\n    UNPK_closeArchive\n};\n\n#endif  /* defined PHYSFS_SUPPORTS_MVL */\n\n/* end of physfs_archiver_mvl.c ... */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_archiver_qpak.c",
    "content": "/*\n * QPAK support routines for PhysicsFS.\n *\n *  This archiver handles the archive format utilized by Quake 1 and 2.\n *  Quake3-based games use the PkZip/Info-Zip format (which our\n *  physfs_archiver_zip.c handles).\n *\n *  ========================================================================\n *\n *  This format info (in more detail) comes from:\n *     https://web.archive.org/web/20040209101748/http://debian.fmi.uni-sofia.bg/~sergei/cgsr/docs/pak.txt\n *\n *  Quake PAK Format\n *\n *  Header\n *   (4 bytes)  signature = 'PACK'\n *   (4 bytes)  directory offset\n *   (4 bytes)  directory length\n *\n *  Directory\n *   (56 bytes) file name\n *   (4 bytes)  file position\n *   (4 bytes)  file length\n *\n *  ========================================================================\n *\n * Please see the file LICENSE.txt in the source's root directory.\n *\n *  This file written by Ryan C. Gordon.\n */\n\n#define __PHYSICSFS_INTERNAL__\n#include \"physfs_internal.h\"\n\n#if PHYSFS_SUPPORTS_QPAK\n\n#define QPAK_SIG 0x4B434150   /* \"PACK\" in ASCII. */\n\nstatic int qpakLoadEntries(PHYSFS_Io *io, const PHYSFS_uint32 count, void *arc)\n{\n    PHYSFS_uint32 i;\n    for (i = 0; i < count; i++)\n    {\n        PHYSFS_uint32 size;\n        PHYSFS_uint32 pos;\n        char name[56];\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, name, 56), 0);\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &pos, 4), 0);\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &size, 4), 0);\n        size = PHYSFS_swapULE32(size);\n        pos = PHYSFS_swapULE32(pos);\n        BAIL_IF_ERRPASS(!UNPK_addEntry(arc, name, 0, -1, -1, pos, size), 0);\n    } /* for */\n\n    return 1;\n} /* qpakLoadEntries */\n\n\nstatic void *QPAK_openArchive(PHYSFS_Io *io, const char *name,\n                              int forWriting, int *claimed)\n{\n    PHYSFS_uint32 val = 0;\n    PHYSFS_uint32 pos = 0;\n    PHYSFS_uint32 count = 0;\n    void *unpkarc;\n\n    assert(io != NULL);  /* shouldn't ever happen. */\n\n    BAIL_IF(forWriting, PHYSFS_ERR_READ_ONLY, NULL);\n\n    BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &val, 4), NULL);\n    if (PHYSFS_swapULE32(val) != QPAK_SIG)\n        BAIL(PHYSFS_ERR_UNSUPPORTED, NULL);\n\n    *claimed = 1;\n\n    BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &val, 4), NULL);\n    pos = PHYSFS_swapULE32(val);  /* directory table offset. */\n\n    BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &val, 4), NULL);\n    count = PHYSFS_swapULE32(val);\n\n    /* corrupted archive? */\n    BAIL_IF((count % 64) != 0, PHYSFS_ERR_CORRUPT, NULL);\n    count /= 64;\n\n    BAIL_IF_ERRPASS(!io->seek(io, pos), NULL);\n\n    /* !!! FIXME: check case_sensitive and only_usascii params for this archive. */\n    unpkarc = UNPK_openArchive(io, 1, 0);\n    BAIL_IF_ERRPASS(!unpkarc, NULL);\n\n    if (!qpakLoadEntries(io, count, unpkarc))\n    {\n        UNPK_abandonArchive(unpkarc);\n        return NULL;\n    } /* if */\n\n    return unpkarc;\n} /* QPAK_openArchive */\n\n\nconst PHYSFS_Archiver __PHYSFS_Archiver_QPAK =\n{\n    CURRENT_PHYSFS_ARCHIVER_API_VERSION,\n    {\n        \"PAK\",\n        \"Quake I/II format\",\n        \"Ryan C. Gordon <icculus@icculus.org>\",\n        \"https://icculus.org/physfs/\",\n        0,  /* supportsSymlinks */\n    },\n    QPAK_openArchive,\n    UNPK_enumerate,\n    UNPK_openRead,\n    UNPK_openWrite,\n    UNPK_openAppend,\n    UNPK_remove,\n    UNPK_mkdir,\n    UNPK_stat,\n    UNPK_closeArchive\n};\n\n#endif  /* defined PHYSFS_SUPPORTS_QPAK */\n\n/* end of physfs_archiver_qpak.c ... */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_archiver_slb.c",
    "content": "/*\n * SLB support routines for PhysicsFS.\n *\n * This driver handles SLB archives (\"slab files\"). This uncompressed format\n * is used in I-War / Independence War and Independence War: Defiance.\n *\n * The format begins with four zero bytes (version?), the file count and the\n * location of the table of contents. Each ToC entry contains a 64-byte buffer\n * containing a zero-terminated filename, the offset of the data, and its size.\n * All the filenames begin with the separator character '\\'. \n *\n * Please see the file LICENSE.txt in the source's root directory.\n *\n * This file written by Aleksi Nurmi, based on the GRP archiver by\n * Ryan C. Gordon.\n */\n\n#define __PHYSICSFS_INTERNAL__\n#include \"physfs_internal.h\"\n\n#if PHYSFS_SUPPORTS_SLB\n\nstatic int slbLoadEntries(PHYSFS_Io *io, const PHYSFS_uint32 count, void *arc)\n{\n    PHYSFS_uint32 i;\n    for (i = 0; i < count; i++)\n    {\n        PHYSFS_uint32 pos;\n        PHYSFS_uint32 size;\n        char name[64];\n        char backslash;\n        char *ptr;\n\n        /* don't include the '\\' in the beginning */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &backslash, 1), 0);\n        BAIL_IF(backslash != '\\\\', PHYSFS_ERR_CORRUPT, 0);\n\n        /* read the rest of the buffer, 63 bytes */\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, name, 63), 0);\n        name[63] = '\\0'; /* in case the name lacks the null terminator */\n\n        /* convert backslashes */\n        for (ptr = name; *ptr; ptr++)\n        {\n            if (*ptr == '\\\\')\n                *ptr = '/';\n        } /* for */\n\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &pos, 4), 0);\n        pos = PHYSFS_swapULE32(pos);\n\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &size, 4), 0);\n        size = PHYSFS_swapULE32(size);\n\n        BAIL_IF_ERRPASS(!UNPK_addEntry(arc, name, 0, -1, -1, pos, size), 0);\n    } /* for */\n\n    return 1;\n} /* slbLoadEntries */\n\n\nstatic void *SLB_openArchive(PHYSFS_Io *io, const char *name,\n                             int forWriting, int *claimed)\n{\n    PHYSFS_uint32 version;\n    PHYSFS_uint32 count;\n    PHYSFS_uint32 tocPos;\n    void *unpkarc;\n\n    /* There's no identifier on an SLB file, so we assume it's _not_ if the\n       file count or tocPos is zero. Beyond that, we'll assume it's\n       bogus/corrupt if the entries' filenames don't start with '\\' or the\n       tocPos is past the end of the file (seek will fail). This probably\n       covers all meaningful cases where we would accidentally accept a non-SLB\n       file with this archiver. */\n\n    assert(io != NULL);  /* shouldn't ever happen. */\n\n    BAIL_IF(forWriting, PHYSFS_ERR_READ_ONLY, NULL);\n\n    BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &version, sizeof (version)), NULL);\n    version = PHYSFS_swapULE32(version);\n    BAIL_IF(version != 0, PHYSFS_ERR_UNSUPPORTED, NULL);\n\n    BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &count, sizeof (count)), NULL);\n    count = PHYSFS_swapULE32(count);\n    BAIL_IF(!count, PHYSFS_ERR_UNSUPPORTED, NULL);\n\n    /* offset of the table of contents */\n    BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &tocPos, sizeof (tocPos)), NULL);\n    tocPos = PHYSFS_swapULE32(tocPos);\n    BAIL_IF(!tocPos, PHYSFS_ERR_UNSUPPORTED, NULL);\n    \n    /* seek to the table of contents */\n    BAIL_IF_ERRPASS(!io->seek(io, tocPos), NULL);\n\n    /* !!! FIXME: check case_sensitive and only_usascii params for this archive. */\n    unpkarc = UNPK_openArchive(io, 1, 0);\n    BAIL_IF_ERRPASS(!unpkarc, NULL);\n\n    if (!slbLoadEntries(io, count, unpkarc))\n    {\n        UNPK_abandonArchive(unpkarc);\n        return NULL;\n    } /* if */\n\n    *claimed = 1;  /* oh well. */\n\n    return unpkarc;\n} /* SLB_openArchive */\n\n\nconst PHYSFS_Archiver __PHYSFS_Archiver_SLB =\n{\n    CURRENT_PHYSFS_ARCHIVER_API_VERSION,\n    {\n        \"SLB\",\n        \"I-War / Independence War Slab file\",\n        \"Aleksi Nurmi <aleksi.nurmi@gmail.com>\",\n        \"https://bitbucket.org/ahnurmi/\",\n        0,  /* supportsSymlinks */\n    },\n    SLB_openArchive,\n    UNPK_enumerate,\n    UNPK_openRead,\n    UNPK_openWrite,\n    UNPK_openAppend,\n    UNPK_remove,\n    UNPK_mkdir,\n    UNPK_stat,\n    UNPK_closeArchive\n};\n\n#endif  /* defined PHYSFS_SUPPORTS_SLB */\n\n/* end of physfs_archiver_slb.c ... */\n"
  },
  {
    "path": "src/libraries/physfs/physfs_archiver_unpacked.c",
    "content": "/*\n * High-level PhysicsFS archiver for simple unpacked file formats.\n *\n * This is a framework that basic archivers build on top of. It's for simple\n *  formats that can just hand back a list of files and the offsets of their\n *  uncompressed data. There are an alarming number of formats like this.\n *\n * RULES: Archive entries must be uncompressed. Dirs and files allowed, but no\n *  symlinks, etc. We can relax some of these rules as necessary.\n *\n * Please see the file LICENSE.txt in the source's root directory.\n *\n *  This file written by Ryan C. Gordon.\n */\n\n#define __PHYSICSFS_INTERNAL__\n#include \"physfs_internal.h\"\n\ntypedef struct\n{\n    __PHYSFS_DirTree tree;\n    PHYSFS_Io *io;\n} UNPKinfo;\n\ntypedef struct\n{\n    __PHYSFS_DirTreeEntry tree;\n    PHYSFS_uint64 startPos;\n    PHYSFS_uint64 size;\n    PHYSFS_sint64 ctime;\n    PHYSFS_sint64 mtime;\n} UNPKentry;\n\ntypedef struct\n{\n    PHYSFS_Io *io;\n    UNPKentry *entry;\n    PHYSFS_uint32 curPos;\n} UNPKfileinfo;\n\n\nvoid UNPK_closeArchive(void *opaque)\n{\n    UNPKinfo *info = ((UNPKinfo *) opaque);\n    if (info)\n    {\n        __PHYSFS_DirTreeDeinit(&info->tree);\n\n        if (info->io)\n            info->io->destroy(info->io);\n\n        allocator.Free(info);\n    } /* if */\n} /* UNPK_closeArchive */\n\nvoid UNPK_abandonArchive(void *opaque)\n{\n    UNPKinfo *info = ((UNPKinfo *) opaque);\n    if (info)\n    {\n        info->io = NULL;\n        UNPK_closeArchive(info);\n    } /* if */\n} /* UNPK_abandonArchive */\n\nstatic PHYSFS_sint64 UNPK_read(PHYSFS_Io *io, void *buffer, PHYSFS_uint64 len)\n{\n    UNPKfileinfo *finfo = (UNPKfileinfo *) io->opaque;\n    const UNPKentry *entry = finfo->entry;\n    const PHYSFS_uint64 bytesLeft = (PHYSFS_uint64)(entry->size-finfo->curPos);\n    PHYSFS_sint64 rc;\n\n    if (bytesLeft < len)\n        len = bytesLeft;\n\n    rc = finfo->io->read(finfo->io, buffer, len);\n    if (rc > 0)\n        finfo->curPos += (PHYSFS_uint32) rc;\n\n    return rc;\n} /* UNPK_read */\n\n\nstatic PHYSFS_sint64 UNPK_write(PHYSFS_Io *io, const void *b, PHYSFS_uint64 len)\n{\n    BAIL(PHYSFS_ERR_READ_ONLY, -1);\n} /* UNPK_write */\n\n\nstatic PHYSFS_sint64 UNPK_tell(PHYSFS_Io *io)\n{\n    return ((UNPKfileinfo *) io->opaque)->curPos;\n} /* UNPK_tell */\n\n\nstatic int UNPK_seek(PHYSFS_Io *io, PHYSFS_uint64 offset)\n{\n    UNPKfileinfo *finfo = (UNPKfileinfo *) io->opaque;\n    const UNPKentry *entry = finfo->entry;\n    int rc;\n\n    BAIL_IF(offset >= entry->size, PHYSFS_ERR_PAST_EOF, 0);\n    rc = finfo->io->seek(finfo->io, entry->startPos + offset);\n    if (rc)\n        finfo->curPos = (PHYSFS_uint32) offset;\n\n    return rc;\n} /* UNPK_seek */\n\n\nstatic PHYSFS_sint64 UNPK_length(PHYSFS_Io *io)\n{\n    const UNPKfileinfo *finfo = (UNPKfileinfo *) io->opaque;\n    return ((PHYSFS_sint64) finfo->entry->size);\n} /* UNPK_length */\n\n\nstatic PHYSFS_Io *UNPK_duplicate(PHYSFS_Io *_io)\n{\n    UNPKfileinfo *origfinfo = (UNPKfileinfo *) _io->opaque;\n    PHYSFS_Io *io = NULL;\n    PHYSFS_Io *retval = (PHYSFS_Io *) allocator.Malloc(sizeof (PHYSFS_Io));\n    UNPKfileinfo *finfo = (UNPKfileinfo *) allocator.Malloc(sizeof (UNPKfileinfo));\n    GOTO_IF(!retval, PHYSFS_ERR_OUT_OF_MEMORY, UNPK_duplicate_failed);\n    GOTO_IF(!finfo, PHYSFS_ERR_OUT_OF_MEMORY, UNPK_duplicate_failed);\n\n    io = origfinfo->io->duplicate(origfinfo->io);\n    if (!io) goto UNPK_duplicate_failed;\n    finfo->io = io;\n    finfo->entry = origfinfo->entry;\n    finfo->curPos = 0;\n    memcpy(retval, _io, sizeof (PHYSFS_Io));\n    retval->opaque = finfo;\n    return retval;\n\nUNPK_duplicate_failed:\n    if (finfo != NULL) allocator.Free(finfo);\n    if (retval != NULL) allocator.Free(retval);\n    if (io != NULL) io->destroy(io);\n    return NULL;\n} /* UNPK_duplicate */\n\nstatic int UNPK_flush(PHYSFS_Io *io) { return 1;  /* no write support. */ }\n\nstatic void UNPK_destroy(PHYSFS_Io *io)\n{\n    UNPKfileinfo *finfo = (UNPKfileinfo *) io->opaque;\n    finfo->io->destroy(finfo->io);\n    allocator.Free(finfo);\n    allocator.Free(io);\n} /* UNPK_destroy */\n\n\nstatic const PHYSFS_Io UNPK_Io =\n{\n    CURRENT_PHYSFS_IO_API_VERSION, NULL,\n    UNPK_read,\n    UNPK_write,\n    UNPK_seek,\n    UNPK_tell,\n    UNPK_length,\n    UNPK_duplicate,\n    UNPK_flush,\n    UNPK_destroy\n};\n\n\nstatic inline UNPKentry *findEntry(UNPKinfo *info, const char *path)\n{\n    return (UNPKentry *) __PHYSFS_DirTreeFind(&info->tree, path);\n} /* findEntry */\n\n\nPHYSFS_Io *UNPK_openRead(void *opaque, const char *name)\n{\n    PHYSFS_Io *retval = NULL;\n    UNPKinfo *info = (UNPKinfo *) opaque;\n    UNPKfileinfo *finfo = NULL;\n    UNPKentry *entry = findEntry(info, name);\n\n    BAIL_IF_ERRPASS(!entry, NULL);\n    BAIL_IF(entry->tree.isdir, PHYSFS_ERR_NOT_A_FILE, NULL);\n\n    retval = (PHYSFS_Io *) allocator.Malloc(sizeof (PHYSFS_Io));\n    GOTO_IF(!retval, PHYSFS_ERR_OUT_OF_MEMORY, UNPK_openRead_failed);\n\n    finfo = (UNPKfileinfo *) allocator.Malloc(sizeof (UNPKfileinfo));\n    GOTO_IF(!finfo, PHYSFS_ERR_OUT_OF_MEMORY, UNPK_openRead_failed);\n\n    finfo->io = info->io->duplicate(info->io);\n    GOTO_IF_ERRPASS(!finfo->io, UNPK_openRead_failed);\n\n    if (!finfo->io->seek(finfo->io, entry->startPos))\n        goto UNPK_openRead_failed;\n\n    finfo->curPos = 0;\n    finfo->entry = entry;\n\n    memcpy(retval, &UNPK_Io, sizeof (*retval));\n    retval->opaque = finfo;\n    return retval;\n\nUNPK_openRead_failed:\n    if (finfo != NULL)\n    {\n        if (finfo->io != NULL)\n            finfo->io->destroy(finfo->io);\n        allocator.Free(finfo);\n    } /* if */\n\n    if (retval != NULL)\n        allocator.Free(retval);\n\n    return NULL;\n} /* UNPK_openRead */\n\n\nPHYSFS_Io *UNPK_openWrite(void *opaque, const char *name)\n{\n    BAIL(PHYSFS_ERR_READ_ONLY, NULL);\n} /* UNPK_openWrite */\n\n\nPHYSFS_Io *UNPK_openAppend(void *opaque, const char *name)\n{\n    BAIL(PHYSFS_ERR_READ_ONLY, NULL);\n} /* UNPK_openAppend */\n\n\nint UNPK_remove(void *opaque, const char *name)\n{\n    BAIL(PHYSFS_ERR_READ_ONLY, 0);\n} /* UNPK_remove */\n\n\nint UNPK_mkdir(void *opaque, const char *name)\n{\n    BAIL(PHYSFS_ERR_READ_ONLY, 0);\n} /* UNPK_mkdir */\n\n\nint UNPK_stat(void *opaque, const char *path, PHYSFS_Stat *stat)\n{\n    UNPKinfo *info = (UNPKinfo *) opaque;\n    const UNPKentry *entry = findEntry(info, path);\n\n    BAIL_IF_ERRPASS(!entry, 0);\n\n    if (entry->tree.isdir)\n    {\n        stat->filetype = PHYSFS_FILETYPE_DIRECTORY;\n        stat->filesize = 0;\n    } /* if */\n    else\n    {\n        stat->filetype = PHYSFS_FILETYPE_REGULAR;\n        stat->filesize = entry->size;\n    } /* else */\n\n    stat->modtime = entry->mtime;\n    stat->createtime = entry->ctime;\n    stat->accesstime = -1;\n    stat->readonly = 1;\n\n    return 1;\n} /* UNPK_stat */\n\n\nvoid *UNPK_addEntry(void *opaque, char *name, const int isdir,\n                    const PHYSFS_sint64 ctime, const PHYSFS_sint64 mtime,\n                    const PHYSFS_uint64 pos, const PHYSFS_uint64 len)\n{\n    UNPKinfo *info = (UNPKinfo *) opaque;\n    UNPKentry *entry;\n\n    entry = (UNPKentry *) __PHYSFS_DirTreeAdd(&info->tree, name, isdir);\n    BAIL_IF_ERRPASS(!entry, NULL);\n\n    entry->startPos = isdir ? 0 : pos;\n    entry->size = isdir ? 0 : len;\n    entry->ctime = ctime;\n    entry->mtime = mtime;\n\n    return entry;\n} /* UNPK_addEntry */\n\n\nvoid *UNPK_openArchive(PHYSFS_Io *io, const int case_sensitive, const int only_usascii)\n{\n    UNPKinfo *info = (UNPKinfo *) allocator.Malloc(sizeof (UNPKinfo));\n    BAIL_IF(!info, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n\n    if (!__PHYSFS_DirTreeInit(&info->tree, sizeof (UNPKentry), case_sensitive, only_usascii))\n    {\n        allocator.Free(info);\n        return NULL;\n    } /* if */\n\n    info->io = io;\n\n    return info;\n} /* UNPK_openArchive */\n\n/* end of physfs_archiver_unpacked.c ... */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_archiver_vdf.c",
    "content": "/*\n * VDF support routines for PhysicsFS.\n *\n * This driver handles Gothic I/II VDF archives.\n * This format (but not this driver) was designed by Piranha Bytes for\n *  use wih the ZenGin engine.\n *\n * This file was written by Francesco Bertolaccini, based on the UNPK archiver\n *  by Ryan C. Gordon and the works of degenerated1123 and Nico Bendlin.\n */\n\n#define __PHYSICSFS_INTERNAL__\n#include \"physfs_internal.h\"\n\n#if PHYSFS_SUPPORTS_VDF\n\n#include <time.h>\n\n#define VDF_COMMENT_LENGTH 256\n#define VDF_SIGNATURE_LENGTH 16\n#define VDF_ENTRY_NAME_LENGTH 64\n#define VDF_ENTRY_DIR 0x80000000\n\nstatic const char* VDF_SIGNATURE_G1 = \"PSVDSC_V2.00\\r\\n\\r\\n\";\nstatic const char* VDF_SIGNATURE_G2 = \"PSVDSC_V2.00\\n\\r\\n\\r\";\n\n\nstatic inline int readui32(PHYSFS_Io *io, PHYSFS_uint32 *val)\n{\n    PHYSFS_uint32 v;\n    BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &v, sizeof (v)), 0);\n    *val = PHYSFS_swapULE32(v);\n    return 1;\n} /* readui32 */\n\n\nstatic PHYSFS_sint64 vdfDosTimeToEpoch(const PHYSFS_uint32 dostime)\n{\n    /* VDF stores timestamps as 32bit DOS dates: the seconds are counted in\n       2-seconds intervals and the years are counted since 1 Jan. 1980 */\n    struct tm t;\n    memset(&t, '\\0', sizeof (t));\n    t.tm_year = ((int) ((dostime >> 25) & 0x7F)) + 80; /* 1980 to 1900 */\n    t.tm_mon = ((int) ((dostime >> 21) & 0xF)) - 1;  /* 1-12 to 0-11 */\n    t.tm_mday = (int) ((dostime >> 16) & 0x1F);\n    t.tm_hour = (int) ((dostime >> 11) & 0x1F);\n    t.tm_min = (int) ((dostime >> 5) & 0x3F);\n    t.tm_sec = ((int) ((dostime >> 0) & 0x1F)) * 2;  /* 2 seconds to 1. */\n    return (PHYSFS_sint64) mktime(&t);\n} /* vdfDosTimeToEpoch */\n\n\nstatic int vdfLoadEntries(PHYSFS_Io *io, const PHYSFS_uint32 count,\n                          const PHYSFS_sint64 ts, void *arc)\n{\n    PHYSFS_uint32 i;\n\n    for (i = 0; i < count; i++)\n    {\n        char name[VDF_ENTRY_NAME_LENGTH + 1];\n        int namei;\n        PHYSFS_uint32 jump, size, type, attr;\n\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, name, sizeof (name) - 1), 0);\n        BAIL_IF_ERRPASS(!readui32(io, &jump), 0);\n        BAIL_IF_ERRPASS(!readui32(io, &size), 0);\n        BAIL_IF_ERRPASS(!readui32(io, &type), 0);\n        BAIL_IF_ERRPASS(!readui32(io, &attr), 0);\n\n        /* Trim whitespace off the end of the filename */\n        name[VDF_ENTRY_NAME_LENGTH] = '\\0';  /* always null-terminated. */\n        for (namei = VDF_ENTRY_NAME_LENGTH - 1; namei >= 0; namei--)\n        {\n            /* We assume the filenames are low-ASCII; consider the archive\n               corrupt if we see something above 127, since we don't know the\n               encoding. (We can change this later if we find out these exist\n               and are intended to be, say, latin-1 or UTF-8 encoding). */\n            BAIL_IF(((PHYSFS_uint8) name[namei]) > 127, PHYSFS_ERR_CORRUPT, 0);\n\n            if (name[namei] == ' ')\n                name[namei] = '\\0';\n            else\n                break;\n        } /* for */\n\n        BAIL_IF(!name[0], PHYSFS_ERR_CORRUPT, 0);\n        if (!(type & VDF_ENTRY_DIR)) {\n            BAIL_IF_ERRPASS(!UNPK_addEntry(arc, name, 0, ts, ts, jump, size), 0);\n        }\n    } /* for */\n\n    return 1;\n} /* vdfLoadEntries */\n\n\nstatic void *VDF_openArchive(PHYSFS_Io *io, const char *name,\n                             int forWriting, int *claimed)\n{\n    PHYSFS_uint8 ignore[16];\n    PHYSFS_uint8 sig[VDF_SIGNATURE_LENGTH];\n    PHYSFS_uint32 count, timestamp, version, dataSize, rootCatOffset;\n    void *unpkarc;\n\n    assert(io != NULL); /* shouldn't ever happen. */\n\n    BAIL_IF(forWriting, PHYSFS_ERR_READ_ONLY, NULL);\n\n    /* skip the 256-byte comment field. */\n    BAIL_IF_ERRPASS(!io->seek(io, VDF_COMMENT_LENGTH), NULL);\n\n    BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, sig, sizeof (sig)), NULL);\n\n    if ((memcmp(sig, VDF_SIGNATURE_G1, VDF_SIGNATURE_LENGTH) != 0) &&\n        (memcmp(sig, VDF_SIGNATURE_G2, VDF_SIGNATURE_LENGTH) != 0))\n    {\n        BAIL(PHYSFS_ERR_UNSUPPORTED, NULL);\n    } /* if */\n\n    *claimed = 1;\n\n    BAIL_IF_ERRPASS(!readui32(io, &count), NULL);\n    BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, ignore, 4), NULL);  /* numFiles */\n    BAIL_IF_ERRPASS(!readui32(io, &timestamp), NULL);\n    BAIL_IF_ERRPASS(!readui32(io, &dataSize), NULL);  /* dataSize */\n    BAIL_IF_ERRPASS(!readui32(io, &rootCatOffset), NULL);  /* rootCatOff */\n    BAIL_IF_ERRPASS(!readui32(io, &version), NULL);\n\n    BAIL_IF(version != 0x50, PHYSFS_ERR_UNSUPPORTED, NULL);\n\n    BAIL_IF_ERRPASS(!io->seek(io, rootCatOffset), NULL);\n\n    /* !!! FIXME: check case_sensitive and only_usascii params for this archive. */\n    unpkarc = UNPK_openArchive(io, 1, 0);\n    BAIL_IF_ERRPASS(!unpkarc, NULL);\n\n    if (!vdfLoadEntries(io, count, vdfDosTimeToEpoch(timestamp), unpkarc))\n    {\n        UNPK_abandonArchive(unpkarc);\n        return NULL;\n    } /* if */\n\n    return unpkarc;\n} /* VDF_openArchive */\n\n\nconst PHYSFS_Archiver __PHYSFS_Archiver_VDF =\n{\n    CURRENT_PHYSFS_ARCHIVER_API_VERSION,\n    {\n        \"VDF\",\n        \"Gothic I/II engine format\",\n        \"Francesco Bertolaccini <bertolaccinifrancesco@gmail.com>\",\n        \"https://github.com/frabert\",\n        0,  /* supportsSymlinks */\n    },\n    VDF_openArchive,\n    UNPK_enumerate,\n    UNPK_openRead,\n    UNPK_openWrite,\n    UNPK_openAppend,\n    UNPK_remove,\n    UNPK_mkdir,\n    UNPK_stat,\n    UNPK_closeArchive\n};\n\n#endif /* defined PHYSFS_SUPPORTS_VDF */\n\n/* end of physfs_archiver_vdf.c ... */\n"
  },
  {
    "path": "src/libraries/physfs/physfs_archiver_wad.c",
    "content": "/*\n * WAD support routines for PhysicsFS.\n *\n * This driver handles DOOM engine archives (\"wads\"). \n * This format (but not this driver) was designed by id Software for use\n *  with the DOOM engine.\n * The specs of the format are from the unofficial doom specs v1.666\n * found here: http://www.gamers.org/dhs/helpdocs/dmsp1666.html\n * The format of the archive: (from the specs)\n *\n *  A WAD file has three parts:\n *  (1) a twelve-byte header\n *  (2) one or more \"lumps\"\n *  (3) a directory or \"info table\" that contains the names, offsets, and\n *      sizes of all the lumps in the WAD\n *\n *  The header consists of three four-byte parts:\n *    (a) an ASCII string which must be either \"IWAD\" or \"PWAD\"\n *    (b) a uint32 which is the number of lumps in the wad\n *    (c) a uint32 which is the file offset to the start of\n *    the directory\n *\n *  The directory has one 16-byte entry for every lump. Each entry consists\n *  of three parts:\n *\n *    (a) a uint32, the file offset to the start of the lump\n *    (b) a uint32, the size of the lump in bytes\n *    (c) an 8-byte ASCII string, the name of the lump, padded with zeros.\n *        For example, the \"DEMO1\" entry in hexadecimal would be\n *        (44 45 4D 4F 31 00 00 00)\n * \n * Note that there is no way to tell if an opened WAD archive is a\n *  IWAD or PWAD with this archiver.\n * I couldn't think of a way to provide that information, without being too\n *  hacky.\n * I don't think it's really that important though.\n *\n *\n * Please see the file LICENSE.txt in the source's root directory.\n *\n * This file written by Travis Wells, based on the GRP archiver by\n *  Ryan C. Gordon.\n */\n\n#define __PHYSICSFS_INTERNAL__\n#include \"physfs_internal.h\"\n\n#if PHYSFS_SUPPORTS_WAD\n\nstatic int wadLoadEntries(PHYSFS_Io *io, const PHYSFS_uint32 count, void *arc)\n{\n    PHYSFS_uint32 i;\n    for (i = 0; i < count; i++)\n    {\n        PHYSFS_uint32 pos;\n        PHYSFS_uint32 size;\n        char name[9];\n\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &pos, 4), 0);\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &size, 4), 0);\n        BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, name, 8), 0);\n\n        name[8] = '\\0'; /* name might not be null-terminated in file. */\n        size = PHYSFS_swapULE32(size);\n        pos = PHYSFS_swapULE32(pos);\n        BAIL_IF_ERRPASS(!UNPK_addEntry(arc, name, 0, -1, -1, pos, size), 0);\n    } /* for */\n\n    return 1;\n} /* wadLoadEntries */\n\n\nstatic void *WAD_openArchive(PHYSFS_Io *io, const char *name,\n                             int forWriting, int *claimed)\n{\n    PHYSFS_uint8 buf[4];\n    PHYSFS_uint32 count;\n    PHYSFS_uint32 directoryOffset;\n    void *unpkarc;\n\n    assert(io != NULL);  /* shouldn't ever happen. */\n\n    BAIL_IF(forWriting, PHYSFS_ERR_READ_ONLY, NULL);\n    BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, buf, sizeof (buf)), NULL);\n    if ((memcmp(buf, \"IWAD\", 4) != 0) && (memcmp(buf, \"PWAD\", 4) != 0))\n        BAIL(PHYSFS_ERR_UNSUPPORTED, NULL);\n\n    *claimed = 1;\n\n    BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &count, sizeof (count)), NULL);\n    count = PHYSFS_swapULE32(count);\n\n    BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &directoryOffset, 4), 0);\n    directoryOffset = PHYSFS_swapULE32(directoryOffset);\n\n    BAIL_IF_ERRPASS(!io->seek(io, directoryOffset), 0);\n\n    unpkarc = UNPK_openArchive(io, 0, 1);\n    BAIL_IF_ERRPASS(!unpkarc, NULL);\n\n    if (!wadLoadEntries(io, count, unpkarc))\n    {\n        UNPK_abandonArchive(unpkarc);\n        return NULL;\n    } /* if */\n\n    return unpkarc;\n} /* WAD_openArchive */\n\n\nconst PHYSFS_Archiver __PHYSFS_Archiver_WAD =\n{\n    CURRENT_PHYSFS_ARCHIVER_API_VERSION,\n    {\n        \"WAD\",\n        \"DOOM engine format\",\n        \"Travis Wells <traviswells@mchsi.com>\",\n        \"http://www.3dmm2.com/doom/\",\n        0,  /* supportsSymlinks */\n    },\n    WAD_openArchive,\n    UNPK_enumerate,\n    UNPK_openRead,\n    UNPK_openWrite,\n    UNPK_openAppend,\n    UNPK_remove,\n    UNPK_mkdir,\n    UNPK_stat,\n    UNPK_closeArchive\n};\n\n#endif  /* defined PHYSFS_SUPPORTS_WAD */\n\n/* end of physfs_archiver_wad.c ... */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_archiver_zip.c",
    "content": "/*\n * ZIP support routines for PhysicsFS.\n *\n * Please see the file LICENSE.txt in the source's root directory.\n *\n *  This file written by Ryan C. Gordon, with some peeking at \"unzip.c\"\n *   by Gilles Vollant.\n */\n\n#define __PHYSICSFS_INTERNAL__\n#include \"physfs_internal.h\"\n\n#if PHYSFS_SUPPORTS_ZIP\n\n#include <errno.h>\n#include <time.h>\n\n#if (PHYSFS_BYTEORDER == PHYSFS_LIL_ENDIAN)\n#define MINIZ_LITTLE_ENDIAN 1\n#else\n#define MINIZ_LITTLE_ENDIAN 0\n#endif\n#include \"physfs_miniz.h\"\n\n/*\n * A buffer of ZIP_READBUFSIZE is allocated for each compressed file opened,\n *  and is freed when you close the file; compressed data is read into\n *  this buffer, and then is decompressed into the buffer passed to\n *  PHYSFS_read().\n *\n * Uncompressed entries in a zipfile do not allocate this buffer; they just\n *  read data directly into the buffer passed to PHYSFS_read().\n *\n * Depending on your speed and memory requirements, you should tweak this\n *  value.\n */\n#define ZIP_READBUFSIZE   (16 * 1024)\n\n\n/*\n * Entries are \"unresolved\" until they are first opened. At that time,\n *  local file headers parsed/validated, data offsets will be updated to look\n *  at the actual file data instead of the header, and symlinks will be\n *  followed and optimized. This means that we don't seek and read around the\n *  archive until forced to do so, and after the first time, we had to do\n *  less reading and parsing, which is very CD-ROM friendly.\n */\ntypedef enum\n{\n    ZIP_UNRESOLVED_FILE,\n    ZIP_UNRESOLVED_SYMLINK,\n    ZIP_RESOLVING,\n    ZIP_RESOLVED,\n    ZIP_DIRECTORY,\n    ZIP_BROKEN_FILE,\n    ZIP_BROKEN_SYMLINK\n} ZipResolveType;\n\n\n/*\n * One ZIPentry is kept for each file in an open ZIP archive.\n */\ntypedef struct _ZIPentry\n{\n    __PHYSFS_DirTreeEntry tree;         /* manages directory tree         */\n    struct _ZIPentry *symlink;          /* NULL or file we symlink to     */\n    ZipResolveType resolved;            /* Have we resolved file/symlink? */\n    PHYSFS_uint64 offset;               /* offset of data in archive      */\n    PHYSFS_uint16 version;              /* version made by                */\n    PHYSFS_uint16 version_needed;       /* version needed to extract      */\n    PHYSFS_uint16 general_bits;         /* general purpose bits           */\n    PHYSFS_uint16 compression_method;   /* compression method             */\n    PHYSFS_uint32 crc;                  /* crc-32                         */\n    PHYSFS_uint64 compressed_size;      /* compressed size                */\n    PHYSFS_uint64 uncompressed_size;    /* uncompressed size              */\n    PHYSFS_sint64 last_mod_time;        /* last file mod time             */\n    PHYSFS_uint32 dos_mod_time;         /* original MS-DOS style mod time */\n} ZIPentry;\n\n/*\n * One ZIPinfo is kept for each open ZIP archive.\n */\ntypedef struct\n{\n    __PHYSFS_DirTree tree;    /* manages directory tree.                */\n    PHYSFS_Io *io;            /* the i/o interface for this archive.    */\n    int zip64;                /* non-zero if this is a Zip64 archive.   */\n    int has_crypto;           /* non-zero if any entry uses encryption. */\n} ZIPinfo;\n\n/*\n * One ZIPfileinfo is kept for each open file in a ZIP archive.\n */\ntypedef struct\n{\n    ZIPentry *entry;                      /* Info on file.              */\n    PHYSFS_Io *io;                        /* physical file handle.      */\n    PHYSFS_uint32 compressed_position;    /* offset in compressed data. */\n    PHYSFS_uint32 uncompressed_position;  /* tell() position.           */\n    PHYSFS_uint8 *buffer;                 /* decompression buffer.      */\n    PHYSFS_uint32 crypto_keys[3];         /* for \"traditional\" crypto.  */\n    PHYSFS_uint32 initial_crypto_keys[3]; /* for \"traditional\" crypto.  */\n    z_stream stream;                      /* zlib stream state.         */\n} ZIPfileinfo;\n\n\n/* Magic numbers... */\n#define ZIP_LOCAL_FILE_SIG                          0x04034b50\n#define ZIP_CENTRAL_DIR_SIG                         0x02014b50\n#define ZIP_END_OF_CENTRAL_DIR_SIG                  0x06054b50\n#define ZIP64_END_OF_CENTRAL_DIR_SIG                0x06064b50\n#define ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_SIG  0x07064b50\n#define ZIP64_EXTENDED_INFO_EXTRA_FIELD_SIG         0x0001\n\n/* compression methods... */\n#define COMPMETH_NONE 0\n/* ...and others... */\n\n\n#define UNIX_FILETYPE_MASK    0170000\n#define UNIX_FILETYPE_SYMLINK 0120000\n\n#define ZIP_GENERAL_BITS_TRADITIONAL_CRYPTO   (1 << 0)\n#define ZIP_GENERAL_BITS_IGNORE_LOCAL_HEADER  (1 << 3)\n\n/* support for \"traditional\" PKWARE encryption. */\nstatic int zip_entry_is_tradional_crypto(const ZIPentry *entry)\n{\n    return (entry->general_bits & ZIP_GENERAL_BITS_TRADITIONAL_CRYPTO) != 0;\n} /* zip_entry_is_traditional_crypto */\n\nstatic int zip_entry_ignore_local_header(const ZIPentry *entry)\n{\n    return (entry->general_bits & ZIP_GENERAL_BITS_IGNORE_LOCAL_HEADER) != 0;\n} /* zip_entry_is_traditional_crypto */\n\nstatic PHYSFS_uint32 zip_crypto_crc32(const PHYSFS_uint32 crc, const PHYSFS_uint8 val)\n{\n    int i;\n    PHYSFS_uint32 xorval = (crc ^ ((PHYSFS_uint32) val)) & 0xFF;\n    for (i = 0; i < 8; i++)\n        xorval = ((xorval & 1) ? (0xEDB88320 ^ (xorval >> 1)) : (xorval >> 1));\n    return xorval ^ (crc >> 8);\n} /* zip_crc32 */\n\nstatic void zip_update_crypto_keys(PHYSFS_uint32 *keys, const PHYSFS_uint8 val)\n{\n    keys[0] = zip_crypto_crc32(keys[0], val);\n    keys[1] = keys[1] + (keys[0] & 0x000000FF);\n    keys[1] = (keys[1] * 134775813) + 1;\n    keys[2] = zip_crypto_crc32(keys[2], (PHYSFS_uint8) ((keys[1] >> 24) & 0xFF));\n} /* zip_update_crypto_keys */\n\nstatic PHYSFS_uint8 zip_decrypt_byte(const PHYSFS_uint32 *keys)\n{\n    const PHYSFS_uint16 tmp = keys[2] | 2;\n    return (PHYSFS_uint8) ((tmp * (tmp ^ 1)) >> 8);\n} /* zip_decrypt_byte */\n\nstatic PHYSFS_sint64 zip_read_decrypt(ZIPfileinfo *finfo, void *buf, PHYSFS_uint64 len)\n{\n    PHYSFS_Io *io = finfo->io;\n    const PHYSFS_sint64 br = io->read(io, buf, len);\n\n    /* Decompression the new data if necessary. */\n    if (zip_entry_is_tradional_crypto(finfo->entry) && (br > 0))\n    {\n        PHYSFS_uint32 *keys = finfo->crypto_keys;\n        PHYSFS_uint8 *ptr = (PHYSFS_uint8 *) buf;\n        PHYSFS_sint64 i;\n        for (i = 0; i < br; i++, ptr++)\n        {\n            const PHYSFS_uint8 ch = *ptr ^ zip_decrypt_byte(keys);\n            zip_update_crypto_keys(keys, ch);\n            *ptr = ch;\n        } /* for */\n    } /* if  */\n\n    return br;\n} /* zip_read_decrypt */\n\nstatic int zip_prep_crypto_keys(ZIPfileinfo *finfo, const PHYSFS_uint8 *crypto_header, const PHYSFS_uint8 *password)\n{\n    /* It doesn't appear to be documented in PKWare's APPNOTE.TXT, but you\n       need to use a different byte in the header to verify the password\n       if general purpose bit 3 is set. Discovered this from Info-Zip.\n       That's what the (verifier) value is doing, below. */\n\n    PHYSFS_uint32 *keys = finfo->crypto_keys;\n    const ZIPentry *entry = finfo->entry;\n    const int usedate = zip_entry_ignore_local_header(entry);\n    const PHYSFS_uint8 verifier = (PHYSFS_uint8) ((usedate ? (entry->dos_mod_time >> 8) : (entry->crc >> 24)) & 0xFF);\n    PHYSFS_uint8 finalbyte = 0;\n    int i = 0;\n\n    /* initialize vector with defaults, then password, then header. */\n    keys[0] = 305419896;\n    keys[1] = 591751049;\n    keys[2] = 878082192;\n\n    while (*password)\n        zip_update_crypto_keys(keys, *(password++));\n\n    for (i = 0; i < 12; i++)\n    {\n        const PHYSFS_uint8 c = crypto_header[i] ^ zip_decrypt_byte(keys);\n        zip_update_crypto_keys(keys, c);\n        finalbyte = c;\n    } /* for */\n\n    /* you have a 1/256 chance of passing this test incorrectly. :/ */\n    if (finalbyte != verifier)\n        BAIL(PHYSFS_ERR_BAD_PASSWORD, 0);\n\n    /* save the initial vector for seeking purposes. Not secure!! */\n    memcpy(finfo->initial_crypto_keys, finfo->crypto_keys, 12);\n    return 1;\n} /* zip_prep_crypto_keys */\n\n\n/*\n * Bridge physfs allocation functions to zlib's format...\n */\nstatic voidpf zlibPhysfsAlloc(voidpf opaque, uInt items, uInt size)\n{\n    return ((PHYSFS_Allocator *) opaque)->Malloc(items * size);\n} /* zlibPhysfsAlloc */\n\n/*\n * Bridge physfs allocation functions to zlib's format...\n */\nstatic void zlibPhysfsFree(voidpf opaque, voidpf address)\n{\n    ((PHYSFS_Allocator *) opaque)->Free(address);\n} /* zlibPhysfsFree */\n\n\n/*\n * Construct a new z_stream to a sane state.\n */\nstatic void initializeZStream(z_stream *pstr)\n{\n    memset(pstr, '\\0', sizeof (z_stream));\n    pstr->zalloc = zlibPhysfsAlloc;\n    pstr->zfree = zlibPhysfsFree;\n    pstr->opaque = &allocator;\n} /* initializeZStream */\n\n\nstatic PHYSFS_ErrorCode zlib_error_code(int rc)\n{\n    switch (rc)\n    {\n        case Z_OK: return PHYSFS_ERR_OK;  /* not an error. */\n        case Z_STREAM_END: return PHYSFS_ERR_OK; /* not an error. */\n        case Z_ERRNO: return PHYSFS_ERR_IO;\n        case Z_MEM_ERROR: return PHYSFS_ERR_OUT_OF_MEMORY;\n        default: return PHYSFS_ERR_CORRUPT;\n    } /* switch */\n} /* zlib_error_string */\n\n\n/*\n * Wrap all zlib calls in this, so the physfs error state is set appropriately.\n */\nstatic int zlib_err(const int rc)\n{\n    PHYSFS_setErrorCode(zlib_error_code(rc));\n    return rc;\n} /* zlib_err */\n\n/*\n * Read an unsigned 64-bit int and swap to native byte order.\n */\nstatic int readui64(PHYSFS_Io *io, PHYSFS_uint64 *val)\n{\n    PHYSFS_uint64 v;\n    BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &v, sizeof (v)), 0);\n    *val = PHYSFS_swapULE64(v);\n    return 1;\n} /* readui64 */\n\n/*\n * Read an unsigned 32-bit int and swap to native byte order.\n */\nstatic int readui32(PHYSFS_Io *io, PHYSFS_uint32 *val)\n{\n    PHYSFS_uint32 v;\n    BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &v, sizeof (v)), 0);\n    *val = PHYSFS_swapULE32(v);\n    return 1;\n} /* readui32 */\n\n\n/*\n * Read an unsigned 16-bit int and swap to native byte order.\n */\nstatic int readui16(PHYSFS_Io *io, PHYSFS_uint16 *val)\n{\n    PHYSFS_uint16 v;\n    BAIL_IF_ERRPASS(!__PHYSFS_readAll(io, &v, sizeof (v)), 0);\n    *val = PHYSFS_swapULE16(v);\n    return 1;\n} /* readui16 */\n\n\nstatic PHYSFS_sint64 ZIP_read(PHYSFS_Io *_io, void *buf, PHYSFS_uint64 len)\n{\n    ZIPfileinfo *finfo = (ZIPfileinfo *) _io->opaque;\n    ZIPentry *entry = finfo->entry;\n    PHYSFS_sint64 retval = 0;\n    PHYSFS_sint64 maxread = (PHYSFS_sint64) len;\n    PHYSFS_sint64 avail = entry->uncompressed_size -\n                          finfo->uncompressed_position;\n\n    if (avail < maxread)\n        maxread = avail;\n\n    BAIL_IF_ERRPASS(maxread == 0, 0);    /* quick rejection. */\n\n    if (entry->compression_method == COMPMETH_NONE)\n        retval = zip_read_decrypt(finfo, buf, maxread);\n    else\n    {\n        finfo->stream.next_out = buf;\n        finfo->stream.avail_out = (uInt) maxread;\n\n        while (retval < maxread)\n        {\n            const PHYSFS_uint32 before = (PHYSFS_uint32) finfo->stream.total_out;\n            int rc;\n\n            if (finfo->stream.avail_in == 0)\n            {\n                PHYSFS_sint64 br;\n\n                br = entry->compressed_size - finfo->compressed_position;\n                if (br > 0)\n                {\n                    if (br > ZIP_READBUFSIZE)\n                        br = ZIP_READBUFSIZE;\n\n                    br = zip_read_decrypt(finfo, finfo->buffer, (PHYSFS_uint64) br);\n                    if (br <= 0)\n                        break;\n\n                    finfo->compressed_position += (PHYSFS_uint32) br;\n                    finfo->stream.next_in = finfo->buffer;\n                    finfo->stream.avail_in = (unsigned int) br;\n                } /* if */\n            } /* if */\n\n            rc = zlib_err(inflate(&finfo->stream, Z_SYNC_FLUSH));\n            retval += (finfo->stream.total_out - before);\n\n            if (rc != Z_OK)\n                break;\n        } /* while */\n    } /* else */\n\n    if (retval > 0)\n        finfo->uncompressed_position += (PHYSFS_uint32) retval;\n\n    return retval;\n} /* ZIP_read */\n\n\nstatic PHYSFS_sint64 ZIP_write(PHYSFS_Io *io, const void *b, PHYSFS_uint64 len)\n{\n    BAIL(PHYSFS_ERR_READ_ONLY, -1);\n} /* ZIP_write */\n\n\nstatic PHYSFS_sint64 ZIP_tell(PHYSFS_Io *io)\n{\n    return ((ZIPfileinfo *) io->opaque)->uncompressed_position;\n} /* ZIP_tell */\n\n\nstatic int ZIP_seek(PHYSFS_Io *_io, PHYSFS_uint64 offset)\n{\n    ZIPfileinfo *finfo = (ZIPfileinfo *) _io->opaque;\n    ZIPentry *entry = finfo->entry;\n    PHYSFS_Io *io = finfo->io;\n    const int encrypted = zip_entry_is_tradional_crypto(entry);\n\n    BAIL_IF(offset > entry->uncompressed_size, PHYSFS_ERR_PAST_EOF, 0);\n\n    if (!encrypted && (entry->compression_method == COMPMETH_NONE))\n    {\n        PHYSFS_sint64 newpos = offset + entry->offset;\n        BAIL_IF_ERRPASS(!io->seek(io, newpos), 0);\n        finfo->uncompressed_position = (PHYSFS_uint32) offset;\n    } /* if */\n\n    else\n    {\n        /*\n         * If seeking backwards, we need to redecode the file\n         *  from the start and throw away the compressed bits until we hit\n         *  the offset we need. If seeking forward, we still need to\n         *  decode, but we don't rewind first.\n         */\n        if (offset < finfo->uncompressed_position)\n        {\n            /* we do a copy so state is sane if inflateInit2() fails. */\n            z_stream str;\n            initializeZStream(&str);\n            if (zlib_err(inflateInit2(&str, -MAX_WBITS)) != Z_OK)\n                return 0;\n\n            if (!io->seek(io, entry->offset + (encrypted ? 12 : 0)))\n                return 0;\n\n            inflateEnd(&finfo->stream);\n            memcpy(&finfo->stream, &str, sizeof (z_stream));\n            finfo->uncompressed_position = finfo->compressed_position = 0;\n\n            if (encrypted)\n                memcpy(finfo->crypto_keys, finfo->initial_crypto_keys, 12);\n        } /* if */\n\n        while (finfo->uncompressed_position != offset)\n        {\n            PHYSFS_uint8 buf[512];\n            PHYSFS_uint32 maxread;\n\n            maxread = (PHYSFS_uint32) (offset - finfo->uncompressed_position);\n            if (maxread > sizeof (buf))\n                maxread = sizeof (buf);\n\n            if (ZIP_read(_io, buf, maxread) != maxread)\n                return 0;\n        } /* while */\n    } /* else */\n\n    return 1;\n} /* ZIP_seek */\n\n\nstatic PHYSFS_sint64 ZIP_length(PHYSFS_Io *io)\n{\n    const ZIPfileinfo *finfo = (ZIPfileinfo *) io->opaque;\n    return (PHYSFS_sint64) finfo->entry->uncompressed_size;\n} /* ZIP_length */\n\n\nstatic PHYSFS_Io *zip_get_io(PHYSFS_Io *io, ZIPinfo *inf, ZIPentry *entry);\n\nstatic PHYSFS_Io *ZIP_duplicate(PHYSFS_Io *io)\n{\n    ZIPfileinfo *origfinfo = (ZIPfileinfo *) io->opaque;\n    PHYSFS_Io *retval = (PHYSFS_Io *) allocator.Malloc(sizeof (PHYSFS_Io));\n    ZIPfileinfo *finfo = (ZIPfileinfo *) allocator.Malloc(sizeof (ZIPfileinfo));\n    GOTO_IF(!retval, PHYSFS_ERR_OUT_OF_MEMORY, failed);\n    GOTO_IF(!finfo, PHYSFS_ERR_OUT_OF_MEMORY, failed);\n    memset(finfo, '\\0', sizeof (*finfo));\n\n    finfo->entry = origfinfo->entry;\n    finfo->io = zip_get_io(origfinfo->io, NULL, finfo->entry);\n    GOTO_IF_ERRPASS(!finfo->io, failed);\n\n    initializeZStream(&finfo->stream);\n    if (finfo->entry->compression_method != COMPMETH_NONE)\n    {\n        finfo->buffer = (PHYSFS_uint8 *) allocator.Malloc(ZIP_READBUFSIZE);\n        GOTO_IF(!finfo->buffer, PHYSFS_ERR_OUT_OF_MEMORY, failed);\n        if (zlib_err(inflateInit2(&finfo->stream, -MAX_WBITS)) != Z_OK)\n            goto failed;\n    } /* if */\n\n    memcpy(retval, io, sizeof (PHYSFS_Io));\n    retval->opaque = finfo;\n    return retval;\n\nfailed:\n    if (finfo != NULL)\n    {\n        if (finfo->io != NULL)\n            finfo->io->destroy(finfo->io);\n\n        if (finfo->buffer != NULL)\n        {\n            allocator.Free(finfo->buffer);\n            inflateEnd(&finfo->stream);\n        } /* if */\n\n        allocator.Free(finfo);\n    } /* if */\n\n    if (retval != NULL)\n        allocator.Free(retval);\n\n    return NULL;\n} /* ZIP_duplicate */\n\nstatic int ZIP_flush(PHYSFS_Io *io) { return 1;  /* no write support. */ }\n\nstatic void ZIP_destroy(PHYSFS_Io *io)\n{\n    ZIPfileinfo *finfo = (ZIPfileinfo *) io->opaque;\n    finfo->io->destroy(finfo->io);\n\n    if (finfo->entry->compression_method != COMPMETH_NONE)\n        inflateEnd(&finfo->stream);\n\n    if (finfo->buffer != NULL)\n        allocator.Free(finfo->buffer);\n\n    allocator.Free(finfo);\n    allocator.Free(io);\n} /* ZIP_destroy */\n\n\nstatic const PHYSFS_Io ZIP_Io =\n{\n    CURRENT_PHYSFS_IO_API_VERSION, NULL,\n    ZIP_read,\n    ZIP_write,\n    ZIP_seek,\n    ZIP_tell,\n    ZIP_length,\n    ZIP_duplicate,\n    ZIP_flush,\n    ZIP_destroy\n};\n\n\n\nstatic PHYSFS_sint64 zip_find_end_of_central_dir(PHYSFS_Io *io, PHYSFS_sint64 *len)\n{\n    PHYSFS_uint8 buf[256];\n    PHYSFS_uint8 extra[4] = { 0, 0, 0, 0 };\n    PHYSFS_sint32 i = 0;\n    PHYSFS_sint64 filelen;\n    PHYSFS_sint64 filepos;\n    PHYSFS_sint32 maxread;\n    PHYSFS_sint32 totalread = 0;\n    int found = 0;\n\n    filelen = io->length(io);\n    BAIL_IF_ERRPASS(filelen == -1, -1);\n\n    /*\n     * Jump to the end of the file and start reading backwards.\n     *  The last thing in the file is the zipfile comment, which is variable\n     *  length, and the field that specifies its size is before it in the\n     *  file (argh!)...this means that we need to scan backwards until we\n     *  hit the end-of-central-dir signature. We can then sanity check that\n     *  the comment was as big as it should be to make sure we're in the\n     *  right place. The comment length field is 16 bits, so we can stop\n     *  searching for that signature after a little more than 64k at most,\n     *  and call it a corrupted zipfile.\n     */\n\n    if (sizeof (buf) < filelen)\n    {\n        filepos = filelen - sizeof (buf);\n        maxread = sizeof (buf);\n    } /* if */\n    else\n    {\n        filepos = 0;\n        maxread = (PHYSFS_uint32) filelen;\n    } /* else */\n\n    while ((totalread < filelen) && (totalread < 65557))\n    {\n        BAIL_IF_ERRPASS(!io->seek(io, filepos), -1);\n\n        /* make sure we catch a signature between buffers. */\n        if (totalread != 0)\n        {\n            if (!__PHYSFS_readAll(io, buf, maxread - 4))\n                return -1;\n            memcpy(&buf[maxread - 4], extra, sizeof (extra));\n            totalread += maxread - 4;\n        } /* if */\n        else\n        {\n            if (!__PHYSFS_readAll(io, buf, maxread))\n                return -1;\n            totalread += maxread;\n        } /* else */\n\n        memcpy(extra, buf, sizeof (extra));\n\n        for (i = maxread - 4; i > 0; i--)\n        {\n            if ((buf[i + 0] == 0x50) &&\n                (buf[i + 1] == 0x4B) &&\n                (buf[i + 2] == 0x05) &&\n                (buf[i + 3] == 0x06) )\n            {\n                found = 1;  /* that's the signature! */\n                break;  \n            } /* if */\n        } /* for */\n\n        if (found)\n            break;\n\n        filepos -= (maxread - 4);\n        if (filepos < 0)\n            filepos = 0;\n    } /* while */\n\n    BAIL_IF(!found, PHYSFS_ERR_UNSUPPORTED, -1);\n\n    if (len != NULL)\n        *len = filelen;\n\n    return (filepos + i);\n} /* zip_find_end_of_central_dir */\n\n\nstatic int isZip(PHYSFS_Io *io)\n{\n    PHYSFS_uint32 sig = 0;\n    int retval = 0;\n\n    /*\n     * The first thing in a zip file might be the signature of the\n     *  first local file record, so it makes for a quick determination.\n     */\n    if (readui32(io, &sig))\n    {\n        retval = (sig == ZIP_LOCAL_FILE_SIG);\n        if (!retval)\n        {\n            /*\n             * No sig...might be a ZIP with data at the start\n             *  (a self-extracting executable, etc), so we'll have to do\n             *  it the hard way...\n             */\n            retval = (zip_find_end_of_central_dir(io, NULL) != -1);\n        } /* if */\n    } /* if */\n\n    return retval;\n} /* isZip */\n\n\n/* Convert paths from old, buggy DOS zippers... */\nstatic void zip_convert_dos_path(const PHYSFS_uint16 entryversion, char *path)\n{\n    const PHYSFS_uint8 hosttype = (PHYSFS_uint8) ((entryversion >> 8) & 0xFF);\n    if (hosttype == 0)  /* FS_FAT_ */\n    {\n        while (*path)\n        {\n            if (*path == '\\\\')\n                *path = '/';\n            path++;\n        } /* while */\n    } /* if */\n} /* zip_convert_dos_path */\n\n\nstatic void zip_expand_symlink_path(char *path)\n{\n    char *ptr = path;\n    char *prevptr = path;\n\n    while (1)\n    {\n        ptr = strchr(ptr, '/');\n        if (ptr == NULL)\n            break;\n\n        if (*(ptr + 1) == '.')\n        {\n            if (*(ptr + 2) == '/')\n            {\n                /* current dir in middle of string: ditch it. */\n                memmove(ptr, ptr + 2, strlen(ptr + 2) + 1);\n            } /* else if */\n\n            else if (*(ptr + 2) == '\\0')\n            {\n                /* current dir at end of string: ditch it. */\n                *ptr = '\\0';\n            } /* else if */\n\n            else if (*(ptr + 2) == '.')\n            {\n                if (*(ptr + 3) == '/')\n                {\n                    /* parent dir in middle: move back one, if possible. */\n                    memmove(prevptr, ptr + 4, strlen(ptr + 4) + 1);\n                    ptr = prevptr;\n                    while (prevptr != path)\n                    {\n                        prevptr--;\n                        if (*prevptr == '/')\n                        {\n                            prevptr++;\n                            break;\n                        } /* if */\n                    } /* while */\n                } /* if */\n\n                if (*(ptr + 3) == '\\0')\n                {\n                    /* parent dir at end: move back one, if possible. */\n                    *prevptr = '\\0';\n                } /* if */\n            } /* if */\n        } /* if */\n        else\n        {\n            prevptr = ptr;\n            ptr++;\n        } /* else */\n    } /* while */\n} /* zip_expand_symlink_path */\n\n\nstatic inline ZIPentry *zip_find_entry(ZIPinfo *info, const char *path)\n{\n    return (ZIPentry *) __PHYSFS_DirTreeFind(&info->tree, path);\n} /* zip_find_entry */\n\n/* (forward reference: zip_follow_symlink and zip_resolve call each other.) */\nstatic int zip_resolve(PHYSFS_Io *io, ZIPinfo *info, ZIPentry *entry);\n\n/*\n * Look for the entry named by (path). If it exists, resolve it, and return\n *  a pointer to that entry. If it's another symlink, keep resolving until you\n *  hit a real file and then return a pointer to the final non-symlink entry.\n *  If there's a problem, return NULL.\n */\nstatic ZIPentry *zip_follow_symlink(PHYSFS_Io *io, ZIPinfo *info, char *path)\n{\n    ZIPentry *entry;\n\n    zip_expand_symlink_path(path);\n    entry = zip_find_entry(info, path);\n    if (entry != NULL)\n    {\n        if (!zip_resolve(io, info, entry))  /* recursive! */\n            entry = NULL;\n        else\n        {\n            if (entry->symlink != NULL)\n                entry = entry->symlink;\n        } /* else */\n    } /* if */\n\n    return entry;\n} /* zip_follow_symlink */\n\n\nstatic int zip_resolve_symlink(PHYSFS_Io *io, ZIPinfo *info, ZIPentry *entry)\n{\n    const size_t size = (size_t) entry->uncompressed_size;\n    char *path = NULL;\n    int rc = 0;\n\n    /*\n     * We've already parsed the local file header of the symlink at this\n     *  point. Now we need to read the actual link from the file data and\n     *  follow it.\n     */\n\n    BAIL_IF_ERRPASS(!io->seek(io, entry->offset), 0);\n\n    path = (char *) __PHYSFS_smallAlloc(size + 1);\n    BAIL_IF(!path, PHYSFS_ERR_OUT_OF_MEMORY, 0);\n    \n    if (entry->compression_method == COMPMETH_NONE)\n        rc = __PHYSFS_readAll(io, path, size);\n\n    else  /* symlink target path is compressed... */\n    {\n        z_stream stream;\n        const size_t complen = (size_t) entry->compressed_size;\n        PHYSFS_uint8 *compressed = (PHYSFS_uint8*) __PHYSFS_smallAlloc(complen);\n        if (compressed != NULL)\n        {\n            if (__PHYSFS_readAll(io, compressed, complen))\n            {\n                initializeZStream(&stream);\n                stream.next_in = compressed;\n                stream.avail_in = (unsigned int) complen;\n                stream.next_out = (unsigned char *) path;\n                stream.avail_out = (unsigned int) size;\n                if (zlib_err(inflateInit2(&stream, -MAX_WBITS)) == Z_OK)\n                {\n                    rc = zlib_err(inflate(&stream, Z_FINISH));\n                    inflateEnd(&stream);\n\n                    /* both are acceptable outcomes... */\n                    rc = ((rc == Z_OK) || (rc == Z_STREAM_END));\n                } /* if */\n            } /* if */\n            __PHYSFS_smallFree(compressed);\n        } /* if */\n    } /* else */\n\n    if (rc)\n    {\n        path[entry->uncompressed_size] = '\\0';    /* null-terminate it. */\n        zip_convert_dos_path(entry->version, path);\n        entry->symlink = zip_follow_symlink(io, info, path);\n    } /* else */\n\n    __PHYSFS_smallFree(path);\n\n    return (entry->symlink != NULL);\n} /* zip_resolve_symlink */\n\n\n/*\n * Parse the local file header of an entry, and update entry->offset.\n */\nstatic int zip_parse_local(PHYSFS_Io *io, ZIPentry *entry)\n{\n    PHYSFS_uint32 ui32;\n    PHYSFS_uint16 ui16;\n    PHYSFS_uint16 fnamelen;\n    PHYSFS_uint16 extralen;\n\n    /*\n     * crc and (un)compressed_size are always zero if this is a \"JAR\"\n     *  archive created with Sun's Java tools, apparently. We only\n     *  consider this archive corrupted if those entries don't match and\n     *  aren't zero. That seems to work well.\n     * We also ignore a mismatch if the value is 0xFFFFFFFF here, since it's\n     *  possible that's a Zip64 thing.\n     */\n\n    /* !!! FIXME: apparently these are zero if general purpose bit 3 is set,\n       !!! FIXME:  which is probably true for Jar files, fwiw, but we don't\n       !!! FIXME:  care about these values anyhow. */\n\n    BAIL_IF_ERRPASS(!io->seek(io, entry->offset), 0);\n    BAIL_IF_ERRPASS(!readui32(io, &ui32), 0);\n    BAIL_IF(ui32 != ZIP_LOCAL_FILE_SIG, PHYSFS_ERR_CORRUPT, 0);\n    BAIL_IF_ERRPASS(!readui16(io, &ui16), 0);\n    /* Windows Explorer might rewrite the entire central directory, setting\n       this field to 2.0/MS-DOS for all files, so favor the local version,\n       which it leaves intact if it didn't alter that specific file. */\n    entry->version_needed = ui16;\n    BAIL_IF_ERRPASS(!readui16(io, &ui16), 0);  /* general bits. */\n    BAIL_IF_ERRPASS(!readui16(io, &ui16), 0);\n    BAIL_IF(ui16 != entry->compression_method, PHYSFS_ERR_CORRUPT, 0);\n    BAIL_IF_ERRPASS(!readui32(io, &ui32), 0);  /* date/time */\n    BAIL_IF_ERRPASS(!readui32(io, &ui32), 0);\n    BAIL_IF(ui32 && (ui32 != entry->crc), PHYSFS_ERR_CORRUPT, 0);\n\n    BAIL_IF_ERRPASS(!readui32(io, &ui32), 0);\n    BAIL_IF(ui32 && (ui32 != 0xFFFFFFFF) &&\n                  (ui32 != entry->compressed_size), PHYSFS_ERR_CORRUPT, 0);\n\n    BAIL_IF_ERRPASS(!readui32(io, &ui32), 0);\n    BAIL_IF(ui32 && (ui32 != 0xFFFFFFFF) &&\n                 (ui32 != entry->uncompressed_size), PHYSFS_ERR_CORRUPT, 0);\n\n    BAIL_IF_ERRPASS(!readui16(io, &fnamelen), 0);\n    BAIL_IF_ERRPASS(!readui16(io, &extralen), 0);\n\n    entry->offset += fnamelen + extralen + 30;\n    return 1;\n} /* zip_parse_local */\n\n\nstatic int zip_resolve(PHYSFS_Io *io, ZIPinfo *info, ZIPentry *entry)\n{\n    int retval = 1;\n    const ZipResolveType resolve_type = entry->resolved;\n\n    if (resolve_type == ZIP_DIRECTORY)\n        return 1;   /* we're good. */\n\n    /* Don't bother if we've failed to resolve this entry before. */\n    BAIL_IF(resolve_type == ZIP_BROKEN_FILE, PHYSFS_ERR_CORRUPT, 0);\n    BAIL_IF(resolve_type == ZIP_BROKEN_SYMLINK, PHYSFS_ERR_CORRUPT, 0);\n\n    /* uhoh...infinite symlink loop! */\n    BAIL_IF(resolve_type == ZIP_RESOLVING, PHYSFS_ERR_SYMLINK_LOOP, 0);\n\n    /*\n     * We fix up the offset to point to the actual data on the\n     *  first open, since we don't want to seek across the whole file on\n     *  archive open (can be SLOW on large, CD-stored files), but we\n     *  need to check the local file header...not just for corruption,\n     *  but since it stores offset info the central directory does not.\n     */\n    if (resolve_type != ZIP_RESOLVED)\n    {\n        if (entry->tree.isdir)  /* an ancestor dir that DirTree filled in? */\n        {\n            entry->resolved = ZIP_DIRECTORY;\n            return 1;\n        } /* if */\n\n        retval = zip_parse_local(io, entry);\n        if (retval)\n        {\n            /*\n             * If it's a symlink, find the original file. This will cause\n             *  resolution of other entries (other symlinks and, eventually,\n             *  the real file) if all goes well.\n             */\n            if (resolve_type == ZIP_UNRESOLVED_SYMLINK)\n                retval = zip_resolve_symlink(io, info, entry);\n        } /* if */\n\n        if (resolve_type == ZIP_UNRESOLVED_SYMLINK)\n            entry->resolved = ((retval) ? ZIP_RESOLVED : ZIP_BROKEN_SYMLINK);\n        else if (resolve_type == ZIP_UNRESOLVED_FILE)\n            entry->resolved = ((retval) ? ZIP_RESOLVED : ZIP_BROKEN_FILE);\n    } /* if */\n\n    return retval;\n} /* zip_resolve */\n\n\nstatic int zip_entry_is_symlink(const ZIPentry *entry)\n{\n    return ((entry->resolved == ZIP_UNRESOLVED_SYMLINK) ||\n            (entry->resolved == ZIP_BROKEN_SYMLINK) ||\n            (entry->symlink));\n} /* zip_entry_is_symlink */\n\n\nstatic int zip_version_does_symlinks(PHYSFS_uint32 version)\n{\n    int retval = 0;\n    PHYSFS_uint8 hosttype = (PHYSFS_uint8) ((version >> 8) & 0xFF);\n\n    switch (hosttype)\n    {\n            /*\n             * These are the platforms that can NOT build an archive with\n             *  symlinks, according to the Info-ZIP project.\n             */\n        case 0:  /* FS_FAT_  */\n        case 1:  /* AMIGA_   */\n        case 2:  /* VMS_     */\n        case 4:  /* VM_CSM_  */\n        case 6:  /* FS_HPFS_ */\n        case 11: /* FS_NTFS_ */\n        case 14: /* FS_VFAT_ */\n        case 13: /* ACORN_   */\n        case 15: /* MVS_     */\n        case 18: /* THEOS_   */\n            break;  /* do nothing. */\n\n        default:  /* assume the rest to be unix-like. */\n            retval = 1;\n            break;\n    } /* switch */\n\n    return retval;\n} /* zip_version_does_symlinks */\n\n\nstatic inline int zip_has_symlink_attr(const ZIPentry *entry,\n                                       const PHYSFS_uint32 extern_attr)\n{\n    PHYSFS_uint16 xattr = ((extern_attr >> 16) & 0xFFFF);\n    return ( (zip_version_does_symlinks(entry->version)) &&\n             (entry->uncompressed_size > 0) &&\n             ((xattr & UNIX_FILETYPE_MASK) == UNIX_FILETYPE_SYMLINK) );\n} /* zip_has_symlink_attr */\n\n\nstatic PHYSFS_sint64 zip_dos_time_to_physfs_time(PHYSFS_uint32 dostime)\n{\n    PHYSFS_uint32 dosdate;\n    struct tm unixtime;\n    memset(&unixtime, '\\0', sizeof (unixtime));\n\n    dosdate = (PHYSFS_uint32) ((dostime >> 16) & 0xFFFF);\n    dostime &= 0xFFFF;\n\n    /* dissect date */\n    unixtime.tm_year = ((dosdate >> 9) & 0x7F) + 80;\n    unixtime.tm_mon  = ((dosdate >> 5) & 0x0F) - 1;\n    unixtime.tm_mday = ((dosdate     ) & 0x1F);\n\n    /* dissect time */\n    unixtime.tm_hour = ((dostime >> 11) & 0x1F);\n    unixtime.tm_min  = ((dostime >>  5) & 0x3F);\n    unixtime.tm_sec  = ((dostime <<  1) & 0x3E);\n\n    /* let mktime calculate daylight savings time. */\n    unixtime.tm_isdst = -1;\n\n    return ((PHYSFS_sint64) mktime(&unixtime));\n} /* zip_dos_time_to_physfs_time */\n\n\nstatic ZIPentry *zip_load_entry(ZIPinfo *info, const int zip64,\n                                const PHYSFS_uint64 ofs_fixup)\n{\n    PHYSFS_Io *io = info->io;\n    ZIPentry entry;\n    ZIPentry *retval = NULL;\n    PHYSFS_uint16 fnamelen, extralen, commentlen;\n    PHYSFS_uint32 external_attr;\n    PHYSFS_uint32 starting_disk;\n    PHYSFS_uint64 offset;\n    PHYSFS_uint16 ui16;\n    PHYSFS_uint32 ui32;\n    PHYSFS_sint64 si64;\n    char *name = NULL;\n    int isdir = 0;\n\n    /* sanity check with central directory signature... */\n    BAIL_IF_ERRPASS(!readui32(io, &ui32), NULL);\n    BAIL_IF(ui32 != ZIP_CENTRAL_DIR_SIG, PHYSFS_ERR_CORRUPT, NULL);\n\n    memset(&entry, '\\0', sizeof (entry));\n\n    /* Get the pertinent parts of the record... */\n    BAIL_IF_ERRPASS(!readui16(io, &entry.version), NULL);\n    BAIL_IF_ERRPASS(!readui16(io, &entry.version_needed), NULL);\n    BAIL_IF_ERRPASS(!readui16(io, &entry.general_bits), NULL);  /* general bits */\n    BAIL_IF_ERRPASS(!readui16(io, &entry.compression_method), NULL);\n    BAIL_IF_ERRPASS(!readui32(io, &entry.dos_mod_time), NULL);\n    entry.last_mod_time = zip_dos_time_to_physfs_time(entry.dos_mod_time);\n    BAIL_IF_ERRPASS(!readui32(io, &entry.crc), NULL);\n    BAIL_IF_ERRPASS(!readui32(io, &ui32), NULL);\n    entry.compressed_size = (PHYSFS_uint64) ui32;\n    BAIL_IF_ERRPASS(!readui32(io, &ui32), NULL);\n    entry.uncompressed_size = (PHYSFS_uint64) ui32;\n    BAIL_IF_ERRPASS(!readui16(io, &fnamelen), NULL);\n    BAIL_IF_ERRPASS(!readui16(io, &extralen), NULL);\n    BAIL_IF_ERRPASS(!readui16(io, &commentlen), NULL);\n    BAIL_IF_ERRPASS(!readui16(io, &ui16), NULL);\n    starting_disk = (PHYSFS_uint32) ui16;\n    BAIL_IF_ERRPASS(!readui16(io, &ui16), NULL);  /* internal file attribs */\n    BAIL_IF_ERRPASS(!readui32(io, &external_attr), NULL);\n    BAIL_IF_ERRPASS(!readui32(io, &ui32), NULL);\n    offset = (PHYSFS_uint64) ui32;\n\n    name = (char *) __PHYSFS_smallAlloc(fnamelen + 1);\n    BAIL_IF(!name, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n    if (!__PHYSFS_readAll(io, name, fnamelen))\n    {\n        __PHYSFS_smallFree(name);\n        return NULL;\n    } /* if */\n\n    if (name[fnamelen - 1] == '/')\n    {\n        name[fnamelen - 1] = '\\0';\n        isdir = 1;\n    } /* if */\n    name[fnamelen] = '\\0';  /* null-terminate the filename. */\n\n    zip_convert_dos_path(entry.version, name);\n\n    retval = (ZIPentry *) __PHYSFS_DirTreeAdd(&info->tree, name, isdir);\n    __PHYSFS_smallFree(name);\n\n    BAIL_IF(!retval, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n\n    /* It's okay to BAIL without freeing retval, because it's stored in the\n       __PHYSFS_DirTree and will be freed later anyhow. */\n    BAIL_IF(retval->last_mod_time != 0, PHYSFS_ERR_CORRUPT, NULL); /* dupe? */\n\n    /* Move the data we already read into place in the official object. */\n    memcpy(((PHYSFS_uint8 *) retval) + sizeof (__PHYSFS_DirTreeEntry),\n           ((PHYSFS_uint8 *) &entry) + sizeof (__PHYSFS_DirTreeEntry),\n           sizeof (*retval) - sizeof (__PHYSFS_DirTreeEntry));\n\n    retval->symlink = NULL;  /* will be resolved later, if necessary. */\n\n    if (isdir)\n        retval->resolved = ZIP_DIRECTORY;\n    else\n    {\n        retval->resolved = (zip_has_symlink_attr(retval, external_attr)) ?\n                                ZIP_UNRESOLVED_SYMLINK : ZIP_UNRESOLVED_FILE;\n    } /* else */\n\n    si64 = io->tell(io);\n    BAIL_IF_ERRPASS(si64 == -1, NULL);\n\n    /* If the actual sizes didn't fit in 32-bits, look for the Zip64\n        extended information extra field... */\n    if ( (zip64) &&\n         ((offset == 0xFFFFFFFF) ||\n          (starting_disk == 0xFFFFFFFF) ||\n          (retval->compressed_size == 0xFFFFFFFF) ||\n          (retval->uncompressed_size == 0xFFFFFFFF)) )\n    {\n        int found = 0;\n        PHYSFS_uint16 sig = 0;\n        PHYSFS_uint16 len = 0;\n        while (extralen > 4)\n        {\n            BAIL_IF_ERRPASS(!readui16(io, &sig), NULL);\n            BAIL_IF_ERRPASS(!readui16(io, &len), NULL);\n\n            si64 += 4 + len;\n            extralen -= 4 + len;\n            if (sig != ZIP64_EXTENDED_INFO_EXTRA_FIELD_SIG)\n            {\n                BAIL_IF_ERRPASS(!io->seek(io, si64), NULL);\n                continue;\n            } /* if */\n\n            found = 1;\n            break;\n        } /* while */\n\n        BAIL_IF(!found, PHYSFS_ERR_CORRUPT, NULL);\n\n        if (retval->uncompressed_size == 0xFFFFFFFF)\n        {\n            BAIL_IF(len < 8, PHYSFS_ERR_CORRUPT, NULL);\n            BAIL_IF_ERRPASS(!readui64(io, &retval->uncompressed_size), NULL);\n            len -= 8;\n        } /* if */\n\n        if (retval->compressed_size == 0xFFFFFFFF)\n        {\n            BAIL_IF(len < 8, PHYSFS_ERR_CORRUPT, NULL);\n            BAIL_IF_ERRPASS(!readui64(io, &retval->compressed_size), NULL);\n            len -= 8;\n        } /* if */\n\n        if (offset == 0xFFFFFFFF)\n        {\n            BAIL_IF(len < 8, PHYSFS_ERR_CORRUPT, NULL);\n            BAIL_IF_ERRPASS(!readui64(io, &offset), NULL);\n            len -= 8;\n        } /* if */\n\n        if (starting_disk == 0xFFFFFFFF)\n        {\n            BAIL_IF(len < 8, PHYSFS_ERR_CORRUPT, NULL);\n            BAIL_IF_ERRPASS(!readui32(io, &starting_disk), NULL);\n            len -= 4;\n        } /* if */\n\n        BAIL_IF(len != 0, PHYSFS_ERR_CORRUPT, NULL);\n    } /* if */\n\n    BAIL_IF(starting_disk != 0, PHYSFS_ERR_CORRUPT, NULL);\n\n    retval->offset = offset + ofs_fixup;\n\n    /* seek to the start of the next entry in the central directory... */\n    BAIL_IF_ERRPASS(!io->seek(io, si64 + extralen + commentlen), NULL);\n\n    return retval;  /* success. */\n} /* zip_load_entry */\n\n\n/* This leaves things allocated on error; the caller will clean up the mess. */\nstatic int zip_load_entries(ZIPinfo *info,\n                            const PHYSFS_uint64 data_ofs,\n                            const PHYSFS_uint64 central_ofs,\n                            const PHYSFS_uint64 entry_count)\n{\n    PHYSFS_Io *io = info->io;\n    const int zip64 = info->zip64;\n    PHYSFS_uint64 i;\n\n    BAIL_IF_ERRPASS(!io->seek(io, central_ofs), 0);\n\n    for (i = 0; i < entry_count; i++)\n    {\n        ZIPentry *entry = zip_load_entry(info, zip64, data_ofs);\n        BAIL_IF_ERRPASS(!entry, 0);\n        if (zip_entry_is_tradional_crypto(entry))\n            info->has_crypto = 1;\n    } /* for */\n\n    return 1;\n} /* zip_load_entries */\n\n\nstatic PHYSFS_sint64 zip64_find_end_of_central_dir(PHYSFS_Io *io,\n                                                   PHYSFS_sint64 _pos,\n                                                   PHYSFS_uint64 offset)\n{\n    /*\n     * Naturally, the offset is useless to us; it is the offset from the\n     *  start of file, which is meaningless if we've appended this .zip to\n     *  a self-extracting .exe. We need to find this on our own. It should\n     *  be directly before the locator record, but the record in question,\n     *  like the original end-of-central-directory record, ends with a\n     *  variable-length field. Unlike the original, which has to store the\n     *  size of that variable-length field in a 16-bit int and thus has to be\n     *  within 64k, the new one gets 64-bits.\n     *\n     * Fortunately, the only currently-specified record for that variable\n     *  length block is some weird proprietary thing that deals with EBCDIC\n     *  and tape backups or something. So we don't seek far.\n     */\n\n    PHYSFS_uint32 ui32;\n    const PHYSFS_uint64 pos = (PHYSFS_uint64) _pos;\n\n    assert(_pos > 0);\n\n    /* Try offset specified in the Zip64 end of central directory locator. */\n    /* This works if the entire PHYSFS_Io is the zip file. */\n    BAIL_IF_ERRPASS(!io->seek(io, offset), -1);\n    BAIL_IF_ERRPASS(!readui32(io, &ui32), -1);\n    if (ui32 == ZIP64_END_OF_CENTRAL_DIR_SIG)\n        return offset;\n\n    /* Try 56 bytes before the Zip64 end of central directory locator. */\n    /* This works if the record isn't variable length and is version 1. */\n    if (pos > 56)\n    {\n        BAIL_IF_ERRPASS(!io->seek(io, pos-56), -1);\n        BAIL_IF_ERRPASS(!readui32(io, &ui32), -1);\n        if (ui32 == ZIP64_END_OF_CENTRAL_DIR_SIG)\n            return pos-56;\n    } /* if */\n\n    /* Try 84 bytes before the Zip64 end of central directory locator. */\n    /* This works if the record isn't variable length and is version 2. */\n    if (pos > 84)\n    {\n        BAIL_IF_ERRPASS(!io->seek(io, pos-84), -1);\n        BAIL_IF_ERRPASS(!readui32(io, &ui32), -1);\n        if (ui32 == ZIP64_END_OF_CENTRAL_DIR_SIG)\n            return pos-84;\n    } /* if */\n\n    /* Ok, brute force: we know it's between (offset) and (pos) somewhere. */\n    /*  Just try moving back at most 256k. Oh well. */\n    if ((offset < pos) && (pos > 4))\n    {\n        const size_t maxbuflen = 256 * 1024;\n        size_t len = (size_t) (pos - offset);\n        PHYSFS_uint8 *buf = NULL;\n        PHYSFS_sint32 i;\n\n        if (len > maxbuflen)\n            len = maxbuflen;\n\n        buf = (PHYSFS_uint8 *) __PHYSFS_smallAlloc(len);\n        BAIL_IF(!buf, PHYSFS_ERR_OUT_OF_MEMORY, -1);\n\n        if (!io->seek(io, pos - len) || !__PHYSFS_readAll(io, buf, len))\n        {\n            __PHYSFS_smallFree(buf);\n            return -1;  /* error was set elsewhere. */\n        } /* if */\n\n        for (i = (PHYSFS_sint32) (len - 4); i >= 0; i--)\n        {\n            if ( (buf[i] == 0x50) && (buf[i+1] == 0x4b) &&\n                 (buf[i+2] == 0x06) && (buf[i+3] == 0x06) )\n            {\n                __PHYSFS_smallFree(buf);\n                return pos - ((PHYSFS_sint64) (len - i));\n            } /* if */\n        } /* for */\n\n        __PHYSFS_smallFree(buf);\n    } /* if */\n\n    BAIL(PHYSFS_ERR_CORRUPT, -1);  /* didn't find it. */\n} /* zip64_find_end_of_central_dir */\n\n\nstatic int zip64_parse_end_of_central_dir(ZIPinfo *info,\n                                          PHYSFS_uint64 *data_start,\n                                          PHYSFS_uint64 *dir_ofs,\n                                          PHYSFS_uint64 *entry_count,\n                                          PHYSFS_sint64 pos)\n{\n    PHYSFS_Io *io = info->io;\n    PHYSFS_uint64 ui64;\n    PHYSFS_uint32 ui32;\n    PHYSFS_uint16 ui16;\n\n    /* We should be positioned right past the locator signature. */\n\n    if ((pos < 0) || (!io->seek(io, pos)))\n        return 0;\n\n    BAIL_IF_ERRPASS(!readui32(io, &ui32), 0);\n    if (ui32 != ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_SIG)\n        return -1;  /* it's not a Zip64 archive. Not an error, though! */\n\n    info->zip64 = 1;\n\n    /* number of the disk with the start of the central directory. */\n    BAIL_IF_ERRPASS(!readui32(io, &ui32), 0);\n    BAIL_IF(ui32 != 0, PHYSFS_ERR_CORRUPT, 0);\n\n    /* offset of Zip64 end of central directory record. */\n    BAIL_IF_ERRPASS(!readui64(io, &ui64), 0);\n\n    /* total number of disks */\n    BAIL_IF_ERRPASS(!readui32(io, &ui32), 0);\n    BAIL_IF(ui32 != 1, PHYSFS_ERR_CORRUPT, 0);\n\n    pos = zip64_find_end_of_central_dir(io, pos, ui64);\n    if (pos < 0)\n        return 0;  /* oh well. */\n\n    /*\n     * For self-extracting archives, etc, there's crapola in the file\n     *  before the zipfile records; we calculate how much data there is\n     *  prepended by determining how far the zip64-end-of-central-directory\n     *  offset is from where it is supposed to be...the difference in bytes\n     *  is how much arbitrary data is at the start of the physical file.\n     */\n    assert(((PHYSFS_uint64) pos) >= ui64);\n    *data_start = ((PHYSFS_uint64) pos) - ui64;\n\n    BAIL_IF_ERRPASS(!io->seek(io, pos), 0);\n\n    /* check signature again, just in case. */\n    BAIL_IF_ERRPASS(!readui32(io, &ui32), 0);\n    BAIL_IF(ui32 != ZIP64_END_OF_CENTRAL_DIR_SIG, PHYSFS_ERR_CORRUPT, 0);\n\n    /* size of Zip64 end of central directory record. */\n    BAIL_IF_ERRPASS(!readui64(io, &ui64), 0);\n\n    /* version made by. */\n    BAIL_IF_ERRPASS(!readui16(io, &ui16), 0);\n\n    /* version needed to extract. */\n    BAIL_IF_ERRPASS(!readui16(io, &ui16), 0);\n\n    /* number of this disk. */\n    BAIL_IF_ERRPASS(!readui32(io, &ui32), 0);\n    BAIL_IF(ui32 != 0, PHYSFS_ERR_CORRUPT, 0);\n\n    /* number of disk with start of central directory record. */\n    BAIL_IF_ERRPASS(!readui32(io, &ui32), 0);\n    BAIL_IF(ui32 != 0, PHYSFS_ERR_CORRUPT, 0);\n\n    /* total number of entries in the central dir on this disk */\n    BAIL_IF_ERRPASS(!readui64(io, &ui64), 0);\n\n    /* total number of entries in the central dir */\n    BAIL_IF_ERRPASS(!readui64(io, entry_count), 0);\n    BAIL_IF(ui64 != *entry_count, PHYSFS_ERR_CORRUPT, 0);\n\n    /* size of the central directory */\n    BAIL_IF_ERRPASS(!readui64(io, &ui64), 0);\n\n    /* offset of central directory */\n    BAIL_IF_ERRPASS(!readui64(io, dir_ofs), 0);\n\n    /* Since we know the difference, fix up the central dir offset... */\n    *dir_ofs += *data_start;\n\n    /*\n     * There are more fields here, for encryption and feature-specific things,\n     *  but we don't care about any of them at the moment.\n     */\n\n    return 1;  /* made it. */\n} /* zip64_parse_end_of_central_dir */\n\n\nstatic int zip_parse_end_of_central_dir(ZIPinfo *info,\n                                        PHYSFS_uint64 *data_start,\n                                        PHYSFS_uint64 *dir_ofs,\n                                        PHYSFS_uint64 *entry_count)\n{\n    PHYSFS_Io *io = info->io;\n    PHYSFS_uint16 entryCount16;\n    PHYSFS_uint32 offset32;\n    PHYSFS_uint32 ui32;\n    PHYSFS_uint16 ui16;\n    PHYSFS_sint64 len;\n    PHYSFS_sint64 pos;\n    int rc;\n\n    /* find the end-of-central-dir record, and seek to it. */\n    pos = zip_find_end_of_central_dir(io, &len);\n    BAIL_IF_ERRPASS(pos == -1, 0);\n    BAIL_IF_ERRPASS(!io->seek(io, pos), 0);\n\n    /* check signature again, just in case. */\n    BAIL_IF_ERRPASS(!readui32(io, &ui32), 0);\n    BAIL_IF(ui32 != ZIP_END_OF_CENTRAL_DIR_SIG, PHYSFS_ERR_CORRUPT, 0);\n\n    /* Seek back to see if \"Zip64 end of central directory locator\" exists. */\n    /* this record is 20 bytes before end-of-central-dir */\n    rc = zip64_parse_end_of_central_dir(info, data_start, dir_ofs,\n                                        entry_count, pos - 20);\n\n    /* Error or success? Bounce out of here. Keep going if not zip64. */\n    if ((rc == 0) || (rc == 1))\n        return rc;\n\n    assert(rc == -1);  /* no error, just not a Zip64 archive. */\n\n    /* Not Zip64? Seek back to where we were and keep processing. */\n    BAIL_IF_ERRPASS(!io->seek(io, pos + 4), 0);\n\n    /* number of this disk */\n    BAIL_IF_ERRPASS(!readui16(io, &ui16), 0);\n    BAIL_IF(ui16 != 0, PHYSFS_ERR_CORRUPT, 0);\n\n    /* number of the disk with the start of the central directory */\n    BAIL_IF_ERRPASS(!readui16(io, &ui16), 0);\n    BAIL_IF(ui16 != 0, PHYSFS_ERR_CORRUPT, 0);\n\n    /* total number of entries in the central dir on this disk */\n    BAIL_IF_ERRPASS(!readui16(io, &ui16), 0);\n\n    /* total number of entries in the central dir */\n    BAIL_IF_ERRPASS(!readui16(io, &entryCount16), 0);\n    BAIL_IF(ui16 != entryCount16, PHYSFS_ERR_CORRUPT, 0);\n\n    *entry_count = entryCount16;\n\n    /* size of the central directory */\n    BAIL_IF_ERRPASS(!readui32(io, &ui32), 0);\n\n    /* offset of central directory */\n    BAIL_IF_ERRPASS(!readui32(io, &offset32), 0);\n    *dir_ofs = (PHYSFS_uint64) offset32;\n    BAIL_IF(((PHYSFS_uint64) pos) < (*dir_ofs + ui32), PHYSFS_ERR_CORRUPT, 0);\n\n    /*\n     * For self-extracting archives, etc, there's crapola in the file\n     *  before the zipfile records; we calculate how much data there is\n     *  prepended by determining how far the central directory offset is\n     *  from where it is supposed to be (start of end-of-central-dir minus\n     *  sizeof central dir)...the difference in bytes is how much arbitrary\n     *  data is at the start of the physical file.\n     */\n    *data_start = (PHYSFS_uint64) (pos - (*dir_ofs + ui32));\n\n    /* Now that we know the difference, fix up the central dir offset... */\n    *dir_ofs += *data_start;\n\n    /* zipfile comment length */\n    BAIL_IF_ERRPASS(!readui16(io, &ui16), 0);\n\n    /*\n     * Make sure that the comment length matches to the end of file...\n     *  If it doesn't, we're either in the wrong part of the file, or the\n     *  file is corrupted, but we give up either way.\n     */\n    BAIL_IF((pos + 22 + ui16) != len, PHYSFS_ERR_CORRUPT, 0);\n\n    return 1;  /* made it. */\n} /* zip_parse_end_of_central_dir */\n\n\nstatic void ZIP_closeArchive(void *opaque)\n{\n    ZIPinfo *info = (ZIPinfo *) (opaque);\n\n    if (!info)\n        return;\n\n    if (info->io)\n        info->io->destroy(info->io);\n\n    __PHYSFS_DirTreeDeinit(&info->tree);\n\n    allocator.Free(info);\n} /* ZIP_closeArchive */\n\n\nstatic void *ZIP_openArchive(PHYSFS_Io *io, const char *name,\n                             int forWriting, int *claimed)\n{\n    ZIPinfo *info = NULL;\n    ZIPentry *root = NULL;\n    PHYSFS_uint64 dstart = 0;  /* data start */\n    PHYSFS_uint64 cdir_ofs;  /* central dir offset */\n    PHYSFS_uint64 count;\n\n    assert(io != NULL);  /* shouldn't ever happen. */\n\n    BAIL_IF(forWriting, PHYSFS_ERR_READ_ONLY, NULL);\n    BAIL_IF_ERRPASS(!isZip(io), NULL);\n\n    *claimed = 1;\n\n    info = (ZIPinfo *) allocator.Malloc(sizeof (ZIPinfo));\n    BAIL_IF(!info, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n    memset(info, '\\0', sizeof (ZIPinfo));\n\n    info->io = io;\n\n    if (!zip_parse_end_of_central_dir(info, &dstart, &cdir_ofs, &count))\n        goto ZIP_openarchive_failed;\n    else if (!__PHYSFS_DirTreeInit(&info->tree, sizeof (ZIPentry), 1, 0))\n        goto ZIP_openarchive_failed;\n\n    root = (ZIPentry *) info->tree.root;\n    root->resolved = ZIP_DIRECTORY;\n\n    if (!zip_load_entries(info, dstart, cdir_ofs, count))\n        goto ZIP_openarchive_failed;\n\n    assert(info->tree.root->sibling == NULL);\n    return info;\n\nZIP_openarchive_failed:\n    info->io = NULL;  /* don't let ZIP_closeArchive destroy (io). */\n    ZIP_closeArchive(info);\n    return NULL;\n} /* ZIP_openArchive */\n\n\nstatic PHYSFS_Io *zip_get_io(PHYSFS_Io *io, ZIPinfo *inf, ZIPentry *entry)\n{\n    int success;\n    PHYSFS_Io *retval = io->duplicate(io);\n    BAIL_IF_ERRPASS(!retval, NULL);\n\n    assert(!entry->tree.isdir); /* should have been checked before calling. */\n\n    /* (inf) can be NULL if we already resolved. */\n    success = (inf == NULL) || zip_resolve(retval, inf, entry);\n    if (success)\n    {\n        PHYSFS_sint64 offset;\n        offset = ((entry->symlink) ? entry->symlink->offset : entry->offset);\n        success = retval->seek(retval, offset);\n    } /* if */\n\n    if (!success)\n    {\n        retval->destroy(retval);\n        retval = NULL;\n    } /* if */\n\n    return retval;\n} /* zip_get_io */\n\n\nstatic PHYSFS_Io *ZIP_openRead(void *opaque, const char *filename)\n{\n    PHYSFS_Io *retval = NULL;\n    ZIPinfo *info = (ZIPinfo *) opaque;\n    ZIPentry *entry = zip_find_entry(info, filename);\n    ZIPfileinfo *finfo = NULL;\n    PHYSFS_Io *io = NULL;\n    PHYSFS_uint8 *password = NULL;\n\n    /* if not found, see if maybe \"$PASSWORD\" is appended. */\n    if ((!entry) && (info->has_crypto))\n    {\n        const char *ptr = strrchr(filename, '$');\n        if (ptr != NULL)\n        {\n            const size_t len = (size_t) (ptr - filename);\n            char *str = (char *) __PHYSFS_smallAlloc(len + 1);\n            BAIL_IF(!str, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n            memcpy(str, filename, len);\n            str[len] = '\\0';\n            entry = zip_find_entry(info, str);\n            __PHYSFS_smallFree(str);\n            password = (PHYSFS_uint8 *) (ptr + 1);\n        } /* if */\n    } /* if */\n\n    BAIL_IF_ERRPASS(!entry, NULL);\n\n    BAIL_IF_ERRPASS(!zip_resolve(info->io, info, entry), NULL);\n\n    BAIL_IF(entry->tree.isdir, PHYSFS_ERR_NOT_A_FILE, NULL);\n\n    retval = (PHYSFS_Io *) allocator.Malloc(sizeof (PHYSFS_Io));\n    GOTO_IF(!retval, PHYSFS_ERR_OUT_OF_MEMORY, ZIP_openRead_failed);\n\n    finfo = (ZIPfileinfo *) allocator.Malloc(sizeof (ZIPfileinfo));\n    GOTO_IF(!finfo, PHYSFS_ERR_OUT_OF_MEMORY, ZIP_openRead_failed);\n    memset(finfo, '\\0', sizeof (ZIPfileinfo));\n\n    io = zip_get_io(info->io, info, entry);\n    GOTO_IF_ERRPASS(!io, ZIP_openRead_failed);\n    finfo->io = io;\n    finfo->entry = ((entry->symlink != NULL) ? entry->symlink : entry);\n    initializeZStream(&finfo->stream);\n\n    if (finfo->entry->compression_method != COMPMETH_NONE)\n    {\n        finfo->buffer = (PHYSFS_uint8 *) allocator.Malloc(ZIP_READBUFSIZE);\n        if (!finfo->buffer)\n            GOTO(PHYSFS_ERR_OUT_OF_MEMORY, ZIP_openRead_failed);\n        else if (zlib_err(inflateInit2(&finfo->stream, -MAX_WBITS)) != Z_OK)\n            goto ZIP_openRead_failed;\n    } /* if */\n\n    if (!zip_entry_is_tradional_crypto(entry))\n        GOTO_IF(password != NULL, PHYSFS_ERR_BAD_PASSWORD, ZIP_openRead_failed);\n    else\n    {\n        PHYSFS_uint8 crypto_header[12];\n        GOTO_IF(password == NULL, PHYSFS_ERR_BAD_PASSWORD, ZIP_openRead_failed);\n        if (io->read(io, crypto_header, 12) != 12)\n            goto ZIP_openRead_failed;\n        else if (!zip_prep_crypto_keys(finfo, crypto_header, password))\n            goto ZIP_openRead_failed;\n    } /* if */\n\n    memcpy(retval, &ZIP_Io, sizeof (PHYSFS_Io));\n    retval->opaque = finfo;\n\n    return retval;\n\nZIP_openRead_failed:\n    if (finfo != NULL)\n    {\n        if (finfo->io != NULL)\n            finfo->io->destroy(finfo->io);\n\n        if (finfo->buffer != NULL)\n        {\n            allocator.Free(finfo->buffer);\n            inflateEnd(&finfo->stream);\n        } /* if */\n\n        allocator.Free(finfo);\n    } /* if */\n\n    if (retval != NULL)\n        allocator.Free(retval);\n\n    return NULL;\n} /* ZIP_openRead */\n\n\nstatic PHYSFS_Io *ZIP_openWrite(void *opaque, const char *filename)\n{\n    BAIL(PHYSFS_ERR_READ_ONLY, NULL);\n} /* ZIP_openWrite */\n\n\nstatic PHYSFS_Io *ZIP_openAppend(void *opaque, const char *filename)\n{\n    BAIL(PHYSFS_ERR_READ_ONLY, NULL);\n} /* ZIP_openAppend */\n\n\nstatic int ZIP_remove(void *opaque, const char *name)\n{\n    BAIL(PHYSFS_ERR_READ_ONLY, 0);\n} /* ZIP_remove */\n\n\nstatic int ZIP_mkdir(void *opaque, const char *name)\n{\n    BAIL(PHYSFS_ERR_READ_ONLY, 0);\n} /* ZIP_mkdir */\n\n\nstatic int ZIP_stat(void *opaque, const char *filename, PHYSFS_Stat *stat)\n{\n    ZIPinfo *info = (ZIPinfo *) opaque;\n    ZIPentry *entry = zip_find_entry(info, filename);\n\n    if (entry == NULL)\n        return 0;\n\n    else if (!zip_resolve(info->io, info, entry))\n        return 0;\n\n    else if (entry->resolved == ZIP_DIRECTORY)\n    {\n        stat->filesize = 0;\n        stat->filetype = PHYSFS_FILETYPE_DIRECTORY;\n    } /* if */\n\n    else if (zip_entry_is_symlink(entry))\n    {\n        stat->filesize = 0;\n        stat->filetype = PHYSFS_FILETYPE_SYMLINK;\n    } /* else if */\n\n    else\n    {\n        stat->filesize = (PHYSFS_sint64) entry->uncompressed_size;\n        stat->filetype = PHYSFS_FILETYPE_REGULAR;\n    } /* else */\n\n    stat->modtime = ((entry) ? entry->last_mod_time : 0);\n    stat->createtime = stat->modtime;\n    stat->accesstime = -1;\n    stat->readonly = 1; /* .zip files are always read only */\n\n    return 1;\n} /* ZIP_stat */\n\n\nconst PHYSFS_Archiver __PHYSFS_Archiver_ZIP =\n{\n    CURRENT_PHYSFS_ARCHIVER_API_VERSION,\n    {\n        \"ZIP\",\n        \"PkZip/WinZip/Info-Zip compatible\",\n        \"Ryan C. Gordon <icculus@icculus.org>\",\n        \"https://icculus.org/physfs/\",\n        1,  /* supportsSymlinks */\n    },\n    ZIP_openArchive,\n    __PHYSFS_DirTreeEnumerate,\n    ZIP_openRead,\n    ZIP_openWrite,\n    ZIP_openAppend,\n    ZIP_remove,\n    ZIP_mkdir,\n    ZIP_stat,\n    ZIP_closeArchive\n};\n\n#endif  /* defined PHYSFS_SUPPORTS_ZIP */\n\n/* end of physfs_archiver_zip.c ... */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_byteorder.c",
    "content": "/**\n * PhysicsFS; a portable, flexible file i/o abstraction.\n *\n * Documentation is in physfs.h. It's verbose, honest.  :)\n *\n * Please see the file LICENSE.txt in the source's root directory.\n *\n *  This file written by Ryan C. Gordon.\n */\n\n#define __PHYSICSFS_INTERNAL__\n#include \"physfs_internal.h\"\n\n#ifndef PHYSFS_Swap16\nstatic inline PHYSFS_uint16 PHYSFS_Swap16(PHYSFS_uint16 D)\n{\n    return ((D<<8)|(D>>8));\n}\n#endif\n#ifndef PHYSFS_Swap32\nstatic inline PHYSFS_uint32 PHYSFS_Swap32(PHYSFS_uint32 D)\n{\n    return ((D<<24)|((D<<8)&0x00FF0000)|((D>>8)&0x0000FF00)|(D>>24));\n}\n#endif\n#ifndef PHYSFS_NO_64BIT_SUPPORT\n#ifndef PHYSFS_Swap64\nstatic inline PHYSFS_uint64 PHYSFS_Swap64(PHYSFS_uint64 val) {\n    PHYSFS_uint32 hi, lo;\n\n    /* Separate into high and low 32-bit values and swap them */\n    lo = (PHYSFS_uint32)(val&0xFFFFFFFF);\n    val >>= 32;\n    hi = (PHYSFS_uint32)(val&0xFFFFFFFF);\n    val = PHYSFS_Swap32(lo);\n    val <<= 32;\n    val |= PHYSFS_Swap32(hi);\n    return val;\n}\n#endif\n#else\n#ifndef PHYSFS_Swap64\n/* This is mainly to keep compilers from complaining in PHYSFS code.\n   If there is no real 64-bit datatype, then compilers will complain about\n   the fake 64-bit datatype that PHYSFS provides when it compiles user code.\n*/\n#define PHYSFS_Swap64(X)    (X)\n#endif\n#endif /* PHYSFS_NO_64BIT_SUPPORT */\n\n\n/* Byteswap item from the specified endianness to the native endianness */\n#if PHYSFS_BYTEORDER == PHYSFS_LIL_ENDIAN\nPHYSFS_uint16 PHYSFS_swapULE16(PHYSFS_uint16 x) { return x; }\nPHYSFS_sint16 PHYSFS_swapSLE16(PHYSFS_sint16 x) { return x; }\nPHYSFS_uint32 PHYSFS_swapULE32(PHYSFS_uint32 x) { return x; }\nPHYSFS_sint32 PHYSFS_swapSLE32(PHYSFS_sint32 x) { return x; }\nPHYSFS_uint64 PHYSFS_swapULE64(PHYSFS_uint64 x) { return x; }\nPHYSFS_sint64 PHYSFS_swapSLE64(PHYSFS_sint64 x) { return x; }\n\nPHYSFS_uint16 PHYSFS_swapUBE16(PHYSFS_uint16 x) { return PHYSFS_Swap16(x); }\nPHYSFS_sint16 PHYSFS_swapSBE16(PHYSFS_sint16 x) { return PHYSFS_Swap16(x); }\nPHYSFS_uint32 PHYSFS_swapUBE32(PHYSFS_uint32 x) { return PHYSFS_Swap32(x); }\nPHYSFS_sint32 PHYSFS_swapSBE32(PHYSFS_sint32 x) { return PHYSFS_Swap32(x); }\nPHYSFS_uint64 PHYSFS_swapUBE64(PHYSFS_uint64 x) { return PHYSFS_Swap64(x); }\nPHYSFS_sint64 PHYSFS_swapSBE64(PHYSFS_sint64 x) { return PHYSFS_Swap64(x); }\n#else\nPHYSFS_uint16 PHYSFS_swapULE16(PHYSFS_uint16 x) { return PHYSFS_Swap16(x); }\nPHYSFS_sint16 PHYSFS_swapSLE16(PHYSFS_sint16 x) { return PHYSFS_Swap16(x); }\nPHYSFS_uint32 PHYSFS_swapULE32(PHYSFS_uint32 x) { return PHYSFS_Swap32(x); }\nPHYSFS_sint32 PHYSFS_swapSLE32(PHYSFS_sint32 x) { return PHYSFS_Swap32(x); }\nPHYSFS_uint64 PHYSFS_swapULE64(PHYSFS_uint64 x) { return PHYSFS_Swap64(x); }\nPHYSFS_sint64 PHYSFS_swapSLE64(PHYSFS_sint64 x) { return PHYSFS_Swap64(x); }\n\nPHYSFS_uint16 PHYSFS_swapUBE16(PHYSFS_uint16 x) { return x; }\nPHYSFS_sint16 PHYSFS_swapSBE16(PHYSFS_sint16 x) { return x; }\nPHYSFS_uint32 PHYSFS_swapUBE32(PHYSFS_uint32 x) { return x; }\nPHYSFS_sint32 PHYSFS_swapSBE32(PHYSFS_sint32 x) { return x; }\nPHYSFS_uint64 PHYSFS_swapUBE64(PHYSFS_uint64 x) { return x; }\nPHYSFS_sint64 PHYSFS_swapSBE64(PHYSFS_sint64 x) { return x; }\n#endif\n\nstatic inline int readAll(PHYSFS_File *file, void *val, const size_t len)\n{\n    return (PHYSFS_readBytes(file, val, len) == len);\n} /* readAll */\n\n#define PHYSFS_BYTEORDER_READ(datatype, swaptype) \\\n    int PHYSFS_read##swaptype(PHYSFS_File *file, PHYSFS_##datatype *val) { \\\n        PHYSFS_##datatype in; \\\n        BAIL_IF(val == NULL, PHYSFS_ERR_INVALID_ARGUMENT, 0); \\\n        BAIL_IF_ERRPASS(!readAll(file, &in, sizeof (in)), 0); \\\n        *val = PHYSFS_swap##swaptype(in); \\\n        return 1; \\\n    }\n\nPHYSFS_BYTEORDER_READ(sint16, SLE16)\nPHYSFS_BYTEORDER_READ(uint16, ULE16)\nPHYSFS_BYTEORDER_READ(sint16, SBE16)\nPHYSFS_BYTEORDER_READ(uint16, UBE16)\nPHYSFS_BYTEORDER_READ(sint32, SLE32)\nPHYSFS_BYTEORDER_READ(uint32, ULE32)\nPHYSFS_BYTEORDER_READ(sint32, SBE32)\nPHYSFS_BYTEORDER_READ(uint32, UBE32)\nPHYSFS_BYTEORDER_READ(sint64, SLE64)\nPHYSFS_BYTEORDER_READ(uint64, ULE64)\nPHYSFS_BYTEORDER_READ(sint64, SBE64)\nPHYSFS_BYTEORDER_READ(uint64, UBE64)\n\n\nstatic inline int writeAll(PHYSFS_File *f, const void *val, const size_t len)\n{\n    return (PHYSFS_writeBytes(f, val, len) == len);\n} /* writeAll */\n\n#define PHYSFS_BYTEORDER_WRITE(datatype, swaptype) \\\n    int PHYSFS_write##swaptype(PHYSFS_File *file, PHYSFS_##datatype val) { \\\n        const PHYSFS_##datatype out = PHYSFS_swap##swaptype(val); \\\n        BAIL_IF_ERRPASS(!writeAll(file, &out, sizeof (out)), 0); \\\n        return 1; \\\n    }\n\nPHYSFS_BYTEORDER_WRITE(sint16, SLE16)\nPHYSFS_BYTEORDER_WRITE(uint16, ULE16)\nPHYSFS_BYTEORDER_WRITE(sint16, SBE16)\nPHYSFS_BYTEORDER_WRITE(uint16, UBE16)\nPHYSFS_BYTEORDER_WRITE(sint32, SLE32)\nPHYSFS_BYTEORDER_WRITE(uint32, ULE32)\nPHYSFS_BYTEORDER_WRITE(sint32, SBE32)\nPHYSFS_BYTEORDER_WRITE(uint32, UBE32)\nPHYSFS_BYTEORDER_WRITE(sint64, SLE64)\nPHYSFS_BYTEORDER_WRITE(uint64, ULE64)\nPHYSFS_BYTEORDER_WRITE(sint64, SBE64)\nPHYSFS_BYTEORDER_WRITE(uint64, UBE64)\n\n/* end of physfs_byteorder.c ... */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_casefolding.h",
    "content": "/*\n * This file is part of PhysicsFS (https://icculus.org/physfs/)\n *\n * This data generated by physfs/extras/makecasefoldhashtable.pl ...\n * Do not manually edit this file!\n *\n * Please see the file LICENSE.txt in the source's root directory.\n */\n\n#ifndef _INCLUDE_PHYSFS_CASEFOLDING_H_\n#define _INCLUDE_PHYSFS_CASEFOLDING_H_\n\n#ifndef __PHYSICSFS_INTERNAL__\n#error Do not include this header from your applications.\n#endif\n\n/* We build three simple hashmaps here: one that maps Unicode codepoints to\na one, two, or three lowercase codepoints. To retrieve this info: look at\ncase_fold_hashX, where X is 1, 2, or 3. Most foldable codepoints fold to one,\na few dozen fold to two, and a handful fold to three. If the codepoint isn't\nin any of these hashes, it doesn't fold (no separate upper and lowercase).\n\nAlmost all these codepoints fit into 16 bits, so we hash them as such to save\nmemory. If a codepoint is > 0xFFFF, we have separate hashes for them,\nsince there are (currently) only about 120 of them and (currently) all of them\nmap to a single lowercase codepoint. */\n\ntypedef struct CaseFoldMapping1_32\n{\n    PHYSFS_uint32 from;\n    PHYSFS_uint32 to0;\n} CaseFoldMapping1_32;\n\ntypedef struct CaseFoldMapping1_16\n{\n    PHYSFS_uint16 from;\n    PHYSFS_uint16 to0;\n} CaseFoldMapping1_16;\n\ntypedef struct CaseFoldMapping2_16\n{\n    PHYSFS_uint16 from;\n    PHYSFS_uint16 to0;\n    PHYSFS_uint16 to1;\n} CaseFoldMapping2_16;\n\ntypedef struct CaseFoldMapping3_16\n{\n    PHYSFS_uint16 from;\n    PHYSFS_uint16 to0;\n    PHYSFS_uint16 to1;\n    PHYSFS_uint16 to2;\n} CaseFoldMapping3_16;\n\ntypedef struct CaseFoldHashBucket1_16\n{\n    const CaseFoldMapping1_16 *list;\n    const PHYSFS_uint8 count;\n} CaseFoldHashBucket1_16;\n\ntypedef struct CaseFoldHashBucket1_32\n{\n    const CaseFoldMapping1_32 *list;\n    const PHYSFS_uint8 count;\n} CaseFoldHashBucket1_32;\n\ntypedef struct CaseFoldHashBucket2_16\n{\n    const CaseFoldMapping2_16 *list;\n    const PHYSFS_uint8 count;\n} CaseFoldHashBucket2_16;\n\ntypedef struct CaseFoldHashBucket3_16\n{\n    const CaseFoldMapping3_16 *list;\n    const PHYSFS_uint8 count;\n} CaseFoldHashBucket3_16;\n\nstatic const CaseFoldMapping1_16 case_fold1_16_000[] = {\n    { 0x0202, 0x0203 },\n    { 0x0404, 0x0454 },\n    { 0x1E1E, 0x1E1F },\n    { 0x2C2C, 0x2C5C },\n    { 0xABAB, 0x13DB }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_001[] = {\n    { 0x0100, 0x0101 },\n    { 0x0405, 0x0455 },\n    { 0x0504, 0x0505 },\n    { 0x2C2D, 0x2C5D },\n    { 0xA7A6, 0xA7A7 },\n    { 0xABAA, 0x13DA }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_002[] = {\n    { 0x0200, 0x0201 },\n    { 0x0406, 0x0456 },\n    { 0x1E1C, 0x1E1D },\n    { 0x1F1D, 0x1F15 },\n    { 0x2C2E, 0x2C5E },\n    { 0xABA9, 0x13D9 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_003[] = {\n    { 0x0102, 0x0103 },\n    { 0x0407, 0x0457 },\n    { 0x0506, 0x0507 },\n    { 0x1F1C, 0x1F14 },\n    { 0xA7A4, 0xA7A5 },\n    { 0xABA8, 0x13D8 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_004[] = {\n    { 0x0206, 0x0207 },\n    { 0x0400, 0x0450 },\n    { 0x1E1A, 0x1E1B },\n    { 0x1F1B, 0x1F13 },\n    { 0x2C28, 0x2C58 },\n    { 0xABAF, 0x13DF }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_005[] = {\n    { 0x0104, 0x0105 },\n    { 0x0401, 0x0451 },\n    { 0x0500, 0x0501 },\n    { 0x1F1A, 0x1F12 },\n    { 0x2C29, 0x2C59 },\n    { 0xA7A2, 0xA7A3 },\n    { 0xABAE, 0x13DE }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_006[] = {\n    { 0x0204, 0x0205 },\n    { 0x0402, 0x0452 },\n    { 0x1E18, 0x1E19 },\n    { 0x1F19, 0x1F11 },\n    { 0x2C2A, 0x2C5A },\n    { 0xABAD, 0x13DD }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_007[] = {\n    { 0x0106, 0x0107 },\n    { 0x0403, 0x0453 },\n    { 0x0502, 0x0503 },\n    { 0x1F18, 0x1F10 },\n    { 0x2126, 0x03C9 },\n    { 0x2C2B, 0x2C5B },\n    { 0xA7A0, 0xA7A1 },\n    { 0xABAC, 0x13DC }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_008[] = {\n    { 0x020A, 0x020B },\n    { 0x040C, 0x045C },\n    { 0x1E16, 0x1E17 },\n    { 0x2C24, 0x2C54 },\n    { 0xABA3, 0x13D3 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_009[] = {\n    { 0x0108, 0x0109 },\n    { 0x040D, 0x045D },\n    { 0x050C, 0x050D },\n    { 0x2C25, 0x2C55 },\n    { 0xABA2, 0x13D2 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_010[] = {\n    { 0x0208, 0x0209 },\n    { 0x040E, 0x045E },\n    { 0x1E14, 0x1E15 },\n    { 0x212B, 0x00E5 },\n    { 0x2C26, 0x2C56 },\n    { 0xA7AD, 0x026C },\n    { 0xABA1, 0x13D1 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_011[] = {\n    { 0x010A, 0x010B },\n    { 0x040F, 0x045F },\n    { 0x050E, 0x050F },\n    { 0x212A, 0x006B },\n    { 0x2C27, 0x2C57 },\n    { 0xA7AC, 0x0261 },\n    { 0xABA0, 0x13D0 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_012[] = {\n    { 0x020E, 0x020F },\n    { 0x0408, 0x0458 },\n    { 0x1E12, 0x1E13 },\n    { 0x2C20, 0x2C50 },\n    { 0xA7AB, 0x025C },\n    { 0xABA7, 0x13D7 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_013[] = {\n    { 0x010C, 0x010D },\n    { 0x0409, 0x0459 },\n    { 0x0508, 0x0509 },\n    { 0x2C21, 0x2C51 },\n    { 0xA7AA, 0x0266 },\n    { 0xABA6, 0x13D6 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_014[] = {\n    { 0x020C, 0x020D },\n    { 0x040A, 0x045A },\n    { 0x1E10, 0x1E11 },\n    { 0x2C22, 0x2C52 },\n    { 0xABA5, 0x13D5 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_015[] = {\n    { 0x010E, 0x010F },\n    { 0x040B, 0x045B },\n    { 0x050A, 0x050B },\n    { 0x2C23, 0x2C53 },\n    { 0xA7A8, 0xA7A9 },\n    { 0xABA4, 0x13D4 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_016[] = {\n    { 0x0212, 0x0213 },\n    { 0x0414, 0x0434 },\n    { 0x1E0E, 0x1E0F },\n    { 0x1F0F, 0x1F07 },\n    { 0xABBB, 0x13EB }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_017[] = {\n    { 0x0110, 0x0111 },\n    { 0x0415, 0x0435 },\n    { 0x0514, 0x0515 },\n    { 0x1F0E, 0x1F06 },\n    { 0xA7B6, 0xA7B7 },\n    { 0xABBA, 0x13EA }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_018[] = {\n    { 0x0210, 0x0211 },\n    { 0x0416, 0x0436 },\n    { 0x1E0C, 0x1E0D },\n    { 0x1F0D, 0x1F05 },\n    { 0xABB9, 0x13E9 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_019[] = {\n    { 0x0112, 0x0113 },\n    { 0x0417, 0x0437 },\n    { 0x0516, 0x0517 },\n    { 0x1F0C, 0x1F04 },\n    { 0x2132, 0x214E },\n    { 0xA7B4, 0xA7B5 },\n    { 0xABB8, 0x13E8 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_020[] = {\n    { 0x0216, 0x0217 },\n    { 0x0410, 0x0430 },\n    { 0x1E0A, 0x1E0B },\n    { 0x1F0B, 0x1F03 },\n    { 0xA7B3, 0xAB53 },\n    { 0xABBF, 0x13EF }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_021[] = {\n    { 0x0114, 0x0115 },\n    { 0x0411, 0x0431 },\n    { 0x0510, 0x0511 },\n    { 0x1F0A, 0x1F02 },\n    { 0xA7B2, 0x029D },\n    { 0xABBE, 0x13EE }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_022[] = {\n    { 0x0214, 0x0215 },\n    { 0x0412, 0x0432 },\n    { 0x1E08, 0x1E09 },\n    { 0x1F09, 0x1F01 },\n    { 0xA7B1, 0x0287 },\n    { 0xABBD, 0x13ED }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_023[] = {\n    { 0x0116, 0x0117 },\n    { 0x0413, 0x0433 },\n    { 0x0512, 0x0513 },\n    { 0x1F08, 0x1F00 },\n    { 0xA7B0, 0x029E },\n    { 0xABBC, 0x13EC }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_024[] = {\n    { 0x021A, 0x021B },\n    { 0x041C, 0x043C },\n    { 0x1E06, 0x1E07 },\n    { 0xABB3, 0x13E3 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_025[] = {\n    { 0x0118, 0x0119 },\n    { 0x041D, 0x043D },\n    { 0x051C, 0x051D },\n    { 0xABB2, 0x13E2 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_026[] = {\n    { 0x0218, 0x0219 },\n    { 0x041E, 0x043E },\n    { 0x1E04, 0x1E05 },\n    { 0xABB1, 0x13E1 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_027[] = {\n    { 0x011A, 0x011B },\n    { 0x041F, 0x043F },\n    { 0x051E, 0x051F },\n    { 0xABB0, 0x13E0 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_028[] = {\n    { 0x021E, 0x021F },\n    { 0x0418, 0x0438 },\n    { 0x1E02, 0x1E03 },\n    { 0xABB7, 0x13E7 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_029[] = {\n    { 0x011C, 0x011D },\n    { 0x0419, 0x0439 },\n    { 0x0518, 0x0519 },\n    { 0xABB6, 0x13E6 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_030[] = {\n    { 0x021C, 0x021D },\n    { 0x041A, 0x043A },\n    { 0x1E00, 0x1E01 },\n    { 0xABB5, 0x13E5 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_031[] = {\n    { 0x011E, 0x011F },\n    { 0x041B, 0x043B },\n    { 0x051A, 0x051B },\n    { 0xABB4, 0x13E4 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_032[] = {\n    { 0x0222, 0x0223 },\n    { 0x0424, 0x0444 },\n    { 0x1E3E, 0x1E3F },\n    { 0x1F3F, 0x1F37 },\n    { 0x2C0C, 0x2C3C },\n    { 0xA686, 0xA687 },\n    { 0xAB8B, 0x13BB }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_033[] = {\n    { 0x0120, 0x0121 },\n    { 0x0425, 0x0445 },\n    { 0x0524, 0x0525 },\n    { 0x1F3E, 0x1F36 },\n    { 0x2C0D, 0x2C3D },\n    { 0xA786, 0xA787 },\n    { 0xAB8A, 0x13BA }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_034[] = {\n    { 0x0220, 0x019E },\n    { 0x0426, 0x0446 },\n    { 0x1E3C, 0x1E3D },\n    { 0x1F3D, 0x1F35 },\n    { 0x2C0E, 0x2C3E },\n    { 0xA684, 0xA685 },\n    { 0xAB89, 0x13B9 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_035[] = {\n    { 0x0122, 0x0123 },\n    { 0x0427, 0x0447 },\n    { 0x0526, 0x0527 },\n    { 0x1F3C, 0x1F34 },\n    { 0x2C0F, 0x2C3F },\n    { 0xA784, 0xA785 },\n    { 0xAB88, 0x13B8 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_036[] = {\n    { 0x0226, 0x0227 },\n    { 0x0420, 0x0440 },\n    { 0x1E3A, 0x1E3B },\n    { 0x1F3B, 0x1F33 },\n    { 0x2C08, 0x2C38 },\n    { 0xA682, 0xA683 },\n    { 0xAB8F, 0x13BF }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_037[] = {\n    { 0x0124, 0x0125 },\n    { 0x0421, 0x0441 },\n    { 0x0520, 0x0521 },\n    { 0x1F3A, 0x1F32 },\n    { 0x2C09, 0x2C39 },\n    { 0xA782, 0xA783 },\n    { 0xAB8E, 0x13BE }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_038[] = {\n    { 0x0224, 0x0225 },\n    { 0x0422, 0x0442 },\n    { 0x1E38, 0x1E39 },\n    { 0x1F39, 0x1F31 },\n    { 0x2C0A, 0x2C3A },\n    { 0xA680, 0xA681 },\n    { 0xAB8D, 0x13BD }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_039[] = {\n    { 0x0126, 0x0127 },\n    { 0x0423, 0x0443 },\n    { 0x0522, 0x0523 },\n    { 0x1F38, 0x1F30 },\n    { 0x2C0B, 0x2C3B },\n    { 0xA780, 0xA781 },\n    { 0xAB8C, 0x13BC }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_040[] = {\n    { 0x022A, 0x022B },\n    { 0x042C, 0x044C },\n    { 0x1E36, 0x1E37 },\n    { 0x2C04, 0x2C34 },\n    { 0xA68E, 0xA68F },\n    { 0xAB83, 0x13B3 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_041[] = {\n    { 0x0128, 0x0129 },\n    { 0x042D, 0x044D },\n    { 0x052C, 0x052D },\n    { 0x2C05, 0x2C35 },\n    { 0xAB82, 0x13B2 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_042[] = {\n    { 0x0228, 0x0229 },\n    { 0x042E, 0x044E },\n    { 0x1E34, 0x1E35 },\n    { 0x2C06, 0x2C36 },\n    { 0xA68C, 0xA68D },\n    { 0xA78D, 0x0265 },\n    { 0xAB81, 0x13B1 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_043[] = {\n    { 0x012A, 0x012B },\n    { 0x042F, 0x044F },\n    { 0x052E, 0x052F },\n    { 0x2C07, 0x2C37 },\n    { 0xAB80, 0x13B0 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_044[] = {\n    { 0x022E, 0x022F },\n    { 0x0428, 0x0448 },\n    { 0x1E32, 0x1E33 },\n    { 0x2C00, 0x2C30 },\n    { 0xA68A, 0xA68B },\n    { 0xA78B, 0xA78C },\n    { 0xAB87, 0x13B7 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_045[] = {\n    { 0x012C, 0x012D },\n    { 0x0429, 0x0449 },\n    { 0x0528, 0x0529 },\n    { 0x2C01, 0x2C31 },\n    { 0xAB86, 0x13B6 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_046[] = {\n    { 0x022C, 0x022D },\n    { 0x042A, 0x044A },\n    { 0x1E30, 0x1E31 },\n    { 0x2C02, 0x2C32 },\n    { 0xA688, 0xA689 },\n    { 0xAB85, 0x13B5 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_047[] = {\n    { 0x012E, 0x012F },\n    { 0x042B, 0x044B },\n    { 0x052A, 0x052B },\n    { 0x2C03, 0x2C33 },\n    { 0xAB84, 0x13B4 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_048[] = {\n    { 0x0232, 0x0233 },\n    { 0x0535, 0x0565 },\n    { 0x1E2E, 0x1E2F },\n    { 0x1F2F, 0x1F27 },\n    { 0x2C1C, 0x2C4C },\n    { 0xA696, 0xA697 },\n    { 0xAB9B, 0x13CB }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_049[] = {\n    { 0x0534, 0x0564 },\n    { 0x1F2E, 0x1F26 },\n    { 0x2C1D, 0x2C4D },\n    { 0xA796, 0xA797 },\n    { 0xAB9A, 0x13CA }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_050[] = {\n    { 0x0230, 0x0231 },\n    { 0x0537, 0x0567 },\n    { 0x1E2C, 0x1E2D },\n    { 0x1F2D, 0x1F25 },\n    { 0x2C1E, 0x2C4E },\n    { 0xA694, 0xA695 },\n    { 0xAB99, 0x13C9 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_051[] = {\n    { 0x0132, 0x0133 },\n    { 0x0536, 0x0566 },\n    { 0x1F2C, 0x1F24 },\n    { 0x2C1F, 0x2C4F },\n    { 0xAB98, 0x13C8 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_052[] = {\n    { 0x0531, 0x0561 },\n    { 0x1E2A, 0x1E2B },\n    { 0x1F2B, 0x1F23 },\n    { 0x2C18, 0x2C48 },\n    { 0xA692, 0xA693 },\n    { 0xAB9F, 0x13CF }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_053[] = {\n    { 0x0134, 0x0135 },\n    { 0x1F2A, 0x1F22 },\n    { 0x2C19, 0x2C49 },\n    { 0xA792, 0xA793 },\n    { 0xAB9E, 0x13CE }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_054[] = {\n    { 0x0533, 0x0563 },\n    { 0x1E28, 0x1E29 },\n    { 0x1F29, 0x1F21 },\n    { 0x2C1A, 0x2C4A },\n    { 0xA690, 0xA691 },\n    { 0xAB9D, 0x13CD }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_055[] = {\n    { 0x0136, 0x0137 },\n    { 0x0532, 0x0562 },\n    { 0x1F28, 0x1F20 },\n    { 0x2C1B, 0x2C4B },\n    { 0xA790, 0xA791 },\n    { 0xAB9C, 0x13CC }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_056[] = {\n    { 0x0139, 0x013A },\n    { 0x023A, 0x2C65 },\n    { 0x053D, 0x056D },\n    { 0x1E26, 0x1E27 },\n    { 0x2C14, 0x2C44 },\n    { 0xAB93, 0x13C3 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_057[] = {\n    { 0x023B, 0x023C },\n    { 0x053C, 0x056C },\n    { 0x2C15, 0x2C45 },\n    { 0xA79E, 0xA79F },\n    { 0xAB92, 0x13C2 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_058[] = {\n    { 0x013B, 0x013C },\n    { 0x053F, 0x056F },\n    { 0x1E24, 0x1E25 },\n    { 0x2C16, 0x2C46 },\n    { 0xAB91, 0x13C1 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_059[] = {\n    { 0x053E, 0x056E },\n    { 0x2C17, 0x2C47 },\n    { 0xA79C, 0xA79D },\n    { 0xAB90, 0x13C0 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_060[] = {\n    { 0x013D, 0x013E },\n    { 0x023E, 0x2C66 },\n    { 0x0539, 0x0569 },\n    { 0x1E22, 0x1E23 },\n    { 0x2C10, 0x2C40 },\n    { 0xA69A, 0xA69B },\n    { 0xAB97, 0x13C7 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_061[] = {\n    { 0x0538, 0x0568 },\n    { 0x2C11, 0x2C41 },\n    { 0xA79A, 0xA79B },\n    { 0xAB96, 0x13C6 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_062[] = {\n    { 0x013F, 0x0140 },\n    { 0x053B, 0x056B },\n    { 0x1E20, 0x1E21 },\n    { 0x2C12, 0x2C42 },\n    { 0xA698, 0xA699 },\n    { 0xAB95, 0x13C5 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_063[] = {\n    { 0x023D, 0x019A },\n    { 0x053A, 0x056A },\n    { 0x2C13, 0x2C43 },\n    { 0xA798, 0xA799 },\n    { 0xAB94, 0x13C4 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_064[] = {\n    { 0x0141, 0x0142 },\n    { 0x0545, 0x0575 },\n    { 0x1E5E, 0x1E5F },\n    { 0x1F5F, 0x1F57 },\n    { 0x2161, 0x2171 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_065[] = {\n    { 0x0041, 0x0061 },\n    { 0x0243, 0x0180 },\n    { 0x0544, 0x0574 },\n    { 0x2160, 0x2170 },\n    { 0x2C6D, 0x0251 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_066[] = {\n    { 0x0042, 0x0062 },\n    { 0x0143, 0x0144 },\n    { 0x0547, 0x0577 },\n    { 0x1E5C, 0x1E5D },\n    { 0x1F5D, 0x1F55 },\n    { 0x2163, 0x2173 },\n    { 0x2C6E, 0x0271 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_067[] = {\n    { 0x0043, 0x0063 },\n    { 0x0241, 0x0242 },\n    { 0x0546, 0x0576 },\n    { 0x2162, 0x2172 },\n    { 0x2C6F, 0x0250 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_068[] = {\n    { 0x0044, 0x0064 },\n    { 0x0145, 0x0146 },\n    { 0x0246, 0x0247 },\n    { 0x0541, 0x0571 },\n    { 0x1E5A, 0x1E5B },\n    { 0x1F5B, 0x1F53 },\n    { 0x2165, 0x2175 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_069[] = {\n    { 0x0045, 0x0065 },\n    { 0x0540, 0x0570 },\n    { 0x2164, 0x2174 },\n    { 0x2C69, 0x2C6A }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_070[] = {\n    { 0x0046, 0x0066 },\n    { 0x0147, 0x0148 },\n    { 0x0244, 0x0289 },\n    { 0x0345, 0x03B9 },\n    { 0x0543, 0x0573 },\n    { 0x1E58, 0x1E59 },\n    { 0x1F59, 0x1F51 },\n    { 0x2167, 0x2177 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_071[] = {\n    { 0x0047, 0x0067 },\n    { 0x0245, 0x028C },\n    { 0x0542, 0x0572 },\n    { 0x2166, 0x2176 },\n    { 0x2C6B, 0x2C6C }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_072[] = {\n    { 0x0048, 0x0068 },\n    { 0x024A, 0x024B },\n    { 0x054D, 0x057D },\n    { 0x1E56, 0x1E57 },\n    { 0x2169, 0x2179 },\n    { 0x2C64, 0x027D }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_073[] = {\n    { 0x0049, 0x0069 },\n    { 0x054C, 0x057C },\n    { 0x2168, 0x2178 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_074[] = {\n    { 0x004A, 0x006A },\n    { 0x0248, 0x0249 },\n    { 0x054F, 0x057F },\n    { 0x1E54, 0x1E55 },\n    { 0x216B, 0x217B }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_075[] = {\n    { 0x004B, 0x006B },\n    { 0x014A, 0x014B },\n    { 0x054E, 0x057E },\n    { 0x216A, 0x217A },\n    { 0x2C67, 0x2C68 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_076[] = {\n    { 0x004C, 0x006C },\n    { 0x024E, 0x024F },\n    { 0x0549, 0x0579 },\n    { 0x1E52, 0x1E53 },\n    { 0x216D, 0x217D },\n    { 0x2C60, 0x2C61 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_077[] = {\n    { 0x004D, 0x006D },\n    { 0x014C, 0x014D },\n    { 0x0548, 0x0578 },\n    { 0x216C, 0x217C }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_078[] = {\n    { 0x004E, 0x006E },\n    { 0x024C, 0x024D },\n    { 0x054B, 0x057B },\n    { 0x1E50, 0x1E51 },\n    { 0x216F, 0x217F },\n    { 0x2C62, 0x026B }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_079[] = {\n    { 0x004F, 0x006F },\n    { 0x014E, 0x014F },\n    { 0x054A, 0x057A },\n    { 0x216E, 0x217E },\n    { 0x2C63, 0x1D7D }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_080[] = {\n    { 0x0050, 0x0070 },\n    { 0x0555, 0x0585 },\n    { 0x1E4E, 0x1E4F }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_081[] = {\n    { 0x0051, 0x0071 },\n    { 0x0150, 0x0151 },\n    { 0x0554, 0x0584 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_082[] = {\n    { 0x0052, 0x0072 },\n    { 0x1E4C, 0x1E4D },\n    { 0x1F4D, 0x1F45 },\n    { 0x2C7E, 0x023F }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_083[] = {\n    { 0x0053, 0x0073 },\n    { 0x0152, 0x0153 },\n    { 0x0556, 0x0586 },\n    { 0x1F4C, 0x1F44 },\n    { 0x2C7F, 0x0240 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_084[] = {\n    { 0x0054, 0x0074 },\n    { 0x0551, 0x0581 },\n    { 0x1E4A, 0x1E4B },\n    { 0x1F4B, 0x1F43 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_085[] = {\n    { 0x0055, 0x0075 },\n    { 0x0154, 0x0155 },\n    { 0x0550, 0x0580 },\n    { 0x1F4A, 0x1F42 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_086[] = {\n    { 0x0056, 0x0076 },\n    { 0x0553, 0x0583 },\n    { 0x1E48, 0x1E49 },\n    { 0x1F49, 0x1F41 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_087[] = {\n    { 0x0057, 0x0077 },\n    { 0x0156, 0x0157 },\n    { 0x0552, 0x0582 },\n    { 0x1F48, 0x1F40 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_088[] = {\n    { 0x0058, 0x0078 },\n    { 0x1E46, 0x1E47 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_089[] = {\n    { 0x0059, 0x0079 },\n    { 0x0158, 0x0159 },\n    { 0x2C75, 0x2C76 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_090[] = {\n    { 0x005A, 0x007A },\n    { 0x1E44, 0x1E45 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_091[] = {\n    { 0x015A, 0x015B }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_092[] = {\n    { 0x1E42, 0x1E43 },\n    { 0x2C70, 0x0252 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_093[] = {\n    { 0x015C, 0x015D }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_094[] = {\n    { 0x1E40, 0x1E41 },\n    { 0x2C72, 0x2C73 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_095[] = {\n    { 0x015E, 0x015F }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_096[] = {\n    { 0x0464, 0x0465 },\n    { 0x1E7E, 0x1E7F }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_097[] = {\n    { 0x0160, 0x0161 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_098[] = {\n    { 0x0466, 0x0467 },\n    { 0x1E7C, 0x1E7D }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_099[] = {\n    { 0x0162, 0x0163 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_100[] = {\n    { 0x0460, 0x0461 },\n    { 0x1E7A, 0x1E7B }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_101[] = {\n    { 0x0164, 0x0165 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_102[] = {\n    { 0x0462, 0x0463 },\n    { 0x1E78, 0x1E79 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_103[] = {\n    { 0x0166, 0x0167 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_104[] = {\n    { 0x046C, 0x046D },\n    { 0x1E76, 0x1E77 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_105[] = {\n    { 0x0168, 0x0169 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_106[] = {\n    { 0x046E, 0x046F },\n    { 0x1E74, 0x1E75 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_107[] = {\n    { 0x016A, 0x016B }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_108[] = {\n    { 0x0468, 0x0469 },\n    { 0x1E72, 0x1E73 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_109[] = {\n    { 0x016C, 0x016D }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_110[] = {\n    { 0x046A, 0x046B },\n    { 0x1E70, 0x1E71 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_111[] = {\n    { 0x016E, 0x016F }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_112[] = {\n    { 0x0474, 0x0475 },\n    { 0x1E6E, 0x1E6F },\n    { 0x1F6F, 0x1F67 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_113[] = {\n    { 0x0170, 0x0171 },\n    { 0x0372, 0x0373 },\n    { 0x1F6E, 0x1F66 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_114[] = {\n    { 0x0476, 0x0477 },\n    { 0x1E6C, 0x1E6D },\n    { 0x1F6D, 0x1F65 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_115[] = {\n    { 0x0172, 0x0173 },\n    { 0x0370, 0x0371 },\n    { 0x1F6C, 0x1F64 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_116[] = {\n    { 0x0470, 0x0471 },\n    { 0x1E6A, 0x1E6B },\n    { 0x1F6B, 0x1F63 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_117[] = {\n    { 0x0174, 0x0175 },\n    { 0x0376, 0x0377 },\n    { 0x1F6A, 0x1F62 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_118[] = {\n    { 0x0472, 0x0473 },\n    { 0x1E68, 0x1E69 },\n    { 0x1F69, 0x1F61 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_119[] = {\n    { 0x0176, 0x0177 },\n    { 0x1F68, 0x1F60 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_120[] = {\n    { 0x0179, 0x017A },\n    { 0x047C, 0x047D },\n    { 0x1E66, 0x1E67 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_121[] = {\n    { 0x0178, 0x00FF }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_122[] = {\n    { 0x017B, 0x017C },\n    { 0x047E, 0x047F },\n    { 0x1E64, 0x1E65 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_124[] = {\n    { 0x017D, 0x017E },\n    { 0x037F, 0x03F3 },\n    { 0x0478, 0x0479 },\n    { 0x1E62, 0x1E63 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_126[] = {\n    { 0x017F, 0x0073 },\n    { 0x047A, 0x047B },\n    { 0x1E60, 0x1E61 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_128[] = {\n    { 0x0181, 0x0253 },\n    { 0x2CAC, 0x2CAD }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_129[] = {\n    { 0xA726, 0xA727 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_130[] = {\n    { 0x2CAE, 0x2CAF }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_131[] = {\n    { 0x0182, 0x0183 },\n    { 0xA724, 0xA725 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_132[] = {\n    { 0x0480, 0x0481 },\n    { 0x2CA8, 0x2CA9 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_133[] = {\n    { 0x0184, 0x0185 },\n    { 0x0386, 0x03AC },\n    { 0x1E9B, 0x1E61 },\n    { 0xA722, 0xA723 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_134[] = {\n    { 0x0187, 0x0188 },\n    { 0x2CAA, 0x2CAB }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_135[] = {\n    { 0x0186, 0x0254 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_136[] = {\n    { 0x0189, 0x0256 },\n    { 0x048C, 0x048D },\n    { 0x2CA4, 0x2CA5 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_137[] = {\n    { 0x038A, 0x03AF },\n    { 0xA72E, 0xA72F }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_138[] = {\n    { 0x018B, 0x018C },\n    { 0x0389, 0x03AE },\n    { 0x048E, 0x048F },\n    { 0x1E94, 0x1E95 },\n    { 0x2CA6, 0x2CA7 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_139[] = {\n    { 0x018A, 0x0257 },\n    { 0x0388, 0x03AD },\n    { 0xA72C, 0xA72D }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_140[] = {\n    { 0x038F, 0x03CE },\n    { 0x1E92, 0x1E93 },\n    { 0x2CA0, 0x2CA1 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_141[] = {\n    { 0x038E, 0x03CD },\n    { 0xA72A, 0xA72B }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_142[] = {\n    { 0x018F, 0x0259 },\n    { 0x048A, 0x048B },\n    { 0x1E90, 0x1E91 },\n    { 0x2CA2, 0x2CA3 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_143[] = {\n    { 0x018E, 0x01DD },\n    { 0x038C, 0x03CC },\n    { 0xA728, 0xA729 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_144[] = {\n    { 0x0191, 0x0192 },\n    { 0x0393, 0x03B3 },\n    { 0x0494, 0x0495 },\n    { 0x1E8E, 0x1E8F },\n    { 0x2CBC, 0x2CBD }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_145[] = {\n    { 0x0190, 0x025B },\n    { 0x0392, 0x03B2 },\n    { 0xA736, 0xA737 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_146[] = {\n    { 0x0193, 0x0260 },\n    { 0x0391, 0x03B1 },\n    { 0x0496, 0x0497 },\n    { 0x1E8C, 0x1E8D },\n    { 0x24B6, 0x24D0 },\n    { 0x2CBE, 0x2CBF }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_147[] = {\n    { 0x24B7, 0x24D1 },\n    { 0xA734, 0xA735 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_148[] = {\n    { 0x0397, 0x03B7 },\n    { 0x0490, 0x0491 },\n    { 0x1E8A, 0x1E8B },\n    { 0x2CB8, 0x2CB9 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_149[] = {\n    { 0x0194, 0x0263 },\n    { 0x0396, 0x03B6 },\n    { 0xA732, 0xA733 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_150[] = {\n    { 0x0197, 0x0268 },\n    { 0x0395, 0x03B5 },\n    { 0x0492, 0x0493 },\n    { 0x1E88, 0x1E89 },\n    { 0x2CBA, 0x2CBB }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_151[] = {\n    { 0x0196, 0x0269 },\n    { 0x0394, 0x03B4 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_152[] = {\n    { 0x039B, 0x03BB },\n    { 0x049C, 0x049D },\n    { 0x1E86, 0x1E87 },\n    { 0x24BC, 0x24D6 },\n    { 0x2CB4, 0x2CB5 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_153[] = {\n    { 0x0198, 0x0199 },\n    { 0x039A, 0x03BA },\n    { 0x24BD, 0x24D7 },\n    { 0xA73E, 0xA73F }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_154[] = {\n    { 0x0399, 0x03B9 },\n    { 0x049E, 0x049F },\n    { 0x1E84, 0x1E85 },\n    { 0x24BE, 0x24D8 },\n    { 0x2CB6, 0x2CB7 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_155[] = {\n    { 0x0398, 0x03B8 },\n    { 0x24BF, 0x24D9 },\n    { 0xA73C, 0xA73D }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_156[] = {\n    { 0x019D, 0x0272 },\n    { 0x039F, 0x03BF },\n    { 0x0498, 0x0499 },\n    { 0x1E82, 0x1E83 },\n    { 0x24B8, 0x24D2 },\n    { 0x2CB0, 0x2CB1 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_157[] = {\n    { 0x019C, 0x026F },\n    { 0x039E, 0x03BE },\n    { 0x24B9, 0x24D3 },\n    { 0xA73A, 0xA73B }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_158[] = {\n    { 0x019F, 0x0275 },\n    { 0x039D, 0x03BD },\n    { 0x049A, 0x049B },\n    { 0x1E80, 0x1E81 },\n    { 0x24BA, 0x24D4 },\n    { 0x2CB2, 0x2CB3 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_159[] = {\n    { 0x039C, 0x03BC },\n    { 0x24BB, 0x24D5 },\n    { 0xA738, 0xA739 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_160[] = {\n    { 0x03A3, 0x03C3 },\n    { 0x04A4, 0x04A5 },\n    { 0x10B0, 0x2D10 },\n    { 0x1EBE, 0x1EBF },\n    { 0x2C8C, 0x2C8D }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_161[] = {\n    { 0x01A0, 0x01A1 },\n    { 0x10B1, 0x2D11 },\n    { 0x1FBE, 0x03B9 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_162[] = {\n    { 0x03A1, 0x03C1 },\n    { 0x04A6, 0x04A7 },\n    { 0x10B2, 0x2D12 },\n    { 0x1EBC, 0x1EBD },\n    { 0x2183, 0x2184 },\n    { 0x2C8E, 0x2C8F }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_163[] = {\n    { 0x01A2, 0x01A3 },\n    { 0x03A0, 0x03C0 },\n    { 0x10B3, 0x2D13 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_164[] = {\n    { 0x03A7, 0x03C7 },\n    { 0x04A0, 0x04A1 },\n    { 0x10B4, 0x2D14 },\n    { 0x1EBA, 0x1EBB },\n    { 0x1FBB, 0x1F71 },\n    { 0x2C88, 0x2C89 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_165[] = {\n    { 0x01A4, 0x01A5 },\n    { 0x03A6, 0x03C6 },\n    { 0x10B5, 0x2D15 },\n    { 0x1FBA, 0x1F70 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_166[] = {\n    { 0x01A7, 0x01A8 },\n    { 0x03A5, 0x03C5 },\n    { 0x04A2, 0x04A3 },\n    { 0x10B6, 0x2D16 },\n    { 0x1EB8, 0x1EB9 },\n    { 0x1FB9, 0x1FB1 },\n    { 0x2C8A, 0x2C8B }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_167[] = {\n    { 0x01A6, 0x0280 },\n    { 0x03A4, 0x03C4 },\n    { 0x10B7, 0x2D17 },\n    { 0x1FB8, 0x1FB0 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_168[] = {\n    { 0x01A9, 0x0283 },\n    { 0x03AB, 0x03CB },\n    { 0x04AC, 0x04AD },\n    { 0x10B8, 0x2D18 },\n    { 0x1EB6, 0x1EB7 },\n    { 0x2C84, 0x2C85 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_169[] = {\n    { 0x03AA, 0x03CA },\n    { 0x10B9, 0x2D19 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_170[] = {\n    { 0x03A9, 0x03C9 },\n    { 0x04AE, 0x04AF },\n    { 0x10BA, 0x2D1A },\n    { 0x1EB4, 0x1EB5 },\n    { 0x2C86, 0x2C87 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_171[] = {\n    { 0x03A8, 0x03C8 },\n    { 0x10BB, 0x2D1B }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_172[] = {\n    { 0x04A8, 0x04A9 },\n    { 0x10BC, 0x2D1C },\n    { 0x1EB2, 0x1EB3 },\n    { 0x2C80, 0x2C81 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_173[] = {\n    { 0x01AC, 0x01AD },\n    { 0x10BD, 0x2D1D }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_174[] = {\n    { 0x01AF, 0x01B0 },\n    { 0x04AA, 0x04AB },\n    { 0x10BE, 0x2D1E },\n    { 0x1EB0, 0x1EB1 },\n    { 0x2C82, 0x2C83 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_175[] = {\n    { 0x01AE, 0x0288 },\n    { 0x10BF, 0x2D1F }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_176[] = {\n    { 0x01B1, 0x028A },\n    { 0x04B4, 0x04B5 },\n    { 0x10A0, 0x2D00 },\n    { 0x1EAE, 0x1EAF },\n    { 0x2C9C, 0x2C9D }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_177[] = {\n    { 0x10A1, 0x2D01 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_178[] = {\n    { 0x01B3, 0x01B4 },\n    { 0x04B6, 0x04B7 },\n    { 0x10A2, 0x2D02 },\n    { 0x1EAC, 0x1EAD },\n    { 0x2C9E, 0x2C9F }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_179[] = {\n    { 0x01B2, 0x028B },\n    { 0x10A3, 0x2D03 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_180[] = {\n    { 0x01B5, 0x01B6 },\n    { 0x04B0, 0x04B1 },\n    { 0x10A4, 0x2D04 },\n    { 0x1EAA, 0x1EAB },\n    { 0x2C98, 0x2C99 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_181[] = {\n    { 0x00B5, 0x03BC },\n    { 0x10A5, 0x2D05 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_182[] = {\n    { 0x01B7, 0x0292 },\n    { 0x04B2, 0x04B3 },\n    { 0x10A6, 0x2D06 },\n    { 0x1EA8, 0x1EA9 },\n    { 0x2C9A, 0x2C9B }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_183[] = {\n    { 0x10A7, 0x2D07 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_184[] = {\n    { 0x04BC, 0x04BD },\n    { 0x10A8, 0x2D08 },\n    { 0x1EA6, 0x1EA7 },\n    { 0x2C94, 0x2C95 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_185[] = {\n    { 0x01B8, 0x01B9 },\n    { 0x10A9, 0x2D09 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_186[] = {\n    { 0x04BE, 0x04BF },\n    { 0x10AA, 0x2D0A },\n    { 0x1EA4, 0x1EA5 },\n    { 0x2C96, 0x2C97 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_187[] = {\n    { 0x10AB, 0x2D0B }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_188[] = {\n    { 0x04B8, 0x04B9 },\n    { 0x10AC, 0x2D0C },\n    { 0x1EA2, 0x1EA3 },\n    { 0x2C90, 0x2C91 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_189[] = {\n    { 0x01BC, 0x01BD },\n    { 0x10AD, 0x2D0D }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_190[] = {\n    { 0x04BA, 0x04BB },\n    { 0x10AE, 0x2D0E },\n    { 0x1EA0, 0x1EA1 },\n    { 0x2C92, 0x2C93 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_191[] = {\n    { 0x10AF, 0x2D0F }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_192[] = {\n    { 0x00C0, 0x00E0 },\n    { 0x1EDE, 0x1EDF },\n    { 0xA666, 0xA667 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_193[] = {\n    { 0x00C1, 0x00E1 },\n    { 0x03C2, 0x03C3 },\n    { 0x04C5, 0x04C6 },\n    { 0x2CED, 0x2CEE },\n    { 0xA766, 0xA767 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_194[] = {\n    { 0x00C2, 0x00E2 },\n    { 0x1EDC, 0x1EDD },\n    { 0xA664, 0xA665 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_195[] = {\n    { 0x00C3, 0x00E3 },\n    { 0x04C7, 0x04C8 },\n    { 0xA764, 0xA765 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_196[] = {\n    { 0x00C4, 0x00E4 },\n    { 0x01C5, 0x01C6 },\n    { 0x04C0, 0x04CF },\n    { 0x1EDA, 0x1EDB },\n    { 0x1FDB, 0x1F77 },\n    { 0xA662, 0xA663 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_197[] = {\n    { 0x00C5, 0x00E5 },\n    { 0x01C4, 0x01C6 },\n    { 0x04C1, 0x04C2 },\n    { 0x1FDA, 0x1F76 },\n    { 0xA762, 0xA763 },\n    { 0xFF3A, 0xFF5A }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_198[] = {\n    { 0x00C6, 0x00E6 },\n    { 0x01C7, 0x01C9 },\n    { 0x1ED8, 0x1ED9 },\n    { 0x1FD9, 0x1FD1 },\n    { 0xA660, 0xA661 },\n    { 0xFF39, 0xFF59 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_199[] = {\n    { 0x00C7, 0x00E7 },\n    { 0x04C3, 0x04C4 },\n    { 0x1FD8, 0x1FD0 },\n    { 0x2CEB, 0x2CEC },\n    { 0xA760, 0xA761 },\n    { 0xFF38, 0xFF58 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_200[] = {\n    { 0x00C8, 0x00E8 },\n    { 0x1ED6, 0x1ED7 },\n    { 0xFF37, 0xFF57 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_201[] = {\n    { 0x00C9, 0x00E9 },\n    { 0x01C8, 0x01C9 },\n    { 0x04CD, 0x04CE },\n    { 0xA76E, 0xA76F },\n    { 0xFF36, 0xFF56 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_202[] = {\n    { 0x00CA, 0x00EA },\n    { 0x01CB, 0x01CC },\n    { 0x1ED4, 0x1ED5 },\n    { 0xA66C, 0xA66D },\n    { 0xFF35, 0xFF55 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_203[] = {\n    { 0x00CB, 0x00EB },\n    { 0x01CA, 0x01CC },\n    { 0xA76C, 0xA76D },\n    { 0xFF34, 0xFF54 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_204[] = {\n    { 0x00CC, 0x00EC },\n    { 0x01CD, 0x01CE },\n    { 0x03CF, 0x03D7 },\n    { 0x1ED2, 0x1ED3 },\n    { 0x2CE0, 0x2CE1 },\n    { 0xA66A, 0xA66B },\n    { 0xFF33, 0xFF53 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_205[] = {\n    { 0x00CD, 0x00ED },\n    { 0x04C9, 0x04CA },\n    { 0xA76A, 0xA76B },\n    { 0xFF32, 0xFF52 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_206[] = {\n    { 0x00CE, 0x00EE },\n    { 0x01CF, 0x01D0 },\n    { 0x1ED0, 0x1ED1 },\n    { 0x2CE2, 0x2CE3 },\n    { 0xA668, 0xA669 },\n    { 0xFF31, 0xFF51 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_207[] = {\n    { 0x00CF, 0x00EF },\n    { 0x04CB, 0x04CC },\n    { 0xA768, 0xA769 },\n    { 0xFF30, 0xFF50 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_208[] = {\n    { 0x00D0, 0x00F0 },\n    { 0x01D1, 0x01D2 },\n    { 0x04D4, 0x04D5 },\n    { 0x10C0, 0x2D20 },\n    { 0x1ECE, 0x1ECF },\n    { 0xAB7B, 0x13AB },\n    { 0xFF2F, 0xFF4F }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_209[] = {\n    { 0x00D1, 0x00F1 },\n    { 0x10C1, 0x2D21 },\n    { 0xAB7A, 0x13AA },\n    { 0xFF2E, 0xFF4E }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_210[] = {\n    { 0x00D2, 0x00F2 },\n    { 0x01D3, 0x01D4 },\n    { 0x03D1, 0x03B8 },\n    { 0x04D6, 0x04D7 },\n    { 0x10C2, 0x2D22 },\n    { 0x1ECC, 0x1ECD },\n    { 0xAB79, 0x13A9 },\n    { 0xFF2D, 0xFF4D }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_211[] = {\n    { 0x00D3, 0x00F3 },\n    { 0x03D0, 0x03B2 },\n    { 0x10C3, 0x2D23 },\n    { 0xAB78, 0x13A8 },\n    { 0xFF2C, 0xFF4C }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_212[] = {\n    { 0x00D4, 0x00F4 },\n    { 0x01D5, 0x01D6 },\n    { 0x04D0, 0x04D1 },\n    { 0x10C4, 0x2D24 },\n    { 0x1ECA, 0x1ECB },\n    { 0x1FCB, 0x1F75 },\n    { 0xAB7F, 0x13AF },\n    { 0xFF2B, 0xFF4B }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_213[] = {\n    { 0x00D5, 0x00F5 },\n    { 0x03D6, 0x03C0 },\n    { 0x10C5, 0x2D25 },\n    { 0x1FCA, 0x1F74 },\n    { 0xAB7E, 0x13AE },\n    { 0xFF2A, 0xFF4A }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_214[] = {\n    { 0x00D6, 0x00F6 },\n    { 0x01D7, 0x01D8 },\n    { 0x03D5, 0x03C6 },\n    { 0x04D2, 0x04D3 },\n    { 0x1EC8, 0x1EC9 },\n    { 0x1FC9, 0x1F73 },\n    { 0xAB7D, 0x13AD },\n    { 0xFF29, 0xFF49 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_215[] = {\n    { 0x10C7, 0x2D27 },\n    { 0x1FC8, 0x1F72 },\n    { 0xAB7C, 0x13AC },\n    { 0xFF28, 0xFF48 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_216[] = {\n    { 0x00D8, 0x00F8 },\n    { 0x01D9, 0x01DA },\n    { 0x04DC, 0x04DD },\n    { 0x1EC6, 0x1EC7 },\n    { 0xAB73, 0x13A3 },\n    { 0xFF27, 0xFF47 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_217[] = {\n    { 0x00D9, 0x00F9 },\n    { 0x03DA, 0x03DB },\n    { 0xA77E, 0xA77F },\n    { 0xAB72, 0x13A2 },\n    { 0xFF26, 0xFF46 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_218[] = {\n    { 0x00DA, 0x00FA },\n    { 0x01DB, 0x01DC },\n    { 0x04DE, 0x04DF },\n    { 0x1EC4, 0x1EC5 },\n    { 0xA77D, 0x1D79 },\n    { 0xAB71, 0x13A1 },\n    { 0xFF25, 0xFF45 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_219[] = {\n    { 0x00DB, 0x00FB },\n    { 0x03D8, 0x03D9 },\n    { 0xAB70, 0x13A0 },\n    { 0xFF24, 0xFF44 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_220[] = {\n    { 0x00DC, 0x00FC },\n    { 0x04D8, 0x04D9 },\n    { 0x1EC2, 0x1EC3 },\n    { 0xA77B, 0xA77C },\n    { 0xAB77, 0x13A7 },\n    { 0xFF23, 0xFF43 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_221[] = {\n    { 0x00DD, 0x00FD },\n    { 0x03DE, 0x03DF },\n    { 0x10CD, 0x2D2D },\n    { 0xAB76, 0x13A6 },\n    { 0xFF22, 0xFF42 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_222[] = {\n    { 0x00DE, 0x00FE },\n    { 0x04DA, 0x04DB },\n    { 0x1EC0, 0x1EC1 },\n    { 0x2CF2, 0x2CF3 },\n    { 0xA779, 0xA77A },\n    { 0xAB75, 0x13A5 },\n    { 0xFF21, 0xFF41 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_223[] = {\n    { 0x01DE, 0x01DF },\n    { 0x03DC, 0x03DD },\n    { 0xAB74, 0x13A4 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_224[] = {\n    { 0x04E4, 0x04E5 },\n    { 0x1EFE, 0x1EFF },\n    { 0x24C4, 0x24DE },\n    { 0x2CCC, 0x2CCD },\n    { 0xA646, 0xA647 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_225[] = {\n    { 0x01E0, 0x01E1 },\n    { 0x03E2, 0x03E3 },\n    { 0x24C5, 0x24DF },\n    { 0xA746, 0xA747 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_226[] = {\n    { 0x04E6, 0x04E7 },\n    { 0x1EFC, 0x1EFD },\n    { 0x24C6, 0x24E0 },\n    { 0x2CCE, 0x2CCF },\n    { 0xA644, 0xA645 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_227[] = {\n    { 0x01E2, 0x01E3 },\n    { 0x03E0, 0x03E1 },\n    { 0x24C7, 0x24E1 },\n    { 0xA744, 0xA745 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_228[] = {\n    { 0x04E0, 0x04E1 },\n    { 0x1EFA, 0x1EFB },\n    { 0x1FFB, 0x1F7D },\n    { 0x24C0, 0x24DA },\n    { 0x2CC8, 0x2CC9 },\n    { 0xA642, 0xA643 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_229[] = {\n    { 0x01E4, 0x01E5 },\n    { 0x03E6, 0x03E7 },\n    { 0x1FFA, 0x1F7C },\n    { 0x24C1, 0x24DB },\n    { 0xA742, 0xA743 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_230[] = {\n    { 0x04E2, 0x04E3 },\n    { 0x1EF8, 0x1EF9 },\n    { 0x1FF9, 0x1F79 },\n    { 0x24C2, 0x24DC },\n    { 0x2CCA, 0x2CCB },\n    { 0xA640, 0xA641 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_231[] = {\n    { 0x01E6, 0x01E7 },\n    { 0x03E4, 0x03E5 },\n    { 0x1FF8, 0x1F78 },\n    { 0x24C3, 0x24DD },\n    { 0xA740, 0xA741 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_232[] = {\n    { 0x04EC, 0x04ED },\n    { 0x13FB, 0x13F3 },\n    { 0x1EF6, 0x1EF7 },\n    { 0x24CC, 0x24E6 },\n    { 0x2CC4, 0x2CC5 },\n    { 0xA64E, 0xA64F }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_233[] = {\n    { 0x01E8, 0x01E9 },\n    { 0x03EA, 0x03EB },\n    { 0x13FA, 0x13F2 },\n    { 0x24CD, 0x24E7 },\n    { 0xA74E, 0xA74F }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_234[] = {\n    { 0x04EE, 0x04EF },\n    { 0x13F9, 0x13F1 },\n    { 0x1EF4, 0x1EF5 },\n    { 0x24CE, 0x24E8 },\n    { 0x2CC6, 0x2CC7 },\n    { 0xA64C, 0xA64D }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_235[] = {\n    { 0x01EA, 0x01EB },\n    { 0x03E8, 0x03E9 },\n    { 0x13F8, 0x13F0 },\n    { 0x24CF, 0x24E9 },\n    { 0xA74C, 0xA74D }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_236[] = {\n    { 0x04E8, 0x04E9 },\n    { 0x1EF2, 0x1EF3 },\n    { 0x24C8, 0x24E2 },\n    { 0x2CC0, 0x2CC1 },\n    { 0xA64A, 0xA64B }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_237[] = {\n    { 0x01EC, 0x01ED },\n    { 0x03EE, 0x03EF },\n    { 0x24C9, 0x24E3 },\n    { 0xA74A, 0xA74B }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_238[] = {\n    { 0x04EA, 0x04EB },\n    { 0x13FD, 0x13F5 },\n    { 0x1EF0, 0x1EF1 },\n    { 0x24CA, 0x24E4 },\n    { 0x2CC2, 0x2CC3 },\n    { 0xA648, 0xA649 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_239[] = {\n    { 0x01EE, 0x01EF },\n    { 0x03EC, 0x03ED },\n    { 0x13FC, 0x13F4 },\n    { 0x24CB, 0x24E5 },\n    { 0xA748, 0xA749 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_240[] = {\n    { 0x01F1, 0x01F3 },\n    { 0x04F4, 0x04F5 },\n    { 0x1EEE, 0x1EEF },\n    { 0x2CDC, 0x2CDD },\n    { 0xA656, 0xA657 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_241[] = {\n    { 0xA756, 0xA757 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_242[] = {\n    { 0x03F1, 0x03C1 },\n    { 0x04F6, 0x04F7 },\n    { 0x1EEC, 0x1EED },\n    { 0x2CDE, 0x2CDF },\n    { 0xA654, 0xA655 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_243[] = {\n    { 0x01F2, 0x01F3 },\n    { 0x03F0, 0x03BA },\n    { 0x1FEC, 0x1FE5 },\n    { 0xA754, 0xA755 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_244[] = {\n    { 0x03F7, 0x03F8 },\n    { 0x04F0, 0x04F1 },\n    { 0x1EEA, 0x1EEB },\n    { 0x1FEB, 0x1F7B },\n    { 0x2CD8, 0x2CD9 },\n    { 0xA652, 0xA653 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_245[] = {\n    { 0x01F4, 0x01F5 },\n    { 0x1FEA, 0x1F7A },\n    { 0xA752, 0xA753 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_246[] = {\n    { 0x01F7, 0x01BF },\n    { 0x03F5, 0x03B5 },\n    { 0x04F2, 0x04F3 },\n    { 0x1EE8, 0x1EE9 },\n    { 0x1FE9, 0x1FE1 },\n    { 0x2CDA, 0x2CDB },\n    { 0xA650, 0xA651 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_247[] = {\n    { 0x01F6, 0x0195 },\n    { 0x03F4, 0x03B8 },\n    { 0x1FE8, 0x1FE0 },\n    { 0xA750, 0xA751 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_248[] = {\n    { 0x04FC, 0x04FD },\n    { 0x1EE6, 0x1EE7 },\n    { 0x2CD4, 0x2CD5 },\n    { 0xA65E, 0xA65F }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_249[] = {\n    { 0x01F8, 0x01F9 },\n    { 0x03FA, 0x03FB },\n    { 0xA75E, 0xA75F }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_250[] = {\n    { 0x03F9, 0x03F2 },\n    { 0x04FE, 0x04FF },\n    { 0x1EE4, 0x1EE5 },\n    { 0x2CD6, 0x2CD7 },\n    { 0xA65C, 0xA65D }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_251[] = {\n    { 0x01FA, 0x01FB },\n    { 0xA75C, 0xA75D }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_252[] = {\n    { 0x03FF, 0x037D },\n    { 0x04F8, 0x04F9 },\n    { 0x1EE2, 0x1EE3 },\n    { 0x2CD0, 0x2CD1 },\n    { 0xA65A, 0xA65B }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_253[] = {\n    { 0x01FC, 0x01FD },\n    { 0x03FE, 0x037C },\n    { 0xA75A, 0xA75B }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_254[] = {\n    { 0x03FD, 0x037B },\n    { 0x04FA, 0x04FB },\n    { 0x1EE0, 0x1EE1 },\n    { 0x2CD2, 0x2CD3 },\n    { 0xA658, 0xA659 }\n};\n\nstatic const CaseFoldMapping1_16 case_fold1_16_255[] = {\n    { 0x01FE, 0x01FF },\n    { 0xA758, 0xA759 }\n};\n\nstatic const CaseFoldMapping1_32 case_fold1_32_000[] = {\n    { 0x10404, 0x1042C },\n    { 0x10414, 0x1043C },\n    { 0x10424, 0x1044C },\n    { 0x10C8C, 0x10CCC },\n    { 0x10C9C, 0x10CDC },\n    { 0x10CAC, 0x10CEC },\n    { 0x118A8, 0x118C8 },\n    { 0x118B8, 0x118D8 }\n};\n\nstatic const CaseFoldMapping1_32 case_fold1_32_001[] = {\n    { 0x10405, 0x1042D },\n    { 0x10415, 0x1043D },\n    { 0x10425, 0x1044D },\n    { 0x10C8D, 0x10CCD },\n    { 0x10C9D, 0x10CDD },\n    { 0x10CAD, 0x10CED },\n    { 0x118A9, 0x118C9 },\n    { 0x118B9, 0x118D9 }\n};\n\nstatic const CaseFoldMapping1_32 case_fold1_32_002[] = {\n    { 0x10406, 0x1042E },\n    { 0x10416, 0x1043E },\n    { 0x10426, 0x1044E },\n    { 0x10C8E, 0x10CCE },\n    { 0x10C9E, 0x10CDE },\n    { 0x10CAE, 0x10CEE },\n    { 0x118AA, 0x118CA },\n    { 0x118BA, 0x118DA }\n};\n\nstatic const CaseFoldMapping1_32 case_fold1_32_003[] = {\n    { 0x10407, 0x1042F },\n    { 0x10417, 0x1043F },\n    { 0x10427, 0x1044F },\n    { 0x10C8F, 0x10CCF },\n    { 0x10C9F, 0x10CDF },\n    { 0x10CAF, 0x10CEF },\n    { 0x118AB, 0x118CB },\n    { 0x118BB, 0x118DB }\n};\n\nstatic const CaseFoldMapping1_32 case_fold1_32_004[] = {\n    { 0x10400, 0x10428 },\n    { 0x10410, 0x10438 },\n    { 0x10420, 0x10448 },\n    { 0x10C88, 0x10CC8 },\n    { 0x10C98, 0x10CD8 },\n    { 0x10CA8, 0x10CE8 },\n    { 0x118AC, 0x118CC },\n    { 0x118BC, 0x118DC }\n};\n\nstatic const CaseFoldMapping1_32 case_fold1_32_005[] = {\n    { 0x10401, 0x10429 },\n    { 0x10411, 0x10439 },\n    { 0x10421, 0x10449 },\n    { 0x10C89, 0x10CC9 },\n    { 0x10C99, 0x10CD9 },\n    { 0x10CA9, 0x10CE9 },\n    { 0x118AD, 0x118CD },\n    { 0x118BD, 0x118DD }\n};\n\nstatic const CaseFoldMapping1_32 case_fold1_32_006[] = {\n    { 0x10402, 0x1042A },\n    { 0x10412, 0x1043A },\n    { 0x10422, 0x1044A },\n    { 0x10C8A, 0x10CCA },\n    { 0x10C9A, 0x10CDA },\n    { 0x10CAA, 0x10CEA },\n    { 0x118AE, 0x118CE },\n    { 0x118BE, 0x118DE }\n};\n\nstatic const CaseFoldMapping1_32 case_fold1_32_007[] = {\n    { 0x10403, 0x1042B },\n    { 0x10413, 0x1043B },\n    { 0x10423, 0x1044B },\n    { 0x10C8B, 0x10CCB },\n    { 0x10C9B, 0x10CDB },\n    { 0x10CAB, 0x10CEB },\n    { 0x118AF, 0x118CF },\n    { 0x118BF, 0x118DF }\n};\n\nstatic const CaseFoldMapping1_32 case_fold1_32_008[] = {\n    { 0x1040C, 0x10434 },\n    { 0x1041C, 0x10444 },\n    { 0x10C84, 0x10CC4 },\n    { 0x10C94, 0x10CD4 },\n    { 0x10CA4, 0x10CE4 },\n    { 0x118A0, 0x118C0 },\n    { 0x118B0, 0x118D0 }\n};\n\nstatic const CaseFoldMapping1_32 case_fold1_32_009[] = {\n    { 0x1040D, 0x10435 },\n    { 0x1041D, 0x10445 },\n    { 0x10C85, 0x10CC5 },\n    { 0x10C95, 0x10CD5 },\n    { 0x10CA5, 0x10CE5 },\n    { 0x118A1, 0x118C1 },\n    { 0x118B1, 0x118D1 }\n};\n\nstatic const CaseFoldMapping1_32 case_fold1_32_010[] = {\n    { 0x1040E, 0x10436 },\n    { 0x1041E, 0x10446 },\n    { 0x10C86, 0x10CC6 },\n    { 0x10C96, 0x10CD6 },\n    { 0x10CA6, 0x10CE6 },\n    { 0x118A2, 0x118C2 },\n    { 0x118B2, 0x118D2 }\n};\n\nstatic const CaseFoldMapping1_32 case_fold1_32_011[] = {\n    { 0x1040F, 0x10437 },\n    { 0x1041F, 0x10447 },\n    { 0x10C87, 0x10CC7 },\n    { 0x10C97, 0x10CD7 },\n    { 0x10CA7, 0x10CE7 },\n    { 0x118A3, 0x118C3 },\n    { 0x118B3, 0x118D3 }\n};\n\nstatic const CaseFoldMapping1_32 case_fold1_32_012[] = {\n    { 0x10408, 0x10430 },\n    { 0x10418, 0x10440 },\n    { 0x10C80, 0x10CC0 },\n    { 0x10C90, 0x10CD0 },\n    { 0x10CA0, 0x10CE0 },\n    { 0x10CB0, 0x10CF0 },\n    { 0x118A4, 0x118C4 },\n    { 0x118B4, 0x118D4 }\n};\n\nstatic const CaseFoldMapping1_32 case_fold1_32_013[] = {\n    { 0x10409, 0x10431 },\n    { 0x10419, 0x10441 },\n    { 0x10C81, 0x10CC1 },\n    { 0x10C91, 0x10CD1 },\n    { 0x10CA1, 0x10CE1 },\n    { 0x10CB1, 0x10CF1 },\n    { 0x118A5, 0x118C5 },\n    { 0x118B5, 0x118D5 }\n};\n\nstatic const CaseFoldMapping1_32 case_fold1_32_014[] = {\n    { 0x1040A, 0x10432 },\n    { 0x1041A, 0x10442 },\n    { 0x10C82, 0x10CC2 },\n    { 0x10C92, 0x10CD2 },\n    { 0x10CA2, 0x10CE2 },\n    { 0x10CB2, 0x10CF2 },\n    { 0x118A6, 0x118C6 },\n    { 0x118B6, 0x118D6 }\n};\n\nstatic const CaseFoldMapping1_32 case_fold1_32_015[] = {\n    { 0x1040B, 0x10433 },\n    { 0x1041B, 0x10443 },\n    { 0x10C83, 0x10CC3 },\n    { 0x10C93, 0x10CD3 },\n    { 0x10CA3, 0x10CE3 },\n    { 0x118A7, 0x118C7 },\n    { 0x118B7, 0x118D7 }\n};\n\nstatic const CaseFoldMapping2_16 case_fold2_16_000[] = {\n    { 0x1E9E, 0x0073, 0x0073 },\n    { 0x1F8F, 0x1F07, 0x03B9 },\n    { 0x1F9F, 0x1F27, 0x03B9 },\n    { 0x1FAF, 0x1F67, 0x03B9 }\n};\n\nstatic const CaseFoldMapping2_16 case_fold2_16_001[] = {\n    { 0x0130, 0x0069, 0x0307 },\n    { 0x01F0, 0x006A, 0x030C },\n    { 0x1F8E, 0x1F06, 0x03B9 },\n    { 0x1F9E, 0x1F26, 0x03B9 },\n    { 0x1FAE, 0x1F66, 0x03B9 }\n};\n\nstatic const CaseFoldMapping2_16 case_fold2_16_002[] = {\n    { 0x0587, 0x0565, 0x0582 },\n    { 0x1F8D, 0x1F05, 0x03B9 },\n    { 0x1F9D, 0x1F25, 0x03B9 },\n    { 0x1FAD, 0x1F65, 0x03B9 }\n};\n\nstatic const CaseFoldMapping2_16 case_fold2_16_003[] = {\n    { 0x1F8C, 0x1F04, 0x03B9 },\n    { 0x1F9C, 0x1F24, 0x03B9 },\n    { 0x1FAC, 0x1F64, 0x03B9 },\n    { 0x1FBC, 0x03B1, 0x03B9 },\n    { 0x1FCC, 0x03B7, 0x03B9 },\n    { 0x1FFC, 0x03C9, 0x03B9 }\n};\n\nstatic const CaseFoldMapping2_16 case_fold2_16_004[] = {\n    { 0x1E9A, 0x0061, 0x02BE },\n    { 0x1F8B, 0x1F03, 0x03B9 },\n    { 0x1F9B, 0x1F23, 0x03B9 },\n    { 0x1FAB, 0x1F63, 0x03B9 }\n};\n\nstatic const CaseFoldMapping2_16 case_fold2_16_005[] = {\n    { 0x1F8A, 0x1F02, 0x03B9 },\n    { 0x1F9A, 0x1F22, 0x03B9 },\n    { 0x1FAA, 0x1F62, 0x03B9 }\n};\n\nstatic const CaseFoldMapping2_16 case_fold2_16_006[] = {\n    { 0x1E98, 0x0077, 0x030A },\n    { 0x1F89, 0x1F01, 0x03B9 },\n    { 0x1F99, 0x1F21, 0x03B9 },\n    { 0x1FA9, 0x1F61, 0x03B9 }\n};\n\nstatic const CaseFoldMapping2_16 case_fold2_16_007[] = {\n    { 0x1E99, 0x0079, 0x030A },\n    { 0x1F88, 0x1F00, 0x03B9 },\n    { 0x1F98, 0x1F20, 0x03B9 },\n    { 0x1FA8, 0x1F60, 0x03B9 }\n};\n\nstatic const CaseFoldMapping2_16 case_fold2_16_008[] = {\n    { 0x0149, 0x02BC, 0x006E },\n    { 0x1E96, 0x0068, 0x0331 },\n    { 0x1F87, 0x1F07, 0x03B9 },\n    { 0x1F97, 0x1F27, 0x03B9 },\n    { 0x1FA7, 0x1F67, 0x03B9 },\n    { 0xFB13, 0x0574, 0x0576 }\n};\n\nstatic const CaseFoldMapping2_16 case_fold2_16_009[] = {\n    { 0x1E97, 0x0074, 0x0308 },\n    { 0x1F86, 0x1F06, 0x03B9 },\n    { 0x1F96, 0x1F26, 0x03B9 },\n    { 0x1FA6, 0x1F66, 0x03B9 },\n    { 0x1FB6, 0x03B1, 0x0342 },\n    { 0x1FC6, 0x03B7, 0x0342 },\n    { 0x1FD6, 0x03B9, 0x0342 },\n    { 0x1FE6, 0x03C5, 0x0342 },\n    { 0x1FF6, 0x03C9, 0x0342 },\n    { 0xFB02, 0x0066, 0x006C }\n};\n\nstatic const CaseFoldMapping2_16 case_fold2_16_010[] = {\n    { 0x1F85, 0x1F05, 0x03B9 },\n    { 0x1F95, 0x1F25, 0x03B9 },\n    { 0x1FA5, 0x1F65, 0x03B9 },\n    { 0xFB01, 0x0066, 0x0069 }\n};\n\nstatic const CaseFoldMapping2_16 case_fold2_16_011[] = {\n    { 0x1F84, 0x1F04, 0x03B9 },\n    { 0x1F94, 0x1F24, 0x03B9 },\n    { 0x1FA4, 0x1F64, 0x03B9 },\n    { 0x1FB4, 0x03AC, 0x03B9 },\n    { 0x1FC4, 0x03AE, 0x03B9 },\n    { 0x1FE4, 0x03C1, 0x0313 },\n    { 0x1FF4, 0x03CE, 0x03B9 },\n    { 0xFB00, 0x0066, 0x0066 }\n};\n\nstatic const CaseFoldMapping2_16 case_fold2_16_012[] = {\n    { 0x1F83, 0x1F03, 0x03B9 },\n    { 0x1F93, 0x1F23, 0x03B9 },\n    { 0x1FA3, 0x1F63, 0x03B9 },\n    { 0x1FB3, 0x03B1, 0x03B9 },\n    { 0x1FC3, 0x03B7, 0x03B9 },\n    { 0x1FF3, 0x03C9, 0x03B9 },\n    { 0xFB17, 0x0574, 0x056D }\n};\n\nstatic const CaseFoldMapping2_16 case_fold2_16_013[] = {\n    { 0x1F82, 0x1F02, 0x03B9 },\n    { 0x1F92, 0x1F22, 0x03B9 },\n    { 0x1FA2, 0x1F62, 0x03B9 },\n    { 0x1FB2, 0x1F70, 0x03B9 },\n    { 0x1FC2, 0x1F74, 0x03B9 },\n    { 0x1FF2, 0x1F7C, 0x03B9 },\n    { 0xFB06, 0x0073, 0x0074 },\n    { 0xFB16, 0x057E, 0x0576 }\n};\n\nstatic const CaseFoldMapping2_16 case_fold2_16_014[] = {\n    { 0x1F81, 0x1F01, 0x03B9 },\n    { 0x1F91, 0x1F21, 0x03B9 },\n    { 0x1FA1, 0x1F61, 0x03B9 },\n    { 0xFB05, 0x0073, 0x0074 },\n    { 0xFB15, 0x0574, 0x056B }\n};\n\nstatic const CaseFoldMapping2_16 case_fold2_16_015[] = {\n    { 0x00DF, 0x0073, 0x0073 },\n    { 0x1F50, 0x03C5, 0x0313 },\n    { 0x1F80, 0x1F00, 0x03B9 },\n    { 0x1F90, 0x1F20, 0x03B9 },\n    { 0x1FA0, 0x1F60, 0x03B9 },\n    { 0xFB14, 0x0574, 0x0565 }\n};\n\nstatic const CaseFoldMapping3_16 case_fold3_16_000[] = {\n    { 0x1FB7, 0x03B1, 0x0342, 0x03B9 },\n    { 0x1FC7, 0x03B7, 0x0342, 0x03B9 },\n    { 0x1FD3, 0x03B9, 0x0308, 0x0301 },\n    { 0x1FD7, 0x03B9, 0x0308, 0x0342 },\n    { 0x1FE3, 0x03C5, 0x0308, 0x0301 },\n    { 0x1FE7, 0x03C5, 0x0308, 0x0342 },\n    { 0x1FF7, 0x03C9, 0x0342, 0x03B9 },\n    { 0xFB03, 0x0066, 0x0066, 0x0069 }\n};\n\nstatic const CaseFoldMapping3_16 case_fold3_16_001[] = {\n    { 0x1F52, 0x03C5, 0x0313, 0x0300 },\n    { 0x1F56, 0x03C5, 0x0313, 0x0342 },\n    { 0x1FD2, 0x03B9, 0x0308, 0x0300 },\n    { 0x1FE2, 0x03C5, 0x0308, 0x0300 }\n};\n\nstatic const CaseFoldMapping3_16 case_fold3_16_003[] = {\n    { 0x0390, 0x03B9, 0x0308, 0x0301 },\n    { 0x03B0, 0x03C5, 0x0308, 0x0301 },\n    { 0x1F54, 0x03C5, 0x0313, 0x0301 },\n    { 0xFB04, 0x0066, 0x0066, 0x006C }\n};\n\nstatic const CaseFoldHashBucket1_16 case_fold_hash1_16[] = {\n    { case_fold1_16_000, __PHYSFS_ARRAYLEN(case_fold1_16_000) },\n    { case_fold1_16_001, __PHYSFS_ARRAYLEN(case_fold1_16_001) },\n    { case_fold1_16_002, __PHYSFS_ARRAYLEN(case_fold1_16_002) },\n    { case_fold1_16_003, __PHYSFS_ARRAYLEN(case_fold1_16_003) },\n    { case_fold1_16_004, __PHYSFS_ARRAYLEN(case_fold1_16_004) },\n    { case_fold1_16_005, __PHYSFS_ARRAYLEN(case_fold1_16_005) },\n    { case_fold1_16_006, __PHYSFS_ARRAYLEN(case_fold1_16_006) },\n    { case_fold1_16_007, __PHYSFS_ARRAYLEN(case_fold1_16_007) },\n    { case_fold1_16_008, __PHYSFS_ARRAYLEN(case_fold1_16_008) },\n    { case_fold1_16_009, __PHYSFS_ARRAYLEN(case_fold1_16_009) },\n    { case_fold1_16_010, __PHYSFS_ARRAYLEN(case_fold1_16_010) },\n    { case_fold1_16_011, __PHYSFS_ARRAYLEN(case_fold1_16_011) },\n    { case_fold1_16_012, __PHYSFS_ARRAYLEN(case_fold1_16_012) },\n    { case_fold1_16_013, __PHYSFS_ARRAYLEN(case_fold1_16_013) },\n    { case_fold1_16_014, __PHYSFS_ARRAYLEN(case_fold1_16_014) },\n    { case_fold1_16_015, __PHYSFS_ARRAYLEN(case_fold1_16_015) },\n    { case_fold1_16_016, __PHYSFS_ARRAYLEN(case_fold1_16_016) },\n    { case_fold1_16_017, __PHYSFS_ARRAYLEN(case_fold1_16_017) },\n    { case_fold1_16_018, __PHYSFS_ARRAYLEN(case_fold1_16_018) },\n    { case_fold1_16_019, __PHYSFS_ARRAYLEN(case_fold1_16_019) },\n    { case_fold1_16_020, __PHYSFS_ARRAYLEN(case_fold1_16_020) },\n    { case_fold1_16_021, __PHYSFS_ARRAYLEN(case_fold1_16_021) },\n    { case_fold1_16_022, __PHYSFS_ARRAYLEN(case_fold1_16_022) },\n    { case_fold1_16_023, __PHYSFS_ARRAYLEN(case_fold1_16_023) },\n    { case_fold1_16_024, __PHYSFS_ARRAYLEN(case_fold1_16_024) },\n    { case_fold1_16_025, __PHYSFS_ARRAYLEN(case_fold1_16_025) },\n    { case_fold1_16_026, __PHYSFS_ARRAYLEN(case_fold1_16_026) },\n    { case_fold1_16_027, __PHYSFS_ARRAYLEN(case_fold1_16_027) },\n    { case_fold1_16_028, __PHYSFS_ARRAYLEN(case_fold1_16_028) },\n    { case_fold1_16_029, __PHYSFS_ARRAYLEN(case_fold1_16_029) },\n    { case_fold1_16_030, __PHYSFS_ARRAYLEN(case_fold1_16_030) },\n    { case_fold1_16_031, __PHYSFS_ARRAYLEN(case_fold1_16_031) },\n    { case_fold1_16_032, __PHYSFS_ARRAYLEN(case_fold1_16_032) },\n    { case_fold1_16_033, __PHYSFS_ARRAYLEN(case_fold1_16_033) },\n    { case_fold1_16_034, __PHYSFS_ARRAYLEN(case_fold1_16_034) },\n    { case_fold1_16_035, __PHYSFS_ARRAYLEN(case_fold1_16_035) },\n    { case_fold1_16_036, __PHYSFS_ARRAYLEN(case_fold1_16_036) },\n    { case_fold1_16_037, __PHYSFS_ARRAYLEN(case_fold1_16_037) },\n    { case_fold1_16_038, __PHYSFS_ARRAYLEN(case_fold1_16_038) },\n    { case_fold1_16_039, __PHYSFS_ARRAYLEN(case_fold1_16_039) },\n    { case_fold1_16_040, __PHYSFS_ARRAYLEN(case_fold1_16_040) },\n    { case_fold1_16_041, __PHYSFS_ARRAYLEN(case_fold1_16_041) },\n    { case_fold1_16_042, __PHYSFS_ARRAYLEN(case_fold1_16_042) },\n    { case_fold1_16_043, __PHYSFS_ARRAYLEN(case_fold1_16_043) },\n    { case_fold1_16_044, __PHYSFS_ARRAYLEN(case_fold1_16_044) },\n    { case_fold1_16_045, __PHYSFS_ARRAYLEN(case_fold1_16_045) },\n    { case_fold1_16_046, __PHYSFS_ARRAYLEN(case_fold1_16_046) },\n    { case_fold1_16_047, __PHYSFS_ARRAYLEN(case_fold1_16_047) },\n    { case_fold1_16_048, __PHYSFS_ARRAYLEN(case_fold1_16_048) },\n    { case_fold1_16_049, __PHYSFS_ARRAYLEN(case_fold1_16_049) },\n    { case_fold1_16_050, __PHYSFS_ARRAYLEN(case_fold1_16_050) },\n    { case_fold1_16_051, __PHYSFS_ARRAYLEN(case_fold1_16_051) },\n    { case_fold1_16_052, __PHYSFS_ARRAYLEN(case_fold1_16_052) },\n    { case_fold1_16_053, __PHYSFS_ARRAYLEN(case_fold1_16_053) },\n    { case_fold1_16_054, __PHYSFS_ARRAYLEN(case_fold1_16_054) },\n    { case_fold1_16_055, __PHYSFS_ARRAYLEN(case_fold1_16_055) },\n    { case_fold1_16_056, __PHYSFS_ARRAYLEN(case_fold1_16_056) },\n    { case_fold1_16_057, __PHYSFS_ARRAYLEN(case_fold1_16_057) },\n    { case_fold1_16_058, __PHYSFS_ARRAYLEN(case_fold1_16_058) },\n    { case_fold1_16_059, __PHYSFS_ARRAYLEN(case_fold1_16_059) },\n    { case_fold1_16_060, __PHYSFS_ARRAYLEN(case_fold1_16_060) },\n    { case_fold1_16_061, __PHYSFS_ARRAYLEN(case_fold1_16_061) },\n    { case_fold1_16_062, __PHYSFS_ARRAYLEN(case_fold1_16_062) },\n    { case_fold1_16_063, __PHYSFS_ARRAYLEN(case_fold1_16_063) },\n    { case_fold1_16_064, __PHYSFS_ARRAYLEN(case_fold1_16_064) },\n    { case_fold1_16_065, __PHYSFS_ARRAYLEN(case_fold1_16_065) },\n    { case_fold1_16_066, __PHYSFS_ARRAYLEN(case_fold1_16_066) },\n    { case_fold1_16_067, __PHYSFS_ARRAYLEN(case_fold1_16_067) },\n    { case_fold1_16_068, __PHYSFS_ARRAYLEN(case_fold1_16_068) },\n    { case_fold1_16_069, __PHYSFS_ARRAYLEN(case_fold1_16_069) },\n    { case_fold1_16_070, __PHYSFS_ARRAYLEN(case_fold1_16_070) },\n    { case_fold1_16_071, __PHYSFS_ARRAYLEN(case_fold1_16_071) },\n    { case_fold1_16_072, __PHYSFS_ARRAYLEN(case_fold1_16_072) },\n    { case_fold1_16_073, __PHYSFS_ARRAYLEN(case_fold1_16_073) },\n    { case_fold1_16_074, __PHYSFS_ARRAYLEN(case_fold1_16_074) },\n    { case_fold1_16_075, __PHYSFS_ARRAYLEN(case_fold1_16_075) },\n    { case_fold1_16_076, __PHYSFS_ARRAYLEN(case_fold1_16_076) },\n    { case_fold1_16_077, __PHYSFS_ARRAYLEN(case_fold1_16_077) },\n    { case_fold1_16_078, __PHYSFS_ARRAYLEN(case_fold1_16_078) },\n    { case_fold1_16_079, __PHYSFS_ARRAYLEN(case_fold1_16_079) },\n    { case_fold1_16_080, __PHYSFS_ARRAYLEN(case_fold1_16_080) },\n    { case_fold1_16_081, __PHYSFS_ARRAYLEN(case_fold1_16_081) },\n    { case_fold1_16_082, __PHYSFS_ARRAYLEN(case_fold1_16_082) },\n    { case_fold1_16_083, __PHYSFS_ARRAYLEN(case_fold1_16_083) },\n    { case_fold1_16_084, __PHYSFS_ARRAYLEN(case_fold1_16_084) },\n    { case_fold1_16_085, __PHYSFS_ARRAYLEN(case_fold1_16_085) },\n    { case_fold1_16_086, __PHYSFS_ARRAYLEN(case_fold1_16_086) },\n    { case_fold1_16_087, __PHYSFS_ARRAYLEN(case_fold1_16_087) },\n    { case_fold1_16_088, __PHYSFS_ARRAYLEN(case_fold1_16_088) },\n    { case_fold1_16_089, __PHYSFS_ARRAYLEN(case_fold1_16_089) },\n    { case_fold1_16_090, __PHYSFS_ARRAYLEN(case_fold1_16_090) },\n    { case_fold1_16_091, __PHYSFS_ARRAYLEN(case_fold1_16_091) },\n    { case_fold1_16_092, __PHYSFS_ARRAYLEN(case_fold1_16_092) },\n    { case_fold1_16_093, __PHYSFS_ARRAYLEN(case_fold1_16_093) },\n    { case_fold1_16_094, __PHYSFS_ARRAYLEN(case_fold1_16_094) },\n    { case_fold1_16_095, __PHYSFS_ARRAYLEN(case_fold1_16_095) },\n    { case_fold1_16_096, __PHYSFS_ARRAYLEN(case_fold1_16_096) },\n    { case_fold1_16_097, __PHYSFS_ARRAYLEN(case_fold1_16_097) },\n    { case_fold1_16_098, __PHYSFS_ARRAYLEN(case_fold1_16_098) },\n    { case_fold1_16_099, __PHYSFS_ARRAYLEN(case_fold1_16_099) },\n    { case_fold1_16_100, __PHYSFS_ARRAYLEN(case_fold1_16_100) },\n    { case_fold1_16_101, __PHYSFS_ARRAYLEN(case_fold1_16_101) },\n    { case_fold1_16_102, __PHYSFS_ARRAYLEN(case_fold1_16_102) },\n    { case_fold1_16_103, __PHYSFS_ARRAYLEN(case_fold1_16_103) },\n    { case_fold1_16_104, __PHYSFS_ARRAYLEN(case_fold1_16_104) },\n    { case_fold1_16_105, __PHYSFS_ARRAYLEN(case_fold1_16_105) },\n    { case_fold1_16_106, __PHYSFS_ARRAYLEN(case_fold1_16_106) },\n    { case_fold1_16_107, __PHYSFS_ARRAYLEN(case_fold1_16_107) },\n    { case_fold1_16_108, __PHYSFS_ARRAYLEN(case_fold1_16_108) },\n    { case_fold1_16_109, __PHYSFS_ARRAYLEN(case_fold1_16_109) },\n    { case_fold1_16_110, __PHYSFS_ARRAYLEN(case_fold1_16_110) },\n    { case_fold1_16_111, __PHYSFS_ARRAYLEN(case_fold1_16_111) },\n    { case_fold1_16_112, __PHYSFS_ARRAYLEN(case_fold1_16_112) },\n    { case_fold1_16_113, __PHYSFS_ARRAYLEN(case_fold1_16_113) },\n    { case_fold1_16_114, __PHYSFS_ARRAYLEN(case_fold1_16_114) },\n    { case_fold1_16_115, __PHYSFS_ARRAYLEN(case_fold1_16_115) },\n    { case_fold1_16_116, __PHYSFS_ARRAYLEN(case_fold1_16_116) },\n    { case_fold1_16_117, __PHYSFS_ARRAYLEN(case_fold1_16_117) },\n    { case_fold1_16_118, __PHYSFS_ARRAYLEN(case_fold1_16_118) },\n    { case_fold1_16_119, __PHYSFS_ARRAYLEN(case_fold1_16_119) },\n    { case_fold1_16_120, __PHYSFS_ARRAYLEN(case_fold1_16_120) },\n    { case_fold1_16_121, __PHYSFS_ARRAYLEN(case_fold1_16_121) },\n    { case_fold1_16_122, __PHYSFS_ARRAYLEN(case_fold1_16_122) },\n    { NULL, 0 },\n    { case_fold1_16_124, __PHYSFS_ARRAYLEN(case_fold1_16_124) },\n    { NULL, 0 },\n    { case_fold1_16_126, __PHYSFS_ARRAYLEN(case_fold1_16_126) },\n    { NULL, 0 },\n    { case_fold1_16_128, __PHYSFS_ARRAYLEN(case_fold1_16_128) },\n    { case_fold1_16_129, __PHYSFS_ARRAYLEN(case_fold1_16_129) },\n    { case_fold1_16_130, __PHYSFS_ARRAYLEN(case_fold1_16_130) },\n    { case_fold1_16_131, __PHYSFS_ARRAYLEN(case_fold1_16_131) },\n    { case_fold1_16_132, __PHYSFS_ARRAYLEN(case_fold1_16_132) },\n    { case_fold1_16_133, __PHYSFS_ARRAYLEN(case_fold1_16_133) },\n    { case_fold1_16_134, __PHYSFS_ARRAYLEN(case_fold1_16_134) },\n    { case_fold1_16_135, __PHYSFS_ARRAYLEN(case_fold1_16_135) },\n    { case_fold1_16_136, __PHYSFS_ARRAYLEN(case_fold1_16_136) },\n    { case_fold1_16_137, __PHYSFS_ARRAYLEN(case_fold1_16_137) },\n    { case_fold1_16_138, __PHYSFS_ARRAYLEN(case_fold1_16_138) },\n    { case_fold1_16_139, __PHYSFS_ARRAYLEN(case_fold1_16_139) },\n    { case_fold1_16_140, __PHYSFS_ARRAYLEN(case_fold1_16_140) },\n    { case_fold1_16_141, __PHYSFS_ARRAYLEN(case_fold1_16_141) },\n    { case_fold1_16_142, __PHYSFS_ARRAYLEN(case_fold1_16_142) },\n    { case_fold1_16_143, __PHYSFS_ARRAYLEN(case_fold1_16_143) },\n    { case_fold1_16_144, __PHYSFS_ARRAYLEN(case_fold1_16_144) },\n    { case_fold1_16_145, __PHYSFS_ARRAYLEN(case_fold1_16_145) },\n    { case_fold1_16_146, __PHYSFS_ARRAYLEN(case_fold1_16_146) },\n    { case_fold1_16_147, __PHYSFS_ARRAYLEN(case_fold1_16_147) },\n    { case_fold1_16_148, __PHYSFS_ARRAYLEN(case_fold1_16_148) },\n    { case_fold1_16_149, __PHYSFS_ARRAYLEN(case_fold1_16_149) },\n    { case_fold1_16_150, __PHYSFS_ARRAYLEN(case_fold1_16_150) },\n    { case_fold1_16_151, __PHYSFS_ARRAYLEN(case_fold1_16_151) },\n    { case_fold1_16_152, __PHYSFS_ARRAYLEN(case_fold1_16_152) },\n    { case_fold1_16_153, __PHYSFS_ARRAYLEN(case_fold1_16_153) },\n    { case_fold1_16_154, __PHYSFS_ARRAYLEN(case_fold1_16_154) },\n    { case_fold1_16_155, __PHYSFS_ARRAYLEN(case_fold1_16_155) },\n    { case_fold1_16_156, __PHYSFS_ARRAYLEN(case_fold1_16_156) },\n    { case_fold1_16_157, __PHYSFS_ARRAYLEN(case_fold1_16_157) },\n    { case_fold1_16_158, __PHYSFS_ARRAYLEN(case_fold1_16_158) },\n    { case_fold1_16_159, __PHYSFS_ARRAYLEN(case_fold1_16_159) },\n    { case_fold1_16_160, __PHYSFS_ARRAYLEN(case_fold1_16_160) },\n    { case_fold1_16_161, __PHYSFS_ARRAYLEN(case_fold1_16_161) },\n    { case_fold1_16_162, __PHYSFS_ARRAYLEN(case_fold1_16_162) },\n    { case_fold1_16_163, __PHYSFS_ARRAYLEN(case_fold1_16_163) },\n    { case_fold1_16_164, __PHYSFS_ARRAYLEN(case_fold1_16_164) },\n    { case_fold1_16_165, __PHYSFS_ARRAYLEN(case_fold1_16_165) },\n    { case_fold1_16_166, __PHYSFS_ARRAYLEN(case_fold1_16_166) },\n    { case_fold1_16_167, __PHYSFS_ARRAYLEN(case_fold1_16_167) },\n    { case_fold1_16_168, __PHYSFS_ARRAYLEN(case_fold1_16_168) },\n    { case_fold1_16_169, __PHYSFS_ARRAYLEN(case_fold1_16_169) },\n    { case_fold1_16_170, __PHYSFS_ARRAYLEN(case_fold1_16_170) },\n    { case_fold1_16_171, __PHYSFS_ARRAYLEN(case_fold1_16_171) },\n    { case_fold1_16_172, __PHYSFS_ARRAYLEN(case_fold1_16_172) },\n    { case_fold1_16_173, __PHYSFS_ARRAYLEN(case_fold1_16_173) },\n    { case_fold1_16_174, __PHYSFS_ARRAYLEN(case_fold1_16_174) },\n    { case_fold1_16_175, __PHYSFS_ARRAYLEN(case_fold1_16_175) },\n    { case_fold1_16_176, __PHYSFS_ARRAYLEN(case_fold1_16_176) },\n    { case_fold1_16_177, __PHYSFS_ARRAYLEN(case_fold1_16_177) },\n    { case_fold1_16_178, __PHYSFS_ARRAYLEN(case_fold1_16_178) },\n    { case_fold1_16_179, __PHYSFS_ARRAYLEN(case_fold1_16_179) },\n    { case_fold1_16_180, __PHYSFS_ARRAYLEN(case_fold1_16_180) },\n    { case_fold1_16_181, __PHYSFS_ARRAYLEN(case_fold1_16_181) },\n    { case_fold1_16_182, __PHYSFS_ARRAYLEN(case_fold1_16_182) },\n    { case_fold1_16_183, __PHYSFS_ARRAYLEN(case_fold1_16_183) },\n    { case_fold1_16_184, __PHYSFS_ARRAYLEN(case_fold1_16_184) },\n    { case_fold1_16_185, __PHYSFS_ARRAYLEN(case_fold1_16_185) },\n    { case_fold1_16_186, __PHYSFS_ARRAYLEN(case_fold1_16_186) },\n    { case_fold1_16_187, __PHYSFS_ARRAYLEN(case_fold1_16_187) },\n    { case_fold1_16_188, __PHYSFS_ARRAYLEN(case_fold1_16_188) },\n    { case_fold1_16_189, __PHYSFS_ARRAYLEN(case_fold1_16_189) },\n    { case_fold1_16_190, __PHYSFS_ARRAYLEN(case_fold1_16_190) },\n    { case_fold1_16_191, __PHYSFS_ARRAYLEN(case_fold1_16_191) },\n    { case_fold1_16_192, __PHYSFS_ARRAYLEN(case_fold1_16_192) },\n    { case_fold1_16_193, __PHYSFS_ARRAYLEN(case_fold1_16_193) },\n    { case_fold1_16_194, __PHYSFS_ARRAYLEN(case_fold1_16_194) },\n    { case_fold1_16_195, __PHYSFS_ARRAYLEN(case_fold1_16_195) },\n    { case_fold1_16_196, __PHYSFS_ARRAYLEN(case_fold1_16_196) },\n    { case_fold1_16_197, __PHYSFS_ARRAYLEN(case_fold1_16_197) },\n    { case_fold1_16_198, __PHYSFS_ARRAYLEN(case_fold1_16_198) },\n    { case_fold1_16_199, __PHYSFS_ARRAYLEN(case_fold1_16_199) },\n    { case_fold1_16_200, __PHYSFS_ARRAYLEN(case_fold1_16_200) },\n    { case_fold1_16_201, __PHYSFS_ARRAYLEN(case_fold1_16_201) },\n    { case_fold1_16_202, __PHYSFS_ARRAYLEN(case_fold1_16_202) },\n    { case_fold1_16_203, __PHYSFS_ARRAYLEN(case_fold1_16_203) },\n    { case_fold1_16_204, __PHYSFS_ARRAYLEN(case_fold1_16_204) },\n    { case_fold1_16_205, __PHYSFS_ARRAYLEN(case_fold1_16_205) },\n    { case_fold1_16_206, __PHYSFS_ARRAYLEN(case_fold1_16_206) },\n    { case_fold1_16_207, __PHYSFS_ARRAYLEN(case_fold1_16_207) },\n    { case_fold1_16_208, __PHYSFS_ARRAYLEN(case_fold1_16_208) },\n    { case_fold1_16_209, __PHYSFS_ARRAYLEN(case_fold1_16_209) },\n    { case_fold1_16_210, __PHYSFS_ARRAYLEN(case_fold1_16_210) },\n    { case_fold1_16_211, __PHYSFS_ARRAYLEN(case_fold1_16_211) },\n    { case_fold1_16_212, __PHYSFS_ARRAYLEN(case_fold1_16_212) },\n    { case_fold1_16_213, __PHYSFS_ARRAYLEN(case_fold1_16_213) },\n    { case_fold1_16_214, __PHYSFS_ARRAYLEN(case_fold1_16_214) },\n    { case_fold1_16_215, __PHYSFS_ARRAYLEN(case_fold1_16_215) },\n    { case_fold1_16_216, __PHYSFS_ARRAYLEN(case_fold1_16_216) },\n    { case_fold1_16_217, __PHYSFS_ARRAYLEN(case_fold1_16_217) },\n    { case_fold1_16_218, __PHYSFS_ARRAYLEN(case_fold1_16_218) },\n    { case_fold1_16_219, __PHYSFS_ARRAYLEN(case_fold1_16_219) },\n    { case_fold1_16_220, __PHYSFS_ARRAYLEN(case_fold1_16_220) },\n    { case_fold1_16_221, __PHYSFS_ARRAYLEN(case_fold1_16_221) },\n    { case_fold1_16_222, __PHYSFS_ARRAYLEN(case_fold1_16_222) },\n    { case_fold1_16_223, __PHYSFS_ARRAYLEN(case_fold1_16_223) },\n    { case_fold1_16_224, __PHYSFS_ARRAYLEN(case_fold1_16_224) },\n    { case_fold1_16_225, __PHYSFS_ARRAYLEN(case_fold1_16_225) },\n    { case_fold1_16_226, __PHYSFS_ARRAYLEN(case_fold1_16_226) },\n    { case_fold1_16_227, __PHYSFS_ARRAYLEN(case_fold1_16_227) },\n    { case_fold1_16_228, __PHYSFS_ARRAYLEN(case_fold1_16_228) },\n    { case_fold1_16_229, __PHYSFS_ARRAYLEN(case_fold1_16_229) },\n    { case_fold1_16_230, __PHYSFS_ARRAYLEN(case_fold1_16_230) },\n    { case_fold1_16_231, __PHYSFS_ARRAYLEN(case_fold1_16_231) },\n    { case_fold1_16_232, __PHYSFS_ARRAYLEN(case_fold1_16_232) },\n    { case_fold1_16_233, __PHYSFS_ARRAYLEN(case_fold1_16_233) },\n    { case_fold1_16_234, __PHYSFS_ARRAYLEN(case_fold1_16_234) },\n    { case_fold1_16_235, __PHYSFS_ARRAYLEN(case_fold1_16_235) },\n    { case_fold1_16_236, __PHYSFS_ARRAYLEN(case_fold1_16_236) },\n    { case_fold1_16_237, __PHYSFS_ARRAYLEN(case_fold1_16_237) },\n    { case_fold1_16_238, __PHYSFS_ARRAYLEN(case_fold1_16_238) },\n    { case_fold1_16_239, __PHYSFS_ARRAYLEN(case_fold1_16_239) },\n    { case_fold1_16_240, __PHYSFS_ARRAYLEN(case_fold1_16_240) },\n    { case_fold1_16_241, __PHYSFS_ARRAYLEN(case_fold1_16_241) },\n    { case_fold1_16_242, __PHYSFS_ARRAYLEN(case_fold1_16_242) },\n    { case_fold1_16_243, __PHYSFS_ARRAYLEN(case_fold1_16_243) },\n    { case_fold1_16_244, __PHYSFS_ARRAYLEN(case_fold1_16_244) },\n    { case_fold1_16_245, __PHYSFS_ARRAYLEN(case_fold1_16_245) },\n    { case_fold1_16_246, __PHYSFS_ARRAYLEN(case_fold1_16_246) },\n    { case_fold1_16_247, __PHYSFS_ARRAYLEN(case_fold1_16_247) },\n    { case_fold1_16_248, __PHYSFS_ARRAYLEN(case_fold1_16_248) },\n    { case_fold1_16_249, __PHYSFS_ARRAYLEN(case_fold1_16_249) },\n    { case_fold1_16_250, __PHYSFS_ARRAYLEN(case_fold1_16_250) },\n    { case_fold1_16_251, __PHYSFS_ARRAYLEN(case_fold1_16_251) },\n    { case_fold1_16_252, __PHYSFS_ARRAYLEN(case_fold1_16_252) },\n    { case_fold1_16_253, __PHYSFS_ARRAYLEN(case_fold1_16_253) },\n    { case_fold1_16_254, __PHYSFS_ARRAYLEN(case_fold1_16_254) },\n    { case_fold1_16_255, __PHYSFS_ARRAYLEN(case_fold1_16_255) },\n};\n\nstatic const CaseFoldHashBucket1_32 case_fold_hash1_32[] = {\n    { case_fold1_32_000, __PHYSFS_ARRAYLEN(case_fold1_32_000) },\n    { case_fold1_32_001, __PHYSFS_ARRAYLEN(case_fold1_32_001) },\n    { case_fold1_32_002, __PHYSFS_ARRAYLEN(case_fold1_32_002) },\n    { case_fold1_32_003, __PHYSFS_ARRAYLEN(case_fold1_32_003) },\n    { case_fold1_32_004, __PHYSFS_ARRAYLEN(case_fold1_32_004) },\n    { case_fold1_32_005, __PHYSFS_ARRAYLEN(case_fold1_32_005) },\n    { case_fold1_32_006, __PHYSFS_ARRAYLEN(case_fold1_32_006) },\n    { case_fold1_32_007, __PHYSFS_ARRAYLEN(case_fold1_32_007) },\n    { case_fold1_32_008, __PHYSFS_ARRAYLEN(case_fold1_32_008) },\n    { case_fold1_32_009, __PHYSFS_ARRAYLEN(case_fold1_32_009) },\n    { case_fold1_32_010, __PHYSFS_ARRAYLEN(case_fold1_32_010) },\n    { case_fold1_32_011, __PHYSFS_ARRAYLEN(case_fold1_32_011) },\n    { case_fold1_32_012, __PHYSFS_ARRAYLEN(case_fold1_32_012) },\n    { case_fold1_32_013, __PHYSFS_ARRAYLEN(case_fold1_32_013) },\n    { case_fold1_32_014, __PHYSFS_ARRAYLEN(case_fold1_32_014) },\n    { case_fold1_32_015, __PHYSFS_ARRAYLEN(case_fold1_32_015) },\n};\n\nstatic const CaseFoldHashBucket2_16 case_fold_hash2_16[] = {\n    { case_fold2_16_000, __PHYSFS_ARRAYLEN(case_fold2_16_000) },\n    { case_fold2_16_001, __PHYSFS_ARRAYLEN(case_fold2_16_001) },\n    { case_fold2_16_002, __PHYSFS_ARRAYLEN(case_fold2_16_002) },\n    { case_fold2_16_003, __PHYSFS_ARRAYLEN(case_fold2_16_003) },\n    { case_fold2_16_004, __PHYSFS_ARRAYLEN(case_fold2_16_004) },\n    { case_fold2_16_005, __PHYSFS_ARRAYLEN(case_fold2_16_005) },\n    { case_fold2_16_006, __PHYSFS_ARRAYLEN(case_fold2_16_006) },\n    { case_fold2_16_007, __PHYSFS_ARRAYLEN(case_fold2_16_007) },\n    { case_fold2_16_008, __PHYSFS_ARRAYLEN(case_fold2_16_008) },\n    { case_fold2_16_009, __PHYSFS_ARRAYLEN(case_fold2_16_009) },\n    { case_fold2_16_010, __PHYSFS_ARRAYLEN(case_fold2_16_010) },\n    { case_fold2_16_011, __PHYSFS_ARRAYLEN(case_fold2_16_011) },\n    { case_fold2_16_012, __PHYSFS_ARRAYLEN(case_fold2_16_012) },\n    { case_fold2_16_013, __PHYSFS_ARRAYLEN(case_fold2_16_013) },\n    { case_fold2_16_014, __PHYSFS_ARRAYLEN(case_fold2_16_014) },\n    { case_fold2_16_015, __PHYSFS_ARRAYLEN(case_fold2_16_015) },\n};\n\nstatic const CaseFoldHashBucket3_16 case_fold_hash3_16[] = {\n    { case_fold3_16_000, __PHYSFS_ARRAYLEN(case_fold3_16_000) },\n    { case_fold3_16_001, __PHYSFS_ARRAYLEN(case_fold3_16_001) },\n    { NULL, 0 },\n    { case_fold3_16_003, __PHYSFS_ARRAYLEN(case_fold3_16_003) },\n};\n\n\n#endif  /* _INCLUDE_PHYSFS_CASEFOLDING_H_ */\n\n/* end of physfs_casefolding.h ... */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_internal.h",
    "content": "/*\n * Internal function/structure declaration. Do NOT include in your\n *  application.\n *\n * Please see the file LICENSE.txt in the source's root directory.\n *\n *  This file written by Ryan C. Gordon.\n */\n\n#ifndef _INCLUDE_PHYSFS_INTERNAL_H_\n#define _INCLUDE_PHYSFS_INTERNAL_H_\n\n#ifndef __PHYSICSFS_INTERNAL__\n#error Do not include this header from your applications.\n#endif\n\n/* Turn off MSVC warnings that are aggressively anti-portability. */\n#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)\n#define _CRT_SECURE_NO_WARNINGS 1\n#endif\n\n#include \"physfs.h\"\n\n/* The holy trinity. */\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"physfs_platforms.h\"\n\n#include <assert.h>\n\n#define __PHYSFS_COMPILE_TIME_ASSERT(name, x) \\\n       typedef int __PHYSFS_compile_time_assert_##name[(x) * 2 - 1]\n\n/* !!! FIXME: remove this when revamping stack allocation code... */\n#if defined(_MSC_VER) || defined(__MINGW32__) || defined(__WATCOMC__)\n#include <malloc.h>\n#endif\n\n#if defined(PHYSFS_PLATFORM_SOLARIS) || defined(PHYSFS_PLATFORM_LINUX)\n#include <alloca.h>\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef __GNUC__\n#define PHYSFS_MINIMUM_GCC_VERSION(major, minor) \\\n    ( ((__GNUC__ << 16) + __GNUC_MINOR__) >= (((major) << 16) + (minor)) )\n#else\n#define PHYSFS_MINIMUM_GCC_VERSION(major, minor) (0)\n#endif\n\n#ifdef __cplusplus\n    /* C++ always has a real inline keyword. */\n#elif (defined macintosh) && !(defined __MWERKS__)\n#   define inline\n#elif (defined _MSC_VER)\n#   define inline __inline\n#endif\n\n#if defined(PHYSFS_PLATFORM_LINUX) && !defined(_FILE_OFFSET_BITS)\n#define _FILE_OFFSET_BITS 64\n#endif\n\n/* All public APIs need to be in physfs.h with a PHYSFS_DECL.\n   All file-private symbols need to be marked \"static\".\n   Everything shared between PhysicsFS sources needs to be in this\n   file between the visibility pragma blocks. */\n#if !defined(_WIN32) && (PHYSFS_MINIMUM_GCC_VERSION(4,0) || defined(__clang__))\n#define PHYSFS_HAVE_PRAGMA_VISIBILITY 1\n#endif\n\n#if PHYSFS_HAVE_PRAGMA_VISIBILITY\n#pragma GCC visibility push(hidden)\n#endif\n\n/* These are the build-in archivers. We list them all as \"extern\" here without\n   #ifdefs to keep it tidy, but obviously you need to make sure these are\n   wrapped in PHYSFS_SUPPORTS_* checks before actually referencing them. */\nextern const PHYSFS_Archiver __PHYSFS_Archiver_DIR;\nextern const PHYSFS_Archiver __PHYSFS_Archiver_ZIP;\nextern const PHYSFS_Archiver __PHYSFS_Archiver_7Z;\nextern const PHYSFS_Archiver __PHYSFS_Archiver_GRP;\nextern const PHYSFS_Archiver __PHYSFS_Archiver_QPAK;\nextern const PHYSFS_Archiver __PHYSFS_Archiver_HOG;\nextern const PHYSFS_Archiver __PHYSFS_Archiver_MVL;\nextern const PHYSFS_Archiver __PHYSFS_Archiver_WAD;\nextern const PHYSFS_Archiver __PHYSFS_Archiver_SLB;\nextern const PHYSFS_Archiver __PHYSFS_Archiver_ISO9660;\nextern const PHYSFS_Archiver __PHYSFS_Archiver_VDF;\n\n/* a real C99-compliant snprintf() is in Visual Studio 2015,\n   but just use this everywhere for binary compatibility. */\n#if defined(_MSC_VER)\n#include <stdarg.h>\nint __PHYSFS_msvc_vsnprintf(char *outBuf, size_t size, const char *format, va_list ap);\nint __PHYSFS_msvc_snprintf(char *outBuf, size_t size, const char *format, ...);\n#define vsnprintf __PHYSFS_msvc_vsnprintf\n#define snprintf __PHYSFS_msvc_snprintf\n#endif\n\n/* Some simple wrappers around WinRT C++ interfaces we can call from C. */\n#ifdef PHYSFS_PLATFORM_WINRT\nconst void *__PHYSFS_winrtCalcBaseDir(void);\nconst void *__PHYSFS_winrtCalcPrefDir(void);\n#endif\n\n/* atomic operations. */\n/* increment/decrement operations return the final incremented/decremented value. */\n#if defined(_MSC_VER) && (_MSC_VER >= 1500)\n#include <intrin.h>\n__PHYSFS_COMPILE_TIME_ASSERT(LongEqualsInt, sizeof (int) == sizeof (long));\n#define __PHYSFS_ATOMIC_INCR(ptrval) _InterlockedIncrement((long*)(ptrval))\n#define __PHYSFS_ATOMIC_DECR(ptrval) _InterlockedDecrement((long*)(ptrval))\n#elif defined(__clang__) || (defined(__GNUC__) && (((__GNUC__ * 10000) + (__GNUC_MINOR__ * 100)) >= 40100))\n#define __PHYSFS_ATOMIC_INCR(ptrval) __sync_add_and_fetch(ptrval, 1)\n#define __PHYSFS_ATOMIC_DECR(ptrval) __sync_add_and_fetch(ptrval, -1)\n#elif defined(__WATCOMC__) && defined(__386__)\nextern __inline int _xadd_watcom(volatile int *a, int v);\n#pragma aux _xadd_watcom = \\\n  \"lock xadd [ecx], eax\" \\\n  parm [ecx] [eax] \\\n  value [eax] \\\n  modify exact [eax];\n#define __PHYSFS_ATOMIC_INCR(ptrval) (_xadd_watcom(ptrval, 1)+1)\n#define __PHYSFS_ATOMIC_DECR(ptrval) (_xadd_watcom(ptrval, -1)-1)\n#else\n#define PHYSFS_NEED_ATOMIC_OP_FALLBACK 1\nint __PHYSFS_ATOMIC_INCR(int *ptrval);\nint __PHYSFS_ATOMIC_DECR(int *ptrval);\n#endif\n\n\n/*\n * Interface for small allocations. If you need a little scratch space for\n *  a throwaway buffer or string, use this. It will make small allocations\n *  on the stack if possible, and use allocator.Malloc() if they are too\n *  large. This helps reduce malloc pressure.\n * There are some rules, though:\n * NEVER return a pointer from this, as stack-allocated buffers go away\n *  when your function returns.\n * NEVER allocate in a loop, as stack-allocated pointers will pile up. Call\n *  a function that uses smallAlloc from your loop, so the allocation can\n *  free each time.\n * NEVER call smallAlloc with any complex expression (it's a macro that WILL\n *  have side effects...it references the argument multiple times). Use a\n *  variable or a literal.\n * NEVER free a pointer from this with anything but smallFree. It will not\n *  be a valid pointer to the allocator, regardless of where the memory came\n *  from.\n * NEVER realloc a pointer from this.\n * NEVER forget to use smallFree: it may not be a pointer from the stack.\n * NEVER forget to check for NULL...allocation can fail here, of course!\n */\n#define __PHYSFS_SMALLALLOCTHRESHOLD 256\nvoid *__PHYSFS_initSmallAlloc(void *ptr, const size_t len);\n\n#define __PHYSFS_smallAlloc(bytes) ( \\\n    __PHYSFS_initSmallAlloc( \\\n        (((bytes) < __PHYSFS_SMALLALLOCTHRESHOLD) ? \\\n            alloca((size_t)((bytes)+sizeof(void*))) : NULL), (bytes)) \\\n)\n\nvoid __PHYSFS_smallFree(void *ptr);\n\n\n/* Use the allocation hooks. */\n#define malloc(x) Do not use malloc() directly.\n#define realloc(x, y) Do not use realloc() directly.\n#define free(x) Do not use free() directly.\n/* !!! FIXME: add alloca check here. */\n\n\n/* by default, enable things, so builds can opt out of a few things they\n   want to avoid. But you can build with this #defined to 0 if you would\n   like to turn off everything except a handful of things you opt into. */\n#ifndef PHYSFS_SUPPORTS_DEFAULT\n#define PHYSFS_SUPPORTS_DEFAULT 1\n#endif\n\n\n#ifndef PHYSFS_SUPPORTS_ZIP\n#define PHYSFS_SUPPORTS_ZIP PHYSFS_SUPPORTS_DEFAULT\n#endif\n#ifndef PHYSFS_SUPPORTS_7Z\n#define PHYSFS_SUPPORTS_7Z PHYSFS_SUPPORTS_DEFAULT\n#endif\n#ifndef PHYSFS_SUPPORTS_GRP\n#define PHYSFS_SUPPORTS_GRP PHYSFS_SUPPORTS_DEFAULT\n#endif\n#ifndef PHYSFS_SUPPORTS_HOG\n#define PHYSFS_SUPPORTS_HOG PHYSFS_SUPPORTS_DEFAULT\n#endif\n#ifndef PHYSFS_SUPPORTS_MVL\n#define PHYSFS_SUPPORTS_MVL PHYSFS_SUPPORTS_DEFAULT\n#endif\n#ifndef PHYSFS_SUPPORTS_WAD\n#define PHYSFS_SUPPORTS_WAD PHYSFS_SUPPORTS_DEFAULT\n#endif\n#ifndef PHYSFS_SUPPORTS_QPAK\n#define PHYSFS_SUPPORTS_QPAK PHYSFS_SUPPORTS_DEFAULT\n#endif\n#ifndef PHYSFS_SUPPORTS_SLB\n#define PHYSFS_SUPPORTS_SLB PHYSFS_SUPPORTS_DEFAULT\n#endif\n#ifndef PHYSFS_SUPPORTS_ISO9660\n#define PHYSFS_SUPPORTS_ISO9660 PHYSFS_SUPPORTS_DEFAULT\n#endif\n#ifndef PHYSFS_SUPPORTS_VDF\n#define PHYSFS_SUPPORTS_VDF PHYSFS_SUPPORTS_DEFAULT\n#endif\n\n#if PHYSFS_SUPPORTS_7Z\n/* 7zip support needs a global init function called at startup (no deinit). */\nextern void SZIP_global_init(void);\n#endif\n\n/* The latest supported PHYSFS_Io::version value. */\n#define CURRENT_PHYSFS_IO_API_VERSION 0\n\n/* The latest supported PHYSFS_Archiver::version value. */\n#define CURRENT_PHYSFS_ARCHIVER_API_VERSION 0\n\n\n/* This byteorder stuff was lifted from SDL. https://www.libsdl.org/ */\n#define PHYSFS_LIL_ENDIAN  1234\n#define PHYSFS_BIG_ENDIAN  4321\n\n#ifdef __linux__\n#include <endian.h>\n#define PHYSFS_BYTEORDER  __BYTE_ORDER\n#elif defined(__OpenBSD__) || defined(__DragonFly__)\n#include <endian.h>\n#define PHYSFS_BYTEORDER  BYTE_ORDER\n#elif defined(__FreeBSD__) || defined(__NetBSD__)\n#include <sys/endian.h>\n#define PHYSFS_BYTEORDER  BYTE_ORDER\n/* predefs from newer gcc and clang versions: */\n#elif defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__) && defined(__BYTE_ORDER__)\n#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)\n#define PHYSFS_BYTEORDER   PHYSFS_LIL_ENDIAN\n#elif (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)\n#define PHYSFS_BYTEORDER   PHYSFS_BIG_ENDIAN\n#else\n#error Unsupported endianness\n#endif /**/\n#else\n#if defined(__hppa__) || \\\n    defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \\\n    (defined(__MIPS__) && defined(__MIPSEB__)) || \\\n    defined(__ppc__) || defined(__POWERPC__) || defined(__powerpc__) || defined(__PPC__) || \\\n    defined(__sparc__)\n#define PHYSFS_BYTEORDER   PHYSFS_BIG_ENDIAN\n#else\n#define PHYSFS_BYTEORDER   PHYSFS_LIL_ENDIAN\n#endif\n#endif /* __linux__ */\n\n\n/*\n * When sorting the entries in an archive, we use a modified QuickSort.\n *  When there are less then PHYSFS_QUICKSORT_THRESHOLD entries left to sort,\n *  we switch over to a BubbleSort for the remainder. Tweak to taste.\n *\n * You can override this setting by defining PHYSFS_QUICKSORT_THRESHOLD\n *  before #including \"physfs_internal.h\".\n */\n#ifndef PHYSFS_QUICKSORT_THRESHOLD\n#define PHYSFS_QUICKSORT_THRESHOLD 4\n#endif\n\n/*\n * Sort an array (or whatever) of (max) elements. This uses a mixture of\n *  a QuickSort and BubbleSort internally.\n * (cmpfn) is used to determine ordering, and (swapfn) does the actual\n *  swapping of elements in the list.\n */\nvoid __PHYSFS_sort(void *entries, size_t max,\n                   int (*cmpfn)(void *, size_t, size_t),\n                   void (*swapfn)(void *, size_t, size_t));\n\n/* These get used all over for lessening code clutter. */\n/* \"ERRPASS\" means \"something else just set the error state for us\" and is\n    just to make it clear where the responsibility for the error state lays. */\n#define BAIL(e, r) do { if (e) PHYSFS_setErrorCode(e); return r; } while (0)\n#define BAIL_ERRPASS(r) do { return r; } while (0)\n#define BAIL_IF(c, e, r) do { if (c) { if (e) PHYSFS_setErrorCode(e); return r; } } while (0)\n#define BAIL_IF_ERRPASS(c, r) do { if (c) { return r; } } while (0)\n#define BAIL_MUTEX(e, m, r) do { if (e) PHYSFS_setErrorCode(e); __PHYSFS_platformReleaseMutex(m); return r; } while (0)\n#define BAIL_MUTEX_ERRPASS(m, r) do { __PHYSFS_platformReleaseMutex(m); return r; } while (0)\n#define BAIL_IF_MUTEX(c, e, m, r) do { if (c) { if (e) PHYSFS_setErrorCode(e); __PHYSFS_platformReleaseMutex(m); return r; } } while (0)\n#define BAIL_IF_MUTEX_ERRPASS(c, m, r) do { if (c) { __PHYSFS_platformReleaseMutex(m); return r; } } while (0)\n#define GOTO(e, g) do { if (e) PHYSFS_setErrorCode(e); goto g; } while (0)\n#define GOTO_ERRPASS(g) do { goto g; } while (0)\n#define GOTO_IF(c, e, g) do { if (c) { if (e) PHYSFS_setErrorCode(e); goto g; } } while (0)\n#define GOTO_IF_ERRPASS(c, g) do { if (c) { goto g; } } while (0)\n#define GOTO_MUTEX(e, m, g) do { if (e) PHYSFS_setErrorCode(e); __PHYSFS_platformReleaseMutex(m); goto g; } while (0)\n#define GOTO_MUTEX_ERRPASS(m, g) do { __PHYSFS_platformReleaseMutex(m); goto g; } while (0)\n#define GOTO_IF_MUTEX(c, e, m, g) do { if (c) { if (e) PHYSFS_setErrorCode(e); __PHYSFS_platformReleaseMutex(m); goto g; } } while (0)\n#define GOTO_IF_MUTEX_ERRPASS(c, m, g) do { if (c) { __PHYSFS_platformReleaseMutex(m); goto g; } } while (0)\n\n#define __PHYSFS_ARRAYLEN(x) ( (sizeof (x)) / (sizeof (x[0])) )\n\n#ifdef PHYSFS_NO_64BIT_SUPPORT\n#define __PHYSFS_SI64(x) ((PHYSFS_sint64) (x))\n#define __PHYSFS_UI64(x) ((PHYSFS_uint64) (x))\n#elif (defined __GNUC__)\n#define __PHYSFS_SI64(x) x##LL\n#define __PHYSFS_UI64(x) x##ULL\n#elif (defined _MSC_VER)\n#define __PHYSFS_SI64(x) x##i64\n#define __PHYSFS_UI64(x) x##ui64\n#else\n#define __PHYSFS_SI64(x) ((PHYSFS_sint64) (x))\n#define __PHYSFS_UI64(x) ((PHYSFS_uint64) (x))\n#endif\n\n\n/*\n * Check if a ui64 will fit in the platform's address space.\n *  The initial sizeof check will optimize this macro out entirely on\n *  64-bit (and larger?!) platforms, and the other condition will\n *  return zero or non-zero if the variable will fit in the platform's\n *  size_t, suitable to pass to malloc. This is kinda messy, but effective.\n */\n#define __PHYSFS_ui64FitsAddressSpace(s) ( \\\n    (sizeof (PHYSFS_uint64) <= sizeof (size_t)) || \\\n    ((s) < (__PHYSFS_UI64(0xFFFFFFFFFFFFFFFF) >> (64-(sizeof(size_t)*8)))) \\\n)\n\n/*\n * Like strdup(), but uses the current PhysicsFS allocator.\n */\nchar *__PHYSFS_strdup(const char *str);\n\n/*\n * Give a hash value for a C string (uses djb's xor hashing algorithm).\n */\nPHYSFS_uint32 __PHYSFS_hashString(const char *str);\n\n/*\n * Give a hash value for a C string (uses djb's xor hashing algorithm), case folding as it goes.\n */\nPHYSFS_uint32 __PHYSFS_hashStringCaseFold(const char *str);\n\n/*\n * Give a hash value for a C string (uses djb's xor hashing algorithm), case folding as it goes,\n *  assuming that this is only US-ASCII chars (one byte per char, only 'A' through 'Z' need folding).\n */\nPHYSFS_uint32 __PHYSFS_hashStringCaseFoldUSAscii(const char *str);\n\n\n/*\n * The current allocator. Not valid before PHYSFS_init is called!\n */\nextern PHYSFS_Allocator __PHYSFS_AllocatorHooks;\n\n/* convenience macro to make this less cumbersome internally... */\n#define allocator __PHYSFS_AllocatorHooks\n\n/*\n * Create a PHYSFS_Io for a file in the physical filesystem.\n *  This path is in platform-dependent notation. (mode) must be 'r', 'w', or\n *  'a' for Read, Write, or Append.\n */\nPHYSFS_Io *__PHYSFS_createNativeIo(const char *path, const int mode);\n\n/*\n * Create a PHYSFS_Io for a buffer of memory (READ-ONLY). If you already\n *  have one of these, just use its duplicate() method, and it'll increment\n *  its refcount without allocating a copy of the buffer.\n */\nPHYSFS_Io *__PHYSFS_createMemoryIo(const void *buf, PHYSFS_uint64 len,\n                                   void (*destruct)(void *));\n\n\n/*\n * Read (len) bytes from (io) into (buf). Returns non-zero on success,\n *  zero on i/o error. Literally: \"return (io->read(io, buf, len) == len);\"\n */\nint __PHYSFS_readAll(PHYSFS_Io *io, void *buf, const size_t len);\n\n\n/* These are shared between some archivers. */\n\n/* LOTS of legacy formats that only use US ASCII, not actually UTF-8, so let them optimize here. */\nvoid *UNPK_openArchive(PHYSFS_Io *io, const int case_sensitive, const int only_usascii);\nvoid UNPK_abandonArchive(void *opaque);\nvoid UNPK_closeArchive(void *opaque);\nvoid *UNPK_addEntry(void *opaque, char *name, const int isdir,\n                    const PHYSFS_sint64 ctime, const PHYSFS_sint64 mtime,\n                    const PHYSFS_uint64 pos, const PHYSFS_uint64 len);\nPHYSFS_Io *UNPK_openRead(void *opaque, const char *name);\nPHYSFS_Io *UNPK_openWrite(void *opaque, const char *name);\nPHYSFS_Io *UNPK_openAppend(void *opaque, const char *name);\nint UNPK_remove(void *opaque, const char *name);\nint UNPK_mkdir(void *opaque, const char *name);\nint UNPK_stat(void *opaque, const char *fn, PHYSFS_Stat *st);\n#define UNPK_enumerate __PHYSFS_DirTreeEnumerate\n\n\n\n/* Optional API many archivers use this to manage their directory tree. */\n/* !!! FIXME: document this better. */\n\ntypedef struct __PHYSFS_DirTreeEntry\n{\n    char *name;                              /* Full path in archive.        */\n    struct __PHYSFS_DirTreeEntry *hashnext;  /* next item in hash bucket.    */\n    struct __PHYSFS_DirTreeEntry *children;  /* linked list of kids, if dir. */\n    struct __PHYSFS_DirTreeEntry *sibling;   /* next item in same dir.       */\n    int isdir;\n} __PHYSFS_DirTreeEntry;\n\ntypedef struct __PHYSFS_DirTree\n{\n    __PHYSFS_DirTreeEntry *root;    /* root of directory tree.             */\n    __PHYSFS_DirTreeEntry **hash;  /* all entries hashed for fast lookup. */\n    size_t hashBuckets;            /* number of buckets in hash.          */\n    size_t entrylen;    /* size in bytes of entries (including subclass). */\n    int case_sensitive;  /* non-zero to treat entries as case-sensitive in DirTreeFind */\n    int only_usascii;  /* non-zero to treat paths as US ASCII only (one byte per char, only 'A' through 'Z' are considered for case folding). */\n} __PHYSFS_DirTree;\n\n\n/* LOTS of legacy formats that only use US ASCII, not actually UTF-8, so let them optimize here. */\nint __PHYSFS_DirTreeInit(__PHYSFS_DirTree *dt, const size_t entrylen, const int case_sensitive, const int only_usascii);\nvoid *__PHYSFS_DirTreeAdd(__PHYSFS_DirTree *dt, char *name, const int isdir);\nvoid *__PHYSFS_DirTreeFind(__PHYSFS_DirTree *dt, const char *path);\nPHYSFS_EnumerateCallbackResult __PHYSFS_DirTreeEnumerate(void *opaque,\n                              const char *dname, PHYSFS_EnumerateCallback cb,\n                              const char *origdir, void *callbackdata);\nvoid __PHYSFS_DirTreeDeinit(__PHYSFS_DirTree *dt);\n\n\n\n/*--------------------------------------------------------------------------*/\n/*--------------------------------------------------------------------------*/\n/*------------                                              ----------------*/\n/*------------  You MUST implement the following functions  ----------------*/\n/*------------        if porting to a new platform.         ----------------*/\n/*------------     (see platform/unix.c for an example)     ----------------*/\n/*------------                                              ----------------*/\n/*--------------------------------------------------------------------------*/\n/*--------------------------------------------------------------------------*/\n\n\n/*\n * The dir separator; '/' on unix, '\\\\' on win32, \":\" on MacOS, etc...\n *  Obviously, this isn't a function. If you need more than one char for this,\n *  you'll need to pull some old pieces of PhysicsFS out of revision control.\n */\n#if defined(PHYSFS_PLATFORM_WINDOWS) || defined(PHYSFS_PLATFORM_OS2)\n#define __PHYSFS_platformDirSeparator '\\\\'\n#else\n#define __PHYSFS_STANDARD_DIRSEP 1\n#define __PHYSFS_platformDirSeparator '/'\n#endif\n\n/*\n * Initialize the platform. This is called when PHYSFS_init() is called from\n *  the application.\n *\n * Return zero if there was a catastrophic failure (which prevents you from\n *  functioning at all), and non-zero otherwise.\n */\nint __PHYSFS_platformInit(void);\n\n\n/*\n * Deinitialize the platform. This is called when PHYSFS_deinit() is called\n *  from the application. You can use this to clean up anything you've\n *  allocated in your platform driver.\n */\nvoid __PHYSFS_platformDeinit(void);\n\n\n/*\n * Open a file for reading. (filename) is in platform-dependent notation. The\n *  file pointer should be positioned on the first byte of the file.\n *\n * The return value will be some platform-specific datatype that is opaque to\n *  the caller; it could be a (FILE *) under Unix, or a (HANDLE *) under win32.\n *\n * The same file can be opened for read multiple times, and each should have\n *  a unique file handle; this is frequently employed to prevent race\n *  conditions in the archivers.\n *\n * Call PHYSFS_setErrorCode() and return (NULL) if the file can't be opened.\n */\nvoid *__PHYSFS_platformOpenRead(const char *filename);\n\n\n/*\n * Open a file for writing. (filename) is in platform-dependent notation. If\n *  the file exists, it should be truncated to zero bytes, and if it doesn't\n *  exist, it should be created as a zero-byte file. The file pointer should\n *  be positioned on the first byte of the file.\n *\n * The return value will be some platform-specific datatype that is opaque to\n *  the caller; it could be a (FILE *) under Unix, or a (HANDLE *) under win32,\n *  etc.\n *\n * Opening a file for write multiple times has undefined results.\n *\n * Call PHYSFS_setErrorCode() and return (NULL) if the file can't be opened.\n */\nvoid *__PHYSFS_platformOpenWrite(const char *filename);\n\n\n/*\n * Open a file for appending. (filename) is in platform-dependent notation. If\n *  the file exists, the file pointer should be place just past the end of the\n *  file, so that the first write will be one byte after the current end of\n *  the file. If the file doesn't exist, it should be created as a zero-byte\n *  file. The file pointer should be positioned on the first byte of the file.\n *\n * The return value will be some platform-specific datatype that is opaque to\n *  the caller; it could be a (FILE *) under Unix, or a (HANDLE *) under win32,\n *  etc.\n *\n * Opening a file for append multiple times has undefined results.\n *\n * Call PHYSFS_setErrorCode() and return (NULL) if the file can't be opened.\n */\nvoid *__PHYSFS_platformOpenAppend(const char *filename);\n\n/*\n * Read more data from a platform-specific file handle. (opaque) should be\n *  cast to whatever data type your platform uses. Read a maximum of (len)\n *  8-bit bytes to the area pointed to by (buf). If there isn't enough data\n *  available, return the number of bytes read, and position the file pointer\n *  immediately after those bytes.\n *  On success, return (len) and position the file pointer immediately past\n *  the end of the last read byte. Return (-1) if there is a catastrophic\n *  error, and call PHYSFS_setErrorCode() to describe the problem; the file\n *  pointer should not move in such a case. A partial read is success; only\n *  return (-1) on total failure; presumably, the next read call after a\n *  partial read will fail as such.\n */\nPHYSFS_sint64 __PHYSFS_platformRead(void *opaque, void *buf, PHYSFS_uint64 len);\n\n/*\n * Write more data to a platform-specific file handle. (opaque) should be\n *  cast to whatever data type your platform uses. Write a maximum of (len)\n *  8-bit bytes from the area pointed to by (buffer). If there is a problem,\n *  return the number of bytes written, and position the file pointer\n *  immediately after those bytes. Return (-1) if there is a catastrophic\n *  error, and call PHYSFS_setErrorCode() to describe the problem; the file\n *  pointer should not move in such a case. A partial write is success; only\n *  return (-1) on total failure; presumably, the next write call after a\n *  partial write will fail as such.\n */\nPHYSFS_sint64 __PHYSFS_platformWrite(void *opaque, const void *buffer,\n                                     PHYSFS_uint64 len);\n\n/*\n * Set the file pointer to a new position. (opaque) should be cast to\n *  whatever data type your platform uses. (pos) specifies the number\n *  of 8-bit bytes to seek to from the start of the file. Seeking past the\n *  end of the file is an error condition, and you should check for it.\n *\n * Not all file types can seek; this is to be expected by the caller.\n *\n * On error, call PHYSFS_setErrorCode() and return zero. On success, return\n *  a non-zero value.\n */\nint __PHYSFS_platformSeek(void *opaque, PHYSFS_uint64 pos);\n\n\n/*\n * Get the file pointer's position, in an 8-bit byte offset from the start of\n *  the file. (opaque) should be cast to whatever data type your platform\n *  uses.\n *\n * Not all file types can \"tell\"; this is to be expected by the caller.\n *\n * On error, call PHYSFS_setErrorCode() and return -1. On success, return >= 0.\n */\nPHYSFS_sint64 __PHYSFS_platformTell(void *opaque);\n\n\n/*\n * Determine the current size of a file, in 8-bit bytes, from an open file.\n *\n * The caller expects that this information may not be available for all\n *  file types on all platforms.\n *\n * Return -1 if you can't do it, and call PHYSFS_setErrorCode(). Otherwise,\n *  return the file length in 8-bit bytes.\n */\nPHYSFS_sint64 __PHYSFS_platformFileLength(void *handle);\n\n\n/*\n * Read filesystem metadata for a specific path.\n *\n * This needs to fill in all the fields of (stat). For fields that might not\n *  mean anything on a platform (access time, perhaps), choose a reasonable\n *  default. if (follow), we want to follow symlinks and stat what they\n *  link to and not the link itself.\n *\n *  Return zero on failure, non-zero on success.\n */\nint __PHYSFS_platformStat(const char *fn, PHYSFS_Stat *stat, const int follow);\n\n/*\n * Flush any pending writes to disk. (opaque) should be cast to whatever data\n *  type your platform uses. Be sure to check for errors; the caller expects\n *  that this function can fail if there was a flushing error, etc.\n *\n *  Return zero on failure, non-zero on success.\n */\nint __PHYSFS_platformFlush(void *opaque);\n\n/*\n * Close file and deallocate resources. (opaque) should be cast to whatever\n *  data type your platform uses. This should close the file in any scenario:\n *  flushing is a separate function call, and this function should never fail.\n *\n * You should clean up all resources associated with (opaque); the pointer\n *  will be considered invalid after this call.\n */\nvoid __PHYSFS_platformClose(void *opaque);\n\n/*\n * Platform implementation of PHYSFS_getCdRomDirsCallback()...\n *  CD directories are discovered and reported to the callback one at a time.\n *  Pointers passed to the callback are assumed to be invalid to the\n *  application after the callback returns, so you can free them or whatever.\n *  Callback does not assume results will be sorted in any meaningful way.\n */\nvoid __PHYSFS_platformDetectAvailableCDs(PHYSFS_StringCallback cb, void *data);\n\n/*\n * Calculate the base dir, if your platform needs special consideration.\n *  Just return NULL if the standard routines will suffice. (see\n *  calculateBaseDir() in physfs.c ...)\n * Your string must end with a dir separator if you don't return NULL.\n *  Caller will allocator.Free() the retval if it's not NULL.\n */\nchar *__PHYSFS_platformCalcBaseDir(const char *argv0);\n\n/*\n * Get the platform-specific user dir.\n * As of PhysicsFS 2.1, returning NULL means fatal error.\n * Your string must end with a dir separator if you don't return NULL.\n *  Caller will allocator.Free() the retval if it's not NULL.\n */\nchar *__PHYSFS_platformCalcUserDir(void);\n\n\n/* This is the cached version from PHYSFS_init(). This is a fast call. */\nconst char *__PHYSFS_getUserDir(void);  /* not deprecated internal version. */\n\n\n/*\n * Get the platform-specific pref dir.\n * Returning NULL means fatal error.\n * Your string must end with a dir separator if you don't return NULL.\n *  Caller will allocator.Free() the retval if it's not NULL.\n *  Caller will make missing directories if necessary; this just reports\n *   the final path.\n */\nchar *__PHYSFS_platformCalcPrefDir(const char *org, const char *app);\n\n\n/*\n * Return a pointer that uniquely identifies the current thread.\n *  On a platform without threading, (0x1) will suffice. These numbers are\n *  arbitrary; the only requirement is that no two threads have the same\n *  pointer.\n */\nvoid *__PHYSFS_platformGetThreadID(void);\n\n\n/*\n * Enumerate a directory of files. This follows the rules for the\n *  PHYSFS_Archiver::enumerate() method, except that the (dirName) that is\n *  passed to this function is converted to platform-DEPENDENT notation by\n *  the caller. The PHYSFS_Archiver version uses platform-independent\n *  notation. Note that \".\", \"..\", and other meta-entries should always\n *  be ignored.\n */\nPHYSFS_EnumerateCallbackResult __PHYSFS_platformEnumerate(const char *dirname,\n                               PHYSFS_EnumerateCallback callback,\n                               const char *origdir, void *callbackdata);\n\n/*\n * Make a directory in the actual filesystem. (path) is specified in\n *  platform-dependent notation. On error, return zero and set the error\n *  message. Return non-zero on success.\n */\nint __PHYSFS_platformMkDir(const char *path);\n\n\n/*\n * Remove a file or directory entry in the actual filesystem. (path) is\n *  specified in platform-dependent notation. Note that this deletes files\n *  _and_ directories, so you might need to do some determination.\n *  Non-empty directories should report an error and not delete themselves\n *  or their contents.\n *\n * Deleting a symlink should remove the link, not what it points to.\n *\n * On error, return zero and set the error message. Return non-zero on success.\n */\nint __PHYSFS_platformDelete(const char *path);\n\n\n/*\n * Create a platform-specific mutex. This can be whatever datatype your\n *  platform uses for mutexes, but it is cast to a (void *) for abstractness.\n *\n * Return (NULL) if you couldn't create one. Systems without threads can\n *  return any arbitrary non-NULL value.\n */\nvoid *__PHYSFS_platformCreateMutex(void);\n\n/*\n * Destroy a platform-specific mutex, and clean up any resources associated\n *  with it. (mutex) is a value previously returned by\n *  __PHYSFS_platformCreateMutex(). This can be a no-op on single-threaded\n *  platforms.\n */\nvoid __PHYSFS_platformDestroyMutex(void *mutex);\n\n/*\n * Grab possession of a platform-specific mutex. Mutexes should be recursive;\n *  that is, the same thread should be able to call this function multiple\n *  times in a row without causing a deadlock. This function should block \n *  until a thread can gain possession of the mutex.\n *\n * Return non-zero if the mutex was grabbed, zero if there was an \n *  unrecoverable problem grabbing it (this should not be a matter of \n *  timing out! We're talking major system errors; block until the mutex \n *  is available otherwise.)\n *\n * _DO NOT_ call PHYSFS_setErrorCode() in here! Since setErrorCode calls this\n *  function, you'll cause an infinite recursion. This means you can't\n *  use the BAIL_*MACRO* macros, either.\n */\nint __PHYSFS_platformGrabMutex(void *mutex);\n\n/*\n * Relinquish possession of the mutex when this method has been called \n *  once for each time that platformGrabMutex was called. Once possession has\n *  been released, the next thread in line to grab the mutex (if any) may\n *  proceed.\n *\n * _DO NOT_ call PHYSFS_setErrorCode() in here! Since setErrorCode calls this\n *  function, you'll cause an infinite recursion. This means you can't\n *  use the BAIL_*MACRO* macros, either.\n */\nvoid __PHYSFS_platformReleaseMutex(void *mutex);\n\n\n/* !!! FIXME: move to public API? */\nPHYSFS_uint32 __PHYSFS_utf8codepoint(const char **_str);\n\n\n#if PHYSFS_HAVE_PRAGMA_VISIBILITY\n#pragma GCC visibility pop\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n\n/* end of physfs_internal.h ... */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_lzmasdk.h",
    "content": "#ifndef _INCLUDE_PHYSFS_LZMASDK_H_\n#define _INCLUDE_PHYSFS_LZMASDK_H_\n\n/* This is just a bunch of the LZMA SDK mushed together into one header.\nThis code is all public domain, and mostly (if not entirely) written by\nIgor Pavlov. http://www.7-zip.org/sdk.html\n--ryan. */\n\n\n\n/* 7zTypes.h -- Basic types\n2013-11-12 : Igor Pavlov : Public domain */\n\n#ifndef __7Z_TYPES_H\n#define __7Z_TYPES_H\n\n#ifdef _WIN32\n/* #include <windows.h> */\n#endif\n\n#include <stddef.h>\n\n#ifndef EXTERN_C_BEGIN\n#ifdef __cplusplus\n#define EXTERN_C_BEGIN extern \"C\" {\n#define EXTERN_C_END }\n#else\n#define EXTERN_C_BEGIN\n#define EXTERN_C_END\n#endif\n#endif\n\nEXTERN_C_BEGIN\n\n#define SZ_OK 0\n\n#define SZ_ERROR_DATA 1\n#define SZ_ERROR_MEM 2\n#define SZ_ERROR_CRC 3\n#define SZ_ERROR_UNSUPPORTED 4\n#define SZ_ERROR_PARAM 5\n#define SZ_ERROR_INPUT_EOF 6\n#define SZ_ERROR_OUTPUT_EOF 7\n#define SZ_ERROR_READ 8\n#define SZ_ERROR_WRITE 9\n#define SZ_ERROR_PROGRESS 10\n#define SZ_ERROR_FAIL 11\n#define SZ_ERROR_THREAD 12\n\n#define SZ_ERROR_ARCHIVE 16\n#define SZ_ERROR_NO_ARCHIVE 17\n\ntypedef int SRes;\n\n#ifdef _WIN32\n/* typedef DWORD WRes; */\ntypedef unsigned WRes;\n#else\ntypedef int WRes;\n#endif\n\n#ifndef RINOK\n#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; }\n#endif\n\ntypedef unsigned char Byte;\ntypedef short Int16;\ntypedef unsigned short UInt16;\n\n#ifdef _LZMA_UINT32_IS_ULONG\ntypedef long Int32;\ntypedef unsigned long UInt32;\n#else\ntypedef int Int32;\ntypedef unsigned int UInt32;\n#endif\n\n#ifdef _SZ_NO_INT_64\n\n/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers.\n   NOTES: Some code will work incorrectly in that case! */\n\ntypedef long Int64;\ntypedef unsigned long UInt64;\n\n#else\n\n#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__WATCOMC__)\ntypedef __int64 Int64;\ntypedef unsigned __int64 UInt64;\n#define UINT64_CONST(n) n ## ui64\n#else\ntypedef long long int Int64;\ntypedef unsigned long long int UInt64;\n#define UINT64_CONST(n) n ## ULL\n#endif\n\n#endif\n\n#ifdef _LZMA_NO_SYSTEM_SIZE_T\ntypedef UInt32 SizeT;\n#else\ntypedef size_t SizeT;\n#endif\n\ntypedef int Bool;\n#define True 1\n#define False 0\n\n\n#ifdef _WIN32\n#define MY_STD_CALL __stdcall\n#else\n#define MY_STD_CALL\n#endif\n\n#ifdef _MSC_VER\n\n#if _MSC_VER >= 1300\n#define MY_NO_INLINE __declspec(noinline)\n#else\n#define MY_NO_INLINE\n#endif\n\n#define MY_CDECL __cdecl\n#define MY_FAST_CALL __fastcall\n\n#else\n\n#define MY_NO_INLINE\n#define MY_CDECL\n#define MY_FAST_CALL\n\n#endif\n\n\n/* The following interfaces use first parameter as pointer to structure */\n\ntypedef struct\n{\n  Byte (*Read)(void *p); /* reads one byte, returns 0 in case of EOF or error */\n} IByteIn;\n\ntypedef struct\n{\n  void (*Write)(void *p, Byte b);\n} IByteOut;\n\ntypedef struct\n{\n  SRes (*Read)(void *p, void *buf, size_t *size);\n    /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.\n       (output(*size) < input(*size)) is allowed */\n} ISeqInStream;\n\ntypedef struct\n{\n  size_t (*Write)(void *p, const void *buf, size_t size);\n    /* Returns: result - the number of actually written bytes.\n       (result < size) means error */\n} ISeqOutStream;\n\ntypedef enum\n{\n  SZ_SEEK_SET = 0,\n  SZ_SEEK_CUR = 1,\n  SZ_SEEK_END = 2\n} ESzSeek;\n\ntypedef struct\n{\n  SRes (*Read)(void *p, void *buf, size_t *size);  /* same as ISeqInStream::Read */\n  SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);\n} ISeekInStream;\n\ntypedef struct\n{\n  SRes (*Look)(void *p, const void **buf, size_t *size);\n    /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.\n       (output(*size) > input(*size)) is not allowed\n       (output(*size) < input(*size)) is allowed */\n  SRes (*Skip)(void *p, size_t offset);\n    /* offset must be <= output(*size) of Look */\n\n  SRes (*Read)(void *p, void *buf, size_t *size);\n    /* reads directly (without buffer). It's same as ISeqInStream::Read */\n  SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);\n} ILookInStream;\n\nstatic SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset);\n\n/* reads via ILookInStream::Read */\nstatic SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType);\nstatic SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size);\n\n#define LookToRead_BUF_SIZE (1 << 14)\n\ntypedef struct\n{\n  ILookInStream s;\n  ISeekInStream *realStream;\n  size_t pos;\n  size_t size;\n  Byte buf[LookToRead_BUF_SIZE];\n} CLookToRead;\n\nstatic void LookToRead_CreateVTable(CLookToRead *p, int lookahead);\nstatic void LookToRead_Init(CLookToRead *p);\n\ntypedef struct\n{\n  ISeqInStream s;\n  ILookInStream *realStream;\n} CSecToLook;\n\ntypedef struct\n{\n  ISeqInStream s;\n  ILookInStream *realStream;\n} CSecToRead;\n\ntypedef struct\n{\n  SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize);\n    /* Returns: result. (result != SZ_OK) means break.\n       Value (UInt64)(Int64)-1 for size means unknown value. */\n} ICompressProgress;\n\ntypedef struct\n{\n  void *(*Alloc)(void *p, size_t size);\n  void (*Free)(void *p, void *address); /* address can be 0 */\n} ISzAlloc;\n\n#define IAlloc_Alloc(p, size) (p)->Alloc((p), size)\n#define IAlloc_Free(p, a) (p)->Free((p), a)\n\n#ifdef _WIN32\n\n#define CHAR_PATH_SEPARATOR '\\\\'\n#define WCHAR_PATH_SEPARATOR L'\\\\'\n#define STRING_PATH_SEPARATOR \"\\\\\"\n#define WSTRING_PATH_SEPARATOR L\"\\\\\"\n\n#else\n\n#define CHAR_PATH_SEPARATOR '/'\n#define WCHAR_PATH_SEPARATOR L'/'\n#define STRING_PATH_SEPARATOR \"/\"\n#define WSTRING_PATH_SEPARATOR L\"/\"\n\n#endif\n\nEXTERN_C_END\n\n#endif\n\n/* 7z.h -- 7z interface\n2015-11-18 : Igor Pavlov : Public domain */\n\n#ifndef __7Z_H\n#define __7Z_H\n\n/*#include \"7zTypes.h\"*/\n\nEXTERN_C_BEGIN\n\n#define k7zStartHeaderSize 0x20\n#define k7zSignatureSize 6\n\nstatic const Byte k7zSignature[k7zSignatureSize];\n\ntypedef struct\n{\n  const Byte *Data;\n  size_t Size;\n} CSzData;\n\n/* CSzCoderInfo & CSzFolder support only default methods */\n\ntypedef struct\n{\n  size_t PropsOffset;\n  UInt32 MethodID;\n  Byte NumStreams;\n  Byte PropsSize;\n} CSzCoderInfo;\n\ntypedef struct\n{\n  UInt32 InIndex;\n  UInt32 OutIndex;\n} CSzBond;\n\n#define SZ_NUM_CODERS_IN_FOLDER_MAX 4\n#define SZ_NUM_BONDS_IN_FOLDER_MAX 3\n#define SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX 4\n\ntypedef struct\n{\n  UInt32 NumCoders;\n  UInt32 NumBonds;\n  UInt32 NumPackStreams;\n  UInt32 UnpackStream;\n  UInt32 PackStreams[SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX];\n  CSzBond Bonds[SZ_NUM_BONDS_IN_FOLDER_MAX];\n  CSzCoderInfo Coders[SZ_NUM_CODERS_IN_FOLDER_MAX];\n} CSzFolder;\n\n\nstatic SRes SzGetNextFolderItem(CSzFolder *f, CSzData *sd);\n\ntypedef struct\n{\n  UInt32 Low;\n  UInt32 High;\n} CNtfsFileTime;\n\ntypedef struct\n{\n  Byte *Defs; /* MSB 0 bit numbering */\n  UInt32 *Vals;\n} CSzBitUi32s;\n\ntypedef struct\n{\n  Byte *Defs; /* MSB 0 bit numbering */\n  /* UInt64 *Vals; */\n  CNtfsFileTime *Vals;\n} CSzBitUi64s;\n\n#define SzBitArray_Check(p, i) (((p)[(i) >> 3] & (0x80 >> ((i) & 7))) != 0)\n\n#define SzBitWithVals_Check(p, i) ((p)->Defs && ((p)->Defs[(i) >> 3] & (0x80 >> ((i) & 7))) != 0)\n\ntypedef struct\n{\n  UInt32 NumPackStreams;\n  UInt32 NumFolders;\n\n  UInt64 *PackPositions;          /* NumPackStreams + 1 */\n  CSzBitUi32s FolderCRCs;         /* NumFolders */\n\n  size_t *FoCodersOffsets;        /* NumFolders + 1 */\n  UInt32 *FoStartPackStreamIndex; /* NumFolders + 1 */\n  UInt32 *FoToCoderUnpackSizes;   /* NumFolders + 1 */\n  Byte *FoToMainUnpackSizeIndex;  /* NumFolders */\n  UInt64 *CoderUnpackSizes;       /* for all coders in all folders */\n\n  Byte *CodersData;\n} CSzAr;\n\nstatic UInt64 SzAr_GetFolderUnpackSize(const CSzAr *p, UInt32 folderIndex);\n\nstatic SRes SzAr_DecodeFolder(const CSzAr *p, UInt32 folderIndex,\n    ILookInStream *stream, UInt64 startPos,\n    Byte *outBuffer, size_t outSize,\n    ISzAlloc *allocMain);\n\ntypedef struct\n{\n  CSzAr db;\n\n  UInt64 startPosAfterHeader;\n  UInt64 dataPos;\n  \n  UInt32 NumFiles;\n\n  UInt64 *UnpackPositions;  /* NumFiles + 1 */\n  /* Byte *IsEmptyFiles; */\n  Byte *IsDirs;\n  CSzBitUi32s CRCs;\n\n  CSzBitUi32s Attribs;\n  /* CSzBitUi32s Parents; */\n  CSzBitUi64s MTime;\n  CSzBitUi64s CTime;\n\n  UInt32 *FolderToFile;   /* NumFolders + 1 */\n  UInt32 *FileToFolder;   /* NumFiles */\n\n  size_t *FileNameOffsets; /* in 2-byte steps */\n  Byte *FileNames;  /* UTF-16-LE */\n} CSzArEx;\n\n#define SzArEx_IsDir(p, i) (SzBitArray_Check((p)->IsDirs, i))\n\n#define SzArEx_GetFileSize(p, i) ((p)->UnpackPositions[(i) + 1] - (p)->UnpackPositions[i])\n\nstatic void SzArEx_Init(CSzArEx *p);\nstatic void SzArEx_Free(CSzArEx *p, ISzAlloc *alloc);\n\n/*\nif dest == NULL, the return value specifies the required size of the buffer,\n  in 16-bit characters, including the null-terminating character.\nif dest != NULL, the return value specifies the number of 16-bit characters that\n  are written to the dest, including the null-terminating character. */\n\nstatic size_t SzArEx_GetFileNameUtf16(const CSzArEx *p, size_t fileIndex, UInt16 *dest);\n\n/*\nsize_t SzArEx_GetFullNameLen(const CSzArEx *p, size_t fileIndex);\nUInt16 *SzArEx_GetFullNameUtf16_Back(const CSzArEx *p, size_t fileIndex, UInt16 *dest);\n*/\n\n\n\n/*\n  SzArEx_Extract extracts file from archive\n\n  *outBuffer must be 0 before first call for each new archive.\n\n  Extracting cache:\n    If you need to decompress more than one file, you can send\n    these values from previous call:\n      *blockIndex,\n      *outBuffer,\n      *outBufferSize\n    You can consider \"*outBuffer\" as cache of solid block. If your archive is solid,\n    it will increase decompression speed.\n  \n    If you use external function, you can declare these 3 cache variables\n    (blockIndex, outBuffer, outBufferSize) as static in that external function.\n    \n    Free *outBuffer and set *outBuffer to 0, if you want to flush cache.\n*/\n\nstatic SRes SzArEx_Extract(\n    const CSzArEx *db,\n    ILookInStream *inStream,\n    UInt32 fileIndex,         /* index of file */\n    UInt32 *blockIndex,       /* index of solid block */\n    Byte **outBuffer,         /* pointer to pointer to output buffer (allocated with allocMain) */\n    size_t *outBufferSize,    /* buffer size for output buffer */\n    size_t *offset,           /* offset of stream for required file in *outBuffer */\n    size_t *outSizeProcessed, /* size of file in *outBuffer */\n    ISzAlloc *allocMain,\n    ISzAlloc *allocTemp);\n\n\n/*\nSzArEx_Open Errors:\nSZ_ERROR_NO_ARCHIVE\nSZ_ERROR_ARCHIVE\nSZ_ERROR_UNSUPPORTED\nSZ_ERROR_MEM\nSZ_ERROR_CRC\nSZ_ERROR_INPUT_EOF\nSZ_ERROR_FAIL\n*/\n\nstatic SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream,\n    ISzAlloc *allocMain, ISzAlloc *allocTemp);\n\nEXTERN_C_END\n\n#endif\n\n/* 7zCrc.h -- CRC32 calculation\n2013-01-18 : Igor Pavlov : Public domain */\n\n#ifndef __7Z_CRC_H\n#define __7Z_CRC_H\n\n/*#include \"7zTypes.h\" */\n\nEXTERN_C_BEGIN\n\n/* Call CrcGenerateTable one time before other CRC functions */\nstatic void MY_FAST_CALL CrcGenerateTable(void);\n\n#define CRC_INIT_VAL 0xFFFFFFFF\n#define CRC_GET_DIGEST(crc) ((crc) ^ CRC_INIT_VAL)\n#define CRC_UPDATE_BYTE(crc, b) (g_CrcTable[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8))\n\nstatic UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size);\n\nEXTERN_C_END\n\n#endif\n\n/* CpuArch.h -- CPU specific code\n2016-06-09: Igor Pavlov : Public domain */\n\n#ifndef __CPU_ARCH_H\n#define __CPU_ARCH_H\n\n/*#include \"7zTypes.h\"*/\n\nEXTERN_C_BEGIN\n\n/*\nMY_CPU_LE means that CPU is LITTLE ENDIAN.\nMY_CPU_BE means that CPU is BIG ENDIAN.\nIf MY_CPU_LE and MY_CPU_BE are not defined, we don't know about ENDIANNESS of platform.\n\nMY_CPU_LE_UNALIGN means that CPU is LITTLE ENDIAN and CPU supports unaligned memory accesses.\n*/\n\n#if defined(_M_X64) \\\n   || defined(_M_AMD64) \\\n   || defined(__x86_64__) \\\n   || defined(__AMD64__) \\\n   || defined(__amd64__)\n  #define MY_CPU_AMD64\n#endif\n\n#if defined(MY_CPU_AMD64) \\\n    || defined(_M_ARM64) \\\n    || defined(_M_IA64) \\\n    || defined(__AARCH64EL__) \\\n    || defined(__AARCH64EB__) \\\n    || defined(_M_ARM64)\n  #define MY_CPU_64BIT\n#endif\n\n#if defined(_M_IX86) || defined(__i386__)\n#define MY_CPU_X86\n#endif\n\n#if defined(MY_CPU_X86) || defined(MY_CPU_AMD64)\n#define MY_CPU_X86_OR_AMD64\n#endif\n\n#if defined(MY_CPU_X86) \\\n    || defined(_M_ARM) \\\n    || defined(__ARMEL__) \\\n    || defined(__THUMBEL__) \\\n    || defined(__ARMEB__) \\\n    || defined(__THUMBEB__)\n  #define MY_CPU_32BIT\n#endif\n\n#if defined(_WIN32) && (defined(_M_ARM) || defined(_M_ARM64))\n#define MY_CPU_ARM_LE\n#elif defined(_WIN64) && defined(_M_ARM64)\n#define MY_CPU_ARM_LE\n#endif\n\n#if defined(_WIN32) && defined(_M_IA64)\n#define MY_CPU_IA64_LE\n#endif\n\n#if defined(MY_CPU_X86_OR_AMD64) \\\n    || defined(MY_CPU_ARM_LE) \\\n    || defined(MY_CPU_IA64_LE) \\\n    || defined(__LITTLE_ENDIAN__) \\\n    || defined(__ARMEL__) \\\n    || defined(__THUMBEL__) \\\n    || defined(__AARCH64EL__) \\\n    || defined(__MIPSEL__) \\\n    || defined(__MIPSEL) \\\n    || defined(_MIPSEL) \\\n    || defined(__BFIN__) \\\n    || (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__))\n  #define MY_CPU_LE\n#endif\n\n#if defined(__BIG_ENDIAN__) \\\n    || defined(__ARMEB__) \\\n    || defined(__THUMBEB__) \\\n    || defined(__AARCH64EB__) \\\n    || defined(__MIPSEB__) \\\n    || defined(__MIPSEB) \\\n    || defined(_MIPSEB) \\\n    || defined(__m68k__) \\\n    || defined(__s390__) \\\n    || defined(__s390x__) \\\n    || defined(__zarch__) \\\n    || (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__))\n  #define MY_CPU_BE\n#endif\n\n#if defined(MY_CPU_LE) && defined(MY_CPU_BE)\nStop_Compiling_Bad_Endian\n#endif\n\n\n#ifdef MY_CPU_LE\n  #if defined(MY_CPU_X86_OR_AMD64) \\\n      /* || defined(__AARCH64EL__) */\n    /*#define MY_CPU_LE_UNALIGN*/\n  #endif\n#endif\n\n\n#ifdef MY_CPU_LE_UNALIGN\n\n#define GetUi16(p) (*(const UInt16 *)(const void *)(p))\n#define GetUi32(p) (*(const UInt32 *)(const void *)(p))\n#define GetUi64(p) (*(const UInt64 *)(const void *)(p))\n\n#define SetUi16(p, v) { *(UInt16 *)(p) = (v); }\n#define SetUi32(p, v) { *(UInt32 *)(p) = (v); }\n#define SetUi64(p, v) { *(UInt64 *)(p) = (v); }\n\n#else\n\n#define GetUi16(p) ( (UInt16) ( \\\n             ((const Byte *)(p))[0] | \\\n    ((UInt16)((const Byte *)(p))[1] << 8) ))\n\n#define GetUi32(p) ( \\\n             ((const Byte *)(p))[0]        | \\\n    ((UInt32)((const Byte *)(p))[1] <<  8) | \\\n    ((UInt32)((const Byte *)(p))[2] << 16) | \\\n    ((UInt32)((const Byte *)(p))[3] << 24))\n\n#define GetUi64(p) (GetUi32(p) | ((UInt64)GetUi32(((const Byte *)(p)) + 4) << 32))\n\n#define SetUi16(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v); \\\n    _ppp_[0] = (Byte)_vvv_; \\\n    _ppp_[1] = (Byte)(_vvv_ >> 8); }\n\n#define SetUi32(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v); \\\n    _ppp_[0] = (Byte)_vvv_; \\\n    _ppp_[1] = (Byte)(_vvv_ >> 8); \\\n    _ppp_[2] = (Byte)(_vvv_ >> 16); \\\n    _ppp_[3] = (Byte)(_vvv_ >> 24); }\n\n#define SetUi64(p, v) { Byte *_ppp2_ = (Byte *)(p); UInt64 _vvv2_ = (v); \\\n    SetUi32(_ppp2_    , (UInt32)_vvv2_); \\\n    SetUi32(_ppp2_ + 4, (UInt32)(_vvv2_ >> 32)); }\n\n#endif\n\n\n#if defined(MY_CPU_LE_UNALIGN) && /* defined(_WIN64) && */ (_MSC_VER >= 1300)\n\n/* Note: we use bswap instruction, that is unsupported in 386 cpu */\n\n#include <stdlib.h>\n\n#pragma intrinsic(_byteswap_ulong)\n#pragma intrinsic(_byteswap_uint64)\n#define GetBe32(p) _byteswap_ulong(*(const UInt32 *)(const Byte *)(p))\n#define GetBe64(p) _byteswap_uint64(*(const UInt64 *)(const Byte *)(p))\n\n#define SetBe32(p, v) (*(UInt32 *)(void *)(p)) = _byteswap_ulong(v)\n\n#elif defined(MY_CPU_LE_UNALIGN) && defined (__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))\n\n#define GetBe32(p) __builtin_bswap32(*(const UInt32 *)(const Byte *)(p))\n#define GetBe64(p) __builtin_bswap64(*(const UInt64 *)(const Byte *)(p))\n\n#define SetBe32(p, v) (*(UInt32 *)(void *)(p)) = __builtin_bswap32(v)\n\n#else\n\n#define GetBe32(p) ( \\\n    ((UInt32)((const Byte *)(p))[0] << 24) | \\\n    ((UInt32)((const Byte *)(p))[1] << 16) | \\\n    ((UInt32)((const Byte *)(p))[2] <<  8) | \\\n             ((const Byte *)(p))[3] )\n\n#define GetBe64(p) (((UInt64)GetBe32(p) << 32) | GetBe32(((const Byte *)(p)) + 4))\n\n#define SetBe32(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v); \\\n    _ppp_[0] = (Byte)(_vvv_ >> 24); \\\n    _ppp_[1] = (Byte)(_vvv_ >> 16); \\\n    _ppp_[2] = (Byte)(_vvv_ >> 8); \\\n    _ppp_[3] = (Byte)_vvv_; }\n\n#endif\n\n\n#define GetBe16(p) ( (UInt16) ( \\\n    ((UInt16)((const Byte *)(p))[0] << 8) | \\\n             ((const Byte *)(p))[1] ))\n\n\n\n#ifdef MY_CPU_X86_OR_AMD64\n\ntypedef struct\n{\n  UInt32 maxFunc;\n  UInt32 vendor[3];\n  UInt32 ver;\n  UInt32 b;\n  UInt32 c;\n  UInt32 d;\n} Cx86cpuid;\n\nenum\n{\n  CPU_FIRM_INTEL,\n  CPU_FIRM_AMD,\n  CPU_FIRM_VIA\n};\n\nstatic void MyCPUID(UInt32 function, UInt32 *a, UInt32 *b, UInt32 *c, UInt32 *d);\n\nstatic Bool x86cpuid_CheckAndRead(Cx86cpuid *p);\nstatic int x86cpuid_GetFirm(const Cx86cpuid *p);\n\n#define x86cpuid_GetFamily(ver) (((ver >> 16) & 0xFF0) | ((ver >> 8) & 0xF))\n#define x86cpuid_GetModel(ver)  (((ver >> 12) &  0xF0) | ((ver >> 4) & 0xF))\n#define x86cpuid_GetStepping(ver) (ver & 0xF)\n\nstatic Bool CPU_Is_InOrder();\n\n#endif\n\nEXTERN_C_END\n\n#endif\n\n/* 7zBuf.h -- Byte Buffer\n2013-01-18 : Igor Pavlov : Public domain */\n\n#ifndef __7Z_BUF_H\n#define __7Z_BUF_H\n\n/*#include \"7zTypes.h\" */\n\nEXTERN_C_BEGIN\n\ntypedef struct\n{\n  Byte *data;\n  size_t size;\n} CBuf;\n\nstatic void Buf_Init(CBuf *p);\nstatic int Buf_Create(CBuf *p, size_t size, ISzAlloc *alloc);\nstatic void Buf_Free(CBuf *p, ISzAlloc *alloc);\n\nEXTERN_C_END\n\n#endif\n\n\n/* Bcj2.h -- BCJ2 Converter for x86 code\n2014-11-10 : Igor Pavlov : Public domain */\n\n#ifndef __BCJ2_H\n#define __BCJ2_H\n\n/*#include \"7zTypes.h\" */\n\nEXTERN_C_BEGIN\n\n#define BCJ2_NUM_STREAMS 4\n\nenum\n{\n  BCJ2_STREAM_MAIN,\n  BCJ2_STREAM_CALL,\n  BCJ2_STREAM_JUMP,\n  BCJ2_STREAM_RC\n};\n\nenum\n{\n  BCJ2_DEC_STATE_ORIG_0 = BCJ2_NUM_STREAMS,\n  BCJ2_DEC_STATE_ORIG_1,\n  BCJ2_DEC_STATE_ORIG_2,\n  BCJ2_DEC_STATE_ORIG_3,\n  \n  BCJ2_DEC_STATE_ORIG,\n  BCJ2_DEC_STATE_OK\n};\n\nenum\n{\n  BCJ2_ENC_STATE_ORIG = BCJ2_NUM_STREAMS,\n  BCJ2_ENC_STATE_OK\n};\n\n\n#define BCJ2_IS_32BIT_STREAM(s) ((s) == BCJ2_STREAM_CALL || (s) == BCJ2_STREAM_JUMP)\n\n/*\nCBcj2Dec / CBcj2Enc\nbufs sizes:\n  BUF_SIZE(n) = lims[n] - bufs[n]\nbufs sizes for BCJ2_STREAM_CALL and BCJ2_STREAM_JUMP must be mutliply of 4:\n    (BUF_SIZE(BCJ2_STREAM_CALL) & 3) == 0\n    (BUF_SIZE(BCJ2_STREAM_JUMP) & 3) == 0\n*/\n\n/*\nCBcj2Dec:\ndest is allowed to overlap with bufs[BCJ2_STREAM_MAIN], with the following conditions:\n  bufs[BCJ2_STREAM_MAIN] >= dest &&\n  bufs[BCJ2_STREAM_MAIN] - dest >= tempReserv +\n        BUF_SIZE(BCJ2_STREAM_CALL) +\n        BUF_SIZE(BCJ2_STREAM_JUMP)\n     tempReserv = 0 : for first call of Bcj2Dec_Decode\n     tempReserv = 4 : for any other calls of Bcj2Dec_Decode\n  overlap with offset = 1 is not allowed\n*/\n\ntypedef struct\n{\n  const Byte *bufs[BCJ2_NUM_STREAMS];\n  const Byte *lims[BCJ2_NUM_STREAMS];\n  Byte *dest;\n  const Byte *destLim;\n\n  unsigned state; /* BCJ2_STREAM_MAIN has more priority than BCJ2_STATE_ORIG */\n\n  UInt32 ip;\n  Byte temp[4];\n  UInt32 range;\n  UInt32 code;\n  UInt16 probs[2 + 256];\n} CBcj2Dec;\n\nstatic void Bcj2Dec_Init(CBcj2Dec *p);\n\n/* Returns: SZ_OK or SZ_ERROR_DATA */\nstatic SRes Bcj2Dec_Decode(CBcj2Dec *p);\n\n#define Bcj2Dec_IsFinished(_p_) ((_p_)->code == 0)\n\n#define BCJ2_RELAT_LIMIT_NUM_BITS 26\n#define BCJ2_RELAT_LIMIT ((UInt32)1 << BCJ2_RELAT_LIMIT_NUM_BITS)\n\n/* limit for CBcj2Enc::fileSize variable */\n#define BCJ2_FileSize_MAX ((UInt32)1 << 31)\n\nEXTERN_C_END\n\n#endif\n\n/* Bra.h -- Branch converters for executables\n2013-01-18 : Igor Pavlov : Public domain */\n\n#ifndef __BRA_H\n#define __BRA_H\n\n/*#include \"7zTypes.h\"*/\n\nEXTERN_C_BEGIN\n\n/*\nThese functions convert relative addresses to absolute addresses\nin CALL instructions to increase the compression ratio.\n  \n  In:\n    data     - data buffer\n    size     - size of data\n    ip       - current virtual Instruction Pinter (IP) value\n    state    - state variable for x86 converter\n    encoding - 0 (for decoding), 1 (for encoding)\n  \n  Out:\n    state    - state variable for x86 converter\n\n  Returns:\n    The number of processed bytes. If you call these functions with multiple calls,\n    you must start next call with first byte after block of processed bytes.\n  \n  Type   Endian  Alignment  LookAhead\n  \n  x86    little      1          4\n  ARMT   little      2          2\n  ARM    little      4          0\n  PPC     big        4          0\n  SPARC   big        4          0\n  IA64   little     16          0\n\n  size must be >= Alignment + LookAhead, if it's not last block.\n  If (size < Alignment + LookAhead), converter returns 0.\n\n  Example:\n\n    UInt32 ip = 0;\n    for ()\n    {\n      ; size must be >= Alignment + LookAhead, if it's not last block\n      SizeT processed = Convert(data, size, ip, 1);\n      data += processed;\n      size -= processed;\n      ip += processed;\n    }\n*/\n\n#define x86_Convert_Init(state) { state = 0; }\nstatic SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding);\nstatic SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);\nstatic SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);\nstatic SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);\nstatic SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);\nstatic SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);\n\nEXTERN_C_END\n\n#endif\n\n/* Delta.h -- Delta converter\n2013-01-18 : Igor Pavlov : Public domain */\n\n#ifndef __DELTA_H\n#define __DELTA_H\n\n/*#include \"7zTypes.h\" */\n\nEXTERN_C_BEGIN\n\n#define DELTA_STATE_SIZE 256\n\nstatic void Delta_Init(Byte *state);\nstatic void Delta_Decode(Byte *state, unsigned delta, Byte *data, SizeT size);\n\nEXTERN_C_END\n\n#endif\n\n/* LzmaDec.h -- LZMA Decoder\n2013-01-18 : Igor Pavlov : Public domain */\n\n#ifndef __LZMA_DEC_H\n#define __LZMA_DEC_H\n\n/*#include \"7zTypes.h\"*/\n\nEXTERN_C_BEGIN\n\n/* #define _LZMA_PROB32 */\n/* _LZMA_PROB32 can increase the speed on some CPUs,\n   but memory usage for CLzmaDec::probs will be doubled in that case */\n\n#ifdef _LZMA_PROB32\n#define CLzmaProb UInt32\n#else\n#define CLzmaProb UInt16\n#endif\n\n\n/* ---------- LZMA Properties ---------- */\n\n#define LZMA_PROPS_SIZE 5\n\ntypedef struct _CLzmaProps\n{\n  unsigned lc, lp, pb;\n  UInt32 dicSize;\n} CLzmaProps;\n\n/* LzmaProps_Decode - decodes properties\nReturns:\n  SZ_OK\n  SZ_ERROR_UNSUPPORTED - Unsupported properties\n*/\n\nstatic SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size);\n\n\n/* ---------- LZMA Decoder state ---------- */\n\n/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case.\n   Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */\n\n#define LZMA_REQUIRED_INPUT_MAX 20\n\ntypedef struct\n{\n  CLzmaProps prop;\n  CLzmaProb *probs;\n  Byte *dic;\n  const Byte *buf;\n  UInt32 range, code;\n  SizeT dicPos;\n  SizeT dicBufSize;\n  UInt32 processedPos;\n  UInt32 checkDicSize;\n  unsigned state;\n  UInt32 reps[4];\n  unsigned remainLen;\n  int needFlush;\n  int needInitState;\n  UInt32 numProbs;\n  unsigned tempBufSize;\n  Byte tempBuf[LZMA_REQUIRED_INPUT_MAX];\n} CLzmaDec;\n\n#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; }\n\nstatic void LzmaDec_Init(CLzmaDec *p);\n\n/* There are two types of LZMA streams:\n     0) Stream with end mark. That end mark adds about 6 bytes to compressed size.\n     1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */\n\ntypedef enum\n{\n  LZMA_FINISH_ANY,   /* finish at any point */\n  LZMA_FINISH_END    /* block must be finished at the end */\n} ELzmaFinishMode;\n\n/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!!\n\n   You must use LZMA_FINISH_END, when you know that current output buffer\n   covers last bytes of block. In other cases you must use LZMA_FINISH_ANY.\n\n   If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK,\n   and output value of destLen will be less than output buffer size limit.\n   You can check status result also.\n\n   You can use multiple checks to test data integrity after full decompression:\n     1) Check Result and \"status\" variable.\n     2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize.\n     3) Check that output(srcLen) = compressedSize, if you know real compressedSize.\n        You must use correct finish mode in that case. */\n\ntypedef enum\n{\n  LZMA_STATUS_NOT_SPECIFIED,               /* use main error code instead */\n  LZMA_STATUS_FINISHED_WITH_MARK,          /* stream was finished with end mark. */\n  LZMA_STATUS_NOT_FINISHED,                /* stream was not finished */\n  LZMA_STATUS_NEEDS_MORE_INPUT,            /* you must provide more input bytes */\n  LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK  /* there is probability that stream was finished without end mark */\n} ELzmaStatus;\n\n/* ELzmaStatus is used only as output value for function call */\n\n\n/* ---------- Interfaces ---------- */\n\n/* There are 3 levels of interfaces:\n     1) Dictionary Interface\n     2) Buffer Interface\n     3) One Call Interface\n   You can select any of these interfaces, but don't mix functions from different\n   groups for same object. */\n\n\n/* There are two variants to allocate state for Dictionary Interface:\n     1) LzmaDec_Allocate / LzmaDec_Free\n     2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs\n   You can use variant 2, if you set dictionary buffer manually.\n   For Buffer Interface you must always use variant 1.\n\nLzmaDec_Allocate* can return:\n  SZ_OK\n  SZ_ERROR_MEM         - Memory allocation error\n  SZ_ERROR_UNSUPPORTED - Unsupported properties\n*/\n   \nstatic SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc);\nstatic void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc);\n\n/* ---------- Dictionary Interface ---------- */\n\n/* You can use it, if you want to eliminate the overhead for data copying from\n   dictionary to some other external buffer.\n   You must work with CLzmaDec variables directly in this interface.\n\n   STEPS:\n     LzmaDec_Constr()\n     LzmaDec_Allocate()\n     for (each new stream)\n     {\n       LzmaDec_Init()\n       while (it needs more decompression)\n       {\n         LzmaDec_DecodeToDic()\n         use data from CLzmaDec::dic and update CLzmaDec::dicPos\n       }\n     }\n     LzmaDec_Free()\n*/\n\n/* LzmaDec_DecodeToDic\n   \n   The decoding to internal dictionary buffer (CLzmaDec::dic).\n   You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!!\n\nfinishMode:\n  It has meaning only if the decoding reaches output limit (dicLimit).\n  LZMA_FINISH_ANY - Decode just dicLimit bytes.\n  LZMA_FINISH_END - Stream must be finished after dicLimit.\n\nReturns:\n  SZ_OK\n    status:\n      LZMA_STATUS_FINISHED_WITH_MARK\n      LZMA_STATUS_NOT_FINISHED\n      LZMA_STATUS_NEEDS_MORE_INPUT\n      LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK\n  SZ_ERROR_DATA - Data error\n*/\n\nstatic SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit,\n    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);\n\nEXTERN_C_END\n\n#endif\n\n/* Lzma2Dec.h -- LZMA2 Decoder\n2015-05-13 : Igor Pavlov : Public domain */\n\n#ifndef __LZMA2_DEC_H\n#define __LZMA2_DEC_H\n\n/*#include \"LzmaDec.h\"*/\n\nEXTERN_C_BEGIN\n\n/* ---------- State Interface ---------- */\n\ntypedef struct\n{\n  CLzmaDec decoder;\n  UInt32 packSize;\n  UInt32 unpackSize;\n  unsigned state;\n  Byte control;\n  Bool needInitDic;\n  Bool needInitState;\n  Bool needInitProp;\n} CLzma2Dec;\n\n#define Lzma2Dec_Construct(p) LzmaDec_Construct(&(p)->decoder)\n#define Lzma2Dec_FreeProbs(p, alloc) LzmaDec_FreeProbs(&(p)->decoder, alloc);\n#define Lzma2Dec_Free(p, alloc) LzmaDec_Free(&(p)->decoder, alloc);\n\nstatic SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAlloc *alloc);\nstatic void Lzma2Dec_Init(CLzma2Dec *p);\n\n\n/*\nfinishMode:\n  It has meaning only if the decoding reaches output limit (*destLen or dicLimit).\n  LZMA_FINISH_ANY - use smallest number of input bytes\n  LZMA_FINISH_END - read EndOfStream marker after decoding\n\nReturns:\n  SZ_OK\n    status:\n      LZMA_STATUS_FINISHED_WITH_MARK\n      LZMA_STATUS_NOT_FINISHED\n      LZMA_STATUS_NEEDS_MORE_INPUT\n  SZ_ERROR_DATA - Data error\n*/\n\nstatic SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit,\n    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);\n\n\nEXTERN_C_END\n\n#endif\n\n\n/* END HEADERS */\n\n\n/* 7zCrc.c -- CRC32 init\n2015-03-10 : Igor Pavlov : Public domain */\n\n/*\n#include \"Precomp.h\"\n\n#include \"7zCrc.h\"\n#include \"CpuArch.h\"\n*/\n#define UNUSED_VAR(x) (void)x;\n\n#define kCrcPoly 0xEDB88320\n\n#ifdef MY_CPU_LE\n  #define CRC_NUM_TABLES 8\n#else\n  #define CRC_NUM_TABLES 9\n\n  #define CRC_UINT32_SWAP(v) ((v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | (v << 24))\n\n  static UInt32 MY_FAST_CALL CrcUpdateT1_BeT4(UInt32 v, const void *data, size_t size, const UInt32 *table);\n  static UInt32 MY_FAST_CALL CrcUpdateT1_BeT8(UInt32 v, const void *data, size_t size, const UInt32 *table);\n#endif\n\n#ifndef MY_CPU_BE\n  static UInt32 MY_FAST_CALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const UInt32 *table);\n  static UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table);\n#endif\n\ntypedef UInt32 (MY_FAST_CALL *CRC_FUNC)(UInt32 v, const void *data, size_t size, const UInt32 *table);\n\nstatic CRC_FUNC g_CrcUpdateT4;\nstatic CRC_FUNC g_CrcUpdateT8;\nstatic CRC_FUNC g_CrcUpdate;\n\nstatic UInt32 g_CrcTable[256 * CRC_NUM_TABLES];\n\nstatic UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size)\n{\n  return g_CrcUpdate(CRC_INIT_VAL, data, size, g_CrcTable) ^ CRC_INIT_VAL;\n}\n\n#define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8))\n\n#if CRC_NUM_TABLES < 4\nstatic UInt32 MY_FAST_CALL CrcUpdateT1(UInt32 v, const void *data, size_t size, const UInt32 *table)\n{\n  const Byte *p = (const Byte *)data;\n  const Byte *pEnd = p + size;\n  for (; p != pEnd; p++)\n    v = CRC_UPDATE_BYTE_2(v, *p);\n  return v;\n}\n#endif\n\nstatic void MY_FAST_CALL CrcGenerateTable()\n{\n  UInt32 i;\n  for (i = 0; i < 256; i++)\n  {\n    UInt32 r = i;\n    unsigned j;\n    for (j = 0; j < 8; j++)\n      r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1));\n    g_CrcTable[i] = r;\n  }\n  for (; i < 256 * CRC_NUM_TABLES; i++)\n  {\n    UInt32 r = g_CrcTable[i - 256];\n    g_CrcTable[i] = g_CrcTable[r & 0xFF] ^ (r >> 8);\n  }\n\n  #if CRC_NUM_TABLES < 4\n  \n  g_CrcUpdate = CrcUpdateT1;\n  \n  #else\n \n  #ifdef MY_CPU_LE\n\n    g_CrcUpdateT4 = CrcUpdateT4;\n    g_CrcUpdate = CrcUpdateT4;\n\n    #if CRC_NUM_TABLES >= 8\n      g_CrcUpdateT8 = CrcUpdateT8;\n  \n      #ifdef MY_CPU_X86_OR_AMD64\n      if (!CPU_Is_InOrder())\n        g_CrcUpdate = CrcUpdateT8;\n      #endif\n    #endif\n\n  #else\n  {\n    #ifndef MY_CPU_BE\n    UInt32 k = 0x01020304;\n    const Byte *p = (const Byte *)&k;\n    if (p[0] == 4 && p[1] == 3)\n    {\n      g_CrcUpdateT4 = CrcUpdateT4;\n      g_CrcUpdate = CrcUpdateT4;\n      #if CRC_NUM_TABLES >= 8\n      g_CrcUpdateT8 = CrcUpdateT8;\n      /* g_CrcUpdate = CrcUpdateT8; */\n      #endif\n    }\n    else if (p[0] != 1 || p[1] != 2)\n      g_CrcUpdate = CrcUpdateT1;\n    else\n    #endif\n    {\n      for (i = 256 * CRC_NUM_TABLES - 1; i >= 256; i--)\n      {\n        UInt32 x = g_CrcTable[i - 256];\n        g_CrcTable[i] = CRC_UINT32_SWAP(x);\n      }\n      g_CrcUpdateT4 = CrcUpdateT1_BeT4;\n      g_CrcUpdate = CrcUpdateT1_BeT4;\n      #if CRC_NUM_TABLES >= 8\n      g_CrcUpdateT8 = CrcUpdateT1_BeT8;\n      /* g_CrcUpdate = CrcUpdateT1_BeT8; */\n      #endif\n    }\n  }\n  #endif\n\n  #endif\n}\n\n/* 7zCrcOpt.c -- CRC32 calculation\n2015-03-01 : Igor Pavlov : Public domain */\n\n/*\n#include \"Precomp.h\"\n\n#include \"CpuArch.h\"\n*/\n\n#ifndef MY_CPU_BE\n\n#define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8))\n\nstatic UInt32 MY_FAST_CALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const UInt32 *table)\n{\n  const Byte *p = (const Byte *)data;\n  for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++)\n    v = CRC_UPDATE_BYTE_2(v, *p);\n  for (; size >= 4; size -= 4, p += 4)\n  {\n    v ^= *(const UInt32 *)p;\n    v =\n          table[0x300 + ((v      ) & 0xFF)]\n        ^ table[0x200 + ((v >>  8) & 0xFF)]\n        ^ table[0x100 + ((v >> 16) & 0xFF)]\n        ^ table[0x000 + ((v >> 24))];\n  }\n  for (; size > 0; size--, p++)\n    v = CRC_UPDATE_BYTE_2(v, *p);\n  return v;\n}\n\nstatic UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table)\n{\n  const Byte *p = (const Byte *)data;\n  for (; size > 0 && ((unsigned)(ptrdiff_t)p & 7) != 0; size--, p++)\n    v = CRC_UPDATE_BYTE_2(v, *p);\n  for (; size >= 8; size -= 8, p += 8)\n  {\n    UInt32 d;\n    v ^= *(const UInt32 *)p;\n    v =\n          table[0x700 + ((v      ) & 0xFF)]\n        ^ table[0x600 + ((v >>  8) & 0xFF)]\n        ^ table[0x500 + ((v >> 16) & 0xFF)]\n        ^ table[0x400 + ((v >> 24))];\n    d = *((const UInt32 *)p + 1);\n    v ^=\n          table[0x300 + ((d      ) & 0xFF)]\n        ^ table[0x200 + ((d >>  8) & 0xFF)]\n        ^ table[0x100 + ((d >> 16) & 0xFF)]\n        ^ table[0x000 + ((d >> 24))];\n  }\n  for (; size > 0; size--, p++)\n    v = CRC_UPDATE_BYTE_2(v, *p);\n  return v;\n}\n\n#endif\n\n\n#ifndef MY_CPU_LE\n\n#define CRC_UINT32_SWAP(v) ((v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | (v << 24))\n\n#define CRC_UPDATE_BYTE_2_BE(crc, b) (table[(((crc) >> 24) ^ (b))] ^ ((crc) << 8))\n\nstatic UInt32 MY_FAST_CALL CrcUpdateT1_BeT4(UInt32 v, const void *data, size_t size, const UInt32 *table)\n{\n  const Byte *p = (const Byte *)data;\n  table += 0x100;\n  v = CRC_UINT32_SWAP(v);\n  for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++)\n    v = CRC_UPDATE_BYTE_2_BE(v, *p);\n  for (; size >= 4; size -= 4, p += 4)\n  {\n    v ^= *(const UInt32 *)p;\n    v =\n          table[0x000 + ((v      ) & 0xFF)]\n        ^ table[0x100 + ((v >>  8) & 0xFF)]\n        ^ table[0x200 + ((v >> 16) & 0xFF)]\n        ^ table[0x300 + ((v >> 24))];\n  }\n  for (; size > 0; size--, p++)\n    v = CRC_UPDATE_BYTE_2_BE(v, *p);\n  return CRC_UINT32_SWAP(v);\n}\n\nstatic UInt32 MY_FAST_CALL CrcUpdateT1_BeT8(UInt32 v, const void *data, size_t size, const UInt32 *table)\n{\n  const Byte *p = (const Byte *)data;\n  table += 0x100;\n  v = CRC_UINT32_SWAP(v);\n  for (; size > 0 && ((unsigned)(ptrdiff_t)p & 7) != 0; size--, p++)\n    v = CRC_UPDATE_BYTE_2_BE(v, *p);\n  for (; size >= 8; size -= 8, p += 8)\n  {\n    UInt32 d;\n    v ^= *(const UInt32 *)p;\n    v =\n          table[0x400 + ((v      ) & 0xFF)]\n        ^ table[0x500 + ((v >>  8) & 0xFF)]\n        ^ table[0x600 + ((v >> 16) & 0xFF)]\n        ^ table[0x700 + ((v >> 24))];\n    d = *((const UInt32 *)p + 1);\n    v ^=\n          table[0x000 + ((d      ) & 0xFF)]\n        ^ table[0x100 + ((d >>  8) & 0xFF)]\n        ^ table[0x200 + ((d >> 16) & 0xFF)]\n        ^ table[0x300 + ((d >> 24))];\n  }\n  for (; size > 0; size--, p++)\n    v = CRC_UPDATE_BYTE_2_BE(v, *p);\n  return CRC_UINT32_SWAP(v);\n}\n\n#endif\n\n/* CpuArch.c -- CPU specific code\n2016-02-25: Igor Pavlov : Public domain */\n\n/*\n#include \"Precomp.h\"\n\n#include \"CpuArch.h\"\n*/\n\n#ifdef MY_CPU_X86_OR_AMD64\n\n#if (defined(_MSC_VER) && !defined(MY_CPU_AMD64)) || defined(__GNUC__)\n#define USE_ASM\n#endif\n\n#if !defined(USE_ASM) && _MSC_VER >= 1500\n#include <intrin.h>\n#endif\n\n#if defined(USE_ASM) && !defined(MY_CPU_AMD64)\nstatic UInt32 CheckFlag(UInt32 flag)\n{\n  #ifdef _MSC_VER\n  __asm pushfd;\n  __asm pop EAX;\n  __asm mov EDX, EAX;\n  __asm xor EAX, flag;\n  __asm push EAX;\n  __asm popfd;\n  __asm pushfd;\n  __asm pop EAX;\n  __asm xor EAX, EDX;\n  __asm push EDX;\n  __asm popfd;\n  __asm and flag, EAX;\n  #else\n  __asm__ __volatile__ (\n    \"pushf\\n\\t\"\n    \"pop  %%EAX\\n\\t\"\n    \"movl %%EAX,%%EDX\\n\\t\"\n    \"xorl %0,%%EAX\\n\\t\"\n    \"push %%EAX\\n\\t\"\n    \"popf\\n\\t\"\n    \"pushf\\n\\t\"\n    \"pop  %%EAX\\n\\t\"\n    \"xorl %%EDX,%%EAX\\n\\t\"\n    \"push %%EDX\\n\\t\"\n    \"popf\\n\\t\"\n    \"andl %%EAX, %0\\n\\t\":\n    \"=c\" (flag) : \"c\" (flag) :\n    \"%eax\", \"%edx\");\n  #endif\n  return flag;\n}\n#define CHECK_CPUID_IS_SUPPORTED if (CheckFlag(1 << 18) == 0 || CheckFlag(1 << 21) == 0) return False;\n#else\n#define CHECK_CPUID_IS_SUPPORTED\n#endif\n\n#if defined(__WATCOMC__)\nstatic void __cpuid(int *cpuinfo, const UInt32 infotype);\n#pragma aux __cpuid =     \\\n    \".586\"                \\\n    \"cpuid\"               \\\n    \"mov  [esi+0],eax\"    \\\n    \"mov  [esi+4],ebx\"    \\\n    \"mov  [esi+8],ecx\"    \\\n    \"mov  [esi+12],edx\"   \\\n    parm [esi] [eax] modify [ebx ecx edx];\n#endif\n\n\nstatic void MyCPUID(UInt32 function, UInt32 *a, UInt32 *b, UInt32 *c, UInt32 *d)\n{\n  #ifdef USE_ASM\n\n  #ifdef _MSC_VER\n\n  UInt32 a2, b2, c2, d2;\n  __asm xor EBX, EBX;\n  __asm xor ECX, ECX;\n  __asm xor EDX, EDX;\n  __asm mov EAX, function;\n  __asm cpuid;\n  __asm mov a2, EAX;\n  __asm mov b2, EBX;\n  __asm mov c2, ECX;\n  __asm mov d2, EDX;\n\n  *a = a2;\n  *b = b2;\n  *c = c2;\n  *d = d2;\n\n  #else\n\n  __asm__ __volatile__ (\n  #if defined(MY_CPU_AMD64) && defined(__PIC__)\n    \"mov %%rbx, %%rdi;\"\n    \"cpuid;\"\n    \"xchg %%rbx, %%rdi;\"\n    : \"=a\" (*a) ,\n      \"=D\" (*b) ,\n  #elif defined(MY_CPU_X86) && defined(__PIC__)\n    \"mov %%ebx, %%edi;\"\n    \"cpuid;\"\n    \"xchgl %%ebx, %%edi;\"\n    : \"=a\" (*a) ,\n      \"=D\" (*b) ,\n  #else\n    \"cpuid\"\n    : \"=a\" (*a) ,\n      \"=b\" (*b) ,\n  #endif\n      \"=c\" (*c) ,\n      \"=d\" (*d)\n    : \"0\" (function)) ;\n\n  #endif\n\n  #else\n\n  int CPUInfo[4];\n  __cpuid(CPUInfo, function);\n  *a = CPUInfo[0];\n  *b = CPUInfo[1];\n  *c = CPUInfo[2];\n  *d = CPUInfo[3];\n\n  #endif\n}\n\nstatic Bool x86cpuid_CheckAndRead(Cx86cpuid *p)\n{\n  CHECK_CPUID_IS_SUPPORTED\n  MyCPUID(0, &p->maxFunc, &p->vendor[0], &p->vendor[2], &p->vendor[1]);\n  MyCPUID(1, &p->ver, &p->b, &p->c, &p->d);\n  return True;\n}\n\nstatic const UInt32 kVendors[][3] =\n{\n  { 0x756E6547, 0x49656E69, 0x6C65746E},\n  { 0x68747541, 0x69746E65, 0x444D4163},\n  { 0x746E6543, 0x48727561, 0x736C7561}\n};\n\nstatic int x86cpuid_GetFirm(const Cx86cpuid *p)\n{\n  unsigned i;\n  for (i = 0; i < sizeof(kVendors) / sizeof(kVendors[i]); i++)\n  {\n    const UInt32 *v = kVendors[i];\n    if (v[0] == p->vendor[0] &&\n        v[1] == p->vendor[1] &&\n        v[2] == p->vendor[2])\n      return (int)i;\n  }\n  return -1;\n}\n\nstatic Bool CPU_Is_InOrder()\n{\n  Cx86cpuid p;\n  int firm;\n  UInt32 family, model;\n  if (!x86cpuid_CheckAndRead(&p))\n    return True;\n\n  family = x86cpuid_GetFamily(p.ver);\n  model = x86cpuid_GetModel(p.ver);\n  \n  firm = x86cpuid_GetFirm(&p);\n\n  switch (firm)\n  {\n    case CPU_FIRM_INTEL: return (family < 6 || (family == 6 && (\n        /* In-Order Atom CPU */\n           model == 0x1C  /* 45 nm, N4xx, D4xx, N5xx, D5xx, 230, 330 */\n        || model == 0x26  /* 45 nm, Z6xx */\n        || model == 0x27  /* 32 nm, Z2460 */\n        || model == 0x35  /* 32 nm, Z2760 */\n        || model == 0x36  /* 32 nm, N2xxx, D2xxx */\n        )));\n    case CPU_FIRM_AMD: return (family < 5 || (family == 5 && (model < 6 || model == 0xA)));\n    case CPU_FIRM_VIA: return (family < 6 || (family == 6 && model < 0xF));\n  }\n  return True;\n}\n\n#endif\n\n/* 7zStream.c -- 7z Stream functions\n2013-11-12 : Igor Pavlov : Public domain */\n\n/*#include \"Precomp.h\"*/\n\n#include <string.h>\n\n/*#include \"7zTypes.h\"*/\n\nstatic SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset)\n{\n  Int64 t = offset;\n  return stream->Seek(stream, &t, SZ_SEEK_SET);\n}\n\nstatic SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType)\n{\n  while (size != 0)\n  {\n    size_t processed = size;\n    RINOK(stream->Read(stream, buf, &processed));\n    if (processed == 0)\n      return errorType;\n    buf = (void *)((Byte *)buf + processed);\n    size -= processed;\n  }\n  return SZ_OK;\n}\n\nstatic SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size)\n{\n  return LookInStream_Read2(stream, buf, size, SZ_ERROR_INPUT_EOF);\n}\n\nstatic SRes LookToRead_Look_Lookahead(void *pp, const void **buf, size_t *size)\n{\n  SRes res = SZ_OK;\n  CLookToRead *p = (CLookToRead *)pp;\n  size_t size2 = p->size - p->pos;\n  if (size2 == 0 && *size > 0)\n  {\n    p->pos = 0;\n    size2 = LookToRead_BUF_SIZE;\n    res = p->realStream->Read(p->realStream, p->buf, &size2);\n    p->size = size2;\n  }\n  if (size2 < *size)\n    *size = size2;\n  *buf = p->buf + p->pos;\n  return res;\n}\n\nstatic SRes LookToRead_Look_Exact(void *pp, const void **buf, size_t *size)\n{\n  SRes res = SZ_OK;\n  CLookToRead *p = (CLookToRead *)pp;\n  size_t size2 = p->size - p->pos;\n  if (size2 == 0 && *size > 0)\n  {\n    p->pos = 0;\n    if (*size > LookToRead_BUF_SIZE)\n      *size = LookToRead_BUF_SIZE;\n    res = p->realStream->Read(p->realStream, p->buf, size);\n    size2 = p->size = *size;\n  }\n  if (size2 < *size)\n    *size = size2;\n  *buf = p->buf + p->pos;\n  return res;\n}\n\nstatic SRes LookToRead_Skip(void *pp, size_t offset)\n{\n  CLookToRead *p = (CLookToRead *)pp;\n  p->pos += offset;\n  return SZ_OK;\n}\n\nstatic SRes LookToRead_Read(void *pp, void *buf, size_t *size)\n{\n  CLookToRead *p = (CLookToRead *)pp;\n  size_t rem = p->size - p->pos;\n  if (rem == 0)\n    return p->realStream->Read(p->realStream, buf, size);\n  if (rem > *size)\n    rem = *size;\n  memcpy(buf, p->buf + p->pos, rem);\n  p->pos += rem;\n  *size = rem;\n  return SZ_OK;\n}\n\nstatic SRes LookToRead_Seek(void *pp, Int64 *pos, ESzSeek origin)\n{\n  CLookToRead *p = (CLookToRead *)pp;\n  p->pos = p->size = 0;\n  return p->realStream->Seek(p->realStream, pos, origin);\n}\n\nstatic void LookToRead_CreateVTable(CLookToRead *p, int lookahead)\n{\n  p->s.Look = lookahead ?\n      LookToRead_Look_Lookahead :\n      LookToRead_Look_Exact;\n  p->s.Skip = LookToRead_Skip;\n  p->s.Read = LookToRead_Read;\n  p->s.Seek = LookToRead_Seek;\n}\n\nstatic void LookToRead_Init(CLookToRead *p)\n{\n  p->pos = p->size = 0;\n}\n\n\n/* 7zArcIn.c -- 7z Input functions\n2016-05-16 : Igor Pavlov : Public domain */\n\n/*\n#include \"Precomp.h\"\n\n#include <string.h>\n\n#include \"7z.h\"\n#include \"7zBuf.h\"\n#include \"7zCrc.h\"\n#include \"CpuArch.h\"\n*/\n\n#define MY_ALLOC(T, p, size, alloc) { \\\n  if ((p = (T *)IAlloc_Alloc(alloc, (size) * sizeof(T))) == NULL) return SZ_ERROR_MEM; }\n\n#define MY_ALLOC_ZE(T, p, size, alloc) { if ((size) == 0) p = NULL; else MY_ALLOC(T, p, size, alloc) }\n\n#define MY_ALLOC_AND_CPY(to, size, from, alloc) \\\n  { MY_ALLOC(Byte, to, size, alloc); memcpy(to, from, size); }\n\n#define MY_ALLOC_ZE_AND_CPY(to, size, from, alloc) \\\n  { if ((size) == 0) p = NULL; else { MY_ALLOC_AND_CPY(to, size, from, alloc) } }\n\n#define k7zMajorVersion 0\n\nenum EIdEnum\n{\n  k7zIdEnd,\n  k7zIdHeader,\n  k7zIdArchiveProperties,\n  k7zIdAdditionalStreamsInfo,\n  k7zIdMainStreamsInfo,\n  k7zIdFilesInfo,\n  k7zIdPackInfo,\n  k7zIdUnpackInfo,\n  k7zIdSubStreamsInfo,\n  k7zIdSize,\n  k7zIdCRC,\n  k7zIdFolder,\n  k7zIdCodersUnpackSize,\n  k7zIdNumUnpackStream,\n  k7zIdEmptyStream,\n  k7zIdEmptyFile,\n  k7zIdAnti,\n  k7zIdName,\n  k7zIdCTime,\n  k7zIdATime,\n  k7zIdMTime,\n  k7zIdWinAttrib,\n  k7zIdComment,\n  k7zIdEncodedHeader,\n  k7zIdStartPos,\n  k7zIdDummy\n  /* k7zNtSecure, */\n  /* k7zParent, */\n  /* k7zIsReal */\n};\n\nstatic const Byte k7zSignature[k7zSignatureSize] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C};\n\n#define SzBitUi32s_Init(p) { (p)->Defs = NULL; (p)->Vals = NULL; }\n\nstatic SRes SzBitUi32s_Alloc(CSzBitUi32s *p, size_t num, ISzAlloc *alloc)\n{\n  if (num == 0)\n  {\n    p->Defs = NULL;\n    p->Vals = NULL;\n  }\n  else\n  {\n    MY_ALLOC(Byte, p->Defs, (num + 7) >> 3, alloc);\n    MY_ALLOC(UInt32, p->Vals, num, alloc);\n  }\n  return SZ_OK;\n}\n\nstatic void SzBitUi32s_Free(CSzBitUi32s *p, ISzAlloc *alloc)\n{\n  IAlloc_Free(alloc, p->Defs); p->Defs = NULL;\n  IAlloc_Free(alloc, p->Vals); p->Vals = NULL;\n}\n\n#define SzBitUi64s_Init(p) { (p)->Defs = NULL; (p)->Vals = NULL; }\n\nstatic void SzBitUi64s_Free(CSzBitUi64s *p, ISzAlloc *alloc)\n{\n  IAlloc_Free(alloc, p->Defs); p->Defs = NULL;\n  IAlloc_Free(alloc, p->Vals); p->Vals = NULL;\n}\n\n\nstatic void SzAr_Init(CSzAr *p)\n{\n  p->NumPackStreams = 0;\n  p->NumFolders = 0;\n  \n  p->PackPositions = NULL;\n  SzBitUi32s_Init(&p->FolderCRCs);\n\n  p->FoCodersOffsets = NULL;\n  p->FoStartPackStreamIndex = NULL;\n  p->FoToCoderUnpackSizes = NULL;\n  p->FoToMainUnpackSizeIndex = NULL;\n  p->CoderUnpackSizes = NULL;\n\n  p->CodersData = NULL;\n}\n\nstatic void SzAr_Free(CSzAr *p, ISzAlloc *alloc)\n{\n  IAlloc_Free(alloc, p->PackPositions);\n  SzBitUi32s_Free(&p->FolderCRCs, alloc);\n \n  IAlloc_Free(alloc, p->FoCodersOffsets);\n  IAlloc_Free(alloc, p->FoStartPackStreamIndex);\n  IAlloc_Free(alloc, p->FoToCoderUnpackSizes);\n  IAlloc_Free(alloc, p->FoToMainUnpackSizeIndex);\n  IAlloc_Free(alloc, p->CoderUnpackSizes);\n  \n  IAlloc_Free(alloc, p->CodersData);\n\n  SzAr_Init(p);\n}\n\n\nstatic void SzArEx_Init(CSzArEx *p)\n{\n  SzAr_Init(&p->db);\n  \n  p->NumFiles = 0;\n  p->dataPos = 0;\n  \n  p->UnpackPositions = NULL;\n  p->IsDirs = NULL;\n  \n  p->FolderToFile = NULL;\n  p->FileToFolder = NULL;\n  \n  p->FileNameOffsets = NULL;\n  p->FileNames = NULL;\n  \n  SzBitUi32s_Init(&p->CRCs);\n  SzBitUi32s_Init(&p->Attribs);\n  /* SzBitUi32s_Init(&p->Parents); */\n  SzBitUi64s_Init(&p->MTime);\n  SzBitUi64s_Init(&p->CTime);\n}\n\nstatic void SzArEx_Free(CSzArEx *p, ISzAlloc *alloc)\n{\n  IAlloc_Free(alloc, p->UnpackPositions);\n  IAlloc_Free(alloc, p->IsDirs);\n\n  IAlloc_Free(alloc, p->FolderToFile);\n  IAlloc_Free(alloc, p->FileToFolder);\n\n  IAlloc_Free(alloc, p->FileNameOffsets);\n  IAlloc_Free(alloc, p->FileNames);\n\n  SzBitUi32s_Free(&p->CRCs, alloc);\n  SzBitUi32s_Free(&p->Attribs, alloc);\n  /* SzBitUi32s_Free(&p->Parents, alloc); */\n  SzBitUi64s_Free(&p->MTime, alloc);\n  SzBitUi64s_Free(&p->CTime, alloc);\n  \n  SzAr_Free(&p->db, alloc);\n  SzArEx_Init(p);\n}\n\n\nstatic int TestSignatureCandidate(const Byte *testBytes)\n{\n  unsigned i;\n  for (i = 0; i < k7zSignatureSize; i++)\n    if (testBytes[i] != k7zSignature[i])\n      return 0;\n  return 1;\n}\n\n#define SzData_Clear(p) { (p)->Data = NULL; (p)->Size = 0; }\n\n#define SZ_READ_BYTE_SD(_sd_, dest) if ((_sd_)->Size == 0) return SZ_ERROR_ARCHIVE; (_sd_)->Size--; dest = *(_sd_)->Data++;\n#define SZ_READ_BYTE(dest) SZ_READ_BYTE_SD(sd, dest)\n#define SZ_READ_BYTE_2(dest) if (sd.Size == 0) return SZ_ERROR_ARCHIVE; sd.Size--; dest = *sd.Data++;\n\n#define SKIP_DATA(sd, size) { sd->Size -= (size_t)(size); sd->Data += (size_t)(size); }\n#define SKIP_DATA2(sd, size) { sd.Size -= (size_t)(size); sd.Data += (size_t)(size); }\n\n#define SZ_READ_32(dest) if (sd.Size < 4) return SZ_ERROR_ARCHIVE; \\\n   dest = GetUi32(sd.Data); SKIP_DATA2(sd, 4);\n\nstatic MY_NO_INLINE SRes ReadNumber(CSzData *sd, UInt64 *value)\n{\n  Byte firstByte, mask;\n  unsigned i;\n  UInt32 v;\n\n  SZ_READ_BYTE(firstByte);\n  if ((firstByte & 0x80) == 0)\n  {\n    *value = firstByte;\n    return SZ_OK;\n  }\n  SZ_READ_BYTE(v);\n  if ((firstByte & 0x40) == 0)\n  {\n    *value = (((UInt32)firstByte & 0x3F) << 8) | v;\n    return SZ_OK;\n  }\n  SZ_READ_BYTE(mask);\n  *value = v | ((UInt32)mask << 8);\n  mask = 0x20;\n  for (i = 2; i < 8; i++)\n  {\n    Byte b;\n    if ((firstByte & mask) == 0)\n    {\n      UInt64 highPart = (unsigned)firstByte & (unsigned)(mask - 1);\n      *value |= (highPart << (8 * i));\n      return SZ_OK;\n    }\n    SZ_READ_BYTE(b);\n    *value |= ((UInt64)b << (8 * i));\n    mask >>= 1;\n  }\n  return SZ_OK;\n}\n\n\nstatic MY_NO_INLINE SRes SzReadNumber32(CSzData *sd, UInt32 *value)\n{\n  Byte firstByte;\n  UInt64 value64;\n  if (sd->Size == 0)\n    return SZ_ERROR_ARCHIVE;\n  firstByte = *sd->Data;\n  if ((firstByte & 0x80) == 0)\n  {\n    *value = firstByte;\n    sd->Data++;\n    sd->Size--;\n    return SZ_OK;\n  }\n  RINOK(ReadNumber(sd, &value64));\n  if (value64 >= (UInt32)0x80000000 - 1)\n    return SZ_ERROR_UNSUPPORTED;\n  if (value64 >= ((UInt64)(1) << ((sizeof(size_t) - 1) * 8 + 4)))\n    return SZ_ERROR_UNSUPPORTED;\n  *value = (UInt32)value64;\n  return SZ_OK;\n}\n\n#define ReadID(sd, value) ReadNumber(sd, value)\n\nstatic SRes SkipData(CSzData *sd)\n{\n  UInt64 size;\n  RINOK(ReadNumber(sd, &size));\n  if (size > sd->Size)\n    return SZ_ERROR_ARCHIVE;\n  SKIP_DATA(sd, size);\n  return SZ_OK;\n}\n\nstatic SRes WaitId(CSzData *sd, UInt32 id)\n{\n  for (;;)\n  {\n    UInt64 type;\n    RINOK(ReadID(sd, &type));\n    if (type == id)\n      return SZ_OK;\n    if (type == k7zIdEnd)\n      return SZ_ERROR_ARCHIVE;\n    RINOK(SkipData(sd));\n  }\n}\n\nstatic SRes RememberBitVector(CSzData *sd, UInt32 numItems, const Byte **v)\n{\n  UInt32 numBytes = (numItems + 7) >> 3;\n  if (numBytes > sd->Size)\n    return SZ_ERROR_ARCHIVE;\n  *v = sd->Data;\n  SKIP_DATA(sd, numBytes);\n  return SZ_OK;\n}\n\nstatic UInt32 CountDefinedBits(const Byte *bits, UInt32 numItems)\n{\n  Byte b = 0;\n  unsigned m = 0;\n  UInt32 sum = 0;\n  for (; numItems != 0; numItems--)\n  {\n    if (m == 0)\n    {\n      b = *bits++;\n      m = 8;\n    }\n    m--;\n    sum += ((b >> m) & 1);\n  }\n  return sum;\n}\n\nstatic MY_NO_INLINE SRes ReadBitVector(CSzData *sd, UInt32 numItems, Byte **v, ISzAlloc *alloc)\n{\n  Byte allAreDefined;\n  Byte *v2;\n  UInt32 numBytes = (numItems + 7) >> 3;\n  *v = NULL;\n  SZ_READ_BYTE(allAreDefined);\n  if (numBytes == 0)\n    return SZ_OK;\n  if (allAreDefined == 0)\n  {\n    if (numBytes > sd->Size)\n      return SZ_ERROR_ARCHIVE;\n    MY_ALLOC_AND_CPY(*v, numBytes, sd->Data, alloc);\n    SKIP_DATA(sd, numBytes);\n    return SZ_OK;\n  }\n  MY_ALLOC(Byte, *v, numBytes, alloc);\n  v2 = *v;\n  memset(v2, 0xFF, (size_t)numBytes);\n  {\n    unsigned numBits = (unsigned)numItems & 7;\n    if (numBits != 0)\n      v2[numBytes - 1] = (Byte)((((UInt32)1 << numBits) - 1) << (8 - numBits));\n  }\n  return SZ_OK;\n}\n\nstatic MY_NO_INLINE SRes ReadUi32s(CSzData *sd2, UInt32 numItems, CSzBitUi32s *crcs, ISzAlloc *alloc)\n{\n  UInt32 i;\n  CSzData sd;\n  UInt32 *vals;\n  const Byte *defs;\n  MY_ALLOC_ZE(UInt32, crcs->Vals, numItems, alloc);\n  sd = *sd2;\n  defs = crcs->Defs;\n  vals = crcs->Vals;\n  for (i = 0; i < numItems; i++)\n    if (SzBitArray_Check(defs, i))\n    {\n      SZ_READ_32(vals[i]);\n    }\n    else\n      vals[i] = 0;\n  *sd2 = sd;\n  return SZ_OK;\n}\n\nstatic SRes ReadBitUi32s(CSzData *sd, UInt32 numItems, CSzBitUi32s *crcs, ISzAlloc *alloc)\n{\n  SzBitUi32s_Free(crcs, alloc);\n  RINOK(ReadBitVector(sd, numItems, &crcs->Defs, alloc));\n  return ReadUi32s(sd, numItems, crcs, alloc);\n}\n\nstatic SRes SkipBitUi32s(CSzData *sd, UInt32 numItems)\n{\n  Byte allAreDefined;\n  UInt32 numDefined = numItems;\n  SZ_READ_BYTE(allAreDefined);\n  if (!allAreDefined)\n  {\n    size_t numBytes = (numItems + 7) >> 3;\n    if (numBytes > sd->Size)\n      return SZ_ERROR_ARCHIVE;\n    numDefined = CountDefinedBits(sd->Data, numItems);\n    SKIP_DATA(sd, numBytes);\n  }\n  if (numDefined > (sd->Size >> 2))\n    return SZ_ERROR_ARCHIVE;\n  SKIP_DATA(sd, (size_t)numDefined * 4);\n  return SZ_OK;\n}\n\nstatic SRes ReadPackInfo(CSzAr *p, CSzData *sd, ISzAlloc *alloc)\n{\n  RINOK(SzReadNumber32(sd, &p->NumPackStreams));\n\n  RINOK(WaitId(sd, k7zIdSize));\n  MY_ALLOC(UInt64, p->PackPositions, (size_t)p->NumPackStreams + 1, alloc);\n  {\n    UInt64 sum = 0;\n    UInt32 i;\n    UInt32 numPackStreams = p->NumPackStreams;\n    for (i = 0; i < numPackStreams; i++)\n    {\n      UInt64 packSize;\n      p->PackPositions[i] = sum;\n      RINOK(ReadNumber(sd, &packSize));\n      sum += packSize;\n      if (sum < packSize)\n        return SZ_ERROR_ARCHIVE;\n    }\n    p->PackPositions[i] = sum;\n  }\n\n  for (;;)\n  {\n    UInt64 type;\n    RINOK(ReadID(sd, &type));\n    if (type == k7zIdEnd)\n      return SZ_OK;\n    if (type == k7zIdCRC)\n    {\n      /* CRC of packed streams is unused now */\n      RINOK(SkipBitUi32s(sd, p->NumPackStreams));\n      continue;\n    }\n    RINOK(SkipData(sd));\n  }\n}\n\n/*\nstatic SRes SzReadSwitch(CSzData *sd)\n{\n  Byte external;\n  RINOK(SzReadByte(sd, &external));\n  return (external == 0) ? SZ_OK: SZ_ERROR_UNSUPPORTED;\n}\n*/\n\n#define k_NumCodersStreams_in_Folder_MAX (SZ_NUM_BONDS_IN_FOLDER_MAX + SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX)\n\nstatic SRes SzGetNextFolderItem(CSzFolder *f, CSzData *sd)\n{\n  UInt32 numCoders, i;\n  UInt32 numInStreams = 0;\n  const Byte *dataStart = sd->Data;\n\n  f->NumCoders = 0;\n  f->NumBonds = 0;\n  f->NumPackStreams = 0;\n  f->UnpackStream = 0;\n  \n  RINOK(SzReadNumber32(sd, &numCoders));\n  if (numCoders == 0 || numCoders > SZ_NUM_CODERS_IN_FOLDER_MAX)\n    return SZ_ERROR_UNSUPPORTED;\n  \n  for (i = 0; i < numCoders; i++)\n  {\n    Byte mainByte;\n    CSzCoderInfo *coder = f->Coders + i;\n    unsigned idSize, j;\n    UInt64 id;\n    \n    SZ_READ_BYTE(mainByte);\n    if ((mainByte & 0xC0) != 0)\n      return SZ_ERROR_UNSUPPORTED;\n    \n    idSize = (unsigned)(mainByte & 0xF);\n    if (idSize > sizeof(id))\n      return SZ_ERROR_UNSUPPORTED;\n    if (idSize > sd->Size)\n      return SZ_ERROR_ARCHIVE;\n    id = 0;\n    for (j = 0; j < idSize; j++)\n    {\n      id = ((id << 8) | *sd->Data);\n      sd->Data++;\n      sd->Size--;\n    }\n    if (id > UINT64_CONST(0xFFFFFFFF))\n      return SZ_ERROR_UNSUPPORTED;\n    coder->MethodID = (UInt32)id;\n    \n    coder->NumStreams = 1;\n    coder->PropsOffset = 0;\n    coder->PropsSize = 0;\n    \n    if ((mainByte & 0x10) != 0)\n    {\n      UInt32 numStreams;\n      \n      RINOK(SzReadNumber32(sd, &numStreams));\n      if (numStreams > k_NumCodersStreams_in_Folder_MAX)\n        return SZ_ERROR_UNSUPPORTED;\n      coder->NumStreams = (Byte)numStreams;\n\n      RINOK(SzReadNumber32(sd, &numStreams));\n      if (numStreams != 1)\n        return SZ_ERROR_UNSUPPORTED;\n    }\n\n    numInStreams += coder->NumStreams;\n\n    if (numInStreams > k_NumCodersStreams_in_Folder_MAX)\n      return SZ_ERROR_UNSUPPORTED;\n\n    if ((mainByte & 0x20) != 0)\n    {\n      UInt32 propsSize = 0;\n      RINOK(SzReadNumber32(sd, &propsSize));\n      if (propsSize > sd->Size)\n        return SZ_ERROR_ARCHIVE;\n      if (propsSize >= 0x80)\n        return SZ_ERROR_UNSUPPORTED;\n      coder->PropsOffset = sd->Data - dataStart;\n      coder->PropsSize = (Byte)propsSize;\n      sd->Data += (size_t)propsSize;\n      sd->Size -= (size_t)propsSize;\n    }\n  }\n\n  /*\n  if (numInStreams == 1 && numCoders == 1)\n  {\n    f->NumPackStreams = 1;\n    f->PackStreams[0] = 0;\n  }\n  else\n  */\n  {\n    Byte streamUsed[k_NumCodersStreams_in_Folder_MAX];\n    UInt32 numBonds, numPackStreams;\n    \n    numBonds = numCoders - 1;\n    if (numInStreams < numBonds)\n      return SZ_ERROR_ARCHIVE;\n    if (numBonds > SZ_NUM_BONDS_IN_FOLDER_MAX)\n      return SZ_ERROR_UNSUPPORTED;\n    f->NumBonds = numBonds;\n    \n    numPackStreams = numInStreams - numBonds;\n    if (numPackStreams > SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX)\n      return SZ_ERROR_UNSUPPORTED;\n    f->NumPackStreams = numPackStreams;\n  \n    for (i = 0; i < numInStreams; i++)\n      streamUsed[i] = False;\n    \n    if (numBonds != 0)\n    {\n      Byte coderUsed[SZ_NUM_CODERS_IN_FOLDER_MAX];\n\n      for (i = 0; i < numCoders; i++)\n        coderUsed[i] = False;\n      \n      for (i = 0; i < numBonds; i++)\n      {\n        CSzBond *bp = f->Bonds + i;\n        \n        RINOK(SzReadNumber32(sd, &bp->InIndex));\n        if (bp->InIndex >= numInStreams || streamUsed[bp->InIndex])\n          return SZ_ERROR_ARCHIVE;\n        streamUsed[bp->InIndex] = True;\n        \n        RINOK(SzReadNumber32(sd, &bp->OutIndex));\n        if (bp->OutIndex >= numCoders || coderUsed[bp->OutIndex])\n          return SZ_ERROR_ARCHIVE;\n        coderUsed[bp->OutIndex] = True;\n      }\n      \n      for (i = 0; i < numCoders; i++)\n        if (!coderUsed[i])\n        {\n          f->UnpackStream = i;\n          break;\n        }\n      \n      if (i == numCoders)\n        return SZ_ERROR_ARCHIVE;\n    }\n    \n    if (numPackStreams == 1)\n    {\n      for (i = 0; i < numInStreams; i++)\n        if (!streamUsed[i])\n          break;\n      if (i == numInStreams)\n        return SZ_ERROR_ARCHIVE;\n      f->PackStreams[0] = i;\n    }\n    else\n      for (i = 0; i < numPackStreams; i++)\n      {\n        UInt32 index;\n        RINOK(SzReadNumber32(sd, &index));\n        if (index >= numInStreams || streamUsed[index])\n          return SZ_ERROR_ARCHIVE;\n        streamUsed[index] = True;\n        f->PackStreams[i] = index;\n      }\n  }\n\n  f->NumCoders = numCoders;\n\n  return SZ_OK;\n}\n\n\nstatic MY_NO_INLINE SRes SkipNumbers(CSzData *sd2, UInt32 num)\n{\n  CSzData sd;\n  sd = *sd2;\n  for (; num != 0; num--)\n  {\n    Byte firstByte, mask;\n    unsigned i;\n    SZ_READ_BYTE_2(firstByte);\n    if ((firstByte & 0x80) == 0)\n      continue;\n    if ((firstByte & 0x40) == 0)\n    {\n      if (sd.Size == 0)\n        return SZ_ERROR_ARCHIVE;\n      sd.Size--;\n      sd.Data++;\n      continue;\n    }\n    mask = 0x20;\n    for (i = 2; i < 8 && (firstByte & mask) != 0; i++)\n      mask >>= 1;\n    if (i > sd.Size)\n      return SZ_ERROR_ARCHIVE;\n    SKIP_DATA2(sd, i);\n  }\n  *sd2 = sd;\n  return SZ_OK;\n}\n\n\n#define k_Scan_NumCoders_MAX 64\n#define k_Scan_NumCodersStreams_in_Folder_MAX 64\n\n\nstatic SRes ReadUnpackInfo(CSzAr *p,\n    CSzData *sd2,\n    UInt32 numFoldersMax,\n    const CBuf *tempBufs, UInt32 numTempBufs,\n    ISzAlloc *alloc)\n{\n  CSzData sd;\n  \n  UInt32 fo, numFolders, numCodersOutStreams, packStreamIndex;\n  const Byte *startBufPtr;\n  Byte external;\n  \n  RINOK(WaitId(sd2, k7zIdFolder));\n  \n  RINOK(SzReadNumber32(sd2, &numFolders));\n  if (numFolders > numFoldersMax)\n    return SZ_ERROR_UNSUPPORTED;\n  p->NumFolders = numFolders;\n\n  SZ_READ_BYTE_SD(sd2, external);\n  if (external == 0)\n    sd = *sd2;\n  else\n  {\n    UInt32 index;\n    RINOK(SzReadNumber32(sd2, &index));\n    if (index >= numTempBufs)\n      return SZ_ERROR_ARCHIVE;\n    sd.Data = tempBufs[index].data;\n    sd.Size = tempBufs[index].size;\n  }\n  \n  MY_ALLOC(size_t, p->FoCodersOffsets, (size_t)numFolders + 1, alloc);\n  MY_ALLOC(UInt32, p->FoStartPackStreamIndex, (size_t)numFolders + 1, alloc);\n  MY_ALLOC(UInt32, p->FoToCoderUnpackSizes, (size_t)numFolders + 1, alloc);\n  MY_ALLOC(Byte, p->FoToMainUnpackSizeIndex, (size_t)numFolders, alloc);\n  \n  startBufPtr = sd.Data;\n  \n  packStreamIndex = 0;\n  numCodersOutStreams = 0;\n\n  for (fo = 0; fo < numFolders; fo++)\n  {\n    UInt32 numCoders, ci, numInStreams = 0;\n    \n    p->FoCodersOffsets[fo] = sd.Data - startBufPtr;\n    \n    RINOK(SzReadNumber32(&sd, &numCoders));\n    if (numCoders == 0 || numCoders > k_Scan_NumCoders_MAX)\n      return SZ_ERROR_UNSUPPORTED;\n    \n    for (ci = 0; ci < numCoders; ci++)\n    {\n      Byte mainByte;\n      unsigned idSize;\n      UInt32 coderInStreams;\n      \n      SZ_READ_BYTE_2(mainByte);\n      if ((mainByte & 0xC0) != 0)\n        return SZ_ERROR_UNSUPPORTED;\n      idSize = (mainByte & 0xF);\n      if (idSize > 8)\n        return SZ_ERROR_UNSUPPORTED;\n      if (idSize > sd.Size)\n        return SZ_ERROR_ARCHIVE;\n      SKIP_DATA2(sd, idSize);\n      \n      coderInStreams = 1;\n      \n      if ((mainByte & 0x10) != 0)\n      {\n        UInt32 coderOutStreams;\n        RINOK(SzReadNumber32(&sd, &coderInStreams));\n        RINOK(SzReadNumber32(&sd, &coderOutStreams));\n        if (coderInStreams > k_Scan_NumCodersStreams_in_Folder_MAX || coderOutStreams != 1)\n          return SZ_ERROR_UNSUPPORTED;\n      }\n      \n      numInStreams += coderInStreams;\n\n      if ((mainByte & 0x20) != 0)\n      {\n        UInt32 propsSize;\n        RINOK(SzReadNumber32(&sd, &propsSize));\n        if (propsSize > sd.Size)\n          return SZ_ERROR_ARCHIVE;\n        SKIP_DATA2(sd, propsSize);\n      }\n    }\n    \n    {\n      UInt32 indexOfMainStream = 0;\n      UInt32 numPackStreams = 1;\n      \n      if (numCoders != 1 || numInStreams != 1)\n      {\n        Byte streamUsed[k_Scan_NumCodersStreams_in_Folder_MAX];\n        Byte coderUsed[k_Scan_NumCoders_MAX];\n    \n        UInt32 i;\n        UInt32 numBonds = numCoders - 1;\n        if (numInStreams < numBonds)\n          return SZ_ERROR_ARCHIVE;\n        \n        if (numInStreams > k_Scan_NumCodersStreams_in_Folder_MAX)\n          return SZ_ERROR_UNSUPPORTED;\n        \n        for (i = 0; i < numInStreams; i++)\n          streamUsed[i] = False;\n        for (i = 0; i < numCoders; i++)\n          coderUsed[i] = False;\n        \n        for (i = 0; i < numBonds; i++)\n        {\n          UInt32 index;\n          \n          RINOK(SzReadNumber32(&sd, &index));\n          if (index >= numInStreams || streamUsed[index])\n            return SZ_ERROR_ARCHIVE;\n          streamUsed[index] = True;\n          \n          RINOK(SzReadNumber32(&sd, &index));\n          if (index >= numCoders || coderUsed[index])\n            return SZ_ERROR_ARCHIVE;\n          coderUsed[index] = True;\n        }\n        \n        numPackStreams = numInStreams - numBonds;\n        \n        if (numPackStreams != 1)\n          for (i = 0; i < numPackStreams; i++)\n          {\n            UInt32 index;\n            RINOK(SzReadNumber32(&sd, &index));\n            if (index >= numInStreams || streamUsed[index])\n              return SZ_ERROR_ARCHIVE;\n            streamUsed[index] = True;\n          }\n          \n        for (i = 0; i < numCoders; i++)\n          if (!coderUsed[i])\n          {\n            indexOfMainStream = i;\n            break;\n          }\n \n        if (i == numCoders)\n          return SZ_ERROR_ARCHIVE;\n      }\n      \n      p->FoStartPackStreamIndex[fo] = packStreamIndex;\n      p->FoToCoderUnpackSizes[fo] = numCodersOutStreams;\n      p->FoToMainUnpackSizeIndex[fo] = (Byte)indexOfMainStream;\n      numCodersOutStreams += numCoders;\n      if (numCodersOutStreams < numCoders)\n        return SZ_ERROR_UNSUPPORTED;\n      if (numPackStreams > p->NumPackStreams - packStreamIndex)\n        return SZ_ERROR_ARCHIVE;\n      packStreamIndex += numPackStreams;\n    }\n  }\n\n  p->FoToCoderUnpackSizes[fo] = numCodersOutStreams;\n  \n  {\n    size_t dataSize = sd.Data - startBufPtr;\n    p->FoStartPackStreamIndex[fo] = packStreamIndex;\n    p->FoCodersOffsets[fo] = dataSize;\n    MY_ALLOC_ZE_AND_CPY(p->CodersData, dataSize, startBufPtr, alloc);\n  }\n  \n  if (external != 0)\n  {\n    if (sd.Size != 0)\n      return SZ_ERROR_ARCHIVE;\n    sd = *sd2;\n  }\n  \n  RINOK(WaitId(&sd, k7zIdCodersUnpackSize));\n  \n  MY_ALLOC_ZE(UInt64, p->CoderUnpackSizes, (size_t)numCodersOutStreams, alloc);\n  {\n    UInt32 i;\n    for (i = 0; i < numCodersOutStreams; i++)\n    {\n      RINOK(ReadNumber(&sd, p->CoderUnpackSizes + i));\n    }\n  }\n\n  for (;;)\n  {\n    UInt64 type;\n    RINOK(ReadID(&sd, &type));\n    if (type == k7zIdEnd)\n    {\n      *sd2 = sd;\n      return SZ_OK;\n    }\n    if (type == k7zIdCRC)\n    {\n      RINOK(ReadBitUi32s(&sd, numFolders, &p->FolderCRCs, alloc));\n      continue;\n    }\n    RINOK(SkipData(&sd));\n  }\n}\n\n\nstatic UInt64 SzAr_GetFolderUnpackSize(const CSzAr *p, UInt32 folderIndex)\n{\n  return p->CoderUnpackSizes[p->FoToCoderUnpackSizes[folderIndex] + p->FoToMainUnpackSizeIndex[folderIndex]];\n}\n\n\ntypedef struct\n{\n  UInt32 NumTotalSubStreams;\n  UInt32 NumSubDigests;\n  CSzData sdNumSubStreams;\n  CSzData sdSizes;\n  CSzData sdCRCs;\n} CSubStreamInfo;\n\n\nstatic SRes ReadSubStreamsInfo(CSzAr *p, CSzData *sd, CSubStreamInfo *ssi)\n{\n  UInt64 type = 0;\n  UInt32 numSubDigests = 0;\n  UInt32 numFolders = p->NumFolders;\n  UInt32 numUnpackStreams = numFolders;\n  UInt32 numUnpackSizesInData = 0;\n\n  for (;;)\n  {\n    RINOK(ReadID(sd, &type));\n    if (type == k7zIdNumUnpackStream)\n    {\n      UInt32 i;\n      ssi->sdNumSubStreams.Data = sd->Data;\n      numUnpackStreams = 0;\n      numSubDigests = 0;\n      for (i = 0; i < numFolders; i++)\n      {\n        UInt32 numStreams;\n        RINOK(SzReadNumber32(sd, &numStreams));\n        if (numUnpackStreams > numUnpackStreams + numStreams)\n          return SZ_ERROR_UNSUPPORTED;\n        numUnpackStreams += numStreams;\n        if (numStreams != 0)\n          numUnpackSizesInData += (numStreams - 1);\n        if (numStreams != 1 || !SzBitWithVals_Check(&p->FolderCRCs, i))\n          numSubDigests += numStreams;\n      }\n      ssi->sdNumSubStreams.Size = sd->Data - ssi->sdNumSubStreams.Data;\n      continue;\n    }\n    if (type == k7zIdCRC || type == k7zIdSize || type == k7zIdEnd)\n      break;\n    RINOK(SkipData(sd));\n  }\n\n  if (!ssi->sdNumSubStreams.Data)\n  {\n    numSubDigests = numFolders;\n    if (p->FolderCRCs.Defs)\n      numSubDigests = numFolders - CountDefinedBits(p->FolderCRCs.Defs, numFolders);\n  }\n  \n  ssi->NumTotalSubStreams = numUnpackStreams;\n  ssi->NumSubDigests = numSubDigests;\n\n  if (type == k7zIdSize)\n  {\n    ssi->sdSizes.Data = sd->Data;\n    RINOK(SkipNumbers(sd, numUnpackSizesInData));\n    ssi->sdSizes.Size = sd->Data - ssi->sdSizes.Data;\n    RINOK(ReadID(sd, &type));\n  }\n\n  for (;;)\n  {\n    if (type == k7zIdEnd)\n      return SZ_OK;\n    if (type == k7zIdCRC)\n    {\n      ssi->sdCRCs.Data = sd->Data;\n      RINOK(SkipBitUi32s(sd, numSubDigests));\n      ssi->sdCRCs.Size = sd->Data - ssi->sdCRCs.Data;\n    }\n    else\n    {\n      RINOK(SkipData(sd));\n    }\n    RINOK(ReadID(sd, &type));\n  }\n}\n\nstatic SRes SzReadStreamsInfo(CSzAr *p,\n    CSzData *sd,\n    UInt32 numFoldersMax, const CBuf *tempBufs, UInt32 numTempBufs,\n    UInt64 *dataOffset,\n    CSubStreamInfo *ssi,\n    ISzAlloc *alloc)\n{\n  UInt64 type;\n\n  SzData_Clear(&ssi->sdSizes);\n  SzData_Clear(&ssi->sdCRCs);\n  SzData_Clear(&ssi->sdNumSubStreams);\n\n  *dataOffset = 0;\n  RINOK(ReadID(sd, &type));\n  if (type == k7zIdPackInfo)\n  {\n    RINOK(ReadNumber(sd, dataOffset));\n    RINOK(ReadPackInfo(p, sd, alloc));\n    RINOK(ReadID(sd, &type));\n  }\n  if (type == k7zIdUnpackInfo)\n  {\n    RINOK(ReadUnpackInfo(p, sd, numFoldersMax, tempBufs, numTempBufs, alloc));\n    RINOK(ReadID(sd, &type));\n  }\n  if (type == k7zIdSubStreamsInfo)\n  {\n    RINOK(ReadSubStreamsInfo(p, sd, ssi));\n    RINOK(ReadID(sd, &type));\n  }\n  else\n  {\n    ssi->NumTotalSubStreams = p->NumFolders;\n    /* ssi->NumSubDigests = 0; */\n  }\n\n  return (type == k7zIdEnd ? SZ_OK : SZ_ERROR_UNSUPPORTED);\n}\n\nstatic SRes SzReadAndDecodePackedStreams(\n    ILookInStream *inStream,\n    CSzData *sd,\n    CBuf *tempBufs,\n    UInt32 numFoldersMax,\n    UInt64 baseOffset,\n    CSzAr *p,\n    ISzAlloc *allocTemp)\n{\n  UInt64 dataStartPos = 0;\n  UInt32 fo;\n  CSubStreamInfo ssi;\n  UInt32 numFolders;\n\n  RINOK(SzReadStreamsInfo(p, sd, numFoldersMax, NULL, 0, &dataStartPos, &ssi, allocTemp));\n\n  numFolders = p->NumFolders;\n  if (numFolders == 0)\n    return SZ_ERROR_ARCHIVE;\n  else if (numFolders > numFoldersMax)\n    return SZ_ERROR_UNSUPPORTED;\n\n  dataStartPos += baseOffset;\n\n  for (fo = 0; fo < numFolders; fo++)\n    Buf_Init(tempBufs + fo);\n  \n  for (fo = 0; fo < numFolders; fo++)\n  {\n    CBuf *tempBuf = tempBufs + fo;\n    UInt64 unpackSize = SzAr_GetFolderUnpackSize(p, fo);\n    if ((size_t)unpackSize != unpackSize)\n      return SZ_ERROR_MEM;\n    if (!Buf_Create(tempBuf, (size_t)unpackSize, allocTemp))\n      return SZ_ERROR_MEM;\n  }\n  \n  for (fo = 0; fo < numFolders; fo++)\n  {\n    const CBuf *tempBuf = tempBufs + fo;\n    RINOK(LookInStream_SeekTo(inStream, dataStartPos));\n    RINOK(SzAr_DecodeFolder(p, fo, inStream, dataStartPos, tempBuf->data, tempBuf->size, allocTemp));\n  }\n  \n  return SZ_OK;\n}\n\nstatic SRes SzReadFileNames(const Byte *data, size_t size, UInt32 numFiles, size_t *offsets)\n{\n  size_t pos = 0;\n  *offsets++ = 0;\n  if (numFiles == 0)\n    return (size == 0) ? SZ_OK : SZ_ERROR_ARCHIVE;\n  if (size < 2)\n    return SZ_ERROR_ARCHIVE;\n  if (data[size - 2] != 0 || data[size - 1] != 0)\n    return SZ_ERROR_ARCHIVE;\n  do\n  {\n    const Byte *p;\n    if (pos == size)\n      return SZ_ERROR_ARCHIVE;\n    for (p = data + pos;\n      #ifdef _WIN32\n      *(const UInt16 *)p != 0\n      #else\n      p[0] != 0 || p[1] != 0\n      #endif\n      ; p += 2);\n    pos = p - data + 2;\n    *offsets++ = (pos >> 1);\n  }\n  while (--numFiles);\n  return (pos == size) ? SZ_OK : SZ_ERROR_ARCHIVE;\n}\n\nstatic MY_NO_INLINE SRes ReadTime(CSzBitUi64s *p, UInt32 num,\n    CSzData *sd2,\n    const CBuf *tempBufs, UInt32 numTempBufs,\n    ISzAlloc *alloc)\n{\n  CSzData sd;\n  UInt32 i;\n  CNtfsFileTime *vals;\n  Byte *defs;\n  Byte external;\n  \n  RINOK(ReadBitVector(sd2, num, &p->Defs, alloc));\n  \n  SZ_READ_BYTE_SD(sd2, external);\n  if (external == 0)\n    sd = *sd2;\n  else\n  {\n    UInt32 index;\n    RINOK(SzReadNumber32(sd2, &index));\n    if (index >= numTempBufs)\n      return SZ_ERROR_ARCHIVE;\n    sd.Data = tempBufs[index].data;\n    sd.Size = tempBufs[index].size;\n  }\n  \n  MY_ALLOC_ZE(CNtfsFileTime, p->Vals, num, alloc);\n  vals = p->Vals;\n  defs = p->Defs;\n  for (i = 0; i < num; i++)\n    if (SzBitArray_Check(defs, i))\n    {\n      if (sd.Size < 8)\n        return SZ_ERROR_ARCHIVE;\n      vals[i].Low = GetUi32(sd.Data);\n      vals[i].High = GetUi32(sd.Data + 4);\n      SKIP_DATA2(sd, 8);\n    }\n    else\n      vals[i].High = vals[i].Low = 0;\n  \n  if (external == 0)\n    *sd2 = sd;\n  \n  return SZ_OK;\n}\n\n\n#define NUM_ADDITIONAL_STREAMS_MAX 8\n\n\nstatic SRes SzReadHeader2(\n    CSzArEx *p,   /* allocMain */\n    CSzData *sd,\n    ILookInStream *inStream,\n    CBuf *tempBufs, UInt32 *numTempBufs,\n    ISzAlloc *allocMain,\n    ISzAlloc *allocTemp\n    )\n{\n  CSubStreamInfo ssi;\n\n{\n  UInt64 type;\n  \n  SzData_Clear(&ssi.sdSizes);\n  SzData_Clear(&ssi.sdCRCs);\n  SzData_Clear(&ssi.sdNumSubStreams);\n\n  ssi.NumSubDigests = 0;\n  ssi.NumTotalSubStreams = 0;\n\n  RINOK(ReadID(sd, &type));\n\n  if (type == k7zIdArchiveProperties)\n  {\n    for (;;)\n    {\n      UInt64 type2;\n      RINOK(ReadID(sd, &type2));\n      if (type2 == k7zIdEnd)\n        break;\n      RINOK(SkipData(sd));\n    }\n    RINOK(ReadID(sd, &type));\n  }\n\n  if (type == k7zIdAdditionalStreamsInfo)\n  {\n    CSzAr tempAr;\n    SRes res;\n    \n    SzAr_Init(&tempAr);\n    res = SzReadAndDecodePackedStreams(inStream, sd, tempBufs, NUM_ADDITIONAL_STREAMS_MAX,\n        p->startPosAfterHeader, &tempAr, allocTemp);\n    *numTempBufs = tempAr.NumFolders;\n    SzAr_Free(&tempAr, allocTemp);\n    \n    if (res != SZ_OK)\n      return res;\n    RINOK(ReadID(sd, &type));\n  }\n\n  if (type == k7zIdMainStreamsInfo)\n  {\n    RINOK(SzReadStreamsInfo(&p->db, sd, (UInt32)1 << 30, tempBufs, *numTempBufs,\n        &p->dataPos, &ssi, allocMain));\n    p->dataPos += p->startPosAfterHeader;\n    RINOK(ReadID(sd, &type));\n  }\n\n  if (type == k7zIdEnd)\n  {\n    return SZ_OK;\n  }\n\n  if (type != k7zIdFilesInfo)\n    return SZ_ERROR_ARCHIVE;\n}\n\n{\n  UInt32 numFiles = 0;\n  UInt32 numEmptyStreams = 0;\n  const Byte *emptyStreams = NULL;\n  const Byte *emptyFiles = NULL;\n  \n  RINOK(SzReadNumber32(sd, &numFiles));\n  p->NumFiles = numFiles;\n\n  for (;;)\n  {\n    UInt64 type;\n    UInt64 size;\n    RINOK(ReadID(sd, &type));\n    if (type == k7zIdEnd)\n      break;\n    RINOK(ReadNumber(sd, &size));\n    if (size > sd->Size)\n      return SZ_ERROR_ARCHIVE;\n    \n    if (type >= ((UInt32)1 << 8))\n    {\n      SKIP_DATA(sd, size);\n    }\n    else switch ((unsigned)type)\n    {\n      case k7zIdName:\n      {\n        size_t namesSize;\n        const Byte *namesData;\n        Byte external;\n\n        SZ_READ_BYTE(external);\n        if (external == 0)\n        {\n          namesSize = (size_t)size - 1;\n          namesData = sd->Data;\n        }\n        else\n        {\n          UInt32 index;\n          RINOK(SzReadNumber32(sd, &index));\n          if (index >= *numTempBufs)\n            return SZ_ERROR_ARCHIVE;\n          namesData = (tempBufs)[index].data;\n          namesSize = (tempBufs)[index].size;\n        }\n\n        if ((namesSize & 1) != 0)\n          return SZ_ERROR_ARCHIVE;\n        MY_ALLOC(size_t, p->FileNameOffsets, numFiles + 1, allocMain);\n        MY_ALLOC_ZE_AND_CPY(p->FileNames, namesSize, namesData, allocMain);\n        RINOK(SzReadFileNames(p->FileNames, namesSize, numFiles, p->FileNameOffsets))\n        if (external == 0)\n        {\n          SKIP_DATA(sd, namesSize);\n        }\n        break;\n      }\n      case k7zIdEmptyStream:\n      {\n        RINOK(RememberBitVector(sd, numFiles, &emptyStreams));\n        numEmptyStreams = CountDefinedBits(emptyStreams, numFiles);\n        emptyFiles = NULL;\n        break;\n      }\n      case k7zIdEmptyFile:\n      {\n        RINOK(RememberBitVector(sd, numEmptyStreams, &emptyFiles));\n        break;\n      }\n      case k7zIdWinAttrib:\n      {\n        Byte external;\n        CSzData sdSwitch;\n        CSzData *sdPtr;\n        SzBitUi32s_Free(&p->Attribs, allocMain);\n        RINOK(ReadBitVector(sd, numFiles, &p->Attribs.Defs, allocMain));\n\n        SZ_READ_BYTE(external);\n        if (external == 0)\n          sdPtr = sd;\n        else\n        {\n          UInt32 index;\n          RINOK(SzReadNumber32(sd, &index));\n          if (index >= *numTempBufs)\n            return SZ_ERROR_ARCHIVE;\n          sdSwitch.Data = (tempBufs)[index].data;\n          sdSwitch.Size = (tempBufs)[index].size;\n          sdPtr = &sdSwitch;\n        }\n        RINOK(ReadUi32s(sdPtr, numFiles, &p->Attribs, allocMain));\n        break;\n      }\n      /*\n      case k7zParent:\n      {\n        SzBitUi32s_Free(&p->Parents, allocMain);\n        RINOK(ReadBitVector(sd, numFiles, &p->Parents.Defs, allocMain));\n        RINOK(SzReadSwitch(sd));\n        RINOK(ReadUi32s(sd, numFiles, &p->Parents, allocMain));\n        break;\n      }\n      */\n      case k7zIdMTime: RINOK(ReadTime(&p->MTime, numFiles, sd, tempBufs, *numTempBufs, allocMain)); break;\n      case k7zIdCTime: RINOK(ReadTime(&p->CTime, numFiles, sd, tempBufs, *numTempBufs, allocMain)); break;\n      default:\n      {\n        SKIP_DATA(sd, size);\n      }\n    }\n  }\n\n  if (numFiles - numEmptyStreams != ssi.NumTotalSubStreams)\n    return SZ_ERROR_ARCHIVE;\n\n  for (;;)\n  {\n    UInt64 type;\n    RINOK(ReadID(sd, &type));\n    if (type == k7zIdEnd)\n      break;\n    RINOK(SkipData(sd));\n  }\n\n  {\n    UInt32 i;\n    UInt32 emptyFileIndex = 0;\n    UInt32 folderIndex = 0;\n    UInt32 remSubStreams = 0;\n    UInt32 numSubStreams = 0;\n    UInt64 unpackPos = 0;\n    const Byte *digestsDefs = NULL;\n    const Byte *digestsVals = NULL;\n    UInt32 digestsValsIndex = 0;\n    UInt32 digestIndex;\n    Byte allDigestsDefined = 0;\n    Byte isDirMask = 0;\n    Byte crcMask = 0;\n    Byte mask = 0x80;\n    \n    MY_ALLOC(UInt32, p->FolderToFile, p->db.NumFolders + 1, allocMain);\n    MY_ALLOC_ZE(UInt32, p->FileToFolder, p->NumFiles, allocMain);\n    MY_ALLOC(UInt64, p->UnpackPositions, p->NumFiles + 1, allocMain);\n    MY_ALLOC_ZE(Byte, p->IsDirs, (p->NumFiles + 7) >> 3, allocMain);\n\n    RINOK(SzBitUi32s_Alloc(&p->CRCs, p->NumFiles, allocMain));\n\n    if (ssi.sdCRCs.Size != 0)\n    {\n      SZ_READ_BYTE_SD(&ssi.sdCRCs, allDigestsDefined);\n      if (allDigestsDefined)\n        digestsVals = ssi.sdCRCs.Data;\n      else\n      {\n        size_t numBytes = (ssi.NumSubDigests + 7) >> 3;\n        digestsDefs = ssi.sdCRCs.Data;\n        digestsVals = digestsDefs + numBytes;\n      }\n    }\n\n    digestIndex = 0;\n    \n    for (i = 0; i < numFiles; i++, mask >>= 1)\n    {\n      if (mask == 0)\n      {\n        UInt32 byteIndex = (i - 1) >> 3;\n        p->IsDirs[byteIndex] = isDirMask;\n        p->CRCs.Defs[byteIndex] = crcMask;\n        isDirMask = 0;\n        crcMask = 0;\n        mask = 0x80;\n      }\n\n      p->UnpackPositions[i] = unpackPos;\n      p->CRCs.Vals[i] = 0;\n      \n      if (emptyStreams && SzBitArray_Check(emptyStreams, i))\n      {\n        if (emptyFiles)\n        {\n          if (!SzBitArray_Check(emptyFiles, emptyFileIndex))\n            isDirMask |= mask;\n          emptyFileIndex++;\n        }\n        else\n          isDirMask |= mask;\n        if (remSubStreams == 0)\n        {\n          p->FileToFolder[i] = (UInt32)-1;\n          continue;\n        }\n      }\n      \n      if (remSubStreams == 0)\n      {\n        for (;;)\n        {\n          if (folderIndex >= p->db.NumFolders)\n            return SZ_ERROR_ARCHIVE;\n          p->FolderToFile[folderIndex] = i;\n          numSubStreams = 1;\n          if (ssi.sdNumSubStreams.Data)\n          {\n            RINOK(SzReadNumber32(&ssi.sdNumSubStreams, &numSubStreams));\n          }\n          remSubStreams = numSubStreams;\n          if (numSubStreams != 0)\n            break;\n          {\n            UInt64 folderUnpackSize = SzAr_GetFolderUnpackSize(&p->db, folderIndex);\n            unpackPos += folderUnpackSize;\n            if (unpackPos < folderUnpackSize)\n              return SZ_ERROR_ARCHIVE;\n          }\n\n          folderIndex++;\n        }\n      }\n      \n      p->FileToFolder[i] = folderIndex;\n      \n      if (emptyStreams && SzBitArray_Check(emptyStreams, i))\n        continue;\n      \n      if (--remSubStreams == 0)\n      {\n        UInt64 folderUnpackSize = SzAr_GetFolderUnpackSize(&p->db, folderIndex);\n        UInt64 startFolderUnpackPos = p->UnpackPositions[p->FolderToFile[folderIndex]];\n        if (folderUnpackSize < unpackPos - startFolderUnpackPos)\n          return SZ_ERROR_ARCHIVE;\n        unpackPos = startFolderUnpackPos + folderUnpackSize;\n        if (unpackPos < folderUnpackSize)\n          return SZ_ERROR_ARCHIVE;\n\n        if (numSubStreams == 1 && SzBitWithVals_Check(&p->db.FolderCRCs, i))\n        {\n          p->CRCs.Vals[i] = p->db.FolderCRCs.Vals[folderIndex];\n          crcMask |= mask;\n        }\n        else if (allDigestsDefined || (digestsDefs && SzBitArray_Check(digestsDefs, digestIndex)))\n        {\n          p->CRCs.Vals[i] = GetUi32(digestsVals + (size_t)digestsValsIndex * 4);\n          digestsValsIndex++;\n          crcMask |= mask;\n        }\n        \n        folderIndex++;\n      }\n      else\n      {\n        UInt64 v;\n        RINOK(ReadNumber(&ssi.sdSizes, &v));\n        unpackPos += v;\n        if (unpackPos < v)\n          return SZ_ERROR_ARCHIVE;\n        if (allDigestsDefined || (digestsDefs && SzBitArray_Check(digestsDefs, digestIndex)))\n        {\n          p->CRCs.Vals[i] = GetUi32(digestsVals + (size_t)digestsValsIndex * 4);\n          digestsValsIndex++;\n          crcMask |= mask;\n        }\n      }\n    }\n\n    if (mask != 0x80)\n    {\n      UInt32 byteIndex = (i - 1) >> 3;\n      p->IsDirs[byteIndex] = isDirMask;\n      p->CRCs.Defs[byteIndex] = crcMask;\n    }\n    \n    p->UnpackPositions[i] = unpackPos;\n\n    if (remSubStreams != 0)\n      return SZ_ERROR_ARCHIVE;\n\n    for (;;)\n    {\n      p->FolderToFile[folderIndex] = i;\n      if (folderIndex >= p->db.NumFolders)\n        break;\n      if (!ssi.sdNumSubStreams.Data)\n        return SZ_ERROR_ARCHIVE;\n      RINOK(SzReadNumber32(&ssi.sdNumSubStreams, &numSubStreams));\n      if (numSubStreams != 0)\n        return SZ_ERROR_ARCHIVE;\n      /*\n      {\n        UInt64 folderUnpackSize = SzAr_GetFolderUnpackSize(&p->db, folderIndex);\n        unpackPos += folderUnpackSize;\n        if (unpackPos < folderUnpackSize)\n          return SZ_ERROR_ARCHIVE;\n      }\n      */\n      folderIndex++;\n    }\n\n    if (ssi.sdNumSubStreams.Data && ssi.sdNumSubStreams.Size != 0)\n      return SZ_ERROR_ARCHIVE;\n  }\n}\n  return SZ_OK;\n}\n\n\nstatic SRes SzReadHeader(\n    CSzArEx *p,\n    CSzData *sd,\n    ILookInStream *inStream,\n    ISzAlloc *allocMain,\n    ISzAlloc *allocTemp)\n{\n  UInt32 i;\n  UInt32 numTempBufs = 0;\n  SRes res;\n  CBuf tempBufs[NUM_ADDITIONAL_STREAMS_MAX];\n\n  for (i = 0; i < NUM_ADDITIONAL_STREAMS_MAX; i++)\n    Buf_Init(tempBufs + i);\n  \n  res = SzReadHeader2(p, sd, inStream,\n      tempBufs, &numTempBufs,\n      allocMain, allocTemp);\n  \n  for (i = 0; i < NUM_ADDITIONAL_STREAMS_MAX; i++)\n    Buf_Free(tempBufs + i, allocTemp);\n\n  RINOK(res);\n\n  if (sd->Size != 0)\n    return SZ_ERROR_FAIL;\n\n  return res;\n}\n\nstatic SRes SzArEx_Open2(\n    CSzArEx *p,\n    ILookInStream *inStream,\n    ISzAlloc *allocMain,\n    ISzAlloc *allocTemp)\n{\n  Byte header[k7zStartHeaderSize];\n  Int64 startArcPos;\n  UInt64 nextHeaderOffset, nextHeaderSize;\n  size_t nextHeaderSizeT;\n  UInt32 nextHeaderCRC;\n  CBuf buf;\n  SRes res;\n\n  startArcPos = 0;\n  RINOK(inStream->Seek(inStream, &startArcPos, SZ_SEEK_CUR));\n\n  RINOK(LookInStream_Read2(inStream, header, k7zStartHeaderSize, SZ_ERROR_NO_ARCHIVE));\n\n  if (!TestSignatureCandidate(header))\n    return SZ_ERROR_NO_ARCHIVE;\n  if (header[6] != k7zMajorVersion)\n    return SZ_ERROR_UNSUPPORTED;\n\n  nextHeaderOffset = GetUi64(header + 12);\n  nextHeaderSize = GetUi64(header + 20);\n  nextHeaderCRC = GetUi32(header + 28);\n\n  p->startPosAfterHeader = startArcPos + k7zStartHeaderSize;\n  \n  if (CrcCalc(header + 12, 20) != GetUi32(header + 8))\n    return SZ_ERROR_CRC;\n\n  nextHeaderSizeT = (size_t)nextHeaderSize;\n  if (nextHeaderSizeT != nextHeaderSize)\n    return SZ_ERROR_MEM;\n  if (nextHeaderSizeT == 0)\n    return SZ_OK;\n  if (nextHeaderOffset > nextHeaderOffset + nextHeaderSize ||\n      nextHeaderOffset > nextHeaderOffset + nextHeaderSize + k7zStartHeaderSize)\n    return SZ_ERROR_NO_ARCHIVE;\n\n  {\n    Int64 pos = 0;\n    RINOK(inStream->Seek(inStream, &pos, SZ_SEEK_END));\n    if ((UInt64)pos < startArcPos + nextHeaderOffset ||\n        (UInt64)pos < startArcPos + k7zStartHeaderSize + nextHeaderOffset ||\n        (UInt64)pos < startArcPos + k7zStartHeaderSize + nextHeaderOffset + nextHeaderSize)\n      return SZ_ERROR_INPUT_EOF;\n  }\n\n  RINOK(LookInStream_SeekTo(inStream, startArcPos + k7zStartHeaderSize + nextHeaderOffset));\n\n  if (!Buf_Create(&buf, nextHeaderSizeT, allocTemp))\n    return SZ_ERROR_MEM;\n\n  res = LookInStream_Read(inStream, buf.data, nextHeaderSizeT);\n  \n  if (res == SZ_OK)\n  {\n    res = SZ_ERROR_ARCHIVE;\n    if (CrcCalc(buf.data, nextHeaderSizeT) == nextHeaderCRC)\n    {\n      CSzData sd;\n      UInt64 type;\n      sd.Data = buf.data;\n      sd.Size = buf.size;\n      \n      res = ReadID(&sd, &type);\n      \n      if (res == SZ_OK && type == k7zIdEncodedHeader)\n      {\n        CSzAr tempAr;\n        CBuf tempBuf;\n        Buf_Init(&tempBuf);\n        \n        SzAr_Init(&tempAr);\n        res = SzReadAndDecodePackedStreams(inStream, &sd, &tempBuf, 1, p->startPosAfterHeader, &tempAr, allocTemp);\n        SzAr_Free(&tempAr, allocTemp);\n       \n        if (res != SZ_OK)\n        {\n          Buf_Free(&tempBuf, allocTemp);\n        }\n        else\n        {\n          Buf_Free(&buf, allocTemp);\n          buf.data = tempBuf.data;\n          buf.size = tempBuf.size;\n          sd.Data = buf.data;\n          sd.Size = buf.size;\n          res = ReadID(&sd, &type);\n        }\n      }\n  \n      if (res == SZ_OK)\n      {\n        if (type == k7zIdHeader)\n        {\n          /*\n          CSzData sd2;\n          unsigned ttt;\n          for (ttt = 0; ttt < 40000; ttt++)\n          {\n            SzArEx_Free(p, allocMain);\n            sd2 = sd;\n            res = SzReadHeader(p, &sd2, inStream, allocMain, allocTemp);\n            if (res != SZ_OK)\n              break;\n          }\n          */\n          res = SzReadHeader(p, &sd, inStream, allocMain, allocTemp);\n        }\n        else\n          res = SZ_ERROR_UNSUPPORTED;\n      }\n    }\n  }\n \n  Buf_Free(&buf, allocTemp);\n  return res;\n}\n\n\nstatic SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream,\n    ISzAlloc *allocMain, ISzAlloc *allocTemp)\n{\n  SRes res = SzArEx_Open2(p, inStream, allocMain, allocTemp);\n  if (res != SZ_OK)\n    SzArEx_Free(p, allocMain);\n  return res;\n}\n\n\nstatic SRes SzArEx_Extract(\n    const CSzArEx *p,\n    ILookInStream *inStream,\n    UInt32 fileIndex,\n    UInt32 *blockIndex,\n    Byte **tempBuf,\n    size_t *outBufferSize,\n    size_t *offset,\n    size_t *outSizeProcessed,\n    ISzAlloc *allocMain,\n    ISzAlloc *allocTemp)\n{\n  UInt32 folderIndex = p->FileToFolder[fileIndex];\n  SRes res = SZ_OK;\n  \n  *offset = 0;\n  *outSizeProcessed = 0;\n  \n  if (folderIndex == (UInt32)-1)\n  {\n    IAlloc_Free(allocMain, *tempBuf);\n    *blockIndex = folderIndex;\n    *tempBuf = NULL;\n    *outBufferSize = 0;\n    return SZ_OK;\n  }\n\n  if (*tempBuf == NULL || *blockIndex != folderIndex)\n  {\n    UInt64 unpackSizeSpec = SzAr_GetFolderUnpackSize(&p->db, folderIndex);\n    /*\n    UInt64 unpackSizeSpec =\n        p->UnpackPositions[p->FolderToFile[folderIndex + 1]] -\n        p->UnpackPositions[p->FolderToFile[folderIndex]];\n    */\n    size_t unpackSize = (size_t)unpackSizeSpec;\n\n    if (unpackSize != unpackSizeSpec)\n      return SZ_ERROR_MEM;\n    *blockIndex = folderIndex;\n    IAlloc_Free(allocMain, *tempBuf);\n    *tempBuf = NULL;\n    \n    if (res == SZ_OK)\n    {\n      *outBufferSize = unpackSize;\n      if (unpackSize != 0)\n      {\n        *tempBuf = (Byte *)IAlloc_Alloc(allocMain, unpackSize);\n        if (*tempBuf == NULL)\n          res = SZ_ERROR_MEM;\n      }\n  \n      if (res == SZ_OK)\n      {\n        res = SzAr_DecodeFolder(&p->db, folderIndex,\n            inStream, p->dataPos, *tempBuf, unpackSize, allocTemp);\n      }\n    }\n  }\n\n  if (res == SZ_OK)\n  {\n    UInt64 unpackPos = p->UnpackPositions[fileIndex];\n    *offset = (size_t)(unpackPos - p->UnpackPositions[p->FolderToFile[folderIndex]]);\n    *outSizeProcessed = (size_t)(p->UnpackPositions[fileIndex + 1] - unpackPos);\n    if (*offset + *outSizeProcessed > *outBufferSize)\n      return SZ_ERROR_FAIL;\n    if (SzBitWithVals_Check(&p->CRCs, fileIndex))\n      if (CrcCalc(*tempBuf + *offset, *outSizeProcessed) != p->CRCs.Vals[fileIndex])\n        res = SZ_ERROR_CRC;\n  }\n\n  return res;\n}\n\n\nstatic size_t SzArEx_GetFileNameUtf16(const CSzArEx *p, size_t fileIndex, UInt16 *dest)\n{\n  size_t offs = p->FileNameOffsets[fileIndex];\n  size_t len = p->FileNameOffsets[fileIndex + 1] - offs;\n  if (dest != 0)\n  {\n    size_t i;\n    const Byte *src = p->FileNames + offs * 2;\n    for (i = 0; i < len; i++)\n      dest[i] = GetUi16(src + i * 2);\n  }\n  return len;\n}\n\n/*\nstatic size_t SzArEx_GetFullNameLen(const CSzArEx *p, size_t fileIndex)\n{\n  size_t len;\n  if (!p->FileNameOffsets)\n    return 1;\n  len = 0;\n  for (;;)\n  {\n    UInt32 parent = (UInt32)(Int32)-1;\n    len += p->FileNameOffsets[fileIndex + 1] - p->FileNameOffsets[fileIndex];\n    if SzBitWithVals_Check(&p->Parents, fileIndex)\n      parent = p->Parents.Vals[fileIndex];\n    if (parent == (UInt32)(Int32)-1)\n      return len;\n    fileIndex = parent;\n  }\n}\n\nstatic UInt16 *SzArEx_GetFullNameUtf16_Back(const CSzArEx *p, size_t fileIndex, UInt16 *dest)\n{\n  Bool needSlash;\n  if (!p->FileNameOffsets)\n  {\n    *(--dest) = 0;\n    return dest;\n  }\n  needSlash = False;\n  for (;;)\n  {\n    UInt32 parent = (UInt32)(Int32)-1;\n    size_t curLen = p->FileNameOffsets[fileIndex + 1] - p->FileNameOffsets[fileIndex];\n    SzArEx_GetFileNameUtf16(p, fileIndex, dest - curLen);\n    if (needSlash)\n      *(dest - 1) = '/';\n    needSlash = True;\n    dest -= curLen;\n\n    if SzBitWithVals_Check(&p->Parents, fileIndex)\n      parent = p->Parents.Vals[fileIndex];\n    if (parent == (UInt32)(Int32)-1)\n      return dest;\n    fileIndex = parent;\n  }\n}\n*/\n\n/* 7zBuf.c -- Byte Buffer\n2013-01-21 : Igor Pavlov : Public domain */\n\n/*\n#include \"Precomp.h\"\n\n#include \"7zBuf.h\"\n*/\n\nstatic void Buf_Init(CBuf *p)\n{\n  p->data = 0;\n  p->size = 0;\n}\n\nstatic int Buf_Create(CBuf *p, size_t size, ISzAlloc *alloc)\n{\n  p->size = 0;\n  if (size == 0)\n  {\n    p->data = 0;\n    return 1;\n  }\n  p->data = (Byte *)alloc->Alloc(alloc, size);\n  if (p->data != 0)\n  {\n    p->size = size;\n    return 1;\n  }\n  return 0;\n}\n\nstatic void Buf_Free(CBuf *p, ISzAlloc *alloc)\n{\n  alloc->Free(alloc, p->data);\n  p->data = 0;\n  p->size = 0;\n}\n\n/* 7zDec.c -- Decoding from 7z folder\n2015-11-18 : Igor Pavlov : Public domain */\n\n/* #define _7ZIP_PPMD_SUPPPORT */\n\n/*\n#include \"Precomp.h\"\n\n#include <string.h>\n\n#include \"7z.h\"\n#include \"7zCrc.h\"\n\n#include \"Bcj2.h\"\n#include \"Bra.h\"\n#include \"CpuArch.h\"\n#include \"Delta.h\"\n#include \"LzmaDec.h\"\n#include \"Lzma2Dec.h\"\n#ifdef _7ZIP_PPMD_SUPPPORT\n#include \"Ppmd7.h\"\n#endif\n*/\n\n#define k_Copy 0\n#define k_Delta 3\n#define k_LZMA2 0x21\n#define k_LZMA  0x30101\n#define k_BCJ   0x3030103\n#define k_BCJ2  0x303011B\n#define k_PPC   0x3030205\n#define k_IA64  0x3030401\n#define k_ARM   0x3030501\n#define k_ARMT  0x3030701\n#define k_SPARC 0x3030805\n\n\n#ifdef _7ZIP_PPMD_SUPPPORT\n\n#define k_PPMD 0x30401\n\ntypedef struct\n{\n  IByteIn p;\n  const Byte *cur;\n  const Byte *end;\n  const Byte *begin;\n  UInt64 processed;\n  Bool extra;\n  SRes res;\n  ILookInStream *inStream;\n} CByteInToLook;\n\nstatic Byte ReadByte(void *pp)\n{\n  CByteInToLook *p = (CByteInToLook *)pp;\n  if (p->cur != p->end)\n    return *p->cur++;\n  if (p->res == SZ_OK)\n  {\n    size_t size = p->cur - p->begin;\n    p->processed += size;\n    p->res = p->inStream->Skip(p->inStream, size);\n    size = (1 << 25);\n    p->res = p->inStream->Look(p->inStream, (const void **)&p->begin, &size);\n    p->cur = p->begin;\n    p->end = p->begin + size;\n    if (size != 0)\n      return *p->cur++;;\n  }\n  p->extra = True;\n  return 0;\n}\n\nstatic SRes SzDecodePpmd(const Byte *props, unsigned propsSize, UInt64 inSize, ILookInStream *inStream,\n    Byte *outBuffer, SizeT outSize, ISzAlloc *allocMain)\n{\n  CPpmd7 ppmd;\n  CByteInToLook s;\n  SRes res = SZ_OK;\n\n  s.p.Read = ReadByte;\n  s.inStream = inStream;\n  s.begin = s.end = s.cur = NULL;\n  s.extra = False;\n  s.res = SZ_OK;\n  s.processed = 0;\n\n  if (propsSize != 5)\n    return SZ_ERROR_UNSUPPORTED;\n\n  {\n    unsigned order = props[0];\n    UInt32 memSize = GetUi32(props + 1);\n    if (order < PPMD7_MIN_ORDER ||\n        order > PPMD7_MAX_ORDER ||\n        memSize < PPMD7_MIN_MEM_SIZE ||\n        memSize > PPMD7_MAX_MEM_SIZE)\n      return SZ_ERROR_UNSUPPORTED;\n    Ppmd7_Construct(&ppmd);\n    if (!Ppmd7_Alloc(&ppmd, memSize, allocMain))\n      return SZ_ERROR_MEM;\n    Ppmd7_Init(&ppmd, order);\n  }\n  {\n    CPpmd7z_RangeDec rc;\n    Ppmd7z_RangeDec_CreateVTable(&rc);\n    rc.Stream = &s.p;\n    if (!Ppmd7z_RangeDec_Init(&rc))\n      res = SZ_ERROR_DATA;\n    else if (s.extra)\n      res = (s.res != SZ_OK ? s.res : SZ_ERROR_DATA);\n    else\n    {\n      SizeT i;\n      for (i = 0; i < outSize; i++)\n      {\n        int sym = Ppmd7_DecodeSymbol(&ppmd, &rc.p);\n        if (s.extra || sym < 0)\n          break;\n        outBuffer[i] = (Byte)sym;\n      }\n      if (i != outSize)\n        res = (s.res != SZ_OK ? s.res : SZ_ERROR_DATA);\n      else if (s.processed + (s.cur - s.begin) != inSize || !Ppmd7z_RangeDec_IsFinishedOK(&rc))\n        res = SZ_ERROR_DATA;\n    }\n  }\n  Ppmd7_Free(&ppmd, allocMain);\n  return res;\n}\n\n#endif\n\n\nstatic SRes SzDecodeLzma(const Byte *props, unsigned propsSize, UInt64 inSize, ILookInStream *inStream,\n    Byte *outBuffer, SizeT outSize, ISzAlloc *allocMain)\n{\n  CLzmaDec state;\n  SRes res = SZ_OK;\n\n  LzmaDec_Construct(&state);\n  RINOK(LzmaDec_AllocateProbs(&state, props, propsSize, allocMain));\n  state.dic = outBuffer;\n  state.dicBufSize = outSize;\n  LzmaDec_Init(&state);\n\n  for (;;)\n  {\n    const void *inBuf = NULL;\n    size_t lookahead = (1 << 18);\n    if (lookahead > inSize)\n      lookahead = (size_t)inSize;\n    res = inStream->Look(inStream, &inBuf, &lookahead);\n    if (res != SZ_OK)\n      break;\n\n    {\n      SizeT inProcessed = (SizeT)lookahead, dicPos = state.dicPos;\n      ELzmaStatus status;\n      res = LzmaDec_DecodeToDic(&state, outSize, inBuf, &inProcessed, LZMA_FINISH_END, &status);\n      lookahead -= inProcessed;\n      inSize -= inProcessed;\n      if (res != SZ_OK)\n        break;\n\n      if (status == LZMA_STATUS_FINISHED_WITH_MARK)\n      {\n        if (outSize != state.dicPos || inSize != 0)\n          res = SZ_ERROR_DATA;\n        break;\n      }\n\n      if (outSize == state.dicPos && inSize == 0 && status == LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK)\n        break;\n\n      if (inProcessed == 0 && dicPos == state.dicPos)\n      {\n        res = SZ_ERROR_DATA;\n        break;\n      }\n\n      res = inStream->Skip((void *)inStream, inProcessed);\n      if (res != SZ_OK)\n        break;\n    }\n  }\n\n  LzmaDec_FreeProbs(&state, allocMain);\n  return res;\n}\n\n\n#ifndef _7Z_NO_METHOD_LZMA2\n\nstatic SRes SzDecodeLzma2(const Byte *props, unsigned propsSize, UInt64 inSize, ILookInStream *inStream,\n    Byte *outBuffer, SizeT outSize, ISzAlloc *allocMain)\n{\n  CLzma2Dec state;\n  SRes res = SZ_OK;\n\n  Lzma2Dec_Construct(&state);\n  if (propsSize != 1)\n    return SZ_ERROR_DATA;\n  RINOK(Lzma2Dec_AllocateProbs(&state, props[0], allocMain));\n  state.decoder.dic = outBuffer;\n  state.decoder.dicBufSize = outSize;\n  Lzma2Dec_Init(&state);\n\n  for (;;)\n  {\n    const void *inBuf = NULL;\n    size_t lookahead = (1 << 18);\n    if (lookahead > inSize)\n      lookahead = (size_t)inSize;\n    res = inStream->Look(inStream, &inBuf, &lookahead);\n    if (res != SZ_OK)\n      break;\n\n    {\n      SizeT inProcessed = (SizeT)lookahead, dicPos = state.decoder.dicPos;\n      ELzmaStatus status;\n      res = Lzma2Dec_DecodeToDic(&state, outSize, inBuf, &inProcessed, LZMA_FINISH_END, &status);\n      lookahead -= inProcessed;\n      inSize -= inProcessed;\n      if (res != SZ_OK)\n        break;\n\n      if (status == LZMA_STATUS_FINISHED_WITH_MARK)\n      {\n        if (outSize != state.decoder.dicPos || inSize != 0)\n          res = SZ_ERROR_DATA;\n        break;\n      }\n\n      if (inProcessed == 0 && dicPos == state.decoder.dicPos)\n      {\n        res = SZ_ERROR_DATA;\n        break;\n      }\n\n      res = inStream->Skip((void *)inStream, inProcessed);\n      if (res != SZ_OK)\n        break;\n    }\n  }\n\n  Lzma2Dec_FreeProbs(&state, allocMain);\n  return res;\n}\n\n#endif\n\n\nstatic SRes SzDecodeCopy(UInt64 inSize, ILookInStream *inStream, Byte *outBuffer)\n{\n  while (inSize > 0)\n  {\n    const void *inBuf;\n    size_t curSize = (1 << 18);\n    if (curSize > inSize)\n      curSize = (size_t)inSize;\n    RINOK(inStream->Look(inStream, &inBuf, &curSize));\n    if (curSize == 0)\n      return SZ_ERROR_INPUT_EOF;\n    memcpy(outBuffer, inBuf, curSize);\n    outBuffer += curSize;\n    inSize -= curSize;\n    RINOK(inStream->Skip((void *)inStream, curSize));\n  }\n  return SZ_OK;\n}\n\nstatic Bool IS_MAIN_METHOD(UInt32 m)\n{\n  switch (m)\n  {\n    case k_Copy:\n    case k_LZMA:\n    #ifndef _7Z_NO_METHOD_LZMA2\n    case k_LZMA2:\n    #endif\n    #ifdef _7ZIP_PPMD_SUPPPORT\n    case k_PPMD:\n    #endif\n      return True;\n  }\n  return False;\n}\n\nstatic Bool IS_SUPPORTED_CODER(const CSzCoderInfo *c)\n{\n  return\n      c->NumStreams == 1\n      /* && c->MethodID <= (UInt32)0xFFFFFFFF */\n      && IS_MAIN_METHOD((UInt32)c->MethodID);\n}\n\n#define IS_BCJ2(c) ((c)->MethodID == k_BCJ2 && (c)->NumStreams == 4)\n\nstatic SRes CheckSupportedFolder(const CSzFolder *f)\n{\n  if (f->NumCoders < 1 || f->NumCoders > 4)\n    return SZ_ERROR_UNSUPPORTED;\n  if (!IS_SUPPORTED_CODER(&f->Coders[0]))\n    return SZ_ERROR_UNSUPPORTED;\n  if (f->NumCoders == 1)\n  {\n    if (f->NumPackStreams != 1 || f->PackStreams[0] != 0 || f->NumBonds != 0)\n      return SZ_ERROR_UNSUPPORTED;\n    return SZ_OK;\n  }\n  \n  \n  #ifndef _7Z_NO_METHODS_FILTERS\n\n  if (f->NumCoders == 2)\n  {\n    const CSzCoderInfo *c = &f->Coders[1];\n    if (\n        /* c->MethodID > (UInt32)0xFFFFFFFF || */\n        c->NumStreams != 1\n        || f->NumPackStreams != 1\n        || f->PackStreams[0] != 0\n        || f->NumBonds != 1\n        || f->Bonds[0].InIndex != 1\n        || f->Bonds[0].OutIndex != 0)\n      return SZ_ERROR_UNSUPPORTED;\n    switch ((UInt32)c->MethodID)\n    {\n      case k_Delta:\n      case k_BCJ:\n      case k_PPC:\n      case k_IA64:\n      case k_SPARC:\n      case k_ARM:\n      case k_ARMT:\n        break;\n      default:\n        return SZ_ERROR_UNSUPPORTED;\n    }\n    return SZ_OK;\n  }\n\n  #endif\n\n  \n  if (f->NumCoders == 4)\n  {\n    if (!IS_SUPPORTED_CODER(&f->Coders[1])\n        || !IS_SUPPORTED_CODER(&f->Coders[2])\n        || !IS_BCJ2(&f->Coders[3]))\n      return SZ_ERROR_UNSUPPORTED;\n    if (f->NumPackStreams != 4\n        || f->PackStreams[0] != 2\n        || f->PackStreams[1] != 6\n        || f->PackStreams[2] != 1\n        || f->PackStreams[3] != 0\n        || f->NumBonds != 3\n        || f->Bonds[0].InIndex != 5 || f->Bonds[0].OutIndex != 0\n        || f->Bonds[1].InIndex != 4 || f->Bonds[1].OutIndex != 1\n        || f->Bonds[2].InIndex != 3 || f->Bonds[2].OutIndex != 2)\n      return SZ_ERROR_UNSUPPORTED;\n    return SZ_OK;\n  }\n  \n  return SZ_ERROR_UNSUPPORTED;\n}\n\n#define CASE_BRA_CONV(isa) case k_ ## isa: isa ## _Convert(outBuffer, outSize, 0, 0); break;\n\nstatic SRes SzFolder_Decode2(const CSzFolder *folder,\n    const Byte *propsData,\n    const UInt64 *unpackSizes,\n    const UInt64 *packPositions,\n    ILookInStream *inStream, UInt64 startPos,\n    Byte *outBuffer, SizeT outSize, ISzAlloc *allocMain,\n    Byte *tempBuf[])\n{\n  UInt32 ci;\n  SizeT tempSizes[3] = { 0, 0, 0};\n  SizeT tempSize3 = 0;\n  Byte *tempBuf3 = 0;\n\n  RINOK(CheckSupportedFolder(folder));\n\n  for (ci = 0; ci < folder->NumCoders; ci++)\n  {\n    const CSzCoderInfo *coder = &folder->Coders[ci];\n\n    if (IS_MAIN_METHOD((UInt32)coder->MethodID))\n    {\n      UInt32 si = 0;\n      UInt64 offset;\n      UInt64 inSize;\n      Byte *outBufCur = outBuffer;\n      SizeT outSizeCur = outSize;\n      if (folder->NumCoders == 4)\n      {\n        UInt32 indices[] = { 3, 2, 0 };\n        UInt64 unpackSize = unpackSizes[ci];\n        si = indices[ci];\n        if (ci < 2)\n        {\n          Byte *temp;\n          outSizeCur = (SizeT)unpackSize;\n          if (outSizeCur != unpackSize)\n            return SZ_ERROR_MEM;\n          temp = (Byte *)IAlloc_Alloc(allocMain, outSizeCur);\n          if (!temp && outSizeCur != 0)\n            return SZ_ERROR_MEM;\n          outBufCur = tempBuf[1 - ci] = temp;\n          tempSizes[1 - ci] = outSizeCur;\n        }\n        else if (ci == 2)\n        {\n          if (unpackSize > outSize) /* check it */\n            return SZ_ERROR_PARAM;\n          tempBuf3 = outBufCur = outBuffer + (outSize - (size_t)unpackSize);\n          tempSize3 = outSizeCur = (SizeT)unpackSize;\n        }\n        else\n          return SZ_ERROR_UNSUPPORTED;\n      }\n      offset = packPositions[si];\n      inSize = packPositions[si + 1] - offset;\n      RINOK(LookInStream_SeekTo(inStream, startPos + offset));\n\n      if (coder->MethodID == k_Copy)\n      {\n        if (inSize != outSizeCur) /* check it */\n          return SZ_ERROR_DATA;\n        RINOK(SzDecodeCopy(inSize, inStream, outBufCur));\n      }\n      else if (coder->MethodID == k_LZMA)\n      {\n        RINOK(SzDecodeLzma(propsData + coder->PropsOffset, coder->PropsSize, inSize, inStream, outBufCur, outSizeCur, allocMain));\n      }\n      #ifndef _7Z_NO_METHOD_LZMA2\n      else if (coder->MethodID == k_LZMA2)\n      {\n        RINOK(SzDecodeLzma2(propsData + coder->PropsOffset, coder->PropsSize, inSize, inStream, outBufCur, outSizeCur, allocMain));\n      }\n      #endif\n      #ifdef _7ZIP_PPMD_SUPPPORT\n      else if (coder->MethodID == k_PPMD)\n      {\n        RINOK(SzDecodePpmd(propsData + coder->PropsOffset, coder->PropsSize, inSize, inStream, outBufCur, outSizeCur, allocMain));\n      }\n      #endif\n      else\n        return SZ_ERROR_UNSUPPORTED;\n    }\n    else if (coder->MethodID == k_BCJ2)\n    {\n      UInt64 offset = packPositions[1];\n      UInt64 s3Size = packPositions[2] - offset;\n      \n      if (ci != 3)\n        return SZ_ERROR_UNSUPPORTED;\n      \n      tempSizes[2] = (SizeT)s3Size;\n      if (tempSizes[2] != s3Size)\n        return SZ_ERROR_MEM;\n      tempBuf[2] = (Byte *)IAlloc_Alloc(allocMain, tempSizes[2]);\n      if (!tempBuf[2] && tempSizes[2] != 0)\n        return SZ_ERROR_MEM;\n      \n      RINOK(LookInStream_SeekTo(inStream, startPos + offset));\n      RINOK(SzDecodeCopy(s3Size, inStream, tempBuf[2]));\n\n      if ((tempSizes[0] & 3) != 0 ||\n          (tempSizes[1] & 3) != 0 ||\n          tempSize3 + tempSizes[0] + tempSizes[1] != outSize)\n        return SZ_ERROR_DATA;\n\n      {\n        CBcj2Dec p;\n        \n        p.bufs[0] = tempBuf3;   p.lims[0] = tempBuf3 + tempSize3;\n        p.bufs[1] = tempBuf[0]; p.lims[1] = tempBuf[0] + tempSizes[0];\n        p.bufs[2] = tempBuf[1]; p.lims[2] = tempBuf[1] + tempSizes[1];\n        p.bufs[3] = tempBuf[2]; p.lims[3] = tempBuf[2] + tempSizes[2];\n        \n        p.dest = outBuffer;\n        p.destLim = outBuffer + outSize;\n        \n        Bcj2Dec_Init(&p);\n        RINOK(Bcj2Dec_Decode(&p));\n\n        {\n          unsigned i;\n          for (i = 0; i < 4; i++)\n            if (p.bufs[i] != p.lims[i])\n              return SZ_ERROR_DATA;\n          \n          if (!Bcj2Dec_IsFinished(&p))\n            return SZ_ERROR_DATA;\n\n          if (p.dest != p.destLim\n             || p.state != BCJ2_STREAM_MAIN)\n            return SZ_ERROR_DATA;\n        }\n      }\n    }\n    #ifndef _7Z_NO_METHODS_FILTERS\n    else if (ci == 1)\n    {\n      if (coder->MethodID == k_Delta)\n      {\n        if (coder->PropsSize != 1)\n          return SZ_ERROR_UNSUPPORTED;\n        {\n          Byte state[DELTA_STATE_SIZE];\n          Delta_Init(state);\n          Delta_Decode(state, (unsigned)(propsData[coder->PropsOffset]) + 1, outBuffer, outSize);\n        }\n      }\n      else\n      {\n        if (coder->PropsSize != 0)\n          return SZ_ERROR_UNSUPPORTED;\n        switch (coder->MethodID)\n        {\n          case k_BCJ:\n          {\n            UInt32 state;\n            x86_Convert_Init(state);\n            x86_Convert(outBuffer, outSize, 0, &state, 0);\n            break;\n          }\n          CASE_BRA_CONV(PPC)\n          CASE_BRA_CONV(IA64)\n          CASE_BRA_CONV(SPARC)\n          CASE_BRA_CONV(ARM)\n          CASE_BRA_CONV(ARMT)\n          default:\n            return SZ_ERROR_UNSUPPORTED;\n        }\n      }\n    }\n    #endif\n    else\n      return SZ_ERROR_UNSUPPORTED;\n  }\n\n  return SZ_OK;\n}\n\n\nstatic SRes SzAr_DecodeFolder(const CSzAr *p, UInt32 folderIndex,\n    ILookInStream *inStream, UInt64 startPos,\n    Byte *outBuffer, size_t outSize,\n    ISzAlloc *allocMain)\n{\n  SRes res;\n  CSzFolder folder;\n  CSzData sd;\n  \n  const Byte *data = p->CodersData + p->FoCodersOffsets[folderIndex];\n  sd.Data = data;\n  sd.Size = p->FoCodersOffsets[folderIndex + 1] - p->FoCodersOffsets[folderIndex];\n  \n  res = SzGetNextFolderItem(&folder, &sd);\n  \n  if (res != SZ_OK)\n    return res;\n\n  if (sd.Size != 0\n      || folder.UnpackStream != p->FoToMainUnpackSizeIndex[folderIndex]\n      || outSize != SzAr_GetFolderUnpackSize(p, folderIndex))\n    return SZ_ERROR_FAIL;\n  {\n    unsigned i;\n    Byte *tempBuf[3] = { 0, 0, 0};\n\n    res = SzFolder_Decode2(&folder, data,\n        &p->CoderUnpackSizes[p->FoToCoderUnpackSizes[folderIndex]],\n        p->PackPositions + p->FoStartPackStreamIndex[folderIndex],\n        inStream, startPos,\n        outBuffer, (SizeT)outSize, allocMain, tempBuf);\n    \n    for (i = 0; i < 3; i++)\n      IAlloc_Free(allocMain, tempBuf[i]);\n\n    if (res == SZ_OK)\n      if (SzBitWithVals_Check(&p->FolderCRCs, folderIndex))\n        if (CrcCalc(outBuffer, outSize) != p->FolderCRCs.Vals[folderIndex])\n          res = SZ_ERROR_CRC;\n\n    return res;\n  }\n}\n\n/* Bcj2.c -- BCJ2 Decoder (Converter for x86 code)\n2015-08-01 : Igor Pavlov : Public domain */\n\n/*\n#include \"Precomp.h\"\n\n#include \"Bcj2.h\"\n#include \"CpuArch.h\"\n*/\n\n#define CProb UInt16\n\n#define kTopValue ((UInt32)1 << 24)\n#define kNumModelBits 11\n#define kBitModelTotal (1 << kNumModelBits)\n#define kNumMoveBits 5\n\n#define _IF_BIT_0 ttt = *prob; bound = (p->range >> kNumModelBits) * ttt; if (p->code < bound)\n#define _UPDATE_0 p->range = bound; *prob = (CProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits));\n#define _UPDATE_1 p->range -= bound; p->code -= bound; *prob = (CProb)(ttt - (ttt >> kNumMoveBits));\n\nstatic void Bcj2Dec_Init(CBcj2Dec *p)\n{\n  unsigned i;\n\n  p->state = BCJ2_DEC_STATE_OK;\n  p->ip = 0;\n  p->temp[3] = 0;\n  p->range = 0;\n  p->code = 0;\n  for (i = 0; i < sizeof(p->probs) / sizeof(p->probs[0]); i++)\n    p->probs[i] = kBitModelTotal >> 1;\n}\n\nstatic SRes Bcj2Dec_Decode(CBcj2Dec *p)\n{\n  if (p->range <= 5)\n  {\n    p->state = BCJ2_DEC_STATE_OK;\n    for (; p->range != 5; p->range++)\n    {\n      if (p->range == 1 && p->code != 0)\n        return SZ_ERROR_DATA;\n      \n      if (p->bufs[BCJ2_STREAM_RC] == p->lims[BCJ2_STREAM_RC])\n      {\n        p->state = BCJ2_STREAM_RC;\n        return SZ_OK;\n      }\n\n      p->code = (p->code << 8) | *(p->bufs[BCJ2_STREAM_RC])++;\n    }\n    \n    if (p->code == 0xFFFFFFFF)\n      return SZ_ERROR_DATA;\n    \n    p->range = 0xFFFFFFFF;\n  }\n  else if (p->state >= BCJ2_DEC_STATE_ORIG_0)\n  {\n    while (p->state <= BCJ2_DEC_STATE_ORIG_3)\n    {\n      Byte *dest = p->dest;\n      if (dest == p->destLim)\n        return SZ_OK;\n      *dest = p->temp[p->state++ - BCJ2_DEC_STATE_ORIG_0];\n      p->dest = dest + 1;\n    }\n  }\n\n  /*\n  if (BCJ2_IS_32BIT_STREAM(p->state))\n  {\n    const Byte *cur = p->bufs[p->state];\n    if (cur == p->lims[p->state])\n      return SZ_OK;\n    p->bufs[p->state] = cur + 4;\n    \n    {\n      UInt32 val;\n      Byte *dest;\n      SizeT rem;\n      \n      p->ip += 4;\n      val = GetBe32(cur) - p->ip;\n      dest = p->dest;\n      rem = p->destLim - dest;\n      if (rem < 4)\n      {\n        SizeT i;\n        SetUi32(p->temp, val);\n        for (i = 0; i < rem; i++)\n          dest[i] = p->temp[i];\n        p->dest = dest + rem;\n        p->state = BCJ2_DEC_STATE_ORIG_0 + (unsigned)rem;\n        return SZ_OK;\n      }\n      SetUi32(dest, val);\n      p->temp[3] = (Byte)(val >> 24);\n      p->dest = dest + 4;\n      p->state = BCJ2_DEC_STATE_OK;\n    }\n  }\n  */\n\n  for (;;)\n  {\n    if (BCJ2_IS_32BIT_STREAM(p->state))\n      p->state = BCJ2_DEC_STATE_OK;\n    else\n    {\n      if (p->range < kTopValue)\n      {\n        if (p->bufs[BCJ2_STREAM_RC] == p->lims[BCJ2_STREAM_RC])\n        {\n          p->state = BCJ2_STREAM_RC;\n          return SZ_OK;\n        }\n        p->range <<= 8;\n        p->code = (p->code << 8) | *(p->bufs[BCJ2_STREAM_RC])++;\n      }\n\n      {\n        const Byte *src = p->bufs[BCJ2_STREAM_MAIN];\n        const Byte *srcLim;\n        Byte *dest;\n        SizeT num = p->lims[BCJ2_STREAM_MAIN] - src;\n        \n        if (num == 0)\n        {\n          p->state = BCJ2_STREAM_MAIN;\n          return SZ_OK;\n        }\n        \n        dest = p->dest;\n        if (num > (SizeT)(p->destLim - dest))\n        {\n          num = p->destLim - dest;\n          if (num == 0)\n          {\n            p->state = BCJ2_DEC_STATE_ORIG;\n            return SZ_OK;\n          }\n        }\n       \n        srcLim = src + num;\n\n        if (p->temp[3] == 0x0F && (src[0] & 0xF0) == 0x80)\n          *dest = src[0];\n        else for (;;)\n        {\n          Byte b = *src;\n          *dest = b;\n          if (b != 0x0F)\n          {\n            if ((b & 0xFE) == 0xE8)\n              break;\n            dest++;\n            if (++src != srcLim)\n              continue;\n            break;\n          }\n          dest++;\n          if (++src == srcLim)\n            break;\n          if ((*src & 0xF0) != 0x80)\n            continue;\n          *dest = *src;\n          break;\n        }\n        \n        num = src - p->bufs[BCJ2_STREAM_MAIN];\n        \n        if (src == srcLim)\n        {\n          p->temp[3] = src[-1];\n          p->bufs[BCJ2_STREAM_MAIN] = src;\n          p->ip += (UInt32)num;\n          p->dest += num;\n          p->state =\n            p->bufs[BCJ2_STREAM_MAIN] ==\n            p->lims[BCJ2_STREAM_MAIN] ?\n              (unsigned)BCJ2_STREAM_MAIN :\n              (unsigned)BCJ2_DEC_STATE_ORIG;\n          return SZ_OK;\n        }\n        \n        {\n          UInt32 bound, ttt;\n          CProb *prob;\n          Byte b = src[0];\n          Byte prev = (Byte)(num == 0 ? p->temp[3] : src[-1]);\n          \n          p->temp[3] = b;\n          p->bufs[BCJ2_STREAM_MAIN] = src + 1;\n          num++;\n          p->ip += (UInt32)num;\n          p->dest += num;\n          \n          prob = p->probs + (unsigned)(b == 0xE8 ? 2 + (unsigned)prev : (b == 0xE9 ? 1 : 0));\n          \n          _IF_BIT_0\n          {\n            _UPDATE_0\n            continue;\n          }\n          _UPDATE_1\n            \n        }\n      }\n    }\n\n    {\n      UInt32 val;\n      unsigned cj = (p->temp[3] == 0xE8) ? BCJ2_STREAM_CALL : BCJ2_STREAM_JUMP;\n      const Byte *cur = p->bufs[cj];\n      Byte *dest;\n      SizeT rem;\n      \n      if (cur == p->lims[cj])\n      {\n        p->state = cj;\n        break;\n      }\n      \n      val = GetBe32(cur);\n      p->bufs[cj] = cur + 4;\n\n      p->ip += 4;\n      val -= p->ip;\n      dest = p->dest;\n      rem = p->destLim - dest;\n      \n      if (rem < 4)\n      {\n        SizeT i;\n        SetUi32(p->temp, val);\n        for (i = 0; i < rem; i++)\n          dest[i] = p->temp[i];\n        p->dest = dest + rem;\n        p->state = BCJ2_DEC_STATE_ORIG_0 + (unsigned)rem;\n        break;\n      }\n      \n      SetUi32(dest, val);\n      p->temp[3] = (Byte)(val >> 24);\n      p->dest = dest + 4;\n    }\n  }\n\n  if (p->range < kTopValue && p->bufs[BCJ2_STREAM_RC] != p->lims[BCJ2_STREAM_RC])\n  {\n    p->range <<= 8;\n    p->code = (p->code << 8) | *(p->bufs[BCJ2_STREAM_RC])++;\n  }\n\n  return SZ_OK;\n}\n\n#undef kTopValue  /* reused later. --ryan. */\n#undef kBitModelTotal  /* reused later. --ryan. */\n\n\n/* Bra.c -- Converters for RISC code\n2010-04-16 : Igor Pavlov : Public domain */\n\n/*\n#include \"Precomp.h\"\n\n#include \"Bra.h\"\n*/\n\nstatic SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)\n{\n  SizeT i;\n  if (size < 4)\n    return 0;\n  size -= 4;\n  ip += 8;\n  for (i = 0; i <= size; i += 4)\n  {\n    if (data[i + 3] == 0xEB)\n    {\n      UInt32 dest;\n      UInt32 src = ((UInt32)data[i + 2] << 16) | ((UInt32)data[i + 1] << 8) | (data[i + 0]);\n      src <<= 2;\n      if (encoding)\n        dest = ip + (UInt32)i + src;\n      else\n        dest = src - (ip + (UInt32)i);\n      dest >>= 2;\n      data[i + 2] = (Byte)(dest >> 16);\n      data[i + 1] = (Byte)(dest >> 8);\n      data[i + 0] = (Byte)dest;\n    }\n  }\n  return i;\n}\n\nstatic SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)\n{\n  SizeT i;\n  if (size < 4)\n    return 0;\n  size -= 4;\n  ip += 4;\n  for (i = 0; i <= size; i += 2)\n  {\n    if ((data[i + 1] & 0xF8) == 0xF0 &&\n        (data[i + 3] & 0xF8) == 0xF8)\n    {\n      UInt32 dest;\n      UInt32 src =\n        (((UInt32)data[i + 1] & 0x7) << 19) |\n        ((UInt32)data[i + 0] << 11) |\n        (((UInt32)data[i + 3] & 0x7) << 8) |\n        (data[i + 2]);\n      \n      src <<= 1;\n      if (encoding)\n        dest = ip + (UInt32)i + src;\n      else\n        dest = src - (ip + (UInt32)i);\n      dest >>= 1;\n      \n      data[i + 1] = (Byte)(0xF0 | ((dest >> 19) & 0x7));\n      data[i + 0] = (Byte)(dest >> 11);\n      data[i + 3] = (Byte)(0xF8 | ((dest >> 8) & 0x7));\n      data[i + 2] = (Byte)dest;\n      i += 2;\n    }\n  }\n  return i;\n}\n\nstatic SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)\n{\n  SizeT i;\n  if (size < 4)\n    return 0;\n  size -= 4;\n  for (i = 0; i <= size; i += 4)\n  {\n    if ((data[i] >> 2) == 0x12 && (data[i + 3] & 3) == 1)\n    {\n      UInt32 src = ((UInt32)(data[i + 0] & 3) << 24) |\n        ((UInt32)data[i + 1] << 16) |\n        ((UInt32)data[i + 2] << 8) |\n        ((UInt32)data[i + 3] & (~3));\n      \n      UInt32 dest;\n      if (encoding)\n        dest = ip + (UInt32)i + src;\n      else\n        dest = src - (ip + (UInt32)i);\n      data[i + 0] = (Byte)(0x48 | ((dest >> 24) &  0x3));\n      data[i + 1] = (Byte)(dest >> 16);\n      data[i + 2] = (Byte)(dest >> 8);\n      data[i + 3] &= 0x3;\n      data[i + 3] |= dest;\n    }\n  }\n  return i;\n}\n\nstatic SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)\n{\n  UInt32 i;\n  if (size < 4)\n    return 0;\n  size -= 4;\n  for (i = 0; i <= size; i += 4)\n  {\n    if ((data[i] == 0x40 && (data[i + 1] & 0xC0) == 0x00) ||\n        (data[i] == 0x7F && (data[i + 1] & 0xC0) == 0xC0))\n    {\n      UInt32 src =\n        ((UInt32)data[i + 0] << 24) |\n        ((UInt32)data[i + 1] << 16) |\n        ((UInt32)data[i + 2] << 8) |\n        ((UInt32)data[i + 3]);\n      UInt32 dest;\n      \n      src <<= 2;\n      if (encoding)\n        dest = ip + i + src;\n      else\n        dest = src - (ip + i);\n      dest >>= 2;\n      \n      dest = (((0 - ((dest >> 22) & 1)) << 22) & 0x3FFFFFFF) | (dest & 0x3FFFFF) | 0x40000000;\n\n      data[i + 0] = (Byte)(dest >> 24);\n      data[i + 1] = (Byte)(dest >> 16);\n      data[i + 2] = (Byte)(dest >> 8);\n      data[i + 3] = (Byte)dest;\n    }\n  }\n  return i;\n}\n\n/* Bra86.c -- Converter for x86 code (BCJ)\n2013-11-12 : Igor Pavlov : Public domain */\n\n/*\n#include \"Precomp.h\"\n\n#include \"Bra.h\"\n*/\n\n#define Test86MSByte(b) ((((b) + 1) & 0xFE) == 0)\n\nstatic SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding)\n{\n  SizeT pos = 0;\n  UInt32 mask = *state & 7;\n  if (size < 5)\n    return 0;\n  size -= 4;\n  ip += 5;\n\n  for (;;)\n  {\n    Byte *p = data + pos;\n    const Byte *limit = data + size;\n    for (; p < limit; p++)\n      if ((*p & 0xFE) == 0xE8)\n        break;\n\n    {\n      SizeT d = (SizeT)(p - data - pos);\n      pos = (SizeT)(p - data);\n      if (p >= limit)\n      {\n        *state = (d > 2 ? 0 : mask >> (unsigned)d);\n        return pos;\n      }\n      if (d > 2)\n        mask = 0;\n      else\n      {\n        mask >>= (unsigned)d;\n        if (mask != 0 && (mask > 4 || mask == 3 || Test86MSByte(p[(mask >> 1) + 1])))\n        {\n          mask = (mask >> 1) | 4;\n          pos++;\n          continue;\n        }\n      }\n    }\n\n    if (Test86MSByte(p[4]))\n    {\n      UInt32 v = ((UInt32)p[4] << 24) | ((UInt32)p[3] << 16) | ((UInt32)p[2] << 8) | ((UInt32)p[1]);\n      UInt32 cur = ip + (UInt32)pos;\n      pos += 5;\n      if (encoding)\n        v += cur;\n      else\n        v -= cur;\n      if (mask != 0)\n      {\n        unsigned sh = (mask & 6) << 2;\n        if (Test86MSByte((Byte)(v >> sh)))\n        {\n          v ^= (((UInt32)0x100 << sh) - 1);\n          if (encoding)\n            v += cur;\n          else\n            v -= cur;\n        }\n        mask = 0;\n      }\n      p[1] = (Byte)v;\n      p[2] = (Byte)(v >> 8);\n      p[3] = (Byte)(v >> 16);\n      p[4] = (Byte)(0 - ((v >> 24) & 1));\n    }\n    else\n    {\n      mask = (mask >> 1) | 4;\n      pos++;\n    }\n  }\n}\n\n\n/* BraIA64.c -- Converter for IA-64 code\n2013-11-12 : Igor Pavlov : Public domain */\n\n/*\n#include \"Precomp.h\"\n\n#include \"Bra.h\"\n*/\nstatic const Byte kBranchTable[32] =\n{\n  0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0,\n  4, 4, 6, 6, 0, 0, 7, 7,\n  4, 4, 0, 0, 4, 4, 0, 0\n};\n\nstatic SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)\n{\n  SizeT i;\n  if (size < 16)\n    return 0;\n  size -= 16;\n  for (i = 0; i <= size; i += 16)\n  {\n    UInt32 instrTemplate = data[i] & 0x1F;\n    UInt32 mask = kBranchTable[instrTemplate];\n    UInt32 bitPos = 5;\n    int slot;\n    for (slot = 0; slot < 3; slot++, bitPos += 41)\n    {\n      UInt32 bytePos, bitRes;\n      UInt64 instruction, instNorm;\n      int j;\n      if (((mask >> slot) & 1) == 0)\n        continue;\n      bytePos = (bitPos >> 3);\n      bitRes = bitPos & 0x7;\n      instruction = 0;\n      for (j = 0; j < 6; j++)\n        instruction += (UInt64)data[i + j + bytePos] << (8 * j);\n\n      instNorm = instruction >> bitRes;\n      if (((instNorm >> 37) & 0xF) == 0x5 && ((instNorm >> 9) & 0x7) == 0)\n      {\n        UInt32 src = (UInt32)((instNorm >> 13) & 0xFFFFF);\n        UInt32 dest;\n        src |= ((UInt32)(instNorm >> 36) & 1) << 20;\n        \n        src <<= 4;\n        \n        if (encoding)\n          dest = ip + (UInt32)i + src;\n        else\n          dest = src - (ip + (UInt32)i);\n        \n        dest >>= 4;\n        \n        instNorm &= ~((UInt64)(0x8FFFFF) << 13);\n        instNorm |= ((UInt64)(dest & 0xFFFFF) << 13);\n        instNorm |= ((UInt64)(dest & 0x100000) << (36 - 20));\n        \n        instruction &= (1 << bitRes) - 1;\n        instruction |= (instNorm << bitRes);\n        for (j = 0; j < 6; j++)\n          data[i + j + bytePos] = (Byte)(instruction >> (8 * j));\n      }\n    }\n  }\n  return i;\n}\n\n\n/* Delta.c -- Delta converter\n2009-05-26 : Igor Pavlov : Public domain */\n\n/*\n#include \"Precomp.h\"\n\n#include \"Delta.h\"\n*/\n\nstatic void Delta_Init(Byte *state)\n{\n  unsigned i;\n  for (i = 0; i < DELTA_STATE_SIZE; i++)\n    state[i] = 0;\n}\n\nstatic void MyMemCpy(Byte *dest, const Byte *src, unsigned size)\n{\n  unsigned i;\n  for (i = 0; i < size; i++)\n    dest[i] = src[i];\n}\n\nstatic void Delta_Decode(Byte *state, unsigned delta, Byte *data, SizeT size)\n{\n  Byte buf[DELTA_STATE_SIZE];\n  unsigned j = 0;\n  MyMemCpy(buf, state, delta);\n  {\n    SizeT i;\n    for (i = 0; i < size;)\n    {\n      for (j = 0; j < delta && i < size; i++, j++)\n      {\n        buf[j] = data[i] = (Byte)(buf[j] + data[i]);\n      }\n    }\n  }\n  if (j == delta)\n    j = 0;\n  MyMemCpy(state, buf + j, delta - j);\n  MyMemCpy(state + delta - j, buf, j);\n}\n\n/* LzmaDec.c -- LZMA Decoder\n2016-05-16 : Igor Pavlov : Public domain */\n\n/*\n#include \"Precomp.h\"\n\n#include \"LzmaDec.h\"\n\n#include <string.h>\n*/\n\n#define kNumTopBits 24\n#define kTopValue ((UInt32)1 << kNumTopBits)\n\n#define kNumBitModelTotalBits 11\n#define kBitModelTotal (1 << kNumBitModelTotalBits)\n#define kNumMoveBits 5\n\n#define RC_INIT_SIZE 5\n\n#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); }\n\n#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)\n#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits));\n#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits));\n#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \\\n  { UPDATE_0(p); i = (i + i); A0; } else \\\n  { UPDATE_1(p); i = (i + i) + 1; A1; }\n#define GET_BIT(p, i) GET_BIT2(p, i, ; , ;)\n\n#define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); }\n#define TREE_DECODE(probs, limit, i) \\\n  { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; }\n\n/* #define _LZMA_SIZE_OPT */\n\n#ifdef _LZMA_SIZE_OPT\n#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i)\n#else\n#define TREE_6_DECODE(probs, i) \\\n  { i = 1; \\\n  TREE_GET_BIT(probs, i); \\\n  TREE_GET_BIT(probs, i); \\\n  TREE_GET_BIT(probs, i); \\\n  TREE_GET_BIT(probs, i); \\\n  TREE_GET_BIT(probs, i); \\\n  TREE_GET_BIT(probs, i); \\\n  i -= 0x40; }\n#endif\n\n#define NORMAL_LITER_DEC GET_BIT(prob + symbol, symbol)\n#define MATCHED_LITER_DEC \\\n  matchByte <<= 1; \\\n  bit = (matchByte & offs); \\\n  probLit = prob + offs + bit + symbol; \\\n  GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit)\n\n#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); }\n\n#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)\n#define UPDATE_0_CHECK range = bound;\n#define UPDATE_1_CHECK range -= bound; code -= bound;\n#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \\\n  { UPDATE_0_CHECK; i = (i + i); A0; } else \\\n  { UPDATE_1_CHECK; i = (i + i) + 1; A1; }\n#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;)\n#define TREE_DECODE_CHECK(probs, limit, i) \\\n  { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; }\n\n\n#define kNumPosBitsMax 4\n#define kNumPosStatesMax (1 << kNumPosBitsMax)\n\n#define kLenNumLowBits 3\n#define kLenNumLowSymbols (1 << kLenNumLowBits)\n#define kLenNumMidBits 3\n#define kLenNumMidSymbols (1 << kLenNumMidBits)\n#define kLenNumHighBits 8\n#define kLenNumHighSymbols (1 << kLenNumHighBits)\n\n#define LenChoice 0\n#define LenChoice2 (LenChoice + 1)\n#define LenLow (LenChoice2 + 1)\n#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))\n#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))\n#define kNumLenProbs (LenHigh + kLenNumHighSymbols)\n\n\n#define kNumStates 12\n#define kNumLitStates 7\n\n#define kStartPosModelIndex 4\n#define kEndPosModelIndex 14\n#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))\n\n#define kNumPosSlotBits 6\n#define kNumLenToPosStates 4\n\n#define kNumAlignBits 4\n#define kAlignTableSize (1 << kNumAlignBits)\n\n#define kMatchMinLen 2\n#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols)\n\n#define IsMatch 0\n#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))\n#define IsRepG0 (IsRep + kNumStates)\n#define IsRepG1 (IsRepG0 + kNumStates)\n#define IsRepG2 (IsRepG1 + kNumStates)\n#define IsRep0Long (IsRepG2 + kNumStates)\n#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))\n#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))\n#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)\n#define LenCoder (Align + kAlignTableSize)\n#define RepLenCoder (LenCoder + kNumLenProbs)\n#define Literal (RepLenCoder + kNumLenProbs)\n\n#define LZMA_BASE_SIZE 1846\n#define LZMA_LIT_SIZE 0x300\n\n#if Literal != LZMA_BASE_SIZE\nStopCompilingDueBUG\n#endif\n\n#define LzmaProps_GetNumProbs(p) (Literal + ((UInt32)LZMA_LIT_SIZE << ((p)->lc + (p)->lp)))\n\n#define LZMA_DIC_MIN (1 << 12)\n\n/* First LZMA-symbol is always decoded.\nAnd it decodes new LZMA-symbols while (buf < bufLimit), but \"buf\" is without last normalization\nOut:\n  Result:\n    SZ_OK - OK\n    SZ_ERROR_DATA - Error\n  p->remainLen:\n    < kMatchSpecLenStart : normal remain\n    = kMatchSpecLenStart : finished\n    = kMatchSpecLenStart + 1 : Flush marker (unused now)\n    = kMatchSpecLenStart + 2 : State Init Marker (unused now)\n*/\n\nstatic int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit)\n{\n  CLzmaProb *probs = p->probs;\n\n  unsigned state = p->state;\n  UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3];\n  unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1;\n  unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1;\n  unsigned lc = p->prop.lc;\n\n  Byte *dic = p->dic;\n  SizeT dicBufSize = p->dicBufSize;\n  SizeT dicPos = p->dicPos;\n  \n  UInt32 processedPos = p->processedPos;\n  UInt32 checkDicSize = p->checkDicSize;\n  unsigned len = 0;\n\n  const Byte *buf = p->buf;\n  UInt32 range = p->range;\n  UInt32 code = p->code;\n\n  do\n  {\n    CLzmaProb *prob;\n    UInt32 bound;\n    unsigned ttt;\n    unsigned posState = processedPos & pbMask;\n\n    prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;\n    IF_BIT_0(prob)\n    {\n      unsigned symbol;\n      UPDATE_0(prob);\n      prob = probs + Literal;\n      if (processedPos != 0 || checkDicSize != 0)\n        prob += ((UInt32)LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) +\n            (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc))));\n      processedPos++;\n\n      if (state < kNumLitStates)\n      {\n        state -= (state < 4) ? state : 3;\n        symbol = 1;\n        #ifdef _LZMA_SIZE_OPT\n        do { NORMAL_LITER_DEC } while (symbol < 0x100);\n        #else\n        NORMAL_LITER_DEC\n        NORMAL_LITER_DEC\n        NORMAL_LITER_DEC\n        NORMAL_LITER_DEC\n        NORMAL_LITER_DEC\n        NORMAL_LITER_DEC\n        NORMAL_LITER_DEC\n        NORMAL_LITER_DEC\n        #endif\n      }\n      else\n      {\n        unsigned matchByte = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)];\n        unsigned offs = 0x100;\n        state -= (state < 10) ? 3 : 6;\n        symbol = 1;\n        #ifdef _LZMA_SIZE_OPT\n        do\n        {\n          unsigned bit;\n          CLzmaProb *probLit;\n          MATCHED_LITER_DEC\n        }\n        while (symbol < 0x100);\n        #else\n        {\n          unsigned bit;\n          CLzmaProb *probLit;\n          MATCHED_LITER_DEC\n          MATCHED_LITER_DEC\n          MATCHED_LITER_DEC\n          MATCHED_LITER_DEC\n          MATCHED_LITER_DEC\n          MATCHED_LITER_DEC\n          MATCHED_LITER_DEC\n          MATCHED_LITER_DEC\n        }\n        #endif\n      }\n\n      dic[dicPos++] = (Byte)symbol;\n      continue;\n    }\n    \n    {\n      UPDATE_1(prob);\n      prob = probs + IsRep + state;\n      IF_BIT_0(prob)\n      {\n        UPDATE_0(prob);\n        state += kNumStates;\n        prob = probs + LenCoder;\n      }\n      else\n      {\n        UPDATE_1(prob);\n        if (checkDicSize == 0 && processedPos == 0)\n          return SZ_ERROR_DATA;\n        prob = probs + IsRepG0 + state;\n        IF_BIT_0(prob)\n        {\n          UPDATE_0(prob);\n          prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;\n          IF_BIT_0(prob)\n          {\n            UPDATE_0(prob);\n            dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)];\n            dicPos++;\n            processedPos++;\n            state = state < kNumLitStates ? 9 : 11;\n            continue;\n          }\n          UPDATE_1(prob);\n        }\n        else\n        {\n          UInt32 distance;\n          UPDATE_1(prob);\n          prob = probs + IsRepG1 + state;\n          IF_BIT_0(prob)\n          {\n            UPDATE_0(prob);\n            distance = rep1;\n          }\n          else\n          {\n            UPDATE_1(prob);\n            prob = probs + IsRepG2 + state;\n            IF_BIT_0(prob)\n            {\n              UPDATE_0(prob);\n              distance = rep2;\n            }\n            else\n            {\n              UPDATE_1(prob);\n              distance = rep3;\n              rep3 = rep2;\n            }\n            rep2 = rep1;\n          }\n          rep1 = rep0;\n          rep0 = distance;\n        }\n        state = state < kNumLitStates ? 8 : 11;\n        prob = probs + RepLenCoder;\n      }\n      \n      #ifdef _LZMA_SIZE_OPT\n      {\n        unsigned lim, offset;\n        CLzmaProb *probLen = prob + LenChoice;\n        IF_BIT_0(probLen)\n        {\n          UPDATE_0(probLen);\n          probLen = prob + LenLow + (posState << kLenNumLowBits);\n          offset = 0;\n          lim = (1 << kLenNumLowBits);\n        }\n        else\n        {\n          UPDATE_1(probLen);\n          probLen = prob + LenChoice2;\n          IF_BIT_0(probLen)\n          {\n            UPDATE_0(probLen);\n            probLen = prob + LenMid + (posState << kLenNumMidBits);\n            offset = kLenNumLowSymbols;\n            lim = (1 << kLenNumMidBits);\n          }\n          else\n          {\n            UPDATE_1(probLen);\n            probLen = prob + LenHigh;\n            offset = kLenNumLowSymbols + kLenNumMidSymbols;\n            lim = (1 << kLenNumHighBits);\n          }\n        }\n        TREE_DECODE(probLen, lim, len);\n        len += offset;\n      }\n      #else\n      {\n        CLzmaProb *probLen = prob + LenChoice;\n        IF_BIT_0(probLen)\n        {\n          UPDATE_0(probLen);\n          probLen = prob + LenLow + (posState << kLenNumLowBits);\n          len = 1;\n          TREE_GET_BIT(probLen, len);\n          TREE_GET_BIT(probLen, len);\n          TREE_GET_BIT(probLen, len);\n          len -= 8;\n        }\n        else\n        {\n          UPDATE_1(probLen);\n          probLen = prob + LenChoice2;\n          IF_BIT_0(probLen)\n          {\n            UPDATE_0(probLen);\n            probLen = prob + LenMid + (posState << kLenNumMidBits);\n            len = 1;\n            TREE_GET_BIT(probLen, len);\n            TREE_GET_BIT(probLen, len);\n            TREE_GET_BIT(probLen, len);\n          }\n          else\n          {\n            UPDATE_1(probLen);\n            probLen = prob + LenHigh;\n            TREE_DECODE(probLen, (1 << kLenNumHighBits), len);\n            len += kLenNumLowSymbols + kLenNumMidSymbols;\n          }\n        }\n      }\n      #endif\n\n      if (state >= kNumStates)\n      {\n        UInt32 distance;\n        prob = probs + PosSlot +\n            ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits);\n        TREE_6_DECODE(prob, distance);\n        if (distance >= kStartPosModelIndex)\n        {\n          unsigned posSlot = (unsigned)distance;\n          unsigned numDirectBits = (unsigned)(((distance >> 1) - 1));\n          distance = (2 | (distance & 1));\n          if (posSlot < kEndPosModelIndex)\n          {\n            distance <<= numDirectBits;\n            prob = probs + SpecPos + distance - posSlot - 1;\n            {\n              UInt32 mask = 1;\n              unsigned i = 1;\n              do\n              {\n                GET_BIT2(prob + i, i, ; , distance |= mask);\n                mask <<= 1;\n              }\n              while (--numDirectBits != 0);\n            }\n          }\n          else\n          {\n            numDirectBits -= kNumAlignBits;\n            do\n            {\n              NORMALIZE\n              range >>= 1;\n              \n              {\n                UInt32 t;\n                code -= range;\n                t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */\n                distance = (distance << 1) + (t + 1);\n                code += range & t;\n              }\n              /*\n              distance <<= 1;\n              if (code >= range)\n              {\n                code -= range;\n                distance |= 1;\n              }\n              */\n            }\n            while (--numDirectBits != 0);\n            prob = probs + Align;\n            distance <<= kNumAlignBits;\n            {\n              unsigned i = 1;\n              GET_BIT2(prob + i, i, ; , distance |= 1);\n              GET_BIT2(prob + i, i, ; , distance |= 2);\n              GET_BIT2(prob + i, i, ; , distance |= 4);\n              GET_BIT2(prob + i, i, ; , distance |= 8);\n            }\n            if (distance == (UInt32)0xFFFFFFFF)\n            {\n              len += kMatchSpecLenStart;\n              state -= kNumStates;\n              break;\n            }\n          }\n        }\n        \n        rep3 = rep2;\n        rep2 = rep1;\n        rep1 = rep0;\n        rep0 = distance + 1;\n        if (checkDicSize == 0)\n        {\n          if (distance >= processedPos)\n          {\n            p->dicPos = dicPos;\n            return SZ_ERROR_DATA;\n          }\n        }\n        else if (distance >= checkDicSize)\n        {\n          p->dicPos = dicPos;\n          return SZ_ERROR_DATA;\n        }\n        state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3;\n      }\n\n      len += kMatchMinLen;\n\n      {\n        SizeT rem;\n        unsigned curLen;\n        SizeT pos;\n        \n        if ((rem = limit - dicPos) == 0)\n        {\n          p->dicPos = dicPos;\n          return SZ_ERROR_DATA;\n        }\n        \n        curLen = ((rem < len) ? (unsigned)rem : len);\n        pos = dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0);\n\n        processedPos += curLen;\n\n        len -= curLen;\n        if (curLen <= dicBufSize - pos)\n        {\n          Byte *dest = dic + dicPos;\n          ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos;\n          const Byte *lim = dest + curLen;\n          dicPos += curLen;\n          do\n            *(dest) = (Byte)*(dest + src);\n          while (++dest != lim);\n        }\n        else\n        {\n          do\n          {\n            dic[dicPos++] = dic[pos];\n            if (++pos == dicBufSize)\n              pos = 0;\n          }\n          while (--curLen != 0);\n        }\n      }\n    }\n  }\n  while (dicPos < limit && buf < bufLimit);\n\n  NORMALIZE;\n  \n  p->buf = buf;\n  p->range = range;\n  p->code = code;\n  p->remainLen = len;\n  p->dicPos = dicPos;\n  p->processedPos = processedPos;\n  p->reps[0] = rep0;\n  p->reps[1] = rep1;\n  p->reps[2] = rep2;\n  p->reps[3] = rep3;\n  p->state = state;\n\n  return SZ_OK;\n}\n\nstatic void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit)\n{\n  if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart)\n  {\n    Byte *dic = p->dic;\n    SizeT dicPos = p->dicPos;\n    SizeT dicBufSize = p->dicBufSize;\n    unsigned len = p->remainLen;\n    SizeT rep0 = p->reps[0]; /* we use SizeT to avoid the BUG of VC14 for AMD64 */\n    SizeT rem = limit - dicPos;\n    if (rem < len)\n      len = (unsigned)(rem);\n\n    if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len)\n      p->checkDicSize = p->prop.dicSize;\n\n    p->processedPos += len;\n    p->remainLen -= len;\n    while (len != 0)\n    {\n      len--;\n      dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)];\n      dicPos++;\n    }\n    p->dicPos = dicPos;\n  }\n}\n\nstatic int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit)\n{\n  do\n  {\n    SizeT limit2 = limit;\n    if (p->checkDicSize == 0)\n    {\n      UInt32 rem = p->prop.dicSize - p->processedPos;\n      if (limit - p->dicPos > rem)\n        limit2 = p->dicPos + rem;\n    }\n    \n    RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit));\n    \n    if (p->checkDicSize == 0 && p->processedPos >= p->prop.dicSize)\n      p->checkDicSize = p->prop.dicSize;\n    \n    LzmaDec_WriteRem(p, limit);\n  }\n  while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart);\n\n  if (p->remainLen > kMatchSpecLenStart)\n    p->remainLen = kMatchSpecLenStart;\n\n  return 0;\n}\n\ntypedef enum\n{\n  DUMMY_ERROR, /* unexpected end of input stream */\n  DUMMY_LIT,\n  DUMMY_MATCH,\n  DUMMY_REP\n} ELzmaDummy;\n\nstatic ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize)\n{\n  UInt32 range = p->range;\n  UInt32 code = p->code;\n  const Byte *bufLimit = buf + inSize;\n  const CLzmaProb *probs = p->probs;\n  unsigned state = p->state;\n  ELzmaDummy res;\n\n  {\n    const CLzmaProb *prob;\n    UInt32 bound;\n    unsigned ttt;\n    unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1);\n\n    prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;\n    IF_BIT_0_CHECK(prob)\n    {\n      UPDATE_0_CHECK\n\n      /* if (bufLimit - buf >= 7) return DUMMY_LIT; */\n\n      prob = probs + Literal;\n      if (p->checkDicSize != 0 || p->processedPos != 0)\n        prob += ((UInt32)LZMA_LIT_SIZE *\n            ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) +\n            (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc))));\n\n      if (state < kNumLitStates)\n      {\n        unsigned symbol = 1;\n        do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100);\n      }\n      else\n      {\n        unsigned matchByte = p->dic[p->dicPos - p->reps[0] +\n            (p->dicPos < p->reps[0] ? p->dicBufSize : 0)];\n        unsigned offs = 0x100;\n        unsigned symbol = 1;\n        do\n        {\n          unsigned bit;\n          const CLzmaProb *probLit;\n          matchByte <<= 1;\n          bit = (matchByte & offs);\n          probLit = prob + offs + bit + symbol;\n          GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit)\n        }\n        while (symbol < 0x100);\n      }\n      res = DUMMY_LIT;\n    }\n    else\n    {\n      unsigned len;\n      UPDATE_1_CHECK;\n\n      prob = probs + IsRep + state;\n      IF_BIT_0_CHECK(prob)\n      {\n        UPDATE_0_CHECK;\n        state = 0;\n        prob = probs + LenCoder;\n        res = DUMMY_MATCH;\n      }\n      else\n      {\n        UPDATE_1_CHECK;\n        res = DUMMY_REP;\n        prob = probs + IsRepG0 + state;\n        IF_BIT_0_CHECK(prob)\n        {\n          UPDATE_0_CHECK;\n          prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;\n          IF_BIT_0_CHECK(prob)\n          {\n            UPDATE_0_CHECK;\n            NORMALIZE_CHECK;\n            return DUMMY_REP;\n          }\n          else\n          {\n            UPDATE_1_CHECK;\n          }\n        }\n        else\n        {\n          UPDATE_1_CHECK;\n          prob = probs + IsRepG1 + state;\n          IF_BIT_0_CHECK(prob)\n          {\n            UPDATE_0_CHECK;\n          }\n          else\n          {\n            UPDATE_1_CHECK;\n            prob = probs + IsRepG2 + state;\n            IF_BIT_0_CHECK(prob)\n            {\n              UPDATE_0_CHECK;\n            }\n            else\n            {\n              UPDATE_1_CHECK;\n            }\n          }\n        }\n        state = kNumStates;\n        prob = probs + RepLenCoder;\n      }\n      {\n        unsigned limit, offset;\n        const CLzmaProb *probLen = prob + LenChoice;\n        IF_BIT_0_CHECK(probLen)\n        {\n          UPDATE_0_CHECK;\n          probLen = prob + LenLow + (posState << kLenNumLowBits);\n          offset = 0;\n          limit = 1 << kLenNumLowBits;\n        }\n        else\n        {\n          UPDATE_1_CHECK;\n          probLen = prob + LenChoice2;\n          IF_BIT_0_CHECK(probLen)\n          {\n            UPDATE_0_CHECK;\n            probLen = prob + LenMid + (posState << kLenNumMidBits);\n            offset = kLenNumLowSymbols;\n            limit = 1 << kLenNumMidBits;\n          }\n          else\n          {\n            UPDATE_1_CHECK;\n            probLen = prob + LenHigh;\n            offset = kLenNumLowSymbols + kLenNumMidSymbols;\n            limit = 1 << kLenNumHighBits;\n          }\n        }\n        TREE_DECODE_CHECK(probLen, limit, len);\n        len += offset;\n      }\n\n      if (state < 4)\n      {\n        unsigned posSlot;\n        prob = probs + PosSlot +\n            ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) <<\n            kNumPosSlotBits);\n        TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot);\n        if (posSlot >= kStartPosModelIndex)\n        {\n          unsigned numDirectBits = ((posSlot >> 1) - 1);\n\n          /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */\n\n          if (posSlot < kEndPosModelIndex)\n          {\n            prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1;\n          }\n          else\n          {\n            numDirectBits -= kNumAlignBits;\n            do\n            {\n              NORMALIZE_CHECK\n              range >>= 1;\n              code -= range & (((code - range) >> 31) - 1);\n              /* if (code >= range) code -= range; */\n            }\n            while (--numDirectBits != 0);\n            prob = probs + Align;\n            numDirectBits = kNumAlignBits;\n          }\n          {\n            unsigned i = 1;\n            do\n            {\n              GET_BIT_CHECK(prob + i, i);\n            }\n            while (--numDirectBits != 0);\n          }\n        }\n      }\n    }\n  }\n  NORMALIZE_CHECK;\n  return res;\n}\n\n\nstatic void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)\n{\n  p->needFlush = 1;\n  p->remainLen = 0;\n  p->tempBufSize = 0;\n\n  if (initDic)\n  {\n    p->processedPos = 0;\n    p->checkDicSize = 0;\n    p->needInitState = 1;\n  }\n  if (initState)\n    p->needInitState = 1;\n}\n\nstatic void LzmaDec_Init(CLzmaDec *p)\n{\n  p->dicPos = 0;\n  LzmaDec_InitDicAndState(p, True, True);\n}\n\nstatic void LzmaDec_InitStateReal(CLzmaDec *p)\n{\n  SizeT numProbs = LzmaProps_GetNumProbs(&p->prop);\n  SizeT i;\n  CLzmaProb *probs = p->probs;\n  for (i = 0; i < numProbs; i++)\n    probs[i] = kBitModelTotal >> 1;\n  p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1;\n  p->state = 0;\n  p->needInitState = 0;\n}\n\nstatic SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,\n    ELzmaFinishMode finishMode, ELzmaStatus *status)\n{\n  SizeT inSize = *srcLen;\n  (*srcLen) = 0;\n  LzmaDec_WriteRem(p, dicLimit);\n  \n  *status = LZMA_STATUS_NOT_SPECIFIED;\n\n  while (p->remainLen != kMatchSpecLenStart)\n  {\n      int checkEndMarkNow;\n\n      if (p->needFlush)\n      {\n        for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--)\n          p->tempBuf[p->tempBufSize++] = *src++;\n        if (p->tempBufSize < RC_INIT_SIZE)\n        {\n          *status = LZMA_STATUS_NEEDS_MORE_INPUT;\n          return SZ_OK;\n        }\n        if (p->tempBuf[0] != 0)\n          return SZ_ERROR_DATA;\n        p->code =\n              ((UInt32)p->tempBuf[1] << 24)\n            | ((UInt32)p->tempBuf[2] << 16)\n            | ((UInt32)p->tempBuf[3] << 8)\n            | ((UInt32)p->tempBuf[4]);\n        p->range = 0xFFFFFFFF;\n        p->needFlush = 0;\n        p->tempBufSize = 0;\n      }\n\n      checkEndMarkNow = 0;\n      if (p->dicPos >= dicLimit)\n      {\n        if (p->remainLen == 0 && p->code == 0)\n        {\n          *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK;\n          return SZ_OK;\n        }\n        if (finishMode == LZMA_FINISH_ANY)\n        {\n          *status = LZMA_STATUS_NOT_FINISHED;\n          return SZ_OK;\n        }\n        if (p->remainLen != 0)\n        {\n          *status = LZMA_STATUS_NOT_FINISHED;\n          return SZ_ERROR_DATA;\n        }\n        checkEndMarkNow = 1;\n      }\n\n      if (p->needInitState)\n        LzmaDec_InitStateReal(p);\n  \n      if (p->tempBufSize == 0)\n      {\n        SizeT processed;\n        const Byte *bufLimit;\n        if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)\n        {\n          int dummyRes = LzmaDec_TryDummy(p, src, inSize);\n          if (dummyRes == DUMMY_ERROR)\n          {\n            memcpy(p->tempBuf, src, inSize);\n            p->tempBufSize = (unsigned)inSize;\n            (*srcLen) += inSize;\n            *status = LZMA_STATUS_NEEDS_MORE_INPUT;\n            return SZ_OK;\n          }\n          if (checkEndMarkNow && dummyRes != DUMMY_MATCH)\n          {\n            *status = LZMA_STATUS_NOT_FINISHED;\n            return SZ_ERROR_DATA;\n          }\n          bufLimit = src;\n        }\n        else\n          bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX;\n        p->buf = src;\n        if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0)\n          return SZ_ERROR_DATA;\n        processed = (SizeT)(p->buf - src);\n        (*srcLen) += processed;\n        src += processed;\n        inSize -= processed;\n      }\n      else\n      {\n        unsigned rem = p->tempBufSize, lookAhead = 0;\n        while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize)\n          p->tempBuf[rem++] = src[lookAhead++];\n        p->tempBufSize = rem;\n        if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)\n        {\n          int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem);\n          if (dummyRes == DUMMY_ERROR)\n          {\n            (*srcLen) += lookAhead;\n            *status = LZMA_STATUS_NEEDS_MORE_INPUT;\n            return SZ_OK;\n          }\n          if (checkEndMarkNow && dummyRes != DUMMY_MATCH)\n          {\n            *status = LZMA_STATUS_NOT_FINISHED;\n            return SZ_ERROR_DATA;\n          }\n        }\n        p->buf = p->tempBuf;\n        if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0)\n          return SZ_ERROR_DATA;\n        \n        {\n          unsigned kkk = (unsigned)(p->buf - p->tempBuf);\n          if (rem < kkk)\n            return SZ_ERROR_FAIL; /* some internal error */\n          rem -= kkk;\n          if (lookAhead < rem)\n            return SZ_ERROR_FAIL; /* some internal error */\n          lookAhead -= rem;\n        }\n        (*srcLen) += lookAhead;\n        src += lookAhead;\n        inSize -= lookAhead;\n        p->tempBufSize = 0;\n      }\n  }\n  if (p->code == 0)\n    *status = LZMA_STATUS_FINISHED_WITH_MARK;\n  return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA;\n}\n\nstatic void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)\n{\n  alloc->Free(alloc, p->probs);\n  p->probs = NULL;\n}\n\nstatic SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)\n{\n  UInt32 dicSize;\n  Byte d;\n  \n  if (size < LZMA_PROPS_SIZE)\n    return SZ_ERROR_UNSUPPORTED;\n  else\n    dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24);\n \n  if (dicSize < LZMA_DIC_MIN)\n    dicSize = LZMA_DIC_MIN;\n  p->dicSize = dicSize;\n\n  d = data[0];\n  if (d >= (9 * 5 * 5))\n    return SZ_ERROR_UNSUPPORTED;\n\n  p->lc = d % 9;\n  d /= 9;\n  p->pb = d / 5;\n  p->lp = d % 5;\n\n  return SZ_OK;\n}\n\nstatic SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc)\n{\n  UInt32 numProbs = LzmaProps_GetNumProbs(propNew);\n  if (!p->probs || numProbs != p->numProbs)\n  {\n    LzmaDec_FreeProbs(p, alloc);\n    p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb));\n    p->numProbs = numProbs;\n    if (!p->probs)\n      return SZ_ERROR_MEM;\n  }\n  return SZ_OK;\n}\n\nstatic SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)\n{\n  CLzmaProps propNew;\n  RINOK(LzmaProps_Decode(&propNew, props, propsSize));\n  RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));\n  p->prop = propNew;\n  return SZ_OK;\n}\n\n/* Lzma2Dec.c -- LZMA2 Decoder\n2015-11-09 : Igor Pavlov : Public domain */\n\n/* #define SHOW_DEBUG_INFO */\n\n/*\n#include \"Precomp.h\"\n\n#ifdef SHOW_DEBUG_INFO\n#include <stdio.h>\n#endif\n\n#include <string.h>\n\n#include \"Lzma2Dec.h\"\n*/\n\n/*\n00000000  -  EOS\n00000001 U U  -  Uncompressed Reset Dic\n00000010 U U  -  Uncompressed No Reset\n100uuuuu U U P P  -  LZMA no reset\n101uuuuu U U P P  -  LZMA reset state\n110uuuuu U U P P S  -  LZMA reset state + new prop\n111uuuuu U U P P S  -  LZMA reset state + new prop + reset dic\n\n  u, U - Unpack Size\n  P - Pack Size\n  S - Props\n*/\n\n#define LZMA2_CONTROL_LZMA (1 << 7)\n#define LZMA2_CONTROL_COPY_NO_RESET 2\n#define LZMA2_CONTROL_COPY_RESET_DIC 1\n#define LZMA2_CONTROL_EOF 0\n\n#define LZMA2_IS_UNCOMPRESSED_STATE(p) (((p)->control & LZMA2_CONTROL_LZMA) == 0)\n\n#define LZMA2_GET_LZMA_MODE(p) (((p)->control >> 5) & 3)\n#define LZMA2_IS_THERE_PROP(mode) ((mode) >= 2)\n\n#define LZMA2_LCLP_MAX 4\n#define LZMA2_DIC_SIZE_FROM_PROP(p) (((UInt32)2 | ((p) & 1)) << ((p) / 2 + 11))\n\n#ifdef SHOW_DEBUG_INFO\n#define PRF(x) x\n#else\n#define PRF(x)\n#endif\n\ntypedef enum\n{\n  LZMA2_STATE_CONTROL,\n  LZMA2_STATE_UNPACK0,\n  LZMA2_STATE_UNPACK1,\n  LZMA2_STATE_PACK0,\n  LZMA2_STATE_PACK1,\n  LZMA2_STATE_PROP,\n  LZMA2_STATE_DATA,\n  LZMA2_STATE_DATA_CONT,\n  LZMA2_STATE_FINISHED,\n  LZMA2_STATE_ERROR\n} ELzma2State;\n\nstatic SRes Lzma2Dec_GetOldProps(Byte prop, Byte *props)\n{\n  UInt32 dicSize;\n  if (prop > 40)\n    return SZ_ERROR_UNSUPPORTED;\n  dicSize = (prop == 40) ? 0xFFFFFFFF : LZMA2_DIC_SIZE_FROM_PROP(prop);\n  props[0] = (Byte)LZMA2_LCLP_MAX;\n  props[1] = (Byte)(dicSize);\n  props[2] = (Byte)(dicSize >> 8);\n  props[3] = (Byte)(dicSize >> 16);\n  props[4] = (Byte)(dicSize >> 24);\n  return SZ_OK;\n}\n\nstatic SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAlloc *alloc)\n{\n  Byte props[LZMA_PROPS_SIZE];\n  RINOK(Lzma2Dec_GetOldProps(prop, props));\n  return LzmaDec_AllocateProbs(&p->decoder, props, LZMA_PROPS_SIZE, alloc);\n}\n\nstatic void Lzma2Dec_Init(CLzma2Dec *p)\n{\n  p->state = LZMA2_STATE_CONTROL;\n  p->needInitDic = True;\n  p->needInitState = True;\n  p->needInitProp = True;\n  LzmaDec_Init(&p->decoder);\n}\n\nstatic ELzma2State Lzma2Dec_UpdateState(CLzma2Dec *p, Byte b)\n{\n  switch (p->state)\n  {\n    case LZMA2_STATE_CONTROL:\n      p->control = b;\n      PRF(printf(\"\\n %4X \", (unsigned)p->decoder.dicPos));\n      PRF(printf(\" %2X\", (unsigned)b));\n      if (p->control == 0)\n        return LZMA2_STATE_FINISHED;\n      if (LZMA2_IS_UNCOMPRESSED_STATE(p))\n      {\n        if ((p->control & 0x7F) > 2)\n          return LZMA2_STATE_ERROR;\n        p->unpackSize = 0;\n      }\n      else\n        p->unpackSize = (UInt32)(p->control & 0x1F) << 16;\n      return LZMA2_STATE_UNPACK0;\n    \n    case LZMA2_STATE_UNPACK0:\n      p->unpackSize |= (UInt32)b << 8;\n      return LZMA2_STATE_UNPACK1;\n    \n    case LZMA2_STATE_UNPACK1:\n      p->unpackSize |= (UInt32)b;\n      p->unpackSize++;\n      PRF(printf(\" %8u\", (unsigned)p->unpackSize));\n      return (LZMA2_IS_UNCOMPRESSED_STATE(p)) ? LZMA2_STATE_DATA : LZMA2_STATE_PACK0;\n    \n    case LZMA2_STATE_PACK0:\n      p->packSize = (UInt32)b << 8;\n      return LZMA2_STATE_PACK1;\n\n    case LZMA2_STATE_PACK1:\n      p->packSize |= (UInt32)b;\n      p->packSize++;\n      PRF(printf(\" %8u\", (unsigned)p->packSize));\n      return LZMA2_IS_THERE_PROP(LZMA2_GET_LZMA_MODE(p)) ? LZMA2_STATE_PROP:\n        (p->needInitProp ? LZMA2_STATE_ERROR : LZMA2_STATE_DATA);\n\n    case LZMA2_STATE_PROP:\n    {\n      unsigned lc, lp;\n      if (b >= (9 * 5 * 5))\n        return LZMA2_STATE_ERROR;\n      lc = b % 9;\n      b /= 9;\n      p->decoder.prop.pb = b / 5;\n      lp = b % 5;\n      if (lc + lp > LZMA2_LCLP_MAX)\n        return LZMA2_STATE_ERROR;\n      p->decoder.prop.lc = lc;\n      p->decoder.prop.lp = lp;\n      p->needInitProp = False;\n      return LZMA2_STATE_DATA;\n    }\n  }\n  return LZMA2_STATE_ERROR;\n}\n\nstatic void LzmaDec_UpdateWithUncompressed(CLzmaDec *p, const Byte *src, SizeT size)\n{\n  memcpy(p->dic + p->dicPos, src, size);\n  p->dicPos += size;\n  if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= size)\n    p->checkDicSize = p->prop.dicSize;\n  p->processedPos += (UInt32)size;\n}\n\nstatic void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState);\n\nstatic SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit,\n    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)\n{\n  SizeT inSize = *srcLen;\n  *srcLen = 0;\n  *status = LZMA_STATUS_NOT_SPECIFIED;\n\n  while (p->state != LZMA2_STATE_FINISHED)\n  {\n    SizeT dicPos = p->decoder.dicPos;\n    \n    if (p->state == LZMA2_STATE_ERROR)\n      return SZ_ERROR_DATA;\n    \n    if (dicPos == dicLimit && finishMode == LZMA_FINISH_ANY)\n    {\n      *status = LZMA_STATUS_NOT_FINISHED;\n      return SZ_OK;\n    }\n\n    if (p->state != LZMA2_STATE_DATA && p->state != LZMA2_STATE_DATA_CONT)\n    {\n      if (*srcLen == inSize)\n      {\n        *status = LZMA_STATUS_NEEDS_MORE_INPUT;\n        return SZ_OK;\n      }\n      (*srcLen)++;\n      p->state = Lzma2Dec_UpdateState(p, *src++);\n\n      if (dicPos == dicLimit && p->state != LZMA2_STATE_FINISHED)\n      {\n        p->state = LZMA2_STATE_ERROR;\n        return SZ_ERROR_DATA;\n      }\n      continue;\n    }\n    \n    {\n      SizeT destSizeCur = dicLimit - dicPos;\n      SizeT srcSizeCur = inSize - *srcLen;\n      ELzmaFinishMode curFinishMode = LZMA_FINISH_ANY;\n      \n      if (p->unpackSize <= destSizeCur)\n      {\n        destSizeCur = (SizeT)p->unpackSize;\n        curFinishMode = LZMA_FINISH_END;\n      }\n\n      if (LZMA2_IS_UNCOMPRESSED_STATE(p))\n      {\n        if (*srcLen == inSize)\n        {\n          *status = LZMA_STATUS_NEEDS_MORE_INPUT;\n          return SZ_OK;\n        }\n\n        if (p->state == LZMA2_STATE_DATA)\n        {\n          Bool initDic = (p->control == LZMA2_CONTROL_COPY_RESET_DIC);\n          if (initDic)\n            p->needInitProp = p->needInitState = True;\n          else if (p->needInitDic)\n          {\n            p->state = LZMA2_STATE_ERROR;\n            return SZ_ERROR_DATA;\n          }\n          p->needInitDic = False;\n          LzmaDec_InitDicAndState(&p->decoder, initDic, False);\n        }\n\n        if (srcSizeCur > destSizeCur)\n          srcSizeCur = destSizeCur;\n\n        if (srcSizeCur == 0)\n        {\n          p->state = LZMA2_STATE_ERROR;\n          return SZ_ERROR_DATA;\n        }\n\n        LzmaDec_UpdateWithUncompressed(&p->decoder, src, srcSizeCur);\n\n        src += srcSizeCur;\n        *srcLen += srcSizeCur;\n        p->unpackSize -= (UInt32)srcSizeCur;\n        p->state = (p->unpackSize == 0) ? LZMA2_STATE_CONTROL : LZMA2_STATE_DATA_CONT;\n      }\n      else\n      {\n        SizeT outSizeProcessed;\n        SRes res;\n\n        if (p->state == LZMA2_STATE_DATA)\n        {\n          unsigned mode = LZMA2_GET_LZMA_MODE(p);\n          Bool initDic = (mode == 3);\n          Bool initState = (mode != 0);\n          if ((!initDic && p->needInitDic) || (!initState && p->needInitState))\n          {\n            p->state = LZMA2_STATE_ERROR;\n            return SZ_ERROR_DATA;\n          }\n          \n          LzmaDec_InitDicAndState(&p->decoder, initDic, initState);\n          p->needInitDic = False;\n          p->needInitState = False;\n          p->state = LZMA2_STATE_DATA_CONT;\n        }\n  \n        if (srcSizeCur > p->packSize)\n          srcSizeCur = (SizeT)p->packSize;\n          \n        res = LzmaDec_DecodeToDic(&p->decoder, dicPos + destSizeCur, src, &srcSizeCur, curFinishMode, status);\n        \n        src += srcSizeCur;\n        *srcLen += srcSizeCur;\n        p->packSize -= (UInt32)srcSizeCur;\n\n        outSizeProcessed = p->decoder.dicPos - dicPos;\n        p->unpackSize -= (UInt32)outSizeProcessed;\n\n        RINOK(res);\n        if (*status == LZMA_STATUS_NEEDS_MORE_INPUT)\n          return res;\n\n        if (srcSizeCur == 0 && outSizeProcessed == 0)\n        {\n          if (*status != LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK\n              || p->unpackSize != 0\n              || p->packSize != 0)\n          {\n            p->state = LZMA2_STATE_ERROR;\n            return SZ_ERROR_DATA;\n          }\n          p->state = LZMA2_STATE_CONTROL;\n        }\n        \n        if (*status == LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK)\n          *status = LZMA_STATUS_NOT_FINISHED;\n      }\n    }\n  }\n  \n  *status = LZMA_STATUS_FINISHED_WITH_MARK;\n  return SZ_OK;\n}\n\n#endif  /* _INCLUDE_PHYSFS_LZMASDK_H_ */\n\n/* end of physfs_lzmasdk.h ... */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_miniz.h",
    "content": "/* tinfl.c v1.11 - public domain inflate with zlib header parsing/adler32 checking (inflate-only subset of miniz.c)\n   See \"unlicense\" statement at the end of this file.\n   Rich Geldreich <richgel99@gmail.com>, last updated May 20, 2011\n   Implements RFC 1950: https://www.ietf.org/rfc/rfc1950.txt and RFC 1951: https://www.ietf.org/rfc/rfc1951.txt\n\n   The entire decompressor coroutine is implemented in tinfl_decompress(). The other functions are optional high-level helpers.\n*/\n#ifndef TINFL_HEADER_INCLUDED\n#define TINFL_HEADER_INCLUDED\n\ntypedef PHYSFS_uint8 mz_uint8;\ntypedef PHYSFS_sint16 mz_int16;\ntypedef PHYSFS_uint16 mz_uint16;\ntypedef PHYSFS_uint32 mz_uint32;\ntypedef unsigned int mz_uint; \ntypedef PHYSFS_uint64 mz_uint64;\n\n/* For more compatibility with zlib, miniz.c uses unsigned long for some parameters/struct members. */\ntypedef unsigned long mz_ulong;\n\n/* Heap allocation callbacks. */\ntypedef void *(*mz_alloc_func)(void *opaque, unsigned int items, unsigned int size);\ntypedef void (*mz_free_func)(void *opaque, void *address);\n\n#ifndef MINIZ_LITTLE_ENDIAN /* if not defined by PHYSFS */\n#if defined(_M_IX86) || defined(_M_X64)\n/* Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES to 1 if integer loads and stores to unaligned addresses are acceptable on the target platform (slightly faster). */\n#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1\n/* Set MINIZ_LITTLE_ENDIAN to 1 if the processor is little endian. */\n#define MINIZ_LITTLE_ENDIAN 1\n#endif\n#endif /**/\n\n#if defined(_WIN64) || defined(__MINGW64__) || defined(_LP64) || defined(__LP64__)\n/* Set MINIZ_HAS_64BIT_REGISTERS to 1 if the processor has 64-bit general purpose registers (enables 64-bit bitbuffer in inflator) */\n#define MINIZ_HAS_64BIT_REGISTERS 1\n#endif\n\n/* Works around MSVC's spammy \"warning C4127: conditional expression is constant\" message. */\n#ifdef _MSC_VER\n#define MZ_MACRO_END while (0, 0)\n#else\n#define MZ_MACRO_END while (0)\n#endif\n\n/* Decompression flags. */\nenum\n{\n  TINFL_FLAG_PARSE_ZLIB_HEADER = 1,\n  TINFL_FLAG_HAS_MORE_INPUT = 2,\n  TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF = 4,\n  TINFL_FLAG_COMPUTE_ADLER32 = 8\n};\n\nstruct tinfl_decompressor_tag; typedef struct tinfl_decompressor_tag tinfl_decompressor;\n\n/* Max size of LZ dictionary. */\n#define TINFL_LZ_DICT_SIZE 32768\n\n/* Return status. */\ntypedef enum\n{\n  TINFL_STATUS_BAD_PARAM = -3,\n  TINFL_STATUS_ADLER32_MISMATCH = -2,\n  TINFL_STATUS_FAILED = -1,\n  TINFL_STATUS_DONE = 0,\n  TINFL_STATUS_NEEDS_MORE_INPUT = 1,\n  TINFL_STATUS_HAS_MORE_OUTPUT = 2\n} tinfl_status;\n\n/* Initializes the decompressor to its initial state. */\n#define tinfl_init(r) do { (r)->m_state = 0; } MZ_MACRO_END\n#define tinfl_get_adler32(r) (r)->m_check_adler32\n\n/* Main low-level decompressor coroutine function. This is the only function actually needed for decompression. All the other functions are just high-level helpers for improved usability. */\n/* This is a universal API, i.e. it can be used as a building block to build any desired higher level decompression API. In the limit case, it can be called once per every byte input or output. */\nstatic tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags);\n\n/* Internal/private bits follow. */\nenum\n{\n  TINFL_MAX_HUFF_TABLES = 3, TINFL_MAX_HUFF_SYMBOLS_0 = 288, TINFL_MAX_HUFF_SYMBOLS_1 = 32, TINFL_MAX_HUFF_SYMBOLS_2 = 19,\n  TINFL_FAST_LOOKUP_BITS = 10, TINFL_FAST_LOOKUP_SIZE = 1 << TINFL_FAST_LOOKUP_BITS\n};\n\ntypedef struct\n{\n  mz_uint8 m_code_size[TINFL_MAX_HUFF_SYMBOLS_0];\n  mz_int16 m_look_up[TINFL_FAST_LOOKUP_SIZE], m_tree[TINFL_MAX_HUFF_SYMBOLS_0 * 2];\n} tinfl_huff_table;\n\n#if MINIZ_HAS_64BIT_REGISTERS\n  #define TINFL_USE_64BIT_BITBUF 1\n#endif\n\n#if TINFL_USE_64BIT_BITBUF\n  typedef mz_uint64 tinfl_bit_buf_t;\n  #define TINFL_BITBUF_SIZE (64)\n#else\n  typedef mz_uint32 tinfl_bit_buf_t;\n  #define TINFL_BITBUF_SIZE (32)\n#endif\n\nstruct tinfl_decompressor_tag\n{\n  mz_uint32 m_state, m_num_bits, m_zhdr0, m_zhdr1, m_z_adler32, m_final, m_type, m_check_adler32, m_dist, m_counter, m_num_extra, m_table_sizes[TINFL_MAX_HUFF_TABLES];\n  tinfl_bit_buf_t m_bit_buf;\n  size_t m_dist_from_out_buf_start;\n  tinfl_huff_table m_tables[TINFL_MAX_HUFF_TABLES];\n  mz_uint8 m_raw_header[4], m_len_codes[TINFL_MAX_HUFF_SYMBOLS_0 + TINFL_MAX_HUFF_SYMBOLS_1 + 137];\n};\n\n#endif /* #ifdef TINFL_HEADER_INCLUDED */\n\n/* ------------------- End of Header: Implementation follows. (If you only want the header, define MINIZ_HEADER_FILE_ONLY.) */\n\n#ifndef TINFL_HEADER_FILE_ONLY\n\n#define MZ_MAX(a,b) (((a)>(b))?(a):(b))\n#define MZ_MIN(a,b) (((a)<(b))?(a):(b))\n#define MZ_CLEAR_OBJ(obj) memset(&(obj), 0, sizeof(obj))\n#define MZ_CLEAR_ARR(obj) memset((obj), 0, sizeof(obj))\n#define MZ_CLEAR_PTR(obj) memset((obj), 0, sizeof(*obj))\n\n#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN\n  #define MZ_READ_LE16(p) *((const mz_uint16 *)(p))\n  #define MZ_READ_LE32(p) *((const mz_uint32 *)(p))\n#else\n  #define MZ_READ_LE16(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U))\n  #define MZ_READ_LE32(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U) | ((mz_uint32)(((const mz_uint8 *)(p))[2]) << 16U) | ((mz_uint32)(((const mz_uint8 *)(p))[3]) << 24U))\n#endif\n\n#define TINFL_MEMCPY(d, s, l) memcpy(d, s, l)\n#define TINFL_MEMSET(p, c, l) memset(p, c, l)\n\n#define TINFL_CR_BEGIN switch(r->m_state) { case 0:\n#define TINFL_CR_RETURN(state_index, result) do { status = result; r->m_state = state_index; goto common_exit; case state_index:; } MZ_MACRO_END\n#define TINFL_CR_RETURN_FOREVER(state_index, result) do { for ( ; ; ) { TINFL_CR_RETURN(state_index, result); } } MZ_MACRO_END\n#define TINFL_CR_FINISH }\n\n/* TODO: If the caller has indicated that there's no more input, and we attempt to read beyond the input buf, then something is wrong with the input because the inflator never */\n/* reads ahead more than it needs to. Currently TINFL_GET_BYTE() pads the end of the stream with 0's in this scenario. */\n#define TINFL_GET_BYTE(state_index, c) do { \\\n  if (pIn_buf_cur >= pIn_buf_end) { \\\n    for ( ; ; ) { \\\n      if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) { \\\n        TINFL_CR_RETURN(state_index, TINFL_STATUS_NEEDS_MORE_INPUT); \\\n        if (pIn_buf_cur < pIn_buf_end) { \\\n          c = *pIn_buf_cur++; \\\n          break; \\\n        } \\\n      } else { \\\n        c = 0; \\\n        break; \\\n      } \\\n    } \\\n  } else c = *pIn_buf_cur++; } MZ_MACRO_END\n\n#define TINFL_NEED_BITS(state_index, n) do { mz_uint c; TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; } while (num_bits < (mz_uint)(n))\n#define TINFL_SKIP_BITS(state_index, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END\n#define TINFL_GET_BITS(state_index, b, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } b = bit_buf & ((1 << (n)) - 1); bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END\n\n/* TINFL_HUFF_BITBUF_FILL() is only used rarely, when the number of bytes remaining in the input buffer falls below 2. */\n/* It reads just enough bytes from the input stream that are needed to decode the next Huffman code (and absolutely no more). It works by trying to fully decode a */\n/* Huffman code by using whatever bits are currently present in the bit buffer. If this fails, it reads another byte, and tries again until it succeeds or until the */\n/* bit buffer contains >=15 bits (deflate's max. Huffman code size). */\n#define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \\\n  do { \\\n    temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \\\n    if (temp >= 0) { \\\n      code_len = temp >> 9; \\\n      if ((code_len) && (num_bits >= code_len)) \\\n          break; \\\n    } else if (num_bits > TINFL_FAST_LOOKUP_BITS) { \\\n       code_len = TINFL_FAST_LOOKUP_BITS; \\\n       do { \\\n          temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \\\n       } while ((temp < 0) && (num_bits >= (code_len + 1))); \\\n       if (temp >= 0) break; \\\n    } \\\n    TINFL_GET_BYTE(state_index, c); \\\n    bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); \\\n    num_bits += 8; \\\n  } while (num_bits < 15);\n\n/* TINFL_HUFF_DECODE() decodes the next Huffman coded symbol. It's more complex than you would initially expect because the zlib API expects the decompressor to never read */\n/* beyond the final byte of the deflate stream. (In other words, when this macro wants to read another byte from the input, it REALLY needs another byte in order to fully */\n/* decode the next Huffman code.) Handling this properly is particularly important on raw deflate (non-zlib) streams, which aren't followed by a byte aligned adler-32. */\n/* The slow path is only executed at the very end of the input buffer. */\n#define TINFL_HUFF_DECODE(state_index, sym, pHuff) do { \\\n  int temp; mz_uint code_len, c; \\\n  if (num_bits < 15) { \\\n    if ((pIn_buf_end - pIn_buf_cur) < 2) { \\\n       TINFL_HUFF_BITBUF_FILL(state_index, pHuff); \\\n    } else { \\\n       bit_buf |= (((tinfl_bit_buf_t)pIn_buf_cur[0]) << num_bits) | (((tinfl_bit_buf_t)pIn_buf_cur[1]) << (num_bits + 8)); pIn_buf_cur += 2; num_bits += 16; \\\n    } \\\n  } \\\n  if ((temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) \\\n    code_len = temp >> 9, temp &= 511; \\\n  else { \\\n    code_len = TINFL_FAST_LOOKUP_BITS; do { temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; } while (temp < 0); \\\n  } sym = temp; bit_buf >>= code_len; num_bits -= code_len; } MZ_MACRO_END\n\nstatic tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags)\n{\n  static const int s_length_base[31] = { 3,4,5,6,7,8,9,10,11,13, 15,17,19,23,27,31,35,43,51,59, 67,83,99,115,131,163,195,227,258,0,0 };\n  static const int s_length_extra[31]= { 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 };\n  static const int s_dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};\n  static const int s_dist_extra[32] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};\n  static const mz_uint8 s_length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };\n  static const int s_min_table_sizes[3] = { 257, 1, 4 };\n\n  tinfl_status status = TINFL_STATUS_FAILED; mz_uint32 num_bits, dist, counter, num_extra; tinfl_bit_buf_t bit_buf;\n  const mz_uint8 *pIn_buf_cur = pIn_buf_next, *const pIn_buf_end = pIn_buf_next + *pIn_buf_size;\n  mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end = pOut_buf_next + *pOut_buf_size;\n  size_t out_buf_size_mask = (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF) ? (size_t)-1 : ((pOut_buf_next - pOut_buf_start) + *pOut_buf_size) - 1, dist_from_out_buf_start;\n\n  /* Ensure the output buffer's size is a power of 2, unless the output buffer is large enough to hold the entire output file (in which case it doesn't matter). */\n  if (((out_buf_size_mask + 1) & out_buf_size_mask) || (pOut_buf_next < pOut_buf_start)) { *pIn_buf_size = *pOut_buf_size = 0; return TINFL_STATUS_BAD_PARAM; }\n\n  num_bits = r->m_num_bits; bit_buf = r->m_bit_buf; dist = r->m_dist; counter = r->m_counter; num_extra = r->m_num_extra; dist_from_out_buf_start = r->m_dist_from_out_buf_start;\n  TINFL_CR_BEGIN\n\n  bit_buf = num_bits = dist = counter = num_extra = r->m_zhdr0 = r->m_zhdr1 = 0; r->m_z_adler32 = r->m_check_adler32 = 1;\n  if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER)\n  {\n    TINFL_GET_BYTE(1, r->m_zhdr0); TINFL_GET_BYTE(2, r->m_zhdr1);\n    counter = (((r->m_zhdr0 * 256 + r->m_zhdr1) % 31 != 0) || (r->m_zhdr1 & 32) || ((r->m_zhdr0 & 15) != 8));\n    if (!(decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) counter |= (((1U << (8U + (r->m_zhdr0 >> 4))) > 32768U) || ((out_buf_size_mask + 1) < (size_t)(1U << (8U + (r->m_zhdr0 >> 4)))));\n    if (counter) { TINFL_CR_RETURN_FOREVER(36, TINFL_STATUS_FAILED); }\n  }\n\n  do\n  {\n    TINFL_GET_BITS(3, r->m_final, 3); r->m_type = r->m_final >> 1;\n    if (r->m_type == 0)\n    {\n      TINFL_SKIP_BITS(5, num_bits & 7);\n      for (counter = 0; counter < 4; ++counter) { if (num_bits) TINFL_GET_BITS(6, r->m_raw_header[counter], 8); else TINFL_GET_BYTE(7, r->m_raw_header[counter]); }\n      if ((counter = (r->m_raw_header[0] | (r->m_raw_header[1] << 8))) != (mz_uint)(0xFFFF ^ (r->m_raw_header[2] | (r->m_raw_header[3] << 8)))) { TINFL_CR_RETURN_FOREVER(39, TINFL_STATUS_FAILED); }\n      while ((counter) && (num_bits))\n      {\n        TINFL_GET_BITS(51, dist, 8);\n        while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(52, TINFL_STATUS_HAS_MORE_OUTPUT); }\n        *pOut_buf_cur++ = (mz_uint8)dist;\n        counter--;\n      }\n      while (counter)\n      {\n        size_t n; while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(9, TINFL_STATUS_HAS_MORE_OUTPUT); }\n        while (pIn_buf_cur >= pIn_buf_end)\n        {\n          if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT)\n          {\n            TINFL_CR_RETURN(38, TINFL_STATUS_NEEDS_MORE_INPUT);\n          }\n          else\n          {\n            TINFL_CR_RETURN_FOREVER(40, TINFL_STATUS_FAILED);\n          }\n        }\n        n = MZ_MIN(MZ_MIN((size_t)(pOut_buf_end - pOut_buf_cur), (size_t)(pIn_buf_end - pIn_buf_cur)), counter);\n        TINFL_MEMCPY(pOut_buf_cur, pIn_buf_cur, n); pIn_buf_cur += n; pOut_buf_cur += n; counter -= (mz_uint)n;\n      }\n    }\n    else if (r->m_type == 3)\n    {\n      TINFL_CR_RETURN_FOREVER(10, TINFL_STATUS_FAILED);\n    }\n    else\n    {\n      if (r->m_type == 1)\n      {\n        mz_uint8 *p = r->m_tables[0].m_code_size; mz_uint i;\n        r->m_table_sizes[0] = 288; r->m_table_sizes[1] = 32; TINFL_MEMSET(r->m_tables[1].m_code_size, 5, 32);\n        for ( i = 0; i <= 143; ++i) *p++ = 8;\n        for ( ; i <= 255; ++i) *p++ = 9;\n        for ( ; i <= 279; ++i) *p++ = 7;\n        for ( ; i <= 287; ++i) *p++ = 8;\n      }\n      else\n      {\n        for (counter = 0; counter < 3; counter++) { TINFL_GET_BITS(11, r->m_table_sizes[counter], \"\\05\\05\\04\"[counter]); r->m_table_sizes[counter] += s_min_table_sizes[counter]; }\n        MZ_CLEAR_ARR(r->m_tables[2].m_code_size); for (counter = 0; counter < r->m_table_sizes[2]; counter++) { mz_uint s; TINFL_GET_BITS(14, s, 3); r->m_tables[2].m_code_size[s_length_dezigzag[counter]] = (mz_uint8)s; }\n        r->m_table_sizes[2] = 19;\n      }\n      for ( ; (int)r->m_type >= 0; r->m_type--)\n      {\n        int tree_next, tree_cur; tinfl_huff_table *pTable;\n        mz_uint i, j, used_syms, total, sym_index, next_code[17], total_syms[16]; pTable = &r->m_tables[r->m_type]; MZ_CLEAR_ARR(total_syms); MZ_CLEAR_ARR(pTable->m_look_up); MZ_CLEAR_ARR(pTable->m_tree);\n        for (i = 0; i < r->m_table_sizes[r->m_type]; ++i) total_syms[pTable->m_code_size[i]]++;\n        used_syms = 0, total = 0; next_code[0] = next_code[1] = 0;\n        for (i = 1; i <= 15; ++i) { used_syms += total_syms[i]; next_code[i + 1] = (total = ((total + total_syms[i]) << 1)); }\n        if ((65536 != total) && (used_syms > 1))\n        {\n          TINFL_CR_RETURN_FOREVER(35, TINFL_STATUS_FAILED);\n        }\n        for (tree_next = -1, sym_index = 0; sym_index < r->m_table_sizes[r->m_type]; ++sym_index)\n        {\n          mz_uint rev_code = 0, l, cur_code, code_size = pTable->m_code_size[sym_index]; if (!code_size) continue;\n          cur_code = next_code[code_size]++; for (l = code_size; l > 0; l--, cur_code >>= 1) rev_code = (rev_code << 1) | (cur_code & 1);\n          if (code_size <= TINFL_FAST_LOOKUP_BITS) { mz_int16 k = (mz_int16)((code_size << 9) | sym_index); while (rev_code < TINFL_FAST_LOOKUP_SIZE) { pTable->m_look_up[rev_code] = k; rev_code += (1 << code_size); } continue; }\n          if (0 == (tree_cur = pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)])) { pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; }\n          rev_code >>= (TINFL_FAST_LOOKUP_BITS - 1);\n          for (j = code_size; j > (TINFL_FAST_LOOKUP_BITS + 1); j--)\n          {\n            tree_cur -= ((rev_code >>= 1) & 1);\n            if (!pTable->m_tree[-tree_cur - 1]) { pTable->m_tree[-tree_cur - 1] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; } else tree_cur = pTable->m_tree[-tree_cur - 1];\n          }\n          tree_cur -= ((rev_code >>= 1) & 1); pTable->m_tree[-tree_cur - 1] = (mz_int16)sym_index;\n        }\n        if (r->m_type == 2)\n        {\n          for (counter = 0; counter < (r->m_table_sizes[0] + r->m_table_sizes[1]); )\n          {\n            mz_uint s; TINFL_HUFF_DECODE(16, dist, &r->m_tables[2]); if (dist < 16) { r->m_len_codes[counter++] = (mz_uint8)dist; continue; }\n            if ((dist == 16) && (!counter))\n            {\n              TINFL_CR_RETURN_FOREVER(17, TINFL_STATUS_FAILED);\n            }\n            num_extra = \"\\02\\03\\07\"[dist - 16]; TINFL_GET_BITS(18, s, num_extra); s += \"\\03\\03\\013\"[dist - 16];\n            TINFL_MEMSET(r->m_len_codes + counter, (dist == 16) ? r->m_len_codes[counter - 1] : 0, s); counter += s;\n          }\n          if ((r->m_table_sizes[0] + r->m_table_sizes[1]) != counter)\n          {\n            TINFL_CR_RETURN_FOREVER(21, TINFL_STATUS_FAILED);\n          }\n          TINFL_MEMCPY(r->m_tables[0].m_code_size, r->m_len_codes, r->m_table_sizes[0]); TINFL_MEMCPY(r->m_tables[1].m_code_size, r->m_len_codes + r->m_table_sizes[0], r->m_table_sizes[1]);\n        }\n      }\n      for ( ; ; )\n      {\n        mz_uint8 *pSrc;\n        for ( ; ; )\n        {\n          if (((pIn_buf_end - pIn_buf_cur) < 4) || ((pOut_buf_end - pOut_buf_cur) < 2))\n          {\n            TINFL_HUFF_DECODE(23, counter, &r->m_tables[0]);\n            if (counter >= 256)\n              break;\n            while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(24, TINFL_STATUS_HAS_MORE_OUTPUT); }\n            *pOut_buf_cur++ = (mz_uint8)counter;\n          }\n          else\n          {\n            int sym2; mz_uint code_len;\n#if TINFL_USE_64BIT_BITBUF\n            if (num_bits < 30) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE32(pIn_buf_cur)) << num_bits); pIn_buf_cur += 4; num_bits += 32; }\n#else\n            if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; }\n#endif\n            if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0)\n              code_len = sym2 >> 9;\n            else\n            {\n              code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0);\n            }\n            counter = sym2; bit_buf >>= code_len; num_bits -= code_len;\n            if (counter & 256)\n              break;\n\n#if !TINFL_USE_64BIT_BITBUF\n            if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; }\n#endif\n            if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0)\n              code_len = sym2 >> 9;\n            else\n            {\n              code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0);\n            }\n            bit_buf >>= code_len; num_bits -= code_len;\n\n            pOut_buf_cur[0] = (mz_uint8)counter;\n            if (sym2 & 256)\n            {\n              pOut_buf_cur++;\n              counter = sym2;\n              break;\n            }\n            pOut_buf_cur[1] = (mz_uint8)sym2;\n            pOut_buf_cur += 2;\n          }\n        }\n        if ((counter &= 511) == 256) break;\n\n        num_extra = s_length_extra[counter - 257]; counter = s_length_base[counter - 257];\n        if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(25, extra_bits, num_extra); counter += extra_bits; }\n\n        TINFL_HUFF_DECODE(26, dist, &r->m_tables[1]);\n        num_extra = s_dist_extra[dist]; dist = s_dist_base[dist];\n        if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(27, extra_bits, num_extra); dist += extra_bits; }\n\n        dist_from_out_buf_start = pOut_buf_cur - pOut_buf_start;\n        if ((dist > dist_from_out_buf_start) && (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF))\n        {\n          TINFL_CR_RETURN_FOREVER(37, TINFL_STATUS_FAILED);\n        }\n\n        pSrc = pOut_buf_start + ((dist_from_out_buf_start - dist) & out_buf_size_mask);\n\n        if ((MZ_MAX(pOut_buf_cur, pSrc) + counter) > pOut_buf_end)\n        {\n          while (counter--)\n          {\n            while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(53, TINFL_STATUS_HAS_MORE_OUTPUT); }\n            *pOut_buf_cur++ = pOut_buf_start[(dist_from_out_buf_start++ - dist) & out_buf_size_mask];\n          }\n          continue;\n        }\n#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES\n        else if ((counter >= 9) && (counter <= dist))\n        {\n          const mz_uint8 *pSrc_end = pSrc + (counter & ~7);\n          do\n          {\n            ((mz_uint32 *)pOut_buf_cur)[0] = ((const mz_uint32 *)pSrc)[0];\n            ((mz_uint32 *)pOut_buf_cur)[1] = ((const mz_uint32 *)pSrc)[1];\n            pOut_buf_cur += 8;\n          } while ((pSrc += 8) < pSrc_end);\n          if ((counter &= 7) < 3)\n          {\n            if (counter)\n            {\n              pOut_buf_cur[0] = pSrc[0];\n              if (counter > 1)\n                pOut_buf_cur[1] = pSrc[1];\n              pOut_buf_cur += counter;\n            }\n            continue;\n          }\n        }\n#endif\n        do\n        {\n          pOut_buf_cur[0] = pSrc[0];\n          pOut_buf_cur[1] = pSrc[1];\n          pOut_buf_cur[2] = pSrc[2];\n          pOut_buf_cur += 3; pSrc += 3;\n        } while ((int)(counter -= 3) > 2);\n        if ((int)counter > 0)\n        {\n          pOut_buf_cur[0] = pSrc[0];\n          if ((int)counter > 1)\n            pOut_buf_cur[1] = pSrc[1];\n          pOut_buf_cur += counter;\n        }\n      }\n    }\n  } while (!(r->m_final & 1));\n  if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER)\n  {\n    TINFL_SKIP_BITS(32, num_bits & 7); for (counter = 0; counter < 4; ++counter) { mz_uint s; if (num_bits) TINFL_GET_BITS(41, s, 8); else TINFL_GET_BYTE(42, s); r->m_z_adler32 = (r->m_z_adler32 << 8) | s; }\n  }\n  TINFL_CR_RETURN_FOREVER(34, TINFL_STATUS_DONE);\n  TINFL_CR_FINISH\n\ncommon_exit:\n  r->m_num_bits = num_bits; r->m_bit_buf = bit_buf; r->m_dist = dist; r->m_counter = counter; r->m_num_extra = num_extra; r->m_dist_from_out_buf_start = dist_from_out_buf_start;\n  *pIn_buf_size = pIn_buf_cur - pIn_buf_next; *pOut_buf_size = pOut_buf_cur - pOut_buf_next;\n  if ((decomp_flags & (TINFL_FLAG_PARSE_ZLIB_HEADER | TINFL_FLAG_COMPUTE_ADLER32)) && (status >= 0))\n  {\n    const mz_uint8 *ptr = pOut_buf_next; size_t buf_len = *pOut_buf_size;\n    mz_uint32 i, s1 = r->m_check_adler32 & 0xffff, s2 = r->m_check_adler32 >> 16; size_t block_len = buf_len % 5552;\n    while (buf_len)\n    {\n      for (i = 0; i + 7 < block_len; i += 8, ptr += 8)\n      {\n        s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1;\n        s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1;\n      }\n      for ( ; i < block_len; ++i) s1 += *ptr++, s2 += s1;\n      s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552;\n    }\n    r->m_check_adler32 = (s2 << 16) + s1; if ((status == TINFL_STATUS_DONE) && (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) && (r->m_check_adler32 != r->m_z_adler32)) status = TINFL_STATUS_ADLER32_MISMATCH;\n  }\n  return status;\n}\n\n/* Flush values. For typical usage you only need MZ_NO_FLUSH and MZ_FINISH. The other stuff is for advanced use. */\nenum { MZ_NO_FLUSH = 0, MZ_PARTIAL_FLUSH = 1, MZ_SYNC_FLUSH = 2, MZ_FULL_FLUSH = 3, MZ_FINISH = 4, MZ_BLOCK = 5 };\n\n/* Return status codes. MZ_PARAM_ERROR is non-standard. */\nenum { MZ_OK = 0, MZ_STREAM_END = 1, MZ_NEED_DICT = 2, MZ_ERRNO = -1, MZ_STREAM_ERROR = -2, MZ_DATA_ERROR = -3, MZ_MEM_ERROR = -4, MZ_BUF_ERROR = -5, MZ_VERSION_ERROR = -6, MZ_PARAM_ERROR = -10000 };\n\n/* Compression levels. */\nenum { MZ_NO_COMPRESSION = 0, MZ_BEST_SPEED = 1, MZ_BEST_COMPRESSION = 9, MZ_DEFAULT_COMPRESSION = -1 };\n\n/* Window bits */\n#define MZ_DEFAULT_WINDOW_BITS 15\n\nstruct mz_internal_state;\n\n/* Compression/decompression stream struct. */\ntypedef struct mz_stream_s\n{\n  const unsigned char *next_in;     /* pointer to next byte to read */\n  unsigned int avail_in;            /* number of bytes available at next_in */\n  mz_ulong total_in;                /* total number of bytes consumed so far */\n\n  unsigned char *next_out;          /* pointer to next byte to write */\n  unsigned int avail_out;           /* number of bytes that can be written to next_out */\n  mz_ulong total_out;               /* total number of bytes produced so far */\n\n  char *msg;                        /* error msg (unused) */\n  struct mz_internal_state *state;  /* internal state, allocated by zalloc/zfree */\n\n  mz_alloc_func zalloc;             /* optional heap allocation function (defaults to malloc) */\n  mz_free_func zfree;               /* optional heap free function (defaults to free) */\n  void *opaque;                     /* heap alloc function user pointer */\n\n  int data_type;                    /* data_type (unused) */\n  mz_ulong adler;                   /* adler32 of the source or uncompressed data */\n  mz_ulong reserved;                /* not used */\n} mz_stream;\n\ntypedef mz_stream *mz_streamp;\n\n\ntypedef struct\n{\n  tinfl_decompressor m_decomp;\n  mz_uint m_dict_ofs, m_dict_avail, m_first_call, m_has_flushed; int m_window_bits;\n  mz_uint8 m_dict[TINFL_LZ_DICT_SIZE];\n  tinfl_status m_last_status;\n} inflate_state;\n\nstatic int mz_inflateInit2(mz_streamp pStream, int window_bits)\n{\n  inflate_state *pDecomp;\n  if (!pStream) return MZ_STREAM_ERROR;\n  if ((window_bits != MZ_DEFAULT_WINDOW_BITS) && (-window_bits != MZ_DEFAULT_WINDOW_BITS)) return MZ_PARAM_ERROR;\n\n  pStream->data_type = 0;\n  pStream->adler = 0;\n  pStream->msg = NULL;\n  pStream->total_in = 0;\n  pStream->total_out = 0;\n  pStream->reserved = 0;\n  /* if (!pStream->zalloc) pStream->zalloc = def_alloc_func; */\n  /* if (!pStream->zfree) pStream->zfree = def_free_func; */\n\n  pDecomp = (inflate_state*)pStream->zalloc(pStream->opaque, 1, sizeof(inflate_state));\n  if (!pDecomp) return MZ_MEM_ERROR;\n\n  pStream->state = (struct mz_internal_state *)pDecomp;\n\n  tinfl_init(&pDecomp->m_decomp);\n  pDecomp->m_dict_ofs = 0;\n  pDecomp->m_dict_avail = 0;\n  pDecomp->m_last_status = TINFL_STATUS_NEEDS_MORE_INPUT;\n  pDecomp->m_first_call = 1;\n  pDecomp->m_has_flushed = 0;\n  pDecomp->m_window_bits = window_bits;\n\n  return MZ_OK;\n}\n\nstatic int mz_inflate(mz_streamp pStream, int flush)\n{\n  inflate_state* pState;\n  mz_uint n, first_call, decomp_flags = TINFL_FLAG_COMPUTE_ADLER32;\n  size_t in_bytes, out_bytes, orig_avail_in;\n  tinfl_status status;\n\n  if ((!pStream) || (!pStream->state)) return MZ_STREAM_ERROR;\n  if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH;\n  if ((flush) && (flush != MZ_SYNC_FLUSH) && (flush != MZ_FINISH)) return MZ_STREAM_ERROR;\n\n  pState = (inflate_state*)pStream->state;\n  if (pState->m_window_bits > 0) decomp_flags |= TINFL_FLAG_PARSE_ZLIB_HEADER;\n  orig_avail_in = pStream->avail_in;\n\n  first_call = pState->m_first_call; pState->m_first_call = 0;\n  if (pState->m_last_status < 0) return MZ_DATA_ERROR;\n\n  if (pState->m_has_flushed && (flush != MZ_FINISH)) return MZ_STREAM_ERROR;\n  pState->m_has_flushed |= (flush == MZ_FINISH);\n\n  if ((flush == MZ_FINISH) && (first_call))\n  {\n    /* MZ_FINISH on the first call implies that the input and output buffers are large enough to hold the entire compressed/decompressed file. */\n    decomp_flags |= TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF;\n    in_bytes = pStream->avail_in; out_bytes = pStream->avail_out;\n    status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pStream->next_out, pStream->next_out, &out_bytes, decomp_flags);\n    pState->m_last_status = status;\n    pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes; pStream->total_in += (mz_uint)in_bytes;\n    pStream->adler = tinfl_get_adler32(&pState->m_decomp);\n    pStream->next_out += (mz_uint)out_bytes; pStream->avail_out -= (mz_uint)out_bytes; pStream->total_out += (mz_uint)out_bytes;\n\n    if (status < 0)\n      return MZ_DATA_ERROR;\n    else if (status != TINFL_STATUS_DONE)\n    {\n      pState->m_last_status = TINFL_STATUS_FAILED;\n      return MZ_BUF_ERROR;\n    }\n    return MZ_STREAM_END;\n  }\n  /* flush != MZ_FINISH then we must assume there's more input. */\n  if (flush != MZ_FINISH) decomp_flags |= TINFL_FLAG_HAS_MORE_INPUT;\n\n  if (pState->m_dict_avail)\n  {\n    n = MZ_MIN(pState->m_dict_avail, pStream->avail_out);\n    memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n);\n    pStream->next_out += n; pStream->avail_out -= n; pStream->total_out += n;\n    pState->m_dict_avail -= n; pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1);\n    return ((pState->m_last_status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK;\n  }\n\n  for ( ; ; )\n  {\n    in_bytes = pStream->avail_in;\n    out_bytes = TINFL_LZ_DICT_SIZE - pState->m_dict_ofs;\n\n    status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pState->m_dict, pState->m_dict + pState->m_dict_ofs, &out_bytes, decomp_flags);\n    pState->m_last_status = status;\n\n    pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes;\n    pStream->total_in += (mz_uint)in_bytes; pStream->adler = tinfl_get_adler32(&pState->m_decomp);\n\n    pState->m_dict_avail = (mz_uint)out_bytes;\n\n    n = MZ_MIN(pState->m_dict_avail, pStream->avail_out);\n    memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n);\n    pStream->next_out += n; pStream->avail_out -= n; pStream->total_out += n;\n    pState->m_dict_avail -= n; pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1);\n\n    if (status < 0)\n       return MZ_DATA_ERROR; /* Stream is corrupted (there could be some uncompressed data left in the output dictionary - oh well). */\n    else if ((status == TINFL_STATUS_NEEDS_MORE_INPUT) && (!orig_avail_in))\n      return MZ_BUF_ERROR; /* Signal caller that we can't make forward progress without supplying more input or by setting flush to MZ_FINISH. */\n    else if (flush == MZ_FINISH)\n    {\n       /* The output buffer MUST be large to hold the remaining uncompressed data when flush==MZ_FINISH. */\n       if (status == TINFL_STATUS_DONE)\n          return pState->m_dict_avail ? MZ_BUF_ERROR : MZ_STREAM_END;\n       /* status here must be TINFL_STATUS_HAS_MORE_OUTPUT, which means there's at least 1 more byte on the way. If there's no more room left in the output buffer then something is wrong. */\n       else if (!pStream->avail_out)\n          return MZ_BUF_ERROR;\n    }\n    else if ((status == TINFL_STATUS_DONE) || (!pStream->avail_in) || (!pStream->avail_out) || (pState->m_dict_avail))\n      break;\n  }\n\n  return ((status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK;\n}\n\nstatic int mz_inflateEnd(mz_streamp pStream)\n{\n  if (!pStream)\n    return MZ_STREAM_ERROR;\n  if (pStream->state)\n  {\n    pStream->zfree(pStream->opaque, pStream->state);\n    pStream->state = NULL;\n  }\n  return MZ_OK;\n}\n\n/* make this a drop-in replacement for zlib... */\n  #define voidpf void*\n  #define uInt unsigned int\n  #define z_stream              mz_stream\n  #define inflateInit2          mz_inflateInit2\n  #define inflate               mz_inflate\n  #define inflateEnd            mz_inflateEnd\n  #define Z_SYNC_FLUSH          MZ_SYNC_FLUSH\n  #define Z_FINISH              MZ_FINISH\n  #define Z_OK                  MZ_OK\n  #define Z_STREAM_END          MZ_STREAM_END\n  #define Z_NEED_DICT           MZ_NEED_DICT\n  #define Z_ERRNO               MZ_ERRNO\n  #define Z_STREAM_ERROR        MZ_STREAM_ERROR\n  #define Z_DATA_ERROR          MZ_DATA_ERROR\n  #define Z_MEM_ERROR           MZ_MEM_ERROR\n  #define Z_BUF_ERROR           MZ_BUF_ERROR\n  #define Z_VERSION_ERROR       MZ_VERSION_ERROR\n  #define MAX_WBITS             15\n\n#endif /* #ifndef TINFL_HEADER_FILE_ONLY */\n\n/* \n  This is free and unencumbered software released into the public domain.\n\n  Anyone is free to copy, modify, publish, use, compile, sell, or\n  distribute this software, either in source code form or as a compiled\n  binary, for any purpose, commercial or non-commercial, and by any\n  means.\n\n  In jurisdictions that recognize copyright laws, the author or authors\n  of this software dedicate any and all copyright interest in the\n  software to the public domain. We make this dedication for the benefit\n  of the public at large and to the detriment of our heirs and\n  successors. We intend this dedication to be an overt act of\n  relinquishment in perpetuity of all present and future rights to this\n  software under copyright law.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n  OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n  ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n  OTHER DEALINGS IN THE SOFTWARE.\n\n  For more information, please refer to <https://unlicense.org/>\n*/\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_platform_android.c",
    "content": "/*\n * Android support routines for PhysicsFS.\n *\n * Please see the file LICENSE.txt in the source's root directory.\n *\n *  This file written by Ryan C. Gordon.\n */\n\n#define __PHYSICSFS_INTERNAL__\n#include \"physfs_platforms.h\"\n\n#ifdef PHYSFS_PLATFORM_ANDROID\n\n#include <jni.h>\n#include <android/log.h>\n#include \"physfs_internal.h\"\n\nstatic char *prefpath = NULL;\n\n\nint __PHYSFS_platformInit(void)\n{\n    return 1;  /* always succeed. */\n} /* __PHYSFS_platformInit */\n\n\nvoid __PHYSFS_platformDeinit(void)\n{\n    if (prefpath)\n    {\n        allocator.Free(prefpath);\n        prefpath = NULL;\n    } /* if */\n} /* __PHYSFS_platformDeinit */\n\n\nvoid __PHYSFS_platformDetectAvailableCDs(PHYSFS_StringCallback cb, void *data)\n{\n    /* no-op. */\n} /* __PHYSFS_platformDetectAvailableCDs */\n\n\nchar *__PHYSFS_platformCalcBaseDir(const char *argv0)\n{\n    /* as a cheat, we expect argv0 to be a PHYSFS_AndroidInit* on Android. */\n    PHYSFS_AndroidInit *ainit = (PHYSFS_AndroidInit *) argv0;\n    char *retval = NULL;\n    JNIEnv *jenv = NULL;\n    jobject jcontext;\n\n    if (ainit == NULL)\n        return __PHYSFS_strdup(\"/\");  /* oh well. */\n\n    jenv = (JNIEnv *) ainit->jnienv;\n    jcontext = (jobject) ainit->context;\n\n    if ((*jenv)->PushLocalFrame(jenv, 16) >= 0)\n    {\n        jobject jfileobj = 0;\n        jmethodID jmeth = 0;\n        jthrowable jexception = 0;\n        jstring jstr = 0;\n\n        jmeth = (*jenv)->GetMethodID(jenv, (*jenv)->GetObjectClass(jenv, jcontext), \"getPackageResourcePath\", \"()Ljava/lang/String;\");\n        jstr = (jstring)(*jenv)->CallObjectMethod(jenv, jcontext, jmeth);\n        jexception = (*jenv)->ExceptionOccurred(jenv);  /* this can't throw an exception, right? Just in case. */\n        if (jexception != NULL)\n            (*jenv)->ExceptionClear(jenv);\n        else\n        {\n            const char *path = (*jenv)->GetStringUTFChars(jenv, jstr, NULL);\n            retval = __PHYSFS_strdup(path);\n            (*jenv)->ReleaseStringUTFChars(jenv, jstr, path);\n        } /* else */\n\n        /* We only can rely on the Activity being valid during this function call,\n           so go ahead and grab the prefpath too. */\n        jmeth = (*jenv)->GetMethodID(jenv, (*jenv)->GetObjectClass(jenv, jcontext), \"getFilesDir\", \"()Ljava/io/File;\");\n        jfileobj = (*jenv)->CallObjectMethod(jenv, jcontext, jmeth);\n        if (jfileobj)\n        {\n            jmeth = (*jenv)->GetMethodID(jenv, (*jenv)->GetObjectClass(jenv, jfileobj), \"getCanonicalPath\", \"()Ljava/lang/String;\");\n            jstr = (jstring)(*jenv)->CallObjectMethod(jenv, jfileobj, jmeth);\n            jexception = (*jenv)->ExceptionOccurred(jenv);\n            if (jexception != NULL)\n                (*jenv)->ExceptionClear(jenv);\n            else\n            {\n                const char *path = (*jenv)->GetStringUTFChars(jenv, jstr, NULL);\n                const size_t len = strlen(path) + 2;\n                prefpath = allocator.Malloc(len);\n                if (prefpath)\n                    snprintf(prefpath, len, \"%s/\", path);\n                (*jenv)->ReleaseStringUTFChars(jenv, jstr, path);\n            } /* else */\n        } /* if */\n\n        (*jenv)->PopLocalFrame(jenv, NULL);\n    } /* if */\n\n    /* we can't return NULL because then PhysicsFS will treat argv0 as a string, but it's a non-NULL jobject! */\n    if (retval == NULL)\n        retval = __PHYSFS_strdup(\"/\");   /* we pray this works. */\n\n    return retval;\n} /* __PHYSFS_platformCalcBaseDir */\n\n\nchar *__PHYSFS_platformCalcPrefDir(const char *org, const char *app)\n{\n    return __PHYSFS_strdup(prefpath ? prefpath : \"/\");\n} /* __PHYSFS_platformCalcPrefDir */\n\n#endif /* PHYSFS_PLATFORM_ANDROID */\n\n/* end of physfs_platform_android.c ... */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_platform_apple.m",
    "content": "/*\n * Apple platform (macOS, iOS, watchOS, etc) support routines for PhysicsFS.\n *\n * Please see the file LICENSE.txt in the source's root directory.\n *\n *  This file written by Ryan C. Gordon.\n */\n\n#define __PHYSICSFS_INTERNAL__\n#include \"physfs_platforms.h\"\n\n#ifdef PHYSFS_PLATFORM_APPLE\n\n#include <Foundation/Foundation.h>\n#include <dlfcn.h>\n\n#include \"physfs_internal.h\"\n\nint __PHYSFS_platformInit(void)\n{\n    return 1;  /* success. */\n} /* __PHYSFS_platformInit */\n\n\nvoid __PHYSFS_platformDeinit(void)\n{\n    /* no-op */\n} /* __PHYSFS_platformDeinit */\n\n\nchar *__PHYSFS_platformCalcBaseDir(const char *argv0)\n{\n    @autoreleasepool\n    {\n        NSString *path = [[NSBundle mainBundle] bundlePath];\n        BAIL_IF(!path, PHYSFS_ERR_OS_ERROR, NULL);\n        size_t len = [path lengthOfBytesUsingEncoding:NSUTF8StringEncoding];\n        char *retval = (char *) allocator.Malloc(len + 2);\n        BAIL_IF(!retval, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n        [path getCString:retval maxLength:len+1 encoding:NSUTF8StringEncoding];\n        retval[len] = '/';\n        retval[len+1] = '\\0';\n        return retval;  /* whew. */\n    } /* @autoreleasepool */\n} /* __PHYSFS_platformCalcBaseDir */\n\n\nchar *__PHYSFS_platformCalcPrefDir(const char *org, const char *app)\n{\n    @autoreleasepool\n    {\n        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, TRUE);\n        BAIL_IF(!paths, PHYSFS_ERR_OS_ERROR, NULL);\n        NSString *path = (NSString *) [paths objectAtIndex:0];\n        BAIL_IF(!path, PHYSFS_ERR_OS_ERROR, NULL);\n        size_t len = [path lengthOfBytesUsingEncoding:NSUTF8StringEncoding];\n        const size_t applen = strlen(app);\n        char *retval = (char *) allocator.Malloc(len + applen + 3);\n        BAIL_IF(!retval, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n        [path getCString:retval maxLength:len+1 encoding:NSUTF8StringEncoding];\n        snprintf(retval + len, applen + 3, \"/%s/\", app);\n        return retval;  /* whew. */\n    } /* @autoreleasepool */\n} /* __PHYSFS_platformCalcPrefDir */\n\n\n/* CD-ROM detection code... */\n\n/*\n * Code based on sample from Apple Developer Connection:\n *  https://developer.apple.com/samplecode/Sample_Code/Devices_and_Hardware/Disks/VolumeToBSDNode/VolumeToBSDNode.c.htm\n */\n\n#if !defined(PHYSFS_NO_CDROM_SUPPORT)\n\n#include <IOKit/IOKitLib.h>\n#include <IOKit/storage/IOMedia.h>\n#include <IOKit/storage/IOCDMedia.h>\n#include <IOKit/storage/IODVDMedia.h>\n#include <sys/mount.h>\n\nstatic int darwinIsWholeMedia(io_service_t service)\n{\n    int retval = 0;\n    CFTypeRef wholeMedia;\n\n    if (!IOObjectConformsTo(service, kIOMediaClass))\n        return 0;\n        \n    wholeMedia = IORegistryEntryCreateCFProperty(service,\n                                                 CFSTR(kIOMediaWholeKey),\n                                                 NULL, 0);\n    if (wholeMedia == NULL)\n        return 0;\n\n    retval = CFBooleanGetValue(wholeMedia);\n    CFRelease(wholeMedia);\n\n    return retval;\n} /* darwinIsWholeMedia */\n\n\nstatic int darwinIsMountedDisc(char *bsdName, mach_port_t mainPort)\n{\n    int retval = 0;\n    CFMutableDictionaryRef matchingDict;\n    kern_return_t rc;\n    io_iterator_t iter;\n    io_service_t service;\n\n    if ((matchingDict = IOBSDNameMatching(mainPort, 0, bsdName)) == NULL)\n        return 0;\n\n    rc = IOServiceGetMatchingServices(mainPort, matchingDict, &iter);\n    if ((rc != KERN_SUCCESS) || (!iter))\n        return 0;\n\n    service = IOIteratorNext(iter);\n    IOObjectRelease(iter);\n    if (!service)\n        return 0;\n\n    rc = IORegistryEntryCreateIterator(service, kIOServicePlane,\n             kIORegistryIterateRecursively | kIORegistryIterateParents, &iter);\n    \n    if (!iter)\n        return 0;\n\n    if (rc != KERN_SUCCESS)\n    {\n        IOObjectRelease(iter);\n        return 0;\n    } /* if */\n\n    IOObjectRetain(service);  /* add an extra object reference... */\n\n    do\n    {\n        if (darwinIsWholeMedia(service))\n        {\n            if ( (IOObjectConformsTo(service, kIOCDMediaClass)) ||\n                 (IOObjectConformsTo(service, kIODVDMediaClass)) )\n            {\n                retval = 1;\n            } /* if */\n        } /* if */\n        IOObjectRelease(service);\n    } while ((service = IOIteratorNext(iter)) && (!retval));\n                \n    IOObjectRelease(iter);\n    IOObjectRelease(service);\n\n    return retval;\n} /* darwinIsMountedDisc */\n\n#endif /* !defined(PHYSFS_NO_CDROM_SUPPORT) */\n\n\nvoid __PHYSFS_platformDetectAvailableCDs(PHYSFS_StringCallback cb, void *data)\n{\n#if !defined(PHYSFS_NO_CDROM_SUPPORT)\n    /* macOS 12.0 changed \"master\" names to \"main\". */\n    typedef kern_return_t (*ioMainPortFn)(mach_port_t, mach_port_t *);\n    static ioMainPortFn ioMainPort = NULL;\n    const char *devPrefix = \"/dev/\";\n    const int prefixLen = strlen(devPrefix);\n    mach_port_t mainPort = 0;\n    struct statfs *mntbufp;\n    int i, mounts;\n\n    if (ioMainPort == NULL)\n    {\n        ioMainPort = (ioMainPortFn) dlsym(RTLD_DEFAULT, \"IOMainPort\");\n        if (!ioMainPort)\n            ioMainPort = (ioMainPortFn) dlsym(RTLD_DEFAULT, \"IOMasterPort\");\n        if (!ioMainPort)\n            return; /* oh well, no CD-ROMs for you. */\n    } /* if */\n\n    if (ioMainPort(MACH_PORT_NULL, &mainPort) != KERN_SUCCESS)\n        BAIL(PHYSFS_ERR_OS_ERROR, ) /*return void*/;\n\n    mounts = getmntinfo(&mntbufp, MNT_WAIT);  /* NOT THREAD SAFE! */\n    for (i = 0; i < mounts; i++)\n    {\n        char *dev = mntbufp[i].f_mntfromname;\n        char *mnt = mntbufp[i].f_mntonname;\n        if (strncmp(dev, devPrefix, prefixLen) != 0)  /* a virtual device? */\n            continue;\n\n        dev += prefixLen;\n        if (darwinIsMountedDisc(dev, mainPort))\n            cb(data, mnt);\n    } /* for */\n#endif /* !defined(PHYSFS_NO_CDROM_SUPPORT) */\n} /* __PHYSFS_platformDetectAvailableCDs */\n\n#endif /* PHYSFS_PLATFORM_APPLE */\n\n/* end of physfs_platform_apple.m ... */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_platform_haiku.cpp",
    "content": "/*\n * Haiku platform-dependent support routines for PhysicsFS.\n *\n * Please see the file LICENSE.txt in the source's root directory.\n *\n *  This file written by Ryan C. Gordon.\n */\n\n#define __PHYSICSFS_INTERNAL__\n#include \"physfs_platforms.h\"\n\n#ifdef PHYSFS_PLATFORM_HAIKU\n\n#include <os/kernel/OS.h>\n#include <os/app/Roster.h>\n#include <os/storage/Volume.h>\n#include <os/storage/VolumeRoster.h>\n#include <os/storage/Directory.h>\n#include <os/storage/Entry.h>\n#include <os/storage/Path.h>\n#include <os/kernel/fs_info.h>\n#include <os/device/scsi.h>\n\n#include <errno.h>\n#include <unistd.h>\n\n#include \"physfs_internal.h\"\n\nint __PHYSFS_platformInit(void)\n{\n    return 1;  /* always succeed. */\n} /* __PHYSFS_platformInit */\n\n\nvoid __PHYSFS_platformDeinit(void)\n{\n    /* no-op */\n} /* __PHYSFS_platformDeinit */\n\n\nstatic char *getMountPoint(const char *devname, char *buf, size_t bufsize)\n{\n    BVolumeRoster mounts;\n    BVolume vol;\n\n    mounts.Rewind();\n    while (mounts.GetNextVolume(&vol) == B_NO_ERROR)\n    {\n        fs_info fsinfo;\n        fs_stat_dev(vol.Device(), &fsinfo);\n        if (strcmp(devname, fsinfo.device_name) == 0)\n        {\n            BDirectory directory;\n            BEntry entry;\n            BPath path;\n            const char *str;\n\n            if ( (vol.GetRootDirectory(&directory) < B_OK) ||\n                 (directory.GetEntry(&entry) < B_OK) ||\n                 (entry.GetPath(&path) < B_OK) ||\n                 ( (str = path.Path()) == NULL) )\n                return NULL;\n\n            strncpy(buf, str, bufsize-1);\n            buf[bufsize-1] = '\\0';\n            return buf;\n        } /* if */\n    } /* while */\n\n    return NULL;\n} /* getMountPoint */\n\n\n    /*\n     * This function is lifted from Simple Directmedia Layer (SDL):\n     *  https://www.libsdl.org/  ... this is zlib-licensed code, too.\n     */\nstatic void tryDir(const char *d, PHYSFS_StringCallback callback, void *data)\n{\n    BDirectory dir;\n    dir.SetTo(d);\n    if (dir.InitCheck() != B_NO_ERROR)\n        return;\n\n    dir.Rewind();\n    BEntry entry;\n    while (dir.GetNextEntry(&entry) >= 0)\n    {\n        BPath path;\n        const char *name;\n        entry_ref e;\n\n        if (entry.GetPath(&path) != B_NO_ERROR)\n            continue;\n\n        name = path.Path();\n\n        if (entry.GetRef(&e) != B_NO_ERROR)\n            continue;\n\n        if (entry.IsDirectory())\n        {\n            if (strcmp(e.name, \"floppy\") != 0)\n                tryDir(name, callback, data);\n            continue;\n        } /* if */\n\n        const int devfd = open(name, O_RDONLY);\n        if (devfd < 0)\n            continue;\n\n        device_geometry g;\n        const int rc = ioctl(devfd, B_GET_GEOMETRY, &g, sizeof (g));\n        close(devfd);\n        if (rc < 0)\n            continue;\n\n        if (g.device_type != B_CD)\n            continue;\n\n        char mntpnt[B_FILE_NAME_LENGTH];\n        if (getMountPoint(name, mntpnt, sizeof (mntpnt)))\n            callback(data, mntpnt);\n    } /* while */\n} /* tryDir */\n\n\nvoid __PHYSFS_platformDetectAvailableCDs(PHYSFS_StringCallback cb, void *data)\n{\n    tryDir(\"/dev/disk\", cb, data);\n} /* __PHYSFS_platformDetectAvailableCDs */\n\n\nstatic team_id getTeamID(void)\n{\n    thread_info info;\n    thread_id tid = find_thread(NULL);\n    get_thread_info(tid, &info);\n    return info.team;\n} /* getTeamID */\n\n\nchar *__PHYSFS_platformCalcBaseDir(const char *argv0)\n{\n    image_info info;\n    int32 cookie = 0;\n\n    while (get_next_image_info(0, &cookie, &info) == B_OK)\n    {\n        if (info.type == B_APP_IMAGE)\n            break;\n    } /* while */\n\n    BEntry entry(info.name, true);\n    BPath path;\n    status_t rc = entry.GetPath(&path);  /* (path) now has binary's path. */\n    assert(rc == B_OK);\n    rc = path.GetParent(&path); /* chop filename, keep directory. */\n    assert(rc == B_OK);\n    const char *str = path.Path();\n    assert(str != NULL);\n    const size_t len = strlen(str);\n    char *retval = (char *) allocator.Malloc(len + 2);\n    BAIL_IF(!retval, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n    strcpy(retval, str);\n    retval[len] = '/';\n    retval[len+1] = '\\0';\n    return retval;\n} /* __PHYSFS_platformCalcBaseDir */\n\n\nchar *__PHYSFS_platformCalcPrefDir(const char *org, const char *app)\n{\n    const char *userdir = __PHYSFS_getUserDir();\n    const char *append = \"config/settings/\";\n    const size_t len = strlen(userdir) + strlen(append) + strlen(app) + 2;\n    char *retval = (char *) allocator.Malloc(len);\n    BAIL_IF(!retval, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n    snprintf(retval, len, \"%s%s%s/\", userdir, append, app);\n    return retval;\n} /* __PHYSFS_platformCalcPrefDir */\n\n#endif  /* PHYSFS_PLATFORM_HAIKU */\n\n/* end of physfs_platform_haiku.cpp ... */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_platform_os2.c",
    "content": "/*\n * OS/2 support routines for PhysicsFS.\n *\n * Please see the file LICENSE.txt in the source's root directory.\n *\n *  This file written by Ryan C. Gordon.\n */\n\n#define __PHYSICSFS_INTERNAL__\n#include \"physfs_platforms.h\"\n\n#ifdef PHYSFS_PLATFORM_OS2\n\n#define INCL_DOSMODULEMGR\n#define INCL_DOSSEMAPHORES\n#define INCL_DOSDATETIME\n#define INCL_DOSFILEMGR\n#define INCL_DOSMODULEMGR\n#define INCL_DOSERRORS\n#define INCL_DOSPROCESS\n#define INCL_DOSDEVICES\n#define INCL_DOSDEVIOCTL\n#define INCL_DOSMISC\n#include <os2.h>\n#include <uconv.h>\n\n#include <errno.h>\n#include <time.h>\n#include <ctype.h>\n\n#include \"physfs_internal.h\"\n\nstatic HMODULE uconvdll = 0;\nstatic UconvObject uconv = 0;\nstatic int (_System *pUniCreateUconvObject)(UniChar *, UconvObject *) = NULL;\nstatic int (_System *pUniFreeUconvObject)(UconvObject *) = NULL;\nstatic int (_System *pUniUconvToUcs)(UconvObject,void **,size_t *, UniChar**, size_t *, size_t *) = NULL;\nstatic int (_System *pUniUconvFromUcs)(UconvObject,UniChar **,size_t *,void **,size_t *,size_t *) = NULL;\n\nstatic PHYSFS_ErrorCode errcodeFromAPIRET(const APIRET rc)\n{\n    switch (rc)\n    {\n        case NO_ERROR: return PHYSFS_ERR_OK;  /* not an error. */\n        case ERROR_INTERRUPT: return PHYSFS_ERR_OK;  /* not an error. */\n        case ERROR_TIMEOUT: return PHYSFS_ERR_OK;  /* not an error. */\n        case ERROR_NOT_ENOUGH_MEMORY: return PHYSFS_ERR_OUT_OF_MEMORY;\n        case ERROR_FILE_NOT_FOUND: return PHYSFS_ERR_NOT_FOUND;\n        case ERROR_PATH_NOT_FOUND: return PHYSFS_ERR_NOT_FOUND;\n        case ERROR_ACCESS_DENIED: return PHYSFS_ERR_PERMISSION;\n        case ERROR_NOT_DOS_DISK: return PHYSFS_ERR_NOT_FOUND;\n        case ERROR_SHARING_VIOLATION: return PHYSFS_ERR_PERMISSION;\n        case ERROR_CANNOT_MAKE: return PHYSFS_ERR_IO;  /* maybe this is wrong? */\n        case ERROR_DEVICE_IN_USE: return PHYSFS_ERR_BUSY;\n        case ERROR_OPEN_FAILED: return PHYSFS_ERR_IO;  /* maybe this is wrong? */\n        case ERROR_DISK_FULL: return PHYSFS_ERR_NO_SPACE;\n        case ERROR_PIPE_BUSY: return PHYSFS_ERR_BUSY;\n        case ERROR_SHARING_BUFFER_EXCEEDED: return PHYSFS_ERR_IO;\n        case ERROR_FILENAME_EXCED_RANGE: return PHYSFS_ERR_BAD_FILENAME;\n        case ERROR_META_EXPANSION_TOO_LONG: return PHYSFS_ERR_BAD_FILENAME;\n        case ERROR_TOO_MANY_HANDLES: return PHYSFS_ERR_IO;\n        case ERROR_TOO_MANY_OPEN_FILES: return PHYSFS_ERR_IO;\n        case ERROR_NO_MORE_SEARCH_HANDLES: return PHYSFS_ERR_IO;\n        case ERROR_SEEK_ON_DEVICE: return PHYSFS_ERR_IO;\n        case ERROR_NEGATIVE_SEEK: return PHYSFS_ERR_INVALID_ARGUMENT;\n        case ERROR_WRITE_PROTECT: return PHYSFS_ERR_PERMISSION;\n        case ERROR_WRITE_FAULT: return PHYSFS_ERR_IO;\n        case ERROR_UNCERTAIN_MEDIA: return PHYSFS_ERR_IO;\n        case ERROR_PROTECTION_VIOLATION: return PHYSFS_ERR_IO;\n        case ERROR_BROKEN_PIPE: return PHYSFS_ERR_IO;\n\n        /* !!! FIXME: some of these might be PHYSFS_ERR_BAD_FILENAME, etc */\n        case ERROR_LOCK_VIOLATION:\n        case ERROR_GEN_FAILURE:\n        case ERROR_INVALID_PARAMETER:\n        case ERROR_INVALID_NAME:\n        case ERROR_INVALID_DRIVE:\n        case ERROR_INVALID_HANDLE:\n        case ERROR_INVALID_FUNCTION:\n        case ERROR_INVALID_LEVEL:\n        case ERROR_INVALID_CATEGORY:\n        case ERROR_DUPLICATE_NAME:\n        case ERROR_BUFFER_OVERFLOW:\n        case ERROR_BAD_LENGTH:\n        case ERROR_BAD_DRIVER_LEVEL:\n        case ERROR_DIRECT_ACCESS_HANDLE:\n        case ERROR_NOT_OWNER:\n            return PHYSFS_ERR_OS_ERROR;\n\n        default: break;\n    } /* switch */\n\n    return PHYSFS_ERR_OTHER_ERROR;\n} /* errcodeFromAPIRET */\n\nstatic char *cvtUtf8ToCodepage(const char *utf8str)\n{\n    const size_t len = strlen(utf8str) + 1;\n    const size_t uc2buflen = len * sizeof (UniChar);\n    UniChar *uc2ptr = (UniChar *) __PHYSFS_smallAlloc(uc2buflen);\n    UniChar *uc2str = uc2ptr;\n    char *cpptr = NULL;\n    char *cpstr = NULL;\n    size_t subs = 0;\n    size_t unilen;\n\n    BAIL_IF(!uc2str, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n    PHYSFS_utf8ToUcs2(utf8str, (PHYSFS_uint16 *) uc2str, uc2buflen);\n    for (unilen = 0; uc2str[unilen]; unilen++) { /* spin */ }\n    unilen++;  /* null terminator. */\n\n    if (!uconvdll)\n    {\n        /* There's really not much we can do on older OS/2s except pray this\n           is latin1-compatible. */\n        size_t i;\n        cpptr = (char *) allocator.Malloc(unilen);\n        cpstr = cpptr;\n        GOTO_IF(!cpptr, PHYSFS_ERR_OUT_OF_MEMORY, failed);\n        for (i = 0; i < unilen; i++)\n        {\n            const UniChar ch = uc2str[i];\n            GOTO_IF(ch > 0xFF, PHYSFS_ERR_BAD_FILENAME, failed);\n            cpptr[i] = (char) ((unsigned char) ch);\n        } /* for */\n\n        __PHYSFS_smallFree(uc2ptr);\n        return cpstr;\n    } /* if */\n    else\n    {\n        int rc;\n        size_t cplen = unilen * 4; /* overallocate, just in case. */\n        cpptr = (char *) allocator.Malloc(cplen);\n        GOTO_IF(!cpptr, PHYSFS_ERR_OUT_OF_MEMORY, failed);\n        cpstr = cpptr;\n\n        rc = pUniUconvFromUcs(uconv, &uc2str, &unilen, (void **) &cpstr, &cplen, &subs);\n        GOTO_IF(rc != ULS_SUCCESS, PHYSFS_ERR_BAD_FILENAME, failed);\n        GOTO_IF(subs > 0, PHYSFS_ERR_BAD_FILENAME, failed);\n        assert(unilen == 0);\n\n        __PHYSFS_smallFree(uc2ptr);\n        return cpptr;\n    } /* else */\n\nfailed:\n    __PHYSFS_smallFree(uc2ptr);\n    allocator.Free(cpptr);\n\n    return NULL;\n} /* cvtUtf8ToCodepage */\n\nstatic char *cvtCodepageToUtf8(const char *cpstr)\n{\n    const size_t len = strlen(cpstr) + 1;\n    char *retvalbuf = (char *) allocator.Malloc(len * 4);\n    char *retval = NULL;\n\n    BAIL_IF(!retvalbuf, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n\n    if (!uconvdll)\n    {\n        /* There's really not much we can do on older OS/2s except pray this\n           is latin1-compatible. */\n        retval = retvalbuf;\n        PHYSFS_utf8FromLatin1(cpstr, retval, len * 4);\n    } /* if */\n    else\n    {\n        int rc;\n        size_t cplen = len;\n        size_t unilen = len;\n        size_t subs = 0;\n        UniChar *uc2ptr = __PHYSFS_smallAlloc(len * sizeof (UniChar));\n        UniChar *uc2str = uc2ptr;\n\n        BAIL_IF(!uc2ptr, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n        rc = pUniUconvToUcs(uconv, (void **) &cpstr, &cplen, &uc2str, &unilen, &subs);\n        GOTO_IF(rc != ULS_SUCCESS, PHYSFS_ERR_BAD_FILENAME, done);\n        GOTO_IF(subs > 0, PHYSFS_ERR_BAD_FILENAME, done);\n        assert(cplen == 0);\n        retval = retvalbuf;\n        PHYSFS_utf8FromUcs2((const PHYSFS_uint16 *) uc2ptr, retval, len * 4);\n        done:\n        __PHYSFS_smallFree(uc2ptr);\n    } /* else */\n\n    return retval;\n} /* cvtCodepageToUtf8 */\n\n\n/* (be gentle, this function isn't very robust.) */\nstatic char *cvtPathToCorrectCase(char *buf)\n{\n    char *retval = buf;\n    char *fname = buf + 3;            /* point to first element. */\n    char *ptr = strchr(fname, '\\\\');  /* find end of first element. */\n\n    buf[0] = toupper(buf[0]);  /* capitalize drive letter. */\n\n    /*\n     * Go through each path element, and enumerate its parent dir until\n     *  a case-insensitive match is found. If one is (and it SHOULD be)\n     *  then overwrite the original element with the correct case.\n     * If there's an error, or the path has vanished for some reason, it\n     *  won't hurt to have the original case, so we just keep going.\n     */\n    while ((fname != NULL) && (*fname != '\\0'))\n    {\n        char spec[CCHMAXPATH];\n        FILEFINDBUF3 fb;\n        HDIR hdir = HDIR_CREATE;\n        ULONG count = 1;\n        APIRET rc;\n\n        *(fname - 1) = '\\0';  /* isolate parent dir string. */\n\n        strcpy(spec, buf);      /* copy isolated parent dir... */\n        strcat(spec, \"\\\\*.*\");  /*  ...and add wildcard search spec. */\n\n        if (ptr != NULL)  /* isolate element to find (fname is the start). */\n            *ptr = '\\0';\n\n        rc = DosFindFirst(spec, &hdir, FILE_DIRECTORY,\n                          &fb, sizeof (fb), &count, FIL_STANDARD);\n        if (rc == NO_ERROR)\n        {\n            while (count == 1)  /* while still entries to enumerate... */\n            {\n                int cmp;\n                char *utf8 = cvtCodepageToUtf8(fb.achName);\n                if (!utf8) /* ugh, maybe we'll get lucky with the C runtime. */\n                    cmp = stricmp(fb.achName, fname);\n                else\n                {\n                    cmp = PHYSFS_utf8stricmp(utf8, fname);\n                    allocator.Free(utf8);\n                } /* else */\n\n                if (cmp == 0)\n                {\n                    strcpy(fname, fb.achName);\n                    break;  /* there it is. Overwrite and stop searching. */\n                } /* if */\n\n                DosFindNext(hdir, &fb, sizeof (fb), &count);\n            } /* while */\n            DosFindClose(hdir);\n        } /* if */\n\n        *(fname - 1) = '\\\\';   /* unisolate parent dir. */\n        fname = ptr;           /* point to next element. */\n        if (ptr != NULL)\n        {\n            *ptr = '\\\\';       /* unisolate element. */\n            ptr = strchr(++fname, '\\\\');  /* find next element. */\n        } /* if */\n    } /* while */\n\n    return retval;\n} /* cvtPathToCorrectCase */\n\nstatic void prepUnicodeSupport(void)\n{\n    /* really old OS/2 might not have Unicode support _at all_, so load\n       the system library and do without if it doesn't exist. */\n    int ok = 0;                                                   \n    char buf[CCHMAXPATH];\n    UniChar defstr[] = { 0 };\n    if (DosLoadModule(buf, sizeof (buf) - 1, \"uconv\", &uconvdll) == NO_ERROR)\n    {\n        #define LOAD(x) (DosQueryProcAddr(uconvdll,0,#x,(PFN*)&p##x)==NO_ERROR)\n        ok = LOAD(UniCreateUconvObject) &&\n             LOAD(UniFreeUconvObject) &&\n             LOAD(UniUconvToUcs) &&\n             LOAD(UniUconvFromUcs);\n        #undef LOAD\n    } /* else */\n\n    if (!ok || (pUniCreateUconvObject(defstr, &uconv) != ULS_SUCCESS))\n    {\n        /* oh well, live without it. */\n        if (uconvdll)\n        {\n            if (uconv)\n                pUniFreeUconvObject(uconv);\n            DosFreeModule(uconvdll);\n            uconvdll = 0;\n        } /* if */\n    } /* if */\n} /* prepUnicodeSupport */\n\n\nint __PHYSFS_platformInit(void)\n{\n    prepUnicodeSupport();\n    return 1;  /* ready to go! */\n} /* __PHYSFS_platformInit */\n\n\nvoid __PHYSFS_platformDeinit(void)\n{\n    if (uconvdll)\n    {\n        pUniFreeUconvObject(uconv);\n        uconv = 0;\n        DosFreeModule(uconvdll);\n        uconvdll = 0;\n    } /* if */\n} /* __PHYSFS_platformDeinit */\n\n\nstatic int discIsInserted(ULONG drive)\n{\n    int rc;\n    char buf[20];\n    DosError(FERR_DISABLEHARDERR | FERR_DISABLEEXCEPTION);\n    rc = DosQueryFSInfo(drive + 1, FSIL_VOLSER, buf, sizeof (buf));\n    DosError(FERR_ENABLEHARDERR | FERR_ENABLEEXCEPTION);\n    return (rc == NO_ERROR);\n} /* is_cdrom_inserted */\n\n\n/* looks like \"CD01\" in ASCII (littleendian)...used for an ioctl. */\n#define CD01 0x31304443\n\nstatic int isCdRomDrive(ULONG drive)\n{\n    PHYSFS_uint32 param, data;\n    ULONG ul1, ul2;\n    APIRET rc;\n    HFILE hfile = NULLHANDLE;\n    char drivename[3] = { 0, ':', '\\0' };\n\n    drivename[0] = 'A' + drive;\n\n    rc = DosOpen(drivename, &hfile, &ul1, 0, 0,\n                 OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_FAIL_IF_NEW,\n                 OPEN_FLAGS_DASD | OPEN_FLAGS_FAIL_ON_ERROR |\n                 OPEN_FLAGS_NOINHERIT | OPEN_SHARE_DENYNONE, NULL);\n    if (rc != NO_ERROR)\n        return 0;\n\n    data = 0;\n    param = PHYSFS_swapULE32(CD01);\n    ul1 = ul2 = sizeof (PHYSFS_uint32);\n    rc = DosDevIOCtl(hfile, IOCTL_CDROMDISK, CDROMDISK_GETDRIVER,\n                     &param, sizeof (param), &ul1, &data, sizeof (data), &ul2);\n\n    DosClose(hfile);\n    return ((rc == NO_ERROR) && (PHYSFS_swapULE32(data) == CD01));\n} /* isCdRomDrive */\n\n\nvoid __PHYSFS_platformDetectAvailableCDs(PHYSFS_StringCallback cb, void *data)\n{\n    ULONG dummy = 0;\n    ULONG drivemap = 0;\n    ULONG i, bit;\n    const APIRET rc = DosQueryCurrentDisk(&dummy, &drivemap);\n    BAIL_IF(rc != NO_ERROR, errcodeFromAPIRET(rc),);\n\n    for (i = 0, bit = 1; i < 26; i++, bit <<= 1)\n    {\n        if (drivemap & bit)  /* this logical drive exists. */\n        {\n            if ((isCdRomDrive(i)) && (discIsInserted(i)))\n            {\n                char drive[4] = \"x:\\\\\";\n                drive[0] = ('A' + i);\n                cb(data, drive);\n            } /* if */\n        } /* if */\n    } /* for */\n} /* __PHYSFS_platformDetectAvailableCDs */\n\n\nchar *__PHYSFS_platformCalcBaseDir(const char *argv0)\n{\n    char *retval = NULL;\n    char buf[CCHMAXPATH];\n    APIRET rc;\n    PTIB ptib;\n    PPIB ppib;\n    PHYSFS_sint32 len;\n\n    rc = DosGetInfoBlocks(&ptib, &ppib);\n    BAIL_IF(rc != NO_ERROR, errcodeFromAPIRET(rc), 0);\n    rc = DosQueryModuleName(ppib->pib_hmte, sizeof (buf), (PCHAR) buf);\n    BAIL_IF(rc != NO_ERROR, errcodeFromAPIRET(rc), 0);\n    retval = cvtCodepageToUtf8(buf);\n    BAIL_IF_ERRPASS(!retval, NULL);\n\n    /* chop off filename, leave path. */\n    for (len = strlen(retval) - 1; len >= 0; len--)\n    {\n        if (retval[len] == '\\\\')\n        {\n            retval[len + 1] = '\\0';\n            break;\n        } /* if */\n    } /* for */\n\n    assert(len > 0);  /* should have been a \"x:\\\\\" on the front on string. */\n\n    /* The string is capitalized! Figure out the REAL case... */\n    return cvtPathToCorrectCase(retval);\n} /* __PHYSFS_platformCalcBaseDir */\n\nchar *__PHYSFS_platformCalcUserDir(void)\n{\n    return __PHYSFS_platformCalcBaseDir(NULL);  /* !!! FIXME: ? */\n} /* __PHYSFS_platformCalcUserDir */\n\nchar *__PHYSFS_platformCalcPrefDir(const char *org, const char *app)\n{\n    return __PHYSFS_platformCalcBaseDir(NULL);  /* !!! FIXME: ? */\n} /* __PHYSFS_platformCalcPrefDir */\n\nPHYSFS_EnumerateCallbackResult __PHYSFS_platformEnumerate(const char *dirname,\n                               PHYSFS_EnumerateCallback callback,\n                               const char *origdir, void *callbackdata)\n{                                        \n    PHYSFS_EnumerateCallbackResult retval = PHYSFS_ENUM_OK;\n    size_t utf8len = strlen(dirname);\n    char *utf8 = (char *) __PHYSFS_smallAlloc(utf8len + 5);\n    char *cpspec = NULL;\n    FILEFINDBUF3 fb;\n    HDIR hdir = HDIR_CREATE;\n    ULONG count = 1;\n    APIRET rc;\n\n    BAIL_IF(!utf8, PHYSFS_ERR_OUT_OF_MEMORY, PHYSFS_ENUM_ERROR);\n\n    strcpy(utf8, dirname);\n    if (utf8[utf8len - 1] != '\\\\')\n        strcpy(utf8 + utf8len, \"\\\\*.*\");\n    else\n        strcpy(utf8 + utf8len, \"*.*\");\n\n    cpspec = cvtUtf8ToCodepage(utf8);\n    __PHYSFS_smallFree(utf8);\n    BAIL_IF_ERRPASS(!cpspec, PHYSFS_ENUM_ERROR);\n\n    rc = DosFindFirst(cpspec, &hdir,\n                      FILE_DIRECTORY | FILE_ARCHIVED |\n                      FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM,\n                      &fb, sizeof (fb), &count, FIL_STANDARD);\n    allocator.Free(cpspec);\n\n    BAIL_IF(rc != NO_ERROR, errcodeFromAPIRET(rc), PHYSFS_ENUM_ERROR);\n\n    while (count == 1)\n    {\n        if ((strcmp(fb.achName, \".\") != 0) && (strcmp(fb.achName, \"..\") != 0))\n        {\n            utf8 = cvtCodepageToUtf8(fb.achName);\n            if (!utf8)\n                retval = PHYSFS_ENUM_ERROR;\n            else\n            {\n                retval = callback(callbackdata, origdir, utf8);\n                allocator.Free(utf8);\n                if (retval == PHYSFS_ENUM_ERROR)\n                    PHYSFS_setErrorCode(PHYSFS_ERR_APP_CALLBACK);\n            } /* else */\n        } /* if */\n\n        if (retval != PHYSFS_ENUM_OK)\n            break;\n\n        DosFindNext(hdir, &fb, sizeof (fb), &count);\n    } /* while */\n\n    DosFindClose(hdir);\n\n    return retval;\n} /* __PHYSFS_platformEnumerate */\n\n\nchar *__PHYSFS_platformCurrentDir(void)\n{\n    char *retval;\n    char *cpstr;\n    char *utf8;\n    ULONG currentDisk;\n    ULONG dummy;\n    ULONG pathSize = 0;\n    APIRET rc;\n    BYTE byte;\n\n    rc = DosQueryCurrentDisk(&currentDisk, &dummy);\n    BAIL_IF(rc != NO_ERROR, errcodeFromAPIRET(rc), NULL);\n\n    /* The first call just tells us how much space we need for the string. */\n    rc = DosQueryCurrentDir(currentDisk, &byte, &pathSize);\n    pathSize++; /* Add space for null terminator. */\n    cpstr = (char *) __PHYSFS_smallAlloc(pathSize);\n    BAIL_IF(cpstr == NULL, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n\n    /* Actually get the string this time. */\n    rc = DosQueryCurrentDir(currentDisk, (PBYTE) cpstr, &pathSize);\n    if (rc != NO_ERROR)\n    {\n        __PHYSFS_smallFree(cpstr);\n        BAIL(errcodeFromAPIRET(rc), NULL);\n    } /* if */\n\n    utf8 = cvtCodepageToUtf8(cpstr);\n    __PHYSFS_smallFree(cpstr);\n    BAIL_IF_ERRPASS(utf8 == NULL, NULL);\n\n    /* +4 for \"x:\\\\\" drive selector and null terminator. */\n    retval = (char *) allocator.Malloc(strlen(utf8) + 4);\n    if (retval == NULL)\n    {\n        allocator.Free(utf8);\n        BAIL(PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n    } /* if */\n\n    retval[0] = ('A' + (currentDisk - 1));\n    retval[1] = ':';\n    retval[2] = '\\\\';\n    strcpy(retval + 3, utf8);\n\n    allocator.Free(utf8);\n\n    return retval;\n} /* __PHYSFS_platformCurrentDir */\n\n\nint __PHYSFS_platformMkDir(const char *filename)\n{\n    APIRET rc;\n    char *cpstr = cvtUtf8ToCodepage(filename);\n    BAIL_IF_ERRPASS(!cpstr, 0);\n    rc = DosCreateDir(cpstr, NULL);\n    allocator.Free(cpstr);\n    BAIL_IF(rc != NO_ERROR, errcodeFromAPIRET(rc), 0);\n    return 1;\n} /* __PHYSFS_platformMkDir */\n\n\nstatic HFILE openFile(const char *filename, const ULONG flags, const ULONG mode)\n{\n    char *cpfname = cvtUtf8ToCodepage(filename);\n    ULONG action = 0;\n    HFILE hfile = NULLHANDLE;\n    APIRET rc;\n\n    BAIL_IF_ERRPASS(!cpfname, 0);\n\n    rc = DosOpen(cpfname, &hfile, &action, 0, FILE_NORMAL, flags, mode, NULL);\n    allocator.Free(cpfname);\n    BAIL_IF(rc != NO_ERROR, errcodeFromAPIRET(rc), 0);\n\n    return hfile;\n} /* openFile */\n\nvoid *__PHYSFS_platformOpenRead(const char *filename)\n{\n    /*\n     * File must be opened SHARE_DENYWRITE and ACCESS_READONLY, otherwise\n     *  DosQueryFileInfo() will fail if we try to get a file length, etc.\n     */\n    return (void *) openFile(filename,\n                        OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_FAIL_IF_NEW,\n                        OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_NO_LOCALITY |\n                        OPEN_FLAGS_NOINHERIT | OPEN_SHARE_DENYWRITE |\n                        OPEN_ACCESS_READONLY);\n} /* __PHYSFS_platformOpenRead */\n\n\nvoid *__PHYSFS_platformOpenWrite(const char *filename)\n{\n    return (void *) openFile(filename,\n                        OPEN_ACTION_REPLACE_IF_EXISTS |\n                        OPEN_ACTION_CREATE_IF_NEW,\n                        OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_NO_LOCALITY |\n                        OPEN_FLAGS_NOINHERIT | OPEN_SHARE_DENYWRITE);\n} /* __PHYSFS_platformOpenWrite */\n\n\nvoid *__PHYSFS_platformOpenAppend(const char *filename)\n{\n    APIRET rc;\n    ULONG dummy = 0;\n    HFILE hfile;\n\n    /*\n     * File must be opened SHARE_DENYWRITE and ACCESS_READWRITE, otherwise\n     *  DosQueryFileInfo() will fail if we try to get a file length, etc.\n     */\n    hfile = openFile(filename,\n                        OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW,\n                        OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_NO_LOCALITY |\n                        OPEN_FLAGS_NOINHERIT | OPEN_SHARE_DENYWRITE |\n                        OPEN_ACCESS_READWRITE);\n    BAIL_IF_ERRPASS(!hfile, NULL);\n\n    rc = DosSetFilePtr(hfile, 0, FILE_END, &dummy);\n    if (rc != NO_ERROR)\n    {\n        DosClose(hfile);\n        BAIL(errcodeFromAPIRET(rc), NULL);\n    } /* if */\n\n    return ((void *) hfile);\n} /* __PHYSFS_platformOpenAppend */\n\n\nPHYSFS_sint64 __PHYSFS_platformRead(void *opaque, void *buf, PHYSFS_uint64 len)\n{\n    ULONG br = 0;\n    APIRET rc;\n    BAIL_IF(!__PHYSFS_ui64FitsAddressSpace(len),PHYSFS_ERR_INVALID_ARGUMENT,-1);\n    rc = DosRead((HFILE) opaque, buf, (ULONG) len, &br);\n    BAIL_IF(rc != NO_ERROR, errcodeFromAPIRET(rc), (br > 0) ? ((PHYSFS_sint64) br) : -1);\n    return (PHYSFS_sint64) br;\n} /* __PHYSFS_platformRead */\n\n\nPHYSFS_sint64 __PHYSFS_platformWrite(void *opaque, const void *buf,\n                                     PHYSFS_uint64 len)\n{\n    ULONG bw = 0;\n    APIRET rc;\n    BAIL_IF(!__PHYSFS_ui64FitsAddressSpace(len),PHYSFS_ERR_INVALID_ARGUMENT,-1);\n    rc = DosWrite((HFILE) opaque, (void *) buf, (ULONG) len, &bw);    \n    BAIL_IF(rc != NO_ERROR, errcodeFromAPIRET(rc), (bw > 0) ? ((PHYSFS_sint64) bw) : -1);\n    return (PHYSFS_sint64) bw;\n} /* __PHYSFS_platformWrite */\n\n\nint __PHYSFS_platformSeek(void *opaque, PHYSFS_uint64 pos)\n{\n    ULONG dummy;\n    HFILE hfile = (HFILE) opaque;\n    LONG dist = (LONG) pos;\n    APIRET rc;\n\n    /* hooray for 32-bit filesystem limits!  :) */\n    BAIL_IF((PHYSFS_uint64) dist != pos, PHYSFS_ERR_INVALID_ARGUMENT, 0);\n    rc = DosSetFilePtr(hfile, dist, FILE_BEGIN, &dummy);\n    BAIL_IF(rc != NO_ERROR, errcodeFromAPIRET(rc), 0);\n    return 1;\n} /* __PHYSFS_platformSeek */\n\n\nPHYSFS_sint64 __PHYSFS_platformTell(void *opaque)\n{\n    ULONG pos;\n    HFILE hfile = (HFILE) opaque;\n    const APIRET rc = DosSetFilePtr(hfile, 0, FILE_CURRENT, &pos);\n    BAIL_IF(rc != NO_ERROR, errcodeFromAPIRET(rc), -1);\n    return ((PHYSFS_sint64) pos);\n} /* __PHYSFS_platformTell */\n\n\nPHYSFS_sint64 __PHYSFS_platformFileLength(void *opaque)\n{\n    FILESTATUS3 fs;\n    HFILE hfile = (HFILE) opaque;\n    const APIRET rc = DosQueryFileInfo(hfile, FIL_STANDARD, &fs, sizeof (fs));\n    BAIL_IF(rc != NO_ERROR, errcodeFromAPIRET(rc), -1);\n    return ((PHYSFS_sint64) fs.cbFile);\n} /* __PHYSFS_platformFileLength */\n\n\nint __PHYSFS_platformFlush(void *opaque)\n{\n    const APIRET rc = DosResetBuffer((HFILE) opaque);\n    BAIL_IF(rc != NO_ERROR, errcodeFromAPIRET(rc), 0);\n    return 1;\n} /* __PHYSFS_platformFlush */\n\n\nvoid __PHYSFS_platformClose(void *opaque)\n{\n    DosClose((HFILE) opaque);  /* ignore errors. You should have flushed! */\n} /* __PHYSFS_platformClose */\n\n\nint __PHYSFS_platformDelete(const char *path)\n{\n    char *cppath = cvtUtf8ToCodepage(path);\n    FILESTATUS3 fs;\n    APIRET rc;\n    int retval = 0;\n\n    BAIL_IF_ERRPASS(!cppath, 0);\n    rc = DosQueryPathInfo(cppath, FIL_STANDARD, &fs, sizeof (fs));\n    GOTO_IF(rc != NO_ERROR, errcodeFromAPIRET(rc), done);\n    rc = (fs.attrFile & FILE_DIRECTORY) ? DosDeleteDir(path) : DosDelete(path);\n    GOTO_IF(rc != NO_ERROR, errcodeFromAPIRET(rc), done);\n    retval = 1;  /* success */\n\ndone:\n    allocator.Free(cppath);\n    return retval;\n} /* __PHYSFS_platformDelete */\n\n\n/* Convert to a format PhysicsFS can grok... */\nPHYSFS_sint64 os2TimeToUnixTime(const FDATE *date, const FTIME *time)\n{\n    struct tm tm;\n\n    tm.tm_sec = ((PHYSFS_uint32) time->twosecs) * 2;                        \n    tm.tm_min = time->minutes;\n    tm.tm_hour = time->hours;\n    tm.tm_mday = date->day;\n    tm.tm_mon = date->month;\n    tm.tm_year = ((PHYSFS_uint32) date->year) + 80;\n    tm.tm_wday = -1 /*st_localtz.wDayOfWeek*/;\n    tm.tm_yday = -1;\n    tm.tm_isdst = -1;\n\n    return (PHYSFS_sint64) mktime(&tm);\n} /* os2TimeToUnixTime */\n\n\nint __PHYSFS_platformStat(const char *filename, PHYSFS_Stat *stat, const int follow)\n{\n    char *cpfname = cvtUtf8ToCodepage(filename);\n    FILESTATUS3 fs;\n    int retval = 0;\n    APIRET rc;\n\n    BAIL_IF_ERRPASS(!cpfname, 0);\n\n    rc = DosQueryPathInfo(cpfname, FIL_STANDARD, &fs, sizeof (fs));\n    GOTO_IF(rc != NO_ERROR, errcodeFromAPIRET(rc), done);\n\n    if (fs.attrFile & FILE_DIRECTORY)\n    {\n        stat->filetype = PHYSFS_FILETYPE_DIRECTORY;\n        stat->filesize = 0;\n    } /* if */\n    else\n    {\n        stat->filetype = PHYSFS_FILETYPE_REGULAR;\n        stat->filesize = fs.cbFile;\n    } /* else */\n\n    stat->modtime = os2TimeToUnixTime(&fs.fdateLastWrite, &fs.ftimeLastWrite);\n    if (stat->modtime < 0)\n        stat->modtime = 0;\n\n    stat->accesstime = os2TimeToUnixTime(&fs.fdateLastAccess, &fs.ftimeLastAccess);\n    if (stat->accesstime < 0)\n        stat->accesstime = 0;\n\n    stat->createtime = os2TimeToUnixTime(&fs.fdateCreation, &fs.ftimeCreation);\n    if (stat->createtime < 0)\n        stat->createtime = 0;\n\n    stat->readonly = ((fs.attrFile & FILE_READONLY) == FILE_READONLY);\n    return 1;  /* success */\n\ndone:\n    allocator.Free(cpfname); \n    return retval;\n} /* __PHYSFS_platformStat */\n\n\nvoid *__PHYSFS_platformGetThreadID(void)\n{\n    PTIB ptib;\n    PPIB ppib;\n\n    /*\n     * Allegedly, this API never fails, but we'll punt and return a\n     *  default value (zero might as well do) if it does.\n     */\n    const APIRET rc = DosGetInfoBlocks(&ptib, &ppib);\n    BAIL_IF(rc != NO_ERROR, errcodeFromAPIRET(rc), 0);\n    return ((void *) ptib->tib_ordinal);\n} /* __PHYSFS_platformGetThreadID */\n\n\nvoid *__PHYSFS_platformCreateMutex(void)\n{\n    HMTX hmtx = NULLHANDLE;\n    const APIRET rc = DosCreateMutexSem(NULL, &hmtx, 0, 0);\n    BAIL_IF(rc != NO_ERROR, errcodeFromAPIRET(rc), NULL);\n    return ((void *) hmtx);\n} /* __PHYSFS_platformCreateMutex */\n\n\nvoid __PHYSFS_platformDestroyMutex(void *mutex)\n{\n    DosCloseMutexSem((HMTX) mutex);\n} /* __PHYSFS_platformDestroyMutex */\n\n\nint __PHYSFS_platformGrabMutex(void *mutex)\n{\n    /* Do _NOT_ set the physfs error message in here! */\n    return (DosRequestMutexSem((HMTX) mutex, SEM_INDEFINITE_WAIT) == NO_ERROR);\n} /* __PHYSFS_platformGrabMutex */\n\n\nvoid __PHYSFS_platformReleaseMutex(void *mutex)\n{\n    DosReleaseMutexSem((HMTX) mutex);\n} /* __PHYSFS_platformReleaseMutex */\n\n#endif  /* PHYSFS_PLATFORM_OS2 */\n\n/* end of physfs_platform_os2.c ... */\n"
  },
  {
    "path": "src/libraries/physfs/physfs_platform_posix.c",
    "content": "/*\n * Posix-esque support routines for PhysicsFS.\n *\n * Please see the file LICENSE.txt in the source's root directory.\n *\n *  This file written by Ryan C. Gordon.\n */\n\n#define __PHYSICSFS_INTERNAL__\n#include \"physfs_platforms.h\"\n\n#ifdef PHYSFS_PLATFORM_POSIX\n\n#include <unistd.h>\n#include <ctype.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <pwd.h>\n#include <dirent.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <pthread.h>\n\n#include \"physfs_internal.h\"\n\n\nstatic PHYSFS_ErrorCode errcodeFromErrnoError(const int err)\n{\n    switch (err)\n    {\n        case 0: return PHYSFS_ERR_OK;\n        case EACCES: return PHYSFS_ERR_PERMISSION;\n        case EPERM: return PHYSFS_ERR_PERMISSION;\n        case EDQUOT: return PHYSFS_ERR_NO_SPACE;\n        case EIO: return PHYSFS_ERR_IO;\n        case ELOOP: return PHYSFS_ERR_SYMLINK_LOOP;\n        case EMLINK: return PHYSFS_ERR_NO_SPACE;\n        case ENAMETOOLONG: return PHYSFS_ERR_BAD_FILENAME;\n        case ENOENT: return PHYSFS_ERR_NOT_FOUND;\n        case ENOSPC: return PHYSFS_ERR_NO_SPACE;\n        case ENOTDIR: return PHYSFS_ERR_NOT_FOUND;\n        case EISDIR: return PHYSFS_ERR_NOT_A_FILE;\n        case EROFS: return PHYSFS_ERR_READ_ONLY;\n        case ETXTBSY: return PHYSFS_ERR_BUSY;\n        case EBUSY: return PHYSFS_ERR_BUSY;\n        case ENOMEM: return PHYSFS_ERR_OUT_OF_MEMORY;\n        case ENOTEMPTY: return PHYSFS_ERR_DIR_NOT_EMPTY;\n        default: return PHYSFS_ERR_OS_ERROR;\n    } /* switch */\n} /* errcodeFromErrnoError */\n\n\nstatic inline PHYSFS_ErrorCode errcodeFromErrno(void)\n{\n    return errcodeFromErrnoError(errno);\n} /* errcodeFromErrno */\n\n\nstatic char *getUserDirByUID(void)\n{\n    uid_t uid = getuid();\n    struct passwd *pw;\n    char *retval = NULL;\n\n    pw = getpwuid(uid);\n    if ((pw != NULL) && (pw->pw_dir != NULL) && (*pw->pw_dir != '\\0'))\n    {\n        const size_t dlen = strlen(pw->pw_dir);\n        const size_t add_dirsep = (pw->pw_dir[dlen-1] != '/') ? 1 : 0;\n        retval = (char *) allocator.Malloc(dlen + 1 + add_dirsep);\n        if (retval != NULL)\n        {\n            strcpy(retval, pw->pw_dir);\n            if (add_dirsep)\n            {\n                retval[dlen] = '/';\n                retval[dlen+1] = '\\0';\n            } /* if */\n        } /* if */\n    } /* if */\n    \n    return retval;\n} /* getUserDirByUID */\n\n\nchar *__PHYSFS_platformCalcUserDir(void)\n{\n    char *retval = NULL;\n    char *envr = getenv(\"HOME\");\n\n    /* if the environment variable was set, make sure it's really a dir. */\n    if (envr != NULL)\n    {\n        struct stat statbuf;\n        if ((stat(envr, &statbuf) != -1) && (S_ISDIR(statbuf.st_mode)))\n        {\n            const size_t envrlen = strlen(envr);\n            const size_t add_dirsep = (envr[envrlen-1] != '/') ? 1 : 0;\n            retval = allocator.Malloc(envrlen + 1 + add_dirsep);\n            if (retval)\n            {\n                strcpy(retval, envr);\n                if (add_dirsep)\n                {\n                    retval[envrlen] = '/';\n                    retval[envrlen+1] = '\\0';\n                } /* if */\n            } /* if */\n        } /* if */\n    } /* if */\n\n    if (retval == NULL)\n        retval = getUserDirByUID();\n\n    return retval;\n} /* __PHYSFS_platformCalcUserDir */\n\n\nPHYSFS_EnumerateCallbackResult __PHYSFS_platformEnumerate(const char *dirname,\n                               PHYSFS_EnumerateCallback callback,\n                               const char *origdir, void *callbackdata)\n{\n    DIR *dir;\n    struct dirent *ent;\n    PHYSFS_EnumerateCallbackResult retval = PHYSFS_ENUM_OK;\n\n    dir = opendir(dirname);\n    BAIL_IF(dir == NULL, errcodeFromErrno(), PHYSFS_ENUM_ERROR);\n\n    while ((retval == PHYSFS_ENUM_OK) && ((ent = readdir(dir)) != NULL))\n    {\n        const char *name = ent->d_name;\n        if (name[0] == '.')  /* ignore \".\" and \"..\" */\n        {\n            if ((name[1] == '\\0') || ((name[1] == '.') && (name[2] == '\\0')))\n                continue;\n        } /* if */\n\n        retval = callback(callbackdata, origdir, name);\n        if (retval == PHYSFS_ENUM_ERROR)\n            PHYSFS_setErrorCode(PHYSFS_ERR_APP_CALLBACK);\n    } /* while */\n\n    closedir(dir);\n\n    return retval;\n} /* __PHYSFS_platformEnumerate */\n\n\nint __PHYSFS_platformMkDir(const char *path)\n{\n    const int rc = mkdir(path, S_IRWXU);\n    BAIL_IF(rc == -1, errcodeFromErrno(), 0);\n    return 1;\n} /* __PHYSFS_platformMkDir */\n\n\n#if !defined(O_CLOEXEC) && defined(FD_CLOEXEC)\nstatic inline void set_CLOEXEC(int fildes)\n{\n    int flags = fcntl(fildes, F_GETFD);\n    if (flags != -1) {\n        fcntl(fildes, F_SETFD, flags | FD_CLOEXEC);\n    }\n}\n#endif\n\nstatic void *doOpen(const char *filename, int mode)\n{\n    const int appending = (mode & O_APPEND);\n    int fd;\n    int *retval;\n\n    errno = 0;\n\n    /* O_APPEND doesn't actually behave as we'd like. */\n    mode &= ~O_APPEND;\n\n#ifdef O_CLOEXEC\n    /* Add O_CLOEXEC if defined */\n    mode |= O_CLOEXEC;\n#endif\n\n    do {\n        fd = open(filename, mode, S_IRUSR | S_IWUSR);\n    } while ((fd < 0) && (errno == EINTR));\n    BAIL_IF(fd < 0, errcodeFromErrno(), NULL);\n\n#if !defined(O_CLOEXEC) && defined(FD_CLOEXEC)\n    set_CLOEXEC(fd);\n#endif\n\n    if (appending)\n    {\n        if (lseek(fd, 0, SEEK_END) < 0)\n        {\n            const int err = errno;\n            close(fd);\n            BAIL(errcodeFromErrnoError(err), NULL);\n        } /* if */\n    } /* if */\n\n    retval = (int *) allocator.Malloc(sizeof (int));\n    if (!retval)\n    {\n        close(fd);\n        BAIL(PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n    } /* if */\n\n    *retval = fd;\n    return ((void *) retval);\n} /* doOpen */\n\n\nvoid *__PHYSFS_platformOpenRead(const char *filename)\n{\n    return doOpen(filename, O_RDONLY);\n} /* __PHYSFS_platformOpenRead */\n\n\nvoid *__PHYSFS_platformOpenWrite(const char *filename)\n{\n    return doOpen(filename, O_WRONLY | O_CREAT | O_TRUNC);\n} /* __PHYSFS_platformOpenWrite */\n\n\nvoid *__PHYSFS_platformOpenAppend(const char *filename)\n{\n    return doOpen(filename, O_WRONLY | O_CREAT | O_APPEND);\n} /* __PHYSFS_platformOpenAppend */\n\n\nPHYSFS_sint64 __PHYSFS_platformRead(void *opaque, void *buffer,\n                                    PHYSFS_uint64 len)\n{\n    const int fd = *((int *) opaque);\n    ssize_t rc = 0;\n\n    if (!__PHYSFS_ui64FitsAddressSpace(len))\n        BAIL(PHYSFS_ERR_INVALID_ARGUMENT, -1);\n\n    do {\n        rc = read(fd, buffer, (size_t) len);\n    } while ((rc == -1) && (errno == EINTR));\n    BAIL_IF(rc == -1, errcodeFromErrno(), -1);\n    assert(rc >= 0);\n    assert(rc <= len);\n    return (PHYSFS_sint64) rc;\n} /* __PHYSFS_platformRead */\n\n\nPHYSFS_sint64 __PHYSFS_platformWrite(void *opaque, const void *buffer,\n                                     PHYSFS_uint64 len)\n{\n    const int fd = *((int *) opaque);\n    ssize_t rc = 0;\n\n    if (!__PHYSFS_ui64FitsAddressSpace(len))\n        BAIL(PHYSFS_ERR_INVALID_ARGUMENT, -1);\n\n    do {\n        rc = write(fd, (void *) buffer, (size_t) len);\n    } while ((rc == -1) && (errno == EINTR));\n    BAIL_IF(rc == -1, errcodeFromErrno(), rc);\n    assert(rc >= 0);\n    assert(rc <= len);\n    return (PHYSFS_sint64) rc;\n} /* __PHYSFS_platformWrite */\n\n\nint __PHYSFS_platformSeek(void *opaque, PHYSFS_uint64 pos)\n{\n    const int fd = *((int *) opaque);\n    const off_t rc = lseek(fd, (off_t) pos, SEEK_SET);\n    BAIL_IF(rc == -1, errcodeFromErrno(), 0);\n    return 1;\n} /* __PHYSFS_platformSeek */\n\n\nPHYSFS_sint64 __PHYSFS_platformTell(void *opaque)\n{\n    const int fd = *((int *) opaque);\n    PHYSFS_sint64 retval;\n    retval = (PHYSFS_sint64) lseek(fd, 0, SEEK_CUR);\n    BAIL_IF(retval == -1, errcodeFromErrno(), -1);\n    return retval;\n} /* __PHYSFS_platformTell */\n\n\nPHYSFS_sint64 __PHYSFS_platformFileLength(void *opaque)\n{\n    const int fd = *((int *) opaque);\n    struct stat statbuf;\n    BAIL_IF(fstat(fd, &statbuf) == -1, errcodeFromErrno(), -1);\n    return ((PHYSFS_sint64) statbuf.st_size);\n} /* __PHYSFS_platformFileLength */\n\n\nint __PHYSFS_platformFlush(void *opaque)\n{\n    const int fd = *((int *) opaque);\n    int rc = -1;\n    if ((fcntl(fd, F_GETFL) & O_ACCMODE) != O_RDONLY) {\n        do {\n            rc = fsync(fd);\n        } while ((rc == -1) && (errno == EINTR));\n        BAIL_IF(rc == -1, errcodeFromErrno(), 0);\n    }\n    return 1;\n} /* __PHYSFS_platformFlush */\n\n\nvoid __PHYSFS_platformClose(void *opaque)\n{\n    const int fd = *((int *) opaque);\n    int rc = -1;\n    do {\n        rc = close(fd);  /* we don't check this. You should have used flush! */\n    } while ((rc == -1) && (errno == EINTR));\n    allocator.Free(opaque);\n} /* __PHYSFS_platformClose */\n\n\nint __PHYSFS_platformDelete(const char *path)\n{\n    BAIL_IF(remove(path) == -1, errcodeFromErrno(), 0);\n    return 1;\n} /* __PHYSFS_platformDelete */\n\n\nint __PHYSFS_platformStat(const char *fname, PHYSFS_Stat *st, const int follow)\n{\n    struct stat statbuf;\n    const int rc = follow ? stat(fname, &statbuf) : lstat(fname, &statbuf);\n    BAIL_IF(rc == -1, errcodeFromErrno(), 0);\n\n    if (S_ISREG(statbuf.st_mode))\n    {\n        st->filetype = PHYSFS_FILETYPE_REGULAR;\n        st->filesize = statbuf.st_size;\n    } /* if */\n\n    else if(S_ISDIR(statbuf.st_mode))\n    {\n        st->filetype = PHYSFS_FILETYPE_DIRECTORY;\n        st->filesize = 0;\n    } /* else if */\n\n    else if(S_ISLNK(statbuf.st_mode))\n    {\n        st->filetype = PHYSFS_FILETYPE_SYMLINK;\n        st->filesize = 0;\n    } /* else if */\n\n    else\n    {\n        st->filetype = PHYSFS_FILETYPE_OTHER;\n        st->filesize = statbuf.st_size;\n    } /* else */\n\n    st->modtime = statbuf.st_mtime;\n    st->createtime = statbuf.st_ctime;\n    st->accesstime = statbuf.st_atime;\n\n    st->readonly = (access(fname, W_OK) == -1);\n    return 1;\n} /* __PHYSFS_platformStat */\n\n\ntypedef struct\n{\n    pthread_mutex_t mutex;\n    pthread_t owner;\n    PHYSFS_uint32 count;\n} PthreadMutex;\n\n\nvoid *__PHYSFS_platformGetThreadID(void)\n{\n    return ( (void *) ((size_t) pthread_self()) );\n} /* __PHYSFS_platformGetThreadID */\n\n\nvoid *__PHYSFS_platformCreateMutex(void)\n{\n    int rc;\n    PthreadMutex *m = (PthreadMutex *) allocator.Malloc(sizeof (PthreadMutex));\n    BAIL_IF(!m, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n    rc = pthread_mutex_init(&m->mutex, NULL);\n    if (rc != 0)\n    {\n        allocator.Free(m);\n        BAIL(PHYSFS_ERR_OS_ERROR, NULL);\n    } /* if */\n\n    m->count = 0;\n    m->owner = (pthread_t) 0xDEADBEEF;\n    return ((void *) m);\n} /* __PHYSFS_platformCreateMutex */\n\n\nvoid __PHYSFS_platformDestroyMutex(void *mutex)\n{\n    PthreadMutex *m = (PthreadMutex *) mutex;\n\n    /* Destroying a locked mutex is a bug, but we'll try to be helpful. */\n    if ((m->owner == pthread_self()) && (m->count > 0))\n        pthread_mutex_unlock(&m->mutex);\n\n    pthread_mutex_destroy(&m->mutex);\n    allocator.Free(m);\n} /* __PHYSFS_platformDestroyMutex */\n\n\nint __PHYSFS_platformGrabMutex(void *mutex)\n{\n    PthreadMutex *m = (PthreadMutex *) mutex;\n    pthread_t tid = pthread_self();\n    if (m->owner != tid)\n    {\n        if (pthread_mutex_lock(&m->mutex) != 0)\n            return 0;\n        m->owner = tid;\n    } /* if */\n\n    m->count++;\n    return 1;\n} /* __PHYSFS_platformGrabMutex */\n\n\nvoid __PHYSFS_platformReleaseMutex(void *mutex)\n{\n    PthreadMutex *m = (PthreadMutex *) mutex;\n    assert(m->owner == pthread_self());  /* catch programming errors. */\n    assert(m->count > 0);  /* catch programming errors. */\n    if (m->owner == pthread_self())\n    {\n        if (--m->count == 0)\n        {\n            m->owner = (pthread_t) 0xDEADBEEF;\n            pthread_mutex_unlock(&m->mutex);\n        } /* if */\n    } /* if */\n} /* __PHYSFS_platformReleaseMutex */\n\n#endif  /* PHYSFS_PLATFORM_POSIX */\n\n/* end of physfs_platform_posix.c ... */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_platform_qnx.c",
    "content": "/*\n * QNX support routines for PhysicsFS.\n *\n * Please see the file LICENSE.txt in the source's root directory.\n *\n *  This file written by Ryan C. Gordon.\n */\n\n/* This is tested against QNX 7 at the moment. */\n\n#define __PHYSICSFS_INTERNAL__\n#include \"physfs_platforms.h\"\n\n#ifdef PHYSFS_PLATFORM_QNX\n\n#include <fcntl.h>\n#include <unistd.h>\n#include <sys/types.h>\n#include <limits.h>\n\n#include \"physfs_internal.h\"\n\nint __PHYSFS_platformInit(void)\n{\n    return 1;  /* always succeed. */\n} /* __PHYSFS_platformInit */\n\n\nvoid __PHYSFS_platformDeinit(void)\n{\n    /* no-op */\n} /* __PHYSFS_platformDeinit */\n\n\nchar *__PHYSFS_platformCalcBaseDir(const char *argv0)\n{\n    char *retval = (char *) allocator.Malloc(PATH_MAX+1);\n    if (retval == NULL)\n        BAIL(PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n    else\n    {\n        const int fd = open(\"/proc/self/exefile\", O_RDONLY);\n        const ssize_t br = (fd == -1) ? -1 : read(fd, retval, PATH_MAX);\n        char *ptr;\n\n        if (fd != -1)\n            close(fd);\n\n        if ((br < 0) || (br > PATH_MAX))\n        {\n            allocator.Free(retval);\n            BAIL(PHYSFS_ERR_OS_ERROR, NULL);\n        } /* if */\n\n        retval[br] = '\\0';\n        ptr = strrchr(retval, '/');\n        if (ptr == NULL)  /* uhoh! */\n        {\n            allocator.Free(retval);\n            BAIL(PHYSFS_ERR_OS_ERROR, NULL);\n        } /* if */\n\n        ptr[1] = '\\0';  /* chop off filename, leave dirs and '/' */\n\n        ptr = (char *) allocator.Realloc(retval, (ptr - retval) + 2);\n        if (ptr != NULL)  /* just shrinking buffer; don't care if it failed. */\n            retval = ptr;\n    } /* else */\n\n    return retval;\n} /* __PHYSFS_platformCalcBaseDir */\n\n\nchar *__PHYSFS_platformCalcPrefDir(const char *org, const char *app)\n{\n    /* !!! FIXME: this might be wrong; I don't know if there's a better method\n        on QNX, or if it follows XDG specs, etc. */\n    char *retval = NULL;\n    const char *home = __PHYSFS_getUserDir();\n    if (home)\n    {\n        const size_t len = strlen(home) + strlen(app) + 3;\n        retval = (char *) allocator.Malloc(len);\n        BAIL_IF(!retval, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n        snprintf(retval, len, \"%s.%s/\", home, app);\n    } /* if */\n    return retval;\n} /* __PHYSFS_platformCalcPrefDir */\n\n\n#if !PHYSFS_NO_CDROM_SUPPORT\n#include <devctl.h>\n#include <sys/dcmd_blk.h>\n#include <dirent.h>\n#include <sys/stat.h>\n#include <sys/statvfs.h>\n\nstatic void checkPathForCD(const char *path, PHYSFS_StringCallback cb, void *d)\n{\n    struct stat statbuf;\n    int fd;\n\n    /* The devctl() thing is QNX-specific. In this case, we query what is\n       probably the mountpoint for the device. statvfs() on that mountpoint\n       will tell use its filesystem type. */\n\n    if ( (stat(path, &statbuf) == 0) &&\n         (S_ISBLK(statbuf.st_mode)) &&\n         ((fd = open(path, O_RDONLY | O_NONBLOCK)) != -1) )\n    {\n        char mnt[256] = { 0 };\n        const int rc = devctl(fd, DCMD_FSYS_MOUNTED_BY, mnt, sizeof (mnt), 0);\n        close(fd);\n        if ( (rc == EOK) && (mnt[0]) )\n        {\n            struct statvfs statvfsbuf;\n            if (statvfs(mnt, &statvfsbuf) == 0)\n            {\n                /* I don't know if this is a complete or accurate list. */\n                const char *fstype = statvfsbuf.f_basetype;\n                const int iscd = ( (strcmp(fstype, \"cd\") == 0) ||\n                                   (strcmp(fstype, \"udf\") == 0) );\n                if (iscd)\n                    cb(d, mnt);\n            } /* if */\n        } /* if */\n    } /* if */\n} /* checkPathForCD */\n\nstatic void checkDevForCD(const char *dev, PHYSFS_StringCallback cb, void *d)\n{\n    size_t len;\n    char *path;\n\n    if (dev[0] == '.')  /* ignore \".\" and \"..\" */\n    {\n        if ((dev[1] == '\\0') || ((dev[1] == '.') && (dev[2] == '\\0')))\n            return;\n    } /* if */\n\n    len = strlen(dev) + 6;\n    path = (char *) __PHYSFS_smallAlloc(len);\n    if (!path)\n        return;  /* oh well. */\n\n    snprintf(path, len, \"/dev/%s\", dev);\n    checkPathForCD(path, cb, d);\n    __PHYSFS_smallFree(path);\n} /* checkDevForCD */\n#endif /* !PHYSFS_NO_CDROM_SUPPORT */\n\nvoid __PHYSFS_platformDetectAvailableCDs(PHYSFS_StringCallback cb, void *data)\n{\n#if !PHYSFS_NO_CDROM_SUPPORT\n    DIR *dirp = opendir(\"/dev\");\n    if (dirp)\n    {\n        struct dirent *dent;\n        while ((dent = readdir(dirp)) != NULL)\n            checkDevForCD(dent->d_name, cb, data);\n        closedir(dirp);\n    } /* if */\n#endif\n} /* __PHYSFS_platformDetectAvailableCDs */\n\n#endif /* PHYSFS_PLATFORM_QNX */\n\n/* end of physfs_platform_qnx.c ... */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_platform_unix.c",
    "content": "/*\n * Unix support routines for PhysicsFS.\n *\n * Please see the file LICENSE.txt in the source's root directory.\n *\n *  This file written by Ryan C. Gordon.\n */\n\n#define __PHYSICSFS_INTERNAL__\n#include \"physfs_platforms.h\"\n\n#ifdef PHYSFS_PLATFORM_UNIX\n\n#include <ctype.h>\n#include <unistd.h>\n#include <stdlib.h>\n#include <sys/types.h>\n#include <pwd.h>\n#include <sys/stat.h>\n#include <sys/param.h>\n#include <dirent.h>\n#include <time.h>\n#include <errno.h>\n#include <limits.h>\n\n#if PHYSFS_NO_CDROM_SUPPORT\n#elif PHYSFS_PLATFORM_LINUX\n#  define PHYSFS_HAVE_MNTENT_H 1\n#elif defined __CYGWIN__\n#  define PHYSFS_HAVE_MNTENT_H 1\n#elif PHYSFS_PLATFORM_SOLARIS\n#  define PHYSFS_HAVE_SYS_MNTTAB_H 1\n#elif PHYSFS_PLATFORM_BSD\n#  define PHYSFS_HAVE_SYS_UCRED_H 1\n#else\n#  warning No CD-ROM support included. Either define your platform here,\n#  warning  or define PHYSFS_NO_CDROM_SUPPORT=1 to confirm this is intentional.\n#endif\n\n#ifdef PHYSFS_HAVE_SYS_UCRED_H\n#  ifdef PHYSFS_HAVE_MNTENT_H\n#    undef PHYSFS_HAVE_MNTENT_H /* don't do both... */\n#  endif\n#  include <sys/mount.h>\n#  include <sys/ucred.h>\n#endif\n\n#ifdef PHYSFS_HAVE_MNTENT_H\n#include <mntent.h>\n#endif\n\n#ifdef PHYSFS_HAVE_SYS_MNTTAB_H\n#include <sys/mnttab.h>\n#endif\n\n#ifdef PHYSFS_PLATFORM_FREEBSD\n#include <sys/sysctl.h>\n#endif\n\n\n#include \"physfs_internal.h\"\n\nint __PHYSFS_platformInit(void)\n{\n    return 1;  /* always succeed. */\n} /* __PHYSFS_platformInit */\n\n\nvoid __PHYSFS_platformDeinit(void)\n{\n    /* no-op */\n} /* __PHYSFS_platformDeinit */\n\n\nvoid __PHYSFS_platformDetectAvailableCDs(PHYSFS_StringCallback cb, void *data)\n{\n#if (defined PHYSFS_NO_CDROM_SUPPORT)\n    /* no-op. */\n\n#elif (defined PHYSFS_HAVE_SYS_UCRED_H)\n    int i;\n    struct statfs *mntbufp = NULL;\n    int mounts = getmntinfo(&mntbufp, MNT_NOWAIT);\n\n    for (i = 0; i < mounts; i++)\n    {\n        int add_it = 0;\n\n        if (strcmp(mntbufp[i].f_fstypename, \"iso9660\") == 0)\n            add_it = 1;\n        else if (strcmp( mntbufp[i].f_fstypename, \"cd9660\") == 0)\n            add_it = 1;\n\n        /* add other mount types here */\n\n        if (add_it)\n            cb(data, mntbufp[i].f_mntonname);\n    } /* for */\n\n#elif (defined PHYSFS_HAVE_MNTENT_H)\n    FILE *mounts = NULL;\n    struct mntent *ent = NULL;\n\n    mounts = setmntent(\"/etc/mtab\", \"r\");\n    BAIL_IF(mounts == NULL, PHYSFS_ERR_IO, /*return void*/);\n\n    while ( (ent = getmntent(mounts)) != NULL )\n    {\n        int add_it = 0;\n        if (strcmp(ent->mnt_type, \"iso9660\") == 0)\n            add_it = 1;\n        else if (strcmp(ent->mnt_type, \"udf\") == 0)\n            add_it = 1;\n\n        /* !!! FIXME: these might pick up floppy drives, right? */\n        else if (strcmp(ent->mnt_type, \"auto\") == 0)\n            add_it = 1;\n        else if (strcmp(ent->mnt_type, \"supermount\") == 0)\n            add_it = 1;\n\n        /* add other mount types here */\n\n        if (add_it)\n            cb(data, ent->mnt_dir);\n    } /* while */\n\n    endmntent(mounts);\n\n#elif (defined PHYSFS_HAVE_SYS_MNTTAB_H)\n    FILE *mounts = fopen(MNTTAB, \"r\");\n    struct mnttab ent;\n\n    BAIL_IF(mounts == NULL, PHYSFS_ERR_IO, /*return void*/);\n    while (getmntent(mounts, &ent) == 0)\n    {\n        int add_it = 0;\n        if (strcmp(ent.mnt_fstype, \"hsfs\") == 0)\n            add_it = 1;\n\n        /* add other mount types here */\n\n        if (add_it)\n            cb(data, ent.mnt_mountp);\n    } /* while */\n\n    fclose(mounts);\n#endif\n} /* __PHYSFS_platformDetectAvailableCDs */\n\n\n/*\n * See where program (bin) resides in the $PATH specified by (envr).\n *  returns a copy of the first element in envr that contains it, or NULL\n *  if it doesn't exist or there were other problems. PHYSFS_SetError() is\n *  called if we have a problem.\n *\n * (envr) will be scribbled over, and you are expected to allocator.Free() the\n *  return value when you're done with it.\n */\nstatic char *findBinaryInPath(const char *bin, char *envr)\n{\n    size_t alloc_size = 0;\n    char *exe = NULL;\n    char *start = envr;\n    char *ptr;\n\n    assert(bin != NULL);\n    assert(envr != NULL);\n\n    do\n    {\n        size_t size;\n        size_t binlen;\n\n        ptr = strchr(start, ':');  /* find next $PATH separator. */\n        if (ptr)\n            *ptr = '\\0';\n\n        binlen = strlen(bin);\n        size = strlen(start) + binlen + 2;\n        if (size >= alloc_size)\n        {\n            char *x = (char *) allocator.Realloc(exe, size);\n            if (!x)\n            {\n                if (exe != NULL)\n                    allocator.Free(exe);\n                BAIL(PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n            } /* if */\n\n            alloc_size = size;\n            exe = x;\n        } /* if */\n\n        /* build full binary path... */\n        strcpy(exe, start);\n        if ((exe[0] == '\\0') || (exe[strlen(exe) - 1] != '/'))\n            strcat(exe, \"/\");\n        strcat(exe, bin);\n\n        if (access(exe, X_OK) == 0)  /* Exists as executable? We're done. */\n        {\n            exe[(size - binlen) - 1] = '\\0'; /* chop off filename, leave '/' */\n            return exe;\n        } /* if */\n\n        start = ptr + 1;  /* start points to beginning of next element. */\n    } while (ptr != NULL);\n\n    if (exe != NULL)\n        allocator.Free(exe);\n\n    return NULL;  /* doesn't exist in path. */\n} /* findBinaryInPath */\n\n\nstatic char *readSymLink(const char *path)\n{\n    ssize_t len = 64;\n    ssize_t rc = -1;\n    char *retval = NULL;\n\n    while (1)\n    {\n         char *ptr = (char *) allocator.Realloc(retval, (size_t) len);\n         if (ptr == NULL)\n             break;   /* out of memory. */\n         retval = ptr;\n\n         rc = readlink(path, retval, len);\n         if (rc == -1)\n             break;  /* not a symlink, i/o error, etc. */\n\n         else if (rc < len)\n         {\n             retval[rc] = '\\0';  /* readlink doesn't null-terminate. */\n             return retval;  /* we're good to go. */\n         } /* else if */\n\n         len *= 2;  /* grow buffer, try again. */\n    } /* while */\n\n    if (retval != NULL)\n        allocator.Free(retval);\n    return NULL;\n} /* readSymLink */\n\n\nchar *__PHYSFS_platformCalcBaseDir(const char *argv0)\n{\n    char *retval = NULL;\n    const char *envr = NULL;\n\n    /* Try to avoid using argv0 unless forced to. Try system-specific stuff. */\n\n    #if defined(PHYSFS_PLATFORM_FREEBSD)\n    {\n        char fullpath[PATH_MAX];\n        size_t buflen = sizeof (fullpath);\n        int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };\n        if (sysctl(mib, 4, fullpath, &buflen, NULL, 0) != -1)\n            retval = __PHYSFS_strdup(fullpath);\n    }\n    #endif\n\n    /* If there's a Linux-like /proc filesystem, you can get the full path to\n     *  the current process from a symlink in there.\n     */\n\n    if (!retval && (access(\"/proc\", F_OK) == 0))\n    {\n        retval = readSymLink(\"/proc/self/exe\");\n        if (!retval) retval = readSymLink(\"/proc/curproc/file\");\n        if (!retval) retval = readSymLink(\"/proc/curproc/exe\");\n        if (!retval) retval = readSymLink(\"/proc/self/path/a.out\");\n        if (retval == NULL)\n        {\n            /* older kernels don't have /proc/self ... try PID version... */\n            const unsigned long long pid = (unsigned long long) getpid();\n            char path[64];\n            const int rc = (int) snprintf(path,sizeof(path),\"/proc/%llu/exe\",pid);\n            if ( (rc > 0) && (rc < sizeof(path)) )\n                retval = readSymLink(path);\n        } /* if */\n    } /* if */\n\n    #if defined(PHYSFS_PLATFORM_SOLARIS)\n    if (!retval)  /* try getexecname() if /proc didn't pan out. This may not be an absolute path! */\n    {\n        const char *path = getexecname();\n        if ((path != NULL) && (path[0] == '/'))  /* must be absolute path... */\n            retval = __PHYSFS_strdup(path);\n    } /* if */\n    #endif\n\n    if (retval != NULL)  /* chop off filename. */\n    {\n        char *ptr = strrchr(retval, '/');\n        if (ptr != NULL)\n            *(ptr+1) = '\\0';\n        else  /* shouldn't happen, but just in case... */\n        {\n            allocator.Free(retval);\n            retval = NULL;\n        } /* else */\n    } /* if */\n\n    /* No /proc/self/exe, etc, but we have an argv[0] we can parse? */\n    if ((retval == NULL) && (argv0 != NULL))\n    {\n        /* fast path: default behaviour can handle this. */\n        if (strchr(argv0, '/') != NULL)\n            return NULL;  /* higher level parses out real path from argv0. */\n\n        /* If there's no dirsep on argv0, then look through $PATH for it. */\n        envr = getenv(\"PATH\");\n        if (envr != NULL)\n        {\n            char *path = (char *) __PHYSFS_smallAlloc(strlen(envr) + 1);\n            BAIL_IF(!path, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n            strcpy(path, envr);\n            retval = findBinaryInPath(argv0, path);\n            __PHYSFS_smallFree(path);\n        } /* if */\n    } /* if */\n\n    if (retval != NULL)\n    {\n        /* try to shrink buffer... */\n        char *ptr = (char *) allocator.Realloc(retval, strlen(retval) + 1);\n        if (ptr != NULL)\n            retval = ptr;  /* oh well if it failed. */\n    } /* if */\n\n    return retval;\n} /* __PHYSFS_platformCalcBaseDir */\n\n\nchar *__PHYSFS_platformCalcPrefDir(const char *org, const char *app)\n{\n    /*\n     * We use XDG's base directory spec, even if you're not on Linux.\n     *  This isn't strictly correct, but the results are relatively sane\n     *  in any case.\n     *\n     * https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html\n     */\n    const char *envr = getenv(\"XDG_DATA_HOME\");\n    const char *append = \"/\";\n    char *retval = NULL;\n    size_t len = 0;\n\n    if (!envr)\n    {\n        /* You end up with \"$HOME/.local/share/Game Name 2\" */\n        envr = __PHYSFS_getUserDir();\n        BAIL_IF_ERRPASS(!envr, NULL);  /* oh well. */\n        append = \".local/share/\";\n    } /* if */\n\n    len = strlen(envr) + strlen(append) + strlen(app) + 2;\n    retval = (char *) allocator.Malloc(len);\n    BAIL_IF(!retval, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n    snprintf(retval, len, \"%s%s%s/\", envr, append, app);\n    return retval;\n} /* __PHYSFS_platformCalcPrefDir */\n\n#endif /* PHYSFS_PLATFORM_UNIX */\n\n/* end of physfs_platform_unix.c ... */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_platform_windows.c",
    "content": "/*\n * Windows support routines for PhysicsFS.\n *\n * Please see the file LICENSE.txt in the source's root directory.\n *\n *  This file written by Ryan C. Gordon, and made sane by Gregory S. Read.\n */\n\n#define __PHYSICSFS_INTERNAL__\n#include \"physfs_platforms.h\"\n\n#ifdef PHYSFS_PLATFORM_WINDOWS\n\n/* Forcibly disable UNICODE macro, since we manage this ourselves. */\n#ifdef UNICODE\n#undef UNICODE\n#endif\n\n#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)\n#define _CRT_SECURE_NO_WARNINGS 1\n#endif\n\n#define WIN32_LEAN_AND_MEAN 1\n#include <windows.h>\n\n#ifndef PHYSFS_PLATFORM_WINRT\n#include <userenv.h>\n#include <shlobj.h>\n#endif\n\n#if !defined(PHYSFS_NO_CDROM_SUPPORT)\n#include <dbt.h>\n#endif\n\n#include <errno.h>\n#include <ctype.h>\n#include <time.h>\n\n#ifdef allocator  /* apparently Windows 10 SDK conflicts here. */\n#undef allocator\n#endif\n\n#include \"physfs_internal.h\"\n\n/*\n * Users without the platform SDK don't have this defined.  The original docs\n *  for SetFilePointer() just said to compare with 0xFFFFFFFF, so this should\n *  work as desired.\n */\n#define PHYSFS_INVALID_SET_FILE_POINTER  0xFFFFFFFF\n\n/* just in case... */\n#define PHYSFS_INVALID_FILE_ATTRIBUTES   0xFFFFFFFF\n\n/* Not defined before the Vista SDK. */\n#define PHYSFS_FILE_ATTRIBUTE_REPARSE_POINT 0x400\n#define PHYSFS_IO_REPARSE_TAG_SYMLINK    0xA000000C\n\n\n#define UTF8_TO_UNICODE_STACK(w_assignto, str) { \\\n    if (str == NULL) \\\n        w_assignto = NULL; \\\n    else { \\\n        const size_t len = (PHYSFS_uint64) ((strlen(str) + 1) * 2); \\\n        w_assignto = (WCHAR *) __PHYSFS_smallAlloc(len); \\\n        if (w_assignto != NULL) \\\n            PHYSFS_utf8ToUtf16(str, (PHYSFS_uint16 *) w_assignto, len); \\\n    } \\\n} \\\n\n/* Note this counts WCHARs, not codepoints! */\nstatic PHYSFS_uint64 wStrLen(const WCHAR *wstr)\n{\n    PHYSFS_uint64 len = 0;\n    while (*(wstr++))\n        len++;\n    return len;\n} /* wStrLen */\n\nstatic char *unicodeToUtf8Heap(const WCHAR *w_str)\n{\n    char *retval = NULL;\n    if (w_str != NULL)\n    {\n        void *ptr = NULL;\n        const PHYSFS_uint64 len = (wStrLen(w_str) * 4) + 1;\n        retval = allocator.Malloc(len);\n        BAIL_IF(!retval, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n        PHYSFS_utf8FromUtf16((const PHYSFS_uint16 *) w_str, retval, len);\n        ptr = allocator.Realloc(retval, strlen(retval) + 1); /* shrink. */\n        if (ptr != NULL)\n            retval = (char *) ptr;\n    } /* if */\n    return retval;\n} /* unicodeToUtf8Heap */\n\n\n/* Some older APIs aren't in WinRT (only the \"Ex\" version, etc).\n   Since non-WinRT might not have the \"Ex\" version, we tapdance to use\n   the perfectly-fine-and-available-even-on-Win95 API on non-WinRT targets. */\n\nstatic inline HANDLE winFindFirstFileW(const WCHAR *path, LPWIN32_FIND_DATAW d)\n{\n    #if defined(PHYSFS_PLATFORM_WINRT) || (_WIN32_WINNT >= 0x0501) // Windows XP+\n    return FindFirstFileExW(path, FindExInfoStandard, d,\n                            FindExSearchNameMatch, NULL, 0);\n    #else\n    return FindFirstFileW(path, d);\n    #endif\n} /* winFindFirstFileW */\n\nstatic inline BOOL winInitializeCriticalSection(LPCRITICAL_SECTION lpcs)\n{\n    #if defined(PHYSFS_PLATFORM_WINRT) || (_WIN32_WINNT >= 0x0600) // Windows Vista+\n    return InitializeCriticalSectionEx(lpcs, 2000, 0);\n    #else\n    InitializeCriticalSection(lpcs);\n    return TRUE;\n    #endif\n} /* winInitializeCriticalSection */\n\nstatic inline HANDLE winCreateFileW(const WCHAR *wfname, const DWORD mode,\n                                    const DWORD creation)\n{\n    const DWORD share = FILE_SHARE_READ | FILE_SHARE_WRITE;\n    #if defined(PHYSFS_PLATFORM_WINRT) /*|| (_WIN32_WINNT >= 0x0602)*/ // Windows 8+\n    return CreateFile2(wfname, mode, share, creation, NULL);\n    #else\n    return CreateFileW(wfname, mode, share, NULL, creation,\n                       FILE_ATTRIBUTE_NORMAL, NULL);\n    #endif\n} /* winCreateFileW */\n\nstatic BOOL winSetFilePointer(HANDLE h, const PHYSFS_sint64 pos,\n                              PHYSFS_sint64 *_newpos, const DWORD whence)\n{\n    #if defined(PHYSFS_PLATFORM_WINRT) || (_WIN32_WINNT >= 0x0501) // Windows XP+\n    LARGE_INTEGER lipos;\n    LARGE_INTEGER linewpos;\n    BOOL rc;\n    lipos.QuadPart = (LONGLONG) pos;\n    rc = SetFilePointerEx(h, lipos, &linewpos, whence);\n    if (_newpos)\n        *_newpos = (PHYSFS_sint64) linewpos.QuadPart;\n    return rc;\n    #else\n    const LONG low = (LONG) (pos & 0xFFFFFFFF);\n    LONG high = (LONG) ((pos >> 32) & 0xFFFFFFFF);\n    const DWORD rc = SetFilePointer(h, low, &high, whence);\n    /* 0xFFFFFFFF could be valid, so you have to check GetLastError too! */\n    if (_newpos)\n        *_newpos = ((PHYSFS_sint64) rc) | (((PHYSFS_sint64) high) << 32);\n    if ((rc == PHYSFS_INVALID_SET_FILE_POINTER) && (GetLastError() != NO_ERROR))\n        return FALSE;\n    return TRUE;\n    #endif\n} /* winSetFilePointer */\n\nstatic PHYSFS_sint64 winGetFileSize(HANDLE h)\n{\n    #if defined(PHYSFS_PLATFORM_WINRT) || (_WIN32_WINNT >= 0x0600) // Windows Vista+\n    FILE_STANDARD_INFO info;\n    const BOOL rc = GetFileInformationByHandleEx(h, FileStandardInfo,\n                                                 &info, sizeof (info));\n    return rc ? (PHYSFS_sint64) info.EndOfFile.QuadPart : -1;\n    #else\n    DWORD high = 0;\n    const DWORD rc = GetFileSize(h, &high);\n    if ((rc == PHYSFS_INVALID_SET_FILE_POINTER) && (GetLastError() != NO_ERROR))\n        return -1;\n    return (PHYSFS_sint64) ((((PHYSFS_uint64) high) << 32) | rc);\n    #endif\n} /* winGetFileSize */\n\n\nstatic PHYSFS_ErrorCode errcodeFromWinApiError(const DWORD err)\n{\n    /*\n     * win32 error codes are sort of a tricky thing; Microsoft intentionally\n     *  doesn't list which ones a given API might trigger, there are several\n     *  with overlapping and unclear meanings...and there's 16 thousand of\n     *  them in Windows 7. It looks like the ones we care about are in the\n     *  first 500, but I can't say this list is perfect; we might miss\n     *  important values or misinterpret others.\n     *\n     * Don't treat this list as anything other than a work in progress.\n     */\n    switch (err)\n    {\n        case ERROR_SUCCESS: return PHYSFS_ERR_OK;\n        case ERROR_ACCESS_DENIED: return PHYSFS_ERR_PERMISSION;\n        case ERROR_NETWORK_ACCESS_DENIED: return PHYSFS_ERR_PERMISSION;\n        case ERROR_NOT_READY: return PHYSFS_ERR_IO;\n        case ERROR_CRC: return PHYSFS_ERR_IO;\n        case ERROR_SEEK: return PHYSFS_ERR_IO;\n        case ERROR_SECTOR_NOT_FOUND: return PHYSFS_ERR_IO;\n        case ERROR_NOT_DOS_DISK: return PHYSFS_ERR_IO;\n        case ERROR_WRITE_FAULT: return PHYSFS_ERR_IO;\n        case ERROR_READ_FAULT: return PHYSFS_ERR_IO;\n        case ERROR_DEV_NOT_EXIST: return PHYSFS_ERR_IO;\n        case ERROR_BUFFER_OVERFLOW: return PHYSFS_ERR_BAD_FILENAME;\n        case ERROR_INVALID_NAME: return PHYSFS_ERR_BAD_FILENAME;\n        case ERROR_BAD_PATHNAME: return PHYSFS_ERR_BAD_FILENAME;\n        case ERROR_DIRECTORY: return PHYSFS_ERR_BAD_FILENAME;\n        case ERROR_FILE_NOT_FOUND: return PHYSFS_ERR_NOT_FOUND;\n        case ERROR_PATH_NOT_FOUND: return PHYSFS_ERR_NOT_FOUND;\n        case ERROR_DELETE_PENDING: return PHYSFS_ERR_NOT_FOUND;\n        case ERROR_INVALID_DRIVE: return PHYSFS_ERR_NOT_FOUND;\n        case ERROR_HANDLE_DISK_FULL: return PHYSFS_ERR_NO_SPACE;\n        case ERROR_DISK_FULL: return PHYSFS_ERR_NO_SPACE;\n        case ERROR_WRITE_PROTECT: return PHYSFS_ERR_READ_ONLY;\n        case ERROR_LOCK_VIOLATION: return PHYSFS_ERR_BUSY;\n        case ERROR_SHARING_VIOLATION: return PHYSFS_ERR_BUSY;\n        case ERROR_CURRENT_DIRECTORY: return PHYSFS_ERR_BUSY;\n        case ERROR_DRIVE_LOCKED: return PHYSFS_ERR_BUSY;\n        case ERROR_PATH_BUSY: return PHYSFS_ERR_BUSY;\n        case ERROR_BUSY: return PHYSFS_ERR_BUSY;\n        case ERROR_NOT_ENOUGH_MEMORY: return PHYSFS_ERR_OUT_OF_MEMORY;\n        case ERROR_OUTOFMEMORY: return PHYSFS_ERR_OUT_OF_MEMORY;\n        case ERROR_DIR_NOT_EMPTY: return PHYSFS_ERR_DIR_NOT_EMPTY;\n        default: return PHYSFS_ERR_OS_ERROR;\n    } /* switch */\n} /* errcodeFromWinApiError */\n\nstatic inline PHYSFS_ErrorCode errcodeFromWinApi(void)\n{\n    return errcodeFromWinApiError(GetLastError());\n} /* errcodeFromWinApi */\n\n\n#if defined(PHYSFS_NO_CDROM_SUPPORT)\n#define detectAvailableCDs(cb, data)\n#define deinitCDThread()\n#else\nstatic HANDLE detectCDThreadHandle = NULL;\nstatic HWND detectCDHwnd = NULL;\nstatic volatile DWORD drivesWithMediaBitmap = 0;\n\ntypedef BOOL (WINAPI *fnSTEM)(DWORD, LPDWORD b);\n\nstatic DWORD pollDiscDrives(void)\n{\n    /* Try to use SetThreadErrorMode(), which showed up in Windows 7. */\n    HANDLE lib = LoadLibraryA(\"kernel32.dll\");\n    fnSTEM stem = NULL;\n    char drive[4] = { 'x', ':', '\\\\', '\\0' };\n    DWORD oldErrorMode = 0;\n    DWORD drives = 0;\n    DWORD i;\n\n    if (lib)\n        stem = (fnSTEM) GetProcAddress(lib, \"SetThreadErrorMode\");\n\n    if (stem)\n        stem(SEM_FAILCRITICALERRORS, &oldErrorMode);\n    else\n        oldErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS);\n    \n    /* Do detection. This may block if a disc is spinning up. */\n    for (i = 'A'; i <= 'Z'; i++)\n    {\n        DWORD tmp = 0;\n        drive[0] = (char) i;\n        if (GetDriveTypeA(drive) != DRIVE_CDROM)\n            continue;\n\n        /* If this function succeeds, there's media in the drive */\n        if (GetVolumeInformationA(drive, NULL, 0, NULL, NULL, &tmp, NULL, 0))\n            drives |= (1 << (i - 'A'));\n    } /* for */\n\n    if (stem)\n        stem(oldErrorMode, NULL);\n    else\n        SetErrorMode(oldErrorMode);\n\n    if (lib)\n        FreeLibrary(lib);\n\n    return drives;\n} /* pollDiscDrives */\n\n\nstatic LRESULT CALLBACK detectCDWndProc(HWND hwnd, UINT msg,\n                                        WPARAM wp, LPARAM lparam)\n{\n    PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR) lparam;\n    PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME) lparam;\n    const int removed = (wp == DBT_DEVICEREMOVECOMPLETE);\n\n    if (msg == WM_DESTROY)\n        return 0;\n    else if ((msg != WM_DEVICECHANGE) ||\n             ((wp != DBT_DEVICEARRIVAL) && (wp != DBT_DEVICEREMOVECOMPLETE)) ||\n             (lpdb->dbch_devicetype != DBT_DEVTYP_VOLUME) ||\n             ((lpdbv->dbcv_flags & DBTF_MEDIA) == 0))\n    {\n        return DefWindowProcW(hwnd, msg, wp, lparam);\n    } /* else if */\n\n    if (removed)\n        drivesWithMediaBitmap &= ~lpdbv->dbcv_unitmask;\n    else\n        drivesWithMediaBitmap |= lpdbv->dbcv_unitmask;\n\n    return TRUE;\n} /* detectCDWndProc */\n\n\nstatic DWORD WINAPI detectCDThread(LPVOID arg)\n{\n    HANDLE initialDiscDetectionComplete = *((HANDLE *) arg);\n    const char *classname = \"PhysicsFSDetectCDCatcher\";\n    const char *winname = \"PhysicsFSDetectCDMsgWindow\";\n    HINSTANCE hInstance = GetModuleHandleW(NULL);\n    ATOM class_atom = 0;\n    WNDCLASSEXA wce;\n    MSG msg;\n\n    memset(&wce, '\\0', sizeof (wce));\n    wce.cbSize = sizeof (wce);\n    wce.lpfnWndProc = detectCDWndProc;\n    wce.lpszClassName = classname;\n    wce.hInstance = hInstance;\n    class_atom = RegisterClassExA(&wce);\n    if (class_atom == 0)\n    {\n        SetEvent(initialDiscDetectionComplete);  /* let main thread go on. */\n        return 0;\n    } /* if */\n\n    detectCDHwnd = CreateWindowExA(0, classname, winname, WS_OVERLAPPEDWINDOW,\n                        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,\n                        CW_USEDEFAULT, HWND_DESKTOP, NULL, hInstance, NULL);\n\n    if (detectCDHwnd == NULL)\n    {\n        SetEvent(initialDiscDetectionComplete);  /* let main thread go on. */\n        UnregisterClassA(classname, hInstance);\n        return 0;\n    } /* if */\n\n    /* We'll get events when discs come and go from now on. */\n\n    /* Do initial detection, possibly blocking awhile... */\n    drivesWithMediaBitmap = pollDiscDrives();\n\n    SetEvent(initialDiscDetectionComplete);  /* let main thread go on. */\n\n    do\n    {\n        const BOOL rc = GetMessageW(&msg, detectCDHwnd, 0, 0);\n        if ((rc == 0) || (rc == -1))\n            break;  /* don't care if WM_QUIT or error break this loop. */\n        TranslateMessage(&msg);\n        DispatchMessageW(&msg);\n    } while (1);\n\n    /* we've been asked to quit. */\n    DestroyWindow(detectCDHwnd);\n    UnregisterClassA(classname, hInstance);\n    return 0;\n} /* detectCDThread */\n\nstatic void detectAvailableCDs(PHYSFS_StringCallback cb, void *data)\n{\n    char drive_str[4] = { 'x', ':', '\\\\', '\\0' };\n    DWORD drives = 0;\n    DWORD i;\n\n    /*\n     * If you poll a drive while a user is inserting a disc, the OS will\n     *  block this thread until the drive has spun up. So we swallow the risk\n     *  once for initial detection, and spin a thread that will get device\n     *  events thereafter, for apps that use this interface to poll for\n     *  disc insertion.\n     */\n    if (!detectCDThreadHandle)\n    {\n        HANDLE initialDetectDone = CreateEvent(NULL, TRUE, FALSE, NULL);\n        if (!initialDetectDone)\n            return;  /* oh well. */\n\n        detectCDThreadHandle = CreateThread(NULL, 0, detectCDThread,\n                                            &initialDetectDone, 0, NULL);\n        if (detectCDThreadHandle)\n            WaitForSingleObject(initialDetectDone, INFINITE);\n        CloseHandle(initialDetectDone);\n\n        if (!detectCDThreadHandle)\n            return;  /* oh well. */\n    } /* if */\n\n    drives = drivesWithMediaBitmap; /* whatever the thread has seen, we take. */\n    for (i = 'A'; i <= 'Z'; i++)\n    {\n        if (drives & (1 << (i - 'A')))\n        {\n            drive_str[0] = (char) i;\n            cb(data, drive_str);\n        } /* if */\n    } /* for */\n} /* detectAvailableCDs */\n\nstatic void deinitCDThread(void)\n{\n    if (detectCDThreadHandle)\n    {\n        if (detectCDHwnd)\n            PostMessageW(detectCDHwnd, WM_QUIT, 0, 0);\n        CloseHandle(detectCDThreadHandle);\n        detectCDThreadHandle = NULL;\n        drivesWithMediaBitmap = 0;\n    } /* if */\n} /* deinitCDThread */\n#endif\n\n\nvoid __PHYSFS_platformDetectAvailableCDs(PHYSFS_StringCallback cb, void *data)\n{\n    detectAvailableCDs(cb, data);\n} /* __PHYSFS_platformDetectAvailableCDs */\n\n#ifdef PHYSFS_PLATFORM_WINRT\nstatic char *calcDirAppendSep(const WCHAR *wdir)\n{\n    size_t len;\n    void *ptr;\n    char *retval;\n    BAIL_IF(!wdir, errcodeFromWinApi(), NULL);\n    retval = unicodeToUtf8Heap(wdir);\n    BAIL_IF_ERRPASS(!retval, NULL);\n    len = strlen(retval);\n    ptr = allocator.Realloc(retval, len + 2);\n    if (!ptr)\n    {\n        allocator.Free(retval);\n        BAIL(PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n    } /* if */\n    retval = (char *) ptr;\n    retval[len] = '\\\\';\n    retval[len+1] = '\\0';\n    return retval;\n} /* calcDirAppendSep */\n#endif\n\nchar *__PHYSFS_platformCalcBaseDir(const char *argv0)\n{\n#ifdef PHYSFS_PLATFORM_WINRT\n    return calcDirAppendSep((const WCHAR *) __PHYSFS_winrtCalcBaseDir());\n#else\n    char *retval = NULL;\n    DWORD buflen = 64;\n    LPWSTR modpath = NULL;\n\n    while (1)\n    {\n        DWORD rc;\n        void *ptr;\n\n        if ( (ptr = allocator.Realloc(modpath, buflen*sizeof(WCHAR))) == NULL )\n        {\n            allocator.Free(modpath);\n            BAIL(PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n        } /* if */\n        modpath = (LPWSTR) ptr;\n\n        rc = GetModuleFileNameW(NULL, modpath, buflen);\n        if (rc == 0)\n        {\n            allocator.Free(modpath);\n            BAIL(errcodeFromWinApi(), NULL);\n        } /* if */\n\n        if (rc < buflen)\n        {\n            buflen = rc;\n            break;\n        } /* if */\n\n        buflen *= 2;\n    } /* while */\n\n    if (buflen > 0)  /* just in case... */\n    {\n        WCHAR *ptr = (modpath + buflen) - 1;\n        while (ptr != modpath)\n        {\n            if (*ptr == '\\\\')\n                break;\n            ptr--;\n        } /* while */\n\n        if ((ptr == modpath) && (*ptr != '\\\\'))\n            PHYSFS_setErrorCode(PHYSFS_ERR_OTHER_ERROR);  /* oh well. */\n        else\n        {\n            *(ptr+1) = '\\0';  /* chop off filename. */\n            retval = unicodeToUtf8Heap(modpath);\n        } /* else */\n    } /* else */\n    allocator.Free(modpath);\n\n    return retval;   /* w00t. */\n#endif\n} /* __PHYSFS_platformCalcBaseDir */\n\n\nchar *__PHYSFS_platformCalcPrefDir(const char *org, const char *app)\n{\n#ifdef PHYSFS_PLATFORM_WINRT\n    return calcDirAppendSep((const WCHAR *) __PHYSFS_winrtCalcPrefDir());\n#else\n    /*\n     * Vista and later has a new API for this, but SHGetFolderPath works there,\n     *  and apparently just wraps the new API. This is the new way to do it:\n     *\n     *     SHGetKnownFolderPath(FOLDERID_RoamingAppData, KF_FLAG_CREATE,\n     *                          NULL, &wszPath);\n     */\n\n    WCHAR path[MAX_PATH];\n    char *utf8 = NULL;\n    size_t len = 0;\n    char *retval = NULL;\n\n    if (!SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE,\n                                   NULL, 0, path)))\n        BAIL(PHYSFS_ERR_OS_ERROR, NULL);\n\n    utf8 = unicodeToUtf8Heap(path);\n    BAIL_IF_ERRPASS(!utf8, NULL);\n    len = strlen(utf8) + strlen(org) + strlen(app) + 4;\n    retval = allocator.Malloc(len);\n    if (!retval)\n    {\n        allocator.Free(utf8);\n        BAIL(PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n    } /* if */\n\n    snprintf(retval, len, \"%s\\\\%s\\\\%s\\\\\", utf8, org, app);\n    allocator.Free(utf8);\n    return retval;\n#endif\n} /* __PHYSFS_platformCalcPrefDir */\n\n\nchar *__PHYSFS_platformCalcUserDir(void)\n{\n#ifdef PHYSFS_PLATFORM_WINRT\n    return calcDirAppendSep((const WCHAR *) __PHYSFS_winrtCalcPrefDir());\n#else\n    typedef BOOL (WINAPI *fnGetUserProfDirW)(HANDLE, LPWSTR, LPDWORD);\n    fnGetUserProfDirW pGetDir = NULL;\n    HANDLE lib = NULL;\n    HANDLE accessToken = NULL;       /* Security handle to process */\n    char *retval = NULL;\n\n    lib = LoadLibraryA(\"userenv.dll\");\n    BAIL_IF(!lib, errcodeFromWinApi(), NULL);\n    pGetDir=(fnGetUserProfDirW) GetProcAddress(lib,\"GetUserProfileDirectoryW\");\n    GOTO_IF(!pGetDir, errcodeFromWinApi(), done);\n\n    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &accessToken))\n        GOTO(errcodeFromWinApi(), done);\n    else\n    {\n        DWORD psize = 0;\n        LPWSTR wstr = NULL;\n        BOOL rc = 0;\n\n        /*\n         * Should fail. Will write the size of the profile path in\n         *  psize. Also note that the second parameter can't be\n         *  NULL or the function fails on Windows XP, but has to be NULL on\n         *  Windows 10 or it will fail.  :(\n         */\n        rc = pGetDir(accessToken, NULL, &psize);\n        GOTO_IF(rc, PHYSFS_ERR_OS_ERROR, done);  /* should have failed! */\n\n        if (psize == 0)  /* probably on Windows XP, try a different way. */\n        {\n            WCHAR x = 0;\n            rc = pGetDir(accessToken, &x, &psize);\n            GOTO_IF(rc, PHYSFS_ERR_OS_ERROR, done);  /* should have failed! */\n            GOTO_IF(!psize, PHYSFS_ERR_OS_ERROR, done);  /* Uhoh... */\n        } /* if */\n\n        /* Allocate memory for the profile directory */\n        wstr = (LPWSTR) __PHYSFS_smallAlloc((psize + 1) * sizeof (WCHAR));\n        if (wstr != NULL)\n        {\n            if (pGetDir(accessToken, wstr, &psize))\n            {\n                /* Make sure it ends in a dirsep. We allocated +1 for this. */\n                if (wstr[psize - 2] != '\\\\')\n                {\n                    wstr[psize - 1] = '\\\\';\n                    wstr[psize - 0] = '\\0';\n                } /* if */\n                retval = unicodeToUtf8Heap(wstr);\n            } /* if */\n            __PHYSFS_smallFree(wstr);\n        } /* if */\n    } /* if */\n\ndone:\n    if (accessToken)\n        CloseHandle(accessToken);\n    FreeLibrary(lib);\n    return retval;  /* We made it: hit the showers. */\n#endif\n} /* __PHYSFS_platformCalcUserDir */\n\n\nint __PHYSFS_platformInit(void)\n{\n    return 1;  /* It's all good */\n} /* __PHYSFS_platformInit */\n\n\nvoid __PHYSFS_platformDeinit(void)\n{\n    deinitCDThread();\n} /* __PHYSFS_platformDeinit */\n\n\nvoid *__PHYSFS_platformGetThreadID(void)\n{\n    return ( (void *) ((size_t) GetCurrentThreadId()) );\n} /* __PHYSFS_platformGetThreadID */\n\n\nPHYSFS_EnumerateCallbackResult __PHYSFS_platformEnumerate(const char *dirname,\n                               PHYSFS_EnumerateCallback callback,\n                               const char *origdir, void *callbackdata)\n{\n    PHYSFS_EnumerateCallbackResult retval = PHYSFS_ENUM_OK;\n    HANDLE dir = INVALID_HANDLE_VALUE;\n    WIN32_FIND_DATAW entw;\n    size_t len = strlen(dirname);\n    char *searchPath = NULL;\n    WCHAR *wSearchPath = NULL;\n\n    /* Allocate a new string for path, maybe '\\\\', \"*\", and NULL terminator */\n    searchPath = (char *) __PHYSFS_smallAlloc(len + 3);\n    BAIL_IF(!searchPath, PHYSFS_ERR_OUT_OF_MEMORY, PHYSFS_ENUM_ERROR);\n\n    /* Copy current dirname */\n    strcpy(searchPath, dirname);\n\n    /* if there's no '\\\\' at the end of the path, stick one in there. */\n    if (searchPath[len - 1] != '\\\\')\n    {\n        searchPath[len++] = '\\\\';\n        searchPath[len] = '\\0';\n    } /* if */\n\n    /* Append the \"*\" to the end of the string */\n    strcat(searchPath, \"*\");\n\n    UTF8_TO_UNICODE_STACK(wSearchPath, searchPath);\n    __PHYSFS_smallFree(searchPath);\n    BAIL_IF_ERRPASS(!wSearchPath, PHYSFS_ENUM_ERROR);\n\n    dir = winFindFirstFileW(wSearchPath, &entw);\n    __PHYSFS_smallFree(wSearchPath);\n    BAIL_IF(dir==INVALID_HANDLE_VALUE, errcodeFromWinApi(), PHYSFS_ENUM_ERROR);\n\n    do\n    {\n        const WCHAR *fn = entw.cFileName;\n        char *utf8;\n\n        if (fn[0] == '.')  /* ignore \".\" and \"..\" */\n        {\n            if ((fn[1] == '\\0') || ((fn[1] == '.') && (fn[2] == '\\0')))\n                continue;\n        } /* if */\n\n        utf8 = unicodeToUtf8Heap(fn);\n        if (utf8 == NULL)\n            retval = -1;\n        else\n        {\n            retval = callback(callbackdata, origdir, utf8);\n            allocator.Free(utf8);\n            if (retval == PHYSFS_ENUM_ERROR)\n                PHYSFS_setErrorCode(PHYSFS_ERR_APP_CALLBACK);\n        } /* else */\n    } while ((retval == PHYSFS_ENUM_OK) && (FindNextFileW(dir, &entw) != 0));\n\n    FindClose(dir);\n\n    return retval;\n} /* __PHYSFS_platformEnumerate */\n\n\nint __PHYSFS_platformMkDir(const char *path)\n{\n    WCHAR *wpath;\n    DWORD rc;\n    UTF8_TO_UNICODE_STACK(wpath, path);\n    rc = CreateDirectoryW(wpath, NULL);\n    __PHYSFS_smallFree(wpath);\n    BAIL_IF(rc == 0, errcodeFromWinApi(), 0);\n    return 1;\n} /* __PHYSFS_platformMkDir */\n\n\nstatic HANDLE doOpen(const char *fname, DWORD mode, DWORD creation)\n{\n    HANDLE fileh;\n    WCHAR *wfname;\n\n    UTF8_TO_UNICODE_STACK(wfname, fname);\n    BAIL_IF(!wfname, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n\n    fileh = winCreateFileW(wfname, mode, creation);\n    __PHYSFS_smallFree(wfname);\n\n    if (fileh == INVALID_HANDLE_VALUE)\n        BAIL(errcodeFromWinApi(), INVALID_HANDLE_VALUE);\n\n    return fileh;\n} /* doOpen */\n\n\nvoid *__PHYSFS_platformOpenRead(const char *filename)\n{\n    HANDLE h = doOpen(filename, GENERIC_READ, OPEN_EXISTING);\n    return (h == INVALID_HANDLE_VALUE) ? NULL : (void *) h;\n} /* __PHYSFS_platformOpenRead */\n\n\nvoid *__PHYSFS_platformOpenWrite(const char *filename)\n{\n    HANDLE h = doOpen(filename, GENERIC_WRITE, CREATE_ALWAYS);\n    return (h == INVALID_HANDLE_VALUE) ? NULL : (void *) h;\n} /* __PHYSFS_platformOpenWrite */\n\n\nvoid *__PHYSFS_platformOpenAppend(const char *filename)\n{\n    HANDLE h = doOpen(filename, GENERIC_WRITE, OPEN_ALWAYS);\n    BAIL_IF_ERRPASS(h == INVALID_HANDLE_VALUE, NULL);\n\n    if (!winSetFilePointer(h, 0, NULL, FILE_END))\n    {\n        const PHYSFS_ErrorCode err = errcodeFromWinApi();\n        CloseHandle(h);\n        BAIL(err, NULL);\n    } /* if */\n\n    return (void *) h;\n} /* __PHYSFS_platformOpenAppend */\n\n\nPHYSFS_sint64 __PHYSFS_platformRead(void *opaque, void *buf, PHYSFS_uint64 len)\n{\n    HANDLE h = (HANDLE) opaque;\n    PHYSFS_sint64 totalRead = 0;\n\n    if (!__PHYSFS_ui64FitsAddressSpace(len))\n        BAIL(PHYSFS_ERR_INVALID_ARGUMENT, -1);\n\n    while (len > 0)\n    {\n        const DWORD thislen = (len > 0xFFFFFFFF) ? 0xFFFFFFFF : (DWORD) len;\n        DWORD numRead = 0;\n        if (!ReadFile(h, buf, thislen, &numRead, NULL))\n            BAIL(errcodeFromWinApi(), -1);\n        len -= (PHYSFS_uint64) numRead;\n        totalRead += (PHYSFS_sint64) numRead;\n        if (numRead != thislen)\n            break;\n    } /* while */\n\n    return totalRead;\n} /* __PHYSFS_platformRead */\n\n\nPHYSFS_sint64 __PHYSFS_platformWrite(void *opaque, const void *buffer,\n                                     PHYSFS_uint64 len)\n{\n    HANDLE h = (HANDLE) opaque;\n    PHYSFS_sint64 totalWritten = 0;\n\n    if (!__PHYSFS_ui64FitsAddressSpace(len))\n        BAIL(PHYSFS_ERR_INVALID_ARGUMENT, -1);\n\n    while (len > 0)\n    {\n        const DWORD thislen = (len > 0xFFFFFFFF) ? 0xFFFFFFFF : (DWORD) len;\n        DWORD numWritten = 0;\n        if (!WriteFile(h, buffer, thislen, &numWritten, NULL))\n            BAIL(errcodeFromWinApi(), -1);\n        len -= (PHYSFS_uint64) numWritten;\n        totalWritten += (PHYSFS_sint64) numWritten;\n        if (numWritten != thislen)\n            break;\n    } /* while */\n\n    return totalWritten;\n} /* __PHYSFS_platformWrite */\n\n\nint __PHYSFS_platformSeek(void *opaque, PHYSFS_uint64 pos)\n{\n    HANDLE h = (HANDLE) opaque;\n    const PHYSFS_sint64 spos = (PHYSFS_sint64) pos;\n    BAIL_IF(!winSetFilePointer(h,spos,NULL,FILE_BEGIN), errcodeFromWinApi(), 0);\n    return 1;  /* No error occured */\n} /* __PHYSFS_platformSeek */\n\n\nPHYSFS_sint64 __PHYSFS_platformTell(void *opaque)\n{\n    HANDLE h = (HANDLE) opaque;\n    PHYSFS_sint64 pos = 0;\n    BAIL_IF(!winSetFilePointer(h,0,&pos,FILE_CURRENT), errcodeFromWinApi(), -1);\n    return pos;\n} /* __PHYSFS_platformTell */\n\n\nPHYSFS_sint64 __PHYSFS_platformFileLength(void *opaque)\n{\n    HANDLE h = (HANDLE) opaque;\n    const PHYSFS_sint64 retval = winGetFileSize(h);\n    BAIL_IF(retval < 0, errcodeFromWinApi(), -1);\n    return retval;\n} /* __PHYSFS_platformFileLength */\n\n\nint __PHYSFS_platformFlush(void *opaque)\n{\n    HANDLE h = (HANDLE) opaque;\n    BAIL_IF(!FlushFileBuffers(h), errcodeFromWinApi(), 0);\n    return 1;\n} /* __PHYSFS_platformFlush */\n\n\nvoid __PHYSFS_platformClose(void *opaque)\n{\n    HANDLE h = (HANDLE) opaque;\n    (void) CloseHandle(h); /* ignore errors. You should have flushed! */\n} /* __PHYSFS_platformClose */\n\n\nstatic int doPlatformDelete(LPWSTR wpath)\n{\n    WIN32_FILE_ATTRIBUTE_DATA info;\n    if (!GetFileAttributesExW(wpath, GetFileExInfoStandard, &info))\n        BAIL(errcodeFromWinApi(), 0);\n    else\n    {\n        const int isdir = (info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);\n        const BOOL rc = isdir ? RemoveDirectoryW(wpath) : DeleteFileW(wpath);\n        BAIL_IF(!rc, errcodeFromWinApi(), 0);\n    } /* else */\n    return 1;   /* if you made it here, it worked. */\n} /* doPlatformDelete */\n\n\nint __PHYSFS_platformDelete(const char *path)\n{\n    int retval = 0;\n    LPWSTR wpath = NULL;\n    UTF8_TO_UNICODE_STACK(wpath, path);\n    BAIL_IF(!wpath, PHYSFS_ERR_OUT_OF_MEMORY, 0);\n    retval = doPlatformDelete(wpath);\n    __PHYSFS_smallFree(wpath);\n    return retval;\n} /* __PHYSFS_platformDelete */\n\n\nvoid *__PHYSFS_platformCreateMutex(void)\n{\n    LPCRITICAL_SECTION lpcs;\n    lpcs = (LPCRITICAL_SECTION) allocator.Malloc(sizeof (CRITICAL_SECTION));\n    BAIL_IF(!lpcs, PHYSFS_ERR_OUT_OF_MEMORY, NULL);\n\n    if (!winInitializeCriticalSection(lpcs))\n    {\n        allocator.Free(lpcs);\n        BAIL(errcodeFromWinApi(), NULL);\n    } /* if */\n\n    return lpcs;\n} /* __PHYSFS_platformCreateMutex */\n\n\nvoid __PHYSFS_platformDestroyMutex(void *mutex)\n{\n    DeleteCriticalSection((LPCRITICAL_SECTION) mutex);\n    allocator.Free(mutex);\n} /* __PHYSFS_platformDestroyMutex */\n\n\nint __PHYSFS_platformGrabMutex(void *mutex)\n{\n    EnterCriticalSection((LPCRITICAL_SECTION) mutex);\n    return 1;\n} /* __PHYSFS_platformGrabMutex */\n\n\nvoid __PHYSFS_platformReleaseMutex(void *mutex)\n{\n    LeaveCriticalSection((LPCRITICAL_SECTION) mutex);\n} /* __PHYSFS_platformReleaseMutex */\n\n\nstatic PHYSFS_sint64 FileTimeToPhysfsTime(const FILETIME *ft)\n{\n    SYSTEMTIME st_utc;\n    SYSTEMTIME st_localtz;\n    TIME_ZONE_INFORMATION tzi;\n    DWORD tzid;\n    PHYSFS_sint64 retval;\n    struct tm tm;\n    BOOL rc;\n\n    BAIL_IF(!FileTimeToSystemTime(ft, &st_utc), errcodeFromWinApi(), -1);\n    tzid = GetTimeZoneInformation(&tzi);\n    BAIL_IF(tzid == TIME_ZONE_ID_INVALID, errcodeFromWinApi(), -1);\n    rc = SystemTimeToTzSpecificLocalTime(&tzi, &st_utc, &st_localtz);\n    BAIL_IF(!rc, errcodeFromWinApi(), -1);\n\n    /* Convert to a format that mktime() can grok... */\n    tm.tm_sec = st_localtz.wSecond;\n    tm.tm_min = st_localtz.wMinute;\n    tm.tm_hour = st_localtz.wHour;\n    tm.tm_mday = st_localtz.wDay;\n    tm.tm_mon = st_localtz.wMonth - 1;\n    tm.tm_year = st_localtz.wYear - 1900;\n    tm.tm_wday = -1 /*st_localtz.wDayOfWeek*/;\n    tm.tm_yday = -1;\n    tm.tm_isdst = -1;\n\n    /* Convert to a format PhysicsFS can grok... */\n    retval = (PHYSFS_sint64) mktime(&tm);\n    BAIL_IF(retval == -1, PHYSFS_ERR_OS_ERROR, -1);\n    return retval;\n} /* FileTimeToPhysfsTime */\n\n\n/* check for symlinks. These exist in NTFS 3.1 (WinXP), even though\n   they aren't really available to userspace before Vista. I wonder\n   what would happen if you put an NTFS disk with a symlink on it\n   into an XP machine, though; would this flag get set?\n   NTFS symlinks are a form of \"reparse point\" (junction, volume mount,\n   etc), so if the REPARSE_POINT attribute is set, check for the symlink\n   tag thereafter. This assumes you already read in the file attributes. */\nstatic int isSymlink(const WCHAR *wpath, const DWORD attr)\n{\n    WIN32_FIND_DATAW w32dw;\n    HANDLE h;\n\n    if ((attr & PHYSFS_FILE_ATTRIBUTE_REPARSE_POINT) == 0)\n        return 0;  /* not a reparse point? Definitely not a symlink. */\n\n    h = winFindFirstFileW(wpath, &w32dw);\n    if (h == INVALID_HANDLE_VALUE)\n        return 0;  /* ...maybe the file just vanished...? */\n\n    FindClose(h);\n    return (w32dw.dwReserved0 == PHYSFS_IO_REPARSE_TAG_SYMLINK);\n} /* isSymlink */\n\n\nint __PHYSFS_platformStat(const char *filename, PHYSFS_Stat *st, const int follow)\n{\n    WIN32_FILE_ATTRIBUTE_DATA winstat;\n    WCHAR *wstr = NULL;\n    DWORD err = 0;\n    BOOL rc = 0;\n    int issymlink = 0;\n\n    UTF8_TO_UNICODE_STACK(wstr, filename);\n    BAIL_IF(!wstr, PHYSFS_ERR_OUT_OF_MEMORY, 0);\n    rc = GetFileAttributesExW(wstr, GetFileExInfoStandard, &winstat);\n\n    if (!rc)\n        err = GetLastError();\n    else  /* check for symlink while wstr is still available */\n        issymlink = !follow && isSymlink(wstr, winstat.dwFileAttributes);\n\n    __PHYSFS_smallFree(wstr);\n    BAIL_IF(!rc, errcodeFromWinApiError(err), 0);\n\n    st->modtime = FileTimeToPhysfsTime(&winstat.ftLastWriteTime);\n    st->accesstime = FileTimeToPhysfsTime(&winstat.ftLastAccessTime);\n    st->createtime = FileTimeToPhysfsTime(&winstat.ftCreationTime);\n\n    if (issymlink)\n    {\n        st->filetype = PHYSFS_FILETYPE_SYMLINK;\n        st->filesize = 0;\n    } /* if */\n\n    else if (winstat.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)\n    {\n        st->filetype = PHYSFS_FILETYPE_DIRECTORY;\n        st->filesize = 0;\n    } /* else if */\n\n    else if (winstat.dwFileAttributes & (FILE_ATTRIBUTE_OFFLINE | FILE_ATTRIBUTE_DEVICE))\n    {\n        st->filetype = PHYSFS_FILETYPE_OTHER;\n        st->filesize = (((PHYSFS_uint64) winstat.nFileSizeHigh) << 32) | winstat.nFileSizeLow;\n    } /* else if */\n\n    else\n    {\n        st->filetype = PHYSFS_FILETYPE_REGULAR;\n        st->filesize = (((PHYSFS_uint64) winstat.nFileSizeHigh) << 32) | winstat.nFileSizeLow;\n    } /* else */\n\n    st->readonly = ((winstat.dwFileAttributes & FILE_ATTRIBUTE_READONLY) != 0);\n\n    return 1;\n} /* __PHYSFS_platformStat */\n\n#endif  /* PHYSFS_PLATFORM_WINDOWS */\n\n/* end of physfs_platform_windows.c ... */\n\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_platform_winrt.cpp",
    "content": "/*\n * Windows Runtime (WinRT) support routines for PhysicsFS.\n *\n * Please see the file LICENSE.txt in the source's root directory.\n *\n *  This file originally written by Martin \"T-Bone\" Ahrnbom, but was mostly\n *  merged into physfs_platform_windows.c by Ryan C. Gordon (so please harass\n *  Ryan about bugs and not Martin).\n */\n\n/* (There used to be instructions on how to make a WinRT project, but at\n   this point, either CMake will do it for you or you should just drop\n   PhysicsFS's sources into your existing project. --ryan.) */\n\n#define __PHYSICSFS_INTERNAL__\n#include \"physfs_platforms.h\"\n\n#ifdef PHYSFS_PLATFORM_WINRT\n\n#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)\n#define _CRT_SECURE_NO_WARNINGS 1\n#endif\n#include <windows.h>\n\n#include \"physfs_internal.h\"\n\nconst void *__PHYSFS_winrtCalcBaseDir(void)\n{\n    return Windows::ApplicationModel::Package::Current->InstalledLocation->Path->Data();\n} /* __PHYSFS_winrtCalcBaseDir */\n\nconst void *__PHYSFS_winrtCalcPrefDir(void)\n{\n    return Windows::Storage::ApplicationData::Current->LocalFolder->Path->Data();\n} /* __PHYSFS_winrtCalcBaseDir */\n\n\n#endif /* PHYSFS_PLATFORM_WINRT */\n\n/* end of physfs_platform_winrt.cpp ... */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_platforms.h",
    "content": "#ifndef _INCL_PHYSFS_PLATFORMS\n#define _INCL_PHYSFS_PLATFORMS\n\n#ifndef __PHYSICSFS_INTERNAL__\n#error Do not include this header from your applications.\n#endif\n\n/*\n * These only define the platforms to determine which files in the platforms\n *  directory should be compiled. For example, technically BeOS can be called\n *  a \"unix\" system, but since it doesn't use unix.c, we don't define\n *  PHYSFS_PLATFORM_UNIX on that system.\n */\n\n#if (defined __HAIKU__)\n#  define PHYSFS_PLATFORM_HAIKU 1\n#  define PHYSFS_PLATFORM_POSIX 1\n#elif ((defined __BEOS__) || (defined __beos__))\n#  error BeOS support was dropped since PhysicsFS 2.1. Sorry. Try Haiku!\n#elif (defined _WIN32_WCE) || (defined _WIN64_WCE)\n#  error PocketPC support was dropped since PhysicsFS 2.1. Sorry. Try WinRT!\n#elif (defined(_MSC_VER) && (_MSC_VER >= 1700) && !_USING_V110_SDK71_)\t/* _MSC_VER==1700 for MSVC 2012 */\n#  include <winapifamily.h>\n#  define PHYSFS_PLATFORM_WINDOWS 1\n#  if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)\n#    define PHYSFS_NO_CDROM_SUPPORT 1\n#    define PHYSFS_PLATFORM_WINRT 1\n#  endif\n#elif (((defined _WIN32) || (defined _WIN64)) && (!defined __CYGWIN__))\n#  define PHYSFS_PLATFORM_WINDOWS 1\n#elif defined(__OS2__) || defined(OS2)\n#  define PHYSFS_PLATFORM_OS2 1\n#elif ((defined __MACH__) && (defined __APPLE__))\n/* To check if iOS or not, we need to include this file */\n#  include <TargetConditionals.h>\n#  if ((TARGET_IPHONE_SIMULATOR) || (TARGET_OS_IPHONE))\n#     define PHYSFS_NO_CDROM_SUPPORT 1\n#  endif\n#  define PHYSFS_PLATFORM_APPLE 1\n#  define PHYSFS_PLATFORM_POSIX 1\n#elif defined(macintosh)\n#  error Classic Mac OS support was dropped from PhysicsFS 2.0. Move to OS X.\n#elif defined(__ANDROID__)\n #  define PHYSFS_PLATFORM_LINUX 1\n #  define PHYSFS_PLATFORM_ANDROID 1\n #  define PHYSFS_PLATFORM_POSIX 1\n #  define PHYSFS_NO_CDROM_SUPPORT 1\n#elif defined(__linux)\n#  define PHYSFS_PLATFORM_LINUX 1\n#  define PHYSFS_PLATFORM_UNIX 1\n#  define PHYSFS_PLATFORM_POSIX 1\n#elif defined(__sun) || defined(sun)\n#  define PHYSFS_PLATFORM_SOLARIS 1\n#  define PHYSFS_PLATFORM_UNIX 1\n#  define PHYSFS_PLATFORM_POSIX 1\n#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)\n#  define PHYSFS_PLATFORM_FREEBSD 1\n#  define PHYSFS_PLATFORM_BSD 1\n#  define PHYSFS_PLATFORM_UNIX 1\n#  define PHYSFS_PLATFORM_POSIX 1\n#elif defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__)\n#  define PHYSFS_PLATFORM_BSD 1\n#  define PHYSFS_PLATFORM_UNIX 1\n#  define PHYSFS_PLATFORM_POSIX 1\n#elif defined(__EMSCRIPTEN__)\n#  define PHYSFS_NO_CDROM_SUPPORT 1\n#  define PHYSFS_PLATFORM_UNIX 1\n#  define PHYSFS_PLATFORM_POSIX 1\n#elif defined(__QNX__)\n#  define PHYSFS_PLATFORM_QNX 1\n#  define PHYSFS_PLATFORM_POSIX 1\n#elif defined(unix) || defined(__unix__)\n#  define PHYSFS_PLATFORM_UNIX 1\n#  define PHYSFS_PLATFORM_POSIX 1\n#else\n#  error Unknown platform.\n#endif\n\n#endif  /* include-once blocker. */\n\n"
  },
  {
    "path": "src/libraries/physfs/physfs_unicode.c",
    "content": "#define __PHYSICSFS_INTERNAL__\n#include \"physfs_internal.h\"\n\n#include \"physfs_casefolding.h\"\n\n\n/*\n * From rfc3629, the UTF-8 spec:\n *  https://www.ietf.org/rfc/rfc3629.txt\n *\n *   Char. number range  |        UTF-8 octet sequence\n *      (hexadecimal)    |              (binary)\n *   --------------------+---------------------------------------------\n *   0000 0000-0000 007F | 0xxxxxxx\n *   0000 0080-0000 07FF | 110xxxxx 10xxxxxx\n *   0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx\n *   0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n */\n\n\n/*\n * This may not be the best value, but it's one that isn't represented\n *  in Unicode (0x10FFFF is the largest codepoint value). We return this\n *  value from __PHYSFS_utf8codepoint() if there's bogus bits in the\n *  stream. __PHYSFS_utf8codepoint() will turn this value into something\n *  reasonable (like a question mark), for text that wants to try to recover,\n *  whereas utf8valid() will use the value to determine if a string has bad\n *  bits.\n */\n#define UNICODE_BOGUS_CHAR_VALUE 0xFFFFFFFF\n\n/*\n * This is the codepoint we currently return when there was bogus bits in a\n *  UTF-8 string. May not fly in Asian locales?\n */\n#define UNICODE_BOGUS_CHAR_CODEPOINT '?'\n\nPHYSFS_uint32 __PHYSFS_utf8codepoint(const char **_str)\n{\n    const char *str = *_str;\n    PHYSFS_uint32 retval = 0;\n    PHYSFS_uint32 octet = (PHYSFS_uint32) ((PHYSFS_uint8) *str);\n    PHYSFS_uint32 octet2, octet3, octet4;\n\n    if (octet == 0)  /* null terminator, end of string. */\n        return 0;\n\n    else if (octet < 128)  /* one octet char: 0 to 127 */\n    {\n        (*_str)++;  /* skip to next possible start of codepoint. */\n        return octet;\n    } /* else if */\n\n    else if ((octet > 127) && (octet < 192))  /* bad (starts with 10xxxxxx). */\n    {\n        /*\n         * Apparently each of these is supposed to be flagged as a bogus\n         *  char, instead of just resyncing to the next valid codepoint.\n         */\n        (*_str)++;  /* skip to next possible start of codepoint. */\n        return UNICODE_BOGUS_CHAR_VALUE;\n    } /* else if */\n\n    else if (octet < 224)  /* two octets */\n    {\n        (*_str)++;  /* advance at least one byte in case of an error */\n        octet -= (128+64);\n        octet2 = (PHYSFS_uint32) ((PHYSFS_uint8) *(++str));\n        if ((octet2 & (128+64)) != 128)  /* Format isn't 10xxxxxx? */\n            return UNICODE_BOGUS_CHAR_VALUE;\n\n        *_str += 1;  /* skip to next possible start of codepoint. */\n        retval = ((octet << 6) | (octet2 - 128));\n        if ((retval >= 0x80) && (retval <= 0x7FF))\n            return retval;\n    } /* else if */\n\n    else if (octet < 240)  /* three octets */\n    {\n        (*_str)++;  /* advance at least one byte in case of an error */\n        octet -= (128+64+32);\n        octet2 = (PHYSFS_uint32) ((PHYSFS_uint8) *(++str));\n        if ((octet2 & (128+64)) != 128)  /* Format isn't 10xxxxxx? */\n            return UNICODE_BOGUS_CHAR_VALUE;\n\n        octet3 = (PHYSFS_uint32) ((PHYSFS_uint8) *(++str));\n        if ((octet3 & (128+64)) != 128)  /* Format isn't 10xxxxxx? */\n            return UNICODE_BOGUS_CHAR_VALUE;\n\n        *_str += 2;  /* skip to next possible start of codepoint. */\n        retval = ( ((octet << 12)) | ((octet2-128) << 6) | ((octet3-128)) );\n\n        /* There are seven \"UTF-16 surrogates\" that are illegal in UTF-8. */\n        switch (retval)\n        {\n            case 0xD800:\n            case 0xDB7F:\n            case 0xDB80:\n            case 0xDBFF:\n            case 0xDC00:\n            case 0xDF80:\n            case 0xDFFF:\n                return UNICODE_BOGUS_CHAR_VALUE;\n        } /* switch */\n\n        /* 0xFFFE and 0xFFFF are illegal, too, so we check them at the edge. */\n        if ((retval >= 0x800) && (retval <= 0xFFFD))\n            return retval;\n    } /* else if */\n\n    else if (octet < 248)  /* four octets */\n    {\n        (*_str)++;  /* advance at least one byte in case of an error */\n        octet -= (128+64+32+16);\n        octet2 = (PHYSFS_uint32) ((PHYSFS_uint8) *(++str));\n        if ((octet2 & (128+64)) != 128)  /* Format isn't 10xxxxxx? */\n            return UNICODE_BOGUS_CHAR_VALUE;\n\n        octet3 = (PHYSFS_uint32) ((PHYSFS_uint8) *(++str));\n        if ((octet3 & (128+64)) != 128)  /* Format isn't 10xxxxxx? */\n            return UNICODE_BOGUS_CHAR_VALUE;\n\n        octet4 = (PHYSFS_uint32) ((PHYSFS_uint8) *(++str));\n        if ((octet4 & (128+64)) != 128)  /* Format isn't 10xxxxxx? */\n            return UNICODE_BOGUS_CHAR_VALUE;\n\n        *_str += 3;  /* skip to next possible start of codepoint. */\n        retval = ( ((octet << 18)) | ((octet2 - 128) << 12) |\n                   ((octet3 - 128) << 6) | ((octet4 - 128)) );\n        if ((retval >= 0x10000) && (retval <= 0x10FFFF))\n            return retval;\n    } /* else if */\n\n    /*\n     * Five and six octet sequences became illegal in rfc3629.\n     *  We throw the codepoint away, but parse them to make sure we move\n     *  ahead the right number of bytes and don't overflow the buffer.\n     */\n\n    else if (octet < 252)  /* five octets */\n    {\n        (*_str)++;  /* advance at least one byte in case of an error */\n        octet = (PHYSFS_uint32) ((PHYSFS_uint8) *(++str));\n        if ((octet & (128+64)) != 128)  /* Format isn't 10xxxxxx? */\n            return UNICODE_BOGUS_CHAR_VALUE;\n\n        octet = (PHYSFS_uint32) ((PHYSFS_uint8) *(++str));\n        if ((octet & (128+64)) != 128)  /* Format isn't 10xxxxxx? */\n            return UNICODE_BOGUS_CHAR_VALUE;\n\n        octet = (PHYSFS_uint32) ((PHYSFS_uint8) *(++str));\n        if ((octet & (128+64)) != 128)  /* Format isn't 10xxxxxx? */\n            return UNICODE_BOGUS_CHAR_VALUE;\n\n        octet = (PHYSFS_uint32) ((PHYSFS_uint8) *(++str));\n        if ((octet & (128+64)) != 128)  /* Format isn't 10xxxxxx? */\n            return UNICODE_BOGUS_CHAR_VALUE;\n\n        *_str += 4;  /* skip to next possible start of codepoint. */\n        return UNICODE_BOGUS_CHAR_VALUE;\n    } /* else if */\n\n    else  /* six octets */\n    {\n        (*_str)++;  /* advance at least one byte in case of an error */\n        octet = (PHYSFS_uint32) ((PHYSFS_uint8) *(++str));\n        if ((octet & (128+64)) != 128)  /* Format isn't 10xxxxxx? */\n            return UNICODE_BOGUS_CHAR_VALUE;\n\n        octet = (PHYSFS_uint32) ((PHYSFS_uint8) *(++str));\n        if ((octet & (128+64)) != 128)  /* Format isn't 10xxxxxx? */\n            return UNICODE_BOGUS_CHAR_VALUE;\n\n        octet = (PHYSFS_uint32) ((PHYSFS_uint8) *(++str));\n        if ((octet & (128+64)) != 128)  /* Format isn't 10xxxxxx? */\n            return UNICODE_BOGUS_CHAR_VALUE;\n\n        octet = (PHYSFS_uint32) ((PHYSFS_uint8) *(++str));\n        if ((octet & (128+64)) != 128)  /* Format isn't 10xxxxxx? */\n            return UNICODE_BOGUS_CHAR_VALUE;\n\n        octet = (PHYSFS_uint32) ((PHYSFS_uint8) *(++str));\n        if ((octet & (128+64)) != 128)  /* Format isn't 10xxxxxx? */\n            return UNICODE_BOGUS_CHAR_VALUE;\n\n        *_str += 6;  /* skip to next possible start of codepoint. */\n        return UNICODE_BOGUS_CHAR_VALUE;\n    } /* else if */\n\n    return UNICODE_BOGUS_CHAR_VALUE;\n} /* __PHYSFS_utf8codepoint */\n\nstatic inline PHYSFS_uint32 utf8codepoint(const char **_str)\n{\n    return __PHYSFS_utf8codepoint(_str);\n} /* utf8codepoint */\n\nstatic PHYSFS_uint32 utf16codepoint(const PHYSFS_uint16 **_str)\n{\n    const PHYSFS_uint16 *src = *_str;\n    PHYSFS_uint32 cp = (PHYSFS_uint32) *(src++);\n\n    if (cp == 0)  /* null terminator, end of string. */\n        return 0;\n    /* Orphaned second half of surrogate pair? */\n    else if ((cp >= 0xDC00) && (cp <= 0xDFFF))\n        cp = UNICODE_BOGUS_CHAR_CODEPOINT;\n    else if ((cp >= 0xD800) && (cp <= 0xDBFF))  /* start surrogate pair! */\n    {\n        const PHYSFS_uint32 pair = (PHYSFS_uint32) *src;\n        if (pair == 0)\n            cp = UNICODE_BOGUS_CHAR_CODEPOINT;\n        else if ((pair < 0xDC00) || (pair > 0xDFFF))\n            cp = UNICODE_BOGUS_CHAR_CODEPOINT;\n        else\n        {\n            src++;  /* eat the other surrogate. */\n            cp = 0x10000 + (((cp - 0xD800) << 10) | (pair - 0xDC00));\n        } /* else */\n    } /* else if */\n\n    *_str = src;\n    return cp;\n} /* utf16codepoint */\n\nstatic PHYSFS_uint32 utf32codepoint(const PHYSFS_uint32 **_str)\n{\n    const PHYSFS_uint32 *src = *_str;\n    PHYSFS_uint32 cp = *(src++);\n\n    if (cp == 0)  /* null terminator, end of string. */\n        return 0;\n    else if (cp > 0x10FFF)\n        cp = UNICODE_BOGUS_CHAR_CODEPOINT;\n\n    *_str = src;\n    return cp;\n} /* utf32codepoint */\n\n\nvoid PHYSFS_utf8ToUcs4(const char *src, PHYSFS_uint32 *dst, PHYSFS_uint64 len)\n{\n    len -= sizeof (PHYSFS_uint32);   /* save room for null char. */\n    while (len >= sizeof (PHYSFS_uint32))\n    {\n        PHYSFS_uint32 cp = __PHYSFS_utf8codepoint(&src);\n        if (cp == 0)\n            break;\n        else if (cp == UNICODE_BOGUS_CHAR_VALUE)\n            cp = UNICODE_BOGUS_CHAR_CODEPOINT;\n        *(dst++) = cp;\n        len -= sizeof (PHYSFS_uint32);\n    } /* while */\n\n    *dst = 0;\n} /* PHYSFS_utf8ToUcs4 */\n\n\nvoid PHYSFS_utf8ToUcs2(const char *src, PHYSFS_uint16 *dst, PHYSFS_uint64 len)\n{\n    len -= sizeof (PHYSFS_uint16);   /* save room for null char. */\n    while (len >= sizeof (PHYSFS_uint16))\n    {\n        PHYSFS_uint32 cp = __PHYSFS_utf8codepoint(&src);\n        if (cp == 0)\n            break;\n        else if (cp == UNICODE_BOGUS_CHAR_VALUE)\n            cp = UNICODE_BOGUS_CHAR_CODEPOINT;\n\n        if (cp > 0xFFFF)  /* UTF-16 surrogates (bogus chars in UCS-2) */\n            cp = UNICODE_BOGUS_CHAR_CODEPOINT;\n\n        *(dst++) = cp;\n        len -= sizeof (PHYSFS_uint16);\n    } /* while */\n\n    *dst = 0;\n} /* PHYSFS_utf8ToUcs2 */\n\n\nvoid PHYSFS_utf8ToUtf16(const char *src, PHYSFS_uint16 *dst, PHYSFS_uint64 len)\n{\n    len -= sizeof (PHYSFS_uint16);   /* save room for null char. */\n    while (len >= sizeof (PHYSFS_uint16))\n    {\n        PHYSFS_uint32 cp = __PHYSFS_utf8codepoint(&src);\n        if (cp == 0)\n            break;\n        else if (cp == UNICODE_BOGUS_CHAR_VALUE)\n            cp = UNICODE_BOGUS_CHAR_CODEPOINT;\n\n        if (cp > 0xFFFF)  /* encode as surrogate pair */\n        {\n            if (len < (sizeof (PHYSFS_uint16) * 2))\n                break;  /* not enough room for the pair, stop now. */\n\n            cp -= 0x10000;  /* Make this a 20-bit value */\n\n            *(dst++) = 0xD800 + ((cp >> 10) & 0x3FF);\n            len -= sizeof (PHYSFS_uint16);\n\n            cp = 0xDC00 + (cp & 0x3FF);\n        } /* if */\n\n        *(dst++) = cp;\n        len -= sizeof (PHYSFS_uint16);\n    } /* while */\n\n    *dst = 0;\n} /* PHYSFS_utf8ToUtf16 */\n\nstatic void utf8fromcodepoint(PHYSFS_uint32 cp, char **_dst, PHYSFS_uint64 *_len)\n{\n    char *dst = *_dst;\n    PHYSFS_uint64 len = *_len;\n\n    if (len == 0)\n        return;\n\n    if (cp > 0x10FFFF)\n        cp = UNICODE_BOGUS_CHAR_CODEPOINT;\n    else if ((cp == 0xFFFE) || (cp == 0xFFFF))  /* illegal values. */\n        cp = UNICODE_BOGUS_CHAR_CODEPOINT;\n    else\n    {\n        /* There are seven \"UTF-16 surrogates\" that are illegal in UTF-8. */\n        switch (cp)\n        {\n            case 0xD800:\n            case 0xDB7F:\n            case 0xDB80:\n            case 0xDBFF:\n            case 0xDC00:\n            case 0xDF80:\n            case 0xDFFF:\n                cp = UNICODE_BOGUS_CHAR_CODEPOINT;\n        } /* switch */\n    } /* else */\n\n    /* Do the encoding... */\n    if (cp < 0x80)\n    {\n        *(dst++) = (char) cp;\n        len--;\n    } /* if */\n\n    else if (cp < 0x800)\n    {\n        if (len < 2)\n            len = 0;\n        else\n        {\n            *(dst++) = (char) ((cp >> 6) | 128 | 64);\n            *(dst++) = (char) (cp & 0x3F) | 128;\n            len -= 2;\n        } /* else */\n    } /* else if */\n\n    else if (cp < 0x10000)\n    {\n        if (len < 3)\n            len = 0;\n        else\n        {\n            *(dst++) = (char) ((cp >> 12) | 128 | 64 | 32);\n            *(dst++) = (char) ((cp >> 6) & 0x3F) | 128;\n            *(dst++) = (char) (cp & 0x3F) | 128;\n            len -= 3;\n        } /* else */\n    } /* else if */\n\n    else\n    {\n        if (len < 4)\n            len = 0;\n        else\n        {\n            *(dst++) = (char) ((cp >> 18) | 128 | 64 | 32 | 16);\n            *(dst++) = (char) ((cp >> 12) & 0x3F) | 128;\n            *(dst++) = (char) ((cp >> 6) & 0x3F) | 128;\n            *(dst++) = (char) (cp & 0x3F) | 128;\n            len -= 4;\n        } /* else if */\n    } /* else */\n\n    *_dst = dst;\n    *_len = len;\n} /* utf8fromcodepoint */\n\n#define UTF8FROMTYPE(typ, src, dst, len) \\\n    if (len == 0) return; \\\n    len--;  \\\n    while (len) \\\n    { \\\n        const PHYSFS_uint32 cp = (PHYSFS_uint32) ((typ) (*(src++))); \\\n        if (cp == 0) break; \\\n        utf8fromcodepoint(cp, &dst, &len); \\\n    } \\\n    *dst = '\\0'; \\\n\nvoid PHYSFS_utf8FromUcs4(const PHYSFS_uint32 *src, char *dst, PHYSFS_uint64 len)\n{\n    UTF8FROMTYPE(PHYSFS_uint32, src, dst, len);\n} /* PHYSFS_utf8FromUcs4 */\n\nvoid PHYSFS_utf8FromUcs2(const PHYSFS_uint16 *src, char *dst, PHYSFS_uint64 len)\n{\n    UTF8FROMTYPE(PHYSFS_uint64, src, dst, len);\n} /* PHYSFS_utf8FromUcs2 */\n\n/* latin1 maps to unicode codepoints directly, we just utf-8 encode it. */\nvoid PHYSFS_utf8FromLatin1(const char *src, char *dst, PHYSFS_uint64 len)\n{\n    UTF8FROMTYPE(PHYSFS_uint8, src, dst, len);\n} /* PHYSFS_utf8FromLatin1 */\n\n#undef UTF8FROMTYPE\n\n\nvoid PHYSFS_utf8FromUtf16(const PHYSFS_uint16 *src, char *dst, PHYSFS_uint64 len)\n{\n    if (len == 0)\n        return;\n\n    len--;\n    while (len)\n    {\n        const PHYSFS_uint32 cp = utf16codepoint(&src);\n        if (!cp)\n            break;\n        utf8fromcodepoint(cp, &dst, &len);\n    } /* while */\n\n    *dst = '\\0';\n} /* PHYSFS_utf8FromUtf16 */\n\n\nint PHYSFS_caseFold(const PHYSFS_uint32 from, PHYSFS_uint32 *to)\n{\n    int i;\n\n    if (from < 128)  /* low-ASCII, easy! */\n    {\n        if ((from >= 'A') && (from <= 'Z'))\n            *to = from - ('A' - 'a');\n        else\n            *to = from;\n        return 1;\n    } /* if */\n\n    else if (from <= 0xFFFF)\n    {\n        const PHYSFS_uint8 hash = ((from ^ (from >> 8)) & 0xFF);\n        const PHYSFS_uint16 from16 = (PHYSFS_uint16) from;\n\n        {\n            const CaseFoldHashBucket1_16 *bucket = &case_fold_hash1_16[hash];\n            const int count = (int) bucket->count;\n            for (i = 0; i < count; i++)\n            {\n                const CaseFoldMapping1_16 *mapping = &bucket->list[i];\n                if (mapping->from == from16)\n                {\n                    *to = mapping->to0;\n                    return 1;\n                } /* if */\n            } /* for */\n        }\n\n        {\n            const CaseFoldHashBucket2_16 *bucket = &case_fold_hash2_16[hash & 15];\n            const int count = (int) bucket->count;\n            for (i = 0; i < count; i++)\n            {\n                const CaseFoldMapping2_16 *mapping = &bucket->list[i];\n                if (mapping->from == from16)\n                {\n                    to[0] = mapping->to0;\n                    to[1] = mapping->to1;\n                    return 2;\n                } /* if */\n            } /* for */\n        }\n\n        {\n            const CaseFoldHashBucket3_16 *bucket = &case_fold_hash3_16[hash & 3];\n            const int count = (int) bucket->count;\n            for (i = 0; i < count; i++)\n            {\n                const CaseFoldMapping3_16 *mapping = &bucket->list[i];\n                if (mapping->from == from16)\n                {\n                    to[0] = mapping->to0;\n                    to[1] = mapping->to1;\n                    to[2] = mapping->to2;\n                    return 3;\n                } /* if */\n            } /* for */\n        }\n    } /* else if */\n\n    else  /* codepoint that doesn't fit in 16 bits. */\n    {\n        const PHYSFS_uint8 hash = ((from ^ (from >> 8)) & 0xFF);\n        const CaseFoldHashBucket1_32 *bucket = &case_fold_hash1_32[hash & 15];\n        const int count = (int) bucket->count;\n        for (i = 0; i < count; i++)\n        {\n            const CaseFoldMapping1_32 *mapping = &bucket->list[i];\n            if (mapping->from == from)\n            {\n                *to = mapping->to0;\n                return 1;\n            } /* if */\n        } /* for */\n    } /* else */\n\n\n    /* Not found...there's no remapping for this codepoint. */\n    *to = from;\n    return 1;\n} /* PHYSFS_caseFold */\n\n\n#define UTFSTRICMP(bits) \\\n    PHYSFS_uint32 folded1[3], folded2[3]; \\\n    int head1 = 0, tail1 = 0, head2 = 0, tail2 = 0; \\\n    while (1) { \\\n        PHYSFS_uint32 cp1, cp2; \\\n        if (head1 != tail1) { \\\n            cp1 = folded1[tail1++]; \\\n        } else { \\\n            head1 = PHYSFS_caseFold(utf##bits##codepoint(&str1), folded1); \\\n            cp1 = folded1[0]; \\\n            tail1 = 1; \\\n        } \\\n        if (head2 != tail2) { \\\n            cp2 = folded2[tail2++]; \\\n        } else { \\\n            head2 = PHYSFS_caseFold(utf##bits##codepoint(&str2), folded2); \\\n            cp2 = folded2[0]; \\\n            tail2 = 1; \\\n        } \\\n        if (cp1 < cp2) { \\\n            return -1; \\\n        } else if (cp1 > cp2) { \\\n            return 1; \\\n        } else if (cp1 == 0) { \\\n            break;  /* complete match. */ \\\n        } \\\n    } \\\n    return 0\n\nint PHYSFS_utf8stricmp(const char *str1, const char *str2)\n{\n    UTFSTRICMP(8);\n} /* PHYSFS_utf8stricmp */\n\nint PHYSFS_utf16stricmp(const PHYSFS_uint16 *str1, const PHYSFS_uint16 *str2)\n{\n    UTFSTRICMP(16);\n} /* PHYSFS_utf16stricmp */\n\nint PHYSFS_ucs4stricmp(const PHYSFS_uint32 *str1, const PHYSFS_uint32 *str2)\n{\n    UTFSTRICMP(32);\n} /* PHYSFS_ucs4stricmp */\n\n#undef UTFSTRICMP\n\n/* end of physfs_unicode.c ... */\n\n"
  },
  {
    "path": "src/libraries/spirv_cross/GLSL.std.450.h",
    "content": "/*\n * Copyright 2014-2016,2021 The Khronos Group, Inc.\n * SPDX-License-Identifier: MIT\n *\n * MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS\n * STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND\n * HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/\n*/\n\n#ifndef GLSLstd450_H\n#define GLSLstd450_H\n\nstatic const int GLSLstd450Version = 100;\nstatic const int GLSLstd450Revision = 3;\n\nenum GLSLstd450 {\n    GLSLstd450Bad = 0,              // Don't use\n\n    GLSLstd450Round = 1,\n    GLSLstd450RoundEven = 2,\n    GLSLstd450Trunc = 3,\n    GLSLstd450FAbs = 4,\n    GLSLstd450SAbs = 5,\n    GLSLstd450FSign = 6,\n    GLSLstd450SSign = 7,\n    GLSLstd450Floor = 8,\n    GLSLstd450Ceil = 9,\n    GLSLstd450Fract = 10,\n\n    GLSLstd450Radians = 11,\n    GLSLstd450Degrees = 12,\n    GLSLstd450Sin = 13,\n    GLSLstd450Cos = 14,\n    GLSLstd450Tan = 15,\n    GLSLstd450Asin = 16,\n    GLSLstd450Acos = 17,\n    GLSLstd450Atan = 18,\n    GLSLstd450Sinh = 19,\n    GLSLstd450Cosh = 20,\n    GLSLstd450Tanh = 21,\n    GLSLstd450Asinh = 22,\n    GLSLstd450Acosh = 23,\n    GLSLstd450Atanh = 24,\n    GLSLstd450Atan2 = 25,\n\n    GLSLstd450Pow = 26,\n    GLSLstd450Exp = 27,\n    GLSLstd450Log = 28,\n    GLSLstd450Exp2 = 29,\n    GLSLstd450Log2 = 30,\n    GLSLstd450Sqrt = 31,\n    GLSLstd450InverseSqrt = 32,\n\n    GLSLstd450Determinant = 33,\n    GLSLstd450MatrixInverse = 34,\n\n    GLSLstd450Modf = 35,            // second operand needs an OpVariable to write to\n    GLSLstd450ModfStruct = 36,      // no OpVariable operand\n    GLSLstd450FMin = 37,\n    GLSLstd450UMin = 38,\n    GLSLstd450SMin = 39,\n    GLSLstd450FMax = 40,\n    GLSLstd450UMax = 41,\n    GLSLstd450SMax = 42,\n    GLSLstd450FClamp = 43,\n    GLSLstd450UClamp = 44,\n    GLSLstd450SClamp = 45,\n    GLSLstd450FMix = 46,\n    GLSLstd450IMix = 47,            // Reserved\n    GLSLstd450Step = 48,\n    GLSLstd450SmoothStep = 49,\n\n    GLSLstd450Fma = 50,\n    GLSLstd450Frexp = 51,            // second operand needs an OpVariable to write to\n    GLSLstd450FrexpStruct = 52,      // no OpVariable operand\n    GLSLstd450Ldexp = 53,\n\n    GLSLstd450PackSnorm4x8 = 54,\n    GLSLstd450PackUnorm4x8 = 55,\n    GLSLstd450PackSnorm2x16 = 56,\n    GLSLstd450PackUnorm2x16 = 57,\n    GLSLstd450PackHalf2x16 = 58,\n    GLSLstd450PackDouble2x32 = 59,\n    GLSLstd450UnpackSnorm2x16 = 60,\n    GLSLstd450UnpackUnorm2x16 = 61,\n    GLSLstd450UnpackHalf2x16 = 62,\n    GLSLstd450UnpackSnorm4x8 = 63,\n    GLSLstd450UnpackUnorm4x8 = 64,\n    GLSLstd450UnpackDouble2x32 = 65,\n\n    GLSLstd450Length = 66,\n    GLSLstd450Distance = 67,\n    GLSLstd450Cross = 68,\n    GLSLstd450Normalize = 69,\n    GLSLstd450FaceForward = 70,\n    GLSLstd450Reflect = 71,\n    GLSLstd450Refract = 72,\n\n    GLSLstd450FindILsb = 73,\n    GLSLstd450FindSMsb = 74,\n    GLSLstd450FindUMsb = 75,\n\n    GLSLstd450InterpolateAtCentroid = 76,\n    GLSLstd450InterpolateAtSample = 77,\n    GLSLstd450InterpolateAtOffset = 78,\n\n    GLSLstd450NMin = 79,\n    GLSLstd450NMax = 80,\n    GLSLstd450NClamp = 81,\n\n    GLSLstd450Count\n};\n\n#endif  // #ifndef GLSLstd450_H\n"
  },
  {
    "path": "src/libraries/spirv_cross/include/spirv_cross/barrier.hpp",
    "content": "/*\n * Copyright 2015-2017 ARM Limited\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef SPIRV_CROSS_BARRIER_HPP\n#define SPIRV_CROSS_BARRIER_HPP\n\n#include <atomic>\n#include <thread>\n\nnamespace spirv_cross\n{\nclass Barrier\n{\npublic:\n\tBarrier()\n\t{\n\t\tcount.store(0);\n\t\titeration.store(0);\n\t}\n\n\tvoid set_release_divisor(unsigned divisor)\n\t{\n\t\tthis->divisor = divisor;\n\t}\n\n\tstatic inline void memoryBarrier()\n\t{\n\t\tstd::atomic_thread_fence(std::memory_order_seq_cst);\n\t}\n\n\tvoid reset_counter()\n\t{\n\t\tcount.store(0);\n\t\titeration.store(0);\n\t}\n\n\tvoid wait()\n\t{\n\t\tunsigned target_iteration = iteration.load(std::memory_order_relaxed) + 1;\n\t\t// Overflows cleanly.\n\t\tunsigned target_count = divisor * target_iteration;\n\n\t\t// Barriers don't enforce memory ordering.\n\t\t// Be as relaxed about the barrier as we possibly can!\n\t\tunsigned c = count.fetch_add(1u, std::memory_order_relaxed);\n\n\t\tif (c + 1 == target_count)\n\t\t{\n\t\t\titeration.store(target_iteration, std::memory_order_relaxed);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// If we have more threads than the CPU, don't hog the CPU for very long periods of time.\n\t\t\twhile (iteration.load(std::memory_order_relaxed) != target_iteration)\n\t\t\t\tstd::this_thread::yield();\n\t\t}\n\t}\n\nprivate:\n\tunsigned divisor = 1;\n\tstd::atomic<unsigned> count;\n\tstd::atomic<unsigned> iteration;\n};\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/spirv_cross/include/spirv_cross/external_interface.h",
    "content": "/*\n * Copyright 2015-2017 ARM Limited\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef SPIRV_CROSS_EXTERNAL_INTERFACE_H\n#define SPIRV_CROSS_EXTERNAL_INTERFACE_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include <stddef.h>\n\ntypedef struct spirv_cross_shader spirv_cross_shader_t;\n\nstruct spirv_cross_interface\n{\n\tspirv_cross_shader_t *(*construct)(void);\n\tvoid (*destruct)(spirv_cross_shader_t *thiz);\n\tvoid (*invoke)(spirv_cross_shader_t *thiz);\n};\n\nvoid spirv_cross_set_stage_input(spirv_cross_shader_t *thiz, unsigned location, void *data, size_t size);\n\nvoid spirv_cross_set_stage_output(spirv_cross_shader_t *thiz, unsigned location, void *data, size_t size);\n\nvoid spirv_cross_set_push_constant(spirv_cross_shader_t *thiz, void *data, size_t size);\n\nvoid spirv_cross_set_uniform_constant(spirv_cross_shader_t *thiz, unsigned location, void *data, size_t size);\n\nvoid spirv_cross_set_resource(spirv_cross_shader_t *thiz, unsigned set, unsigned binding, void **data, size_t size);\n\nconst struct spirv_cross_interface *spirv_cross_get_interface(void);\n\ntypedef enum spirv_cross_builtin {\n\tSPIRV_CROSS_BUILTIN_POSITION = 0,\n\tSPIRV_CROSS_BUILTIN_FRAG_COORD = 1,\n\tSPIRV_CROSS_BUILTIN_WORK_GROUP_ID = 2,\n\tSPIRV_CROSS_BUILTIN_NUM_WORK_GROUPS = 3,\n\tSPIRV_CROSS_NUM_BUILTINS\n} spirv_cross_builtin;\n\nvoid spirv_cross_set_builtin(spirv_cross_shader_t *thiz, spirv_cross_builtin builtin, void *data, size_t size);\n\n#define SPIRV_CROSS_NUM_DESCRIPTOR_SETS 4\n#define SPIRV_CROSS_NUM_DESCRIPTOR_BINDINGS 16\n#define SPIRV_CROSS_NUM_STAGE_INPUTS 16\n#define SPIRV_CROSS_NUM_STAGE_OUTPUTS 16\n#define SPIRV_CROSS_NUM_UNIFORM_CONSTANTS 32\n\nenum spirv_cross_format\n{\n\tSPIRV_CROSS_FORMAT_R8_UNORM = 0,\n\tSPIRV_CROSS_FORMAT_R8G8_UNORM = 1,\n\tSPIRV_CROSS_FORMAT_R8G8B8_UNORM = 2,\n\tSPIRV_CROSS_FORMAT_R8G8B8A8_UNORM = 3,\n\n\tSPIRV_CROSS_NUM_FORMATS\n};\n\nenum spirv_cross_wrap\n{\n\tSPIRV_CROSS_WRAP_CLAMP_TO_EDGE = 0,\n\tSPIRV_CROSS_WRAP_REPEAT = 1,\n\n\tSPIRV_CROSS_NUM_WRAP\n};\n\nenum spirv_cross_filter\n{\n\tSPIRV_CROSS_FILTER_NEAREST = 0,\n\tSPIRV_CROSS_FILTER_LINEAR = 1,\n\n\tSPIRV_CROSS_NUM_FILTER\n};\n\nenum spirv_cross_mipfilter\n{\n\tSPIRV_CROSS_MIPFILTER_BASE = 0,\n\tSPIRV_CROSS_MIPFILTER_NEAREST = 1,\n\tSPIRV_CROSS_MIPFILTER_LINEAR = 2,\n\n\tSPIRV_CROSS_NUM_MIPFILTER\n};\n\nstruct spirv_cross_miplevel\n{\n\tconst void *data;\n\tunsigned width, height;\n\tsize_t stride;\n};\n\nstruct spirv_cross_sampler_info\n{\n\tconst struct spirv_cross_miplevel *mipmaps;\n\tunsigned num_mipmaps;\n\n\tenum spirv_cross_format format;\n\tenum spirv_cross_wrap wrap_s;\n\tenum spirv_cross_wrap wrap_t;\n\tenum spirv_cross_filter min_filter;\n\tenum spirv_cross_filter mag_filter;\n\tenum spirv_cross_mipfilter mip_filter;\n};\n\ntypedef struct spirv_cross_sampler_2d spirv_cross_sampler_2d_t;\nspirv_cross_sampler_2d_t *spirv_cross_create_sampler_2d(const struct spirv_cross_sampler_info *info);\nvoid spirv_cross_destroy_sampler_2d(spirv_cross_sampler_2d_t *samp);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/spirv_cross/include/spirv_cross/image.hpp",
    "content": "/*\n * Copyright 2015-2017 ARM Limited\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef SPIRV_CROSS_IMAGE_HPP\n#define SPIRV_CROSS_IMAGE_HPP\n\n#ifndef GLM_SWIZZLE\n#define GLM_SWIZZLE\n#endif\n\n#ifndef GLM_FORCE_RADIANS\n#define GLM_FORCE_RADIANS\n#endif\n\n#include <glm/glm.hpp>\n\nnamespace spirv_cross\n{\ntemplate <typename T>\nstruct image2DBase\n{\n\tvirtual ~image2DBase() = default;\n\tinline virtual T load(glm::ivec2 coord) const\n\t{\n\t\treturn T(0, 0, 0, 1);\n\t}\n\tinline virtual void store(glm::ivec2 coord, const T &v)\n\t{\n\t}\n};\n\ntypedef image2DBase<glm::vec4> image2D;\ntypedef image2DBase<glm::ivec4> iimage2D;\ntypedef image2DBase<glm::uvec4> uimage2D;\n\ntemplate <typename T>\ninline T imageLoad(const image2DBase<T> &image, glm::ivec2 coord)\n{\n\treturn image.load(coord);\n}\n\ntemplate <typename T>\nvoid imageStore(image2DBase<T> &image, glm::ivec2 coord, const T &value)\n{\n\timage.store(coord, value);\n}\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/spirv_cross/include/spirv_cross/internal_interface.hpp",
    "content": "/*\n * Copyright 2015-2017 ARM Limited\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef SPIRV_CROSS_INTERNAL_INTERFACE_HPP\n#define SPIRV_CROSS_INTERNAL_INTERFACE_HPP\n\n// This file must only be included by the shader generated by spirv-cross!\n\n#ifndef GLM_FORCE_SWIZZLE\n#define GLM_FORCE_SWIZZLE\n#endif\n\n#ifndef GLM_FORCE_RADIANS\n#define GLM_FORCE_RADIANS\n#endif\n\n#include <glm/glm.hpp>\n\n#include \"barrier.hpp\"\n#include \"external_interface.h\"\n#include \"image.hpp\"\n#include \"sampler.hpp\"\n#include \"thread_group.hpp\"\n#include <assert.h>\n#include <stdint.h>\n\nnamespace internal\n{\n// Adaptor helpers to adapt GLSL access chain syntax to C++.\n// Don't bother with arrays of arrays on uniforms ...\n// Would likely need horribly complex variadic template munging.\n\ntemplate <typename T>\nstruct Interface\n{\n\tenum\n\t{\n\t\tArraySize = 1,\n\t\tSize = sizeof(T)\n\t};\n\n\tInterface()\n\t    : ptr(0)\n\t{\n\t}\n\tT &get()\n\t{\n\t\tassert(ptr);\n\t\treturn *ptr;\n\t}\n\n\tT *ptr;\n};\n\n// For array types, return a pointer instead.\ntemplate <typename T, unsigned U>\nstruct Interface<T[U]>\n{\n\tenum\n\t{\n\t\tArraySize = U,\n\t\tSize = U * sizeof(T)\n\t};\n\n\tInterface()\n\t    : ptr(0)\n\t{\n\t}\n\tT *get()\n\t{\n\t\tassert(ptr);\n\t\treturn ptr;\n\t}\n\n\tT *ptr;\n};\n\n// For case when array size is 1, avoid double dereference.\ntemplate <typename T>\nstruct PointerInterface\n{\n\tenum\n\t{\n\t\tArraySize = 1,\n\t\tSize = sizeof(T *)\n\t};\n\tenum\n\t{\n\t\tPreDereference = true\n\t};\n\n\tPointerInterface()\n\t    : ptr(0)\n\t{\n\t}\n\n\tT &get()\n\t{\n\t\tassert(ptr);\n\t\treturn *ptr;\n\t}\n\n\tT *ptr;\n};\n\n// Automatically converts a pointer down to reference to match GLSL syntax.\ntemplate <typename T>\nstruct DereferenceAdaptor\n{\n\tDereferenceAdaptor(T **ptr)\n\t    : ptr(ptr)\n\t{\n\t}\n\tT &operator[](unsigned index) const\n\t{\n\t\treturn *(ptr[index]);\n\t}\n\tT **ptr;\n};\n\n// We can't have a linear array of T* since T* can be an abstract type in case of samplers.\n// We also need a list of pointers since we can have run-time length SSBOs.\ntemplate <typename T, unsigned U>\nstruct PointerInterface<T[U]>\n{\n\tenum\n\t{\n\t\tArraySize = U,\n\t\tSize = sizeof(T *) * U\n\t};\n\tenum\n\t{\n\t\tPreDereference = false\n\t};\n\tPointerInterface()\n\t    : ptr(0)\n\t{\n\t}\n\n\tDereferenceAdaptor<T> get()\n\t{\n\t\tassert(ptr);\n\t\treturn DereferenceAdaptor<T>(ptr);\n\t}\n\n\tT **ptr;\n};\n\n// Resources can be more abstract and be unsized,\n// so we need to have an array of pointers for those cases.\ntemplate <typename T>\nstruct Resource : PointerInterface<T>\n{\n};\n\n// POD with no unknown sizes, so we can express these as flat arrays.\ntemplate <typename T>\nstruct UniformConstant : Interface<T>\n{\n};\ntemplate <typename T>\nstruct StageInput : Interface<T>\n{\n};\ntemplate <typename T>\nstruct StageOutput : Interface<T>\n{\n};\ntemplate <typename T>\nstruct PushConstant : Interface<T>\n{\n};\n}\n\nstruct spirv_cross_shader\n{\n\tstruct PPSize\n\t{\n\t\tPPSize()\n\t\t    : ptr(0)\n\t\t    , size(0)\n\t\t{\n\t\t}\n\t\tvoid **ptr;\n\t\tsize_t size;\n\t};\n\n\tstruct PPSizeResource\n\t{\n\t\tPPSizeResource()\n\t\t    : ptr(0)\n\t\t    , size(0)\n\t\t    , pre_dereference(false)\n\t\t{\n\t\t}\n\t\tvoid **ptr;\n\t\tsize_t size;\n\t\tbool pre_dereference;\n\t};\n\n\tPPSizeResource resources[SPIRV_CROSS_NUM_DESCRIPTOR_SETS][SPIRV_CROSS_NUM_DESCRIPTOR_BINDINGS];\n\tPPSize stage_inputs[SPIRV_CROSS_NUM_STAGE_INPUTS];\n\tPPSize stage_outputs[SPIRV_CROSS_NUM_STAGE_OUTPUTS];\n\tPPSize uniform_constants[SPIRV_CROSS_NUM_UNIFORM_CONSTANTS];\n\tPPSize push_constant;\n\tPPSize builtins[SPIRV_CROSS_NUM_BUILTINS];\n\n\ttemplate <typename U>\n\tvoid register_builtin(spirv_cross_builtin builtin, const U &value)\n\t{\n\t\tassert(!builtins[builtin].ptr);\n\n\t\tbuiltins[builtin].ptr = (void **)&value.ptr;\n\t\tbuiltins[builtin].size = sizeof(*value.ptr) * U::ArraySize;\n\t}\n\n\tvoid set_builtin(spirv_cross_builtin builtin, void *data, size_t size)\n\t{\n\t\tassert(builtins[builtin].ptr);\n\t\tassert(size >= builtins[builtin].size);\n\n\t\t*builtins[builtin].ptr = data;\n\t}\n\n\ttemplate <typename U>\n\tvoid register_resource(const internal::Resource<U> &value, unsigned set, unsigned binding)\n\t{\n\t\tassert(set < SPIRV_CROSS_NUM_DESCRIPTOR_SETS);\n\t\tassert(binding < SPIRV_CROSS_NUM_DESCRIPTOR_BINDINGS);\n\t\tassert(!resources[set][binding].ptr);\n\n\t\tresources[set][binding].ptr = (void **)&value.ptr;\n\t\tresources[set][binding].size = internal::Resource<U>::Size;\n\t\tresources[set][binding].pre_dereference = internal::Resource<U>::PreDereference;\n\t}\n\n\ttemplate <typename U>\n\tvoid register_stage_input(const internal::StageInput<U> &value, unsigned location)\n\t{\n\t\tassert(location < SPIRV_CROSS_NUM_STAGE_INPUTS);\n\t\tassert(!stage_inputs[location].ptr);\n\n\t\tstage_inputs[location].ptr = (void **)&value.ptr;\n\t\tstage_inputs[location].size = internal::StageInput<U>::Size;\n\t}\n\n\ttemplate <typename U>\n\tvoid register_stage_output(const internal::StageOutput<U> &value, unsigned location)\n\t{\n\t\tassert(location < SPIRV_CROSS_NUM_STAGE_OUTPUTS);\n\t\tassert(!stage_outputs[location].ptr);\n\n\t\tstage_outputs[location].ptr = (void **)&value.ptr;\n\t\tstage_outputs[location].size = internal::StageOutput<U>::Size;\n\t}\n\n\ttemplate <typename U>\n\tvoid register_uniform_constant(const internal::UniformConstant<U> &value, unsigned location)\n\t{\n\t\tassert(location < SPIRV_CROSS_NUM_UNIFORM_CONSTANTS);\n\t\tassert(!uniform_constants[location].ptr);\n\n\t\tuniform_constants[location].ptr = (void **)&value.ptr;\n\t\tuniform_constants[location].size = internal::UniformConstant<U>::Size;\n\t}\n\n\ttemplate <typename U>\n\tvoid register_push_constant(const internal::PushConstant<U> &value)\n\t{\n\t\tassert(!push_constant.ptr);\n\n\t\tpush_constant.ptr = (void **)&value.ptr;\n\t\tpush_constant.size = internal::PushConstant<U>::Size;\n\t}\n\n\tvoid set_stage_input(unsigned location, void *data, size_t size)\n\t{\n\t\tassert(location < SPIRV_CROSS_NUM_STAGE_INPUTS);\n\t\tassert(stage_inputs[location].ptr);\n\t\tassert(size >= stage_inputs[location].size);\n\n\t\t*stage_inputs[location].ptr = data;\n\t}\n\n\tvoid set_stage_output(unsigned location, void *data, size_t size)\n\t{\n\t\tassert(location < SPIRV_CROSS_NUM_STAGE_OUTPUTS);\n\t\tassert(stage_outputs[location].ptr);\n\t\tassert(size >= stage_outputs[location].size);\n\n\t\t*stage_outputs[location].ptr = data;\n\t}\n\n\tvoid set_uniform_constant(unsigned location, void *data, size_t size)\n\t{\n\t\tassert(location < SPIRV_CROSS_NUM_UNIFORM_CONSTANTS);\n\t\tassert(uniform_constants[location].ptr);\n\t\tassert(size >= uniform_constants[location].size);\n\n\t\t*uniform_constants[location].ptr = data;\n\t}\n\n\tvoid set_push_constant(void *data, size_t size)\n\t{\n\t\tassert(push_constant.ptr);\n\t\tassert(size >= push_constant.size);\n\n\t\t*push_constant.ptr = data;\n\t}\n\n\tvoid set_resource(unsigned set, unsigned binding, void **data, size_t size)\n\t{\n\t\tassert(set < SPIRV_CROSS_NUM_DESCRIPTOR_SETS);\n\t\tassert(binding < SPIRV_CROSS_NUM_DESCRIPTOR_BINDINGS);\n\t\tassert(resources[set][binding].ptr);\n\t\tassert(size >= resources[set][binding].size);\n\n\t\t// We're using the regular PointerInterface, dereference ahead of time.\n\t\tif (resources[set][binding].pre_dereference)\n\t\t\t*resources[set][binding].ptr = *data;\n\t\telse\n\t\t\t*resources[set][binding].ptr = data;\n\t}\n};\n\nnamespace spirv_cross\n{\ntemplate <typename T>\nstruct BaseShader : spirv_cross_shader\n{\n\tvoid invoke()\n\t{\n\t\tstatic_cast<T *>(this)->main();\n\t}\n};\n\nstruct FragmentResources\n{\n\tinternal::StageOutput<glm::vec4> gl_FragCoord;\n\tvoid init(spirv_cross_shader &s)\n\t{\n\t\ts.register_builtin(SPIRV_CROSS_BUILTIN_FRAG_COORD, gl_FragCoord);\n\t}\n#define gl_FragCoord __res->gl_FragCoord.get()\n};\n\ntemplate <typename T, typename Res>\nstruct FragmentShader : BaseShader<FragmentShader<T, Res>>\n{\n\tinline void main()\n\t{\n\t\timpl.main();\n\t}\n\n\tFragmentShader()\n\t{\n\t\tresources.init(*this);\n\t\timpl.__res = &resources;\n\t}\n\n\tT impl;\n\tRes resources;\n};\n\nstruct VertexResources\n{\n\tinternal::StageOutput<glm::vec4> gl_Position;\n\tvoid init(spirv_cross_shader &s)\n\t{\n\t\ts.register_builtin(SPIRV_CROSS_BUILTIN_POSITION, gl_Position);\n\t}\n#define gl_Position __res->gl_Position.get()\n};\n\ntemplate <typename T, typename Res>\nstruct VertexShader : BaseShader<VertexShader<T, Res>>\n{\n\tinline void main()\n\t{\n\t\timpl.main();\n\t}\n\n\tVertexShader()\n\t{\n\t\tresources.init(*this);\n\t\timpl.__res = &resources;\n\t}\n\n\tT impl;\n\tRes resources;\n};\n\nstruct TessEvaluationResources\n{\n\tinline void init(spirv_cross_shader &)\n\t{\n\t}\n};\n\ntemplate <typename T, typename Res>\nstruct TessEvaluationShader : BaseShader<TessEvaluationShader<T, Res>>\n{\n\tinline void main()\n\t{\n\t\timpl.main();\n\t}\n\n\tTessEvaluationShader()\n\t{\n\t\tresources.init(*this);\n\t\timpl.__res = &resources;\n\t}\n\n\tT impl;\n\tRes resources;\n};\n\nstruct TessControlResources\n{\n\tinline void init(spirv_cross_shader &)\n\t{\n\t}\n};\n\ntemplate <typename T, typename Res>\nstruct TessControlShader : BaseShader<TessControlShader<T, Res>>\n{\n\tinline void main()\n\t{\n\t\timpl.main();\n\t}\n\n\tTessControlShader()\n\t{\n\t\tresources.init(*this);\n\t\timpl.__res = &resources;\n\t}\n\n\tT impl;\n\tRes resources;\n};\n\nstruct GeometryResources\n{\n\tinline void init(spirv_cross_shader &)\n\t{\n\t}\n};\n\ntemplate <typename T, typename Res>\nstruct GeometryShader : BaseShader<GeometryShader<T, Res>>\n{\n\tinline void main()\n\t{\n\t\timpl.main();\n\t}\n\n\tGeometryShader()\n\t{\n\t\tresources.init(*this);\n\t\timpl.__res = &resources;\n\t}\n\n\tT impl;\n\tRes resources;\n};\n\nstruct ComputeResources\n{\n\tinternal::StageInput<glm::uvec3> gl_WorkGroupID__;\n\tinternal::StageInput<glm::uvec3> gl_NumWorkGroups__;\n\tvoid init(spirv_cross_shader &s)\n\t{\n\t\ts.register_builtin(SPIRV_CROSS_BUILTIN_WORK_GROUP_ID, gl_WorkGroupID__);\n\t\ts.register_builtin(SPIRV_CROSS_BUILTIN_NUM_WORK_GROUPS, gl_NumWorkGroups__);\n\t}\n#define gl_WorkGroupID __res->gl_WorkGroupID__.get()\n#define gl_NumWorkGroups __res->gl_NumWorkGroups__.get()\n\n\tBarrier barrier__;\n#define barrier() __res->barrier__.wait()\n};\n\nstruct ComputePrivateResources\n{\n\tuint32_t gl_LocalInvocationIndex__;\n#define gl_LocalInvocationIndex __priv_res.gl_LocalInvocationIndex__\n\tglm::uvec3 gl_LocalInvocationID__;\n#define gl_LocalInvocationID __priv_res.gl_LocalInvocationID__\n\tglm::uvec3 gl_GlobalInvocationID__;\n#define gl_GlobalInvocationID __priv_res.gl_GlobalInvocationID__\n};\n\ntemplate <typename T, typename Res, unsigned WorkGroupX, unsigned WorkGroupY, unsigned WorkGroupZ>\nstruct ComputeShader : BaseShader<ComputeShader<T, Res, WorkGroupX, WorkGroupY, WorkGroupZ>>\n{\n\tinline void main()\n\t{\n\t\tresources.barrier__.reset_counter();\n\n\t\tfor (unsigned z = 0; z < WorkGroupZ; z++)\n\t\t\tfor (unsigned y = 0; y < WorkGroupY; y++)\n\t\t\t\tfor (unsigned x = 0; x < WorkGroupX; x++)\n\t\t\t\t\timpl[z][y][x].__priv_res.gl_GlobalInvocationID__ =\n\t\t\t\t\t    glm::uvec3(WorkGroupX, WorkGroupY, WorkGroupZ) * resources.gl_WorkGroupID__.get() +\n\t\t\t\t\t    glm::uvec3(x, y, z);\n\n\t\tgroup.run();\n\t\tgroup.wait();\n\t}\n\n\tComputeShader()\n\t    : group(&impl[0][0][0])\n\t{\n\t\tresources.init(*this);\n\t\tresources.barrier__.set_release_divisor(WorkGroupX * WorkGroupY * WorkGroupZ);\n\n\t\tunsigned i = 0;\n\t\tfor (unsigned z = 0; z < WorkGroupZ; z++)\n\t\t{\n\t\t\tfor (unsigned y = 0; y < WorkGroupY; y++)\n\t\t\t{\n\t\t\t\tfor (unsigned x = 0; x < WorkGroupX; x++)\n\t\t\t\t{\n\t\t\t\t\timpl[z][y][x].__priv_res.gl_LocalInvocationID__ = glm::uvec3(x, y, z);\n\t\t\t\t\timpl[z][y][x].__priv_res.gl_LocalInvocationIndex__ = i++;\n\t\t\t\t\timpl[z][y][x].__res = &resources;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tT impl[WorkGroupZ][WorkGroupY][WorkGroupX];\n\tThreadGroup<T, WorkGroupX * WorkGroupY * WorkGroupZ> group;\n\tRes resources;\n};\n\ninline void memoryBarrierShared()\n{\n\tBarrier::memoryBarrier();\n}\ninline void memoryBarrier()\n{\n\tBarrier::memoryBarrier();\n}\n// TODO: Rest of the barriers.\n\n// Atomics\ntemplate <typename T>\ninline T atomicAdd(T &v, T a)\n{\n\tstatic_assert(sizeof(std::atomic<T>) == sizeof(T), \"Cannot cast properly to std::atomic<T>.\");\n\n\t// We need explicit memory barriers in GLSL to enfore any ordering.\n\t// FIXME: Can we really cast this? There is no other way I think ...\n\treturn std::atomic_fetch_add_explicit(reinterpret_cast<std::atomic<T> *>(&v), a, std::memory_order_relaxed);\n}\n}\n\nvoid spirv_cross_set_stage_input(spirv_cross_shader_t *shader, unsigned location, void *data, size_t size)\n{\n\tshader->set_stage_input(location, data, size);\n}\n\nvoid spirv_cross_set_stage_output(spirv_cross_shader_t *shader, unsigned location, void *data, size_t size)\n{\n\tshader->set_stage_output(location, data, size);\n}\n\nvoid spirv_cross_set_uniform_constant(spirv_cross_shader_t *shader, unsigned location, void *data, size_t size)\n{\n\tshader->set_uniform_constant(location, data, size);\n}\n\nvoid spirv_cross_set_resource(spirv_cross_shader_t *shader, unsigned set, unsigned binding, void **data, size_t size)\n{\n\tshader->set_resource(set, binding, data, size);\n}\n\nvoid spirv_cross_set_push_constant(spirv_cross_shader_t *shader, void *data, size_t size)\n{\n\tshader->set_push_constant(data, size);\n}\n\nvoid spirv_cross_set_builtin(spirv_cross_shader_t *shader, spirv_cross_builtin builtin, void *data, size_t size)\n{\n\tshader->set_builtin(builtin, data, size);\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/spirv_cross/include/spirv_cross/sampler.hpp",
    "content": "/*\n * Copyright 2015-2017 ARM Limited\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef SPIRV_CROSS_SAMPLER_HPP\n#define SPIRV_CROSS_SAMPLER_HPP\n\n#include <vector>\n\nnamespace spirv_cross\n{\nstruct spirv_cross_sampler_2d\n{\n\tinline virtual ~spirv_cross_sampler_2d()\n\t{\n\t}\n};\n\ntemplate <typename T>\nstruct sampler2DBase : spirv_cross_sampler_2d\n{\n\tsampler2DBase(const spirv_cross_sampler_info *info)\n\t{\n\t\tmips.insert(mips.end(), info->mipmaps, info->mipmaps + info->num_mipmaps);\n\t\tformat = info->format;\n\t\twrap_s = info->wrap_s;\n\t\twrap_t = info->wrap_t;\n\t\tmin_filter = info->min_filter;\n\t\tmag_filter = info->mag_filter;\n\t\tmip_filter = info->mip_filter;\n\t}\n\n\tinline virtual T sample(glm::vec2 uv, float bias)\n\t{\n\t\treturn sampleLod(uv, bias);\n\t}\n\n\tinline virtual T sampleLod(glm::vec2 uv, float lod)\n\t{\n\t\tif (mag_filter == SPIRV_CROSS_FILTER_NEAREST)\n\t\t{\n\t\t\tuv.x = wrap(uv.x, wrap_s, mips[0].width);\n\t\t\tuv.y = wrap(uv.y, wrap_t, mips[0].height);\n\t\t\tglm::vec2 uv_full = uv * glm::vec2(mips[0].width, mips[0].height);\n\n\t\t\tint x = int(uv_full.x);\n\t\t\tint y = int(uv_full.y);\n\t\t\treturn sample(x, y, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn T(0, 0, 0, 1);\n\t\t}\n\t}\n\n\tinline float wrap(float v, spirv_cross_wrap wrap, unsigned size)\n\t{\n\t\tswitch (wrap)\n\t\t{\n\t\tcase SPIRV_CROSS_WRAP_REPEAT:\n\t\t\treturn v - glm::floor(v);\n\t\tcase SPIRV_CROSS_WRAP_CLAMP_TO_EDGE:\n\t\t{\n\t\t\tfloat half = 0.5f / size;\n\t\t\treturn glm::clamp(v, half, 1.0f - half);\n\t\t}\n\n\t\tdefault:\n\t\t\treturn 0.0f;\n\t\t}\n\t}\n\n\tstd::vector<spirv_cross_miplevel> mips;\n\tspirv_cross_format format;\n\tspirv_cross_wrap wrap_s;\n\tspirv_cross_wrap wrap_t;\n\tspirv_cross_filter min_filter;\n\tspirv_cross_filter mag_filter;\n\tspirv_cross_mipfilter mip_filter;\n};\n\ntypedef sampler2DBase<glm::vec4> sampler2D;\ntypedef sampler2DBase<glm::ivec4> isampler2D;\ntypedef sampler2DBase<glm::uvec4> usampler2D;\n\ntemplate <typename T>\ninline T texture(const sampler2DBase<T> &samp, const glm::vec2 &uv, float bias = 0.0f)\n{\n\treturn samp.sample(uv, bias);\n}\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/spirv_cross/include/spirv_cross/thread_group.hpp",
    "content": "/*\n * Copyright 2015-2017 ARM Limited\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef SPIRV_CROSS_THREAD_GROUP_HPP\n#define SPIRV_CROSS_THREAD_GROUP_HPP\n\n#include <condition_variable>\n#include <mutex>\n#include <thread>\n\nnamespace spirv_cross\n{\ntemplate <typename T, unsigned Size>\nclass ThreadGroup\n{\npublic:\n\tThreadGroup(T *impl)\n\t{\n\t\tfor (unsigned i = 0; i < Size; i++)\n\t\t\tworkers[i].start(&impl[i]);\n\t}\n\n\tvoid run()\n\t{\n\t\tfor (auto &worker : workers)\n\t\t\tworker.run();\n\t}\n\n\tvoid wait()\n\t{\n\t\tfor (auto &worker : workers)\n\t\t\tworker.wait();\n\t}\n\nprivate:\n\tstruct Thread\n\t{\n\t\tenum State\n\t\t{\n\t\t\tIdle,\n\t\t\tRunning,\n\t\t\tDying\n\t\t};\n\t\tState state = Idle;\n\n\t\tvoid start(T *impl)\n\t\t{\n\t\t\tworker = std::thread([impl, this] {\n\t\t\t\tfor (;;)\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tstd::unique_lock<std::mutex> l{ lock };\n\t\t\t\t\t\tcond.wait(l, [this] { return state != Idle; });\n\t\t\t\t\t\tif (state == Dying)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\timpl->main();\n\n\t\t\t\t\tstd::lock_guard<std::mutex> l{ lock };\n\t\t\t\t\tstate = Idle;\n\t\t\t\t\tcond.notify_one();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tvoid wait()\n\t\t{\n\t\t\tstd::unique_lock<std::mutex> l{ lock };\n\t\t\tcond.wait(l, [this] { return state == Idle; });\n\t\t}\n\n\t\tvoid run()\n\t\t{\n\t\t\tstd::lock_guard<std::mutex> l{ lock };\n\t\t\tstate = Running;\n\t\t\tcond.notify_one();\n\t\t}\n\n\t\t~Thread()\n\t\t{\n\t\t\tif (worker.joinable())\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tstd::lock_guard<std::mutex> l{ lock };\n\t\t\t\t\tstate = Dying;\n\t\t\t\t\tcond.notify_one();\n\t\t\t\t}\n\t\t\t\tworker.join();\n\t\t\t}\n\t\t}\n\t\tstd::thread worker;\n\t\tstd::condition_variable cond;\n\t\tstd::mutex lock;\n\t};\n\tThread workers[Size];\n};\n}\n\n#endif\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv.hpp",
    "content": "// Copyright (c) 2014-2020 The Khronos Group Inc.\n// \n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and/or associated documentation files (the \"Materials\"),\n// to deal in the Materials without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n// and/or sell copies of the Materials, and to permit persons to whom the\n// Materials are furnished to do so, subject to the following conditions:\n// \n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Materials.\n// \n// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS\n// STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND\n// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ \n// \n// THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS\n// IN THE MATERIALS.\n\n// This header is automatically generated by the same tool that creates\n// the Binary Section of the SPIR-V specification.\n\n// Enumeration tokens for SPIR-V, in various styles:\n//   C, C++, C++11, JSON, Lua, Python, C#, D, Beef\n// \n// - C will have tokens with a \"Spv\" prefix, e.g.: SpvSourceLanguageGLSL\n// - C++ will have tokens in the \"spv\" name space, e.g.: spv::SourceLanguageGLSL\n// - C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL\n// - Lua will use tables, e.g.: spv.SourceLanguage.GLSL\n// - Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL']\n// - C# will use enum classes in the Specification class located in the \"Spv\" namespace,\n//     e.g.: Spv.Specification.SourceLanguage.GLSL\n// - D will have tokens under the \"spv\" module, e.g: spv.SourceLanguage.GLSL\n// - Beef will use enum classes in the Specification class located in the \"Spv\" namespace,\n//     e.g.: Spv.Specification.SourceLanguage.GLSL\n// \n// Some tokens act like mask values, which can be OR'd together,\n// while others are mutually exclusive.  The mask-like ones have\n// \"Mask\" in their name, and a parallel enum that has the shift\n// amount (1 << x) for each corresponding enumerant.\n\n#ifndef spirv_HPP\n#define spirv_HPP\n\nnamespace spv {\n\ntypedef unsigned int Id;\n\n#define SPV_VERSION 0x10600\n#define SPV_REVISION 1\n\nstatic const unsigned int MagicNumber = 0x07230203;\nstatic const unsigned int Version = 0x00010600;\nstatic const unsigned int Revision = 1;\nstatic const unsigned int OpCodeMask = 0xffff;\nstatic const unsigned int WordCountShift = 16;\n\nenum SourceLanguage {\n    SourceLanguageUnknown = 0,\n    SourceLanguageESSL = 1,\n    SourceLanguageGLSL = 2,\n    SourceLanguageOpenCL_C = 3,\n    SourceLanguageOpenCL_CPP = 4,\n    SourceLanguageHLSL = 5,\n    SourceLanguageCPP_for_OpenCL = 6,\n    SourceLanguageSYCL = 7,\n    SourceLanguageMax = 0x7fffffff,\n};\n\nenum ExecutionModel {\n    ExecutionModelVertex = 0,\n    ExecutionModelTessellationControl = 1,\n    ExecutionModelTessellationEvaluation = 2,\n    ExecutionModelGeometry = 3,\n    ExecutionModelFragment = 4,\n    ExecutionModelGLCompute = 5,\n    ExecutionModelKernel = 6,\n    ExecutionModelTaskNV = 5267,\n    ExecutionModelMeshNV = 5268,\n    ExecutionModelRayGenerationKHR = 5313,\n    ExecutionModelRayGenerationNV = 5313,\n    ExecutionModelIntersectionKHR = 5314,\n    ExecutionModelIntersectionNV = 5314,\n    ExecutionModelAnyHitKHR = 5315,\n    ExecutionModelAnyHitNV = 5315,\n    ExecutionModelClosestHitKHR = 5316,\n    ExecutionModelClosestHitNV = 5316,\n    ExecutionModelMissKHR = 5317,\n    ExecutionModelMissNV = 5317,\n    ExecutionModelCallableKHR = 5318,\n    ExecutionModelCallableNV = 5318,\n    ExecutionModelTaskEXT = 5364,\n    ExecutionModelMeshEXT = 5365,\n    ExecutionModelMax = 0x7fffffff,\n};\n\nenum AddressingModel {\n    AddressingModelLogical = 0,\n    AddressingModelPhysical32 = 1,\n    AddressingModelPhysical64 = 2,\n    AddressingModelPhysicalStorageBuffer64 = 5348,\n    AddressingModelPhysicalStorageBuffer64EXT = 5348,\n    AddressingModelMax = 0x7fffffff,\n};\n\nenum MemoryModel {\n    MemoryModelSimple = 0,\n    MemoryModelGLSL450 = 1,\n    MemoryModelOpenCL = 2,\n    MemoryModelVulkan = 3,\n    MemoryModelVulkanKHR = 3,\n    MemoryModelMax = 0x7fffffff,\n};\n\nenum ExecutionMode {\n    ExecutionModeInvocations = 0,\n    ExecutionModeSpacingEqual = 1,\n    ExecutionModeSpacingFractionalEven = 2,\n    ExecutionModeSpacingFractionalOdd = 3,\n    ExecutionModeVertexOrderCw = 4,\n    ExecutionModeVertexOrderCcw = 5,\n    ExecutionModePixelCenterInteger = 6,\n    ExecutionModeOriginUpperLeft = 7,\n    ExecutionModeOriginLowerLeft = 8,\n    ExecutionModeEarlyFragmentTests = 9,\n    ExecutionModePointMode = 10,\n    ExecutionModeXfb = 11,\n    ExecutionModeDepthReplacing = 12,\n    ExecutionModeDepthGreater = 14,\n    ExecutionModeDepthLess = 15,\n    ExecutionModeDepthUnchanged = 16,\n    ExecutionModeLocalSize = 17,\n    ExecutionModeLocalSizeHint = 18,\n    ExecutionModeInputPoints = 19,\n    ExecutionModeInputLines = 20,\n    ExecutionModeInputLinesAdjacency = 21,\n    ExecutionModeTriangles = 22,\n    ExecutionModeInputTrianglesAdjacency = 23,\n    ExecutionModeQuads = 24,\n    ExecutionModeIsolines = 25,\n    ExecutionModeOutputVertices = 26,\n    ExecutionModeOutputPoints = 27,\n    ExecutionModeOutputLineStrip = 28,\n    ExecutionModeOutputTriangleStrip = 29,\n    ExecutionModeVecTypeHint = 30,\n    ExecutionModeContractionOff = 31,\n    ExecutionModeInitializer = 33,\n    ExecutionModeFinalizer = 34,\n    ExecutionModeSubgroupSize = 35,\n    ExecutionModeSubgroupsPerWorkgroup = 36,\n    ExecutionModeSubgroupsPerWorkgroupId = 37,\n    ExecutionModeLocalSizeId = 38,\n    ExecutionModeLocalSizeHintId = 39,\n    ExecutionModeSubgroupUniformControlFlowKHR = 4421,\n    ExecutionModePostDepthCoverage = 4446,\n    ExecutionModeDenormPreserve = 4459,\n    ExecutionModeDenormFlushToZero = 4460,\n    ExecutionModeSignedZeroInfNanPreserve = 4461,\n    ExecutionModeRoundingModeRTE = 4462,\n    ExecutionModeRoundingModeRTZ = 4463,\n    ExecutionModeEarlyAndLateFragmentTestsAMD = 5017,\n    ExecutionModeStencilRefReplacingEXT = 5027,\n    ExecutionModeStencilRefUnchangedFrontAMD = 5079,\n    ExecutionModeStencilRefGreaterFrontAMD = 5080,\n    ExecutionModeStencilRefLessFrontAMD = 5081,\n    ExecutionModeStencilRefUnchangedBackAMD = 5082,\n    ExecutionModeStencilRefGreaterBackAMD = 5083,\n    ExecutionModeStencilRefLessBackAMD = 5084,\n    ExecutionModeOutputLinesEXT = 5269,\n    ExecutionModeOutputLinesNV = 5269,\n    ExecutionModeOutputPrimitivesEXT = 5270,\n    ExecutionModeOutputPrimitivesNV = 5270,\n    ExecutionModeDerivativeGroupQuadsNV = 5289,\n    ExecutionModeDerivativeGroupLinearNV = 5290,\n    ExecutionModeOutputTrianglesEXT = 5298,\n    ExecutionModeOutputTrianglesNV = 5298,\n    ExecutionModePixelInterlockOrderedEXT = 5366,\n    ExecutionModePixelInterlockUnorderedEXT = 5367,\n    ExecutionModeSampleInterlockOrderedEXT = 5368,\n    ExecutionModeSampleInterlockUnorderedEXT = 5369,\n    ExecutionModeShadingRateInterlockOrderedEXT = 5370,\n    ExecutionModeShadingRateInterlockUnorderedEXT = 5371,\n    ExecutionModeSharedLocalMemorySizeINTEL = 5618,\n    ExecutionModeRoundingModeRTPINTEL = 5620,\n    ExecutionModeRoundingModeRTNINTEL = 5621,\n    ExecutionModeFloatingPointModeALTINTEL = 5622,\n    ExecutionModeFloatingPointModeIEEEINTEL = 5623,\n    ExecutionModeMaxWorkgroupSizeINTEL = 5893,\n    ExecutionModeMaxWorkDimINTEL = 5894,\n    ExecutionModeNoGlobalOffsetINTEL = 5895,\n    ExecutionModeNumSIMDWorkitemsINTEL = 5896,\n    ExecutionModeSchedulerTargetFmaxMhzINTEL = 5903,\n    ExecutionModeNamedBarrierCountINTEL = 6417,\n    ExecutionModeMax = 0x7fffffff,\n};\n\nenum StorageClass {\n    StorageClassUniformConstant = 0,\n    StorageClassInput = 1,\n    StorageClassUniform = 2,\n    StorageClassOutput = 3,\n    StorageClassWorkgroup = 4,\n    StorageClassCrossWorkgroup = 5,\n    StorageClassPrivate = 6,\n    StorageClassFunction = 7,\n    StorageClassGeneric = 8,\n    StorageClassPushConstant = 9,\n    StorageClassAtomicCounter = 10,\n    StorageClassImage = 11,\n    StorageClassStorageBuffer = 12,\n    StorageClassCallableDataKHR = 5328,\n    StorageClassCallableDataNV = 5328,\n    StorageClassIncomingCallableDataKHR = 5329,\n    StorageClassIncomingCallableDataNV = 5329,\n    StorageClassRayPayloadKHR = 5338,\n    StorageClassRayPayloadNV = 5338,\n    StorageClassHitAttributeKHR = 5339,\n    StorageClassHitAttributeNV = 5339,\n    StorageClassIncomingRayPayloadKHR = 5342,\n    StorageClassIncomingRayPayloadNV = 5342,\n    StorageClassShaderRecordBufferKHR = 5343,\n    StorageClassShaderRecordBufferNV = 5343,\n    StorageClassPhysicalStorageBuffer = 5349,\n    StorageClassPhysicalStorageBufferEXT = 5349,\n    StorageClassTaskPayloadWorkgroupEXT = 5402,\n    StorageClassCodeSectionINTEL = 5605,\n    StorageClassDeviceOnlyINTEL = 5936,\n    StorageClassHostOnlyINTEL = 5937,\n    StorageClassMax = 0x7fffffff,\n};\n\nenum Dim {\n    Dim1D = 0,\n    Dim2D = 1,\n    Dim3D = 2,\n    DimCube = 3,\n    DimRect = 4,\n    DimBuffer = 5,\n    DimSubpassData = 6,\n    DimMax = 0x7fffffff,\n};\n\nenum SamplerAddressingMode {\n    SamplerAddressingModeNone = 0,\n    SamplerAddressingModeClampToEdge = 1,\n    SamplerAddressingModeClamp = 2,\n    SamplerAddressingModeRepeat = 3,\n    SamplerAddressingModeRepeatMirrored = 4,\n    SamplerAddressingModeMax = 0x7fffffff,\n};\n\nenum SamplerFilterMode {\n    SamplerFilterModeNearest = 0,\n    SamplerFilterModeLinear = 1,\n    SamplerFilterModeMax = 0x7fffffff,\n};\n\nenum ImageFormat {\n    ImageFormatUnknown = 0,\n    ImageFormatRgba32f = 1,\n    ImageFormatRgba16f = 2,\n    ImageFormatR32f = 3,\n    ImageFormatRgba8 = 4,\n    ImageFormatRgba8Snorm = 5,\n    ImageFormatRg32f = 6,\n    ImageFormatRg16f = 7,\n    ImageFormatR11fG11fB10f = 8,\n    ImageFormatR16f = 9,\n    ImageFormatRgba16 = 10,\n    ImageFormatRgb10A2 = 11,\n    ImageFormatRg16 = 12,\n    ImageFormatRg8 = 13,\n    ImageFormatR16 = 14,\n    ImageFormatR8 = 15,\n    ImageFormatRgba16Snorm = 16,\n    ImageFormatRg16Snorm = 17,\n    ImageFormatRg8Snorm = 18,\n    ImageFormatR16Snorm = 19,\n    ImageFormatR8Snorm = 20,\n    ImageFormatRgba32i = 21,\n    ImageFormatRgba16i = 22,\n    ImageFormatRgba8i = 23,\n    ImageFormatR32i = 24,\n    ImageFormatRg32i = 25,\n    ImageFormatRg16i = 26,\n    ImageFormatRg8i = 27,\n    ImageFormatR16i = 28,\n    ImageFormatR8i = 29,\n    ImageFormatRgba32ui = 30,\n    ImageFormatRgba16ui = 31,\n    ImageFormatRgba8ui = 32,\n    ImageFormatR32ui = 33,\n    ImageFormatRgb10a2ui = 34,\n    ImageFormatRg32ui = 35,\n    ImageFormatRg16ui = 36,\n    ImageFormatRg8ui = 37,\n    ImageFormatR16ui = 38,\n    ImageFormatR8ui = 39,\n    ImageFormatR64ui = 40,\n    ImageFormatR64i = 41,\n    ImageFormatMax = 0x7fffffff,\n};\n\nenum ImageChannelOrder {\n    ImageChannelOrderR = 0,\n    ImageChannelOrderA = 1,\n    ImageChannelOrderRG = 2,\n    ImageChannelOrderRA = 3,\n    ImageChannelOrderRGB = 4,\n    ImageChannelOrderRGBA = 5,\n    ImageChannelOrderBGRA = 6,\n    ImageChannelOrderARGB = 7,\n    ImageChannelOrderIntensity = 8,\n    ImageChannelOrderLuminance = 9,\n    ImageChannelOrderRx = 10,\n    ImageChannelOrderRGx = 11,\n    ImageChannelOrderRGBx = 12,\n    ImageChannelOrderDepth = 13,\n    ImageChannelOrderDepthStencil = 14,\n    ImageChannelOrdersRGB = 15,\n    ImageChannelOrdersRGBx = 16,\n    ImageChannelOrdersRGBA = 17,\n    ImageChannelOrdersBGRA = 18,\n    ImageChannelOrderABGR = 19,\n    ImageChannelOrderMax = 0x7fffffff,\n};\n\nenum ImageChannelDataType {\n    ImageChannelDataTypeSnormInt8 = 0,\n    ImageChannelDataTypeSnormInt16 = 1,\n    ImageChannelDataTypeUnormInt8 = 2,\n    ImageChannelDataTypeUnormInt16 = 3,\n    ImageChannelDataTypeUnormShort565 = 4,\n    ImageChannelDataTypeUnormShort555 = 5,\n    ImageChannelDataTypeUnormInt101010 = 6,\n    ImageChannelDataTypeSignedInt8 = 7,\n    ImageChannelDataTypeSignedInt16 = 8,\n    ImageChannelDataTypeSignedInt32 = 9,\n    ImageChannelDataTypeUnsignedInt8 = 10,\n    ImageChannelDataTypeUnsignedInt16 = 11,\n    ImageChannelDataTypeUnsignedInt32 = 12,\n    ImageChannelDataTypeHalfFloat = 13,\n    ImageChannelDataTypeFloat = 14,\n    ImageChannelDataTypeUnormInt24 = 15,\n    ImageChannelDataTypeUnormInt101010_2 = 16,\n    ImageChannelDataTypeMax = 0x7fffffff,\n};\n\nenum ImageOperandsShift {\n    ImageOperandsBiasShift = 0,\n    ImageOperandsLodShift = 1,\n    ImageOperandsGradShift = 2,\n    ImageOperandsConstOffsetShift = 3,\n    ImageOperandsOffsetShift = 4,\n    ImageOperandsConstOffsetsShift = 5,\n    ImageOperandsSampleShift = 6,\n    ImageOperandsMinLodShift = 7,\n    ImageOperandsMakeTexelAvailableShift = 8,\n    ImageOperandsMakeTexelAvailableKHRShift = 8,\n    ImageOperandsMakeTexelVisibleShift = 9,\n    ImageOperandsMakeTexelVisibleKHRShift = 9,\n    ImageOperandsNonPrivateTexelShift = 10,\n    ImageOperandsNonPrivateTexelKHRShift = 10,\n    ImageOperandsVolatileTexelShift = 11,\n    ImageOperandsVolatileTexelKHRShift = 11,\n    ImageOperandsSignExtendShift = 12,\n    ImageOperandsZeroExtendShift = 13,\n    ImageOperandsNontemporalShift = 14,\n    ImageOperandsOffsetsShift = 16,\n    ImageOperandsMax = 0x7fffffff,\n};\n\nenum ImageOperandsMask {\n    ImageOperandsMaskNone = 0,\n    ImageOperandsBiasMask = 0x00000001,\n    ImageOperandsLodMask = 0x00000002,\n    ImageOperandsGradMask = 0x00000004,\n    ImageOperandsConstOffsetMask = 0x00000008,\n    ImageOperandsOffsetMask = 0x00000010,\n    ImageOperandsConstOffsetsMask = 0x00000020,\n    ImageOperandsSampleMask = 0x00000040,\n    ImageOperandsMinLodMask = 0x00000080,\n    ImageOperandsMakeTexelAvailableMask = 0x00000100,\n    ImageOperandsMakeTexelAvailableKHRMask = 0x00000100,\n    ImageOperandsMakeTexelVisibleMask = 0x00000200,\n    ImageOperandsMakeTexelVisibleKHRMask = 0x00000200,\n    ImageOperandsNonPrivateTexelMask = 0x00000400,\n    ImageOperandsNonPrivateTexelKHRMask = 0x00000400,\n    ImageOperandsVolatileTexelMask = 0x00000800,\n    ImageOperandsVolatileTexelKHRMask = 0x00000800,\n    ImageOperandsSignExtendMask = 0x00001000,\n    ImageOperandsZeroExtendMask = 0x00002000,\n    ImageOperandsNontemporalMask = 0x00004000,\n    ImageOperandsOffsetsMask = 0x00010000,\n};\n\nenum FPFastMathModeShift {\n    FPFastMathModeNotNaNShift = 0,\n    FPFastMathModeNotInfShift = 1,\n    FPFastMathModeNSZShift = 2,\n    FPFastMathModeAllowRecipShift = 3,\n    FPFastMathModeFastShift = 4,\n    FPFastMathModeAllowContractFastINTELShift = 16,\n    FPFastMathModeAllowReassocINTELShift = 17,\n    FPFastMathModeMax = 0x7fffffff,\n};\n\nenum FPFastMathModeMask {\n    FPFastMathModeMaskNone = 0,\n    FPFastMathModeNotNaNMask = 0x00000001,\n    FPFastMathModeNotInfMask = 0x00000002,\n    FPFastMathModeNSZMask = 0x00000004,\n    FPFastMathModeAllowRecipMask = 0x00000008,\n    FPFastMathModeFastMask = 0x00000010,\n    FPFastMathModeAllowContractFastINTELMask = 0x00010000,\n    FPFastMathModeAllowReassocINTELMask = 0x00020000,\n};\n\nenum FPRoundingMode {\n    FPRoundingModeRTE = 0,\n    FPRoundingModeRTZ = 1,\n    FPRoundingModeRTP = 2,\n    FPRoundingModeRTN = 3,\n    FPRoundingModeMax = 0x7fffffff,\n};\n\nenum LinkageType {\n    LinkageTypeExport = 0,\n    LinkageTypeImport = 1,\n    LinkageTypeLinkOnceODR = 2,\n    LinkageTypeMax = 0x7fffffff,\n};\n\nenum AccessQualifier {\n    AccessQualifierReadOnly = 0,\n    AccessQualifierWriteOnly = 1,\n    AccessQualifierReadWrite = 2,\n    AccessQualifierMax = 0x7fffffff,\n};\n\nenum FunctionParameterAttribute {\n    FunctionParameterAttributeZext = 0,\n    FunctionParameterAttributeSext = 1,\n    FunctionParameterAttributeByVal = 2,\n    FunctionParameterAttributeSret = 3,\n    FunctionParameterAttributeNoAlias = 4,\n    FunctionParameterAttributeNoCapture = 5,\n    FunctionParameterAttributeNoWrite = 6,\n    FunctionParameterAttributeNoReadWrite = 7,\n    FunctionParameterAttributeMax = 0x7fffffff,\n};\n\nenum Decoration {\n    DecorationRelaxedPrecision = 0,\n    DecorationSpecId = 1,\n    DecorationBlock = 2,\n    DecorationBufferBlock = 3,\n    DecorationRowMajor = 4,\n    DecorationColMajor = 5,\n    DecorationArrayStride = 6,\n    DecorationMatrixStride = 7,\n    DecorationGLSLShared = 8,\n    DecorationGLSLPacked = 9,\n    DecorationCPacked = 10,\n    DecorationBuiltIn = 11,\n    DecorationNoPerspective = 13,\n    DecorationFlat = 14,\n    DecorationPatch = 15,\n    DecorationCentroid = 16,\n    DecorationSample = 17,\n    DecorationInvariant = 18,\n    DecorationRestrict = 19,\n    DecorationAliased = 20,\n    DecorationVolatile = 21,\n    DecorationConstant = 22,\n    DecorationCoherent = 23,\n    DecorationNonWritable = 24,\n    DecorationNonReadable = 25,\n    DecorationUniform = 26,\n    DecorationUniformId = 27,\n    DecorationSaturatedConversion = 28,\n    DecorationStream = 29,\n    DecorationLocation = 30,\n    DecorationComponent = 31,\n    DecorationIndex = 32,\n    DecorationBinding = 33,\n    DecorationDescriptorSet = 34,\n    DecorationOffset = 35,\n    DecorationXfbBuffer = 36,\n    DecorationXfbStride = 37,\n    DecorationFuncParamAttr = 38,\n    DecorationFPRoundingMode = 39,\n    DecorationFPFastMathMode = 40,\n    DecorationLinkageAttributes = 41,\n    DecorationNoContraction = 42,\n    DecorationInputAttachmentIndex = 43,\n    DecorationAlignment = 44,\n    DecorationMaxByteOffset = 45,\n    DecorationAlignmentId = 46,\n    DecorationMaxByteOffsetId = 47,\n    DecorationNoSignedWrap = 4469,\n    DecorationNoUnsignedWrap = 4470,\n    DecorationExplicitInterpAMD = 4999,\n    DecorationOverrideCoverageNV = 5248,\n    DecorationPassthroughNV = 5250,\n    DecorationViewportRelativeNV = 5252,\n    DecorationSecondaryViewportRelativeNV = 5256,\n    DecorationPerPrimitiveEXT = 5271,\n    DecorationPerPrimitiveNV = 5271,\n    DecorationPerViewNV = 5272,\n    DecorationPerTaskNV = 5273,\n    DecorationPerVertexKHR = 5285,\n    DecorationPerVertexNV = 5285,\n    DecorationNonUniform = 5300,\n    DecorationNonUniformEXT = 5300,\n    DecorationRestrictPointer = 5355,\n    DecorationRestrictPointerEXT = 5355,\n    DecorationAliasedPointer = 5356,\n    DecorationAliasedPointerEXT = 5356,\n    DecorationBindlessSamplerNV = 5398,\n    DecorationBindlessImageNV = 5399,\n    DecorationBoundSamplerNV = 5400,\n    DecorationBoundImageNV = 5401,\n    DecorationSIMTCallINTEL = 5599,\n    DecorationReferencedIndirectlyINTEL = 5602,\n    DecorationClobberINTEL = 5607,\n    DecorationSideEffectsINTEL = 5608,\n    DecorationVectorComputeVariableINTEL = 5624,\n    DecorationFuncParamIOKindINTEL = 5625,\n    DecorationVectorComputeFunctionINTEL = 5626,\n    DecorationStackCallINTEL = 5627,\n    DecorationGlobalVariableOffsetINTEL = 5628,\n    DecorationCounterBuffer = 5634,\n    DecorationHlslCounterBufferGOOGLE = 5634,\n    DecorationHlslSemanticGOOGLE = 5635,\n    DecorationUserSemantic = 5635,\n    DecorationUserTypeGOOGLE = 5636,\n    DecorationFunctionRoundingModeINTEL = 5822,\n    DecorationFunctionDenormModeINTEL = 5823,\n    DecorationRegisterINTEL = 5825,\n    DecorationMemoryINTEL = 5826,\n    DecorationNumbanksINTEL = 5827,\n    DecorationBankwidthINTEL = 5828,\n    DecorationMaxPrivateCopiesINTEL = 5829,\n    DecorationSinglepumpINTEL = 5830,\n    DecorationDoublepumpINTEL = 5831,\n    DecorationMaxReplicatesINTEL = 5832,\n    DecorationSimpleDualPortINTEL = 5833,\n    DecorationMergeINTEL = 5834,\n    DecorationBankBitsINTEL = 5835,\n    DecorationForcePow2DepthINTEL = 5836,\n    DecorationBurstCoalesceINTEL = 5899,\n    DecorationCacheSizeINTEL = 5900,\n    DecorationDontStaticallyCoalesceINTEL = 5901,\n    DecorationPrefetchINTEL = 5902,\n    DecorationStallEnableINTEL = 5905,\n    DecorationFuseLoopsInFunctionINTEL = 5907,\n    DecorationAliasScopeINTEL = 5914,\n    DecorationNoAliasINTEL = 5915,\n    DecorationBufferLocationINTEL = 5921,\n    DecorationIOPipeStorageINTEL = 5944,\n    DecorationFunctionFloatingPointModeINTEL = 6080,\n    DecorationSingleElementVectorINTEL = 6085,\n    DecorationVectorComputeCallableFunctionINTEL = 6087,\n    DecorationMediaBlockIOINTEL = 6140,\n    DecorationMax = 0x7fffffff,\n};\n\nenum BuiltIn {\n    BuiltInPosition = 0,\n    BuiltInPointSize = 1,\n    BuiltInClipDistance = 3,\n    BuiltInCullDistance = 4,\n    BuiltInVertexId = 5,\n    BuiltInInstanceId = 6,\n    BuiltInPrimitiveId = 7,\n    BuiltInInvocationId = 8,\n    BuiltInLayer = 9,\n    BuiltInViewportIndex = 10,\n    BuiltInTessLevelOuter = 11,\n    BuiltInTessLevelInner = 12,\n    BuiltInTessCoord = 13,\n    BuiltInPatchVertices = 14,\n    BuiltInFragCoord = 15,\n    BuiltInPointCoord = 16,\n    BuiltInFrontFacing = 17,\n    BuiltInSampleId = 18,\n    BuiltInSamplePosition = 19,\n    BuiltInSampleMask = 20,\n    BuiltInFragDepth = 22,\n    BuiltInHelperInvocation = 23,\n    BuiltInNumWorkgroups = 24,\n    BuiltInWorkgroupSize = 25,\n    BuiltInWorkgroupId = 26,\n    BuiltInLocalInvocationId = 27,\n    BuiltInGlobalInvocationId = 28,\n    BuiltInLocalInvocationIndex = 29,\n    BuiltInWorkDim = 30,\n    BuiltInGlobalSize = 31,\n    BuiltInEnqueuedWorkgroupSize = 32,\n    BuiltInGlobalOffset = 33,\n    BuiltInGlobalLinearId = 34,\n    BuiltInSubgroupSize = 36,\n    BuiltInSubgroupMaxSize = 37,\n    BuiltInNumSubgroups = 38,\n    BuiltInNumEnqueuedSubgroups = 39,\n    BuiltInSubgroupId = 40,\n    BuiltInSubgroupLocalInvocationId = 41,\n    BuiltInVertexIndex = 42,\n    BuiltInInstanceIndex = 43,\n    BuiltInSubgroupEqMask = 4416,\n    BuiltInSubgroupEqMaskKHR = 4416,\n    BuiltInSubgroupGeMask = 4417,\n    BuiltInSubgroupGeMaskKHR = 4417,\n    BuiltInSubgroupGtMask = 4418,\n    BuiltInSubgroupGtMaskKHR = 4418,\n    BuiltInSubgroupLeMask = 4419,\n    BuiltInSubgroupLeMaskKHR = 4419,\n    BuiltInSubgroupLtMask = 4420,\n    BuiltInSubgroupLtMaskKHR = 4420,\n    BuiltInBaseVertex = 4424,\n    BuiltInBaseInstance = 4425,\n    BuiltInDrawIndex = 4426,\n    BuiltInPrimitiveShadingRateKHR = 4432,\n    BuiltInDeviceIndex = 4438,\n    BuiltInViewIndex = 4440,\n    BuiltInShadingRateKHR = 4444,\n    BuiltInBaryCoordNoPerspAMD = 4992,\n    BuiltInBaryCoordNoPerspCentroidAMD = 4993,\n    BuiltInBaryCoordNoPerspSampleAMD = 4994,\n    BuiltInBaryCoordSmoothAMD = 4995,\n    BuiltInBaryCoordSmoothCentroidAMD = 4996,\n    BuiltInBaryCoordSmoothSampleAMD = 4997,\n    BuiltInBaryCoordPullModelAMD = 4998,\n    BuiltInFragStencilRefEXT = 5014,\n    BuiltInViewportMaskNV = 5253,\n    BuiltInSecondaryPositionNV = 5257,\n    BuiltInSecondaryViewportMaskNV = 5258,\n    BuiltInPositionPerViewNV = 5261,\n    BuiltInViewportMaskPerViewNV = 5262,\n    BuiltInFullyCoveredEXT = 5264,\n    BuiltInTaskCountNV = 5274,\n    BuiltInPrimitiveCountNV = 5275,\n    BuiltInPrimitiveIndicesNV = 5276,\n    BuiltInClipDistancePerViewNV = 5277,\n    BuiltInCullDistancePerViewNV = 5278,\n    BuiltInLayerPerViewNV = 5279,\n    BuiltInMeshViewCountNV = 5280,\n    BuiltInMeshViewIndicesNV = 5281,\n    BuiltInBaryCoordKHR = 5286,\n    BuiltInBaryCoordNV = 5286,\n    BuiltInBaryCoordNoPerspKHR = 5287,\n    BuiltInBaryCoordNoPerspNV = 5287,\n    BuiltInFragSizeEXT = 5292,\n    BuiltInFragmentSizeNV = 5292,\n    BuiltInFragInvocationCountEXT = 5293,\n    BuiltInInvocationsPerPixelNV = 5293,\n    BuiltInPrimitivePointIndicesEXT = 5294,\n    BuiltInPrimitiveLineIndicesEXT = 5295,\n    BuiltInPrimitiveTriangleIndicesEXT = 5296,\n    BuiltInCullPrimitiveEXT = 5299,\n    BuiltInLaunchIdKHR = 5319,\n    BuiltInLaunchIdNV = 5319,\n    BuiltInLaunchSizeKHR = 5320,\n    BuiltInLaunchSizeNV = 5320,\n    BuiltInWorldRayOriginKHR = 5321,\n    BuiltInWorldRayOriginNV = 5321,\n    BuiltInWorldRayDirectionKHR = 5322,\n    BuiltInWorldRayDirectionNV = 5322,\n    BuiltInObjectRayOriginKHR = 5323,\n    BuiltInObjectRayOriginNV = 5323,\n    BuiltInObjectRayDirectionKHR = 5324,\n    BuiltInObjectRayDirectionNV = 5324,\n    BuiltInRayTminKHR = 5325,\n    BuiltInRayTminNV = 5325,\n    BuiltInRayTmaxKHR = 5326,\n    BuiltInRayTmaxNV = 5326,\n    BuiltInInstanceCustomIndexKHR = 5327,\n    BuiltInInstanceCustomIndexNV = 5327,\n    BuiltInObjectToWorldKHR = 5330,\n    BuiltInObjectToWorldNV = 5330,\n    BuiltInWorldToObjectKHR = 5331,\n    BuiltInWorldToObjectNV = 5331,\n    BuiltInHitTNV = 5332,\n    BuiltInHitKindKHR = 5333,\n    BuiltInHitKindNV = 5333,\n    BuiltInCurrentRayTimeNV = 5334,\n    BuiltInIncomingRayFlagsKHR = 5351,\n    BuiltInIncomingRayFlagsNV = 5351,\n    BuiltInRayGeometryIndexKHR = 5352,\n    BuiltInWarpsPerSMNV = 5374,\n    BuiltInSMCountNV = 5375,\n    BuiltInWarpIDNV = 5376,\n    BuiltInSMIDNV = 5377,\n    BuiltInCullMaskKHR = 6021,\n    BuiltInMax = 0x7fffffff,\n};\n\nenum SelectionControlShift {\n    SelectionControlFlattenShift = 0,\n    SelectionControlDontFlattenShift = 1,\n    SelectionControlMax = 0x7fffffff,\n};\n\nenum SelectionControlMask {\n    SelectionControlMaskNone = 0,\n    SelectionControlFlattenMask = 0x00000001,\n    SelectionControlDontFlattenMask = 0x00000002,\n};\n\nenum LoopControlShift {\n    LoopControlUnrollShift = 0,\n    LoopControlDontUnrollShift = 1,\n    LoopControlDependencyInfiniteShift = 2,\n    LoopControlDependencyLengthShift = 3,\n    LoopControlMinIterationsShift = 4,\n    LoopControlMaxIterationsShift = 5,\n    LoopControlIterationMultipleShift = 6,\n    LoopControlPeelCountShift = 7,\n    LoopControlPartialCountShift = 8,\n    LoopControlInitiationIntervalINTELShift = 16,\n    LoopControlMaxConcurrencyINTELShift = 17,\n    LoopControlDependencyArrayINTELShift = 18,\n    LoopControlPipelineEnableINTELShift = 19,\n    LoopControlLoopCoalesceINTELShift = 20,\n    LoopControlMaxInterleavingINTELShift = 21,\n    LoopControlSpeculatedIterationsINTELShift = 22,\n    LoopControlNoFusionINTELShift = 23,\n    LoopControlMax = 0x7fffffff,\n};\n\nenum LoopControlMask {\n    LoopControlMaskNone = 0,\n    LoopControlUnrollMask = 0x00000001,\n    LoopControlDontUnrollMask = 0x00000002,\n    LoopControlDependencyInfiniteMask = 0x00000004,\n    LoopControlDependencyLengthMask = 0x00000008,\n    LoopControlMinIterationsMask = 0x00000010,\n    LoopControlMaxIterationsMask = 0x00000020,\n    LoopControlIterationMultipleMask = 0x00000040,\n    LoopControlPeelCountMask = 0x00000080,\n    LoopControlPartialCountMask = 0x00000100,\n    LoopControlInitiationIntervalINTELMask = 0x00010000,\n    LoopControlMaxConcurrencyINTELMask = 0x00020000,\n    LoopControlDependencyArrayINTELMask = 0x00040000,\n    LoopControlPipelineEnableINTELMask = 0x00080000,\n    LoopControlLoopCoalesceINTELMask = 0x00100000,\n    LoopControlMaxInterleavingINTELMask = 0x00200000,\n    LoopControlSpeculatedIterationsINTELMask = 0x00400000,\n    LoopControlNoFusionINTELMask = 0x00800000,\n};\n\nenum FunctionControlShift {\n    FunctionControlInlineShift = 0,\n    FunctionControlDontInlineShift = 1,\n    FunctionControlPureShift = 2,\n    FunctionControlConstShift = 3,\n    FunctionControlOptNoneINTELShift = 16,\n    FunctionControlMax = 0x7fffffff,\n};\n\nenum FunctionControlMask {\n    FunctionControlMaskNone = 0,\n    FunctionControlInlineMask = 0x00000001,\n    FunctionControlDontInlineMask = 0x00000002,\n    FunctionControlPureMask = 0x00000004,\n    FunctionControlConstMask = 0x00000008,\n    FunctionControlOptNoneINTELMask = 0x00010000,\n};\n\nenum MemorySemanticsShift {\n    MemorySemanticsAcquireShift = 1,\n    MemorySemanticsReleaseShift = 2,\n    MemorySemanticsAcquireReleaseShift = 3,\n    MemorySemanticsSequentiallyConsistentShift = 4,\n    MemorySemanticsUniformMemoryShift = 6,\n    MemorySemanticsSubgroupMemoryShift = 7,\n    MemorySemanticsWorkgroupMemoryShift = 8,\n    MemorySemanticsCrossWorkgroupMemoryShift = 9,\n    MemorySemanticsAtomicCounterMemoryShift = 10,\n    MemorySemanticsImageMemoryShift = 11,\n    MemorySemanticsOutputMemoryShift = 12,\n    MemorySemanticsOutputMemoryKHRShift = 12,\n    MemorySemanticsMakeAvailableShift = 13,\n    MemorySemanticsMakeAvailableKHRShift = 13,\n    MemorySemanticsMakeVisibleShift = 14,\n    MemorySemanticsMakeVisibleKHRShift = 14,\n    MemorySemanticsVolatileShift = 15,\n    MemorySemanticsMax = 0x7fffffff,\n};\n\nenum MemorySemanticsMask {\n    MemorySemanticsMaskNone = 0,\n    MemorySemanticsAcquireMask = 0x00000002,\n    MemorySemanticsReleaseMask = 0x00000004,\n    MemorySemanticsAcquireReleaseMask = 0x00000008,\n    MemorySemanticsSequentiallyConsistentMask = 0x00000010,\n    MemorySemanticsUniformMemoryMask = 0x00000040,\n    MemorySemanticsSubgroupMemoryMask = 0x00000080,\n    MemorySemanticsWorkgroupMemoryMask = 0x00000100,\n    MemorySemanticsCrossWorkgroupMemoryMask = 0x00000200,\n    MemorySemanticsAtomicCounterMemoryMask = 0x00000400,\n    MemorySemanticsImageMemoryMask = 0x00000800,\n    MemorySemanticsOutputMemoryMask = 0x00001000,\n    MemorySemanticsOutputMemoryKHRMask = 0x00001000,\n    MemorySemanticsMakeAvailableMask = 0x00002000,\n    MemorySemanticsMakeAvailableKHRMask = 0x00002000,\n    MemorySemanticsMakeVisibleMask = 0x00004000,\n    MemorySemanticsMakeVisibleKHRMask = 0x00004000,\n    MemorySemanticsVolatileMask = 0x00008000,\n};\n\nenum MemoryAccessShift {\n    MemoryAccessVolatileShift = 0,\n    MemoryAccessAlignedShift = 1,\n    MemoryAccessNontemporalShift = 2,\n    MemoryAccessMakePointerAvailableShift = 3,\n    MemoryAccessMakePointerAvailableKHRShift = 3,\n    MemoryAccessMakePointerVisibleShift = 4,\n    MemoryAccessMakePointerVisibleKHRShift = 4,\n    MemoryAccessNonPrivatePointerShift = 5,\n    MemoryAccessNonPrivatePointerKHRShift = 5,\n    MemoryAccessAliasScopeINTELMaskShift = 16,\n    MemoryAccessNoAliasINTELMaskShift = 17,\n    MemoryAccessMax = 0x7fffffff,\n};\n\nenum MemoryAccessMask {\n    MemoryAccessMaskNone = 0,\n    MemoryAccessVolatileMask = 0x00000001,\n    MemoryAccessAlignedMask = 0x00000002,\n    MemoryAccessNontemporalMask = 0x00000004,\n    MemoryAccessMakePointerAvailableMask = 0x00000008,\n    MemoryAccessMakePointerAvailableKHRMask = 0x00000008,\n    MemoryAccessMakePointerVisibleMask = 0x00000010,\n    MemoryAccessMakePointerVisibleKHRMask = 0x00000010,\n    MemoryAccessNonPrivatePointerMask = 0x00000020,\n    MemoryAccessNonPrivatePointerKHRMask = 0x00000020,\n    MemoryAccessAliasScopeINTELMaskMask = 0x00010000,\n    MemoryAccessNoAliasINTELMaskMask = 0x00020000,\n};\n\nenum Scope {\n    ScopeCrossDevice = 0,\n    ScopeDevice = 1,\n    ScopeWorkgroup = 2,\n    ScopeSubgroup = 3,\n    ScopeInvocation = 4,\n    ScopeQueueFamily = 5,\n    ScopeQueueFamilyKHR = 5,\n    ScopeShaderCallKHR = 6,\n    ScopeMax = 0x7fffffff,\n};\n\nenum GroupOperation {\n    GroupOperationReduce = 0,\n    GroupOperationInclusiveScan = 1,\n    GroupOperationExclusiveScan = 2,\n    GroupOperationClusteredReduce = 3,\n    GroupOperationPartitionedReduceNV = 6,\n    GroupOperationPartitionedInclusiveScanNV = 7,\n    GroupOperationPartitionedExclusiveScanNV = 8,\n    GroupOperationMax = 0x7fffffff,\n};\n\nenum KernelEnqueueFlags {\n    KernelEnqueueFlagsNoWait = 0,\n    KernelEnqueueFlagsWaitKernel = 1,\n    KernelEnqueueFlagsWaitWorkGroup = 2,\n    KernelEnqueueFlagsMax = 0x7fffffff,\n};\n\nenum KernelProfilingInfoShift {\n    KernelProfilingInfoCmdExecTimeShift = 0,\n    KernelProfilingInfoMax = 0x7fffffff,\n};\n\nenum KernelProfilingInfoMask {\n    KernelProfilingInfoMaskNone = 0,\n    KernelProfilingInfoCmdExecTimeMask = 0x00000001,\n};\n\nenum Capability {\n    CapabilityMatrix = 0,\n    CapabilityShader = 1,\n    CapabilityGeometry = 2,\n    CapabilityTessellation = 3,\n    CapabilityAddresses = 4,\n    CapabilityLinkage = 5,\n    CapabilityKernel = 6,\n    CapabilityVector16 = 7,\n    CapabilityFloat16Buffer = 8,\n    CapabilityFloat16 = 9,\n    CapabilityFloat64 = 10,\n    CapabilityInt64 = 11,\n    CapabilityInt64Atomics = 12,\n    CapabilityImageBasic = 13,\n    CapabilityImageReadWrite = 14,\n    CapabilityImageMipmap = 15,\n    CapabilityPipes = 17,\n    CapabilityGroups = 18,\n    CapabilityDeviceEnqueue = 19,\n    CapabilityLiteralSampler = 20,\n    CapabilityAtomicStorage = 21,\n    CapabilityInt16 = 22,\n    CapabilityTessellationPointSize = 23,\n    CapabilityGeometryPointSize = 24,\n    CapabilityImageGatherExtended = 25,\n    CapabilityStorageImageMultisample = 27,\n    CapabilityUniformBufferArrayDynamicIndexing = 28,\n    CapabilitySampledImageArrayDynamicIndexing = 29,\n    CapabilityStorageBufferArrayDynamicIndexing = 30,\n    CapabilityStorageImageArrayDynamicIndexing = 31,\n    CapabilityClipDistance = 32,\n    CapabilityCullDistance = 33,\n    CapabilityImageCubeArray = 34,\n    CapabilitySampleRateShading = 35,\n    CapabilityImageRect = 36,\n    CapabilitySampledRect = 37,\n    CapabilityGenericPointer = 38,\n    CapabilityInt8 = 39,\n    CapabilityInputAttachment = 40,\n    CapabilitySparseResidency = 41,\n    CapabilityMinLod = 42,\n    CapabilitySampled1D = 43,\n    CapabilityImage1D = 44,\n    CapabilitySampledCubeArray = 45,\n    CapabilitySampledBuffer = 46,\n    CapabilityImageBuffer = 47,\n    CapabilityImageMSArray = 48,\n    CapabilityStorageImageExtendedFormats = 49,\n    CapabilityImageQuery = 50,\n    CapabilityDerivativeControl = 51,\n    CapabilityInterpolationFunction = 52,\n    CapabilityTransformFeedback = 53,\n    CapabilityGeometryStreams = 54,\n    CapabilityStorageImageReadWithoutFormat = 55,\n    CapabilityStorageImageWriteWithoutFormat = 56,\n    CapabilityMultiViewport = 57,\n    CapabilitySubgroupDispatch = 58,\n    CapabilityNamedBarrier = 59,\n    CapabilityPipeStorage = 60,\n    CapabilityGroupNonUniform = 61,\n    CapabilityGroupNonUniformVote = 62,\n    CapabilityGroupNonUniformArithmetic = 63,\n    CapabilityGroupNonUniformBallot = 64,\n    CapabilityGroupNonUniformShuffle = 65,\n    CapabilityGroupNonUniformShuffleRelative = 66,\n    CapabilityGroupNonUniformClustered = 67,\n    CapabilityGroupNonUniformQuad = 68,\n    CapabilityShaderLayer = 69,\n    CapabilityShaderViewportIndex = 70,\n    CapabilityUniformDecoration = 71,\n    CapabilityFragmentShadingRateKHR = 4422,\n    CapabilitySubgroupBallotKHR = 4423,\n    CapabilityDrawParameters = 4427,\n    CapabilityWorkgroupMemoryExplicitLayoutKHR = 4428,\n    CapabilityWorkgroupMemoryExplicitLayout8BitAccessKHR = 4429,\n    CapabilityWorkgroupMemoryExplicitLayout16BitAccessKHR = 4430,\n    CapabilitySubgroupVoteKHR = 4431,\n    CapabilityStorageBuffer16BitAccess = 4433,\n    CapabilityStorageUniformBufferBlock16 = 4433,\n    CapabilityStorageUniform16 = 4434,\n    CapabilityUniformAndStorageBuffer16BitAccess = 4434,\n    CapabilityStoragePushConstant16 = 4435,\n    CapabilityStorageInputOutput16 = 4436,\n    CapabilityDeviceGroup = 4437,\n    CapabilityMultiView = 4439,\n    CapabilityVariablePointersStorageBuffer = 4441,\n    CapabilityVariablePointers = 4442,\n    CapabilityAtomicStorageOps = 4445,\n    CapabilitySampleMaskPostDepthCoverage = 4447,\n    CapabilityStorageBuffer8BitAccess = 4448,\n    CapabilityUniformAndStorageBuffer8BitAccess = 4449,\n    CapabilityStoragePushConstant8 = 4450,\n    CapabilityDenormPreserve = 4464,\n    CapabilityDenormFlushToZero = 4465,\n    CapabilitySignedZeroInfNanPreserve = 4466,\n    CapabilityRoundingModeRTE = 4467,\n    CapabilityRoundingModeRTZ = 4468,\n    CapabilityRayQueryProvisionalKHR = 4471,\n    CapabilityRayQueryKHR = 4472,\n    CapabilityRayTraversalPrimitiveCullingKHR = 4478,\n    CapabilityRayTracingKHR = 4479,\n    CapabilityFloat16ImageAMD = 5008,\n    CapabilityImageGatherBiasLodAMD = 5009,\n    CapabilityFragmentMaskAMD = 5010,\n    CapabilityStencilExportEXT = 5013,\n    CapabilityImageReadWriteLodAMD = 5015,\n    CapabilityInt64ImageEXT = 5016,\n    CapabilityShaderClockKHR = 5055,\n    CapabilitySampleMaskOverrideCoverageNV = 5249,\n    CapabilityGeometryShaderPassthroughNV = 5251,\n    CapabilityShaderViewportIndexLayerEXT = 5254,\n    CapabilityShaderViewportIndexLayerNV = 5254,\n    CapabilityShaderViewportMaskNV = 5255,\n    CapabilityShaderStereoViewNV = 5259,\n    CapabilityPerViewAttributesNV = 5260,\n    CapabilityFragmentFullyCoveredEXT = 5265,\n    CapabilityMeshShadingNV = 5266,\n    CapabilityImageFootprintNV = 5282,\n    CapabilityMeshShadingEXT = 5283,\n    CapabilityFragmentBarycentricKHR = 5284,\n    CapabilityFragmentBarycentricNV = 5284,\n    CapabilityComputeDerivativeGroupQuadsNV = 5288,\n    CapabilityFragmentDensityEXT = 5291,\n    CapabilityShadingRateNV = 5291,\n    CapabilityGroupNonUniformPartitionedNV = 5297,\n    CapabilityShaderNonUniform = 5301,\n    CapabilityShaderNonUniformEXT = 5301,\n    CapabilityRuntimeDescriptorArray = 5302,\n    CapabilityRuntimeDescriptorArrayEXT = 5302,\n    CapabilityInputAttachmentArrayDynamicIndexing = 5303,\n    CapabilityInputAttachmentArrayDynamicIndexingEXT = 5303,\n    CapabilityUniformTexelBufferArrayDynamicIndexing = 5304,\n    CapabilityUniformTexelBufferArrayDynamicIndexingEXT = 5304,\n    CapabilityStorageTexelBufferArrayDynamicIndexing = 5305,\n    CapabilityStorageTexelBufferArrayDynamicIndexingEXT = 5305,\n    CapabilityUniformBufferArrayNonUniformIndexing = 5306,\n    CapabilityUniformBufferArrayNonUniformIndexingEXT = 5306,\n    CapabilitySampledImageArrayNonUniformIndexing = 5307,\n    CapabilitySampledImageArrayNonUniformIndexingEXT = 5307,\n    CapabilityStorageBufferArrayNonUniformIndexing = 5308,\n    CapabilityStorageBufferArrayNonUniformIndexingEXT = 5308,\n    CapabilityStorageImageArrayNonUniformIndexing = 5309,\n    CapabilityStorageImageArrayNonUniformIndexingEXT = 5309,\n    CapabilityInputAttachmentArrayNonUniformIndexing = 5310,\n    CapabilityInputAttachmentArrayNonUniformIndexingEXT = 5310,\n    CapabilityUniformTexelBufferArrayNonUniformIndexing = 5311,\n    CapabilityUniformTexelBufferArrayNonUniformIndexingEXT = 5311,\n    CapabilityStorageTexelBufferArrayNonUniformIndexing = 5312,\n    CapabilityStorageTexelBufferArrayNonUniformIndexingEXT = 5312,\n    CapabilityRayTracingNV = 5340,\n    CapabilityRayTracingMotionBlurNV = 5341,\n    CapabilityVulkanMemoryModel = 5345,\n    CapabilityVulkanMemoryModelKHR = 5345,\n    CapabilityVulkanMemoryModelDeviceScope = 5346,\n    CapabilityVulkanMemoryModelDeviceScopeKHR = 5346,\n    CapabilityPhysicalStorageBufferAddresses = 5347,\n    CapabilityPhysicalStorageBufferAddressesEXT = 5347,\n    CapabilityComputeDerivativeGroupLinearNV = 5350,\n    CapabilityRayTracingProvisionalKHR = 5353,\n    CapabilityCooperativeMatrixNV = 5357,\n    CapabilityFragmentShaderSampleInterlockEXT = 5363,\n    CapabilityFragmentShaderShadingRateInterlockEXT = 5372,\n    CapabilityShaderSMBuiltinsNV = 5373,\n    CapabilityFragmentShaderPixelInterlockEXT = 5378,\n    CapabilityDemoteToHelperInvocation = 5379,\n    CapabilityDemoteToHelperInvocationEXT = 5379,\n    CapabilityBindlessTextureNV = 5390,\n    CapabilitySubgroupShuffleINTEL = 5568,\n    CapabilitySubgroupBufferBlockIOINTEL = 5569,\n    CapabilitySubgroupImageBlockIOINTEL = 5570,\n    CapabilitySubgroupImageMediaBlockIOINTEL = 5579,\n    CapabilityRoundToInfinityINTEL = 5582,\n    CapabilityFloatingPointModeINTEL = 5583,\n    CapabilityIntegerFunctions2INTEL = 5584,\n    CapabilityFunctionPointersINTEL = 5603,\n    CapabilityIndirectReferencesINTEL = 5604,\n    CapabilityAsmINTEL = 5606,\n    CapabilityAtomicFloat32MinMaxEXT = 5612,\n    CapabilityAtomicFloat64MinMaxEXT = 5613,\n    CapabilityAtomicFloat16MinMaxEXT = 5616,\n    CapabilityVectorComputeINTEL = 5617,\n    CapabilityVectorAnyINTEL = 5619,\n    CapabilityExpectAssumeKHR = 5629,\n    CapabilitySubgroupAvcMotionEstimationINTEL = 5696,\n    CapabilitySubgroupAvcMotionEstimationIntraINTEL = 5697,\n    CapabilitySubgroupAvcMotionEstimationChromaINTEL = 5698,\n    CapabilityVariableLengthArrayINTEL = 5817,\n    CapabilityFunctionFloatControlINTEL = 5821,\n    CapabilityFPGAMemoryAttributesINTEL = 5824,\n    CapabilityFPFastMathModeINTEL = 5837,\n    CapabilityArbitraryPrecisionIntegersINTEL = 5844,\n    CapabilityArbitraryPrecisionFloatingPointINTEL = 5845,\n    CapabilityUnstructuredLoopControlsINTEL = 5886,\n    CapabilityFPGALoopControlsINTEL = 5888,\n    CapabilityKernelAttributesINTEL = 5892,\n    CapabilityFPGAKernelAttributesINTEL = 5897,\n    CapabilityFPGAMemoryAccessesINTEL = 5898,\n    CapabilityFPGAClusterAttributesINTEL = 5904,\n    CapabilityLoopFuseINTEL = 5906,\n    CapabilityMemoryAccessAliasingINTEL = 5910,\n    CapabilityFPGABufferLocationINTEL = 5920,\n    CapabilityArbitraryPrecisionFixedPointINTEL = 5922,\n    CapabilityUSMStorageClassesINTEL = 5935,\n    CapabilityIOPipesINTEL = 5943,\n    CapabilityBlockingPipesINTEL = 5945,\n    CapabilityFPGARegINTEL = 5948,\n    CapabilityDotProductInputAll = 6016,\n    CapabilityDotProductInputAllKHR = 6016,\n    CapabilityDotProductInput4x8Bit = 6017,\n    CapabilityDotProductInput4x8BitKHR = 6017,\n    CapabilityDotProductInput4x8BitPacked = 6018,\n    CapabilityDotProductInput4x8BitPackedKHR = 6018,\n    CapabilityDotProduct = 6019,\n    CapabilityDotProductKHR = 6019,\n    CapabilityRayCullMaskKHR = 6020,\n    CapabilityBitInstructions = 6025,\n    CapabilityGroupNonUniformRotateKHR = 6026,\n    CapabilityAtomicFloat32AddEXT = 6033,\n    CapabilityAtomicFloat64AddEXT = 6034,\n    CapabilityLongConstantCompositeINTEL = 6089,\n    CapabilityOptNoneINTEL = 6094,\n    CapabilityAtomicFloat16AddEXT = 6095,\n    CapabilityDebugInfoModuleINTEL = 6114,\n    CapabilitySplitBarrierINTEL = 6141,\n    CapabilityGroupUniformArithmeticKHR = 6400,\n    CapabilityMax = 0x7fffffff,\n};\n\nenum RayFlagsShift {\n    RayFlagsOpaqueKHRShift = 0,\n    RayFlagsNoOpaqueKHRShift = 1,\n    RayFlagsTerminateOnFirstHitKHRShift = 2,\n    RayFlagsSkipClosestHitShaderKHRShift = 3,\n    RayFlagsCullBackFacingTrianglesKHRShift = 4,\n    RayFlagsCullFrontFacingTrianglesKHRShift = 5,\n    RayFlagsCullOpaqueKHRShift = 6,\n    RayFlagsCullNoOpaqueKHRShift = 7,\n    RayFlagsSkipTrianglesKHRShift = 8,\n    RayFlagsSkipAABBsKHRShift = 9,\n    RayFlagsMax = 0x7fffffff,\n};\n\nenum RayFlagsMask {\n    RayFlagsMaskNone = 0,\n    RayFlagsOpaqueKHRMask = 0x00000001,\n    RayFlagsNoOpaqueKHRMask = 0x00000002,\n    RayFlagsTerminateOnFirstHitKHRMask = 0x00000004,\n    RayFlagsSkipClosestHitShaderKHRMask = 0x00000008,\n    RayFlagsCullBackFacingTrianglesKHRMask = 0x00000010,\n    RayFlagsCullFrontFacingTrianglesKHRMask = 0x00000020,\n    RayFlagsCullOpaqueKHRMask = 0x00000040,\n    RayFlagsCullNoOpaqueKHRMask = 0x00000080,\n    RayFlagsSkipTrianglesKHRMask = 0x00000100,\n    RayFlagsSkipAABBsKHRMask = 0x00000200,\n};\n\nenum RayQueryIntersection {\n    RayQueryIntersectionRayQueryCandidateIntersectionKHR = 0,\n    RayQueryIntersectionRayQueryCommittedIntersectionKHR = 1,\n    RayQueryIntersectionMax = 0x7fffffff,\n};\n\nenum RayQueryCommittedIntersectionType {\n    RayQueryCommittedIntersectionTypeRayQueryCommittedIntersectionNoneKHR = 0,\n    RayQueryCommittedIntersectionTypeRayQueryCommittedIntersectionTriangleKHR = 1,\n    RayQueryCommittedIntersectionTypeRayQueryCommittedIntersectionGeneratedKHR = 2,\n    RayQueryCommittedIntersectionTypeMax = 0x7fffffff,\n};\n\nenum RayQueryCandidateIntersectionType {\n    RayQueryCandidateIntersectionTypeRayQueryCandidateIntersectionTriangleKHR = 0,\n    RayQueryCandidateIntersectionTypeRayQueryCandidateIntersectionAABBKHR = 1,\n    RayQueryCandidateIntersectionTypeMax = 0x7fffffff,\n};\n\nenum FragmentShadingRateShift {\n    FragmentShadingRateVertical2PixelsShift = 0,\n    FragmentShadingRateVertical4PixelsShift = 1,\n    FragmentShadingRateHorizontal2PixelsShift = 2,\n    FragmentShadingRateHorizontal4PixelsShift = 3,\n    FragmentShadingRateMax = 0x7fffffff,\n};\n\nenum FragmentShadingRateMask {\n    FragmentShadingRateMaskNone = 0,\n    FragmentShadingRateVertical2PixelsMask = 0x00000001,\n    FragmentShadingRateVertical4PixelsMask = 0x00000002,\n    FragmentShadingRateHorizontal2PixelsMask = 0x00000004,\n    FragmentShadingRateHorizontal4PixelsMask = 0x00000008,\n};\n\nenum FPDenormMode {\n    FPDenormModePreserve = 0,\n    FPDenormModeFlushToZero = 1,\n    FPDenormModeMax = 0x7fffffff,\n};\n\nenum FPOperationMode {\n    FPOperationModeIEEE = 0,\n    FPOperationModeALT = 1,\n    FPOperationModeMax = 0x7fffffff,\n};\n\nenum QuantizationModes {\n    QuantizationModesTRN = 0,\n    QuantizationModesTRN_ZERO = 1,\n    QuantizationModesRND = 2,\n    QuantizationModesRND_ZERO = 3,\n    QuantizationModesRND_INF = 4,\n    QuantizationModesRND_MIN_INF = 5,\n    QuantizationModesRND_CONV = 6,\n    QuantizationModesRND_CONV_ODD = 7,\n    QuantizationModesMax = 0x7fffffff,\n};\n\nenum OverflowModes {\n    OverflowModesWRAP = 0,\n    OverflowModesSAT = 1,\n    OverflowModesSAT_ZERO = 2,\n    OverflowModesSAT_SYM = 3,\n    OverflowModesMax = 0x7fffffff,\n};\n\nenum PackedVectorFormat {\n    PackedVectorFormatPackedVectorFormat4x8Bit = 0,\n    PackedVectorFormatPackedVectorFormat4x8BitKHR = 0,\n    PackedVectorFormatMax = 0x7fffffff,\n};\n\nenum Op {\n    OpNop = 0,\n    OpUndef = 1,\n    OpSourceContinued = 2,\n    OpSource = 3,\n    OpSourceExtension = 4,\n    OpName = 5,\n    OpMemberName = 6,\n    OpString = 7,\n    OpLine = 8,\n    OpExtension = 10,\n    OpExtInstImport = 11,\n    OpExtInst = 12,\n    OpMemoryModel = 14,\n    OpEntryPoint = 15,\n    OpExecutionMode = 16,\n    OpCapability = 17,\n    OpTypeVoid = 19,\n    OpTypeBool = 20,\n    OpTypeInt = 21,\n    OpTypeFloat = 22,\n    OpTypeVector = 23,\n    OpTypeMatrix = 24,\n    OpTypeImage = 25,\n    OpTypeSampler = 26,\n    OpTypeSampledImage = 27,\n    OpTypeArray = 28,\n    OpTypeRuntimeArray = 29,\n    OpTypeStruct = 30,\n    OpTypeOpaque = 31,\n    OpTypePointer = 32,\n    OpTypeFunction = 33,\n    OpTypeEvent = 34,\n    OpTypeDeviceEvent = 35,\n    OpTypeReserveId = 36,\n    OpTypeQueue = 37,\n    OpTypePipe = 38,\n    OpTypeForwardPointer = 39,\n    OpConstantTrue = 41,\n    OpConstantFalse = 42,\n    OpConstant = 43,\n    OpConstantComposite = 44,\n    OpConstantSampler = 45,\n    OpConstantNull = 46,\n    OpSpecConstantTrue = 48,\n    OpSpecConstantFalse = 49,\n    OpSpecConstant = 50,\n    OpSpecConstantComposite = 51,\n    OpSpecConstantOp = 52,\n    OpFunction = 54,\n    OpFunctionParameter = 55,\n    OpFunctionEnd = 56,\n    OpFunctionCall = 57,\n    OpVariable = 59,\n    OpImageTexelPointer = 60,\n    OpLoad = 61,\n    OpStore = 62,\n    OpCopyMemory = 63,\n    OpCopyMemorySized = 64,\n    OpAccessChain = 65,\n    OpInBoundsAccessChain = 66,\n    OpPtrAccessChain = 67,\n    OpArrayLength = 68,\n    OpGenericPtrMemSemantics = 69,\n    OpInBoundsPtrAccessChain = 70,\n    OpDecorate = 71,\n    OpMemberDecorate = 72,\n    OpDecorationGroup = 73,\n    OpGroupDecorate = 74,\n    OpGroupMemberDecorate = 75,\n    OpVectorExtractDynamic = 77,\n    OpVectorInsertDynamic = 78,\n    OpVectorShuffle = 79,\n    OpCompositeConstruct = 80,\n    OpCompositeExtract = 81,\n    OpCompositeInsert = 82,\n    OpCopyObject = 83,\n    OpTranspose = 84,\n    OpSampledImage = 86,\n    OpImageSampleImplicitLod = 87,\n    OpImageSampleExplicitLod = 88,\n    OpImageSampleDrefImplicitLod = 89,\n    OpImageSampleDrefExplicitLod = 90,\n    OpImageSampleProjImplicitLod = 91,\n    OpImageSampleProjExplicitLod = 92,\n    OpImageSampleProjDrefImplicitLod = 93,\n    OpImageSampleProjDrefExplicitLod = 94,\n    OpImageFetch = 95,\n    OpImageGather = 96,\n    OpImageDrefGather = 97,\n    OpImageRead = 98,\n    OpImageWrite = 99,\n    OpImage = 100,\n    OpImageQueryFormat = 101,\n    OpImageQueryOrder = 102,\n    OpImageQuerySizeLod = 103,\n    OpImageQuerySize = 104,\n    OpImageQueryLod = 105,\n    OpImageQueryLevels = 106,\n    OpImageQuerySamples = 107,\n    OpConvertFToU = 109,\n    OpConvertFToS = 110,\n    OpConvertSToF = 111,\n    OpConvertUToF = 112,\n    OpUConvert = 113,\n    OpSConvert = 114,\n    OpFConvert = 115,\n    OpQuantizeToF16 = 116,\n    OpConvertPtrToU = 117,\n    OpSatConvertSToU = 118,\n    OpSatConvertUToS = 119,\n    OpConvertUToPtr = 120,\n    OpPtrCastToGeneric = 121,\n    OpGenericCastToPtr = 122,\n    OpGenericCastToPtrExplicit = 123,\n    OpBitcast = 124,\n    OpSNegate = 126,\n    OpFNegate = 127,\n    OpIAdd = 128,\n    OpFAdd = 129,\n    OpISub = 130,\n    OpFSub = 131,\n    OpIMul = 132,\n    OpFMul = 133,\n    OpUDiv = 134,\n    OpSDiv = 135,\n    OpFDiv = 136,\n    OpUMod = 137,\n    OpSRem = 138,\n    OpSMod = 139,\n    OpFRem = 140,\n    OpFMod = 141,\n    OpVectorTimesScalar = 142,\n    OpMatrixTimesScalar = 143,\n    OpVectorTimesMatrix = 144,\n    OpMatrixTimesVector = 145,\n    OpMatrixTimesMatrix = 146,\n    OpOuterProduct = 147,\n    OpDot = 148,\n    OpIAddCarry = 149,\n    OpISubBorrow = 150,\n    OpUMulExtended = 151,\n    OpSMulExtended = 152,\n    OpAny = 154,\n    OpAll = 155,\n    OpIsNan = 156,\n    OpIsInf = 157,\n    OpIsFinite = 158,\n    OpIsNormal = 159,\n    OpSignBitSet = 160,\n    OpLessOrGreater = 161,\n    OpOrdered = 162,\n    OpUnordered = 163,\n    OpLogicalEqual = 164,\n    OpLogicalNotEqual = 165,\n    OpLogicalOr = 166,\n    OpLogicalAnd = 167,\n    OpLogicalNot = 168,\n    OpSelect = 169,\n    OpIEqual = 170,\n    OpINotEqual = 171,\n    OpUGreaterThan = 172,\n    OpSGreaterThan = 173,\n    OpUGreaterThanEqual = 174,\n    OpSGreaterThanEqual = 175,\n    OpULessThan = 176,\n    OpSLessThan = 177,\n    OpULessThanEqual = 178,\n    OpSLessThanEqual = 179,\n    OpFOrdEqual = 180,\n    OpFUnordEqual = 181,\n    OpFOrdNotEqual = 182,\n    OpFUnordNotEqual = 183,\n    OpFOrdLessThan = 184,\n    OpFUnordLessThan = 185,\n    OpFOrdGreaterThan = 186,\n    OpFUnordGreaterThan = 187,\n    OpFOrdLessThanEqual = 188,\n    OpFUnordLessThanEqual = 189,\n    OpFOrdGreaterThanEqual = 190,\n    OpFUnordGreaterThanEqual = 191,\n    OpShiftRightLogical = 194,\n    OpShiftRightArithmetic = 195,\n    OpShiftLeftLogical = 196,\n    OpBitwiseOr = 197,\n    OpBitwiseXor = 198,\n    OpBitwiseAnd = 199,\n    OpNot = 200,\n    OpBitFieldInsert = 201,\n    OpBitFieldSExtract = 202,\n    OpBitFieldUExtract = 203,\n    OpBitReverse = 204,\n    OpBitCount = 205,\n    OpDPdx = 207,\n    OpDPdy = 208,\n    OpFwidth = 209,\n    OpDPdxFine = 210,\n    OpDPdyFine = 211,\n    OpFwidthFine = 212,\n    OpDPdxCoarse = 213,\n    OpDPdyCoarse = 214,\n    OpFwidthCoarse = 215,\n    OpEmitVertex = 218,\n    OpEndPrimitive = 219,\n    OpEmitStreamVertex = 220,\n    OpEndStreamPrimitive = 221,\n    OpControlBarrier = 224,\n    OpMemoryBarrier = 225,\n    OpAtomicLoad = 227,\n    OpAtomicStore = 228,\n    OpAtomicExchange = 229,\n    OpAtomicCompareExchange = 230,\n    OpAtomicCompareExchangeWeak = 231,\n    OpAtomicIIncrement = 232,\n    OpAtomicIDecrement = 233,\n    OpAtomicIAdd = 234,\n    OpAtomicISub = 235,\n    OpAtomicSMin = 236,\n    OpAtomicUMin = 237,\n    OpAtomicSMax = 238,\n    OpAtomicUMax = 239,\n    OpAtomicAnd = 240,\n    OpAtomicOr = 241,\n    OpAtomicXor = 242,\n    OpPhi = 245,\n    OpLoopMerge = 246,\n    OpSelectionMerge = 247,\n    OpLabel = 248,\n    OpBranch = 249,\n    OpBranchConditional = 250,\n    OpSwitch = 251,\n    OpKill = 252,\n    OpReturn = 253,\n    OpReturnValue = 254,\n    OpUnreachable = 255,\n    OpLifetimeStart = 256,\n    OpLifetimeStop = 257,\n    OpGroupAsyncCopy = 259,\n    OpGroupWaitEvents = 260,\n    OpGroupAll = 261,\n    OpGroupAny = 262,\n    OpGroupBroadcast = 263,\n    OpGroupIAdd = 264,\n    OpGroupFAdd = 265,\n    OpGroupFMin = 266,\n    OpGroupUMin = 267,\n    OpGroupSMin = 268,\n    OpGroupFMax = 269,\n    OpGroupUMax = 270,\n    OpGroupSMax = 271,\n    OpReadPipe = 274,\n    OpWritePipe = 275,\n    OpReservedReadPipe = 276,\n    OpReservedWritePipe = 277,\n    OpReserveReadPipePackets = 278,\n    OpReserveWritePipePackets = 279,\n    OpCommitReadPipe = 280,\n    OpCommitWritePipe = 281,\n    OpIsValidReserveId = 282,\n    OpGetNumPipePackets = 283,\n    OpGetMaxPipePackets = 284,\n    OpGroupReserveReadPipePackets = 285,\n    OpGroupReserveWritePipePackets = 286,\n    OpGroupCommitReadPipe = 287,\n    OpGroupCommitWritePipe = 288,\n    OpEnqueueMarker = 291,\n    OpEnqueueKernel = 292,\n    OpGetKernelNDrangeSubGroupCount = 293,\n    OpGetKernelNDrangeMaxSubGroupSize = 294,\n    OpGetKernelWorkGroupSize = 295,\n    OpGetKernelPreferredWorkGroupSizeMultiple = 296,\n    OpRetainEvent = 297,\n    OpReleaseEvent = 298,\n    OpCreateUserEvent = 299,\n    OpIsValidEvent = 300,\n    OpSetUserEventStatus = 301,\n    OpCaptureEventProfilingInfo = 302,\n    OpGetDefaultQueue = 303,\n    OpBuildNDRange = 304,\n    OpImageSparseSampleImplicitLod = 305,\n    OpImageSparseSampleExplicitLod = 306,\n    OpImageSparseSampleDrefImplicitLod = 307,\n    OpImageSparseSampleDrefExplicitLod = 308,\n    OpImageSparseSampleProjImplicitLod = 309,\n    OpImageSparseSampleProjExplicitLod = 310,\n    OpImageSparseSampleProjDrefImplicitLod = 311,\n    OpImageSparseSampleProjDrefExplicitLod = 312,\n    OpImageSparseFetch = 313,\n    OpImageSparseGather = 314,\n    OpImageSparseDrefGather = 315,\n    OpImageSparseTexelsResident = 316,\n    OpNoLine = 317,\n    OpAtomicFlagTestAndSet = 318,\n    OpAtomicFlagClear = 319,\n    OpImageSparseRead = 320,\n    OpSizeOf = 321,\n    OpTypePipeStorage = 322,\n    OpConstantPipeStorage = 323,\n    OpCreatePipeFromPipeStorage = 324,\n    OpGetKernelLocalSizeForSubgroupCount = 325,\n    OpGetKernelMaxNumSubgroups = 326,\n    OpTypeNamedBarrier = 327,\n    OpNamedBarrierInitialize = 328,\n    OpMemoryNamedBarrier = 329,\n    OpModuleProcessed = 330,\n    OpExecutionModeId = 331,\n    OpDecorateId = 332,\n    OpGroupNonUniformElect = 333,\n    OpGroupNonUniformAll = 334,\n    OpGroupNonUniformAny = 335,\n    OpGroupNonUniformAllEqual = 336,\n    OpGroupNonUniformBroadcast = 337,\n    OpGroupNonUniformBroadcastFirst = 338,\n    OpGroupNonUniformBallot = 339,\n    OpGroupNonUniformInverseBallot = 340,\n    OpGroupNonUniformBallotBitExtract = 341,\n    OpGroupNonUniformBallotBitCount = 342,\n    OpGroupNonUniformBallotFindLSB = 343,\n    OpGroupNonUniformBallotFindMSB = 344,\n    OpGroupNonUniformShuffle = 345,\n    OpGroupNonUniformShuffleXor = 346,\n    OpGroupNonUniformShuffleUp = 347,\n    OpGroupNonUniformShuffleDown = 348,\n    OpGroupNonUniformIAdd = 349,\n    OpGroupNonUniformFAdd = 350,\n    OpGroupNonUniformIMul = 351,\n    OpGroupNonUniformFMul = 352,\n    OpGroupNonUniformSMin = 353,\n    OpGroupNonUniformUMin = 354,\n    OpGroupNonUniformFMin = 355,\n    OpGroupNonUniformSMax = 356,\n    OpGroupNonUniformUMax = 357,\n    OpGroupNonUniformFMax = 358,\n    OpGroupNonUniformBitwiseAnd = 359,\n    OpGroupNonUniformBitwiseOr = 360,\n    OpGroupNonUniformBitwiseXor = 361,\n    OpGroupNonUniformLogicalAnd = 362,\n    OpGroupNonUniformLogicalOr = 363,\n    OpGroupNonUniformLogicalXor = 364,\n    OpGroupNonUniformQuadBroadcast = 365,\n    OpGroupNonUniformQuadSwap = 366,\n    OpCopyLogical = 400,\n    OpPtrEqual = 401,\n    OpPtrNotEqual = 402,\n    OpPtrDiff = 403,\n    OpTerminateInvocation = 4416,\n    OpSubgroupBallotKHR = 4421,\n    OpSubgroupFirstInvocationKHR = 4422,\n    OpSubgroupAllKHR = 4428,\n    OpSubgroupAnyKHR = 4429,\n    OpSubgroupAllEqualKHR = 4430,\n    OpGroupNonUniformRotateKHR = 4431,\n    OpSubgroupReadInvocationKHR = 4432,\n    OpTraceRayKHR = 4445,\n    OpExecuteCallableKHR = 4446,\n    OpConvertUToAccelerationStructureKHR = 4447,\n    OpIgnoreIntersectionKHR = 4448,\n    OpTerminateRayKHR = 4449,\n    OpSDot = 4450,\n    OpSDotKHR = 4450,\n    OpUDot = 4451,\n    OpUDotKHR = 4451,\n    OpSUDot = 4452,\n    OpSUDotKHR = 4452,\n    OpSDotAccSat = 4453,\n    OpSDotAccSatKHR = 4453,\n    OpUDotAccSat = 4454,\n    OpUDotAccSatKHR = 4454,\n    OpSUDotAccSat = 4455,\n    OpSUDotAccSatKHR = 4455,\n    OpTypeRayQueryKHR = 4472,\n    OpRayQueryInitializeKHR = 4473,\n    OpRayQueryTerminateKHR = 4474,\n    OpRayQueryGenerateIntersectionKHR = 4475,\n    OpRayQueryConfirmIntersectionKHR = 4476,\n    OpRayQueryProceedKHR = 4477,\n    OpRayQueryGetIntersectionTypeKHR = 4479,\n    OpGroupIAddNonUniformAMD = 5000,\n    OpGroupFAddNonUniformAMD = 5001,\n    OpGroupFMinNonUniformAMD = 5002,\n    OpGroupUMinNonUniformAMD = 5003,\n    OpGroupSMinNonUniformAMD = 5004,\n    OpGroupFMaxNonUniformAMD = 5005,\n    OpGroupUMaxNonUniformAMD = 5006,\n    OpGroupSMaxNonUniformAMD = 5007,\n    OpFragmentMaskFetchAMD = 5011,\n    OpFragmentFetchAMD = 5012,\n    OpReadClockKHR = 5056,\n    OpImageSampleFootprintNV = 5283,\n    OpEmitMeshTasksEXT = 5294,\n    OpSetMeshOutputsEXT = 5295,\n    OpGroupNonUniformPartitionNV = 5296,\n    OpWritePackedPrimitiveIndices4x8NV = 5299,\n    OpReportIntersectionKHR = 5334,\n    OpReportIntersectionNV = 5334,\n    OpIgnoreIntersectionNV = 5335,\n    OpTerminateRayNV = 5336,\n    OpTraceNV = 5337,\n    OpTraceMotionNV = 5338,\n    OpTraceRayMotionNV = 5339,\n    OpTypeAccelerationStructureKHR = 5341,\n    OpTypeAccelerationStructureNV = 5341,\n    OpExecuteCallableNV = 5344,\n    OpTypeCooperativeMatrixNV = 5358,\n    OpCooperativeMatrixLoadNV = 5359,\n    OpCooperativeMatrixStoreNV = 5360,\n    OpCooperativeMatrixMulAddNV = 5361,\n    OpCooperativeMatrixLengthNV = 5362,\n    OpBeginInvocationInterlockEXT = 5364,\n    OpEndInvocationInterlockEXT = 5365,\n    OpDemoteToHelperInvocation = 5380,\n    OpDemoteToHelperInvocationEXT = 5380,\n    OpIsHelperInvocationEXT = 5381,\n    OpConvertUToImageNV = 5391,\n    OpConvertUToSamplerNV = 5392,\n    OpConvertImageToUNV = 5393,\n    OpConvertSamplerToUNV = 5394,\n    OpConvertUToSampledImageNV = 5395,\n    OpConvertSampledImageToUNV = 5396,\n    OpSamplerImageAddressingModeNV = 5397,\n    OpSubgroupShuffleINTEL = 5571,\n    OpSubgroupShuffleDownINTEL = 5572,\n    OpSubgroupShuffleUpINTEL = 5573,\n    OpSubgroupShuffleXorINTEL = 5574,\n    OpSubgroupBlockReadINTEL = 5575,\n    OpSubgroupBlockWriteINTEL = 5576,\n    OpSubgroupImageBlockReadINTEL = 5577,\n    OpSubgroupImageBlockWriteINTEL = 5578,\n    OpSubgroupImageMediaBlockReadINTEL = 5580,\n    OpSubgroupImageMediaBlockWriteINTEL = 5581,\n    OpUCountLeadingZerosINTEL = 5585,\n    OpUCountTrailingZerosINTEL = 5586,\n    OpAbsISubINTEL = 5587,\n    OpAbsUSubINTEL = 5588,\n    OpIAddSatINTEL = 5589,\n    OpUAddSatINTEL = 5590,\n    OpIAverageINTEL = 5591,\n    OpUAverageINTEL = 5592,\n    OpIAverageRoundedINTEL = 5593,\n    OpUAverageRoundedINTEL = 5594,\n    OpISubSatINTEL = 5595,\n    OpUSubSatINTEL = 5596,\n    OpIMul32x16INTEL = 5597,\n    OpUMul32x16INTEL = 5598,\n    OpConstantFunctionPointerINTEL = 5600,\n    OpFunctionPointerCallINTEL = 5601,\n    OpAsmTargetINTEL = 5609,\n    OpAsmINTEL = 5610,\n    OpAsmCallINTEL = 5611,\n    OpAtomicFMinEXT = 5614,\n    OpAtomicFMaxEXT = 5615,\n    OpAssumeTrueKHR = 5630,\n    OpExpectKHR = 5631,\n    OpDecorateString = 5632,\n    OpDecorateStringGOOGLE = 5632,\n    OpMemberDecorateString = 5633,\n    OpMemberDecorateStringGOOGLE = 5633,\n    OpVmeImageINTEL = 5699,\n    OpTypeVmeImageINTEL = 5700,\n    OpTypeAvcImePayloadINTEL = 5701,\n    OpTypeAvcRefPayloadINTEL = 5702,\n    OpTypeAvcSicPayloadINTEL = 5703,\n    OpTypeAvcMcePayloadINTEL = 5704,\n    OpTypeAvcMceResultINTEL = 5705,\n    OpTypeAvcImeResultINTEL = 5706,\n    OpTypeAvcImeResultSingleReferenceStreamoutINTEL = 5707,\n    OpTypeAvcImeResultDualReferenceStreamoutINTEL = 5708,\n    OpTypeAvcImeSingleReferenceStreaminINTEL = 5709,\n    OpTypeAvcImeDualReferenceStreaminINTEL = 5710,\n    OpTypeAvcRefResultINTEL = 5711,\n    OpTypeAvcSicResultINTEL = 5712,\n    OpSubgroupAvcMceGetDefaultInterBaseMultiReferencePenaltyINTEL = 5713,\n    OpSubgroupAvcMceSetInterBaseMultiReferencePenaltyINTEL = 5714,\n    OpSubgroupAvcMceGetDefaultInterShapePenaltyINTEL = 5715,\n    OpSubgroupAvcMceSetInterShapePenaltyINTEL = 5716,\n    OpSubgroupAvcMceGetDefaultInterDirectionPenaltyINTEL = 5717,\n    OpSubgroupAvcMceSetInterDirectionPenaltyINTEL = 5718,\n    OpSubgroupAvcMceGetDefaultIntraLumaShapePenaltyINTEL = 5719,\n    OpSubgroupAvcMceGetDefaultInterMotionVectorCostTableINTEL = 5720,\n    OpSubgroupAvcMceGetDefaultHighPenaltyCostTableINTEL = 5721,\n    OpSubgroupAvcMceGetDefaultMediumPenaltyCostTableINTEL = 5722,\n    OpSubgroupAvcMceGetDefaultLowPenaltyCostTableINTEL = 5723,\n    OpSubgroupAvcMceSetMotionVectorCostFunctionINTEL = 5724,\n    OpSubgroupAvcMceGetDefaultIntraLumaModePenaltyINTEL = 5725,\n    OpSubgroupAvcMceGetDefaultNonDcLumaIntraPenaltyINTEL = 5726,\n    OpSubgroupAvcMceGetDefaultIntraChromaModeBasePenaltyINTEL = 5727,\n    OpSubgroupAvcMceSetAcOnlyHaarINTEL = 5728,\n    OpSubgroupAvcMceSetSourceInterlacedFieldPolarityINTEL = 5729,\n    OpSubgroupAvcMceSetSingleReferenceInterlacedFieldPolarityINTEL = 5730,\n    OpSubgroupAvcMceSetDualReferenceInterlacedFieldPolaritiesINTEL = 5731,\n    OpSubgroupAvcMceConvertToImePayloadINTEL = 5732,\n    OpSubgroupAvcMceConvertToImeResultINTEL = 5733,\n    OpSubgroupAvcMceConvertToRefPayloadINTEL = 5734,\n    OpSubgroupAvcMceConvertToRefResultINTEL = 5735,\n    OpSubgroupAvcMceConvertToSicPayloadINTEL = 5736,\n    OpSubgroupAvcMceConvertToSicResultINTEL = 5737,\n    OpSubgroupAvcMceGetMotionVectorsINTEL = 5738,\n    OpSubgroupAvcMceGetInterDistortionsINTEL = 5739,\n    OpSubgroupAvcMceGetBestInterDistortionsINTEL = 5740,\n    OpSubgroupAvcMceGetInterMajorShapeINTEL = 5741,\n    OpSubgroupAvcMceGetInterMinorShapeINTEL = 5742,\n    OpSubgroupAvcMceGetInterDirectionsINTEL = 5743,\n    OpSubgroupAvcMceGetInterMotionVectorCountINTEL = 5744,\n    OpSubgroupAvcMceGetInterReferenceIdsINTEL = 5745,\n    OpSubgroupAvcMceGetInterReferenceInterlacedFieldPolaritiesINTEL = 5746,\n    OpSubgroupAvcImeInitializeINTEL = 5747,\n    OpSubgroupAvcImeSetSingleReferenceINTEL = 5748,\n    OpSubgroupAvcImeSetDualReferenceINTEL = 5749,\n    OpSubgroupAvcImeRefWindowSizeINTEL = 5750,\n    OpSubgroupAvcImeAdjustRefOffsetINTEL = 5751,\n    OpSubgroupAvcImeConvertToMcePayloadINTEL = 5752,\n    OpSubgroupAvcImeSetMaxMotionVectorCountINTEL = 5753,\n    OpSubgroupAvcImeSetUnidirectionalMixDisableINTEL = 5754,\n    OpSubgroupAvcImeSetEarlySearchTerminationThresholdINTEL = 5755,\n    OpSubgroupAvcImeSetWeightedSadINTEL = 5756,\n    OpSubgroupAvcImeEvaluateWithSingleReferenceINTEL = 5757,\n    OpSubgroupAvcImeEvaluateWithDualReferenceINTEL = 5758,\n    OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminINTEL = 5759,\n    OpSubgroupAvcImeEvaluateWithDualReferenceStreaminINTEL = 5760,\n    OpSubgroupAvcImeEvaluateWithSingleReferenceStreamoutINTEL = 5761,\n    OpSubgroupAvcImeEvaluateWithDualReferenceStreamoutINTEL = 5762,\n    OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminoutINTEL = 5763,\n    OpSubgroupAvcImeEvaluateWithDualReferenceStreaminoutINTEL = 5764,\n    OpSubgroupAvcImeConvertToMceResultINTEL = 5765,\n    OpSubgroupAvcImeGetSingleReferenceStreaminINTEL = 5766,\n    OpSubgroupAvcImeGetDualReferenceStreaminINTEL = 5767,\n    OpSubgroupAvcImeStripSingleReferenceStreamoutINTEL = 5768,\n    OpSubgroupAvcImeStripDualReferenceStreamoutINTEL = 5769,\n    OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeMotionVectorsINTEL = 5770,\n    OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeDistortionsINTEL = 5771,\n    OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeReferenceIdsINTEL = 5772,\n    OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeMotionVectorsINTEL = 5773,\n    OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeDistortionsINTEL = 5774,\n    OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeReferenceIdsINTEL = 5775,\n    OpSubgroupAvcImeGetBorderReachedINTEL = 5776,\n    OpSubgroupAvcImeGetTruncatedSearchIndicationINTEL = 5777,\n    OpSubgroupAvcImeGetUnidirectionalEarlySearchTerminationINTEL = 5778,\n    OpSubgroupAvcImeGetWeightingPatternMinimumMotionVectorINTEL = 5779,\n    OpSubgroupAvcImeGetWeightingPatternMinimumDistortionINTEL = 5780,\n    OpSubgroupAvcFmeInitializeINTEL = 5781,\n    OpSubgroupAvcBmeInitializeINTEL = 5782,\n    OpSubgroupAvcRefConvertToMcePayloadINTEL = 5783,\n    OpSubgroupAvcRefSetBidirectionalMixDisableINTEL = 5784,\n    OpSubgroupAvcRefSetBilinearFilterEnableINTEL = 5785,\n    OpSubgroupAvcRefEvaluateWithSingleReferenceINTEL = 5786,\n    OpSubgroupAvcRefEvaluateWithDualReferenceINTEL = 5787,\n    OpSubgroupAvcRefEvaluateWithMultiReferenceINTEL = 5788,\n    OpSubgroupAvcRefEvaluateWithMultiReferenceInterlacedINTEL = 5789,\n    OpSubgroupAvcRefConvertToMceResultINTEL = 5790,\n    OpSubgroupAvcSicInitializeINTEL = 5791,\n    OpSubgroupAvcSicConfigureSkcINTEL = 5792,\n    OpSubgroupAvcSicConfigureIpeLumaINTEL = 5793,\n    OpSubgroupAvcSicConfigureIpeLumaChromaINTEL = 5794,\n    OpSubgroupAvcSicGetMotionVectorMaskINTEL = 5795,\n    OpSubgroupAvcSicConvertToMcePayloadINTEL = 5796,\n    OpSubgroupAvcSicSetIntraLumaShapePenaltyINTEL = 5797,\n    OpSubgroupAvcSicSetIntraLumaModeCostFunctionINTEL = 5798,\n    OpSubgroupAvcSicSetIntraChromaModeCostFunctionINTEL = 5799,\n    OpSubgroupAvcSicSetBilinearFilterEnableINTEL = 5800,\n    OpSubgroupAvcSicSetSkcForwardTransformEnableINTEL = 5801,\n    OpSubgroupAvcSicSetBlockBasedRawSkipSadINTEL = 5802,\n    OpSubgroupAvcSicEvaluateIpeINTEL = 5803,\n    OpSubgroupAvcSicEvaluateWithSingleReferenceINTEL = 5804,\n    OpSubgroupAvcSicEvaluateWithDualReferenceINTEL = 5805,\n    OpSubgroupAvcSicEvaluateWithMultiReferenceINTEL = 5806,\n    OpSubgroupAvcSicEvaluateWithMultiReferenceInterlacedINTEL = 5807,\n    OpSubgroupAvcSicConvertToMceResultINTEL = 5808,\n    OpSubgroupAvcSicGetIpeLumaShapeINTEL = 5809,\n    OpSubgroupAvcSicGetBestIpeLumaDistortionINTEL = 5810,\n    OpSubgroupAvcSicGetBestIpeChromaDistortionINTEL = 5811,\n    OpSubgroupAvcSicGetPackedIpeLumaModesINTEL = 5812,\n    OpSubgroupAvcSicGetIpeChromaModeINTEL = 5813,\n    OpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL = 5814,\n    OpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL = 5815,\n    OpSubgroupAvcSicGetInterRawSadsINTEL = 5816,\n    OpVariableLengthArrayINTEL = 5818,\n    OpSaveMemoryINTEL = 5819,\n    OpRestoreMemoryINTEL = 5820,\n    OpArbitraryFloatSinCosPiINTEL = 5840,\n    OpArbitraryFloatCastINTEL = 5841,\n    OpArbitraryFloatCastFromIntINTEL = 5842,\n    OpArbitraryFloatCastToIntINTEL = 5843,\n    OpArbitraryFloatAddINTEL = 5846,\n    OpArbitraryFloatSubINTEL = 5847,\n    OpArbitraryFloatMulINTEL = 5848,\n    OpArbitraryFloatDivINTEL = 5849,\n    OpArbitraryFloatGTINTEL = 5850,\n    OpArbitraryFloatGEINTEL = 5851,\n    OpArbitraryFloatLTINTEL = 5852,\n    OpArbitraryFloatLEINTEL = 5853,\n    OpArbitraryFloatEQINTEL = 5854,\n    OpArbitraryFloatRecipINTEL = 5855,\n    OpArbitraryFloatRSqrtINTEL = 5856,\n    OpArbitraryFloatCbrtINTEL = 5857,\n    OpArbitraryFloatHypotINTEL = 5858,\n    OpArbitraryFloatSqrtINTEL = 5859,\n    OpArbitraryFloatLogINTEL = 5860,\n    OpArbitraryFloatLog2INTEL = 5861,\n    OpArbitraryFloatLog10INTEL = 5862,\n    OpArbitraryFloatLog1pINTEL = 5863,\n    OpArbitraryFloatExpINTEL = 5864,\n    OpArbitraryFloatExp2INTEL = 5865,\n    OpArbitraryFloatExp10INTEL = 5866,\n    OpArbitraryFloatExpm1INTEL = 5867,\n    OpArbitraryFloatSinINTEL = 5868,\n    OpArbitraryFloatCosINTEL = 5869,\n    OpArbitraryFloatSinCosINTEL = 5870,\n    OpArbitraryFloatSinPiINTEL = 5871,\n    OpArbitraryFloatCosPiINTEL = 5872,\n    OpArbitraryFloatASinINTEL = 5873,\n    OpArbitraryFloatASinPiINTEL = 5874,\n    OpArbitraryFloatACosINTEL = 5875,\n    OpArbitraryFloatACosPiINTEL = 5876,\n    OpArbitraryFloatATanINTEL = 5877,\n    OpArbitraryFloatATanPiINTEL = 5878,\n    OpArbitraryFloatATan2INTEL = 5879,\n    OpArbitraryFloatPowINTEL = 5880,\n    OpArbitraryFloatPowRINTEL = 5881,\n    OpArbitraryFloatPowNINTEL = 5882,\n    OpLoopControlINTEL = 5887,\n    OpAliasDomainDeclINTEL = 5911,\n    OpAliasScopeDeclINTEL = 5912,\n    OpAliasScopeListDeclINTEL = 5913,\n    OpFixedSqrtINTEL = 5923,\n    OpFixedRecipINTEL = 5924,\n    OpFixedRsqrtINTEL = 5925,\n    OpFixedSinINTEL = 5926,\n    OpFixedCosINTEL = 5927,\n    OpFixedSinCosINTEL = 5928,\n    OpFixedSinPiINTEL = 5929,\n    OpFixedCosPiINTEL = 5930,\n    OpFixedSinCosPiINTEL = 5931,\n    OpFixedLogINTEL = 5932,\n    OpFixedExpINTEL = 5933,\n    OpPtrCastToCrossWorkgroupINTEL = 5934,\n    OpCrossWorkgroupCastToPtrINTEL = 5938,\n    OpReadPipeBlockingINTEL = 5946,\n    OpWritePipeBlockingINTEL = 5947,\n    OpFPGARegINTEL = 5949,\n    OpRayQueryGetRayTMinKHR = 6016,\n    OpRayQueryGetRayFlagsKHR = 6017,\n    OpRayQueryGetIntersectionTKHR = 6018,\n    OpRayQueryGetIntersectionInstanceCustomIndexKHR = 6019,\n    OpRayQueryGetIntersectionInstanceIdKHR = 6020,\n    OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR = 6021,\n    OpRayQueryGetIntersectionGeometryIndexKHR = 6022,\n    OpRayQueryGetIntersectionPrimitiveIndexKHR = 6023,\n    OpRayQueryGetIntersectionBarycentricsKHR = 6024,\n    OpRayQueryGetIntersectionFrontFaceKHR = 6025,\n    OpRayQueryGetIntersectionCandidateAABBOpaqueKHR = 6026,\n    OpRayQueryGetIntersectionObjectRayDirectionKHR = 6027,\n    OpRayQueryGetIntersectionObjectRayOriginKHR = 6028,\n    OpRayQueryGetWorldRayDirectionKHR = 6029,\n    OpRayQueryGetWorldRayOriginKHR = 6030,\n    OpRayQueryGetIntersectionObjectToWorldKHR = 6031,\n    OpRayQueryGetIntersectionWorldToObjectKHR = 6032,\n    OpAtomicFAddEXT = 6035,\n    OpTypeBufferSurfaceINTEL = 6086,\n    OpTypeStructContinuedINTEL = 6090,\n    OpConstantCompositeContinuedINTEL = 6091,\n    OpSpecConstantCompositeContinuedINTEL = 6092,\n    OpControlBarrierArriveINTEL = 6142,\n    OpControlBarrierWaitINTEL = 6143,\n    OpGroupIMulKHR = 6401,\n    OpGroupFMulKHR = 6402,\n    OpGroupBitwiseAndKHR = 6403,\n    OpGroupBitwiseOrKHR = 6404,\n    OpGroupBitwiseXorKHR = 6405,\n    OpGroupLogicalAndKHR = 6406,\n    OpGroupLogicalOrKHR = 6407,\n    OpGroupLogicalXorKHR = 6408,\n    OpMax = 0x7fffffff,\n};\n\n#ifdef SPV_ENABLE_UTILITY_CODE\n#ifndef __cplusplus\n#include <stdbool.h>\n#endif\ninline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) {\n    *hasResult = *hasResultType = false;\n    switch (opcode) {\n    default: /* unknown opcode */ break;\n    case OpNop: *hasResult = false; *hasResultType = false; break;\n    case OpUndef: *hasResult = true; *hasResultType = true; break;\n    case OpSourceContinued: *hasResult = false; *hasResultType = false; break;\n    case OpSource: *hasResult = false; *hasResultType = false; break;\n    case OpSourceExtension: *hasResult = false; *hasResultType = false; break;\n    case OpName: *hasResult = false; *hasResultType = false; break;\n    case OpMemberName: *hasResult = false; *hasResultType = false; break;\n    case OpString: *hasResult = true; *hasResultType = false; break;\n    case OpLine: *hasResult = false; *hasResultType = false; break;\n    case OpExtension: *hasResult = false; *hasResultType = false; break;\n    case OpExtInstImport: *hasResult = true; *hasResultType = false; break;\n    case OpExtInst: *hasResult = true; *hasResultType = true; break;\n    case OpMemoryModel: *hasResult = false; *hasResultType = false; break;\n    case OpEntryPoint: *hasResult = false; *hasResultType = false; break;\n    case OpExecutionMode: *hasResult = false; *hasResultType = false; break;\n    case OpCapability: *hasResult = false; *hasResultType = false; break;\n    case OpTypeVoid: *hasResult = true; *hasResultType = false; break;\n    case OpTypeBool: *hasResult = true; *hasResultType = false; break;\n    case OpTypeInt: *hasResult = true; *hasResultType = false; break;\n    case OpTypeFloat: *hasResult = true; *hasResultType = false; break;\n    case OpTypeVector: *hasResult = true; *hasResultType = false; break;\n    case OpTypeMatrix: *hasResult = true; *hasResultType = false; break;\n    case OpTypeImage: *hasResult = true; *hasResultType = false; break;\n    case OpTypeSampler: *hasResult = true; *hasResultType = false; break;\n    case OpTypeSampledImage: *hasResult = true; *hasResultType = false; break;\n    case OpTypeArray: *hasResult = true; *hasResultType = false; break;\n    case OpTypeRuntimeArray: *hasResult = true; *hasResultType = false; break;\n    case OpTypeStruct: *hasResult = true; *hasResultType = false; break;\n    case OpTypeOpaque: *hasResult = true; *hasResultType = false; break;\n    case OpTypePointer: *hasResult = true; *hasResultType = false; break;\n    case OpTypeFunction: *hasResult = true; *hasResultType = false; break;\n    case OpTypeEvent: *hasResult = true; *hasResultType = false; break;\n    case OpTypeDeviceEvent: *hasResult = true; *hasResultType = false; break;\n    case OpTypeReserveId: *hasResult = true; *hasResultType = false; break;\n    case OpTypeQueue: *hasResult = true; *hasResultType = false; break;\n    case OpTypePipe: *hasResult = true; *hasResultType = false; break;\n    case OpTypeForwardPointer: *hasResult = false; *hasResultType = false; break;\n    case OpConstantTrue: *hasResult = true; *hasResultType = true; break;\n    case OpConstantFalse: *hasResult = true; *hasResultType = true; break;\n    case OpConstant: *hasResult = true; *hasResultType = true; break;\n    case OpConstantComposite: *hasResult = true; *hasResultType = true; break;\n    case OpConstantSampler: *hasResult = true; *hasResultType = true; break;\n    case OpConstantNull: *hasResult = true; *hasResultType = true; break;\n    case OpSpecConstantTrue: *hasResult = true; *hasResultType = true; break;\n    case OpSpecConstantFalse: *hasResult = true; *hasResultType = true; break;\n    case OpSpecConstant: *hasResult = true; *hasResultType = true; break;\n    case OpSpecConstantComposite: *hasResult = true; *hasResultType = true; break;\n    case OpSpecConstantOp: *hasResult = true; *hasResultType = true; break;\n    case OpFunction: *hasResult = true; *hasResultType = true; break;\n    case OpFunctionParameter: *hasResult = true; *hasResultType = true; break;\n    case OpFunctionEnd: *hasResult = false; *hasResultType = false; break;\n    case OpFunctionCall: *hasResult = true; *hasResultType = true; break;\n    case OpVariable: *hasResult = true; *hasResultType = true; break;\n    case OpImageTexelPointer: *hasResult = true; *hasResultType = true; break;\n    case OpLoad: *hasResult = true; *hasResultType = true; break;\n    case OpStore: *hasResult = false; *hasResultType = false; break;\n    case OpCopyMemory: *hasResult = false; *hasResultType = false; break;\n    case OpCopyMemorySized: *hasResult = false; *hasResultType = false; break;\n    case OpAccessChain: *hasResult = true; *hasResultType = true; break;\n    case OpInBoundsAccessChain: *hasResult = true; *hasResultType = true; break;\n    case OpPtrAccessChain: *hasResult = true; *hasResultType = true; break;\n    case OpArrayLength: *hasResult = true; *hasResultType = true; break;\n    case OpGenericPtrMemSemantics: *hasResult = true; *hasResultType = true; break;\n    case OpInBoundsPtrAccessChain: *hasResult = true; *hasResultType = true; break;\n    case OpDecorate: *hasResult = false; *hasResultType = false; break;\n    case OpMemberDecorate: *hasResult = false; *hasResultType = false; break;\n    case OpDecorationGroup: *hasResult = true; *hasResultType = false; break;\n    case OpGroupDecorate: *hasResult = false; *hasResultType = false; break;\n    case OpGroupMemberDecorate: *hasResult = false; *hasResultType = false; break;\n    case OpVectorExtractDynamic: *hasResult = true; *hasResultType = true; break;\n    case OpVectorInsertDynamic: *hasResult = true; *hasResultType = true; break;\n    case OpVectorShuffle: *hasResult = true; *hasResultType = true; break;\n    case OpCompositeConstruct: *hasResult = true; *hasResultType = true; break;\n    case OpCompositeExtract: *hasResult = true; *hasResultType = true; break;\n    case OpCompositeInsert: *hasResult = true; *hasResultType = true; break;\n    case OpCopyObject: *hasResult = true; *hasResultType = true; break;\n    case OpTranspose: *hasResult = true; *hasResultType = true; break;\n    case OpSampledImage: *hasResult = true; *hasResultType = true; break;\n    case OpImageSampleImplicitLod: *hasResult = true; *hasResultType = true; break;\n    case OpImageSampleExplicitLod: *hasResult = true; *hasResultType = true; break;\n    case OpImageSampleDrefImplicitLod: *hasResult = true; *hasResultType = true; break;\n    case OpImageSampleDrefExplicitLod: *hasResult = true; *hasResultType = true; break;\n    case OpImageSampleProjImplicitLod: *hasResult = true; *hasResultType = true; break;\n    case OpImageSampleProjExplicitLod: *hasResult = true; *hasResultType = true; break;\n    case OpImageSampleProjDrefImplicitLod: *hasResult = true; *hasResultType = true; break;\n    case OpImageSampleProjDrefExplicitLod: *hasResult = true; *hasResultType = true; break;\n    case OpImageFetch: *hasResult = true; *hasResultType = true; break;\n    case OpImageGather: *hasResult = true; *hasResultType = true; break;\n    case OpImageDrefGather: *hasResult = true; *hasResultType = true; break;\n    case OpImageRead: *hasResult = true; *hasResultType = true; break;\n    case OpImageWrite: *hasResult = false; *hasResultType = false; break;\n    case OpImage: *hasResult = true; *hasResultType = true; break;\n    case OpImageQueryFormat: *hasResult = true; *hasResultType = true; break;\n    case OpImageQueryOrder: *hasResult = true; *hasResultType = true; break;\n    case OpImageQuerySizeLod: *hasResult = true; *hasResultType = true; break;\n    case OpImageQuerySize: *hasResult = true; *hasResultType = true; break;\n    case OpImageQueryLod: *hasResult = true; *hasResultType = true; break;\n    case OpImageQueryLevels: *hasResult = true; *hasResultType = true; break;\n    case OpImageQuerySamples: *hasResult = true; *hasResultType = true; break;\n    case OpConvertFToU: *hasResult = true; *hasResultType = true; break;\n    case OpConvertFToS: *hasResult = true; *hasResultType = true; break;\n    case OpConvertSToF: *hasResult = true; *hasResultType = true; break;\n    case OpConvertUToF: *hasResult = true; *hasResultType = true; break;\n    case OpUConvert: *hasResult = true; *hasResultType = true; break;\n    case OpSConvert: *hasResult = true; *hasResultType = true; break;\n    case OpFConvert: *hasResult = true; *hasResultType = true; break;\n    case OpQuantizeToF16: *hasResult = true; *hasResultType = true; break;\n    case OpConvertPtrToU: *hasResult = true; *hasResultType = true; break;\n    case OpSatConvertSToU: *hasResult = true; *hasResultType = true; break;\n    case OpSatConvertUToS: *hasResult = true; *hasResultType = true; break;\n    case OpConvertUToPtr: *hasResult = true; *hasResultType = true; break;\n    case OpPtrCastToGeneric: *hasResult = true; *hasResultType = true; break;\n    case OpGenericCastToPtr: *hasResult = true; *hasResultType = true; break;\n    case OpGenericCastToPtrExplicit: *hasResult = true; *hasResultType = true; break;\n    case OpBitcast: *hasResult = true; *hasResultType = true; break;\n    case OpSNegate: *hasResult = true; *hasResultType = true; break;\n    case OpFNegate: *hasResult = true; *hasResultType = true; break;\n    case OpIAdd: *hasResult = true; *hasResultType = true; break;\n    case OpFAdd: *hasResult = true; *hasResultType = true; break;\n    case OpISub: *hasResult = true; *hasResultType = true; break;\n    case OpFSub: *hasResult = true; *hasResultType = true; break;\n    case OpIMul: *hasResult = true; *hasResultType = true; break;\n    case OpFMul: *hasResult = true; *hasResultType = true; break;\n    case OpUDiv: *hasResult = true; *hasResultType = true; break;\n    case OpSDiv: *hasResult = true; *hasResultType = true; break;\n    case OpFDiv: *hasResult = true; *hasResultType = true; break;\n    case OpUMod: *hasResult = true; *hasResultType = true; break;\n    case OpSRem: *hasResult = true; *hasResultType = true; break;\n    case OpSMod: *hasResult = true; *hasResultType = true; break;\n    case OpFRem: *hasResult = true; *hasResultType = true; break;\n    case OpFMod: *hasResult = true; *hasResultType = true; break;\n    case OpVectorTimesScalar: *hasResult = true; *hasResultType = true; break;\n    case OpMatrixTimesScalar: *hasResult = true; *hasResultType = true; break;\n    case OpVectorTimesMatrix: *hasResult = true; *hasResultType = true; break;\n    case OpMatrixTimesVector: *hasResult = true; *hasResultType = true; break;\n    case OpMatrixTimesMatrix: *hasResult = true; *hasResultType = true; break;\n    case OpOuterProduct: *hasResult = true; *hasResultType = true; break;\n    case OpDot: *hasResult = true; *hasResultType = true; break;\n    case OpIAddCarry: *hasResult = true; *hasResultType = true; break;\n    case OpISubBorrow: *hasResult = true; *hasResultType = true; break;\n    case OpUMulExtended: *hasResult = true; *hasResultType = true; break;\n    case OpSMulExtended: *hasResult = true; *hasResultType = true; break;\n    case OpAny: *hasResult = true; *hasResultType = true; break;\n    case OpAll: *hasResult = true; *hasResultType = true; break;\n    case OpIsNan: *hasResult = true; *hasResultType = true; break;\n    case OpIsInf: *hasResult = true; *hasResultType = true; break;\n    case OpIsFinite: *hasResult = true; *hasResultType = true; break;\n    case OpIsNormal: *hasResult = true; *hasResultType = true; break;\n    case OpSignBitSet: *hasResult = true; *hasResultType = true; break;\n    case OpLessOrGreater: *hasResult = true; *hasResultType = true; break;\n    case OpOrdered: *hasResult = true; *hasResultType = true; break;\n    case OpUnordered: *hasResult = true; *hasResultType = true; break;\n    case OpLogicalEqual: *hasResult = true; *hasResultType = true; break;\n    case OpLogicalNotEqual: *hasResult = true; *hasResultType = true; break;\n    case OpLogicalOr: *hasResult = true; *hasResultType = true; break;\n    case OpLogicalAnd: *hasResult = true; *hasResultType = true; break;\n    case OpLogicalNot: *hasResult = true; *hasResultType = true; break;\n    case OpSelect: *hasResult = true; *hasResultType = true; break;\n    case OpIEqual: *hasResult = true; *hasResultType = true; break;\n    case OpINotEqual: *hasResult = true; *hasResultType = true; break;\n    case OpUGreaterThan: *hasResult = true; *hasResultType = true; break;\n    case OpSGreaterThan: *hasResult = true; *hasResultType = true; break;\n    case OpUGreaterThanEqual: *hasResult = true; *hasResultType = true; break;\n    case OpSGreaterThanEqual: *hasResult = true; *hasResultType = true; break;\n    case OpULessThan: *hasResult = true; *hasResultType = true; break;\n    case OpSLessThan: *hasResult = true; *hasResultType = true; break;\n    case OpULessThanEqual: *hasResult = true; *hasResultType = true; break;\n    case OpSLessThanEqual: *hasResult = true; *hasResultType = true; break;\n    case OpFOrdEqual: *hasResult = true; *hasResultType = true; break;\n    case OpFUnordEqual: *hasResult = true; *hasResultType = true; break;\n    case OpFOrdNotEqual: *hasResult = true; *hasResultType = true; break;\n    case OpFUnordNotEqual: *hasResult = true; *hasResultType = true; break;\n    case OpFOrdLessThan: *hasResult = true; *hasResultType = true; break;\n    case OpFUnordLessThan: *hasResult = true; *hasResultType = true; break;\n    case OpFOrdGreaterThan: *hasResult = true; *hasResultType = true; break;\n    case OpFUnordGreaterThan: *hasResult = true; *hasResultType = true; break;\n    case OpFOrdLessThanEqual: *hasResult = true; *hasResultType = true; break;\n    case OpFUnordLessThanEqual: *hasResult = true; *hasResultType = true; break;\n    case OpFOrdGreaterThanEqual: *hasResult = true; *hasResultType = true; break;\n    case OpFUnordGreaterThanEqual: *hasResult = true; *hasResultType = true; break;\n    case OpShiftRightLogical: *hasResult = true; *hasResultType = true; break;\n    case OpShiftRightArithmetic: *hasResult = true; *hasResultType = true; break;\n    case OpShiftLeftLogical: *hasResult = true; *hasResultType = true; break;\n    case OpBitwiseOr: *hasResult = true; *hasResultType = true; break;\n    case OpBitwiseXor: *hasResult = true; *hasResultType = true; break;\n    case OpBitwiseAnd: *hasResult = true; *hasResultType = true; break;\n    case OpNot: *hasResult = true; *hasResultType = true; break;\n    case OpBitFieldInsert: *hasResult = true; *hasResultType = true; break;\n    case OpBitFieldSExtract: *hasResult = true; *hasResultType = true; break;\n    case OpBitFieldUExtract: *hasResult = true; *hasResultType = true; break;\n    case OpBitReverse: *hasResult = true; *hasResultType = true; break;\n    case OpBitCount: *hasResult = true; *hasResultType = true; break;\n    case OpDPdx: *hasResult = true; *hasResultType = true; break;\n    case OpDPdy: *hasResult = true; *hasResultType = true; break;\n    case OpFwidth: *hasResult = true; *hasResultType = true; break;\n    case OpDPdxFine: *hasResult = true; *hasResultType = true; break;\n    case OpDPdyFine: *hasResult = true; *hasResultType = true; break;\n    case OpFwidthFine: *hasResult = true; *hasResultType = true; break;\n    case OpDPdxCoarse: *hasResult = true; *hasResultType = true; break;\n    case OpDPdyCoarse: *hasResult = true; *hasResultType = true; break;\n    case OpFwidthCoarse: *hasResult = true; *hasResultType = true; break;\n    case OpEmitVertex: *hasResult = false; *hasResultType = false; break;\n    case OpEndPrimitive: *hasResult = false; *hasResultType = false; break;\n    case OpEmitStreamVertex: *hasResult = false; *hasResultType = false; break;\n    case OpEndStreamPrimitive: *hasResult = false; *hasResultType = false; break;\n    case OpControlBarrier: *hasResult = false; *hasResultType = false; break;\n    case OpMemoryBarrier: *hasResult = false; *hasResultType = false; break;\n    case OpAtomicLoad: *hasResult = true; *hasResultType = true; break;\n    case OpAtomicStore: *hasResult = false; *hasResultType = false; break;\n    case OpAtomicExchange: *hasResult = true; *hasResultType = true; break;\n    case OpAtomicCompareExchange: *hasResult = true; *hasResultType = true; break;\n    case OpAtomicCompareExchangeWeak: *hasResult = true; *hasResultType = true; break;\n    case OpAtomicIIncrement: *hasResult = true; *hasResultType = true; break;\n    case OpAtomicIDecrement: *hasResult = true; *hasResultType = true; break;\n    case OpAtomicIAdd: *hasResult = true; *hasResultType = true; break;\n    case OpAtomicISub: *hasResult = true; *hasResultType = true; break;\n    case OpAtomicSMin: *hasResult = true; *hasResultType = true; break;\n    case OpAtomicUMin: *hasResult = true; *hasResultType = true; break;\n    case OpAtomicSMax: *hasResult = true; *hasResultType = true; break;\n    case OpAtomicUMax: *hasResult = true; *hasResultType = true; break;\n    case OpAtomicAnd: *hasResult = true; *hasResultType = true; break;\n    case OpAtomicOr: *hasResult = true; *hasResultType = true; break;\n    case OpAtomicXor: *hasResult = true; *hasResultType = true; break;\n    case OpPhi: *hasResult = true; *hasResultType = true; break;\n    case OpLoopMerge: *hasResult = false; *hasResultType = false; break;\n    case OpSelectionMerge: *hasResult = false; *hasResultType = false; break;\n    case OpLabel: *hasResult = true; *hasResultType = false; break;\n    case OpBranch: *hasResult = false; *hasResultType = false; break;\n    case OpBranchConditional: *hasResult = false; *hasResultType = false; break;\n    case OpSwitch: *hasResult = false; *hasResultType = false; break;\n    case OpKill: *hasResult = false; *hasResultType = false; break;\n    case OpReturn: *hasResult = false; *hasResultType = false; break;\n    case OpReturnValue: *hasResult = false; *hasResultType = false; break;\n    case OpUnreachable: *hasResult = false; *hasResultType = false; break;\n    case OpLifetimeStart: *hasResult = false; *hasResultType = false; break;\n    case OpLifetimeStop: *hasResult = false; *hasResultType = false; break;\n    case OpGroupAsyncCopy: *hasResult = true; *hasResultType = true; break;\n    case OpGroupWaitEvents: *hasResult = false; *hasResultType = false; break;\n    case OpGroupAll: *hasResult = true; *hasResultType = true; break;\n    case OpGroupAny: *hasResult = true; *hasResultType = true; break;\n    case OpGroupBroadcast: *hasResult = true; *hasResultType = true; break;\n    case OpGroupIAdd: *hasResult = true; *hasResultType = true; break;\n    case OpGroupFAdd: *hasResult = true; *hasResultType = true; break;\n    case OpGroupFMin: *hasResult = true; *hasResultType = true; break;\n    case OpGroupUMin: *hasResult = true; *hasResultType = true; break;\n    case OpGroupSMin: *hasResult = true; *hasResultType = true; break;\n    case OpGroupFMax: *hasResult = true; *hasResultType = true; break;\n    case OpGroupUMax: *hasResult = true; *hasResultType = true; break;\n    case OpGroupSMax: *hasResult = true; *hasResultType = true; break;\n    case OpReadPipe: *hasResult = true; *hasResultType = true; break;\n    case OpWritePipe: *hasResult = true; *hasResultType = true; break;\n    case OpReservedReadPipe: *hasResult = true; *hasResultType = true; break;\n    case OpReservedWritePipe: *hasResult = true; *hasResultType = true; break;\n    case OpReserveReadPipePackets: *hasResult = true; *hasResultType = true; break;\n    case OpReserveWritePipePackets: *hasResult = true; *hasResultType = true; break;\n    case OpCommitReadPipe: *hasResult = false; *hasResultType = false; break;\n    case OpCommitWritePipe: *hasResult = false; *hasResultType = false; break;\n    case OpIsValidReserveId: *hasResult = true; *hasResultType = true; break;\n    case OpGetNumPipePackets: *hasResult = true; *hasResultType = true; break;\n    case OpGetMaxPipePackets: *hasResult = true; *hasResultType = true; break;\n    case OpGroupReserveReadPipePackets: *hasResult = true; *hasResultType = true; break;\n    case OpGroupReserveWritePipePackets: *hasResult = true; *hasResultType = true; break;\n    case OpGroupCommitReadPipe: *hasResult = false; *hasResultType = false; break;\n    case OpGroupCommitWritePipe: *hasResult = false; *hasResultType = false; break;\n    case OpEnqueueMarker: *hasResult = true; *hasResultType = true; break;\n    case OpEnqueueKernel: *hasResult = true; *hasResultType = true; break;\n    case OpGetKernelNDrangeSubGroupCount: *hasResult = true; *hasResultType = true; break;\n    case OpGetKernelNDrangeMaxSubGroupSize: *hasResult = true; *hasResultType = true; break;\n    case OpGetKernelWorkGroupSize: *hasResult = true; *hasResultType = true; break;\n    case OpGetKernelPreferredWorkGroupSizeMultiple: *hasResult = true; *hasResultType = true; break;\n    case OpRetainEvent: *hasResult = false; *hasResultType = false; break;\n    case OpReleaseEvent: *hasResult = false; *hasResultType = false; break;\n    case OpCreateUserEvent: *hasResult = true; *hasResultType = true; break;\n    case OpIsValidEvent: *hasResult = true; *hasResultType = true; break;\n    case OpSetUserEventStatus: *hasResult = false; *hasResultType = false; break;\n    case OpCaptureEventProfilingInfo: *hasResult = false; *hasResultType = false; break;\n    case OpGetDefaultQueue: *hasResult = true; *hasResultType = true; break;\n    case OpBuildNDRange: *hasResult = true; *hasResultType = true; break;\n    case OpImageSparseSampleImplicitLod: *hasResult = true; *hasResultType = true; break;\n    case OpImageSparseSampleExplicitLod: *hasResult = true; *hasResultType = true; break;\n    case OpImageSparseSampleDrefImplicitLod: *hasResult = true; *hasResultType = true; break;\n    case OpImageSparseSampleDrefExplicitLod: *hasResult = true; *hasResultType = true; break;\n    case OpImageSparseSampleProjImplicitLod: *hasResult = true; *hasResultType = true; break;\n    case OpImageSparseSampleProjExplicitLod: *hasResult = true; *hasResultType = true; break;\n    case OpImageSparseSampleProjDrefImplicitLod: *hasResult = true; *hasResultType = true; break;\n    case OpImageSparseSampleProjDrefExplicitLod: *hasResult = true; *hasResultType = true; break;\n    case OpImageSparseFetch: *hasResult = true; *hasResultType = true; break;\n    case OpImageSparseGather: *hasResult = true; *hasResultType = true; break;\n    case OpImageSparseDrefGather: *hasResult = true; *hasResultType = true; break;\n    case OpImageSparseTexelsResident: *hasResult = true; *hasResultType = true; break;\n    case OpNoLine: *hasResult = false; *hasResultType = false; break;\n    case OpAtomicFlagTestAndSet: *hasResult = true; *hasResultType = true; break;\n    case OpAtomicFlagClear: *hasResult = false; *hasResultType = false; break;\n    case OpImageSparseRead: *hasResult = true; *hasResultType = true; break;\n    case OpSizeOf: *hasResult = true; *hasResultType = true; break;\n    case OpTypePipeStorage: *hasResult = true; *hasResultType = false; break;\n    case OpConstantPipeStorage: *hasResult = true; *hasResultType = true; break;\n    case OpCreatePipeFromPipeStorage: *hasResult = true; *hasResultType = true; break;\n    case OpGetKernelLocalSizeForSubgroupCount: *hasResult = true; *hasResultType = true; break;\n    case OpGetKernelMaxNumSubgroups: *hasResult = true; *hasResultType = true; break;\n    case OpTypeNamedBarrier: *hasResult = true; *hasResultType = false; break;\n    case OpNamedBarrierInitialize: *hasResult = true; *hasResultType = true; break;\n    case OpMemoryNamedBarrier: *hasResult = false; *hasResultType = false; break;\n    case OpModuleProcessed: *hasResult = false; *hasResultType = false; break;\n    case OpExecutionModeId: *hasResult = false; *hasResultType = false; break;\n    case OpDecorateId: *hasResult = false; *hasResultType = false; break;\n    case OpGroupNonUniformElect: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformAll: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformAny: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformAllEqual: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformBroadcast: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformBroadcastFirst: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformBallot: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformInverseBallot: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformBallotBitExtract: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformBallotBitCount: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformBallotFindLSB: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformBallotFindMSB: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformShuffle: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformShuffleXor: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformShuffleUp: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformShuffleDown: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformIAdd: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformFAdd: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformIMul: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformFMul: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformSMin: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformUMin: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformFMin: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformSMax: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformUMax: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformFMax: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformBitwiseAnd: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformBitwiseOr: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformBitwiseXor: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformLogicalAnd: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformLogicalOr: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformLogicalXor: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformQuadBroadcast: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformQuadSwap: *hasResult = true; *hasResultType = true; break;\n    case OpCopyLogical: *hasResult = true; *hasResultType = true; break;\n    case OpPtrEqual: *hasResult = true; *hasResultType = true; break;\n    case OpPtrNotEqual: *hasResult = true; *hasResultType = true; break;\n    case OpPtrDiff: *hasResult = true; *hasResultType = true; break;\n    case OpTerminateInvocation: *hasResult = false; *hasResultType = false; break;\n    case OpSubgroupBallotKHR: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupFirstInvocationKHR: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAllKHR: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAnyKHR: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAllEqualKHR: *hasResult = true; *hasResultType = true; break;\n    case OpGroupNonUniformRotateKHR: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupReadInvocationKHR: *hasResult = true; *hasResultType = true; break;\n    case OpTraceRayKHR: *hasResult = false; *hasResultType = false; break;\n    case OpExecuteCallableKHR: *hasResult = false; *hasResultType = false; break;\n    case OpConvertUToAccelerationStructureKHR: *hasResult = true; *hasResultType = true; break;\n    case OpIgnoreIntersectionKHR: *hasResult = false; *hasResultType = false; break;\n    case OpTerminateRayKHR: *hasResult = false; *hasResultType = false; break;\n    case OpSDot: *hasResult = true; *hasResultType = true; break;\n    case OpUDot: *hasResult = true; *hasResultType = true; break;\n    case OpSUDot: *hasResult = true; *hasResultType = true; break;\n    case OpSDotAccSat: *hasResult = true; *hasResultType = true; break;\n    case OpUDotAccSat: *hasResult = true; *hasResultType = true; break;\n    case OpSUDotAccSat: *hasResult = true; *hasResultType = true; break;\n    case OpTypeRayQueryKHR: *hasResult = true; *hasResultType = false; break;\n    case OpRayQueryInitializeKHR: *hasResult = false; *hasResultType = false; break;\n    case OpRayQueryTerminateKHR: *hasResult = false; *hasResultType = false; break;\n    case OpRayQueryGenerateIntersectionKHR: *hasResult = false; *hasResultType = false; break;\n    case OpRayQueryConfirmIntersectionKHR: *hasResult = false; *hasResultType = false; break;\n    case OpRayQueryProceedKHR: *hasResult = true; *hasResultType = true; break;\n    case OpRayQueryGetIntersectionTypeKHR: *hasResult = true; *hasResultType = true; break;\n    case OpGroupIAddNonUniformAMD: *hasResult = true; *hasResultType = true; break;\n    case OpGroupFAddNonUniformAMD: *hasResult = true; *hasResultType = true; break;\n    case OpGroupFMinNonUniformAMD: *hasResult = true; *hasResultType = true; break;\n    case OpGroupUMinNonUniformAMD: *hasResult = true; *hasResultType = true; break;\n    case OpGroupSMinNonUniformAMD: *hasResult = true; *hasResultType = true; break;\n    case OpGroupFMaxNonUniformAMD: *hasResult = true; *hasResultType = true; break;\n    case OpGroupUMaxNonUniformAMD: *hasResult = true; *hasResultType = true; break;\n    case OpGroupSMaxNonUniformAMD: *hasResult = true; *hasResultType = true; break;\n    case OpFragmentMaskFetchAMD: *hasResult = true; *hasResultType = true; break;\n    case OpFragmentFetchAMD: *hasResult = true; *hasResultType = true; break;\n    case OpReadClockKHR: *hasResult = true; *hasResultType = true; break;\n    case OpImageSampleFootprintNV: *hasResult = true; *hasResultType = true; break;\n    case OpEmitMeshTasksEXT: *hasResult = false; *hasResultType = false; break;\n    case OpSetMeshOutputsEXT: *hasResult = false; *hasResultType = false; break;\n    case OpGroupNonUniformPartitionNV: *hasResult = true; *hasResultType = true; break;\n    case OpWritePackedPrimitiveIndices4x8NV: *hasResult = false; *hasResultType = false; break;\n    case OpReportIntersectionNV: *hasResult = true; *hasResultType = true; break;\n    case OpIgnoreIntersectionNV: *hasResult = false; *hasResultType = false; break;\n    case OpTerminateRayNV: *hasResult = false; *hasResultType = false; break;\n    case OpTraceNV: *hasResult = false; *hasResultType = false; break;\n    case OpTraceMotionNV: *hasResult = false; *hasResultType = false; break;\n    case OpTraceRayMotionNV: *hasResult = false; *hasResultType = false; break;\n    case OpTypeAccelerationStructureNV: *hasResult = true; *hasResultType = false; break;\n    case OpExecuteCallableNV: *hasResult = false; *hasResultType = false; break;\n    case OpTypeCooperativeMatrixNV: *hasResult = true; *hasResultType = false; break;\n    case OpCooperativeMatrixLoadNV: *hasResult = true; *hasResultType = true; break;\n    case OpCooperativeMatrixStoreNV: *hasResult = false; *hasResultType = false; break;\n    case OpCooperativeMatrixMulAddNV: *hasResult = true; *hasResultType = true; break;\n    case OpCooperativeMatrixLengthNV: *hasResult = true; *hasResultType = true; break;\n    case OpBeginInvocationInterlockEXT: *hasResult = false; *hasResultType = false; break;\n    case OpEndInvocationInterlockEXT: *hasResult = false; *hasResultType = false; break;\n    case OpDemoteToHelperInvocation: *hasResult = false; *hasResultType = false; break;\n    case OpIsHelperInvocationEXT: *hasResult = true; *hasResultType = true; break;\n    case OpConvertUToImageNV: *hasResult = true; *hasResultType = true; break;\n    case OpConvertUToSamplerNV: *hasResult = true; *hasResultType = true; break;\n    case OpConvertImageToUNV: *hasResult = true; *hasResultType = true; break;\n    case OpConvertSamplerToUNV: *hasResult = true; *hasResultType = true; break;\n    case OpConvertUToSampledImageNV: *hasResult = true; *hasResultType = true; break;\n    case OpConvertSampledImageToUNV: *hasResult = true; *hasResultType = true; break;\n    case OpSamplerImageAddressingModeNV: *hasResult = false; *hasResultType = false; break;\n    case OpSubgroupShuffleINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupShuffleDownINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupShuffleUpINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupShuffleXorINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupBlockReadINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupBlockWriteINTEL: *hasResult = false; *hasResultType = false; break;\n    case OpSubgroupImageBlockReadINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupImageBlockWriteINTEL: *hasResult = false; *hasResultType = false; break;\n    case OpSubgroupImageMediaBlockReadINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupImageMediaBlockWriteINTEL: *hasResult = false; *hasResultType = false; break;\n    case OpUCountLeadingZerosINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpUCountTrailingZerosINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpAbsISubINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpAbsUSubINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpIAddSatINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpUAddSatINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpIAverageINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpUAverageINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpIAverageRoundedINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpUAverageRoundedINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpISubSatINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpUSubSatINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpIMul32x16INTEL: *hasResult = true; *hasResultType = true; break;\n    case OpUMul32x16INTEL: *hasResult = true; *hasResultType = true; break;\n    case OpConstantFunctionPointerINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpFunctionPointerCallINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpAsmTargetINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpAsmINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpAsmCallINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpAtomicFMinEXT: *hasResult = true; *hasResultType = true; break;\n    case OpAtomicFMaxEXT: *hasResult = true; *hasResultType = true; break;\n    case OpAssumeTrueKHR: *hasResult = false; *hasResultType = false; break;\n    case OpExpectKHR: *hasResult = true; *hasResultType = true; break;\n    case OpDecorateString: *hasResult = false; *hasResultType = false; break;\n    case OpMemberDecorateString: *hasResult = false; *hasResultType = false; break;\n    case OpVmeImageINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpTypeVmeImageINTEL: *hasResult = true; *hasResultType = false; break;\n    case OpTypeAvcImePayloadINTEL: *hasResult = true; *hasResultType = false; break;\n    case OpTypeAvcRefPayloadINTEL: *hasResult = true; *hasResultType = false; break;\n    case OpTypeAvcSicPayloadINTEL: *hasResult = true; *hasResultType = false; break;\n    case OpTypeAvcMcePayloadINTEL: *hasResult = true; *hasResultType = false; break;\n    case OpTypeAvcMceResultINTEL: *hasResult = true; *hasResultType = false; break;\n    case OpTypeAvcImeResultINTEL: *hasResult = true; *hasResultType = false; break;\n    case OpTypeAvcImeResultSingleReferenceStreamoutINTEL: *hasResult = true; *hasResultType = false; break;\n    case OpTypeAvcImeResultDualReferenceStreamoutINTEL: *hasResult = true; *hasResultType = false; break;\n    case OpTypeAvcImeSingleReferenceStreaminINTEL: *hasResult = true; *hasResultType = false; break;\n    case OpTypeAvcImeDualReferenceStreaminINTEL: *hasResult = true; *hasResultType = false; break;\n    case OpTypeAvcRefResultINTEL: *hasResult = true; *hasResultType = false; break;\n    case OpTypeAvcSicResultINTEL: *hasResult = true; *hasResultType = false; break;\n    case OpSubgroupAvcMceGetDefaultInterBaseMultiReferencePenaltyINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceSetInterBaseMultiReferencePenaltyINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceGetDefaultInterShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceSetInterShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceGetDefaultInterDirectionPenaltyINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceSetInterDirectionPenaltyINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceGetDefaultIntraLumaShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceGetDefaultInterMotionVectorCostTableINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceGetDefaultHighPenaltyCostTableINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceGetDefaultMediumPenaltyCostTableINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceGetDefaultLowPenaltyCostTableINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceSetMotionVectorCostFunctionINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceGetDefaultIntraLumaModePenaltyINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceGetDefaultNonDcLumaIntraPenaltyINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceGetDefaultIntraChromaModeBasePenaltyINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceSetAcOnlyHaarINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceSetSourceInterlacedFieldPolarityINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceSetSingleReferenceInterlacedFieldPolarityINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceSetDualReferenceInterlacedFieldPolaritiesINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceConvertToImePayloadINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceConvertToImeResultINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceConvertToRefPayloadINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceConvertToRefResultINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceConvertToSicPayloadINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceConvertToSicResultINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceGetMotionVectorsINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceGetInterDistortionsINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceGetBestInterDistortionsINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceGetInterMajorShapeINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceGetInterMinorShapeINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceGetInterDirectionsINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceGetInterMotionVectorCountINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceGetInterReferenceIdsINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcMceGetInterReferenceInterlacedFieldPolaritiesINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeInitializeINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeSetSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeSetDualReferenceINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeRefWindowSizeINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeAdjustRefOffsetINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeConvertToMcePayloadINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeSetMaxMotionVectorCountINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeSetUnidirectionalMixDisableINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeSetEarlySearchTerminationThresholdINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeSetWeightedSadINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeEvaluateWithSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeEvaluateWithDualReferenceINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeEvaluateWithDualReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeEvaluateWithSingleReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeEvaluateWithDualReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminoutINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeEvaluateWithDualReferenceStreaminoutINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeConvertToMceResultINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeGetSingleReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeGetDualReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeStripSingleReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeStripDualReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeMotionVectorsINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeDistortionsINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeReferenceIdsINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeMotionVectorsINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeDistortionsINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeReferenceIdsINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeGetBorderReachedINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeGetTruncatedSearchIndicationINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeGetUnidirectionalEarlySearchTerminationINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeGetWeightingPatternMinimumMotionVectorINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcImeGetWeightingPatternMinimumDistortionINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcFmeInitializeINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcBmeInitializeINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcRefConvertToMcePayloadINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcRefSetBidirectionalMixDisableINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcRefSetBilinearFilterEnableINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcRefEvaluateWithSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcRefEvaluateWithDualReferenceINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcRefEvaluateWithMultiReferenceINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcRefEvaluateWithMultiReferenceInterlacedINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcRefConvertToMceResultINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicInitializeINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicConfigureSkcINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicConfigureIpeLumaINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicConfigureIpeLumaChromaINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicGetMotionVectorMaskINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicConvertToMcePayloadINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicSetIntraLumaShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicSetIntraLumaModeCostFunctionINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicSetIntraChromaModeCostFunctionINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicSetBilinearFilterEnableINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicSetSkcForwardTransformEnableINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicSetBlockBasedRawSkipSadINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicEvaluateIpeINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicEvaluateWithSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicEvaluateWithDualReferenceINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicEvaluateWithMultiReferenceINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicEvaluateWithMultiReferenceInterlacedINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicConvertToMceResultINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicGetIpeLumaShapeINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicGetBestIpeLumaDistortionINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicGetBestIpeChromaDistortionINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicGetPackedIpeLumaModesINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicGetIpeChromaModeINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSubgroupAvcSicGetInterRawSadsINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpVariableLengthArrayINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpSaveMemoryINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpRestoreMemoryINTEL: *hasResult = false; *hasResultType = false; break;\n    case OpArbitraryFloatSinCosPiINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatCastINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatCastFromIntINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatCastToIntINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatAddINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatSubINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatMulINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatDivINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatGTINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatGEINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatLTINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatLEINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatEQINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatRecipINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatRSqrtINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatCbrtINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatHypotINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatSqrtINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatLogINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatLog2INTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatLog10INTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatLog1pINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatExpINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatExp2INTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatExp10INTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatExpm1INTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatSinINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatCosINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatSinCosINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatSinPiINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatCosPiINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatASinINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatASinPiINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatACosINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatACosPiINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatATanINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatATanPiINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatATan2INTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatPowINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatPowRINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpArbitraryFloatPowNINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpLoopControlINTEL: *hasResult = false; *hasResultType = false; break;\n    case OpAliasDomainDeclINTEL: *hasResult = true; *hasResultType = false; break;\n    case OpAliasScopeDeclINTEL: *hasResult = true; *hasResultType = false; break;\n    case OpAliasScopeListDeclINTEL: *hasResult = true; *hasResultType = false; break;\n    case OpFixedSqrtINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpFixedRecipINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpFixedRsqrtINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpFixedSinINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpFixedCosINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpFixedSinCosINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpFixedSinPiINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpFixedCosPiINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpFixedSinCosPiINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpFixedLogINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpFixedExpINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpPtrCastToCrossWorkgroupINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpCrossWorkgroupCastToPtrINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpReadPipeBlockingINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpWritePipeBlockingINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpFPGARegINTEL: *hasResult = true; *hasResultType = true; break;\n    case OpRayQueryGetRayTMinKHR: *hasResult = true; *hasResultType = true; break;\n    case OpRayQueryGetRayFlagsKHR: *hasResult = true; *hasResultType = true; break;\n    case OpRayQueryGetIntersectionTKHR: *hasResult = true; *hasResultType = true; break;\n    case OpRayQueryGetIntersectionInstanceCustomIndexKHR: *hasResult = true; *hasResultType = true; break;\n    case OpRayQueryGetIntersectionInstanceIdKHR: *hasResult = true; *hasResultType = true; break;\n    case OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR: *hasResult = true; *hasResultType = true; break;\n    case OpRayQueryGetIntersectionGeometryIndexKHR: *hasResult = true; *hasResultType = true; break;\n    case OpRayQueryGetIntersectionPrimitiveIndexKHR: *hasResult = true; *hasResultType = true; break;\n    case OpRayQueryGetIntersectionBarycentricsKHR: *hasResult = true; *hasResultType = true; break;\n    case OpRayQueryGetIntersectionFrontFaceKHR: *hasResult = true; *hasResultType = true; break;\n    case OpRayQueryGetIntersectionCandidateAABBOpaqueKHR: *hasResult = true; *hasResultType = true; break;\n    case OpRayQueryGetIntersectionObjectRayDirectionKHR: *hasResult = true; *hasResultType = true; break;\n    case OpRayQueryGetIntersectionObjectRayOriginKHR: *hasResult = true; *hasResultType = true; break;\n    case OpRayQueryGetWorldRayDirectionKHR: *hasResult = true; *hasResultType = true; break;\n    case OpRayQueryGetWorldRayOriginKHR: *hasResult = true; *hasResultType = true; break;\n    case OpRayQueryGetIntersectionObjectToWorldKHR: *hasResult = true; *hasResultType = true; break;\n    case OpRayQueryGetIntersectionWorldToObjectKHR: *hasResult = true; *hasResultType = true; break;\n    case OpAtomicFAddEXT: *hasResult = true; *hasResultType = true; break;\n    case OpTypeBufferSurfaceINTEL: *hasResult = true; *hasResultType = false; break;\n    case OpTypeStructContinuedINTEL: *hasResult = false; *hasResultType = false; break;\n    case OpConstantCompositeContinuedINTEL: *hasResult = false; *hasResultType = false; break;\n    case OpSpecConstantCompositeContinuedINTEL: *hasResult = false; *hasResultType = false; break;\n    case OpControlBarrierArriveINTEL: *hasResult = false; *hasResultType = false; break;\n    case OpControlBarrierWaitINTEL: *hasResult = false; *hasResultType = false; break;\n    case OpGroupIMulKHR: *hasResult = true; *hasResultType = true; break;\n    case OpGroupFMulKHR: *hasResult = true; *hasResultType = true; break;\n    case OpGroupBitwiseAndKHR: *hasResult = true; *hasResultType = true; break;\n    case OpGroupBitwiseOrKHR: *hasResult = true; *hasResultType = true; break;\n    case OpGroupBitwiseXorKHR: *hasResult = true; *hasResultType = true; break;\n    case OpGroupLogicalAndKHR: *hasResult = true; *hasResultType = true; break;\n    case OpGroupLogicalOrKHR: *hasResult = true; *hasResultType = true; break;\n    case OpGroupLogicalXorKHR: *hasResult = true; *hasResultType = true; break;\n    }\n}\n#endif /* SPV_ENABLE_UTILITY_CODE */\n\n// Overload operator| for mask bit combining\n\ninline ImageOperandsMask operator|(ImageOperandsMask a, ImageOperandsMask b) { return ImageOperandsMask(unsigned(a) | unsigned(b)); }\ninline FPFastMathModeMask operator|(FPFastMathModeMask a, FPFastMathModeMask b) { return FPFastMathModeMask(unsigned(a) | unsigned(b)); }\ninline SelectionControlMask operator|(SelectionControlMask a, SelectionControlMask b) { return SelectionControlMask(unsigned(a) | unsigned(b)); }\ninline LoopControlMask operator|(LoopControlMask a, LoopControlMask b) { return LoopControlMask(unsigned(a) | unsigned(b)); }\ninline FunctionControlMask operator|(FunctionControlMask a, FunctionControlMask b) { return FunctionControlMask(unsigned(a) | unsigned(b)); }\ninline MemorySemanticsMask operator|(MemorySemanticsMask a, MemorySemanticsMask b) { return MemorySemanticsMask(unsigned(a) | unsigned(b)); }\ninline MemoryAccessMask operator|(MemoryAccessMask a, MemoryAccessMask b) { return MemoryAccessMask(unsigned(a) | unsigned(b)); }\ninline KernelProfilingInfoMask operator|(KernelProfilingInfoMask a, KernelProfilingInfoMask b) { return KernelProfilingInfoMask(unsigned(a) | unsigned(b)); }\ninline RayFlagsMask operator|(RayFlagsMask a, RayFlagsMask b) { return RayFlagsMask(unsigned(a) | unsigned(b)); }\ninline FragmentShadingRateMask operator|(FragmentShadingRateMask a, FragmentShadingRateMask b) { return FragmentShadingRateMask(unsigned(a) | unsigned(b)); }\n\n}  // end namespace spv\n\n#endif  // #ifndef spirv_HPP\n\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv_cfg.cpp",
    "content": "/*\n * Copyright 2016-2021 Arm Limited\n * SPDX-License-Identifier: Apache-2.0 OR MIT\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * At your option, you may choose to accept this material under either:\n *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or\n *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.\n */\n\n#include \"spirv_cfg.hpp\"\n#include \"spirv_cross.hpp\"\n#include <algorithm>\n#include <assert.h>\n\nusing namespace std;\n\nnamespace SPIRV_CROSS_NAMESPACE\n{\nCFG::CFG(Compiler &compiler_, const SPIRFunction &func_)\n    : compiler(compiler_)\n    , func(func_)\n{\n\tbuild_post_order_visit_order();\n\tbuild_immediate_dominators();\n}\n\nuint32_t CFG::find_common_dominator(uint32_t a, uint32_t b) const\n{\n\twhile (a != b)\n\t{\n\t\tif (get_visit_order(a) < get_visit_order(b))\n\t\t\ta = get_immediate_dominator(a);\n\t\telse\n\t\t\tb = get_immediate_dominator(b);\n\t}\n\treturn a;\n}\n\nvoid CFG::build_immediate_dominators()\n{\n\t// Traverse the post-order in reverse and build up the immediate dominator tree.\n\timmediate_dominators.clear();\n\timmediate_dominators[func.entry_block] = func.entry_block;\n\n\tfor (auto i = post_order.size(); i; i--)\n\t{\n\t\tuint32_t block = post_order[i - 1];\n\t\tauto &pred = preceding_edges[block];\n\t\tif (pred.empty()) // This is for the entry block, but we've already set up the dominators.\n\t\t\tcontinue;\n\n\t\tfor (auto &edge : pred)\n\t\t{\n\t\t\tif (immediate_dominators[block])\n\t\t\t{\n\t\t\t\tassert(immediate_dominators[edge]);\n\t\t\t\timmediate_dominators[block] = find_common_dominator(immediate_dominators[block], edge);\n\t\t\t}\n\t\t\telse\n\t\t\t\timmediate_dominators[block] = edge;\n\t\t}\n\t}\n}\n\nbool CFG::is_back_edge(uint32_t to) const\n{\n\t// We have a back edge if the visit order is set with the temporary magic value 0.\n\t// Crossing edges will have already been recorded with a visit order.\n\tauto itr = visit_order.find(to);\n\treturn itr != end(visit_order) && itr->second.get() == 0;\n}\n\nbool CFG::has_visited_forward_edge(uint32_t to) const\n{\n\t// If > 0, we have visited the edge already, and this is not a back edge branch.\n\tauto itr = visit_order.find(to);\n\treturn itr != end(visit_order) && itr->second.get() > 0;\n}\n\nbool CFG::post_order_visit(uint32_t block_id)\n{\n\t// If we have already branched to this block (back edge), stop recursion.\n\t// If our branches are back-edges, we do not record them.\n\t// We have to record crossing edges however.\n\tif (has_visited_forward_edge(block_id))\n\t\treturn true;\n\telse if (is_back_edge(block_id))\n\t\treturn false;\n\n\t// Block back-edges from recursively revisiting ourselves.\n\tvisit_order[block_id].get() = 0;\n\n\tauto &block = compiler.get<SPIRBlock>(block_id);\n\n\t// If this is a loop header, add an implied branch to the merge target.\n\t// This is needed to avoid annoying cases with do { ... } while(false) loops often generated by inliners.\n\t// To the CFG, this is linear control flow, but we risk picking the do/while scope as our dominating block.\n\t// This makes sure that if we are accessing a variable outside the do/while, we choose the loop header as dominator.\n\t// We could use has_visited_forward_edge, but this break code-gen where the merge block is unreachable in the CFG.\n\n\t// Make a point out of visiting merge target first. This is to make sure that post visit order outside the loop\n\t// is lower than inside the loop, which is going to be key for some traversal algorithms like post-dominance analysis.\n\t// For selection constructs true/false blocks will end up visiting the merge block directly and it works out fine,\n\t// but for loops, only the header might end up actually branching to merge block.\n\tif (block.merge == SPIRBlock::MergeLoop && post_order_visit(block.merge_block))\n\t\tadd_branch(block_id, block.merge_block);\n\n\t// First visit our branch targets.\n\tswitch (block.terminator)\n\t{\n\tcase SPIRBlock::Direct:\n\t\tif (post_order_visit(block.next_block))\n\t\t\tadd_branch(block_id, block.next_block);\n\t\tbreak;\n\n\tcase SPIRBlock::Select:\n\t\tif (post_order_visit(block.true_block))\n\t\t\tadd_branch(block_id, block.true_block);\n\t\tif (post_order_visit(block.false_block))\n\t\t\tadd_branch(block_id, block.false_block);\n\t\tbreak;\n\n\tcase SPIRBlock::MultiSelect:\n\t{\n\t\tconst auto &cases = compiler.get_case_list(block);\n\t\tfor (const auto &target : cases)\n\t\t{\n\t\t\tif (post_order_visit(target.block))\n\t\t\t\tadd_branch(block_id, target.block);\n\t\t}\n\t\tif (block.default_block && post_order_visit(block.default_block))\n\t\t\tadd_branch(block_id, block.default_block);\n\t\tbreak;\n\t}\n\tdefault:\n\t\tbreak;\n\t}\n\n\t// If this is a selection merge, add an implied branch to the merge target.\n\t// This is needed to avoid cases where an inner branch dominates the outer branch.\n\t// This can happen if one of the branches exit early, e.g.:\n\t// if (cond) { ...; break; } else { var = 100 } use_var(var);\n\t// We can use the variable without a Phi since there is only one possible parent here.\n\t// However, in this case, we need to hoist out the inner variable to outside the branch.\n\t// Use same strategy as loops.\n\tif (block.merge == SPIRBlock::MergeSelection && post_order_visit(block.next_block))\n\t{\n\t\t// If there is only one preceding edge to the merge block and it's not ourselves, we need a fixup.\n\t\t// Add a fake branch so any dominator in either the if (), or else () block, or a lone case statement\n\t\t// will be hoisted out to outside the selection merge.\n\t\t// If size > 1, the variable will be automatically hoisted, so we should not mess with it.\n\t\t// The exception here is switch blocks, where we can have multiple edges to merge block,\n\t\t// all coming from same scope, so be more conservative in this case.\n\t\t// Adding fake branches unconditionally breaks parameter preservation analysis,\n\t\t// which looks at how variables are accessed through the CFG.\n\t\tauto pred_itr = preceding_edges.find(block.next_block);\n\t\tif (pred_itr != end(preceding_edges))\n\t\t{\n\t\t\tauto &pred = pred_itr->second;\n\t\t\tauto succ_itr = succeeding_edges.find(block_id);\n\t\t\tsize_t num_succeeding_edges = 0;\n\t\t\tif (succ_itr != end(succeeding_edges))\n\t\t\t\tnum_succeeding_edges = succ_itr->second.size();\n\n\t\t\tif (block.terminator == SPIRBlock::MultiSelect && num_succeeding_edges == 1)\n\t\t\t{\n\t\t\t\t// Multiple branches can come from the same scope due to \"break;\", so we need to assume that all branches\n\t\t\t\t// come from same case scope in worst case, even if there are multiple preceding edges.\n\t\t\t\t// If we have more than one succeeding edge from the block header, it should be impossible\n\t\t\t\t// to have a dominator be inside the block.\n\t\t\t\t// Only case this can go wrong is if we have 2 or more edges from block header and\n\t\t\t\t// 2 or more edges to merge block, and still have dominator be inside a case label.\n\t\t\t\tif (!pred.empty())\n\t\t\t\t\tadd_branch(block_id, block.next_block);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (pred.size() == 1 && *pred.begin() != block_id)\n\t\t\t\t\tadd_branch(block_id, block.next_block);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// If the merge block does not have any preceding edges, i.e. unreachable, hallucinate it.\n\t\t\t// We're going to do code-gen for it, and domination analysis requires that we have at least one preceding edge.\n\t\t\tadd_branch(block_id, block.next_block);\n\t\t}\n\t}\n\n\t// Then visit ourselves. Start counting at one, to let 0 be a magic value for testing back vs. crossing edges.\n\tvisit_order[block_id].get() = ++visit_count;\n\tpost_order.push_back(block_id);\n\treturn true;\n}\n\nvoid CFG::build_post_order_visit_order()\n{\n\tuint32_t block = func.entry_block;\n\tvisit_count = 0;\n\tvisit_order.clear();\n\tpost_order.clear();\n\tpost_order_visit(block);\n}\n\nvoid CFG::add_branch(uint32_t from, uint32_t to)\n{\n\tconst auto add_unique = [](SmallVector<uint32_t> &l, uint32_t value) {\n\t\tauto itr = find(begin(l), end(l), value);\n\t\tif (itr == end(l))\n\t\t\tl.push_back(value);\n\t};\n\tadd_unique(preceding_edges[to], from);\n\tadd_unique(succeeding_edges[from], to);\n}\n\nuint32_t CFG::find_loop_dominator(uint32_t block_id) const\n{\n\twhile (block_id != SPIRBlock::NoDominator)\n\t{\n\t\tauto itr = preceding_edges.find(block_id);\n\t\tif (itr == end(preceding_edges))\n\t\t\treturn SPIRBlock::NoDominator;\n\t\tif (itr->second.empty())\n\t\t\treturn SPIRBlock::NoDominator;\n\n\t\tuint32_t pred_block_id = SPIRBlock::NoDominator;\n\t\tbool ignore_loop_header = false;\n\n\t\t// If we are a merge block, go directly to the header block.\n\t\t// Only consider a loop dominator if we are branching from inside a block to a loop header.\n\t\t// NOTE: In the CFG we forced an edge from header to merge block always to support variable scopes properly.\n\t\tfor (auto &pred : itr->second)\n\t\t{\n\t\t\tauto &pred_block = compiler.get<SPIRBlock>(pred);\n\t\t\tif (pred_block.merge == SPIRBlock::MergeLoop && pred_block.merge_block == ID(block_id))\n\t\t\t{\n\t\t\t\tpred_block_id = pred;\n\t\t\t\tignore_loop_header = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (pred_block.merge == SPIRBlock::MergeSelection && pred_block.next_block == ID(block_id))\n\t\t\t{\n\t\t\t\tpred_block_id = pred;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// No merge block means we can just pick any edge. Loop headers dominate the inner loop, so any path we\n\t\t// take will lead there.\n\t\tif (pred_block_id == SPIRBlock::NoDominator)\n\t\t\tpred_block_id = itr->second.front();\n\n\t\tblock_id = pred_block_id;\n\n\t\tif (!ignore_loop_header && block_id)\n\t\t{\n\t\t\tauto &block = compiler.get<SPIRBlock>(block_id);\n\t\t\tif (block.merge == SPIRBlock::MergeLoop)\n\t\t\t\treturn block_id;\n\t\t}\n\t}\n\n\treturn block_id;\n}\n\nbool CFG::node_terminates_control_flow_in_sub_graph(BlockID from, BlockID to) const\n{\n\t// Walk backwards, starting from \"to\" block.\n\t// Only follow pred edges if they have a 1:1 relationship, or a merge relationship.\n\t// If we cannot find a path to \"from\", we must assume that to is inside control flow in some way.\n\n\tauto &from_block = compiler.get<SPIRBlock>(from);\n\tBlockID ignore_block_id = 0;\n\tif (from_block.merge == SPIRBlock::MergeLoop)\n\t\tignore_block_id = from_block.merge_block;\n\n\twhile (to != from)\n\t{\n\t\tauto pred_itr = preceding_edges.find(to);\n\t\tif (pred_itr == end(preceding_edges))\n\t\t\treturn false;\n\n\t\tDominatorBuilder builder(*this);\n\t\tfor (auto &edge : pred_itr->second)\n\t\t\tbuilder.add_block(edge);\n\n\t\tuint32_t dominator = builder.get_dominator();\n\t\tif (dominator == 0)\n\t\t\treturn false;\n\n\t\tauto &dom = compiler.get<SPIRBlock>(dominator);\n\n\t\tbool true_path_ignore = false;\n\t\tbool false_path_ignore = false;\n\n\t\tbool merges_to_nothing = dom.merge == SPIRBlock::MergeNone ||\n\t\t                         (dom.merge == SPIRBlock::MergeSelection && dom.next_block &&\n\t\t                          compiler.get<SPIRBlock>(dom.next_block).terminator == SPIRBlock::Unreachable) ||\n\t\t                         (dom.merge == SPIRBlock::MergeLoop && dom.merge_block &&\n\t\t                          compiler.get<SPIRBlock>(dom.merge_block).terminator == SPIRBlock::Unreachable);\n\n\t\tif (dom.self == from || merges_to_nothing)\n\t\t{\n\t\t\t// We can only ignore inner branchy paths if there is no merge,\n\t\t\t// i.e. no code is generated afterwards. E.g. this allows us to elide continue:\n\t\t\t// for (;;) { if (cond) { continue; } else { break; } }.\n\t\t\t// Codegen here in SPIR-V will be something like either no merge if one path directly breaks, or\n\t\t\t// we merge to Unreachable.\n\t\t\tif (ignore_block_id && dom.terminator == SPIRBlock::Select)\n\t\t\t{\n\t\t\t\tauto &true_block = compiler.get<SPIRBlock>(dom.true_block);\n\t\t\t\tauto &false_block = compiler.get<SPIRBlock>(dom.false_block);\n\t\t\t\tauto &ignore_block = compiler.get<SPIRBlock>(ignore_block_id);\n\t\t\t\ttrue_path_ignore = compiler.execution_is_branchless(true_block, ignore_block);\n\t\t\t\tfalse_path_ignore = compiler.execution_is_branchless(false_block, ignore_block);\n\t\t\t}\n\t\t}\n\n\t\t// Cases where we allow traversal. This serves as a proxy for post-dominance in a loop body.\n\t\t// TODO: Might want to do full post-dominance analysis, but it's a lot of churn for something like this ...\n\t\t// - We're the merge block of a selection construct. Jump to header.\n\t\t// - We're the merge block of a loop. Jump to header.\n\t\t// - Direct branch. Trivial.\n\t\t// - Allow cases inside a branch if the header cannot merge execution before loop exit.\n\t\tif ((dom.merge == SPIRBlock::MergeSelection && dom.next_block == to) ||\n\t\t    (dom.merge == SPIRBlock::MergeLoop && dom.merge_block == to) ||\n\t\t    (dom.terminator == SPIRBlock::Direct && dom.next_block == to) ||\n\t\t    (dom.terminator == SPIRBlock::Select && dom.true_block == to && false_path_ignore) ||\n\t\t    (dom.terminator == SPIRBlock::Select && dom.false_block == to && true_path_ignore))\n\t\t{\n\t\t\t// Allow walking selection constructs if the other branch reaches out of a loop construct.\n\t\t\t// It cannot be in-scope anymore.\n\t\t\tto = dominator;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nDominatorBuilder::DominatorBuilder(const CFG &cfg_)\n    : cfg(cfg_)\n{\n}\n\nvoid DominatorBuilder::add_block(uint32_t block)\n{\n\tif (!cfg.get_immediate_dominator(block))\n\t{\n\t\t// Unreachable block via the CFG, we will never emit this code anyways.\n\t\treturn;\n\t}\n\n\tif (!dominator)\n\t{\n\t\tdominator = block;\n\t\treturn;\n\t}\n\n\tif (block != dominator)\n\t\tdominator = cfg.find_common_dominator(block, dominator);\n}\n\nvoid DominatorBuilder::lift_continue_block_dominator()\n{\n\t// It is possible for a continue block to be the dominator of a variable is only accessed inside the while block of a do-while loop.\n\t// We cannot safely declare variables inside a continue block, so move any variable declared\n\t// in a continue block to the entry block to simplify.\n\t// It makes very little sense for a continue block to ever be a dominator, so fall back to the simplest\n\t// solution.\n\n\tif (!dominator)\n\t\treturn;\n\n\tauto &block = cfg.get_compiler().get<SPIRBlock>(dominator);\n\tauto post_order = cfg.get_visit_order(dominator);\n\n\t// If we are branching to a block with a higher post-order traversal index (continue blocks), we have a problem\n\t// since we cannot create sensible GLSL code for this, fallback to entry block.\n\tbool back_edge_dominator = false;\n\tswitch (block.terminator)\n\t{\n\tcase SPIRBlock::Direct:\n\t\tif (cfg.get_visit_order(block.next_block) > post_order)\n\t\t\tback_edge_dominator = true;\n\t\tbreak;\n\n\tcase SPIRBlock::Select:\n\t\tif (cfg.get_visit_order(block.true_block) > post_order)\n\t\t\tback_edge_dominator = true;\n\t\tif (cfg.get_visit_order(block.false_block) > post_order)\n\t\t\tback_edge_dominator = true;\n\t\tbreak;\n\n\tcase SPIRBlock::MultiSelect:\n\t{\n\t\tauto &cases = cfg.get_compiler().get_case_list(block);\n\t\tfor (auto &target : cases)\n\t\t{\n\t\t\tif (cfg.get_visit_order(target.block) > post_order)\n\t\t\t\tback_edge_dominator = true;\n\t\t}\n\t\tif (block.default_block && cfg.get_visit_order(block.default_block) > post_order)\n\t\t\tback_edge_dominator = true;\n\t\tbreak;\n\t}\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\tif (back_edge_dominator)\n\t\tdominator = cfg.get_function().entry_block;\n}\n} // namespace SPIRV_CROSS_NAMESPACE\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv_cfg.hpp",
    "content": "/*\n * Copyright 2016-2021 Arm Limited\n * SPDX-License-Identifier: Apache-2.0 OR MIT\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * At your option, you may choose to accept this material under either:\n *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or\n *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.\n */\n\n#ifndef SPIRV_CROSS_CFG_HPP\n#define SPIRV_CROSS_CFG_HPP\n\n#include \"spirv_common.hpp\"\n#include <assert.h>\n\nnamespace SPIRV_CROSS_NAMESPACE\n{\nclass Compiler;\nclass CFG\n{\npublic:\n\tCFG(Compiler &compiler, const SPIRFunction &function);\n\n\tCompiler &get_compiler()\n\t{\n\t\treturn compiler;\n\t}\n\n\tconst Compiler &get_compiler() const\n\t{\n\t\treturn compiler;\n\t}\n\n\tconst SPIRFunction &get_function() const\n\t{\n\t\treturn func;\n\t}\n\n\tuint32_t get_immediate_dominator(uint32_t block) const\n\t{\n\t\tauto itr = immediate_dominators.find(block);\n\t\tif (itr != std::end(immediate_dominators))\n\t\t\treturn itr->second;\n\t\telse\n\t\t\treturn 0;\n\t}\n\n\tbool is_reachable(uint32_t block) const\n\t{\n\t\treturn visit_order.count(block) != 0;\n\t}\n\n\tuint32_t get_visit_order(uint32_t block) const\n\t{\n\t\tauto itr = visit_order.find(block);\n\t\tassert(itr != std::end(visit_order));\n\t\tint v = itr->second.get();\n\t\tassert(v > 0);\n\t\treturn uint32_t(v);\n\t}\n\n\tuint32_t find_common_dominator(uint32_t a, uint32_t b) const;\n\n\tconst SmallVector<uint32_t> &get_preceding_edges(uint32_t block) const\n\t{\n\t\tauto itr = preceding_edges.find(block);\n\t\tif (itr != std::end(preceding_edges))\n\t\t\treturn itr->second;\n\t\telse\n\t\t\treturn empty_vector;\n\t}\n\n\tconst SmallVector<uint32_t> &get_succeeding_edges(uint32_t block) const\n\t{\n\t\tauto itr = succeeding_edges.find(block);\n\t\tif (itr != std::end(succeeding_edges))\n\t\t\treturn itr->second;\n\t\telse\n\t\t\treturn empty_vector;\n\t}\n\n\ttemplate <typename Op>\n\tvoid walk_from(std::unordered_set<uint32_t> &seen_blocks, uint32_t block, const Op &op) const\n\t{\n\t\tif (seen_blocks.count(block))\n\t\t\treturn;\n\t\tseen_blocks.insert(block);\n\n\t\tif (op(block))\n\t\t{\n\t\t\tfor (auto b : get_succeeding_edges(block))\n\t\t\t\twalk_from(seen_blocks, b, op);\n\t\t}\n\t}\n\n\tuint32_t find_loop_dominator(uint32_t block) const;\n\n\tbool node_terminates_control_flow_in_sub_graph(BlockID from, BlockID to) const;\n\nprivate:\n\tstruct VisitOrder\n\t{\n\t\tint &get()\n\t\t{\n\t\t\treturn v;\n\t\t}\n\n\t\tconst int &get() const\n\t\t{\n\t\t\treturn v;\n\t\t}\n\n\t\tint v = -1;\n\t};\n\n\tCompiler &compiler;\n\tconst SPIRFunction &func;\n\tstd::unordered_map<uint32_t, SmallVector<uint32_t>> preceding_edges;\n\tstd::unordered_map<uint32_t, SmallVector<uint32_t>> succeeding_edges;\n\tstd::unordered_map<uint32_t, uint32_t> immediate_dominators;\n\tstd::unordered_map<uint32_t, VisitOrder> visit_order;\n\tSmallVector<uint32_t> post_order;\n\tSmallVector<uint32_t> empty_vector;\n\n\tvoid add_branch(uint32_t from, uint32_t to);\n\tvoid build_post_order_visit_order();\n\tvoid build_immediate_dominators();\n\tbool post_order_visit(uint32_t block);\n\tuint32_t visit_count = 0;\n\n\tbool is_back_edge(uint32_t to) const;\n\tbool has_visited_forward_edge(uint32_t to) const;\n};\n\nclass DominatorBuilder\n{\npublic:\n\tDominatorBuilder(const CFG &cfg);\n\n\tvoid add_block(uint32_t block);\n\tuint32_t get_dominator() const\n\t{\n\t\treturn dominator;\n\t}\n\n\tvoid lift_continue_block_dominator();\n\nprivate:\n\tconst CFG &cfg;\n\tuint32_t dominator = 0;\n};\n} // namespace SPIRV_CROSS_NAMESPACE\n\n#endif\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv_common.hpp",
    "content": "/*\n * Copyright 2015-2021 Arm Limited\n * SPDX-License-Identifier: Apache-2.0 OR MIT\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * At your option, you may choose to accept this material under either:\n *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or\n *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.\n */\n\n#ifndef SPIRV_CROSS_COMMON_HPP\n#define SPIRV_CROSS_COMMON_HPP\n\n#ifndef SPV_ENABLE_UTILITY_CODE\n#define SPV_ENABLE_UTILITY_CODE\n#endif\n#include \"spirv.hpp\"\n\n#include \"spirv_cross_containers.hpp\"\n#include \"spirv_cross_error_handling.hpp\"\n#include <functional>\n\n// A bit crude, but allows projects which embed SPIRV-Cross statically to\n// effectively hide all the symbols from other projects.\n// There is a case where we have:\n// - Project A links against SPIRV-Cross statically.\n// - Project A links against Project B statically.\n// - Project B links against SPIRV-Cross statically (might be a different version).\n// This leads to a conflict with extremely bizarre results.\n// By overriding the namespace in one of the project builds, we can work around this.\n// If SPIRV-Cross is embedded in dynamic libraries,\n// prefer using -fvisibility=hidden on GCC/Clang instead.\n#ifdef SPIRV_CROSS_NAMESPACE_OVERRIDE\n#define SPIRV_CROSS_NAMESPACE SPIRV_CROSS_NAMESPACE_OVERRIDE\n#else\n#define SPIRV_CROSS_NAMESPACE spirv_cross\n#endif\n\nnamespace SPIRV_CROSS_NAMESPACE\n{\nnamespace inner\n{\ntemplate <typename T>\nvoid join_helper(StringStream<> &stream, T &&t)\n{\n\tstream << std::forward<T>(t);\n}\n\ntemplate <typename T, typename... Ts>\nvoid join_helper(StringStream<> &stream, T &&t, Ts &&... ts)\n{\n\tstream << std::forward<T>(t);\n\tjoin_helper(stream, std::forward<Ts>(ts)...);\n}\n} // namespace inner\n\nclass Bitset\n{\npublic:\n\tBitset() = default;\n\texplicit inline Bitset(uint64_t lower_)\n\t    : lower(lower_)\n\t{\n\t}\n\n\tinline bool get(uint32_t bit) const\n\t{\n\t\tif (bit < 64)\n\t\t\treturn (lower & (1ull << bit)) != 0;\n\t\telse\n\t\t\treturn higher.count(bit) != 0;\n\t}\n\n\tinline void set(uint32_t bit)\n\t{\n\t\tif (bit < 64)\n\t\t\tlower |= 1ull << bit;\n\t\telse\n\t\t\thigher.insert(bit);\n\t}\n\n\tinline void clear(uint32_t bit)\n\t{\n\t\tif (bit < 64)\n\t\t\tlower &= ~(1ull << bit);\n\t\telse\n\t\t\thigher.erase(bit);\n\t}\n\n\tinline uint64_t get_lower() const\n\t{\n\t\treturn lower;\n\t}\n\n\tinline void reset()\n\t{\n\t\tlower = 0;\n\t\thigher.clear();\n\t}\n\n\tinline void merge_and(const Bitset &other)\n\t{\n\t\tlower &= other.lower;\n\t\tstd::unordered_set<uint32_t> tmp_set;\n\t\tfor (auto &v : higher)\n\t\t\tif (other.higher.count(v) != 0)\n\t\t\t\ttmp_set.insert(v);\n\t\thigher = std::move(tmp_set);\n\t}\n\n\tinline void merge_or(const Bitset &other)\n\t{\n\t\tlower |= other.lower;\n\t\tfor (auto &v : other.higher)\n\t\t\thigher.insert(v);\n\t}\n\n\tinline bool operator==(const Bitset &other) const\n\t{\n\t\tif (lower != other.lower)\n\t\t\treturn false;\n\n\t\tif (higher.size() != other.higher.size())\n\t\t\treturn false;\n\n\t\tfor (auto &v : higher)\n\t\t\tif (other.higher.count(v) == 0)\n\t\t\t\treturn false;\n\n\t\treturn true;\n\t}\n\n\tinline bool operator!=(const Bitset &other) const\n\t{\n\t\treturn !(*this == other);\n\t}\n\n\ttemplate <typename Op>\n\tvoid for_each_bit(const Op &op) const\n\t{\n\t\t// TODO: Add ctz-based iteration.\n\t\tfor (uint32_t i = 0; i < 64; i++)\n\t\t{\n\t\t\tif (lower & (1ull << i))\n\t\t\t\top(i);\n\t\t}\n\n\t\tif (higher.empty())\n\t\t\treturn;\n\n\t\t// Need to enforce an order here for reproducible results,\n\t\t// but hitting this path should happen extremely rarely, so having this slow path is fine.\n\t\tSmallVector<uint32_t> bits;\n\t\tbits.reserve(higher.size());\n\t\tfor (auto &v : higher)\n\t\t\tbits.push_back(v);\n\t\tstd::sort(std::begin(bits), std::end(bits));\n\n\t\tfor (auto &v : bits)\n\t\t\top(v);\n\t}\n\n\tinline bool empty() const\n\t{\n\t\treturn lower == 0 && higher.empty();\n\t}\n\nprivate:\n\t// The most common bits to set are all lower than 64,\n\t// so optimize for this case. Bits spilling outside 64 go into a slower data structure.\n\t// In almost all cases, higher data structure will not be used.\n\tuint64_t lower = 0;\n\tstd::unordered_set<uint32_t> higher;\n};\n\n// Helper template to avoid lots of nasty string temporary munging.\ntemplate <typename... Ts>\nstd::string join(Ts &&... ts)\n{\n\tStringStream<> stream;\n\tinner::join_helper(stream, std::forward<Ts>(ts)...);\n\treturn stream.str();\n}\n\ninline std::string merge(const SmallVector<std::string> &list, const char *between = \", \")\n{\n\tStringStream<> stream;\n\tfor (auto &elem : list)\n\t{\n\t\tstream << elem;\n\t\tif (&elem != &list.back())\n\t\t\tstream << between;\n\t}\n\treturn stream.str();\n}\n\n// Make sure we don't accidentally call this with float or doubles with SFINAE.\n// Have to use the radix-aware overload.\ntemplate <typename T, typename std::enable_if<!std::is_floating_point<T>::value, int>::type = 0>\ninline std::string convert_to_string(const T &t)\n{\n\treturn std::to_string(t);\n}\n\nstatic inline std::string convert_to_string(int32_t value)\n{\n\t// INT_MIN is ... special on some backends. If we use a decimal literal, and negate it, we\n\t// could accidentally promote the literal to long first, then negate.\n\t// To workaround it, emit int(0x80000000) instead.\n\tif (value == std::numeric_limits<int32_t>::min())\n\t\treturn \"int(0x80000000)\";\n\telse\n\t\treturn std::to_string(value);\n}\n\nstatic inline std::string convert_to_string(int64_t value, const std::string &int64_type, bool long_long_literal_suffix)\n{\n\t// INT64_MIN is ... special on some backends.\n\t// If we use a decimal literal, and negate it, we might overflow the representable numbers.\n\t// To workaround it, emit int(0x80000000) instead.\n\tif (value == std::numeric_limits<int64_t>::min())\n\t\treturn join(int64_type, \"(0x8000000000000000u\", (long_long_literal_suffix ? \"ll\" : \"l\"), \")\");\n\telse\n\t\treturn std::to_string(value) + (long_long_literal_suffix ? \"ll\" : \"l\");\n}\n\n// Allow implementations to set a convenient standard precision\n#ifndef SPIRV_CROSS_FLT_FMT\n#define SPIRV_CROSS_FLT_FMT \"%.32g\"\n#endif\n\n// Disable sprintf and strcat warnings.\n// We cannot rely on snprintf and family existing because, ..., MSVC.\n#if defined(__clang__) || defined(__GNUC__)\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wdeprecated-declarations\"\n#elif defined(_MSC_VER)\n#pragma warning(push)\n#pragma warning(disable : 4996)\n#endif\n\nstatic inline void fixup_radix_point(char *str, char radix_point)\n{\n\t// Setting locales is a very risky business in multi-threaded program,\n\t// so just fixup locales instead. We only need to care about the radix point.\n\tif (radix_point != '.')\n\t{\n\t\twhile (*str != '\\0')\n\t\t{\n\t\t\tif (*str == radix_point)\n\t\t\t\t*str = '.';\n\t\t\tstr++;\n\t\t}\n\t}\n}\n\ninline std::string convert_to_string(float t, char locale_radix_point)\n{\n\t// std::to_string for floating point values is broken.\n\t// Fallback to something more sane.\n\tchar buf[64];\n\tsprintf(buf, SPIRV_CROSS_FLT_FMT, t);\n\tfixup_radix_point(buf, locale_radix_point);\n\n\t// Ensure that the literal is float.\n\tif (!strchr(buf, '.') && !strchr(buf, 'e'))\n\t\tstrcat(buf, \".0\");\n\treturn buf;\n}\n\ninline std::string convert_to_string(double t, char locale_radix_point)\n{\n\t// std::to_string for floating point values is broken.\n\t// Fallback to something more sane.\n\tchar buf[64];\n\tsprintf(buf, SPIRV_CROSS_FLT_FMT, t);\n\tfixup_radix_point(buf, locale_radix_point);\n\n\t// Ensure that the literal is float.\n\tif (!strchr(buf, '.') && !strchr(buf, 'e'))\n\t\tstrcat(buf, \".0\");\n\treturn buf;\n}\n\n#if defined(__clang__) || defined(__GNUC__)\n#pragma GCC diagnostic pop\n#elif defined(_MSC_VER)\n#pragma warning(pop)\n#endif\n\nclass FloatFormatter\n{\npublic:\n\tvirtual ~FloatFormatter() = default;\n\tvirtual std::string format_float(float value) = 0;\n\tvirtual std::string format_double(double value) = 0;\n};\n\ntemplate <typename T>\nstruct ValueSaver\n{\n\texplicit ValueSaver(T &current_)\n\t    : current(current_)\n\t    , saved(current_)\n\t{\n\t}\n\n\tvoid release()\n\t{\n\t\tcurrent = saved;\n\t}\n\n\t~ValueSaver()\n\t{\n\t\trelease();\n\t}\n\n\tT &current;\n\tT saved;\n};\n\nstruct Instruction\n{\n\tuint16_t op = 0;\n\tuint16_t count = 0;\n\t// If offset is 0 (not a valid offset into the instruction stream),\n\t// we have an instruction stream which is embedded in the object.\n\tuint32_t offset = 0;\n\tuint32_t length = 0;\n\n\tinline bool is_embedded() const\n\t{\n\t\treturn offset == 0;\n\t}\n};\n\nstruct EmbeddedInstruction : Instruction\n{\n\tSmallVector<uint32_t> ops;\n};\n\nenum Types\n{\n\tTypeNone,\n\tTypeType,\n\tTypeVariable,\n\tTypeConstant,\n\tTypeFunction,\n\tTypeFunctionPrototype,\n\tTypeBlock,\n\tTypeExtension,\n\tTypeExpression,\n\tTypeConstantOp,\n\tTypeCombinedImageSampler,\n\tTypeAccessChain,\n\tTypeUndef,\n\tTypeString,\n\tTypeCount\n};\n\ntemplate <Types type>\nclass TypedID;\n\ntemplate <>\nclass TypedID<TypeNone>\n{\npublic:\n\tTypedID() = default;\n\tTypedID(uint32_t id_)\n\t    : id(id_)\n\t{\n\t}\n\n\ttemplate <Types U>\n\tTypedID(const TypedID<U> &other)\n\t{\n\t\t*this = other;\n\t}\n\n\ttemplate <Types U>\n\tTypedID &operator=(const TypedID<U> &other)\n\t{\n\t\tid = uint32_t(other);\n\t\treturn *this;\n\t}\n\n\t// Implicit conversion to u32 is desired here.\n\t// As long as we block implicit conversion between TypedID<A> and TypedID<B> we're good.\n\toperator uint32_t() const\n\t{\n\t\treturn id;\n\t}\n\n\ttemplate <Types U>\n\toperator TypedID<U>() const\n\t{\n\t\treturn TypedID<U>(*this);\n\t}\n\nprivate:\n\tuint32_t id = 0;\n};\n\ntemplate <Types type>\nclass TypedID\n{\npublic:\n\tTypedID() = default;\n\tTypedID(uint32_t id_)\n\t    : id(id_)\n\t{\n\t}\n\n\texplicit TypedID(const TypedID<TypeNone> &other)\n\t    : id(uint32_t(other))\n\t{\n\t}\n\n\toperator uint32_t() const\n\t{\n\t\treturn id;\n\t}\n\nprivate:\n\tuint32_t id = 0;\n};\n\nusing VariableID = TypedID<TypeVariable>;\nusing TypeID = TypedID<TypeType>;\nusing ConstantID = TypedID<TypeConstant>;\nusing FunctionID = TypedID<TypeFunction>;\nusing BlockID = TypedID<TypeBlock>;\nusing ID = TypedID<TypeNone>;\n\n// Helper for Variant interface.\nstruct IVariant\n{\n\tvirtual ~IVariant() = default;\n\tvirtual IVariant *clone(ObjectPoolBase *pool) = 0;\n\tID self = 0;\n\nprotected:\n\tIVariant() = default;\n\tIVariant(const IVariant&) = default;\n\tIVariant &operator=(const IVariant&) = default;\n};\n\n#define SPIRV_CROSS_DECLARE_CLONE(T)                                \\\n\tIVariant *clone(ObjectPoolBase *pool) override                  \\\n\t{                                                               \\\n\t\treturn static_cast<ObjectPool<T> *>(pool)->allocate(*this); \\\n\t}\n\nstruct SPIRUndef : IVariant\n{\n\tenum\n\t{\n\t\ttype = TypeUndef\n\t};\n\n\texplicit SPIRUndef(TypeID basetype_)\n\t    : basetype(basetype_)\n\t{\n\t}\n\tTypeID basetype;\n\n\tSPIRV_CROSS_DECLARE_CLONE(SPIRUndef)\n};\n\nstruct SPIRString : IVariant\n{\n\tenum\n\t{\n\t\ttype = TypeString\n\t};\n\n\texplicit SPIRString(std::string str_)\n\t    : str(std::move(str_))\n\t{\n\t}\n\n\tstd::string str;\n\n\tSPIRV_CROSS_DECLARE_CLONE(SPIRString)\n};\n\n// This type is only used by backends which need to access the combined image and sampler IDs separately after\n// the OpSampledImage opcode.\nstruct SPIRCombinedImageSampler : IVariant\n{\n\tenum\n\t{\n\t\ttype = TypeCombinedImageSampler\n\t};\n\tSPIRCombinedImageSampler(TypeID type_, VariableID image_, VariableID sampler_)\n\t    : combined_type(type_)\n\t    , image(image_)\n\t    , sampler(sampler_)\n\t{\n\t}\n\tTypeID combined_type;\n\tVariableID image;\n\tVariableID sampler;\n\n\tSPIRV_CROSS_DECLARE_CLONE(SPIRCombinedImageSampler)\n};\n\nstruct SPIRConstantOp : IVariant\n{\n\tenum\n\t{\n\t\ttype = TypeConstantOp\n\t};\n\n\tSPIRConstantOp(TypeID result_type, spv::Op op, const uint32_t *args, uint32_t length)\n\t    : opcode(op)\n\t    , basetype(result_type)\n\t{\n\t\targuments.reserve(length);\n\t\tfor (uint32_t i = 0; i < length; i++)\n\t\t\targuments.push_back(args[i]);\n\t}\n\n\tspv::Op opcode;\n\tSmallVector<uint32_t> arguments;\n\tTypeID basetype;\n\n\tSPIRV_CROSS_DECLARE_CLONE(SPIRConstantOp)\n};\n\nstruct SPIRType : IVariant\n{\n\tenum\n\t{\n\t\ttype = TypeType\n\t};\n\n\tspv::Op op = spv::Op::OpNop;\n\texplicit SPIRType(spv::Op op_) : op(op_) {}\n\n\tenum BaseType\n\t{\n\t\tUnknown,\n\t\tVoid,\n\t\tBoolean,\n\t\tSByte,\n\t\tUByte,\n\t\tShort,\n\t\tUShort,\n\t\tInt,\n\t\tUInt,\n\t\tInt64,\n\t\tUInt64,\n\t\tAtomicCounter,\n\t\tHalf,\n\t\tFloat,\n\t\tDouble,\n\t\tStruct,\n\t\tImage,\n\t\tSampledImage,\n\t\tSampler,\n\t\tAccelerationStructure,\n\t\tRayQuery,\n\n\t\t// Keep internal types at the end.\n\t\tControlPointArray,\n\t\tInterpolant,\n\t\tChar\n\t};\n\n\t// Scalar/vector/matrix support.\n\tBaseType basetype = Unknown;\n\tuint32_t width = 0;\n\tuint32_t vecsize = 1;\n\tuint32_t columns = 1;\n\n\t// Arrays, support array of arrays by having a vector of array sizes.\n\tSmallVector<uint32_t> array;\n\n\t// Array elements can be either specialization constants or specialization ops.\n\t// This array determines how to interpret the array size.\n\t// If an element is true, the element is a literal,\n\t// otherwise, it's an expression, which must be resolved on demand.\n\t// The actual size is not really known until runtime.\n\tSmallVector<bool> array_size_literal;\n\n\t// Pointers\n\t// Keep track of how many pointer layers we have.\n\tuint32_t pointer_depth = 0;\n\tbool pointer = false;\n\tbool forward_pointer = false;\n\n\tspv::StorageClass storage = spv::StorageClassGeneric;\n\n\tSmallVector<TypeID> member_types;\n\n\t// If member order has been rewritten to handle certain scenarios with Offset,\n\t// allow codegen to rewrite the index.\n\tSmallVector<uint32_t> member_type_index_redirection;\n\n\tstruct ImageType\n\t{\n\t\tTypeID type;\n\t\tspv::Dim dim;\n\t\tbool depth;\n\t\tbool arrayed;\n\t\tbool ms;\n\t\tuint32_t sampled;\n\t\tspv::ImageFormat format;\n\t\tspv::AccessQualifier access;\n\t} image = {};\n\n\t// Structs can be declared multiple times if they are used as part of interface blocks.\n\t// We want to detect this so that we only emit the struct definition once.\n\t// Since we cannot rely on OpName to be equal, we need to figure out aliases.\n\tTypeID type_alias = 0;\n\n\t// Denotes the type which this type is based on.\n\t// Allows the backend to traverse how a complex type is built up during access chains.\n\tTypeID parent_type = 0;\n\n\t// Used in backends to avoid emitting members with conflicting names.\n\tstd::unordered_set<std::string> member_name_cache;\n\n\tSPIRV_CROSS_DECLARE_CLONE(SPIRType)\n};\n\nstruct SPIRExtension : IVariant\n{\n\tenum\n\t{\n\t\ttype = TypeExtension\n\t};\n\n\tenum Extension\n\t{\n\t\tUnsupported,\n\t\tGLSL,\n\t\tSPV_debug_info,\n\t\tSPV_AMD_shader_ballot,\n\t\tSPV_AMD_shader_explicit_vertex_parameter,\n\t\tSPV_AMD_shader_trinary_minmax,\n\t\tSPV_AMD_gcn_shader,\n\t\tNonSemanticDebugPrintf,\n\t\tNonSemanticShaderDebugInfo,\n\t\tNonSemanticGeneric\n\t};\n\n\texplicit SPIRExtension(Extension ext_)\n\t    : ext(ext_)\n\t{\n\t}\n\n\tExtension ext;\n\tSPIRV_CROSS_DECLARE_CLONE(SPIRExtension)\n};\n\n// SPIREntryPoint is not a variant since its IDs are used to decorate OpFunction,\n// so in order to avoid conflicts, we can't stick them in the ids array.\nstruct SPIREntryPoint\n{\n\tSPIREntryPoint(FunctionID self_, spv::ExecutionModel execution_model, const std::string &entry_name)\n\t    : self(self_)\n\t    , name(entry_name)\n\t    , orig_name(entry_name)\n\t    , model(execution_model)\n\t{\n\t}\n\tSPIREntryPoint() = default;\n\n\tFunctionID self = 0;\n\tstd::string name;\n\tstd::string orig_name;\n\tSmallVector<VariableID> interface_variables;\n\n\tBitset flags;\n\tstruct WorkgroupSize\n\t{\n\t\tuint32_t x = 0, y = 0, z = 0;\n\t\tuint32_t id_x = 0, id_y = 0, id_z = 0;\n\t\tuint32_t constant = 0; // Workgroup size can be expressed as a constant/spec-constant instead.\n\t} workgroup_size;\n\tuint32_t invocations = 0;\n\tuint32_t output_vertices = 0;\n\tuint32_t output_primitives = 0;\n\tspv::ExecutionModel model = spv::ExecutionModelMax;\n\tbool geometry_passthrough = false;\n};\n\nstruct SPIRExpression : IVariant\n{\n\tenum\n\t{\n\t\ttype = TypeExpression\n\t};\n\n\t// Only created by the backend target to avoid creating tons of temporaries.\n\tSPIRExpression(std::string expr, TypeID expression_type_, bool immutable_)\n\t    : expression(std::move(expr))\n\t    , expression_type(expression_type_)\n\t    , immutable(immutable_)\n\t{\n\t}\n\n\t// If non-zero, prepend expression with to_expression(base_expression).\n\t// Used in amortizing multiple calls to to_expression()\n\t// where in certain cases that would quickly force a temporary when not needed.\n\tID base_expression = 0;\n\n\tstd::string expression;\n\tTypeID expression_type = 0;\n\n\t// If this expression is a forwarded load,\n\t// allow us to reference the original variable.\n\tID loaded_from = 0;\n\n\t// If this expression will never change, we can avoid lots of temporaries\n\t// in high level source.\n\t// An expression being immutable can be speculative,\n\t// it is assumed that this is true almost always.\n\tbool immutable = false;\n\n\t// Before use, this expression must be transposed.\n\t// This is needed for targets which don't support row_major layouts.\n\tbool need_transpose = false;\n\n\t// Whether or not this is an access chain expression.\n\tbool access_chain = false;\n\n\t// Whether or not gl_MeshVerticesEXT[].gl_Position (as a whole or .y) is referenced\n\tbool access_meshlet_position_y = false;\n\n\t// A list of expressions which this expression depends on.\n\tSmallVector<ID> expression_dependencies;\n\n\t// By reading this expression, we implicitly read these expressions as well.\n\t// Used by access chain Store and Load since we read multiple expressions in this case.\n\tSmallVector<ID> implied_read_expressions;\n\n\t// The expression was emitted at a certain scope. Lets us track when an expression read means multiple reads.\n\tuint32_t emitted_loop_level = 0;\n\n\tSPIRV_CROSS_DECLARE_CLONE(SPIRExpression)\n};\n\nstruct SPIRFunctionPrototype : IVariant\n{\n\tenum\n\t{\n\t\ttype = TypeFunctionPrototype\n\t};\n\n\texplicit SPIRFunctionPrototype(TypeID return_type_)\n\t    : return_type(return_type_)\n\t{\n\t}\n\n\tTypeID return_type;\n\tSmallVector<uint32_t> parameter_types;\n\n\tSPIRV_CROSS_DECLARE_CLONE(SPIRFunctionPrototype)\n};\n\nstruct SPIRBlock : IVariant\n{\n\tenum\n\t{\n\t\ttype = TypeBlock\n\t};\n\n\tenum Terminator\n\t{\n\t\tUnknown,\n\t\tDirect, // Emit next block directly without a particular condition.\n\n\t\tSelect, // Block ends with an if/else block.\n\t\tMultiSelect, // Block ends with switch statement.\n\n\t\tReturn, // Block ends with return.\n\t\tUnreachable, // Noop\n\t\tKill, // Discard\n\t\tIgnoreIntersection, // Ray Tracing\n\t\tTerminateRay, // Ray Tracing\n\t\tEmitMeshTasks // Mesh shaders\n\t};\n\n\tenum Merge\n\t{\n\t\tMergeNone,\n\t\tMergeLoop,\n\t\tMergeSelection\n\t};\n\n\tenum Hints\n\t{\n\t\tHintNone,\n\t\tHintUnroll,\n\t\tHintDontUnroll,\n\t\tHintFlatten,\n\t\tHintDontFlatten\n\t};\n\n\tenum Method\n\t{\n\t\tMergeToSelectForLoop,\n\t\tMergeToDirectForLoop,\n\t\tMergeToSelectContinueForLoop\n\t};\n\n\tenum ContinueBlockType\n\t{\n\t\tContinueNone,\n\n\t\t// Continue block is branchless and has at least one instruction.\n\t\tForLoop,\n\n\t\t// Noop continue block.\n\t\tWhileLoop,\n\n\t\t// Continue block is conditional.\n\t\tDoWhileLoop,\n\n\t\t// Highly unlikely that anything will use this,\n\t\t// since it is really awkward/impossible to express in GLSL.\n\t\tComplexLoop\n\t};\n\n\tenum : uint32_t\n\t{\n\t\tNoDominator = 0xffffffffu\n\t};\n\n\tTerminator terminator = Unknown;\n\tMerge merge = MergeNone;\n\tHints hint = HintNone;\n\tBlockID next_block = 0;\n\tBlockID merge_block = 0;\n\tBlockID continue_block = 0;\n\n\tID return_value = 0; // If 0, return nothing (void).\n\tID condition = 0;\n\tBlockID true_block = 0;\n\tBlockID false_block = 0;\n\tBlockID default_block = 0;\n\n\t// If terminator is EmitMeshTasksEXT.\n\tstruct\n\t{\n\t\tID groups[3];\n\t\tID payload;\n\t} mesh = {};\n\n\tSmallVector<Instruction> ops;\n\n\tstruct Phi\n\t{\n\t\tID local_variable; // flush local variable ...\n\t\tBlockID parent; // If we're in from_block and want to branch into this block ...\n\t\tVariableID function_variable; // to this function-global \"phi\" variable first.\n\t};\n\n\t// Before entering this block flush out local variables to magical \"phi\" variables.\n\tSmallVector<Phi> phi_variables;\n\n\t// Declare these temporaries before beginning the block.\n\t// Used for handling complex continue blocks which have side effects.\n\tSmallVector<std::pair<TypeID, ID>> declare_temporary;\n\n\t// Declare these temporaries, but only conditionally if this block turns out to be\n\t// a complex loop header.\n\tSmallVector<std::pair<TypeID, ID>> potential_declare_temporary;\n\n\tstruct Case\n\t{\n\t\tuint64_t value;\n\t\tBlockID block;\n\t};\n\tSmallVector<Case> cases_32bit;\n\tSmallVector<Case> cases_64bit;\n\n\t// If we have tried to optimize code for this block but failed,\n\t// keep track of this.\n\tbool disable_block_optimization = false;\n\n\t// If the continue block is complex, fallback to \"dumb\" for loops.\n\tbool complex_continue = false;\n\n\t// Do we need a ladder variable to defer breaking out of a loop construct after a switch block?\n\tbool need_ladder_break = false;\n\n\t// If marked, we have explicitly handled Phi from this block, so skip any flushes related to that on a branch.\n\t// Used to handle an edge case with switch and case-label fallthrough where fall-through writes to Phi.\n\tBlockID ignore_phi_from_block = 0;\n\n\t// The dominating block which this block might be within.\n\t// Used in continue; blocks to determine if we really need to write continue.\n\tBlockID loop_dominator = 0;\n\n\t// All access to these variables are dominated by this block,\n\t// so before branching anywhere we need to make sure that we declare these variables.\n\tSmallVector<VariableID> dominated_variables;\n\n\t// These are variables which should be declared in a for loop header, if we\n\t// fail to use a classic for-loop,\n\t// we remove these variables, and fall back to regular variables outside the loop.\n\tSmallVector<VariableID> loop_variables;\n\n\t// Some expressions are control-flow dependent, i.e. any instruction which relies on derivatives or\n\t// sub-group-like operations.\n\t// Make sure that we only use these expressions in the original block.\n\tSmallVector<ID> invalidate_expressions;\n\n\tSPIRV_CROSS_DECLARE_CLONE(SPIRBlock)\n};\n\nstruct SPIRFunction : IVariant\n{\n\tenum\n\t{\n\t\ttype = TypeFunction\n\t};\n\n\tSPIRFunction(TypeID return_type_, TypeID function_type_)\n\t    : return_type(return_type_)\n\t    , function_type(function_type_)\n\t{\n\t}\n\n\tstruct Parameter\n\t{\n\t\tTypeID type;\n\t\tID id;\n\t\tuint32_t read_count;\n\t\tuint32_t write_count;\n\n\t\t// Set to true if this parameter aliases a global variable,\n\t\t// used mostly in Metal where global variables\n\t\t// have to be passed down to functions as regular arguments.\n\t\t// However, for this kind of variable, we should not care about\n\t\t// read and write counts as access to the function arguments\n\t\t// is not local to the function in question.\n\t\tbool alias_global_variable;\n\t};\n\n\t// When calling a function, and we're remapping separate image samplers,\n\t// resolve these arguments into combined image samplers and pass them\n\t// as additional arguments in this order.\n\t// It gets more complicated as functions can pull in their own globals\n\t// and combine them with parameters,\n\t// so we need to distinguish if something is local parameter index\n\t// or a global ID.\n\tstruct CombinedImageSamplerParameter\n\t{\n\t\tVariableID id;\n\t\tVariableID image_id;\n\t\tVariableID sampler_id;\n\t\tbool global_image;\n\t\tbool global_sampler;\n\t\tbool depth;\n\t};\n\n\tTypeID return_type;\n\tTypeID function_type;\n\tSmallVector<Parameter> arguments;\n\n\t// Can be used by backends to add magic arguments.\n\t// Currently used by combined image/sampler implementation.\n\n\tSmallVector<Parameter> shadow_arguments;\n\tSmallVector<VariableID> local_variables;\n\tBlockID entry_block = 0;\n\tSmallVector<BlockID> blocks;\n\tSmallVector<CombinedImageSamplerParameter> combined_parameters;\n\n\tstruct EntryLine\n\t{\n\t\tuint32_t file_id = 0;\n\t\tuint32_t line_literal = 0;\n\t};\n\tEntryLine entry_line;\n\n\tvoid add_local_variable(VariableID id)\n\t{\n\t\tlocal_variables.push_back(id);\n\t}\n\n\tvoid add_parameter(TypeID parameter_type, ID id, bool alias_global_variable = false)\n\t{\n\t\t// Arguments are read-only until proven otherwise.\n\t\targuments.push_back({ parameter_type, id, 0u, 0u, alias_global_variable });\n\t}\n\n\t// Hooks to be run when the function returns.\n\t// Mostly used for lowering internal data structures onto flattened structures.\n\t// Need to defer this, because they might rely on things which change during compilation.\n\t// Intentionally not a small vector, this one is rare, and std::function can be large.\n\tVector<std::function<void()>> fixup_hooks_out;\n\n\t// Hooks to be run when the function begins.\n\t// Mostly used for populating internal data structures from flattened structures.\n\t// Need to defer this, because they might rely on things which change during compilation.\n\t// Intentionally not a small vector, this one is rare, and std::function can be large.\n\tVector<std::function<void()>> fixup_hooks_in;\n\n\t// On function entry, make sure to copy a constant array into thread addr space to work around\n\t// the case where we are passing a constant array by value to a function on backends which do not\n\t// consider arrays value types.\n\tSmallVector<ID> constant_arrays_needed_on_stack;\n\n\tbool active = false;\n\tbool flush_undeclared = true;\n\tbool do_combined_parameters = true;\n\n\tSPIRV_CROSS_DECLARE_CLONE(SPIRFunction)\n};\n\nstruct SPIRAccessChain : IVariant\n{\n\tenum\n\t{\n\t\ttype = TypeAccessChain\n\t};\n\n\tSPIRAccessChain(TypeID basetype_, spv::StorageClass storage_, std::string base_, std::string dynamic_index_,\n\t                int32_t static_index_)\n\t    : basetype(basetype_)\n\t    , storage(storage_)\n\t    , base(std::move(base_))\n\t    , dynamic_index(std::move(dynamic_index_))\n\t    , static_index(static_index_)\n\t{\n\t}\n\n\t// The access chain represents an offset into a buffer.\n\t// Some backends need more complicated handling of access chains to be able to use buffers, like HLSL\n\t// which has no usable buffer type ala GLSL SSBOs.\n\t// StructuredBuffer is too limited, so our only option is to deal with ByteAddressBuffer which works with raw addresses.\n\n\tTypeID basetype;\n\tspv::StorageClass storage;\n\tstd::string base;\n\tstd::string dynamic_index;\n\tint32_t static_index;\n\n\tVariableID loaded_from = 0;\n\tuint32_t matrix_stride = 0;\n\tuint32_t array_stride = 0;\n\tbool row_major_matrix = false;\n\tbool immutable = false;\n\n\t// By reading this expression, we implicitly read these expressions as well.\n\t// Used by access chain Store and Load since we read multiple expressions in this case.\n\tSmallVector<ID> implied_read_expressions;\n\n\tSPIRV_CROSS_DECLARE_CLONE(SPIRAccessChain)\n};\n\nstruct SPIRVariable : IVariant\n{\n\tenum\n\t{\n\t\ttype = TypeVariable\n\t};\n\n\tSPIRVariable() = default;\n\tSPIRVariable(TypeID basetype_, spv::StorageClass storage_, ID initializer_ = 0, VariableID basevariable_ = 0)\n\t    : basetype(basetype_)\n\t    , storage(storage_)\n\t    , initializer(initializer_)\n\t    , basevariable(basevariable_)\n\t{\n\t}\n\n\tTypeID basetype = 0;\n\tspv::StorageClass storage = spv::StorageClassGeneric;\n\tuint32_t decoration = 0;\n\tID initializer = 0;\n\tVariableID basevariable = 0;\n\n\tSmallVector<uint32_t> dereference_chain;\n\tbool compat_builtin = false;\n\n\t// If a variable is shadowed, we only statically assign to it\n\t// and never actually emit a statement for it.\n\t// When we read the variable as an expression, just forward\n\t// shadowed_id as the expression.\n\tbool statically_assigned = false;\n\tID static_expression = 0;\n\n\t// Temporaries which can remain forwarded as long as this variable is not modified.\n\tSmallVector<ID> dependees;\n\n\tbool deferred_declaration = false;\n\tbool phi_variable = false;\n\n\t// Used to deal with Phi variable flushes. See flush_phi().\n\tbool allocate_temporary_copy = false;\n\n\tbool remapped_variable = false;\n\tuint32_t remapped_components = 0;\n\n\t// The block which dominates all access to this variable.\n\tBlockID dominator = 0;\n\t// If true, this variable is a loop variable, when accessing the variable\n\t// outside a loop,\n\t// we should statically forward it.\n\tbool loop_variable = false;\n\t// Set to true while we're inside the for loop.\n\tbool loop_variable_enable = false;\n\n\tSPIRFunction::Parameter *parameter = nullptr;\n\n\tSPIRV_CROSS_DECLARE_CLONE(SPIRVariable)\n};\n\nstruct SPIRConstant : IVariant\n{\n\tenum\n\t{\n\t\ttype = TypeConstant\n\t};\n\n\tunion Constant\n\t{\n\t\tuint32_t u32;\n\t\tint32_t i32;\n\t\tfloat f32;\n\n\t\tuint64_t u64;\n\t\tint64_t i64;\n\t\tdouble f64;\n\t};\n\n\tstruct ConstantVector\n\t{\n\t\tConstant r[4];\n\t\t// If != 0, this element is a specialization constant, and we should keep track of it as such.\n\t\tID id[4];\n\t\tuint32_t vecsize = 1;\n\n\t\tConstantVector()\n\t\t{\n\t\t\tmemset(r, 0, sizeof(r));\n\t\t}\n\t};\n\n\tstruct ConstantMatrix\n\t{\n\t\tConstantVector c[4];\n\t\t// If != 0, this column is a specialization constant, and we should keep track of it as such.\n\t\tID id[4];\n\t\tuint32_t columns = 1;\n\t};\n\n\tstatic inline float f16_to_f32(uint16_t u16_value)\n\t{\n\t\t// Based on the GLM implementation.\n\t\tint s = (u16_value >> 15) & 0x1;\n\t\tint e = (u16_value >> 10) & 0x1f;\n\t\tint m = (u16_value >> 0) & 0x3ff;\n\n\t\tunion\n\t\t{\n\t\t\tfloat f32;\n\t\t\tuint32_t u32;\n\t\t} u;\n\n\t\tif (e == 0)\n\t\t{\n\t\t\tif (m == 0)\n\t\t\t{\n\t\t\t\tu.u32 = uint32_t(s) << 31;\n\t\t\t\treturn u.f32;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twhile ((m & 0x400) == 0)\n\t\t\t\t{\n\t\t\t\t\tm <<= 1;\n\t\t\t\t\te--;\n\t\t\t\t}\n\n\t\t\t\te++;\n\t\t\t\tm &= ~0x400;\n\t\t\t}\n\t\t}\n\t\telse if (e == 31)\n\t\t{\n\t\t\tif (m == 0)\n\t\t\t{\n\t\t\t\tu.u32 = (uint32_t(s) << 31) | 0x7f800000u;\n\t\t\t\treturn u.f32;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu.u32 = (uint32_t(s) << 31) | 0x7f800000u | (m << 13);\n\t\t\t\treturn u.f32;\n\t\t\t}\n\t\t}\n\n\t\te += 127 - 15;\n\t\tm <<= 13;\n\t\tu.u32 = (uint32_t(s) << 31) | (e << 23) | m;\n\t\treturn u.f32;\n\t}\n\n\tinline uint32_t specialization_constant_id(uint32_t col, uint32_t row) const\n\t{\n\t\treturn m.c[col].id[row];\n\t}\n\n\tinline uint32_t specialization_constant_id(uint32_t col) const\n\t{\n\t\treturn m.id[col];\n\t}\n\n\tinline uint32_t scalar(uint32_t col = 0, uint32_t row = 0) const\n\t{\n\t\treturn m.c[col].r[row].u32;\n\t}\n\n\tinline int16_t scalar_i16(uint32_t col = 0, uint32_t row = 0) const\n\t{\n\t\treturn int16_t(m.c[col].r[row].u32 & 0xffffu);\n\t}\n\n\tinline uint16_t scalar_u16(uint32_t col = 0, uint32_t row = 0) const\n\t{\n\t\treturn uint16_t(m.c[col].r[row].u32 & 0xffffu);\n\t}\n\n\tinline int8_t scalar_i8(uint32_t col = 0, uint32_t row = 0) const\n\t{\n\t\treturn int8_t(m.c[col].r[row].u32 & 0xffu);\n\t}\n\n\tinline uint8_t scalar_u8(uint32_t col = 0, uint32_t row = 0) const\n\t{\n\t\treturn uint8_t(m.c[col].r[row].u32 & 0xffu);\n\t}\n\n\tinline float scalar_f16(uint32_t col = 0, uint32_t row = 0) const\n\t{\n\t\treturn f16_to_f32(scalar_u16(col, row));\n\t}\n\n\tinline float scalar_f32(uint32_t col = 0, uint32_t row = 0) const\n\t{\n\t\treturn m.c[col].r[row].f32;\n\t}\n\n\tinline int32_t scalar_i32(uint32_t col = 0, uint32_t row = 0) const\n\t{\n\t\treturn m.c[col].r[row].i32;\n\t}\n\n\tinline double scalar_f64(uint32_t col = 0, uint32_t row = 0) const\n\t{\n\t\treturn m.c[col].r[row].f64;\n\t}\n\n\tinline int64_t scalar_i64(uint32_t col = 0, uint32_t row = 0) const\n\t{\n\t\treturn m.c[col].r[row].i64;\n\t}\n\n\tinline uint64_t scalar_u64(uint32_t col = 0, uint32_t row = 0) const\n\t{\n\t\treturn m.c[col].r[row].u64;\n\t}\n\n\tinline const ConstantVector &vector() const\n\t{\n\t\treturn m.c[0];\n\t}\n\n\tinline uint32_t vector_size() const\n\t{\n\t\treturn m.c[0].vecsize;\n\t}\n\n\tinline uint32_t columns() const\n\t{\n\t\treturn m.columns;\n\t}\n\n\tinline void make_null(const SPIRType &constant_type_)\n\t{\n\t\tm = {};\n\t\tm.columns = constant_type_.columns;\n\t\tfor (auto &c : m.c)\n\t\t\tc.vecsize = constant_type_.vecsize;\n\t}\n\n\tinline bool constant_is_null() const\n\t{\n\t\tif (specialization)\n\t\t\treturn false;\n\t\tif (!subconstants.empty())\n\t\t\treturn false;\n\n\t\tfor (uint32_t col = 0; col < columns(); col++)\n\t\t\tfor (uint32_t row = 0; row < vector_size(); row++)\n\t\t\t\tif (scalar_u64(col, row) != 0)\n\t\t\t\t\treturn false;\n\n\t\treturn true;\n\t}\n\n\texplicit SPIRConstant(uint32_t constant_type_)\n\t    : constant_type(constant_type_)\n\t{\n\t}\n\n\tSPIRConstant() = default;\n\n\tSPIRConstant(TypeID constant_type_, const uint32_t *elements, uint32_t num_elements, bool specialized)\n\t    : constant_type(constant_type_)\n\t    , specialization(specialized)\n\t{\n\t\tsubconstants.reserve(num_elements);\n\t\tfor (uint32_t i = 0; i < num_elements; i++)\n\t\t\tsubconstants.push_back(elements[i]);\n\t\tspecialization = specialized;\n\t}\n\n\t// Construct scalar (32-bit).\n\tSPIRConstant(TypeID constant_type_, uint32_t v0, bool specialized)\n\t    : constant_type(constant_type_)\n\t    , specialization(specialized)\n\t{\n\t\tm.c[0].r[0].u32 = v0;\n\t\tm.c[0].vecsize = 1;\n\t\tm.columns = 1;\n\t}\n\n\t// Construct scalar (64-bit).\n\tSPIRConstant(TypeID constant_type_, uint64_t v0, bool specialized)\n\t    : constant_type(constant_type_)\n\t    , specialization(specialized)\n\t{\n\t\tm.c[0].r[0].u64 = v0;\n\t\tm.c[0].vecsize = 1;\n\t\tm.columns = 1;\n\t}\n\n\t// Construct vectors and matrices.\n\tSPIRConstant(TypeID constant_type_, const SPIRConstant *const *vector_elements, uint32_t num_elements,\n\t             bool specialized)\n\t    : constant_type(constant_type_)\n\t    , specialization(specialized)\n\t{\n\t\tbool matrix = vector_elements[0]->m.c[0].vecsize > 1;\n\n\t\tif (matrix)\n\t\t{\n\t\t\tm.columns = num_elements;\n\n\t\t\tfor (uint32_t i = 0; i < num_elements; i++)\n\t\t\t{\n\t\t\t\tm.c[i] = vector_elements[i]->m.c[0];\n\t\t\t\tif (vector_elements[i]->specialization)\n\t\t\t\t\tm.id[i] = vector_elements[i]->self;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm.c[0].vecsize = num_elements;\n\t\t\tm.columns = 1;\n\n\t\t\tfor (uint32_t i = 0; i < num_elements; i++)\n\t\t\t{\n\t\t\t\tm.c[0].r[i] = vector_elements[i]->m.c[0].r[0];\n\t\t\t\tif (vector_elements[i]->specialization)\n\t\t\t\t\tm.c[0].id[i] = vector_elements[i]->self;\n\t\t\t}\n\t\t}\n\t}\n\n\tTypeID constant_type = 0;\n\tConstantMatrix m;\n\n\t// If this constant is a specialization constant (i.e. created with OpSpecConstant*).\n\tbool specialization = false;\n\t// If this constant is used as an array length which creates specialization restrictions on some backends.\n\tbool is_used_as_array_length = false;\n\n\t// If true, this is a LUT, and should always be declared in the outer scope.\n\tbool is_used_as_lut = false;\n\n\t// For composites which are constant arrays, etc.\n\tSmallVector<ConstantID> subconstants;\n\n\t// Non-Vulkan GLSL, HLSL and sometimes MSL emits defines for each specialization constant,\n\t// and uses them to initialize the constant. This allows the user\n\t// to still be able to specialize the value by supplying corresponding\n\t// preprocessor directives before compiling the shader.\n\tstd::string specialization_constant_macro_name;\n\n\tSPIRV_CROSS_DECLARE_CLONE(SPIRConstant)\n};\n\n// Variants have a very specific allocation scheme.\nstruct ObjectPoolGroup\n{\n\tstd::unique_ptr<ObjectPoolBase> pools[TypeCount];\n};\n\nclass Variant\n{\npublic:\n\texplicit Variant(ObjectPoolGroup *group_)\n\t    : group(group_)\n\t{\n\t}\n\n\t~Variant()\n\t{\n\t\tif (holder)\n\t\t\tgroup->pools[type]->deallocate_opaque(holder);\n\t}\n\n\t// Marking custom move constructor as noexcept is important.\n\tVariant(Variant &&other) SPIRV_CROSS_NOEXCEPT\n\t{\n\t\t*this = std::move(other);\n\t}\n\n\t// We cannot copy from other variant without our own pool group.\n\t// Have to explicitly copy.\n\tVariant(const Variant &variant) = delete;\n\n\t// Marking custom move constructor as noexcept is important.\n\tVariant &operator=(Variant &&other) SPIRV_CROSS_NOEXCEPT\n\t{\n\t\tif (this != &other)\n\t\t{\n\t\t\tif (holder)\n\t\t\t\tgroup->pools[type]->deallocate_opaque(holder);\n\t\t\tholder = other.holder;\n\t\t\tgroup = other.group;\n\t\t\ttype = other.type;\n\t\t\tallow_type_rewrite = other.allow_type_rewrite;\n\n\t\t\tother.holder = nullptr;\n\t\t\tother.type = TypeNone;\n\t\t}\n\t\treturn *this;\n\t}\n\n\t// This copy/clone should only be called in the Compiler constructor.\n\t// If this is called inside ::compile(), we invalidate any references we took higher in the stack.\n\t// This should never happen.\n\tVariant &operator=(const Variant &other)\n\t{\n//#define SPIRV_CROSS_COPY_CONSTRUCTOR_SANITIZE\n#ifdef SPIRV_CROSS_COPY_CONSTRUCTOR_SANITIZE\n\t\tabort();\n#endif\n\t\tif (this != &other)\n\t\t{\n\t\t\tif (holder)\n\t\t\t\tgroup->pools[type]->deallocate_opaque(holder);\n\n\t\t\tif (other.holder)\n\t\t\t\tholder = other.holder->clone(group->pools[other.type].get());\n\t\t\telse\n\t\t\t\tholder = nullptr;\n\n\t\t\ttype = other.type;\n\t\t\tallow_type_rewrite = other.allow_type_rewrite;\n\t\t}\n\t\treturn *this;\n\t}\n\n\tvoid set(IVariant *val, Types new_type)\n\t{\n\t\tif (holder)\n\t\t\tgroup->pools[type]->deallocate_opaque(holder);\n\t\tholder = nullptr;\n\n\t\tif (!allow_type_rewrite && type != TypeNone && type != new_type)\n\t\t{\n\t\t\tif (val)\n\t\t\t\tgroup->pools[new_type]->deallocate_opaque(val);\n\t\t\tSPIRV_CROSS_THROW(\"Overwriting a variant with new type.\");\n\t\t}\n\n\t\tholder = val;\n\t\ttype = new_type;\n\t\tallow_type_rewrite = false;\n\t}\n\n\ttemplate <typename T, typename... Ts>\n\tT *allocate_and_set(Types new_type, Ts &&... ts)\n\t{\n\t\tT *val = static_cast<ObjectPool<T> &>(*group->pools[new_type]).allocate(std::forward<Ts>(ts)...);\n\t\tset(val, new_type);\n\t\treturn val;\n\t}\n\n\ttemplate <typename T>\n\tT &get()\n\t{\n\t\tif (!holder)\n\t\t\tSPIRV_CROSS_THROW(\"nullptr\");\n\t\tif (static_cast<Types>(T::type) != type)\n\t\t\tSPIRV_CROSS_THROW(\"Bad cast\");\n\t\treturn *static_cast<T *>(holder);\n\t}\n\n\ttemplate <typename T>\n\tconst T &get() const\n\t{\n\t\tif (!holder)\n\t\t\tSPIRV_CROSS_THROW(\"nullptr\");\n\t\tif (static_cast<Types>(T::type) != type)\n\t\t\tSPIRV_CROSS_THROW(\"Bad cast\");\n\t\treturn *static_cast<const T *>(holder);\n\t}\n\n\tTypes get_type() const\n\t{\n\t\treturn type;\n\t}\n\n\tID get_id() const\n\t{\n\t\treturn holder ? holder->self : ID(0);\n\t}\n\n\tbool empty() const\n\t{\n\t\treturn !holder;\n\t}\n\n\tvoid reset()\n\t{\n\t\tif (holder)\n\t\t\tgroup->pools[type]->deallocate_opaque(holder);\n\t\tholder = nullptr;\n\t\ttype = TypeNone;\n\t}\n\n\tvoid set_allow_type_rewrite()\n\t{\n\t\tallow_type_rewrite = true;\n\t}\n\nprivate:\n\tObjectPoolGroup *group = nullptr;\n\tIVariant *holder = nullptr;\n\tTypes type = TypeNone;\n\tbool allow_type_rewrite = false;\n};\n\ntemplate <typename T>\nT &variant_get(Variant &var)\n{\n\treturn var.get<T>();\n}\n\ntemplate <typename T>\nconst T &variant_get(const Variant &var)\n{\n\treturn var.get<T>();\n}\n\ntemplate <typename T, typename... P>\nT &variant_set(Variant &var, P &&... args)\n{\n\tauto *ptr = var.allocate_and_set<T>(static_cast<Types>(T::type), std::forward<P>(args)...);\n\treturn *ptr;\n}\n\nstruct AccessChainMeta\n{\n\tuint32_t storage_physical_type = 0;\n\tbool need_transpose = false;\n\tbool storage_is_packed = false;\n\tbool storage_is_invariant = false;\n\tbool flattened_struct = false;\n\tbool relaxed_precision = false;\n\tbool access_meshlet_position_y = false;\n};\n\nenum ExtendedDecorations\n{\n\t// Marks if a buffer block is re-packed, i.e. member declaration might be subject to PhysicalTypeID remapping and padding.\n\tSPIRVCrossDecorationBufferBlockRepacked = 0,\n\n\t// A type in a buffer block might be declared with a different physical type than the logical type.\n\t// If this is not set, PhysicalTypeID == the SPIR-V type as declared.\n\tSPIRVCrossDecorationPhysicalTypeID,\n\n\t// Marks if the physical type is to be declared with tight packing rules, i.e. packed_floatN on MSL and friends.\n\t// If this is set, PhysicalTypeID might also be set. It can be set to same as logical type if all we're doing\n\t// is converting float3 to packed_float3 for example.\n\t// If this is marked on a struct, it means the struct itself must use only Packed types for all its members.\n\tSPIRVCrossDecorationPhysicalTypePacked,\n\n\t// The padding in bytes before declaring this struct member.\n\t// If used on a struct type, marks the target size of a struct.\n\tSPIRVCrossDecorationPaddingTarget,\n\n\tSPIRVCrossDecorationInterfaceMemberIndex,\n\tSPIRVCrossDecorationInterfaceOrigID,\n\tSPIRVCrossDecorationResourceIndexPrimary,\n\t// Used for decorations like resource indices for samplers when part of combined image samplers.\n\t// A variable might need to hold two resource indices in this case.\n\tSPIRVCrossDecorationResourceIndexSecondary,\n\t// Used for resource indices for multiplanar images when part of combined image samplers.\n\tSPIRVCrossDecorationResourceIndexTertiary,\n\tSPIRVCrossDecorationResourceIndexQuaternary,\n\n\t// Marks a buffer block for using explicit offsets (GLSL/HLSL).\n\tSPIRVCrossDecorationExplicitOffset,\n\n\t// Apply to a variable in the Input storage class; marks it as holding the base group passed to vkCmdDispatchBase(),\n\t// or the base vertex and instance indices passed to vkCmdDrawIndexed().\n\t// In MSL, this is used to adjust the WorkgroupId and GlobalInvocationId variables in compute shaders,\n\t// and to hold the BaseVertex and BaseInstance variables in vertex shaders.\n\tSPIRVCrossDecorationBuiltInDispatchBase,\n\n\t// Apply to a variable that is a function parameter; marks it as being a \"dynamic\"\n\t// combined image-sampler. In MSL, this is used when a function parameter might hold\n\t// either a regular combined image-sampler or one that has an attached sampler\n\t// Y'CbCr conversion.\n\tSPIRVCrossDecorationDynamicImageSampler,\n\n\t// Apply to a variable in the Input storage class; marks it as holding the size of the stage\n\t// input grid.\n\t// In MSL, this is used to hold the vertex and instance counts in a tessellation pipeline\n\t// vertex shader.\n\tSPIRVCrossDecorationBuiltInStageInputSize,\n\n\t// Apply to any access chain of a tessellation I/O variable; stores the type of the sub-object\n\t// that was chained to, as recorded in the input variable itself. This is used in case the pointer\n\t// is itself used as the base of an access chain, to calculate the original type of the sub-object\n\t// chained to, in case a swizzle needs to be applied. This should not happen normally with valid\n\t// SPIR-V, but the MSL backend can change the type of input variables, necessitating the\n\t// addition of swizzles to keep the generated code compiling.\n\tSPIRVCrossDecorationTessIOOriginalInputTypeID,\n\n\t// Apply to any access chain of an interface variable used with pull-model interpolation, where the variable is a\n\t// vector but the resulting pointer is a scalar; stores the component index that is to be accessed by the chain.\n\t// This is used when emitting calls to interpolation functions on the chain in MSL: in this case, the component\n\t// must be applied to the result, since pull-model interpolants in MSL cannot be swizzled directly, but the\n\t// results of interpolation can.\n\tSPIRVCrossDecorationInterpolantComponentExpr,\n\n\t// Apply to any struct type that is used in the Workgroup storage class.\n\t// This causes matrices in MSL prior to Metal 3.0 to be emitted using a special\n\t// class that is convertible to the standard matrix type, to work around the\n\t// lack of constructors in the 'threadgroup' address space.\n\tSPIRVCrossDecorationWorkgroupStruct,\n\n\tSPIRVCrossDecorationCount\n};\n\nstruct Meta\n{\n\tstruct Decoration\n\t{\n\t\tstd::string alias;\n\t\tstd::string qualified_alias;\n\t\tstd::string hlsl_semantic;\n\t\tstd::string user_type;\n\t\tBitset decoration_flags;\n\t\tspv::BuiltIn builtin_type = spv::BuiltInMax;\n\t\tuint32_t location = 0;\n\t\tuint32_t component = 0;\n\t\tuint32_t set = 0;\n\t\tuint32_t binding = 0;\n\t\tuint32_t offset = 0;\n\t\tuint32_t xfb_buffer = 0;\n\t\tuint32_t xfb_stride = 0;\n\t\tuint32_t stream = 0;\n\t\tuint32_t array_stride = 0;\n\t\tuint32_t matrix_stride = 0;\n\t\tuint32_t input_attachment = 0;\n\t\tuint32_t spec_id = 0;\n\t\tuint32_t index = 0;\n\t\tspv::FPRoundingMode fp_rounding_mode = spv::FPRoundingModeMax;\n\t\tbool builtin = false;\n\n\t\tstruct Extended\n\t\t{\n\t\t\tExtended()\n\t\t\t{\n\t\t\t\t// MSVC 2013 workaround to init like this.\n\t\t\t\tfor (auto &v : values)\n\t\t\t\t\tv = 0;\n\t\t\t}\n\n\t\t\tBitset flags;\n\t\t\tuint32_t values[SPIRVCrossDecorationCount];\n\t\t} extended;\n\t};\n\n\tDecoration decoration;\n\n\t// Intentionally not a SmallVector. Decoration is large and somewhat rare.\n\tVector<Decoration> members;\n\n\tstd::unordered_map<uint32_t, uint32_t> decoration_word_offset;\n\n\t// For SPV_GOOGLE_hlsl_functionality1.\n\tbool hlsl_is_magic_counter_buffer = false;\n\t// ID for the sibling counter buffer.\n\tuint32_t hlsl_magic_counter_buffer = 0;\n};\n\n// A user callback that remaps the type of any variable.\n// var_name is the declared name of the variable.\n// name_of_type is the textual name of the type which will be used in the code unless written to by the callback.\nusing VariableTypeRemapCallback =\n    std::function<void(const SPIRType &type, const std::string &var_name, std::string &name_of_type)>;\n\nclass Hasher\n{\npublic:\n\tinline void u32(uint32_t value)\n\t{\n\t\th = (h * 0x100000001b3ull) ^ value;\n\t}\n\n\tinline uint64_t get() const\n\t{\n\t\treturn h;\n\t}\n\nprivate:\n\tuint64_t h = 0xcbf29ce484222325ull;\n};\n\nstatic inline bool type_is_floating_point(const SPIRType &type)\n{\n\treturn type.basetype == SPIRType::Half || type.basetype == SPIRType::Float || type.basetype == SPIRType::Double;\n}\n\nstatic inline bool type_is_integral(const SPIRType &type)\n{\n\treturn type.basetype == SPIRType::SByte || type.basetype == SPIRType::UByte || type.basetype == SPIRType::Short ||\n\t       type.basetype == SPIRType::UShort || type.basetype == SPIRType::Int || type.basetype == SPIRType::UInt ||\n\t       type.basetype == SPIRType::Int64 || type.basetype == SPIRType::UInt64;\n}\n\nstatic inline SPIRType::BaseType to_signed_basetype(uint32_t width)\n{\n\tswitch (width)\n\t{\n\tcase 8:\n\t\treturn SPIRType::SByte;\n\tcase 16:\n\t\treturn SPIRType::Short;\n\tcase 32:\n\t\treturn SPIRType::Int;\n\tcase 64:\n\t\treturn SPIRType::Int64;\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Invalid bit width.\");\n\t}\n}\n\nstatic inline SPIRType::BaseType to_unsigned_basetype(uint32_t width)\n{\n\tswitch (width)\n\t{\n\tcase 8:\n\t\treturn SPIRType::UByte;\n\tcase 16:\n\t\treturn SPIRType::UShort;\n\tcase 32:\n\t\treturn SPIRType::UInt;\n\tcase 64:\n\t\treturn SPIRType::UInt64;\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Invalid bit width.\");\n\t}\n}\n\n// Returns true if an arithmetic operation does not change behavior depending on signedness.\nstatic inline bool opcode_is_sign_invariant(spv::Op opcode)\n{\n\tswitch (opcode)\n\t{\n\tcase spv::OpIEqual:\n\tcase spv::OpINotEqual:\n\tcase spv::OpISub:\n\tcase spv::OpIAdd:\n\tcase spv::OpIMul:\n\tcase spv::OpShiftLeftLogical:\n\tcase spv::OpBitwiseOr:\n\tcase spv::OpBitwiseXor:\n\tcase spv::OpBitwiseAnd:\n\t\treturn true;\n\n\tdefault:\n\t\treturn false;\n\t}\n}\n\nstatic inline bool opcode_can_promote_integer_implicitly(spv::Op opcode)\n{\n\tswitch (opcode)\n\t{\n\tcase spv::OpSNegate:\n\tcase spv::OpNot:\n\tcase spv::OpBitwiseAnd:\n\tcase spv::OpBitwiseOr:\n\tcase spv::OpBitwiseXor:\n\tcase spv::OpShiftLeftLogical:\n\tcase spv::OpShiftRightLogical:\n\tcase spv::OpShiftRightArithmetic:\n\tcase spv::OpIAdd:\n\tcase spv::OpISub:\n\tcase spv::OpIMul:\n\tcase spv::OpSDiv:\n\tcase spv::OpUDiv:\n\tcase spv::OpSRem:\n\tcase spv::OpUMod:\n\tcase spv::OpSMod:\n\t\treturn true;\n\n\tdefault:\n\t\treturn false;\n\t}\n}\n\nstruct SetBindingPair\n{\n\tuint32_t desc_set;\n\tuint32_t binding;\n\n\tinline bool operator==(const SetBindingPair &other) const\n\t{\n\t\treturn desc_set == other.desc_set && binding == other.binding;\n\t}\n\n\tinline bool operator<(const SetBindingPair &other) const\n\t{\n\t\treturn desc_set < other.desc_set || (desc_set == other.desc_set && binding < other.binding);\n\t}\n};\n\nstruct LocationComponentPair\n{\n\tuint32_t location;\n\tuint32_t component;\n\n\tinline bool operator==(const LocationComponentPair &other) const\n\t{\n\t\treturn location == other.location && component == other.component;\n\t}\n\n\tinline bool operator<(const LocationComponentPair &other) const\n\t{\n\t\treturn location < other.location || (location == other.location && component < other.component);\n\t}\n};\n\nstruct StageSetBinding\n{\n\tspv::ExecutionModel model;\n\tuint32_t desc_set;\n\tuint32_t binding;\n\n\tinline bool operator==(const StageSetBinding &other) const\n\t{\n\t\treturn model == other.model && desc_set == other.desc_set && binding == other.binding;\n\t}\n};\n\nstruct InternalHasher\n{\n\tinline size_t operator()(const SetBindingPair &value) const\n\t{\n\t\t// Quality of hash doesn't really matter here.\n\t\tauto hash_set = std::hash<uint32_t>()(value.desc_set);\n\t\tauto hash_binding = std::hash<uint32_t>()(value.binding);\n\t\treturn (hash_set * 0x10001b31) ^ hash_binding;\n\t}\n\n\tinline size_t operator()(const LocationComponentPair &value) const\n\t{\n\t\t// Quality of hash doesn't really matter here.\n\t\tauto hash_set = std::hash<uint32_t>()(value.location);\n\t\tauto hash_binding = std::hash<uint32_t>()(value.component);\n\t\treturn (hash_set * 0x10001b31) ^ hash_binding;\n\t}\n\n\tinline size_t operator()(const StageSetBinding &value) const\n\t{\n\t\t// Quality of hash doesn't really matter here.\n\t\tauto hash_model = std::hash<uint32_t>()(value.model);\n\t\tauto hash_set = std::hash<uint32_t>()(value.desc_set);\n\t\tauto tmp_hash = (hash_model * 0x10001b31) ^ hash_set;\n\t\treturn (tmp_hash * 0x10001b31) ^ value.binding;\n\t}\n};\n\n// Special constant used in a {MSL,HLSL}ResourceBinding desc_set\n// element to indicate the bindings for the push constants.\nstatic const uint32_t ResourceBindingPushConstantDescriptorSet = ~(0u);\n\n// Special constant used in a {MSL,HLSL}ResourceBinding binding\n// element to indicate the bindings for the push constants.\nstatic const uint32_t ResourceBindingPushConstantBinding = 0;\n} // namespace SPIRV_CROSS_NAMESPACE\n\nnamespace std\n{\ntemplate <SPIRV_CROSS_NAMESPACE::Types type>\nstruct hash<SPIRV_CROSS_NAMESPACE::TypedID<type>>\n{\n\tsize_t operator()(const SPIRV_CROSS_NAMESPACE::TypedID<type> &value) const\n\t{\n\t\treturn std::hash<uint32_t>()(value);\n\t}\n};\n} // namespace std\n\n#endif\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv_cpp.cpp",
    "content": "/*\n * Copyright 2015-2021 Arm Limited\n * SPDX-License-Identifier: Apache-2.0 OR MIT\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * At your option, you may choose to accept this material under either:\n *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or\n *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.\n */\n\n#include \"spirv_cpp.hpp\"\n\nusing namespace spv;\nusing namespace SPIRV_CROSS_NAMESPACE;\nusing namespace std;\n\nvoid CompilerCPP::emit_buffer_block(const SPIRVariable &var)\n{\n\tadd_resource_name(var.self);\n\n\tauto &type = get<SPIRType>(var.basetype);\n\tauto instance_name = to_name(var.self);\n\n\tuint32_t descriptor_set = ir.meta[var.self].decoration.set;\n\tuint32_t binding = ir.meta[var.self].decoration.binding;\n\n\temit_block_struct(type);\n\tauto buffer_name = to_name(type.self);\n\n\tstatement(\"internal::Resource<\", buffer_name, type_to_array_glsl(type), \"> \", instance_name, \"__;\");\n\tstatement_no_indent(\"#define \", instance_name, \" __res->\", instance_name, \"__.get()\");\n\tresource_registrations.push_back(\n\t    join(\"s.register_resource(\", instance_name, \"__\", \", \", descriptor_set, \", \", binding, \");\"));\n\tstatement(\"\");\n}\n\nvoid CompilerCPP::emit_interface_block(const SPIRVariable &var)\n{\n\tadd_resource_name(var.self);\n\n\tauto &type = get<SPIRType>(var.basetype);\n\n\tconst char *qual = var.storage == StorageClassInput ? \"StageInput\" : \"StageOutput\";\n\tconst char *lowerqual = var.storage == StorageClassInput ? \"stage_input\" : \"stage_output\";\n\tauto instance_name = to_name(var.self);\n\tuint32_t location = ir.meta[var.self].decoration.location;\n\n\tstring buffer_name;\n\tauto flags = ir.meta[type.self].decoration.decoration_flags;\n\tif (flags.get(DecorationBlock))\n\t{\n\t\temit_block_struct(type);\n\t\tbuffer_name = to_name(type.self);\n\t}\n\telse\n\t\tbuffer_name = type_to_glsl(type);\n\n\tstatement(\"internal::\", qual, \"<\", buffer_name, type_to_array_glsl(type), \"> \", instance_name, \"__;\");\n\tstatement_no_indent(\"#define \", instance_name, \" __res->\", instance_name, \"__.get()\");\n\tresource_registrations.push_back(join(\"s.register_\", lowerqual, \"(\", instance_name, \"__\", \", \", location, \");\"));\n\tstatement(\"\");\n}\n\nvoid CompilerCPP::emit_shared(const SPIRVariable &var)\n{\n\tadd_resource_name(var.self);\n\n\tauto instance_name = to_name(var.self);\n\tstatement(CompilerGLSL::variable_decl(var), \";\");\n\tstatement_no_indent(\"#define \", instance_name, \" __res->\", instance_name);\n}\n\nvoid CompilerCPP::emit_uniform(const SPIRVariable &var)\n{\n\tadd_resource_name(var.self);\n\n\tauto &type = get<SPIRType>(var.basetype);\n\tauto instance_name = to_name(var.self);\n\n\tuint32_t descriptor_set = ir.meta[var.self].decoration.set;\n\tuint32_t binding = ir.meta[var.self].decoration.binding;\n\tuint32_t location = ir.meta[var.self].decoration.location;\n\n\tstring type_name = type_to_glsl(type);\n\tremap_variable_type_name(type, instance_name, type_name);\n\n\tif (type.basetype == SPIRType::Image || type.basetype == SPIRType::SampledImage ||\n\t    type.basetype == SPIRType::AtomicCounter)\n\t{\n\t\tstatement(\"internal::Resource<\", type_name, type_to_array_glsl(type), \"> \", instance_name, \"__;\");\n\t\tstatement_no_indent(\"#define \", instance_name, \" __res->\", instance_name, \"__.get()\");\n\t\tresource_registrations.push_back(\n\t\t    join(\"s.register_resource(\", instance_name, \"__\", \", \", descriptor_set, \", \", binding, \");\"));\n\t}\n\telse\n\t{\n\t\tstatement(\"internal::UniformConstant<\", type_name, type_to_array_glsl(type), \"> \", instance_name, \"__;\");\n\t\tstatement_no_indent(\"#define \", instance_name, \" __res->\", instance_name, \"__.get()\");\n\t\tresource_registrations.push_back(\n\t\t    join(\"s.register_uniform_constant(\", instance_name, \"__\", \", \", location, \");\"));\n\t}\n\n\tstatement(\"\");\n}\n\nvoid CompilerCPP::emit_push_constant_block(const SPIRVariable &var)\n{\n\tadd_resource_name(var.self);\n\n\tauto &type = get<SPIRType>(var.basetype);\n\tauto &flags = ir.meta[var.self].decoration.decoration_flags;\n\tif (flags.get(DecorationBinding) || flags.get(DecorationDescriptorSet))\n\t\tSPIRV_CROSS_THROW(\"Push constant blocks cannot be compiled to GLSL with Binding or Set syntax. \"\n\t\t                  \"Remap to location with reflection API first or disable these decorations.\");\n\n\temit_block_struct(type);\n\tauto buffer_name = to_name(type.self);\n\tauto instance_name = to_name(var.self);\n\n\tstatement(\"internal::PushConstant<\", buffer_name, type_to_array_glsl(type), \"> \", instance_name, \";\");\n\tstatement_no_indent(\"#define \", instance_name, \" __res->\", instance_name, \".get()\");\n\tresource_registrations.push_back(join(\"s.register_push_constant(\", instance_name, \"__\", \");\"));\n\tstatement(\"\");\n}\n\nvoid CompilerCPP::emit_block_struct(SPIRType &type)\n{\n\t// C++ can't do interface blocks, so we fake it by emitting a separate struct.\n\t// However, these structs are not allowed to alias anything, so remove it before\n\t// emitting the struct.\n\t//\n\t// The type we have here needs to be resolved to the non-pointer type so we can remove aliases.\n\tauto &self = get<SPIRType>(type.self);\n\tself.type_alias = 0;\n\temit_struct(self);\n}\n\nvoid CompilerCPP::emit_resources()\n{\n\tfor (auto &id : ir.ids)\n\t{\n\t\tif (id.get_type() == TypeConstant)\n\t\t{\n\t\t\tauto &c = id.get<SPIRConstant>();\n\n\t\t\tbool needs_declaration = c.specialization || c.is_used_as_lut;\n\n\t\t\tif (needs_declaration)\n\t\t\t{\n\t\t\t\tif (!options.vulkan_semantics && c.specialization)\n\t\t\t\t{\n\t\t\t\t\tc.specialization_constant_macro_name =\n\t\t\t\t\t    constant_value_macro_name(get_decoration(c.self, DecorationSpecId));\n\t\t\t\t}\n\t\t\t\temit_constant(c);\n\t\t\t}\n\t\t}\n\t\telse if (id.get_type() == TypeConstantOp)\n\t\t{\n\t\t\temit_specialization_constant_op(id.get<SPIRConstantOp>());\n\t\t}\n\t}\n\n\t// Output all basic struct types which are not Block or BufferBlock as these are declared inplace\n\t// when such variables are instantiated.\n\tfor (auto &id : ir.ids)\n\t{\n\t\tif (id.get_type() == TypeType)\n\t\t{\n\t\t\tauto &type = id.get<SPIRType>();\n\t\t\tif (type.basetype == SPIRType::Struct && type.array.empty() && !type.pointer &&\n\t\t\t    (!ir.meta[type.self].decoration.decoration_flags.get(DecorationBlock) &&\n\t\t\t     !ir.meta[type.self].decoration.decoration_flags.get(DecorationBufferBlock)))\n\t\t\t{\n\t\t\t\temit_struct(type);\n\t\t\t}\n\t\t}\n\t}\n\n\tstatement(\"struct Resources : \", resource_type);\n\tbegin_scope();\n\n\t// Output UBOs and SSBOs\n\tfor (auto &id : ir.ids)\n\t{\n\t\tif (id.get_type() == TypeVariable)\n\t\t{\n\t\t\tauto &var = id.get<SPIRVariable>();\n\t\t\tauto &type = get<SPIRType>(var.basetype);\n\n\t\t\tif (var.storage != StorageClassFunction && type.pointer && type.storage == StorageClassUniform &&\n\t\t\t    !is_hidden_variable(var) &&\n\t\t\t    (ir.meta[type.self].decoration.decoration_flags.get(DecorationBlock) ||\n\t\t\t     ir.meta[type.self].decoration.decoration_flags.get(DecorationBufferBlock)))\n\t\t\t{\n\t\t\t\temit_buffer_block(var);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Output push constant blocks\n\tfor (auto &id : ir.ids)\n\t{\n\t\tif (id.get_type() == TypeVariable)\n\t\t{\n\t\t\tauto &var = id.get<SPIRVariable>();\n\t\t\tauto &type = get<SPIRType>(var.basetype);\n\t\t\tif (!is_hidden_variable(var) && var.storage != StorageClassFunction && type.pointer &&\n\t\t\t    type.storage == StorageClassPushConstant)\n\t\t\t{\n\t\t\t\temit_push_constant_block(var);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Output in/out interfaces.\n\tfor (auto &id : ir.ids)\n\t{\n\t\tif (id.get_type() == TypeVariable)\n\t\t{\n\t\t\tauto &var = id.get<SPIRVariable>();\n\t\t\tauto &type = get<SPIRType>(var.basetype);\n\n\t\t\tif (var.storage != StorageClassFunction && !is_hidden_variable(var) && type.pointer &&\n\t\t\t    (var.storage == StorageClassInput || var.storage == StorageClassOutput) &&\n\t\t\t    interface_variable_exists_in_entry_point(var.self))\n\t\t\t{\n\t\t\t\temit_interface_block(var);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Output Uniform Constants (values, samplers, images, etc).\n\tfor (auto &id : ir.ids)\n\t{\n\t\tif (id.get_type() == TypeVariable)\n\t\t{\n\t\t\tauto &var = id.get<SPIRVariable>();\n\t\t\tauto &type = get<SPIRType>(var.basetype);\n\n\t\t\tif (var.storage != StorageClassFunction && !is_hidden_variable(var) && type.pointer &&\n\t\t\t    (type.storage == StorageClassUniformConstant || type.storage == StorageClassAtomicCounter))\n\t\t\t{\n\t\t\t\temit_uniform(var);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Global variables.\n\tbool emitted = false;\n\tfor (auto global : global_variables)\n\t{\n\t\tauto &var = get<SPIRVariable>(global);\n\t\tif (var.storage == StorageClassWorkgroup)\n\t\t{\n\t\t\temit_shared(var);\n\t\t\temitted = true;\n\t\t}\n\t}\n\n\tif (emitted)\n\t\tstatement(\"\");\n\n\tstatement(\"inline void init(spirv_cross_shader& s)\");\n\tbegin_scope();\n\tstatement(resource_type, \"::init(s);\");\n\tfor (auto &reg : resource_registrations)\n\t\tstatement(reg);\n\tend_scope();\n\tresource_registrations.clear();\n\n\tend_scope_decl();\n\n\tstatement(\"\");\n\tstatement(\"Resources* __res;\");\n\tif (get_entry_point().model == ExecutionModelGLCompute)\n\t\tstatement(\"ComputePrivateResources __priv_res;\");\n\tstatement(\"\");\n\n\t// Emit regular globals which are allocated per invocation.\n\temitted = false;\n\tfor (auto global : global_variables)\n\t{\n\t\tauto &var = get<SPIRVariable>(global);\n\t\tif (var.storage == StorageClassPrivate)\n\t\t{\n\t\t\tif (var.storage == StorageClassWorkgroup)\n\t\t\t\temit_shared(var);\n\t\t\telse\n\t\t\t\tstatement(CompilerGLSL::variable_decl(var), \";\");\n\t\t\temitted = true;\n\t\t}\n\t}\n\n\tif (emitted)\n\t\tstatement(\"\");\n}\n\nstring CompilerCPP::compile()\n{\n\tir.fixup_reserved_names();\n\n\t// Do not deal with ES-isms like precision, older extensions and such.\n\toptions.es = false;\n\toptions.version = 450;\n\tbackend.float_literal_suffix = true;\n\tbackend.double_literal_suffix = false;\n\tbackend.long_long_literal_suffix = true;\n\tbackend.uint32_t_literal_suffix = true;\n\tbackend.basic_int_type = \"int32_t\";\n\tbackend.basic_uint_type = \"uint32_t\";\n\tbackend.swizzle_is_function = true;\n\tbackend.shared_is_implied = true;\n\tbackend.unsized_array_supported = false;\n\tbackend.explicit_struct_type = true;\n\tbackend.use_initializer_list = true;\n\n\tfixup_type_alias();\n\treorder_type_alias();\n\tbuild_function_control_flow_graphs_and_analyze();\n\tupdate_active_builtins();\n\n\tuint32_t pass_count = 0;\n\tdo\n\t{\n\t\tresource_registrations.clear();\n\t\treset(pass_count);\n\n\t\t// Move constructor for this type is broken on GCC 4.9 ...\n\t\tbuffer.reset();\n\n\t\temit_header();\n\t\temit_resources();\n\n\t\temit_function(get<SPIRFunction>(ir.default_entry_point), Bitset());\n\n\t\tpass_count++;\n\t} while (is_forcing_recompilation());\n\n\t// Match opening scope of emit_header().\n\tend_scope_decl();\n\t// namespace\n\tend_scope();\n\n\t// Emit C entry points\n\temit_c_linkage();\n\n\t// Entry point in CPP is always main() for the time being.\n\tget_entry_point().name = \"main\";\n\n\treturn buffer.str();\n}\n\nvoid CompilerCPP::emit_c_linkage()\n{\n\tstatement(\"\");\n\n\tstatement(\"spirv_cross_shader_t *spirv_cross_construct(void)\");\n\tbegin_scope();\n\tstatement(\"return new \", impl_type, \"();\");\n\tend_scope();\n\n\tstatement(\"\");\n\tstatement(\"void spirv_cross_destruct(spirv_cross_shader_t *shader)\");\n\tbegin_scope();\n\tstatement(\"delete static_cast<\", impl_type, \"*>(shader);\");\n\tend_scope();\n\n\tstatement(\"\");\n\tstatement(\"void spirv_cross_invoke(spirv_cross_shader_t *shader)\");\n\tbegin_scope();\n\tstatement(\"static_cast<\", impl_type, \"*>(shader)->invoke();\");\n\tend_scope();\n\n\tstatement(\"\");\n\tstatement(\"static const struct spirv_cross_interface vtable =\");\n\tbegin_scope();\n\tstatement(\"spirv_cross_construct,\");\n\tstatement(\"spirv_cross_destruct,\");\n\tstatement(\"spirv_cross_invoke,\");\n\tend_scope_decl();\n\n\tstatement(\"\");\n\tstatement(\"const struct spirv_cross_interface *\",\n\t          interface_name.empty() ? string(\"spirv_cross_get_interface\") : interface_name, \"(void)\");\n\tbegin_scope();\n\tstatement(\"return &vtable;\");\n\tend_scope();\n}\n\nvoid CompilerCPP::emit_function_prototype(SPIRFunction &func, const Bitset &)\n{\n\tif (func.self != ir.default_entry_point)\n\t\tadd_function_overload(func);\n\n\tlocal_variable_names = resource_names;\n\tstring decl;\n\n\tauto &type = get<SPIRType>(func.return_type);\n\tdecl += \"inline \";\n\tdecl += type_to_glsl(type);\n\tdecl += \" \";\n\n\tif (func.self == ir.default_entry_point)\n\t{\n\t\tdecl += \"main\";\n\t\tprocessing_entry_point = true;\n\t}\n\telse\n\t\tdecl += to_name(func.self);\n\n\tdecl += \"(\";\n\tfor (auto &arg : func.arguments)\n\t{\n\t\tadd_local_variable_name(arg.id);\n\n\t\tdecl += argument_decl(arg);\n\t\tif (&arg != &func.arguments.back())\n\t\t\tdecl += \", \";\n\n\t\t// Hold a pointer to the parameter so we can invalidate the readonly field if needed.\n\t\tauto *var = maybe_get<SPIRVariable>(arg.id);\n\t\tif (var)\n\t\t\tvar->parameter = &arg;\n\t}\n\n\tdecl += \")\";\n\tstatement(decl);\n}\n\nstring CompilerCPP::argument_decl(const SPIRFunction::Parameter &arg)\n{\n\tauto &type = expression_type(arg.id);\n\tbool constref = !type.pointer || arg.write_count == 0;\n\n\tauto &var = get<SPIRVariable>(arg.id);\n\n\tstring base = type_to_glsl(type);\n\tstring variable_name = to_name(var.self);\n\tremap_variable_type_name(type, variable_name, base);\n\n\tfor (uint32_t i = 0; i < type.array.size(); i++)\n\t\tbase = join(\"std::array<\", base, \", \", to_array_size(type, i), \">\");\n\n\treturn join(constref ? \"const \" : \"\", base, \" &\", variable_name);\n}\n\nstring CompilerCPP::variable_decl(const SPIRType &type, const string &name, uint32_t /* id */)\n{\n\tstring base = type_to_glsl(type);\n\tremap_variable_type_name(type, name, base);\n\tbool runtime = false;\n\n\tfor (uint32_t i = 0; i < type.array.size(); i++)\n\t{\n\t\tauto &array = type.array[i];\n\t\tif (!array && type.array_size_literal[i])\n\t\t{\n\t\t\t// Avoid using runtime arrays with std::array since this is undefined.\n\t\t\t// Runtime arrays cannot be passed around as values, so this is fine.\n\t\t\truntime = true;\n\t\t}\n\t\telse\n\t\t\tbase = join(\"std::array<\", base, \", \", to_array_size(type, i), \">\");\n\t}\n\tbase += ' ';\n\treturn base + name + (runtime ? \"[1]\" : \"\");\n}\n\nvoid CompilerCPP::emit_header()\n{\n\tauto &execution = get_entry_point();\n\n\tstatement(\"// This C++ shader is autogenerated by spirv-cross.\");\n\tstatement(\"#include \\\"spirv_cross/internal_interface.hpp\\\"\");\n\tstatement(\"#include \\\"spirv_cross/external_interface.h\\\"\");\n\t// Needed to properly implement GLSL-style arrays.\n\tstatement(\"#include <array>\");\n\tstatement(\"#include <stdint.h>\");\n\tstatement(\"\");\n\tstatement(\"using namespace spirv_cross;\");\n\tstatement(\"using namespace glm;\");\n\tstatement(\"\");\n\n\tstatement(\"namespace Impl\");\n\tbegin_scope();\n\n\tswitch (execution.model)\n\t{\n\tcase ExecutionModelGeometry:\n\tcase ExecutionModelTessellationControl:\n\tcase ExecutionModelTessellationEvaluation:\n\tcase ExecutionModelGLCompute:\n\tcase ExecutionModelFragment:\n\tcase ExecutionModelVertex:\n\t\tstatement(\"struct Shader\");\n\t\tbegin_scope();\n\t\tbreak;\n\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Unsupported execution model.\");\n\t}\n\n\tswitch (execution.model)\n\t{\n\tcase ExecutionModelGeometry:\n\t\timpl_type = \"GeometryShader<Impl::Shader, Impl::Shader::Resources>\";\n\t\tresource_type = \"GeometryResources\";\n\t\tbreak;\n\n\tcase ExecutionModelVertex:\n\t\timpl_type = \"VertexShader<Impl::Shader, Impl::Shader::Resources>\";\n\t\tresource_type = \"VertexResources\";\n\t\tbreak;\n\n\tcase ExecutionModelFragment:\n\t\timpl_type = \"FragmentShader<Impl::Shader, Impl::Shader::Resources>\";\n\t\tresource_type = \"FragmentResources\";\n\t\tbreak;\n\n\tcase ExecutionModelGLCompute:\n\t\timpl_type = join(\"ComputeShader<Impl::Shader, Impl::Shader::Resources, \", execution.workgroup_size.x, \", \",\n\t\t                 execution.workgroup_size.y, \", \", execution.workgroup_size.z, \">\");\n\t\tresource_type = \"ComputeResources\";\n\t\tbreak;\n\n\tcase ExecutionModelTessellationControl:\n\t\timpl_type = \"TessControlShader<Impl::Shader, Impl::Shader::Resources>\";\n\t\tresource_type = \"TessControlResources\";\n\t\tbreak;\n\n\tcase ExecutionModelTessellationEvaluation:\n\t\timpl_type = \"TessEvaluationShader<Impl::Shader, Impl::Shader::Resources>\";\n\t\tresource_type = \"TessEvaluationResources\";\n\t\tbreak;\n\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Unsupported execution model.\");\n\t}\n}\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv_cpp.hpp",
    "content": "/*\n * Copyright 2015-2021 Arm Limited\n * SPDX-License-Identifier: Apache-2.0 OR MIT\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * At your option, you may choose to accept this material under either:\n *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or\n *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.\n */\n\n#ifndef SPIRV_CROSS_CPP_HPP\n#define SPIRV_CROSS_CPP_HPP\n\n#include \"spirv_glsl.hpp\"\n#include <utility>\n\nnamespace SPIRV_CROSS_NAMESPACE\n{\nclass CompilerCPP : public CompilerGLSL\n{\npublic:\n\texplicit CompilerCPP(std::vector<uint32_t> spirv_)\n\t    : CompilerGLSL(std::move(spirv_))\n\t{\n\t}\n\n\tCompilerCPP(const uint32_t *ir_, size_t word_count)\n\t    : CompilerGLSL(ir_, word_count)\n\t{\n\t}\n\n\texplicit CompilerCPP(const ParsedIR &ir_)\n\t    : CompilerGLSL(ir_)\n\t{\n\t}\n\n\texplicit CompilerCPP(ParsedIR &&ir_)\n\t    : CompilerGLSL(std::move(ir_))\n\t{\n\t}\n\n\tstd::string compile() override;\n\n\t// Sets a custom symbol name that can override\n\t// spirv_cross_get_interface.\n\t//\n\t// Useful when several shader interfaces are linked\n\t// statically into the same binary.\n\tvoid set_interface_name(std::string name)\n\t{\n\t\tinterface_name = std::move(name);\n\t}\n\nprivate:\n\tvoid emit_header() override;\n\tvoid emit_c_linkage();\n\tvoid emit_function_prototype(SPIRFunction &func, const Bitset &return_flags) override;\n\n\tvoid emit_resources();\n\tvoid emit_buffer_block(const SPIRVariable &type) override;\n\tvoid emit_push_constant_block(const SPIRVariable &var) override;\n\tvoid emit_interface_block(const SPIRVariable &type);\n\tvoid emit_block_chain(SPIRBlock &block);\n\tvoid emit_uniform(const SPIRVariable &var) override;\n\tvoid emit_shared(const SPIRVariable &var);\n\tvoid emit_block_struct(SPIRType &type);\n\tstd::string variable_decl(const SPIRType &type, const std::string &name, uint32_t id) override;\n\n\tstd::string argument_decl(const SPIRFunction::Parameter &arg);\n\n\tSmallVector<std::string> resource_registrations;\n\tstd::string impl_type;\n\tstd::string resource_type;\n\tuint32_t shared_counter = 0;\n\n\tstd::string interface_name;\n};\n} // namespace SPIRV_CROSS_NAMESPACE\n\n#endif\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv_cross.cpp",
    "content": "/*\n * Copyright 2015-2021 Arm Limited\n * SPDX-License-Identifier: Apache-2.0 OR MIT\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * At your option, you may choose to accept this material under either:\n *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or\n *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.\n */\n\n#include \"spirv_cross.hpp\"\n#include \"GLSL.std.450.h\"\n#include \"spirv_cfg.hpp\"\n#include \"spirv_common.hpp\"\n#include \"spirv_parser.hpp\"\n#include <algorithm>\n#include <cstring>\n#include <utility>\n\nusing namespace std;\nusing namespace spv;\nusing namespace SPIRV_CROSS_NAMESPACE;\n\nCompiler::Compiler(vector<uint32_t> ir_)\n{\n\tParser parser(std::move(ir_));\n\tparser.parse();\n\tset_ir(std::move(parser.get_parsed_ir()));\n}\n\nCompiler::Compiler(const uint32_t *ir_, size_t word_count)\n{\n\tParser parser(ir_, word_count);\n\tparser.parse();\n\tset_ir(std::move(parser.get_parsed_ir()));\n}\n\nCompiler::Compiler(const ParsedIR &ir_)\n{\n\tset_ir(ir_);\n}\n\nCompiler::Compiler(ParsedIR &&ir_)\n{\n\tset_ir(std::move(ir_));\n}\n\nvoid Compiler::set_ir(ParsedIR &&ir_)\n{\n\tir = std::move(ir_);\n\tparse_fixup();\n}\n\nvoid Compiler::set_ir(const ParsedIR &ir_)\n{\n\tir = ir_;\n\tparse_fixup();\n}\n\nstring Compiler::compile()\n{\n\treturn \"\";\n}\n\nbool Compiler::variable_storage_is_aliased(const SPIRVariable &v)\n{\n\tauto &type = get<SPIRType>(v.basetype);\n\tbool ssbo = v.storage == StorageClassStorageBuffer ||\n\t            ir.meta[type.self].decoration.decoration_flags.get(DecorationBufferBlock);\n\tbool image = type.basetype == SPIRType::Image;\n\tbool counter = type.basetype == SPIRType::AtomicCounter;\n\tbool buffer_reference = type.storage == StorageClassPhysicalStorageBufferEXT;\n\n\tbool is_restrict;\n\tif (ssbo)\n\t\tis_restrict = ir.get_buffer_block_flags(v).get(DecorationRestrict);\n\telse\n\t\tis_restrict = has_decoration(v.self, DecorationRestrict);\n\n\treturn !is_restrict && (ssbo || image || counter || buffer_reference);\n}\n\nbool Compiler::block_is_pure(const SPIRBlock &block)\n{\n\t// This is a global side effect of the function.\n\tif (block.terminator == SPIRBlock::Kill ||\n\t    block.terminator == SPIRBlock::TerminateRay ||\n\t    block.terminator == SPIRBlock::IgnoreIntersection ||\n\t    block.terminator == SPIRBlock::EmitMeshTasks)\n\t\treturn false;\n\n\tfor (auto &i : block.ops)\n\t{\n\t\tauto ops = stream(i);\n\t\tauto op = static_cast<Op>(i.op);\n\n\t\tswitch (op)\n\t\t{\n\t\tcase OpFunctionCall:\n\t\t{\n\t\t\tuint32_t func = ops[2];\n\t\t\tif (!function_is_pure(get<SPIRFunction>(func)))\n\t\t\t\treturn false;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase OpCopyMemory:\n\t\tcase OpStore:\n\t\t{\n\t\t\tauto &type = expression_type(ops[0]);\n\t\t\tif (type.storage != StorageClassFunction)\n\t\t\t\treturn false;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase OpImageWrite:\n\t\t\treturn false;\n\n\t\t// Atomics are impure.\n\t\tcase OpAtomicLoad:\n\t\tcase OpAtomicStore:\n\t\tcase OpAtomicExchange:\n\t\tcase OpAtomicCompareExchange:\n\t\tcase OpAtomicCompareExchangeWeak:\n\t\tcase OpAtomicIIncrement:\n\t\tcase OpAtomicIDecrement:\n\t\tcase OpAtomicIAdd:\n\t\tcase OpAtomicISub:\n\t\tcase OpAtomicSMin:\n\t\tcase OpAtomicUMin:\n\t\tcase OpAtomicSMax:\n\t\tcase OpAtomicUMax:\n\t\tcase OpAtomicAnd:\n\t\tcase OpAtomicOr:\n\t\tcase OpAtomicXor:\n\t\t\treturn false;\n\n\t\t// Geometry shader builtins modify global state.\n\t\tcase OpEndPrimitive:\n\t\tcase OpEmitStreamVertex:\n\t\tcase OpEndStreamPrimitive:\n\t\tcase OpEmitVertex:\n\t\t\treturn false;\n\n\t\t// Mesh shader functions modify global state.\n\t\t// (EmitMeshTasks is a terminator).\n\t\tcase OpSetMeshOutputsEXT:\n\t\t\treturn false;\n\n\t\t// Barriers disallow any reordering, so we should treat blocks with barrier as writing.\n\t\tcase OpControlBarrier:\n\t\tcase OpMemoryBarrier:\n\t\t\treturn false;\n\n\t\t// Ray tracing builtins are impure.\n\t\tcase OpReportIntersectionKHR:\n\t\tcase OpIgnoreIntersectionNV:\n\t\tcase OpTerminateRayNV:\n\t\tcase OpTraceNV:\n\t\tcase OpTraceRayKHR:\n\t\tcase OpExecuteCallableNV:\n\t\tcase OpExecuteCallableKHR:\n\t\tcase OpRayQueryInitializeKHR:\n\t\tcase OpRayQueryTerminateKHR:\n\t\tcase OpRayQueryGenerateIntersectionKHR:\n\t\tcase OpRayQueryConfirmIntersectionKHR:\n\t\tcase OpRayQueryProceedKHR:\n\t\t\t// There are various getters in ray query, but they are considered pure.\n\t\t\treturn false;\n\n\t\t\t// OpExtInst is potentially impure depending on extension, but GLSL builtins are at least pure.\n\n\t\tcase OpDemoteToHelperInvocationEXT:\n\t\t\t// This is a global side effect of the function.\n\t\t\treturn false;\n\n\t\tcase OpExtInst:\n\t\t{\n\t\t\tuint32_t extension_set = ops[2];\n\t\t\tif (get<SPIRExtension>(extension_set).ext == SPIRExtension::GLSL)\n\t\t\t{\n\t\t\t\tauto op_450 = static_cast<GLSLstd450>(ops[3]);\n\t\t\t\tswitch (op_450)\n\t\t\t\t{\n\t\t\t\tcase GLSLstd450Modf:\n\t\t\t\tcase GLSLstd450Frexp:\n\t\t\t\t{\n\t\t\t\t\tauto &type = expression_type(ops[5]);\n\t\t\t\t\tif (type.storage != StorageClassFunction)\n\t\t\t\t\t\treturn false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nstring Compiler::to_name(uint32_t id, bool allow_alias) const\n{\n\tif (allow_alias && ir.ids[id].get_type() == TypeType)\n\t{\n\t\t// If this type is a simple alias, emit the\n\t\t// name of the original type instead.\n\t\t// We don't want to override the meta alias\n\t\t// as that can be overridden by the reflection APIs after parse.\n\t\tauto &type = get<SPIRType>(id);\n\t\tif (type.type_alias)\n\t\t{\n\t\t\t// If the alias master has been specially packed, we will have emitted a clean variant as well,\n\t\t\t// so skip the name aliasing here.\n\t\t\tif (!has_extended_decoration(type.type_alias, SPIRVCrossDecorationBufferBlockRepacked))\n\t\t\t\treturn to_name(type.type_alias);\n\t\t}\n\t}\n\n\tauto &alias = ir.get_name(id);\n\tif (alias.empty())\n\t\treturn join(\"_\", id);\n\telse\n\t\treturn alias;\n}\n\nbool Compiler::function_is_pure(const SPIRFunction &func)\n{\n\tfor (auto block : func.blocks)\n\t{\n\t\tif (!block_is_pure(get<SPIRBlock>(block)))\n\t\t{\n\t\t\t//fprintf(stderr, \"Function %s is impure!\\n\", to_name(func.self).c_str());\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t//fprintf(stderr, \"Function %s is pure!\\n\", to_name(func.self).c_str());\n\treturn true;\n}\n\nvoid Compiler::register_global_read_dependencies(const SPIRBlock &block, uint32_t id)\n{\n\tfor (auto &i : block.ops)\n\t{\n\t\tauto ops = stream(i);\n\t\tauto op = static_cast<Op>(i.op);\n\n\t\tswitch (op)\n\t\t{\n\t\tcase OpFunctionCall:\n\t\t{\n\t\t\tuint32_t func = ops[2];\n\t\t\tregister_global_read_dependencies(get<SPIRFunction>(func), id);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase OpLoad:\n\t\tcase OpImageRead:\n\t\t{\n\t\t\t// If we're in a storage class which does not get invalidated, adding dependencies here is no big deal.\n\t\t\tauto *var = maybe_get_backing_variable(ops[2]);\n\t\t\tif (var && var->storage != StorageClassFunction)\n\t\t\t{\n\t\t\t\tauto &type = get<SPIRType>(var->basetype);\n\n\t\t\t\t// InputTargets are immutable.\n\t\t\t\tif (type.basetype != SPIRType::Image && type.image.dim != DimSubpassData)\n\t\t\t\t\tvar->dependees.push_back(id);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nvoid Compiler::register_global_read_dependencies(const SPIRFunction &func, uint32_t id)\n{\n\tfor (auto block : func.blocks)\n\t\tregister_global_read_dependencies(get<SPIRBlock>(block), id);\n}\n\nSPIRVariable *Compiler::maybe_get_backing_variable(uint32_t chain)\n{\n\tauto *var = maybe_get<SPIRVariable>(chain);\n\tif (!var)\n\t{\n\t\tauto *cexpr = maybe_get<SPIRExpression>(chain);\n\t\tif (cexpr)\n\t\t\tvar = maybe_get<SPIRVariable>(cexpr->loaded_from);\n\n\t\tauto *access_chain = maybe_get<SPIRAccessChain>(chain);\n\t\tif (access_chain)\n\t\t\tvar = maybe_get<SPIRVariable>(access_chain->loaded_from);\n\t}\n\n\treturn var;\n}\n\nvoid Compiler::register_read(uint32_t expr, uint32_t chain, bool forwarded)\n{\n\tauto &e = get<SPIRExpression>(expr);\n\tauto *var = maybe_get_backing_variable(chain);\n\n\tif (var)\n\t{\n\t\te.loaded_from = var->self;\n\n\t\t// If the backing variable is immutable, we do not need to depend on the variable.\n\t\tif (forwarded && !is_immutable(var->self))\n\t\t\tvar->dependees.push_back(e.self);\n\n\t\t// If we load from a parameter, make sure we create \"inout\" if we also write to the parameter.\n\t\t// The default is \"in\" however, so we never invalidate our compilation by reading.\n\t\tif (var && var->parameter)\n\t\t\tvar->parameter->read_count++;\n\t}\n}\n\nvoid Compiler::register_write(uint32_t chain)\n{\n\tauto *var = maybe_get<SPIRVariable>(chain);\n\tif (!var)\n\t{\n\t\t// If we're storing through an access chain, invalidate the backing variable instead.\n\t\tauto *expr = maybe_get<SPIRExpression>(chain);\n\t\tif (expr && expr->loaded_from)\n\t\t\tvar = maybe_get<SPIRVariable>(expr->loaded_from);\n\n\t\tauto *access_chain = maybe_get<SPIRAccessChain>(chain);\n\t\tif (access_chain && access_chain->loaded_from)\n\t\t\tvar = maybe_get<SPIRVariable>(access_chain->loaded_from);\n\t}\n\n\tauto &chain_type = expression_type(chain);\n\n\tif (var)\n\t{\n\t\tbool check_argument_storage_qualifier = true;\n\t\tauto &type = expression_type(chain);\n\n\t\t// If our variable is in a storage class which can alias with other buffers,\n\t\t// invalidate all variables which depend on aliased variables. And if this is a\n\t\t// variable pointer, then invalidate all variables regardless.\n\t\tif (get_variable_data_type(*var).pointer)\n\t\t{\n\t\t\tflush_all_active_variables();\n\n\t\t\tif (type.pointer_depth == 1)\n\t\t\t{\n\t\t\t\t// We have a backing variable which is a pointer-to-pointer type.\n\t\t\t\t// We are storing some data through a pointer acquired through that variable,\n\t\t\t\t// but we are not writing to the value of the variable itself,\n\t\t\t\t// i.e., we are not modifying the pointer directly.\n\t\t\t\t// If we are storing a non-pointer type (pointer_depth == 1),\n\t\t\t\t// we know that we are storing some unrelated data.\n\t\t\t\t// A case here would be\n\t\t\t\t// void foo(Foo * const *arg) {\n\t\t\t\t//   Foo *bar = *arg;\n\t\t\t\t//   bar->unrelated = 42;\n\t\t\t\t// }\n\t\t\t\t// arg, the argument is constant.\n\t\t\t\tcheck_argument_storage_qualifier = false;\n\t\t\t}\n\t\t}\n\n\t\tif (type.storage == StorageClassPhysicalStorageBufferEXT || variable_storage_is_aliased(*var))\n\t\t\tflush_all_aliased_variables();\n\t\telse if (var)\n\t\t\tflush_dependees(*var);\n\n\t\t// We tried to write to a parameter which is not marked with out qualifier, force a recompile.\n\t\tif (check_argument_storage_qualifier && var->parameter && var->parameter->write_count == 0)\n\t\t{\n\t\t\tvar->parameter->write_count++;\n\t\t\tforce_recompile();\n\t\t}\n\t}\n\telse if (chain_type.pointer)\n\t{\n\t\t// If we stored through a variable pointer, then we don't know which\n\t\t// variable we stored to. So *all* expressions after this point need to\n\t\t// be invalidated.\n\t\t// FIXME: If we can prove that the variable pointer will point to\n\t\t// only certain variables, we can invalidate only those.\n\t\tflush_all_active_variables();\n\t}\n\n\t// If chain_type.pointer is false, we're not writing to memory backed variables, but temporaries instead.\n\t// This can happen in copy_logical_type where we unroll complex reads and writes to temporaries.\n}\n\nvoid Compiler::flush_dependees(SPIRVariable &var)\n{\n\tfor (auto expr : var.dependees)\n\t\tinvalid_expressions.insert(expr);\n\tvar.dependees.clear();\n}\n\nvoid Compiler::flush_all_aliased_variables()\n{\n\tfor (auto aliased : aliased_variables)\n\t\tflush_dependees(get<SPIRVariable>(aliased));\n}\n\nvoid Compiler::flush_all_atomic_capable_variables()\n{\n\tfor (auto global : global_variables)\n\t\tflush_dependees(get<SPIRVariable>(global));\n\tflush_all_aliased_variables();\n}\n\nvoid Compiler::flush_control_dependent_expressions(uint32_t block_id)\n{\n\tauto &block = get<SPIRBlock>(block_id);\n\tfor (auto &expr : block.invalidate_expressions)\n\t\tinvalid_expressions.insert(expr);\n\tblock.invalidate_expressions.clear();\n}\n\nvoid Compiler::flush_all_active_variables()\n{\n\t// Invalidate all temporaries we read from variables in this block since they were forwarded.\n\t// Invalidate all temporaries we read from globals.\n\tfor (auto &v : current_function->local_variables)\n\t\tflush_dependees(get<SPIRVariable>(v));\n\tfor (auto &arg : current_function->arguments)\n\t\tflush_dependees(get<SPIRVariable>(arg.id));\n\tfor (auto global : global_variables)\n\t\tflush_dependees(get<SPIRVariable>(global));\n\n\tflush_all_aliased_variables();\n}\n\nuint32_t Compiler::expression_type_id(uint32_t id) const\n{\n\tswitch (ir.ids[id].get_type())\n\t{\n\tcase TypeVariable:\n\t\treturn get<SPIRVariable>(id).basetype;\n\n\tcase TypeExpression:\n\t\treturn get<SPIRExpression>(id).expression_type;\n\n\tcase TypeConstant:\n\t\treturn get<SPIRConstant>(id).constant_type;\n\n\tcase TypeConstantOp:\n\t\treturn get<SPIRConstantOp>(id).basetype;\n\n\tcase TypeUndef:\n\t\treturn get<SPIRUndef>(id).basetype;\n\n\tcase TypeCombinedImageSampler:\n\t\treturn get<SPIRCombinedImageSampler>(id).combined_type;\n\n\tcase TypeAccessChain:\n\t\treturn get<SPIRAccessChain>(id).basetype;\n\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Cannot resolve expression type.\");\n\t}\n}\n\nconst SPIRType &Compiler::expression_type(uint32_t id) const\n{\n\treturn get<SPIRType>(expression_type_id(id));\n}\n\nbool Compiler::expression_is_lvalue(uint32_t id) const\n{\n\tauto &type = expression_type(id);\n\tswitch (type.basetype)\n\t{\n\tcase SPIRType::SampledImage:\n\tcase SPIRType::Image:\n\tcase SPIRType::Sampler:\n\t\treturn false;\n\n\tdefault:\n\t\treturn true;\n\t}\n}\n\nbool Compiler::is_immutable(uint32_t id) const\n{\n\tif (ir.ids[id].get_type() == TypeVariable)\n\t{\n\t\tauto &var = get<SPIRVariable>(id);\n\n\t\t// Anything we load from the UniformConstant address space is guaranteed to be immutable.\n\t\tbool pointer_to_const = var.storage == StorageClassUniformConstant;\n\t\treturn pointer_to_const || var.phi_variable || !expression_is_lvalue(id);\n\t}\n\telse if (ir.ids[id].get_type() == TypeAccessChain)\n\t\treturn get<SPIRAccessChain>(id).immutable;\n\telse if (ir.ids[id].get_type() == TypeExpression)\n\t\treturn get<SPIRExpression>(id).immutable;\n\telse if (ir.ids[id].get_type() == TypeConstant || ir.ids[id].get_type() == TypeConstantOp ||\n\t         ir.ids[id].get_type() == TypeUndef)\n\t\treturn true;\n\telse\n\t\treturn false;\n}\n\nstatic inline bool storage_class_is_interface(spv::StorageClass storage)\n{\n\tswitch (storage)\n\t{\n\tcase StorageClassInput:\n\tcase StorageClassOutput:\n\tcase StorageClassUniform:\n\tcase StorageClassUniformConstant:\n\tcase StorageClassAtomicCounter:\n\tcase StorageClassPushConstant:\n\tcase StorageClassStorageBuffer:\n\t\treturn true;\n\n\tdefault:\n\t\treturn false;\n\t}\n}\n\nbool Compiler::is_hidden_variable(const SPIRVariable &var, bool include_builtins) const\n{\n\tif ((is_builtin_variable(var) && !include_builtins) || var.remapped_variable)\n\t\treturn true;\n\n\t// Combined image samplers are always considered active as they are \"magic\" variables.\n\tif (find_if(begin(combined_image_samplers), end(combined_image_samplers), [&var](const CombinedImageSampler &samp) {\n\t\t    return samp.combined_id == var.self;\n\t    }) != end(combined_image_samplers))\n\t{\n\t\treturn false;\n\t}\n\n\t// In SPIR-V 1.4 and up we must also use the active variable interface to disable global variables\n\t// which are not part of the entry point.\n\tif (ir.get_spirv_version() >= 0x10400 && var.storage != spv::StorageClassGeneric &&\n\t    var.storage != spv::StorageClassFunction && !interface_variable_exists_in_entry_point(var.self))\n\t{\n\t\treturn true;\n\t}\n\n\treturn check_active_interface_variables && storage_class_is_interface(var.storage) &&\n\t       active_interface_variables.find(var.self) == end(active_interface_variables);\n}\n\nbool Compiler::is_builtin_type(const SPIRType &type) const\n{\n\tauto *type_meta = ir.find_meta(type.self);\n\n\t// We can have builtin structs as well. If one member of a struct is builtin, the struct must also be builtin.\n\tif (type_meta)\n\t\tfor (auto &m : type_meta->members)\n\t\t\tif (m.builtin)\n\t\t\t\treturn true;\n\n\treturn false;\n}\n\nbool Compiler::is_builtin_variable(const SPIRVariable &var) const\n{\n\tauto *m = ir.find_meta(var.self);\n\n\tif (var.compat_builtin || (m && m->decoration.builtin))\n\t\treturn true;\n\telse\n\t\treturn is_builtin_type(get<SPIRType>(var.basetype));\n}\n\nbool Compiler::is_member_builtin(const SPIRType &type, uint32_t index, BuiltIn *builtin) const\n{\n\tauto *type_meta = ir.find_meta(type.self);\n\n\tif (type_meta)\n\t{\n\t\tauto &memb = type_meta->members;\n\t\tif (index < memb.size() && memb[index].builtin)\n\t\t{\n\t\t\tif (builtin)\n\t\t\t\t*builtin = memb[index].builtin_type;\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nbool Compiler::is_scalar(const SPIRType &type) const\n{\n\treturn type.basetype != SPIRType::Struct && type.vecsize == 1 && type.columns == 1;\n}\n\nbool Compiler::is_vector(const SPIRType &type) const\n{\n\treturn type.vecsize > 1 && type.columns == 1;\n}\n\nbool Compiler::is_matrix(const SPIRType &type) const\n{\n\treturn type.vecsize > 1 && type.columns > 1;\n}\n\nbool Compiler::is_array(const SPIRType &type) const\n{\n\treturn type.op == OpTypeArray || type.op == OpTypeRuntimeArray;\n}\n\nbool Compiler::is_pointer(const SPIRType &type) const\n{\n\treturn type.op == OpTypePointer && type.basetype != SPIRType::Unknown; // Ignore function pointers.\n}\n\nbool Compiler::is_physical_pointer(const SPIRType &type) const\n{\n\treturn type.op == OpTypePointer && type.storage == StorageClassPhysicalStorageBuffer;\n}\n\nbool Compiler::is_runtime_size_array(const SPIRType &type)\n{\n\treturn type.op == OpTypeRuntimeArray;\n}\n\nShaderResources Compiler::get_shader_resources() const\n{\n\treturn get_shader_resources(nullptr);\n}\n\nShaderResources Compiler::get_shader_resources(const unordered_set<VariableID> &active_variables) const\n{\n\treturn get_shader_resources(&active_variables);\n}\n\nbool Compiler::InterfaceVariableAccessHandler::handle(Op opcode, const uint32_t *args, uint32_t length)\n{\n\tuint32_t variable = 0;\n\tswitch (opcode)\n\t{\n\t// Need this first, otherwise, GCC complains about unhandled switch statements.\n\tdefault:\n\t\tbreak;\n\n\tcase OpFunctionCall:\n\t{\n\t\t// Invalid SPIR-V.\n\t\tif (length < 3)\n\t\t\treturn false;\n\n\t\tuint32_t count = length - 3;\n\t\targs += 3;\n\t\tfor (uint32_t i = 0; i < count; i++)\n\t\t{\n\t\t\tauto *var = compiler.maybe_get<SPIRVariable>(args[i]);\n\t\t\tif (var && storage_class_is_interface(var->storage))\n\t\t\t\tvariables.insert(args[i]);\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpSelect:\n\t{\n\t\t// Invalid SPIR-V.\n\t\tif (length < 5)\n\t\t\treturn false;\n\n\t\tuint32_t count = length - 3;\n\t\targs += 3;\n\t\tfor (uint32_t i = 0; i < count; i++)\n\t\t{\n\t\t\tauto *var = compiler.maybe_get<SPIRVariable>(args[i]);\n\t\t\tif (var && storage_class_is_interface(var->storage))\n\t\t\t\tvariables.insert(args[i]);\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpPhi:\n\t{\n\t\t// Invalid SPIR-V.\n\t\tif (length < 2)\n\t\t\treturn false;\n\n\t\tuint32_t count = length - 2;\n\t\targs += 2;\n\t\tfor (uint32_t i = 0; i < count; i += 2)\n\t\t{\n\t\t\tauto *var = compiler.maybe_get<SPIRVariable>(args[i]);\n\t\t\tif (var && storage_class_is_interface(var->storage))\n\t\t\t\tvariables.insert(args[i]);\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpAtomicStore:\n\tcase OpStore:\n\t\t// Invalid SPIR-V.\n\t\tif (length < 1)\n\t\t\treturn false;\n\t\tvariable = args[0];\n\t\tbreak;\n\n\tcase OpCopyMemory:\n\t{\n\t\tif (length < 2)\n\t\t\treturn false;\n\n\t\tauto *var = compiler.maybe_get<SPIRVariable>(args[0]);\n\t\tif (var && storage_class_is_interface(var->storage))\n\t\t\tvariables.insert(args[0]);\n\n\t\tvar = compiler.maybe_get<SPIRVariable>(args[1]);\n\t\tif (var && storage_class_is_interface(var->storage))\n\t\t\tvariables.insert(args[1]);\n\t\tbreak;\n\t}\n\n\tcase OpExtInst:\n\t{\n\t\tif (length < 3)\n\t\t\treturn false;\n\t\tauto &extension_set = compiler.get<SPIRExtension>(args[2]);\n\t\tswitch (extension_set.ext)\n\t\t{\n\t\tcase SPIRExtension::GLSL:\n\t\t{\n\t\t\tauto op = static_cast<GLSLstd450>(args[3]);\n\n\t\t\tswitch (op)\n\t\t\t{\n\t\t\tcase GLSLstd450InterpolateAtCentroid:\n\t\t\tcase GLSLstd450InterpolateAtSample:\n\t\t\tcase GLSLstd450InterpolateAtOffset:\n\t\t\t{\n\t\t\t\tauto *var = compiler.maybe_get<SPIRVariable>(args[4]);\n\t\t\t\tif (var && storage_class_is_interface(var->storage))\n\t\t\t\t\tvariables.insert(args[4]);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase GLSLstd450Modf:\n\t\t\tcase GLSLstd450Fract:\n\t\t\t{\n\t\t\t\tauto *var = compiler.maybe_get<SPIRVariable>(args[5]);\n\t\t\t\tif (var && storage_class_is_interface(var->storage))\n\t\t\t\t\tvariables.insert(args[5]);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase SPIRExtension::SPV_AMD_shader_explicit_vertex_parameter:\n\t\t{\n\t\t\tenum AMDShaderExplicitVertexParameter\n\t\t\t{\n\t\t\t\tInterpolateAtVertexAMD = 1\n\t\t\t};\n\n\t\t\tauto op = static_cast<AMDShaderExplicitVertexParameter>(args[3]);\n\n\t\t\tswitch (op)\n\t\t\t{\n\t\t\tcase InterpolateAtVertexAMD:\n\t\t\t{\n\t\t\t\tauto *var = compiler.maybe_get<SPIRVariable>(args[4]);\n\t\t\t\tif (var && storage_class_is_interface(var->storage))\n\t\t\t\t\tvariables.insert(args[4]);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpAccessChain:\n\tcase OpInBoundsAccessChain:\n\tcase OpPtrAccessChain:\n\tcase OpLoad:\n\tcase OpCopyObject:\n\tcase OpImageTexelPointer:\n\tcase OpAtomicLoad:\n\tcase OpAtomicExchange:\n\tcase OpAtomicCompareExchange:\n\tcase OpAtomicCompareExchangeWeak:\n\tcase OpAtomicIIncrement:\n\tcase OpAtomicIDecrement:\n\tcase OpAtomicIAdd:\n\tcase OpAtomicISub:\n\tcase OpAtomicSMin:\n\tcase OpAtomicUMin:\n\tcase OpAtomicSMax:\n\tcase OpAtomicUMax:\n\tcase OpAtomicAnd:\n\tcase OpAtomicOr:\n\tcase OpAtomicXor:\n\tcase OpArrayLength:\n\t\t// Invalid SPIR-V.\n\t\tif (length < 3)\n\t\t\treturn false;\n\t\tvariable = args[2];\n\t\tbreak;\n\t}\n\n\tif (variable)\n\t{\n\t\tauto *var = compiler.maybe_get<SPIRVariable>(variable);\n\t\tif (var && storage_class_is_interface(var->storage))\n\t\t\tvariables.insert(variable);\n\t}\n\treturn true;\n}\n\nunordered_set<VariableID> Compiler::get_active_interface_variables() const\n{\n\t// Traverse the call graph and find all interface variables which are in use.\n\tunordered_set<VariableID> variables;\n\tInterfaceVariableAccessHandler handler(*this, variables);\n\ttraverse_all_reachable_opcodes(get<SPIRFunction>(ir.default_entry_point), handler);\n\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, const SPIRVariable &var) {\n\t\tif (var.storage != StorageClassOutput)\n\t\t\treturn;\n\t\tif (!interface_variable_exists_in_entry_point(var.self))\n\t\t\treturn;\n\n\t\t// An output variable which is just declared (but uninitialized) might be read by subsequent stages\n\t\t// so we should force-enable these outputs,\n\t\t// since compilation will fail if a subsequent stage attempts to read from the variable in question.\n\t\t// Also, make sure we preserve output variables which are only initialized, but never accessed by any code.\n\t\tif (var.initializer != ID(0) || get_execution_model() != ExecutionModelFragment)\n\t\t\tvariables.insert(var.self);\n\t});\n\n\t// If we needed to create one, we'll need it.\n\tif (dummy_sampler_id)\n\t\tvariables.insert(dummy_sampler_id);\n\n\treturn variables;\n}\n\nvoid Compiler::set_enabled_interface_variables(std::unordered_set<VariableID> active_variables)\n{\n\tactive_interface_variables = std::move(active_variables);\n\tcheck_active_interface_variables = true;\n}\n\nShaderResources Compiler::get_shader_resources(const unordered_set<VariableID> *active_variables) const\n{\n\tShaderResources res;\n\n\tbool ssbo_instance_name = reflection_ssbo_instance_name_is_significant();\n\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, const SPIRVariable &var) {\n\t\tauto &type = this->get<SPIRType>(var.basetype);\n\n\t\t// It is possible for uniform storage classes to be passed as function parameters, so detect\n\t\t// that. To detect function parameters, check of StorageClass of variable is function scope.\n\t\tif (var.storage == StorageClassFunction || !type.pointer)\n\t\t\treturn;\n\n\t\tif (active_variables && active_variables->find(var.self) == end(*active_variables))\n\t\t\treturn;\n\n\t\t// In SPIR-V 1.4 and up, every global must be present in the entry point interface list,\n\t\t// not just IO variables.\n\t\tbool active_in_entry_point = true;\n\t\tif (ir.get_spirv_version() < 0x10400)\n\t\t{\n\t\t\tif (var.storage == StorageClassInput || var.storage == StorageClassOutput)\n\t\t\t\tactive_in_entry_point = interface_variable_exists_in_entry_point(var.self);\n\t\t}\n\t\telse\n\t\t\tactive_in_entry_point = interface_variable_exists_in_entry_point(var.self);\n\n\t\tif (!active_in_entry_point)\n\t\t\treturn;\n\n\t\tbool is_builtin = is_builtin_variable(var);\n\n\t\tif (is_builtin)\n\t\t{\n\t\t\tif (var.storage != StorageClassInput && var.storage != StorageClassOutput)\n\t\t\t\treturn;\n\n\t\t\tauto &list = var.storage == StorageClassInput ? res.builtin_inputs : res.builtin_outputs;\n\t\t\tBuiltInResource resource;\n\n\t\t\tif (has_decoration(type.self, DecorationBlock))\n\t\t\t{\n\t\t\t\tresource.resource = { var.self, var.basetype, type.self,\n\t\t\t\t                      get_remapped_declared_block_name(var.self, false) };\n\n\t\t\t\tfor (uint32_t i = 0; i < uint32_t(type.member_types.size()); i++)\n\t\t\t\t{\n\t\t\t\t\tresource.value_type_id = type.member_types[i];\n\t\t\t\t\tresource.builtin = BuiltIn(get_member_decoration(type.self, i, DecorationBuiltIn));\n\t\t\t\t\tlist.push_back(resource);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbool strip_array =\n\t\t\t\t\t\t!has_decoration(var.self, DecorationPatch) && (\n\t\t\t\t\t\t\t\tget_execution_model() == ExecutionModelTessellationControl ||\n\t\t\t\t\t\t\t\t(get_execution_model() == ExecutionModelTessellationEvaluation &&\n\t\t\t\t\t\t\t\t var.storage == StorageClassInput));\n\n\t\t\t\tresource.resource = { var.self, var.basetype, type.self, get_name(var.self) };\n\n\t\t\t\tif (strip_array && !type.array.empty())\n\t\t\t\t\tresource.value_type_id = get_variable_data_type(var).parent_type;\n\t\t\t\telse\n\t\t\t\t\tresource.value_type_id = get_variable_data_type_id(var);\n\n\t\t\t\tassert(resource.value_type_id);\n\n\t\t\t\tresource.builtin = BuiltIn(get_decoration(var.self, DecorationBuiltIn));\n\t\t\t\tlist.push_back(std::move(resource));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Input\n\t\tif (var.storage == StorageClassInput)\n\t\t{\n\t\t\tif (has_decoration(type.self, DecorationBlock))\n\t\t\t{\n\t\t\t\tres.stage_inputs.push_back(\n\t\t\t\t\t\t{ var.self, var.basetype, type.self,\n\t\t\t\t\t\t  get_remapped_declared_block_name(var.self, false) });\n\t\t\t}\n\t\t\telse\n\t\t\t\tres.stage_inputs.push_back({ var.self, var.basetype, type.self, get_name(var.self) });\n\t\t}\n\t\t// Subpass inputs\n\t\telse if (var.storage == StorageClassUniformConstant && type.image.dim == DimSubpassData)\n\t\t{\n\t\t\tres.subpass_inputs.push_back({ var.self, var.basetype, type.self, get_name(var.self) });\n\t\t}\n\t\t// Outputs\n\t\telse if (var.storage == StorageClassOutput)\n\t\t{\n\t\t\tif (has_decoration(type.self, DecorationBlock))\n\t\t\t{\n\t\t\t\tres.stage_outputs.push_back(\n\t\t\t\t\t\t{ var.self, var.basetype, type.self, get_remapped_declared_block_name(var.self, false) });\n\t\t\t}\n\t\t\telse\n\t\t\t\tres.stage_outputs.push_back({ var.self, var.basetype, type.self, get_name(var.self) });\n\t\t}\n\t\t// UBOs\n\t\telse if (type.storage == StorageClassUniform && has_decoration(type.self, DecorationBlock))\n\t\t{\n\t\t\tres.uniform_buffers.push_back(\n\t\t\t    { var.self, var.basetype, type.self, get_remapped_declared_block_name(var.self, false) });\n\t\t}\n\t\t// Old way to declare SSBOs.\n\t\telse if (type.storage == StorageClassUniform && has_decoration(type.self, DecorationBufferBlock))\n\t\t{\n\t\t\tres.storage_buffers.push_back(\n\t\t\t    { var.self, var.basetype, type.self, get_remapped_declared_block_name(var.self, ssbo_instance_name) });\n\t\t}\n\t\t// Modern way to declare SSBOs.\n\t\telse if (type.storage == StorageClassStorageBuffer)\n\t\t{\n\t\t\tres.storage_buffers.push_back(\n\t\t\t    { var.self, var.basetype, type.self, get_remapped_declared_block_name(var.self, ssbo_instance_name) });\n\t\t}\n\t\t// Push constant blocks\n\t\telse if (type.storage == StorageClassPushConstant)\n\t\t{\n\t\t\t// There can only be one push constant block, but keep the vector in case this restriction is lifted\n\t\t\t// in the future.\n\t\t\tres.push_constant_buffers.push_back({ var.self, var.basetype, type.self, get_name(var.self) });\n\t\t}\n\t\telse if (type.storage == StorageClassShaderRecordBufferKHR)\n\t\t{\n\t\t\tres.shader_record_buffers.push_back({ var.self, var.basetype, type.self, get_remapped_declared_block_name(var.self, ssbo_instance_name) });\n\t\t}\n\t\t// Atomic counters\n\t\telse if (type.storage == StorageClassAtomicCounter)\n\t\t{\n\t\t\tres.atomic_counters.push_back({ var.self, var.basetype, type.self, get_name(var.self) });\n\t\t}\n\t\telse if (type.storage == StorageClassUniformConstant)\n\t\t{\n\t\t\tif (type.basetype == SPIRType::Image)\n\t\t\t{\n\t\t\t\t// Images\n\t\t\t\tif (type.image.sampled == 2)\n\t\t\t\t{\n\t\t\t\t\tres.storage_images.push_back({ var.self, var.basetype, type.self, get_name(var.self) });\n\t\t\t\t}\n\t\t\t\t// Separate images\n\t\t\t\telse if (type.image.sampled == 1)\n\t\t\t\t{\n\t\t\t\t\tres.separate_images.push_back({ var.self, var.basetype, type.self, get_name(var.self) });\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Separate samplers\n\t\t\telse if (type.basetype == SPIRType::Sampler)\n\t\t\t{\n\t\t\t\tres.separate_samplers.push_back({ var.self, var.basetype, type.self, get_name(var.self) });\n\t\t\t}\n\t\t\t// Textures\n\t\t\telse if (type.basetype == SPIRType::SampledImage)\n\t\t\t{\n\t\t\t\tres.sampled_images.push_back({ var.self, var.basetype, type.self, get_name(var.self) });\n\t\t\t}\n\t\t\t// Acceleration structures\n\t\t\telse if (type.basetype == SPIRType::AccelerationStructure)\n\t\t\t{\n\t\t\t\tres.acceleration_structures.push_back({ var.self, var.basetype, type.self, get_name(var.self) });\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tres.gl_plain_uniforms.push_back({ var.self, var.basetype, type.self, get_name(var.self) });\n\t\t\t}\n\t\t}\n\t});\n\n\treturn res;\n}\n\nbool Compiler::type_is_top_level_block(const SPIRType &type) const\n{\n\tif (type.basetype != SPIRType::Struct)\n\t\treturn false;\n\treturn has_decoration(type.self, DecorationBlock) || has_decoration(type.self, DecorationBufferBlock);\n}\n\nbool Compiler::type_is_block_like(const SPIRType &type) const\n{\n\tif (type_is_top_level_block(type))\n\t\treturn true;\n\n\tif (type.basetype == SPIRType::Struct)\n\t{\n\t\t// Block-like types may have Offset decorations.\n\t\tfor (uint32_t i = 0; i < uint32_t(type.member_types.size()); i++)\n\t\t\tif (has_member_decoration(type.self, i, DecorationOffset))\n\t\t\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nvoid Compiler::parse_fixup()\n{\n\t// Figure out specialization constants for work group sizes.\n\tfor (auto id_ : ir.ids_for_constant_or_variable)\n\t{\n\t\tauto &id = ir.ids[id_];\n\n\t\tif (id.get_type() == TypeConstant)\n\t\t{\n\t\t\tauto &c = id.get<SPIRConstant>();\n\t\t\tif (has_decoration(c.self, DecorationBuiltIn) &&\n\t\t\t    BuiltIn(get_decoration(c.self, DecorationBuiltIn)) == BuiltInWorkgroupSize)\n\t\t\t{\n\t\t\t\t// In current SPIR-V, there can be just one constant like this.\n\t\t\t\t// All entry points will receive the constant value.\n\t\t\t\t// WorkgroupSize take precedence over LocalSizeId.\n\t\t\t\tfor (auto &entry : ir.entry_points)\n\t\t\t\t{\n\t\t\t\t\tentry.second.workgroup_size.constant = c.self;\n\t\t\t\t\tentry.second.workgroup_size.x = c.scalar(0, 0);\n\t\t\t\t\tentry.second.workgroup_size.y = c.scalar(0, 1);\n\t\t\t\t\tentry.second.workgroup_size.z = c.scalar(0, 2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (id.get_type() == TypeVariable)\n\t\t{\n\t\t\tauto &var = id.get<SPIRVariable>();\n\t\t\tif (var.storage == StorageClassPrivate || var.storage == StorageClassWorkgroup ||\n\t\t\t    var.storage == StorageClassTaskPayloadWorkgroupEXT ||\n\t\t\t    var.storage == StorageClassOutput)\n\t\t\t{\n\t\t\t\tglobal_variables.push_back(var.self);\n\t\t\t}\n\t\t\tif (variable_storage_is_aliased(var))\n\t\t\t\taliased_variables.push_back(var.self);\n\t\t}\n\t}\n}\n\nvoid Compiler::update_name_cache(unordered_set<string> &cache_primary, const unordered_set<string> &cache_secondary,\n                                 string &name)\n{\n\tif (name.empty())\n\t\treturn;\n\n\tconst auto find_name = [&](const string &n) -> bool {\n\t\tif (cache_primary.find(n) != end(cache_primary))\n\t\t\treturn true;\n\n\t\tif (&cache_primary != &cache_secondary)\n\t\t\tif (cache_secondary.find(n) != end(cache_secondary))\n\t\t\t\treturn true;\n\n\t\treturn false;\n\t};\n\n\tconst auto insert_name = [&](const string &n) { cache_primary.insert(n); };\n\n\tif (!find_name(name))\n\t{\n\t\tinsert_name(name);\n\t\treturn;\n\t}\n\n\tuint32_t counter = 0;\n\tauto tmpname = name;\n\n\tbool use_linked_underscore = true;\n\n\tif (tmpname == \"_\")\n\t{\n\t\t// We cannot just append numbers, as we will end up creating internally reserved names.\n\t\t// Make it like _0_<counter> instead.\n\t\ttmpname += \"0\";\n\t}\n\telse if (tmpname.back() == '_')\n\t{\n\t\t// The last_character is an underscore, so we don't need to link in underscore.\n\t\t// This would violate double underscore rules.\n\t\tuse_linked_underscore = false;\n\t}\n\n\t// If there is a collision (very rare),\n\t// keep tacking on extra identifier until it's unique.\n\tdo\n\t{\n\t\tcounter++;\n\t\tname = tmpname + (use_linked_underscore ? \"_\" : \"\") + convert_to_string(counter);\n\t} while (find_name(name));\n\tinsert_name(name);\n}\n\nvoid Compiler::update_name_cache(unordered_set<string> &cache, string &name)\n{\n\tupdate_name_cache(cache, cache, name);\n}\n\nvoid Compiler::set_name(ID id, const std::string &name)\n{\n\tir.set_name(id, name);\n}\n\nconst SPIRType &Compiler::get_type(TypeID id) const\n{\n\treturn get<SPIRType>(id);\n}\n\nconst SPIRType &Compiler::get_type_from_variable(VariableID id) const\n{\n\treturn get<SPIRType>(get<SPIRVariable>(id).basetype);\n}\n\nuint32_t Compiler::get_pointee_type_id(uint32_t type_id) const\n{\n\tauto *p_type = &get<SPIRType>(type_id);\n\tif (p_type->pointer)\n\t{\n\t\tassert(p_type->parent_type);\n\t\ttype_id = p_type->parent_type;\n\t}\n\treturn type_id;\n}\n\nconst SPIRType &Compiler::get_pointee_type(const SPIRType &type) const\n{\n\tauto *p_type = &type;\n\tif (p_type->pointer)\n\t{\n\t\tassert(p_type->parent_type);\n\t\tp_type = &get<SPIRType>(p_type->parent_type);\n\t}\n\treturn *p_type;\n}\n\nconst SPIRType &Compiler::get_pointee_type(uint32_t type_id) const\n{\n\treturn get_pointee_type(get<SPIRType>(type_id));\n}\n\nuint32_t Compiler::get_variable_data_type_id(const SPIRVariable &var) const\n{\n\tif (var.phi_variable)\n\t\treturn var.basetype;\n\treturn get_pointee_type_id(var.basetype);\n}\n\nSPIRType &Compiler::get_variable_data_type(const SPIRVariable &var)\n{\n\treturn get<SPIRType>(get_variable_data_type_id(var));\n}\n\nconst SPIRType &Compiler::get_variable_data_type(const SPIRVariable &var) const\n{\n\treturn get<SPIRType>(get_variable_data_type_id(var));\n}\n\nSPIRType &Compiler::get_variable_element_type(const SPIRVariable &var)\n{\n\tSPIRType *type = &get_variable_data_type(var);\n\tif (is_array(*type))\n\t\ttype = &get<SPIRType>(type->parent_type);\n\treturn *type;\n}\n\nconst SPIRType &Compiler::get_variable_element_type(const SPIRVariable &var) const\n{\n\tconst SPIRType *type = &get_variable_data_type(var);\n\tif (is_array(*type))\n\t\ttype = &get<SPIRType>(type->parent_type);\n\treturn *type;\n}\n\nbool Compiler::is_sampled_image_type(const SPIRType &type)\n{\n\treturn (type.basetype == SPIRType::Image || type.basetype == SPIRType::SampledImage) && type.image.sampled == 1 &&\n\t       type.image.dim != DimBuffer;\n}\n\nvoid Compiler::set_member_decoration_string(TypeID id, uint32_t index, spv::Decoration decoration,\n                                            const std::string &argument)\n{\n\tir.set_member_decoration_string(id, index, decoration, argument);\n}\n\nvoid Compiler::set_member_decoration(TypeID id, uint32_t index, Decoration decoration, uint32_t argument)\n{\n\tir.set_member_decoration(id, index, decoration, argument);\n}\n\nvoid Compiler::set_member_name(TypeID id, uint32_t index, const std::string &name)\n{\n\tir.set_member_name(id, index, name);\n}\n\nconst std::string &Compiler::get_member_name(TypeID id, uint32_t index) const\n{\n\treturn ir.get_member_name(id, index);\n}\n\nvoid Compiler::set_qualified_name(uint32_t id, const string &name)\n{\n\tir.meta[id].decoration.qualified_alias = name;\n}\n\nvoid Compiler::set_member_qualified_name(uint32_t type_id, uint32_t index, const std::string &name)\n{\n\tir.meta[type_id].members.resize(max(ir.meta[type_id].members.size(), size_t(index) + 1));\n\tir.meta[type_id].members[index].qualified_alias = name;\n}\n\nconst string &Compiler::get_member_qualified_name(TypeID type_id, uint32_t index) const\n{\n\tauto *m = ir.find_meta(type_id);\n\tif (m && index < m->members.size())\n\t\treturn m->members[index].qualified_alias;\n\telse\n\t\treturn ir.get_empty_string();\n}\n\nuint32_t Compiler::get_member_decoration(TypeID id, uint32_t index, Decoration decoration) const\n{\n\treturn ir.get_member_decoration(id, index, decoration);\n}\n\nconst Bitset &Compiler::get_member_decoration_bitset(TypeID id, uint32_t index) const\n{\n\treturn ir.get_member_decoration_bitset(id, index);\n}\n\nbool Compiler::has_member_decoration(TypeID id, uint32_t index, Decoration decoration) const\n{\n\treturn ir.has_member_decoration(id, index, decoration);\n}\n\nvoid Compiler::unset_member_decoration(TypeID id, uint32_t index, Decoration decoration)\n{\n\tir.unset_member_decoration(id, index, decoration);\n}\n\nvoid Compiler::set_decoration_string(ID id, spv::Decoration decoration, const std::string &argument)\n{\n\tir.set_decoration_string(id, decoration, argument);\n}\n\nvoid Compiler::set_decoration(ID id, Decoration decoration, uint32_t argument)\n{\n\tir.set_decoration(id, decoration, argument);\n}\n\nvoid Compiler::set_extended_decoration(uint32_t id, ExtendedDecorations decoration, uint32_t value)\n{\n\tauto &dec = ir.meta[id].decoration;\n\tdec.extended.flags.set(decoration);\n\tdec.extended.values[decoration] = value;\n}\n\nvoid Compiler::set_extended_member_decoration(uint32_t type, uint32_t index, ExtendedDecorations decoration,\n                                              uint32_t value)\n{\n\tir.meta[type].members.resize(max(ir.meta[type].members.size(), size_t(index) + 1));\n\tauto &dec = ir.meta[type].members[index];\n\tdec.extended.flags.set(decoration);\n\tdec.extended.values[decoration] = value;\n}\n\nstatic uint32_t get_default_extended_decoration(ExtendedDecorations decoration)\n{\n\tswitch (decoration)\n\t{\n\tcase SPIRVCrossDecorationResourceIndexPrimary:\n\tcase SPIRVCrossDecorationResourceIndexSecondary:\n\tcase SPIRVCrossDecorationResourceIndexTertiary:\n\tcase SPIRVCrossDecorationResourceIndexQuaternary:\n\tcase SPIRVCrossDecorationInterfaceMemberIndex:\n\t\treturn ~(0u);\n\n\tdefault:\n\t\treturn 0;\n\t}\n}\n\nuint32_t Compiler::get_extended_decoration(uint32_t id, ExtendedDecorations decoration) const\n{\n\tauto *m = ir.find_meta(id);\n\tif (!m)\n\t\treturn 0;\n\n\tauto &dec = m->decoration;\n\n\tif (!dec.extended.flags.get(decoration))\n\t\treturn get_default_extended_decoration(decoration);\n\n\treturn dec.extended.values[decoration];\n}\n\nuint32_t Compiler::get_extended_member_decoration(uint32_t type, uint32_t index, ExtendedDecorations decoration) const\n{\n\tauto *m = ir.find_meta(type);\n\tif (!m)\n\t\treturn 0;\n\n\tif (index >= m->members.size())\n\t\treturn 0;\n\n\tauto &dec = m->members[index];\n\tif (!dec.extended.flags.get(decoration))\n\t\treturn get_default_extended_decoration(decoration);\n\treturn dec.extended.values[decoration];\n}\n\nbool Compiler::has_extended_decoration(uint32_t id, ExtendedDecorations decoration) const\n{\n\tauto *m = ir.find_meta(id);\n\tif (!m)\n\t\treturn false;\n\n\tauto &dec = m->decoration;\n\treturn dec.extended.flags.get(decoration);\n}\n\nbool Compiler::has_extended_member_decoration(uint32_t type, uint32_t index, ExtendedDecorations decoration) const\n{\n\tauto *m = ir.find_meta(type);\n\tif (!m)\n\t\treturn false;\n\n\tif (index >= m->members.size())\n\t\treturn false;\n\n\tauto &dec = m->members[index];\n\treturn dec.extended.flags.get(decoration);\n}\n\nvoid Compiler::unset_extended_decoration(uint32_t id, ExtendedDecorations decoration)\n{\n\tauto &dec = ir.meta[id].decoration;\n\tdec.extended.flags.clear(decoration);\n\tdec.extended.values[decoration] = 0;\n}\n\nvoid Compiler::unset_extended_member_decoration(uint32_t type, uint32_t index, ExtendedDecorations decoration)\n{\n\tir.meta[type].members.resize(max(ir.meta[type].members.size(), size_t(index) + 1));\n\tauto &dec = ir.meta[type].members[index];\n\tdec.extended.flags.clear(decoration);\n\tdec.extended.values[decoration] = 0;\n}\n\nStorageClass Compiler::get_storage_class(VariableID id) const\n{\n\treturn get<SPIRVariable>(id).storage;\n}\n\nconst std::string &Compiler::get_name(ID id) const\n{\n\treturn ir.get_name(id);\n}\n\nconst std::string Compiler::get_fallback_name(ID id) const\n{\n\treturn join(\"_\", id);\n}\n\nconst std::string Compiler::get_block_fallback_name(VariableID id) const\n{\n\tauto &var = get<SPIRVariable>(id);\n\tif (get_name(id).empty())\n\t\treturn join(\"_\", get<SPIRType>(var.basetype).self, \"_\", id);\n\telse\n\t\treturn get_name(id);\n}\n\nconst Bitset &Compiler::get_decoration_bitset(ID id) const\n{\n\treturn ir.get_decoration_bitset(id);\n}\n\nbool Compiler::has_decoration(ID id, Decoration decoration) const\n{\n\treturn ir.has_decoration(id, decoration);\n}\n\nconst string &Compiler::get_decoration_string(ID id, Decoration decoration) const\n{\n\treturn ir.get_decoration_string(id, decoration);\n}\n\nconst string &Compiler::get_member_decoration_string(TypeID id, uint32_t index, Decoration decoration) const\n{\n\treturn ir.get_member_decoration_string(id, index, decoration);\n}\n\nuint32_t Compiler::get_decoration(ID id, Decoration decoration) const\n{\n\treturn ir.get_decoration(id, decoration);\n}\n\nvoid Compiler::unset_decoration(ID id, Decoration decoration)\n{\n\tir.unset_decoration(id, decoration);\n}\n\nbool Compiler::get_binary_offset_for_decoration(VariableID id, spv::Decoration decoration, uint32_t &word_offset) const\n{\n\tauto *m = ir.find_meta(id);\n\tif (!m)\n\t\treturn false;\n\n\tauto &word_offsets = m->decoration_word_offset;\n\tauto itr = word_offsets.find(decoration);\n\tif (itr == end(word_offsets))\n\t\treturn false;\n\n\tword_offset = itr->second;\n\treturn true;\n}\n\nbool Compiler::block_is_noop(const SPIRBlock &block) const\n{\n\tif (block.terminator != SPIRBlock::Direct)\n\t\treturn false;\n\n\tauto &child = get<SPIRBlock>(block.next_block);\n\n\t// If this block participates in PHI, the block isn't really noop.\n\tfor (auto &phi : block.phi_variables)\n\t\tif (phi.parent == block.self || phi.parent == child.self)\n\t\t\treturn false;\n\n\tfor (auto &phi : child.phi_variables)\n\t\tif (phi.parent == block.self)\n\t\t\treturn false;\n\n\t// Verify all instructions have no semantic impact.\n\tfor (auto &i : block.ops)\n\t{\n\t\tauto op = static_cast<Op>(i.op);\n\n\t\tswitch (op)\n\t\t{\n\t\t// Non-Semantic instructions.\n\t\tcase OpLine:\n\t\tcase OpNoLine:\n\t\t\tbreak;\n\n\t\tcase OpExtInst:\n\t\t{\n\t\t\tauto *ops = stream(i);\n\t\t\tauto ext = get<SPIRExtension>(ops[2]).ext;\n\n\t\t\tbool ext_is_nonsemantic_only =\n\t\t\t\text == SPIRExtension::NonSemanticShaderDebugInfo ||\n\t\t\t\text == SPIRExtension::SPV_debug_info ||\n\t\t\t\text == SPIRExtension::NonSemanticGeneric;\n\n\t\t\tif (!ext_is_nonsemantic_only)\n\t\t\t\treturn false;\n\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nbool Compiler::block_is_loop_candidate(const SPIRBlock &block, SPIRBlock::Method method) const\n{\n\t// Tried and failed.\n\tif (block.disable_block_optimization || block.complex_continue)\n\t\treturn false;\n\n\tif (method == SPIRBlock::MergeToSelectForLoop || method == SPIRBlock::MergeToSelectContinueForLoop)\n\t{\n\t\t// Try to detect common for loop pattern\n\t\t// which the code backend can use to create cleaner code.\n\t\t// for(;;) { if (cond) { some_body; } else { break; } }\n\t\t// is the pattern we're looking for.\n\t\tconst auto *false_block = maybe_get<SPIRBlock>(block.false_block);\n\t\tconst auto *true_block = maybe_get<SPIRBlock>(block.true_block);\n\t\tconst auto *merge_block = maybe_get<SPIRBlock>(block.merge_block);\n\n\t\tbool false_block_is_merge = block.false_block == block.merge_block ||\n\t\t                            (false_block && merge_block && execution_is_noop(*false_block, *merge_block));\n\n\t\tbool true_block_is_merge = block.true_block == block.merge_block ||\n\t\t                           (true_block && merge_block && execution_is_noop(*true_block, *merge_block));\n\n\t\tbool positive_candidate =\n\t\t    block.true_block != block.merge_block && block.true_block != block.self && false_block_is_merge;\n\n\t\tbool negative_candidate =\n\t\t    block.false_block != block.merge_block && block.false_block != block.self && true_block_is_merge;\n\n\t\tbool ret = block.terminator == SPIRBlock::Select && block.merge == SPIRBlock::MergeLoop &&\n\t\t           (positive_candidate || negative_candidate);\n\n\t\tif (ret && positive_candidate && method == SPIRBlock::MergeToSelectContinueForLoop)\n\t\t\tret = block.true_block == block.continue_block;\n\t\telse if (ret && negative_candidate && method == SPIRBlock::MergeToSelectContinueForLoop)\n\t\t\tret = block.false_block == block.continue_block;\n\n\t\t// If we have OpPhi which depends on branches which came from our own block,\n\t\t// we need to flush phi variables in else block instead of a trivial break,\n\t\t// so we cannot assume this is a for loop candidate.\n\t\tif (ret)\n\t\t{\n\t\t\tfor (auto &phi : block.phi_variables)\n\t\t\t\tif (phi.parent == block.self)\n\t\t\t\t\treturn false;\n\n\t\t\tauto *merge = maybe_get<SPIRBlock>(block.merge_block);\n\t\t\tif (merge)\n\t\t\t\tfor (auto &phi : merge->phi_variables)\n\t\t\t\t\tif (phi.parent == block.self)\n\t\t\t\t\t\treturn false;\n\t\t}\n\t\treturn ret;\n\t}\n\telse if (method == SPIRBlock::MergeToDirectForLoop)\n\t{\n\t\t// Empty loop header that just sets up merge target\n\t\t// and branches to loop body.\n\t\tbool ret = block.terminator == SPIRBlock::Direct && block.merge == SPIRBlock::MergeLoop && block_is_noop(block);\n\n\t\tif (!ret)\n\t\t\treturn false;\n\n\t\tauto &child = get<SPIRBlock>(block.next_block);\n\n\t\tconst auto *false_block = maybe_get<SPIRBlock>(child.false_block);\n\t\tconst auto *true_block = maybe_get<SPIRBlock>(child.true_block);\n\t\tconst auto *merge_block = maybe_get<SPIRBlock>(block.merge_block);\n\n\t\tbool false_block_is_merge = child.false_block == block.merge_block ||\n\t\t                            (false_block && merge_block && execution_is_noop(*false_block, *merge_block));\n\n\t\tbool true_block_is_merge = child.true_block == block.merge_block ||\n\t\t                           (true_block && merge_block && execution_is_noop(*true_block, *merge_block));\n\n\t\tbool positive_candidate =\n\t\t    child.true_block != block.merge_block && child.true_block != block.self && false_block_is_merge;\n\n\t\tbool negative_candidate =\n\t\t    child.false_block != block.merge_block && child.false_block != block.self && true_block_is_merge;\n\n\t\tret = child.terminator == SPIRBlock::Select && child.merge == SPIRBlock::MergeNone &&\n\t\t      (positive_candidate || negative_candidate);\n\n\t\tif (ret)\n\t\t{\n\t\t\tauto *merge = maybe_get<SPIRBlock>(block.merge_block);\n\t\t\tif (merge)\n\t\t\t\tfor (auto &phi : merge->phi_variables)\n\t\t\t\t\tif (phi.parent == block.self || phi.parent == child.false_block)\n\t\t\t\t\t\treturn false;\n\t\t}\n\n\t\treturn ret;\n\t}\n\telse\n\t\treturn false;\n}\n\nbool Compiler::execution_is_noop(const SPIRBlock &from, const SPIRBlock &to) const\n{\n\tif (!execution_is_branchless(from, to))\n\t\treturn false;\n\n\tauto *start = &from;\n\tfor (;;)\n\t{\n\t\tif (start->self == to.self)\n\t\t\treturn true;\n\n\t\tif (!block_is_noop(*start))\n\t\t\treturn false;\n\n\t\tauto &next = get<SPIRBlock>(start->next_block);\n\t\tstart = &next;\n\t}\n}\n\nbool Compiler::execution_is_branchless(const SPIRBlock &from, const SPIRBlock &to) const\n{\n\tauto *start = &from;\n\tfor (;;)\n\t{\n\t\tif (start->self == to.self)\n\t\t\treturn true;\n\n\t\tif (start->terminator == SPIRBlock::Direct && start->merge == SPIRBlock::MergeNone)\n\t\t\tstart = &get<SPIRBlock>(start->next_block);\n\t\telse\n\t\t\treturn false;\n\t}\n}\n\nbool Compiler::execution_is_direct_branch(const SPIRBlock &from, const SPIRBlock &to) const\n{\n\treturn from.terminator == SPIRBlock::Direct && from.merge == SPIRBlock::MergeNone && from.next_block == to.self;\n}\n\nSPIRBlock::ContinueBlockType Compiler::continue_block_type(const SPIRBlock &block) const\n{\n\t// The block was deemed too complex during code emit, pick conservative fallback paths.\n\tif (block.complex_continue)\n\t\treturn SPIRBlock::ComplexLoop;\n\n\t// In older glslang output continue block can be equal to the loop header.\n\t// In this case, execution is clearly branchless, so just assume a while loop header here.\n\tif (block.merge == SPIRBlock::MergeLoop)\n\t\treturn SPIRBlock::WhileLoop;\n\n\tif (block.loop_dominator == BlockID(SPIRBlock::NoDominator))\n\t{\n\t\t// Continue block is never reached from CFG.\n\t\treturn SPIRBlock::ComplexLoop;\n\t}\n\n\tauto &dominator = get<SPIRBlock>(block.loop_dominator);\n\n\tif (execution_is_noop(block, dominator))\n\t\treturn SPIRBlock::WhileLoop;\n\telse if (execution_is_branchless(block, dominator))\n\t\treturn SPIRBlock::ForLoop;\n\telse\n\t{\n\t\tconst auto *false_block = maybe_get<SPIRBlock>(block.false_block);\n\t\tconst auto *true_block = maybe_get<SPIRBlock>(block.true_block);\n\t\tconst auto *merge_block = maybe_get<SPIRBlock>(dominator.merge_block);\n\n\t\t// If we need to flush Phi in this block, we cannot have a DoWhile loop.\n\t\tbool flush_phi_to_false = false_block && flush_phi_required(block.self, block.false_block);\n\t\tbool flush_phi_to_true = true_block && flush_phi_required(block.self, block.true_block);\n\t\tif (flush_phi_to_false || flush_phi_to_true)\n\t\t\treturn SPIRBlock::ComplexLoop;\n\n\t\tbool positive_do_while = block.true_block == dominator.self &&\n\t\t                         (block.false_block == dominator.merge_block ||\n\t\t                          (false_block && merge_block && execution_is_noop(*false_block, *merge_block)));\n\n\t\tbool negative_do_while = block.false_block == dominator.self &&\n\t\t                         (block.true_block == dominator.merge_block ||\n\t\t                          (true_block && merge_block && execution_is_noop(*true_block, *merge_block)));\n\n\t\tif (block.merge == SPIRBlock::MergeNone && block.terminator == SPIRBlock::Select &&\n\t\t    (positive_do_while || negative_do_while))\n\t\t{\n\t\t\treturn SPIRBlock::DoWhileLoop;\n\t\t}\n\t\telse\n\t\t\treturn SPIRBlock::ComplexLoop;\n\t}\n}\n\nconst SmallVector<SPIRBlock::Case> &Compiler::get_case_list(const SPIRBlock &block) const\n{\n\tuint32_t width = 0;\n\n\t// First we check if we can get the type directly from the block.condition\n\t// since it can be a SPIRConstant or a SPIRVariable.\n\tif (const auto *constant = maybe_get<SPIRConstant>(block.condition))\n\t{\n\t\tconst auto &type = get<SPIRType>(constant->constant_type);\n\t\twidth = type.width;\n\t}\n\telse if (const auto *var = maybe_get<SPIRVariable>(block.condition))\n\t{\n\t\tconst auto &type = get<SPIRType>(var->basetype);\n\t\twidth = type.width;\n\t}\n\telse if (const auto *undef = maybe_get<SPIRUndef>(block.condition))\n\t{\n\t\tconst auto &type = get<SPIRType>(undef->basetype);\n\t\twidth = type.width;\n\t}\n\telse\n\t{\n\t\tauto search = ir.load_type_width.find(block.condition);\n\t\tif (search == ir.load_type_width.end())\n\t\t{\n\t\t\tSPIRV_CROSS_THROW(\"Use of undeclared variable on a switch statement.\");\n\t\t}\n\n\t\twidth = search->second;\n\t}\n\n\tif (width > 32)\n\t\treturn block.cases_64bit;\n\n\treturn block.cases_32bit;\n}\n\nbool Compiler::traverse_all_reachable_opcodes(const SPIRBlock &block, OpcodeHandler &handler) const\n{\n\thandler.set_current_block(block);\n\thandler.rearm_current_block(block);\n\n\t// Ideally, perhaps traverse the CFG instead of all blocks in order to eliminate dead blocks,\n\t// but this shouldn't be a problem in practice unless the SPIR-V is doing insane things like recursing\n\t// inside dead blocks ...\n\tfor (auto &i : block.ops)\n\t{\n\t\tauto ops = stream(i);\n\t\tauto op = static_cast<Op>(i.op);\n\n\t\tif (!handler.handle(op, ops, i.length))\n\t\t\treturn false;\n\n\t\tif (op == OpFunctionCall)\n\t\t{\n\t\t\tauto &func = get<SPIRFunction>(ops[2]);\n\t\t\tif (handler.follow_function_call(func))\n\t\t\t{\n\t\t\t\tif (!handler.begin_function_scope(ops, i.length))\n\t\t\t\t\treturn false;\n\t\t\t\tif (!traverse_all_reachable_opcodes(get<SPIRFunction>(ops[2]), handler))\n\t\t\t\t\treturn false;\n\t\t\t\tif (!handler.end_function_scope(ops, i.length))\n\t\t\t\t\treturn false;\n\n\t\t\t\thandler.rearm_current_block(block);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!handler.handle_terminator(block))\n\t\treturn false;\n\n\treturn true;\n}\n\nbool Compiler::traverse_all_reachable_opcodes(const SPIRFunction &func, OpcodeHandler &handler) const\n{\n\tfor (auto block : func.blocks)\n\t\tif (!traverse_all_reachable_opcodes(get<SPIRBlock>(block), handler))\n\t\t\treturn false;\n\n\treturn true;\n}\n\nuint32_t Compiler::type_struct_member_offset(const SPIRType &type, uint32_t index) const\n{\n\tauto *type_meta = ir.find_meta(type.self);\n\tif (type_meta)\n\t{\n\t\t// Decoration must be set in valid SPIR-V, otherwise throw.\n\t\tauto &dec = type_meta->members[index];\n\t\tif (dec.decoration_flags.get(DecorationOffset))\n\t\t\treturn dec.offset;\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"Struct member does not have Offset set.\");\n\t}\n\telse\n\t\tSPIRV_CROSS_THROW(\"Struct member does not have Offset set.\");\n}\n\nuint32_t Compiler::type_struct_member_array_stride(const SPIRType &type, uint32_t index) const\n{\n\tauto *type_meta = ir.find_meta(type.member_types[index]);\n\tif (type_meta)\n\t{\n\t\t// Decoration must be set in valid SPIR-V, otherwise throw.\n\t\t// ArrayStride is part of the array type not OpMemberDecorate.\n\t\tauto &dec = type_meta->decoration;\n\t\tif (dec.decoration_flags.get(DecorationArrayStride))\n\t\t\treturn dec.array_stride;\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"Struct member does not have ArrayStride set.\");\n\t}\n\telse\n\t\tSPIRV_CROSS_THROW(\"Struct member does not have ArrayStride set.\");\n}\n\nuint32_t Compiler::type_struct_member_matrix_stride(const SPIRType &type, uint32_t index) const\n{\n\tauto *type_meta = ir.find_meta(type.self);\n\tif (type_meta)\n\t{\n\t\t// Decoration must be set in valid SPIR-V, otherwise throw.\n\t\t// MatrixStride is part of OpMemberDecorate.\n\t\tauto &dec = type_meta->members[index];\n\t\tif (dec.decoration_flags.get(DecorationMatrixStride))\n\t\t\treturn dec.matrix_stride;\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"Struct member does not have MatrixStride set.\");\n\t}\n\telse\n\t\tSPIRV_CROSS_THROW(\"Struct member does not have MatrixStride set.\");\n}\n\nsize_t Compiler::get_declared_struct_size(const SPIRType &type) const\n{\n\tif (type.member_types.empty())\n\t\tSPIRV_CROSS_THROW(\"Declared struct in block cannot be empty.\");\n\n\t// Offsets can be declared out of order, so we need to deduce the actual size\n\t// based on last member instead.\n\tuint32_t member_index = 0;\n\tsize_t highest_offset = 0;\n\tfor (uint32_t i = 0; i < uint32_t(type.member_types.size()); i++)\n\t{\n\t\tsize_t offset = type_struct_member_offset(type, i);\n\t\tif (offset > highest_offset)\n\t\t{\n\t\t\thighest_offset = offset;\n\t\t\tmember_index = i;\n\t\t}\n\t}\n\n\tsize_t size = get_declared_struct_member_size(type, member_index);\n\treturn highest_offset + size;\n}\n\nsize_t Compiler::get_declared_struct_size_runtime_array(const SPIRType &type, size_t array_size) const\n{\n\tif (type.member_types.empty())\n\t\tSPIRV_CROSS_THROW(\"Declared struct in block cannot be empty.\");\n\n\tsize_t size = get_declared_struct_size(type);\n\tauto &last_type = get<SPIRType>(type.member_types.back());\n\tif (!last_type.array.empty() && last_type.array_size_literal[0] && last_type.array[0] == 0) // Runtime array\n\t\tsize += array_size * type_struct_member_array_stride(type, uint32_t(type.member_types.size() - 1));\n\n\treturn size;\n}\n\nuint32_t Compiler::evaluate_spec_constant_u32(const SPIRConstantOp &spec) const\n{\n\tauto &result_type = get<SPIRType>(spec.basetype);\n\tif (result_type.basetype != SPIRType::UInt && result_type.basetype != SPIRType::Int &&\n\t    result_type.basetype != SPIRType::Boolean)\n\t{\n\t\tSPIRV_CROSS_THROW(\n\t\t    \"Only 32-bit integers and booleans are currently supported when evaluating specialization constants.\\n\");\n\t}\n\n\tif (!is_scalar(result_type))\n\t\tSPIRV_CROSS_THROW(\"Spec constant evaluation must be a scalar.\\n\");\n\n\tuint32_t value = 0;\n\n\tconst auto eval_u32 = [&](uint32_t id) -> uint32_t {\n\t\tauto &type = expression_type(id);\n\t\tif (type.basetype != SPIRType::UInt && type.basetype != SPIRType::Int && type.basetype != SPIRType::Boolean)\n\t\t{\n\t\t\tSPIRV_CROSS_THROW(\"Only 32-bit integers and booleans are currently supported when evaluating \"\n\t\t\t                  \"specialization constants.\\n\");\n\t\t}\n\n\t\tif (!is_scalar(type))\n\t\t\tSPIRV_CROSS_THROW(\"Spec constant evaluation must be a scalar.\\n\");\n\t\tif (const auto *c = this->maybe_get<SPIRConstant>(id))\n\t\t\treturn c->scalar();\n\t\telse\n\t\t\treturn evaluate_spec_constant_u32(this->get<SPIRConstantOp>(id));\n\t};\n\n#define binary_spec_op(op, binary_op)                                              \\\n\tcase Op##op:                                                                   \\\n\t\tvalue = eval_u32(spec.arguments[0]) binary_op eval_u32(spec.arguments[1]); \\\n\t\tbreak\n#define binary_spec_op_cast(op, binary_op, type)                                                         \\\n\tcase Op##op:                                                                                         \\\n\t\tvalue = uint32_t(type(eval_u32(spec.arguments[0])) binary_op type(eval_u32(spec.arguments[1]))); \\\n\t\tbreak\n\n\t// Support the basic opcodes which are typically used when computing array sizes.\n\tswitch (spec.opcode)\n\t{\n\t\tbinary_spec_op(IAdd, +);\n\t\tbinary_spec_op(ISub, -);\n\t\tbinary_spec_op(IMul, *);\n\t\tbinary_spec_op(BitwiseAnd, &);\n\t\tbinary_spec_op(BitwiseOr, |);\n\t\tbinary_spec_op(BitwiseXor, ^);\n\t\tbinary_spec_op(LogicalAnd, &);\n\t\tbinary_spec_op(LogicalOr, |);\n\t\tbinary_spec_op(ShiftLeftLogical, <<);\n\t\tbinary_spec_op(ShiftRightLogical, >>);\n\t\tbinary_spec_op_cast(ShiftRightArithmetic, >>, int32_t);\n\t\tbinary_spec_op(LogicalEqual, ==);\n\t\tbinary_spec_op(LogicalNotEqual, !=);\n\t\tbinary_spec_op(IEqual, ==);\n\t\tbinary_spec_op(INotEqual, !=);\n\t\tbinary_spec_op(ULessThan, <);\n\t\tbinary_spec_op(ULessThanEqual, <=);\n\t\tbinary_spec_op(UGreaterThan, >);\n\t\tbinary_spec_op(UGreaterThanEqual, >=);\n\t\tbinary_spec_op_cast(SLessThan, <, int32_t);\n\t\tbinary_spec_op_cast(SLessThanEqual, <=, int32_t);\n\t\tbinary_spec_op_cast(SGreaterThan, >, int32_t);\n\t\tbinary_spec_op_cast(SGreaterThanEqual, >=, int32_t);\n#undef binary_spec_op\n#undef binary_spec_op_cast\n\n\tcase OpLogicalNot:\n\t\tvalue = uint32_t(!eval_u32(spec.arguments[0]));\n\t\tbreak;\n\n\tcase OpNot:\n\t\tvalue = ~eval_u32(spec.arguments[0]);\n\t\tbreak;\n\n\tcase OpSNegate:\n\t\tvalue = uint32_t(-int32_t(eval_u32(spec.arguments[0])));\n\t\tbreak;\n\n\tcase OpSelect:\n\t\tvalue = eval_u32(spec.arguments[0]) ? eval_u32(spec.arguments[1]) : eval_u32(spec.arguments[2]);\n\t\tbreak;\n\n\tcase OpUMod:\n\t{\n\t\tuint32_t a = eval_u32(spec.arguments[0]);\n\t\tuint32_t b = eval_u32(spec.arguments[1]);\n\t\tif (b == 0)\n\t\t\tSPIRV_CROSS_THROW(\"Undefined behavior in UMod, b == 0.\\n\");\n\t\tvalue = a % b;\n\t\tbreak;\n\t}\n\n\tcase OpSRem:\n\t{\n\t\tauto a = int32_t(eval_u32(spec.arguments[0]));\n\t\tauto b = int32_t(eval_u32(spec.arguments[1]));\n\t\tif (b == 0)\n\t\t\tSPIRV_CROSS_THROW(\"Undefined behavior in SRem, b == 0.\\n\");\n\t\tvalue = a % b;\n\t\tbreak;\n\t}\n\n\tcase OpSMod:\n\t{\n\t\tauto a = int32_t(eval_u32(spec.arguments[0]));\n\t\tauto b = int32_t(eval_u32(spec.arguments[1]));\n\t\tif (b == 0)\n\t\t\tSPIRV_CROSS_THROW(\"Undefined behavior in SMod, b == 0.\\n\");\n\t\tauto v = a % b;\n\n\t\t// Makes sure we match the sign of b, not a.\n\t\tif ((b < 0 && v > 0) || (b > 0 && v < 0))\n\t\t\tv += b;\n\t\tvalue = v;\n\t\tbreak;\n\t}\n\n\tcase OpUDiv:\n\t{\n\t\tuint32_t a = eval_u32(spec.arguments[0]);\n\t\tuint32_t b = eval_u32(spec.arguments[1]);\n\t\tif (b == 0)\n\t\t\tSPIRV_CROSS_THROW(\"Undefined behavior in UDiv, b == 0.\\n\");\n\t\tvalue = a / b;\n\t\tbreak;\n\t}\n\n\tcase OpSDiv:\n\t{\n\t\tauto a = int32_t(eval_u32(spec.arguments[0]));\n\t\tauto b = int32_t(eval_u32(spec.arguments[1]));\n\t\tif (b == 0)\n\t\t\tSPIRV_CROSS_THROW(\"Undefined behavior in SDiv, b == 0.\\n\");\n\t\tvalue = a / b;\n\t\tbreak;\n\t}\n\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Unsupported spec constant opcode for evaluation.\\n\");\n\t}\n\n\treturn value;\n}\n\nuint32_t Compiler::evaluate_constant_u32(uint32_t id) const\n{\n\tif (const auto *c = maybe_get<SPIRConstant>(id))\n\t\treturn c->scalar();\n\telse\n\t\treturn evaluate_spec_constant_u32(get<SPIRConstantOp>(id));\n}\n\nsize_t Compiler::get_declared_struct_member_size(const SPIRType &struct_type, uint32_t index) const\n{\n\tif (struct_type.member_types.empty())\n\t\tSPIRV_CROSS_THROW(\"Declared struct in block cannot be empty.\");\n\n\tauto &flags = get_member_decoration_bitset(struct_type.self, index);\n\tauto &type = get<SPIRType>(struct_type.member_types[index]);\n\n\tswitch (type.basetype)\n\t{\n\tcase SPIRType::Unknown:\n\tcase SPIRType::Void:\n\tcase SPIRType::Boolean: // Bools are purely logical, and cannot be used for externally visible types.\n\tcase SPIRType::AtomicCounter:\n\tcase SPIRType::Image:\n\tcase SPIRType::SampledImage:\n\tcase SPIRType::Sampler:\n\t\tSPIRV_CROSS_THROW(\"Querying size for object with opaque size.\");\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\tif (type.pointer && type.storage == StorageClassPhysicalStorageBuffer)\n\t{\n\t\t// Check if this is a top-level pointer type, and not an array of pointers.\n\t\tif (type.pointer_depth > get<SPIRType>(type.parent_type).pointer_depth)\n\t\t\treturn 8;\n\t}\n\n\tif (!type.array.empty())\n\t{\n\t\t// For arrays, we can use ArrayStride to get an easy check.\n\t\tbool array_size_literal = type.array_size_literal.back();\n\t\tuint32_t array_size = array_size_literal ? type.array.back() : evaluate_constant_u32(type.array.back());\n\t\treturn type_struct_member_array_stride(struct_type, index) * array_size;\n\t}\n\telse if (type.basetype == SPIRType::Struct)\n\t{\n\t\treturn get_declared_struct_size(type);\n\t}\n\telse\n\t{\n\t\tunsigned vecsize = type.vecsize;\n\t\tunsigned columns = type.columns;\n\n\t\t// Vectors.\n\t\tif (columns == 1)\n\t\t{\n\t\t\tsize_t component_size = type.width / 8;\n\t\t\treturn vecsize * component_size;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tuint32_t matrix_stride = type_struct_member_matrix_stride(struct_type, index);\n\n\t\t\t// Per SPIR-V spec, matrices must be tightly packed and aligned up for vec3 accesses.\n\t\t\tif (flags.get(DecorationRowMajor))\n\t\t\t\treturn matrix_stride * vecsize;\n\t\t\telse if (flags.get(DecorationColMajor))\n\t\t\t\treturn matrix_stride * columns;\n\t\t\telse\n\t\t\t\tSPIRV_CROSS_THROW(\"Either row-major or column-major must be declared for matrices.\");\n\t\t}\n\t}\n}\n\nbool Compiler::BufferAccessHandler::handle(Op opcode, const uint32_t *args, uint32_t length)\n{\n\tif (opcode != OpAccessChain && opcode != OpInBoundsAccessChain && opcode != OpPtrAccessChain)\n\t\treturn true;\n\n\tbool ptr_chain = (opcode == OpPtrAccessChain);\n\n\t// Invalid SPIR-V.\n\tif (length < (ptr_chain ? 5u : 4u))\n\t\treturn false;\n\n\tif (args[2] != id)\n\t\treturn true;\n\n\t// Don't bother traversing the entire access chain tree yet.\n\t// If we access a struct member, assume we access the entire member.\n\tuint32_t index = compiler.get<SPIRConstant>(args[ptr_chain ? 4 : 3]).scalar();\n\n\t// Seen this index already.\n\tif (seen.find(index) != end(seen))\n\t\treturn true;\n\tseen.insert(index);\n\n\tauto &type = compiler.expression_type(id);\n\tuint32_t offset = compiler.type_struct_member_offset(type, index);\n\n\tsize_t range;\n\t// If we have another member in the struct, deduce the range by looking at the next member.\n\t// This is okay since structs in SPIR-V can have padding, but Offset decoration must be\n\t// monotonically increasing.\n\t// Of course, this doesn't take into account if the SPIR-V for some reason decided to add\n\t// very large amounts of padding, but that's not really a big deal.\n\tif (index + 1 < type.member_types.size())\n\t{\n\t\trange = compiler.type_struct_member_offset(type, index + 1) - offset;\n\t}\n\telse\n\t{\n\t\t// No padding, so just deduce it from the size of the member directly.\n\t\trange = compiler.get_declared_struct_member_size(type, index);\n\t}\n\n\tranges.push_back({ index, offset, range });\n\treturn true;\n}\n\nSmallVector<BufferRange> Compiler::get_active_buffer_ranges(VariableID id) const\n{\n\tSmallVector<BufferRange> ranges;\n\tBufferAccessHandler handler(*this, ranges, id);\n\ttraverse_all_reachable_opcodes(get<SPIRFunction>(ir.default_entry_point), handler);\n\treturn ranges;\n}\n\nbool Compiler::types_are_logically_equivalent(const SPIRType &a, const SPIRType &b) const\n{\n\tif (a.basetype != b.basetype)\n\t\treturn false;\n\tif (a.width != b.width)\n\t\treturn false;\n\tif (a.vecsize != b.vecsize)\n\t\treturn false;\n\tif (a.columns != b.columns)\n\t\treturn false;\n\tif (a.array.size() != b.array.size())\n\t\treturn false;\n\n\tsize_t array_count = a.array.size();\n\tif (array_count && memcmp(a.array.data(), b.array.data(), array_count * sizeof(uint32_t)) != 0)\n\t\treturn false;\n\n\tif (a.basetype == SPIRType::Image || a.basetype == SPIRType::SampledImage)\n\t{\n\t\tif (memcmp(&a.image, &b.image, sizeof(SPIRType::Image)) != 0)\n\t\t\treturn false;\n\t}\n\n\tif (a.member_types.size() != b.member_types.size())\n\t\treturn false;\n\n\tsize_t member_types = a.member_types.size();\n\tfor (size_t i = 0; i < member_types; i++)\n\t{\n\t\tif (!types_are_logically_equivalent(get<SPIRType>(a.member_types[i]), get<SPIRType>(b.member_types[i])))\n\t\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nconst Bitset &Compiler::get_execution_mode_bitset() const\n{\n\treturn get_entry_point().flags;\n}\n\nvoid Compiler::set_execution_mode(ExecutionMode mode, uint32_t arg0, uint32_t arg1, uint32_t arg2)\n{\n\tauto &execution = get_entry_point();\n\n\texecution.flags.set(mode);\n\tswitch (mode)\n\t{\n\tcase ExecutionModeLocalSize:\n\t\texecution.workgroup_size.x = arg0;\n\t\texecution.workgroup_size.y = arg1;\n\t\texecution.workgroup_size.z = arg2;\n\t\tbreak;\n\n\tcase ExecutionModeLocalSizeId:\n\t\texecution.workgroup_size.id_x = arg0;\n\t\texecution.workgroup_size.id_y = arg1;\n\t\texecution.workgroup_size.id_z = arg2;\n\t\tbreak;\n\n\tcase ExecutionModeInvocations:\n\t\texecution.invocations = arg0;\n\t\tbreak;\n\n\tcase ExecutionModeOutputVertices:\n\t\texecution.output_vertices = arg0;\n\t\tbreak;\n\n\tcase ExecutionModeOutputPrimitivesEXT:\n\t\texecution.output_primitives = arg0;\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nvoid Compiler::unset_execution_mode(ExecutionMode mode)\n{\n\tauto &execution = get_entry_point();\n\texecution.flags.clear(mode);\n}\n\nuint32_t Compiler::get_work_group_size_specialization_constants(SpecializationConstant &x, SpecializationConstant &y,\n                                                                SpecializationConstant &z) const\n{\n\tauto &execution = get_entry_point();\n\tx = { 0, 0 };\n\ty = { 0, 0 };\n\tz = { 0, 0 };\n\n\t// WorkgroupSize builtin takes precedence over LocalSize / LocalSizeId.\n\tif (execution.workgroup_size.constant != 0)\n\t{\n\t\tauto &c = get<SPIRConstant>(execution.workgroup_size.constant);\n\n\t\tif (c.m.c[0].id[0] != ID(0))\n\t\t{\n\t\t\tx.id = c.m.c[0].id[0];\n\t\t\tx.constant_id = get_decoration(c.m.c[0].id[0], DecorationSpecId);\n\t\t}\n\n\t\tif (c.m.c[0].id[1] != ID(0))\n\t\t{\n\t\t\ty.id = c.m.c[0].id[1];\n\t\t\ty.constant_id = get_decoration(c.m.c[0].id[1], DecorationSpecId);\n\t\t}\n\n\t\tif (c.m.c[0].id[2] != ID(0))\n\t\t{\n\t\t\tz.id = c.m.c[0].id[2];\n\t\t\tz.constant_id = get_decoration(c.m.c[0].id[2], DecorationSpecId);\n\t\t}\n\t}\n\telse if (execution.flags.get(ExecutionModeLocalSizeId))\n\t{\n\t\tauto &cx = get<SPIRConstant>(execution.workgroup_size.id_x);\n\t\tif (cx.specialization)\n\t\t{\n\t\t\tx.id = execution.workgroup_size.id_x;\n\t\t\tx.constant_id = get_decoration(execution.workgroup_size.id_x, DecorationSpecId);\n\t\t}\n\n\t\tauto &cy = get<SPIRConstant>(execution.workgroup_size.id_y);\n\t\tif (cy.specialization)\n\t\t{\n\t\t\ty.id = execution.workgroup_size.id_y;\n\t\t\ty.constant_id = get_decoration(execution.workgroup_size.id_y, DecorationSpecId);\n\t\t}\n\n\t\tauto &cz = get<SPIRConstant>(execution.workgroup_size.id_z);\n\t\tif (cz.specialization)\n\t\t{\n\t\t\tz.id = execution.workgroup_size.id_z;\n\t\t\tz.constant_id = get_decoration(execution.workgroup_size.id_z, DecorationSpecId);\n\t\t}\n\t}\n\n\treturn execution.workgroup_size.constant;\n}\n\nuint32_t Compiler::get_execution_mode_argument(spv::ExecutionMode mode, uint32_t index) const\n{\n\tauto &execution = get_entry_point();\n\tswitch (mode)\n\t{\n\tcase ExecutionModeLocalSizeId:\n\t\tif (execution.flags.get(ExecutionModeLocalSizeId))\n\t\t{\n\t\t\tswitch (index)\n\t\t\t{\n\t\t\tcase 0:\n\t\t\t\treturn execution.workgroup_size.id_x;\n\t\t\tcase 1:\n\t\t\t\treturn execution.workgroup_size.id_y;\n\t\t\tcase 2:\n\t\t\t\treturn execution.workgroup_size.id_z;\n\t\t\tdefault:\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\treturn 0;\n\n\tcase ExecutionModeLocalSize:\n\t\tswitch (index)\n\t\t{\n\t\tcase 0:\n\t\t\tif (execution.flags.get(ExecutionModeLocalSizeId) && execution.workgroup_size.id_x != 0)\n\t\t\t\treturn get<SPIRConstant>(execution.workgroup_size.id_x).scalar();\n\t\t\telse\n\t\t\t\treturn execution.workgroup_size.x;\n\t\tcase 1:\n\t\t\tif (execution.flags.get(ExecutionModeLocalSizeId) && execution.workgroup_size.id_y != 0)\n\t\t\t\treturn get<SPIRConstant>(execution.workgroup_size.id_y).scalar();\n\t\t\telse\n\t\t\t\treturn execution.workgroup_size.y;\n\t\tcase 2:\n\t\t\tif (execution.flags.get(ExecutionModeLocalSizeId) && execution.workgroup_size.id_z != 0)\n\t\t\t\treturn get<SPIRConstant>(execution.workgroup_size.id_z).scalar();\n\t\t\telse\n\t\t\t\treturn execution.workgroup_size.z;\n\t\tdefault:\n\t\t\treturn 0;\n\t\t}\n\n\tcase ExecutionModeInvocations:\n\t\treturn execution.invocations;\n\n\tcase ExecutionModeOutputVertices:\n\t\treturn execution.output_vertices;\n\n\tcase ExecutionModeOutputPrimitivesEXT:\n\t\treturn execution.output_primitives;\n\n\tdefault:\n\t\treturn 0;\n\t}\n}\n\nExecutionModel Compiler::get_execution_model() const\n{\n\tauto &execution = get_entry_point();\n\treturn execution.model;\n}\n\nbool Compiler::is_tessellation_shader(ExecutionModel model)\n{\n\treturn model == ExecutionModelTessellationControl || model == ExecutionModelTessellationEvaluation;\n}\n\nbool Compiler::is_vertex_like_shader() const\n{\n\tauto model = get_execution_model();\n\treturn model == ExecutionModelVertex || model == ExecutionModelGeometry ||\n\t       model == ExecutionModelTessellationControl || model == ExecutionModelTessellationEvaluation;\n}\n\nbool Compiler::is_tessellation_shader() const\n{\n\treturn is_tessellation_shader(get_execution_model());\n}\n\nbool Compiler::is_tessellating_triangles() const\n{\n\treturn get_execution_mode_bitset().get(ExecutionModeTriangles);\n}\n\nvoid Compiler::set_remapped_variable_state(VariableID id, bool remap_enable)\n{\n\tget<SPIRVariable>(id).remapped_variable = remap_enable;\n}\n\nbool Compiler::get_remapped_variable_state(VariableID id) const\n{\n\treturn get<SPIRVariable>(id).remapped_variable;\n}\n\nvoid Compiler::set_subpass_input_remapped_components(VariableID id, uint32_t components)\n{\n\tget<SPIRVariable>(id).remapped_components = components;\n}\n\nuint32_t Compiler::get_subpass_input_remapped_components(VariableID id) const\n{\n\treturn get<SPIRVariable>(id).remapped_components;\n}\n\nvoid Compiler::add_implied_read_expression(SPIRExpression &e, uint32_t source)\n{\n\tauto itr = find(begin(e.implied_read_expressions), end(e.implied_read_expressions), ID(source));\n\tif (itr == end(e.implied_read_expressions))\n\t\te.implied_read_expressions.push_back(source);\n}\n\nvoid Compiler::add_implied_read_expression(SPIRAccessChain &e, uint32_t source)\n{\n\tauto itr = find(begin(e.implied_read_expressions), end(e.implied_read_expressions), ID(source));\n\tif (itr == end(e.implied_read_expressions))\n\t\te.implied_read_expressions.push_back(source);\n}\n\nvoid Compiler::add_active_interface_variable(uint32_t var_id)\n{\n\tactive_interface_variables.insert(var_id);\n\n\t// In SPIR-V 1.4 and up we must also track the interface variable in the entry point.\n\tif (ir.get_spirv_version() >= 0x10400)\n\t{\n\t\tauto &vars = get_entry_point().interface_variables;\n\t\tif (find(begin(vars), end(vars), VariableID(var_id)) == end(vars))\n\t\t\tvars.push_back(var_id);\n\t}\n}\n\nvoid Compiler::inherit_expression_dependencies(uint32_t dst, uint32_t source_expression)\n{\n\t// Don't inherit any expression dependencies if the expression in dst\n\t// is not a forwarded temporary.\n\tif (forwarded_temporaries.find(dst) == end(forwarded_temporaries) ||\n\t    forced_temporaries.find(dst) != end(forced_temporaries))\n\t{\n\t\treturn;\n\t}\n\n\tauto &e = get<SPIRExpression>(dst);\n\tauto *phi = maybe_get<SPIRVariable>(source_expression);\n\tif (phi && phi->phi_variable)\n\t{\n\t\t// We have used a phi variable, which can change at the end of the block,\n\t\t// so make sure we take a dependency on this phi variable.\n\t\tphi->dependees.push_back(dst);\n\t}\n\n\tauto *s = maybe_get<SPIRExpression>(source_expression);\n\tif (!s)\n\t\treturn;\n\n\tauto &e_deps = e.expression_dependencies;\n\tauto &s_deps = s->expression_dependencies;\n\n\t// If we depend on a expression, we also depend on all sub-dependencies from source.\n\te_deps.push_back(source_expression);\n\te_deps.insert(end(e_deps), begin(s_deps), end(s_deps));\n\n\t// Eliminate duplicated dependencies.\n\tsort(begin(e_deps), end(e_deps));\n\te_deps.erase(unique(begin(e_deps), end(e_deps)), end(e_deps));\n}\n\nSmallVector<EntryPoint> Compiler::get_entry_points_and_stages() const\n{\n\tSmallVector<EntryPoint> entries;\n\tfor (auto &entry : ir.entry_points)\n\t\tentries.push_back({ entry.second.orig_name, entry.second.model });\n\treturn entries;\n}\n\nvoid Compiler::rename_entry_point(const std::string &old_name, const std::string &new_name, spv::ExecutionModel model)\n{\n\tauto &entry = get_entry_point(old_name, model);\n\tentry.orig_name = new_name;\n\tentry.name = new_name;\n}\n\nvoid Compiler::set_entry_point(const std::string &name, spv::ExecutionModel model)\n{\n\tauto &entry = get_entry_point(name, model);\n\tir.default_entry_point = entry.self;\n}\n\nSPIREntryPoint &Compiler::get_first_entry_point(const std::string &name)\n{\n\tauto itr = find_if(\n\t    begin(ir.entry_points), end(ir.entry_points),\n\t    [&](const std::pair<uint32_t, SPIREntryPoint> &entry) -> bool { return entry.second.orig_name == name; });\n\n\tif (itr == end(ir.entry_points))\n\t\tSPIRV_CROSS_THROW(\"Entry point does not exist.\");\n\n\treturn itr->second;\n}\n\nconst SPIREntryPoint &Compiler::get_first_entry_point(const std::string &name) const\n{\n\tauto itr = find_if(\n\t    begin(ir.entry_points), end(ir.entry_points),\n\t    [&](const std::pair<uint32_t, SPIREntryPoint> &entry) -> bool { return entry.second.orig_name == name; });\n\n\tif (itr == end(ir.entry_points))\n\t\tSPIRV_CROSS_THROW(\"Entry point does not exist.\");\n\n\treturn itr->second;\n}\n\nSPIREntryPoint &Compiler::get_entry_point(const std::string &name, ExecutionModel model)\n{\n\tauto itr = find_if(begin(ir.entry_points), end(ir.entry_points),\n\t                   [&](const std::pair<uint32_t, SPIREntryPoint> &entry) -> bool {\n\t\t                   return entry.second.orig_name == name && entry.second.model == model;\n\t                   });\n\n\tif (itr == end(ir.entry_points))\n\t\tSPIRV_CROSS_THROW(\"Entry point does not exist.\");\n\n\treturn itr->second;\n}\n\nconst SPIREntryPoint &Compiler::get_entry_point(const std::string &name, ExecutionModel model) const\n{\n\tauto itr = find_if(begin(ir.entry_points), end(ir.entry_points),\n\t                   [&](const std::pair<uint32_t, SPIREntryPoint> &entry) -> bool {\n\t\t                   return entry.second.orig_name == name && entry.second.model == model;\n\t                   });\n\n\tif (itr == end(ir.entry_points))\n\t\tSPIRV_CROSS_THROW(\"Entry point does not exist.\");\n\n\treturn itr->second;\n}\n\nconst string &Compiler::get_cleansed_entry_point_name(const std::string &name, ExecutionModel model) const\n{\n\treturn get_entry_point(name, model).name;\n}\n\nconst SPIREntryPoint &Compiler::get_entry_point() const\n{\n\treturn ir.entry_points.find(ir.default_entry_point)->second;\n}\n\nSPIREntryPoint &Compiler::get_entry_point()\n{\n\treturn ir.entry_points.find(ir.default_entry_point)->second;\n}\n\nbool Compiler::interface_variable_exists_in_entry_point(uint32_t id) const\n{\n\tauto &var = get<SPIRVariable>(id);\n\n\tif (ir.get_spirv_version() < 0x10400)\n\t{\n\t\tif (var.storage != StorageClassInput && var.storage != StorageClassOutput &&\n\t\t    var.storage != StorageClassUniformConstant)\n\t\t\tSPIRV_CROSS_THROW(\"Only Input, Output variables and Uniform constants are part of a shader linking interface.\");\n\n\t\t// This is to avoid potential problems with very old glslang versions which did\n\t\t// not emit input/output interfaces properly.\n\t\t// We can assume they only had a single entry point, and single entry point\n\t\t// shaders could easily be assumed to use every interface variable anyways.\n\t\tif (ir.entry_points.size() <= 1)\n\t\t\treturn true;\n\t}\n\n\t// In SPIR-V 1.4 and later, all global resource variables must be present.\n\n\tauto &execution = get_entry_point();\n\treturn find(begin(execution.interface_variables), end(execution.interface_variables), VariableID(id)) !=\n\t       end(execution.interface_variables);\n}\n\nvoid Compiler::CombinedImageSamplerHandler::push_remap_parameters(const SPIRFunction &func, const uint32_t *args,\n                                                                  uint32_t length)\n{\n\t// If possible, pipe through a remapping table so that parameters know\n\t// which variables they actually bind to in this scope.\n\tunordered_map<uint32_t, uint32_t> remapping;\n\tfor (uint32_t i = 0; i < length; i++)\n\t\tremapping[func.arguments[i].id] = remap_parameter(args[i]);\n\tparameter_remapping.push(std::move(remapping));\n}\n\nvoid Compiler::CombinedImageSamplerHandler::pop_remap_parameters()\n{\n\tparameter_remapping.pop();\n}\n\nuint32_t Compiler::CombinedImageSamplerHandler::remap_parameter(uint32_t id)\n{\n\tauto *var = compiler.maybe_get_backing_variable(id);\n\tif (var)\n\t\tid = var->self;\n\n\tif (parameter_remapping.empty())\n\t\treturn id;\n\n\tauto &remapping = parameter_remapping.top();\n\tauto itr = remapping.find(id);\n\tif (itr != end(remapping))\n\t\treturn itr->second;\n\telse\n\t\treturn id;\n}\n\nbool Compiler::CombinedImageSamplerHandler::begin_function_scope(const uint32_t *args, uint32_t length)\n{\n\tif (length < 3)\n\t\treturn false;\n\n\tauto &callee = compiler.get<SPIRFunction>(args[2]);\n\targs += 3;\n\tlength -= 3;\n\tpush_remap_parameters(callee, args, length);\n\tfunctions.push(&callee);\n\treturn true;\n}\n\nbool Compiler::CombinedImageSamplerHandler::end_function_scope(const uint32_t *args, uint32_t length)\n{\n\tif (length < 3)\n\t\treturn false;\n\n\tauto &callee = compiler.get<SPIRFunction>(args[2]);\n\targs += 3;\n\n\t// There are two types of cases we have to handle,\n\t// a callee might call sampler2D(texture2D, sampler) directly where\n\t// one or more parameters originate from parameters.\n\t// Alternatively, we need to provide combined image samplers to our callees,\n\t// and in this case we need to add those as well.\n\n\tpop_remap_parameters();\n\n\t// Our callee has now been processed at least once.\n\t// No point in doing it again.\n\tcallee.do_combined_parameters = false;\n\n\tauto &params = functions.top()->combined_parameters;\n\tfunctions.pop();\n\tif (functions.empty())\n\t\treturn true;\n\n\tauto &caller = *functions.top();\n\tif (caller.do_combined_parameters)\n\t{\n\t\tfor (auto &param : params)\n\t\t{\n\t\t\tVariableID image_id = param.global_image ? param.image_id : VariableID(args[param.image_id]);\n\t\t\tVariableID sampler_id = param.global_sampler ? param.sampler_id : VariableID(args[param.sampler_id]);\n\n\t\t\tauto *i = compiler.maybe_get_backing_variable(image_id);\n\t\t\tauto *s = compiler.maybe_get_backing_variable(sampler_id);\n\t\t\tif (i)\n\t\t\t\timage_id = i->self;\n\t\t\tif (s)\n\t\t\t\tsampler_id = s->self;\n\n\t\t\tregister_combined_image_sampler(caller, 0, image_id, sampler_id, param.depth);\n\t\t}\n\t}\n\n\treturn true;\n}\n\nvoid Compiler::CombinedImageSamplerHandler::register_combined_image_sampler(SPIRFunction &caller,\n                                                                            VariableID combined_module_id,\n                                                                            VariableID image_id, VariableID sampler_id,\n                                                                            bool depth)\n{\n\t// We now have a texture ID and a sampler ID which will either be found as a global\n\t// or a parameter in our own function. If both are global, they will not need a parameter,\n\t// otherwise, add it to our list.\n\tSPIRFunction::CombinedImageSamplerParameter param = {\n\t\t0u, image_id, sampler_id, true, true, depth,\n\t};\n\n\tauto texture_itr = find_if(begin(caller.arguments), end(caller.arguments),\n\t                           [image_id](const SPIRFunction::Parameter &p) { return p.id == image_id; });\n\tauto sampler_itr = find_if(begin(caller.arguments), end(caller.arguments),\n\t                           [sampler_id](const SPIRFunction::Parameter &p) { return p.id == sampler_id; });\n\n\tif (texture_itr != end(caller.arguments))\n\t{\n\t\tparam.global_image = false;\n\t\tparam.image_id = uint32_t(texture_itr - begin(caller.arguments));\n\t}\n\n\tif (sampler_itr != end(caller.arguments))\n\t{\n\t\tparam.global_sampler = false;\n\t\tparam.sampler_id = uint32_t(sampler_itr - begin(caller.arguments));\n\t}\n\n\tif (param.global_image && param.global_sampler)\n\t\treturn;\n\n\tauto itr = find_if(begin(caller.combined_parameters), end(caller.combined_parameters),\n\t                   [&param](const SPIRFunction::CombinedImageSamplerParameter &p) {\n\t\t                   return param.image_id == p.image_id && param.sampler_id == p.sampler_id &&\n\t\t                          param.global_image == p.global_image && param.global_sampler == p.global_sampler;\n\t                   });\n\n\tif (itr == end(caller.combined_parameters))\n\t{\n\t\tuint32_t id = compiler.ir.increase_bound_by(3);\n\t\tauto type_id = id + 0;\n\t\tauto ptr_type_id = id + 1;\n\t\tauto combined_id = id + 2;\n\t\tauto &base = compiler.expression_type(image_id);\n\t\tauto &type = compiler.set<SPIRType>(type_id, OpTypeSampledImage);\n\t\tauto &ptr_type = compiler.set<SPIRType>(ptr_type_id, OpTypePointer);\n\n\t\ttype = base;\n\t\ttype.self = type_id;\n\t\ttype.basetype = SPIRType::SampledImage;\n\t\ttype.pointer = false;\n\t\ttype.storage = StorageClassGeneric;\n\t\ttype.image.depth = depth;\n\n\t\tptr_type = type;\n\t\tptr_type.pointer = true;\n\t\tptr_type.storage = StorageClassUniformConstant;\n\t\tptr_type.parent_type = type_id;\n\n\t\t// Build new variable.\n\t\tcompiler.set<SPIRVariable>(combined_id, ptr_type_id, StorageClassFunction, 0);\n\n\t\t// Inherit RelaxedPrecision.\n\t\t// If any of OpSampledImage, underlying image or sampler are marked, inherit the decoration.\n\t\tbool relaxed_precision =\n\t\t    compiler.has_decoration(sampler_id, DecorationRelaxedPrecision) ||\n\t\t    compiler.has_decoration(image_id, DecorationRelaxedPrecision) ||\n\t\t    (combined_module_id && compiler.has_decoration(combined_module_id, DecorationRelaxedPrecision));\n\n\t\tif (relaxed_precision)\n\t\t\tcompiler.set_decoration(combined_id, DecorationRelaxedPrecision);\n\n\t\tparam.id = combined_id;\n\n\t\tcompiler.set_name(combined_id,\n\t\t                  join(\"SPIRV_Cross_Combined\", compiler.to_name(image_id), compiler.to_name(sampler_id)));\n\n\t\tcaller.combined_parameters.push_back(param);\n\t\tcaller.shadow_arguments.push_back({ ptr_type_id, combined_id, 0u, 0u, true });\n\t}\n}\n\nbool Compiler::DummySamplerForCombinedImageHandler::handle(Op opcode, const uint32_t *args, uint32_t length)\n{\n\tif (need_dummy_sampler)\n\t{\n\t\t// No need to traverse further, we know the result.\n\t\treturn false;\n\t}\n\n\tswitch (opcode)\n\t{\n\tcase OpLoad:\n\t{\n\t\tif (length < 3)\n\t\t\treturn false;\n\n\t\tuint32_t result_type = args[0];\n\n\t\tauto &type = compiler.get<SPIRType>(result_type);\n\t\tbool separate_image =\n\t\t    type.basetype == SPIRType::Image && type.image.sampled == 1 && type.image.dim != DimBuffer;\n\n\t\t// If not separate image, don't bother.\n\t\tif (!separate_image)\n\t\t\treturn true;\n\n\t\tuint32_t id = args[1];\n\t\tuint32_t ptr = args[2];\n\t\tcompiler.set<SPIRExpression>(id, \"\", result_type, true);\n\t\tcompiler.register_read(id, ptr, true);\n\t\tbreak;\n\t}\n\n\tcase OpImageFetch:\n\tcase OpImageQuerySizeLod:\n\tcase OpImageQuerySize:\n\tcase OpImageQueryLevels:\n\tcase OpImageQuerySamples:\n\t{\n\t\t// If we are fetching or querying LOD from a plain OpTypeImage, we must pre-combine with our dummy sampler.\n\t\tauto *var = compiler.maybe_get_backing_variable(args[2]);\n\t\tif (var)\n\t\t{\n\t\t\tauto &type = compiler.get<SPIRType>(var->basetype);\n\t\t\tif (type.basetype == SPIRType::Image && type.image.sampled == 1 && type.image.dim != DimBuffer)\n\t\t\t\tneed_dummy_sampler = true;\n\t\t}\n\n\t\tbreak;\n\t}\n\n\tcase OpInBoundsAccessChain:\n\tcase OpAccessChain:\n\tcase OpPtrAccessChain:\n\t{\n\t\tif (length < 3)\n\t\t\treturn false;\n\n\t\tuint32_t result_type = args[0];\n\t\tauto &type = compiler.get<SPIRType>(result_type);\n\t\tbool separate_image =\n\t\t    type.basetype == SPIRType::Image && type.image.sampled == 1 && type.image.dim != DimBuffer;\n\t\tif (!separate_image)\n\t\t\treturn true;\n\n\t\tuint32_t id = args[1];\n\t\tuint32_t ptr = args[2];\n\t\tcompiler.set<SPIRExpression>(id, \"\", result_type, true);\n\t\tcompiler.register_read(id, ptr, true);\n\n\t\t// Other backends might use SPIRAccessChain for this later.\n\t\tcompiler.ir.ids[id].set_allow_type_rewrite();\n\t\tbreak;\n\t}\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn true;\n}\n\nbool Compiler::CombinedImageSamplerHandler::handle(Op opcode, const uint32_t *args, uint32_t length)\n{\n\t// We need to figure out where samplers and images are loaded from, so do only the bare bones compilation we need.\n\tbool is_fetch = false;\n\n\tswitch (opcode)\n\t{\n\tcase OpLoad:\n\t{\n\t\tif (length < 3)\n\t\t\treturn false;\n\n\t\tuint32_t result_type = args[0];\n\n\t\tauto &type = compiler.get<SPIRType>(result_type);\n\t\tbool separate_image = type.basetype == SPIRType::Image && type.image.sampled == 1;\n\t\tbool separate_sampler = type.basetype == SPIRType::Sampler;\n\n\t\t// If not separate image or sampler, don't bother.\n\t\tif (!separate_image && !separate_sampler)\n\t\t\treturn true;\n\n\t\tuint32_t id = args[1];\n\t\tuint32_t ptr = args[2];\n\t\tcompiler.set<SPIRExpression>(id, \"\", result_type, true);\n\t\tcompiler.register_read(id, ptr, true);\n\t\treturn true;\n\t}\n\n\tcase OpInBoundsAccessChain:\n\tcase OpAccessChain:\n\tcase OpPtrAccessChain:\n\t{\n\t\tif (length < 3)\n\t\t\treturn false;\n\n\t\t// Technically, it is possible to have arrays of textures and arrays of samplers and combine them, but this becomes essentially\n\t\t// impossible to implement, since we don't know which concrete sampler we are accessing.\n\t\t// One potential way is to create a combinatorial explosion where N textures and M samplers are combined into N * M sampler2Ds,\n\t\t// but this seems ridiculously complicated for a problem which is easy to work around.\n\t\t// Checking access chains like this assumes we don't have samplers or textures inside uniform structs, but this makes no sense.\n\n\t\tuint32_t result_type = args[0];\n\n\t\tauto &type = compiler.get<SPIRType>(result_type);\n\t\tbool separate_image = type.basetype == SPIRType::Image && type.image.sampled == 1;\n\t\tbool separate_sampler = type.basetype == SPIRType::Sampler;\n\t\tif (separate_sampler)\n\t\t\tSPIRV_CROSS_THROW(\n\t\t\t    \"Attempting to use arrays or structs of separate samplers. This is not possible to statically \"\n\t\t\t    \"remap to plain GLSL.\");\n\n\t\tif (separate_image)\n\t\t{\n\t\t\tuint32_t id = args[1];\n\t\t\tuint32_t ptr = args[2];\n\t\t\tcompiler.set<SPIRExpression>(id, \"\", result_type, true);\n\t\t\tcompiler.register_read(id, ptr, true);\n\t\t}\n\t\treturn true;\n\t}\n\n\tcase OpImageFetch:\n\tcase OpImageQuerySizeLod:\n\tcase OpImageQuerySize:\n\tcase OpImageQueryLevels:\n\tcase OpImageQuerySamples:\n\t{\n\t\t// If we are fetching from a plain OpTypeImage or querying LOD, we must pre-combine with our dummy sampler.\n\t\tauto *var = compiler.maybe_get_backing_variable(args[2]);\n\t\tif (!var)\n\t\t\treturn true;\n\n\t\tauto &type = compiler.get<SPIRType>(var->basetype);\n\t\tif (type.basetype == SPIRType::Image && type.image.sampled == 1 && type.image.dim != DimBuffer)\n\t\t{\n\t\t\tif (compiler.dummy_sampler_id == 0)\n\t\t\t\tSPIRV_CROSS_THROW(\"texelFetch without sampler was found, but no dummy sampler has been created with \"\n\t\t\t\t                  \"build_dummy_sampler_for_combined_images().\");\n\n\t\t\t// Do it outside.\n\t\t\tis_fetch = true;\n\t\t\tbreak;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tcase OpSampledImage:\n\t\t// Do it outside.\n\t\tbreak;\n\n\tdefault:\n\t\treturn true;\n\t}\n\n\t// Registers sampler2D calls used in case they are parameters so\n\t// that their callees know which combined image samplers to propagate down the call stack.\n\tif (!functions.empty())\n\t{\n\t\tauto &callee = *functions.top();\n\t\tif (callee.do_combined_parameters)\n\t\t{\n\t\t\tuint32_t image_id = args[2];\n\n\t\t\tauto *image = compiler.maybe_get_backing_variable(image_id);\n\t\t\tif (image)\n\t\t\t\timage_id = image->self;\n\n\t\t\tuint32_t sampler_id = is_fetch ? compiler.dummy_sampler_id : args[3];\n\t\t\tauto *sampler = compiler.maybe_get_backing_variable(sampler_id);\n\t\t\tif (sampler)\n\t\t\t\tsampler_id = sampler->self;\n\n\t\t\tuint32_t combined_id = args[1];\n\n\t\t\tauto &combined_type = compiler.get<SPIRType>(args[0]);\n\t\t\tregister_combined_image_sampler(callee, combined_id, image_id, sampler_id, combined_type.image.depth);\n\t\t}\n\t}\n\n\t// For function calls, we need to remap IDs which are function parameters into global variables.\n\t// This information is statically known from the current place in the call stack.\n\t// Function parameters are not necessarily pointers, so if we don't have a backing variable, remapping will know\n\t// which backing variable the image/sample came from.\n\tVariableID image_id = remap_parameter(args[2]);\n\tVariableID sampler_id = is_fetch ? compiler.dummy_sampler_id : remap_parameter(args[3]);\n\n\tauto itr = find_if(begin(compiler.combined_image_samplers), end(compiler.combined_image_samplers),\n\t                   [image_id, sampler_id](const CombinedImageSampler &combined) {\n\t\t                   return combined.image_id == image_id && combined.sampler_id == sampler_id;\n\t                   });\n\n\tif (itr == end(compiler.combined_image_samplers))\n\t{\n\t\tuint32_t sampled_type;\n\t\tuint32_t combined_module_id;\n\t\tif (is_fetch)\n\t\t{\n\t\t\t// Have to invent the sampled image type.\n\t\t\tsampled_type = compiler.ir.increase_bound_by(1);\n\t\t\tauto &type = compiler.set<SPIRType>(sampled_type, OpTypeSampledImage);\n\t\t\ttype = compiler.expression_type(args[2]);\n\t\t\ttype.self = sampled_type;\n\t\t\ttype.basetype = SPIRType::SampledImage;\n\t\t\ttype.image.depth = false;\n\t\t\tcombined_module_id = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tsampled_type = args[0];\n\t\t\tcombined_module_id = args[1];\n\t\t}\n\n\t\tauto id = compiler.ir.increase_bound_by(2);\n\t\tauto type_id = id + 0;\n\t\tauto combined_id = id + 1;\n\n\t\t// Make a new type, pointer to OpTypeSampledImage, so we can make a variable of this type.\n\t\t// We will probably have this type lying around, but it doesn't hurt to make duplicates for internal purposes.\n\t\tauto &type = compiler.set<SPIRType>(type_id, OpTypePointer);\n\t\tauto &base = compiler.get<SPIRType>(sampled_type);\n\t\ttype = base;\n\t\ttype.pointer = true;\n\t\ttype.storage = StorageClassUniformConstant;\n\t\ttype.parent_type = type_id;\n\n\t\t// Build new variable.\n\t\tcompiler.set<SPIRVariable>(combined_id, type_id, StorageClassUniformConstant, 0);\n\n\t\t// Inherit RelaxedPrecision (and potentially other useful flags if deemed relevant).\n\t\t// If any of OpSampledImage, underlying image or sampler are marked, inherit the decoration.\n\t\tbool relaxed_precision =\n\t\t    (sampler_id && compiler.has_decoration(sampler_id, DecorationRelaxedPrecision)) ||\n\t\t    (image_id && compiler.has_decoration(image_id, DecorationRelaxedPrecision)) ||\n\t\t    (combined_module_id && compiler.has_decoration(combined_module_id, DecorationRelaxedPrecision));\n\n\t\tif (relaxed_precision)\n\t\t\tcompiler.set_decoration(combined_id, DecorationRelaxedPrecision);\n\n\t\t// Propagate the array type for the original image as well.\n\t\tauto *var = compiler.maybe_get_backing_variable(image_id);\n\t\tif (var)\n\t\t{\n\t\t\tauto &parent_type = compiler.get<SPIRType>(var->basetype);\n\t\t\ttype.array = parent_type.array;\n\t\t\ttype.array_size_literal = parent_type.array_size_literal;\n\t\t}\n\n\t\tcompiler.combined_image_samplers.push_back({ combined_id, image_id, sampler_id });\n\t}\n\n\treturn true;\n}\n\nVariableID Compiler::build_dummy_sampler_for_combined_images()\n{\n\tDummySamplerForCombinedImageHandler handler(*this);\n\ttraverse_all_reachable_opcodes(get<SPIRFunction>(ir.default_entry_point), handler);\n\tif (handler.need_dummy_sampler)\n\t{\n\t\tuint32_t offset = ir.increase_bound_by(3);\n\t\tauto type_id = offset + 0;\n\t\tauto ptr_type_id = offset + 1;\n\t\tauto var_id = offset + 2;\n\n\t\tauto &sampler = set<SPIRType>(type_id, OpTypeSampler);\n\t\tsampler.basetype = SPIRType::Sampler;\n\n\t\tauto &ptr_sampler = set<SPIRType>(ptr_type_id, OpTypePointer);\n\t\tptr_sampler = sampler;\n\t\tptr_sampler.self = type_id;\n\t\tptr_sampler.storage = StorageClassUniformConstant;\n\t\tptr_sampler.pointer = true;\n\t\tptr_sampler.parent_type = type_id;\n\n\t\tset<SPIRVariable>(var_id, ptr_type_id, StorageClassUniformConstant, 0);\n\t\tset_name(var_id, \"SPIRV_Cross_DummySampler\");\n\t\tdummy_sampler_id = var_id;\n\t\treturn var_id;\n\t}\n\telse\n\t\treturn 0;\n}\n\nvoid Compiler::build_combined_image_samplers()\n{\n\tir.for_each_typed_id<SPIRFunction>([&](uint32_t, SPIRFunction &func) {\n\t\tfunc.combined_parameters.clear();\n\t\tfunc.shadow_arguments.clear();\n\t\tfunc.do_combined_parameters = true;\n\t});\n\n\tcombined_image_samplers.clear();\n\tCombinedImageSamplerHandler handler(*this);\n\ttraverse_all_reachable_opcodes(get<SPIRFunction>(ir.default_entry_point), handler);\n}\n\nSmallVector<SpecializationConstant> Compiler::get_specialization_constants() const\n{\n\tSmallVector<SpecializationConstant> spec_consts;\n\tir.for_each_typed_id<SPIRConstant>([&](uint32_t, const SPIRConstant &c) {\n\t\tif (c.specialization && has_decoration(c.self, DecorationSpecId))\n\t\t\tspec_consts.push_back({ c.self, get_decoration(c.self, DecorationSpecId) });\n\t});\n\treturn spec_consts;\n}\n\nSPIRConstant &Compiler::get_constant(ConstantID id)\n{\n\treturn get<SPIRConstant>(id);\n}\n\nconst SPIRConstant &Compiler::get_constant(ConstantID id) const\n{\n\treturn get<SPIRConstant>(id);\n}\n\nstatic bool exists_unaccessed_path_to_return(const CFG &cfg, uint32_t block, const unordered_set<uint32_t> &blocks,\n                                             unordered_set<uint32_t> &visit_cache)\n{\n\t// This block accesses the variable.\n\tif (blocks.find(block) != end(blocks))\n\t\treturn false;\n\n\t// We are at the end of the CFG.\n\tif (cfg.get_succeeding_edges(block).empty())\n\t\treturn true;\n\n\t// If any of our successors have a path to the end, there exists a path from block.\n\tfor (auto &succ : cfg.get_succeeding_edges(block))\n\t{\n\t\tif (visit_cache.count(succ) == 0)\n\t\t{\n\t\t\tif (exists_unaccessed_path_to_return(cfg, succ, blocks, visit_cache))\n\t\t\t\treturn true;\n\t\t\tvisit_cache.insert(succ);\n\t\t}\n\t}\n\n\treturn false;\n}\n\nvoid Compiler::analyze_parameter_preservation(\n    SPIRFunction &entry, const CFG &cfg, const unordered_map<uint32_t, unordered_set<uint32_t>> &variable_to_blocks,\n    const unordered_map<uint32_t, unordered_set<uint32_t>> &complete_write_blocks)\n{\n\tfor (auto &arg : entry.arguments)\n\t{\n\t\t// Non-pointers are always inputs.\n\t\tauto &type = get<SPIRType>(arg.type);\n\t\tif (!type.pointer)\n\t\t\tcontinue;\n\n\t\t// Opaque argument types are always in\n\t\tbool potential_preserve;\n\t\tswitch (type.basetype)\n\t\t{\n\t\tcase SPIRType::Sampler:\n\t\tcase SPIRType::Image:\n\t\tcase SPIRType::SampledImage:\n\t\tcase SPIRType::AtomicCounter:\n\t\t\tpotential_preserve = false;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tpotential_preserve = true;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (!potential_preserve)\n\t\t\tcontinue;\n\n\t\tauto itr = variable_to_blocks.find(arg.id);\n\t\tif (itr == end(variable_to_blocks))\n\t\t{\n\t\t\t// Variable is never accessed.\n\t\t\tcontinue;\n\t\t}\n\n\t\t// We have accessed a variable, but there was no complete writes to that variable.\n\t\t// We deduce that we must preserve the argument.\n\t\titr = complete_write_blocks.find(arg.id);\n\t\tif (itr == end(complete_write_blocks))\n\t\t{\n\t\t\targ.read_count++;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If there is a path through the CFG where no block completely writes to the variable, the variable will be in an undefined state\n\t\t// when the function returns. We therefore need to implicitly preserve the variable in case there are writers in the function.\n\t\t// Major case here is if a function is\n\t\t// void foo(int &var) { if (cond) var = 10; }\n\t\t// Using read/write counts, we will think it's just an out variable, but it really needs to be inout,\n\t\t// because if we don't write anything whatever we put into the function must return back to the caller.\n\t\tunordered_set<uint32_t> visit_cache;\n\t\tif (exists_unaccessed_path_to_return(cfg, entry.entry_block, itr->second, visit_cache))\n\t\t\targ.read_count++;\n\t}\n}\n\nCompiler::AnalyzeVariableScopeAccessHandler::AnalyzeVariableScopeAccessHandler(Compiler &compiler_,\n                                                                               SPIRFunction &entry_)\n    : compiler(compiler_)\n    , entry(entry_)\n{\n}\n\nbool Compiler::AnalyzeVariableScopeAccessHandler::follow_function_call(const SPIRFunction &)\n{\n\t// Only analyze within this function.\n\treturn false;\n}\n\nvoid Compiler::AnalyzeVariableScopeAccessHandler::set_current_block(const SPIRBlock &block)\n{\n\tcurrent_block = &block;\n\n\t// If we're branching to a block which uses OpPhi, in GLSL\n\t// this will be a variable write when we branch,\n\t// so we need to track access to these variables as well to\n\t// have a complete picture.\n\tconst auto test_phi = [this, &block](uint32_t to) {\n\t\tauto &next = compiler.get<SPIRBlock>(to);\n\t\tfor (auto &phi : next.phi_variables)\n\t\t{\n\t\t\tif (phi.parent == block.self)\n\t\t\t{\n\t\t\t\taccessed_variables_to_block[phi.function_variable].insert(block.self);\n\t\t\t\t// Phi variables are also accessed in our target branch block.\n\t\t\t\taccessed_variables_to_block[phi.function_variable].insert(next.self);\n\n\t\t\t\tnotify_variable_access(phi.local_variable, block.self);\n\t\t\t}\n\t\t}\n\t};\n\n\tswitch (block.terminator)\n\t{\n\tcase SPIRBlock::Direct:\n\t\tnotify_variable_access(block.condition, block.self);\n\t\ttest_phi(block.next_block);\n\t\tbreak;\n\n\tcase SPIRBlock::Select:\n\t\tnotify_variable_access(block.condition, block.self);\n\t\ttest_phi(block.true_block);\n\t\ttest_phi(block.false_block);\n\t\tbreak;\n\n\tcase SPIRBlock::MultiSelect:\n\t{\n\t\tnotify_variable_access(block.condition, block.self);\n\t\tauto &cases = compiler.get_case_list(block);\n\t\tfor (auto &target : cases)\n\t\t\ttest_phi(target.block);\n\t\tif (block.default_block)\n\t\t\ttest_phi(block.default_block);\n\t\tbreak;\n\t}\n\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nvoid Compiler::AnalyzeVariableScopeAccessHandler::notify_variable_access(uint32_t id, uint32_t block)\n{\n\tif (id == 0)\n\t\treturn;\n\n\t// Access chains used in multiple blocks mean hoisting all the variables used to construct the access chain as not all backends can use pointers.\n\tauto itr = rvalue_forward_children.find(id);\n\tif (itr != end(rvalue_forward_children))\n\t\tfor (auto child_id : itr->second)\n\t\t\tnotify_variable_access(child_id, block);\n\n\tif (id_is_phi_variable(id))\n\t\taccessed_variables_to_block[id].insert(block);\n\telse if (id_is_potential_temporary(id))\n\t\taccessed_temporaries_to_block[id].insert(block);\n}\n\nbool Compiler::AnalyzeVariableScopeAccessHandler::id_is_phi_variable(uint32_t id) const\n{\n\tif (id >= compiler.get_current_id_bound())\n\t\treturn false;\n\tauto *var = compiler.maybe_get<SPIRVariable>(id);\n\treturn var && var->phi_variable;\n}\n\nbool Compiler::AnalyzeVariableScopeAccessHandler::id_is_potential_temporary(uint32_t id) const\n{\n\tif (id >= compiler.get_current_id_bound())\n\t\treturn false;\n\n\t// Temporaries are not created before we start emitting code.\n\treturn compiler.ir.ids[id].empty() || (compiler.ir.ids[id].get_type() == TypeExpression);\n}\n\nbool Compiler::AnalyzeVariableScopeAccessHandler::handle_terminator(const SPIRBlock &block)\n{\n\tswitch (block.terminator)\n\t{\n\tcase SPIRBlock::Return:\n\t\tif (block.return_value)\n\t\t\tnotify_variable_access(block.return_value, block.self);\n\t\tbreak;\n\n\tcase SPIRBlock::Select:\n\tcase SPIRBlock::MultiSelect:\n\t\tnotify_variable_access(block.condition, block.self);\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn true;\n}\n\nbool Compiler::AnalyzeVariableScopeAccessHandler::handle(spv::Op op, const uint32_t *args, uint32_t length)\n{\n\t// Keep track of the types of temporaries, so we can hoist them out as necessary.\n\tuint32_t result_type, result_id;\n\tif (compiler.instruction_to_result_type(result_type, result_id, op, args, length))\n\t{\n\t\t// For some opcodes, we will need to override the result id.\n\t\t// If we need to hoist the temporary, the temporary type is the input, not the result.\n\t\t// FIXME: This will likely break with OpCopyObject + hoisting, but we'll have to\n\t\t// solve it if we ever get there ...\n\t\tif (op == OpConvertUToAccelerationStructureKHR)\n\t\t{\n\t\t\tauto itr = result_id_to_type.find(args[2]);\n\t\t\tif (itr != result_id_to_type.end())\n\t\t\t\tresult_type = itr->second;\n\t\t}\n\n\t\tresult_id_to_type[result_id] = result_type;\n\t}\n\n\tswitch (op)\n\t{\n\tcase OpStore:\n\t{\n\t\tif (length < 2)\n\t\t\treturn false;\n\n\t\tID ptr = args[0];\n\t\tauto *var = compiler.maybe_get_backing_variable(ptr);\n\n\t\t// If we store through an access chain, we have a partial write.\n\t\tif (var)\n\t\t{\n\t\t\taccessed_variables_to_block[var->self].insert(current_block->self);\n\t\t\tif (var->self == ptr)\n\t\t\t\tcomplete_write_variables_to_block[var->self].insert(current_block->self);\n\t\t\telse\n\t\t\t\tpartial_write_variables_to_block[var->self].insert(current_block->self);\n\t\t}\n\n\t\t// args[0] might be an access chain we have to track use of.\n\t\tnotify_variable_access(args[0], current_block->self);\n\t\t// Might try to store a Phi variable here.\n\t\tnotify_variable_access(args[1], current_block->self);\n\t\tbreak;\n\t}\n\n\tcase OpAccessChain:\n\tcase OpInBoundsAccessChain:\n\tcase OpPtrAccessChain:\n\t{\n\t\tif (length < 3)\n\t\t\treturn false;\n\n\t\t// Access chains used in multiple blocks mean hoisting all the variables used to construct the access chain as not all backends can use pointers.\n\t\tuint32_t ptr = args[2];\n\t\tauto *var = compiler.maybe_get<SPIRVariable>(ptr);\n\t\tif (var)\n\t\t{\n\t\t\taccessed_variables_to_block[var->self].insert(current_block->self);\n\t\t\trvalue_forward_children[args[1]].insert(var->self);\n\t\t}\n\n\t\t// args[2] might be another access chain we have to track use of.\n\t\tfor (uint32_t i = 2; i < length; i++)\n\t\t{\n\t\t\tnotify_variable_access(args[i], current_block->self);\n\t\t\trvalue_forward_children[args[1]].insert(args[i]);\n\t\t}\n\n\t\t// Also keep track of the access chain pointer itself.\n\t\t// In exceptionally rare cases, we can end up with a case where\n\t\t// the access chain is generated in the loop body, but is consumed in continue block.\n\t\t// This means we need complex loop workarounds, and we must detect this via CFG analysis.\n\t\tnotify_variable_access(args[1], current_block->self);\n\n\t\t// The result of an access chain is a fixed expression and is not really considered a temporary.\n\t\tauto &e = compiler.set<SPIRExpression>(args[1], \"\", args[0], true);\n\t\tauto *backing_variable = compiler.maybe_get_backing_variable(ptr);\n\t\te.loaded_from = backing_variable ? VariableID(backing_variable->self) : VariableID(0);\n\n\t\t// Other backends might use SPIRAccessChain for this later.\n\t\tcompiler.ir.ids[args[1]].set_allow_type_rewrite();\n\t\taccess_chain_expressions.insert(args[1]);\n\t\tbreak;\n\t}\n\n\tcase OpCopyMemory:\n\t{\n\t\tif (length < 2)\n\t\t\treturn false;\n\n\t\tID lhs = args[0];\n\t\tID rhs = args[1];\n\t\tauto *var = compiler.maybe_get_backing_variable(lhs);\n\n\t\t// If we store through an access chain, we have a partial write.\n\t\tif (var)\n\t\t{\n\t\t\taccessed_variables_to_block[var->self].insert(current_block->self);\n\t\t\tif (var->self == lhs)\n\t\t\t\tcomplete_write_variables_to_block[var->self].insert(current_block->self);\n\t\t\telse\n\t\t\t\tpartial_write_variables_to_block[var->self].insert(current_block->self);\n\t\t}\n\n\t\t// args[0:1] might be access chains we have to track use of.\n\t\tfor (uint32_t i = 0; i < 2; i++)\n\t\t\tnotify_variable_access(args[i], current_block->self);\n\n\t\tvar = compiler.maybe_get_backing_variable(rhs);\n\t\tif (var)\n\t\t\taccessed_variables_to_block[var->self].insert(current_block->self);\n\t\tbreak;\n\t}\n\n\tcase OpCopyObject:\n\t{\n\t\tif (length < 3)\n\t\t\treturn false;\n\n\t\tauto *var = compiler.maybe_get_backing_variable(args[2]);\n\t\tif (var)\n\t\t\taccessed_variables_to_block[var->self].insert(current_block->self);\n\n\t\t// Might be an access chain which we have to keep track of.\n\t\tnotify_variable_access(args[1], current_block->self);\n\t\tif (access_chain_expressions.count(args[2]))\n\t\t\taccess_chain_expressions.insert(args[1]);\n\n\t\t// Might try to copy a Phi variable here.\n\t\tnotify_variable_access(args[2], current_block->self);\n\t\tbreak;\n\t}\n\n\tcase OpLoad:\n\t{\n\t\tif (length < 3)\n\t\t\treturn false;\n\t\tuint32_t ptr = args[2];\n\t\tauto *var = compiler.maybe_get_backing_variable(ptr);\n\t\tif (var)\n\t\t\taccessed_variables_to_block[var->self].insert(current_block->self);\n\n\t\t// Loaded value is a temporary.\n\t\tnotify_variable_access(args[1], current_block->self);\n\n\t\t// Might be an access chain we have to track use of.\n\t\tnotify_variable_access(args[2], current_block->self);\n\n\t\t// If we're loading an opaque type we cannot lower it to a temporary,\n\t\t// we must defer access of args[2] until it's used.\n\t\tauto &type = compiler.get<SPIRType>(args[0]);\n\t\tif (compiler.type_is_opaque_value(type))\n\t\t\trvalue_forward_children[args[1]].insert(args[2]);\n\t\tbreak;\n\t}\n\n\tcase OpFunctionCall:\n\t{\n\t\tif (length < 3)\n\t\t\treturn false;\n\n\t\t// Return value may be a temporary.\n\t\tif (compiler.get_type(args[0]).basetype != SPIRType::Void)\n\t\t\tnotify_variable_access(args[1], current_block->self);\n\n\t\tlength -= 3;\n\t\targs += 3;\n\n\t\tfor (uint32_t i = 0; i < length; i++)\n\t\t{\n\t\t\tauto *var = compiler.maybe_get_backing_variable(args[i]);\n\t\t\tif (var)\n\t\t\t{\n\t\t\t\taccessed_variables_to_block[var->self].insert(current_block->self);\n\t\t\t\t// Assume we can get partial writes to this variable.\n\t\t\t\tpartial_write_variables_to_block[var->self].insert(current_block->self);\n\t\t\t}\n\n\t\t\t// Cannot easily prove if argument we pass to a function is completely written.\n\t\t\t// Usually, functions write to a dummy variable,\n\t\t\t// which is then copied to in full to the real argument.\n\n\t\t\t// Might try to copy a Phi variable here.\n\t\t\tnotify_variable_access(args[i], current_block->self);\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpSelect:\n\t{\n\t\t// In case of variable pointers, we might access a variable here.\n\t\t// We cannot prove anything about these accesses however.\n\t\tfor (uint32_t i = 1; i < length; i++)\n\t\t{\n\t\t\tif (i >= 3)\n\t\t\t{\n\t\t\t\tauto *var = compiler.maybe_get_backing_variable(args[i]);\n\t\t\t\tif (var)\n\t\t\t\t{\n\t\t\t\t\taccessed_variables_to_block[var->self].insert(current_block->self);\n\t\t\t\t\t// Assume we can get partial writes to this variable.\n\t\t\t\t\tpartial_write_variables_to_block[var->self].insert(current_block->self);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Might try to copy a Phi variable here.\n\t\t\tnotify_variable_access(args[i], current_block->self);\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpExtInst:\n\t{\n\t\tfor (uint32_t i = 4; i < length; i++)\n\t\t\tnotify_variable_access(args[i], current_block->self);\n\t\tnotify_variable_access(args[1], current_block->self);\n\n\t\tuint32_t extension_set = args[2];\n\t\tif (compiler.get<SPIRExtension>(extension_set).ext == SPIRExtension::GLSL)\n\t\t{\n\t\t\tauto op_450 = static_cast<GLSLstd450>(args[3]);\n\t\t\tswitch (op_450)\n\t\t\t{\n\t\t\tcase GLSLstd450Modf:\n\t\t\tcase GLSLstd450Frexp:\n\t\t\t{\n\t\t\t\tuint32_t ptr = args[5];\n\t\t\t\tauto *var = compiler.maybe_get_backing_variable(ptr);\n\t\t\t\tif (var)\n\t\t\t\t{\n\t\t\t\t\taccessed_variables_to_block[var->self].insert(current_block->self);\n\t\t\t\t\tif (var->self == ptr)\n\t\t\t\t\t\tcomplete_write_variables_to_block[var->self].insert(current_block->self);\n\t\t\t\t\telse\n\t\t\t\t\t\tpartial_write_variables_to_block[var->self].insert(current_block->self);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpArrayLength:\n\t\t// Only result is a temporary.\n\t\tnotify_variable_access(args[1], current_block->self);\n\t\tbreak;\n\n\tcase OpLine:\n\tcase OpNoLine:\n\t\t// Uses literals, but cannot be a phi variable or temporary, so ignore.\n\t\tbreak;\n\n\t\t// Atomics shouldn't be able to access function-local variables.\n\t\t// Some GLSL builtins access a pointer.\n\n\tcase OpCompositeInsert:\n\tcase OpVectorShuffle:\n\t\t// Specialize for opcode which contains literals.\n\t\tfor (uint32_t i = 1; i < 4; i++)\n\t\t\tnotify_variable_access(args[i], current_block->self);\n\t\tbreak;\n\n\tcase OpCompositeExtract:\n\t\t// Specialize for opcode which contains literals.\n\t\tfor (uint32_t i = 1; i < 3; i++)\n\t\t\tnotify_variable_access(args[i], current_block->self);\n\t\tbreak;\n\n\tcase OpImageWrite:\n\t\tfor (uint32_t i = 0; i < length; i++)\n\t\t{\n\t\t\t// Argument 3 is a literal.\n\t\t\tif (i != 3)\n\t\t\t\tnotify_variable_access(args[i], current_block->self);\n\t\t}\n\t\tbreak;\n\n\tcase OpImageSampleImplicitLod:\n\tcase OpImageSampleExplicitLod:\n\tcase OpImageSparseSampleImplicitLod:\n\tcase OpImageSparseSampleExplicitLod:\n\tcase OpImageSampleProjImplicitLod:\n\tcase OpImageSampleProjExplicitLod:\n\tcase OpImageSparseSampleProjImplicitLod:\n\tcase OpImageSparseSampleProjExplicitLod:\n\tcase OpImageFetch:\n\tcase OpImageSparseFetch:\n\tcase OpImageRead:\n\tcase OpImageSparseRead:\n\t\tfor (uint32_t i = 1; i < length; i++)\n\t\t{\n\t\t\t// Argument 4 is a literal.\n\t\t\tif (i != 4)\n\t\t\t\tnotify_variable_access(args[i], current_block->self);\n\t\t}\n\t\tbreak;\n\n\tcase OpImageSampleDrefImplicitLod:\n\tcase OpImageSampleDrefExplicitLod:\n\tcase OpImageSparseSampleDrefImplicitLod:\n\tcase OpImageSparseSampleDrefExplicitLod:\n\tcase OpImageSampleProjDrefImplicitLod:\n\tcase OpImageSampleProjDrefExplicitLod:\n\tcase OpImageSparseSampleProjDrefImplicitLod:\n\tcase OpImageSparseSampleProjDrefExplicitLod:\n\tcase OpImageGather:\n\tcase OpImageSparseGather:\n\tcase OpImageDrefGather:\n\tcase OpImageSparseDrefGather:\n\t\tfor (uint32_t i = 1; i < length; i++)\n\t\t{\n\t\t\t// Argument 5 is a literal.\n\t\t\tif (i != 5)\n\t\t\t\tnotify_variable_access(args[i], current_block->self);\n\t\t}\n\t\tbreak;\n\n\tdefault:\n\t{\n\t\t// Rather dirty way of figuring out where Phi variables are used.\n\t\t// As long as only IDs are used, we can scan through instructions and try to find any evidence that\n\t\t// the ID of a variable has been used.\n\t\t// There are potential false positives here where a literal is used in-place of an ID,\n\t\t// but worst case, it does not affect the correctness of the compile.\n\t\t// Exhaustive analysis would be better here, but it's not worth it for now.\n\t\tfor (uint32_t i = 0; i < length; i++)\n\t\t\tnotify_variable_access(args[i], current_block->self);\n\t\tbreak;\n\t}\n\t}\n\treturn true;\n}\n\nCompiler::StaticExpressionAccessHandler::StaticExpressionAccessHandler(Compiler &compiler_, uint32_t variable_id_)\n    : compiler(compiler_)\n    , variable_id(variable_id_)\n{\n}\n\nbool Compiler::StaticExpressionAccessHandler::follow_function_call(const SPIRFunction &)\n{\n\treturn false;\n}\n\nbool Compiler::StaticExpressionAccessHandler::handle(spv::Op op, const uint32_t *args, uint32_t length)\n{\n\tswitch (op)\n\t{\n\tcase OpStore:\n\t\tif (length < 2)\n\t\t\treturn false;\n\t\tif (args[0] == variable_id)\n\t\t{\n\t\t\tstatic_expression = args[1];\n\t\t\twrite_count++;\n\t\t}\n\t\tbreak;\n\n\tcase OpLoad:\n\t\tif (length < 3)\n\t\t\treturn false;\n\t\tif (args[2] == variable_id && static_expression == 0) // Tried to read from variable before it was initialized.\n\t\t\treturn false;\n\t\tbreak;\n\n\tcase OpAccessChain:\n\tcase OpInBoundsAccessChain:\n\tcase OpPtrAccessChain:\n\t\tif (length < 3)\n\t\t\treturn false;\n\t\tif (args[2] == variable_id) // If we try to access chain our candidate variable before we store to it, bail.\n\t\t\treturn false;\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn true;\n}\n\nvoid Compiler::find_function_local_luts(SPIRFunction &entry, const AnalyzeVariableScopeAccessHandler &handler,\n                                        bool single_function)\n{\n\tauto &cfg = *function_cfgs.find(entry.self)->second;\n\n\t// For each variable which is statically accessed.\n\tfor (auto &accessed_var : handler.accessed_variables_to_block)\n\t{\n\t\tauto &blocks = accessed_var.second;\n\t\tauto &var = get<SPIRVariable>(accessed_var.first);\n\t\tauto &type = expression_type(accessed_var.first);\n\n\t\t// Only consider function local variables here.\n\t\t// If we only have a single function in our CFG, private storage is also fine,\n\t\t// since it behaves like a function local variable.\n\t\tbool allow_lut = var.storage == StorageClassFunction || (single_function && var.storage == StorageClassPrivate);\n\t\tif (!allow_lut)\n\t\t\tcontinue;\n\n\t\t// We cannot be a phi variable.\n\t\tif (var.phi_variable)\n\t\t\tcontinue;\n\n\t\t// Only consider arrays here.\n\t\tif (type.array.empty())\n\t\t\tcontinue;\n\n\t\t// If the variable has an initializer, make sure it is a constant expression.\n\t\tuint32_t static_constant_expression = 0;\n\t\tif (var.initializer)\n\t\t{\n\t\t\tif (ir.ids[var.initializer].get_type() != TypeConstant)\n\t\t\t\tcontinue;\n\t\t\tstatic_constant_expression = var.initializer;\n\n\t\t\t// There can be no stores to this variable, we have now proved we have a LUT.\n\t\t\tif (handler.complete_write_variables_to_block.count(var.self) != 0 ||\n\t\t\t    handler.partial_write_variables_to_block.count(var.self) != 0)\n\t\t\t\tcontinue;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// We can have one, and only one write to the variable, and that write needs to be a constant.\n\n\t\t\t// No partial writes allowed.\n\t\t\tif (handler.partial_write_variables_to_block.count(var.self) != 0)\n\t\t\t\tcontinue;\n\n\t\t\tauto itr = handler.complete_write_variables_to_block.find(var.self);\n\n\t\t\t// No writes?\n\t\t\tif (itr == end(handler.complete_write_variables_to_block))\n\t\t\t\tcontinue;\n\n\t\t\t// We write to the variable in more than one block.\n\t\t\tauto &write_blocks = itr->second;\n\t\t\tif (write_blocks.size() != 1)\n\t\t\t\tcontinue;\n\n\t\t\t// The write needs to happen in the dominating block.\n\t\t\tDominatorBuilder builder(cfg);\n\t\t\tfor (auto &block : blocks)\n\t\t\t\tbuilder.add_block(block);\n\t\t\tuint32_t dominator = builder.get_dominator();\n\n\t\t\t// The complete write happened in a branch or similar, cannot deduce static expression.\n\t\t\tif (write_blocks.count(dominator) == 0)\n\t\t\t\tcontinue;\n\n\t\t\t// Find the static expression for this variable.\n\t\t\tStaticExpressionAccessHandler static_expression_handler(*this, var.self);\n\t\t\ttraverse_all_reachable_opcodes(get<SPIRBlock>(dominator), static_expression_handler);\n\n\t\t\t// We want one, and exactly one write\n\t\t\tif (static_expression_handler.write_count != 1 || static_expression_handler.static_expression == 0)\n\t\t\t\tcontinue;\n\n\t\t\t// Is it a constant expression?\n\t\t\tif (ir.ids[static_expression_handler.static_expression].get_type() != TypeConstant)\n\t\t\t\tcontinue;\n\n\t\t\t// We found a LUT!\n\t\t\tstatic_constant_expression = static_expression_handler.static_expression;\n\t\t}\n\n\t\tget<SPIRConstant>(static_constant_expression).is_used_as_lut = true;\n\t\tvar.static_expression = static_constant_expression;\n\t\tvar.statically_assigned = true;\n\t\tvar.remapped_variable = true;\n\t}\n}\n\nvoid Compiler::analyze_variable_scope(SPIRFunction &entry, AnalyzeVariableScopeAccessHandler &handler)\n{\n\t// First, we map out all variable access within a function.\n\t// Essentially a map of block -> { variables accessed in the basic block }\n\ttraverse_all_reachable_opcodes(entry, handler);\n\n\tauto &cfg = *function_cfgs.find(entry.self)->second;\n\n\t// Analyze if there are parameters which need to be implicitly preserved with an \"in\" qualifier.\n\tanalyze_parameter_preservation(entry, cfg, handler.accessed_variables_to_block,\n\t                               handler.complete_write_variables_to_block);\n\n\tunordered_map<uint32_t, uint32_t> potential_loop_variables;\n\n\t// Find the loop dominator block for each block.\n\tfor (auto &block_id : entry.blocks)\n\t{\n\t\tauto &block = get<SPIRBlock>(block_id);\n\n\t\tauto itr = ir.continue_block_to_loop_header.find(block_id);\n\t\tif (itr != end(ir.continue_block_to_loop_header) && itr->second != block_id)\n\t\t{\n\t\t\t// Continue block might be unreachable in the CFG, but we still like to know the loop dominator.\n\t\t\t// Edge case is when continue block is also the loop header, don't set the dominator in this case.\n\t\t\tblock.loop_dominator = itr->second;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tuint32_t loop_dominator = cfg.find_loop_dominator(block_id);\n\t\t\tif (loop_dominator != block_id)\n\t\t\t\tblock.loop_dominator = loop_dominator;\n\t\t\telse\n\t\t\t\tblock.loop_dominator = SPIRBlock::NoDominator;\n\t\t}\n\t}\n\n\t// For each variable which is statically accessed.\n\tfor (auto &var : handler.accessed_variables_to_block)\n\t{\n\t\t// Only deal with variables which are considered local variables in this function.\n\t\tif (find(begin(entry.local_variables), end(entry.local_variables), VariableID(var.first)) ==\n\t\t    end(entry.local_variables))\n\t\t\tcontinue;\n\n\t\tDominatorBuilder builder(cfg);\n\t\tauto &blocks = var.second;\n\t\tauto &type = expression_type(var.first);\n\t\tBlockID potential_continue_block = 0;\n\n\t\t// Figure out which block is dominating all accesses of those variables.\n\t\tfor (auto &block : blocks)\n\t\t{\n\t\t\t// If we're accessing a variable inside a continue block, this variable might be a loop variable.\n\t\t\t// We can only use loop variables with scalars, as we cannot track static expressions for vectors.\n\t\t\tif (is_continue(block))\n\t\t\t{\n\t\t\t\t// Potentially awkward case to check for.\n\t\t\t\t// We might have a variable inside a loop, which is touched by the continue block,\n\t\t\t\t// but is not actually a loop variable.\n\t\t\t\t// The continue block is dominated by the inner part of the loop, which does not make sense in high-level\n\t\t\t\t// language output because it will be declared before the body,\n\t\t\t\t// so we will have to lift the dominator up to the relevant loop header instead.\n\t\t\t\tbuilder.add_block(ir.continue_block_to_loop_header[block]);\n\n\t\t\t\t// Arrays or structs cannot be loop variables.\n\t\t\t\tif (type.vecsize == 1 && type.columns == 1 && type.basetype != SPIRType::Struct && type.array.empty())\n\t\t\t\t{\n\t\t\t\t\t// The variable is used in multiple continue blocks, this is not a loop\n\t\t\t\t\t// candidate, signal that by setting block to -1u.\n\t\t\t\t\tif (potential_continue_block == 0)\n\t\t\t\t\t\tpotential_continue_block = block;\n\t\t\t\t\telse\n\t\t\t\t\t\tpotential_continue_block = ~(0u);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbuilder.add_block(block);\n\t\t}\n\n\t\tbuilder.lift_continue_block_dominator();\n\n\t\t// Add it to a per-block list of variables.\n\t\tBlockID dominating_block = builder.get_dominator();\n\n\t\tif (dominating_block && potential_continue_block != 0 && potential_continue_block != ~0u)\n\t\t{\n\t\t\tauto &inner_block = get<SPIRBlock>(dominating_block);\n\n\t\t\tBlockID merge_candidate = 0;\n\n\t\t\t// Analyze the dominator. If it lives in a different loop scope than the candidate continue\n\t\t\t// block, reject the loop variable candidate.\n\t\t\tif (inner_block.merge == SPIRBlock::MergeLoop)\n\t\t\t\tmerge_candidate = inner_block.merge_block;\n\t\t\telse if (inner_block.loop_dominator != SPIRBlock::NoDominator)\n\t\t\t\tmerge_candidate = get<SPIRBlock>(inner_block.loop_dominator).merge_block;\n\n\t\t\tif (merge_candidate != 0 && cfg.is_reachable(merge_candidate))\n\t\t\t{\n\t\t\t\t// If the merge block has a higher post-visit order, we know that continue candidate\n\t\t\t\t// cannot reach the merge block, and we have two separate scopes.\n\t\t\t\tif (!cfg.is_reachable(potential_continue_block) ||\n\t\t\t\t    cfg.get_visit_order(merge_candidate) > cfg.get_visit_order(potential_continue_block))\n\t\t\t\t{\n\t\t\t\t\tpotential_continue_block = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (potential_continue_block != 0 && potential_continue_block != ~0u)\n\t\t\tpotential_loop_variables[var.first] = potential_continue_block;\n\n\t\t// For variables whose dominating block is inside a loop, there is a risk that these variables\n\t\t// actually need to be preserved across loop iterations. We can express this by adding\n\t\t// a \"read\" access to the loop header.\n\t\t// In the dominating block, we must see an OpStore or equivalent as the first access of an OpVariable.\n\t\t// Should that fail, we look for the outermost loop header and tack on an access there.\n\t\t// Phi nodes cannot have this problem.\n\t\tif (dominating_block)\n\t\t{\n\t\t\tauto &variable = get<SPIRVariable>(var.first);\n\t\t\tif (!variable.phi_variable)\n\t\t\t{\n\t\t\t\tauto *block = &get<SPIRBlock>(dominating_block);\n\t\t\t\tbool preserve = may_read_undefined_variable_in_block(*block, var.first);\n\t\t\t\tif (preserve)\n\t\t\t\t{\n\t\t\t\t\t// Find the outermost loop scope.\n\t\t\t\t\twhile (block->loop_dominator != BlockID(SPIRBlock::NoDominator))\n\t\t\t\t\t\tblock = &get<SPIRBlock>(block->loop_dominator);\n\n\t\t\t\t\tif (block->self != dominating_block)\n\t\t\t\t\t{\n\t\t\t\t\t\tbuilder.add_block(block->self);\n\t\t\t\t\t\tdominating_block = builder.get_dominator();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If all blocks here are dead code, this will be 0, so the variable in question\n\t\t// will be completely eliminated.\n\t\tif (dominating_block)\n\t\t{\n\t\t\tauto &block = get<SPIRBlock>(dominating_block);\n\t\t\tblock.dominated_variables.push_back(var.first);\n\t\t\tget<SPIRVariable>(var.first).dominator = dominating_block;\n\t\t}\n\t}\n\n\tfor (auto &var : handler.accessed_temporaries_to_block)\n\t{\n\t\tauto itr = handler.result_id_to_type.find(var.first);\n\n\t\tif (itr == end(handler.result_id_to_type))\n\t\t{\n\t\t\t// We found a false positive ID being used, ignore.\n\t\t\t// This should probably be an assert.\n\t\t\tcontinue;\n\t\t}\n\n\t\t// There is no point in doing domination analysis for opaque types.\n\t\tauto &type = get<SPIRType>(itr->second);\n\t\tif (type_is_opaque_value(type))\n\t\t\tcontinue;\n\n\t\tDominatorBuilder builder(cfg);\n\t\tbool force_temporary = false;\n\t\tbool used_in_header_hoisted_continue_block = false;\n\n\t\t// Figure out which block is dominating all accesses of those temporaries.\n\t\tauto &blocks = var.second;\n\t\tfor (auto &block : blocks)\n\t\t{\n\t\t\tbuilder.add_block(block);\n\n\t\t\tif (blocks.size() != 1 && is_continue(block))\n\t\t\t{\n\t\t\t\t// The risk here is that inner loop can dominate the continue block.\n\t\t\t\t// Any temporary we access in the continue block must be declared before the loop.\n\t\t\t\t// This is moot for complex loops however.\n\t\t\t\tauto &loop_header_block = get<SPIRBlock>(ir.continue_block_to_loop_header[block]);\n\t\t\t\tassert(loop_header_block.merge == SPIRBlock::MergeLoop);\n\t\t\t\tbuilder.add_block(loop_header_block.self);\n\t\t\t\tused_in_header_hoisted_continue_block = true;\n\t\t\t}\n\t\t}\n\n\t\tuint32_t dominating_block = builder.get_dominator();\n\n\t\tif (blocks.size() != 1 && is_single_block_loop(dominating_block))\n\t\t{\n\t\t\t// Awkward case, because the loop header is also the continue block,\n\t\t\t// so hoisting to loop header does not help.\n\t\t\tforce_temporary = true;\n\t\t}\n\n\t\tif (dominating_block)\n\t\t{\n\t\t\t// If we touch a variable in the dominating block, this is the expected setup.\n\t\t\t// SPIR-V normally mandates this, but we have extra cases for temporary use inside loops.\n\t\t\tbool first_use_is_dominator = blocks.count(dominating_block) != 0;\n\n\t\t\tif (!first_use_is_dominator || force_temporary)\n\t\t\t{\n\t\t\t\tif (handler.access_chain_expressions.count(var.first))\n\t\t\t\t{\n\t\t\t\t\t// Exceptionally rare case.\n\t\t\t\t\t// We cannot declare temporaries of access chains (except on MSL perhaps with pointers).\n\t\t\t\t\t// Rather than do that, we force the indexing expressions to be declared in the right scope by\n\t\t\t\t\t// tracking their usage to that end. There is no temporary to hoist.\n\t\t\t\t\t// However, we still need to observe declaration order of the access chain.\n\n\t\t\t\t\tif (used_in_header_hoisted_continue_block)\n\t\t\t\t\t{\n\t\t\t\t\t\t// For this scenario, we used an access chain inside a continue block where we also registered an access to header block.\n\t\t\t\t\t\t// This is a problem as we need to declare an access chain properly first with full definition.\n\t\t\t\t\t\t// We cannot use temporaries for these expressions,\n\t\t\t\t\t\t// so we must make sure the access chain is declared ahead of time.\n\t\t\t\t\t\t// Force a complex for loop to deal with this.\n\t\t\t\t\t\t// TODO: Out-of-order declaring for loops where continue blocks are emitted last might be another option.\n\t\t\t\t\t\tauto &loop_header_block = get<SPIRBlock>(dominating_block);\n\t\t\t\t\t\tassert(loop_header_block.merge == SPIRBlock::MergeLoop);\n\t\t\t\t\t\tloop_header_block.complex_continue = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// This should be very rare, but if we try to declare a temporary inside a loop,\n\t\t\t\t\t// and that temporary is used outside the loop as well (spirv-opt inliner likes this)\n\t\t\t\t\t// we should actually emit the temporary outside the loop.\n\t\t\t\t\thoisted_temporaries.insert(var.first);\n\t\t\t\t\tforced_temporaries.insert(var.first);\n\n\t\t\t\t\tauto &block_temporaries = get<SPIRBlock>(dominating_block).declare_temporary;\n\t\t\t\t\tblock_temporaries.emplace_back(handler.result_id_to_type[var.first], var.first);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (blocks.size() > 1)\n\t\t\t{\n\t\t\t\t// Keep track of the temporary as we might have to declare this temporary.\n\t\t\t\t// This can happen if the loop header dominates a temporary, but we have a complex fallback loop.\n\t\t\t\t// In this case, the header is actually inside the for (;;) {} block, and we have problems.\n\t\t\t\t// What we need to do is hoist the temporaries outside the for (;;) {} block in case the header block\n\t\t\t\t// declares the temporary.\n\t\t\t\tauto &block_temporaries = get<SPIRBlock>(dominating_block).potential_declare_temporary;\n\t\t\t\tblock_temporaries.emplace_back(handler.result_id_to_type[var.first], var.first);\n\t\t\t}\n\t\t}\n\t}\n\n\tunordered_set<uint32_t> seen_blocks;\n\n\t// Now, try to analyze whether or not these variables are actually loop variables.\n\tfor (auto &loop_variable : potential_loop_variables)\n\t{\n\t\tauto &var = get<SPIRVariable>(loop_variable.first);\n\t\tauto dominator = var.dominator;\n\t\tBlockID block = loop_variable.second;\n\n\t\t// The variable was accessed in multiple continue blocks, ignore.\n\t\tif (block == BlockID(~(0u)) || block == BlockID(0))\n\t\t\tcontinue;\n\n\t\t// Dead code.\n\t\tif (dominator == ID(0))\n\t\t\tcontinue;\n\n\t\tBlockID header = 0;\n\n\t\t// Find the loop header for this block if we are a continue block.\n\t\t{\n\t\t\tauto itr = ir.continue_block_to_loop_header.find(block);\n\t\t\tif (itr != end(ir.continue_block_to_loop_header))\n\t\t\t{\n\t\t\t\theader = itr->second;\n\t\t\t}\n\t\t\telse if (get<SPIRBlock>(block).continue_block == block)\n\t\t\t{\n\t\t\t\t// Also check for self-referential continue block.\n\t\t\t\theader = block;\n\t\t\t}\n\t\t}\n\n\t\tassert(header);\n\t\tauto &header_block = get<SPIRBlock>(header);\n\t\tauto &blocks = handler.accessed_variables_to_block[loop_variable.first];\n\n\t\t// If a loop variable is not used before the loop, it's probably not a loop variable.\n\t\tbool has_accessed_variable = blocks.count(header) != 0;\n\n\t\t// Now, there are two conditions we need to meet for the variable to be a loop variable.\n\t\t// 1. The dominating block must have a branch-free path to the loop header,\n\t\t// this way we statically know which expression should be part of the loop variable initializer.\n\n\t\t// Walk from the dominator, if there is one straight edge connecting\n\t\t// dominator and loop header, we statically know the loop initializer.\n\t\tbool static_loop_init = true;\n\t\twhile (dominator != header)\n\t\t{\n\t\t\tif (blocks.count(dominator) != 0)\n\t\t\t\thas_accessed_variable = true;\n\n\t\t\tauto &succ = cfg.get_succeeding_edges(dominator);\n\t\t\tif (succ.size() != 1)\n\t\t\t{\n\t\t\t\tstatic_loop_init = false;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tauto &pred = cfg.get_preceding_edges(succ.front());\n\t\t\tif (pred.size() != 1 || pred.front() != dominator)\n\t\t\t{\n\t\t\t\tstatic_loop_init = false;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdominator = succ.front();\n\t\t}\n\n\t\tif (!static_loop_init || !has_accessed_variable)\n\t\t\tcontinue;\n\n\t\t// The second condition we need to meet is that no access after the loop\n\t\t// merge can occur. Walk the CFG to see if we find anything.\n\n\t\tseen_blocks.clear();\n\t\tcfg.walk_from(seen_blocks, header_block.merge_block, [&](uint32_t walk_block) -> bool {\n\t\t\t// We found a block which accesses the variable outside the loop.\n\t\t\tif (blocks.find(walk_block) != end(blocks))\n\t\t\t\tstatic_loop_init = false;\n\t\t\treturn true;\n\t\t});\n\n\t\tif (!static_loop_init)\n\t\t\tcontinue;\n\n\t\t// We have a loop variable.\n\t\theader_block.loop_variables.push_back(loop_variable.first);\n\t\t// Need to sort here as variables come from an unordered container, and pushing stuff in wrong order\n\t\t// will break reproducability in regression runs.\n\t\tsort(begin(header_block.loop_variables), end(header_block.loop_variables));\n\t\tget<SPIRVariable>(loop_variable.first).loop_variable = true;\n\t}\n}\n\nbool Compiler::may_read_undefined_variable_in_block(const SPIRBlock &block, uint32_t var)\n{\n\tfor (auto &op : block.ops)\n\t{\n\t\tauto *ops = stream(op);\n\t\tswitch (op.op)\n\t\t{\n\t\tcase OpStore:\n\t\tcase OpCopyMemory:\n\t\t\tif (ops[0] == var)\n\t\t\t\treturn false;\n\t\t\tbreak;\n\n\t\tcase OpAccessChain:\n\t\tcase OpInBoundsAccessChain:\n\t\tcase OpPtrAccessChain:\n\t\t\t// Access chains are generally used to partially read and write. It's too hard to analyze\n\t\t\t// if all constituents are written fully before continuing, so just assume it's preserved.\n\t\t\t// This is the same as the parameter preservation analysis.\n\t\t\tif (ops[2] == var)\n\t\t\t\treturn true;\n\t\t\tbreak;\n\n\t\tcase OpSelect:\n\t\t\t// Variable pointers.\n\t\t\t// We might read before writing.\n\t\t\tif (ops[3] == var || ops[4] == var)\n\t\t\t\treturn true;\n\t\t\tbreak;\n\n\t\tcase OpPhi:\n\t\t{\n\t\t\t// Variable pointers.\n\t\t\t// We might read before writing.\n\t\t\tif (op.length < 2)\n\t\t\t\tbreak;\n\n\t\t\tuint32_t count = op.length - 2;\n\t\t\tfor (uint32_t i = 0; i < count; i += 2)\n\t\t\t\tif (ops[i + 2] == var)\n\t\t\t\t\treturn true;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase OpCopyObject:\n\t\tcase OpLoad:\n\t\t\tif (ops[2] == var)\n\t\t\t\treturn true;\n\t\t\tbreak;\n\n\t\tcase OpFunctionCall:\n\t\t{\n\t\t\tif (op.length < 3)\n\t\t\t\tbreak;\n\n\t\t\t// May read before writing.\n\t\t\tuint32_t count = op.length - 3;\n\t\t\tfor (uint32_t i = 0; i < count; i++)\n\t\t\t\tif (ops[i + 3] == var)\n\t\t\t\t\treturn true;\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Not accessed somehow, at least not in a usual fashion.\n\t// It's likely accessed in a branch, so assume we must preserve.\n\treturn true;\n}\n\nBitset Compiler::get_buffer_block_flags(VariableID id) const\n{\n\treturn ir.get_buffer_block_flags(get<SPIRVariable>(id));\n}\n\nbool Compiler::get_common_basic_type(const SPIRType &type, SPIRType::BaseType &base_type)\n{\n\tif (type.basetype == SPIRType::Struct)\n\t{\n\t\tbase_type = SPIRType::Unknown;\n\t\tfor (auto &member_type : type.member_types)\n\t\t{\n\t\t\tSPIRType::BaseType member_base;\n\t\t\tif (!get_common_basic_type(get<SPIRType>(member_type), member_base))\n\t\t\t\treturn false;\n\n\t\t\tif (base_type == SPIRType::Unknown)\n\t\t\t\tbase_type = member_base;\n\t\t\telse if (base_type != member_base)\n\t\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\telse\n\t{\n\t\tbase_type = type.basetype;\n\t\treturn true;\n\t}\n}\n\nvoid Compiler::ActiveBuiltinHandler::handle_builtin(const SPIRType &type, BuiltIn builtin,\n                                                    const Bitset &decoration_flags)\n{\n\t// If used, we will need to explicitly declare a new array size for these builtins.\n\n\tif (builtin == BuiltInClipDistance)\n\t{\n\t\tif (!type.array_size_literal[0])\n\t\t\tSPIRV_CROSS_THROW(\"Array size for ClipDistance must be a literal.\");\n\t\tuint32_t array_size = type.array[0];\n\t\tif (array_size == 0)\n\t\t\tSPIRV_CROSS_THROW(\"Array size for ClipDistance must not be unsized.\");\n\t\tcompiler.clip_distance_count = array_size;\n\t}\n\telse if (builtin == BuiltInCullDistance)\n\t{\n\t\tif (!type.array_size_literal[0])\n\t\t\tSPIRV_CROSS_THROW(\"Array size for CullDistance must be a literal.\");\n\t\tuint32_t array_size = type.array[0];\n\t\tif (array_size == 0)\n\t\t\tSPIRV_CROSS_THROW(\"Array size for CullDistance must not be unsized.\");\n\t\tcompiler.cull_distance_count = array_size;\n\t}\n\telse if (builtin == BuiltInPosition)\n\t{\n\t\tif (decoration_flags.get(DecorationInvariant))\n\t\t\tcompiler.position_invariant = true;\n\t}\n}\n\nvoid Compiler::ActiveBuiltinHandler::add_if_builtin(uint32_t id, bool allow_blocks)\n{\n\t// Only handle plain variables here.\n\t// Builtins which are part of a block are handled in AccessChain.\n\t// If allow_blocks is used however, this is to handle initializers of blocks,\n\t// which implies that all members are written to.\n\n\tauto *var = compiler.maybe_get<SPIRVariable>(id);\n\tauto *m = compiler.ir.find_meta(id);\n\tif (var && m)\n\t{\n\t\tauto &type = compiler.get<SPIRType>(var->basetype);\n\t\tauto &decorations = m->decoration;\n\t\tauto &flags = type.storage == StorageClassInput ?\n\t\t              compiler.active_input_builtins : compiler.active_output_builtins;\n\t\tif (decorations.builtin)\n\t\t{\n\t\t\tflags.set(decorations.builtin_type);\n\t\t\thandle_builtin(type, decorations.builtin_type, decorations.decoration_flags);\n\t\t}\n\t\telse if (allow_blocks && compiler.has_decoration(type.self, DecorationBlock))\n\t\t{\n\t\t\tuint32_t member_count = uint32_t(type.member_types.size());\n\t\t\tfor (uint32_t i = 0; i < member_count; i++)\n\t\t\t{\n\t\t\t\tif (compiler.has_member_decoration(type.self, i, DecorationBuiltIn))\n\t\t\t\t{\n\t\t\t\t\tauto &member_type = compiler.get<SPIRType>(type.member_types[i]);\n\t\t\t\t\tBuiltIn builtin = BuiltIn(compiler.get_member_decoration(type.self, i, DecorationBuiltIn));\n\t\t\t\t\tflags.set(builtin);\n\t\t\t\t\thandle_builtin(member_type, builtin, compiler.get_member_decoration_bitset(type.self, i));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid Compiler::ActiveBuiltinHandler::add_if_builtin(uint32_t id)\n{\n\tadd_if_builtin(id, false);\n}\n\nvoid Compiler::ActiveBuiltinHandler::add_if_builtin_or_block(uint32_t id)\n{\n\tadd_if_builtin(id, true);\n}\n\nbool Compiler::ActiveBuiltinHandler::handle(spv::Op opcode, const uint32_t *args, uint32_t length)\n{\n\tswitch (opcode)\n\t{\n\tcase OpStore:\n\t\tif (length < 1)\n\t\t\treturn false;\n\n\t\tadd_if_builtin(args[0]);\n\t\tbreak;\n\n\tcase OpCopyMemory:\n\t\tif (length < 2)\n\t\t\treturn false;\n\n\t\tadd_if_builtin(args[0]);\n\t\tadd_if_builtin(args[1]);\n\t\tbreak;\n\n\tcase OpCopyObject:\n\tcase OpLoad:\n\t\tif (length < 3)\n\t\t\treturn false;\n\n\t\tadd_if_builtin(args[2]);\n\t\tbreak;\n\n\tcase OpSelect:\n\t\tif (length < 5)\n\t\t\treturn false;\n\n\t\tadd_if_builtin(args[3]);\n\t\tadd_if_builtin(args[4]);\n\t\tbreak;\n\n\tcase OpPhi:\n\t{\n\t\tif (length < 2)\n\t\t\treturn false;\n\n\t\tuint32_t count = length - 2;\n\t\targs += 2;\n\t\tfor (uint32_t i = 0; i < count; i += 2)\n\t\t\tadd_if_builtin(args[i]);\n\t\tbreak;\n\t}\n\n\tcase OpFunctionCall:\n\t{\n\t\tif (length < 3)\n\t\t\treturn false;\n\n\t\tuint32_t count = length - 3;\n\t\targs += 3;\n\t\tfor (uint32_t i = 0; i < count; i++)\n\t\t\tadd_if_builtin(args[i]);\n\t\tbreak;\n\t}\n\n\tcase OpAccessChain:\n\tcase OpInBoundsAccessChain:\n\tcase OpPtrAccessChain:\n\t{\n\t\tif (length < 4)\n\t\t\treturn false;\n\n\t\t// Only consider global variables, cannot consider variables in functions yet, or other\n\t\t// access chains as they have not been created yet.\n\t\tauto *var = compiler.maybe_get<SPIRVariable>(args[2]);\n\t\tif (!var)\n\t\t\tbreak;\n\n\t\t// Required if we access chain into builtins like gl_GlobalInvocationID.\n\t\tadd_if_builtin(args[2]);\n\n\t\t// Start traversing type hierarchy at the proper non-pointer types.\n\t\tauto *type = &compiler.get_variable_data_type(*var);\n\n\t\tauto &flags =\n\t\t    var->storage == StorageClassInput ? compiler.active_input_builtins : compiler.active_output_builtins;\n\n\t\tuint32_t count = length - 3;\n\t\targs += 3;\n\t\tfor (uint32_t i = 0; i < count; i++)\n\t\t{\n\t\t\t// Pointers\n\t\t\tif (opcode == OpPtrAccessChain && i == 0)\n\t\t\t{\n\t\t\t\ttype = &compiler.get<SPIRType>(type->parent_type);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Arrays\n\t\t\tif (!type->array.empty())\n\t\t\t{\n\t\t\t\ttype = &compiler.get<SPIRType>(type->parent_type);\n\t\t\t}\n\t\t\t// Structs\n\t\t\telse if (type->basetype == SPIRType::Struct)\n\t\t\t{\n\t\t\t\tuint32_t index = compiler.get<SPIRConstant>(args[i]).scalar();\n\n\t\t\t\tif (index < uint32_t(compiler.ir.meta[type->self].members.size()))\n\t\t\t\t{\n\t\t\t\t\tauto &decorations = compiler.ir.meta[type->self].members[index];\n\t\t\t\t\tif (decorations.builtin)\n\t\t\t\t\t{\n\t\t\t\t\t\tflags.set(decorations.builtin_type);\n\t\t\t\t\t\thandle_builtin(compiler.get<SPIRType>(type->member_types[index]), decorations.builtin_type,\n\t\t\t\t\t\t               decorations.decoration_flags);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\ttype = &compiler.get<SPIRType>(type->member_types[index]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// No point in traversing further. We won't find any extra builtins.\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\t}\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn true;\n}\n\nvoid Compiler::update_active_builtins()\n{\n\tactive_input_builtins.reset();\n\tactive_output_builtins.reset();\n\tcull_distance_count = 0;\n\tclip_distance_count = 0;\n\tActiveBuiltinHandler handler(*this);\n\ttraverse_all_reachable_opcodes(get<SPIRFunction>(ir.default_entry_point), handler);\n\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, const SPIRVariable &var) {\n\t\tif (var.storage != StorageClassOutput)\n\t\t\treturn;\n\t\tif (!interface_variable_exists_in_entry_point(var.self))\n\t\t\treturn;\n\n\t\t// Also, make sure we preserve output variables which are only initialized, but never accessed by any code.\n\t\tif (var.initializer != ID(0))\n\t\t\thandler.add_if_builtin_or_block(var.self);\n\t});\n}\n\n// Returns whether this shader uses a builtin of the storage class\nbool Compiler::has_active_builtin(BuiltIn builtin, StorageClass storage) const\n{\n\tconst Bitset *flags;\n\tswitch (storage)\n\t{\n\tcase StorageClassInput:\n\t\tflags = &active_input_builtins;\n\t\tbreak;\n\tcase StorageClassOutput:\n\t\tflags = &active_output_builtins;\n\t\tbreak;\n\n\tdefault:\n\t\treturn false;\n\t}\n\treturn flags->get(builtin);\n}\n\nvoid Compiler::analyze_image_and_sampler_usage()\n{\n\tCombinedImageSamplerDrefHandler dref_handler(*this);\n\ttraverse_all_reachable_opcodes(get<SPIRFunction>(ir.default_entry_point), dref_handler);\n\n\tCombinedImageSamplerUsageHandler handler(*this, dref_handler.dref_combined_samplers);\n\ttraverse_all_reachable_opcodes(get<SPIRFunction>(ir.default_entry_point), handler);\n\n\t// Need to run this traversal twice. First time, we propagate any comparison sampler usage from leaf functions\n\t// down to main().\n\t// In the second pass, we can propagate up forced depth state coming from main() up into leaf functions.\n\thandler.dependency_hierarchy.clear();\n\ttraverse_all_reachable_opcodes(get<SPIRFunction>(ir.default_entry_point), handler);\n\n\tcomparison_ids = std::move(handler.comparison_ids);\n\tneed_subpass_input = handler.need_subpass_input;\n\tneed_subpass_input_ms = handler.need_subpass_input_ms;\n\n\t// Forward information from separate images and samplers into combined image samplers.\n\tfor (auto &combined : combined_image_samplers)\n\t\tif (comparison_ids.count(combined.sampler_id))\n\t\t\tcomparison_ids.insert(combined.combined_id);\n}\n\nbool Compiler::CombinedImageSamplerDrefHandler::handle(spv::Op opcode, const uint32_t *args, uint32_t)\n{\n\t// Mark all sampled images which are used with Dref.\n\tswitch (opcode)\n\t{\n\tcase OpImageSampleDrefExplicitLod:\n\tcase OpImageSampleDrefImplicitLod:\n\tcase OpImageSampleProjDrefExplicitLod:\n\tcase OpImageSampleProjDrefImplicitLod:\n\tcase OpImageSparseSampleProjDrefImplicitLod:\n\tcase OpImageSparseSampleDrefImplicitLod:\n\tcase OpImageSparseSampleProjDrefExplicitLod:\n\tcase OpImageSparseSampleDrefExplicitLod:\n\tcase OpImageDrefGather:\n\tcase OpImageSparseDrefGather:\n\t\tdref_combined_samplers.insert(args[2]);\n\t\treturn true;\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn true;\n}\n\nconst CFG &Compiler::get_cfg_for_current_function() const\n{\n\tassert(current_function);\n\treturn get_cfg_for_function(current_function->self);\n}\n\nconst CFG &Compiler::get_cfg_for_function(uint32_t id) const\n{\n\tauto cfg_itr = function_cfgs.find(id);\n\tassert(cfg_itr != end(function_cfgs));\n\tassert(cfg_itr->second);\n\treturn *cfg_itr->second;\n}\n\nvoid Compiler::build_function_control_flow_graphs_and_analyze()\n{\n\tCFGBuilder handler(*this);\n\thandler.function_cfgs[ir.default_entry_point].reset(new CFG(*this, get<SPIRFunction>(ir.default_entry_point)));\n\ttraverse_all_reachable_opcodes(get<SPIRFunction>(ir.default_entry_point), handler);\n\tfunction_cfgs = std::move(handler.function_cfgs);\n\tbool single_function = function_cfgs.size() <= 1;\n\n\tfor (auto &f : function_cfgs)\n\t{\n\t\tauto &func = get<SPIRFunction>(f.first);\n\t\tAnalyzeVariableScopeAccessHandler scope_handler(*this, func);\n\t\tanalyze_variable_scope(func, scope_handler);\n\t\tfind_function_local_luts(func, scope_handler, single_function);\n\n\t\t// Check if we can actually use the loop variables we found in analyze_variable_scope.\n\t\t// To use multiple initializers, we need the same type and qualifiers.\n\t\tfor (auto block : func.blocks)\n\t\t{\n\t\t\tauto &b = get<SPIRBlock>(block);\n\t\t\tif (b.loop_variables.size() < 2)\n\t\t\t\tcontinue;\n\n\t\t\tauto &flags = get_decoration_bitset(b.loop_variables.front());\n\t\t\tuint32_t type = get<SPIRVariable>(b.loop_variables.front()).basetype;\n\t\t\tbool invalid_initializers = false;\n\t\t\tfor (auto loop_variable : b.loop_variables)\n\t\t\t{\n\t\t\t\tif (flags != get_decoration_bitset(loop_variable) ||\n\t\t\t\t    type != get<SPIRVariable>(b.loop_variables.front()).basetype)\n\t\t\t\t{\n\t\t\t\t\tinvalid_initializers = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (invalid_initializers)\n\t\t\t{\n\t\t\t\tfor (auto loop_variable : b.loop_variables)\n\t\t\t\t\tget<SPIRVariable>(loop_variable).loop_variable = false;\n\t\t\t\tb.loop_variables.clear();\n\t\t\t}\n\t\t}\n\t}\n}\n\nCompiler::CFGBuilder::CFGBuilder(Compiler &compiler_)\n    : compiler(compiler_)\n{\n}\n\nbool Compiler::CFGBuilder::handle(spv::Op, const uint32_t *, uint32_t)\n{\n\treturn true;\n}\n\nbool Compiler::CFGBuilder::follow_function_call(const SPIRFunction &func)\n{\n\tif (function_cfgs.find(func.self) == end(function_cfgs))\n\t{\n\t\tfunction_cfgs[func.self].reset(new CFG(compiler, func));\n\t\treturn true;\n\t}\n\telse\n\t\treturn false;\n}\n\nvoid Compiler::CombinedImageSamplerUsageHandler::add_dependency(uint32_t dst, uint32_t src)\n{\n\tdependency_hierarchy[dst].insert(src);\n\t// Propagate up any comparison state if we're loading from one such variable.\n\tif (comparison_ids.count(src))\n\t\tcomparison_ids.insert(dst);\n}\n\nbool Compiler::CombinedImageSamplerUsageHandler::begin_function_scope(const uint32_t *args, uint32_t length)\n{\n\tif (length < 3)\n\t\treturn false;\n\n\tauto &func = compiler.get<SPIRFunction>(args[2]);\n\tconst auto *arg = &args[3];\n\tlength -= 3;\n\n\tfor (uint32_t i = 0; i < length; i++)\n\t{\n\t\tauto &argument = func.arguments[i];\n\t\tadd_dependency(argument.id, arg[i]);\n\t}\n\n\treturn true;\n}\n\nvoid Compiler::CombinedImageSamplerUsageHandler::add_hierarchy_to_comparison_ids(uint32_t id)\n{\n\t// Traverse the variable dependency hierarchy and tag everything in its path with comparison ids.\n\tcomparison_ids.insert(id);\n\n\tfor (auto &dep_id : dependency_hierarchy[id])\n\t\tadd_hierarchy_to_comparison_ids(dep_id);\n}\n\nbool Compiler::CombinedImageSamplerUsageHandler::handle(Op opcode, const uint32_t *args, uint32_t length)\n{\n\tswitch (opcode)\n\t{\n\tcase OpAccessChain:\n\tcase OpInBoundsAccessChain:\n\tcase OpPtrAccessChain:\n\tcase OpLoad:\n\t{\n\t\tif (length < 3)\n\t\t\treturn false;\n\n\t\tadd_dependency(args[1], args[2]);\n\n\t\t// Ideally defer this to OpImageRead, but then we'd need to track loaded IDs.\n\t\t// If we load an image, we're going to use it and there is little harm in declaring an unused gl_FragCoord.\n\t\tauto &type = compiler.get<SPIRType>(args[0]);\n\t\tif (type.image.dim == DimSubpassData)\n\t\t{\n\t\t\tneed_subpass_input = true;\n\t\t\tif (type.image.ms)\n\t\t\t\tneed_subpass_input_ms = true;\n\t\t}\n\n\t\t// If we load a SampledImage and it will be used with Dref, propagate the state up.\n\t\tif (dref_combined_samplers.count(args[1]) != 0)\n\t\t\tadd_hierarchy_to_comparison_ids(args[1]);\n\t\tbreak;\n\t}\n\n\tcase OpSampledImage:\n\t{\n\t\tif (length < 4)\n\t\t\treturn false;\n\n\t\t// If the underlying resource has been used for comparison then duplicate loads of that resource must be too.\n\t\t// This image must be a depth image.\n\t\tuint32_t result_id = args[1];\n\t\tuint32_t image = args[2];\n\t\tuint32_t sampler = args[3];\n\n\t\tif (dref_combined_samplers.count(result_id) != 0)\n\t\t{\n\t\t\tadd_hierarchy_to_comparison_ids(image);\n\n\t\t\t// This sampler must be a SamplerComparisonState, and not a regular SamplerState.\n\t\t\tadd_hierarchy_to_comparison_ids(sampler);\n\n\t\t\t// Mark the OpSampledImage itself as being comparison state.\n\t\t\tcomparison_ids.insert(result_id);\n\t\t}\n\t\treturn true;\n\t}\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn true;\n}\n\nbool Compiler::buffer_is_hlsl_counter_buffer(VariableID id) const\n{\n\tauto *m = ir.find_meta(id);\n\treturn m && m->hlsl_is_magic_counter_buffer;\n}\n\nbool Compiler::buffer_get_hlsl_counter_buffer(VariableID id, uint32_t &counter_id) const\n{\n\tauto *m = ir.find_meta(id);\n\n\t// First, check for the proper decoration.\n\tif (m && m->hlsl_magic_counter_buffer != 0)\n\t{\n\t\tcounter_id = m->hlsl_magic_counter_buffer;\n\t\treturn true;\n\t}\n\telse\n\t\treturn false;\n}\n\nvoid Compiler::make_constant_null(uint32_t id, uint32_t type)\n{\n\tauto &constant_type = get<SPIRType>(type);\n\n\tif (constant_type.pointer)\n\t{\n\t\tauto &constant = set<SPIRConstant>(id, type);\n\t\tconstant.make_null(constant_type);\n\t}\n\telse if (!constant_type.array.empty())\n\t{\n\t\tassert(constant_type.parent_type);\n\t\tuint32_t parent_id = ir.increase_bound_by(1);\n\t\tmake_constant_null(parent_id, constant_type.parent_type);\n\n\t\tif (!constant_type.array_size_literal.back())\n\t\t\tSPIRV_CROSS_THROW(\"Array size of OpConstantNull must be a literal.\");\n\n\t\tSmallVector<uint32_t> elements(constant_type.array.back());\n\t\tfor (uint32_t i = 0; i < constant_type.array.back(); i++)\n\t\t\telements[i] = parent_id;\n\t\tset<SPIRConstant>(id, type, elements.data(), uint32_t(elements.size()), false);\n\t}\n\telse if (!constant_type.member_types.empty())\n\t{\n\t\tuint32_t member_ids = ir.increase_bound_by(uint32_t(constant_type.member_types.size()));\n\t\tSmallVector<uint32_t> elements(constant_type.member_types.size());\n\t\tfor (uint32_t i = 0; i < constant_type.member_types.size(); i++)\n\t\t{\n\t\t\tmake_constant_null(member_ids + i, constant_type.member_types[i]);\n\t\t\telements[i] = member_ids + i;\n\t\t}\n\t\tset<SPIRConstant>(id, type, elements.data(), uint32_t(elements.size()), false);\n\t}\n\telse\n\t{\n\t\tauto &constant = set<SPIRConstant>(id, type);\n\t\tconstant.make_null(constant_type);\n\t}\n}\n\nconst SmallVector<spv::Capability> &Compiler::get_declared_capabilities() const\n{\n\treturn ir.declared_capabilities;\n}\n\nconst SmallVector<std::string> &Compiler::get_declared_extensions() const\n{\n\treturn ir.declared_extensions;\n}\n\nstd::string Compiler::get_remapped_declared_block_name(VariableID id) const\n{\n\treturn get_remapped_declared_block_name(id, false);\n}\n\nstd::string Compiler::get_remapped_declared_block_name(uint32_t id, bool fallback_prefer_instance_name) const\n{\n\tauto itr = declared_block_names.find(id);\n\tif (itr != end(declared_block_names))\n\t{\n\t\treturn itr->second;\n\t}\n\telse\n\t{\n\t\tauto &var = get<SPIRVariable>(id);\n\n\t\tif (fallback_prefer_instance_name)\n\t\t{\n\t\t\treturn to_name(var.self);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tauto &type = get<SPIRType>(var.basetype);\n\t\t\tauto *type_meta = ir.find_meta(type.self);\n\t\t\tauto *block_name = type_meta ? &type_meta->decoration.alias : nullptr;\n\t\t\treturn (!block_name || block_name->empty()) ? get_block_fallback_name(id) : *block_name;\n\t\t}\n\t}\n}\n\nbool Compiler::reflection_ssbo_instance_name_is_significant() const\n{\n\tif (ir.source.known)\n\t{\n\t\t// UAVs from HLSL source tend to be declared in a way where the type is reused\n\t\t// but the instance name is significant, and that's the name we should report.\n\t\t// For GLSL, SSBOs each have their own block type as that's how GLSL is written.\n\t\treturn ir.source.hlsl;\n\t}\n\n\tunordered_set<uint32_t> ssbo_type_ids;\n\tbool aliased_ssbo_types = false;\n\n\t// If we don't have any OpSource information, we need to perform some shaky heuristics.\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, const SPIRVariable &var) {\n\t\tauto &type = this->get<SPIRType>(var.basetype);\n\t\tif (!type.pointer || var.storage == StorageClassFunction)\n\t\t\treturn;\n\n\t\tbool ssbo = var.storage == StorageClassStorageBuffer ||\n\t\t            (var.storage == StorageClassUniform && has_decoration(type.self, DecorationBufferBlock));\n\n\t\tif (ssbo)\n\t\t{\n\t\t\tif (ssbo_type_ids.count(type.self))\n\t\t\t\taliased_ssbo_types = true;\n\t\t\telse\n\t\t\t\tssbo_type_ids.insert(type.self);\n\t\t}\n\t});\n\n\t// If the block name is aliased, assume we have HLSL-style UAV declarations.\n\treturn aliased_ssbo_types;\n}\n\nbool Compiler::instruction_to_result_type(uint32_t &result_type, uint32_t &result_id, spv::Op op,\n                                          const uint32_t *args, uint32_t length)\n{\n\tif (length < 2)\n\t\treturn false;\n\n\tbool has_result_id = false, has_result_type = false;\n\tHasResultAndType(op, &has_result_id, &has_result_type);\n\tif (has_result_id && has_result_type)\n\t{\n\t\tresult_type = args[0];\n\t\tresult_id = args[1];\n\t\treturn true;\n\t}\n\telse\n\t\treturn false;\n}\n\nBitset Compiler::combined_decoration_for_member(const SPIRType &type, uint32_t index) const\n{\n\tBitset flags;\n\tauto *type_meta = ir.find_meta(type.self);\n\n\tif (type_meta)\n\t{\n\t\tauto &members = type_meta->members;\n\t\tif (index >= members.size())\n\t\t\treturn flags;\n\t\tauto &dec = members[index];\n\n\t\tflags.merge_or(dec.decoration_flags);\n\n\t\tauto &member_type = get<SPIRType>(type.member_types[index]);\n\n\t\t// If our member type is a struct, traverse all the child members as well recursively.\n\t\tauto &member_childs = member_type.member_types;\n\t\tfor (uint32_t i = 0; i < member_childs.size(); i++)\n\t\t{\n\t\t\tauto &child_member_type = get<SPIRType>(member_childs[i]);\n\t\t\tif (!child_member_type.pointer)\n\t\t\t\tflags.merge_or(combined_decoration_for_member(member_type, i));\n\t\t}\n\t}\n\n\treturn flags;\n}\n\nbool Compiler::is_desktop_only_format(spv::ImageFormat format)\n{\n\tswitch (format)\n\t{\n\t// Desktop-only formats\n\tcase ImageFormatR11fG11fB10f:\n\tcase ImageFormatR16f:\n\tcase ImageFormatRgb10A2:\n\tcase ImageFormatR8:\n\tcase ImageFormatRg8:\n\tcase ImageFormatR16:\n\tcase ImageFormatRg16:\n\tcase ImageFormatRgba16:\n\tcase ImageFormatR16Snorm:\n\tcase ImageFormatRg16Snorm:\n\tcase ImageFormatRgba16Snorm:\n\tcase ImageFormatR8Snorm:\n\tcase ImageFormatRg8Snorm:\n\tcase ImageFormatR8ui:\n\tcase ImageFormatRg8ui:\n\tcase ImageFormatR16ui:\n\tcase ImageFormatRgb10a2ui:\n\tcase ImageFormatR8i:\n\tcase ImageFormatRg8i:\n\tcase ImageFormatR16i:\n\t\treturn true;\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn false;\n}\n\n// An image is determined to be a depth image if it is marked as a depth image and is not also\n// explicitly marked with a color format, or if there are any sample/gather compare operations on it.\nbool Compiler::is_depth_image(const SPIRType &type, uint32_t id) const\n{\n\treturn (type.image.depth && type.image.format == ImageFormatUnknown) || comparison_ids.count(id);\n}\n\nbool Compiler::type_is_opaque_value(const SPIRType &type) const\n{\n\treturn !type.pointer && (type.basetype == SPIRType::SampledImage || type.basetype == SPIRType::Image ||\n\t                         type.basetype == SPIRType::Sampler);\n}\n\n// Make these member functions so we can easily break on any force_recompile events.\nvoid Compiler::force_recompile()\n{\n\tis_force_recompile = true;\n}\n\nvoid Compiler::force_recompile_guarantee_forward_progress()\n{\n\tforce_recompile();\n\tis_force_recompile_forward_progress = true;\n}\n\nbool Compiler::is_forcing_recompilation() const\n{\n\treturn is_force_recompile;\n}\n\nvoid Compiler::clear_force_recompile()\n{\n\tis_force_recompile = false;\n\tis_force_recompile_forward_progress = false;\n}\n\nCompiler::PhysicalStorageBufferPointerHandler::PhysicalStorageBufferPointerHandler(Compiler &compiler_)\n    : compiler(compiler_)\n{\n}\n\nCompiler::PhysicalBlockMeta *Compiler::PhysicalStorageBufferPointerHandler::find_block_meta(uint32_t id) const\n{\n\tauto chain_itr = access_chain_to_physical_block.find(id);\n\tif (chain_itr != access_chain_to_physical_block.end())\n\t\treturn chain_itr->second;\n\telse\n\t\treturn nullptr;\n}\n\nvoid Compiler::PhysicalStorageBufferPointerHandler::mark_aligned_access(uint32_t id, const uint32_t *args, uint32_t length)\n{\n\tuint32_t mask = *args;\n\targs++;\n\tlength--;\n\tif (length && (mask & MemoryAccessVolatileMask) != 0)\n\t{\n\t\targs++;\n\t\tlength--;\n\t}\n\n\tif (length && (mask & MemoryAccessAlignedMask) != 0)\n\t{\n\t\tuint32_t alignment = *args;\n\t\tauto *meta = find_block_meta(id);\n\n\t\t// This makes the assumption that the application does not rely on insane edge cases like:\n\t\t// Bind buffer with ADDR = 8, use block offset of 8 bytes, load/store with 16 byte alignment.\n\t\t// If we emit the buffer with alignment = 16 here, the first element at offset = 0 should\n\t\t// actually have alignment of 8 bytes, but this is too theoretical and awkward to support.\n\t\t// We could potentially keep track of any offset in the access chain, but it's\n\t\t// practically impossible for high level compilers to emit code like that,\n\t\t// so deducing overall alignment requirement based on maximum observed Alignment value is probably fine.\n\t\tif (meta && alignment > meta->alignment)\n\t\t\tmeta->alignment = alignment;\n\t}\n}\n\nbool Compiler::PhysicalStorageBufferPointerHandler::type_is_bda_block_entry(uint32_t type_id) const\n{\n\tauto &type = compiler.get<SPIRType>(type_id);\n\treturn type.storage == StorageClassPhysicalStorageBufferEXT && type.pointer &&\n\t       type.pointer_depth == 1 && !compiler.type_is_array_of_pointers(type);\n}\n\nuint32_t Compiler::PhysicalStorageBufferPointerHandler::get_minimum_scalar_alignment(const SPIRType &type) const\n{\n\tif (type.storage == spv::StorageClassPhysicalStorageBufferEXT)\n\t\treturn 8;\n\telse if (type.basetype == SPIRType::Struct)\n\t{\n\t\tuint32_t alignment = 0;\n\t\tfor (auto &member_type : type.member_types)\n\t\t{\n\t\t\tuint32_t member_align = get_minimum_scalar_alignment(compiler.get<SPIRType>(member_type));\n\t\t\tif (member_align > alignment)\n\t\t\t\talignment = member_align;\n\t\t}\n\t\treturn alignment;\n\t}\n\telse\n\t\treturn type.width / 8;\n}\n\nvoid Compiler::PhysicalStorageBufferPointerHandler::setup_meta_chain(uint32_t type_id, uint32_t var_id)\n{\n\tif (type_is_bda_block_entry(type_id))\n\t{\n\t\tauto &meta = physical_block_type_meta[type_id];\n\t\taccess_chain_to_physical_block[var_id] = &meta;\n\n\t\tauto &type = compiler.get<SPIRType>(type_id);\n\t\tif (type.basetype != SPIRType::Struct)\n\t\t\tnon_block_types.insert(type_id);\n\n\t\tif (meta.alignment == 0)\n\t\t\tmeta.alignment = get_minimum_scalar_alignment(compiler.get_pointee_type(type));\n\t}\n}\n\nbool Compiler::PhysicalStorageBufferPointerHandler::handle(Op op, const uint32_t *args, uint32_t length)\n{\n\t// When a BDA pointer comes to life, we need to keep a mapping of SSA ID -> type ID for the pointer type.\n\t// For every load and store, we'll need to be able to look up the type ID being accessed and mark any alignment\n\t// requirements.\n\tswitch (op)\n\t{\n\tcase OpConvertUToPtr:\n\tcase OpBitcast:\n\tcase OpCompositeExtract:\n\t\t// Extract can begin a new chain if we had a struct or array of pointers as input.\n\t\t// We don't begin chains before we have a pure scalar pointer.\n\t\tsetup_meta_chain(args[0], args[1]);\n\t\tbreak;\n\n\tcase OpAccessChain:\n\tcase OpInBoundsAccessChain:\n\tcase OpPtrAccessChain:\n\tcase OpCopyObject:\n\t{\n\t\tauto itr = access_chain_to_physical_block.find(args[2]);\n\t\tif (itr != access_chain_to_physical_block.end())\n\t\t\taccess_chain_to_physical_block[args[1]] = itr->second;\n\t\tbreak;\n\t}\n\n\tcase OpLoad:\n\t{\n\t\tsetup_meta_chain(args[0], args[1]);\n\t\tif (length >= 4)\n\t\t\tmark_aligned_access(args[2], args + 3, length - 3);\n\t\tbreak;\n\t}\n\n\tcase OpStore:\n\t{\n\t\tif (length >= 3)\n\t\t\tmark_aligned_access(args[0], args + 2, length - 2);\n\t\tbreak;\n\t}\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn true;\n}\n\nuint32_t Compiler::PhysicalStorageBufferPointerHandler::get_base_non_block_type_id(uint32_t type_id) const\n{\n\tauto *type = &compiler.get<SPIRType>(type_id);\n\twhile (type->pointer &&\n\t       type->storage == StorageClassPhysicalStorageBufferEXT &&\n\t       !type_is_bda_block_entry(type_id))\n\t{\n\t\ttype_id = type->parent_type;\n\t\ttype = &compiler.get<SPIRType>(type_id);\n\t}\n\n\tassert(type_is_bda_block_entry(type_id));\n\treturn type_id;\n}\n\nvoid Compiler::PhysicalStorageBufferPointerHandler::analyze_non_block_types_from_block(const SPIRType &type)\n{\n\tfor (auto &member : type.member_types)\n\t{\n\t\tauto &subtype = compiler.get<SPIRType>(member);\n\t\tif (subtype.basetype != SPIRType::Struct && subtype.pointer &&\n\t\t    subtype.storage == spv::StorageClassPhysicalStorageBufferEXT)\n\t\t{\n\t\t\tnon_block_types.insert(get_base_non_block_type_id(member));\n\t\t}\n\t\telse if (subtype.basetype == SPIRType::Struct && !subtype.pointer)\n\t\t\tanalyze_non_block_types_from_block(subtype);\n\t}\n}\n\nvoid Compiler::analyze_non_block_pointer_types()\n{\n\tPhysicalStorageBufferPointerHandler handler(*this);\n\ttraverse_all_reachable_opcodes(get<SPIRFunction>(ir.default_entry_point), handler);\n\n\t// Analyze any block declaration we have to make. It might contain\n\t// physical pointers to POD types which we never used, and thus never added to the list.\n\t// We'll need to add those pointer types to the set of types we declare.\n\tir.for_each_typed_id<SPIRType>([&](uint32_t, SPIRType &type) {\n\t\tif (has_decoration(type.self, DecorationBlock) || has_decoration(type.self, DecorationBufferBlock))\n\t\t\thandler.analyze_non_block_types_from_block(type);\n\t});\n\n\tphysical_storage_non_block_pointer_types.reserve(handler.non_block_types.size());\n\tfor (auto type : handler.non_block_types)\n\t\tphysical_storage_non_block_pointer_types.push_back(type);\n\tsort(begin(physical_storage_non_block_pointer_types), end(physical_storage_non_block_pointer_types));\n\tphysical_storage_type_to_alignment = std::move(handler.physical_block_type_meta);\n}\n\nbool Compiler::InterlockedResourceAccessPrepassHandler::handle(Op op, const uint32_t *, uint32_t)\n{\n\tif (op == OpBeginInvocationInterlockEXT || op == OpEndInvocationInterlockEXT)\n\t{\n\t\tif (interlock_function_id != 0 && interlock_function_id != call_stack.back())\n\t\t{\n\t\t\t// Most complex case, we have no sensible way of dealing with this\n\t\t\t// other than taking the 100% conservative approach, exit early.\n\t\t\tsplit_function_case = true;\n\t\t\treturn false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tinterlock_function_id = call_stack.back();\n\t\t\t// If this call is performed inside control flow we have a problem.\n\t\t\tauto &cfg = compiler.get_cfg_for_function(interlock_function_id);\n\n\t\t\tuint32_t from_block_id = compiler.get<SPIRFunction>(interlock_function_id).entry_block;\n\t\t\tbool outside_control_flow = cfg.node_terminates_control_flow_in_sub_graph(from_block_id, current_block_id);\n\t\t\tif (!outside_control_flow)\n\t\t\t\tcontrol_flow_interlock = true;\n\t\t}\n\t}\n\treturn true;\n}\n\nvoid Compiler::InterlockedResourceAccessPrepassHandler::rearm_current_block(const SPIRBlock &block)\n{\n\tcurrent_block_id = block.self;\n}\n\nbool Compiler::InterlockedResourceAccessPrepassHandler::begin_function_scope(const uint32_t *args, uint32_t length)\n{\n\tif (length < 3)\n\t\treturn false;\n\tcall_stack.push_back(args[2]);\n\treturn true;\n}\n\nbool Compiler::InterlockedResourceAccessPrepassHandler::end_function_scope(const uint32_t *, uint32_t)\n{\n\tcall_stack.pop_back();\n\treturn true;\n}\n\nbool Compiler::InterlockedResourceAccessHandler::begin_function_scope(const uint32_t *args, uint32_t length)\n{\n\tif (length < 3)\n\t\treturn false;\n\n\tif (args[2] == interlock_function_id)\n\t\tcall_stack_is_interlocked = true;\n\n\tcall_stack.push_back(args[2]);\n\treturn true;\n}\n\nbool Compiler::InterlockedResourceAccessHandler::end_function_scope(const uint32_t *, uint32_t)\n{\n\tif (call_stack.back() == interlock_function_id)\n\t\tcall_stack_is_interlocked = false;\n\n\tcall_stack.pop_back();\n\treturn true;\n}\n\nvoid Compiler::InterlockedResourceAccessHandler::access_potential_resource(uint32_t id)\n{\n\tif ((use_critical_section && in_crit_sec) || (control_flow_interlock && call_stack_is_interlocked) ||\n\t    split_function_case)\n\t{\n\t\tcompiler.interlocked_resources.insert(id);\n\t}\n}\n\nbool Compiler::InterlockedResourceAccessHandler::handle(Op opcode, const uint32_t *args, uint32_t length)\n{\n\t// Only care about critical section analysis if we have simple case.\n\tif (use_critical_section)\n\t{\n\t\tif (opcode == OpBeginInvocationInterlockEXT)\n\t\t{\n\t\t\tin_crit_sec = true;\n\t\t\treturn true;\n\t\t}\n\n\t\tif (opcode == OpEndInvocationInterlockEXT)\n\t\t{\n\t\t\t// End critical section--nothing more to do.\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// We need to figure out where images and buffers are loaded from, so do only the bare bones compilation we need.\n\tswitch (opcode)\n\t{\n\tcase OpLoad:\n\t{\n\t\tif (length < 3)\n\t\t\treturn false;\n\n\t\tuint32_t ptr = args[2];\n\t\tauto *var = compiler.maybe_get_backing_variable(ptr);\n\n\t\t// We're only concerned with buffer and image memory here.\n\t\tif (!var)\n\t\t\tbreak;\n\n\t\tswitch (var->storage)\n\t\t{\n\t\tdefault:\n\t\t\tbreak;\n\n\t\tcase StorageClassUniformConstant:\n\t\t{\n\t\t\tuint32_t result_type = args[0];\n\t\t\tuint32_t id = args[1];\n\t\t\tcompiler.set<SPIRExpression>(id, \"\", result_type, true);\n\t\t\tcompiler.register_read(id, ptr, true);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase StorageClassUniform:\n\t\t\t// Must have BufferBlock; we only care about SSBOs.\n\t\t\tif (!compiler.has_decoration(compiler.get<SPIRType>(var->basetype).self, DecorationBufferBlock))\n\t\t\t\tbreak;\n\t\t\t// fallthrough\n\t\tcase StorageClassStorageBuffer:\n\t\t\taccess_potential_resource(var->self);\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpInBoundsAccessChain:\n\tcase OpAccessChain:\n\tcase OpPtrAccessChain:\n\t{\n\t\tif (length < 3)\n\t\t\treturn false;\n\n\t\tuint32_t result_type = args[0];\n\n\t\tauto &type = compiler.get<SPIRType>(result_type);\n\t\tif (type.storage == StorageClassUniform || type.storage == StorageClassUniformConstant ||\n\t\t    type.storage == StorageClassStorageBuffer)\n\t\t{\n\t\t\tuint32_t id = args[1];\n\t\t\tuint32_t ptr = args[2];\n\t\t\tcompiler.set<SPIRExpression>(id, \"\", result_type, true);\n\t\t\tcompiler.register_read(id, ptr, true);\n\t\t\tcompiler.ir.ids[id].set_allow_type_rewrite();\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpImageTexelPointer:\n\t{\n\t\tif (length < 3)\n\t\t\treturn false;\n\n\t\tuint32_t result_type = args[0];\n\t\tuint32_t id = args[1];\n\t\tuint32_t ptr = args[2];\n\t\tauto &e = compiler.set<SPIRExpression>(id, \"\", result_type, true);\n\t\tauto *var = compiler.maybe_get_backing_variable(ptr);\n\t\tif (var)\n\t\t\te.loaded_from = var->self;\n\t\tbreak;\n\t}\n\n\tcase OpStore:\n\tcase OpImageWrite:\n\tcase OpAtomicStore:\n\t{\n\t\tif (length < 1)\n\t\t\treturn false;\n\n\t\tuint32_t ptr = args[0];\n\t\tauto *var = compiler.maybe_get_backing_variable(ptr);\n\t\tif (var && (var->storage == StorageClassUniform || var->storage == StorageClassUniformConstant ||\n\t\t            var->storage == StorageClassStorageBuffer))\n\t\t{\n\t\t\taccess_potential_resource(var->self);\n\t\t}\n\n\t\tbreak;\n\t}\n\n\tcase OpCopyMemory:\n\t{\n\t\tif (length < 2)\n\t\t\treturn false;\n\n\t\tuint32_t dst = args[0];\n\t\tuint32_t src = args[1];\n\t\tauto *dst_var = compiler.maybe_get_backing_variable(dst);\n\t\tauto *src_var = compiler.maybe_get_backing_variable(src);\n\n\t\tif (dst_var && (dst_var->storage == StorageClassUniform || dst_var->storage == StorageClassStorageBuffer))\n\t\t\taccess_potential_resource(dst_var->self);\n\n\t\tif (src_var)\n\t\t{\n\t\t\tif (src_var->storage != StorageClassUniform && src_var->storage != StorageClassStorageBuffer)\n\t\t\t\tbreak;\n\n\t\t\tif (src_var->storage == StorageClassUniform &&\n\t\t\t    !compiler.has_decoration(compiler.get<SPIRType>(src_var->basetype).self, DecorationBufferBlock))\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\taccess_potential_resource(src_var->self);\n\t\t}\n\n\t\tbreak;\n\t}\n\n\tcase OpImageRead:\n\tcase OpAtomicLoad:\n\t{\n\t\tif (length < 3)\n\t\t\treturn false;\n\n\t\tuint32_t ptr = args[2];\n\t\tauto *var = compiler.maybe_get_backing_variable(ptr);\n\n\t\t// We're only concerned with buffer and image memory here.\n\t\tif (!var)\n\t\t\tbreak;\n\n\t\tswitch (var->storage)\n\t\t{\n\t\tdefault:\n\t\t\tbreak;\n\n\t\tcase StorageClassUniform:\n\t\t\t// Must have BufferBlock; we only care about SSBOs.\n\t\t\tif (!compiler.has_decoration(compiler.get<SPIRType>(var->basetype).self, DecorationBufferBlock))\n\t\t\t\tbreak;\n\t\t\t// fallthrough\n\t\tcase StorageClassUniformConstant:\n\t\tcase StorageClassStorageBuffer:\n\t\t\taccess_potential_resource(var->self);\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpAtomicExchange:\n\tcase OpAtomicCompareExchange:\n\tcase OpAtomicIIncrement:\n\tcase OpAtomicIDecrement:\n\tcase OpAtomicIAdd:\n\tcase OpAtomicISub:\n\tcase OpAtomicSMin:\n\tcase OpAtomicUMin:\n\tcase OpAtomicSMax:\n\tcase OpAtomicUMax:\n\tcase OpAtomicAnd:\n\tcase OpAtomicOr:\n\tcase OpAtomicXor:\n\t{\n\t\tif (length < 3)\n\t\t\treturn false;\n\n\t\tuint32_t ptr = args[2];\n\t\tauto *var = compiler.maybe_get_backing_variable(ptr);\n\t\tif (var && (var->storage == StorageClassUniform || var->storage == StorageClassUniformConstant ||\n\t\t            var->storage == StorageClassStorageBuffer))\n\t\t{\n\t\t\taccess_potential_resource(var->self);\n\t\t}\n\n\t\tbreak;\n\t}\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn true;\n}\n\nvoid Compiler::analyze_interlocked_resource_usage()\n{\n\tif (get_execution_model() == ExecutionModelFragment &&\n\t    (get_entry_point().flags.get(ExecutionModePixelInterlockOrderedEXT) ||\n\t     get_entry_point().flags.get(ExecutionModePixelInterlockUnorderedEXT) ||\n\t     get_entry_point().flags.get(ExecutionModeSampleInterlockOrderedEXT) ||\n\t     get_entry_point().flags.get(ExecutionModeSampleInterlockUnorderedEXT)))\n\t{\n\t\tInterlockedResourceAccessPrepassHandler prepass_handler(*this, ir.default_entry_point);\n\t\ttraverse_all_reachable_opcodes(get<SPIRFunction>(ir.default_entry_point), prepass_handler);\n\n\t\tInterlockedResourceAccessHandler handler(*this, ir.default_entry_point);\n\t\thandler.interlock_function_id = prepass_handler.interlock_function_id;\n\t\thandler.split_function_case = prepass_handler.split_function_case;\n\t\thandler.control_flow_interlock = prepass_handler.control_flow_interlock;\n\t\thandler.use_critical_section = !handler.split_function_case && !handler.control_flow_interlock;\n\n\t\ttraverse_all_reachable_opcodes(get<SPIRFunction>(ir.default_entry_point), handler);\n\n\t\t// For GLSL. If we hit any of these cases, we have to fall back to conservative approach.\n\t\tinterlocked_is_complex =\n\t\t    !handler.use_critical_section || handler.interlock_function_id != ir.default_entry_point;\n\t}\n}\n\n// Helper function\nbool Compiler::check_internal_recursion(const SPIRType &type, std::unordered_set<uint32_t> &checked_ids)\n{\n\tif (type.basetype != SPIRType::Struct)\n\t\treturn false;\n\n\tif (checked_ids.count(type.self))\n\t\treturn true;\n\n\t// Recurse into struct members\n\tbool is_recursive = false;\n\tchecked_ids.insert(type.self);\n\tuint32_t mbr_cnt = uint32_t(type.member_types.size());\n\tfor (uint32_t mbr_idx = 0; !is_recursive && mbr_idx < mbr_cnt; mbr_idx++)\n\t{\n\t\tuint32_t mbr_type_id = type.member_types[mbr_idx];\n\t\tauto &mbr_type = get<SPIRType>(mbr_type_id);\n\t\tis_recursive |= check_internal_recursion(mbr_type, checked_ids);\n\t}\n\tchecked_ids.erase(type.self);\n\treturn is_recursive;\n}\n\n// Return whether the struct type contains a structural recursion nested somewhere within its content.\nbool Compiler::type_contains_recursion(const SPIRType &type)\n{\n\tstd::unordered_set<uint32_t> checked_ids;\n\treturn check_internal_recursion(type, checked_ids);\n}\n\nbool Compiler::type_is_array_of_pointers(const SPIRType &type) const\n{\n\tif (!is_array(type))\n\t\treturn false;\n\n\t// BDA types must have parent type hierarchy.\n\tif (!type.parent_type)\n\t\treturn false;\n\n\t// Punch through all array layers.\n\tauto *parent = &get<SPIRType>(type.parent_type);\n\twhile (is_array(*parent))\n\t\tparent = &get<SPIRType>(parent->parent_type);\n\n\treturn is_pointer(*parent);\n}\n\nbool Compiler::flush_phi_required(BlockID from, BlockID to) const\n{\n\tauto &child = get<SPIRBlock>(to);\n\tfor (auto &phi : child.phi_variables)\n\t\tif (phi.parent == from)\n\t\t\treturn true;\n\treturn false;\n}\n\nvoid Compiler::add_loop_level()\n{\n\tcurrent_loop_level++;\n}\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv_cross.hpp",
    "content": "/*\n * Copyright 2015-2021 Arm Limited\n * SPDX-License-Identifier: Apache-2.0 OR MIT\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * At your option, you may choose to accept this material under either:\n *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or\n *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.\n */\n\n#ifndef SPIRV_CROSS_HPP\n#define SPIRV_CROSS_HPP\n\n#ifndef SPV_ENABLE_UTILITY_CODE\n#define SPV_ENABLE_UTILITY_CODE\n#endif\n#include \"spirv.hpp\"\n#include \"spirv_cfg.hpp\"\n#include \"spirv_cross_parsed_ir.hpp\"\n\nnamespace SPIRV_CROSS_NAMESPACE\n{\nstruct Resource\n{\n\t// Resources are identified with their SPIR-V ID.\n\t// This is the ID of the OpVariable.\n\tID id;\n\n\t// The type ID of the variable which includes arrays and all type modifications.\n\t// This type ID is not suitable for parsing OpMemberDecoration of a struct and other decorations in general\n\t// since these modifications typically happen on the base_type_id.\n\tTypeID type_id;\n\n\t// The base type of the declared resource.\n\t// This type is the base type which ignores pointers and arrays of the type_id.\n\t// This is mostly useful to parse decorations of the underlying type.\n\t// base_type_id can also be obtained with get_type(get_type(type_id).self).\n\tTypeID base_type_id;\n\n\t// The declared name (OpName) of the resource.\n\t// For Buffer blocks, the name actually reflects the externally\n\t// visible Block name.\n\t//\n\t// This name can be retrieved again by using either\n\t// get_name(id) or get_name(base_type_id) depending if it's a buffer block or not.\n\t//\n\t// This name can be an empty string in which case get_fallback_name(id) can be\n\t// used which obtains a suitable fallback identifier for an ID.\n\tstd::string name;\n};\n\nstruct BuiltInResource\n{\n\t// This is mostly here to support reflection of builtins such as Position/PointSize/CullDistance/ClipDistance.\n\t// This needs to be different from Resource since we can collect builtins from blocks.\n\t// A builtin present here does not necessarily mean it's considered an active builtin,\n\t// since variable ID \"activeness\" is only tracked on OpVariable level, not Block members.\n\t// For that, update_active_builtins() -> has_active_builtin() can be used to further refine the reflection.\n\tspv::BuiltIn builtin;\n\n\t// This is the actual value type of the builtin.\n\t// Typically float4, float, array<float, N> for the gl_PerVertex builtins.\n\t// If the builtin is a control point, the control point array type will be stripped away here as appropriate.\n\tTypeID value_type_id;\n\n\t// This refers to the base resource which contains the builtin.\n\t// If resource is a Block, it can hold multiple builtins, or it might not be a block.\n\t// For advanced reflection scenarios, all information in builtin/value_type_id can be deduced,\n\t// it's just more convenient this way.\n\tResource resource;\n};\n\nstruct ShaderResources\n{\n\tSmallVector<Resource> uniform_buffers;\n\tSmallVector<Resource> storage_buffers;\n\tSmallVector<Resource> stage_inputs;\n\tSmallVector<Resource> stage_outputs;\n\tSmallVector<Resource> subpass_inputs;\n\tSmallVector<Resource> storage_images;\n\tSmallVector<Resource> sampled_images;\n\tSmallVector<Resource> atomic_counters;\n\tSmallVector<Resource> acceleration_structures;\n\tSmallVector<Resource> gl_plain_uniforms;\n\n\t// There can only be one push constant block,\n\t// but keep the vector in case this restriction is lifted in the future.\n\tSmallVector<Resource> push_constant_buffers;\n\n\tSmallVector<Resource> shader_record_buffers;\n\n\t// For Vulkan GLSL and HLSL source,\n\t// these correspond to separate texture2D and samplers respectively.\n\tSmallVector<Resource> separate_images;\n\tSmallVector<Resource> separate_samplers;\n\n\tSmallVector<BuiltInResource> builtin_inputs;\n\tSmallVector<BuiltInResource> builtin_outputs;\n};\n\nstruct CombinedImageSampler\n{\n\t// The ID of the sampler2D variable.\n\tVariableID combined_id;\n\t// The ID of the texture2D variable.\n\tVariableID image_id;\n\t// The ID of the sampler variable.\n\tVariableID sampler_id;\n};\n\nstruct SpecializationConstant\n{\n\t// The ID of the specialization constant.\n\tConstantID id;\n\t// The constant ID of the constant, used in Vulkan during pipeline creation.\n\tuint32_t constant_id;\n};\n\nstruct BufferRange\n{\n\tunsigned index;\n\tsize_t offset;\n\tsize_t range;\n};\n\nenum BufferPackingStandard\n{\n\tBufferPackingStd140,\n\tBufferPackingStd430,\n\tBufferPackingStd140EnhancedLayout,\n\tBufferPackingStd430EnhancedLayout,\n\tBufferPackingHLSLCbuffer,\n\tBufferPackingHLSLCbufferPackOffset,\n\tBufferPackingScalar,\n\tBufferPackingScalarEnhancedLayout\n};\n\nstruct EntryPoint\n{\n\tstd::string name;\n\tspv::ExecutionModel execution_model;\n};\n\nclass Compiler\n{\npublic:\n\tfriend class CFG;\n\tfriend class DominatorBuilder;\n\n\t// The constructor takes a buffer of SPIR-V words and parses it.\n\t// It will create its own parser, parse the SPIR-V and move the parsed IR\n\t// as if you had called the constructors taking ParsedIR directly.\n\texplicit Compiler(std::vector<uint32_t> ir);\n\tCompiler(const uint32_t *ir, size_t word_count);\n\n\t// This is more modular. We can also consume a ParsedIR structure directly, either as a move, or copy.\n\t// With copy, we can reuse the same parsed IR for multiple Compiler instances.\n\texplicit Compiler(const ParsedIR &ir);\n\texplicit Compiler(ParsedIR &&ir);\n\n\tvirtual ~Compiler() = default;\n\n\t// After parsing, API users can modify the SPIR-V via reflection and call this\n\t// to disassemble the SPIR-V into the desired langauage.\n\t// Sub-classes actually implement this.\n\tvirtual std::string compile();\n\n\t// Gets the identifier (OpName) of an ID. If not defined, an empty string will be returned.\n\tconst std::string &get_name(ID id) const;\n\n\t// Applies a decoration to an ID. Effectively injects OpDecorate.\n\tvoid set_decoration(ID id, spv::Decoration decoration, uint32_t argument = 0);\n\tvoid set_decoration_string(ID id, spv::Decoration decoration, const std::string &argument);\n\n\t// Overrides the identifier OpName of an ID.\n\t// Identifiers beginning with underscores or identifiers which contain double underscores\n\t// are reserved by the implementation.\n\tvoid set_name(ID id, const std::string &name);\n\n\t// Gets a bitmask for the decorations which are applied to ID.\n\t// I.e. (1ull << spv::DecorationFoo) | (1ull << spv::DecorationBar)\n\tconst Bitset &get_decoration_bitset(ID id) const;\n\n\t// Returns whether the decoration has been applied to the ID.\n\tbool has_decoration(ID id, spv::Decoration decoration) const;\n\n\t// Gets the value for decorations which take arguments.\n\t// If the decoration is a boolean (i.e. spv::DecorationNonWritable),\n\t// 1 will be returned.\n\t// If decoration doesn't exist or decoration is not recognized,\n\t// 0 will be returned.\n\tuint32_t get_decoration(ID id, spv::Decoration decoration) const;\n\tconst std::string &get_decoration_string(ID id, spv::Decoration decoration) const;\n\n\t// Removes the decoration for an ID.\n\tvoid unset_decoration(ID id, spv::Decoration decoration);\n\n\t// Gets the SPIR-V type associated with ID.\n\t// Mostly used with Resource::type_id and Resource::base_type_id to parse the underlying type of a resource.\n\tconst SPIRType &get_type(TypeID id) const;\n\n\t// Gets the SPIR-V type of a variable.\n\tconst SPIRType &get_type_from_variable(VariableID id) const;\n\n\t// Gets the underlying storage class for an OpVariable.\n\tspv::StorageClass get_storage_class(VariableID id) const;\n\n\t// If get_name() is an empty string, get the fallback name which will be used\n\t// instead in the disassembled source.\n\tvirtual const std::string get_fallback_name(ID id) const;\n\n\t// If get_name() of a Block struct is an empty string, get the fallback name.\n\t// This needs to be per-variable as multiple variables can use the same block type.\n\tvirtual const std::string get_block_fallback_name(VariableID id) const;\n\n\t// Given an OpTypeStruct in ID, obtain the identifier for member number \"index\".\n\t// This may be an empty string.\n\tconst std::string &get_member_name(TypeID id, uint32_t index) const;\n\n\t// Given an OpTypeStruct in ID, obtain the OpMemberDecoration for member number \"index\".\n\tuint32_t get_member_decoration(TypeID id, uint32_t index, spv::Decoration decoration) const;\n\tconst std::string &get_member_decoration_string(TypeID id, uint32_t index, spv::Decoration decoration) const;\n\n\t// Sets the member identifier for OpTypeStruct ID, member number \"index\".\n\tvoid set_member_name(TypeID id, uint32_t index, const std::string &name);\n\n\t// Returns the qualified member identifier for OpTypeStruct ID, member number \"index\",\n\t// or an empty string if no qualified alias exists\n\tconst std::string &get_member_qualified_name(TypeID type_id, uint32_t index) const;\n\n\t// Gets the decoration mask for a member of a struct, similar to get_decoration_mask.\n\tconst Bitset &get_member_decoration_bitset(TypeID id, uint32_t index) const;\n\n\t// Returns whether the decoration has been applied to a member of a struct.\n\tbool has_member_decoration(TypeID id, uint32_t index, spv::Decoration decoration) const;\n\n\t// Similar to set_decoration, but for struct members.\n\tvoid set_member_decoration(TypeID id, uint32_t index, spv::Decoration decoration, uint32_t argument = 0);\n\tvoid set_member_decoration_string(TypeID id, uint32_t index, spv::Decoration decoration,\n\t                                  const std::string &argument);\n\n\t// Unsets a member decoration, similar to unset_decoration.\n\tvoid unset_member_decoration(TypeID id, uint32_t index, spv::Decoration decoration);\n\n\t// Gets the fallback name for a member, similar to get_fallback_name.\n\tvirtual const std::string get_fallback_member_name(uint32_t index) const\n\t{\n\t\treturn join(\"_\", index);\n\t}\n\n\t// Returns a vector of which members of a struct are potentially in use by a\n\t// SPIR-V shader. The granularity of this analysis is per-member of a struct.\n\t// This can be used for Buffer (UBO), BufferBlock/StorageBuffer (SSBO) and PushConstant blocks.\n\t// ID is the Resource::id obtained from get_shader_resources().\n\tSmallVector<BufferRange> get_active_buffer_ranges(VariableID id) const;\n\n\t// Returns the effective size of a buffer block.\n\tsize_t get_declared_struct_size(const SPIRType &struct_type) const;\n\n\t// Returns the effective size of a buffer block, with a given array size\n\t// for a runtime array.\n\t// SSBOs are typically declared as runtime arrays. get_declared_struct_size() will return 0 for the size.\n\t// This is not very helpful for applications which might need to know the array stride of its last member.\n\t// This can be done through the API, but it is not very intuitive how to accomplish this, so here we provide a helper function\n\t// to query the size of the buffer, assuming that the last member has a certain size.\n\t// If the buffer does not contain a runtime array, array_size is ignored, and the function will behave as\n\t// get_declared_struct_size().\n\t// To get the array stride of the last member, something like:\n\t// get_declared_struct_size_runtime_array(type, 1) - get_declared_struct_size_runtime_array(type, 0) will work.\n\tsize_t get_declared_struct_size_runtime_array(const SPIRType &struct_type, size_t array_size) const;\n\n\t// Returns the effective size of a buffer block struct member.\n\tsize_t get_declared_struct_member_size(const SPIRType &struct_type, uint32_t index) const;\n\n\t// Returns a set of all global variables which are statically accessed\n\t// by the control flow graph from the current entry point.\n\t// Only variables which change the interface for a shader are returned, that is,\n\t// variables with storage class of Input, Output, Uniform, UniformConstant, PushConstant and AtomicCounter\n\t// storage classes are returned.\n\t//\n\t// To use the returned set as the filter for which variables are used during compilation,\n\t// this set can be moved to set_enabled_interface_variables().\n\tstd::unordered_set<VariableID> get_active_interface_variables() const;\n\n\t// Sets the interface variables which are used during compilation.\n\t// By default, all variables are used.\n\t// Once set, compile() will only consider the set in active_variables.\n\tvoid set_enabled_interface_variables(std::unordered_set<VariableID> active_variables);\n\n\t// Query shader resources, use ids with reflection interface to modify or query binding points, etc.\n\tShaderResources get_shader_resources() const;\n\n\t// Query shader resources, but only return the variables which are part of active_variables.\n\t// E.g.: get_shader_resources(get_active_variables()) to only return the variables which are statically\n\t// accessed.\n\tShaderResources get_shader_resources(const std::unordered_set<VariableID> &active_variables) const;\n\n\t// Remapped variables are considered built-in variables and a backend will\n\t// not emit a declaration for this variable.\n\t// This is mostly useful for making use of builtins which are dependent on extensions.\n\tvoid set_remapped_variable_state(VariableID id, bool remap_enable);\n\tbool get_remapped_variable_state(VariableID id) const;\n\n\t// For subpassInput variables which are remapped to plain variables,\n\t// the number of components in the remapped\n\t// variable must be specified as the backing type of subpass inputs are opaque.\n\tvoid set_subpass_input_remapped_components(VariableID id, uint32_t components);\n\tuint32_t get_subpass_input_remapped_components(VariableID id) const;\n\n\t// All operations work on the current entry point.\n\t// Entry points can be swapped out with set_entry_point().\n\t// Entry points should be set right after the constructor completes as some reflection functions traverse the graph from the entry point.\n\t// Resource reflection also depends on the entry point.\n\t// By default, the current entry point is set to the first OpEntryPoint which appears in the SPIR-V module.\n\n\t// Some shader languages restrict the names that can be given to entry points, and the\n\t// corresponding backend will automatically rename an entry point name, during the call\n\t// to compile() if it is illegal. For example, the common entry point name main() is\n\t// illegal in MSL, and is renamed to an alternate name by the MSL backend.\n\t// Given the original entry point name contained in the SPIR-V, this function returns\n\t// the name, as updated by the backend during the call to compile(). If the name is not\n\t// illegal, and has not been renamed, or if this function is called before compile(),\n\t// this function will simply return the same name.\n\n\t// New variants of entry point query and reflection.\n\t// Names for entry points in the SPIR-V module may alias if they belong to different execution models.\n\t// To disambiguate, we must pass along with the entry point names the execution model.\n\tSmallVector<EntryPoint> get_entry_points_and_stages() const;\n\tvoid set_entry_point(const std::string &entry, spv::ExecutionModel execution_model);\n\n\t// Renames an entry point from old_name to new_name.\n\t// If old_name is currently selected as the current entry point, it will continue to be the current entry point,\n\t// albeit with a new name.\n\t// get_entry_points() is essentially invalidated at this point.\n\tvoid rename_entry_point(const std::string &old_name, const std::string &new_name,\n\t                        spv::ExecutionModel execution_model);\n\tconst SPIREntryPoint &get_entry_point(const std::string &name, spv::ExecutionModel execution_model) const;\n\tSPIREntryPoint &get_entry_point(const std::string &name, spv::ExecutionModel execution_model);\n\tconst std::string &get_cleansed_entry_point_name(const std::string &name,\n\t                                                 spv::ExecutionModel execution_model) const;\n\n\t// Traverses all reachable opcodes and sets active_builtins to a bitmask of all builtin variables which are accessed in the shader.\n\tvoid update_active_builtins();\n\tbool has_active_builtin(spv::BuiltIn builtin, spv::StorageClass storage) const;\n\n\t// Query and modify OpExecutionMode.\n\tconst Bitset &get_execution_mode_bitset() const;\n\n\tvoid unset_execution_mode(spv::ExecutionMode mode);\n\tvoid set_execution_mode(spv::ExecutionMode mode, uint32_t arg0 = 0, uint32_t arg1 = 0, uint32_t arg2 = 0);\n\n\t// Gets argument for an execution mode (LocalSize, Invocations, OutputVertices).\n\t// For LocalSize or LocalSizeId, the index argument is used to select the dimension (X = 0, Y = 1, Z = 2).\n\t// For execution modes which do not have arguments, 0 is returned.\n\t// LocalSizeId query returns an ID. If LocalSizeId execution mode is not used, it returns 0.\n\t// LocalSize always returns a literal. If execution mode is LocalSizeId,\n\t// the literal (spec constant or not) is still returned.\n\tuint32_t get_execution_mode_argument(spv::ExecutionMode mode, uint32_t index = 0) const;\n\tspv::ExecutionModel get_execution_model() const;\n\n\tbool is_tessellation_shader() const;\n\tbool is_tessellating_triangles() const;\n\n\t// In SPIR-V, the compute work group size can be represented by a constant vector, in which case\n\t// the LocalSize execution mode is ignored.\n\t//\n\t// This constant vector can be a constant vector, specialization constant vector, or partly specialized constant vector.\n\t// To modify and query work group dimensions which are specialization constants, SPIRConstant values must be modified\n\t// directly via get_constant() rather than using LocalSize directly. This function will return which constants should be modified.\n\t//\n\t// To modify dimensions which are *not* specialization constants, set_execution_mode should be used directly.\n\t// Arguments to set_execution_mode which are specialization constants are effectively ignored during compilation.\n\t// NOTE: This is somewhat different from how SPIR-V works. In SPIR-V, the constant vector will completely replace LocalSize,\n\t// while in this interface, LocalSize is only ignored for specialization constants.\n\t//\n\t// The specialization constant will be written to x, y and z arguments.\n\t// If the component is not a specialization constant, a zeroed out struct will be written.\n\t// The return value is the constant ID of the builtin WorkGroupSize, but this is not expected to be useful\n\t// for most use cases.\n\t// If LocalSizeId is used, there is no uvec3 value representing the workgroup size, so the return value is 0,\n\t// but x, y and z are written as normal if the components are specialization constants.\n\tuint32_t get_work_group_size_specialization_constants(SpecializationConstant &x, SpecializationConstant &y,\n\t                                                      SpecializationConstant &z) const;\n\n\t// Analyzes all OpImageFetch (texelFetch) opcodes and checks if there are instances where\n\t// said instruction is used without a combined image sampler.\n\t// GLSL targets do not support the use of texelFetch without a sampler.\n\t// To workaround this, we must inject a dummy sampler which can be used to form a sampler2D at the call-site of\n\t// texelFetch as necessary.\n\t//\n\t// This must be called before build_combined_image_samplers().\n\t// build_combined_image_samplers() may refer to the ID returned by this method if the returned ID is non-zero.\n\t// The return value will be the ID of a sampler object if a dummy sampler is necessary, or 0 if no sampler object\n\t// is required.\n\t//\n\t// If the returned ID is non-zero, it can be decorated with set/bindings as desired before calling compile().\n\t// Calling this function also invalidates get_active_interface_variables(), so this should be called\n\t// before that function.\n\tVariableID build_dummy_sampler_for_combined_images();\n\n\t// Analyzes all separate image and samplers used from the currently selected entry point,\n\t// and re-routes them all to a combined image sampler instead.\n\t// This is required to \"support\" separate image samplers in targets which do not natively support\n\t// this feature, like GLSL/ESSL.\n\t//\n\t// This must be called before compile() if such remapping is desired.\n\t// This call will add new sampled images to the SPIR-V,\n\t// so it will appear in reflection if get_shader_resources() is called after build_combined_image_samplers.\n\t//\n\t// If any image/sampler remapping was found, no separate image/samplers will appear in the decompiled output,\n\t// but will still appear in reflection.\n\t//\n\t// The resulting samplers will be void of any decorations like name, descriptor sets and binding points,\n\t// so this can be added before compile() if desired.\n\t//\n\t// Combined image samplers originating from this set are always considered active variables.\n\t// Arrays of separate samplers are not supported, but arrays of separate images are supported.\n\t// Array of images + sampler -> Array of combined image samplers.\n\tvoid build_combined_image_samplers();\n\n\t// Gets a remapping for the combined image samplers.\n\tconst SmallVector<CombinedImageSampler> &get_combined_image_samplers() const\n\t{\n\t\treturn combined_image_samplers;\n\t}\n\n\t// Set a new variable type remap callback.\n\t// The type remapping is designed to allow global interface variable to assume more special types.\n\t// A typical example here is to remap sampler2D into samplerExternalOES, which currently isn't supported\n\t// directly by SPIR-V.\n\t//\n\t// In compile() while emitting code,\n\t// for every variable that is declared, including function parameters, the callback will be called\n\t// and the API user has a chance to change the textual representation of the type used to declare the variable.\n\t// The API user can detect special patterns in names to guide the remapping.\n\tvoid set_variable_type_remap_callback(VariableTypeRemapCallback cb)\n\t{\n\t\tvariable_remap_callback = std::move(cb);\n\t}\n\n\t// API for querying which specialization constants exist.\n\t// To modify a specialization constant before compile(), use get_constant(constant.id),\n\t// then update constants directly in the SPIRConstant data structure.\n\t// For composite types, the subconstants can be iterated over and modified.\n\t// constant_type is the SPIRType for the specialization constant,\n\t// which can be queried to determine which fields in the unions should be poked at.\n\tSmallVector<SpecializationConstant> get_specialization_constants() const;\n\tSPIRConstant &get_constant(ConstantID id);\n\tconst SPIRConstant &get_constant(ConstantID id) const;\n\n\tuint32_t get_current_id_bound() const\n\t{\n\t\treturn uint32_t(ir.ids.size());\n\t}\n\n\t// API for querying buffer objects.\n\t// The type passed in here should be the base type of a resource, i.e.\n\t// get_type(resource.base_type_id)\n\t// as decorations are set in the basic Block type.\n\t// The type passed in here must have these decorations set, or an exception is raised.\n\t// Only UBOs and SSBOs or sub-structs which are part of these buffer types will have these decorations set.\n\tuint32_t type_struct_member_offset(const SPIRType &type, uint32_t index) const;\n\tuint32_t type_struct_member_array_stride(const SPIRType &type, uint32_t index) const;\n\tuint32_t type_struct_member_matrix_stride(const SPIRType &type, uint32_t index) const;\n\n\t// Gets the offset in SPIR-V words (uint32_t) for a decoration which was originally declared in the SPIR-V binary.\n\t// The offset will point to one or more uint32_t literals which can be modified in-place before using the SPIR-V binary.\n\t// Note that adding or removing decorations using the reflection API will not change the behavior of this function.\n\t// If the decoration was declared, sets the word_offset to an offset into the provided SPIR-V binary buffer and returns true,\n\t// otherwise, returns false.\n\t// If the decoration does not have any value attached to it (e.g. DecorationRelaxedPrecision), this function will also return false.\n\tbool get_binary_offset_for_decoration(VariableID id, spv::Decoration decoration, uint32_t &word_offset) const;\n\n\t// HLSL counter buffer reflection interface.\n\t// Append/Consume/Increment/Decrement in HLSL is implemented as two \"neighbor\" buffer objects where\n\t// one buffer implements the storage, and a single buffer containing just a lone \"int\" implements the counter.\n\t// To SPIR-V these will be exposed as two separate buffers, but glslang HLSL frontend emits a special indentifier\n\t// which lets us link the two buffers together.\n\n\t// Queries if a variable ID is a counter buffer which \"belongs\" to a regular buffer object.\n\n\t// If SPV_GOOGLE_hlsl_functionality1 is used, this can be used even with a stripped SPIR-V module.\n\t// Otherwise, this query is purely based on OpName identifiers as found in the SPIR-V module, and will\n\t// only return true if OpSource was reported HLSL.\n\t// To rely on this functionality, ensure that the SPIR-V module is not stripped.\n\n\tbool buffer_is_hlsl_counter_buffer(VariableID id) const;\n\n\t// Queries if a buffer object has a neighbor \"counter\" buffer.\n\t// If so, the ID of that counter buffer will be returned in counter_id.\n\t// If SPV_GOOGLE_hlsl_functionality1 is used, this can be used even with a stripped SPIR-V module.\n\t// Otherwise, this query is purely based on OpName identifiers as found in the SPIR-V module, and will\n\t// only return true if OpSource was reported HLSL.\n\t// To rely on this functionality, ensure that the SPIR-V module is not stripped.\n\tbool buffer_get_hlsl_counter_buffer(VariableID id, uint32_t &counter_id) const;\n\n\t// Gets the list of all SPIR-V Capabilities which were declared in the SPIR-V module.\n\tconst SmallVector<spv::Capability> &get_declared_capabilities() const;\n\n\t// Gets the list of all SPIR-V extensions which were declared in the SPIR-V module.\n\tconst SmallVector<std::string> &get_declared_extensions() const;\n\n\t// When declaring buffer blocks in GLSL, the name declared in the GLSL source\n\t// might not be the same as the name declared in the SPIR-V module due to naming conflicts.\n\t// In this case, SPIRV-Cross needs to find a fallback-name, and it might only\n\t// be possible to know this name after compiling to GLSL.\n\t// This is particularly important for HLSL input and UAVs which tends to reuse the same block type\n\t// for multiple distinct blocks. For these cases it is not possible to modify the name of the type itself\n\t// because it might be unique. Instead, you can use this interface to check after compilation which\n\t// name was actually used if your input SPIR-V tends to have this problem.\n\t// For other names like remapped names for variables, etc, it's generally enough to query the name of the variables\n\t// after compiling, block names are an exception to this rule.\n\t// ID is the name of a variable as returned by Resource::id, and must be a variable with a Block-like type.\n\t//\n\t// This also applies to HLSL cbuffers.\n\tstd::string get_remapped_declared_block_name(VariableID id) const;\n\n\t// For buffer block variables, get the decorations for that variable.\n\t// Sometimes, decorations for buffer blocks are found in member decorations instead\n\t// of direct decorations on the variable itself.\n\t// The most common use here is to check if a buffer is readonly or writeonly.\n\tBitset get_buffer_block_flags(VariableID id) const;\n\n\t// Returns whether the position output is invariant\n\tbool is_position_invariant() const\n\t{\n\t\treturn position_invariant;\n\t}\n\nprotected:\n\tconst uint32_t *stream(const Instruction &instr) const\n\t{\n\t\t// If we're not going to use any arguments, just return nullptr.\n\t\t// We want to avoid case where we return an out of range pointer\n\t\t// that trips debug assertions on some platforms.\n\t\tif (!instr.length)\n\t\t\treturn nullptr;\n\n\t\tif (instr.is_embedded())\n\t\t{\n\t\t\tauto &embedded = static_cast<const EmbeddedInstruction &>(instr);\n\t\t\tassert(embedded.ops.size() == instr.length);\n\t\t\treturn embedded.ops.data();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (instr.offset + instr.length > ir.spirv.size())\n\t\t\t\tSPIRV_CROSS_THROW(\"Compiler::stream() out of range.\");\n\t\t\treturn &ir.spirv[instr.offset];\n\t\t}\n\t}\n\n\tuint32_t *stream_mutable(const Instruction &instr) const\n\t{\n\t\treturn const_cast<uint32_t *>(stream(instr));\n\t}\n\n\tParsedIR ir;\n\t// Marks variables which have global scope and variables which can alias with other variables\n\t// (SSBO, image load store, etc)\n\tSmallVector<uint32_t> global_variables;\n\tSmallVector<uint32_t> aliased_variables;\n\n\tSPIRFunction *current_function = nullptr;\n\tSPIRBlock *current_block = nullptr;\n\tuint32_t current_loop_level = 0;\n\tstd::unordered_set<VariableID> active_interface_variables;\n\tbool check_active_interface_variables = false;\n\n\tvoid add_loop_level();\n\n\tvoid set_initializers(SPIRExpression &e)\n\t{\n\t\te.emitted_loop_level = current_loop_level;\n\t}\n\n\ttemplate <typename T>\n\tvoid set_initializers(const T &)\n\t{\n\t}\n\n\t// If our IDs are out of range here as part of opcodes, throw instead of\n\t// undefined behavior.\n\ttemplate <typename T, typename... P>\n\tT &set(uint32_t id, P &&... args)\n\t{\n\t\tir.add_typed_id(static_cast<Types>(T::type), id);\n\t\tauto &var = variant_set<T>(ir.ids[id], std::forward<P>(args)...);\n\t\tvar.self = id;\n\t\tset_initializers(var);\n\t\treturn var;\n\t}\n\n\ttemplate <typename T>\n\tT &get(uint32_t id)\n\t{\n\t\treturn variant_get<T>(ir.ids[id]);\n\t}\n\n\ttemplate <typename T>\n\tT *maybe_get(uint32_t id)\n\t{\n\t\tif (id >= ir.ids.size())\n\t\t\treturn nullptr;\n\t\telse if (ir.ids[id].get_type() == static_cast<Types>(T::type))\n\t\t\treturn &get<T>(id);\n\t\telse\n\t\t\treturn nullptr;\n\t}\n\n\ttemplate <typename T>\n\tconst T &get(uint32_t id) const\n\t{\n\t\treturn variant_get<T>(ir.ids[id]);\n\t}\n\n\ttemplate <typename T>\n\tconst T *maybe_get(uint32_t id) const\n\t{\n\t\tif (id >= ir.ids.size())\n\t\t\treturn nullptr;\n\t\telse if (ir.ids[id].get_type() == static_cast<Types>(T::type))\n\t\t\treturn &get<T>(id);\n\t\telse\n\t\t\treturn nullptr;\n\t}\n\n\t// Gets the id of SPIR-V type underlying the given type_id, which might be a pointer.\n\tuint32_t get_pointee_type_id(uint32_t type_id) const;\n\n\t// Gets the SPIR-V type underlying the given type, which might be a pointer.\n\tconst SPIRType &get_pointee_type(const SPIRType &type) const;\n\n\t// Gets the SPIR-V type underlying the given type_id, which might be a pointer.\n\tconst SPIRType &get_pointee_type(uint32_t type_id) const;\n\n\t// Gets the ID of the SPIR-V type underlying a variable.\n\tuint32_t get_variable_data_type_id(const SPIRVariable &var) const;\n\n\t// Gets the SPIR-V type underlying a variable.\n\tSPIRType &get_variable_data_type(const SPIRVariable &var);\n\n\t// Gets the SPIR-V type underlying a variable.\n\tconst SPIRType &get_variable_data_type(const SPIRVariable &var) const;\n\n\t// Gets the SPIR-V element type underlying an array variable.\n\tSPIRType &get_variable_element_type(const SPIRVariable &var);\n\n\t// Gets the SPIR-V element type underlying an array variable.\n\tconst SPIRType &get_variable_element_type(const SPIRVariable &var) const;\n\n\t// Sets the qualified member identifier for OpTypeStruct ID, member number \"index\".\n\tvoid set_member_qualified_name(uint32_t type_id, uint32_t index, const std::string &name);\n\tvoid set_qualified_name(uint32_t id, const std::string &name);\n\n\t// Returns if the given type refers to a sampled image.\n\tbool is_sampled_image_type(const SPIRType &type);\n\n\tconst SPIREntryPoint &get_entry_point() const;\n\tSPIREntryPoint &get_entry_point();\n\tstatic bool is_tessellation_shader(spv::ExecutionModel model);\n\n\tvirtual std::string to_name(uint32_t id, bool allow_alias = true) const;\n\tbool is_builtin_variable(const SPIRVariable &var) const;\n\tbool is_builtin_type(const SPIRType &type) const;\n\tbool is_hidden_variable(const SPIRVariable &var, bool include_builtins = false) const;\n\tbool is_immutable(uint32_t id) const;\n\tbool is_member_builtin(const SPIRType &type, uint32_t index, spv::BuiltIn *builtin) const;\n\tbool is_scalar(const SPIRType &type) const;\n\tbool is_vector(const SPIRType &type) const;\n\tbool is_matrix(const SPIRType &type) const;\n\tbool is_array(const SPIRType &type) const;\n\tbool is_pointer(const SPIRType &type) const;\n\tbool is_physical_pointer(const SPIRType &type) const;\n\tstatic bool is_runtime_size_array(const SPIRType &type);\n\tuint32_t expression_type_id(uint32_t id) const;\n\tconst SPIRType &expression_type(uint32_t id) const;\n\tbool expression_is_lvalue(uint32_t id) const;\n\tbool variable_storage_is_aliased(const SPIRVariable &var);\n\tSPIRVariable *maybe_get_backing_variable(uint32_t chain);\n\n\tvoid register_read(uint32_t expr, uint32_t chain, bool forwarded);\n\tvoid register_write(uint32_t chain);\n\n\tinline bool is_continue(uint32_t next) const\n\t{\n\t\treturn (ir.block_meta[next] & ParsedIR::BLOCK_META_CONTINUE_BIT) != 0;\n\t}\n\n\tinline bool is_single_block_loop(uint32_t next) const\n\t{\n\t\tauto &block = get<SPIRBlock>(next);\n\t\treturn block.merge == SPIRBlock::MergeLoop && block.continue_block == ID(next);\n\t}\n\n\tinline bool is_break(uint32_t next) const\n\t{\n\t\treturn (ir.block_meta[next] &\n\t\t        (ParsedIR::BLOCK_META_LOOP_MERGE_BIT | ParsedIR::BLOCK_META_MULTISELECT_MERGE_BIT)) != 0;\n\t}\n\n\tinline bool is_loop_break(uint32_t next) const\n\t{\n\t\treturn (ir.block_meta[next] & ParsedIR::BLOCK_META_LOOP_MERGE_BIT) != 0;\n\t}\n\n\tinline bool is_conditional(uint32_t next) const\n\t{\n\t\treturn (ir.block_meta[next] &\n\t\t        (ParsedIR::BLOCK_META_SELECTION_MERGE_BIT | ParsedIR::BLOCK_META_MULTISELECT_MERGE_BIT)) != 0;\n\t}\n\n\t// Dependency tracking for temporaries read from variables.\n\tvoid flush_dependees(SPIRVariable &var);\n\tvoid flush_all_active_variables();\n\tvoid flush_control_dependent_expressions(uint32_t block);\n\tvoid flush_all_atomic_capable_variables();\n\tvoid flush_all_aliased_variables();\n\tvoid register_global_read_dependencies(const SPIRBlock &func, uint32_t id);\n\tvoid register_global_read_dependencies(const SPIRFunction &func, uint32_t id);\n\tstd::unordered_set<uint32_t> invalid_expressions;\n\n\tvoid update_name_cache(std::unordered_set<std::string> &cache, std::string &name);\n\n\t// A variant which takes two sets of names. The secondary is only used to verify there are no collisions,\n\t// but the set is not updated when we have found a new name.\n\t// Used primarily when adding block interface names.\n\tvoid update_name_cache(std::unordered_set<std::string> &cache_primary,\n\t                       const std::unordered_set<std::string> &cache_secondary, std::string &name);\n\n\tbool function_is_pure(const SPIRFunction &func);\n\tbool block_is_pure(const SPIRBlock &block);\n\n\tbool execution_is_branchless(const SPIRBlock &from, const SPIRBlock &to) const;\n\tbool execution_is_direct_branch(const SPIRBlock &from, const SPIRBlock &to) const;\n\tbool execution_is_noop(const SPIRBlock &from, const SPIRBlock &to) const;\n\tSPIRBlock::ContinueBlockType continue_block_type(const SPIRBlock &continue_block) const;\n\n\tvoid force_recompile();\n\tvoid force_recompile_guarantee_forward_progress();\n\tvoid clear_force_recompile();\n\tbool is_forcing_recompilation() const;\n\tbool is_force_recompile = false;\n\tbool is_force_recompile_forward_progress = false;\n\n\tbool block_is_noop(const SPIRBlock &block) const;\n\tbool block_is_loop_candidate(const SPIRBlock &block, SPIRBlock::Method method) const;\n\n\tbool types_are_logically_equivalent(const SPIRType &a, const SPIRType &b) const;\n\tvoid inherit_expression_dependencies(uint32_t dst, uint32_t source);\n\tvoid add_implied_read_expression(SPIRExpression &e, uint32_t source);\n\tvoid add_implied_read_expression(SPIRAccessChain &e, uint32_t source);\n\tvoid add_active_interface_variable(uint32_t var_id);\n\n\t// For proper multiple entry point support, allow querying if an Input or Output\n\t// variable is part of that entry points interface.\n\tbool interface_variable_exists_in_entry_point(uint32_t id) const;\n\n\tSmallVector<CombinedImageSampler> combined_image_samplers;\n\n\tvoid remap_variable_type_name(const SPIRType &type, const std::string &var_name, std::string &type_name) const\n\t{\n\t\tif (variable_remap_callback)\n\t\t\tvariable_remap_callback(type, var_name, type_name);\n\t}\n\n\tvoid set_ir(const ParsedIR &parsed);\n\tvoid set_ir(ParsedIR &&parsed);\n\tvoid parse_fixup();\n\n\t// Used internally to implement various traversals for queries.\n\tstruct OpcodeHandler\n\t{\n\t\tvirtual ~OpcodeHandler() = default;\n\n\t\t// Return true if traversal should continue.\n\t\t// If false, traversal will end immediately.\n\t\tvirtual bool handle(spv::Op opcode, const uint32_t *args, uint32_t length) = 0;\n\t\tvirtual bool handle_terminator(const SPIRBlock &)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\tvirtual bool follow_function_call(const SPIRFunction &)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\tvirtual void set_current_block(const SPIRBlock &)\n\t\t{\n\t\t}\n\n\t\t// Called after returning from a function or when entering a block,\n\t\t// can be called multiple times per block,\n\t\t// while set_current_block is only called on block entry.\n\t\tvirtual void rearm_current_block(const SPIRBlock &)\n\t\t{\n\t\t}\n\n\t\tvirtual bool begin_function_scope(const uint32_t *, uint32_t)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\tvirtual bool end_function_scope(const uint32_t *, uint32_t)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t};\n\n\tstruct BufferAccessHandler : OpcodeHandler\n\t{\n\t\tBufferAccessHandler(const Compiler &compiler_, SmallVector<BufferRange> &ranges_, uint32_t id_)\n\t\t    : compiler(compiler_)\n\t\t    , ranges(ranges_)\n\t\t    , id(id_)\n\t\t{\n\t\t}\n\n\t\tbool handle(spv::Op opcode, const uint32_t *args, uint32_t length) override;\n\n\t\tconst Compiler &compiler;\n\t\tSmallVector<BufferRange> &ranges;\n\t\tuint32_t id;\n\n\t\tstd::unordered_set<uint32_t> seen;\n\t};\n\n\tstruct InterfaceVariableAccessHandler : OpcodeHandler\n\t{\n\t\tInterfaceVariableAccessHandler(const Compiler &compiler_, std::unordered_set<VariableID> &variables_)\n\t\t    : compiler(compiler_)\n\t\t    , variables(variables_)\n\t\t{\n\t\t}\n\n\t\tbool handle(spv::Op opcode, const uint32_t *args, uint32_t length) override;\n\n\t\tconst Compiler &compiler;\n\t\tstd::unordered_set<VariableID> &variables;\n\t};\n\n\tstruct CombinedImageSamplerHandler : OpcodeHandler\n\t{\n\t\tCombinedImageSamplerHandler(Compiler &compiler_)\n\t\t    : compiler(compiler_)\n\t\t{\n\t\t}\n\t\tbool handle(spv::Op opcode, const uint32_t *args, uint32_t length) override;\n\t\tbool begin_function_scope(const uint32_t *args, uint32_t length) override;\n\t\tbool end_function_scope(const uint32_t *args, uint32_t length) override;\n\n\t\tCompiler &compiler;\n\n\t\t// Each function in the call stack needs its own remapping for parameters so we can deduce which global variable each texture/sampler the parameter is statically bound to.\n\t\tstd::stack<std::unordered_map<uint32_t, uint32_t>> parameter_remapping;\n\t\tstd::stack<SPIRFunction *> functions;\n\n\t\tuint32_t remap_parameter(uint32_t id);\n\t\tvoid push_remap_parameters(const SPIRFunction &func, const uint32_t *args, uint32_t length);\n\t\tvoid pop_remap_parameters();\n\t\tvoid register_combined_image_sampler(SPIRFunction &caller, VariableID combined_id, VariableID texture_id,\n\t\t                                     VariableID sampler_id, bool depth);\n\t};\n\n\tstruct DummySamplerForCombinedImageHandler : OpcodeHandler\n\t{\n\t\tDummySamplerForCombinedImageHandler(Compiler &compiler_)\n\t\t    : compiler(compiler_)\n\t\t{\n\t\t}\n\t\tbool handle(spv::Op opcode, const uint32_t *args, uint32_t length) override;\n\n\t\tCompiler &compiler;\n\t\tbool need_dummy_sampler = false;\n\t};\n\n\tstruct ActiveBuiltinHandler : OpcodeHandler\n\t{\n\t\tActiveBuiltinHandler(Compiler &compiler_)\n\t\t    : compiler(compiler_)\n\t\t{\n\t\t}\n\n\t\tbool handle(spv::Op opcode, const uint32_t *args, uint32_t length) override;\n\t\tCompiler &compiler;\n\n\t\tvoid handle_builtin(const SPIRType &type, spv::BuiltIn builtin, const Bitset &decoration_flags);\n\t\tvoid add_if_builtin(uint32_t id);\n\t\tvoid add_if_builtin_or_block(uint32_t id);\n\t\tvoid add_if_builtin(uint32_t id, bool allow_blocks);\n\t};\n\n\tbool traverse_all_reachable_opcodes(const SPIRBlock &block, OpcodeHandler &handler) const;\n\tbool traverse_all_reachable_opcodes(const SPIRFunction &block, OpcodeHandler &handler) const;\n\t// This must be an ordered data structure so we always pick the same type aliases.\n\tSmallVector<uint32_t> global_struct_cache;\n\n\tShaderResources get_shader_resources(const std::unordered_set<VariableID> *active_variables) const;\n\n\tVariableTypeRemapCallback variable_remap_callback;\n\n\tbool get_common_basic_type(const SPIRType &type, SPIRType::BaseType &base_type);\n\n\tstd::unordered_set<uint32_t> forced_temporaries;\n\tstd::unordered_set<uint32_t> forwarded_temporaries;\n\tstd::unordered_set<uint32_t> suppressed_usage_tracking;\n\tstd::unordered_set<uint32_t> hoisted_temporaries;\n\tstd::unordered_set<uint32_t> forced_invariant_temporaries;\n\n\tBitset active_input_builtins;\n\tBitset active_output_builtins;\n\tuint32_t clip_distance_count = 0;\n\tuint32_t cull_distance_count = 0;\n\tbool position_invariant = false;\n\n\tvoid analyze_parameter_preservation(\n\t    SPIRFunction &entry, const CFG &cfg,\n\t    const std::unordered_map<uint32_t, std::unordered_set<uint32_t>> &variable_to_blocks,\n\t    const std::unordered_map<uint32_t, std::unordered_set<uint32_t>> &complete_write_blocks);\n\n\t// If a variable ID or parameter ID is found in this set, a sampler is actually a shadow/comparison sampler.\n\t// SPIR-V does not support this distinction, so we must keep track of this information outside the type system.\n\t// There might be unrelated IDs found in this set which do not correspond to actual variables.\n\t// This set should only be queried for the existence of samplers which are already known to be variables or parameter IDs.\n\t// Similar is implemented for images, as well as if subpass inputs are needed.\n\tstd::unordered_set<uint32_t> comparison_ids;\n\tbool need_subpass_input = false;\n\tbool need_subpass_input_ms = false;\n\n\t// In certain backends, we will need to use a dummy sampler to be able to emit code.\n\t// GLSL does not support texelFetch on texture2D objects, but SPIR-V does,\n\t// so we need to workaround by having the application inject a dummy sampler.\n\tuint32_t dummy_sampler_id = 0;\n\n\tvoid analyze_image_and_sampler_usage();\n\n\tstruct CombinedImageSamplerDrefHandler : OpcodeHandler\n\t{\n\t\tCombinedImageSamplerDrefHandler(Compiler &compiler_)\n\t\t    : compiler(compiler_)\n\t\t{\n\t\t}\n\t\tbool handle(spv::Op opcode, const uint32_t *args, uint32_t length) override;\n\n\t\tCompiler &compiler;\n\t\tstd::unordered_set<uint32_t> dref_combined_samplers;\n\t};\n\n\tstruct CombinedImageSamplerUsageHandler : OpcodeHandler\n\t{\n\t\tCombinedImageSamplerUsageHandler(Compiler &compiler_,\n\t\t                                 const std::unordered_set<uint32_t> &dref_combined_samplers_)\n\t\t    : compiler(compiler_)\n\t\t    , dref_combined_samplers(dref_combined_samplers_)\n\t\t{\n\t\t}\n\n\t\tbool begin_function_scope(const uint32_t *args, uint32_t length) override;\n\t\tbool handle(spv::Op opcode, const uint32_t *args, uint32_t length) override;\n\t\tCompiler &compiler;\n\t\tconst std::unordered_set<uint32_t> &dref_combined_samplers;\n\n\t\tstd::unordered_map<uint32_t, std::unordered_set<uint32_t>> dependency_hierarchy;\n\t\tstd::unordered_set<uint32_t> comparison_ids;\n\n\t\tvoid add_hierarchy_to_comparison_ids(uint32_t ids);\n\t\tbool need_subpass_input = false;\n\t\tbool need_subpass_input_ms = false;\n\t\tvoid add_dependency(uint32_t dst, uint32_t src);\n\t};\n\n\tvoid build_function_control_flow_graphs_and_analyze();\n\tstd::unordered_map<uint32_t, std::unique_ptr<CFG>> function_cfgs;\n\tconst CFG &get_cfg_for_current_function() const;\n\tconst CFG &get_cfg_for_function(uint32_t id) const;\n\n\tstruct CFGBuilder : OpcodeHandler\n\t{\n\t\texplicit CFGBuilder(Compiler &compiler_);\n\n\t\tbool follow_function_call(const SPIRFunction &func) override;\n\t\tbool handle(spv::Op op, const uint32_t *args, uint32_t length) override;\n\t\tCompiler &compiler;\n\t\tstd::unordered_map<uint32_t, std::unique_ptr<CFG>> function_cfgs;\n\t};\n\n\tstruct AnalyzeVariableScopeAccessHandler : OpcodeHandler\n\t{\n\t\tAnalyzeVariableScopeAccessHandler(Compiler &compiler_, SPIRFunction &entry_);\n\n\t\tbool follow_function_call(const SPIRFunction &) override;\n\t\tvoid set_current_block(const SPIRBlock &block) override;\n\n\t\tvoid notify_variable_access(uint32_t id, uint32_t block);\n\t\tbool id_is_phi_variable(uint32_t id) const;\n\t\tbool id_is_potential_temporary(uint32_t id) const;\n\t\tbool handle(spv::Op op, const uint32_t *args, uint32_t length) override;\n\t\tbool handle_terminator(const SPIRBlock &block) override;\n\n\t\tCompiler &compiler;\n\t\tSPIRFunction &entry;\n\t\tstd::unordered_map<uint32_t, std::unordered_set<uint32_t>> accessed_variables_to_block;\n\t\tstd::unordered_map<uint32_t, std::unordered_set<uint32_t>> accessed_temporaries_to_block;\n\t\tstd::unordered_map<uint32_t, uint32_t> result_id_to_type;\n\t\tstd::unordered_map<uint32_t, std::unordered_set<uint32_t>> complete_write_variables_to_block;\n\t\tstd::unordered_map<uint32_t, std::unordered_set<uint32_t>> partial_write_variables_to_block;\n\t\tstd::unordered_set<uint32_t> access_chain_expressions;\n\t\t// Access chains used in multiple blocks mean hoisting all the variables used to construct the access chain as not all backends can use pointers.\n\t\t// This is also relevant when forwarding opaque objects since we cannot lower these to temporaries.\n\t\tstd::unordered_map<uint32_t, std::unordered_set<uint32_t>> rvalue_forward_children;\n\t\tconst SPIRBlock *current_block = nullptr;\n\t};\n\n\tstruct StaticExpressionAccessHandler : OpcodeHandler\n\t{\n\t\tStaticExpressionAccessHandler(Compiler &compiler_, uint32_t variable_id_);\n\t\tbool follow_function_call(const SPIRFunction &) override;\n\t\tbool handle(spv::Op op, const uint32_t *args, uint32_t length) override;\n\n\t\tCompiler &compiler;\n\t\tuint32_t variable_id;\n\t\tuint32_t static_expression = 0;\n\t\tuint32_t write_count = 0;\n\t};\n\n\tstruct PhysicalBlockMeta\n\t{\n\t\tuint32_t alignment = 0;\n\t};\n\n\tstruct PhysicalStorageBufferPointerHandler : OpcodeHandler\n\t{\n\t\texplicit PhysicalStorageBufferPointerHandler(Compiler &compiler_);\n\t\tbool handle(spv::Op op, const uint32_t *args, uint32_t length) override;\n\t\tCompiler &compiler;\n\n\t\tstd::unordered_set<uint32_t> non_block_types;\n\t\tstd::unordered_map<uint32_t, PhysicalBlockMeta> physical_block_type_meta;\n\t\tstd::unordered_map<uint32_t, PhysicalBlockMeta *> access_chain_to_physical_block;\n\n\t\tvoid mark_aligned_access(uint32_t id, const uint32_t *args, uint32_t length);\n\t\tPhysicalBlockMeta *find_block_meta(uint32_t id) const;\n\t\tbool type_is_bda_block_entry(uint32_t type_id) const;\n\t\tvoid setup_meta_chain(uint32_t type_id, uint32_t var_id);\n\t\tuint32_t get_minimum_scalar_alignment(const SPIRType &type) const;\n\t\tvoid analyze_non_block_types_from_block(const SPIRType &type);\n\t\tuint32_t get_base_non_block_type_id(uint32_t type_id) const;\n\t};\n\tvoid analyze_non_block_pointer_types();\n\tSmallVector<uint32_t> physical_storage_non_block_pointer_types;\n\tstd::unordered_map<uint32_t, PhysicalBlockMeta> physical_storage_type_to_alignment;\n\n\tvoid analyze_variable_scope(SPIRFunction &function, AnalyzeVariableScopeAccessHandler &handler);\n\tvoid find_function_local_luts(SPIRFunction &function, const AnalyzeVariableScopeAccessHandler &handler,\n\t                              bool single_function);\n\tbool may_read_undefined_variable_in_block(const SPIRBlock &block, uint32_t var);\n\n\t// Finds all resources that are written to from inside the critical section, if present.\n\t// The critical section is delimited by OpBeginInvocationInterlockEXT and\n\t// OpEndInvocationInterlockEXT instructions. In MSL and HLSL, any resources written\n\t// while inside the critical section must be placed in a raster order group.\n\tstruct InterlockedResourceAccessHandler : OpcodeHandler\n\t{\n\t\tInterlockedResourceAccessHandler(Compiler &compiler_, uint32_t entry_point_id)\n\t\t    : compiler(compiler_)\n\t\t{\n\t\t\tcall_stack.push_back(entry_point_id);\n\t\t}\n\n\t\tbool handle(spv::Op op, const uint32_t *args, uint32_t length) override;\n\t\tbool begin_function_scope(const uint32_t *args, uint32_t length) override;\n\t\tbool end_function_scope(const uint32_t *args, uint32_t length) override;\n\n\t\tCompiler &compiler;\n\t\tbool in_crit_sec = false;\n\n\t\tuint32_t interlock_function_id = 0;\n\t\tbool split_function_case = false;\n\t\tbool control_flow_interlock = false;\n\t\tbool use_critical_section = false;\n\t\tbool call_stack_is_interlocked = false;\n\t\tSmallVector<uint32_t> call_stack;\n\n\t\tvoid access_potential_resource(uint32_t id);\n\t};\n\n\tstruct InterlockedResourceAccessPrepassHandler : OpcodeHandler\n\t{\n\t\tInterlockedResourceAccessPrepassHandler(Compiler &compiler_, uint32_t entry_point_id)\n\t\t    : compiler(compiler_)\n\t\t{\n\t\t\tcall_stack.push_back(entry_point_id);\n\t\t}\n\n\t\tvoid rearm_current_block(const SPIRBlock &block) override;\n\t\tbool handle(spv::Op op, const uint32_t *args, uint32_t length) override;\n\t\tbool begin_function_scope(const uint32_t *args, uint32_t length) override;\n\t\tbool end_function_scope(const uint32_t *args, uint32_t length) override;\n\n\t\tCompiler &compiler;\n\t\tuint32_t interlock_function_id = 0;\n\t\tuint32_t current_block_id = 0;\n\t\tbool split_function_case = false;\n\t\tbool control_flow_interlock = false;\n\t\tSmallVector<uint32_t> call_stack;\n\t};\n\n\tvoid analyze_interlocked_resource_usage();\n\t// The set of all resources written while inside the critical section, if present.\n\tstd::unordered_set<uint32_t> interlocked_resources;\n\tbool interlocked_is_complex = false;\n\n\tvoid make_constant_null(uint32_t id, uint32_t type);\n\n\tstd::unordered_map<uint32_t, std::string> declared_block_names;\n\n\tbool instruction_to_result_type(uint32_t &result_type, uint32_t &result_id, spv::Op op, const uint32_t *args,\n\t                                uint32_t length);\n\n\tBitset combined_decoration_for_member(const SPIRType &type, uint32_t index) const;\n\tstatic bool is_desktop_only_format(spv::ImageFormat format);\n\n\tbool is_depth_image(const SPIRType &type, uint32_t id) const;\n\n\tvoid set_extended_decoration(uint32_t id, ExtendedDecorations decoration, uint32_t value = 0);\n\tuint32_t get_extended_decoration(uint32_t id, ExtendedDecorations decoration) const;\n\tbool has_extended_decoration(uint32_t id, ExtendedDecorations decoration) const;\n\tvoid unset_extended_decoration(uint32_t id, ExtendedDecorations decoration);\n\n\tvoid set_extended_member_decoration(uint32_t type, uint32_t index, ExtendedDecorations decoration,\n\t                                    uint32_t value = 0);\n\tuint32_t get_extended_member_decoration(uint32_t type, uint32_t index, ExtendedDecorations decoration) const;\n\tbool has_extended_member_decoration(uint32_t type, uint32_t index, ExtendedDecorations decoration) const;\n\tvoid unset_extended_member_decoration(uint32_t type, uint32_t index, ExtendedDecorations decoration);\n\n\tbool check_internal_recursion(const SPIRType &type, std::unordered_set<uint32_t> &checked_ids);\n\tbool type_contains_recursion(const SPIRType &type);\n\tbool type_is_array_of_pointers(const SPIRType &type) const;\n\tbool type_is_block_like(const SPIRType &type) const;\n\tbool type_is_top_level_block(const SPIRType &type) const;\n\tbool type_is_opaque_value(const SPIRType &type) const;\n\n\tbool reflection_ssbo_instance_name_is_significant() const;\n\tstd::string get_remapped_declared_block_name(uint32_t id, bool fallback_prefer_instance_name) const;\n\n\tbool flush_phi_required(BlockID from, BlockID to) const;\n\n\tuint32_t evaluate_spec_constant_u32(const SPIRConstantOp &spec) const;\n\tuint32_t evaluate_constant_u32(uint32_t id) const;\n\n\tbool is_vertex_like_shader() const;\n\n\t// Get the correct case list for the OpSwitch, since it can be either a\n\t// 32 bit wide condition or a 64 bit, but the type is not embedded in the\n\t// instruction itself.\n\tconst SmallVector<SPIRBlock::Case> &get_case_list(const SPIRBlock &block) const;\n\nprivate:\n\t// Used only to implement the old deprecated get_entry_point() interface.\n\tconst SPIREntryPoint &get_first_entry_point(const std::string &name) const;\n\tSPIREntryPoint &get_first_entry_point(const std::string &name);\n};\n} // namespace SPIRV_CROSS_NAMESPACE\n\n#endif\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv_cross_containers.hpp",
    "content": "/*\n * Copyright 2019-2021 Hans-Kristian Arntzen\n * SPDX-License-Identifier: Apache-2.0 OR MIT\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * At your option, you may choose to accept this material under either:\n *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or\n *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.\n */\n\n#ifndef SPIRV_CROSS_CONTAINERS_HPP\n#define SPIRV_CROSS_CONTAINERS_HPP\n\n#include \"spirv_cross_error_handling.hpp\"\n#include <algorithm>\n#include <exception>\n#include <functional>\n#include <iterator>\n#include <limits>\n#include <memory>\n#include <stack>\n#include <stddef.h>\n#include <stdint.h>\n#include <stdlib.h>\n#include <string.h>\n#include <type_traits>\n#include <unordered_map>\n#include <unordered_set>\n#include <utility>\n#include <vector>\n\n#ifdef SPIRV_CROSS_NAMESPACE_OVERRIDE\n#define SPIRV_CROSS_NAMESPACE SPIRV_CROSS_NAMESPACE_OVERRIDE\n#else\n#define SPIRV_CROSS_NAMESPACE spirv_cross\n#endif\n\nnamespace SPIRV_CROSS_NAMESPACE\n{\n#ifndef SPIRV_CROSS_FORCE_STL_TYPES\n// std::aligned_storage does not support size == 0, so roll our own.\ntemplate <typename T, size_t N>\nclass AlignedBuffer\n{\npublic:\n\tT *data()\n\t{\n#if defined(_MSC_VER) && _MSC_VER < 1900\n\t\t// MSVC 2013 workarounds, sigh ...\n\t\t// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.\n\t\t// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.\n\t\treturn reinterpret_cast<T *>(u.aligned_char);\n#else\n\t\treturn reinterpret_cast<T *>(aligned_char);\n#endif\n\t}\n\nprivate:\n#if defined(_MSC_VER) && _MSC_VER < 1900\n\t// MSVC 2013 workarounds, sigh ...\n\tunion\n\t{\n\t\tchar aligned_char[sizeof(T) * N];\n\t\tdouble dummy_aligner;\n\t} u;\n#else\n\talignas(T) char aligned_char[sizeof(T) * N];\n#endif\n};\n\ntemplate <typename T>\nclass AlignedBuffer<T, 0>\n{\npublic:\n\tT *data()\n\t{\n\t\treturn nullptr;\n\t}\n};\n\n// An immutable version of SmallVector which erases type information about storage.\ntemplate <typename T>\nclass VectorView\n{\npublic:\n\tT &operator[](size_t i) SPIRV_CROSS_NOEXCEPT\n\t{\n\t\treturn ptr[i];\n\t}\n\n\tconst T &operator[](size_t i) const SPIRV_CROSS_NOEXCEPT\n\t{\n\t\treturn ptr[i];\n\t}\n\n\tbool empty() const SPIRV_CROSS_NOEXCEPT\n\t{\n\t\treturn buffer_size == 0;\n\t}\n\n\tsize_t size() const SPIRV_CROSS_NOEXCEPT\n\t{\n\t\treturn buffer_size;\n\t}\n\n\tT *data() SPIRV_CROSS_NOEXCEPT\n\t{\n\t\treturn ptr;\n\t}\n\n\tconst T *data() const SPIRV_CROSS_NOEXCEPT\n\t{\n\t\treturn ptr;\n\t}\n\n\tT *begin() SPIRV_CROSS_NOEXCEPT\n\t{\n\t\treturn ptr;\n\t}\n\n\tT *end() SPIRV_CROSS_NOEXCEPT\n\t{\n\t\treturn ptr + buffer_size;\n\t}\n\n\tconst T *begin() const SPIRV_CROSS_NOEXCEPT\n\t{\n\t\treturn ptr;\n\t}\n\n\tconst T *end() const SPIRV_CROSS_NOEXCEPT\n\t{\n\t\treturn ptr + buffer_size;\n\t}\n\n\tT &front() SPIRV_CROSS_NOEXCEPT\n\t{\n\t\treturn ptr[0];\n\t}\n\n\tconst T &front() const SPIRV_CROSS_NOEXCEPT\n\t{\n\t\treturn ptr[0];\n\t}\n\n\tT &back() SPIRV_CROSS_NOEXCEPT\n\t{\n\t\treturn ptr[buffer_size - 1];\n\t}\n\n\tconst T &back() const SPIRV_CROSS_NOEXCEPT\n\t{\n\t\treturn ptr[buffer_size - 1];\n\t}\n\n\t// Makes it easier to consume SmallVector.\n#if defined(_MSC_VER) && _MSC_VER < 1900\n\texplicit operator std::vector<T>() const\n\t{\n\t\t// Another MSVC 2013 workaround. It does not understand lvalue/rvalue qualified operations.\n\t\treturn std::vector<T>(ptr, ptr + buffer_size);\n\t}\n#else\n\t// Makes it easier to consume SmallVector.\n\texplicit operator std::vector<T>() const &\n\t{\n\t\treturn std::vector<T>(ptr, ptr + buffer_size);\n\t}\n\n\t// If we are converting as an r-value, we can pilfer our elements.\n\texplicit operator std::vector<T>() &&\n\t{\n\t\treturn std::vector<T>(std::make_move_iterator(ptr), std::make_move_iterator(ptr + buffer_size));\n\t}\n#endif\n\n\t// Avoid sliced copies. Base class should only be read as a reference.\n\tVectorView(const VectorView &) = delete;\n\tvoid operator=(const VectorView &) = delete;\n\nprotected:\n\tVectorView() = default;\n\tT *ptr = nullptr;\n\tsize_t buffer_size = 0;\n};\n\n// Simple vector which supports up to N elements inline, without malloc/free.\n// We use a lot of throwaway vectors all over the place which triggers allocations.\n// This class only implements the subset of std::vector we need in SPIRV-Cross.\n// It is *NOT* a drop-in replacement in general projects.\ntemplate <typename T, size_t N = 8>\nclass SmallVector : public VectorView<T>\n{\npublic:\n\tSmallVector() SPIRV_CROSS_NOEXCEPT\n\t{\n\t\tthis->ptr = stack_storage.data();\n\t\tbuffer_capacity = N;\n\t}\n\n\ttemplate <typename U>\n\tSmallVector(const U *arg_list_begin, const U *arg_list_end) SPIRV_CROSS_NOEXCEPT : SmallVector()\n\t{\n\t\tauto count = size_t(arg_list_end - arg_list_begin);\n\t\treserve(count);\n\t\tfor (size_t i = 0; i < count; i++, arg_list_begin++)\n\t\t\tnew (&this->ptr[i]) T(*arg_list_begin);\n\t\tthis->buffer_size = count;\n\t}\n\n\ttemplate <typename U>\n\tSmallVector(std::initializer_list<U> init) SPIRV_CROSS_NOEXCEPT : SmallVector(init.begin(), init.end())\n\t{\n\t}\n\n\ttemplate <typename U, size_t M>\n\texplicit SmallVector(const U (&init)[M]) SPIRV_CROSS_NOEXCEPT : SmallVector(init, init + M)\n\t{\n\t}\n\n\tSmallVector(SmallVector &&other) SPIRV_CROSS_NOEXCEPT : SmallVector()\n\t{\n\t\t*this = std::move(other);\n\t}\n\n\tSmallVector &operator=(SmallVector &&other) SPIRV_CROSS_NOEXCEPT\n\t{\n\t\tclear();\n\t\tif (other.ptr != other.stack_storage.data())\n\t\t{\n\t\t\t// Pilfer allocated pointer.\n\t\t\tif (this->ptr != stack_storage.data())\n\t\t\t\tfree(this->ptr);\n\t\t\tthis->ptr = other.ptr;\n\t\t\tthis->buffer_size = other.buffer_size;\n\t\t\tbuffer_capacity = other.buffer_capacity;\n\t\t\tother.ptr = nullptr;\n\t\t\tother.buffer_size = 0;\n\t\t\tother.buffer_capacity = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Need to move the stack contents individually.\n\t\t\treserve(other.buffer_size);\n\t\t\tfor (size_t i = 0; i < other.buffer_size; i++)\n\t\t\t{\n\t\t\t\tnew (&this->ptr[i]) T(std::move(other.ptr[i]));\n\t\t\t\tother.ptr[i].~T();\n\t\t\t}\n\t\t\tthis->buffer_size = other.buffer_size;\n\t\t\tother.buffer_size = 0;\n\t\t}\n\t\treturn *this;\n\t}\n\n\tSmallVector(const SmallVector &other) SPIRV_CROSS_NOEXCEPT : SmallVector()\n\t{\n\t\t*this = other;\n\t}\n\n\tSmallVector &operator=(const SmallVector &other) SPIRV_CROSS_NOEXCEPT\n\t{\n\t\tif (this == &other)\n\t\t\treturn *this;\n\n\t\tclear();\n\t\treserve(other.buffer_size);\n\t\tfor (size_t i = 0; i < other.buffer_size; i++)\n\t\t\tnew (&this->ptr[i]) T(other.ptr[i]);\n\t\tthis->buffer_size = other.buffer_size;\n\t\treturn *this;\n\t}\n\n\texplicit SmallVector(size_t count) SPIRV_CROSS_NOEXCEPT : SmallVector()\n\t{\n\t\tresize(count);\n\t}\n\n\t~SmallVector()\n\t{\n\t\tclear();\n\t\tif (this->ptr != stack_storage.data())\n\t\t\tfree(this->ptr);\n\t}\n\n\tvoid clear() SPIRV_CROSS_NOEXCEPT\n\t{\n\t\tfor (size_t i = 0; i < this->buffer_size; i++)\n\t\t\tthis->ptr[i].~T();\n\t\tthis->buffer_size = 0;\n\t}\n\n\tvoid push_back(const T &t) SPIRV_CROSS_NOEXCEPT\n\t{\n\t\treserve(this->buffer_size + 1);\n\t\tnew (&this->ptr[this->buffer_size]) T(t);\n\t\tthis->buffer_size++;\n\t}\n\n\tvoid push_back(T &&t) SPIRV_CROSS_NOEXCEPT\n\t{\n\t\treserve(this->buffer_size + 1);\n\t\tnew (&this->ptr[this->buffer_size]) T(std::move(t));\n\t\tthis->buffer_size++;\n\t}\n\n\tvoid pop_back() SPIRV_CROSS_NOEXCEPT\n\t{\n\t\t// Work around false positive warning on GCC 8.3.\n\t\t// Calling pop_back on empty vector is undefined.\n\t\tif (!this->empty())\n\t\t\tresize(this->buffer_size - 1);\n\t}\n\n\ttemplate <typename... Ts>\n\tvoid emplace_back(Ts &&... ts) SPIRV_CROSS_NOEXCEPT\n\t{\n\t\treserve(this->buffer_size + 1);\n\t\tnew (&this->ptr[this->buffer_size]) T(std::forward<Ts>(ts)...);\n\t\tthis->buffer_size++;\n\t}\n\n\tvoid reserve(size_t count) SPIRV_CROSS_NOEXCEPT\n\t{\n\t\tif ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||\n\t\t    (count > (std::numeric_limits<size_t>::max)() / 2))\n\t\t{\n\t\t\t// Only way this should ever happen is with garbage input, terminate.\n\t\t\tstd::terminate();\n\t\t}\n\n\t\tif (count > buffer_capacity)\n\t\t{\n\t\t\tsize_t target_capacity = buffer_capacity;\n\t\t\tif (target_capacity == 0)\n\t\t\t\ttarget_capacity = 1;\n\n\t\t\t// Weird parens works around macro issues on Windows if NOMINMAX is not used.\n\t\t\ttarget_capacity = (std::max)(target_capacity, N);\n\n\t\t\t// Need to ensure there is a POT value of target capacity which is larger than count,\n\t\t\t// otherwise this will overflow.\n\t\t\twhile (target_capacity < count)\n\t\t\t\ttarget_capacity <<= 1u;\n\n\t\t\tT *new_buffer =\n\t\t\t    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();\n\n\t\t\t// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.\n\t\t\tif (!new_buffer)\n\t\t\t\tstd::terminate();\n\n\t\t\t// In case for some reason two allocations both come from same stack.\n\t\t\tif (new_buffer != this->ptr)\n\t\t\t{\n\t\t\t\t// We don't deal with types which can throw in move constructor.\n\t\t\t\tfor (size_t i = 0; i < this->buffer_size; i++)\n\t\t\t\t{\n\t\t\t\t\tnew (&new_buffer[i]) T(std::move(this->ptr[i]));\n\t\t\t\t\tthis->ptr[i].~T();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this->ptr != stack_storage.data())\n\t\t\t\tfree(this->ptr);\n\t\t\tthis->ptr = new_buffer;\n\t\t\tbuffer_capacity = target_capacity;\n\t\t}\n\t}\n\n\tvoid insert(T *itr, const T *insert_begin, const T *insert_end) SPIRV_CROSS_NOEXCEPT\n\t{\n\t\tauto count = size_t(insert_end - insert_begin);\n\t\tif (itr == this->end())\n\t\t{\n\t\t\treserve(this->buffer_size + count);\n\t\t\tfor (size_t i = 0; i < count; i++, insert_begin++)\n\t\t\t\tnew (&this->ptr[this->buffer_size + i]) T(*insert_begin);\n\t\t\tthis->buffer_size += count;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (this->buffer_size + count > buffer_capacity)\n\t\t\t{\n\t\t\t\tauto target_capacity = this->buffer_size + count;\n\t\t\t\tif (target_capacity == 0)\n\t\t\t\t\ttarget_capacity = 1;\n\t\t\t\tif (target_capacity < N)\n\t\t\t\t\ttarget_capacity = N;\n\n\t\t\t\twhile (target_capacity < count)\n\t\t\t\t\ttarget_capacity <<= 1u;\n\n\t\t\t\t// Need to allocate new buffer. Move everything to a new buffer.\n\t\t\t\tT *new_buffer =\n\t\t\t\t    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();\n\n\t\t\t\t// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.\n\t\t\t\tif (!new_buffer)\n\t\t\t\t\tstd::terminate();\n\n\t\t\t\t// First, move elements from source buffer to new buffer.\n\t\t\t\t// We don't deal with types which can throw in move constructor.\n\t\t\t\tauto *target_itr = new_buffer;\n\t\t\t\tauto *original_source_itr = this->begin();\n\n\t\t\t\tif (new_buffer != this->ptr)\n\t\t\t\t{\n\t\t\t\t\twhile (original_source_itr != itr)\n\t\t\t\t\t{\n\t\t\t\t\t\tnew (target_itr) T(std::move(*original_source_itr));\n\t\t\t\t\t\toriginal_source_itr->~T();\n\t\t\t\t\t\t++original_source_itr;\n\t\t\t\t\t\t++target_itr;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Copy-construct new elements.\n\t\t\t\tfor (auto *source_itr = insert_begin; source_itr != insert_end; ++source_itr, ++target_itr)\n\t\t\t\t\tnew (target_itr) T(*source_itr);\n\n\t\t\t\t// Move over the other half.\n\t\t\t\tif (new_buffer != this->ptr || insert_begin != insert_end)\n\t\t\t\t{\n\t\t\t\t\twhile (original_source_itr != this->end())\n\t\t\t\t\t{\n\t\t\t\t\t\tnew (target_itr) T(std::move(*original_source_itr));\n\t\t\t\t\t\toriginal_source_itr->~T();\n\t\t\t\t\t\t++original_source_itr;\n\t\t\t\t\t\t++target_itr;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this->ptr != stack_storage.data())\n\t\t\t\t\tfree(this->ptr);\n\t\t\t\tthis->ptr = new_buffer;\n\t\t\t\tbuffer_capacity = target_capacity;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Move in place, need to be a bit careful about which elements are constructed and which are not.\n\t\t\t\t// Move the end and construct the new elements.\n\t\t\t\tauto *target_itr = this->end() + count;\n\t\t\t\tauto *source_itr = this->end();\n\t\t\t\twhile (target_itr != this->end() && source_itr != itr)\n\t\t\t\t{\n\t\t\t\t\t--target_itr;\n\t\t\t\t\t--source_itr;\n\t\t\t\t\tnew (target_itr) T(std::move(*source_itr));\n\t\t\t\t}\n\n\t\t\t\t// For already constructed elements we can move-assign.\n\t\t\t\tstd::move_backward(itr, source_itr, target_itr);\n\n\t\t\t\t// For the inserts which go to already constructed elements, we can do a plain copy.\n\t\t\t\twhile (itr != this->end() && insert_begin != insert_end)\n\t\t\t\t\t*itr++ = *insert_begin++;\n\n\t\t\t\t// For inserts into newly allocated memory, we must copy-construct instead.\n\t\t\t\twhile (insert_begin != insert_end)\n\t\t\t\t{\n\t\t\t\t\tnew (itr) T(*insert_begin);\n\t\t\t\t\t++itr;\n\t\t\t\t\t++insert_begin;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis->buffer_size += count;\n\t\t}\n\t}\n\n\tvoid insert(T *itr, const T &value) SPIRV_CROSS_NOEXCEPT\n\t{\n\t\tinsert(itr, &value, &value + 1);\n\t}\n\n\tT *erase(T *itr) SPIRV_CROSS_NOEXCEPT\n\t{\n\t\tstd::move(itr + 1, this->end(), itr);\n\t\tthis->ptr[--this->buffer_size].~T();\n\t\treturn itr;\n\t}\n\n\tvoid erase(T *start_erase, T *end_erase) SPIRV_CROSS_NOEXCEPT\n\t{\n\t\tif (end_erase == this->end())\n\t\t{\n\t\t\tresize(size_t(start_erase - this->begin()));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tauto new_size = this->buffer_size - (end_erase - start_erase);\n\t\t\tstd::move(end_erase, this->end(), start_erase);\n\t\t\tresize(new_size);\n\t\t}\n\t}\n\n\tvoid resize(size_t new_size) SPIRV_CROSS_NOEXCEPT\n\t{\n\t\tif (new_size < this->buffer_size)\n\t\t{\n\t\t\tfor (size_t i = new_size; i < this->buffer_size; i++)\n\t\t\t\tthis->ptr[i].~T();\n\t\t}\n\t\telse if (new_size > this->buffer_size)\n\t\t{\n\t\t\treserve(new_size);\n\t\t\tfor (size_t i = this->buffer_size; i < new_size; i++)\n\t\t\t\tnew (&this->ptr[i]) T();\n\t\t}\n\n\t\tthis->buffer_size = new_size;\n\t}\n\nprivate:\n\tsize_t buffer_capacity = 0;\n\tAlignedBuffer<T, N> stack_storage;\n};\n\n// A vector without stack storage.\n// Could also be a typedef-ed to std::vector,\n// but might as well use the one we have.\ntemplate <typename T>\nusing Vector = SmallVector<T, 0>;\n\n#else // SPIRV_CROSS_FORCE_STL_TYPES\n\ntemplate <typename T, size_t N = 8>\nusing SmallVector = std::vector<T>;\ntemplate <typename T>\nusing Vector = std::vector<T>;\ntemplate <typename T>\nusing VectorView = std::vector<T>;\n\n#endif // SPIRV_CROSS_FORCE_STL_TYPES\n\n// An object pool which we use for allocating IVariant-derived objects.\n// We know we are going to allocate a bunch of objects of each type,\n// so amortize the mallocs.\nclass ObjectPoolBase\n{\npublic:\n\tvirtual ~ObjectPoolBase() = default;\n\tvirtual void deallocate_opaque(void *ptr) = 0;\n};\n\ntemplate <typename T>\nclass ObjectPool : public ObjectPoolBase\n{\npublic:\n\texplicit ObjectPool(unsigned start_object_count_ = 16)\n\t    : start_object_count(start_object_count_)\n\t{\n\t}\n\n\ttemplate <typename... P>\n\tT *allocate(P &&... p)\n\t{\n\t\tif (vacants.empty())\n\t\t{\n\t\t\tunsigned num_objects = start_object_count << memory.size();\n\t\t\tT *ptr = static_cast<T *>(malloc(num_objects * sizeof(T)));\n\t\t\tif (!ptr)\n\t\t\t\treturn nullptr;\n\n\t\t\tfor (unsigned i = 0; i < num_objects; i++)\n\t\t\t\tvacants.push_back(&ptr[i]);\n\n\t\t\tmemory.emplace_back(ptr);\n\t\t}\n\n\t\tT *ptr = vacants.back();\n\t\tvacants.pop_back();\n\t\tnew (ptr) T(std::forward<P>(p)...);\n\t\treturn ptr;\n\t}\n\n\tvoid deallocate(T *ptr)\n\t{\n\t\tptr->~T();\n\t\tvacants.push_back(ptr);\n\t}\n\n\tvoid deallocate_opaque(void *ptr) override\n\t{\n\t\tdeallocate(static_cast<T *>(ptr));\n\t}\n\n\tvoid clear()\n\t{\n\t\tvacants.clear();\n\t\tmemory.clear();\n\t}\n\nprotected:\n\tVector<T *> vacants;\n\n\tstruct MallocDeleter\n\t{\n\t\tvoid operator()(T *ptr)\n\t\t{\n\t\t\t::free(ptr);\n\t\t}\n\t};\n\n\tSmallVector<std::unique_ptr<T, MallocDeleter>> memory;\n\tunsigned start_object_count;\n};\n\ntemplate <size_t StackSize = 4096, size_t BlockSize = 4096>\nclass StringStream\n{\npublic:\n\tStringStream()\n\t{\n\t\treset();\n\t}\n\n\t~StringStream()\n\t{\n\t\treset();\n\t}\n\n\t// Disable copies and moves. Makes it easier to implement, and we don't need it.\n\tStringStream(const StringStream &) = delete;\n\tvoid operator=(const StringStream &) = delete;\n\n\ttemplate <typename T, typename std::enable_if<!std::is_floating_point<T>::value, int>::type = 0>\n\tStringStream &operator<<(const T &t)\n\t{\n\t\tauto s = std::to_string(t);\n\t\tappend(s.data(), s.size());\n\t\treturn *this;\n\t}\n\n\t// Only overload this to make float/double conversions ambiguous.\n\tStringStream &operator<<(uint32_t v)\n\t{\n\t\tauto s = std::to_string(v);\n\t\tappend(s.data(), s.size());\n\t\treturn *this;\n\t}\n\n\tStringStream &operator<<(char c)\n\t{\n\t\tappend(&c, 1);\n\t\treturn *this;\n\t}\n\n\tStringStream &operator<<(const std::string &s)\n\t{\n\t\tappend(s.data(), s.size());\n\t\treturn *this;\n\t}\n\n\tStringStream &operator<<(const char *s)\n\t{\n\t\tappend(s, strlen(s));\n\t\treturn *this;\n\t}\n\n\ttemplate <size_t N>\n\tStringStream &operator<<(const char (&s)[N])\n\t{\n\t\tappend(s, strlen(s));\n\t\treturn *this;\n\t}\n\n\tstd::string str() const\n\t{\n\t\tstd::string ret;\n\t\tsize_t target_size = 0;\n\t\tfor (auto &saved : saved_buffers)\n\t\t\ttarget_size += saved.offset;\n\t\ttarget_size += current_buffer.offset;\n\t\tret.reserve(target_size);\n\n\t\tfor (auto &saved : saved_buffers)\n\t\t\tret.insert(ret.end(), saved.buffer, saved.buffer + saved.offset);\n\t\tret.insert(ret.end(), current_buffer.buffer, current_buffer.buffer + current_buffer.offset);\n\t\treturn ret;\n\t}\n\n\tvoid reset()\n\t{\n\t\tfor (auto &saved : saved_buffers)\n\t\t\tif (saved.buffer != stack_buffer)\n\t\t\t\tfree(saved.buffer);\n\t\tif (current_buffer.buffer != stack_buffer)\n\t\t\tfree(current_buffer.buffer);\n\n\t\tsaved_buffers.clear();\n\t\tcurrent_buffer.buffer = stack_buffer;\n\t\tcurrent_buffer.offset = 0;\n\t\tcurrent_buffer.size = sizeof(stack_buffer);\n\t}\n\nprivate:\n\tstruct Buffer\n\t{\n\t\tchar *buffer = nullptr;\n\t\tsize_t offset = 0;\n\t\tsize_t size = 0;\n\t};\n\tBuffer current_buffer;\n\tchar stack_buffer[StackSize];\n\tSmallVector<Buffer> saved_buffers;\n\n\tvoid append(const char *s, size_t len)\n\t{\n\t\tsize_t avail = current_buffer.size - current_buffer.offset;\n\t\tif (avail < len)\n\t\t{\n\t\t\tif (avail > 0)\n\t\t\t{\n\t\t\t\tmemcpy(current_buffer.buffer + current_buffer.offset, s, avail);\n\t\t\t\ts += avail;\n\t\t\t\tlen -= avail;\n\t\t\t\tcurrent_buffer.offset += avail;\n\t\t\t}\n\n\t\t\tsaved_buffers.push_back(current_buffer);\n\t\t\tsize_t target_size = len > BlockSize ? len : BlockSize;\n\t\t\tcurrent_buffer.buffer = static_cast<char *>(malloc(target_size));\n\t\t\tif (!current_buffer.buffer)\n\t\t\t\tSPIRV_CROSS_THROW(\"Out of memory.\");\n\n\t\t\tmemcpy(current_buffer.buffer, s, len);\n\t\t\tcurrent_buffer.offset = len;\n\t\t\tcurrent_buffer.size = target_size;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmemcpy(current_buffer.buffer + current_buffer.offset, s, len);\n\t\t\tcurrent_buffer.offset += len;\n\t\t}\n\t}\n};\n\n} // namespace SPIRV_CROSS_NAMESPACE\n\n#endif\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv_cross_error_handling.hpp",
    "content": "/*\n * Copyright 2015-2021 Arm Limited\n * SPDX-License-Identifier: Apache-2.0 OR MIT\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * At your option, you may choose to accept this material under either:\n *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or\n *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.\n */\n\n#ifndef SPIRV_CROSS_ERROR_HANDLING\n#define SPIRV_CROSS_ERROR_HANDLING\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string>\n#ifndef SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS\n#include <stdexcept>\n#endif\n\n#ifdef SPIRV_CROSS_NAMESPACE_OVERRIDE\n#define SPIRV_CROSS_NAMESPACE SPIRV_CROSS_NAMESPACE_OVERRIDE\n#else\n#define SPIRV_CROSS_NAMESPACE spirv_cross\n#endif\n\nnamespace SPIRV_CROSS_NAMESPACE\n{\n#ifdef SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS\n#if !defined(_MSC_VER) || defined(__clang__)\n[[noreturn]]\n#elif defined(_MSC_VER)\n__declspec(noreturn)\n#endif\ninline void\nreport_and_abort(const std::string &msg)\n{\n#ifdef NDEBUG\n\t(void)msg;\n#else\n\tfprintf(stderr, \"There was a compiler error: %s\\n\", msg.c_str());\n#endif\n\tfflush(stderr);\n\tabort();\n}\n\n#define SPIRV_CROSS_THROW(x) report_and_abort(x)\n#else\nclass CompilerError : public std::runtime_error\n{\npublic:\n\texplicit CompilerError(const std::string &str)\n\t    : std::runtime_error(str)\n\t{\n\t}\n};\n\n#define SPIRV_CROSS_THROW(x) throw CompilerError(x)\n#endif\n\n// MSVC 2013 does not have noexcept. We need this for Variant to get move constructor to work correctly\n// instead of copy constructor.\n// MSVC 2013 ignores that move constructors cannot throw in std::vector, so just don't define it.\n#if defined(_MSC_VER) && _MSC_VER < 1900\n#define SPIRV_CROSS_NOEXCEPT\n#else\n#define SPIRV_CROSS_NOEXCEPT noexcept\n#endif\n\n#if __cplusplus >= 201402l\n#define SPIRV_CROSS_DEPRECATED(reason) [[deprecated(reason)]]\n#elif defined(__GNUC__)\n#define SPIRV_CROSS_DEPRECATED(reason) __attribute__((deprecated))\n#elif defined(_MSC_VER)\n#define SPIRV_CROSS_DEPRECATED(reason) __declspec(deprecated(reason))\n#else\n#define SPIRV_CROSS_DEPRECATED(reason)\n#endif\n} // namespace SPIRV_CROSS_NAMESPACE\n\n#endif\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv_cross_parsed_ir.cpp",
    "content": "/*\n * Copyright 2018-2021 Arm Limited\n * SPDX-License-Identifier: Apache-2.0 OR MIT\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * At your option, you may choose to accept this material under either:\n *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or\n *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.\n */\n\n#include \"spirv_cross_parsed_ir.hpp\"\n#include <algorithm>\n#include <assert.h>\n\nusing namespace std;\nusing namespace spv;\n\nnamespace SPIRV_CROSS_NAMESPACE\n{\nParsedIR::ParsedIR()\n{\n\t// If we move ParsedIR, we need to make sure the pointer stays fixed since the child Variant objects consume a pointer to this group,\n\t// so need an extra pointer here.\n\tpool_group.reset(new ObjectPoolGroup);\n\n\tpool_group->pools[TypeType].reset(new ObjectPool<SPIRType>);\n\tpool_group->pools[TypeVariable].reset(new ObjectPool<SPIRVariable>);\n\tpool_group->pools[TypeConstant].reset(new ObjectPool<SPIRConstant>);\n\tpool_group->pools[TypeFunction].reset(new ObjectPool<SPIRFunction>);\n\tpool_group->pools[TypeFunctionPrototype].reset(new ObjectPool<SPIRFunctionPrototype>);\n\tpool_group->pools[TypeBlock].reset(new ObjectPool<SPIRBlock>);\n\tpool_group->pools[TypeExtension].reset(new ObjectPool<SPIRExtension>);\n\tpool_group->pools[TypeExpression].reset(new ObjectPool<SPIRExpression>);\n\tpool_group->pools[TypeConstantOp].reset(new ObjectPool<SPIRConstantOp>);\n\tpool_group->pools[TypeCombinedImageSampler].reset(new ObjectPool<SPIRCombinedImageSampler>);\n\tpool_group->pools[TypeAccessChain].reset(new ObjectPool<SPIRAccessChain>);\n\tpool_group->pools[TypeUndef].reset(new ObjectPool<SPIRUndef>);\n\tpool_group->pools[TypeString].reset(new ObjectPool<SPIRString>);\n}\n\n// Should have been default-implemented, but need this on MSVC 2013.\nParsedIR::ParsedIR(ParsedIR &&other) SPIRV_CROSS_NOEXCEPT\n{\n\t*this = std::move(other);\n}\n\nParsedIR &ParsedIR::operator=(ParsedIR &&other) SPIRV_CROSS_NOEXCEPT\n{\n\tif (this != &other)\n\t{\n\t\tpool_group = std::move(other.pool_group);\n\t\tspirv = std::move(other.spirv);\n\t\tmeta = std::move(other.meta);\n\t\tfor (int i = 0; i < TypeCount; i++)\n\t\t\tids_for_type[i] = std::move(other.ids_for_type[i]);\n\t\tids_for_constant_undef_or_type = std::move(other.ids_for_constant_undef_or_type);\n\t\tids_for_constant_or_variable = std::move(other.ids_for_constant_or_variable);\n\t\tdeclared_capabilities = std::move(other.declared_capabilities);\n\t\tdeclared_extensions = std::move(other.declared_extensions);\n\t\tblock_meta = std::move(other.block_meta);\n\t\tcontinue_block_to_loop_header = std::move(other.continue_block_to_loop_header);\n\t\tentry_points = std::move(other.entry_points);\n\t\tids = std::move(other.ids);\n\t\taddressing_model = other.addressing_model;\n\t\tmemory_model = other.memory_model;\n\n\t\tdefault_entry_point = other.default_entry_point;\n\t\tsource = other.source;\n\t\tloop_iteration_depth_hard = other.loop_iteration_depth_hard;\n\t\tloop_iteration_depth_soft = other.loop_iteration_depth_soft;\n\n\t\tmeta_needing_name_fixup = std::move(other.meta_needing_name_fixup);\n\t\tload_type_width = std::move(other.load_type_width);\n\t}\n\treturn *this;\n}\n\nParsedIR::ParsedIR(const ParsedIR &other)\n    : ParsedIR()\n{\n\t*this = other;\n}\n\nParsedIR &ParsedIR::operator=(const ParsedIR &other)\n{\n\tif (this != &other)\n\t{\n\t\tspirv = other.spirv;\n\t\tmeta = other.meta;\n\t\tfor (int i = 0; i < TypeCount; i++)\n\t\t\tids_for_type[i] = other.ids_for_type[i];\n\t\tids_for_constant_undef_or_type = other.ids_for_constant_undef_or_type;\n\t\tids_for_constant_or_variable = other.ids_for_constant_or_variable;\n\t\tdeclared_capabilities = other.declared_capabilities;\n\t\tdeclared_extensions = other.declared_extensions;\n\t\tblock_meta = other.block_meta;\n\t\tcontinue_block_to_loop_header = other.continue_block_to_loop_header;\n\t\tentry_points = other.entry_points;\n\t\tdefault_entry_point = other.default_entry_point;\n\t\tsource = other.source;\n\t\tloop_iteration_depth_hard = other.loop_iteration_depth_hard;\n\t\tloop_iteration_depth_soft = other.loop_iteration_depth_soft;\n\t\taddressing_model = other.addressing_model;\n\t\tmemory_model = other.memory_model;\n\n\n\t\tmeta_needing_name_fixup = other.meta_needing_name_fixup;\n\t\tload_type_width = other.load_type_width;\n\n\t\t// Very deliberate copying of IDs. There is no default copy constructor, nor a simple default constructor.\n\t\t// Construct object first so we have the correct allocator set-up, then we can copy object into our new pool group.\n\t\tids.clear();\n\t\tids.reserve(other.ids.size());\n\t\tfor (size_t i = 0; i < other.ids.size(); i++)\n\t\t{\n\t\t\tids.emplace_back(pool_group.get());\n\t\t\tids.back() = other.ids[i];\n\t\t}\n\t}\n\treturn *this;\n}\n\nvoid ParsedIR::set_id_bounds(uint32_t bounds)\n{\n\tids.reserve(bounds);\n\twhile (ids.size() < bounds)\n\t\tids.emplace_back(pool_group.get());\n\n\tblock_meta.resize(bounds);\n}\n\n// Roll our own versions of these functions to avoid potential locale shenanigans.\nstatic bool is_alpha(char c)\n{\n\treturn (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');\n}\n\nstatic bool is_numeric(char c)\n{\n\treturn c >= '0' && c <= '9';\n}\n\nstatic bool is_alphanumeric(char c)\n{\n\treturn is_alpha(c) || is_numeric(c);\n}\n\nstatic bool is_valid_identifier(const string &name)\n{\n\tif (name.empty())\n\t\treturn true;\n\n\tif (is_numeric(name[0]))\n\t\treturn false;\n\n\tfor (auto c : name)\n\t\tif (!is_alphanumeric(c) && c != '_')\n\t\t\treturn false;\n\n\tbool saw_underscore = false;\n\t// Two underscores in a row is not a valid identifier either.\n\t// Technically reserved, but it's easier to treat it as invalid.\n\tfor (auto c : name)\n\t{\n\t\tbool is_underscore = c == '_';\n\t\tif (is_underscore && saw_underscore)\n\t\t\treturn false;\n\t\tsaw_underscore = is_underscore;\n\t}\n\n\treturn true;\n}\n\nstatic bool is_reserved_prefix(const string &name)\n{\n\t// Generic reserved identifiers used by the implementation.\n\treturn name.compare(0, 3, \"gl_\", 3) == 0 ||\n\t       // Ignore this case for now, might rewrite internal code to always use spv prefix.\n\t       //name.compare(0, 11, \"SPIRV_Cross\", 11) == 0 ||\n\t       name.compare(0, 3, \"spv\", 3) == 0;\n}\n\nstatic bool is_reserved_identifier(const string &name, bool member, bool allow_reserved_prefixes)\n{\n\tif (!allow_reserved_prefixes && is_reserved_prefix(name))\n\t\treturn true;\n\n\tif (member)\n\t{\n\t\t// Reserved member identifiers come in one form:\n\t\t// _m[0-9]+$.\n\t\tif (name.size() < 3)\n\t\t\treturn false;\n\n\t\tif (name.compare(0, 2, \"_m\", 2) != 0)\n\t\t\treturn false;\n\n\t\tsize_t index = 2;\n\t\twhile (index < name.size() && is_numeric(name[index]))\n\t\t\tindex++;\n\n\t\treturn index == name.size();\n\t}\n\telse\n\t{\n\t\t// Reserved non-member identifiers come in two forms:\n\t\t// _[0-9]+$, used for temporaries which map directly to a SPIR-V ID.\n\t\t// _[0-9]+_, used for auxillary temporaries which derived from a SPIR-V ID.\n\t\tif (name.size() < 2)\n\t\t\treturn false;\n\n\t\tif (name[0] != '_' || !is_numeric(name[1]))\n\t\t\treturn false;\n\n\t\tsize_t index = 2;\n\t\twhile (index < name.size() && is_numeric(name[index]))\n\t\t\tindex++;\n\n\t\treturn index == name.size() || (index < name.size() && name[index] == '_');\n\t}\n}\n\nbool ParsedIR::is_globally_reserved_identifier(std::string &str, bool allow_reserved_prefixes)\n{\n\treturn is_reserved_identifier(str, false, allow_reserved_prefixes);\n}\n\nuint32_t ParsedIR::get_spirv_version() const\n{\n\treturn spirv[1];\n}\n\nstatic string make_unreserved_identifier(const string &name)\n{\n\tif (is_reserved_prefix(name))\n\t\treturn \"_RESERVED_IDENTIFIER_FIXUP_\" + name;\n\telse\n\t\treturn \"_RESERVED_IDENTIFIER_FIXUP\" + name;\n}\n\nvoid ParsedIR::sanitize_underscores(std::string &str)\n{\n\t// Compact adjacent underscores to make it valid.\n\tauto dst = str.begin();\n\tauto src = dst;\n\tbool saw_underscore = false;\n\twhile (src != str.end())\n\t{\n\t\tbool is_underscore = *src == '_';\n\t\tif (saw_underscore && is_underscore)\n\t\t{\n\t\t\tsrc++;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (dst != src)\n\t\t\t\t*dst = *src;\n\t\t\tdst++;\n\t\t\tsrc++;\n\t\t\tsaw_underscore = is_underscore;\n\t\t}\n\t}\n\tstr.erase(dst, str.end());\n}\n\nstatic string ensure_valid_identifier(const string &name)\n{\n\t// Functions in glslangValidator are mangled with name(<mangled> stuff.\n\t// Normally, we would never see '(' in any legal identifiers, so just strip them out.\n\tauto str = name.substr(0, name.find('('));\n\n\tif (str.empty())\n\t\treturn str;\n\n\tif (is_numeric(str[0]))\n\t\tstr[0] = '_';\n\n\tfor (auto &c : str)\n\t\tif (!is_alphanumeric(c) && c != '_')\n\t\t\tc = '_';\n\n\tParsedIR::sanitize_underscores(str);\n\treturn str;\n}\n\nconst string &ParsedIR::get_name(ID id) const\n{\n\tauto *m = find_meta(id);\n\tif (m)\n\t\treturn m->decoration.alias;\n\telse\n\t\treturn empty_string;\n}\n\nconst string &ParsedIR::get_member_name(TypeID id, uint32_t index) const\n{\n\tauto *m = find_meta(id);\n\tif (m)\n\t{\n\t\tif (index >= m->members.size())\n\t\t\treturn empty_string;\n\t\treturn m->members[index].alias;\n\t}\n\telse\n\t\treturn empty_string;\n}\n\nvoid ParsedIR::sanitize_identifier(std::string &name, bool member, bool allow_reserved_prefixes)\n{\n\tif (!is_valid_identifier(name))\n\t\tname = ensure_valid_identifier(name);\n\tif (is_reserved_identifier(name, member, allow_reserved_prefixes))\n\t\tname = make_unreserved_identifier(name);\n}\n\nvoid ParsedIR::fixup_reserved_names()\n{\n\tfor (uint32_t id : meta_needing_name_fixup)\n\t{\n\t\t// Don't rename remapped variables like 'gl_LastFragDepthARM'.\n\t\tif (ids[id].get_type() == TypeVariable && get<SPIRVariable>(id).remapped_variable)\n\t\t\tcontinue;\n\n\t\tauto &m = meta[id];\n\t\tsanitize_identifier(m.decoration.alias, false, false);\n\t\tfor (auto &memb : m.members)\n\t\t\tsanitize_identifier(memb.alias, true, false);\n\t}\n\tmeta_needing_name_fixup.clear();\n}\n\nvoid ParsedIR::set_name(ID id, const string &name)\n{\n\tauto &m = meta[id];\n\tm.decoration.alias = name;\n\tif (!is_valid_identifier(name) || is_reserved_identifier(name, false, false))\n\t\tmeta_needing_name_fixup.insert(id);\n}\n\nvoid ParsedIR::set_member_name(TypeID id, uint32_t index, const string &name)\n{\n\tauto &m = meta[id];\n\tm.members.resize(max(m.members.size(), size_t(index) + 1));\n\tm.members[index].alias = name;\n\tif (!is_valid_identifier(name) || is_reserved_identifier(name, true, false))\n\t\tmeta_needing_name_fixup.insert(id);\n}\n\nvoid ParsedIR::set_decoration_string(ID id, Decoration decoration, const string &argument)\n{\n\tauto &dec = meta[id].decoration;\n\tdec.decoration_flags.set(decoration);\n\n\tswitch (decoration)\n\t{\n\tcase DecorationHlslSemanticGOOGLE:\n\t\tdec.hlsl_semantic = argument;\n\t\tbreak;\n\n\tcase DecorationUserTypeGOOGLE:\n\t\tdec.user_type = argument;\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nvoid ParsedIR::set_decoration(ID id, Decoration decoration, uint32_t argument)\n{\n\tauto &dec = meta[id].decoration;\n\tdec.decoration_flags.set(decoration);\n\n\tswitch (decoration)\n\t{\n\tcase DecorationBuiltIn:\n\t\tdec.builtin = true;\n\t\tdec.builtin_type = static_cast<BuiltIn>(argument);\n\t\tbreak;\n\n\tcase DecorationLocation:\n\t\tdec.location = argument;\n\t\tbreak;\n\n\tcase DecorationComponent:\n\t\tdec.component = argument;\n\t\tbreak;\n\n\tcase DecorationOffset:\n\t\tdec.offset = argument;\n\t\tbreak;\n\n\tcase DecorationXfbBuffer:\n\t\tdec.xfb_buffer = argument;\n\t\tbreak;\n\n\tcase DecorationXfbStride:\n\t\tdec.xfb_stride = argument;\n\t\tbreak;\n\n\tcase DecorationStream:\n\t\tdec.stream = argument;\n\t\tbreak;\n\n\tcase DecorationArrayStride:\n\t\tdec.array_stride = argument;\n\t\tbreak;\n\n\tcase DecorationMatrixStride:\n\t\tdec.matrix_stride = argument;\n\t\tbreak;\n\n\tcase DecorationBinding:\n\t\tdec.binding = argument;\n\t\tbreak;\n\n\tcase DecorationDescriptorSet:\n\t\tdec.set = argument;\n\t\tbreak;\n\n\tcase DecorationInputAttachmentIndex:\n\t\tdec.input_attachment = argument;\n\t\tbreak;\n\n\tcase DecorationSpecId:\n\t\tdec.spec_id = argument;\n\t\tbreak;\n\n\tcase DecorationIndex:\n\t\tdec.index = argument;\n\t\tbreak;\n\n\tcase DecorationHlslCounterBufferGOOGLE:\n\t\tmeta[id].hlsl_magic_counter_buffer = argument;\n\t\tmeta[argument].hlsl_is_magic_counter_buffer = true;\n\t\tbreak;\n\n\tcase DecorationFPRoundingMode:\n\t\tdec.fp_rounding_mode = static_cast<FPRoundingMode>(argument);\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nvoid ParsedIR::set_member_decoration(TypeID id, uint32_t index, Decoration decoration, uint32_t argument)\n{\n\tauto &m = meta[id];\n\tm.members.resize(max(m.members.size(), size_t(index) + 1));\n\tauto &dec = m.members[index];\n\tdec.decoration_flags.set(decoration);\n\n\tswitch (decoration)\n\t{\n\tcase DecorationBuiltIn:\n\t\tdec.builtin = true;\n\t\tdec.builtin_type = static_cast<BuiltIn>(argument);\n\t\tbreak;\n\n\tcase DecorationLocation:\n\t\tdec.location = argument;\n\t\tbreak;\n\n\tcase DecorationComponent:\n\t\tdec.component = argument;\n\t\tbreak;\n\n\tcase DecorationBinding:\n\t\tdec.binding = argument;\n\t\tbreak;\n\n\tcase DecorationOffset:\n\t\tdec.offset = argument;\n\t\tbreak;\n\n\tcase DecorationXfbBuffer:\n\t\tdec.xfb_buffer = argument;\n\t\tbreak;\n\n\tcase DecorationXfbStride:\n\t\tdec.xfb_stride = argument;\n\t\tbreak;\n\n\tcase DecorationStream:\n\t\tdec.stream = argument;\n\t\tbreak;\n\n\tcase DecorationSpecId:\n\t\tdec.spec_id = argument;\n\t\tbreak;\n\n\tcase DecorationMatrixStride:\n\t\tdec.matrix_stride = argument;\n\t\tbreak;\n\n\tcase DecorationIndex:\n\t\tdec.index = argument;\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n}\n\n// Recursively marks any constants referenced by the specified constant instruction as being used\n// as an array length. The id must be a constant instruction (SPIRConstant or SPIRConstantOp).\nvoid ParsedIR::mark_used_as_array_length(ID id)\n{\n\tswitch (ids[id].get_type())\n\t{\n\tcase TypeConstant:\n\t\tget<SPIRConstant>(id).is_used_as_array_length = true;\n\t\tbreak;\n\n\tcase TypeConstantOp:\n\t{\n\t\tauto &cop = get<SPIRConstantOp>(id);\n\t\tif (cop.opcode == OpCompositeExtract)\n\t\t\tmark_used_as_array_length(cop.arguments[0]);\n\t\telse if (cop.opcode == OpCompositeInsert)\n\t\t{\n\t\t\tmark_used_as_array_length(cop.arguments[0]);\n\t\t\tmark_used_as_array_length(cop.arguments[1]);\n\t\t}\n\t\telse\n\t\t\tfor (uint32_t arg_id : cop.arguments)\n\t\t\t\tmark_used_as_array_length(arg_id);\n\t\tbreak;\n\t}\n\n\tcase TypeUndef:\n\t\tbreak;\n\n\tdefault:\n\t\tassert(0);\n\t}\n}\n\nBitset ParsedIR::get_buffer_block_type_flags(const SPIRType &type) const\n{\n\tif (type.member_types.empty())\n\t\treturn {};\n\n\tBitset all_members_flags = get_member_decoration_bitset(type.self, 0);\n\tfor (uint32_t i = 1; i < uint32_t(type.member_types.size()); i++)\n\t\tall_members_flags.merge_and(get_member_decoration_bitset(type.self, i));\n\treturn all_members_flags;\n}\n\nBitset ParsedIR::get_buffer_block_flags(const SPIRVariable &var) const\n{\n\tauto &type = get<SPIRType>(var.basetype);\n\tassert(type.basetype == SPIRType::Struct);\n\n\t// Some flags like non-writable, non-readable are actually found\n\t// as member decorations. If all members have a decoration set, propagate\n\t// the decoration up as a regular variable decoration.\n\tBitset base_flags;\n\tauto *m = find_meta(var.self);\n\tif (m)\n\t\tbase_flags = m->decoration.decoration_flags;\n\n\tif (type.member_types.empty())\n\t\treturn base_flags;\n\n\tauto all_members_flags = get_buffer_block_type_flags(type);\n\tbase_flags.merge_or(all_members_flags);\n\treturn base_flags;\n}\n\nconst Bitset &ParsedIR::get_member_decoration_bitset(TypeID id, uint32_t index) const\n{\n\tauto *m = find_meta(id);\n\tif (m)\n\t{\n\t\tif (index >= m->members.size())\n\t\t\treturn cleared_bitset;\n\t\treturn m->members[index].decoration_flags;\n\t}\n\telse\n\t\treturn cleared_bitset;\n}\n\nbool ParsedIR::has_decoration(ID id, Decoration decoration) const\n{\n\treturn get_decoration_bitset(id).get(decoration);\n}\n\nuint32_t ParsedIR::get_decoration(ID id, Decoration decoration) const\n{\n\tauto *m = find_meta(id);\n\tif (!m)\n\t\treturn 0;\n\n\tauto &dec = m->decoration;\n\tif (!dec.decoration_flags.get(decoration))\n\t\treturn 0;\n\n\tswitch (decoration)\n\t{\n\tcase DecorationBuiltIn:\n\t\treturn dec.builtin_type;\n\tcase DecorationLocation:\n\t\treturn dec.location;\n\tcase DecorationComponent:\n\t\treturn dec.component;\n\tcase DecorationOffset:\n\t\treturn dec.offset;\n\tcase DecorationXfbBuffer:\n\t\treturn dec.xfb_buffer;\n\tcase DecorationXfbStride:\n\t\treturn dec.xfb_stride;\n\tcase DecorationStream:\n\t\treturn dec.stream;\n\tcase DecorationBinding:\n\t\treturn dec.binding;\n\tcase DecorationDescriptorSet:\n\t\treturn dec.set;\n\tcase DecorationInputAttachmentIndex:\n\t\treturn dec.input_attachment;\n\tcase DecorationSpecId:\n\t\treturn dec.spec_id;\n\tcase DecorationArrayStride:\n\t\treturn dec.array_stride;\n\tcase DecorationMatrixStride:\n\t\treturn dec.matrix_stride;\n\tcase DecorationIndex:\n\t\treturn dec.index;\n\tcase DecorationFPRoundingMode:\n\t\treturn dec.fp_rounding_mode;\n\tdefault:\n\t\treturn 1;\n\t}\n}\n\nconst string &ParsedIR::get_decoration_string(ID id, Decoration decoration) const\n{\n\tauto *m = find_meta(id);\n\tif (!m)\n\t\treturn empty_string;\n\n\tauto &dec = m->decoration;\n\n\tif (!dec.decoration_flags.get(decoration))\n\t\treturn empty_string;\n\n\tswitch (decoration)\n\t{\n\tcase DecorationHlslSemanticGOOGLE:\n\t\treturn dec.hlsl_semantic;\n\n\tcase DecorationUserTypeGOOGLE:\n\t\treturn dec.user_type;\n\n\tdefault:\n\t\treturn empty_string;\n\t}\n}\n\nvoid ParsedIR::unset_decoration(ID id, Decoration decoration)\n{\n\tauto &dec = meta[id].decoration;\n\tdec.decoration_flags.clear(decoration);\n\tswitch (decoration)\n\t{\n\tcase DecorationBuiltIn:\n\t\tdec.builtin = false;\n\t\tbreak;\n\n\tcase DecorationLocation:\n\t\tdec.location = 0;\n\t\tbreak;\n\n\tcase DecorationComponent:\n\t\tdec.component = 0;\n\t\tbreak;\n\n\tcase DecorationOffset:\n\t\tdec.offset = 0;\n\t\tbreak;\n\n\tcase DecorationXfbBuffer:\n\t\tdec.xfb_buffer = 0;\n\t\tbreak;\n\n\tcase DecorationXfbStride:\n\t\tdec.xfb_stride = 0;\n\t\tbreak;\n\n\tcase DecorationStream:\n\t\tdec.stream = 0;\n\t\tbreak;\n\n\tcase DecorationBinding:\n\t\tdec.binding = 0;\n\t\tbreak;\n\n\tcase DecorationDescriptorSet:\n\t\tdec.set = 0;\n\t\tbreak;\n\n\tcase DecorationInputAttachmentIndex:\n\t\tdec.input_attachment = 0;\n\t\tbreak;\n\n\tcase DecorationSpecId:\n\t\tdec.spec_id = 0;\n\t\tbreak;\n\n\tcase DecorationHlslSemanticGOOGLE:\n\t\tdec.hlsl_semantic.clear();\n\t\tbreak;\n\n\tcase DecorationFPRoundingMode:\n\t\tdec.fp_rounding_mode = FPRoundingModeMax;\n\t\tbreak;\n\n\tcase DecorationHlslCounterBufferGOOGLE:\n\t{\n\t\tauto &counter = meta[id].hlsl_magic_counter_buffer;\n\t\tif (counter)\n\t\t{\n\t\t\tmeta[counter].hlsl_is_magic_counter_buffer = false;\n\t\t\tcounter = 0;\n\t\t}\n\t\tbreak;\n\t}\n\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nbool ParsedIR::has_member_decoration(TypeID id, uint32_t index, Decoration decoration) const\n{\n\treturn get_member_decoration_bitset(id, index).get(decoration);\n}\n\nuint32_t ParsedIR::get_member_decoration(TypeID id, uint32_t index, Decoration decoration) const\n{\n\tauto *m = find_meta(id);\n\tif (!m)\n\t\treturn 0;\n\n\tif (index >= m->members.size())\n\t\treturn 0;\n\n\tauto &dec = m->members[index];\n\tif (!dec.decoration_flags.get(decoration))\n\t\treturn 0;\n\n\tswitch (decoration)\n\t{\n\tcase DecorationBuiltIn:\n\t\treturn dec.builtin_type;\n\tcase DecorationLocation:\n\t\treturn dec.location;\n\tcase DecorationComponent:\n\t\treturn dec.component;\n\tcase DecorationBinding:\n\t\treturn dec.binding;\n\tcase DecorationOffset:\n\t\treturn dec.offset;\n\tcase DecorationXfbBuffer:\n\t\treturn dec.xfb_buffer;\n\tcase DecorationXfbStride:\n\t\treturn dec.xfb_stride;\n\tcase DecorationStream:\n\t\treturn dec.stream;\n\tcase DecorationSpecId:\n\t\treturn dec.spec_id;\n\tcase DecorationIndex:\n\t\treturn dec.index;\n\tdefault:\n\t\treturn 1;\n\t}\n}\n\nconst Bitset &ParsedIR::get_decoration_bitset(ID id) const\n{\n\tauto *m = find_meta(id);\n\tif (m)\n\t{\n\t\tauto &dec = m->decoration;\n\t\treturn dec.decoration_flags;\n\t}\n\telse\n\t\treturn cleared_bitset;\n}\n\nvoid ParsedIR::set_member_decoration_string(TypeID id, uint32_t index, Decoration decoration, const string &argument)\n{\n\tauto &m = meta[id];\n\tm.members.resize(max(m.members.size(), size_t(index) + 1));\n\tauto &dec = meta[id].members[index];\n\tdec.decoration_flags.set(decoration);\n\n\tswitch (decoration)\n\t{\n\tcase DecorationHlslSemanticGOOGLE:\n\t\tdec.hlsl_semantic = argument;\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nconst string &ParsedIR::get_member_decoration_string(TypeID id, uint32_t index, Decoration decoration) const\n{\n\tauto *m = find_meta(id);\n\tif (m)\n\t{\n\t\tif (!has_member_decoration(id, index, decoration))\n\t\t\treturn empty_string;\n\n\t\tauto &dec = m->members[index];\n\n\t\tswitch (decoration)\n\t\t{\n\t\tcase DecorationHlslSemanticGOOGLE:\n\t\t\treturn dec.hlsl_semantic;\n\n\t\tdefault:\n\t\t\treturn empty_string;\n\t\t}\n\t}\n\telse\n\t\treturn empty_string;\n}\n\nvoid ParsedIR::unset_member_decoration(TypeID id, uint32_t index, Decoration decoration)\n{\n\tauto &m = meta[id];\n\tif (index >= m.members.size())\n\t\treturn;\n\n\tauto &dec = m.members[index];\n\n\tdec.decoration_flags.clear(decoration);\n\tswitch (decoration)\n\t{\n\tcase DecorationBuiltIn:\n\t\tdec.builtin = false;\n\t\tbreak;\n\n\tcase DecorationLocation:\n\t\tdec.location = 0;\n\t\tbreak;\n\n\tcase DecorationComponent:\n\t\tdec.component = 0;\n\t\tbreak;\n\n\tcase DecorationOffset:\n\t\tdec.offset = 0;\n\t\tbreak;\n\n\tcase DecorationXfbBuffer:\n\t\tdec.xfb_buffer = 0;\n\t\tbreak;\n\n\tcase DecorationXfbStride:\n\t\tdec.xfb_stride = 0;\n\t\tbreak;\n\n\tcase DecorationStream:\n\t\tdec.stream = 0;\n\t\tbreak;\n\n\tcase DecorationSpecId:\n\t\tdec.spec_id = 0;\n\t\tbreak;\n\n\tcase DecorationHlslSemanticGOOGLE:\n\t\tdec.hlsl_semantic.clear();\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nuint32_t ParsedIR::increase_bound_by(uint32_t incr_amount)\n{\n\tauto curr_bound = ids.size();\n\tauto new_bound = curr_bound + incr_amount;\n\n\tids.reserve(ids.size() + incr_amount);\n\tfor (uint32_t i = 0; i < incr_amount; i++)\n\t\tids.emplace_back(pool_group.get());\n\n\tblock_meta.resize(new_bound);\n\treturn uint32_t(curr_bound);\n}\n\nvoid ParsedIR::remove_typed_id(Types type, ID id)\n{\n\tauto &type_ids = ids_for_type[type];\n\ttype_ids.erase(remove(begin(type_ids), end(type_ids), id), end(type_ids));\n}\n\nvoid ParsedIR::reset_all_of_type(Types type)\n{\n\tfor (auto &id : ids_for_type[type])\n\t\tif (ids[id].get_type() == type)\n\t\t\tids[id].reset();\n\n\tids_for_type[type].clear();\n}\n\nvoid ParsedIR::add_typed_id(Types type, ID id)\n{\n\tif (loop_iteration_depth_hard != 0)\n\t\tSPIRV_CROSS_THROW(\"Cannot add typed ID while looping over it.\");\n\n\tif (loop_iteration_depth_soft != 0)\n\t{\n\t\tif (!ids[id].empty())\n\t\t\tSPIRV_CROSS_THROW(\"Cannot override IDs when loop is soft locked.\");\n\t\treturn;\n\t}\n\n\tif (ids[id].empty() || ids[id].get_type() != type)\n\t{\n\t\tswitch (type)\n\t\t{\n\t\tcase TypeConstant:\n\t\t\tids_for_constant_or_variable.push_back(id);\n\t\t\tids_for_constant_undef_or_type.push_back(id);\n\t\t\tbreak;\n\n\t\tcase TypeVariable:\n\t\t\tids_for_constant_or_variable.push_back(id);\n\t\t\tbreak;\n\n\t\tcase TypeType:\n\t\tcase TypeConstantOp:\n\t\tcase TypeUndef:\n\t\t\tids_for_constant_undef_or_type.push_back(id);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (ids[id].empty())\n\t{\n\t\tids_for_type[type].push_back(id);\n\t}\n\telse if (ids[id].get_type() != type)\n\t{\n\t\tremove_typed_id(ids[id].get_type(), id);\n\t\tids_for_type[type].push_back(id);\n\t}\n}\n\nconst Meta *ParsedIR::find_meta(ID id) const\n{\n\tauto itr = meta.find(id);\n\tif (itr != end(meta))\n\t\treturn &itr->second;\n\telse\n\t\treturn nullptr;\n}\n\nMeta *ParsedIR::find_meta(ID id)\n{\n\tauto itr = meta.find(id);\n\tif (itr != end(meta))\n\t\treturn &itr->second;\n\telse\n\t\treturn nullptr;\n}\n\nParsedIR::LoopLock ParsedIR::create_loop_hard_lock() const\n{\n\treturn ParsedIR::LoopLock(&loop_iteration_depth_hard);\n}\n\nParsedIR::LoopLock ParsedIR::create_loop_soft_lock() const\n{\n\treturn ParsedIR::LoopLock(&loop_iteration_depth_soft);\n}\n\nParsedIR::LoopLock::~LoopLock()\n{\n\tif (lock)\n\t\t(*lock)--;\n}\n\nParsedIR::LoopLock::LoopLock(uint32_t *lock_)\n    : lock(lock_)\n{\n\tif (lock)\n\t\t(*lock)++;\n}\n\nParsedIR::LoopLock::LoopLock(LoopLock &&other) SPIRV_CROSS_NOEXCEPT\n{\n\t*this = std::move(other);\n}\n\nParsedIR::LoopLock &ParsedIR::LoopLock::operator=(LoopLock &&other) SPIRV_CROSS_NOEXCEPT\n{\n\tif (lock)\n\t\t(*lock)--;\n\tlock = other.lock;\n\tother.lock = nullptr;\n\treturn *this;\n}\n\nvoid ParsedIR::make_constant_null(uint32_t id, uint32_t type, bool add_to_typed_id_set)\n{\n\tauto &constant_type = get<SPIRType>(type);\n\n\tif (constant_type.pointer)\n\t{\n\t\tif (add_to_typed_id_set)\n\t\t\tadd_typed_id(TypeConstant, id);\n\t\tauto &constant = variant_set<SPIRConstant>(ids[id], type);\n\t\tconstant.self = id;\n\t\tconstant.make_null(constant_type);\n\t}\n\telse if (!constant_type.array.empty())\n\t{\n\t\tassert(constant_type.parent_type);\n\t\tuint32_t parent_id = increase_bound_by(1);\n\t\tmake_constant_null(parent_id, constant_type.parent_type, add_to_typed_id_set);\n\n\t\tif (!constant_type.array_size_literal.back())\n\t\t\tSPIRV_CROSS_THROW(\"Array size of OpConstantNull must be a literal.\");\n\n\t\tSmallVector<uint32_t> elements(constant_type.array.back());\n\t\tfor (uint32_t i = 0; i < constant_type.array.back(); i++)\n\t\t\telements[i] = parent_id;\n\n\t\tif (add_to_typed_id_set)\n\t\t\tadd_typed_id(TypeConstant, id);\n\t\tvariant_set<SPIRConstant>(ids[id], type, elements.data(), uint32_t(elements.size()), false).self = id;\n\t}\n\telse if (!constant_type.member_types.empty())\n\t{\n\t\tuint32_t member_ids = increase_bound_by(uint32_t(constant_type.member_types.size()));\n\t\tSmallVector<uint32_t> elements(constant_type.member_types.size());\n\t\tfor (uint32_t i = 0; i < constant_type.member_types.size(); i++)\n\t\t{\n\t\t\tmake_constant_null(member_ids + i, constant_type.member_types[i], add_to_typed_id_set);\n\t\t\telements[i] = member_ids + i;\n\t\t}\n\n\t\tif (add_to_typed_id_set)\n\t\t\tadd_typed_id(TypeConstant, id);\n\t\tvariant_set<SPIRConstant>(ids[id], type, elements.data(), uint32_t(elements.size()), false).self = id;\n\t}\n\telse\n\t{\n\t\tif (add_to_typed_id_set)\n\t\t\tadd_typed_id(TypeConstant, id);\n\t\tauto &constant = variant_set<SPIRConstant>(ids[id], type);\n\t\tconstant.self = id;\n\t\tconstant.make_null(constant_type);\n\t}\n}\n\n} // namespace SPIRV_CROSS_NAMESPACE\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv_cross_parsed_ir.hpp",
    "content": "/*\n * Copyright 2018-2021 Arm Limited\n * SPDX-License-Identifier: Apache-2.0 OR MIT\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * At your option, you may choose to accept this material under either:\n *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or\n *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.\n */\n\n#ifndef SPIRV_CROSS_PARSED_IR_HPP\n#define SPIRV_CROSS_PARSED_IR_HPP\n\n#include \"spirv_common.hpp\"\n#include <stdint.h>\n#include <unordered_map>\n\nnamespace SPIRV_CROSS_NAMESPACE\n{\n\n// This data structure holds all information needed to perform cross-compilation and reflection.\n// It is the output of the Parser, but any implementation could create this structure.\n// It is intentionally very \"open\" and struct-like with some helper functions to deal with decorations.\n// Parser is the reference implementation of how this data structure should be filled in.\n\nclass ParsedIR\n{\nprivate:\n\t// This must be destroyed after the \"ids\" vector.\n\tstd::unique_ptr<ObjectPoolGroup> pool_group;\n\npublic:\n\tParsedIR();\n\n\t// Due to custom allocations from object pools, we cannot use a default copy constructor.\n\tParsedIR(const ParsedIR &other);\n\tParsedIR &operator=(const ParsedIR &other);\n\n\t// Moves are unproblematic, but we need to implement it anyways, since MSVC 2013 does not understand\n\t// how to default-implement these.\n\tParsedIR(ParsedIR &&other) SPIRV_CROSS_NOEXCEPT;\n\tParsedIR &operator=(ParsedIR &&other) SPIRV_CROSS_NOEXCEPT;\n\n\t// Resizes ids, meta and block_meta.\n\tvoid set_id_bounds(uint32_t bounds);\n\n\t// The raw SPIR-V, instructions and opcodes refer to this by offset + count.\n\tstd::vector<uint32_t> spirv;\n\n\t// Holds various data structures which inherit from IVariant.\n\tSmallVector<Variant> ids;\n\n\t// Various meta data for IDs, decorations, names, etc.\n\tstd::unordered_map<ID, Meta> meta;\n\n\t// Holds all IDs which have a certain type.\n\t// This is needed so we can iterate through a specific kind of resource quickly,\n\t// and in-order of module declaration.\n\tSmallVector<ID> ids_for_type[TypeCount];\n\n\t// Special purpose lists which contain a union of types.\n\t// This is needed so we can declare specialization constants and structs in an interleaved fashion,\n\t// among other things.\n\t// Constants can be undef or of struct type, and struct array sizes can use specialization constants.\n\tSmallVector<ID> ids_for_constant_undef_or_type;\n\tSmallVector<ID> ids_for_constant_or_variable;\n\n\t// We need to keep track of the width the Ops that contains a type for the\n\t// OpSwitch instruction, since this one doesn't contains the type in the\n\t// instruction itself. And in some case we need to cast the condition to\n\t// wider types. We only need the width to do the branch fixup since the\n\t// type check itself can be done at runtime\n\tstd::unordered_map<ID, uint32_t> load_type_width;\n\n\t// Declared capabilities and extensions in the SPIR-V module.\n\t// Not really used except for reflection at the moment.\n\tSmallVector<spv::Capability> declared_capabilities;\n\tSmallVector<std::string> declared_extensions;\n\n\t// Meta data about blocks. The cross-compiler needs to query if a block is either of these types.\n\t// It is a bitset as there can be more than one tag per block.\n\tenum BlockMetaFlagBits\n\t{\n\t\tBLOCK_META_LOOP_HEADER_BIT = 1 << 0,\n\t\tBLOCK_META_CONTINUE_BIT = 1 << 1,\n\t\tBLOCK_META_LOOP_MERGE_BIT = 1 << 2,\n\t\tBLOCK_META_SELECTION_MERGE_BIT = 1 << 3,\n\t\tBLOCK_META_MULTISELECT_MERGE_BIT = 1 << 4\n\t};\n\tusing BlockMetaFlags = uint8_t;\n\tSmallVector<BlockMetaFlags> block_meta;\n\tstd::unordered_map<BlockID, BlockID> continue_block_to_loop_header;\n\n\t// Normally, we'd stick SPIREntryPoint in ids array, but it conflicts with SPIRFunction.\n\t// Entry points can therefore be seen as some sort of meta structure.\n\tstd::unordered_map<FunctionID, SPIREntryPoint> entry_points;\n\tFunctionID default_entry_point = 0;\n\n\tstruct Source\n\t{\n\t\tuint32_t version = 0;\n\t\tbool es = false;\n\t\tbool known = false;\n\t\tbool hlsl = false;\n\n\t\tSource() = default;\n\t};\n\n\tSource source;\n\n\tspv::AddressingModel addressing_model = spv::AddressingModelMax;\n\tspv::MemoryModel memory_model = spv::MemoryModelMax;\n\n\t// Decoration handling methods.\n\t// Can be useful for simple \"raw\" reflection.\n\t// However, most members are here because the Parser needs most of these,\n\t// and might as well just have the whole suite of decoration/name handling in one place.\n\tvoid set_name(ID id, const std::string &name);\n\tconst std::string &get_name(ID id) const;\n\tvoid set_decoration(ID id, spv::Decoration decoration, uint32_t argument = 0);\n\tvoid set_decoration_string(ID id, spv::Decoration decoration, const std::string &argument);\n\tbool has_decoration(ID id, spv::Decoration decoration) const;\n\tuint32_t get_decoration(ID id, spv::Decoration decoration) const;\n\tconst std::string &get_decoration_string(ID id, spv::Decoration decoration) const;\n\tconst Bitset &get_decoration_bitset(ID id) const;\n\tvoid unset_decoration(ID id, spv::Decoration decoration);\n\n\t// Decoration handling methods (for members of a struct).\n\tvoid set_member_name(TypeID id, uint32_t index, const std::string &name);\n\tconst std::string &get_member_name(TypeID id, uint32_t index) const;\n\tvoid set_member_decoration(TypeID id, uint32_t index, spv::Decoration decoration, uint32_t argument = 0);\n\tvoid set_member_decoration_string(TypeID id, uint32_t index, spv::Decoration decoration,\n\t                                  const std::string &argument);\n\tuint32_t get_member_decoration(TypeID id, uint32_t index, spv::Decoration decoration) const;\n\tconst std::string &get_member_decoration_string(TypeID id, uint32_t index, spv::Decoration decoration) const;\n\tbool has_member_decoration(TypeID id, uint32_t index, spv::Decoration decoration) const;\n\tconst Bitset &get_member_decoration_bitset(TypeID id, uint32_t index) const;\n\tvoid unset_member_decoration(TypeID id, uint32_t index, spv::Decoration decoration);\n\n\tvoid mark_used_as_array_length(ID id);\n\tuint32_t increase_bound_by(uint32_t count);\n\tBitset get_buffer_block_flags(const SPIRVariable &var) const;\n\tBitset get_buffer_block_type_flags(const SPIRType &type) const;\n\n\tvoid add_typed_id(Types type, ID id);\n\tvoid remove_typed_id(Types type, ID id);\n\n\tclass LoopLock\n\t{\n\tpublic:\n\t\texplicit LoopLock(uint32_t *counter);\n\t\tLoopLock(const LoopLock &) = delete;\n\t\tvoid operator=(const LoopLock &) = delete;\n\t\tLoopLock(LoopLock &&other) SPIRV_CROSS_NOEXCEPT;\n\t\tLoopLock &operator=(LoopLock &&other) SPIRV_CROSS_NOEXCEPT;\n\t\t~LoopLock();\n\n\tprivate:\n\t\tuint32_t *lock;\n\t};\n\n\t// This must be held while iterating over a type ID array.\n\t// It is undefined if someone calls set<>() while we're iterating over a data structure, so we must\n\t// make sure that this case is avoided.\n\n\t// If we have a hard lock, it is an error to call set<>(), and an exception is thrown.\n\t// If we have a soft lock, we silently ignore any additions to the typed arrays.\n\t// This should only be used for physical ID remapping where we need to create an ID, but we will never\n\t// care about iterating over them.\n\tLoopLock create_loop_hard_lock() const;\n\tLoopLock create_loop_soft_lock() const;\n\n\ttemplate <typename T, typename Op>\n\tvoid for_each_typed_id(const Op &op)\n\t{\n\t\tauto loop_lock = create_loop_hard_lock();\n\t\tfor (auto &id : ids_for_type[T::type])\n\t\t{\n\t\t\tif (ids[id].get_type() == static_cast<Types>(T::type))\n\t\t\t\top(id, get<T>(id));\n\t\t}\n\t}\n\n\ttemplate <typename T, typename Op>\n\tvoid for_each_typed_id(const Op &op) const\n\t{\n\t\tauto loop_lock = create_loop_hard_lock();\n\t\tfor (auto &id : ids_for_type[T::type])\n\t\t{\n\t\t\tif (ids[id].get_type() == static_cast<Types>(T::type))\n\t\t\t\top(id, get<T>(id));\n\t\t}\n\t}\n\n\ttemplate <typename T>\n\tvoid reset_all_of_type()\n\t{\n\t\treset_all_of_type(static_cast<Types>(T::type));\n\t}\n\n\tvoid reset_all_of_type(Types type);\n\n\tMeta *find_meta(ID id);\n\tconst Meta *find_meta(ID id) const;\n\n\tconst std::string &get_empty_string() const\n\t{\n\t\treturn empty_string;\n\t}\n\n\tvoid make_constant_null(uint32_t id, uint32_t type, bool add_to_typed_id_set);\n\n\tvoid fixup_reserved_names();\n\n\tstatic void sanitize_underscores(std::string &str);\n\tstatic void sanitize_identifier(std::string &str, bool member, bool allow_reserved_prefixes);\n\tstatic bool is_globally_reserved_identifier(std::string &str, bool allow_reserved_prefixes);\n\n\tuint32_t get_spirv_version() const;\n\nprivate:\n\ttemplate <typename T>\n\tT &get(uint32_t id)\n\t{\n\t\treturn variant_get<T>(ids[id]);\n\t}\n\n\ttemplate <typename T>\n\tconst T &get(uint32_t id) const\n\t{\n\t\treturn variant_get<T>(ids[id]);\n\t}\n\n\tmutable uint32_t loop_iteration_depth_hard = 0;\n\tmutable uint32_t loop_iteration_depth_soft = 0;\n\tstd::string empty_string;\n\tBitset cleared_bitset;\n\n\tstd::unordered_set<uint32_t> meta_needing_name_fixup;\n};\n} // namespace SPIRV_CROSS_NAMESPACE\n\n#endif\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv_cross_util.cpp",
    "content": "/*\n * Copyright 2015-2021 Arm Limited\n * SPDX-License-Identifier: Apache-2.0 OR MIT\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * At your option, you may choose to accept this material under either:\n *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or\n *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.\n */\n\n#include \"spirv_cross_util.hpp\"\n#include \"spirv_common.hpp\"\n\nusing namespace spv;\nusing namespace SPIRV_CROSS_NAMESPACE;\n\nnamespace spirv_cross_util\n{\nvoid rename_interface_variable(Compiler &compiler, const SmallVector<Resource> &resources, uint32_t location,\n                               const std::string &name)\n{\n\tfor (auto &v : resources)\n\t{\n\t\tif (!compiler.has_decoration(v.id, spv::DecorationLocation))\n\t\t\tcontinue;\n\n\t\tauto loc = compiler.get_decoration(v.id, spv::DecorationLocation);\n\t\tif (loc != location)\n\t\t\tcontinue;\n\n\t\tauto &type = compiler.get_type(v.base_type_id);\n\n\t\t// This is more of a friendly variant. If we need to rename interface variables, we might have to rename\n\t\t// structs as well and make sure all the names match up.\n\t\tif (type.basetype == SPIRType::Struct)\n\t\t{\n\t\t\tcompiler.set_name(v.base_type_id, join(\"SPIRV_Cross_Interface_Location\", location));\n\t\t\tfor (uint32_t i = 0; i < uint32_t(type.member_types.size()); i++)\n\t\t\t\tcompiler.set_member_name(v.base_type_id, i, join(\"InterfaceMember\", i));\n\t\t}\n\n\t\tcompiler.set_name(v.id, name);\n\t}\n}\n\nvoid inherit_combined_sampler_bindings(Compiler &compiler)\n{\n\tauto &samplers = compiler.get_combined_image_samplers();\n\tfor (auto &s : samplers)\n\t{\n\t\tif (compiler.has_decoration(s.image_id, spv::DecorationDescriptorSet))\n\t\t{\n\t\t\tuint32_t set = compiler.get_decoration(s.image_id, spv::DecorationDescriptorSet);\n\t\t\tcompiler.set_decoration(s.combined_id, spv::DecorationDescriptorSet, set);\n\t\t}\n\n\t\tif (compiler.has_decoration(s.image_id, spv::DecorationBinding))\n\t\t{\n\t\t\tuint32_t binding = compiler.get_decoration(s.image_id, spv::DecorationBinding);\n\t\t\tcompiler.set_decoration(s.combined_id, spv::DecorationBinding, binding);\n\t\t}\n\t}\n}\n} // namespace spirv_cross_util\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv_cross_util.hpp",
    "content": "/*\n * Copyright 2015-2021 Arm Limited\n * SPDX-License-Identifier: Apache-2.0 OR MIT\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * At your option, you may choose to accept this material under either:\n *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or\n *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.\n */\n\n#ifndef SPIRV_CROSS_UTIL_HPP\n#define SPIRV_CROSS_UTIL_HPP\n\n#include \"spirv_cross.hpp\"\n\nnamespace spirv_cross_util\n{\nvoid rename_interface_variable(SPIRV_CROSS_NAMESPACE::Compiler &compiler,\n                               const SPIRV_CROSS_NAMESPACE::SmallVector<SPIRV_CROSS_NAMESPACE::Resource> &resources,\n                               uint32_t location, const std::string &name);\nvoid inherit_combined_sampler_bindings(SPIRV_CROSS_NAMESPACE::Compiler &compiler);\n} // namespace spirv_cross_util\n\n#endif\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv_glsl.cpp",
    "content": "/*\n * Copyright 2015-2021 Arm Limited\n * SPDX-License-Identifier: Apache-2.0 OR MIT\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * At your option, you may choose to accept this material under either:\n *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or\n *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.\n */\n\n#include \"spirv_glsl.hpp\"\n#include \"GLSL.std.450.h\"\n#include \"spirv_common.hpp\"\n#include <algorithm>\n#include <assert.h>\n#include <cmath>\n#include <limits>\n#include <locale.h>\n#include <utility>\n#include <array>\n\n#ifndef _WIN32\n#include <langinfo.h>\n#endif\n#include <locale.h>\n\nusing namespace spv;\nusing namespace SPIRV_CROSS_NAMESPACE;\nusing namespace std;\n\nenum ExtraSubExpressionType\n{\n\t// Create masks above any legal ID range to allow multiple address spaces into the extra_sub_expressions map.\n\tEXTRA_SUB_EXPRESSION_TYPE_STREAM_OFFSET = 0x10000000,\n\tEXTRA_SUB_EXPRESSION_TYPE_AUX = 0x20000000\n};\n\nstatic bool is_unsigned_opcode(Op op)\n{\n\t// Don't have to be exhaustive, only relevant for legacy target checking ...\n\tswitch (op)\n\t{\n\tcase OpShiftRightLogical:\n\tcase OpUGreaterThan:\n\tcase OpUGreaterThanEqual:\n\tcase OpULessThan:\n\tcase OpULessThanEqual:\n\tcase OpUConvert:\n\tcase OpUDiv:\n\tcase OpUMod:\n\tcase OpUMulExtended:\n\tcase OpConvertUToF:\n\tcase OpConvertFToU:\n\t\treturn true;\n\n\tdefault:\n\t\treturn false;\n\t}\n}\n\nstatic bool is_unsigned_glsl_opcode(GLSLstd450 op)\n{\n\t// Don't have to be exhaustive, only relevant for legacy target checking ...\n\tswitch (op)\n\t{\n\tcase GLSLstd450UClamp:\n\tcase GLSLstd450UMin:\n\tcase GLSLstd450UMax:\n\tcase GLSLstd450FindUMsb:\n\t\treturn true;\n\n\tdefault:\n\t\treturn false;\n\t}\n}\n\nstatic bool packing_is_vec4_padded(BufferPackingStandard packing)\n{\n\tswitch (packing)\n\t{\n\tcase BufferPackingHLSLCbuffer:\n\tcase BufferPackingHLSLCbufferPackOffset:\n\tcase BufferPackingStd140:\n\tcase BufferPackingStd140EnhancedLayout:\n\t\treturn true;\n\n\tdefault:\n\t\treturn false;\n\t}\n}\n\nstatic bool packing_is_hlsl(BufferPackingStandard packing)\n{\n\tswitch (packing)\n\t{\n\tcase BufferPackingHLSLCbuffer:\n\tcase BufferPackingHLSLCbufferPackOffset:\n\t\treturn true;\n\n\tdefault:\n\t\treturn false;\n\t}\n}\n\nstatic bool packing_has_flexible_offset(BufferPackingStandard packing)\n{\n\tswitch (packing)\n\t{\n\tcase BufferPackingStd140:\n\tcase BufferPackingStd430:\n\tcase BufferPackingScalar:\n\tcase BufferPackingHLSLCbuffer:\n\t\treturn false;\n\n\tdefault:\n\t\treturn true;\n\t}\n}\n\nstatic bool packing_is_scalar(BufferPackingStandard packing)\n{\n\tswitch (packing)\n\t{\n\tcase BufferPackingScalar:\n\tcase BufferPackingScalarEnhancedLayout:\n\t\treturn true;\n\n\tdefault:\n\t\treturn false;\n\t}\n}\n\nstatic BufferPackingStandard packing_to_substruct_packing(BufferPackingStandard packing)\n{\n\tswitch (packing)\n\t{\n\tcase BufferPackingStd140EnhancedLayout:\n\t\treturn BufferPackingStd140;\n\tcase BufferPackingStd430EnhancedLayout:\n\t\treturn BufferPackingStd430;\n\tcase BufferPackingHLSLCbufferPackOffset:\n\t\treturn BufferPackingHLSLCbuffer;\n\tcase BufferPackingScalarEnhancedLayout:\n\t\treturn BufferPackingScalar;\n\tdefault:\n\t\treturn packing;\n\t}\n}\n\nvoid CompilerGLSL::init()\n{\n\tif (ir.source.known)\n\t{\n\t\toptions.es = ir.source.es;\n\t\toptions.version = ir.source.version;\n\t}\n\n\t// Query the locale to see what the decimal point is.\n\t// We'll rely on fixing it up ourselves in the rare case we have a comma-as-decimal locale\n\t// rather than setting locales ourselves. Settings locales in a safe and isolated way is rather\n\t// tricky.\n#ifdef _WIN32\n\t// On Windows, localeconv uses thread-local storage, so it should be fine.\n\tconst struct lconv *conv = localeconv();\n\tif (conv && conv->decimal_point)\n\t\tcurrent_locale_radix_character = *conv->decimal_point;\n#elif defined(__ANDROID__) && __ANDROID_API__ < 26\n\t// nl_langinfo is not supported on this platform, fall back to the worse alternative.\n\tconst struct lconv *conv = localeconv();\n\tif (conv && conv->decimal_point)\n\t\tcurrent_locale_radix_character = *conv->decimal_point;\n#else\n\t// localeconv, the portable function is not MT safe ...\n\tconst char *decimal_point = nl_langinfo(RADIXCHAR);\n\tif (decimal_point && *decimal_point != '\\0')\n\t\tcurrent_locale_radix_character = *decimal_point;\n#endif\n}\n\nstatic const char *to_pls_layout(PlsFormat format)\n{\n\tswitch (format)\n\t{\n\tcase PlsR11FG11FB10F:\n\t\treturn \"layout(r11f_g11f_b10f) \";\n\tcase PlsR32F:\n\t\treturn \"layout(r32f) \";\n\tcase PlsRG16F:\n\t\treturn \"layout(rg16f) \";\n\tcase PlsRGB10A2:\n\t\treturn \"layout(rgb10_a2) \";\n\tcase PlsRGBA8:\n\t\treturn \"layout(rgba8) \";\n\tcase PlsRG16:\n\t\treturn \"layout(rg16) \";\n\tcase PlsRGBA8I:\n\t\treturn \"layout(rgba8i)\";\n\tcase PlsRG16I:\n\t\treturn \"layout(rg16i) \";\n\tcase PlsRGB10A2UI:\n\t\treturn \"layout(rgb10_a2ui) \";\n\tcase PlsRGBA8UI:\n\t\treturn \"layout(rgba8ui) \";\n\tcase PlsRG16UI:\n\t\treturn \"layout(rg16ui) \";\n\tcase PlsR32UI:\n\t\treturn \"layout(r32ui) \";\n\tdefault:\n\t\treturn \"\";\n\t}\n}\n\nstatic std::pair<spv::Op, SPIRType::BaseType> pls_format_to_basetype(PlsFormat format)\n{\n\tswitch (format)\n\t{\n\tdefault:\n\tcase PlsR11FG11FB10F:\n\tcase PlsR32F:\n\tcase PlsRG16F:\n\tcase PlsRGB10A2:\n\tcase PlsRGBA8:\n\tcase PlsRG16:\n\t\treturn std::make_pair(spv::OpTypeFloat, SPIRType::Float);\n\n\tcase PlsRGBA8I:\n\tcase PlsRG16I:\n\t\treturn std::make_pair(spv::OpTypeInt, SPIRType::Int);\n\n\tcase PlsRGB10A2UI:\n\tcase PlsRGBA8UI:\n\tcase PlsRG16UI:\n\tcase PlsR32UI:\n\t\treturn std::make_pair(spv::OpTypeInt, SPIRType::UInt);\n\t}\n}\n\nstatic uint32_t pls_format_to_components(PlsFormat format)\n{\n\tswitch (format)\n\t{\n\tdefault:\n\tcase PlsR32F:\n\tcase PlsR32UI:\n\t\treturn 1;\n\n\tcase PlsRG16F:\n\tcase PlsRG16:\n\tcase PlsRG16UI:\n\tcase PlsRG16I:\n\t\treturn 2;\n\n\tcase PlsR11FG11FB10F:\n\t\treturn 3;\n\n\tcase PlsRGB10A2:\n\tcase PlsRGBA8:\n\tcase PlsRGBA8I:\n\tcase PlsRGB10A2UI:\n\tcase PlsRGBA8UI:\n\t\treturn 4;\n\t}\n}\n\nconst char *CompilerGLSL::vector_swizzle(int vecsize, int index)\n{\n\tstatic const char *const swizzle[4][4] = {\n\t\t{ \".x\", \".y\", \".z\", \".w\" },\n\t\t{ \".xy\", \".yz\", \".zw\", nullptr },\n\t\t{ \".xyz\", \".yzw\", nullptr, nullptr },\n#if defined(__GNUC__) && (__GNUC__ == 9)\n\t\t// This works around a GCC 9 bug, see details in https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90947.\n\t\t// This array ends up being compiled as all nullptrs, tripping the assertions below.\n\t\t{ \"\", nullptr, nullptr, \"$\" },\n#else\n\t\t{ \"\", nullptr, nullptr, nullptr },\n#endif\n\t};\n\n\tassert(vecsize >= 1 && vecsize <= 4);\n\tassert(index >= 0 && index < 4);\n\tassert(swizzle[vecsize - 1][index]);\n\n\treturn swizzle[vecsize - 1][index];\n}\n\nvoid CompilerGLSL::reset(uint32_t iteration_count)\n{\n\t// Sanity check the iteration count to be robust against a certain class of bugs where\n\t// we keep forcing recompilations without making clear forward progress.\n\t// In buggy situations we will loop forever, or loop for an unbounded number of iterations.\n\t// Certain types of recompilations are considered to make forward progress,\n\t// but in almost all situations, we'll never see more than 3 iterations.\n\t// It is highly context-sensitive when we need to force recompilation,\n\t// and it is not practical with the current architecture\n\t// to resolve everything up front.\n\tif (iteration_count >= options.force_recompile_max_debug_iterations && !is_force_recompile_forward_progress)\n\t\tSPIRV_CROSS_THROW(\"Maximum compilation loops detected and no forward progress was made. Must be a SPIRV-Cross bug!\");\n\n\t// We do some speculative optimizations which should pretty much always work out,\n\t// but just in case the SPIR-V is rather weird, recompile until it's happy.\n\t// This typically only means one extra pass.\n\tclear_force_recompile();\n\n\t// Clear invalid expression tracking.\n\tinvalid_expressions.clear();\n\tcomposite_insert_overwritten.clear();\n\tcurrent_function = nullptr;\n\n\t// Clear temporary usage tracking.\n\texpression_usage_counts.clear();\n\tforwarded_temporaries.clear();\n\tsuppressed_usage_tracking.clear();\n\n\t// Ensure that we declare phi-variable copies even if the original declaration isn't deferred\n\tflushed_phi_variables.clear();\n\n\tcurrent_emitting_switch_stack.clear();\n\n\treset_name_caches();\n\n\tir.for_each_typed_id<SPIRFunction>([&](uint32_t, SPIRFunction &func) {\n\t\tfunc.active = false;\n\t\tfunc.flush_undeclared = true;\n\t});\n\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) { var.dependees.clear(); });\n\n\tir.reset_all_of_type<SPIRExpression>();\n\tir.reset_all_of_type<SPIRAccessChain>();\n\n\tstatement_count = 0;\n\tindent = 0;\n\tcurrent_loop_level = 0;\n}\n\nvoid CompilerGLSL::remap_pls_variables()\n{\n\tfor (auto &input : pls_inputs)\n\t{\n\t\tauto &var = get<SPIRVariable>(input.id);\n\n\t\tbool input_is_target = false;\n\t\tif (var.storage == StorageClassUniformConstant)\n\t\t{\n\t\t\tauto &type = get<SPIRType>(var.basetype);\n\t\t\tinput_is_target = type.image.dim == DimSubpassData;\n\t\t}\n\n\t\tif (var.storage != StorageClassInput && !input_is_target)\n\t\t\tSPIRV_CROSS_THROW(\"Can only use in and target variables for PLS inputs.\");\n\t\tvar.remapped_variable = true;\n\t}\n\n\tfor (auto &output : pls_outputs)\n\t{\n\t\tauto &var = get<SPIRVariable>(output.id);\n\t\tif (var.storage != StorageClassOutput)\n\t\t\tSPIRV_CROSS_THROW(\"Can only use out variables for PLS outputs.\");\n\t\tvar.remapped_variable = true;\n\t}\n}\n\nvoid CompilerGLSL::remap_ext_framebuffer_fetch(uint32_t input_attachment_index, uint32_t color_location, bool coherent)\n{\n\tsubpass_to_framebuffer_fetch_attachment.push_back({ input_attachment_index, color_location });\n\tinout_color_attachments.push_back({ color_location, coherent });\n}\n\nbool CompilerGLSL::location_is_framebuffer_fetch(uint32_t location) const\n{\n\treturn std::find_if(begin(inout_color_attachments), end(inout_color_attachments),\n\t                    [&](const std::pair<uint32_t, bool> &elem) {\n\t\t                    return elem.first == location;\n\t                    }) != end(inout_color_attachments);\n}\n\nbool CompilerGLSL::location_is_non_coherent_framebuffer_fetch(uint32_t location) const\n{\n\treturn std::find_if(begin(inout_color_attachments), end(inout_color_attachments),\n\t                    [&](const std::pair<uint32_t, bool> &elem) {\n\t\t                    return elem.first == location && !elem.second;\n\t                    }) != end(inout_color_attachments);\n}\n\nvoid CompilerGLSL::find_static_extensions()\n{\n\tir.for_each_typed_id<SPIRType>([&](uint32_t, const SPIRType &type) {\n\t\tif (type.basetype == SPIRType::Double)\n\t\t{\n\t\t\tif (options.es)\n\t\t\t\tSPIRV_CROSS_THROW(\"FP64 not supported in ES profile.\");\n\t\t\tif (!options.es && options.version < 400)\n\t\t\t\trequire_extension_internal(\"GL_ARB_gpu_shader_fp64\");\n\t\t}\n\t\telse if (type.basetype == SPIRType::Int64 || type.basetype == SPIRType::UInt64)\n\t\t{\n\t\t\tif (options.es && options.version < 310) // GL_NV_gpu_shader5 fallback requires 310.\n\t\t\t\tSPIRV_CROSS_THROW(\"64-bit integers not supported in ES profile before version 310.\");\n\t\t\trequire_extension_internal(\"GL_ARB_gpu_shader_int64\");\n\t\t}\n\t\telse if (type.basetype == SPIRType::Half)\n\t\t{\n\t\t\trequire_extension_internal(\"GL_EXT_shader_explicit_arithmetic_types_float16\");\n\t\t\tif (options.vulkan_semantics)\n\t\t\t\trequire_extension_internal(\"GL_EXT_shader_16bit_storage\");\n\t\t}\n\t\telse if (type.basetype == SPIRType::SByte || type.basetype == SPIRType::UByte)\n\t\t{\n\t\t\trequire_extension_internal(\"GL_EXT_shader_explicit_arithmetic_types_int8\");\n\t\t\tif (options.vulkan_semantics)\n\t\t\t\trequire_extension_internal(\"GL_EXT_shader_8bit_storage\");\n\t\t}\n\t\telse if (type.basetype == SPIRType::Short || type.basetype == SPIRType::UShort)\n\t\t{\n\t\t\trequire_extension_internal(\"GL_EXT_shader_explicit_arithmetic_types_int16\");\n\t\t\tif (options.vulkan_semantics)\n\t\t\t\trequire_extension_internal(\"GL_EXT_shader_16bit_storage\");\n\t\t}\n\t});\n\n\tauto &execution = get_entry_point();\n\tswitch (execution.model)\n\t{\n\tcase ExecutionModelGLCompute:\n\t\tif (!options.es && options.version < 430)\n\t\t\trequire_extension_internal(\"GL_ARB_compute_shader\");\n\t\tif (options.es && options.version < 310)\n\t\t\tSPIRV_CROSS_THROW(\"At least ESSL 3.10 required for compute shaders.\");\n\t\tbreak;\n\n\tcase ExecutionModelGeometry:\n\t\tif (options.es && options.version < 320)\n\t\t\trequire_extension_internal(\"GL_EXT_geometry_shader\");\n\t\tif (!options.es && options.version < 150)\n\t\t\trequire_extension_internal(\"GL_ARB_geometry_shader4\");\n\n\t\tif (execution.flags.get(ExecutionModeInvocations) && execution.invocations != 1)\n\t\t{\n\t\t\t// Instanced GS is part of 400 core or this extension.\n\t\t\tif (!options.es && options.version < 400)\n\t\t\t\trequire_extension_internal(\"GL_ARB_gpu_shader5\");\n\t\t}\n\t\tbreak;\n\n\tcase ExecutionModelTessellationEvaluation:\n\tcase ExecutionModelTessellationControl:\n\t\tif (options.es && options.version < 320)\n\t\t\trequire_extension_internal(\"GL_EXT_tessellation_shader\");\n\t\tif (!options.es && options.version < 400)\n\t\t\trequire_extension_internal(\"GL_ARB_tessellation_shader\");\n\t\tbreak;\n\n\tcase ExecutionModelRayGenerationKHR:\n\tcase ExecutionModelIntersectionKHR:\n\tcase ExecutionModelAnyHitKHR:\n\tcase ExecutionModelClosestHitKHR:\n\tcase ExecutionModelMissKHR:\n\tcase ExecutionModelCallableKHR:\n\t\t// NV enums are aliases.\n\t\tif (options.es || options.version < 460)\n\t\t\tSPIRV_CROSS_THROW(\"Ray tracing shaders require non-es profile with version 460 or above.\");\n\t\tif (!options.vulkan_semantics)\n\t\t\tSPIRV_CROSS_THROW(\"Ray tracing requires Vulkan semantics.\");\n\n\t\t// Need to figure out if we should target KHR or NV extension based on capabilities.\n\t\tfor (auto &cap : ir.declared_capabilities)\n\t\t{\n\t\t\tif (cap == CapabilityRayTracingKHR || cap == CapabilityRayQueryKHR ||\n\t\t\t    cap == CapabilityRayTraversalPrimitiveCullingKHR)\n\t\t\t{\n\t\t\t\tray_tracing_is_khr = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (ray_tracing_is_khr)\n\t\t{\n\t\t\t// In KHR ray tracing we pass payloads by pointer instead of location,\n\t\t\t// so make sure we assign locations properly.\n\t\t\tray_tracing_khr_fixup_locations();\n\t\t\trequire_extension_internal(\"GL_EXT_ray_tracing\");\n\t\t}\n\t\telse\n\t\t\trequire_extension_internal(\"GL_NV_ray_tracing\");\n\t\tbreak;\n\n\tcase ExecutionModelMeshEXT:\n\tcase ExecutionModelTaskEXT:\n\t\tif (options.es || options.version < 450)\n\t\t\tSPIRV_CROSS_THROW(\"Mesh shaders require GLSL 450 or above.\");\n\t\tif (!options.vulkan_semantics)\n\t\t\tSPIRV_CROSS_THROW(\"Mesh shaders require Vulkan semantics.\");\n\t\trequire_extension_internal(\"GL_EXT_mesh_shader\");\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\tif (!pls_inputs.empty() || !pls_outputs.empty())\n\t{\n\t\tif (execution.model != ExecutionModelFragment)\n\t\t\tSPIRV_CROSS_THROW(\"Can only use GL_EXT_shader_pixel_local_storage in fragment shaders.\");\n\t\trequire_extension_internal(\"GL_EXT_shader_pixel_local_storage\");\n\t}\n\n\tif (!inout_color_attachments.empty())\n\t{\n\t\tif (execution.model != ExecutionModelFragment)\n\t\t\tSPIRV_CROSS_THROW(\"Can only use GL_EXT_shader_framebuffer_fetch in fragment shaders.\");\n\t\tif (options.vulkan_semantics)\n\t\t\tSPIRV_CROSS_THROW(\"Cannot use EXT_shader_framebuffer_fetch in Vulkan GLSL.\");\n\n\t\tbool has_coherent = false;\n\t\tbool has_incoherent = false;\n\n\t\tfor (auto &att : inout_color_attachments)\n\t\t{\n\t\t\tif (att.second)\n\t\t\t\thas_coherent = true;\n\t\t\telse\n\t\t\t\thas_incoherent = true;\n\t\t}\n\n\t\tif (has_coherent)\n\t\t\trequire_extension_internal(\"GL_EXT_shader_framebuffer_fetch\");\n\t\tif (has_incoherent)\n\t\t\trequire_extension_internal(\"GL_EXT_shader_framebuffer_fetch_non_coherent\");\n\t}\n\n\tif (options.separate_shader_objects && !options.es && options.version < 410)\n\t\trequire_extension_internal(\"GL_ARB_separate_shader_objects\");\n\n\tif (ir.addressing_model == AddressingModelPhysicalStorageBuffer64EXT)\n\t{\n\t\tif (!options.vulkan_semantics)\n\t\t\tSPIRV_CROSS_THROW(\"GL_EXT_buffer_reference is only supported in Vulkan GLSL.\");\n\t\tif (options.es && options.version < 320)\n\t\t\tSPIRV_CROSS_THROW(\"GL_EXT_buffer_reference requires ESSL 320.\");\n\t\telse if (!options.es && options.version < 450)\n\t\t\tSPIRV_CROSS_THROW(\"GL_EXT_buffer_reference requires GLSL 450.\");\n\t\trequire_extension_internal(\"GL_EXT_buffer_reference2\");\n\t}\n\telse if (ir.addressing_model != AddressingModelLogical)\n\t{\n\t\tSPIRV_CROSS_THROW(\"Only Logical and PhysicalStorageBuffer64EXT addressing models are supported.\");\n\t}\n\n\t// Check for nonuniform qualifier and passthrough.\n\t// Instead of looping over all decorations to find this, just look at capabilities.\n\tfor (auto &cap : ir.declared_capabilities)\n\t{\n\t\tswitch (cap)\n\t\t{\n\t\tcase CapabilityShaderNonUniformEXT:\n\t\t\tif (!options.vulkan_semantics)\n\t\t\t\trequire_extension_internal(\"GL_NV_gpu_shader5\");\n\t\t\telse\n\t\t\t\trequire_extension_internal(\"GL_EXT_nonuniform_qualifier\");\n\t\t\tbreak;\n\t\tcase CapabilityRuntimeDescriptorArrayEXT:\n\t\t\tif (!options.vulkan_semantics)\n\t\t\t\tSPIRV_CROSS_THROW(\"GL_EXT_nonuniform_qualifier is only supported in Vulkan GLSL.\");\n\t\t\trequire_extension_internal(\"GL_EXT_nonuniform_qualifier\");\n\t\t\tbreak;\n\n\t\tcase CapabilityGeometryShaderPassthroughNV:\n\t\t\tif (execution.model == ExecutionModelGeometry)\n\t\t\t{\n\t\t\t\trequire_extension_internal(\"GL_NV_geometry_shader_passthrough\");\n\t\t\t\texecution.geometry_passthrough = true;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase CapabilityVariablePointers:\n\t\tcase CapabilityVariablePointersStorageBuffer:\n\t\t\tSPIRV_CROSS_THROW(\"VariablePointers capability is not supported in GLSL.\");\n\n\t\tcase CapabilityMultiView:\n\t\t\tif (options.vulkan_semantics)\n\t\t\t\trequire_extension_internal(\"GL_EXT_multiview\");\n\t\t\telse\n\t\t\t{\n\t\t\t\trequire_extension_internal(\"GL_OVR_multiview2\");\n\t\t\t\tif (options.ovr_multiview_view_count == 0)\n\t\t\t\t\tSPIRV_CROSS_THROW(\"ovr_multiview_view_count must be non-zero when using GL_OVR_multiview2.\");\n\t\t\t\tif (get_execution_model() != ExecutionModelVertex)\n\t\t\t\t\tSPIRV_CROSS_THROW(\"OVR_multiview2 can only be used with Vertex shaders.\");\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase CapabilityRayQueryKHR:\n\t\t\tif (options.es || options.version < 460 || !options.vulkan_semantics)\n\t\t\t\tSPIRV_CROSS_THROW(\"RayQuery requires Vulkan GLSL 460.\");\n\t\t\trequire_extension_internal(\"GL_EXT_ray_query\");\n\t\t\tray_tracing_is_khr = true;\n\t\t\tbreak;\n\n\t\tcase CapabilityRayTraversalPrimitiveCullingKHR:\n\t\t\tif (options.es || options.version < 460 || !options.vulkan_semantics)\n\t\t\t\tSPIRV_CROSS_THROW(\"RayQuery requires Vulkan GLSL 460.\");\n\t\t\trequire_extension_internal(\"GL_EXT_ray_flags_primitive_culling\");\n\t\t\tray_tracing_is_khr = true;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (options.ovr_multiview_view_count)\n\t{\n\t\tif (options.vulkan_semantics)\n\t\t\tSPIRV_CROSS_THROW(\"OVR_multiview2 cannot be used with Vulkan semantics.\");\n\t\tif (get_execution_model() != ExecutionModelVertex)\n\t\t\tSPIRV_CROSS_THROW(\"OVR_multiview2 can only be used with Vertex shaders.\");\n\t\trequire_extension_internal(\"GL_OVR_multiview2\");\n\t}\n\n\t// KHR one is likely to get promoted at some point, so if we don't see an explicit SPIR-V extension, assume KHR.\n\tfor (auto &ext : ir.declared_extensions)\n\t\tif (ext == \"SPV_NV_fragment_shader_barycentric\")\n\t\t\tbarycentric_is_nv = true;\n}\n\nvoid CompilerGLSL::require_polyfill(Polyfill polyfill, bool relaxed)\n{\n\tuint32_t &polyfills = (relaxed && options.es) ? required_polyfills_relaxed : required_polyfills;\n\n\tif ((polyfills & polyfill) == 0)\n\t{\n\t\tpolyfills |= polyfill;\n\t\tforce_recompile();\n\t}\n}\n\nvoid CompilerGLSL::ray_tracing_khr_fixup_locations()\n{\n\tuint32_t location = 0;\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\t// Incoming payload storage can also be used for tracing.\n\t\tif (var.storage != StorageClassRayPayloadKHR && var.storage != StorageClassCallableDataKHR &&\n\t\t    var.storage != StorageClassIncomingRayPayloadKHR && var.storage != StorageClassIncomingCallableDataKHR)\n\t\t\treturn;\n\t\tif (is_hidden_variable(var))\n\t\t\treturn;\n\t\tset_decoration(var.self, DecorationLocation, location++);\n\t});\n}\n\nstring CompilerGLSL::compile()\n{\n\tir.fixup_reserved_names();\n\n\tif (!options.vulkan_semantics)\n\t{\n\t\t// only NV_gpu_shader5 supports divergent indexing on OpenGL, and it does so without extra qualifiers\n\t\tbackend.nonuniform_qualifier = \"\";\n\t\tbackend.needs_row_major_load_workaround = options.enable_row_major_load_workaround;\n\t}\n\tbackend.allow_precision_qualifiers = options.vulkan_semantics || options.es;\n\tbackend.force_gl_in_out_block = true;\n\tbackend.supports_extensions = true;\n\tbackend.use_array_constructor = true;\n\tbackend.workgroup_size_is_hidden = true;\n\tbackend.requires_relaxed_precision_analysis = options.es || options.vulkan_semantics;\n\tbackend.support_precise_qualifier =\n\t\t\t(!options.es && options.version >= 400) || (options.es && options.version >= 320);\n\n\tif (is_legacy_es())\n\t\tbackend.support_case_fallthrough = false;\n\n\t// Scan the SPIR-V to find trivial uses of extensions.\n\tfixup_anonymous_struct_names();\n\tfixup_type_alias();\n\treorder_type_alias();\n\tbuild_function_control_flow_graphs_and_analyze();\n\tfind_static_extensions();\n\tfixup_image_load_store_access();\n\tupdate_active_builtins();\n\tanalyze_image_and_sampler_usage();\n\tanalyze_interlocked_resource_usage();\n\tif (!inout_color_attachments.empty())\n\t\temit_inout_fragment_outputs_copy_to_subpass_inputs();\n\n\t// Shaders might cast unrelated data to pointers of non-block types.\n\t// Find all such instances and make sure we can cast the pointers to a synthesized block type.\n\tif (ir.addressing_model == AddressingModelPhysicalStorageBuffer64EXT)\n\t\tanalyze_non_block_pointer_types();\n\n\tuint32_t pass_count = 0;\n\tdo\n\t{\n\t\treset(pass_count);\n\n\t\tbuffer.reset();\n\n\t\temit_header();\n\t\temit_resources();\n\t\temit_extension_workarounds(get_execution_model());\n\n\t\tif (required_polyfills != 0)\n\t\t\temit_polyfills(required_polyfills, false);\n\t\tif (options.es && required_polyfills_relaxed != 0)\n\t\t\temit_polyfills(required_polyfills_relaxed, true);\n\n\t\temit_function(get<SPIRFunction>(ir.default_entry_point), Bitset());\n\n\t\tpass_count++;\n\t} while (is_forcing_recompilation());\n\n\t// Implement the interlocked wrapper function at the end.\n\t// The body was implemented in lieu of main().\n\tif (interlocked_is_complex)\n\t{\n\t\tstatement(\"void main()\");\n\t\tbegin_scope();\n\t\tstatement(\"// Interlocks were used in a way not compatible with GLSL, this is very slow.\");\n\t\tstatement(\"SPIRV_Cross_beginInvocationInterlock();\");\n\t\tstatement(\"spvMainInterlockedBody();\");\n\t\tstatement(\"SPIRV_Cross_endInvocationInterlock();\");\n\t\tend_scope();\n\t}\n\n\t// Entry point in GLSL is always main().\n\tget_entry_point().name = \"main\";\n\n\treturn buffer.str();\n}\n\nstd::string CompilerGLSL::get_partial_source()\n{\n\treturn buffer.str();\n}\n\nvoid CompilerGLSL::build_workgroup_size(SmallVector<string> &arguments, const SpecializationConstant &wg_x,\n                                        const SpecializationConstant &wg_y, const SpecializationConstant &wg_z)\n{\n\tauto &execution = get_entry_point();\n\tbool builtin_workgroup = execution.workgroup_size.constant != 0;\n\tbool use_local_size_id = !builtin_workgroup && execution.flags.get(ExecutionModeLocalSizeId);\n\n\tif (wg_x.id)\n\t{\n\t\tif (options.vulkan_semantics)\n\t\t\targuments.push_back(join(\"local_size_x_id = \", wg_x.constant_id));\n\t\telse\n\t\t\targuments.push_back(join(\"local_size_x = \", get<SPIRConstant>(wg_x.id).specialization_constant_macro_name));\n\t}\n\telse if (use_local_size_id && execution.workgroup_size.id_x)\n\t\targuments.push_back(join(\"local_size_x = \", get<SPIRConstant>(execution.workgroup_size.id_x).scalar()));\n\telse\n\t\targuments.push_back(join(\"local_size_x = \", execution.workgroup_size.x));\n\n\tif (wg_y.id)\n\t{\n\t\tif (options.vulkan_semantics)\n\t\t\targuments.push_back(join(\"local_size_y_id = \", wg_y.constant_id));\n\t\telse\n\t\t\targuments.push_back(join(\"local_size_y = \", get<SPIRConstant>(wg_y.id).specialization_constant_macro_name));\n\t}\n\telse if (use_local_size_id && execution.workgroup_size.id_y)\n\t\targuments.push_back(join(\"local_size_y = \", get<SPIRConstant>(execution.workgroup_size.id_y).scalar()));\n\telse\n\t\targuments.push_back(join(\"local_size_y = \", execution.workgroup_size.y));\n\n\tif (wg_z.id)\n\t{\n\t\tif (options.vulkan_semantics)\n\t\t\targuments.push_back(join(\"local_size_z_id = \", wg_z.constant_id));\n\t\telse\n\t\t\targuments.push_back(join(\"local_size_z = \", get<SPIRConstant>(wg_z.id).specialization_constant_macro_name));\n\t}\n\telse if (use_local_size_id && execution.workgroup_size.id_z)\n\t\targuments.push_back(join(\"local_size_z = \", get<SPIRConstant>(execution.workgroup_size.id_z).scalar()));\n\telse\n\t\targuments.push_back(join(\"local_size_z = \", execution.workgroup_size.z));\n}\n\nvoid CompilerGLSL::request_subgroup_feature(ShaderSubgroupSupportHelper::Feature feature)\n{\n\tif (options.vulkan_semantics)\n\t{\n\t\tauto khr_extension = ShaderSubgroupSupportHelper::get_KHR_extension_for_feature(feature);\n\t\trequire_extension_internal(ShaderSubgroupSupportHelper::get_extension_name(khr_extension));\n\t}\n\telse\n\t{\n\t\tif (!shader_subgroup_supporter.is_feature_requested(feature))\n\t\t\tforce_recompile();\n\t\tshader_subgroup_supporter.request_feature(feature);\n\t}\n}\n\nvoid CompilerGLSL::emit_header()\n{\n\tauto &execution = get_entry_point();\n\tstatement(\"#version \", options.version, options.es && options.version > 100 ? \" es\" : \"\");\n\n\tif (!options.es && options.version < 420)\n\t{\n\t\t// Needed for binding = # on UBOs, etc.\n\t\tif (options.enable_420pack_extension)\n\t\t{\n\t\t\tstatement(\"#ifdef GL_ARB_shading_language_420pack\");\n\t\t\tstatement(\"#extension GL_ARB_shading_language_420pack : require\");\n\t\t\tstatement(\"#endif\");\n\t\t}\n\t\t// Needed for: layout(early_fragment_tests) in;\n\t\tif (execution.flags.get(ExecutionModeEarlyFragmentTests))\n\t\t\trequire_extension_internal(\"GL_ARB_shader_image_load_store\");\n\t}\n\n\t// Needed for: layout(post_depth_coverage) in;\n\tif (execution.flags.get(ExecutionModePostDepthCoverage))\n\t\trequire_extension_internal(\"GL_ARB_post_depth_coverage\");\n\n\t// Needed for: layout({pixel,sample}_interlock_[un]ordered) in;\n\tbool interlock_used = execution.flags.get(ExecutionModePixelInterlockOrderedEXT) ||\n\t                      execution.flags.get(ExecutionModePixelInterlockUnorderedEXT) ||\n\t                      execution.flags.get(ExecutionModeSampleInterlockOrderedEXT) ||\n\t                      execution.flags.get(ExecutionModeSampleInterlockUnorderedEXT);\n\n\tif (interlock_used)\n\t{\n\t\tif (options.es)\n\t\t{\n\t\t\tif (options.version < 310)\n\t\t\t\tSPIRV_CROSS_THROW(\"At least ESSL 3.10 required for fragment shader interlock.\");\n\t\t\trequire_extension_internal(\"GL_NV_fragment_shader_interlock\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (options.version < 420)\n\t\t\t\trequire_extension_internal(\"GL_ARB_shader_image_load_store\");\n\t\t\trequire_extension_internal(\"GL_ARB_fragment_shader_interlock\");\n\t\t}\n\t}\n\n\tfor (auto &ext : forced_extensions)\n\t{\n\t\tif (ext == \"GL_ARB_gpu_shader_int64\")\n\t\t{\n\t\t\tstatement(\"#if defined(GL_ARB_gpu_shader_int64)\");\n\t\t\tstatement(\"#extension GL_ARB_gpu_shader_int64 : require\");\n\t\t\tif (!options.vulkan_semantics || options.es)\n\t\t\t{\n\t\t\t\tstatement(\"#elif defined(GL_NV_gpu_shader5)\");\n\t\t\t\tstatement(\"#extension GL_NV_gpu_shader5 : require\");\n\t\t\t}\n\t\t\tstatement(\"#else\");\n\t\t\tstatement(\"#error No extension available for 64-bit integers.\");\n\t\t\tstatement(\"#endif\");\n\t\t}\n\t\telse if (ext == \"GL_EXT_shader_explicit_arithmetic_types_float16\")\n\t\t{\n\t\t\t// Special case, this extension has a potential fallback to another vendor extension in normal GLSL.\n\t\t\t// GL_AMD_gpu_shader_half_float is a superset, so try that first.\n\t\t\tstatement(\"#if defined(GL_AMD_gpu_shader_half_float)\");\n\t\t\tstatement(\"#extension GL_AMD_gpu_shader_half_float : require\");\n\t\t\tif (!options.vulkan_semantics)\n\t\t\t{\n\t\t\t\tstatement(\"#elif defined(GL_NV_gpu_shader5)\");\n\t\t\t\tstatement(\"#extension GL_NV_gpu_shader5 : require\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstatement(\"#elif defined(GL_EXT_shader_explicit_arithmetic_types_float16)\");\n\t\t\t\tstatement(\"#extension GL_EXT_shader_explicit_arithmetic_types_float16 : require\");\n\t\t\t}\n\t\t\tstatement(\"#else\");\n\t\t\tstatement(\"#error No extension available for FP16.\");\n\t\t\tstatement(\"#endif\");\n\t\t}\n\t\telse if (ext == \"GL_EXT_shader_explicit_arithmetic_types_int8\")\n\t\t{\n\t\t\tif (options.vulkan_semantics)\n\t\t\t\tstatement(\"#extension GL_EXT_shader_explicit_arithmetic_types_int8 : require\");\n\t\t\telse\n\t\t\t{\n\t\t\t\tstatement(\"#if defined(GL_EXT_shader_explicit_arithmetic_types_int8)\");\n\t\t\t\tstatement(\"#extension GL_EXT_shader_explicit_arithmetic_types_int8 : require\");\n\t\t\t\tstatement(\"#elif defined(GL_NV_gpu_shader5)\");\n\t\t\t\tstatement(\"#extension GL_NV_gpu_shader5 : require\");\n\t\t\t\tstatement(\"#else\");\n\t\t\t\tstatement(\"#error No extension available for Int8.\");\n\t\t\t\tstatement(\"#endif\");\n\t\t\t}\n\t\t}\n\t\telse if (ext == \"GL_EXT_shader_explicit_arithmetic_types_int16\")\n\t\t{\n\t\t\tif (options.vulkan_semantics)\n\t\t\t\tstatement(\"#extension GL_EXT_shader_explicit_arithmetic_types_int16 : require\");\n\t\t\telse\n\t\t\t{\n\t\t\t\tstatement(\"#if defined(GL_EXT_shader_explicit_arithmetic_types_int16)\");\n\t\t\t\tstatement(\"#extension GL_EXT_shader_explicit_arithmetic_types_int16 : require\");\n\t\t\t\tstatement(\"#elif defined(GL_AMD_gpu_shader_int16)\");\n\t\t\t\tstatement(\"#extension GL_AMD_gpu_shader_int16 : require\");\n\t\t\t\tstatement(\"#elif defined(GL_NV_gpu_shader5)\");\n\t\t\t\tstatement(\"#extension GL_NV_gpu_shader5 : require\");\n\t\t\t\tstatement(\"#else\");\n\t\t\t\tstatement(\"#error No extension available for Int16.\");\n\t\t\t\tstatement(\"#endif\");\n\t\t\t}\n\t\t}\n\t\telse if (ext == \"GL_ARB_post_depth_coverage\")\n\t\t{\n\t\t\tif (options.es)\n\t\t\t\tstatement(\"#extension GL_EXT_post_depth_coverage : require\");\n\t\t\telse\n\t\t\t{\n\t\t\t\tstatement(\"#if defined(GL_ARB_post_depth_coverge)\");\n\t\t\t\tstatement(\"#extension GL_ARB_post_depth_coverage : require\");\n\t\t\t\tstatement(\"#else\");\n\t\t\t\tstatement(\"#extension GL_EXT_post_depth_coverage : require\");\n\t\t\t\tstatement(\"#endif\");\n\t\t\t}\n\t\t}\n\t\telse if (!options.vulkan_semantics && ext == \"GL_ARB_shader_draw_parameters\")\n\t\t{\n\t\t\t// Soft-enable this extension on plain GLSL.\n\t\t\tstatement(\"#ifdef \", ext);\n\t\t\tstatement(\"#extension \", ext, \" : enable\");\n\t\t\tstatement(\"#endif\");\n\t\t}\n\t\telse if (ext == \"GL_EXT_control_flow_attributes\")\n\t\t{\n\t\t\t// These are just hints so we can conditionally enable and fallback in the shader.\n\t\t\tstatement(\"#if defined(GL_EXT_control_flow_attributes)\");\n\t\t\tstatement(\"#extension GL_EXT_control_flow_attributes : require\");\n\t\t\tstatement(\"#define SPIRV_CROSS_FLATTEN [[flatten]]\");\n\t\t\tstatement(\"#define SPIRV_CROSS_BRANCH [[dont_flatten]]\");\n\t\t\tstatement(\"#define SPIRV_CROSS_UNROLL [[unroll]]\");\n\t\t\tstatement(\"#define SPIRV_CROSS_LOOP [[dont_unroll]]\");\n\t\t\tstatement(\"#else\");\n\t\t\tstatement(\"#define SPIRV_CROSS_FLATTEN\");\n\t\t\tstatement(\"#define SPIRV_CROSS_BRANCH\");\n\t\t\tstatement(\"#define SPIRV_CROSS_UNROLL\");\n\t\t\tstatement(\"#define SPIRV_CROSS_LOOP\");\n\t\t\tstatement(\"#endif\");\n\t\t}\n\t\telse if (ext == \"GL_NV_fragment_shader_interlock\")\n\t\t{\n\t\t\tstatement(\"#extension GL_NV_fragment_shader_interlock : require\");\n\t\t\tstatement(\"#define SPIRV_Cross_beginInvocationInterlock() beginInvocationInterlockNV()\");\n\t\t\tstatement(\"#define SPIRV_Cross_endInvocationInterlock() endInvocationInterlockNV()\");\n\t\t}\n\t\telse if (ext == \"GL_ARB_fragment_shader_interlock\")\n\t\t{\n\t\t\tstatement(\"#ifdef GL_ARB_fragment_shader_interlock\");\n\t\t\tstatement(\"#extension GL_ARB_fragment_shader_interlock : enable\");\n\t\t\tstatement(\"#define SPIRV_Cross_beginInvocationInterlock() beginInvocationInterlockARB()\");\n\t\t\tstatement(\"#define SPIRV_Cross_endInvocationInterlock() endInvocationInterlockARB()\");\n\t\t\tstatement(\"#elif defined(GL_INTEL_fragment_shader_ordering)\");\n\t\t\tstatement(\"#extension GL_INTEL_fragment_shader_ordering : enable\");\n\t\t\tstatement(\"#define SPIRV_Cross_beginInvocationInterlock() beginFragmentShaderOrderingINTEL()\");\n\t\t\tstatement(\"#define SPIRV_Cross_endInvocationInterlock()\");\n\t\t\tstatement(\"#endif\");\n\t\t}\n\t\telse\n\t\t\tstatement(\"#extension \", ext, \" : require\");\n\t}\n\n\tif (!options.vulkan_semantics)\n\t{\n\t\tusing Supp = ShaderSubgroupSupportHelper;\n\t\tauto result = shader_subgroup_supporter.resolve();\n\n\t\tfor (uint32_t feature_index = 0; feature_index < Supp::FeatureCount; feature_index++)\n\t\t{\n\t\t\tauto feature = static_cast<Supp::Feature>(feature_index);\n\t\t\tif (!shader_subgroup_supporter.is_feature_requested(feature))\n\t\t\t\tcontinue;\n\n\t\t\tauto exts = Supp::get_candidates_for_feature(feature, result);\n\t\t\tif (exts.empty())\n\t\t\t\tcontinue;\n\n\t\t\tstatement(\"\");\n\n\t\t\tfor (auto &ext : exts)\n\t\t\t{\n\t\t\t\tconst char *name = Supp::get_extension_name(ext);\n\t\t\t\tconst char *extra_predicate = Supp::get_extra_required_extension_predicate(ext);\n\t\t\t\tauto extra_names = Supp::get_extra_required_extension_names(ext);\n\t\t\t\tstatement(&ext != &exts.front() ? \"#elif\" : \"#if\", \" defined(\", name, \")\",\n\t\t\t\t          (*extra_predicate != '\\0' ? \" && \" : \"\"), extra_predicate);\n\t\t\t\tfor (const auto &e : extra_names)\n\t\t\t\t\tstatement(\"#extension \", e, \" : enable\");\n\t\t\t\tstatement(\"#extension \", name, \" : require\");\n\t\t\t}\n\n\t\t\tif (!Supp::can_feature_be_implemented_without_extensions(feature))\n\t\t\t{\n\t\t\t\tstatement(\"#else\");\n\t\t\t\tstatement(\"#error No extensions available to emulate requested subgroup feature.\");\n\t\t\t}\n\n\t\t\tstatement(\"#endif\");\n\t\t}\n\t}\n\n\tfor (auto &header : header_lines)\n\t\tstatement(header);\n\n\tSmallVector<string> inputs;\n\tSmallVector<string> outputs;\n\n\tswitch (execution.model)\n\t{\n\tcase ExecutionModelVertex:\n\t\tif (options.ovr_multiview_view_count)\n\t\t\tinputs.push_back(join(\"num_views = \", options.ovr_multiview_view_count));\n\t\tbreak;\n\tcase ExecutionModelGeometry:\n\t\tif ((execution.flags.get(ExecutionModeInvocations)) && execution.invocations != 1)\n\t\t\tinputs.push_back(join(\"invocations = \", execution.invocations));\n\t\tif (execution.flags.get(ExecutionModeInputPoints))\n\t\t\tinputs.push_back(\"points\");\n\t\tif (execution.flags.get(ExecutionModeInputLines))\n\t\t\tinputs.push_back(\"lines\");\n\t\tif (execution.flags.get(ExecutionModeInputLinesAdjacency))\n\t\t\tinputs.push_back(\"lines_adjacency\");\n\t\tif (execution.flags.get(ExecutionModeTriangles))\n\t\t\tinputs.push_back(\"triangles\");\n\t\tif (execution.flags.get(ExecutionModeInputTrianglesAdjacency))\n\t\t\tinputs.push_back(\"triangles_adjacency\");\n\n\t\tif (!execution.geometry_passthrough)\n\t\t{\n\t\t\t// For passthrough, these are implies and cannot be declared in shader.\n\t\t\toutputs.push_back(join(\"max_vertices = \", execution.output_vertices));\n\t\t\tif (execution.flags.get(ExecutionModeOutputTriangleStrip))\n\t\t\t\toutputs.push_back(\"triangle_strip\");\n\t\t\tif (execution.flags.get(ExecutionModeOutputPoints))\n\t\t\t\toutputs.push_back(\"points\");\n\t\t\tif (execution.flags.get(ExecutionModeOutputLineStrip))\n\t\t\t\toutputs.push_back(\"line_strip\");\n\t\t}\n\t\tbreak;\n\n\tcase ExecutionModelTessellationControl:\n\t\tif (execution.flags.get(ExecutionModeOutputVertices))\n\t\t\toutputs.push_back(join(\"vertices = \", execution.output_vertices));\n\t\tbreak;\n\n\tcase ExecutionModelTessellationEvaluation:\n\t\tif (execution.flags.get(ExecutionModeQuads))\n\t\t\tinputs.push_back(\"quads\");\n\t\tif (execution.flags.get(ExecutionModeTriangles))\n\t\t\tinputs.push_back(\"triangles\");\n\t\tif (execution.flags.get(ExecutionModeIsolines))\n\t\t\tinputs.push_back(\"isolines\");\n\t\tif (execution.flags.get(ExecutionModePointMode))\n\t\t\tinputs.push_back(\"point_mode\");\n\n\t\tif (!execution.flags.get(ExecutionModeIsolines))\n\t\t{\n\t\t\tif (execution.flags.get(ExecutionModeVertexOrderCw))\n\t\t\t\tinputs.push_back(\"cw\");\n\t\t\tif (execution.flags.get(ExecutionModeVertexOrderCcw))\n\t\t\t\tinputs.push_back(\"ccw\");\n\t\t}\n\n\t\tif (execution.flags.get(ExecutionModeSpacingFractionalEven))\n\t\t\tinputs.push_back(\"fractional_even_spacing\");\n\t\tif (execution.flags.get(ExecutionModeSpacingFractionalOdd))\n\t\t\tinputs.push_back(\"fractional_odd_spacing\");\n\t\tif (execution.flags.get(ExecutionModeSpacingEqual))\n\t\t\tinputs.push_back(\"equal_spacing\");\n\t\tbreak;\n\n\tcase ExecutionModelGLCompute:\n\tcase ExecutionModelTaskEXT:\n\tcase ExecutionModelMeshEXT:\n\t{\n\t\tif (execution.workgroup_size.constant != 0 || execution.flags.get(ExecutionModeLocalSizeId))\n\t\t{\n\t\t\tSpecializationConstant wg_x, wg_y, wg_z;\n\t\t\tget_work_group_size_specialization_constants(wg_x, wg_y, wg_z);\n\n\t\t\t// If there are any spec constants on legacy GLSL, defer declaration, we need to set up macro\n\t\t\t// declarations before we can emit the work group size.\n\t\t\tif (options.vulkan_semantics ||\n\t\t\t    ((wg_x.id == ConstantID(0)) && (wg_y.id == ConstantID(0)) && (wg_z.id == ConstantID(0))))\n\t\t\t\tbuild_workgroup_size(inputs, wg_x, wg_y, wg_z);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tinputs.push_back(join(\"local_size_x = \", execution.workgroup_size.x));\n\t\t\tinputs.push_back(join(\"local_size_y = \", execution.workgroup_size.y));\n\t\t\tinputs.push_back(join(\"local_size_z = \", execution.workgroup_size.z));\n\t\t}\n\n\t\tif (execution.model == ExecutionModelMeshEXT)\n\t\t{\n\t\t\toutputs.push_back(join(\"max_vertices = \", execution.output_vertices));\n\t\t\toutputs.push_back(join(\"max_primitives = \", execution.output_primitives));\n\t\t\tif (execution.flags.get(ExecutionModeOutputTrianglesEXT))\n\t\t\t\toutputs.push_back(\"triangles\");\n\t\t\telse if (execution.flags.get(ExecutionModeOutputLinesEXT))\n\t\t\t\toutputs.push_back(\"lines\");\n\t\t\telse if (execution.flags.get(ExecutionModeOutputPoints))\n\t\t\t\toutputs.push_back(\"points\");\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase ExecutionModelFragment:\n\t\tif (options.es)\n\t\t{\n\t\t\tswitch (options.fragment.default_float_precision)\n\t\t\t{\n\t\t\tcase Options::Lowp:\n\t\t\t\tstatement(\"precision lowp float;\");\n\t\t\t\tbreak;\n\n\t\t\tcase Options::Mediump:\n\t\t\t\tstatement(\"precision mediump float;\");\n\t\t\t\tbreak;\n\n\t\t\tcase Options::Highp:\n\t\t\t\tstatement(\"precision highp float;\");\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tswitch (options.fragment.default_int_precision)\n\t\t\t{\n\t\t\tcase Options::Lowp:\n\t\t\t\tstatement(\"precision lowp int;\");\n\t\t\t\tbreak;\n\n\t\t\tcase Options::Mediump:\n\t\t\t\tstatement(\"precision mediump int;\");\n\t\t\t\tbreak;\n\n\t\t\tcase Options::Highp:\n\t\t\t\tstatement(\"precision highp int;\");\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (execution.flags.get(ExecutionModeEarlyFragmentTests))\n\t\t\tinputs.push_back(\"early_fragment_tests\");\n\t\tif (execution.flags.get(ExecutionModePostDepthCoverage))\n\t\t\tinputs.push_back(\"post_depth_coverage\");\n\n\t\tif (interlock_used)\n\t\t\tstatement(\"#if defined(GL_ARB_fragment_shader_interlock)\");\n\n\t\tif (execution.flags.get(ExecutionModePixelInterlockOrderedEXT))\n\t\t\tstatement(\"layout(pixel_interlock_ordered) in;\");\n\t\telse if (execution.flags.get(ExecutionModePixelInterlockUnorderedEXT))\n\t\t\tstatement(\"layout(pixel_interlock_unordered) in;\");\n\t\telse if (execution.flags.get(ExecutionModeSampleInterlockOrderedEXT))\n\t\t\tstatement(\"layout(sample_interlock_ordered) in;\");\n\t\telse if (execution.flags.get(ExecutionModeSampleInterlockUnorderedEXT))\n\t\t\tstatement(\"layout(sample_interlock_unordered) in;\");\n\n\t\tif (interlock_used)\n\t\t{\n\t\t\tstatement(\"#elif !defined(GL_INTEL_fragment_shader_ordering)\");\n\t\t\tstatement(\"#error Fragment Shader Interlock/Ordering extension missing!\");\n\t\t\tstatement(\"#endif\");\n\t\t}\n\n\t\tif (!options.es && execution.flags.get(ExecutionModeDepthGreater))\n\t\t\tstatement(\"layout(depth_greater) out float gl_FragDepth;\");\n\t\telse if (!options.es && execution.flags.get(ExecutionModeDepthLess))\n\t\t\tstatement(\"layout(depth_less) out float gl_FragDepth;\");\n\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\tfor (auto &cap : ir.declared_capabilities)\n\t\tif (cap == CapabilityRayTraversalPrimitiveCullingKHR)\n\t\t\tstatement(\"layout(primitive_culling);\");\n\n\tif (!inputs.empty())\n\t\tstatement(\"layout(\", merge(inputs), \") in;\");\n\tif (!outputs.empty())\n\t\tstatement(\"layout(\", merge(outputs), \") out;\");\n\n\tstatement(\"\");\n}\n\nbool CompilerGLSL::type_is_empty(const SPIRType &type)\n{\n\treturn type.basetype == SPIRType::Struct && type.member_types.empty();\n}\n\nvoid CompilerGLSL::emit_struct(SPIRType &type)\n{\n\t// Struct types can be stamped out multiple times\n\t// with just different offsets, matrix layouts, etc ...\n\t// Type-punning with these types is legal, which complicates things\n\t// when we are storing struct and array types in an SSBO for example.\n\t// If the type master is packed however, we can no longer assume that the struct declaration will be redundant.\n\tif (type.type_alias != TypeID(0) &&\n\t    !has_extended_decoration(type.type_alias, SPIRVCrossDecorationBufferBlockRepacked))\n\t\treturn;\n\n\tadd_resource_name(type.self);\n\tauto name = type_to_glsl(type);\n\n\tstatement(!backend.explicit_struct_type ? \"struct \" : \"\", name);\n\tbegin_scope();\n\n\ttype.member_name_cache.clear();\n\n\tuint32_t i = 0;\n\tbool emitted = false;\n\tfor (auto &member : type.member_types)\n\t{\n\t\tadd_member_name(type, i);\n\t\temit_struct_member(type, member, i);\n\t\ti++;\n\t\temitted = true;\n\t}\n\n\t// Don't declare empty structs in GLSL, this is not allowed.\n\tif (type_is_empty(type) && !backend.supports_empty_struct)\n\t{\n\t\tstatement(\"int empty_struct_member;\");\n\t\temitted = true;\n\t}\n\n\tif (has_extended_decoration(type.self, SPIRVCrossDecorationPaddingTarget))\n\t\temit_struct_padding_target(type);\n\n\tend_scope_decl();\n\n\tif (emitted)\n\t\tstatement(\"\");\n}\n\nstring CompilerGLSL::to_interpolation_qualifiers(const Bitset &flags)\n{\n\tstring res;\n\t//if (flags & (1ull << DecorationSmooth))\n\t//    res += \"smooth \";\n\tif (flags.get(DecorationFlat))\n\t\tres += \"flat \";\n\tif (flags.get(DecorationNoPerspective))\n\t{\n\t\tif (options.es)\n\t\t{\n\t\t\tif (options.version < 300)\n\t\t\t\tSPIRV_CROSS_THROW(\"noperspective requires ESSL 300.\");\n\t\t\trequire_extension_internal(\"GL_NV_shader_noperspective_interpolation\");\n\t\t}\n\t\telse if (is_legacy_desktop())\n\t\t\trequire_extension_internal(\"GL_EXT_gpu_shader4\");\n\t\tres += \"noperspective \";\n\t}\n\tif (flags.get(DecorationCentroid))\n\t\tres += \"centroid \";\n\tif (flags.get(DecorationPatch))\n\t\tres += \"patch \";\n\tif (flags.get(DecorationSample))\n\t{\n\t\tif (options.es)\n\t\t{\n\t\t\tif (options.version < 300)\n\t\t\t\tSPIRV_CROSS_THROW(\"sample requires ESSL 300.\");\n\t\t\telse if (options.version < 320)\n\t\t\t\trequire_extension_internal(\"GL_OES_shader_multisample_interpolation\");\n\t\t}\n\t\tres += \"sample \";\n\t}\n\tif (flags.get(DecorationInvariant) && (options.es || options.version >= 120))\n\t\tres += \"invariant \";\n\tif (flags.get(DecorationPerPrimitiveEXT))\n\t{\n\t\tres += \"perprimitiveEXT \";\n\t\trequire_extension_internal(\"GL_EXT_mesh_shader\");\n\t}\n\n\tif (flags.get(DecorationExplicitInterpAMD))\n\t{\n\t\trequire_extension_internal(\"GL_AMD_shader_explicit_vertex_parameter\");\n\t\tres += \"__explicitInterpAMD \";\n\t}\n\n\tif (flags.get(DecorationPerVertexKHR))\n\t{\n\t\tif (options.es && options.version < 320)\n\t\t\tSPIRV_CROSS_THROW(\"pervertexEXT requires ESSL 320.\");\n\t\telse if (!options.es && options.version < 450)\n\t\t\tSPIRV_CROSS_THROW(\"pervertexEXT requires GLSL 450.\");\n\n\t\tif (barycentric_is_nv)\n\t\t{\n\t\t\trequire_extension_internal(\"GL_NV_fragment_shader_barycentric\");\n\t\t\tres += \"pervertexNV \";\n\t\t}\n\t\telse\n\t\t{\n\t\t\trequire_extension_internal(\"GL_EXT_fragment_shader_barycentric\");\n\t\t\tres += \"pervertexEXT \";\n\t\t}\n\t}\n\n\treturn res;\n}\n\nstring CompilerGLSL::layout_for_member(const SPIRType &type, uint32_t index)\n{\n\tif (is_legacy())\n\t\treturn \"\";\n\n\tbool is_block = has_decoration(type.self, DecorationBlock) || has_decoration(type.self, DecorationBufferBlock);\n\tif (!is_block)\n\t\treturn \"\";\n\n\tauto &memb = ir.meta[type.self].members;\n\tif (index >= memb.size())\n\t\treturn \"\";\n\tauto &dec = memb[index];\n\n\tSmallVector<string> attr;\n\n\tif (has_member_decoration(type.self, index, DecorationPassthroughNV))\n\t\tattr.push_back(\"passthrough\");\n\n\t// We can only apply layouts on members in block interfaces.\n\t// This is a bit problematic because in SPIR-V decorations are applied on the struct types directly.\n\t// This is not supported on GLSL, so we have to make the assumption that if a struct within our buffer block struct\n\t// has a decoration, it was originally caused by a top-level layout() qualifier in GLSL.\n\t//\n\t// We would like to go from (SPIR-V style):\n\t//\n\t// struct Foo { layout(row_major) mat4 matrix; };\n\t// buffer UBO { Foo foo; };\n\t//\n\t// to\n\t//\n\t// struct Foo { mat4 matrix; }; // GLSL doesn't support any layout shenanigans in raw struct declarations.\n\t// buffer UBO { layout(row_major) Foo foo; }; // Apply the layout on top-level.\n\tauto flags = combined_decoration_for_member(type, index);\n\n\tif (flags.get(DecorationRowMajor))\n\t\tattr.push_back(\"row_major\");\n\t// We don't emit any global layouts, so column_major is default.\n\t//if (flags & (1ull << DecorationColMajor))\n\t//    attr.push_back(\"column_major\");\n\n\tif (dec.decoration_flags.get(DecorationLocation) && can_use_io_location(type.storage, true))\n\t\tattr.push_back(join(\"location = \", dec.location));\n\n\t// Can only declare component if we can declare location.\n\tif (dec.decoration_flags.get(DecorationComponent) && can_use_io_location(type.storage, true))\n\t{\n\t\tif (!options.es)\n\t\t{\n\t\t\tif (options.version < 440 && options.version >= 140)\n\t\t\t\trequire_extension_internal(\"GL_ARB_enhanced_layouts\");\n\t\t\telse if (options.version < 140)\n\t\t\t\tSPIRV_CROSS_THROW(\"Component decoration is not supported in targets below GLSL 1.40.\");\n\t\t\tattr.push_back(join(\"component = \", dec.component));\n\t\t}\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"Component decoration is not supported in ES targets.\");\n\t}\n\n\t// SPIRVCrossDecorationPacked is set by layout_for_variable earlier to mark that we need to emit offset qualifiers.\n\t// This is only done selectively in GLSL as needed.\n\tif (has_extended_decoration(type.self, SPIRVCrossDecorationExplicitOffset) &&\n\t    dec.decoration_flags.get(DecorationOffset))\n\t\tattr.push_back(join(\"offset = \", dec.offset));\n\telse if (type.storage == StorageClassOutput && dec.decoration_flags.get(DecorationOffset))\n\t\tattr.push_back(join(\"xfb_offset = \", dec.offset));\n\n\tif (attr.empty())\n\t\treturn \"\";\n\n\tstring res = \"layout(\";\n\tres += merge(attr);\n\tres += \") \";\n\treturn res;\n}\n\nconst char *CompilerGLSL::format_to_glsl(spv::ImageFormat format)\n{\n\tif (options.es && is_desktop_only_format(format))\n\t\tSPIRV_CROSS_THROW(\"Attempting to use image format not supported in ES profile.\");\n\n\tswitch (format)\n\t{\n\tcase ImageFormatRgba32f:\n\t\treturn \"rgba32f\";\n\tcase ImageFormatRgba16f:\n\t\treturn \"rgba16f\";\n\tcase ImageFormatR32f:\n\t\treturn \"r32f\";\n\tcase ImageFormatRgba8:\n\t\treturn \"rgba8\";\n\tcase ImageFormatRgba8Snorm:\n\t\treturn \"rgba8_snorm\";\n\tcase ImageFormatRg32f:\n\t\treturn \"rg32f\";\n\tcase ImageFormatRg16f:\n\t\treturn \"rg16f\";\n\tcase ImageFormatRgba32i:\n\t\treturn \"rgba32i\";\n\tcase ImageFormatRgba16i:\n\t\treturn \"rgba16i\";\n\tcase ImageFormatR32i:\n\t\treturn \"r32i\";\n\tcase ImageFormatRgba8i:\n\t\treturn \"rgba8i\";\n\tcase ImageFormatRg32i:\n\t\treturn \"rg32i\";\n\tcase ImageFormatRg16i:\n\t\treturn \"rg16i\";\n\tcase ImageFormatRgba32ui:\n\t\treturn \"rgba32ui\";\n\tcase ImageFormatRgba16ui:\n\t\treturn \"rgba16ui\";\n\tcase ImageFormatR32ui:\n\t\treturn \"r32ui\";\n\tcase ImageFormatRgba8ui:\n\t\treturn \"rgba8ui\";\n\tcase ImageFormatRg32ui:\n\t\treturn \"rg32ui\";\n\tcase ImageFormatRg16ui:\n\t\treturn \"rg16ui\";\n\tcase ImageFormatR11fG11fB10f:\n\t\treturn \"r11f_g11f_b10f\";\n\tcase ImageFormatR16f:\n\t\treturn \"r16f\";\n\tcase ImageFormatRgb10A2:\n\t\treturn \"rgb10_a2\";\n\tcase ImageFormatR8:\n\t\treturn \"r8\";\n\tcase ImageFormatRg8:\n\t\treturn \"rg8\";\n\tcase ImageFormatR16:\n\t\treturn \"r16\";\n\tcase ImageFormatRg16:\n\t\treturn \"rg16\";\n\tcase ImageFormatRgba16:\n\t\treturn \"rgba16\";\n\tcase ImageFormatR16Snorm:\n\t\treturn \"r16_snorm\";\n\tcase ImageFormatRg16Snorm:\n\t\treturn \"rg16_snorm\";\n\tcase ImageFormatRgba16Snorm:\n\t\treturn \"rgba16_snorm\";\n\tcase ImageFormatR8Snorm:\n\t\treturn \"r8_snorm\";\n\tcase ImageFormatRg8Snorm:\n\t\treturn \"rg8_snorm\";\n\tcase ImageFormatR8ui:\n\t\treturn \"r8ui\";\n\tcase ImageFormatRg8ui:\n\t\treturn \"rg8ui\";\n\tcase ImageFormatR16ui:\n\t\treturn \"r16ui\";\n\tcase ImageFormatRgb10a2ui:\n\t\treturn \"rgb10_a2ui\";\n\tcase ImageFormatR8i:\n\t\treturn \"r8i\";\n\tcase ImageFormatRg8i:\n\t\treturn \"rg8i\";\n\tcase ImageFormatR16i:\n\t\treturn \"r16i\";\n\tcase ImageFormatR64i:\n\t\treturn \"r64i\";\n\tcase ImageFormatR64ui:\n\t\treturn \"r64ui\";\n\tdefault:\n\tcase ImageFormatUnknown:\n\t\treturn nullptr;\n\t}\n}\n\nuint32_t CompilerGLSL::type_to_packed_base_size(const SPIRType &type, BufferPackingStandard)\n{\n\tswitch (type.basetype)\n\t{\n\tcase SPIRType::Double:\n\tcase SPIRType::Int64:\n\tcase SPIRType::UInt64:\n\t\treturn 8;\n\tcase SPIRType::Float:\n\tcase SPIRType::Int:\n\tcase SPIRType::UInt:\n\t\treturn 4;\n\tcase SPIRType::Half:\n\tcase SPIRType::Short:\n\tcase SPIRType::UShort:\n\t\treturn 2;\n\tcase SPIRType::SByte:\n\tcase SPIRType::UByte:\n\t\treturn 1;\n\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Unrecognized type in type_to_packed_base_size.\");\n\t}\n}\n\nuint32_t CompilerGLSL::type_to_packed_alignment(const SPIRType &type, const Bitset &flags,\n                                                BufferPackingStandard packing)\n{\n\t// If using PhysicalStorageBufferEXT storage class, this is a pointer,\n\t// and is 64-bit.\n\tif (is_physical_pointer(type))\n\t{\n\t\tif (!type.pointer)\n\t\t\tSPIRV_CROSS_THROW(\"Types in PhysicalStorageBufferEXT must be pointers.\");\n\n\t\tif (ir.addressing_model == AddressingModelPhysicalStorageBuffer64EXT)\n\t\t{\n\t\t\tif (packing_is_vec4_padded(packing) && type_is_array_of_pointers(type))\n\t\t\t\treturn 16;\n\t\t\telse\n\t\t\t\treturn 8;\n\t\t}\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"AddressingModelPhysicalStorageBuffer64EXT must be used for PhysicalStorageBufferEXT.\");\n\t}\n\telse if (is_array(type))\n\t{\n\t\tuint32_t minimum_alignment = 1;\n\t\tif (packing_is_vec4_padded(packing))\n\t\t\tminimum_alignment = 16;\n\n\t\tauto *tmp = &get<SPIRType>(type.parent_type);\n\t\twhile (!tmp->array.empty())\n\t\t\ttmp = &get<SPIRType>(tmp->parent_type);\n\n\t\t// Get the alignment of the base type, then maybe round up.\n\t\treturn max(minimum_alignment, type_to_packed_alignment(*tmp, flags, packing));\n\t}\n\n\tif (type.basetype == SPIRType::Struct)\n\t{\n\t\t// Rule 9. Structs alignments are maximum alignment of its members.\n\t\tuint32_t alignment = 1;\n\t\tfor (uint32_t i = 0; i < type.member_types.size(); i++)\n\t\t{\n\t\t\tauto member_flags = ir.meta[type.self].members[i].decoration_flags;\n\t\t\talignment =\n\t\t\t    max(alignment, type_to_packed_alignment(get<SPIRType>(type.member_types[i]), member_flags, packing));\n\t\t}\n\n\t\t// In std140, struct alignment is rounded up to 16.\n\t\tif (packing_is_vec4_padded(packing))\n\t\t\talignment = max<uint32_t>(alignment, 16u);\n\n\t\treturn alignment;\n\t}\n\telse\n\t{\n\t\tconst uint32_t base_alignment = type_to_packed_base_size(type, packing);\n\n\t\t// Alignment requirement for scalar block layout is always the alignment for the most basic component.\n\t\tif (packing_is_scalar(packing))\n\t\t\treturn base_alignment;\n\n\t\t// Vectors are *not* aligned in HLSL, but there's an extra rule where vectors cannot straddle\n\t\t// a vec4, this is handled outside since that part knows our current offset.\n\t\tif (type.columns == 1 && packing_is_hlsl(packing))\n\t\t\treturn base_alignment;\n\n\t\t// From 7.6.2.2 in GL 4.5 core spec.\n\t\t// Rule 1\n\t\tif (type.vecsize == 1 && type.columns == 1)\n\t\t\treturn base_alignment;\n\n\t\t// Rule 2\n\t\tif ((type.vecsize == 2 || type.vecsize == 4) && type.columns == 1)\n\t\t\treturn type.vecsize * base_alignment;\n\n\t\t// Rule 3\n\t\tif (type.vecsize == 3 && type.columns == 1)\n\t\t\treturn 4 * base_alignment;\n\n\t\t// Rule 4 implied. Alignment does not change in std430.\n\n\t\t// Rule 5. Column-major matrices are stored as arrays of\n\t\t// vectors.\n\t\tif (flags.get(DecorationColMajor) && type.columns > 1)\n\t\t{\n\t\t\tif (packing_is_vec4_padded(packing))\n\t\t\t\treturn 4 * base_alignment;\n\t\t\telse if (type.vecsize == 3)\n\t\t\t\treturn 4 * base_alignment;\n\t\t\telse\n\t\t\t\treturn type.vecsize * base_alignment;\n\t\t}\n\n\t\t// Rule 6 implied.\n\n\t\t// Rule 7.\n\t\tif (flags.get(DecorationRowMajor) && type.vecsize > 1)\n\t\t{\n\t\t\tif (packing_is_vec4_padded(packing))\n\t\t\t\treturn 4 * base_alignment;\n\t\t\telse if (type.columns == 3)\n\t\t\t\treturn 4 * base_alignment;\n\t\t\telse\n\t\t\t\treturn type.columns * base_alignment;\n\t\t}\n\n\t\t// Rule 8 implied.\n\t}\n\n\tSPIRV_CROSS_THROW(\"Did not find suitable rule for type. Bogus decorations?\");\n}\n\nuint32_t CompilerGLSL::type_to_packed_array_stride(const SPIRType &type, const Bitset &flags,\n                                                   BufferPackingStandard packing)\n{\n\t// Array stride is equal to aligned size of the underlying type.\n\tuint32_t parent = type.parent_type;\n\tassert(parent);\n\n\tauto &tmp = get<SPIRType>(parent);\n\n\tuint32_t size = type_to_packed_size(tmp, flags, packing);\n\tuint32_t alignment = type_to_packed_alignment(type, flags, packing);\n\treturn (size + alignment - 1) & ~(alignment - 1);\n}\n\nuint32_t CompilerGLSL::type_to_packed_size(const SPIRType &type, const Bitset &flags, BufferPackingStandard packing)\n{\n\t// If using PhysicalStorageBufferEXT storage class, this is a pointer,\n\t// and is 64-bit.\n\tif (is_physical_pointer(type))\n\t{\n\t\tif (!type.pointer)\n\t\t\tSPIRV_CROSS_THROW(\"Types in PhysicalStorageBufferEXT must be pointers.\");\n\n\t\tif (ir.addressing_model == AddressingModelPhysicalStorageBuffer64EXT)\n\t\t\treturn 8;\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"AddressingModelPhysicalStorageBuffer64EXT must be used for PhysicalStorageBufferEXT.\");\n\t}\n\telse if (is_array(type))\n\t{\n\t\tuint32_t packed_size = to_array_size_literal(type) * type_to_packed_array_stride(type, flags, packing);\n\n\t\t// For arrays of vectors and matrices in HLSL, the last element has a size which depends on its vector size,\n\t\t// so that it is possible to pack other vectors into the last element.\n\t\tif (packing_is_hlsl(packing) && type.basetype != SPIRType::Struct)\n\t\t\tpacked_size -= (4 - type.vecsize) * (type.width / 8);\n\n\t\treturn packed_size;\n\t}\n\n\tuint32_t size = 0;\n\n\tif (type.basetype == SPIRType::Struct)\n\t{\n\t\tuint32_t pad_alignment = 1;\n\n\t\tfor (uint32_t i = 0; i < type.member_types.size(); i++)\n\t\t{\n\t\t\tauto member_flags = ir.meta[type.self].members[i].decoration_flags;\n\t\t\tauto &member_type = get<SPIRType>(type.member_types[i]);\n\n\t\t\tuint32_t packed_alignment = type_to_packed_alignment(member_type, member_flags, packing);\n\t\t\tuint32_t alignment = max(packed_alignment, pad_alignment);\n\n\t\t\t// The next member following a struct member is aligned to the base alignment of the struct that came before.\n\t\t\t// GL 4.5 spec, 7.6.2.2.\n\t\t\tif (member_type.basetype == SPIRType::Struct)\n\t\t\t\tpad_alignment = packed_alignment;\n\t\t\telse\n\t\t\t\tpad_alignment = 1;\n\n\t\t\tsize = (size + alignment - 1) & ~(alignment - 1);\n\t\t\tsize += type_to_packed_size(member_type, member_flags, packing);\n\t\t}\n\t}\n\telse\n\t{\n\t\tconst uint32_t base_alignment = type_to_packed_base_size(type, packing);\n\n\t\tif (packing_is_scalar(packing))\n\t\t{\n\t\t\tsize = type.vecsize * type.columns * base_alignment;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (type.columns == 1)\n\t\t\t\tsize = type.vecsize * base_alignment;\n\n\t\t\tif (flags.get(DecorationColMajor) && type.columns > 1)\n\t\t\t{\n\t\t\t\tif (packing_is_vec4_padded(packing))\n\t\t\t\t\tsize = type.columns * 4 * base_alignment;\n\t\t\t\telse if (type.vecsize == 3)\n\t\t\t\t\tsize = type.columns * 4 * base_alignment;\n\t\t\t\telse\n\t\t\t\t\tsize = type.columns * type.vecsize * base_alignment;\n\t\t\t}\n\n\t\t\tif (flags.get(DecorationRowMajor) && type.vecsize > 1)\n\t\t\t{\n\t\t\t\tif (packing_is_vec4_padded(packing))\n\t\t\t\t\tsize = type.vecsize * 4 * base_alignment;\n\t\t\t\telse if (type.columns == 3)\n\t\t\t\t\tsize = type.vecsize * 4 * base_alignment;\n\t\t\t\telse\n\t\t\t\t\tsize = type.vecsize * type.columns * base_alignment;\n\t\t\t}\n\n\t\t\t// For matrices in HLSL, the last element has a size which depends on its vector size,\n\t\t\t// so that it is possible to pack other vectors into the last element.\n\t\t\tif (packing_is_hlsl(packing) && type.columns > 1)\n\t\t\t\tsize -= (4 - type.vecsize) * (type.width / 8);\n\t\t}\n\t}\n\n\treturn size;\n}\n\nbool CompilerGLSL::buffer_is_packing_standard(const SPIRType &type, BufferPackingStandard packing,\n                                              uint32_t *failed_validation_index, uint32_t start_offset,\n                                              uint32_t end_offset)\n{\n\t// This is very tricky and error prone, but try to be exhaustive and correct here.\n\t// SPIR-V doesn't directly say if we're using std430 or std140.\n\t// SPIR-V communicates this using Offset and ArrayStride decorations (which is what really matters),\n\t// so we have to try to infer whether or not the original GLSL source was std140 or std430 based on this information.\n\t// We do not have to consider shared or packed since these layouts are not allowed in Vulkan SPIR-V (they are useless anyways, and custom offsets would do the same thing).\n\t//\n\t// It is almost certain that we're using std430, but it gets tricky with arrays in particular.\n\t// We will assume std430, but infer std140 if we can prove the struct is not compliant with std430.\n\t//\n\t// The only two differences between std140 and std430 are related to padding alignment/array stride\n\t// in arrays and structs. In std140 they take minimum vec4 alignment.\n\t// std430 only removes the vec4 requirement.\n\n\tuint32_t offset = 0;\n\tuint32_t pad_alignment = 1;\n\n\tbool is_top_level_block =\n\t    has_decoration(type.self, DecorationBlock) || has_decoration(type.self, DecorationBufferBlock);\n\n\tfor (uint32_t i = 0; i < type.member_types.size(); i++)\n\t{\n\t\tauto &memb_type = get<SPIRType>(type.member_types[i]);\n\t\tauto member_flags = ir.meta[type.self].members[i].decoration_flags;\n\n\t\t// Verify alignment rules.\n\t\tuint32_t packed_alignment = type_to_packed_alignment(memb_type, member_flags, packing);\n\n\t\t// This is a rather dirty workaround to deal with some cases of OpSpecConstantOp used as array size, e.g:\n\t\t// layout(constant_id = 0) const int s = 10;\n\t\t// const int S = s + 5; // SpecConstantOp\n\t\t// buffer Foo { int data[S]; }; // <-- Very hard for us to deduce a fixed value here,\n\t\t// we would need full implementation of compile-time constant folding. :(\n\t\t// If we are the last member of a struct, there might be cases where the actual size of that member is irrelevant\n\t\t// for our analysis (e.g. unsized arrays).\n\t\t// This lets us simply ignore that there are spec constant op sized arrays in our buffers.\n\t\t// Querying size of this member will fail, so just don't call it unless we have to.\n\t\t//\n\t\t// This is likely \"best effort\" we can support without going into unacceptably complicated workarounds.\n\t\tbool member_can_be_unsized =\n\t\t    is_top_level_block && size_t(i + 1) == type.member_types.size() && !memb_type.array.empty();\n\n\t\tuint32_t packed_size = 0;\n\t\tif (!member_can_be_unsized || packing_is_hlsl(packing))\n\t\t\tpacked_size = type_to_packed_size(memb_type, member_flags, packing);\n\n\t\t// We only need to care about this if we have non-array types which can straddle the vec4 boundary.\n\t\tuint32_t actual_offset = type_struct_member_offset(type, i);\n\n\t\tif (packing_is_hlsl(packing))\n\t\t{\n\t\t\t// If a member straddles across a vec4 boundary, alignment is actually vec4.\n\t\t\tuint32_t target_offset;\n\n\t\t\t// If we intend to use explicit packing, we must check for improper straddle with that offset.\n\t\t\t// In implicit packing, we must check with implicit offset, since the explicit offset\n\t\t\t// might have already accounted for the straddle, and we'd miss the alignment promotion to vec4.\n\t\t\t// This is important when packing sub-structs that don't support packoffset().\n\t\t\tif (packing_has_flexible_offset(packing))\n\t\t\t\ttarget_offset = actual_offset;\n\t\t\telse\n\t\t\t\ttarget_offset = offset;\n\n\t\t\tuint32_t begin_word = target_offset / 16;\n\t\t\tuint32_t end_word = (target_offset + packed_size - 1) / 16;\n\n\t\t\tif (begin_word != end_word)\n\t\t\t\tpacked_alignment = max<uint32_t>(packed_alignment, 16u);\n\t\t}\n\n\t\t// Field is not in the specified range anymore and we can ignore any further fields.\n\t\tif (actual_offset >= end_offset)\n\t\t\tbreak;\n\n\t\tuint32_t alignment = max(packed_alignment, pad_alignment);\n\t\toffset = (offset + alignment - 1) & ~(alignment - 1);\n\n\t\t// The next member following a struct member is aligned to the base alignment of the struct that came before.\n\t\t// GL 4.5 spec, 7.6.2.2.\n\t\tif (memb_type.basetype == SPIRType::Struct && !memb_type.pointer)\n\t\t\tpad_alignment = packed_alignment;\n\t\telse\n\t\t\tpad_alignment = 1;\n\n\t\t// Only care about packing if we are in the given range\n\t\tif (actual_offset >= start_offset)\n\t\t{\n\t\t\t// We only care about offsets in std140, std430, etc ...\n\t\t\t// For EnhancedLayout variants, we have the flexibility to choose our own offsets.\n\t\t\tif (!packing_has_flexible_offset(packing))\n\t\t\t{\n\t\t\t\tif (actual_offset != offset) // This cannot be the packing we're looking for.\n\t\t\t\t{\n\t\t\t\t\tif (failed_validation_index)\n\t\t\t\t\t\t*failed_validation_index = i;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ((actual_offset & (alignment - 1)) != 0)\n\t\t\t{\n\t\t\t\t// We still need to verify that alignment rules are observed, even if we have explicit offset.\n\t\t\t\tif (failed_validation_index)\n\t\t\t\t\t*failed_validation_index = i;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Verify array stride rules.\n\t\t\tif (is_array(memb_type) &&\n\t\t\t    type_to_packed_array_stride(memb_type, member_flags, packing) !=\n\t\t\t    type_struct_member_array_stride(type, i))\n\t\t\t{\n\t\t\t\tif (failed_validation_index)\n\t\t\t\t\t*failed_validation_index = i;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Verify that sub-structs also follow packing rules.\n\t\t\t// We cannot use enhanced layouts on substructs, so they better be up to spec.\n\t\t\tauto substruct_packing = packing_to_substruct_packing(packing);\n\n\t\t\tif (!memb_type.pointer && !memb_type.member_types.empty() &&\n\t\t\t    !buffer_is_packing_standard(memb_type, substruct_packing))\n\t\t\t{\n\t\t\t\tif (failed_validation_index)\n\t\t\t\t\t*failed_validation_index = i;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Bump size.\n\t\toffset = actual_offset + packed_size;\n\t}\n\n\treturn true;\n}\n\nbool CompilerGLSL::can_use_io_location(StorageClass storage, bool block)\n{\n\t// Location specifiers are must have in SPIR-V, but they aren't really supported in earlier versions of GLSL.\n\t// Be very explicit here about how to solve the issue.\n\tif ((get_execution_model() != ExecutionModelVertex && storage == StorageClassInput) ||\n\t    (get_execution_model() != ExecutionModelFragment && storage == StorageClassOutput))\n\t{\n\t\tuint32_t minimum_desktop_version = block ? 440 : 410;\n\t\t// ARB_enhanced_layouts vs ARB_separate_shader_objects ...\n\n\t\tif (!options.es && options.version < minimum_desktop_version && !options.separate_shader_objects)\n\t\t\treturn false;\n\t\telse if (options.es && options.version < 310)\n\t\t\treturn false;\n\t}\n\n\tif ((get_execution_model() == ExecutionModelVertex && storage == StorageClassInput) ||\n\t    (get_execution_model() == ExecutionModelFragment && storage == StorageClassOutput))\n\t{\n\t\tif (options.es && options.version < 300)\n\t\t\treturn false;\n\t\telse if (!options.es && options.version < 330)\n\t\t\treturn false;\n\t}\n\n\tif (storage == StorageClassUniform || storage == StorageClassUniformConstant || storage == StorageClassPushConstant)\n\t{\n\t\tif (options.es && options.version < 310)\n\t\t\treturn false;\n\t\telse if (!options.es && options.version < 430)\n\t\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nstring CompilerGLSL::layout_for_variable(const SPIRVariable &var)\n{\n\t// FIXME: Come up with a better solution for when to disable layouts.\n\t// Having layouts depend on extensions as well as which types\n\t// of layouts are used. For now, the simple solution is to just disable\n\t// layouts for legacy versions.\n\tif (is_legacy())\n\t\treturn \"\";\n\n\tif (subpass_input_is_framebuffer_fetch(var.self))\n\t\treturn \"\";\n\n\tSmallVector<string> attr;\n\n\tauto &type = get<SPIRType>(var.basetype);\n\tauto &flags = get_decoration_bitset(var.self);\n\tauto &typeflags = get_decoration_bitset(type.self);\n\n\tif (flags.get(DecorationPassthroughNV))\n\t\tattr.push_back(\"passthrough\");\n\n\tif (options.vulkan_semantics && var.storage == StorageClassPushConstant)\n\t\tattr.push_back(\"push_constant\");\n\telse if (var.storage == StorageClassShaderRecordBufferKHR)\n\t\tattr.push_back(ray_tracing_is_khr ? \"shaderRecordEXT\" : \"shaderRecordNV\");\n\n\tif (flags.get(DecorationRowMajor))\n\t\tattr.push_back(\"row_major\");\n\tif (flags.get(DecorationColMajor))\n\t\tattr.push_back(\"column_major\");\n\n\tif (options.vulkan_semantics)\n\t{\n\t\tif (flags.get(DecorationInputAttachmentIndex))\n\t\t\tattr.push_back(join(\"input_attachment_index = \", get_decoration(var.self, DecorationInputAttachmentIndex)));\n\t}\n\n\tbool is_block = has_decoration(type.self, DecorationBlock);\n\tif (flags.get(DecorationLocation) && can_use_io_location(var.storage, is_block))\n\t{\n\t\tBitset combined_decoration;\n\t\tfor (uint32_t i = 0; i < ir.meta[type.self].members.size(); i++)\n\t\t\tcombined_decoration.merge_or(combined_decoration_for_member(type, i));\n\n\t\t// If our members have location decorations, we don't need to\n\t\t// emit location decorations at the top as well (looks weird).\n\t\tif (!combined_decoration.get(DecorationLocation))\n\t\t\tattr.push_back(join(\"location = \", get_decoration(var.self, DecorationLocation)));\n\t}\n\n\tif (get_execution_model() == ExecutionModelFragment && var.storage == StorageClassOutput &&\n\t    location_is_non_coherent_framebuffer_fetch(get_decoration(var.self, DecorationLocation)))\n\t{\n\t\tattr.push_back(\"noncoherent\");\n\t}\n\n\t// Transform feedback\n\tbool uses_enhanced_layouts = false;\n\tif (is_block && var.storage == StorageClassOutput)\n\t{\n\t\t// For blocks, there is a restriction where xfb_stride/xfb_buffer must only be declared on the block itself,\n\t\t// since all members must match the same xfb_buffer. The only thing we will declare for members of the block\n\t\t// is the xfb_offset.\n\t\tuint32_t member_count = uint32_t(type.member_types.size());\n\t\tbool have_xfb_buffer_stride = false;\n\t\tbool have_any_xfb_offset = false;\n\t\tbool have_geom_stream = false;\n\t\tuint32_t xfb_stride = 0, xfb_buffer = 0, geom_stream = 0;\n\n\t\tif (flags.get(DecorationXfbBuffer) && flags.get(DecorationXfbStride))\n\t\t{\n\t\t\thave_xfb_buffer_stride = true;\n\t\t\txfb_buffer = get_decoration(var.self, DecorationXfbBuffer);\n\t\t\txfb_stride = get_decoration(var.self, DecorationXfbStride);\n\t\t}\n\n\t\tif (flags.get(DecorationStream))\n\t\t{\n\t\t\thave_geom_stream = true;\n\t\t\tgeom_stream = get_decoration(var.self, DecorationStream);\n\t\t}\n\n\t\t// Verify that none of the members violate our assumption.\n\t\tfor (uint32_t i = 0; i < member_count; i++)\n\t\t{\n\t\t\tif (has_member_decoration(type.self, i, DecorationStream))\n\t\t\t{\n\t\t\t\tuint32_t member_geom_stream = get_member_decoration(type.self, i, DecorationStream);\n\t\t\t\tif (have_geom_stream && member_geom_stream != geom_stream)\n\t\t\t\t\tSPIRV_CROSS_THROW(\"IO block member Stream mismatch.\");\n\t\t\t\thave_geom_stream = true;\n\t\t\t\tgeom_stream = member_geom_stream;\n\t\t\t}\n\n\t\t\t// Only members with an Offset decoration participate in XFB.\n\t\t\tif (!has_member_decoration(type.self, i, DecorationOffset))\n\t\t\t\tcontinue;\n\t\t\thave_any_xfb_offset = true;\n\n\t\t\tif (has_member_decoration(type.self, i, DecorationXfbBuffer))\n\t\t\t{\n\t\t\t\tuint32_t buffer_index = get_member_decoration(type.self, i, DecorationXfbBuffer);\n\t\t\t\tif (have_xfb_buffer_stride && buffer_index != xfb_buffer)\n\t\t\t\t\tSPIRV_CROSS_THROW(\"IO block member XfbBuffer mismatch.\");\n\t\t\t\thave_xfb_buffer_stride = true;\n\t\t\t\txfb_buffer = buffer_index;\n\t\t\t}\n\n\t\t\tif (has_member_decoration(type.self, i, DecorationXfbStride))\n\t\t\t{\n\t\t\t\tuint32_t stride = get_member_decoration(type.self, i, DecorationXfbStride);\n\t\t\t\tif (have_xfb_buffer_stride && stride != xfb_stride)\n\t\t\t\t\tSPIRV_CROSS_THROW(\"IO block member XfbStride mismatch.\");\n\t\t\t\thave_xfb_buffer_stride = true;\n\t\t\t\txfb_stride = stride;\n\t\t\t}\n\t\t}\n\n\t\tif (have_xfb_buffer_stride && have_any_xfb_offset)\n\t\t{\n\t\t\tattr.push_back(join(\"xfb_buffer = \", xfb_buffer));\n\t\t\tattr.push_back(join(\"xfb_stride = \", xfb_stride));\n\t\t\tuses_enhanced_layouts = true;\n\t\t}\n\n\t\tif (have_geom_stream)\n\t\t{\n\t\t\tif (get_execution_model() != ExecutionModelGeometry)\n\t\t\t\tSPIRV_CROSS_THROW(\"Geometry streams can only be used in geometry shaders.\");\n\t\t\tif (options.es)\n\t\t\t\tSPIRV_CROSS_THROW(\"Multiple geometry streams not supported in ESSL.\");\n\t\t\tif (options.version < 400)\n\t\t\t\trequire_extension_internal(\"GL_ARB_transform_feedback3\");\n\t\t\tattr.push_back(join(\"stream = \", get_decoration(var.self, DecorationStream)));\n\t\t}\n\t}\n\telse if (var.storage == StorageClassOutput)\n\t{\n\t\tif (flags.get(DecorationXfbBuffer) && flags.get(DecorationXfbStride) && flags.get(DecorationOffset))\n\t\t{\n\t\t\t// XFB for standalone variables, we can emit all decorations.\n\t\t\tattr.push_back(join(\"xfb_buffer = \", get_decoration(var.self, DecorationXfbBuffer)));\n\t\t\tattr.push_back(join(\"xfb_stride = \", get_decoration(var.self, DecorationXfbStride)));\n\t\t\tattr.push_back(join(\"xfb_offset = \", get_decoration(var.self, DecorationOffset)));\n\t\t\tuses_enhanced_layouts = true;\n\t\t}\n\n\t\tif (flags.get(DecorationStream))\n\t\t{\n\t\t\tif (get_execution_model() != ExecutionModelGeometry)\n\t\t\t\tSPIRV_CROSS_THROW(\"Geometry streams can only be used in geometry shaders.\");\n\t\t\tif (options.es)\n\t\t\t\tSPIRV_CROSS_THROW(\"Multiple geometry streams not supported in ESSL.\");\n\t\t\tif (options.version < 400)\n\t\t\t\trequire_extension_internal(\"GL_ARB_transform_feedback3\");\n\t\t\tattr.push_back(join(\"stream = \", get_decoration(var.self, DecorationStream)));\n\t\t}\n\t}\n\n\t// Can only declare Component if we can declare location.\n\tif (flags.get(DecorationComponent) && can_use_io_location(var.storage, is_block))\n\t{\n\t\tuses_enhanced_layouts = true;\n\t\tattr.push_back(join(\"component = \", get_decoration(var.self, DecorationComponent)));\n\t}\n\n\tif (uses_enhanced_layouts)\n\t{\n\t\tif (!options.es)\n\t\t{\n\t\t\tif (options.version < 440 && options.version >= 140)\n\t\t\t\trequire_extension_internal(\"GL_ARB_enhanced_layouts\");\n\t\t\telse if (options.version < 140)\n\t\t\t\tSPIRV_CROSS_THROW(\"GL_ARB_enhanced_layouts is not supported in targets below GLSL 1.40.\");\n\t\t\tif (!options.es && options.version < 440)\n\t\t\t\trequire_extension_internal(\"GL_ARB_enhanced_layouts\");\n\t\t}\n\t\telse if (options.es)\n\t\t\tSPIRV_CROSS_THROW(\"GL_ARB_enhanced_layouts is not supported in ESSL.\");\n\t}\n\n\tif (flags.get(DecorationIndex))\n\t\tattr.push_back(join(\"index = \", get_decoration(var.self, DecorationIndex)));\n\n\t// Do not emit set = decoration in regular GLSL output, but\n\t// we need to preserve it in Vulkan GLSL mode.\n\tif (var.storage != StorageClassPushConstant && var.storage != StorageClassShaderRecordBufferKHR)\n\t{\n\t\tif (flags.get(DecorationDescriptorSet) && options.vulkan_semantics)\n\t\t\tattr.push_back(join(\"set = \", get_decoration(var.self, DecorationDescriptorSet)));\n\t}\n\n\tbool push_constant_block = options.vulkan_semantics && var.storage == StorageClassPushConstant;\n\tbool ssbo_block = var.storage == StorageClassStorageBuffer || var.storage == StorageClassShaderRecordBufferKHR ||\n\t                  (var.storage == StorageClassUniform && typeflags.get(DecorationBufferBlock));\n\tbool emulated_ubo = var.storage == StorageClassPushConstant && options.emit_push_constant_as_uniform_buffer;\n\tbool ubo_block = var.storage == StorageClassUniform && typeflags.get(DecorationBlock);\n\n\t// GL 3.0/GLSL 1.30 is not considered legacy, but it doesn't have UBOs ...\n\tbool can_use_buffer_blocks = (options.es && options.version >= 300) || (!options.es && options.version >= 140);\n\n\t// pretend no UBOs when options say so\n\tif (ubo_block && options.emit_uniform_buffer_as_plain_uniforms)\n\t\tcan_use_buffer_blocks = false;\n\n\tbool can_use_binding;\n\tif (options.es)\n\t\tcan_use_binding = options.version >= 310;\n\telse\n\t\tcan_use_binding = options.enable_420pack_extension || (options.version >= 420);\n\n\t// Make sure we don't emit binding layout for a classic uniform on GLSL 1.30.\n\tif (!can_use_buffer_blocks && var.storage == StorageClassUniform)\n\t\tcan_use_binding = false;\n\n\tif (var.storage == StorageClassShaderRecordBufferKHR)\n\t\tcan_use_binding = false;\n\n\tif (can_use_binding && flags.get(DecorationBinding))\n\t\tattr.push_back(join(\"binding = \", get_decoration(var.self, DecorationBinding)));\n\n\tif (var.storage != StorageClassOutput && flags.get(DecorationOffset))\n\t\tattr.push_back(join(\"offset = \", get_decoration(var.self, DecorationOffset)));\n\n\t// Instead of adding explicit offsets for every element here, just assume we're using std140 or std430.\n\t// If SPIR-V does not comply with either layout, we cannot really work around it.\n\tif (can_use_buffer_blocks && (ubo_block || emulated_ubo))\n\t{\n\t\tattr.push_back(buffer_to_packing_standard(type, false));\n\t}\n\telse if (can_use_buffer_blocks && (push_constant_block || ssbo_block))\n\t{\n\t\tattr.push_back(buffer_to_packing_standard(type, true));\n\t}\n\n\t// For images, the type itself adds a layout qualifer.\n\t// Only emit the format for storage images.\n\tif (type.basetype == SPIRType::Image && type.image.sampled == 2)\n\t{\n\t\tconst char *fmt = format_to_glsl(type.image.format);\n\t\tif (fmt)\n\t\t\tattr.push_back(fmt);\n\t}\n\n\tif (attr.empty())\n\t\treturn \"\";\n\n\tstring res = \"layout(\";\n\tres += merge(attr);\n\tres += \") \";\n\treturn res;\n}\n\nstring CompilerGLSL::buffer_to_packing_standard(const SPIRType &type, bool support_std430_without_scalar_layout)\n{\n\tif (support_std430_without_scalar_layout && buffer_is_packing_standard(type, BufferPackingStd430))\n\t\treturn \"std430\";\n\telse if (buffer_is_packing_standard(type, BufferPackingStd140))\n\t\treturn \"std140\";\n\telse if (options.vulkan_semantics && buffer_is_packing_standard(type, BufferPackingScalar))\n\t{\n\t\trequire_extension_internal(\"GL_EXT_scalar_block_layout\");\n\t\treturn \"scalar\";\n\t}\n\telse if (support_std430_without_scalar_layout &&\n\t         buffer_is_packing_standard(type, BufferPackingStd430EnhancedLayout))\n\t{\n\t\tif (options.es && !options.vulkan_semantics)\n\t\t\tSPIRV_CROSS_THROW(\"Push constant block cannot be expressed as neither std430 nor std140. ES-targets do \"\n\t\t\t                  \"not support GL_ARB_enhanced_layouts.\");\n\t\tif (!options.es && !options.vulkan_semantics && options.version < 440)\n\t\t\trequire_extension_internal(\"GL_ARB_enhanced_layouts\");\n\n\t\tset_extended_decoration(type.self, SPIRVCrossDecorationExplicitOffset);\n\t\treturn \"std430\";\n\t}\n\telse if (buffer_is_packing_standard(type, BufferPackingStd140EnhancedLayout))\n\t{\n\t\t// Fallback time. We might be able to use the ARB_enhanced_layouts to deal with this difference,\n\t\t// however, we can only use layout(offset) on the block itself, not any substructs, so the substructs better be the appropriate layout.\n\t\t// Enhanced layouts seem to always work in Vulkan GLSL, so no need for extensions there.\n\t\tif (options.es && !options.vulkan_semantics)\n\t\t\tSPIRV_CROSS_THROW(\"Push constant block cannot be expressed as neither std430 nor std140. ES-targets do \"\n\t\t\t                  \"not support GL_ARB_enhanced_layouts.\");\n\t\tif (!options.es && !options.vulkan_semantics && options.version < 440)\n\t\t\trequire_extension_internal(\"GL_ARB_enhanced_layouts\");\n\n\t\tset_extended_decoration(type.self, SPIRVCrossDecorationExplicitOffset);\n\t\treturn \"std140\";\n\t}\n\telse if (options.vulkan_semantics && buffer_is_packing_standard(type, BufferPackingScalarEnhancedLayout))\n\t{\n\t\tset_extended_decoration(type.self, SPIRVCrossDecorationExplicitOffset);\n\t\trequire_extension_internal(\"GL_EXT_scalar_block_layout\");\n\t\treturn \"scalar\";\n\t}\n\telse if (!support_std430_without_scalar_layout && options.vulkan_semantics &&\n\t         buffer_is_packing_standard(type, BufferPackingStd430))\n\t{\n\t\t// UBOs can support std430 with GL_EXT_scalar_block_layout.\n\t\trequire_extension_internal(\"GL_EXT_scalar_block_layout\");\n\t\treturn \"std430\";\n\t}\n\telse if (!support_std430_without_scalar_layout && options.vulkan_semantics &&\n\t         buffer_is_packing_standard(type, BufferPackingStd430EnhancedLayout))\n\t{\n\t\t// UBOs can support std430 with GL_EXT_scalar_block_layout.\n\t\tset_extended_decoration(type.self, SPIRVCrossDecorationExplicitOffset);\n\t\trequire_extension_internal(\"GL_EXT_scalar_block_layout\");\n\t\treturn \"std430\";\n\t}\n\telse\n\t{\n\t\tSPIRV_CROSS_THROW(\"Buffer block cannot be expressed as any of std430, std140, scalar, even with enhanced \"\n\t\t                  \"layouts. You can try flattening this block to support a more flexible layout.\");\n\t}\n}\n\nvoid CompilerGLSL::emit_push_constant_block(const SPIRVariable &var)\n{\n\tif (flattened_buffer_blocks.count(var.self))\n\t\temit_buffer_block_flattened(var);\n\telse if (options.vulkan_semantics)\n\t\temit_push_constant_block_vulkan(var);\n\telse if (options.emit_push_constant_as_uniform_buffer)\n\t\temit_buffer_block_native(var);\n\telse\n\t\temit_push_constant_block_glsl(var);\n}\n\nvoid CompilerGLSL::emit_push_constant_block_vulkan(const SPIRVariable &var)\n{\n\temit_buffer_block(var);\n}\n\nvoid CompilerGLSL::emit_push_constant_block_glsl(const SPIRVariable &var)\n{\n\t// OpenGL has no concept of push constant blocks, implement it as a uniform struct.\n\tauto &type = get<SPIRType>(var.basetype);\n\n\tunset_decoration(var.self, DecorationBinding);\n\tunset_decoration(var.self, DecorationDescriptorSet);\n\n#if 0\n    if (flags & ((1ull << DecorationBinding) | (1ull << DecorationDescriptorSet)))\n        SPIRV_CROSS_THROW(\"Push constant blocks cannot be compiled to GLSL with Binding or Set syntax. \"\n                            \"Remap to location with reflection API first or disable these decorations.\");\n#endif\n\n\t// We're emitting the push constant block as a regular struct, so disable the block qualifier temporarily.\n\t// Otherwise, we will end up emitting layout() qualifiers on naked structs which is not allowed.\n\tbool block_flag = has_decoration(type.self, DecorationBlock);\n\tunset_decoration(type.self, DecorationBlock);\n\n\temit_struct(type);\n\n\tif (block_flag)\n\t\tset_decoration(type.self, DecorationBlock);\n\n\temit_uniform(var);\n\tstatement(\"\");\n}\n\nvoid CompilerGLSL::emit_buffer_block(const SPIRVariable &var)\n{\n\tauto &type = get<SPIRType>(var.basetype);\n\tbool ubo_block = var.storage == StorageClassUniform && has_decoration(type.self, DecorationBlock);\n\n\tif (flattened_buffer_blocks.count(var.self))\n\t\temit_buffer_block_flattened(var);\n\telse if (is_legacy() || (!options.es && options.version == 130) ||\n\t         (ubo_block && options.emit_uniform_buffer_as_plain_uniforms))\n\t\temit_buffer_block_legacy(var);\n\telse\n\t\temit_buffer_block_native(var);\n}\n\nvoid CompilerGLSL::emit_buffer_block_legacy(const SPIRVariable &var)\n{\n\tauto &type = get<SPIRType>(var.basetype);\n\tbool ssbo = var.storage == StorageClassStorageBuffer ||\n\t            ir.meta[type.self].decoration.decoration_flags.get(DecorationBufferBlock);\n\tif (ssbo)\n\t\tSPIRV_CROSS_THROW(\"SSBOs not supported in legacy targets.\");\n\n\t// We're emitting the push constant block as a regular struct, so disable the block qualifier temporarily.\n\t// Otherwise, we will end up emitting layout() qualifiers on naked structs which is not allowed.\n\tauto &block_flags = ir.meta[type.self].decoration.decoration_flags;\n\tbool block_flag = block_flags.get(DecorationBlock);\n\tblock_flags.clear(DecorationBlock);\n\temit_struct(type);\n\tif (block_flag)\n\t\tblock_flags.set(DecorationBlock);\n\temit_uniform(var);\n\tstatement(\"\");\n}\n\nvoid CompilerGLSL::emit_buffer_reference_block(uint32_t type_id, bool forward_declaration)\n{\n\tauto &type = get<SPIRType>(type_id);\n\tstring buffer_name;\n\n\tif (forward_declaration)\n\t{\n\t\t// Block names should never alias, but from HLSL input they kind of can because block types are reused for UAVs ...\n\t\t// Allow aliased name since we might be declaring the block twice. Once with buffer reference (forward declared) and one proper declaration.\n\t\t// The names must match up.\n\t\tbuffer_name = to_name(type.self, false);\n\n\t\t// Shaders never use the block by interface name, so we don't\n\t\t// have to track this other than updating name caches.\n\t\t// If we have a collision for any reason, just fallback immediately.\n\t\tif (ir.meta[type.self].decoration.alias.empty() ||\n\t\t    block_ssbo_names.find(buffer_name) != end(block_ssbo_names) ||\n\t\t    resource_names.find(buffer_name) != end(resource_names))\n\t\t{\n\t\t\tbuffer_name = join(\"_\", type.self);\n\t\t}\n\n\t\t// Make sure we get something unique for both global name scope and block name scope.\n\t\t// See GLSL 4.5 spec: section 4.3.9 for details.\n\t\tadd_variable(block_ssbo_names, resource_names, buffer_name);\n\n\t\t// If for some reason buffer_name is an illegal name, make a final fallback to a workaround name.\n\t\t// This cannot conflict with anything else, so we're safe now.\n\t\t// We cannot reuse this fallback name in neither global scope (blocked by block_names) nor block name scope.\n\t\tif (buffer_name.empty())\n\t\t\tbuffer_name = join(\"_\", type.self);\n\n\t\tblock_names.insert(buffer_name);\n\t\tblock_ssbo_names.insert(buffer_name);\n\n\t\t// Ensure we emit the correct name when emitting non-forward pointer type.\n\t\tir.meta[type.self].decoration.alias = buffer_name;\n\t}\n\telse if (type.basetype != SPIRType::Struct)\n\t\tbuffer_name = type_to_glsl(type);\n\telse\n\t\tbuffer_name = to_name(type.self, false);\n\n\tif (!forward_declaration)\n\t{\n\t\tauto itr = physical_storage_type_to_alignment.find(type_id);\n\t\tuint32_t alignment = 0;\n\t\tif (itr != physical_storage_type_to_alignment.end())\n\t\t\talignment = itr->second.alignment;\n\n\t\tif (type.basetype == SPIRType::Struct)\n\t\t{\n\t\t\tSmallVector<std::string> attributes;\n\t\t\tattributes.push_back(\"buffer_reference\");\n\t\t\tif (alignment)\n\t\t\t\tattributes.push_back(join(\"buffer_reference_align = \", alignment));\n\t\t\tattributes.push_back(buffer_to_packing_standard(type, true));\n\n\t\t\tauto flags = ir.get_buffer_block_type_flags(type);\n\t\t\tstring decorations;\n\t\t\tif (flags.get(DecorationRestrict))\n\t\t\t\tdecorations += \" restrict\";\n\t\t\tif (flags.get(DecorationCoherent))\n\t\t\t\tdecorations += \" coherent\";\n\t\t\tif (flags.get(DecorationNonReadable))\n\t\t\t\tdecorations += \" writeonly\";\n\t\t\tif (flags.get(DecorationNonWritable))\n\t\t\t\tdecorations += \" readonly\";\n\n\t\t\tstatement(\"layout(\", merge(attributes), \")\", decorations, \" buffer \", buffer_name);\n\t\t}\n\t\telse if (alignment)\n\t\t\tstatement(\"layout(buffer_reference, buffer_reference_align = \", alignment, \") buffer \", buffer_name);\n\t\telse\n\t\t\tstatement(\"layout(buffer_reference) buffer \", buffer_name);\n\n\t\tbegin_scope();\n\n\t\tif (type.basetype == SPIRType::Struct)\n\t\t{\n\t\t\ttype.member_name_cache.clear();\n\n\t\t\tuint32_t i = 0;\n\t\t\tfor (auto &member : type.member_types)\n\t\t\t{\n\t\t\t\tadd_member_name(type, i);\n\t\t\t\temit_struct_member(type, member, i);\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tauto &pointee_type = get_pointee_type(type);\n\t\t\tstatement(type_to_glsl(pointee_type), \" value\", type_to_array_glsl(pointee_type), \";\");\n\t\t}\n\n\t\tend_scope_decl();\n\t\tstatement(\"\");\n\t}\n\telse\n\t{\n\t\tstatement(\"layout(buffer_reference) buffer \", buffer_name, \";\");\n\t}\n}\n\nvoid CompilerGLSL::emit_buffer_block_native(const SPIRVariable &var)\n{\n\tauto &type = get<SPIRType>(var.basetype);\n\n\tBitset flags = ir.get_buffer_block_flags(var);\n\tbool ssbo = var.storage == StorageClassStorageBuffer || var.storage == StorageClassShaderRecordBufferKHR ||\n\t            ir.meta[type.self].decoration.decoration_flags.get(DecorationBufferBlock);\n\tbool is_restrict = ssbo && flags.get(DecorationRestrict);\n\tbool is_writeonly = ssbo && flags.get(DecorationNonReadable);\n\tbool is_readonly = ssbo && flags.get(DecorationNonWritable);\n\tbool is_coherent = ssbo && flags.get(DecorationCoherent);\n\n\t// Block names should never alias, but from HLSL input they kind of can because block types are reused for UAVs ...\n\tauto buffer_name = to_name(type.self, false);\n\n\tauto &block_namespace = ssbo ? block_ssbo_names : block_ubo_names;\n\n\t// Shaders never use the block by interface name, so we don't\n\t// have to track this other than updating name caches.\n\t// If we have a collision for any reason, just fallback immediately.\n\tif (ir.meta[type.self].decoration.alias.empty() || block_namespace.find(buffer_name) != end(block_namespace) ||\n\t    resource_names.find(buffer_name) != end(resource_names))\n\t{\n\t\tbuffer_name = get_block_fallback_name(var.self);\n\t}\n\n\t// Make sure we get something unique for both global name scope and block name scope.\n\t// See GLSL 4.5 spec: section 4.3.9 for details.\n\tadd_variable(block_namespace, resource_names, buffer_name);\n\n\t// If for some reason buffer_name is an illegal name, make a final fallback to a workaround name.\n\t// This cannot conflict with anything else, so we're safe now.\n\t// We cannot reuse this fallback name in neither global scope (blocked by block_names) nor block name scope.\n\tif (buffer_name.empty())\n\t\tbuffer_name = join(\"_\", get<SPIRType>(var.basetype).self, \"_\", var.self);\n\n\tblock_names.insert(buffer_name);\n\tblock_namespace.insert(buffer_name);\n\n\t// Save for post-reflection later.\n\tdeclared_block_names[var.self] = buffer_name;\n\n\tstatement(layout_for_variable(var), is_coherent ? \"coherent \" : \"\", is_restrict ? \"restrict \" : \"\",\n\t          is_writeonly ? \"writeonly \" : \"\", is_readonly ? \"readonly \" : \"\", ssbo ? \"buffer \" : \"uniform \",\n\t          buffer_name);\n\n\tbegin_scope();\n\n\ttype.member_name_cache.clear();\n\n\tuint32_t i = 0;\n\tfor (auto &member : type.member_types)\n\t{\n\t\tadd_member_name(type, i);\n\t\temit_struct_member(type, member, i);\n\t\ti++;\n\t}\n\n\t// Don't declare empty blocks in GLSL, this is not allowed.\n\tif (type_is_empty(type) && !backend.supports_empty_struct)\n\t\tstatement(\"int empty_struct_member;\");\n\n\t// var.self can be used as a backup name for the block name,\n\t// so we need to make sure we don't disturb the name here on a recompile.\n\t// It will need to be reset if we have to recompile.\n\tpreserve_alias_on_reset(var.self);\n\tadd_resource_name(var.self);\n\tend_scope_decl(to_name(var.self) + type_to_array_glsl(type));\n\tstatement(\"\");\n}\n\nvoid CompilerGLSL::emit_buffer_block_flattened(const SPIRVariable &var)\n{\n\tauto &type = get<SPIRType>(var.basetype);\n\n\t// Block names should never alias.\n\tauto buffer_name = to_name(type.self, false);\n\tsize_t buffer_size = (get_declared_struct_size(type) + 15) / 16;\n\n\tSPIRType::BaseType basic_type;\n\tif (get_common_basic_type(type, basic_type))\n\t{\n\t\tSPIRType tmp { OpTypeVector };\n\t\ttmp.basetype = basic_type;\n\t\ttmp.vecsize = 4;\n\t\tif (basic_type != SPIRType::Float && basic_type != SPIRType::Int && basic_type != SPIRType::UInt)\n\t\t\tSPIRV_CROSS_THROW(\"Basic types in a flattened UBO must be float, int or uint.\");\n\n\t\tauto flags = ir.get_buffer_block_flags(var);\n\t\tstatement(\"uniform \", flags_to_qualifiers_glsl(tmp, flags), type_to_glsl(tmp), \" \", buffer_name, \"[\",\n\t\t          buffer_size, \"];\");\n\t}\n\telse\n\t\tSPIRV_CROSS_THROW(\"All basic types in a flattened block must be the same.\");\n}\n\nconst char *CompilerGLSL::to_storage_qualifiers_glsl(const SPIRVariable &var)\n{\n\tauto &execution = get_entry_point();\n\n\tif (subpass_input_is_framebuffer_fetch(var.self))\n\t\treturn \"\";\n\n\tif (var.storage == StorageClassInput || var.storage == StorageClassOutput)\n\t{\n\t\tif (is_legacy() && execution.model == ExecutionModelVertex)\n\t\t\treturn var.storage == StorageClassInput ? \"attribute \" : \"varying \";\n\t\telse if (is_legacy() && execution.model == ExecutionModelFragment)\n\t\t\treturn \"varying \"; // Fragment outputs are renamed so they never hit this case.\n\t\telse if (execution.model == ExecutionModelFragment && var.storage == StorageClassOutput)\n\t\t{\n\t\t\tuint32_t loc = get_decoration(var.self, DecorationLocation);\n\t\t\tbool is_inout = location_is_framebuffer_fetch(loc);\n\t\t\tif (is_inout)\n\t\t\t\treturn \"inout \";\n\t\t\telse\n\t\t\t\treturn \"out \";\n\t\t}\n\t\telse\n\t\t\treturn var.storage == StorageClassInput ? \"in \" : \"out \";\n\t}\n\telse if (var.storage == StorageClassUniformConstant || var.storage == StorageClassUniform ||\n\t         var.storage == StorageClassPushConstant)\n\t{\n\t\treturn \"uniform \";\n\t}\n\telse if (var.storage == StorageClassRayPayloadKHR)\n\t{\n\t\treturn ray_tracing_is_khr ? \"rayPayloadEXT \" : \"rayPayloadNV \";\n\t}\n\telse if (var.storage == StorageClassIncomingRayPayloadKHR)\n\t{\n\t\treturn ray_tracing_is_khr ? \"rayPayloadInEXT \" : \"rayPayloadInNV \";\n\t}\n\telse if (var.storage == StorageClassHitAttributeKHR)\n\t{\n\t\treturn ray_tracing_is_khr ? \"hitAttributeEXT \" : \"hitAttributeNV \";\n\t}\n\telse if (var.storage == StorageClassCallableDataKHR)\n\t{\n\t\treturn ray_tracing_is_khr ? \"callableDataEXT \" : \"callableDataNV \";\n\t}\n\telse if (var.storage == StorageClassIncomingCallableDataKHR)\n\t{\n\t\treturn ray_tracing_is_khr ? \"callableDataInEXT \" : \"callableDataInNV \";\n\t}\n\n\treturn \"\";\n}\n\nvoid CompilerGLSL::emit_flattened_io_block_member(const std::string &basename, const SPIRType &type, const char *qual,\n                                                  const SmallVector<uint32_t> &indices)\n{\n\tuint32_t member_type_id = type.self;\n\tconst SPIRType *member_type = &type;\n\tconst SPIRType *parent_type = nullptr;\n\tauto flattened_name = basename;\n\tfor (auto &index : indices)\n\t{\n\t\tflattened_name += \"_\";\n\t\tflattened_name += to_member_name(*member_type, index);\n\t\tparent_type = member_type;\n\t\tmember_type_id = member_type->member_types[index];\n\t\tmember_type = &get<SPIRType>(member_type_id);\n\t}\n\n\tassert(member_type->basetype != SPIRType::Struct);\n\n\t// We're overriding struct member names, so ensure we do so on the primary type.\n\tif (parent_type->type_alias)\n\t\tparent_type = &get<SPIRType>(parent_type->type_alias);\n\n\t// Sanitize underscores because joining the two identifiers might create more than 1 underscore in a row,\n\t// which is not allowed.\n\tParsedIR::sanitize_underscores(flattened_name);\n\n\tuint32_t last_index = indices.back();\n\n\t// Pass in the varying qualifier here so it will appear in the correct declaration order.\n\t// Replace member name while emitting it so it encodes both struct name and member name.\n\tauto backup_name = get_member_name(parent_type->self, last_index);\n\tauto member_name = to_member_name(*parent_type, last_index);\n\tset_member_name(parent_type->self, last_index, flattened_name);\n\temit_struct_member(*parent_type, member_type_id, last_index, qual);\n\t// Restore member name.\n\tset_member_name(parent_type->self, last_index, member_name);\n}\n\nvoid CompilerGLSL::emit_flattened_io_block_struct(const std::string &basename, const SPIRType &type, const char *qual,\n                                                  const SmallVector<uint32_t> &indices)\n{\n\tauto sub_indices = indices;\n\tsub_indices.push_back(0);\n\n\tconst SPIRType *member_type = &type;\n\tfor (auto &index : indices)\n\t\tmember_type = &get<SPIRType>(member_type->member_types[index]);\n\n\tassert(member_type->basetype == SPIRType::Struct);\n\n\tif (!member_type->array.empty())\n\t\tSPIRV_CROSS_THROW(\"Cannot flatten array of structs in I/O blocks.\");\n\n\tfor (uint32_t i = 0; i < uint32_t(member_type->member_types.size()); i++)\n\t{\n\t\tsub_indices.back() = i;\n\t\tif (get<SPIRType>(member_type->member_types[i]).basetype == SPIRType::Struct)\n\t\t\temit_flattened_io_block_struct(basename, type, qual, sub_indices);\n\t\telse\n\t\t\temit_flattened_io_block_member(basename, type, qual, sub_indices);\n\t}\n}\n\nvoid CompilerGLSL::emit_flattened_io_block(const SPIRVariable &var, const char *qual)\n{\n\tauto &var_type = get<SPIRType>(var.basetype);\n\tif (!var_type.array.empty())\n\t\tSPIRV_CROSS_THROW(\"Array of varying structs cannot be flattened to legacy-compatible varyings.\");\n\n\t// Emit flattened types based on the type alias. Normally, we are never supposed to emit\n\t// struct declarations for aliased types.\n\tauto &type = var_type.type_alias ? get<SPIRType>(var_type.type_alias) : var_type;\n\n\tauto old_flags = ir.meta[type.self].decoration.decoration_flags;\n\t// Emit the members as if they are part of a block to get all qualifiers.\n\tir.meta[type.self].decoration.decoration_flags.set(DecorationBlock);\n\n\ttype.member_name_cache.clear();\n\n\tSmallVector<uint32_t> member_indices;\n\tmember_indices.push_back(0);\n\tauto basename = to_name(var.self);\n\n\tuint32_t i = 0;\n\tfor (auto &member : type.member_types)\n\t{\n\t\tadd_member_name(type, i);\n\t\tauto &membertype = get<SPIRType>(member);\n\n\t\tmember_indices.back() = i;\n\t\tif (membertype.basetype == SPIRType::Struct)\n\t\t\temit_flattened_io_block_struct(basename, type, qual, member_indices);\n\t\telse\n\t\t\temit_flattened_io_block_member(basename, type, qual, member_indices);\n\t\ti++;\n\t}\n\n\tir.meta[type.self].decoration.decoration_flags = old_flags;\n\n\t// Treat this variable as fully flattened from now on.\n\tflattened_structs[var.self] = true;\n}\n\nvoid CompilerGLSL::emit_interface_block(const SPIRVariable &var)\n{\n\tauto &type = get<SPIRType>(var.basetype);\n\n\tif (var.storage == StorageClassInput && type.basetype == SPIRType::Double &&\n\t    !options.es && options.version < 410)\n\t{\n\t\trequire_extension_internal(\"GL_ARB_vertex_attrib_64bit\");\n\t}\n\n\t// Either make it plain in/out or in/out blocks depending on what shader is doing ...\n\tbool block = ir.meta[type.self].decoration.decoration_flags.get(DecorationBlock);\n\tconst char *qual = to_storage_qualifiers_glsl(var);\n\n\tif (block)\n\t{\n\t\t// ESSL earlier than 310 and GLSL earlier than 150 did not support\n\t\t// I/O variables which are struct types.\n\t\t// To support this, flatten the struct into separate varyings instead.\n\t\tif (options.force_flattened_io_blocks || (options.es && options.version < 310) ||\n\t\t    (!options.es && options.version < 150))\n\t\t{\n\t\t\t// I/O blocks on ES require version 310 with Android Extension Pack extensions, or core version 320.\n\t\t\t// On desktop, I/O blocks were introduced with geometry shaders in GL 3.2 (GLSL 150).\n\t\t\temit_flattened_io_block(var, qual);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (options.es && options.version < 320)\n\t\t\t{\n\t\t\t\t// Geometry and tessellation extensions imply this extension.\n\t\t\t\tif (!has_extension(\"GL_EXT_geometry_shader\") && !has_extension(\"GL_EXT_tessellation_shader\"))\n\t\t\t\t\trequire_extension_internal(\"GL_EXT_shader_io_blocks\");\n\t\t\t}\n\n\t\t\t// Workaround to make sure we can emit \"patch in/out\" correctly.\n\t\t\tfixup_io_block_patch_primitive_qualifiers(var);\n\n\t\t\t// Block names should never alias.\n\t\t\tauto block_name = to_name(type.self, false);\n\n\t\t\t// The namespace for I/O blocks is separate from other variables in GLSL.\n\t\t\tauto &block_namespace = type.storage == StorageClassInput ? block_input_names : block_output_names;\n\n\t\t\t// Shaders never use the block by interface name, so we don't\n\t\t\t// have to track this other than updating name caches.\n\t\t\tif (block_name.empty() || block_namespace.find(block_name) != end(block_namespace))\n\t\t\t\tblock_name = get_fallback_name(type.self);\n\t\t\telse\n\t\t\t\tblock_namespace.insert(block_name);\n\n\t\t\t// If for some reason buffer_name is an illegal name, make a final fallback to a workaround name.\n\t\t\t// This cannot conflict with anything else, so we're safe now.\n\t\t\tif (block_name.empty())\n\t\t\t\tblock_name = join(\"_\", get<SPIRType>(var.basetype).self, \"_\", var.self);\n\n\t\t\t// Instance names cannot alias block names.\n\t\t\tresource_names.insert(block_name);\n\n\t\t\tconst char *block_qualifier;\n\t\t\tif (has_decoration(var.self, DecorationPatch))\n\t\t\t\tblock_qualifier = \"patch \";\n\t\t\telse if (has_decoration(var.self, DecorationPerPrimitiveEXT))\n\t\t\t\tblock_qualifier = \"perprimitiveEXT \";\n\t\t\telse\n\t\t\t\tblock_qualifier = \"\";\n\n\t\t\tstatement(layout_for_variable(var), block_qualifier, qual, block_name);\n\t\t\tbegin_scope();\n\n\t\t\ttype.member_name_cache.clear();\n\n\t\t\tuint32_t i = 0;\n\t\t\tfor (auto &member : type.member_types)\n\t\t\t{\n\t\t\t\tadd_member_name(type, i);\n\t\t\t\temit_struct_member(type, member, i);\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t\tadd_resource_name(var.self);\n\t\t\tend_scope_decl(join(to_name(var.self), type_to_array_glsl(type)));\n\t\t\tstatement(\"\");\n\t\t}\n\t}\n\telse\n\t{\n\t\t// ESSL earlier than 310 and GLSL earlier than 150 did not support\n\t\t// I/O variables which are struct types.\n\t\t// To support this, flatten the struct into separate varyings instead.\n\t\tif (type.basetype == SPIRType::Struct &&\n\t\t    (options.force_flattened_io_blocks || (options.es && options.version < 310) ||\n\t\t     (!options.es && options.version < 150)))\n\t\t{\n\t\t\temit_flattened_io_block(var, qual);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tadd_resource_name(var.self);\n\n\t\t\t// Legacy GLSL did not support int attributes, we automatically\n\t\t\t// declare them as float and cast them on load/store\n\t\t\tSPIRType newtype = type;\n\t\t\tif (is_legacy() && var.storage == StorageClassInput && type.basetype == SPIRType::Int)\n\t\t\t\tnewtype.basetype = SPIRType::Float;\n\n\t\t\t// Tessellation control and evaluation shaders must have either\n\t\t\t// gl_MaxPatchVertices or unsized arrays for input arrays.\n\t\t\t// Opt for unsized as it's the more \"correct\" variant to use.\n\t\t\tif (type.storage == StorageClassInput && !type.array.empty() &&\n\t\t\t    !has_decoration(var.self, DecorationPatch) &&\n\t\t\t    (get_entry_point().model == ExecutionModelTessellationControl ||\n\t\t\t     get_entry_point().model == ExecutionModelTessellationEvaluation))\n\t\t\t{\n\t\t\t\tnewtype.array.back() = 0;\n\t\t\t\tnewtype.array_size_literal.back() = true;\n\t\t\t}\n\n\t\t\tstatement(layout_for_variable(var), to_qualifiers_glsl(var.self),\n\t\t\t          variable_decl(newtype, to_name(var.self), var.self), \";\");\n\t\t}\n\t}\n}\n\nvoid CompilerGLSL::emit_uniform(const SPIRVariable &var)\n{\n\tauto &type = get<SPIRType>(var.basetype);\n\tif (type.basetype == SPIRType::Image && type.image.sampled == 2 && type.image.dim != DimSubpassData)\n\t{\n\t\tif (!options.es && options.version < 420)\n\t\t\trequire_extension_internal(\"GL_ARB_shader_image_load_store\");\n\t\telse if (options.es && options.version < 310)\n\t\t\tSPIRV_CROSS_THROW(\"At least ESSL 3.10 required for shader image load store.\");\n\t}\n\n\tadd_resource_name(var.self);\n\tstatement(layout_for_variable(var), variable_decl(var), \";\");\n}\n\nstring CompilerGLSL::constant_value_macro_name(uint32_t id)\n{\n\treturn join(\"SPIRV_CROSS_CONSTANT_ID_\", id);\n}\n\nvoid CompilerGLSL::emit_specialization_constant_op(const SPIRConstantOp &constant)\n{\n\tauto &type = get<SPIRType>(constant.basetype);\n\t// This will break. It is bogus and should not be legal.\n\tif (type_is_top_level_block(type))\n\t\treturn;\n\tadd_resource_name(constant.self);\n\tauto name = to_name(constant.self);\n\tstatement(\"const \", variable_decl(type, name), \" = \", constant_op_expression(constant), \";\");\n}\n\nint CompilerGLSL::get_constant_mapping_to_workgroup_component(const SPIRConstant &c) const\n{\n\tauto &entry_point = get_entry_point();\n\tint index = -1;\n\n\t// Need to redirect specialization constants which are used as WorkGroupSize to the builtin,\n\t// since the spec constant declarations are never explicitly declared.\n\tif (entry_point.workgroup_size.constant == 0 && entry_point.flags.get(ExecutionModeLocalSizeId))\n\t{\n\t\tif (c.self == entry_point.workgroup_size.id_x)\n\t\t\tindex = 0;\n\t\telse if (c.self == entry_point.workgroup_size.id_y)\n\t\t\tindex = 1;\n\t\telse if (c.self == entry_point.workgroup_size.id_z)\n\t\t\tindex = 2;\n\t}\n\n\treturn index;\n}\n\nvoid CompilerGLSL::emit_constant(const SPIRConstant &constant)\n{\n\tauto &type = get<SPIRType>(constant.constant_type);\n\n\t// This will break. It is bogus and should not be legal.\n\tif (type_is_top_level_block(type))\n\t\treturn;\n\n\tSpecializationConstant wg_x, wg_y, wg_z;\n\tID workgroup_size_id = get_work_group_size_specialization_constants(wg_x, wg_y, wg_z);\n\n\t// This specialization constant is implicitly declared by emitting layout() in;\n\tif (constant.self == workgroup_size_id)\n\t\treturn;\n\n\t// These specialization constants are implicitly declared by emitting layout() in;\n\t// In legacy GLSL, we will still need to emit macros for these, so a layout() in; declaration\n\t// later can use macro overrides for work group size.\n\tbool is_workgroup_size_constant = ConstantID(constant.self) == wg_x.id || ConstantID(constant.self) == wg_y.id ||\n\t                                  ConstantID(constant.self) == wg_z.id;\n\n\tif (options.vulkan_semantics && is_workgroup_size_constant)\n\t{\n\t\t// Vulkan GLSL does not need to declare workgroup spec constants explicitly, it is handled in layout().\n\t\treturn;\n\t}\n\telse if (!options.vulkan_semantics && is_workgroup_size_constant &&\n\t         !has_decoration(constant.self, DecorationSpecId))\n\t{\n\t\t// Only bother declaring a workgroup size if it is actually a specialization constant, because we need macros.\n\t\treturn;\n\t}\n\n\tadd_resource_name(constant.self);\n\tauto name = to_name(constant.self);\n\n\t// Only scalars have constant IDs.\n\tif (has_decoration(constant.self, DecorationSpecId))\n\t{\n\t\tif (options.vulkan_semantics)\n\t\t{\n\t\t\tstatement(\"layout(constant_id = \", get_decoration(constant.self, DecorationSpecId), \") const \",\n\t\t\t          variable_decl(type, name), \" = \", constant_expression(constant), \";\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst string &macro_name = constant.specialization_constant_macro_name;\n\t\t\tstatement(\"#ifndef \", macro_name);\n\t\t\tstatement(\"#define \", macro_name, \" \", constant_expression(constant));\n\t\t\tstatement(\"#endif\");\n\n\t\t\t// For workgroup size constants, only emit the macros.\n\t\t\tif (!is_workgroup_size_constant)\n\t\t\t\tstatement(\"const \", variable_decl(type, name), \" = \", macro_name, \";\");\n\t\t}\n\t}\n\telse\n\t{\n\t\tstatement(\"const \", variable_decl(type, name), \" = \", constant_expression(constant), \";\");\n\t}\n}\n\nvoid CompilerGLSL::emit_entry_point_declarations()\n{\n}\n\nvoid CompilerGLSL::replace_illegal_names(const unordered_set<string> &keywords)\n{\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, const SPIRVariable &var) {\n\t\tif (is_hidden_variable(var))\n\t\t\treturn;\n\n\t\tauto *meta = ir.find_meta(var.self);\n\t\tif (!meta)\n\t\t\treturn;\n\n\t\tauto &m = meta->decoration;\n\t\tif (keywords.find(m.alias) != end(keywords))\n\t\t\tm.alias = join(\"_\", m.alias);\n\t});\n\n\tir.for_each_typed_id<SPIRFunction>([&](uint32_t, const SPIRFunction &func) {\n\t\tauto *meta = ir.find_meta(func.self);\n\t\tif (!meta)\n\t\t\treturn;\n\n\t\tauto &m = meta->decoration;\n\t\tif (keywords.find(m.alias) != end(keywords))\n\t\t\tm.alias = join(\"_\", m.alias);\n\t});\n\n\tir.for_each_typed_id<SPIRType>([&](uint32_t, const SPIRType &type) {\n\t\tauto *meta = ir.find_meta(type.self);\n\t\tif (!meta)\n\t\t\treturn;\n\n\t\tauto &m = meta->decoration;\n\t\tif (keywords.find(m.alias) != end(keywords))\n\t\t\tm.alias = join(\"_\", m.alias);\n\n\t\tfor (auto &memb : meta->members)\n\t\t\tif (keywords.find(memb.alias) != end(keywords))\n\t\t\t\tmemb.alias = join(\"_\", memb.alias);\n\t});\n}\n\nvoid CompilerGLSL::replace_illegal_names()\n{\n\t// clang-format off\n\tstatic const unordered_set<string> keywords = {\n\t\t\"abs\", \"acos\", \"acosh\", \"all\", \"any\", \"asin\", \"asinh\", \"atan\", \"atanh\",\n\t\t\"atomicAdd\", \"atomicCompSwap\", \"atomicCounter\", \"atomicCounterDecrement\", \"atomicCounterIncrement\",\n\t\t\"atomicExchange\", \"atomicMax\", \"atomicMin\", \"atomicOr\", \"atomicXor\",\n\t\t\"bitCount\", \"bitfieldExtract\", \"bitfieldInsert\", \"bitfieldReverse\",\n\t\t\"ceil\", \"cos\", \"cosh\", \"cross\", \"degrees\",\n\t\t\"dFdx\", \"dFdxCoarse\", \"dFdxFine\",\n\t\t\"dFdy\", \"dFdyCoarse\", \"dFdyFine\",\n\t\t\"distance\", \"dot\", \"EmitStreamVertex\", \"EmitVertex\", \"EndPrimitive\", \"EndStreamPrimitive\", \"equal\", \"exp\", \"exp2\",\n\t\t\"faceforward\", \"findLSB\", \"findMSB\", \"float16BitsToInt16\", \"float16BitsToUint16\", \"floatBitsToInt\", \"floatBitsToUint\", \"floor\", \"fma\", \"fract\",\n\t\t\"frexp\", \"fwidth\", \"fwidthCoarse\", \"fwidthFine\",\n\t\t\"greaterThan\", \"greaterThanEqual\", \"groupMemoryBarrier\",\n\t\t\"imageAtomicAdd\", \"imageAtomicAnd\", \"imageAtomicCompSwap\", \"imageAtomicExchange\", \"imageAtomicMax\", \"imageAtomicMin\", \"imageAtomicOr\", \"imageAtomicXor\",\n\t\t\"imageLoad\", \"imageSamples\", \"imageSize\", \"imageStore\", \"imulExtended\", \"int16BitsToFloat16\", \"intBitsToFloat\", \"interpolateAtOffset\", \"interpolateAtCentroid\", \"interpolateAtSample\",\n\t\t\"inverse\", \"inversesqrt\", \"isinf\", \"isnan\", \"ldexp\", \"length\", \"lessThan\", \"lessThanEqual\", \"log\", \"log2\",\n\t\t\"matrixCompMult\", \"max\", \"memoryBarrier\", \"memoryBarrierAtomicCounter\", \"memoryBarrierBuffer\", \"memoryBarrierImage\", \"memoryBarrierShared\",\n\t\t\"min\", \"mix\", \"mod\", \"modf\", \"noise\", \"noise1\", \"noise2\", \"noise3\", \"noise4\", \"normalize\", \"not\", \"notEqual\",\n\t\t\"outerProduct\", \"packDouble2x32\", \"packHalf2x16\", \"packInt2x16\", \"packInt4x16\", \"packSnorm2x16\", \"packSnorm4x8\",\n\t\t\"packUint2x16\", \"packUint4x16\", \"packUnorm2x16\", \"packUnorm4x8\", \"pow\",\n\t\t\"radians\", \"reflect\", \"refract\", \"round\", \"roundEven\", \"sign\", \"sin\", \"sinh\", \"smoothstep\", \"sqrt\", \"step\",\n\t\t\"tan\", \"tanh\", \"texelFetch\", \"texelFetchOffset\", \"texture\", \"textureGather\", \"textureGatherOffset\", \"textureGatherOffsets\",\n\t\t\"textureGrad\", \"textureGradOffset\", \"textureLod\", \"textureLodOffset\", \"textureOffset\", \"textureProj\", \"textureProjGrad\",\n\t\t\"textureProjGradOffset\", \"textureProjLod\", \"textureProjLodOffset\", \"textureProjOffset\", \"textureQueryLevels\", \"textureQueryLod\", \"textureSamples\", \"textureSize\",\n\t\t\"transpose\", \"trunc\", \"uaddCarry\", \"uint16BitsToFloat16\", \"uintBitsToFloat\", \"umulExtended\", \"unpackDouble2x32\", \"unpackHalf2x16\", \"unpackInt2x16\", \"unpackInt4x16\",\n\t\t\"unpackSnorm2x16\", \"unpackSnorm4x8\", \"unpackUint2x16\", \"unpackUint4x16\", \"unpackUnorm2x16\", \"unpackUnorm4x8\", \"usubBorrow\",\n\n\t\t\"active\", \"asm\", \"atomic_uint\", \"attribute\", \"bool\", \"break\", \"buffer\",\n\t\t\"bvec2\", \"bvec3\", \"bvec4\", \"case\", \"cast\", \"centroid\", \"class\", \"coherent\", \"common\", \"const\", \"continue\", \"default\", \"discard\",\n\t\t\"dmat2\", \"dmat2x2\", \"dmat2x3\", \"dmat2x4\", \"dmat3\", \"dmat3x2\", \"dmat3x3\", \"dmat3x4\", \"dmat4\", \"dmat4x2\", \"dmat4x3\", \"dmat4x4\",\n\t\t\"do\", \"double\", \"dvec2\", \"dvec3\", \"dvec4\", \"else\", \"enum\", \"extern\", \"external\", \"false\", \"filter\", \"fixed\", \"flat\", \"float\",\n\t\t\"for\", \"fvec2\", \"fvec3\", \"fvec4\", \"goto\", \"half\", \"highp\", \"hvec2\", \"hvec3\", \"hvec4\", \"if\", \"iimage1D\", \"iimage1DArray\",\n\t\t\"iimage2D\", \"iimage2DArray\", \"iimage2DMS\", \"iimage2DMSArray\", \"iimage2DRect\", \"iimage3D\", \"iimageBuffer\", \"iimageCube\",\n\t\t\"iimageCubeArray\", \"image1D\", \"image1DArray\", \"image2D\", \"image2DArray\", \"image2DMS\", \"image2DMSArray\", \"image2DRect\",\n\t\t\"image3D\", \"imageBuffer\", \"imageCube\", \"imageCubeArray\", \"in\", \"inline\", \"inout\", \"input\", \"int\", \"interface\", \"invariant\",\n\t\t\"isampler1D\", \"isampler1DArray\", \"isampler2D\", \"isampler2DArray\", \"isampler2DMS\", \"isampler2DMSArray\", \"isampler2DRect\",\n\t\t\"isampler3D\", \"isamplerBuffer\", \"isamplerCube\", \"isamplerCubeArray\", \"ivec2\", \"ivec3\", \"ivec4\", \"layout\", \"long\", \"lowp\",\n\t\t\"mat2\", \"mat2x2\", \"mat2x3\", \"mat2x4\", \"mat3\", \"mat3x2\", \"mat3x3\", \"mat3x4\", \"mat4\", \"mat4x2\", \"mat4x3\", \"mat4x4\", \"mediump\",\n\t\t\"namespace\", \"noinline\", \"noperspective\", \"out\", \"output\", \"packed\", \"partition\", \"patch\", \"precise\", \"precision\", \"public\", \"readonly\",\n\t\t\"resource\", \"restrict\", \"return\", \"sample\", \"sampler1D\", \"sampler1DArray\", \"sampler1DArrayShadow\",\n\t\t\"sampler1DShadow\", \"sampler2D\", \"sampler2DArray\", \"sampler2DArrayShadow\", \"sampler2DMS\", \"sampler2DMSArray\",\n\t\t\"sampler2DRect\", \"sampler2DRectShadow\", \"sampler2DShadow\", \"sampler3D\", \"sampler3DRect\", \"samplerBuffer\",\n\t\t\"samplerCube\", \"samplerCubeArray\", \"samplerCubeArrayShadow\", \"samplerCubeShadow\", \"shared\", \"short\", \"sizeof\", \"smooth\", \"static\",\n\t\t\"struct\", \"subroutine\", \"superp\", \"switch\", \"template\", \"this\", \"true\", \"typedef\", \"uimage1D\", \"uimage1DArray\", \"uimage2D\",\n\t\t\"uimage2DArray\", \"uimage2DMS\", \"uimage2DMSArray\", \"uimage2DRect\", \"uimage3D\", \"uimageBuffer\", \"uimageCube\",\n\t\t\"uimageCubeArray\", \"uint\", \"uniform\", \"union\", \"unsigned\", \"usampler1D\", \"usampler1DArray\", \"usampler2D\", \"usampler2DArray\",\n\t\t\"usampler2DMS\", \"usampler2DMSArray\", \"usampler2DRect\", \"usampler3D\", \"usamplerBuffer\", \"usamplerCube\",\n\t\t\"usamplerCubeArray\", \"using\", \"uvec2\", \"uvec3\", \"uvec4\", \"varying\", \"vec2\", \"vec3\", \"vec4\", \"void\", \"volatile\",\n\t\t\"while\", \"writeonly\",\n\t};\n\t// clang-format on\n\n\treplace_illegal_names(keywords);\n}\n\nvoid CompilerGLSL::replace_fragment_output(SPIRVariable &var)\n{\n\tauto &m = ir.meta[var.self].decoration;\n\tuint32_t location = 0;\n\tif (m.decoration_flags.get(DecorationLocation))\n\t\tlocation = m.location;\n\n\t// If our variable is arrayed, we must not emit the array part of this as the SPIR-V will\n\t// do the access chain part of this for us.\n\tauto &type = get<SPIRType>(var.basetype);\n\n\tif (type.array.empty())\n\t{\n\t\t// Redirect the write to a specific render target in legacy GLSL.\n\t\tm.alias = join(\"gl_FragData[\", location, \"]\");\n\n\t\tif (is_legacy_es() && location != 0)\n\t\t\trequire_extension_internal(\"GL_EXT_draw_buffers\");\n\t}\n\telse if (type.array.size() == 1)\n\t{\n\t\t// If location is non-zero, we probably have to add an offset.\n\t\t// This gets really tricky since we'd have to inject an offset in the access chain.\n\t\t// FIXME: This seems like an extremely odd-ball case, so it's probably fine to leave it like this for now.\n\t\tm.alias = \"gl_FragData\";\n\t\tif (location != 0)\n\t\t\tSPIRV_CROSS_THROW(\"Arrayed output variable used, but location is not 0. \"\n\t\t\t                  \"This is unimplemented in SPIRV-Cross.\");\n\n\t\tif (is_legacy_es())\n\t\t\trequire_extension_internal(\"GL_EXT_draw_buffers\");\n\t}\n\telse\n\t\tSPIRV_CROSS_THROW(\"Array-of-array output variable used. This cannot be implemented in legacy GLSL.\");\n\n\tvar.compat_builtin = true; // We don't want to declare this variable, but use the name as-is.\n}\n\nvoid CompilerGLSL::replace_fragment_outputs()\n{\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\tauto &type = this->get<SPIRType>(var.basetype);\n\n\t\tif (!is_builtin_variable(var) && !var.remapped_variable && type.pointer && var.storage == StorageClassOutput)\n\t\t\treplace_fragment_output(var);\n\t});\n}\n\nstring CompilerGLSL::remap_swizzle(const SPIRType &out_type, uint32_t input_components, const string &expr)\n{\n\tif (out_type.vecsize == input_components)\n\t\treturn expr;\n\telse if (input_components == 1 && !backend.can_swizzle_scalar)\n\t\treturn join(type_to_glsl(out_type), \"(\", expr, \")\");\n\telse\n\t{\n\t\t// FIXME: This will not work with packed expressions.\n\t\tauto e = enclose_expression(expr) + \".\";\n\t\t// Just clamp the swizzle index if we have more outputs than inputs.\n\t\tfor (uint32_t c = 0; c < out_type.vecsize; c++)\n\t\t\te += index_to_swizzle(min(c, input_components - 1));\n\t\tif (backend.swizzle_is_function && out_type.vecsize > 1)\n\t\t\te += \"()\";\n\n\t\tremove_duplicate_swizzle(e);\n\t\treturn e;\n\t}\n}\n\nvoid CompilerGLSL::emit_pls()\n{\n\tauto &execution = get_entry_point();\n\tif (execution.model != ExecutionModelFragment)\n\t\tSPIRV_CROSS_THROW(\"Pixel local storage only supported in fragment shaders.\");\n\n\tif (!options.es)\n\t\tSPIRV_CROSS_THROW(\"Pixel local storage only supported in OpenGL ES.\");\n\n\tif (options.version < 300)\n\t\tSPIRV_CROSS_THROW(\"Pixel local storage only supported in ESSL 3.0 and above.\");\n\n\tif (!pls_inputs.empty())\n\t{\n\t\tstatement(\"__pixel_local_inEXT _PLSIn\");\n\t\tbegin_scope();\n\t\tfor (auto &input : pls_inputs)\n\t\t\tstatement(pls_decl(input), \";\");\n\t\tend_scope_decl();\n\t\tstatement(\"\");\n\t}\n\n\tif (!pls_outputs.empty())\n\t{\n\t\tstatement(\"__pixel_local_outEXT _PLSOut\");\n\t\tbegin_scope();\n\t\tfor (auto &output : pls_outputs)\n\t\t\tstatement(pls_decl(output), \";\");\n\t\tend_scope_decl();\n\t\tstatement(\"\");\n\t}\n}\n\nvoid CompilerGLSL::fixup_image_load_store_access()\n{\n\tif (!options.enable_storage_image_qualifier_deduction)\n\t\treturn;\n\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t var, const SPIRVariable &) {\n\t\tauto &vartype = expression_type(var);\n\t\tif (vartype.basetype == SPIRType::Image && vartype.image.sampled == 2)\n\t\t{\n\t\t\t// Very old glslangValidator and HLSL compilers do not emit required qualifiers here.\n\t\t\t// Solve this by making the image access as restricted as possible and loosen up if we need to.\n\t\t\t// If any no-read/no-write flags are actually set, assume that the compiler knows what it's doing.\n\n\t\t\tif (!has_decoration(var, DecorationNonWritable) && !has_decoration(var, DecorationNonReadable))\n\t\t\t{\n\t\t\t\tset_decoration(var, DecorationNonWritable);\n\t\t\t\tset_decoration(var, DecorationNonReadable);\n\t\t\t}\n\t\t}\n\t});\n}\n\nstatic bool is_block_builtin(BuiltIn builtin)\n{\n\treturn builtin == BuiltInPosition || builtin == BuiltInPointSize || builtin == BuiltInClipDistance ||\n\t       builtin == BuiltInCullDistance;\n}\n\nbool CompilerGLSL::should_force_emit_builtin_block(StorageClass storage)\n{\n\t// If the builtin block uses XFB, we need to force explicit redeclaration of the builtin block.\n\n\tif (storage != StorageClassOutput)\n\t\treturn false;\n\tbool should_force = false;\n\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\tif (should_force)\n\t\t\treturn;\n\n\t\tauto &type = this->get<SPIRType>(var.basetype);\n\t\tbool block = has_decoration(type.self, DecorationBlock);\n\t\tif (var.storage == storage && block && is_builtin_variable(var))\n\t\t{\n\t\t\tuint32_t member_count = uint32_t(type.member_types.size());\n\t\t\tfor (uint32_t i = 0; i < member_count; i++)\n\t\t\t{\n\t\t\t\tif (has_member_decoration(type.self, i, DecorationBuiltIn) &&\n\t\t\t\t    is_block_builtin(BuiltIn(get_member_decoration(type.self, i, DecorationBuiltIn))) &&\n\t\t\t\t    has_member_decoration(type.self, i, DecorationOffset))\n\t\t\t\t{\n\t\t\t\t\tshould_force = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (var.storage == storage && !block && is_builtin_variable(var))\n\t\t{\n\t\t\tif (is_block_builtin(BuiltIn(get_decoration(type.self, DecorationBuiltIn))) &&\n\t\t\t    has_decoration(var.self, DecorationOffset))\n\t\t\t{\n\t\t\t\tshould_force = true;\n\t\t\t}\n\t\t}\n\t});\n\n\t// If we're declaring clip/cull planes with control points we need to force block declaration.\n\tif ((get_execution_model() == ExecutionModelTessellationControl ||\n\t     get_execution_model() == ExecutionModelMeshEXT) &&\n\t    (clip_distance_count || cull_distance_count))\n\t{\n\t\tshould_force = true;\n\t}\n\n\t// Either glslang bug or oversight, but global invariant position does not work in mesh shaders.\n\tif (get_execution_model() == ExecutionModelMeshEXT && position_invariant)\n\t\tshould_force = true;\n\n\treturn should_force;\n}\n\nvoid CompilerGLSL::fixup_implicit_builtin_block_names(ExecutionModel model)\n{\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\tauto &type = this->get<SPIRType>(var.basetype);\n\t\tbool block = has_decoration(type.self, DecorationBlock);\n\t\tif ((var.storage == StorageClassOutput || var.storage == StorageClassInput) && block &&\n\t\t    is_builtin_variable(var))\n\t\t{\n\t\t\tif (model != ExecutionModelMeshEXT)\n\t\t\t{\n\t\t\t\t// Make sure the array has a supported name in the code.\n\t\t\t\tif (var.storage == StorageClassOutput)\n\t\t\t\t\tset_name(var.self, \"gl_out\");\n\t\t\t\telse if (var.storage == StorageClassInput)\n\t\t\t\t\tset_name(var.self, \"gl_in\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tauto flags = get_buffer_block_flags(var.self);\n\t\t\t\tif (flags.get(DecorationPerPrimitiveEXT))\n\t\t\t\t{\n\t\t\t\t\tset_name(var.self, \"gl_MeshPrimitivesEXT\");\n\t\t\t\t\tset_name(type.self, \"gl_MeshPerPrimitiveEXT\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tset_name(var.self, \"gl_MeshVerticesEXT\");\n\t\t\t\t\tset_name(type.self, \"gl_MeshPerVertexEXT\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (model == ExecutionModelMeshEXT && var.storage == StorageClassOutput && !block)\n\t\t{\n\t\t\tauto *m = ir.find_meta(var.self);\n\t\t\tif (m && m->decoration.builtin)\n\t\t\t{\n\t\t\t\tauto builtin_type = m->decoration.builtin_type;\n\t\t\t\tif (builtin_type == BuiltInPrimitivePointIndicesEXT)\n\t\t\t\t\tset_name(var.self, \"gl_PrimitivePointIndicesEXT\");\n\t\t\t\telse if (builtin_type == BuiltInPrimitiveLineIndicesEXT)\n\t\t\t\t\tset_name(var.self, \"gl_PrimitiveLineIndicesEXT\");\n\t\t\t\telse if (builtin_type == BuiltInPrimitiveTriangleIndicesEXT)\n\t\t\t\t\tset_name(var.self, \"gl_PrimitiveTriangleIndicesEXT\");\n\t\t\t}\n\t\t}\n\t});\n}\n\nvoid CompilerGLSL::emit_declared_builtin_block(StorageClass storage, ExecutionModel model)\n{\n\tBitset emitted_builtins;\n\tBitset global_builtins;\n\tconst SPIRVariable *block_var = nullptr;\n\tbool emitted_block = false;\n\n\t// Need to use declared size in the type.\n\t// These variables might have been declared, but not statically used, so we haven't deduced their size yet.\n\tuint32_t cull_distance_size = 0;\n\tuint32_t clip_distance_size = 0;\n\n\tbool have_xfb_buffer_stride = false;\n\tbool have_geom_stream = false;\n\tbool have_any_xfb_offset = false;\n\tuint32_t xfb_stride = 0, xfb_buffer = 0, geom_stream = 0;\n\tstd::unordered_map<uint32_t, uint32_t> builtin_xfb_offsets;\n\n\tconst auto builtin_is_per_vertex_set = [](BuiltIn builtin) -> bool {\n\t\treturn builtin == BuiltInPosition || builtin == BuiltInPointSize ||\n\t\t\tbuiltin == BuiltInClipDistance || builtin == BuiltInCullDistance;\n\t};\n\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\tauto &type = this->get<SPIRType>(var.basetype);\n\t\tbool block = has_decoration(type.self, DecorationBlock);\n\t\tBitset builtins;\n\n\t\tif (var.storage == storage && block && is_builtin_variable(var))\n\t\t{\n\t\t\tuint32_t index = 0;\n\t\t\tfor (auto &m : ir.meta[type.self].members)\n\t\t\t{\n\t\t\t\tif (m.builtin && builtin_is_per_vertex_set(m.builtin_type))\n\t\t\t\t{\n\t\t\t\t\tbuiltins.set(m.builtin_type);\n\t\t\t\t\tif (m.builtin_type == BuiltInCullDistance)\n\t\t\t\t\t\tcull_distance_size = to_array_size_literal(this->get<SPIRType>(type.member_types[index]));\n\t\t\t\t\telse if (m.builtin_type == BuiltInClipDistance)\n\t\t\t\t\t\tclip_distance_size = to_array_size_literal(this->get<SPIRType>(type.member_types[index]));\n\n\t\t\t\t\tif (is_block_builtin(m.builtin_type) && m.decoration_flags.get(DecorationOffset))\n\t\t\t\t\t{\n\t\t\t\t\t\thave_any_xfb_offset = true;\n\t\t\t\t\t\tbuiltin_xfb_offsets[m.builtin_type] = m.offset;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (is_block_builtin(m.builtin_type) && m.decoration_flags.get(DecorationStream))\n\t\t\t\t\t{\n\t\t\t\t\t\tuint32_t stream = m.stream;\n\t\t\t\t\t\tif (have_geom_stream && geom_stream != stream)\n\t\t\t\t\t\t\tSPIRV_CROSS_THROW(\"IO block member Stream mismatch.\");\n\t\t\t\t\t\thave_geom_stream = true;\n\t\t\t\t\t\tgeom_stream = stream;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t}\n\n\t\t\tif (storage == StorageClassOutput && has_decoration(var.self, DecorationXfbBuffer) &&\n\t\t\t    has_decoration(var.self, DecorationXfbStride))\n\t\t\t{\n\t\t\t\tuint32_t buffer_index = get_decoration(var.self, DecorationXfbBuffer);\n\t\t\t\tuint32_t stride = get_decoration(var.self, DecorationXfbStride);\n\t\t\t\tif (have_xfb_buffer_stride && buffer_index != xfb_buffer)\n\t\t\t\t\tSPIRV_CROSS_THROW(\"IO block member XfbBuffer mismatch.\");\n\t\t\t\tif (have_xfb_buffer_stride && stride != xfb_stride)\n\t\t\t\t\tSPIRV_CROSS_THROW(\"IO block member XfbBuffer mismatch.\");\n\t\t\t\thave_xfb_buffer_stride = true;\n\t\t\t\txfb_buffer = buffer_index;\n\t\t\t\txfb_stride = stride;\n\t\t\t}\n\n\t\t\tif (storage == StorageClassOutput && has_decoration(var.self, DecorationStream))\n\t\t\t{\n\t\t\t\tuint32_t stream = get_decoration(var.self, DecorationStream);\n\t\t\t\tif (have_geom_stream && geom_stream != stream)\n\t\t\t\t\tSPIRV_CROSS_THROW(\"IO block member Stream mismatch.\");\n\t\t\t\thave_geom_stream = true;\n\t\t\t\tgeom_stream = stream;\n\t\t\t}\n\t\t}\n\t\telse if (var.storage == storage && !block && is_builtin_variable(var))\n\t\t{\n\t\t\t// While we're at it, collect all declared global builtins (HLSL mostly ...).\n\t\t\tauto &m = ir.meta[var.self].decoration;\n\t\t\tif (m.builtin && builtin_is_per_vertex_set(m.builtin_type))\n\t\t\t{\n\t\t\t\t// For mesh/tesc output, Clip/Cull is an array-of-array. Look at innermost array type\n\t\t\t\t// for correct result.\n\t\t\t\tglobal_builtins.set(m.builtin_type);\n\t\t\t\tif (m.builtin_type == BuiltInCullDistance)\n\t\t\t\t\tcull_distance_size = to_array_size_literal(type, 0);\n\t\t\t\telse if (m.builtin_type == BuiltInClipDistance)\n\t\t\t\t\tclip_distance_size = to_array_size_literal(type, 0);\n\n\t\t\t\tif (is_block_builtin(m.builtin_type) && m.decoration_flags.get(DecorationXfbStride) &&\n\t\t\t\t    m.decoration_flags.get(DecorationXfbBuffer) && m.decoration_flags.get(DecorationOffset))\n\t\t\t\t{\n\t\t\t\t\thave_any_xfb_offset = true;\n\t\t\t\t\tbuiltin_xfb_offsets[m.builtin_type] = m.offset;\n\t\t\t\t\tuint32_t buffer_index = m.xfb_buffer;\n\t\t\t\t\tuint32_t stride = m.xfb_stride;\n\t\t\t\t\tif (have_xfb_buffer_stride && buffer_index != xfb_buffer)\n\t\t\t\t\t\tSPIRV_CROSS_THROW(\"IO block member XfbBuffer mismatch.\");\n\t\t\t\t\tif (have_xfb_buffer_stride && stride != xfb_stride)\n\t\t\t\t\t\tSPIRV_CROSS_THROW(\"IO block member XfbBuffer mismatch.\");\n\t\t\t\t\thave_xfb_buffer_stride = true;\n\t\t\t\t\txfb_buffer = buffer_index;\n\t\t\t\t\txfb_stride = stride;\n\t\t\t\t}\n\n\t\t\t\tif (is_block_builtin(m.builtin_type) && m.decoration_flags.get(DecorationStream))\n\t\t\t\t{\n\t\t\t\t\tuint32_t stream = get_decoration(var.self, DecorationStream);\n\t\t\t\t\tif (have_geom_stream && geom_stream != stream)\n\t\t\t\t\t\tSPIRV_CROSS_THROW(\"IO block member Stream mismatch.\");\n\t\t\t\t\thave_geom_stream = true;\n\t\t\t\t\tgeom_stream = stream;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (builtins.empty())\n\t\t\treturn;\n\n\t\tif (emitted_block)\n\t\t\tSPIRV_CROSS_THROW(\"Cannot use more than one builtin I/O block.\");\n\n\t\temitted_builtins = builtins;\n\t\temitted_block = true;\n\t\tblock_var = &var;\n\t});\n\n\tglobal_builtins =\n\t    Bitset(global_builtins.get_lower() & ((1ull << BuiltInPosition) | (1ull << BuiltInPointSize) |\n\t                                          (1ull << BuiltInClipDistance) | (1ull << BuiltInCullDistance)));\n\n\t// Try to collect all other declared builtins.\n\tif (!emitted_block)\n\t\temitted_builtins = global_builtins;\n\n\t// Can't declare an empty interface block.\n\tif (emitted_builtins.empty())\n\t\treturn;\n\n\tif (storage == StorageClassOutput)\n\t{\n\t\tSmallVector<string> attr;\n\t\tif (have_xfb_buffer_stride && have_any_xfb_offset)\n\t\t{\n\t\t\tif (!options.es)\n\t\t\t{\n\t\t\t\tif (options.version < 440 && options.version >= 140)\n\t\t\t\t\trequire_extension_internal(\"GL_ARB_enhanced_layouts\");\n\t\t\t\telse if (options.version < 140)\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Component decoration is not supported in targets below GLSL 1.40.\");\n\t\t\t\tif (!options.es && options.version < 440)\n\t\t\t\t\trequire_extension_internal(\"GL_ARB_enhanced_layouts\");\n\t\t\t}\n\t\t\telse if (options.es)\n\t\t\t\tSPIRV_CROSS_THROW(\"Need GL_ARB_enhanced_layouts for xfb_stride or xfb_buffer.\");\n\t\t\tattr.push_back(join(\"xfb_buffer = \", xfb_buffer, \", xfb_stride = \", xfb_stride));\n\t\t}\n\n\t\tif (have_geom_stream)\n\t\t{\n\t\t\tif (get_execution_model() != ExecutionModelGeometry)\n\t\t\t\tSPIRV_CROSS_THROW(\"Geometry streams can only be used in geometry shaders.\");\n\t\t\tif (options.es)\n\t\t\t\tSPIRV_CROSS_THROW(\"Multiple geometry streams not supported in ESSL.\");\n\t\t\tif (options.version < 400)\n\t\t\t\trequire_extension_internal(\"GL_ARB_transform_feedback3\");\n\t\t\tattr.push_back(join(\"stream = \", geom_stream));\n\t\t}\n\n\t\tif (model == ExecutionModelMeshEXT)\n\t\t\tstatement(\"out gl_MeshPerVertexEXT\");\n\t\telse if (!attr.empty())\n\t\t\tstatement(\"layout(\", merge(attr), \") out gl_PerVertex\");\n\t\telse\n\t\t\tstatement(\"out gl_PerVertex\");\n\t}\n\telse\n\t{\n\t\t// If we have passthrough, there is no way PerVertex cannot be passthrough.\n\t\tif (get_entry_point().geometry_passthrough)\n\t\t\tstatement(\"layout(passthrough) in gl_PerVertex\");\n\t\telse\n\t\t\tstatement(\"in gl_PerVertex\");\n\t}\n\n\tbegin_scope();\n\tif (emitted_builtins.get(BuiltInPosition))\n\t{\n\t\tauto itr = builtin_xfb_offsets.find(BuiltInPosition);\n\t\tif (itr != end(builtin_xfb_offsets))\n\t\t\tstatement(\"layout(xfb_offset = \", itr->second, \") vec4 gl_Position;\");\n\t\telse if (position_invariant)\n\t\t\tstatement(\"invariant vec4 gl_Position;\");\n\t\telse\n\t\t\tstatement(\"vec4 gl_Position;\");\n\t}\n\n\tif (emitted_builtins.get(BuiltInPointSize))\n\t{\n\t\tauto itr = builtin_xfb_offsets.find(BuiltInPointSize);\n\t\tif (itr != end(builtin_xfb_offsets))\n\t\t\tstatement(\"layout(xfb_offset = \", itr->second, \") float gl_PointSize;\");\n\t\telse\n\t\t\tstatement(\"float gl_PointSize;\");\n\t}\n\n\tif (emitted_builtins.get(BuiltInClipDistance))\n\t{\n\t\tauto itr = builtin_xfb_offsets.find(BuiltInClipDistance);\n\t\tif (itr != end(builtin_xfb_offsets))\n\t\t\tstatement(\"layout(xfb_offset = \", itr->second, \") float gl_ClipDistance[\", clip_distance_size, \"];\");\n\t\telse\n\t\t\tstatement(\"float gl_ClipDistance[\", clip_distance_size, \"];\");\n\t}\n\n\tif (emitted_builtins.get(BuiltInCullDistance))\n\t{\n\t\tauto itr = builtin_xfb_offsets.find(BuiltInCullDistance);\n\t\tif (itr != end(builtin_xfb_offsets))\n\t\t\tstatement(\"layout(xfb_offset = \", itr->second, \") float gl_CullDistance[\", cull_distance_size, \"];\");\n\t\telse\n\t\t\tstatement(\"float gl_CullDistance[\", cull_distance_size, \"];\");\n\t}\n\n\tbool builtin_array = model == ExecutionModelTessellationControl ||\n\t                     (model == ExecutionModelMeshEXT && storage == StorageClassOutput) ||\n\t                     (model == ExecutionModelGeometry && storage == StorageClassInput) ||\n\t                     (model == ExecutionModelTessellationEvaluation && storage == StorageClassInput);\n\n\tif (builtin_array)\n\t{\n\t\tconst char *instance_name;\n\t\tif (model == ExecutionModelMeshEXT)\n\t\t\tinstance_name = \"gl_MeshVerticesEXT\"; // Per primitive is never synthesized.\n\t\telse\n\t\t\tinstance_name = storage == StorageClassInput ? \"gl_in\" : \"gl_out\";\n\n\t\tif (model == ExecutionModelTessellationControl && storage == StorageClassOutput)\n\t\t\tend_scope_decl(join(instance_name, \"[\", get_entry_point().output_vertices, \"]\"));\n\t\telse\n\t\t\tend_scope_decl(join(instance_name, \"[]\"));\n\t}\n\telse\n\t\tend_scope_decl();\n\tstatement(\"\");\n}\n\nbool CompilerGLSL::variable_is_lut(const SPIRVariable &var) const\n{\n\tbool statically_assigned = var.statically_assigned && var.static_expression != ID(0) && var.remapped_variable;\n\n\tif (statically_assigned)\n\t{\n\t\tauto *constant = maybe_get<SPIRConstant>(var.static_expression);\n\t\tif (constant && constant->is_used_as_lut)\n\t\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nvoid CompilerGLSL::emit_resources()\n{\n\tauto &execution = get_entry_point();\n\n\treplace_illegal_names();\n\n\t// Legacy GL uses gl_FragData[], redeclare all fragment outputs\n\t// with builtins.\n\tif (execution.model == ExecutionModelFragment && is_legacy())\n\t\treplace_fragment_outputs();\n\n\t// Emit PLS blocks if we have such variables.\n\tif (!pls_inputs.empty() || !pls_outputs.empty())\n\t\temit_pls();\n\n\tswitch (execution.model)\n\t{\n\tcase ExecutionModelGeometry:\n\tcase ExecutionModelTessellationControl:\n\tcase ExecutionModelTessellationEvaluation:\n\tcase ExecutionModelMeshEXT:\n\t\tfixup_implicit_builtin_block_names(execution.model);\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\tbool global_invariant_position = position_invariant && (options.es || options.version >= 120);\n\n\t// Emit custom gl_PerVertex for SSO compatibility.\n\tif (options.separate_shader_objects && !options.es && execution.model != ExecutionModelFragment)\n\t{\n\t\tswitch (execution.model)\n\t\t{\n\t\tcase ExecutionModelGeometry:\n\t\tcase ExecutionModelTessellationControl:\n\t\tcase ExecutionModelTessellationEvaluation:\n\t\t\temit_declared_builtin_block(StorageClassInput, execution.model);\n\t\t\temit_declared_builtin_block(StorageClassOutput, execution.model);\n\t\t\tglobal_invariant_position = false;\n\t\t\tbreak;\n\n\t\tcase ExecutionModelVertex:\n\t\tcase ExecutionModelMeshEXT:\n\t\t\temit_declared_builtin_block(StorageClassOutput, execution.model);\n\t\t\tglobal_invariant_position = false;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\telse if (should_force_emit_builtin_block(StorageClassOutput))\n\t{\n\t\temit_declared_builtin_block(StorageClassOutput, execution.model);\n\t\tglobal_invariant_position = false;\n\t}\n\telse if (execution.geometry_passthrough)\n\t{\n\t\t// Need to declare gl_in with Passthrough.\n\t\t// If we're doing passthrough, we cannot emit an output block, so the output block test above will never pass.\n\t\temit_declared_builtin_block(StorageClassInput, execution.model);\n\t}\n\telse\n\t{\n\t\t// Need to redeclare clip/cull distance with explicit size to use them.\n\t\t// SPIR-V mandates these builtins have a size declared.\n\t\tconst char *storage = execution.model == ExecutionModelFragment ? \"in\" : \"out\";\n\t\tif (clip_distance_count != 0)\n\t\t\tstatement(storage, \" float gl_ClipDistance[\", clip_distance_count, \"];\");\n\t\tif (cull_distance_count != 0)\n\t\t\tstatement(storage, \" float gl_CullDistance[\", cull_distance_count, \"];\");\n\t\tif (clip_distance_count != 0 || cull_distance_count != 0)\n\t\t\tstatement(\"\");\n\t}\n\n\tif (global_invariant_position)\n\t{\n\t\tstatement(\"invariant gl_Position;\");\n\t\tstatement(\"\");\n\t}\n\n\tbool emitted = false;\n\n\t// If emitted Vulkan GLSL,\n\t// emit specialization constants as actual floats,\n\t// spec op expressions will redirect to the constant name.\n\t//\n\t{\n\t\tauto loop_lock = ir.create_loop_hard_lock();\n\t\tfor (auto &id_ : ir.ids_for_constant_undef_or_type)\n\t\t{\n\t\t\tauto &id = ir.ids[id_];\n\n\t\t\t// Skip declaring any bogus constants or undefs which use block types.\n\t\t\t// We don't declare block types directly, so this will never work.\n\t\t\t// Should not be legal SPIR-V, so this is considered a workaround.\n\n\t\t\tif (id.get_type() == TypeConstant)\n\t\t\t{\n\t\t\t\tauto &c = id.get<SPIRConstant>();\n\n\t\t\t\tbool needs_declaration = c.specialization || c.is_used_as_lut;\n\n\t\t\t\tif (needs_declaration)\n\t\t\t\t{\n\t\t\t\t\tif (!options.vulkan_semantics && c.specialization)\n\t\t\t\t\t{\n\t\t\t\t\t\tc.specialization_constant_macro_name =\n\t\t\t\t\t\t    constant_value_macro_name(get_decoration(c.self, DecorationSpecId));\n\t\t\t\t\t}\n\t\t\t\t\temit_constant(c);\n\t\t\t\t\temitted = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (id.get_type() == TypeConstantOp)\n\t\t\t{\n\t\t\t\temit_specialization_constant_op(id.get<SPIRConstantOp>());\n\t\t\t\temitted = true;\n\t\t\t}\n\t\t\telse if (id.get_type() == TypeType)\n\t\t\t{\n\t\t\t\tauto *type = &id.get<SPIRType>();\n\n\t\t\t\tbool is_natural_struct = type->basetype == SPIRType::Struct && type->array.empty() && !type->pointer &&\n\t\t\t\t                         (!has_decoration(type->self, DecorationBlock) &&\n\t\t\t\t                          !has_decoration(type->self, DecorationBufferBlock));\n\n\t\t\t\t// Special case, ray payload and hit attribute blocks are not really blocks, just regular structs.\n\t\t\t\tif (type->basetype == SPIRType::Struct && type->pointer &&\n\t\t\t\t    has_decoration(type->self, DecorationBlock) &&\n\t\t\t\t    (type->storage == StorageClassRayPayloadKHR || type->storage == StorageClassIncomingRayPayloadKHR ||\n\t\t\t\t     type->storage == StorageClassHitAttributeKHR))\n\t\t\t\t{\n\t\t\t\t\ttype = &get<SPIRType>(type->parent_type);\n\t\t\t\t\tis_natural_struct = true;\n\t\t\t\t}\n\n\t\t\t\tif (is_natural_struct)\n\t\t\t\t{\n\t\t\t\t\tif (emitted)\n\t\t\t\t\t\tstatement(\"\");\n\t\t\t\t\temitted = false;\n\n\t\t\t\t\temit_struct(*type);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (id.get_type() == TypeUndef)\n\t\t\t{\n\t\t\t\tauto &undef = id.get<SPIRUndef>();\n\t\t\t\tauto &type = this->get<SPIRType>(undef.basetype);\n\t\t\t\t// OpUndef can be void for some reason ...\n\t\t\t\tif (type.basetype == SPIRType::Void)\n\t\t\t\t\treturn;\n\n\t\t\t\t// This will break. It is bogus and should not be legal.\n\t\t\t\tif (type_is_top_level_block(type))\n\t\t\t\t\treturn;\n\n\t\t\t\tstring initializer;\n\t\t\t\tif (options.force_zero_initialized_variables && type_can_zero_initialize(type))\n\t\t\t\t\tinitializer = join(\" = \", to_zero_initialized_expression(undef.basetype));\n\n\t\t\t\t// FIXME: If used in a constant, we must declare it as one.\n\t\t\t\tstatement(variable_decl(type, to_name(undef.self), undef.self), initializer, \";\");\n\t\t\t\temitted = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (emitted)\n\t\tstatement(\"\");\n\n\t// If we needed to declare work group size late, check here.\n\t// If the work group size depends on a specialization constant, we need to declare the layout() block\n\t// after constants (and their macros) have been declared.\n\tif (execution.model == ExecutionModelGLCompute && !options.vulkan_semantics &&\n\t    (execution.workgroup_size.constant != 0 || execution.flags.get(ExecutionModeLocalSizeId)))\n\t{\n\t\tSpecializationConstant wg_x, wg_y, wg_z;\n\t\tget_work_group_size_specialization_constants(wg_x, wg_y, wg_z);\n\n\t\tif ((wg_x.id != ConstantID(0)) || (wg_y.id != ConstantID(0)) || (wg_z.id != ConstantID(0)))\n\t\t{\n\t\t\tSmallVector<string> inputs;\n\t\t\tbuild_workgroup_size(inputs, wg_x, wg_y, wg_z);\n\t\t\tstatement(\"layout(\", merge(inputs), \") in;\");\n\t\t\tstatement(\"\");\n\t\t}\n\t}\n\n\temitted = false;\n\n\tif (ir.addressing_model == AddressingModelPhysicalStorageBuffer64EXT)\n\t{\n\t\tfor (auto type : physical_storage_non_block_pointer_types)\n\t\t{\n\t\t\temit_buffer_reference_block(type, false);\n\t\t}\n\n\t\t// Output buffer reference blocks.\n\t\t// Do this in two stages, one with forward declaration,\n\t\t// and one without. Buffer reference blocks can reference themselves\n\t\t// to support things like linked lists.\n\t\tir.for_each_typed_id<SPIRType>([&](uint32_t self, SPIRType &type) {\n\t\t\tif (type.basetype == SPIRType::Struct && type.pointer &&\n\t\t\t    type.pointer_depth == 1 && !type_is_array_of_pointers(type) &&\n\t\t\t    type.storage == StorageClassPhysicalStorageBufferEXT)\n\t\t\t{\n\t\t\t\temit_buffer_reference_block(self, true);\n\t\t\t}\n\t\t});\n\n\t\tir.for_each_typed_id<SPIRType>([&](uint32_t self, SPIRType &type) {\n\t\t\tif (type.basetype == SPIRType::Struct &&\n\t\t\t    type.pointer && type.pointer_depth == 1 && !type_is_array_of_pointers(type) &&\n\t\t\t    type.storage == StorageClassPhysicalStorageBufferEXT)\n\t\t\t{\n\t\t\t\temit_buffer_reference_block(self, false);\n\t\t\t}\n\t\t});\n\t}\n\n\t// Output UBOs and SSBOs\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\tauto &type = this->get<SPIRType>(var.basetype);\n\n\t\tbool is_block_storage = type.storage == StorageClassStorageBuffer || type.storage == StorageClassUniform ||\n\t\t                        type.storage == StorageClassShaderRecordBufferKHR;\n\t\tbool has_block_flags = ir.meta[type.self].decoration.decoration_flags.get(DecorationBlock) ||\n\t\t                       ir.meta[type.self].decoration.decoration_flags.get(DecorationBufferBlock);\n\n\t\tif (var.storage != StorageClassFunction && type.pointer && is_block_storage && !is_hidden_variable(var) &&\n\t\t    has_block_flags)\n\t\t{\n\t\t\temit_buffer_block(var);\n\t\t}\n\t});\n\n\t// Output push constant blocks\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\tauto &type = this->get<SPIRType>(var.basetype);\n\t\tif (var.storage != StorageClassFunction && type.pointer && type.storage == StorageClassPushConstant &&\n\t\t    !is_hidden_variable(var))\n\t\t{\n\t\t\temit_push_constant_block(var);\n\t\t}\n\t});\n\n\tbool skip_separate_image_sampler = !combined_image_samplers.empty() || !options.vulkan_semantics;\n\n\t// Output Uniform Constants (values, samplers, images, etc).\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\tauto &type = this->get<SPIRType>(var.basetype);\n\n\t\t// If we're remapping separate samplers and images, only emit the combined samplers.\n\t\tif (skip_separate_image_sampler)\n\t\t{\n\t\t\t// Sampler buffers are always used without a sampler, and they will also work in regular GL.\n\t\t\tbool sampler_buffer = type.basetype == SPIRType::Image && type.image.dim == DimBuffer;\n\t\t\tbool separate_image = type.basetype == SPIRType::Image && type.image.sampled == 1;\n\t\t\tbool separate_sampler = type.basetype == SPIRType::Sampler;\n\t\t\tif (!sampler_buffer && (separate_image || separate_sampler))\n\t\t\t\treturn;\n\t\t}\n\n\t\tif (var.storage != StorageClassFunction && type.pointer &&\n\t\t    (type.storage == StorageClassUniformConstant || type.storage == StorageClassAtomicCounter ||\n\t\t     type.storage == StorageClassRayPayloadKHR || type.storage == StorageClassIncomingRayPayloadKHR ||\n\t\t     type.storage == StorageClassCallableDataKHR || type.storage == StorageClassIncomingCallableDataKHR ||\n\t\t     type.storage == StorageClassHitAttributeKHR) &&\n\t\t    !is_hidden_variable(var))\n\t\t{\n\t\t\temit_uniform(var);\n\t\t\temitted = true;\n\t\t}\n\t});\n\n\tif (emitted)\n\t\tstatement(\"\");\n\temitted = false;\n\n\tbool emitted_base_instance = false;\n\n\t// Output in/out interfaces.\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\tauto &type = this->get<SPIRType>(var.basetype);\n\n\t\tbool is_hidden = is_hidden_variable(var);\n\n\t\t// Unused output I/O variables might still be required to implement framebuffer fetch.\n\t\tif (var.storage == StorageClassOutput && !is_legacy() &&\n\t\t    location_is_framebuffer_fetch(get_decoration(var.self, DecorationLocation)) != 0)\n\t\t{\n\t\t\tis_hidden = false;\n\t\t}\n\n\t\tif (var.storage != StorageClassFunction && type.pointer &&\n\t\t    (var.storage == StorageClassInput || var.storage == StorageClassOutput) &&\n\t\t    interface_variable_exists_in_entry_point(var.self) && !is_hidden)\n\t\t{\n\t\t\tif (options.es && get_execution_model() == ExecutionModelVertex && var.storage == StorageClassInput &&\n\t\t\t    type.array.size() == 1)\n\t\t\t{\n\t\t\t\tSPIRV_CROSS_THROW(\"OpenGL ES doesn't support array input variables in vertex shader.\");\n\t\t\t}\n\t\t\temit_interface_block(var);\n\t\t\temitted = true;\n\t\t}\n\t\telse if (is_builtin_variable(var))\n\t\t{\n\t\t\tauto builtin = BuiltIn(get_decoration(var.self, DecorationBuiltIn));\n\t\t\t// For gl_InstanceIndex emulation on GLES, the API user needs to\n\t\t\t// supply this uniform.\n\n\t\t\t// The draw parameter extension is soft-enabled on GL with some fallbacks.\n\t\t\tif (!options.vulkan_semantics)\n\t\t\t{\n\t\t\t\tif (!emitted_base_instance &&\n\t\t\t\t    ((options.vertex.support_nonzero_base_instance && builtin == BuiltInInstanceIndex) ||\n\t\t\t\t     (builtin == BuiltInBaseInstance)))\n\t\t\t\t{\n\t\t\t\t\tstatement(\"#ifdef GL_ARB_shader_draw_parameters\");\n\t\t\t\t\tstatement(\"#define SPIRV_Cross_BaseInstance gl_BaseInstanceARB\");\n\t\t\t\t\tstatement(\"#else\");\n\t\t\t\t\t// A crude, but simple workaround which should be good enough for non-indirect draws.\n\t\t\t\t\tstatement(\"uniform int SPIRV_Cross_BaseInstance;\");\n\t\t\t\t\tstatement(\"#endif\");\n\t\t\t\t\temitted = true;\n\t\t\t\t\temitted_base_instance = true;\n\t\t\t\t}\n\t\t\t\telse if (builtin == BuiltInBaseVertex)\n\t\t\t\t{\n\t\t\t\t\tstatement(\"#ifdef GL_ARB_shader_draw_parameters\");\n\t\t\t\t\tstatement(\"#define SPIRV_Cross_BaseVertex gl_BaseVertexARB\");\n\t\t\t\t\tstatement(\"#else\");\n\t\t\t\t\t// A crude, but simple workaround which should be good enough for non-indirect draws.\n\t\t\t\t\tstatement(\"uniform int SPIRV_Cross_BaseVertex;\");\n\t\t\t\t\tstatement(\"#endif\");\n\t\t\t\t}\n\t\t\t\telse if (builtin == BuiltInDrawIndex)\n\t\t\t\t{\n\t\t\t\t\tstatement(\"#ifndef GL_ARB_shader_draw_parameters\");\n\t\t\t\t\t// Cannot really be worked around.\n\t\t\t\t\tstatement(\"#error GL_ARB_shader_draw_parameters is not supported.\");\n\t\t\t\t\tstatement(\"#endif\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\t// Global variables.\n\tfor (auto global : global_variables)\n\t{\n\t\tauto &var = get<SPIRVariable>(global);\n\t\tif (is_hidden_variable(var, true))\n\t\t\tcontinue;\n\n\t\tif (var.storage != StorageClassOutput)\n\t\t{\n\t\t\tif (!variable_is_lut(var))\n\t\t\t{\n\t\t\t\tadd_resource_name(var.self);\n\n\t\t\t\tstring initializer;\n\t\t\t\tif (options.force_zero_initialized_variables && var.storage == StorageClassPrivate &&\n\t\t\t\t    !var.initializer && !var.static_expression && type_can_zero_initialize(get_variable_data_type(var)))\n\t\t\t\t{\n\t\t\t\t\tinitializer = join(\" = \", to_zero_initialized_expression(get_variable_data_type_id(var)));\n\t\t\t\t}\n\n\t\t\t\tstatement(variable_decl(var), initializer, \";\");\n\t\t\t\temitted = true;\n\t\t\t}\n\t\t}\n\t\telse if (var.initializer && maybe_get<SPIRConstant>(var.initializer) != nullptr)\n\t\t{\n\t\t\temit_output_variable_initializer(var);\n\t\t}\n\t}\n\n\tif (emitted)\n\t\tstatement(\"\");\n}\n\nvoid CompilerGLSL::emit_output_variable_initializer(const SPIRVariable &var)\n{\n\t// If a StorageClassOutput variable has an initializer, we need to initialize it in main().\n\tauto &entry_func = this->get<SPIRFunction>(ir.default_entry_point);\n\tauto &type = get<SPIRType>(var.basetype);\n\tbool is_patch = has_decoration(var.self, DecorationPatch);\n\tbool is_block = has_decoration(type.self, DecorationBlock);\n\tbool is_control_point = get_execution_model() == ExecutionModelTessellationControl && !is_patch;\n\n\tif (is_block)\n\t{\n\t\tuint32_t member_count = uint32_t(type.member_types.size());\n\t\tbool type_is_array = type.array.size() == 1;\n\t\tuint32_t array_size = 1;\n\t\tif (type_is_array)\n\t\t\tarray_size = to_array_size_literal(type);\n\t\tuint32_t iteration_count = is_control_point ? 1 : array_size;\n\n\t\t// If the initializer is a block, we must initialize each block member one at a time.\n\t\tfor (uint32_t i = 0; i < member_count; i++)\n\t\t{\n\t\t\t// These outputs might not have been properly declared, so don't initialize them in that case.\n\t\t\tif (has_member_decoration(type.self, i, DecorationBuiltIn))\n\t\t\t{\n\t\t\t\tif (get_member_decoration(type.self, i, DecorationBuiltIn) == BuiltInCullDistance &&\n\t\t\t\t    !cull_distance_count)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif (get_member_decoration(type.self, i, DecorationBuiltIn) == BuiltInClipDistance &&\n\t\t\t\t    !clip_distance_count)\n\t\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// We need to build a per-member array first, essentially transposing from AoS to SoA.\n\t\t\t// This code path hits when we have an array of blocks.\n\t\t\tstring lut_name;\n\t\t\tif (type_is_array)\n\t\t\t{\n\t\t\t\tlut_name = join(\"_\", var.self, \"_\", i, \"_init\");\n\t\t\t\tuint32_t member_type_id = get<SPIRType>(var.basetype).member_types[i];\n\t\t\t\tauto &member_type = get<SPIRType>(member_type_id);\n\t\t\t\tauto array_type = member_type;\n\t\t\t\tarray_type.parent_type = member_type_id;\n\t\t\t\tarray_type.op = OpTypeArray;\n\t\t\t\tarray_type.array.push_back(array_size);\n\t\t\t\tarray_type.array_size_literal.push_back(true);\n\n\t\t\t\tSmallVector<string> exprs;\n\t\t\t\texprs.reserve(array_size);\n\t\t\t\tauto &c = get<SPIRConstant>(var.initializer);\n\t\t\t\tfor (uint32_t j = 0; j < array_size; j++)\n\t\t\t\t\texprs.push_back(to_expression(get<SPIRConstant>(c.subconstants[j]).subconstants[i]));\n\t\t\t\tstatement(\"const \", type_to_glsl(array_type), \" \", lut_name, type_to_array_glsl(array_type), \" = \",\n\t\t\t\t          type_to_glsl_constructor(array_type), \"(\", merge(exprs, \", \"), \");\");\n\t\t\t}\n\n\t\t\tfor (uint32_t j = 0; j < iteration_count; j++)\n\t\t\t{\n\t\t\t\tentry_func.fixup_hooks_in.push_back([=, &var]() {\n\t\t\t\t\tAccessChainMeta meta;\n\t\t\t\t\tauto &c = this->get<SPIRConstant>(var.initializer);\n\n\t\t\t\t\tuint32_t invocation_id = 0;\n\t\t\t\t\tuint32_t member_index_id = 0;\n\t\t\t\t\tif (is_control_point)\n\t\t\t\t\t{\n\t\t\t\t\t\tuint32_t ids = ir.increase_bound_by(3);\n\t\t\t\t\t\tauto &uint_type = set<SPIRType>(ids, OpTypeInt);\n\t\t\t\t\t\tuint_type.basetype = SPIRType::UInt;\n\t\t\t\t\t\tuint_type.width = 32;\n\t\t\t\t\t\tset<SPIRExpression>(ids + 1, builtin_to_glsl(BuiltInInvocationId, StorageClassInput), ids, true);\n\t\t\t\t\t\tset<SPIRConstant>(ids + 2, ids, i, false);\n\t\t\t\t\t\tinvocation_id = ids + 1;\n\t\t\t\t\t\tmember_index_id = ids + 2;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (is_patch)\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(\"if (gl_InvocationID == 0)\");\n\t\t\t\t\t\tbegin_scope();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (type_is_array && !is_control_point)\n\t\t\t\t\t{\n\t\t\t\t\t\tuint32_t indices[2] = { j, i };\n\t\t\t\t\t\tauto chain = access_chain_internal(var.self, indices, 2, ACCESS_CHAIN_INDEX_IS_LITERAL_BIT, &meta);\n\t\t\t\t\t\tstatement(chain, \" = \", lut_name, \"[\", j, \"];\");\n\t\t\t\t\t}\n\t\t\t\t\telse if (is_control_point)\n\t\t\t\t\t{\n\t\t\t\t\t\tuint32_t indices[2] = { invocation_id, member_index_id };\n\t\t\t\t\t\tauto chain = access_chain_internal(var.self, indices, 2, 0, &meta);\n\t\t\t\t\t\tstatement(chain, \" = \", lut_name, \"[\", builtin_to_glsl(BuiltInInvocationId, StorageClassInput), \"];\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tauto chain =\n\t\t\t\t\t\t\t\taccess_chain_internal(var.self, &i, 1, ACCESS_CHAIN_INDEX_IS_LITERAL_BIT, &meta);\n\t\t\t\t\t\tstatement(chain, \" = \", to_expression(c.subconstants[i]), \";\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif (is_patch)\n\t\t\t\t\t\tend_scope();\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\telse if (is_control_point)\n\t{\n\t\tauto lut_name = join(\"_\", var.self, \"_init\");\n\t\tstatement(\"const \", type_to_glsl(type), \" \", lut_name, type_to_array_glsl(type),\n\t\t          \" = \", to_expression(var.initializer), \";\");\n\t\tentry_func.fixup_hooks_in.push_back([&, lut_name]() {\n\t\t\tstatement(to_expression(var.self), \"[gl_InvocationID] = \", lut_name, \"[gl_InvocationID];\");\n\t\t});\n\t}\n\telse if (has_decoration(var.self, DecorationBuiltIn) &&\n\t         BuiltIn(get_decoration(var.self, DecorationBuiltIn)) == BuiltInSampleMask)\n\t{\n\t\t// We cannot copy the array since gl_SampleMask is unsized in GLSL. Unroll time! <_<\n\t\tentry_func.fixup_hooks_in.push_back([&] {\n\t\t\tauto &c = this->get<SPIRConstant>(var.initializer);\n\t\t\tuint32_t num_constants = uint32_t(c.subconstants.size());\n\t\t\tfor (uint32_t i = 0; i < num_constants; i++)\n\t\t\t{\n\t\t\t\t// Don't use to_expression on constant since it might be uint, just fish out the raw int.\n\t\t\t\tstatement(to_expression(var.self), \"[\", i, \"] = \",\n\t\t\t\t          convert_to_string(this->get<SPIRConstant>(c.subconstants[i]).scalar_i32()), \";\");\n\t\t\t}\n\t\t});\n\t}\n\telse\n\t{\n\t\tauto lut_name = join(\"_\", var.self, \"_init\");\n\t\tstatement(\"const \", type_to_glsl(type), \" \", lut_name,\n\t\t          type_to_array_glsl(type), \" = \", to_expression(var.initializer), \";\");\n\t\tentry_func.fixup_hooks_in.push_back([&, lut_name, is_patch]() {\n\t\t\tif (is_patch)\n\t\t\t{\n\t\t\t\tstatement(\"if (gl_InvocationID == 0)\");\n\t\t\t\tbegin_scope();\n\t\t\t}\n\t\t\tstatement(to_expression(var.self), \" = \", lut_name, \";\");\n\t\t\tif (is_patch)\n\t\t\t\tend_scope();\n\t\t});\n\t}\n}\n\nvoid CompilerGLSL::emit_subgroup_arithmetic_workaround(const std::string &func, Op op, GroupOperation group_op)\n{\n\tstd::string result;\n\tswitch (group_op)\n\t{\n\tcase GroupOperationReduce:\n\t\tresult = \"reduction\";\n\t\tbreak;\n\n\tcase GroupOperationExclusiveScan:\n\t\tresult = \"excl_scan\";\n\t\tbreak;\n\n\tcase GroupOperationInclusiveScan:\n\t\tresult = \"incl_scan\";\n\t\tbreak;\n\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Unsupported workaround for arithmetic group operation\");\n\t}\n\n\tstruct TypeInfo\n\t{\n\t\tstd::string type;\n\t\tstd::string identity;\n\t};\n\n\tstd::vector<TypeInfo> type_infos;\n\tswitch (op)\n\t{\n\tcase OpGroupNonUniformIAdd:\n\t{\n\t\ttype_infos.emplace_back(TypeInfo{ \"uint\", \"0u\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"uvec2\", \"uvec2(0u)\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"uvec3\", \"uvec3(0u)\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"uvec4\", \"uvec4(0u)\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"int\", \"0\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"ivec2\", \"ivec2(0)\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"ivec3\", \"ivec3(0)\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"ivec4\", \"ivec4(0)\" });\n\t\tbreak;\n\t}\n\n\tcase OpGroupNonUniformFAdd:\n\t{\n\t\ttype_infos.emplace_back(TypeInfo{ \"float\", \"0.0f\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"vec2\", \"vec2(0.0f)\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"vec3\", \"vec3(0.0f)\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"vec4\", \"vec4(0.0f)\" });\n\t\t// ARB_gpu_shader_fp64 is required in GL4.0 which in turn is required by NV_thread_shuffle\n\t\ttype_infos.emplace_back(TypeInfo{ \"double\", \"0.0LF\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"dvec2\", \"dvec2(0.0LF)\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"dvec3\", \"dvec3(0.0LF)\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"dvec4\", \"dvec4(0.0LF)\" });\n\t\tbreak;\n\t}\n\n\tcase OpGroupNonUniformIMul:\n\t{\n\t\ttype_infos.emplace_back(TypeInfo{ \"uint\", \"1u\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"uvec2\", \"uvec2(1u)\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"uvec3\", \"uvec3(1u)\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"uvec4\", \"uvec4(1u)\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"int\", \"1\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"ivec2\", \"ivec2(1)\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"ivec3\", \"ivec3(1)\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"ivec4\", \"ivec4(1)\" });\n\t\tbreak;\n\t}\n\n\tcase OpGroupNonUniformFMul:\n\t{\n\t\ttype_infos.emplace_back(TypeInfo{ \"float\", \"1.0f\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"vec2\", \"vec2(1.0f)\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"vec3\", \"vec3(1.0f)\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"vec4\", \"vec4(1.0f)\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"double\", \"0.0LF\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"dvec2\", \"dvec2(1.0LF)\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"dvec3\", \"dvec3(1.0LF)\" });\n\t\ttype_infos.emplace_back(TypeInfo{ \"dvec4\", \"dvec4(1.0LF)\" });\n\t\tbreak;\n\t}\n\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Unsupported workaround for arithmetic group operation\");\n\t}\n\n\tconst bool op_is_addition = op == OpGroupNonUniformIAdd || op == OpGroupNonUniformFAdd;\n\tconst bool op_is_multiplication = op == OpGroupNonUniformIMul || op == OpGroupNonUniformFMul;\n\tstd::string op_symbol;\n\tif (op_is_addition)\n\t{\n\t\top_symbol = \"+=\";\n\t}\n\telse if (op_is_multiplication)\n\t{\n\t\top_symbol = \"*=\";\n\t}\n\n\tfor (const TypeInfo &t : type_infos)\n\t{\n\t\tstatement(t.type, \" \", func, \"(\", t.type, \" v)\");\n\t\tbegin_scope();\n\t\tstatement(t.type, \" \", result, \" = \", t.identity, \";\");\n\t\tstatement(\"uvec4 active_threads = subgroupBallot(true);\");\n\t\tstatement(\"if (subgroupBallotBitCount(active_threads) == gl_SubgroupSize)\");\n\t\tbegin_scope();\n\t\tstatement(\"uint total = gl_SubgroupSize / 2u;\");\n\t\tstatement(result, \" = v;\");\n\t\tstatement(\"for (uint i = 1u; i <= total; i <<= 1u)\");\n\t\tbegin_scope();\n\t\tstatement(\"bool valid;\");\n\t\tif (group_op == GroupOperationReduce)\n\t\t{\n\t\t\tstatement(t.type, \" s = shuffleXorNV(\", result, \", i, gl_SubgroupSize, valid);\");\n\t\t}\n\t\telse if (group_op == GroupOperationExclusiveScan || group_op == GroupOperationInclusiveScan)\n\t\t{\n\t\t\tstatement(t.type, \" s = shuffleUpNV(\", result, \", i, gl_SubgroupSize, valid);\");\n\t\t}\n\t\tif (op_is_addition || op_is_multiplication)\n\t\t{\n\t\t\tstatement(result, \" \", op_symbol, \" valid ? s : \", t.identity, \";\");\n\t\t}\n\t\tend_scope();\n\t\tif (group_op == GroupOperationExclusiveScan)\n\t\t{\n\t\t\tstatement(result, \" = shuffleUpNV(\", result, \", 1u, gl_SubgroupSize);\");\n\t\t\tstatement(\"if (subgroupElect())\");\n\t\t\tbegin_scope();\n\t\t\tstatement(result, \" = \", t.identity, \";\");\n\t\t\tend_scope();\n\t\t}\n\t\tend_scope();\n\t\tstatement(\"else\");\n\t\tbegin_scope();\n\t\tif (group_op == GroupOperationExclusiveScan)\n\t\t{\n\t\t\tstatement(\"uint total = subgroupBallotBitCount(gl_SubgroupLtMask);\");\n\t\t}\n\t\telse if (group_op == GroupOperationInclusiveScan)\n\t\t{\n\t\t\tstatement(\"uint total = subgroupBallotBitCount(gl_SubgroupLeMask);\");\n\t\t}\n\t\tstatement(\"for (uint i = 0u; i < gl_SubgroupSize; ++i)\");\n\t\tbegin_scope();\n\t\tstatement(\"bool valid = subgroupBallotBitExtract(active_threads, i);\");\n\t\tstatement(t.type, \" s = shuffleNV(v, i, gl_SubgroupSize);\");\n\t\tif (group_op == GroupOperationExclusiveScan || group_op == GroupOperationInclusiveScan)\n\t\t{\n\t\t\tstatement(\"valid = valid && (i < total);\");\n\t\t}\n\t\tif (op_is_addition || op_is_multiplication)\n\t\t{\n\t\t\tstatement(result, \" \", op_symbol, \" valid ? s : \", t.identity, \";\");\n\t\t}\n\t\tend_scope();\n\t\tend_scope();\n\t\tstatement(\"return \", result, \";\");\n\t\tend_scope();\n\t}\n}\n\nvoid CompilerGLSL::emit_extension_workarounds(spv::ExecutionModel model)\n{\n\tstatic const char *workaround_types[] = { \"int\",   \"ivec2\", \"ivec3\", \"ivec4\", \"uint\",   \"uvec2\", \"uvec3\", \"uvec4\",\n\t\t                                      \"float\", \"vec2\",  \"vec3\",  \"vec4\",  \"double\", \"dvec2\", \"dvec3\", \"dvec4\" };\n\n\tif (!options.vulkan_semantics)\n\t{\n\t\tusing Supp = ShaderSubgroupSupportHelper;\n\t\tauto result = shader_subgroup_supporter.resolve();\n\n\t\tif (shader_subgroup_supporter.is_feature_requested(Supp::SubgroupMask))\n\t\t{\n\t\t\tauto exts = Supp::get_candidates_for_feature(Supp::SubgroupMask, result);\n\n\t\t\tfor (auto &e : exts)\n\t\t\t{\n\t\t\t\tconst char *name = Supp::get_extension_name(e);\n\t\t\t\tstatement(&e == &exts.front() ? \"#if\" : \"#elif\", \" defined(\", name, \")\");\n\n\t\t\t\tswitch (e)\n\t\t\t\t{\n\t\t\t\tcase Supp::NV_shader_thread_group:\n\t\t\t\t\tstatement(\"#define gl_SubgroupEqMask uvec4(gl_ThreadEqMaskNV, 0u, 0u, 0u)\");\n\t\t\t\t\tstatement(\"#define gl_SubgroupGeMask uvec4(gl_ThreadGeMaskNV, 0u, 0u, 0u)\");\n\t\t\t\t\tstatement(\"#define gl_SubgroupGtMask uvec4(gl_ThreadGtMaskNV, 0u, 0u, 0u)\");\n\t\t\t\t\tstatement(\"#define gl_SubgroupLeMask uvec4(gl_ThreadLeMaskNV, 0u, 0u, 0u)\");\n\t\t\t\t\tstatement(\"#define gl_SubgroupLtMask uvec4(gl_ThreadLtMaskNV, 0u, 0u, 0u)\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase Supp::ARB_shader_ballot:\n\t\t\t\t\tstatement(\"#define gl_SubgroupEqMask uvec4(unpackUint2x32(gl_SubGroupEqMaskARB), 0u, 0u)\");\n\t\t\t\t\tstatement(\"#define gl_SubgroupGeMask uvec4(unpackUint2x32(gl_SubGroupGeMaskARB), 0u, 0u)\");\n\t\t\t\t\tstatement(\"#define gl_SubgroupGtMask uvec4(unpackUint2x32(gl_SubGroupGtMaskARB), 0u, 0u)\");\n\t\t\t\t\tstatement(\"#define gl_SubgroupLeMask uvec4(unpackUint2x32(gl_SubGroupLeMaskARB), 0u, 0u)\");\n\t\t\t\t\tstatement(\"#define gl_SubgroupLtMask uvec4(unpackUint2x32(gl_SubGroupLtMaskARB), 0u, 0u)\");\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstatement(\"#endif\");\n\t\t\tstatement(\"\");\n\t\t}\n\n\t\tif (shader_subgroup_supporter.is_feature_requested(Supp::SubgroupSize))\n\t\t{\n\t\t\tauto exts = Supp::get_candidates_for_feature(Supp::SubgroupSize, result);\n\n\t\t\tfor (auto &e : exts)\n\t\t\t{\n\t\t\t\tconst char *name = Supp::get_extension_name(e);\n\t\t\t\tstatement(&e == &exts.front() ? \"#if\" : \"#elif\", \" defined(\", name, \")\");\n\n\t\t\t\tswitch (e)\n\t\t\t\t{\n\t\t\t\tcase Supp::NV_shader_thread_group:\n\t\t\t\t\tstatement(\"#define gl_SubgroupSize gl_WarpSizeNV\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase Supp::ARB_shader_ballot:\n\t\t\t\t\tstatement(\"#define gl_SubgroupSize gl_SubGroupSizeARB\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase Supp::AMD_gcn_shader:\n\t\t\t\t\tstatement(\"#define gl_SubgroupSize uint(gl_SIMDGroupSizeAMD)\");\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstatement(\"#endif\");\n\t\t\tstatement(\"\");\n\t\t}\n\n\t\tif (shader_subgroup_supporter.is_feature_requested(Supp::SubgroupInvocationID))\n\t\t{\n\t\t\tauto exts = Supp::get_candidates_for_feature(Supp::SubgroupInvocationID, result);\n\n\t\t\tfor (auto &e : exts)\n\t\t\t{\n\t\t\t\tconst char *name = Supp::get_extension_name(e);\n\t\t\t\tstatement(&e == &exts.front() ? \"#if\" : \"#elif\", \" defined(\", name, \")\");\n\n\t\t\t\tswitch (e)\n\t\t\t\t{\n\t\t\t\tcase Supp::NV_shader_thread_group:\n\t\t\t\t\tstatement(\"#define gl_SubgroupInvocationID gl_ThreadInWarpNV\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase Supp::ARB_shader_ballot:\n\t\t\t\t\tstatement(\"#define gl_SubgroupInvocationID gl_SubGroupInvocationARB\");\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstatement(\"#endif\");\n\t\t\tstatement(\"\");\n\t\t}\n\n\t\tif (shader_subgroup_supporter.is_feature_requested(Supp::SubgroupID))\n\t\t{\n\t\t\tauto exts = Supp::get_candidates_for_feature(Supp::SubgroupID, result);\n\n\t\t\tfor (auto &e : exts)\n\t\t\t{\n\t\t\t\tconst char *name = Supp::get_extension_name(e);\n\t\t\t\tstatement(&e == &exts.front() ? \"#if\" : \"#elif\", \" defined(\", name, \")\");\n\n\t\t\t\tswitch (e)\n\t\t\t\t{\n\t\t\t\tcase Supp::NV_shader_thread_group:\n\t\t\t\t\tstatement(\"#define gl_SubgroupID gl_WarpIDNV\");\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstatement(\"#endif\");\n\t\t\tstatement(\"\");\n\t\t}\n\n\t\tif (shader_subgroup_supporter.is_feature_requested(Supp::NumSubgroups))\n\t\t{\n\t\t\tauto exts = Supp::get_candidates_for_feature(Supp::NumSubgroups, result);\n\n\t\t\tfor (auto &e : exts)\n\t\t\t{\n\t\t\t\tconst char *name = Supp::get_extension_name(e);\n\t\t\t\tstatement(&e == &exts.front() ? \"#if\" : \"#elif\", \" defined(\", name, \")\");\n\n\t\t\t\tswitch (e)\n\t\t\t\t{\n\t\t\t\tcase Supp::NV_shader_thread_group:\n\t\t\t\t\tstatement(\"#define gl_NumSubgroups gl_WarpsPerSMNV\");\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstatement(\"#endif\");\n\t\t\tstatement(\"\");\n\t\t}\n\n\t\tif (shader_subgroup_supporter.is_feature_requested(Supp::SubgroupBroadcast_First))\n\t\t{\n\t\t\tauto exts = Supp::get_candidates_for_feature(Supp::SubgroupBroadcast_First, result);\n\n\t\t\tfor (auto &e : exts)\n\t\t\t{\n\t\t\t\tconst char *name = Supp::get_extension_name(e);\n\t\t\t\tstatement(&e == &exts.front() ? \"#if\" : \"#elif\", \" defined(\", name, \")\");\n\n\t\t\t\tswitch (e)\n\t\t\t\t{\n\t\t\t\tcase Supp::NV_shader_thread_shuffle:\n\t\t\t\t\tfor (const char *t : workaround_types)\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(t, \" subgroupBroadcastFirst(\", t,\n\t\t\t\t\t\t          \" value) { return shuffleNV(value, findLSB(ballotThreadNV(true)), gl_WarpSizeNV); }\");\n\t\t\t\t\t}\n\t\t\t\t\tfor (const char *t : workaround_types)\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(t, \" subgroupBroadcast(\", t,\n\t\t\t\t\t\t          \" value, uint id) { return shuffleNV(value, id, gl_WarpSizeNV); }\");\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase Supp::ARB_shader_ballot:\n\t\t\t\t\tfor (const char *t : workaround_types)\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(t, \" subgroupBroadcastFirst(\", t,\n\t\t\t\t\t\t          \" value) { return readFirstInvocationARB(value); }\");\n\t\t\t\t\t}\n\t\t\t\t\tfor (const char *t : workaround_types)\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(t, \" subgroupBroadcast(\", t,\n\t\t\t\t\t\t          \" value, uint id) { return readInvocationARB(value, id); }\");\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstatement(\"#endif\");\n\t\t\tstatement(\"\");\n\t\t}\n\n\t\tif (shader_subgroup_supporter.is_feature_requested(Supp::SubgroupBallotFindLSB_MSB))\n\t\t{\n\t\t\tauto exts = Supp::get_candidates_for_feature(Supp::SubgroupBallotFindLSB_MSB, result);\n\n\t\t\tfor (auto &e : exts)\n\t\t\t{\n\t\t\t\tconst char *name = Supp::get_extension_name(e);\n\t\t\t\tstatement(&e == &exts.front() ? \"#if\" : \"#elif\", \" defined(\", name, \")\");\n\n\t\t\t\tswitch (e)\n\t\t\t\t{\n\t\t\t\tcase Supp::NV_shader_thread_group:\n\t\t\t\t\tstatement(\"uint subgroupBallotFindLSB(uvec4 value) { return findLSB(value.x); }\");\n\t\t\t\t\tstatement(\"uint subgroupBallotFindMSB(uvec4 value) { return findMSB(value.x); }\");\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstatement(\"#else\");\n\t\t\tstatement(\"uint subgroupBallotFindLSB(uvec4 value)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"int firstLive = findLSB(value.x);\");\n\t\t\tstatement(\"return uint(firstLive != -1 ? firstLive : (findLSB(value.y) + 32));\");\n\t\t\tend_scope();\n\t\t\tstatement(\"uint subgroupBallotFindMSB(uvec4 value)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"int firstLive = findMSB(value.y);\");\n\t\t\tstatement(\"return uint(firstLive != -1 ? (firstLive + 32) : findMSB(value.x));\");\n\t\t\tend_scope();\n\t\t\tstatement(\"#endif\");\n\t\t\tstatement(\"\");\n\t\t}\n\n\t\tif (shader_subgroup_supporter.is_feature_requested(Supp::SubgroupAll_Any_AllEqualBool))\n\t\t{\n\t\t\tauto exts = Supp::get_candidates_for_feature(Supp::SubgroupAll_Any_AllEqualBool, result);\n\n\t\t\tfor (auto &e : exts)\n\t\t\t{\n\t\t\t\tconst char *name = Supp::get_extension_name(e);\n\t\t\t\tstatement(&e == &exts.front() ? \"#if\" : \"#elif\", \" defined(\", name, \")\");\n\n\t\t\t\tswitch (e)\n\t\t\t\t{\n\t\t\t\tcase Supp::NV_gpu_shader_5:\n\t\t\t\t\tstatement(\"bool subgroupAll(bool value) { return allThreadsNV(value); }\");\n\t\t\t\t\tstatement(\"bool subgroupAny(bool value) { return anyThreadNV(value); }\");\n\t\t\t\t\tstatement(\"bool subgroupAllEqual(bool value) { return allThreadsEqualNV(value); }\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase Supp::ARB_shader_group_vote:\n\t\t\t\t\tstatement(\"bool subgroupAll(bool v) { return allInvocationsARB(v); }\");\n\t\t\t\t\tstatement(\"bool subgroupAny(bool v) { return anyInvocationARB(v); }\");\n\t\t\t\t\tstatement(\"bool subgroupAllEqual(bool v) { return allInvocationsEqualARB(v); }\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase Supp::AMD_gcn_shader:\n\t\t\t\t\tstatement(\"bool subgroupAll(bool value) { return ballotAMD(value) == ballotAMD(true); }\");\n\t\t\t\t\tstatement(\"bool subgroupAny(bool value) { return ballotAMD(value) != 0ull; }\");\n\t\t\t\t\tstatement(\"bool subgroupAllEqual(bool value) { uint64_t b = ballotAMD(value); return b == 0ull || \"\n\t\t\t\t\t          \"b == ballotAMD(true); }\");\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstatement(\"#endif\");\n\t\t\tstatement(\"\");\n\t\t}\n\n\t\tif (shader_subgroup_supporter.is_feature_requested(Supp::SubgroupAllEqualT))\n\t\t{\n\t\t\tstatement(\"#ifndef GL_KHR_shader_subgroup_vote\");\n\t\t\tstatement(\n\t\t\t    \"#define _SPIRV_CROSS_SUBGROUP_ALL_EQUAL_WORKAROUND(type) bool subgroupAllEqual(type value) { return \"\n\t\t\t    \"subgroupAllEqual(subgroupBroadcastFirst(value) == value); }\");\n\t\t\tfor (const char *t : workaround_types)\n\t\t\t\tstatement(\"_SPIRV_CROSS_SUBGROUP_ALL_EQUAL_WORKAROUND(\", t, \")\");\n\t\t\tstatement(\"#undef _SPIRV_CROSS_SUBGROUP_ALL_EQUAL_WORKAROUND\");\n\t\t\tstatement(\"#endif\");\n\t\t\tstatement(\"\");\n\t\t}\n\n\t\tif (shader_subgroup_supporter.is_feature_requested(Supp::SubgroupBallot))\n\t\t{\n\t\t\tauto exts = Supp::get_candidates_for_feature(Supp::SubgroupBallot, result);\n\n\t\t\tfor (auto &e : exts)\n\t\t\t{\n\t\t\t\tconst char *name = Supp::get_extension_name(e);\n\t\t\t\tstatement(&e == &exts.front() ? \"#if\" : \"#elif\", \" defined(\", name, \")\");\n\n\t\t\t\tswitch (e)\n\t\t\t\t{\n\t\t\t\tcase Supp::NV_shader_thread_group:\n\t\t\t\t\tstatement(\"uvec4 subgroupBallot(bool v) { return uvec4(ballotThreadNV(v), 0u, 0u, 0u); }\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase Supp::ARB_shader_ballot:\n\t\t\t\t\tstatement(\"uvec4 subgroupBallot(bool v) { return uvec4(unpackUint2x32(ballotARB(v)), 0u, 0u); }\");\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstatement(\"#endif\");\n\t\t\tstatement(\"\");\n\t\t}\n\n\t\tif (shader_subgroup_supporter.is_feature_requested(Supp::SubgroupElect))\n\t\t{\n\t\t\tstatement(\"#ifndef GL_KHR_shader_subgroup_basic\");\n\t\t\tstatement(\"bool subgroupElect()\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"uvec4 activeMask = subgroupBallot(true);\");\n\t\t\tstatement(\"uint firstLive = subgroupBallotFindLSB(activeMask);\");\n\t\t\tstatement(\"return gl_SubgroupInvocationID == firstLive;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"#endif\");\n\t\t\tstatement(\"\");\n\t\t}\n\n\t\tif (shader_subgroup_supporter.is_feature_requested(Supp::SubgroupBarrier))\n\t\t{\n\t\t\t// Extensions we're using in place of GL_KHR_shader_subgroup_basic state\n\t\t\t// that subgroup execute in lockstep so this barrier is implicit.\n\t\t\t// However the GL 4.6 spec also states that `barrier` implies a shared memory barrier,\n\t\t\t// and a specific test of optimizing scans by leveraging lock-step invocation execution,\n\t\t\t// has shown that a `memoryBarrierShared` is needed in place of a `subgroupBarrier`.\n\t\t\t// https://github.com/buildaworldnet/IrrlichtBAW/commit/d8536857991b89a30a6b65d29441e51b64c2c7ad#diff-9f898d27be1ea6fc79b03d9b361e299334c1a347b6e4dc344ee66110c6aa596aR19\n\t\t\tstatement(\"#ifndef GL_KHR_shader_subgroup_basic\");\n\t\t\tstatement(\"void subgroupBarrier() { memoryBarrierShared(); }\");\n\t\t\tstatement(\"#endif\");\n\t\t\tstatement(\"\");\n\t\t}\n\n\t\tif (shader_subgroup_supporter.is_feature_requested(Supp::SubgroupMemBarrier))\n\t\t{\n\t\t\tif (model == spv::ExecutionModelGLCompute)\n\t\t\t{\n\t\t\t\tstatement(\"#ifndef GL_KHR_shader_subgroup_basic\");\n\t\t\t\tstatement(\"void subgroupMemoryBarrier() { groupMemoryBarrier(); }\");\n\t\t\t\tstatement(\"void subgroupMemoryBarrierBuffer() { groupMemoryBarrier(); }\");\n\t\t\t\tstatement(\"void subgroupMemoryBarrierShared() { memoryBarrierShared(); }\");\n\t\t\t\tstatement(\"void subgroupMemoryBarrierImage() { groupMemoryBarrier(); }\");\n\t\t\t\tstatement(\"#endif\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstatement(\"#ifndef GL_KHR_shader_subgroup_basic\");\n\t\t\t\tstatement(\"void subgroupMemoryBarrier() { memoryBarrier(); }\");\n\t\t\t\tstatement(\"void subgroupMemoryBarrierBuffer() { memoryBarrierBuffer(); }\");\n\t\t\t\tstatement(\"void subgroupMemoryBarrierImage() { memoryBarrierImage(); }\");\n\t\t\t\tstatement(\"#endif\");\n\t\t\t}\n\t\t\tstatement(\"\");\n\t\t}\n\n\t\tif (shader_subgroup_supporter.is_feature_requested(Supp::SubgroupInverseBallot_InclBitCount_ExclBitCout))\n\t\t{\n\t\t\tstatement(\"#ifndef GL_KHR_shader_subgroup_ballot\");\n\t\t\tstatement(\"bool subgroupInverseBallot(uvec4 value)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return any(notEqual(value.xy & gl_SubgroupEqMask.xy, uvec2(0u)));\");\n\t\t\tend_scope();\n\n\t\t\tstatement(\"uint subgroupBallotInclusiveBitCount(uvec4 value)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"uvec2 v = value.xy & gl_SubgroupLeMask.xy;\");\n\t\t\tstatement(\"ivec2 c = bitCount(v);\");\n\t\t\tstatement_no_indent(\"#ifdef GL_NV_shader_thread_group\");\n\t\t\tstatement(\"return uint(c.x);\");\n\t\t\tstatement_no_indent(\"#else\");\n\t\t\tstatement(\"return uint(c.x + c.y);\");\n\t\t\tstatement_no_indent(\"#endif\");\n\t\t\tend_scope();\n\n\t\t\tstatement(\"uint subgroupBallotExclusiveBitCount(uvec4 value)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"uvec2 v = value.xy & gl_SubgroupLtMask.xy;\");\n\t\t\tstatement(\"ivec2 c = bitCount(v);\");\n\t\t\tstatement_no_indent(\"#ifdef GL_NV_shader_thread_group\");\n\t\t\tstatement(\"return uint(c.x);\");\n\t\t\tstatement_no_indent(\"#else\");\n\t\t\tstatement(\"return uint(c.x + c.y);\");\n\t\t\tstatement_no_indent(\"#endif\");\n\t\t\tend_scope();\n\t\t\tstatement(\"#endif\");\n\t\t\tstatement(\"\");\n\t\t}\n\n\t\tif (shader_subgroup_supporter.is_feature_requested(Supp::SubgroupBallotBitCount))\n\t\t{\n\t\t\tstatement(\"#ifndef GL_KHR_shader_subgroup_ballot\");\n\t\t\tstatement(\"uint subgroupBallotBitCount(uvec4 value)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"ivec2 c = bitCount(value.xy);\");\n\t\t\tstatement_no_indent(\"#ifdef GL_NV_shader_thread_group\");\n\t\t\tstatement(\"return uint(c.x);\");\n\t\t\tstatement_no_indent(\"#else\");\n\t\t\tstatement(\"return uint(c.x + c.y);\");\n\t\t\tstatement_no_indent(\"#endif\");\n\t\t\tend_scope();\n\t\t\tstatement(\"#endif\");\n\t\t\tstatement(\"\");\n\t\t}\n\n\t\tif (shader_subgroup_supporter.is_feature_requested(Supp::SubgroupBallotBitExtract))\n\t\t{\n\t\t\tstatement(\"#ifndef GL_KHR_shader_subgroup_ballot\");\n\t\t\tstatement(\"bool subgroupBallotBitExtract(uvec4 value, uint index)\");\n\t\t\tbegin_scope();\n\t\t\tstatement_no_indent(\"#ifdef GL_NV_shader_thread_group\");\n\t\t\tstatement(\"uint shifted = value.x >> index;\");\n\t\t\tstatement_no_indent(\"#else\");\n\t\t\tstatement(\"uint shifted = value[index >> 5u] >> (index & 0x1fu);\");\n\t\t\tstatement_no_indent(\"#endif\");\n\t\t\tstatement(\"return (shifted & 1u) != 0u;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"#endif\");\n\t\t\tstatement(\"\");\n\t\t}\n\n\t\tauto arithmetic_feature_helper =\n\t\t    [&](Supp::Feature feat, std::string func_name, spv::Op op, spv::GroupOperation group_op)\n\t\t{\n\t\t\tif (shader_subgroup_supporter.is_feature_requested(feat))\n\t\t\t{\n\t\t\t\tauto exts = Supp::get_candidates_for_feature(feat, result);\n\t\t\t\tfor (auto &e : exts)\n\t\t\t\t{\n\t\t\t\t\tconst char *name = Supp::get_extension_name(e);\n\t\t\t\t\tstatement(&e == &exts.front() ? \"#if\" : \"#elif\", \" defined(\", name, \")\");\n\n\t\t\t\t\tswitch (e)\n\t\t\t\t\t{\n\t\t\t\t\tcase Supp::NV_shader_thread_shuffle:\n\t\t\t\t\t\temit_subgroup_arithmetic_workaround(func_name, op, group_op);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstatement(\"#endif\");\n\t\t\t\tstatement(\"\");\n\t\t\t}\n\t\t};\n\n\t\tarithmetic_feature_helper(Supp::SubgroupArithmeticIAddReduce, \"subgroupAdd\", OpGroupNonUniformIAdd,\n\t\t                          GroupOperationReduce);\n\t\tarithmetic_feature_helper(Supp::SubgroupArithmeticIAddExclusiveScan, \"subgroupExclusiveAdd\",\n\t\t                          OpGroupNonUniformIAdd, GroupOperationExclusiveScan);\n\t\tarithmetic_feature_helper(Supp::SubgroupArithmeticIAddInclusiveScan, \"subgroupInclusiveAdd\",\n\t\t                          OpGroupNonUniformIAdd, GroupOperationInclusiveScan);\n\t\tarithmetic_feature_helper(Supp::SubgroupArithmeticFAddReduce, \"subgroupAdd\", OpGroupNonUniformFAdd,\n\t\t                          GroupOperationReduce);\n\t\tarithmetic_feature_helper(Supp::SubgroupArithmeticFAddExclusiveScan, \"subgroupExclusiveAdd\",\n\t\t                          OpGroupNonUniformFAdd, GroupOperationExclusiveScan);\n\t\tarithmetic_feature_helper(Supp::SubgroupArithmeticFAddInclusiveScan, \"subgroupInclusiveAdd\",\n\t\t                          OpGroupNonUniformFAdd, GroupOperationInclusiveScan);\n\n\t\tarithmetic_feature_helper(Supp::SubgroupArithmeticIMulReduce, \"subgroupMul\", OpGroupNonUniformIMul,\n\t\t                          GroupOperationReduce);\n\t\tarithmetic_feature_helper(Supp::SubgroupArithmeticIMulExclusiveScan, \"subgroupExclusiveMul\",\n\t\t                          OpGroupNonUniformIMul, GroupOperationExclusiveScan);\n\t\tarithmetic_feature_helper(Supp::SubgroupArithmeticIMulInclusiveScan, \"subgroupInclusiveMul\",\n\t\t                          OpGroupNonUniformIMul, GroupOperationInclusiveScan);\n\t\tarithmetic_feature_helper(Supp::SubgroupArithmeticFMulReduce, \"subgroupMul\", OpGroupNonUniformFMul,\n\t\t                          GroupOperationReduce);\n\t\tarithmetic_feature_helper(Supp::SubgroupArithmeticFMulExclusiveScan, \"subgroupExclusiveMul\",\n\t\t                          OpGroupNonUniformFMul, GroupOperationExclusiveScan);\n\t\tarithmetic_feature_helper(Supp::SubgroupArithmeticFMulInclusiveScan, \"subgroupInclusiveMul\",\n\t\t                          OpGroupNonUniformFMul, GroupOperationInclusiveScan);\n\t}\n\n\tif (!workaround_ubo_load_overload_types.empty())\n\t{\n\t\tfor (auto &type_id : workaround_ubo_load_overload_types)\n\t\t{\n\t\t\tauto &type = get<SPIRType>(type_id);\n\n\t\t\tif (options.es && is_matrix(type))\n\t\t\t{\n\t\t\t\t// Need both variants.\n\t\t\t\t// GLSL cannot overload on precision, so need to dispatch appropriately.\n\t\t\t\tstatement(\"highp \", type_to_glsl(type), \" spvWorkaroundRowMajor(highp \", type_to_glsl(type), \" wrap) { return wrap; }\");\n\t\t\t\tstatement(\"mediump \", type_to_glsl(type), \" spvWorkaroundRowMajorMP(mediump \", type_to_glsl(type), \" wrap) { return wrap; }\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstatement(type_to_glsl(type), \" spvWorkaroundRowMajor(\", type_to_glsl(type), \" wrap) { return wrap; }\");\n\t\t\t}\n\t\t}\n\t\tstatement(\"\");\n\t}\n}\n\nvoid CompilerGLSL::emit_polyfills(uint32_t polyfills, bool relaxed)\n{\n\tconst char *qual = \"\";\n\tconst char *suffix = (options.es && relaxed) ? \"MP\" : \"\";\n\tif (options.es)\n\t\tqual = relaxed ? \"mediump \" : \"highp \";\n\n\tif (polyfills & PolyfillTranspose2x2)\n\t{\n\t\tstatement(qual, \"mat2 spvTranspose\", suffix, \"(\", qual, \"mat2 m)\");\n\t\tbegin_scope();\n\t\tstatement(\"return mat2(m[0][0], m[1][0], m[0][1], m[1][1]);\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n\n\tif (polyfills & PolyfillTranspose3x3)\n\t{\n\t\tstatement(qual, \"mat3 spvTranspose\", suffix, \"(\", qual, \"mat3 m)\");\n\t\tbegin_scope();\n\t\tstatement(\"return mat3(m[0][0], m[1][0], m[2][0], m[0][1], m[1][1], m[2][1], m[0][2], m[1][2], m[2][2]);\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n\n\tif (polyfills & PolyfillTranspose4x4)\n\t{\n\t\tstatement(qual, \"mat4 spvTranspose\", suffix, \"(\", qual, \"mat4 m)\");\n\t\tbegin_scope();\n\t\tstatement(\"return mat4(m[0][0], m[1][0], m[2][0], m[3][0], m[0][1], m[1][1], m[2][1], m[3][1], m[0][2], \"\n\t\t          \"m[1][2], m[2][2], m[3][2], m[0][3], m[1][3], m[2][3], m[3][3]);\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n\n\tif (polyfills & PolyfillDeterminant2x2)\n\t{\n\t\tstatement(qual, \"float spvDeterminant\", suffix, \"(\", qual, \"mat2 m)\");\n\t\tbegin_scope();\n\t\tstatement(\"return m[0][0] * m[1][1] - m[0][1] * m[1][0];\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n\n\tif (polyfills & PolyfillDeterminant3x3)\n\t{\n\t\tstatement(qual, \"float spvDeterminant\", suffix, \"(\", qual, \"mat3 m)\");\n\t\tbegin_scope();\n\t\tstatement(\"return dot(m[0], vec3(m[1][1] * m[2][2] - m[1][2] * m[2][1], \"\n\t\t                                \"m[1][2] * m[2][0] - m[1][0] * m[2][2], \"\n\t\t                                \"m[1][0] * m[2][1] - m[1][1] * m[2][0]));\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n\n\tif (polyfills & PolyfillDeterminant4x4)\n\t{\n\t\tstatement(qual, \"float spvDeterminant\", suffix, \"(\", qual, \"mat4 m)\");\n\t\tbegin_scope();\n\t\tstatement(\"return dot(m[0], vec4(\"\n\t\t          \"m[2][1] * m[3][2] * m[1][3] - m[3][1] * m[2][2] * m[1][3] + m[3][1] * m[1][2] * m[2][3] - m[1][1] * m[3][2] * m[2][3] - m[2][1] * m[1][2] * m[3][3] + m[1][1] * m[2][2] * m[3][3], \"\n\t\t          \"m[3][0] * m[2][2] * m[1][3] - m[2][0] * m[3][2] * m[1][3] - m[3][0] * m[1][2] * m[2][3] + m[1][0] * m[3][2] * m[2][3] + m[2][0] * m[1][2] * m[3][3] - m[1][0] * m[2][2] * m[3][3], \"\n\t\t          \"m[2][0] * m[3][1] * m[1][3] - m[3][0] * m[2][1] * m[1][3] + m[3][0] * m[1][1] * m[2][3] - m[1][0] * m[3][1] * m[2][3] - m[2][0] * m[1][1] * m[3][3] + m[1][0] * m[2][1] * m[3][3], \"\n\t\t          \"m[3][0] * m[2][1] * m[1][2] - m[2][0] * m[3][1] * m[1][2] - m[3][0] * m[1][1] * m[2][2] + m[1][0] * m[3][1] * m[2][2] + m[2][0] * m[1][1] * m[3][2] - m[1][0] * m[2][1] * m[3][2]));\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n\n\tif (polyfills & PolyfillMatrixInverse2x2)\n\t{\n\t\tstatement(qual, \"mat2 spvInverse\", suffix, \"(\", qual, \"mat2 m)\");\n\t\tbegin_scope();\n\t\tstatement(\"return mat2(m[1][1], -m[0][1], -m[1][0], m[0][0]) \"\n\t\t          \"* (1.0 / (m[0][0] * m[1][1] - m[1][0] * m[0][1]));\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n\n\tif (polyfills & PolyfillMatrixInverse3x3)\n\t{\n\t\tstatement(qual, \"mat3 spvInverse\", suffix, \"(\", qual, \"mat3 m)\");\n\t\tbegin_scope();\n\t\tstatement(qual, \"vec3 t = vec3(m[1][1] * m[2][2] - m[1][2] * m[2][1], m[1][2] * m[2][0] - m[1][0] * m[2][2], m[1][0] * m[2][1] - m[1][1] * m[2][0]);\");\n\t\tstatement(\"return mat3(t[0], \"\n\t\t                      \"m[0][2] * m[2][1] - m[0][1] * m[2][2], \"\n\t\t                      \"m[0][1] * m[1][2] - m[0][2] * m[1][1], \"\n\t\t                      \"t[1], \"\n\t\t                      \"m[0][0] * m[2][2] - m[0][2] * m[2][0], \"\n\t\t                      \"m[0][2] * m[1][0] - m[0][0] * m[1][2], \"\n\t\t                      \"t[2], \"\n\t\t                      \"m[0][1] * m[2][0] - m[0][0] * m[2][1], \"\n\t\t                      \"m[0][0] * m[1][1] - m[0][1] * m[1][0]) \"\n\t\t                      \"* (1.0 / dot(m[0], t));\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n\n\tif (polyfills & PolyfillMatrixInverse4x4)\n\t{\n\t\tstatement(qual, \"mat4 spvInverse\", suffix, \"(\", qual, \"mat4 m)\");\n\t\tbegin_scope();\n\t\tstatement(qual, \"vec4 t = vec4(\"\n\t\t          \"m[2][1] * m[3][2] * m[1][3] - m[3][1] * m[2][2] * m[1][3] + m[3][1] * m[1][2] * m[2][3] - m[1][1] * m[3][2] * m[2][3] - m[2][1] * m[1][2] * m[3][3] + m[1][1] * m[2][2] * m[3][3], \"\n\t\t          \"m[3][0] * m[2][2] * m[1][3] - m[2][0] * m[3][2] * m[1][3] - m[3][0] * m[1][2] * m[2][3] + m[1][0] * m[3][2] * m[2][3] + m[2][0] * m[1][2] * m[3][3] - m[1][0] * m[2][2] * m[3][3], \"\n\t\t          \"m[2][0] * m[3][1] * m[1][3] - m[3][0] * m[2][1] * m[1][3] + m[3][0] * m[1][1] * m[2][3] - m[1][0] * m[3][1] * m[2][3] - m[2][0] * m[1][1] * m[3][3] + m[1][0] * m[2][1] * m[3][3], \"\n\t\t          \"m[3][0] * m[2][1] * m[1][2] - m[2][0] * m[3][1] * m[1][2] - m[3][0] * m[1][1] * m[2][2] + m[1][0] * m[3][1] * m[2][2] + m[2][0] * m[1][1] * m[3][2] - m[1][0] * m[2][1] * m[3][2]);\");\n\t\tstatement(\"return mat4(\"\n\t\t          \"t[0], \"\n\t\t          \"m[3][1] * m[2][2] * m[0][3] - m[2][1] * m[3][2] * m[0][3] - m[3][1] * m[0][2] * m[2][3] + m[0][1] * m[3][2] * m[2][3] + m[2][1] * m[0][2] * m[3][3] - m[0][1] * m[2][2] * m[3][3], \"\n\t\t          \"m[1][1] * m[3][2] * m[0][3] - m[3][1] * m[1][2] * m[0][3] + m[3][1] * m[0][2] * m[1][3] - m[0][1] * m[3][2] * m[1][3] - m[1][1] * m[0][2] * m[3][3] + m[0][1] * m[1][2] * m[3][3], \"\n\t\t          \"m[2][1] * m[1][2] * m[0][3] - m[1][1] * m[2][2] * m[0][3] - m[2][1] * m[0][2] * m[1][3] + m[0][1] * m[2][2] * m[1][3] + m[1][1] * m[0][2] * m[2][3] - m[0][1] * m[1][2] * m[2][3], \"\n\t\t          \"t[1], \"\n\t\t          \"m[2][0] * m[3][2] * m[0][3] - m[3][0] * m[2][2] * m[0][3] + m[3][0] * m[0][2] * m[2][3] - m[0][0] * m[3][2] * m[2][3] - m[2][0] * m[0][2] * m[3][3] + m[0][0] * m[2][2] * m[3][3], \"\n\t\t          \"m[3][0] * m[1][2] * m[0][3] - m[1][0] * m[3][2] * m[0][3] - m[3][0] * m[0][2] * m[1][3] + m[0][0] * m[3][2] * m[1][3] + m[1][0] * m[0][2] * m[3][3] - m[0][0] * m[1][2] * m[3][3], \"\n\t\t          \"m[1][0] * m[2][2] * m[0][3] - m[2][0] * m[1][2] * m[0][3] + m[2][0] * m[0][2] * m[1][3] - m[0][0] * m[2][2] * m[1][3] - m[1][0] * m[0][2] * m[2][3] + m[0][0] * m[1][2] * m[2][3], \"\n\t\t          \"t[2], \"\n\t\t          \"m[3][0] * m[2][1] * m[0][3] - m[2][0] * m[3][1] * m[0][3] - m[3][0] * m[0][1] * m[2][3] + m[0][0] * m[3][1] * m[2][3] + m[2][0] * m[0][1] * m[3][3] - m[0][0] * m[2][1] * m[3][3], \"\n\t\t          \"m[1][0] * m[3][1] * m[0][3] - m[3][0] * m[1][1] * m[0][3] + m[3][0] * m[0][1] * m[1][3] - m[0][0] * m[3][1] * m[1][3] - m[1][0] * m[0][1] * m[3][3] + m[0][0] * m[1][1] * m[3][3], \"\n\t\t          \"m[2][0] * m[1][1] * m[0][3] - m[1][0] * m[2][1] * m[0][3] - m[2][0] * m[0][1] * m[1][3] + m[0][0] * m[2][1] * m[1][3] + m[1][0] * m[0][1] * m[2][3] - m[0][0] * m[1][1] * m[2][3], \"\n\t\t          \"t[3], \"\n\t\t          \"m[2][0] * m[3][1] * m[0][2] - m[3][0] * m[2][1] * m[0][2] + m[3][0] * m[0][1] * m[2][2] - m[0][0] * m[3][1] * m[2][2] - m[2][0] * m[0][1] * m[3][2] + m[0][0] * m[2][1] * m[3][2], \"\n\t\t          \"m[3][0] * m[1][1] * m[0][2] - m[1][0] * m[3][1] * m[0][2] - m[3][0] * m[0][1] * m[1][2] + m[0][0] * m[3][1] * m[1][2] + m[1][0] * m[0][1] * m[3][2] - m[0][0] * m[1][1] * m[3][2], \"\n\t\t          \"m[1][0] * m[2][1] * m[0][2] - m[2][0] * m[1][1] * m[0][2] + m[2][0] * m[0][1] * m[1][2] - m[0][0] * m[2][1] * m[1][2] - m[1][0] * m[0][1] * m[2][2] + m[0][0] * m[1][1] * m[2][2]) \"\n\t\t          \"* (1.0 / dot(m[0], t));\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n}\n\n// Returns a string representation of the ID, usable as a function arg.\n// Default is to simply return the expression representation fo the arg ID.\n// Subclasses may override to modify the return value.\nstring CompilerGLSL::to_func_call_arg(const SPIRFunction::Parameter &, uint32_t id)\n{\n\t// Make sure that we use the name of the original variable, and not the parameter alias.\n\tuint32_t name_id = id;\n\tauto *var = maybe_get<SPIRVariable>(id);\n\tif (var && var->basevariable)\n\t\tname_id = var->basevariable;\n\treturn to_expression(name_id);\n}\n\nvoid CompilerGLSL::force_temporary_and_recompile(uint32_t id)\n{\n\tauto res = forced_temporaries.insert(id);\n\n\t// Forcing new temporaries guarantees forward progress.\n\tif (res.second)\n\t\tforce_recompile_guarantee_forward_progress();\n\telse\n\t\tforce_recompile();\n}\n\nuint32_t CompilerGLSL::consume_temporary_in_precision_context(uint32_t type_id, uint32_t id, Options::Precision precision)\n{\n\t// Constants do not have innate precision.\n\tauto handle_type = ir.ids[id].get_type();\n\tif (handle_type == TypeConstant || handle_type == TypeConstantOp || handle_type == TypeUndef)\n\t\treturn id;\n\n\t// Ignore anything that isn't 32-bit values.\n\tauto &type = get<SPIRType>(type_id);\n\tif (type.pointer)\n\t\treturn id;\n\tif (type.basetype != SPIRType::Float && type.basetype != SPIRType::UInt && type.basetype != SPIRType::Int)\n\t\treturn id;\n\n\tif (precision == Options::DontCare)\n\t{\n\t\t// If precision is consumed as don't care (operations only consisting of constants),\n\t\t// we need to bind the expression to a temporary,\n\t\t// otherwise we have no way of controlling the precision later.\n\t\tauto itr = forced_temporaries.insert(id);\n\t\tif (itr.second)\n\t\t\tforce_recompile_guarantee_forward_progress();\n\t\treturn id;\n\t}\n\n\tauto current_precision = has_decoration(id, DecorationRelaxedPrecision) ? Options::Mediump : Options::Highp;\n\tif (current_precision == precision)\n\t\treturn id;\n\n\tauto itr = temporary_to_mirror_precision_alias.find(id);\n\tif (itr == temporary_to_mirror_precision_alias.end())\n\t{\n\t\tuint32_t alias_id = ir.increase_bound_by(1);\n\t\tauto &m = ir.meta[alias_id];\n\t\tif (auto *input_m = ir.find_meta(id))\n\t\t\tm = *input_m;\n\n\t\tconst char *prefix;\n\t\tif (precision == Options::Mediump)\n\t\t{\n\t\t\tset_decoration(alias_id, DecorationRelaxedPrecision);\n\t\t\tprefix = \"mp_copy_\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tunset_decoration(alias_id, DecorationRelaxedPrecision);\n\t\t\tprefix = \"hp_copy_\";\n\t\t}\n\n\t\tauto alias_name = join(prefix, to_name(id));\n\t\tParsedIR::sanitize_underscores(alias_name);\n\t\tset_name(alias_id, alias_name);\n\n\t\temit_op(type_id, alias_id, to_expression(id), true);\n\t\ttemporary_to_mirror_precision_alias[id] = alias_id;\n\t\tforced_temporaries.insert(id);\n\t\tforced_temporaries.insert(alias_id);\n\t\tforce_recompile_guarantee_forward_progress();\n\t\tid = alias_id;\n\t}\n\telse\n\t{\n\t\tid = itr->second;\n\t}\n\n\treturn id;\n}\n\nvoid CompilerGLSL::handle_invalid_expression(uint32_t id)\n{\n\t// We tried to read an invalidated expression.\n\t// This means we need another pass at compilation, but next time,\n\t// force temporary variables so that they cannot be invalidated.\n\tforce_temporary_and_recompile(id);\n\n\t// If the invalid expression happened as a result of a CompositeInsert\n\t// overwrite, we must block this from happening next iteration.\n\tif (composite_insert_overwritten.count(id))\n\t\tblock_composite_insert_overwrite.insert(id);\n}\n\n// Converts the format of the current expression from packed to unpacked,\n// by wrapping the expression in a constructor of the appropriate type.\n// GLSL does not support packed formats, so simply return the expression.\n// Subclasses that do will override.\nstring CompilerGLSL::unpack_expression_type(string expr_str, const SPIRType &, uint32_t, bool, bool)\n{\n\treturn expr_str;\n}\n\n// Sometimes we proactively enclosed an expression where it turns out we might have not needed it after all.\nvoid CompilerGLSL::strip_enclosed_expression(string &expr)\n{\n\tif (expr.size() < 2 || expr.front() != '(' || expr.back() != ')')\n\t\treturn;\n\n\t// Have to make sure that our first and last parens actually enclose everything inside it.\n\tuint32_t paren_count = 0;\n\tfor (auto &c : expr)\n\t{\n\t\tif (c == '(')\n\t\t\tparen_count++;\n\t\telse if (c == ')')\n\t\t{\n\t\t\tparen_count--;\n\n\t\t\t// If we hit 0 and this is not the final char, our first and final parens actually don't\n\t\t\t// enclose the expression, and we cannot strip, e.g.: (a + b) * (c + d).\n\t\t\tif (paren_count == 0 && &c != &expr.back())\n\t\t\t\treturn;\n\t\t}\n\t}\n\texpr.erase(expr.size() - 1, 1);\n\texpr.erase(begin(expr));\n}\n\nbool CompilerGLSL::needs_enclose_expression(const std::string &expr)\n{\n\tbool need_parens = false;\n\n\t// If the expression starts with a unary we need to enclose to deal with cases where we have back-to-back\n\t// unary expressions.\n\tif (!expr.empty())\n\t{\n\t\tauto c = expr.front();\n\t\tif (c == '-' || c == '+' || c == '!' || c == '~' || c == '&' || c == '*')\n\t\t\tneed_parens = true;\n\t}\n\n\tif (!need_parens)\n\t{\n\t\tuint32_t paren_count = 0;\n\t\tfor (auto c : expr)\n\t\t{\n\t\t\tif (c == '(' || c == '[')\n\t\t\t\tparen_count++;\n\t\t\telse if (c == ')' || c == ']')\n\t\t\t{\n\t\t\t\tassert(paren_count);\n\t\t\t\tparen_count--;\n\t\t\t}\n\t\t\telse if (c == ' ' && paren_count == 0)\n\t\t\t{\n\t\t\t\tneed_parens = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tassert(paren_count == 0);\n\t}\n\n\treturn need_parens;\n}\n\nstring CompilerGLSL::enclose_expression(const string &expr)\n{\n\t// If this expression contains any spaces which are not enclosed by parentheses,\n\t// we need to enclose it so we can treat the whole string as an expression.\n\t// This happens when two expressions have been part of a binary op earlier.\n\tif (needs_enclose_expression(expr))\n\t\treturn join('(', expr, ')');\n\telse\n\t\treturn expr;\n}\n\nstring CompilerGLSL::dereference_expression(const SPIRType &expr_type, const std::string &expr)\n{\n\t// If this expression starts with an address-of operator ('&'), then\n\t// just return the part after the operator.\n\t// TODO: Strip parens if unnecessary?\n\tif (expr.front() == '&')\n\t\treturn expr.substr(1);\n\telse if (backend.native_pointers)\n\t\treturn join('*', expr);\n\telse if (expr_type.storage == StorageClassPhysicalStorageBufferEXT && expr_type.basetype != SPIRType::Struct &&\n\t         expr_type.pointer_depth == 1)\n\t{\n\t\treturn join(enclose_expression(expr), \".value\");\n\t}\n\telse\n\t\treturn expr;\n}\n\nstring CompilerGLSL::address_of_expression(const std::string &expr)\n{\n\tif (expr.size() > 3 && expr[0] == '(' && expr[1] == '*' && expr.back() == ')')\n\t{\n\t\t// If we have an expression which looks like (*foo), taking the address of it is the same as stripping\n\t\t// the first two and last characters. We might have to enclose the expression.\n\t\t// This doesn't work for cases like (*foo + 10),\n\t\t// but this is an r-value expression which we cannot take the address of anyways.\n\t\treturn enclose_expression(expr.substr(2, expr.size() - 3));\n\t}\n\telse if (expr.front() == '*')\n\t{\n\t\t// If this expression starts with a dereference operator ('*'), then\n\t\t// just return the part after the operator.\n\t\treturn expr.substr(1);\n\t}\n\telse\n\t\treturn join('&', enclose_expression(expr));\n}\n\n// Just like to_expression except that we enclose the expression inside parentheses if needed.\nstring CompilerGLSL::to_enclosed_expression(uint32_t id, bool register_expression_read)\n{\n\treturn enclose_expression(to_expression(id, register_expression_read));\n}\n\n// Used explicitly when we want to read a row-major expression, but without any transpose shenanigans.\n// need_transpose must be forced to false.\nstring CompilerGLSL::to_unpacked_row_major_matrix_expression(uint32_t id)\n{\n\treturn unpack_expression_type(to_expression(id), expression_type(id),\n\t                              get_extended_decoration(id, SPIRVCrossDecorationPhysicalTypeID),\n\t                              has_extended_decoration(id, SPIRVCrossDecorationPhysicalTypePacked), true);\n}\n\nstring CompilerGLSL::to_unpacked_expression(uint32_t id, bool register_expression_read)\n{\n\t// If we need to transpose, it will also take care of unpacking rules.\n\tauto *e = maybe_get<SPIRExpression>(id);\n\tbool need_transpose = e && e->need_transpose;\n\tbool is_remapped = has_extended_decoration(id, SPIRVCrossDecorationPhysicalTypeID);\n\tbool is_packed = has_extended_decoration(id, SPIRVCrossDecorationPhysicalTypePacked);\n\n\tif (!need_transpose && (is_remapped || is_packed))\n\t{\n\t\treturn unpack_expression_type(to_expression(id, register_expression_read),\n\t\t                              get_pointee_type(expression_type_id(id)),\n\t\t                              get_extended_decoration(id, SPIRVCrossDecorationPhysicalTypeID),\n\t\t                              has_extended_decoration(id, SPIRVCrossDecorationPhysicalTypePacked), false);\n\t}\n\telse\n\t\treturn to_expression(id, register_expression_read);\n}\n\nstring CompilerGLSL::to_enclosed_unpacked_expression(uint32_t id, bool register_expression_read)\n{\n\treturn enclose_expression(to_unpacked_expression(id, register_expression_read));\n}\n\nstring CompilerGLSL::to_dereferenced_expression(uint32_t id, bool register_expression_read)\n{\n\tauto &type = expression_type(id);\n\tif (type.pointer && should_dereference(id))\n\t\treturn dereference_expression(type, to_enclosed_expression(id, register_expression_read));\n\telse\n\t\treturn to_expression(id, register_expression_read);\n}\n\nstring CompilerGLSL::to_pointer_expression(uint32_t id, bool register_expression_read)\n{\n\tauto &type = expression_type(id);\n\tif (type.pointer && expression_is_lvalue(id) && !should_dereference(id))\n\t\treturn address_of_expression(to_enclosed_expression(id, register_expression_read));\n\telse\n\t\treturn to_unpacked_expression(id, register_expression_read);\n}\n\nstring CompilerGLSL::to_enclosed_pointer_expression(uint32_t id, bool register_expression_read)\n{\n\tauto &type = expression_type(id);\n\tif (type.pointer && expression_is_lvalue(id) && !should_dereference(id))\n\t\treturn address_of_expression(to_enclosed_expression(id, register_expression_read));\n\telse\n\t\treturn to_enclosed_unpacked_expression(id, register_expression_read);\n}\n\nstring CompilerGLSL::to_extract_component_expression(uint32_t id, uint32_t index)\n{\n\tauto expr = to_enclosed_expression(id);\n\tif (has_extended_decoration(id, SPIRVCrossDecorationPhysicalTypePacked))\n\t\treturn join(expr, \"[\", index, \"]\");\n\telse\n\t\treturn join(expr, \".\", index_to_swizzle(index));\n}\n\nstring CompilerGLSL::to_extract_constant_composite_expression(uint32_t result_type, const SPIRConstant &c,\n                                                              const uint32_t *chain, uint32_t length)\n{\n\t// It is kinda silly if application actually enter this path since they know the constant up front.\n\t// It is useful here to extract the plain constant directly.\n\tSPIRConstant tmp;\n\ttmp.constant_type = result_type;\n\tauto &composite_type = get<SPIRType>(c.constant_type);\n\tassert(composite_type.basetype != SPIRType::Struct && composite_type.array.empty());\n\tassert(!c.specialization);\n\n\tif (is_matrix(composite_type))\n\t{\n\t\tif (length == 2)\n\t\t{\n\t\t\ttmp.m.c[0].vecsize = 1;\n\t\t\ttmp.m.columns = 1;\n\t\t\ttmp.m.c[0].r[0] = c.m.c[chain[0]].r[chain[1]];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tassert(length == 1);\n\t\t\ttmp.m.c[0].vecsize = composite_type.vecsize;\n\t\t\ttmp.m.columns = 1;\n\t\t\ttmp.m.c[0] = c.m.c[chain[0]];\n\t\t}\n\t}\n\telse\n\t{\n\t\tassert(length == 1);\n\t\ttmp.m.c[0].vecsize = 1;\n\t\ttmp.m.columns = 1;\n\t\ttmp.m.c[0].r[0] = c.m.c[0].r[chain[0]];\n\t}\n\n\treturn constant_expression(tmp);\n}\n\nstring CompilerGLSL::to_rerolled_array_expression(const SPIRType &parent_type,\n                                                  const string &base_expr, const SPIRType &type)\n{\n\tbool remapped_boolean = parent_type.basetype == SPIRType::Struct &&\n\t                        type.basetype == SPIRType::Boolean &&\n\t                        backend.boolean_in_struct_remapped_type != SPIRType::Boolean;\n\n\tSPIRType tmp_type { OpNop };\n\tif (remapped_boolean)\n\t{\n\t\ttmp_type = get<SPIRType>(type.parent_type);\n\t\ttmp_type.basetype = backend.boolean_in_struct_remapped_type;\n\t}\n\telse if (type.basetype == SPIRType::Boolean && backend.boolean_in_struct_remapped_type != SPIRType::Boolean)\n\t{\n\t\t// It's possible that we have an r-value expression that was OpLoaded from a struct.\n\t\t// We have to reroll this and explicitly cast the input to bool, because the r-value is short.\n\t\ttmp_type = get<SPIRType>(type.parent_type);\n\t\tremapped_boolean = true;\n\t}\n\n\tuint32_t size = to_array_size_literal(type);\n\tauto &parent = get<SPIRType>(type.parent_type);\n\tstring expr = \"{ \";\n\n\tfor (uint32_t i = 0; i < size; i++)\n\t{\n\t\tauto subexpr = join(base_expr, \"[\", convert_to_string(i), \"]\");\n\t\tif (!is_array(parent))\n\t\t{\n\t\t\tif (remapped_boolean)\n\t\t\t\tsubexpr = join(type_to_glsl(tmp_type), \"(\", subexpr, \")\");\n\t\t\texpr += subexpr;\n\t\t}\n\t\telse\n\t\t\texpr += to_rerolled_array_expression(parent_type, subexpr, parent);\n\n\t\tif (i + 1 < size)\n\t\t\texpr += \", \";\n\t}\n\n\texpr += \" }\";\n\treturn expr;\n}\n\nstring CompilerGLSL::to_composite_constructor_expression(const SPIRType &parent_type, uint32_t id, bool block_like_type)\n{\n\tauto &type = expression_type(id);\n\n\tbool reroll_array = false;\n\tbool remapped_boolean = parent_type.basetype == SPIRType::Struct &&\n\t                        type.basetype == SPIRType::Boolean &&\n\t                        backend.boolean_in_struct_remapped_type != SPIRType::Boolean;\n\n\tif (is_array(type))\n\t{\n\t\treroll_array = !backend.array_is_value_type ||\n\t\t               (block_like_type && !backend.array_is_value_type_in_buffer_blocks);\n\n\t\tif (remapped_boolean)\n\t\t{\n\t\t\t// Forced to reroll if we have to change bool[] to short[].\n\t\t\treroll_array = true;\n\t\t}\n\t}\n\n\tif (reroll_array)\n\t{\n\t\t// For this case, we need to \"re-roll\" an array initializer from a temporary.\n\t\t// We cannot simply pass the array directly, since it decays to a pointer and it cannot\n\t\t// participate in a struct initializer. E.g.\n\t\t// float arr[2] = { 1.0, 2.0 };\n\t\t// Foo foo = { arr }; must be transformed to\n\t\t// Foo foo = { { arr[0], arr[1] } };\n\t\t// The array sizes cannot be deduced from specialization constants since we cannot use any loops.\n\n\t\t// We're only triggering one read of the array expression, but this is fine since arrays have to be declared\n\t\t// as temporaries anyways.\n\t\treturn to_rerolled_array_expression(parent_type, to_enclosed_expression(id), type);\n\t}\n\telse\n\t{\n\t\tauto expr = to_unpacked_expression(id);\n\t\tif (remapped_boolean)\n\t\t{\n\t\t\tauto tmp_type = type;\n\t\t\ttmp_type.basetype = backend.boolean_in_struct_remapped_type;\n\t\t\texpr = join(type_to_glsl(tmp_type), \"(\", expr, \")\");\n\t\t}\n\n\t\treturn expr;\n\t}\n}\n\nstring CompilerGLSL::to_non_uniform_aware_expression(uint32_t id)\n{\n\tstring expr = to_expression(id);\n\n\tif (has_decoration(id, DecorationNonUniform))\n\t\tconvert_non_uniform_expression(expr, id);\n\n\treturn expr;\n}\n\nstring CompilerGLSL::to_expression(uint32_t id, bool register_expression_read)\n{\n\tauto itr = invalid_expressions.find(id);\n\tif (itr != end(invalid_expressions))\n\t\thandle_invalid_expression(id);\n\n\tif (ir.ids[id].get_type() == TypeExpression)\n\t{\n\t\t// We might have a more complex chain of dependencies.\n\t\t// A possible scenario is that we\n\t\t//\n\t\t// %1 = OpLoad\n\t\t// %2 = OpDoSomething %1 %1. here %2 will have a dependency on %1.\n\t\t// %3 = OpDoSomethingAgain %2 %2. Here %3 will lose the link to %1 since we don't propagate the dependencies like that.\n\t\t// OpStore %1 %foo // Here we can invalidate %1, and hence all expressions which depend on %1. Only %2 will know since it's part of invalid_expressions.\n\t\t// %4 = OpDoSomethingAnotherTime %3 %3 // If we forward all expressions we will see %1 expression after store, not before.\n\t\t//\n\t\t// However, we can propagate up a list of depended expressions when we used %2, so we can check if %2 is invalid when reading %3 after the store,\n\t\t// and see that we should not forward reads of the original variable.\n\t\tauto &expr = get<SPIRExpression>(id);\n\t\tfor (uint32_t dep : expr.expression_dependencies)\n\t\t\tif (invalid_expressions.find(dep) != end(invalid_expressions))\n\t\t\t\thandle_invalid_expression(dep);\n\t}\n\n\tif (register_expression_read)\n\t\ttrack_expression_read(id);\n\n\tswitch (ir.ids[id].get_type())\n\t{\n\tcase TypeExpression:\n\t{\n\t\tauto &e = get<SPIRExpression>(id);\n\t\tif (e.base_expression)\n\t\t\treturn to_enclosed_expression(e.base_expression) + e.expression;\n\t\telse if (e.need_transpose)\n\t\t{\n\t\t\t// This should not be reached for access chains, since we always deal explicitly with transpose state\n\t\t\t// when consuming an access chain expression.\n\t\t\tuint32_t physical_type_id = get_extended_decoration(id, SPIRVCrossDecorationPhysicalTypeID);\n\t\t\tbool is_packed = has_extended_decoration(id, SPIRVCrossDecorationPhysicalTypePacked);\n\t\t\tbool relaxed = has_decoration(id, DecorationRelaxedPrecision);\n\t\t\treturn convert_row_major_matrix(e.expression, get<SPIRType>(e.expression_type), physical_type_id,\n\t\t\t                                is_packed, relaxed);\n\t\t}\n\t\telse if (flattened_structs.count(id))\n\t\t{\n\t\t\treturn load_flattened_struct(e.expression, get<SPIRType>(e.expression_type));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (is_forcing_recompilation())\n\t\t\t{\n\t\t\t\t// During first compilation phase, certain expression patterns can trigger exponential growth of memory.\n\t\t\t\t// Avoid this by returning dummy expressions during this phase.\n\t\t\t\t// Do not use empty expressions here, because those are sentinels for other cases.\n\t\t\t\treturn \"_\";\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn e.expression;\n\t\t}\n\t}\n\n\tcase TypeConstant:\n\t{\n\t\tauto &c = get<SPIRConstant>(id);\n\t\tauto &type = get<SPIRType>(c.constant_type);\n\n\t\t// WorkGroupSize may be a constant.\n\t\tif (has_decoration(c.self, DecorationBuiltIn))\n\t\t\treturn builtin_to_glsl(BuiltIn(get_decoration(c.self, DecorationBuiltIn)), StorageClassGeneric);\n\t\telse if (c.specialization)\n\t\t{\n\t\t\tif (backend.workgroup_size_is_hidden)\n\t\t\t{\n\t\t\t\tint wg_index = get_constant_mapping_to_workgroup_component(c);\n\t\t\t\tif (wg_index >= 0)\n\t\t\t\t{\n\t\t\t\t\tauto wg_size = join(builtin_to_glsl(BuiltInWorkgroupSize, StorageClassInput), vector_swizzle(1, wg_index));\n\t\t\t\t\tif (type.basetype != SPIRType::UInt)\n\t\t\t\t\t\twg_size = bitcast_expression(type, SPIRType::UInt, wg_size);\n\t\t\t\t\treturn wg_size;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (expression_is_forwarded(id))\n\t\t\t\treturn constant_expression(c);\n\n\t\t\treturn to_name(id);\n\t\t}\n\t\telse if (c.is_used_as_lut)\n\t\t\treturn to_name(id);\n\t\telse if (type.basetype == SPIRType::Struct && !backend.can_declare_struct_inline)\n\t\t\treturn to_name(id);\n\t\telse if (!type.array.empty() && !backend.can_declare_arrays_inline)\n\t\t\treturn to_name(id);\n\t\telse\n\t\t\treturn constant_expression(c);\n\t}\n\n\tcase TypeConstantOp:\n\t\treturn to_name(id);\n\n\tcase TypeVariable:\n\t{\n\t\tauto &var = get<SPIRVariable>(id);\n\t\t// If we try to use a loop variable before the loop header, we have to redirect it to the static expression,\n\t\t// the variable has not been declared yet.\n\t\tif (var.statically_assigned || (var.loop_variable && !var.loop_variable_enable))\n\t\t{\n\t\t\t// We might try to load from a loop variable before it has been initialized.\n\t\t\t// Prefer static expression and fallback to initializer.\n\t\t\tif (var.static_expression)\n\t\t\t\treturn to_expression(var.static_expression);\n\t\t\telse if (var.initializer)\n\t\t\t\treturn to_expression(var.initializer);\n\t\t\telse\n\t\t\t{\n\t\t\t\t// We cannot declare the variable yet, so have to fake it.\n\t\t\t\tuint32_t undef_id = ir.increase_bound_by(1);\n\t\t\t\treturn emit_uninitialized_temporary_expression(get_variable_data_type_id(var), undef_id).expression;\n\t\t\t}\n\t\t}\n\t\telse if (var.deferred_declaration)\n\t\t{\n\t\t\tvar.deferred_declaration = false;\n\t\t\treturn variable_decl(var);\n\t\t}\n\t\telse if (flattened_structs.count(id))\n\t\t{\n\t\t\treturn load_flattened_struct(to_name(id), get<SPIRType>(var.basetype));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tauto &dec = ir.meta[var.self].decoration;\n\t\t\tif (dec.builtin)\n\t\t\t\treturn builtin_to_glsl(dec.builtin_type, var.storage);\n\t\t\telse\n\t\t\t\treturn to_name(id);\n\t\t}\n\t}\n\n\tcase TypeCombinedImageSampler:\n\t\t// This type should never be taken the expression of directly.\n\t\t// The intention is that texture sampling functions will extract the image and samplers\n\t\t// separately and take their expressions as needed.\n\t\t// GLSL does not use this type because OpSampledImage immediately creates a combined image sampler\n\t\t// expression ala sampler2D(texture, sampler).\n\t\tSPIRV_CROSS_THROW(\"Combined image samplers have no default expression representation.\");\n\n\tcase TypeAccessChain:\n\t\t// We cannot express this type. They only have meaning in other OpAccessChains, OpStore or OpLoad.\n\t\tSPIRV_CROSS_THROW(\"Access chains have no default expression representation.\");\n\n\tdefault:\n\t\treturn to_name(id);\n\t}\n}\n\nSmallVector<ConstantID> CompilerGLSL::get_composite_constant_ids(ConstantID const_id)\n{\n\tif (auto *constant = maybe_get<SPIRConstant>(const_id))\n\t{\n\t\tconst auto &type = get<SPIRType>(constant->constant_type);\n\t\tif (is_array(type) || type.basetype == SPIRType::Struct)\n\t\t\treturn constant->subconstants;\n\t\tif (is_matrix(type))\n\t\t\treturn SmallVector<ConstantID>(constant->m.id);\n\t\tif (is_vector(type))\n\t\t\treturn SmallVector<ConstantID>(constant->m.c[0].id);\n\t\tSPIRV_CROSS_THROW(\"Unexpected scalar constant!\");\n\t}\n\tif (!const_composite_insert_ids.count(const_id))\n\t\tSPIRV_CROSS_THROW(\"Unimplemented for this OpSpecConstantOp!\");\n\treturn const_composite_insert_ids[const_id];\n}\n\nvoid CompilerGLSL::fill_composite_constant(SPIRConstant &constant, TypeID type_id,\n                                           const SmallVector<ConstantID> &initializers)\n{\n\tauto &type = get<SPIRType>(type_id);\n\tconstant.specialization = true;\n\tif (is_array(type) || type.basetype == SPIRType::Struct)\n\t{\n\t\tconstant.subconstants = initializers;\n\t}\n\telse if (is_matrix(type))\n\t{\n\t\tconstant.m.columns = type.columns;\n\t\tfor (uint32_t i = 0; i < type.columns; ++i)\n\t\t{\n\t\t\tconstant.m.id[i] = initializers[i];\n\t\t\tconstant.m.c[i].vecsize = type.vecsize;\n\t\t}\n\t}\n\telse if (is_vector(type))\n\t{\n\t\tconstant.m.c[0].vecsize = type.vecsize;\n\t\tfor (uint32_t i = 0; i < type.vecsize; ++i)\n\t\t\tconstant.m.c[0].id[i] = initializers[i];\n\t}\n\telse\n\t\tSPIRV_CROSS_THROW(\"Unexpected scalar in SpecConstantOp CompositeInsert!\");\n}\n\nvoid CompilerGLSL::set_composite_constant(ConstantID const_id, TypeID type_id,\n                                          const SmallVector<ConstantID> &initializers)\n{\n\tif (maybe_get<SPIRConstantOp>(const_id))\n\t{\n\t\tconst_composite_insert_ids[const_id] = initializers;\n\t\treturn;\n\t}\n\n\tauto &constant = set<SPIRConstant>(const_id, type_id);\n\tfill_composite_constant(constant, type_id, initializers);\n\tforwarded_temporaries.insert(const_id);\n}\n\nTypeID CompilerGLSL::get_composite_member_type(TypeID type_id, uint32_t member_idx)\n{\n\tauto &type = get<SPIRType>(type_id);\n\tif (is_array(type))\n\t\treturn type.parent_type;\n\tif (type.basetype == SPIRType::Struct)\n\t\treturn type.member_types[member_idx];\n\tif (is_matrix(type))\n\t\treturn type.parent_type;\n\tif (is_vector(type))\n\t\treturn type.parent_type;\n\tSPIRV_CROSS_THROW(\"Shouldn't reach lower than vector handling OpSpecConstantOp CompositeInsert!\");\n}\n\nstring CompilerGLSL::constant_op_expression(const SPIRConstantOp &cop)\n{\n\tauto &type = get<SPIRType>(cop.basetype);\n\tbool binary = false;\n\tbool unary = false;\n\tstring op;\n\n\tif (is_legacy() && is_unsigned_opcode(cop.opcode))\n\t\tSPIRV_CROSS_THROW(\"Unsigned integers are not supported on legacy targets.\");\n\n\t// TODO: Find a clean way to reuse emit_instruction.\n\tswitch (cop.opcode)\n\t{\n\tcase OpSConvert:\n\tcase OpUConvert:\n\tcase OpFConvert:\n\t\top = type_to_glsl_constructor(type);\n\t\tbreak;\n\n#define GLSL_BOP(opname, x) \\\n\tcase Op##opname:        \\\n\t\tbinary = true;      \\\n\t\top = x;             \\\n\t\tbreak\n\n#define GLSL_UOP(opname, x) \\\n\tcase Op##opname:        \\\n\t\tunary = true;       \\\n\t\top = x;             \\\n\t\tbreak\n\n\t\tGLSL_UOP(SNegate, \"-\");\n\t\tGLSL_UOP(Not, \"~\");\n\t\tGLSL_BOP(IAdd, \"+\");\n\t\tGLSL_BOP(ISub, \"-\");\n\t\tGLSL_BOP(IMul, \"*\");\n\t\tGLSL_BOP(SDiv, \"/\");\n\t\tGLSL_BOP(UDiv, \"/\");\n\t\tGLSL_BOP(UMod, \"%\");\n\t\tGLSL_BOP(SMod, \"%\");\n\t\tGLSL_BOP(ShiftRightLogical, \">>\");\n\t\tGLSL_BOP(ShiftRightArithmetic, \">>\");\n\t\tGLSL_BOP(ShiftLeftLogical, \"<<\");\n\t\tGLSL_BOP(BitwiseOr, \"|\");\n\t\tGLSL_BOP(BitwiseXor, \"^\");\n\t\tGLSL_BOP(BitwiseAnd, \"&\");\n\t\tGLSL_BOP(LogicalOr, \"||\");\n\t\tGLSL_BOP(LogicalAnd, \"&&\");\n\t\tGLSL_UOP(LogicalNot, \"!\");\n\t\tGLSL_BOP(LogicalEqual, \"==\");\n\t\tGLSL_BOP(LogicalNotEqual, \"!=\");\n\t\tGLSL_BOP(IEqual, \"==\");\n\t\tGLSL_BOP(INotEqual, \"!=\");\n\t\tGLSL_BOP(ULessThan, \"<\");\n\t\tGLSL_BOP(SLessThan, \"<\");\n\t\tGLSL_BOP(ULessThanEqual, \"<=\");\n\t\tGLSL_BOP(SLessThanEqual, \"<=\");\n\t\tGLSL_BOP(UGreaterThan, \">\");\n\t\tGLSL_BOP(SGreaterThan, \">\");\n\t\tGLSL_BOP(UGreaterThanEqual, \">=\");\n\t\tGLSL_BOP(SGreaterThanEqual, \">=\");\n\n\tcase OpSRem:\n\t{\n\t\tuint32_t op0 = cop.arguments[0];\n\t\tuint32_t op1 = cop.arguments[1];\n\t\treturn join(to_enclosed_expression(op0), \" - \", to_enclosed_expression(op1), \" * \", \"(\",\n\t\t                 to_enclosed_expression(op0), \" / \", to_enclosed_expression(op1), \")\");\n\t}\n\n\tcase OpSelect:\n\t{\n\t\tif (cop.arguments.size() < 3)\n\t\t\tSPIRV_CROSS_THROW(\"Not enough arguments to OpSpecConstantOp.\");\n\n\t\t// This one is pretty annoying. It's triggered from\n\t\t// uint(bool), int(bool) from spec constants.\n\t\t// In order to preserve its compile-time constness in Vulkan GLSL,\n\t\t// we need to reduce the OpSelect expression back to this simplified model.\n\t\t// If we cannot, fail.\n\t\tif (to_trivial_mix_op(type, op, cop.arguments[2], cop.arguments[1], cop.arguments[0]))\n\t\t{\n\t\t\t// Implement as a simple cast down below.\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Implement a ternary and pray the compiler understands it :)\n\t\t\treturn to_ternary_expression(type, cop.arguments[0], cop.arguments[1], cop.arguments[2]);\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpVectorShuffle:\n\t{\n\t\tstring expr = type_to_glsl_constructor(type);\n\t\texpr += \"(\";\n\n\t\tuint32_t left_components = expression_type(cop.arguments[0]).vecsize;\n\t\tstring left_arg = to_enclosed_expression(cop.arguments[0]);\n\t\tstring right_arg = to_enclosed_expression(cop.arguments[1]);\n\n\t\tfor (uint32_t i = 2; i < uint32_t(cop.arguments.size()); i++)\n\t\t{\n\t\t\tuint32_t index = cop.arguments[i];\n\t\t\tif (index == 0xFFFFFFFF)\n\t\t\t{\n\t\t\t\tSPIRConstant c;\n\t\t\t\tc.constant_type = type.parent_type;\n\t\t\t\tassert(type.parent_type != ID(0));\n\t\t\t\texpr += constant_expression(c);\n\t\t\t}\n\t\t\telse if (index >= left_components)\n\t\t\t{\n\t\t\t\texpr += right_arg + \".\" + \"xyzw\"[index - left_components];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\texpr += left_arg + \".\" + \"xyzw\"[index];\n\t\t\t}\n\n\t\t\tif (i + 1 < uint32_t(cop.arguments.size()))\n\t\t\t\texpr += \", \";\n\t\t}\n\n\t\texpr += \")\";\n\t\treturn expr;\n\t}\n\n\tcase OpCompositeExtract:\n\t{\n\t\tauto expr = access_chain_internal(cop.arguments[0], &cop.arguments[1], uint32_t(cop.arguments.size() - 1),\n\t\t                                  ACCESS_CHAIN_INDEX_IS_LITERAL_BIT, nullptr);\n\t\treturn expr;\n\t}\n\n\tcase OpCompositeInsert:\n\t{\n\t\tSmallVector<ConstantID> new_init = get_composite_constant_ids(cop.arguments[1]);\n\t\tuint32_t idx;\n\t\tuint32_t target_id = cop.self;\n\t\tuint32_t target_type_id = cop.basetype;\n\t\t// We have to drill down to the part we want to modify, and create new\n\t\t// constants for each containing part.\n\t\tfor (idx = 2; idx < cop.arguments.size() - 1; ++idx)\n\t\t{\n\t\t\tuint32_t new_const = ir.increase_bound_by(1);\n\t\t\tuint32_t old_const = new_init[cop.arguments[idx]];\n\t\t\tnew_init[cop.arguments[idx]] = new_const;\n\t\t\tset_composite_constant(target_id, target_type_id, new_init);\n\t\t\tnew_init = get_composite_constant_ids(old_const);\n\t\t\ttarget_id = new_const;\n\t\t\ttarget_type_id = get_composite_member_type(target_type_id, cop.arguments[idx]);\n\t\t}\n\t\t// Now replace the initializer with the one from this instruction.\n\t\tnew_init[cop.arguments[idx]] = cop.arguments[0];\n\t\tset_composite_constant(target_id, target_type_id, new_init);\n\t\tSPIRConstant tmp_const(cop.basetype);\n\t\tfill_composite_constant(tmp_const, cop.basetype, const_composite_insert_ids[cop.self]);\n\t\treturn constant_expression(tmp_const);\n\t}\n\n\tdefault:\n\t\t// Some opcodes are unimplemented here, these are currently not possible to test from glslang.\n\t\tSPIRV_CROSS_THROW(\"Unimplemented spec constant op.\");\n\t}\n\n\tuint32_t bit_width = 0;\n\tif (unary || binary || cop.opcode == OpSConvert || cop.opcode == OpUConvert)\n\t\tbit_width = expression_type(cop.arguments[0]).width;\n\n\tSPIRType::BaseType input_type;\n\tbool skip_cast_if_equal_type = opcode_is_sign_invariant(cop.opcode);\n\n\tswitch (cop.opcode)\n\t{\n\tcase OpIEqual:\n\tcase OpINotEqual:\n\t\tinput_type = to_signed_basetype(bit_width);\n\t\tbreak;\n\n\tcase OpSLessThan:\n\tcase OpSLessThanEqual:\n\tcase OpSGreaterThan:\n\tcase OpSGreaterThanEqual:\n\tcase OpSMod:\n\tcase OpSDiv:\n\tcase OpShiftRightArithmetic:\n\tcase OpSConvert:\n\tcase OpSNegate:\n\t\tinput_type = to_signed_basetype(bit_width);\n\t\tbreak;\n\n\tcase OpULessThan:\n\tcase OpULessThanEqual:\n\tcase OpUGreaterThan:\n\tcase OpUGreaterThanEqual:\n\tcase OpUMod:\n\tcase OpUDiv:\n\tcase OpShiftRightLogical:\n\tcase OpUConvert:\n\t\tinput_type = to_unsigned_basetype(bit_width);\n\t\tbreak;\n\n\tdefault:\n\t\tinput_type = type.basetype;\n\t\tbreak;\n\t}\n\n#undef GLSL_BOP\n#undef GLSL_UOP\n\tif (binary)\n\t{\n\t\tif (cop.arguments.size() < 2)\n\t\t\tSPIRV_CROSS_THROW(\"Not enough arguments to OpSpecConstantOp.\");\n\n\t\tstring cast_op0;\n\t\tstring cast_op1;\n\t\tauto expected_type = binary_op_bitcast_helper(cast_op0, cast_op1, input_type, cop.arguments[0],\n\t\t                                              cop.arguments[1], skip_cast_if_equal_type);\n\n\t\tif (type.basetype != input_type && type.basetype != SPIRType::Boolean)\n\t\t{\n\t\t\texpected_type.basetype = input_type;\n\t\t\tauto expr = bitcast_glsl_op(type, expected_type);\n\t\t\texpr += '(';\n\t\t\texpr += join(cast_op0, \" \", op, \" \", cast_op1);\n\t\t\texpr += ')';\n\t\t\treturn expr;\n\t\t}\n\t\telse\n\t\t\treturn join(\"(\", cast_op0, \" \", op, \" \", cast_op1, \")\");\n\t}\n\telse if (unary)\n\t{\n\t\tif (cop.arguments.size() < 1)\n\t\t\tSPIRV_CROSS_THROW(\"Not enough arguments to OpSpecConstantOp.\");\n\n\t\t// Auto-bitcast to result type as needed.\n\t\t// Works around various casting scenarios in glslang as there is no OpBitcast for specialization constants.\n\t\treturn join(\"(\", op, bitcast_glsl(type, cop.arguments[0]), \")\");\n\t}\n\telse if (cop.opcode == OpSConvert || cop.opcode == OpUConvert)\n\t{\n\t\tif (cop.arguments.size() < 1)\n\t\t\tSPIRV_CROSS_THROW(\"Not enough arguments to OpSpecConstantOp.\");\n\n\t\tauto &arg_type = expression_type(cop.arguments[0]);\n\t\tif (arg_type.width < type.width && input_type != arg_type.basetype)\n\t\t{\n\t\t\tauto expected = arg_type;\n\t\t\texpected.basetype = input_type;\n\t\t\treturn join(op, \"(\", bitcast_glsl(expected, cop.arguments[0]), \")\");\n\t\t}\n\t\telse\n\t\t\treturn join(op, \"(\", to_expression(cop.arguments[0]), \")\");\n\t}\n\telse\n\t{\n\t\tif (cop.arguments.size() < 1)\n\t\t\tSPIRV_CROSS_THROW(\"Not enough arguments to OpSpecConstantOp.\");\n\t\treturn join(op, \"(\", to_expression(cop.arguments[0]), \")\");\n\t}\n}\n\nstring CompilerGLSL::constant_expression(const SPIRConstant &c,\n                                         bool inside_block_like_struct_scope,\n                                         bool inside_struct_scope)\n{\n\tauto &type = get<SPIRType>(c.constant_type);\n\n\tif (is_pointer(type))\n\t{\n\t\treturn backend.null_pointer_literal;\n\t}\n\telse if (!c.subconstants.empty())\n\t{\n\t\t// Handles Arrays and structures.\n\t\tstring res;\n\n\t\t// Only consider the decay if we are inside a struct scope where we are emitting a member with Offset decoration.\n\t\t// Outside a block-like struct declaration, we can always bind to a constant array with templated type.\n\t\t// Should look at ArrayStride here as well, but it's possible to declare a constant struct\n\t\t// with Offset = 0, using no ArrayStride on the enclosed array type.\n\t\t// A particular CTS test hits this scenario.\n\t\tbool array_type_decays = inside_block_like_struct_scope &&\n\t\t                         is_array(type) &&\n\t\t                         !backend.array_is_value_type_in_buffer_blocks;\n\n\t\t// Allow Metal to use the array<T> template to make arrays a value type\n\t\tbool needs_trailing_tracket = false;\n\t\tif (backend.use_initializer_list && backend.use_typed_initializer_list && type.basetype == SPIRType::Struct &&\n\t\t    !is_array(type))\n\t\t{\n\t\t\tres = type_to_glsl_constructor(type) + \"{ \";\n\t\t}\n\t\telse if (backend.use_initializer_list && backend.use_typed_initializer_list && backend.array_is_value_type &&\n\t\t         is_array(type) && !array_type_decays)\n\t\t{\n\t\t\tconst auto *p_type = &type;\n\t\t\tSPIRType tmp_type { OpNop };\n\n\t\t\tif (inside_struct_scope &&\n\t\t\t    backend.boolean_in_struct_remapped_type != SPIRType::Boolean &&\n\t\t\t    type.basetype == SPIRType::Boolean)\n\t\t\t{\n\t\t\t\ttmp_type = type;\n\t\t\t\ttmp_type.basetype = backend.boolean_in_struct_remapped_type;\n\t\t\t\tp_type = &tmp_type;\n\t\t\t}\n\n\t\t\tres = type_to_glsl_constructor(*p_type) + \"({ \";\n\t\t\tneeds_trailing_tracket = true;\n\t\t}\n\t\telse if (backend.use_initializer_list)\n\t\t{\n\t\t\tres = \"{ \";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tres = type_to_glsl_constructor(type) + \"(\";\n\t\t}\n\n\t\tuint32_t subconstant_index = 0;\n\t\tfor (auto &elem : c.subconstants)\n\t\t{\n\t\t\tif (auto *op = maybe_get<SPIRConstantOp>(elem))\n\t\t\t{\n\t\t\t\tres += constant_op_expression(*op);\n\t\t\t}\n\t\t\telse if (maybe_get<SPIRUndef>(elem) != nullptr)\n\t\t\t{\n\t\t\t\tres += to_name(elem);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tauto &subc = get<SPIRConstant>(elem);\n\t\t\t\tif (subc.specialization && !expression_is_forwarded(elem))\n\t\t\t\t\tres += to_name(elem);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (!is_array(type) && type.basetype == SPIRType::Struct)\n\t\t\t\t\t{\n\t\t\t\t\t\t// When we get down to emitting struct members, override the block-like information.\n\t\t\t\t\t\t// For constants, we can freely mix and match block-like state.\n\t\t\t\t\t\tinside_block_like_struct_scope =\n\t\t\t\t\t\t    has_member_decoration(type.self, subconstant_index, DecorationOffset);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (type.basetype == SPIRType::Struct)\n\t\t\t\t\t\tinside_struct_scope = true;\n\n\t\t\t\t\tres += constant_expression(subc, inside_block_like_struct_scope, inside_struct_scope);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (&elem != &c.subconstants.back())\n\t\t\t\tres += \", \";\n\n\t\t\tsubconstant_index++;\n\t\t}\n\n\t\tres += backend.use_initializer_list ? \" }\" : \")\";\n\t\tif (needs_trailing_tracket)\n\t\t\tres += \")\";\n\n\t\treturn res;\n\t}\n\telse if (type.basetype == SPIRType::Struct && type.member_types.size() == 0)\n\t{\n\t\t// Metal tessellation likes empty structs which are then constant expressions.\n\t\tif (backend.supports_empty_struct)\n\t\t\treturn \"{ }\";\n\t\telse if (backend.use_typed_initializer_list)\n\t\t\treturn join(type_to_glsl(type), \"{ 0 }\");\n\t\telse if (backend.use_initializer_list)\n\t\t\treturn \"{ 0 }\";\n\t\telse\n\t\t\treturn join(type_to_glsl(type), \"(0)\");\n\t}\n\telse if (c.columns() == 1)\n\t{\n\t\tauto res = constant_expression_vector(c, 0);\n\n\t\tif (inside_struct_scope &&\n\t\t    backend.boolean_in_struct_remapped_type != SPIRType::Boolean &&\n\t\t    type.basetype == SPIRType::Boolean)\n\t\t{\n\t\t\tSPIRType tmp_type = type;\n\t\t\ttmp_type.basetype = backend.boolean_in_struct_remapped_type;\n\t\t\tres = join(type_to_glsl(tmp_type), \"(\", res, \")\");\n\t\t}\n\n\t\treturn res;\n\t}\n\telse\n\t{\n\t\tstring res = type_to_glsl(type) + \"(\";\n\t\tfor (uint32_t col = 0; col < c.columns(); col++)\n\t\t{\n\t\t\tif (c.specialization_constant_id(col) != 0)\n\t\t\t\tres += to_name(c.specialization_constant_id(col));\n\t\t\telse\n\t\t\t\tres += constant_expression_vector(c, col);\n\n\t\t\tif (col + 1 < c.columns())\n\t\t\t\tres += \", \";\n\t\t}\n\t\tres += \")\";\n\n\t\tif (inside_struct_scope &&\n\t\t    backend.boolean_in_struct_remapped_type != SPIRType::Boolean &&\n\t\t    type.basetype == SPIRType::Boolean)\n\t\t{\n\t\t\tSPIRType tmp_type = type;\n\t\t\ttmp_type.basetype = backend.boolean_in_struct_remapped_type;\n\t\t\tres = join(type_to_glsl(tmp_type), \"(\", res, \")\");\n\t\t}\n\n\t\treturn res;\n\t}\n}\n\n#ifdef _MSC_VER\n// snprintf does not exist or is buggy on older MSVC versions, some of them\n// being used by MinGW. Use sprintf instead and disable corresponding warning.\n#pragma warning(push)\n#pragma warning(disable : 4996)\n#endif\n\nstring CompilerGLSL::convert_half_to_string(const SPIRConstant &c, uint32_t col, uint32_t row)\n{\n\tstring res;\n\tfloat float_value = c.scalar_f16(col, row);\n\n\t// There is no literal \"hf\" in GL_NV_gpu_shader5, so to avoid lots\n\t// of complicated workarounds, just value-cast to the half type always.\n\tif (std::isnan(float_value) || std::isinf(float_value))\n\t{\n\t\tSPIRType type { OpTypeFloat };\n\t\ttype.basetype = SPIRType::Half;\n\t\ttype.vecsize = 1;\n\t\ttype.columns = 1;\n\n\t\tif (float_value == numeric_limits<float>::infinity())\n\t\t\tres = join(type_to_glsl(type), \"(1.0 / 0.0)\");\n\t\telse if (float_value == -numeric_limits<float>::infinity())\n\t\t\tres = join(type_to_glsl(type), \"(-1.0 / 0.0)\");\n\t\telse if (std::isnan(float_value))\n\t\t\tres = join(type_to_glsl(type), \"(0.0 / 0.0)\");\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"Cannot represent non-finite floating point constant.\");\n\t}\n\telse\n\t{\n\t\tSPIRType type { OpTypeFloat };\n\t\ttype.basetype = SPIRType::Half;\n\t\ttype.vecsize = 1;\n\t\ttype.columns = 1;\n\t\tres = join(type_to_glsl(type), \"(\", format_float(float_value), \")\");\n\t}\n\n\treturn res;\n}\n\nstring CompilerGLSL::convert_float_to_string(const SPIRConstant &c, uint32_t col, uint32_t row)\n{\n\tstring res;\n\tfloat float_value = c.scalar_f32(col, row);\n\n\tif (std::isnan(float_value) || std::isinf(float_value))\n\t{\n\t\t// Use special representation.\n\t\tif (!is_legacy())\n\t\t{\n\t\t\tSPIRType out_type { OpTypeFloat };\n\t\t\tSPIRType in_type { OpTypeInt };\n\t\t\tout_type.basetype = SPIRType::Float;\n\t\t\tin_type.basetype = SPIRType::UInt;\n\t\t\tout_type.vecsize = 1;\n\t\t\tin_type.vecsize = 1;\n\t\t\tout_type.width = 32;\n\t\t\tin_type.width = 32;\n\n\t\t\tchar print_buffer[32];\n#ifdef _WIN32\n\t\t\tsprintf(print_buffer, \"0x%xu\", c.scalar(col, row));\n#else\n\t\t\tsnprintf(print_buffer, sizeof(print_buffer), \"0x%xu\", c.scalar(col, row));\n#endif\n\n\t\t\tconst char *comment = \"inf\";\n\t\t\tif (float_value == -numeric_limits<float>::infinity())\n\t\t\t\tcomment = \"-inf\";\n\t\t\telse if (std::isnan(float_value))\n\t\t\t\tcomment = \"nan\";\n\t\t\tres = join(bitcast_glsl_op(out_type, in_type), \"(\", print_buffer, \" /* \", comment, \" */)\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (float_value == numeric_limits<float>::infinity())\n\t\t\t{\n\t\t\t\tif (backend.float_literal_suffix)\n\t\t\t\t\tres = \"(1.0f / 0.0f)\";\n\t\t\t\telse\n\t\t\t\t\tres = \"(1.0 / 0.0)\";\n\t\t\t}\n\t\t\telse if (float_value == -numeric_limits<float>::infinity())\n\t\t\t{\n\t\t\t\tif (backend.float_literal_suffix)\n\t\t\t\t\tres = \"(-1.0f / 0.0f)\";\n\t\t\t\telse\n\t\t\t\t\tres = \"(-1.0 / 0.0)\";\n\t\t\t}\n\t\t\telse if (std::isnan(float_value))\n\t\t\t{\n\t\t\t\tif (backend.float_literal_suffix)\n\t\t\t\t\tres = \"(0.0f / 0.0f)\";\n\t\t\t\telse\n\t\t\t\t\tres = \"(0.0 / 0.0)\";\n\t\t\t}\n\t\t\telse\n\t\t\t\tSPIRV_CROSS_THROW(\"Cannot represent non-finite floating point constant.\");\n\t\t}\n\t}\n\telse\n\t{\n\t\tres = format_float(float_value);\n\t\tif (backend.float_literal_suffix)\n\t\t\tres += \"f\";\n\t}\n\n\treturn res;\n}\n\nstd::string CompilerGLSL::convert_double_to_string(const SPIRConstant &c, uint32_t col, uint32_t row)\n{\n\tstring res;\n\tdouble double_value = c.scalar_f64(col, row);\n\n\tif (std::isnan(double_value) || std::isinf(double_value))\n\t{\n\t\t// Use special representation.\n\t\tif (!is_legacy())\n\t\t{\n\t\t\tSPIRType out_type { OpTypeFloat };\n\t\t\tSPIRType in_type { OpTypeInt };\n\t\t\tout_type.basetype = SPIRType::Double;\n\t\t\tin_type.basetype = SPIRType::UInt64;\n\t\t\tout_type.vecsize = 1;\n\t\t\tin_type.vecsize = 1;\n\t\t\tout_type.width = 64;\n\t\t\tin_type.width = 64;\n\n\t\t\tuint64_t u64_value = c.scalar_u64(col, row);\n\n\t\t\tif (options.es && options.version < 310) // GL_NV_gpu_shader5 fallback requires 310.\n\t\t\t\tSPIRV_CROSS_THROW(\"64-bit integers not supported in ES profile before version 310.\");\n\t\t\trequire_extension_internal(\"GL_ARB_gpu_shader_int64\");\n\n\t\t\tchar print_buffer[64];\n#ifdef _WIN32\n\t\t\tsprintf(print_buffer, \"0x%llx%s\", static_cast<unsigned long long>(u64_value),\n\t\t\t        backend.long_long_literal_suffix ? \"ull\" : \"ul\");\n#else\n\t\t\tsnprintf(print_buffer, sizeof(print_buffer), \"0x%llx%s\", static_cast<unsigned long long>(u64_value),\n\t\t\t         backend.long_long_literal_suffix ? \"ull\" : \"ul\");\n#endif\n\n\t\t\tconst char *comment = \"inf\";\n\t\t\tif (double_value == -numeric_limits<double>::infinity())\n\t\t\t\tcomment = \"-inf\";\n\t\t\telse if (std::isnan(double_value))\n\t\t\t\tcomment = \"nan\";\n\t\t\tres = join(bitcast_glsl_op(out_type, in_type), \"(\", print_buffer, \" /* \", comment, \" */)\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (options.es)\n\t\t\t\tSPIRV_CROSS_THROW(\"FP64 not supported in ES profile.\");\n\t\t\tif (options.version < 400)\n\t\t\t\trequire_extension_internal(\"GL_ARB_gpu_shader_fp64\");\n\n\t\t\tif (double_value == numeric_limits<double>::infinity())\n\t\t\t{\n\t\t\t\tif (backend.double_literal_suffix)\n\t\t\t\t\tres = \"(1.0lf / 0.0lf)\";\n\t\t\t\telse\n\t\t\t\t\tres = \"(1.0 / 0.0)\";\n\t\t\t}\n\t\t\telse if (double_value == -numeric_limits<double>::infinity())\n\t\t\t{\n\t\t\t\tif (backend.double_literal_suffix)\n\t\t\t\t\tres = \"(-1.0lf / 0.0lf)\";\n\t\t\t\telse\n\t\t\t\t\tres = \"(-1.0 / 0.0)\";\n\t\t\t}\n\t\t\telse if (std::isnan(double_value))\n\t\t\t{\n\t\t\t\tif (backend.double_literal_suffix)\n\t\t\t\t\tres = \"(0.0lf / 0.0lf)\";\n\t\t\t\telse\n\t\t\t\t\tres = \"(0.0 / 0.0)\";\n\t\t\t}\n\t\t\telse\n\t\t\t\tSPIRV_CROSS_THROW(\"Cannot represent non-finite floating point constant.\");\n\t\t}\n\t}\n\telse\n\t{\n\t\tres = format_double(double_value);\n\t\tif (backend.double_literal_suffix)\n\t\t\tres += \"lf\";\n\t}\n\n\treturn res;\n}\n\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n\nstring CompilerGLSL::constant_expression_vector(const SPIRConstant &c, uint32_t vector)\n{\n\tauto type = get<SPIRType>(c.constant_type);\n\ttype.columns = 1;\n\n\tauto scalar_type = type;\n\tscalar_type.vecsize = 1;\n\n\tstring res;\n\tbool splat = backend.use_constructor_splatting && c.vector_size() > 1;\n\tbool swizzle_splat = backend.can_swizzle_scalar && c.vector_size() > 1;\n\n\tif (!type_is_floating_point(type))\n\t{\n\t\t// Cannot swizzle literal integers as a special case.\n\t\tswizzle_splat = false;\n\t}\n\n\tif (splat || swizzle_splat)\n\t{\n\t\t// Cannot use constant splatting if we have specialization constants somewhere in the vector.\n\t\tfor (uint32_t i = 0; i < c.vector_size(); i++)\n\t\t{\n\t\t\tif (c.specialization_constant_id(vector, i) != 0)\n\t\t\t{\n\t\t\t\tsplat = false;\n\t\t\t\tswizzle_splat = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (splat || swizzle_splat)\n\t{\n\t\tif (type.width == 64)\n\t\t{\n\t\t\tuint64_t ident = c.scalar_u64(vector, 0);\n\t\t\tfor (uint32_t i = 1; i < c.vector_size(); i++)\n\t\t\t{\n\t\t\t\tif (ident != c.scalar_u64(vector, i))\n\t\t\t\t{\n\t\t\t\t\tsplat = false;\n\t\t\t\t\tswizzle_splat = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tuint32_t ident = c.scalar(vector, 0);\n\t\t\tfor (uint32_t i = 1; i < c.vector_size(); i++)\n\t\t\t{\n\t\t\t\tif (ident != c.scalar(vector, i))\n\t\t\t\t{\n\t\t\t\t\tsplat = false;\n\t\t\t\t\tswizzle_splat = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (c.vector_size() > 1 && !swizzle_splat)\n\t\tres += type_to_glsl(type) + \"(\";\n\n\tswitch (type.basetype)\n\t{\n\tcase SPIRType::Half:\n\t\tif (splat || swizzle_splat)\n\t\t{\n\t\t\tres += convert_half_to_string(c, vector, 0);\n\t\t\tif (swizzle_splat)\n\t\t\t\tres = remap_swizzle(get<SPIRType>(c.constant_type), 1, res);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (uint32_t i = 0; i < c.vector_size(); i++)\n\t\t\t{\n\t\t\t\tif (c.vector_size() > 1 && c.specialization_constant_id(vector, i) != 0)\n\t\t\t\t\tres += to_expression(c.specialization_constant_id(vector, i));\n\t\t\t\telse\n\t\t\t\t\tres += convert_half_to_string(c, vector, i);\n\n\t\t\t\tif (i + 1 < c.vector_size())\n\t\t\t\t\tres += \", \";\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase SPIRType::Float:\n\t\tif (splat || swizzle_splat)\n\t\t{\n\t\t\tres += convert_float_to_string(c, vector, 0);\n\t\t\tif (swizzle_splat)\n\t\t\t\tres = remap_swizzle(get<SPIRType>(c.constant_type), 1, res);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (uint32_t i = 0; i < c.vector_size(); i++)\n\t\t\t{\n\t\t\t\tif (c.vector_size() > 1 && c.specialization_constant_id(vector, i) != 0)\n\t\t\t\t\tres += to_expression(c.specialization_constant_id(vector, i));\n\t\t\t\telse\n\t\t\t\t\tres += convert_float_to_string(c, vector, i);\n\n\t\t\t\tif (i + 1 < c.vector_size())\n\t\t\t\t\tres += \", \";\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase SPIRType::Double:\n\t\tif (splat || swizzle_splat)\n\t\t{\n\t\t\tres += convert_double_to_string(c, vector, 0);\n\t\t\tif (swizzle_splat)\n\t\t\t\tres = remap_swizzle(get<SPIRType>(c.constant_type), 1, res);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (uint32_t i = 0; i < c.vector_size(); i++)\n\t\t\t{\n\t\t\t\tif (c.vector_size() > 1 && c.specialization_constant_id(vector, i) != 0)\n\t\t\t\t\tres += to_expression(c.specialization_constant_id(vector, i));\n\t\t\t\telse\n\t\t\t\t\tres += convert_double_to_string(c, vector, i);\n\n\t\t\t\tif (i + 1 < c.vector_size())\n\t\t\t\t\tres += \", \";\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase SPIRType::Int64:\n\t{\n\t\tauto tmp = type;\n\t\ttmp.vecsize = 1;\n\t\ttmp.columns = 1;\n\t\tauto int64_type = type_to_glsl(tmp);\n\n\t\tif (splat)\n\t\t{\n\t\t\tres += convert_to_string(c.scalar_i64(vector, 0), int64_type, backend.long_long_literal_suffix);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (uint32_t i = 0; i < c.vector_size(); i++)\n\t\t\t{\n\t\t\t\tif (c.vector_size() > 1 && c.specialization_constant_id(vector, i) != 0)\n\t\t\t\t\tres += to_expression(c.specialization_constant_id(vector, i));\n\t\t\t\telse\n\t\t\t\t\tres += convert_to_string(c.scalar_i64(vector, i), int64_type, backend.long_long_literal_suffix);\n\n\t\t\t\tif (i + 1 < c.vector_size())\n\t\t\t\t\tres += \", \";\n\t\t\t}\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase SPIRType::UInt64:\n\t\tif (splat)\n\t\t{\n\t\t\tres += convert_to_string(c.scalar_u64(vector, 0));\n\t\t\tif (backend.long_long_literal_suffix)\n\t\t\t\tres += \"ull\";\n\t\t\telse\n\t\t\t\tres += \"ul\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (uint32_t i = 0; i < c.vector_size(); i++)\n\t\t\t{\n\t\t\t\tif (c.vector_size() > 1 && c.specialization_constant_id(vector, i) != 0)\n\t\t\t\t\tres += to_expression(c.specialization_constant_id(vector, i));\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tres += convert_to_string(c.scalar_u64(vector, i));\n\t\t\t\t\tif (backend.long_long_literal_suffix)\n\t\t\t\t\t\tres += \"ull\";\n\t\t\t\t\telse\n\t\t\t\t\t\tres += \"ul\";\n\t\t\t\t}\n\n\t\t\t\tif (i + 1 < c.vector_size())\n\t\t\t\t\tres += \", \";\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase SPIRType::UInt:\n\t\tif (splat)\n\t\t{\n\t\t\tres += convert_to_string(c.scalar(vector, 0));\n\t\t\tif (is_legacy())\n\t\t\t{\n\t\t\t\t// Fake unsigned constant literals with signed ones if possible.\n\t\t\t\t// Things like array sizes, etc, tend to be unsigned even though they could just as easily be signed.\n\t\t\t\tif (c.scalar_i32(vector, 0) < 0)\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Tried to convert uint literal into int, but this made the literal negative.\");\n\t\t\t}\n\t\t\telse if (backend.uint32_t_literal_suffix)\n\t\t\t\tres += \"u\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (uint32_t i = 0; i < c.vector_size(); i++)\n\t\t\t{\n\t\t\t\tif (c.vector_size() > 1 && c.specialization_constant_id(vector, i) != 0)\n\t\t\t\t\tres += to_expression(c.specialization_constant_id(vector, i));\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tres += convert_to_string(c.scalar(vector, i));\n\t\t\t\t\tif (is_legacy())\n\t\t\t\t\t{\n\t\t\t\t\t\t// Fake unsigned constant literals with signed ones if possible.\n\t\t\t\t\t\t// Things like array sizes, etc, tend to be unsigned even though they could just as easily be signed.\n\t\t\t\t\t\tif (c.scalar_i32(vector, i) < 0)\n\t\t\t\t\t\t\tSPIRV_CROSS_THROW(\"Tried to convert uint literal into int, but this made \"\n\t\t\t\t\t\t\t                  \"the literal negative.\");\n\t\t\t\t\t}\n\t\t\t\t\telse if (backend.uint32_t_literal_suffix)\n\t\t\t\t\t\tres += \"u\";\n\t\t\t\t}\n\n\t\t\t\tif (i + 1 < c.vector_size())\n\t\t\t\t\tres += \", \";\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase SPIRType::Int:\n\t\tif (splat)\n\t\t\tres += convert_to_string(c.scalar_i32(vector, 0));\n\t\telse\n\t\t{\n\t\t\tfor (uint32_t i = 0; i < c.vector_size(); i++)\n\t\t\t{\n\t\t\t\tif (c.vector_size() > 1 && c.specialization_constant_id(vector, i) != 0)\n\t\t\t\t\tres += to_expression(c.specialization_constant_id(vector, i));\n\t\t\t\telse\n\t\t\t\t\tres += convert_to_string(c.scalar_i32(vector, i));\n\t\t\t\tif (i + 1 < c.vector_size())\n\t\t\t\t\tres += \", \";\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase SPIRType::UShort:\n\t\tif (splat)\n\t\t{\n\t\t\tres += convert_to_string(c.scalar(vector, 0));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (uint32_t i = 0; i < c.vector_size(); i++)\n\t\t\t{\n\t\t\t\tif (c.vector_size() > 1 && c.specialization_constant_id(vector, i) != 0)\n\t\t\t\t\tres += to_expression(c.specialization_constant_id(vector, i));\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (*backend.uint16_t_literal_suffix)\n\t\t\t\t\t{\n\t\t\t\t\t\tres += convert_to_string(c.scalar_u16(vector, i));\n\t\t\t\t\t\tres += backend.uint16_t_literal_suffix;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// If backend doesn't have a literal suffix, we need to value cast.\n\t\t\t\t\t\tres += type_to_glsl(scalar_type);\n\t\t\t\t\t\tres += \"(\";\n\t\t\t\t\t\tres += convert_to_string(c.scalar_u16(vector, i));\n\t\t\t\t\t\tres += \")\";\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (i + 1 < c.vector_size())\n\t\t\t\t\tres += \", \";\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase SPIRType::Short:\n\t\tif (splat)\n\t\t{\n\t\t\tres += convert_to_string(c.scalar_i16(vector, 0));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (uint32_t i = 0; i < c.vector_size(); i++)\n\t\t\t{\n\t\t\t\tif (c.vector_size() > 1 && c.specialization_constant_id(vector, i) != 0)\n\t\t\t\t\tres += to_expression(c.specialization_constant_id(vector, i));\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (*backend.int16_t_literal_suffix)\n\t\t\t\t\t{\n\t\t\t\t\t\tres += convert_to_string(c.scalar_i16(vector, i));\n\t\t\t\t\t\tres += backend.int16_t_literal_suffix;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// If backend doesn't have a literal suffix, we need to value cast.\n\t\t\t\t\t\tres += type_to_glsl(scalar_type);\n\t\t\t\t\t\tres += \"(\";\n\t\t\t\t\t\tres += convert_to_string(c.scalar_i16(vector, i));\n\t\t\t\t\t\tres += \")\";\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (i + 1 < c.vector_size())\n\t\t\t\t\tres += \", \";\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase SPIRType::UByte:\n\t\tif (splat)\n\t\t{\n\t\t\tres += convert_to_string(c.scalar_u8(vector, 0));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (uint32_t i = 0; i < c.vector_size(); i++)\n\t\t\t{\n\t\t\t\tif (c.vector_size() > 1 && c.specialization_constant_id(vector, i) != 0)\n\t\t\t\t\tres += to_expression(c.specialization_constant_id(vector, i));\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tres += type_to_glsl(scalar_type);\n\t\t\t\t\tres += \"(\";\n\t\t\t\t\tres += convert_to_string(c.scalar_u8(vector, i));\n\t\t\t\t\tres += \")\";\n\t\t\t\t}\n\n\t\t\t\tif (i + 1 < c.vector_size())\n\t\t\t\t\tres += \", \";\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase SPIRType::SByte:\n\t\tif (splat)\n\t\t{\n\t\t\tres += convert_to_string(c.scalar_i8(vector, 0));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (uint32_t i = 0; i < c.vector_size(); i++)\n\t\t\t{\n\t\t\t\tif (c.vector_size() > 1 && c.specialization_constant_id(vector, i) != 0)\n\t\t\t\t\tres += to_expression(c.specialization_constant_id(vector, i));\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tres += type_to_glsl(scalar_type);\n\t\t\t\t\tres += \"(\";\n\t\t\t\t\tres += convert_to_string(c.scalar_i8(vector, i));\n\t\t\t\t\tres += \")\";\n\t\t\t\t}\n\n\t\t\t\tif (i + 1 < c.vector_size())\n\t\t\t\t\tres += \", \";\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase SPIRType::Boolean:\n\t\tif (splat)\n\t\t\tres += c.scalar(vector, 0) ? \"true\" : \"false\";\n\t\telse\n\t\t{\n\t\t\tfor (uint32_t i = 0; i < c.vector_size(); i++)\n\t\t\t{\n\t\t\t\tif (c.vector_size() > 1 && c.specialization_constant_id(vector, i) != 0)\n\t\t\t\t\tres += to_expression(c.specialization_constant_id(vector, i));\n\t\t\t\telse\n\t\t\t\t\tres += c.scalar(vector, i) ? \"true\" : \"false\";\n\n\t\t\t\tif (i + 1 < c.vector_size())\n\t\t\t\t\tres += \", \";\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Invalid constant expression basetype.\");\n\t}\n\n\tif (c.vector_size() > 1 && !swizzle_splat)\n\t\tres += \")\";\n\n\treturn res;\n}\n\nSPIRExpression &CompilerGLSL::emit_uninitialized_temporary_expression(uint32_t type, uint32_t id)\n{\n\tforced_temporaries.insert(id);\n\temit_uninitialized_temporary(type, id);\n\treturn set<SPIRExpression>(id, to_name(id), type, true);\n}\n\nvoid CompilerGLSL::emit_uninitialized_temporary(uint32_t result_type, uint32_t result_id)\n{\n\t// If we're declaring temporaries inside continue blocks,\n\t// we must declare the temporary in the loop header so that the continue block can avoid declaring new variables.\n\tif (!block_temporary_hoisting && current_continue_block && !hoisted_temporaries.count(result_id))\n\t{\n\t\tauto &header = get<SPIRBlock>(current_continue_block->loop_dominator);\n\t\tif (find_if(begin(header.declare_temporary), end(header.declare_temporary),\n\t\t            [result_type, result_id](const pair<uint32_t, uint32_t> &tmp) {\n\t\t\t            return tmp.first == result_type && tmp.second == result_id;\n\t\t            }) == end(header.declare_temporary))\n\t\t{\n\t\t\theader.declare_temporary.emplace_back(result_type, result_id);\n\t\t\thoisted_temporaries.insert(result_id);\n\t\t\tforce_recompile();\n\t\t}\n\t}\n\telse if (hoisted_temporaries.count(result_id) == 0)\n\t{\n\t\tauto &type = get<SPIRType>(result_type);\n\t\tauto &flags = get_decoration_bitset(result_id);\n\n\t\t// The result_id has not been made into an expression yet, so use flags interface.\n\t\tadd_local_variable_name(result_id);\n\n\t\tstring initializer;\n\t\tif (options.force_zero_initialized_variables && type_can_zero_initialize(type))\n\t\t\tinitializer = join(\" = \", to_zero_initialized_expression(result_type));\n\n\t\tstatement(flags_to_qualifiers_glsl(type, flags), variable_decl(type, to_name(result_id)), initializer, \";\");\n\t}\n}\n\nstring CompilerGLSL::declare_temporary(uint32_t result_type, uint32_t result_id)\n{\n\tauto &type = get<SPIRType>(result_type);\n\n\t// If we're declaring temporaries inside continue blocks,\n\t// we must declare the temporary in the loop header so that the continue block can avoid declaring new variables.\n\tif (!block_temporary_hoisting && current_continue_block && !hoisted_temporaries.count(result_id))\n\t{\n\t\tauto &header = get<SPIRBlock>(current_continue_block->loop_dominator);\n\t\tif (find_if(begin(header.declare_temporary), end(header.declare_temporary),\n\t\t            [result_type, result_id](const pair<uint32_t, uint32_t> &tmp) {\n\t\t\t            return tmp.first == result_type && tmp.second == result_id;\n\t\t            }) == end(header.declare_temporary))\n\t\t{\n\t\t\theader.declare_temporary.emplace_back(result_type, result_id);\n\t\t\thoisted_temporaries.insert(result_id);\n\t\t\tforce_recompile_guarantee_forward_progress();\n\t\t}\n\n\t\treturn join(to_name(result_id), \" = \");\n\t}\n\telse if (hoisted_temporaries.count(result_id))\n\t{\n\t\t// The temporary has already been declared earlier, so just \"declare\" the temporary by writing to it.\n\t\treturn join(to_name(result_id), \" = \");\n\t}\n\telse\n\t{\n\t\t// The result_id has not been made into an expression yet, so use flags interface.\n\t\tadd_local_variable_name(result_id);\n\t\tauto &flags = get_decoration_bitset(result_id);\n\t\treturn join(flags_to_qualifiers_glsl(type, flags), variable_decl(type, to_name(result_id)), \" = \");\n\t}\n}\n\nbool CompilerGLSL::expression_is_forwarded(uint32_t id) const\n{\n\treturn forwarded_temporaries.count(id) != 0;\n}\n\nbool CompilerGLSL::expression_suppresses_usage_tracking(uint32_t id) const\n{\n\treturn suppressed_usage_tracking.count(id) != 0;\n}\n\nbool CompilerGLSL::expression_read_implies_multiple_reads(uint32_t id) const\n{\n\tauto *expr = maybe_get<SPIRExpression>(id);\n\tif (!expr)\n\t\treturn false;\n\n\t// If we're emitting code at a deeper loop level than when we emitted the expression,\n\t// we're probably reading the same expression over and over.\n\treturn current_loop_level > expr->emitted_loop_level;\n}\n\nSPIRExpression &CompilerGLSL::emit_op(uint32_t result_type, uint32_t result_id, const string &rhs, bool forwarding,\n                                      bool suppress_usage_tracking)\n{\n\tif (forwarding && (forced_temporaries.find(result_id) == end(forced_temporaries)))\n\t{\n\t\t// Just forward it without temporary.\n\t\t// If the forward is trivial, we do not force flushing to temporary for this expression.\n\t\tforwarded_temporaries.insert(result_id);\n\t\tif (suppress_usage_tracking)\n\t\t\tsuppressed_usage_tracking.insert(result_id);\n\n\t\treturn set<SPIRExpression>(result_id, rhs, result_type, true);\n\t}\n\telse\n\t{\n\t\t// If expression isn't immutable, bind it to a temporary and make the new temporary immutable (they always are).\n\t\tstatement(declare_temporary(result_type, result_id), rhs, \";\");\n\t\treturn set<SPIRExpression>(result_id, to_name(result_id), result_type, true);\n\t}\n}\n\nvoid CompilerGLSL::emit_unary_op(uint32_t result_type, uint32_t result_id, uint32_t op0, const char *op)\n{\n\tbool forward = should_forward(op0);\n\temit_op(result_type, result_id, join(op, to_enclosed_unpacked_expression(op0)), forward);\n\tinherit_expression_dependencies(result_id, op0);\n}\n\nvoid CompilerGLSL::emit_unary_op_cast(uint32_t result_type, uint32_t result_id, uint32_t op0, const char *op)\n{\n\tauto &type = get<SPIRType>(result_type);\n\tbool forward = should_forward(op0);\n\temit_op(result_type, result_id, join(type_to_glsl(type), \"(\", op, to_enclosed_unpacked_expression(op0), \")\"), forward);\n\tinherit_expression_dependencies(result_id, op0);\n}\n\nvoid CompilerGLSL::emit_mesh_tasks(SPIRBlock &block)\n{\n\tstatement(\"EmitMeshTasksEXT(\",\n\t          to_unpacked_expression(block.mesh.groups[0]), \", \",\n\t          to_unpacked_expression(block.mesh.groups[1]), \", \",\n\t          to_unpacked_expression(block.mesh.groups[2]), \");\");\n}\n\nvoid CompilerGLSL::emit_binary_op(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1, const char *op)\n{\n\t// Various FP arithmetic opcodes such as add, sub, mul will hit this.\n\tbool force_temporary_precise = backend.support_precise_qualifier &&\n\t                               has_decoration(result_id, DecorationNoContraction) &&\n\t                               type_is_floating_point(get<SPIRType>(result_type));\n\tbool forward = should_forward(op0) && should_forward(op1) && !force_temporary_precise;\n\n\temit_op(result_type, result_id,\n\t        join(to_enclosed_unpacked_expression(op0), \" \", op, \" \", to_enclosed_unpacked_expression(op1)), forward);\n\n\tinherit_expression_dependencies(result_id, op0);\n\tinherit_expression_dependencies(result_id, op1);\n}\n\nvoid CompilerGLSL::emit_unrolled_unary_op(uint32_t result_type, uint32_t result_id, uint32_t operand, const char *op)\n{\n\tauto &type = get<SPIRType>(result_type);\n\tauto expr = type_to_glsl_constructor(type);\n\texpr += '(';\n\tfor (uint32_t i = 0; i < type.vecsize; i++)\n\t{\n\t\t// Make sure to call to_expression multiple times to ensure\n\t\t// that these expressions are properly flushed to temporaries if needed.\n\t\texpr += op;\n\t\texpr += to_extract_component_expression(operand, i);\n\n\t\tif (i + 1 < type.vecsize)\n\t\t\texpr += \", \";\n\t}\n\texpr += ')';\n\temit_op(result_type, result_id, expr, should_forward(operand));\n\n\tinherit_expression_dependencies(result_id, operand);\n}\n\nvoid CompilerGLSL::emit_unrolled_binary_op(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1,\n                                           const char *op, bool negate, SPIRType::BaseType expected_type)\n{\n\tauto &type0 = expression_type(op0);\n\tauto &type1 = expression_type(op1);\n\n\tSPIRType target_type0 = type0;\n\tSPIRType target_type1 = type1;\n\ttarget_type0.basetype = expected_type;\n\ttarget_type1.basetype = expected_type;\n\ttarget_type0.vecsize = 1;\n\ttarget_type1.vecsize = 1;\n\n\tauto &type = get<SPIRType>(result_type);\n\tauto expr = type_to_glsl_constructor(type);\n\texpr += '(';\n\tfor (uint32_t i = 0; i < type.vecsize; i++)\n\t{\n\t\t// Make sure to call to_expression multiple times to ensure\n\t\t// that these expressions are properly flushed to temporaries if needed.\n\t\tif (negate)\n\t\t\texpr += \"!(\";\n\n\t\tif (expected_type != SPIRType::Unknown && type0.basetype != expected_type)\n\t\t\texpr += bitcast_expression(target_type0, type0.basetype, to_extract_component_expression(op0, i));\n\t\telse\n\t\t\texpr += to_extract_component_expression(op0, i);\n\n\t\texpr += ' ';\n\t\texpr += op;\n\t\texpr += ' ';\n\n\t\tif (expected_type != SPIRType::Unknown && type1.basetype != expected_type)\n\t\t\texpr += bitcast_expression(target_type1, type1.basetype, to_extract_component_expression(op1, i));\n\t\telse\n\t\t\texpr += to_extract_component_expression(op1, i);\n\n\t\tif (negate)\n\t\t\texpr += \")\";\n\n\t\tif (i + 1 < type.vecsize)\n\t\t\texpr += \", \";\n\t}\n\texpr += ')';\n\temit_op(result_type, result_id, expr, should_forward(op0) && should_forward(op1));\n\n\tinherit_expression_dependencies(result_id, op0);\n\tinherit_expression_dependencies(result_id, op1);\n}\n\nSPIRType CompilerGLSL::binary_op_bitcast_helper(string &cast_op0, string &cast_op1, SPIRType::BaseType &input_type,\n                                                uint32_t op0, uint32_t op1, bool skip_cast_if_equal_type)\n{\n\tauto &type0 = expression_type(op0);\n\tauto &type1 = expression_type(op1);\n\n\t// We have to bitcast if our inputs are of different type, or if our types are not equal to expected inputs.\n\t// For some functions like OpIEqual and INotEqual, we don't care if inputs are of different types than expected\n\t// since equality test is exactly the same.\n\tbool cast = (type0.basetype != type1.basetype) || (!skip_cast_if_equal_type && type0.basetype != input_type);\n\n\t// Create a fake type so we can bitcast to it.\n\t// We only deal with regular arithmetic types here like int, uints and so on.\n\tSPIRType expected_type{type0.op};\n\texpected_type.basetype = input_type;\n\texpected_type.vecsize = type0.vecsize;\n\texpected_type.columns = type0.columns;\n\texpected_type.width = type0.width;\n\n\tif (cast)\n\t{\n\t\tcast_op0 = bitcast_glsl(expected_type, op0);\n\t\tcast_op1 = bitcast_glsl(expected_type, op1);\n\t}\n\telse\n\t{\n\t\t// If we don't cast, our actual input type is that of the first (or second) argument.\n\t\tcast_op0 = to_enclosed_unpacked_expression(op0);\n\t\tcast_op1 = to_enclosed_unpacked_expression(op1);\n\t\tinput_type = type0.basetype;\n\t}\n\n\treturn expected_type;\n}\n\nbool CompilerGLSL::emit_complex_bitcast(uint32_t result_type, uint32_t id, uint32_t op0)\n{\n\t// Some bitcasts may require complex casting sequences, and are implemented here.\n\t// Otherwise a simply unary function will do with bitcast_glsl_op.\n\n\tauto &output_type = get<SPIRType>(result_type);\n\tauto &input_type = expression_type(op0);\n\tstring expr;\n\n\tif (output_type.basetype == SPIRType::Half && input_type.basetype == SPIRType::Float && input_type.vecsize == 1)\n\t\texpr = join(\"unpackFloat2x16(floatBitsToUint(\", to_unpacked_expression(op0), \"))\");\n\telse if (output_type.basetype == SPIRType::Float && input_type.basetype == SPIRType::Half &&\n\t         input_type.vecsize == 2)\n\t\texpr = join(\"uintBitsToFloat(packFloat2x16(\", to_unpacked_expression(op0), \"))\");\n\telse\n\t\treturn false;\n\n\temit_op(result_type, id, expr, should_forward(op0));\n\treturn true;\n}\n\nvoid CompilerGLSL::emit_binary_op_cast(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1,\n                                       const char *op, SPIRType::BaseType input_type,\n                                       bool skip_cast_if_equal_type,\n                                       bool implicit_integer_promotion)\n{\n\tstring cast_op0, cast_op1;\n\tauto expected_type = binary_op_bitcast_helper(cast_op0, cast_op1, input_type, op0, op1, skip_cast_if_equal_type);\n\tauto &out_type = get<SPIRType>(result_type);\n\n\t// We might have casted away from the result type, so bitcast again.\n\t// For example, arithmetic right shift with uint inputs.\n\t// Special case boolean outputs since relational opcodes output booleans instead of int/uint.\n\tauto bitop = join(cast_op0, \" \", op, \" \", cast_op1);\n\tstring expr;\n\n\tif (implicit_integer_promotion)\n\t{\n\t\t// Simple value cast.\n\t\texpr = join(type_to_glsl(out_type), '(', bitop, ')');\n\t}\n\telse if (out_type.basetype != input_type && out_type.basetype != SPIRType::Boolean)\n\t{\n\t\texpected_type.basetype = input_type;\n\t\texpr = join(bitcast_glsl_op(out_type, expected_type), '(', bitop, ')');\n\t}\n\telse\n\t{\n\t\texpr = std::move(bitop);\n\t}\n\n\temit_op(result_type, result_id, expr, should_forward(op0) && should_forward(op1));\n\tinherit_expression_dependencies(result_id, op0);\n\tinherit_expression_dependencies(result_id, op1);\n}\n\nvoid CompilerGLSL::emit_unary_func_op(uint32_t result_type, uint32_t result_id, uint32_t op0, const char *op)\n{\n\tbool forward = should_forward(op0);\n\temit_op(result_type, result_id, join(op, \"(\", to_unpacked_expression(op0), \")\"), forward);\n\tinherit_expression_dependencies(result_id, op0);\n}\n\nvoid CompilerGLSL::emit_binary_func_op(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1,\n                                       const char *op)\n{\n\t// Opaque types (e.g. OpTypeSampledImage) must always be forwarded in GLSL\n\tconst auto &type = get_type(result_type);\n\tbool must_forward = type_is_opaque_value(type);\n\tbool forward = must_forward || (should_forward(op0) && should_forward(op1));\n\temit_op(result_type, result_id, join(op, \"(\", to_unpacked_expression(op0), \", \", to_unpacked_expression(op1), \")\"),\n\t        forward);\n\tinherit_expression_dependencies(result_id, op0);\n\tinherit_expression_dependencies(result_id, op1);\n}\n\nvoid CompilerGLSL::emit_atomic_func_op(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1,\n                                       const char *op)\n{\n\tauto &type = get<SPIRType>(result_type);\n\tif (type_is_floating_point(type))\n\t{\n\t\tif (!options.vulkan_semantics)\n\t\t\tSPIRV_CROSS_THROW(\"Floating point atomics requires Vulkan semantics.\");\n\t\tif (options.es)\n\t\t\tSPIRV_CROSS_THROW(\"Floating point atomics requires desktop GLSL.\");\n\t\trequire_extension_internal(\"GL_EXT_shader_atomic_float\");\n\t}\n\n\tforced_temporaries.insert(result_id);\n\temit_op(result_type, result_id,\n\t        join(op, \"(\", to_non_uniform_aware_expression(op0), \", \",\n\t             to_unpacked_expression(op1), \")\"), false);\n\tflush_all_atomic_capable_variables();\n}\n\nvoid CompilerGLSL::emit_atomic_func_op(uint32_t result_type, uint32_t result_id,\n                                       uint32_t op0, uint32_t op1, uint32_t op2,\n                                       const char *op)\n{\n\tforced_temporaries.insert(result_id);\n\temit_op(result_type, result_id,\n\t        join(op, \"(\", to_non_uniform_aware_expression(op0), \", \",\n\t             to_unpacked_expression(op1), \", \", to_unpacked_expression(op2), \")\"), false);\n\tflush_all_atomic_capable_variables();\n}\n\nvoid CompilerGLSL::emit_unary_func_op_cast(uint32_t result_type, uint32_t result_id, uint32_t op0, const char *op,\n                                           SPIRType::BaseType input_type, SPIRType::BaseType expected_result_type)\n{\n\tauto &out_type = get<SPIRType>(result_type);\n\tauto &expr_type = expression_type(op0);\n\tauto expected_type = out_type;\n\n\t// Bit-widths might be different in unary cases because we use it for SConvert/UConvert and friends.\n\texpected_type.basetype = input_type;\n\texpected_type.width = expr_type.width;\n\n\tstring cast_op;\n\tif (expr_type.basetype != input_type)\n\t{\n\t\tif (expr_type.basetype == SPIRType::Boolean)\n\t\t\tcast_op = join(type_to_glsl(expected_type), \"(\", to_unpacked_expression(op0), \")\");\n\t\telse\n\t\t\tcast_op = bitcast_glsl(expected_type, op0);\n\t}\n\telse\n\t\tcast_op = to_unpacked_expression(op0);\n\n\tstring expr;\n\tif (out_type.basetype != expected_result_type)\n\t{\n\t\texpected_type.basetype = expected_result_type;\n\t\texpected_type.width = out_type.width;\n\t\tif (out_type.basetype == SPIRType::Boolean)\n\t\t\texpr = type_to_glsl(out_type);\n\t\telse\n\t\t\texpr = bitcast_glsl_op(out_type, expected_type);\n\t\texpr += '(';\n\t\texpr += join(op, \"(\", cast_op, \")\");\n\t\texpr += ')';\n\t}\n\telse\n\t{\n\t\texpr += join(op, \"(\", cast_op, \")\");\n\t}\n\n\temit_op(result_type, result_id, expr, should_forward(op0));\n\tinherit_expression_dependencies(result_id, op0);\n}\n\n// Very special case. Handling bitfieldExtract requires us to deal with different bitcasts of different signs\n// and different vector sizes all at once. Need a special purpose method here.\nvoid CompilerGLSL::emit_trinary_func_op_bitextract(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1,\n                                                   uint32_t op2, const char *op,\n                                                   SPIRType::BaseType expected_result_type,\n                                                   SPIRType::BaseType input_type0, SPIRType::BaseType input_type1,\n                                                   SPIRType::BaseType input_type2)\n{\n\tauto &out_type = get<SPIRType>(result_type);\n\tauto expected_type = out_type;\n\texpected_type.basetype = input_type0;\n\n\tstring cast_op0 =\n\t    expression_type(op0).basetype != input_type0 ? bitcast_glsl(expected_type, op0) : to_unpacked_expression(op0);\n\n\tauto op1_expr = to_unpacked_expression(op1);\n\tauto op2_expr = to_unpacked_expression(op2);\n\n\t// Use value casts here instead. Input must be exactly int or uint, but SPIR-V might be 16-bit.\n\texpected_type.basetype = input_type1;\n\texpected_type.vecsize = 1;\n\tstring cast_op1 = expression_type(op1).basetype != input_type1 ?\n\t                      join(type_to_glsl_constructor(expected_type), \"(\", op1_expr, \")\") :\n\t                      op1_expr;\n\n\texpected_type.basetype = input_type2;\n\texpected_type.vecsize = 1;\n\tstring cast_op2 = expression_type(op2).basetype != input_type2 ?\n\t                      join(type_to_glsl_constructor(expected_type), \"(\", op2_expr, \")\") :\n\t                      op2_expr;\n\n\tstring expr;\n\tif (out_type.basetype != expected_result_type)\n\t{\n\t\texpected_type.vecsize = out_type.vecsize;\n\t\texpected_type.basetype = expected_result_type;\n\t\texpr = bitcast_glsl_op(out_type, expected_type);\n\t\texpr += '(';\n\t\texpr += join(op, \"(\", cast_op0, \", \", cast_op1, \", \", cast_op2, \")\");\n\t\texpr += ')';\n\t}\n\telse\n\t{\n\t\texpr += join(op, \"(\", cast_op0, \", \", cast_op1, \", \", cast_op2, \")\");\n\t}\n\n\temit_op(result_type, result_id, expr, should_forward(op0) && should_forward(op1) && should_forward(op2));\n\tinherit_expression_dependencies(result_id, op0);\n\tinherit_expression_dependencies(result_id, op1);\n\tinherit_expression_dependencies(result_id, op2);\n}\n\nvoid CompilerGLSL::emit_trinary_func_op_cast(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1,\n                                             uint32_t op2, const char *op, SPIRType::BaseType input_type)\n{\n\tauto &out_type = get<SPIRType>(result_type);\n\tauto expected_type = out_type;\n\texpected_type.basetype = input_type;\n\tstring cast_op0 =\n\t    expression_type(op0).basetype != input_type ? bitcast_glsl(expected_type, op0) : to_unpacked_expression(op0);\n\tstring cast_op1 =\n\t    expression_type(op1).basetype != input_type ? bitcast_glsl(expected_type, op1) : to_unpacked_expression(op1);\n\tstring cast_op2 =\n\t    expression_type(op2).basetype != input_type ? bitcast_glsl(expected_type, op2) : to_unpacked_expression(op2);\n\n\tstring expr;\n\tif (out_type.basetype != input_type)\n\t{\n\t\texpr = bitcast_glsl_op(out_type, expected_type);\n\t\texpr += '(';\n\t\texpr += join(op, \"(\", cast_op0, \", \", cast_op1, \", \", cast_op2, \")\");\n\t\texpr += ')';\n\t}\n\telse\n\t{\n\t\texpr += join(op, \"(\", cast_op0, \", \", cast_op1, \", \", cast_op2, \")\");\n\t}\n\n\temit_op(result_type, result_id, expr, should_forward(op0) && should_forward(op1) && should_forward(op2));\n\tinherit_expression_dependencies(result_id, op0);\n\tinherit_expression_dependencies(result_id, op1);\n\tinherit_expression_dependencies(result_id, op2);\n}\n\nvoid CompilerGLSL::emit_binary_func_op_cast_clustered(uint32_t result_type, uint32_t result_id, uint32_t op0,\n                                                      uint32_t op1, const char *op, SPIRType::BaseType input_type)\n{\n\t// Special purpose method for implementing clustered subgroup opcodes.\n\t// Main difference is that op1 does not participate in any casting, it needs to be a literal.\n\tauto &out_type = get<SPIRType>(result_type);\n\tauto expected_type = out_type;\n\texpected_type.basetype = input_type;\n\tstring cast_op0 =\n\t    expression_type(op0).basetype != input_type ? bitcast_glsl(expected_type, op0) : to_unpacked_expression(op0);\n\n\tstring expr;\n\tif (out_type.basetype != input_type)\n\t{\n\t\texpr = bitcast_glsl_op(out_type, expected_type);\n\t\texpr += '(';\n\t\texpr += join(op, \"(\", cast_op0, \", \", to_expression(op1), \")\");\n\t\texpr += ')';\n\t}\n\telse\n\t{\n\t\texpr += join(op, \"(\", cast_op0, \", \", to_expression(op1), \")\");\n\t}\n\n\temit_op(result_type, result_id, expr, should_forward(op0));\n\tinherit_expression_dependencies(result_id, op0);\n}\n\nvoid CompilerGLSL::emit_binary_func_op_cast(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1,\n                                            const char *op, SPIRType::BaseType input_type, bool skip_cast_if_equal_type)\n{\n\tstring cast_op0, cast_op1;\n\tauto expected_type = binary_op_bitcast_helper(cast_op0, cast_op1, input_type, op0, op1, skip_cast_if_equal_type);\n\tauto &out_type = get<SPIRType>(result_type);\n\n\t// Special case boolean outputs since relational opcodes output booleans instead of int/uint.\n\tstring expr;\n\tif (out_type.basetype != input_type && out_type.basetype != SPIRType::Boolean)\n\t{\n\t\texpected_type.basetype = input_type;\n\t\texpr = bitcast_glsl_op(out_type, expected_type);\n\t\texpr += '(';\n\t\texpr += join(op, \"(\", cast_op0, \", \", cast_op1, \")\");\n\t\texpr += ')';\n\t}\n\telse\n\t{\n\t\texpr += join(op, \"(\", cast_op0, \", \", cast_op1, \")\");\n\t}\n\n\temit_op(result_type, result_id, expr, should_forward(op0) && should_forward(op1));\n\tinherit_expression_dependencies(result_id, op0);\n\tinherit_expression_dependencies(result_id, op1);\n}\n\nvoid CompilerGLSL::emit_trinary_func_op(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1,\n                                        uint32_t op2, const char *op)\n{\n\tbool forward = should_forward(op0) && should_forward(op1) && should_forward(op2);\n\temit_op(result_type, result_id,\n\t        join(op, \"(\", to_unpacked_expression(op0), \", \", to_unpacked_expression(op1), \", \",\n\t             to_unpacked_expression(op2), \")\"),\n\t        forward);\n\n\tinherit_expression_dependencies(result_id, op0);\n\tinherit_expression_dependencies(result_id, op1);\n\tinherit_expression_dependencies(result_id, op2);\n}\n\nvoid CompilerGLSL::emit_quaternary_func_op(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1,\n                                           uint32_t op2, uint32_t op3, const char *op)\n{\n\tbool forward = should_forward(op0) && should_forward(op1) && should_forward(op2) && should_forward(op3);\n\temit_op(result_type, result_id,\n\t        join(op, \"(\", to_unpacked_expression(op0), \", \", to_unpacked_expression(op1), \", \",\n\t             to_unpacked_expression(op2), \", \", to_unpacked_expression(op3), \")\"),\n\t        forward);\n\n\tinherit_expression_dependencies(result_id, op0);\n\tinherit_expression_dependencies(result_id, op1);\n\tinherit_expression_dependencies(result_id, op2);\n\tinherit_expression_dependencies(result_id, op3);\n}\n\nvoid CompilerGLSL::emit_bitfield_insert_op(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1,\n                                           uint32_t op2, uint32_t op3, const char *op,\n                                           SPIRType::BaseType offset_count_type)\n{\n\t// Only need to cast offset/count arguments. Types of base/insert must be same as result type,\n\t// and bitfieldInsert is sign invariant.\n\tbool forward = should_forward(op0) && should_forward(op1) && should_forward(op2) && should_forward(op3);\n\n\tauto op0_expr = to_unpacked_expression(op0);\n\tauto op1_expr = to_unpacked_expression(op1);\n\tauto op2_expr = to_unpacked_expression(op2);\n\tauto op3_expr = to_unpacked_expression(op3);\n\n\tassert(offset_count_type == SPIRType::UInt || offset_count_type == SPIRType::Int);\n\tSPIRType target_type { OpTypeInt };\n\ttarget_type.width = 32;\n\ttarget_type.vecsize = 1;\n\ttarget_type.basetype = offset_count_type;\n\n\tif (expression_type(op2).basetype != offset_count_type)\n\t{\n\t\t// Value-cast here. Input might be 16-bit. GLSL requires int.\n\t\top2_expr = join(type_to_glsl_constructor(target_type), \"(\", op2_expr, \")\");\n\t}\n\n\tif (expression_type(op3).basetype != offset_count_type)\n\t{\n\t\t// Value-cast here. Input might be 16-bit. GLSL requires int.\n\t\top3_expr = join(type_to_glsl_constructor(target_type), \"(\", op3_expr, \")\");\n\t}\n\n\temit_op(result_type, result_id, join(op, \"(\", op0_expr, \", \", op1_expr, \", \", op2_expr, \", \", op3_expr, \")\"),\n\t        forward);\n\n\tinherit_expression_dependencies(result_id, op0);\n\tinherit_expression_dependencies(result_id, op1);\n\tinherit_expression_dependencies(result_id, op2);\n\tinherit_expression_dependencies(result_id, op3);\n}\n\nstring CompilerGLSL::legacy_tex_op(const std::string &op, const SPIRType &imgtype, uint32_t tex)\n{\n\tconst char *type;\n\tswitch (imgtype.image.dim)\n\t{\n\tcase spv::Dim1D:\n\t\t// Force 2D path for ES.\n\t\tif (options.es)\n\t\t\ttype = (imgtype.image.arrayed && !options.es) ? \"2DArray\" : \"2D\";\n\t\telse\n\t\t\ttype = (imgtype.image.arrayed && !options.es) ? \"1DArray\" : \"1D\";\n\t\tbreak;\n\tcase spv::Dim2D:\n\t\ttype = (imgtype.image.arrayed && !options.es) ? \"2DArray\" : \"2D\";\n\t\tbreak;\n\tcase spv::Dim3D:\n\t\ttype = \"3D\";\n\t\tbreak;\n\tcase spv::DimCube:\n\t\ttype = \"Cube\";\n\t\tbreak;\n\tcase spv::DimRect:\n\t\ttype = \"2DRect\";\n\t\tbreak;\n\tcase spv::DimBuffer:\n\t\ttype = \"Buffer\";\n\t\tbreak;\n\tcase spv::DimSubpassData:\n\t\ttype = \"2D\";\n\t\tbreak;\n\tdefault:\n\t\ttype = \"\";\n\t\tbreak;\n\t}\n\n\t// In legacy GLSL, an extension is required for textureLod in the fragment\n\t// shader or textureGrad anywhere.\n\tbool legacy_lod_ext = false;\n\tauto &execution = get_entry_point();\n\tif (op == \"textureGrad\" || op == \"textureProjGrad\" ||\n\t    ((op == \"textureLod\" || op == \"textureProjLod\") && execution.model != ExecutionModelVertex))\n\t{\n\t\tif (is_legacy_es())\n\t\t{\n\t\t\tlegacy_lod_ext = true;\n\t\t\trequire_extension_internal(\"GL_EXT_shader_texture_lod\");\n\t\t}\n\t\telse if (is_legacy_desktop())\n\t\t\trequire_extension_internal(\"GL_ARB_shader_texture_lod\");\n\t}\n\n\tif (op == \"textureLodOffset\" || op == \"textureProjLodOffset\")\n\t{\n\t\tif (is_legacy_es())\n\t\t\tSPIRV_CROSS_THROW(join(op, \" not allowed in legacy ES\"));\n\n\t\trequire_extension_internal(\"GL_EXT_gpu_shader4\");\n\t}\n\n\t// GLES has very limited support for shadow samplers.\n\t// Basically shadow2D and shadow2DProj work through EXT_shadow_samplers,\n\t// everything else can just throw\n\tbool is_comparison = is_depth_image(imgtype, tex);\n\tif (is_comparison && is_legacy_es())\n\t{\n\t\tif (op == \"texture\" || op == \"textureProj\")\n\t\t\trequire_extension_internal(\"GL_EXT_shadow_samplers\");\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(join(op, \" not allowed on depth samplers in legacy ES\"));\n\n\t\tif (imgtype.image.dim == spv::DimCube)\n\t\t\treturn \"shadowCubeNV\";\n\t}\n\n\tif (op == \"textureSize\")\n\t{\n\t\tif (is_legacy_es())\n\t\t\tSPIRV_CROSS_THROW(\"textureSize not supported in legacy ES\");\n\t\tif (is_comparison)\n\t\t\tSPIRV_CROSS_THROW(\"textureSize not supported on shadow sampler in legacy GLSL\");\n\t\trequire_extension_internal(\"GL_EXT_gpu_shader4\");\n\t}\n\n\tif (op == \"texelFetch\" && is_legacy_es())\n\t\tSPIRV_CROSS_THROW(\"texelFetch not supported in legacy ES\");\n\n\tbool is_es_and_depth = is_legacy_es() && is_comparison;\n\tstd::string type_prefix = is_comparison ? \"shadow\" : \"texture\";\n\n\tif (op == \"texture\")\n\t\treturn is_es_and_depth ? join(type_prefix, type, \"EXT\") : join(type_prefix, type);\n\telse if (op == \"textureLod\")\n\t\treturn join(type_prefix, type, legacy_lod_ext ? \"LodEXT\" : \"Lod\");\n\telse if (op == \"textureProj\")\n\t\treturn join(type_prefix, type, is_es_and_depth ? \"ProjEXT\" : \"Proj\");\n\telse if (op == \"textureGrad\")\n\t\treturn join(type_prefix, type, is_legacy_es() ? \"GradEXT\" : is_legacy_desktop() ? \"GradARB\" : \"Grad\");\n\telse if (op == \"textureProjLod\")\n\t\treturn join(type_prefix, type, legacy_lod_ext ? \"ProjLodEXT\" : \"ProjLod\");\n\telse if (op == \"textureLodOffset\")\n\t\treturn join(type_prefix, type, \"LodOffset\");\n\telse if (op == \"textureProjGrad\")\n\t\treturn join(type_prefix, type,\n\t\t            is_legacy_es() ? \"ProjGradEXT\" : is_legacy_desktop() ? \"ProjGradARB\" : \"ProjGrad\");\n\telse if (op == \"textureProjLodOffset\")\n\t\treturn join(type_prefix, type, \"ProjLodOffset\");\n\telse if (op == \"textureSize\")\n\t\treturn join(\"textureSize\", type);\n\telse if (op == \"texelFetch\")\n\t\treturn join(\"texelFetch\", type);\n\telse\n\t{\n\t\tSPIRV_CROSS_THROW(join(\"Unsupported legacy texture op: \", op));\n\t}\n}\n\nbool CompilerGLSL::to_trivial_mix_op(const SPIRType &type, string &op, uint32_t left, uint32_t right, uint32_t lerp)\n{\n\tauto *cleft = maybe_get<SPIRConstant>(left);\n\tauto *cright = maybe_get<SPIRConstant>(right);\n\tauto &lerptype = expression_type(lerp);\n\n\t// If our targets aren't constants, we cannot use construction.\n\tif (!cleft || !cright)\n\t\treturn false;\n\n\t// If our targets are spec constants, we cannot use construction.\n\tif (cleft->specialization || cright->specialization)\n\t\treturn false;\n\n\tauto &value_type = get<SPIRType>(cleft->constant_type);\n\n\tif (lerptype.basetype != SPIRType::Boolean)\n\t\treturn false;\n\tif (value_type.basetype == SPIRType::Struct || is_array(value_type))\n\t\treturn false;\n\tif (!backend.use_constructor_splatting && value_type.vecsize != lerptype.vecsize)\n\t\treturn false;\n\n\t// Only valid way in SPIR-V 1.4 to use matrices in select is a scalar select.\n\t// matrix(scalar) constructor fills in diagnonals, so gets messy very quickly.\n\t// Just avoid this case.\n\tif (value_type.columns > 1)\n\t\treturn false;\n\n\t// If our bool selects between 0 and 1, we can cast from bool instead, making our trivial constructor.\n\tbool ret = true;\n\tfor (uint32_t row = 0; ret && row < value_type.vecsize; row++)\n\t{\n\t\tswitch (type.basetype)\n\t\t{\n\t\tcase SPIRType::Short:\n\t\tcase SPIRType::UShort:\n\t\t\tret = cleft->scalar_u16(0, row) == 0 && cright->scalar_u16(0, row) == 1;\n\t\t\tbreak;\n\n\t\tcase SPIRType::Int:\n\t\tcase SPIRType::UInt:\n\t\t\tret = cleft->scalar(0, row) == 0 && cright->scalar(0, row) == 1;\n\t\t\tbreak;\n\n\t\tcase SPIRType::Half:\n\t\t\tret = cleft->scalar_f16(0, row) == 0.0f && cright->scalar_f16(0, row) == 1.0f;\n\t\t\tbreak;\n\n\t\tcase SPIRType::Float:\n\t\t\tret = cleft->scalar_f32(0, row) == 0.0f && cright->scalar_f32(0, row) == 1.0f;\n\t\t\tbreak;\n\n\t\tcase SPIRType::Double:\n\t\t\tret = cleft->scalar_f64(0, row) == 0.0 && cright->scalar_f64(0, row) == 1.0;\n\t\t\tbreak;\n\n\t\tcase SPIRType::Int64:\n\t\tcase SPIRType::UInt64:\n\t\t\tret = cleft->scalar_u64(0, row) == 0 && cright->scalar_u64(0, row) == 1;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tret = false;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (ret)\n\t\top = type_to_glsl_constructor(type);\n\treturn ret;\n}\n\nstring CompilerGLSL::to_ternary_expression(const SPIRType &restype, uint32_t select, uint32_t true_value,\n                                           uint32_t false_value)\n{\n\tstring expr;\n\tauto &lerptype = expression_type(select);\n\n\tif (lerptype.vecsize == 1)\n\t\texpr = join(to_enclosed_expression(select), \" ? \", to_enclosed_pointer_expression(true_value), \" : \",\n\t\t            to_enclosed_pointer_expression(false_value));\n\telse\n\t{\n\t\tauto swiz = [this](uint32_t expression, uint32_t i) { return to_extract_component_expression(expression, i); };\n\n\t\texpr = type_to_glsl_constructor(restype);\n\t\texpr += \"(\";\n\t\tfor (uint32_t i = 0; i < restype.vecsize; i++)\n\t\t{\n\t\t\texpr += swiz(select, i);\n\t\t\texpr += \" ? \";\n\t\t\texpr += swiz(true_value, i);\n\t\t\texpr += \" : \";\n\t\t\texpr += swiz(false_value, i);\n\t\t\tif (i + 1 < restype.vecsize)\n\t\t\t\texpr += \", \";\n\t\t}\n\t\texpr += \")\";\n\t}\n\n\treturn expr;\n}\n\nvoid CompilerGLSL::emit_mix_op(uint32_t result_type, uint32_t id, uint32_t left, uint32_t right, uint32_t lerp)\n{\n\tauto &lerptype = expression_type(lerp);\n\tauto &restype = get<SPIRType>(result_type);\n\n\t// If this results in a variable pointer, assume it may be written through.\n\tif (restype.pointer)\n\t{\n\t\tregister_write(left);\n\t\tregister_write(right);\n\t}\n\n\tstring mix_op;\n\tbool has_boolean_mix = *backend.boolean_mix_function &&\n\t                       ((options.es && options.version >= 310) || (!options.es && options.version >= 450));\n\tbool trivial_mix = to_trivial_mix_op(restype, mix_op, left, right, lerp);\n\n\t// Cannot use boolean mix when the lerp argument is just one boolean,\n\t// fall back to regular trinary statements.\n\tif (lerptype.vecsize == 1)\n\t\thas_boolean_mix = false;\n\n\t// If we can reduce the mix to a simple cast, do so.\n\t// This helps for cases like int(bool), uint(bool) which is implemented with\n\t// OpSelect bool 1 0.\n\tif (trivial_mix)\n\t{\n\t\temit_unary_func_op(result_type, id, lerp, mix_op.c_str());\n\t}\n\telse if (!has_boolean_mix && lerptype.basetype == SPIRType::Boolean)\n\t{\n\t\t// Boolean mix not supported on desktop without extension.\n\t\t// Was added in OpenGL 4.5 with ES 3.1 compat.\n\t\t//\n\t\t// Could use GL_EXT_shader_integer_mix on desktop at least,\n\t\t// but Apple doesn't support it. :(\n\t\t// Just implement it as ternary expressions.\n\t\tauto expr = to_ternary_expression(get<SPIRType>(result_type), lerp, right, left);\n\t\temit_op(result_type, id, expr, should_forward(left) && should_forward(right) && should_forward(lerp));\n\t\tinherit_expression_dependencies(id, left);\n\t\tinherit_expression_dependencies(id, right);\n\t\tinherit_expression_dependencies(id, lerp);\n\t}\n\telse if (lerptype.basetype == SPIRType::Boolean)\n\t\temit_trinary_func_op(result_type, id, left, right, lerp, backend.boolean_mix_function);\n\telse\n\t\temit_trinary_func_op(result_type, id, left, right, lerp, \"mix\");\n}\n\nstring CompilerGLSL::to_combined_image_sampler(VariableID image_id, VariableID samp_id)\n{\n\t// Keep track of the array indices we have used to load the image.\n\t// We'll need to use the same array index into the combined image sampler array.\n\tauto image_expr = to_non_uniform_aware_expression(image_id);\n\tstring array_expr;\n\tauto array_index = image_expr.find_first_of('[');\n\tif (array_index != string::npos)\n\t\tarray_expr = image_expr.substr(array_index, string::npos);\n\n\tauto &args = current_function->arguments;\n\n\t// For GLSL and ESSL targets, we must enumerate all possible combinations for sampler2D(texture2D, sampler) and redirect\n\t// all possible combinations into new sampler2D uniforms.\n\tauto *image = maybe_get_backing_variable(image_id);\n\tauto *samp = maybe_get_backing_variable(samp_id);\n\tif (image)\n\t\timage_id = image->self;\n\tif (samp)\n\t\tsamp_id = samp->self;\n\n\tauto image_itr = find_if(begin(args), end(args),\n\t                         [image_id](const SPIRFunction::Parameter &param) { return image_id == param.id; });\n\n\tauto sampler_itr = find_if(begin(args), end(args),\n\t                           [samp_id](const SPIRFunction::Parameter &param) { return samp_id == param.id; });\n\n\tif (image_itr != end(args) || sampler_itr != end(args))\n\t{\n\t\t// If any parameter originates from a parameter, we will find it in our argument list.\n\t\tbool global_image = image_itr == end(args);\n\t\tbool global_sampler = sampler_itr == end(args);\n\t\tVariableID iid = global_image ? image_id : VariableID(uint32_t(image_itr - begin(args)));\n\t\tVariableID sid = global_sampler ? samp_id : VariableID(uint32_t(sampler_itr - begin(args)));\n\n\t\tauto &combined = current_function->combined_parameters;\n\t\tauto itr = find_if(begin(combined), end(combined), [=](const SPIRFunction::CombinedImageSamplerParameter &p) {\n\t\t\treturn p.global_image == global_image && p.global_sampler == global_sampler && p.image_id == iid &&\n\t\t\t       p.sampler_id == sid;\n\t\t});\n\n\t\tif (itr != end(combined))\n\t\t\treturn to_expression(itr->id) + array_expr;\n\t\telse\n\t\t{\n\t\t\tSPIRV_CROSS_THROW(\"Cannot find mapping for combined sampler parameter, was \"\n\t\t\t                  \"build_combined_image_samplers() used \"\n\t\t\t                  \"before compile() was called?\");\n\t\t}\n\t}\n\telse\n\t{\n\t\t// For global sampler2D, look directly at the global remapping table.\n\t\tauto &mapping = combined_image_samplers;\n\t\tauto itr = find_if(begin(mapping), end(mapping), [image_id, samp_id](const CombinedImageSampler &combined) {\n\t\t\treturn combined.image_id == image_id && combined.sampler_id == samp_id;\n\t\t});\n\n\t\tif (itr != end(combined_image_samplers))\n\t\t\treturn to_expression(itr->combined_id) + array_expr;\n\t\telse\n\t\t{\n\t\t\tSPIRV_CROSS_THROW(\"Cannot find mapping for combined sampler, was build_combined_image_samplers() used \"\n\t\t\t                  \"before compile() was called?\");\n\t\t}\n\t}\n}\n\nbool CompilerGLSL::is_supported_subgroup_op_in_opengl(spv::Op op, const uint32_t *ops)\n{\n\tswitch (op)\n\t{\n\tcase OpGroupNonUniformElect:\n\tcase OpGroupNonUniformBallot:\n\tcase OpGroupNonUniformBallotFindLSB:\n\tcase OpGroupNonUniformBallotFindMSB:\n\tcase OpGroupNonUniformBroadcast:\n\tcase OpGroupNonUniformBroadcastFirst:\n\tcase OpGroupNonUniformAll:\n\tcase OpGroupNonUniformAny:\n\tcase OpGroupNonUniformAllEqual:\n\tcase OpControlBarrier:\n\tcase OpMemoryBarrier:\n\tcase OpGroupNonUniformBallotBitCount:\n\tcase OpGroupNonUniformBallotBitExtract:\n\tcase OpGroupNonUniformInverseBallot:\n\t\treturn true;\n\tcase OpGroupNonUniformIAdd:\n\tcase OpGroupNonUniformFAdd:\n\tcase OpGroupNonUniformIMul:\n\tcase OpGroupNonUniformFMul:\n\t{\n\t\tconst GroupOperation operation = static_cast<GroupOperation>(ops[3]);\n\t\tif (operation == GroupOperationReduce || operation == GroupOperationInclusiveScan ||\n\t\t    operation == GroupOperationExclusiveScan)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\tdefault:\n\t\treturn false;\n\t}\n}\n\nvoid CompilerGLSL::emit_sampled_image_op(uint32_t result_type, uint32_t result_id, uint32_t image_id, uint32_t samp_id)\n{\n\tif (options.vulkan_semantics && combined_image_samplers.empty())\n\t{\n\t\temit_binary_func_op(result_type, result_id, image_id, samp_id,\n\t\t                    type_to_glsl(get<SPIRType>(result_type), result_id).c_str());\n\t}\n\telse\n\t{\n\t\t// Make sure to suppress usage tracking. It is illegal to create temporaries of opaque types.\n\t\temit_op(result_type, result_id, to_combined_image_sampler(image_id, samp_id), true, true);\n\t}\n\n\t// Make sure to suppress usage tracking and any expression invalidation.\n\t// It is illegal to create temporaries of opaque types.\n\tforwarded_temporaries.erase(result_id);\n}\n\nstatic inline bool image_opcode_is_sample_no_dref(Op op)\n{\n\tswitch (op)\n\t{\n\tcase OpImageSampleExplicitLod:\n\tcase OpImageSampleImplicitLod:\n\tcase OpImageSampleProjExplicitLod:\n\tcase OpImageSampleProjImplicitLod:\n\tcase OpImageFetch:\n\tcase OpImageRead:\n\tcase OpImageSparseSampleExplicitLod:\n\tcase OpImageSparseSampleImplicitLod:\n\tcase OpImageSparseSampleProjExplicitLod:\n\tcase OpImageSparseSampleProjImplicitLod:\n\tcase OpImageSparseFetch:\n\tcase OpImageSparseRead:\n\t\treturn true;\n\n\tdefault:\n\t\treturn false;\n\t}\n}\n\nvoid CompilerGLSL::emit_sparse_feedback_temporaries(uint32_t result_type_id, uint32_t id, uint32_t &feedback_id,\n                                                    uint32_t &texel_id)\n{\n\t// Need to allocate two temporaries.\n\tif (options.es)\n\t\tSPIRV_CROSS_THROW(\"Sparse texture feedback is not supported on ESSL.\");\n\trequire_extension_internal(\"GL_ARB_sparse_texture2\");\n\n\tauto &temps = extra_sub_expressions[id];\n\tif (temps == 0)\n\t\ttemps = ir.increase_bound_by(2);\n\n\tfeedback_id = temps + 0;\n\ttexel_id = temps + 1;\n\n\tauto &return_type = get<SPIRType>(result_type_id);\n\tif (return_type.basetype != SPIRType::Struct || return_type.member_types.size() != 2)\n\t\tSPIRV_CROSS_THROW(\"Invalid return type for sparse feedback.\");\n\temit_uninitialized_temporary(return_type.member_types[0], feedback_id);\n\temit_uninitialized_temporary(return_type.member_types[1], texel_id);\n}\n\nuint32_t CompilerGLSL::get_sparse_feedback_texel_id(uint32_t id) const\n{\n\tauto itr = extra_sub_expressions.find(id);\n\tif (itr == extra_sub_expressions.end())\n\t\treturn 0;\n\telse\n\t\treturn itr->second + 1;\n}\n\nvoid CompilerGLSL::emit_texture_op(const Instruction &i, bool sparse)\n{\n\tauto *ops = stream(i);\n\tauto op = static_cast<Op>(i.op);\n\n\tSmallVector<uint32_t> inherited_expressions;\n\n\tuint32_t result_type_id = ops[0];\n\tuint32_t id = ops[1];\n\tauto &return_type = get<SPIRType>(result_type_id);\n\n\tuint32_t sparse_code_id = 0;\n\tuint32_t sparse_texel_id = 0;\n\tif (sparse)\n\t\temit_sparse_feedback_temporaries(result_type_id, id, sparse_code_id, sparse_texel_id);\n\n\tbool forward = false;\n\tstring expr = to_texture_op(i, sparse, &forward, inherited_expressions);\n\n\tif (sparse)\n\t{\n\t\tstatement(to_expression(sparse_code_id), \" = \", expr, \";\");\n\t\texpr = join(type_to_glsl(return_type), \"(\", to_expression(sparse_code_id), \", \", to_expression(sparse_texel_id),\n\t\t            \")\");\n\t\tforward = true;\n\t\tinherited_expressions.clear();\n\t}\n\n\temit_op(result_type_id, id, expr, forward);\n\tfor (auto &inherit : inherited_expressions)\n\t\tinherit_expression_dependencies(id, inherit);\n\n\t// Do not register sparse ops as control dependent as they are always lowered to a temporary.\n\tswitch (op)\n\t{\n\tcase OpImageSampleDrefImplicitLod:\n\tcase OpImageSampleImplicitLod:\n\tcase OpImageSampleProjImplicitLod:\n\tcase OpImageSampleProjDrefImplicitLod:\n\t\tregister_control_dependent_expression(id);\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nstd::string CompilerGLSL::to_texture_op(const Instruction &i, bool sparse, bool *forward,\n                                        SmallVector<uint32_t> &inherited_expressions)\n{\n\tauto *ops = stream(i);\n\tauto op = static_cast<Op>(i.op);\n\tuint32_t length = i.length;\n\n\tuint32_t result_type_id = ops[0];\n\tVariableID img = ops[2];\n\tuint32_t coord = ops[3];\n\tuint32_t dref = 0;\n\tuint32_t comp = 0;\n\tbool gather = false;\n\tbool proj = false;\n\tbool fetch = false;\n\tbool nonuniform_expression = false;\n\tconst uint32_t *opt = nullptr;\n\n\tauto &result_type = get<SPIRType>(result_type_id);\n\n\tinherited_expressions.push_back(coord);\n\tif (has_decoration(img, DecorationNonUniform) && !maybe_get_backing_variable(img))\n\t\tnonuniform_expression = true;\n\n\tswitch (op)\n\t{\n\tcase OpImageSampleDrefImplicitLod:\n\tcase OpImageSampleDrefExplicitLod:\n\tcase OpImageSparseSampleDrefImplicitLod:\n\tcase OpImageSparseSampleDrefExplicitLod:\n\t\tdref = ops[4];\n\t\topt = &ops[5];\n\t\tlength -= 5;\n\t\tbreak;\n\n\tcase OpImageSampleProjDrefImplicitLod:\n\tcase OpImageSampleProjDrefExplicitLod:\n\tcase OpImageSparseSampleProjDrefImplicitLod:\n\tcase OpImageSparseSampleProjDrefExplicitLod:\n\t\tdref = ops[4];\n\t\topt = &ops[5];\n\t\tlength -= 5;\n\t\tproj = true;\n\t\tbreak;\n\n\tcase OpImageDrefGather:\n\tcase OpImageSparseDrefGather:\n\t\tdref = ops[4];\n\t\topt = &ops[5];\n\t\tlength -= 5;\n\t\tgather = true;\n\t\tif (options.es && options.version < 310)\n\t\t\tSPIRV_CROSS_THROW(\"textureGather requires ESSL 310.\");\n\t\telse if (!options.es && options.version < 400)\n\t\t\tSPIRV_CROSS_THROW(\"textureGather with depth compare requires GLSL 400.\");\n\t\tbreak;\n\n\tcase OpImageGather:\n\tcase OpImageSparseGather:\n\t\tcomp = ops[4];\n\t\topt = &ops[5];\n\t\tlength -= 5;\n\t\tgather = true;\n\t\tif (options.es && options.version < 310)\n\t\t\tSPIRV_CROSS_THROW(\"textureGather requires ESSL 310.\");\n\t\telse if (!options.es && options.version < 400)\n\t\t{\n\t\t\tif (!expression_is_constant_null(comp))\n\t\t\t\tSPIRV_CROSS_THROW(\"textureGather with component requires GLSL 400.\");\n\t\t\trequire_extension_internal(\"GL_ARB_texture_gather\");\n\t\t}\n\t\tbreak;\n\n\tcase OpImageFetch:\n\tcase OpImageSparseFetch:\n\tcase OpImageRead: // Reads == fetches in Metal (other langs will not get here)\n\t\topt = &ops[4];\n\t\tlength -= 4;\n\t\tfetch = true;\n\t\tbreak;\n\n\tcase OpImageSampleProjImplicitLod:\n\tcase OpImageSampleProjExplicitLod:\n\tcase OpImageSparseSampleProjImplicitLod:\n\tcase OpImageSparseSampleProjExplicitLod:\n\t\topt = &ops[4];\n\t\tlength -= 4;\n\t\tproj = true;\n\t\tbreak;\n\n\tdefault:\n\t\topt = &ops[4];\n\t\tlength -= 4;\n\t\tbreak;\n\t}\n\n\t// Bypass pointers because we need the real image struct\n\tauto &type = expression_type(img);\n\tauto &imgtype = get<SPIRType>(type.self);\n\n\tuint32_t coord_components = 0;\n\tswitch (imgtype.image.dim)\n\t{\n\tcase spv::Dim1D:\n\t\tcoord_components = 1;\n\t\tbreak;\n\tcase spv::Dim2D:\n\t\tcoord_components = 2;\n\t\tbreak;\n\tcase spv::Dim3D:\n\t\tcoord_components = 3;\n\t\tbreak;\n\tcase spv::DimCube:\n\t\tcoord_components = 3;\n\t\tbreak;\n\tcase spv::DimBuffer:\n\t\tcoord_components = 1;\n\t\tbreak;\n\tdefault:\n\t\tcoord_components = 2;\n\t\tbreak;\n\t}\n\n\tif (dref)\n\t\tinherited_expressions.push_back(dref);\n\n\tif (proj)\n\t\tcoord_components++;\n\tif (imgtype.image.arrayed)\n\t\tcoord_components++;\n\n\tuint32_t bias = 0;\n\tuint32_t lod = 0;\n\tuint32_t grad_x = 0;\n\tuint32_t grad_y = 0;\n\tuint32_t coffset = 0;\n\tuint32_t offset = 0;\n\tuint32_t coffsets = 0;\n\tuint32_t sample = 0;\n\tuint32_t minlod = 0;\n\tuint32_t flags = 0;\n\n\tif (length)\n\t{\n\t\tflags = *opt++;\n\t\tlength--;\n\t}\n\n\tauto test = [&](uint32_t &v, uint32_t flag) {\n\t\tif (length && (flags & flag))\n\t\t{\n\t\t\tv = *opt++;\n\t\t\tinherited_expressions.push_back(v);\n\t\t\tlength--;\n\t\t}\n\t};\n\n\ttest(bias, ImageOperandsBiasMask);\n\ttest(lod, ImageOperandsLodMask);\n\ttest(grad_x, ImageOperandsGradMask);\n\ttest(grad_y, ImageOperandsGradMask);\n\ttest(coffset, ImageOperandsConstOffsetMask);\n\ttest(offset, ImageOperandsOffsetMask);\n\ttest(coffsets, ImageOperandsConstOffsetsMask);\n\ttest(sample, ImageOperandsSampleMask);\n\ttest(minlod, ImageOperandsMinLodMask);\n\n\tTextureFunctionBaseArguments base_args = {};\n\tbase_args.img = img;\n\tbase_args.imgtype = &imgtype;\n\tbase_args.is_fetch = fetch != 0;\n\tbase_args.is_gather = gather != 0;\n\tbase_args.is_proj = proj != 0;\n\n\tstring expr;\n\tTextureFunctionNameArguments name_args = {};\n\n\tname_args.base = base_args;\n\tname_args.has_array_offsets = coffsets != 0;\n\tname_args.has_offset = coffset != 0 || offset != 0;\n\tname_args.has_grad = grad_x != 0 || grad_y != 0;\n\tname_args.has_dref = dref != 0;\n\tname_args.is_sparse_feedback = sparse;\n\tname_args.has_min_lod = minlod != 0;\n\tname_args.lod = lod;\n\texpr += to_function_name(name_args);\n\texpr += \"(\";\n\n\tuint32_t sparse_texel_id = 0;\n\tif (sparse)\n\t\tsparse_texel_id = get_sparse_feedback_texel_id(ops[1]);\n\n\tTextureFunctionArguments args = {};\n\targs.base = base_args;\n\targs.coord = coord;\n\targs.coord_components = coord_components;\n\targs.dref = dref;\n\targs.grad_x = grad_x;\n\targs.grad_y = grad_y;\n\targs.lod = lod;\n\n\tif (coffsets)\n\t\targs.offset = coffsets;\n\telse if (coffset)\n\t\targs.offset = coffset;\n\telse\n\t\targs.offset = offset;\n\n\targs.bias = bias;\n\targs.component = comp;\n\targs.sample = sample;\n\targs.sparse_texel = sparse_texel_id;\n\targs.min_lod = minlod;\n\targs.nonuniform_expression = nonuniform_expression;\n\texpr += to_function_args(args, forward);\n\texpr += \")\";\n\n\t// texture(samplerXShadow) returns float. shadowX() returns vec4, but only in desktop GLSL. Swizzle here.\n\tif (is_legacy() && !options.es && is_depth_image(imgtype, img))\n\t\texpr += \".r\";\n\n\t// Sampling from a texture which was deduced to be a depth image, might actually return 1 component here.\n\t// Remap back to 4 components as sampling opcodes expect.\n\tif (backend.comparison_image_samples_scalar && image_opcode_is_sample_no_dref(op))\n\t{\n\t\tbool image_is_depth = false;\n\t\tconst auto *combined = maybe_get<SPIRCombinedImageSampler>(img);\n\t\tVariableID image_id = combined ? combined->image : img;\n\n\t\tif (combined && is_depth_image(imgtype, combined->image))\n\t\t\timage_is_depth = true;\n\t\telse if (is_depth_image(imgtype, img))\n\t\t\timage_is_depth = true;\n\n\t\t// We must also check the backing variable for the image.\n\t\t// We might have loaded an OpImage, and used that handle for two different purposes.\n\t\t// Once with comparison, once without.\n\t\tauto *image_variable = maybe_get_backing_variable(image_id);\n\t\tif (image_variable && is_depth_image(get<SPIRType>(image_variable->basetype), image_variable->self))\n\t\t\timage_is_depth = true;\n\n\t\tif (image_is_depth)\n\t\t\texpr = remap_swizzle(result_type, 1, expr);\n\t}\n\n\tif (!sparse && !backend.support_small_type_sampling_result && result_type.width < 32)\n\t{\n\t\t// Just value cast (narrowing) to expected type since we cannot rely on narrowing to work automatically.\n\t\t// Hopefully compiler picks this up and converts the texturing instruction to the appropriate precision.\n\t\texpr = join(type_to_glsl_constructor(result_type), \"(\", expr, \")\");\n\t}\n\n\t// Deals with reads from MSL. We might need to downconvert to fewer components.\n\tif (op == OpImageRead)\n\t\texpr = remap_swizzle(result_type, 4, expr);\n\n\treturn expr;\n}\n\nbool CompilerGLSL::expression_is_constant_null(uint32_t id) const\n{\n\tauto *c = maybe_get<SPIRConstant>(id);\n\tif (!c)\n\t\treturn false;\n\treturn c->constant_is_null();\n}\n\nbool CompilerGLSL::expression_is_non_value_type_array(uint32_t ptr)\n{\n\tauto &type = expression_type(ptr);\n\tif (!is_array(get_pointee_type(type)))\n\t\treturn false;\n\n\tif (!backend.array_is_value_type)\n\t\treturn true;\n\n\tauto *var = maybe_get_backing_variable(ptr);\n\tif (!var)\n\t\treturn false;\n\n\tauto &backed_type = get<SPIRType>(var->basetype);\n\treturn !backend.array_is_value_type_in_buffer_blocks && backed_type.basetype == SPIRType::Struct &&\n\t       has_member_decoration(backed_type.self, 0, DecorationOffset);\n}\n\n// Returns the function name for a texture sampling function for the specified image and sampling characteristics.\n// For some subclasses, the function is a method on the specified image.\nstring CompilerGLSL::to_function_name(const TextureFunctionNameArguments &args)\n{\n\tif (args.has_min_lod)\n\t{\n\t\tif (options.es)\n\t\t\tSPIRV_CROSS_THROW(\"Sparse residency is not supported in ESSL.\");\n\t\trequire_extension_internal(\"GL_ARB_sparse_texture_clamp\");\n\t}\n\n\tstring fname;\n\tauto &imgtype = *args.base.imgtype;\n\tVariableID tex = args.base.img;\n\n\t// textureLod on sampler2DArrayShadow and samplerCubeShadow does not exist in GLSL for some reason.\n\t// To emulate this, we will have to use textureGrad with a constant gradient of 0.\n\t// The workaround will assert that the LOD is in fact constant 0, or we cannot emit correct code.\n\t// This happens for HLSL SampleCmpLevelZero on Texture2DArray and TextureCube.\n\tbool workaround_lod_array_shadow_as_grad = false;\n\tif (((imgtype.image.arrayed && imgtype.image.dim == Dim2D) || imgtype.image.dim == DimCube) &&\n\t    is_depth_image(imgtype, tex) && args.lod && !args.base.is_fetch)\n\t{\n\t\tif (!expression_is_constant_null(args.lod))\n\t\t{\n\t\t\tSPIRV_CROSS_THROW(\"textureLod on sampler2DArrayShadow is not constant 0.0. This cannot be \"\n\t\t\t                  \"expressed in GLSL.\");\n\t\t}\n\t\tworkaround_lod_array_shadow_as_grad = true;\n\t}\n\n\tif (args.is_sparse_feedback)\n\t\tfname += \"sparse\";\n\n\tif (args.base.is_fetch)\n\t\tfname += args.is_sparse_feedback ? \"TexelFetch\" : \"texelFetch\";\n\telse\n\t{\n\t\tfname += args.is_sparse_feedback ? \"Texture\" : \"texture\";\n\n\t\tif (args.base.is_gather)\n\t\t\tfname += \"Gather\";\n\t\tif (args.has_array_offsets)\n\t\t\tfname += \"Offsets\";\n\t\tif (args.base.is_proj)\n\t\t\tfname += \"Proj\";\n\t\tif (args.has_grad || workaround_lod_array_shadow_as_grad)\n\t\t\tfname += \"Grad\";\n\t\tif (args.lod != 0 && !workaround_lod_array_shadow_as_grad)\n\t\t\tfname += \"Lod\";\n\t}\n\n\tif (args.has_offset)\n\t\tfname += \"Offset\";\n\n\tif (args.has_min_lod)\n\t\tfname += \"Clamp\";\n\n\tif (args.is_sparse_feedback || args.has_min_lod)\n\t\tfname += \"ARB\";\n\n\treturn (is_legacy() && !args.base.is_gather) ? legacy_tex_op(fname, imgtype, tex) : fname;\n}\n\nstd::string CompilerGLSL::convert_separate_image_to_expression(uint32_t id)\n{\n\tauto *var = maybe_get_backing_variable(id);\n\n\t// If we are fetching from a plain OpTypeImage, we must combine with a dummy sampler in GLSL.\n\t// In Vulkan GLSL, we can make use of the newer GL_EXT_samplerless_texture_functions.\n\tif (var)\n\t{\n\t\tauto &type = get<SPIRType>(var->basetype);\n\t\tif (type.basetype == SPIRType::Image && type.image.sampled == 1 && type.image.dim != DimBuffer)\n\t\t{\n\t\t\tif (options.vulkan_semantics)\n\t\t\t{\n\t\t\t\tif (dummy_sampler_id)\n\t\t\t\t{\n\t\t\t\t\t// Don't need to consider Shadow state since the dummy sampler is always non-shadow.\n\t\t\t\t\tauto sampled_type = type;\n\t\t\t\t\tsampled_type.basetype = SPIRType::SampledImage;\n\t\t\t\t\treturn join(type_to_glsl(sampled_type), \"(\", to_non_uniform_aware_expression(id), \", \",\n\t\t\t\t\t            to_expression(dummy_sampler_id), \")\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Newer glslang supports this extension to deal with texture2D as argument to texture functions.\n\t\t\t\t\trequire_extension_internal(\"GL_EXT_samplerless_texture_functions\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (!dummy_sampler_id)\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Cannot find dummy sampler ID. Was \"\n\t\t\t\t\t                  \"build_dummy_sampler_for_combined_images() called?\");\n\n\t\t\t\treturn to_combined_image_sampler(id, dummy_sampler_id);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to_non_uniform_aware_expression(id);\n}\n\n// Returns the function args for a texture sampling function for the specified image and sampling characteristics.\nstring CompilerGLSL::to_function_args(const TextureFunctionArguments &args, bool *p_forward)\n{\n\tVariableID img = args.base.img;\n\tauto &imgtype = *args.base.imgtype;\n\n\tstring farg_str;\n\tif (args.base.is_fetch)\n\t\tfarg_str = convert_separate_image_to_expression(img);\n\telse\n\t\tfarg_str = to_non_uniform_aware_expression(img);\n\n\tif (args.nonuniform_expression && farg_str.find_first_of('[') != string::npos)\n\t{\n\t\t// Only emit nonuniformEXT() wrapper if the underlying expression is arrayed in some way.\n\t\tfarg_str = join(backend.nonuniform_qualifier, \"(\", farg_str, \")\");\n\t}\n\n\tbool swizz_func = backend.swizzle_is_function;\n\tauto swizzle = [swizz_func](uint32_t comps, uint32_t in_comps) -> const char * {\n\t\tif (comps == in_comps)\n\t\t\treturn \"\";\n\n\t\tswitch (comps)\n\t\t{\n\t\tcase 1:\n\t\t\treturn \".x\";\n\t\tcase 2:\n\t\t\treturn swizz_func ? \".xy()\" : \".xy\";\n\t\tcase 3:\n\t\t\treturn swizz_func ? \".xyz()\" : \".xyz\";\n\t\tdefault:\n\t\t\treturn \"\";\n\t\t}\n\t};\n\n\tbool forward = should_forward(args.coord);\n\n\t// The IR can give us more components than we need, so chop them off as needed.\n\tauto swizzle_expr = swizzle(args.coord_components, expression_type(args.coord).vecsize);\n\t// Only enclose the UV expression if needed.\n\tauto coord_expr =\n\t    (*swizzle_expr == '\\0') ? to_expression(args.coord) : (to_enclosed_expression(args.coord) + swizzle_expr);\n\n\t// texelFetch only takes int, not uint.\n\tauto &coord_type = expression_type(args.coord);\n\tif (coord_type.basetype == SPIRType::UInt)\n\t{\n\t\tauto expected_type = coord_type;\n\t\texpected_type.vecsize = args.coord_components;\n\t\texpected_type.basetype = SPIRType::Int;\n\t\tcoord_expr = bitcast_expression(expected_type, coord_type.basetype, coord_expr);\n\t}\n\n\t// textureLod on sampler2DArrayShadow and samplerCubeShadow does not exist in GLSL for some reason.\n\t// To emulate this, we will have to use textureGrad with a constant gradient of 0.\n\t// The workaround will assert that the LOD is in fact constant 0, or we cannot emit correct code.\n\t// This happens for HLSL SampleCmpLevelZero on Texture2DArray and TextureCube.\n\tbool workaround_lod_array_shadow_as_grad =\n\t    ((imgtype.image.arrayed && imgtype.image.dim == Dim2D) || imgtype.image.dim == DimCube) &&\n\t    is_depth_image(imgtype, img) && args.lod != 0 && !args.base.is_fetch;\n\n\tif (args.dref)\n\t{\n\t\tforward = forward && should_forward(args.dref);\n\n\t\t// SPIR-V splits dref and coordinate.\n\t\tif (args.base.is_gather ||\n\t\t    args.coord_components == 4) // GLSL also splits the arguments in two. Same for textureGather.\n\t\t{\n\t\t\tfarg_str += \", \";\n\t\t\tfarg_str += to_expression(args.coord);\n\t\t\tfarg_str += \", \";\n\t\t\tfarg_str += to_expression(args.dref);\n\t\t}\n\t\telse if (args.base.is_proj)\n\t\t{\n\t\t\t// Have to reshuffle so we get vec4(coord, dref, proj), special case.\n\t\t\t// Other shading languages splits up the arguments for coord and compare value like SPIR-V.\n\t\t\t// The coordinate type for textureProj shadow is always vec4 even for sampler1DShadow.\n\t\t\tfarg_str += \", vec4(\";\n\n\t\t\tif (imgtype.image.dim == Dim1D)\n\t\t\t{\n\t\t\t\t// Could reuse coord_expr, but we will mess up the temporary usage checking.\n\t\t\t\tfarg_str += to_enclosed_expression(args.coord) + \".x\";\n\t\t\t\tfarg_str += \", \";\n\t\t\t\tfarg_str += \"0.0, \";\n\t\t\t\tfarg_str += to_expression(args.dref);\n\t\t\t\tfarg_str += \", \";\n\t\t\t\tfarg_str += to_enclosed_expression(args.coord) + \".y)\";\n\t\t\t}\n\t\t\telse if (imgtype.image.dim == Dim2D)\n\t\t\t{\n\t\t\t\t// Could reuse coord_expr, but we will mess up the temporary usage checking.\n\t\t\t\tfarg_str += to_enclosed_expression(args.coord) + (swizz_func ? \".xy()\" : \".xy\");\n\t\t\t\tfarg_str += \", \";\n\t\t\t\tfarg_str += to_expression(args.dref);\n\t\t\t\tfarg_str += \", \";\n\t\t\t\tfarg_str += to_enclosed_expression(args.coord) + \".z)\";\n\t\t\t}\n\t\t\telse\n\t\t\t\tSPIRV_CROSS_THROW(\"Invalid type for textureProj with shadow.\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Create a composite which merges coord/dref into a single vector.\n\t\t\tauto type = expression_type(args.coord);\n\t\t\ttype.vecsize = args.coord_components + 1;\n\t\t\tif (imgtype.image.dim == Dim1D && options.es)\n\t\t\t\ttype.vecsize++;\n\t\t\tfarg_str += \", \";\n\t\t\tfarg_str += type_to_glsl_constructor(type);\n\t\t\tfarg_str += \"(\";\n\n\t\t\tif (imgtype.image.dim == Dim1D && options.es)\n\t\t\t{\n\t\t\t\tif (imgtype.image.arrayed)\n\t\t\t\t{\n\t\t\t\t\tfarg_str += enclose_expression(coord_expr) + \".x\";\n\t\t\t\t\tfarg_str += \", 0.0, \";\n\t\t\t\t\tfarg_str += enclose_expression(coord_expr) + \".y\";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tfarg_str += coord_expr;\n\t\t\t\t\tfarg_str += \", 0.0\";\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tfarg_str += coord_expr;\n\n\t\t\tfarg_str += \", \";\n\t\t\tfarg_str += to_expression(args.dref);\n\t\t\tfarg_str += \")\";\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (imgtype.image.dim == Dim1D && options.es)\n\t\t{\n\t\t\t// Have to fake a second coordinate.\n\t\t\tif (type_is_floating_point(coord_type))\n\t\t\t{\n\t\t\t\t// Cannot mix proj and array.\n\t\t\t\tif (imgtype.image.arrayed || args.base.is_proj)\n\t\t\t\t{\n\t\t\t\t\tcoord_expr = join(\"vec3(\", enclose_expression(coord_expr), \".x, 0.0, \",\n\t\t\t\t\t                  enclose_expression(coord_expr), \".y)\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tcoord_expr = join(\"vec2(\", coord_expr, \", 0.0)\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (imgtype.image.arrayed)\n\t\t\t\t{\n\t\t\t\t\tcoord_expr = join(\"ivec3(\", enclose_expression(coord_expr),\n\t\t\t\t\t\t\t\t\t  \".x, 0, \",\n\t\t\t\t\t\t\t\t\t  enclose_expression(coord_expr), \".y)\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tcoord_expr = join(\"ivec2(\", coord_expr, \", 0)\");\n\t\t\t}\n\t\t}\n\n\t\tfarg_str += \", \";\n\t\tfarg_str += coord_expr;\n\t}\n\n\tif (args.grad_x || args.grad_y)\n\t{\n\t\tforward = forward && should_forward(args.grad_x);\n\t\tforward = forward && should_forward(args.grad_y);\n\t\tfarg_str += \", \";\n\t\tfarg_str += to_expression(args.grad_x);\n\t\tfarg_str += \", \";\n\t\tfarg_str += to_expression(args.grad_y);\n\t}\n\n\tif (args.lod)\n\t{\n\t\tif (workaround_lod_array_shadow_as_grad)\n\t\t{\n\t\t\t// Implement textureGrad() instead. LOD == 0.0 is implemented as gradient of 0.0.\n\t\t\t// Implementing this as plain texture() is not safe on some implementations.\n\t\t\tif (imgtype.image.dim == Dim2D)\n\t\t\t\tfarg_str += \", vec2(0.0), vec2(0.0)\";\n\t\t\telse if (imgtype.image.dim == DimCube)\n\t\t\t\tfarg_str += \", vec3(0.0), vec3(0.0)\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tforward = forward && should_forward(args.lod);\n\t\t\tfarg_str += \", \";\n\n\t\t\t// Lod expression for TexelFetch in GLSL must be int, and only int.\n\t\t\tif (args.base.is_fetch && imgtype.image.dim != DimBuffer && !imgtype.image.ms)\n\t\t\t\tfarg_str += bitcast_expression(SPIRType::Int, args.lod);\n\t\t\telse\n\t\t\t\tfarg_str += to_expression(args.lod);\n\t\t}\n\t}\n\telse if (args.base.is_fetch && imgtype.image.dim != DimBuffer && !imgtype.image.ms)\n\t{\n\t\t// Lod argument is optional in OpImageFetch, but we require a LOD value, pick 0 as the default.\n\t\tfarg_str += \", 0\";\n\t}\n\n\tif (args.offset)\n\t{\n\t\tforward = forward && should_forward(args.offset);\n\t\tfarg_str += \", \";\n\t\tfarg_str += bitcast_expression(SPIRType::Int, args.offset);\n\t}\n\n\tif (args.sample)\n\t{\n\t\tfarg_str += \", \";\n\t\tfarg_str += bitcast_expression(SPIRType::Int, args.sample);\n\t}\n\n\tif (args.min_lod)\n\t{\n\t\tfarg_str += \", \";\n\t\tfarg_str += to_expression(args.min_lod);\n\t}\n\n\tif (args.sparse_texel)\n\t{\n\t\t// Sparse texel output parameter comes after everything else, except it's before the optional, component/bias arguments.\n\t\tfarg_str += \", \";\n\t\tfarg_str += to_expression(args.sparse_texel);\n\t}\n\n\tif (args.bias)\n\t{\n\t\tforward = forward && should_forward(args.bias);\n\t\tfarg_str += \", \";\n\t\tfarg_str += to_expression(args.bias);\n\t}\n\n\tif (args.component && !expression_is_constant_null(args.component))\n\t{\n\t\tforward = forward && should_forward(args.component);\n\t\tfarg_str += \", \";\n\t\tfarg_str += bitcast_expression(SPIRType::Int, args.component);\n\t}\n\n\t*p_forward = forward;\n\n\treturn farg_str;\n}\n\nOp CompilerGLSL::get_remapped_spirv_op(Op op) const\n{\n\tif (options.relax_nan_checks)\n\t{\n\t\tswitch (op)\n\t\t{\n\t\tcase OpFUnordLessThan:\n\t\t\top = OpFOrdLessThan;\n\t\t\tbreak;\n\t\tcase OpFUnordLessThanEqual:\n\t\t\top = OpFOrdLessThanEqual;\n\t\t\tbreak;\n\t\tcase OpFUnordGreaterThan:\n\t\t\top = OpFOrdGreaterThan;\n\t\t\tbreak;\n\t\tcase OpFUnordGreaterThanEqual:\n\t\t\top = OpFOrdGreaterThanEqual;\n\t\t\tbreak;\n\t\tcase OpFUnordEqual:\n\t\t\top = OpFOrdEqual;\n\t\t\tbreak;\n\t\tcase OpFOrdNotEqual:\n\t\t\top = OpFUnordNotEqual;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn op;\n}\n\nGLSLstd450 CompilerGLSL::get_remapped_glsl_op(GLSLstd450 std450_op) const\n{\n\t// Relax to non-NaN aware opcodes.\n\tif (options.relax_nan_checks)\n\t{\n\t\tswitch (std450_op)\n\t\t{\n\t\tcase GLSLstd450NClamp:\n\t\t\tstd450_op = GLSLstd450FClamp;\n\t\t\tbreak;\n\t\tcase GLSLstd450NMin:\n\t\t\tstd450_op = GLSLstd450FMin;\n\t\t\tbreak;\n\t\tcase GLSLstd450NMax:\n\t\t\tstd450_op = GLSLstd450FMax;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn std450_op;\n}\n\nvoid CompilerGLSL::emit_glsl_op(uint32_t result_type, uint32_t id, uint32_t eop, const uint32_t *args, uint32_t length)\n{\n\tauto op = static_cast<GLSLstd450>(eop);\n\n\tif (is_legacy() && is_unsigned_glsl_opcode(op))\n\t\tSPIRV_CROSS_THROW(\"Unsigned integers are not supported on legacy GLSL targets.\");\n\n\t// If we need to do implicit bitcasts, make sure we do it with the correct type.\n\tuint32_t integer_width = get_integer_width_for_glsl_instruction(op, args, length);\n\tauto int_type = to_signed_basetype(integer_width);\n\tauto uint_type = to_unsigned_basetype(integer_width);\n\n\top = get_remapped_glsl_op(op);\n\n\tswitch (op)\n\t{\n\t// FP fiddling\n\tcase GLSLstd450Round:\n\t\tif (!is_legacy())\n\t\t\temit_unary_func_op(result_type, id, args[0], \"round\");\n\t\telse\n\t\t{\n\t\t\tauto op0 = to_enclosed_expression(args[0]);\n\t\t\tauto &op0_type = expression_type(args[0]);\n\t\t\tauto expr = join(\"floor(\", op0, \" + \", type_to_glsl_constructor(op0_type), \"(0.5))\");\n\t\t\tbool forward = should_forward(args[0]);\n\t\t\temit_op(result_type, id, expr, forward);\n\t\t\tinherit_expression_dependencies(id, args[0]);\n\t\t}\n\t\tbreak;\n\n\tcase GLSLstd450RoundEven:\n\t\tif (!is_legacy())\n\t\t\temit_unary_func_op(result_type, id, args[0], \"roundEven\");\n\t\telse if (!options.es)\n\t\t{\n\t\t\t// This extension provides round() with round-to-even semantics.\n\t\t\trequire_extension_internal(\"GL_EXT_gpu_shader4\");\n\t\t\temit_unary_func_op(result_type, id, args[0], \"round\");\n\t\t}\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"roundEven supported only in ESSL 300.\");\n\t\tbreak;\n\n\tcase GLSLstd450Trunc:\n\t\tif (!is_legacy())\n\t\t\temit_unary_func_op(result_type, id, args[0], \"trunc\");\n\t\telse\n\t\t{\n\t\t\t// Implement by value-casting to int and back.\n\t\t\tbool forward = should_forward(args[0]);\n\t\t\tauto op0 = to_unpacked_expression(args[0]);\n\t\t\tauto &op0_type = expression_type(args[0]);\n\t\t\tauto via_type = op0_type;\n\t\t\tvia_type.basetype = SPIRType::Int;\n\t\t\tauto expr = join(type_to_glsl(op0_type), \"(\", type_to_glsl(via_type), \"(\", op0, \"))\");\n\t\t\temit_op(result_type, id, expr, forward);\n\t\t\tinherit_expression_dependencies(id, args[0]);\n\t\t}\n\t\tbreak;\n\n\tcase GLSLstd450SAbs:\n\t\temit_unary_func_op_cast(result_type, id, args[0], \"abs\", int_type, int_type);\n\t\tbreak;\n\tcase GLSLstd450FAbs:\n\t\temit_unary_func_op(result_type, id, args[0], \"abs\");\n\t\tbreak;\n\tcase GLSLstd450SSign:\n\t\temit_unary_func_op_cast(result_type, id, args[0], \"sign\", int_type, int_type);\n\t\tbreak;\n\tcase GLSLstd450FSign:\n\t\temit_unary_func_op(result_type, id, args[0], \"sign\");\n\t\tbreak;\n\tcase GLSLstd450Floor:\n\t\temit_unary_func_op(result_type, id, args[0], \"floor\");\n\t\tbreak;\n\tcase GLSLstd450Ceil:\n\t\temit_unary_func_op(result_type, id, args[0], \"ceil\");\n\t\tbreak;\n\tcase GLSLstd450Fract:\n\t\temit_unary_func_op(result_type, id, args[0], \"fract\");\n\t\tbreak;\n\tcase GLSLstd450Radians:\n\t\temit_unary_func_op(result_type, id, args[0], \"radians\");\n\t\tbreak;\n\tcase GLSLstd450Degrees:\n\t\temit_unary_func_op(result_type, id, args[0], \"degrees\");\n\t\tbreak;\n\tcase GLSLstd450Fma:\n\t\tif ((!options.es && options.version < 400) || (options.es && options.version < 320))\n\t\t{\n\t\t\tauto expr = join(to_enclosed_expression(args[0]), \" * \", to_enclosed_expression(args[1]), \" + \",\n\t\t\t                 to_enclosed_expression(args[2]));\n\n\t\t\temit_op(result_type, id, expr,\n\t\t\t        should_forward(args[0]) && should_forward(args[1]) && should_forward(args[2]));\n\t\t\tfor (uint32_t i = 0; i < 3; i++)\n\t\t\t\tinherit_expression_dependencies(id, args[i]);\n\t\t}\n\t\telse\n\t\t\temit_trinary_func_op(result_type, id, args[0], args[1], args[2], \"fma\");\n\t\tbreak;\n\n\tcase GLSLstd450Modf:\n\t\tregister_call_out_argument(args[1]);\n\t\tif (!is_legacy())\n\t\t{\n\t\t\tforced_temporaries.insert(id);\n\t\t\temit_binary_func_op(result_type, id, args[0], args[1], \"modf\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//NB. legacy GLSL doesn't have trunc() either, so we do a value cast\n\t\t\tauto &op1_type = expression_type(args[1]);\n\t\t\tauto via_type = op1_type;\n\t\t\tvia_type.basetype = SPIRType::Int;\n\t\t\tstatement(to_expression(args[1]), \" = \",\n\t\t\t          type_to_glsl(op1_type), \"(\", type_to_glsl(via_type),\n\t\t\t          \"(\", to_expression(args[0]), \"));\");\n\t\t\temit_binary_op(result_type, id, args[0], args[1], \"-\");\n\t\t}\n\t\tbreak;\n\n\tcase GLSLstd450ModfStruct:\n\t{\n\t\tauto &type = get<SPIRType>(result_type);\n\t\temit_uninitialized_temporary_expression(result_type, id);\n\t\tif (!is_legacy())\n\t\t{\n\t\t\tstatement(to_expression(id), \".\", to_member_name(type, 0), \" = \", \"modf(\", to_expression(args[0]), \", \",\n\t\t\t          to_expression(id), \".\", to_member_name(type, 1), \");\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//NB. legacy GLSL doesn't have trunc() either, so we do a value cast\n\t\t\tauto &op0_type = expression_type(args[0]);\n\t\t\tauto via_type = op0_type;\n\t\t\tvia_type.basetype = SPIRType::Int;\n\t\t\tstatement(to_expression(id), \".\", to_member_name(type, 1), \" = \", type_to_glsl(op0_type),\n\t\t\t          \"(\", type_to_glsl(via_type), \"(\", to_expression(args[0]), \"));\");\n\t\t\tstatement(to_expression(id), \".\", to_member_name(type, 0), \" = \", to_enclosed_expression(args[0]), \" - \",\n\t\t\t          to_expression(id), \".\", to_member_name(type, 1), \";\");\n\t\t}\n\t\tbreak;\n\t}\n\n\t// Minmax\n\tcase GLSLstd450UMin:\n\t\temit_binary_func_op_cast(result_type, id, args[0], args[1], \"min\", uint_type, false);\n\t\tbreak;\n\n\tcase GLSLstd450SMin:\n\t\temit_binary_func_op_cast(result_type, id, args[0], args[1], \"min\", int_type, false);\n\t\tbreak;\n\n\tcase GLSLstd450FMin:\n\t\temit_binary_func_op(result_type, id, args[0], args[1], \"min\");\n\t\tbreak;\n\n\tcase GLSLstd450FMax:\n\t\temit_binary_func_op(result_type, id, args[0], args[1], \"max\");\n\t\tbreak;\n\n\tcase GLSLstd450UMax:\n\t\temit_binary_func_op_cast(result_type, id, args[0], args[1], \"max\", uint_type, false);\n\t\tbreak;\n\n\tcase GLSLstd450SMax:\n\t\temit_binary_func_op_cast(result_type, id, args[0], args[1], \"max\", int_type, false);\n\t\tbreak;\n\n\tcase GLSLstd450FClamp:\n\t\temit_trinary_func_op(result_type, id, args[0], args[1], args[2], \"clamp\");\n\t\tbreak;\n\n\tcase GLSLstd450UClamp:\n\t\temit_trinary_func_op_cast(result_type, id, args[0], args[1], args[2], \"clamp\", uint_type);\n\t\tbreak;\n\n\tcase GLSLstd450SClamp:\n\t\temit_trinary_func_op_cast(result_type, id, args[0], args[1], args[2], \"clamp\", int_type);\n\t\tbreak;\n\n\t// Trig\n\tcase GLSLstd450Sin:\n\t\temit_unary_func_op(result_type, id, args[0], \"sin\");\n\t\tbreak;\n\tcase GLSLstd450Cos:\n\t\temit_unary_func_op(result_type, id, args[0], \"cos\");\n\t\tbreak;\n\tcase GLSLstd450Tan:\n\t\temit_unary_func_op(result_type, id, args[0], \"tan\");\n\t\tbreak;\n\tcase GLSLstd450Asin:\n\t\temit_unary_func_op(result_type, id, args[0], \"asin\");\n\t\tbreak;\n\tcase GLSLstd450Acos:\n\t\temit_unary_func_op(result_type, id, args[0], \"acos\");\n\t\tbreak;\n\tcase GLSLstd450Atan:\n\t\temit_unary_func_op(result_type, id, args[0], \"atan\");\n\t\tbreak;\n\tcase GLSLstd450Sinh:\n\t\tif (!is_legacy())\n\t\t\temit_unary_func_op(result_type, id, args[0], \"sinh\");\n\t\telse\n\t\t{\n\t\t\tbool forward = should_forward(args[0]);\n\t\t\tauto expr = join(\"(exp(\", to_expression(args[0]), \") - exp(-\", to_enclosed_expression(args[0]), \")) * 0.5\");\n\t\t\temit_op(result_type, id, expr, forward);\n\t\t\tinherit_expression_dependencies(id, args[0]);\n\t\t}\n\t\tbreak;\n\tcase GLSLstd450Cosh:\n\t\tif (!is_legacy())\n\t\t\temit_unary_func_op(result_type, id, args[0], \"cosh\");\n\t\telse\n\t\t{\n\t\t\tbool forward = should_forward(args[0]);\n\t\t\tauto expr = join(\"(exp(\", to_expression(args[0]), \") + exp(-\", to_enclosed_expression(args[0]), \")) * 0.5\");\n\t\t\temit_op(result_type, id, expr, forward);\n\t\t\tinherit_expression_dependencies(id, args[0]);\n\t\t}\n\t\tbreak;\n\tcase GLSLstd450Tanh:\n\t\tif (!is_legacy())\n\t\t\temit_unary_func_op(result_type, id, args[0], \"tanh\");\n\t\telse\n\t\t{\n\t\t\t// Create temporaries to store the result of exp(arg) and exp(-arg).\n\t\t\tuint32_t &ids = extra_sub_expressions[id];\n\t\t\tif (!ids)\n\t\t\t{\n\t\t\t\tids = ir.increase_bound_by(2);\n\n\t\t\t\t// Inherit precision qualifier (legacy has no NoContraction).\n\t\t\t\tif (has_decoration(id, DecorationRelaxedPrecision))\n\t\t\t\t{\n\t\t\t\t\tset_decoration(ids, DecorationRelaxedPrecision);\n\t\t\t\t\tset_decoration(ids + 1, DecorationRelaxedPrecision);\n\t\t\t\t}\n\t\t\t}\n\t\t\tuint32_t epos_id = ids;\n\t\t\tuint32_t eneg_id = ids + 1;\n\n\t\t\temit_op(result_type, epos_id, join(\"exp(\", to_expression(args[0]), \")\"), false);\n\t\t\temit_op(result_type, eneg_id, join(\"exp(-\", to_enclosed_expression(args[0]), \")\"), false);\n\t\t\tinherit_expression_dependencies(epos_id, args[0]);\n\t\t\tinherit_expression_dependencies(eneg_id, args[0]);\n\n\t\t\tauto expr = join(\"(\", to_enclosed_expression(epos_id), \" - \", to_enclosed_expression(eneg_id), \") / \"\n\t\t\t                 \"(\", to_enclosed_expression(epos_id), \" + \", to_enclosed_expression(eneg_id), \")\");\n\t\t\temit_op(result_type, id, expr, true);\n\t\t\tinherit_expression_dependencies(id, epos_id);\n\t\t\tinherit_expression_dependencies(id, eneg_id);\n\t\t}\n\t\tbreak;\n\tcase GLSLstd450Asinh:\n\t\tif (!is_legacy())\n\t\t\temit_unary_func_op(result_type, id, args[0], \"asinh\");\n\t\telse\n\t\t\temit_emulated_ahyper_op(result_type, id, args[0], GLSLstd450Asinh);\n\t\tbreak;\n\tcase GLSLstd450Acosh:\n\t\tif (!is_legacy())\n\t\t\temit_unary_func_op(result_type, id, args[0], \"acosh\");\n\t\telse\n\t\t\temit_emulated_ahyper_op(result_type, id, args[0], GLSLstd450Acosh);\n\t\tbreak;\n\tcase GLSLstd450Atanh:\n\t\tif (!is_legacy())\n\t\t\temit_unary_func_op(result_type, id, args[0], \"atanh\");\n\t\telse\n\t\t\temit_emulated_ahyper_op(result_type, id, args[0], GLSLstd450Atanh);\n\t\tbreak;\n\tcase GLSLstd450Atan2:\n\t\temit_binary_func_op(result_type, id, args[0], args[1], \"atan\");\n\t\tbreak;\n\n\t// Exponentials\n\tcase GLSLstd450Pow:\n\t\temit_binary_func_op(result_type, id, args[0], args[1], \"pow\");\n\t\tbreak;\n\tcase GLSLstd450Exp:\n\t\temit_unary_func_op(result_type, id, args[0], \"exp\");\n\t\tbreak;\n\tcase GLSLstd450Log:\n\t\temit_unary_func_op(result_type, id, args[0], \"log\");\n\t\tbreak;\n\tcase GLSLstd450Exp2:\n\t\temit_unary_func_op(result_type, id, args[0], \"exp2\");\n\t\tbreak;\n\tcase GLSLstd450Log2:\n\t\temit_unary_func_op(result_type, id, args[0], \"log2\");\n\t\tbreak;\n\tcase GLSLstd450Sqrt:\n\t\temit_unary_func_op(result_type, id, args[0], \"sqrt\");\n\t\tbreak;\n\tcase GLSLstd450InverseSqrt:\n\t\temit_unary_func_op(result_type, id, args[0], \"inversesqrt\");\n\t\tbreak;\n\n\t// Matrix math\n\tcase GLSLstd450Determinant:\n\t{\n\t\t// No need to transpose - it doesn't affect the determinant\n\t\tauto *e = maybe_get<SPIRExpression>(args[0]);\n\t\tbool old_transpose = e && e->need_transpose;\n\t\tif (old_transpose)\n\t\t\te->need_transpose = false;\n\n\t\tif (options.version < 150) // also matches ES 100\n\t\t{\n\t\t\tauto &type = expression_type(args[0]);\n\t\t\tassert(type.vecsize >= 2 && type.vecsize <= 4);\n\t\t\tassert(type.vecsize == type.columns);\n\n\t\t\t// ARB_gpu_shader_fp64 needs GLSL 150, other types are not valid\n\t\t\tif (type.basetype != SPIRType::Float)\n\t\t\t\tSPIRV_CROSS_THROW(\"Unsupported type for matrix determinant\");\n\n\t\t\tbool relaxed = has_decoration(id, DecorationRelaxedPrecision);\n\t\t\trequire_polyfill(static_cast<Polyfill>(PolyfillDeterminant2x2 << (type.vecsize - 2)),\n\t\t\t                 relaxed);\n\t\t\temit_unary_func_op(result_type, id, args[0],\n\t\t\t                   (options.es && relaxed) ? \"spvDeterminantMP\" : \"spvDeterminant\");\n\t\t}\n\t\telse\n\t\t\temit_unary_func_op(result_type, id, args[0], \"determinant\");\n\n\t\tif (old_transpose)\n\t\t\te->need_transpose = true;\n\t\tbreak;\n\t}\n\n\tcase GLSLstd450MatrixInverse:\n\t{\n\t\t// The inverse of the transpose is the same as the transpose of\n\t\t// the inverse, so we can just flip need_transpose of the result.\n\t\tauto *a = maybe_get<SPIRExpression>(args[0]);\n\t\tbool old_transpose = a && a->need_transpose;\n\t\tif (old_transpose)\n\t\t\ta->need_transpose = false;\n\n\t\tconst char *func = \"inverse\";\n\t\tif (options.version < 140) // also matches ES 100\n\t\t{\n\t\t\tauto &type = get<SPIRType>(result_type);\n\t\t\tassert(type.vecsize >= 2 && type.vecsize <= 4);\n\t\t\tassert(type.vecsize == type.columns);\n\n\t\t\t// ARB_gpu_shader_fp64 needs GLSL 150, other types are invalid\n\t\t\tif (type.basetype != SPIRType::Float)\n\t\t\t\tSPIRV_CROSS_THROW(\"Unsupported type for matrix inverse\");\n\n\t\t\tbool relaxed = has_decoration(id, DecorationRelaxedPrecision);\n\t\t\trequire_polyfill(static_cast<Polyfill>(PolyfillMatrixInverse2x2 << (type.vecsize - 2)),\n\t\t\t                 relaxed);\n\t\t\tfunc = (options.es && relaxed) ? \"spvInverseMP\" : \"spvInverse\";\n\t\t}\n\n\t\tbool forward = should_forward(args[0]);\n\t\tauto &e = emit_op(result_type, id, join(func, \"(\", to_unpacked_expression(args[0]), \")\"), forward);\n\t\tinherit_expression_dependencies(id, args[0]);\n\n\t\tif (old_transpose)\n\t\t{\n\t\t\te.need_transpose = true;\n\t\t\ta->need_transpose = true;\n\t\t}\n\t\tbreak;\n\t}\n\n\t// Lerping\n\tcase GLSLstd450FMix:\n\tcase GLSLstd450IMix:\n\t{\n\t\temit_mix_op(result_type, id, args[0], args[1], args[2]);\n\t\tbreak;\n\t}\n\tcase GLSLstd450Step:\n\t\temit_binary_func_op(result_type, id, args[0], args[1], \"step\");\n\t\tbreak;\n\tcase GLSLstd450SmoothStep:\n\t\temit_trinary_func_op(result_type, id, args[0], args[1], args[2], \"smoothstep\");\n\t\tbreak;\n\n\t// Packing\n\tcase GLSLstd450Frexp:\n\t\tregister_call_out_argument(args[1]);\n\t\tforced_temporaries.insert(id);\n\t\temit_binary_func_op(result_type, id, args[0], args[1], \"frexp\");\n\t\tbreak;\n\n\tcase GLSLstd450FrexpStruct:\n\t{\n\t\tauto &type = get<SPIRType>(result_type);\n\t\temit_uninitialized_temporary_expression(result_type, id);\n\t\tstatement(to_expression(id), \".\", to_member_name(type, 0), \" = \", \"frexp(\", to_expression(args[0]), \", \",\n\t\t          to_expression(id), \".\", to_member_name(type, 1), \");\");\n\t\tbreak;\n\t}\n\n\tcase GLSLstd450Ldexp:\n\t{\n\t\tbool forward = should_forward(args[0]) && should_forward(args[1]);\n\n\t\tauto op0 = to_unpacked_expression(args[0]);\n\t\tauto op1 = to_unpacked_expression(args[1]);\n\t\tauto &op1_type = expression_type(args[1]);\n\t\tif (op1_type.basetype != SPIRType::Int)\n\t\t{\n\t\t\t// Need a value cast here.\n\t\t\tauto target_type = op1_type;\n\t\t\ttarget_type.basetype = SPIRType::Int;\n\t\t\top1 = join(type_to_glsl_constructor(target_type), \"(\", op1, \")\");\n\t\t}\n\n\t\tauto expr = join(\"ldexp(\", op0, \", \", op1, \")\");\n\n\t\temit_op(result_type, id, expr, forward);\n\t\tinherit_expression_dependencies(id, args[0]);\n\t\tinherit_expression_dependencies(id, args[1]);\n\t\tbreak;\n\t}\n\n\tcase GLSLstd450PackSnorm4x8:\n\t\temit_unary_func_op(result_type, id, args[0], \"packSnorm4x8\");\n\t\tbreak;\n\tcase GLSLstd450PackUnorm4x8:\n\t\temit_unary_func_op(result_type, id, args[0], \"packUnorm4x8\");\n\t\tbreak;\n\tcase GLSLstd450PackSnorm2x16:\n\t\temit_unary_func_op(result_type, id, args[0], \"packSnorm2x16\");\n\t\tbreak;\n\tcase GLSLstd450PackUnorm2x16:\n\t\temit_unary_func_op(result_type, id, args[0], \"packUnorm2x16\");\n\t\tbreak;\n\tcase GLSLstd450PackHalf2x16:\n\t\temit_unary_func_op(result_type, id, args[0], \"packHalf2x16\");\n\t\tbreak;\n\tcase GLSLstd450UnpackSnorm4x8:\n\t\temit_unary_func_op(result_type, id, args[0], \"unpackSnorm4x8\");\n\t\tbreak;\n\tcase GLSLstd450UnpackUnorm4x8:\n\t\temit_unary_func_op(result_type, id, args[0], \"unpackUnorm4x8\");\n\t\tbreak;\n\tcase GLSLstd450UnpackSnorm2x16:\n\t\temit_unary_func_op(result_type, id, args[0], \"unpackSnorm2x16\");\n\t\tbreak;\n\tcase GLSLstd450UnpackUnorm2x16:\n\t\temit_unary_func_op(result_type, id, args[0], \"unpackUnorm2x16\");\n\t\tbreak;\n\tcase GLSLstd450UnpackHalf2x16:\n\t\temit_unary_func_op(result_type, id, args[0], \"unpackHalf2x16\");\n\t\tbreak;\n\n\tcase GLSLstd450PackDouble2x32:\n\t\temit_unary_func_op(result_type, id, args[0], \"packDouble2x32\");\n\t\tbreak;\n\tcase GLSLstd450UnpackDouble2x32:\n\t\temit_unary_func_op(result_type, id, args[0], \"unpackDouble2x32\");\n\t\tbreak;\n\n\t// Vector math\n\tcase GLSLstd450Length:\n\t\temit_unary_func_op(result_type, id, args[0], \"length\");\n\t\tbreak;\n\tcase GLSLstd450Distance:\n\t\temit_binary_func_op(result_type, id, args[0], args[1], \"distance\");\n\t\tbreak;\n\tcase GLSLstd450Cross:\n\t\temit_binary_func_op(result_type, id, args[0], args[1], \"cross\");\n\t\tbreak;\n\tcase GLSLstd450Normalize:\n\t\temit_unary_func_op(result_type, id, args[0], \"normalize\");\n\t\tbreak;\n\tcase GLSLstd450FaceForward:\n\t\temit_trinary_func_op(result_type, id, args[0], args[1], args[2], \"faceforward\");\n\t\tbreak;\n\tcase GLSLstd450Reflect:\n\t\temit_binary_func_op(result_type, id, args[0], args[1], \"reflect\");\n\t\tbreak;\n\tcase GLSLstd450Refract:\n\t\temit_trinary_func_op(result_type, id, args[0], args[1], args[2], \"refract\");\n\t\tbreak;\n\n\t// Bit-fiddling\n\tcase GLSLstd450FindILsb:\n\t\t// findLSB always returns int.\n\t\temit_unary_func_op_cast(result_type, id, args[0], \"findLSB\", expression_type(args[0]).basetype, int_type);\n\t\tbreak;\n\n\tcase GLSLstd450FindSMsb:\n\t\temit_unary_func_op_cast(result_type, id, args[0], \"findMSB\", int_type, int_type);\n\t\tbreak;\n\n\tcase GLSLstd450FindUMsb:\n\t\temit_unary_func_op_cast(result_type, id, args[0], \"findMSB\", uint_type,\n\t\t                        int_type); // findMSB always returns int.\n\t\tbreak;\n\n\t// Multisampled varying\n\tcase GLSLstd450InterpolateAtCentroid:\n\t\temit_unary_func_op(result_type, id, args[0], \"interpolateAtCentroid\");\n\t\tbreak;\n\tcase GLSLstd450InterpolateAtSample:\n\t\temit_binary_func_op(result_type, id, args[0], args[1], \"interpolateAtSample\");\n\t\tbreak;\n\tcase GLSLstd450InterpolateAtOffset:\n\t\temit_binary_func_op(result_type, id, args[0], args[1], \"interpolateAtOffset\");\n\t\tbreak;\n\n\tcase GLSLstd450NMin:\n\tcase GLSLstd450NMax:\n\t{\n\t\temit_nminmax_op(result_type, id, args[0], args[1], op);\n\t\tbreak;\n\t}\n\n\tcase GLSLstd450NClamp:\n\t{\n\t\t// Make sure we have a unique ID here to avoid aliasing the extra sub-expressions between clamp and NMin sub-op.\n\t\t// IDs cannot exceed 24 bits, so we can make use of the higher bits for some unique flags.\n\t\tuint32_t &max_id = extra_sub_expressions[id | EXTRA_SUB_EXPRESSION_TYPE_AUX];\n\t\tif (!max_id)\n\t\t\tmax_id = ir.increase_bound_by(1);\n\n\t\t// Inherit precision qualifiers.\n\t\tir.meta[max_id] = ir.meta[id];\n\n\t\temit_nminmax_op(result_type, max_id, args[0], args[1], GLSLstd450NMax);\n\t\temit_nminmax_op(result_type, id, max_id, args[2], GLSLstd450NMin);\n\t\tbreak;\n\t}\n\n\tdefault:\n\t\tstatement(\"// unimplemented GLSL op \", eop);\n\t\tbreak;\n\t}\n}\n\nvoid CompilerGLSL::emit_nminmax_op(uint32_t result_type, uint32_t id, uint32_t op0, uint32_t op1, GLSLstd450 op)\n{\n\t// Need to emulate this call.\n\tuint32_t &ids = extra_sub_expressions[id];\n\tif (!ids)\n\t{\n\t\tids = ir.increase_bound_by(5);\n\t\tauto btype = get<SPIRType>(result_type);\n\t\tbtype.basetype = SPIRType::Boolean;\n\t\tset<SPIRType>(ids, btype);\n\t}\n\n\tuint32_t btype_id = ids + 0;\n\tuint32_t left_nan_id = ids + 1;\n\tuint32_t right_nan_id = ids + 2;\n\tuint32_t tmp_id = ids + 3;\n\tuint32_t mixed_first_id = ids + 4;\n\n\t// Inherit precision qualifiers.\n\tir.meta[tmp_id] = ir.meta[id];\n\tir.meta[mixed_first_id] = ir.meta[id];\n\n\tif (!is_legacy())\n\t{\n\t\temit_unary_func_op(btype_id, left_nan_id, op0, \"isnan\");\n\t\temit_unary_func_op(btype_id, right_nan_id, op1, \"isnan\");\n\t}\n\telse if (expression_type(op0).vecsize > 1)\n\t{\n\t\t// If the number doesn't equal itself, it must be NaN\n\t\temit_binary_func_op(btype_id, left_nan_id, op0, op0, \"notEqual\");\n\t\temit_binary_func_op(btype_id, right_nan_id, op1, op1, \"notEqual\");\n\t}\n\telse\n\t{\n\t\temit_binary_op(btype_id, left_nan_id, op0, op0, \"!=\");\n\t\temit_binary_op(btype_id, right_nan_id, op1, op1, \"!=\");\n\t}\n\temit_binary_func_op(result_type, tmp_id, op0, op1, op == GLSLstd450NMin ? \"min\" : \"max\");\n\temit_mix_op(result_type, mixed_first_id, tmp_id, op1, left_nan_id);\n\temit_mix_op(result_type, id, mixed_first_id, op0, right_nan_id);\n}\n\nvoid CompilerGLSL::emit_emulated_ahyper_op(uint32_t result_type, uint32_t id, uint32_t op0, GLSLstd450 op)\n{\n\tconst char *one = backend.float_literal_suffix ? \"1.0f\" : \"1.0\";\n\tstd::string expr;\n\tbool forward = should_forward(op0);\n\n\tswitch (op)\n\t{\n\tcase GLSLstd450Asinh:\n\t\texpr = join(\"log(\", to_enclosed_expression(op0), \" + sqrt(\",\n\t\t            to_enclosed_expression(op0), \" * \", to_enclosed_expression(op0), \" + \", one, \"))\");\n\t\temit_op(result_type, id, expr, forward);\n\t\tbreak;\n\n\tcase GLSLstd450Acosh:\n\t\texpr = join(\"log(\", to_enclosed_expression(op0), \" + sqrt(\",\n\t\t            to_enclosed_expression(op0), \" * \", to_enclosed_expression(op0), \" - \", one, \"))\");\n\t\tbreak;\n\n\tcase GLSLstd450Atanh:\n\t\texpr = join(\"log((\", one, \" + \", to_enclosed_expression(op0), \") / \"\n\t\t            \"(\", one, \" - \", to_enclosed_expression(op0), \")) * 0.5\",\n\t\t            backend.float_literal_suffix ? \"f\" : \"\");\n\t\tbreak;\n\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Invalid op.\");\n\t}\n\n\temit_op(result_type, id, expr, forward);\n\tinherit_expression_dependencies(id, op0);\n}\n\nvoid CompilerGLSL::emit_spv_amd_shader_ballot_op(uint32_t result_type, uint32_t id, uint32_t eop, const uint32_t *args,\n                                                 uint32_t)\n{\n\trequire_extension_internal(\"GL_AMD_shader_ballot\");\n\n\tenum AMDShaderBallot\n\t{\n\t\tSwizzleInvocationsAMD = 1,\n\t\tSwizzleInvocationsMaskedAMD = 2,\n\t\tWriteInvocationAMD = 3,\n\t\tMbcntAMD = 4\n\t};\n\n\tauto op = static_cast<AMDShaderBallot>(eop);\n\n\tswitch (op)\n\t{\n\tcase SwizzleInvocationsAMD:\n\t\temit_binary_func_op(result_type, id, args[0], args[1], \"swizzleInvocationsAMD\");\n\t\tregister_control_dependent_expression(id);\n\t\tbreak;\n\n\tcase SwizzleInvocationsMaskedAMD:\n\t\temit_binary_func_op(result_type, id, args[0], args[1], \"swizzleInvocationsMaskedAMD\");\n\t\tregister_control_dependent_expression(id);\n\t\tbreak;\n\n\tcase WriteInvocationAMD:\n\t\temit_trinary_func_op(result_type, id, args[0], args[1], args[2], \"writeInvocationAMD\");\n\t\tregister_control_dependent_expression(id);\n\t\tbreak;\n\n\tcase MbcntAMD:\n\t\temit_unary_func_op(result_type, id, args[0], \"mbcntAMD\");\n\t\tregister_control_dependent_expression(id);\n\t\tbreak;\n\n\tdefault:\n\t\tstatement(\"// unimplemented SPV AMD shader ballot op \", eop);\n\t\tbreak;\n\t}\n}\n\nvoid CompilerGLSL::emit_spv_amd_shader_explicit_vertex_parameter_op(uint32_t result_type, uint32_t id, uint32_t eop,\n                                                                    const uint32_t *args, uint32_t)\n{\n\trequire_extension_internal(\"GL_AMD_shader_explicit_vertex_parameter\");\n\n\tenum AMDShaderExplicitVertexParameter\n\t{\n\t\tInterpolateAtVertexAMD = 1\n\t};\n\n\tauto op = static_cast<AMDShaderExplicitVertexParameter>(eop);\n\n\tswitch (op)\n\t{\n\tcase InterpolateAtVertexAMD:\n\t\temit_binary_func_op(result_type, id, args[0], args[1], \"interpolateAtVertexAMD\");\n\t\tbreak;\n\n\tdefault:\n\t\tstatement(\"// unimplemented SPV AMD shader explicit vertex parameter op \", eop);\n\t\tbreak;\n\t}\n}\n\nvoid CompilerGLSL::emit_spv_amd_shader_trinary_minmax_op(uint32_t result_type, uint32_t id, uint32_t eop,\n                                                         const uint32_t *args, uint32_t)\n{\n\trequire_extension_internal(\"GL_AMD_shader_trinary_minmax\");\n\n\tenum AMDShaderTrinaryMinMax\n\t{\n\t\tFMin3AMD = 1,\n\t\tUMin3AMD = 2,\n\t\tSMin3AMD = 3,\n\t\tFMax3AMD = 4,\n\t\tUMax3AMD = 5,\n\t\tSMax3AMD = 6,\n\t\tFMid3AMD = 7,\n\t\tUMid3AMD = 8,\n\t\tSMid3AMD = 9\n\t};\n\n\tauto op = static_cast<AMDShaderTrinaryMinMax>(eop);\n\n\tswitch (op)\n\t{\n\tcase FMin3AMD:\n\tcase UMin3AMD:\n\tcase SMin3AMD:\n\t\temit_trinary_func_op(result_type, id, args[0], args[1], args[2], \"min3\");\n\t\tbreak;\n\n\tcase FMax3AMD:\n\tcase UMax3AMD:\n\tcase SMax3AMD:\n\t\temit_trinary_func_op(result_type, id, args[0], args[1], args[2], \"max3\");\n\t\tbreak;\n\n\tcase FMid3AMD:\n\tcase UMid3AMD:\n\tcase SMid3AMD:\n\t\temit_trinary_func_op(result_type, id, args[0], args[1], args[2], \"mid3\");\n\t\tbreak;\n\n\tdefault:\n\t\tstatement(\"// unimplemented SPV AMD shader trinary minmax op \", eop);\n\t\tbreak;\n\t}\n}\n\nvoid CompilerGLSL::emit_spv_amd_gcn_shader_op(uint32_t result_type, uint32_t id, uint32_t eop, const uint32_t *args,\n                                              uint32_t)\n{\n\trequire_extension_internal(\"GL_AMD_gcn_shader\");\n\n\tenum AMDGCNShader\n\t{\n\t\tCubeFaceIndexAMD = 1,\n\t\tCubeFaceCoordAMD = 2,\n\t\tTimeAMD = 3\n\t};\n\n\tauto op = static_cast<AMDGCNShader>(eop);\n\n\tswitch (op)\n\t{\n\tcase CubeFaceIndexAMD:\n\t\temit_unary_func_op(result_type, id, args[0], \"cubeFaceIndexAMD\");\n\t\tbreak;\n\tcase CubeFaceCoordAMD:\n\t\temit_unary_func_op(result_type, id, args[0], \"cubeFaceCoordAMD\");\n\t\tbreak;\n\tcase TimeAMD:\n\t{\n\t\tstring expr = \"timeAMD()\";\n\t\temit_op(result_type, id, expr, true);\n\t\tregister_control_dependent_expression(id);\n\t\tbreak;\n\t}\n\n\tdefault:\n\t\tstatement(\"// unimplemented SPV AMD gcn shader op \", eop);\n\t\tbreak;\n\t}\n}\n\nvoid CompilerGLSL::emit_subgroup_op(const Instruction &i)\n{\n\tconst uint32_t *ops = stream(i);\n\tauto op = static_cast<Op>(i.op);\n\n\tif (!options.vulkan_semantics && !is_supported_subgroup_op_in_opengl(op, ops))\n\t\tSPIRV_CROSS_THROW(\"This subgroup operation is only supported in Vulkan semantics.\");\n\n\t// If we need to do implicit bitcasts, make sure we do it with the correct type.\n\tuint32_t integer_width = get_integer_width_for_instruction(i);\n\tauto int_type = to_signed_basetype(integer_width);\n\tauto uint_type = to_unsigned_basetype(integer_width);\n\n\tswitch (op)\n\t{\n\tcase OpGroupNonUniformElect:\n\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::SubgroupElect);\n\t\tbreak;\n\n\tcase OpGroupNonUniformBallotBitCount:\n\t{\n\t\tconst GroupOperation operation = static_cast<GroupOperation>(ops[3]);\n\t\tif (operation == GroupOperationReduce)\n\t\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::SubgroupBallotBitCount);\n\t\telse if (operation == GroupOperationInclusiveScan || operation == GroupOperationExclusiveScan)\n\t\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::SubgroupInverseBallot_InclBitCount_ExclBitCout);\n\t}\n\tbreak;\n\n\tcase OpGroupNonUniformBallotBitExtract:\n\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::SubgroupBallotBitExtract);\n\t\tbreak;\n\n\tcase OpGroupNonUniformInverseBallot:\n\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::SubgroupInverseBallot_InclBitCount_ExclBitCout);\n\t\tbreak;\n\n\tcase OpGroupNonUniformBallot:\n\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::SubgroupBallot);\n\t\tbreak;\n\n\tcase OpGroupNonUniformBallotFindLSB:\n\tcase OpGroupNonUniformBallotFindMSB:\n\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::SubgroupBallotFindLSB_MSB);\n\t\tbreak;\n\n\tcase OpGroupNonUniformBroadcast:\n\tcase OpGroupNonUniformBroadcastFirst:\n\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::SubgroupBroadcast_First);\n\t\tbreak;\n\n\tcase OpGroupNonUniformShuffle:\n\tcase OpGroupNonUniformShuffleXor:\n\t\trequire_extension_internal(\"GL_KHR_shader_subgroup_shuffle\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformShuffleUp:\n\tcase OpGroupNonUniformShuffleDown:\n\t\trequire_extension_internal(\"GL_KHR_shader_subgroup_shuffle_relative\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformAll:\n\tcase OpGroupNonUniformAny:\n\tcase OpGroupNonUniformAllEqual:\n\t{\n\t\tconst SPIRType &type = expression_type(ops[3]);\n\t\tif (type.basetype == SPIRType::BaseType::Boolean && type.vecsize == 1u)\n\t\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::SubgroupAll_Any_AllEqualBool);\n\t\telse\n\t\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::SubgroupAllEqualT);\n\t}\n\tbreak;\n\n\t// clang-format off\n#define GLSL_GROUP_OP(OP)\\\n\tcase OpGroupNonUniform##OP:\\\n\t{\\\n\t\tauto operation = static_cast<GroupOperation>(ops[3]);\\\n\t\tif (operation == GroupOperationClusteredReduce)\\\n\t\t\trequire_extension_internal(\"GL_KHR_shader_subgroup_clustered\");\\\n\t\telse if (operation == GroupOperationReduce)\\\n\t\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::SubgroupArithmetic##OP##Reduce);\\\n\t\telse if (operation == GroupOperationExclusiveScan)\\\n\t\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::SubgroupArithmetic##OP##ExclusiveScan);\\\n\t\telse if (operation == GroupOperationInclusiveScan)\\\n\t\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::SubgroupArithmetic##OP##InclusiveScan);\\\n\t\telse\\\n\t\t\tSPIRV_CROSS_THROW(\"Invalid group operation.\");\\\n\t\tbreak;\\\n\t}\n\n\tGLSL_GROUP_OP(IAdd)\n\tGLSL_GROUP_OP(FAdd)\n\tGLSL_GROUP_OP(IMul)\n\tGLSL_GROUP_OP(FMul)\n\n#undef GLSL_GROUP_OP\n\t// clang-format on\n\n\tcase OpGroupNonUniformFMin:\n\tcase OpGroupNonUniformFMax:\n\tcase OpGroupNonUniformSMin:\n\tcase OpGroupNonUniformSMax:\n\tcase OpGroupNonUniformUMin:\n\tcase OpGroupNonUniformUMax:\n\tcase OpGroupNonUniformBitwiseAnd:\n\tcase OpGroupNonUniformBitwiseOr:\n\tcase OpGroupNonUniformBitwiseXor:\n\tcase OpGroupNonUniformLogicalAnd:\n\tcase OpGroupNonUniformLogicalOr:\n\tcase OpGroupNonUniformLogicalXor:\n\t{\n\t\tauto operation = static_cast<GroupOperation>(ops[3]);\n\t\tif (operation == GroupOperationClusteredReduce)\n\t\t{\n\t\t\trequire_extension_internal(\"GL_KHR_shader_subgroup_clustered\");\n\t\t}\n\t\telse if (operation == GroupOperationExclusiveScan || operation == GroupOperationInclusiveScan ||\n\t\t         operation == GroupOperationReduce)\n\t\t{\n\t\t\trequire_extension_internal(\"GL_KHR_shader_subgroup_arithmetic\");\n\t\t}\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"Invalid group operation.\");\n\t\tbreak;\n\t}\n\n\tcase OpGroupNonUniformQuadSwap:\n\tcase OpGroupNonUniformQuadBroadcast:\n\t\trequire_extension_internal(\"GL_KHR_shader_subgroup_quad\");\n\t\tbreak;\n\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Invalid opcode for subgroup.\");\n\t}\n\n\tuint32_t result_type = ops[0];\n\tuint32_t id = ops[1];\n\n\tauto scope = static_cast<Scope>(evaluate_constant_u32(ops[2]));\n\tif (scope != ScopeSubgroup)\n\t\tSPIRV_CROSS_THROW(\"Only subgroup scope is supported.\");\n\n\tswitch (op)\n\t{\n\tcase OpGroupNonUniformElect:\n\t\temit_op(result_type, id, \"subgroupElect()\", true);\n\t\tbreak;\n\n\tcase OpGroupNonUniformBroadcast:\n\t\temit_binary_func_op(result_type, id, ops[3], ops[4], \"subgroupBroadcast\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformBroadcastFirst:\n\t\temit_unary_func_op(result_type, id, ops[3], \"subgroupBroadcastFirst\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformBallot:\n\t\temit_unary_func_op(result_type, id, ops[3], \"subgroupBallot\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformInverseBallot:\n\t\temit_unary_func_op(result_type, id, ops[3], \"subgroupInverseBallot\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformBallotBitExtract:\n\t\temit_binary_func_op(result_type, id, ops[3], ops[4], \"subgroupBallotBitExtract\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformBallotFindLSB:\n\t\temit_unary_func_op(result_type, id, ops[3], \"subgroupBallotFindLSB\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformBallotFindMSB:\n\t\temit_unary_func_op(result_type, id, ops[3], \"subgroupBallotFindMSB\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformBallotBitCount:\n\t{\n\t\tauto operation = static_cast<GroupOperation>(ops[3]);\n\t\tif (operation == GroupOperationReduce)\n\t\t\temit_unary_func_op(result_type, id, ops[4], \"subgroupBallotBitCount\");\n\t\telse if (operation == GroupOperationInclusiveScan)\n\t\t\temit_unary_func_op(result_type, id, ops[4], \"subgroupBallotInclusiveBitCount\");\n\t\telse if (operation == GroupOperationExclusiveScan)\n\t\t\temit_unary_func_op(result_type, id, ops[4], \"subgroupBallotExclusiveBitCount\");\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"Invalid BitCount operation.\");\n\t\tbreak;\n\t}\n\n\tcase OpGroupNonUniformShuffle:\n\t\temit_binary_func_op(result_type, id, ops[3], ops[4], \"subgroupShuffle\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformShuffleXor:\n\t\temit_binary_func_op(result_type, id, ops[3], ops[4], \"subgroupShuffleXor\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformShuffleUp:\n\t\temit_binary_func_op(result_type, id, ops[3], ops[4], \"subgroupShuffleUp\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformShuffleDown:\n\t\temit_binary_func_op(result_type, id, ops[3], ops[4], \"subgroupShuffleDown\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformAll:\n\t\temit_unary_func_op(result_type, id, ops[3], \"subgroupAll\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformAny:\n\t\temit_unary_func_op(result_type, id, ops[3], \"subgroupAny\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformAllEqual:\n\t\temit_unary_func_op(result_type, id, ops[3], \"subgroupAllEqual\");\n\t\tbreak;\n\n\t\t// clang-format off\n#define GLSL_GROUP_OP(op, glsl_op) \\\ncase OpGroupNonUniform##op: \\\n\t{ \\\n\t\tauto operation = static_cast<GroupOperation>(ops[3]); \\\n\t\tif (operation == GroupOperationReduce) \\\n\t\t\temit_unary_func_op(result_type, id, ops[4], \"subgroup\" #glsl_op); \\\n\t\telse if (operation == GroupOperationInclusiveScan) \\\n\t\t\temit_unary_func_op(result_type, id, ops[4], \"subgroupInclusive\" #glsl_op); \\\n\t\telse if (operation == GroupOperationExclusiveScan) \\\n\t\t\temit_unary_func_op(result_type, id, ops[4], \"subgroupExclusive\" #glsl_op); \\\n\t\telse if (operation == GroupOperationClusteredReduce) \\\n\t\t\temit_binary_func_op(result_type, id, ops[4], ops[5], \"subgroupClustered\" #glsl_op); \\\n\t\telse \\\n\t\t\tSPIRV_CROSS_THROW(\"Invalid group operation.\"); \\\n\t\tbreak; \\\n\t}\n\n#define GLSL_GROUP_OP_CAST(op, glsl_op, type) \\\ncase OpGroupNonUniform##op: \\\n\t{ \\\n\t\tauto operation = static_cast<GroupOperation>(ops[3]); \\\n\t\tif (operation == GroupOperationReduce) \\\n\t\t\temit_unary_func_op_cast(result_type, id, ops[4], \"subgroup\" #glsl_op, type, type); \\\n\t\telse if (operation == GroupOperationInclusiveScan) \\\n\t\t\temit_unary_func_op_cast(result_type, id, ops[4], \"subgroupInclusive\" #glsl_op, type, type); \\\n\t\telse if (operation == GroupOperationExclusiveScan) \\\n\t\t\temit_unary_func_op_cast(result_type, id, ops[4], \"subgroupExclusive\" #glsl_op, type, type); \\\n\t\telse if (operation == GroupOperationClusteredReduce) \\\n\t\t\temit_binary_func_op_cast_clustered(result_type, id, ops[4], ops[5], \"subgroupClustered\" #glsl_op, type); \\\n\t\telse \\\n\t\t\tSPIRV_CROSS_THROW(\"Invalid group operation.\"); \\\n\t\tbreak; \\\n\t}\n\n\tGLSL_GROUP_OP(FAdd, Add)\n\tGLSL_GROUP_OP(FMul, Mul)\n\tGLSL_GROUP_OP(FMin, Min)\n\tGLSL_GROUP_OP(FMax, Max)\n\tGLSL_GROUP_OP(IAdd, Add)\n\tGLSL_GROUP_OP(IMul, Mul)\n\tGLSL_GROUP_OP_CAST(SMin, Min, int_type)\n\tGLSL_GROUP_OP_CAST(SMax, Max, int_type)\n\tGLSL_GROUP_OP_CAST(UMin, Min, uint_type)\n\tGLSL_GROUP_OP_CAST(UMax, Max, uint_type)\n\tGLSL_GROUP_OP(BitwiseAnd, And)\n\tGLSL_GROUP_OP(BitwiseOr, Or)\n\tGLSL_GROUP_OP(BitwiseXor, Xor)\n\tGLSL_GROUP_OP(LogicalAnd, And)\n\tGLSL_GROUP_OP(LogicalOr, Or)\n\tGLSL_GROUP_OP(LogicalXor, Xor)\n#undef GLSL_GROUP_OP\n#undef GLSL_GROUP_OP_CAST\n\t\t// clang-format on\n\n\tcase OpGroupNonUniformQuadSwap:\n\t{\n\t\tuint32_t direction = evaluate_constant_u32(ops[4]);\n\t\tif (direction == 0)\n\t\t\temit_unary_func_op(result_type, id, ops[3], \"subgroupQuadSwapHorizontal\");\n\t\telse if (direction == 1)\n\t\t\temit_unary_func_op(result_type, id, ops[3], \"subgroupQuadSwapVertical\");\n\t\telse if (direction == 2)\n\t\t\temit_unary_func_op(result_type, id, ops[3], \"subgroupQuadSwapDiagonal\");\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"Invalid quad swap direction.\");\n\t\tbreak;\n\t}\n\n\tcase OpGroupNonUniformQuadBroadcast:\n\t{\n\t\temit_binary_func_op(result_type, id, ops[3], ops[4], \"subgroupQuadBroadcast\");\n\t\tbreak;\n\t}\n\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Invalid opcode for subgroup.\");\n\t}\n\n\tregister_control_dependent_expression(id);\n}\n\nstring CompilerGLSL::bitcast_glsl_op(const SPIRType &out_type, const SPIRType &in_type)\n{\n\t// OpBitcast can deal with pointers.\n\tif (out_type.pointer || in_type.pointer)\n\t{\n\t\tif (out_type.vecsize == 2 || in_type.vecsize == 2)\n\t\t\trequire_extension_internal(\"GL_EXT_buffer_reference_uvec2\");\n\t\treturn type_to_glsl(out_type);\n\t}\n\n\tif (out_type.basetype == in_type.basetype)\n\t\treturn \"\";\n\n\tassert(out_type.basetype != SPIRType::Boolean);\n\tassert(in_type.basetype != SPIRType::Boolean);\n\n\tbool integral_cast = type_is_integral(out_type) && type_is_integral(in_type);\n\tbool same_size_cast = out_type.width == in_type.width;\n\n\t// Trivial bitcast case, casts between integers.\n\tif (integral_cast && same_size_cast)\n\t\treturn type_to_glsl(out_type);\n\n\t// Catch-all 8-bit arithmetic casts (GL_EXT_shader_explicit_arithmetic_types).\n\tif (out_type.width == 8 && in_type.width >= 16 && integral_cast && in_type.vecsize == 1)\n\t\treturn \"unpack8\";\n\telse if (in_type.width == 8 && out_type.width == 16 && integral_cast && out_type.vecsize == 1)\n\t\treturn \"pack16\";\n\telse if (in_type.width == 8 && out_type.width == 32 && integral_cast && out_type.vecsize == 1)\n\t\treturn \"pack32\";\n\n\t// Floating <-> Integer special casts. Just have to enumerate all cases. :(\n\t// 16-bit, 32-bit and 64-bit floats.\n\tif (out_type.basetype == SPIRType::UInt && in_type.basetype == SPIRType::Float)\n\t{\n\t\tif (is_legacy_es())\n\t\t\tSPIRV_CROSS_THROW(\"Float -> Uint bitcast not supported on legacy ESSL.\");\n\t\telse if (!options.es && options.version < 330)\n\t\t\trequire_extension_internal(\"GL_ARB_shader_bit_encoding\");\n\t\treturn \"floatBitsToUint\";\n\t}\n\telse if (out_type.basetype == SPIRType::Int && in_type.basetype == SPIRType::Float)\n\t{\n\t\tif (is_legacy_es())\n\t\t\tSPIRV_CROSS_THROW(\"Float -> Int bitcast not supported on legacy ESSL.\");\n\t\telse if (!options.es && options.version < 330)\n\t\t\trequire_extension_internal(\"GL_ARB_shader_bit_encoding\");\n\t\treturn \"floatBitsToInt\";\n\t}\n\telse if (out_type.basetype == SPIRType::Float && in_type.basetype == SPIRType::UInt)\n\t{\n\t\tif (is_legacy_es())\n\t\t\tSPIRV_CROSS_THROW(\"Uint -> Float bitcast not supported on legacy ESSL.\");\n\t\telse if (!options.es && options.version < 330)\n\t\t\trequire_extension_internal(\"GL_ARB_shader_bit_encoding\");\n\t\treturn \"uintBitsToFloat\";\n\t}\n\telse if (out_type.basetype == SPIRType::Float && in_type.basetype == SPIRType::Int)\n\t{\n\t\tif (is_legacy_es())\n\t\t\tSPIRV_CROSS_THROW(\"Int -> Float bitcast not supported on legacy ESSL.\");\n\t\telse if (!options.es && options.version < 330)\n\t\t\trequire_extension_internal(\"GL_ARB_shader_bit_encoding\");\n\t\treturn \"intBitsToFloat\";\n\t}\n\n\telse if (out_type.basetype == SPIRType::Int64 && in_type.basetype == SPIRType::Double)\n\t\treturn \"doubleBitsToInt64\";\n\telse if (out_type.basetype == SPIRType::UInt64 && in_type.basetype == SPIRType::Double)\n\t\treturn \"doubleBitsToUint64\";\n\telse if (out_type.basetype == SPIRType::Double && in_type.basetype == SPIRType::Int64)\n\t\treturn \"int64BitsToDouble\";\n\telse if (out_type.basetype == SPIRType::Double && in_type.basetype == SPIRType::UInt64)\n\t\treturn \"uint64BitsToDouble\";\n\telse if (out_type.basetype == SPIRType::Short && in_type.basetype == SPIRType::Half)\n\t\treturn \"float16BitsToInt16\";\n\telse if (out_type.basetype == SPIRType::UShort && in_type.basetype == SPIRType::Half)\n\t\treturn \"float16BitsToUint16\";\n\telse if (out_type.basetype == SPIRType::Half && in_type.basetype == SPIRType::Short)\n\t\treturn \"int16BitsToFloat16\";\n\telse if (out_type.basetype == SPIRType::Half && in_type.basetype == SPIRType::UShort)\n\t\treturn \"uint16BitsToFloat16\";\n\n\t// And finally, some even more special purpose casts.\n\tif (out_type.basetype == SPIRType::UInt64 && in_type.basetype == SPIRType::UInt && in_type.vecsize == 2)\n\t\treturn \"packUint2x32\";\n\telse if (out_type.basetype == SPIRType::UInt && in_type.basetype == SPIRType::UInt64 && out_type.vecsize == 2)\n\t\treturn \"unpackUint2x32\";\n\telse if (out_type.basetype == SPIRType::Half && in_type.basetype == SPIRType::UInt && in_type.vecsize == 1)\n\t\treturn \"unpackFloat2x16\";\n\telse if (out_type.basetype == SPIRType::UInt && in_type.basetype == SPIRType::Half && in_type.vecsize == 2)\n\t\treturn \"packFloat2x16\";\n\telse if (out_type.basetype == SPIRType::Int && in_type.basetype == SPIRType::Short && in_type.vecsize == 2)\n\t\treturn \"packInt2x16\";\n\telse if (out_type.basetype == SPIRType::Short && in_type.basetype == SPIRType::Int && in_type.vecsize == 1)\n\t\treturn \"unpackInt2x16\";\n\telse if (out_type.basetype == SPIRType::UInt && in_type.basetype == SPIRType::UShort && in_type.vecsize == 2)\n\t\treturn \"packUint2x16\";\n\telse if (out_type.basetype == SPIRType::UShort && in_type.basetype == SPIRType::UInt && in_type.vecsize == 1)\n\t\treturn \"unpackUint2x16\";\n\telse if (out_type.basetype == SPIRType::Int64 && in_type.basetype == SPIRType::Short && in_type.vecsize == 4)\n\t\treturn \"packInt4x16\";\n\telse if (out_type.basetype == SPIRType::Short && in_type.basetype == SPIRType::Int64 && in_type.vecsize == 1)\n\t\treturn \"unpackInt4x16\";\n\telse if (out_type.basetype == SPIRType::UInt64 && in_type.basetype == SPIRType::UShort && in_type.vecsize == 4)\n\t\treturn \"packUint4x16\";\n\telse if (out_type.basetype == SPIRType::UShort && in_type.basetype == SPIRType::UInt64 && in_type.vecsize == 1)\n\t\treturn \"unpackUint4x16\";\n\n\treturn \"\";\n}\n\nstring CompilerGLSL::bitcast_glsl(const SPIRType &result_type, uint32_t argument)\n{\n\tauto op = bitcast_glsl_op(result_type, expression_type(argument));\n\tif (op.empty())\n\t\treturn to_enclosed_unpacked_expression(argument);\n\telse\n\t\treturn join(op, \"(\", to_unpacked_expression(argument), \")\");\n}\n\nstd::string CompilerGLSL::bitcast_expression(SPIRType::BaseType target_type, uint32_t arg)\n{\n\tauto expr = to_expression(arg);\n\tauto &src_type = expression_type(arg);\n\tif (src_type.basetype != target_type)\n\t{\n\t\tauto target = src_type;\n\t\ttarget.basetype = target_type;\n\t\texpr = join(bitcast_glsl_op(target, src_type), \"(\", expr, \")\");\n\t}\n\n\treturn expr;\n}\n\nstd::string CompilerGLSL::bitcast_expression(const SPIRType &target_type, SPIRType::BaseType expr_type,\n                                             const std::string &expr)\n{\n\tif (target_type.basetype == expr_type)\n\t\treturn expr;\n\n\tauto src_type = target_type;\n\tsrc_type.basetype = expr_type;\n\treturn join(bitcast_glsl_op(target_type, src_type), \"(\", expr, \")\");\n}\n\nstring CompilerGLSL::builtin_to_glsl(BuiltIn builtin, StorageClass storage)\n{\n\tswitch (builtin)\n\t{\n\tcase BuiltInPosition:\n\t\treturn \"gl_Position\";\n\tcase BuiltInPointSize:\n\t\treturn \"gl_PointSize\";\n\tcase BuiltInClipDistance:\n\t{\n\t\tif (options.es)\n\t\t\trequire_extension_internal(\"GL_EXT_clip_cull_distance\");\n\t\treturn \"gl_ClipDistance\";\n\t}\n\tcase BuiltInCullDistance:\n\t{\n\t\tif (options.es)\n\t\t\trequire_extension_internal(\"GL_EXT_clip_cull_distance\");\n\t\treturn \"gl_CullDistance\";\n\t}\n\tcase BuiltInVertexId:\n\t\tif (options.vulkan_semantics)\n\t\t\tSPIRV_CROSS_THROW(\"Cannot implement gl_VertexID in Vulkan GLSL. This shader was created \"\n\t\t\t                  \"with GL semantics.\");\n\t\treturn \"gl_VertexID\";\n\tcase BuiltInInstanceId:\n\t\tif (options.vulkan_semantics)\n\t\t{\n\t\t\tauto model = get_entry_point().model;\n\t\t\tswitch (model)\n\t\t\t{\n\t\t\tcase spv::ExecutionModelIntersectionKHR:\n\t\t\tcase spv::ExecutionModelAnyHitKHR:\n\t\t\tcase spv::ExecutionModelClosestHitKHR:\n\t\t\t\t// gl_InstanceID is allowed in these shaders.\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tSPIRV_CROSS_THROW(\"Cannot implement gl_InstanceID in Vulkan GLSL. This shader was \"\n\t\t\t\t                  \"created with GL semantics.\");\n\t\t\t}\n\t\t}\n\t\tif (!options.es && options.version < 140)\n\t\t{\n\t\t\trequire_extension_internal(\"GL_ARB_draw_instanced\");\n\t\t}\n\t\treturn \"gl_InstanceID\";\n\tcase BuiltInVertexIndex:\n\t\tif (options.vulkan_semantics)\n\t\t\treturn \"gl_VertexIndex\";\n\t\telse\n\t\t\treturn \"gl_VertexID\"; // gl_VertexID already has the base offset applied.\n\tcase BuiltInInstanceIndex:\n\t\tif (options.vulkan_semantics)\n\t\t\treturn \"gl_InstanceIndex\";\n\n\t\tif (!options.es && options.version < 140)\n\t\t{\n\t\t\trequire_extension_internal(\"GL_ARB_draw_instanced\");\n\t\t}\n\n\t\tif (options.vertex.support_nonzero_base_instance)\n\t\t{\n\t\t\tif (!options.vulkan_semantics)\n\t\t\t{\n\t\t\t\t// This is a soft-enable. We will opt-in to using gl_BaseInstanceARB if supported.\n\t\t\t\trequire_extension_internal(\"GL_ARB_shader_draw_parameters\");\n\t\t\t}\n\t\t\treturn \"(gl_InstanceID + SPIRV_Cross_BaseInstance)\"; // ... but not gl_InstanceID.\n\t\t}\n\t\telse\n\t\t\treturn \"gl_InstanceID\";\n\tcase BuiltInPrimitiveId:\n\t\tif (storage == StorageClassInput && get_entry_point().model == ExecutionModelGeometry)\n\t\t\treturn \"gl_PrimitiveIDIn\";\n\t\telse\n\t\t\treturn \"gl_PrimitiveID\";\n\tcase BuiltInInvocationId:\n\t\treturn \"gl_InvocationID\";\n\tcase BuiltInLayer:\n\t\treturn \"gl_Layer\";\n\tcase BuiltInViewportIndex:\n\t\treturn \"gl_ViewportIndex\";\n\tcase BuiltInTessLevelOuter:\n\t\treturn \"gl_TessLevelOuter\";\n\tcase BuiltInTessLevelInner:\n\t\treturn \"gl_TessLevelInner\";\n\tcase BuiltInTessCoord:\n\t\treturn \"gl_TessCoord\";\n\tcase BuiltInPatchVertices:\n\t\treturn \"gl_PatchVerticesIn\";\n\tcase BuiltInFragCoord:\n\t\treturn \"gl_FragCoord\";\n\tcase BuiltInPointCoord:\n\t\treturn \"gl_PointCoord\";\n\tcase BuiltInFrontFacing:\n\t\treturn \"gl_FrontFacing\";\n\tcase BuiltInFragDepth:\n\t\treturn \"gl_FragDepth\";\n\tcase BuiltInNumWorkgroups:\n\t\treturn \"gl_NumWorkGroups\";\n\tcase BuiltInWorkgroupSize:\n\t\treturn \"gl_WorkGroupSize\";\n\tcase BuiltInWorkgroupId:\n\t\treturn \"gl_WorkGroupID\";\n\tcase BuiltInLocalInvocationId:\n\t\treturn \"gl_LocalInvocationID\";\n\tcase BuiltInGlobalInvocationId:\n\t\treturn \"gl_GlobalInvocationID\";\n\tcase BuiltInLocalInvocationIndex:\n\t\treturn \"gl_LocalInvocationIndex\";\n\tcase BuiltInHelperInvocation:\n\t\treturn \"gl_HelperInvocation\";\n\n\tcase BuiltInBaseVertex:\n\t\tif (options.es)\n\t\t\tSPIRV_CROSS_THROW(\"BaseVertex not supported in ES profile.\");\n\n\t\tif (options.vulkan_semantics)\n\t\t{\n\t\t\tif (options.version < 460)\n\t\t\t{\n\t\t\t\trequire_extension_internal(\"GL_ARB_shader_draw_parameters\");\n\t\t\t\treturn \"gl_BaseVertexARB\";\n\t\t\t}\n\t\t\treturn \"gl_BaseVertex\";\n\t\t}\n\t\t// On regular GL, this is soft-enabled and we emit ifdefs in code.\n\t\trequire_extension_internal(\"GL_ARB_shader_draw_parameters\");\n\t\treturn \"SPIRV_Cross_BaseVertex\";\n\n\tcase BuiltInBaseInstance:\n\t\tif (options.es)\n\t\t\tSPIRV_CROSS_THROW(\"BaseInstance not supported in ES profile.\");\n\n\t\tif (options.vulkan_semantics)\n\t\t{\n\t\t\tif (options.version < 460)\n\t\t\t{\n\t\t\t\trequire_extension_internal(\"GL_ARB_shader_draw_parameters\");\n\t\t\t\treturn \"gl_BaseInstanceARB\";\n\t\t\t}\n\t\t\treturn \"gl_BaseInstance\";\n\t\t}\n\t\t// On regular GL, this is soft-enabled and we emit ifdefs in code.\n\t\trequire_extension_internal(\"GL_ARB_shader_draw_parameters\");\n\t\treturn \"SPIRV_Cross_BaseInstance\";\n\n\tcase BuiltInDrawIndex:\n\t\tif (options.es)\n\t\t\tSPIRV_CROSS_THROW(\"DrawIndex not supported in ES profile.\");\n\n\t\tif (options.vulkan_semantics)\n\t\t{\n\t\t\tif (options.version < 460)\n\t\t\t{\n\t\t\t\trequire_extension_internal(\"GL_ARB_shader_draw_parameters\");\n\t\t\t\treturn \"gl_DrawIDARB\";\n\t\t\t}\n\t\t\treturn \"gl_DrawID\";\n\t\t}\n\t\t// On regular GL, this is soft-enabled and we emit ifdefs in code.\n\t\trequire_extension_internal(\"GL_ARB_shader_draw_parameters\");\n\t\treturn \"gl_DrawIDARB\";\n\n\tcase BuiltInSampleId:\n\t\tif (is_legacy())\n\t\t\tSPIRV_CROSS_THROW(\"Sample variables not supported in legacy GLSL.\");\n\t\telse if (options.es && options.version < 320)\n\t\t\trequire_extension_internal(\"GL_OES_sample_variables\");\n\t\telse if (!options.es && options.version < 400)\n\t\t\trequire_extension_internal(\"GL_ARB_sample_shading\");\n\t\treturn \"gl_SampleID\";\n\n\tcase BuiltInSampleMask:\n\t\tif (is_legacy())\n\t\t\tSPIRV_CROSS_THROW(\"Sample variables not supported in legacy GLSL.\");\n\t\telse if (options.es && options.version < 320)\n\t\t\trequire_extension_internal(\"GL_OES_sample_variables\");\n\t\telse if (!options.es && options.version < 400)\n\t\t\trequire_extension_internal(\"GL_ARB_sample_shading\");\n\n\t\tif (storage == StorageClassInput)\n\t\t\treturn \"gl_SampleMaskIn\";\n\t\telse\n\t\t\treturn \"gl_SampleMask\";\n\n\tcase BuiltInSamplePosition:\n\t\tif (is_legacy())\n\t\t\tSPIRV_CROSS_THROW(\"Sample variables not supported in legacy GLSL.\");\n\t\telse if (options.es && options.version < 320)\n\t\t\trequire_extension_internal(\"GL_OES_sample_variables\");\n\t\telse if (!options.es && options.version < 400)\n\t\t\trequire_extension_internal(\"GL_ARB_sample_shading\");\n\t\treturn \"gl_SamplePosition\";\n\n\tcase BuiltInViewIndex:\n\t\tif (options.vulkan_semantics)\n\t\t\treturn \"gl_ViewIndex\";\n\t\telse\n\t\t\treturn \"gl_ViewID_OVR\";\n\n\tcase BuiltInNumSubgroups:\n\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::NumSubgroups);\n\t\treturn \"gl_NumSubgroups\";\n\n\tcase BuiltInSubgroupId:\n\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::SubgroupID);\n\t\treturn \"gl_SubgroupID\";\n\n\tcase BuiltInSubgroupSize:\n\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::SubgroupSize);\n\t\treturn \"gl_SubgroupSize\";\n\n\tcase BuiltInSubgroupLocalInvocationId:\n\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::SubgroupInvocationID);\n\t\treturn \"gl_SubgroupInvocationID\";\n\n\tcase BuiltInSubgroupEqMask:\n\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::SubgroupMask);\n\t\treturn \"gl_SubgroupEqMask\";\n\n\tcase BuiltInSubgroupGeMask:\n\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::SubgroupMask);\n\t\treturn \"gl_SubgroupGeMask\";\n\n\tcase BuiltInSubgroupGtMask:\n\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::SubgroupMask);\n\t\treturn \"gl_SubgroupGtMask\";\n\n\tcase BuiltInSubgroupLeMask:\n\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::SubgroupMask);\n\t\treturn \"gl_SubgroupLeMask\";\n\n\tcase BuiltInSubgroupLtMask:\n\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::SubgroupMask);\n\t\treturn \"gl_SubgroupLtMask\";\n\n\tcase BuiltInLaunchIdKHR:\n\t\treturn ray_tracing_is_khr ? \"gl_LaunchIDEXT\" : \"gl_LaunchIDNV\";\n\tcase BuiltInLaunchSizeKHR:\n\t\treturn ray_tracing_is_khr ? \"gl_LaunchSizeEXT\" : \"gl_LaunchSizeNV\";\n\tcase BuiltInWorldRayOriginKHR:\n\t\treturn ray_tracing_is_khr ? \"gl_WorldRayOriginEXT\" : \"gl_WorldRayOriginNV\";\n\tcase BuiltInWorldRayDirectionKHR:\n\t\treturn ray_tracing_is_khr ? \"gl_WorldRayDirectionEXT\" : \"gl_WorldRayDirectionNV\";\n\tcase BuiltInObjectRayOriginKHR:\n\t\treturn ray_tracing_is_khr ? \"gl_ObjectRayOriginEXT\" : \"gl_ObjectRayOriginNV\";\n\tcase BuiltInObjectRayDirectionKHR:\n\t\treturn ray_tracing_is_khr ? \"gl_ObjectRayDirectionEXT\" : \"gl_ObjectRayDirectionNV\";\n\tcase BuiltInRayTminKHR:\n\t\treturn ray_tracing_is_khr ? \"gl_RayTminEXT\" : \"gl_RayTminNV\";\n\tcase BuiltInRayTmaxKHR:\n\t\treturn ray_tracing_is_khr ? \"gl_RayTmaxEXT\" : \"gl_RayTmaxNV\";\n\tcase BuiltInInstanceCustomIndexKHR:\n\t\treturn ray_tracing_is_khr ? \"gl_InstanceCustomIndexEXT\" : \"gl_InstanceCustomIndexNV\";\n\tcase BuiltInObjectToWorldKHR:\n\t\treturn ray_tracing_is_khr ? \"gl_ObjectToWorldEXT\" : \"gl_ObjectToWorldNV\";\n\tcase BuiltInWorldToObjectKHR:\n\t\treturn ray_tracing_is_khr ? \"gl_WorldToObjectEXT\" : \"gl_WorldToObjectNV\";\n\tcase BuiltInHitTNV:\n\t\t// gl_HitTEXT is an alias of RayTMax in KHR.\n\t\treturn \"gl_HitTNV\";\n\tcase BuiltInHitKindKHR:\n\t\treturn ray_tracing_is_khr ? \"gl_HitKindEXT\" : \"gl_HitKindNV\";\n\tcase BuiltInIncomingRayFlagsKHR:\n\t\treturn ray_tracing_is_khr ? \"gl_IncomingRayFlagsEXT\" : \"gl_IncomingRayFlagsNV\";\n\n\tcase BuiltInBaryCoordKHR:\n\t{\n\t\tif (options.es && options.version < 320)\n\t\t\tSPIRV_CROSS_THROW(\"gl_BaryCoordEXT requires ESSL 320.\");\n\t\telse if (!options.es && options.version < 450)\n\t\t\tSPIRV_CROSS_THROW(\"gl_BaryCoordEXT requires GLSL 450.\");\n\n\t\tif (barycentric_is_nv)\n\t\t{\n\t\t\trequire_extension_internal(\"GL_NV_fragment_shader_barycentric\");\n\t\t\treturn \"gl_BaryCoordNV\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\trequire_extension_internal(\"GL_EXT_fragment_shader_barycentric\");\n\t\t\treturn \"gl_BaryCoordEXT\";\n\t\t}\n\t}\n\n\tcase BuiltInBaryCoordNoPerspNV:\n\t{\n\t\tif (options.es && options.version < 320)\n\t\t\tSPIRV_CROSS_THROW(\"gl_BaryCoordNoPerspEXT requires ESSL 320.\");\n\t\telse if (!options.es && options.version < 450)\n\t\t\tSPIRV_CROSS_THROW(\"gl_BaryCoordNoPerspEXT requires GLSL 450.\");\n\n\t\tif (barycentric_is_nv)\n\t\t{\n\t\t\trequire_extension_internal(\"GL_NV_fragment_shader_barycentric\");\n\t\t\treturn \"gl_BaryCoordNoPerspNV\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\trequire_extension_internal(\"GL_EXT_fragment_shader_barycentric\");\n\t\t\treturn \"gl_BaryCoordNoPerspEXT\";\n\t\t}\n\t}\n\n\tcase BuiltInFragStencilRefEXT:\n\t{\n\t\tif (!options.es)\n\t\t{\n\t\t\trequire_extension_internal(\"GL_ARB_shader_stencil_export\");\n\t\t\treturn \"gl_FragStencilRefARB\";\n\t\t}\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"Stencil export not supported in GLES.\");\n\t}\n\n\tcase BuiltInPrimitiveShadingRateKHR:\n\t{\n\t\tif (!options.vulkan_semantics)\n\t\t\tSPIRV_CROSS_THROW(\"Can only use PrimitiveShadingRateKHR in Vulkan GLSL.\");\n\t\trequire_extension_internal(\"GL_EXT_fragment_shading_rate\");\n\t\treturn \"gl_PrimitiveShadingRateEXT\";\n\t}\n\n\tcase BuiltInShadingRateKHR:\n\t{\n\t\tif (!options.vulkan_semantics)\n\t\t\tSPIRV_CROSS_THROW(\"Can only use ShadingRateKHR in Vulkan GLSL.\");\n\t\trequire_extension_internal(\"GL_EXT_fragment_shading_rate\");\n\t\treturn \"gl_ShadingRateEXT\";\n\t}\n\n\tcase BuiltInDeviceIndex:\n\t\tif (!options.vulkan_semantics)\n\t\t\tSPIRV_CROSS_THROW(\"Need Vulkan semantics for device group support.\");\n\t\trequire_extension_internal(\"GL_EXT_device_group\");\n\t\treturn \"gl_DeviceIndex\";\n\n\tcase BuiltInFullyCoveredEXT:\n\t\tif (!options.es)\n\t\t\trequire_extension_internal(\"GL_NV_conservative_raster_underestimation\");\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"Need desktop GL to use GL_NV_conservative_raster_underestimation.\");\n\t\treturn \"gl_FragFullyCoveredNV\";\n\n\tcase BuiltInPrimitiveTriangleIndicesEXT:\n\t\treturn \"gl_PrimitiveTriangleIndicesEXT\";\n\tcase BuiltInPrimitiveLineIndicesEXT:\n\t\treturn \"gl_PrimitiveLineIndicesEXT\";\n\tcase BuiltInPrimitivePointIndicesEXT:\n\t\treturn \"gl_PrimitivePointIndicesEXT\";\n\tcase BuiltInCullPrimitiveEXT:\n\t\treturn \"gl_CullPrimitiveEXT\";\n\n\tdefault:\n\t\treturn join(\"gl_BuiltIn_\", convert_to_string(builtin));\n\t}\n}\n\nconst char *CompilerGLSL::index_to_swizzle(uint32_t index)\n{\n\tswitch (index)\n\t{\n\tcase 0:\n\t\treturn \"x\";\n\tcase 1:\n\t\treturn \"y\";\n\tcase 2:\n\t\treturn \"z\";\n\tcase 3:\n\t\treturn \"w\";\n\tdefault:\n\t\treturn \"x\";\t\t// Don't crash, but engage the \"undefined behavior\" described for out-of-bounds logical addressing in spec.\n\t}\n}\n\nvoid CompilerGLSL::access_chain_internal_append_index(std::string &expr, uint32_t /*base*/, const SPIRType * /*type*/,\n                                                      AccessChainFlags flags, bool &access_chain_is_arrayed,\n                                                      uint32_t index)\n{\n\tbool index_is_literal = (flags & ACCESS_CHAIN_INDEX_IS_LITERAL_BIT) != 0;\n\tbool ptr_chain = (flags & ACCESS_CHAIN_PTR_CHAIN_BIT) != 0;\n\tbool register_expression_read = (flags & ACCESS_CHAIN_SKIP_REGISTER_EXPRESSION_READ_BIT) == 0;\n\n\tstring idx_expr = index_is_literal ? convert_to_string(index) : to_unpacked_expression(index, register_expression_read);\n\n\t// For the case where the base of an OpPtrAccessChain already ends in [n],\n\t// we need to use the index as an offset to the existing index, otherwise,\n\t// we can just use the index directly.\n\tif (ptr_chain && access_chain_is_arrayed)\n\t{\n\t\tsize_t split_pos = expr.find_last_of(']');\n\t\tsize_t enclose_split = expr.find_last_of(')');\n\n\t\t// If we have already enclosed the expression, don't try to be clever, it will break.\n\t\tif (split_pos > enclose_split || enclose_split == string::npos)\n\t\t{\n\t\t\tstring expr_front = expr.substr(0, split_pos);\n\t\t\tstring expr_back = expr.substr(split_pos);\n\t\t\texpr = expr_front + \" + \" + enclose_expression(idx_expr) + expr_back;\n\t\t\treturn;\n\t\t}\n\t}\n\n\texpr += \"[\";\n\texpr += idx_expr;\n\texpr += \"]\";\n}\n\nbool CompilerGLSL::access_chain_needs_stage_io_builtin_translation(uint32_t)\n{\n\treturn true;\n}\n\nstring CompilerGLSL::access_chain_internal(uint32_t base, const uint32_t *indices, uint32_t count,\n                                           AccessChainFlags flags, AccessChainMeta *meta)\n{\n\tstring expr;\n\n\tbool index_is_literal = (flags & ACCESS_CHAIN_INDEX_IS_LITERAL_BIT) != 0;\n\tbool msb_is_id = (flags & ACCESS_CHAIN_LITERAL_MSB_FORCE_ID) != 0;\n\tbool chain_only = (flags & ACCESS_CHAIN_CHAIN_ONLY_BIT) != 0;\n\tbool ptr_chain = (flags & ACCESS_CHAIN_PTR_CHAIN_BIT) != 0;\n\tbool register_expression_read = (flags & ACCESS_CHAIN_SKIP_REGISTER_EXPRESSION_READ_BIT) == 0;\n\tbool flatten_member_reference = (flags & ACCESS_CHAIN_FLATTEN_ALL_MEMBERS_BIT) != 0;\n\n\tif (!chain_only)\n\t{\n\t\t// We handle transpose explicitly, so don't resolve that here.\n\t\tauto *e = maybe_get<SPIRExpression>(base);\n\t\tbool old_transpose = e && e->need_transpose;\n\t\tif (e)\n\t\t\te->need_transpose = false;\n\t\texpr = to_enclosed_expression(base, register_expression_read);\n\t\tif (e)\n\t\t\te->need_transpose = old_transpose;\n\t}\n\n\t// Start traversing type hierarchy at the proper non-pointer types,\n\t// but keep type_id referencing the original pointer for use below.\n\tuint32_t type_id = expression_type_id(base);\n\tconst auto *type = &get_pointee_type(type_id);\n\n\tif (!backend.native_pointers)\n\t{\n\t\tif (ptr_chain)\n\t\t\tSPIRV_CROSS_THROW(\"Backend does not support native pointers and does not support OpPtrAccessChain.\");\n\n\t\t// Wrapped buffer reference pointer types will need to poke into the internal \"value\" member before\n\t\t// continuing the access chain.\n\t\tif (should_dereference(base))\n\t\t\texpr = dereference_expression(get<SPIRType>(type_id), expr);\n\t}\n\telse if (should_dereference(base) && type->basetype != SPIRType::Struct && !ptr_chain)\n\t\texpr = join(\"(\", dereference_expression(*type, expr), \")\");\n\n\tbool access_chain_is_arrayed = expr.find_first_of('[') != string::npos;\n\tbool row_major_matrix_needs_conversion = is_non_native_row_major_matrix(base);\n\tbool is_packed = has_extended_decoration(base, SPIRVCrossDecorationPhysicalTypePacked);\n\tuint32_t physical_type = get_extended_decoration(base, SPIRVCrossDecorationPhysicalTypeID);\n\tbool is_invariant = has_decoration(base, DecorationInvariant);\n\tbool relaxed_precision = has_decoration(base, DecorationRelaxedPrecision);\n\tbool pending_array_enclose = false;\n\tbool dimension_flatten = false;\n\tbool access_meshlet_position_y = false;\n\n\tif (auto *base_expr = maybe_get<SPIRExpression>(base))\n\t{\n\t\taccess_meshlet_position_y = base_expr->access_meshlet_position_y;\n\t}\n\n\t// If we are translating access to a structured buffer, the first subscript '._m0' must be hidden\n\tbool hide_first_subscript = count > 1 && is_user_type_structured(base);\n\n\tconst auto append_index = [&](uint32_t index, bool is_literal, bool is_ptr_chain = false) {\n\t\tAccessChainFlags mod_flags = flags;\n\t\tif (!is_literal)\n\t\t\tmod_flags &= ~ACCESS_CHAIN_INDEX_IS_LITERAL_BIT;\n\t\tif (!is_ptr_chain)\n\t\t\tmod_flags &= ~ACCESS_CHAIN_PTR_CHAIN_BIT;\n\t\taccess_chain_internal_append_index(expr, base, type, mod_flags, access_chain_is_arrayed, index);\n\t\tcheck_physical_type_cast(expr, type, physical_type);\n\t};\n\n\tfor (uint32_t i = 0; i < count; i++)\n\t{\n\t\tuint32_t index = indices[i];\n\n\t\tbool is_literal = index_is_literal;\n\t\tif (is_literal && msb_is_id && (index >> 31u) != 0u)\n\t\t{\n\t\t\tis_literal = false;\n\t\t\tindex &= 0x7fffffffu;\n\t\t}\n\n\t\tbool ptr_chain_array_entry = ptr_chain && i == 0 && is_array(*type);\n\n\t\tif (ptr_chain_array_entry)\n\t\t{\n\t\t\t// This is highly unusual code, since normally we'd use plain AccessChain, but it's still allowed.\n\t\t\t// We are considered to have a pointer to array and one element shifts by one array at a time.\n\t\t\t// If we use normal array indexing, we'll first decay to pointer, and lose the array-ness,\n\t\t\t// so we have to take pointer to array explicitly.\n\t\t\tif (!should_dereference(base))\n\t\t\t\texpr = enclose_expression(address_of_expression(expr));\n\t\t}\n\n\t\tif (ptr_chain && i == 0)\n\t\t{\n\t\t\t// Pointer chains\n\t\t\t// If we are flattening multidimensional arrays, only create opening bracket on first\n\t\t\t// array index.\n\t\t\tif (options.flatten_multidimensional_arrays)\n\t\t\t{\n\t\t\t\tdimension_flatten = type->array.size() >= 1;\n\t\t\t\tpending_array_enclose = dimension_flatten;\n\t\t\t\tif (pending_array_enclose)\n\t\t\t\t\texpr += \"[\";\n\t\t\t}\n\n\t\t\tif (options.flatten_multidimensional_arrays && dimension_flatten)\n\t\t\t{\n\t\t\t\t// If we are flattening multidimensional arrays, do manual stride computation.\n\t\t\t\tif (is_literal)\n\t\t\t\t\texpr += convert_to_string(index);\n\t\t\t\telse\n\t\t\t\t\texpr += to_enclosed_expression(index, register_expression_read);\n\n\t\t\t\tfor (auto j = uint32_t(type->array.size()); j; j--)\n\t\t\t\t{\n\t\t\t\t\texpr += \" * \";\n\t\t\t\t\texpr += enclose_expression(to_array_size(*type, j - 1));\n\t\t\t\t}\n\n\t\t\t\tif (type->array.empty())\n\t\t\t\t\tpending_array_enclose = false;\n\t\t\t\telse\n\t\t\t\t\texpr += \" + \";\n\n\t\t\t\tif (!pending_array_enclose)\n\t\t\t\t\texpr += \"]\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tappend_index(index, is_literal, true);\n\t\t\t}\n\n\t\t\tif (type->basetype == SPIRType::ControlPointArray)\n\t\t\t{\n\t\t\t\ttype_id = type->parent_type;\n\t\t\t\ttype = &get<SPIRType>(type_id);\n\t\t\t}\n\n\t\t\taccess_chain_is_arrayed = true;\n\n\t\t\t// Explicitly enclose the expression if this is one of the weird pointer-to-array cases.\n\t\t\t// We don't want any future indexing to add to this array dereference.\n\t\t\t// Enclosing the expression blocks that and avoids any shenanigans with operand priority.\n\t\t\tif (ptr_chain_array_entry)\n\t\t\t\texpr = join(\"(\", expr, \")\");\n\t\t}\n\t\t// Arrays\n\t\telse if (!type->array.empty())\n\t\t{\n\t\t\t// If we are flattening multidimensional arrays, only create opening bracket on first\n\t\t\t// array index.\n\t\t\tif (options.flatten_multidimensional_arrays && !pending_array_enclose)\n\t\t\t{\n\t\t\t\tdimension_flatten = type->array.size() > 1;\n\t\t\t\tpending_array_enclose = dimension_flatten;\n\t\t\t\tif (pending_array_enclose)\n\t\t\t\t\texpr += \"[\";\n\t\t\t}\n\n\t\t\tassert(type->parent_type);\n\n\t\t\tauto *var = maybe_get<SPIRVariable>(base);\n\t\t\tif (backend.force_gl_in_out_block && i == 0 && var && is_builtin_variable(*var) &&\n\t\t\t    !has_decoration(type->self, DecorationBlock))\n\t\t\t{\n\t\t\t\t// This deals with scenarios for tesc/geom where arrays of gl_Position[] are declared.\n\t\t\t\t// Normally, these variables live in blocks when compiled from GLSL,\n\t\t\t\t// but HLSL seems to just emit straight arrays here.\n\t\t\t\t// We must pretend this access goes through gl_in/gl_out arrays\n\t\t\t\t// to be able to access certain builtins as arrays.\n\t\t\t\t// Similar concerns apply for mesh shaders where we have to redirect to gl_MeshVerticesEXT or MeshPrimitivesEXT.\n\t\t\t\tauto builtin = ir.meta[base].decoration.builtin_type;\n\t\t\t\tbool mesh_shader = get_execution_model() == ExecutionModelMeshEXT;\n\n\t\t\t\tswitch (builtin)\n\t\t\t\t{\n\t\t\t\tcase BuiltInCullDistance:\n\t\t\t\tcase BuiltInClipDistance:\n\t\t\t\t\tif (type->array.size() == 1) // Red herring. Only consider block IO for two-dimensional arrays here.\n\t\t\t\t\t{\n\t\t\t\t\t\tappend_index(index, is_literal);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// fallthrough\n\t\t\t\tcase BuiltInPosition:\n\t\t\t\tcase BuiltInPointSize:\n\t\t\t\t\tif (mesh_shader)\n\t\t\t\t\t\texpr = join(\"gl_MeshVerticesEXT[\", to_expression(index, register_expression_read), \"].\", expr);\n\t\t\t\t\telse if (var->storage == StorageClassInput)\n\t\t\t\t\t\texpr = join(\"gl_in[\", to_expression(index, register_expression_read), \"].\", expr);\n\t\t\t\t\telse if (var->storage == StorageClassOutput)\n\t\t\t\t\t\texpr = join(\"gl_out[\", to_expression(index, register_expression_read), \"].\", expr);\n\t\t\t\t\telse\n\t\t\t\t\t\tappend_index(index, is_literal);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase BuiltInPrimitiveId:\n\t\t\t\tcase BuiltInLayer:\n\t\t\t\tcase BuiltInViewportIndex:\n\t\t\t\tcase BuiltInCullPrimitiveEXT:\n\t\t\t\tcase BuiltInPrimitiveShadingRateKHR:\n\t\t\t\t\tif (mesh_shader)\n\t\t\t\t\t\texpr = join(\"gl_MeshPrimitivesEXT[\", to_expression(index, register_expression_read), \"].\", expr);\n\t\t\t\t\telse\n\t\t\t\t\t\tappend_index(index, is_literal);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tappend_index(index, is_literal);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (backend.force_merged_mesh_block && i == 0 && var &&\n\t\t\t         !is_builtin_variable(*var) && var->storage == StorageClassOutput)\n\t\t\t{\n\t\t\t\tif (is_per_primitive_variable(*var))\n\t\t\t\t\texpr = join(\"gl_MeshPrimitivesEXT[\", to_expression(index, register_expression_read), \"].\", expr);\n\t\t\t\telse\n\t\t\t\t\texpr = join(\"gl_MeshVerticesEXT[\", to_expression(index, register_expression_read), \"].\", expr);\n\t\t\t}\n\t\t\telse if (options.flatten_multidimensional_arrays && dimension_flatten)\n\t\t\t{\n\t\t\t\t// If we are flattening multidimensional arrays, do manual stride computation.\n\t\t\t\tauto &parent_type = get<SPIRType>(type->parent_type);\n\n\t\t\t\tif (is_literal)\n\t\t\t\t\texpr += convert_to_string(index);\n\t\t\t\telse\n\t\t\t\t\texpr += to_enclosed_expression(index, register_expression_read);\n\n\t\t\t\tfor (auto j = uint32_t(parent_type.array.size()); j; j--)\n\t\t\t\t{\n\t\t\t\t\texpr += \" * \";\n\t\t\t\t\texpr += enclose_expression(to_array_size(parent_type, j - 1));\n\t\t\t\t}\n\n\t\t\t\tif (parent_type.array.empty())\n\t\t\t\t\tpending_array_enclose = false;\n\t\t\t\telse\n\t\t\t\t\texpr += \" + \";\n\n\t\t\t\tif (!pending_array_enclose)\n\t\t\t\t\texpr += \"]\";\n\t\t\t}\n\t\t\telse if (index_is_literal || !builtin_translates_to_nonarray(BuiltIn(get_decoration(base, DecorationBuiltIn))))\n\t\t\t{\n\t\t\t\t// Some builtins are arrays in SPIR-V but not in other languages, e.g. gl_SampleMask[] is an array in SPIR-V but not in Metal.\n\t\t\t\t// By throwing away the index, we imply the index was 0, which it must be for gl_SampleMask.\n\t\t\t\t// For literal indices we are working on composites, so we ignore this since we have already converted to proper array.\n\t\t\t\tappend_index(index, is_literal);\n\t\t\t}\n\n\t\t\tif (var && has_decoration(var->self, DecorationBuiltIn) &&\n\t\t\t    get_decoration(var->self, DecorationBuiltIn) == BuiltInPosition &&\n\t\t\t    get_execution_model() == ExecutionModelMeshEXT)\n\t\t\t{\n\t\t\t\taccess_meshlet_position_y = true;\n\t\t\t}\n\n\t\t\ttype_id = type->parent_type;\n\t\t\ttype = &get<SPIRType>(type_id);\n\n\t\t\t// If the physical type has an unnatural vecsize,\n\t\t\t// we must assume it's a faked struct where the .data member\n\t\t\t// is used for the real payload.\n\t\t\tif (physical_type && (is_vector(*type) || is_scalar(*type)))\n\t\t\t{\n\t\t\t\tauto &phys = get<SPIRType>(physical_type);\n\t\t\t\tif (phys.vecsize > 4)\n\t\t\t\t\texpr += \".data\";\n\t\t\t}\n\n\t\t\taccess_chain_is_arrayed = true;\n\t\t}\n\t\t// For structs, the index refers to a constant, which indexes into the members, possibly through a redirection mapping.\n\t\t// We also check if this member is a builtin, since we then replace the entire expression with the builtin one.\n\t\telse if (type->basetype == SPIRType::Struct)\n\t\t{\n\t\t\tif (!is_literal)\n\t\t\t\tindex = evaluate_constant_u32(index);\n\n\t\t\tif (index < uint32_t(type->member_type_index_redirection.size()))\n\t\t\t\tindex = type->member_type_index_redirection[index];\n\n\t\t\tif (index >= type->member_types.size())\n\t\t\t\tSPIRV_CROSS_THROW(\"Member index is out of bounds!\");\n\n\t\t\tif (hide_first_subscript)\n\t\t\t{\n\t\t\t\t// First \"._m0\" subscript has been hidden, subsequent fields must be emitted even for structured buffers\n\t\t\t\thide_first_subscript = false;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tBuiltIn builtin = BuiltInMax;\n\t\t\t\tif (is_member_builtin(*type, index, &builtin) && access_chain_needs_stage_io_builtin_translation(base))\n\t\t\t\t{\n\t\t\t\t\tif (access_chain_is_arrayed)\n\t\t\t\t\t{\n\t\t\t\t\t\texpr += \".\";\n\t\t\t\t\t\texpr += builtin_to_glsl(builtin, type->storage);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\texpr = builtin_to_glsl(builtin, type->storage);\n\n\t\t\t\t\tif (builtin == BuiltInPosition && get_execution_model() == ExecutionModelMeshEXT)\n\t\t\t\t\t{\n\t\t\t\t\t\taccess_meshlet_position_y = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// If the member has a qualified name, use it as the entire chain\n\t\t\t\t\tstring qual_mbr_name = get_member_qualified_name(type_id, index);\n\t\t\t\t\tif (!qual_mbr_name.empty())\n\t\t\t\t\t\texpr = qual_mbr_name;\n\t\t\t\t\telse if (flatten_member_reference)\n\t\t\t\t\t\texpr += join(\"_\", to_member_name(*type, index));\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// Any pointer de-refences for values are handled in the first access chain.\n\t\t\t\t\t\t// For pointer chains, the pointer-ness is resolved through an array access.\n\t\t\t\t\t\t// The only time this is not true is when accessing array of SSBO/UBO.\n\t\t\t\t\t\t// This case is explicitly handled.\n\t\t\t\t\t\texpr += to_member_reference(base, *type, index, ptr_chain || i != 0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (has_member_decoration(type->self, index, DecorationInvariant))\n\t\t\t\tis_invariant = true;\n\t\t\tif (has_member_decoration(type->self, index, DecorationRelaxedPrecision))\n\t\t\t\trelaxed_precision = true;\n\n\t\t\tis_packed = member_is_packed_physical_type(*type, index);\n\t\t\tif (member_is_remapped_physical_type(*type, index))\n\t\t\t\tphysical_type = get_extended_member_decoration(type->self, index, SPIRVCrossDecorationPhysicalTypeID);\n\t\t\telse\n\t\t\t\tphysical_type = 0;\n\n\t\t\trow_major_matrix_needs_conversion = member_is_non_native_row_major_matrix(*type, index);\n\t\t\ttype = &get<SPIRType>(type->member_types[index]);\n\t\t}\n\t\t// Matrix -> Vector\n\t\telse if (type->columns > 1)\n\t\t{\n\t\t\t// If we have a row-major matrix here, we need to defer any transpose in case this access chain\n\t\t\t// is used to store a column. We can resolve it right here and now if we access a scalar directly,\n\t\t\t// by flipping indexing order of the matrix.\n\n\t\t\texpr += \"[\";\n\t\t\tif (is_literal)\n\t\t\t\texpr += convert_to_string(index);\n\t\t\telse\n\t\t\t\texpr += to_unpacked_expression(index, register_expression_read);\n\t\t\texpr += \"]\";\n\n\t\t\t// If the physical type has an unnatural vecsize,\n\t\t\t// we must assume it's a faked struct where the .data member\n\t\t\t// is used for the real payload.\n\t\t\tif (physical_type)\n\t\t\t{\n\t\t\t\tauto &phys = get<SPIRType>(physical_type);\n\t\t\t\tif (phys.vecsize > 4 || phys.columns > 4)\n\t\t\t\t\texpr += \".data\";\n\t\t\t}\n\n\t\t\ttype_id = type->parent_type;\n\t\t\ttype = &get<SPIRType>(type_id);\n\t\t}\n\t\t// Vector -> Scalar\n\t\telse if (type->vecsize > 1)\n\t\t{\n\t\t\tstring deferred_index;\n\t\t\tif (row_major_matrix_needs_conversion)\n\t\t\t{\n\t\t\t\t// Flip indexing order.\n\t\t\t\tauto column_index = expr.find_last_of('[');\n\t\t\t\tif (column_index != string::npos)\n\t\t\t\t{\n\t\t\t\t\tdeferred_index = expr.substr(column_index);\n\n\t\t\t\t\tauto end_deferred_index = deferred_index.find_last_of(']');\n\t\t\t\t\tif (end_deferred_index != string::npos && end_deferred_index + 1 != deferred_index.size())\n\t\t\t\t\t{\n\t\t\t\t\t\t// If we have any data member fixups, it must be transposed so that it refers to this index.\n\t\t\t\t\t\t// E.g. [0].data followed by [1] would be shuffled to [1][0].data which is wrong,\n\t\t\t\t\t\t// and needs to be [1].data[0] instead.\n\t\t\t\t\t\tend_deferred_index++;\n\t\t\t\t\t\tdeferred_index = deferred_index.substr(end_deferred_index) +\n\t\t\t\t\t\t                 deferred_index.substr(0, end_deferred_index);\n\t\t\t\t\t}\n\n\t\t\t\t\texpr.resize(column_index);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Internally, access chain implementation can also be used on composites,\n\t\t\t// ignore scalar access workarounds in this case.\n\t\t\tStorageClass effective_storage = StorageClassGeneric;\n\t\t\tbool ignore_potential_sliced_writes = false;\n\t\t\tif ((flags & ACCESS_CHAIN_FORCE_COMPOSITE_BIT) == 0)\n\t\t\t{\n\t\t\t\tif (expression_type(base).pointer)\n\t\t\t\t\teffective_storage = get_expression_effective_storage_class(base);\n\n\t\t\t\t// Special consideration for control points.\n\t\t\t\t// Control points can only be written by InvocationID, so there is no need\n\t\t\t\t// to consider scalar access chains here.\n\t\t\t\t// Cleans up some cases where it's very painful to determine the accurate storage class\n\t\t\t\t// since blocks can be partially masked ...\n\t\t\t\tauto *var = maybe_get_backing_variable(base);\n\t\t\t\tif (var && var->storage == StorageClassOutput &&\n\t\t\t\t    get_execution_model() == ExecutionModelTessellationControl &&\n\t\t\t\t    !has_decoration(var->self, DecorationPatch))\n\t\t\t\t{\n\t\t\t\t\tignore_potential_sliced_writes = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tignore_potential_sliced_writes = true;\n\n\t\t\tif (!row_major_matrix_needs_conversion && !ignore_potential_sliced_writes)\n\t\t\t{\n\t\t\t\t// On some backends, we might not be able to safely access individual scalars in a vector.\n\t\t\t\t// To work around this, we might have to cast the access chain reference to something which can,\n\t\t\t\t// like a pointer to scalar, which we can then index into.\n\t\t\t\tprepare_access_chain_for_scalar_access(expr, get<SPIRType>(type->parent_type), effective_storage,\n\t\t\t\t                                       is_packed);\n\t\t\t}\n\n\t\t\tif (is_literal)\n\t\t\t{\n\t\t\t\tbool out_of_bounds = (index >= type->vecsize);\n\n\t\t\t\tif (!is_packed && !row_major_matrix_needs_conversion)\n\t\t\t\t{\n\t\t\t\t\texpr += \".\";\n\t\t\t\t\texpr += index_to_swizzle(out_of_bounds ? 0 : index);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// For packed vectors, we can only access them as an array, not by swizzle.\n\t\t\t\t\texpr += join(\"[\", out_of_bounds ? 0 : index, \"]\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ir.ids[index].get_type() == TypeConstant && !is_packed && !row_major_matrix_needs_conversion)\n\t\t\t{\n\t\t\t\tauto &c = get<SPIRConstant>(index);\n\t\t\t\tbool out_of_bounds = (c.scalar() >= type->vecsize);\n\n\t\t\t\tif (c.specialization)\n\t\t\t\t{\n\t\t\t\t\t// If the index is a spec constant, we cannot turn extract into a swizzle.\n\t\t\t\t\texpr += join(\"[\", out_of_bounds ? \"0\" : to_expression(index), \"]\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\texpr += \".\";\n\t\t\t\t\texpr += index_to_swizzle(out_of_bounds ? 0 : c.scalar());\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\texpr += \"[\";\n\t\t\t\texpr += to_unpacked_expression(index, register_expression_read);\n\t\t\t\texpr += \"]\";\n\t\t\t}\n\n\t\t\tif (row_major_matrix_needs_conversion && !ignore_potential_sliced_writes)\n\t\t\t{\n\t\t\t\tif (prepare_access_chain_for_scalar_access(expr, get<SPIRType>(type->parent_type), effective_storage,\n\t\t\t\t                                           is_packed))\n\t\t\t\t{\n\t\t\t\t\t// We're in a pointer context now, so just remove any member dereference.\n\t\t\t\t\tauto first_index = deferred_index.find_first_of('[');\n\t\t\t\t\tif (first_index != string::npos && first_index != 0)\n\t\t\t\t\t\tdeferred_index = deferred_index.substr(first_index);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (access_meshlet_position_y)\n\t\t\t{\n\t\t\t\tif (is_literal)\n\t\t\t\t{\n\t\t\t\t\taccess_meshlet_position_y = index == 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconst auto *c = maybe_get<SPIRConstant>(index);\n\t\t\t\t\tif (c)\n\t\t\t\t\t\taccess_meshlet_position_y = c->scalar() == 1;\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// We don't know, but we have to assume no.\n\t\t\t\t\t\t// Flip Y in mesh shaders is an opt-in horrible hack, so we'll have to assume shaders try to behave.\n\t\t\t\t\t\taccess_meshlet_position_y = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\texpr += deferred_index;\n\t\t\trow_major_matrix_needs_conversion = false;\n\n\t\t\tis_packed = false;\n\t\t\tphysical_type = 0;\n\t\t\ttype_id = type->parent_type;\n\t\t\ttype = &get<SPIRType>(type_id);\n\t\t}\n\t\telse if (!backend.allow_truncated_access_chain)\n\t\t\tSPIRV_CROSS_THROW(\"Cannot subdivide a scalar value!\");\n\t}\n\n\tif (pending_array_enclose)\n\t{\n\t\tSPIRV_CROSS_THROW(\"Flattening of multidimensional arrays were enabled, \"\n\t\t                  \"but the access chain was terminated in the middle of a multidimensional array. \"\n\t\t                  \"This is not supported.\");\n\t}\n\n\tif (meta)\n\t{\n\t\tmeta->need_transpose = row_major_matrix_needs_conversion;\n\t\tmeta->storage_is_packed = is_packed;\n\t\tmeta->storage_is_invariant = is_invariant;\n\t\tmeta->storage_physical_type = physical_type;\n\t\tmeta->relaxed_precision = relaxed_precision;\n\t\tmeta->access_meshlet_position_y = access_meshlet_position_y;\n\t}\n\n\treturn expr;\n}\n\nvoid CompilerGLSL::check_physical_type_cast(std::string &, const SPIRType *, uint32_t)\n{\n}\n\nbool CompilerGLSL::prepare_access_chain_for_scalar_access(std::string &, const SPIRType &, spv::StorageClass, bool &)\n{\n\treturn false;\n}\n\nstring CompilerGLSL::to_flattened_struct_member(const string &basename, const SPIRType &type, uint32_t index)\n{\n\tauto ret = join(basename, \"_\", to_member_name(type, index));\n\tParsedIR::sanitize_underscores(ret);\n\treturn ret;\n}\n\nstring CompilerGLSL::access_chain(uint32_t base, const uint32_t *indices, uint32_t count, const SPIRType &target_type,\n                                  AccessChainMeta *meta, bool ptr_chain)\n{\n\tif (flattened_buffer_blocks.count(base))\n\t{\n\t\tuint32_t matrix_stride = 0;\n\t\tuint32_t array_stride = 0;\n\t\tbool need_transpose = false;\n\t\tflattened_access_chain_offset(expression_type(base), indices, count, 0, 16, &need_transpose, &matrix_stride,\n\t\t                              &array_stride, ptr_chain);\n\n\t\tif (meta)\n\t\t{\n\t\t\tmeta->need_transpose = target_type.columns > 1 && need_transpose;\n\t\t\tmeta->storage_is_packed = false;\n\t\t}\n\n\t\treturn flattened_access_chain(base, indices, count, target_type, 0, matrix_stride, array_stride,\n\t\t                              need_transpose);\n\t}\n\telse if (flattened_structs.count(base) && count > 0)\n\t{\n\t\tAccessChainFlags flags = ACCESS_CHAIN_CHAIN_ONLY_BIT | ACCESS_CHAIN_SKIP_REGISTER_EXPRESSION_READ_BIT;\n\t\tif (ptr_chain)\n\t\t\tflags |= ACCESS_CHAIN_PTR_CHAIN_BIT;\n\n\t\tif (flattened_structs[base])\n\t\t{\n\t\t\tflags |= ACCESS_CHAIN_FLATTEN_ALL_MEMBERS_BIT;\n\t\t\tif (meta)\n\t\t\t\tmeta->flattened_struct = target_type.basetype == SPIRType::Struct;\n\t\t}\n\n\t\tauto chain = access_chain_internal(base, indices, count, flags, nullptr).substr(1);\n\t\tif (meta)\n\t\t{\n\t\t\tmeta->need_transpose = false;\n\t\t\tmeta->storage_is_packed = false;\n\t\t}\n\n\t\tauto basename = to_flattened_access_chain_expression(base);\n\t\tauto ret = join(basename, \"_\", chain);\n\t\tParsedIR::sanitize_underscores(ret);\n\t\treturn ret;\n\t}\n\telse\n\t{\n\t\tAccessChainFlags flags = ACCESS_CHAIN_SKIP_REGISTER_EXPRESSION_READ_BIT;\n\t\tif (ptr_chain)\n\t\t\tflags |= ACCESS_CHAIN_PTR_CHAIN_BIT;\n\t\treturn access_chain_internal(base, indices, count, flags, meta);\n\t}\n}\n\nstring CompilerGLSL::load_flattened_struct(const string &basename, const SPIRType &type)\n{\n\tauto expr = type_to_glsl_constructor(type);\n\texpr += '(';\n\n\tfor (uint32_t i = 0; i < uint32_t(type.member_types.size()); i++)\n\t{\n\t\tif (i)\n\t\t\texpr += \", \";\n\n\t\tauto &member_type = get<SPIRType>(type.member_types[i]);\n\t\tif (member_type.basetype == SPIRType::Struct)\n\t\t\texpr += load_flattened_struct(to_flattened_struct_member(basename, type, i), member_type);\n\t\telse\n\t\t\texpr += to_flattened_struct_member(basename, type, i);\n\t}\n\texpr += ')';\n\treturn expr;\n}\n\nstd::string CompilerGLSL::to_flattened_access_chain_expression(uint32_t id)\n{\n\t// Do not use to_expression as that will unflatten access chains.\n\tstring basename;\n\tif (const auto *var = maybe_get<SPIRVariable>(id))\n\t\tbasename = to_name(var->self);\n\telse if (const auto *expr = maybe_get<SPIRExpression>(id))\n\t\tbasename = expr->expression;\n\telse\n\t\tbasename = to_expression(id);\n\n\treturn basename;\n}\n\nvoid CompilerGLSL::store_flattened_struct(const string &basename, uint32_t rhs_id, const SPIRType &type,\n                                          const SmallVector<uint32_t> &indices)\n{\n\tSmallVector<uint32_t> sub_indices = indices;\n\tsub_indices.push_back(0);\n\n\tauto *member_type = &type;\n\tfor (auto &index : indices)\n\t\tmember_type = &get<SPIRType>(member_type->member_types[index]);\n\n\tfor (uint32_t i = 0; i < uint32_t(member_type->member_types.size()); i++)\n\t{\n\t\tsub_indices.back() = i;\n\t\tauto lhs = join(basename, \"_\", to_member_name(*member_type, i));\n\t\tParsedIR::sanitize_underscores(lhs);\n\n\t\tif (get<SPIRType>(member_type->member_types[i]).basetype == SPIRType::Struct)\n\t\t{\n\t\t\tstore_flattened_struct(lhs, rhs_id, type, sub_indices);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tauto rhs = to_expression(rhs_id) + to_multi_member_reference(type, sub_indices);\n\t\t\tstatement(lhs, \" = \", rhs, \";\");\n\t\t}\n\t}\n}\n\nvoid CompilerGLSL::store_flattened_struct(uint32_t lhs_id, uint32_t value)\n{\n\tauto &type = expression_type(lhs_id);\n\tauto basename = to_flattened_access_chain_expression(lhs_id);\n\tstore_flattened_struct(basename, value, type, {});\n}\n\nstd::string CompilerGLSL::flattened_access_chain(uint32_t base, const uint32_t *indices, uint32_t count,\n                                                 const SPIRType &target_type, uint32_t offset, uint32_t matrix_stride,\n                                                 uint32_t /* array_stride */, bool need_transpose)\n{\n\tif (!target_type.array.empty())\n\t\tSPIRV_CROSS_THROW(\"Access chains that result in an array can not be flattened\");\n\telse if (target_type.basetype == SPIRType::Struct)\n\t\treturn flattened_access_chain_struct(base, indices, count, target_type, offset);\n\telse if (target_type.columns > 1)\n\t\treturn flattened_access_chain_matrix(base, indices, count, target_type, offset, matrix_stride, need_transpose);\n\telse\n\t\treturn flattened_access_chain_vector(base, indices, count, target_type, offset, matrix_stride, need_transpose);\n}\n\nstd::string CompilerGLSL::flattened_access_chain_struct(uint32_t base, const uint32_t *indices, uint32_t count,\n                                                        const SPIRType &target_type, uint32_t offset)\n{\n\tstd::string expr;\n\n\tif (backend.can_declare_struct_inline)\n\t{\n\t\texpr += type_to_glsl_constructor(target_type);\n\t\texpr += \"(\";\n\t}\n\telse\n\t\texpr += \"{\";\n\n\tfor (uint32_t i = 0; i < uint32_t(target_type.member_types.size()); ++i)\n\t{\n\t\tif (i != 0)\n\t\t\texpr += \", \";\n\n\t\tconst SPIRType &member_type = get<SPIRType>(target_type.member_types[i]);\n\t\tuint32_t member_offset = type_struct_member_offset(target_type, i);\n\n\t\t// The access chain terminates at the struct, so we need to find matrix strides and row-major information\n\t\t// ahead of time.\n\t\tbool need_transpose = false;\n\t\tbool relaxed = false;\n\t\tuint32_t matrix_stride = 0;\n\t\tif (member_type.columns > 1)\n\t\t{\n\t\t\tauto decorations = combined_decoration_for_member(target_type, i);\n\t\t\tneed_transpose = decorations.get(DecorationRowMajor);\n\t\t\trelaxed = decorations.get(DecorationRelaxedPrecision);\n\t\t\tmatrix_stride = type_struct_member_matrix_stride(target_type, i);\n\t\t}\n\n\t\tauto tmp = flattened_access_chain(base, indices, count, member_type, offset + member_offset, matrix_stride,\n\t\t                                  0 /* array_stride */, need_transpose);\n\n\t\t// Cannot forward transpositions, so resolve them here.\n\t\tif (need_transpose)\n\t\t\texpr += convert_row_major_matrix(tmp, member_type, 0, false, relaxed);\n\t\telse\n\t\t\texpr += tmp;\n\t}\n\n\texpr += backend.can_declare_struct_inline ? \")\" : \"}\";\n\n\treturn expr;\n}\n\nstd::string CompilerGLSL::flattened_access_chain_matrix(uint32_t base, const uint32_t *indices, uint32_t count,\n                                                        const SPIRType &target_type, uint32_t offset,\n                                                        uint32_t matrix_stride, bool need_transpose)\n{\n\tassert(matrix_stride);\n\tSPIRType tmp_type = target_type;\n\tif (need_transpose)\n\t\tswap(tmp_type.vecsize, tmp_type.columns);\n\n\tstd::string expr;\n\n\texpr += type_to_glsl_constructor(tmp_type);\n\texpr += \"(\";\n\n\tfor (uint32_t i = 0; i < tmp_type.columns; i++)\n\t{\n\t\tif (i != 0)\n\t\t\texpr += \", \";\n\n\t\texpr += flattened_access_chain_vector(base, indices, count, tmp_type, offset + i * matrix_stride, matrix_stride,\n\t\t                                      /* need_transpose= */ false);\n\t}\n\n\texpr += \")\";\n\n\treturn expr;\n}\n\nstd::string CompilerGLSL::flattened_access_chain_vector(uint32_t base, const uint32_t *indices, uint32_t count,\n                                                        const SPIRType &target_type, uint32_t offset,\n                                                        uint32_t matrix_stride, bool need_transpose)\n{\n\tauto result = flattened_access_chain_offset(expression_type(base), indices, count, offset, 16);\n\n\tauto buffer_name = to_name(expression_type(base).self);\n\n\tif (need_transpose)\n\t{\n\t\tstd::string expr;\n\n\t\tif (target_type.vecsize > 1)\n\t\t{\n\t\t\texpr += type_to_glsl_constructor(target_type);\n\t\t\texpr += \"(\";\n\t\t}\n\n\t\tfor (uint32_t i = 0; i < target_type.vecsize; ++i)\n\t\t{\n\t\t\tif (i != 0)\n\t\t\t\texpr += \", \";\n\n\t\t\tuint32_t component_offset = result.second + i * matrix_stride;\n\n\t\t\tassert(component_offset % (target_type.width / 8) == 0);\n\t\t\tuint32_t index = component_offset / (target_type.width / 8);\n\n\t\t\texpr += buffer_name;\n\t\t\texpr += \"[\";\n\t\t\texpr += result.first; // this is a series of N1 * k1 + N2 * k2 + ... that is either empty or ends with a +\n\t\t\texpr += convert_to_string(index / 4);\n\t\t\texpr += \"]\";\n\n\t\t\texpr += vector_swizzle(1, index % 4);\n\t\t}\n\n\t\tif (target_type.vecsize > 1)\n\t\t{\n\t\t\texpr += \")\";\n\t\t}\n\n\t\treturn expr;\n\t}\n\telse\n\t{\n\t\tassert(result.second % (target_type.width / 8) == 0);\n\t\tuint32_t index = result.second / (target_type.width / 8);\n\n\t\tstd::string expr;\n\n\t\texpr += buffer_name;\n\t\texpr += \"[\";\n\t\texpr += result.first; // this is a series of N1 * k1 + N2 * k2 + ... that is either empty or ends with a +\n\t\texpr += convert_to_string(index / 4);\n\t\texpr += \"]\";\n\n\t\texpr += vector_swizzle(target_type.vecsize, index % 4);\n\n\t\treturn expr;\n\t}\n}\n\nstd::pair<std::string, uint32_t> CompilerGLSL::flattened_access_chain_offset(\n    const SPIRType &basetype, const uint32_t *indices, uint32_t count, uint32_t offset, uint32_t word_stride,\n    bool *need_transpose, uint32_t *out_matrix_stride, uint32_t *out_array_stride, bool ptr_chain)\n{\n\t// Start traversing type hierarchy at the proper non-pointer types.\n\tconst auto *type = &get_pointee_type(basetype);\n\n\tstd::string expr;\n\n\t// Inherit matrix information in case we are access chaining a vector which might have come from a row major layout.\n\tbool row_major_matrix_needs_conversion = need_transpose ? *need_transpose : false;\n\tuint32_t matrix_stride = out_matrix_stride ? *out_matrix_stride : 0;\n\tuint32_t array_stride = out_array_stride ? *out_array_stride : 0;\n\n\tfor (uint32_t i = 0; i < count; i++)\n\t{\n\t\tuint32_t index = indices[i];\n\n\t\t// Pointers\n\t\tif (ptr_chain && i == 0)\n\t\t{\n\t\t\t// Here, the pointer type will be decorated with an array stride.\n\t\t\tarray_stride = get_decoration(basetype.self, DecorationArrayStride);\n\t\t\tif (!array_stride)\n\t\t\t\tSPIRV_CROSS_THROW(\"SPIR-V does not define ArrayStride for buffer block.\");\n\n\t\t\tauto *constant = maybe_get<SPIRConstant>(index);\n\t\t\tif (constant)\n\t\t\t{\n\t\t\t\t// Constant array access.\n\t\t\t\toffset += constant->scalar() * array_stride;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Dynamic array access.\n\t\t\t\tif (array_stride % word_stride)\n\t\t\t\t{\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Array stride for dynamic indexing must be divisible by the size \"\n\t\t\t\t\t                  \"of a 4-component vector. \"\n\t\t\t\t\t                  \"Likely culprit here is a float or vec2 array inside a push \"\n\t\t\t\t\t                  \"constant block which is std430. \"\n\t\t\t\t\t                  \"This cannot be flattened. Try using std140 layout instead.\");\n\t\t\t\t}\n\n\t\t\t\texpr += to_enclosed_expression(index);\n\t\t\t\texpr += \" * \";\n\t\t\t\texpr += convert_to_string(array_stride / word_stride);\n\t\t\t\texpr += \" + \";\n\t\t\t}\n\t\t}\n\t\t// Arrays\n\t\telse if (!type->array.empty())\n\t\t{\n\t\t\tauto *constant = maybe_get<SPIRConstant>(index);\n\t\t\tif (constant)\n\t\t\t{\n\t\t\t\t// Constant array access.\n\t\t\t\toffset += constant->scalar() * array_stride;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Dynamic array access.\n\t\t\t\tif (array_stride % word_stride)\n\t\t\t\t{\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Array stride for dynamic indexing must be divisible by the size \"\n\t\t\t\t\t                  \"of a 4-component vector. \"\n\t\t\t\t\t                  \"Likely culprit here is a float or vec2 array inside a push \"\n\t\t\t\t\t                  \"constant block which is std430. \"\n\t\t\t\t\t                  \"This cannot be flattened. Try using std140 layout instead.\");\n\t\t\t\t}\n\n\t\t\t\texpr += to_enclosed_expression(index, false);\n\t\t\t\texpr += \" * \";\n\t\t\t\texpr += convert_to_string(array_stride / word_stride);\n\t\t\t\texpr += \" + \";\n\t\t\t}\n\n\t\t\tuint32_t parent_type = type->parent_type;\n\t\t\ttype = &get<SPIRType>(parent_type);\n\n\t\t\tif (!type->array.empty())\n\t\t\t\tarray_stride = get_decoration(parent_type, DecorationArrayStride);\n\t\t}\n\t\t// For structs, the index refers to a constant, which indexes into the members.\n\t\t// We also check if this member is a builtin, since we then replace the entire expression with the builtin one.\n\t\telse if (type->basetype == SPIRType::Struct)\n\t\t{\n\t\t\tindex = evaluate_constant_u32(index);\n\n\t\t\tif (index >= type->member_types.size())\n\t\t\t\tSPIRV_CROSS_THROW(\"Member index is out of bounds!\");\n\n\t\t\toffset += type_struct_member_offset(*type, index);\n\n\t\t\tauto &struct_type = *type;\n\t\t\ttype = &get<SPIRType>(type->member_types[index]);\n\n\t\t\tif (type->columns > 1)\n\t\t\t{\n\t\t\t\tmatrix_stride = type_struct_member_matrix_stride(struct_type, index);\n\t\t\t\trow_major_matrix_needs_conversion =\n\t\t\t\t    combined_decoration_for_member(struct_type, index).get(DecorationRowMajor);\n\t\t\t}\n\t\t\telse\n\t\t\t\trow_major_matrix_needs_conversion = false;\n\n\t\t\tif (!type->array.empty())\n\t\t\t\tarray_stride = type_struct_member_array_stride(struct_type, index);\n\t\t}\n\t\t// Matrix -> Vector\n\t\telse if (type->columns > 1)\n\t\t{\n\t\t\tauto *constant = maybe_get<SPIRConstant>(index);\n\t\t\tif (constant)\n\t\t\t{\n\t\t\t\tindex = evaluate_constant_u32(index);\n\t\t\t\toffset += index * (row_major_matrix_needs_conversion ? (type->width / 8) : matrix_stride);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tuint32_t indexing_stride = row_major_matrix_needs_conversion ? (type->width / 8) : matrix_stride;\n\t\t\t\t// Dynamic array access.\n\t\t\t\tif (indexing_stride % word_stride)\n\t\t\t\t{\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Matrix stride for dynamic indexing must be divisible by the size of a \"\n\t\t\t\t\t                  \"4-component vector. \"\n\t\t\t\t\t                  \"Likely culprit here is a row-major matrix being accessed dynamically. \"\n\t\t\t\t\t                  \"This cannot be flattened. Try using std140 layout instead.\");\n\t\t\t\t}\n\n\t\t\t\texpr += to_enclosed_expression(index, false);\n\t\t\t\texpr += \" * \";\n\t\t\t\texpr += convert_to_string(indexing_stride / word_stride);\n\t\t\t\texpr += \" + \";\n\t\t\t}\n\n\t\t\ttype = &get<SPIRType>(type->parent_type);\n\t\t}\n\t\t// Vector -> Scalar\n\t\telse if (type->vecsize > 1)\n\t\t{\n\t\t\tauto *constant = maybe_get<SPIRConstant>(index);\n\t\t\tif (constant)\n\t\t\t{\n\t\t\t\tindex = evaluate_constant_u32(index);\n\t\t\t\toffset += index * (row_major_matrix_needs_conversion ? matrix_stride : (type->width / 8));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tuint32_t indexing_stride = row_major_matrix_needs_conversion ? matrix_stride : (type->width / 8);\n\n\t\t\t\t// Dynamic array access.\n\t\t\t\tif (indexing_stride % word_stride)\n\t\t\t\t{\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Stride for dynamic vector indexing must be divisible by the \"\n\t\t\t\t\t                  \"size of a 4-component vector. \"\n\t\t\t\t\t                  \"This cannot be flattened in legacy targets.\");\n\t\t\t\t}\n\n\t\t\t\texpr += to_enclosed_expression(index, false);\n\t\t\t\texpr += \" * \";\n\t\t\t\texpr += convert_to_string(indexing_stride / word_stride);\n\t\t\t\texpr += \" + \";\n\t\t\t}\n\n\t\t\ttype = &get<SPIRType>(type->parent_type);\n\t\t}\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"Cannot subdivide a scalar value!\");\n\t}\n\n\tif (need_transpose)\n\t\t*need_transpose = row_major_matrix_needs_conversion;\n\tif (out_matrix_stride)\n\t\t*out_matrix_stride = matrix_stride;\n\tif (out_array_stride)\n\t\t*out_array_stride = array_stride;\n\n\treturn std::make_pair(expr, offset);\n}\n\nbool CompilerGLSL::should_dereference(uint32_t id)\n{\n\tconst auto &type = expression_type(id);\n\t// Non-pointer expressions don't need to be dereferenced.\n\tif (!type.pointer)\n\t\treturn false;\n\n\t// Handles shouldn't be dereferenced either.\n\tif (!expression_is_lvalue(id))\n\t\treturn false;\n\n\t// If id is a variable but not a phi variable, we should not dereference it.\n\tif (auto *var = maybe_get<SPIRVariable>(id))\n\t\treturn var->phi_variable;\n\n\tif (auto *expr = maybe_get<SPIRExpression>(id))\n\t{\n\t\t// If id is an access chain, we should not dereference it.\n\t\tif (expr->access_chain)\n\t\t\treturn false;\n\n\t\t// If id is a forwarded copy of a variable pointer, we should not dereference it.\n\t\tSPIRVariable *var = nullptr;\n\t\twhile (expr->loaded_from && expression_is_forwarded(expr->self))\n\t\t{\n\t\t\tauto &src_type = expression_type(expr->loaded_from);\n\t\t\t// To be a copy, the pointer and its source expression must be the\n\t\t\t// same type. Can't check type.self, because for some reason that's\n\t\t\t// usually the base type with pointers stripped off. This check is\n\t\t\t// complex enough that I've hoisted it out of the while condition.\n\t\t\tif (src_type.pointer != type.pointer || src_type.pointer_depth != type.pointer_depth ||\n\t\t\t    src_type.parent_type != type.parent_type)\n\t\t\t\tbreak;\n\t\t\tif ((var = maybe_get<SPIRVariable>(expr->loaded_from)))\n\t\t\t\tbreak;\n\t\t\tif (!(expr = maybe_get<SPIRExpression>(expr->loaded_from)))\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn !var || var->phi_variable;\n\t}\n\n\t// Otherwise, we should dereference this pointer expression.\n\treturn true;\n}\n\nbool CompilerGLSL::should_forward(uint32_t id) const\n{\n\t// If id is a variable we will try to forward it regardless of force_temporary check below\n\t// This is important because otherwise we'll get local sampler copies (highp sampler2D foo = bar) that are invalid in OpenGL GLSL\n\n\tauto *var = maybe_get<SPIRVariable>(id);\n\tif (var)\n\t{\n\t\t// Never forward volatile builtin variables, e.g. SPIR-V 1.6 HelperInvocation.\n\t\treturn !(has_decoration(id, DecorationBuiltIn) && has_decoration(id, DecorationVolatile));\n\t}\n\n\t// For debugging emit temporary variables for all expressions\n\tif (options.force_temporary)\n\t\treturn false;\n\n\t// If an expression carries enough dependencies we need to stop forwarding at some point,\n\t// or we explode compilers. There are usually limits to how much we can nest expressions.\n\tauto *expr = maybe_get<SPIRExpression>(id);\n\tconst uint32_t max_expression_dependencies = 64;\n\tif (expr && expr->expression_dependencies.size() >= max_expression_dependencies)\n\t\treturn false;\n\n\tif (expr && expr->loaded_from\n\t\t&& has_decoration(expr->loaded_from, DecorationBuiltIn)\n\t\t&& has_decoration(expr->loaded_from, DecorationVolatile))\n\t{\n\t\t// Never forward volatile builtin variables, e.g. SPIR-V 1.6 HelperInvocation.\n\t\treturn false;\n\t}\n\n\t// Immutable expression can always be forwarded.\n\tif (is_immutable(id))\n\t\treturn true;\n\n\treturn false;\n}\n\nbool CompilerGLSL::should_suppress_usage_tracking(uint32_t id) const\n{\n\t// Used only by opcodes which don't do any real \"work\", they just swizzle data in some fashion.\n\treturn !expression_is_forwarded(id) || expression_suppresses_usage_tracking(id);\n}\n\nvoid CompilerGLSL::track_expression_read(uint32_t id)\n{\n\tswitch (ir.ids[id].get_type())\n\t{\n\tcase TypeExpression:\n\t{\n\t\tauto &e = get<SPIRExpression>(id);\n\t\tfor (auto implied_read : e.implied_read_expressions)\n\t\t\ttrack_expression_read(implied_read);\n\t\tbreak;\n\t}\n\n\tcase TypeAccessChain:\n\t{\n\t\tauto &e = get<SPIRAccessChain>(id);\n\t\tfor (auto implied_read : e.implied_read_expressions)\n\t\t\ttrack_expression_read(implied_read);\n\t\tbreak;\n\t}\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\t// If we try to read a forwarded temporary more than once we will stamp out possibly complex code twice.\n\t// In this case, it's better to just bind the complex expression to the temporary and read that temporary twice.\n\tif (expression_is_forwarded(id) && !expression_suppresses_usage_tracking(id))\n\t{\n\t\tauto &v = expression_usage_counts[id];\n\t\tv++;\n\n\t\t// If we create an expression outside a loop,\n\t\t// but access it inside a loop, we're implicitly reading it multiple times.\n\t\t// If the expression in question is expensive, we should hoist it out to avoid relying on loop-invariant code motion\n\t\t// working inside the backend compiler.\n\t\tif (expression_read_implies_multiple_reads(id))\n\t\t\tv++;\n\n\t\tif (v >= 2)\n\t\t{\n\t\t\t//if (v == 2)\n\t\t\t//    fprintf(stderr, \"ID %u was forced to temporary due to more than 1 expression use!\\n\", id);\n\n\t\t\t// Force a recompile after this pass to avoid forwarding this variable.\n\t\t\tforce_temporary_and_recompile(id);\n\t\t}\n\t}\n}\n\nbool CompilerGLSL::args_will_forward(uint32_t id, const uint32_t *args, uint32_t num_args, bool pure)\n{\n\tif (forced_temporaries.find(id) != end(forced_temporaries))\n\t\treturn false;\n\n\tfor (uint32_t i = 0; i < num_args; i++)\n\t\tif (!should_forward(args[i]))\n\t\t\treturn false;\n\n\t// We need to forward globals as well.\n\tif (!pure)\n\t{\n\t\tfor (auto global : global_variables)\n\t\t\tif (!should_forward(global))\n\t\t\t\treturn false;\n\t\tfor (auto aliased : aliased_variables)\n\t\t\tif (!should_forward(aliased))\n\t\t\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nvoid CompilerGLSL::register_impure_function_call()\n{\n\t// Impure functions can modify globals and aliased variables, so invalidate them as well.\n\tfor (auto global : global_variables)\n\t\tflush_dependees(get<SPIRVariable>(global));\n\tfor (auto aliased : aliased_variables)\n\t\tflush_dependees(get<SPIRVariable>(aliased));\n}\n\nvoid CompilerGLSL::register_call_out_argument(uint32_t id)\n{\n\tregister_write(id);\n\n\tauto *var = maybe_get<SPIRVariable>(id);\n\tif (var)\n\t\tflush_variable_declaration(var->self);\n}\n\nstring CompilerGLSL::variable_decl_function_local(SPIRVariable &var)\n{\n\t// These variables are always function local,\n\t// so make sure we emit the variable without storage qualifiers.\n\t// Some backends will inject custom variables locally in a function\n\t// with a storage qualifier which is not function-local.\n\tauto old_storage = var.storage;\n\tvar.storage = StorageClassFunction;\n\tauto expr = variable_decl(var);\n\tvar.storage = old_storage;\n\treturn expr;\n}\n\nvoid CompilerGLSL::emit_variable_temporary_copies(const SPIRVariable &var)\n{\n\t// Ensure that we declare phi-variable copies even if the original declaration isn't deferred\n\tif (var.allocate_temporary_copy && !flushed_phi_variables.count(var.self))\n\t{\n\t\tauto &type = get<SPIRType>(var.basetype);\n\t\tauto &flags = get_decoration_bitset(var.self);\n\t\tstatement(flags_to_qualifiers_glsl(type, flags), variable_decl(type, join(\"_\", var.self, \"_copy\")), \";\");\n\t\tflushed_phi_variables.insert(var.self);\n\t}\n}\n\nvoid CompilerGLSL::flush_variable_declaration(uint32_t id)\n{\n\t// Ensure that we declare phi-variable copies even if the original declaration isn't deferred\n\tauto *var = maybe_get<SPIRVariable>(id);\n\tif (var && var->deferred_declaration)\n\t{\n\t\tstring initializer;\n\t\tif (options.force_zero_initialized_variables &&\n\t\t    (var->storage == StorageClassFunction || var->storage == StorageClassGeneric ||\n\t\t     var->storage == StorageClassPrivate) &&\n\t\t    !var->initializer && type_can_zero_initialize(get_variable_data_type(*var)))\n\t\t{\n\t\t\tinitializer = join(\" = \", to_zero_initialized_expression(get_variable_data_type_id(*var)));\n\t\t}\n\n\t\tstatement(variable_decl_function_local(*var), initializer, \";\");\n\t\tvar->deferred_declaration = false;\n\t}\n\tif (var)\n\t{\n\t\temit_variable_temporary_copies(*var);\n\t}\n}\n\nbool CompilerGLSL::remove_duplicate_swizzle(string &op)\n{\n\tauto pos = op.find_last_of('.');\n\tif (pos == string::npos || pos == 0)\n\t\treturn false;\n\n\tstring final_swiz = op.substr(pos + 1, string::npos);\n\n\tif (backend.swizzle_is_function)\n\t{\n\t\tif (final_swiz.size() < 2)\n\t\t\treturn false;\n\n\t\tif (final_swiz.substr(final_swiz.size() - 2, string::npos) == \"()\")\n\t\t\tfinal_swiz.erase(final_swiz.size() - 2, string::npos);\n\t\telse\n\t\t\treturn false;\n\t}\n\n\t// Check if final swizzle is of form .x, .xy, .xyz, .xyzw or similar.\n\t// If so, and previous swizzle is of same length,\n\t// we can drop the final swizzle altogether.\n\tfor (uint32_t i = 0; i < final_swiz.size(); i++)\n\t{\n\t\tstatic const char expected[] = { 'x', 'y', 'z', 'w' };\n\t\tif (i >= 4 || final_swiz[i] != expected[i])\n\t\t\treturn false;\n\t}\n\n\tauto prevpos = op.find_last_of('.', pos - 1);\n\tif (prevpos == string::npos)\n\t\treturn false;\n\n\tprevpos++;\n\n\t// Make sure there are only swizzles here ...\n\tfor (auto i = prevpos; i < pos; i++)\n\t{\n\t\tif (op[i] < 'w' || op[i] > 'z')\n\t\t{\n\t\t\t// If swizzles are foo.xyz() like in C++ backend for example, check for that.\n\t\t\tif (backend.swizzle_is_function && i + 2 == pos && op[i] == '(' && op[i + 1] == ')')\n\t\t\t\tbreak;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// If original swizzle is large enough, just carve out the components we need.\n\t// E.g. foobar.wyx.xy will turn into foobar.wy.\n\tif (pos - prevpos >= final_swiz.size())\n\t{\n\t\top.erase(prevpos + final_swiz.size(), string::npos);\n\n\t\t// Add back the function call ...\n\t\tif (backend.swizzle_is_function)\n\t\t\top += \"()\";\n\t}\n\treturn true;\n}\n\n// Optimizes away vector swizzles where we have something like\n// vec3 foo;\n// foo.xyz <-- swizzle expression does nothing.\n// This is a very common pattern after OpCompositeCombine.\nbool CompilerGLSL::remove_unity_swizzle(uint32_t base, string &op)\n{\n\tauto pos = op.find_last_of('.');\n\tif (pos == string::npos || pos == 0)\n\t\treturn false;\n\n\tstring final_swiz = op.substr(pos + 1, string::npos);\n\n\tif (backend.swizzle_is_function)\n\t{\n\t\tif (final_swiz.size() < 2)\n\t\t\treturn false;\n\n\t\tif (final_swiz.substr(final_swiz.size() - 2, string::npos) == \"()\")\n\t\t\tfinal_swiz.erase(final_swiz.size() - 2, string::npos);\n\t\telse\n\t\t\treturn false;\n\t}\n\n\t// Check if final swizzle is of form .x, .xy, .xyz, .xyzw or similar.\n\t// If so, and previous swizzle is of same length,\n\t// we can drop the final swizzle altogether.\n\tfor (uint32_t i = 0; i < final_swiz.size(); i++)\n\t{\n\t\tstatic const char expected[] = { 'x', 'y', 'z', 'w' };\n\t\tif (i >= 4 || final_swiz[i] != expected[i])\n\t\t\treturn false;\n\t}\n\n\tauto &type = expression_type(base);\n\n\t// Sanity checking ...\n\tassert(type.columns == 1 && type.array.empty());\n\n\tif (type.vecsize == final_swiz.size())\n\t\top.erase(pos, string::npos);\n\treturn true;\n}\n\nstring CompilerGLSL::build_composite_combiner(uint32_t return_type, const uint32_t *elems, uint32_t length)\n{\n\tID base = 0;\n\tstring op;\n\tstring subop;\n\n\t// Can only merge swizzles for vectors.\n\tauto &type = get<SPIRType>(return_type);\n\tbool can_apply_swizzle_opt = type.basetype != SPIRType::Struct && type.array.empty() && type.columns == 1;\n\tbool swizzle_optimization = false;\n\n\tfor (uint32_t i = 0; i < length; i++)\n\t{\n\t\tauto *e = maybe_get<SPIRExpression>(elems[i]);\n\n\t\t// If we're merging another scalar which belongs to the same base\n\t\t// object, just merge the swizzles to avoid triggering more than 1 expression read as much as possible!\n\t\tif (can_apply_swizzle_opt && e && e->base_expression && e->base_expression == base)\n\t\t{\n\t\t\t// Only supposed to be used for vector swizzle -> scalar.\n\t\t\tassert(!e->expression.empty() && e->expression.front() == '.');\n\t\t\tsubop += e->expression.substr(1, string::npos);\n\t\t\tswizzle_optimization = true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// We'll likely end up with duplicated swizzles, e.g.\n\t\t\t// foobar.xyz.xyz from patterns like\n\t\t\t// OpVectorShuffle\n\t\t\t// OpCompositeExtract x 3\n\t\t\t// OpCompositeConstruct 3x + other scalar.\n\t\t\t// Just modify op in-place.\n\t\t\tif (swizzle_optimization)\n\t\t\t{\n\t\t\t\tif (backend.swizzle_is_function)\n\t\t\t\t\tsubop += \"()\";\n\n\t\t\t\t// Don't attempt to remove unity swizzling if we managed to remove duplicate swizzles.\n\t\t\t\t// The base \"foo\" might be vec4, while foo.xyz is vec3 (OpVectorShuffle) and looks like a vec3 due to the .xyz tacked on.\n\t\t\t\t// We only want to remove the swizzles if we're certain that the resulting base will be the same vecsize.\n\t\t\t\t// Essentially, we can only remove one set of swizzles, since that's what we have control over ...\n\t\t\t\t// Case 1:\n\t\t\t\t//  foo.yxz.xyz: Duplicate swizzle kicks in, giving foo.yxz, we are done.\n\t\t\t\t//               foo.yxz was the result of OpVectorShuffle and we don't know the type of foo.\n\t\t\t\t// Case 2:\n\t\t\t\t//  foo.xyz: Duplicate swizzle won't kick in.\n\t\t\t\t//           If foo is vec3, we can remove xyz, giving just foo.\n\t\t\t\tif (!remove_duplicate_swizzle(subop))\n\t\t\t\t\tremove_unity_swizzle(base, subop);\n\n\t\t\t\t// Strips away redundant parens if we created them during component extraction.\n\t\t\t\tstrip_enclosed_expression(subop);\n\t\t\t\tswizzle_optimization = false;\n\t\t\t\top += subop;\n\t\t\t}\n\t\t\telse\n\t\t\t\top += subop;\n\n\t\t\tif (i)\n\t\t\t\top += \", \";\n\n\t\t\tbool uses_buffer_offset =\n\t\t\t    type.basetype == SPIRType::Struct && has_member_decoration(type.self, i, DecorationOffset);\n\t\t\tsubop = to_composite_constructor_expression(type, elems[i], uses_buffer_offset);\n\t\t}\n\n\t\tbase = e ? e->base_expression : ID(0);\n\t}\n\n\tif (swizzle_optimization)\n\t{\n\t\tif (backend.swizzle_is_function)\n\t\t\tsubop += \"()\";\n\n\t\tif (!remove_duplicate_swizzle(subop))\n\t\t\tremove_unity_swizzle(base, subop);\n\t\t// Strips away redundant parens if we created them during component extraction.\n\t\tstrip_enclosed_expression(subop);\n\t}\n\n\top += subop;\n\treturn op;\n}\n\nbool CompilerGLSL::skip_argument(uint32_t id) const\n{\n\tif (!combined_image_samplers.empty() || !options.vulkan_semantics)\n\t{\n\t\tauto &type = expression_type(id);\n\t\tif (type.basetype == SPIRType::Sampler || (type.basetype == SPIRType::Image && type.image.sampled == 1))\n\t\t\treturn true;\n\t}\n\treturn false;\n}\n\nbool CompilerGLSL::optimize_read_modify_write(const SPIRType &type, const string &lhs, const string &rhs)\n{\n\t// Do this with strings because we have a very clear pattern we can check for and it avoids\n\t// adding lots of special cases to the code emission.\n\tif (rhs.size() < lhs.size() + 3)\n\t\treturn false;\n\n\t// Do not optimize matrices. They are a bit awkward to reason about in general\n\t// (in which order does operation happen?), and it does not work on MSL anyways.\n\tif (type.vecsize > 1 && type.columns > 1)\n\t\treturn false;\n\n\tauto index = rhs.find(lhs);\n\tif (index != 0)\n\t\treturn false;\n\n\t// TODO: Shift operators, but it's not important for now.\n\tauto op = rhs.find_first_of(\"+-/*%|&^\", lhs.size() + 1);\n\tif (op != lhs.size() + 1)\n\t\treturn false;\n\n\t// Check that the op is followed by space. This excludes && and ||.\n\tif (rhs[op + 1] != ' ')\n\t\treturn false;\n\n\tchar bop = rhs[op];\n\tauto expr = rhs.substr(lhs.size() + 3);\n\n\t// Avoids false positives where we get a = a * b + c.\n\t// Normally, these expressions are always enclosed, but unexpected code paths may end up hitting this.\n\tif (needs_enclose_expression(expr))\n\t\treturn false;\n\n\t// Try to find increments and decrements. Makes it look neater as += 1, -= 1 is fairly rare to see in real code.\n\t// Find some common patterns which are equivalent.\n\tif ((bop == '+' || bop == '-') && (expr == \"1\" || expr == \"uint(1)\" || expr == \"1u\" || expr == \"int(1u)\"))\n\t\tstatement(lhs, bop, bop, \";\");\n\telse\n\t\tstatement(lhs, \" \", bop, \"= \", expr, \";\");\n\treturn true;\n}\n\nvoid CompilerGLSL::register_control_dependent_expression(uint32_t expr)\n{\n\tif (forwarded_temporaries.find(expr) == end(forwarded_temporaries))\n\t\treturn;\n\n\tassert(current_emitting_block);\n\tcurrent_emitting_block->invalidate_expressions.push_back(expr);\n}\n\nvoid CompilerGLSL::emit_block_instructions(SPIRBlock &block)\n{\n\tcurrent_emitting_block = &block;\n\n\tif (backend.requires_relaxed_precision_analysis)\n\t{\n\t\t// If PHI variables are consumed in unexpected precision contexts, copy them here.\n\t\tfor (size_t i = 0, n = block.phi_variables.size(); i < n; i++)\n\t\t{\n\t\t\tauto &phi = block.phi_variables[i];\n\n\t\t\t// Ensure we only copy once. We know a-priori that this array will lay out\n\t\t\t// the same function variables together.\n\t\t\tif (i && block.phi_variables[i - 1].function_variable == phi.function_variable)\n\t\t\t\tcontinue;\n\n\t\t\tauto itr = temporary_to_mirror_precision_alias.find(phi.function_variable);\n\t\t\tif (itr != temporary_to_mirror_precision_alias.end())\n\t\t\t{\n\t\t\t\t// Explicitly, we don't want to inherit RelaxedPrecision state in this CopyObject,\n\t\t\t\t// so it helps to have handle_instruction_precision() on the outside of emit_instruction().\n\t\t\t\tEmbeddedInstruction inst;\n\t\t\t\tinst.op = OpCopyObject;\n\t\t\t\tinst.length = 3;\n\t\t\t\tinst.ops.push_back(expression_type_id(itr->first));\n\t\t\t\tinst.ops.push_back(itr->second);\n\t\t\t\tinst.ops.push_back(itr->first);\n\t\t\t\temit_instruction(inst);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (auto &op : block.ops)\n\t{\n\t\tauto temporary_copy = handle_instruction_precision(op);\n\t\temit_instruction(op);\n\t\tif (temporary_copy.dst_id)\n\t\t{\n\t\t\t// Explicitly, we don't want to inherit RelaxedPrecision state in this CopyObject,\n\t\t\t// so it helps to have handle_instruction_precision() on the outside of emit_instruction().\n\t\t\tEmbeddedInstruction inst;\n\t\t\tinst.op = OpCopyObject;\n\t\t\tinst.length = 3;\n\t\t\tinst.ops.push_back(expression_type_id(temporary_copy.src_id));\n\t\t\tinst.ops.push_back(temporary_copy.dst_id);\n\t\t\tinst.ops.push_back(temporary_copy.src_id);\n\n\t\t\t// Never attempt to hoist mirrored temporaries.\n\t\t\t// They are hoisted in lock-step with their parents.\n\t\t\tblock_temporary_hoisting = true;\n\t\t\temit_instruction(inst);\n\t\t\tblock_temporary_hoisting = false;\n\t\t}\n\t}\n\n\tcurrent_emitting_block = nullptr;\n}\n\nvoid CompilerGLSL::disallow_forwarding_in_expression_chain(const SPIRExpression &expr)\n{\n\t// Allow trivially forwarded expressions like OpLoad or trivial shuffles,\n\t// these will be marked as having suppressed usage tracking.\n\t// Our only concern is to make sure arithmetic operations are done in similar ways.\n\tif (expression_is_forwarded(expr.self) && !expression_suppresses_usage_tracking(expr.self) &&\n\t    forced_invariant_temporaries.count(expr.self) == 0)\n\t{\n\t\tforce_temporary_and_recompile(expr.self);\n\t\tforced_invariant_temporaries.insert(expr.self);\n\n\t\tfor (auto &dependent : expr.expression_dependencies)\n\t\t\tdisallow_forwarding_in_expression_chain(get<SPIRExpression>(dependent));\n\t}\n}\n\nvoid CompilerGLSL::handle_store_to_invariant_variable(uint32_t store_id, uint32_t value_id)\n{\n\t// Variables or access chains marked invariant are complicated. We will need to make sure the code-gen leading up to\n\t// this variable is consistent. The failure case for SPIRV-Cross is when an expression is forced to a temporary\n\t// in one translation unit, but not another, e.g. due to multiple use of an expression.\n\t// This causes variance despite the output variable being marked invariant, so the solution here is to force all dependent\n\t// expressions to be temporaries.\n\t// It is uncertain if this is enough to support invariant in all possible cases, but it should be good enough\n\t// for all reasonable uses of invariant.\n\tif (!has_decoration(store_id, DecorationInvariant))\n\t\treturn;\n\n\tauto *expr = maybe_get<SPIRExpression>(value_id);\n\tif (!expr)\n\t\treturn;\n\n\tdisallow_forwarding_in_expression_chain(*expr);\n}\n\nvoid CompilerGLSL::emit_store_statement(uint32_t lhs_expression, uint32_t rhs_expression)\n{\n\tauto rhs = to_pointer_expression(rhs_expression);\n\n\t// Statements to OpStore may be empty if it is a struct with zero members. Just forward the store to /dev/null.\n\tif (!rhs.empty())\n\t{\n\t\thandle_store_to_invariant_variable(lhs_expression, rhs_expression);\n\n\t\tif (!unroll_array_to_complex_store(lhs_expression, rhs_expression))\n\t\t{\n\t\t\tauto lhs = to_dereferenced_expression(lhs_expression);\n\t\t\tif (has_decoration(lhs_expression, DecorationNonUniform))\n\t\t\t\tconvert_non_uniform_expression(lhs, lhs_expression);\n\n\t\t\t// We might need to cast in order to store to a builtin.\n\t\t\tcast_to_variable_store(lhs_expression, rhs, expression_type(rhs_expression));\n\n\t\t\t// Tries to optimize assignments like \"<lhs> = <lhs> op expr\".\n\t\t\t// While this is purely cosmetic, this is important for legacy ESSL where loop\n\t\t\t// variable increments must be in either i++ or i += const-expr.\n\t\t\t// Without this, we end up with i = i + 1, which is correct GLSL, but not correct GLES 2.0.\n\t\t\tif (!optimize_read_modify_write(expression_type(rhs_expression), lhs, rhs))\n\t\t\t\tstatement(lhs, \" = \", rhs, \";\");\n\t\t}\n\t\tregister_write(lhs_expression);\n\t}\n}\n\nuint32_t CompilerGLSL::get_integer_width_for_instruction(const Instruction &instr) const\n{\n\tif (instr.length < 3)\n\t\treturn 32;\n\n\tauto *ops = stream(instr);\n\n\tswitch (instr.op)\n\t{\n\tcase OpSConvert:\n\tcase OpConvertSToF:\n\tcase OpUConvert:\n\tcase OpConvertUToF:\n\tcase OpIEqual:\n\tcase OpINotEqual:\n\tcase OpSLessThan:\n\tcase OpSLessThanEqual:\n\tcase OpSGreaterThan:\n\tcase OpSGreaterThanEqual:\n\tcase OpULessThan:\n\tcase OpULessThanEqual:\n\tcase OpUGreaterThan:\n\tcase OpUGreaterThanEqual:\n\t\treturn expression_type(ops[2]).width;\n\n\tdefault:\n\t{\n\t\t// We can look at result type which is more robust.\n\t\tauto *type = maybe_get<SPIRType>(ops[0]);\n\t\tif (type && type_is_integral(*type))\n\t\t\treturn type->width;\n\t\telse\n\t\t\treturn 32;\n\t}\n\t}\n}\n\nuint32_t CompilerGLSL::get_integer_width_for_glsl_instruction(GLSLstd450 op, const uint32_t *ops, uint32_t length) const\n{\n\tif (length < 1)\n\t\treturn 32;\n\n\tswitch (op)\n\t{\n\tcase GLSLstd450SAbs:\n\tcase GLSLstd450SSign:\n\tcase GLSLstd450UMin:\n\tcase GLSLstd450SMin:\n\tcase GLSLstd450UMax:\n\tcase GLSLstd450SMax:\n\tcase GLSLstd450UClamp:\n\tcase GLSLstd450SClamp:\n\tcase GLSLstd450FindSMsb:\n\tcase GLSLstd450FindUMsb:\n\t\treturn expression_type(ops[0]).width;\n\n\tdefault:\n\t{\n\t\t// We don't need to care about other opcodes, just return 32.\n\t\treturn 32;\n\t}\n\t}\n}\n\nvoid CompilerGLSL::forward_relaxed_precision(uint32_t dst_id, const uint32_t *args, uint32_t length)\n{\n\t// Only GLSL supports RelaxedPrecision directly.\n\t// We cannot implement this in HLSL or MSL because it is tied to the type system.\n\t// In SPIR-V, everything must masquerade as 32-bit.\n\tif (!backend.requires_relaxed_precision_analysis)\n\t\treturn;\n\n\tauto input_precision = analyze_expression_precision(args, length);\n\n\t// For expressions which are loaded or directly forwarded, we inherit mediump implicitly.\n\t// For dst_id to be analyzed properly, it must inherit any relaxed precision decoration from src_id.\n\tif (input_precision == Options::Mediump)\n\t\tset_decoration(dst_id, DecorationRelaxedPrecision);\n}\n\nCompilerGLSL::Options::Precision CompilerGLSL::analyze_expression_precision(const uint32_t *args, uint32_t length) const\n{\n\t// Now, analyze the precision at which the arguments would run.\n\t// GLSL rules are such that the precision used to evaluate an expression is equal to the highest precision\n\t// for the inputs. Constants do not have inherent precision and do not contribute to this decision.\n\t// If all inputs are constants, they inherit precision from outer expressions, including an l-value.\n\t// In this case, we'll have to force a temporary for dst_id so that we can bind the constant expression with\n\t// correct precision.\n\tbool expression_has_highp = false;\n\tbool expression_has_mediump = false;\n\n\tfor (uint32_t i = 0; i < length; i++)\n\t{\n\t\tuint32_t arg = args[i];\n\n\t\tauto handle_type = ir.ids[arg].get_type();\n\t\tif (handle_type == TypeConstant || handle_type == TypeConstantOp || handle_type == TypeUndef)\n\t\t\tcontinue;\n\n\t\tif (has_decoration(arg, DecorationRelaxedPrecision))\n\t\t\texpression_has_mediump = true;\n\t\telse\n\t\t\texpression_has_highp = true;\n\t}\n\n\tif (expression_has_highp)\n\t\treturn Options::Highp;\n\telse if (expression_has_mediump)\n\t\treturn Options::Mediump;\n\telse\n\t\treturn Options::DontCare;\n}\n\nvoid CompilerGLSL::analyze_precision_requirements(uint32_t type_id, uint32_t dst_id, uint32_t *args, uint32_t length)\n{\n\tif (!backend.requires_relaxed_precision_analysis)\n\t\treturn;\n\n\tauto &type = get<SPIRType>(type_id);\n\n\t// RelaxedPrecision only applies to 32-bit values.\n\tif (type.basetype != SPIRType::Float && type.basetype != SPIRType::Int && type.basetype != SPIRType::UInt)\n\t\treturn;\n\n\tbool operation_is_highp = !has_decoration(dst_id, DecorationRelaxedPrecision);\n\n\tauto input_precision = analyze_expression_precision(args, length);\n\tif (input_precision == Options::DontCare)\n\t{\n\t\tconsume_temporary_in_precision_context(type_id, dst_id, input_precision);\n\t\treturn;\n\t}\n\n\t// In SPIR-V and GLSL, the semantics are flipped for how relaxed precision is determined.\n\t// In SPIR-V, the operation itself marks RelaxedPrecision, meaning that inputs can be truncated to 16-bit.\n\t// However, if the expression is not, inputs must be expanded to 32-bit first,\n\t// since the operation must run at high precision.\n\t// This is the awkward part, because if we have mediump inputs, or expressions which derived from mediump,\n\t// we might have to forcefully bind the source IDs to highp temporaries. This is done by clearing decorations\n\t// and forcing temporaries. Similarly for mediump operations. We bind highp expressions to mediump variables.\n\tif ((operation_is_highp && input_precision == Options::Mediump) ||\n\t    (!operation_is_highp && input_precision == Options::Highp))\n\t{\n\t\tauto precision = operation_is_highp ? Options::Highp : Options::Mediump;\n\t\tfor (uint32_t i = 0; i < length; i++)\n\t\t{\n\t\t\t// Rewrites the opcode so that we consume an ID in correct precision context.\n\t\t\t// This is pretty hacky, but it's the most straight forward way of implementing this without adding\n\t\t\t// lots of extra passes to rewrite all code blocks.\n\t\t\targs[i] = consume_temporary_in_precision_context(expression_type_id(args[i]), args[i], precision);\n\t\t}\n\t}\n}\n\n// This is probably not exhaustive ...\nstatic bool opcode_is_precision_sensitive_operation(Op op)\n{\n\tswitch (op)\n\t{\n\tcase OpFAdd:\n\tcase OpFSub:\n\tcase OpFMul:\n\tcase OpFNegate:\n\tcase OpIAdd:\n\tcase OpISub:\n\tcase OpIMul:\n\tcase OpSNegate:\n\tcase OpFMod:\n\tcase OpFDiv:\n\tcase OpFRem:\n\tcase OpSMod:\n\tcase OpSDiv:\n\tcase OpSRem:\n\tcase OpUMod:\n\tcase OpUDiv:\n\tcase OpVectorTimesMatrix:\n\tcase OpMatrixTimesVector:\n\tcase OpMatrixTimesMatrix:\n\tcase OpDPdx:\n\tcase OpDPdy:\n\tcase OpDPdxCoarse:\n\tcase OpDPdyCoarse:\n\tcase OpDPdxFine:\n\tcase OpDPdyFine:\n\tcase OpFwidth:\n\tcase OpFwidthCoarse:\n\tcase OpFwidthFine:\n\tcase OpVectorTimesScalar:\n\tcase OpMatrixTimesScalar:\n\tcase OpOuterProduct:\n\tcase OpFConvert:\n\tcase OpSConvert:\n\tcase OpUConvert:\n\tcase OpConvertSToF:\n\tcase OpConvertUToF:\n\tcase OpConvertFToU:\n\tcase OpConvertFToS:\n\t\treturn true;\n\n\tdefault:\n\t\treturn false;\n\t}\n}\n\n// Instructions which just load data but don't do any arithmetic operation should just inherit the decoration.\n// SPIR-V doesn't require this, but it's somewhat implied it has to work this way, relaxed precision is only\n// relevant when operating on the IDs, not when shuffling things around.\nstatic bool opcode_is_precision_forwarding_instruction(Op op, uint32_t &arg_count)\n{\n\tswitch (op)\n\t{\n\tcase OpLoad:\n\tcase OpAccessChain:\n\tcase OpInBoundsAccessChain:\n\tcase OpCompositeExtract:\n\tcase OpVectorExtractDynamic:\n\tcase OpSampledImage:\n\tcase OpImage:\n\tcase OpCopyObject:\n\n\tcase OpImageRead:\n\tcase OpImageFetch:\n\tcase OpImageSampleImplicitLod:\n\tcase OpImageSampleProjImplicitLod:\n\tcase OpImageSampleDrefImplicitLod:\n\tcase OpImageSampleProjDrefImplicitLod:\n\tcase OpImageSampleExplicitLod:\n\tcase OpImageSampleProjExplicitLod:\n\tcase OpImageSampleDrefExplicitLod:\n\tcase OpImageSampleProjDrefExplicitLod:\n\tcase OpImageGather:\n\tcase OpImageDrefGather:\n\tcase OpImageSparseRead:\n\tcase OpImageSparseFetch:\n\tcase OpImageSparseSampleImplicitLod:\n\tcase OpImageSparseSampleProjImplicitLod:\n\tcase OpImageSparseSampleDrefImplicitLod:\n\tcase OpImageSparseSampleProjDrefImplicitLod:\n\tcase OpImageSparseSampleExplicitLod:\n\tcase OpImageSparseSampleProjExplicitLod:\n\tcase OpImageSparseSampleDrefExplicitLod:\n\tcase OpImageSparseSampleProjDrefExplicitLod:\n\tcase OpImageSparseGather:\n\tcase OpImageSparseDrefGather:\n\t\targ_count = 1;\n\t\treturn true;\n\n\tcase OpVectorShuffle:\n\t\targ_count = 2;\n\t\treturn true;\n\n\tcase OpCompositeConstruct:\n\t\treturn true;\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn false;\n}\n\nCompilerGLSL::TemporaryCopy CompilerGLSL::handle_instruction_precision(const Instruction &instruction)\n{\n\tauto ops = stream_mutable(instruction);\n\tauto opcode = static_cast<Op>(instruction.op);\n\tuint32_t length = instruction.length;\n\n\tif (backend.requires_relaxed_precision_analysis)\n\t{\n\t\tif (length > 2)\n\t\t{\n\t\t\tuint32_t forwarding_length = length - 2;\n\n\t\t\tif (opcode_is_precision_sensitive_operation(opcode))\n\t\t\t\tanalyze_precision_requirements(ops[0], ops[1], &ops[2], forwarding_length);\n\t\t\telse if (opcode == OpExtInst && length >= 5 && get<SPIRExtension>(ops[2]).ext == SPIRExtension::GLSL)\n\t\t\t\tanalyze_precision_requirements(ops[0], ops[1], &ops[4], forwarding_length - 2);\n\t\t\telse if (opcode_is_precision_forwarding_instruction(opcode, forwarding_length))\n\t\t\t\tforward_relaxed_precision(ops[1], &ops[2], forwarding_length);\n\t\t}\n\n\t\tuint32_t result_type = 0, result_id = 0;\n\t\tif (instruction_to_result_type(result_type, result_id, opcode, ops, length))\n\t\t{\n\t\t\tauto itr = temporary_to_mirror_precision_alias.find(ops[1]);\n\t\t\tif (itr != temporary_to_mirror_precision_alias.end())\n\t\t\t\treturn { itr->second, itr->first };\n\t\t}\n\t}\n\n\treturn {};\n}\n\nvoid CompilerGLSL::emit_instruction(const Instruction &instruction)\n{\n\tauto ops = stream(instruction);\n\tauto opcode = static_cast<Op>(instruction.op);\n\tuint32_t length = instruction.length;\n\n#define GLSL_BOP(op) emit_binary_op(ops[0], ops[1], ops[2], ops[3], #op)\n#define GLSL_BOP_CAST(op, type) \\\n\temit_binary_op_cast(ops[0], ops[1], ops[2], ops[3], #op, type, \\\n\t                    opcode_is_sign_invariant(opcode), implicit_integer_promotion)\n#define GLSL_UOP(op) emit_unary_op(ops[0], ops[1], ops[2], #op)\n#define GLSL_UOP_CAST(op) emit_unary_op_cast(ops[0], ops[1], ops[2], #op)\n#define GLSL_QFOP(op) emit_quaternary_func_op(ops[0], ops[1], ops[2], ops[3], ops[4], ops[5], #op)\n#define GLSL_TFOP(op) emit_trinary_func_op(ops[0], ops[1], ops[2], ops[3], ops[4], #op)\n#define GLSL_BFOP(op) emit_binary_func_op(ops[0], ops[1], ops[2], ops[3], #op)\n#define GLSL_BFOP_CAST(op, type) \\\n\temit_binary_func_op_cast(ops[0], ops[1], ops[2], ops[3], #op, type, opcode_is_sign_invariant(opcode))\n#define GLSL_BFOP(op) emit_binary_func_op(ops[0], ops[1], ops[2], ops[3], #op)\n#define GLSL_UFOP(op) emit_unary_func_op(ops[0], ops[1], ops[2], #op)\n\n\t// If we need to do implicit bitcasts, make sure we do it with the correct type.\n\tuint32_t integer_width = get_integer_width_for_instruction(instruction);\n\tauto int_type = to_signed_basetype(integer_width);\n\tauto uint_type = to_unsigned_basetype(integer_width);\n\n\t// Handle C implicit integer promotion rules.\n\t// If we get implicit promotion to int, need to make sure we cast by value to intended return type,\n\t// otherwise, future sign-dependent operations and bitcasts will break.\n\tbool implicit_integer_promotion = integer_width < 32 && backend.implicit_c_integer_promotion_rules &&\n\t                                  opcode_can_promote_integer_implicitly(opcode) &&\n\t                                  get<SPIRType>(ops[0]).vecsize == 1;\n\n\topcode = get_remapped_spirv_op(opcode);\n\n\tswitch (opcode)\n\t{\n\t// Dealing with memory\n\tcase OpLoad:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tuint32_t ptr = ops[2];\n\n\t\tflush_variable_declaration(ptr);\n\n\t\t// If we're loading from memory that cannot be changed by the shader,\n\t\t// just forward the expression directly to avoid needless temporaries.\n\t\t// If an expression is mutable and forwardable, we speculate that it is immutable.\n\t\tbool forward = should_forward(ptr) && forced_temporaries.find(id) == end(forced_temporaries);\n\n\t\t// If loading a non-native row-major matrix, mark the expression as need_transpose.\n\t\tbool need_transpose = false;\n\t\tbool old_need_transpose = false;\n\n\t\tauto *ptr_expression = maybe_get<SPIRExpression>(ptr);\n\n\t\tif (forward)\n\t\t{\n\t\t\t// If we're forwarding the load, we're also going to forward transpose state, so don't transpose while\n\t\t\t// taking the expression.\n\t\t\tif (ptr_expression && ptr_expression->need_transpose)\n\t\t\t{\n\t\t\t\told_need_transpose = true;\n\t\t\t\tptr_expression->need_transpose = false;\n\t\t\t\tneed_transpose = true;\n\t\t\t}\n\t\t\telse if (is_non_native_row_major_matrix(ptr))\n\t\t\t\tneed_transpose = true;\n\t\t}\n\n\t\t// If we are forwarding this load,\n\t\t// don't register the read to access chain here, defer that to when we actually use the expression,\n\t\t// using the add_implied_read_expression mechanism.\n\t\tstring expr;\n\n\t\tbool is_packed = has_extended_decoration(ptr, SPIRVCrossDecorationPhysicalTypePacked);\n\t\tbool is_remapped = has_extended_decoration(ptr, SPIRVCrossDecorationPhysicalTypeID);\n\t\tif (forward || (!is_packed && !is_remapped))\n\t\t{\n\t\t\t// For the simple case, we do not need to deal with repacking.\n\t\t\texpr = to_dereferenced_expression(ptr, false);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// If we are not forwarding the expression, we need to unpack and resolve any physical type remapping here before\n\t\t\t// storing the expression to a temporary.\n\t\t\texpr = to_unpacked_expression(ptr);\n\t\t}\n\n\t\tauto &type = get<SPIRType>(result_type);\n\t\tauto &expr_type = expression_type(ptr);\n\n\t\t// If the expression has more vector components than the result type, insert\n\t\t// a swizzle. This shouldn't happen normally on valid SPIR-V, but it might\n\t\t// happen with e.g. the MSL backend replacing the type of an input variable.\n\t\tif (expr_type.vecsize > type.vecsize)\n\t\t\texpr = enclose_expression(expr + vector_swizzle(type.vecsize, 0));\n\n\t\tif (forward && ptr_expression)\n\t\t\tptr_expression->need_transpose = old_need_transpose;\n\n\t\t// We might need to cast in order to load from a builtin.\n\t\tcast_from_variable_load(ptr, expr, type);\n\n\t\tif (forward && ptr_expression)\n\t\t\tptr_expression->need_transpose = false;\n\n\t\t// We might be trying to load a gl_Position[N], where we should be\n\t\t// doing float4[](gl_in[i].gl_Position, ...) instead.\n\t\t// Similar workarounds are required for input arrays in tessellation.\n\t\t// Also, loading from gl_SampleMask array needs special unroll.\n\t\tunroll_array_from_complex_load(id, ptr, expr);\n\n\t\tif (!type_is_opaque_value(type) && has_decoration(ptr, DecorationNonUniform))\n\t\t{\n\t\t\t// If we're loading something non-opaque, we need to handle non-uniform descriptor access.\n\t\t\tconvert_non_uniform_expression(expr, ptr);\n\t\t}\n\n\t\tif (forward && ptr_expression)\n\t\t\tptr_expression->need_transpose = old_need_transpose;\n\n\t\tbool flattened = ptr_expression && flattened_buffer_blocks.count(ptr_expression->loaded_from) != 0;\n\n\t\tif (backend.needs_row_major_load_workaround && !is_non_native_row_major_matrix(ptr) && !flattened)\n\t\t\trewrite_load_for_wrapped_row_major(expr, result_type, ptr);\n\n\t\t// By default, suppress usage tracking since using same expression multiple times does not imply any extra work.\n\t\t// However, if we try to load a complex, composite object from a flattened buffer,\n\t\t// we should avoid emitting the same code over and over and lower the result to a temporary.\n\t\tbool usage_tracking = flattened && (type.basetype == SPIRType::Struct || (type.columns > 1));\n\n\t\tSPIRExpression *e = nullptr;\n\t\tif (!forward && expression_is_non_value_type_array(ptr))\n\t\t{\n\t\t\t// Complicated load case where we need to make a copy of ptr, but we cannot, because\n\t\t\t// it is an array, and our backend does not support arrays as value types.\n\t\t\t// Emit the temporary, and copy it explicitly.\n\t\t\te = &emit_uninitialized_temporary_expression(result_type, id);\n\t\t\temit_array_copy(nullptr, id, ptr, StorageClassFunction, get_expression_effective_storage_class(ptr));\n\t\t}\n\t\telse\n\t\t\te = &emit_op(result_type, id, expr, forward, !usage_tracking);\n\n\t\te->need_transpose = need_transpose;\n\t\tregister_read(id, ptr, forward);\n\n\t\tif (forward)\n\t\t{\n\t\t\t// Pass through whether the result is of a packed type and the physical type ID.\n\t\t\tif (has_extended_decoration(ptr, SPIRVCrossDecorationPhysicalTypePacked))\n\t\t\t\tset_extended_decoration(id, SPIRVCrossDecorationPhysicalTypePacked);\n\t\t\tif (has_extended_decoration(ptr, SPIRVCrossDecorationPhysicalTypeID))\n\t\t\t{\n\t\t\t\tset_extended_decoration(id, SPIRVCrossDecorationPhysicalTypeID,\n\t\t\t\t                        get_extended_decoration(ptr, SPIRVCrossDecorationPhysicalTypeID));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// This might have been set on an earlier compilation iteration, force it to be unset.\n\t\t\tunset_extended_decoration(id, SPIRVCrossDecorationPhysicalTypePacked);\n\t\t\tunset_extended_decoration(id, SPIRVCrossDecorationPhysicalTypeID);\n\t\t}\n\n\t\tinherit_expression_dependencies(id, ptr);\n\t\tif (forward)\n\t\t\tadd_implied_read_expression(*e, ptr);\n\t\tbreak;\n\t}\n\n\tcase OpInBoundsAccessChain:\n\tcase OpAccessChain:\n\tcase OpPtrAccessChain:\n\t{\n\t\tauto *var = maybe_get<SPIRVariable>(ops[2]);\n\t\tif (var)\n\t\t\tflush_variable_declaration(var->self);\n\n\t\t// If the base is immutable, the access chain pointer must also be.\n\t\t// If an expression is mutable and forwardable, we speculate that it is immutable.\n\t\tAccessChainMeta meta;\n\t\tbool ptr_chain = opcode == OpPtrAccessChain;\n\t\tauto &target_type = get<SPIRType>(ops[0]);\n\t\tauto e = access_chain(ops[2], &ops[3], length - 3, target_type, &meta, ptr_chain);\n\n\t\t// If the base is flattened UBO of struct type, the expression has to be a composite.\n\t\t// In that case, backends which do not support inline syntax need it to be bound to a temporary.\n\t\t// Otherwise, invalid expressions like ({UBO[0].xyz, UBO[0].w, UBO[1]}).member are emitted.\n\t\tbool requires_temporary = false;\n\t\tif (flattened_buffer_blocks.count(ops[2]) && target_type.basetype == SPIRType::Struct)\n\t\t\trequires_temporary = !backend.can_declare_struct_inline;\n\n\t\tauto &expr = requires_temporary ?\n                         emit_op(ops[0], ops[1], std::move(e), false) :\n                         set<SPIRExpression>(ops[1], std::move(e), ops[0], should_forward(ops[2]));\n\n\t\tauto *backing_variable = maybe_get_backing_variable(ops[2]);\n\t\texpr.loaded_from = backing_variable ? backing_variable->self : ID(ops[2]);\n\t\texpr.need_transpose = meta.need_transpose;\n\t\texpr.access_chain = true;\n\t\texpr.access_meshlet_position_y = meta.access_meshlet_position_y;\n\n\t\t// Mark the result as being packed. Some platforms handled packed vectors differently than non-packed.\n\t\tif (meta.storage_is_packed)\n\t\t\tset_extended_decoration(ops[1], SPIRVCrossDecorationPhysicalTypePacked);\n\t\tif (meta.storage_physical_type != 0)\n\t\t\tset_extended_decoration(ops[1], SPIRVCrossDecorationPhysicalTypeID, meta.storage_physical_type);\n\t\tif (meta.storage_is_invariant)\n\t\t\tset_decoration(ops[1], DecorationInvariant);\n\t\tif (meta.flattened_struct)\n\t\t\tflattened_structs[ops[1]] = true;\n\t\tif (meta.relaxed_precision && backend.requires_relaxed_precision_analysis)\n\t\t\tset_decoration(ops[1], DecorationRelaxedPrecision);\n\n\t\t// If we have some expression dependencies in our access chain, this access chain is technically a forwarded\n\t\t// temporary which could be subject to invalidation.\n\t\t// Need to assume we're forwarded while calling inherit_expression_depdendencies.\n\t\tforwarded_temporaries.insert(ops[1]);\n\t\t// The access chain itself is never forced to a temporary, but its dependencies might.\n\t\tsuppressed_usage_tracking.insert(ops[1]);\n\n\t\tfor (uint32_t i = 2; i < length; i++)\n\t\t{\n\t\t\tinherit_expression_dependencies(ops[1], ops[i]);\n\t\t\tadd_implied_read_expression(expr, ops[i]);\n\t\t}\n\n\t\t// If we have no dependencies after all, i.e., all indices in the access chain are immutable temporaries,\n\t\t// we're not forwarded after all.\n\t\tif (expr.expression_dependencies.empty())\n\t\t\tforwarded_temporaries.erase(ops[1]);\n\n\t\tbreak;\n\t}\n\n\tcase OpStore:\n\t{\n\t\tauto *var = maybe_get<SPIRVariable>(ops[0]);\n\n\t\tif (var && var->statically_assigned)\n\t\t\tvar->static_expression = ops[1];\n\t\telse if (var && var->loop_variable && !var->loop_variable_enable)\n\t\t\tvar->static_expression = ops[1];\n\t\telse if (var && var->remapped_variable && var->static_expression)\n\t\t{\n\t\t\t// Skip the write.\n\t\t}\n\t\telse if (flattened_structs.count(ops[0]))\n\t\t{\n\t\t\tstore_flattened_struct(ops[0], ops[1]);\n\t\t\tregister_write(ops[0]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\temit_store_statement(ops[0], ops[1]);\n\t\t}\n\n\t\t// Storing a pointer results in a variable pointer, so we must conservatively assume\n\t\t// we can write through it.\n\t\tif (expression_type(ops[1]).pointer)\n\t\t\tregister_write(ops[1]);\n\t\tbreak;\n\t}\n\n\tcase OpArrayLength:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tauto e = access_chain_internal(ops[2], &ops[3], length - 3, ACCESS_CHAIN_INDEX_IS_LITERAL_BIT, nullptr);\n\t\tif (has_decoration(ops[2], DecorationNonUniform))\n\t\t\tconvert_non_uniform_expression(e, ops[2]);\n\t\tset<SPIRExpression>(id, join(type_to_glsl(get<SPIRType>(result_type)), \"(\", e, \".length())\"), result_type,\n\t\t                    true);\n\t\tbreak;\n\t}\n\n\t// Function calls\n\tcase OpFunctionCall:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tuint32_t func = ops[2];\n\t\tconst auto *arg = &ops[3];\n\t\tlength -= 3;\n\n\t\tauto &callee = get<SPIRFunction>(func);\n\t\tauto &return_type = get<SPIRType>(callee.return_type);\n\t\tbool pure = function_is_pure(callee);\n\n\t\tbool callee_has_out_variables = false;\n\t\tbool emit_return_value_as_argument = false;\n\n\t\t// Invalidate out variables passed to functions since they can be OpStore'd to.\n\t\tfor (uint32_t i = 0; i < length; i++)\n\t\t{\n\t\t\tif (callee.arguments[i].write_count)\n\t\t\t{\n\t\t\t\tregister_call_out_argument(arg[i]);\n\t\t\t\tcallee_has_out_variables = true;\n\t\t\t}\n\n\t\t\tflush_variable_declaration(arg[i]);\n\t\t}\n\n\t\tif (!return_type.array.empty() && !backend.can_return_array)\n\t\t{\n\t\t\tcallee_has_out_variables = true;\n\t\t\temit_return_value_as_argument = true;\n\t\t}\n\n\t\tif (!pure)\n\t\t\tregister_impure_function_call();\n\n\t\tstring funexpr;\n\t\tSmallVector<string> arglist;\n\t\tfunexpr += to_name(func) + \"(\";\n\n\t\tif (emit_return_value_as_argument)\n\t\t{\n\t\t\tstatement(type_to_glsl(return_type), \" \", to_name(id), type_to_array_glsl(return_type), \";\");\n\t\t\targlist.push_back(to_name(id));\n\t\t}\n\n\t\tfor (uint32_t i = 0; i < length; i++)\n\t\t{\n\t\t\t// Do not pass in separate images or samplers if we're remapping\n\t\t\t// to combined image samplers.\n\t\t\tif (skip_argument(arg[i]))\n\t\t\t\tcontinue;\n\n\t\t\targlist.push_back(to_func_call_arg(callee.arguments[i], arg[i]));\n\t\t}\n\n\t\tfor (auto &combined : callee.combined_parameters)\n\t\t{\n\t\t\tauto image_id = combined.global_image ? combined.image_id : VariableID(arg[combined.image_id]);\n\t\t\tauto sampler_id = combined.global_sampler ? combined.sampler_id : VariableID(arg[combined.sampler_id]);\n\t\t\targlist.push_back(to_combined_image_sampler(image_id, sampler_id));\n\t\t}\n\n\t\tappend_global_func_args(callee, length, arglist);\n\n\t\tfunexpr += merge(arglist);\n\t\tfunexpr += \")\";\n\n\t\t// Check for function call constraints.\n\t\tcheck_function_call_constraints(arg, length);\n\n\t\tif (return_type.basetype != SPIRType::Void)\n\t\t{\n\t\t\t// If the function actually writes to an out variable,\n\t\t\t// take the conservative route and do not forward.\n\t\t\t// The problem is that we might not read the function\n\t\t\t// result (and emit the function) before an out variable\n\t\t\t// is read (common case when return value is ignored!\n\t\t\t// In order to avoid start tracking invalid variables,\n\t\t\t// just avoid the forwarding problem altogether.\n\t\t\tbool forward = args_will_forward(id, arg, length, pure) && !callee_has_out_variables && pure &&\n\t\t\t               (forced_temporaries.find(id) == end(forced_temporaries));\n\n\t\t\tif (emit_return_value_as_argument)\n\t\t\t{\n\t\t\t\tstatement(funexpr, \";\");\n\t\t\t\tset<SPIRExpression>(id, to_name(id), result_type, true);\n\t\t\t}\n\t\t\telse\n\t\t\t\temit_op(result_type, id, funexpr, forward);\n\n\t\t\t// Function calls are implicit loads from all variables in question.\n\t\t\t// Set dependencies for them.\n\t\t\tfor (uint32_t i = 0; i < length; i++)\n\t\t\t\tregister_read(id, arg[i], forward);\n\n\t\t\t// If we're going to forward the temporary result,\n\t\t\t// put dependencies on every variable that must not change.\n\t\t\tif (forward)\n\t\t\t\tregister_global_read_dependencies(callee, id);\n\t\t}\n\t\telse\n\t\t\tstatement(funexpr, \";\");\n\n\t\tbreak;\n\t}\n\n\t// Composite munging\n\tcase OpCompositeConstruct:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tconst auto *const elems = &ops[2];\n\t\tlength -= 2;\n\n\t\tbool forward = true;\n\t\tfor (uint32_t i = 0; i < length; i++)\n\t\t\tforward = forward && should_forward(elems[i]);\n\n\t\tauto &out_type = get<SPIRType>(result_type);\n\t\tauto *in_type = length > 0 ? &expression_type(elems[0]) : nullptr;\n\n\t\t// Only splat if we have vector constructors.\n\t\t// Arrays and structs must be initialized properly in full.\n\t\tbool composite = !out_type.array.empty() || out_type.basetype == SPIRType::Struct;\n\n\t\tbool splat = false;\n\t\tbool swizzle_splat = false;\n\n\t\tif (in_type)\n\t\t{\n\t\t\tsplat = in_type->vecsize == 1 && in_type->columns == 1 && !composite && backend.use_constructor_splatting;\n\t\t\tswizzle_splat = in_type->vecsize == 1 && in_type->columns == 1 && backend.can_swizzle_scalar;\n\n\t\t\tif (ir.ids[elems[0]].get_type() == TypeConstant && !type_is_floating_point(*in_type))\n\t\t\t{\n\t\t\t\t// Cannot swizzle literal integers as a special case.\n\t\t\t\tswizzle_splat = false;\n\t\t\t}\n\t\t}\n\n\t\tif (splat || swizzle_splat)\n\t\t{\n\t\t\tuint32_t input = elems[0];\n\t\t\tfor (uint32_t i = 0; i < length; i++)\n\t\t\t{\n\t\t\t\tif (input != elems[i])\n\t\t\t\t{\n\t\t\t\t\tsplat = false;\n\t\t\t\t\tswizzle_splat = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (out_type.basetype == SPIRType::Struct && !backend.can_declare_struct_inline)\n\t\t\tforward = false;\n\t\tif (!out_type.array.empty() && !backend.can_declare_arrays_inline)\n\t\t\tforward = false;\n\t\tif (type_is_empty(out_type) && !backend.supports_empty_struct)\n\t\t\tforward = false;\n\n\t\tstring constructor_op;\n\t\tif (backend.use_initializer_list && composite)\n\t\t{\n\t\t\tbool needs_trailing_tracket = false;\n\t\t\t// Only use this path if we are building composites.\n\t\t\t// This path cannot be used for arithmetic.\n\t\t\tif (backend.use_typed_initializer_list && out_type.basetype == SPIRType::Struct && out_type.array.empty())\n\t\t\t\tconstructor_op += type_to_glsl_constructor(get<SPIRType>(result_type));\n\t\t\telse if (backend.use_typed_initializer_list && backend.array_is_value_type && !out_type.array.empty())\n\t\t\t{\n\t\t\t\t// MSL path. Array constructor is baked into type here, do not use _constructor variant.\n\t\t\t\tconstructor_op += type_to_glsl_constructor(get<SPIRType>(result_type)) + \"(\";\n\t\t\t\tneeds_trailing_tracket = true;\n\t\t\t}\n\t\t\tconstructor_op += \"{ \";\n\n\t\t\tif (type_is_empty(out_type) && !backend.supports_empty_struct)\n\t\t\t\tconstructor_op += \"0\";\n\t\t\telse if (splat)\n\t\t\t\tconstructor_op += to_unpacked_expression(elems[0]);\n\t\t\telse\n\t\t\t\tconstructor_op += build_composite_combiner(result_type, elems, length);\n\t\t\tconstructor_op += \" }\";\n\t\t\tif (needs_trailing_tracket)\n\t\t\t\tconstructor_op += \")\";\n\t\t}\n\t\telse if (swizzle_splat && !composite)\n\t\t{\n\t\t\tconstructor_op = remap_swizzle(get<SPIRType>(result_type), 1, to_unpacked_expression(elems[0]));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconstructor_op = type_to_glsl_constructor(get<SPIRType>(result_type)) + \"(\";\n\t\t\tif (type_is_empty(out_type) && !backend.supports_empty_struct)\n\t\t\t\tconstructor_op += \"0\";\n\t\t\telse if (splat)\n\t\t\t\tconstructor_op += to_unpacked_expression(elems[0]);\n\t\t\telse\n\t\t\t\tconstructor_op += build_composite_combiner(result_type, elems, length);\n\t\t\tconstructor_op += \")\";\n\t\t}\n\n\t\tif (!constructor_op.empty())\n\t\t{\n\t\t\temit_op(result_type, id, constructor_op, forward);\n\t\t\tfor (uint32_t i = 0; i < length; i++)\n\t\t\t\tinherit_expression_dependencies(id, elems[i]);\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpVectorInsertDynamic:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tuint32_t vec = ops[2];\n\t\tuint32_t comp = ops[3];\n\t\tuint32_t index = ops[4];\n\n\t\tflush_variable_declaration(vec);\n\n\t\t// Make a copy, then use access chain to store the variable.\n\t\tstatement(declare_temporary(result_type, id), to_expression(vec), \";\");\n\t\tset<SPIRExpression>(id, to_name(id), result_type, true);\n\t\tauto chain = access_chain_internal(id, &index, 1, 0, nullptr);\n\t\tstatement(chain, \" = \", to_unpacked_expression(comp), \";\");\n\t\tbreak;\n\t}\n\n\tcase OpVectorExtractDynamic:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\n\t\tauto expr = access_chain_internal(ops[2], &ops[3], 1, 0, nullptr);\n\t\temit_op(result_type, id, expr, should_forward(ops[2]));\n\t\tinherit_expression_dependencies(id, ops[2]);\n\t\tinherit_expression_dependencies(id, ops[3]);\n\t\tbreak;\n\t}\n\n\tcase OpCompositeExtract:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tlength -= 3;\n\n\t\tauto &type = get<SPIRType>(result_type);\n\n\t\t// We can only split the expression here if our expression is forwarded as a temporary.\n\t\tbool allow_base_expression = forced_temporaries.find(id) == end(forced_temporaries);\n\n\t\t// Do not allow base expression for struct members. We risk doing \"swizzle\" optimizations in this case.\n\t\tauto &composite_type = expression_type(ops[2]);\n\t\tbool composite_type_is_complex = composite_type.basetype == SPIRType::Struct || !composite_type.array.empty();\n\t\tif (composite_type_is_complex)\n\t\t\tallow_base_expression = false;\n\n\t\t// Packed expressions or physical ID mapped expressions cannot be split up.\n\t\tif (has_extended_decoration(ops[2], SPIRVCrossDecorationPhysicalTypePacked) ||\n\t\t    has_extended_decoration(ops[2], SPIRVCrossDecorationPhysicalTypeID))\n\t\t\tallow_base_expression = false;\n\n\t\t// Cannot use base expression for row-major matrix row-extraction since we need to interleave access pattern\n\t\t// into the base expression.\n\t\tif (is_non_native_row_major_matrix(ops[2]))\n\t\t\tallow_base_expression = false;\n\n\t\tAccessChainMeta meta;\n\t\tSPIRExpression *e = nullptr;\n\t\tauto *c = maybe_get<SPIRConstant>(ops[2]);\n\n\t\tif (c && !c->specialization && !composite_type_is_complex)\n\t\t{\n\t\t\tauto expr = to_extract_constant_composite_expression(result_type, *c, ops + 3, length);\n\t\t\te = &emit_op(result_type, id, expr, true, true);\n\t\t}\n\t\telse if (allow_base_expression && should_forward(ops[2]) && type.vecsize == 1 && type.columns == 1 && length == 1)\n\t\t{\n\t\t\t// Only apply this optimization if result is scalar.\n\n\t\t\t// We want to split the access chain from the base.\n\t\t\t// This is so we can later combine different CompositeExtract results\n\t\t\t// with CompositeConstruct without emitting code like\n\t\t\t//\n\t\t\t// vec3 temp = texture(...).xyz\n\t\t\t// vec4(temp.x, temp.y, temp.z, 1.0).\n\t\t\t//\n\t\t\t// when we actually wanted to emit this\n\t\t\t// vec4(texture(...).xyz, 1.0).\n\t\t\t//\n\t\t\t// Including the base will prevent this and would trigger multiple reads\n\t\t\t// from expression causing it to be forced to an actual temporary in GLSL.\n\t\t\tauto expr = access_chain_internal(ops[2], &ops[3], length,\n\t\t\t                                  ACCESS_CHAIN_INDEX_IS_LITERAL_BIT | ACCESS_CHAIN_CHAIN_ONLY_BIT |\n\t\t\t                                  ACCESS_CHAIN_FORCE_COMPOSITE_BIT, &meta);\n\t\t\te = &emit_op(result_type, id, expr, true, should_suppress_usage_tracking(ops[2]));\n\t\t\tinherit_expression_dependencies(id, ops[2]);\n\t\t\te->base_expression = ops[2];\n\n\t\t\tif (meta.relaxed_precision && backend.requires_relaxed_precision_analysis)\n\t\t\t\tset_decoration(ops[1], DecorationRelaxedPrecision);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tauto expr = access_chain_internal(ops[2], &ops[3], length,\n\t\t\t                                  ACCESS_CHAIN_INDEX_IS_LITERAL_BIT | ACCESS_CHAIN_FORCE_COMPOSITE_BIT, &meta);\n\t\t\te = &emit_op(result_type, id, expr, should_forward(ops[2]), should_suppress_usage_tracking(ops[2]));\n\t\t\tinherit_expression_dependencies(id, ops[2]);\n\t\t}\n\n\t\t// Pass through some meta information to the loaded expression.\n\t\t// We can still end up loading a buffer type to a variable, then CompositeExtract from it\n\t\t// instead of loading everything through an access chain.\n\t\te->need_transpose = meta.need_transpose;\n\t\tif (meta.storage_is_packed)\n\t\t\tset_extended_decoration(id, SPIRVCrossDecorationPhysicalTypePacked);\n\t\tif (meta.storage_physical_type != 0)\n\t\t\tset_extended_decoration(id, SPIRVCrossDecorationPhysicalTypeID, meta.storage_physical_type);\n\t\tif (meta.storage_is_invariant)\n\t\t\tset_decoration(id, DecorationInvariant);\n\n\t\tbreak;\n\t}\n\n\tcase OpCompositeInsert:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tuint32_t obj = ops[2];\n\t\tuint32_t composite = ops[3];\n\t\tconst auto *elems = &ops[4];\n\t\tlength -= 4;\n\n\t\tflush_variable_declaration(composite);\n\n\t\t// CompositeInsert requires a copy + modification, but this is very awkward code in HLL.\n\t\t// Speculate that the input composite is no longer used, and we can modify it in-place.\n\t\t// There are various scenarios where this is not possible to satisfy.\n\t\tbool can_modify_in_place = true;\n\t\tforced_temporaries.insert(id);\n\n\t\t// Cannot safely RMW PHI variables since they have no way to be invalidated,\n\t\t// forcing temporaries is not going to help.\n\t\t// This is similar for Constant and Undef inputs.\n\t\t// The only safe thing to RMW is SPIRExpression.\n\t\t// If the expression has already been used (i.e. used in a continue block), we have to keep using\n\t\t// that loop variable, since we won't be able to override the expression after the fact.\n\t\t// If the composite is hoisted, we might never be able to properly invalidate any usage\n\t\t// of that composite in a subsequent loop iteration.\n\t\tif (invalid_expressions.count(composite) ||\n\t\t    block_composite_insert_overwrite.count(composite) ||\n\t\t    hoisted_temporaries.count(id) || hoisted_temporaries.count(composite) ||\n\t\t    maybe_get<SPIRExpression>(composite) == nullptr)\n\t\t{\n\t\t\tcan_modify_in_place = false;\n\t\t}\n\t\telse if (backend.requires_relaxed_precision_analysis &&\n\t\t         has_decoration(composite, DecorationRelaxedPrecision) !=\n\t\t         has_decoration(id, DecorationRelaxedPrecision) &&\n\t\t         get<SPIRType>(result_type).basetype != SPIRType::Struct)\n\t\t{\n\t\t\t// Similarly, if precision does not match for input and output,\n\t\t\t// we cannot alias them. If we write a composite into a relaxed precision\n\t\t\t// ID, we might get a false truncation.\n\t\t\tcan_modify_in_place = false;\n\t\t}\n\n\t\tif (can_modify_in_place)\n\t\t{\n\t\t\t// Have to make sure the modified SSA value is bound to a temporary so we can modify it in-place.\n\t\t\tif (!forced_temporaries.count(composite))\n\t\t\t\tforce_temporary_and_recompile(composite);\n\n\t\t\tauto chain = access_chain_internal(composite, elems, length, ACCESS_CHAIN_INDEX_IS_LITERAL_BIT, nullptr);\n\t\t\tstatement(chain, \" = \", to_unpacked_expression(obj), \";\");\n\t\t\tset<SPIRExpression>(id, to_expression(composite), result_type, true);\n\t\t\tinvalid_expressions.insert(composite);\n\t\t\tcomposite_insert_overwritten.insert(composite);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (maybe_get<SPIRUndef>(composite) != nullptr)\n\t\t\t{\n\t\t\t\temit_uninitialized_temporary_expression(result_type, id);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Make a copy, then use access chain to store the variable.\n\t\t\t\tstatement(declare_temporary(result_type, id), to_expression(composite), \";\");\n\t\t\t\tset<SPIRExpression>(id, to_name(id), result_type, true);\n\t\t\t}\n\n\t\t\tauto chain = access_chain_internal(id, elems, length, ACCESS_CHAIN_INDEX_IS_LITERAL_BIT, nullptr);\n\t\t\tstatement(chain, \" = \", to_unpacked_expression(obj), \";\");\n\t\t}\n\n\t\tbreak;\n\t}\n\n\tcase OpCopyMemory:\n\t{\n\t\tuint32_t lhs = ops[0];\n\t\tuint32_t rhs = ops[1];\n\t\tif (lhs != rhs)\n\t\t{\n\t\t\tuint32_t &tmp_id = extra_sub_expressions[instruction.offset | EXTRA_SUB_EXPRESSION_TYPE_STREAM_OFFSET];\n\t\t\tif (!tmp_id)\n\t\t\t\ttmp_id = ir.increase_bound_by(1);\n\t\t\tuint32_t tmp_type_id = expression_type(rhs).parent_type;\n\n\t\t\tEmbeddedInstruction fake_load, fake_store;\n\t\t\tfake_load.op = OpLoad;\n\t\t\tfake_load.length = 3;\n\t\t\tfake_load.ops.push_back(tmp_type_id);\n\t\t\tfake_load.ops.push_back(tmp_id);\n\t\t\tfake_load.ops.push_back(rhs);\n\n\t\t\tfake_store.op = OpStore;\n\t\t\tfake_store.length = 2;\n\t\t\tfake_store.ops.push_back(lhs);\n\t\t\tfake_store.ops.push_back(tmp_id);\n\n\t\t\t// Load and Store do a *lot* of workarounds, and we'd like to reuse them as much as possible.\n\t\t\t// Synthesize a fake Load and Store pair for CopyMemory.\n\t\t\temit_instruction(fake_load);\n\t\t\temit_instruction(fake_store);\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpCopyLogical:\n\t{\n\t\t// This is used for copying object of different types, arrays and structs.\n\t\t// We need to unroll the copy, element-by-element.\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tuint32_t rhs = ops[2];\n\n\t\temit_uninitialized_temporary_expression(result_type, id);\n\t\temit_copy_logical_type(id, result_type, rhs, expression_type_id(rhs), {});\n\t\tbreak;\n\t}\n\n\tcase OpCopyObject:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tuint32_t rhs = ops[2];\n\t\tbool pointer = get<SPIRType>(result_type).pointer;\n\n\t\tauto *chain = maybe_get<SPIRAccessChain>(rhs);\n\t\tauto *imgsamp = maybe_get<SPIRCombinedImageSampler>(rhs);\n\t\tif (chain)\n\t\t{\n\t\t\t// Cannot lower to a SPIRExpression, just copy the object.\n\t\t\tauto &e = set<SPIRAccessChain>(id, *chain);\n\t\t\te.self = id;\n\t\t}\n\t\telse if (imgsamp)\n\t\t{\n\t\t\t// Cannot lower to a SPIRExpression, just copy the object.\n\t\t\t// GLSL does not currently use this type and will never get here, but MSL does.\n\t\t\t// Handled here instead of CompilerMSL for better integration and general handling,\n\t\t\t// and in case GLSL or other subclasses require it in the future.\n\t\t\tauto &e = set<SPIRCombinedImageSampler>(id, *imgsamp);\n\t\t\te.self = id;\n\t\t}\n\t\telse if (expression_is_lvalue(rhs) && !pointer)\n\t\t{\n\t\t\t// Need a copy.\n\t\t\t// For pointer types, we copy the pointer itself.\n\t\t\temit_op(result_type, id, to_unpacked_expression(rhs), false);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// RHS expression is immutable, so just forward it.\n\t\t\t// Copying these things really make no sense, but\n\t\t\t// seems to be allowed anyways.\n\t\t\tauto &e = emit_op(result_type, id, to_expression(rhs), true, true);\n\t\t\tif (pointer)\n\t\t\t{\n\t\t\t\tauto *var = maybe_get_backing_variable(rhs);\n\t\t\t\te.loaded_from = var ? var->self : ID(0);\n\t\t\t}\n\n\t\t\t// If we're copying an access chain, need to inherit the read expressions.\n\t\t\tauto *rhs_expr = maybe_get<SPIRExpression>(rhs);\n\t\t\tif (rhs_expr)\n\t\t\t{\n\t\t\t\te.implied_read_expressions = rhs_expr->implied_read_expressions;\n\t\t\t\te.expression_dependencies = rhs_expr->expression_dependencies;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpVectorShuffle:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tuint32_t vec0 = ops[2];\n\t\tuint32_t vec1 = ops[3];\n\t\tconst auto *elems = &ops[4];\n\t\tlength -= 4;\n\n\t\tauto &type0 = expression_type(vec0);\n\n\t\t// If we have the undefined swizzle index -1, we need to swizzle in undefined data,\n\t\t// or in our case, T(0).\n\t\tbool shuffle = false;\n\t\tfor (uint32_t i = 0; i < length; i++)\n\t\t\tif (elems[i] >= type0.vecsize || elems[i] == 0xffffffffu)\n\t\t\t\tshuffle = true;\n\n\t\t// Cannot use swizzles with packed expressions, force shuffle path.\n\t\tif (!shuffle && has_extended_decoration(vec0, SPIRVCrossDecorationPhysicalTypePacked))\n\t\t\tshuffle = true;\n\n\t\tstring expr;\n\t\tbool should_fwd, trivial_forward;\n\n\t\tif (shuffle)\n\t\t{\n\t\t\tshould_fwd = should_forward(vec0) && should_forward(vec1);\n\t\t\ttrivial_forward = should_suppress_usage_tracking(vec0) && should_suppress_usage_tracking(vec1);\n\n\t\t\t// Constructor style and shuffling from two different vectors.\n\t\t\tSmallVector<string> args;\n\t\t\tfor (uint32_t i = 0; i < length; i++)\n\t\t\t{\n\t\t\t\tif (elems[i] == 0xffffffffu)\n\t\t\t\t{\n\t\t\t\t\t// Use a constant 0 here.\n\t\t\t\t\t// We could use the first component or similar, but then we risk propagating\n\t\t\t\t\t// a value we might not need, and bog down codegen.\n\t\t\t\t\tSPIRConstant c;\n\t\t\t\t\tc.constant_type = type0.parent_type;\n\t\t\t\t\tassert(type0.parent_type != ID(0));\n\t\t\t\t\targs.push_back(constant_expression(c));\n\t\t\t\t}\n\t\t\t\telse if (elems[i] >= type0.vecsize)\n\t\t\t\t\targs.push_back(to_extract_component_expression(vec1, elems[i] - type0.vecsize));\n\t\t\t\telse\n\t\t\t\t\targs.push_back(to_extract_component_expression(vec0, elems[i]));\n\t\t\t}\n\t\t\texpr += join(type_to_glsl_constructor(get<SPIRType>(result_type)), \"(\", merge(args), \")\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tshould_fwd = should_forward(vec0);\n\t\t\ttrivial_forward = should_suppress_usage_tracking(vec0);\n\n\t\t\t// We only source from first vector, so can use swizzle.\n\t\t\t// If the vector is packed, unpack it before applying a swizzle (needed for MSL)\n\t\t\texpr += to_enclosed_unpacked_expression(vec0);\n\t\t\texpr += \".\";\n\t\t\tfor (uint32_t i = 0; i < length; i++)\n\t\t\t{\n\t\t\t\tassert(elems[i] != 0xffffffffu);\n\t\t\t\texpr += index_to_swizzle(elems[i]);\n\t\t\t}\n\n\t\t\tif (backend.swizzle_is_function && length > 1)\n\t\t\t\texpr += \"()\";\n\t\t}\n\n\t\t// A shuffle is trivial in that it doesn't actually *do* anything.\n\t\t// We inherit the forwardedness from our arguments to avoid flushing out to temporaries when it's not really needed.\n\n\t\temit_op(result_type, id, expr, should_fwd, trivial_forward);\n\n\t\tinherit_expression_dependencies(id, vec0);\n\t\tif (vec0 != vec1)\n\t\t\tinherit_expression_dependencies(id, vec1);\n\t\tbreak;\n\t}\n\n\t// ALU\n\tcase OpIsNan:\n\t\tif (!is_legacy())\n\t\t\tGLSL_UFOP(isnan);\n\t\telse\n\t\t{\n\t\t\t// Check if the number doesn't equal itself\n\t\t\tauto &type = get<SPIRType>(ops[0]);\n\t\t\tif (type.vecsize > 1)\n\t\t\t\temit_binary_func_op(ops[0], ops[1], ops[2], ops[2], \"notEqual\");\n\t\t\telse\n\t\t\t\temit_binary_op(ops[0], ops[1], ops[2], ops[2], \"!=\");\n\t\t}\n\t\tbreak;\n\n\tcase OpIsInf:\n\t\tif (!is_legacy())\n\t\t\tGLSL_UFOP(isinf);\n\t\telse\n\t\t{\n\t\t\t// inf * 2 == inf by IEEE 754 rules, note this also applies to 0.0\n\t\t\t// This is more reliable than checking if product with zero is NaN\n\t\t\tuint32_t result_type = ops[0];\n\t\t\tuint32_t result_id = ops[1];\n\t\t\tuint32_t operand = ops[2];\n\n\t\t\tauto &type = get<SPIRType>(result_type);\n\t\t\tstd::string expr;\n\t\t\tif (type.vecsize > 1)\n\t\t\t{\n\t\t\t\texpr = type_to_glsl_constructor(type);\n\t\t\t\texpr += '(';\n\t\t\t\tfor (uint32_t i = 0; i < type.vecsize; i++)\n\t\t\t\t{\n\t\t\t\t\tauto comp = to_extract_component_expression(operand, i);\n\t\t\t\t\texpr += join(comp, \" != 0.0 && 2.0 * \", comp, \" == \", comp);\n\n\t\t\t\t\tif (i + 1 < type.vecsize)\n\t\t\t\t\t\texpr += \", \";\n\t\t\t\t}\n\t\t\t\texpr += ')';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Register an extra read to force writing out a temporary\n\t\t\t\tauto oper = to_enclosed_expression(operand);\n\t\t\t\ttrack_expression_read(operand);\n\t\t\t\texpr += join(oper, \" != 0.0 && 2.0 * \", oper, \" == \", oper);\n\t\t\t}\n\t\t\temit_op(result_type, result_id, expr, should_forward(operand));\n\n\t\t\tinherit_expression_dependencies(result_id, operand);\n\t\t}\n\t\tbreak;\n\n\tcase OpSNegate:\n\t\tif (implicit_integer_promotion || expression_type_id(ops[2]) != ops[0])\n\t\t\tGLSL_UOP_CAST(-);\n\t\telse\n\t\t\tGLSL_UOP(-);\n\t\tbreak;\n\n\tcase OpFNegate:\n\t\tGLSL_UOP(-);\n\t\tbreak;\n\n\tcase OpIAdd:\n\t{\n\t\t// For simple arith ops, prefer the output type if there's a mismatch to avoid extra bitcasts.\n\t\tauto type = get<SPIRType>(ops[0]).basetype;\n\t\tGLSL_BOP_CAST(+, type);\n\t\tbreak;\n\t}\n\n\tcase OpFAdd:\n\t\tGLSL_BOP(+);\n\t\tbreak;\n\n\tcase OpISub:\n\t{\n\t\tauto type = get<SPIRType>(ops[0]).basetype;\n\t\tGLSL_BOP_CAST(-, type);\n\t\tbreak;\n\t}\n\n\tcase OpFSub:\n\t\tGLSL_BOP(-);\n\t\tbreak;\n\n\tcase OpIMul:\n\t{\n\t\tauto type = get<SPIRType>(ops[0]).basetype;\n\t\tGLSL_BOP_CAST(*, type);\n\t\tbreak;\n\t}\n\n\tcase OpVectorTimesMatrix:\n\tcase OpMatrixTimesVector:\n\t{\n\t\t// If the matrix needs transpose, just flip the multiply order.\n\t\tauto *e = maybe_get<SPIRExpression>(ops[opcode == OpMatrixTimesVector ? 2 : 3]);\n\t\tif (e && e->need_transpose)\n\t\t{\n\t\t\te->need_transpose = false;\n\t\t\tstring expr;\n\n\t\t\tif (opcode == OpMatrixTimesVector)\n\t\t\t\texpr = join(to_enclosed_unpacked_expression(ops[3]), \" * \",\n\t\t\t\t            enclose_expression(to_unpacked_row_major_matrix_expression(ops[2])));\n\t\t\telse\n\t\t\t\texpr = join(enclose_expression(to_unpacked_row_major_matrix_expression(ops[3])), \" * \",\n\t\t\t\t            to_enclosed_unpacked_expression(ops[2]));\n\n\t\t\tbool forward = should_forward(ops[2]) && should_forward(ops[3]);\n\t\t\temit_op(ops[0], ops[1], expr, forward);\n\t\t\te->need_transpose = true;\n\t\t\tinherit_expression_dependencies(ops[1], ops[2]);\n\t\t\tinherit_expression_dependencies(ops[1], ops[3]);\n\t\t}\n\t\telse\n\t\t\tGLSL_BOP(*);\n\t\tbreak;\n\t}\n\n\tcase OpMatrixTimesMatrix:\n\t{\n\t\tauto *a = maybe_get<SPIRExpression>(ops[2]);\n\t\tauto *b = maybe_get<SPIRExpression>(ops[3]);\n\n\t\t// If both matrices need transpose, we can multiply in flipped order and tag the expression as transposed.\n\t\t// a^T * b^T = (b * a)^T.\n\t\tif (a && b && a->need_transpose && b->need_transpose)\n\t\t{\n\t\t\ta->need_transpose = false;\n\t\t\tb->need_transpose = false;\n\t\t\tauto expr = join(enclose_expression(to_unpacked_row_major_matrix_expression(ops[3])), \" * \",\n\t\t\t                 enclose_expression(to_unpacked_row_major_matrix_expression(ops[2])));\n\t\t\tbool forward = should_forward(ops[2]) && should_forward(ops[3]);\n\t\t\tauto &e = emit_op(ops[0], ops[1], expr, forward);\n\t\t\te.need_transpose = true;\n\t\t\ta->need_transpose = true;\n\t\t\tb->need_transpose = true;\n\t\t\tinherit_expression_dependencies(ops[1], ops[2]);\n\t\t\tinherit_expression_dependencies(ops[1], ops[3]);\n\t\t}\n\t\telse\n\t\t\tGLSL_BOP(*);\n\n\t\tbreak;\n\t}\n\n\tcase OpMatrixTimesScalar:\n\t{\n\t\tauto *a = maybe_get<SPIRExpression>(ops[2]);\n\n\t\t// If the matrix need transpose, just mark the result as needing so.\n\t\tif (a && a->need_transpose)\n\t\t{\n\t\t\ta->need_transpose = false;\n\t\t\tauto expr = join(enclose_expression(to_unpacked_row_major_matrix_expression(ops[2])), \" * \",\n\t\t\t                 to_enclosed_unpacked_expression(ops[3]));\n\t\t\tbool forward = should_forward(ops[2]) && should_forward(ops[3]);\n\t\t\tauto &e = emit_op(ops[0], ops[1], expr, forward);\n\t\t\te.need_transpose = true;\n\t\t\ta->need_transpose = true;\n\t\t\tinherit_expression_dependencies(ops[1], ops[2]);\n\t\t\tinherit_expression_dependencies(ops[1], ops[3]);\n\t\t}\n\t\telse\n\t\t\tGLSL_BOP(*);\n\t\tbreak;\n\t}\n\n\tcase OpFMul:\n\tcase OpVectorTimesScalar:\n\t\tGLSL_BOP(*);\n\t\tbreak;\n\n\tcase OpOuterProduct:\n\t\tif (options.version < 120) // Matches GLSL 1.10 / ESSL 1.00\n\t\t{\n\t\t\tuint32_t result_type = ops[0];\n\t\t\tuint32_t id = ops[1];\n\t\t\tuint32_t a = ops[2];\n\t\t\tuint32_t b = ops[3];\n\n\t\t\tauto &type = get<SPIRType>(result_type);\n\t\t\tstring expr = type_to_glsl_constructor(type);\n\t\t\texpr += \"(\";\n\t\t\tfor (uint32_t col = 0; col < type.columns; col++)\n\t\t\t{\n\t\t\t\texpr += to_enclosed_expression(a);\n\t\t\t\texpr += \" * \";\n\t\t\t\texpr += to_extract_component_expression(b, col);\n\t\t\t\tif (col + 1 < type.columns)\n\t\t\t\t\texpr += \", \";\n\t\t\t}\n\t\t\texpr += \")\";\n\t\t\temit_op(result_type, id, expr, should_forward(a) && should_forward(b));\n\t\t\tinherit_expression_dependencies(id, a);\n\t\t\tinherit_expression_dependencies(id, b);\n\t\t}\n\t\telse\n\t\t\tGLSL_BFOP(outerProduct);\n\t\tbreak;\n\n\tcase OpDot:\n\t\tGLSL_BFOP(dot);\n\t\tbreak;\n\n\tcase OpTranspose:\n\t\tif (options.version < 120) // Matches GLSL 1.10 / ESSL 1.00\n\t\t{\n\t\t\t// transpose() is not available, so instead, flip need_transpose,\n\t\t\t// which can later be turned into an emulated transpose op by\n\t\t\t// convert_row_major_matrix(), if necessary.\n\t\t\tuint32_t result_type = ops[0];\n\t\t\tuint32_t result_id = ops[1];\n\t\t\tuint32_t input = ops[2];\n\n\t\t\t// Force need_transpose to false temporarily to prevent\n\t\t\t// to_expression() from doing the transpose.\n\t\t\tbool need_transpose = false;\n\t\t\tauto *input_e = maybe_get<SPIRExpression>(input);\n\t\t\tif (input_e)\n\t\t\t\tswap(need_transpose, input_e->need_transpose);\n\n\t\t\tbool forward = should_forward(input);\n\t\t\tauto &e = emit_op(result_type, result_id, to_expression(input), forward);\n\t\t\te.need_transpose = !need_transpose;\n\n\t\t\t// Restore the old need_transpose flag.\n\t\t\tif (input_e)\n\t\t\t\tinput_e->need_transpose = need_transpose;\n\t\t}\n\t\telse\n\t\t\tGLSL_UFOP(transpose);\n\t\tbreak;\n\n\tcase OpSRem:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t result_id = ops[1];\n\t\tuint32_t op0 = ops[2];\n\t\tuint32_t op1 = ops[3];\n\n\t\t// Needs special handling.\n\t\tbool forward = should_forward(op0) && should_forward(op1);\n\t\tauto expr = join(to_enclosed_expression(op0), \" - \", to_enclosed_expression(op1), \" * \", \"(\",\n\t\t                 to_enclosed_expression(op0), \" / \", to_enclosed_expression(op1), \")\");\n\n\t\tif (implicit_integer_promotion)\n\t\t\texpr = join(type_to_glsl(get<SPIRType>(result_type)), '(', expr, ')');\n\n\t\temit_op(result_type, result_id, expr, forward);\n\t\tinherit_expression_dependencies(result_id, op0);\n\t\tinherit_expression_dependencies(result_id, op1);\n\t\tbreak;\n\t}\n\n\tcase OpSDiv:\n\t\tGLSL_BOP_CAST(/, int_type);\n\t\tbreak;\n\n\tcase OpUDiv:\n\t\tGLSL_BOP_CAST(/, uint_type);\n\t\tbreak;\n\n\tcase OpIAddCarry:\n\tcase OpISubBorrow:\n\t{\n\t\tif (options.es && options.version < 310)\n\t\t\tSPIRV_CROSS_THROW(\"Extended arithmetic is only available from ESSL 310.\");\n\t\telse if (!options.es && options.version < 400)\n\t\t\tSPIRV_CROSS_THROW(\"Extended arithmetic is only available from GLSL 400.\");\n\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t result_id = ops[1];\n\t\tuint32_t op0 = ops[2];\n\t\tuint32_t op1 = ops[3];\n\t\tauto &type = get<SPIRType>(result_type);\n\t\temit_uninitialized_temporary_expression(result_type, result_id);\n\t\tconst char *op = opcode == OpIAddCarry ? \"uaddCarry\" : \"usubBorrow\";\n\n\t\tstatement(to_expression(result_id), \".\", to_member_name(type, 0), \" = \", op, \"(\", to_expression(op0), \", \",\n\t\t          to_expression(op1), \", \", to_expression(result_id), \".\", to_member_name(type, 1), \");\");\n\t\tbreak;\n\t}\n\n\tcase OpUMulExtended:\n\tcase OpSMulExtended:\n\t{\n\t\tif (options.es && options.version < 310)\n\t\t\tSPIRV_CROSS_THROW(\"Extended arithmetic is only available from ESSL 310.\");\n\t\telse if (!options.es && options.version < 400)\n\t\t\tSPIRV_CROSS_THROW(\"Extended arithmetic is only available from GLSL 4000.\");\n\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t result_id = ops[1];\n\t\tuint32_t op0 = ops[2];\n\t\tuint32_t op1 = ops[3];\n\t\tauto &type = get<SPIRType>(result_type);\n\t\temit_uninitialized_temporary_expression(result_type, result_id);\n\t\tconst char *op = opcode == OpUMulExtended ? \"umulExtended\" : \"imulExtended\";\n\n\t\tstatement(op, \"(\", to_expression(op0), \", \", to_expression(op1), \", \", to_expression(result_id), \".\",\n\t\t          to_member_name(type, 1), \", \", to_expression(result_id), \".\", to_member_name(type, 0), \");\");\n\t\tbreak;\n\t}\n\n\tcase OpFDiv:\n\t\tGLSL_BOP(/);\n\t\tbreak;\n\n\tcase OpShiftRightLogical:\n\t\tGLSL_BOP_CAST(>>, uint_type);\n\t\tbreak;\n\n\tcase OpShiftRightArithmetic:\n\t\tGLSL_BOP_CAST(>>, int_type);\n\t\tbreak;\n\n\tcase OpShiftLeftLogical:\n\t{\n\t\tauto type = get<SPIRType>(ops[0]).basetype;\n\t\tGLSL_BOP_CAST(<<, type);\n\t\tbreak;\n\t}\n\n\tcase OpBitwiseOr:\n\t{\n\t\tauto type = get<SPIRType>(ops[0]).basetype;\n\t\tGLSL_BOP_CAST(|, type);\n\t\tbreak;\n\t}\n\n\tcase OpBitwiseXor:\n\t{\n\t\tauto type = get<SPIRType>(ops[0]).basetype;\n\t\tGLSL_BOP_CAST(^, type);\n\t\tbreak;\n\t}\n\n\tcase OpBitwiseAnd:\n\t{\n\t\tauto type = get<SPIRType>(ops[0]).basetype;\n\t\tGLSL_BOP_CAST(&, type);\n\t\tbreak;\n\t}\n\n\tcase OpNot:\n\t\tif (implicit_integer_promotion || expression_type_id(ops[2]) != ops[0])\n\t\t\tGLSL_UOP_CAST(~);\n\t\telse\n\t\t\tGLSL_UOP(~);\n\t\tbreak;\n\n\tcase OpUMod:\n\t\tGLSL_BOP_CAST(%, uint_type);\n\t\tbreak;\n\n\tcase OpSMod:\n\t\tGLSL_BOP_CAST(%, int_type);\n\t\tbreak;\n\n\tcase OpFMod:\n\t\tGLSL_BFOP(mod);\n\t\tbreak;\n\n\tcase OpFRem:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t result_id = ops[1];\n\t\tuint32_t op0 = ops[2];\n\t\tuint32_t op1 = ops[3];\n\n\t\t// Needs special handling.\n\t\tbool forward = should_forward(op0) && should_forward(op1);\n\t\tstd::string expr;\n\t\tif (!is_legacy())\n\t\t{\n\t\t\texpr = join(to_enclosed_expression(op0), \" - \", to_enclosed_expression(op1), \" * \", \"trunc(\",\n\t\t\t            to_enclosed_expression(op0), \" / \", to_enclosed_expression(op1), \")\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Legacy GLSL has no trunc, emulate by casting to int and back\n\t\t\tauto &op0_type = expression_type(op0);\n\t\t\tauto via_type = op0_type;\n\t\t\tvia_type.basetype = SPIRType::Int;\n\t\t\texpr = join(to_enclosed_expression(op0), \" - \", to_enclosed_expression(op1), \" * \",\n\t\t\t            type_to_glsl(op0_type), \"(\", type_to_glsl(via_type),  \"(\",\n\t\t\t            to_enclosed_expression(op0), \" / \", to_enclosed_expression(op1), \"))\");\n\t\t}\n\n\t\temit_op(result_type, result_id, expr, forward);\n\t\tinherit_expression_dependencies(result_id, op0);\n\t\tinherit_expression_dependencies(result_id, op1);\n\t\tbreak;\n\t}\n\n\t// Relational\n\tcase OpAny:\n\t\tGLSL_UFOP(any);\n\t\tbreak;\n\n\tcase OpAll:\n\t\tGLSL_UFOP(all);\n\t\tbreak;\n\n\tcase OpSelect:\n\t\temit_mix_op(ops[0], ops[1], ops[4], ops[3], ops[2]);\n\t\tbreak;\n\n\tcase OpLogicalOr:\n\t{\n\t\t// No vector variant in GLSL for logical OR.\n\t\tauto result_type = ops[0];\n\t\tauto id = ops[1];\n\t\tauto &type = get<SPIRType>(result_type);\n\n\t\tif (type.vecsize > 1)\n\t\t\temit_unrolled_binary_op(result_type, id, ops[2], ops[3], \"||\", false, SPIRType::Unknown);\n\t\telse\n\t\t\tGLSL_BOP(||);\n\t\tbreak;\n\t}\n\n\tcase OpLogicalAnd:\n\t{\n\t\t// No vector variant in GLSL for logical AND.\n\t\tauto result_type = ops[0];\n\t\tauto id = ops[1];\n\t\tauto &type = get<SPIRType>(result_type);\n\n\t\tif (type.vecsize > 1)\n\t\t\temit_unrolled_binary_op(result_type, id, ops[2], ops[3], \"&&\", false, SPIRType::Unknown);\n\t\telse\n\t\t\tGLSL_BOP(&&);\n\t\tbreak;\n\t}\n\n\tcase OpLogicalNot:\n\t{\n\t\tauto &type = get<SPIRType>(ops[0]);\n\t\tif (type.vecsize > 1)\n\t\t\tGLSL_UFOP(not );\n\t\telse\n\t\t\tGLSL_UOP(!);\n\t\tbreak;\n\t}\n\n\tcase OpIEqual:\n\t{\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\tGLSL_BFOP_CAST(equal, int_type);\n\t\telse\n\t\t\tGLSL_BOP_CAST(==, int_type);\n\t\tbreak;\n\t}\n\n\tcase OpLogicalEqual:\n\tcase OpFOrdEqual:\n\t{\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\tGLSL_BFOP(equal);\n\t\telse\n\t\t\tGLSL_BOP(==);\n\t\tbreak;\n\t}\n\n\tcase OpINotEqual:\n\t{\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\tGLSL_BFOP_CAST(notEqual, int_type);\n\t\telse\n\t\t\tGLSL_BOP_CAST(!=, int_type);\n\t\tbreak;\n\t}\n\n\tcase OpLogicalNotEqual:\n\tcase OpFOrdNotEqual:\n\tcase OpFUnordNotEqual:\n\t{\n\t\t// GLSL is fuzzy on what to do with ordered vs unordered not equal.\n\t\t// glslang started emitting UnorderedNotEqual some time ago to harmonize with IEEE,\n\t\t// but this means we have no easy way of implementing ordered not equal.\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\tGLSL_BFOP(notEqual);\n\t\telse\n\t\t\tGLSL_BOP(!=);\n\t\tbreak;\n\t}\n\n\tcase OpUGreaterThan:\n\tcase OpSGreaterThan:\n\t{\n\t\tauto type = opcode == OpUGreaterThan ? uint_type : int_type;\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\tGLSL_BFOP_CAST(greaterThan, type);\n\t\telse\n\t\t\tGLSL_BOP_CAST(>, type);\n\t\tbreak;\n\t}\n\n\tcase OpFOrdGreaterThan:\n\t{\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\tGLSL_BFOP(greaterThan);\n\t\telse\n\t\t\tGLSL_BOP(>);\n\t\tbreak;\n\t}\n\n\tcase OpUGreaterThanEqual:\n\tcase OpSGreaterThanEqual:\n\t{\n\t\tauto type = opcode == OpUGreaterThanEqual ? uint_type : int_type;\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\tGLSL_BFOP_CAST(greaterThanEqual, type);\n\t\telse\n\t\t\tGLSL_BOP_CAST(>=, type);\n\t\tbreak;\n\t}\n\n\tcase OpFOrdGreaterThanEqual:\n\t{\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\tGLSL_BFOP(greaterThanEqual);\n\t\telse\n\t\t\tGLSL_BOP(>=);\n\t\tbreak;\n\t}\n\n\tcase OpULessThan:\n\tcase OpSLessThan:\n\t{\n\t\tauto type = opcode == OpULessThan ? uint_type : int_type;\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\tGLSL_BFOP_CAST(lessThan, type);\n\t\telse\n\t\t\tGLSL_BOP_CAST(<, type);\n\t\tbreak;\n\t}\n\n\tcase OpFOrdLessThan:\n\t{\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\tGLSL_BFOP(lessThan);\n\t\telse\n\t\t\tGLSL_BOP(<);\n\t\tbreak;\n\t}\n\n\tcase OpULessThanEqual:\n\tcase OpSLessThanEqual:\n\t{\n\t\tauto type = opcode == OpULessThanEqual ? uint_type : int_type;\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\tGLSL_BFOP_CAST(lessThanEqual, type);\n\t\telse\n\t\t\tGLSL_BOP_CAST(<=, type);\n\t\tbreak;\n\t}\n\n\tcase OpFOrdLessThanEqual:\n\t{\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\tGLSL_BFOP(lessThanEqual);\n\t\telse\n\t\t\tGLSL_BOP(<=);\n\t\tbreak;\n\t}\n\n\t// Conversion\n\tcase OpSConvert:\n\tcase OpConvertSToF:\n\tcase OpUConvert:\n\tcase OpConvertUToF:\n\t{\n\t\tauto input_type = opcode == OpSConvert || opcode == OpConvertSToF ? int_type : uint_type;\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\n\t\tauto &type = get<SPIRType>(result_type);\n\t\tauto &arg_type = expression_type(ops[2]);\n\t\tauto func = type_to_glsl_constructor(type);\n\n\t\tif (arg_type.width < type.width || type_is_floating_point(type))\n\t\t\temit_unary_func_op_cast(result_type, id, ops[2], func.c_str(), input_type, type.basetype);\n\t\telse\n\t\t\temit_unary_func_op(result_type, id, ops[2], func.c_str());\n\t\tbreak;\n\t}\n\n\tcase OpConvertFToU:\n\tcase OpConvertFToS:\n\t{\n\t\t// Cast to expected arithmetic type, then potentially bitcast away to desired signedness.\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tauto &type = get<SPIRType>(result_type);\n\t\tauto expected_type = type;\n\t\tauto &float_type = expression_type(ops[2]);\n\t\texpected_type.basetype =\n\t\t    opcode == OpConvertFToS ? to_signed_basetype(type.width) : to_unsigned_basetype(type.width);\n\n\t\tauto func = type_to_glsl_constructor(expected_type);\n\t\temit_unary_func_op_cast(result_type, id, ops[2], func.c_str(), float_type.basetype, expected_type.basetype);\n\t\tbreak;\n\t}\n\n\tcase OpFConvert:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\n\t\tauto func = type_to_glsl_constructor(get<SPIRType>(result_type));\n\t\temit_unary_func_op(result_type, id, ops[2], func.c_str());\n\t\tbreak;\n\t}\n\n\tcase OpBitcast:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tuint32_t arg = ops[2];\n\n\t\tif (!emit_complex_bitcast(result_type, id, arg))\n\t\t{\n\t\t\tauto op = bitcast_glsl_op(get<SPIRType>(result_type), expression_type(arg));\n\t\t\temit_unary_func_op(result_type, id, arg, op.c_str());\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpQuantizeToF16:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tuint32_t arg = ops[2];\n\n\t\tstring op;\n\t\tauto &type = get<SPIRType>(result_type);\n\n\t\tswitch (type.vecsize)\n\t\t{\n\t\tcase 1:\n\t\t\top = join(\"unpackHalf2x16(packHalf2x16(vec2(\", to_expression(arg), \"))).x\");\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\top = join(\"unpackHalf2x16(packHalf2x16(\", to_expression(arg), \"))\");\n\t\t\tbreak;\n\t\tcase 3:\n\t\t{\n\t\t\tauto op0 = join(\"unpackHalf2x16(packHalf2x16(\", to_expression(arg), \".xy))\");\n\t\t\tauto op1 = join(\"unpackHalf2x16(packHalf2x16(\", to_expression(arg), \".zz)).x\");\n\t\t\top = join(\"vec3(\", op0, \", \", op1, \")\");\n\t\t\tbreak;\n\t\t}\n\t\tcase 4:\n\t\t{\n\t\t\tauto op0 = join(\"unpackHalf2x16(packHalf2x16(\", to_expression(arg), \".xy))\");\n\t\t\tauto op1 = join(\"unpackHalf2x16(packHalf2x16(\", to_expression(arg), \".zw))\");\n\t\t\top = join(\"vec4(\", op0, \", \", op1, \")\");\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tSPIRV_CROSS_THROW(\"Illegal argument to OpQuantizeToF16.\");\n\t\t}\n\n\t\temit_op(result_type, id, op, should_forward(arg));\n\t\tinherit_expression_dependencies(id, arg);\n\t\tbreak;\n\t}\n\n\t// Derivatives\n\tcase OpDPdx:\n\t\tGLSL_UFOP(dFdx);\n\t\tif (is_legacy_es())\n\t\t\trequire_extension_internal(\"GL_OES_standard_derivatives\");\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\n\tcase OpDPdy:\n\t\tGLSL_UFOP(dFdy);\n\t\tif (is_legacy_es())\n\t\t\trequire_extension_internal(\"GL_OES_standard_derivatives\");\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\n\tcase OpDPdxFine:\n\t\tGLSL_UFOP(dFdxFine);\n\t\tif (options.es)\n\t\t{\n\t\t\tSPIRV_CROSS_THROW(\"GL_ARB_derivative_control is unavailable in OpenGL ES.\");\n\t\t}\n\t\tif (options.version < 450)\n\t\t\trequire_extension_internal(\"GL_ARB_derivative_control\");\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\n\tcase OpDPdyFine:\n\t\tGLSL_UFOP(dFdyFine);\n\t\tif (options.es)\n\t\t{\n\t\t\tSPIRV_CROSS_THROW(\"GL_ARB_derivative_control is unavailable in OpenGL ES.\");\n\t\t}\n\t\tif (options.version < 450)\n\t\t\trequire_extension_internal(\"GL_ARB_derivative_control\");\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\n\tcase OpDPdxCoarse:\n\t\tif (options.es)\n\t\t{\n\t\t\tSPIRV_CROSS_THROW(\"GL_ARB_derivative_control is unavailable in OpenGL ES.\");\n\t\t}\n\t\tGLSL_UFOP(dFdxCoarse);\n\t\tif (options.version < 450)\n\t\t\trequire_extension_internal(\"GL_ARB_derivative_control\");\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\n\tcase OpDPdyCoarse:\n\t\tGLSL_UFOP(dFdyCoarse);\n\t\tif (options.es)\n\t\t{\n\t\t\tSPIRV_CROSS_THROW(\"GL_ARB_derivative_control is unavailable in OpenGL ES.\");\n\t\t}\n\t\tif (options.version < 450)\n\t\t\trequire_extension_internal(\"GL_ARB_derivative_control\");\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\n\tcase OpFwidth:\n\t\tGLSL_UFOP(fwidth);\n\t\tif (is_legacy_es())\n\t\t\trequire_extension_internal(\"GL_OES_standard_derivatives\");\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\n\tcase OpFwidthCoarse:\n\t\tGLSL_UFOP(fwidthCoarse);\n\t\tif (options.es)\n\t\t{\n\t\t\tSPIRV_CROSS_THROW(\"GL_ARB_derivative_control is unavailable in OpenGL ES.\");\n\t\t}\n\t\tif (options.version < 450)\n\t\t\trequire_extension_internal(\"GL_ARB_derivative_control\");\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\n\tcase OpFwidthFine:\n\t\tGLSL_UFOP(fwidthFine);\n\t\tif (options.es)\n\t\t{\n\t\t\tSPIRV_CROSS_THROW(\"GL_ARB_derivative_control is unavailable in OpenGL ES.\");\n\t\t}\n\t\tif (options.version < 450)\n\t\t\trequire_extension_internal(\"GL_ARB_derivative_control\");\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\n\t// Bitfield\n\tcase OpBitFieldInsert:\n\t{\n\t\temit_bitfield_insert_op(ops[0], ops[1], ops[2], ops[3], ops[4], ops[5], \"bitfieldInsert\", SPIRType::Int);\n\t\tbreak;\n\t}\n\n\tcase OpBitFieldSExtract:\n\t{\n\t\temit_trinary_func_op_bitextract(ops[0], ops[1], ops[2], ops[3], ops[4], \"bitfieldExtract\", int_type, int_type,\n\t\t                                SPIRType::Int, SPIRType::Int);\n\t\tbreak;\n\t}\n\n\tcase OpBitFieldUExtract:\n\t{\n\t\temit_trinary_func_op_bitextract(ops[0], ops[1], ops[2], ops[3], ops[4], \"bitfieldExtract\", uint_type, uint_type,\n\t\t                                SPIRType::Int, SPIRType::Int);\n\t\tbreak;\n\t}\n\n\tcase OpBitReverse:\n\t\t// BitReverse does not have issues with sign since result type must match input type.\n\t\tGLSL_UFOP(bitfieldReverse);\n\t\tbreak;\n\n\tcase OpBitCount:\n\t{\n\t\tauto basetype = expression_type(ops[2]).basetype;\n\t\temit_unary_func_op_cast(ops[0], ops[1], ops[2], \"bitCount\", basetype, int_type);\n\t\tbreak;\n\t}\n\n\t// Atomics\n\tcase OpAtomicExchange:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tuint32_t ptr = ops[2];\n\t\t// Ignore semantics for now, probably only relevant to CL.\n\t\tuint32_t val = ops[5];\n\t\tconst char *op = check_atomic_image(ptr) ? \"imageAtomicExchange\" : \"atomicExchange\";\n\n\t\temit_atomic_func_op(result_type, id, ptr, val, op);\n\t\tbreak;\n\t}\n\n\tcase OpAtomicCompareExchange:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tuint32_t ptr = ops[2];\n\t\tuint32_t val = ops[6];\n\t\tuint32_t comp = ops[7];\n\t\tconst char *op = check_atomic_image(ptr) ? \"imageAtomicCompSwap\" : \"atomicCompSwap\";\n\n\t\temit_atomic_func_op(result_type, id, ptr, comp, val, op);\n\t\tbreak;\n\t}\n\n\tcase OpAtomicLoad:\n\t{\n\t\t// In plain GLSL, we have no atomic loads, so emulate this by fetch adding by 0 and hope compiler figures it out.\n\t\t// Alternatively, we could rely on KHR_memory_model, but that's not very helpful for GL.\n\t\tauto &type = expression_type(ops[2]);\n\t\tforced_temporaries.insert(ops[1]);\n\t\tbool atomic_image = check_atomic_image(ops[2]);\n\t\tbool unsigned_type = (type.basetype == SPIRType::UInt) ||\n\t\t                     (atomic_image && get<SPIRType>(type.image.type).basetype == SPIRType::UInt);\n\t\tconst char *op = atomic_image ? \"imageAtomicAdd\" : \"atomicAdd\";\n\t\tconst char *increment = unsigned_type ? \"0u\" : \"0\";\n\t\temit_op(ops[0], ops[1],\n\t\t        join(op, \"(\",\n\t\t             to_non_uniform_aware_expression(ops[2]), \", \", increment, \")\"), false);\n\t\tflush_all_atomic_capable_variables();\n\t\tbreak;\n\t}\n\n\tcase OpAtomicStore:\n\t{\n\t\t// In plain GLSL, we have no atomic stores, so emulate this with an atomic exchange where we don't consume the result.\n\t\t// Alternatively, we could rely on KHR_memory_model, but that's not very helpful for GL.\n\t\tuint32_t ptr = ops[0];\n\t\t// Ignore semantics for now, probably only relevant to CL.\n\t\tuint32_t val = ops[3];\n\t\tconst char *op = check_atomic_image(ptr) ? \"imageAtomicExchange\" : \"atomicExchange\";\n\t\tstatement(op, \"(\", to_non_uniform_aware_expression(ptr), \", \", to_expression(val), \");\");\n\t\tflush_all_atomic_capable_variables();\n\t\tbreak;\n\t}\n\n\tcase OpAtomicIIncrement:\n\tcase OpAtomicIDecrement:\n\t{\n\t\tforced_temporaries.insert(ops[1]);\n\t\tauto &type = expression_type(ops[2]);\n\t\tif (type.storage == StorageClassAtomicCounter)\n\t\t{\n\t\t\t// Legacy GLSL stuff, not sure if this is relevant to support.\n\t\t\tif (opcode == OpAtomicIIncrement)\n\t\t\t\tGLSL_UFOP(atomicCounterIncrement);\n\t\t\telse\n\t\t\t\tGLSL_UFOP(atomicCounterDecrement);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbool atomic_image = check_atomic_image(ops[2]);\n\t\t\tbool unsigned_type = (type.basetype == SPIRType::UInt) ||\n\t\t\t                     (atomic_image && get<SPIRType>(type.image.type).basetype == SPIRType::UInt);\n\t\t\tconst char *op = atomic_image ? \"imageAtomicAdd\" : \"atomicAdd\";\n\n\t\t\tconst char *increment = nullptr;\n\t\t\tif (opcode == OpAtomicIIncrement && unsigned_type)\n\t\t\t\tincrement = \"1u\";\n\t\t\telse if (opcode == OpAtomicIIncrement)\n\t\t\t\tincrement = \"1\";\n\t\t\telse if (unsigned_type)\n\t\t\t\tincrement = \"uint(-1)\";\n\t\t\telse\n\t\t\t\tincrement = \"-1\";\n\n\t\t\temit_op(ops[0], ops[1],\n\t\t\t        join(op, \"(\", to_non_uniform_aware_expression(ops[2]), \", \", increment, \")\"), false);\n\t\t}\n\n\t\tflush_all_atomic_capable_variables();\n\t\tbreak;\n\t}\n\n\tcase OpAtomicIAdd:\n\tcase OpAtomicFAddEXT:\n\t{\n\t\tconst char *op = check_atomic_image(ops[2]) ? \"imageAtomicAdd\" : \"atomicAdd\";\n\t\temit_atomic_func_op(ops[0], ops[1], ops[2], ops[5], op);\n\t\tbreak;\n\t}\n\n\tcase OpAtomicISub:\n\t{\n\t\tconst char *op = check_atomic_image(ops[2]) ? \"imageAtomicAdd\" : \"atomicAdd\";\n\t\tforced_temporaries.insert(ops[1]);\n\t\tauto expr = join(op, \"(\", to_non_uniform_aware_expression(ops[2]), \", -\", to_enclosed_expression(ops[5]), \")\");\n\t\temit_op(ops[0], ops[1], expr, should_forward(ops[2]) && should_forward(ops[5]));\n\t\tflush_all_atomic_capable_variables();\n\t\tbreak;\n\t}\n\n\tcase OpAtomicSMin:\n\tcase OpAtomicUMin:\n\t{\n\t\tconst char *op = check_atomic_image(ops[2]) ? \"imageAtomicMin\" : \"atomicMin\";\n\t\temit_atomic_func_op(ops[0], ops[1], ops[2], ops[5], op);\n\t\tbreak;\n\t}\n\n\tcase OpAtomicSMax:\n\tcase OpAtomicUMax:\n\t{\n\t\tconst char *op = check_atomic_image(ops[2]) ? \"imageAtomicMax\" : \"atomicMax\";\n\t\temit_atomic_func_op(ops[0], ops[1], ops[2], ops[5], op);\n\t\tbreak;\n\t}\n\n\tcase OpAtomicAnd:\n\t{\n\t\tconst char *op = check_atomic_image(ops[2]) ? \"imageAtomicAnd\" : \"atomicAnd\";\n\t\temit_atomic_func_op(ops[0], ops[1], ops[2], ops[5], op);\n\t\tbreak;\n\t}\n\n\tcase OpAtomicOr:\n\t{\n\t\tconst char *op = check_atomic_image(ops[2]) ? \"imageAtomicOr\" : \"atomicOr\";\n\t\temit_atomic_func_op(ops[0], ops[1], ops[2], ops[5], op);\n\t\tbreak;\n\t}\n\n\tcase OpAtomicXor:\n\t{\n\t\tconst char *op = check_atomic_image(ops[2]) ? \"imageAtomicXor\" : \"atomicXor\";\n\t\temit_atomic_func_op(ops[0], ops[1], ops[2], ops[5], op);\n\t\tbreak;\n\t}\n\n\t// Geometry shaders\n\tcase OpEmitVertex:\n\t\tstatement(\"EmitVertex();\");\n\t\tbreak;\n\n\tcase OpEndPrimitive:\n\t\tstatement(\"EndPrimitive();\");\n\t\tbreak;\n\n\tcase OpEmitStreamVertex:\n\t{\n\t\tif (options.es)\n\t\t\tSPIRV_CROSS_THROW(\"Multi-stream geometry shaders not supported in ES.\");\n\t\telse if (!options.es && options.version < 400)\n\t\t\tSPIRV_CROSS_THROW(\"Multi-stream geometry shaders only supported in GLSL 400.\");\n\n\t\tauto stream_expr = to_expression(ops[0]);\n\t\tif (expression_type(ops[0]).basetype != SPIRType::Int)\n\t\t\tstream_expr = join(\"int(\", stream_expr, \")\");\n\t\tstatement(\"EmitStreamVertex(\", stream_expr, \");\");\n\t\tbreak;\n\t}\n\n\tcase OpEndStreamPrimitive:\n\t{\n\t\tif (options.es)\n\t\t\tSPIRV_CROSS_THROW(\"Multi-stream geometry shaders not supported in ES.\");\n\t\telse if (!options.es && options.version < 400)\n\t\t\tSPIRV_CROSS_THROW(\"Multi-stream geometry shaders only supported in GLSL 400.\");\n\n\t\tauto stream_expr = to_expression(ops[0]);\n\t\tif (expression_type(ops[0]).basetype != SPIRType::Int)\n\t\t\tstream_expr = join(\"int(\", stream_expr, \")\");\n\t\tstatement(\"EndStreamPrimitive(\", stream_expr, \");\");\n\t\tbreak;\n\t}\n\n\t// Textures\n\tcase OpImageSampleExplicitLod:\n\tcase OpImageSampleProjExplicitLod:\n\tcase OpImageSampleDrefExplicitLod:\n\tcase OpImageSampleProjDrefExplicitLod:\n\tcase OpImageSampleImplicitLod:\n\tcase OpImageSampleProjImplicitLod:\n\tcase OpImageSampleDrefImplicitLod:\n\tcase OpImageSampleProjDrefImplicitLod:\n\tcase OpImageFetch:\n\tcase OpImageGather:\n\tcase OpImageDrefGather:\n\t\t// Gets a bit hairy, so move this to a separate instruction.\n\t\temit_texture_op(instruction, false);\n\t\tbreak;\n\n\tcase OpImageSparseSampleExplicitLod:\n\tcase OpImageSparseSampleProjExplicitLod:\n\tcase OpImageSparseSampleDrefExplicitLod:\n\tcase OpImageSparseSampleProjDrefExplicitLod:\n\tcase OpImageSparseSampleImplicitLod:\n\tcase OpImageSparseSampleProjImplicitLod:\n\tcase OpImageSparseSampleDrefImplicitLod:\n\tcase OpImageSparseSampleProjDrefImplicitLod:\n\tcase OpImageSparseFetch:\n\tcase OpImageSparseGather:\n\tcase OpImageSparseDrefGather:\n\t\t// Gets a bit hairy, so move this to a separate instruction.\n\t\temit_texture_op(instruction, true);\n\t\tbreak;\n\n\tcase OpImageSparseTexelsResident:\n\t\tif (options.es)\n\t\t\tSPIRV_CROSS_THROW(\"Sparse feedback is not supported in GLSL.\");\n\t\trequire_extension_internal(\"GL_ARB_sparse_texture2\");\n\t\temit_unary_func_op_cast(ops[0], ops[1], ops[2], \"sparseTexelsResidentARB\", int_type, SPIRType::Boolean);\n\t\tbreak;\n\n\tcase OpImage:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\n\t\t// Suppress usage tracking.\n\t\tauto &e = emit_op(result_type, id, to_expression(ops[2]), true, true);\n\n\t\t// When using the image, we need to know which variable it is actually loaded from.\n\t\tauto *var = maybe_get_backing_variable(ops[2]);\n\t\te.loaded_from = var ? var->self : ID(0);\n\t\tbreak;\n\t}\n\n\tcase OpImageQueryLod:\n\t{\n\t\tconst char *op = nullptr;\n\t\tif (!options.es && options.version < 400)\n\t\t{\n\t\t\trequire_extension_internal(\"GL_ARB_texture_query_lod\");\n\t\t\t// For some reason, the ARB spec is all-caps.\n\t\t\top = \"textureQueryLOD\";\n\t\t}\n\t\telse if (options.es)\n\t\t{\n\t\t\tif (options.version < 300)\n\t\t\t\tSPIRV_CROSS_THROW(\"textureQueryLod not supported in legacy ES\");\n\t\t\trequire_extension_internal(\"GL_EXT_texture_query_lod\");\n\t\t\top = \"textureQueryLOD\";\n\t\t}\n\t\telse\n\t\t\top = \"textureQueryLod\";\n\n\t\tauto sampler_expr = to_expression(ops[2]);\n\t\tif (has_decoration(ops[2], DecorationNonUniform))\n\t\t{\n\t\t\tif (maybe_get_backing_variable(ops[2]))\n\t\t\t\tconvert_non_uniform_expression(sampler_expr, ops[2]);\n\t\t\telse if (*backend.nonuniform_qualifier != '\\0')\n\t\t\t\tsampler_expr = join(backend.nonuniform_qualifier, \"(\", sampler_expr, \")\");\n\t\t}\n\n\t\tbool forward = should_forward(ops[3]);\n\t\temit_op(ops[0], ops[1],\n\t\t        join(op, \"(\", sampler_expr, \", \", to_unpacked_expression(ops[3]), \")\"),\n\t\t        forward);\n\t\tinherit_expression_dependencies(ops[1], ops[2]);\n\t\tinherit_expression_dependencies(ops[1], ops[3]);\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\t}\n\n\tcase OpImageQueryLevels:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\n\t\tif (!options.es && options.version < 430)\n\t\t\trequire_extension_internal(\"GL_ARB_texture_query_levels\");\n\t\tif (options.es)\n\t\t\tSPIRV_CROSS_THROW(\"textureQueryLevels not supported in ES profile.\");\n\n\t\tauto expr = join(\"textureQueryLevels(\", convert_separate_image_to_expression(ops[2]), \")\");\n\t\tauto &restype = get<SPIRType>(ops[0]);\n\t\texpr = bitcast_expression(restype, SPIRType::Int, expr);\n\t\temit_op(result_type, id, expr, true);\n\t\tbreak;\n\t}\n\n\tcase OpImageQuerySamples:\n\t{\n\t\tauto &type = expression_type(ops[2]);\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\n\t\tif (options.es)\n\t\t\tSPIRV_CROSS_THROW(\"textureSamples and imageSamples not supported in ES profile.\");\n\t\telse if (options.version < 450)\n\t\t\trequire_extension_internal(\"GL_ARB_texture_query_samples\");\n\n\t\tstring expr;\n\t\tif (type.image.sampled == 2)\n\t\t\texpr = join(\"imageSamples(\", to_non_uniform_aware_expression(ops[2]), \")\");\n\t\telse\n\t\t\texpr = join(\"textureSamples(\", convert_separate_image_to_expression(ops[2]), \")\");\n\n\t\tauto &restype = get<SPIRType>(ops[0]);\n\t\texpr = bitcast_expression(restype, SPIRType::Int, expr);\n\t\temit_op(result_type, id, expr, true);\n\t\tbreak;\n\t}\n\n\tcase OpSampledImage:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\temit_sampled_image_op(result_type, id, ops[2], ops[3]);\n\t\tinherit_expression_dependencies(id, ops[2]);\n\t\tinherit_expression_dependencies(id, ops[3]);\n\t\tbreak;\n\t}\n\n\tcase OpImageQuerySizeLod:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tuint32_t img = ops[2];\n\t\tauto &type = expression_type(img);\n\t\tauto &imgtype = get<SPIRType>(type.self);\n\n\t\tstd::string fname = \"textureSize\";\n\t\tif (is_legacy_desktop())\n\t\t{\n\t\t\tfname = legacy_tex_op(fname, imgtype, img);\n\t\t}\n\t\telse if (is_legacy_es())\n\t\t\tSPIRV_CROSS_THROW(\"textureSize is not supported in ESSL 100.\");\n\n\t\tauto expr = join(fname, \"(\", convert_separate_image_to_expression(img), \", \",\n\t\t                 bitcast_expression(SPIRType::Int, ops[3]), \")\");\n\n\t\t// ES needs to emulate 1D images as 2D.\n\t\tif (type.image.dim == Dim1D && options.es)\n\t\t\texpr = join(expr, \".x\");\n\n\t\tauto &restype = get<SPIRType>(ops[0]);\n\t\texpr = bitcast_expression(restype, SPIRType::Int, expr);\n\t\temit_op(result_type, id, expr, true);\n\t\tbreak;\n\t}\n\n\t// Image load/store\n\tcase OpImageRead:\n\tcase OpImageSparseRead:\n\t{\n\t\t// We added Nonreadable speculatively to the OpImage variable due to glslangValidator\n\t\t// not adding the proper qualifiers.\n\t\t// If it turns out we need to read the image after all, remove the qualifier and recompile.\n\t\tauto *var = maybe_get_backing_variable(ops[2]);\n\t\tif (var)\n\t\t{\n\t\t\tauto &flags = get_decoration_bitset(var->self);\n\t\t\tif (flags.get(DecorationNonReadable))\n\t\t\t{\n\t\t\t\tunset_decoration(var->self, DecorationNonReadable);\n\t\t\t\tforce_recompile();\n\t\t\t}\n\t\t}\n\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\n\t\tbool pure;\n\t\tstring imgexpr;\n\t\tauto &type = expression_type(ops[2]);\n\n\t\tif (var && var->remapped_variable) // Remapped input, just read as-is without any op-code\n\t\t{\n\t\t\tif (type.image.ms)\n\t\t\t\tSPIRV_CROSS_THROW(\"Trying to remap multisampled image to variable, this is not possible.\");\n\n\t\t\tauto itr =\n\t\t\t    find_if(begin(pls_inputs), end(pls_inputs), [var](const PlsRemap &pls) { return pls.id == var->self; });\n\n\t\t\tif (itr == end(pls_inputs))\n\t\t\t{\n\t\t\t\t// For non-PLS inputs, we rely on subpass type remapping information to get it right\n\t\t\t\t// since ImageRead always returns 4-component vectors and the backing type is opaque.\n\t\t\t\tif (!var->remapped_components)\n\t\t\t\t\tSPIRV_CROSS_THROW(\"subpassInput was remapped, but remap_components is not set correctly.\");\n\t\t\t\timgexpr = remap_swizzle(get<SPIRType>(result_type), var->remapped_components, to_expression(ops[2]));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// PLS input could have different number of components than what the SPIR expects, swizzle to\n\t\t\t\t// the appropriate vector size.\n\t\t\t\tuint32_t components = pls_format_to_components(itr->format);\n\t\t\t\timgexpr = remap_swizzle(get<SPIRType>(result_type), components, to_expression(ops[2]));\n\t\t\t}\n\t\t\tpure = true;\n\t\t}\n\t\telse if (type.image.dim == DimSubpassData)\n\t\t{\n\t\t\tif (var && subpass_input_is_framebuffer_fetch(var->self))\n\t\t\t{\n\t\t\t\timgexpr = to_expression(var->self);\n\t\t\t}\n\t\t\telse if (options.vulkan_semantics)\n\t\t\t{\n\t\t\t\t// With Vulkan semantics, use the proper Vulkan GLSL construct.\n\t\t\t\tif (type.image.ms)\n\t\t\t\t{\n\t\t\t\t\tuint32_t operands = ops[4];\n\t\t\t\t\tif (operands != ImageOperandsSampleMask || length != 6)\n\t\t\t\t\t\tSPIRV_CROSS_THROW(\"Multisampled image used in OpImageRead, but unexpected \"\n\t\t\t\t\t\t                  \"operand mask was used.\");\n\n\t\t\t\t\tuint32_t samples = ops[5];\n\t\t\t\t\timgexpr = join(\"subpassLoad(\", to_non_uniform_aware_expression(ops[2]), \", \", to_expression(samples), \")\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\timgexpr = join(\"subpassLoad(\", to_non_uniform_aware_expression(ops[2]), \")\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (type.image.ms)\n\t\t\t\t{\n\t\t\t\t\tuint32_t operands = ops[4];\n\t\t\t\t\tif (operands != ImageOperandsSampleMask || length != 6)\n\t\t\t\t\t\tSPIRV_CROSS_THROW(\"Multisampled image used in OpImageRead, but unexpected \"\n\t\t\t\t\t\t                  \"operand mask was used.\");\n\n\t\t\t\t\tuint32_t samples = ops[5];\n\t\t\t\t\timgexpr = join(\"texelFetch(\", to_non_uniform_aware_expression(ops[2]), \", ivec2(gl_FragCoord.xy), \",\n\t\t\t\t\t               to_expression(samples), \")\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Implement subpass loads via texture barrier style sampling.\n\t\t\t\t\timgexpr = join(\"texelFetch(\", to_non_uniform_aware_expression(ops[2]), \", ivec2(gl_FragCoord.xy), 0)\");\n\t\t\t\t}\n\t\t\t}\n\t\t\timgexpr = remap_swizzle(get<SPIRType>(result_type), 4, imgexpr);\n\t\t\tpure = true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbool sparse = opcode == OpImageSparseRead;\n\t\t\tuint32_t sparse_code_id = 0;\n\t\t\tuint32_t sparse_texel_id = 0;\n\t\t\tif (sparse)\n\t\t\t\temit_sparse_feedback_temporaries(ops[0], ops[1], sparse_code_id, sparse_texel_id);\n\n\t\t\t// imageLoad only accepts int coords, not uint.\n\t\t\tauto coord_expr = to_expression(ops[3]);\n\t\t\tauto target_coord_type = expression_type(ops[3]);\n\t\t\ttarget_coord_type.basetype = SPIRType::Int;\n\t\t\tcoord_expr = bitcast_expression(target_coord_type, expression_type(ops[3]).basetype, coord_expr);\n\n\t\t\t// ES needs to emulate 1D images as 2D.\n\t\t\tif (type.image.dim == Dim1D && options.es)\n\t\t\t\tcoord_expr = join(\"ivec2(\", coord_expr, \", 0)\");\n\n\t\t\t// Plain image load/store.\n\t\t\tif (sparse)\n\t\t\t{\n\t\t\t\tif (type.image.ms)\n\t\t\t\t{\n\t\t\t\t\tuint32_t operands = ops[4];\n\t\t\t\t\tif (operands != ImageOperandsSampleMask || length != 6)\n\t\t\t\t\t\tSPIRV_CROSS_THROW(\"Multisampled image used in OpImageRead, but unexpected \"\n\t\t\t\t\t\t                  \"operand mask was used.\");\n\n\t\t\t\t\tuint32_t samples = ops[5];\n\t\t\t\t\tstatement(to_expression(sparse_code_id), \" = sparseImageLoadARB(\", to_non_uniform_aware_expression(ops[2]), \", \",\n\t\t\t\t\t          coord_expr, \", \", to_expression(samples), \", \", to_expression(sparse_texel_id), \");\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tstatement(to_expression(sparse_code_id), \" = sparseImageLoadARB(\", to_non_uniform_aware_expression(ops[2]), \", \",\n\t\t\t\t\t          coord_expr, \", \", to_expression(sparse_texel_id), \");\");\n\t\t\t\t}\n\t\t\t\timgexpr = join(type_to_glsl(get<SPIRType>(result_type)), \"(\", to_expression(sparse_code_id), \", \",\n\t\t\t\t               to_expression(sparse_texel_id), \")\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (type.image.ms)\n\t\t\t\t{\n\t\t\t\t\tuint32_t operands = ops[4];\n\t\t\t\t\tif (operands != ImageOperandsSampleMask || length != 6)\n\t\t\t\t\t\tSPIRV_CROSS_THROW(\"Multisampled image used in OpImageRead, but unexpected \"\n\t\t\t\t\t\t                  \"operand mask was used.\");\n\n\t\t\t\t\tuint32_t samples = ops[5];\n\t\t\t\t\timgexpr =\n\t\t\t\t\t    join(\"imageLoad(\", to_non_uniform_aware_expression(ops[2]), \", \", coord_expr, \", \", to_expression(samples), \")\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\timgexpr = join(\"imageLoad(\", to_non_uniform_aware_expression(ops[2]), \", \", coord_expr, \")\");\n\t\t\t}\n\n\t\t\tif (!sparse)\n\t\t\t\timgexpr = remap_swizzle(get<SPIRType>(result_type), 4, imgexpr);\n\t\t\tpure = false;\n\t\t}\n\n\t\tif (var)\n\t\t{\n\t\t\tbool forward = forced_temporaries.find(id) == end(forced_temporaries);\n\t\t\tauto &e = emit_op(result_type, id, imgexpr, forward);\n\n\t\t\t// We only need to track dependencies if we're reading from image load/store.\n\t\t\tif (!pure)\n\t\t\t{\n\t\t\t\te.loaded_from = var->self;\n\t\t\t\tif (forward)\n\t\t\t\t\tvar->dependees.push_back(id);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\temit_op(result_type, id, imgexpr, false);\n\n\t\tinherit_expression_dependencies(id, ops[2]);\n\t\tif (type.image.ms)\n\t\t\tinherit_expression_dependencies(id, ops[5]);\n\t\tbreak;\n\t}\n\n\tcase OpImageTexelPointer:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\n\t\tauto coord_expr = to_expression(ops[3]);\n\t\tauto target_coord_type = expression_type(ops[3]);\n\t\ttarget_coord_type.basetype = SPIRType::Int;\n\t\tcoord_expr = bitcast_expression(target_coord_type, expression_type(ops[3]).basetype, coord_expr);\n\n\t\tauto expr = join(to_expression(ops[2]), \", \", coord_expr);\n\t\tauto &e = set<SPIRExpression>(id, expr, result_type, true);\n\n\t\t// When using the pointer, we need to know which variable it is actually loaded from.\n\t\tauto *var = maybe_get_backing_variable(ops[2]);\n\t\te.loaded_from = var ? var->self : ID(0);\n\t\tinherit_expression_dependencies(id, ops[3]);\n\t\tbreak;\n\t}\n\n\tcase OpImageWrite:\n\t{\n\t\t// We added Nonwritable speculatively to the OpImage variable due to glslangValidator\n\t\t// not adding the proper qualifiers.\n\t\t// If it turns out we need to write to the image after all, remove the qualifier and recompile.\n\t\tauto *var = maybe_get_backing_variable(ops[0]);\n\t\tif (var)\n\t\t{\n\t\t\tif (has_decoration(var->self, DecorationNonWritable))\n\t\t\t{\n\t\t\t\tunset_decoration(var->self, DecorationNonWritable);\n\t\t\t\tforce_recompile();\n\t\t\t}\n\t\t}\n\n\t\tauto &type = expression_type(ops[0]);\n\t\tauto &value_type = expression_type(ops[2]);\n\t\tauto store_type = value_type;\n\t\tstore_type.vecsize = 4;\n\n\t\t// imageStore only accepts int coords, not uint.\n\t\tauto coord_expr = to_expression(ops[1]);\n\t\tauto target_coord_type = expression_type(ops[1]);\n\t\ttarget_coord_type.basetype = SPIRType::Int;\n\t\tcoord_expr = bitcast_expression(target_coord_type, expression_type(ops[1]).basetype, coord_expr);\n\n\t\t// ES needs to emulate 1D images as 2D.\n\t\tif (type.image.dim == Dim1D && options.es)\n\t\t\tcoord_expr = join(\"ivec2(\", coord_expr, \", 0)\");\n\n\t\tif (type.image.ms)\n\t\t{\n\t\t\tuint32_t operands = ops[3];\n\t\t\tif (operands != ImageOperandsSampleMask || length != 5)\n\t\t\t\tSPIRV_CROSS_THROW(\"Multisampled image used in OpImageWrite, but unexpected operand mask was used.\");\n\t\t\tuint32_t samples = ops[4];\n\t\t\tstatement(\"imageStore(\", to_non_uniform_aware_expression(ops[0]), \", \", coord_expr, \", \", to_expression(samples), \", \",\n\t\t\t          remap_swizzle(store_type, value_type.vecsize, to_expression(ops[2])), \");\");\n\t\t}\n\t\telse\n\t\t\tstatement(\"imageStore(\", to_non_uniform_aware_expression(ops[0]), \", \", coord_expr, \", \",\n\t\t\t          remap_swizzle(store_type, value_type.vecsize, to_expression(ops[2])), \");\");\n\n\t\tif (var && variable_storage_is_aliased(*var))\n\t\t\tflush_all_aliased_variables();\n\t\tbreak;\n\t}\n\n\tcase OpImageQuerySize:\n\t{\n\t\tauto &type = expression_type(ops[2]);\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\n\t\tif (type.basetype == SPIRType::Image)\n\t\t{\n\t\t\tstring expr;\n\t\t\tif (type.image.sampled == 2)\n\t\t\t{\n\t\t\t\tif (!options.es && options.version < 430)\n\t\t\t\t\trequire_extension_internal(\"GL_ARB_shader_image_size\");\n\t\t\t\telse if (options.es && options.version < 310)\n\t\t\t\t\tSPIRV_CROSS_THROW(\"At least ESSL 3.10 required for imageSize.\");\n\n\t\t\t\t// The size of an image is always constant.\n\t\t\t\texpr = join(\"imageSize(\", to_non_uniform_aware_expression(ops[2]), \")\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// This path is hit for samplerBuffers and multisampled images which do not have LOD.\n\t\t\t\tstd::string fname = \"textureSize\";\n\t\t\t\tif (is_legacy())\n\t\t\t\t{\n\t\t\t\t\tauto &imgtype = get<SPIRType>(type.self);\n\t\t\t\t\tfname = legacy_tex_op(fname, imgtype, ops[2]);\n\t\t\t\t}\n\t\t\t\texpr = join(fname, \"(\", convert_separate_image_to_expression(ops[2]), \")\");\n\t\t\t}\n\n\t\t\tauto &restype = get<SPIRType>(ops[0]);\n\t\t\texpr = bitcast_expression(restype, SPIRType::Int, expr);\n\t\t\temit_op(result_type, id, expr, true);\n\t\t}\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"Invalid type for OpImageQuerySize.\");\n\t\tbreak;\n\t}\n\n\t// Compute\n\tcase OpControlBarrier:\n\tcase OpMemoryBarrier:\n\t{\n\t\tuint32_t execution_scope = 0;\n\t\tuint32_t memory;\n\t\tuint32_t semantics;\n\n\t\tif (opcode == OpMemoryBarrier)\n\t\t{\n\t\t\tmemory = evaluate_constant_u32(ops[0]);\n\t\t\tsemantics = evaluate_constant_u32(ops[1]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\texecution_scope = evaluate_constant_u32(ops[0]);\n\t\t\tmemory = evaluate_constant_u32(ops[1]);\n\t\t\tsemantics = evaluate_constant_u32(ops[2]);\n\t\t}\n\n\t\tif (execution_scope == ScopeSubgroup || memory == ScopeSubgroup)\n\t\t{\n\t\t\t// OpControlBarrier with ScopeSubgroup is subgroupBarrier()\n\t\t\tif (opcode != OpControlBarrier)\n\t\t\t{\n\t\t\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::SubgroupMemBarrier);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\trequest_subgroup_feature(ShaderSubgroupSupportHelper::SubgroupBarrier);\n\t\t\t}\n\t\t}\n\n\t\tif (execution_scope != ScopeSubgroup && get_entry_point().model == ExecutionModelTessellationControl)\n\t\t{\n\t\t\t// Control shaders only have barriers, and it implies memory barriers.\n\t\t\tif (opcode == OpControlBarrier)\n\t\t\t\tstatement(\"barrier();\");\n\t\t\tbreak;\n\t\t}\n\n\t\t// We only care about these flags, acquire/release and friends are not relevant to GLSL.\n\t\tsemantics = mask_relevant_memory_semantics(semantics);\n\n\t\tif (opcode == OpMemoryBarrier)\n\t\t{\n\t\t\t// If we are a memory barrier, and the next instruction is a control barrier, check if that memory barrier\n\t\t\t// does what we need, so we avoid redundant barriers.\n\t\t\tconst Instruction *next = get_next_instruction_in_block(instruction);\n\t\t\tif (next && next->op == OpControlBarrier)\n\t\t\t{\n\t\t\t\tauto *next_ops = stream(*next);\n\t\t\t\tuint32_t next_memory = evaluate_constant_u32(next_ops[1]);\n\t\t\t\tuint32_t next_semantics = evaluate_constant_u32(next_ops[2]);\n\t\t\t\tnext_semantics = mask_relevant_memory_semantics(next_semantics);\n\n\t\t\t\tbool memory_scope_covered = false;\n\t\t\t\tif (next_memory == memory)\n\t\t\t\t\tmemory_scope_covered = true;\n\t\t\t\telse if (next_semantics == MemorySemanticsWorkgroupMemoryMask)\n\t\t\t\t{\n\t\t\t\t\t// If we only care about workgroup memory, either Device or Workgroup scope is fine,\n\t\t\t\t\t// scope does not have to match.\n\t\t\t\t\tif ((next_memory == ScopeDevice || next_memory == ScopeWorkgroup) &&\n\t\t\t\t\t    (memory == ScopeDevice || memory == ScopeWorkgroup))\n\t\t\t\t\t{\n\t\t\t\t\t\tmemory_scope_covered = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (memory == ScopeWorkgroup && next_memory == ScopeDevice)\n\t\t\t\t{\n\t\t\t\t\t// The control barrier has device scope, but the memory barrier just has workgroup scope.\n\t\t\t\t\tmemory_scope_covered = true;\n\t\t\t\t}\n\n\t\t\t\t// If we have the same memory scope, and all memory types are covered, we're good.\n\t\t\t\tif (memory_scope_covered && (semantics & next_semantics) == semantics)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// We are synchronizing some memory or syncing execution,\n\t\t// so we cannot forward any loads beyond the memory barrier.\n\t\tif (semantics || opcode == OpControlBarrier)\n\t\t{\n\t\t\tassert(current_emitting_block);\n\t\t\tflush_control_dependent_expressions(current_emitting_block->self);\n\t\t\tflush_all_active_variables();\n\t\t}\n\n\t\tif (memory == ScopeWorkgroup) // Only need to consider memory within a group\n\t\t{\n\t\t\tif (semantics == MemorySemanticsWorkgroupMemoryMask)\n\t\t\t{\n\t\t\t\t// OpControlBarrier implies a memory barrier for shared memory as well.\n\t\t\t\tbool implies_shared_barrier = opcode == OpControlBarrier && execution_scope == ScopeWorkgroup;\n\t\t\t\tif (!implies_shared_barrier)\n\t\t\t\t\tstatement(\"memoryBarrierShared();\");\n\t\t\t}\n\t\t\telse if (semantics != 0)\n\t\t\t\tstatement(\"groupMemoryBarrier();\");\n\t\t}\n\t\telse if (memory == ScopeSubgroup)\n\t\t{\n\t\t\tconst uint32_t all_barriers =\n\t\t\t    MemorySemanticsWorkgroupMemoryMask | MemorySemanticsUniformMemoryMask | MemorySemanticsImageMemoryMask;\n\n\t\t\tif (semantics & (MemorySemanticsCrossWorkgroupMemoryMask | MemorySemanticsSubgroupMemoryMask))\n\t\t\t{\n\t\t\t\t// These are not relevant for GLSL, but assume it means memoryBarrier().\n\t\t\t\t// memoryBarrier() does everything, so no need to test anything else.\n\t\t\t\tstatement(\"subgroupMemoryBarrier();\");\n\t\t\t}\n\t\t\telse if ((semantics & all_barriers) == all_barriers)\n\t\t\t{\n\t\t\t\t// Short-hand instead of emitting 3 barriers.\n\t\t\t\tstatement(\"subgroupMemoryBarrier();\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Pick out individual barriers.\n\t\t\t\tif (semantics & MemorySemanticsWorkgroupMemoryMask)\n\t\t\t\t\tstatement(\"subgroupMemoryBarrierShared();\");\n\t\t\t\tif (semantics & MemorySemanticsUniformMemoryMask)\n\t\t\t\t\tstatement(\"subgroupMemoryBarrierBuffer();\");\n\t\t\t\tif (semantics & MemorySemanticsImageMemoryMask)\n\t\t\t\t\tstatement(\"subgroupMemoryBarrierImage();\");\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst uint32_t all_barriers =\n\t\t\t    MemorySemanticsWorkgroupMemoryMask | MemorySemanticsUniformMemoryMask | MemorySemanticsImageMemoryMask;\n\n\t\t\tif (semantics & (MemorySemanticsCrossWorkgroupMemoryMask | MemorySemanticsSubgroupMemoryMask))\n\t\t\t{\n\t\t\t\t// These are not relevant for GLSL, but assume it means memoryBarrier().\n\t\t\t\t// memoryBarrier() does everything, so no need to test anything else.\n\t\t\t\tstatement(\"memoryBarrier();\");\n\t\t\t}\n\t\t\telse if ((semantics & all_barriers) == all_barriers)\n\t\t\t{\n\t\t\t\t// Short-hand instead of emitting 4 barriers.\n\t\t\t\tstatement(\"memoryBarrier();\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Pick out individual barriers.\n\t\t\t\tif (semantics & MemorySemanticsWorkgroupMemoryMask)\n\t\t\t\t\tstatement(\"memoryBarrierShared();\");\n\t\t\t\tif (semantics & MemorySemanticsUniformMemoryMask)\n\t\t\t\t\tstatement(\"memoryBarrierBuffer();\");\n\t\t\t\tif (semantics & MemorySemanticsImageMemoryMask)\n\t\t\t\t\tstatement(\"memoryBarrierImage();\");\n\t\t\t}\n\t\t}\n\n\t\tif (opcode == OpControlBarrier)\n\t\t{\n\t\t\tif (execution_scope == ScopeSubgroup)\n\t\t\t\tstatement(\"subgroupBarrier();\");\n\t\t\telse\n\t\t\t\tstatement(\"barrier();\");\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpExtInst:\n\t{\n\t\tuint32_t extension_set = ops[2];\n\t\tauto ext = get<SPIRExtension>(extension_set).ext;\n\n\t\tif (ext == SPIRExtension::GLSL)\n\t\t{\n\t\t\temit_glsl_op(ops[0], ops[1], ops[3], &ops[4], length - 4);\n\t\t}\n\t\telse if (ext == SPIRExtension::SPV_AMD_shader_ballot)\n\t\t{\n\t\t\temit_spv_amd_shader_ballot_op(ops[0], ops[1], ops[3], &ops[4], length - 4);\n\t\t}\n\t\telse if (ext == SPIRExtension::SPV_AMD_shader_explicit_vertex_parameter)\n\t\t{\n\t\t\temit_spv_amd_shader_explicit_vertex_parameter_op(ops[0], ops[1], ops[3], &ops[4], length - 4);\n\t\t}\n\t\telse if (ext == SPIRExtension::SPV_AMD_shader_trinary_minmax)\n\t\t{\n\t\t\temit_spv_amd_shader_trinary_minmax_op(ops[0], ops[1], ops[3], &ops[4], length - 4);\n\t\t}\n\t\telse if (ext == SPIRExtension::SPV_AMD_gcn_shader)\n\t\t{\n\t\t\temit_spv_amd_gcn_shader_op(ops[0], ops[1], ops[3], &ops[4], length - 4);\n\t\t}\n\t\telse if (ext == SPIRExtension::SPV_debug_info ||\n\t\t         ext == SPIRExtension::NonSemanticShaderDebugInfo ||\n\t\t         ext == SPIRExtension::NonSemanticGeneric)\n\t\t{\n\t\t\tbreak; // Ignore SPIR-V debug information extended instructions.\n\t\t}\n\t\telse if (ext == SPIRExtension::NonSemanticDebugPrintf)\n\t\t{\n\t\t\t// Operation 1 is printf.\n\t\t\tif (ops[3] == 1)\n\t\t\t{\n\t\t\t\tif (!options.vulkan_semantics)\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Debug printf is only supported in Vulkan GLSL.\\n\");\n\t\t\t\trequire_extension_internal(\"GL_EXT_debug_printf\");\n\t\t\t\tauto &format_string = get<SPIRString>(ops[4]).str;\n\t\t\t\tstring expr = join(\"debugPrintfEXT(\\\"\", format_string, \"\\\"\");\n\t\t\t\tfor (uint32_t i = 5; i < length; i++)\n\t\t\t\t{\n\t\t\t\t\texpr += \", \";\n\t\t\t\t\texpr += to_expression(ops[i]);\n\t\t\t\t}\n\t\t\t\tstatement(expr, \");\");\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstatement(\"// unimplemented ext op \", instruction.op);\n\t\t\tbreak;\n\t\t}\n\n\t\tbreak;\n\t}\n\n\t// Legacy sub-group stuff ...\n\tcase OpSubgroupBallotKHR:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tstring expr;\n\t\texpr = join(\"uvec4(unpackUint2x32(ballotARB(\" + to_expression(ops[2]) + \")), 0u, 0u)\");\n\t\temit_op(result_type, id, expr, should_forward(ops[2]));\n\n\t\trequire_extension_internal(\"GL_ARB_shader_ballot\");\n\t\tinherit_expression_dependencies(id, ops[2]);\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\t}\n\n\tcase OpSubgroupFirstInvocationKHR:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\temit_unary_func_op(result_type, id, ops[2], \"readFirstInvocationARB\");\n\n\t\trequire_extension_internal(\"GL_ARB_shader_ballot\");\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\t}\n\n\tcase OpSubgroupReadInvocationKHR:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\temit_binary_func_op(result_type, id, ops[2], ops[3], \"readInvocationARB\");\n\n\t\trequire_extension_internal(\"GL_ARB_shader_ballot\");\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\t}\n\n\tcase OpSubgroupAllKHR:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\temit_unary_func_op(result_type, id, ops[2], \"allInvocationsARB\");\n\n\t\trequire_extension_internal(\"GL_ARB_shader_group_vote\");\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\t}\n\n\tcase OpSubgroupAnyKHR:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\temit_unary_func_op(result_type, id, ops[2], \"anyInvocationARB\");\n\n\t\trequire_extension_internal(\"GL_ARB_shader_group_vote\");\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\t}\n\n\tcase OpSubgroupAllEqualKHR:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\temit_unary_func_op(result_type, id, ops[2], \"allInvocationsEqualARB\");\n\n\t\trequire_extension_internal(\"GL_ARB_shader_group_vote\");\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\t}\n\n\tcase OpGroupIAddNonUniformAMD:\n\tcase OpGroupFAddNonUniformAMD:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\temit_unary_func_op(result_type, id, ops[4], \"addInvocationsNonUniformAMD\");\n\n\t\trequire_extension_internal(\"GL_AMD_shader_ballot\");\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\t}\n\n\tcase OpGroupFMinNonUniformAMD:\n\tcase OpGroupUMinNonUniformAMD:\n\tcase OpGroupSMinNonUniformAMD:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\temit_unary_func_op(result_type, id, ops[4], \"minInvocationsNonUniformAMD\");\n\n\t\trequire_extension_internal(\"GL_AMD_shader_ballot\");\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\t}\n\n\tcase OpGroupFMaxNonUniformAMD:\n\tcase OpGroupUMaxNonUniformAMD:\n\tcase OpGroupSMaxNonUniformAMD:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\temit_unary_func_op(result_type, id, ops[4], \"maxInvocationsNonUniformAMD\");\n\n\t\trequire_extension_internal(\"GL_AMD_shader_ballot\");\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\t}\n\n\tcase OpFragmentMaskFetchAMD:\n\t{\n\t\tauto &type = expression_type(ops[2]);\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\n\t\tif (type.image.dim == spv::DimSubpassData)\n\t\t{\n\t\t\temit_unary_func_op(result_type, id, ops[2], \"fragmentMaskFetchAMD\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\temit_binary_func_op(result_type, id, ops[2], ops[3], \"fragmentMaskFetchAMD\");\n\t\t}\n\n\t\trequire_extension_internal(\"GL_AMD_shader_fragment_mask\");\n\t\tbreak;\n\t}\n\n\tcase OpFragmentFetchAMD:\n\t{\n\t\tauto &type = expression_type(ops[2]);\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\n\t\tif (type.image.dim == spv::DimSubpassData)\n\t\t{\n\t\t\temit_binary_func_op(result_type, id, ops[2], ops[4], \"fragmentFetchAMD\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\temit_trinary_func_op(result_type, id, ops[2], ops[3], ops[4], \"fragmentFetchAMD\");\n\t\t}\n\n\t\trequire_extension_internal(\"GL_AMD_shader_fragment_mask\");\n\t\tbreak;\n\t}\n\n\t// Vulkan 1.1 sub-group stuff ...\n\tcase OpGroupNonUniformElect:\n\tcase OpGroupNonUniformBroadcast:\n\tcase OpGroupNonUniformBroadcastFirst:\n\tcase OpGroupNonUniformBallot:\n\tcase OpGroupNonUniformInverseBallot:\n\tcase OpGroupNonUniformBallotBitExtract:\n\tcase OpGroupNonUniformBallotBitCount:\n\tcase OpGroupNonUniformBallotFindLSB:\n\tcase OpGroupNonUniformBallotFindMSB:\n\tcase OpGroupNonUniformShuffle:\n\tcase OpGroupNonUniformShuffleXor:\n\tcase OpGroupNonUniformShuffleUp:\n\tcase OpGroupNonUniformShuffleDown:\n\tcase OpGroupNonUniformAll:\n\tcase OpGroupNonUniformAny:\n\tcase OpGroupNonUniformAllEqual:\n\tcase OpGroupNonUniformFAdd:\n\tcase OpGroupNonUniformIAdd:\n\tcase OpGroupNonUniformFMul:\n\tcase OpGroupNonUniformIMul:\n\tcase OpGroupNonUniformFMin:\n\tcase OpGroupNonUniformFMax:\n\tcase OpGroupNonUniformSMin:\n\tcase OpGroupNonUniformSMax:\n\tcase OpGroupNonUniformUMin:\n\tcase OpGroupNonUniformUMax:\n\tcase OpGroupNonUniformBitwiseAnd:\n\tcase OpGroupNonUniformBitwiseOr:\n\tcase OpGroupNonUniformBitwiseXor:\n\tcase OpGroupNonUniformLogicalAnd:\n\tcase OpGroupNonUniformLogicalOr:\n\tcase OpGroupNonUniformLogicalXor:\n\tcase OpGroupNonUniformQuadSwap:\n\tcase OpGroupNonUniformQuadBroadcast:\n\t\temit_subgroup_op(instruction);\n\t\tbreak;\n\n\tcase OpFUnordEqual:\n\tcase OpFUnordLessThan:\n\tcase OpFUnordGreaterThan:\n\tcase OpFUnordLessThanEqual:\n\tcase OpFUnordGreaterThanEqual:\n\t{\n\t\t// GLSL doesn't specify if floating point comparisons are ordered or unordered,\n\t\t// but glslang always emits ordered floating point compares for GLSL.\n\t\t// To get unordered compares, we can test the opposite thing and invert the result.\n\t\t// This way, we force true when there is any NaN present.\n\t\tuint32_t op0 = ops[2];\n\t\tuint32_t op1 = ops[3];\n\n\t\tstring expr;\n\t\tif (expression_type(op0).vecsize > 1)\n\t\t{\n\t\t\tconst char *comp_op = nullptr;\n\t\t\tswitch (opcode)\n\t\t\t{\n\t\t\tcase OpFUnordEqual:\n\t\t\t\tcomp_op = \"notEqual\";\n\t\t\t\tbreak;\n\n\t\t\tcase OpFUnordLessThan:\n\t\t\t\tcomp_op = \"greaterThanEqual\";\n\t\t\t\tbreak;\n\n\t\t\tcase OpFUnordLessThanEqual:\n\t\t\t\tcomp_op = \"greaterThan\";\n\t\t\t\tbreak;\n\n\t\t\tcase OpFUnordGreaterThan:\n\t\t\t\tcomp_op = \"lessThanEqual\";\n\t\t\t\tbreak;\n\n\t\t\tcase OpFUnordGreaterThanEqual:\n\t\t\t\tcomp_op = \"lessThan\";\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tassert(0);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\texpr = join(\"not(\", comp_op, \"(\", to_unpacked_expression(op0), \", \", to_unpacked_expression(op1), \"))\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst char *comp_op = nullptr;\n\t\t\tswitch (opcode)\n\t\t\t{\n\t\t\tcase OpFUnordEqual:\n\t\t\t\tcomp_op = \" != \";\n\t\t\t\tbreak;\n\n\t\t\tcase OpFUnordLessThan:\n\t\t\t\tcomp_op = \" >= \";\n\t\t\t\tbreak;\n\n\t\t\tcase OpFUnordLessThanEqual:\n\t\t\t\tcomp_op = \" > \";\n\t\t\t\tbreak;\n\n\t\t\tcase OpFUnordGreaterThan:\n\t\t\t\tcomp_op = \" <= \";\n\t\t\t\tbreak;\n\n\t\t\tcase OpFUnordGreaterThanEqual:\n\t\t\t\tcomp_op = \" < \";\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tassert(0);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\texpr = join(\"!(\", to_enclosed_unpacked_expression(op0), comp_op, to_enclosed_unpacked_expression(op1), \")\");\n\t\t}\n\n\t\temit_op(ops[0], ops[1], expr, should_forward(op0) && should_forward(op1));\n\t\tinherit_expression_dependencies(ops[1], op0);\n\t\tinherit_expression_dependencies(ops[1], op1);\n\t\tbreak;\n\t}\n\n\tcase OpReportIntersectionKHR:\n\t\t// NV is same opcode.\n\t\tforced_temporaries.insert(ops[1]);\n\t\tif (ray_tracing_is_khr)\n\t\t\tGLSL_BFOP(reportIntersectionEXT);\n\t\telse\n\t\t\tGLSL_BFOP(reportIntersectionNV);\n\t\tflush_control_dependent_expressions(current_emitting_block->self);\n\t\tbreak;\n\tcase OpIgnoreIntersectionNV:\n\t\t// KHR variant is a terminator.\n\t\tstatement(\"ignoreIntersectionNV();\");\n\t\tflush_control_dependent_expressions(current_emitting_block->self);\n\t\tbreak;\n\tcase OpTerminateRayNV:\n\t\t// KHR variant is a terminator.\n\t\tstatement(\"terminateRayNV();\");\n\t\tflush_control_dependent_expressions(current_emitting_block->self);\n\t\tbreak;\n\tcase OpTraceNV:\n\t\tstatement(\"traceNV(\", to_non_uniform_aware_expression(ops[0]), \", \", to_expression(ops[1]), \", \", to_expression(ops[2]), \", \",\n\t\t          to_expression(ops[3]), \", \", to_expression(ops[4]), \", \", to_expression(ops[5]), \", \",\n\t\t          to_expression(ops[6]), \", \", to_expression(ops[7]), \", \", to_expression(ops[8]), \", \",\n\t\t          to_expression(ops[9]), \", \", to_expression(ops[10]), \");\");\n\t\tflush_control_dependent_expressions(current_emitting_block->self);\n\t\tbreak;\n\tcase OpTraceRayKHR:\n\t\tif (!has_decoration(ops[10], DecorationLocation))\n\t\t\tSPIRV_CROSS_THROW(\"A memory declaration object must be used in TraceRayKHR.\");\n\t\tstatement(\"traceRayEXT(\", to_non_uniform_aware_expression(ops[0]), \", \", to_expression(ops[1]), \", \", to_expression(ops[2]), \", \",\n\t\t          to_expression(ops[3]), \", \", to_expression(ops[4]), \", \", to_expression(ops[5]), \", \",\n\t\t          to_expression(ops[6]), \", \", to_expression(ops[7]), \", \", to_expression(ops[8]), \", \",\n\t\t          to_expression(ops[9]), \", \", get_decoration(ops[10], DecorationLocation), \");\");\n\t\tflush_control_dependent_expressions(current_emitting_block->self);\n\t\tbreak;\n\tcase OpExecuteCallableNV:\n\t\tstatement(\"executeCallableNV(\", to_expression(ops[0]), \", \", to_expression(ops[1]), \");\");\n\t\tflush_control_dependent_expressions(current_emitting_block->self);\n\t\tbreak;\n\tcase OpExecuteCallableKHR:\n\t\tif (!has_decoration(ops[1], DecorationLocation))\n\t\t\tSPIRV_CROSS_THROW(\"A memory declaration object must be used in ExecuteCallableKHR.\");\n\t\tstatement(\"executeCallableEXT(\", to_expression(ops[0]), \", \", get_decoration(ops[1], DecorationLocation), \");\");\n\t\tflush_control_dependent_expressions(current_emitting_block->self);\n\t\tbreak;\n\n\t\t// Don't bother forwarding temporaries. Avoids having to test expression invalidation with ray query objects.\n\tcase OpRayQueryInitializeKHR:\n\t\tflush_variable_declaration(ops[0]);\n\t\tstatement(\"rayQueryInitializeEXT(\",\n\t\t          to_expression(ops[0]), \", \", to_expression(ops[1]), \", \",\n\t\t          to_expression(ops[2]), \", \", to_expression(ops[3]), \", \",\n\t\t          to_expression(ops[4]), \", \", to_expression(ops[5]), \", \",\n\t\t          to_expression(ops[6]), \", \", to_expression(ops[7]), \");\");\n\t\tbreak;\n\tcase OpRayQueryProceedKHR:\n\t\tflush_variable_declaration(ops[0]);\n\t\temit_op(ops[0], ops[1], join(\"rayQueryProceedEXT(\", to_expression(ops[2]), \")\"), false);\n\t\tbreak;\n\tcase OpRayQueryTerminateKHR:\n\t\tflush_variable_declaration(ops[0]);\n\t\tstatement(\"rayQueryTerminateEXT(\", to_expression(ops[0]), \");\");\n\t\tbreak;\n\tcase OpRayQueryGenerateIntersectionKHR:\n\t\tflush_variable_declaration(ops[0]);\n\t\tstatement(\"rayQueryGenerateIntersectionEXT(\", to_expression(ops[0]), \", \", to_expression(ops[1]), \");\");\n\t\tbreak;\n\tcase OpRayQueryConfirmIntersectionKHR:\n\t\tflush_variable_declaration(ops[0]);\n\t\tstatement(\"rayQueryConfirmIntersectionEXT(\", to_expression(ops[0]), \");\");\n\t\tbreak;\n#define GLSL_RAY_QUERY_GET_OP(op) \\\n\tcase OpRayQueryGet##op##KHR: \\\n\t\tflush_variable_declaration(ops[2]); \\\n\t\temit_op(ops[0], ops[1], join(\"rayQueryGet\" #op \"EXT(\", to_expression(ops[2]), \")\"), false); \\\n\t\tbreak\n#define GLSL_RAY_QUERY_GET_OP2(op) \\\n\tcase OpRayQueryGet##op##KHR: \\\n\t\tflush_variable_declaration(ops[2]); \\\n\t\temit_op(ops[0], ops[1], join(\"rayQueryGet\" #op \"EXT(\", to_expression(ops[2]), \", \", \"bool(\", to_expression(ops[3]), \"))\"), false); \\\n\t\tbreak\n\tGLSL_RAY_QUERY_GET_OP(RayTMin);\n\tGLSL_RAY_QUERY_GET_OP(RayFlags);\n\tGLSL_RAY_QUERY_GET_OP(WorldRayOrigin);\n\tGLSL_RAY_QUERY_GET_OP(WorldRayDirection);\n\tGLSL_RAY_QUERY_GET_OP(IntersectionCandidateAABBOpaque);\n\tGLSL_RAY_QUERY_GET_OP2(IntersectionType);\n\tGLSL_RAY_QUERY_GET_OP2(IntersectionT);\n\tGLSL_RAY_QUERY_GET_OP2(IntersectionInstanceCustomIndex);\n\tGLSL_RAY_QUERY_GET_OP2(IntersectionInstanceId);\n\tGLSL_RAY_QUERY_GET_OP2(IntersectionInstanceShaderBindingTableRecordOffset);\n\tGLSL_RAY_QUERY_GET_OP2(IntersectionGeometryIndex);\n\tGLSL_RAY_QUERY_GET_OP2(IntersectionPrimitiveIndex);\n\tGLSL_RAY_QUERY_GET_OP2(IntersectionBarycentrics);\n\tGLSL_RAY_QUERY_GET_OP2(IntersectionFrontFace);\n\tGLSL_RAY_QUERY_GET_OP2(IntersectionObjectRayDirection);\n\tGLSL_RAY_QUERY_GET_OP2(IntersectionObjectRayOrigin);\n\tGLSL_RAY_QUERY_GET_OP2(IntersectionObjectToWorld);\n\tGLSL_RAY_QUERY_GET_OP2(IntersectionWorldToObject);\n#undef GLSL_RAY_QUERY_GET_OP\n#undef GLSL_RAY_QUERY_GET_OP2\n\n\tcase OpConvertUToAccelerationStructureKHR:\n\t{\n\t\trequire_extension_internal(\"GL_EXT_ray_tracing\");\n\n\t\tbool elide_temporary = should_forward(ops[2]) && forced_temporaries.count(ops[1]) == 0 &&\n\t\t                       !hoisted_temporaries.count(ops[1]);\n\n\t\tif (elide_temporary)\n\t\t{\n\t\t\tGLSL_UFOP(accelerationStructureEXT);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Force this path in subsequent iterations.\n\t\t\tforced_temporaries.insert(ops[1]);\n\n\t\t\t// We cannot declare a temporary acceleration structure in GLSL.\n\t\t\t// If we get to this point, we'll have to emit a temporary uvec2,\n\t\t\t// and cast to RTAS on demand.\n\t\t\tstatement(declare_temporary(expression_type_id(ops[2]), ops[1]), to_unpacked_expression(ops[2]), \";\");\n\t\t\t// Use raw SPIRExpression interface to block all usage tracking.\n\t\t\tset<SPIRExpression>(ops[1], join(\"accelerationStructureEXT(\", to_name(ops[1]), \")\"), ops[0], true);\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpConvertUToPtr:\n\t{\n\t\tauto &type = get<SPIRType>(ops[0]);\n\t\tif (type.storage != StorageClassPhysicalStorageBufferEXT)\n\t\t\tSPIRV_CROSS_THROW(\"Only StorageClassPhysicalStorageBufferEXT is supported by OpConvertUToPtr.\");\n\n\t\tauto &in_type = expression_type(ops[2]);\n\t\tif (in_type.vecsize == 2)\n\t\t\trequire_extension_internal(\"GL_EXT_buffer_reference_uvec2\");\n\n\t\tauto op = type_to_glsl(type);\n\t\temit_unary_func_op(ops[0], ops[1], ops[2], op.c_str());\n\t\tbreak;\n\t}\n\n\tcase OpConvertPtrToU:\n\t{\n\t\tauto &type = get<SPIRType>(ops[0]);\n\t\tauto &ptr_type = expression_type(ops[2]);\n\t\tif (ptr_type.storage != StorageClassPhysicalStorageBufferEXT)\n\t\t\tSPIRV_CROSS_THROW(\"Only StorageClassPhysicalStorageBufferEXT is supported by OpConvertPtrToU.\");\n\n\t\tif (type.vecsize == 2)\n\t\t\trequire_extension_internal(\"GL_EXT_buffer_reference_uvec2\");\n\n\t\tauto op = type_to_glsl(type);\n\t\temit_unary_func_op(ops[0], ops[1], ops[2], op.c_str());\n\t\tbreak;\n\t}\n\n\tcase OpUndef:\n\t\t// Undefined value has been declared.\n\t\tbreak;\n\n\tcase OpLine:\n\t{\n\t\temit_line_directive(ops[0], ops[1]);\n\t\tbreak;\n\t}\n\n\tcase OpNoLine:\n\t\tbreak;\n\n\tcase OpDemoteToHelperInvocationEXT:\n\t\tif (!options.vulkan_semantics)\n\t\t\tSPIRV_CROSS_THROW(\"GL_EXT_demote_to_helper_invocation is only supported in Vulkan GLSL.\");\n\t\trequire_extension_internal(\"GL_EXT_demote_to_helper_invocation\");\n\t\tstatement(backend.demote_literal, \";\");\n\t\tbreak;\n\n\tcase OpIsHelperInvocationEXT:\n\t\tif (!options.vulkan_semantics)\n\t\t\tSPIRV_CROSS_THROW(\"GL_EXT_demote_to_helper_invocation is only supported in Vulkan GLSL.\");\n\t\trequire_extension_internal(\"GL_EXT_demote_to_helper_invocation\");\n\t\t// Helper lane state with demote is volatile by nature.\n\t\t// Do not forward this.\n\t\temit_op(ops[0], ops[1], \"helperInvocationEXT()\", false);\n\t\tbreak;\n\n\tcase OpBeginInvocationInterlockEXT:\n\t\t// If the interlock is complex, we emit this elsewhere.\n\t\tif (!interlocked_is_complex)\n\t\t{\n\t\t\tstatement(\"SPIRV_Cross_beginInvocationInterlock();\");\n\t\t\tflush_all_active_variables();\n\t\t\t// Make sure forwarding doesn't propagate outside interlock region.\n\t\t}\n\t\tbreak;\n\n\tcase OpEndInvocationInterlockEXT:\n\t\t// If the interlock is complex, we emit this elsewhere.\n\t\tif (!interlocked_is_complex)\n\t\t{\n\t\t\tstatement(\"SPIRV_Cross_endInvocationInterlock();\");\n\t\t\tflush_all_active_variables();\n\t\t\t// Make sure forwarding doesn't propagate outside interlock region.\n\t\t}\n\t\tbreak;\n\n\tcase OpSetMeshOutputsEXT:\n\t\tstatement(\"SetMeshOutputsEXT(\", to_unpacked_expression(ops[0]), \", \", to_unpacked_expression(ops[1]), \");\");\n\t\tbreak;\n\n\tcase OpReadClockKHR:\n\t{\n\t\tauto &type = get<SPIRType>(ops[0]);\n\t\tauto scope = static_cast<Scope>(evaluate_constant_u32(ops[2]));\n\t\tconst char *op = nullptr;\n\t\t// Forwarding clock statements leads to a scenario where an SSA value can take on different\n\t\t// values every time it's evaluated. Block any forwarding attempt.\n\t\t// We also might want to invalidate all expressions to function as a sort of optimization\n\t\t// barrier, but might be overkill for now.\n\t\tif (scope == ScopeDevice)\n\t\t{\n\t\t\trequire_extension_internal(\"GL_EXT_shader_realtime_clock\");\n\t\t\tif (type.basetype == SPIRType::BaseType::UInt64)\n\t\t\t\top = \"clockRealtimeEXT()\";\n\t\t\telse if (type.basetype == SPIRType::BaseType::UInt && type.vecsize == 2)\n\t\t\t\top = \"clockRealtime2x32EXT()\";\n\t\t\telse\n\t\t\t\tSPIRV_CROSS_THROW(\"Unsupported result type for OpReadClockKHR opcode.\");\n\t\t}\n\t\telse if (scope == ScopeSubgroup)\n\t\t{\n\t\t\trequire_extension_internal(\"GL_ARB_shader_clock\");\n\t\t\tif (type.basetype == SPIRType::BaseType::UInt64)\n\t\t\t\top = \"clockARB()\";\n\t\t\telse if (type.basetype == SPIRType::BaseType::UInt && type.vecsize == 2)\n\t\t\t\top = \"clock2x32ARB()\";\n\t\t\telse\n\t\t\t\tSPIRV_CROSS_THROW(\"Unsupported result type for OpReadClockKHR opcode.\");\n\t\t}\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"Unsupported scope for OpReadClockKHR opcode.\");\n\n\t\temit_op(ops[0], ops[1], op, false);\n\t\tbreak;\n\t}\n\n\tdefault:\n\t\tstatement(\"// unimplemented op \", instruction.op);\n\t\tbreak;\n\t}\n}\n\n// Appends function arguments, mapped from global variables, beyond the specified arg index.\n// This is used when a function call uses fewer arguments than the function defines.\n// This situation may occur if the function signature has been dynamically modified to\n// extract global variables referenced from within the function, and convert them to\n// function arguments. This is necessary for shader languages that do not support global\n// access to shader input content from within a function (eg. Metal). Each additional\n// function args uses the name of the global variable. Function nesting will modify the\n// functions and function calls all the way up the nesting chain.\nvoid CompilerGLSL::append_global_func_args(const SPIRFunction &func, uint32_t index, SmallVector<string> &arglist)\n{\n\tauto &args = func.arguments;\n\tuint32_t arg_cnt = uint32_t(args.size());\n\tfor (uint32_t arg_idx = index; arg_idx < arg_cnt; arg_idx++)\n\t{\n\t\tauto &arg = args[arg_idx];\n\t\tassert(arg.alias_global_variable);\n\n\t\t// If the underlying variable needs to be declared\n\t\t// (ie. a local variable with deferred declaration), do so now.\n\t\tuint32_t var_id = get<SPIRVariable>(arg.id).basevariable;\n\t\tif (var_id)\n\t\t\tflush_variable_declaration(var_id);\n\n\t\targlist.push_back(to_func_call_arg(arg, arg.id));\n\t}\n}\n\nstring CompilerGLSL::to_member_name(const SPIRType &type, uint32_t index)\n{\n\tif (type.type_alias != TypeID(0) &&\n\t    !has_extended_decoration(type.type_alias, SPIRVCrossDecorationBufferBlockRepacked))\n\t{\n\t\treturn to_member_name(get<SPIRType>(type.type_alias), index);\n\t}\n\n\tauto &memb = ir.meta[type.self].members;\n\tif (index < memb.size() && !memb[index].alias.empty())\n\t\treturn memb[index].alias;\n\telse\n\t\treturn join(\"_m\", index);\n}\n\nstring CompilerGLSL::to_member_reference(uint32_t, const SPIRType &type, uint32_t index, bool)\n{\n\treturn join(\".\", to_member_name(type, index));\n}\n\nstring CompilerGLSL::to_multi_member_reference(const SPIRType &type, const SmallVector<uint32_t> &indices)\n{\n\tstring ret;\n\tauto *member_type = &type;\n\tfor (auto &index : indices)\n\t{\n\t\tret += join(\".\", to_member_name(*member_type, index));\n\t\tmember_type = &get<SPIRType>(member_type->member_types[index]);\n\t}\n\treturn ret;\n}\n\nvoid CompilerGLSL::add_member_name(SPIRType &type, uint32_t index)\n{\n\tauto &memb = ir.meta[type.self].members;\n\tif (index < memb.size() && !memb[index].alias.empty())\n\t{\n\t\tauto &name = memb[index].alias;\n\t\tif (name.empty())\n\t\t\treturn;\n\n\t\tParsedIR::sanitize_identifier(name, true, true);\n\t\tupdate_name_cache(type.member_name_cache, name);\n\t}\n}\n\n// Checks whether the ID is a row_major matrix that requires conversion before use\nbool CompilerGLSL::is_non_native_row_major_matrix(uint32_t id)\n{\n\t// Natively supported row-major matrices do not need to be converted.\n\t// Legacy targets do not support row major.\n\tif (backend.native_row_major_matrix && !is_legacy())\n\t\treturn false;\n\n\tauto *e = maybe_get<SPIRExpression>(id);\n\tif (e)\n\t\treturn e->need_transpose;\n\telse\n\t\treturn has_decoration(id, DecorationRowMajor);\n}\n\n// Checks whether the member is a row_major matrix that requires conversion before use\nbool CompilerGLSL::member_is_non_native_row_major_matrix(const SPIRType &type, uint32_t index)\n{\n\t// Natively supported row-major matrices do not need to be converted.\n\tif (backend.native_row_major_matrix && !is_legacy())\n\t\treturn false;\n\n\t// Non-matrix or column-major matrix types do not need to be converted.\n\tif (!has_member_decoration(type.self, index, DecorationRowMajor))\n\t\treturn false;\n\n\t// Only square row-major matrices can be converted at this time.\n\t// Converting non-square matrices will require defining custom GLSL function that\n\t// swaps matrix elements while retaining the original dimensional form of the matrix.\n\tconst auto mbr_type = get<SPIRType>(type.member_types[index]);\n\tif (mbr_type.columns != mbr_type.vecsize)\n\t\tSPIRV_CROSS_THROW(\"Row-major matrices must be square on this platform.\");\n\n\treturn true;\n}\n\n// Checks if we need to remap physical type IDs when declaring the type in a buffer.\nbool CompilerGLSL::member_is_remapped_physical_type(const SPIRType &type, uint32_t index) const\n{\n\treturn has_extended_member_decoration(type.self, index, SPIRVCrossDecorationPhysicalTypeID);\n}\n\n// Checks whether the member is in packed data type, that might need to be unpacked.\nbool CompilerGLSL::member_is_packed_physical_type(const SPIRType &type, uint32_t index) const\n{\n\treturn has_extended_member_decoration(type.self, index, SPIRVCrossDecorationPhysicalTypePacked);\n}\n\n// Wraps the expression string in a function call that converts the\n// row_major matrix result of the expression to a column_major matrix.\n// Base implementation uses the standard library transpose() function.\n// Subclasses may override to use a different function.\nstring CompilerGLSL::convert_row_major_matrix(string exp_str, const SPIRType &exp_type, uint32_t /* physical_type_id */,\n                                              bool /*is_packed*/, bool relaxed)\n{\n\tstrip_enclosed_expression(exp_str);\n\tif (!is_matrix(exp_type))\n\t{\n\t\tauto column_index = exp_str.find_last_of('[');\n\t\tif (column_index == string::npos)\n\t\t\treturn exp_str;\n\n\t\tauto column_expr = exp_str.substr(column_index);\n\t\texp_str.resize(column_index);\n\n\t\tauto end_deferred_index = column_expr.find_last_of(']');\n\t\tif (end_deferred_index != string::npos && end_deferred_index + 1 != column_expr.size())\n\t\t{\n\t\t\t// If we have any data member fixups, it must be transposed so that it refers to this index.\n\t\t\t// E.g. [0].data followed by [1] would be shuffled to [1][0].data which is wrong,\n\t\t\t// and needs to be [1].data[0] instead.\n\t\t\tend_deferred_index++;\n\t\t\tcolumn_expr = column_expr.substr(end_deferred_index) +\n\t\t\t              column_expr.substr(0, end_deferred_index);\n\t\t}\n\n\t\tauto transposed_expr = type_to_glsl_constructor(exp_type) + \"(\";\n\n\t\t// Loading a column from a row-major matrix. Unroll the load.\n\t\tfor (uint32_t c = 0; c < exp_type.vecsize; c++)\n\t\t{\n\t\t\ttransposed_expr += join(exp_str, '[', c, ']', column_expr);\n\t\t\tif (c + 1 < exp_type.vecsize)\n\t\t\t\ttransposed_expr += \", \";\n\t\t}\n\n\t\ttransposed_expr += \")\";\n\t\treturn transposed_expr;\n\t}\n\telse if (options.version < 120)\n\t{\n\t\t// GLSL 110, ES 100 do not have transpose(), so emulate it.  Note that\n\t\t// these GLSL versions do not support non-square matrices.\n\t\tif (exp_type.vecsize == 2 && exp_type.columns == 2)\n\t\t\trequire_polyfill(PolyfillTranspose2x2, relaxed);\n\t\telse if (exp_type.vecsize == 3 && exp_type.columns == 3)\n\t\t\trequire_polyfill(PolyfillTranspose3x3, relaxed);\n\t\telse if (exp_type.vecsize == 4 && exp_type.columns == 4)\n\t\t\trequire_polyfill(PolyfillTranspose4x4, relaxed);\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"Non-square matrices are not supported in legacy GLSL, cannot transpose.\");\n\t\treturn join(\"spvTranspose\", (options.es && relaxed) ? \"MP\" : \"\", \"(\", exp_str, \")\");\n\t}\n\telse\n\t\treturn join(\"transpose(\", exp_str, \")\");\n}\n\nstring CompilerGLSL::variable_decl(const SPIRType &type, const string &name, uint32_t id)\n{\n\tstring type_name = type_to_glsl(type, id);\n\tremap_variable_type_name(type, name, type_name);\n\treturn join(type_name, \" \", name, type_to_array_glsl(type));\n}\n\nbool CompilerGLSL::variable_decl_is_remapped_storage(const SPIRVariable &var, StorageClass storage) const\n{\n\treturn var.storage == storage;\n}\n\n// Emit a structure member. Subclasses may override to modify output,\n// or to dynamically add a padding member if needed.\nvoid CompilerGLSL::emit_struct_member(const SPIRType &type, uint32_t member_type_id, uint32_t index,\n                                      const string &qualifier, uint32_t)\n{\n\tauto &membertype = get<SPIRType>(member_type_id);\n\n\tBitset memberflags;\n\tauto &memb = ir.meta[type.self].members;\n\tif (index < memb.size())\n\t\tmemberflags = memb[index].decoration_flags;\n\n\tstring qualifiers;\n\tbool is_block = ir.meta[type.self].decoration.decoration_flags.get(DecorationBlock) ||\n\t                ir.meta[type.self].decoration.decoration_flags.get(DecorationBufferBlock);\n\n\tif (is_block)\n\t\tqualifiers = to_interpolation_qualifiers(memberflags);\n\n\tstatement(layout_for_member(type, index), qualifiers, qualifier, flags_to_qualifiers_glsl(membertype, memberflags),\n\t          variable_decl(membertype, to_member_name(type, index)), \";\");\n}\n\nvoid CompilerGLSL::emit_struct_padding_target(const SPIRType &)\n{\n}\n\nstring CompilerGLSL::flags_to_qualifiers_glsl(const SPIRType &type, const Bitset &flags)\n{\n\t// GL_EXT_buffer_reference variables can be marked as restrict.\n\tif (flags.get(DecorationRestrictPointerEXT))\n\t\treturn \"restrict \";\n\n\tstring qual;\n\n\tif (type_is_floating_point(type) && flags.get(DecorationNoContraction) && backend.support_precise_qualifier)\n\t\tqual = \"precise \";\n\n\t// Structs do not have precision qualifiers, neither do doubles (desktop only anyways, so no mediump/highp).\n\tbool type_supports_precision =\n\t\t\ttype.basetype == SPIRType::Float || type.basetype == SPIRType::Int || type.basetype == SPIRType::UInt ||\n\t\t\ttype.basetype == SPIRType::Image || type.basetype == SPIRType::SampledImage ||\n\t\t\ttype.basetype == SPIRType::Sampler;\n\n\tif (!type_supports_precision)\n\t\treturn qual;\n\n\tif (options.es)\n\t{\n\t\tauto &execution = get_entry_point();\n\n\t\tif (type.basetype == SPIRType::UInt && is_legacy_es())\n\t\t{\n\t\t\t// HACK: This is a bool. See comment in type_to_glsl().\n\t\t\tqual += \"lowp \";\n\t\t}\n\t\telse if (flags.get(DecorationRelaxedPrecision))\n\t\t{\n\t\t\tbool implied_fmediump = type.basetype == SPIRType::Float &&\n\t\t\t                        options.fragment.default_float_precision == Options::Mediump &&\n\t\t\t                        execution.model == ExecutionModelFragment;\n\n\t\t\tbool implied_imediump = (type.basetype == SPIRType::Int || type.basetype == SPIRType::UInt) &&\n\t\t\t                        options.fragment.default_int_precision == Options::Mediump &&\n\t\t\t                        execution.model == ExecutionModelFragment;\n\n\t\t\tqual += (implied_fmediump || implied_imediump) ? \"\" : \"mediump \";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbool implied_fhighp =\n\t\t\t    type.basetype == SPIRType::Float && ((options.fragment.default_float_precision == Options::Highp &&\n\t\t\t                                          execution.model == ExecutionModelFragment) ||\n\t\t\t                                         (execution.model != ExecutionModelFragment));\n\n\t\t\tbool implied_ihighp = (type.basetype == SPIRType::Int || type.basetype == SPIRType::UInt) &&\n\t\t\t                      ((options.fragment.default_int_precision == Options::Highp &&\n\t\t\t                        execution.model == ExecutionModelFragment) ||\n\t\t\t                       (execution.model != ExecutionModelFragment));\n\n\t\t\tqual += (implied_fhighp || implied_ihighp) ? \"\" : \"highp \";\n\t\t}\n\t}\n\telse if (backend.allow_precision_qualifiers)\n\t{\n\t\t// Vulkan GLSL supports precision qualifiers, even in desktop profiles, which is convenient.\n\t\t// The default is highp however, so only emit mediump in the rare case that a shader has these.\n\t\tif (flags.get(DecorationRelaxedPrecision))\n\t\t\tqual += \"mediump \";\n\t}\n\n\treturn qual;\n}\n\nstring CompilerGLSL::to_precision_qualifiers_glsl(uint32_t id)\n{\n\tauto &type = expression_type(id);\n\tbool use_precision_qualifiers = backend.allow_precision_qualifiers;\n\tif (use_precision_qualifiers && (type.basetype == SPIRType::Image || type.basetype == SPIRType::SampledImage))\n\t{\n\t\t// Force mediump for the sampler type. We cannot declare 16-bit or smaller image types.\n\t\tauto &result_type = get<SPIRType>(type.image.type);\n\t\tif (result_type.width < 32)\n\t\t\treturn \"mediump \";\n\t}\n\treturn flags_to_qualifiers_glsl(type, ir.meta[id].decoration.decoration_flags);\n}\n\nvoid CompilerGLSL::fixup_io_block_patch_primitive_qualifiers(const SPIRVariable &var)\n{\n\t// Works around weird behavior in glslangValidator where\n\t// a patch out block is translated to just block members getting the decoration.\n\t// To make glslang not complain when we compile again, we have to transform this back to a case where\n\t// the variable itself has Patch decoration, and not members.\n\t// Same for perprimitiveEXT.\n\tauto &type = get<SPIRType>(var.basetype);\n\tif (has_decoration(type.self, DecorationBlock))\n\t{\n\t\tuint32_t member_count = uint32_t(type.member_types.size());\n\t\tDecoration promoted_decoration = {};\n\t\tbool do_promote_decoration = false;\n\t\tfor (uint32_t i = 0; i < member_count; i++)\n\t\t{\n\t\t\tif (has_member_decoration(type.self, i, DecorationPatch))\n\t\t\t{\n\t\t\t\tpromoted_decoration = DecorationPatch;\n\t\t\t\tdo_promote_decoration = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (has_member_decoration(type.self, i, DecorationPerPrimitiveEXT))\n\t\t\t{\n\t\t\t\tpromoted_decoration = DecorationPerPrimitiveEXT;\n\t\t\t\tdo_promote_decoration = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (do_promote_decoration)\n\t\t{\n\t\t\tset_decoration(var.self, promoted_decoration);\n\t\t\tfor (uint32_t i = 0; i < member_count; i++)\n\t\t\t\tunset_member_decoration(type.self, i, promoted_decoration);\n\t\t}\n\t}\n}\n\nstring CompilerGLSL::to_qualifiers_glsl(uint32_t id)\n{\n\tauto &flags = get_decoration_bitset(id);\n\tstring res;\n\n\tauto *var = maybe_get<SPIRVariable>(id);\n\n\tif (var && var->storage == StorageClassWorkgroup && !backend.shared_is_implied)\n\t\tres += \"shared \";\n\telse if (var && var->storage == StorageClassTaskPayloadWorkgroupEXT && !backend.shared_is_implied)\n\t\tres += \"taskPayloadSharedEXT \";\n\n\tres += to_interpolation_qualifiers(flags);\n\tif (var)\n\t\tres += to_storage_qualifiers_glsl(*var);\n\n\tauto &type = expression_type(id);\n\tif (type.image.dim != DimSubpassData && type.image.sampled == 2)\n\t{\n\t\tif (flags.get(DecorationCoherent))\n\t\t\tres += \"coherent \";\n\t\tif (flags.get(DecorationRestrict))\n\t\t\tres += \"restrict \";\n\n\t\tif (flags.get(DecorationNonWritable))\n\t\t\tres += \"readonly \";\n\n\t\tbool formatted_load = type.image.format == ImageFormatUnknown;\n\t\tif (flags.get(DecorationNonReadable))\n\t\t{\n\t\t\tres += \"writeonly \";\n\t\t\tformatted_load = false;\n\t\t}\n\n\t\tif (formatted_load)\n\t\t{\n\t\t\tif (!options.es)\n\t\t\t\trequire_extension_internal(\"GL_EXT_shader_image_load_formatted\");\n\t\t\telse\n\t\t\t\tSPIRV_CROSS_THROW(\"Cannot use GL_EXT_shader_image_load_formatted in ESSL.\");\n\t\t}\n\t}\n\n\tres += to_precision_qualifiers_glsl(id);\n\n\treturn res;\n}\n\nstring CompilerGLSL::argument_decl(const SPIRFunction::Parameter &arg)\n{\n\t// glslangValidator seems to make all arguments pointer no matter what which is rather bizarre ...\n\tauto &type = expression_type(arg.id);\n\tconst char *direction = \"\";\n\n\tif (type.pointer)\n\t{\n\t\tif (arg.write_count && arg.read_count)\n\t\t\tdirection = \"inout \";\n\t\telse if (arg.write_count)\n\t\t\tdirection = \"out \";\n\t}\n\n\treturn join(direction, to_qualifiers_glsl(arg.id), variable_decl(type, to_name(arg.id), arg.id));\n}\n\nstring CompilerGLSL::to_initializer_expression(const SPIRVariable &var)\n{\n\treturn to_unpacked_expression(var.initializer);\n}\n\nstring CompilerGLSL::to_zero_initialized_expression(uint32_t type_id)\n{\n#ifndef NDEBUG\n\tauto &type = get<SPIRType>(type_id);\n\tassert(type.storage == StorageClassPrivate || type.storage == StorageClassFunction ||\n\t       type.storage == StorageClassGeneric);\n#endif\n\tuint32_t id = ir.increase_bound_by(1);\n\tir.make_constant_null(id, type_id, false);\n\treturn constant_expression(get<SPIRConstant>(id));\n}\n\nbool CompilerGLSL::type_can_zero_initialize(const SPIRType &type) const\n{\n\tif (type.pointer)\n\t\treturn false;\n\n\tif (!type.array.empty() && options.flatten_multidimensional_arrays)\n\t\treturn false;\n\n\tfor (auto &literal : type.array_size_literal)\n\t\tif (!literal)\n\t\t\treturn false;\n\n\tfor (auto &memb : type.member_types)\n\t\tif (!type_can_zero_initialize(get<SPIRType>(memb)))\n\t\t\treturn false;\n\n\treturn true;\n}\n\nstring CompilerGLSL::variable_decl(const SPIRVariable &variable)\n{\n\t// Ignore the pointer type since GLSL doesn't have pointers.\n\tauto &type = get_variable_data_type(variable);\n\n\tif (type.pointer_depth > 1 && !backend.support_pointer_to_pointer)\n\t\tSPIRV_CROSS_THROW(\"Cannot declare pointer-to-pointer types.\");\n\n\tauto res = join(to_qualifiers_glsl(variable.self), variable_decl(type, to_name(variable.self), variable.self));\n\n\tif (variable.loop_variable && variable.static_expression)\n\t{\n\t\tuint32_t expr = variable.static_expression;\n\t\tif (ir.ids[expr].get_type() != TypeUndef)\n\t\t\tres += join(\" = \", to_unpacked_expression(variable.static_expression));\n\t\telse if (options.force_zero_initialized_variables && type_can_zero_initialize(type))\n\t\t\tres += join(\" = \", to_zero_initialized_expression(get_variable_data_type_id(variable)));\n\t}\n\telse if (variable.initializer && !variable_decl_is_remapped_storage(variable, StorageClassWorkgroup))\n\t{\n\t\tuint32_t expr = variable.initializer;\n\t\tif (ir.ids[expr].get_type() != TypeUndef)\n\t\t\tres += join(\" = \", to_initializer_expression(variable));\n\t\telse if (options.force_zero_initialized_variables && type_can_zero_initialize(type))\n\t\t\tres += join(\" = \", to_zero_initialized_expression(get_variable_data_type_id(variable)));\n\t}\n\n\treturn res;\n}\n\nconst char *CompilerGLSL::to_pls_qualifiers_glsl(const SPIRVariable &variable)\n{\n\tauto &flags = get_decoration_bitset(variable.self);\n\tif (flags.get(DecorationRelaxedPrecision))\n\t\treturn \"mediump \";\n\telse\n\t\treturn \"highp \";\n}\n\nstring CompilerGLSL::pls_decl(const PlsRemap &var)\n{\n\tauto &variable = get<SPIRVariable>(var.id);\n\n\tauto op_and_basetype = pls_format_to_basetype(var.format);\n\n\tSPIRType type { op_and_basetype.first };\n\ttype.basetype = op_and_basetype.second;\n\tauto vecsize = pls_format_to_components(var.format);\n\tif (vecsize > 1)\n\t{\n\t\ttype.op = OpTypeVector;\n\t\ttype.vecsize = vecsize;\n\t}\n\n\treturn join(to_pls_layout(var.format), to_pls_qualifiers_glsl(variable), type_to_glsl(type), \" \",\n\t            to_name(variable.self));\n}\n\nuint32_t CompilerGLSL::to_array_size_literal(const SPIRType &type) const\n{\n\treturn to_array_size_literal(type, uint32_t(type.array.size() - 1));\n}\n\nuint32_t CompilerGLSL::to_array_size_literal(const SPIRType &type, uint32_t index) const\n{\n\tassert(type.array.size() == type.array_size_literal.size());\n\n\tif (type.array_size_literal[index])\n\t{\n\t\treturn type.array[index];\n\t}\n\telse\n\t{\n\t\t// Use the default spec constant value.\n\t\t// This is the best we can do.\n\t\treturn evaluate_constant_u32(type.array[index]);\n\t}\n}\n\nstring CompilerGLSL::to_array_size(const SPIRType &type, uint32_t index)\n{\n\tassert(type.array.size() == type.array_size_literal.size());\n\n\tauto &size = type.array[index];\n\tif (!type.array_size_literal[index])\n\t\treturn to_expression(size);\n\telse if (size)\n\t\treturn convert_to_string(size);\n\telse if (!backend.unsized_array_supported)\n\t{\n\t\t// For runtime-sized arrays, we can work around\n\t\t// lack of standard support for this by simply having\n\t\t// a single element array.\n\t\t//\n\t\t// Runtime length arrays must always be the last element\n\t\t// in an interface block.\n\t\treturn \"1\";\n\t}\n\telse\n\t\treturn \"\";\n}\n\nstring CompilerGLSL::type_to_array_glsl(const SPIRType &type)\n{\n\tif (type.pointer && type.storage == StorageClassPhysicalStorageBufferEXT && type.basetype != SPIRType::Struct)\n\t{\n\t\t// We are using a wrapped pointer type, and we should not emit any array declarations here.\n\t\treturn \"\";\n\t}\n\n\tif (type.array.empty())\n\t\treturn \"\";\n\n\tif (options.flatten_multidimensional_arrays)\n\t{\n\t\tstring res;\n\t\tres += \"[\";\n\t\tfor (auto i = uint32_t(type.array.size()); i; i--)\n\t\t{\n\t\t\tres += enclose_expression(to_array_size(type, i - 1));\n\t\t\tif (i > 1)\n\t\t\t\tres += \" * \";\n\t\t}\n\t\tres += \"]\";\n\t\treturn res;\n\t}\n\telse\n\t{\n\t\tif (type.array.size() > 1)\n\t\t{\n\t\t\tif (!options.es && options.version < 430)\n\t\t\t\trequire_extension_internal(\"GL_ARB_arrays_of_arrays\");\n\t\t\telse if (options.es && options.version < 310)\n\t\t\t\tSPIRV_CROSS_THROW(\"Arrays of arrays not supported before ESSL version 310. \"\n\t\t\t\t                  \"Try using --flatten-multidimensional-arrays or set \"\n\t\t\t\t                  \"options.flatten_multidimensional_arrays to true.\");\n\t\t}\n\n\t\tstring res;\n\t\tfor (auto i = uint32_t(type.array.size()); i; i--)\n\t\t{\n\t\t\tres += \"[\";\n\t\t\tres += to_array_size(type, i - 1);\n\t\t\tres += \"]\";\n\t\t}\n\t\treturn res;\n\t}\n}\n\nstring CompilerGLSL::image_type_glsl(const SPIRType &type, uint32_t id)\n{\n\tauto &imagetype = get<SPIRType>(type.image.type);\n\tstring res;\n\n\tswitch (imagetype.basetype)\n\t{\n\tcase SPIRType::Int64:\n\t\tres = \"i64\";\n\t\trequire_extension_internal(\"GL_EXT_shader_image_int64\");\n\t\tbreak;\n\tcase SPIRType::UInt64:\n\t\tres = \"u64\";\n\t\trequire_extension_internal(\"GL_EXT_shader_image_int64\");\n\t\tbreak;\n\tcase SPIRType::Int:\n\tcase SPIRType::Short:\n\tcase SPIRType::SByte:\n\t\tres = \"i\";\n\t\tbreak;\n\tcase SPIRType::UInt:\n\tcase SPIRType::UShort:\n\tcase SPIRType::UByte:\n\t\tres = \"u\";\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\n\t// For half image types, we will force mediump for the sampler, and cast to f16 after any sampling operation.\n\t// We cannot express a true half texture type in GLSL. Neither for short integer formats for that matter.\n\n\tif (type.basetype == SPIRType::Image && type.image.dim == DimSubpassData && options.vulkan_semantics)\n\t\treturn res + \"subpassInput\" + (type.image.ms ? \"MS\" : \"\");\n\telse if (type.basetype == SPIRType::Image && type.image.dim == DimSubpassData &&\n\t         subpass_input_is_framebuffer_fetch(id))\n\t{\n\t\tSPIRType sampled_type = get<SPIRType>(type.image.type);\n\t\tsampled_type.vecsize = 4;\n\t\treturn type_to_glsl(sampled_type);\n\t}\n\n\t// If we're emulating subpassInput with samplers, force sampler2D\n\t// so we don't have to specify format.\n\tif (type.basetype == SPIRType::Image && type.image.dim != DimSubpassData)\n\t{\n\t\t// Sampler buffers are always declared as samplerBuffer even though they might be separate images in the SPIR-V.\n\t\tif (type.image.dim == DimBuffer && type.image.sampled == 1)\n\t\t\tres += \"sampler\";\n\t\telse\n\t\t\tres += type.image.sampled == 2 ? \"image\" : \"texture\";\n\t}\n\telse\n\t\tres += \"sampler\";\n\n\tswitch (type.image.dim)\n\t{\n\tcase Dim1D:\n\t\t// ES doesn't support 1D. Fake it with 2D.\n\t\tres += options.es ? \"2D\" : \"1D\";\n\t\tbreak;\n\tcase Dim2D:\n\t\tres += \"2D\";\n\t\tbreak;\n\tcase Dim3D:\n\t\tres += \"3D\";\n\t\tbreak;\n\tcase DimCube:\n\t\tres += \"Cube\";\n\t\tbreak;\n\tcase DimRect:\n\t\tif (options.es)\n\t\t\tSPIRV_CROSS_THROW(\"Rectangle textures are not supported on OpenGL ES.\");\n\n\t\tif (is_legacy_desktop())\n\t\t\trequire_extension_internal(\"GL_ARB_texture_rectangle\");\n\n\t\tres += \"2DRect\";\n\t\tbreak;\n\n\tcase DimBuffer:\n\t\tif (options.es && options.version < 320)\n\t\t\trequire_extension_internal(\"GL_EXT_texture_buffer\");\n\t\telse if (!options.es && options.version < 300)\n\t\t\trequire_extension_internal(\"GL_EXT_texture_buffer_object\");\n\t\tres += \"Buffer\";\n\t\tbreak;\n\n\tcase DimSubpassData:\n\t\tres += \"2D\";\n\t\tbreak;\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Only 1D, 2D, 2DRect, 3D, Buffer, InputTarget and Cube textures supported.\");\n\t}\n\n\tif (type.image.ms)\n\t\tres += \"MS\";\n\tif (type.image.arrayed)\n\t{\n\t\tif (is_legacy_desktop())\n\t\t\trequire_extension_internal(\"GL_EXT_texture_array\");\n\t\tres += \"Array\";\n\t}\n\n\t// \"Shadow\" state in GLSL only exists for samplers and combined image samplers.\n\tif (((type.basetype == SPIRType::SampledImage) || (type.basetype == SPIRType::Sampler)) &&\n\t    is_depth_image(type, id))\n\t{\n\t\tres += \"Shadow\";\n\n\t\tif (type.image.dim == DimCube && is_legacy())\n\t\t{\n\t\t\tif (!options.es)\n\t\t\t\trequire_extension_internal(\"GL_EXT_gpu_shader4\");\n\t\t\telse\n\t\t\t{\n\t\t\t\trequire_extension_internal(\"GL_NV_shadow_samplers_cube\");\n\t\t\t\tres += \"NV\";\n\t\t\t}\n\t\t}\n\t}\n\n\treturn res;\n}\n\nstring CompilerGLSL::type_to_glsl_constructor(const SPIRType &type)\n{\n\tif (backend.use_array_constructor && type.array.size() > 1)\n\t{\n\t\tif (options.flatten_multidimensional_arrays)\n\t\t\tSPIRV_CROSS_THROW(\"Cannot flatten constructors of multidimensional array constructors, \"\n\t\t\t                  \"e.g. float[][]().\");\n\t\telse if (!options.es && options.version < 430)\n\t\t\trequire_extension_internal(\"GL_ARB_arrays_of_arrays\");\n\t\telse if (options.es && options.version < 310)\n\t\t\tSPIRV_CROSS_THROW(\"Arrays of arrays not supported before ESSL version 310.\");\n\t}\n\n\tauto e = type_to_glsl(type);\n\tif (backend.use_array_constructor)\n\t{\n\t\tfor (uint32_t i = 0; i < type.array.size(); i++)\n\t\t\te += \"[]\";\n\t}\n\treturn e;\n}\n\n// The optional id parameter indicates the object whose type we are trying\n// to find the description for. It is optional. Most type descriptions do not\n// depend on a specific object's use of that type.\nstring CompilerGLSL::type_to_glsl(const SPIRType &type, uint32_t id)\n{\n\tif (type.pointer && type.storage == StorageClassPhysicalStorageBufferEXT && type.basetype != SPIRType::Struct)\n\t{\n\t\t// Need to create a magic type name which compacts the entire type information.\n\t\tstring name = type_to_glsl(get_pointee_type(type));\n\t\tfor (size_t i = 0; i < type.array.size(); i++)\n\t\t{\n\t\t\tif (type.array_size_literal[i])\n\t\t\t\tname += join(type.array[i], \"_\");\n\t\t\telse\n\t\t\t\tname += join(\"id\", type.array[i], \"_\");\n\t\t}\n\t\tname += \"Pointer\";\n\t\treturn name;\n\t}\n\n\tswitch (type.basetype)\n\t{\n\tcase SPIRType::Struct:\n\t\t// Need OpName lookup here to get a \"sensible\" name for a struct.\n\t\tif (backend.explicit_struct_type)\n\t\t\treturn join(\"struct \", to_name(type.self));\n\t\telse\n\t\t\treturn to_name(type.self);\n\n\tcase SPIRType::Image:\n\tcase SPIRType::SampledImage:\n\t\treturn image_type_glsl(type, id);\n\n\tcase SPIRType::Sampler:\n\t\t// The depth field is set by calling code based on the variable ID of the sampler, effectively reintroducing\n\t\t// this distinction into the type system.\n\t\treturn comparison_ids.count(id) ? \"samplerShadow\" : \"sampler\";\n\n\tcase SPIRType::AccelerationStructure:\n\t\treturn ray_tracing_is_khr ? \"accelerationStructureEXT\" : \"accelerationStructureNV\";\n\n\tcase SPIRType::RayQuery:\n\t\treturn \"rayQueryEXT\";\n\n\tcase SPIRType::Void:\n\t\treturn \"void\";\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\tif (type.basetype == SPIRType::UInt && is_legacy())\n\t{\n\t\tif (options.es)\n\t\t\t// HACK: spirv-cross changes bools into uints and generates code which compares them to\n\t\t\t// zero. Input code will have already been validated as not to have contained any uints,\n\t\t\t// so any remaining uints must in fact be bools. However, simply returning \"bool\" here\n\t\t\t// will result in invalid code. Instead, return an int.\n\t\t\treturn backend.basic_int_type;\n\t\telse\n\t\t\trequire_extension_internal(\"GL_EXT_gpu_shader4\");\n\t}\n\n\tif (type.basetype == SPIRType::AtomicCounter)\n\t{\n\t\tif (options.es && options.version < 310)\n\t\t\tSPIRV_CROSS_THROW(\"At least ESSL 3.10 required for atomic counters.\");\n\t\telse if (!options.es && options.version < 420)\n\t\t\trequire_extension_internal(\"GL_ARB_shader_atomic_counters\");\n\t}\n\n\tif (type.vecsize == 1 && type.columns == 1) // Scalar builtin\n\t{\n\t\tswitch (type.basetype)\n\t\t{\n\t\tcase SPIRType::Boolean:\n\t\t\treturn \"bool\";\n\t\tcase SPIRType::SByte:\n\t\t\treturn backend.basic_int8_type;\n\t\tcase SPIRType::UByte:\n\t\t\treturn backend.basic_uint8_type;\n\t\tcase SPIRType::Short:\n\t\t\treturn backend.basic_int16_type;\n\t\tcase SPIRType::UShort:\n\t\t\treturn backend.basic_uint16_type;\n\t\tcase SPIRType::Int:\n\t\t\treturn backend.basic_int_type;\n\t\tcase SPIRType::UInt:\n\t\t\treturn backend.basic_uint_type;\n\t\tcase SPIRType::AtomicCounter:\n\t\t\treturn \"atomic_uint\";\n\t\tcase SPIRType::Half:\n\t\t\treturn \"float16_t\";\n\t\tcase SPIRType::Float:\n\t\t\treturn \"float\";\n\t\tcase SPIRType::Double:\n\t\t\treturn \"double\";\n\t\tcase SPIRType::Int64:\n\t\t\treturn \"int64_t\";\n\t\tcase SPIRType::UInt64:\n\t\t\treturn \"uint64_t\";\n\t\tdefault:\n\t\t\treturn \"???\";\n\t\t}\n\t}\n\telse if (type.vecsize > 1 && type.columns == 1) // Vector builtin\n\t{\n\t\tswitch (type.basetype)\n\t\t{\n\t\tcase SPIRType::Boolean:\n\t\t\treturn join(\"bvec\", type.vecsize);\n\t\tcase SPIRType::SByte:\n\t\t\treturn join(\"i8vec\", type.vecsize);\n\t\tcase SPIRType::UByte:\n\t\t\treturn join(\"u8vec\", type.vecsize);\n\t\tcase SPIRType::Short:\n\t\t\treturn join(\"i16vec\", type.vecsize);\n\t\tcase SPIRType::UShort:\n\t\t\treturn join(\"u16vec\", type.vecsize);\n\t\tcase SPIRType::Int:\n\t\t\treturn join(\"ivec\", type.vecsize);\n\t\tcase SPIRType::UInt:\n\t\t\treturn join(\"uvec\", type.vecsize);\n\t\tcase SPIRType::Half:\n\t\t\treturn join(\"f16vec\", type.vecsize);\n\t\tcase SPIRType::Float:\n\t\t\treturn join(\"vec\", type.vecsize);\n\t\tcase SPIRType::Double:\n\t\t\treturn join(\"dvec\", type.vecsize);\n\t\tcase SPIRType::Int64:\n\t\t\treturn join(\"i64vec\", type.vecsize);\n\t\tcase SPIRType::UInt64:\n\t\t\treturn join(\"u64vec\", type.vecsize);\n\t\tdefault:\n\t\t\treturn \"???\";\n\t\t}\n\t}\n\telse if (type.vecsize == type.columns) // Simple Matrix builtin\n\t{\n\t\tswitch (type.basetype)\n\t\t{\n\t\tcase SPIRType::Boolean:\n\t\t\treturn join(\"bmat\", type.vecsize);\n\t\tcase SPIRType::Int:\n\t\t\treturn join(\"imat\", type.vecsize);\n\t\tcase SPIRType::UInt:\n\t\t\treturn join(\"umat\", type.vecsize);\n\t\tcase SPIRType::Half:\n\t\t\treturn join(\"f16mat\", type.vecsize);\n\t\tcase SPIRType::Float:\n\t\t\treturn join(\"mat\", type.vecsize);\n\t\tcase SPIRType::Double:\n\t\t\treturn join(\"dmat\", type.vecsize);\n\t\t// Matrix types not supported for int64/uint64.\n\t\tdefault:\n\t\t\treturn \"???\";\n\t\t}\n\t}\n\telse\n\t{\n\t\tswitch (type.basetype)\n\t\t{\n\t\tcase SPIRType::Boolean:\n\t\t\treturn join(\"bmat\", type.columns, \"x\", type.vecsize);\n\t\tcase SPIRType::Int:\n\t\t\treturn join(\"imat\", type.columns, \"x\", type.vecsize);\n\t\tcase SPIRType::UInt:\n\t\t\treturn join(\"umat\", type.columns, \"x\", type.vecsize);\n\t\tcase SPIRType::Half:\n\t\t\treturn join(\"f16mat\", type.columns, \"x\", type.vecsize);\n\t\tcase SPIRType::Float:\n\t\t\treturn join(\"mat\", type.columns, \"x\", type.vecsize);\n\t\tcase SPIRType::Double:\n\t\t\treturn join(\"dmat\", type.columns, \"x\", type.vecsize);\n\t\t// Matrix types not supported for int64/uint64.\n\t\tdefault:\n\t\t\treturn \"???\";\n\t\t}\n\t}\n}\n\nvoid CompilerGLSL::add_variable(unordered_set<string> &variables_primary,\n                                const unordered_set<string> &variables_secondary, string &name)\n{\n\tif (name.empty())\n\t\treturn;\n\n\tParsedIR::sanitize_underscores(name);\n\tif (ParsedIR::is_globally_reserved_identifier(name, true))\n\t{\n\t\tname.clear();\n\t\treturn;\n\t}\n\n\tupdate_name_cache(variables_primary, variables_secondary, name);\n}\n\nvoid CompilerGLSL::add_local_variable_name(uint32_t id)\n{\n\tadd_variable(local_variable_names, block_names, ir.meta[id].decoration.alias);\n}\n\nvoid CompilerGLSL::add_resource_name(uint32_t id)\n{\n\tadd_variable(resource_names, block_names, ir.meta[id].decoration.alias);\n}\n\nvoid CompilerGLSL::add_header_line(const std::string &line)\n{\n\theader_lines.push_back(line);\n}\n\nbool CompilerGLSL::has_extension(const std::string &ext) const\n{\n\tauto itr = find(begin(forced_extensions), end(forced_extensions), ext);\n\treturn itr != end(forced_extensions);\n}\n\nvoid CompilerGLSL::require_extension(const std::string &ext)\n{\n\tif (!has_extension(ext))\n\t\tforced_extensions.push_back(ext);\n}\n\nconst SmallVector<std::string> &CompilerGLSL::get_required_extensions() const\n{\n\treturn forced_extensions;\n}\n\nvoid CompilerGLSL::require_extension_internal(const string &ext)\n{\n\tif (backend.supports_extensions && !has_extension(ext))\n\t{\n\t\tforced_extensions.push_back(ext);\n\t\tforce_recompile();\n\t}\n}\n\nvoid CompilerGLSL::flatten_buffer_block(VariableID id)\n{\n\tauto &var = get<SPIRVariable>(id);\n\tauto &type = get<SPIRType>(var.basetype);\n\tauto name = to_name(type.self, false);\n\tauto &flags = get_decoration_bitset(type.self);\n\n\tif (!type.array.empty())\n\t\tSPIRV_CROSS_THROW(name + \" is an array of UBOs.\");\n\tif (type.basetype != SPIRType::Struct)\n\t\tSPIRV_CROSS_THROW(name + \" is not a struct.\");\n\tif (!flags.get(DecorationBlock))\n\t\tSPIRV_CROSS_THROW(name + \" is not a block.\");\n\tif (type.member_types.empty())\n\t\tSPIRV_CROSS_THROW(name + \" is an empty struct.\");\n\n\tflattened_buffer_blocks.insert(id);\n}\n\nbool CompilerGLSL::builtin_translates_to_nonarray(spv::BuiltIn /*builtin*/) const\n{\n\treturn false; // GLSL itself does not need to translate array builtin types to non-array builtin types\n}\n\nbool CompilerGLSL::is_user_type_structured(uint32_t /*id*/) const\n{\n\treturn false; // GLSL itself does not have structured user type, but HLSL does with StructuredBuffer and RWStructuredBuffer resources.\n}\n\nbool CompilerGLSL::check_atomic_image(uint32_t id)\n{\n\tauto &type = expression_type(id);\n\tif (type.storage == StorageClassImage)\n\t{\n\t\tif (options.es && options.version < 320)\n\t\t\trequire_extension_internal(\"GL_OES_shader_image_atomic\");\n\n\t\tauto *var = maybe_get_backing_variable(id);\n\t\tif (var)\n\t\t{\n\t\t\tif (has_decoration(var->self, DecorationNonWritable) || has_decoration(var->self, DecorationNonReadable))\n\t\t\t{\n\t\t\t\tunset_decoration(var->self, DecorationNonWritable);\n\t\t\t\tunset_decoration(var->self, DecorationNonReadable);\n\t\t\t\tforce_recompile();\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\telse\n\t\treturn false;\n}\n\nvoid CompilerGLSL::add_function_overload(const SPIRFunction &func)\n{\n\tHasher hasher;\n\tfor (auto &arg : func.arguments)\n\t{\n\t\t// Parameters can vary with pointer type or not,\n\t\t// but that will not change the signature in GLSL/HLSL,\n\t\t// so strip the pointer type before hashing.\n\t\tuint32_t type_id = get_pointee_type_id(arg.type);\n\t\tauto &type = get<SPIRType>(type_id);\n\n\t\tif (!combined_image_samplers.empty())\n\t\t{\n\t\t\t// If we have combined image samplers, we cannot really trust the image and sampler arguments\n\t\t\t// we pass down to callees, because they may be shuffled around.\n\t\t\t// Ignore these arguments, to make sure that functions need to differ in some other way\n\t\t\t// to be considered different overloads.\n\t\t\tif (type.basetype == SPIRType::SampledImage ||\n\t\t\t    (type.basetype == SPIRType::Image && type.image.sampled == 1) || type.basetype == SPIRType::Sampler)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\thasher.u32(type_id);\n\t}\n\tuint64_t types_hash = hasher.get();\n\n\tauto function_name = to_name(func.self);\n\tauto itr = function_overloads.find(function_name);\n\tif (itr != end(function_overloads))\n\t{\n\t\t// There exists a function with this name already.\n\t\tauto &overloads = itr->second;\n\t\tif (overloads.count(types_hash) != 0)\n\t\t{\n\t\t\t// Overload conflict, assign a new name.\n\t\t\tadd_resource_name(func.self);\n\t\t\tfunction_overloads[to_name(func.self)].insert(types_hash);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Can reuse the name.\n\t\t\toverloads.insert(types_hash);\n\t\t}\n\t}\n\telse\n\t{\n\t\t// First time we see this function name.\n\t\tadd_resource_name(func.self);\n\t\tfunction_overloads[to_name(func.self)].insert(types_hash);\n\t}\n}\n\nvoid CompilerGLSL::emit_function_prototype(SPIRFunction &func, const Bitset &return_flags)\n{\n\tif (func.self != ir.default_entry_point)\n\t\tadd_function_overload(func);\n\n\t// Avoid shadow declarations.\n\tlocal_variable_names = resource_names;\n\n\tstring decl;\n\n\tauto &type = get<SPIRType>(func.return_type);\n\tdecl += flags_to_qualifiers_glsl(type, return_flags);\n\tdecl += type_to_glsl(type);\n\tdecl += type_to_array_glsl(type);\n\tdecl += \" \";\n\n\tif (func.self == ir.default_entry_point)\n\t{\n\t\t// If we need complex fallback in GLSL, we just wrap main() in a function\n\t\t// and interlock the entire shader ...\n\t\tif (interlocked_is_complex)\n\t\t\tdecl += \"spvMainInterlockedBody\";\n\t\telse\n\t\t\tdecl += \"main\";\n\n\t\tprocessing_entry_point = true;\n\t}\n\telse\n\t\tdecl += to_name(func.self);\n\n\tdecl += \"(\";\n\tSmallVector<string> arglist;\n\tfor (auto &arg : func.arguments)\n\t{\n\t\t// Do not pass in separate images or samplers if we're remapping\n\t\t// to combined image samplers.\n\t\tif (skip_argument(arg.id))\n\t\t\tcontinue;\n\n\t\t// Might change the variable name if it already exists in this function.\n\t\t// SPIRV OpName doesn't have any semantic effect, so it's valid for an implementation\n\t\t// to use same name for variables.\n\t\t// Since we want to make the GLSL debuggable and somewhat sane, use fallback names for variables which are duplicates.\n\t\tadd_local_variable_name(arg.id);\n\n\t\targlist.push_back(argument_decl(arg));\n\n\t\t// Hold a pointer to the parameter so we can invalidate the readonly field if needed.\n\t\tauto *var = maybe_get<SPIRVariable>(arg.id);\n\t\tif (var)\n\t\t\tvar->parameter = &arg;\n\t}\n\n\tfor (auto &arg : func.shadow_arguments)\n\t{\n\t\t// Might change the variable name if it already exists in this function.\n\t\t// SPIRV OpName doesn't have any semantic effect, so it's valid for an implementation\n\t\t// to use same name for variables.\n\t\t// Since we want to make the GLSL debuggable and somewhat sane, use fallback names for variables which are duplicates.\n\t\tadd_local_variable_name(arg.id);\n\n\t\targlist.push_back(argument_decl(arg));\n\n\t\t// Hold a pointer to the parameter so we can invalidate the readonly field if needed.\n\t\tauto *var = maybe_get<SPIRVariable>(arg.id);\n\t\tif (var)\n\t\t\tvar->parameter = &arg;\n\t}\n\n\tdecl += merge(arglist);\n\tdecl += \")\";\n\tstatement(decl);\n}\n\nvoid CompilerGLSL::emit_function(SPIRFunction &func, const Bitset &return_flags)\n{\n\t// Avoid potential cycles.\n\tif (func.active)\n\t\treturn;\n\tfunc.active = true;\n\n\t// If we depend on a function, emit that function before we emit our own function.\n\tfor (auto block : func.blocks)\n\t{\n\t\tauto &b = get<SPIRBlock>(block);\n\t\tfor (auto &i : b.ops)\n\t\t{\n\t\t\tauto ops = stream(i);\n\t\t\tauto op = static_cast<Op>(i.op);\n\n\t\t\tif (op == OpFunctionCall)\n\t\t\t{\n\t\t\t\t// Recursively emit functions which are called.\n\t\t\t\tuint32_t id = ops[2];\n\t\t\t\temit_function(get<SPIRFunction>(id), ir.meta[ops[1]].decoration.decoration_flags);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (func.entry_line.file_id != 0)\n\t\temit_line_directive(func.entry_line.file_id, func.entry_line.line_literal);\n\temit_function_prototype(func, return_flags);\n\tbegin_scope();\n\n\tif (func.self == ir.default_entry_point)\n\t\temit_entry_point_declarations();\n\n\tcurrent_function = &func;\n\tauto &entry_block = get<SPIRBlock>(func.entry_block);\n\n\tsort(begin(func.constant_arrays_needed_on_stack), end(func.constant_arrays_needed_on_stack));\n\tfor (auto &array : func.constant_arrays_needed_on_stack)\n\t{\n\t\tauto &c = get<SPIRConstant>(array);\n\t\tauto &type = get<SPIRType>(c.constant_type);\n\t\tstatement(variable_decl(type, join(\"_\", array, \"_array_copy\")), \" = \", constant_expression(c), \";\");\n\t}\n\n\tfor (auto &v : func.local_variables)\n\t{\n\t\tauto &var = get<SPIRVariable>(v);\n\t\tvar.deferred_declaration = false;\n\n\t\tif (variable_decl_is_remapped_storage(var, StorageClassWorkgroup))\n\t\t{\n\t\t\t// Special variable type which cannot have initializer,\n\t\t\t// need to be declared as standalone variables.\n\t\t\t// Comes from MSL which can push global variables as local variables in main function.\n\t\t\tadd_local_variable_name(var.self);\n\t\t\tstatement(variable_decl(var), \";\");\n\t\t\tvar.deferred_declaration = false;\n\t\t}\n\t\telse if (var.storage == StorageClassPrivate)\n\t\t{\n\t\t\t// These variables will not have had their CFG usage analyzed, so move it to the entry block.\n\t\t\t// Comes from MSL which can push global variables as local variables in main function.\n\t\t\t// We could just declare them right now, but we would miss out on an important initialization case which is\n\t\t\t// LUT declaration in MSL.\n\t\t\t// If we don't declare the variable when it is assigned we're forced to go through a helper function\n\t\t\t// which copies elements one by one.\n\t\t\tadd_local_variable_name(var.self);\n\n\t\t\tif (var.initializer)\n\t\t\t{\n\t\t\t\tstatement(variable_decl(var), \";\");\n\t\t\t\tvar.deferred_declaration = false;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tauto &dominated = entry_block.dominated_variables;\n\t\t\t\tif (find(begin(dominated), end(dominated), var.self) == end(dominated))\n\t\t\t\t\tentry_block.dominated_variables.push_back(var.self);\n\t\t\t\tvar.deferred_declaration = true;\n\t\t\t}\n\t\t}\n\t\telse if (var.storage == StorageClassFunction && var.remapped_variable && var.static_expression)\n\t\t{\n\t\t\t// No need to declare this variable, it has a static expression.\n\t\t\tvar.deferred_declaration = false;\n\t\t}\n\t\telse if (expression_is_lvalue(v))\n\t\t{\n\t\t\tadd_local_variable_name(var.self);\n\n\t\t\t// Loop variables should never be declared early, they are explicitly emitted in a loop.\n\t\t\tif (var.initializer && !var.loop_variable)\n\t\t\t\tstatement(variable_decl_function_local(var), \";\");\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Don't declare variable until first use to declutter the GLSL output quite a lot.\n\t\t\t\t// If we don't touch the variable before first branch,\n\t\t\t\t// declare it then since we need variable declaration to be in top scope.\n\t\t\t\tvar.deferred_declaration = true;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// HACK: SPIR-V in older glslang output likes to use samplers and images as local variables, but GLSL does not allow this.\n\t\t\t// For these types (non-lvalue), we enforce forwarding through a shadowed variable.\n\t\t\t// This means that when we OpStore to these variables, we just write in the expression ID directly.\n\t\t\t// This breaks any kind of branching, since the variable must be statically assigned.\n\t\t\t// Branching on samplers and images would be pretty much impossible to fake in GLSL.\n\t\t\tvar.statically_assigned = true;\n\t\t}\n\n\t\tvar.loop_variable_enable = false;\n\n\t\t// Loop variables are never declared outside their for-loop, so block any implicit declaration.\n\t\tif (var.loop_variable)\n\t\t{\n\t\t\tvar.deferred_declaration = false;\n\t\t\t// Need to reset the static expression so we can fallback to initializer if need be.\n\t\t\tvar.static_expression = 0;\n\t\t}\n\t}\n\n\t// Enforce declaration order for regression testing purposes.\n\tfor (auto &block_id : func.blocks)\n\t{\n\t\tauto &block = get<SPIRBlock>(block_id);\n\t\tsort(begin(block.dominated_variables), end(block.dominated_variables));\n\t}\n\n\tfor (auto &line : current_function->fixup_hooks_in)\n\t\tline();\n\n\temit_block_chain(entry_block);\n\n\tend_scope();\n\tprocessing_entry_point = false;\n\tstatement(\"\");\n\n\t// Make sure deferred declaration state for local variables is cleared when we are done with function.\n\t// We risk declaring Private/Workgroup variables in places we are not supposed to otherwise.\n\tfor (auto &v : func.local_variables)\n\t{\n\t\tauto &var = get<SPIRVariable>(v);\n\t\tvar.deferred_declaration = false;\n\t}\n}\n\nvoid CompilerGLSL::emit_fixup()\n{\n\tif (is_vertex_like_shader())\n\t{\n\t\tif (options.vertex.fixup_clipspace)\n\t\t{\n\t\t\tconst char *suffix = backend.float_literal_suffix ? \"f\" : \"\";\n\t\t\tstatement(\"gl_Position.z = 2.0\", suffix, \" * gl_Position.z - gl_Position.w;\");\n\t\t}\n\n\t\tif (options.vertex.flip_vert_y)\n\t\t\tstatement(\"gl_Position.y = -gl_Position.y;\");\n\t}\n}\n\nvoid CompilerGLSL::flush_phi(BlockID from, BlockID to)\n{\n\tauto &child = get<SPIRBlock>(to);\n\tif (child.ignore_phi_from_block == from)\n\t\treturn;\n\n\tunordered_set<uint32_t> temporary_phi_variables;\n\n\tfor (auto itr = begin(child.phi_variables); itr != end(child.phi_variables); ++itr)\n\t{\n\t\tauto &phi = *itr;\n\n\t\tif (phi.parent == from)\n\t\t{\n\t\t\tauto &var = get<SPIRVariable>(phi.function_variable);\n\n\t\t\t// A Phi variable might be a loop variable, so flush to static expression.\n\t\t\tif (var.loop_variable && !var.loop_variable_enable)\n\t\t\t\tvar.static_expression = phi.local_variable;\n\t\t\telse\n\t\t\t{\n\t\t\t\tflush_variable_declaration(phi.function_variable);\n\n\t\t\t\t// Check if we are going to write to a Phi variable that another statement will read from\n\t\t\t\t// as part of another Phi node in our target block.\n\t\t\t\t// For this case, we will need to copy phi.function_variable to a temporary, and use that for future reads.\n\t\t\t\t// This is judged to be extremely rare, so deal with it here using a simple, but suboptimal algorithm.\n\t\t\t\tbool need_saved_temporary =\n\t\t\t\t    find_if(itr + 1, end(child.phi_variables), [&](const SPIRBlock::Phi &future_phi) -> bool {\n\t\t\t\t\t    return future_phi.local_variable == ID(phi.function_variable) && future_phi.parent == from;\n\t\t\t\t    }) != end(child.phi_variables);\n\n\t\t\t\tif (need_saved_temporary)\n\t\t\t\t{\n\t\t\t\t\t// Need to make sure we declare the phi variable with a copy at the right scope.\n\t\t\t\t\t// We cannot safely declare a temporary here since we might be inside a continue block.\n\t\t\t\t\tif (!var.allocate_temporary_copy)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar.allocate_temporary_copy = true;\n\t\t\t\t\t\tforce_recompile();\n\t\t\t\t\t}\n\t\t\t\t\tstatement(\"_\", phi.function_variable, \"_copy\", \" = \", to_name(phi.function_variable), \";\");\n\t\t\t\t\ttemporary_phi_variables.insert(phi.function_variable);\n\t\t\t\t}\n\n\t\t\t\t// This might be called in continue block, so make sure we\n\t\t\t\t// use this to emit ESSL 1.0 compliant increments/decrements.\n\t\t\t\tauto lhs = to_expression(phi.function_variable);\n\n\t\t\t\tstring rhs;\n\t\t\t\tif (temporary_phi_variables.count(phi.local_variable))\n\t\t\t\t\trhs = join(\"_\", phi.local_variable, \"_copy\");\n\t\t\t\telse\n\t\t\t\t\trhs = to_pointer_expression(phi.local_variable);\n\n\t\t\t\tif (!optimize_read_modify_write(get<SPIRType>(var.basetype), lhs, rhs))\n\t\t\t\t\tstatement(lhs, \" = \", rhs, \";\");\n\t\t\t}\n\n\t\t\tregister_write(phi.function_variable);\n\t\t}\n\t}\n}\n\nvoid CompilerGLSL::branch_to_continue(BlockID from, BlockID to)\n{\n\tauto &to_block = get<SPIRBlock>(to);\n\tif (from == to)\n\t\treturn;\n\n\tassert(is_continue(to));\n\tif (to_block.complex_continue)\n\t{\n\t\t// Just emit the whole block chain as is.\n\t\tauto usage_counts = expression_usage_counts;\n\n\t\temit_block_chain(to_block);\n\n\t\t// Expression usage counts are moot after returning from the continue block.\n\t\texpression_usage_counts = usage_counts;\n\t}\n\telse\n\t{\n\t\tauto &from_block = get<SPIRBlock>(from);\n\t\tbool outside_control_flow = false;\n\t\tuint32_t loop_dominator = 0;\n\n\t\t// FIXME: Refactor this to not use the old loop_dominator tracking.\n\t\tif (from_block.merge_block)\n\t\t{\n\t\t\t// If we are a loop header, we don't set the loop dominator,\n\t\t\t// so just use \"self\" here.\n\t\t\tloop_dominator = from;\n\t\t}\n\t\telse if (from_block.loop_dominator != BlockID(SPIRBlock::NoDominator))\n\t\t{\n\t\t\tloop_dominator = from_block.loop_dominator;\n\t\t}\n\n\t\tif (loop_dominator != 0)\n\t\t{\n\t\t\tauto &cfg = get_cfg_for_current_function();\n\n\t\t\t// For non-complex continue blocks, we implicitly branch to the continue block\n\t\t\t// by having the continue block be part of the loop header in for (; ; continue-block).\n\t\t\toutside_control_flow = cfg.node_terminates_control_flow_in_sub_graph(loop_dominator, from);\n\t\t}\n\n\t\t// Some simplification for for-loops. We always end up with a useless continue;\n\t\t// statement since we branch to a loop block.\n\t\t// Walk the CFG, if we unconditionally execute the block calling continue assuming we're in the loop block,\n\t\t// we can avoid writing out an explicit continue statement.\n\t\t// Similar optimization to return statements if we know we're outside flow control.\n\t\tif (!outside_control_flow)\n\t\t\tstatement(\"continue;\");\n\t}\n}\n\nvoid CompilerGLSL::branch(BlockID from, BlockID to)\n{\n\tflush_phi(from, to);\n\tflush_control_dependent_expressions(from);\n\n\tbool to_is_continue = is_continue(to);\n\n\t// This is only a continue if we branch to our loop dominator.\n\tif ((ir.block_meta[to] & ParsedIR::BLOCK_META_LOOP_HEADER_BIT) != 0 && get<SPIRBlock>(from).loop_dominator == to)\n\t{\n\t\t// This can happen if we had a complex continue block which was emitted.\n\t\t// Once the continue block tries to branch to the loop header, just emit continue;\n\t\t// and end the chain here.\n\t\tstatement(\"continue;\");\n\t}\n\telse if (from != to && is_break(to))\n\t{\n\t\t// We cannot break to ourselves, so check explicitly for from != to.\n\t\t// This case can trigger if a loop header is all three of these things:\n\t\t// - Continue block\n\t\t// - Loop header\n\t\t// - Break merge target all at once ...\n\n\t\t// Very dirty workaround.\n\t\t// Switch constructs are able to break, but they cannot break out of a loop at the same time,\n\t\t// yet SPIR-V allows it.\n\t\t// Only sensible solution is to make a ladder variable, which we declare at the top of the switch block,\n\t\t// write to the ladder here, and defer the break.\n\t\t// The loop we're breaking out of must dominate the switch block, or there is no ladder breaking case.\n\t\tif (is_loop_break(to))\n\t\t{\n\t\t\tfor (size_t n = current_emitting_switch_stack.size(); n; n--)\n\t\t\t{\n\t\t\t\tauto *current_emitting_switch = current_emitting_switch_stack[n - 1];\n\n\t\t\t\tif (current_emitting_switch &&\n\t\t\t\t    current_emitting_switch->loop_dominator != BlockID(SPIRBlock::NoDominator) &&\n\t\t\t\t    get<SPIRBlock>(current_emitting_switch->loop_dominator).merge_block == to)\n\t\t\t\t{\n\t\t\t\t\tif (!current_emitting_switch->need_ladder_break)\n\t\t\t\t\t{\n\t\t\t\t\t\tforce_recompile();\n\t\t\t\t\t\tcurrent_emitting_switch->need_ladder_break = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tstatement(\"_\", current_emitting_switch->self, \"_ladder_break = true;\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tstatement(\"break;\");\n\t}\n\telse if (to_is_continue || from == to)\n\t{\n\t\t// For from == to case can happen for a do-while loop which branches into itself.\n\t\t// We don't mark these cases as continue blocks, but the only possible way to branch into\n\t\t// ourselves is through means of continue blocks.\n\n\t\t// If we are merging to a continue block, there is no need to emit the block chain for continue here.\n\t\t// We can branch to the continue block after we merge execution.\n\n\t\t// Here we make use of structured control flow rules from spec:\n\t\t// 2.11: - the merge block declared by a header block cannot be a merge block declared by any other header block\n\t\t//       - each header block must strictly dominate its merge block, unless the merge block is unreachable in the CFG\n\t\t// If we are branching to a merge block, we must be inside a construct which dominates the merge block.\n\t\tauto &block_meta = ir.block_meta[to];\n\t\tbool branching_to_merge =\n\t\t    (block_meta & (ParsedIR::BLOCK_META_SELECTION_MERGE_BIT | ParsedIR::BLOCK_META_MULTISELECT_MERGE_BIT |\n\t\t                   ParsedIR::BLOCK_META_LOOP_MERGE_BIT)) != 0;\n\t\tif (!to_is_continue || !branching_to_merge)\n\t\t\tbranch_to_continue(from, to);\n\t}\n\telse if (!is_conditional(to))\n\t\temit_block_chain(get<SPIRBlock>(to));\n\n\t// It is important that we check for break before continue.\n\t// A block might serve two purposes, a break block for the inner scope, and\n\t// a continue block in the outer scope.\n\t// Inner scope always takes precedence.\n}\n\nvoid CompilerGLSL::branch(BlockID from, uint32_t cond, BlockID true_block, BlockID false_block)\n{\n\tauto &from_block = get<SPIRBlock>(from);\n\tBlockID merge_block = from_block.merge == SPIRBlock::MergeSelection ? from_block.next_block : BlockID(0);\n\n\t// If we branch directly to our selection merge target, we don't need a code path.\n\tbool true_block_needs_code = true_block != merge_block || flush_phi_required(from, true_block);\n\tbool false_block_needs_code = false_block != merge_block || flush_phi_required(from, false_block);\n\n\tif (!true_block_needs_code && !false_block_needs_code)\n\t\treturn;\n\n\t// We might have a loop merge here. Only consider selection flattening constructs.\n\t// Loop hints are handled explicitly elsewhere.\n\tif (from_block.hint == SPIRBlock::HintFlatten || from_block.hint == SPIRBlock::HintDontFlatten)\n\t\temit_block_hints(from_block);\n\n\tif (true_block_needs_code)\n\t{\n\t\tstatement(\"if (\", to_expression(cond), \")\");\n\t\tbegin_scope();\n\t\tbranch(from, true_block);\n\t\tend_scope();\n\n\t\tif (false_block_needs_code)\n\t\t{\n\t\t\tstatement(\"else\");\n\t\t\tbegin_scope();\n\t\t\tbranch(from, false_block);\n\t\t\tend_scope();\n\t\t}\n\t}\n\telse if (false_block_needs_code)\n\t{\n\t\t// Only need false path, use negative conditional.\n\t\tstatement(\"if (!\", to_enclosed_expression(cond), \")\");\n\t\tbegin_scope();\n\t\tbranch(from, false_block);\n\t\tend_scope();\n\t}\n}\n\n// FIXME: This currently cannot handle complex continue blocks\n// as in do-while.\n// This should be seen as a \"trivial\" continue block.\nstring CompilerGLSL::emit_continue_block(uint32_t continue_block, bool follow_true_block, bool follow_false_block)\n{\n\tauto *block = &get<SPIRBlock>(continue_block);\n\n\t// While emitting the continue block, declare_temporary will check this\n\t// if we have to emit temporaries.\n\tcurrent_continue_block = block;\n\n\tSmallVector<string> statements;\n\n\t// Capture all statements into our list.\n\tauto *old = redirect_statement;\n\tredirect_statement = &statements;\n\n\t// Stamp out all blocks one after each other.\n\twhile ((ir.block_meta[block->self] & ParsedIR::BLOCK_META_LOOP_HEADER_BIT) == 0)\n\t{\n\t\t// Write out all instructions we have in this block.\n\t\temit_block_instructions(*block);\n\n\t\t// For plain branchless for/while continue blocks.\n\t\tif (block->next_block)\n\t\t{\n\t\t\tflush_phi(continue_block, block->next_block);\n\t\t\tblock = &get<SPIRBlock>(block->next_block);\n\t\t}\n\t\t// For do while blocks. The last block will be a select block.\n\t\telse if (block->true_block && follow_true_block)\n\t\t{\n\t\t\tflush_phi(continue_block, block->true_block);\n\t\t\tblock = &get<SPIRBlock>(block->true_block);\n\t\t}\n\t\telse if (block->false_block && follow_false_block)\n\t\t{\n\t\t\tflush_phi(continue_block, block->false_block);\n\t\t\tblock = &get<SPIRBlock>(block->false_block);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSPIRV_CROSS_THROW(\"Invalid continue block detected!\");\n\t\t}\n\t}\n\n\t// Restore old pointer.\n\tredirect_statement = old;\n\n\t// Somewhat ugly, strip off the last ';' since we use ',' instead.\n\t// Ideally, we should select this behavior in statement().\n\tfor (auto &s : statements)\n\t{\n\t\tif (!s.empty() && s.back() == ';')\n\t\t\ts.erase(s.size() - 1, 1);\n\t}\n\n\tcurrent_continue_block = nullptr;\n\treturn merge(statements);\n}\n\nvoid CompilerGLSL::emit_while_loop_initializers(const SPIRBlock &block)\n{\n\t// While loops do not take initializers, so declare all of them outside.\n\tfor (auto &loop_var : block.loop_variables)\n\t{\n\t\tauto &var = get<SPIRVariable>(loop_var);\n\t\tstatement(variable_decl(var), \";\");\n\t}\n}\n\nstring CompilerGLSL::emit_for_loop_initializers(const SPIRBlock &block)\n{\n\tif (block.loop_variables.empty())\n\t\treturn \"\";\n\n\tbool same_types = for_loop_initializers_are_same_type(block);\n\t// We can only declare for loop initializers if all variables are of same type.\n\t// If we cannot do this, declare individual variables before the loop header.\n\n\t// We might have a loop variable candidate which was not assigned to for some reason.\n\tuint32_t missing_initializers = 0;\n\tfor (auto &variable : block.loop_variables)\n\t{\n\t\tuint32_t expr = get<SPIRVariable>(variable).static_expression;\n\n\t\t// Sometimes loop variables are initialized with OpUndef, but we can just declare\n\t\t// a plain variable without initializer in this case.\n\t\tif (expr == 0 || ir.ids[expr].get_type() == TypeUndef)\n\t\t\tmissing_initializers++;\n\t}\n\n\tif (block.loop_variables.size() == 1 && missing_initializers == 0)\n\t{\n\t\treturn variable_decl(get<SPIRVariable>(block.loop_variables.front()));\n\t}\n\telse if (!same_types || missing_initializers == uint32_t(block.loop_variables.size()))\n\t{\n\t\tfor (auto &loop_var : block.loop_variables)\n\t\t\tstatement(variable_decl(get<SPIRVariable>(loop_var)), \";\");\n\t\treturn \"\";\n\t}\n\telse\n\t{\n\t\t// We have a mix of loop variables, either ones with a clear initializer, or ones without.\n\t\t// Separate the two streams.\n\t\tstring expr;\n\n\t\tfor (auto &loop_var : block.loop_variables)\n\t\t{\n\t\t\tuint32_t static_expr = get<SPIRVariable>(loop_var).static_expression;\n\t\t\tif (static_expr == 0 || ir.ids[static_expr].get_type() == TypeUndef)\n\t\t\t{\n\t\t\t\tstatement(variable_decl(get<SPIRVariable>(loop_var)), \";\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tauto &var = get<SPIRVariable>(loop_var);\n\t\t\t\tauto &type = get_variable_data_type(var);\n\t\t\t\tif (expr.empty())\n\t\t\t\t{\n\t\t\t\t\t// For loop initializers are of the form <type id = value, id = value, id = value, etc ...\n\t\t\t\t\texpr = join(to_qualifiers_glsl(var.self), type_to_glsl(type), \" \");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\texpr += \", \";\n\t\t\t\t\t// In MSL, being based on C++, the asterisk marking a pointer\n\t\t\t\t\t// binds to the identifier, not the type.\n\t\t\t\t\tif (type.pointer)\n\t\t\t\t\t\texpr += \"* \";\n\t\t\t\t}\n\n\t\t\t\texpr += join(to_name(loop_var), \" = \", to_pointer_expression(var.static_expression));\n\t\t\t}\n\t\t}\n\t\treturn expr;\n\t}\n}\n\nbool CompilerGLSL::for_loop_initializers_are_same_type(const SPIRBlock &block)\n{\n\tif (block.loop_variables.size() <= 1)\n\t\treturn true;\n\n\tuint32_t expected = 0;\n\tBitset expected_flags;\n\tfor (auto &var : block.loop_variables)\n\t{\n\t\t// Don't care about uninitialized variables as they will not be part of the initializers.\n\t\tuint32_t expr = get<SPIRVariable>(var).static_expression;\n\t\tif (expr == 0 || ir.ids[expr].get_type() == TypeUndef)\n\t\t\tcontinue;\n\n\t\tif (expected == 0)\n\t\t{\n\t\t\texpected = get<SPIRVariable>(var).basetype;\n\t\t\texpected_flags = get_decoration_bitset(var);\n\t\t}\n\t\telse if (expected != get<SPIRVariable>(var).basetype)\n\t\t\treturn false;\n\n\t\t// Precision flags and things like that must also match.\n\t\tif (expected_flags != get_decoration_bitset(var))\n\t\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nvoid CompilerGLSL::emit_block_instructions_with_masked_debug(SPIRBlock &block)\n{\n\t// Have to block debug instructions such as OpLine here, since it will be treated as a statement otherwise,\n\t// which breaks loop optimizations.\n\t// Any line directive would be declared outside the loop body, which would just be confusing either way.\n\tbool old_block_debug_directives = block_debug_directives;\n\tblock_debug_directives = true;\n\temit_block_instructions(block);\n\tblock_debug_directives = old_block_debug_directives;\n}\n\nbool CompilerGLSL::attempt_emit_loop_header(SPIRBlock &block, SPIRBlock::Method method)\n{\n\tSPIRBlock::ContinueBlockType continue_type = continue_block_type(get<SPIRBlock>(block.continue_block));\n\n\tif (method == SPIRBlock::MergeToSelectForLoop || method == SPIRBlock::MergeToSelectContinueForLoop)\n\t{\n\t\tuint32_t current_count = statement_count;\n\t\t// If we're trying to create a true for loop,\n\t\t// we need to make sure that all opcodes before branch statement do not actually emit any code.\n\t\t// We can then take the condition expression and create a for (; cond ; ) { body; } structure instead.\n\t\temit_block_instructions_with_masked_debug(block);\n\n\t\tbool condition_is_temporary = forced_temporaries.find(block.condition) == end(forced_temporaries);\n\n\t\t// This can work! We only did trivial things which could be forwarded in block body!\n\t\tif (current_count == statement_count && condition_is_temporary)\n\t\t{\n\t\t\tswitch (continue_type)\n\t\t\t{\n\t\t\tcase SPIRBlock::ForLoop:\n\t\t\t{\n\t\t\t\t// This block may be a dominating block, so make sure we flush undeclared variables before building the for loop header.\n\t\t\t\tflush_undeclared_variables(block);\n\n\t\t\t\t// Important that we do this in this order because\n\t\t\t\t// emitting the continue block can invalidate the condition expression.\n\t\t\t\tauto initializer = emit_for_loop_initializers(block);\n\t\t\t\tauto condition = to_expression(block.condition);\n\n\t\t\t\t// Condition might have to be inverted.\n\t\t\t\tif (execution_is_noop(get<SPIRBlock>(block.true_block), get<SPIRBlock>(block.merge_block)))\n\t\t\t\t\tcondition = join(\"!\", enclose_expression(condition));\n\n\t\t\t\temit_block_hints(block);\n\t\t\t\tif (method != SPIRBlock::MergeToSelectContinueForLoop)\n\t\t\t\t{\n\t\t\t\t\tauto continue_block = emit_continue_block(block.continue_block, false, false);\n\t\t\t\t\tstatement(\"for (\", initializer, \"; \", condition, \"; \", continue_block, \")\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tstatement(\"for (\", initializer, \"; \", condition, \"; )\");\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase SPIRBlock::WhileLoop:\n\t\t\t{\n\t\t\t\t// This block may be a dominating block, so make sure we flush undeclared variables before building the while loop header.\n\t\t\t\tflush_undeclared_variables(block);\n\t\t\t\temit_while_loop_initializers(block);\n\t\t\t\temit_block_hints(block);\n\n\t\t\t\tauto condition = to_expression(block.condition);\n\t\t\t\t// Condition might have to be inverted.\n\t\t\t\tif (execution_is_noop(get<SPIRBlock>(block.true_block), get<SPIRBlock>(block.merge_block)))\n\t\t\t\t\tcondition = join(\"!\", enclose_expression(condition));\n\n\t\t\t\tstatement(\"while (\", condition, \")\");\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tblock.disable_block_optimization = true;\n\t\t\t\tforce_recompile();\n\t\t\t\tbegin_scope(); // We'll see an end_scope() later.\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tbegin_scope();\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tblock.disable_block_optimization = true;\n\t\t\tforce_recompile();\n\t\t\tbegin_scope(); // We'll see an end_scope() later.\n\t\t\treturn false;\n\t\t}\n\t}\n\telse if (method == SPIRBlock::MergeToDirectForLoop)\n\t{\n\t\tauto &child = get<SPIRBlock>(block.next_block);\n\n\t\t// This block may be a dominating block, so make sure we flush undeclared variables before building the for loop header.\n\t\tflush_undeclared_variables(child);\n\n\t\tuint32_t current_count = statement_count;\n\n\t\t// If we're trying to create a true for loop,\n\t\t// we need to make sure that all opcodes before branch statement do not actually emit any code.\n\t\t// We can then take the condition expression and create a for (; cond ; ) { body; } structure instead.\n\t\temit_block_instructions_with_masked_debug(child);\n\n\t\tbool condition_is_temporary = forced_temporaries.find(child.condition) == end(forced_temporaries);\n\n\t\tif (current_count == statement_count && condition_is_temporary)\n\t\t{\n\t\t\tuint32_t target_block = child.true_block;\n\n\t\t\tswitch (continue_type)\n\t\t\t{\n\t\t\tcase SPIRBlock::ForLoop:\n\t\t\t{\n\t\t\t\t// Important that we do this in this order because\n\t\t\t\t// emitting the continue block can invalidate the condition expression.\n\t\t\t\tauto initializer = emit_for_loop_initializers(block);\n\t\t\t\tauto condition = to_expression(child.condition);\n\n\t\t\t\t// Condition might have to be inverted.\n\t\t\t\tif (execution_is_noop(get<SPIRBlock>(child.true_block), get<SPIRBlock>(block.merge_block)))\n\t\t\t\t{\n\t\t\t\t\tcondition = join(\"!\", enclose_expression(condition));\n\t\t\t\t\ttarget_block = child.false_block;\n\t\t\t\t}\n\n\t\t\t\tauto continue_block = emit_continue_block(block.continue_block, false, false);\n\t\t\t\temit_block_hints(block);\n\t\t\t\tstatement(\"for (\", initializer, \"; \", condition, \"; \", continue_block, \")\");\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase SPIRBlock::WhileLoop:\n\t\t\t{\n\t\t\t\temit_while_loop_initializers(block);\n\t\t\t\temit_block_hints(block);\n\n\t\t\t\tauto condition = to_expression(child.condition);\n\t\t\t\t// Condition might have to be inverted.\n\t\t\t\tif (execution_is_noop(get<SPIRBlock>(child.true_block), get<SPIRBlock>(block.merge_block)))\n\t\t\t\t{\n\t\t\t\t\tcondition = join(\"!\", enclose_expression(condition));\n\t\t\t\t\ttarget_block = child.false_block;\n\t\t\t\t}\n\n\t\t\t\tstatement(\"while (\", condition, \")\");\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tblock.disable_block_optimization = true;\n\t\t\t\tforce_recompile();\n\t\t\t\tbegin_scope(); // We'll see an end_scope() later.\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tbegin_scope();\n\t\t\tbranch(child.self, target_block);\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tblock.disable_block_optimization = true;\n\t\t\tforce_recompile();\n\t\t\tbegin_scope(); // We'll see an end_scope() later.\n\t\t\treturn false;\n\t\t}\n\t}\n\telse\n\t\treturn false;\n}\n\nvoid CompilerGLSL::flush_undeclared_variables(SPIRBlock &block)\n{\n\tfor (auto &v : block.dominated_variables)\n\t\tflush_variable_declaration(v);\n}\n\nvoid CompilerGLSL::emit_hoisted_temporaries(SmallVector<pair<TypeID, ID>> &temporaries)\n{\n\t// If we need to force temporaries for certain IDs due to continue blocks, do it before starting loop header.\n\t// Need to sort these to ensure that reference output is stable.\n\tsort(begin(temporaries), end(temporaries),\n\t     [](const pair<TypeID, ID> &a, const pair<TypeID, ID> &b) { return a.second < b.second; });\n\n\tfor (auto &tmp : temporaries)\n\t{\n\t\tauto &type = get<SPIRType>(tmp.first);\n\n\t\t// There are some rare scenarios where we are asked to declare pointer types as hoisted temporaries.\n\t\t// This should be ignored unless we're doing actual variable pointers and backend supports it.\n\t\t// Access chains cannot normally be lowered to temporaries in GLSL and HLSL.\n\t\tif (type.pointer && !backend.native_pointers)\n\t\t\tcontinue;\n\n\t\tadd_local_variable_name(tmp.second);\n\t\tauto &flags = get_decoration_bitset(tmp.second);\n\n\t\t// Not all targets support pointer literals, so don't bother with that case.\n\t\tstring initializer;\n\t\tif (options.force_zero_initialized_variables && type_can_zero_initialize(type))\n\t\t\tinitializer = join(\" = \", to_zero_initialized_expression(tmp.first));\n\n\t\tstatement(flags_to_qualifiers_glsl(type, flags), variable_decl(type, to_name(tmp.second)), initializer, \";\");\n\n\t\thoisted_temporaries.insert(tmp.second);\n\t\tforced_temporaries.insert(tmp.second);\n\n\t\t// The temporary might be read from before it's assigned, set up the expression now.\n\t\tset<SPIRExpression>(tmp.second, to_name(tmp.second), tmp.first, true);\n\n\t\t// If we have hoisted temporaries in multi-precision contexts, emit that here too ...\n\t\t// We will not be able to analyze hoisted-ness for dependent temporaries that we hallucinate here.\n\t\tauto mirrored_precision_itr = temporary_to_mirror_precision_alias.find(tmp.second);\n\t\tif (mirrored_precision_itr != temporary_to_mirror_precision_alias.end())\n\t\t{\n\t\t\tuint32_t mirror_id = mirrored_precision_itr->second;\n\t\t\tauto &mirror_flags = get_decoration_bitset(mirror_id);\n\t\t\tstatement(flags_to_qualifiers_glsl(type, mirror_flags),\n\t\t\t          variable_decl(type, to_name(mirror_id)),\n\t\t\t          initializer, \";\");\n\t\t\t// The temporary might be read from before it's assigned, set up the expression now.\n\t\t\tset<SPIRExpression>(mirror_id, to_name(mirror_id), tmp.first, true);\n\t\t\thoisted_temporaries.insert(mirror_id);\n\t\t}\n\t}\n}\n\nvoid CompilerGLSL::emit_block_chain(SPIRBlock &block)\n{\n\tbool select_branch_to_true_block = false;\n\tbool select_branch_to_false_block = false;\n\tbool skip_direct_branch = false;\n\tbool emitted_loop_header_variables = false;\n\tbool force_complex_continue_block = false;\n\tValueSaver<uint32_t> loop_level_saver(current_loop_level);\n\n\tif (block.merge == SPIRBlock::MergeLoop)\n\t\tadd_loop_level();\n\n\t// If we're emitting PHI variables with precision aliases, we have to emit them as hoisted temporaries.\n\tfor (auto var_id : block.dominated_variables)\n\t{\n\t\tauto &var = get<SPIRVariable>(var_id);\n\t\tif (var.phi_variable)\n\t\t{\n\t\t\tauto mirrored_precision_itr = temporary_to_mirror_precision_alias.find(var_id);\n\t\t\tif (mirrored_precision_itr != temporary_to_mirror_precision_alias.end() &&\n\t\t\t    find_if(block.declare_temporary.begin(), block.declare_temporary.end(),\n\t\t\t            [mirrored_precision_itr](const std::pair<TypeID, VariableID> &p) {\n\t\t\t              return p.second == mirrored_precision_itr->second;\n\t\t\t            }) == block.declare_temporary.end())\n\t\t\t{\n\t\t\t\tblock.declare_temporary.push_back({ var.basetype, mirrored_precision_itr->second });\n\t\t\t}\n\t\t}\n\t}\n\n\temit_hoisted_temporaries(block.declare_temporary);\n\n\tSPIRBlock::ContinueBlockType continue_type = SPIRBlock::ContinueNone;\n\tif (block.continue_block)\n\t{\n\t\tcontinue_type = continue_block_type(get<SPIRBlock>(block.continue_block));\n\t\t// If we know we cannot emit a loop, mark the block early as a complex loop so we don't force unnecessary recompiles.\n\t\tif (continue_type == SPIRBlock::ComplexLoop)\n\t\t\tblock.complex_continue = true;\n\t}\n\n\t// If we have loop variables, stop masking out access to the variable now.\n\tfor (auto var_id : block.loop_variables)\n\t{\n\t\tauto &var = get<SPIRVariable>(var_id);\n\t\tvar.loop_variable_enable = true;\n\t\t// We're not going to declare the variable directly, so emit a copy here.\n\t\temit_variable_temporary_copies(var);\n\t}\n\n\t// Remember deferred declaration state. We will restore it before returning.\n\tSmallVector<bool, 64> rearm_dominated_variables(block.dominated_variables.size());\n\tfor (size_t i = 0; i < block.dominated_variables.size(); i++)\n\t{\n\t\tuint32_t var_id = block.dominated_variables[i];\n\t\tauto &var = get<SPIRVariable>(var_id);\n\t\trearm_dominated_variables[i] = var.deferred_declaration;\n\t}\n\n\t// This is the method often used by spirv-opt to implement loops.\n\t// The loop header goes straight into the continue block.\n\t// However, don't attempt this on ESSL 1.0, because if a loop variable is used in a continue block,\n\t// it *MUST* be used in the continue block. This loop method will not work.\n\tif (!is_legacy_es() && block_is_loop_candidate(block, SPIRBlock::MergeToSelectContinueForLoop))\n\t{\n\t\tflush_undeclared_variables(block);\n\t\tif (attempt_emit_loop_header(block, SPIRBlock::MergeToSelectContinueForLoop))\n\t\t{\n\t\t\tif (execution_is_noop(get<SPIRBlock>(block.true_block), get<SPIRBlock>(block.merge_block)))\n\t\t\t\tselect_branch_to_false_block = true;\n\t\t\telse\n\t\t\t\tselect_branch_to_true_block = true;\n\n\t\t\temitted_loop_header_variables = true;\n\t\t\tforce_complex_continue_block = true;\n\t\t}\n\t}\n\t// This is the older loop behavior in glslang which branches to loop body directly from the loop header.\n\telse if (block_is_loop_candidate(block, SPIRBlock::MergeToSelectForLoop))\n\t{\n\t\tflush_undeclared_variables(block);\n\t\tif (attempt_emit_loop_header(block, SPIRBlock::MergeToSelectForLoop))\n\t\t{\n\t\t\t// The body of while, is actually just the true (or false) block, so always branch there unconditionally.\n\t\t\tif (execution_is_noop(get<SPIRBlock>(block.true_block), get<SPIRBlock>(block.merge_block)))\n\t\t\t\tselect_branch_to_false_block = true;\n\t\t\telse\n\t\t\t\tselect_branch_to_true_block = true;\n\n\t\t\temitted_loop_header_variables = true;\n\t\t}\n\t}\n\t// This is the newer loop behavior in glslang which branches from Loop header directly to\n\t// a new block, which in turn has a OpBranchSelection without a selection merge.\n\telse if (block_is_loop_candidate(block, SPIRBlock::MergeToDirectForLoop))\n\t{\n\t\tflush_undeclared_variables(block);\n\t\tif (attempt_emit_loop_header(block, SPIRBlock::MergeToDirectForLoop))\n\t\t{\n\t\t\tskip_direct_branch = true;\n\t\t\temitted_loop_header_variables = true;\n\t\t}\n\t}\n\telse if (continue_type == SPIRBlock::DoWhileLoop)\n\t{\n\t\tflush_undeclared_variables(block);\n\t\temit_while_loop_initializers(block);\n\t\temitted_loop_header_variables = true;\n\t\t// We have some temporaries where the loop header is the dominator.\n\t\t// We risk a case where we have code like:\n\t\t// for (;;) { create-temporary; break; } consume-temporary;\n\t\t// so force-declare temporaries here.\n\t\temit_hoisted_temporaries(block.potential_declare_temporary);\n\t\tstatement(\"do\");\n\t\tbegin_scope();\n\n\t\temit_block_instructions(block);\n\t}\n\telse if (block.merge == SPIRBlock::MergeLoop)\n\t{\n\t\tflush_undeclared_variables(block);\n\t\temit_while_loop_initializers(block);\n\t\temitted_loop_header_variables = true;\n\n\t\t// We have a generic loop without any distinguishable pattern like for, while or do while.\n\t\tget<SPIRBlock>(block.continue_block).complex_continue = true;\n\t\tcontinue_type = SPIRBlock::ComplexLoop;\n\n\t\t// We have some temporaries where the loop header is the dominator.\n\t\t// We risk a case where we have code like:\n\t\t// for (;;) { create-temporary; break; } consume-temporary;\n\t\t// so force-declare temporaries here.\n\t\temit_hoisted_temporaries(block.potential_declare_temporary);\n\t\temit_block_hints(block);\n\t\tstatement(\"for (;;)\");\n\t\tbegin_scope();\n\n\t\temit_block_instructions(block);\n\t}\n\telse\n\t{\n\t\temit_block_instructions(block);\n\t}\n\n\t// If we didn't successfully emit a loop header and we had loop variable candidates, we have a problem\n\t// as writes to said loop variables might have been masked out, we need a recompile.\n\tif (!emitted_loop_header_variables && !block.loop_variables.empty())\n\t{\n\t\tforce_recompile_guarantee_forward_progress();\n\t\tfor (auto var : block.loop_variables)\n\t\t\tget<SPIRVariable>(var).loop_variable = false;\n\t\tblock.loop_variables.clear();\n\t}\n\n\tflush_undeclared_variables(block);\n\tbool emit_next_block = true;\n\n\t// Handle end of block.\n\tswitch (block.terminator)\n\t{\n\tcase SPIRBlock::Direct:\n\t\t// True when emitting complex continue block.\n\t\tif (block.loop_dominator == block.next_block)\n\t\t{\n\t\t\tbranch(block.self, block.next_block);\n\t\t\temit_next_block = false;\n\t\t}\n\t\t// True if MergeToDirectForLoop succeeded.\n\t\telse if (skip_direct_branch)\n\t\t\temit_next_block = false;\n\t\telse if (is_continue(block.next_block) || is_break(block.next_block) || is_conditional(block.next_block))\n\t\t{\n\t\t\tbranch(block.self, block.next_block);\n\t\t\temit_next_block = false;\n\t\t}\n\t\tbreak;\n\n\tcase SPIRBlock::Select:\n\t\t// True if MergeToSelectForLoop or MergeToSelectContinueForLoop succeeded.\n\t\tif (select_branch_to_true_block)\n\t\t{\n\t\t\tif (force_complex_continue_block)\n\t\t\t{\n\t\t\t\tassert(block.true_block == block.continue_block);\n\n\t\t\t\t// We're going to emit a continue block directly here, so make sure it's marked as complex.\n\t\t\t\tauto &complex_continue = get<SPIRBlock>(block.continue_block).complex_continue;\n\t\t\t\tbool old_complex = complex_continue;\n\t\t\t\tcomplex_continue = true;\n\t\t\t\tbranch(block.self, block.true_block);\n\t\t\t\tcomplex_continue = old_complex;\n\t\t\t}\n\t\t\telse\n\t\t\t\tbranch(block.self, block.true_block);\n\t\t}\n\t\telse if (select_branch_to_false_block)\n\t\t{\n\t\t\tif (force_complex_continue_block)\n\t\t\t{\n\t\t\t\tassert(block.false_block == block.continue_block);\n\n\t\t\t\t// We're going to emit a continue block directly here, so make sure it's marked as complex.\n\t\t\t\tauto &complex_continue = get<SPIRBlock>(block.continue_block).complex_continue;\n\t\t\t\tbool old_complex = complex_continue;\n\t\t\t\tcomplex_continue = true;\n\t\t\t\tbranch(block.self, block.false_block);\n\t\t\t\tcomplex_continue = old_complex;\n\t\t\t}\n\t\t\telse\n\t\t\t\tbranch(block.self, block.false_block);\n\t\t}\n\t\telse\n\t\t\tbranch(block.self, block.condition, block.true_block, block.false_block);\n\t\tbreak;\n\n\tcase SPIRBlock::MultiSelect:\n\t{\n\t\tauto &type = expression_type(block.condition);\n\t\tbool unsigned_case = type.basetype == SPIRType::UInt || type.basetype == SPIRType::UShort ||\n\t\t                     type.basetype == SPIRType::UByte || type.basetype == SPIRType::UInt64;\n\n\t\tif (block.merge == SPIRBlock::MergeNone)\n\t\t\tSPIRV_CROSS_THROW(\"Switch statement is not structured\");\n\n\t\tif (!backend.support_64bit_switch && (type.basetype == SPIRType::UInt64 || type.basetype == SPIRType::Int64))\n\t\t{\n\t\t\t// SPIR-V spec suggests this is allowed, but we cannot support it in higher level languages.\n\t\t\tSPIRV_CROSS_THROW(\"Cannot use 64-bit switch selectors.\");\n\t\t}\n\n\t\tconst char *label_suffix = \"\";\n\t\tif (type.basetype == SPIRType::UInt && backend.uint32_t_literal_suffix)\n\t\t\tlabel_suffix = \"u\";\n\t\telse if (type.basetype == SPIRType::Int64 && backend.support_64bit_switch)\n\t\t\tlabel_suffix = \"l\";\n\t\telse if (type.basetype == SPIRType::UInt64 && backend.support_64bit_switch)\n\t\t\tlabel_suffix = \"ul\";\n\t\telse if (type.basetype == SPIRType::UShort)\n\t\t\tlabel_suffix = backend.uint16_t_literal_suffix;\n\t\telse if (type.basetype == SPIRType::Short)\n\t\t\tlabel_suffix = backend.int16_t_literal_suffix;\n\n\t\tcurrent_emitting_switch_stack.push_back(&block);\n\n\t\tif (block.need_ladder_break)\n\t\t\tstatement(\"bool _\", block.self, \"_ladder_break = false;\");\n\n\t\t// Find all unique case constructs.\n\t\tunordered_map<uint32_t, SmallVector<uint64_t>> case_constructs;\n\t\tSmallVector<uint32_t> block_declaration_order;\n\t\tSmallVector<uint64_t> literals_to_merge;\n\n\t\t// If a switch case branches to the default block for some reason, we can just remove that literal from consideration\n\t\t// and let the default: block handle it.\n\t\t// 2.11 in SPIR-V spec states that for fall-through cases, there is a very strict declaration order which we can take advantage of here.\n\t\t// We only need to consider possible fallthrough if order[i] branches to order[i + 1].\n\t\tauto &cases = get_case_list(block);\n\t\tfor (auto &c : cases)\n\t\t{\n\t\t\tif (c.block != block.next_block && c.block != block.default_block)\n\t\t\t{\n\t\t\t\tif (!case_constructs.count(c.block))\n\t\t\t\t\tblock_declaration_order.push_back(c.block);\n\t\t\t\tcase_constructs[c.block].push_back(c.value);\n\t\t\t}\n\t\t\telse if (c.block == block.next_block && block.default_block != block.next_block)\n\t\t\t{\n\t\t\t\t// We might have to flush phi inside specific case labels.\n\t\t\t\t// If we can piggyback on default:, do so instead.\n\t\t\t\tliterals_to_merge.push_back(c.value);\n\t\t\t}\n\t\t}\n\n\t\t// Empty literal array -> default.\n\t\tif (block.default_block != block.next_block)\n\t\t{\n\t\t\tauto &default_block = get<SPIRBlock>(block.default_block);\n\n\t\t\t// We need to slide in the default block somewhere in this chain\n\t\t\t// if there are fall-through scenarios since the default is declared separately in OpSwitch.\n\t\t\t// Only consider trivial fall-through cases here.\n\t\t\tsize_t num_blocks = block_declaration_order.size();\n\t\t\tbool injected_block = false;\n\n\t\t\tfor (size_t i = 0; i < num_blocks; i++)\n\t\t\t{\n\t\t\t\tauto &case_block = get<SPIRBlock>(block_declaration_order[i]);\n\t\t\t\tif (execution_is_direct_branch(case_block, default_block))\n\t\t\t\t{\n\t\t\t\t\t// Fallthrough to default block, we must inject the default block here.\n\t\t\t\t\tblock_declaration_order.insert(begin(block_declaration_order) + i + 1, block.default_block);\n\t\t\t\t\tinjected_block = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse if (execution_is_direct_branch(default_block, case_block))\n\t\t\t\t{\n\t\t\t\t\t// Default case is falling through to another case label, we must inject the default block here.\n\t\t\t\t\tblock_declaration_order.insert(begin(block_declaration_order) + i, block.default_block);\n\t\t\t\t\tinjected_block = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Order does not matter.\n\t\t\tif (!injected_block)\n\t\t\t\tblock_declaration_order.push_back(block.default_block);\n\t\t\telse if (is_legacy_es())\n\t\t\t\tSPIRV_CROSS_THROW(\"Default case label fallthrough to other case label is not supported in ESSL 1.0.\");\n\n\t\t\tcase_constructs[block.default_block] = {};\n\t\t}\n\n\t\tsize_t num_blocks = block_declaration_order.size();\n\n\t\tconst auto to_case_label = [](uint64_t literal, uint32_t width, bool is_unsigned_case) -> string\n\t\t{\n\t\t\tif (is_unsigned_case)\n\t\t\t\treturn convert_to_string(literal);\n\n\t\t\t// For smaller cases, the literals are compiled as 32 bit wide\n\t\t\t// literals so we don't need to care for all sizes specifically.\n\t\t\tif (width <= 32)\n\t\t\t{\n\t\t\t\treturn convert_to_string(int64_t(int32_t(literal)));\n\t\t\t}\n\n\t\t\treturn convert_to_string(int64_t(literal));\n\t\t};\n\n\t\tconst auto to_legacy_case_label = [&](uint32_t condition, const SmallVector<uint64_t> &labels,\n\t\t                                      const char *suffix) -> string {\n\t\t\tstring ret;\n\t\t\tsize_t count = labels.size();\n\t\t\tfor (size_t i = 0; i < count; i++)\n\t\t\t{\n\t\t\t\tif (i)\n\t\t\t\t\tret += \" || \";\n\t\t\t\tret += join(count > 1 ? \"(\" : \"\", to_enclosed_expression(condition), \" == \", labels[i], suffix,\n\t\t\t\t            count > 1 ? \")\" : \"\");\n\t\t\t}\n\t\t\treturn ret;\n\t\t};\n\n\t\t// We need to deal with a complex scenario for OpPhi. If we have case-fallthrough and Phi in the picture,\n\t\t// we need to flush phi nodes outside the switch block in a branch,\n\t\t// and skip any Phi handling inside the case label to make fall-through work as expected.\n\t\t// This kind of code-gen is super awkward and it's a last resort. Normally we would want to handle this\n\t\t// inside the case label if at all possible.\n\t\tfor (size_t i = 1; backend.support_case_fallthrough && i < num_blocks; i++)\n\t\t{\n\t\t\tif (flush_phi_required(block.self, block_declaration_order[i]) &&\n\t\t\t    flush_phi_required(block_declaration_order[i - 1], block_declaration_order[i]))\n\t\t\t{\n\t\t\t\tuint32_t target_block = block_declaration_order[i];\n\n\t\t\t\t// Make sure we flush Phi, it might have been marked to be ignored earlier.\n\t\t\t\tget<SPIRBlock>(target_block).ignore_phi_from_block = 0;\n\n\t\t\t\tauto &literals = case_constructs[target_block];\n\n\t\t\t\tif (literals.empty())\n\t\t\t\t{\n\t\t\t\t\t// Oh boy, gotta make a complete negative test instead! o.o\n\t\t\t\t\t// Find all possible literals that would *not* make us enter the default block.\n\t\t\t\t\t// If none of those literals match, we flush Phi ...\n\t\t\t\t\tSmallVector<string> conditions;\n\t\t\t\t\tfor (size_t j = 0; j < num_blocks; j++)\n\t\t\t\t\t{\n\t\t\t\t\t\tauto &negative_literals = case_constructs[block_declaration_order[j]];\n\t\t\t\t\t\tfor (auto &case_label : negative_literals)\n\t\t\t\t\t\t\tconditions.push_back(join(to_enclosed_expression(block.condition),\n\t\t\t\t\t\t\t                          \" != \", to_case_label(case_label, type.width, unsigned_case)));\n\t\t\t\t\t}\n\n\t\t\t\t\tstatement(\"if (\", merge(conditions, \" && \"), \")\");\n\t\t\t\t\tbegin_scope();\n\t\t\t\t\tflush_phi(block.self, target_block);\n\t\t\t\t\tend_scope();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tSmallVector<string> conditions;\n\t\t\t\t\tconditions.reserve(literals.size());\n\t\t\t\t\tfor (auto &case_label : literals)\n\t\t\t\t\t\tconditions.push_back(join(to_enclosed_expression(block.condition),\n\t\t\t\t\t\t                          \" == \", to_case_label(case_label, type.width, unsigned_case)));\n\t\t\t\t\tstatement(\"if (\", merge(conditions, \" || \"), \")\");\n\t\t\t\t\tbegin_scope();\n\t\t\t\t\tflush_phi(block.self, target_block);\n\t\t\t\t\tend_scope();\n\t\t\t\t}\n\n\t\t\t\t// Mark the block so that we don't flush Phi from header to case label.\n\t\t\t\tget<SPIRBlock>(target_block).ignore_phi_from_block = block.self;\n\t\t\t}\n\t\t}\n\n\t\t// If there is only one default block, and no cases, this is a case where SPIRV-opt decided to emulate\n\t\t// non-structured exits with the help of a switch block.\n\t\t// This is buggy on FXC, so just emit the logical equivalent of a do { } while(false), which is more idiomatic.\n\t\tbool block_like_switch = cases.empty();\n\n\t\t// If this is true, the switch is completely meaningless, and we should just avoid it.\n\t\tbool collapsed_switch = block_like_switch && block.default_block == block.next_block;\n\n\t\tif (!collapsed_switch)\n\t\t{\n\t\t\tif (block_like_switch || is_legacy_es())\n\t\t\t{\n\t\t\t\t// ESSL 1.0 is not guaranteed to support do/while.\n\t\t\t\tif (is_legacy_es())\n\t\t\t\t{\n\t\t\t\t\tuint32_t counter = statement_count;\n\t\t\t\t\tstatement(\"for (int spvDummy\", counter, \" = 0; spvDummy\", counter, \" < 1; spvDummy\", counter,\n\t\t\t\t\t          \"++)\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tstatement(\"do\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\temit_block_hints(block);\n\t\t\t\tstatement(\"switch (\", to_unpacked_expression(block.condition), \")\");\n\t\t\t}\n\t\t\tbegin_scope();\n\t\t}\n\n\t\tfor (size_t i = 0; i < num_blocks; i++)\n\t\t{\n\t\t\tuint32_t target_block = block_declaration_order[i];\n\t\t\tauto &literals = case_constructs[target_block];\n\n\t\t\tif (literals.empty())\n\t\t\t{\n\t\t\t\t// Default case.\n\t\t\t\tif (!block_like_switch)\n\t\t\t\t{\n\t\t\t\t\tif (is_legacy_es())\n\t\t\t\t\t\tstatement(\"else\");\n\t\t\t\t\telse\n\t\t\t\t\t\tstatement(\"default:\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (is_legacy_es())\n\t\t\t\t{\n\t\t\t\t\tstatement((i ? \"else \" : \"\"), \"if (\", to_legacy_case_label(block.condition, literals, label_suffix),\n\t\t\t\t\t          \")\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tfor (auto &case_literal : literals)\n\t\t\t\t\t{\n\t\t\t\t\t\t// The case label value must be sign-extended properly in SPIR-V, so we can assume 32-bit values here.\n\t\t\t\t\t\tstatement(\"case \", to_case_label(case_literal, type.width, unsigned_case), label_suffix, \":\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tauto &case_block = get<SPIRBlock>(target_block);\n\t\t\tif (backend.support_case_fallthrough && i + 1 < num_blocks &&\n\t\t\t    execution_is_direct_branch(case_block, get<SPIRBlock>(block_declaration_order[i + 1])))\n\t\t\t{\n\t\t\t\t// We will fall through here, so just terminate the block chain early.\n\t\t\t\t// We still need to deal with Phi potentially.\n\t\t\t\t// No need for a stack-like thing here since we only do fall-through when there is a\n\t\t\t\t// single trivial branch to fall-through target..\n\t\t\t\tcurrent_emitting_switch_fallthrough = true;\n\t\t\t}\n\t\t\telse\n\t\t\t\tcurrent_emitting_switch_fallthrough = false;\n\n\t\t\tif (!block_like_switch)\n\t\t\t\tbegin_scope();\n\t\t\tbranch(block.self, target_block);\n\t\t\tif (!block_like_switch)\n\t\t\t\tend_scope();\n\n\t\t\tcurrent_emitting_switch_fallthrough = false;\n\t\t}\n\n\t\t// Might still have to flush phi variables if we branch from loop header directly to merge target.\n\t\t// This is supposed to emit all cases where we branch from header to merge block directly.\n\t\t// There are two main scenarios where cannot rely on default fallthrough.\n\t\t// - There is an explicit default: label already.\n\t\t//   In this case, literals_to_merge need to form their own \"default\" case, so that we avoid executing that block.\n\t\t// - Header -> Merge requires flushing PHI. In this case, we need to collect all cases and flush PHI there.\n\t\tbool header_merge_requires_phi = flush_phi_required(block.self, block.next_block);\n\t\tbool need_fallthrough_block = block.default_block == block.next_block || !literals_to_merge.empty();\n\t\tif (!collapsed_switch && ((header_merge_requires_phi && need_fallthrough_block) || !literals_to_merge.empty()))\n\t\t{\n\t\t\tfor (auto &case_literal : literals_to_merge)\n\t\t\t\tstatement(\"case \", to_case_label(case_literal, type.width, unsigned_case), label_suffix, \":\");\n\n\t\t\tif (block.default_block == block.next_block)\n\t\t\t{\n\t\t\t\tif (is_legacy_es())\n\t\t\t\t\tstatement(\"else\");\n\t\t\t\telse\n\t\t\t\t\tstatement(\"default:\");\n\t\t\t}\n\n\t\t\tbegin_scope();\n\t\t\tflush_phi(block.self, block.next_block);\n\t\t\tstatement(\"break;\");\n\t\t\tend_scope();\n\t\t}\n\n\t\tif (!collapsed_switch)\n\t\t{\n\t\t\tif (block_like_switch && !is_legacy_es())\n\t\t\t\tend_scope_decl(\"while(false)\");\n\t\t\telse\n\t\t\t\tend_scope();\n\t\t}\n\t\telse\n\t\t\tflush_phi(block.self, block.next_block);\n\n\t\tif (block.need_ladder_break)\n\t\t{\n\t\t\tstatement(\"if (_\", block.self, \"_ladder_break)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"break;\");\n\t\t\tend_scope();\n\t\t}\n\n\t\tcurrent_emitting_switch_stack.pop_back();\n\t\tbreak;\n\t}\n\n\tcase SPIRBlock::Return:\n\t{\n\t\tfor (auto &line : current_function->fixup_hooks_out)\n\t\t\tline();\n\n\t\tif (processing_entry_point)\n\t\t\temit_fixup();\n\n\t\tauto &cfg = get_cfg_for_current_function();\n\n\t\tif (block.return_value)\n\t\t{\n\t\t\tauto &type = expression_type(block.return_value);\n\t\t\tif (!type.array.empty() && !backend.can_return_array)\n\t\t\t{\n\t\t\t\t// If we cannot return arrays, we will have a special out argument we can write to instead.\n\t\t\t\t// The backend is responsible for setting this up, and redirection the return values as appropriate.\n\t\t\t\tif (ir.ids[block.return_value].get_type() != TypeUndef)\n\t\t\t\t{\n\t\t\t\t\temit_array_copy(\"spvReturnValue\", 0, block.return_value, StorageClassFunction,\n\t\t\t\t\t                get_expression_effective_storage_class(block.return_value));\n\t\t\t\t}\n\n\t\t\t\tif (!cfg.node_terminates_control_flow_in_sub_graph(current_function->entry_block, block.self) ||\n\t\t\t\t    block.loop_dominator != BlockID(SPIRBlock::NoDominator))\n\t\t\t\t{\n\t\t\t\t\tstatement(\"return;\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// OpReturnValue can return Undef, so don't emit anything for this case.\n\t\t\t\tif (ir.ids[block.return_value].get_type() != TypeUndef)\n\t\t\t\t\tstatement(\"return \", to_unpacked_expression(block.return_value), \";\");\n\t\t\t}\n\t\t}\n\t\telse if (!cfg.node_terminates_control_flow_in_sub_graph(current_function->entry_block, block.self) ||\n\t\t         block.loop_dominator != BlockID(SPIRBlock::NoDominator))\n\t\t{\n\t\t\t// If this block is the very final block and not called from control flow,\n\t\t\t// we do not need an explicit return which looks out of place. Just end the function here.\n\t\t\t// In the very weird case of for(;;) { return; } executing return is unconditional,\n\t\t\t// but we actually need a return here ...\n\t\t\tstatement(\"return;\");\n\t\t}\n\t\tbreak;\n\t}\n\n\t// If the Kill is terminating a block with a (probably synthetic) return value, emit a return value statement.\n\tcase SPIRBlock::Kill:\n\t\tstatement(backend.discard_literal, \";\");\n\t\tif (block.return_value)\n\t\t\tstatement(\"return \", to_unpacked_expression(block.return_value), \";\");\n\t\tbreak;\n\n\tcase SPIRBlock::Unreachable:\n\t{\n\t\t// Avoid emitting false fallthrough, which can happen for\n\t\t// if (cond) break; else discard; inside a case label.\n\t\t// Discard is not always implementable as a terminator.\n\n\t\tauto &cfg = get_cfg_for_current_function();\n\t\tbool inner_dominator_is_switch = false;\n\t\tID id = block.self;\n\n\t\twhile (id)\n\t\t{\n\t\t\tauto &iter_block = get<SPIRBlock>(id);\n\t\t\tif (iter_block.terminator == SPIRBlock::MultiSelect ||\n\t\t\t    iter_block.merge == SPIRBlock::MergeLoop)\n\t\t\t{\n\t\t\t\tID next_block = iter_block.merge == SPIRBlock::MergeLoop ?\n\t\t\t\t                iter_block.merge_block : iter_block.next_block;\n\t\t\t\tbool outside_construct = next_block && cfg.find_common_dominator(next_block, block.self) == next_block;\n\t\t\t\tif (!outside_construct)\n\t\t\t\t{\n\t\t\t\t\tinner_dominator_is_switch = iter_block.terminator == SPIRBlock::MultiSelect;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (cfg.get_preceding_edges(id).empty())\n\t\t\t\tbreak;\n\n\t\t\tid = cfg.get_immediate_dominator(id);\n\t\t}\n\n\t\tif (inner_dominator_is_switch)\n\t\t\tstatement(\"break; // unreachable workaround\");\n\n\t\temit_next_block = false;\n\t\tbreak;\n\t}\n\n\tcase SPIRBlock::IgnoreIntersection:\n\t\tstatement(\"ignoreIntersectionEXT;\");\n\t\tbreak;\n\n\tcase SPIRBlock::TerminateRay:\n\t\tstatement(\"terminateRayEXT;\");\n\t\tbreak;\n\n\tcase SPIRBlock::EmitMeshTasks:\n\t\temit_mesh_tasks(block);\n\t\tbreak;\n\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Unimplemented block terminator.\");\n\t}\n\n\tif (block.next_block && emit_next_block)\n\t{\n\t\t// If we hit this case, we're dealing with an unconditional branch, which means we will output\n\t\t// that block after this. If we had selection merge, we already flushed phi variables.\n\t\tif (block.merge != SPIRBlock::MergeSelection)\n\t\t{\n\t\t\tflush_phi(block.self, block.next_block);\n\t\t\t// For a direct branch, need to remember to invalidate expressions in the next linear block instead.\n\t\t\tget<SPIRBlock>(block.next_block).invalidate_expressions = block.invalidate_expressions;\n\t\t}\n\n\t\t// For switch fallthrough cases, we terminate the chain here, but we still need to handle Phi.\n\t\tif (!current_emitting_switch_fallthrough)\n\t\t{\n\t\t\t// For merge selects we might have ignored the fact that a merge target\n\t\t\t// could have been a break; or continue;\n\t\t\t// We will need to deal with it here.\n\t\t\tif (is_loop_break(block.next_block))\n\t\t\t{\n\t\t\t\t// Cannot check for just break, because switch statements will also use break.\n\t\t\t\tassert(block.merge == SPIRBlock::MergeSelection);\n\t\t\t\tstatement(\"break;\");\n\t\t\t}\n\t\t\telse if (is_continue(block.next_block))\n\t\t\t{\n\t\t\t\tassert(block.merge == SPIRBlock::MergeSelection);\n\t\t\t\tbranch_to_continue(block.self, block.next_block);\n\t\t\t}\n\t\t\telse if (BlockID(block.self) != block.next_block)\n\t\t\t\temit_block_chain(get<SPIRBlock>(block.next_block));\n\t\t}\n\t}\n\n\tif (block.merge == SPIRBlock::MergeLoop)\n\t{\n\t\tif (continue_type == SPIRBlock::DoWhileLoop)\n\t\t{\n\t\t\t// Make sure that we run the continue block to get the expressions set, but this\n\t\t\t// should become an empty string.\n\t\t\t// We have no fallbacks if we cannot forward everything to temporaries ...\n\t\t\tconst auto &continue_block = get<SPIRBlock>(block.continue_block);\n\t\t\tbool positive_test = execution_is_noop(get<SPIRBlock>(continue_block.true_block),\n\t\t\t                                       get<SPIRBlock>(continue_block.loop_dominator));\n\n\t\t\tuint32_t current_count = statement_count;\n\t\t\tauto statements = emit_continue_block(block.continue_block, positive_test, !positive_test);\n\t\t\tif (statement_count != current_count)\n\t\t\t{\n\t\t\t\t// The DoWhile block has side effects, force ComplexLoop pattern next pass.\n\t\t\t\tget<SPIRBlock>(block.continue_block).complex_continue = true;\n\t\t\t\tforce_recompile();\n\t\t\t}\n\n\t\t\t// Might have to invert the do-while test here.\n\t\t\tauto condition = to_expression(continue_block.condition);\n\t\t\tif (!positive_test)\n\t\t\t\tcondition = join(\"!\", enclose_expression(condition));\n\n\t\t\tend_scope_decl(join(\"while (\", condition, \")\"));\n\t\t}\n\t\telse\n\t\t\tend_scope();\n\n\t\tloop_level_saver.release();\n\n\t\t// We cannot break out of two loops at once, so don't check for break; here.\n\t\t// Using block.self as the \"from\" block isn't quite right, but it has the same scope\n\t\t// and dominance structure, so it's fine.\n\t\tif (is_continue(block.merge_block))\n\t\t\tbranch_to_continue(block.self, block.merge_block);\n\t\telse\n\t\t\temit_block_chain(get<SPIRBlock>(block.merge_block));\n\t}\n\n\t// Forget about control dependent expressions now.\n\tblock.invalidate_expressions.clear();\n\n\t// After we return, we must be out of scope, so if we somehow have to re-emit this function,\n\t// re-declare variables if necessary.\n\tassert(rearm_dominated_variables.size() == block.dominated_variables.size());\n\tfor (size_t i = 0; i < block.dominated_variables.size(); i++)\n\t{\n\t\tuint32_t var = block.dominated_variables[i];\n\t\tget<SPIRVariable>(var).deferred_declaration = rearm_dominated_variables[i];\n\t}\n\n\t// Just like for deferred declaration, we need to forget about loop variable enable\n\t// if our block chain is reinstantiated later.\n\tfor (auto &var_id : block.loop_variables)\n\t\tget<SPIRVariable>(var_id).loop_variable_enable = false;\n}\n\nvoid CompilerGLSL::begin_scope()\n{\n\tstatement(\"{\");\n\tindent++;\n}\n\nvoid CompilerGLSL::end_scope()\n{\n\tif (!indent)\n\t\tSPIRV_CROSS_THROW(\"Popping empty indent stack.\");\n\tindent--;\n\tstatement(\"}\");\n}\n\nvoid CompilerGLSL::end_scope(const string &trailer)\n{\n\tif (!indent)\n\t\tSPIRV_CROSS_THROW(\"Popping empty indent stack.\");\n\tindent--;\n\tstatement(\"}\", trailer);\n}\n\nvoid CompilerGLSL::end_scope_decl()\n{\n\tif (!indent)\n\t\tSPIRV_CROSS_THROW(\"Popping empty indent stack.\");\n\tindent--;\n\tstatement(\"};\");\n}\n\nvoid CompilerGLSL::end_scope_decl(const string &decl)\n{\n\tif (!indent)\n\t\tSPIRV_CROSS_THROW(\"Popping empty indent stack.\");\n\tindent--;\n\tstatement(\"} \", decl, \";\");\n}\n\nvoid CompilerGLSL::check_function_call_constraints(const uint32_t *args, uint32_t length)\n{\n\t// If our variable is remapped, and we rely on type-remapping information as\n\t// well, then we cannot pass the variable as a function parameter.\n\t// Fixing this is non-trivial without stamping out variants of the same function,\n\t// so for now warn about this and suggest workarounds instead.\n\tfor (uint32_t i = 0; i < length; i++)\n\t{\n\t\tauto *var = maybe_get<SPIRVariable>(args[i]);\n\t\tif (!var || !var->remapped_variable)\n\t\t\tcontinue;\n\n\t\tauto &type = get<SPIRType>(var->basetype);\n\t\tif (type.basetype == SPIRType::Image && type.image.dim == DimSubpassData)\n\t\t{\n\t\t\tSPIRV_CROSS_THROW(\"Tried passing a remapped subpassInput variable to a function. \"\n\t\t\t                  \"This will not work correctly because type-remapping information is lost. \"\n\t\t\t                  \"To workaround, please consider not passing the subpass input as a function parameter, \"\n\t\t\t                  \"or use in/out variables instead which do not need type remapping information.\");\n\t\t}\n\t}\n}\n\nconst Instruction *CompilerGLSL::get_next_instruction_in_block(const Instruction &instr)\n{\n\t// FIXME: This is kind of hacky. There should be a cleaner way.\n\tauto offset = uint32_t(&instr - current_emitting_block->ops.data());\n\tif ((offset + 1) < current_emitting_block->ops.size())\n\t\treturn &current_emitting_block->ops[offset + 1];\n\telse\n\t\treturn nullptr;\n}\n\nuint32_t CompilerGLSL::mask_relevant_memory_semantics(uint32_t semantics)\n{\n\treturn semantics & (MemorySemanticsAtomicCounterMemoryMask | MemorySemanticsImageMemoryMask |\n\t                    MemorySemanticsWorkgroupMemoryMask | MemorySemanticsUniformMemoryMask |\n\t                    MemorySemanticsCrossWorkgroupMemoryMask | MemorySemanticsSubgroupMemoryMask);\n}\n\nbool CompilerGLSL::emit_array_copy(const char *expr, uint32_t lhs_id, uint32_t rhs_id, StorageClass, StorageClass)\n{\n\tstring lhs;\n\tif (expr)\n\t\tlhs = expr;\n\telse\n\t\tlhs = to_expression(lhs_id);\n\n\tstatement(lhs, \" = \", to_expression(rhs_id), \";\");\n\treturn true;\n}\n\nbool CompilerGLSL::unroll_array_to_complex_store(uint32_t target_id, uint32_t source_id)\n{\n\tif (!backend.force_gl_in_out_block)\n\t\treturn false;\n\t// This path is only relevant for GL backends.\n\n\tauto *var = maybe_get<SPIRVariable>(target_id);\n\tif (!var || var->storage != StorageClassOutput)\n\t\treturn false;\n\n\tif (!is_builtin_variable(*var) || BuiltIn(get_decoration(var->self, DecorationBuiltIn)) != BuiltInSampleMask)\n\t\treturn false;\n\n\tauto &type = expression_type(source_id);\n\tstring array_expr;\n\tif (type.array_size_literal.back())\n\t{\n\t\tarray_expr = convert_to_string(type.array.back());\n\t\tif (type.array.back() == 0)\n\t\t\tSPIRV_CROSS_THROW(\"Cannot unroll an array copy from unsized array.\");\n\t}\n\telse\n\t\tarray_expr = to_expression(type.array.back());\n\n\tSPIRType target_type { OpTypeInt };\n\ttarget_type.basetype = SPIRType::Int;\n\n\tstatement(\"for (int i = 0; i < int(\", array_expr, \"); i++)\");\n\tbegin_scope();\n\tstatement(to_expression(target_id), \"[i] = \",\n\t          bitcast_expression(target_type, type.basetype, join(to_expression(source_id), \"[i]\")),\n\t          \";\");\n\tend_scope();\n\n\treturn true;\n}\n\nvoid CompilerGLSL::unroll_array_from_complex_load(uint32_t target_id, uint32_t source_id, std::string &expr)\n{\n\tif (!backend.force_gl_in_out_block)\n\t\treturn;\n\t// This path is only relevant for GL backends.\n\n\tauto *var = maybe_get<SPIRVariable>(source_id);\n\tif (!var)\n\t\treturn;\n\n\tif (var->storage != StorageClassInput && var->storage != StorageClassOutput)\n\t\treturn;\n\n\tauto &type = get_variable_data_type(*var);\n\tif (type.array.empty())\n\t\treturn;\n\n\tauto builtin = BuiltIn(get_decoration(var->self, DecorationBuiltIn));\n\tbool is_builtin = is_builtin_variable(*var) &&\n\t                  (builtin == BuiltInPointSize ||\n\t                   builtin == BuiltInPosition ||\n\t                   builtin == BuiltInSampleMask);\n\tbool is_tess = is_tessellation_shader();\n\tbool is_patch = has_decoration(var->self, DecorationPatch);\n\tbool is_sample_mask = is_builtin && builtin == BuiltInSampleMask;\n\n\t// Tessellation input arrays are special in that they are unsized, so we cannot directly copy from it.\n\t// We must unroll the array load.\n\t// For builtins, we couldn't catch this case normally,\n\t// because this is resolved in the OpAccessChain in most cases.\n\t// If we load the entire array, we have no choice but to unroll here.\n\tif (!is_patch && (is_builtin || is_tess))\n\t{\n\t\tauto new_expr = join(\"_\", target_id, \"_unrolled\");\n\t\tstatement(variable_decl(type, new_expr, target_id), \";\");\n\t\tstring array_expr;\n\t\tif (type.array_size_literal.back())\n\t\t{\n\t\t\tarray_expr = convert_to_string(type.array.back());\n\t\t\tif (type.array.back() == 0)\n\t\t\t\tSPIRV_CROSS_THROW(\"Cannot unroll an array copy from unsized array.\");\n\t\t}\n\t\telse\n\t\t\tarray_expr = to_expression(type.array.back());\n\n\t\t// The array size might be a specialization constant, so use a for-loop instead.\n\t\tstatement(\"for (int i = 0; i < int(\", array_expr, \"); i++)\");\n\t\tbegin_scope();\n\t\tif (is_builtin && !is_sample_mask)\n\t\t\tstatement(new_expr, \"[i] = gl_in[i].\", expr, \";\");\n\t\telse if (is_sample_mask)\n\t\t{\n\t\t\tSPIRType target_type { OpTypeInt };\n\t\t\ttarget_type.basetype = SPIRType::Int;\n\t\t\tstatement(new_expr, \"[i] = \", bitcast_expression(target_type, type.basetype, join(expr, \"[i]\")), \";\");\n\t\t}\n\t\telse\n\t\t\tstatement(new_expr, \"[i] = \", expr, \"[i];\");\n\t\tend_scope();\n\n\t\texpr = std::move(new_expr);\n\t}\n}\n\nvoid CompilerGLSL::cast_from_variable_load(uint32_t source_id, std::string &expr, const SPIRType &expr_type)\n{\n\t// We will handle array cases elsewhere.\n\tif (!expr_type.array.empty())\n\t\treturn;\n\n\tauto *var = maybe_get_backing_variable(source_id);\n\tif (var)\n\t\tsource_id = var->self;\n\n\t// Only interested in standalone builtin variables.\n\tif (!has_decoration(source_id, DecorationBuiltIn))\n\t{\n\t\t// Except for int attributes in legacy GLSL, which are cast from float.\n\t\tif (is_legacy() && expr_type.basetype == SPIRType::Int && var && var->storage == StorageClassInput)\n\t\t\texpr = join(type_to_glsl(expr_type), \"(\", expr, \")\");\n\t\treturn;\n\t}\n\n\tauto builtin = static_cast<BuiltIn>(get_decoration(source_id, DecorationBuiltIn));\n\tauto expected_type = expr_type.basetype;\n\n\t// TODO: Fill in for more builtins.\n\tswitch (builtin)\n\t{\n\tcase BuiltInLayer:\n\tcase BuiltInPrimitiveId:\n\tcase BuiltInViewportIndex:\n\tcase BuiltInInstanceId:\n\tcase BuiltInInstanceIndex:\n\tcase BuiltInVertexId:\n\tcase BuiltInVertexIndex:\n\tcase BuiltInSampleId:\n\tcase BuiltInBaseVertex:\n\tcase BuiltInBaseInstance:\n\tcase BuiltInDrawIndex:\n\tcase BuiltInFragStencilRefEXT:\n\tcase BuiltInInstanceCustomIndexNV:\n\tcase BuiltInSampleMask:\n\tcase BuiltInPrimitiveShadingRateKHR:\n\tcase BuiltInShadingRateKHR:\n\t\texpected_type = SPIRType::Int;\n\t\tbreak;\n\n\tcase BuiltInGlobalInvocationId:\n\tcase BuiltInLocalInvocationId:\n\tcase BuiltInWorkgroupId:\n\tcase BuiltInLocalInvocationIndex:\n\tcase BuiltInWorkgroupSize:\n\tcase BuiltInNumWorkgroups:\n\tcase BuiltInIncomingRayFlagsNV:\n\tcase BuiltInLaunchIdNV:\n\tcase BuiltInLaunchSizeNV:\n\tcase BuiltInPrimitiveTriangleIndicesEXT:\n\tcase BuiltInPrimitiveLineIndicesEXT:\n\tcase BuiltInPrimitivePointIndicesEXT:\n\t\texpected_type = SPIRType::UInt;\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\tif (expected_type != expr_type.basetype)\n\t\texpr = bitcast_expression(expr_type, expected_type, expr);\n}\n\nSPIRType::BaseType CompilerGLSL::get_builtin_basetype(BuiltIn builtin, SPIRType::BaseType default_type)\n{\n\t// TODO: Fill in for more builtins.\n\tswitch (builtin)\n\t{\n\tcase BuiltInLayer:\n\tcase BuiltInPrimitiveId:\n\tcase BuiltInViewportIndex:\n\tcase BuiltInFragStencilRefEXT:\n\tcase BuiltInSampleMask:\n\tcase BuiltInPrimitiveShadingRateKHR:\n\tcase BuiltInShadingRateKHR:\n\t\treturn SPIRType::Int;\n\n\tdefault:\n\t\treturn default_type;\n\t}\n}\n\nvoid CompilerGLSL::cast_to_variable_store(uint32_t target_id, std::string &expr, const SPIRType &expr_type)\n{\n\tauto *var = maybe_get_backing_variable(target_id);\n\tif (var)\n\t\ttarget_id = var->self;\n\n\t// Only interested in standalone builtin variables.\n\tif (!has_decoration(target_id, DecorationBuiltIn))\n\t\treturn;\n\n\tauto builtin = static_cast<BuiltIn>(get_decoration(target_id, DecorationBuiltIn));\n\tauto expected_type = get_builtin_basetype(builtin, expr_type.basetype);\n\n\tif (expected_type != expr_type.basetype)\n\t{\n\t\tauto type = expr_type;\n\t\ttype.basetype = expected_type;\n\t\texpr = bitcast_expression(type, expr_type.basetype, expr);\n\t}\n}\n\nvoid CompilerGLSL::convert_non_uniform_expression(string &expr, uint32_t ptr_id)\n{\n\tif (*backend.nonuniform_qualifier == '\\0')\n\t\treturn;\n\n\tauto *var = maybe_get_backing_variable(ptr_id);\n\tif (!var)\n\t\treturn;\n\n\tif (var->storage != StorageClassUniformConstant &&\n\t    var->storage != StorageClassStorageBuffer &&\n\t    var->storage != StorageClassUniform)\n\t\treturn;\n\n\tauto &backing_type = get<SPIRType>(var->basetype);\n\tif (backing_type.array.empty())\n\t\treturn;\n\n\t// If we get here, we know we're accessing an arrayed resource which\n\t// might require nonuniform qualifier.\n\n\tauto start_array_index = expr.find_first_of('[');\n\n\tif (start_array_index == string::npos)\n\t\treturn;\n\n\t// We've opened a bracket, track expressions until we can close the bracket.\n\t// This must be our resource index.\n\tsize_t end_array_index = string::npos;\n\tunsigned bracket_count = 1;\n\tfor (size_t index = start_array_index + 1; index < expr.size(); index++)\n\t{\n\t\tif (expr[index] == ']')\n\t\t{\n\t\t\tif (--bracket_count == 0)\n\t\t\t{\n\t\t\t\tend_array_index = index;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\telse if (expr[index] == '[')\n\t\t\tbracket_count++;\n\t}\n\n\tassert(bracket_count == 0);\n\n\t// Doesn't really make sense to declare a non-arrayed image with nonuniformEXT, but there's\n\t// nothing we can do here to express that.\n\tif (start_array_index == string::npos || end_array_index == string::npos || end_array_index < start_array_index)\n\t\treturn;\n\n\tstart_array_index++;\n\n\texpr = join(expr.substr(0, start_array_index), backend.nonuniform_qualifier, \"(\",\n\t            expr.substr(start_array_index, end_array_index - start_array_index), \")\",\n\t            expr.substr(end_array_index, string::npos));\n}\n\nvoid CompilerGLSL::emit_block_hints(const SPIRBlock &block)\n{\n\tif ((options.es && options.version < 310) || (!options.es && options.version < 140))\n\t\treturn;\n\n\tswitch (block.hint)\n\t{\n\tcase SPIRBlock::HintFlatten:\n\t\trequire_extension_internal(\"GL_EXT_control_flow_attributes\");\n\t\tstatement(\"SPIRV_CROSS_FLATTEN\");\n\t\tbreak;\n\tcase SPIRBlock::HintDontFlatten:\n\t\trequire_extension_internal(\"GL_EXT_control_flow_attributes\");\n\t\tstatement(\"SPIRV_CROSS_BRANCH\");\n\t\tbreak;\n\tcase SPIRBlock::HintUnroll:\n\t\trequire_extension_internal(\"GL_EXT_control_flow_attributes\");\n\t\tstatement(\"SPIRV_CROSS_UNROLL\");\n\t\tbreak;\n\tcase SPIRBlock::HintDontUnroll:\n\t\trequire_extension_internal(\"GL_EXT_control_flow_attributes\");\n\t\tstatement(\"SPIRV_CROSS_LOOP\");\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nvoid CompilerGLSL::preserve_alias_on_reset(uint32_t id)\n{\n\tpreserved_aliases[id] = get_name(id);\n}\n\nvoid CompilerGLSL::reset_name_caches()\n{\n\tfor (auto &preserved : preserved_aliases)\n\t\tset_name(preserved.first, preserved.second);\n\n\tpreserved_aliases.clear();\n\tresource_names.clear();\n\tblock_input_names.clear();\n\tblock_output_names.clear();\n\tblock_ubo_names.clear();\n\tblock_ssbo_names.clear();\n\tblock_names.clear();\n\tfunction_overloads.clear();\n}\n\nvoid CompilerGLSL::fixup_anonymous_struct_names(std::unordered_set<uint32_t> &visited, const SPIRType &type)\n{\n\tif (visited.count(type.self))\n\t\treturn;\n\tvisited.insert(type.self);\n\n\tfor (uint32_t i = 0; i < uint32_t(type.member_types.size()); i++)\n\t{\n\t\tauto &mbr_type = get<SPIRType>(type.member_types[i]);\n\n\t\tif (mbr_type.basetype == SPIRType::Struct)\n\t\t{\n\t\t\t// If there are multiple aliases, the output might be somewhat unpredictable,\n\t\t\t// but the only real alternative in that case is to do nothing, which isn't any better.\n\t\t\t// This check should be fine in practice.\n\t\t\tif (get_name(mbr_type.self).empty() && !get_member_name(type.self, i).empty())\n\t\t\t{\n\t\t\t\tauto anon_name = join(\"anon_\", get_member_name(type.self, i));\n\t\t\t\tParsedIR::sanitize_underscores(anon_name);\n\t\t\t\tset_name(mbr_type.self, anon_name);\n\t\t\t}\n\n\t\t\tfixup_anonymous_struct_names(visited, mbr_type);\n\t\t}\n\t}\n}\n\nvoid CompilerGLSL::fixup_anonymous_struct_names()\n{\n\t// HLSL codegen can often end up emitting anonymous structs inside blocks, which\n\t// breaks GL linking since all names must match ...\n\t// Try to emit sensible code, so attempt to find such structs and emit anon_$member.\n\n\t// Breaks exponential explosion with weird type trees.\n\tstd::unordered_set<uint32_t> visited;\n\n\tir.for_each_typed_id<SPIRType>([&](uint32_t, SPIRType &type) {\n\t\tif (type.basetype == SPIRType::Struct &&\n\t\t    (has_decoration(type.self, DecorationBlock) ||\n\t\t     has_decoration(type.self, DecorationBufferBlock)))\n\t\t{\n\t\t\tfixup_anonymous_struct_names(visited, type);\n\t\t}\n\t});\n}\n\nvoid CompilerGLSL::fixup_type_alias()\n{\n\t// Due to how some backends work, the \"master\" type of type_alias must be a block-like type if it exists.\n\tir.for_each_typed_id<SPIRType>([&](uint32_t self, SPIRType &type) {\n\t\tif (!type.type_alias)\n\t\t\treturn;\n\n\t\tif (has_decoration(type.self, DecorationBlock) || has_decoration(type.self, DecorationBufferBlock))\n\t\t{\n\t\t\t// Top-level block types should never alias anything else.\n\t\t\ttype.type_alias = 0;\n\t\t}\n\t\telse if (type_is_block_like(type) && type.self == ID(self))\n\t\t{\n\t\t\t// A block-like type is any type which contains Offset decoration, but not top-level blocks,\n\t\t\t// i.e. blocks which are placed inside buffers.\n\t\t\t// Become the master.\n\t\t\tir.for_each_typed_id<SPIRType>([&](uint32_t other_id, SPIRType &other_type) {\n\t\t\t\tif (other_id == self)\n\t\t\t\t\treturn;\n\n\t\t\t\tif (other_type.type_alias == type.type_alias)\n\t\t\t\t\tother_type.type_alias = self;\n\t\t\t});\n\n\t\t\tthis->get<SPIRType>(type.type_alias).type_alias = self;\n\t\t\ttype.type_alias = 0;\n\t\t}\n\t});\n}\n\nvoid CompilerGLSL::reorder_type_alias()\n{\n\t// Reorder declaration of types so that the master of the type alias is always emitted first.\n\t// We need this in case a type B depends on type A (A must come before in the vector), but A is an alias of a type Abuffer, which\n\t// means declaration of A doesn't happen (yet), and order would be B, ABuffer and not ABuffer, B. Fix this up here.\n\tauto loop_lock = ir.create_loop_hard_lock();\n\n\tauto &type_ids = ir.ids_for_type[TypeType];\n\tfor (auto alias_itr = begin(type_ids); alias_itr != end(type_ids); ++alias_itr)\n\t{\n\t\tauto &type = get<SPIRType>(*alias_itr);\n\t\tif (type.type_alias != TypeID(0) &&\n\t\t    !has_extended_decoration(type.type_alias, SPIRVCrossDecorationBufferBlockRepacked))\n\t\t{\n\t\t\t// We will skip declaring this type, so make sure the type_alias type comes before.\n\t\t\tauto master_itr = find(begin(type_ids), end(type_ids), ID(type.type_alias));\n\t\t\tassert(master_itr != end(type_ids));\n\n\t\t\tif (alias_itr < master_itr)\n\t\t\t{\n\t\t\t\t// Must also swap the type order for the constant-type joined array.\n\t\t\t\tauto &joined_types = ir.ids_for_constant_undef_or_type;\n\t\t\t\tauto alt_alias_itr = find(begin(joined_types), end(joined_types), *alias_itr);\n\t\t\t\tauto alt_master_itr = find(begin(joined_types), end(joined_types), *master_itr);\n\t\t\t\tassert(alt_alias_itr != end(joined_types));\n\t\t\t\tassert(alt_master_itr != end(joined_types));\n\n\t\t\t\tswap(*alias_itr, *master_itr);\n\t\t\t\tswap(*alt_alias_itr, *alt_master_itr);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid CompilerGLSL::emit_line_directive(uint32_t file_id, uint32_t line_literal)\n{\n\t// If we are redirecting statements, ignore the line directive.\n\t// Common case here is continue blocks.\n\tif (redirect_statement)\n\t\treturn;\n\n\t// If we're emitting code in a sensitive context such as condition blocks in for loops, don't emit\n\t// any line directives, because it's not possible.\n\tif (block_debug_directives)\n\t\treturn;\n\n\tif (options.emit_line_directives)\n\t{\n\t\trequire_extension_internal(\"GL_GOOGLE_cpp_style_line_directive\");\n\t\tstatement_no_indent(\"#line \", line_literal, \" \\\"\", get<SPIRString>(file_id).str, \"\\\"\");\n\t}\n}\n\nvoid CompilerGLSL::emit_copy_logical_type(uint32_t lhs_id, uint32_t lhs_type_id, uint32_t rhs_id, uint32_t rhs_type_id,\n                                          SmallVector<uint32_t> chain)\n{\n\t// Fully unroll all member/array indices one by one.\n\n\tauto &lhs_type = get<SPIRType>(lhs_type_id);\n\tauto &rhs_type = get<SPIRType>(rhs_type_id);\n\n\tif (!lhs_type.array.empty())\n\t{\n\t\t// Could use a loop here to support specialization constants, but it gets rather complicated with nested array types,\n\t\t// and this is a rather obscure opcode anyways, keep it simple unless we are forced to.\n\t\tuint32_t array_size = to_array_size_literal(lhs_type);\n\t\tchain.push_back(0);\n\n\t\tfor (uint32_t i = 0; i < array_size; i++)\n\t\t{\n\t\t\tchain.back() = i;\n\t\t\temit_copy_logical_type(lhs_id, lhs_type.parent_type, rhs_id, rhs_type.parent_type, chain);\n\t\t}\n\t}\n\telse if (lhs_type.basetype == SPIRType::Struct)\n\t{\n\t\tchain.push_back(0);\n\t\tuint32_t member_count = uint32_t(lhs_type.member_types.size());\n\t\tfor (uint32_t i = 0; i < member_count; i++)\n\t\t{\n\t\t\tchain.back() = i;\n\t\t\temit_copy_logical_type(lhs_id, lhs_type.member_types[i], rhs_id, rhs_type.member_types[i], chain);\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Need to handle unpack/packing fixups since this can differ wildly between the logical types,\n\t\t// particularly in MSL.\n\t\t// To deal with this, we emit access chains and go through emit_store_statement\n\t\t// to deal with all the special cases we can encounter.\n\n\t\tAccessChainMeta lhs_meta, rhs_meta;\n\t\tauto lhs = access_chain_internal(lhs_id, chain.data(), uint32_t(chain.size()),\n\t\t                                 ACCESS_CHAIN_INDEX_IS_LITERAL_BIT, &lhs_meta);\n\t\tauto rhs = access_chain_internal(rhs_id, chain.data(), uint32_t(chain.size()),\n\t\t                                 ACCESS_CHAIN_INDEX_IS_LITERAL_BIT, &rhs_meta);\n\n\t\tuint32_t id = ir.increase_bound_by(2);\n\t\tlhs_id = id;\n\t\trhs_id = id + 1;\n\n\t\t{\n\t\t\tauto &lhs_expr = set<SPIRExpression>(lhs_id, std::move(lhs), lhs_type_id, true);\n\t\t\tlhs_expr.need_transpose = lhs_meta.need_transpose;\n\n\t\t\tif (lhs_meta.storage_is_packed)\n\t\t\t\tset_extended_decoration(lhs_id, SPIRVCrossDecorationPhysicalTypePacked);\n\t\t\tif (lhs_meta.storage_physical_type != 0)\n\t\t\t\tset_extended_decoration(lhs_id, SPIRVCrossDecorationPhysicalTypeID, lhs_meta.storage_physical_type);\n\n\t\t\tforwarded_temporaries.insert(lhs_id);\n\t\t\tsuppressed_usage_tracking.insert(lhs_id);\n\t\t}\n\n\t\t{\n\t\t\tauto &rhs_expr = set<SPIRExpression>(rhs_id, std::move(rhs), rhs_type_id, true);\n\t\t\trhs_expr.need_transpose = rhs_meta.need_transpose;\n\n\t\t\tif (rhs_meta.storage_is_packed)\n\t\t\t\tset_extended_decoration(rhs_id, SPIRVCrossDecorationPhysicalTypePacked);\n\t\t\tif (rhs_meta.storage_physical_type != 0)\n\t\t\t\tset_extended_decoration(rhs_id, SPIRVCrossDecorationPhysicalTypeID, rhs_meta.storage_physical_type);\n\n\t\t\tforwarded_temporaries.insert(rhs_id);\n\t\t\tsuppressed_usage_tracking.insert(rhs_id);\n\t\t}\n\n\t\temit_store_statement(lhs_id, rhs_id);\n\t}\n}\n\nbool CompilerGLSL::subpass_input_is_framebuffer_fetch(uint32_t id) const\n{\n\tif (!has_decoration(id, DecorationInputAttachmentIndex))\n\t\treturn false;\n\n\tuint32_t input_attachment_index = get_decoration(id, DecorationInputAttachmentIndex);\n\tfor (auto &remap : subpass_to_framebuffer_fetch_attachment)\n\t\tif (remap.first == input_attachment_index)\n\t\t\treturn true;\n\n\treturn false;\n}\n\nconst SPIRVariable *CompilerGLSL::find_subpass_input_by_attachment_index(uint32_t index) const\n{\n\tconst SPIRVariable *ret = nullptr;\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, const SPIRVariable &var) {\n\t\tif (has_decoration(var.self, DecorationInputAttachmentIndex) &&\n\t\t    get_decoration(var.self, DecorationInputAttachmentIndex) == index)\n\t\t{\n\t\t\tret = &var;\n\t\t}\n\t});\n\treturn ret;\n}\n\nconst SPIRVariable *CompilerGLSL::find_color_output_by_location(uint32_t location) const\n{\n\tconst SPIRVariable *ret = nullptr;\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, const SPIRVariable &var) {\n\t\tif (var.storage == StorageClassOutput && get_decoration(var.self, DecorationLocation) == location)\n\t\t\tret = &var;\n\t});\n\treturn ret;\n}\n\nvoid CompilerGLSL::emit_inout_fragment_outputs_copy_to_subpass_inputs()\n{\n\tfor (auto &remap : subpass_to_framebuffer_fetch_attachment)\n\t{\n\t\tauto *subpass_var = find_subpass_input_by_attachment_index(remap.first);\n\t\tauto *output_var = find_color_output_by_location(remap.second);\n\t\tif (!subpass_var)\n\t\t\tcontinue;\n\t\tif (!output_var)\n\t\t\tSPIRV_CROSS_THROW(\"Need to declare the corresponding fragment output variable to be able \"\n\t\t\t                  \"to read from it.\");\n\t\tif (is_array(get<SPIRType>(output_var->basetype)))\n\t\t\tSPIRV_CROSS_THROW(\"Cannot use GL_EXT_shader_framebuffer_fetch with arrays of color outputs.\");\n\n\t\tauto &func = get<SPIRFunction>(get_entry_point().self);\n\t\tfunc.fixup_hooks_in.push_back([=]() {\n\t\t\tif (is_legacy())\n\t\t\t{\n\t\t\t\tstatement(to_expression(subpass_var->self), \" = \", \"gl_LastFragData[\",\n\t\t\t\t          get_decoration(output_var->self, DecorationLocation), \"];\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tuint32_t num_rt_components = this->get<SPIRType>(output_var->basetype).vecsize;\n\t\t\t\tstatement(to_expression(subpass_var->self), vector_swizzle(num_rt_components, 0), \" = \",\n\t\t\t\t          to_expression(output_var->self), \";\");\n\t\t\t}\n\t\t});\n\t}\n}\n\nbool CompilerGLSL::variable_is_depth_or_compare(VariableID id) const\n{\n\treturn is_depth_image(get<SPIRType>(get<SPIRVariable>(id).basetype), id);\n}\n\nconst char *CompilerGLSL::ShaderSubgroupSupportHelper::get_extension_name(Candidate c)\n{\n\tstatic const char *const retval[CandidateCount] = { \"GL_KHR_shader_subgroup_ballot\",\n\t\t                                                \"GL_KHR_shader_subgroup_basic\",\n\t\t                                                \"GL_KHR_shader_subgroup_vote\",\n\t\t                                                \"GL_KHR_shader_subgroup_arithmetic\",\n\t\t                                                \"GL_NV_gpu_shader_5\",\n\t\t                                                \"GL_NV_shader_thread_group\",\n\t\t                                                \"GL_NV_shader_thread_shuffle\",\n\t\t                                                \"GL_ARB_shader_ballot\",\n\t\t                                                \"GL_ARB_shader_group_vote\",\n\t\t                                                \"GL_AMD_gcn_shader\" };\n\treturn retval[c];\n}\n\nSmallVector<std::string> CompilerGLSL::ShaderSubgroupSupportHelper::get_extra_required_extension_names(Candidate c)\n{\n\tswitch (c)\n\t{\n\tcase ARB_shader_ballot:\n\t\treturn { \"GL_ARB_shader_int64\" };\n\tcase AMD_gcn_shader:\n\t\treturn { \"GL_AMD_gpu_shader_int64\", \"GL_NV_gpu_shader5\" };\n\tdefault:\n\t\treturn {};\n\t}\n}\n\nconst char *CompilerGLSL::ShaderSubgroupSupportHelper::get_extra_required_extension_predicate(Candidate c)\n{\n\tswitch (c)\n\t{\n\tcase ARB_shader_ballot:\n\t\treturn \"defined(GL_ARB_shader_int64)\";\n\tcase AMD_gcn_shader:\n\t\treturn \"(defined(GL_AMD_gpu_shader_int64) || defined(GL_NV_gpu_shader5))\";\n\tdefault:\n\t\treturn \"\";\n\t}\n}\n\nCompilerGLSL::ShaderSubgroupSupportHelper::FeatureVector CompilerGLSL::ShaderSubgroupSupportHelper::\n    get_feature_dependencies(Feature feature)\n{\n\tswitch (feature)\n\t{\n\tcase SubgroupAllEqualT:\n\t\treturn { SubgroupBroadcast_First, SubgroupAll_Any_AllEqualBool };\n\tcase SubgroupElect:\n\t\treturn { SubgroupBallotFindLSB_MSB, SubgroupBallot, SubgroupInvocationID };\n\tcase SubgroupInverseBallot_InclBitCount_ExclBitCout:\n\t\treturn { SubgroupMask };\n\tcase SubgroupBallotBitCount:\n\t\treturn { SubgroupBallot };\n\tcase SubgroupArithmeticIAddReduce:\n\tcase SubgroupArithmeticIAddInclusiveScan:\n\tcase SubgroupArithmeticFAddReduce:\n\tcase SubgroupArithmeticFAddInclusiveScan:\n\tcase SubgroupArithmeticIMulReduce:\n\tcase SubgroupArithmeticIMulInclusiveScan:\n\tcase SubgroupArithmeticFMulReduce:\n\tcase SubgroupArithmeticFMulInclusiveScan:\n\t\treturn { SubgroupSize, SubgroupBallot, SubgroupBallotBitCount, SubgroupMask, SubgroupBallotBitExtract };\n\tcase SubgroupArithmeticIAddExclusiveScan:\n\tcase SubgroupArithmeticFAddExclusiveScan:\n\tcase SubgroupArithmeticIMulExclusiveScan:\n\tcase SubgroupArithmeticFMulExclusiveScan:\n\t\treturn { SubgroupSize, SubgroupBallot, SubgroupBallotBitCount,\n\t\t\t     SubgroupMask, SubgroupElect,  SubgroupBallotBitExtract };\n\tdefault:\n\t\treturn {};\n\t}\n}\n\nCompilerGLSL::ShaderSubgroupSupportHelper::FeatureMask CompilerGLSL::ShaderSubgroupSupportHelper::\n    get_feature_dependency_mask(Feature feature)\n{\n\treturn build_mask(get_feature_dependencies(feature));\n}\n\nbool CompilerGLSL::ShaderSubgroupSupportHelper::can_feature_be_implemented_without_extensions(Feature feature)\n{\n\tstatic const bool retval[FeatureCount] = {\n\t\tfalse, false, false, false, false, false,\n\t\ttrue, // SubgroupBalloFindLSB_MSB\n\t\tfalse, false, false, false,\n\t\ttrue, // SubgroupMemBarrier - replaced with workgroup memory barriers\n\t\tfalse, false, true, false,\n\t\tfalse, false, false, false, false, false, // iadd, fadd\n\t\tfalse, false, false, false, false, false, // imul , fmul\n\t};\n\n\treturn retval[feature];\n}\n\nCompilerGLSL::ShaderSubgroupSupportHelper::Candidate CompilerGLSL::ShaderSubgroupSupportHelper::\n    get_KHR_extension_for_feature(Feature feature)\n{\n\tstatic const Candidate extensions[FeatureCount] = {\n\t\tKHR_shader_subgroup_ballot, KHR_shader_subgroup_basic,  KHR_shader_subgroup_basic,  KHR_shader_subgroup_basic,\n\t\tKHR_shader_subgroup_basic,  KHR_shader_subgroup_ballot, KHR_shader_subgroup_ballot, KHR_shader_subgroup_vote,\n\t\tKHR_shader_subgroup_vote,   KHR_shader_subgroup_basic,  KHR_shader_subgroup_basic, KHR_shader_subgroup_basic,\n\t\tKHR_shader_subgroup_ballot, KHR_shader_subgroup_ballot, KHR_shader_subgroup_ballot, KHR_shader_subgroup_ballot,\n\t\tKHR_shader_subgroup_arithmetic, KHR_shader_subgroup_arithmetic, KHR_shader_subgroup_arithmetic,\n\t\tKHR_shader_subgroup_arithmetic, KHR_shader_subgroup_arithmetic, KHR_shader_subgroup_arithmetic,\n\t\tKHR_shader_subgroup_arithmetic, KHR_shader_subgroup_arithmetic, KHR_shader_subgroup_arithmetic,\n\t\tKHR_shader_subgroup_arithmetic, KHR_shader_subgroup_arithmetic, KHR_shader_subgroup_arithmetic,\n\t};\n\n\treturn extensions[feature];\n}\n\nvoid CompilerGLSL::ShaderSubgroupSupportHelper::request_feature(Feature feature)\n{\n\tfeature_mask |= (FeatureMask(1) << feature) | get_feature_dependency_mask(feature);\n}\n\nbool CompilerGLSL::ShaderSubgroupSupportHelper::is_feature_requested(Feature feature) const\n{\n\treturn (feature_mask & (1u << feature)) != 0;\n}\n\nCompilerGLSL::ShaderSubgroupSupportHelper::Result CompilerGLSL::ShaderSubgroupSupportHelper::resolve() const\n{\n\tResult res;\n\n\tfor (uint32_t i = 0u; i < FeatureCount; ++i)\n\t{\n\t\tif (feature_mask & (1u << i))\n\t\t{\n\t\t\tauto feature = static_cast<Feature>(i);\n\t\t\tstd::unordered_set<uint32_t> unique_candidates;\n\n\t\t\tauto candidates = get_candidates_for_feature(feature);\n\t\t\tunique_candidates.insert(candidates.begin(), candidates.end());\n\n\t\t\tauto deps = get_feature_dependencies(feature);\n\t\t\tfor (Feature d : deps)\n\t\t\t{\n\t\t\t\tcandidates = get_candidates_for_feature(d);\n\t\t\t\tif (!candidates.empty())\n\t\t\t\t\tunique_candidates.insert(candidates.begin(), candidates.end());\n\t\t\t}\n\n\t\t\tfor (uint32_t c : unique_candidates)\n\t\t\t\t++res.weights[static_cast<Candidate>(c)];\n\t\t}\n\t}\n\n\treturn res;\n}\n\nCompilerGLSL::ShaderSubgroupSupportHelper::CandidateVector CompilerGLSL::ShaderSubgroupSupportHelper::\n    get_candidates_for_feature(Feature ft, const Result &r)\n{\n\tauto c = get_candidates_for_feature(ft);\n\tauto cmp = [&r](Candidate a, Candidate b) {\n\t\tif (r.weights[a] == r.weights[b])\n\t\t\treturn a < b; // Prefer candidates with lower enum value\n\t\treturn r.weights[a] > r.weights[b];\n\t};\n\tstd::sort(c.begin(), c.end(), cmp);\n\treturn c;\n}\n\nCompilerGLSL::ShaderSubgroupSupportHelper::CandidateVector CompilerGLSL::ShaderSubgroupSupportHelper::\n    get_candidates_for_feature(Feature feature)\n{\n\tswitch (feature)\n\t{\n\tcase SubgroupMask:\n\t\treturn { KHR_shader_subgroup_ballot, NV_shader_thread_group, ARB_shader_ballot };\n\tcase SubgroupSize:\n\t\treturn { KHR_shader_subgroup_basic, NV_shader_thread_group, AMD_gcn_shader, ARB_shader_ballot };\n\tcase SubgroupInvocationID:\n\t\treturn { KHR_shader_subgroup_basic, NV_shader_thread_group, ARB_shader_ballot };\n\tcase SubgroupID:\n\t\treturn { KHR_shader_subgroup_basic, NV_shader_thread_group };\n\tcase NumSubgroups:\n\t\treturn { KHR_shader_subgroup_basic, NV_shader_thread_group };\n\tcase SubgroupBroadcast_First:\n\t\treturn { KHR_shader_subgroup_ballot, NV_shader_thread_shuffle, ARB_shader_ballot };\n\tcase SubgroupBallotFindLSB_MSB:\n\t\treturn { KHR_shader_subgroup_ballot, NV_shader_thread_group };\n\tcase SubgroupAll_Any_AllEqualBool:\n\t\treturn { KHR_shader_subgroup_vote, NV_gpu_shader_5, ARB_shader_group_vote, AMD_gcn_shader };\n\tcase SubgroupAllEqualT:\n\t\treturn {}; // depends on other features only\n\tcase SubgroupElect:\n\t\treturn {}; // depends on other features only\n\tcase SubgroupBallot:\n\t\treturn { KHR_shader_subgroup_ballot, NV_shader_thread_group, ARB_shader_ballot };\n\tcase SubgroupBarrier:\n\t\treturn { KHR_shader_subgroup_basic, NV_shader_thread_group, ARB_shader_ballot, AMD_gcn_shader };\n\tcase SubgroupMemBarrier:\n\t\treturn { KHR_shader_subgroup_basic };\n\tcase SubgroupInverseBallot_InclBitCount_ExclBitCout:\n\t\treturn {};\n\tcase SubgroupBallotBitExtract:\n\t\treturn { NV_shader_thread_group };\n\tcase SubgroupBallotBitCount:\n\t\treturn {};\n\tcase SubgroupArithmeticIAddReduce:\n\tcase SubgroupArithmeticIAddExclusiveScan:\n\tcase SubgroupArithmeticIAddInclusiveScan:\n\tcase SubgroupArithmeticFAddReduce:\n\tcase SubgroupArithmeticFAddExclusiveScan:\n\tcase SubgroupArithmeticFAddInclusiveScan:\n\tcase SubgroupArithmeticIMulReduce:\n\tcase SubgroupArithmeticIMulExclusiveScan:\n\tcase SubgroupArithmeticIMulInclusiveScan:\n\tcase SubgroupArithmeticFMulReduce:\n\tcase SubgroupArithmeticFMulExclusiveScan:\n\tcase SubgroupArithmeticFMulInclusiveScan:\n\t\treturn { KHR_shader_subgroup_arithmetic, NV_shader_thread_shuffle };\n\tdefault:\n\t\treturn {};\n\t}\n}\n\nCompilerGLSL::ShaderSubgroupSupportHelper::FeatureMask CompilerGLSL::ShaderSubgroupSupportHelper::build_mask(\n    const SmallVector<Feature> &features)\n{\n\tFeatureMask mask = 0;\n\tfor (Feature f : features)\n\t\tmask |= FeatureMask(1) << f;\n\treturn mask;\n}\n\nCompilerGLSL::ShaderSubgroupSupportHelper::Result::Result()\n{\n\tfor (auto &weight : weights)\n\t\tweight = 0;\n\n\t// Make sure KHR_shader_subgroup extensions are always prefered.\n\tconst uint32_t big_num = FeatureCount;\n\tweights[KHR_shader_subgroup_ballot] = big_num;\n\tweights[KHR_shader_subgroup_basic] = big_num;\n\tweights[KHR_shader_subgroup_vote] = big_num;\n\tweights[KHR_shader_subgroup_arithmetic] = big_num;\n}\n\nvoid CompilerGLSL::request_workaround_wrapper_overload(TypeID id)\n{\n\t// Must be ordered to maintain deterministic output, so vector is appropriate.\n\tif (find(begin(workaround_ubo_load_overload_types), end(workaround_ubo_load_overload_types), id) ==\n\t    end(workaround_ubo_load_overload_types))\n\t{\n\t\tforce_recompile();\n\t\tworkaround_ubo_load_overload_types.push_back(id);\n\t}\n}\n\nvoid CompilerGLSL::rewrite_load_for_wrapped_row_major(std::string &expr, TypeID loaded_type, ID ptr)\n{\n\t// Loading row-major matrices from UBOs on older AMD Windows OpenGL drivers is problematic.\n\t// To load these types correctly, we must first wrap them in a dummy function which only purpose is to\n\t// ensure row_major decoration is actually respected.\n\tauto *var = maybe_get_backing_variable(ptr);\n\tif (!var)\n\t\treturn;\n\n\tauto &backing_type = get<SPIRType>(var->basetype);\n\tbool is_ubo = backing_type.basetype == SPIRType::Struct && backing_type.storage == StorageClassUniform &&\n\t              has_decoration(backing_type.self, DecorationBlock);\n\tif (!is_ubo)\n\t\treturn;\n\n\tauto *type = &get<SPIRType>(loaded_type);\n\tbool rewrite = false;\n\tbool relaxed = options.es;\n\n\tif (is_matrix(*type))\n\t{\n\t\t// To avoid adding a lot of unnecessary meta tracking to forward the row_major state,\n\t\t// we will simply look at the base struct itself. It is exceptionally rare to mix and match row-major/col-major state.\n\t\t// If there is any row-major action going on, we apply the workaround.\n\t\t// It is harmless to apply the workaround to column-major matrices, so this is still a valid solution.\n\t\t// If an access chain occurred, the workaround is not required, so loading vectors or scalars don't need workaround.\n\t\ttype = &backing_type;\n\t}\n\telse\n\t{\n\t\t// If we're loading a composite, we don't have overloads like these.\n\t\trelaxed = false;\n\t}\n\n\tif (type->basetype == SPIRType::Struct)\n\t{\n\t\t// If we're loading a struct where any member is a row-major matrix, apply the workaround.\n\t\tfor (uint32_t i = 0; i < uint32_t(type->member_types.size()); i++)\n\t\t{\n\t\t\tauto decorations = combined_decoration_for_member(*type, i);\n\t\t\tif (decorations.get(DecorationRowMajor))\n\t\t\t\trewrite = true;\n\n\t\t\t// Since we decide on a per-struct basis, only use mediump wrapper if all candidates are mediump.\n\t\t\tif (!decorations.get(DecorationRelaxedPrecision))\n\t\t\t\trelaxed = false;\n\t\t}\n\t}\n\n\tif (rewrite)\n\t{\n\t\trequest_workaround_wrapper_overload(loaded_type);\n\t\texpr = join(\"spvWorkaroundRowMajor\", (relaxed ? \"MP\" : \"\"), \"(\", expr, \")\");\n\t}\n}\n\nvoid CompilerGLSL::mask_stage_output_by_location(uint32_t location, uint32_t component)\n{\n\tmasked_output_locations.insert({ location, component });\n}\n\nvoid CompilerGLSL::mask_stage_output_by_builtin(BuiltIn builtin)\n{\n\tmasked_output_builtins.insert(builtin);\n}\n\nbool CompilerGLSL::is_stage_output_variable_masked(const SPIRVariable &var) const\n{\n\tauto &type = get<SPIRType>(var.basetype);\n\tbool is_block = has_decoration(type.self, DecorationBlock);\n\t// Blocks by themselves are never masked. Must be masked per-member.\n\tif (is_block)\n\t\treturn false;\n\n\tbool is_builtin = has_decoration(var.self, DecorationBuiltIn);\n\n\tif (is_builtin)\n\t{\n\t\treturn is_stage_output_builtin_masked(BuiltIn(get_decoration(var.self, DecorationBuiltIn)));\n\t}\n\telse\n\t{\n\t\tif (!has_decoration(var.self, DecorationLocation))\n\t\t\treturn false;\n\n\t\treturn is_stage_output_location_masked(\n\t\t\t\tget_decoration(var.self, DecorationLocation),\n\t\t\t\tget_decoration(var.self, DecorationComponent));\n\t}\n}\n\nbool CompilerGLSL::is_stage_output_block_member_masked(const SPIRVariable &var, uint32_t index, bool strip_array) const\n{\n\tauto &type = get<SPIRType>(var.basetype);\n\tbool is_block = has_decoration(type.self, DecorationBlock);\n\tif (!is_block)\n\t\treturn false;\n\n\tBuiltIn builtin = BuiltInMax;\n\tif (is_member_builtin(type, index, &builtin))\n\t{\n\t\treturn is_stage_output_builtin_masked(builtin);\n\t}\n\telse\n\t{\n\t\tuint32_t location = get_declared_member_location(var, index, strip_array);\n\t\tuint32_t component = get_member_decoration(type.self, index, DecorationComponent);\n\t\treturn is_stage_output_location_masked(location, component);\n\t}\n}\n\nbool CompilerGLSL::is_per_primitive_variable(const SPIRVariable &var) const\n{\n\tif (has_decoration(var.self, DecorationPerPrimitiveEXT))\n\t\treturn true;\n\n\tauto &type = get<SPIRType>(var.basetype);\n\tif (!has_decoration(type.self, DecorationBlock))\n\t\treturn false;\n\n\tfor (uint32_t i = 0, n = uint32_t(type.member_types.size()); i < n; i++)\n\t\tif (!has_member_decoration(type.self, i, DecorationPerPrimitiveEXT))\n\t\t\treturn false;\n\n\treturn true;\n}\n\nbool CompilerGLSL::is_stage_output_location_masked(uint32_t location, uint32_t component) const\n{\n\treturn masked_output_locations.count({ location, component }) != 0;\n}\n\nbool CompilerGLSL::is_stage_output_builtin_masked(spv::BuiltIn builtin) const\n{\n\treturn masked_output_builtins.count(builtin) != 0;\n}\n\nuint32_t CompilerGLSL::get_declared_member_location(const SPIRVariable &var, uint32_t mbr_idx, bool strip_array) const\n{\n\tauto &block_type = get<SPIRType>(var.basetype);\n\tif (has_member_decoration(block_type.self, mbr_idx, DecorationLocation))\n\t\treturn get_member_decoration(block_type.self, mbr_idx, DecorationLocation);\n\telse\n\t\treturn get_accumulated_member_location(var, mbr_idx, strip_array);\n}\n\nuint32_t CompilerGLSL::get_accumulated_member_location(const SPIRVariable &var, uint32_t mbr_idx, bool strip_array) const\n{\n\tauto &type = strip_array ? get_variable_element_type(var) : get_variable_data_type(var);\n\tuint32_t location = get_decoration(var.self, DecorationLocation);\n\n\tfor (uint32_t i = 0; i < mbr_idx; i++)\n\t{\n\t\tauto &mbr_type = get<SPIRType>(type.member_types[i]);\n\n\t\t// Start counting from any place we have a new location decoration.\n\t\tif (has_member_decoration(type.self, mbr_idx, DecorationLocation))\n\t\t\tlocation = get_member_decoration(type.self, mbr_idx, DecorationLocation);\n\n\t\tuint32_t location_count = type_to_location_count(mbr_type);\n\t\tlocation += location_count;\n\t}\n\n\treturn location;\n}\n\nStorageClass CompilerGLSL::get_expression_effective_storage_class(uint32_t ptr)\n{\n\tauto *var = maybe_get_backing_variable(ptr);\n\n\t// If the expression has been lowered to a temporary, we need to use the Generic storage class.\n\t// We're looking for the effective storage class of a given expression.\n\t// An access chain or forwarded OpLoads from such access chains\n\t// will generally have the storage class of the underlying variable, but if the load was not forwarded\n\t// we have lost any address space qualifiers.\n\tbool forced_temporary = ir.ids[ptr].get_type() == TypeExpression && !get<SPIRExpression>(ptr).access_chain &&\n\t                        (forced_temporaries.count(ptr) != 0 || forwarded_temporaries.count(ptr) == 0);\n\n\tif (var && !forced_temporary)\n\t{\n\t\tif (variable_decl_is_remapped_storage(*var, StorageClassWorkgroup))\n\t\t\treturn StorageClassWorkgroup;\n\t\tif (variable_decl_is_remapped_storage(*var, StorageClassStorageBuffer))\n\t\t\treturn StorageClassStorageBuffer;\n\n\t\t// Normalize SSBOs to StorageBuffer here.\n\t\tif (var->storage == StorageClassUniform &&\n\t\t    has_decoration(get<SPIRType>(var->basetype).self, DecorationBufferBlock))\n\t\t\treturn StorageClassStorageBuffer;\n\t\telse\n\t\t\treturn var->storage;\n\t}\n\telse\n\t\treturn expression_type(ptr).storage;\n}\n\nuint32_t CompilerGLSL::type_to_location_count(const SPIRType &type) const\n{\n\tuint32_t count;\n\tif (type.basetype == SPIRType::Struct)\n\t{\n\t\tuint32_t mbr_count = uint32_t(type.member_types.size());\n\t\tcount = 0;\n\t\tfor (uint32_t i = 0; i < mbr_count; i++)\n\t\t\tcount += type_to_location_count(get<SPIRType>(type.member_types[i]));\n\t}\n\telse\n\t{\n\t\tcount = type.columns > 1 ? type.columns : 1;\n\t}\n\n\tuint32_t dim_count = uint32_t(type.array.size());\n\tfor (uint32_t i = 0; i < dim_count; i++)\n\t\tcount *= to_array_size_literal(type, i);\n\n\treturn count;\n}\n\nstd::string CompilerGLSL::format_float(float value) const\n{\n\tif (float_formatter)\n\t\treturn float_formatter->format_float(value);\n\n\t// default behavior\n\treturn convert_to_string(value, current_locale_radix_character);\n}\n\nstd::string CompilerGLSL::format_double(double value) const\n{\n\tif (float_formatter)\n\t\treturn float_formatter->format_double(value);\n\n\t// default behavior\n\treturn convert_to_string(value, current_locale_radix_character);\n}\n\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv_glsl.hpp",
    "content": "/*\n * Copyright 2015-2021 Arm Limited\n * SPDX-License-Identifier: Apache-2.0 OR MIT\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * At your option, you may choose to accept this material under either:\n *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or\n *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.\n */\n\n#ifndef SPIRV_CROSS_GLSL_HPP\n#define SPIRV_CROSS_GLSL_HPP\n\n#include \"GLSL.std.450.h\"\n#include \"spirv_cross.hpp\"\n#include <unordered_map>\n#include <unordered_set>\n#include <utility>\n\nnamespace SPIRV_CROSS_NAMESPACE\n{\nenum PlsFormat\n{\n\tPlsNone = 0,\n\n\tPlsR11FG11FB10F,\n\tPlsR32F,\n\tPlsRG16F,\n\tPlsRGB10A2,\n\tPlsRGBA8,\n\tPlsRG16,\n\n\tPlsRGBA8I,\n\tPlsRG16I,\n\n\tPlsRGB10A2UI,\n\tPlsRGBA8UI,\n\tPlsRG16UI,\n\tPlsR32UI\n};\n\nstruct PlsRemap\n{\n\tuint32_t id;\n\tPlsFormat format;\n};\n\nenum AccessChainFlagBits\n{\n\tACCESS_CHAIN_INDEX_IS_LITERAL_BIT = 1 << 0,\n\tACCESS_CHAIN_CHAIN_ONLY_BIT = 1 << 1,\n\tACCESS_CHAIN_PTR_CHAIN_BIT = 1 << 2,\n\tACCESS_CHAIN_SKIP_REGISTER_EXPRESSION_READ_BIT = 1 << 3,\n\tACCESS_CHAIN_LITERAL_MSB_FORCE_ID = 1 << 4,\n\tACCESS_CHAIN_FLATTEN_ALL_MEMBERS_BIT = 1 << 5,\n\tACCESS_CHAIN_FORCE_COMPOSITE_BIT = 1 << 6\n};\ntypedef uint32_t AccessChainFlags;\n\nclass CompilerGLSL : public Compiler\n{\npublic:\n\tstruct Options\n\t{\n\t\t// The shading language version. Corresponds to #version $VALUE.\n\t\tuint32_t version = 450;\n\n\t\t// Emit the OpenGL ES shading language instead of desktop OpenGL.\n\t\tbool es = false;\n\n\t\t// Debug option to always emit temporary variables for all expressions.\n\t\tbool force_temporary = false;\n\t\t// Debug option, can be increased in an attempt to workaround SPIRV-Cross bugs temporarily.\n\t\t// If this limit has to be increased, it points to an implementation bug.\n\t\t// In certain scenarios, the maximum number of debug iterations may increase beyond this limit\n\t\t// as long as we can prove we're making certain kinds of forward progress.\n\t\tuint32_t force_recompile_max_debug_iterations = 3;\n\n\t\t// If true, Vulkan GLSL features are used instead of GL-compatible features.\n\t\t// Mostly useful for debugging SPIR-V files.\n\t\tbool vulkan_semantics = false;\n\n\t\t// If true, gl_PerVertex is explicitly redeclared in vertex, geometry and tessellation shaders.\n\t\t// The members of gl_PerVertex is determined by which built-ins are declared by the shader.\n\t\t// This option is ignored in ES versions, as redeclaration in ES is not required, and it depends on a different extension\n\t\t// (EXT_shader_io_blocks) which makes things a bit more fuzzy.\n\t\tbool separate_shader_objects = false;\n\n\t\t// Flattens multidimensional arrays, e.g. float foo[a][b][c] into single-dimensional arrays,\n\t\t// e.g. float foo[a * b * c].\n\t\t// This function does not change the actual SPIRType of any object.\n\t\t// Only the generated code, including declarations of interface variables are changed to be single array dimension.\n\t\tbool flatten_multidimensional_arrays = false;\n\n\t\t// For older desktop GLSL targets than version 420, the\n\t\t// GL_ARB_shading_language_420pack extensions is used to be able to support\n\t\t// layout(binding) on UBOs and samplers.\n\t\t// If disabled on older targets, binding decorations will be stripped.\n\t\tbool enable_420pack_extension = true;\n\n\t\t// In non-Vulkan GLSL, emit push constant blocks as UBOs rather than plain uniforms.\n\t\tbool emit_push_constant_as_uniform_buffer = false;\n\n\t\t// Always emit uniform blocks as plain uniforms, regardless of the GLSL version, even when UBOs are supported.\n\t\t// Does not apply to shader storage or push constant blocks.\n\t\tbool emit_uniform_buffer_as_plain_uniforms = false;\n\n\t\t// Emit OpLine directives if present in the module.\n\t\t// May not correspond exactly to original source, but should be a good approximation.\n\t\tbool emit_line_directives = false;\n\n\t\t// In cases where readonly/writeonly decoration are not used at all,\n\t\t// we try to deduce which qualifier(s) we should actually used, since actually emitting\n\t\t// read-write decoration is very rare, and older glslang/HLSL compilers tend to just emit readwrite as a matter of fact.\n\t\t// The default (true) is to enable automatic deduction for these cases, but if you trust the decorations set\n\t\t// by the SPIR-V, it's recommended to set this to false.\n\t\tbool enable_storage_image_qualifier_deduction = true;\n\n\t\t// On some targets (WebGPU), uninitialized variables are banned.\n\t\t// If this is enabled, all variables (temporaries, Private, Function)\n\t\t// which would otherwise be uninitialized will now be initialized to 0 instead.\n\t\tbool force_zero_initialized_variables = false;\n\n\t\t// In GLSL, force use of I/O block flattening, similar to\n\t\t// what happens on legacy GLSL targets for blocks and structs.\n\t\tbool force_flattened_io_blocks = false;\n\n\t\t// For opcodes where we have to perform explicit additional nan checks, very ugly code is generated.\n\t\t// If we opt-in, ignore these requirements.\n\t\t// In opcodes like NClamp/NMin/NMax and FP compare, ignore NaN behavior.\n\t\t// Use FClamp/FMin/FMax semantics for clamps and lets implementation choose ordered or unordered\n\t\t// compares.\n\t\tbool relax_nan_checks = false;\n\n\t\t// Loading row-major matrices from UBOs on older AMD Windows OpenGL drivers is problematic.\n\t\t// To load these types correctly, we must generate a wrapper. them in a dummy function which only purpose is to\n\t\t// ensure row_major decoration is actually respected.\n\t\t// This workaround may cause significant performance degeneration on some Android devices.\n\t\tbool enable_row_major_load_workaround = true;\n\n\t\t// If non-zero, controls layout(num_views = N) in; in GL_OVR_multiview2.\n\t\tuint32_t ovr_multiview_view_count = 0;\n\n\t\tenum Precision\n\t\t{\n\t\t\tDontCare,\n\t\t\tLowp,\n\t\t\tMediump,\n\t\t\tHighp\n\t\t};\n\n\t\tstruct VertexOptions\n\t\t{\n\t\t\t// \"Vertex-like shader\" here is any shader stage that can write BuiltInPosition.\n\n\t\t\t// GLSL: In vertex-like shaders, rewrite [0, w] depth (Vulkan/D3D style) to [-w, w] depth (GL style).\n\t\t\t// MSL: In vertex-like shaders, rewrite [-w, w] depth (GL style) to [0, w] depth.\n\t\t\t// HLSL: In vertex-like shaders, rewrite [-w, w] depth (GL style) to [0, w] depth.\n\t\t\tbool fixup_clipspace = false;\n\n\t\t\t// In vertex-like shaders, inverts gl_Position.y or equivalent.\n\t\t\tbool flip_vert_y = false;\n\n\t\t\t// GLSL only, for HLSL version of this option, see CompilerHLSL.\n\t\t\t// If true, the backend will assume that InstanceIndex will need to apply\n\t\t\t// a base instance offset. Set to false if you know you will never use base instance\n\t\t\t// functionality as it might remove some internal uniforms.\n\t\t\tbool support_nonzero_base_instance = true;\n\t\t} vertex;\n\n\t\tstruct FragmentOptions\n\t\t{\n\t\t\t// Add precision mediump float in ES targets when emitting GLES source.\n\t\t\t// Add precision highp int in ES targets when emitting GLES source.\n\t\t\tPrecision default_float_precision = Mediump;\n\t\t\tPrecision default_int_precision = Highp;\n\t\t} fragment;\n\t};\n\n\tvoid remap_pixel_local_storage(std::vector<PlsRemap> inputs, std::vector<PlsRemap> outputs)\n\t{\n\t\tpls_inputs = std::move(inputs);\n\t\tpls_outputs = std::move(outputs);\n\t\tremap_pls_variables();\n\t}\n\n\t// Redirect a subpassInput reading from input_attachment_index to instead load its value from\n\t// the color attachment at location = color_location. Requires ESSL.\n\t// If coherent, uses GL_EXT_shader_framebuffer_fetch, if not, uses noncoherent variant.\n\tvoid remap_ext_framebuffer_fetch(uint32_t input_attachment_index, uint32_t color_location, bool coherent);\n\n\texplicit CompilerGLSL(std::vector<uint32_t> spirv_)\n\t    : Compiler(std::move(spirv_))\n\t{\n\t\tinit();\n\t}\n\n\tCompilerGLSL(const uint32_t *ir_, size_t word_count)\n\t    : Compiler(ir_, word_count)\n\t{\n\t\tinit();\n\t}\n\n\texplicit CompilerGLSL(const ParsedIR &ir_)\n\t    : Compiler(ir_)\n\t{\n\t\tinit();\n\t}\n\n\texplicit CompilerGLSL(ParsedIR &&ir_)\n\t    : Compiler(std::move(ir_))\n\t{\n\t\tinit();\n\t}\n\n\tconst Options &get_common_options() const\n\t{\n\t\treturn options;\n\t}\n\n\tvoid set_common_options(const Options &opts)\n\t{\n\t\toptions = opts;\n\t}\n\n\tstd::string compile() override;\n\n\t// Returns the current string held in the conversion buffer. Useful for\n\t// capturing what has been converted so far when compile() throws an error.\n\tstd::string get_partial_source();\n\n\t// Adds a line to be added right after #version in GLSL backend.\n\t// This is useful for enabling custom extensions which are outside the scope of SPIRV-Cross.\n\t// This can be combined with variable remapping.\n\t// A new-line will be added.\n\t//\n\t// While add_header_line() is a more generic way of adding arbitrary text to the header\n\t// of a GLSL file, require_extension() should be used when adding extensions since it will\n\t// avoid creating collisions with SPIRV-Cross generated extensions.\n\t//\n\t// Code added via add_header_line() is typically backend-specific.\n\tvoid add_header_line(const std::string &str);\n\n\t// Adds an extension which is required to run this shader, e.g.\n\t// require_extension(\"GL_KHR_my_extension\");\n\tvoid require_extension(const std::string &ext);\n\n\t// Returns the list of required extensions. After compilation this will contains any other \n\t// extensions that the compiler used automatically, in addition to the user specified ones.\n\tconst SmallVector<std::string> &get_required_extensions() const;\n\n\t// Legacy GLSL compatibility method.\n\t// Takes a uniform or push constant variable and flattens it into a (i|u)vec4 array[N]; array instead.\n\t// For this to work, all types in the block must be the same basic type, e.g. mixing vec2 and vec4 is fine, but\n\t// mixing int and float is not.\n\t// The name of the uniform array will be the same as the interface block name.\n\tvoid flatten_buffer_block(VariableID id);\n\n\t// After compilation, query if a variable ID was used as a depth resource.\n\t// This is meaningful for MSL since descriptor types depend on this knowledge.\n\t// Cases which return true:\n\t// - Images which are declared with depth = 1 image type.\n\t// - Samplers which are statically used at least once with Dref opcodes.\n\t// - Images which are statically used at least once with Dref opcodes.\n\tbool variable_is_depth_or_compare(VariableID id) const;\n\n\t// If a shader output is active in this stage, but inactive in a subsequent stage,\n\t// this can be signalled here. This can be used to work around certain cross-stage matching problems\n\t// which plagues MSL and HLSL in certain scenarios.\n\t// An output which matches one of these will not be emitted in stage output interfaces, but rather treated as a private\n\t// variable.\n\t// This option is only meaningful for MSL and HLSL, since GLSL matches by location directly.\n\t// Masking builtins only takes effect if the builtin in question is part of the stage output interface.\n\tvoid mask_stage_output_by_location(uint32_t location, uint32_t component);\n\tvoid mask_stage_output_by_builtin(spv::BuiltIn builtin);\n\n\t// Allow to control how to format float literals in the output.\n\t// Set to \"nullptr\" to use the default \"convert_to_string\" function.\n\t// This handle is not owned by SPIRV-Cross and must remain valid until compile() has been called.\n\tvoid set_float_formatter(FloatFormatter *formatter)\n\t{\n\t\tfloat_formatter = formatter;\n\t}\n\nprotected:\n\tstruct ShaderSubgroupSupportHelper\n\t{\n\t\t// lower enum value = greater priority\n\t\tenum Candidate\n\t\t{\n\t\t\tKHR_shader_subgroup_ballot,\n\t\t\tKHR_shader_subgroup_basic,\n\t\t\tKHR_shader_subgroup_vote,\n\t\t\tKHR_shader_subgroup_arithmetic,\n\t\t\tNV_gpu_shader_5,\n\t\t\tNV_shader_thread_group,\n\t\t\tNV_shader_thread_shuffle,\n\t\t\tARB_shader_ballot,\n\t\t\tARB_shader_group_vote,\n\t\t\tAMD_gcn_shader,\n\n\t\t\tCandidateCount\n\t\t};\n\n\t\tstatic const char *get_extension_name(Candidate c);\n\t\tstatic SmallVector<std::string> get_extra_required_extension_names(Candidate c);\n\t\tstatic const char *get_extra_required_extension_predicate(Candidate c);\n\n\t\tenum Feature\n\t\t{\n\t\t\tSubgroupMask = 0,\n\t\t\tSubgroupSize = 1,\n\t\t\tSubgroupInvocationID = 2,\n\t\t\tSubgroupID = 3,\n\t\t\tNumSubgroups = 4,\n\t\t\tSubgroupBroadcast_First = 5,\n\t\t\tSubgroupBallotFindLSB_MSB = 6,\n\t\t\tSubgroupAll_Any_AllEqualBool = 7,\n\t\t\tSubgroupAllEqualT = 8,\n\t\t\tSubgroupElect = 9,\n\t\t\tSubgroupBarrier = 10,\n\t\t\tSubgroupMemBarrier = 11,\n\t\t\tSubgroupBallot = 12,\n\t\t\tSubgroupInverseBallot_InclBitCount_ExclBitCout = 13,\n\t\t\tSubgroupBallotBitExtract = 14,\n\t\t\tSubgroupBallotBitCount = 15,\n\t\t\tSubgroupArithmeticIAddReduce = 16,\n\t\t\tSubgroupArithmeticIAddExclusiveScan = 17,\n\t\t\tSubgroupArithmeticIAddInclusiveScan = 18,\n\t\t\tSubgroupArithmeticFAddReduce = 19,\n\t\t\tSubgroupArithmeticFAddExclusiveScan = 20,\n\t\t\tSubgroupArithmeticFAddInclusiveScan = 21,\n\t\t\tSubgroupArithmeticIMulReduce = 22,\n\t\t\tSubgroupArithmeticIMulExclusiveScan = 23,\n\t\t\tSubgroupArithmeticIMulInclusiveScan = 24,\n\t\t\tSubgroupArithmeticFMulReduce = 25,\n\t\t\tSubgroupArithmeticFMulExclusiveScan = 26,\n\t\t\tSubgroupArithmeticFMulInclusiveScan = 27,\n\t\t\tFeatureCount\n\t\t};\n\n\t\tusing FeatureMask = uint32_t;\n\t\tstatic_assert(sizeof(FeatureMask) * 8u >= FeatureCount, \"Mask type needs more bits.\");\n\n\t\tusing CandidateVector = SmallVector<Candidate, CandidateCount>;\n\t\tusing FeatureVector = SmallVector<Feature>;\n\n\t\tstatic FeatureVector get_feature_dependencies(Feature feature);\n\t\tstatic FeatureMask get_feature_dependency_mask(Feature feature);\n\t\tstatic bool can_feature_be_implemented_without_extensions(Feature feature);\n\t\tstatic Candidate get_KHR_extension_for_feature(Feature feature);\n\n\t\tstruct Result\n\t\t{\n\t\t\tResult();\n\t\t\tuint32_t weights[CandidateCount];\n\t\t};\n\n\t\tvoid request_feature(Feature feature);\n\t\tbool is_feature_requested(Feature feature) const;\n\t\tResult resolve() const;\n\n\t\tstatic CandidateVector get_candidates_for_feature(Feature ft, const Result &r);\n\n\tprivate:\n\t\tstatic CandidateVector get_candidates_for_feature(Feature ft);\n\t\tstatic FeatureMask build_mask(const SmallVector<Feature> &features);\n\t\tFeatureMask feature_mask = 0;\n\t};\n\n\t// TODO remove this function when all subgroup ops are supported (or make it always return true)\n\tstatic bool is_supported_subgroup_op_in_opengl(spv::Op op, const uint32_t *ops);\n\n\tvoid reset(uint32_t iteration_count);\n\tvoid emit_function(SPIRFunction &func, const Bitset &return_flags);\n\n\tbool has_extension(const std::string &ext) const;\n\tvoid require_extension_internal(const std::string &ext);\n\n\t// Virtualize methods which need to be overridden by subclass targets like C++ and such.\n\tvirtual void emit_function_prototype(SPIRFunction &func, const Bitset &return_flags);\n\n\tSPIRBlock *current_emitting_block = nullptr;\n\tSmallVector<SPIRBlock *> current_emitting_switch_stack;\n\tbool current_emitting_switch_fallthrough = false;\n\n\tvirtual void emit_instruction(const Instruction &instr);\n\tstruct TemporaryCopy\n\t{\n\t\tuint32_t dst_id;\n\t\tuint32_t src_id;\n\t};\n\tTemporaryCopy handle_instruction_precision(const Instruction &instr);\n\tvoid emit_block_instructions(SPIRBlock &block);\n\tvoid emit_block_instructions_with_masked_debug(SPIRBlock &block);\n\n\t// For relax_nan_checks.\n\tGLSLstd450 get_remapped_glsl_op(GLSLstd450 std450_op) const;\n\tspv::Op get_remapped_spirv_op(spv::Op op) const;\n\n\tvirtual void emit_glsl_op(uint32_t result_type, uint32_t result_id, uint32_t op, const uint32_t *args,\n\t                          uint32_t count);\n\tvirtual void emit_spv_amd_shader_ballot_op(uint32_t result_type, uint32_t result_id, uint32_t op,\n\t                                           const uint32_t *args, uint32_t count);\n\tvirtual void emit_spv_amd_shader_explicit_vertex_parameter_op(uint32_t result_type, uint32_t result_id, uint32_t op,\n\t                                                              const uint32_t *args, uint32_t count);\n\tvirtual void emit_spv_amd_shader_trinary_minmax_op(uint32_t result_type, uint32_t result_id, uint32_t op,\n\t                                                   const uint32_t *args, uint32_t count);\n\tvirtual void emit_spv_amd_gcn_shader_op(uint32_t result_type, uint32_t result_id, uint32_t op, const uint32_t *args,\n\t                                        uint32_t count);\n\tvirtual void emit_header();\n\tvoid emit_line_directive(uint32_t file_id, uint32_t line_literal);\n\tvoid build_workgroup_size(SmallVector<std::string> &arguments, const SpecializationConstant &x,\n\t                          const SpecializationConstant &y, const SpecializationConstant &z);\n\n\tvoid request_subgroup_feature(ShaderSubgroupSupportHelper::Feature feature);\n\n\tvirtual void emit_sampled_image_op(uint32_t result_type, uint32_t result_id, uint32_t image_id, uint32_t samp_id);\n\tvirtual void emit_texture_op(const Instruction &i, bool sparse);\n\tvirtual std::string to_texture_op(const Instruction &i, bool sparse, bool *forward,\n\t                                  SmallVector<uint32_t> &inherited_expressions);\n\tvirtual void emit_subgroup_op(const Instruction &i);\n\tvirtual std::string type_to_glsl(const SPIRType &type, uint32_t id = 0);\n\tvirtual std::string builtin_to_glsl(spv::BuiltIn builtin, spv::StorageClass storage);\n\tvirtual void emit_struct_member(const SPIRType &type, uint32_t member_type_id, uint32_t index,\n\t                                const std::string &qualifier = \"\", uint32_t base_offset = 0);\n\tvirtual void emit_struct_padding_target(const SPIRType &type);\n\tvirtual std::string image_type_glsl(const SPIRType &type, uint32_t id = 0);\n\tstd::string constant_expression(const SPIRConstant &c,\n\t                                bool inside_block_like_struct_scope = false,\n\t                                bool inside_struct_scope = false);\n\tvirtual std::string constant_op_expression(const SPIRConstantOp &cop);\n\tvirtual std::string constant_expression_vector(const SPIRConstant &c, uint32_t vector);\n\tvirtual void emit_fixup();\n\tvirtual std::string variable_decl(const SPIRType &type, const std::string &name, uint32_t id = 0);\n\tvirtual bool variable_decl_is_remapped_storage(const SPIRVariable &var, spv::StorageClass storage) const;\n\tvirtual std::string to_func_call_arg(const SPIRFunction::Parameter &arg, uint32_t id);\n\n\tstruct TextureFunctionBaseArguments\n\t{\n\t\t// GCC 4.8 workarounds, it doesn't understand '{}' constructor here, use explicit default constructor.\n\t\tTextureFunctionBaseArguments() = default;\n\t\tVariableID img = 0;\n\t\tconst SPIRType *imgtype = nullptr;\n\t\tbool is_fetch = false, is_gather = false, is_proj = false;\n\t};\n\n\tstruct TextureFunctionNameArguments\n\t{\n\t\t// GCC 4.8 workarounds, it doesn't understand '{}' constructor here, use explicit default constructor.\n\t\tTextureFunctionNameArguments() = default;\n\t\tTextureFunctionBaseArguments base;\n\t\tbool has_array_offsets = false, has_offset = false, has_grad = false;\n\t\tbool has_dref = false, is_sparse_feedback = false, has_min_lod = false;\n\t\tuint32_t lod = 0;\n\t};\n\tvirtual std::string to_function_name(const TextureFunctionNameArguments &args);\n\n\tstruct TextureFunctionArguments\n\t{\n\t\t// GCC 4.8 workarounds, it doesn't understand '{}' constructor here, use explicit default constructor.\n\t\tTextureFunctionArguments() = default;\n\t\tTextureFunctionBaseArguments base;\n\t\tuint32_t coord = 0, coord_components = 0, dref = 0;\n\t\tuint32_t grad_x = 0, grad_y = 0, lod = 0, offset = 0;\n\t\tuint32_t bias = 0, component = 0, sample = 0, sparse_texel = 0, min_lod = 0;\n\t\tbool nonuniform_expression = false;\n\t};\n\tvirtual std::string to_function_args(const TextureFunctionArguments &args, bool *p_forward);\n\n\tvoid emit_sparse_feedback_temporaries(uint32_t result_type_id, uint32_t id, uint32_t &feedback_id,\n\t                                      uint32_t &texel_id);\n\tuint32_t get_sparse_feedback_texel_id(uint32_t id) const;\n\tvirtual void emit_buffer_block(const SPIRVariable &type);\n\tvirtual void emit_push_constant_block(const SPIRVariable &var);\n\tvirtual void emit_uniform(const SPIRVariable &var);\n\tvirtual std::string unpack_expression_type(std::string expr_str, const SPIRType &type, uint32_t physical_type_id,\n\t                                           bool packed_type, bool row_major);\n\n\tvirtual bool builtin_translates_to_nonarray(spv::BuiltIn builtin) const;\n\n\tvirtual bool is_user_type_structured(uint32_t id) const;\n\n\tvoid emit_copy_logical_type(uint32_t lhs_id, uint32_t lhs_type_id, uint32_t rhs_id, uint32_t rhs_type_id,\n\t                            SmallVector<uint32_t> chain);\n\n\tStringStream<> buffer;\n\n\ttemplate <typename T>\n\tinline void statement_inner(T &&t)\n\t{\n\t\tbuffer << std::forward<T>(t);\n\t\tstatement_count++;\n\t}\n\n\ttemplate <typename T, typename... Ts>\n\tinline void statement_inner(T &&t, Ts &&... ts)\n\t{\n\t\tbuffer << std::forward<T>(t);\n\t\tstatement_count++;\n\t\tstatement_inner(std::forward<Ts>(ts)...);\n\t}\n\n\ttemplate <typename... Ts>\n\tinline void statement(Ts &&... ts)\n\t{\n\t\tif (is_forcing_recompilation())\n\t\t{\n\t\t\t// Do not bother emitting code while force_recompile is active.\n\t\t\t// We will compile again.\n\t\t\tstatement_count++;\n\t\t\treturn;\n\t\t}\n\n\t\tif (redirect_statement)\n\t\t{\n\t\t\tredirect_statement->push_back(join(std::forward<Ts>(ts)...));\n\t\t\tstatement_count++;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (uint32_t i = 0; i < indent; i++)\n\t\t\t\tbuffer << \"    \";\n\t\t\tstatement_inner(std::forward<Ts>(ts)...);\n\t\t\tbuffer << '\\n';\n\t\t}\n\t}\n\n\ttemplate <typename... Ts>\n\tinline void statement_no_indent(Ts &&... ts)\n\t{\n\t\tauto old_indent = indent;\n\t\tindent = 0;\n\t\tstatement(std::forward<Ts>(ts)...);\n\t\tindent = old_indent;\n\t}\n\n\t// Used for implementing continue blocks where\n\t// we want to obtain a list of statements we can merge\n\t// on a single line separated by comma.\n\tSmallVector<std::string> *redirect_statement = nullptr;\n\tconst SPIRBlock *current_continue_block = nullptr;\n\tbool block_temporary_hoisting = false;\n\tbool block_debug_directives = false;\n\n\tvoid begin_scope();\n\tvoid end_scope();\n\tvoid end_scope(const std::string &trailer);\n\tvoid end_scope_decl();\n\tvoid end_scope_decl(const std::string &decl);\n\n\tOptions options;\n\n\tvirtual std::string type_to_array_glsl(\n\t    const SPIRType &type); // Allow Metal to use the array<T> template to make arrays a value type\n\tstd::string to_array_size(const SPIRType &type, uint32_t index);\n\tuint32_t to_array_size_literal(const SPIRType &type, uint32_t index) const;\n\tuint32_t to_array_size_literal(const SPIRType &type) const;\n\tvirtual std::string variable_decl(const SPIRVariable &variable); // Threadgroup arrays can't have a wrapper type\n\tstd::string variable_decl_function_local(SPIRVariable &variable);\n\n\tvoid add_local_variable_name(uint32_t id);\n\tvoid add_resource_name(uint32_t id);\n\tvoid add_member_name(SPIRType &type, uint32_t name);\n\tvoid add_function_overload(const SPIRFunction &func);\n\n\tvirtual bool is_non_native_row_major_matrix(uint32_t id);\n\tvirtual bool member_is_non_native_row_major_matrix(const SPIRType &type, uint32_t index);\n\tbool member_is_remapped_physical_type(const SPIRType &type, uint32_t index) const;\n\tbool member_is_packed_physical_type(const SPIRType &type, uint32_t index) const;\n\tvirtual std::string convert_row_major_matrix(std::string exp_str, const SPIRType &exp_type,\n\t                                             uint32_t physical_type_id, bool is_packed,\n\t                                             bool relaxed = false);\n\n\tstd::unordered_set<std::string> local_variable_names;\n\tstd::unordered_set<std::string> resource_names;\n\tstd::unordered_set<std::string> block_input_names;\n\tstd::unordered_set<std::string> block_output_names;\n\tstd::unordered_set<std::string> block_ubo_names;\n\tstd::unordered_set<std::string> block_ssbo_names;\n\tstd::unordered_set<std::string> block_names; // A union of all block_*_names.\n\tstd::unordered_map<std::string, std::unordered_set<uint64_t>> function_overloads;\n\tstd::unordered_map<uint32_t, std::string> preserved_aliases;\n\tvoid preserve_alias_on_reset(uint32_t id);\n\tvoid reset_name_caches();\n\n\tbool processing_entry_point = false;\n\n\t// Can be overriden by subclass backends for trivial things which\n\t// shouldn't need polymorphism.\n\tstruct BackendVariations\n\t{\n\t\tstd::string discard_literal = \"discard\";\n\t\tstd::string demote_literal = \"demote\";\n\t\tstd::string null_pointer_literal = \"\";\n\t\tbool float_literal_suffix = false;\n\t\tbool double_literal_suffix = true;\n\t\tbool uint32_t_literal_suffix = true;\n\t\tbool long_long_literal_suffix = false;\n\t\tconst char *basic_int_type = \"int\";\n\t\tconst char *basic_uint_type = \"uint\";\n\t\tconst char *basic_int8_type = \"int8_t\";\n\t\tconst char *basic_uint8_type = \"uint8_t\";\n\t\tconst char *basic_int16_type = \"int16_t\";\n\t\tconst char *basic_uint16_type = \"uint16_t\";\n\t\tconst char *int16_t_literal_suffix = \"s\";\n\t\tconst char *uint16_t_literal_suffix = \"us\";\n\t\tconst char *nonuniform_qualifier = \"nonuniformEXT\";\n\t\tconst char *boolean_mix_function = \"mix\";\n\t\tSPIRType::BaseType boolean_in_struct_remapped_type = SPIRType::Boolean;\n\t\tbool swizzle_is_function = false;\n\t\tbool shared_is_implied = false;\n\t\tbool unsized_array_supported = true;\n\t\tbool explicit_struct_type = false;\n\t\tbool use_initializer_list = false;\n\t\tbool use_typed_initializer_list = false;\n\t\tbool can_declare_struct_inline = true;\n\t\tbool can_declare_arrays_inline = true;\n\t\tbool native_row_major_matrix = true;\n\t\tbool use_constructor_splatting = true;\n\t\tbool allow_precision_qualifiers = false;\n\t\tbool can_swizzle_scalar = false;\n\t\tbool force_gl_in_out_block = false;\n\t\tbool force_merged_mesh_block = false;\n\t\tbool can_return_array = true;\n\t\tbool allow_truncated_access_chain = false;\n\t\tbool supports_extensions = false;\n\t\tbool supports_empty_struct = false;\n\t\tbool array_is_value_type = true;\n\t\tbool array_is_value_type_in_buffer_blocks = true;\n\t\tbool comparison_image_samples_scalar = false;\n\t\tbool native_pointers = false;\n\t\tbool support_small_type_sampling_result = false;\n\t\tbool support_case_fallthrough = true;\n\t\tbool use_array_constructor = false;\n\t\tbool needs_row_major_load_workaround = false;\n\t\tbool support_pointer_to_pointer = false;\n\t\tbool support_precise_qualifier = false;\n\t\tbool support_64bit_switch = false;\n\t\tbool workgroup_size_is_hidden = false;\n\t\tbool requires_relaxed_precision_analysis = false;\n\t\tbool implicit_c_integer_promotion_rules = false;\n\t} backend;\n\n\tvoid emit_struct(SPIRType &type);\n\tvoid emit_resources();\n\tvoid emit_extension_workarounds(spv::ExecutionModel model);\n\tvoid emit_subgroup_arithmetic_workaround(const std::string &func, spv::Op op, spv::GroupOperation group_op);\n\tvoid emit_polyfills(uint32_t polyfills, bool relaxed);\n\tvoid emit_buffer_block_native(const SPIRVariable &var);\n\tvoid emit_buffer_reference_block(uint32_t type_id, bool forward_declaration);\n\tvoid emit_buffer_block_legacy(const SPIRVariable &var);\n\tvoid emit_buffer_block_flattened(const SPIRVariable &type);\n\tvoid fixup_implicit_builtin_block_names(spv::ExecutionModel model);\n\tvoid emit_declared_builtin_block(spv::StorageClass storage, spv::ExecutionModel model);\n\tbool should_force_emit_builtin_block(spv::StorageClass storage);\n\tvoid emit_push_constant_block_vulkan(const SPIRVariable &var);\n\tvoid emit_push_constant_block_glsl(const SPIRVariable &var);\n\tvoid emit_interface_block(const SPIRVariable &type);\n\tvoid emit_flattened_io_block(const SPIRVariable &var, const char *qual);\n\tvoid emit_flattened_io_block_struct(const std::string &basename, const SPIRType &type, const char *qual,\n\t                                    const SmallVector<uint32_t> &indices);\n\tvoid emit_flattened_io_block_member(const std::string &basename, const SPIRType &type, const char *qual,\n\t                                    const SmallVector<uint32_t> &indices);\n\tvoid emit_block_chain(SPIRBlock &block);\n\tvoid emit_hoisted_temporaries(SmallVector<std::pair<TypeID, ID>> &temporaries);\n\tstd::string constant_value_macro_name(uint32_t id);\n\tint get_constant_mapping_to_workgroup_component(const SPIRConstant &constant) const;\n\tvoid emit_constant(const SPIRConstant &constant);\n\tvoid emit_specialization_constant_op(const SPIRConstantOp &constant);\n\tstd::string emit_continue_block(uint32_t continue_block, bool follow_true_block, bool follow_false_block);\n\tbool attempt_emit_loop_header(SPIRBlock &block, SPIRBlock::Method method);\n\n\tvoid branch(BlockID from, BlockID to);\n\tvoid branch_to_continue(BlockID from, BlockID to);\n\tvoid branch(BlockID from, uint32_t cond, BlockID true_block, BlockID false_block);\n\tvoid flush_phi(BlockID from, BlockID to);\n\tvoid flush_variable_declaration(uint32_t id);\n\tvoid flush_undeclared_variables(SPIRBlock &block);\n\tvoid emit_variable_temporary_copies(const SPIRVariable &var);\n\n\tbool should_dereference(uint32_t id);\n\tbool should_forward(uint32_t id) const;\n\tbool should_suppress_usage_tracking(uint32_t id) const;\n\tvoid emit_mix_op(uint32_t result_type, uint32_t id, uint32_t left, uint32_t right, uint32_t lerp);\n\tvoid emit_nminmax_op(uint32_t result_type, uint32_t id, uint32_t op0, uint32_t op1, GLSLstd450 op);\n\tvoid emit_emulated_ahyper_op(uint32_t result_type, uint32_t result_id, uint32_t op0, GLSLstd450 op);\n\tbool to_trivial_mix_op(const SPIRType &type, std::string &op, uint32_t left, uint32_t right, uint32_t lerp);\n\tvoid emit_quaternary_func_op(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1, uint32_t op2,\n\t                             uint32_t op3, const char *op);\n\tvoid emit_trinary_func_op(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1, uint32_t op2,\n\t                          const char *op);\n\tvoid emit_binary_func_op(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1, const char *op);\n\tvoid emit_atomic_func_op(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1, const char *op);\n\tvoid emit_atomic_func_op(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1, uint32_t op2, const char *op);\n\n\tvoid emit_unary_func_op_cast(uint32_t result_type, uint32_t result_id, uint32_t op0, const char *op,\n\t                             SPIRType::BaseType input_type, SPIRType::BaseType expected_result_type);\n\tvoid emit_binary_func_op_cast(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1, const char *op,\n\t                              SPIRType::BaseType input_type, bool skip_cast_if_equal_type);\n\tvoid emit_binary_func_op_cast_clustered(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1,\n\t                                        const char *op, SPIRType::BaseType input_type);\n\tvoid emit_trinary_func_op_cast(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1, uint32_t op2,\n\t                               const char *op, SPIRType::BaseType input_type);\n\tvoid emit_trinary_func_op_bitextract(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1,\n\t                                     uint32_t op2, const char *op, SPIRType::BaseType expected_result_type,\n\t                                     SPIRType::BaseType input_type0, SPIRType::BaseType input_type1,\n\t                                     SPIRType::BaseType input_type2);\n\tvoid emit_bitfield_insert_op(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1, uint32_t op2,\n\t                             uint32_t op3, const char *op, SPIRType::BaseType offset_count_type);\n\n\tvoid emit_unary_func_op(uint32_t result_type, uint32_t result_id, uint32_t op0, const char *op);\n\tvoid emit_unrolled_unary_op(uint32_t result_type, uint32_t result_id, uint32_t operand, const char *op);\n\tvoid emit_binary_op(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1, const char *op);\n\tvoid emit_unrolled_binary_op(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1, const char *op,\n\t                             bool negate, SPIRType::BaseType expected_type);\n\tvoid emit_binary_op_cast(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1, const char *op,\n\t                         SPIRType::BaseType input_type, bool skip_cast_if_equal_type, bool implicit_integer_promotion);\n\n\tSPIRType binary_op_bitcast_helper(std::string &cast_op0, std::string &cast_op1, SPIRType::BaseType &input_type,\n\t                                  uint32_t op0, uint32_t op1, bool skip_cast_if_equal_type);\n\n\tvirtual bool emit_complex_bitcast(uint32_t result_type, uint32_t id, uint32_t op0);\n\n\tstd::string to_ternary_expression(const SPIRType &result_type, uint32_t select, uint32_t true_value,\n\t                                  uint32_t false_value);\n\n\tvoid emit_unary_op(uint32_t result_type, uint32_t result_id, uint32_t op0, const char *op);\n\tvoid emit_unary_op_cast(uint32_t result_type, uint32_t result_id, uint32_t op0, const char *op);\n\tvirtual void emit_mesh_tasks(SPIRBlock &block);\n\tbool expression_is_forwarded(uint32_t id) const;\n\tbool expression_suppresses_usage_tracking(uint32_t id) const;\n\tbool expression_read_implies_multiple_reads(uint32_t id) const;\n\tSPIRExpression &emit_op(uint32_t result_type, uint32_t result_id, const std::string &rhs, bool forward_rhs,\n\t                        bool suppress_usage_tracking = false);\n\n\tvoid access_chain_internal_append_index(std::string &expr, uint32_t base, const SPIRType *type,\n\t                                        AccessChainFlags flags, bool &access_chain_is_arrayed, uint32_t index);\n\n\tstd::string access_chain_internal(uint32_t base, const uint32_t *indices, uint32_t count, AccessChainFlags flags,\n\t                                  AccessChainMeta *meta);\n\n\tspv::StorageClass get_expression_effective_storage_class(uint32_t ptr);\n\tvirtual bool access_chain_needs_stage_io_builtin_translation(uint32_t base);\n\n\tvirtual void check_physical_type_cast(std::string &expr, const SPIRType *type, uint32_t physical_type);\n\tvirtual bool prepare_access_chain_for_scalar_access(std::string &expr, const SPIRType &type,\n\t                                                    spv::StorageClass storage, bool &is_packed);\n\n\tstd::string access_chain(uint32_t base, const uint32_t *indices, uint32_t count, const SPIRType &target_type,\n\t                         AccessChainMeta *meta = nullptr, bool ptr_chain = false);\n\n\tstd::string flattened_access_chain(uint32_t base, const uint32_t *indices, uint32_t count,\n\t                                   const SPIRType &target_type, uint32_t offset, uint32_t matrix_stride,\n\t                                   uint32_t array_stride, bool need_transpose);\n\tstd::string flattened_access_chain_struct(uint32_t base, const uint32_t *indices, uint32_t count,\n\t                                          const SPIRType &target_type, uint32_t offset);\n\tstd::string flattened_access_chain_matrix(uint32_t base, const uint32_t *indices, uint32_t count,\n\t                                          const SPIRType &target_type, uint32_t offset, uint32_t matrix_stride,\n\t                                          bool need_transpose);\n\tstd::string flattened_access_chain_vector(uint32_t base, const uint32_t *indices, uint32_t count,\n\t                                          const SPIRType &target_type, uint32_t offset, uint32_t matrix_stride,\n\t                                          bool need_transpose);\n\tstd::pair<std::string, uint32_t> flattened_access_chain_offset(const SPIRType &basetype, const uint32_t *indices,\n\t                                                               uint32_t count, uint32_t offset,\n\t                                                               uint32_t word_stride, bool *need_transpose = nullptr,\n\t                                                               uint32_t *matrix_stride = nullptr,\n\t                                                               uint32_t *array_stride = nullptr,\n\t                                                               bool ptr_chain = false);\n\n\tconst char *index_to_swizzle(uint32_t index);\n\tstd::string remap_swizzle(const SPIRType &result_type, uint32_t input_components, const std::string &expr);\n\tstd::string declare_temporary(uint32_t type, uint32_t id);\n\tvoid emit_uninitialized_temporary(uint32_t type, uint32_t id);\n\tSPIRExpression &emit_uninitialized_temporary_expression(uint32_t type, uint32_t id);\n\tvoid append_global_func_args(const SPIRFunction &func, uint32_t index, SmallVector<std::string> &arglist);\n\tstd::string to_non_uniform_aware_expression(uint32_t id);\n\tstd::string to_expression(uint32_t id, bool register_expression_read = true);\n\tstd::string to_composite_constructor_expression(const SPIRType &parent_type, uint32_t id, bool block_like_type);\n\tstd::string to_rerolled_array_expression(const SPIRType &parent_type, const std::string &expr, const SPIRType &type);\n\tstd::string to_enclosed_expression(uint32_t id, bool register_expression_read = true);\n\tstd::string to_unpacked_expression(uint32_t id, bool register_expression_read = true);\n\tstd::string to_unpacked_row_major_matrix_expression(uint32_t id);\n\tstd::string to_enclosed_unpacked_expression(uint32_t id, bool register_expression_read = true);\n\tstd::string to_dereferenced_expression(uint32_t id, bool register_expression_read = true);\n\tstd::string to_pointer_expression(uint32_t id, bool register_expression_read = true);\n\tstd::string to_enclosed_pointer_expression(uint32_t id, bool register_expression_read = true);\n\tstd::string to_extract_component_expression(uint32_t id, uint32_t index);\n\tstd::string to_extract_constant_composite_expression(uint32_t result_type, const SPIRConstant &c,\n\t                                                     const uint32_t *chain, uint32_t length);\n\tstatic bool needs_enclose_expression(const std::string &expr);\n\tstd::string enclose_expression(const std::string &expr);\n\tstd::string dereference_expression(const SPIRType &expression_type, const std::string &expr);\n\tstd::string address_of_expression(const std::string &expr);\n\tvoid strip_enclosed_expression(std::string &expr);\n\tstd::string to_member_name(const SPIRType &type, uint32_t index);\n\tvirtual std::string to_member_reference(uint32_t base, const SPIRType &type, uint32_t index, bool ptr_chain_is_resolved);\n\tstd::string to_multi_member_reference(const SPIRType &type, const SmallVector<uint32_t> &indices);\n\tstd::string type_to_glsl_constructor(const SPIRType &type);\n\tstd::string argument_decl(const SPIRFunction::Parameter &arg);\n\tvirtual std::string to_qualifiers_glsl(uint32_t id);\n\tvoid fixup_io_block_patch_primitive_qualifiers(const SPIRVariable &var);\n\tvoid emit_output_variable_initializer(const SPIRVariable &var);\n\tstd::string to_precision_qualifiers_glsl(uint32_t id);\n\tvirtual const char *to_storage_qualifiers_glsl(const SPIRVariable &var);\n\tstd::string flags_to_qualifiers_glsl(const SPIRType &type, const Bitset &flags);\n\tconst char *format_to_glsl(spv::ImageFormat format);\n\tvirtual std::string layout_for_member(const SPIRType &type, uint32_t index);\n\tvirtual std::string to_interpolation_qualifiers(const Bitset &flags);\n\tstd::string layout_for_variable(const SPIRVariable &variable);\n\tstd::string to_combined_image_sampler(VariableID image_id, VariableID samp_id);\n\tvirtual bool skip_argument(uint32_t id) const;\n\tvirtual bool emit_array_copy(const char *expr, uint32_t lhs_id, uint32_t rhs_id,\n\t                             spv::StorageClass lhs_storage, spv::StorageClass rhs_storage);\n\tvirtual void emit_block_hints(const SPIRBlock &block);\n\tvirtual std::string to_initializer_expression(const SPIRVariable &var);\n\tvirtual std::string to_zero_initialized_expression(uint32_t type_id);\n\tbool type_can_zero_initialize(const SPIRType &type) const;\n\n\tbool buffer_is_packing_standard(const SPIRType &type, BufferPackingStandard packing,\n\t                                uint32_t *failed_index = nullptr, uint32_t start_offset = 0,\n\t                                uint32_t end_offset = ~(0u));\n\tstd::string buffer_to_packing_standard(const SPIRType &type, bool support_std430_without_scalar_layout);\n\n\tuint32_t type_to_packed_base_size(const SPIRType &type, BufferPackingStandard packing);\n\tuint32_t type_to_packed_alignment(const SPIRType &type, const Bitset &flags, BufferPackingStandard packing);\n\tuint32_t type_to_packed_array_stride(const SPIRType &type, const Bitset &flags, BufferPackingStandard packing);\n\tuint32_t type_to_packed_size(const SPIRType &type, const Bitset &flags, BufferPackingStandard packing);\n\tuint32_t type_to_location_count(const SPIRType &type) const;\n\n\tstd::string bitcast_glsl(const SPIRType &result_type, uint32_t arg);\n\tvirtual std::string bitcast_glsl_op(const SPIRType &result_type, const SPIRType &argument_type);\n\n\tstd::string bitcast_expression(SPIRType::BaseType target_type, uint32_t arg);\n\tstd::string bitcast_expression(const SPIRType &target_type, SPIRType::BaseType expr_type, const std::string &expr);\n\n\tstd::string build_composite_combiner(uint32_t result_type, const uint32_t *elems, uint32_t length);\n\tbool remove_duplicate_swizzle(std::string &op);\n\tbool remove_unity_swizzle(uint32_t base, std::string &op);\n\n\t// Can modify flags to remote readonly/writeonly if image type\n\t// and force recompile.\n\tbool check_atomic_image(uint32_t id);\n\n\tvirtual void replace_illegal_names();\n\tvoid replace_illegal_names(const std::unordered_set<std::string> &keywords);\n\tvirtual void emit_entry_point_declarations();\n\n\tvoid replace_fragment_output(SPIRVariable &var);\n\tvoid replace_fragment_outputs();\n\tstd::string legacy_tex_op(const std::string &op, const SPIRType &imgtype, uint32_t id);\n\n\tvoid forward_relaxed_precision(uint32_t dst_id, const uint32_t *args, uint32_t length);\n\tvoid analyze_precision_requirements(uint32_t type_id, uint32_t dst_id, uint32_t *args, uint32_t length);\n\tOptions::Precision analyze_expression_precision(const uint32_t *args, uint32_t length) const;\n\n\tuint32_t indent = 0;\n\n\tstd::unordered_set<uint32_t> emitted_functions;\n\n\t// Ensure that we declare phi-variable copies even if the original declaration isn't deferred\n\tstd::unordered_set<uint32_t> flushed_phi_variables;\n\n\tstd::unordered_set<uint32_t> flattened_buffer_blocks;\n\tstd::unordered_map<uint32_t, bool> flattened_structs;\n\n\tShaderSubgroupSupportHelper shader_subgroup_supporter;\n\n\tstd::string load_flattened_struct(const std::string &basename, const SPIRType &type);\n\tstd::string to_flattened_struct_member(const std::string &basename, const SPIRType &type, uint32_t index);\n\tvoid store_flattened_struct(uint32_t lhs_id, uint32_t value);\n\tvoid store_flattened_struct(const std::string &basename, uint32_t rhs, const SPIRType &type,\n\t                            const SmallVector<uint32_t> &indices);\n\tstd::string to_flattened_access_chain_expression(uint32_t id);\n\n\t// Usage tracking. If a temporary is used more than once, use the temporary instead to\n\t// avoid AST explosion when SPIRV is generated with pure SSA and doesn't write stuff to variables.\n\tstd::unordered_map<uint32_t, uint32_t> expression_usage_counts;\n\tvoid track_expression_read(uint32_t id);\n\n\tSmallVector<std::string> forced_extensions;\n\tSmallVector<std::string> header_lines;\n\n\t// Used when expressions emit extra opcodes with their own unique IDs,\n\t// and we need to reuse the IDs across recompilation loops.\n\t// Currently used by NMin/Max/Clamp implementations.\n\tstd::unordered_map<uint32_t, uint32_t> extra_sub_expressions;\n\n\tSmallVector<TypeID> workaround_ubo_load_overload_types;\n\tvoid request_workaround_wrapper_overload(TypeID id);\n\tvoid rewrite_load_for_wrapped_row_major(std::string &expr, TypeID loaded_type, ID ptr);\n\n\tuint32_t statement_count = 0;\n\n\tinline bool is_legacy() const\n\t{\n\t\treturn (options.es && options.version < 300) || (!options.es && options.version < 130);\n\t}\n\n\tinline bool is_legacy_es() const\n\t{\n\t\treturn options.es && options.version < 300;\n\t}\n\n\tinline bool is_legacy_desktop() const\n\t{\n\t\treturn !options.es && options.version < 130;\n\t}\n\n\tenum Polyfill : uint32_t\n\t{\n\t\tPolyfillTranspose2x2 = 1 << 0,\n\t\tPolyfillTranspose3x3 = 1 << 1,\n\t\tPolyfillTranspose4x4 = 1 << 2,\n\t\tPolyfillDeterminant2x2 = 1 << 3,\n\t\tPolyfillDeterminant3x3 = 1 << 4,\n\t\tPolyfillDeterminant4x4 = 1 << 5,\n\t\tPolyfillMatrixInverse2x2 = 1 << 6,\n\t\tPolyfillMatrixInverse3x3 = 1 << 7,\n\t\tPolyfillMatrixInverse4x4 = 1 << 8,\n\t};\n\n\tuint32_t required_polyfills = 0;\n\tuint32_t required_polyfills_relaxed = 0;\n\tvoid require_polyfill(Polyfill polyfill, bool relaxed);\n\n\tbool ray_tracing_is_khr = false;\n\tbool barycentric_is_nv = false;\n\tvoid ray_tracing_khr_fixup_locations();\n\n\tbool args_will_forward(uint32_t id, const uint32_t *args, uint32_t num_args, bool pure);\n\tvoid register_call_out_argument(uint32_t id);\n\tvoid register_impure_function_call();\n\tvoid register_control_dependent_expression(uint32_t expr);\n\n\t// GL_EXT_shader_pixel_local_storage support.\n\tstd::vector<PlsRemap> pls_inputs;\n\tstd::vector<PlsRemap> pls_outputs;\n\tstd::string pls_decl(const PlsRemap &variable);\n\tconst char *to_pls_qualifiers_glsl(const SPIRVariable &variable);\n\tvoid emit_pls();\n\tvoid remap_pls_variables();\n\n\t// GL_EXT_shader_framebuffer_fetch support.\n\tstd::vector<std::pair<uint32_t, uint32_t>> subpass_to_framebuffer_fetch_attachment;\n\tstd::vector<std::pair<uint32_t, bool>> inout_color_attachments;\n\tbool location_is_framebuffer_fetch(uint32_t location) const;\n\tbool location_is_non_coherent_framebuffer_fetch(uint32_t location) const;\n\tbool subpass_input_is_framebuffer_fetch(uint32_t id) const;\n\tvoid emit_inout_fragment_outputs_copy_to_subpass_inputs();\n\tconst SPIRVariable *find_subpass_input_by_attachment_index(uint32_t index) const;\n\tconst SPIRVariable *find_color_output_by_location(uint32_t location) const;\n\n\t// A variant which takes two sets of name. The secondary is only used to verify there are no collisions,\n\t// but the set is not updated when we have found a new name.\n\t// Used primarily when adding block interface names.\n\tvoid add_variable(std::unordered_set<std::string> &variables_primary,\n\t                  const std::unordered_set<std::string> &variables_secondary, std::string &name);\n\n\tvoid check_function_call_constraints(const uint32_t *args, uint32_t length);\n\tvoid handle_invalid_expression(uint32_t id);\n\tvoid force_temporary_and_recompile(uint32_t id);\n\tvoid find_static_extensions();\n\n\tuint32_t consume_temporary_in_precision_context(uint32_t type_id, uint32_t id, Options::Precision precision);\n\tstd::unordered_map<uint32_t, uint32_t> temporary_to_mirror_precision_alias;\n\tstd::unordered_set<uint32_t> composite_insert_overwritten;\n\tstd::unordered_set<uint32_t> block_composite_insert_overwrite;\n\n\tstd::string emit_for_loop_initializers(const SPIRBlock &block);\n\tvoid emit_while_loop_initializers(const SPIRBlock &block);\n\tbool for_loop_initializers_are_same_type(const SPIRBlock &block);\n\tbool optimize_read_modify_write(const SPIRType &type, const std::string &lhs, const std::string &rhs);\n\tvoid fixup_image_load_store_access();\n\n\tbool type_is_empty(const SPIRType &type);\n\n\tbool can_use_io_location(spv::StorageClass storage, bool block);\n\tconst Instruction *get_next_instruction_in_block(const Instruction &instr);\n\tstatic uint32_t mask_relevant_memory_semantics(uint32_t semantics);\n\n\tstd::string convert_half_to_string(const SPIRConstant &value, uint32_t col, uint32_t row);\n\tstd::string convert_float_to_string(const SPIRConstant &value, uint32_t col, uint32_t row);\n\tstd::string convert_double_to_string(const SPIRConstant &value, uint32_t col, uint32_t row);\n\n\tstd::string convert_separate_image_to_expression(uint32_t id);\n\n\t// Builtins in GLSL are always specific signedness, but the SPIR-V can declare them\n\t// as either unsigned or signed.\n\t// Sometimes we will need to automatically perform casts on load and store to make this work.\n\tvirtual SPIRType::BaseType get_builtin_basetype(spv::BuiltIn builtin, SPIRType::BaseType default_type);\n\tvirtual void cast_to_variable_store(uint32_t target_id, std::string &expr, const SPIRType &expr_type);\n\tvirtual void cast_from_variable_load(uint32_t source_id, std::string &expr, const SPIRType &expr_type);\n\tvoid unroll_array_from_complex_load(uint32_t target_id, uint32_t source_id, std::string &expr);\n\tbool unroll_array_to_complex_store(uint32_t target_id, uint32_t source_id);\n\tvoid convert_non_uniform_expression(std::string &expr, uint32_t ptr_id);\n\n\tvoid handle_store_to_invariant_variable(uint32_t store_id, uint32_t value_id);\n\tvoid disallow_forwarding_in_expression_chain(const SPIRExpression &expr);\n\n\tbool expression_is_constant_null(uint32_t id) const;\n\tbool expression_is_non_value_type_array(uint32_t ptr);\n\tvirtual void emit_store_statement(uint32_t lhs_expression, uint32_t rhs_expression);\n\n\tuint32_t get_integer_width_for_instruction(const Instruction &instr) const;\n\tuint32_t get_integer_width_for_glsl_instruction(GLSLstd450 op, const uint32_t *arguments, uint32_t length) const;\n\n\tbool variable_is_lut(const SPIRVariable &var) const;\n\n\tchar current_locale_radix_character = '.';\n\n\tvoid fixup_type_alias();\n\tvoid reorder_type_alias();\n\tvoid fixup_anonymous_struct_names();\n\tvoid fixup_anonymous_struct_names(std::unordered_set<uint32_t> &visited, const SPIRType &type);\n\n\tstatic const char *vector_swizzle(int vecsize, int index);\n\n\tbool is_stage_output_location_masked(uint32_t location, uint32_t component) const;\n\tbool is_stage_output_builtin_masked(spv::BuiltIn builtin) const;\n\tbool is_stage_output_variable_masked(const SPIRVariable &var) const;\n\tbool is_stage_output_block_member_masked(const SPIRVariable &var, uint32_t index, bool strip_array) const;\n\tbool is_per_primitive_variable(const SPIRVariable &var) const;\n\tuint32_t get_accumulated_member_location(const SPIRVariable &var, uint32_t mbr_idx, bool strip_array) const;\n\tuint32_t get_declared_member_location(const SPIRVariable &var, uint32_t mbr_idx, bool strip_array) const;\n\tstd::unordered_set<LocationComponentPair, InternalHasher> masked_output_locations;\n\tstd::unordered_set<uint32_t> masked_output_builtins;\n\n\tFloatFormatter *float_formatter = nullptr;\n\tstd::string format_float(float value) const;\n\tstd::string format_double(double value) const;\n\nprivate:\n\tvoid init();\n\n\tSmallVector<ConstantID> get_composite_constant_ids(ConstantID const_id);\n\tvoid fill_composite_constant(SPIRConstant &constant, TypeID type_id, const SmallVector<ConstantID> &initializers);\n\tvoid set_composite_constant(ConstantID const_id, TypeID type_id, const SmallVector<ConstantID> &initializers);\n\tTypeID get_composite_member_type(TypeID type_id, uint32_t member_idx);\n\tstd::unordered_map<uint32_t, SmallVector<ConstantID>> const_composite_insert_ids;\n};\n} // namespace SPIRV_CROSS_NAMESPACE\n\n#endif\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv_hlsl.cpp",
    "content": "/*\n * Copyright 2016-2021 Robert Konrad\n * SPDX-License-Identifier: Apache-2.0 OR MIT\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n/*\n * At your option, you may choose to accept this material under either:\n *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or\n *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.\n */\n\n#include \"spirv_hlsl.hpp\"\n#include \"GLSL.std.450.h\"\n#include <algorithm>\n#include <assert.h>\n\nusing namespace spv;\nusing namespace SPIRV_CROSS_NAMESPACE;\nusing namespace std;\n\nenum class ImageFormatNormalizedState\n{\n\tNone = 0,\n\tUnorm = 1,\n\tSnorm = 2\n};\n\nstatic ImageFormatNormalizedState image_format_to_normalized_state(ImageFormat fmt)\n{\n\tswitch (fmt)\n\t{\n\tcase ImageFormatR8:\n\tcase ImageFormatR16:\n\tcase ImageFormatRg8:\n\tcase ImageFormatRg16:\n\tcase ImageFormatRgba8:\n\tcase ImageFormatRgba16:\n\tcase ImageFormatRgb10A2:\n\t\treturn ImageFormatNormalizedState::Unorm;\n\n\tcase ImageFormatR8Snorm:\n\tcase ImageFormatR16Snorm:\n\tcase ImageFormatRg8Snorm:\n\tcase ImageFormatRg16Snorm:\n\tcase ImageFormatRgba8Snorm:\n\tcase ImageFormatRgba16Snorm:\n\t\treturn ImageFormatNormalizedState::Snorm;\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn ImageFormatNormalizedState::None;\n}\n\nstatic unsigned image_format_to_components(ImageFormat fmt)\n{\n\tswitch (fmt)\n\t{\n\tcase ImageFormatR8:\n\tcase ImageFormatR16:\n\tcase ImageFormatR8Snorm:\n\tcase ImageFormatR16Snorm:\n\tcase ImageFormatR16f:\n\tcase ImageFormatR32f:\n\tcase ImageFormatR8i:\n\tcase ImageFormatR16i:\n\tcase ImageFormatR32i:\n\tcase ImageFormatR8ui:\n\tcase ImageFormatR16ui:\n\tcase ImageFormatR32ui:\n\t\treturn 1;\n\n\tcase ImageFormatRg8:\n\tcase ImageFormatRg16:\n\tcase ImageFormatRg8Snorm:\n\tcase ImageFormatRg16Snorm:\n\tcase ImageFormatRg16f:\n\tcase ImageFormatRg32f:\n\tcase ImageFormatRg8i:\n\tcase ImageFormatRg16i:\n\tcase ImageFormatRg32i:\n\tcase ImageFormatRg8ui:\n\tcase ImageFormatRg16ui:\n\tcase ImageFormatRg32ui:\n\t\treturn 2;\n\n\tcase ImageFormatR11fG11fB10f:\n\t\treturn 3;\n\n\tcase ImageFormatRgba8:\n\tcase ImageFormatRgba16:\n\tcase ImageFormatRgb10A2:\n\tcase ImageFormatRgba8Snorm:\n\tcase ImageFormatRgba16Snorm:\n\tcase ImageFormatRgba16f:\n\tcase ImageFormatRgba32f:\n\tcase ImageFormatRgba8i:\n\tcase ImageFormatRgba16i:\n\tcase ImageFormatRgba32i:\n\tcase ImageFormatRgba8ui:\n\tcase ImageFormatRgba16ui:\n\tcase ImageFormatRgba32ui:\n\tcase ImageFormatRgb10a2ui:\n\t\treturn 4;\n\n\tcase ImageFormatUnknown:\n\t\treturn 4; // Assume 4.\n\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Unrecognized typed image format.\");\n\t}\n}\n\nstatic string image_format_to_type(ImageFormat fmt, SPIRType::BaseType basetype)\n{\n\tswitch (fmt)\n\t{\n\tcase ImageFormatR8:\n\tcase ImageFormatR16:\n\t\tif (basetype != SPIRType::Float)\n\t\t\tSPIRV_CROSS_THROW(\"Mismatch in image type and base type of image.\");\n\t\treturn \"unorm float\";\n\tcase ImageFormatRg8:\n\tcase ImageFormatRg16:\n\t\tif (basetype != SPIRType::Float)\n\t\t\tSPIRV_CROSS_THROW(\"Mismatch in image type and base type of image.\");\n\t\treturn \"unorm float2\";\n\tcase ImageFormatRgba8:\n\tcase ImageFormatRgba16:\n\t\tif (basetype != SPIRType::Float)\n\t\t\tSPIRV_CROSS_THROW(\"Mismatch in image type and base type of image.\");\n\t\treturn \"unorm float4\";\n\tcase ImageFormatRgb10A2:\n\t\tif (basetype != SPIRType::Float)\n\t\t\tSPIRV_CROSS_THROW(\"Mismatch in image type and base type of image.\");\n\t\treturn \"unorm float4\";\n\n\tcase ImageFormatR8Snorm:\n\tcase ImageFormatR16Snorm:\n\t\tif (basetype != SPIRType::Float)\n\t\t\tSPIRV_CROSS_THROW(\"Mismatch in image type and base type of image.\");\n\t\treturn \"snorm float\";\n\tcase ImageFormatRg8Snorm:\n\tcase ImageFormatRg16Snorm:\n\t\tif (basetype != SPIRType::Float)\n\t\t\tSPIRV_CROSS_THROW(\"Mismatch in image type and base type of image.\");\n\t\treturn \"snorm float2\";\n\tcase ImageFormatRgba8Snorm:\n\tcase ImageFormatRgba16Snorm:\n\t\tif (basetype != SPIRType::Float)\n\t\t\tSPIRV_CROSS_THROW(\"Mismatch in image type and base type of image.\");\n\t\treturn \"snorm float4\";\n\n\tcase ImageFormatR16f:\n\tcase ImageFormatR32f:\n\t\tif (basetype != SPIRType::Float)\n\t\t\tSPIRV_CROSS_THROW(\"Mismatch in image type and base type of image.\");\n\t\treturn \"float\";\n\tcase ImageFormatRg16f:\n\tcase ImageFormatRg32f:\n\t\tif (basetype != SPIRType::Float)\n\t\t\tSPIRV_CROSS_THROW(\"Mismatch in image type and base type of image.\");\n\t\treturn \"float2\";\n\tcase ImageFormatRgba16f:\n\tcase ImageFormatRgba32f:\n\t\tif (basetype != SPIRType::Float)\n\t\t\tSPIRV_CROSS_THROW(\"Mismatch in image type and base type of image.\");\n\t\treturn \"float4\";\n\n\tcase ImageFormatR11fG11fB10f:\n\t\tif (basetype != SPIRType::Float)\n\t\t\tSPIRV_CROSS_THROW(\"Mismatch in image type and base type of image.\");\n\t\treturn \"float3\";\n\n\tcase ImageFormatR8i:\n\tcase ImageFormatR16i:\n\tcase ImageFormatR32i:\n\t\tif (basetype != SPIRType::Int)\n\t\t\tSPIRV_CROSS_THROW(\"Mismatch in image type and base type of image.\");\n\t\treturn \"int\";\n\tcase ImageFormatRg8i:\n\tcase ImageFormatRg16i:\n\tcase ImageFormatRg32i:\n\t\tif (basetype != SPIRType::Int)\n\t\t\tSPIRV_CROSS_THROW(\"Mismatch in image type and base type of image.\");\n\t\treturn \"int2\";\n\tcase ImageFormatRgba8i:\n\tcase ImageFormatRgba16i:\n\tcase ImageFormatRgba32i:\n\t\tif (basetype != SPIRType::Int)\n\t\t\tSPIRV_CROSS_THROW(\"Mismatch in image type and base type of image.\");\n\t\treturn \"int4\";\n\n\tcase ImageFormatR8ui:\n\tcase ImageFormatR16ui:\n\tcase ImageFormatR32ui:\n\t\tif (basetype != SPIRType::UInt)\n\t\t\tSPIRV_CROSS_THROW(\"Mismatch in image type and base type of image.\");\n\t\treturn \"uint\";\n\tcase ImageFormatRg8ui:\n\tcase ImageFormatRg16ui:\n\tcase ImageFormatRg32ui:\n\t\tif (basetype != SPIRType::UInt)\n\t\t\tSPIRV_CROSS_THROW(\"Mismatch in image type and base type of image.\");\n\t\treturn \"uint2\";\n\tcase ImageFormatRgba8ui:\n\tcase ImageFormatRgba16ui:\n\tcase ImageFormatRgba32ui:\n\t\tif (basetype != SPIRType::UInt)\n\t\t\tSPIRV_CROSS_THROW(\"Mismatch in image type and base type of image.\");\n\t\treturn \"uint4\";\n\tcase ImageFormatRgb10a2ui:\n\t\tif (basetype != SPIRType::UInt)\n\t\t\tSPIRV_CROSS_THROW(\"Mismatch in image type and base type of image.\");\n\t\treturn \"uint4\";\n\n\tcase ImageFormatUnknown:\n\t\tswitch (basetype)\n\t\t{\n\t\tcase SPIRType::Float:\n\t\t\treturn \"float4\";\n\t\tcase SPIRType::Int:\n\t\t\treturn \"int4\";\n\t\tcase SPIRType::UInt:\n\t\t\treturn \"uint4\";\n\t\tdefault:\n\t\t\tSPIRV_CROSS_THROW(\"Unsupported base type for image.\");\n\t\t}\n\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Unrecognized typed image format.\");\n\t}\n}\n\nstring CompilerHLSL::image_type_hlsl_modern(const SPIRType &type, uint32_t id)\n{\n\tauto &imagetype = get<SPIRType>(type.image.type);\n\tconst char *dim = nullptr;\n\tbool typed_load = false;\n\tuint32_t components = 4;\n\n\tbool force_image_srv = hlsl_options.nonwritable_uav_texture_as_srv && has_decoration(id, DecorationNonWritable);\n\n\tswitch (type.image.dim)\n\t{\n\tcase Dim1D:\n\t\ttyped_load = type.image.sampled == 2;\n\t\tdim = \"1D\";\n\t\tbreak;\n\tcase Dim2D:\n\t\ttyped_load = type.image.sampled == 2;\n\t\tdim = \"2D\";\n\t\tbreak;\n\tcase Dim3D:\n\t\ttyped_load = type.image.sampled == 2;\n\t\tdim = \"3D\";\n\t\tbreak;\n\tcase DimCube:\n\t\tif (type.image.sampled == 2)\n\t\t\tSPIRV_CROSS_THROW(\"RWTextureCube does not exist in HLSL.\");\n\t\tdim = \"Cube\";\n\t\tbreak;\n\tcase DimRect:\n\t\tSPIRV_CROSS_THROW(\"Rectangle texture support is not yet implemented for HLSL.\"); // TODO\n\tcase DimBuffer:\n\t\tif (type.image.sampled == 1)\n\t\t\treturn join(\"Buffer<\", type_to_glsl(imagetype), components, \">\");\n\t\telse if (type.image.sampled == 2)\n\t\t{\n\t\t\tif (interlocked_resources.count(id))\n\t\t\t\treturn join(\"RasterizerOrderedBuffer<\", image_format_to_type(type.image.format, imagetype.basetype),\n\t\t\t\t            \">\");\n\n\t\t\ttyped_load = !force_image_srv && type.image.sampled == 2;\n\n\t\t\tconst char *rw = force_image_srv ? \"\" : \"RW\";\n\t\t\treturn join(rw, \"Buffer<\",\n\t\t\t            typed_load ? image_format_to_type(type.image.format, imagetype.basetype) :\n\t\t\t                         join(type_to_glsl(imagetype), components),\n\t\t\t            \">\");\n\t\t}\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"Sampler buffers must be either sampled or unsampled. Cannot deduce in runtime.\");\n\tcase DimSubpassData:\n\t\tdim = \"2D\";\n\t\ttyped_load = false;\n\t\tbreak;\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Invalid dimension.\");\n\t}\n\tconst char *arrayed = type.image.arrayed ? \"Array\" : \"\";\n\tconst char *ms = type.image.ms ? \"MS\" : \"\";\n\tconst char *rw = typed_load && !force_image_srv ? \"RW\" : \"\";\n\n\tif (force_image_srv)\n\t\ttyped_load = false;\n\n\tif (typed_load && interlocked_resources.count(id))\n\t\trw = \"RasterizerOrdered\";\n\n\treturn join(rw, \"Texture\", dim, ms, arrayed, \"<\",\n\t            typed_load ? image_format_to_type(type.image.format, imagetype.basetype) :\n\t                         join(type_to_glsl(imagetype), components),\n\t            \">\");\n}\n\nstring CompilerHLSL::image_type_hlsl_legacy(const SPIRType &type, uint32_t /*id*/)\n{\n\tauto &imagetype = get<SPIRType>(type.image.type);\n\tstring res;\n\n\tswitch (imagetype.basetype)\n\t{\n\tcase SPIRType::Int:\n\t\tres = \"i\";\n\t\tbreak;\n\tcase SPIRType::UInt:\n\t\tres = \"u\";\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\n\tif (type.basetype == SPIRType::Image && type.image.dim == DimSubpassData)\n\t\treturn res + \"subpassInput\" + (type.image.ms ? \"MS\" : \"\");\n\n\t// If we're emulating subpassInput with samplers, force sampler2D\n\t// so we don't have to specify format.\n\tif (type.basetype == SPIRType::Image && type.image.dim != DimSubpassData)\n\t{\n\t\t// Sampler buffers are always declared as samplerBuffer even though they might be separate images in the SPIR-V.\n\t\tif (type.image.dim == DimBuffer && type.image.sampled == 1)\n\t\t\tres += \"sampler\";\n\t\telse\n\t\t\tres += type.image.sampled == 2 ? \"image\" : \"texture\";\n\t}\n\telse\n\t\tres += \"sampler\";\n\n\tswitch (type.image.dim)\n\t{\n\tcase Dim1D:\n\t\tres += \"1D\";\n\t\tbreak;\n\tcase Dim2D:\n\t\tres += \"2D\";\n\t\tbreak;\n\tcase Dim3D:\n\t\tres += \"3D\";\n\t\tbreak;\n\tcase DimCube:\n\t\tres += \"CUBE\";\n\t\tbreak;\n\n\tcase DimBuffer:\n\t\tres += \"Buffer\";\n\t\tbreak;\n\n\tcase DimSubpassData:\n\t\tres += \"2D\";\n\t\tbreak;\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Only 1D, 2D, 3D, Buffer, InputTarget and Cube textures supported.\");\n\t}\n\n\tif (type.image.ms)\n\t\tres += \"MS\";\n\tif (type.image.arrayed)\n\t\tres += \"Array\";\n\n\treturn res;\n}\n\nstring CompilerHLSL::image_type_hlsl(const SPIRType &type, uint32_t id)\n{\n\tif (hlsl_options.shader_model <= 30)\n\t\treturn image_type_hlsl_legacy(type, id);\n\telse\n\t\treturn image_type_hlsl_modern(type, id);\n}\n\n// The optional id parameter indicates the object whose type we are trying\n// to find the description for. It is optional. Most type descriptions do not\n// depend on a specific object's use of that type.\nstring CompilerHLSL::type_to_glsl(const SPIRType &type, uint32_t id)\n{\n\t// Ignore the pointer type since GLSL doesn't have pointers.\n\n\tswitch (type.basetype)\n\t{\n\tcase SPIRType::Struct:\n\t\t// Need OpName lookup here to get a \"sensible\" name for a struct.\n\t\tif (backend.explicit_struct_type)\n\t\t\treturn join(\"struct \", to_name(type.self));\n\t\telse\n\t\t\treturn to_name(type.self);\n\n\tcase SPIRType::Image:\n\tcase SPIRType::SampledImage:\n\t\treturn image_type_hlsl(type, id);\n\n\tcase SPIRType::Sampler:\n\t\treturn comparison_ids.count(id) ? \"SamplerComparisonState\" : \"SamplerState\";\n\n\tcase SPIRType::Void:\n\t\treturn \"void\";\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\tif (type.vecsize == 1 && type.columns == 1) // Scalar builtin\n\t{\n\t\tswitch (type.basetype)\n\t\t{\n\t\tcase SPIRType::Boolean:\n\t\t\treturn \"bool\";\n\t\tcase SPIRType::Int:\n\t\t\treturn backend.basic_int_type;\n\t\tcase SPIRType::UInt:\n\t\t\treturn backend.basic_uint_type;\n\t\tcase SPIRType::AtomicCounter:\n\t\t\treturn \"atomic_uint\";\n\t\tcase SPIRType::Half:\n\t\t\tif (hlsl_options.enable_16bit_types)\n\t\t\t\treturn \"half\";\n\t\t\telse\n\t\t\t\treturn \"min16float\";\n\t\tcase SPIRType::Short:\n\t\t\tif (hlsl_options.enable_16bit_types)\n\t\t\t\treturn \"int16_t\";\n\t\t\telse\n\t\t\t\treturn \"min16int\";\n\t\tcase SPIRType::UShort:\n\t\t\tif (hlsl_options.enable_16bit_types)\n\t\t\t\treturn \"uint16_t\";\n\t\t\telse\n\t\t\t\treturn \"min16uint\";\n\t\tcase SPIRType::Float:\n\t\t\treturn \"float\";\n\t\tcase SPIRType::Double:\n\t\t\treturn \"double\";\n\t\tcase SPIRType::Int64:\n\t\t\tif (hlsl_options.shader_model < 60)\n\t\t\t\tSPIRV_CROSS_THROW(\"64-bit integers only supported in SM 6.0.\");\n\t\t\treturn \"int64_t\";\n\t\tcase SPIRType::UInt64:\n\t\t\tif (hlsl_options.shader_model < 60)\n\t\t\t\tSPIRV_CROSS_THROW(\"64-bit integers only supported in SM 6.0.\");\n\t\t\treturn \"uint64_t\";\n\t\tcase SPIRType::AccelerationStructure:\n\t\t\treturn \"RaytracingAccelerationStructure\";\n\t\tcase SPIRType::RayQuery:\n\t\t\treturn \"RayQuery<RAY_FLAG_NONE>\";\n\t\tdefault:\n\t\t\treturn \"???\";\n\t\t}\n\t}\n\telse if (type.vecsize > 1 && type.columns == 1) // Vector builtin\n\t{\n\t\tswitch (type.basetype)\n\t\t{\n\t\tcase SPIRType::Boolean:\n\t\t\treturn join(\"bool\", type.vecsize);\n\t\tcase SPIRType::Int:\n\t\t\treturn join(\"int\", type.vecsize);\n\t\tcase SPIRType::UInt:\n\t\t\treturn join(\"uint\", type.vecsize);\n\t\tcase SPIRType::Half:\n\t\t\treturn join(hlsl_options.enable_16bit_types ? \"half\" : \"min16float\", type.vecsize);\n\t\tcase SPIRType::Short:\n\t\t\treturn join(hlsl_options.enable_16bit_types ? \"int16_t\" : \"min16int\", type.vecsize);\n\t\tcase SPIRType::UShort:\n\t\t\treturn join(hlsl_options.enable_16bit_types ? \"uint16_t\" : \"min16uint\", type.vecsize);\n\t\tcase SPIRType::Float:\n\t\t\treturn join(\"float\", type.vecsize);\n\t\tcase SPIRType::Double:\n\t\t\treturn join(\"double\", type.vecsize);\n\t\tcase SPIRType::Int64:\n\t\t\treturn join(\"i64vec\", type.vecsize);\n\t\tcase SPIRType::UInt64:\n\t\t\treturn join(\"u64vec\", type.vecsize);\n\t\tdefault:\n\t\t\treturn \"???\";\n\t\t}\n\t}\n\telse\n\t{\n\t\tswitch (type.basetype)\n\t\t{\n\t\tcase SPIRType::Boolean:\n\t\t\treturn join(\"bool\", type.columns, \"x\", type.vecsize);\n\t\tcase SPIRType::Int:\n\t\t\treturn join(\"int\", type.columns, \"x\", type.vecsize);\n\t\tcase SPIRType::UInt:\n\t\t\treturn join(\"uint\", type.columns, \"x\", type.vecsize);\n\t\tcase SPIRType::Half:\n\t\t\treturn join(hlsl_options.enable_16bit_types ? \"half\" : \"min16float\", type.columns, \"x\", type.vecsize);\n\t\tcase SPIRType::Short:\n\t\t\treturn join(hlsl_options.enable_16bit_types ? \"int16_t\" : \"min16int\", type.columns, \"x\", type.vecsize);\n\t\tcase SPIRType::UShort:\n\t\t\treturn join(hlsl_options.enable_16bit_types ? \"uint16_t\" : \"min16uint\", type.columns, \"x\", type.vecsize);\n\t\tcase SPIRType::Float:\n\t\t\treturn join(\"float\", type.columns, \"x\", type.vecsize);\n\t\tcase SPIRType::Double:\n\t\t\treturn join(\"double\", type.columns, \"x\", type.vecsize);\n\t\t// Matrix types not supported for int64/uint64.\n\t\tdefault:\n\t\t\treturn \"???\";\n\t\t}\n\t}\n}\n\nvoid CompilerHLSL::emit_header()\n{\n\tfor (auto &header : header_lines)\n\t\tstatement(header);\n\n\tif (header_lines.size() > 0)\n\t{\n\t\tstatement(\"\");\n\t}\n}\n\nvoid CompilerHLSL::emit_interface_block_globally(const SPIRVariable &var)\n{\n\tadd_resource_name(var.self);\n\n\t// The global copies of I/O variables should not contain interpolation qualifiers.\n\t// These are emitted inside the interface structs.\n\tauto &flags = ir.meta[var.self].decoration.decoration_flags;\n\tauto old_flags = flags;\n\tflags.reset();\n\tstatement(\"static \", variable_decl(var), \";\");\n\tflags = old_flags;\n}\n\nconst char *CompilerHLSL::to_storage_qualifiers_glsl(const SPIRVariable &var)\n{\n\t// Input and output variables are handled specially in HLSL backend.\n\t// The variables are declared as global, private variables, and do not need any qualifiers.\n\tif (var.storage == StorageClassUniformConstant || var.storage == StorageClassUniform ||\n\t    var.storage == StorageClassPushConstant)\n\t{\n\t\treturn \"uniform \";\n\t}\n\n\treturn \"\";\n}\n\nvoid CompilerHLSL::emit_builtin_outputs_in_struct()\n{\n\tauto &execution = get_entry_point();\n\n\tbool legacy = hlsl_options.shader_model <= 30;\n\tactive_output_builtins.for_each_bit([&](uint32_t i) {\n\t\tconst char *type = nullptr;\n\t\tconst char *semantic = nullptr;\n\t\tauto builtin = static_cast<BuiltIn>(i);\n\t\tswitch (builtin)\n\t\t{\n\t\tcase BuiltInPosition:\n\t\t\ttype = is_position_invariant() && backend.support_precise_qualifier ? \"precise float4\" : \"float4\";\n\t\t\tsemantic = legacy ? \"POSITION\" : \"SV_Position\";\n\t\t\tbreak;\n\n\t\tcase BuiltInSampleMask:\n\t\t\tif (hlsl_options.shader_model < 41 || execution.model != ExecutionModelFragment)\n\t\t\t\tSPIRV_CROSS_THROW(\"Sample Mask output is only supported in PS 4.1 or higher.\");\n\t\t\ttype = \"uint\";\n\t\t\tsemantic = \"SV_Coverage\";\n\t\t\tbreak;\n\n\t\tcase BuiltInFragDepth:\n\t\t\ttype = \"float\";\n\t\t\tif (legacy)\n\t\t\t{\n\t\t\t\tsemantic = \"DEPTH\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (hlsl_options.shader_model >= 50 && execution.flags.get(ExecutionModeDepthGreater))\n\t\t\t\t\tsemantic = \"SV_DepthGreaterEqual\";\n\t\t\t\telse if (hlsl_options.shader_model >= 50 && execution.flags.get(ExecutionModeDepthLess))\n\t\t\t\t\tsemantic = \"SV_DepthLessEqual\";\n\t\t\t\telse\n\t\t\t\t\tsemantic = \"SV_Depth\";\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase BuiltInClipDistance:\n\t\t{\n\t\t\tstatic const char *types[] = { \"float\", \"float2\", \"float3\", \"float4\" };\n\n\t\t\t// HLSL is a bit weird here, use SV_ClipDistance0, SV_ClipDistance1 and so on with vectors.\n\t\t\tif (execution.model == ExecutionModelMeshEXT)\n\t\t\t{\n\t\t\t\tif (clip_distance_count > 4)\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Clip distance count > 4 not supported for mesh shaders.\");\n\n\t\t\t\tif (clip_distance_count == 1)\n\t\t\t\t{\n\t\t\t\t\t// Avoids having to hack up access_chain code. Makes it trivially indexable.\n\t\t\t\t\tstatement(\"float gl_ClipDistance[1] : SV_ClipDistance;\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Replace array with vector directly, avoids any weird fixup path.\n\t\t\t\t\tstatement(types[clip_distance_count - 1], \" gl_ClipDistance : SV_ClipDistance;\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor (uint32_t clip = 0; clip < clip_distance_count; clip += 4)\n\t\t\t\t{\n\t\t\t\t\tuint32_t to_declare = clip_distance_count - clip;\n\t\t\t\t\tif (to_declare > 4)\n\t\t\t\t\t\tto_declare = 4;\n\n\t\t\t\t\tuint32_t semantic_index = clip / 4;\n\n\t\t\t\t\tstatement(types[to_declare - 1], \" \", builtin_to_glsl(builtin, StorageClassOutput), semantic_index,\n\t\t\t\t\t          \" : SV_ClipDistance\", semantic_index, \";\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase BuiltInCullDistance:\n\t\t{\n\t\t\tstatic const char *types[] = { \"float\", \"float2\", \"float3\", \"float4\" };\n\n\t\t\t// HLSL is a bit weird here, use SV_CullDistance0, SV_CullDistance1 and so on with vectors.\n\t\t\tif (execution.model == ExecutionModelMeshEXT)\n\t\t\t{\n\t\t\t\tif (cull_distance_count > 4)\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Cull distance count > 4 not supported for mesh shaders.\");\n\n\t\t\t\tif (cull_distance_count == 1)\n\t\t\t\t{\n\t\t\t\t\t// Avoids having to hack up access_chain code. Makes it trivially indexable.\n\t\t\t\t\tstatement(\"float gl_CullDistance[1] : SV_CullDistance;\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Replace array with vector directly, avoids any weird fixup path.\n\t\t\t\t\tstatement(types[cull_distance_count - 1], \" gl_CullDistance : SV_CullDistance;\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor (uint32_t cull = 0; cull < cull_distance_count; cull += 4)\n\t\t\t\t{\n\t\t\t\t\tuint32_t to_declare = cull_distance_count - cull;\n\t\t\t\t\tif (to_declare > 4)\n\t\t\t\t\t\tto_declare = 4;\n\n\t\t\t\t\tuint32_t semantic_index = cull / 4;\n\n\t\t\t\t\tstatement(types[to_declare - 1], \" \", builtin_to_glsl(builtin, StorageClassOutput), semantic_index,\n\t\t\t\t\t          \" : SV_CullDistance\", semantic_index, \";\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase BuiltInPointSize:\n\t\t\t// If point_size_compat is enabled, just ignore PointSize.\n\t\t\t// PointSize does not exist in HLSL, but some code bases might want to be able to use these shaders,\n\t\t\t// even if it means working around the missing feature.\n\t\t\tif (legacy)\n\t\t\t{\n\t\t\t\ttype = \"float\";\n\t\t\t\tsemantic = \"PSIZE\";\n\t\t\t}\n\t\t\telse if (!hlsl_options.point_size_compat)\n\t\t\t\tSPIRV_CROSS_THROW(\"Unsupported builtin in HLSL.\");\n\t\t\tbreak;\n\n\t\tcase BuiltInLayer:\n\t\tcase BuiltInPrimitiveId:\n\t\tcase BuiltInViewportIndex:\n\t\tcase BuiltInPrimitiveShadingRateKHR:\n\t\tcase BuiltInCullPrimitiveEXT:\n\t\t\t// per-primitive attributes handled separatly\n\t\t\tbreak;\n\n\t\tcase BuiltInPrimitivePointIndicesEXT:\n\t\tcase BuiltInPrimitiveLineIndicesEXT:\n\t\tcase BuiltInPrimitiveTriangleIndicesEXT:\n\t\t\t// meshlet local-index buffer handled separatly\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tSPIRV_CROSS_THROW(\"Unsupported builtin in HLSL.\");\n\t\t}\n\n\t\tif (type && semantic)\n\t\t\tstatement(type, \" \", builtin_to_glsl(builtin, StorageClassOutput), \" : \", semantic, \";\");\n\t    });\n}\n\nvoid CompilerHLSL::emit_builtin_primitive_outputs_in_struct()\n{\n\tactive_output_builtins.for_each_bit([&](uint32_t i) {\n\t\tconst char *type = nullptr;\n\t\tconst char *semantic = nullptr;\n\t\tauto builtin = static_cast<BuiltIn>(i);\n\t\tswitch (builtin)\n\t\t{\n\t\tcase BuiltInLayer:\n\t\t{\n\t\t\tif (hlsl_options.shader_model < 50)\n\t\t\t\tSPIRV_CROSS_THROW(\"Render target array index output is only supported in SM 5.0 or higher.\");\n\t\t\ttype = \"uint\";\n\t\t\tsemantic = \"SV_RenderTargetArrayIndex\";\n\t\t\tbreak;\n\t\t}\n\n\t\tcase BuiltInPrimitiveId:\n\t\t\ttype = \"uint\";\n\t\t\tsemantic = \"SV_PrimitiveID\";\n\t\t\tbreak;\n\n\t\tcase BuiltInViewportIndex:\n\t\t\ttype = \"uint\";\n\t\t\tsemantic = \"SV_ViewportArrayIndex\";\n\t\t\tbreak;\n\n\t\tcase BuiltInPrimitiveShadingRateKHR:\n\t\t\ttype = \"uint\";\n\t\t\tsemantic = \"SV_ShadingRate\";\n\t\t\tbreak;\n\n\t\tcase BuiltInCullPrimitiveEXT:\n\t\t\ttype = \"bool\";\n\t\t\tsemantic = \"SV_CullPrimitive\";\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\tif (type && semantic)\n\t\t\tstatement(type, \" \", builtin_to_glsl(builtin, StorageClassOutput), \" : \", semantic, \";\");\n\t});\n}\n\nvoid CompilerHLSL::emit_builtin_inputs_in_struct()\n{\n\tbool legacy = hlsl_options.shader_model <= 30;\n\tactive_input_builtins.for_each_bit([&](uint32_t i) {\n\t\tconst char *type = nullptr;\n\t\tconst char *semantic = nullptr;\n\t\tauto builtin = static_cast<BuiltIn>(i);\n\t\tswitch (builtin)\n\t\t{\n\t\tcase BuiltInFragCoord:\n\t\t\ttype = \"float4\";\n\t\t\tsemantic = legacy ? \"VPOS\" : \"SV_Position\";\n\t\t\tbreak;\n\n\t\tcase BuiltInVertexId:\n\t\tcase BuiltInVertexIndex:\n\t\t\tif (legacy)\n\t\t\t\tSPIRV_CROSS_THROW(\"Vertex index not supported in SM 3.0 or lower.\");\n\t\t\ttype = \"uint\";\n\t\t\tsemantic = \"SV_VertexID\";\n\t\t\tbreak;\n\n\t\tcase BuiltInPrimitiveId:\n\t\t\ttype = \"uint\";\n\t\t\tsemantic = \"SV_PrimitiveID\";\n\t\t\tbreak;\n\n\t\tcase BuiltInInstanceId:\n\t\tcase BuiltInInstanceIndex:\n\t\t\tif (legacy)\n\t\t\t\tSPIRV_CROSS_THROW(\"Instance index not supported in SM 3.0 or lower.\");\n\t\t\ttype = \"uint\";\n\t\t\tsemantic = \"SV_InstanceID\";\n\t\t\tbreak;\n\n\t\tcase BuiltInSampleId:\n\t\t\tif (legacy)\n\t\t\t\tSPIRV_CROSS_THROW(\"Sample ID not supported in SM 3.0 or lower.\");\n\t\t\ttype = \"uint\";\n\t\t\tsemantic = \"SV_SampleIndex\";\n\t\t\tbreak;\n\n\t\tcase BuiltInSampleMask:\n\t\t\tif (hlsl_options.shader_model < 50 || get_entry_point().model != ExecutionModelFragment)\n\t\t\t\tSPIRV_CROSS_THROW(\"Sample Mask input is only supported in PS 5.0 or higher.\");\n\t\t\ttype = \"uint\";\n\t\t\tsemantic = \"SV_Coverage\";\n\t\t\tbreak;\n\n\t\tcase BuiltInGlobalInvocationId:\n\t\t\ttype = \"uint3\";\n\t\t\tsemantic = \"SV_DispatchThreadID\";\n\t\t\tbreak;\n\n\t\tcase BuiltInLocalInvocationId:\n\t\t\ttype = \"uint3\";\n\t\t\tsemantic = \"SV_GroupThreadID\";\n\t\t\tbreak;\n\n\t\tcase BuiltInLocalInvocationIndex:\n\t\t\ttype = \"uint\";\n\t\t\tsemantic = \"SV_GroupIndex\";\n\t\t\tbreak;\n\n\t\tcase BuiltInWorkgroupId:\n\t\t\ttype = \"uint3\";\n\t\t\tsemantic = \"SV_GroupID\";\n\t\t\tbreak;\n\n\t\tcase BuiltInFrontFacing:\n\t\t\ttype = \"bool\";\n\t\t\tsemantic = \"SV_IsFrontFace\";\n\t\t\tbreak;\n\n\t\tcase BuiltInViewIndex:\n\t\t\tif (hlsl_options.shader_model < 61 || (get_entry_point().model != ExecutionModelVertex && get_entry_point().model != ExecutionModelFragment))\n\t\t\t\tSPIRV_CROSS_THROW(\"View Index input is only supported in VS and PS 6.1 or higher.\");\n\t\t\ttype = \"uint\";\n\t\t\tsemantic = \"SV_ViewID\";\n\t\t\tbreak;\n\n\t\tcase BuiltInNumWorkgroups:\n\t\tcase BuiltInSubgroupSize:\n\t\tcase BuiltInSubgroupLocalInvocationId:\n\t\tcase BuiltInSubgroupEqMask:\n\t\tcase BuiltInSubgroupLtMask:\n\t\tcase BuiltInSubgroupLeMask:\n\t\tcase BuiltInSubgroupGtMask:\n\t\tcase BuiltInSubgroupGeMask:\n\t\tcase BuiltInBaseVertex:\n\t\tcase BuiltInBaseInstance:\n\t\t\t// Handled specially.\n\t\t\tbreak;\n\n\t\tcase BuiltInHelperInvocation:\n\t\t\tif (hlsl_options.shader_model < 50 || get_entry_point().model != ExecutionModelFragment)\n\t\t\t\tSPIRV_CROSS_THROW(\"Helper Invocation input is only supported in PS 5.0 or higher.\");\n\t\t\tbreak;\n\n\t\tcase BuiltInClipDistance:\n\t\t\t// HLSL is a bit weird here, use SV_ClipDistance0, SV_ClipDistance1 and so on with vectors.\n\t\t\tfor (uint32_t clip = 0; clip < clip_distance_count; clip += 4)\n\t\t\t{\n\t\t\t\tuint32_t to_declare = clip_distance_count - clip;\n\t\t\t\tif (to_declare > 4)\n\t\t\t\t\tto_declare = 4;\n\n\t\t\t\tuint32_t semantic_index = clip / 4;\n\n\t\t\t\tstatic const char *types[] = { \"float\", \"float2\", \"float3\", \"float4\" };\n\t\t\t\tstatement(types[to_declare - 1], \" \", builtin_to_glsl(builtin, StorageClassInput), semantic_index,\n\t\t\t\t          \" : SV_ClipDistance\", semantic_index, \";\");\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase BuiltInCullDistance:\n\t\t\t// HLSL is a bit weird here, use SV_CullDistance0, SV_CullDistance1 and so on with vectors.\n\t\t\tfor (uint32_t cull = 0; cull < cull_distance_count; cull += 4)\n\t\t\t{\n\t\t\t\tuint32_t to_declare = cull_distance_count - cull;\n\t\t\t\tif (to_declare > 4)\n\t\t\t\t\tto_declare = 4;\n\n\t\t\t\tuint32_t semantic_index = cull / 4;\n\n\t\t\t\tstatic const char *types[] = { \"float\", \"float2\", \"float3\", \"float4\" };\n\t\t\t\tstatement(types[to_declare - 1], \" \", builtin_to_glsl(builtin, StorageClassInput), semantic_index,\n\t\t\t\t          \" : SV_CullDistance\", semantic_index, \";\");\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase BuiltInPointCoord:\n\t\t\t// PointCoord is not supported, but provide a way to just ignore that, similar to PointSize.\n\t\t\tif (hlsl_options.point_coord_compat)\n\t\t\t\tbreak;\n\t\t\telse\n\t\t\t\tSPIRV_CROSS_THROW(\"Unsupported builtin in HLSL.\");\n\n\t\tcase BuiltInLayer:\n\t\t\tif (hlsl_options.shader_model < 50 || get_entry_point().model != ExecutionModelFragment)\n\t\t\t\tSPIRV_CROSS_THROW(\"Render target array index input is only supported in PS 5.0 or higher.\");\n\t\t\ttype = \"uint\";\n\t\t\tsemantic = \"SV_RenderTargetArrayIndex\";\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tSPIRV_CROSS_THROW(\"Unsupported builtin in HLSL.\");\n\t\t}\n\n\t\tif (type && semantic)\n\t\t\tstatement(type, \" \", builtin_to_glsl(builtin, StorageClassInput), \" : \", semantic, \";\");\n\t});\n}\n\nuint32_t CompilerHLSL::type_to_consumed_locations(const SPIRType &type) const\n{\n\t// TODO: Need to verify correctness.\n\tuint32_t elements = 0;\n\n\tif (type.basetype == SPIRType::Struct)\n\t{\n\t\tfor (uint32_t i = 0; i < uint32_t(type.member_types.size()); i++)\n\t\t\telements += type_to_consumed_locations(get<SPIRType>(type.member_types[i]));\n\t}\n\telse\n\t{\n\t\tuint32_t array_multiplier = 1;\n\t\tfor (uint32_t i = 0; i < uint32_t(type.array.size()); i++)\n\t\t{\n\t\t\tif (type.array_size_literal[i])\n\t\t\t\tarray_multiplier *= type.array[i];\n\t\t\telse\n\t\t\t\tarray_multiplier *= evaluate_constant_u32(type.array[i]);\n\t\t}\n\t\telements += array_multiplier * type.columns;\n\t}\n\treturn elements;\n}\n\nstring CompilerHLSL::to_interpolation_qualifiers(const Bitset &flags)\n{\n\tstring res;\n\t//if (flags & (1ull << DecorationSmooth))\n\t//    res += \"linear \";\n\tif (flags.get(DecorationFlat))\n\t\tres += \"nointerpolation \";\n\tif (flags.get(DecorationNoPerspective))\n\t\tres += \"noperspective \";\n\tif (flags.get(DecorationCentroid))\n\t\tres += \"centroid \";\n\tif (flags.get(DecorationPatch))\n\t\tres += \"patch \"; // Seems to be different in actual HLSL.\n\tif (flags.get(DecorationSample))\n\t\tres += \"sample \";\n\tif (flags.get(DecorationInvariant) && backend.support_precise_qualifier)\n\t\tres += \"precise \"; // Not supported?\n\n\treturn res;\n}\n\nstd::string CompilerHLSL::to_semantic(uint32_t location, ExecutionModel em, StorageClass sc)\n{\n\tif (em == ExecutionModelVertex && sc == StorageClassInput)\n\t{\n\t\t// We have a vertex attribute - we should look at remapping it if the user provided\n\t\t// vertex attribute hints.\n\t\tfor (auto &attribute : remap_vertex_attributes)\n\t\t\tif (attribute.location == location)\n\t\t\t\treturn attribute.semantic;\n\t}\n\n\t// Not a vertex attribute, or no remap_vertex_attributes entry.\n\treturn join(\"TEXCOORD\", location);\n}\n\nstd::string CompilerHLSL::to_initializer_expression(const SPIRVariable &var)\n{\n\t// We cannot emit static const initializer for block constants for practical reasons,\n\t// so just inline the initializer.\n\t// FIXME: There is a theoretical problem here if someone tries to composite extract\n\t// into this initializer since we don't declare it properly, but that is somewhat non-sensical.\n\tauto &type = get<SPIRType>(var.basetype);\n\tbool is_block = has_decoration(type.self, DecorationBlock);\n\tauto *c = maybe_get<SPIRConstant>(var.initializer);\n\tif (is_block && c)\n\t\treturn constant_expression(*c);\n\telse\n\t\treturn CompilerGLSL::to_initializer_expression(var);\n}\n\nvoid CompilerHLSL::emit_interface_block_member_in_struct(const SPIRVariable &var, uint32_t member_index,\n                                                         uint32_t location,\n                                                         std::unordered_set<uint32_t> &active_locations)\n{\n\tauto &execution = get_entry_point();\n\tauto type = get<SPIRType>(var.basetype);\n\tauto semantic = to_semantic(location, execution.model, var.storage);\n\tauto mbr_name = join(to_name(type.self), \"_\", to_member_name(type, member_index));\n\tauto &mbr_type = get<SPIRType>(type.member_types[member_index]);\n\n\tstatement(to_interpolation_qualifiers(get_member_decoration_bitset(type.self, member_index)),\n\t          type_to_glsl(mbr_type),\n\t          \" \", mbr_name, type_to_array_glsl(mbr_type),\n\t          \" : \", semantic, \";\");\n\n\t// Structs and arrays should consume more locations.\n\tuint32_t consumed_locations = type_to_consumed_locations(mbr_type);\n\tfor (uint32_t i = 0; i < consumed_locations; i++)\n\t\tactive_locations.insert(location + i);\n}\n\nvoid CompilerHLSL::emit_interface_block_in_struct(const SPIRVariable &var, unordered_set<uint32_t> &active_locations)\n{\n\tauto &execution = get_entry_point();\n\tauto type = get<SPIRType>(var.basetype);\n\n\tstring binding;\n\tbool use_location_number = true;\n\tbool need_matrix_unroll = false;\n\tbool legacy = hlsl_options.shader_model <= 30;\n\tif (execution.model == ExecutionModelFragment && var.storage == StorageClassOutput)\n\t{\n\t\t// Dual-source blending is achieved in HLSL by emitting to SV_Target0 and 1.\n\t\tuint32_t index = get_decoration(var.self, DecorationIndex);\n\t\tuint32_t location = get_decoration(var.self, DecorationLocation);\n\n\t\tif (index != 0 && location != 0)\n\t\t\tSPIRV_CROSS_THROW(\"Dual-source blending is only supported on MRT #0 in HLSL.\");\n\n\t\tbinding = join(legacy ? \"COLOR\" : \"SV_Target\", location + index);\n\t\tuse_location_number = false;\n\t\tif (legacy) // COLOR must be a four-component vector on legacy shader model targets (HLSL ERR_COLOR_4COMP)\n\t\t\ttype.vecsize = 4;\n\t}\n\telse if (var.storage == StorageClassInput && execution.model == ExecutionModelVertex)\n\t{\n\t\tneed_matrix_unroll = true;\n\t\tif (legacy) // Inputs must be floating-point in legacy targets.\n\t\t\ttype.basetype = SPIRType::Float;\n\t}\n\n\tconst auto get_vacant_location = [&]() -> uint32_t {\n\t\tfor (uint32_t i = 0; i < 64; i++)\n\t\t\tif (!active_locations.count(i))\n\t\t\t\treturn i;\n\t\tSPIRV_CROSS_THROW(\"All locations from 0 to 63 are exhausted.\");\n\t};\n\n\tauto name = to_name(var.self);\n\tif (use_location_number)\n\t{\n\t\tuint32_t location_number;\n\n\t\t// If an explicit location exists, use it with TEXCOORD[N] semantic.\n\t\t// Otherwise, pick a vacant location.\n\t\tif (has_decoration(var.self, DecorationLocation))\n\t\t\tlocation_number = get_decoration(var.self, DecorationLocation);\n\t\telse\n\t\t\tlocation_number = get_vacant_location();\n\n\t\t// Allow semantic remap if specified.\n\t\tauto semantic = to_semantic(location_number, execution.model, var.storage);\n\n\t\tif (need_matrix_unroll && type.columns > 1)\n\t\t{\n\t\t\tif (!type.array.empty())\n\t\t\t\tSPIRV_CROSS_THROW(\"Arrays of matrices used as input/output. This is not supported.\");\n\n\t\t\t// Unroll matrices.\n\t\t\tfor (uint32_t i = 0; i < type.columns; i++)\n\t\t\t{\n\t\t\t\tSPIRType newtype = type;\n\t\t\t\tnewtype.columns = 1;\n\n\t\t\t\tstring effective_semantic;\n\t\t\t\tif (hlsl_options.flatten_matrix_vertex_input_semantics)\n\t\t\t\t\teffective_semantic = to_semantic(location_number, execution.model, var.storage);\n\t\t\t\telse\n\t\t\t\t\teffective_semantic = join(semantic, \"_\", i);\n\n\t\t\t\tstatement(to_interpolation_qualifiers(get_decoration_bitset(var.self)),\n\t\t\t\t          variable_decl(newtype, join(name, \"_\", i)), \" : \", effective_semantic, \";\");\n\t\t\t\tactive_locations.insert(location_number++);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tauto decl_type = type;\n\t\t\tif (execution.model == ExecutionModelMeshEXT)\n\t\t\t{\n\t\t\t\tdecl_type.array.erase(decl_type.array.begin());\n\t\t\t\tdecl_type.array_size_literal.erase(decl_type.array_size_literal.begin());\n\t\t\t}\n\t\t\tstatement(to_interpolation_qualifiers(get_decoration_bitset(var.self)), variable_decl(decl_type, name), \" : \",\n\t\t\t          semantic, \";\");\n\n\t\t\t// Structs and arrays should consume more locations.\n\t\t\tuint32_t consumed_locations = type_to_consumed_locations(decl_type);\n\t\t\tfor (uint32_t i = 0; i < consumed_locations; i++)\n\t\t\t\tactive_locations.insert(location_number + i);\n\t\t}\n\t}\n\telse\n\t{\n\t\tstatement(variable_decl(type, name), \" : \", binding, \";\");\n\t}\n}\n\nstd::string CompilerHLSL::builtin_to_glsl(spv::BuiltIn builtin, spv::StorageClass storage)\n{\n\tswitch (builtin)\n\t{\n\tcase BuiltInVertexId:\n\t\treturn \"gl_VertexID\";\n\tcase BuiltInInstanceId:\n\t\treturn \"gl_InstanceID\";\n\tcase BuiltInNumWorkgroups:\n\t{\n\t\tif (!num_workgroups_builtin)\n\t\t\tSPIRV_CROSS_THROW(\"NumWorkgroups builtin is used, but remap_num_workgroups_builtin() was not called. \"\n\t\t\t                  \"Cannot emit code for this builtin.\");\n\n\t\tauto &var = get<SPIRVariable>(num_workgroups_builtin);\n\t\tauto &type = get<SPIRType>(var.basetype);\n\t\tauto ret = join(to_name(num_workgroups_builtin), \"_\", get_member_name(type.self, 0));\n\t\tParsedIR::sanitize_underscores(ret);\n\t\treturn ret;\n\t}\n\tcase BuiltInPointCoord:\n\t\t// Crude hack, but there is no real alternative. This path is only enabled if point_coord_compat is set.\n\t\treturn \"float2(0.5f, 0.5f)\";\n\tcase BuiltInSubgroupLocalInvocationId:\n\t\treturn \"WaveGetLaneIndex()\";\n\tcase BuiltInSubgroupSize:\n\t\treturn \"WaveGetLaneCount()\";\n\tcase BuiltInHelperInvocation:\n\t\treturn \"IsHelperLane()\";\n\n\tdefault:\n\t\treturn CompilerGLSL::builtin_to_glsl(builtin, storage);\n\t}\n}\n\nvoid CompilerHLSL::emit_builtin_variables()\n{\n\tBitset builtins = active_input_builtins;\n\tbuiltins.merge_or(active_output_builtins);\n\n\tstd::unordered_map<uint32_t, ID> builtin_to_initializer;\n\n\t// We need to declare sample mask with the same type that module declares it.\n\t// Sample mask is somewhat special in that SPIR-V has an array, and we can copy that array, so we need to\n\t// match sign.\n\tSPIRType::BaseType sample_mask_in_basetype = SPIRType::Void;\n\tSPIRType::BaseType sample_mask_out_basetype = SPIRType::Void;\n\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\tif (!is_builtin_variable(var))\n\t\t\treturn;\n\n\t\tauto &type = this->get<SPIRType>(var.basetype);\n\t\tauto builtin = BuiltIn(get_decoration(var.self, DecorationBuiltIn));\n\n\t\tif (var.storage == StorageClassInput && builtin == BuiltInSampleMask)\n\t\t\tsample_mask_in_basetype = type.basetype;\n\t\telse if (var.storage == StorageClassOutput && builtin == BuiltInSampleMask)\n\t\t\tsample_mask_out_basetype = type.basetype;\n\n\t\tif (var.initializer && var.storage == StorageClassOutput)\n\t\t{\n\t\t\tauto *c = this->maybe_get<SPIRConstant>(var.initializer);\n\t\t\tif (!c)\n\t\t\t\treturn;\n\n\t\t\tif (type.basetype == SPIRType::Struct)\n\t\t\t{\n\t\t\t\tuint32_t member_count = uint32_t(type.member_types.size());\n\t\t\t\tfor (uint32_t i = 0; i < member_count; i++)\n\t\t\t\t{\n\t\t\t\t\tif (has_member_decoration(type.self, i, DecorationBuiltIn))\n\t\t\t\t\t{\n\t\t\t\t\t\tbuiltin_to_initializer[get_member_decoration(type.self, i, DecorationBuiltIn)] =\n\t\t\t\t\t\t\t\tc->subconstants[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (has_decoration(var.self, DecorationBuiltIn))\n\t\t\t{\n\t\t\t\tbuiltin_to_initializer[builtin] = var.initializer;\n\t\t\t}\n\t\t}\n\t});\n\n\t// Emit global variables for the interface variables which are statically used by the shader.\n\tbuiltins.for_each_bit([&](uint32_t i) {\n\t\tconst char *type = nullptr;\n\t\tauto builtin = static_cast<BuiltIn>(i);\n\t\tuint32_t array_size = 0;\n\n\t\tstring init_expr;\n\t\tauto init_itr = builtin_to_initializer.find(builtin);\n\t\tif (init_itr != builtin_to_initializer.end())\n\t\t\tinit_expr = join(\" = \", to_expression(init_itr->second));\n\n\t\tif (get_execution_model() == ExecutionModelMeshEXT)\n\t\t{\n\t\t\tif (builtin == BuiltInPosition || builtin == BuiltInPointSize || builtin == BuiltInClipDistance ||\n\t\t\t    builtin == BuiltInCullDistance || builtin == BuiltInLayer || builtin == BuiltInPrimitiveId ||\n\t\t\t    builtin == BuiltInViewportIndex || builtin == BuiltInCullPrimitiveEXT ||\n\t\t\t    builtin == BuiltInPrimitiveShadingRateKHR || builtin == BuiltInPrimitivePointIndicesEXT ||\n\t\t\t    builtin == BuiltInPrimitiveLineIndicesEXT || builtin == BuiltInPrimitiveTriangleIndicesEXT)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tswitch (builtin)\n\t\t{\n\t\tcase BuiltInFragCoord:\n\t\tcase BuiltInPosition:\n\t\t\ttype = \"float4\";\n\t\t\tbreak;\n\n\t\tcase BuiltInFragDepth:\n\t\t\ttype = \"float\";\n\t\t\tbreak;\n\n\t\tcase BuiltInVertexId:\n\t\tcase BuiltInVertexIndex:\n\t\tcase BuiltInInstanceIndex:\n\t\t\ttype = \"int\";\n\t\t\tif (hlsl_options.support_nonzero_base_vertex_base_instance)\n\t\t\t\tbase_vertex_info.used = true;\n\t\t\tbreak;\n\n\t\tcase BuiltInBaseVertex:\n\t\tcase BuiltInBaseInstance:\n\t\t\ttype = \"int\";\n\t\t\tbase_vertex_info.used = true;\n\t\t\tbreak;\n\n\t\tcase BuiltInInstanceId:\n\t\tcase BuiltInSampleId:\n\t\t\ttype = \"int\";\n\t\t\tbreak;\n\n\t\tcase BuiltInPointSize:\n\t\t\tif (hlsl_options.point_size_compat || hlsl_options.shader_model <= 30)\n\t\t\t{\n\t\t\t\t// Just emit the global variable, it will be ignored.\n\t\t\t\ttype = \"float\";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse\n\t\t\t\tSPIRV_CROSS_THROW(join(\"Unsupported builtin in HLSL: \", unsigned(builtin)));\n\n\t\tcase BuiltInGlobalInvocationId:\n\t\tcase BuiltInLocalInvocationId:\n\t\tcase BuiltInWorkgroupId:\n\t\t\ttype = \"uint3\";\n\t\t\tbreak;\n\n\t\tcase BuiltInLocalInvocationIndex:\n\t\t\ttype = \"uint\";\n\t\t\tbreak;\n\n\t\tcase BuiltInFrontFacing:\n\t\t\ttype = \"bool\";\n\t\t\tbreak;\n\n\t\tcase BuiltInNumWorkgroups:\n\t\tcase BuiltInPointCoord:\n\t\t\t// Handled specially.\n\t\t\tbreak;\n\n\t\tcase BuiltInSubgroupLocalInvocationId:\n\t\tcase BuiltInSubgroupSize:\n\t\t\tif (hlsl_options.shader_model < 60)\n\t\t\t\tSPIRV_CROSS_THROW(\"Need SM 6.0 for Wave ops.\");\n\t\t\tbreak;\n\n\t\tcase BuiltInSubgroupEqMask:\n\t\tcase BuiltInSubgroupLtMask:\n\t\tcase BuiltInSubgroupLeMask:\n\t\tcase BuiltInSubgroupGtMask:\n\t\tcase BuiltInSubgroupGeMask:\n\t\t\tif (hlsl_options.shader_model < 60)\n\t\t\t\tSPIRV_CROSS_THROW(\"Need SM 6.0 for Wave ops.\");\n\t\t\ttype = \"uint4\";\n\t\t\tbreak;\n\n\t\tcase BuiltInHelperInvocation:\n\t\t\tif (hlsl_options.shader_model < 50)\n\t\t\t\tSPIRV_CROSS_THROW(\"Need SM 5.0 for Helper Invocation.\");\n\t\t\tbreak;\n\n\t\tcase BuiltInClipDistance:\n\t\t\tarray_size = clip_distance_count;\n\t\t\ttype = \"float\";\n\t\t\tbreak;\n\n\t\tcase BuiltInCullDistance:\n\t\t\tarray_size = cull_distance_count;\n\t\t\ttype = \"float\";\n\t\t\tbreak;\n\n\t\tcase BuiltInSampleMask:\n\t\t\tif (active_input_builtins.get(BuiltInSampleMask))\n\t\t\t\ttype = sample_mask_in_basetype == SPIRType::UInt ? \"uint\" : \"int\";\n\t\t\telse\n\t\t\t\ttype = sample_mask_out_basetype == SPIRType::UInt ? \"uint\" : \"int\";\n\t\t\tarray_size = 1;\n\t\t\tbreak;\n\n\t\tcase BuiltInPrimitiveId:\n\t\tcase BuiltInViewIndex:\n\t\tcase BuiltInLayer:\n\t\t\ttype = \"uint\";\n\t\t\tbreak;\n\n\t\tcase BuiltInViewportIndex:\n\t\tcase BuiltInPrimitiveShadingRateKHR:\n\t\tcase BuiltInPrimitiveLineIndicesEXT:\n\t\tcase BuiltInCullPrimitiveEXT:\n\t\t\ttype = \"uint\";\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tSPIRV_CROSS_THROW(join(\"Unsupported builtin in HLSL: \", unsigned(builtin)));\n\t\t}\n\n\t\tStorageClass storage = active_input_builtins.get(i) ? StorageClassInput : StorageClassOutput;\n\n\t\tif (type)\n\t\t{\n\t\t\tif (array_size)\n\t\t\t\tstatement(\"static \", type, \" \", builtin_to_glsl(builtin, storage), \"[\", array_size, \"]\", init_expr, \";\");\n\t\t\telse\n\t\t\t\tstatement(\"static \", type, \" \", builtin_to_glsl(builtin, storage), init_expr, \";\");\n\t\t}\n\n\t\t// SampleMask can be both in and out with sample builtin, in this case we have already\n\t\t// declared the input variable and we need to add the output one now.\n\t\tif (builtin == BuiltInSampleMask && storage == StorageClassInput && this->active_output_builtins.get(i))\n\t\t{\n\t\t\ttype = sample_mask_out_basetype == SPIRType::UInt ? \"uint\" : \"int\";\n\t\t\tif (array_size)\n\t\t\t\tstatement(\"static \", type, \" \", this->builtin_to_glsl(builtin, StorageClassOutput), \"[\", array_size, \"]\", init_expr, \";\");\n\t\t\telse\n\t\t\t\tstatement(\"static \", type, \" \", this->builtin_to_glsl(builtin, StorageClassOutput), init_expr, \";\");\n\t\t}\n\t});\n\n\tif (base_vertex_info.used)\n\t{\n\t\tstring binding_info;\n\t\tif (base_vertex_info.explicit_binding)\n\t\t{\n\t\t\tbinding_info = join(\" : register(b\", base_vertex_info.register_index);\n\t\t\tif (base_vertex_info.register_space)\n\t\t\t\tbinding_info += join(\", space\", base_vertex_info.register_space);\n\t\t\tbinding_info += \")\";\n\t\t}\n\t\tstatement(\"cbuffer SPIRV_Cross_VertexInfo\", binding_info);\n\t\tbegin_scope();\n\t\tstatement(\"int SPIRV_Cross_BaseVertex;\");\n\t\tstatement(\"int SPIRV_Cross_BaseInstance;\");\n\t\tend_scope_decl();\n\t\tstatement(\"\");\n\t}\n}\n\nvoid CompilerHLSL::set_hlsl_aux_buffer_binding(HLSLAuxBinding binding, uint32_t register_index, uint32_t register_space)\n{\n\tif (binding == HLSL_AUX_BINDING_BASE_VERTEX_INSTANCE)\n\t{\n\t\tbase_vertex_info.explicit_binding = true;\n\t\tbase_vertex_info.register_space = register_space;\n\t\tbase_vertex_info.register_index = register_index;\n\t}\n}\n\nvoid CompilerHLSL::unset_hlsl_aux_buffer_binding(HLSLAuxBinding binding)\n{\n\tif (binding == HLSL_AUX_BINDING_BASE_VERTEX_INSTANCE)\n\t\tbase_vertex_info.explicit_binding = false;\n}\n\nbool CompilerHLSL::is_hlsl_aux_buffer_binding_used(HLSLAuxBinding binding) const\n{\n\tif (binding == HLSL_AUX_BINDING_BASE_VERTEX_INSTANCE)\n\t\treturn base_vertex_info.used;\n\telse\n\t\treturn false;\n}\n\nvoid CompilerHLSL::emit_composite_constants()\n{\n\t// HLSL cannot declare structs or arrays inline, so we must move them out to\n\t// global constants directly.\n\tbool emitted = false;\n\n\tir.for_each_typed_id<SPIRConstant>([&](uint32_t, SPIRConstant &c) {\n\t\tif (c.specialization)\n\t\t\treturn;\n\n\t\tauto &type = this->get<SPIRType>(c.constant_type);\n\n\t\tif (type.basetype == SPIRType::Struct && is_builtin_type(type))\n\t\t\treturn;\n\n\t\tif (type.basetype == SPIRType::Struct || !type.array.empty())\n\t\t{\n\t\t\tadd_resource_name(c.self);\n\t\t\tauto name = to_name(c.self);\n\t\t\tstatement(\"static const \", variable_decl(type, name), \" = \", constant_expression(c), \";\");\n\t\t\temitted = true;\n\t\t}\n\t});\n\n\tif (emitted)\n\t\tstatement(\"\");\n}\n\nvoid CompilerHLSL::emit_specialization_constants_and_structs()\n{\n\tbool emitted = false;\n\tSpecializationConstant wg_x, wg_y, wg_z;\n\tID workgroup_size_id = get_work_group_size_specialization_constants(wg_x, wg_y, wg_z);\n\n\tstd::unordered_set<TypeID> io_block_types;\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, const SPIRVariable &var) {\n\t\tauto &type = this->get<SPIRType>(var.basetype);\n\t\tif ((var.storage == StorageClassInput || var.storage == StorageClassOutput) &&\n\t\t    !var.remapped_variable && type.pointer && !is_builtin_variable(var) &&\n\t\t    interface_variable_exists_in_entry_point(var.self) &&\n\t\t    has_decoration(type.self, DecorationBlock))\n\t\t{\n\t\t\tio_block_types.insert(type.self);\n\t\t}\n\t});\n\n\tauto loop_lock = ir.create_loop_hard_lock();\n\tfor (auto &id_ : ir.ids_for_constant_undef_or_type)\n\t{\n\t\tauto &id = ir.ids[id_];\n\n\t\tif (id.get_type() == TypeConstant)\n\t\t{\n\t\t\tauto &c = id.get<SPIRConstant>();\n\n\t\t\tif (c.self == workgroup_size_id)\n\t\t\t{\n\t\t\t\tstatement(\"static const uint3 gl_WorkGroupSize = \",\n\t\t\t\t          constant_expression(get<SPIRConstant>(workgroup_size_id)), \";\");\n\t\t\t\temitted = true;\n\t\t\t}\n\t\t\telse if (c.specialization)\n\t\t\t{\n\t\t\t\tauto &type = get<SPIRType>(c.constant_type);\n\t\t\t\tadd_resource_name(c.self);\n\t\t\t\tauto name = to_name(c.self);\n\n\t\t\t\tif (has_decoration(c.self, DecorationSpecId))\n\t\t\t\t{\n\t\t\t\t\t// HLSL does not support specialization constants, so fallback to macros.\n\t\t\t\t\tc.specialization_constant_macro_name =\n\t\t\t\t\t\t\tconstant_value_macro_name(get_decoration(c.self, DecorationSpecId));\n\n\t\t\t\t\tstatement(\"#ifndef \", c.specialization_constant_macro_name);\n\t\t\t\t\tstatement(\"#define \", c.specialization_constant_macro_name, \" \", constant_expression(c));\n\t\t\t\t\tstatement(\"#endif\");\n\t\t\t\t\tstatement(\"static const \", variable_decl(type, name), \" = \", c.specialization_constant_macro_name, \";\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tstatement(\"static const \", variable_decl(type, name), \" = \", constant_expression(c), \";\");\n\n\t\t\t\temitted = true;\n\t\t\t}\n\t\t}\n\t\telse if (id.get_type() == TypeConstantOp)\n\t\t{\n\t\t\tauto &c = id.get<SPIRConstantOp>();\n\t\t\tauto &type = get<SPIRType>(c.basetype);\n\t\t\tadd_resource_name(c.self);\n\t\t\tauto name = to_name(c.self);\n\t\t\tstatement(\"static const \", variable_decl(type, name), \" = \", constant_op_expression(c), \";\");\n\t\t\temitted = true;\n\t\t}\n\t\telse if (id.get_type() == TypeType)\n\t\t{\n\t\t\tauto &type = id.get<SPIRType>();\n\t\t\tbool is_non_io_block = has_decoration(type.self, DecorationBlock) &&\n\t\t\t                       io_block_types.count(type.self) == 0;\n\t\t\tbool is_buffer_block = has_decoration(type.self, DecorationBufferBlock);\n\t\t\tif (type.basetype == SPIRType::Struct && type.array.empty() &&\n\t\t\t    !type.pointer && !is_non_io_block && !is_buffer_block)\n\t\t\t{\n\t\t\t\tif (emitted)\n\t\t\t\t\tstatement(\"\");\n\t\t\t\temitted = false;\n\n\t\t\t\temit_struct(type);\n\t\t\t}\n\t\t}\n\t\telse if (id.get_type() == TypeUndef)\n\t\t{\n\t\t\tauto &undef = id.get<SPIRUndef>();\n\t\t\tauto &type = this->get<SPIRType>(undef.basetype);\n\t\t\t// OpUndef can be void for some reason ...\n\t\t\tif (type.basetype == SPIRType::Void)\n\t\t\t\treturn;\n\n\t\t\tstring initializer;\n\t\t\tif (options.force_zero_initialized_variables && type_can_zero_initialize(type))\n\t\t\t\tinitializer = join(\" = \", to_zero_initialized_expression(undef.basetype));\n\n\t\t\tstatement(\"static \", variable_decl(type, to_name(undef.self), undef.self), initializer, \";\");\n\t\t\temitted = true;\n\t\t}\n\t}\n\n\tif (emitted)\n\t\tstatement(\"\");\n}\n\nvoid CompilerHLSL::replace_illegal_names()\n{\n\tstatic const unordered_set<string> keywords = {\n\t\t// Additional HLSL specific keywords.\n\t\t// From https://docs.microsoft.com/en-US/windows/win32/direct3dhlsl/dx-graphics-hlsl-appendix-keywords\n\t\t\"AppendStructuredBuffer\", \"asm\", \"asm_fragment\",\n\t\t\"BlendState\", \"bool\", \"break\", \"Buffer\", \"ByteAddressBuffer\",\n\t\t\"case\", \"cbuffer\", \"centroid\", \"class\", \"column_major\", \"compile\",\n\t\t\"compile_fragment\", \"CompileShader\", \"const\", \"continue\", \"ComputeShader\",\n\t\t\"ConsumeStructuredBuffer\",\n\t\t\"default\", \"DepthStencilState\", \"DepthStencilView\", \"discard\", \"do\",\n\t\t\"double\", \"DomainShader\", \"dword\",\n\t\t\"else\", \"export\", \"false\", \"float\", \"for\", \"fxgroup\",\n\t\t\"GeometryShader\", \"groupshared\", \"half\", \"HullShader\",\n\t\t\"indices\", \"if\", \"in\", \"inline\", \"inout\", \"InputPatch\", \"int\", \"interface\",\n\t\t\"line\", \"lineadj\", \"linear\", \"LineStream\",\n\t\t\"matrix\", \"min16float\", \"min10float\", \"min16int\", \"min16uint\",\n\t\t\"namespace\", \"nointerpolation\", \"noperspective\", \"NULL\",\n\t\t\"out\", \"OutputPatch\",\n\t\t\"payload\", \"packoffset\", \"pass\", \"pixelfragment\", \"PixelShader\", \"point\",\n\t\t\"PointStream\", \"precise\", \"RasterizerState\", \"RenderTargetView\",\n\t\t\"return\", \"register\", \"row_major\", \"RWBuffer\", \"RWByteAddressBuffer\",\n\t\t\"RWStructuredBuffer\", \"RWTexture1D\", \"RWTexture1DArray\", \"RWTexture2D\",\n\t\t\"RWTexture2DArray\", \"RWTexture3D\", \"sample\", \"sampler\", \"SamplerState\",\n\t\t\"SamplerComparisonState\", \"shared\", \"snorm\", \"stateblock\", \"stateblock_state\",\n\t\t\"static\", \"string\", \"struct\", \"switch\", \"StructuredBuffer\", \"tbuffer\",\n\t\t\"technique\", \"technique10\", \"technique11\", \"texture\", \"Texture1D\",\n\t\t\"Texture1DArray\", \"Texture2D\", \"Texture2DArray\", \"Texture2DMS\", \"Texture2DMSArray\",\n\t\t\"Texture3D\", \"TextureCube\", \"TextureCubeArray\", \"true\", \"typedef\", \"triangle\",\n\t\t\"triangleadj\", \"TriangleStream\", \"uint\", \"uniform\", \"unorm\", \"unsigned\",\n\t\t\"vector\", \"vertexfragment\", \"VertexShader\", \"vertices\", \"void\", \"volatile\", \"while\",\n\t};\n\n\tCompilerGLSL::replace_illegal_names(keywords);\n\tCompilerGLSL::replace_illegal_names();\n}\n\nSPIRType::BaseType CompilerHLSL::get_builtin_basetype(BuiltIn builtin, SPIRType::BaseType default_type)\n{\n\tswitch (builtin)\n\t{\n\tcase BuiltInSampleMask:\n\t\t// We declare sample mask array with module type, so always use default_type here.\n\t\treturn default_type;\n\tdefault:\n\t\treturn CompilerGLSL::get_builtin_basetype(builtin, default_type);\n\t}\n}\n\nvoid CompilerHLSL::emit_resources()\n{\n\tauto &execution = get_entry_point();\n\n\treplace_illegal_names();\n\n\tswitch (execution.model)\n\t{\n\tcase ExecutionModelGeometry:\n\tcase ExecutionModelTessellationControl:\n\tcase ExecutionModelTessellationEvaluation:\n\tcase ExecutionModelMeshEXT:\n\t\tfixup_implicit_builtin_block_names(execution.model);\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\temit_specialization_constants_and_structs();\n\temit_composite_constants();\n\n\tbool emitted = false;\n\n\t// Output UBOs and SSBOs\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\tauto &type = this->get<SPIRType>(var.basetype);\n\n\t\tbool is_block_storage = type.storage == StorageClassStorageBuffer || type.storage == StorageClassUniform;\n\t\tbool has_block_flags = ir.meta[type.self].decoration.decoration_flags.get(DecorationBlock) ||\n\t\t                       ir.meta[type.self].decoration.decoration_flags.get(DecorationBufferBlock);\n\n\t\tif (var.storage != StorageClassFunction && type.pointer && is_block_storage && !is_hidden_variable(var) &&\n\t\t    has_block_flags)\n\t\t{\n\t\t\temit_buffer_block(var);\n\t\t\temitted = true;\n\t\t}\n\t});\n\n\t// Output push constant blocks\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\tauto &type = this->get<SPIRType>(var.basetype);\n\t\tif (var.storage != StorageClassFunction && type.pointer && type.storage == StorageClassPushConstant &&\n\t\t    !is_hidden_variable(var))\n\t\t{\n\t\t\temit_push_constant_block(var);\n\t\t\temitted = true;\n\t\t}\n\t});\n\n\tif (execution.model == ExecutionModelVertex && hlsl_options.shader_model <= 30 &&\n\t    active_output_builtins.get(BuiltInPosition))\n\t{\n\t\tstatement(\"uniform float4 gl_HalfPixel;\");\n\t\temitted = true;\n\t}\n\n\tbool skip_separate_image_sampler = !combined_image_samplers.empty() || hlsl_options.shader_model <= 30;\n\n\t// Output Uniform Constants (values, samplers, images, etc).\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\tauto &type = this->get<SPIRType>(var.basetype);\n\n\t\t// If we're remapping separate samplers and images, only emit the combined samplers.\n\t\tif (skip_separate_image_sampler)\n\t\t{\n\t\t\t// Sampler buffers are always used without a sampler, and they will also work in regular D3D.\n\t\t\tbool sampler_buffer = type.basetype == SPIRType::Image && type.image.dim == DimBuffer;\n\t\t\tbool separate_image = type.basetype == SPIRType::Image && type.image.sampled == 1;\n\t\t\tbool separate_sampler = type.basetype == SPIRType::Sampler;\n\t\t\tif (!sampler_buffer && (separate_image || separate_sampler))\n\t\t\t\treturn;\n\t\t}\n\n\t\tif (var.storage != StorageClassFunction && !is_builtin_variable(var) && !var.remapped_variable &&\n\t\t    type.pointer && (type.storage == StorageClassUniformConstant || type.storage == StorageClassAtomicCounter) &&\n\t\t    !is_hidden_variable(var))\n\t\t{\n\t\t\temit_uniform(var);\n\t\t\temitted = true;\n\t\t}\n\t});\n\n\tif (emitted)\n\t\tstatement(\"\");\n\temitted = false;\n\n\t// Emit builtin input and output variables here.\n\temit_builtin_variables();\n\n\tif (execution.model != ExecutionModelMeshEXT)\n\t{\n\t\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\t\tauto &type = this->get<SPIRType>(var.basetype);\n\n\t\t\tif (var.storage != StorageClassFunction && !var.remapped_variable && type.pointer &&\n\t\t\t   (var.storage == StorageClassInput || var.storage == StorageClassOutput) && !is_builtin_variable(var) &&\n\t\t\t   interface_variable_exists_in_entry_point(var.self))\n\t\t\t{\n\t\t\t\t// Builtin variables are handled separately.\n\t\t\t\temit_interface_block_globally(var);\n\t\t\t\temitted = true;\n\t\t\t}\n\t\t});\n\t}\n\n\tif (emitted)\n\t\tstatement(\"\");\n\temitted = false;\n\n\trequire_input = false;\n\trequire_output = false;\n\tunordered_set<uint32_t> active_inputs;\n\tunordered_set<uint32_t> active_outputs;\n\n\tstruct IOVariable\n\t{\n\t\tconst SPIRVariable *var;\n\t\tuint32_t location;\n\t\tuint32_t block_member_index;\n\t\tbool block;\n\t};\n\n\tSmallVector<IOVariable> input_variables;\n\tSmallVector<IOVariable> output_variables;\n\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\tauto &type = this->get<SPIRType>(var.basetype);\n\t\tbool block = has_decoration(type.self, DecorationBlock);\n\n\t\tif (var.storage != StorageClassInput && var.storage != StorageClassOutput)\n\t\t\treturn;\n\n\t\tif (!var.remapped_variable && type.pointer && !is_builtin_variable(var) &&\n\t\t    interface_variable_exists_in_entry_point(var.self))\n\t\t{\n\t\t\tif (block)\n\t\t\t{\n\t\t\t\tfor (uint32_t i = 0; i < uint32_t(type.member_types.size()); i++)\n\t\t\t\t{\n\t\t\t\t\tuint32_t location = get_declared_member_location(var, i, false);\n\t\t\t\t\tif (var.storage == StorageClassInput)\n\t\t\t\t\t\tinput_variables.push_back({ &var, location, i, true });\n\t\t\t\t\telse\n\t\t\t\t\t\toutput_variables.push_back({ &var, location, i, true });\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tuint32_t location = get_decoration(var.self, DecorationLocation);\n\t\t\t\tif (var.storage == StorageClassInput)\n\t\t\t\t\tinput_variables.push_back({ &var, location, 0, false });\n\t\t\t\telse\n\t\t\t\t\toutput_variables.push_back({ &var, location, 0, false });\n\t\t\t}\n\t\t}\n\t});\n\n\tconst auto variable_compare = [&](const IOVariable &a, const IOVariable &b) -> bool {\n\t\t// Sort input and output variables based on, from more robust to less robust:\n\t\t// - Location\n\t\t// - Variable has a location\n\t\t// - Name comparison\n\t\t// - Variable has a name\n\t\t// - Fallback: ID\n\t\tbool has_location_a = a.block || has_decoration(a.var->self, DecorationLocation);\n\t\tbool has_location_b = b.block || has_decoration(b.var->self, DecorationLocation);\n\n\t\tif (has_location_a && has_location_b)\n\t\t\treturn a.location < b.location;\n\t\telse if (has_location_a && !has_location_b)\n\t\t\treturn true;\n\t\telse if (!has_location_a && has_location_b)\n\t\t\treturn false;\n\n\t\tconst auto &name1 = to_name(a.var->self);\n\t\tconst auto &name2 = to_name(b.var->self);\n\n\t\tif (name1.empty() && name2.empty())\n\t\t\treturn a.var->self < b.var->self;\n\t\telse if (name1.empty())\n\t\t\treturn true;\n\t\telse if (name2.empty())\n\t\t\treturn false;\n\n\t\treturn name1.compare(name2) < 0;\n\t};\n\n\tauto input_builtins = active_input_builtins;\n\tinput_builtins.clear(BuiltInNumWorkgroups);\n\tinput_builtins.clear(BuiltInPointCoord);\n\tinput_builtins.clear(BuiltInSubgroupSize);\n\tinput_builtins.clear(BuiltInSubgroupLocalInvocationId);\n\tinput_builtins.clear(BuiltInSubgroupEqMask);\n\tinput_builtins.clear(BuiltInSubgroupLtMask);\n\tinput_builtins.clear(BuiltInSubgroupLeMask);\n\tinput_builtins.clear(BuiltInSubgroupGtMask);\n\tinput_builtins.clear(BuiltInSubgroupGeMask);\n\n\tif (!input_variables.empty() || !input_builtins.empty())\n\t{\n\t\trequire_input = true;\n\t\tstatement(\"struct SPIRV_Cross_Input\");\n\n\t\tbegin_scope();\n\t\tsort(input_variables.begin(), input_variables.end(), variable_compare);\n\t\tfor (auto &var : input_variables)\n\t\t{\n\t\t\tif (var.block)\n\t\t\t\temit_interface_block_member_in_struct(*var.var, var.block_member_index, var.location, active_inputs);\n\t\t\telse\n\t\t\t\temit_interface_block_in_struct(*var.var, active_inputs);\n\t\t}\n\t\temit_builtin_inputs_in_struct();\n\t\tend_scope_decl();\n\t\tstatement(\"\");\n\t}\n\n\tconst bool is_mesh_shader = execution.model == ExecutionModelMeshEXT;\n\tif (!output_variables.empty() || !active_output_builtins.empty())\n\t{\n\t\tsort(output_variables.begin(), output_variables.end(), variable_compare);\n\t\trequire_output = !is_mesh_shader;\n\n\t\tstatement(is_mesh_shader ? \"struct gl_MeshPerVertexEXT\" : \"struct SPIRV_Cross_Output\");\n\t\tbegin_scope();\n\t\tfor (auto &var : output_variables)\n\t\t{\n\t\t\tif (is_per_primitive_variable(*var.var))\n\t\t\t\tcontinue;\n\t\t\tif (var.block && is_mesh_shader && var.block_member_index != 0)\n\t\t\t\tcontinue;\n\t\t\tif (var.block && !is_mesh_shader)\n\t\t\t\temit_interface_block_member_in_struct(*var.var, var.block_member_index, var.location, active_outputs);\n\t\t\telse\n\t\t\t\temit_interface_block_in_struct(*var.var, active_outputs);\n\t\t}\n\t\temit_builtin_outputs_in_struct();\n\t\tif (!is_mesh_shader)\n\t\t\temit_builtin_primitive_outputs_in_struct();\n\t\tend_scope_decl();\n\t\tstatement(\"\");\n\n\t\tif (is_mesh_shader)\n\t\t{\n\t\t\tstatement(\"struct gl_MeshPerPrimitiveEXT\");\n\t\t\tbegin_scope();\n\t\t\tfor (auto &var : output_variables)\n\t\t\t{\n\t\t\t\tif (!is_per_primitive_variable(*var.var))\n\t\t\t\t\tcontinue;\n\t\t\t\tif (var.block && var.block_member_index != 0)\n\t\t\t\t\tcontinue;\n\n\t\t\t\temit_interface_block_in_struct(*var.var, active_outputs);\n\t\t\t}\n\t\t\temit_builtin_primitive_outputs_in_struct();\n\t\t\tend_scope_decl();\n\t\t\tstatement(\"\");\n\t\t}\n\t}\n\n\t// Global variables.\n\tfor (auto global : global_variables)\n\t{\n\t\tauto &var = get<SPIRVariable>(global);\n\t\tif (is_hidden_variable(var, true))\n\t\t\tcontinue;\n\n\t\tif (var.storage == StorageClassTaskPayloadWorkgroupEXT && is_mesh_shader)\n\t\t\tcontinue;\n\n\t\tif (var.storage != StorageClassOutput)\n\t\t{\n\t\t\tif (!variable_is_lut(var))\n\t\t\t{\n\t\t\t\tadd_resource_name(var.self);\n\n\t\t\t\tconst char *storage = nullptr;\n\t\t\t\tswitch (var.storage)\n\t\t\t\t{\n\t\t\t\tcase StorageClassWorkgroup:\n\t\t\t\tcase StorageClassTaskPayloadWorkgroupEXT:\n\t\t\t\t\tstorage = \"groupshared\";\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tstorage = \"static\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tstring initializer;\n\t\t\t\tif (options.force_zero_initialized_variables && var.storage == StorageClassPrivate &&\n\t\t\t\t    !var.initializer && !var.static_expression && type_can_zero_initialize(get_variable_data_type(var)))\n\t\t\t\t{\n\t\t\t\t\tinitializer = join(\" = \", to_zero_initialized_expression(get_variable_data_type_id(var)));\n\t\t\t\t}\n\t\t\t\tstatement(storage, \" \", variable_decl(var), initializer, \";\");\n\n\t\t\t\temitted = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (emitted)\n\t\tstatement(\"\");\n\n\tif (requires_op_fmod)\n\t{\n\t\tstatic const char *types[] = {\n\t\t\t\"float\",\n\t\t\t\"float2\",\n\t\t\t\"float3\",\n\t\t\t\"float4\",\n\t\t};\n\n\t\tfor (auto &type : types)\n\t\t{\n\t\t\tstatement(type, \" mod(\", type, \" x, \", type, \" y)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return x - y * floor(x / y);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t}\n\t}\n\n\temit_texture_size_variants(required_texture_size_variants.srv, \"4\", false, \"\");\n\tfor (uint32_t norm = 0; norm < 3; norm++)\n\t{\n\t\tfor (uint32_t comp = 0; comp < 4; comp++)\n\t\t{\n\t\t\tstatic const char *qualifiers[] = { \"\", \"unorm \", \"snorm \" };\n\t\t\tstatic const char *vecsizes[] = { \"\", \"2\", \"3\", \"4\" };\n\t\t\temit_texture_size_variants(required_texture_size_variants.uav[norm][comp], vecsizes[comp], true,\n\t\t\t                           qualifiers[norm]);\n\t\t}\n\t}\n\n\tif (requires_fp16_packing)\n\t{\n\t\t// HLSL does not pack into a single word sadly :(\n\t\tstatement(\"uint spvPackHalf2x16(float2 value)\");\n\t\tbegin_scope();\n\t\tstatement(\"uint2 Packed = f32tof16(value);\");\n\t\tstatement(\"return Packed.x | (Packed.y << 16);\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\n\t\tstatement(\"float2 spvUnpackHalf2x16(uint value)\");\n\t\tbegin_scope();\n\t\tstatement(\"return f16tof32(uint2(value & 0xffff, value >> 16));\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n\n\tif (requires_uint2_packing)\n\t{\n\t\tstatement(\"uint64_t spvPackUint2x32(uint2 value)\");\n\t\tbegin_scope();\n\t\tstatement(\"return (uint64_t(value.y) << 32) | uint64_t(value.x);\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\n\t\tstatement(\"uint2 spvUnpackUint2x32(uint64_t value)\");\n\t\tbegin_scope();\n\t\tstatement(\"uint2 Unpacked;\");\n\t\tstatement(\"Unpacked.x = uint(value & 0xffffffff);\");\n\t\tstatement(\"Unpacked.y = uint(value >> 32);\");\n\t\tstatement(\"return Unpacked;\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n\n\tif (requires_explicit_fp16_packing)\n\t{\n\t\t// HLSL does not pack into a single word sadly :(\n\t\tstatement(\"uint spvPackFloat2x16(min16float2 value)\");\n\t\tbegin_scope();\n\t\tstatement(\"uint2 Packed = f32tof16(value);\");\n\t\tstatement(\"return Packed.x | (Packed.y << 16);\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\n\t\tstatement(\"min16float2 spvUnpackFloat2x16(uint value)\");\n\t\tbegin_scope();\n\t\tstatement(\"return min16float2(f16tof32(uint2(value & 0xffff, value >> 16)));\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n\n\t// HLSL does not seem to have builtins for these operation, so roll them by hand ...\n\tif (requires_unorm8_packing)\n\t{\n\t\tstatement(\"uint spvPackUnorm4x8(float4 value)\");\n\t\tbegin_scope();\n\t\tstatement(\"uint4 Packed = uint4(round(saturate(value) * 255.0));\");\n\t\tstatement(\"return Packed.x | (Packed.y << 8) | (Packed.z << 16) | (Packed.w << 24);\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\n\t\tstatement(\"float4 spvUnpackUnorm4x8(uint value)\");\n\t\tbegin_scope();\n\t\tstatement(\"uint4 Packed = uint4(value & 0xff, (value >> 8) & 0xff, (value >> 16) & 0xff, value >> 24);\");\n\t\tstatement(\"return float4(Packed) / 255.0;\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n\n\tif (requires_snorm8_packing)\n\t{\n\t\tstatement(\"uint spvPackSnorm4x8(float4 value)\");\n\t\tbegin_scope();\n\t\tstatement(\"int4 Packed = int4(round(clamp(value, -1.0, 1.0) * 127.0)) & 0xff;\");\n\t\tstatement(\"return uint(Packed.x | (Packed.y << 8) | (Packed.z << 16) | (Packed.w << 24));\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\n\t\tstatement(\"float4 spvUnpackSnorm4x8(uint value)\");\n\t\tbegin_scope();\n\t\tstatement(\"int SignedValue = int(value);\");\n\t\tstatement(\"int4 Packed = int4(SignedValue << 24, SignedValue << 16, SignedValue << 8, SignedValue) >> 24;\");\n\t\tstatement(\"return clamp(float4(Packed) / 127.0, -1.0, 1.0);\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n\n\tif (requires_unorm16_packing)\n\t{\n\t\tstatement(\"uint spvPackUnorm2x16(float2 value)\");\n\t\tbegin_scope();\n\t\tstatement(\"uint2 Packed = uint2(round(saturate(value) * 65535.0));\");\n\t\tstatement(\"return Packed.x | (Packed.y << 16);\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\n\t\tstatement(\"float2 spvUnpackUnorm2x16(uint value)\");\n\t\tbegin_scope();\n\t\tstatement(\"uint2 Packed = uint2(value & 0xffff, value >> 16);\");\n\t\tstatement(\"return float2(Packed) / 65535.0;\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n\n\tif (requires_snorm16_packing)\n\t{\n\t\tstatement(\"uint spvPackSnorm2x16(float2 value)\");\n\t\tbegin_scope();\n\t\tstatement(\"int2 Packed = int2(round(clamp(value, -1.0, 1.0) * 32767.0)) & 0xffff;\");\n\t\tstatement(\"return uint(Packed.x | (Packed.y << 16));\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\n\t\tstatement(\"float2 spvUnpackSnorm2x16(uint value)\");\n\t\tbegin_scope();\n\t\tstatement(\"int SignedValue = int(value);\");\n\t\tstatement(\"int2 Packed = int2(SignedValue << 16, SignedValue) >> 16;\");\n\t\tstatement(\"return clamp(float2(Packed) / 32767.0, -1.0, 1.0);\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n\n\tif (requires_bitfield_insert)\n\t{\n\t\tstatic const char *types[] = { \"uint\", \"uint2\", \"uint3\", \"uint4\" };\n\t\tfor (auto &type : types)\n\t\t{\n\t\t\tstatement(type, \" spvBitfieldInsert(\", type, \" Base, \", type, \" Insert, uint Offset, uint Count)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"uint Mask = Count == 32 ? 0xffffffff : (((1u << Count) - 1) << (Offset & 31));\");\n\t\t\tstatement(\"return (Base & ~Mask) | ((Insert << Offset) & Mask);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t}\n\t}\n\n\tif (requires_bitfield_extract)\n\t{\n\t\tstatic const char *unsigned_types[] = { \"uint\", \"uint2\", \"uint3\", \"uint4\" };\n\t\tfor (auto &type : unsigned_types)\n\t\t{\n\t\t\tstatement(type, \" spvBitfieldUExtract(\", type, \" Base, uint Offset, uint Count)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"uint Mask = Count == 32 ? 0xffffffff : ((1 << Count) - 1);\");\n\t\t\tstatement(\"return (Base >> Offset) & Mask;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t}\n\n\t\t// In this overload, we will have to do sign-extension, which we will emulate by shifting up and down.\n\t\tstatic const char *signed_types[] = { \"int\", \"int2\", \"int3\", \"int4\" };\n\t\tfor (auto &type : signed_types)\n\t\t{\n\t\t\tstatement(type, \" spvBitfieldSExtract(\", type, \" Base, int Offset, int Count)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"int Mask = Count == 32 ? -1 : ((1 << Count) - 1);\");\n\t\t\tstatement(type, \" Masked = (Base >> Offset) & Mask;\");\n\t\t\tstatement(\"int ExtendShift = (32 - Count) & 31;\");\n\t\t\tstatement(\"return (Masked << ExtendShift) >> ExtendShift;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t}\n\t}\n\n\tif (requires_inverse_2x2)\n\t{\n\t\tstatement(\"// Returns the inverse of a matrix, by using the algorithm of calculating the classical\");\n\t\tstatement(\"// adjoint and dividing by the determinant. The contents of the matrix are changed.\");\n\t\tstatement(\"float2x2 spvInverse(float2x2 m)\");\n\t\tbegin_scope();\n\t\tstatement(\"float2x2 adj;\t// The adjoint matrix (inverse after dividing by determinant)\");\n\t\tstatement_no_indent(\"\");\n\t\tstatement(\"// Create the transpose of the cofactors, as the classical adjoint of the matrix.\");\n\t\tstatement(\"adj[0][0] =  m[1][1];\");\n\t\tstatement(\"adj[0][1] = -m[0][1];\");\n\t\tstatement_no_indent(\"\");\n\t\tstatement(\"adj[1][0] = -m[1][0];\");\n\t\tstatement(\"adj[1][1] =  m[0][0];\");\n\t\tstatement_no_indent(\"\");\n\t\tstatement(\"// Calculate the determinant as a combination of the cofactors of the first row.\");\n\t\tstatement(\"float det = (adj[0][0] * m[0][0]) + (adj[0][1] * m[1][0]);\");\n\t\tstatement_no_indent(\"\");\n\t\tstatement(\"// Divide the classical adjoint matrix by the determinant.\");\n\t\tstatement(\"// If determinant is zero, matrix is not invertable, so leave it unchanged.\");\n\t\tstatement(\"return (det != 0.0f) ? (adj * (1.0f / det)) : m;\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n\n\tif (requires_inverse_3x3)\n\t{\n\t\tstatement(\"// Returns the determinant of a 2x2 matrix.\");\n\t\tstatement(\"float spvDet2x2(float a1, float a2, float b1, float b2)\");\n\t\tbegin_scope();\n\t\tstatement(\"return a1 * b2 - b1 * a2;\");\n\t\tend_scope();\n\t\tstatement_no_indent(\"\");\n\t\tstatement(\"// Returns the inverse of a matrix, by using the algorithm of calculating the classical\");\n\t\tstatement(\"// adjoint and dividing by the determinant. The contents of the matrix are changed.\");\n\t\tstatement(\"float3x3 spvInverse(float3x3 m)\");\n\t\tbegin_scope();\n\t\tstatement(\"float3x3 adj;\t// The adjoint matrix (inverse after dividing by determinant)\");\n\t\tstatement_no_indent(\"\");\n\t\tstatement(\"// Create the transpose of the cofactors, as the classical adjoint of the matrix.\");\n\t\tstatement(\"adj[0][0] =  spvDet2x2(m[1][1], m[1][2], m[2][1], m[2][2]);\");\n\t\tstatement(\"adj[0][1] = -spvDet2x2(m[0][1], m[0][2], m[2][1], m[2][2]);\");\n\t\tstatement(\"adj[0][2] =  spvDet2x2(m[0][1], m[0][2], m[1][1], m[1][2]);\");\n\t\tstatement_no_indent(\"\");\n\t\tstatement(\"adj[1][0] = -spvDet2x2(m[1][0], m[1][2], m[2][0], m[2][2]);\");\n\t\tstatement(\"adj[1][1] =  spvDet2x2(m[0][0], m[0][2], m[2][0], m[2][2]);\");\n\t\tstatement(\"adj[1][2] = -spvDet2x2(m[0][0], m[0][2], m[1][0], m[1][2]);\");\n\t\tstatement_no_indent(\"\");\n\t\tstatement(\"adj[2][0] =  spvDet2x2(m[1][0], m[1][1], m[2][0], m[2][1]);\");\n\t\tstatement(\"adj[2][1] = -spvDet2x2(m[0][0], m[0][1], m[2][0], m[2][1]);\");\n\t\tstatement(\"adj[2][2] =  spvDet2x2(m[0][0], m[0][1], m[1][0], m[1][1]);\");\n\t\tstatement_no_indent(\"\");\n\t\tstatement(\"// Calculate the determinant as a combination of the cofactors of the first row.\");\n\t\tstatement(\"float det = (adj[0][0] * m[0][0]) + (adj[0][1] * m[1][0]) + (adj[0][2] * m[2][0]);\");\n\t\tstatement_no_indent(\"\");\n\t\tstatement(\"// Divide the classical adjoint matrix by the determinant.\");\n\t\tstatement(\"// If determinant is zero, matrix is not invertable, so leave it unchanged.\");\n\t\tstatement(\"return (det != 0.0f) ? (adj * (1.0f / det)) : m;\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n\n\tif (requires_inverse_4x4)\n\t{\n\t\tif (!requires_inverse_3x3)\n\t\t{\n\t\t\tstatement(\"// Returns the determinant of a 2x2 matrix.\");\n\t\t\tstatement(\"float spvDet2x2(float a1, float a2, float b1, float b2)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return a1 * b2 - b1 * a2;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t}\n\n\t\tstatement(\"// Returns the determinant of a 3x3 matrix.\");\n\t\tstatement(\"float spvDet3x3(float a1, float a2, float a3, float b1, float b2, float b3, float c1, \"\n\t\t          \"float c2, float c3)\");\n\t\tbegin_scope();\n\t\tstatement(\"return a1 * spvDet2x2(b2, b3, c2, c3) - b1 * spvDet2x2(a2, a3, c2, c3) + c1 * \"\n\t\t          \"spvDet2x2(a2, a3, \"\n\t\t          \"b2, b3);\");\n\t\tend_scope();\n\t\tstatement_no_indent(\"\");\n\t\tstatement(\"// Returns the inverse of a matrix, by using the algorithm of calculating the classical\");\n\t\tstatement(\"// adjoint and dividing by the determinant. The contents of the matrix are changed.\");\n\t\tstatement(\"float4x4 spvInverse(float4x4 m)\");\n\t\tbegin_scope();\n\t\tstatement(\"float4x4 adj;\t// The adjoint matrix (inverse after dividing by determinant)\");\n\t\tstatement_no_indent(\"\");\n\t\tstatement(\"// Create the transpose of the cofactors, as the classical adjoint of the matrix.\");\n\t\tstatement(\n\t\t    \"adj[0][0] =  spvDet3x3(m[1][1], m[1][2], m[1][3], m[2][1], m[2][2], m[2][3], m[3][1], m[3][2], \"\n\t\t    \"m[3][3]);\");\n\t\tstatement(\n\t\t    \"adj[0][1] = -spvDet3x3(m[0][1], m[0][2], m[0][3], m[2][1], m[2][2], m[2][3], m[3][1], m[3][2], \"\n\t\t    \"m[3][3]);\");\n\t\tstatement(\n\t\t    \"adj[0][2] =  spvDet3x3(m[0][1], m[0][2], m[0][3], m[1][1], m[1][2], m[1][3], m[3][1], m[3][2], \"\n\t\t    \"m[3][3]);\");\n\t\tstatement(\n\t\t    \"adj[0][3] = -spvDet3x3(m[0][1], m[0][2], m[0][3], m[1][1], m[1][2], m[1][3], m[2][1], m[2][2], \"\n\t\t    \"m[2][3]);\");\n\t\tstatement_no_indent(\"\");\n\t\tstatement(\n\t\t    \"adj[1][0] = -spvDet3x3(m[1][0], m[1][2], m[1][3], m[2][0], m[2][2], m[2][3], m[3][0], m[3][2], \"\n\t\t    \"m[3][3]);\");\n\t\tstatement(\n\t\t    \"adj[1][1] =  spvDet3x3(m[0][0], m[0][2], m[0][3], m[2][0], m[2][2], m[2][3], m[3][0], m[3][2], \"\n\t\t    \"m[3][3]);\");\n\t\tstatement(\n\t\t    \"adj[1][2] = -spvDet3x3(m[0][0], m[0][2], m[0][3], m[1][0], m[1][2], m[1][3], m[3][0], m[3][2], \"\n\t\t    \"m[3][3]);\");\n\t\tstatement(\n\t\t    \"adj[1][3] =  spvDet3x3(m[0][0], m[0][2], m[0][3], m[1][0], m[1][2], m[1][3], m[2][0], m[2][2], \"\n\t\t    \"m[2][3]);\");\n\t\tstatement_no_indent(\"\");\n\t\tstatement(\n\t\t    \"adj[2][0] =  spvDet3x3(m[1][0], m[1][1], m[1][3], m[2][0], m[2][1], m[2][3], m[3][0], m[3][1], \"\n\t\t    \"m[3][3]);\");\n\t\tstatement(\n\t\t    \"adj[2][1] = -spvDet3x3(m[0][0], m[0][1], m[0][3], m[2][0], m[2][1], m[2][3], m[3][0], m[3][1], \"\n\t\t    \"m[3][3]);\");\n\t\tstatement(\n\t\t    \"adj[2][2] =  spvDet3x3(m[0][0], m[0][1], m[0][3], m[1][0], m[1][1], m[1][3], m[3][0], m[3][1], \"\n\t\t    \"m[3][3]);\");\n\t\tstatement(\n\t\t    \"adj[2][3] = -spvDet3x3(m[0][0], m[0][1], m[0][3], m[1][0], m[1][1], m[1][3], m[2][0], m[2][1], \"\n\t\t    \"m[2][3]);\");\n\t\tstatement_no_indent(\"\");\n\t\tstatement(\n\t\t    \"adj[3][0] = -spvDet3x3(m[1][0], m[1][1], m[1][2], m[2][0], m[2][1], m[2][2], m[3][0], m[3][1], \"\n\t\t    \"m[3][2]);\");\n\t\tstatement(\n\t\t    \"adj[3][1] =  spvDet3x3(m[0][0], m[0][1], m[0][2], m[2][0], m[2][1], m[2][2], m[3][0], m[3][1], \"\n\t\t    \"m[3][2]);\");\n\t\tstatement(\n\t\t    \"adj[3][2] = -spvDet3x3(m[0][0], m[0][1], m[0][2], m[1][0], m[1][1], m[1][2], m[3][0], m[3][1], \"\n\t\t    \"m[3][2]);\");\n\t\tstatement(\n\t\t    \"adj[3][3] =  spvDet3x3(m[0][0], m[0][1], m[0][2], m[1][0], m[1][1], m[1][2], m[2][0], m[2][1], \"\n\t\t    \"m[2][2]);\");\n\t\tstatement_no_indent(\"\");\n\t\tstatement(\"// Calculate the determinant as a combination of the cofactors of the first row.\");\n\t\tstatement(\"float det = (adj[0][0] * m[0][0]) + (adj[0][1] * m[1][0]) + (adj[0][2] * m[2][0]) + (adj[0][3] \"\n\t\t          \"* m[3][0]);\");\n\t\tstatement_no_indent(\"\");\n\t\tstatement(\"// Divide the classical adjoint matrix by the determinant.\");\n\t\tstatement(\"// If determinant is zero, matrix is not invertable, so leave it unchanged.\");\n\t\tstatement(\"return (det != 0.0f) ? (adj * (1.0f / det)) : m;\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n\n\tif (requires_scalar_reflect)\n\t{\n\t\t// FP16/FP64? No templates in HLSL.\n\t\tstatement(\"float spvReflect(float i, float n)\");\n\t\tbegin_scope();\n\t\tstatement(\"return i - 2.0 * dot(n, i) * n;\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n\n\tif (requires_scalar_refract)\n\t{\n\t\t// FP16/FP64? No templates in HLSL.\n\t\tstatement(\"float spvRefract(float i, float n, float eta)\");\n\t\tbegin_scope();\n\t\tstatement(\"float NoI = n * i;\");\n\t\tstatement(\"float NoI2 = NoI * NoI;\");\n\t\tstatement(\"float k = 1.0 - eta * eta * (1.0 - NoI2);\");\n\t\tstatement(\"if (k < 0.0)\");\n\t\tbegin_scope();\n\t\tstatement(\"return 0.0;\");\n\t\tend_scope();\n\t\tstatement(\"else\");\n\t\tbegin_scope();\n\t\tstatement(\"return eta * i - (eta * NoI + sqrt(k)) * n;\");\n\t\tend_scope();\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n\n\tif (requires_scalar_faceforward)\n\t{\n\t\t// FP16/FP64? No templates in HLSL.\n\t\tstatement(\"float spvFaceForward(float n, float i, float nref)\");\n\t\tbegin_scope();\n\t\tstatement(\"return i * nref < 0.0 ? n : -n;\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n\n\tfor (TypeID type_id : composite_selection_workaround_types)\n\t{\n\t\t// Need out variable since HLSL does not support returning arrays.\n\t\tauto &type = get<SPIRType>(type_id);\n\t\tauto type_str = type_to_glsl(type);\n\t\tauto type_arr_str = type_to_array_glsl(type);\n\t\tstatement(\"void spvSelectComposite(out \", type_str, \" out_value\", type_arr_str, \", bool cond, \",\n\t\t          type_str, \" true_val\", type_arr_str, \", \",\n\t\t          type_str, \" false_val\", type_arr_str, \")\");\n\t\tbegin_scope();\n\t\tstatement(\"if (cond)\");\n\t\tbegin_scope();\n\t\tstatement(\"out_value = true_val;\");\n\t\tend_scope();\n\t\tstatement(\"else\");\n\t\tbegin_scope();\n\t\tstatement(\"out_value = false_val;\");\n\t\tend_scope();\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n\n\tif (is_mesh_shader && options.vertex.flip_vert_y)\n\t{\n\t\tstatement(\"float4 spvFlipVertY(float4 v)\");\n\t\tbegin_scope();\n\t\tstatement(\"return float4(v.x, -v.y, v.z, v.w);\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\t\tstatement(\"float spvFlipVertY(float v)\");\n\t\tbegin_scope();\n\t\tstatement(\"return -v;\");\n\t\tend_scope();\n\t\tstatement(\"\");\n\t}\n}\n\nvoid CompilerHLSL::emit_texture_size_variants(uint64_t variant_mask, const char *vecsize_qualifier, bool uav,\n                                              const char *type_qualifier)\n{\n\tif (variant_mask == 0)\n\t\treturn;\n\n\tstatic const char *types[QueryTypeCount] = { \"float\", \"int\", \"uint\" };\n\tstatic const char *dims[QueryDimCount] = { \"Texture1D\",   \"Texture1DArray\",  \"Texture2D\",   \"Texture2DArray\",\n\t\t                                       \"Texture3D\",   \"Buffer\",          \"TextureCube\", \"TextureCubeArray\",\n\t\t                                       \"Texture2DMS\", \"Texture2DMSArray\" };\n\n\tstatic const bool has_lod[QueryDimCount] = { true, true, true, true, true, false, true, true, false, false };\n\n\tstatic const char *ret_types[QueryDimCount] = {\n\t\t\"uint\", \"uint2\", \"uint2\", \"uint3\", \"uint3\", \"uint\", \"uint2\", \"uint3\", \"uint2\", \"uint3\",\n\t};\n\n\tstatic const uint32_t return_arguments[QueryDimCount] = {\n\t\t1, 2, 2, 3, 3, 1, 2, 3, 2, 3,\n\t};\n\n\tfor (uint32_t index = 0; index < QueryDimCount; index++)\n\t{\n\t\tfor (uint32_t type_index = 0; type_index < QueryTypeCount; type_index++)\n\t\t{\n\t\t\tuint32_t bit = 16 * type_index + index;\n\t\t\tuint64_t mask = 1ull << bit;\n\n\t\t\tif ((variant_mask & mask) == 0)\n\t\t\t\tcontinue;\n\n\t\t\tstatement(ret_types[index], \" spv\", (uav ? \"Image\" : \"Texture\"), \"Size(\", (uav ? \"RW\" : \"\"),\n\t\t\t          dims[index], \"<\", type_qualifier, types[type_index], vecsize_qualifier, \"> Tex, \",\n\t\t\t          (uav ? \"\" : \"uint Level, \"), \"out uint Param)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(ret_types[index], \" ret;\");\n\t\t\tswitch (return_arguments[index])\n\t\t\t{\n\t\t\tcase 1:\n\t\t\t\tif (has_lod[index] && !uav)\n\t\t\t\t\tstatement(\"Tex.GetDimensions(Level, ret.x, Param);\");\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tstatement(\"Tex.GetDimensions(ret.x);\");\n\t\t\t\t\tstatement(\"Param = 0u;\");\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tif (has_lod[index] && !uav)\n\t\t\t\t\tstatement(\"Tex.GetDimensions(Level, ret.x, ret.y, Param);\");\n\t\t\t\telse if (!uav)\n\t\t\t\t\tstatement(\"Tex.GetDimensions(ret.x, ret.y, Param);\");\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tstatement(\"Tex.GetDimensions(ret.x, ret.y);\");\n\t\t\t\t\tstatement(\"Param = 0u;\");\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tif (has_lod[index] && !uav)\n\t\t\t\t\tstatement(\"Tex.GetDimensions(Level, ret.x, ret.y, ret.z, Param);\");\n\t\t\t\telse if (!uav)\n\t\t\t\t\tstatement(\"Tex.GetDimensions(ret.x, ret.y, ret.z, Param);\");\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tstatement(\"Tex.GetDimensions(ret.x, ret.y, ret.z);\");\n\t\t\t\t\tstatement(\"Param = 0u;\");\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tstatement(\"return ret;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t}\n\t}\n}\n\nvoid CompilerHLSL::analyze_meshlet_writes()\n{\n\tuint32_t id_per_vertex = 0;\n\tuint32_t id_per_primitive = 0;\n\tbool need_per_primitive = false;\n\tbool need_per_vertex = false;\n\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\tauto &type = this->get<SPIRType>(var.basetype);\n\t\tbool block = has_decoration(type.self, DecorationBlock);\n\t\tif (var.storage == StorageClassOutput && block && is_builtin_variable(var))\n\t\t{\n\t\t\tauto flags = get_buffer_block_flags(var.self);\n\t\t\tif (flags.get(DecorationPerPrimitiveEXT))\n\t\t\t\tid_per_primitive = var.self;\n\t\t\telse\n\t\t\t\tid_per_vertex = var.self;\n\t\t}\n\t\telse if (var.storage == StorageClassOutput)\n\t\t{\n\t\t\tBitset flags;\n\t\t\tif (block)\n\t\t\t\tflags = get_buffer_block_flags(var.self);\n\t\t\telse\n\t\t\t\tflags = get_decoration_bitset(var.self);\n\n\t\t\tif (flags.get(DecorationPerPrimitiveEXT))\n\t\t\t\tneed_per_primitive = true;\n\t\t\telse\n\t\t\t\tneed_per_vertex = true;\n\t\t}\n\t});\n\n\t// If we have per-primitive outputs, and no per-primitive builtins,\n\t// empty version of gl_MeshPerPrimitiveEXT will be emitted.\n\t// If we don't use block IO for vertex output, we'll also need to synthesize the PerVertex block.\n\n\tconst auto generate_block = [&](const char *block_name, const char *instance_name, bool per_primitive) -> uint32_t {\n\t\tauto &execution = get_entry_point();\n\n\t\tuint32_t op_type = ir.increase_bound_by(4);\n\t\tuint32_t op_arr = op_type + 1;\n\t\tuint32_t op_ptr = op_type + 2;\n\t\tuint32_t op_var = op_type + 3;\n\n\t\tauto &type = set<SPIRType>(op_type, OpTypeStruct);\n\t\ttype.basetype = SPIRType::Struct;\n\t\tset_name(op_type, block_name);\n\t\tset_decoration(op_type, DecorationBlock);\n\t\tif (per_primitive)\n\t\t\tset_decoration(op_type, DecorationPerPrimitiveEXT);\n\n\t\tauto &arr = set<SPIRType>(op_arr, type);\n\t\tarr.parent_type = type.self;\n\t\tarr.array.push_back(per_primitive ? execution.output_primitives : execution.output_vertices);\n\t\tarr.array_size_literal.push_back(true);\n\n\t\tauto &ptr = set<SPIRType>(op_ptr, arr);\n\t\tptr.parent_type = arr.self;\n\t\tptr.pointer = true;\n\t\tptr.pointer_depth++;\n\t\tptr.storage = StorageClassOutput;\n\t\tset_decoration(op_ptr, DecorationBlock);\n\t\tset_name(op_ptr, block_name);\n\n\t\tauto &var = set<SPIRVariable>(op_var, op_ptr, StorageClassOutput);\n\t\tif (per_primitive)\n\t\t\tset_decoration(op_var, DecorationPerPrimitiveEXT);\n\t\tset_name(op_var, instance_name);\n\t\texecution.interface_variables.push_back(var.self);\n\n\t\treturn op_var;\n\t};\n\n\tif (id_per_vertex == 0 && need_per_vertex)\n\t\tid_per_vertex = generate_block(\"gl_MeshPerVertexEXT\", \"gl_MeshVerticesEXT\", false);\n\tif (id_per_primitive == 0 && need_per_primitive)\n\t\tid_per_primitive = generate_block(\"gl_MeshPerPrimitiveEXT\", \"gl_MeshPrimitivesEXT\", true);\n\n\tunordered_set<uint32_t> processed_func_ids;\n\tanalyze_meshlet_writes(ir.default_entry_point, id_per_vertex, id_per_primitive, processed_func_ids);\n}\n\nvoid CompilerHLSL::analyze_meshlet_writes(uint32_t func_id, uint32_t id_per_vertex, uint32_t id_per_primitive,\n                                          std::unordered_set<uint32_t> &processed_func_ids)\n{\n\t// Avoid processing a function more than once\n\tif (processed_func_ids.find(func_id) != processed_func_ids.end())\n\t\treturn;\n\tprocessed_func_ids.insert(func_id);\n\n\tauto &func = get<SPIRFunction>(func_id);\n\t// Recursively establish global args added to functions on which we depend.\n\tfor (auto& block : func.blocks)\n\t{\n\t\tauto &b = get<SPIRBlock>(block);\n\t\tfor (auto &i : b.ops)\n\t\t{\n\t\t\tauto ops = stream(i);\n\t\t\tauto op = static_cast<Op>(i.op);\n\n\t\t\tswitch (op)\n\t\t\t{\n\t\t\tcase OpFunctionCall:\n\t\t\t{\n\t\t\t\t// Then recurse into the function itself to extract globals used internally in the function\n\t\t\t\tuint32_t inner_func_id = ops[2];\n\t\t\t\tanalyze_meshlet_writes(inner_func_id, id_per_vertex, id_per_primitive, processed_func_ids);\n\t\t\t\tauto &inner_func = get<SPIRFunction>(inner_func_id);\n\t\t\t\tfor (auto &iarg : inner_func.arguments)\n\t\t\t\t{\n\t\t\t\t\tif (!iarg.alias_global_variable)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tbool already_declared = false;\n\t\t\t\t\tfor (auto &arg : func.arguments)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (arg.id == iarg.id)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\talready_declared = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!already_declared)\n\t\t\t\t\t{\n\t\t\t\t\t\t// basetype is effectively ignored here since we declare the argument\n\t\t\t\t\t\t// with explicit types. Just pass down a valid type.\n\t\t\t\t\t\tfunc.arguments.push_back({ expression_type_id(iarg.id), iarg.id,\n\t\t\t\t\t\t                           iarg.read_count, iarg.write_count, true });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase OpStore:\n\t\t\tcase OpLoad:\n\t\t\tcase OpInBoundsAccessChain:\n\t\t\tcase OpAccessChain:\n\t\t\tcase OpPtrAccessChain:\n\t\t\tcase OpInBoundsPtrAccessChain:\n\t\t\tcase OpArrayLength:\n\t\t\t{\n\t\t\t\tauto *var = maybe_get<SPIRVariable>(ops[op == OpStore ? 0 : 2]);\n\t\t\t\tif (var && (var->storage == StorageClassOutput || var->storage == StorageClassTaskPayloadWorkgroupEXT))\n\t\t\t\t{\n\t\t\t\t\tbool already_declared = false;\n\t\t\t\t\tauto builtin_type = BuiltIn(get_decoration(var->self, DecorationBuiltIn));\n\n\t\t\t\t\tuint32_t var_id = var->self;\n\t\t\t\t\tif (var->storage != StorageClassTaskPayloadWorkgroupEXT &&\n\t\t\t\t\t\tbuiltin_type != BuiltInPrimitivePointIndicesEXT &&\n\t\t\t\t\t\tbuiltin_type != BuiltInPrimitiveLineIndicesEXT &&\n\t\t\t\t\t\tbuiltin_type != BuiltInPrimitiveTriangleIndicesEXT)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar_id = is_per_primitive_variable(*var) ? id_per_primitive : id_per_vertex;\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (auto &arg : func.arguments)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (arg.id == var_id)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\talready_declared = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!already_declared)\n\t\t\t\t\t{\n\t\t\t\t\t\t// basetype is effectively ignored here since we declare the argument\n\t\t\t\t\t\t// with explicit types. Just pass down a valid type.\n\t\t\t\t\t\tuint32_t type_id = expression_type_id(var_id);\n\t\t\t\t\t\tif (var->storage == StorageClassTaskPayloadWorkgroupEXT)\n\t\t\t\t\t\t\tfunc.arguments.push_back({ type_id, var_id, 1u, 0u, true });\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tfunc.arguments.push_back({ type_id, var_id, 1u, 1u, true });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\nstring CompilerHLSL::layout_for_member(const SPIRType &type, uint32_t index)\n{\n\tauto &flags = get_member_decoration_bitset(type.self, index);\n\n\t// HLSL can emit row_major or column_major decoration in any struct.\n\t// Do not try to merge combined decorations for children like in GLSL.\n\n\t// Flip the convention. HLSL is a bit odd in that the memory layout is column major ... but the language API is \"row-major\".\n\t// The way to deal with this is to multiply everything in inverse order, and reverse the memory layout.\n\tif (flags.get(DecorationColMajor))\n\t\treturn \"row_major \";\n\telse if (flags.get(DecorationRowMajor))\n\t\treturn \"column_major \";\n\n\treturn \"\";\n}\n\nvoid CompilerHLSL::emit_struct_member(const SPIRType &type, uint32_t member_type_id, uint32_t index,\n                                      const string &qualifier, uint32_t base_offset)\n{\n\tauto &membertype = get<SPIRType>(member_type_id);\n\n\tBitset memberflags;\n\tauto &memb = ir.meta[type.self].members;\n\tif (index < memb.size())\n\t\tmemberflags = memb[index].decoration_flags;\n\n\tstring packing_offset;\n\tbool is_push_constant = type.storage == StorageClassPushConstant;\n\n\tif ((has_extended_decoration(type.self, SPIRVCrossDecorationExplicitOffset) || is_push_constant) &&\n\t    has_member_decoration(type.self, index, DecorationOffset))\n\t{\n\t\tuint32_t offset = memb[index].offset - base_offset;\n\t\tif (offset & 3)\n\t\t\tSPIRV_CROSS_THROW(\"Cannot pack on tighter bounds than 4 bytes in HLSL.\");\n\n\t\tstatic const char *packing_swizzle[] = { \"\", \".y\", \".z\", \".w\" };\n\t\tpacking_offset = join(\" : packoffset(c\", offset / 16, packing_swizzle[(offset & 15) >> 2], \")\");\n\t}\n\n\tstatement(layout_for_member(type, index), qualifier,\n\t          variable_decl(membertype, to_member_name(type, index)), packing_offset, \";\");\n}\n\nvoid CompilerHLSL::emit_rayquery_function(const char *commited, const char *candidate, const uint32_t *ops)\n{\n\tflush_variable_declaration(ops[0]);\n\tuint32_t is_commited = evaluate_constant_u32(ops[3]);\n\temit_op(ops[0], ops[1], join(to_expression(ops[2]), is_commited ? commited : candidate), false);\n}\n\nvoid CompilerHLSL::emit_mesh_tasks(SPIRBlock &block)\n{\n\tif (block.mesh.payload != 0)\n\t{\n\t\tstatement(\"DispatchMesh(\", to_unpacked_expression(block.mesh.groups[0]), \", \", to_unpacked_expression(block.mesh.groups[1]), \", \",\n\t\t    to_unpacked_expression(block.mesh.groups[2]), \", \", to_unpacked_expression(block.mesh.payload), \");\");\n\t}\n\telse\n\t{\n\t\tSPIRV_CROSS_THROW(\"Amplification shader in HLSL must have payload\");\n\t}\n}\n\nvoid CompilerHLSL::emit_buffer_block(const SPIRVariable &var)\n{\n\tauto &type = get<SPIRType>(var.basetype);\n\n\tbool is_uav = var.storage == StorageClassStorageBuffer || has_decoration(type.self, DecorationBufferBlock);\n\n\tif (flattened_buffer_blocks.count(var.self))\n\t{\n\t\temit_buffer_block_flattened(var);\n\t}\n\telse if (is_uav)\n\t{\n\t\tBitset flags = ir.get_buffer_block_flags(var);\n\t\tbool is_readonly = flags.get(DecorationNonWritable) && !is_hlsl_force_storage_buffer_as_uav(var.self);\n\t\tbool is_coherent = flags.get(DecorationCoherent) && !is_readonly;\n\t\tbool is_interlocked = interlocked_resources.count(var.self) > 0;\n\n\t\tauto to_structuredbuffer_subtype_name = [this](const SPIRType &parent_type) -> std::string\n\t\t{\n\t\t\tif (parent_type.basetype == SPIRType::Struct && parent_type.member_types.size() == 1)\n\t\t\t{\n\t\t\t\t// Use type of first struct member as a StructuredBuffer will have only one '._m0' field in SPIR-V\n\t\t\t\tconst auto &member0_type = this->get<SPIRType>(parent_type.member_types.front());\n\t\t\t\treturn this->type_to_glsl(member0_type);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Otherwise, this StructuredBuffer only has a basic subtype, e.g. StructuredBuffer<int>\n\t\t\t\treturn this->type_to_glsl(parent_type);\n\t\t\t}\n\t\t};\n\n\t\tstd::string type_name;\n\t\tif (is_user_type_structured(var.self))\n\t\t\ttype_name = join(is_readonly ? \"\" : is_interlocked ? \"RasterizerOrdered\" : \"RW\", \"StructuredBuffer<\", to_structuredbuffer_subtype_name(type), \">\");\n\t\telse\n\t\t\ttype_name = is_readonly ? \"ByteAddressBuffer\" : is_interlocked ? \"RasterizerOrderedByteAddressBuffer\" : \"RWByteAddressBuffer\";\n\n\t\tadd_resource_name(var.self);\n\t\tstatement(is_coherent ? \"globallycoherent \" : \"\", type_name, \" \", to_name(var.self), type_to_array_glsl(type),\n\t\t          to_resource_binding(var), \";\");\n\t}\n\telse\n\t{\n\t\tif (type.array.empty())\n\t\t{\n\t\t\t// Flatten the top-level struct so we can use packoffset,\n\t\t\t// this restriction is similar to GLSL where layout(offset) is not possible on sub-structs.\n\t\t\tflattened_structs[var.self] = false;\n\n\t\t\t// Prefer the block name if possible.\n\t\t\tauto buffer_name = to_name(type.self, false);\n\t\t\tif (ir.meta[type.self].decoration.alias.empty() ||\n\t\t\t    resource_names.find(buffer_name) != end(resource_names) ||\n\t\t\t    block_names.find(buffer_name) != end(block_names))\n\t\t\t{\n\t\t\t\tbuffer_name = get_block_fallback_name(var.self);\n\t\t\t}\n\n\t\t\tadd_variable(block_names, resource_names, buffer_name);\n\n\t\t\t// If for some reason buffer_name is an illegal name, make a final fallback to a workaround name.\n\t\t\t// This cannot conflict with anything else, so we're safe now.\n\t\t\tif (buffer_name.empty())\n\t\t\t\tbuffer_name = join(\"_\", get<SPIRType>(var.basetype).self, \"_\", var.self);\n\n\t\t\tuint32_t failed_index = 0;\n\t\t\tif (buffer_is_packing_standard(type, BufferPackingHLSLCbufferPackOffset, &failed_index))\n\t\t\t\tset_extended_decoration(type.self, SPIRVCrossDecorationExplicitOffset);\n\t\t\telse\n\t\t\t{\n\t\t\t\tSPIRV_CROSS_THROW(join(\"cbuffer ID \", var.self, \" (name: \", buffer_name, \"), member index \",\n\t\t\t\t                       failed_index, \" (name: \", to_member_name(type, failed_index),\n\t\t\t\t                       \") cannot be expressed with either HLSL packing layout or packoffset.\"));\n\t\t\t}\n\n\t\t\tblock_names.insert(buffer_name);\n\n\t\t\t// Save for post-reflection later.\n\t\t\tdeclared_block_names[var.self] = buffer_name;\n\n\t\t\ttype.member_name_cache.clear();\n\t\t\t// var.self can be used as a backup name for the block name,\n\t\t\t// so we need to make sure we don't disturb the name here on a recompile.\n\t\t\t// It will need to be reset if we have to recompile.\n\t\t\tpreserve_alias_on_reset(var.self);\n\t\t\tadd_resource_name(var.self);\n\t\t\tstatement(\"cbuffer \", buffer_name, to_resource_binding(var));\n\t\t\tbegin_scope();\n\n\t\t\tuint32_t i = 0;\n\t\t\tfor (auto &member : type.member_types)\n\t\t\t{\n\t\t\t\tadd_member_name(type, i);\n\t\t\t\tauto backup_name = get_member_name(type.self, i);\n\t\t\t\tauto member_name = to_member_name(type, i);\n\t\t\t\tmember_name = join(to_name(var.self), \"_\", member_name);\n\t\t\t\tParsedIR::sanitize_underscores(member_name);\n\t\t\t\tset_member_name(type.self, i, member_name);\n\t\t\t\temit_struct_member(type, member, i, \"\");\n\t\t\t\tset_member_name(type.self, i, backup_name);\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t\tend_scope_decl();\n\t\t\tstatement(\"\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (hlsl_options.shader_model < 51)\n\t\t\t\tSPIRV_CROSS_THROW(\n\t\t\t\t    \"Need ConstantBuffer<T> to use arrays of UBOs, but this is only supported in SM 5.1.\");\n\n\t\t\tadd_resource_name(type.self);\n\t\t\tadd_resource_name(var.self);\n\n\t\t\t// ConstantBuffer<T> does not support packoffset, so it is unuseable unless everything aligns as we expect.\n\t\t\tuint32_t failed_index = 0;\n\t\t\tif (!buffer_is_packing_standard(type, BufferPackingHLSLCbuffer, &failed_index))\n\t\t\t{\n\t\t\t\tSPIRV_CROSS_THROW(join(\"HLSL ConstantBuffer<T> ID \", var.self, \" (name: \", to_name(type.self),\n\t\t\t\t                       \"), member index \", failed_index, \" (name: \", to_member_name(type, failed_index),\n\t\t\t\t                       \") cannot be expressed with normal HLSL packing rules.\"));\n\t\t\t}\n\n\t\t\temit_struct(get<SPIRType>(type.self));\n\t\t\tstatement(\"ConstantBuffer<\", to_name(type.self), \"> \", to_name(var.self), type_to_array_glsl(type),\n\t\t\t          to_resource_binding(var), \";\");\n\t\t}\n\t}\n}\n\nvoid CompilerHLSL::emit_push_constant_block(const SPIRVariable &var)\n{\n\tif (flattened_buffer_blocks.count(var.self))\n\t{\n\t\temit_buffer_block_flattened(var);\n\t}\n\telse if (root_constants_layout.empty())\n\t{\n\t\temit_buffer_block(var);\n\t}\n\telse\n\t{\n\t\tfor (const auto &layout : root_constants_layout)\n\t\t{\n\t\t\tauto &type = get<SPIRType>(var.basetype);\n\n\t\t\tuint32_t failed_index = 0;\n\t\t\tif (buffer_is_packing_standard(type, BufferPackingHLSLCbufferPackOffset, &failed_index, layout.start,\n\t\t\t                               layout.end))\n\t\t\t\tset_extended_decoration(type.self, SPIRVCrossDecorationExplicitOffset);\n\t\t\telse\n\t\t\t{\n\t\t\t\tSPIRV_CROSS_THROW(join(\"Root constant cbuffer ID \", var.self, \" (name: \", to_name(type.self), \")\",\n\t\t\t\t                       \", member index \", failed_index, \" (name: \", to_member_name(type, failed_index),\n\t\t\t\t                       \") cannot be expressed with either HLSL packing layout or packoffset.\"));\n\t\t\t}\n\n\t\t\tflattened_structs[var.self] = false;\n\t\t\ttype.member_name_cache.clear();\n\t\t\tadd_resource_name(var.self);\n\t\t\tauto &memb = ir.meta[type.self].members;\n\n\t\t\tstatement(\"cbuffer SPIRV_CROSS_RootConstant_\", to_name(var.self),\n\t\t\t          to_resource_register(HLSL_BINDING_AUTO_PUSH_CONSTANT_BIT, 'b', layout.binding, layout.space));\n\t\t\tbegin_scope();\n\n\t\t\t// Index of the next field in the generated root constant constant buffer\n\t\t\tauto constant_index = 0u;\n\n\t\t\t// Iterate over all member of the push constant and check which of the fields\n\t\t\t// fit into the given root constant layout.\n\t\t\tfor (auto i = 0u; i < memb.size(); i++)\n\t\t\t{\n\t\t\t\tconst auto offset = memb[i].offset;\n\t\t\t\tif (layout.start <= offset && offset < layout.end)\n\t\t\t\t{\n\t\t\t\t\tconst auto &member = type.member_types[i];\n\n\t\t\t\t\tadd_member_name(type, constant_index);\n\t\t\t\t\tauto backup_name = get_member_name(type.self, i);\n\t\t\t\t\tauto member_name = to_member_name(type, i);\n\t\t\t\t\tmember_name = join(to_name(var.self), \"_\", member_name);\n\t\t\t\t\tParsedIR::sanitize_underscores(member_name);\n\t\t\t\t\tset_member_name(type.self, constant_index, member_name);\n\t\t\t\t\temit_struct_member(type, member, i, \"\", layout.start);\n\t\t\t\t\tset_member_name(type.self, constant_index, backup_name);\n\n\t\t\t\t\tconstant_index++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tend_scope_decl();\n\t\t}\n\t}\n}\n\nstring CompilerHLSL::to_sampler_expression(uint32_t id)\n{\n\tauto expr = join(\"_\", to_non_uniform_aware_expression(id));\n\tauto index = expr.find_first_of('[');\n\tif (index == string::npos)\n\t{\n\t\treturn expr + \"_sampler\";\n\t}\n\telse\n\t{\n\t\t// We have an expression like _ident[array], so we cannot tack on _sampler, insert it inside the string instead.\n\t\treturn expr.insert(index, \"_sampler\");\n\t}\n}\n\nvoid CompilerHLSL::emit_sampled_image_op(uint32_t result_type, uint32_t result_id, uint32_t image_id, uint32_t samp_id)\n{\n\tif (hlsl_options.shader_model >= 40 && combined_image_samplers.empty())\n\t{\n\t\tset<SPIRCombinedImageSampler>(result_id, result_type, image_id, samp_id);\n\t}\n\telse\n\t{\n\t\t// Make sure to suppress usage tracking. It is illegal to create temporaries of opaque types.\n\t\temit_op(result_type, result_id, to_combined_image_sampler(image_id, samp_id), true, true);\n\t}\n}\n\nstring CompilerHLSL::to_func_call_arg(const SPIRFunction::Parameter &arg, uint32_t id)\n{\n\tstring arg_str = CompilerGLSL::to_func_call_arg(arg, id);\n\n\tif (hlsl_options.shader_model <= 30)\n\t\treturn arg_str;\n\n\t// Manufacture automatic sampler arg if the arg is a SampledImage texture and we're in modern HLSL.\n\tauto &type = expression_type(id);\n\n\t// We don't have to consider combined image samplers here via OpSampledImage because\n\t// those variables cannot be passed as arguments to functions.\n\t// Only global SampledImage variables may be used as arguments.\n\tif (type.basetype == SPIRType::SampledImage && type.image.dim != DimBuffer)\n\t\targ_str += \", \" + to_sampler_expression(id);\n\n\treturn arg_str;\n}\n\nstring CompilerHLSL::get_inner_entry_point_name() const\n{\n\tauto &execution = get_entry_point();\n\n\tif (hlsl_options.use_entry_point_name)\n\t{\n\t\tauto name = join(execution.name, \"_inner\");\n\t\tParsedIR::sanitize_underscores(name);\n\t\treturn name;\n\t}\n\n\tif (execution.model == ExecutionModelVertex)\n\t\treturn \"vert_main\";\n\telse if (execution.model == ExecutionModelFragment)\n\t\treturn \"frag_main\";\n\telse if (execution.model == ExecutionModelGLCompute)\n\t\treturn \"comp_main\";\n\telse if (execution.model == ExecutionModelMeshEXT)\n\t\treturn \"mesh_main\";\n\telse if (execution.model == ExecutionModelTaskEXT)\n\t\treturn \"task_main\";\n\telse\n\t\tSPIRV_CROSS_THROW(\"Unsupported execution model.\");\n}\n\nvoid CompilerHLSL::emit_function_prototype(SPIRFunction &func, const Bitset &return_flags)\n{\n\tif (func.self != ir.default_entry_point)\n\t\tadd_function_overload(func);\n\n\t// Avoid shadow declarations.\n\tlocal_variable_names = resource_names;\n\n\tstring decl;\n\n\tauto &type = get<SPIRType>(func.return_type);\n\tif (type.array.empty())\n\t{\n\t\tdecl += flags_to_qualifiers_glsl(type, return_flags);\n\t\tdecl += type_to_glsl(type);\n\t\tdecl += \" \";\n\t}\n\telse\n\t{\n\t\t// We cannot return arrays in HLSL, so \"return\" through an out variable.\n\t\tdecl = \"void \";\n\t}\n\n\tif (func.self == ir.default_entry_point)\n\t{\n\t\tdecl += get_inner_entry_point_name();\n\t\tprocessing_entry_point = true;\n\t}\n\telse\n\t\tdecl += to_name(func.self);\n\n\tdecl += \"(\";\n\tSmallVector<string> arglist;\n\n\tif (!type.array.empty())\n\t{\n\t\t// Fake array returns by writing to an out array instead.\n\t\tstring out_argument;\n\t\tout_argument += \"out \";\n\t\tout_argument += type_to_glsl(type);\n\t\tout_argument += \" \";\n\t\tout_argument += \"spvReturnValue\";\n\t\tout_argument += type_to_array_glsl(type);\n\t\targlist.push_back(std::move(out_argument));\n\t}\n\n\tfor (auto &arg : func.arguments)\n\t{\n\t\t// Do not pass in separate images or samplers if we're remapping\n\t\t// to combined image samplers.\n\t\tif (skip_argument(arg.id))\n\t\t\tcontinue;\n\n\t\t// Might change the variable name if it already exists in this function.\n\t\t// SPIRV OpName doesn't have any semantic effect, so it's valid for an implementation\n\t\t// to use same name for variables.\n\t\t// Since we want to make the GLSL debuggable and somewhat sane, use fallback names for variables which are duplicates.\n\t\tadd_local_variable_name(arg.id);\n\n\t\targlist.push_back(argument_decl(arg));\n\n\t\t// Flatten a combined sampler to two separate arguments in modern HLSL.\n\t\tauto &arg_type = get<SPIRType>(arg.type);\n\t\tif (hlsl_options.shader_model > 30 && arg_type.basetype == SPIRType::SampledImage &&\n\t\t    arg_type.image.dim != DimBuffer)\n\t\t{\n\t\t\t// Manufacture automatic sampler arg for SampledImage texture\n\t\t\targlist.push_back(join(is_depth_image(arg_type, arg.id) ? \"SamplerComparisonState \" : \"SamplerState \",\n\t\t\t                       to_sampler_expression(arg.id), type_to_array_glsl(arg_type)));\n\t\t}\n\n\t\t// Hold a pointer to the parameter so we can invalidate the readonly field if needed.\n\t\tauto *var = maybe_get<SPIRVariable>(arg.id);\n\t\tif (var)\n\t\t\tvar->parameter = &arg;\n\t}\n\n\tfor (auto &arg : func.shadow_arguments)\n\t{\n\t\t// Might change the variable name if it already exists in this function.\n\t\t// SPIRV OpName doesn't have any semantic effect, so it's valid for an implementation\n\t\t// to use same name for variables.\n\t\t// Since we want to make the GLSL debuggable and somewhat sane, use fallback names for variables which are duplicates.\n\t\tadd_local_variable_name(arg.id);\n\n\t\targlist.push_back(argument_decl(arg));\n\n\t\t// Hold a pointer to the parameter so we can invalidate the readonly field if needed.\n\t\tauto *var = maybe_get<SPIRVariable>(arg.id);\n\t\tif (var)\n\t\t\tvar->parameter = &arg;\n\t}\n\n\tdecl += merge(arglist);\n\tdecl += \")\";\n\tstatement(decl);\n}\n\nvoid CompilerHLSL::emit_hlsl_entry_point()\n{\n\tSmallVector<string> arguments;\n\n\tif (require_input)\n\t\targuments.push_back(\"SPIRV_Cross_Input stage_input\");\n\n\tauto &execution = get_entry_point();\n\n\tswitch (execution.model)\n\t{\n\tcase ExecutionModelTaskEXT:\n\tcase ExecutionModelMeshEXT:\n\tcase ExecutionModelGLCompute:\n\t{\n\t\tif (execution.model == ExecutionModelMeshEXT)\n\t\t{\n\t\t\tif (execution.flags.get(ExecutionModeOutputTrianglesEXT))\n\t\t\t\tstatement(\"[outputtopology(\\\"triangle\\\")]\");\n\t\t\telse if (execution.flags.get(ExecutionModeOutputLinesEXT))\n\t\t\t\tstatement(\"[outputtopology(\\\"line\\\")]\");\n\t\t\telse if (execution.flags.get(ExecutionModeOutputPoints))\n\t\t\t\tSPIRV_CROSS_THROW(\"Topology mode \\\"points\\\" is not supported in DirectX\");\n\n\t\t\tauto &func = get<SPIRFunction>(ir.default_entry_point);\n\t\t\tfor (auto &arg : func.arguments)\n\t\t\t{\n\t\t\t\tauto &var = get<SPIRVariable>(arg.id);\n\t\t\t\tauto &base_type = get<SPIRType>(var.basetype);\n\t\t\t\tbool block = has_decoration(base_type.self, DecorationBlock);\n\t\t\t\tif (var.storage == StorageClassTaskPayloadWorkgroupEXT)\n\t\t\t\t{\n\t\t\t\t\targuments.push_back(\"in payload \" + variable_decl(var));\n\t\t\t\t}\n\t\t\t\telse if (block)\n\t\t\t\t{\n\t\t\t\t\tauto flags = get_buffer_block_flags(var.self);\n\t\t\t\t\tif (flags.get(DecorationPerPrimitiveEXT) || has_decoration(arg.id, DecorationPerPrimitiveEXT))\n\t\t\t\t\t{\n\t\t\t\t\t\targuments.push_back(\"out primitives gl_MeshPerPrimitiveEXT gl_MeshPrimitivesEXT[\" +\n\t\t\t\t\t\t                    std::to_string(execution.output_primitives) + \"]\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\targuments.push_back(\"out vertices gl_MeshPerVertexEXT gl_MeshVerticesEXT[\" +\n\t\t\t\t\t\t                    std::to_string(execution.output_vertices) + \"]\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (execution.flags.get(ExecutionModeOutputTrianglesEXT))\n\t\t\t\t\t{\n\t\t\t\t\t\targuments.push_back(\"out indices uint3 gl_PrimitiveTriangleIndicesEXT[\" +\n\t\t\t\t\t\t                    std::to_string(execution.output_primitives) + \"]\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\targuments.push_back(\"out indices uint2 gl_PrimitiveLineIndicesEXT[\" +\n\t\t\t\t\t\t                    std::to_string(execution.output_primitives) + \"]\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tSpecializationConstant wg_x, wg_y, wg_z;\n\t\tget_work_group_size_specialization_constants(wg_x, wg_y, wg_z);\n\n\t\tuint32_t x = execution.workgroup_size.x;\n\t\tuint32_t y = execution.workgroup_size.y;\n\t\tuint32_t z = execution.workgroup_size.z;\n\n\t\tif (!execution.workgroup_size.constant && execution.flags.get(ExecutionModeLocalSizeId))\n\t\t{\n\t\t\tif (execution.workgroup_size.id_x)\n\t\t\t\tx = get<SPIRConstant>(execution.workgroup_size.id_x).scalar();\n\t\t\tif (execution.workgroup_size.id_y)\n\t\t\t\ty = get<SPIRConstant>(execution.workgroup_size.id_y).scalar();\n\t\t\tif (execution.workgroup_size.id_z)\n\t\t\t\tz = get<SPIRConstant>(execution.workgroup_size.id_z).scalar();\n\t\t}\n\n\t\tauto x_expr = wg_x.id ? get<SPIRConstant>(wg_x.id).specialization_constant_macro_name : to_string(x);\n\t\tauto y_expr = wg_y.id ? get<SPIRConstant>(wg_y.id).specialization_constant_macro_name : to_string(y);\n\t\tauto z_expr = wg_z.id ? get<SPIRConstant>(wg_z.id).specialization_constant_macro_name : to_string(z);\n\n\t\tstatement(\"[numthreads(\", x_expr, \", \", y_expr, \", \", z_expr, \")]\");\n\t\tbreak;\n\t}\n\tcase ExecutionModelFragment:\n\t\tif (execution.flags.get(ExecutionModeEarlyFragmentTests))\n\t\t\tstatement(\"[earlydepthstencil]\");\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\n\tconst char *entry_point_name;\n\tif (hlsl_options.use_entry_point_name)\n\t\tentry_point_name = get_entry_point().name.c_str();\n\telse\n\t\tentry_point_name = \"main\";\n\n\tstatement(require_output ? \"SPIRV_Cross_Output \" : \"void \", entry_point_name, \"(\", merge(arguments), \")\");\n\tbegin_scope();\n\tbool legacy = hlsl_options.shader_model <= 30;\n\n\t// Copy builtins from entry point arguments to globals.\n\tactive_input_builtins.for_each_bit([&](uint32_t i) {\n\t\tauto builtin = builtin_to_glsl(static_cast<BuiltIn>(i), StorageClassInput);\n\t\tswitch (static_cast<BuiltIn>(i))\n\t\t{\n\t\tcase BuiltInFragCoord:\n\t\t\t// VPOS in D3D9 is sampled at integer locations, apply half-pixel offset to be consistent.\n\t\t\t// TODO: Do we need an option here? Any reason why a D3D9 shader would be used\n\t\t\t// on a D3D10+ system with a different rasterization config?\n\t\t\tif (legacy)\n\t\t\t\tstatement(builtin, \" = stage_input.\", builtin, \" + float4(0.5f, 0.5f, 0.0f, 0.0f);\");\n\t\t\telse\n\t\t\t{\n\t\t\t\tstatement(builtin, \" = stage_input.\", builtin, \";\");\n\t\t\t\t// ZW are undefined in D3D9, only do this fixup here.\n\t\t\t\tstatement(builtin, \".w = 1.0 / \", builtin, \".w;\");\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase BuiltInVertexId:\n\t\tcase BuiltInVertexIndex:\n\t\tcase BuiltInInstanceIndex:\n\t\t\t// D3D semantics are uint, but shader wants int.\n\t\t\tif (hlsl_options.support_nonzero_base_vertex_base_instance)\n\t\t\t{\n\t\t\t\tif (static_cast<BuiltIn>(i) == BuiltInInstanceIndex)\n\t\t\t\t\tstatement(builtin, \" = int(stage_input.\", builtin, \") + SPIRV_Cross_BaseInstance;\");\n\t\t\t\telse\n\t\t\t\t\tstatement(builtin, \" = int(stage_input.\", builtin, \") + SPIRV_Cross_BaseVertex;\");\n\t\t\t}\n\t\t\telse\n\t\t\t\tstatement(builtin, \" = int(stage_input.\", builtin, \");\");\n\t\t\tbreak;\n\n\t\tcase BuiltInBaseVertex:\n\t\t\tstatement(builtin, \" = SPIRV_Cross_BaseVertex;\");\n\t\t\tbreak;\n\n\t\tcase BuiltInBaseInstance:\n\t\t\tstatement(builtin, \" = SPIRV_Cross_BaseInstance;\");\n\t\t\tbreak;\n\n\t\tcase BuiltInInstanceId:\n\t\t\t// D3D semantics are uint, but shader wants int.\n\t\t\tstatement(builtin, \" = int(stage_input.\", builtin, \");\");\n\t\t\tbreak;\n\n\t\tcase BuiltInSampleMask:\n\t\t\tstatement(builtin, \"[0] = stage_input.\", builtin, \";\");\n\t\t\tbreak;\n\n\t\tcase BuiltInNumWorkgroups:\n\t\tcase BuiltInPointCoord:\n\t\tcase BuiltInSubgroupSize:\n\t\tcase BuiltInSubgroupLocalInvocationId:\n\t\tcase BuiltInHelperInvocation:\n\t\t\tbreak;\n\n\t\tcase BuiltInSubgroupEqMask:\n\t\t\t// Emulate these ...\n\t\t\t// No 64-bit in HLSL, so have to do it in 32-bit and unroll.\n\t\t\tstatement(\"gl_SubgroupEqMask = 1u << (WaveGetLaneIndex() - uint4(0, 32, 64, 96));\");\n\t\t\tstatement(\"if (WaveGetLaneIndex() >= 32) gl_SubgroupEqMask.x = 0;\");\n\t\t\tstatement(\"if (WaveGetLaneIndex() >= 64 || WaveGetLaneIndex() < 32) gl_SubgroupEqMask.y = 0;\");\n\t\t\tstatement(\"if (WaveGetLaneIndex() >= 96 || WaveGetLaneIndex() < 64) gl_SubgroupEqMask.z = 0;\");\n\t\t\tstatement(\"if (WaveGetLaneIndex() < 96) gl_SubgroupEqMask.w = 0;\");\n\t\t\tbreak;\n\n\t\tcase BuiltInSubgroupGeMask:\n\t\t\t// Emulate these ...\n\t\t\t// No 64-bit in HLSL, so have to do it in 32-bit and unroll.\n\t\t\tstatement(\"gl_SubgroupGeMask = ~((1u << (WaveGetLaneIndex() - uint4(0, 32, 64, 96))) - 1u);\");\n\t\t\tstatement(\"if (WaveGetLaneIndex() >= 32) gl_SubgroupGeMask.x = 0u;\");\n\t\t\tstatement(\"if (WaveGetLaneIndex() >= 64) gl_SubgroupGeMask.y = 0u;\");\n\t\t\tstatement(\"if (WaveGetLaneIndex() >= 96) gl_SubgroupGeMask.z = 0u;\");\n\t\t\tstatement(\"if (WaveGetLaneIndex() < 32) gl_SubgroupGeMask.y = ~0u;\");\n\t\t\tstatement(\"if (WaveGetLaneIndex() < 64) gl_SubgroupGeMask.z = ~0u;\");\n\t\t\tstatement(\"if (WaveGetLaneIndex() < 96) gl_SubgroupGeMask.w = ~0u;\");\n\t\t\tbreak;\n\n\t\tcase BuiltInSubgroupGtMask:\n\t\t\t// Emulate these ...\n\t\t\t// No 64-bit in HLSL, so have to do it in 32-bit and unroll.\n\t\t\tstatement(\"uint gt_lane_index = WaveGetLaneIndex() + 1;\");\n\t\t\tstatement(\"gl_SubgroupGtMask = ~((1u << (gt_lane_index - uint4(0, 32, 64, 96))) - 1u);\");\n\t\t\tstatement(\"if (gt_lane_index >= 32) gl_SubgroupGtMask.x = 0u;\");\n\t\t\tstatement(\"if (gt_lane_index >= 64) gl_SubgroupGtMask.y = 0u;\");\n\t\t\tstatement(\"if (gt_lane_index >= 96) gl_SubgroupGtMask.z = 0u;\");\n\t\t\tstatement(\"if (gt_lane_index >= 128) gl_SubgroupGtMask.w = 0u;\");\n\t\t\tstatement(\"if (gt_lane_index < 32) gl_SubgroupGtMask.y = ~0u;\");\n\t\t\tstatement(\"if (gt_lane_index < 64) gl_SubgroupGtMask.z = ~0u;\");\n\t\t\tstatement(\"if (gt_lane_index < 96) gl_SubgroupGtMask.w = ~0u;\");\n\t\t\tbreak;\n\n\t\tcase BuiltInSubgroupLeMask:\n\t\t\t// Emulate these ...\n\t\t\t// No 64-bit in HLSL, so have to do it in 32-bit and unroll.\n\t\t\tstatement(\"uint le_lane_index = WaveGetLaneIndex() + 1;\");\n\t\t\tstatement(\"gl_SubgroupLeMask = (1u << (le_lane_index - uint4(0, 32, 64, 96))) - 1u;\");\n\t\t\tstatement(\"if (le_lane_index >= 32) gl_SubgroupLeMask.x = ~0u;\");\n\t\t\tstatement(\"if (le_lane_index >= 64) gl_SubgroupLeMask.y = ~0u;\");\n\t\t\tstatement(\"if (le_lane_index >= 96) gl_SubgroupLeMask.z = ~0u;\");\n\t\t\tstatement(\"if (le_lane_index >= 128) gl_SubgroupLeMask.w = ~0u;\");\n\t\t\tstatement(\"if (le_lane_index < 32) gl_SubgroupLeMask.y = 0u;\");\n\t\t\tstatement(\"if (le_lane_index < 64) gl_SubgroupLeMask.z = 0u;\");\n\t\t\tstatement(\"if (le_lane_index < 96) gl_SubgroupLeMask.w = 0u;\");\n\t\t\tbreak;\n\n\t\tcase BuiltInSubgroupLtMask:\n\t\t\t// Emulate these ...\n\t\t\t// No 64-bit in HLSL, so have to do it in 32-bit and unroll.\n\t\t\tstatement(\"gl_SubgroupLtMask = (1u << (WaveGetLaneIndex() - uint4(0, 32, 64, 96))) - 1u;\");\n\t\t\tstatement(\"if (WaveGetLaneIndex() >= 32) gl_SubgroupLtMask.x = ~0u;\");\n\t\t\tstatement(\"if (WaveGetLaneIndex() >= 64) gl_SubgroupLtMask.y = ~0u;\");\n\t\t\tstatement(\"if (WaveGetLaneIndex() >= 96) gl_SubgroupLtMask.z = ~0u;\");\n\t\t\tstatement(\"if (WaveGetLaneIndex() < 32) gl_SubgroupLtMask.y = 0u;\");\n\t\t\tstatement(\"if (WaveGetLaneIndex() < 64) gl_SubgroupLtMask.z = 0u;\");\n\t\t\tstatement(\"if (WaveGetLaneIndex() < 96) gl_SubgroupLtMask.w = 0u;\");\n\t\t\tbreak;\n\n\t\tcase BuiltInClipDistance:\n\t\t\tfor (uint32_t clip = 0; clip < clip_distance_count; clip++)\n\t\t\t\tstatement(\"gl_ClipDistance[\", clip, \"] = stage_input.gl_ClipDistance\", clip / 4, \".\", \"xyzw\"[clip & 3],\n\t\t\t\t          \";\");\n\t\t\tbreak;\n\n\t\tcase BuiltInCullDistance:\n\t\t\tfor (uint32_t cull = 0; cull < cull_distance_count; cull++)\n\t\t\t\tstatement(\"gl_CullDistance[\", cull, \"] = stage_input.gl_CullDistance\", cull / 4, \".\", \"xyzw\"[cull & 3],\n\t\t\t\t          \";\");\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tstatement(builtin, \" = stage_input.\", builtin, \";\");\n\t\t\tbreak;\n\t\t}\n\t});\n\n\t// Copy from stage input struct to globals.\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\tauto &type = this->get<SPIRType>(var.basetype);\n\t\tbool block = has_decoration(type.self, DecorationBlock);\n\n\t\tif (var.storage != StorageClassInput)\n\t\t\treturn;\n\n\t\tbool need_matrix_unroll = var.storage == StorageClassInput && execution.model == ExecutionModelVertex;\n\n\t\tif (!var.remapped_variable && type.pointer && !is_builtin_variable(var) &&\n\t\t    interface_variable_exists_in_entry_point(var.self))\n\t\t{\n\t\t\tif (block)\n\t\t\t{\n\t\t\t\tauto type_name = to_name(type.self);\n\t\t\t\tauto var_name = to_name(var.self);\n\t\t\t\tfor (uint32_t mbr_idx = 0; mbr_idx < uint32_t(type.member_types.size()); mbr_idx++)\n\t\t\t\t{\n\t\t\t\t\tauto mbr_name = to_member_name(type, mbr_idx);\n\t\t\t\t\tauto flat_name = join(type_name, \"_\", mbr_name);\n\t\t\t\t\tstatement(var_name, \".\", mbr_name, \" = stage_input.\", flat_name, \";\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tauto name = to_name(var.self);\n\t\t\t\tauto &mtype = this->get<SPIRType>(var.basetype);\n\t\t\t\tif (need_matrix_unroll && mtype.columns > 1)\n\t\t\t\t{\n\t\t\t\t\t// Unroll matrices.\n\t\t\t\t\tfor (uint32_t col = 0; col < mtype.columns; col++)\n\t\t\t\t\t\tstatement(name, \"[\", col, \"] = stage_input.\", name, \"_\", col, \";\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tstatement(name, \" = stage_input.\", name, \";\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\t// Run the shader.\n\tif (execution.model == ExecutionModelVertex ||\n\t    execution.model == ExecutionModelFragment ||\n\t    execution.model == ExecutionModelGLCompute ||\n\t    execution.model == ExecutionModelMeshEXT ||\n\t    execution.model == ExecutionModelTaskEXT)\n\t{\n\t\t// For mesh shaders, we receive special arguments that we must pass down as function arguments.\n\t\t// HLSL does not support proper reference types for passing these IO blocks,\n\t\t// but DXC post-inlining seems to magically fix it up anyways *shrug*.\n\t\tSmallVector<string> arglist;\n\t\tauto &func = get<SPIRFunction>(ir.default_entry_point);\n\t\t// The arguments are marked out, avoid detecting reads and emitting inout.\n\t\tfor (auto &arg : func.arguments)\n\t\t\targlist.push_back(to_expression(arg.id, false));\n\t\tstatement(get_inner_entry_point_name(), \"(\", merge(arglist), \");\");\n\t}\n\telse\n\t\tSPIRV_CROSS_THROW(\"Unsupported shader stage.\");\n\n\t// Copy stage outputs.\n\tif (require_output)\n\t{\n\t\tstatement(\"SPIRV_Cross_Output stage_output;\");\n\n\t\t// Copy builtins from globals to return struct.\n\t\tactive_output_builtins.for_each_bit([&](uint32_t i) {\n\t\t\t// PointSize doesn't exist in HLSL SM 4+.\n\t\t\tif (i == BuiltInPointSize && !legacy)\n\t\t\t\treturn;\n\n\t\t\tswitch (static_cast<BuiltIn>(i))\n\t\t\t{\n\t\t\tcase BuiltInClipDistance:\n\t\t\t\tfor (uint32_t clip = 0; clip < clip_distance_count; clip++)\n\t\t\t\t\tstatement(\"stage_output.gl_ClipDistance\", clip / 4, \".\", \"xyzw\"[clip & 3], \" = gl_ClipDistance[\",\n\t\t\t\t\t          clip, \"];\");\n\t\t\t\tbreak;\n\n\t\t\tcase BuiltInCullDistance:\n\t\t\t\tfor (uint32_t cull = 0; cull < cull_distance_count; cull++)\n\t\t\t\t\tstatement(\"stage_output.gl_CullDistance\", cull / 4, \".\", \"xyzw\"[cull & 3], \" = gl_CullDistance[\",\n\t\t\t\t\t          cull, \"];\");\n\t\t\t\tbreak;\n\n\t\t\tcase BuiltInSampleMask:\n\t\t\t\tstatement(\"stage_output.gl_SampleMask = gl_SampleMask[0];\");\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tauto builtin_expr = builtin_to_glsl(static_cast<BuiltIn>(i), StorageClassOutput);\n\t\t\t\tstatement(\"stage_output.\", builtin_expr, \" = \", builtin_expr, \";\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\t\tauto &type = this->get<SPIRType>(var.basetype);\n\t\t\tbool block = has_decoration(type.self, DecorationBlock);\n\n\t\t\tif (var.storage != StorageClassOutput)\n\t\t\t\treturn;\n\n\t\t\tif (!var.remapped_variable && type.pointer &&\n\t\t\t    !is_builtin_variable(var) &&\n\t\t\t    interface_variable_exists_in_entry_point(var.self))\n\t\t\t{\n\t\t\t\tif (block)\n\t\t\t\t{\n\t\t\t\t\t// I/O blocks need to flatten output.\n\t\t\t\t\tauto type_name = to_name(type.self);\n\t\t\t\t\tauto var_name = to_name(var.self);\n\t\t\t\t\tfor (uint32_t mbr_idx = 0; mbr_idx < uint32_t(type.member_types.size()); mbr_idx++)\n\t\t\t\t\t{\n\t\t\t\t\t\tauto mbr_name = to_member_name(type, mbr_idx);\n\t\t\t\t\t\tauto flat_name = join(type_name, \"_\", mbr_name);\n\t\t\t\t\t\tstatement(\"stage_output.\", flat_name, \" = \", var_name, \".\", mbr_name, \";\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tauto name = to_name(var.self);\n\n\t\t\t\t\tif (legacy && execution.model == ExecutionModelFragment)\n\t\t\t\t\t{\n\t\t\t\t\t\tstring output_filler;\n\t\t\t\t\t\tfor (uint32_t size = type.vecsize; size < 4; ++size)\n\t\t\t\t\t\t\toutput_filler += \", 0.0\";\n\n\t\t\t\t\t\tstatement(\"stage_output.\", name, \" = float4(\", name, output_filler, \");\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(\"stage_output.\", name, \" = \", name, \";\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tstatement(\"return stage_output;\");\n\t}\n\n\tend_scope();\n}\n\nvoid CompilerHLSL::emit_fixup()\n{\n\tif (is_vertex_like_shader() && active_output_builtins.get(BuiltInPosition))\n\t{\n\t\t// Do various mangling on the gl_Position.\n\t\tif (hlsl_options.shader_model <= 30)\n\t\t{\n\t\t\tstatement(\"gl_Position.x = gl_Position.x - gl_HalfPixel.x * \"\n\t\t\t          \"gl_Position.w;\");\n\t\t\tstatement(\"gl_Position.y = gl_Position.y + gl_HalfPixel.y * \"\n\t\t\t          \"gl_Position.w;\");\n\t\t}\n\n\t\tif (options.vertex.flip_vert_y)\n\t\t\tstatement(\"gl_Position.y = -gl_Position.y;\");\n\t\tif (options.vertex.fixup_clipspace)\n\t\t\tstatement(\"gl_Position.z = (gl_Position.z + gl_Position.w) * 0.5;\");\n\t}\n}\n\nvoid CompilerHLSL::emit_texture_op(const Instruction &i, bool sparse)\n{\n\tif (sparse)\n\t\tSPIRV_CROSS_THROW(\"Sparse feedback not yet supported in HLSL.\");\n\n\tauto *ops = stream(i);\n\tauto op = static_cast<Op>(i.op);\n\tuint32_t length = i.length;\n\n\tSmallVector<uint32_t> inherited_expressions;\n\n\tuint32_t result_type = ops[0];\n\tuint32_t id = ops[1];\n\tVariableID img = ops[2];\n\tuint32_t coord = ops[3];\n\tuint32_t dref = 0;\n\tuint32_t comp = 0;\n\tbool gather = false;\n\tbool proj = false;\n\tconst uint32_t *opt = nullptr;\n\tauto *combined_image = maybe_get<SPIRCombinedImageSampler>(img);\n\n\tif (combined_image && has_decoration(img, DecorationNonUniform))\n\t{\n\t\tset_decoration(combined_image->image, DecorationNonUniform);\n\t\tset_decoration(combined_image->sampler, DecorationNonUniform);\n\t}\n\n\tauto img_expr = to_non_uniform_aware_expression(combined_image ? combined_image->image : img);\n\n\tinherited_expressions.push_back(coord);\n\n\tswitch (op)\n\t{\n\tcase OpImageSampleDrefImplicitLod:\n\tcase OpImageSampleDrefExplicitLod:\n\t\tdref = ops[4];\n\t\topt = &ops[5];\n\t\tlength -= 5;\n\t\tbreak;\n\n\tcase OpImageSampleProjDrefImplicitLod:\n\tcase OpImageSampleProjDrefExplicitLod:\n\t\tdref = ops[4];\n\t\tproj = true;\n\t\topt = &ops[5];\n\t\tlength -= 5;\n\t\tbreak;\n\n\tcase OpImageDrefGather:\n\t\tdref = ops[4];\n\t\topt = &ops[5];\n\t\tgather = true;\n\t\tlength -= 5;\n\t\tbreak;\n\n\tcase OpImageGather:\n\t\tcomp = ops[4];\n\t\topt = &ops[5];\n\t\tgather = true;\n\t\tlength -= 5;\n\t\tbreak;\n\n\tcase OpImageSampleProjImplicitLod:\n\tcase OpImageSampleProjExplicitLod:\n\t\topt = &ops[4];\n\t\tlength -= 4;\n\t\tproj = true;\n\t\tbreak;\n\n\tcase OpImageQueryLod:\n\t\topt = &ops[4];\n\t\tlength -= 4;\n\t\tbreak;\n\n\tdefault:\n\t\topt = &ops[4];\n\t\tlength -= 4;\n\t\tbreak;\n\t}\n\n\tauto &imgtype = expression_type(img);\n\tuint32_t coord_components = 0;\n\tswitch (imgtype.image.dim)\n\t{\n\tcase spv::Dim1D:\n\t\tcoord_components = 1;\n\t\tbreak;\n\tcase spv::Dim2D:\n\t\tcoord_components = 2;\n\t\tbreak;\n\tcase spv::Dim3D:\n\t\tcoord_components = 3;\n\t\tbreak;\n\tcase spv::DimCube:\n\t\tcoord_components = 3;\n\t\tbreak;\n\tcase spv::DimBuffer:\n\t\tcoord_components = 1;\n\t\tbreak;\n\tdefault:\n\t\tcoord_components = 2;\n\t\tbreak;\n\t}\n\n\tif (dref)\n\t\tinherited_expressions.push_back(dref);\n\n\tif (imgtype.image.arrayed)\n\t\tcoord_components++;\n\n\tuint32_t bias = 0;\n\tuint32_t lod = 0;\n\tuint32_t grad_x = 0;\n\tuint32_t grad_y = 0;\n\tuint32_t coffset = 0;\n\tuint32_t offset = 0;\n\tuint32_t coffsets = 0;\n\tuint32_t sample = 0;\n\tuint32_t minlod = 0;\n\tuint32_t flags = 0;\n\n\tif (length)\n\t{\n\t\tflags = opt[0];\n\t\topt++;\n\t\tlength--;\n\t}\n\n\tauto test = [&](uint32_t &v, uint32_t flag) {\n\t\tif (length && (flags & flag))\n\t\t{\n\t\t\tv = *opt++;\n\t\t\tinherited_expressions.push_back(v);\n\t\t\tlength--;\n\t\t}\n\t};\n\n\ttest(bias, ImageOperandsBiasMask);\n\ttest(lod, ImageOperandsLodMask);\n\ttest(grad_x, ImageOperandsGradMask);\n\ttest(grad_y, ImageOperandsGradMask);\n\ttest(coffset, ImageOperandsConstOffsetMask);\n\ttest(offset, ImageOperandsOffsetMask);\n\ttest(coffsets, ImageOperandsConstOffsetsMask);\n\ttest(sample, ImageOperandsSampleMask);\n\ttest(minlod, ImageOperandsMinLodMask);\n\n\tstring expr;\n\tstring texop;\n\n\tif (minlod != 0)\n\t\tSPIRV_CROSS_THROW(\"MinLod texture operand not supported in HLSL.\");\n\n\tif (op == OpImageFetch)\n\t{\n\t\tif (hlsl_options.shader_model < 40)\n\t\t{\n\t\t\tSPIRV_CROSS_THROW(\"texelFetch is not supported in HLSL shader model 2/3.\");\n\t\t}\n\t\ttexop += img_expr;\n\t\ttexop += \".Load\";\n\t}\n\telse if (op == OpImageQueryLod)\n\t{\n\t\ttexop += img_expr;\n\t\ttexop += \".CalculateLevelOfDetail\";\n\t}\n\telse\n\t{\n\t\tauto &imgformat = get<SPIRType>(imgtype.image.type);\n\t\tif (hlsl_options.shader_model < 67 && imgformat.basetype != SPIRType::Float)\n\t\t{\n\t\t\tSPIRV_CROSS_THROW(\"Sampling non-float textures is not supported in HLSL SM < 6.7.\");\n\t\t}\n\n\t\tif (hlsl_options.shader_model >= 40)\n\t\t{\n\t\t\ttexop += img_expr;\n\n\t\t\tif (is_depth_image(imgtype, img))\n\t\t\t{\n\t\t\t\tif (gather)\n\t\t\t\t{\n\t\t\t\t\ttexop += \".GatherCmp\";\n\t\t\t\t}\n\t\t\t\telse if (lod || grad_x || grad_y)\n\t\t\t\t{\n\t\t\t\t\t// Assume we want a fixed level, and the only thing we can get in HLSL is SampleCmpLevelZero.\n\t\t\t\t\ttexop += \".SampleCmpLevelZero\";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\ttexop += \".SampleCmp\";\n\t\t\t}\n\t\t\telse if (gather)\n\t\t\t{\n\t\t\t\tuint32_t comp_num = evaluate_constant_u32(comp);\n\t\t\t\tif (hlsl_options.shader_model >= 50)\n\t\t\t\t{\n\t\t\t\t\tswitch (comp_num)\n\t\t\t\t\t{\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\ttexop += \".GatherRed\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\ttexop += \".GatherGreen\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\ttexop += \".GatherBlue\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 3:\n\t\t\t\t\t\ttexop += \".GatherAlpha\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tSPIRV_CROSS_THROW(\"Invalid component.\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (comp_num == 0)\n\t\t\t\t\t\ttexop += \".Gather\";\n\t\t\t\t\telse\n\t\t\t\t\t\tSPIRV_CROSS_THROW(\"HLSL shader model 4 can only gather from the red component.\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (bias)\n\t\t\t\ttexop += \".SampleBias\";\n\t\t\telse if (grad_x || grad_y)\n\t\t\t\ttexop += \".SampleGrad\";\n\t\t\telse if (lod)\n\t\t\t\ttexop += \".SampleLevel\";\n\t\t\telse\n\t\t\t\ttexop += \".Sample\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tswitch (imgtype.image.dim)\n\t\t\t{\n\t\t\tcase Dim1D:\n\t\t\t\ttexop += \"tex1D\";\n\t\t\t\tbreak;\n\t\t\tcase Dim2D:\n\t\t\t\ttexop += \"tex2D\";\n\t\t\t\tbreak;\n\t\t\tcase Dim3D:\n\t\t\t\ttexop += \"tex3D\";\n\t\t\t\tbreak;\n\t\t\tcase DimCube:\n\t\t\t\ttexop += \"texCUBE\";\n\t\t\t\tbreak;\n\t\t\tcase DimRect:\n\t\t\tcase DimBuffer:\n\t\t\tcase DimSubpassData:\n\t\t\t\tSPIRV_CROSS_THROW(\"Buffer texture support is not yet implemented for HLSL\"); // TODO\n\t\t\tdefault:\n\t\t\t\tSPIRV_CROSS_THROW(\"Invalid dimension.\");\n\t\t\t}\n\n\t\t\tif (gather)\n\t\t\t\tSPIRV_CROSS_THROW(\"textureGather is not supported in HLSL shader model 2/3.\");\n\t\t\tif (offset || coffset)\n\t\t\t\tSPIRV_CROSS_THROW(\"textureOffset is not supported in HLSL shader model 2/3.\");\n\n\t\t\tif (grad_x || grad_y)\n\t\t\t\ttexop += \"grad\";\n\t\t\telse if (lod)\n\t\t\t\ttexop += \"lod\";\n\t\t\telse if (bias)\n\t\t\t\ttexop += \"bias\";\n\t\t\telse if (proj || dref)\n\t\t\t\ttexop += \"proj\";\n\t\t}\n\t}\n\n\texpr += texop;\n\texpr += \"(\";\n\tif (hlsl_options.shader_model < 40)\n\t{\n\t\tif (combined_image)\n\t\t\tSPIRV_CROSS_THROW(\"Separate images/samplers are not supported in HLSL shader model 2/3.\");\n\t\texpr += to_expression(img);\n\t}\n\telse if (op != OpImageFetch)\n\t{\n\t\tstring sampler_expr;\n\t\tif (combined_image)\n\t\t\tsampler_expr = to_non_uniform_aware_expression(combined_image->sampler);\n\t\telse\n\t\t\tsampler_expr = to_sampler_expression(img);\n\t\texpr += sampler_expr;\n\t}\n\n\tauto swizzle = [](uint32_t comps, uint32_t in_comps) -> const char * {\n\t\tif (comps == in_comps)\n\t\t\treturn \"\";\n\n\t\tswitch (comps)\n\t\t{\n\t\tcase 1:\n\t\t\treturn \".x\";\n\t\tcase 2:\n\t\t\treturn \".xy\";\n\t\tcase 3:\n\t\t\treturn \".xyz\";\n\t\tdefault:\n\t\t\treturn \"\";\n\t\t}\n\t};\n\n\tbool forward = should_forward(coord);\n\n\t// The IR can give us more components than we need, so chop them off as needed.\n\tstring coord_expr;\n\tauto &coord_type = expression_type(coord);\n\tif (coord_components != coord_type.vecsize)\n\t\tcoord_expr = to_enclosed_expression(coord) + swizzle(coord_components, expression_type(coord).vecsize);\n\telse\n\t\tcoord_expr = to_expression(coord);\n\n\tif (proj && hlsl_options.shader_model >= 40) // Legacy HLSL has \"proj\" operations which do this for us.\n\t\tcoord_expr = coord_expr + \" / \" + to_extract_component_expression(coord, coord_components);\n\n\tif (hlsl_options.shader_model < 40)\n\t{\n\t\tif (dref)\n\t\t{\n\t\t\tif (imgtype.image.dim != spv::Dim1D && imgtype.image.dim != spv::Dim2D)\n\t\t\t{\n\t\t\t\tSPIRV_CROSS_THROW(\n\t\t\t\t    \"Depth comparison is only supported for 1D and 2D textures in HLSL shader model 2/3.\");\n\t\t\t}\n\n\t\t\tif (grad_x || grad_y)\n\t\t\t\tSPIRV_CROSS_THROW(\"Depth comparison is not supported for grad sampling in HLSL shader model 2/3.\");\n\n\t\t\tfor (uint32_t size = coord_components; size < 2; ++size)\n\t\t\t\tcoord_expr += \", 0.0\";\n\n\t\t\tforward = forward && should_forward(dref);\n\t\t\tcoord_expr += \", \" + to_expression(dref);\n\t\t}\n\t\telse if (lod || bias || proj)\n\t\t{\n\t\t\tfor (uint32_t size = coord_components; size < 3; ++size)\n\t\t\t\tcoord_expr += \", 0.0\";\n\t\t}\n\n\t\tif (lod)\n\t\t{\n\t\t\tcoord_expr = \"float4(\" + coord_expr + \", \" + to_expression(lod) + \")\";\n\t\t}\n\t\telse if (bias)\n\t\t{\n\t\t\tcoord_expr = \"float4(\" + coord_expr + \", \" + to_expression(bias) + \")\";\n\t\t}\n\t\telse if (proj)\n\t\t{\n\t\t\tcoord_expr = \"float4(\" + coord_expr + \", \" + to_extract_component_expression(coord, coord_components) + \")\";\n\t\t}\n\t\telse if (dref)\n\t\t{\n\t\t\t// A \"normal\" sample gets fed into tex2Dproj as well, because the\n\t\t\t// regular tex2D accepts only two coordinates.\n\t\t\tcoord_expr = \"float4(\" + coord_expr + \", 1.0)\";\n\t\t}\n\n\t\tif (!!lod + !!bias + !!proj > 1)\n\t\t\tSPIRV_CROSS_THROW(\"Legacy HLSL can only use one of lod/bias/proj modifiers.\");\n\t}\n\n\tif (op == OpImageFetch)\n\t{\n\t\tif (imgtype.image.dim != DimBuffer && !imgtype.image.ms)\n\t\t\tcoord_expr =\n\t\t\t    join(\"int\", coord_components + 1, \"(\", coord_expr, \", \", lod ? to_expression(lod) : string(\"0\"), \")\");\n\t}\n\telse\n\t\texpr += \", \";\n\texpr += coord_expr;\n\n\tif (dref && hlsl_options.shader_model >= 40)\n\t{\n\t\tforward = forward && should_forward(dref);\n\t\texpr += \", \";\n\n\t\tif (proj)\n\t\t\texpr += to_enclosed_expression(dref) + \" / \" + to_extract_component_expression(coord, coord_components);\n\t\telse\n\t\t\texpr += to_expression(dref);\n\t}\n\n\tif (!dref && (grad_x || grad_y))\n\t{\n\t\tforward = forward && should_forward(grad_x);\n\t\tforward = forward && should_forward(grad_y);\n\t\texpr += \", \";\n\t\texpr += to_expression(grad_x);\n\t\texpr += \", \";\n\t\texpr += to_expression(grad_y);\n\t}\n\n\tif (!dref && lod && hlsl_options.shader_model >= 40 && op != OpImageFetch)\n\t{\n\t\tforward = forward && should_forward(lod);\n\t\texpr += \", \";\n\t\texpr += to_expression(lod);\n\t}\n\n\tif (!dref && bias && hlsl_options.shader_model >= 40)\n\t{\n\t\tforward = forward && should_forward(bias);\n\t\texpr += \", \";\n\t\texpr += to_expression(bias);\n\t}\n\n\tif (coffset)\n\t{\n\t\tforward = forward && should_forward(coffset);\n\t\texpr += \", \";\n\t\texpr += to_expression(coffset);\n\t}\n\telse if (offset)\n\t{\n\t\tforward = forward && should_forward(offset);\n\t\texpr += \", \";\n\t\texpr += to_expression(offset);\n\t}\n\n\tif (sample)\n\t{\n\t\texpr += \", \";\n\t\texpr += to_expression(sample);\n\t}\n\n\texpr += \")\";\n\n\tif (dref && hlsl_options.shader_model < 40)\n\t\texpr += \".x\";\n\n\tif (op == OpImageQueryLod)\n\t{\n\t\t// This is rather awkward.\n\t\t// textureQueryLod returns two values, the \"accessed level\",\n\t\t// as well as the actual LOD lambda.\n\t\t// As far as I can tell, there is no way to get the .x component\n\t\t// according to GLSL spec, and it depends on the sampler itself.\n\t\t// Just assume X == Y, so we will need to splat the result to a float2.\n\t\tstatement(\"float _\", id, \"_tmp = \", expr, \";\");\n\t\tstatement(\"float2 _\", id, \" = _\", id, \"_tmp.xx;\");\n\t\tset<SPIRExpression>(id, join(\"_\", id), result_type, true);\n\t}\n\telse\n\t{\n\t\temit_op(result_type, id, expr, forward, false);\n\t}\n\n\tfor (auto &inherit : inherited_expressions)\n\t\tinherit_expression_dependencies(id, inherit);\n\n\tswitch (op)\n\t{\n\tcase OpImageSampleDrefImplicitLod:\n\tcase OpImageSampleImplicitLod:\n\tcase OpImageSampleProjImplicitLod:\n\tcase OpImageSampleProjDrefImplicitLod:\n\t\tregister_control_dependent_expression(id);\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nstring CompilerHLSL::to_resource_binding(const SPIRVariable &var)\n{\n\tconst auto &type = get<SPIRType>(var.basetype);\n\n\t// We can remap push constant blocks, even if they don't have any binding decoration.\n\tif (type.storage != StorageClassPushConstant && !has_decoration(var.self, DecorationBinding))\n\t\treturn \"\";\n\n\tchar space = '\\0';\n\n\tHLSLBindingFlagBits resource_flags = HLSL_BINDING_AUTO_NONE_BIT;\n\n\tswitch (type.basetype)\n\t{\n\tcase SPIRType::SampledImage:\n\t\tspace = 't'; // SRV\n\t\tresource_flags = HLSL_BINDING_AUTO_SRV_BIT;\n\t\tbreak;\n\n\tcase SPIRType::Image:\n\t\tif (type.image.sampled == 2 && type.image.dim != DimSubpassData)\n\t\t{\n\t\t\tif (has_decoration(var.self, DecorationNonWritable) && hlsl_options.nonwritable_uav_texture_as_srv)\n\t\t\t{\n\t\t\t\tspace = 't'; // SRV\n\t\t\t\tresource_flags = HLSL_BINDING_AUTO_SRV_BIT;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tspace = 'u'; // UAV\n\t\t\t\tresource_flags = HLSL_BINDING_AUTO_UAV_BIT;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tspace = 't'; // SRV\n\t\t\tresource_flags = HLSL_BINDING_AUTO_SRV_BIT;\n\t\t}\n\t\tbreak;\n\n\tcase SPIRType::Sampler:\n\t\tspace = 's';\n\t\tresource_flags = HLSL_BINDING_AUTO_SAMPLER_BIT;\n\t\tbreak;\n\n\tcase SPIRType::AccelerationStructure:\n\t\tspace = 't'; // SRV\n\t\tresource_flags = HLSL_BINDING_AUTO_SRV_BIT;\n\t\tbreak;\n\n\tcase SPIRType::Struct:\n\t{\n\t\tauto storage = type.storage;\n\t\tif (storage == StorageClassUniform)\n\t\t{\n\t\t\tif (has_decoration(type.self, DecorationBufferBlock))\n\t\t\t{\n\t\t\t\tBitset flags = ir.get_buffer_block_flags(var);\n\t\t\t\tbool is_readonly = flags.get(DecorationNonWritable) && !is_hlsl_force_storage_buffer_as_uav(var.self);\n\t\t\t\tspace = is_readonly ? 't' : 'u'; // UAV\n\t\t\t\tresource_flags = is_readonly ? HLSL_BINDING_AUTO_SRV_BIT : HLSL_BINDING_AUTO_UAV_BIT;\n\t\t\t}\n\t\t\telse if (has_decoration(type.self, DecorationBlock))\n\t\t\t{\n\t\t\t\tspace = 'b'; // Constant buffers\n\t\t\t\tresource_flags = HLSL_BINDING_AUTO_CBV_BIT;\n\t\t\t}\n\t\t}\n\t\telse if (storage == StorageClassPushConstant)\n\t\t{\n\t\t\tspace = 'b'; // Constant buffers\n\t\t\tresource_flags = HLSL_BINDING_AUTO_PUSH_CONSTANT_BIT;\n\t\t}\n\t\telse if (storage == StorageClassStorageBuffer)\n\t\t{\n\t\t\t// UAV or SRV depending on readonly flag.\n\t\t\tBitset flags = ir.get_buffer_block_flags(var);\n\t\t\tbool is_readonly = flags.get(DecorationNonWritable) && !is_hlsl_force_storage_buffer_as_uav(var.self);\n\t\t\tspace = is_readonly ? 't' : 'u';\n\t\t\tresource_flags = is_readonly ? HLSL_BINDING_AUTO_SRV_BIT : HLSL_BINDING_AUTO_UAV_BIT;\n\t\t}\n\n\t\tbreak;\n\t}\n\tdefault:\n\t\tbreak;\n\t}\n\n\tif (!space)\n\t\treturn \"\";\n\n\tuint32_t desc_set =\n\t    resource_flags == HLSL_BINDING_AUTO_PUSH_CONSTANT_BIT ? ResourceBindingPushConstantDescriptorSet : 0u;\n\tuint32_t binding = resource_flags == HLSL_BINDING_AUTO_PUSH_CONSTANT_BIT ? ResourceBindingPushConstantBinding : 0u;\n\n\tif (has_decoration(var.self, DecorationBinding))\n\t\tbinding = get_decoration(var.self, DecorationBinding);\n\tif (has_decoration(var.self, DecorationDescriptorSet))\n\t\tdesc_set = get_decoration(var.self, DecorationDescriptorSet);\n\n\treturn to_resource_register(resource_flags, space, binding, desc_set);\n}\n\nstring CompilerHLSL::to_resource_binding_sampler(const SPIRVariable &var)\n{\n\t// For combined image samplers.\n\tif (!has_decoration(var.self, DecorationBinding))\n\t\treturn \"\";\n\n\treturn to_resource_register(HLSL_BINDING_AUTO_SAMPLER_BIT, 's', get_decoration(var.self, DecorationBinding),\n\t                            get_decoration(var.self, DecorationDescriptorSet));\n}\n\nvoid CompilerHLSL::remap_hlsl_resource_binding(HLSLBindingFlagBits type, uint32_t &desc_set, uint32_t &binding)\n{\n\tauto itr = resource_bindings.find({ get_execution_model(), desc_set, binding });\n\tif (itr != end(resource_bindings))\n\t{\n\t\tauto &remap = itr->second;\n\t\tremap.second = true;\n\n\t\tswitch (type)\n\t\t{\n\t\tcase HLSL_BINDING_AUTO_PUSH_CONSTANT_BIT:\n\t\tcase HLSL_BINDING_AUTO_CBV_BIT:\n\t\t\tdesc_set = remap.first.cbv.register_space;\n\t\t\tbinding = remap.first.cbv.register_binding;\n\t\t\tbreak;\n\n\t\tcase HLSL_BINDING_AUTO_SRV_BIT:\n\t\t\tdesc_set = remap.first.srv.register_space;\n\t\t\tbinding = remap.first.srv.register_binding;\n\t\t\tbreak;\n\n\t\tcase HLSL_BINDING_AUTO_SAMPLER_BIT:\n\t\t\tdesc_set = remap.first.sampler.register_space;\n\t\t\tbinding = remap.first.sampler.register_binding;\n\t\t\tbreak;\n\n\t\tcase HLSL_BINDING_AUTO_UAV_BIT:\n\t\t\tdesc_set = remap.first.uav.register_space;\n\t\t\tbinding = remap.first.uav.register_binding;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nstring CompilerHLSL::to_resource_register(HLSLBindingFlagBits flag, char space, uint32_t binding, uint32_t space_set)\n{\n\tif ((flag & resource_binding_flags) == 0)\n\t{\n\t\tremap_hlsl_resource_binding(flag, space_set, binding);\n\n\t\t// The push constant block did not have a binding, and there were no remap for it,\n\t\t// so, declare without register binding.\n\t\tif (flag == HLSL_BINDING_AUTO_PUSH_CONSTANT_BIT && space_set == ResourceBindingPushConstantDescriptorSet)\n\t\t\treturn \"\";\n\n\t\tif (hlsl_options.shader_model >= 51)\n\t\t\treturn join(\" : register(\", space, binding, \", space\", space_set, \")\");\n\t\telse\n\t\t\treturn join(\" : register(\", space, binding, \")\");\n\t}\n\telse\n\t\treturn \"\";\n}\n\nvoid CompilerHLSL::emit_modern_uniform(const SPIRVariable &var)\n{\n\tauto &type = get<SPIRType>(var.basetype);\n\tswitch (type.basetype)\n\t{\n\tcase SPIRType::SampledImage:\n\tcase SPIRType::Image:\n\t{\n\t\tbool is_coherent = false;\n\t\tif (type.basetype == SPIRType::Image && type.image.sampled == 2)\n\t\t\tis_coherent = has_decoration(var.self, DecorationCoherent);\n\n\t\tstatement(is_coherent ? \"globallycoherent \" : \"\", image_type_hlsl_modern(type, var.self), \" \",\n\t\t          to_name(var.self), type_to_array_glsl(type), to_resource_binding(var), \";\");\n\n\t\tif (type.basetype == SPIRType::SampledImage && type.image.dim != DimBuffer)\n\t\t{\n\t\t\t// For combined image samplers, also emit a combined image sampler.\n\t\t\tif (is_depth_image(type, var.self))\n\t\t\t\tstatement(\"SamplerComparisonState \", to_sampler_expression(var.self), type_to_array_glsl(type),\n\t\t\t\t          to_resource_binding_sampler(var), \";\");\n\t\t\telse\n\t\t\t\tstatement(\"SamplerState \", to_sampler_expression(var.self), type_to_array_glsl(type),\n\t\t\t\t          to_resource_binding_sampler(var), \";\");\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase SPIRType::Sampler:\n\t\tif (comparison_ids.count(var.self))\n\t\t\tstatement(\"SamplerComparisonState \", to_name(var.self), type_to_array_glsl(type), to_resource_binding(var),\n\t\t\t          \";\");\n\t\telse\n\t\t\tstatement(\"SamplerState \", to_name(var.self), type_to_array_glsl(type), to_resource_binding(var), \";\");\n\t\tbreak;\n\n\tdefault:\n\t\tstatement(variable_decl(var), to_resource_binding(var), \";\");\n\t\tbreak;\n\t}\n}\n\nvoid CompilerHLSL::emit_legacy_uniform(const SPIRVariable &var)\n{\n\tauto &type = get<SPIRType>(var.basetype);\n\tswitch (type.basetype)\n\t{\n\tcase SPIRType::Sampler:\n\tcase SPIRType::Image:\n\t\tSPIRV_CROSS_THROW(\"Separate image and samplers not supported in legacy HLSL.\");\n\n\tdefault:\n\t\tstatement(variable_decl(var), \";\");\n\t\tbreak;\n\t}\n}\n\nvoid CompilerHLSL::emit_uniform(const SPIRVariable &var)\n{\n\tadd_resource_name(var.self);\n\tif (hlsl_options.shader_model >= 40)\n\t\temit_modern_uniform(var);\n\telse\n\t\temit_legacy_uniform(var);\n}\n\nbool CompilerHLSL::emit_complex_bitcast(uint32_t, uint32_t, uint32_t)\n{\n\treturn false;\n}\n\nstring CompilerHLSL::bitcast_glsl_op(const SPIRType &out_type, const SPIRType &in_type)\n{\n\tif (out_type.basetype == SPIRType::UInt && in_type.basetype == SPIRType::Int)\n\t\treturn type_to_glsl(out_type);\n\telse if (out_type.basetype == SPIRType::UInt64 && in_type.basetype == SPIRType::Int64)\n\t\treturn type_to_glsl(out_type);\n\telse if (out_type.basetype == SPIRType::UInt && in_type.basetype == SPIRType::Float)\n\t\treturn \"asuint\";\n\telse if (out_type.basetype == SPIRType::Int && in_type.basetype == SPIRType::UInt)\n\t\treturn type_to_glsl(out_type);\n\telse if (out_type.basetype == SPIRType::Int64 && in_type.basetype == SPIRType::UInt64)\n\t\treturn type_to_glsl(out_type);\n\telse if (out_type.basetype == SPIRType::Int && in_type.basetype == SPIRType::Float)\n\t\treturn \"asint\";\n\telse if (out_type.basetype == SPIRType::Float && in_type.basetype == SPIRType::UInt)\n\t\treturn \"asfloat\";\n\telse if (out_type.basetype == SPIRType::Float && in_type.basetype == SPIRType::Int)\n\t\treturn \"asfloat\";\n\telse if (out_type.basetype == SPIRType::Int64 && in_type.basetype == SPIRType::Double)\n\t\tSPIRV_CROSS_THROW(\"Double to Int64 is not supported in HLSL.\");\n\telse if (out_type.basetype == SPIRType::UInt64 && in_type.basetype == SPIRType::Double)\n\t\tSPIRV_CROSS_THROW(\"Double to UInt64 is not supported in HLSL.\");\n\telse if (out_type.basetype == SPIRType::Double && in_type.basetype == SPIRType::Int64)\n\t\treturn \"asdouble\";\n\telse if (out_type.basetype == SPIRType::Double && in_type.basetype == SPIRType::UInt64)\n\t\treturn \"asdouble\";\n\telse if (out_type.basetype == SPIRType::Half && in_type.basetype == SPIRType::UInt && in_type.vecsize == 1)\n\t{\n\t\tif (!requires_explicit_fp16_packing)\n\t\t{\n\t\t\trequires_explicit_fp16_packing = true;\n\t\t\tforce_recompile();\n\t\t}\n\t\treturn \"spvUnpackFloat2x16\";\n\t}\n\telse if (out_type.basetype == SPIRType::UInt && in_type.basetype == SPIRType::Half && in_type.vecsize == 2)\n\t{\n\t\tif (!requires_explicit_fp16_packing)\n\t\t{\n\t\t\trequires_explicit_fp16_packing = true;\n\t\t\tforce_recompile();\n\t\t}\n\t\treturn \"spvPackFloat2x16\";\n\t}\n\telse if (out_type.basetype == SPIRType::UShort && in_type.basetype == SPIRType::Half)\n\t{\n\t\tif (hlsl_options.shader_model < 40)\n\t\t\tSPIRV_CROSS_THROW(\"Half to UShort requires Shader Model 4.\");\n\t\treturn \"(\" + type_to_glsl(out_type) + \")f32tof16\";\n\t}\n\telse if (out_type.basetype == SPIRType::Half && in_type.basetype == SPIRType::UShort)\n\t{\n\t\tif (hlsl_options.shader_model < 40)\n\t\t\tSPIRV_CROSS_THROW(\"UShort to Half requires Shader Model 4.\");\n\t\treturn \"(\" + type_to_glsl(out_type) + \")f16tof32\";\n\t}\n\telse\n\t\treturn \"\";\n}\n\nvoid CompilerHLSL::emit_glsl_op(uint32_t result_type, uint32_t id, uint32_t eop, const uint32_t *args, uint32_t count)\n{\n\tauto op = static_cast<GLSLstd450>(eop);\n\n\t// If we need to do implicit bitcasts, make sure we do it with the correct type.\n\tuint32_t integer_width = get_integer_width_for_glsl_instruction(op, args, count);\n\tauto int_type = to_signed_basetype(integer_width);\n\tauto uint_type = to_unsigned_basetype(integer_width);\n\n\top = get_remapped_glsl_op(op);\n\n\tswitch (op)\n\t{\n\tcase GLSLstd450InverseSqrt:\n\t\temit_unary_func_op(result_type, id, args[0], \"rsqrt\");\n\t\tbreak;\n\n\tcase GLSLstd450Fract:\n\t\temit_unary_func_op(result_type, id, args[0], \"frac\");\n\t\tbreak;\n\n\tcase GLSLstd450RoundEven:\n\t\tif (hlsl_options.shader_model < 40)\n\t\t\tSPIRV_CROSS_THROW(\"roundEven is not supported in HLSL shader model 2/3.\");\n\t\temit_unary_func_op(result_type, id, args[0], \"round\");\n\t\tbreak;\n\n\tcase GLSLstd450Trunc:\n\t\temit_unary_func_op(result_type, id, args[0], \"trunc\");\n\t\tbreak;\n\n\tcase GLSLstd450Acosh:\n\tcase GLSLstd450Asinh:\n\tcase GLSLstd450Atanh:\n\t\t// These are not supported in HLSL, always emulate them.\n\t\temit_emulated_ahyper_op(result_type, id, args[0], op);\n\t\tbreak;\n\n\tcase GLSLstd450FMix:\n\tcase GLSLstd450IMix:\n\t\temit_trinary_func_op(result_type, id, args[0], args[1], args[2], \"lerp\");\n\t\tbreak;\n\n\tcase GLSLstd450Atan2:\n\t\temit_binary_func_op(result_type, id, args[0], args[1], \"atan2\");\n\t\tbreak;\n\n\tcase GLSLstd450Fma:\n\t\temit_trinary_func_op(result_type, id, args[0], args[1], args[2], \"mad\");\n\t\tbreak;\n\n\tcase GLSLstd450InterpolateAtCentroid:\n\t\temit_unary_func_op(result_type, id, args[0], \"EvaluateAttributeAtCentroid\");\n\t\tbreak;\n\tcase GLSLstd450InterpolateAtSample:\n\t\temit_binary_func_op(result_type, id, args[0], args[1], \"EvaluateAttributeAtSample\");\n\t\tbreak;\n\tcase GLSLstd450InterpolateAtOffset:\n\t\temit_binary_func_op(result_type, id, args[0], args[1], \"EvaluateAttributeSnapped\");\n\t\tbreak;\n\n\tcase GLSLstd450PackHalf2x16:\n\t\tif (!requires_fp16_packing)\n\t\t{\n\t\t\trequires_fp16_packing = true;\n\t\t\tforce_recompile();\n\t\t}\n\t\temit_unary_func_op(result_type, id, args[0], \"spvPackHalf2x16\");\n\t\tbreak;\n\n\tcase GLSLstd450UnpackHalf2x16:\n\t\tif (!requires_fp16_packing)\n\t\t{\n\t\t\trequires_fp16_packing = true;\n\t\t\tforce_recompile();\n\t\t}\n\t\temit_unary_func_op(result_type, id, args[0], \"spvUnpackHalf2x16\");\n\t\tbreak;\n\n\tcase GLSLstd450PackSnorm4x8:\n\t\tif (!requires_snorm8_packing)\n\t\t{\n\t\t\trequires_snorm8_packing = true;\n\t\t\tforce_recompile();\n\t\t}\n\t\temit_unary_func_op(result_type, id, args[0], \"spvPackSnorm4x8\");\n\t\tbreak;\n\n\tcase GLSLstd450UnpackSnorm4x8:\n\t\tif (!requires_snorm8_packing)\n\t\t{\n\t\t\trequires_snorm8_packing = true;\n\t\t\tforce_recompile();\n\t\t}\n\t\temit_unary_func_op(result_type, id, args[0], \"spvUnpackSnorm4x8\");\n\t\tbreak;\n\n\tcase GLSLstd450PackUnorm4x8:\n\t\tif (!requires_unorm8_packing)\n\t\t{\n\t\t\trequires_unorm8_packing = true;\n\t\t\tforce_recompile();\n\t\t}\n\t\temit_unary_func_op(result_type, id, args[0], \"spvPackUnorm4x8\");\n\t\tbreak;\n\n\tcase GLSLstd450UnpackUnorm4x8:\n\t\tif (!requires_unorm8_packing)\n\t\t{\n\t\t\trequires_unorm8_packing = true;\n\t\t\tforce_recompile();\n\t\t}\n\t\temit_unary_func_op(result_type, id, args[0], \"spvUnpackUnorm4x8\");\n\t\tbreak;\n\n\tcase GLSLstd450PackSnorm2x16:\n\t\tif (!requires_snorm16_packing)\n\t\t{\n\t\t\trequires_snorm16_packing = true;\n\t\t\tforce_recompile();\n\t\t}\n\t\temit_unary_func_op(result_type, id, args[0], \"spvPackSnorm2x16\");\n\t\tbreak;\n\n\tcase GLSLstd450UnpackSnorm2x16:\n\t\tif (!requires_snorm16_packing)\n\t\t{\n\t\t\trequires_snorm16_packing = true;\n\t\t\tforce_recompile();\n\t\t}\n\t\temit_unary_func_op(result_type, id, args[0], \"spvUnpackSnorm2x16\");\n\t\tbreak;\n\n\tcase GLSLstd450PackUnorm2x16:\n\t\tif (!requires_unorm16_packing)\n\t\t{\n\t\t\trequires_unorm16_packing = true;\n\t\t\tforce_recompile();\n\t\t}\n\t\temit_unary_func_op(result_type, id, args[0], \"spvPackUnorm2x16\");\n\t\tbreak;\n\n\tcase GLSLstd450UnpackUnorm2x16:\n\t\tif (!requires_unorm16_packing)\n\t\t{\n\t\t\trequires_unorm16_packing = true;\n\t\t\tforce_recompile();\n\t\t}\n\t\temit_unary_func_op(result_type, id, args[0], \"spvUnpackUnorm2x16\");\n\t\tbreak;\n\n\tcase GLSLstd450PackDouble2x32:\n\tcase GLSLstd450UnpackDouble2x32:\n\t\tSPIRV_CROSS_THROW(\"packDouble2x32/unpackDouble2x32 not supported in HLSL.\");\n\n\tcase GLSLstd450FindILsb:\n\t{\n\t\tauto basetype = expression_type(args[0]).basetype;\n\t\temit_unary_func_op_cast(result_type, id, args[0], \"firstbitlow\", basetype, basetype);\n\t\tbreak;\n\t}\n\n\tcase GLSLstd450FindSMsb:\n\t\temit_unary_func_op_cast(result_type, id, args[0], \"firstbithigh\", int_type, int_type);\n\t\tbreak;\n\n\tcase GLSLstd450FindUMsb:\n\t\temit_unary_func_op_cast(result_type, id, args[0], \"firstbithigh\", uint_type, uint_type);\n\t\tbreak;\n\n\tcase GLSLstd450MatrixInverse:\n\t{\n\t\tauto &type = get<SPIRType>(result_type);\n\t\tif (type.vecsize == 2 && type.columns == 2)\n\t\t{\n\t\t\tif (!requires_inverse_2x2)\n\t\t\t{\n\t\t\t\trequires_inverse_2x2 = true;\n\t\t\t\tforce_recompile();\n\t\t\t}\n\t\t}\n\t\telse if (type.vecsize == 3 && type.columns == 3)\n\t\t{\n\t\t\tif (!requires_inverse_3x3)\n\t\t\t{\n\t\t\t\trequires_inverse_3x3 = true;\n\t\t\t\tforce_recompile();\n\t\t\t}\n\t\t}\n\t\telse if (type.vecsize == 4 && type.columns == 4)\n\t\t{\n\t\t\tif (!requires_inverse_4x4)\n\t\t\t{\n\t\t\t\trequires_inverse_4x4 = true;\n\t\t\t\tforce_recompile();\n\t\t\t}\n\t\t}\n\t\temit_unary_func_op(result_type, id, args[0], \"spvInverse\");\n\t\tbreak;\n\t}\n\n\tcase GLSLstd450Normalize:\n\t\t// HLSL does not support scalar versions here.\n\t\tif (expression_type(args[0]).vecsize == 1)\n\t\t{\n\t\t\t// Returns -1 or 1 for valid input, sign() does the job.\n\t\t\temit_unary_func_op(result_type, id, args[0], \"sign\");\n\t\t}\n\t\telse\n\t\t\tCompilerGLSL::emit_glsl_op(result_type, id, eop, args, count);\n\t\tbreak;\n\n\tcase GLSLstd450Reflect:\n\t\tif (get<SPIRType>(result_type).vecsize == 1)\n\t\t{\n\t\t\tif (!requires_scalar_reflect)\n\t\t\t{\n\t\t\t\trequires_scalar_reflect = true;\n\t\t\t\tforce_recompile();\n\t\t\t}\n\t\t\temit_binary_func_op(result_type, id, args[0], args[1], \"spvReflect\");\n\t\t}\n\t\telse\n\t\t\tCompilerGLSL::emit_glsl_op(result_type, id, eop, args, count);\n\t\tbreak;\n\n\tcase GLSLstd450Refract:\n\t\tif (get<SPIRType>(result_type).vecsize == 1)\n\t\t{\n\t\t\tif (!requires_scalar_refract)\n\t\t\t{\n\t\t\t\trequires_scalar_refract = true;\n\t\t\t\tforce_recompile();\n\t\t\t}\n\t\t\temit_trinary_func_op(result_type, id, args[0], args[1], args[2], \"spvRefract\");\n\t\t}\n\t\telse\n\t\t\tCompilerGLSL::emit_glsl_op(result_type, id, eop, args, count);\n\t\tbreak;\n\n\tcase GLSLstd450FaceForward:\n\t\tif (get<SPIRType>(result_type).vecsize == 1)\n\t\t{\n\t\t\tif (!requires_scalar_faceforward)\n\t\t\t{\n\t\t\t\trequires_scalar_faceforward = true;\n\t\t\t\tforce_recompile();\n\t\t\t}\n\t\t\temit_trinary_func_op(result_type, id, args[0], args[1], args[2], \"spvFaceForward\");\n\t\t}\n\t\telse\n\t\t\tCompilerGLSL::emit_glsl_op(result_type, id, eop, args, count);\n\t\tbreak;\n\n\tdefault:\n\t\tCompilerGLSL::emit_glsl_op(result_type, id, eop, args, count);\n\t\tbreak;\n\t}\n}\n\nvoid CompilerHLSL::read_access_chain_array(const string &lhs, const SPIRAccessChain &chain)\n{\n\tauto &type = get<SPIRType>(chain.basetype);\n\n\t// Need to use a reserved identifier here since it might shadow an identifier in the access chain input or other loops.\n\tauto ident = get_unique_identifier();\n\n\tstatement(\"[unroll]\");\n\tstatement(\"for (int \", ident, \" = 0; \", ident, \" < \", to_array_size(type, uint32_t(type.array.size() - 1)), \"; \",\n\t          ident, \"++)\");\n\tbegin_scope();\n\tauto subchain = chain;\n\tsubchain.dynamic_index = join(ident, \" * \", chain.array_stride, \" + \", chain.dynamic_index);\n\tsubchain.basetype = type.parent_type;\n\tif (!get<SPIRType>(subchain.basetype).array.empty())\n\t\tsubchain.array_stride = get_decoration(subchain.basetype, DecorationArrayStride);\n\tread_access_chain(nullptr, join(lhs, \"[\", ident, \"]\"), subchain);\n\tend_scope();\n}\n\nvoid CompilerHLSL::read_access_chain_struct(const string &lhs, const SPIRAccessChain &chain)\n{\n\tauto &type = get<SPIRType>(chain.basetype);\n\tauto subchain = chain;\n\tuint32_t member_count = uint32_t(type.member_types.size());\n\n\tfor (uint32_t i = 0; i < member_count; i++)\n\t{\n\t\tuint32_t offset = type_struct_member_offset(type, i);\n\t\tsubchain.static_index = chain.static_index + offset;\n\t\tsubchain.basetype = type.member_types[i];\n\n\t\tsubchain.matrix_stride = 0;\n\t\tsubchain.array_stride = 0;\n\t\tsubchain.row_major_matrix = false;\n\n\t\tauto &member_type = get<SPIRType>(subchain.basetype);\n\t\tif (member_type.columns > 1)\n\t\t{\n\t\t\tsubchain.matrix_stride = type_struct_member_matrix_stride(type, i);\n\t\t\tsubchain.row_major_matrix = has_member_decoration(type.self, i, DecorationRowMajor);\n\t\t}\n\n\t\tif (!member_type.array.empty())\n\t\t\tsubchain.array_stride = type_struct_member_array_stride(type, i);\n\n\t\tread_access_chain(nullptr, join(lhs, \".\", to_member_name(type, i)), subchain);\n\t}\n}\n\nvoid CompilerHLSL::read_access_chain(string *expr, const string &lhs, const SPIRAccessChain &chain)\n{\n\tauto &type = get<SPIRType>(chain.basetype);\n\n\tSPIRType target_type { is_scalar(type) ? OpTypeInt : type.op };\n\ttarget_type.basetype = SPIRType::UInt;\n\ttarget_type.vecsize = type.vecsize;\n\ttarget_type.columns = type.columns;\n\n\tif (!type.array.empty())\n\t{\n\t\tread_access_chain_array(lhs, chain);\n\t\treturn;\n\t}\n\telse if (type.basetype == SPIRType::Struct)\n\t{\n\t\tread_access_chain_struct(lhs, chain);\n\t\treturn;\n\t}\n\telse if (type.width != 32 && !hlsl_options.enable_16bit_types)\n\t\tSPIRV_CROSS_THROW(\"Reading types other than 32-bit from ByteAddressBuffer not yet supported, unless SM 6.2 and \"\n\t\t                  \"native 16-bit types are enabled.\");\n\n\tstring base = chain.base;\n\tif (has_decoration(chain.self, DecorationNonUniform))\n\t\tconvert_non_uniform_expression(base, chain.self);\n\n\tbool templated_load = hlsl_options.shader_model >= 62;\n\tstring load_expr;\n\n\tstring template_expr;\n\tif (templated_load)\n\t\ttemplate_expr = join(\"<\", type_to_glsl(type), \">\");\n\n\t// Load a vector or scalar.\n\tif (type.columns == 1 && !chain.row_major_matrix)\n\t{\n\t\tconst char *load_op = nullptr;\n\t\tswitch (type.vecsize)\n\t\t{\n\t\tcase 1:\n\t\t\tload_op = \"Load\";\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tload_op = \"Load2\";\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tload_op = \"Load3\";\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tload_op = \"Load4\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tSPIRV_CROSS_THROW(\"Unknown vector size.\");\n\t\t}\n\n\t\tif (templated_load)\n\t\t\tload_op = \"Load\";\n\n\t\tload_expr = join(base, \".\", load_op, template_expr, \"(\", chain.dynamic_index, chain.static_index, \")\");\n\t}\n\telse if (type.columns == 1)\n\t{\n\t\t// Strided load since we are loading a column from a row-major matrix.\n\t\tif (templated_load)\n\t\t{\n\t\t\tauto scalar_type = type;\n\t\t\tscalar_type.vecsize = 1;\n\t\t\tscalar_type.columns = 1;\n\t\t\ttemplate_expr = join(\"<\", type_to_glsl(scalar_type), \">\");\n\t\t\tif (type.vecsize > 1)\n\t\t\t\tload_expr += type_to_glsl(type) + \"(\";\n\t\t}\n\t\telse if (type.vecsize > 1)\n\t\t{\n\t\t\tload_expr = type_to_glsl(target_type);\n\t\t\tload_expr += \"(\";\n\t\t}\n\n\t\tfor (uint32_t r = 0; r < type.vecsize; r++)\n\t\t{\n\t\t\tload_expr += join(base, \".Load\", template_expr, \"(\", chain.dynamic_index,\n\t\t\t                  chain.static_index + r * chain.matrix_stride, \")\");\n\t\t\tif (r + 1 < type.vecsize)\n\t\t\t\tload_expr += \", \";\n\t\t}\n\n\t\tif (type.vecsize > 1)\n\t\t\tload_expr += \")\";\n\t}\n\telse if (!chain.row_major_matrix)\n\t{\n\t\t// Load a matrix, column-major, the easy case.\n\t\tconst char *load_op = nullptr;\n\t\tswitch (type.vecsize)\n\t\t{\n\t\tcase 1:\n\t\t\tload_op = \"Load\";\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tload_op = \"Load2\";\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tload_op = \"Load3\";\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tload_op = \"Load4\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tSPIRV_CROSS_THROW(\"Unknown vector size.\");\n\t\t}\n\n\t\tif (templated_load)\n\t\t{\n\t\t\tauto vector_type = type;\n\t\t\tvector_type.columns = 1;\n\t\t\ttemplate_expr = join(\"<\", type_to_glsl(vector_type), \">\");\n\t\t\tload_expr = type_to_glsl(type);\n\t\t\tload_op = \"Load\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Note, this loading style in HLSL is *actually* row-major, but we always treat matrices as transposed in this backend,\n\t\t\t// so row-major is technically column-major ...\n\t\t\tload_expr = type_to_glsl(target_type);\n\t\t}\n\t\tload_expr += \"(\";\n\n\t\tfor (uint32_t c = 0; c < type.columns; c++)\n\t\t{\n\t\t\tload_expr += join(base, \".\", load_op, template_expr, \"(\", chain.dynamic_index,\n\t\t\t                  chain.static_index + c * chain.matrix_stride, \")\");\n\t\t\tif (c + 1 < type.columns)\n\t\t\t\tload_expr += \", \";\n\t\t}\n\t\tload_expr += \")\";\n\t}\n\telse\n\t{\n\t\t// Pick out elements one by one ... Hopefully compilers are smart enough to recognize this pattern\n\t\t// considering HLSL is \"row-major decl\", but \"column-major\" memory layout (basically implicit transpose model, ugh) ...\n\n\t\tif (templated_load)\n\t\t{\n\t\t\tload_expr = type_to_glsl(type);\n\t\t\tauto scalar_type = type;\n\t\t\tscalar_type.vecsize = 1;\n\t\t\tscalar_type.columns = 1;\n\t\t\ttemplate_expr = join(\"<\", type_to_glsl(scalar_type), \">\");\n\t\t}\n\t\telse\n\t\t\tload_expr = type_to_glsl(target_type);\n\n\t\tload_expr += \"(\";\n\n\t\tfor (uint32_t c = 0; c < type.columns; c++)\n\t\t{\n\t\t\tfor (uint32_t r = 0; r < type.vecsize; r++)\n\t\t\t{\n\t\t\t\tload_expr += join(base, \".Load\", template_expr, \"(\", chain.dynamic_index,\n\t\t\t\t                  chain.static_index + c * (type.width / 8) + r * chain.matrix_stride, \")\");\n\n\t\t\t\tif ((r + 1 < type.vecsize) || (c + 1 < type.columns))\n\t\t\t\t\tload_expr += \", \";\n\t\t\t}\n\t\t}\n\t\tload_expr += \")\";\n\t}\n\n\tif (!templated_load)\n\t{\n\t\tauto bitcast_op = bitcast_glsl_op(type, target_type);\n\t\tif (!bitcast_op.empty())\n\t\t\tload_expr = join(bitcast_op, \"(\", load_expr, \")\");\n\t}\n\n\tif (lhs.empty())\n\t{\n\t\tassert(expr);\n\t\t*expr = std::move(load_expr);\n\t}\n\telse\n\t\tstatement(lhs, \" = \", load_expr, \";\");\n}\n\nvoid CompilerHLSL::emit_load(const Instruction &instruction)\n{\n\tauto ops = stream(instruction);\n\n\tauto *chain = maybe_get<SPIRAccessChain>(ops[2]);\n\tif (chain)\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tuint32_t ptr = ops[2];\n\n\t\tauto &type = get<SPIRType>(result_type);\n\t\tbool composite_load = !type.array.empty() || type.basetype == SPIRType::Struct;\n\n\t\tif (composite_load)\n\t\t{\n\t\t\t// We cannot make this work in one single expression as we might have nested structures and arrays,\n\t\t\t// so unroll the load to an uninitialized temporary.\n\t\t\temit_uninitialized_temporary_expression(result_type, id);\n\t\t\tread_access_chain(nullptr, to_expression(id), *chain);\n\t\t\ttrack_expression_read(chain->self);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstring load_expr;\n\t\t\tread_access_chain(&load_expr, \"\", *chain);\n\n\t\t\tbool forward = should_forward(ptr) && forced_temporaries.find(id) == end(forced_temporaries);\n\n\t\t\t// If we are forwarding this load,\n\t\t\t// don't register the read to access chain here, defer that to when we actually use the expression,\n\t\t\t// using the add_implied_read_expression mechanism.\n\t\t\tif (!forward)\n\t\t\t\ttrack_expression_read(chain->self);\n\n\t\t\t// Do not forward complex load sequences like matrices, structs and arrays.\n\t\t\tif (type.columns > 1)\n\t\t\t\tforward = false;\n\n\t\t\tauto &e = emit_op(result_type, id, load_expr, forward, true);\n\t\t\te.need_transpose = false;\n\t\t\tregister_read(id, ptr, forward);\n\t\t\tinherit_expression_dependencies(id, ptr);\n\t\t\tif (forward)\n\t\t\t\tadd_implied_read_expression(e, chain->self);\n\t\t}\n\t}\n\telse\n\t\tCompilerGLSL::emit_instruction(instruction);\n}\n\nvoid CompilerHLSL::write_access_chain_array(const SPIRAccessChain &chain, uint32_t value,\n                                            const SmallVector<uint32_t> &composite_chain)\n{\n\tauto *ptype = &get<SPIRType>(chain.basetype);\n\twhile (ptype->pointer)\n\t{\n\t\tptype = &get<SPIRType>(ptype->basetype);\n\t}\n\tauto &type = *ptype;\n\n\t// Need to use a reserved identifier here since it might shadow an identifier in the access chain input or other loops.\n\tauto ident = get_unique_identifier();\n\n\tuint32_t id = ir.increase_bound_by(2);\n\tuint32_t int_type_id = id + 1;\n\tSPIRType int_type { OpTypeInt };\n\tint_type.basetype = SPIRType::Int;\n\tint_type.width = 32;\n\tset<SPIRType>(int_type_id, int_type);\n\tset<SPIRExpression>(id, ident, int_type_id, true);\n\tset_name(id, ident);\n\tsuppressed_usage_tracking.insert(id);\n\n\tstatement(\"[unroll]\");\n\tstatement(\"for (int \", ident, \" = 0; \", ident, \" < \", to_array_size(type, uint32_t(type.array.size() - 1)), \"; \",\n\t          ident, \"++)\");\n\tbegin_scope();\n\tauto subchain = chain;\n\tsubchain.dynamic_index = join(ident, \" * \", chain.array_stride, \" + \", chain.dynamic_index);\n\tsubchain.basetype = type.parent_type;\n\n\t// Forcefully allow us to use an ID here by setting MSB.\n\tauto subcomposite_chain = composite_chain;\n\tsubcomposite_chain.push_back(0x80000000u | id);\n\n\tif (!get<SPIRType>(subchain.basetype).array.empty())\n\t\tsubchain.array_stride = get_decoration(subchain.basetype, DecorationArrayStride);\n\n\twrite_access_chain(subchain, value, subcomposite_chain);\n\tend_scope();\n}\n\nvoid CompilerHLSL::write_access_chain_struct(const SPIRAccessChain &chain, uint32_t value,\n                                             const SmallVector<uint32_t> &composite_chain)\n{\n\tauto &type = get<SPIRType>(chain.basetype);\n\tuint32_t member_count = uint32_t(type.member_types.size());\n\tauto subchain = chain;\n\n\tauto subcomposite_chain = composite_chain;\n\tsubcomposite_chain.push_back(0);\n\n\tfor (uint32_t i = 0; i < member_count; i++)\n\t{\n\t\tuint32_t offset = type_struct_member_offset(type, i);\n\t\tsubchain.static_index = chain.static_index + offset;\n\t\tsubchain.basetype = type.member_types[i];\n\n\t\tsubchain.matrix_stride = 0;\n\t\tsubchain.array_stride = 0;\n\t\tsubchain.row_major_matrix = false;\n\n\t\tauto &member_type = get<SPIRType>(subchain.basetype);\n\t\tif (member_type.columns > 1)\n\t\t{\n\t\t\tsubchain.matrix_stride = type_struct_member_matrix_stride(type, i);\n\t\t\tsubchain.row_major_matrix = has_member_decoration(type.self, i, DecorationRowMajor);\n\t\t}\n\n\t\tif (!member_type.array.empty())\n\t\t\tsubchain.array_stride = type_struct_member_array_stride(type, i);\n\n\t\tsubcomposite_chain.back() = i;\n\t\twrite_access_chain(subchain, value, subcomposite_chain);\n\t}\n}\n\nstring CompilerHLSL::write_access_chain_value(uint32_t value, const SmallVector<uint32_t> &composite_chain,\n                                              bool enclose)\n{\n\tstring ret;\n\tif (composite_chain.empty())\n\t\tret = to_expression(value);\n\telse\n\t{\n\t\tAccessChainMeta meta;\n\t\tret = access_chain_internal(value, composite_chain.data(), uint32_t(composite_chain.size()),\n\t\t                            ACCESS_CHAIN_INDEX_IS_LITERAL_BIT | ACCESS_CHAIN_LITERAL_MSB_FORCE_ID, &meta);\n\t}\n\n\tif (enclose)\n\t\tret = enclose_expression(ret);\n\treturn ret;\n}\n\nvoid CompilerHLSL::write_access_chain(const SPIRAccessChain &chain, uint32_t value,\n                                      const SmallVector<uint32_t> &composite_chain)\n{\n\tauto &type = get<SPIRType>(chain.basetype);\n\n\t// Make sure we trigger a read of the constituents in the access chain.\n\ttrack_expression_read(chain.self);\n\n\tSPIRType target_type { is_scalar(type) ? OpTypeInt : type.op };\n\ttarget_type.basetype = SPIRType::UInt;\n\ttarget_type.vecsize = type.vecsize;\n\ttarget_type.columns = type.columns;\n\n\tif (!type.array.empty())\n\t{\n\t\twrite_access_chain_array(chain, value, composite_chain);\n\t\tregister_write(chain.self);\n\t\treturn;\n\t}\n\telse if (type.basetype == SPIRType::Struct)\n\t{\n\t\twrite_access_chain_struct(chain, value, composite_chain);\n\t\tregister_write(chain.self);\n\t\treturn;\n\t}\n\telse if (type.width != 32 && !hlsl_options.enable_16bit_types)\n\t\tSPIRV_CROSS_THROW(\"Writing types other than 32-bit to RWByteAddressBuffer not yet supported, unless SM 6.2 and \"\n\t\t                  \"native 16-bit types are enabled.\");\n\n\tbool templated_store = hlsl_options.shader_model >= 62;\n\n\tauto base = chain.base;\n\tif (has_decoration(chain.self, DecorationNonUniform))\n\t\tconvert_non_uniform_expression(base, chain.self);\n\n\tstring template_expr;\n\tif (templated_store)\n\t\ttemplate_expr = join(\"<\", type_to_glsl(type), \">\");\n\n\tif (type.columns == 1 && !chain.row_major_matrix)\n\t{\n\t\tconst char *store_op = nullptr;\n\t\tswitch (type.vecsize)\n\t\t{\n\t\tcase 1:\n\t\t\tstore_op = \"Store\";\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tstore_op = \"Store2\";\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tstore_op = \"Store3\";\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tstore_op = \"Store4\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tSPIRV_CROSS_THROW(\"Unknown vector size.\");\n\t\t}\n\n\t\tauto store_expr = write_access_chain_value(value, composite_chain, false);\n\n\t\tif (!templated_store)\n\t\t{\n\t\t\tauto bitcast_op = bitcast_glsl_op(target_type, type);\n\t\t\tif (!bitcast_op.empty())\n\t\t\t\tstore_expr = join(bitcast_op, \"(\", store_expr, \")\");\n\t\t}\n\t\telse\n\t\t\tstore_op = \"Store\";\n\t\tstatement(base, \".\", store_op, template_expr, \"(\", chain.dynamic_index, chain.static_index, \", \",\n\t\t          store_expr, \");\");\n\t}\n\telse if (type.columns == 1)\n\t{\n\t\tif (templated_store)\n\t\t{\n\t\t\tauto scalar_type = type;\n\t\t\tscalar_type.vecsize = 1;\n\t\t\tscalar_type.columns = 1;\n\t\t\ttemplate_expr = join(\"<\", type_to_glsl(scalar_type), \">\");\n\t\t}\n\n\t\t// Strided store.\n\t\tfor (uint32_t r = 0; r < type.vecsize; r++)\n\t\t{\n\t\t\tauto store_expr = write_access_chain_value(value, composite_chain, true);\n\t\t\tif (type.vecsize > 1)\n\t\t\t{\n\t\t\t\tstore_expr += \".\";\n\t\t\t\tstore_expr += index_to_swizzle(r);\n\t\t\t}\n\t\t\tremove_duplicate_swizzle(store_expr);\n\n\t\t\tif (!templated_store)\n\t\t\t{\n\t\t\t\tauto bitcast_op = bitcast_glsl_op(target_type, type);\n\t\t\t\tif (!bitcast_op.empty())\n\t\t\t\t\tstore_expr = join(bitcast_op, \"(\", store_expr, \")\");\n\t\t\t}\n\n\t\t\tstatement(base, \".Store\", template_expr, \"(\", chain.dynamic_index,\n\t\t\t          chain.static_index + chain.matrix_stride * r, \", \", store_expr, \");\");\n\t\t}\n\t}\n\telse if (!chain.row_major_matrix)\n\t{\n\t\tconst char *store_op = nullptr;\n\t\tswitch (type.vecsize)\n\t\t{\n\t\tcase 1:\n\t\t\tstore_op = \"Store\";\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tstore_op = \"Store2\";\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tstore_op = \"Store3\";\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tstore_op = \"Store4\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tSPIRV_CROSS_THROW(\"Unknown vector size.\");\n\t\t}\n\n\t\tif (templated_store)\n\t\t{\n\t\t\tstore_op = \"Store\";\n\t\t\tauto vector_type = type;\n\t\t\tvector_type.columns = 1;\n\t\t\ttemplate_expr = join(\"<\", type_to_glsl(vector_type), \">\");\n\t\t}\n\n\t\tfor (uint32_t c = 0; c < type.columns; c++)\n\t\t{\n\t\t\tauto store_expr = join(write_access_chain_value(value, composite_chain, true), \"[\", c, \"]\");\n\n\t\t\tif (!templated_store)\n\t\t\t{\n\t\t\t\tauto bitcast_op = bitcast_glsl_op(target_type, type);\n\t\t\t\tif (!bitcast_op.empty())\n\t\t\t\t\tstore_expr = join(bitcast_op, \"(\", store_expr, \")\");\n\t\t\t}\n\n\t\t\tstatement(base, \".\", store_op, template_expr, \"(\", chain.dynamic_index,\n\t\t\t          chain.static_index + c * chain.matrix_stride, \", \", store_expr, \");\");\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (templated_store)\n\t\t{\n\t\t\tauto scalar_type = type;\n\t\t\tscalar_type.vecsize = 1;\n\t\t\tscalar_type.columns = 1;\n\t\t\ttemplate_expr = join(\"<\", type_to_glsl(scalar_type), \">\");\n\t\t}\n\n\t\tfor (uint32_t r = 0; r < type.vecsize; r++)\n\t\t{\n\t\t\tfor (uint32_t c = 0; c < type.columns; c++)\n\t\t\t{\n\t\t\t\tauto store_expr =\n\t\t\t\t    join(write_access_chain_value(value, composite_chain, true), \"[\", c, \"].\", index_to_swizzle(r));\n\t\t\t\tremove_duplicate_swizzle(store_expr);\n\t\t\t\tauto bitcast_op = bitcast_glsl_op(target_type, type);\n\t\t\t\tif (!bitcast_op.empty())\n\t\t\t\t\tstore_expr = join(bitcast_op, \"(\", store_expr, \")\");\n\t\t\t\tstatement(base, \".Store\", template_expr, \"(\", chain.dynamic_index,\n\t\t\t\t          chain.static_index + c * (type.width / 8) + r * chain.matrix_stride, \", \", store_expr, \");\");\n\t\t\t}\n\t\t}\n\t}\n\n\tregister_write(chain.self);\n}\n\nvoid CompilerHLSL::emit_store(const Instruction &instruction)\n{\n\tauto ops = stream(instruction);\n\tif (options.vertex.flip_vert_y)\n\t{\n\t\tauto *expr = maybe_get<SPIRExpression>(ops[0]);\n\t\tif (expr != nullptr && expr->access_meshlet_position_y)\n\t\t{\n\t\t\tauto lhs = to_dereferenced_expression(ops[0]);\n\t\t\tauto rhs = to_unpacked_expression(ops[1]);\n\t\t\tstatement(lhs, \" = spvFlipVertY(\", rhs, \");\");\n\t\t\tregister_write(ops[0]);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tauto *chain = maybe_get<SPIRAccessChain>(ops[0]);\n\tif (chain)\n\t\twrite_access_chain(*chain, ops[1], {});\n\telse\n\t\tCompilerGLSL::emit_instruction(instruction);\n}\n\nvoid CompilerHLSL::emit_access_chain(const Instruction &instruction)\n{\n\tauto ops = stream(instruction);\n\tuint32_t length = instruction.length;\n\n\tbool need_byte_access_chain = false;\n\tauto &type = expression_type(ops[2]);\n\tconst auto *chain = maybe_get<SPIRAccessChain>(ops[2]);\n\n\tif (chain)\n\t{\n\t\t// Keep tacking on an existing access chain.\n\t\tneed_byte_access_chain = true;\n\t}\n\telse if (type.storage == StorageClassStorageBuffer || has_decoration(type.self, DecorationBufferBlock))\n\t{\n\t\t// If we are starting to poke into an SSBO, we are dealing with ByteAddressBuffers, and we need\n\t\t// to emit SPIRAccessChain rather than a plain SPIRExpression.\n\t\tuint32_t chain_arguments = length - 3;\n\t\tif (chain_arguments > type.array.size())\n\t\t\tneed_byte_access_chain = true;\n\t}\n\n\tif (need_byte_access_chain)\n\t{\n\t\t// If we have a chain variable, we are already inside the SSBO, and any array type will refer to arrays within a block,\n\t\t// and not array of SSBO.\n\t\tuint32_t to_plain_buffer_length = chain ? 0u : static_cast<uint32_t>(type.array.size());\n\n\t\tauto *backing_variable = maybe_get_backing_variable(ops[2]);\n\n\t\tif (backing_variable != nullptr && is_user_type_structured(backing_variable->self))\n\t\t{\n\t\t\tCompilerGLSL::emit_instruction(instruction);\n\t\t\treturn;\n\t\t}\n\n\t\tstring base;\n\t\tif (to_plain_buffer_length != 0)\n\t\t\tbase = access_chain(ops[2], &ops[3], to_plain_buffer_length, get<SPIRType>(ops[0]));\n\t\telse if (chain)\n\t\t\tbase = chain->base;\n\t\telse\n\t\t\tbase = to_expression(ops[2]);\n\n\t\t// Start traversing type hierarchy at the proper non-pointer types.\n\t\tauto *basetype = &get_pointee_type(type);\n\n\t\t// Traverse the type hierarchy down to the actual buffer types.\n\t\tfor (uint32_t i = 0; i < to_plain_buffer_length; i++)\n\t\t{\n\t\t\tassert(basetype->parent_type);\n\t\t\tbasetype = &get<SPIRType>(basetype->parent_type);\n\t\t}\n\n\t\tuint32_t matrix_stride = 0;\n\t\tuint32_t array_stride = 0;\n\t\tbool row_major_matrix = false;\n\n\t\t// Inherit matrix information.\n\t\tif (chain)\n\t\t{\n\t\t\tmatrix_stride = chain->matrix_stride;\n\t\t\trow_major_matrix = chain->row_major_matrix;\n\t\t\tarray_stride = chain->array_stride;\n\t\t}\n\n\t\tauto offsets = flattened_access_chain_offset(*basetype, &ops[3 + to_plain_buffer_length],\n\t\t                                             length - 3 - to_plain_buffer_length, 0, 1, &row_major_matrix,\n\t\t                                             &matrix_stride, &array_stride);\n\n\t\tauto &e = set<SPIRAccessChain>(ops[1], ops[0], type.storage, base, offsets.first, offsets.second);\n\t\te.row_major_matrix = row_major_matrix;\n\t\te.matrix_stride = matrix_stride;\n\t\te.array_stride = array_stride;\n\t\te.immutable = should_forward(ops[2]);\n\t\te.loaded_from = backing_variable ? backing_variable->self : ID(0);\n\n\t\tif (chain)\n\t\t{\n\t\t\te.dynamic_index += chain->dynamic_index;\n\t\t\te.static_index += chain->static_index;\n\t\t}\n\n\t\tfor (uint32_t i = 2; i < length; i++)\n\t\t{\n\t\t\tinherit_expression_dependencies(ops[1], ops[i]);\n\t\t\tadd_implied_read_expression(e, ops[i]);\n\t\t}\n\t}\n\telse\n\t{\n\t\tCompilerGLSL::emit_instruction(instruction);\n\t}\n}\n\nvoid CompilerHLSL::emit_atomic(const uint32_t *ops, uint32_t length, spv::Op op)\n{\n\tconst char *atomic_op = nullptr;\n\n\tstring value_expr;\n\tif (op != OpAtomicIDecrement && op != OpAtomicIIncrement && op != OpAtomicLoad && op != OpAtomicStore)\n\t\tvalue_expr = to_expression(ops[op == OpAtomicCompareExchange ? 6 : 5]);\n\n\tbool is_atomic_store = false;\n\n\tswitch (op)\n\t{\n\tcase OpAtomicIIncrement:\n\t\tatomic_op = \"InterlockedAdd\";\n\t\tvalue_expr = \"1\";\n\t\tbreak;\n\n\tcase OpAtomicIDecrement:\n\t\tatomic_op = \"InterlockedAdd\";\n\t\tvalue_expr = \"-1\";\n\t\tbreak;\n\n\tcase OpAtomicLoad:\n\t\tatomic_op = \"InterlockedAdd\";\n\t\tvalue_expr = \"0\";\n\t\tbreak;\n\n\tcase OpAtomicISub:\n\t\tatomic_op = \"InterlockedAdd\";\n\t\tvalue_expr = join(\"-\", enclose_expression(value_expr));\n\t\tbreak;\n\n\tcase OpAtomicSMin:\n\tcase OpAtomicUMin:\n\t\tatomic_op = \"InterlockedMin\";\n\t\tbreak;\n\n\tcase OpAtomicSMax:\n\tcase OpAtomicUMax:\n\t\tatomic_op = \"InterlockedMax\";\n\t\tbreak;\n\n\tcase OpAtomicAnd:\n\t\tatomic_op = \"InterlockedAnd\";\n\t\tbreak;\n\n\tcase OpAtomicOr:\n\t\tatomic_op = \"InterlockedOr\";\n\t\tbreak;\n\n\tcase OpAtomicXor:\n\t\tatomic_op = \"InterlockedXor\";\n\t\tbreak;\n\n\tcase OpAtomicIAdd:\n\t\tatomic_op = \"InterlockedAdd\";\n\t\tbreak;\n\n\tcase OpAtomicExchange:\n\t\tatomic_op = \"InterlockedExchange\";\n\t\tbreak;\n\n\tcase OpAtomicStore:\n\t\tatomic_op = \"InterlockedExchange\";\n\t\tis_atomic_store = true;\n\t\tbreak;\n\n\tcase OpAtomicCompareExchange:\n\t\tif (length < 8)\n\t\t\tSPIRV_CROSS_THROW(\"Not enough data for opcode.\");\n\t\tatomic_op = \"InterlockedCompareExchange\";\n\t\tvalue_expr = join(to_expression(ops[7]), \", \", value_expr);\n\t\tbreak;\n\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Unknown atomic opcode.\");\n\t}\n\n\tif (is_atomic_store)\n\t{\n\t\tauto &data_type = expression_type(ops[0]);\n\t\tauto *chain = maybe_get<SPIRAccessChain>(ops[0]);\n\n\t\tauto &tmp_id = extra_sub_expressions[ops[0]];\n\t\tif (!tmp_id)\n\t\t{\n\t\t\ttmp_id = ir.increase_bound_by(1);\n\t\t\temit_uninitialized_temporary_expression(get_pointee_type(data_type).self, tmp_id);\n\t\t}\n\n\t\tif (data_type.storage == StorageClassImage || !chain)\n\t\t{\n\t\t\tstatement(atomic_op, \"(\", to_non_uniform_aware_expression(ops[0]), \", \",\n\t\t\t          to_expression(ops[3]), \", \", to_expression(tmp_id), \");\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstring base = chain->base;\n\t\t\tif (has_decoration(chain->self, DecorationNonUniform))\n\t\t\t\tconvert_non_uniform_expression(base, chain->self);\n\t\t\t// RWByteAddress buffer is always uint in its underlying type.\n\t\t\tstatement(base, \".\", atomic_op, \"(\", chain->dynamic_index, chain->static_index, \", \",\n\t\t\t          to_expression(ops[3]), \", \", to_expression(tmp_id), \");\");\n\t\t}\n\t}\n\telse\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tforced_temporaries.insert(ops[1]);\n\n\t\tauto &type = get<SPIRType>(result_type);\n\t\tstatement(variable_decl(type, to_name(id)), \";\");\n\n\t\tauto &data_type = expression_type(ops[2]);\n\t\tauto *chain = maybe_get<SPIRAccessChain>(ops[2]);\n\t\tSPIRType::BaseType expr_type;\n\t\tif (data_type.storage == StorageClassImage || !chain)\n\t\t{\n\t\t\tstatement(atomic_op, \"(\", to_non_uniform_aware_expression(ops[2]), \", \", value_expr, \", \", to_name(id), \");\");\n\t\t\texpr_type = data_type.basetype;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// RWByteAddress buffer is always uint in its underlying type.\n\t\t\tstring base = chain->base;\n\t\t\tif (has_decoration(chain->self, DecorationNonUniform))\n\t\t\t\tconvert_non_uniform_expression(base, chain->self);\n\t\t\texpr_type = SPIRType::UInt;\n\t\t\tstatement(base, \".\", atomic_op, \"(\", chain->dynamic_index, chain->static_index, \", \", value_expr,\n\t\t\t          \", \", to_name(id), \");\");\n\t\t}\n\n\t\tauto expr = bitcast_expression(type, expr_type, to_name(id));\n\t\tset<SPIRExpression>(id, expr, result_type, true);\n\t}\n\tflush_all_atomic_capable_variables();\n}\n\nvoid CompilerHLSL::emit_subgroup_op(const Instruction &i)\n{\n\tif (hlsl_options.shader_model < 60)\n\t\tSPIRV_CROSS_THROW(\"Wave ops requires SM 6.0 or higher.\");\n\n\tconst uint32_t *ops = stream(i);\n\tauto op = static_cast<Op>(i.op);\n\n\tuint32_t result_type = ops[0];\n\tuint32_t id = ops[1];\n\n\tauto scope = static_cast<Scope>(evaluate_constant_u32(ops[2]));\n\tif (scope != ScopeSubgroup)\n\t\tSPIRV_CROSS_THROW(\"Only subgroup scope is supported.\");\n\n\tconst auto make_inclusive_Sum = [&](const string &expr) -> string {\n\t\treturn join(expr, \" + \", to_expression(ops[4]));\n\t};\n\n\tconst auto make_inclusive_Product = [&](const string &expr) -> string {\n\t\treturn join(expr, \" * \", to_expression(ops[4]));\n\t};\n\n\t// If we need to do implicit bitcasts, make sure we do it with the correct type.\n\tuint32_t integer_width = get_integer_width_for_instruction(i);\n\tauto int_type = to_signed_basetype(integer_width);\n\tauto uint_type = to_unsigned_basetype(integer_width);\n\n#define make_inclusive_BitAnd(expr) \"\"\n#define make_inclusive_BitOr(expr) \"\"\n#define make_inclusive_BitXor(expr) \"\"\n#define make_inclusive_Min(expr) \"\"\n#define make_inclusive_Max(expr) \"\"\n\n\tswitch (op)\n\t{\n\tcase OpGroupNonUniformElect:\n\t\temit_op(result_type, id, \"WaveIsFirstLane()\", true);\n\t\tbreak;\n\n\tcase OpGroupNonUniformBroadcast:\n\t\temit_binary_func_op(result_type, id, ops[3], ops[4], \"WaveReadLaneAt\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformBroadcastFirst:\n\t\temit_unary_func_op(result_type, id, ops[3], \"WaveReadLaneFirst\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformBallot:\n\t\temit_unary_func_op(result_type, id, ops[3], \"WaveActiveBallot\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformInverseBallot:\n\t\tSPIRV_CROSS_THROW(\"Cannot trivially implement InverseBallot in HLSL.\");\n\n\tcase OpGroupNonUniformBallotBitExtract:\n\t\tSPIRV_CROSS_THROW(\"Cannot trivially implement BallotBitExtract in HLSL.\");\n\n\tcase OpGroupNonUniformBallotFindLSB:\n\t\tSPIRV_CROSS_THROW(\"Cannot trivially implement BallotFindLSB in HLSL.\");\n\n\tcase OpGroupNonUniformBallotFindMSB:\n\t\tSPIRV_CROSS_THROW(\"Cannot trivially implement BallotFindMSB in HLSL.\");\n\n\tcase OpGroupNonUniformBallotBitCount:\n\t{\n\t\tauto operation = static_cast<GroupOperation>(ops[3]);\n\t\tbool forward = should_forward(ops[4]);\n\t\tif (operation == GroupOperationReduce)\n\t\t{\n\t\t\tauto left = join(\"countbits(\", to_enclosed_expression(ops[4]), \".x) + countbits(\",\n\t\t\t                 to_enclosed_expression(ops[4]), \".y)\");\n\t\t\tauto right = join(\"countbits(\", to_enclosed_expression(ops[4]), \".z) + countbits(\",\n\t\t\t                  to_enclosed_expression(ops[4]), \".w)\");\n\t\t\temit_op(result_type, id, join(left, \" + \", right), forward);\n\t\t\tinherit_expression_dependencies(id, ops[4]);\n\t\t}\n\t\telse if (operation == GroupOperationInclusiveScan)\n\t\t{\n\t\t\tauto left = join(\"countbits(\", to_enclosed_expression(ops[4]), \".x & gl_SubgroupLeMask.x) + countbits(\",\n\t\t\t                 to_enclosed_expression(ops[4]), \".y & gl_SubgroupLeMask.y)\");\n\t\t\tauto right = join(\"countbits(\", to_enclosed_expression(ops[4]), \".z & gl_SubgroupLeMask.z) + countbits(\",\n\t\t\t                  to_enclosed_expression(ops[4]), \".w & gl_SubgroupLeMask.w)\");\n\t\t\temit_op(result_type, id, join(left, \" + \", right), forward);\n\t\t\tif (!active_input_builtins.get(BuiltInSubgroupLeMask))\n\t\t\t{\n\t\t\t\tactive_input_builtins.set(BuiltInSubgroupLeMask);\n\t\t\t\tforce_recompile_guarantee_forward_progress();\n\t\t\t}\n\t\t}\n\t\telse if (operation == GroupOperationExclusiveScan)\n\t\t{\n\t\t\tauto left = join(\"countbits(\", to_enclosed_expression(ops[4]), \".x & gl_SubgroupLtMask.x) + countbits(\",\n\t\t\t                 to_enclosed_expression(ops[4]), \".y & gl_SubgroupLtMask.y)\");\n\t\t\tauto right = join(\"countbits(\", to_enclosed_expression(ops[4]), \".z & gl_SubgroupLtMask.z) + countbits(\",\n\t\t\t                  to_enclosed_expression(ops[4]), \".w & gl_SubgroupLtMask.w)\");\n\t\t\temit_op(result_type, id, join(left, \" + \", right), forward);\n\t\t\tif (!active_input_builtins.get(BuiltInSubgroupLtMask))\n\t\t\t{\n\t\t\t\tactive_input_builtins.set(BuiltInSubgroupLtMask);\n\t\t\t\tforce_recompile_guarantee_forward_progress();\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"Invalid BitCount operation.\");\n\t\tbreak;\n\t}\n\n\tcase OpGroupNonUniformShuffle:\n\t\temit_binary_func_op(result_type, id, ops[3], ops[4], \"WaveReadLaneAt\");\n\t\tbreak;\n\tcase OpGroupNonUniformShuffleXor:\n\t{\n\t\tbool forward = should_forward(ops[3]);\n\t\temit_op(ops[0], ops[1],\n\t\t        join(\"WaveReadLaneAt(\", to_unpacked_expression(ops[3]), \", \",\n\t\t             \"WaveGetLaneIndex() ^ \", to_enclosed_expression(ops[4]), \")\"), forward);\n\t\tinherit_expression_dependencies(ops[1], ops[3]);\n\t\tbreak;\n\t}\n\tcase OpGroupNonUniformShuffleUp:\n\t{\n\t\tbool forward = should_forward(ops[3]);\n\t\temit_op(ops[0], ops[1],\n\t\t        join(\"WaveReadLaneAt(\", to_unpacked_expression(ops[3]), \", \",\n\t\t             \"WaveGetLaneIndex() - \", to_enclosed_expression(ops[4]), \")\"), forward);\n\t\tinherit_expression_dependencies(ops[1], ops[3]);\n\t\tbreak;\n\t}\n\tcase OpGroupNonUniformShuffleDown:\n\t{\n\t\tbool forward = should_forward(ops[3]);\n\t\temit_op(ops[0], ops[1],\n\t\t        join(\"WaveReadLaneAt(\", to_unpacked_expression(ops[3]), \", \",\n\t\t             \"WaveGetLaneIndex() + \", to_enclosed_expression(ops[4]), \")\"), forward);\n\t\tinherit_expression_dependencies(ops[1], ops[3]);\n\t\tbreak;\n\t}\n\n\tcase OpGroupNonUniformAll:\n\t\temit_unary_func_op(result_type, id, ops[3], \"WaveActiveAllTrue\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformAny:\n\t\temit_unary_func_op(result_type, id, ops[3], \"WaveActiveAnyTrue\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformAllEqual:\n\t\temit_unary_func_op(result_type, id, ops[3], \"WaveActiveAllEqual\");\n\t\tbreak;\n\n\t// clang-format off\n#define HLSL_GROUP_OP(op, hlsl_op, supports_scan) \\\ncase OpGroupNonUniform##op: \\\n\t{ \\\n\t\tauto operation = static_cast<GroupOperation>(ops[3]); \\\n\t\tif (operation == GroupOperationReduce) \\\n\t\t\temit_unary_func_op(result_type, id, ops[4], \"WaveActive\" #hlsl_op); \\\n\t\telse if (operation == GroupOperationInclusiveScan && supports_scan) \\\n        { \\\n\t\t\tbool forward = should_forward(ops[4]); \\\n\t\t\temit_op(result_type, id, make_inclusive_##hlsl_op (join(\"WavePrefix\" #hlsl_op, \"(\", to_expression(ops[4]), \")\")), forward); \\\n\t\t\tinherit_expression_dependencies(id, ops[4]); \\\n        } \\\n\t\telse if (operation == GroupOperationExclusiveScan && supports_scan) \\\n\t\t\temit_unary_func_op(result_type, id, ops[4], \"WavePrefix\" #hlsl_op); \\\n\t\telse if (operation == GroupOperationClusteredReduce) \\\n\t\t\tSPIRV_CROSS_THROW(\"Cannot trivially implement ClusteredReduce in HLSL.\"); \\\n\t\telse \\\n\t\t\tSPIRV_CROSS_THROW(\"Invalid group operation.\"); \\\n\t\tbreak; \\\n\t}\n\n#define HLSL_GROUP_OP_CAST(op, hlsl_op, type) \\\ncase OpGroupNonUniform##op: \\\n\t{ \\\n\t\tauto operation = static_cast<GroupOperation>(ops[3]); \\\n\t\tif (operation == GroupOperationReduce) \\\n\t\t\temit_unary_func_op_cast(result_type, id, ops[4], \"WaveActive\" #hlsl_op, type, type); \\\n\t\telse \\\n\t\t\tSPIRV_CROSS_THROW(\"Invalid group operation.\"); \\\n\t\tbreak; \\\n\t}\n\n\tHLSL_GROUP_OP(FAdd, Sum, true)\n\tHLSL_GROUP_OP(FMul, Product, true)\n\tHLSL_GROUP_OP(FMin, Min, false)\n\tHLSL_GROUP_OP(FMax, Max, false)\n\tHLSL_GROUP_OP(IAdd, Sum, true)\n\tHLSL_GROUP_OP(IMul, Product, true)\n\tHLSL_GROUP_OP_CAST(SMin, Min, int_type)\n\tHLSL_GROUP_OP_CAST(SMax, Max, int_type)\n\tHLSL_GROUP_OP_CAST(UMin, Min, uint_type)\n\tHLSL_GROUP_OP_CAST(UMax, Max, uint_type)\n\tHLSL_GROUP_OP(BitwiseAnd, BitAnd, false)\n\tHLSL_GROUP_OP(BitwiseOr, BitOr, false)\n\tHLSL_GROUP_OP(BitwiseXor, BitXor, false)\n\tHLSL_GROUP_OP_CAST(LogicalAnd, BitAnd, uint_type)\n\tHLSL_GROUP_OP_CAST(LogicalOr, BitOr, uint_type)\n\tHLSL_GROUP_OP_CAST(LogicalXor, BitXor, uint_type)\n\n#undef HLSL_GROUP_OP\n#undef HLSL_GROUP_OP_CAST\n\t\t// clang-format on\n\n\tcase OpGroupNonUniformQuadSwap:\n\t{\n\t\tuint32_t direction = evaluate_constant_u32(ops[4]);\n\t\tif (direction == 0)\n\t\t\temit_unary_func_op(result_type, id, ops[3], \"QuadReadAcrossX\");\n\t\telse if (direction == 1)\n\t\t\temit_unary_func_op(result_type, id, ops[3], \"QuadReadAcrossY\");\n\t\telse if (direction == 2)\n\t\t\temit_unary_func_op(result_type, id, ops[3], \"QuadReadAcrossDiagonal\");\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"Invalid quad swap direction.\");\n\t\tbreak;\n\t}\n\n\tcase OpGroupNonUniformQuadBroadcast:\n\t{\n\t\temit_binary_func_op(result_type, id, ops[3], ops[4], \"QuadReadLaneAt\");\n\t\tbreak;\n\t}\n\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Invalid opcode for subgroup.\");\n\t}\n\n\tregister_control_dependent_expression(id);\n}\n\nvoid CompilerHLSL::emit_instruction(const Instruction &instruction)\n{\n\tauto ops = stream(instruction);\n\tauto opcode = static_cast<Op>(instruction.op);\n\n#define HLSL_BOP(op) emit_binary_op(ops[0], ops[1], ops[2], ops[3], #op)\n#define HLSL_BOP_CAST(op, type) \\\n\temit_binary_op_cast(ops[0], ops[1], ops[2], ops[3], #op, type, opcode_is_sign_invariant(opcode), false)\n#define HLSL_UOP(op) emit_unary_op(ops[0], ops[1], ops[2], #op)\n#define HLSL_QFOP(op) emit_quaternary_func_op(ops[0], ops[1], ops[2], ops[3], ops[4], ops[5], #op)\n#define HLSL_TFOP(op) emit_trinary_func_op(ops[0], ops[1], ops[2], ops[3], ops[4], #op)\n#define HLSL_BFOP(op) emit_binary_func_op(ops[0], ops[1], ops[2], ops[3], #op)\n#define HLSL_BFOP_CAST(op, type) \\\n\temit_binary_func_op_cast(ops[0], ops[1], ops[2], ops[3], #op, type, opcode_is_sign_invariant(opcode))\n#define HLSL_BFOP(op) emit_binary_func_op(ops[0], ops[1], ops[2], ops[3], #op)\n#define HLSL_UFOP(op) emit_unary_func_op(ops[0], ops[1], ops[2], #op)\n\n\t// If we need to do implicit bitcasts, make sure we do it with the correct type.\n\tuint32_t integer_width = get_integer_width_for_instruction(instruction);\n\tauto int_type = to_signed_basetype(integer_width);\n\tauto uint_type = to_unsigned_basetype(integer_width);\n\n\topcode = get_remapped_spirv_op(opcode);\n\n\tswitch (opcode)\n\t{\n\tcase OpAccessChain:\n\tcase OpInBoundsAccessChain:\n\t{\n\t\temit_access_chain(instruction);\n\t\tbreak;\n\t}\n\tcase OpBitcast:\n\t{\n\t\tauto bitcast_type = get_bitcast_type(ops[0], ops[2]);\n\t\tif (bitcast_type == CompilerHLSL::TypeNormal)\n\t\t\tCompilerGLSL::emit_instruction(instruction);\n\t\telse\n\t\t{\n\t\t\tif (!requires_uint2_packing)\n\t\t\t{\n\t\t\t\trequires_uint2_packing = true;\n\t\t\t\tforce_recompile();\n\t\t\t}\n\n\t\t\tif (bitcast_type == CompilerHLSL::TypePackUint2x32)\n\t\t\t\temit_unary_func_op(ops[0], ops[1], ops[2], \"spvPackUint2x32\");\n\t\t\telse\n\t\t\t\temit_unary_func_op(ops[0], ops[1], ops[2], \"spvUnpackUint2x32\");\n\t\t}\n\n\t\tbreak;\n\t}\n\n\tcase OpSelect:\n\t{\n\t\tauto &value_type = expression_type(ops[3]);\n\t\tif (value_type.basetype == SPIRType::Struct || is_array(value_type))\n\t\t{\n\t\t\t// HLSL does not support ternary expressions on composites.\n\t\t\t// Cannot use branches, since we might be in a continue block\n\t\t\t// where explicit control flow is prohibited.\n\t\t\t// Emit a helper function where we can use control flow.\n\t\t\tTypeID value_type_id = expression_type_id(ops[3]);\n\t\t\tauto itr = std::find(composite_selection_workaround_types.begin(),\n\t\t\t                     composite_selection_workaround_types.end(),\n\t\t\t                     value_type_id);\n\t\t\tif (itr == composite_selection_workaround_types.end())\n\t\t\t{\n\t\t\t\tcomposite_selection_workaround_types.push_back(value_type_id);\n\t\t\t\tforce_recompile();\n\t\t\t}\n\t\t\temit_uninitialized_temporary_expression(ops[0], ops[1]);\n\t\t\tstatement(\"spvSelectComposite(\",\n\t\t\t\t\t  to_expression(ops[1]), \", \", to_expression(ops[2]), \", \",\n\t\t\t\t\t  to_expression(ops[3]), \", \", to_expression(ops[4]), \");\");\n\t\t}\n\t\telse\n\t\t\tCompilerGLSL::emit_instruction(instruction);\n\t\tbreak;\n\t}\n\n\tcase OpStore:\n\t{\n\t\temit_store(instruction);\n\t\tbreak;\n\t}\n\n\tcase OpLoad:\n\t{\n\t\temit_load(instruction);\n\t\tbreak;\n\t}\n\n\tcase OpMatrixTimesVector:\n\t{\n\t\t// Matrices are kept in a transposed state all the time, flip multiplication order always.\n\t\temit_binary_func_op(ops[0], ops[1], ops[3], ops[2], \"mul\");\n\t\tbreak;\n\t}\n\n\tcase OpVectorTimesMatrix:\n\t{\n\t\t// Matrices are kept in a transposed state all the time, flip multiplication order always.\n\t\temit_binary_func_op(ops[0], ops[1], ops[3], ops[2], \"mul\");\n\t\tbreak;\n\t}\n\n\tcase OpMatrixTimesMatrix:\n\t{\n\t\t// Matrices are kept in a transposed state all the time, flip multiplication order always.\n\t\temit_binary_func_op(ops[0], ops[1], ops[3], ops[2], \"mul\");\n\t\tbreak;\n\t}\n\n\tcase OpOuterProduct:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tuint32_t a = ops[2];\n\t\tuint32_t b = ops[3];\n\n\t\tauto &type = get<SPIRType>(result_type);\n\t\tstring expr = type_to_glsl_constructor(type);\n\t\texpr += \"(\";\n\t\tfor (uint32_t col = 0; col < type.columns; col++)\n\t\t{\n\t\t\texpr += to_enclosed_expression(a);\n\t\t\texpr += \" * \";\n\t\t\texpr += to_extract_component_expression(b, col);\n\t\t\tif (col + 1 < type.columns)\n\t\t\t\texpr += \", \";\n\t\t}\n\t\texpr += \")\";\n\t\temit_op(result_type, id, expr, should_forward(a) && should_forward(b));\n\t\tinherit_expression_dependencies(id, a);\n\t\tinherit_expression_dependencies(id, b);\n\t\tbreak;\n\t}\n\n\tcase OpFMod:\n\t{\n\t\tif (!requires_op_fmod)\n\t\t{\n\t\t\trequires_op_fmod = true;\n\t\t\tforce_recompile();\n\t\t}\n\t\tCompilerGLSL::emit_instruction(instruction);\n\t\tbreak;\n\t}\n\n\tcase OpFRem:\n\t\temit_binary_func_op(ops[0], ops[1], ops[2], ops[3], \"fmod\");\n\t\tbreak;\n\n\tcase OpImage:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tauto *combined = maybe_get<SPIRCombinedImageSampler>(ops[2]);\n\n\t\tif (combined)\n\t\t{\n\t\t\tauto &e = emit_op(result_type, id, to_expression(combined->image), true, true);\n\t\t\tauto *var = maybe_get_backing_variable(combined->image);\n\t\t\tif (var)\n\t\t\t\te.loaded_from = var->self;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tauto &e = emit_op(result_type, id, to_expression(ops[2]), true, true);\n\t\t\tauto *var = maybe_get_backing_variable(ops[2]);\n\t\t\tif (var)\n\t\t\t\te.loaded_from = var->self;\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpDPdx:\n\t\tHLSL_UFOP(ddx);\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\n\tcase OpDPdy:\n\t\tHLSL_UFOP(ddy);\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\n\tcase OpDPdxFine:\n\t\tHLSL_UFOP(ddx_fine);\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\n\tcase OpDPdyFine:\n\t\tHLSL_UFOP(ddy_fine);\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\n\tcase OpDPdxCoarse:\n\t\tHLSL_UFOP(ddx_coarse);\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\n\tcase OpDPdyCoarse:\n\t\tHLSL_UFOP(ddy_coarse);\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\n\tcase OpFwidth:\n\tcase OpFwidthCoarse:\n\tcase OpFwidthFine:\n\t\tHLSL_UFOP(fwidth);\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\n\tcase OpLogicalNot:\n\t{\n\t\tauto result_type = ops[0];\n\t\tauto id = ops[1];\n\t\tauto &type = get<SPIRType>(result_type);\n\n\t\tif (type.vecsize > 1)\n\t\t\temit_unrolled_unary_op(result_type, id, ops[2], \"!\");\n\t\telse\n\t\t\tHLSL_UOP(!);\n\t\tbreak;\n\t}\n\n\tcase OpIEqual:\n\t{\n\t\tauto result_type = ops[0];\n\t\tauto id = ops[1];\n\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\temit_unrolled_binary_op(result_type, id, ops[2], ops[3], \"==\", false, SPIRType::Unknown);\n\t\telse\n\t\t\tHLSL_BOP_CAST(==, int_type);\n\t\tbreak;\n\t}\n\n\tcase OpLogicalEqual:\n\tcase OpFOrdEqual:\n\tcase OpFUnordEqual:\n\t{\n\t\t// HLSL != operator is unordered.\n\t\t// https://docs.microsoft.com/en-us/windows/win32/direct3d10/d3d10-graphics-programming-guide-resources-float-rules.\n\t\t// isnan() is apparently implemented as x != x as well.\n\t\t// We cannot implement UnordEqual as !(OrdNotEqual), as HLSL cannot express OrdNotEqual.\n\t\t// HACK: FUnordEqual will be implemented as FOrdEqual.\n\n\t\tauto result_type = ops[0];\n\t\tauto id = ops[1];\n\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\temit_unrolled_binary_op(result_type, id, ops[2], ops[3], \"==\", false, SPIRType::Unknown);\n\t\telse\n\t\t\tHLSL_BOP(==);\n\t\tbreak;\n\t}\n\n\tcase OpINotEqual:\n\t{\n\t\tauto result_type = ops[0];\n\t\tauto id = ops[1];\n\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\temit_unrolled_binary_op(result_type, id, ops[2], ops[3], \"!=\", false, SPIRType::Unknown);\n\t\telse\n\t\t\tHLSL_BOP_CAST(!=, int_type);\n\t\tbreak;\n\t}\n\n\tcase OpLogicalNotEqual:\n\tcase OpFOrdNotEqual:\n\tcase OpFUnordNotEqual:\n\t{\n\t\t// HLSL != operator is unordered.\n\t\t// https://docs.microsoft.com/en-us/windows/win32/direct3d10/d3d10-graphics-programming-guide-resources-float-rules.\n\t\t// isnan() is apparently implemented as x != x as well.\n\n\t\t// FIXME: FOrdNotEqual cannot be implemented in a crisp and simple way here.\n\t\t// We would need to do something like not(UnordEqual), but that cannot be expressed either.\n\t\t// Adding a lot of NaN checks would be a breaking change from perspective of performance.\n\t\t// SPIR-V will generally use isnan() checks when this even matters.\n\t\t// HACK: FOrdNotEqual will be implemented as FUnordEqual.\n\n\t\tauto result_type = ops[0];\n\t\tauto id = ops[1];\n\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\temit_unrolled_binary_op(result_type, id, ops[2], ops[3], \"!=\", false, SPIRType::Unknown);\n\t\telse\n\t\t\tHLSL_BOP(!=);\n\t\tbreak;\n\t}\n\n\tcase OpUGreaterThan:\n\tcase OpSGreaterThan:\n\t{\n\t\tauto result_type = ops[0];\n\t\tauto id = ops[1];\n\t\tauto type = opcode == OpUGreaterThan ? uint_type : int_type;\n\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\temit_unrolled_binary_op(result_type, id, ops[2], ops[3], \">\", false, type);\n\t\telse\n\t\t\tHLSL_BOP_CAST(>, type);\n\t\tbreak;\n\t}\n\n\tcase OpFOrdGreaterThan:\n\t{\n\t\tauto result_type = ops[0];\n\t\tauto id = ops[1];\n\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\temit_unrolled_binary_op(result_type, id, ops[2], ops[3], \">\", false, SPIRType::Unknown);\n\t\telse\n\t\t\tHLSL_BOP(>);\n\t\tbreak;\n\t}\n\n\tcase OpFUnordGreaterThan:\n\t{\n\t\tauto result_type = ops[0];\n\t\tauto id = ops[1];\n\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\temit_unrolled_binary_op(result_type, id, ops[2], ops[3], \"<=\", true, SPIRType::Unknown);\n\t\telse\n\t\t\tCompilerGLSL::emit_instruction(instruction);\n\t\tbreak;\n\t}\n\n\tcase OpUGreaterThanEqual:\n\tcase OpSGreaterThanEqual:\n\t{\n\t\tauto result_type = ops[0];\n\t\tauto id = ops[1];\n\n\t\tauto type = opcode == OpUGreaterThanEqual ? uint_type : int_type;\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\temit_unrolled_binary_op(result_type, id, ops[2], ops[3], \">=\", false, type);\n\t\telse\n\t\t\tHLSL_BOP_CAST(>=, type);\n\t\tbreak;\n\t}\n\n\tcase OpFOrdGreaterThanEqual:\n\t{\n\t\tauto result_type = ops[0];\n\t\tauto id = ops[1];\n\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\temit_unrolled_binary_op(result_type, id, ops[2], ops[3], \">=\", false, SPIRType::Unknown);\n\t\telse\n\t\t\tHLSL_BOP(>=);\n\t\tbreak;\n\t}\n\n\tcase OpFUnordGreaterThanEqual:\n\t{\n\t\tauto result_type = ops[0];\n\t\tauto id = ops[1];\n\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\temit_unrolled_binary_op(result_type, id, ops[2], ops[3], \"<\", true, SPIRType::Unknown);\n\t\telse\n\t\t\tCompilerGLSL::emit_instruction(instruction);\n\t\tbreak;\n\t}\n\n\tcase OpULessThan:\n\tcase OpSLessThan:\n\t{\n\t\tauto result_type = ops[0];\n\t\tauto id = ops[1];\n\n\t\tauto type = opcode == OpULessThan ? uint_type : int_type;\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\temit_unrolled_binary_op(result_type, id, ops[2], ops[3], \"<\", false, type);\n\t\telse\n\t\t\tHLSL_BOP_CAST(<, type);\n\t\tbreak;\n\t}\n\n\tcase OpFOrdLessThan:\n\t{\n\t\tauto result_type = ops[0];\n\t\tauto id = ops[1];\n\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\temit_unrolled_binary_op(result_type, id, ops[2], ops[3], \"<\", false, SPIRType::Unknown);\n\t\telse\n\t\t\tHLSL_BOP(<);\n\t\tbreak;\n\t}\n\n\tcase OpFUnordLessThan:\n\t{\n\t\tauto result_type = ops[0];\n\t\tauto id = ops[1];\n\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\temit_unrolled_binary_op(result_type, id, ops[2], ops[3], \">=\", true, SPIRType::Unknown);\n\t\telse\n\t\t\tCompilerGLSL::emit_instruction(instruction);\n\t\tbreak;\n\t}\n\n\tcase OpULessThanEqual:\n\tcase OpSLessThanEqual:\n\t{\n\t\tauto result_type = ops[0];\n\t\tauto id = ops[1];\n\n\t\tauto type = opcode == OpULessThanEqual ? uint_type : int_type;\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\temit_unrolled_binary_op(result_type, id, ops[2], ops[3], \"<=\", false, type);\n\t\telse\n\t\t\tHLSL_BOP_CAST(<=, type);\n\t\tbreak;\n\t}\n\n\tcase OpFOrdLessThanEqual:\n\t{\n\t\tauto result_type = ops[0];\n\t\tauto id = ops[1];\n\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\temit_unrolled_binary_op(result_type, id, ops[2], ops[3], \"<=\", false, SPIRType::Unknown);\n\t\telse\n\t\t\tHLSL_BOP(<=);\n\t\tbreak;\n\t}\n\n\tcase OpFUnordLessThanEqual:\n\t{\n\t\tauto result_type = ops[0];\n\t\tauto id = ops[1];\n\n\t\tif (expression_type(ops[2]).vecsize > 1)\n\t\t\temit_unrolled_binary_op(result_type, id, ops[2], ops[3], \">\", true, SPIRType::Unknown);\n\t\telse\n\t\t\tCompilerGLSL::emit_instruction(instruction);\n\t\tbreak;\n\t}\n\n\tcase OpImageQueryLod:\n\t\temit_texture_op(instruction, false);\n\t\tbreak;\n\n\tcase OpImageQuerySizeLod:\n\t{\n\t\tauto result_type = ops[0];\n\t\tauto id = ops[1];\n\n\t\trequire_texture_query_variant(ops[2]);\n\t\tauto dummy_samples_levels = join(get_fallback_name(id), \"_dummy_parameter\");\n\t\tstatement(\"uint \", dummy_samples_levels, \";\");\n\n\t\tauto expr = join(\"spvTextureSize(\", to_non_uniform_aware_expression(ops[2]), \", \",\n\t\t                 bitcast_expression(SPIRType::UInt, ops[3]), \", \", dummy_samples_levels, \")\");\n\n\t\tauto &restype = get<SPIRType>(ops[0]);\n\t\texpr = bitcast_expression(restype, SPIRType::UInt, expr);\n\t\temit_op(result_type, id, expr, true);\n\t\tbreak;\n\t}\n\n\tcase OpImageQuerySize:\n\t{\n\t\tauto result_type = ops[0];\n\t\tauto id = ops[1];\n\n\t\trequire_texture_query_variant(ops[2]);\n\t\tbool uav = expression_type(ops[2]).image.sampled == 2;\n\n\t\tif (const auto *var = maybe_get_backing_variable(ops[2]))\n\t\t\tif (hlsl_options.nonwritable_uav_texture_as_srv && has_decoration(var->self, DecorationNonWritable))\n\t\t\t\tuav = false;\n\n\t\tauto dummy_samples_levels = join(get_fallback_name(id), \"_dummy_parameter\");\n\t\tstatement(\"uint \", dummy_samples_levels, \";\");\n\n\t\tstring expr;\n\t\tif (uav)\n\t\t\texpr = join(\"spvImageSize(\", to_non_uniform_aware_expression(ops[2]), \", \", dummy_samples_levels, \")\");\n\t\telse\n\t\t\texpr = join(\"spvTextureSize(\", to_non_uniform_aware_expression(ops[2]), \", 0u, \", dummy_samples_levels, \")\");\n\n\t\tauto &restype = get<SPIRType>(ops[0]);\n\t\texpr = bitcast_expression(restype, SPIRType::UInt, expr);\n\t\temit_op(result_type, id, expr, true);\n\t\tbreak;\n\t}\n\n\tcase OpImageQuerySamples:\n\tcase OpImageQueryLevels:\n\t{\n\t\tauto result_type = ops[0];\n\t\tauto id = ops[1];\n\n\t\trequire_texture_query_variant(ops[2]);\n\t\tbool uav = expression_type(ops[2]).image.sampled == 2;\n\t\tif (opcode == OpImageQueryLevels && uav)\n\t\t\tSPIRV_CROSS_THROW(\"Cannot query levels for UAV images.\");\n\n\t\tif (const auto *var = maybe_get_backing_variable(ops[2]))\n\t\t\tif (hlsl_options.nonwritable_uav_texture_as_srv && has_decoration(var->self, DecorationNonWritable))\n\t\t\t\tuav = false;\n\n\t\t// Keep it simple and do not emit special variants to make this look nicer ...\n\t\t// This stuff is barely, if ever, used.\n\t\tforced_temporaries.insert(id);\n\t\tauto &type = get<SPIRType>(result_type);\n\t\tstatement(variable_decl(type, to_name(id)), \";\");\n\n\t\tif (uav)\n\t\t\tstatement(\"spvImageSize(\", to_non_uniform_aware_expression(ops[2]), \", \", to_name(id), \");\");\n\t\telse\n\t\t\tstatement(\"spvTextureSize(\", to_non_uniform_aware_expression(ops[2]), \", 0u, \", to_name(id), \");\");\n\n\t\tauto &restype = get<SPIRType>(ops[0]);\n\t\tauto expr = bitcast_expression(restype, SPIRType::UInt, to_name(id));\n\t\tset<SPIRExpression>(id, expr, result_type, true);\n\t\tbreak;\n\t}\n\n\tcase OpImageRead:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tauto *var = maybe_get_backing_variable(ops[2]);\n\t\tauto &type = expression_type(ops[2]);\n\t\tbool subpass_data = type.image.dim == DimSubpassData;\n\t\tbool pure = false;\n\n\t\tstring imgexpr;\n\n\t\tif (subpass_data)\n\t\t{\n\t\t\tif (hlsl_options.shader_model < 40)\n\t\t\t\tSPIRV_CROSS_THROW(\"Subpass loads are not supported in HLSL shader model 2/3.\");\n\n\t\t\t// Similar to GLSL, implement subpass loads using texelFetch.\n\t\t\tif (type.image.ms)\n\t\t\t{\n\t\t\t\tuint32_t operands = ops[4];\n\t\t\t\tif (operands != ImageOperandsSampleMask || instruction.length != 6)\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Multisampled image used in OpImageRead, but unexpected operand mask was used.\");\n\t\t\t\tuint32_t sample = ops[5];\n\t\t\t\timgexpr = join(to_non_uniform_aware_expression(ops[2]), \".Load(int2(gl_FragCoord.xy), \", to_expression(sample), \")\");\n\t\t\t}\n\t\t\telse\n\t\t\t\timgexpr = join(to_non_uniform_aware_expression(ops[2]), \".Load(int3(int2(gl_FragCoord.xy), 0))\");\n\n\t\t\tpure = true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\timgexpr = join(to_non_uniform_aware_expression(ops[2]), \"[\", to_expression(ops[3]), \"]\");\n\t\t\t// The underlying image type in HLSL depends on the image format, unlike GLSL, where all images are \"vec4\",\n\t\t\t// except that the underlying type changes how the data is interpreted.\n\n\t\t\tbool force_srv =\n\t\t\t    hlsl_options.nonwritable_uav_texture_as_srv && var && has_decoration(var->self, DecorationNonWritable);\n\t\t\tpure = force_srv;\n\n\t\t\tif (var && !subpass_data && !force_srv)\n\t\t\t\timgexpr = remap_swizzle(get<SPIRType>(result_type),\n\t\t\t\t                        image_format_to_components(get<SPIRType>(var->basetype).image.format), imgexpr);\n\t\t}\n\n\t\tif (var)\n\t\t{\n\t\t\tbool forward = forced_temporaries.find(id) == end(forced_temporaries);\n\t\t\tauto &e = emit_op(result_type, id, imgexpr, forward);\n\n\t\t\tif (!pure)\n\t\t\t{\n\t\t\t\te.loaded_from = var->self;\n\t\t\t\tif (forward)\n\t\t\t\t\tvar->dependees.push_back(id);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\temit_op(result_type, id, imgexpr, false);\n\n\t\tinherit_expression_dependencies(id, ops[2]);\n\t\tif (type.image.ms)\n\t\t\tinherit_expression_dependencies(id, ops[5]);\n\t\tbreak;\n\t}\n\n\tcase OpImageWrite:\n\t{\n\t\tauto *var = maybe_get_backing_variable(ops[0]);\n\n\t\t// The underlying image type in HLSL depends on the image format, unlike GLSL, where all images are \"vec4\",\n\t\t// except that the underlying type changes how the data is interpreted.\n\t\tauto value_expr = to_expression(ops[2]);\n\t\tif (var)\n\t\t{\n\t\t\tauto &type = get<SPIRType>(var->basetype);\n\t\t\tauto narrowed_type = get<SPIRType>(type.image.type);\n\t\t\tnarrowed_type.vecsize = image_format_to_components(type.image.format);\n\t\t\tvalue_expr = remap_swizzle(narrowed_type, expression_type(ops[2]).vecsize, value_expr);\n\t\t}\n\n\t\tstatement(to_non_uniform_aware_expression(ops[0]), \"[\", to_expression(ops[1]), \"] = \", value_expr, \";\");\n\t\tif (var && variable_storage_is_aliased(*var))\n\t\t\tflush_all_aliased_variables();\n\t\tbreak;\n\t}\n\n\tcase OpImageTexelPointer:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\n\t\tauto expr = to_expression(ops[2]);\n\t\texpr += join(\"[\", to_expression(ops[3]), \"]\");\n\t\tauto &e = set<SPIRExpression>(id, expr, result_type, true);\n\n\t\t// When using the pointer, we need to know which variable it is actually loaded from.\n\t\tauto *var = maybe_get_backing_variable(ops[2]);\n\t\te.loaded_from = var ? var->self : ID(0);\n\t\tinherit_expression_dependencies(id, ops[3]);\n\t\tbreak;\n\t}\n\n\tcase OpAtomicFAddEXT:\n\tcase OpAtomicFMinEXT:\n\tcase OpAtomicFMaxEXT:\n\t\tSPIRV_CROSS_THROW(\"Floating-point atomics are not supported in HLSL.\");\n\n\tcase OpAtomicCompareExchange:\n\tcase OpAtomicExchange:\n\tcase OpAtomicISub:\n\tcase OpAtomicSMin:\n\tcase OpAtomicUMin:\n\tcase OpAtomicSMax:\n\tcase OpAtomicUMax:\n\tcase OpAtomicAnd:\n\tcase OpAtomicOr:\n\tcase OpAtomicXor:\n\tcase OpAtomicIAdd:\n\tcase OpAtomicIIncrement:\n\tcase OpAtomicIDecrement:\n\tcase OpAtomicLoad:\n\tcase OpAtomicStore:\n\t{\n\t\temit_atomic(ops, instruction.length, opcode);\n\t\tbreak;\n\t}\n\n\tcase OpControlBarrier:\n\tcase OpMemoryBarrier:\n\t{\n\t\tuint32_t memory;\n\t\tuint32_t semantics;\n\n\t\tif (opcode == OpMemoryBarrier)\n\t\t{\n\t\t\tmemory = evaluate_constant_u32(ops[0]);\n\t\t\tsemantics = evaluate_constant_u32(ops[1]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmemory = evaluate_constant_u32(ops[1]);\n\t\t\tsemantics = evaluate_constant_u32(ops[2]);\n\t\t}\n\n\t\tif (memory == ScopeSubgroup)\n\t\t{\n\t\t\t// No Wave-barriers in HLSL.\n\t\t\tbreak;\n\t\t}\n\n\t\t// We only care about these flags, acquire/release and friends are not relevant to GLSL.\n\t\tsemantics = mask_relevant_memory_semantics(semantics);\n\n\t\tif (opcode == OpMemoryBarrier)\n\t\t{\n\t\t\t// If we are a memory barrier, and the next instruction is a control barrier, check if that memory barrier\n\t\t\t// does what we need, so we avoid redundant barriers.\n\t\t\tconst Instruction *next = get_next_instruction_in_block(instruction);\n\t\t\tif (next && next->op == OpControlBarrier)\n\t\t\t{\n\t\t\t\tauto *next_ops = stream(*next);\n\t\t\t\tuint32_t next_memory = evaluate_constant_u32(next_ops[1]);\n\t\t\t\tuint32_t next_semantics = evaluate_constant_u32(next_ops[2]);\n\t\t\t\tnext_semantics = mask_relevant_memory_semantics(next_semantics);\n\n\t\t\t\t// There is no \"just execution barrier\" in HLSL.\n\t\t\t\t// If there are no memory semantics for next instruction, we will imply group shared memory is synced.\n\t\t\t\tif (next_semantics == 0)\n\t\t\t\t\tnext_semantics = MemorySemanticsWorkgroupMemoryMask;\n\n\t\t\t\tbool memory_scope_covered = false;\n\t\t\t\tif (next_memory == memory)\n\t\t\t\t\tmemory_scope_covered = true;\n\t\t\t\telse if (next_semantics == MemorySemanticsWorkgroupMemoryMask)\n\t\t\t\t{\n\t\t\t\t\t// If we only care about workgroup memory, either Device or Workgroup scope is fine,\n\t\t\t\t\t// scope does not have to match.\n\t\t\t\t\tif ((next_memory == ScopeDevice || next_memory == ScopeWorkgroup) &&\n\t\t\t\t\t    (memory == ScopeDevice || memory == ScopeWorkgroup))\n\t\t\t\t\t{\n\t\t\t\t\t\tmemory_scope_covered = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (memory == ScopeWorkgroup && next_memory == ScopeDevice)\n\t\t\t\t{\n\t\t\t\t\t// The control barrier has device scope, but the memory barrier just has workgroup scope.\n\t\t\t\t\tmemory_scope_covered = true;\n\t\t\t\t}\n\n\t\t\t\t// If we have the same memory scope, and all memory types are covered, we're good.\n\t\t\t\tif (memory_scope_covered && (semantics & next_semantics) == semantics)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// We are synchronizing some memory or syncing execution,\n\t\t// so we cannot forward any loads beyond the memory barrier.\n\t\tif (semantics || opcode == OpControlBarrier)\n\t\t{\n\t\t\tassert(current_emitting_block);\n\t\t\tflush_control_dependent_expressions(current_emitting_block->self);\n\t\t\tflush_all_active_variables();\n\t\t}\n\n\t\tif (opcode == OpControlBarrier)\n\t\t{\n\t\t\t// We cannot emit just execution barrier, for no memory semantics pick the cheapest option.\n\t\t\tif (semantics == MemorySemanticsWorkgroupMemoryMask || semantics == 0)\n\t\t\t\tstatement(\"GroupMemoryBarrierWithGroupSync();\");\n\t\t\telse if (semantics != 0 && (semantics & MemorySemanticsWorkgroupMemoryMask) == 0)\n\t\t\t\tstatement(\"DeviceMemoryBarrierWithGroupSync();\");\n\t\t\telse\n\t\t\t\tstatement(\"AllMemoryBarrierWithGroupSync();\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (semantics == MemorySemanticsWorkgroupMemoryMask)\n\t\t\t\tstatement(\"GroupMemoryBarrier();\");\n\t\t\telse if (semantics != 0 && (semantics & MemorySemanticsWorkgroupMemoryMask) == 0)\n\t\t\t\tstatement(\"DeviceMemoryBarrier();\");\n\t\t\telse\n\t\t\t\tstatement(\"AllMemoryBarrier();\");\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpBitFieldInsert:\n\t{\n\t\tif (!requires_bitfield_insert)\n\t\t{\n\t\t\trequires_bitfield_insert = true;\n\t\t\tforce_recompile();\n\t\t}\n\n\t\tauto expr = join(\"spvBitfieldInsert(\", to_expression(ops[2]), \", \", to_expression(ops[3]), \", \",\n\t\t                 to_expression(ops[4]), \", \", to_expression(ops[5]), \")\");\n\n\t\tbool forward =\n\t\t    should_forward(ops[2]) && should_forward(ops[3]) && should_forward(ops[4]) && should_forward(ops[5]);\n\n\t\tauto &restype = get<SPIRType>(ops[0]);\n\t\texpr = bitcast_expression(restype, SPIRType::UInt, expr);\n\t\temit_op(ops[0], ops[1], expr, forward);\n\t\tbreak;\n\t}\n\n\tcase OpBitFieldSExtract:\n\tcase OpBitFieldUExtract:\n\t{\n\t\tif (!requires_bitfield_extract)\n\t\t{\n\t\t\trequires_bitfield_extract = true;\n\t\t\tforce_recompile();\n\t\t}\n\n\t\tif (opcode == OpBitFieldSExtract)\n\t\t\tHLSL_TFOP(spvBitfieldSExtract);\n\t\telse\n\t\t\tHLSL_TFOP(spvBitfieldUExtract);\n\t\tbreak;\n\t}\n\n\tcase OpBitCount:\n\t{\n\t\tauto basetype = expression_type(ops[2]).basetype;\n\t\temit_unary_func_op_cast(ops[0], ops[1], ops[2], \"countbits\", basetype, basetype);\n\t\tbreak;\n\t}\n\n\tcase OpBitReverse:\n\t\tHLSL_UFOP(reversebits);\n\t\tbreak;\n\n\tcase OpArrayLength:\n\t{\n\t\tauto *var = maybe_get_backing_variable(ops[2]);\n\t\tif (!var)\n\t\t\tSPIRV_CROSS_THROW(\"Array length must point directly to an SSBO block.\");\n\n\t\tauto &type = get<SPIRType>(var->basetype);\n\t\tif (!has_decoration(type.self, DecorationBlock) && !has_decoration(type.self, DecorationBufferBlock))\n\t\t\tSPIRV_CROSS_THROW(\"Array length expression must point to a block type.\");\n\n\t\t// This must be 32-bit uint, so we're good to go.\n\t\temit_uninitialized_temporary_expression(ops[0], ops[1]);\n\t\tstatement(to_non_uniform_aware_expression(ops[2]), \".GetDimensions(\", to_expression(ops[1]), \");\");\n\t\tuint32_t offset = type_struct_member_offset(type, ops[3]);\n\t\tuint32_t stride = type_struct_member_array_stride(type, ops[3]);\n\t\tstatement(to_expression(ops[1]), \" = (\", to_expression(ops[1]), \" - \", offset, \") / \", stride, \";\");\n\t\tbreak;\n\t}\n\n\tcase OpIsHelperInvocationEXT:\n\t\tif (hlsl_options.shader_model < 50 || get_entry_point().model != ExecutionModelFragment)\n\t\t\tSPIRV_CROSS_THROW(\"Helper Invocation input is only supported in PS 5.0 or higher.\");\n\t\t// Helper lane state with demote is volatile by nature.\n\t\t// Do not forward this.\n\t\temit_op(ops[0], ops[1], \"IsHelperLane()\", false);\n\t\tbreak;\n\n\tcase OpBeginInvocationInterlockEXT:\n\tcase OpEndInvocationInterlockEXT:\n\t\tif (hlsl_options.shader_model < 51)\n\t\t\tSPIRV_CROSS_THROW(\"Rasterizer order views require Shader Model 5.1.\");\n\t\tbreak; // Nothing to do in the body\n\n\tcase OpRayQueryInitializeKHR:\n\t{\n\t\tflush_variable_declaration(ops[0]);\n\n\t\tstd::string ray_desc_name = get_unique_identifier();\n\t\tstatement(\"RayDesc \", ray_desc_name, \" = {\", to_expression(ops[4]), \", \", to_expression(ops[5]), \", \",\n\t\t\tto_expression(ops[6]), \", \", to_expression(ops[7]), \"};\");\n\n\t\tstatement(to_expression(ops[0]), \".TraceRayInline(\", \n\t\t\tto_expression(ops[1]), \", \", // acc structure\n\t\t\tto_expression(ops[2]), \", \", // ray flags\n\t\t\tto_expression(ops[3]), \", \", // mask\n\t\t\tray_desc_name, \");\"); // ray\n\t\tbreak;\n\t}\n\tcase OpRayQueryProceedKHR:\n\t{\n\t\tflush_variable_declaration(ops[0]);\n\t\temit_op(ops[0], ops[1], join(to_expression(ops[2]), \".Proceed()\"), false);\n\t\tbreak;\n\t}\t\n\tcase OpRayQueryTerminateKHR:\n\t{\n\t\tflush_variable_declaration(ops[0]);\n\t\tstatement(to_expression(ops[0]), \".Abort();\");\n\t\tbreak;\n\t}\n\tcase OpRayQueryGenerateIntersectionKHR:\n\t{\n\t\tflush_variable_declaration(ops[0]);\n\t\tstatement(to_expression(ops[0]), \".CommitProceduralPrimitiveHit(\", to_expression(ops[1]), \");\");\n\t\tbreak;\n\t}\n\tcase OpRayQueryConfirmIntersectionKHR:\n\t{\n\t\tflush_variable_declaration(ops[0]);\n\t\tstatement(to_expression(ops[0]), \".CommitNonOpaqueTriangleHit();\");\n\t\tbreak;\n\t}\n\tcase OpRayQueryGetIntersectionTypeKHR:\n\t{\n\t\temit_rayquery_function(\".CommittedStatus()\", \".CandidateType()\", ops);\n\t\tbreak;\n\t}\n\tcase OpRayQueryGetIntersectionTKHR:\n\t{\n\t\temit_rayquery_function(\".CommittedRayT()\", \".CandidateTriangleRayT()\", ops);\n\t\tbreak;\n\t}\n\tcase OpRayQueryGetIntersectionInstanceCustomIndexKHR:\n\t{\n\t\temit_rayquery_function(\".CommittedInstanceID()\", \".CandidateInstanceID()\", ops);\n\t\tbreak;\n\t}\n\tcase OpRayQueryGetIntersectionInstanceIdKHR:\n\t{\n\t\temit_rayquery_function(\".CommittedInstanceIndex()\", \".CandidateInstanceIndex()\", ops);\n\t\tbreak;\n\t}\n\tcase OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR:\n\t{\n\t\temit_rayquery_function(\".CommittedInstanceContributionToHitGroupIndex()\", \n\t\t\t\".CandidateInstanceContributionToHitGroupIndex()\", ops);\n\t\tbreak;\n\t}\n\tcase OpRayQueryGetIntersectionGeometryIndexKHR:\n\t{\n\t\temit_rayquery_function(\".CommittedGeometryIndex()\",\n\t\t\t\t\".CandidateGeometryIndex()\", ops);\n\t\tbreak;\n\t}\n\tcase OpRayQueryGetIntersectionPrimitiveIndexKHR:\n\t{\n\t\temit_rayquery_function(\".CommittedPrimitiveIndex()\", \".CandidatePrimitiveIndex()\", ops);\n\t\tbreak;\n\t}\n\tcase OpRayQueryGetIntersectionBarycentricsKHR:\n\t{\n\t\temit_rayquery_function(\".CommittedTriangleBarycentrics()\", \".CandidateTriangleBarycentrics()\", ops);\n\t\tbreak;\n\t}\n\tcase OpRayQueryGetIntersectionFrontFaceKHR:\n\t{\n\t\temit_rayquery_function(\".CommittedTriangleFrontFace()\", \".CandidateTriangleFrontFace()\", ops);\n\t\tbreak;\n\t}\n\tcase OpRayQueryGetIntersectionCandidateAABBOpaqueKHR:\n\t{\n\t\tflush_variable_declaration(ops[0]);\n\t\temit_op(ops[0], ops[1], join(to_expression(ops[2]), \".CandidateProceduralPrimitiveNonOpaque()\"), false);\n\t\tbreak;\n\t}\n\tcase OpRayQueryGetIntersectionObjectRayDirectionKHR:\n\t{\n\t\temit_rayquery_function(\".CommittedObjectRayDirection()\", \".CandidateObjectRayDirection()\", ops);\n\t\tbreak;\n\t}\n\tcase OpRayQueryGetIntersectionObjectRayOriginKHR:\n\t{\n\t\tflush_variable_declaration(ops[0]);\n\t\temit_rayquery_function(\".CommittedObjectRayOrigin()\", \".CandidateObjectRayOrigin()\", ops);\n\t\tbreak;\n\t}\n\tcase OpRayQueryGetIntersectionObjectToWorldKHR:\n\t{\n\t\temit_rayquery_function(\".CommittedObjectToWorld4x3()\", \".CandidateObjectToWorld4x3()\", ops);\n\t\tbreak;\n\t}\n\tcase OpRayQueryGetIntersectionWorldToObjectKHR:\n\t{\n\t\temit_rayquery_function(\".CommittedWorldToObject4x3()\", \".CandidateWorldToObject4x3()\", ops);\n\t\tbreak;\n\t}\n\tcase OpRayQueryGetRayFlagsKHR:\n\t{\n\t\tflush_variable_declaration(ops[0]);\n\t\temit_op(ops[0], ops[1], join(to_expression(ops[2]), \".RayFlags()\"), false);\n\t\tbreak;\n\t}\n\tcase OpRayQueryGetRayTMinKHR:\n\t{\n\t\tflush_variable_declaration(ops[0]);\n\t\temit_op(ops[0], ops[1], join(to_expression(ops[2]), \".RayTMin()\"), false);\n\t\tbreak;\n\t}\n\tcase OpRayQueryGetWorldRayOriginKHR:\n\t{\n\t\tflush_variable_declaration(ops[0]);\n\t\temit_op(ops[0], ops[1], join(to_expression(ops[2]), \".WorldRayOrigin()\"), false);\n\t\tbreak;\n\t}\n\tcase OpRayQueryGetWorldRayDirectionKHR:\n\t{\n\t\tflush_variable_declaration(ops[0]);\n\t\temit_op(ops[0], ops[1], join(to_expression(ops[2]), \".WorldRayDirection()\"), false);\n\t\tbreak;\n\t}\n\tcase OpSetMeshOutputsEXT:\n\t{\n\t\tstatement(\"SetMeshOutputCounts(\", to_unpacked_expression(ops[0]), \", \", to_unpacked_expression(ops[1]), \");\");\n\t\tbreak;\n\t}\n\tdefault:\n\t\tCompilerGLSL::emit_instruction(instruction);\n\t\tbreak;\n\t}\n}\n\nvoid CompilerHLSL::require_texture_query_variant(uint32_t var_id)\n{\n\tif (const auto *var = maybe_get_backing_variable(var_id))\n\t\tvar_id = var->self;\n\n\tauto &type = expression_type(var_id);\n\tbool uav = type.image.sampled == 2;\n\tif (hlsl_options.nonwritable_uav_texture_as_srv && has_decoration(var_id, DecorationNonWritable))\n\t\tuav = false;\n\n\tuint32_t bit = 0;\n\tswitch (type.image.dim)\n\t{\n\tcase Dim1D:\n\t\tbit = type.image.arrayed ? Query1DArray : Query1D;\n\t\tbreak;\n\n\tcase Dim2D:\n\t\tif (type.image.ms)\n\t\t\tbit = type.image.arrayed ? Query2DMSArray : Query2DMS;\n\t\telse\n\t\t\tbit = type.image.arrayed ? Query2DArray : Query2D;\n\t\tbreak;\n\n\tcase Dim3D:\n\t\tbit = Query3D;\n\t\tbreak;\n\n\tcase DimCube:\n\t\tbit = type.image.arrayed ? QueryCubeArray : QueryCube;\n\t\tbreak;\n\n\tcase DimBuffer:\n\t\tbit = QueryBuffer;\n\t\tbreak;\n\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Unsupported query type.\");\n\t}\n\n\tswitch (get<SPIRType>(type.image.type).basetype)\n\t{\n\tcase SPIRType::Float:\n\t\tbit += QueryTypeFloat;\n\t\tbreak;\n\n\tcase SPIRType::Int:\n\t\tbit += QueryTypeInt;\n\t\tbreak;\n\n\tcase SPIRType::UInt:\n\t\tbit += QueryTypeUInt;\n\t\tbreak;\n\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Unsupported query type.\");\n\t}\n\n\tauto norm_state = image_format_to_normalized_state(type.image.format);\n\tauto &variant = uav ? required_texture_size_variants\n\t                          .uav[uint32_t(norm_state)][image_format_to_components(type.image.format) - 1] :\n\t                      required_texture_size_variants.srv;\n\n\tuint64_t mask = 1ull << bit;\n\tif ((variant & mask) == 0)\n\t{\n\t\tforce_recompile();\n\t\tvariant |= mask;\n\t}\n}\n\nvoid CompilerHLSL::set_root_constant_layouts(std::vector<RootConstants> layout)\n{\n\troot_constants_layout = std::move(layout);\n}\n\nvoid CompilerHLSL::add_vertex_attribute_remap(const HLSLVertexAttributeRemap &vertex_attributes)\n{\n\tremap_vertex_attributes.push_back(vertex_attributes);\n}\n\nVariableID CompilerHLSL::remap_num_workgroups_builtin()\n{\n\tupdate_active_builtins();\n\n\tif (!active_input_builtins.get(BuiltInNumWorkgroups))\n\t\treturn 0;\n\n\t// Create a new, fake UBO.\n\tuint32_t offset = ir.increase_bound_by(4);\n\n\tuint32_t uint_type_id = offset;\n\tuint32_t block_type_id = offset + 1;\n\tuint32_t block_pointer_type_id = offset + 2;\n\tuint32_t variable_id = offset + 3;\n\n\tSPIRType uint_type { OpTypeVector };\n\tuint_type.basetype = SPIRType::UInt;\n\tuint_type.width = 32;\n\tuint_type.vecsize = 3;\n\tuint_type.columns = 1;\n\tset<SPIRType>(uint_type_id, uint_type);\n\n\tSPIRType block_type { OpTypeStruct };\n\tblock_type.basetype = SPIRType::Struct;\n\tblock_type.member_types.push_back(uint_type_id);\n\tset<SPIRType>(block_type_id, block_type);\n\tset_decoration(block_type_id, DecorationBlock);\n\tset_member_name(block_type_id, 0, \"count\");\n\tset_member_decoration(block_type_id, 0, DecorationOffset, 0);\n\n\tSPIRType block_pointer_type = block_type;\n\tblock_pointer_type.pointer = true;\n\tblock_pointer_type.storage = StorageClassUniform;\n\tblock_pointer_type.parent_type = block_type_id;\n\tauto &ptr_type = set<SPIRType>(block_pointer_type_id, block_pointer_type);\n\n\t// Preserve self.\n\tptr_type.self = block_type_id;\n\n\tset<SPIRVariable>(variable_id, block_pointer_type_id, StorageClassUniform);\n\tir.meta[variable_id].decoration.alias = \"SPIRV_Cross_NumWorkgroups\";\n\n\tnum_workgroups_builtin = variable_id;\n\tget_entry_point().interface_variables.push_back(num_workgroups_builtin);\n\treturn variable_id;\n}\n\nvoid CompilerHLSL::set_resource_binding_flags(HLSLBindingFlags flags)\n{\n\tresource_binding_flags = flags;\n}\n\nvoid CompilerHLSL::validate_shader_model()\n{\n\t// Check for nonuniform qualifier.\n\t// Instead of looping over all decorations to find this, just look at capabilities.\n\tfor (auto &cap : ir.declared_capabilities)\n\t{\n\t\tswitch (cap)\n\t\t{\n\t\tcase CapabilityShaderNonUniformEXT:\n\t\tcase CapabilityRuntimeDescriptorArrayEXT:\n\t\t\tif (hlsl_options.shader_model < 51)\n\t\t\t\tSPIRV_CROSS_THROW(\n\t\t\t\t    \"Shader model 5.1 or higher is required to use bindless resources or NonUniformResourceIndex.\");\n\t\t\tbreak;\n\n\t\tcase CapabilityVariablePointers:\n\t\tcase CapabilityVariablePointersStorageBuffer:\n\t\t\tSPIRV_CROSS_THROW(\"VariablePointers capability is not supported in HLSL.\");\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (ir.addressing_model != AddressingModelLogical)\n\t\tSPIRV_CROSS_THROW(\"Only Logical addressing model can be used with HLSL.\");\n\n\tif (hlsl_options.enable_16bit_types && hlsl_options.shader_model < 62)\n\t\tSPIRV_CROSS_THROW(\"Need at least shader model 6.2 when enabling native 16-bit type support.\");\n}\n\nstring CompilerHLSL::compile()\n{\n\tir.fixup_reserved_names();\n\n\t// Do not deal with ES-isms like precision, older extensions and such.\n\toptions.es = false;\n\toptions.version = 450;\n\toptions.vulkan_semantics = true;\n\tbackend.float_literal_suffix = true;\n\tbackend.double_literal_suffix = false;\n\tbackend.long_long_literal_suffix = true;\n\tbackend.uint32_t_literal_suffix = true;\n\tbackend.int16_t_literal_suffix = \"\";\n\tbackend.uint16_t_literal_suffix = \"u\";\n\tbackend.basic_int_type = \"int\";\n\tbackend.basic_uint_type = \"uint\";\n\tbackend.demote_literal = \"discard\";\n\tbackend.boolean_mix_function = \"\";\n\tbackend.swizzle_is_function = false;\n\tbackend.shared_is_implied = true;\n\tbackend.unsized_array_supported = true;\n\tbackend.explicit_struct_type = false;\n\tbackend.use_initializer_list = true;\n\tbackend.use_constructor_splatting = false;\n\tbackend.can_swizzle_scalar = true;\n\tbackend.can_declare_struct_inline = false;\n\tbackend.can_declare_arrays_inline = false;\n\tbackend.can_return_array = false;\n\tbackend.nonuniform_qualifier = \"NonUniformResourceIndex\";\n\tbackend.support_case_fallthrough = false;\n\tbackend.force_merged_mesh_block = get_execution_model() == ExecutionModelMeshEXT;\n\tbackend.force_gl_in_out_block = backend.force_merged_mesh_block;\n\n\t// SM 4.1 does not support precise for some reason.\n\tbackend.support_precise_qualifier = hlsl_options.shader_model >= 50 || hlsl_options.shader_model == 40;\n\n\tfixup_anonymous_struct_names();\n\tfixup_type_alias();\n\treorder_type_alias();\n\tbuild_function_control_flow_graphs_and_analyze();\n\tvalidate_shader_model();\n\tupdate_active_builtins();\n\tanalyze_image_and_sampler_usage();\n\tanalyze_interlocked_resource_usage();\n\tif (get_execution_model() == ExecutionModelMeshEXT)\n\t\tanalyze_meshlet_writes();\n\n\t// Subpass input needs SV_Position.\n\tif (need_subpass_input)\n\t\tactive_input_builtins.set(BuiltInFragCoord);\n\n\tuint32_t pass_count = 0;\n\tdo\n\t{\n\t\treset(pass_count);\n\n\t\t// Move constructor for this type is broken on GCC 4.9 ...\n\t\tbuffer.reset();\n\n\t\temit_header();\n\t\temit_resources();\n\n\t\temit_function(get<SPIRFunction>(ir.default_entry_point), Bitset());\n\t\temit_hlsl_entry_point();\n\n\t\tpass_count++;\n\t} while (is_forcing_recompilation());\n\n\t// Entry point in HLSL is always main() for the time being.\n\tget_entry_point().name = \"main\";\n\n\treturn buffer.str();\n}\n\nvoid CompilerHLSL::emit_block_hints(const SPIRBlock &block)\n{\n\tswitch (block.hint)\n\t{\n\tcase SPIRBlock::HintFlatten:\n\t\tstatement(\"[flatten]\");\n\t\tbreak;\n\tcase SPIRBlock::HintDontFlatten:\n\t\tstatement(\"[branch]\");\n\t\tbreak;\n\tcase SPIRBlock::HintUnroll:\n\t\tstatement(\"[unroll]\");\n\t\tbreak;\n\tcase SPIRBlock::HintDontUnroll:\n\t\tstatement(\"[loop]\");\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nstring CompilerHLSL::get_unique_identifier()\n{\n\treturn join(\"_\", unique_identifier_count++, \"ident\");\n}\n\nvoid CompilerHLSL::add_hlsl_resource_binding(const HLSLResourceBinding &binding)\n{\n\tStageSetBinding tuple = { binding.stage, binding.desc_set, binding.binding };\n\tresource_bindings[tuple] = { binding, false };\n}\n\nbool CompilerHLSL::is_hlsl_resource_binding_used(ExecutionModel model, uint32_t desc_set, uint32_t binding) const\n{\n\tStageSetBinding tuple = { model, desc_set, binding };\n\tauto itr = resource_bindings.find(tuple);\n\treturn itr != end(resource_bindings) && itr->second.second;\n}\n\nCompilerHLSL::BitcastType CompilerHLSL::get_bitcast_type(uint32_t result_type, uint32_t op0)\n{\n\tauto &rslt_type = get<SPIRType>(result_type);\n\tauto &expr_type = expression_type(op0);\n\n\tif (rslt_type.basetype == SPIRType::BaseType::UInt64 && expr_type.basetype == SPIRType::BaseType::UInt &&\n\t    expr_type.vecsize == 2)\n\t\treturn BitcastType::TypePackUint2x32;\n\telse if (rslt_type.basetype == SPIRType::BaseType::UInt && rslt_type.vecsize == 2 &&\n\t         expr_type.basetype == SPIRType::BaseType::UInt64)\n\t\treturn BitcastType::TypeUnpackUint64;\n\n\treturn BitcastType::TypeNormal;\n}\n\nbool CompilerHLSL::is_hlsl_force_storage_buffer_as_uav(ID id) const\n{\n\tif (hlsl_options.force_storage_buffer_as_uav)\n\t{\n\t\treturn true;\n\t}\n\n\tconst uint32_t desc_set = get_decoration(id, spv::DecorationDescriptorSet);\n\tconst uint32_t binding = get_decoration(id, spv::DecorationBinding);\n\n\treturn (force_uav_buffer_bindings.find({ desc_set, binding }) != force_uav_buffer_bindings.end());\n}\n\nvoid CompilerHLSL::set_hlsl_force_storage_buffer_as_uav(uint32_t desc_set, uint32_t binding)\n{\n\tSetBindingPair pair = { desc_set, binding };\n\tforce_uav_buffer_bindings.insert(pair);\n}\n\nbool CompilerHLSL::is_user_type_structured(uint32_t id) const\n{\n\tif (hlsl_options.preserve_structured_buffers)\n\t{\n\t\t// Compare left hand side of string only as these user types can contain more meta data such as their subtypes,\n\t\t// e.g. \"structuredbuffer:int\"\n\t\tconst std::string &user_type = get_decoration_string(id, DecorationUserTypeGOOGLE);\n\t\treturn user_type.compare(0, 16, \"structuredbuffer\") == 0 ||\n\t\t       user_type.compare(0, 18, \"rwstructuredbuffer\") == 0 ||\n\t\t       user_type.compare(0, 33, \"rasterizerorderedstructuredbuffer\") == 0;\n\t}\n\treturn false;\n}\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv_hlsl.hpp",
    "content": "/*\n * Copyright 2016-2021 Robert Konrad\n * SPDX-License-Identifier: Apache-2.0 OR MIT\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * At your option, you may choose to accept this material under either:\n *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or\n *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.\n */\n\n#ifndef SPIRV_HLSL_HPP\n#define SPIRV_HLSL_HPP\n\n#include \"spirv_glsl.hpp\"\n#include <utility>\n\nnamespace SPIRV_CROSS_NAMESPACE\n{\n// Interface which remaps vertex inputs to a fixed semantic name to make linking easier.\nstruct HLSLVertexAttributeRemap\n{\n\tuint32_t location;\n\tstd::string semantic;\n};\n// Specifying a root constant (d3d12) or push constant range (vulkan).\n//\n// `start` and `end` denotes the range of the root constant in bytes.\n// Both values need to be multiple of 4.\nstruct RootConstants\n{\n\tuint32_t start;\n\tuint32_t end;\n\n\tuint32_t binding;\n\tuint32_t space;\n};\n\n// For finer control, decorations may be removed from specific resources instead with unset_decoration().\nenum HLSLBindingFlagBits\n{\n\tHLSL_BINDING_AUTO_NONE_BIT = 0,\n\n\t// Push constant (root constant) resources will be declared as CBVs (b-space) without a register() declaration.\n\t// A register will be automatically assigned by the D3D compiler, but must therefore be reflected in D3D-land.\n\t// Push constants do not normally have a DecorationBinding set, but if they do, this can be used to ignore it.\n\tHLSL_BINDING_AUTO_PUSH_CONSTANT_BIT = 1 << 0,\n\n\t// cbuffer resources will be declared as CBVs (b-space) without a register() declaration.\n\t// A register will be automatically assigned, but must be reflected in D3D-land.\n\tHLSL_BINDING_AUTO_CBV_BIT = 1 << 1,\n\n\t// All SRVs (t-space) will be declared without a register() declaration.\n\tHLSL_BINDING_AUTO_SRV_BIT = 1 << 2,\n\n\t// All UAVs (u-space) will be declared without a register() declaration.\n\tHLSL_BINDING_AUTO_UAV_BIT = 1 << 3,\n\n\t// All samplers (s-space) will be declared without a register() declaration.\n\tHLSL_BINDING_AUTO_SAMPLER_BIT = 1 << 4,\n\n\t// No resources will be declared with register().\n\tHLSL_BINDING_AUTO_ALL = 0x7fffffff\n};\nusing HLSLBindingFlags = uint32_t;\n\n// By matching stage, desc_set and binding for a SPIR-V resource,\n// register bindings are set based on whether the HLSL resource is a\n// CBV, UAV, SRV or Sampler. A single binding in SPIR-V might contain multiple\n// resource types, e.g. COMBINED_IMAGE_SAMPLER, and SRV/Sampler bindings will be used respectively.\n// On SM 5.0 and lower, register_space is ignored.\n//\n// To remap a push constant block which does not have any desc_set/binding associated with it,\n// use ResourceBindingPushConstant{DescriptorSet,Binding} as values for desc_set/binding.\n// For deeper control of push constants, set_root_constant_layouts() can be used instead.\nstruct HLSLResourceBinding\n{\n\tspv::ExecutionModel stage = spv::ExecutionModelMax;\n\tuint32_t desc_set = 0;\n\tuint32_t binding = 0;\n\n\tstruct Binding\n\t{\n\t\tuint32_t register_space = 0;\n\t\tuint32_t register_binding = 0;\n\t} cbv, uav, srv, sampler;\n};\n\nenum HLSLAuxBinding\n{\n\tHLSL_AUX_BINDING_BASE_VERTEX_INSTANCE = 0\n};\n\nclass CompilerHLSL : public CompilerGLSL\n{\npublic:\n\tstruct Options\n\t{\n\t\tuint32_t shader_model = 30; // TODO: map ps_4_0_level_9_0,... somehow\n\n\t\t// Allows the PointSize builtin in SM 4.0+, and ignores it, as PointSize is not supported in SM 4+.\n\t\tbool point_size_compat = false;\n\n\t\t// Allows the PointCoord builtin, returns float2(0.5, 0.5), as PointCoord is not supported in HLSL.\n\t\tbool point_coord_compat = false;\n\n\t\t// If true, the backend will assume that VertexIndex and InstanceIndex will need to apply\n\t\t// a base offset, and you will need to fill in a cbuffer with offsets.\n\t\t// Set to false if you know you will never use base instance or base vertex\n\t\t// functionality as it might remove an internal cbuffer.\n\t\tbool support_nonzero_base_vertex_base_instance = false;\n\n\t\t// Forces a storage buffer to always be declared as UAV, even if the readonly decoration is used.\n\t\t// By default, a readonly storage buffer will be declared as ByteAddressBuffer (SRV) instead.\n\t\t// Alternatively, use set_hlsl_force_storage_buffer_as_uav to specify individually.\n\t\tbool force_storage_buffer_as_uav = false;\n\t\n\t\t// Forces any storage image type marked as NonWritable to be considered an SRV instead.\n\t\t// For this to work with function call parameters, NonWritable must be considered to be part of the type system\n\t\t// so that NonWritable image arguments are also translated to Texture rather than RWTexture.\n\t\tbool nonwritable_uav_texture_as_srv = false;\n\n\t\t// Enables native 16-bit types. Needs SM 6.2.\n\t\t// Uses half/int16_t/uint16_t instead of min16* types.\n\t\t// Also adds support for 16-bit load-store from (RW)ByteAddressBuffer.\n\t\tbool enable_16bit_types = false;\n\n\t\t// If matrices are used as IO variables, flatten the attribute declaration to use\n\t\t// TEXCOORD{N,N+1,N+2,...} rather than TEXCOORDN_{0,1,2,3}.\n\t\t// If add_vertex_attribute_remap is used and this feature is used,\n\t\t// the semantic name will be queried once per active location.\n\t\tbool flatten_matrix_vertex_input_semantics = false;\n\n\t\t// Rather than emitting main() for the entry point, use the name in SPIR-V.\n\t\tbool use_entry_point_name = false;\n\n\t\t// Preserve (RW)StructuredBuffer types if the input source was HLSL.\n\t\t// This relies on UserTypeGOOGLE to encode the buffer type either as \"structuredbuffer\" or \"rwstructuredbuffer\"\n\t\t// whereas the type can be extended with an optional subtype, e.g. \"structuredbuffer:int\".\n\t\tbool preserve_structured_buffers = false;\n\t};\n\n\texplicit CompilerHLSL(std::vector<uint32_t> spirv_)\n\t    : CompilerGLSL(std::move(spirv_))\n\t{\n\t}\n\n\tCompilerHLSL(const uint32_t *ir_, size_t size)\n\t    : CompilerGLSL(ir_, size)\n\t{\n\t}\n\n\texplicit CompilerHLSL(const ParsedIR &ir_)\n\t    : CompilerGLSL(ir_)\n\t{\n\t}\n\n\texplicit CompilerHLSL(ParsedIR &&ir_)\n\t    : CompilerGLSL(std::move(ir_))\n\t{\n\t}\n\n\tconst Options &get_hlsl_options() const\n\t{\n\t\treturn hlsl_options;\n\t}\n\n\tvoid set_hlsl_options(const Options &opts)\n\t{\n\t\thlsl_options = opts;\n\t}\n\n\t// Optionally specify a custom root constant layout.\n\t//\n\t// Push constants ranges will be split up according to the\n\t// layout specified.\n\tvoid set_root_constant_layouts(std::vector<RootConstants> layout);\n\n\t// Compiles and remaps vertex attributes at specific locations to a fixed semantic.\n\t// The default is TEXCOORD# where # denotes location.\n\t// Matrices are unrolled to vectors with notation ${SEMANTIC}_#, where # denotes row.\n\t// $SEMANTIC is either TEXCOORD# or a semantic name specified here.\n\tvoid add_vertex_attribute_remap(const HLSLVertexAttributeRemap &vertex_attributes);\n\tstd::string compile() override;\n\n\t// This is a special HLSL workaround for the NumWorkGroups builtin.\n\t// This does not exist in HLSL, so the calling application must create a dummy cbuffer in\n\t// which the application will store this builtin.\n\t// The cbuffer layout will be:\n\t// cbuffer SPIRV_Cross_NumWorkgroups : register(b#, space#) { uint3 SPIRV_Cross_NumWorkgroups_count; };\n\t// This must be called before compile().\n\t// The function returns 0 if NumWorkGroups builtin is not statically used in the shader from the current entry point.\n\t// If non-zero, this returns the variable ID of a cbuffer which corresponds to\n\t// the cbuffer declared above. By default, no binding or descriptor set decoration is set,\n\t// so the calling application should declare explicit bindings on this ID before calling compile().\n\tVariableID remap_num_workgroups_builtin();\n\n\t// Controls how resource bindings are declared in the output HLSL.\n\tvoid set_resource_binding_flags(HLSLBindingFlags flags);\n\n\t// resource is a resource binding to indicate the HLSL CBV, SRV, UAV or sampler binding\n\t// to use for a particular SPIR-V description set\n\t// and binding. If resource bindings are provided,\n\t// is_hlsl_resource_binding_used() will return true after calling ::compile() if\n\t// the set/binding combination was used by the HLSL code.\n\tvoid add_hlsl_resource_binding(const HLSLResourceBinding &resource);\n\tbool is_hlsl_resource_binding_used(spv::ExecutionModel model, uint32_t set, uint32_t binding) const;\n\n\t// Controls which storage buffer bindings will be forced to be declared as UAVs.\n\tvoid set_hlsl_force_storage_buffer_as_uav(uint32_t desc_set, uint32_t binding);\n\n\t// By default, these magic buffers are not assigned a specific binding.\n\tvoid set_hlsl_aux_buffer_binding(HLSLAuxBinding binding, uint32_t register_index, uint32_t register_space);\n\tvoid unset_hlsl_aux_buffer_binding(HLSLAuxBinding binding);\n\tbool is_hlsl_aux_buffer_binding_used(HLSLAuxBinding binding) const;\n\nprivate:\n\tstd::string type_to_glsl(const SPIRType &type, uint32_t id = 0) override;\n\tstd::string image_type_hlsl(const SPIRType &type, uint32_t id);\n\tstd::string image_type_hlsl_modern(const SPIRType &type, uint32_t id);\n\tstd::string image_type_hlsl_legacy(const SPIRType &type, uint32_t id);\n\tvoid emit_function_prototype(SPIRFunction &func, const Bitset &return_flags) override;\n\tvoid emit_hlsl_entry_point();\n\tvoid emit_header() override;\n\tvoid emit_resources();\n\tvoid emit_interface_block_globally(const SPIRVariable &type);\n\tvoid emit_interface_block_in_struct(const SPIRVariable &var, std::unordered_set<uint32_t> &active_locations);\n\tvoid emit_interface_block_member_in_struct(const SPIRVariable &var, uint32_t member_index, uint32_t location,\n\t                                           std::unordered_set<uint32_t> &active_locations);\n\tvoid emit_builtin_inputs_in_struct();\n\tvoid emit_builtin_outputs_in_struct();\n\tvoid emit_builtin_primitive_outputs_in_struct();\n\tvoid emit_texture_op(const Instruction &i, bool sparse) override;\n\tvoid emit_instruction(const Instruction &instruction) override;\n\tvoid emit_glsl_op(uint32_t result_type, uint32_t result_id, uint32_t op, const uint32_t *args,\n\t                  uint32_t count) override;\n\tvoid emit_buffer_block(const SPIRVariable &type) override;\n\tvoid emit_push_constant_block(const SPIRVariable &var) override;\n\tvoid emit_uniform(const SPIRVariable &var) override;\n\tvoid emit_modern_uniform(const SPIRVariable &var);\n\tvoid emit_legacy_uniform(const SPIRVariable &var);\n\tvoid emit_specialization_constants_and_structs();\n\tvoid emit_composite_constants();\n\tvoid emit_fixup() override;\n\tstd::string builtin_to_glsl(spv::BuiltIn builtin, spv::StorageClass storage) override;\n\tstd::string layout_for_member(const SPIRType &type, uint32_t index) override;\n\tstd::string to_interpolation_qualifiers(const Bitset &flags) override;\n\tstd::string bitcast_glsl_op(const SPIRType &result_type, const SPIRType &argument_type) override;\n\tbool emit_complex_bitcast(uint32_t result_type, uint32_t id, uint32_t op0) override;\n\tstd::string to_func_call_arg(const SPIRFunction::Parameter &arg, uint32_t id) override;\n\tstd::string to_sampler_expression(uint32_t id);\n\tstd::string to_resource_binding(const SPIRVariable &var);\n\tstd::string to_resource_binding_sampler(const SPIRVariable &var);\n\tstd::string to_resource_register(HLSLBindingFlagBits flag, char space, uint32_t binding, uint32_t set);\n\tstd::string to_initializer_expression(const SPIRVariable &var) override;\n\tvoid emit_sampled_image_op(uint32_t result_type, uint32_t result_id, uint32_t image_id, uint32_t samp_id) override;\n\tvoid emit_access_chain(const Instruction &instruction);\n\tvoid emit_load(const Instruction &instruction);\n\tvoid read_access_chain(std::string *expr, const std::string &lhs, const SPIRAccessChain &chain);\n\tvoid read_access_chain_struct(const std::string &lhs, const SPIRAccessChain &chain);\n\tvoid read_access_chain_array(const std::string &lhs, const SPIRAccessChain &chain);\n\tvoid write_access_chain(const SPIRAccessChain &chain, uint32_t value, const SmallVector<uint32_t> &composite_chain);\n\tvoid write_access_chain_struct(const SPIRAccessChain &chain, uint32_t value,\n\t                               const SmallVector<uint32_t> &composite_chain);\n\tvoid write_access_chain_array(const SPIRAccessChain &chain, uint32_t value,\n\t                              const SmallVector<uint32_t> &composite_chain);\n\tstd::string write_access_chain_value(uint32_t value, const SmallVector<uint32_t> &composite_chain, bool enclose);\n\tvoid emit_store(const Instruction &instruction);\n\tvoid emit_atomic(const uint32_t *ops, uint32_t length, spv::Op op);\n\tvoid emit_subgroup_op(const Instruction &i) override;\n\tvoid emit_block_hints(const SPIRBlock &block) override;\n\n\tvoid emit_struct_member(const SPIRType &type, uint32_t member_type_id, uint32_t index, const std::string &qualifier,\n\t                        uint32_t base_offset = 0) override;\n\tvoid emit_rayquery_function(const char *commited, const char *candidate, const uint32_t *ops);\n\tvoid emit_mesh_tasks(SPIRBlock &block) override;\n\n\tconst char *to_storage_qualifiers_glsl(const SPIRVariable &var) override;\n\tvoid replace_illegal_names() override;\n\n\tSPIRType::BaseType get_builtin_basetype(spv::BuiltIn builtin, SPIRType::BaseType default_type) override;\n\n\tbool is_hlsl_force_storage_buffer_as_uav(ID id) const;\n\n\tOptions hlsl_options;\n\n\t// TODO: Refactor this to be more similar to MSL, maybe have some common system in place?\n\tbool requires_op_fmod = false;\n\tbool requires_fp16_packing = false;\n\tbool requires_uint2_packing = false;\n\tbool requires_explicit_fp16_packing = false;\n\tbool requires_unorm8_packing = false;\n\tbool requires_snorm8_packing = false;\n\tbool requires_unorm16_packing = false;\n\tbool requires_snorm16_packing = false;\n\tbool requires_bitfield_insert = false;\n\tbool requires_bitfield_extract = false;\n\tbool requires_inverse_2x2 = false;\n\tbool requires_inverse_3x3 = false;\n\tbool requires_inverse_4x4 = false;\n\tbool requires_scalar_reflect = false;\n\tbool requires_scalar_refract = false;\n\tbool requires_scalar_faceforward = false;\n\n\tstruct TextureSizeVariants\n\t{\n\t\t// MSVC 2013 workaround.\n\t\tTextureSizeVariants()\n\t\t{\n\t\t\tsrv = 0;\n\t\t\tfor (auto &unorm : uav)\n\t\t\t\tfor (auto &u : unorm)\n\t\t\t\t\tu = 0;\n\t\t}\n\t\tuint64_t srv;\n\t\tuint64_t uav[3][4];\n\t} required_texture_size_variants;\n\n\tvoid require_texture_query_variant(uint32_t var_id);\n\tvoid emit_texture_size_variants(uint64_t variant_mask, const char *vecsize_qualifier, bool uav,\n\t                                const char *type_qualifier);\n\n\tenum TextureQueryVariantDim\n\t{\n\t\tQuery1D = 0,\n\t\tQuery1DArray,\n\t\tQuery2D,\n\t\tQuery2DArray,\n\t\tQuery3D,\n\t\tQueryBuffer,\n\t\tQueryCube,\n\t\tQueryCubeArray,\n\t\tQuery2DMS,\n\t\tQuery2DMSArray,\n\t\tQueryDimCount\n\t};\n\n\tenum TextureQueryVariantType\n\t{\n\t\tQueryTypeFloat = 0,\n\t\tQueryTypeInt = 16,\n\t\tQueryTypeUInt = 32,\n\t\tQueryTypeCount = 3\n\t};\n\n\tenum BitcastType\n\t{\n\t\tTypeNormal,\n\t\tTypePackUint2x32,\n\t\tTypeUnpackUint64\n\t};\n\n\tvoid analyze_meshlet_writes();\n\tvoid analyze_meshlet_writes(uint32_t func_id, uint32_t id_per_vertex, uint32_t id_per_primitive,\n\t                            std::unordered_set<uint32_t> &processed_func_ids);\n\n\tBitcastType get_bitcast_type(uint32_t result_type, uint32_t op0);\n\n\tvoid emit_builtin_variables();\n\tbool require_output = false;\n\tbool require_input = false;\n\tSmallVector<HLSLVertexAttributeRemap> remap_vertex_attributes;\n\n\tuint32_t type_to_consumed_locations(const SPIRType &type) const;\n\n\tstd::string to_semantic(uint32_t location, spv::ExecutionModel em, spv::StorageClass sc);\n\n\tuint32_t num_workgroups_builtin = 0;\n\tHLSLBindingFlags resource_binding_flags = 0;\n\n\t// Custom root constant layout, which should be emitted\n\t// when translating push constant ranges.\n\tstd::vector<RootConstants> root_constants_layout;\n\n\tvoid validate_shader_model();\n\n\tstd::string get_unique_identifier();\n\tuint32_t unique_identifier_count = 0;\n\n\tstd::unordered_map<StageSetBinding, std::pair<HLSLResourceBinding, bool>, InternalHasher> resource_bindings;\n\tvoid remap_hlsl_resource_binding(HLSLBindingFlagBits type, uint32_t &desc_set, uint32_t &binding);\n\n\tstd::unordered_set<SetBindingPair, InternalHasher> force_uav_buffer_bindings;\n\n\tstruct\n\t{\n\t\tuint32_t register_index = 0;\n\t\tuint32_t register_space = 0;\n\t\tbool explicit_binding = false;\n\t\tbool used = false;\n\t} base_vertex_info;\n\n\t// Returns true if the specified ID has a UserTypeGOOGLE decoration for StructuredBuffer or RWStructuredBuffer resources.\n\tbool is_user_type_structured(uint32_t id) const override;\n\n\tstd::vector<TypeID> composite_selection_workaround_types;\n\n\tstd::string get_inner_entry_point_name() const;\n};\n} // namespace SPIRV_CROSS_NAMESPACE\n\n#endif\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv_msl.cpp",
    "content": "/*\n * Copyright 2016-2021 The Brenwill Workshop Ltd.\n * SPDX-License-Identifier: Apache-2.0 OR MIT\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * At your option, you may choose to accept this material under either:\n *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or\n *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.\n */\n\n#include \"spirv_msl.hpp\"\n#include \"GLSL.std.450.h\"\n\n#include <algorithm>\n#include <assert.h>\n#include <numeric>\n\nusing namespace spv;\nusing namespace SPIRV_CROSS_NAMESPACE;\nusing namespace std;\n\nstatic const uint32_t k_unknown_location = ~0u;\nstatic const uint32_t k_unknown_component = ~0u;\nstatic const char *force_inline = \"static inline __attribute__((always_inline))\";\n\nCompilerMSL::CompilerMSL(std::vector<uint32_t> spirv_)\n    : CompilerGLSL(std::move(spirv_))\n{\n}\n\nCompilerMSL::CompilerMSL(const uint32_t *ir_, size_t word_count)\n    : CompilerGLSL(ir_, word_count)\n{\n}\n\nCompilerMSL::CompilerMSL(const ParsedIR &ir_)\n    : CompilerGLSL(ir_)\n{\n}\n\nCompilerMSL::CompilerMSL(ParsedIR &&ir_)\n    : CompilerGLSL(std::move(ir_))\n{\n}\n\nvoid CompilerMSL::add_msl_shader_input(const MSLShaderInterfaceVariable &si)\n{\n\tinputs_by_location[{si.location, si.component}] = si;\n\tif (si.builtin != BuiltInMax && !inputs_by_builtin.count(si.builtin))\n\t\tinputs_by_builtin[si.builtin] = si;\n}\n\nvoid CompilerMSL::add_msl_shader_output(const MSLShaderInterfaceVariable &so)\n{\n\toutputs_by_location[{so.location, so.component}] = so;\n\tif (so.builtin != BuiltInMax && !outputs_by_builtin.count(so.builtin))\n\t\toutputs_by_builtin[so.builtin] = so;\n}\n\nvoid CompilerMSL::add_msl_resource_binding(const MSLResourceBinding &binding)\n{\n\tStageSetBinding tuple = { binding.stage, binding.desc_set, binding.binding };\n\tresource_bindings[tuple] = { binding, false };\n\n\t// If we might need to pad argument buffer members to positionally align\n\t// arg buffer indexes, also maintain a lookup by argument buffer index.\n\tif (msl_options.pad_argument_buffer_resources)\n\t{\n\t\tStageSetBinding arg_idx_tuple = { binding.stage, binding.desc_set, k_unknown_component };\n\n#define ADD_ARG_IDX_TO_BINDING_NUM_LOOKUP(rez) \\\n\targ_idx_tuple.binding = binding.msl_##rez; \\\n\tresource_arg_buff_idx_to_binding_number[arg_idx_tuple] = binding.binding\n\n\t\tswitch (binding.basetype)\n\t\t{\n\t\tcase SPIRType::Void:\n\t\tcase SPIRType::Boolean:\n\t\tcase SPIRType::SByte:\n\t\tcase SPIRType::UByte:\n\t\tcase SPIRType::Short:\n\t\tcase SPIRType::UShort:\n\t\tcase SPIRType::Int:\n\t\tcase SPIRType::UInt:\n\t\tcase SPIRType::Int64:\n\t\tcase SPIRType::UInt64:\n\t\tcase SPIRType::AtomicCounter:\n\t\tcase SPIRType::Half:\n\t\tcase SPIRType::Float:\n\t\tcase SPIRType::Double:\n\t\t\tADD_ARG_IDX_TO_BINDING_NUM_LOOKUP(buffer);\n\t\t\tbreak;\n\t\tcase SPIRType::Image:\n\t\t\tADD_ARG_IDX_TO_BINDING_NUM_LOOKUP(texture);\n\t\t\tbreak;\n\t\tcase SPIRType::Sampler:\n\t\t\tADD_ARG_IDX_TO_BINDING_NUM_LOOKUP(sampler);\n\t\t\tbreak;\n\t\tcase SPIRType::SampledImage:\n\t\t\tADD_ARG_IDX_TO_BINDING_NUM_LOOKUP(texture);\n\t\t\tADD_ARG_IDX_TO_BINDING_NUM_LOOKUP(sampler);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tSPIRV_CROSS_THROW(\"Unexpected argument buffer resource base type. When padding argument buffer elements, \"\n\t\t\t                  \"all descriptor set resources must be supplied with a base type by the app.\");\n\t\t}\n#undef ADD_ARG_IDX_TO_BINDING_NUM_LOOKUP\n\t}\n}\n\nvoid CompilerMSL::add_dynamic_buffer(uint32_t desc_set, uint32_t binding, uint32_t index)\n{\n\tSetBindingPair pair = { desc_set, binding };\n\tbuffers_requiring_dynamic_offset[pair] = { index, 0 };\n}\n\nvoid CompilerMSL::add_inline_uniform_block(uint32_t desc_set, uint32_t binding)\n{\n\tSetBindingPair pair = { desc_set, binding };\n\tinline_uniform_blocks.insert(pair);\n}\n\nvoid CompilerMSL::add_discrete_descriptor_set(uint32_t desc_set)\n{\n\tif (desc_set < kMaxArgumentBuffers)\n\t\targument_buffer_discrete_mask |= 1u << desc_set;\n}\n\nvoid CompilerMSL::set_argument_buffer_device_address_space(uint32_t desc_set, bool device_storage)\n{\n\tif (desc_set < kMaxArgumentBuffers)\n\t{\n\t\tif (device_storage)\n\t\t\targument_buffer_device_storage_mask |= 1u << desc_set;\n\t\telse\n\t\t\targument_buffer_device_storage_mask &= ~(1u << desc_set);\n\t}\n}\n\nbool CompilerMSL::is_msl_shader_input_used(uint32_t location)\n{\n\t// Don't report internal location allocations to app.\n\treturn location_inputs_in_use.count(location) != 0 &&\n\t       location_inputs_in_use_fallback.count(location) == 0;\n}\n\nbool CompilerMSL::is_msl_shader_output_used(uint32_t location)\n{\n\t// Don't report internal location allocations to app.\n\treturn location_outputs_in_use.count(location) != 0 &&\n\t       location_outputs_in_use_fallback.count(location) == 0;\n}\n\nuint32_t CompilerMSL::get_automatic_builtin_input_location(spv::BuiltIn builtin) const\n{\n\tauto itr = builtin_to_automatic_input_location.find(builtin);\n\tif (itr == builtin_to_automatic_input_location.end())\n\t\treturn k_unknown_location;\n\telse\n\t\treturn itr->second;\n}\n\nuint32_t CompilerMSL::get_automatic_builtin_output_location(spv::BuiltIn builtin) const\n{\n\tauto itr = builtin_to_automatic_output_location.find(builtin);\n\tif (itr == builtin_to_automatic_output_location.end())\n\t\treturn k_unknown_location;\n\telse\n\t\treturn itr->second;\n}\n\nbool CompilerMSL::is_msl_resource_binding_used(ExecutionModel model, uint32_t desc_set, uint32_t binding) const\n{\n\tStageSetBinding tuple = { model, desc_set, binding };\n\tauto itr = resource_bindings.find(tuple);\n\treturn itr != end(resource_bindings) && itr->second.second;\n}\n\nbool CompilerMSL::is_var_runtime_size_array(const SPIRVariable &var) const\n{\n\tauto& type = get_variable_data_type(var);\n\treturn is_runtime_size_array(type) && get_resource_array_size(type, var.self) == 0;\n}\n\n// Returns the size of the array of resources used by the variable with the specified type and id.\n// The size is first retrieved from the type, but in the case of runtime array sizing,\n// the size is retrieved from the resource binding added using add_msl_resource_binding().\nuint32_t CompilerMSL::get_resource_array_size(const SPIRType &type, uint32_t id) const\n{\n\tuint32_t array_size = to_array_size_literal(type);\n\tif (array_size) \n\t\treturn array_size;\n\n\tStageSetBinding tuple = { get_entry_point().model, get_decoration(id, DecorationDescriptorSet),\n\t\t                      get_decoration(id, DecorationBinding) };\n\tauto itr = resource_bindings.find(tuple);\n\treturn itr != end(resource_bindings) ? itr->second.first.count : 0;\n}\n\nuint32_t CompilerMSL::get_automatic_msl_resource_binding(uint32_t id) const\n{\n\treturn get_extended_decoration(id, SPIRVCrossDecorationResourceIndexPrimary);\n}\n\nuint32_t CompilerMSL::get_automatic_msl_resource_binding_secondary(uint32_t id) const\n{\n\treturn get_extended_decoration(id, SPIRVCrossDecorationResourceIndexSecondary);\n}\n\nuint32_t CompilerMSL::get_automatic_msl_resource_binding_tertiary(uint32_t id) const\n{\n\treturn get_extended_decoration(id, SPIRVCrossDecorationResourceIndexTertiary);\n}\n\nuint32_t CompilerMSL::get_automatic_msl_resource_binding_quaternary(uint32_t id) const\n{\n\treturn get_extended_decoration(id, SPIRVCrossDecorationResourceIndexQuaternary);\n}\n\nvoid CompilerMSL::set_fragment_output_components(uint32_t location, uint32_t components)\n{\n\tfragment_output_components[location] = components;\n}\n\nbool CompilerMSL::builtin_translates_to_nonarray(spv::BuiltIn builtin) const\n{\n\treturn (builtin == BuiltInSampleMask);\n}\n\nvoid CompilerMSL::build_implicit_builtins()\n{\n\tbool need_sample_pos = active_input_builtins.get(BuiltInSamplePosition);\n\tbool need_vertex_params = capture_output_to_buffer && get_execution_model() == ExecutionModelVertex &&\n\t                          !msl_options.vertex_for_tessellation;\n\tbool need_tesc_params = is_tesc_shader();\n\tbool need_tese_params = is_tese_shader() && msl_options.raw_buffer_tese_input;\n\tbool need_subgroup_mask =\n\t    active_input_builtins.get(BuiltInSubgroupEqMask) || active_input_builtins.get(BuiltInSubgroupGeMask) ||\n\t    active_input_builtins.get(BuiltInSubgroupGtMask) || active_input_builtins.get(BuiltInSubgroupLeMask) ||\n\t    active_input_builtins.get(BuiltInSubgroupLtMask);\n\tbool need_subgroup_ge_mask = !msl_options.is_ios() && (active_input_builtins.get(BuiltInSubgroupGeMask) ||\n\t                                                       active_input_builtins.get(BuiltInSubgroupGtMask));\n\tbool need_multiview = get_execution_model() == ExecutionModelVertex && !msl_options.view_index_from_device_index &&\n\t                      msl_options.multiview_layered_rendering &&\n\t                      (msl_options.multiview || active_input_builtins.get(BuiltInViewIndex));\n\tbool need_dispatch_base =\n\t    msl_options.dispatch_base && get_execution_model() == ExecutionModelGLCompute &&\n\t    (active_input_builtins.get(BuiltInWorkgroupId) || active_input_builtins.get(BuiltInGlobalInvocationId));\n\tbool need_grid_params = get_execution_model() == ExecutionModelVertex && msl_options.vertex_for_tessellation;\n\tbool need_vertex_base_params =\n\t    need_grid_params &&\n\t    (active_input_builtins.get(BuiltInVertexId) || active_input_builtins.get(BuiltInVertexIndex) ||\n\t     active_input_builtins.get(BuiltInBaseVertex) || active_input_builtins.get(BuiltInInstanceId) ||\n\t     active_input_builtins.get(BuiltInInstanceIndex) || active_input_builtins.get(BuiltInBaseInstance));\n\tbool need_local_invocation_index = msl_options.emulate_subgroups && active_input_builtins.get(BuiltInSubgroupId);\n\tbool need_workgroup_size = msl_options.emulate_subgroups && active_input_builtins.get(BuiltInNumSubgroups);\n\n\tif (need_subpass_input || need_sample_pos || need_subgroup_mask || need_vertex_params || need_tesc_params ||\n\t    need_tese_params || need_multiview || need_dispatch_base || need_vertex_base_params || need_grid_params ||\n\t    needs_sample_id || needs_subgroup_invocation_id || needs_subgroup_size || needs_helper_invocation ||\n\t\thas_additional_fixed_sample_mask() || need_local_invocation_index || need_workgroup_size)\n\t{\n\t\tbool has_frag_coord = false;\n\t\tbool has_sample_id = false;\n\t\tbool has_vertex_idx = false;\n\t\tbool has_base_vertex = false;\n\t\tbool has_instance_idx = false;\n\t\tbool has_base_instance = false;\n\t\tbool has_invocation_id = false;\n\t\tbool has_primitive_id = false;\n\t\tbool has_subgroup_invocation_id = false;\n\t\tbool has_subgroup_size = false;\n\t\tbool has_view_idx = false;\n\t\tbool has_layer = false;\n\t\tbool has_helper_invocation = false;\n\t\tbool has_local_invocation_index = false;\n\t\tbool has_workgroup_size = false;\n\t\tuint32_t workgroup_id_type = 0;\n\n\t\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\t\tif (var.storage != StorageClassInput && var.storage != StorageClassOutput)\n\t\t\t\treturn;\n\t\t\tif (!interface_variable_exists_in_entry_point(var.self))\n\t\t\t\treturn;\n\t\t\tif (!has_decoration(var.self, DecorationBuiltIn))\n\t\t\t\treturn;\n\n\t\t\tBuiltIn builtin = ir.meta[var.self].decoration.builtin_type;\n\n\t\t\tif (var.storage == StorageClassOutput)\n\t\t\t{\n\t\t\t\tif (has_additional_fixed_sample_mask() && builtin == BuiltInSampleMask)\n\t\t\t\t{\n\t\t\t\t\tbuiltin_sample_mask_id = var.self;\n\t\t\t\t\tmark_implicit_builtin(StorageClassOutput, BuiltInSampleMask, var.self);\n\t\t\t\t\tdoes_shader_write_sample_mask = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (var.storage != StorageClassInput)\n\t\t\t\treturn;\n\n\t\t\t// Use Metal's native frame-buffer fetch API for subpass inputs.\n\t\t\tif (need_subpass_input && (!msl_options.use_framebuffer_fetch_subpasses))\n\t\t\t{\n\t\t\t\tswitch (builtin)\n\t\t\t\t{\n\t\t\t\tcase BuiltInFragCoord:\n\t\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInFragCoord, var.self);\n\t\t\t\t\tbuiltin_frag_coord_id = var.self;\n\t\t\t\t\thas_frag_coord = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase BuiltInLayer:\n\t\t\t\t\tif (!msl_options.arrayed_subpass_input || msl_options.multiview)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInLayer, var.self);\n\t\t\t\t\tbuiltin_layer_id = var.self;\n\t\t\t\t\thas_layer = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase BuiltInViewIndex:\n\t\t\t\t\tif (!msl_options.multiview)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInViewIndex, var.self);\n\t\t\t\t\tbuiltin_view_idx_id = var.self;\n\t\t\t\t\thas_view_idx = true;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((need_sample_pos || needs_sample_id) && builtin == BuiltInSampleId)\n\t\t\t{\n\t\t\t\tbuiltin_sample_id_id = var.self;\n\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInSampleId, var.self);\n\t\t\t\thas_sample_id = true;\n\t\t\t}\n\n\t\t\tif (need_vertex_params)\n\t\t\t{\n\t\t\t\tswitch (builtin)\n\t\t\t\t{\n\t\t\t\tcase BuiltInVertexIndex:\n\t\t\t\t\tbuiltin_vertex_idx_id = var.self;\n\t\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInVertexIndex, var.self);\n\t\t\t\t\thas_vertex_idx = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase BuiltInBaseVertex:\n\t\t\t\t\tbuiltin_base_vertex_id = var.self;\n\t\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInBaseVertex, var.self);\n\t\t\t\t\thas_base_vertex = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase BuiltInInstanceIndex:\n\t\t\t\t\tbuiltin_instance_idx_id = var.self;\n\t\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInInstanceIndex, var.self);\n\t\t\t\t\thas_instance_idx = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase BuiltInBaseInstance:\n\t\t\t\t\tbuiltin_base_instance_id = var.self;\n\t\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInBaseInstance, var.self);\n\t\t\t\t\thas_base_instance = true;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (need_tesc_params && builtin == BuiltInInvocationId)\n\t\t\t{\n\t\t\t\tbuiltin_invocation_id_id = var.self;\n\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInInvocationId, var.self);\n\t\t\t\thas_invocation_id = true;\n\t\t\t}\n\n\t\t\tif ((need_tesc_params || need_tese_params) && builtin == BuiltInPrimitiveId)\n\t\t\t{\n\t\t\t\tbuiltin_primitive_id_id = var.self;\n\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInPrimitiveId, var.self);\n\t\t\t\thas_primitive_id = true;\n\t\t\t}\n\n\t\t\tif (need_tese_params && builtin == BuiltInTessLevelOuter)\n\t\t\t{\n\t\t\t\ttess_level_outer_var_id = var.self;\n\t\t\t}\n\n\t\t\tif (need_tese_params && builtin == BuiltInTessLevelInner)\n\t\t\t{\n\t\t\t\ttess_level_inner_var_id = var.self;\n\t\t\t}\n\n\t\t\tif ((need_subgroup_mask || needs_subgroup_invocation_id) && builtin == BuiltInSubgroupLocalInvocationId)\n\t\t\t{\n\t\t\t\tbuiltin_subgroup_invocation_id_id = var.self;\n\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInSubgroupLocalInvocationId, var.self);\n\t\t\t\thas_subgroup_invocation_id = true;\n\t\t\t}\n\n\t\t\tif ((need_subgroup_ge_mask || needs_subgroup_size) && builtin == BuiltInSubgroupSize)\n\t\t\t{\n\t\t\t\tbuiltin_subgroup_size_id = var.self;\n\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInSubgroupSize, var.self);\n\t\t\t\thas_subgroup_size = true;\n\t\t\t}\n\n\t\t\tif (need_multiview)\n\t\t\t{\n\t\t\t\tswitch (builtin)\n\t\t\t\t{\n\t\t\t\tcase BuiltInInstanceIndex:\n\t\t\t\t\t// The view index here is derived from the instance index.\n\t\t\t\t\tbuiltin_instance_idx_id = var.self;\n\t\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInInstanceIndex, var.self);\n\t\t\t\t\thas_instance_idx = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase BuiltInBaseInstance:\n\t\t\t\t\t// If a non-zero base instance is used, we need to adjust for it when calculating the view index.\n\t\t\t\t\tbuiltin_base_instance_id = var.self;\n\t\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInBaseInstance, var.self);\n\t\t\t\t\thas_base_instance = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase BuiltInViewIndex:\n\t\t\t\t\tbuiltin_view_idx_id = var.self;\n\t\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInViewIndex, var.self);\n\t\t\t\t\thas_view_idx = true;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (needs_helper_invocation && builtin == BuiltInHelperInvocation)\n\t\t\t{\n\t\t\t\tbuiltin_helper_invocation_id = var.self;\n\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInHelperInvocation, var.self);\n\t\t\t\thas_helper_invocation = true;\n\t\t\t}\n\n\t\t\tif (need_local_invocation_index && builtin == BuiltInLocalInvocationIndex)\n\t\t\t{\n\t\t\t\tbuiltin_local_invocation_index_id = var.self;\n\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInLocalInvocationIndex, var.self);\n\t\t\t\thas_local_invocation_index = true;\n\t\t\t}\n\n\t\t\tif (need_workgroup_size && builtin == BuiltInLocalInvocationId)\n\t\t\t{\n\t\t\t\tbuiltin_workgroup_size_id = var.self;\n\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInWorkgroupSize, var.self);\n\t\t\t\thas_workgroup_size = true;\n\t\t\t}\n\n\t\t\t// The base workgroup needs to have the same type and vector size\n\t\t\t// as the workgroup or invocation ID, so keep track of the type that\n\t\t\t// was used.\n\t\t\tif (need_dispatch_base && workgroup_id_type == 0 &&\n\t\t\t    (builtin == BuiltInWorkgroupId || builtin == BuiltInGlobalInvocationId))\n\t\t\t\tworkgroup_id_type = var.basetype;\n\t\t});\n\n\t\t// Use Metal's native frame-buffer fetch API for subpass inputs.\n\t\tif ((!has_frag_coord || (msl_options.multiview && !has_view_idx) ||\n\t\t     (msl_options.arrayed_subpass_input && !msl_options.multiview && !has_layer)) &&\n\t\t    (!msl_options.use_framebuffer_fetch_subpasses) && need_subpass_input)\n\t\t{\n\t\t\tif (!has_frag_coord)\n\t\t\t{\n\t\t\t\tuint32_t offset = ir.increase_bound_by(3);\n\t\t\t\tuint32_t type_id = offset;\n\t\t\t\tuint32_t type_ptr_id = offset + 1;\n\t\t\t\tuint32_t var_id = offset + 2;\n\n\t\t\t\t// Create gl_FragCoord.\n\t\t\t\tSPIRType vec4_type { OpTypeVector };\n\t\t\t\tvec4_type.basetype = SPIRType::Float;\n\t\t\t\tvec4_type.width = 32;\n\t\t\t\tvec4_type.vecsize = 4;\n\t\t\t\tset<SPIRType>(type_id, vec4_type);\n\n\t\t\t\tSPIRType vec4_type_ptr = vec4_type;\n\t\t\t\tvec4_type_ptr.op = OpTypePointer;\n\t\t\t\tvec4_type_ptr.pointer = true;\n\t\t\t\tvec4_type_ptr.pointer_depth++;\n\t\t\t\tvec4_type_ptr.parent_type = type_id;\n\t\t\t\tvec4_type_ptr.storage = StorageClassInput;\n\t\t\t\tauto &ptr_type = set<SPIRType>(type_ptr_id, vec4_type_ptr);\n\t\t\t\tptr_type.self = type_id;\n\n\t\t\t\tset<SPIRVariable>(var_id, type_ptr_id, StorageClassInput);\n\t\t\t\tset_decoration(var_id, DecorationBuiltIn, BuiltInFragCoord);\n\t\t\t\tbuiltin_frag_coord_id = var_id;\n\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInFragCoord, var_id);\n\t\t\t}\n\n\t\t\tif (!has_layer && msl_options.arrayed_subpass_input && !msl_options.multiview)\n\t\t\t{\n\t\t\t\tuint32_t offset = ir.increase_bound_by(2);\n\t\t\t\tuint32_t type_ptr_id = offset;\n\t\t\t\tuint32_t var_id = offset + 1;\n\n\t\t\t\t// Create gl_Layer.\n\t\t\t\tSPIRType uint_type_ptr = get_uint_type();\n\t\t\t\tuint_type_ptr.op = OpTypePointer;\n\t\t\t\tuint_type_ptr.pointer = true;\n\t\t\t\tuint_type_ptr.pointer_depth++;\n\t\t\t\tuint_type_ptr.parent_type = get_uint_type_id();\n\t\t\t\tuint_type_ptr.storage = StorageClassInput;\n\t\t\t\tauto &ptr_type = set<SPIRType>(type_ptr_id, uint_type_ptr);\n\t\t\t\tptr_type.self = get_uint_type_id();\n\n\t\t\t\tset<SPIRVariable>(var_id, type_ptr_id, StorageClassInput);\n\t\t\t\tset_decoration(var_id, DecorationBuiltIn, BuiltInLayer);\n\t\t\t\tbuiltin_layer_id = var_id;\n\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInLayer, var_id);\n\t\t\t}\n\n\t\t\tif (!has_view_idx && msl_options.multiview)\n\t\t\t{\n\t\t\t\tuint32_t offset = ir.increase_bound_by(2);\n\t\t\t\tuint32_t type_ptr_id = offset;\n\t\t\t\tuint32_t var_id = offset + 1;\n\n\t\t\t\t// Create gl_ViewIndex.\n\t\t\t\tSPIRType uint_type_ptr = get_uint_type();\n\t\t\t\tuint_type_ptr.op = OpTypePointer;\n\t\t\t\tuint_type_ptr.pointer = true;\n\t\t\t\tuint_type_ptr.pointer_depth++;\n\t\t\t\tuint_type_ptr.parent_type = get_uint_type_id();\n\t\t\t\tuint_type_ptr.storage = StorageClassInput;\n\t\t\t\tauto &ptr_type = set<SPIRType>(type_ptr_id, uint_type_ptr);\n\t\t\t\tptr_type.self = get_uint_type_id();\n\n\t\t\t\tset<SPIRVariable>(var_id, type_ptr_id, StorageClassInput);\n\t\t\t\tset_decoration(var_id, DecorationBuiltIn, BuiltInViewIndex);\n\t\t\t\tbuiltin_view_idx_id = var_id;\n\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInViewIndex, var_id);\n\t\t\t}\n\t\t}\n\n\t\tif (!has_sample_id && (need_sample_pos || needs_sample_id))\n\t\t{\n\t\t\tuint32_t offset = ir.increase_bound_by(2);\n\t\t\tuint32_t type_ptr_id = offset;\n\t\t\tuint32_t var_id = offset + 1;\n\n\t\t\t// Create gl_SampleID.\n\t\t\tSPIRType uint_type_ptr = get_uint_type();\n\t\t\tuint_type_ptr.op = OpTypePointer;\n\t\t\tuint_type_ptr.pointer = true;\n\t\t\tuint_type_ptr.pointer_depth++;\n\t\t\tuint_type_ptr.parent_type = get_uint_type_id();\n\t\t\tuint_type_ptr.storage = StorageClassInput;\n\t\t\tauto &ptr_type = set<SPIRType>(type_ptr_id, uint_type_ptr);\n\t\t\tptr_type.self = get_uint_type_id();\n\n\t\t\tset<SPIRVariable>(var_id, type_ptr_id, StorageClassInput);\n\t\t\tset_decoration(var_id, DecorationBuiltIn, BuiltInSampleId);\n\t\t\tbuiltin_sample_id_id = var_id;\n\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInSampleId, var_id);\n\t\t}\n\n\t\tif ((need_vertex_params && (!has_vertex_idx || !has_base_vertex || !has_instance_idx || !has_base_instance)) ||\n\t\t    (need_multiview && (!has_instance_idx || !has_base_instance || !has_view_idx)))\n\t\t{\n\t\t\tuint32_t type_ptr_id = ir.increase_bound_by(1);\n\n\t\t\tSPIRType uint_type_ptr = get_uint_type();\n\t\t\tuint_type_ptr.op = OpTypePointer;\n\t\t\tuint_type_ptr.pointer = true;\n\t\t\tuint_type_ptr.pointer_depth++;\n\t\t\tuint_type_ptr.parent_type = get_uint_type_id();\n\t\t\tuint_type_ptr.storage = StorageClassInput;\n\t\t\tauto &ptr_type = set<SPIRType>(type_ptr_id, uint_type_ptr);\n\t\t\tptr_type.self = get_uint_type_id();\n\n\t\t\tif (need_vertex_params && !has_vertex_idx)\n\t\t\t{\n\t\t\t\tuint32_t var_id = ir.increase_bound_by(1);\n\n\t\t\t\t// Create gl_VertexIndex.\n\t\t\t\tset<SPIRVariable>(var_id, type_ptr_id, StorageClassInput);\n\t\t\t\tset_decoration(var_id, DecorationBuiltIn, BuiltInVertexIndex);\n\t\t\t\tbuiltin_vertex_idx_id = var_id;\n\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInVertexIndex, var_id);\n\t\t\t}\n\n\t\t\tif (need_vertex_params && !has_base_vertex)\n\t\t\t{\n\t\t\t\tuint32_t var_id = ir.increase_bound_by(1);\n\n\t\t\t\t// Create gl_BaseVertex.\n\t\t\t\tset<SPIRVariable>(var_id, type_ptr_id, StorageClassInput);\n\t\t\t\tset_decoration(var_id, DecorationBuiltIn, BuiltInBaseVertex);\n\t\t\t\tbuiltin_base_vertex_id = var_id;\n\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInBaseVertex, var_id);\n\t\t\t}\n\n\t\t\tif (!has_instance_idx) // Needed by both multiview and tessellation\n\t\t\t{\n\t\t\t\tuint32_t var_id = ir.increase_bound_by(1);\n\n\t\t\t\t// Create gl_InstanceIndex.\n\t\t\t\tset<SPIRVariable>(var_id, type_ptr_id, StorageClassInput);\n\t\t\t\tset_decoration(var_id, DecorationBuiltIn, BuiltInInstanceIndex);\n\t\t\t\tbuiltin_instance_idx_id = var_id;\n\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInInstanceIndex, var_id);\n\t\t\t}\n\n\t\t\tif (!has_base_instance) // Needed by both multiview and tessellation\n\t\t\t{\n\t\t\t\tuint32_t var_id = ir.increase_bound_by(1);\n\n\t\t\t\t// Create gl_BaseInstance.\n\t\t\t\tset<SPIRVariable>(var_id, type_ptr_id, StorageClassInput);\n\t\t\t\tset_decoration(var_id, DecorationBuiltIn, BuiltInBaseInstance);\n\t\t\t\tbuiltin_base_instance_id = var_id;\n\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInBaseInstance, var_id);\n\t\t\t}\n\n\t\t\tif (need_multiview)\n\t\t\t{\n\t\t\t\t// Multiview shaders are not allowed to write to gl_Layer, ostensibly because\n\t\t\t\t// it is implicitly written from gl_ViewIndex, but we have to do that explicitly.\n\t\t\t\t// Note that we can't just abuse gl_ViewIndex for this purpose: it's an input, but\n\t\t\t\t// gl_Layer is an output in vertex-pipeline shaders.\n\t\t\t\tuint32_t type_ptr_out_id = ir.increase_bound_by(2);\n\t\t\t\tSPIRType uint_type_ptr_out = get_uint_type();\n\t\t\t\tuint_type_ptr.op = OpTypePointer;\n\t\t\t\tuint_type_ptr_out.pointer = true;\n\t\t\t\tuint_type_ptr_out.pointer_depth++;\n\t\t\t\tuint_type_ptr_out.parent_type = get_uint_type_id();\n\t\t\t\tuint_type_ptr_out.storage = StorageClassOutput;\n\t\t\t\tauto &ptr_out_type = set<SPIRType>(type_ptr_out_id, uint_type_ptr_out);\n\t\t\t\tptr_out_type.self = get_uint_type_id();\n\t\t\t\tuint32_t var_id = type_ptr_out_id + 1;\n\t\t\t\tset<SPIRVariable>(var_id, type_ptr_out_id, StorageClassOutput);\n\t\t\t\tset_decoration(var_id, DecorationBuiltIn, BuiltInLayer);\n\t\t\t\tbuiltin_layer_id = var_id;\n\t\t\t\tmark_implicit_builtin(StorageClassOutput, BuiltInLayer, var_id);\n\t\t\t}\n\n\t\t\tif (need_multiview && !has_view_idx)\n\t\t\t{\n\t\t\t\tuint32_t var_id = ir.increase_bound_by(1);\n\n\t\t\t\t// Create gl_ViewIndex.\n\t\t\t\tset<SPIRVariable>(var_id, type_ptr_id, StorageClassInput);\n\t\t\t\tset_decoration(var_id, DecorationBuiltIn, BuiltInViewIndex);\n\t\t\t\tbuiltin_view_idx_id = var_id;\n\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInViewIndex, var_id);\n\t\t\t}\n\t\t}\n\n\t\tif ((need_tesc_params && (msl_options.multi_patch_workgroup || !has_invocation_id || !has_primitive_id)) ||\n\t\t    (need_tese_params && !has_primitive_id) || need_grid_params)\n\t\t{\n\t\t\tuint32_t type_ptr_id = ir.increase_bound_by(1);\n\n\t\t\tSPIRType uint_type_ptr = get_uint_type();\n\t\t\tuint_type_ptr.op = OpTypePointer;\n\t\t\tuint_type_ptr.pointer = true;\n\t\t\tuint_type_ptr.pointer_depth++;\n\t\t\tuint_type_ptr.parent_type = get_uint_type_id();\n\t\t\tuint_type_ptr.storage = StorageClassInput;\n\t\t\tauto &ptr_type = set<SPIRType>(type_ptr_id, uint_type_ptr);\n\t\t\tptr_type.self = get_uint_type_id();\n\n\t\t\tif ((need_tesc_params && msl_options.multi_patch_workgroup) || need_grid_params)\n\t\t\t{\n\t\t\t\tuint32_t var_id = ir.increase_bound_by(1);\n\n\t\t\t\t// Create gl_GlobalInvocationID.\n\t\t\t\tset<SPIRVariable>(var_id, type_ptr_id, StorageClassInput);\n\t\t\t\tset_decoration(var_id, DecorationBuiltIn, BuiltInGlobalInvocationId);\n\t\t\t\tbuiltin_invocation_id_id = var_id;\n\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInGlobalInvocationId, var_id);\n\t\t\t}\n\t\t\telse if (need_tesc_params && !has_invocation_id)\n\t\t\t{\n\t\t\t\tuint32_t var_id = ir.increase_bound_by(1);\n\n\t\t\t\t// Create gl_InvocationID.\n\t\t\t\tset<SPIRVariable>(var_id, type_ptr_id, StorageClassInput);\n\t\t\t\tset_decoration(var_id, DecorationBuiltIn, BuiltInInvocationId);\n\t\t\t\tbuiltin_invocation_id_id = var_id;\n\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInInvocationId, var_id);\n\t\t\t}\n\n\t\t\tif ((need_tesc_params || need_tese_params) && !has_primitive_id)\n\t\t\t{\n\t\t\t\tuint32_t var_id = ir.increase_bound_by(1);\n\n\t\t\t\t// Create gl_PrimitiveID.\n\t\t\t\tset<SPIRVariable>(var_id, type_ptr_id, StorageClassInput);\n\t\t\t\tset_decoration(var_id, DecorationBuiltIn, BuiltInPrimitiveId);\n\t\t\t\tbuiltin_primitive_id_id = var_id;\n\t\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInPrimitiveId, var_id);\n\t\t\t}\n\n\t\t\tif (need_grid_params)\n\t\t\t{\n\t\t\t\tuint32_t var_id = ir.increase_bound_by(1);\n\n\t\t\t\tset<SPIRVariable>(var_id, build_extended_vector_type(get_uint_type_id(), 3), StorageClassInput);\n\t\t\t\tset_extended_decoration(var_id, SPIRVCrossDecorationBuiltInStageInputSize);\n\t\t\t\tget_entry_point().interface_variables.push_back(var_id);\n\t\t\t\tset_name(var_id, \"spvStageInputSize\");\n\t\t\t\tbuiltin_stage_input_size_id = var_id;\n\t\t\t}\n\t\t}\n\n\t\tif (!has_subgroup_invocation_id && (need_subgroup_mask || needs_subgroup_invocation_id))\n\t\t{\n\t\t\tuint32_t offset = ir.increase_bound_by(2);\n\t\t\tuint32_t type_ptr_id = offset;\n\t\t\tuint32_t var_id = offset + 1;\n\n\t\t\t// Create gl_SubgroupInvocationID.\n\t\t\tSPIRType uint_type_ptr = get_uint_type();\n\t\t\tuint_type_ptr.op = OpTypePointer;\n\t\t\tuint_type_ptr.pointer = true;\n\t\t\tuint_type_ptr.pointer_depth++;\n\t\t\tuint_type_ptr.parent_type = get_uint_type_id();\n\t\t\tuint_type_ptr.storage = StorageClassInput;\n\t\t\tauto &ptr_type = set<SPIRType>(type_ptr_id, uint_type_ptr);\n\t\t\tptr_type.self = get_uint_type_id();\n\n\t\t\tset<SPIRVariable>(var_id, type_ptr_id, StorageClassInput);\n\t\t\tset_decoration(var_id, DecorationBuiltIn, BuiltInSubgroupLocalInvocationId);\n\t\t\tbuiltin_subgroup_invocation_id_id = var_id;\n\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInSubgroupLocalInvocationId, var_id);\n\t\t}\n\n\t\tif (!has_subgroup_size && (need_subgroup_ge_mask || needs_subgroup_size))\n\t\t{\n\t\t\tuint32_t offset = ir.increase_bound_by(2);\n\t\t\tuint32_t type_ptr_id = offset;\n\t\t\tuint32_t var_id = offset + 1;\n\n\t\t\t// Create gl_SubgroupSize.\n\t\t\tSPIRType uint_type_ptr = get_uint_type();\n\t\t\tuint_type_ptr.op = OpTypePointer;\n\t\t\tuint_type_ptr.pointer = true;\n\t\t\tuint_type_ptr.pointer_depth++;\n\t\t\tuint_type_ptr.parent_type = get_uint_type_id();\n\t\t\tuint_type_ptr.storage = StorageClassInput;\n\t\t\tauto &ptr_type = set<SPIRType>(type_ptr_id, uint_type_ptr);\n\t\t\tptr_type.self = get_uint_type_id();\n\n\t\t\tset<SPIRVariable>(var_id, type_ptr_id, StorageClassInput);\n\t\t\tset_decoration(var_id, DecorationBuiltIn, BuiltInSubgroupSize);\n\t\t\tbuiltin_subgroup_size_id = var_id;\n\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInSubgroupSize, var_id);\n\t\t}\n\n\t\tif (need_dispatch_base || need_vertex_base_params)\n\t\t{\n\t\t\tif (workgroup_id_type == 0)\n\t\t\t\tworkgroup_id_type = build_extended_vector_type(get_uint_type_id(), 3);\n\t\t\tuint32_t var_id;\n\t\t\tif (msl_options.supports_msl_version(1, 2))\n\t\t\t{\n\t\t\t\t// If we have MSL 1.2, we can (ab)use the [[grid_origin]] builtin\n\t\t\t\t// to convey this information and save a buffer slot.\n\t\t\t\tuint32_t offset = ir.increase_bound_by(1);\n\t\t\t\tvar_id = offset;\n\n\t\t\t\tset<SPIRVariable>(var_id, workgroup_id_type, StorageClassInput);\n\t\t\t\tset_extended_decoration(var_id, SPIRVCrossDecorationBuiltInDispatchBase);\n\t\t\t\tget_entry_point().interface_variables.push_back(var_id);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Otherwise, we need to fall back to a good ol' fashioned buffer.\n\t\t\t\tuint32_t offset = ir.increase_bound_by(2);\n\t\t\t\tvar_id = offset;\n\t\t\t\tuint32_t type_id = offset + 1;\n\n\t\t\t\tSPIRType var_type = get<SPIRType>(workgroup_id_type);\n\t\t\t\tvar_type.storage = StorageClassUniform;\n\t\t\t\tset<SPIRType>(type_id, var_type);\n\n\t\t\t\tset<SPIRVariable>(var_id, type_id, StorageClassUniform);\n\t\t\t\t// This should never match anything.\n\t\t\t\tset_decoration(var_id, DecorationDescriptorSet, ~(5u));\n\t\t\t\tset_decoration(var_id, DecorationBinding, msl_options.indirect_params_buffer_index);\n\t\t\t\tset_extended_decoration(var_id, SPIRVCrossDecorationResourceIndexPrimary,\n\t\t\t\t                        msl_options.indirect_params_buffer_index);\n\t\t\t}\n\t\t\tset_name(var_id, \"spvDispatchBase\");\n\t\t\tbuiltin_dispatch_base_id = var_id;\n\t\t}\n\n\t\tif (has_additional_fixed_sample_mask() && !does_shader_write_sample_mask)\n\t\t{\n\t\t\tuint32_t offset = ir.increase_bound_by(2);\n\t\t\tuint32_t var_id = offset + 1;\n\n\t\t\t// Create gl_SampleMask.\n\t\t\tSPIRType uint_type_ptr_out = get_uint_type();\n\t\t\tuint_type_ptr_out.op = OpTypePointer;\n\t\t\tuint_type_ptr_out.pointer = true;\n\t\t\tuint_type_ptr_out.pointer_depth++;\n\t\t\tuint_type_ptr_out.parent_type = get_uint_type_id();\n\t\t\tuint_type_ptr_out.storage = StorageClassOutput;\n\n\t\t\tauto &ptr_out_type = set<SPIRType>(offset, uint_type_ptr_out);\n\t\t\tptr_out_type.self = get_uint_type_id();\n\t\t\tset<SPIRVariable>(var_id, offset, StorageClassOutput);\n\t\t\tset_decoration(var_id, DecorationBuiltIn, BuiltInSampleMask);\n\t\t\tbuiltin_sample_mask_id = var_id;\n\t\t\tmark_implicit_builtin(StorageClassOutput, BuiltInSampleMask, var_id);\n\t\t}\n\n\t\tif (!has_helper_invocation && needs_helper_invocation)\n\t\t{\n\t\t\tuint32_t offset = ir.increase_bound_by(3);\n\t\t\tuint32_t type_id = offset;\n\t\t\tuint32_t type_ptr_id = offset + 1;\n\t\t\tuint32_t var_id = offset + 2;\n\n\t\t\t// Create gl_HelperInvocation.\n\t\t\tSPIRType bool_type { OpTypeBool };\n\t\t\tbool_type.basetype = SPIRType::Boolean;\n\t\t\tbool_type.width = 8;\n\t\t\tbool_type.vecsize = 1;\n\t\t\tset<SPIRType>(type_id, bool_type);\n\n\t\t\tSPIRType bool_type_ptr_in = bool_type;\n\t\t\tbool_type_ptr_in.op = spv::OpTypePointer;\n\t\t\tbool_type_ptr_in.pointer = true;\n\t\t\tbool_type_ptr_in.pointer_depth++;\n\t\t\tbool_type_ptr_in.parent_type = type_id;\n\t\t\tbool_type_ptr_in.storage = StorageClassInput;\n\n\t\t\tauto &ptr_in_type = set<SPIRType>(type_ptr_id, bool_type_ptr_in);\n\t\t\tptr_in_type.self = type_id;\n\t\t\tset<SPIRVariable>(var_id, type_ptr_id, StorageClassInput);\n\t\t\tset_decoration(var_id, DecorationBuiltIn, BuiltInHelperInvocation);\n\t\t\tbuiltin_helper_invocation_id = var_id;\n\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInHelperInvocation, var_id);\n\t\t}\n\n\t\tif (need_local_invocation_index && !has_local_invocation_index)\n\t\t{\n\t\t\tuint32_t offset = ir.increase_bound_by(2);\n\t\t\tuint32_t type_ptr_id = offset;\n\t\t\tuint32_t var_id = offset + 1;\n\n\t\t\t// Create gl_LocalInvocationIndex.\n\t\t\tSPIRType uint_type_ptr = get_uint_type();\n\t\t\tuint_type_ptr.op = OpTypePointer;\n\t\t\tuint_type_ptr.pointer = true;\n\t\t\tuint_type_ptr.pointer_depth++;\n\t\t\tuint_type_ptr.parent_type = get_uint_type_id();\n\t\t\tuint_type_ptr.storage = StorageClassInput;\n\n\t\t\tauto &ptr_type = set<SPIRType>(type_ptr_id, uint_type_ptr);\n\t\t\tptr_type.self = get_uint_type_id();\n\t\t\tset<SPIRVariable>(var_id, type_ptr_id, StorageClassInput);\n\t\t\tset_decoration(var_id, DecorationBuiltIn, BuiltInLocalInvocationIndex);\n\t\t\tbuiltin_local_invocation_index_id = var_id;\n\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInLocalInvocationIndex, var_id);\n\t\t}\n\n\t\tif (need_workgroup_size && !has_workgroup_size)\n\t\t{\n\t\t\tuint32_t offset = ir.increase_bound_by(2);\n\t\t\tuint32_t type_ptr_id = offset;\n\t\t\tuint32_t var_id = offset + 1;\n\n\t\t\t// Create gl_WorkgroupSize.\n\t\t\tuint32_t type_id = build_extended_vector_type(get_uint_type_id(), 3);\n\t\t\tSPIRType uint_type_ptr = get<SPIRType>(type_id);\n\t\t\tuint_type_ptr.op = OpTypePointer;\n\t\t\tuint_type_ptr.pointer = true;\n\t\t\tuint_type_ptr.pointer_depth++;\n\t\t\tuint_type_ptr.parent_type = type_id;\n\t\t\tuint_type_ptr.storage = StorageClassInput;\n\n\t\t\tauto &ptr_type = set<SPIRType>(type_ptr_id, uint_type_ptr);\n\t\t\tptr_type.self = type_id;\n\t\t\tset<SPIRVariable>(var_id, type_ptr_id, StorageClassInput);\n\t\t\tset_decoration(var_id, DecorationBuiltIn, BuiltInWorkgroupSize);\n\t\t\tbuiltin_workgroup_size_id = var_id;\n\t\t\tmark_implicit_builtin(StorageClassInput, BuiltInWorkgroupSize, var_id);\n\t\t}\n\t}\n\n\tif (needs_swizzle_buffer_def)\n\t{\n\t\tuint32_t var_id = build_constant_uint_array_pointer();\n\t\tset_name(var_id, \"spvSwizzleConstants\");\n\t\t// This should never match anything.\n\t\tset_decoration(var_id, DecorationDescriptorSet, kSwizzleBufferBinding);\n\t\tset_decoration(var_id, DecorationBinding, msl_options.swizzle_buffer_index);\n\t\tset_extended_decoration(var_id, SPIRVCrossDecorationResourceIndexPrimary, msl_options.swizzle_buffer_index);\n\t\tswizzle_buffer_id = var_id;\n\t}\n\n\tif (needs_buffer_size_buffer())\n\t{\n\t\tuint32_t var_id = build_constant_uint_array_pointer();\n\t\tset_name(var_id, \"spvBufferSizeConstants\");\n\t\t// This should never match anything.\n\t\tset_decoration(var_id, DecorationDescriptorSet, kBufferSizeBufferBinding);\n\t\tset_decoration(var_id, DecorationBinding, msl_options.buffer_size_buffer_index);\n\t\tset_extended_decoration(var_id, SPIRVCrossDecorationResourceIndexPrimary, msl_options.buffer_size_buffer_index);\n\t\tbuffer_size_buffer_id = var_id;\n\t}\n\n\tif (needs_view_mask_buffer())\n\t{\n\t\tuint32_t var_id = build_constant_uint_array_pointer();\n\t\tset_name(var_id, \"spvViewMask\");\n\t\t// This should never match anything.\n\t\tset_decoration(var_id, DecorationDescriptorSet, ~(4u));\n\t\tset_decoration(var_id, DecorationBinding, msl_options.view_mask_buffer_index);\n\t\tset_extended_decoration(var_id, SPIRVCrossDecorationResourceIndexPrimary, msl_options.view_mask_buffer_index);\n\t\tview_mask_buffer_id = var_id;\n\t}\n\n\tif (!buffers_requiring_dynamic_offset.empty())\n\t{\n\t\tuint32_t var_id = build_constant_uint_array_pointer();\n\t\tset_name(var_id, \"spvDynamicOffsets\");\n\t\t// This should never match anything.\n\t\tset_decoration(var_id, DecorationDescriptorSet, ~(5u));\n\t\tset_decoration(var_id, DecorationBinding, msl_options.dynamic_offsets_buffer_index);\n\t\tset_extended_decoration(var_id, SPIRVCrossDecorationResourceIndexPrimary,\n\t\t                        msl_options.dynamic_offsets_buffer_index);\n\t\tdynamic_offsets_buffer_id = var_id;\n\t}\n\n\t// If we're returning a struct from a vertex-like entry point, we must return a position attribute.\n\tbool need_position = (get_execution_model() == ExecutionModelVertex || is_tese_shader()) &&\n\t                     !capture_output_to_buffer && !get_is_rasterization_disabled() &&\n\t                     !active_output_builtins.get(BuiltInPosition);\n\n\tif (need_position)\n\t{\n\t\t// If we can get away with returning void from entry point, we don't need to care.\n\t\t// If there is at least one other stage output, we need to return [[position]],\n\t\t// so we need to create one if it doesn't appear in the SPIR-V. Before adding the\n\t\t// implicit variable, check if it actually exists already, but just has not been used\n\t\t// or initialized, and if so, mark it as active, and do not create the implicit variable.\n\t\tbool has_output = false;\n\t\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\t\tif (var.storage == StorageClassOutput && interface_variable_exists_in_entry_point(var.self))\n\t\t\t{\n\t\t\t\thas_output = true;\n\n\t\t\t\t// Check if the var is the Position builtin\n\t\t\t\tif (has_decoration(var.self, DecorationBuiltIn) && get_decoration(var.self, DecorationBuiltIn) == BuiltInPosition)\n\t\t\t\t\tactive_output_builtins.set(BuiltInPosition);\n\n\t\t\t\t// If the var is a struct, check if any members is the Position builtin\n\t\t\t\tauto &var_type = get_variable_element_type(var);\n\t\t\t\tif (var_type.basetype == SPIRType::Struct)\n\t\t\t\t{\n\t\t\t\t\tauto mbr_cnt = var_type.member_types.size();\n\t\t\t\t\tfor (uint32_t mbr_idx = 0; mbr_idx < mbr_cnt; mbr_idx++)\n\t\t\t\t\t{\n\t\t\t\t\t\tauto builtin = BuiltInMax;\n\t\t\t\t\t\tbool is_builtin = is_member_builtin(var_type, mbr_idx, &builtin);\n\t\t\t\t\t\tif (is_builtin && builtin == BuiltInPosition)\n\t\t\t\t\t\t\tactive_output_builtins.set(BuiltInPosition);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tneed_position = has_output && !active_output_builtins.get(BuiltInPosition);\n\t}\n\n\tif (need_position)\n\t{\n\t\tuint32_t offset = ir.increase_bound_by(3);\n\t\tuint32_t type_id = offset;\n\t\tuint32_t type_ptr_id = offset + 1;\n\t\tuint32_t var_id = offset + 2;\n\n\t\t// Create gl_Position.\n\t\tSPIRType vec4_type { OpTypeVector };\n\t\tvec4_type.basetype = SPIRType::Float;\n\t\tvec4_type.width = 32;\n\t\tvec4_type.vecsize = 4;\n\t\tset<SPIRType>(type_id, vec4_type);\n\n\t\tSPIRType vec4_type_ptr = vec4_type;\n\t\tvec4_type_ptr.op = OpTypePointer;\n\t\tvec4_type_ptr.pointer = true;\n\t\tvec4_type_ptr.pointer_depth++;\n\t\tvec4_type_ptr.parent_type = type_id;\n\t\tvec4_type_ptr.storage = StorageClassOutput;\n\t\tauto &ptr_type = set<SPIRType>(type_ptr_id, vec4_type_ptr);\n\t\tptr_type.self = type_id;\n\n\t\tset<SPIRVariable>(var_id, type_ptr_id, StorageClassOutput);\n\t\tset_decoration(var_id, DecorationBuiltIn, BuiltInPosition);\n\t\tmark_implicit_builtin(StorageClassOutput, BuiltInPosition, var_id);\n\t}\n}\n\n// Checks if the specified builtin variable (e.g. gl_InstanceIndex) is marked as active.\n// If not, it marks it as active and forces a recompilation.\n// This might be used when the optimization of inactive builtins was too optimistic (e.g. when \"spvOut\" is emitted).\nvoid CompilerMSL::ensure_builtin(spv::StorageClass storage, spv::BuiltIn builtin)\n{\n\tBitset *active_builtins = nullptr;\n\tswitch (storage)\n\t{\n\tcase StorageClassInput:\n\t\tactive_builtins = &active_input_builtins;\n\t\tbreak;\n\n\tcase StorageClassOutput:\n\t\tactive_builtins = &active_output_builtins;\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\t// At this point, the specified builtin variable must have already been declared in the entry point.\n\t// If not, mark as active and force recompile.\n\tif (active_builtins != nullptr && !active_builtins->get(builtin))\n\t{\n\t\tactive_builtins->set(builtin);\n\t\tforce_recompile();\n\t}\n}\n\nvoid CompilerMSL::mark_implicit_builtin(StorageClass storage, BuiltIn builtin, uint32_t id)\n{\n\tBitset *active_builtins = nullptr;\n\tswitch (storage)\n\t{\n\tcase StorageClassInput:\n\t\tactive_builtins = &active_input_builtins;\n\t\tbreak;\n\n\tcase StorageClassOutput:\n\t\tactive_builtins = &active_output_builtins;\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\tassert(active_builtins != nullptr);\n\tactive_builtins->set(builtin);\n\n\tauto &var = get_entry_point().interface_variables;\n\tif (find(begin(var), end(var), VariableID(id)) == end(var))\n\t\tvar.push_back(id);\n}\n\nuint32_t CompilerMSL::build_constant_uint_array_pointer()\n{\n\tuint32_t offset = ir.increase_bound_by(3);\n\tuint32_t type_ptr_id = offset;\n\tuint32_t type_ptr_ptr_id = offset + 1;\n\tuint32_t var_id = offset + 2;\n\n\t// Create a buffer to hold extra data, including the swizzle constants.\n\tSPIRType uint_type_pointer = get_uint_type();\n\tuint_type_pointer.op = OpTypePointer;\n\tuint_type_pointer.pointer = true;\n\tuint_type_pointer.pointer_depth++;\n\tuint_type_pointer.parent_type = get_uint_type_id();\n\tuint_type_pointer.storage = StorageClassUniform;\n\tset<SPIRType>(type_ptr_id, uint_type_pointer);\n\tset_decoration(type_ptr_id, DecorationArrayStride, 4);\n\n\tSPIRType uint_type_pointer2 = uint_type_pointer;\n\tuint_type_pointer2.pointer_depth++;\n\tuint_type_pointer2.parent_type = type_ptr_id;\n\tset<SPIRType>(type_ptr_ptr_id, uint_type_pointer2);\n\n\tset<SPIRVariable>(var_id, type_ptr_ptr_id, StorageClassUniformConstant);\n\treturn var_id;\n}\n\nstatic string create_sampler_address(const char *prefix, MSLSamplerAddress addr)\n{\n\tswitch (addr)\n\t{\n\tcase MSL_SAMPLER_ADDRESS_CLAMP_TO_EDGE:\n\t\treturn join(prefix, \"address::clamp_to_edge\");\n\tcase MSL_SAMPLER_ADDRESS_CLAMP_TO_ZERO:\n\t\treturn join(prefix, \"address::clamp_to_zero\");\n\tcase MSL_SAMPLER_ADDRESS_CLAMP_TO_BORDER:\n\t\treturn join(prefix, \"address::clamp_to_border\");\n\tcase MSL_SAMPLER_ADDRESS_REPEAT:\n\t\treturn join(prefix, \"address::repeat\");\n\tcase MSL_SAMPLER_ADDRESS_MIRRORED_REPEAT:\n\t\treturn join(prefix, \"address::mirrored_repeat\");\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Invalid sampler addressing mode.\");\n\t}\n}\n\nSPIRType &CompilerMSL::get_stage_in_struct_type()\n{\n\tauto &si_var = get<SPIRVariable>(stage_in_var_id);\n\treturn get_variable_data_type(si_var);\n}\n\nSPIRType &CompilerMSL::get_stage_out_struct_type()\n{\n\tauto &so_var = get<SPIRVariable>(stage_out_var_id);\n\treturn get_variable_data_type(so_var);\n}\n\nSPIRType &CompilerMSL::get_patch_stage_in_struct_type()\n{\n\tauto &si_var = get<SPIRVariable>(patch_stage_in_var_id);\n\treturn get_variable_data_type(si_var);\n}\n\nSPIRType &CompilerMSL::get_patch_stage_out_struct_type()\n{\n\tauto &so_var = get<SPIRVariable>(patch_stage_out_var_id);\n\treturn get_variable_data_type(so_var);\n}\n\nstd::string CompilerMSL::get_tess_factor_struct_name()\n{\n\tif (is_tessellating_triangles())\n\t\treturn \"MTLTriangleTessellationFactorsHalf\";\n\treturn \"MTLQuadTessellationFactorsHalf\";\n}\n\nSPIRType &CompilerMSL::get_uint_type()\n{\n\treturn get<SPIRType>(get_uint_type_id());\n}\n\nuint32_t CompilerMSL::get_uint_type_id()\n{\n\tif (uint_type_id != 0)\n\t\treturn uint_type_id;\n\n\tuint_type_id = ir.increase_bound_by(1);\n\n\tSPIRType type { OpTypeInt };\n\ttype.basetype = SPIRType::UInt;\n\ttype.width = 32;\n\tset<SPIRType>(uint_type_id, type);\n\treturn uint_type_id;\n}\n\nvoid CompilerMSL::emit_entry_point_declarations()\n{\n\t// FIXME: Get test coverage here ...\n\t// Constant arrays of non-primitive types (i.e. matrices) won't link properly into Metal libraries\n\tdeclare_complex_constant_arrays();\n\n\t// Emit constexpr samplers here.\n\tfor (auto &samp : constexpr_samplers_by_id)\n\t{\n\t\tauto &var = get<SPIRVariable>(samp.first);\n\t\tauto &type = get<SPIRType>(var.basetype);\n\t\tif (type.basetype == SPIRType::Sampler)\n\t\t\tadd_resource_name(samp.first);\n\n\t\tSmallVector<string> args;\n\t\tauto &s = samp.second;\n\n\t\tif (s.coord != MSL_SAMPLER_COORD_NORMALIZED)\n\t\t\targs.push_back(\"coord::pixel\");\n\n\t\tif (s.min_filter == s.mag_filter)\n\t\t{\n\t\t\tif (s.min_filter != MSL_SAMPLER_FILTER_NEAREST)\n\t\t\t\targs.push_back(\"filter::linear\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (s.min_filter != MSL_SAMPLER_FILTER_NEAREST)\n\t\t\t\targs.push_back(\"min_filter::linear\");\n\t\t\tif (s.mag_filter != MSL_SAMPLER_FILTER_NEAREST)\n\t\t\t\targs.push_back(\"mag_filter::linear\");\n\t\t}\n\n\t\tswitch (s.mip_filter)\n\t\t{\n\t\tcase MSL_SAMPLER_MIP_FILTER_NONE:\n\t\t\t// Default\n\t\t\tbreak;\n\t\tcase MSL_SAMPLER_MIP_FILTER_NEAREST:\n\t\t\targs.push_back(\"mip_filter::nearest\");\n\t\t\tbreak;\n\t\tcase MSL_SAMPLER_MIP_FILTER_LINEAR:\n\t\t\targs.push_back(\"mip_filter::linear\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tSPIRV_CROSS_THROW(\"Invalid mip filter.\");\n\t\t}\n\n\t\tif (s.s_address == s.t_address && s.s_address == s.r_address)\n\t\t{\n\t\t\tif (s.s_address != MSL_SAMPLER_ADDRESS_CLAMP_TO_EDGE)\n\t\t\t\targs.push_back(create_sampler_address(\"\", s.s_address));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (s.s_address != MSL_SAMPLER_ADDRESS_CLAMP_TO_EDGE)\n\t\t\t\targs.push_back(create_sampler_address(\"s_\", s.s_address));\n\t\t\tif (s.t_address != MSL_SAMPLER_ADDRESS_CLAMP_TO_EDGE)\n\t\t\t\targs.push_back(create_sampler_address(\"t_\", s.t_address));\n\t\t\tif (s.r_address != MSL_SAMPLER_ADDRESS_CLAMP_TO_EDGE)\n\t\t\t\targs.push_back(create_sampler_address(\"r_\", s.r_address));\n\t\t}\n\n\t\tif (s.compare_enable)\n\t\t{\n\t\t\tswitch (s.compare_func)\n\t\t\t{\n\t\t\tcase MSL_SAMPLER_COMPARE_FUNC_ALWAYS:\n\t\t\t\targs.push_back(\"compare_func::always\");\n\t\t\t\tbreak;\n\t\t\tcase MSL_SAMPLER_COMPARE_FUNC_NEVER:\n\t\t\t\targs.push_back(\"compare_func::never\");\n\t\t\t\tbreak;\n\t\t\tcase MSL_SAMPLER_COMPARE_FUNC_EQUAL:\n\t\t\t\targs.push_back(\"compare_func::equal\");\n\t\t\t\tbreak;\n\t\t\tcase MSL_SAMPLER_COMPARE_FUNC_NOT_EQUAL:\n\t\t\t\targs.push_back(\"compare_func::not_equal\");\n\t\t\t\tbreak;\n\t\t\tcase MSL_SAMPLER_COMPARE_FUNC_LESS:\n\t\t\t\targs.push_back(\"compare_func::less\");\n\t\t\t\tbreak;\n\t\t\tcase MSL_SAMPLER_COMPARE_FUNC_LESS_EQUAL:\n\t\t\t\targs.push_back(\"compare_func::less_equal\");\n\t\t\t\tbreak;\n\t\t\tcase MSL_SAMPLER_COMPARE_FUNC_GREATER:\n\t\t\t\targs.push_back(\"compare_func::greater\");\n\t\t\t\tbreak;\n\t\t\tcase MSL_SAMPLER_COMPARE_FUNC_GREATER_EQUAL:\n\t\t\t\targs.push_back(\"compare_func::greater_equal\");\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tSPIRV_CROSS_THROW(\"Invalid sampler compare function.\");\n\t\t\t}\n\t\t}\n\n\t\tif (s.s_address == MSL_SAMPLER_ADDRESS_CLAMP_TO_BORDER || s.t_address == MSL_SAMPLER_ADDRESS_CLAMP_TO_BORDER ||\n\t\t    s.r_address == MSL_SAMPLER_ADDRESS_CLAMP_TO_BORDER)\n\t\t{\n\t\t\tswitch (s.border_color)\n\t\t\t{\n\t\t\tcase MSL_SAMPLER_BORDER_COLOR_OPAQUE_BLACK:\n\t\t\t\targs.push_back(\"border_color::opaque_black\");\n\t\t\t\tbreak;\n\t\t\tcase MSL_SAMPLER_BORDER_COLOR_OPAQUE_WHITE:\n\t\t\t\targs.push_back(\"border_color::opaque_white\");\n\t\t\t\tbreak;\n\t\t\tcase MSL_SAMPLER_BORDER_COLOR_TRANSPARENT_BLACK:\n\t\t\t\targs.push_back(\"border_color::transparent_black\");\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tSPIRV_CROSS_THROW(\"Invalid sampler border color.\");\n\t\t\t}\n\t\t}\n\n\t\tif (s.anisotropy_enable)\n\t\t\targs.push_back(join(\"max_anisotropy(\", s.max_anisotropy, \")\"));\n\t\tif (s.lod_clamp_enable)\n\t\t{\n\t\t\targs.push_back(join(\"lod_clamp(\", format_float(s.lod_clamp_min), \", \", format_float(s.lod_clamp_max), \")\"));\n\t\t}\n\n\t\t// If we would emit no arguments, then omit the parentheses entirely. Otherwise,\n\t\t// we'll wind up with a \"most vexing parse\" situation.\n\t\tif (args.empty())\n\t\t\tstatement(\"constexpr sampler \",\n\t\t\t          type.basetype == SPIRType::SampledImage ? to_sampler_expression(samp.first) : to_name(samp.first),\n\t\t\t          \";\");\n\t\telse\n\t\t\tstatement(\"constexpr sampler \",\n\t\t\t          type.basetype == SPIRType::SampledImage ? to_sampler_expression(samp.first) : to_name(samp.first),\n\t\t\t          \"(\", merge(args), \");\");\n\t}\n\n\t// Emit dynamic buffers here.\n\tfor (auto &dynamic_buffer : buffers_requiring_dynamic_offset)\n\t{\n\t\tif (!dynamic_buffer.second.second)\n\t\t{\n\t\t\t// Could happen if no buffer was used at requested binding point.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst auto &var = get<SPIRVariable>(dynamic_buffer.second.second);\n\t\tuint32_t var_id = var.self;\n\t\tconst auto &type = get_variable_data_type(var);\n\t\tstring name = to_name(var.self);\n\t\tuint32_t desc_set = get_decoration(var.self, DecorationDescriptorSet);\n\t\tuint32_t arg_id = argument_buffer_ids[desc_set];\n\t\tuint32_t base_index = dynamic_buffer.second.first;\n\n\t\tif (!type.array.empty())\n\t\t{\n\t\t\t// This is complicated, because we need to support arrays of arrays.\n\t\t\t// And it's even worse if the outermost dimension is a runtime array, because now\n\t\t\t// all this complicated goop has to go into the shader itself. (FIXME)\n\t\t\tif (!type.array[type.array.size() - 1])\n\t\t\t\tSPIRV_CROSS_THROW(\"Runtime arrays with dynamic offsets are not supported yet.\");\n\t\t\telse\n\t\t\t{\n\t\t\t\tis_using_builtin_array = true;\n\t\t\t\tstatement(get_argument_address_space(var), \" \", type_to_glsl(type), \"* \", to_restrict(var_id, true), name,\n\t\t\t\t          type_to_array_glsl(type), \" =\");\n\n\t\t\t\tuint32_t dim = uint32_t(type.array.size());\n\t\t\t\tuint32_t j = 0;\n\t\t\t\tfor (SmallVector<uint32_t> indices(type.array.size());\n\t\t\t\t     indices[type.array.size() - 1] < to_array_size_literal(type); j++)\n\t\t\t\t{\n\t\t\t\t\twhile (dim > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tbegin_scope();\n\t\t\t\t\t\t--dim;\n\t\t\t\t\t}\n\n\t\t\t\t\tstring arrays;\n\t\t\t\t\tfor (uint32_t i = uint32_t(type.array.size()); i; --i)\n\t\t\t\t\t\tarrays += join(\"[\", indices[i - 1], \"]\");\n\t\t\t\t\tstatement(\"(\", get_argument_address_space(var), \" \", type_to_glsl(type), \"* \",\n\t\t\t\t\t          to_restrict(var_id, false), \")((\", get_argument_address_space(var), \" char* \",\n\t\t\t\t\t          to_restrict(var_id, false), \")\", to_name(arg_id), \".\", ensure_valid_name(name, \"m\"),\n\t\t\t\t\t          arrays, \" + \", to_name(dynamic_offsets_buffer_id), \"[\", base_index + j, \"]),\");\n\n\t\t\t\t\twhile (++indices[dim] >= to_array_size_literal(type, dim) && dim < type.array.size() - 1)\n\t\t\t\t\t{\n\t\t\t\t\t\tend_scope(\",\");\n\t\t\t\t\t\tindices[dim++] = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tend_scope_decl();\n\t\t\t\tstatement_no_indent(\"\");\n\t\t\t\tis_using_builtin_array = false;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstatement(get_argument_address_space(var), \" auto& \", to_restrict(var_id, true), name, \" = *(\",\n\t\t\t          get_argument_address_space(var), \" \", type_to_glsl(type), \"* \", to_restrict(var_id, false), \")((\",\n\t\t\t          get_argument_address_space(var), \" char* \", to_restrict(var_id, false), \")\", to_name(arg_id), \".\",\n\t\t\t          ensure_valid_name(name, \"m\"), \" + \", to_name(dynamic_offsets_buffer_id), \"[\", base_index, \"]);\");\n\t\t}\n\t}\n\n\tbool has_runtime_array_declaration = false;\n\tfor (SPIRVariable *arg : entry_point_bindings)\n\t{\n\t\tconst auto &var = *arg;\n\t\tconst auto &type = get_variable_data_type(var);\n\t\tconst auto &buffer_type = get_variable_element_type(var);\n\t\tconst string name = to_name(var.self);\n\t\tif (is_var_runtime_size_array(var))\n\t\t{\n\t\t\tif (msl_options.argument_buffers_tier < Options::ArgumentBuffersTier::Tier2)\n\t\t\t{\n\t\t\t\tSPIRV_CROSS_THROW(\"Unsized array of descriptors requires argument buffer tier 2\");\n\t\t\t}\n\t\t\tswitch (type.basetype)\n\t\t\t{\n\t\t\tcase SPIRType::Image:\n\t\t\tcase SPIRType::Sampler:\n\t\t\tcase SPIRType::AccelerationStructure:\n\t\t\t\tstatement(\"spvDescriptorArray<\", type_to_glsl(buffer_type), \"> \", name, \" {\", name, \"_};\");\n\t\t\t\tbreak;\n\t\t\tcase SPIRType::SampledImage:\n\t\t\t\tstatement(\"spvDescriptorArray<\", type_to_glsl(buffer_type), \"> \", name, \" {\", name, \"_};\");\n\t\t\t\tstatement(\"spvDescriptorArray<sampler> \", name, \"Smplr {\", name, \"Smplr_};\");\n\t\t\t\tbreak;\n\t\t\tcase SPIRType::Struct:\n\t\t\t\tstatement(\"spvDescriptorArray<\", get_argument_address_space(var), \" \", type_to_glsl(buffer_type), \"*> \",\n\t\t\t\t          name, \" {\", name, \"_};\");\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\thas_runtime_array_declaration = true;\n\t\t}\n\t\telse if (!type.array.empty() && type.basetype == SPIRType::Struct)\n\t\t{\n\t\t\t// Emit only buffer arrays here.\n\t\t\tstatement(get_argument_address_space(var), \" \", type_to_glsl(buffer_type), \"* \",\n\t\t\t          to_restrict(var.self, true), name, \"[] =\");\n\t\t\tbegin_scope();\n\t\t\tuint32_t array_size = get_resource_array_size(type, var.self);\n\t\t\tfor (uint32_t i = 0; i < array_size; ++i)\n\t\t\t\tstatement(name, \"_\", i, \",\");\n\t\t\tend_scope_decl();\n\t\t\tstatement_no_indent(\"\");\n\t\t}\n\t}\n\n\tif (has_runtime_array_declaration)\n\t\tstatement_no_indent(\"\");\n\n\t// Emit buffer aliases here.\n\tfor (auto &var_id : buffer_aliases_discrete)\n\t{\n\t\tconst auto &var = get<SPIRVariable>(var_id);\n\t\tconst auto &type = get_variable_data_type(var);\n\t\tauto addr_space = get_argument_address_space(var);\n\t\tauto name = to_name(var_id);\n\n\t\tuint32_t desc_set = get_decoration(var_id, DecorationDescriptorSet);\n\t\tuint32_t desc_binding = get_decoration(var_id, DecorationBinding);\n\t\tauto alias_name = join(\"spvBufferAliasSet\", desc_set, \"Binding\", desc_binding);\n\n\t\tstatement(addr_space, \" auto& \", to_restrict(var_id, true),\n\t\t          name,\n\t\t          \" = *(\", addr_space, \" \", type_to_glsl(type), \"*)\", alias_name, \";\");\n\t}\n\t// Discrete descriptors are processed in entry point emission every compiler iteration.\n\tbuffer_aliases_discrete.clear();\n\n\tfor (auto &var_pair : buffer_aliases_argument)\n\t{\n\t\tuint32_t var_id = var_pair.first;\n\t\tuint32_t alias_id = var_pair.second;\n\n\t\tconst auto &var = get<SPIRVariable>(var_id);\n\t\tconst auto &type = get_variable_data_type(var);\n\t\tauto addr_space = get_argument_address_space(var);\n\n\t\tif (type.array.empty())\n\t\t{\n\t\t\tstatement(addr_space, \" auto& \", to_restrict(var_id, true), to_name(var_id), \" = (\", addr_space, \" \",\n\t\t\t          type_to_glsl(type), \"&)\", ir.meta[alias_id].decoration.qualified_alias, \";\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst char *desc_addr_space = descriptor_address_space(var_id, var.storage, \"thread\");\n\n\t\t\t// Esoteric type cast. Reference to array of pointers.\n\t\t\t// Auto here defers to UBO or SSBO. The address space of the reference needs to refer to the\n\t\t\t// address space of the argument buffer itself, which is usually constant, but can be const device for\n\t\t\t// large argument buffers.\n\t\t\tis_using_builtin_array = true;\n\t\t\tstatement(desc_addr_space, \" auto& \", to_restrict(var_id, true), to_name(var_id), \" = (\", addr_space, \" \",\n\t\t\t          type_to_glsl(type), \"* \", desc_addr_space, \" (&)\",\n\t\t\t          type_to_array_glsl(type), \")\", ir.meta[alias_id].decoration.qualified_alias, \";\");\n\t\t\tis_using_builtin_array = false;\n\t\t}\n\t}\n\n\t// Emit disabled fragment outputs.\n\tstd::sort(disabled_frag_outputs.begin(), disabled_frag_outputs.end());\n\tfor (uint32_t var_id : disabled_frag_outputs)\n\t{\n\t\tauto &var = get<SPIRVariable>(var_id);\n\t\tadd_local_variable_name(var_id);\n\t\tstatement(CompilerGLSL::variable_decl(var), \";\");\n\t\tvar.deferred_declaration = false;\n\t}\n}\n\nstring CompilerMSL::compile()\n{\n\treplace_illegal_entry_point_names();\n\tir.fixup_reserved_names();\n\n\t// Do not deal with GLES-isms like precision, older extensions and such.\n\toptions.vulkan_semantics = true;\n\toptions.es = false;\n\toptions.version = 450;\n\tbackend.null_pointer_literal = \"nullptr\";\n\tbackend.float_literal_suffix = false;\n\tbackend.uint32_t_literal_suffix = true;\n\tbackend.int16_t_literal_suffix = \"\";\n\tbackend.uint16_t_literal_suffix = \"\";\n\tbackend.basic_int_type = \"int\";\n\tbackend.basic_uint_type = \"uint\";\n\tbackend.basic_int8_type = \"char\";\n\tbackend.basic_uint8_type = \"uchar\";\n\tbackend.basic_int16_type = \"short\";\n\tbackend.basic_uint16_type = \"ushort\";\n\tbackend.boolean_mix_function = \"select\";\n\tbackend.swizzle_is_function = false;\n\tbackend.shared_is_implied = false;\n\tbackend.use_initializer_list = true;\n\tbackend.use_typed_initializer_list = true;\n\tbackend.native_row_major_matrix = false;\n\tbackend.unsized_array_supported = false;\n\tbackend.can_declare_arrays_inline = false;\n\tbackend.allow_truncated_access_chain = true;\n\tbackend.comparison_image_samples_scalar = true;\n\tbackend.native_pointers = true;\n\tbackend.nonuniform_qualifier = \"\";\n\tbackend.support_small_type_sampling_result = true;\n\tbackend.supports_empty_struct = true;\n\tbackend.support_64bit_switch = true;\n\tbackend.boolean_in_struct_remapped_type = SPIRType::Short;\n\n\t// Allow Metal to use the array<T> template unless we force it off.\n\tbackend.can_return_array = !msl_options.force_native_arrays;\n\tbackend.array_is_value_type = !msl_options.force_native_arrays;\n\t// Arrays which are part of buffer objects are never considered to be value types (just plain C-style).\n\tbackend.array_is_value_type_in_buffer_blocks = false;\n\tbackend.support_pointer_to_pointer = true;\n\tbackend.implicit_c_integer_promotion_rules = true;\n\n\tcapture_output_to_buffer = msl_options.capture_output_to_buffer;\n\tis_rasterization_disabled = msl_options.disable_rasterization || capture_output_to_buffer;\n\n\t// Initialize array here rather than constructor, MSVC 2013 workaround.\n\tfor (auto &id : next_metal_resource_ids)\n\t\tid = 0;\n\n\tfixup_anonymous_struct_names();\n\tfixup_type_alias();\n\treplace_illegal_names();\n\tsync_entry_point_aliases_and_names();\n\n\tbuild_function_control_flow_graphs_and_analyze();\n\tupdate_active_builtins();\n\tanalyze_image_and_sampler_usage();\n\tanalyze_sampled_image_usage();\n\tanalyze_interlocked_resource_usage();\n\tpreprocess_op_codes();\n\tbuild_implicit_builtins();\n\n\tif (needs_manual_helper_invocation_updates() &&\n\t    (active_input_builtins.get(BuiltInHelperInvocation) || needs_helper_invocation))\n\t{\n\t\tstring discard_expr =\n\t\t    join(builtin_to_glsl(BuiltInHelperInvocation, StorageClassInput), \" = true, discard_fragment()\");\n\t\tbackend.discard_literal = discard_expr;\n\t\tbackend.demote_literal = discard_expr;\n\t}\n\telse\n\t{\n\t\tbackend.discard_literal = \"discard_fragment()\";\n\t\tbackend.demote_literal = \"discard_fragment()\";\n\t}\n\n\tfixup_image_load_store_access();\n\n\tset_enabled_interface_variables(get_active_interface_variables());\n\tif (msl_options.force_active_argument_buffer_resources)\n\t\tactivate_argument_buffer_resources();\n\n\tif (swizzle_buffer_id)\n\t\tadd_active_interface_variable(swizzle_buffer_id);\n\tif (buffer_size_buffer_id)\n\t\tadd_active_interface_variable(buffer_size_buffer_id);\n\tif (view_mask_buffer_id)\n\t\tadd_active_interface_variable(view_mask_buffer_id);\n\tif (dynamic_offsets_buffer_id)\n\t\tadd_active_interface_variable(dynamic_offsets_buffer_id);\n\tif (builtin_layer_id)\n\t\tadd_active_interface_variable(builtin_layer_id);\n\tif (builtin_dispatch_base_id && !msl_options.supports_msl_version(1, 2))\n\t\tadd_active_interface_variable(builtin_dispatch_base_id);\n\tif (builtin_sample_mask_id)\n\t\tadd_active_interface_variable(builtin_sample_mask_id);\n\n\t// Create structs to hold input, output and uniform variables.\n\t// Do output first to ensure out. is declared at top of entry function.\n\tqual_pos_var_name = \"\";\n\tstage_out_var_id = add_interface_block(StorageClassOutput);\n\tpatch_stage_out_var_id = add_interface_block(StorageClassOutput, true);\n\tstage_in_var_id = add_interface_block(StorageClassInput);\n\tif (is_tese_shader())\n\t\tpatch_stage_in_var_id = add_interface_block(StorageClassInput, true);\n\n\tif (is_tesc_shader())\n\t\tstage_out_ptr_var_id = add_interface_block_pointer(stage_out_var_id, StorageClassOutput);\n\tif (is_tessellation_shader())\n\t\tstage_in_ptr_var_id = add_interface_block_pointer(stage_in_var_id, StorageClassInput);\n\n\t// Metal vertex functions that define no output must disable rasterization and return void.\n\tif (!stage_out_var_id)\n\t\tis_rasterization_disabled = true;\n\n\t// Convert the use of global variables to recursively-passed function parameters\n\tlocalize_global_variables();\n\textract_global_variables_from_functions();\n\n\t// Mark any non-stage-in structs to be tightly packed.\n\tmark_packable_structs();\n\treorder_type_alias();\n\n\t// Add fixup hooks required by shader inputs and outputs. This needs to happen before\n\t// the loop, so the hooks aren't added multiple times.\n\tfix_up_shader_inputs_outputs();\n\n\t// If we are using argument buffers, we create argument buffer structures for them here.\n\t// These buffers will be used in the entry point, not the individual resources.\n\tif (msl_options.argument_buffers)\n\t{\n\t\tif (!msl_options.supports_msl_version(2, 0))\n\t\t\tSPIRV_CROSS_THROW(\"Argument buffers can only be used with MSL 2.0 and up.\");\n\t\tanalyze_argument_buffers();\n\t}\n\n\tuint32_t pass_count = 0;\n\tdo\n\t{\n\t\treset(pass_count);\n\n\t\t// Start bindings at zero.\n\t\tnext_metal_resource_index_buffer = 0;\n\t\tnext_metal_resource_index_texture = 0;\n\t\tnext_metal_resource_index_sampler = 0;\n\t\tfor (auto &id : next_metal_resource_ids)\n\t\t\tid = 0;\n\n\t\t// Move constructor for this type is broken on GCC 4.9 ...\n\t\tbuffer.reset();\n\n\t\temit_header();\n\t\temit_custom_templates();\n\t\temit_custom_functions();\n\t\temit_specialization_constants_and_structs();\n\t\temit_resources();\n\t\temit_function(get<SPIRFunction>(ir.default_entry_point), Bitset());\n\n\t\tpass_count++;\n\t} while (is_forcing_recompilation());\n\n\treturn buffer.str();\n}\n\n// Register the need to output any custom functions.\nvoid CompilerMSL::preprocess_op_codes()\n{\n\tOpCodePreprocessor preproc(*this);\n\ttraverse_all_reachable_opcodes(get<SPIRFunction>(ir.default_entry_point), preproc);\n\n\tsuppress_missing_prototypes = preproc.suppress_missing_prototypes;\n\n\tif (preproc.uses_atomics)\n\t{\n\t\tadd_header_line(\"#include <metal_atomic>\");\n\t\tadd_pragma_line(\"#pragma clang diagnostic ignored \\\"-Wunused-variable\\\"\");\n\t}\n\n\t// Before MSL 2.1 (2.2 for textures), Metal vertex functions that write to\n\t// resources must disable rasterization and return void.\n\tif ((preproc.uses_buffer_write && !msl_options.supports_msl_version(2, 1)) ||\n\t    (preproc.uses_image_write && !msl_options.supports_msl_version(2, 2)))\n\t\tis_rasterization_disabled = true;\n\n\t// Tessellation control shaders are run as compute functions in Metal, and so\n\t// must capture their output to a buffer.\n\tif (is_tesc_shader() || (get_execution_model() == ExecutionModelVertex && msl_options.vertex_for_tessellation))\n\t{\n\t\tis_rasterization_disabled = true;\n\t\tcapture_output_to_buffer = true;\n\t}\n\n\tif (preproc.needs_subgroup_invocation_id)\n\t\tneeds_subgroup_invocation_id = true;\n\tif (preproc.needs_subgroup_size)\n\t\tneeds_subgroup_size = true;\n\t// build_implicit_builtins() hasn't run yet, and in fact, this needs to execute\n\t// before then so that gl_SampleID will get added; so we also need to check if\n\t// that function would add gl_FragCoord.\n\tif (preproc.needs_sample_id || msl_options.force_sample_rate_shading ||\n\t    (is_sample_rate() && (active_input_builtins.get(BuiltInFragCoord) ||\n\t                          (need_subpass_input_ms && !msl_options.use_framebuffer_fetch_subpasses))))\n\t\tneeds_sample_id = true;\n\tif (preproc.needs_helper_invocation)\n\t\tneeds_helper_invocation = true;\n\n\t// OpKill is removed by the parser, so we need to identify those by inspecting\n\t// blocks.\n\tir.for_each_typed_id<SPIRBlock>([&preproc](uint32_t, SPIRBlock &block) {\n\t\tif (block.terminator == SPIRBlock::Kill)\n\t\t\tpreproc.uses_discard = true;\n\t});\n\n\t// Fragment shaders that both write to storage resources and discard fragments\n\t// need checks on the writes, to work around Metal allowing these writes despite\n\t// the fragment being dead.\n\tif (msl_options.check_discarded_frag_stores && preproc.uses_discard &&\n\t    (preproc.uses_buffer_write || preproc.uses_image_write))\n\t{\n\t\tfrag_shader_needs_discard_checks = true;\n\t\tneeds_helper_invocation = true;\n\t\t// Fragment discard store checks imply manual HelperInvocation updates.\n\t\tmsl_options.manual_helper_invocation_updates = true;\n\t}\n\n\tif (is_intersection_query())\n\t{\n\t\tadd_header_line(\"#if __METAL_VERSION__ >= 230\");\n\t\tadd_header_line(\"#include <metal_raytracing>\");\n\t\tadd_header_line(\"using namespace metal::raytracing;\");\n\t\tadd_header_line(\"#endif\");\n\t}\n}\n\n// Move the Private and Workgroup global variables to the entry function.\n// Non-constant variables cannot have global scope in Metal.\nvoid CompilerMSL::localize_global_variables()\n{\n\tauto &entry_func = get<SPIRFunction>(ir.default_entry_point);\n\tauto iter = global_variables.begin();\n\twhile (iter != global_variables.end())\n\t{\n\t\tuint32_t v_id = *iter;\n\t\tauto &var = get<SPIRVariable>(v_id);\n\t\tif (var.storage == StorageClassPrivate || var.storage == StorageClassWorkgroup)\n\t\t{\n\t\t\tif (!variable_is_lut(var))\n\t\t\t\tentry_func.add_local_variable(v_id);\n\t\t\titer = global_variables.erase(iter);\n\t\t}\n\t\telse\n\t\t\titer++;\n\t}\n}\n\n// For any global variable accessed directly by a function,\n// extract that variable and add it as an argument to that function.\nvoid CompilerMSL::extract_global_variables_from_functions()\n{\n\t// Uniforms\n\tunordered_set<uint32_t> global_var_ids;\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\t// Some builtins resolve directly to a function call which does not need any declared variables.\n\t\t// Skip these.\n\t\tif (var.storage == StorageClassInput && has_decoration(var.self, DecorationBuiltIn))\n\t\t{\n\t\t\tauto bi_type = BuiltIn(get_decoration(var.self, DecorationBuiltIn));\n\t\t\tif (bi_type == BuiltInHelperInvocation && !needs_manual_helper_invocation_updates())\n\t\t\t\treturn;\n\t\t\tif (bi_type == BuiltInHelperInvocation && needs_manual_helper_invocation_updates())\n\t\t\t{\n\t\t\t\tif (msl_options.is_ios() && !msl_options.supports_msl_version(2, 3))\n\t\t\t\t\tSPIRV_CROSS_THROW(\"simd_is_helper_thread() requires version 2.3 on iOS.\");\n\t\t\t\telse if (msl_options.is_macos() && !msl_options.supports_msl_version(2, 1))\n\t\t\t\t\tSPIRV_CROSS_THROW(\"simd_is_helper_thread() requires version 2.1 on macOS.\");\n\t\t\t\t// Make sure this is declared and initialized.\n\t\t\t\t// Force this to have the proper name.\n\t\t\t\tset_name(var.self, builtin_to_glsl(BuiltInHelperInvocation, StorageClassInput));\n\t\t\t\tauto &entry_func = this->get<SPIRFunction>(ir.default_entry_point);\n\t\t\t\tentry_func.add_local_variable(var.self);\n\t\t\t\tvars_needing_early_declaration.push_back(var.self);\n\t\t\t\tentry_func.fixup_hooks_in.push_back([this, &var]()\n\t\t\t\t                                    { statement(to_name(var.self), \" = simd_is_helper_thread();\"); });\n\t\t\t}\n\t\t}\n\n\t\tif (var.storage == StorageClassInput || var.storage == StorageClassOutput ||\n\t\t    var.storage == StorageClassUniform || var.storage == StorageClassUniformConstant ||\n\t\t    var.storage == StorageClassPushConstant || var.storage == StorageClassStorageBuffer)\n\t\t{\n\t\t\tglobal_var_ids.insert(var.self);\n\t\t}\n\t});\n\n\t// Local vars that are declared in the main function and accessed directly by a function\n\tauto &entry_func = get<SPIRFunction>(ir.default_entry_point);\n\tfor (auto &var : entry_func.local_variables)\n\t\tif (get<SPIRVariable>(var).storage != StorageClassFunction)\n\t\t\tglobal_var_ids.insert(var);\n\n\tstd::set<uint32_t> added_arg_ids;\n\tunordered_set<uint32_t> processed_func_ids;\n\textract_global_variables_from_function(ir.default_entry_point, added_arg_ids, global_var_ids, processed_func_ids);\n}\n\n// MSL does not support the use of global variables for shader input content.\n// For any global variable accessed directly by the specified function, extract that variable,\n// add it as an argument to that function, and the arg to the added_arg_ids collection.\nvoid CompilerMSL::extract_global_variables_from_function(uint32_t func_id, std::set<uint32_t> &added_arg_ids,\n                                                         unordered_set<uint32_t> &global_var_ids,\n                                                         unordered_set<uint32_t> &processed_func_ids)\n{\n\t// Avoid processing a function more than once\n\tif (processed_func_ids.find(func_id) != processed_func_ids.end())\n\t{\n\t\t// Return function global variables\n\t\tadded_arg_ids = function_global_vars[func_id];\n\t\treturn;\n\t}\n\n\tprocessed_func_ids.insert(func_id);\n\n\tauto &func = get<SPIRFunction>(func_id);\n\n\t// Recursively establish global args added to functions on which we depend.\n\tfor (auto block : func.blocks)\n\t{\n\t\tauto &b = get<SPIRBlock>(block);\n\t\tfor (auto &i : b.ops)\n\t\t{\n\t\t\tauto ops = stream(i);\n\t\t\tauto op = static_cast<Op>(i.op);\n\n\t\t\tswitch (op)\n\t\t\t{\n\t\t\tcase OpLoad:\n\t\t\tcase OpInBoundsAccessChain:\n\t\t\tcase OpAccessChain:\n\t\t\tcase OpPtrAccessChain:\n\t\t\tcase OpArrayLength:\n\t\t\t{\n\t\t\t\tuint32_t base_id = ops[2];\n\t\t\t\tif (global_var_ids.find(base_id) != global_var_ids.end())\n\t\t\t\t\tadded_arg_ids.insert(base_id);\n\n\t\t\t\t// Use Metal's native frame-buffer fetch API for subpass inputs.\n\t\t\t\tauto &type = get<SPIRType>(ops[0]);\n\t\t\t\tif (type.basetype == SPIRType::Image && type.image.dim == DimSubpassData &&\n\t\t\t\t    (!msl_options.use_framebuffer_fetch_subpasses))\n\t\t\t\t{\n\t\t\t\t\t// Implicitly reads gl_FragCoord.\n\t\t\t\t\tassert(builtin_frag_coord_id != 0);\n\t\t\t\t\tadded_arg_ids.insert(builtin_frag_coord_id);\n\t\t\t\t\tif (msl_options.multiview)\n\t\t\t\t\t{\n\t\t\t\t\t\t// Implicitly reads gl_ViewIndex.\n\t\t\t\t\t\tassert(builtin_view_idx_id != 0);\n\t\t\t\t\t\tadded_arg_ids.insert(builtin_view_idx_id);\n\t\t\t\t\t}\n\t\t\t\t\telse if (msl_options.arrayed_subpass_input)\n\t\t\t\t\t{\n\t\t\t\t\t\t// Implicitly reads gl_Layer.\n\t\t\t\t\t\tassert(builtin_layer_id != 0);\n\t\t\t\t\t\tadded_arg_ids.insert(builtin_layer_id);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase OpFunctionCall:\n\t\t\t{\n\t\t\t\t// First see if any of the function call args are globals\n\t\t\t\tfor (uint32_t arg_idx = 3; arg_idx < i.length; arg_idx++)\n\t\t\t\t{\n\t\t\t\t\tuint32_t arg_id = ops[arg_idx];\n\t\t\t\t\tif (global_var_ids.find(arg_id) != global_var_ids.end())\n\t\t\t\t\t\tadded_arg_ids.insert(arg_id);\n\t\t\t\t}\n\n\t\t\t\t// Then recurse into the function itself to extract globals used internally in the function\n\t\t\t\tuint32_t inner_func_id = ops[2];\n\t\t\t\tstd::set<uint32_t> inner_func_args;\n\t\t\t\textract_global_variables_from_function(inner_func_id, inner_func_args, global_var_ids,\n\t\t\t\t                                       processed_func_ids);\n\t\t\t\tadded_arg_ids.insert(inner_func_args.begin(), inner_func_args.end());\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase OpStore:\n\t\t\t{\n\t\t\t\tuint32_t base_id = ops[0];\n\t\t\t\tif (global_var_ids.find(base_id) != global_var_ids.end())\n\t\t\t\t\tadded_arg_ids.insert(base_id);\n\n\t\t\t\tuint32_t rvalue_id = ops[1];\n\t\t\t\tif (global_var_ids.find(rvalue_id) != global_var_ids.end())\n\t\t\t\t\tadded_arg_ids.insert(rvalue_id);\n\n\t\t\t\tif (needs_frag_discard_checks())\n\t\t\t\t\tadded_arg_ids.insert(builtin_helper_invocation_id);\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase OpSelect:\n\t\t\t{\n\t\t\t\tuint32_t base_id = ops[3];\n\t\t\t\tif (global_var_ids.find(base_id) != global_var_ids.end())\n\t\t\t\t\tadded_arg_ids.insert(base_id);\n\t\t\t\tbase_id = ops[4];\n\t\t\t\tif (global_var_ids.find(base_id) != global_var_ids.end())\n\t\t\t\t\tadded_arg_ids.insert(base_id);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase OpAtomicExchange:\n\t\t\tcase OpAtomicCompareExchange:\n\t\t\tcase OpAtomicStore:\n\t\t\tcase OpAtomicIIncrement:\n\t\t\tcase OpAtomicIDecrement:\n\t\t\tcase OpAtomicIAdd:\n\t\t\tcase OpAtomicFAddEXT:\n\t\t\tcase OpAtomicISub:\n\t\t\tcase OpAtomicSMin:\n\t\t\tcase OpAtomicUMin:\n\t\t\tcase OpAtomicSMax:\n\t\t\tcase OpAtomicUMax:\n\t\t\tcase OpAtomicAnd:\n\t\t\tcase OpAtomicOr:\n\t\t\tcase OpAtomicXor:\n\t\t\tcase OpImageWrite:\n\t\t\t{\n\t\t\t\tif (needs_frag_discard_checks())\n\t\t\t\t\tadded_arg_ids.insert(builtin_helper_invocation_id);\n\t\t\t\tuint32_t ptr = 0;\n\t\t\t\tif (op == OpAtomicStore || op == OpImageWrite)\n\t\t\t\t\tptr = ops[0];\n\t\t\t\telse\n\t\t\t\t\tptr = ops[2];\n\t\t\t\tif (global_var_ids.find(ptr) != global_var_ids.end())\n\t\t\t\t\tadded_arg_ids.insert(ptr);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Emulate texture2D atomic operations\n\t\t\tcase OpImageTexelPointer:\n\t\t\t{\n\t\t\t\t// When using the pointer, we need to know which variable it is actually loaded from.\n\t\t\t\tuint32_t base_id = ops[2];\n\t\t\t\tauto *var = maybe_get_backing_variable(base_id);\n\t\t\t\tif (var && atomic_image_vars_emulated.count(var->self))\n\t\t\t\t{\n\t\t\t\t\tif (!get<SPIRType>(var->basetype).array.empty())\n\t\t\t\t\t\tSPIRV_CROSS_THROW(\"Cannot emulate array of storage images with atomics. Use MSL 3.1 for native support.\");\n\n\t\t\t\t\tif (global_var_ids.find(base_id) != global_var_ids.end())\n\t\t\t\t\t\tadded_arg_ids.insert(base_id);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase OpExtInst:\n\t\t\t{\n\t\t\t\tuint32_t extension_set = ops[2];\n\t\t\t\tif (get<SPIRExtension>(extension_set).ext == SPIRExtension::GLSL)\n\t\t\t\t{\n\t\t\t\t\tauto op_450 = static_cast<GLSLstd450>(ops[3]);\n\t\t\t\t\tswitch (op_450)\n\t\t\t\t\t{\n\t\t\t\t\tcase GLSLstd450InterpolateAtCentroid:\n\t\t\t\t\tcase GLSLstd450InterpolateAtSample:\n\t\t\t\t\tcase GLSLstd450InterpolateAtOffset:\n\t\t\t\t\t{\n\t\t\t\t\t\t// For these, we really need the stage-in block. It is theoretically possible to pass the\n\t\t\t\t\t\t// interpolant object, but a) doing so would require us to create an entirely new variable\n\t\t\t\t\t\t// with Interpolant type, and b) if we have a struct or array, handling all the members and\n\t\t\t\t\t\t// elements could get unwieldy fast.\n\t\t\t\t\t\tadded_arg_ids.insert(stage_in_var_id);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase GLSLstd450Modf:\n\t\t\t\t\tcase GLSLstd450Frexp:\n\t\t\t\t\t{\n\t\t\t\t\t\tuint32_t base_id = ops[5];\n\t\t\t\t\t\tif (global_var_ids.find(base_id) != global_var_ids.end())\n\t\t\t\t\t\t\tadded_arg_ids.insert(base_id);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase OpGroupNonUniformInverseBallot:\n\t\t\t{\n\t\t\t\tadded_arg_ids.insert(builtin_subgroup_invocation_id_id);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase OpGroupNonUniformBallotFindLSB:\n\t\t\tcase OpGroupNonUniformBallotFindMSB:\n\t\t\t{\n\t\t\t\tadded_arg_ids.insert(builtin_subgroup_size_id);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase OpGroupNonUniformBallotBitCount:\n\t\t\t{\n\t\t\t\tauto operation = static_cast<GroupOperation>(ops[3]);\n\t\t\t\tswitch (operation)\n\t\t\t\t{\n\t\t\t\tcase GroupOperationReduce:\n\t\t\t\t\tadded_arg_ids.insert(builtin_subgroup_size_id);\n\t\t\t\t\tbreak;\n\t\t\t\tcase GroupOperationInclusiveScan:\n\t\t\t\tcase GroupOperationExclusiveScan:\n\t\t\t\t\tadded_arg_ids.insert(builtin_subgroup_invocation_id_id);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase OpDemoteToHelperInvocation:\n\t\t\t\tif (needs_manual_helper_invocation_updates() &&\n\t\t\t\t    (active_input_builtins.get(BuiltInHelperInvocation) || needs_helper_invocation))\n\t\t\t\t\tadded_arg_ids.insert(builtin_helper_invocation_id);\n\t\t\t\tbreak;\n\n\t\t\tcase OpIsHelperInvocationEXT:\n\t\t\t\tif (needs_manual_helper_invocation_updates())\n\t\t\t\t\tadded_arg_ids.insert(builtin_helper_invocation_id);\n\t\t\t\tbreak;\n\n\t\t\tcase OpRayQueryInitializeKHR:\n\t\t\tcase OpRayQueryProceedKHR:\n\t\t\tcase OpRayQueryTerminateKHR:\n\t\t\tcase OpRayQueryGenerateIntersectionKHR:\n\t\t\tcase OpRayQueryConfirmIntersectionKHR:\n\t\t\t{\n\t\t\t\t// Ray query accesses memory directly, need check pass down object if using Private storage class.\n\t\t\t\tuint32_t base_id = ops[0];\n\t\t\t\tif (global_var_ids.find(base_id) != global_var_ids.end())\n\t\t\t\t\tadded_arg_ids.insert(base_id);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase OpRayQueryGetRayTMinKHR:\n\t\t\tcase OpRayQueryGetRayFlagsKHR:\n\t\t\tcase OpRayQueryGetWorldRayOriginKHR:\n\t\t\tcase OpRayQueryGetWorldRayDirectionKHR:\n\t\t\tcase OpRayQueryGetIntersectionCandidateAABBOpaqueKHR:\n\t\t\tcase OpRayQueryGetIntersectionTypeKHR:\n\t\t\tcase OpRayQueryGetIntersectionTKHR:\n\t\t\tcase OpRayQueryGetIntersectionInstanceCustomIndexKHR:\n\t\t\tcase OpRayQueryGetIntersectionInstanceIdKHR:\n\t\t\tcase OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR:\n\t\t\tcase OpRayQueryGetIntersectionGeometryIndexKHR:\n\t\t\tcase OpRayQueryGetIntersectionPrimitiveIndexKHR:\n\t\t\tcase OpRayQueryGetIntersectionBarycentricsKHR:\n\t\t\tcase OpRayQueryGetIntersectionFrontFaceKHR:\n\t\t\tcase OpRayQueryGetIntersectionObjectRayDirectionKHR:\n\t\t\tcase OpRayQueryGetIntersectionObjectRayOriginKHR:\n\t\t\tcase OpRayQueryGetIntersectionObjectToWorldKHR:\n\t\t\tcase OpRayQueryGetIntersectionWorldToObjectKHR:\n\t\t\t{\n\t\t\t\t// Ray query accesses memory directly, need check pass down object if using Private storage class.\n\t\t\t\tuint32_t base_id = ops[2];\n\t\t\t\tif (global_var_ids.find(base_id) != global_var_ids.end())\n\t\t\t\t\tadded_arg_ids.insert(base_id);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (needs_manual_helper_invocation_updates() && b.terminator == SPIRBlock::Kill &&\n\t\t\t    (active_input_builtins.get(BuiltInHelperInvocation) || needs_helper_invocation))\n\t\t\t\tadded_arg_ids.insert(builtin_helper_invocation_id);\n\n\t\t\t// TODO: Add all other operations which can affect memory.\n\t\t\t// We should consider a more unified system here to reduce boiler-plate.\n\t\t\t// This kind of analysis is done in several places ...\n\t\t}\n\t}\n\n\tfunction_global_vars[func_id] = added_arg_ids;\n\n\t// Add the global variables as arguments to the function\n\tif (func_id != ir.default_entry_point)\n\t{\n\t\tbool control_point_added_in = false;\n\t\tbool control_point_added_out = false;\n\t\tbool patch_added_in = false;\n\t\tbool patch_added_out = false;\n\n\t\tfor (uint32_t arg_id : added_arg_ids)\n\t\t{\n\t\t\tauto &var = get<SPIRVariable>(arg_id);\n\t\t\tuint32_t type_id = var.basetype;\n\t\t\tauto *p_type = &get<SPIRType>(type_id);\n\t\t\tBuiltIn bi_type = BuiltIn(get_decoration(arg_id, DecorationBuiltIn));\n\n\t\t\tbool is_patch = has_decoration(arg_id, DecorationPatch) || is_patch_block(*p_type);\n\t\t\tbool is_block = has_decoration(p_type->self, DecorationBlock);\n\t\t\tbool is_control_point_storage =\n\t\t\t    !is_patch && ((is_tessellation_shader() && var.storage == StorageClassInput) ||\n\t\t\t                  (is_tesc_shader() && var.storage == StorageClassOutput));\n\t\t\tbool is_patch_block_storage = is_patch && is_block && var.storage == StorageClassOutput;\n\t\t\tbool is_builtin = is_builtin_variable(var);\n\t\t\tbool variable_is_stage_io =\n\t\t\t\t\t!is_builtin || bi_type == BuiltInPosition || bi_type == BuiltInPointSize ||\n\t\t\t\t\tbi_type == BuiltInClipDistance || bi_type == BuiltInCullDistance ||\n\t\t\t\t\tp_type->basetype == SPIRType::Struct;\n\t\t\tbool is_redirected_to_global_stage_io = (is_control_point_storage || is_patch_block_storage) &&\n\t\t\t                                        variable_is_stage_io;\n\n\t\t\t// If output is masked it is not considered part of the global stage IO interface.\n\t\t\tif (is_redirected_to_global_stage_io && var.storage == StorageClassOutput)\n\t\t\t\tis_redirected_to_global_stage_io = !is_stage_output_variable_masked(var);\n\n\t\t\tif (is_redirected_to_global_stage_io)\n\t\t\t{\n\t\t\t\t// Tessellation control shaders see inputs and per-point outputs as arrays.\n\t\t\t\t// Similarly, tessellation evaluation shaders see per-point inputs as arrays.\n\t\t\t\t// We collected them into a structure; we must pass the array of this\n\t\t\t\t// structure to the function.\n\t\t\t\tstd::string name;\n\t\t\t\tif (is_patch)\n\t\t\t\t\tname = var.storage == StorageClassInput ? patch_stage_in_var_name : patch_stage_out_var_name;\n\t\t\t\telse\n\t\t\t\t\tname = var.storage == StorageClassInput ? \"gl_in\" : \"gl_out\";\n\n\t\t\t\tif (var.storage == StorageClassOutput && has_decoration(p_type->self, DecorationBlock))\n\t\t\t\t{\n\t\t\t\t\t// If we're redirecting a block, we might still need to access the original block\n\t\t\t\t\t// variable if we're masking some members.\n\t\t\t\t\tfor (uint32_t mbr_idx = 0; mbr_idx < uint32_t(p_type->member_types.size()); mbr_idx++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (is_stage_output_block_member_masked(var, mbr_idx, true))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfunc.add_parameter(var.basetype, var.self, true);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (var.storage == StorageClassInput)\n\t\t\t\t{\n\t\t\t\t\tauto &added_in = is_patch ? patch_added_in : control_point_added_in;\n\t\t\t\t\tif (added_in)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\targ_id = is_patch ? patch_stage_in_var_id : stage_in_ptr_var_id;\n\t\t\t\t\tadded_in = true;\n\t\t\t\t}\n\t\t\t\telse if (var.storage == StorageClassOutput)\n\t\t\t\t{\n\t\t\t\t\tauto &added_out = is_patch ? patch_added_out : control_point_added_out;\n\t\t\t\t\tif (added_out)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\targ_id = is_patch ? patch_stage_out_var_id : stage_out_ptr_var_id;\n\t\t\t\t\tadded_out = true;\n\t\t\t\t}\n\n\t\t\t\ttype_id = get<SPIRVariable>(arg_id).basetype;\n\t\t\t\tuint32_t next_id = ir.increase_bound_by(1);\n\t\t\t\tfunc.add_parameter(type_id, next_id, true);\n\t\t\t\tset<SPIRVariable>(next_id, type_id, StorageClassFunction, 0, arg_id);\n\n\t\t\t\tset_name(next_id, name);\n\t\t\t\tif (is_tese_shader() && msl_options.raw_buffer_tese_input && var.storage == StorageClassInput)\n\t\t\t\t\tset_decoration(next_id, DecorationNonWritable);\n\t\t\t}\n\t\t\telse if (is_builtin && has_decoration(p_type->self, DecorationBlock))\n\t\t\t{\n\t\t\t\t// Get the pointee type\n\t\t\t\ttype_id = get_pointee_type_id(type_id);\n\t\t\t\tp_type = &get<SPIRType>(type_id);\n\n\t\t\t\tuint32_t mbr_idx = 0;\n\t\t\t\tfor (auto &mbr_type_id : p_type->member_types)\n\t\t\t\t{\n\t\t\t\t\tBuiltIn builtin = BuiltInMax;\n\t\t\t\t\tis_builtin = is_member_builtin(*p_type, mbr_idx, &builtin);\n\t\t\t\t\tif (is_builtin && has_active_builtin(builtin, var.storage))\n\t\t\t\t\t{\n\t\t\t\t\t\t// Add a arg variable with the same type and decorations as the member\n\t\t\t\t\t\tuint32_t next_ids = ir.increase_bound_by(2);\n\t\t\t\t\t\tuint32_t ptr_type_id = next_ids + 0;\n\t\t\t\t\t\tuint32_t var_id = next_ids + 1;\n\n\t\t\t\t\t\t// Make sure we have an actual pointer type,\n\t\t\t\t\t\t// so that we will get the appropriate address space when declaring these builtins.\n\t\t\t\t\t\tauto &ptr = set<SPIRType>(ptr_type_id, get<SPIRType>(mbr_type_id));\n\t\t\t\t\t\tptr.self = mbr_type_id;\n\t\t\t\t\t\tptr.storage = var.storage;\n\t\t\t\t\t\tptr.pointer = true;\n\t\t\t\t\t\tptr.pointer_depth++;\n\t\t\t\t\t\tptr.parent_type = mbr_type_id;\n\n\t\t\t\t\t\tfunc.add_parameter(mbr_type_id, var_id, true);\n\t\t\t\t\t\tset<SPIRVariable>(var_id, ptr_type_id, StorageClassFunction);\n\t\t\t\t\t\tir.meta[var_id].decoration = ir.meta[type_id].members[mbr_idx];\n\t\t\t\t\t}\n\t\t\t\t\tmbr_idx++;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tuint32_t next_id = ir.increase_bound_by(1);\n\t\t\t\tfunc.add_parameter(type_id, next_id, true);\n\t\t\t\tset<SPIRVariable>(next_id, type_id, StorageClassFunction, 0, arg_id);\n\n\t\t\t\t// Ensure the new variable has all the same meta info\n\t\t\t\tir.meta[next_id] = ir.meta[arg_id];\n\t\t\t}\n\t\t}\n\t}\n}\n\n// For all variables that are some form of non-input-output interface block, mark that all the structs\n// that are recursively contained within the type referenced by that variable should be packed tightly.\nvoid CompilerMSL::mark_packable_structs()\n{\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\tif (var.storage != StorageClassFunction && !is_hidden_variable(var))\n\t\t{\n\t\t\tauto &type = this->get<SPIRType>(var.basetype);\n\t\t\tif (type.pointer &&\n\t\t\t    (type.storage == StorageClassUniform || type.storage == StorageClassUniformConstant ||\n\t\t\t     type.storage == StorageClassPushConstant || type.storage == StorageClassStorageBuffer) &&\n\t\t\t    (has_decoration(type.self, DecorationBlock) || has_decoration(type.self, DecorationBufferBlock)))\n\t\t\t\tmark_as_packable(type);\n\t\t}\n\n\t\tif (var.storage == StorageClassWorkgroup)\n\t\t{\n\t\t\tauto *type = &this->get<SPIRType>(var.basetype);\n\t\t\tif (type->basetype == SPIRType::Struct)\n\t\t\t\tmark_as_workgroup_struct(*type);\n\t\t}\n\t});\n\n\t// Physical storage buffer pointers can appear outside of the context of a variable, if the address\n\t// is calculated from a ulong or uvec2 and cast to a pointer, so check if they need to be packed too.\n\tir.for_each_typed_id<SPIRType>([&](uint32_t, SPIRType &type) {\n\t\tif (type.basetype == SPIRType::Struct && type.pointer && type.storage == StorageClassPhysicalStorageBuffer)\n\t\t\tmark_as_packable(type);\n\t});\n}\n\n// If the specified type is a struct, it and any nested structs\n// are marked as packable with the SPIRVCrossDecorationBufferBlockRepacked decoration,\nvoid CompilerMSL::mark_as_packable(SPIRType &type)\n{\n\t// If this is not the base type (eg. it's a pointer or array), tunnel down\n\tif (type.parent_type)\n\t{\n\t\tmark_as_packable(get<SPIRType>(type.parent_type));\n\t\treturn;\n\t}\n\n\t// Handle possible recursion when a struct contains a pointer to its own type nested somewhere.\n\tif (type.basetype == SPIRType::Struct && !has_extended_decoration(type.self, SPIRVCrossDecorationBufferBlockRepacked))\n\t{\n\t\tset_extended_decoration(type.self, SPIRVCrossDecorationBufferBlockRepacked);\n\n\t\t// Recurse\n\t\tuint32_t mbr_cnt = uint32_t(type.member_types.size());\n\t\tfor (uint32_t mbr_idx = 0; mbr_idx < mbr_cnt; mbr_idx++)\n\t\t{\n\t\t\tuint32_t mbr_type_id = type.member_types[mbr_idx];\n\t\t\tauto &mbr_type = get<SPIRType>(mbr_type_id);\n\t\t\tmark_as_packable(mbr_type);\n\t\t\tif (mbr_type.type_alias)\n\t\t\t{\n\t\t\t\tauto &mbr_type_alias = get<SPIRType>(mbr_type.type_alias);\n\t\t\t\tmark_as_packable(mbr_type_alias);\n\t\t\t}\n\t\t}\n\t}\n}\n\n// If the specified type is a struct, it and any nested structs\n// are marked as used with workgroup storage using the SPIRVCrossDecorationWorkgroupStruct decoration.\nvoid CompilerMSL::mark_as_workgroup_struct(SPIRType &type)\n{\n\t// If this is not the base type (eg. it's a pointer or array), tunnel down\n\tif (type.parent_type)\n\t{\n\t\tmark_as_workgroup_struct(get<SPIRType>(type.parent_type));\n\t\treturn;\n\t}\n\n\t// Handle possible recursion when a struct contains a pointer to its own type nested somewhere.\n\tif (type.basetype == SPIRType::Struct && !has_extended_decoration(type.self, SPIRVCrossDecorationWorkgroupStruct))\n\t{\n\t\tset_extended_decoration(type.self, SPIRVCrossDecorationWorkgroupStruct);\n\n\t\t// Recurse\n\t\tuint32_t mbr_cnt = uint32_t(type.member_types.size());\n\t\tfor (uint32_t mbr_idx = 0; mbr_idx < mbr_cnt; mbr_idx++)\n\t\t{\n\t\t\tuint32_t mbr_type_id = type.member_types[mbr_idx];\n\t\t\tauto &mbr_type = get<SPIRType>(mbr_type_id);\n\t\t\tmark_as_workgroup_struct(mbr_type);\n\t\t\tif (mbr_type.type_alias)\n\t\t\t{\n\t\t\t\tauto &mbr_type_alias = get<SPIRType>(mbr_type.type_alias);\n\t\t\t\tmark_as_workgroup_struct(mbr_type_alias);\n\t\t\t}\n\t\t}\n\t}\n}\n\n// If a shader input exists at the location, it is marked as being used by this shader\nvoid CompilerMSL::mark_location_as_used_by_shader(uint32_t location, const SPIRType &type,\n                                                  StorageClass storage, bool fallback)\n{\n\tuint32_t count = type_to_location_count(type);\n\tswitch (storage)\n\t{\n\tcase StorageClassInput:\n\t\tfor (uint32_t i = 0; i < count; i++)\n\t\t{\n\t\t\tlocation_inputs_in_use.insert(location + i);\n\t\t\tif (fallback)\n\t\t\t\tlocation_inputs_in_use_fallback.insert(location + i);\n\t\t}\n\t\tbreak;\n\tcase StorageClassOutput:\n\t\tfor (uint32_t i = 0; i < count; i++)\n\t\t{\n\t\t\tlocation_outputs_in_use.insert(location + i);\n\t\t\tif (fallback)\n\t\t\t\tlocation_outputs_in_use_fallback.insert(location + i);\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\treturn;\n\t}\n}\n\nuint32_t CompilerMSL::get_target_components_for_fragment_location(uint32_t location) const\n{\n\tauto itr = fragment_output_components.find(location);\n\tif (itr == end(fragment_output_components))\n\t\treturn 4;\n\telse\n\t\treturn itr->second;\n}\n\nuint32_t CompilerMSL::build_extended_vector_type(uint32_t type_id, uint32_t components, SPIRType::BaseType basetype)\n{\n\tassert(components > 1);\n\tuint32_t new_type_id = ir.increase_bound_by(1);\n\tconst auto *p_old_type = &get<SPIRType>(type_id);\n\tconst SPIRType *old_ptr_t = nullptr;\n\tconst SPIRType *old_array_t = nullptr;\n\n\tif (is_pointer(*p_old_type))\n\t{\n\t\told_ptr_t = p_old_type;\n\t\tp_old_type = &get_pointee_type(*old_ptr_t);\n\t}\n\n\tif (is_array(*p_old_type))\n\t{\n\t\told_array_t = p_old_type;\n\t\tp_old_type = &get_type(old_array_t->parent_type);\n\t}\n\n\tauto *type = &set<SPIRType>(new_type_id, *p_old_type);\n\tassert(is_scalar(*type) || is_vector(*type));\n\ttype->op = OpTypeVector;\n\ttype->vecsize = components;\n\tif (basetype != SPIRType::Unknown)\n\t\ttype->basetype = basetype;\n\ttype->self = new_type_id;\n\ttype->parent_type = type_id;\n\ttype->array.clear();\n\ttype->array_size_literal.clear();\n\ttype->pointer = false;\n\n\tif (old_array_t)\n\t{\n\t\tuint32_t array_type_id = ir.increase_bound_by(1);\n\t\ttype = &set<SPIRType>(array_type_id, *type);\n\t\ttype->op = OpTypeArray;\n\t\ttype->parent_type = new_type_id;\n\t\ttype->array = old_array_t->array;\n\t\ttype->array_size_literal = old_array_t->array_size_literal;\n\t\tnew_type_id = array_type_id;\n\t}\n\n\tif (old_ptr_t)\n\t{\n\t\tuint32_t ptr_type_id = ir.increase_bound_by(1);\n\t\ttype = &set<SPIRType>(ptr_type_id, *type);\n\t\ttype->op = OpTypePointer;\n\t\ttype->parent_type = new_type_id;\n\t\ttype->storage = old_ptr_t->storage;\n\t\ttype->pointer = true;\n\t\ttype->pointer_depth++;\n\t\tnew_type_id = ptr_type_id;\n\t}\n\n\treturn new_type_id;\n}\n\nuint32_t CompilerMSL::build_msl_interpolant_type(uint32_t type_id, bool is_noperspective)\n{\n\tuint32_t new_type_id = ir.increase_bound_by(1);\n\tSPIRType &type = set<SPIRType>(new_type_id, get<SPIRType>(type_id));\n\ttype.basetype = SPIRType::Interpolant;\n\ttype.parent_type = type_id;\n\t// In Metal, the pull-model interpolant type encodes perspective-vs-no-perspective in the type itself.\n\t// Add this decoration so we know which argument to pass to the template.\n\tif (is_noperspective)\n\t\tset_decoration(new_type_id, DecorationNoPerspective);\n\treturn new_type_id;\n}\n\nbool CompilerMSL::add_component_variable_to_interface_block(spv::StorageClass storage, const std::string &ib_var_ref,\n                                                            SPIRVariable &var,\n                                                            const SPIRType &type,\n                                                            InterfaceBlockMeta &meta)\n{\n\t// Deal with Component decorations.\n\tconst InterfaceBlockMeta::LocationMeta *location_meta = nullptr;\n\tuint32_t location = ~0u;\n\tif (has_decoration(var.self, DecorationLocation))\n\t{\n\t\tlocation = get_decoration(var.self, DecorationLocation);\n\t\tauto location_meta_itr = meta.location_meta.find(location);\n\t\tif (location_meta_itr != end(meta.location_meta))\n\t\t\tlocation_meta = &location_meta_itr->second;\n\t}\n\n\t// Check if we need to pad fragment output to match a certain number of components.\n\tif (location_meta)\n\t{\n\t\tbool pad_fragment_output = has_decoration(var.self, DecorationLocation) &&\n\t\t                           msl_options.pad_fragment_output_components &&\n\t\t                           get_entry_point().model == ExecutionModelFragment && storage == StorageClassOutput;\n\n\t\tauto &entry_func = get<SPIRFunction>(ir.default_entry_point);\n\t\tuint32_t start_component = get_decoration(var.self, DecorationComponent);\n\t\tuint32_t type_components = type.vecsize;\n\t\tuint32_t num_components = location_meta->num_components;\n\n\t\tif (pad_fragment_output)\n\t\t{\n\t\t\tuint32_t locn = get_decoration(var.self, DecorationLocation);\n\t\t\tnum_components = max<uint32_t>(num_components, get_target_components_for_fragment_location(locn));\n\t\t}\n\n\t\t// We have already declared an IO block member as m_location_N.\n\t\t// Just emit an early-declared variable and fixup as needed.\n\t\t// Arrays need to be unrolled here since each location might need a different number of components.\n\t\tentry_func.add_local_variable(var.self);\n\t\tvars_needing_early_declaration.push_back(var.self);\n\n\t\tif (var.storage == StorageClassInput)\n\t\t{\n\t\t\tentry_func.fixup_hooks_in.push_back([=, &type, &var]() {\n\t\t\t\tif (!type.array.empty())\n\t\t\t\t{\n\t\t\t\t\tuint32_t array_size = to_array_size_literal(type);\n\t\t\t\t\tfor (uint32_t loc_off = 0; loc_off < array_size; loc_off++)\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(to_name(var.self), \"[\", loc_off, \"]\", \" = \", ib_var_ref,\n\t\t\t\t\t\t          \".m_location_\", location + loc_off,\n\t\t\t\t\t\t          vector_swizzle(type_components, start_component), \";\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tstatement(to_name(var.self), \" = \", ib_var_ref, \".m_location_\", location,\n\t\t\t\t\t          vector_swizzle(type_components, start_component), \";\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tentry_func.fixup_hooks_out.push_back([=, &type, &var]() {\n\t\t\t\tif (!type.array.empty())\n\t\t\t\t{\n\t\t\t\t\tuint32_t array_size = to_array_size_literal(type);\n\t\t\t\t\tfor (uint32_t loc_off = 0; loc_off < array_size; loc_off++)\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(ib_var_ref, \".m_location_\", location + loc_off,\n\t\t\t\t\t\t          vector_swizzle(type_components, start_component), \" = \",\n\t\t\t\t\t\t          to_name(var.self), \"[\", loc_off, \"];\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tstatement(ib_var_ref, \".m_location_\", location,\n\t\t\t\t\t          vector_swizzle(type_components, start_component), \" = \", to_name(var.self), \";\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn true;\n\t}\n\telse\n\t\treturn false;\n}\n\nvoid CompilerMSL::add_plain_variable_to_interface_block(StorageClass storage, const string &ib_var_ref,\n                                                        SPIRType &ib_type, SPIRVariable &var, InterfaceBlockMeta &meta)\n{\n\tbool is_builtin = is_builtin_variable(var);\n\tBuiltIn builtin = BuiltIn(get_decoration(var.self, DecorationBuiltIn));\n\tbool is_flat = has_decoration(var.self, DecorationFlat);\n\tbool is_noperspective = has_decoration(var.self, DecorationNoPerspective);\n\tbool is_centroid = has_decoration(var.self, DecorationCentroid);\n\tbool is_sample = has_decoration(var.self, DecorationSample);\n\n\t// Add a reference to the variable type to the interface struct.\n\tuint32_t ib_mbr_idx = uint32_t(ib_type.member_types.size());\n\tuint32_t type_id = ensure_correct_builtin_type(var.basetype, builtin);\n\tvar.basetype = type_id;\n\n\ttype_id = get_pointee_type_id(var.basetype);\n\tif (meta.strip_array && is_array(get<SPIRType>(type_id)))\n\t\ttype_id = get<SPIRType>(type_id).parent_type;\n\tauto &type = get<SPIRType>(type_id);\n\tuint32_t target_components = 0;\n\tuint32_t type_components = type.vecsize;\n\n\tbool padded_output = false;\n\tbool padded_input = false;\n\tuint32_t start_component = 0;\n\n\tauto &entry_func = get<SPIRFunction>(ir.default_entry_point);\n\n\tif (add_component_variable_to_interface_block(storage, ib_var_ref, var, type, meta))\n\t\treturn;\n\n\tbool pad_fragment_output = has_decoration(var.self, DecorationLocation) &&\n\t                           msl_options.pad_fragment_output_components &&\n\t                           get_entry_point().model == ExecutionModelFragment && storage == StorageClassOutput;\n\n\tif (pad_fragment_output)\n\t{\n\t\tuint32_t locn = get_decoration(var.self, DecorationLocation);\n\t\ttarget_components = get_target_components_for_fragment_location(locn);\n\t\tif (type_components < target_components)\n\t\t{\n\t\t\t// Make a new type here.\n\t\t\ttype_id = build_extended_vector_type(type_id, target_components);\n\t\t\tpadded_output = true;\n\t\t}\n\t}\n\n\tif (storage == StorageClassInput && pull_model_inputs.count(var.self))\n\t\tib_type.member_types.push_back(build_msl_interpolant_type(type_id, is_noperspective));\n\telse\n\t\tib_type.member_types.push_back(type_id);\n\n\t// Give the member a name\n\tstring mbr_name = ensure_valid_name(to_expression(var.self), \"m\");\n\tset_member_name(ib_type.self, ib_mbr_idx, mbr_name);\n\n\t// Update the original variable reference to include the structure reference\n\tstring qual_var_name = ib_var_ref + \".\" + mbr_name;\n\t// If using pull-model interpolation, need to add a call to the correct interpolation method.\n\tif (storage == StorageClassInput && pull_model_inputs.count(var.self))\n\t{\n\t\tif (is_centroid)\n\t\t\tqual_var_name += \".interpolate_at_centroid()\";\n\t\telse if (is_sample)\n\t\t\tqual_var_name += join(\".interpolate_at_sample(\", to_expression(builtin_sample_id_id), \")\");\n\t\telse\n\t\t\tqual_var_name += \".interpolate_at_center()\";\n\t}\n\n\tif (padded_output || padded_input)\n\t{\n\t\tentry_func.add_local_variable(var.self);\n\t\tvars_needing_early_declaration.push_back(var.self);\n\n\t\tif (padded_output)\n\t\t{\n\t\t\tentry_func.fixup_hooks_out.push_back([=, &var]() {\n\t\t\t\tstatement(qual_var_name, vector_swizzle(type_components, start_component), \" = \", to_name(var.self),\n\t\t\t\t          \";\");\n\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tentry_func.fixup_hooks_in.push_back([=, &var]() {\n\t\t\t\tstatement(to_name(var.self), \" = \", qual_var_name, vector_swizzle(type_components, start_component),\n\t\t\t\t          \";\");\n\t\t\t});\n\t\t}\n\t}\n\telse if (!meta.strip_array)\n\t\tir.meta[var.self].decoration.qualified_alias = qual_var_name;\n\n\tif (var.storage == StorageClassOutput && var.initializer != ID(0))\n\t{\n\t\tif (padded_output || padded_input)\n\t\t{\n\t\t\tentry_func.fixup_hooks_in.push_back(\n\t\t\t    [=, &var]() { statement(to_name(var.self), \" = \", to_expression(var.initializer), \";\"); });\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (meta.strip_array)\n\t\t\t{\n\t\t\t\tentry_func.fixup_hooks_in.push_back([=, &var]() {\n\t\t\t\t\tuint32_t index = get_extended_decoration(var.self, SPIRVCrossDecorationInterfaceMemberIndex);\n\t\t\t\t\tauto invocation = to_tesc_invocation_id();\n\t\t\t\t\tstatement(to_expression(stage_out_ptr_var_id), \"[\",\n\t\t\t\t\t          invocation, \"].\",\n\t\t\t\t\t          to_member_name(ib_type, index), \" = \", to_expression(var.initializer), \"[\",\n\t\t\t\t\t          invocation, \"];\");\n\t\t\t\t});\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tentry_func.fixup_hooks_in.push_back([=, &var]() {\n\t\t\t\t\tstatement(qual_var_name, \" = \", to_expression(var.initializer), \";\");\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Copy the variable location from the original variable to the member\n\tif (get_decoration_bitset(var.self).get(DecorationLocation))\n\t{\n\t\tuint32_t locn = get_decoration(var.self, DecorationLocation);\n\t\tuint32_t comp = get_decoration(var.self, DecorationComponent);\n\t\tif (storage == StorageClassInput)\n\t\t{\n\t\t\ttype_id = ensure_correct_input_type(var.basetype, locn, comp, 0, meta.strip_array);\n\t\t\tvar.basetype = type_id;\n\n\t\t\ttype_id = get_pointee_type_id(type_id);\n\t\t\tif (meta.strip_array && is_array(get<SPIRType>(type_id)))\n\t\t\t\ttype_id = get<SPIRType>(type_id).parent_type;\n\t\t\tif (pull_model_inputs.count(var.self))\n\t\t\t\tib_type.member_types[ib_mbr_idx] = build_msl_interpolant_type(type_id, is_noperspective);\n\t\t\telse\n\t\t\t\tib_type.member_types[ib_mbr_idx] = type_id;\n\t\t}\n\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, locn);\n\t\tif (comp)\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationComponent, comp);\n\t\tmark_location_as_used_by_shader(locn, get<SPIRType>(type_id), storage);\n\t}\n\telse if (is_builtin && is_tessellation_shader() && storage == StorageClassInput && inputs_by_builtin.count(builtin))\n\t{\n\t\tuint32_t locn = inputs_by_builtin[builtin].location;\n\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, locn);\n\t\tmark_location_as_used_by_shader(locn, type, storage);\n\t}\n\telse if (is_builtin && capture_output_to_buffer && storage == StorageClassOutput && outputs_by_builtin.count(builtin))\n\t{\n\t\tuint32_t locn = outputs_by_builtin[builtin].location;\n\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, locn);\n\t\tmark_location_as_used_by_shader(locn, type, storage);\n\t}\n\n\tif (get_decoration_bitset(var.self).get(DecorationComponent))\n\t{\n\t\tuint32_t component = get_decoration(var.self, DecorationComponent);\n\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationComponent, component);\n\t}\n\n\tif (get_decoration_bitset(var.self).get(DecorationIndex))\n\t{\n\t\tuint32_t index = get_decoration(var.self, DecorationIndex);\n\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationIndex, index);\n\t}\n\n\t// Mark the member as builtin if needed\n\tif (is_builtin)\n\t{\n\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationBuiltIn, builtin);\n\t\tif (builtin == BuiltInPosition && storage == StorageClassOutput)\n\t\t\tqual_pos_var_name = qual_var_name;\n\t}\n\n\t// Copy interpolation decorations if needed\n\tif (storage != StorageClassInput || !pull_model_inputs.count(var.self))\n\t{\n\t\tif (is_flat)\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationFlat);\n\t\tif (is_noperspective)\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationNoPerspective);\n\t\tif (is_centroid)\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationCentroid);\n\t\tif (is_sample)\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationSample);\n\t}\n\n\tset_extended_member_decoration(ib_type.self, ib_mbr_idx, SPIRVCrossDecorationInterfaceOrigID, var.self);\n}\n\nvoid CompilerMSL::add_composite_variable_to_interface_block(StorageClass storage, const string &ib_var_ref,\n                                                            SPIRType &ib_type, SPIRVariable &var,\n                                                            InterfaceBlockMeta &meta)\n{\n\tauto &entry_func = get<SPIRFunction>(ir.default_entry_point);\n\tauto &var_type = meta.strip_array ? get_variable_element_type(var) : get_variable_data_type(var);\n\tuint32_t elem_cnt = 0;\n\n\tif (add_component_variable_to_interface_block(storage, ib_var_ref, var, var_type, meta))\n\t\treturn;\n\n\tif (is_matrix(var_type))\n\t{\n\t\tif (is_array(var_type))\n\t\t\tSPIRV_CROSS_THROW(\"MSL cannot emit arrays-of-matrices in input and output variables.\");\n\n\t\telem_cnt = var_type.columns;\n\t}\n\telse if (is_array(var_type))\n\t{\n\t\tif (var_type.array.size() != 1)\n\t\t\tSPIRV_CROSS_THROW(\"MSL cannot emit arrays-of-arrays in input and output variables.\");\n\n\t\telem_cnt = to_array_size_literal(var_type);\n\t}\n\n\tbool is_builtin = is_builtin_variable(var);\n\tBuiltIn builtin = BuiltIn(get_decoration(var.self, DecorationBuiltIn));\n\tbool is_flat = has_decoration(var.self, DecorationFlat);\n\tbool is_noperspective = has_decoration(var.self, DecorationNoPerspective);\n\tbool is_centroid = has_decoration(var.self, DecorationCentroid);\n\tbool is_sample = has_decoration(var.self, DecorationSample);\n\n\tauto *usable_type = &var_type;\n\tif (usable_type->pointer)\n\t\tusable_type = &get<SPIRType>(usable_type->parent_type);\n\twhile (is_array(*usable_type) || is_matrix(*usable_type))\n\t\tusable_type = &get<SPIRType>(usable_type->parent_type);\n\n\t// If a builtin, force it to have the proper name.\n\tif (is_builtin)\n\t\tset_name(var.self, builtin_to_glsl(builtin, StorageClassFunction));\n\n\tbool flatten_from_ib_var = false;\n\tstring flatten_from_ib_mbr_name;\n\n\tif (storage == StorageClassOutput && is_builtin && builtin == BuiltInClipDistance)\n\t{\n\t\t// Also declare [[clip_distance]] attribute here.\n\t\tuint32_t clip_array_mbr_idx = uint32_t(ib_type.member_types.size());\n\t\tib_type.member_types.push_back(get_variable_data_type_id(var));\n\t\tset_member_decoration(ib_type.self, clip_array_mbr_idx, DecorationBuiltIn, BuiltInClipDistance);\n\n\t\tflatten_from_ib_mbr_name = builtin_to_glsl(BuiltInClipDistance, StorageClassOutput);\n\t\tset_member_name(ib_type.self, clip_array_mbr_idx, flatten_from_ib_mbr_name);\n\n\t\t// When we flatten, we flatten directly from the \"out\" struct,\n\t\t// not from a function variable.\n\t\tflatten_from_ib_var = true;\n\n\t\tif (!msl_options.enable_clip_distance_user_varying)\n\t\t\treturn;\n\t}\n\telse if (!meta.strip_array)\n\t{\n\t\t// Only flatten/unflatten IO composites for non-tessellation cases where arrays are not stripped.\n\t\tentry_func.add_local_variable(var.self);\n\t\t// We need to declare the variable early and at entry-point scope.\n\t\tvars_needing_early_declaration.push_back(var.self);\n\t}\n\n\tfor (uint32_t i = 0; i < elem_cnt; i++)\n\t{\n\t\t// Add a reference to the variable type to the interface struct.\n\t\tuint32_t ib_mbr_idx = uint32_t(ib_type.member_types.size());\n\n\t\tuint32_t target_components = 0;\n\t\tbool padded_output = false;\n\t\tuint32_t type_id = usable_type->self;\n\n\t\t// Check if we need to pad fragment output to match a certain number of components.\n\t\tif (get_decoration_bitset(var.self).get(DecorationLocation) && msl_options.pad_fragment_output_components &&\n\t\t    get_entry_point().model == ExecutionModelFragment && storage == StorageClassOutput)\n\t\t{\n\t\t\tuint32_t locn = get_decoration(var.self, DecorationLocation) + i;\n\t\t\ttarget_components = get_target_components_for_fragment_location(locn);\n\t\t\tif (usable_type->vecsize < target_components)\n\t\t\t{\n\t\t\t\t// Make a new type here.\n\t\t\t\ttype_id = build_extended_vector_type(usable_type->self, target_components);\n\t\t\t\tpadded_output = true;\n\t\t\t}\n\t\t}\n\n\t\tif (storage == StorageClassInput && pull_model_inputs.count(var.self))\n\t\t\tib_type.member_types.push_back(build_msl_interpolant_type(get_pointee_type_id(type_id), is_noperspective));\n\t\telse\n\t\t\tib_type.member_types.push_back(get_pointee_type_id(type_id));\n\n\t\t// Give the member a name\n\t\tstring mbr_name = ensure_valid_name(join(to_expression(var.self), \"_\", i), \"m\");\n\t\tset_member_name(ib_type.self, ib_mbr_idx, mbr_name);\n\n\t\t// There is no qualified alias since we need to flatten the internal array on return.\n\t\tif (get_decoration_bitset(var.self).get(DecorationLocation))\n\t\t{\n\t\t\tuint32_t locn = get_decoration(var.self, DecorationLocation) + i;\n\t\t\tuint32_t comp = get_decoration(var.self, DecorationComponent);\n\t\t\tif (storage == StorageClassInput)\n\t\t\t{\n\t\t\t\tvar.basetype = ensure_correct_input_type(var.basetype, locn, comp, 0, meta.strip_array);\n\t\t\t\tuint32_t mbr_type_id = ensure_correct_input_type(usable_type->self, locn, comp, 0, meta.strip_array);\n\t\t\t\tif (storage == StorageClassInput && pull_model_inputs.count(var.self))\n\t\t\t\t\tib_type.member_types[ib_mbr_idx] = build_msl_interpolant_type(mbr_type_id, is_noperspective);\n\t\t\t\telse\n\t\t\t\t\tib_type.member_types[ib_mbr_idx] = mbr_type_id;\n\t\t\t}\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, locn);\n\t\t\tif (comp)\n\t\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationComponent, comp);\n\t\t\tmark_location_as_used_by_shader(locn, *usable_type, storage);\n\t\t}\n\t\telse if (is_builtin && is_tessellation_shader() && storage == StorageClassInput && inputs_by_builtin.count(builtin))\n\t\t{\n\t\t\tuint32_t locn = inputs_by_builtin[builtin].location + i;\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, locn);\n\t\t\tmark_location_as_used_by_shader(locn, *usable_type, storage);\n\t\t}\n\t\telse if (is_builtin && capture_output_to_buffer && storage == StorageClassOutput && outputs_by_builtin.count(builtin))\n\t\t{\n\t\t\tuint32_t locn = outputs_by_builtin[builtin].location + i;\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, locn);\n\t\t\tmark_location_as_used_by_shader(locn, *usable_type, storage);\n\t\t}\n\t\telse if (is_builtin && (builtin == BuiltInClipDistance || builtin == BuiltInCullDistance))\n\t\t{\n\t\t\t// Declare the Clip/CullDistance as [[user(clip/cullN)]].\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationBuiltIn, builtin);\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationIndex, i);\n\t\t}\n\n\t\tif (get_decoration_bitset(var.self).get(DecorationIndex))\n\t\t{\n\t\t\tuint32_t index = get_decoration(var.self, DecorationIndex);\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationIndex, index);\n\t\t}\n\n\t\tif (storage != StorageClassInput || !pull_model_inputs.count(var.self))\n\t\t{\n\t\t\t// Copy interpolation decorations if needed\n\t\t\tif (is_flat)\n\t\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationFlat);\n\t\t\tif (is_noperspective)\n\t\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationNoPerspective);\n\t\t\tif (is_centroid)\n\t\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationCentroid);\n\t\t\tif (is_sample)\n\t\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationSample);\n\t\t}\n\n\t\tset_extended_member_decoration(ib_type.self, ib_mbr_idx, SPIRVCrossDecorationInterfaceOrigID, var.self);\n\n\t\t// Only flatten/unflatten IO composites for non-tessellation cases where arrays are not stripped.\n\t\tif (!meta.strip_array)\n\t\t{\n\t\t\tswitch (storage)\n\t\t\t{\n\t\t\tcase StorageClassInput:\n\t\t\t\tentry_func.fixup_hooks_in.push_back([=, &var]() {\n\t\t\t\t\tif (pull_model_inputs.count(var.self))\n\t\t\t\t\t{\n\t\t\t\t\t\tstring lerp_call;\n\t\t\t\t\t\tif (is_centroid)\n\t\t\t\t\t\t\tlerp_call = \".interpolate_at_centroid()\";\n\t\t\t\t\t\telse if (is_sample)\n\t\t\t\t\t\t\tlerp_call = join(\".interpolate_at_sample(\", to_expression(builtin_sample_id_id), \")\");\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tlerp_call = \".interpolate_at_center()\";\n\t\t\t\t\t\tstatement(to_name(var.self), \"[\", i, \"] = \", ib_var_ref, \".\", mbr_name, lerp_call, \";\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(to_name(var.self), \"[\", i, \"] = \", ib_var_ref, \".\", mbr_name, \";\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tcase StorageClassOutput:\n\t\t\t\tentry_func.fixup_hooks_out.push_back([=, &var]() {\n\t\t\t\t\tif (padded_output)\n\t\t\t\t\t{\n\t\t\t\t\t\tauto &padded_type = this->get<SPIRType>(type_id);\n\t\t\t\t\t\tstatement(\n\t\t\t\t\t\t    ib_var_ref, \".\", mbr_name, \" = \",\n\t\t\t\t\t\t    remap_swizzle(padded_type, usable_type->vecsize, join(to_name(var.self), \"[\", i, \"]\")),\n\t\t\t\t\t\t    \";\");\n\t\t\t\t\t}\n\t\t\t\t\telse if (flatten_from_ib_var)\n\t\t\t\t\t\tstatement(ib_var_ref, \".\", mbr_name, \" = \", ib_var_ref, \".\", flatten_from_ib_mbr_name, \"[\", i,\n\t\t\t\t\t\t          \"];\");\n\t\t\t\t\telse\n\t\t\t\t\t\tstatement(ib_var_ref, \".\", mbr_name, \" = \", to_name(var.self), \"[\", i, \"];\");\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid CompilerMSL::add_composite_member_variable_to_interface_block(StorageClass storage,\n                                                                   const string &ib_var_ref, SPIRType &ib_type,\n                                                                   SPIRVariable &var, SPIRType &var_type,\n                                                                   uint32_t mbr_idx, InterfaceBlockMeta &meta,\n                                                                   const string &mbr_name_qual,\n                                                                   const string &var_chain_qual,\n                                                                   uint32_t &location, uint32_t &var_mbr_idx)\n{\n\tauto &entry_func = get<SPIRFunction>(ir.default_entry_point);\n\n\tBuiltIn builtin = BuiltInMax;\n\tbool is_builtin = is_member_builtin(var_type, mbr_idx, &builtin);\n\tbool is_flat =\n\t    has_member_decoration(var_type.self, mbr_idx, DecorationFlat) || has_decoration(var.self, DecorationFlat);\n\tbool is_noperspective = has_member_decoration(var_type.self, mbr_idx, DecorationNoPerspective) ||\n\t                        has_decoration(var.self, DecorationNoPerspective);\n\tbool is_centroid = has_member_decoration(var_type.self, mbr_idx, DecorationCentroid) ||\n\t                   has_decoration(var.self, DecorationCentroid);\n\tbool is_sample =\n\t    has_member_decoration(var_type.self, mbr_idx, DecorationSample) || has_decoration(var.self, DecorationSample);\n\n\tuint32_t mbr_type_id = var_type.member_types[mbr_idx];\n\tauto &mbr_type = get<SPIRType>(mbr_type_id);\n\n\tbool mbr_is_indexable = false;\n\tuint32_t elem_cnt = 1;\n\tif (is_matrix(mbr_type))\n\t{\n\t\tif (is_array(mbr_type))\n\t\t\tSPIRV_CROSS_THROW(\"MSL cannot emit arrays-of-matrices in input and output variables.\");\n\n\t\tmbr_is_indexable = true;\n\t\telem_cnt = mbr_type.columns;\n\t}\n\telse if (is_array(mbr_type))\n\t{\n\t\tif (mbr_type.array.size() != 1)\n\t\t\tSPIRV_CROSS_THROW(\"MSL cannot emit arrays-of-arrays in input and output variables.\");\n\n\t\tmbr_is_indexable = true;\n\t\telem_cnt = to_array_size_literal(mbr_type);\n\t}\n\n\tauto *usable_type = &mbr_type;\n\tif (usable_type->pointer)\n\t\tusable_type = &get<SPIRType>(usable_type->parent_type);\n\twhile (is_array(*usable_type) || is_matrix(*usable_type))\n\t\tusable_type = &get<SPIRType>(usable_type->parent_type);\n\n\tbool flatten_from_ib_var = false;\n\tstring flatten_from_ib_mbr_name;\n\n\tif (storage == StorageClassOutput && is_builtin && builtin == BuiltInClipDistance)\n\t{\n\t\t// Also declare [[clip_distance]] attribute here.\n\t\tuint32_t clip_array_mbr_idx = uint32_t(ib_type.member_types.size());\n\t\tib_type.member_types.push_back(mbr_type_id);\n\t\tset_member_decoration(ib_type.self, clip_array_mbr_idx, DecorationBuiltIn, BuiltInClipDistance);\n\n\t\tflatten_from_ib_mbr_name = builtin_to_glsl(BuiltInClipDistance, StorageClassOutput);\n\t\tset_member_name(ib_type.self, clip_array_mbr_idx, flatten_from_ib_mbr_name);\n\n\t\t// When we flatten, we flatten directly from the \"out\" struct,\n\t\t// not from a function variable.\n\t\tflatten_from_ib_var = true;\n\n\t\tif (!msl_options.enable_clip_distance_user_varying)\n\t\t\treturn;\n\t}\n\n\t// Recursively handle nested structures.\n\tif (mbr_type.basetype == SPIRType::Struct)\n\t{\n\t\tfor (uint32_t i = 0; i < elem_cnt; i++)\n\t\t{\n\t\t\tstring mbr_name = append_member_name(mbr_name_qual, var_type, mbr_idx) + (mbr_is_indexable ? join(\"_\", i) : \"\");\n\t\t\tstring var_chain = join(var_chain_qual, \".\", to_member_name(var_type, mbr_idx), (mbr_is_indexable ? join(\"[\", i, \"]\") : \"\"));\n\t\t\tuint32_t sub_mbr_cnt = uint32_t(mbr_type.member_types.size());\n\t\t\tfor (uint32_t sub_mbr_idx = 0; sub_mbr_idx < sub_mbr_cnt; sub_mbr_idx++)\n\t\t\t{\n\t\t\t\tadd_composite_member_variable_to_interface_block(storage, ib_var_ref, ib_type,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t var, mbr_type, sub_mbr_idx,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t meta, mbr_name, var_chain,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t location, var_mbr_idx);\n\t\t\t\t// FIXME: Recursive structs and tessellation breaks here.\n\t\t\t\tvar_mbr_idx++;\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\n\tfor (uint32_t i = 0; i < elem_cnt; i++)\n\t{\n\t\t// Add a reference to the variable type to the interface struct.\n\t\tuint32_t ib_mbr_idx = uint32_t(ib_type.member_types.size());\n\t\tif (storage == StorageClassInput && pull_model_inputs.count(var.self))\n\t\t\tib_type.member_types.push_back(build_msl_interpolant_type(usable_type->self, is_noperspective));\n\t\telse\n\t\t\tib_type.member_types.push_back(usable_type->self);\n\n\t\t// Give the member a name\n\t\tstring mbr_name = ensure_valid_name(append_member_name(mbr_name_qual, var_type, mbr_idx) + (mbr_is_indexable ? join(\"_\", i) : \"\"), \"m\");\n\t\tset_member_name(ib_type.self, ib_mbr_idx, mbr_name);\n\n\t\t// Once we determine the location of the first member within nested structures,\n\t\t// from a var of the topmost structure, the remaining flattened members of\n\t\t// the nested structures will have consecutive location values. At this point,\n\t\t// we've recursively tunnelled into structs, arrays, and matrices, and are\n\t\t// down to a single location for each member now.\n\t\tif (!is_builtin && location != UINT32_MAX)\n\t\t{\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, location);\n\t\t\tmark_location_as_used_by_shader(location, *usable_type, storage);\n\t\t\tlocation++;\n\t\t}\n\t\telse if (has_member_decoration(var_type.self, mbr_idx, DecorationLocation))\n\t\t{\n\t\t\tlocation = get_member_decoration(var_type.self, mbr_idx, DecorationLocation) + i;\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, location);\n\t\t\tmark_location_as_used_by_shader(location, *usable_type, storage);\n\t\t\tlocation++;\n\t\t}\n\t\telse if (has_decoration(var.self, DecorationLocation))\n\t\t{\n\t\t\tlocation = get_accumulated_member_location(var, mbr_idx, meta.strip_array) + i;\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, location);\n\t\t\tmark_location_as_used_by_shader(location, *usable_type, storage);\n\t\t\tlocation++;\n\t\t}\n\t\telse if (is_builtin && is_tessellation_shader() && storage == StorageClassInput && inputs_by_builtin.count(builtin))\n\t\t{\n\t\t\tlocation = inputs_by_builtin[builtin].location + i;\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, location);\n\t\t\tmark_location_as_used_by_shader(location, *usable_type, storage);\n\t\t\tlocation++;\n\t\t}\n\t\telse if (is_builtin && capture_output_to_buffer && storage == StorageClassOutput && outputs_by_builtin.count(builtin))\n\t\t{\n\t\t\tlocation = outputs_by_builtin[builtin].location + i;\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, location);\n\t\t\tmark_location_as_used_by_shader(location, *usable_type, storage);\n\t\t\tlocation++;\n\t\t}\n\t\telse if (is_builtin && (builtin == BuiltInClipDistance || builtin == BuiltInCullDistance))\n\t\t{\n\t\t\t// Declare the Clip/CullDistance as [[user(clip/cullN)]].\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationBuiltIn, builtin);\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationIndex, i);\n\t\t}\n\n\t\tif (has_member_decoration(var_type.self, mbr_idx, DecorationComponent))\n\t\t\tSPIRV_CROSS_THROW(\"DecorationComponent on matrices and arrays is not supported.\");\n\n\t\tif (storage != StorageClassInput || !pull_model_inputs.count(var.self))\n\t\t{\n\t\t\t// Copy interpolation decorations if needed\n\t\t\tif (is_flat)\n\t\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationFlat);\n\t\t\tif (is_noperspective)\n\t\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationNoPerspective);\n\t\t\tif (is_centroid)\n\t\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationCentroid);\n\t\t\tif (is_sample)\n\t\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationSample);\n\t\t}\n\n\t\tset_extended_member_decoration(ib_type.self, ib_mbr_idx, SPIRVCrossDecorationInterfaceOrigID, var.self);\n\t\tset_extended_member_decoration(ib_type.self, ib_mbr_idx, SPIRVCrossDecorationInterfaceMemberIndex, var_mbr_idx);\n\n\t\t// Unflatten or flatten from [[stage_in]] or [[stage_out]] as appropriate.\n\t\tif (!meta.strip_array && meta.allow_local_declaration)\n\t\t{\n\t\t\tstring var_chain = join(var_chain_qual, \".\", to_member_name(var_type, mbr_idx), (mbr_is_indexable ? join(\"[\", i, \"]\") : \"\"));\n\t\t\tswitch (storage)\n\t\t\t{\n\t\t\tcase StorageClassInput:\n\t\t\t\tentry_func.fixup_hooks_in.push_back([=, &var]() {\n\t\t\t\t\tstring lerp_call;\n\t\t\t\t\tif (pull_model_inputs.count(var.self))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (is_centroid)\n\t\t\t\t\t\t\tlerp_call = \".interpolate_at_centroid()\";\n\t\t\t\t\t\telse if (is_sample)\n\t\t\t\t\t\t\tlerp_call = join(\".interpolate_at_sample(\", to_expression(builtin_sample_id_id), \")\");\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tlerp_call = \".interpolate_at_center()\";\n\t\t\t\t\t}\n\t\t\t\t\tstatement(var_chain, \" = \", ib_var_ref, \".\", mbr_name, lerp_call, \";\");\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tcase StorageClassOutput:\n\t\t\t\tentry_func.fixup_hooks_out.push_back([=]() {\n\t\t\t\t\tif (flatten_from_ib_var)\n\t\t\t\t\t\tstatement(ib_var_ref, \".\", mbr_name, \" = \", ib_var_ref, \".\", flatten_from_ib_mbr_name, \"[\", i, \"];\");\n\t\t\t\t\telse\n\t\t\t\t\t\tstatement(ib_var_ref, \".\", mbr_name, \" = \", var_chain, \";\");\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid CompilerMSL::add_plain_member_variable_to_interface_block(StorageClass storage,\n                                                               const string &ib_var_ref, SPIRType &ib_type,\n                                                               SPIRVariable &var, SPIRType &var_type,\n                                                               uint32_t mbr_idx, InterfaceBlockMeta &meta,\n                                                               const string &mbr_name_qual,\n                                                               const string &var_chain_qual,\n                                                               uint32_t &location, uint32_t &var_mbr_idx)\n{\n\tauto &entry_func = get<SPIRFunction>(ir.default_entry_point);\n\n\tBuiltIn builtin = BuiltInMax;\n\tbool is_builtin = is_member_builtin(var_type, mbr_idx, &builtin);\n\tbool is_flat =\n\t    has_member_decoration(var_type.self, mbr_idx, DecorationFlat) || has_decoration(var.self, DecorationFlat);\n\tbool is_noperspective = has_member_decoration(var_type.self, mbr_idx, DecorationNoPerspective) ||\n\t                        has_decoration(var.self, DecorationNoPerspective);\n\tbool is_centroid = has_member_decoration(var_type.self, mbr_idx, DecorationCentroid) ||\n\t                   has_decoration(var.self, DecorationCentroid);\n\tbool is_sample =\n\t    has_member_decoration(var_type.self, mbr_idx, DecorationSample) || has_decoration(var.self, DecorationSample);\n\n\t// Add a reference to the member to the interface struct.\n\tuint32_t mbr_type_id = var_type.member_types[mbr_idx];\n\tuint32_t ib_mbr_idx = uint32_t(ib_type.member_types.size());\n\tmbr_type_id = ensure_correct_builtin_type(mbr_type_id, builtin);\n\tvar_type.member_types[mbr_idx] = mbr_type_id;\n\tif (storage == StorageClassInput && pull_model_inputs.count(var.self))\n\t\tib_type.member_types.push_back(build_msl_interpolant_type(mbr_type_id, is_noperspective));\n\telse\n\t\tib_type.member_types.push_back(mbr_type_id);\n\n\t// Give the member a name\n\tstring mbr_name = ensure_valid_name(append_member_name(mbr_name_qual, var_type, mbr_idx), \"m\");\n\tset_member_name(ib_type.self, ib_mbr_idx, mbr_name);\n\n\t// Update the original variable reference to include the structure reference\n\tstring qual_var_name = ib_var_ref + \".\" + mbr_name;\n\t// If using pull-model interpolation, need to add a call to the correct interpolation method.\n\tif (storage == StorageClassInput && pull_model_inputs.count(var.self))\n\t{\n\t\tif (is_centroid)\n\t\t\tqual_var_name += \".interpolate_at_centroid()\";\n\t\telse if (is_sample)\n\t\t\tqual_var_name += join(\".interpolate_at_sample(\", to_expression(builtin_sample_id_id), \")\");\n\t\telse\n\t\t\tqual_var_name += \".interpolate_at_center()\";\n\t}\n\n\tbool flatten_stage_out = false;\n\tstring var_chain = var_chain_qual + \".\" + to_member_name(var_type, mbr_idx);\n\tif (is_builtin && !meta.strip_array)\n\t{\n\t\t// For the builtin gl_PerVertex, we cannot treat it as a block anyways,\n\t\t// so redirect to qualified name.\n\t\tset_member_qualified_name(var_type.self, mbr_idx, qual_var_name);\n\t}\n\telse if (!meta.strip_array && meta.allow_local_declaration)\n\t{\n\t\t// Unflatten or flatten from [[stage_in]] or [[stage_out]] as appropriate.\n\t\tswitch (storage)\n\t\t{\n\t\tcase StorageClassInput:\n\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\tstatement(var_chain, \" = \", qual_var_name, \";\");\n\t\t\t});\n\t\t\tbreak;\n\n\t\tcase StorageClassOutput:\n\t\t\tflatten_stage_out = true;\n\t\t\tentry_func.fixup_hooks_out.push_back([=]() {\n\t\t\t\tstatement(qual_var_name, \" = \", var_chain, \";\");\n\t\t\t});\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Once we determine the location of the first member within nested structures,\n\t// from a var of the topmost structure, the remaining flattened members of\n\t// the nested structures will have consecutive location values. At this point,\n\t// we've recursively tunnelled into structs, arrays, and matrices, and are\n\t// down to a single location for each member now.\n\tif (!is_builtin && location != UINT32_MAX)\n\t{\n\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, location);\n\t\tmark_location_as_used_by_shader(location, get<SPIRType>(mbr_type_id), storage);\n\t\tlocation += type_to_location_count(get<SPIRType>(mbr_type_id));\n\t}\n\telse if (has_member_decoration(var_type.self, mbr_idx, DecorationLocation))\n\t{\n\t\tlocation = get_member_decoration(var_type.self, mbr_idx, DecorationLocation);\n\t\tuint32_t comp = get_member_decoration(var_type.self, mbr_idx, DecorationComponent);\n\t\tif (storage == StorageClassInput)\n\t\t{\n\t\t\tmbr_type_id = ensure_correct_input_type(mbr_type_id, location, comp, 0, meta.strip_array);\n\t\t\tvar_type.member_types[mbr_idx] = mbr_type_id;\n\t\t\tif (storage == StorageClassInput && pull_model_inputs.count(var.self))\n\t\t\t\tib_type.member_types[ib_mbr_idx] = build_msl_interpolant_type(mbr_type_id, is_noperspective);\n\t\t\telse\n\t\t\t\tib_type.member_types[ib_mbr_idx] = mbr_type_id;\n\t\t}\n\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, location);\n\t\tmark_location_as_used_by_shader(location, get<SPIRType>(mbr_type_id), storage);\n\t\tlocation += type_to_location_count(get<SPIRType>(mbr_type_id));\n\t}\n\telse if (has_decoration(var.self, DecorationLocation))\n\t{\n\t\tlocation = get_accumulated_member_location(var, mbr_idx, meta.strip_array);\n\t\tif (storage == StorageClassInput)\n\t\t{\n\t\t\tmbr_type_id = ensure_correct_input_type(mbr_type_id, location, 0, 0, meta.strip_array);\n\t\t\tvar_type.member_types[mbr_idx] = mbr_type_id;\n\t\t\tif (storage == StorageClassInput && pull_model_inputs.count(var.self))\n\t\t\t\tib_type.member_types[ib_mbr_idx] = build_msl_interpolant_type(mbr_type_id, is_noperspective);\n\t\t\telse\n\t\t\t\tib_type.member_types[ib_mbr_idx] = mbr_type_id;\n\t\t}\n\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, location);\n\t\tmark_location_as_used_by_shader(location, get<SPIRType>(mbr_type_id), storage);\n\t\tlocation += type_to_location_count(get<SPIRType>(mbr_type_id));\n\t}\n\telse if (is_builtin && is_tessellation_shader() && storage == StorageClassInput && inputs_by_builtin.count(builtin))\n\t{\n\t\tlocation = inputs_by_builtin[builtin].location;\n\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, location);\n\t\tmark_location_as_used_by_shader(location, get<SPIRType>(mbr_type_id), storage);\n\t\tlocation += type_to_location_count(get<SPIRType>(mbr_type_id));\n\t}\n\telse if (is_builtin && capture_output_to_buffer && storage == StorageClassOutput && outputs_by_builtin.count(builtin))\n\t{\n\t\tlocation = outputs_by_builtin[builtin].location;\n\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, location);\n\t\tmark_location_as_used_by_shader(location, get<SPIRType>(mbr_type_id), storage);\n\t\tlocation += type_to_location_count(get<SPIRType>(mbr_type_id));\n\t}\n\n\t// Copy the component location, if present.\n\tif (has_member_decoration(var_type.self, mbr_idx, DecorationComponent))\n\t{\n\t\tuint32_t comp = get_member_decoration(var_type.self, mbr_idx, DecorationComponent);\n\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationComponent, comp);\n\t}\n\n\t// Mark the member as builtin if needed\n\tif (is_builtin)\n\t{\n\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationBuiltIn, builtin);\n\t\tif (builtin == BuiltInPosition && storage == StorageClassOutput)\n\t\t\tqual_pos_var_name = qual_var_name;\n\t}\n\n\tconst SPIRConstant *c = nullptr;\n\tif (!flatten_stage_out && var.storage == StorageClassOutput &&\n\t    var.initializer != ID(0) && (c = maybe_get<SPIRConstant>(var.initializer)))\n\t{\n\t\tif (meta.strip_array)\n\t\t{\n\t\t\tentry_func.fixup_hooks_in.push_back([=, &var]() {\n\t\t\t\tauto &type = this->get<SPIRType>(var.basetype);\n\t\t\t\tuint32_t index = get_extended_member_decoration(var.self, mbr_idx, SPIRVCrossDecorationInterfaceMemberIndex);\n\n\t\t\t\tauto invocation = to_tesc_invocation_id();\n\t\t\t\tauto constant_chain = join(to_expression(var.initializer), \"[\", invocation, \"]\");\n\t\t\t\tstatement(to_expression(stage_out_ptr_var_id), \"[\",\n\t\t\t\t          invocation, \"].\",\n\t\t\t\t          to_member_name(ib_type, index), \" = \",\n\t\t\t\t          constant_chain, \".\", to_member_name(type, mbr_idx), \";\");\n\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\tstatement(qual_var_name, \" = \", constant_expression(\n\t\t\t\t\t\tthis->get<SPIRConstant>(c->subconstants[mbr_idx])), \";\");\n\t\t\t});\n\t\t}\n\t}\n\n\tif (storage != StorageClassInput || !pull_model_inputs.count(var.self))\n\t{\n\t\t// Copy interpolation decorations if needed\n\t\tif (is_flat)\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationFlat);\n\t\tif (is_noperspective)\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationNoPerspective);\n\t\tif (is_centroid)\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationCentroid);\n\t\tif (is_sample)\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationSample);\n\t}\n\n\tset_extended_member_decoration(ib_type.self, ib_mbr_idx, SPIRVCrossDecorationInterfaceOrigID, var.self);\n\tset_extended_member_decoration(ib_type.self, ib_mbr_idx, SPIRVCrossDecorationInterfaceMemberIndex, var_mbr_idx);\n}\n\n// In Metal, the tessellation levels are stored as tightly packed half-precision floating point values.\n// But, stage-in attribute offsets and strides must be multiples of four, so we can't pass the levels\n// individually. Therefore, we must pass them as vectors. Triangles get a single float4, with the outer\n// levels in 'xyz' and the inner level in 'w'. Quads get a float4 containing the outer levels and a\n// float2 containing the inner levels.\nvoid CompilerMSL::add_tess_level_input_to_interface_block(const std::string &ib_var_ref, SPIRType &ib_type,\n                                                          SPIRVariable &var)\n{\n\tauto &var_type = get_variable_element_type(var);\n\n\tBuiltIn builtin = BuiltIn(get_decoration(var.self, DecorationBuiltIn));\n\tbool triangles = is_tessellating_triangles();\n\tstring mbr_name;\n\n\t// Add a reference to the variable type to the interface struct.\n\tuint32_t ib_mbr_idx = uint32_t(ib_type.member_types.size());\n\n\tconst auto mark_locations = [&](const SPIRType &new_var_type) {\n\t\tif (get_decoration_bitset(var.self).get(DecorationLocation))\n\t\t{\n\t\t\tuint32_t locn = get_decoration(var.self, DecorationLocation);\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, locn);\n\t\t\tmark_location_as_used_by_shader(locn, new_var_type, StorageClassInput);\n\t\t}\n\t\telse if (inputs_by_builtin.count(builtin))\n\t\t{\n\t\t\tuint32_t locn = inputs_by_builtin[builtin].location;\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, locn);\n\t\t\tmark_location_as_used_by_shader(locn, new_var_type, StorageClassInput);\n\t\t}\n\t};\n\n\tif (triangles)\n\t{\n\t\t// Triangles are tricky, because we want only one member in the struct.\n\t\tmbr_name = \"gl_TessLevel\";\n\n\t\t// If we already added the other one, we can skip this step.\n\t\tif (!added_builtin_tess_level)\n\t\t{\n\t\t\tuint32_t type_id = build_extended_vector_type(var_type.self, 4);\n\n\t\t\tib_type.member_types.push_back(type_id);\n\n\t\t\t// Give the member a name\n\t\t\tset_member_name(ib_type.self, ib_mbr_idx, mbr_name);\n\n\t\t\t// We cannot decorate both, but the important part is that\n\t\t\t// it's marked as builtin so we can get automatic attribute assignment if needed.\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationBuiltIn, builtin);\n\n\t\t\tmark_locations(var_type);\n\t\t\tadded_builtin_tess_level = true;\n\t\t}\n\t}\n\telse\n\t{\n\t\tmbr_name = builtin_to_glsl(builtin, StorageClassFunction);\n\n\t\tuint32_t type_id = build_extended_vector_type(var_type.self, builtin == BuiltInTessLevelOuter ? 4 : 2);\n\n\t\tuint32_t ptr_type_id = ir.increase_bound_by(1);\n\t\tauto &new_var_type = set<SPIRType>(ptr_type_id, get<SPIRType>(type_id));\n\t\tnew_var_type.pointer = true;\n\t\tnew_var_type.pointer_depth++;\n\t\tnew_var_type.storage = StorageClassInput;\n\t\tnew_var_type.parent_type = type_id;\n\n\t\tib_type.member_types.push_back(type_id);\n\n\t\t// Give the member a name\n\t\tset_member_name(ib_type.self, ib_mbr_idx, mbr_name);\n\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationBuiltIn, builtin);\n\n\t\tmark_locations(new_var_type);\n\t}\n\n\tadd_tess_level_input(ib_var_ref, mbr_name, var);\n}\n\nvoid CompilerMSL::add_tess_level_input(const std::string &base_ref, const std::string &mbr_name, SPIRVariable &var)\n{\n\tauto &entry_func = get<SPIRFunction>(ir.default_entry_point);\n\tBuiltIn builtin = BuiltIn(get_decoration(var.self, DecorationBuiltIn));\n\n\t// Force the variable to have the proper name.\n\tstring var_name = builtin_to_glsl(builtin, StorageClassFunction);\n\tset_name(var.self, var_name);\n\n\t// We need to declare the variable early and at entry-point scope.\n\tentry_func.add_local_variable(var.self);\n\tvars_needing_early_declaration.push_back(var.self);\n\tbool triangles = is_tessellating_triangles();\n\n\tif (builtin == BuiltInTessLevelOuter)\n\t{\n\t\tentry_func.fixup_hooks_in.push_back(\n\t\t    [=]()\n\t\t    {\n\t\t\t    statement(var_name, \"[0] = \", base_ref, \".\", mbr_name, \"[0];\");\n\t\t\t    statement(var_name, \"[1] = \", base_ref, \".\", mbr_name, \"[1];\");\n\t\t\t    statement(var_name, \"[2] = \", base_ref, \".\", mbr_name, \"[2];\");\n\t\t\t    if (!triangles)\n\t\t\t\t    statement(var_name, \"[3] = \", base_ref, \".\", mbr_name, \"[3];\");\n\t\t    });\n\t}\n\telse\n\t{\n\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\tif (triangles)\n\t\t\t{\n\t\t\t\tif (msl_options.raw_buffer_tese_input)\n\t\t\t\t\tstatement(var_name, \"[0] = \", base_ref, \".\", mbr_name, \";\");\n\t\t\t\telse\n\t\t\t\t\tstatement(var_name, \"[0] = \", base_ref, \".\", mbr_name, \"[3];\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstatement(var_name, \"[0] = \", base_ref, \".\", mbr_name, \"[0];\");\n\t\t\t\tstatement(var_name, \"[1] = \", base_ref, \".\", mbr_name, \"[1];\");\n\t\t\t}\n\t\t});\n\t}\n}\n\nbool CompilerMSL::variable_storage_requires_stage_io(spv::StorageClass storage) const\n{\n\tif (storage == StorageClassOutput)\n\t\treturn !capture_output_to_buffer;\n\telse if (storage == StorageClassInput)\n\t\treturn !(is_tesc_shader() && msl_options.multi_patch_workgroup) &&\n\t\t       !(is_tese_shader() && msl_options.raw_buffer_tese_input);\n\telse\n\t\treturn false;\n}\n\nstring CompilerMSL::to_tesc_invocation_id()\n{\n\tif (msl_options.multi_patch_workgroup)\n\t{\n\t\t// n.b. builtin_invocation_id_id here is the dispatch global invocation ID,\n\t\t// not the TC invocation ID.\n\t\treturn join(to_expression(builtin_invocation_id_id), \".x % \", get_entry_point().output_vertices);\n\t}\n\telse\n\t\treturn builtin_to_glsl(BuiltInInvocationId, StorageClassInput);\n}\n\nvoid CompilerMSL::emit_local_masked_variable(const SPIRVariable &masked_var, bool strip_array)\n{\n\tauto &entry_func = get<SPIRFunction>(ir.default_entry_point);\n\tbool threadgroup_storage = variable_decl_is_remapped_storage(masked_var, StorageClassWorkgroup);\n\n\tif (threadgroup_storage && msl_options.multi_patch_workgroup)\n\t{\n\t\t// We need one threadgroup block per patch, so fake this.\n\t\tentry_func.fixup_hooks_in.push_back([this, &masked_var]() {\n\t\t\tauto &type = get_variable_data_type(masked_var);\n\t\t\tadd_local_variable_name(masked_var.self);\n\n\t\t\tconst uint32_t max_control_points_per_patch = 32u;\n\t\t\tuint32_t max_num_instances =\n\t\t\t\t\t(max_control_points_per_patch + get_entry_point().output_vertices - 1u) /\n\t\t\t\t\tget_entry_point().output_vertices;\n\t\t\tstatement(\"threadgroup \", type_to_glsl(type), \" \",\n\t\t\t          \"spvStorage\", to_name(masked_var.self), \"[\", max_num_instances, \"]\",\n\t\t\t          type_to_array_glsl(type), \";\");\n\n\t\t\t// Assign a threadgroup slice to each PrimitiveID.\n\t\t\t// We assume here that workgroup size is rounded to 32,\n\t\t\t// since that's the maximum number of control points per patch.\n\t\t\t// We cannot size the array based on fixed dispatch parameters,\n\t\t\t// since Metal does not allow that. :(\n\t\t\t// FIXME: We will likely need an option to support passing down target workgroup size,\n\t\t\t// so we can emit appropriate size here.\n\t\t\tstatement(\"threadgroup auto \",\n\t\t\t          \"&\", to_name(masked_var.self),\n\t\t\t          \" = spvStorage\", to_name(masked_var.self), \"[\",\n\t\t\t          \"(\", to_expression(builtin_invocation_id_id), \".x / \",\n\t\t\t          get_entry_point().output_vertices, \") % \",\n\t\t\t          max_num_instances, \"];\");\n\t\t});\n\t}\n\telse\n\t{\n\t\tentry_func.add_local_variable(masked_var.self);\n\t}\n\n\tif (!threadgroup_storage)\n\t{\n\t\tvars_needing_early_declaration.push_back(masked_var.self);\n\t}\n\telse if (masked_var.initializer)\n\t{\n\t\t// Cannot directly initialize threadgroup variables. Need fixup hooks.\n\t\tID initializer = masked_var.initializer;\n\t\tif (strip_array)\n\t\t{\n\t\t\tentry_func.fixup_hooks_in.push_back([this, &masked_var, initializer]() {\n\t\t\t\tauto invocation = to_tesc_invocation_id();\n\t\t\t\tstatement(to_expression(masked_var.self), \"[\",\n\t\t\t\t          invocation, \"] = \",\n\t\t\t\t          to_expression(initializer), \"[\",\n\t\t\t\t          invocation, \"];\");\n\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tentry_func.fixup_hooks_in.push_back([this, &masked_var, initializer]() {\n\t\t\t\tstatement(to_expression(masked_var.self), \" = \", to_expression(initializer), \";\");\n\t\t\t});\n\t\t}\n\t}\n}\n\nvoid CompilerMSL::add_variable_to_interface_block(StorageClass storage, const string &ib_var_ref, SPIRType &ib_type,\n                                                  SPIRVariable &var, InterfaceBlockMeta &meta)\n{\n\tauto &entry_func = get<SPIRFunction>(ir.default_entry_point);\n\t// Tessellation control I/O variables and tessellation evaluation per-point inputs are\n\t// usually declared as arrays. In these cases, we want to add the element type to the\n\t// interface block, since in Metal it's the interface block itself which is arrayed.\n\tauto &var_type = meta.strip_array ? get_variable_element_type(var) : get_variable_data_type(var);\n\tbool is_builtin = is_builtin_variable(var);\n\tauto builtin = BuiltIn(get_decoration(var.self, DecorationBuiltIn));\n\tbool is_block = has_decoration(var_type.self, DecorationBlock);\n\n\t// If stage variables are masked out, emit them as plain variables instead.\n\t// For builtins, we query them one by one later.\n\t// IO blocks are not masked here, we need to mask them per-member instead.\n\tif (storage == StorageClassOutput && is_stage_output_variable_masked(var))\n\t{\n\t\t// If we ignore an output, we must still emit it, since it might be used by app.\n\t\t// Instead, just emit it as early declaration.\n\t\temit_local_masked_variable(var, meta.strip_array);\n\t\treturn;\n\t}\n\n\tif (storage == StorageClassInput && has_decoration(var.self, DecorationPerVertexKHR))\n\t\tSPIRV_CROSS_THROW(\"PerVertexKHR decoration is not supported in MSL.\");\n\n\t// If variable names alias, they will end up with wrong names in the interface struct, because\n\t// there might be aliases in the member name cache and there would be a mismatch in fixup_in code.\n\t// Make sure to register the variables as unique resource names ahead of time.\n\t// This would normally conflict with the name cache when emitting local variables,\n\t// but this happens in the setup stage, before we hit compilation loops.\n\t// The name cache is cleared before we actually emit code, so this is safe.\n\tadd_resource_name(var.self);\n\n\tif (var_type.basetype == SPIRType::Struct)\n\t{\n\t\tbool block_requires_flattening =\n\t\t    variable_storage_requires_stage_io(storage) || (is_block && var_type.array.empty());\n\t\tbool needs_local_declaration = !is_builtin && block_requires_flattening && meta.allow_local_declaration;\n\n\t\tif (needs_local_declaration)\n\t\t{\n\t\t\t// For I/O blocks or structs, we will need to pass the block itself around\n\t\t\t// to functions if they are used globally in leaf functions.\n\t\t\t// Rather than passing down member by member,\n\t\t\t// we unflatten I/O blocks while running the shader,\n\t\t\t// and pass the actual struct type down to leaf functions.\n\t\t\t// We then unflatten inputs, and flatten outputs in the \"fixup\" stages.\n\t\t\temit_local_masked_variable(var, meta.strip_array);\n\t\t}\n\n\t\tif (!block_requires_flattening)\n\t\t{\n\t\t\t// In Metal tessellation shaders, the interface block itself is arrayed. This makes things\n\t\t\t// very complicated, since stage-in structures in MSL don't support nested structures.\n\t\t\t// Luckily, for stage-out when capturing output, we can avoid this and just add\n\t\t\t// composite members directly, because the stage-out structure is stored to a buffer,\n\t\t\t// not returned.\n\t\t\tadd_plain_variable_to_interface_block(storage, ib_var_ref, ib_type, var, meta);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbool masked_block = false;\n\t\t\tuint32_t location = UINT32_MAX;\n\t\t\tuint32_t var_mbr_idx = 0;\n\t\t\tuint32_t elem_cnt = 1;\n\t\t\tif (is_matrix(var_type))\n\t\t\t{\n\t\t\t\tif (is_array(var_type))\n\t\t\t\t\tSPIRV_CROSS_THROW(\"MSL cannot emit arrays-of-matrices in input and output variables.\");\n\n\t\t\t\telem_cnt = var_type.columns;\n\t\t\t}\n\t\t\telse if (is_array(var_type))\n\t\t\t{\n\t\t\t\tif (var_type.array.size() != 1)\n\t\t\t\t\tSPIRV_CROSS_THROW(\"MSL cannot emit arrays-of-arrays in input and output variables.\");\n\n\t\t\t\telem_cnt = to_array_size_literal(var_type);\n\t\t\t}\n\n\t\t\tfor (uint32_t elem_idx = 0; elem_idx < elem_cnt; elem_idx++)\n\t\t\t{\n\t\t\t\t// Flatten the struct members into the interface struct\n\t\t\t\tfor (uint32_t mbr_idx = 0; mbr_idx < uint32_t(var_type.member_types.size()); mbr_idx++)\n\t\t\t\t{\n\t\t\t\t\tbuiltin = BuiltInMax;\n\t\t\t\t\tis_builtin = is_member_builtin(var_type, mbr_idx, &builtin);\n\t\t\t\t\tauto &mbr_type = get<SPIRType>(var_type.member_types[mbr_idx]);\n\n\t\t\t\t\tif (storage == StorageClassOutput && is_stage_output_block_member_masked(var, mbr_idx, meta.strip_array))\n\t\t\t\t\t{\n\t\t\t\t\t\tlocation = UINT32_MAX; // Skip this member and resolve location again on next var member\n\n\t\t\t\t\t\tif (is_block)\n\t\t\t\t\t\t\tmasked_block = true;\n\n\t\t\t\t\t\t// Non-builtin block output variables are just ignored, since they will still access\n\t\t\t\t\t\t// the block variable as-is. They're just not flattened.\n\t\t\t\t\t\tif (is_builtin && !meta.strip_array)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Emit a fake variable instead.\n\t\t\t\t\t\t\tuint32_t ids = ir.increase_bound_by(2);\n\t\t\t\t\t\t\tuint32_t ptr_type_id = ids + 0;\n\t\t\t\t\t\t\tuint32_t var_id = ids + 1;\n\n\t\t\t\t\t\t\tauto ptr_type = mbr_type;\n\t\t\t\t\t\t\tptr_type.pointer = true;\n\t\t\t\t\t\t\tptr_type.pointer_depth++;\n\t\t\t\t\t\t\tptr_type.parent_type = var_type.member_types[mbr_idx];\n\t\t\t\t\t\t\tptr_type.storage = StorageClassOutput;\n\n\t\t\t\t\t\t\tuint32_t initializer = 0;\n\t\t\t\t\t\t\tif (var.initializer)\n\t\t\t\t\t\t\t\tif (auto *c = maybe_get<SPIRConstant>(var.initializer))\n\t\t\t\t\t\t\t\t\tinitializer = c->subconstants[mbr_idx];\n\n\t\t\t\t\t\t\tset<SPIRType>(ptr_type_id, ptr_type);\n\t\t\t\t\t\t\tset<SPIRVariable>(var_id, ptr_type_id, StorageClassOutput, initializer);\n\t\t\t\t\t\t\tentry_func.add_local_variable(var_id);\n\t\t\t\t\t\t\tvars_needing_early_declaration.push_back(var_id);\n\t\t\t\t\t\t\tset_name(var_id, builtin_to_glsl(builtin, StorageClassOutput));\n\t\t\t\t\t\t\tset_decoration(var_id, DecorationBuiltIn, builtin);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (!is_builtin || has_active_builtin(builtin, storage))\n\t\t\t\t\t{\n\t\t\t\t\t\tbool is_composite_type = is_matrix(mbr_type) || is_array(mbr_type) || mbr_type.basetype == SPIRType::Struct;\n\t\t\t\t\t\tbool attribute_load_store =\n\t\t\t\t\t\t\t\tstorage == StorageClassInput && get_execution_model() != ExecutionModelFragment;\n\t\t\t\t\t\tbool storage_is_stage_io = variable_storage_requires_stage_io(storage);\n\n\t\t\t\t\t\t// Clip/CullDistance always need to be declared as user attributes.\n\t\t\t\t\t\tif (builtin == BuiltInClipDistance || builtin == BuiltInCullDistance)\n\t\t\t\t\t\t\tis_builtin = false;\n\n\t\t\t\t\t\tconst string var_name = to_name(var.self);\n\t\t\t\t\t\tstring mbr_name_qual = var_name;\n\t\t\t\t\t\tstring var_chain_qual = var_name;\n\t\t\t\t\t\tif (elem_cnt > 1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmbr_name_qual += join(\"_\", elem_idx);\n\t\t\t\t\t\t\tvar_chain_qual += join(\"[\", elem_idx, \"]\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ((!is_builtin || attribute_load_store) && storage_is_stage_io && is_composite_type)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tadd_composite_member_variable_to_interface_block(storage, ib_var_ref, ib_type,\n\t\t\t\t\t\t\t                                                 var, var_type, mbr_idx, meta,\n\t\t\t\t\t\t\t                                                 mbr_name_qual, var_chain_qual,\n\t\t\t\t\t\t\t                                                 location, var_mbr_idx);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tadd_plain_member_variable_to_interface_block(storage, ib_var_ref, ib_type,\n\t\t\t\t\t\t\t                                             var, var_type, mbr_idx, meta,\n\t\t\t\t\t\t\t                                             mbr_name_qual, var_chain_qual,\n\t\t\t\t\t\t\t                                             location, var_mbr_idx);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tvar_mbr_idx++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If we're redirecting a block, we might still need to access the original block\n\t\t\t// variable if we're masking some members.\n\t\t\tif (masked_block && !needs_local_declaration && (!is_builtin_variable(var) || is_tesc_shader()))\n\t\t\t{\n\t\t\t\tif (is_builtin_variable(var))\n\t\t\t\t{\n\t\t\t\t\t// Ensure correct names for the block members if we're actually going to\n\t\t\t\t\t// declare gl_PerVertex.\n\t\t\t\t\tfor (uint32_t mbr_idx = 0; mbr_idx < uint32_t(var_type.member_types.size()); mbr_idx++)\n\t\t\t\t\t{\n\t\t\t\t\t\tset_member_name(var_type.self, mbr_idx, builtin_to_glsl(\n\t\t\t\t\t\t\t\tBuiltIn(get_member_decoration(var_type.self, mbr_idx, DecorationBuiltIn)),\n\t\t\t\t\t\t\t\tStorageClassOutput));\n\t\t\t\t\t}\n\n\t\t\t\t\tset_name(var_type.self, \"gl_PerVertex\");\n\t\t\t\t\tset_name(var.self, \"gl_out_masked\");\n\t\t\t\t\tstage_out_masked_builtin_type_id = var_type.self;\n\t\t\t\t}\n\t\t\t\temit_local_masked_variable(var, meta.strip_array);\n\t\t\t}\n\t\t}\n\t}\n\telse if (is_tese_shader() && storage == StorageClassInput && !meta.strip_array && is_builtin &&\n\t         (builtin == BuiltInTessLevelOuter || builtin == BuiltInTessLevelInner))\n\t{\n\t\tadd_tess_level_input_to_interface_block(ib_var_ref, ib_type, var);\n\t}\n\telse if (var_type.basetype == SPIRType::Boolean || var_type.basetype == SPIRType::Char ||\n\t         type_is_integral(var_type) || type_is_floating_point(var_type))\n\t{\n\t\tif (!is_builtin || has_active_builtin(builtin, storage))\n\t\t{\n\t\t\tbool is_composite_type = is_matrix(var_type) || is_array(var_type);\n\t\t\tbool storage_is_stage_io = variable_storage_requires_stage_io(storage);\n\t\t\tbool attribute_load_store = storage == StorageClassInput && get_execution_model() != ExecutionModelFragment;\n\n\t\t\t// Clip/CullDistance always needs to be declared as user attributes.\n\t\t\tif (builtin == BuiltInClipDistance || builtin == BuiltInCullDistance)\n\t\t\t\tis_builtin = false;\n\n\t\t\t// MSL does not allow matrices or arrays in input or output variables, so need to handle it specially.\n\t\t\tif ((!is_builtin || attribute_load_store) && storage_is_stage_io && is_composite_type)\n\t\t\t{\n\t\t\t\tadd_composite_variable_to_interface_block(storage, ib_var_ref, ib_type, var, meta);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tadd_plain_variable_to_interface_block(storage, ib_var_ref, ib_type, var, meta);\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Fix up the mapping of variables to interface member indices, which is used to compile access chains\n// for per-vertex variables in a tessellation control shader.\nvoid CompilerMSL::fix_up_interface_member_indices(StorageClass storage, uint32_t ib_type_id)\n{\n\t// Only needed for tessellation shaders and pull-model interpolants.\n\t// Need to redirect interface indices back to variables themselves.\n\t// For structs, each member of the struct need a separate instance.\n\tif (!is_tesc_shader() && !(is_tese_shader() && storage == StorageClassInput) &&\n\t    !(get_execution_model() == ExecutionModelFragment && storage == StorageClassInput &&\n\t      !pull_model_inputs.empty()))\n\t\treturn;\n\n\tauto mbr_cnt = uint32_t(ir.meta[ib_type_id].members.size());\n\tfor (uint32_t i = 0; i < mbr_cnt; i++)\n\t{\n\t\tuint32_t var_id = get_extended_member_decoration(ib_type_id, i, SPIRVCrossDecorationInterfaceOrigID);\n\t\tif (!var_id)\n\t\t\tcontinue;\n\t\tauto &var = get<SPIRVariable>(var_id);\n\n\t\tauto &type = get_variable_element_type(var);\n\n\t\tbool flatten_composites = variable_storage_requires_stage_io(var.storage);\n\t\tbool is_block = has_decoration(type.self, DecorationBlock);\n\n\t\tuint32_t mbr_idx = uint32_t(-1);\n\t\tif (type.basetype == SPIRType::Struct && (flatten_composites || is_block))\n\t\t\tmbr_idx = get_extended_member_decoration(ib_type_id, i, SPIRVCrossDecorationInterfaceMemberIndex);\n\n\t\tif (mbr_idx != uint32_t(-1))\n\t\t{\n\t\t\t// Only set the lowest InterfaceMemberIndex for each variable member.\n\t\t\t// IB struct members will be emitted in-order w.r.t. interface member index.\n\t\t\tif (!has_extended_member_decoration(var_id, mbr_idx, SPIRVCrossDecorationInterfaceMemberIndex))\n\t\t\t\tset_extended_member_decoration(var_id, mbr_idx, SPIRVCrossDecorationInterfaceMemberIndex, i);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Only set the lowest InterfaceMemberIndex for each variable.\n\t\t\t// IB struct members will be emitted in-order w.r.t. interface member index.\n\t\t\tif (!has_extended_decoration(var_id, SPIRVCrossDecorationInterfaceMemberIndex))\n\t\t\t\tset_extended_decoration(var_id, SPIRVCrossDecorationInterfaceMemberIndex, i);\n\t\t}\n\t}\n}\n\n// Add an interface structure for the type of storage, which is either StorageClassInput or StorageClassOutput.\n// Returns the ID of the newly added variable, or zero if no variable was added.\nuint32_t CompilerMSL::add_interface_block(StorageClass storage, bool patch)\n{\n\t// Accumulate the variables that should appear in the interface struct.\n\tSmallVector<SPIRVariable *> vars;\n\tbool incl_builtins = storage == StorageClassOutput || is_tessellation_shader();\n\tbool has_seen_barycentric = false;\n\n\tInterfaceBlockMeta meta;\n\n\t// Varying interfaces between stages which use \"user()\" attribute can be dealt with\n\t// without explicit packing and unpacking of components. For any variables which link against the runtime\n\t// in some way (vertex attributes, fragment output, etc), we'll need to deal with it somehow.\n\tbool pack_components =\n\t    (storage == StorageClassInput && get_execution_model() == ExecutionModelVertex) ||\n\t    (storage == StorageClassOutput && get_execution_model() == ExecutionModelFragment) ||\n\t    (storage == StorageClassOutput && get_execution_model() == ExecutionModelVertex && capture_output_to_buffer);\n\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t var_id, SPIRVariable &var) {\n\t\tif (var.storage != storage)\n\t\t\treturn;\n\n\t\tauto &type = this->get<SPIRType>(var.basetype);\n\n\t\tbool is_builtin = is_builtin_variable(var);\n\t\tbool is_block = has_decoration(type.self, DecorationBlock);\n\n\t\tauto bi_type = BuiltInMax;\n\t\tbool builtin_is_gl_in_out = false;\n\t\tif (is_builtin && !is_block)\n\t\t{\n\t\t\tbi_type = BuiltIn(get_decoration(var_id, DecorationBuiltIn));\n\t\t\tbuiltin_is_gl_in_out = bi_type == BuiltInPosition || bi_type == BuiltInPointSize ||\n\t\t\t                       bi_type == BuiltInClipDistance || bi_type == BuiltInCullDistance;\n\t\t}\n\n\t\tif (is_builtin && is_block)\n\t\t\tbuiltin_is_gl_in_out = true;\n\n\t\tuint32_t location = get_decoration(var_id, DecorationLocation);\n\n\t\tbool builtin_is_stage_in_out = builtin_is_gl_in_out ||\n\t\t                               bi_type == BuiltInLayer || bi_type == BuiltInViewportIndex ||\n\t\t                               bi_type == BuiltInBaryCoordKHR || bi_type == BuiltInBaryCoordNoPerspKHR ||\n\t\t                               bi_type == BuiltInFragDepth ||\n\t\t                               bi_type == BuiltInFragStencilRefEXT || bi_type == BuiltInSampleMask;\n\n\t\t// These builtins are part of the stage in/out structs.\n\t\tbool is_interface_block_builtin =\n\t\t    builtin_is_stage_in_out || (is_tese_shader() && !msl_options.raw_buffer_tese_input &&\n\t\t                                (bi_type == BuiltInTessLevelOuter || bi_type == BuiltInTessLevelInner));\n\n\t\tbool is_active = interface_variable_exists_in_entry_point(var.self);\n\t\tif (is_builtin && is_active)\n\t\t{\n\t\t\t// Only emit the builtin if it's active in this entry point. Interface variable list might lie.\n\t\t\tif (is_block)\n\t\t\t{\n\t\t\t\t// If any builtin is active, the block is active.\n\t\t\t\tuint32_t mbr_cnt = uint32_t(type.member_types.size());\n\t\t\t\tfor (uint32_t i = 0; !is_active && i < mbr_cnt; i++)\n\t\t\t\t\tis_active = has_active_builtin(BuiltIn(get_member_decoration(type.self, i, DecorationBuiltIn)), storage);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tis_active = has_active_builtin(bi_type, storage);\n\t\t\t}\n\t\t}\n\n\t\tbool filter_patch_decoration = (has_decoration(var_id, DecorationPatch) || is_patch_block(type)) == patch;\n\n\t\tbool hidden = is_hidden_variable(var, incl_builtins);\n\n\t\t// ClipDistance is never hidden, we need to emulate it when used as an input.\n\t\tif (bi_type == BuiltInClipDistance || bi_type == BuiltInCullDistance)\n\t\t\thidden = false;\n\n\t\t// It's not enough to simply avoid marking fragment outputs if the pipeline won't\n\t\t// accept them. We can't put them in the struct at all, or otherwise the compiler\n\t\t// complains that the outputs weren't explicitly marked.\n\t\t// Frag depth and stencil outputs are incompatible with explicit early fragment tests.\n\t\t// In GLSL, depth and stencil outputs are just ignored when explicit early fragment tests are required.\n\t\t// In Metal, it's a compilation error, so we need to exclude them from the output struct.\n\t\tif (get_execution_model() == ExecutionModelFragment && storage == StorageClassOutput && !patch &&\n\t\t    ((is_builtin && ((bi_type == BuiltInFragDepth && (!msl_options.enable_frag_depth_builtin || uses_explicit_early_fragment_test())) ||\n\t\t                     (bi_type == BuiltInFragStencilRefEXT && (!msl_options.enable_frag_stencil_ref_builtin || uses_explicit_early_fragment_test())))) ||\n\t\t     (!is_builtin && !(msl_options.enable_frag_output_mask & (1 << location)))))\n\t\t{\n\t\t\thidden = true;\n\t\t\tdisabled_frag_outputs.push_back(var_id);\n\t\t\t// If a builtin, force it to have the proper name, and mark it as not part of the output struct.\n\t\t\tif (is_builtin)\n\t\t\t{\n\t\t\t\tset_name(var_id, builtin_to_glsl(bi_type, StorageClassFunction));\n\t\t\t\tmask_stage_output_by_builtin(bi_type);\n\t\t\t}\n\t\t}\n\n\t\t// Barycentric inputs must be emitted in stage-in, because they can have interpolation arguments.\n\t\tif (is_active && (bi_type == BuiltInBaryCoordKHR || bi_type == BuiltInBaryCoordNoPerspKHR))\n\t\t{\n\t\t\tif (has_seen_barycentric)\n\t\t\t\tSPIRV_CROSS_THROW(\"Cannot declare both BaryCoordNV and BaryCoordNoPerspNV in same shader in MSL.\");\n\t\t\thas_seen_barycentric = true;\n\t\t\thidden = false;\n\t\t}\n\n\t\tif (is_active && !hidden && type.pointer && filter_patch_decoration &&\n\t\t    (!is_builtin || is_interface_block_builtin))\n\t\t{\n\t\t\tvars.push_back(&var);\n\n\t\t\tif (!is_builtin)\n\t\t\t{\n\t\t\t\t// Need to deal specially with DecorationComponent.\n\t\t\t\t// Multiple variables can alias the same Location, and try to make sure each location is declared only once.\n\t\t\t\t// We will swizzle data in and out to make this work.\n\t\t\t\t// This is only relevant for vertex inputs and fragment outputs.\n\t\t\t\t// Technically tessellation as well, but it is too complicated to support.\n\t\t\t\tuint32_t component = get_decoration(var_id, DecorationComponent);\n\t\t\t\tif (component != 0)\n\t\t\t\t{\n\t\t\t\t\tif (is_tessellation_shader())\n\t\t\t\t\t\tSPIRV_CROSS_THROW(\"Component decoration is not supported in tessellation shaders.\");\n\t\t\t\t\telse if (pack_components)\n\t\t\t\t\t{\n\t\t\t\t\t\tuint32_t array_size = 1;\n\t\t\t\t\t\tif (!type.array.empty())\n\t\t\t\t\t\t\tarray_size = to_array_size_literal(type);\n\n\t\t\t\t\t\tfor (uint32_t location_offset = 0; location_offset < array_size; location_offset++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tauto &location_meta = meta.location_meta[location + location_offset];\n\t\t\t\t\t\t\tlocation_meta.num_components = max<uint32_t>(location_meta.num_components, component + type.vecsize);\n\n\t\t\t\t\t\t\t// For variables sharing location, decorations and base type must match.\n\t\t\t\t\t\t\tlocation_meta.base_type_id = type.self;\n\t\t\t\t\t\t\tlocation_meta.flat = has_decoration(var.self, DecorationFlat);\n\t\t\t\t\t\t\tlocation_meta.noperspective = has_decoration(var.self, DecorationNoPerspective);\n\t\t\t\t\t\t\tlocation_meta.centroid = has_decoration(var.self, DecorationCentroid);\n\t\t\t\t\t\t\tlocation_meta.sample = has_decoration(var.self, DecorationSample);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (is_tese_shader() && msl_options.raw_buffer_tese_input && patch && storage == StorageClassInput &&\n\t\t    (bi_type == BuiltInTessLevelOuter || bi_type == BuiltInTessLevelInner))\n\t\t{\n\t\t\t// In this case, we won't add the builtin to the interface struct,\n\t\t\t// but we still need the hook to run to populate the arrays.\n\t\t\tstring base_ref = join(tess_factor_buffer_var_name, \"[\", to_expression(builtin_primitive_id_id), \"]\");\n\t\t\tconst char *mbr_name =\n\t\t\t    bi_type == BuiltInTessLevelOuter ? \"edgeTessellationFactor\" : \"insideTessellationFactor\";\n\t\t\tadd_tess_level_input(base_ref, mbr_name, var);\n\t\t\tif (inputs_by_builtin.count(bi_type))\n\t\t\t{\n\t\t\t\tuint32_t locn = inputs_by_builtin[bi_type].location;\n\t\t\t\tmark_location_as_used_by_shader(locn, type, StorageClassInput);\n\t\t\t}\n\t\t}\n\t});\n\n\t// If no variables qualify, leave.\n\t// For patch input in a tessellation evaluation shader, the per-vertex stage inputs\n\t// are included in a special patch control point array.\n\tif (vars.empty() &&\n\t    !(!msl_options.raw_buffer_tese_input && storage == StorageClassInput && patch && stage_in_var_id))\n\t\treturn 0;\n\n\t// Add a new typed variable for this interface structure.\n\t// The initializer expression is allocated here, but populated when the function\n\t// declaraion is emitted, because it is cleared after each compilation pass.\n\tuint32_t next_id = ir.increase_bound_by(3);\n\tuint32_t ib_type_id = next_id++;\n\tauto &ib_type = set<SPIRType>(ib_type_id, OpTypeStruct);\n\tib_type.basetype = SPIRType::Struct;\n\tib_type.storage = storage;\n\tset_decoration(ib_type_id, DecorationBlock);\n\n\tuint32_t ib_var_id = next_id++;\n\tauto &var = set<SPIRVariable>(ib_var_id, ib_type_id, storage, 0);\n\tvar.initializer = next_id++;\n\n\tstring ib_var_ref;\n\tauto &entry_func = get<SPIRFunction>(ir.default_entry_point);\n\tswitch (storage)\n\t{\n\tcase StorageClassInput:\n\t\tib_var_ref = patch ? patch_stage_in_var_name : stage_in_var_name;\n\t\tswitch (get_execution_model())\n\t\t{\n\t\tcase ExecutionModelTessellationControl:\n\t\t\t// Add a hook to populate the shared workgroup memory containing the gl_in array.\n\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t// Can't use PatchVertices, PrimitiveId, or InvocationId yet; the hooks for those may not have run yet.\n\t\t\t\tif (msl_options.multi_patch_workgroup)\n\t\t\t\t{\n\t\t\t\t\t// n.b. builtin_invocation_id_id here is the dispatch global invocation ID,\n\t\t\t\t\t// not the TC invocation ID.\n\t\t\t\t\tstatement(\"device \", to_name(ir.default_entry_point), \"_\", ib_var_ref, \"* gl_in = &\",\n\t\t\t\t\t          input_buffer_var_name, \"[min(\", to_expression(builtin_invocation_id_id), \".x / \",\n\t\t\t\t\t          get_entry_point().output_vertices,\n\t\t\t\t\t          \", spvIndirectParams[1] - 1) * spvIndirectParams[0]];\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// It's safe to use InvocationId here because it's directly mapped to a\n\t\t\t\t\t// Metal builtin, and therefore doesn't need a hook.\n\t\t\t\t\tstatement(\"if (\", to_expression(builtin_invocation_id_id), \" < spvIndirectParams[0])\");\n\t\t\t\t\tstatement(\"    \", input_wg_var_name, \"[\", to_expression(builtin_invocation_id_id),\n\t\t\t\t\t          \"] = \", ib_var_ref, \";\");\n\t\t\t\t\tstatement(\"threadgroup_barrier(mem_flags::mem_threadgroup);\");\n\t\t\t\t\tstatement(\"if (\", to_expression(builtin_invocation_id_id),\n\t\t\t\t\t          \" >= \", get_entry_point().output_vertices, \")\");\n\t\t\t\t\tstatement(\"    return;\");\n\t\t\t\t}\n\t\t\t});\n\t\t\tbreak;\n\t\tcase ExecutionModelTessellationEvaluation:\n\t\t\tif (!msl_options.raw_buffer_tese_input)\n\t\t\t\tbreak;\n\t\t\tif (patch)\n\t\t\t{\n\t\t\t\tentry_func.fixup_hooks_in.push_back(\n\t\t\t\t    [=]()\n\t\t\t\t    {\n\t\t\t\t\t    statement(\"const device \", to_name(ir.default_entry_point), \"_\", ib_var_ref, \"& \", ib_var_ref,\n\t\t\t\t\t              \" = \", patch_input_buffer_var_name, \"[\", to_expression(builtin_primitive_id_id),\n\t\t\t\t\t              \"];\");\n\t\t\t\t    });\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tentry_func.fixup_hooks_in.push_back(\n\t\t\t\t    [=]()\n\t\t\t\t    {\n\t\t\t\t\t    statement(\"const device \", to_name(ir.default_entry_point), \"_\", ib_var_ref, \"* gl_in = &\",\n\t\t\t\t\t              input_buffer_var_name, \"[\", to_expression(builtin_primitive_id_id), \" * \",\n\t\t\t\t\t              get_entry_point().output_vertices, \"];\");\n\t\t\t\t    });\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\n\tcase StorageClassOutput:\n\t{\n\t\tib_var_ref = patch ? patch_stage_out_var_name : stage_out_var_name;\n\n\t\t// Add the output interface struct as a local variable to the entry function.\n\t\t// If the entry point should return the output struct, set the entry function\n\t\t// to return the output interface struct, otherwise to return nothing.\n\t\t// Watch out for the rare case where the terminator of the last entry point block is a\n\t\t// Kill, instead of a Return. Based on SPIR-V's block-domination rules, we assume that\n\t\t// any block that has a Kill will also have a terminating Return, except the last block.\n\t\t// Indicate the output var requires early initialization.\n\t\tbool ep_should_return_output = !get_is_rasterization_disabled();\n\t\tuint32_t rtn_id = ep_should_return_output ? ib_var_id : 0;\n\t\tif (!capture_output_to_buffer)\n\t\t{\n\t\t\tentry_func.add_local_variable(ib_var_id);\n\t\t\tfor (auto &blk_id : entry_func.blocks)\n\t\t\t{\n\t\t\t\tauto &blk = get<SPIRBlock>(blk_id);\n\t\t\t\tif (blk.terminator == SPIRBlock::Return || (blk.terminator == SPIRBlock::Kill && blk_id == entry_func.blocks.back()))\n\t\t\t\t\tblk.return_value = rtn_id;\n\t\t\t}\n\t\t\tvars_needing_early_declaration.push_back(ib_var_id);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tswitch (get_execution_model())\n\t\t\t{\n\t\t\tcase ExecutionModelVertex:\n\t\t\tcase ExecutionModelTessellationEvaluation:\n\t\t\t\t// Instead of declaring a struct variable to hold the output and then\n\t\t\t\t// copying that to the output buffer, we'll declare the output variable\n\t\t\t\t// as a reference to the final output element in the buffer. Then we can\n\t\t\t\t// avoid the extra copy.\n\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\tif (stage_out_var_id)\n\t\t\t\t\t{\n\t\t\t\t\t\t// The first member of the indirect buffer is always the number of vertices\n\t\t\t\t\t\t// to draw.\n\t\t\t\t\t\t// We zero-base the InstanceID & VertexID variables for HLSL emulation elsewhere, so don't do it twice\n\t\t\t\t\t\tif (get_execution_model() == ExecutionModelVertex && msl_options.vertex_for_tessellation)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstatement(\"device \", to_name(ir.default_entry_point), \"_\", ib_var_ref, \"& \", ib_var_ref,\n\t\t\t\t\t\t\t          \" = \", output_buffer_var_name, \"[\", to_expression(builtin_invocation_id_id),\n\t\t\t\t\t\t\t          \".y * \", to_expression(builtin_stage_input_size_id), \".x + \",\n\t\t\t\t\t\t\t          to_expression(builtin_invocation_id_id), \".x];\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (msl_options.enable_base_index_zero)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstatement(\"device \", to_name(ir.default_entry_point), \"_\", ib_var_ref, \"& \", ib_var_ref,\n\t\t\t\t\t\t\t          \" = \", output_buffer_var_name, \"[\", to_expression(builtin_instance_idx_id),\n\t\t\t\t\t\t\t          \" * spvIndirectParams[0] + \", to_expression(builtin_vertex_idx_id), \"];\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstatement(\"device \", to_name(ir.default_entry_point), \"_\", ib_var_ref, \"& \", ib_var_ref,\n\t\t\t\t\t\t\t          \" = \", output_buffer_var_name, \"[(\", to_expression(builtin_instance_idx_id),\n\t\t\t\t\t\t\t          \" - \", to_expression(builtin_base_instance_id), \") * spvIndirectParams[0] + \",\n\t\t\t\t\t\t\t          to_expression(builtin_vertex_idx_id), \" - \",\n\t\t\t\t\t\t\t          to_expression(builtin_base_vertex_id), \"];\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase ExecutionModelTessellationControl:\n\t\t\t\tif (msl_options.multi_patch_workgroup)\n\t\t\t\t{\n\t\t\t\t\t// We cannot use PrimitiveId here, because the hook may not have run yet.\n\t\t\t\t\tif (patch)\n\t\t\t\t\t{\n\t\t\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\t\t\tstatement(\"device \", to_name(ir.default_entry_point), \"_\", ib_var_ref, \"& \", ib_var_ref,\n\t\t\t\t\t\t\t          \" = \", patch_output_buffer_var_name, \"[\", to_expression(builtin_invocation_id_id),\n\t\t\t\t\t\t\t          \".x / \", get_entry_point().output_vertices, \"];\");\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\t\t\tstatement(\"device \", to_name(ir.default_entry_point), \"_\", ib_var_ref, \"* gl_out = &\",\n\t\t\t\t\t\t\t          output_buffer_var_name, \"[\", to_expression(builtin_invocation_id_id), \".x - \",\n\t\t\t\t\t\t\t          to_expression(builtin_invocation_id_id), \".x % \",\n\t\t\t\t\t\t\t          get_entry_point().output_vertices, \"];\");\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (patch)\n\t\t\t\t\t{\n\t\t\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\t\t\tstatement(\"device \", to_name(ir.default_entry_point), \"_\", ib_var_ref, \"& \", ib_var_ref,\n\t\t\t\t\t\t\t          \" = \", patch_output_buffer_var_name, \"[\", to_expression(builtin_primitive_id_id),\n\t\t\t\t\t\t\t          \"];\");\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\t\t\tstatement(\"device \", to_name(ir.default_entry_point), \"_\", ib_var_ref, \"* gl_out = &\",\n\t\t\t\t\t\t\t          output_buffer_var_name, \"[\", to_expression(builtin_primitive_id_id), \" * \",\n\t\t\t\t\t\t\t          get_entry_point().output_vertices, \"];\");\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\t}\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\tset_name(ib_type_id, to_name(ir.default_entry_point) + \"_\" + ib_var_ref);\n\tset_name(ib_var_id, ib_var_ref);\n\n\tfor (auto *p_var : vars)\n\t{\n\t\tbool strip_array = (is_tesc_shader() || (is_tese_shader() && storage == StorageClassInput)) && !patch;\n\n\t\t// Fixing up flattened stores in TESC is impossible since the memory is group shared either via\n\t\t// device (not masked) or threadgroup (masked) storage classes and it's race condition city.\n\t\tmeta.strip_array = strip_array;\n\t\tmeta.allow_local_declaration = !strip_array && !(is_tesc_shader() && storage == StorageClassOutput);\n\t\tadd_variable_to_interface_block(storage, ib_var_ref, ib_type, *p_var, meta);\n\t}\n\n\tif (((is_tesc_shader() && msl_options.multi_patch_workgroup) ||\n\t     (is_tese_shader() && msl_options.raw_buffer_tese_input)) &&\n\t    storage == StorageClassInput)\n\t{\n\t\t// For tessellation inputs, add all outputs from the previous stage to ensure\n\t\t// the struct containing them is the correct size and layout.\n\t\tfor (auto &input : inputs_by_location)\n\t\t{\n\t\t\tif (location_inputs_in_use.count(input.first.location) != 0)\n\t\t\t\tcontinue;\n\n\t\t\tif (patch != (input.second.rate == MSL_SHADER_VARIABLE_RATE_PER_PATCH))\n\t\t\t\tcontinue;\n\n\t\t\t// Tessellation levels have their own struct, so there's no need to add them here.\n\t\t\tif (input.second.builtin == BuiltInTessLevelOuter || input.second.builtin == BuiltInTessLevelInner)\n\t\t\t\tcontinue;\n\n\t\t\t// Create a fake variable to put at the location.\n\t\t\tuint32_t offset = ir.increase_bound_by(5);\n\t\t\tuint32_t type_id = offset;\n\t\t\tuint32_t vec_type_id = offset + 1;\n\t\t\tuint32_t array_type_id = offset + 2;\n\t\t\tuint32_t ptr_type_id = offset + 3;\n\t\t\tuint32_t var_id = offset + 4;\n\n\t\t\tSPIRType type { OpTypeInt };\n\t\t\tswitch (input.second.format)\n\t\t\t{\n\t\t\tcase MSL_SHADER_VARIABLE_FORMAT_UINT16:\n\t\t\tcase MSL_SHADER_VARIABLE_FORMAT_ANY16:\n\t\t\t\ttype.basetype = SPIRType::UShort;\n\t\t\t\ttype.width = 16;\n\t\t\t\tbreak;\n\t\t\tcase MSL_SHADER_VARIABLE_FORMAT_ANY32:\n\t\t\tdefault:\n\t\t\t\ttype.basetype = SPIRType::UInt;\n\t\t\t\ttype.width = 32;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tset<SPIRType>(type_id, type);\n\t\t\tif (input.second.vecsize > 1)\n\t\t\t{\n\t\t\t\ttype.op = OpTypeVector;\n\t\t\t\ttype.vecsize = input.second.vecsize;\n\t\t\t\tset<SPIRType>(vec_type_id, type);\n\t\t\t\ttype_id = vec_type_id;\n\t\t\t}\n\n\t\t\ttype.op = OpTypeArray;\n\t\t\ttype.array.push_back(0);\n\t\t\ttype.array_size_literal.push_back(true);\n\t\t\ttype.parent_type = type_id;\n\t\t\tset<SPIRType>(array_type_id, type);\n\t\t\ttype.self = type_id;\n\n\t\t\ttype.op = OpTypePointer;\n\t\t\ttype.pointer = true;\n\t\t\ttype.pointer_depth++;\n\t\t\ttype.parent_type = array_type_id;\n\t\t\ttype.storage = storage;\n\t\t\tauto &ptr_type = set<SPIRType>(ptr_type_id, type);\n\t\t\tptr_type.self = array_type_id;\n\n\t\t\tauto &fake_var = set<SPIRVariable>(var_id, ptr_type_id, storage);\n\t\t\tset_decoration(var_id, DecorationLocation, input.first.location);\n\t\t\tif (input.first.component)\n\t\t\t\tset_decoration(var_id, DecorationComponent, input.first.component);\n\n\t\t\tmeta.strip_array = true;\n\t\t\tmeta.allow_local_declaration = false;\n\t\t\tadd_variable_to_interface_block(storage, ib_var_ref, ib_type, fake_var, meta);\n\t\t}\n\t}\n\n\tif (capture_output_to_buffer && storage == StorageClassOutput)\n\t{\n\t\t// For captured output, add all inputs from the next stage to ensure\n\t\t// the struct containing them is the correct size and layout. This is\n\t\t// necessary for certain implicit builtins that may nonetheless be read,\n\t\t// even when they aren't written.\n\t\tfor (auto &output : outputs_by_location)\n\t\t{\n\t\t\tif (location_outputs_in_use.count(output.first.location) != 0)\n\t\t\t\tcontinue;\n\n\t\t\t// Create a fake variable to put at the location.\n\t\t\tuint32_t offset = ir.increase_bound_by(5);\n\t\t\tuint32_t type_id = offset;\n\t\t\tuint32_t vec_type_id = offset + 1;\n\t\t\tuint32_t array_type_id = offset + 2;\n\t\t\tuint32_t ptr_type_id = offset + 3;\n\t\t\tuint32_t var_id = offset + 4;\n\n\t\t\tSPIRType type { OpTypeInt };\n\t\t\tswitch (output.second.format)\n\t\t\t{\n\t\t\tcase MSL_SHADER_VARIABLE_FORMAT_UINT16:\n\t\t\tcase MSL_SHADER_VARIABLE_FORMAT_ANY16:\n\t\t\t\ttype.basetype = SPIRType::UShort;\n\t\t\t\ttype.width = 16;\n\t\t\t\tbreak;\n\t\t\tcase MSL_SHADER_VARIABLE_FORMAT_ANY32:\n\t\t\tdefault:\n\t\t\t\ttype.basetype = SPIRType::UInt;\n\t\t\t\ttype.width = 32;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tset<SPIRType>(type_id, type);\n\t\t\tif (output.second.vecsize > 1)\n\t\t\t{\n\t\t\t\ttype.op = OpTypeVector;\n\t\t\t\ttype.vecsize = output.second.vecsize;\n\t\t\t\tset<SPIRType>(vec_type_id, type);\n\t\t\t\ttype_id = vec_type_id;\n\t\t\t}\n\n\t\t\tif (is_tesc_shader())\n\t\t\t{\n\t\t\t\ttype.op = OpTypeArray;\n\t\t\t\ttype.array.push_back(0);\n\t\t\t\ttype.array_size_literal.push_back(true);\n\t\t\t\ttype.parent_type = type_id;\n\t\t\t\tset<SPIRType>(array_type_id, type);\n\t\t\t}\n\n\t\t\ttype.op = OpTypePointer;\n\t\t\ttype.pointer = true;\n\t\t\ttype.pointer_depth++;\n\t\t\ttype.parent_type = is_tesc_shader() ? array_type_id : type_id;\n\t\t\ttype.storage = storage;\n\t\t\tauto &ptr_type = set<SPIRType>(ptr_type_id, type);\n\t\t\tptr_type.self = type.parent_type;\n\n\t\t\tauto &fake_var = set<SPIRVariable>(var_id, ptr_type_id, storage);\n\t\t\tset_decoration(var_id, DecorationLocation, output.first.location);\n\t\t\tif (output.first.component)\n\t\t\t\tset_decoration(var_id, DecorationComponent, output.first.component);\n\n\t\t\tmeta.strip_array = true;\n\t\t\tmeta.allow_local_declaration = false;\n\t\t\tadd_variable_to_interface_block(storage, ib_var_ref, ib_type, fake_var, meta);\n\t\t}\n\t}\n\n\t// When multiple variables need to access same location,\n\t// unroll locations one by one and we will flatten output or input as necessary.\n\tfor (auto &loc : meta.location_meta)\n\t{\n\t\tuint32_t location = loc.first;\n\t\tauto &location_meta = loc.second;\n\n\t\tuint32_t ib_mbr_idx = uint32_t(ib_type.member_types.size());\n\t\tuint32_t type_id = build_extended_vector_type(location_meta.base_type_id, location_meta.num_components);\n\t\tib_type.member_types.push_back(type_id);\n\n\t\tset_member_name(ib_type.self, ib_mbr_idx, join(\"m_location_\", location));\n\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, location);\n\t\tmark_location_as_used_by_shader(location, get<SPIRType>(type_id), storage);\n\n\t\tif (location_meta.flat)\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationFlat);\n\t\tif (location_meta.noperspective)\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationNoPerspective);\n\t\tif (location_meta.centroid)\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationCentroid);\n\t\tif (location_meta.sample)\n\t\t\tset_member_decoration(ib_type.self, ib_mbr_idx, DecorationSample);\n\t}\n\n\t// Sort the members of the structure by their locations.\n\tMemberSorter member_sorter(ib_type, ir.meta[ib_type_id], MemberSorter::LocationThenBuiltInType);\n\tmember_sorter.sort();\n\n\t// The member indices were saved to the original variables, but after the members\n\t// were sorted, those indices are now likely incorrect. Fix those up now.\n\tfix_up_interface_member_indices(storage, ib_type_id);\n\n\t// For patch inputs, add one more member, holding the array of control point data.\n\tif (is_tese_shader() && !msl_options.raw_buffer_tese_input && storage == StorageClassInput && patch &&\n\t    stage_in_var_id)\n\t{\n\t\tuint32_t pcp_type_id = ir.increase_bound_by(1);\n\t\tauto &pcp_type = set<SPIRType>(pcp_type_id, ib_type);\n\t\tpcp_type.basetype = SPIRType::ControlPointArray;\n\t\tpcp_type.parent_type = pcp_type.type_alias = get_stage_in_struct_type().self;\n\t\tpcp_type.storage = storage;\n\t\tir.meta[pcp_type_id] = ir.meta[ib_type.self];\n\t\tuint32_t mbr_idx = uint32_t(ib_type.member_types.size());\n\t\tib_type.member_types.push_back(pcp_type_id);\n\t\tset_member_name(ib_type.self, mbr_idx, \"gl_in\");\n\t}\n\n\tif (storage == StorageClassInput)\n\t\tset_decoration(ib_var_id, DecorationNonWritable);\n\n\treturn ib_var_id;\n}\n\nuint32_t CompilerMSL::add_interface_block_pointer(uint32_t ib_var_id, StorageClass storage)\n{\n\tif (!ib_var_id)\n\t\treturn 0;\n\n\tuint32_t ib_ptr_var_id;\n\tuint32_t next_id = ir.increase_bound_by(3);\n\tauto &ib_type = expression_type(ib_var_id);\n\tif (is_tesc_shader() || (is_tese_shader() && msl_options.raw_buffer_tese_input))\n\t{\n\t\t// Tessellation control per-vertex I/O is presented as an array, so we must\n\t\t// do the same with our struct here.\n\t\tuint32_t ib_ptr_type_id = next_id++;\n\t\tauto &ib_ptr_type = set<SPIRType>(ib_ptr_type_id, ib_type);\n\t\tib_ptr_type.op = OpTypePointer;\n\t\tib_ptr_type.parent_type = ib_ptr_type.type_alias = ib_type.self;\n\t\tib_ptr_type.pointer = true;\n\t\tib_ptr_type.pointer_depth++;\n\t\tib_ptr_type.storage = storage == StorageClassInput ?\n\t\t                          ((is_tesc_shader() && msl_options.multi_patch_workgroup) ||\n\t\t                                   (is_tese_shader() && msl_options.raw_buffer_tese_input) ?\n\t\t                               StorageClassStorageBuffer :\n\t\t                               StorageClassWorkgroup) :\n\t\t                          StorageClassStorageBuffer;\n\t\tir.meta[ib_ptr_type_id] = ir.meta[ib_type.self];\n\t\t// To ensure that get_variable_data_type() doesn't strip off the pointer,\n\t\t// which we need, use another pointer.\n\t\tuint32_t ib_ptr_ptr_type_id = next_id++;\n\t\tauto &ib_ptr_ptr_type = set<SPIRType>(ib_ptr_ptr_type_id, ib_ptr_type);\n\t\tib_ptr_ptr_type.parent_type = ib_ptr_type_id;\n\t\tib_ptr_ptr_type.type_alias = ib_type.self;\n\t\tib_ptr_ptr_type.storage = StorageClassFunction;\n\t\tir.meta[ib_ptr_ptr_type_id] = ir.meta[ib_type.self];\n\n\t\tib_ptr_var_id = next_id;\n\t\tset<SPIRVariable>(ib_ptr_var_id, ib_ptr_ptr_type_id, StorageClassFunction, 0);\n\t\tset_name(ib_ptr_var_id, storage == StorageClassInput ? \"gl_in\" : \"gl_out\");\n\t\tif (storage == StorageClassInput)\n\t\t\tset_decoration(ib_ptr_var_id, DecorationNonWritable);\n\t}\n\telse\n\t{\n\t\t// Tessellation evaluation per-vertex inputs are also presented as arrays.\n\t\t// But, in Metal, this array uses a very special type, 'patch_control_point<T>',\n\t\t// which is a container that can be used to access the control point data.\n\t\t// To represent this, a special 'ControlPointArray' type has been added to the\n\t\t// SPIRV-Cross type system. It should only be generated by and seen in the MSL\n\t\t// backend (i.e. this one).\n\t\tuint32_t pcp_type_id = next_id++;\n\t\tauto &pcp_type = set<SPIRType>(pcp_type_id, ib_type);\n\t\tpcp_type.basetype = SPIRType::ControlPointArray;\n\t\tpcp_type.parent_type = pcp_type.type_alias = ib_type.self;\n\t\tpcp_type.storage = storage;\n\t\tir.meta[pcp_type_id] = ir.meta[ib_type.self];\n\n\t\tib_ptr_var_id = next_id;\n\t\tset<SPIRVariable>(ib_ptr_var_id, pcp_type_id, storage, 0);\n\t\tset_name(ib_ptr_var_id, \"gl_in\");\n\t\tir.meta[ib_ptr_var_id].decoration.qualified_alias = join(patch_stage_in_var_name, \".gl_in\");\n\t}\n\treturn ib_ptr_var_id;\n}\n\n// Ensure that the type is compatible with the builtin.\n// If it is, simply return the given type ID.\n// Otherwise, create a new type, and return it's ID.\nuint32_t CompilerMSL::ensure_correct_builtin_type(uint32_t type_id, BuiltIn builtin)\n{\n\tauto &type = get<SPIRType>(type_id);\n\tauto &pointee_type = get_pointee_type(type);\n\n\tif ((builtin == BuiltInSampleMask && is_array(pointee_type)) ||\n\t    ((builtin == BuiltInLayer || builtin == BuiltInViewportIndex || builtin == BuiltInFragStencilRefEXT) &&\n\t     pointee_type.basetype != SPIRType::UInt))\n\t{\n\t\tuint32_t next_id = ir.increase_bound_by(type_is_pointer(type) ? 2 : 1);\n\t\tuint32_t base_type_id = next_id++;\n\t\tauto &base_type = set<SPIRType>(base_type_id, OpTypeInt);\n\t\tbase_type.basetype = SPIRType::UInt;\n\t\tbase_type.width = 32;\n\n\t\tif (!type_is_pointer(type))\n\t\t\treturn base_type_id;\n\n\t\tuint32_t ptr_type_id = next_id++;\n\t\tauto &ptr_type = set<SPIRType>(ptr_type_id, base_type);\n\t\tptr_type.op = spv::OpTypePointer;\n\t\tptr_type.pointer = true;\n\t\tptr_type.pointer_depth++;\n\t\tptr_type.storage = type.storage;\n\t\tptr_type.parent_type = base_type_id;\n\t\treturn ptr_type_id;\n\t}\n\n\treturn type_id;\n}\n\n// Ensure that the type is compatible with the shader input.\n// If it is, simply return the given type ID.\n// Otherwise, create a new type, and return its ID.\nuint32_t CompilerMSL::ensure_correct_input_type(uint32_t type_id, uint32_t location, uint32_t component, uint32_t num_components, bool strip_array)\n{\n\tauto &type = get<SPIRType>(type_id);\n\n\tuint32_t max_array_dimensions = strip_array ? 1 : 0;\n\n\t// Struct and array types must match exactly.\n\tif (type.basetype == SPIRType::Struct || type.array.size() > max_array_dimensions)\n\t\treturn type_id;\n\n\tauto p_va = inputs_by_location.find({location, component});\n\tif (p_va == end(inputs_by_location))\n\t{\n\t\tif (num_components > type.vecsize)\n\t\t\treturn build_extended_vector_type(type_id, num_components);\n\t\telse\n\t\t\treturn type_id;\n\t}\n\n\tif (num_components == 0)\n\t\tnum_components = p_va->second.vecsize;\n\n\tswitch (p_va->second.format)\n\t{\n\tcase MSL_SHADER_VARIABLE_FORMAT_UINT8:\n\t{\n\t\tswitch (type.basetype)\n\t\t{\n\t\tcase SPIRType::UByte:\n\t\tcase SPIRType::UShort:\n\t\tcase SPIRType::UInt:\n\t\t\tif (num_components > type.vecsize)\n\t\t\t\treturn build_extended_vector_type(type_id, num_components);\n\t\t\telse\n\t\t\t\treturn type_id;\n\n\t\tcase SPIRType::Short:\n\t\t\treturn build_extended_vector_type(type_id, num_components > type.vecsize ? num_components : type.vecsize,\n\t\t\t                                  SPIRType::UShort);\n\t\tcase SPIRType::Int:\n\t\t\treturn build_extended_vector_type(type_id, num_components > type.vecsize ? num_components : type.vecsize,\n\t\t\t                                  SPIRType::UInt);\n\n\t\tdefault:\n\t\t\tSPIRV_CROSS_THROW(\"Vertex attribute type mismatch between host and shader\");\n\t\t}\n\t}\n\n\tcase MSL_SHADER_VARIABLE_FORMAT_UINT16:\n\t{\n\t\tswitch (type.basetype)\n\t\t{\n\t\tcase SPIRType::UShort:\n\t\tcase SPIRType::UInt:\n\t\t\tif (num_components > type.vecsize)\n\t\t\t\treturn build_extended_vector_type(type_id, num_components);\n\t\t\telse\n\t\t\t\treturn type_id;\n\n\t\tcase SPIRType::Int:\n\t\t\treturn build_extended_vector_type(type_id, num_components > type.vecsize ? num_components : type.vecsize,\n\t\t\t                                  SPIRType::UInt);\n\n\t\tdefault:\n\t\t\tSPIRV_CROSS_THROW(\"Vertex attribute type mismatch between host and shader\");\n\t\t}\n\t}\n\n\tdefault:\n\t\tif (num_components > type.vecsize)\n\t\t\ttype_id = build_extended_vector_type(type_id, num_components);\n\t\tbreak;\n\t}\n\n\treturn type_id;\n}\n\nvoid CompilerMSL::mark_struct_members_packed(const SPIRType &type)\n{\n\t// Handle possible recursion when a struct contains a pointer to its own type nested somewhere.\n\tif (has_extended_decoration(type.self, SPIRVCrossDecorationPhysicalTypePacked))\n\t\treturn;\n\n\tset_extended_decoration(type.self, SPIRVCrossDecorationPhysicalTypePacked);\n\n\t// Problem case! Struct needs to be placed at an awkward alignment.\n\t// Mark every member of the child struct as packed.\n\tuint32_t mbr_cnt = uint32_t(type.member_types.size());\n\tfor (uint32_t i = 0; i < mbr_cnt; i++)\n\t{\n\t\tauto &mbr_type = get<SPIRType>(type.member_types[i]);\n\t\tif (mbr_type.basetype == SPIRType::Struct)\n\t\t{\n\t\t\t// Recursively mark structs as packed.\n\t\t\tauto *struct_type = &mbr_type;\n\t\t\twhile (!struct_type->array.empty())\n\t\t\t\tstruct_type = &get<SPIRType>(struct_type->parent_type);\n\t\t\tmark_struct_members_packed(*struct_type);\n\t\t}\n\t\telse if (!is_scalar(mbr_type))\n\t\t\tset_extended_member_decoration(type.self, i, SPIRVCrossDecorationPhysicalTypePacked);\n\t}\n}\n\nvoid CompilerMSL::mark_scalar_layout_structs(const SPIRType &type)\n{\n\tuint32_t mbr_cnt = uint32_t(type.member_types.size());\n\tfor (uint32_t i = 0; i < mbr_cnt; i++)\n\t{\n\t\t// Handle possible recursion when a struct contains a pointer to its own type nested somewhere.\n\t\tauto &mbr_type = get<SPIRType>(type.member_types[i]);\n\t\tif (mbr_type.basetype == SPIRType::Struct && !(mbr_type.pointer && mbr_type.storage == StorageClassPhysicalStorageBuffer))\n\t\t{\n\t\t\tauto *struct_type = &mbr_type;\n\t\t\twhile (!struct_type->array.empty())\n\t\t\t\tstruct_type = &get<SPIRType>(struct_type->parent_type);\n\n\t\t\tif (has_extended_decoration(struct_type->self, SPIRVCrossDecorationPhysicalTypePacked))\n\t\t\t\tcontinue;\n\n\t\t\tuint32_t msl_alignment = get_declared_struct_member_alignment_msl(type, i);\n\t\t\tuint32_t msl_size = get_declared_struct_member_size_msl(type, i);\n\t\t\tuint32_t spirv_offset = type_struct_member_offset(type, i);\n\t\t\tuint32_t spirv_offset_next;\n\t\t\tif (i + 1 < mbr_cnt)\n\t\t\t\tspirv_offset_next = type_struct_member_offset(type, i + 1);\n\t\t\telse\n\t\t\t\tspirv_offset_next = spirv_offset + msl_size;\n\n\t\t\t// Both are complicated cases. In scalar layout, a struct of float3 might just consume 12 bytes,\n\t\t\t// and the next member will be placed at offset 12.\n\t\t\tbool struct_is_misaligned = (spirv_offset % msl_alignment) != 0;\n\t\t\tbool struct_is_too_large = spirv_offset + msl_size > spirv_offset_next;\n\t\t\tuint32_t array_stride = 0;\n\t\t\tbool struct_needs_explicit_padding = false;\n\n\t\t\t// Verify that if a struct is used as an array that ArrayStride matches the effective size of the struct.\n\t\t\tif (!mbr_type.array.empty())\n\t\t\t{\n\t\t\t\tarray_stride = type_struct_member_array_stride(type, i);\n\t\t\t\tuint32_t dimensions = uint32_t(mbr_type.array.size() - 1);\n\t\t\t\tfor (uint32_t dim = 0; dim < dimensions; dim++)\n\t\t\t\t{\n\t\t\t\t\tuint32_t array_size = to_array_size_literal(mbr_type, dim);\n\t\t\t\t\tarray_stride /= max<uint32_t>(array_size, 1u);\n\t\t\t\t}\n\n\t\t\t\t// Set expected struct size based on ArrayStride.\n\t\t\t\tstruct_needs_explicit_padding = true;\n\n\t\t\t\t// If struct size is larger than array stride, we might be able to fit, if we tightly pack.\n\t\t\t\tif (get_declared_struct_size_msl(*struct_type) > array_stride)\n\t\t\t\t\tstruct_is_too_large = true;\n\t\t\t}\n\n\t\t\tif (struct_is_misaligned || struct_is_too_large)\n\t\t\t\tmark_struct_members_packed(*struct_type);\n\t\t\tmark_scalar_layout_structs(*struct_type);\n\n\t\t\tif (struct_needs_explicit_padding)\n\t\t\t{\n\t\t\t\tmsl_size = get_declared_struct_size_msl(*struct_type, true, true);\n\t\t\t\tif (array_stride < msl_size)\n\t\t\t\t{\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Cannot express an array stride smaller than size of struct type.\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (has_extended_decoration(struct_type->self, SPIRVCrossDecorationPaddingTarget))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (array_stride !=\n\t\t\t\t\t\t    get_extended_decoration(struct_type->self, SPIRVCrossDecorationPaddingTarget))\n\t\t\t\t\t\t\tSPIRV_CROSS_THROW(\n\t\t\t\t\t\t\t    \"A struct is used with different array strides. Cannot express this in MSL.\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tset_extended_decoration(struct_type->self, SPIRVCrossDecorationPaddingTarget, array_stride);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Sort the members of the struct type by offset, and pack and then pad members where needed\n// to align MSL members with SPIR-V offsets. The struct members are iterated twice. Packing\n// occurs first, followed by padding, because packing a member reduces both its size and its\n// natural alignment, possibly requiring a padding member to be added ahead of it.\nvoid CompilerMSL::align_struct(SPIRType &ib_type, unordered_set<uint32_t> &aligned_structs)\n{\n\t// We align structs recursively, so stop any redundant work.\n\tID &ib_type_id = ib_type.self;\n\tif (aligned_structs.count(ib_type_id))\n\t\treturn;\n\taligned_structs.insert(ib_type_id);\n\n\t// Sort the members of the interface structure by their offset.\n\t// They should already be sorted per SPIR-V spec anyway.\n\tMemberSorter member_sorter(ib_type, ir.meta[ib_type_id], MemberSorter::Offset);\n\tmember_sorter.sort();\n\n\tauto mbr_cnt = uint32_t(ib_type.member_types.size());\n\n\tfor (uint32_t mbr_idx = 0; mbr_idx < mbr_cnt; mbr_idx++)\n\t{\n\t\t// Pack any dependent struct types before we pack a parent struct.\n\t\tauto &mbr_type = get<SPIRType>(ib_type.member_types[mbr_idx]);\n\t\tif (mbr_type.basetype == SPIRType::Struct)\n\t\t\talign_struct(mbr_type, aligned_structs);\n\t}\n\n\t// Test the alignment of each member, and if a member should be closer to the previous\n\t// member than the default spacing expects, it is likely that the previous member is in\n\t// a packed format. If so, and the previous member is packable, pack it.\n\t// For example ... this applies to any 3-element vector that is followed by a scalar.\n\tuint32_t msl_offset = 0;\n\tfor (uint32_t mbr_idx = 0; mbr_idx < mbr_cnt; mbr_idx++)\n\t{\n\t\t// This checks the member in isolation, if the member needs some kind of type remapping to conform to SPIR-V\n\t\t// offsets, array strides and matrix strides.\n\t\tensure_member_packing_rules_msl(ib_type, mbr_idx);\n\n\t\t// Align current offset to the current member's default alignment. If the member was packed, it will observe\n\t\t// the updated alignment here.\n\t\tuint32_t msl_align_mask = get_declared_struct_member_alignment_msl(ib_type, mbr_idx) - 1;\n\t\tuint32_t aligned_msl_offset = (msl_offset + msl_align_mask) & ~msl_align_mask;\n\n\t\t// Fetch the member offset as declared in the SPIRV.\n\t\tuint32_t spirv_mbr_offset = get_member_decoration(ib_type_id, mbr_idx, DecorationOffset);\n\t\tif (spirv_mbr_offset > aligned_msl_offset)\n\t\t{\n\t\t\t// Since MSL and SPIR-V have slightly different struct member alignment and\n\t\t\t// size rules, we'll pad to standard C-packing rules with a char[] array. If the member is farther\n\t\t\t// away than C-packing, expects, add an inert padding member before the the member.\n\t\t\tuint32_t padding_bytes = spirv_mbr_offset - aligned_msl_offset;\n\t\t\tset_extended_member_decoration(ib_type_id, mbr_idx, SPIRVCrossDecorationPaddingTarget, padding_bytes);\n\n\t\t\t// Re-align as a sanity check that aligning post-padding matches up.\n\t\t\tmsl_offset += padding_bytes;\n\t\t\taligned_msl_offset = (msl_offset + msl_align_mask) & ~msl_align_mask;\n\t\t}\n\t\telse if (spirv_mbr_offset < aligned_msl_offset)\n\t\t{\n\t\t\t// This should not happen, but deal with unexpected scenarios.\n\t\t\t// It *might* happen if a sub-struct has a larger alignment requirement in MSL than SPIR-V.\n\t\t\tSPIRV_CROSS_THROW(\"Cannot represent buffer block correctly in MSL.\");\n\t\t}\n\n\t\tassert(aligned_msl_offset == spirv_mbr_offset);\n\n\t\t// Increment the current offset to be positioned immediately after the current member.\n\t\t// Don't do this for the last member since it can be unsized, and it is not relevant for padding purposes here.\n\t\tif (mbr_idx + 1 < mbr_cnt)\n\t\t\tmsl_offset = aligned_msl_offset + get_declared_struct_member_size_msl(ib_type, mbr_idx);\n\t}\n}\n\nbool CompilerMSL::validate_member_packing_rules_msl(const SPIRType &type, uint32_t index) const\n{\n\tauto &mbr_type = get<SPIRType>(type.member_types[index]);\n\tuint32_t spirv_offset = get_member_decoration(type.self, index, DecorationOffset);\n\n\tif (index + 1 < type.member_types.size())\n\t{\n\t\t// First, we will check offsets. If SPIR-V offset + MSL size > SPIR-V offset of next member,\n\t\t// we *must* perform some kind of remapping, no way getting around it.\n\t\t// We can always pad after this member if necessary, so that case is fine.\n\t\tuint32_t spirv_offset_next = get_member_decoration(type.self, index + 1, DecorationOffset);\n\t\tassert(spirv_offset_next >= spirv_offset);\n\t\tuint32_t maximum_size = spirv_offset_next - spirv_offset;\n\t\tuint32_t msl_mbr_size = get_declared_struct_member_size_msl(type, index);\n\t\tif (msl_mbr_size > maximum_size)\n\t\t\treturn false;\n\t}\n\n\tif (!mbr_type.array.empty())\n\t{\n\t\t// If we have an array type, array stride must match exactly with SPIR-V.\n\n\t\t// An exception to this requirement is if we have one array element.\n\t\t// This comes from DX scalar layout workaround.\n\t\t// If app tries to be cheeky and access the member out of bounds, this will not work, but this is the best we can do.\n\t\t// In OpAccessChain with logical memory models, access chains must be in-bounds in SPIR-V specification.\n\t\tbool relax_array_stride = mbr_type.array.back() == 1 && mbr_type.array_size_literal.back();\n\n\t\tif (!relax_array_stride)\n\t\t{\n\t\t\tuint32_t spirv_array_stride = type_struct_member_array_stride(type, index);\n\t\t\tuint32_t msl_array_stride = get_declared_struct_member_array_stride_msl(type, index);\n\t\t\tif (spirv_array_stride != msl_array_stride)\n\t\t\t\treturn false;\n\t\t}\n\t}\n\n\tif (is_matrix(mbr_type))\n\t{\n\t\t// Need to check MatrixStride as well.\n\t\tuint32_t spirv_matrix_stride = type_struct_member_matrix_stride(type, index);\n\t\tuint32_t msl_matrix_stride = get_declared_struct_member_matrix_stride_msl(type, index);\n\t\tif (spirv_matrix_stride != msl_matrix_stride)\n\t\t\treturn false;\n\t}\n\n\t// Now, we check alignment.\n\tuint32_t msl_alignment = get_declared_struct_member_alignment_msl(type, index);\n\tif ((spirv_offset % msl_alignment) != 0)\n\t\treturn false;\n\n\t// We're in the clear.\n\treturn true;\n}\n\n// Here we need to verify that the member type we declare conforms to Offset, ArrayStride or MatrixStride restrictions.\n// If there is a mismatch, we need to emit remapped types, either normal types, or \"packed_X\" types.\n// In odd cases we need to emit packed and remapped types, for e.g. weird matrices or arrays with weird array strides.\nvoid CompilerMSL::ensure_member_packing_rules_msl(SPIRType &ib_type, uint32_t index)\n{\n\tif (validate_member_packing_rules_msl(ib_type, index))\n\t\treturn;\n\n\t// We failed validation.\n\t// This case will be nightmare-ish to deal with. This could possibly happen if struct alignment does not quite\n\t// match up with what we want. Scalar block layout comes to mind here where we might have to work around the rule\n\t// that struct alignment == max alignment of all members and struct size depends on this alignment.\n\t// Can't repack structs, but can repack pointers to structs.\n\tauto &mbr_type = get<SPIRType>(ib_type.member_types[index]);\n\tbool is_buff_ptr = mbr_type.pointer && mbr_type.storage == StorageClassPhysicalStorageBuffer;\n\tif (mbr_type.basetype == SPIRType::Struct && !is_buff_ptr)\n\t\tSPIRV_CROSS_THROW(\"Cannot perform any repacking for structs when it is used as a member of another struct.\");\n\n\t// Perform remapping here.\n\t// There is nothing to be gained by using packed scalars, so don't attempt it.\n\tif (!is_scalar(ib_type))\n\t\tset_extended_member_decoration(ib_type.self, index, SPIRVCrossDecorationPhysicalTypePacked);\n\n\t// Try validating again, now with packed.\n\tif (validate_member_packing_rules_msl(ib_type, index))\n\t\treturn;\n\n\t// We're in deep trouble, and we need to create a new PhysicalType which matches up with what we expect.\n\t// A lot of work goes here ...\n\t// We will need remapping on Load and Store to translate the types between Logical and Physical.\n\n\t// First, we check if we have small vector std140 array.\n\t// We detect this if we have an array of vectors, and array stride is greater than number of elements.\n\tif (!mbr_type.array.empty() && !is_matrix(mbr_type))\n\t{\n\t\tuint32_t array_stride = type_struct_member_array_stride(ib_type, index);\n\n\t\t// Hack off array-of-arrays until we find the array stride per element we must have to make it work.\n\t\tuint32_t dimensions = uint32_t(mbr_type.array.size() - 1);\n\t\tfor (uint32_t dim = 0; dim < dimensions; dim++)\n\t\t\tarray_stride /= max<uint32_t>(to_array_size_literal(mbr_type, dim), 1u);\n\n\t\t// Pointers are 8 bytes\n\t\tuint32_t mbr_width_in_bytes = is_buff_ptr ? 8 : (mbr_type.width / 8);\n\t\tuint32_t elems_per_stride = array_stride / mbr_width_in_bytes;\n\n\t\tif (elems_per_stride == 3)\n\t\t\tSPIRV_CROSS_THROW(\"Cannot use ArrayStride of 3 elements in remapping scenarios.\");\n\t\telse if (elems_per_stride > 4 && elems_per_stride != 8)\n\t\t\tSPIRV_CROSS_THROW(\"Cannot represent vectors with more than 4 elements in MSL.\");\n\n\t\tif (elems_per_stride == 8)\n\t\t{\n\t\t\tif (mbr_type.width == 16)\n\t\t\t\tadd_spv_func_and_recompile(SPVFuncImplPaddedStd140);\n\t\t\telse\n\t\t\t\tSPIRV_CROSS_THROW(\"Unexpected type in std140 wide array resolve.\");\n\t\t}\n\n\t\tauto physical_type = mbr_type;\n\t\tphysical_type.vecsize = elems_per_stride;\n\t\tphysical_type.parent_type = 0;\n\n\t\t// If this is a physical buffer pointer, replace type with a ulongn vector.\n\t\tif (is_buff_ptr)\n\t\t{\n\t\t\tphysical_type.width = 64;\n\t\t\tphysical_type.basetype = to_unsigned_basetype(physical_type.width);\n\t\t\tphysical_type.pointer = false;\n\t\t\tphysical_type.pointer_depth = false;\n\t\t\tphysical_type.forward_pointer = false;\n\t\t}\n\n\t\tuint32_t type_id = ir.increase_bound_by(1);\n\t\tset<SPIRType>(type_id, physical_type);\n\t\tset_extended_member_decoration(ib_type.self, index, SPIRVCrossDecorationPhysicalTypeID, type_id);\n\t\tset_decoration(type_id, DecorationArrayStride, array_stride);\n\n\t\t// Remove packed_ for vectors of size 1, 2 and 4.\n\t\tunset_extended_member_decoration(ib_type.self, index, SPIRVCrossDecorationPhysicalTypePacked);\n\t}\n\telse if (is_matrix(mbr_type))\n\t{\n\t\t// MatrixStride might be std140-esque.\n\t\tuint32_t matrix_stride = type_struct_member_matrix_stride(ib_type, index);\n\n\t\tuint32_t elems_per_stride = matrix_stride / (mbr_type.width / 8);\n\n\t\tif (elems_per_stride == 3)\n\t\t\tSPIRV_CROSS_THROW(\"Cannot use ArrayStride of 3 elements in remapping scenarios.\");\n\t\telse if (elems_per_stride > 4 && elems_per_stride != 8)\n\t\t\tSPIRV_CROSS_THROW(\"Cannot represent vectors with more than 4 elements in MSL.\");\n\n\t\tif (elems_per_stride == 8)\n\t\t{\n\t\t\tif (mbr_type.basetype != SPIRType::Half)\n\t\t\t\tSPIRV_CROSS_THROW(\"Unexpected type in std140 wide matrix stride resolve.\");\n\t\t\tadd_spv_func_and_recompile(SPVFuncImplPaddedStd140);\n\t\t}\n\n\t\tbool row_major = has_member_decoration(ib_type.self, index, DecorationRowMajor);\n\t\tauto physical_type = mbr_type;\n\t\tphysical_type.parent_type = 0;\n\n\t\tif (row_major)\n\t\t\tphysical_type.columns = elems_per_stride;\n\t\telse\n\t\t\tphysical_type.vecsize = elems_per_stride;\n\t\tuint32_t type_id = ir.increase_bound_by(1);\n\t\tset<SPIRType>(type_id, physical_type);\n\t\tset_extended_member_decoration(ib_type.self, index, SPIRVCrossDecorationPhysicalTypeID, type_id);\n\n\t\t// Remove packed_ for vectors of size 1, 2 and 4.\n\t\tunset_extended_member_decoration(ib_type.self, index, SPIRVCrossDecorationPhysicalTypePacked);\n\t}\n\telse\n\t\tSPIRV_CROSS_THROW(\"Found a buffer packing case which we cannot represent in MSL.\");\n\n\t// Try validating again, now with physical type remapping.\n\tif (validate_member_packing_rules_msl(ib_type, index))\n\t\treturn;\n\n\t// We might have a particular odd scalar layout case where the last element of an array\n\t// does not take up as much space as the ArrayStride or MatrixStride. This can happen with DX cbuffers.\n\t// The \"proper\" workaround for this is extremely painful and essentially impossible in the edge case of float3[],\n\t// so we hack around it by declaring the offending array or matrix with one less array size/col/row,\n\t// and rely on padding to get the correct value. We will technically access arrays out of bounds into the padding region,\n\t// but it should spill over gracefully without too much trouble. We rely on behavior like this for unsized arrays anyways.\n\n\t// E.g. we might observe a physical layout of:\n\t// { float2 a[2]; float b; } in cbuffer layout where ArrayStride of a is 16, but offset of b is 24, packed right after a[1] ...\n\tuint32_t type_id = get_extended_member_decoration(ib_type.self, index, SPIRVCrossDecorationPhysicalTypeID);\n\tauto &type = get<SPIRType>(type_id);\n\n\t// Modify the physical type in-place. This is safe since each physical type workaround is a copy.\n\tif (is_array(type))\n\t{\n\t\tif (type.array.back() > 1)\n\t\t{\n\t\t\tif (!type.array_size_literal.back())\n\t\t\t\tSPIRV_CROSS_THROW(\"Cannot apply scalar layout workaround with spec constant array size.\");\n\t\t\ttype.array.back() -= 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// We have an array of size 1, so we cannot decrement that. Our only option now is to\n\t\t\t// force a packed layout instead, and drop the physical type remap since ArrayStride is meaningless now.\n\t\t\tunset_extended_member_decoration(ib_type.self, index, SPIRVCrossDecorationPhysicalTypeID);\n\t\t\tset_extended_member_decoration(ib_type.self, index, SPIRVCrossDecorationPhysicalTypePacked);\n\t\t}\n\t}\n\telse if (is_matrix(type))\n\t{\n\t\tbool row_major = has_member_decoration(ib_type.self, index, DecorationRowMajor);\n\t\tif (!row_major)\n\t\t{\n\t\t\t// Slice off one column. If we only have 2 columns, this might turn the matrix into a vector with one array element instead.\n\t\t\tif (type.columns > 2)\n\t\t\t{\n\t\t\t\ttype.columns--;\n\t\t\t}\n\t\t\telse if (type.columns == 2)\n\t\t\t{\n\t\t\t\ttype.columns = 1;\n\t\t\t\tassert(type.array.empty());\n\t\t\t\ttype.op = OpTypeArray;\n\t\t\t\ttype.array.push_back(1);\n\t\t\t\ttype.array_size_literal.push_back(true);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Slice off one row. If we only have 2 rows, this might turn the matrix into a vector with one array element instead.\n\t\t\tif (type.vecsize > 2)\n\t\t\t{\n\t\t\t\ttype.vecsize--;\n\t\t\t}\n\t\t\telse if (type.vecsize == 2)\n\t\t\t{\n\t\t\t\ttype.vecsize = type.columns;\n\t\t\t\ttype.columns = 1;\n\t\t\t\tassert(type.array.empty());\n\t\t\t\ttype.op = OpTypeArray;\n\t\t\t\ttype.array.push_back(1);\n\t\t\t\ttype.array_size_literal.push_back(true);\n\t\t\t}\n\t\t}\n\t}\n\n\t// This better validate now, or we must fail gracefully.\n\tif (!validate_member_packing_rules_msl(ib_type, index))\n\t\tSPIRV_CROSS_THROW(\"Found a buffer packing case which we cannot represent in MSL.\");\n}\n\nvoid CompilerMSL::emit_store_statement(uint32_t lhs_expression, uint32_t rhs_expression)\n{\n\tauto &type = expression_type(rhs_expression);\n\n\tbool lhs_remapped_type = has_extended_decoration(lhs_expression, SPIRVCrossDecorationPhysicalTypeID);\n\tbool lhs_packed_type = has_extended_decoration(lhs_expression, SPIRVCrossDecorationPhysicalTypePacked);\n\tauto *lhs_e = maybe_get<SPIRExpression>(lhs_expression);\n\tauto *rhs_e = maybe_get<SPIRExpression>(rhs_expression);\n\n\tbool transpose = lhs_e && lhs_e->need_transpose;\n\n\tif (has_decoration(lhs_expression, DecorationBuiltIn) &&\n\t    BuiltIn(get_decoration(lhs_expression, DecorationBuiltIn)) == BuiltInSampleMask &&\n\t    is_array(type))\n\t{\n\t\t// Storing an array to SampleMask, have to remove the array-ness before storing.\n\t\tstatement(to_expression(lhs_expression), \" = \", to_enclosed_unpacked_expression(rhs_expression), \"[0];\");\n\t\tregister_write(lhs_expression);\n\t}\n\telse if (!lhs_remapped_type && !lhs_packed_type)\n\t{\n\t\t// No physical type remapping, and no packed type, so can just emit a store directly.\n\n\t\t// We might not be dealing with remapped physical types or packed types,\n\t\t// but we might be doing a clean store to a row-major matrix.\n\t\t// In this case, we just flip transpose states, and emit the store, a transpose must be in the RHS expression, if any.\n\t\tif (is_matrix(type) && lhs_e && lhs_e->need_transpose)\n\t\t{\n\t\t\tlhs_e->need_transpose = false;\n\n\t\t\tif (rhs_e && rhs_e->need_transpose)\n\t\t\t{\n\t\t\t\t// Direct copy, but might need to unpack RHS.\n\t\t\t\t// Skip the transpose, as we will transpose when writing to LHS and transpose(transpose(T)) == T.\n\t\t\t\trhs_e->need_transpose = false;\n\t\t\t\tstatement(to_expression(lhs_expression), \" = \", to_unpacked_row_major_matrix_expression(rhs_expression),\n\t\t\t\t          \";\");\n\t\t\t\trhs_e->need_transpose = true;\n\t\t\t}\n\t\t\telse\n\t\t\t\tstatement(to_expression(lhs_expression), \" = transpose(\", to_unpacked_expression(rhs_expression), \");\");\n\n\t\t\tlhs_e->need_transpose = true;\n\t\t\tregister_write(lhs_expression);\n\t\t}\n\t\telse if (lhs_e && lhs_e->need_transpose)\n\t\t{\n\t\t\tlhs_e->need_transpose = false;\n\n\t\t\t// Storing a column to a row-major matrix. Unroll the write.\n\t\t\tfor (uint32_t c = 0; c < type.vecsize; c++)\n\t\t\t{\n\t\t\t\tauto lhs_expr = to_dereferenced_expression(lhs_expression);\n\t\t\t\tauto column_index = lhs_expr.find_last_of('[');\n\t\t\t\tif (column_index != string::npos)\n\t\t\t\t{\n\t\t\t\t\tstatement(lhs_expr.insert(column_index, join('[', c, ']')), \" = \",\n\t\t\t\t\t          to_extract_component_expression(rhs_expression, c), \";\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tlhs_e->need_transpose = true;\n\t\t\tregister_write(lhs_expression);\n\t\t}\n\t\telse\n\t\t\tCompilerGLSL::emit_store_statement(lhs_expression, rhs_expression);\n\t}\n\telse if (!lhs_remapped_type && !is_matrix(type) && !transpose)\n\t{\n\t\t// Even if the target type is packed, we can directly store to it. We cannot store to packed matrices directly,\n\t\t// since they are declared as array of vectors instead, and we need the fallback path below.\n\t\tCompilerGLSL::emit_store_statement(lhs_expression, rhs_expression);\n\t}\n\telse\n\t{\n\t\t// Special handling when storing to a remapped physical type.\n\t\t// This is mostly to deal with std140 padded matrices or vectors.\n\n\t\tTypeID physical_type_id = lhs_remapped_type ?\n\t\t                              ID(get_extended_decoration(lhs_expression, SPIRVCrossDecorationPhysicalTypeID)) :\n\t\t                              type.self;\n\n\t\tauto &physical_type = get<SPIRType>(physical_type_id);\n\n\t\tstring cast_addr_space = \"thread\";\n\t\tauto *p_var_lhs = maybe_get_backing_variable(lhs_expression);\n\t\tif (p_var_lhs)\n\t\t\tcast_addr_space = get_type_address_space(get<SPIRType>(p_var_lhs->basetype), lhs_expression);\n\n\t\tif (is_matrix(type))\n\t\t{\n\t\t\tconst char *packed_pfx = lhs_packed_type ? \"packed_\" : \"\";\n\n\t\t\t// Packed matrices are stored as arrays of packed vectors, so we need\n\t\t\t// to assign the vectors one at a time.\n\t\t\t// For row-major matrices, we need to transpose the *right-hand* side,\n\t\t\t// not the left-hand side.\n\n\t\t\t// Lots of cases to cover here ...\n\n\t\t\tbool rhs_transpose = rhs_e && rhs_e->need_transpose;\n\t\t\tSPIRType write_type = type;\n\t\t\tstring cast_expr;\n\n\t\t\t// We're dealing with transpose manually.\n\t\t\tif (rhs_transpose)\n\t\t\t\trhs_e->need_transpose = false;\n\n\t\t\tif (transpose)\n\t\t\t{\n\t\t\t\t// We're dealing with transpose manually.\n\t\t\t\tlhs_e->need_transpose = false;\n\t\t\t\twrite_type.vecsize = type.columns;\n\t\t\t\twrite_type.columns = 1;\n\n\t\t\t\tif (physical_type.columns != type.columns)\n\t\t\t\t\tcast_expr = join(\"(\", cast_addr_space, \" \", packed_pfx, type_to_glsl(write_type), \"&)\");\n\n\t\t\t\tif (rhs_transpose)\n\t\t\t\t{\n\t\t\t\t\t// If RHS is also transposed, we can just copy row by row.\n\t\t\t\t\tfor (uint32_t i = 0; i < type.vecsize; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(cast_expr, to_enclosed_expression(lhs_expression), \"[\", i, \"]\", \" = \",\n\t\t\t\t\t\t          to_unpacked_row_major_matrix_expression(rhs_expression), \"[\", i, \"];\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tauto vector_type = expression_type(rhs_expression);\n\t\t\t\t\tvector_type.vecsize = vector_type.columns;\n\t\t\t\t\tvector_type.columns = 1;\n\n\t\t\t\t\t// Transpose on the fly. Emitting a lot of full transpose() ops and extracting lanes seems very bad,\n\t\t\t\t\t// so pick out individual components instead.\n\t\t\t\t\tfor (uint32_t i = 0; i < type.vecsize; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tstring rhs_row = type_to_glsl_constructor(vector_type) + \"(\";\n\t\t\t\t\t\tfor (uint32_t j = 0; j < vector_type.vecsize; j++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trhs_row += join(to_enclosed_unpacked_expression(rhs_expression), \"[\", j, \"][\", i, \"]\");\n\t\t\t\t\t\t\tif (j + 1 < vector_type.vecsize)\n\t\t\t\t\t\t\t\trhs_row += \", \";\n\t\t\t\t\t\t}\n\t\t\t\t\t\trhs_row += \")\";\n\n\t\t\t\t\t\tstatement(cast_expr, to_enclosed_expression(lhs_expression), \"[\", i, \"]\", \" = \", rhs_row, \";\");\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// We're dealing with transpose manually.\n\t\t\t\tlhs_e->need_transpose = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twrite_type.columns = 1;\n\n\t\t\t\tif (physical_type.vecsize != type.vecsize)\n\t\t\t\t\tcast_expr = join(\"(\", cast_addr_space, \" \", packed_pfx, type_to_glsl(write_type), \"&)\");\n\n\t\t\t\tif (rhs_transpose)\n\t\t\t\t{\n\t\t\t\t\tauto vector_type = expression_type(rhs_expression);\n\t\t\t\t\tvector_type.columns = 1;\n\n\t\t\t\t\t// Transpose on the fly. Emitting a lot of full transpose() ops and extracting lanes seems very bad,\n\t\t\t\t\t// so pick out individual components instead.\n\t\t\t\t\tfor (uint32_t i = 0; i < type.columns; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tstring rhs_row = type_to_glsl_constructor(vector_type) + \"(\";\n\t\t\t\t\t\tfor (uint32_t j = 0; j < vector_type.vecsize; j++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Need to explicitly unpack expression since we've mucked with transpose state.\n\t\t\t\t\t\t\tauto unpacked_expr = to_unpacked_row_major_matrix_expression(rhs_expression);\n\t\t\t\t\t\t\trhs_row += join(unpacked_expr, \"[\", j, \"][\", i, \"]\");\n\t\t\t\t\t\t\tif (j + 1 < vector_type.vecsize)\n\t\t\t\t\t\t\t\trhs_row += \", \";\n\t\t\t\t\t\t}\n\t\t\t\t\t\trhs_row += \")\";\n\n\t\t\t\t\t\tstatement(cast_expr, to_enclosed_expression(lhs_expression), \"[\", i, \"]\", \" = \", rhs_row, \";\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Copy column-by-column.\n\t\t\t\t\tfor (uint32_t i = 0; i < type.columns; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(cast_expr, to_enclosed_expression(lhs_expression), \"[\", i, \"]\", \" = \",\n\t\t\t\t\t\t          to_enclosed_unpacked_expression(rhs_expression), \"[\", i, \"];\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// We're dealing with transpose manually.\n\t\t\tif (rhs_transpose)\n\t\t\t\trhs_e->need_transpose = true;\n\t\t}\n\t\telse if (transpose)\n\t\t{\n\t\t\tlhs_e->need_transpose = false;\n\n\t\t\tSPIRType write_type = type;\n\t\t\twrite_type.vecsize = 1;\n\t\t\twrite_type.columns = 1;\n\n\t\t\t// Storing a column to a row-major matrix. Unroll the write.\n\t\t\tfor (uint32_t c = 0; c < type.vecsize; c++)\n\t\t\t{\n\t\t\t\tauto lhs_expr = to_enclosed_expression(lhs_expression);\n\t\t\t\tauto column_index = lhs_expr.find_last_of('[');\n\n\t\t\t\t// Get rid of any \".data\" half8 handling here, we're casting to scalar anyway.\n\t\t\t\tauto end_column_index = lhs_expr.find_last_of(']');\n\t\t\t\tauto end_dot_index = lhs_expr.find_last_of('.');\n\t\t\t\tif (end_dot_index != string::npos && end_dot_index > end_column_index)\n\t\t\t\t\tlhs_expr.resize(end_dot_index);\n\n\t\t\t\tif (column_index != string::npos)\n\t\t\t\t{\n\t\t\t\t\tstatement(\"((\", cast_addr_space, \" \", type_to_glsl(write_type), \"*)&\",\n\t\t\t\t\t          lhs_expr.insert(column_index, join('[', c, ']', \")\")), \" = \",\n\t\t\t\t\t          to_extract_component_expression(rhs_expression, c), \";\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlhs_e->need_transpose = true;\n\t\t}\n\t\telse if ((is_matrix(physical_type) || is_array(physical_type)) &&\n\t\t         physical_type.vecsize <= 4 &&\n\t\t         physical_type.vecsize > type.vecsize)\n\t\t{\n\t\t\tassert(type.vecsize >= 1 && type.vecsize <= 3);\n\n\t\t\t// If we have packed types, we cannot use swizzled stores.\n\t\t\t// We could technically unroll the store for each element if needed.\n\t\t\t// When remapping to a std140 physical type, we always get float4,\n\t\t\t// and the packed decoration should always be removed.\n\t\t\tassert(!lhs_packed_type);\n\n\t\t\tstring lhs = to_dereferenced_expression(lhs_expression);\n\t\t\tstring rhs = to_pointer_expression(rhs_expression);\n\n\t\t\t// Unpack the expression so we can store to it with a float or float2.\n\t\t\t// It's still an l-value, so it's fine. Most other unpacking of expressions turn them into r-values instead.\n\t\t\tlhs = join(\"(\", cast_addr_space, \" \", type_to_glsl(type), \"&)\", enclose_expression(lhs));\n\t\t\tif (!optimize_read_modify_write(expression_type(rhs_expression), lhs, rhs))\n\t\t\t\tstatement(lhs, \" = \", rhs, \";\");\n\t\t}\n\t\telse if (!is_matrix(type))\n\t\t{\n\t\t\tstring lhs = to_dereferenced_expression(lhs_expression);\n\t\t\tstring rhs = to_pointer_expression(rhs_expression);\n\t\t\tif (!optimize_read_modify_write(expression_type(rhs_expression), lhs, rhs))\n\t\t\t\tstatement(lhs, \" = \", rhs, \";\");\n\t\t}\n\n\t\tregister_write(lhs_expression);\n\t}\n}\n\nstatic bool expression_ends_with(const string &expr_str, const std::string &ending)\n{\n\tif (expr_str.length() >= ending.length())\n\t\treturn (expr_str.compare(expr_str.length() - ending.length(), ending.length(), ending) == 0);\n\telse\n\t\treturn false;\n}\n\n// Converts the format of the current expression from packed to unpacked,\n// by wrapping the expression in a constructor of the appropriate type.\n// Also, handle special physical ID remapping scenarios, similar to emit_store_statement().\nstring CompilerMSL::unpack_expression_type(string expr_str, const SPIRType &type, uint32_t physical_type_id,\n                                           bool packed, bool row_major)\n{\n\t// Trivial case, nothing to do.\n\tif (physical_type_id == 0 && !packed)\n\t\treturn expr_str;\n\n\tconst SPIRType *physical_type = nullptr;\n\tif (physical_type_id)\n\t\tphysical_type = &get<SPIRType>(physical_type_id);\n\n\tstatic const char *swizzle_lut[] = {\n\t\t\".x\",\n\t\t\".xy\",\n\t\t\".xyz\",\n\t\t\"\",\n\t};\n\n\t// TODO: Move everything to the template wrapper?\n\tbool uses_std140_wrapper = physical_type && physical_type->vecsize > 4;\n\n\tif (physical_type && is_vector(*physical_type) && is_array(*physical_type) &&\n\t    !uses_std140_wrapper &&\n\t    physical_type->vecsize > type.vecsize && !expression_ends_with(expr_str, swizzle_lut[type.vecsize - 1]))\n\t{\n\t\t// std140 array cases for vectors.\n\t\tassert(type.vecsize >= 1 && type.vecsize <= 3);\n\t\treturn enclose_expression(expr_str) + swizzle_lut[type.vecsize - 1];\n\t}\n\telse if (physical_type && is_matrix(*physical_type) && is_vector(type) &&\n\t         !uses_std140_wrapper &&\n\t         physical_type->vecsize > type.vecsize)\n\t{\n\t\t// Extract column from padded matrix.\n\t\tassert(type.vecsize >= 1 && type.vecsize <= 4);\n\t\treturn enclose_expression(expr_str) + swizzle_lut[type.vecsize - 1];\n\t}\n\telse if (is_matrix(type))\n\t{\n\t\t// Packed matrices are stored as arrays of packed vectors. Unfortunately,\n\t\t// we can't just pass the array straight to the matrix constructor. We have to\n\t\t// pass each vector individually, so that they can be unpacked to normal vectors.\n\t\tif (!physical_type)\n\t\t\tphysical_type = &type;\n\n\t\tuint32_t vecsize = type.vecsize;\n\t\tuint32_t columns = type.columns;\n\t\tif (row_major)\n\t\t\tswap(vecsize, columns);\n\n\t\tuint32_t physical_vecsize = row_major ? physical_type->columns : physical_type->vecsize;\n\n\t\tconst char *base_type = type.width == 16 ? \"half\" : \"float\";\n\t\tstring unpack_expr = join(base_type, columns, \"x\", vecsize, \"(\");\n\n\t\tconst char *load_swiz = \"\";\n\t\tconst char *data_swiz = physical_vecsize > 4 ? \".data\" : \"\";\n\n\t\tif (physical_vecsize != vecsize)\n\t\t\tload_swiz = swizzle_lut[vecsize - 1];\n\n\t\tfor (uint32_t i = 0; i < columns; i++)\n\t\t{\n\t\t\tif (i > 0)\n\t\t\t\tunpack_expr += \", \";\n\n\t\t\tif (packed)\n\t\t\t\tunpack_expr += join(base_type, physical_vecsize, \"(\", expr_str, \"[\", i, \"]\", \")\", load_swiz);\n\t\t\telse\n\t\t\t\tunpack_expr += join(expr_str, \"[\", i, \"]\", data_swiz, load_swiz);\n\t\t}\n\n\t\tunpack_expr += \")\";\n\t\treturn unpack_expr;\n\t}\n\telse\n\t{\n\t\treturn join(type_to_glsl(type), \"(\", expr_str, \")\");\n\t}\n}\n\n// Emits the file header info\nvoid CompilerMSL::emit_header()\n{\n\t// This particular line can be overridden during compilation, so make it a flag and not a pragma line.\n\tif (suppress_missing_prototypes)\n\t\tstatement(\"#pragma clang diagnostic ignored \\\"-Wmissing-prototypes\\\"\");\n\n\t// Disable warning about missing braces for array<T> template to make arrays a value type\n\tif (spv_function_implementations.count(SPVFuncImplUnsafeArray) != 0)\n\t\tstatement(\"#pragma clang diagnostic ignored \\\"-Wmissing-braces\\\"\");\n\n\tfor (auto &pragma : pragma_lines)\n\t\tstatement(pragma);\n\n\tif (!pragma_lines.empty() || suppress_missing_prototypes)\n\t\tstatement(\"\");\n\n\tstatement(\"#include <metal_stdlib>\");\n\tstatement(\"#include <simd/simd.h>\");\n\n\tfor (auto &header : header_lines)\n\t\tstatement(header);\n\n\tstatement(\"\");\n\tstatement(\"using namespace metal;\");\n\tstatement(\"\");\n\n\tfor (auto &td : typedef_lines)\n\t\tstatement(td);\n\n\tif (!typedef_lines.empty())\n\t\tstatement(\"\");\n}\n\nvoid CompilerMSL::add_pragma_line(const string &line)\n{\n\tauto rslt = pragma_lines.insert(line);\n\tif (rslt.second)\n\t\tforce_recompile();\n}\n\nvoid CompilerMSL::add_typedef_line(const string &line)\n{\n\tauto rslt = typedef_lines.insert(line);\n\tif (rslt.second)\n\t\tforce_recompile();\n}\n\n// Template struct like spvUnsafeArray<> need to be declared *before* any resources are declared\nvoid CompilerMSL::emit_custom_templates()\n{\n\tstatic const char * const address_spaces[] = {\n\t\t\"thread\", \"constant\", \"device\", \"threadgroup\", \"threadgroup_imageblock\", \"ray_data\", \"object_data\"\n\t};\n\n\tfor (const auto &spv_func : spv_function_implementations)\n\t{\n\t\tswitch (spv_func)\n\t\t{\n\t\tcase SPVFuncImplUnsafeArray:\n\t\t\tstatement(\"template<typename T, size_t Num>\");\n\t\t\tstatement(\"struct spvUnsafeArray\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"T elements[Num ? Num : 1];\");\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"thread T& operator [] (size_t pos) thread\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return elements[pos];\");\n\t\t\tend_scope();\n\t\t\tstatement(\"constexpr const thread T& operator [] (size_t pos) const thread\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return elements[pos];\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"device T& operator [] (size_t pos) device\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return elements[pos];\");\n\t\t\tend_scope();\n\t\t\tstatement(\"constexpr const device T& operator [] (size_t pos) const device\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return elements[pos];\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"constexpr const constant T& operator [] (size_t pos) const constant\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return elements[pos];\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"threadgroup T& operator [] (size_t pos) threadgroup\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return elements[pos];\");\n\t\t\tend_scope();\n\t\t\tstatement(\"constexpr const threadgroup T& operator [] (size_t pos) const threadgroup\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return elements[pos];\");\n\t\t\tend_scope();\n\t\t\tend_scope_decl();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplStorageMatrix:\n\t\t\tstatement(\"template<typename T, int Cols, int Rows=Cols>\");\n\t\t\tstatement(\"struct spvStorageMatrix\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"vec<T, Rows> columns[Cols];\");\n\t\t\tstatement(\"\");\n\t\t\tfor (size_t method_idx = 0; method_idx < sizeof(address_spaces) / sizeof(address_spaces[0]); ++method_idx)\n\t\t\t{\n\t\t\t\t// Some address spaces require particular features.\n\t\t\t\tif (method_idx == 4) // threadgroup_imageblock\n\t\t\t\t\tstatement(\"#ifdef __HAVE_IMAGEBLOCKS__\");\n\t\t\t\telse if (method_idx == 5) // ray_data\n\t\t\t\t\tstatement(\"#ifdef __HAVE_RAYTRACING__\");\n\t\t\t\telse if (method_idx == 6) // object_data\n\t\t\t\t\tstatement(\"#ifdef __HAVE_MESH__\");\n\t\t\t\tconst string &method_as = address_spaces[method_idx];\n\t\t\t\tstatement(\"spvStorageMatrix() \", method_as, \" = default;\");\n\t\t\t\tif (method_idx != 1) // constant\n\t\t\t\t{\n\t\t\t\t\tstatement(method_as, \" spvStorageMatrix& operator=(initializer_list<vec<T, Rows>> cols) \",\n\t\t\t\t\t          method_as);\n\t\t\t\t\tbegin_scope();\n\t\t\t\t\tstatement(\"size_t i;\");\n\t\t\t\t\tstatement(\"thread vec<T, Rows>* col;\");\n\t\t\t\t\tstatement(\"for (i = 0, col = cols.begin(); i < Cols; ++i, ++col)\");\n\t\t\t\t\tstatement(\"    columns[i] = *col;\");\n\t\t\t\t\tstatement(\"return *this;\");\n\t\t\t\t\tend_scope();\n\t\t\t\t}\n\t\t\t\tstatement(\"\");\n\t\t\t\tfor (size_t param_idx = 0; param_idx < sizeof(address_spaces) / sizeof(address_spaces[0]); ++param_idx)\n\t\t\t\t{\n\t\t\t\t\tif (param_idx != method_idx)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (param_idx == 4) // threadgroup_imageblock\n\t\t\t\t\t\t\tstatement(\"#ifdef __HAVE_IMAGEBLOCKS__\");\n\t\t\t\t\t\telse if (param_idx == 5) // ray_data\n\t\t\t\t\t\t\tstatement(\"#ifdef __HAVE_RAYTRACING__\");\n\t\t\t\t\t\telse if (param_idx == 6) // object_data\n\t\t\t\t\t\t\tstatement(\"#ifdef __HAVE_MESH__\");\n\t\t\t\t\t}\n\t\t\t\t\tconst string &param_as = address_spaces[param_idx];\n\t\t\t\t\tstatement(\"spvStorageMatrix(const \", param_as, \" matrix<T, Cols, Rows>& m) \", method_as);\n\t\t\t\t\tbegin_scope();\n\t\t\t\t\tstatement(\"for (size_t i = 0; i < Cols; ++i)\");\n\t\t\t\t\tstatement(\"    columns[i] = m.columns[i];\");\n\t\t\t\t\tend_scope();\n\t\t\t\t\tstatement(\"spvStorageMatrix(const \", param_as, \" spvStorageMatrix& m) \", method_as, \" = default;\");\n\t\t\t\t\tif (method_idx != 1) // constant\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(method_as, \" spvStorageMatrix& operator=(const \", param_as,\n\t\t\t\t\t\t          \" matrix<T, Cols, Rows>& m) \", method_as);\n\t\t\t\t\t\tbegin_scope();\n\t\t\t\t\t\tstatement(\"for (size_t i = 0; i < Cols; ++i)\");\n\t\t\t\t\t\tstatement(\"    columns[i] = m.columns[i];\");\n\t\t\t\t\t\tstatement(\"return *this;\");\n\t\t\t\t\t\tend_scope();\n\t\t\t\t\t\tstatement(method_as, \" spvStorageMatrix& operator=(const \", param_as, \" spvStorageMatrix& m) \",\n\t\t\t\t\t\t          method_as, \" = default;\");\n\t\t\t\t\t}\n\t\t\t\t\tif (param_idx != method_idx && param_idx >= 4)\n\t\t\t\t\t\tstatement(\"#endif\");\n\t\t\t\t\tstatement(\"\");\n\t\t\t\t}\n\t\t\t\tstatement(\"operator matrix<T, Cols, Rows>() const \", method_as);\n\t\t\t\tbegin_scope();\n\t\t\t\tstatement(\"matrix<T, Cols, Rows> m;\");\n\t\t\t\tstatement(\"for (int i = 0; i < Cols; ++i)\");\n\t\t\t\tstatement(\"    m.columns[i] = columns[i];\");\n\t\t\t\tstatement(\"return m;\");\n\t\t\t\tend_scope();\n\t\t\t\tstatement(\"\");\n\t\t\t\tstatement(\"vec<T, Rows> operator[](size_t idx) const \", method_as);\n\t\t\t\tbegin_scope();\n\t\t\t\tstatement(\"return columns[idx];\");\n\t\t\t\tend_scope();\n\t\t\t\tif (method_idx != 1) // constant\n\t\t\t\t{\n\t\t\t\t\tstatement(method_as, \" vec<T, Rows>& operator[](size_t idx) \", method_as);\n\t\t\t\t\tbegin_scope();\n\t\t\t\t\tstatement(\"return columns[idx];\");\n\t\t\t\t\tend_scope();\n\t\t\t\t}\n\t\t\t\tif (method_idx >= 4)\n\t\t\t\t\tstatement(\"#endif\");\n\t\t\t\tstatement(\"\");\n\t\t\t}\n\t\t\tend_scope_decl();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<typename T, int Cols, int Rows>\");\n\t\t\tstatement(\"matrix<T, Rows, Cols> transpose(spvStorageMatrix<T, Cols, Rows> m)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return transpose(matrix<T, Cols, Rows>(m));\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"typedef spvStorageMatrix<half, 2, 2> spvStorage_half2x2;\");\n\t\t\tstatement(\"typedef spvStorageMatrix<half, 2, 3> spvStorage_half2x3;\");\n\t\t\tstatement(\"typedef spvStorageMatrix<half, 2, 4> spvStorage_half2x4;\");\n\t\t\tstatement(\"typedef spvStorageMatrix<half, 3, 2> spvStorage_half3x2;\");\n\t\t\tstatement(\"typedef spvStorageMatrix<half, 3, 3> spvStorage_half3x3;\");\n\t\t\tstatement(\"typedef spvStorageMatrix<half, 3, 4> spvStorage_half3x4;\");\n\t\t\tstatement(\"typedef spvStorageMatrix<half, 4, 2> spvStorage_half4x2;\");\n\t\t\tstatement(\"typedef spvStorageMatrix<half, 4, 3> spvStorage_half4x3;\");\n\t\t\tstatement(\"typedef spvStorageMatrix<half, 4, 4> spvStorage_half4x4;\");\n\t\t\tstatement(\"typedef spvStorageMatrix<float, 2, 2> spvStorage_float2x2;\");\n\t\t\tstatement(\"typedef spvStorageMatrix<float, 2, 3> spvStorage_float2x3;\");\n\t\t\tstatement(\"typedef spvStorageMatrix<float, 2, 4> spvStorage_float2x4;\");\n\t\t\tstatement(\"typedef spvStorageMatrix<float, 3, 2> spvStorage_float3x2;\");\n\t\t\tstatement(\"typedef spvStorageMatrix<float, 3, 3> spvStorage_float3x3;\");\n\t\t\tstatement(\"typedef spvStorageMatrix<float, 3, 4> spvStorage_float3x4;\");\n\t\t\tstatement(\"typedef spvStorageMatrix<float, 4, 2> spvStorage_float4x2;\");\n\t\t\tstatement(\"typedef spvStorageMatrix<float, 4, 3> spvStorage_float4x3;\");\n\t\t\tstatement(\"typedef spvStorageMatrix<float, 4, 4> spvStorage_float4x4;\");\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n// Emits any needed custom function bodies.\n// Metal helper functions must be static force-inline, i.e. static inline __attribute__((always_inline))\n// otherwise they will cause problems when linked together in a single Metallib.\nvoid CompilerMSL::emit_custom_functions()\n{\n\tfor (uint32_t i = kArrayCopyMultidimMax; i >= 2; i--)\n\t\tif (spv_function_implementations.count(static_cast<SPVFuncImpl>(SPVFuncImplArrayCopyMultidimBase + i)))\n\t\t\tspv_function_implementations.insert(static_cast<SPVFuncImpl>(SPVFuncImplArrayCopyMultidimBase + i - 1));\n\n\tif (spv_function_implementations.count(SPVFuncImplDynamicImageSampler))\n\t{\n\t\t// Unfortunately, this one needs a lot of the other functions to compile OK.\n\t\tif (!msl_options.supports_msl_version(2))\n\t\t\tSPIRV_CROSS_THROW(\n\t\t\t    \"spvDynamicImageSampler requires default-constructible texture objects, which require MSL 2.0.\");\n\t\tspv_function_implementations.insert(SPVFuncImplForwardArgs);\n\t\tspv_function_implementations.insert(SPVFuncImplTextureSwizzle);\n\t\tif (msl_options.swizzle_texture_samples)\n\t\t\tspv_function_implementations.insert(SPVFuncImplGatherSwizzle);\n\t\tfor (uint32_t i = SPVFuncImplChromaReconstructNearest2Plane;\n\t\t     i <= SPVFuncImplChromaReconstructLinear420XMidpointYMidpoint3Plane; i++)\n\t\t\tspv_function_implementations.insert(static_cast<SPVFuncImpl>(i));\n\t\tspv_function_implementations.insert(SPVFuncImplExpandITUFullRange);\n\t\tspv_function_implementations.insert(SPVFuncImplExpandITUNarrowRange);\n\t\tspv_function_implementations.insert(SPVFuncImplConvertYCbCrBT709);\n\t\tspv_function_implementations.insert(SPVFuncImplConvertYCbCrBT601);\n\t\tspv_function_implementations.insert(SPVFuncImplConvertYCbCrBT2020);\n\t}\n\n\tfor (uint32_t i = SPVFuncImplChromaReconstructNearest2Plane;\n\t     i <= SPVFuncImplChromaReconstructLinear420XMidpointYMidpoint3Plane; i++)\n\t\tif (spv_function_implementations.count(static_cast<SPVFuncImpl>(i)))\n\t\t\tspv_function_implementations.insert(SPVFuncImplForwardArgs);\n\n\tif (spv_function_implementations.count(SPVFuncImplTextureSwizzle) ||\n\t    spv_function_implementations.count(SPVFuncImplGatherSwizzle) ||\n\t    spv_function_implementations.count(SPVFuncImplGatherCompareSwizzle))\n\t{\n\t\tspv_function_implementations.insert(SPVFuncImplForwardArgs);\n\t\tspv_function_implementations.insert(SPVFuncImplGetSwizzle);\n\t}\n\n\tfor (const auto &spv_func : spv_function_implementations)\n\t{\n\t\tswitch (spv_func)\n\t\t{\n\t\tcase SPVFuncImplMod:\n\t\t\tstatement(\"// Implementation of the GLSL mod() function, which is slightly different than Metal fmod()\");\n\t\t\tstatement(\"template<typename Tx, typename Ty>\");\n\t\t\tstatement(\"inline Tx mod(Tx x, Ty y)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return x - y * floor(x / y);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplRadians:\n\t\t\tstatement(\"// Implementation of the GLSL radians() function\");\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline T radians(T d)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return d * T(0.01745329251);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplDegrees:\n\t\t\tstatement(\"// Implementation of the GLSL degrees() function\");\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline T degrees(T r)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return r * T(57.2957795131);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplFindILsb:\n\t\t\tstatement(\"// Implementation of the GLSL findLSB() function\");\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline T spvFindLSB(T x)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return select(ctz(x), T(-1), x == T(0));\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplFindUMsb:\n\t\t\tstatement(\"// Implementation of the unsigned GLSL findMSB() function\");\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline T spvFindUMSB(T x)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return select(clz(T(0)) - (clz(x) + T(1)), T(-1), x == T(0));\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplFindSMsb:\n\t\t\tstatement(\"// Implementation of the signed GLSL findMSB() function\");\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline T spvFindSMSB(T x)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"T v = select(x, T(-1) - x, x < T(0));\");\n\t\t\tstatement(\"return select(clz(T(0)) - (clz(v) + T(1)), T(-1), v == T(0));\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplSSign:\n\t\t\tstatement(\"// Implementation of the GLSL sign() function for integer types\");\n\t\t\tstatement(\"template<typename T, typename E = typename enable_if<is_integral<T>::value>::type>\");\n\t\t\tstatement(\"inline T sign(T x)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return select(select(select(x, T(0), x == T(0)), T(1), x > T(0)), T(-1), x < T(0));\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplArrayCopy:\n\t\tcase SPVFuncImplArrayOfArrayCopy2Dim:\n\t\tcase SPVFuncImplArrayOfArrayCopy3Dim:\n\t\tcase SPVFuncImplArrayOfArrayCopy4Dim:\n\t\tcase SPVFuncImplArrayOfArrayCopy5Dim:\n\t\tcase SPVFuncImplArrayOfArrayCopy6Dim:\n\t\t{\n\t\t\t// Unfortunately we cannot template on the address space, so combinatorial explosion it is.\n\t\t\tstatic const char *function_name_tags[] = {\n\t\t\t\t\"FromConstantToStack\",     \"FromConstantToThreadGroup\", \"FromStackToStack\",\n\t\t\t\t\"FromStackToThreadGroup\",  \"FromThreadGroupToStack\",    \"FromThreadGroupToThreadGroup\",\n\t\t\t\t\"FromDeviceToDevice\",      \"FromConstantToDevice\",      \"FromStackToDevice\",\n\t\t\t\t\"FromThreadGroupToDevice\", \"FromDeviceToStack\",         \"FromDeviceToThreadGroup\",\n\t\t\t};\n\n\t\t\tstatic const char *src_address_space[] = {\n\t\t\t\t\"constant\",          \"constant\",          \"thread const\", \"thread const\",\n\t\t\t\t\"threadgroup const\", \"threadgroup const\", \"device const\", \"constant\",\n\t\t\t\t\"thread const\",      \"threadgroup const\", \"device const\", \"device const\",\n\t\t\t};\n\n\t\t\tstatic const char *dst_address_space[] = {\n\t\t\t\t\"thread\", \"threadgroup\", \"thread\", \"threadgroup\", \"thread\", \"threadgroup\",\n\t\t\t\t\"device\", \"device\",      \"device\", \"device\",      \"thread\", \"threadgroup\",\n\t\t\t};\n\n\t\t\tfor (uint32_t variant = 0; variant < 12; variant++)\n\t\t\t{\n\t\t\t\tuint8_t dimensions = spv_func - SPVFuncImplArrayCopyMultidimBase;\n\t\t\t\tstring tmp = \"template<typename T\";\n\t\t\t\tfor (uint8_t i = 0; i < dimensions; i++)\n\t\t\t\t{\n\t\t\t\t\ttmp += \", uint \";\n\t\t\t\t\ttmp += 'A' + i;\n\t\t\t\t}\n\t\t\t\ttmp += \">\";\n\t\t\t\tstatement(tmp);\n\n\t\t\t\tstring array_arg;\n\t\t\t\tfor (uint8_t i = 0; i < dimensions; i++)\n\t\t\t\t{\n\t\t\t\t\tarray_arg += \"[\";\n\t\t\t\t\tarray_arg += 'A' + i;\n\t\t\t\t\tarray_arg += \"]\";\n\t\t\t\t}\n\n\t\t\t\tstatement(\"inline void spvArrayCopy\", function_name_tags[variant], dimensions, \"(\",\n\t\t\t\t          dst_address_space[variant], \" T (&dst)\", array_arg, \", \", src_address_space[variant],\n\t\t\t\t          \" T (&src)\", array_arg, \")\");\n\n\t\t\t\tbegin_scope();\n\t\t\t\tstatement(\"for (uint i = 0; i < A; i++)\");\n\t\t\t\tbegin_scope();\n\n\t\t\t\tif (dimensions == 1)\n\t\t\t\t\tstatement(\"dst[i] = src[i];\");\n\t\t\t\telse\n\t\t\t\t\tstatement(\"spvArrayCopy\", function_name_tags[variant], dimensions - 1, \"(dst[i], src[i]);\");\n\t\t\t\tend_scope();\n\t\t\t\tend_scope();\n\t\t\t\tstatement(\"\");\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\t// Support for Metal 2.1's new texture_buffer type.\n\t\tcase SPVFuncImplTexelBufferCoords:\n\t\t{\n\t\t\tif (msl_options.texel_buffer_texture_width > 0)\n\t\t\t{\n\t\t\t\tstring tex_width_str = convert_to_string(msl_options.texel_buffer_texture_width);\n\t\t\t\tstatement(\"// Returns 2D texture coords corresponding to 1D texel buffer coords\");\n\t\t\t\tstatement(force_inline);\n\t\t\t\tstatement(\"uint2 spvTexelBufferCoord(uint tc)\");\n\t\t\t\tbegin_scope();\n\t\t\t\tstatement(join(\"return uint2(tc % \", tex_width_str, \", tc / \", tex_width_str, \");\"));\n\t\t\t\tend_scope();\n\t\t\t\tstatement(\"\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstatement(\"// Returns 2D texture coords corresponding to 1D texel buffer coords\");\n\t\t\t\tstatement(\n\t\t\t\t    \"#define spvTexelBufferCoord(tc, tex) uint2((tc) % (tex).get_width(), (tc) / (tex).get_width())\");\n\t\t\t\tstatement(\"\");\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\t// Emulate texture2D atomic operations\n\t\tcase SPVFuncImplImage2DAtomicCoords:\n\t\t{\n\t\t\tif (msl_options.supports_msl_version(1, 2))\n\t\t\t{\n\t\t\t\tstatement(\"// The required alignment of a linear texture of R32Uint format.\");\n\t\t\t\tstatement(\"constant uint spvLinearTextureAlignmentOverride [[function_constant(\",\n\t\t\t\t          msl_options.r32ui_alignment_constant_id, \")]];\");\n\t\t\t\tstatement(\"constant uint spvLinearTextureAlignment = \",\n\t\t\t\t          \"is_function_constant_defined(spvLinearTextureAlignmentOverride) ? \",\n\t\t\t\t          \"spvLinearTextureAlignmentOverride : \", msl_options.r32ui_linear_texture_alignment, \";\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstatement(\"// The required alignment of a linear texture of R32Uint format.\");\n\t\t\t\tstatement(\"constant uint spvLinearTextureAlignment = \", msl_options.r32ui_linear_texture_alignment,\n\t\t\t\t          \";\");\n\t\t\t}\n\t\t\tstatement(\"// Returns buffer coords corresponding to 2D texture coords for emulating 2D texture atomics\");\n\t\t\tstatement(\"#define spvImage2DAtomicCoord(tc, tex) (((((tex).get_width() + \",\n\t\t\t          \" spvLinearTextureAlignment / 4 - 1) & ~(\",\n\t\t\t          \" spvLinearTextureAlignment / 4 - 1)) * (tc).y) + (tc).x)\");\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\t\t}\n\n\t\t// Fix up gradient vectors when sampling a cube texture for Apple Silicon.\n\t\t// h/t Alexey Knyazev (https://github.com/KhronosGroup/MoltenVK/issues/2068#issuecomment-1817799067) for the code.\n\t\tcase SPVFuncImplGradientCube:\n\t\t\tstatement(\"static inline gradientcube spvGradientCube(float3 P, float3 dPdx, float3 dPdy)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"// Major axis selection\");\n\t\t\tstatement(\"float3 absP = abs(P);\");\n\t\t\tstatement(\"bool xMajor = absP.x >= max(absP.y, absP.z);\");\n\t\t\tstatement(\"bool yMajor = absP.y >= absP.z;\");\n\t\t\tstatement(\"float3 Q = xMajor ? P.yzx : (yMajor ? P.xzy : P);\");\n\t\t\tstatement(\"float3 dQdx = xMajor ? dPdx.yzx : (yMajor ? dPdx.xzy : dPdx);\");\n\t\t\tstatement(\"float3 dQdy = xMajor ? dPdy.yzx : (yMajor ? dPdy.xzy : dPdy);\");\n\t\t\tstatement_no_indent(\"\");\n\t\t\tstatement(\"// Skip a couple of operations compared to usual projection\");\n\t\t\tstatement(\"float4 d = float4(dQdx.xy, dQdy.xy) - (Q.xy / Q.z).xyxy * float4(dQdx.zz, dQdy.zz);\");\n\t\t\tstatement_no_indent(\"\");\n\t\t\tstatement(\"// Final swizzle to put the intermediate values into non-ignored components\");\n\t\t\tstatement(\"// X major: X and Z\");\n\t\t\tstatement(\"// Y major: X and Y\");\n\t\t\tstatement(\"// Z major: Y and Z\");\n\t\t\tstatement(\"return gradientcube(xMajor ? d.xxy : d.xyx, xMajor ? d.zzw : d.zwz);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\t// \"fadd\" intrinsic support\n\t\tcase SPVFuncImplFAdd:\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"[[clang::optnone]] T spvFAdd(T l, T r)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return fma(T(1), l, r);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\t// \"fsub\" intrinsic support\n\t\tcase SPVFuncImplFSub:\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"[[clang::optnone]] T spvFSub(T l, T r)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return fma(T(-1), r, l);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\t// \"fmul' intrinsic support\n\t\tcase SPVFuncImplFMul:\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"[[clang::optnone]] T spvFMul(T l, T r)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return fma(l, r, T(0));\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\n\t\t\tstatement(\"template<typename T, int Cols, int Rows>\");\n\t\t\tstatement(\"[[clang::optnone]] vec<T, Cols> spvFMulVectorMatrix(vec<T, Rows> v, matrix<T, Cols, Rows> m)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"vec<T, Cols> res = vec<T, Cols>(0);\");\n\t\t\tstatement(\"for (uint i = Rows; i > 0; --i)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"vec<T, Cols> tmp(0);\");\n\t\t\tstatement(\"for (uint j = 0; j < Cols; ++j)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"tmp[j] = m[j][i - 1];\");\n\t\t\tend_scope();\n\t\t\tstatement(\"res = fma(tmp, vec<T, Cols>(v[i - 1]), res);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"return res;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\n\t\t\tstatement(\"template<typename T, int Cols, int Rows>\");\n\t\t\tstatement(\"[[clang::optnone]] vec<T, Rows> spvFMulMatrixVector(matrix<T, Cols, Rows> m, vec<T, Cols> v)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"vec<T, Rows> res = vec<T, Rows>(0);\");\n\t\t\tstatement(\"for (uint i = Cols; i > 0; --i)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"res = fma(m[i - 1], vec<T, Rows>(v[i - 1]), res);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"return res;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\n\t\t\tstatement(\"template<typename T, int LCols, int LRows, int RCols, int RRows>\");\n\t\t\tstatement(\"[[clang::optnone]] matrix<T, RCols, LRows> spvFMulMatrixMatrix(matrix<T, LCols, LRows> l, matrix<T, RCols, RRows> r)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"matrix<T, RCols, LRows> res;\");\n\t\t\tstatement(\"for (uint i = 0; i < RCols; i++)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"vec<T, RCols> tmp(0);\");\n\t\t\tstatement(\"for (uint j = 0; j < LCols; j++)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"tmp = fma(vec<T, RCols>(r[i][j]), l[j], tmp);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"res[i] = tmp;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"return res;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplQuantizeToF16:\n\t\t\t// Ensure fast-math is disabled to match Vulkan results.\n\t\t\t// SpvHalfTypeSelector is used to match the half* template type to the float* template type.\n\t\t\t// Depending on GPU, MSL does not always flush converted subnormal halfs to zero,\n\t\t\t// as required by OpQuantizeToF16, so check for subnormals and flush them to zero.\n\t\t\tstatement(\"template <typename F> struct SpvHalfTypeSelector;\");\n\t\t\tstatement(\"template <> struct SpvHalfTypeSelector<float> { public: using H = half; };\");\n\t\t\tstatement(\"template<uint N> struct SpvHalfTypeSelector<vec<float, N>> { using H = vec<half, N>; };\");\n\t\t\tstatement(\"template<typename F, typename H = typename SpvHalfTypeSelector<F>::H>\");\n\t\t\tstatement(\"[[clang::optnone]] F spvQuantizeToF16(F fval)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"H hval = H(fval);\");\n\t\t\tstatement(\"hval = select(copysign(H(0), hval), hval, isnormal(hval) || isinf(hval) || isnan(hval));\");\n\t\t\tstatement(\"return F(hval);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\t// Emulate texturecube_array with texture2d_array for iOS where this type is not available\n\t\tcase SPVFuncImplCubemapTo2DArrayFace:\n\t\t\tstatement(force_inline);\n\t\t\tstatement(\"float3 spvCubemapTo2DArrayFace(float3 P)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"float3 Coords = abs(P.xyz);\");\n\t\t\tstatement(\"float CubeFace = 0;\");\n\t\t\tstatement(\"float ProjectionAxis = 0;\");\n\t\t\tstatement(\"float u = 0;\");\n\t\t\tstatement(\"float v = 0;\");\n\t\t\tstatement(\"if (Coords.x >= Coords.y && Coords.x >= Coords.z)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"CubeFace = P.x >= 0 ? 0 : 1;\");\n\t\t\tstatement(\"ProjectionAxis = Coords.x;\");\n\t\t\tstatement(\"u = P.x >= 0 ? -P.z : P.z;\");\n\t\t\tstatement(\"v = -P.y;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"else if (Coords.y >= Coords.x && Coords.y >= Coords.z)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"CubeFace = P.y >= 0 ? 2 : 3;\");\n\t\t\tstatement(\"ProjectionAxis = Coords.y;\");\n\t\t\tstatement(\"u = P.x;\");\n\t\t\tstatement(\"v = P.y >= 0 ? P.z : -P.z;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"else\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"CubeFace = P.z >= 0 ? 4 : 5;\");\n\t\t\tstatement(\"ProjectionAxis = Coords.z;\");\n\t\t\tstatement(\"u = P.z >= 0 ? P.x : -P.x;\");\n\t\t\tstatement(\"v = -P.y;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"u = 0.5 * (u/ProjectionAxis + 1);\");\n\t\t\tstatement(\"v = 0.5 * (v/ProjectionAxis + 1);\");\n\t\t\tstatement(\"return float3(u, v, CubeFace);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplInverse4x4:\n\t\t\tstatement(\"// Returns the determinant of a 2x2 matrix.\");\n\t\t\tstatement(force_inline);\n\t\t\tstatement(\"float spvDet2x2(float a1, float a2, float b1, float b2)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return a1 * b2 - b1 * a2;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\n\t\t\tstatement(\"// Returns the determinant of a 3x3 matrix.\");\n\t\t\tstatement(force_inline);\n\t\t\tstatement(\"float spvDet3x3(float a1, float a2, float a3, float b1, float b2, float b3, float c1, \"\n\t\t\t          \"float c2, float c3)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return a1 * spvDet2x2(b2, b3, c2, c3) - b1 * spvDet2x2(a2, a3, c2, c3) + c1 * spvDet2x2(a2, a3, \"\n\t\t\t          \"b2, b3);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"// Returns the inverse of a matrix, by using the algorithm of calculating the classical\");\n\t\t\tstatement(\"// adjoint and dividing by the determinant. The contents of the matrix are changed.\");\n\t\t\tstatement(force_inline);\n\t\t\tstatement(\"float4x4 spvInverse4x4(float4x4 m)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"float4x4 adj;\t// The adjoint matrix (inverse after dividing by determinant)\");\n\t\t\tstatement_no_indent(\"\");\n\t\t\tstatement(\"// Create the transpose of the cofactors, as the classical adjoint of the matrix.\");\n\t\t\tstatement(\"adj[0][0] =  spvDet3x3(m[1][1], m[1][2], m[1][3], m[2][1], m[2][2], m[2][3], m[3][1], m[3][2], \"\n\t\t\t          \"m[3][3]);\");\n\t\t\tstatement(\"adj[0][1] = -spvDet3x3(m[0][1], m[0][2], m[0][3], m[2][1], m[2][2], m[2][3], m[3][1], m[3][2], \"\n\t\t\t          \"m[3][3]);\");\n\t\t\tstatement(\"adj[0][2] =  spvDet3x3(m[0][1], m[0][2], m[0][3], m[1][1], m[1][2], m[1][3], m[3][1], m[3][2], \"\n\t\t\t          \"m[3][3]);\");\n\t\t\tstatement(\"adj[0][3] = -spvDet3x3(m[0][1], m[0][2], m[0][3], m[1][1], m[1][2], m[1][3], m[2][1], m[2][2], \"\n\t\t\t          \"m[2][3]);\");\n\t\t\tstatement_no_indent(\"\");\n\t\t\tstatement(\"adj[1][0] = -spvDet3x3(m[1][0], m[1][2], m[1][3], m[2][0], m[2][2], m[2][3], m[3][0], m[3][2], \"\n\t\t\t          \"m[3][3]);\");\n\t\t\tstatement(\"adj[1][1] =  spvDet3x3(m[0][0], m[0][2], m[0][3], m[2][0], m[2][2], m[2][3], m[3][0], m[3][2], \"\n\t\t\t          \"m[3][3]);\");\n\t\t\tstatement(\"adj[1][2] = -spvDet3x3(m[0][0], m[0][2], m[0][3], m[1][0], m[1][2], m[1][3], m[3][0], m[3][2], \"\n\t\t\t          \"m[3][3]);\");\n\t\t\tstatement(\"adj[1][3] =  spvDet3x3(m[0][0], m[0][2], m[0][3], m[1][0], m[1][2], m[1][3], m[2][0], m[2][2], \"\n\t\t\t          \"m[2][3]);\");\n\t\t\tstatement_no_indent(\"\");\n\t\t\tstatement(\"adj[2][0] =  spvDet3x3(m[1][0], m[1][1], m[1][3], m[2][0], m[2][1], m[2][3], m[3][0], m[3][1], \"\n\t\t\t          \"m[3][3]);\");\n\t\t\tstatement(\"adj[2][1] = -spvDet3x3(m[0][0], m[0][1], m[0][3], m[2][0], m[2][1], m[2][3], m[3][0], m[3][1], \"\n\t\t\t          \"m[3][3]);\");\n\t\t\tstatement(\"adj[2][2] =  spvDet3x3(m[0][0], m[0][1], m[0][3], m[1][0], m[1][1], m[1][3], m[3][0], m[3][1], \"\n\t\t\t          \"m[3][3]);\");\n\t\t\tstatement(\"adj[2][3] = -spvDet3x3(m[0][0], m[0][1], m[0][3], m[1][0], m[1][1], m[1][3], m[2][0], m[2][1], \"\n\t\t\t          \"m[2][3]);\");\n\t\t\tstatement_no_indent(\"\");\n\t\t\tstatement(\"adj[3][0] = -spvDet3x3(m[1][0], m[1][1], m[1][2], m[2][0], m[2][1], m[2][2], m[3][0], m[3][1], \"\n\t\t\t          \"m[3][2]);\");\n\t\t\tstatement(\"adj[3][1] =  spvDet3x3(m[0][0], m[0][1], m[0][2], m[2][0], m[2][1], m[2][2], m[3][0], m[3][1], \"\n\t\t\t          \"m[3][2]);\");\n\t\t\tstatement(\"adj[3][2] = -spvDet3x3(m[0][0], m[0][1], m[0][2], m[1][0], m[1][1], m[1][2], m[3][0], m[3][1], \"\n\t\t\t          \"m[3][2]);\");\n\t\t\tstatement(\"adj[3][3] =  spvDet3x3(m[0][0], m[0][1], m[0][2], m[1][0], m[1][1], m[1][2], m[2][0], m[2][1], \"\n\t\t\t          \"m[2][2]);\");\n\t\t\tstatement_no_indent(\"\");\n\t\t\tstatement(\"// Calculate the determinant as a combination of the cofactors of the first row.\");\n\t\t\tstatement(\"float det = (adj[0][0] * m[0][0]) + (adj[0][1] * m[1][0]) + (adj[0][2] * m[2][0]) + (adj[0][3] \"\n\t\t\t          \"* m[3][0]);\");\n\t\t\tstatement_no_indent(\"\");\n\t\t\tstatement(\"// Divide the classical adjoint matrix by the determinant.\");\n\t\t\tstatement(\"// If determinant is zero, matrix is not invertable, so leave it unchanged.\");\n\t\t\tstatement(\"return (det != 0.0f) ? (adj * (1.0f / det)) : m;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplInverse3x3:\n\t\t\tif (spv_function_implementations.count(SPVFuncImplInverse4x4) == 0)\n\t\t\t{\n\t\t\t\tstatement(\"// Returns the determinant of a 2x2 matrix.\");\n\t\t\t\tstatement(force_inline);\n\t\t\t\tstatement(\"float spvDet2x2(float a1, float a2, float b1, float b2)\");\n\t\t\t\tbegin_scope();\n\t\t\t\tstatement(\"return a1 * b2 - b1 * a2;\");\n\t\t\t\tend_scope();\n\t\t\t\tstatement(\"\");\n\t\t\t}\n\n\t\t\tstatement(\"// Returns the inverse of a matrix, by using the algorithm of calculating the classical\");\n\t\t\tstatement(\"// adjoint and dividing by the determinant. The contents of the matrix are changed.\");\n\t\t\tstatement(force_inline);\n\t\t\tstatement(\"float3x3 spvInverse3x3(float3x3 m)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"float3x3 adj;\t// The adjoint matrix (inverse after dividing by determinant)\");\n\t\t\tstatement_no_indent(\"\");\n\t\t\tstatement(\"// Create the transpose of the cofactors, as the classical adjoint of the matrix.\");\n\t\t\tstatement(\"adj[0][0] =  spvDet2x2(m[1][1], m[1][2], m[2][1], m[2][2]);\");\n\t\t\tstatement(\"adj[0][1] = -spvDet2x2(m[0][1], m[0][2], m[2][1], m[2][2]);\");\n\t\t\tstatement(\"adj[0][2] =  spvDet2x2(m[0][1], m[0][2], m[1][1], m[1][2]);\");\n\t\t\tstatement_no_indent(\"\");\n\t\t\tstatement(\"adj[1][0] = -spvDet2x2(m[1][0], m[1][2], m[2][0], m[2][2]);\");\n\t\t\tstatement(\"adj[1][1] =  spvDet2x2(m[0][0], m[0][2], m[2][0], m[2][2]);\");\n\t\t\tstatement(\"adj[1][2] = -spvDet2x2(m[0][0], m[0][2], m[1][0], m[1][2]);\");\n\t\t\tstatement_no_indent(\"\");\n\t\t\tstatement(\"adj[2][0] =  spvDet2x2(m[1][0], m[1][1], m[2][0], m[2][1]);\");\n\t\t\tstatement(\"adj[2][1] = -spvDet2x2(m[0][0], m[0][1], m[2][0], m[2][1]);\");\n\t\t\tstatement(\"adj[2][2] =  spvDet2x2(m[0][0], m[0][1], m[1][0], m[1][1]);\");\n\t\t\tstatement_no_indent(\"\");\n\t\t\tstatement(\"// Calculate the determinant as a combination of the cofactors of the first row.\");\n\t\t\tstatement(\"float det = (adj[0][0] * m[0][0]) + (adj[0][1] * m[1][0]) + (adj[0][2] * m[2][0]);\");\n\t\t\tstatement_no_indent(\"\");\n\t\t\tstatement(\"// Divide the classical adjoint matrix by the determinant.\");\n\t\t\tstatement(\"// If determinant is zero, matrix is not invertable, so leave it unchanged.\");\n\t\t\tstatement(\"return (det != 0.0f) ? (adj * (1.0f / det)) : m;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplInverse2x2:\n\t\t\tstatement(\"// Returns the inverse of a matrix, by using the algorithm of calculating the classical\");\n\t\t\tstatement(\"// adjoint and dividing by the determinant. The contents of the matrix are changed.\");\n\t\t\tstatement(force_inline);\n\t\t\tstatement(\"float2x2 spvInverse2x2(float2x2 m)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"float2x2 adj;\t// The adjoint matrix (inverse after dividing by determinant)\");\n\t\t\tstatement_no_indent(\"\");\n\t\t\tstatement(\"// Create the transpose of the cofactors, as the classical adjoint of the matrix.\");\n\t\t\tstatement(\"adj[0][0] =  m[1][1];\");\n\t\t\tstatement(\"adj[0][1] = -m[0][1];\");\n\t\t\tstatement_no_indent(\"\");\n\t\t\tstatement(\"adj[1][0] = -m[1][0];\");\n\t\t\tstatement(\"adj[1][1] =  m[0][0];\");\n\t\t\tstatement_no_indent(\"\");\n\t\t\tstatement(\"// Calculate the determinant as a combination of the cofactors of the first row.\");\n\t\t\tstatement(\"float det = (adj[0][0] * m[0][0]) + (adj[0][1] * m[1][0]);\");\n\t\t\tstatement_no_indent(\"\");\n\t\t\tstatement(\"// Divide the classical adjoint matrix by the determinant.\");\n\t\t\tstatement(\"// If determinant is zero, matrix is not invertable, so leave it unchanged.\");\n\t\t\tstatement(\"return (det != 0.0f) ? (adj * (1.0f / det)) : m;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplForwardArgs:\n\t\t\tstatement(\"template<typename T> struct spvRemoveReference { typedef T type; };\");\n\t\t\tstatement(\"template<typename T> struct spvRemoveReference<thread T&> { typedef T type; };\");\n\t\t\tstatement(\"template<typename T> struct spvRemoveReference<thread T&&> { typedef T type; };\");\n\t\t\tstatement(\"template<typename T> inline constexpr thread T&& spvForward(thread typename \"\n\t\t\t          \"spvRemoveReference<T>::type& x)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return static_cast<thread T&&>(x);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"template<typename T> inline constexpr thread T&& spvForward(thread typename \"\n\t\t\t          \"spvRemoveReference<T>::type&& x)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return static_cast<thread T&&>(x);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplGetSwizzle:\n\t\t\tstatement(\"enum class spvSwizzle : uint\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"none = 0,\");\n\t\t\tstatement(\"zero,\");\n\t\t\tstatement(\"one,\");\n\t\t\tstatement(\"red,\");\n\t\t\tstatement(\"green,\");\n\t\t\tstatement(\"blue,\");\n\t\t\tstatement(\"alpha\");\n\t\t\tend_scope_decl();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline T spvGetSwizzle(vec<T, 4> x, T c, spvSwizzle s)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"switch (s)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"case spvSwizzle::none:\");\n\t\t\tstatement(\"    return c;\");\n\t\t\tstatement(\"case spvSwizzle::zero:\");\n\t\t\tstatement(\"    return 0;\");\n\t\t\tstatement(\"case spvSwizzle::one:\");\n\t\t\tstatement(\"    return 1;\");\n\t\t\tstatement(\"case spvSwizzle::red:\");\n\t\t\tstatement(\"    return x.r;\");\n\t\t\tstatement(\"case spvSwizzle::green:\");\n\t\t\tstatement(\"    return x.g;\");\n\t\t\tstatement(\"case spvSwizzle::blue:\");\n\t\t\tstatement(\"    return x.b;\");\n\t\t\tstatement(\"case spvSwizzle::alpha:\");\n\t\t\tstatement(\"    return x.a;\");\n\t\t\tend_scope();\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplTextureSwizzle:\n\t\t\tstatement(\"// Wrapper function that swizzles texture samples and fetches.\");\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline vec<T, 4> spvTextureSwizzle(vec<T, 4> x, uint s)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"if (!s)\");\n\t\t\tstatement(\"    return x;\");\n\t\t\tstatement(\"return vec<T, 4>(spvGetSwizzle(x, x.r, spvSwizzle((s >> 0) & 0xFF)), \"\n\t\t\t          \"spvGetSwizzle(x, x.g, spvSwizzle((s >> 8) & 0xFF)), spvGetSwizzle(x, x.b, spvSwizzle((s >> 16) \"\n\t\t\t          \"& 0xFF)), \"\n\t\t\t          \"spvGetSwizzle(x, x.a, spvSwizzle((s >> 24) & 0xFF)));\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline T spvTextureSwizzle(T x, uint s)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return spvTextureSwizzle(vec<T, 4>(x, 0, 0, 1), s).x;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplGatherSwizzle:\n\t\t\tstatement(\"// Wrapper function that swizzles texture gathers.\");\n\t\t\tstatement(\"template<typename T, template<typename, access = access::sample, typename = void> class Tex, \"\n\t\t\t          \"typename... Ts>\");\n\t\t\tstatement(\"inline vec<T, 4> spvGatherSwizzle(const thread Tex<T>& t, sampler s, \"\n\t\t\t          \"uint sw, component c, Ts... params) METAL_CONST_ARG(c)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"if (sw)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"switch (spvSwizzle((sw >> (uint(c) * 8)) & 0xFF))\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"case spvSwizzle::none:\");\n\t\t\tstatement(\"    break;\");\n\t\t\tstatement(\"case spvSwizzle::zero:\");\n\t\t\tstatement(\"    return vec<T, 4>(0, 0, 0, 0);\");\n\t\t\tstatement(\"case spvSwizzle::one:\");\n\t\t\tstatement(\"    return vec<T, 4>(1, 1, 1, 1);\");\n\t\t\tstatement(\"case spvSwizzle::red:\");\n\t\t\tstatement(\"    return t.gather(s, spvForward<Ts>(params)..., component::x);\");\n\t\t\tstatement(\"case spvSwizzle::green:\");\n\t\t\tstatement(\"    return t.gather(s, spvForward<Ts>(params)..., component::y);\");\n\t\t\tstatement(\"case spvSwizzle::blue:\");\n\t\t\tstatement(\"    return t.gather(s, spvForward<Ts>(params)..., component::z);\");\n\t\t\tstatement(\"case spvSwizzle::alpha:\");\n\t\t\tstatement(\"    return t.gather(s, spvForward<Ts>(params)..., component::w);\");\n\t\t\tend_scope();\n\t\t\tend_scope();\n\t\t\t// texture::gather insists on its component parameter being a constant\n\t\t\t// expression, so we need this silly workaround just to compile the shader.\n\t\t\tstatement(\"switch (c)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"case component::x:\");\n\t\t\tstatement(\"    return t.gather(s, spvForward<Ts>(params)..., component::x);\");\n\t\t\tstatement(\"case component::y:\");\n\t\t\tstatement(\"    return t.gather(s, spvForward<Ts>(params)..., component::y);\");\n\t\t\tstatement(\"case component::z:\");\n\t\t\tstatement(\"    return t.gather(s, spvForward<Ts>(params)..., component::z);\");\n\t\t\tstatement(\"case component::w:\");\n\t\t\tstatement(\"    return t.gather(s, spvForward<Ts>(params)..., component::w);\");\n\t\t\tend_scope();\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplGatherCompareSwizzle:\n\t\t\tstatement(\"// Wrapper function that swizzles depth texture gathers.\");\n\t\t\tstatement(\"template<typename T, template<typename, access = access::sample, typename = void> class Tex, \"\n\t\t\t          \"typename... Ts>\");\n\t\t\tstatement(\"inline vec<T, 4> spvGatherCompareSwizzle(const thread Tex<T>& t, sampler \"\n\t\t\t          \"s, uint sw, Ts... params) \");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"if (sw)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"switch (spvSwizzle(sw & 0xFF))\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"case spvSwizzle::none:\");\n\t\t\tstatement(\"case spvSwizzle::red:\");\n\t\t\tstatement(\"    break;\");\n\t\t\tstatement(\"case spvSwizzle::zero:\");\n\t\t\tstatement(\"case spvSwizzle::green:\");\n\t\t\tstatement(\"case spvSwizzle::blue:\");\n\t\t\tstatement(\"case spvSwizzle::alpha:\");\n\t\t\tstatement(\"    return vec<T, 4>(0, 0, 0, 0);\");\n\t\t\tstatement(\"case spvSwizzle::one:\");\n\t\t\tstatement(\"    return vec<T, 4>(1, 1, 1, 1);\");\n\t\t\tend_scope();\n\t\t\tend_scope();\n\t\t\tstatement(\"return t.gather_compare(s, spvForward<Ts>(params)...);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplSubgroupBroadcast:\n\t\t\t// Metal doesn't allow broadcasting boolean values directly, but we can work around that by broadcasting\n\t\t\t// them as integers.\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline T spvSubgroupBroadcast(T value, ushort lane)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.use_quadgroup_operation())\n\t\t\t\tstatement(\"return quad_broadcast(value, lane);\");\n\t\t\telse\n\t\t\t\tstatement(\"return simd_broadcast(value, lane);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<>\");\n\t\t\tstatement(\"inline bool spvSubgroupBroadcast(bool value, ushort lane)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.use_quadgroup_operation())\n\t\t\t\tstatement(\"return !!quad_broadcast((ushort)value, lane);\");\n\t\t\telse\n\t\t\t\tstatement(\"return !!simd_broadcast((ushort)value, lane);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<uint N>\");\n\t\t\tstatement(\"inline vec<bool, N> spvSubgroupBroadcast(vec<bool, N> value, ushort lane)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.use_quadgroup_operation())\n\t\t\t\tstatement(\"return (vec<bool, N>)quad_broadcast((vec<ushort, N>)value, lane);\");\n\t\t\telse\n\t\t\t\tstatement(\"return (vec<bool, N>)simd_broadcast((vec<ushort, N>)value, lane);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplSubgroupBroadcastFirst:\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline T spvSubgroupBroadcastFirst(T value)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.use_quadgroup_operation())\n\t\t\t\tstatement(\"return quad_broadcast_first(value);\");\n\t\t\telse\n\t\t\t\tstatement(\"return simd_broadcast_first(value);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<>\");\n\t\t\tstatement(\"inline bool spvSubgroupBroadcastFirst(bool value)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.use_quadgroup_operation())\n\t\t\t\tstatement(\"return !!quad_broadcast_first((ushort)value);\");\n\t\t\telse\n\t\t\t\tstatement(\"return !!simd_broadcast_first((ushort)value);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<uint N>\");\n\t\t\tstatement(\"inline vec<bool, N> spvSubgroupBroadcastFirst(vec<bool, N> value)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.use_quadgroup_operation())\n\t\t\t\tstatement(\"return (vec<bool, N>)quad_broadcast_first((vec<ushort, N>)value);\");\n\t\t\telse\n\t\t\t\tstatement(\"return (vec<bool, N>)simd_broadcast_first((vec<ushort, N>)value);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplSubgroupBallot:\n\t\t\tstatement(\"inline uint4 spvSubgroupBallot(bool value)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.use_quadgroup_operation())\n\t\t\t{\n\t\t\t\tstatement(\"return uint4((quad_vote::vote_t)quad_ballot(value), 0, 0, 0);\");\n\t\t\t}\n\t\t\telse if (msl_options.is_ios())\n\t\t\t{\n\t\t\t\t// The current simd_vote on iOS uses a 32-bit integer-like object.\n\t\t\t\tstatement(\"return uint4((simd_vote::vote_t)simd_ballot(value), 0, 0, 0);\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstatement(\"simd_vote vote = simd_ballot(value);\");\n\t\t\t\tstatement(\"// simd_ballot() returns a 64-bit integer-like object, but\");\n\t\t\t\tstatement(\"// SPIR-V callers expect a uint4. We must convert.\");\n\t\t\t\tstatement(\"// FIXME: This won't include higher bits if Apple ever supports\");\n\t\t\t\tstatement(\"// 128 lanes in an SIMD-group.\");\n\t\t\t\tstatement(\"return uint4(as_type<uint2>((simd_vote::vote_t)vote), 0, 0);\");\n\t\t\t}\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplSubgroupBallotBitExtract:\n\t\t\tstatement(\"inline bool spvSubgroupBallotBitExtract(uint4 ballot, uint bit)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return !!extract_bits(ballot[bit / 32], bit % 32, 1);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplSubgroupBallotFindLSB:\n\t\t\tstatement(\"inline uint spvSubgroupBallotFindLSB(uint4 ballot, uint gl_SubgroupSize)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.is_ios())\n\t\t\t{\n\t\t\t\tstatement(\"uint4 mask = uint4(extract_bits(0xFFFFFFFF, 0, gl_SubgroupSize), uint3(0));\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstatement(\"uint4 mask = uint4(extract_bits(0xFFFFFFFF, 0, min(gl_SubgroupSize, 32u)), \"\n\t\t\t\t          \"extract_bits(0xFFFFFFFF, 0, (uint)max((int)gl_SubgroupSize - 32, 0)), uint2(0));\");\n\t\t\t}\n\t\t\tstatement(\"ballot &= mask;\");\n\t\t\tstatement(\"return select(ctz(ballot.x), select(32 + ctz(ballot.y), select(64 + ctz(ballot.z), select(96 + \"\n\t\t\t          \"ctz(ballot.w), uint(-1), ballot.w == 0), ballot.z == 0), ballot.y == 0), ballot.x == 0);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplSubgroupBallotFindMSB:\n\t\t\tstatement(\"inline uint spvSubgroupBallotFindMSB(uint4 ballot, uint gl_SubgroupSize)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.is_ios())\n\t\t\t{\n\t\t\t\tstatement(\"uint4 mask = uint4(extract_bits(0xFFFFFFFF, 0, gl_SubgroupSize), uint3(0));\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstatement(\"uint4 mask = uint4(extract_bits(0xFFFFFFFF, 0, min(gl_SubgroupSize, 32u)), \"\n\t\t\t\t          \"extract_bits(0xFFFFFFFF, 0, (uint)max((int)gl_SubgroupSize - 32, 0)), uint2(0));\");\n\t\t\t}\n\t\t\tstatement(\"ballot &= mask;\");\n\t\t\tstatement(\"return select(128 - (clz(ballot.w) + 1), select(96 - (clz(ballot.z) + 1), select(64 - \"\n\t\t\t          \"(clz(ballot.y) + 1), select(32 - (clz(ballot.x) + 1), uint(-1), ballot.x == 0), ballot.y == 0), \"\n\t\t\t          \"ballot.z == 0), ballot.w == 0);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplSubgroupBallotBitCount:\n\t\t\tstatement(\"inline uint spvPopCount4(uint4 ballot)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return popcount(ballot.x) + popcount(ballot.y) + popcount(ballot.z) + popcount(ballot.w);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"inline uint spvSubgroupBallotBitCount(uint4 ballot, uint gl_SubgroupSize)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.is_ios())\n\t\t\t{\n\t\t\t\tstatement(\"uint4 mask = uint4(extract_bits(0xFFFFFFFF, 0, gl_SubgroupSize), uint3(0));\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstatement(\"uint4 mask = uint4(extract_bits(0xFFFFFFFF, 0, min(gl_SubgroupSize, 32u)), \"\n\t\t\t\t          \"extract_bits(0xFFFFFFFF, 0, (uint)max((int)gl_SubgroupSize - 32, 0)), uint2(0));\");\n\t\t\t}\n\t\t\tstatement(\"return spvPopCount4(ballot & mask);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"inline uint spvSubgroupBallotInclusiveBitCount(uint4 ballot, uint gl_SubgroupInvocationID)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.is_ios())\n\t\t\t{\n\t\t\t\tstatement(\"uint4 mask = uint4(extract_bits(0xFFFFFFFF, 0, gl_SubgroupInvocationID + 1), uint3(0));\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstatement(\"uint4 mask = uint4(extract_bits(0xFFFFFFFF, 0, min(gl_SubgroupInvocationID + 1, 32u)), \"\n\t\t\t\t          \"extract_bits(0xFFFFFFFF, 0, (uint)max((int)gl_SubgroupInvocationID + 1 - 32, 0)), \"\n\t\t\t\t          \"uint2(0));\");\n\t\t\t}\n\t\t\tstatement(\"return spvPopCount4(ballot & mask);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"inline uint spvSubgroupBallotExclusiveBitCount(uint4 ballot, uint gl_SubgroupInvocationID)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.is_ios())\n\t\t\t{\n\t\t\t\tstatement(\"uint4 mask = uint4(extract_bits(0xFFFFFFFF, 0, gl_SubgroupInvocationID), uint2(0));\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstatement(\"uint4 mask = uint4(extract_bits(0xFFFFFFFF, 0, min(gl_SubgroupInvocationID, 32u)), \"\n\t\t\t\t          \"extract_bits(0xFFFFFFFF, 0, (uint)max((int)gl_SubgroupInvocationID - 32, 0)), uint2(0));\");\n\t\t\t}\n\t\t\tstatement(\"return spvPopCount4(ballot & mask);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplSubgroupAllEqual:\n\t\t\t// Metal doesn't provide a function to evaluate this directly. But, we can\n\t\t\t// implement this by comparing every thread's value to one thread's value\n\t\t\t// (in this case, the value of the first active thread). Then, by the transitive\n\t\t\t// property of equality, if all comparisons return true, then they are all equal.\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline bool spvSubgroupAllEqual(T value)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.use_quadgroup_operation())\n\t\t\t\tstatement(\"return quad_all(all(value == quad_broadcast_first(value)));\");\n\t\t\telse\n\t\t\t\tstatement(\"return simd_all(all(value == simd_broadcast_first(value)));\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<>\");\n\t\t\tstatement(\"inline bool spvSubgroupAllEqual(bool value)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.use_quadgroup_operation())\n\t\t\t\tstatement(\"return quad_all(value) || !quad_any(value);\");\n\t\t\telse\n\t\t\t\tstatement(\"return simd_all(value) || !simd_any(value);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<uint N>\");\n\t\t\tstatement(\"inline bool spvSubgroupAllEqual(vec<bool, N> value)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.use_quadgroup_operation())\n\t\t\t\tstatement(\"return quad_all(all(value == (vec<bool, N>)quad_broadcast_first((vec<ushort, N>)value)));\");\n\t\t\telse\n\t\t\t\tstatement(\"return simd_all(all(value == (vec<bool, N>)simd_broadcast_first((vec<ushort, N>)value)));\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplSubgroupShuffle:\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline T spvSubgroupShuffle(T value, ushort lane)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.use_quadgroup_operation())\n\t\t\t\tstatement(\"return quad_shuffle(value, lane);\");\n\t\t\telse\n\t\t\t\tstatement(\"return simd_shuffle(value, lane);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<>\");\n\t\t\tstatement(\"inline bool spvSubgroupShuffle(bool value, ushort lane)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.use_quadgroup_operation())\n\t\t\t\tstatement(\"return !!quad_shuffle((ushort)value, lane);\");\n\t\t\telse\n\t\t\t\tstatement(\"return !!simd_shuffle((ushort)value, lane);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<uint N>\");\n\t\t\tstatement(\"inline vec<bool, N> spvSubgroupShuffle(vec<bool, N> value, ushort lane)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.use_quadgroup_operation())\n\t\t\t\tstatement(\"return (vec<bool, N>)quad_shuffle((vec<ushort, N>)value, lane);\");\n\t\t\telse\n\t\t\t\tstatement(\"return (vec<bool, N>)simd_shuffle((vec<ushort, N>)value, lane);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplSubgroupShuffleXor:\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline T spvSubgroupShuffleXor(T value, ushort mask)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.use_quadgroup_operation())\n\t\t\t\tstatement(\"return quad_shuffle_xor(value, mask);\");\n\t\t\telse\n\t\t\t\tstatement(\"return simd_shuffle_xor(value, mask);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<>\");\n\t\t\tstatement(\"inline bool spvSubgroupShuffleXor(bool value, ushort mask)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.use_quadgroup_operation())\n\t\t\t\tstatement(\"return !!quad_shuffle_xor((ushort)value, mask);\");\n\t\t\telse\n\t\t\t\tstatement(\"return !!simd_shuffle_xor((ushort)value, mask);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<uint N>\");\n\t\t\tstatement(\"inline vec<bool, N> spvSubgroupShuffleXor(vec<bool, N> value, ushort mask)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.use_quadgroup_operation())\n\t\t\t\tstatement(\"return (vec<bool, N>)quad_shuffle_xor((vec<ushort, N>)value, mask);\");\n\t\t\telse\n\t\t\t\tstatement(\"return (vec<bool, N>)simd_shuffle_xor((vec<ushort, N>)value, mask);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplSubgroupShuffleUp:\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline T spvSubgroupShuffleUp(T value, ushort delta)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.use_quadgroup_operation())\n\t\t\t\tstatement(\"return quad_shuffle_up(value, delta);\");\n\t\t\telse\n\t\t\t\tstatement(\"return simd_shuffle_up(value, delta);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<>\");\n\t\t\tstatement(\"inline bool spvSubgroupShuffleUp(bool value, ushort delta)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.use_quadgroup_operation())\n\t\t\t\tstatement(\"return !!quad_shuffle_up((ushort)value, delta);\");\n\t\t\telse\n\t\t\t\tstatement(\"return !!simd_shuffle_up((ushort)value, delta);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<uint N>\");\n\t\t\tstatement(\"inline vec<bool, N> spvSubgroupShuffleUp(vec<bool, N> value, ushort delta)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.use_quadgroup_operation())\n\t\t\t\tstatement(\"return (vec<bool, N>)quad_shuffle_up((vec<ushort, N>)value, delta);\");\n\t\t\telse\n\t\t\t\tstatement(\"return (vec<bool, N>)simd_shuffle_up((vec<ushort, N>)value, delta);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplSubgroupShuffleDown:\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline T spvSubgroupShuffleDown(T value, ushort delta)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.use_quadgroup_operation())\n\t\t\t\tstatement(\"return quad_shuffle_down(value, delta);\");\n\t\t\telse\n\t\t\t\tstatement(\"return simd_shuffle_down(value, delta);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<>\");\n\t\t\tstatement(\"inline bool spvSubgroupShuffleDown(bool value, ushort delta)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.use_quadgroup_operation())\n\t\t\t\tstatement(\"return !!quad_shuffle_down((ushort)value, delta);\");\n\t\t\telse\n\t\t\t\tstatement(\"return !!simd_shuffle_down((ushort)value, delta);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<uint N>\");\n\t\t\tstatement(\"inline vec<bool, N> spvSubgroupShuffleDown(vec<bool, N> value, ushort delta)\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.use_quadgroup_operation())\n\t\t\t\tstatement(\"return (vec<bool, N>)quad_shuffle_down((vec<ushort, N>)value, delta);\");\n\t\t\telse\n\t\t\t\tstatement(\"return (vec<bool, N>)simd_shuffle_down((vec<ushort, N>)value, delta);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplQuadBroadcast:\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline T spvQuadBroadcast(T value, uint lane)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return quad_broadcast(value, lane);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<>\");\n\t\t\tstatement(\"inline bool spvQuadBroadcast(bool value, uint lane)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return !!quad_broadcast((ushort)value, lane);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<uint N>\");\n\t\t\tstatement(\"inline vec<bool, N> spvQuadBroadcast(vec<bool, N> value, uint lane)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return (vec<bool, N>)quad_broadcast((vec<ushort, N>)value, lane);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplQuadSwap:\n\t\t\t// We can implement this easily based on the following table giving\n\t\t\t// the target lane ID from the direction and current lane ID:\n\t\t\t//        Direction\n\t\t\t//      | 0 | 1 | 2 |\n\t\t\t//   ---+---+---+---+\n\t\t\t// L 0  | 1   2   3\n\t\t\t// a 1  | 0   3   2\n\t\t\t// n 2  | 3   0   1\n\t\t\t// e 3  | 2   1   0\n\t\t\t// Notice that target = source ^ (direction + 1).\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline T spvQuadSwap(T value, uint dir)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return quad_shuffle_xor(value, dir + 1);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<>\");\n\t\t\tstatement(\"inline bool spvQuadSwap(bool value, uint dir)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return !!quad_shuffle_xor((ushort)value, dir + 1);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<uint N>\");\n\t\t\tstatement(\"inline vec<bool, N> spvQuadSwap(vec<bool, N> value, uint dir)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return (vec<bool, N>)quad_shuffle_xor((vec<ushort, N>)value, dir + 1);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplReflectScalar:\n\t\t\t// Metal does not support scalar versions of these functions.\n\t\t\t// Ensure fast-math is disabled to match Vulkan results.\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"[[clang::optnone]] T spvReflect(T i, T n)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return i - T(2) * i * n * n;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplRefractScalar:\n\t\t\t// Metal does not support scalar versions of these functions.\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline T spvRefract(T i, T n, T eta)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"T NoI = n * i;\");\n\t\t\tstatement(\"T NoI2 = NoI * NoI;\");\n\t\t\tstatement(\"T k = T(1) - eta * eta * (T(1) - NoI2);\");\n\t\t\tstatement(\"if (k < T(0))\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return T(0);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"else\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return eta * i - (eta * NoI + sqrt(k)) * n;\");\n\t\t\tend_scope();\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplFaceForwardScalar:\n\t\t\t// Metal does not support scalar versions of these functions.\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline T spvFaceForward(T n, T i, T nref)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return i * nref < T(0) ? n : -n;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplChromaReconstructNearest2Plane:\n\t\t\tstatement(\"template<typename T, typename... LodOptions>\");\n\t\t\tstatement(\"inline vec<T, 4> spvChromaReconstructNearest(texture2d<T> plane0, texture2d<T> plane1, sampler \"\n\t\t\t          \"samp, float2 coord, LodOptions... options)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"vec<T, 4> ycbcr = vec<T, 4>(0, 0, 0, 1);\");\n\t\t\tstatement(\"ycbcr.g = plane0.sample(samp, coord, spvForward<LodOptions>(options)...).r;\");\n\t\t\tstatement(\"ycbcr.br = plane1.sample(samp, coord, spvForward<LodOptions>(options)...).rg;\");\n\t\t\tstatement(\"return ycbcr;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplChromaReconstructNearest3Plane:\n\t\t\tstatement(\"template<typename T, typename... LodOptions>\");\n\t\t\tstatement(\"inline vec<T, 4> spvChromaReconstructNearest(texture2d<T> plane0, texture2d<T> plane1, \"\n\t\t\t          \"texture2d<T> plane2, sampler samp, float2 coord, LodOptions... options)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"vec<T, 4> ycbcr = vec<T, 4>(0, 0, 0, 1);\");\n\t\t\tstatement(\"ycbcr.g = plane0.sample(samp, coord, spvForward<LodOptions>(options)...).r;\");\n\t\t\tstatement(\"ycbcr.b = plane1.sample(samp, coord, spvForward<LodOptions>(options)...).r;\");\n\t\t\tstatement(\"ycbcr.r = plane2.sample(samp, coord, spvForward<LodOptions>(options)...).r;\");\n\t\t\tstatement(\"return ycbcr;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplChromaReconstructLinear422CositedEven2Plane:\n\t\t\tstatement(\"template<typename T, typename... LodOptions>\");\n\t\t\tstatement(\"inline vec<T, 4> spvChromaReconstructLinear422CositedEven(texture2d<T> plane0, texture2d<T> \"\n\t\t\t          \"plane1, sampler samp, float2 coord, LodOptions... options)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"vec<T, 4> ycbcr = vec<T, 4>(0, 0, 0, 1);\");\n\t\t\tstatement(\"ycbcr.g = plane0.sample(samp, coord, spvForward<LodOptions>(options)...).r;\");\n\t\t\tstatement(\"if (fract(coord.x * plane1.get_width()) != 0.0)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"ycbcr.br = vec<T, 2>(mix(plane1.sample(samp, coord, spvForward<LodOptions>(options)...), \"\n\t\t\t          \"plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 0)), 0.5).rg);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"else\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"ycbcr.br = plane1.sample(samp, coord, spvForward<LodOptions>(options)...).rg;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"return ycbcr;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplChromaReconstructLinear422CositedEven3Plane:\n\t\t\tstatement(\"template<typename T, typename... LodOptions>\");\n\t\t\tstatement(\"inline vec<T, 4> spvChromaReconstructLinear422CositedEven(texture2d<T> plane0, texture2d<T> \"\n\t\t\t          \"plane1, texture2d<T> plane2, sampler samp, float2 coord, LodOptions... options)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"vec<T, 4> ycbcr = vec<T, 4>(0, 0, 0, 1);\");\n\t\t\tstatement(\"ycbcr.g = plane0.sample(samp, coord, spvForward<LodOptions>(options)...).r;\");\n\t\t\tstatement(\"if (fract(coord.x * plane1.get_width()) != 0.0)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"ycbcr.b = T(mix(plane1.sample(samp, coord, spvForward<LodOptions>(options)...), \"\n\t\t\t          \"plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 0)), 0.5).r);\");\n\t\t\tstatement(\"ycbcr.r = T(mix(plane2.sample(samp, coord, spvForward<LodOptions>(options)...), \"\n\t\t\t          \"plane2.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 0)), 0.5).r);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"else\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"ycbcr.b = plane1.sample(samp, coord, spvForward<LodOptions>(options)...).r;\");\n\t\t\tstatement(\"ycbcr.r = plane2.sample(samp, coord, spvForward<LodOptions>(options)...).r;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"return ycbcr;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplChromaReconstructLinear422Midpoint2Plane:\n\t\t\tstatement(\"template<typename T, typename... LodOptions>\");\n\t\t\tstatement(\"inline vec<T, 4> spvChromaReconstructLinear422Midpoint(texture2d<T> plane0, texture2d<T> \"\n\t\t\t          \"plane1, sampler samp, float2 coord, LodOptions... options)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"vec<T, 4> ycbcr = vec<T, 4>(0, 0, 0, 1);\");\n\t\t\tstatement(\"ycbcr.g = plane0.sample(samp, coord, spvForward<LodOptions>(options)...).r;\");\n\t\t\tstatement(\"int2 offs = int2(fract(coord.x * plane1.get_width()) != 0.0 ? 1 : -1, 0);\");\n\t\t\tstatement(\"ycbcr.br = vec<T, 2>(mix(plane1.sample(samp, coord, spvForward<LodOptions>(options)...), \"\n\t\t\t          \"plane1.sample(samp, coord, spvForward<LodOptions>(options)..., offs), 0.25).rg);\");\n\t\t\tstatement(\"return ycbcr;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplChromaReconstructLinear422Midpoint3Plane:\n\t\t\tstatement(\"template<typename T, typename... LodOptions>\");\n\t\t\tstatement(\"inline vec<T, 4> spvChromaReconstructLinear422Midpoint(texture2d<T> plane0, texture2d<T> \"\n\t\t\t          \"plane1, texture2d<T> plane2, sampler samp, float2 coord, LodOptions... options)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"vec<T, 4> ycbcr = vec<T, 4>(0, 0, 0, 1);\");\n\t\t\tstatement(\"ycbcr.g = plane0.sample(samp, coord, spvForward<LodOptions>(options)...).r;\");\n\t\t\tstatement(\"int2 offs = int2(fract(coord.x * plane1.get_width()) != 0.0 ? 1 : -1, 0);\");\n\t\t\tstatement(\"ycbcr.b = T(mix(plane1.sample(samp, coord, spvForward<LodOptions>(options)...), \"\n\t\t\t          \"plane1.sample(samp, coord, spvForward<LodOptions>(options)..., offs), 0.25).r);\");\n\t\t\tstatement(\"ycbcr.r = T(mix(plane2.sample(samp, coord, spvForward<LodOptions>(options)...), \"\n\t\t\t          \"plane2.sample(samp, coord, spvForward<LodOptions>(options)..., offs), 0.25).r);\");\n\t\t\tstatement(\"return ycbcr;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplChromaReconstructLinear420XCositedEvenYCositedEven2Plane:\n\t\t\tstatement(\"template<typename T, typename... LodOptions>\");\n\t\t\tstatement(\"inline vec<T, 4> spvChromaReconstructLinear420XCositedEvenYCositedEven(texture2d<T> plane0, \"\n\t\t\t          \"texture2d<T> plane1, sampler samp, float2 coord, LodOptions... options)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"vec<T, 4> ycbcr = vec<T, 4>(0, 0, 0, 1);\");\n\t\t\tstatement(\"ycbcr.g = plane0.sample(samp, coord, spvForward<LodOptions>(options)...).r;\");\n\t\t\tstatement(\"float2 ab = fract(round(coord * float2(plane0.get_width(), plane0.get_height())) * 0.5);\");\n\t\t\tstatement(\"ycbcr.br = vec<T, 2>(mix(mix(plane1.sample(samp, coord, spvForward<LodOptions>(options)...), \"\n\t\t\t          \"plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 0)), ab.x), \"\n\t\t\t          \"mix(plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(0, 1)), \"\n\t\t\t          \"plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 1)), ab.x), ab.y).rg);\");\n\t\t\tstatement(\"return ycbcr;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplChromaReconstructLinear420XCositedEvenYCositedEven3Plane:\n\t\t\tstatement(\"template<typename T, typename... LodOptions>\");\n\t\t\tstatement(\"inline vec<T, 4> spvChromaReconstructLinear420XCositedEvenYCositedEven(texture2d<T> plane0, \"\n\t\t\t          \"texture2d<T> plane1, texture2d<T> plane2, sampler samp, float2 coord, LodOptions... options)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"vec<T, 4> ycbcr = vec<T, 4>(0, 0, 0, 1);\");\n\t\t\tstatement(\"ycbcr.g = plane0.sample(samp, coord, spvForward<LodOptions>(options)...).r;\");\n\t\t\tstatement(\"float2 ab = fract(round(coord * float2(plane0.get_width(), plane0.get_height())) * 0.5);\");\n\t\t\tstatement(\"ycbcr.b = T(mix(mix(plane1.sample(samp, coord, spvForward<LodOptions>(options)...), \"\n\t\t\t          \"plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 0)), ab.x), \"\n\t\t\t          \"mix(plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(0, 1)), \"\n\t\t\t          \"plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 1)), ab.x), ab.y).r);\");\n\t\t\tstatement(\"ycbcr.r = T(mix(mix(plane2.sample(samp, coord, spvForward<LodOptions>(options)...), \"\n\t\t\t          \"plane2.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 0)), ab.x), \"\n\t\t\t          \"mix(plane2.sample(samp, coord, spvForward<LodOptions>(options)..., int2(0, 1)), \"\n\t\t\t          \"plane2.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 1)), ab.x), ab.y).r);\");\n\t\t\tstatement(\"return ycbcr;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplChromaReconstructLinear420XMidpointYCositedEven2Plane:\n\t\t\tstatement(\"template<typename T, typename... LodOptions>\");\n\t\t\tstatement(\"inline vec<T, 4> spvChromaReconstructLinear420XMidpointYCositedEven(texture2d<T> plane0, \"\n\t\t\t          \"texture2d<T> plane1, sampler samp, float2 coord, LodOptions... options)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"vec<T, 4> ycbcr = vec<T, 4>(0, 0, 0, 1);\");\n\t\t\tstatement(\"ycbcr.g = plane0.sample(samp, coord, spvForward<LodOptions>(options)...).r;\");\n\t\t\tstatement(\"float2 ab = fract((round(coord * float2(plane0.get_width(), plane0.get_height())) - float2(0.5, \"\n\t\t\t          \"0)) * 0.5);\");\n\t\t\tstatement(\"ycbcr.br = vec<T, 2>(mix(mix(plane1.sample(samp, coord, spvForward<LodOptions>(options)...), \"\n\t\t\t          \"plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 0)), ab.x), \"\n\t\t\t          \"mix(plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(0, 1)), \"\n\t\t\t          \"plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 1)), ab.x), ab.y).rg);\");\n\t\t\tstatement(\"return ycbcr;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplChromaReconstructLinear420XMidpointYCositedEven3Plane:\n\t\t\tstatement(\"template<typename T, typename... LodOptions>\");\n\t\t\tstatement(\"inline vec<T, 4> spvChromaReconstructLinear420XMidpointYCositedEven(texture2d<T> plane0, \"\n\t\t\t          \"texture2d<T> plane1, texture2d<T> plane2, sampler samp, float2 coord, LodOptions... options)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"vec<T, 4> ycbcr = vec<T, 4>(0, 0, 0, 1);\");\n\t\t\tstatement(\"ycbcr.g = plane0.sample(samp, coord, spvForward<LodOptions>(options)...).r;\");\n\t\t\tstatement(\"float2 ab = fract((round(coord * float2(plane0.get_width(), plane0.get_height())) - float2(0.5, \"\n\t\t\t          \"0)) * 0.5);\");\n\t\t\tstatement(\"ycbcr.b = T(mix(mix(plane1.sample(samp, coord, spvForward<LodOptions>(options)...), \"\n\t\t\t          \"plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 0)), ab.x), \"\n\t\t\t          \"mix(plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(0, 1)), \"\n\t\t\t          \"plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 1)), ab.x), ab.y).r);\");\n\t\t\tstatement(\"ycbcr.r = T(mix(mix(plane2.sample(samp, coord, spvForward<LodOptions>(options)...), \"\n\t\t\t          \"plane2.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 0)), ab.x), \"\n\t\t\t          \"mix(plane2.sample(samp, coord, spvForward<LodOptions>(options)..., int2(0, 1)), \"\n\t\t\t          \"plane2.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 1)), ab.x), ab.y).r);\");\n\t\t\tstatement(\"return ycbcr;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplChromaReconstructLinear420XCositedEvenYMidpoint2Plane:\n\t\t\tstatement(\"template<typename T, typename... LodOptions>\");\n\t\t\tstatement(\"inline vec<T, 4> spvChromaReconstructLinear420XCositedEvenYMidpoint(texture2d<T> plane0, \"\n\t\t\t          \"texture2d<T> plane1, sampler samp, float2 coord, LodOptions... options)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"vec<T, 4> ycbcr = vec<T, 4>(0, 0, 0, 1);\");\n\t\t\tstatement(\"ycbcr.g = plane0.sample(samp, coord, spvForward<LodOptions>(options)...).r;\");\n\t\t\tstatement(\"float2 ab = fract((round(coord * float2(plane0.get_width(), plane0.get_height())) - float2(0, \"\n\t\t\t          \"0.5)) * 0.5);\");\n\t\t\tstatement(\"ycbcr.br = vec<T, 2>(mix(mix(plane1.sample(samp, coord, spvForward<LodOptions>(options)...), \"\n\t\t\t          \"plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 0)), ab.x), \"\n\t\t\t          \"mix(plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(0, 1)), \"\n\t\t\t          \"plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 1)), ab.x), ab.y).rg);\");\n\t\t\tstatement(\"return ycbcr;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplChromaReconstructLinear420XCositedEvenYMidpoint3Plane:\n\t\t\tstatement(\"template<typename T, typename... LodOptions>\");\n\t\t\tstatement(\"inline vec<T, 4> spvChromaReconstructLinear420XCositedEvenYMidpoint(texture2d<T> plane0, \"\n\t\t\t          \"texture2d<T> plane1, texture2d<T> plane2, sampler samp, float2 coord, LodOptions... options)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"vec<T, 4> ycbcr = vec<T, 4>(0, 0, 0, 1);\");\n\t\t\tstatement(\"ycbcr.g = plane0.sample(samp, coord, spvForward<LodOptions>(options)...).r;\");\n\t\t\tstatement(\"float2 ab = fract((round(coord * float2(plane0.get_width(), plane0.get_height())) - float2(0, \"\n\t\t\t          \"0.5)) * 0.5);\");\n\t\t\tstatement(\"ycbcr.b = T(mix(mix(plane1.sample(samp, coord, spvForward<LodOptions>(options)...), \"\n\t\t\t          \"plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 0)), ab.x), \"\n\t\t\t          \"mix(plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(0, 1)), \"\n\t\t\t          \"plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 1)), ab.x), ab.y).r);\");\n\t\t\tstatement(\"ycbcr.r = T(mix(mix(plane2.sample(samp, coord, spvForward<LodOptions>(options)...), \"\n\t\t\t          \"plane2.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 0)), ab.x), \"\n\t\t\t          \"mix(plane2.sample(samp, coord, spvForward<LodOptions>(options)..., int2(0, 1)), \"\n\t\t\t          \"plane2.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 1)), ab.x), ab.y).r);\");\n\t\t\tstatement(\"return ycbcr;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplChromaReconstructLinear420XMidpointYMidpoint2Plane:\n\t\t\tstatement(\"template<typename T, typename... LodOptions>\");\n\t\t\tstatement(\"inline vec<T, 4> spvChromaReconstructLinear420XMidpointYMidpoint(texture2d<T> plane0, \"\n\t\t\t          \"texture2d<T> plane1, sampler samp, float2 coord, LodOptions... options)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"vec<T, 4> ycbcr = vec<T, 4>(0, 0, 0, 1);\");\n\t\t\tstatement(\"ycbcr.g = plane0.sample(samp, coord, spvForward<LodOptions>(options)...).r;\");\n\t\t\tstatement(\"float2 ab = fract((round(coord * float2(plane0.get_width(), plane0.get_height())) - float2(0.5, \"\n\t\t\t          \"0.5)) * 0.5);\");\n\t\t\tstatement(\"ycbcr.br = vec<T, 2>(mix(mix(plane1.sample(samp, coord, spvForward<LodOptions>(options)...), \"\n\t\t\t          \"plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 0)), ab.x), \"\n\t\t\t          \"mix(plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(0, 1)), \"\n\t\t\t          \"plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 1)), ab.x), ab.y).rg);\");\n\t\t\tstatement(\"return ycbcr;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplChromaReconstructLinear420XMidpointYMidpoint3Plane:\n\t\t\tstatement(\"template<typename T, typename... LodOptions>\");\n\t\t\tstatement(\"inline vec<T, 4> spvChromaReconstructLinear420XMidpointYMidpoint(texture2d<T> plane0, \"\n\t\t\t          \"texture2d<T> plane1, texture2d<T> plane2, sampler samp, float2 coord, LodOptions... options)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"vec<T, 4> ycbcr = vec<T, 4>(0, 0, 0, 1);\");\n\t\t\tstatement(\"ycbcr.g = plane0.sample(samp, coord, spvForward<LodOptions>(options)...).r;\");\n\t\t\tstatement(\"float2 ab = fract((round(coord * float2(plane0.get_width(), plane0.get_height())) - float2(0.5, \"\n\t\t\t          \"0.5)) * 0.5);\");\n\t\t\tstatement(\"ycbcr.b = T(mix(mix(plane1.sample(samp, coord, spvForward<LodOptions>(options)...), \"\n\t\t\t          \"plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 0)), ab.x), \"\n\t\t\t          \"mix(plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(0, 1)), \"\n\t\t\t          \"plane1.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 1)), ab.x), ab.y).r);\");\n\t\t\tstatement(\"ycbcr.r = T(mix(mix(plane2.sample(samp, coord, spvForward<LodOptions>(options)...), \"\n\t\t\t          \"plane2.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 0)), ab.x), \"\n\t\t\t          \"mix(plane2.sample(samp, coord, spvForward<LodOptions>(options)..., int2(0, 1)), \"\n\t\t\t          \"plane2.sample(samp, coord, spvForward<LodOptions>(options)..., int2(1, 1)), ab.x), ab.y).r);\");\n\t\t\tstatement(\"return ycbcr;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplExpandITUFullRange:\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline vec<T, 4> spvExpandITUFullRange(vec<T, 4> ycbcr, int n)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"ycbcr.br -= exp2(T(n-1))/(exp2(T(n))-1);\");\n\t\t\tstatement(\"return ycbcr;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplExpandITUNarrowRange:\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline vec<T, 4> spvExpandITUNarrowRange(vec<T, 4> ycbcr, int n)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"ycbcr.g = (ycbcr.g * (exp2(T(n)) - 1) - ldexp(T(16), n - 8))/ldexp(T(219), n - 8);\");\n\t\t\tstatement(\"ycbcr.br = (ycbcr.br * (exp2(T(n)) - 1) - ldexp(T(128), n - 8))/ldexp(T(224), n - 8);\");\n\t\t\tstatement(\"return ycbcr;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplConvertYCbCrBT709:\n\t\t\tstatement(\"// cf. Khronos Data Format Specification, section 15.1.1\");\n\t\t\tstatement(\"constant float3x3 spvBT709Factors = {{1, 1, 1}, {0, -0.13397432/0.7152, 1.8556}, {1.5748, \"\n\t\t\t          \"-0.33480248/0.7152, 0}};\");\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline vec<T, 4> spvConvertYCbCrBT709(vec<T, 4> ycbcr)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"vec<T, 4> rgba;\");\n\t\t\tstatement(\"rgba.rgb = vec<T, 3>(spvBT709Factors * ycbcr.gbr);\");\n\t\t\tstatement(\"rgba.a = ycbcr.a;\");\n\t\t\tstatement(\"return rgba;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplConvertYCbCrBT601:\n\t\t\tstatement(\"// cf. Khronos Data Format Specification, section 15.1.2\");\n\t\t\tstatement(\"constant float3x3 spvBT601Factors = {{1, 1, 1}, {0, -0.202008/0.587, 1.772}, {1.402, \"\n\t\t\t          \"-0.419198/0.587, 0}};\");\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline vec<T, 4> spvConvertYCbCrBT601(vec<T, 4> ycbcr)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"vec<T, 4> rgba;\");\n\t\t\tstatement(\"rgba.rgb = vec<T, 3>(spvBT601Factors * ycbcr.gbr);\");\n\t\t\tstatement(\"rgba.a = ycbcr.a;\");\n\t\t\tstatement(\"return rgba;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplConvertYCbCrBT2020:\n\t\t\tstatement(\"// cf. Khronos Data Format Specification, section 15.1.3\");\n\t\t\tstatement(\"constant float3x3 spvBT2020Factors = {{1, 1, 1}, {0, -0.11156702/0.6780, 1.8814}, {1.4746, \"\n\t\t\t          \"-0.38737742/0.6780, 0}};\");\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"inline vec<T, 4> spvConvertYCbCrBT2020(vec<T, 4> ycbcr)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"vec<T, 4> rgba;\");\n\t\t\tstatement(\"rgba.rgb = vec<T, 3>(spvBT2020Factors * ycbcr.gbr);\");\n\t\t\tstatement(\"rgba.a = ycbcr.a;\");\n\t\t\tstatement(\"return rgba;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplDynamicImageSampler:\n\t\t\tstatement(\"enum class spvFormatResolution\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"_444 = 0,\");\n\t\t\tstatement(\"_422,\");\n\t\t\tstatement(\"_420\");\n\t\t\tend_scope_decl();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"enum class spvChromaFilter\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"nearest = 0,\");\n\t\t\tstatement(\"linear\");\n\t\t\tend_scope_decl();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"enum class spvXChromaLocation\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"cosited_even = 0,\");\n\t\t\tstatement(\"midpoint\");\n\t\t\tend_scope_decl();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"enum class spvYChromaLocation\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"cosited_even = 0,\");\n\t\t\tstatement(\"midpoint\");\n\t\t\tend_scope_decl();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"enum class spvYCbCrModelConversion\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"rgb_identity = 0,\");\n\t\t\tstatement(\"ycbcr_identity,\");\n\t\t\tstatement(\"ycbcr_bt_709,\");\n\t\t\tstatement(\"ycbcr_bt_601,\");\n\t\t\tstatement(\"ycbcr_bt_2020\");\n\t\t\tend_scope_decl();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"enum class spvYCbCrRange\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"itu_full = 0,\");\n\t\t\tstatement(\"itu_narrow\");\n\t\t\tend_scope_decl();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"struct spvComponentBits\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"constexpr explicit spvComponentBits(int v) thread : value(v) {}\");\n\t\t\tstatement(\"uchar value : 6;\");\n\t\t\tend_scope_decl();\n\t\t\tstatement(\"// A class corresponding to metal::sampler which holds sampler\");\n\t\t\tstatement(\"// Y'CbCr conversion info.\");\n\t\t\tstatement(\"struct spvYCbCrSampler\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"constexpr spvYCbCrSampler() thread : val(build()) {}\");\n\t\t\tstatement(\"template<typename... Ts>\");\n\t\t\tstatement(\"constexpr spvYCbCrSampler(Ts... t) thread : val(build(t...)) {}\");\n\t\t\tstatement(\"constexpr spvYCbCrSampler(const thread spvYCbCrSampler& s) thread = default;\");\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"spvFormatResolution get_resolution() const thread\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return spvFormatResolution((val & resolution_mask) >> resolution_base);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"spvChromaFilter get_chroma_filter() const thread\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return spvChromaFilter((val & chroma_filter_mask) >> chroma_filter_base);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"spvXChromaLocation get_x_chroma_offset() const thread\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return spvXChromaLocation((val & x_chroma_off_mask) >> x_chroma_off_base);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"spvYChromaLocation get_y_chroma_offset() const thread\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return spvYChromaLocation((val & y_chroma_off_mask) >> y_chroma_off_base);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"spvYCbCrModelConversion get_ycbcr_model() const thread\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return spvYCbCrModelConversion((val & ycbcr_model_mask) >> ycbcr_model_base);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"spvYCbCrRange get_ycbcr_range() const thread\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return spvYCbCrRange((val & ycbcr_range_mask) >> ycbcr_range_base);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"int get_bpc() const thread { return (val & bpc_mask) >> bpc_base; }\");\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"private:\");\n\t\t\tstatement(\"ushort val;\");\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"constexpr static constant ushort resolution_bits = 2;\");\n\t\t\tstatement(\"constexpr static constant ushort chroma_filter_bits = 2;\");\n\t\t\tstatement(\"constexpr static constant ushort x_chroma_off_bit = 1;\");\n\t\t\tstatement(\"constexpr static constant ushort y_chroma_off_bit = 1;\");\n\t\t\tstatement(\"constexpr static constant ushort ycbcr_model_bits = 3;\");\n\t\t\tstatement(\"constexpr static constant ushort ycbcr_range_bit = 1;\");\n\t\t\tstatement(\"constexpr static constant ushort bpc_bits = 6;\");\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"constexpr static constant ushort resolution_base = 0;\");\n\t\t\tstatement(\"constexpr static constant ushort chroma_filter_base = 2;\");\n\t\t\tstatement(\"constexpr static constant ushort x_chroma_off_base = 4;\");\n\t\t\tstatement(\"constexpr static constant ushort y_chroma_off_base = 5;\");\n\t\t\tstatement(\"constexpr static constant ushort ycbcr_model_base = 6;\");\n\t\t\tstatement(\"constexpr static constant ushort ycbcr_range_base = 9;\");\n\t\t\tstatement(\"constexpr static constant ushort bpc_base = 10;\");\n\t\t\tstatement(\"\");\n\t\t\tstatement(\n\t\t\t    \"constexpr static constant ushort resolution_mask = ((1 << resolution_bits) - 1) << resolution_base;\");\n\t\t\tstatement(\"constexpr static constant ushort chroma_filter_mask = ((1 << chroma_filter_bits) - 1) << \"\n\t\t\t          \"chroma_filter_base;\");\n\t\t\tstatement(\"constexpr static constant ushort x_chroma_off_mask = ((1 << x_chroma_off_bit) - 1) << \"\n\t\t\t          \"x_chroma_off_base;\");\n\t\t\tstatement(\"constexpr static constant ushort y_chroma_off_mask = ((1 << y_chroma_off_bit) - 1) << \"\n\t\t\t          \"y_chroma_off_base;\");\n\t\t\tstatement(\"constexpr static constant ushort ycbcr_model_mask = ((1 << ycbcr_model_bits) - 1) << \"\n\t\t\t          \"ycbcr_model_base;\");\n\t\t\tstatement(\"constexpr static constant ushort ycbcr_range_mask = ((1 << ycbcr_range_bit) - 1) << \"\n\t\t\t          \"ycbcr_range_base;\");\n\t\t\tstatement(\"constexpr static constant ushort bpc_mask = ((1 << bpc_bits) - 1) << bpc_base;\");\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"static constexpr ushort build()\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return 0;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<typename... Ts>\");\n\t\t\tstatement(\"static constexpr ushort build(spvFormatResolution res, Ts... t)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return (ushort(res) << resolution_base) | (build(t...) & ~resolution_mask);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<typename... Ts>\");\n\t\t\tstatement(\"static constexpr ushort build(spvChromaFilter filt, Ts... t)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return (ushort(filt) << chroma_filter_base) | (build(t...) & ~chroma_filter_mask);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<typename... Ts>\");\n\t\t\tstatement(\"static constexpr ushort build(spvXChromaLocation loc, Ts... t)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return (ushort(loc) << x_chroma_off_base) | (build(t...) & ~x_chroma_off_mask);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<typename... Ts>\");\n\t\t\tstatement(\"static constexpr ushort build(spvYChromaLocation loc, Ts... t)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return (ushort(loc) << y_chroma_off_base) | (build(t...) & ~y_chroma_off_mask);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<typename... Ts>\");\n\t\t\tstatement(\"static constexpr ushort build(spvYCbCrModelConversion model, Ts... t)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return (ushort(model) << ycbcr_model_base) | (build(t...) & ~ycbcr_model_mask);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<typename... Ts>\");\n\t\t\tstatement(\"static constexpr ushort build(spvYCbCrRange range, Ts... t)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return (ushort(range) << ycbcr_range_base) | (build(t...) & ~ycbcr_range_mask);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"template<typename... Ts>\");\n\t\t\tstatement(\"static constexpr ushort build(spvComponentBits bpc, Ts... t)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return (ushort(bpc.value) << bpc_base) | (build(t...) & ~bpc_mask);\");\n\t\t\tend_scope();\n\t\t\tend_scope_decl();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"// A class which can hold up to three textures and a sampler, including\");\n\t\t\tstatement(\"// Y'CbCr conversion info, used to pass combined image-samplers\");\n\t\t\tstatement(\"// dynamically to functions.\");\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"struct spvDynamicImageSampler\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"texture2d<T> plane0;\");\n\t\t\tstatement(\"texture2d<T> plane1;\");\n\t\t\tstatement(\"texture2d<T> plane2;\");\n\t\t\tstatement(\"sampler samp;\");\n\t\t\tstatement(\"spvYCbCrSampler ycbcr_samp;\");\n\t\t\tstatement(\"uint swizzle = 0;\");\n\t\t\tstatement(\"\");\n\t\t\tif (msl_options.swizzle_texture_samples)\n\t\t\t{\n\t\t\t\tstatement(\"constexpr spvDynamicImageSampler(texture2d<T> tex, sampler samp, uint sw) thread :\");\n\t\t\t\tstatement(\"    plane0(tex), samp(samp), swizzle(sw) {}\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstatement(\"constexpr spvDynamicImageSampler(texture2d<T> tex, sampler samp) thread :\");\n\t\t\t\tstatement(\"    plane0(tex), samp(samp) {}\");\n\t\t\t}\n\t\t\tstatement(\"constexpr spvDynamicImageSampler(texture2d<T> tex, sampler samp, spvYCbCrSampler ycbcr_samp, \"\n\t\t\t          \"uint sw) thread :\");\n\t\t\tstatement(\"    plane0(tex), samp(samp), ycbcr_samp(ycbcr_samp), swizzle(sw) {}\");\n\t\t\tstatement(\"constexpr spvDynamicImageSampler(texture2d<T> plane0, texture2d<T> plane1,\");\n\t\t\tstatement(\"                                 sampler samp, spvYCbCrSampler ycbcr_samp, uint sw) thread :\");\n\t\t\tstatement(\"    plane0(plane0), plane1(plane1), samp(samp), ycbcr_samp(ycbcr_samp), swizzle(sw) {}\");\n\t\t\tstatement(\n\t\t\t    \"constexpr spvDynamicImageSampler(texture2d<T> plane0, texture2d<T> plane1, texture2d<T> plane2,\");\n\t\t\tstatement(\"                                 sampler samp, spvYCbCrSampler ycbcr_samp, uint sw) thread :\");\n\t\t\tstatement(\"    plane0(plane0), plane1(plane1), plane2(plane2), samp(samp), ycbcr_samp(ycbcr_samp), \"\n\t\t\t          \"swizzle(sw) {}\");\n\t\t\tstatement(\"\");\n\t\t\t// XXX This is really hard to follow... I've left comments to make it a bit easier.\n\t\t\tstatement(\"template<typename... LodOptions>\");\n\t\t\tstatement(\"vec<T, 4> do_sample(float2 coord, LodOptions... options) const thread\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"if (!is_null_texture(plane1))\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"if (ycbcr_samp.get_resolution() == spvFormatResolution::_444 ||\");\n\t\t\tstatement(\"    ycbcr_samp.get_chroma_filter() == spvChromaFilter::nearest)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"if (!is_null_texture(plane2))\");\n\t\t\tstatement(\"    return spvChromaReconstructNearest(plane0, plane1, plane2, samp, coord,\");\n\t\t\tstatement(\"                                       spvForward<LodOptions>(options)...);\");\n\t\t\tstatement(\n\t\t\t    \"return spvChromaReconstructNearest(plane0, plane1, samp, coord, spvForward<LodOptions>(options)...);\");\n\t\t\tend_scope(); // if (resolution == 422 || chroma_filter == nearest)\n\t\t\tstatement(\"switch (ycbcr_samp.get_resolution())\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"case spvFormatResolution::_444: break;\");\n\t\t\tstatement(\"case spvFormatResolution::_422:\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"switch (ycbcr_samp.get_x_chroma_offset())\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"case spvXChromaLocation::cosited_even:\");\n\t\t\tstatement(\"    if (!is_null_texture(plane2))\");\n\t\t\tstatement(\"        return spvChromaReconstructLinear422CositedEven(\");\n\t\t\tstatement(\"            plane0, plane1, plane2, samp,\");\n\t\t\tstatement(\"            coord, spvForward<LodOptions>(options)...);\");\n\t\t\tstatement(\"    return spvChromaReconstructLinear422CositedEven(\");\n\t\t\tstatement(\"        plane0, plane1, samp, coord,\");\n\t\t\tstatement(\"        spvForward<LodOptions>(options)...);\");\n\t\t\tstatement(\"case spvXChromaLocation::midpoint:\");\n\t\t\tstatement(\"    if (!is_null_texture(plane2))\");\n\t\t\tstatement(\"        return spvChromaReconstructLinear422Midpoint(\");\n\t\t\tstatement(\"            plane0, plane1, plane2, samp,\");\n\t\t\tstatement(\"            coord, spvForward<LodOptions>(options)...);\");\n\t\t\tstatement(\"    return spvChromaReconstructLinear422Midpoint(\");\n\t\t\tstatement(\"        plane0, plane1, samp, coord,\");\n\t\t\tstatement(\"        spvForward<LodOptions>(options)...);\");\n\t\t\tend_scope(); // switch (x_chroma_offset)\n\t\t\tend_scope(); // case 422:\n\t\t\tstatement(\"case spvFormatResolution::_420:\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"switch (ycbcr_samp.get_x_chroma_offset())\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"case spvXChromaLocation::cosited_even:\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"switch (ycbcr_samp.get_y_chroma_offset())\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"case spvYChromaLocation::cosited_even:\");\n\t\t\tstatement(\"    if (!is_null_texture(plane2))\");\n\t\t\tstatement(\"        return spvChromaReconstructLinear420XCositedEvenYCositedEven(\");\n\t\t\tstatement(\"            plane0, plane1, plane2, samp,\");\n\t\t\tstatement(\"            coord, spvForward<LodOptions>(options)...);\");\n\t\t\tstatement(\"    return spvChromaReconstructLinear420XCositedEvenYCositedEven(\");\n\t\t\tstatement(\"        plane0, plane1, samp, coord,\");\n\t\t\tstatement(\"        spvForward<LodOptions>(options)...);\");\n\t\t\tstatement(\"case spvYChromaLocation::midpoint:\");\n\t\t\tstatement(\"    if (!is_null_texture(plane2))\");\n\t\t\tstatement(\"        return spvChromaReconstructLinear420XCositedEvenYMidpoint(\");\n\t\t\tstatement(\"            plane0, plane1, plane2, samp,\");\n\t\t\tstatement(\"            coord, spvForward<LodOptions>(options)...);\");\n\t\t\tstatement(\"    return spvChromaReconstructLinear420XCositedEvenYMidpoint(\");\n\t\t\tstatement(\"        plane0, plane1, samp, coord,\");\n\t\t\tstatement(\"        spvForward<LodOptions>(options)...);\");\n\t\t\tend_scope(); // switch (y_chroma_offset)\n\t\t\tend_scope(); // case x::cosited_even:\n\t\t\tstatement(\"case spvXChromaLocation::midpoint:\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"switch (ycbcr_samp.get_y_chroma_offset())\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"case spvYChromaLocation::cosited_even:\");\n\t\t\tstatement(\"    if (!is_null_texture(plane2))\");\n\t\t\tstatement(\"        return spvChromaReconstructLinear420XMidpointYCositedEven(\");\n\t\t\tstatement(\"            plane0, plane1, plane2, samp,\");\n\t\t\tstatement(\"            coord, spvForward<LodOptions>(options)...);\");\n\t\t\tstatement(\"    return spvChromaReconstructLinear420XMidpointYCositedEven(\");\n\t\t\tstatement(\"        plane0, plane1, samp, coord,\");\n\t\t\tstatement(\"        spvForward<LodOptions>(options)...);\");\n\t\t\tstatement(\"case spvYChromaLocation::midpoint:\");\n\t\t\tstatement(\"    if (!is_null_texture(plane2))\");\n\t\t\tstatement(\"        return spvChromaReconstructLinear420XMidpointYMidpoint(\");\n\t\t\tstatement(\"            plane0, plane1, plane2, samp,\");\n\t\t\tstatement(\"            coord, spvForward<LodOptions>(options)...);\");\n\t\t\tstatement(\"    return spvChromaReconstructLinear420XMidpointYMidpoint(\");\n\t\t\tstatement(\"        plane0, plane1, samp, coord,\");\n\t\t\tstatement(\"        spvForward<LodOptions>(options)...);\");\n\t\t\tend_scope(); // switch (y_chroma_offset)\n\t\t\tend_scope(); // case x::midpoint\n\t\t\tend_scope(); // switch (x_chroma_offset)\n\t\t\tend_scope(); // case 420:\n\t\t\tend_scope(); // switch (resolution)\n\t\t\tend_scope(); // if (multiplanar)\n\t\t\tstatement(\"return plane0.sample(samp, coord, spvForward<LodOptions>(options)...);\");\n\t\t\tend_scope(); // do_sample()\n\t\t\tstatement(\"template <typename... LodOptions>\");\n\t\t\tstatement(\"vec<T, 4> sample(float2 coord, LodOptions... options) const thread\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\n\t\t\t    \"vec<T, 4> s = spvTextureSwizzle(do_sample(coord, spvForward<LodOptions>(options)...), swizzle);\");\n\t\t\tstatement(\"if (ycbcr_samp.get_ycbcr_model() == spvYCbCrModelConversion::rgb_identity)\");\n\t\t\tstatement(\"    return s;\");\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"switch (ycbcr_samp.get_ycbcr_range())\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"case spvYCbCrRange::itu_full:\");\n\t\t\tstatement(\"    s = spvExpandITUFullRange(s, ycbcr_samp.get_bpc());\");\n\t\t\tstatement(\"    break;\");\n\t\t\tstatement(\"case spvYCbCrRange::itu_narrow:\");\n\t\t\tstatement(\"    s = spvExpandITUNarrowRange(s, ycbcr_samp.get_bpc());\");\n\t\t\tstatement(\"    break;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"switch (ycbcr_samp.get_ycbcr_model())\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"case spvYCbCrModelConversion::rgb_identity:\"); // Silence Clang warning\n\t\t\tstatement(\"case spvYCbCrModelConversion::ycbcr_identity:\");\n\t\t\tstatement(\"    return s;\");\n\t\t\tstatement(\"case spvYCbCrModelConversion::ycbcr_bt_709:\");\n\t\t\tstatement(\"    return spvConvertYCbCrBT709(s);\");\n\t\t\tstatement(\"case spvYCbCrModelConversion::ycbcr_bt_601:\");\n\t\t\tstatement(\"    return spvConvertYCbCrBT601(s);\");\n\t\t\tstatement(\"case spvYCbCrModelConversion::ycbcr_bt_2020:\");\n\t\t\tstatement(\"    return spvConvertYCbCrBT2020(s);\");\n\t\t\tend_scope();\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\t// Sampler Y'CbCr conversion forbids offsets.\n\t\t\tstatement(\"vec<T, 4> sample(float2 coord, int2 offset) const thread\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.swizzle_texture_samples)\n\t\t\t\tstatement(\"return spvTextureSwizzle(plane0.sample(samp, coord, offset), swizzle);\");\n\t\t\telse\n\t\t\t\tstatement(\"return plane0.sample(samp, coord, offset);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"template<typename lod_options>\");\n\t\t\tstatement(\"vec<T, 4> sample(float2 coord, lod_options options, int2 offset) const thread\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.swizzle_texture_samples)\n\t\t\t\tstatement(\"return spvTextureSwizzle(plane0.sample(samp, coord, options, offset), swizzle);\");\n\t\t\telse\n\t\t\t\tstatement(\"return plane0.sample(samp, coord, options, offset);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"#if __HAVE_MIN_LOD_CLAMP__\");\n\t\t\tstatement(\"vec<T, 4> sample(float2 coord, bias b, min_lod_clamp min_lod, int2 offset) const thread\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return plane0.sample(samp, coord, b, min_lod, offset);\");\n\t\t\tend_scope();\n\t\t\tstatement(\n\t\t\t    \"vec<T, 4> sample(float2 coord, gradient2d grad, min_lod_clamp min_lod, int2 offset) const thread\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return plane0.sample(samp, coord, grad, min_lod, offset);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"#endif\");\n\t\t\tstatement(\"\");\n\t\t\t// Y'CbCr conversion forbids all operations but sampling.\n\t\t\tstatement(\"vec<T, 4> read(uint2 coord, uint lod = 0) const thread\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return plane0.read(coord, lod);\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tstatement(\"vec<T, 4> gather(float2 coord, int2 offset = int2(0), component c = component::x) const thread\");\n\t\t\tbegin_scope();\n\t\t\tif (msl_options.swizzle_texture_samples)\n\t\t\t\tstatement(\"return spvGatherSwizzle(plane0, samp, swizzle, c, coord, offset);\");\n\t\t\telse\n\t\t\t\tstatement(\"return plane0.gather(samp, coord, offset, c);\");\n\t\t\tend_scope();\n\t\t\tend_scope_decl();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplRayQueryIntersectionParams:\n\t\t\tstatement(\"intersection_params spvMakeIntersectionParams(uint flags)\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"intersection_params ip;\");\n\t\t\tstatement(\"if ((flags & \", RayFlagsOpaqueKHRMask, \") != 0)\");\n\t\t\tstatement(\"    ip.force_opacity(forced_opacity::opaque);\");\n\t\t\tstatement(\"if ((flags & \", RayFlagsNoOpaqueKHRMask, \") != 0)\");\n\t\t\tstatement(\"    ip.force_opacity(forced_opacity::non_opaque);\");\n\t\t\tstatement(\"if ((flags & \", RayFlagsTerminateOnFirstHitKHRMask, \") != 0)\");\n\t\t\tstatement(\"    ip.accept_any_intersection(true);\");\n\t\t\t// RayFlagsSkipClosestHitShaderKHRMask is not available in MSL\n\t\t\tstatement(\"if ((flags & \", RayFlagsCullBackFacingTrianglesKHRMask, \") != 0)\");\n\t\t\tstatement(\"    ip.set_triangle_cull_mode(triangle_cull_mode::back);\");\n\t\t\tstatement(\"if ((flags & \", RayFlagsCullFrontFacingTrianglesKHRMask, \") != 0)\");\n\t\t\tstatement(\"    ip.set_triangle_cull_mode(triangle_cull_mode::front);\");\n\t\t\tstatement(\"if ((flags & \", RayFlagsCullOpaqueKHRMask, \") != 0)\");\n\t\t\tstatement(\"    ip.set_opacity_cull_mode(opacity_cull_mode::opaque);\");\n\t\t\tstatement(\"if ((flags & \", RayFlagsCullNoOpaqueKHRMask, \") != 0)\");\n\t\t\tstatement(\"    ip.set_opacity_cull_mode(opacity_cull_mode::non_opaque);\");\n\t\t\tstatement(\"if ((flags & \", RayFlagsSkipTrianglesKHRMask, \") != 0)\");\n\t\t\tstatement(\"    ip.set_geometry_cull_mode(geometry_cull_mode::triangle);\");\n\t\t\tstatement(\"if ((flags & \", RayFlagsSkipAABBsKHRMask, \") != 0)\");\n\t\t\tstatement(\"    ip.set_geometry_cull_mode(geometry_cull_mode::bounding_box);\");\n\t\t\tstatement(\"return ip;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplVariableDescriptor:\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"struct spvDescriptor\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"T value;\");\n\t\t\tend_scope_decl();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplVariableSizedDescriptor:\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"struct spvBufferDescriptor\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"T value;\");\n\t\t\tstatement(\"int length;\");\n\t\t\tstatement(\"const device T& operator -> () const device\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return value;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"const device T& operator * () const device\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return value;\");\n\t\t\tend_scope();\n\t\t\tend_scope_decl();\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplVariableDescriptorArray:\n\t\t\tstatement(\"template<typename T>\");\n\t\t\tstatement(\"struct spvDescriptorArray\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"spvDescriptorArray(const device spvDescriptor<T>* ptr) : ptr(ptr)\");\n\t\t\tbegin_scope();\n\t\t\tend_scope();\n\t\t\tstatement(\"const device T& operator [] (size_t i) const\");\n\t\t\tbegin_scope();\n\t\t\tstatement(\"return ptr[i].value;\");\n\t\t\tend_scope();\n\t\t\tstatement(\"const device spvDescriptor<T>* ptr;\");\n\t\t\tend_scope_decl();\n\t\t\tstatement(\"\");\n\n\t\t\tif (msl_options.runtime_array_rich_descriptor &&\n\t\t\t    spv_function_implementations.count(SPVFuncImplVariableSizedDescriptor) != 0)\n\t\t\t{\n\t\t\t\tstatement(\"template<typename T>\");\n\t\t\t\tstatement(\"struct spvDescriptorArray<device T*>\");\n\t\t\t\tbegin_scope();\n\t\t\t\tstatement(\"spvDescriptorArray(const device spvBufferDescriptor<device T*>* ptr) : ptr(ptr)\");\n\t\t\t\tbegin_scope();\n\t\t\t\tend_scope();\n\t\t\t\tstatement(\"const device T* operator [] (size_t i) const\");\n\t\t\t\tbegin_scope();\n\t\t\t\tstatement(\"return ptr[i].value;\");\n\t\t\t\tend_scope();\n\t\t\t\tstatement(\"const int length(int i) const\");\n\t\t\t\tbegin_scope();\n\t\t\t\tstatement(\"return ptr[i].length;\");\n\t\t\t\tend_scope();\n\t\t\t\tstatement(\"const device spvBufferDescriptor<device T*>* ptr;\");\n\t\t\t\tend_scope_decl();\n\t\t\t\tstatement(\"\");\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase SPVFuncImplPaddedStd140:\n\t\t\t// .data is used in access chain.\n\t\t\tstatement(\"template <typename T>\");\n\t\t\tstatement(\"struct spvPaddedStd140 { alignas(16) T data; };\");\n\t\t\tstatement(\"template <typename T, int n>\");\n\t\t\tstatement(\"using spvPaddedStd140Matrix = spvPaddedStd140<T>[n];\");\n\t\t\tstatement(\"\");\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nstatic string inject_top_level_storage_qualifier(const string &expr, const string &qualifier)\n{\n\t// Easier to do this through text munging since the qualifier does not exist in the type system at all,\n\t// and plumbing in all that information is not very helpful.\n\tsize_t last_reference = expr.find_last_of('&');\n\tsize_t last_pointer = expr.find_last_of('*');\n\tsize_t last_significant = string::npos;\n\n\tif (last_reference == string::npos)\n\t\tlast_significant = last_pointer;\n\telse if (last_pointer == string::npos)\n\t\tlast_significant = last_reference;\n\telse\n\t\tlast_significant = max<size_t>(last_reference, last_pointer);\n\n\tif (last_significant == string::npos)\n\t\treturn join(qualifier, \" \", expr);\n\telse\n\t{\n\t\treturn join(expr.substr(0, last_significant + 1), \" \",\n\t\t            qualifier, expr.substr(last_significant + 1, string::npos));\n\t}\n}\n\nvoid CompilerMSL::declare_constant_arrays()\n{\n\tbool fully_inlined = ir.ids_for_type[TypeFunction].size() == 1;\n\n\t// MSL cannot declare arrays inline (except when declaring a variable), so we must move them out to\n\t// global constants directly, so we are able to use constants as variable expressions.\n\tbool emitted = false;\n\n\tir.for_each_typed_id<SPIRConstant>([&](uint32_t, SPIRConstant &c) {\n\t\tif (c.specialization)\n\t\t\treturn;\n\n\t\tauto &type = this->get<SPIRType>(c.constant_type);\n\t\t// Constant arrays of non-primitive types (i.e. matrices) won't link properly into Metal libraries.\n\t\t// FIXME: However, hoisting constants to main() means we need to pass down constant arrays to leaf functions if they are used there.\n\t\t// If there are multiple functions in the module, drop this case to avoid breaking use cases which do not need to\n\t\t// link into Metal libraries. This is hacky.\n\t\tif (is_array(type) && (!fully_inlined || is_scalar(type) || is_vector(type)))\n\t\t{\n\t\t\tadd_resource_name(c.self);\n\t\t\tauto name = to_name(c.self);\n\t\t\tstatement(inject_top_level_storage_qualifier(variable_decl(type, name), \"constant\"),\n\t\t\t          \" = \", constant_expression(c), \";\");\n\t\t\temitted = true;\n\t\t}\n\t});\n\n\tif (emitted)\n\t\tstatement(\"\");\n}\n\n// Constant arrays of non-primitive types (i.e. matrices) won't link properly into Metal libraries\nvoid CompilerMSL::declare_complex_constant_arrays()\n{\n\t// If we do not have a fully inlined module, we did not opt in to\n\t// declaring constant arrays of complex types. See CompilerMSL::declare_constant_arrays().\n\tbool fully_inlined = ir.ids_for_type[TypeFunction].size() == 1;\n\tif (!fully_inlined)\n\t\treturn;\n\n\t// MSL cannot declare arrays inline (except when declaring a variable), so we must move them out to\n\t// global constants directly, so we are able to use constants as variable expressions.\n\tbool emitted = false;\n\n\tir.for_each_typed_id<SPIRConstant>([&](uint32_t, SPIRConstant &c) {\n\t\tif (c.specialization)\n\t\t\treturn;\n\n\t\tauto &type = this->get<SPIRType>(c.constant_type);\n\t\tif (is_array(type) && !(is_scalar(type) || is_vector(type)))\n\t\t{\n\t\t\tadd_resource_name(c.self);\n\t\t\tauto name = to_name(c.self);\n\t\t\tstatement(\"\", variable_decl(type, name), \" = \", constant_expression(c), \";\");\n\t\t\temitted = true;\n\t\t}\n\t});\n\n\tif (emitted)\n\t\tstatement(\"\");\n}\n\nvoid CompilerMSL::emit_resources()\n{\n\tdeclare_constant_arrays();\n\n\t// Emit the special [[stage_in]] and [[stage_out]] interface blocks which we created.\n\temit_interface_block(stage_out_var_id);\n\temit_interface_block(patch_stage_out_var_id);\n\temit_interface_block(stage_in_var_id);\n\temit_interface_block(patch_stage_in_var_id);\n}\n\n// Emit declarations for the specialization Metal function constants\nvoid CompilerMSL::emit_specialization_constants_and_structs()\n{\n\tSpecializationConstant wg_x, wg_y, wg_z;\n\tID workgroup_size_id = get_work_group_size_specialization_constants(wg_x, wg_y, wg_z);\n\tbool emitted = false;\n\n\tunordered_set<uint32_t> declared_structs;\n\tunordered_set<uint32_t> aligned_structs;\n\n\t// First, we need to deal with scalar block layout.\n\t// It is possible that a struct may have to be placed at an alignment which does not match the innate alignment of the struct itself.\n\t// In that case, if such a case exists for a struct, we must force that all elements of the struct become packed_ types.\n\t// This makes the struct alignment as small as physically possible.\n\t// When we actually align the struct later, we can insert padding as necessary to make the packed members behave like normally aligned types.\n\tir.for_each_typed_id<SPIRType>([&](uint32_t type_id, const SPIRType &type) {\n\t\tif (type.basetype == SPIRType::Struct &&\n\t\t    has_extended_decoration(type_id, SPIRVCrossDecorationBufferBlockRepacked))\n\t\t\tmark_scalar_layout_structs(type);\n\t});\n\n\tbool builtin_block_type_is_required = false;\n\t// Very special case. If gl_PerVertex is initialized as an array (tessellation)\n\t// we have to potentially emit the gl_PerVertex struct type so that we can emit a constant LUT.\n\tir.for_each_typed_id<SPIRConstant>([&](uint32_t, SPIRConstant &c) {\n\t\tauto &type = this->get<SPIRType>(c.constant_type);\n\t\tif (is_array(type) && has_decoration(type.self, DecorationBlock) && is_builtin_type(type))\n\t\t\tbuiltin_block_type_is_required = true;\n\t});\n\n\t// Very particular use of the soft loop lock.\n\t// align_struct may need to create custom types on the fly, but we don't care about\n\t// these types for purpose of iterating over them in ir.ids_for_type and friends.\n\tauto loop_lock = ir.create_loop_soft_lock();\n\n\t// Physical storage buffer pointers can have cyclical references,\n\t// so emit forward declarations of them before other structs.\n\t// Ignore type_id because we want the underlying struct type from the pointer.\n\tir.for_each_typed_id<SPIRType>([&](uint32_t /* type_id */, const SPIRType &type) {\n\t\tif (type.basetype == SPIRType::Struct &&\n\t\t\ttype.pointer && type.storage == StorageClassPhysicalStorageBuffer &&\n\t\t\tdeclared_structs.count(type.self) == 0)\n\t\t{\n\t\t\tstatement(\"struct \", to_name(type.self), \";\");\n\t\t\tdeclared_structs.insert(type.self);\n\t\t\temitted = true;\n\t\t}\n\t});\n\tif (emitted)\n\t\tstatement(\"\");\n\n\temitted = false;\n\tdeclared_structs.clear();\n\n\t// It is possible to have multiple spec constants that use the same spec constant ID.\n\t// The most common cause of this is defining spec constants in GLSL while also declaring\n\t// the workgroup size to use those spec constants. But, Metal forbids declaring more than\n\t// one variable with the same function constant ID.\n\t// In this case, we must only declare one variable with the [[function_constant(id)]]\n\t// attribute, and use its initializer to initialize all the spec constants with\n\t// that ID.\n\tstd::unordered_map<uint32_t, ConstantID> unique_func_constants;\n\n\tfor (auto &id_ : ir.ids_for_constant_undef_or_type)\n\t{\n\t\tauto &id = ir.ids[id_];\n\n\t\tif (id.get_type() == TypeConstant)\n\t\t{\n\t\t\tauto &c = id.get<SPIRConstant>();\n\n\t\t\tif (c.self == workgroup_size_id)\n\t\t\t{\n\t\t\t\t// TODO: This can be expressed as a [[threads_per_threadgroup]] input semantic, but we need to know\n\t\t\t\t// the work group size at compile time in SPIR-V, and [[threads_per_threadgroup]] would need to be passed around as a global.\n\t\t\t\t// The work group size may be a specialization constant.\n\t\t\t\tstatement(\"constant uint3 \", builtin_to_glsl(BuiltInWorkgroupSize, StorageClassWorkgroup),\n\t\t\t\t          \" [[maybe_unused]] = \", constant_expression(get<SPIRConstant>(workgroup_size_id)), \";\");\n\t\t\t\temitted = true;\n\t\t\t}\n\t\t\telse if (c.specialization)\n\t\t\t{\n\t\t\t\tauto &type = get<SPIRType>(c.constant_type);\n\t\t\t\tstring sc_type_name = type_to_glsl(type);\n\t\t\t\tadd_resource_name(c.self);\n\t\t\t\tstring sc_name = to_name(c.self);\n\n\t\t\t\t// Function constants are only supported in MSL 1.2 and later.\n\t\t\t\t// If we don't support it just declare the \"default\" directly.\n\t\t\t\t// This \"default\" value can be overridden to the true specialization constant by the API user.\n\t\t\t\t// Specialization constants which are used as array length expressions cannot be function constants in MSL,\n\t\t\t\t// so just fall back to macros.\n\t\t\t\tif (msl_options.supports_msl_version(1, 2) && has_decoration(c.self, DecorationSpecId) &&\n\t\t\t\t    !c.is_used_as_array_length)\n\t\t\t\t{\n\t\t\t\t\t// Only scalar, non-composite values can be function constants.\n\t\t\t\t\tuint32_t constant_id = get_decoration(c.self, DecorationSpecId);\n\t\t\t\t\tif (!unique_func_constants.count(constant_id))\n\t\t\t\t\t\tunique_func_constants.insert(make_pair(constant_id, c.self));\n\t\t\t\t\tSPIRType::BaseType sc_tmp_type = expression_type(unique_func_constants[constant_id]).basetype;\n\t\t\t\t\tstring sc_tmp_name = to_name(unique_func_constants[constant_id]) + \"_tmp\";\n\t\t\t\t\tif (unique_func_constants[constant_id] == c.self)\n\t\t\t\t\t\tstatement(\"constant \", sc_type_name, \" \", sc_tmp_name, \" [[function_constant(\", constant_id,\n\t\t\t\t\t\t          \")]];\");\n\t\t\t\t\tstatement(\"constant \", sc_type_name, \" \", sc_name, \" = is_function_constant_defined(\", sc_tmp_name,\n\t\t\t\t\t          \") ? \", bitcast_expression(type, sc_tmp_type, sc_tmp_name), \" : \", constant_expression(c),\n\t\t\t\t\t          \";\");\n\t\t\t\t}\n\t\t\t\telse if (has_decoration(c.self, DecorationSpecId))\n\t\t\t\t{\n\t\t\t\t\t// Fallback to macro overrides.\n\t\t\t\t\tc.specialization_constant_macro_name =\n\t\t\t\t\t    constant_value_macro_name(get_decoration(c.self, DecorationSpecId));\n\n\t\t\t\t\tstatement(\"#ifndef \", c.specialization_constant_macro_name);\n\t\t\t\t\tstatement(\"#define \", c.specialization_constant_macro_name, \" \", constant_expression(c));\n\t\t\t\t\tstatement(\"#endif\");\n\t\t\t\t\tstatement(\"constant \", sc_type_name, \" \", sc_name, \" = \", c.specialization_constant_macro_name,\n\t\t\t\t\t          \";\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Composite specialization constants must be built from other specialization constants.\n\t\t\t\t\tstatement(\"constant \", sc_type_name, \" \", sc_name, \" = \", constant_expression(c), \";\");\n\t\t\t\t}\n\t\t\t\temitted = true;\n\t\t\t}\n\t\t}\n\t\telse if (id.get_type() == TypeConstantOp)\n\t\t{\n\t\t\tauto &c = id.get<SPIRConstantOp>();\n\t\t\tauto &type = get<SPIRType>(c.basetype);\n\t\t\tadd_resource_name(c.self);\n\t\t\tauto name = to_name(c.self);\n\t\t\tstatement(\"constant \", variable_decl(type, name), \" = \", constant_op_expression(c), \";\");\n\t\t\temitted = true;\n\t\t}\n\t\telse if (id.get_type() == TypeType)\n\t\t{\n\t\t\t// Output non-builtin interface structs. These include local function structs\n\t\t\t// and structs nested within uniform and read-write buffers.\n\t\t\tauto &type = id.get<SPIRType>();\n\t\t\tTypeID type_id = type.self;\n\n\t\t\tbool is_struct = (type.basetype == SPIRType::Struct) && type.array.empty() && !type.pointer;\n\t\t\tbool is_block =\n\t\t\t    has_decoration(type.self, DecorationBlock) || has_decoration(type.self, DecorationBufferBlock);\n\n\t\t\tbool is_builtin_block = is_block && is_builtin_type(type);\n\t\t\tbool is_declarable_struct = is_struct && (!is_builtin_block || builtin_block_type_is_required);\n\n\t\t\t// We'll declare this later.\n\t\t\tif (stage_out_var_id && get_stage_out_struct_type().self == type_id)\n\t\t\t\tis_declarable_struct = false;\n\t\t\tif (patch_stage_out_var_id && get_patch_stage_out_struct_type().self == type_id)\n\t\t\t\tis_declarable_struct = false;\n\t\t\tif (stage_in_var_id && get_stage_in_struct_type().self == type_id)\n\t\t\t\tis_declarable_struct = false;\n\t\t\tif (patch_stage_in_var_id && get_patch_stage_in_struct_type().self == type_id)\n\t\t\t\tis_declarable_struct = false;\n\n\t\t\t// Special case. Declare builtin struct anyways if we need to emit a threadgroup version of it.\n\t\t\tif (stage_out_masked_builtin_type_id == type_id)\n\t\t\t\tis_declarable_struct = true;\n\n\t\t\t// Align and emit declarable structs...but avoid declaring each more than once.\n\t\t\tif (is_declarable_struct && declared_structs.count(type_id) == 0)\n\t\t\t{\n\t\t\t\tif (emitted)\n\t\t\t\t\tstatement(\"\");\n\t\t\t\temitted = false;\n\n\t\t\t\tdeclared_structs.insert(type_id);\n\n\t\t\t\tif (has_extended_decoration(type_id, SPIRVCrossDecorationBufferBlockRepacked))\n\t\t\t\t\talign_struct(type, aligned_structs);\n\n\t\t\t\t// Make sure we declare the underlying struct type, and not the \"decorated\" type with pointers, etc.\n\t\t\t\temit_struct(get<SPIRType>(type_id));\n\t\t\t}\n\t\t}\n\t\telse if (id.get_type() == TypeUndef)\n\t\t{\n\t\t\tauto &undef = id.get<SPIRUndef>();\n\t\t\tauto &type = get<SPIRType>(undef.basetype);\n\t\t\t// OpUndef can be void for some reason ...\n\t\t\tif (type.basetype == SPIRType::Void)\n\t\t\t\treturn;\n\n\t\t\t// Undefined global memory is not allowed in MSL.\n\t\t\t// Declare constant and init to zeros. Use {}, as global constructors can break Metal.\n\t\t\tstatement(\n\t\t\t    inject_top_level_storage_qualifier(variable_decl(type, to_name(undef.self), undef.self), \"constant\"),\n\t\t\t    \" = {};\");\n\t\t\temitted = true;\n\t\t}\n\t}\n\n\tif (emitted)\n\t\tstatement(\"\");\n}\n\nvoid CompilerMSL::emit_binary_ptr_op(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1, const char *op)\n{\n\tbool forward = should_forward(op0) && should_forward(op1);\n\temit_op(result_type, result_id, join(to_ptr_expression(op0), \" \", op, \" \", to_ptr_expression(op1)), forward);\n\tinherit_expression_dependencies(result_id, op0);\n\tinherit_expression_dependencies(result_id, op1);\n}\n\nstring CompilerMSL::to_ptr_expression(uint32_t id, bool register_expression_read)\n{\n\tauto *e = maybe_get<SPIRExpression>(id);\n\tauto expr = enclose_expression(e && e->need_transpose ? e->expression : to_expression(id, register_expression_read));\n\tif (!should_dereference(id))\n\t\texpr = address_of_expression(expr);\n\treturn expr;\n}\n\nvoid CompilerMSL::emit_binary_unord_op(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1,\n                                       const char *op)\n{\n\tbool forward = should_forward(op0) && should_forward(op1);\n\temit_op(result_type, result_id,\n\t        join(\"(isunordered(\", to_enclosed_unpacked_expression(op0), \", \", to_enclosed_unpacked_expression(op1),\n\t             \") || \", to_enclosed_unpacked_expression(op0), \" \", op, \" \", to_enclosed_unpacked_expression(op1),\n\t             \")\"),\n\t        forward);\n\n\tinherit_expression_dependencies(result_id, op0);\n\tinherit_expression_dependencies(result_id, op1);\n}\n\nbool CompilerMSL::emit_tessellation_io_load(uint32_t result_type_id, uint32_t id, uint32_t ptr)\n{\n\tauto &ptr_type = expression_type(ptr);\n\tauto &result_type = get<SPIRType>(result_type_id);\n\tif (ptr_type.storage != StorageClassInput && ptr_type.storage != StorageClassOutput)\n\t\treturn false;\n\tif (ptr_type.storage == StorageClassOutput && is_tese_shader())\n\t\treturn false;\n\n\tif (has_decoration(ptr, DecorationPatch))\n\t\treturn false;\n\tbool ptr_is_io_variable = ir.ids[ptr].get_type() == TypeVariable;\n\n\tbool flattened_io = variable_storage_requires_stage_io(ptr_type.storage);\n\n\tbool flat_data_type = flattened_io &&\n\t                      (is_matrix(result_type) || is_array(result_type) || result_type.basetype == SPIRType::Struct);\n\n\t// Edge case, even with multi-patch workgroups, we still need to unroll load\n\t// if we're loading control points directly.\n\tif (ptr_is_io_variable && is_array(result_type))\n\t\tflat_data_type = true;\n\n\tif (!flat_data_type)\n\t\treturn false;\n\n\t// Now, we must unflatten a composite type and take care of interleaving array access with gl_in/gl_out.\n\t// Lots of painful code duplication since we *really* should not unroll these kinds of loads in entry point fixup\n\t// unless we're forced to do this when the code is emitting inoptimal OpLoads.\n\tstring expr;\n\n\tuint32_t interface_index = get_extended_decoration(ptr, SPIRVCrossDecorationInterfaceMemberIndex);\n\tauto *var = maybe_get_backing_variable(ptr);\n\tauto &expr_type = get_pointee_type(ptr_type.self);\n\n\tconst auto &iface_type = expression_type(stage_in_ptr_var_id);\n\n\tif (!flattened_io)\n\t{\n\t\t// Simplest case for multi-patch workgroups, just unroll array as-is.\n\t\tif (interface_index == uint32_t(-1))\n\t\t\treturn false;\n\n\t\texpr += type_to_glsl(result_type) + \"({ \";\n\t\tuint32_t num_control_points = to_array_size_literal(result_type, uint32_t(result_type.array.size()) - 1);\n\n\t\tfor (uint32_t i = 0; i < num_control_points; i++)\n\t\t{\n\t\t\tconst uint32_t indices[2] = { i, interface_index };\n\t\t\tAccessChainMeta meta;\n\t\t\texpr += access_chain_internal(stage_in_ptr_var_id, indices, 2,\n\t\t\t                              ACCESS_CHAIN_INDEX_IS_LITERAL_BIT | ACCESS_CHAIN_PTR_CHAIN_BIT, &meta);\n\t\t\tif (i + 1 < num_control_points)\n\t\t\t\texpr += \", \";\n\t\t}\n\t\texpr += \" })\";\n\t}\n\telse if (result_type.array.size() > 2)\n\t{\n\t\tSPIRV_CROSS_THROW(\"Cannot load tessellation IO variables with more than 2 dimensions.\");\n\t}\n\telse if (result_type.array.size() == 2)\n\t{\n\t\tif (!ptr_is_io_variable)\n\t\t\tSPIRV_CROSS_THROW(\"Loading an array-of-array must be loaded directly from an IO variable.\");\n\t\tif (interface_index == uint32_t(-1))\n\t\t\tSPIRV_CROSS_THROW(\"Interface index is unknown. Cannot continue.\");\n\t\tif (result_type.basetype == SPIRType::Struct || is_matrix(result_type))\n\t\t\tSPIRV_CROSS_THROW(\"Cannot load array-of-array of composite type in tessellation IO.\");\n\n\t\texpr += type_to_glsl(result_type) + \"({ \";\n\t\tuint32_t num_control_points = to_array_size_literal(result_type, 1);\n\t\tuint32_t base_interface_index = interface_index;\n\n\t\tauto &sub_type = get<SPIRType>(result_type.parent_type);\n\n\t\tfor (uint32_t i = 0; i < num_control_points; i++)\n\t\t{\n\t\t\texpr += type_to_glsl(sub_type) + \"({ \";\n\t\t\tinterface_index = base_interface_index;\n\t\t\tuint32_t array_size = to_array_size_literal(result_type, 0);\n\t\t\tfor (uint32_t j = 0; j < array_size; j++, interface_index++)\n\t\t\t{\n\t\t\t\tconst uint32_t indices[2] = { i, interface_index };\n\n\t\t\t\tAccessChainMeta meta;\n\t\t\t\texpr += access_chain_internal(stage_in_ptr_var_id, indices, 2,\n\t\t\t\t                              ACCESS_CHAIN_INDEX_IS_LITERAL_BIT | ACCESS_CHAIN_PTR_CHAIN_BIT, &meta);\n\t\t\t\tif (!is_matrix(sub_type) && sub_type.basetype != SPIRType::Struct &&\n\t\t\t\t\texpr_type.vecsize > sub_type.vecsize)\n\t\t\t\t\texpr += vector_swizzle(sub_type.vecsize, 0);\n\n\t\t\t\tif (j + 1 < array_size)\n\t\t\t\t\texpr += \", \";\n\t\t\t}\n\t\t\texpr += \" })\";\n\t\t\tif (i + 1 < num_control_points)\n\t\t\t\texpr += \", \";\n\t\t}\n\t\texpr += \" })\";\n\t}\n\telse if (result_type.basetype == SPIRType::Struct)\n\t{\n\t\tbool is_array_of_struct = is_array(result_type);\n\t\tif (is_array_of_struct && !ptr_is_io_variable)\n\t\t\tSPIRV_CROSS_THROW(\"Loading array of struct from IO variable must come directly from IO variable.\");\n\n\t\tuint32_t num_control_points = 1;\n\t\tif (is_array_of_struct)\n\t\t{\n\t\t\tnum_control_points = to_array_size_literal(result_type, 0);\n\t\t\texpr += type_to_glsl(result_type) + \"({ \";\n\t\t}\n\n\t\tauto &struct_type = is_array_of_struct ? get<SPIRType>(result_type.parent_type) : result_type;\n\t\tassert(struct_type.array.empty());\n\n\t\tfor (uint32_t i = 0; i < num_control_points; i++)\n\t\t{\n\t\t\texpr += type_to_glsl(struct_type) + \"{ \";\n\t\t\tfor (uint32_t j = 0; j < uint32_t(struct_type.member_types.size()); j++)\n\t\t\t{\n\t\t\t\t// The base interface index is stored per variable for structs.\n\t\t\t\tif (var)\n\t\t\t\t{\n\t\t\t\t\tinterface_index =\n\t\t\t\t\t    get_extended_member_decoration(var->self, j, SPIRVCrossDecorationInterfaceMemberIndex);\n\t\t\t\t}\n\n\t\t\t\tif (interface_index == uint32_t(-1))\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Interface index is unknown. Cannot continue.\");\n\n\t\t\t\tconst auto &mbr_type = get<SPIRType>(struct_type.member_types[j]);\n\t\t\t\tconst auto &expr_mbr_type = get<SPIRType>(expr_type.member_types[j]);\n\t\t\t\tif (is_matrix(mbr_type) && ptr_type.storage == StorageClassInput)\n\t\t\t\t{\n\t\t\t\t\texpr += type_to_glsl(mbr_type) + \"(\";\n\t\t\t\t\tfor (uint32_t k = 0; k < mbr_type.columns; k++, interface_index++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (is_array_of_struct)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconst uint32_t indices[2] = { i, interface_index };\n\t\t\t\t\t\t\tAccessChainMeta meta;\n\t\t\t\t\t\t\texpr += access_chain_internal(\n\t\t\t\t\t\t\t\t\tstage_in_ptr_var_id, indices, 2,\n\t\t\t\t\t\t\t\t\tACCESS_CHAIN_INDEX_IS_LITERAL_BIT | ACCESS_CHAIN_PTR_CHAIN_BIT, &meta);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\texpr += to_expression(ptr) + \".\" + to_member_name(iface_type, interface_index);\n\t\t\t\t\t\tif (expr_mbr_type.vecsize > mbr_type.vecsize)\n\t\t\t\t\t\t\texpr += vector_swizzle(mbr_type.vecsize, 0);\n\n\t\t\t\t\t\tif (k + 1 < mbr_type.columns)\n\t\t\t\t\t\t\texpr += \", \";\n\t\t\t\t\t}\n\t\t\t\t\texpr += \")\";\n\t\t\t\t}\n\t\t\t\telse if (is_array(mbr_type))\n\t\t\t\t{\n\t\t\t\t\texpr += type_to_glsl(mbr_type) + \"({ \";\n\t\t\t\t\tuint32_t array_size = to_array_size_literal(mbr_type, 0);\n\t\t\t\t\tfor (uint32_t k = 0; k < array_size; k++, interface_index++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (is_array_of_struct)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconst uint32_t indices[2] = { i, interface_index };\n\t\t\t\t\t\t\tAccessChainMeta meta;\n\t\t\t\t\t\t\texpr += access_chain_internal(\n\t\t\t\t\t\t\t\t\tstage_in_ptr_var_id, indices, 2,\n\t\t\t\t\t\t\t\t\tACCESS_CHAIN_INDEX_IS_LITERAL_BIT | ACCESS_CHAIN_PTR_CHAIN_BIT, &meta);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\texpr += to_expression(ptr) + \".\" + to_member_name(iface_type, interface_index);\n\t\t\t\t\t\tif (expr_mbr_type.vecsize > mbr_type.vecsize)\n\t\t\t\t\t\t\texpr += vector_swizzle(mbr_type.vecsize, 0);\n\n\t\t\t\t\t\tif (k + 1 < array_size)\n\t\t\t\t\t\t\texpr += \", \";\n\t\t\t\t\t}\n\t\t\t\t\texpr += \" })\";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (is_array_of_struct)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst uint32_t indices[2] = { i, interface_index };\n\t\t\t\t\t\tAccessChainMeta meta;\n\t\t\t\t\t\texpr += access_chain_internal(stage_in_ptr_var_id, indices, 2,\n\t\t\t\t\t\t                              ACCESS_CHAIN_INDEX_IS_LITERAL_BIT | ACCESS_CHAIN_PTR_CHAIN_BIT,\n\t\t\t\t\t\t                              &meta);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\texpr += to_expression(ptr) + \".\" + to_member_name(iface_type, interface_index);\n\t\t\t\t\tif (expr_mbr_type.vecsize > mbr_type.vecsize)\n\t\t\t\t\t\texpr += vector_swizzle(mbr_type.vecsize, 0);\n\t\t\t\t}\n\n\t\t\t\tif (j + 1 < struct_type.member_types.size())\n\t\t\t\t\texpr += \", \";\n\t\t\t}\n\t\t\texpr += \" }\";\n\t\t\tif (i + 1 < num_control_points)\n\t\t\t\texpr += \", \";\n\t\t}\n\t\tif (is_array_of_struct)\n\t\t\texpr += \" })\";\n\t}\n\telse if (is_matrix(result_type))\n\t{\n\t\tbool is_array_of_matrix = is_array(result_type);\n\t\tif (is_array_of_matrix && !ptr_is_io_variable)\n\t\t\tSPIRV_CROSS_THROW(\"Loading array of matrix from IO variable must come directly from IO variable.\");\n\t\tif (interface_index == uint32_t(-1))\n\t\t\tSPIRV_CROSS_THROW(\"Interface index is unknown. Cannot continue.\");\n\n\t\tif (is_array_of_matrix)\n\t\t{\n\t\t\t// Loading a matrix from each control point.\n\t\t\tuint32_t base_interface_index = interface_index;\n\t\t\tuint32_t num_control_points = to_array_size_literal(result_type, 0);\n\t\t\texpr += type_to_glsl(result_type) + \"({ \";\n\n\t\t\tauto &matrix_type = get_variable_element_type(get<SPIRVariable>(ptr));\n\n\t\t\tfor (uint32_t i = 0; i < num_control_points; i++)\n\t\t\t{\n\t\t\t\tinterface_index = base_interface_index;\n\t\t\t\texpr += type_to_glsl(matrix_type) + \"(\";\n\t\t\t\tfor (uint32_t j = 0; j < result_type.columns; j++, interface_index++)\n\t\t\t\t{\n\t\t\t\t\tconst uint32_t indices[2] = { i, interface_index };\n\n\t\t\t\t\tAccessChainMeta meta;\n\t\t\t\t\texpr += access_chain_internal(stage_in_ptr_var_id, indices, 2,\n\t\t\t\t\t                              ACCESS_CHAIN_INDEX_IS_LITERAL_BIT | ACCESS_CHAIN_PTR_CHAIN_BIT, &meta);\n\t\t\t\t\tif (expr_type.vecsize > result_type.vecsize)\n\t\t\t\t\t\texpr += vector_swizzle(result_type.vecsize, 0);\n\t\t\t\t\tif (j + 1 < result_type.columns)\n\t\t\t\t\t\texpr += \", \";\n\t\t\t\t}\n\t\t\t\texpr += \")\";\n\t\t\t\tif (i + 1 < num_control_points)\n\t\t\t\t\texpr += \", \";\n\t\t\t}\n\n\t\t\texpr += \" })\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\texpr += type_to_glsl(result_type) + \"(\";\n\t\t\tfor (uint32_t i = 0; i < result_type.columns; i++, interface_index++)\n\t\t\t{\n\t\t\t\texpr += to_expression(ptr) + \".\" + to_member_name(iface_type, interface_index);\n\t\t\t\tif (expr_type.vecsize > result_type.vecsize)\n\t\t\t\t\texpr += vector_swizzle(result_type.vecsize, 0);\n\t\t\t\tif (i + 1 < result_type.columns)\n\t\t\t\t\texpr += \", \";\n\t\t\t}\n\t\t\texpr += \")\";\n\t\t}\n\t}\n\telse if (ptr_is_io_variable)\n\t{\n\t\tassert(is_array(result_type));\n\t\tassert(result_type.array.size() == 1);\n\t\tif (interface_index == uint32_t(-1))\n\t\t\tSPIRV_CROSS_THROW(\"Interface index is unknown. Cannot continue.\");\n\n\t\t// We're loading an array directly from a global variable.\n\t\t// This means we're loading one member from each control point.\n\t\texpr += type_to_glsl(result_type) + \"({ \";\n\t\tuint32_t num_control_points = to_array_size_literal(result_type, 0);\n\n\t\tfor (uint32_t i = 0; i < num_control_points; i++)\n\t\t{\n\t\t\tconst uint32_t indices[2] = { i, interface_index };\n\n\t\t\tAccessChainMeta meta;\n\t\t\texpr += access_chain_internal(stage_in_ptr_var_id, indices, 2,\n\t\t\t                              ACCESS_CHAIN_INDEX_IS_LITERAL_BIT | ACCESS_CHAIN_PTR_CHAIN_BIT, &meta);\n\t\t\tif (expr_type.vecsize > result_type.vecsize)\n\t\t\t\texpr += vector_swizzle(result_type.vecsize, 0);\n\n\t\t\tif (i + 1 < num_control_points)\n\t\t\t\texpr += \", \";\n\t\t}\n\t\texpr += \" })\";\n\t}\n\telse\n\t{\n\t\t// We're loading an array from a concrete control point.\n\t\tassert(is_array(result_type));\n\t\tassert(result_type.array.size() == 1);\n\t\tif (interface_index == uint32_t(-1))\n\t\t\tSPIRV_CROSS_THROW(\"Interface index is unknown. Cannot continue.\");\n\n\t\texpr += type_to_glsl(result_type) + \"({ \";\n\t\tuint32_t array_size = to_array_size_literal(result_type, 0);\n\t\tfor (uint32_t i = 0; i < array_size; i++, interface_index++)\n\t\t{\n\t\t\texpr += to_expression(ptr) + \".\" + to_member_name(iface_type, interface_index);\n\t\t\tif (expr_type.vecsize > result_type.vecsize)\n\t\t\t\texpr += vector_swizzle(result_type.vecsize, 0);\n\t\t\tif (i + 1 < array_size)\n\t\t\t\texpr += \", \";\n\t\t}\n\t\texpr += \" })\";\n\t}\n\n\temit_op(result_type_id, id, expr, false);\n\tregister_read(id, ptr, false);\n\treturn true;\n}\n\nbool CompilerMSL::emit_tessellation_access_chain(const uint32_t *ops, uint32_t length)\n{\n\t// If this is a per-vertex output, remap it to the I/O array buffer.\n\n\t// Any object which did not go through IO flattening shenanigans will go there instead.\n\t// We will unflatten on-demand instead as needed, but not all possible cases can be supported, especially with arrays.\n\n\tauto *var = maybe_get_backing_variable(ops[2]);\n\tbool patch = false;\n\tbool flat_data = false;\n\tbool ptr_is_chain = false;\n\tbool flatten_composites = false;\n\n\tbool is_block = false;\n\tbool is_arrayed = false;\n\n\tif (var)\n\t{\n\t\tauto &type = get_variable_data_type(*var);\n\t\tis_block = has_decoration(type.self, DecorationBlock);\n\t\tis_arrayed = !type.array.empty();\n\n\t\tflatten_composites = variable_storage_requires_stage_io(var->storage);\n\t\tpatch = has_decoration(ops[2], DecorationPatch) || is_patch_block(type);\n\n\t\t// Should match strip_array in add_interface_block.\n\t\tflat_data = var->storage == StorageClassInput || (var->storage == StorageClassOutput && is_tesc_shader());\n\n\t\t// Patch inputs are treated as normal block IO variables, so they don't deal with this path at all.\n\t\tif (patch && (!is_block || is_arrayed || var->storage == StorageClassInput))\n\t\t\tflat_data = false;\n\n\t\t// We might have a chained access chain, where\n\t\t// we first take the access chain to the control point, and then we chain into a member or something similar.\n\t\t// In this case, we need to skip gl_in/gl_out remapping.\n\t\t// Also, skip ptr chain for patches.\n\t\tptr_is_chain = var->self != ID(ops[2]);\n\t}\n\n\tbool builtin_variable = false;\n\tbool variable_is_flat = false;\n\n\tif (var && flat_data)\n\t{\n\t\tbuiltin_variable = is_builtin_variable(*var);\n\n\t\tBuiltIn bi_type = BuiltInMax;\n\t\tif (builtin_variable && !is_block)\n\t\t\tbi_type = BuiltIn(get_decoration(var->self, DecorationBuiltIn));\n\n\t\tvariable_is_flat = !builtin_variable || is_block ||\n\t\t                   bi_type == BuiltInPosition || bi_type == BuiltInPointSize ||\n\t\t                   bi_type == BuiltInClipDistance || bi_type == BuiltInCullDistance;\n\t}\n\n\tif (variable_is_flat)\n\t{\n\t\t// If output is masked, it is emitted as a \"normal\" variable, just go through normal code paths.\n\t\t// Only check this for the first level of access chain.\n\t\t// Dealing with this for partial access chains should be possible, but awkward.\n\t\tif (var->storage == StorageClassOutput && !ptr_is_chain)\n\t\t{\n\t\t\tbool masked = false;\n\t\t\tif (is_block)\n\t\t\t{\n\t\t\t\tuint32_t relevant_member_index = patch ? 3 : 4;\n\t\t\t\t// FIXME: This won't work properly if the application first access chains into gl_out element,\n\t\t\t\t// then access chains into the member. Super weird, but theoretically possible ...\n\t\t\t\tif (length > relevant_member_index)\n\t\t\t\t{\n\t\t\t\t\tuint32_t mbr_idx = get<SPIRConstant>(ops[relevant_member_index]).scalar();\n\t\t\t\t\tmasked = is_stage_output_block_member_masked(*var, mbr_idx, true);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (var)\n\t\t\t\tmasked = is_stage_output_variable_masked(*var);\n\n\t\t\tif (masked)\n\t\t\t\treturn false;\n\t\t}\n\n\t\tAccessChainMeta meta;\n\t\tSmallVector<uint32_t> indices;\n\t\tuint32_t next_id = ir.increase_bound_by(1);\n\n\t\tindices.reserve(length - 3 + 1);\n\n\t\tuint32_t first_non_array_index = (ptr_is_chain ? 3 : 4) - (patch ? 1 : 0);\n\n\t\tVariableID stage_var_id;\n\t\tif (patch)\n\t\t\tstage_var_id = var->storage == StorageClassInput ? patch_stage_in_var_id : patch_stage_out_var_id;\n\t\telse\n\t\t\tstage_var_id = var->storage == StorageClassInput ? stage_in_ptr_var_id : stage_out_ptr_var_id;\n\n\t\tVariableID ptr = ptr_is_chain ? VariableID(ops[2]) : stage_var_id;\n\t\tif (!ptr_is_chain && !patch)\n\t\t{\n\t\t\t// Index into gl_in/gl_out with first array index.\n\t\t\tindices.push_back(ops[first_non_array_index - 1]);\n\t\t}\n\n\t\tauto &result_ptr_type = get<SPIRType>(ops[0]);\n\n\t\tuint32_t const_mbr_id = next_id++;\n\t\tuint32_t index = get_extended_decoration(ops[2], SPIRVCrossDecorationInterfaceMemberIndex);\n\n\t\t// If we have a pointer chain expression, and we are no longer pointing to a composite\n\t\t// object, we are in the clear. There is no longer a need to flatten anything.\n\t\tbool further_access_chain_is_trivial = false;\n\t\tif (ptr_is_chain && flatten_composites)\n\t\t{\n\t\t\tauto &ptr_type = expression_type(ptr);\n\t\t\tif (!is_array(ptr_type) && !is_matrix(ptr_type) && ptr_type.basetype != SPIRType::Struct)\n\t\t\t\tfurther_access_chain_is_trivial = true;\n\t\t}\n\n\t\tif (!further_access_chain_is_trivial && (flatten_composites || is_block))\n\t\t{\n\t\t\tuint32_t i = first_non_array_index;\n\t\t\tauto *type = &get_variable_element_type(*var);\n\t\t\tif (index == uint32_t(-1) && length >= (first_non_array_index + 1))\n\t\t\t{\n\t\t\t\t// Maybe this is a struct type in the input class, in which case\n\t\t\t\t// we put it as a decoration on the corresponding member.\n\t\t\t\tuint32_t mbr_idx = get_constant(ops[first_non_array_index]).scalar();\n\t\t\t\tindex = get_extended_member_decoration(var->self, mbr_idx,\n\t\t\t\t                                       SPIRVCrossDecorationInterfaceMemberIndex);\n\t\t\t\tassert(index != uint32_t(-1));\n\t\t\t\ti++;\n\t\t\t\ttype = &get<SPIRType>(type->member_types[mbr_idx]);\n\t\t\t}\n\n\t\t\t// In this case, we're poking into flattened structures and arrays, so now we have to\n\t\t\t// combine the following indices. If we encounter a non-constant index,\n\t\t\t// we're hosed.\n\t\t\tfor (; flatten_composites && i < length; ++i)\n\t\t\t{\n\t\t\t\tif (!is_array(*type) && !is_matrix(*type) && type->basetype != SPIRType::Struct)\n\t\t\t\t\tbreak;\n\n\t\t\t\tauto *c = maybe_get<SPIRConstant>(ops[i]);\n\t\t\t\tif (!c || c->specialization)\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Trying to dynamically index into an array interface variable in tessellation. \"\n\t\t\t\t\t                  \"This is currently unsupported.\");\n\n\t\t\t\t// We're in flattened space, so just increment the member index into IO block.\n\t\t\t\t// We can only do this once in the current implementation, so either:\n\t\t\t\t// Struct, Matrix or 1-dimensional array for a control point.\n\t\t\t\tif (type->basetype == SPIRType::Struct && var->storage == StorageClassOutput)\n\t\t\t\t{\n\t\t\t\t\t// Need to consider holes, since individual block members might be masked away.\n\t\t\t\t\tuint32_t mbr_idx = c->scalar();\n\t\t\t\t\tfor (uint32_t j = 0; j < mbr_idx; j++)\n\t\t\t\t\t\tif (!is_stage_output_block_member_masked(*var, j, true))\n\t\t\t\t\t\t\tindex++;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tindex += c->scalar();\n\n\t\t\t\tif (type->parent_type)\n\t\t\t\t\ttype = &get<SPIRType>(type->parent_type);\n\t\t\t\telse if (type->basetype == SPIRType::Struct)\n\t\t\t\t\ttype = &get<SPIRType>(type->member_types[c->scalar()]);\n\t\t\t}\n\n\t\t\t// We're not going to emit the actual member name, we let any further OpLoad take care of that.\n\t\t\t// Tag the access chain with the member index we're referencing.\n\t\t\tauto &result_pointee_type = get_pointee_type(result_ptr_type);\n\t\t\tbool defer_access_chain = flatten_composites && (is_matrix(result_pointee_type) || is_array(result_pointee_type) ||\n\t\t\t                                                 result_pointee_type.basetype == SPIRType::Struct);\n\n\t\t\tif (!defer_access_chain)\n\t\t\t{\n\t\t\t\t// Access the appropriate member of gl_in/gl_out.\n\t\t\t\tset<SPIRConstant>(const_mbr_id, get_uint_type_id(), index, false);\n\t\t\t\tindices.push_back(const_mbr_id);\n\n\t\t\t\t// Member index is now irrelevant.\n\t\t\t\tindex = uint32_t(-1);\n\n\t\t\t\t// Append any straggling access chain indices.\n\t\t\t\tif (i < length)\n\t\t\t\t\tindices.insert(indices.end(), ops + i, ops + length);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// We must have consumed the entire access chain if we're deferring it.\n\t\t\t\tassert(i == length);\n\t\t\t}\n\n\t\t\tif (index != uint32_t(-1))\n\t\t\t\tset_extended_decoration(ops[1], SPIRVCrossDecorationInterfaceMemberIndex, index);\n\t\t\telse\n\t\t\t\tunset_extended_decoration(ops[1], SPIRVCrossDecorationInterfaceMemberIndex);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (index != uint32_t(-1))\n\t\t\t{\n\t\t\t\tset<SPIRConstant>(const_mbr_id, get_uint_type_id(), index, false);\n\t\t\t\tindices.push_back(const_mbr_id);\n\t\t\t}\n\n\t\t\t// Member index is now irrelevant.\n\t\t\tindex = uint32_t(-1);\n\t\t\tunset_extended_decoration(ops[1], SPIRVCrossDecorationInterfaceMemberIndex);\n\n\t\t\tindices.insert(indices.end(), ops + first_non_array_index, ops + length);\n\t\t}\n\n\t\t// We use the pointer to the base of the input/output array here,\n\t\t// so this is always a pointer chain.\n\t\tstring e;\n\n\t\tif (!ptr_is_chain)\n\t\t{\n\t\t\t// This is the start of an access chain, use ptr_chain to index into control point array.\n\t\t\te = access_chain(ptr, indices.data(), uint32_t(indices.size()), result_ptr_type, &meta, !patch);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// If we're accessing a struct, we need to use member indices which are based on the IO block,\n\t\t\t// not actual struct type, so we have to use a split access chain here where\n\t\t\t// first path resolves the control point index, i.e. gl_in[index], and second half deals with\n\t\t\t// looking up flattened member name.\n\n\t\t\t// However, it is possible that we partially accessed a struct,\n\t\t\t// by taking pointer to member inside the control-point array.\n\t\t\t// For this case, we fall back to a natural access chain since we have already dealt with remapping struct members.\n\t\t\t// One way to check this here is if we have 2 implied read expressions.\n\t\t\t// First one is the gl_in/gl_out struct itself, then an index into that array.\n\t\t\t// If we have traversed further, we use a normal access chain formulation.\n\t\t\tauto *ptr_expr = maybe_get<SPIRExpression>(ptr);\n\t\t\tbool split_access_chain_formulation = flatten_composites && ptr_expr &&\n\t\t\t                                      ptr_expr->implied_read_expressions.size() == 2 &&\n\t\t\t                                      !further_access_chain_is_trivial;\n\n\t\t\tif (split_access_chain_formulation)\n\t\t\t{\n\t\t\t\te = join(to_expression(ptr),\n\t\t\t\t         access_chain_internal(stage_var_id, indices.data(), uint32_t(indices.size()),\n\t\t\t\t                               ACCESS_CHAIN_CHAIN_ONLY_BIT, &meta));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\te = access_chain_internal(ptr, indices.data(), uint32_t(indices.size()), 0, &meta);\n\t\t\t}\n\t\t}\n\n\t\t// Get the actual type of the object that was accessed. If it's a vector type and we changed it,\n\t\t// then we'll need to add a swizzle.\n\t\t// For this, we can't necessarily rely on the type of the base expression, because it might be\n\t\t// another access chain, and it will therefore already have the \"correct\" type.\n\t\tauto *expr_type = &get_variable_data_type(*var);\n\t\tif (has_extended_decoration(ops[2], SPIRVCrossDecorationTessIOOriginalInputTypeID))\n\t\t\texpr_type = &get<SPIRType>(get_extended_decoration(ops[2], SPIRVCrossDecorationTessIOOriginalInputTypeID));\n\t\tfor (uint32_t i = 3; i < length; i++)\n\t\t{\n\t\t\tif (!is_array(*expr_type) && expr_type->basetype == SPIRType::Struct)\n\t\t\t\texpr_type = &get<SPIRType>(expr_type->member_types[get<SPIRConstant>(ops[i]).scalar()]);\n\t\t\telse\n\t\t\t\texpr_type = &get<SPIRType>(expr_type->parent_type);\n\t\t}\n\t\tif (!is_array(*expr_type) && !is_matrix(*expr_type) && expr_type->basetype != SPIRType::Struct &&\n\t\t    expr_type->vecsize > result_ptr_type.vecsize)\n\t\t\te += vector_swizzle(result_ptr_type.vecsize, 0);\n\n\t\tauto &expr = set<SPIRExpression>(ops[1], std::move(e), ops[0], should_forward(ops[2]));\n\t\texpr.loaded_from = var->self;\n\t\texpr.need_transpose = meta.need_transpose;\n\t\texpr.access_chain = true;\n\n\t\t// Mark the result as being packed if necessary.\n\t\tif (meta.storage_is_packed)\n\t\t\tset_extended_decoration(ops[1], SPIRVCrossDecorationPhysicalTypePacked);\n\t\tif (meta.storage_physical_type != 0)\n\t\t\tset_extended_decoration(ops[1], SPIRVCrossDecorationPhysicalTypeID, meta.storage_physical_type);\n\t\tif (meta.storage_is_invariant)\n\t\t\tset_decoration(ops[1], DecorationInvariant);\n\t\t// Save the type we found in case the result is used in another access chain.\n\t\tset_extended_decoration(ops[1], SPIRVCrossDecorationTessIOOriginalInputTypeID, expr_type->self);\n\n\t\t// If we have some expression dependencies in our access chain, this access chain is technically a forwarded\n\t\t// temporary which could be subject to invalidation.\n\t\t// Need to assume we're forwarded while calling inherit_expression_depdendencies.\n\t\tforwarded_temporaries.insert(ops[1]);\n\t\t// The access chain itself is never forced to a temporary, but its dependencies might.\n\t\tsuppressed_usage_tracking.insert(ops[1]);\n\n\t\tfor (uint32_t i = 2; i < length; i++)\n\t\t{\n\t\t\tinherit_expression_dependencies(ops[1], ops[i]);\n\t\t\tadd_implied_read_expression(expr, ops[i]);\n\t\t}\n\n\t\t// If we have no dependencies after all, i.e., all indices in the access chain are immutable temporaries,\n\t\t// we're not forwarded after all.\n\t\tif (expr.expression_dependencies.empty())\n\t\t\tforwarded_temporaries.erase(ops[1]);\n\n\t\treturn true;\n\t}\n\n\t// If this is the inner tessellation level, and we're tessellating triangles,\n\t// drop the last index. It isn't an array in this case, so we can't have an\n\t// array reference here. We need to make this ID a variable instead of an\n\t// expression so we don't try to dereference it as a variable pointer.\n\t// Don't do this if the index is a constant 1, though. We need to drop stores\n\t// to that one.\n\tauto *m = ir.find_meta(var ? var->self : ID(0));\n\tif (is_tesc_shader() && var && m && m->decoration.builtin_type == BuiltInTessLevelInner &&\n\t    is_tessellating_triangles())\n\t{\n\t\tauto *c = maybe_get<SPIRConstant>(ops[3]);\n\t\tif (c && c->scalar() == 1)\n\t\t\treturn false;\n\t\tauto &dest_var = set<SPIRVariable>(ops[1], *var);\n\t\tdest_var.basetype = ops[0];\n\t\tir.meta[ops[1]] = ir.meta[ops[2]];\n\t\tinherit_expression_dependencies(ops[1], ops[2]);\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool CompilerMSL::is_out_of_bounds_tessellation_level(uint32_t id_lhs)\n{\n\tif (!is_tessellating_triangles())\n\t\treturn false;\n\n\t// In SPIR-V, TessLevelInner always has two elements and TessLevelOuter always has\n\t// four. This is true even if we are tessellating triangles. This allows clients\n\t// to use a single tessellation control shader with multiple tessellation evaluation\n\t// shaders.\n\t// In Metal, however, only the first element of TessLevelInner and the first three\n\t// of TessLevelOuter are accessible. This stems from how in Metal, the tessellation\n\t// levels must be stored to a dedicated buffer in a particular format that depends\n\t// on the patch type. Therefore, in Triangles mode, any store to the second\n\t// inner level or the fourth outer level must be dropped.\n\tconst auto *e = maybe_get<SPIRExpression>(id_lhs);\n\tif (!e || !e->access_chain)\n\t\treturn false;\n\tBuiltIn builtin = BuiltIn(get_decoration(e->loaded_from, DecorationBuiltIn));\n\tif (builtin != BuiltInTessLevelInner && builtin != BuiltInTessLevelOuter)\n\t\treturn false;\n\tauto *c = maybe_get<SPIRConstant>(e->implied_read_expressions[1]);\n\tif (!c)\n\t\treturn false;\n\treturn (builtin == BuiltInTessLevelInner && c->scalar() == 1) ||\n\t       (builtin == BuiltInTessLevelOuter && c->scalar() == 3);\n}\n\nbool CompilerMSL::prepare_access_chain_for_scalar_access(std::string &expr, const SPIRType &type,\n                                                         spv::StorageClass storage, bool &is_packed)\n{\n\t// If there is any risk of writes happening with the access chain in question,\n\t// and there is a risk of concurrent write access to other components,\n\t// we must cast the access chain to a plain pointer to ensure we only access the exact scalars we expect.\n\t// The MSL compiler refuses to allow component-level access for any non-packed vector types.\n\tif (!is_packed && (storage == StorageClassStorageBuffer || storage == StorageClassWorkgroup))\n\t{\n\t\tconst char *addr_space = storage == StorageClassWorkgroup ? \"threadgroup\" : \"device\";\n\t\texpr = join(\"((\", addr_space, \" \", type_to_glsl(type), \"*)&\", enclose_expression(expr), \")\");\n\n\t\t// Further indexing should happen with packed rules (array index, not swizzle).\n\t\tis_packed = true;\n\t\treturn true;\n\t}\n\telse\n\t\treturn false;\n}\n\nbool CompilerMSL::access_chain_needs_stage_io_builtin_translation(uint32_t base)\n{\n\tauto *var = maybe_get_backing_variable(base);\n\tif (!var || !is_tessellation_shader())\n\t\treturn true;\n\n\t// We only need to rewrite builtin access chains when accessing flattened builtins like gl_ClipDistance_N.\n\t// Avoid overriding it back to just gl_ClipDistance.\n\t// This can only happen in scenarios where we cannot flatten/unflatten access chains, so, the only case\n\t// where this triggers is evaluation shader inputs.\n\tbool redirect_builtin = is_tese_shader() ? var->storage == StorageClassOutput : false;\n\treturn redirect_builtin;\n}\n\n// Sets the interface member index for an access chain to a pull-model interpolant.\nvoid CompilerMSL::fix_up_interpolant_access_chain(const uint32_t *ops, uint32_t length)\n{\n\tauto *var = maybe_get_backing_variable(ops[2]);\n\tif (!var || !pull_model_inputs.count(var->self))\n\t\treturn;\n\t// Get the base index.\n\tuint32_t interface_index;\n\tauto &var_type = get_variable_data_type(*var);\n\tauto &result_type = get<SPIRType>(ops[0]);\n\tauto *type = &var_type;\n\tif (has_extended_decoration(ops[2], SPIRVCrossDecorationInterfaceMemberIndex))\n\t{\n\t\tinterface_index = get_extended_decoration(ops[2], SPIRVCrossDecorationInterfaceMemberIndex);\n\t}\n\telse\n\t{\n\t\t// Assume an access chain into a struct variable.\n\t\tassert(var_type.basetype == SPIRType::Struct);\n\t\tauto &c = get<SPIRConstant>(ops[3 + var_type.array.size()]);\n\t\tinterface_index =\n\t\t    get_extended_member_decoration(var->self, c.scalar(), SPIRVCrossDecorationInterfaceMemberIndex);\n\t}\n\t// Accumulate indices. We'll have to skip over the one for the struct, if present, because we already accounted\n\t// for that getting the base index.\n\tfor (uint32_t i = 3; i < length; ++i)\n\t{\n\t\tif (is_vector(*type) && !is_array(*type) && is_scalar(result_type))\n\t\t{\n\t\t\t// We don't want to combine the next index. Actually, we need to save it\n\t\t\t// so we know to apply a swizzle to the result of the interpolation.\n\t\t\tset_extended_decoration(ops[1], SPIRVCrossDecorationInterpolantComponentExpr, ops[i]);\n\t\t\tbreak;\n\t\t}\n\n\t\tauto *c = maybe_get<SPIRConstant>(ops[i]);\n\t\tif (!c || c->specialization)\n\t\t\tSPIRV_CROSS_THROW(\"Trying to dynamically index into an array interface variable using pull-model \"\n\t\t\t                  \"interpolation. This is currently unsupported.\");\n\n\t\tif (type->parent_type)\n\t\t\ttype = &get<SPIRType>(type->parent_type);\n\t\telse if (type->basetype == SPIRType::Struct)\n\t\t\ttype = &get<SPIRType>(type->member_types[c->scalar()]);\n\n\t\tif (!has_extended_decoration(ops[2], SPIRVCrossDecorationInterfaceMemberIndex) &&\n\t\t    i - 3 == var_type.array.size())\n\t\t\tcontinue;\n\n\t\tinterface_index += c->scalar();\n\t}\n\t// Save this to the access chain itself so we can recover it later when calling an interpolation function.\n\tset_extended_decoration(ops[1], SPIRVCrossDecorationInterfaceMemberIndex, interface_index);\n}\n\n\n// If the physical type of a physical buffer pointer has been changed\n// to a ulong or ulongn vector, add a cast back to the pointer type.\nvoid CompilerMSL::check_physical_type_cast(std::string &expr, const SPIRType *type, uint32_t physical_type)\n{\n\tauto *p_physical_type = maybe_get<SPIRType>(physical_type);\n\tif (p_physical_type &&\n\t\tp_physical_type->storage == StorageClassPhysicalStorageBuffer &&\n\t\tp_physical_type->basetype == to_unsigned_basetype(64))\n\t{\n\t\tif (p_physical_type->vecsize > 1)\n\t\t\texpr += \".x\";\n\n\t\texpr = join(\"((\", type_to_glsl(*type), \")\", expr, \")\");\n\t}\n}\n\n// Override for MSL-specific syntax instructions\nvoid CompilerMSL::emit_instruction(const Instruction &instruction)\n{\n#define MSL_BOP(op) emit_binary_op(ops[0], ops[1], ops[2], ops[3], #op)\n#define MSL_PTR_BOP(op) emit_binary_ptr_op(ops[0], ops[1], ops[2], ops[3], #op)\n\t// MSL does care about implicit integer promotion, but those cases are all handled in common code.\n#define MSL_BOP_CAST(op, type) \\\n\temit_binary_op_cast(ops[0], ops[1], ops[2], ops[3], #op, type, opcode_is_sign_invariant(opcode), false)\n#define MSL_UOP(op) emit_unary_op(ops[0], ops[1], ops[2], #op)\n#define MSL_QFOP(op) emit_quaternary_func_op(ops[0], ops[1], ops[2], ops[3], ops[4], ops[5], #op)\n#define MSL_TFOP(op) emit_trinary_func_op(ops[0], ops[1], ops[2], ops[3], ops[4], #op)\n#define MSL_BFOP(op) emit_binary_func_op(ops[0], ops[1], ops[2], ops[3], #op)\n#define MSL_BFOP_CAST(op, type) \\\n\temit_binary_func_op_cast(ops[0], ops[1], ops[2], ops[3], #op, type, opcode_is_sign_invariant(opcode))\n#define MSL_UFOP(op) emit_unary_func_op(ops[0], ops[1], ops[2], #op)\n#define MSL_UNORD_BOP(op) emit_binary_unord_op(ops[0], ops[1], ops[2], ops[3], #op)\n\n\tauto ops = stream(instruction);\n\tauto opcode = static_cast<Op>(instruction.op);\n\n\topcode = get_remapped_spirv_op(opcode);\n\n\t// If we need to do implicit bitcasts, make sure we do it with the correct type.\n\tuint32_t integer_width = get_integer_width_for_instruction(instruction);\n\tauto int_type = to_signed_basetype(integer_width);\n\tauto uint_type = to_unsigned_basetype(integer_width);\n\n\tswitch (opcode)\n\t{\n\tcase OpLoad:\n\t{\n\t\tuint32_t id = ops[1];\n\t\tuint32_t ptr = ops[2];\n\t\tif (is_tessellation_shader())\n\t\t{\n\t\t\tif (!emit_tessellation_io_load(ops[0], id, ptr))\n\t\t\t\tCompilerGLSL::emit_instruction(instruction);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Sample mask input for Metal is not an array\n\t\t\tif (BuiltIn(get_decoration(ptr, DecorationBuiltIn)) == BuiltInSampleMask)\n\t\t\t\tset_decoration(id, DecorationBuiltIn, BuiltInSampleMask);\n\t\t\tCompilerGLSL::emit_instruction(instruction);\n\t\t}\n\t\tbreak;\n\t}\n\n\t// Comparisons\n\tcase OpIEqual:\n\t\tMSL_BOP_CAST(==, int_type);\n\t\tbreak;\n\n\tcase OpLogicalEqual:\n\tcase OpFOrdEqual:\n\t\tMSL_BOP(==);\n\t\tbreak;\n\n\tcase OpINotEqual:\n\t\tMSL_BOP_CAST(!=, int_type);\n\t\tbreak;\n\n\tcase OpLogicalNotEqual:\n\tcase OpFOrdNotEqual:\n\t\t// TODO: Should probably negate the == result here.\n\t\t// Typically OrdNotEqual comes from GLSL which itself does not really specify what\n\t\t// happens with NaN.\n\t\t// Consider fixing this if we run into real issues.\n\t\tMSL_BOP(!=);\n\t\tbreak;\n\n\tcase OpUGreaterThan:\n\t\tMSL_BOP_CAST(>, uint_type);\n\t\tbreak;\n\n\tcase OpSGreaterThan:\n\t\tMSL_BOP_CAST(>, int_type);\n\t\tbreak;\n\n\tcase OpFOrdGreaterThan:\n\t\tMSL_BOP(>);\n\t\tbreak;\n\n\tcase OpUGreaterThanEqual:\n\t\tMSL_BOP_CAST(>=, uint_type);\n\t\tbreak;\n\n\tcase OpSGreaterThanEqual:\n\t\tMSL_BOP_CAST(>=, int_type);\n\t\tbreak;\n\n\tcase OpFOrdGreaterThanEqual:\n\t\tMSL_BOP(>=);\n\t\tbreak;\n\n\tcase OpULessThan:\n\t\tMSL_BOP_CAST(<, uint_type);\n\t\tbreak;\n\n\tcase OpSLessThan:\n\t\tMSL_BOP_CAST(<, int_type);\n\t\tbreak;\n\n\tcase OpFOrdLessThan:\n\t\tMSL_BOP(<);\n\t\tbreak;\n\n\tcase OpULessThanEqual:\n\t\tMSL_BOP_CAST(<=, uint_type);\n\t\tbreak;\n\n\tcase OpSLessThanEqual:\n\t\tMSL_BOP_CAST(<=, int_type);\n\t\tbreak;\n\n\tcase OpFOrdLessThanEqual:\n\t\tMSL_BOP(<=);\n\t\tbreak;\n\n\tcase OpFUnordEqual:\n\t\tMSL_UNORD_BOP(==);\n\t\tbreak;\n\n\tcase OpFUnordNotEqual:\n\t\t// not equal in MSL generates une opcodes to begin with.\n\t\t// Since unordered not equal is how it works in C, just inherit that behavior.\n\t\tMSL_BOP(!=);\n\t\tbreak;\n\n\tcase OpFUnordGreaterThan:\n\t\tMSL_UNORD_BOP(>);\n\t\tbreak;\n\n\tcase OpFUnordGreaterThanEqual:\n\t\tMSL_UNORD_BOP(>=);\n\t\tbreak;\n\n\tcase OpFUnordLessThan:\n\t\tMSL_UNORD_BOP(<);\n\t\tbreak;\n\n\tcase OpFUnordLessThanEqual:\n\t\tMSL_UNORD_BOP(<=);\n\t\tbreak;\n\n\t// Pointer math\n\tcase OpPtrEqual:\n\t\tMSL_PTR_BOP(==);\n\t\tbreak;\n\n\tcase OpPtrNotEqual:\n\t\tMSL_PTR_BOP(!=);\n\t\tbreak;\n\n\tcase OpPtrDiff:\n\t\tMSL_PTR_BOP(-);\n\t\tbreak;\n\n\t// Derivatives\n\tcase OpDPdx:\n\tcase OpDPdxFine:\n\tcase OpDPdxCoarse:\n\t\tMSL_UFOP(dfdx);\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\n\tcase OpDPdy:\n\tcase OpDPdyFine:\n\tcase OpDPdyCoarse:\n\t\tMSL_UFOP(dfdy);\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\n\tcase OpFwidth:\n\tcase OpFwidthCoarse:\n\tcase OpFwidthFine:\n\t\tMSL_UFOP(fwidth);\n\t\tregister_control_dependent_expression(ops[1]);\n\t\tbreak;\n\n\t// Bitfield\n\tcase OpBitFieldInsert:\n\t{\n\t\temit_bitfield_insert_op(ops[0], ops[1], ops[2], ops[3], ops[4], ops[5], \"insert_bits\", SPIRType::UInt);\n\t\tbreak;\n\t}\n\n\tcase OpBitFieldSExtract:\n\t{\n\t\temit_trinary_func_op_bitextract(ops[0], ops[1], ops[2], ops[3], ops[4], \"extract_bits\", int_type, int_type,\n\t\t                                SPIRType::UInt, SPIRType::UInt);\n\t\tbreak;\n\t}\n\n\tcase OpBitFieldUExtract:\n\t{\n\t\temit_trinary_func_op_bitextract(ops[0], ops[1], ops[2], ops[3], ops[4], \"extract_bits\", uint_type, uint_type,\n\t\t                                SPIRType::UInt, SPIRType::UInt);\n\t\tbreak;\n\t}\n\n\tcase OpBitReverse:\n\t\t// BitReverse does not have issues with sign since result type must match input type.\n\t\tMSL_UFOP(reverse_bits);\n\t\tbreak;\n\n\tcase OpBitCount:\n\t{\n\t\tauto basetype = expression_type(ops[2]).basetype;\n\t\temit_unary_func_op_cast(ops[0], ops[1], ops[2], \"popcount\", basetype, basetype);\n\t\tbreak;\n\t}\n\n\tcase OpFRem:\n\t\tMSL_BFOP(fmod);\n\t\tbreak;\n\n\tcase OpFMul:\n\t\tif (msl_options.invariant_float_math || has_decoration(ops[1], DecorationNoContraction))\n\t\t\tMSL_BFOP(spvFMul);\n\t\telse\n\t\t\tMSL_BOP(*);\n\t\tbreak;\n\n\tcase OpFAdd:\n\t\tif (msl_options.invariant_float_math || has_decoration(ops[1], DecorationNoContraction))\n\t\t\tMSL_BFOP(spvFAdd);\n\t\telse\n\t\t\tMSL_BOP(+);\n\t\tbreak;\n\n\tcase OpFSub:\n\t\tif (msl_options.invariant_float_math || has_decoration(ops[1], DecorationNoContraction))\n\t\t\tMSL_BFOP(spvFSub);\n\t\telse\n\t\t\tMSL_BOP(-);\n\t\tbreak;\n\n\t// Atomics\n\tcase OpAtomicExchange:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tuint32_t ptr = ops[2];\n\t\tuint32_t mem_sem = ops[4];\n\t\tuint32_t val = ops[5];\n\t\temit_atomic_func_op(result_type, id, \"atomic_exchange\", opcode, mem_sem, mem_sem, false, ptr, val);\n\t\tbreak;\n\t}\n\n\tcase OpAtomicCompareExchange:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tuint32_t ptr = ops[2];\n\t\tuint32_t mem_sem_pass = ops[4];\n\t\tuint32_t mem_sem_fail = ops[5];\n\t\tuint32_t val = ops[6];\n\t\tuint32_t comp = ops[7];\n\t\temit_atomic_func_op(result_type, id, \"atomic_compare_exchange_weak\", opcode,\n\t\t                    mem_sem_pass, mem_sem_fail, true,\n\t\t                    ptr, comp, true, false, val);\n\t\tbreak;\n\t}\n\n\tcase OpAtomicCompareExchangeWeak:\n\t\tSPIRV_CROSS_THROW(\"OpAtomicCompareExchangeWeak is only supported in kernel profile.\");\n\n\tcase OpAtomicLoad:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tuint32_t ptr = ops[2];\n\t\tuint32_t mem_sem = ops[4];\n\t\tcheck_atomic_image(ptr);\n\t\temit_atomic_func_op(result_type, id, \"atomic_load\", opcode, mem_sem, mem_sem, false, ptr, 0);\n\t\tbreak;\n\t}\n\n\tcase OpAtomicStore:\n\t{\n\t\tuint32_t result_type = expression_type(ops[0]).self;\n\t\tuint32_t id = ops[0];\n\t\tuint32_t ptr = ops[0];\n\t\tuint32_t mem_sem = ops[2];\n\t\tuint32_t val = ops[3];\n\t\tcheck_atomic_image(ptr);\n\t\temit_atomic_func_op(result_type, id, \"atomic_store\", opcode, mem_sem, mem_sem, false, ptr, val);\n\t\tbreak;\n\t}\n\n#define MSL_AFMO_IMPL(op, valsrc, valconst)                                                                      \\\n\tdo                                                                                                           \\\n\t{                                                                                                            \\\n\t\tuint32_t result_type = ops[0];                                                                           \\\n\t\tuint32_t id = ops[1];                                                                                    \\\n\t\tuint32_t ptr = ops[2];                                                                                   \\\n\t\tuint32_t mem_sem = ops[4];                                                                               \\\n\t\tuint32_t val = valsrc;                                                                                   \\\n\t\temit_atomic_func_op(result_type, id, \"atomic_fetch_\" #op, opcode,                                        \\\n\t\t                    mem_sem, mem_sem, false, ptr, val,                                                   \\\n\t\t                    false, valconst);                                                                    \\\n\t} while (false)\n\n#define MSL_AFMO(op) MSL_AFMO_IMPL(op, ops[5], false)\n#define MSL_AFMIO(op) MSL_AFMO_IMPL(op, 1, true)\n\n\tcase OpAtomicIIncrement:\n\t\tMSL_AFMIO(add);\n\t\tbreak;\n\n\tcase OpAtomicIDecrement:\n\t\tMSL_AFMIO(sub);\n\t\tbreak;\n\n\tcase OpAtomicIAdd:\n\tcase OpAtomicFAddEXT:\n\t\tMSL_AFMO(add);\n\t\tbreak;\n\n\tcase OpAtomicISub:\n\t\tMSL_AFMO(sub);\n\t\tbreak;\n\n\tcase OpAtomicSMin:\n\tcase OpAtomicUMin:\n\t\tMSL_AFMO(min);\n\t\tbreak;\n\n\tcase OpAtomicSMax:\n\tcase OpAtomicUMax:\n\t\tMSL_AFMO(max);\n\t\tbreak;\n\n\tcase OpAtomicAnd:\n\t\tMSL_AFMO(and);\n\t\tbreak;\n\n\tcase OpAtomicOr:\n\t\tMSL_AFMO(or);\n\t\tbreak;\n\n\tcase OpAtomicXor:\n\t\tMSL_AFMO(xor);\n\t\tbreak;\n\n\t// Images\n\n\t// Reads == Fetches in Metal\n\tcase OpImageRead:\n\t{\n\t\t// Mark that this shader reads from this image\n\t\tuint32_t img_id = ops[2];\n\t\tauto &type = expression_type(img_id);\n\t\tauto *p_var = maybe_get_backing_variable(img_id);\n\t\tif (type.image.dim != DimSubpassData)\n\t\t{\n\t\t\tif (p_var && has_decoration(p_var->self, DecorationNonReadable))\n\t\t\t{\n\t\t\t\tunset_decoration(p_var->self, DecorationNonReadable);\n\t\t\t\tforce_recompile();\n\t\t\t}\n\t\t}\n\n\t\t// Metal requires explicit fences to break up RAW hazards, even within the same shader invocation\n\t\tif (msl_options.readwrite_texture_fences && p_var && !has_decoration(p_var->self, DecorationNonWritable))\n\t\t\tstatement(to_expression(img_id), \".fence();\");\n\n\t\temit_texture_op(instruction, false);\n\t\tbreak;\n\t}\n\n\t// Emulate texture2D atomic operations\n\tcase OpImageTexelPointer:\n\t{\n\t\t// When using the pointer, we need to know which variable it is actually loaded from.\n\t\tauto *var = maybe_get_backing_variable(ops[2]);\n\t\tif (var && atomic_image_vars_emulated.count(var->self))\n\t\t{\n\t\t\tuint32_t result_type = ops[0];\n\t\t\tuint32_t id = ops[1];\n\n\t\t\tstd::string coord = to_expression(ops[3]);\n\t\t\tauto &type = expression_type(ops[2]);\n\t\t\tif (type.image.dim == Dim2D)\n\t\t\t{\n\t\t\t\tcoord = join(\"spvImage2DAtomicCoord(\", coord, \", \", to_expression(ops[2]), \")\");\n\t\t\t}\n\n\t\t\tauto &e = set<SPIRExpression>(id, join(to_expression(ops[2]), \"_atomic[\", coord, \"]\"), result_type, true);\n\t\t\te.loaded_from = var ? var->self : ID(0);\n\t\t\tinherit_expression_dependencies(id, ops[3]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tuint32_t result_type = ops[0];\n\t\t\tuint32_t id = ops[1];\n\n\t\t\t// Virtual expression. Split this up in the actual image atomic.\n\t\t\t// In GLSL and HLSL we are able to resolve the dereference inline, but MSL has\n\t\t\t// image.op(coord, ...) syntax.\n\t\t\tauto &e =\n\t\t\t\tset<SPIRExpression>(id, join(to_expression(ops[2]), \"@\",\n\t\t\t\t                             bitcast_expression(SPIRType::UInt, ops[3])),\n\t\t\t\t                    result_type, true);\n\n\t\t\t// When using the pointer, we need to know which variable it is actually loaded from.\n\t\t\te.loaded_from = var ? var->self : ID(0);\n\t\t\tinherit_expression_dependencies(id, ops[3]);\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpImageWrite:\n\t{\n\t\tuint32_t img_id = ops[0];\n\t\tuint32_t coord_id = ops[1];\n\t\tuint32_t texel_id = ops[2];\n\t\tconst uint32_t *opt = &ops[3];\n\t\tuint32_t length = instruction.length - 3;\n\n\t\t// Bypass pointers because we need the real image struct\n\t\tauto &type = expression_type(img_id);\n\t\tauto &img_type = get<SPIRType>(type.self);\n\n\t\t// Ensure this image has been marked as being written to and force a\n\t\t// recommpile so that the image type output will include write access\n\t\tauto *p_var = maybe_get_backing_variable(img_id);\n\t\tif (p_var && has_decoration(p_var->self, DecorationNonWritable))\n\t\t{\n\t\t\tunset_decoration(p_var->self, DecorationNonWritable);\n\t\t\tforce_recompile();\n\t\t}\n\n\t\tbool forward = false;\n\t\tuint32_t bias = 0;\n\t\tuint32_t lod = 0;\n\t\tuint32_t flags = 0;\n\n\t\tif (length)\n\t\t{\n\t\t\tflags = *opt++;\n\t\t\tlength--;\n\t\t}\n\n\t\tauto test = [&](uint32_t &v, uint32_t flag) {\n\t\t\tif (length && (flags & flag))\n\t\t\t{\n\t\t\t\tv = *opt++;\n\t\t\t\tlength--;\n\t\t\t}\n\t\t};\n\n\t\ttest(bias, ImageOperandsBiasMask);\n\t\ttest(lod, ImageOperandsLodMask);\n\n\t\tauto &texel_type = expression_type(texel_id);\n\t\tauto store_type = texel_type;\n\t\tstore_type.vecsize = 4;\n\n\t\tTextureFunctionArguments args = {};\n\t\targs.base.img = img_id;\n\t\targs.base.imgtype = &img_type;\n\t\targs.base.is_fetch = true;\n\t\targs.coord = coord_id;\n\t\targs.lod = lod;\n\n\t\tstring expr;\n\t\tif (needs_frag_discard_checks())\n\t\t\texpr = join(\"(\", builtin_to_glsl(BuiltInHelperInvocation, StorageClassInput), \" ? ((void)0) : \");\n\t\texpr += join(to_expression(img_id), \".write(\",\n\t\t             remap_swizzle(store_type, texel_type.vecsize, to_expression(texel_id)), \", \",\n\t\t             CompilerMSL::to_function_args(args, &forward), \")\");\n\t\tif (needs_frag_discard_checks())\n\t\t\texpr += \")\";\n\t\tstatement(expr, \";\");\n\n\t\tif (p_var && variable_storage_is_aliased(*p_var))\n\t\t\tflush_all_aliased_variables();\n\n\t\tbreak;\n\t}\n\n\tcase OpImageQuerySize:\n\tcase OpImageQuerySizeLod:\n\t{\n\t\tuint32_t rslt_type_id = ops[0];\n\t\tauto &rslt_type = get<SPIRType>(rslt_type_id);\n\n\t\tuint32_t id = ops[1];\n\n\t\tuint32_t img_id = ops[2];\n\t\tstring img_exp = to_expression(img_id);\n\t\tauto &img_type = expression_type(img_id);\n\t\tDim img_dim = img_type.image.dim;\n\t\tbool img_is_array = img_type.image.arrayed;\n\n\t\tif (img_type.basetype != SPIRType::Image)\n\t\t\tSPIRV_CROSS_THROW(\"Invalid type for OpImageQuerySize.\");\n\n\t\tstring lod;\n\t\tif (opcode == OpImageQuerySizeLod)\n\t\t{\n\t\t\t// LOD index defaults to zero, so don't bother outputing level zero index\n\t\t\tstring decl_lod = to_expression(ops[3]);\n\t\t\tif (decl_lod != \"0\")\n\t\t\t\tlod = decl_lod;\n\t\t}\n\n\t\tstring expr = type_to_glsl(rslt_type) + \"(\";\n\t\texpr += img_exp + \".get_width(\" + lod + \")\";\n\n\t\tif (img_dim == Dim2D || img_dim == DimCube || img_dim == Dim3D)\n\t\t\texpr += \", \" + img_exp + \".get_height(\" + lod + \")\";\n\n\t\tif (img_dim == Dim3D)\n\t\t\texpr += \", \" + img_exp + \".get_depth(\" + lod + \")\";\n\n\t\tif (img_is_array)\n\t\t{\n\t\t\texpr += \", \" + img_exp + \".get_array_size()\";\n\t\t\tif (img_dim == DimCube && msl_options.emulate_cube_array)\n\t\t\t\texpr += \" / 6\";\n\t\t}\n\n\t\texpr += \")\";\n\n\t\temit_op(rslt_type_id, id, expr, should_forward(img_id));\n\n\t\tbreak;\n\t}\n\n\tcase OpImageQueryLod:\n\t{\n\t\tif (!msl_options.supports_msl_version(2, 2))\n\t\t\tSPIRV_CROSS_THROW(\"ImageQueryLod is only supported on MSL 2.2 and up.\");\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tuint32_t image_id = ops[2];\n\t\tuint32_t coord_id = ops[3];\n\t\temit_uninitialized_temporary_expression(result_type, id);\n\n\t\tauto sampler_expr = to_sampler_expression(image_id);\n\t\tauto *combined = maybe_get<SPIRCombinedImageSampler>(image_id);\n\t\tauto image_expr = combined ? to_expression(combined->image) : to_expression(image_id);\n\n\t\t// TODO: It is unclear if calculcate_clamped_lod also conditionally rounds\n\t\t// the reported LOD based on the sampler. NEAREST miplevel should\n\t\t// round the LOD, but LINEAR miplevel should not round.\n\t\t// Let's hope this does not become an issue ...\n\t\tstatement(to_expression(id), \".x = \", image_expr, \".calculate_clamped_lod(\", sampler_expr, \", \",\n\t\t          to_expression(coord_id), \");\");\n\t\tstatement(to_expression(id), \".y = \", image_expr, \".calculate_unclamped_lod(\", sampler_expr, \", \",\n\t\t          to_expression(coord_id), \");\");\n\t\tregister_control_dependent_expression(id);\n\t\tbreak;\n\t}\n\n#define MSL_ImgQry(qrytype)                                                                 \\\n\tdo                                                                                      \\\n\t{                                                                                       \\\n\t\tuint32_t rslt_type_id = ops[0];                                                     \\\n\t\tauto &rslt_type = get<SPIRType>(rslt_type_id);                                      \\\n\t\tuint32_t id = ops[1];                                                               \\\n\t\tuint32_t img_id = ops[2];                                                           \\\n\t\tstring img_exp = to_expression(img_id);                                             \\\n\t\tstring expr = type_to_glsl(rslt_type) + \"(\" + img_exp + \".get_num_\" #qrytype \"())\"; \\\n\t\temit_op(rslt_type_id, id, expr, should_forward(img_id));                            \\\n\t} while (false)\n\n\tcase OpImageQueryLevels:\n\t\tMSL_ImgQry(mip_levels);\n\t\tbreak;\n\n\tcase OpImageQuerySamples:\n\t\tMSL_ImgQry(samples);\n\t\tbreak;\n\n\tcase OpImage:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tauto *combined = maybe_get<SPIRCombinedImageSampler>(ops[2]);\n\n\t\tif (combined)\n\t\t{\n\t\t\tauto &e = emit_op(result_type, id, to_expression(combined->image), true, true);\n\t\t\tauto *var = maybe_get_backing_variable(combined->image);\n\t\t\tif (var)\n\t\t\t\te.loaded_from = var->self;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tauto *var = maybe_get_backing_variable(ops[2]);\n\t\t\tSPIRExpression *e;\n\t\t\tif (var && has_extended_decoration(var->self, SPIRVCrossDecorationDynamicImageSampler))\n\t\t\t\te = &emit_op(result_type, id, join(to_expression(ops[2]), \".plane0\"), true, true);\n\t\t\telse\n\t\t\t\te = &emit_op(result_type, id, to_expression(ops[2]), true, true);\n\t\t\tif (var)\n\t\t\t\te->loaded_from = var->self;\n\t\t}\n\t\tbreak;\n\t}\n\n\t// Casting\n\tcase OpQuantizeToF16:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tuint32_t arg = ops[2];\n\t\tstring exp = join(\"spvQuantizeToF16(\", to_expression(arg), \")\");\n\t\temit_op(result_type, id, exp, should_forward(arg));\n\t\tbreak;\n\t}\n\n\tcase OpInBoundsAccessChain:\n\tcase OpAccessChain:\n\tcase OpPtrAccessChain:\n\t\tif (is_tessellation_shader())\n\t\t{\n\t\t\tif (!emit_tessellation_access_chain(ops, instruction.length))\n\t\t\t\tCompilerGLSL::emit_instruction(instruction);\n\t\t}\n\t\telse\n\t\t\tCompilerGLSL::emit_instruction(instruction);\n\t\tfix_up_interpolant_access_chain(ops, instruction.length);\n\t\tbreak;\n\n\tcase OpStore:\n\t{\n\t\tconst auto &type = expression_type(ops[0]);\n\n\t\tif (is_out_of_bounds_tessellation_level(ops[0]))\n\t\t\tbreak;\n\n\t\tif (needs_frag_discard_checks() &&\n\t\t    (type.storage == StorageClassStorageBuffer || type.storage == StorageClassUniform))\n\t\t{\n\t\t\t// If we're in a continue block, this kludge will make the block too complex\n\t\t\t// to emit normally.\n\t\t\tassert(current_emitting_block);\n\t\t\tauto cont_type = continue_block_type(*current_emitting_block);\n\t\t\tif (cont_type != SPIRBlock::ContinueNone && cont_type != SPIRBlock::ComplexLoop)\n\t\t\t{\n\t\t\t\tcurrent_emitting_block->complex_continue = true;\n\t\t\t\tforce_recompile();\n\t\t\t}\n\t\t\tstatement(\"if (!\", builtin_to_glsl(BuiltInHelperInvocation, StorageClassInput), \")\");\n\t\t\tbegin_scope();\n\t\t}\n\t\tif (!maybe_emit_array_assignment(ops[0], ops[1]))\n\t\t\tCompilerGLSL::emit_instruction(instruction);\n\t\tif (needs_frag_discard_checks() &&\n\t\t    (type.storage == StorageClassStorageBuffer || type.storage == StorageClassUniform))\n\t\t\tend_scope();\n\t\tbreak;\n\t}\n\n\t// Compute barriers\n\tcase OpMemoryBarrier:\n\t\temit_barrier(0, ops[0], ops[1]);\n\t\tbreak;\n\n\tcase OpControlBarrier:\n\t\t// In GLSL a memory barrier is often followed by a control barrier.\n\t\t// But in MSL, memory barriers are also control barriers, so don't\n\t\t// emit a simple control barrier if a memory barrier has just been emitted.\n\t\tif (previous_instruction_opcode != OpMemoryBarrier)\n\t\t\temit_barrier(ops[0], ops[1], ops[2]);\n\t\tbreak;\n\n\tcase OpOuterProduct:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tuint32_t a = ops[2];\n\t\tuint32_t b = ops[3];\n\n\t\tauto &type = get<SPIRType>(result_type);\n\t\tstring expr = type_to_glsl_constructor(type);\n\t\texpr += \"(\";\n\t\tfor (uint32_t col = 0; col < type.columns; col++)\n\t\t{\n\t\t\texpr += to_enclosed_unpacked_expression(a);\n\t\t\texpr += \" * \";\n\t\t\texpr += to_extract_component_expression(b, col);\n\t\t\tif (col + 1 < type.columns)\n\t\t\t\texpr += \", \";\n\t\t}\n\t\texpr += \")\";\n\t\temit_op(result_type, id, expr, should_forward(a) && should_forward(b));\n\t\tinherit_expression_dependencies(id, a);\n\t\tinherit_expression_dependencies(id, b);\n\t\tbreak;\n\t}\n\n\tcase OpVectorTimesMatrix:\n\tcase OpMatrixTimesVector:\n\t{\n\t\tif (!msl_options.invariant_float_math && !has_decoration(ops[1], DecorationNoContraction))\n\t\t{\n\t\t\tCompilerGLSL::emit_instruction(instruction);\n\t\t\tbreak;\n\t\t}\n\n\t\t// If the matrix needs transpose, just flip the multiply order.\n\t\tauto *e = maybe_get<SPIRExpression>(ops[opcode == OpMatrixTimesVector ? 2 : 3]);\n\t\tif (e && e->need_transpose)\n\t\t{\n\t\t\te->need_transpose = false;\n\t\t\tstring expr;\n\n\t\t\tif (opcode == OpMatrixTimesVector)\n\t\t\t{\n\t\t\t\texpr = join(\"spvFMulVectorMatrix(\", to_enclosed_unpacked_expression(ops[3]), \", \",\n\t\t\t\t            to_unpacked_row_major_matrix_expression(ops[2]), \")\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\texpr = join(\"spvFMulMatrixVector(\", to_unpacked_row_major_matrix_expression(ops[3]), \", \",\n\t\t\t\t            to_enclosed_unpacked_expression(ops[2]), \")\");\n\t\t\t}\n\n\t\t\tbool forward = should_forward(ops[2]) && should_forward(ops[3]);\n\t\t\temit_op(ops[0], ops[1], expr, forward);\n\t\t\te->need_transpose = true;\n\t\t\tinherit_expression_dependencies(ops[1], ops[2]);\n\t\t\tinherit_expression_dependencies(ops[1], ops[3]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (opcode == OpMatrixTimesVector)\n\t\t\t\tMSL_BFOP(spvFMulMatrixVector);\n\t\t\telse\n\t\t\t\tMSL_BFOP(spvFMulVectorMatrix);\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpMatrixTimesMatrix:\n\t{\n\t\tif (!msl_options.invariant_float_math && !has_decoration(ops[1], DecorationNoContraction))\n\t\t{\n\t\t\tCompilerGLSL::emit_instruction(instruction);\n\t\t\tbreak;\n\t\t}\n\n\t\tauto *a = maybe_get<SPIRExpression>(ops[2]);\n\t\tauto *b = maybe_get<SPIRExpression>(ops[3]);\n\n\t\t// If both matrices need transpose, we can multiply in flipped order and tag the expression as transposed.\n\t\t// a^T * b^T = (b * a)^T.\n\t\tif (a && b && a->need_transpose && b->need_transpose)\n\t\t{\n\t\t\ta->need_transpose = false;\n\t\t\tb->need_transpose = false;\n\n\t\t\tauto expr =\n\t\t\t    join(\"spvFMulMatrixMatrix(\", enclose_expression(to_unpacked_row_major_matrix_expression(ops[3])), \", \",\n\t\t\t         enclose_expression(to_unpacked_row_major_matrix_expression(ops[2])), \")\");\n\n\t\t\tbool forward = should_forward(ops[2]) && should_forward(ops[3]);\n\t\t\tauto &e = emit_op(ops[0], ops[1], expr, forward);\n\t\t\te.need_transpose = true;\n\t\t\ta->need_transpose = true;\n\t\t\tb->need_transpose = true;\n\t\t\tinherit_expression_dependencies(ops[1], ops[2]);\n\t\t\tinherit_expression_dependencies(ops[1], ops[3]);\n\t\t}\n\t\telse\n\t\t\tMSL_BFOP(spvFMulMatrixMatrix);\n\n\t\tbreak;\n\t}\n\n\tcase OpIAddCarry:\n\tcase OpISubBorrow:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t result_id = ops[1];\n\t\tuint32_t op0 = ops[2];\n\t\tuint32_t op1 = ops[3];\n\t\tauto &type = get<SPIRType>(result_type);\n\t\temit_uninitialized_temporary_expression(result_type, result_id);\n\n\t\tauto &res_type = get<SPIRType>(type.member_types[1]);\n\t\tif (opcode == OpIAddCarry)\n\t\t{\n\t\t\tstatement(to_expression(result_id), \".\", to_member_name(type, 0), \" = \",\n\t\t\t\t\t  to_enclosed_unpacked_expression(op0), \" + \", to_enclosed_unpacked_expression(op1), \";\");\n\t\t\tstatement(to_expression(result_id), \".\", to_member_name(type, 1), \" = select(\", type_to_glsl(res_type),\n\t\t\t          \"(1), \", type_to_glsl(res_type), \"(0), \", to_unpacked_expression(result_id), \".\", to_member_name(type, 0),\n\t\t\t          \" >= max(\", to_unpacked_expression(op0), \", \", to_unpacked_expression(op1), \"));\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstatement(to_expression(result_id), \".\", to_member_name(type, 0), \" = \", to_enclosed_unpacked_expression(op0), \" - \",\n\t\t\t          to_enclosed_unpacked_expression(op1), \";\");\n\t\t\tstatement(to_expression(result_id), \".\", to_member_name(type, 1), \" = select(\", type_to_glsl(res_type),\n\t\t\t          \"(1), \", type_to_glsl(res_type), \"(0), \", to_enclosed_unpacked_expression(op0),\n\t\t\t          \" >= \", to_enclosed_unpacked_expression(op1), \");\");\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpUMulExtended:\n\tcase OpSMulExtended:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t result_id = ops[1];\n\t\tuint32_t op0 = ops[2];\n\t\tuint32_t op1 = ops[3];\n\t\tauto &type = get<SPIRType>(result_type);\n\t\tauto input_type = opcode == OpSMulExtended ? int_type : uint_type;\n\t\tauto &output_type = get_type(result_type);\n\t\tstring cast_op0, cast_op1;\n\n\t\tauto expected_type = binary_op_bitcast_helper(cast_op0, cast_op1, input_type, op0, op1, false);\n\n\t\temit_uninitialized_temporary_expression(result_type, result_id);\n\n\t\tstring mullo_expr, mulhi_expr;\n\t\tmullo_expr = join(cast_op0, \" * \", cast_op1);\n\t\tmulhi_expr = join(\"mulhi(\", cast_op0, \", \", cast_op1, \")\");\n\n\t\tauto &low_type = get_type(output_type.member_types[0]);\n\t\tauto &high_type = get_type(output_type.member_types[1]);\n\t\tif (low_type.basetype != input_type)\n\t\t{\n\t\t\texpected_type.basetype = input_type;\n\t\t\tmullo_expr = join(bitcast_glsl_op(low_type, expected_type), \"(\", mullo_expr, \")\");\n\t\t}\n\t\tif (high_type.basetype != input_type)\n\t\t{\n\t\t\texpected_type.basetype = input_type;\n\t\t\tmulhi_expr = join(bitcast_glsl_op(high_type, expected_type), \"(\", mulhi_expr, \")\");\n\t\t}\n\n\t\tstatement(to_expression(result_id), \".\", to_member_name(type, 0), \" = \", mullo_expr, \";\");\n\t\tstatement(to_expression(result_id), \".\", to_member_name(type, 1), \" = \", mulhi_expr, \";\");\n\t\tbreak;\n\t}\n\n\tcase OpArrayLength:\n\t{\n\t\tauto &type = expression_type(ops[2]);\n\t\tuint32_t offset = type_struct_member_offset(type, ops[3]);\n\t\tuint32_t stride = type_struct_member_array_stride(type, ops[3]);\n\n\t\tauto expr = join(\"(\", to_buffer_size_expression(ops[2]), \" - \", offset, \") / \", stride);\n\t\temit_op(ops[0], ops[1], expr, true);\n\t\tbreak;\n\t}\n\n\t// Legacy sub-group stuff ...\n\tcase OpSubgroupBallotKHR:\n\tcase OpSubgroupFirstInvocationKHR:\n\tcase OpSubgroupReadInvocationKHR:\n\tcase OpSubgroupAllKHR:\n\tcase OpSubgroupAnyKHR:\n\tcase OpSubgroupAllEqualKHR:\n\t\temit_subgroup_op(instruction);\n\t\tbreak;\n\n\t// SPV_INTEL_shader_integer_functions2\n\tcase OpUCountLeadingZerosINTEL:\n\t\tMSL_UFOP(clz);\n\t\tbreak;\n\n\tcase OpUCountTrailingZerosINTEL:\n\t\tMSL_UFOP(ctz);\n\t\tbreak;\n\n\tcase OpAbsISubINTEL:\n\tcase OpAbsUSubINTEL:\n\t\tMSL_BFOP(absdiff);\n\t\tbreak;\n\n\tcase OpIAddSatINTEL:\n\tcase OpUAddSatINTEL:\n\t\tMSL_BFOP(addsat);\n\t\tbreak;\n\n\tcase OpIAverageINTEL:\n\tcase OpUAverageINTEL:\n\t\tMSL_BFOP(hadd);\n\t\tbreak;\n\n\tcase OpIAverageRoundedINTEL:\n\tcase OpUAverageRoundedINTEL:\n\t\tMSL_BFOP(rhadd);\n\t\tbreak;\n\n\tcase OpISubSatINTEL:\n\tcase OpUSubSatINTEL:\n\t\tMSL_BFOP(subsat);\n\t\tbreak;\n\n\tcase OpIMul32x16INTEL:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tuint32_t a = ops[2], b = ops[3];\n\t\tbool forward = should_forward(a) && should_forward(b);\n\t\temit_op(result_type, id, join(\"int(short(\", to_unpacked_expression(a), \")) * int(short(\", to_unpacked_expression(b), \"))\"), forward);\n\t\tinherit_expression_dependencies(id, a);\n\t\tinherit_expression_dependencies(id, b);\n\t\tbreak;\n\t}\n\n\tcase OpUMul32x16INTEL:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tuint32_t a = ops[2], b = ops[3];\n\t\tbool forward = should_forward(a) && should_forward(b);\n\t\temit_op(result_type, id, join(\"uint(ushort(\", to_unpacked_expression(a), \")) * uint(ushort(\", to_unpacked_expression(b), \"))\"), forward);\n\t\tinherit_expression_dependencies(id, a);\n\t\tinherit_expression_dependencies(id, b);\n\t\tbreak;\n\t}\n\n\t// SPV_EXT_demote_to_helper_invocation\n\tcase OpDemoteToHelperInvocationEXT:\n\t\tif (!msl_options.supports_msl_version(2, 3))\n\t\t\tSPIRV_CROSS_THROW(\"discard_fragment() does not formally have demote semantics until MSL 2.3.\");\n\t\tCompilerGLSL::emit_instruction(instruction);\n\t\tbreak;\n\n\tcase OpIsHelperInvocationEXT:\n\t\tif (msl_options.is_ios() && !msl_options.supports_msl_version(2, 3))\n\t\t\tSPIRV_CROSS_THROW(\"simd_is_helper_thread() requires MSL 2.3 on iOS.\");\n\t\telse if (msl_options.is_macos() && !msl_options.supports_msl_version(2, 1))\n\t\t\tSPIRV_CROSS_THROW(\"simd_is_helper_thread() requires MSL 2.1 on macOS.\");\n\t\temit_op(ops[0], ops[1],\n\t\t        needs_manual_helper_invocation_updates() ? builtin_to_glsl(BuiltInHelperInvocation, StorageClassInput) :\n\t\t                                                   \"simd_is_helper_thread()\",\n\t\t        false);\n\t\tbreak;\n\n\tcase OpBeginInvocationInterlockEXT:\n\tcase OpEndInvocationInterlockEXT:\n\t\tif (!msl_options.supports_msl_version(2, 0))\n\t\t\tSPIRV_CROSS_THROW(\"Raster order groups require MSL 2.0.\");\n\t\tbreak; // Nothing to do in the body\n\n\tcase OpConvertUToAccelerationStructureKHR:\n\t\tSPIRV_CROSS_THROW(\"ConvertUToAccelerationStructure is not supported in MSL.\");\n\tcase OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR:\n\t\tSPIRV_CROSS_THROW(\"BindingTableRecordOffset is not supported in MSL.\");\n\n\tcase OpRayQueryInitializeKHR:\n\t{\n\t\tflush_variable_declaration(ops[0]);\n\t\tregister_write(ops[0]);\n\t\tadd_spv_func_and_recompile(SPVFuncImplRayQueryIntersectionParams);\n\n\t\tstatement(to_expression(ops[0]), \".reset(\", \"ray(\", to_expression(ops[4]), \", \", to_expression(ops[6]), \", \",\n\t\t          to_expression(ops[5]), \", \", to_expression(ops[7]), \"), \", to_expression(ops[1]), \", \", to_expression(ops[3]),\n\t\t          \", spvMakeIntersectionParams(\", to_expression(ops[2]), \"));\");\n\t\tbreak;\n\t}\n\tcase OpRayQueryProceedKHR:\n\t{\n\t\tflush_variable_declaration(ops[0]);\n\t\tregister_write(ops[2]);\n\t\temit_op(ops[0], ops[1], join(to_expression(ops[2]), \".next()\"), false);\n\t\tbreak;\n\t}\n#define MSL_RAY_QUERY_IS_CANDIDATE get<SPIRConstant>(ops[3]).scalar_i32() == 0\n\n#define MSL_RAY_QUERY_GET_OP(op, msl_op)                                                   \\\n\tcase OpRayQueryGet##op##KHR:                                                           \\\n\t\tflush_variable_declaration(ops[2]);                                                \\\n\t\temit_op(ops[0], ops[1], join(to_expression(ops[2]), \".get_\" #msl_op \"()\"), false); \\\n\t\tbreak\n\n#define MSL_RAY_QUERY_OP_INNER2(op, msl_prefix, msl_op)                                                          \\\n\tcase OpRayQueryGet##op##KHR:                                                                                 \\\n\t\tflush_variable_declaration(ops[2]);                                                                      \\\n\t\tif (MSL_RAY_QUERY_IS_CANDIDATE)                                                                          \\\n\t\t\temit_op(ops[0], ops[1], join(to_expression(ops[2]), #msl_prefix \"_candidate_\" #msl_op \"()\"), false); \\\n\t\telse                                                                                                     \\\n\t\t\temit_op(ops[0], ops[1], join(to_expression(ops[2]), #msl_prefix \"_committed_\" #msl_op \"()\"), false); \\\n\t\tbreak\n\n#define MSL_RAY_QUERY_GET_OP2(op, msl_op) MSL_RAY_QUERY_OP_INNER2(op, .get, msl_op)\n#define MSL_RAY_QUERY_IS_OP2(op, msl_op) MSL_RAY_QUERY_OP_INNER2(op, .is, msl_op)\n\n\t\tMSL_RAY_QUERY_GET_OP(RayTMin, ray_min_distance);\n\t\tMSL_RAY_QUERY_GET_OP(WorldRayOrigin, world_space_ray_origin);\n\t\tMSL_RAY_QUERY_GET_OP(WorldRayDirection, world_space_ray_direction);\n\t\tMSL_RAY_QUERY_GET_OP2(IntersectionInstanceId, instance_id);\n\t\tMSL_RAY_QUERY_GET_OP2(IntersectionInstanceCustomIndex, user_instance_id);\n\t\tMSL_RAY_QUERY_GET_OP2(IntersectionBarycentrics, triangle_barycentric_coord);\n\t\tMSL_RAY_QUERY_GET_OP2(IntersectionPrimitiveIndex, primitive_id);\n\t\tMSL_RAY_QUERY_GET_OP2(IntersectionGeometryIndex, geometry_id);\n\t\tMSL_RAY_QUERY_GET_OP2(IntersectionObjectRayOrigin, ray_origin);\n\t\tMSL_RAY_QUERY_GET_OP2(IntersectionObjectRayDirection, ray_direction);\n\t\tMSL_RAY_QUERY_GET_OP2(IntersectionObjectToWorld, object_to_world_transform);\n\t\tMSL_RAY_QUERY_GET_OP2(IntersectionWorldToObject, world_to_object_transform);\n\t\tMSL_RAY_QUERY_IS_OP2(IntersectionFrontFace, triangle_front_facing);\n\n\tcase OpRayQueryGetIntersectionTypeKHR:\n\t\tflush_variable_declaration(ops[2]);\n\t\tif (MSL_RAY_QUERY_IS_CANDIDATE)\n\t\t\temit_op(ops[0], ops[1], join(\"uint(\", to_expression(ops[2]), \".get_candidate_intersection_type()) - 1\"),\n\t\t\t        false);\n\t\telse\n\t\t\temit_op(ops[0], ops[1], join(\"uint(\", to_expression(ops[2]), \".get_committed_intersection_type())\"), false);\n\t\tbreak;\n\tcase OpRayQueryGetIntersectionTKHR:\n\t\tflush_variable_declaration(ops[2]);\n\t\tif (MSL_RAY_QUERY_IS_CANDIDATE)\n\t\t\temit_op(ops[0], ops[1], join(to_expression(ops[2]), \".get_candidate_triangle_distance()\"), false);\n\t\telse\n\t\t\temit_op(ops[0], ops[1], join(to_expression(ops[2]), \".get_committed_distance()\"), false);\n\t\tbreak;\n\tcase OpRayQueryGetIntersectionCandidateAABBOpaqueKHR:\n\t{\n\t\tflush_variable_declaration(ops[0]);\n\t\temit_op(ops[0], ops[1], join(to_expression(ops[2]), \".is_candidate_non_opaque_bounding_box()\"), false);\n\t\tbreak;\n\t}\n\tcase OpRayQueryConfirmIntersectionKHR:\n\t\tflush_variable_declaration(ops[0]);\n\t\tregister_write(ops[0]);\n\t\tstatement(to_expression(ops[0]), \".commit_triangle_intersection();\");\n\t\tbreak;\n\tcase OpRayQueryGenerateIntersectionKHR:\n\t\tflush_variable_declaration(ops[0]);\n\t\tregister_write(ops[0]);\n\t\tstatement(to_expression(ops[0]), \".commit_bounding_box_intersection(\", to_expression(ops[1]), \");\");\n\t\tbreak;\n\tcase OpRayQueryTerminateKHR:\n\t\tflush_variable_declaration(ops[0]);\n\t\tregister_write(ops[0]);\n\t\tstatement(to_expression(ops[0]), \".abort();\");\n\t\tbreak;\n#undef MSL_RAY_QUERY_GET_OP\n#undef MSL_RAY_QUERY_IS_CANDIDATE\n#undef MSL_RAY_QUERY_IS_OP2\n#undef MSL_RAY_QUERY_GET_OP2\n#undef MSL_RAY_QUERY_OP_INNER2\n\n\tcase OpConvertPtrToU:\n\tcase OpConvertUToPtr:\n\tcase OpBitcast:\n\t{\n\t\tauto &type = get<SPIRType>(ops[0]);\n\t\tauto &input_type = expression_type(ops[2]);\n\n\t\tif (opcode != OpBitcast || type.pointer || input_type.pointer)\n\t\t{\n\t\t\tstring op;\n\n\t\t\tif (type.vecsize == 1 && input_type.vecsize == 1)\n\t\t\t\top = join(\"reinterpret_cast<\", type_to_glsl(type), \">(\", to_unpacked_expression(ops[2]), \")\");\n\t\t\telse if (input_type.vecsize == 2)\n\t\t\t\top = join(\"reinterpret_cast<\", type_to_glsl(type), \">(as_type<ulong>(\", to_unpacked_expression(ops[2]), \"))\");\n\t\t\telse\n\t\t\t\top = join(\"as_type<\", type_to_glsl(type), \">(reinterpret_cast<ulong>(\", to_unpacked_expression(ops[2]), \"))\");\n\n\t\t\temit_op(ops[0], ops[1], op, should_forward(ops[2]));\n\t\t\tinherit_expression_dependencies(ops[1], ops[2]);\n\t\t}\n\t\telse\n\t\t\tCompilerGLSL::emit_instruction(instruction);\n\n\t\tbreak;\n\t}\n\n\tdefault:\n\t\tCompilerGLSL::emit_instruction(instruction);\n\t\tbreak;\n\t}\n\n\tprevious_instruction_opcode = opcode;\n}\n\nvoid CompilerMSL::emit_texture_op(const Instruction &i, bool sparse)\n{\n\tif (sparse)\n\t\tSPIRV_CROSS_THROW(\"Sparse feedback not yet supported in MSL.\");\n\n\tif (msl_options.use_framebuffer_fetch_subpasses)\n\t{\n\t\tauto *ops = stream(i);\n\n\t\tuint32_t result_type_id = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tuint32_t img = ops[2];\n\n\t\tauto &type = expression_type(img);\n\t\tauto &imgtype = get<SPIRType>(type.self);\n\n\t\t// Use Metal's native frame-buffer fetch API for subpass inputs.\n\t\tif (imgtype.image.dim == DimSubpassData)\n\t\t{\n\t\t\t// Subpass inputs cannot be invalidated,\n\t\t\t// so just forward the expression directly.\n\t\t\tstring expr = to_expression(img);\n\t\t\temit_op(result_type_id, id, expr, true);\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Fallback to default implementation\n\tCompilerGLSL::emit_texture_op(i, sparse);\n}\n\nvoid CompilerMSL::emit_barrier(uint32_t id_exe_scope, uint32_t id_mem_scope, uint32_t id_mem_sem)\n{\n\tif (get_execution_model() != ExecutionModelGLCompute && !is_tesc_shader())\n\t\treturn;\n\n\tuint32_t exe_scope = id_exe_scope ? evaluate_constant_u32(id_exe_scope) : uint32_t(ScopeInvocation);\n\tuint32_t mem_scope = id_mem_scope ? evaluate_constant_u32(id_mem_scope) : uint32_t(ScopeInvocation);\n\t// Use the wider of the two scopes (smaller value)\n\texe_scope = min(exe_scope, mem_scope);\n\n\tif (msl_options.emulate_subgroups && exe_scope >= ScopeSubgroup && !id_mem_sem)\n\t\t// In this case, we assume a \"subgroup\" size of 1. The barrier, then, is a noop.\n\t\treturn;\n\n\tstring bar_stmt;\n\tif ((msl_options.is_ios() && msl_options.supports_msl_version(1, 2)) || msl_options.supports_msl_version(2))\n\t\tbar_stmt = exe_scope < ScopeSubgroup ? \"threadgroup_barrier\" : \"simdgroup_barrier\";\n\telse\n\t\tbar_stmt = \"threadgroup_barrier\";\n\tbar_stmt += \"(\";\n\n\tuint32_t mem_sem = id_mem_sem ? evaluate_constant_u32(id_mem_sem) : uint32_t(MemorySemanticsMaskNone);\n\n\t// Use the | operator to combine flags if we can.\n\tif (msl_options.supports_msl_version(1, 2))\n\t{\n\t\tstring mem_flags = \"\";\n\t\t// For tesc shaders, this also affects objects in the Output storage class.\n\t\t// Since in Metal, these are placed in a device buffer, we have to sync device memory here.\n\t\tif (is_tesc_shader() ||\n\t\t    (mem_sem & (MemorySemanticsUniformMemoryMask | MemorySemanticsCrossWorkgroupMemoryMask)))\n\t\t\tmem_flags += \"mem_flags::mem_device\";\n\n\t\t// Fix tessellation patch function processing\n\t\tif (is_tesc_shader() || (mem_sem & (MemorySemanticsSubgroupMemoryMask | MemorySemanticsWorkgroupMemoryMask)))\n\t\t{\n\t\t\tif (!mem_flags.empty())\n\t\t\t\tmem_flags += \" | \";\n\t\t\tmem_flags += \"mem_flags::mem_threadgroup\";\n\t\t}\n\t\tif (mem_sem & MemorySemanticsImageMemoryMask)\n\t\t{\n\t\t\tif (!mem_flags.empty())\n\t\t\t\tmem_flags += \" | \";\n\t\t\tmem_flags += \"mem_flags::mem_texture\";\n\t\t}\n\n\t\tif (mem_flags.empty())\n\t\t\tmem_flags = \"mem_flags::mem_none\";\n\n\t\tbar_stmt += mem_flags;\n\t}\n\telse\n\t{\n\t\tif ((mem_sem & (MemorySemanticsUniformMemoryMask | MemorySemanticsCrossWorkgroupMemoryMask)) &&\n\t\t    (mem_sem & (MemorySemanticsSubgroupMemoryMask | MemorySemanticsWorkgroupMemoryMask)))\n\t\t\tbar_stmt += \"mem_flags::mem_device_and_threadgroup\";\n\t\telse if (mem_sem & (MemorySemanticsUniformMemoryMask | MemorySemanticsCrossWorkgroupMemoryMask))\n\t\t\tbar_stmt += \"mem_flags::mem_device\";\n\t\telse if (mem_sem & (MemorySemanticsSubgroupMemoryMask | MemorySemanticsWorkgroupMemoryMask))\n\t\t\tbar_stmt += \"mem_flags::mem_threadgroup\";\n\t\telse if (mem_sem & MemorySemanticsImageMemoryMask)\n\t\t\tbar_stmt += \"mem_flags::mem_texture\";\n\t\telse\n\t\t\tbar_stmt += \"mem_flags::mem_none\";\n\t}\n\n\tbar_stmt += \");\";\n\n\tstatement(bar_stmt);\n\n\tassert(current_emitting_block);\n\tflush_control_dependent_expressions(current_emitting_block->self);\n\tflush_all_active_variables();\n}\n\nstatic bool storage_class_array_is_thread(StorageClass storage)\n{\n\tswitch (storage)\n\t{\n\tcase StorageClassInput:\n\tcase StorageClassOutput:\n\tcase StorageClassGeneric:\n\tcase StorageClassFunction:\n\tcase StorageClassPrivate:\n\t\treturn true;\n\n\tdefault:\n\t\treturn false;\n\t}\n}\n\nbool CompilerMSL::emit_array_copy(const char *expr, uint32_t lhs_id, uint32_t rhs_id,\n\t\t\t\t\t\t\t\t  StorageClass lhs_storage, StorageClass rhs_storage)\n{\n\t// Allow Metal to use the array<T> template to make arrays a value type.\n\t// This, however, cannot be used for threadgroup address specifiers, so consider the custom array copy as fallback.\n\tbool lhs_is_thread_storage = storage_class_array_is_thread(lhs_storage);\n\tbool rhs_is_thread_storage = storage_class_array_is_thread(rhs_storage);\n\n\tbool lhs_is_array_template = lhs_is_thread_storage || lhs_storage == StorageClassWorkgroup;\n\tbool rhs_is_array_template = rhs_is_thread_storage || rhs_storage == StorageClassWorkgroup;\n\n\t// Special considerations for stage IO variables.\n\t// If the variable is actually backed by non-user visible device storage, we use array templates for those.\n\t//\n\t// Another special consideration is given to thread local variables which happen to have Offset decorations\n\t// applied to them. Block-like types do not use array templates, so we need to force POD path if we detect\n\t// these scenarios. This check isn't perfect since it would be technically possible to mix and match these things,\n\t// and for a fully correct solution we might have to track array template state through access chains as well,\n\t// but for all reasonable use cases, this should suffice.\n\t// This special case should also only apply to Function/Private storage classes.\n\t// We should not check backing variable for temporaries.\n\tauto *lhs_var = maybe_get_backing_variable(lhs_id);\n\tif (lhs_var && lhs_storage == StorageClassStorageBuffer && storage_class_array_is_thread(lhs_var->storage))\n\t\tlhs_is_array_template = true;\n\telse if (lhs_var && lhs_storage != StorageClassGeneric && type_is_block_like(get<SPIRType>(lhs_var->basetype)))\n\t\tlhs_is_array_template = false;\n\n\tauto *rhs_var = maybe_get_backing_variable(rhs_id);\n\tif (rhs_var && rhs_storage == StorageClassStorageBuffer && storage_class_array_is_thread(rhs_var->storage))\n\t\trhs_is_array_template = true;\n\telse if (rhs_var && rhs_storage != StorageClassGeneric && type_is_block_like(get<SPIRType>(rhs_var->basetype)))\n\t\trhs_is_array_template = false;\n\n\t// If threadgroup storage qualifiers are *not* used:\n\t// Avoid spvCopy* wrapper functions; Otherwise, spvUnsafeArray<> template cannot be used with that storage qualifier.\n\tif (lhs_is_array_template && rhs_is_array_template && !using_builtin_array())\n\t{\n\t\t// Fall back to normal copy path.\n\t\treturn false;\n\t}\n\telse\n\t{\n\t\t// Ensure the LHS variable has been declared\n\t\tif (lhs_var)\n\t\t\tflush_variable_declaration(lhs_var->self);\n\n\t\tstring lhs;\n\t\tif (expr)\n\t\t\tlhs = expr;\n\t\telse\n\t\t\tlhs = to_expression(lhs_id);\n\n\t\t// Assignment from an array initializer is fine.\n\t\tauto &type = expression_type(rhs_id);\n\t\tauto *var = maybe_get_backing_variable(rhs_id);\n\n\t\t// Unfortunately, we cannot template on address space in MSL,\n\t\t// so explicit address space redirection it is ...\n\t\tbool is_constant = false;\n\t\tif (ir.ids[rhs_id].get_type() == TypeConstant)\n\t\t{\n\t\t\tis_constant = true;\n\t\t}\n\t\telse if (var && var->remapped_variable && var->statically_assigned &&\n\t\t         ir.ids[var->static_expression].get_type() == TypeConstant)\n\t\t{\n\t\t\tis_constant = true;\n\t\t}\n\t\telse if (rhs_storage == StorageClassUniform || rhs_storage == StorageClassUniformConstant)\n\t\t{\n\t\t\tis_constant = true;\n\t\t}\n\n\t\t// For the case where we have OpLoad triggering an array copy,\n\t\t// we cannot easily detect this case ahead of time since it's\n\t\t// context dependent. We might have to force a recompile here\n\t\t// if this is the only use of array copies in our shader.\n\t\tif (type.array.size() > 1)\n\t\t{\n\t\t\tif (type.array.size() > kArrayCopyMultidimMax)\n\t\t\t\tSPIRV_CROSS_THROW(\"Cannot support this many dimensions for arrays of arrays.\");\n\t\t\tauto func = static_cast<SPVFuncImpl>(SPVFuncImplArrayCopyMultidimBase + type.array.size());\n\t\t\tadd_spv_func_and_recompile(func);\n\t\t}\n\t\telse\n\t\t\tadd_spv_func_and_recompile(SPVFuncImplArrayCopy);\n\n\t\tconst char *tag = nullptr;\n\t\tif (lhs_is_thread_storage && is_constant)\n\t\t\ttag = \"FromConstantToStack\";\n\t\telse if (lhs_storage == StorageClassWorkgroup && is_constant)\n\t\t\ttag = \"FromConstantToThreadGroup\";\n\t\telse if (lhs_is_thread_storage && rhs_is_thread_storage)\n\t\t\ttag = \"FromStackToStack\";\n\t\telse if (lhs_storage == StorageClassWorkgroup && rhs_is_thread_storage)\n\t\t\ttag = \"FromStackToThreadGroup\";\n\t\telse if (lhs_is_thread_storage && rhs_storage == StorageClassWorkgroup)\n\t\t\ttag = \"FromThreadGroupToStack\";\n\t\telse if (lhs_storage == StorageClassWorkgroup && rhs_storage == StorageClassWorkgroup)\n\t\t\ttag = \"FromThreadGroupToThreadGroup\";\n\t\telse if (lhs_storage == StorageClassStorageBuffer && rhs_storage == StorageClassStorageBuffer)\n\t\t\ttag = \"FromDeviceToDevice\";\n\t\telse if (lhs_storage == StorageClassStorageBuffer && is_constant)\n\t\t\ttag = \"FromConstantToDevice\";\n\t\telse if (lhs_storage == StorageClassStorageBuffer && rhs_storage == StorageClassWorkgroup)\n\t\t\ttag = \"FromThreadGroupToDevice\";\n\t\telse if (lhs_storage == StorageClassStorageBuffer && rhs_is_thread_storage)\n\t\t\ttag = \"FromStackToDevice\";\n\t\telse if (lhs_storage == StorageClassWorkgroup && rhs_storage == StorageClassStorageBuffer)\n\t\t\ttag = \"FromDeviceToThreadGroup\";\n\t\telse if (lhs_is_thread_storage && rhs_storage == StorageClassStorageBuffer)\n\t\t\ttag = \"FromDeviceToStack\";\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"Unknown storage class used for copying arrays.\");\n\n\t\t// Pass internal array of spvUnsafeArray<> into wrapper functions\n\t\tif (lhs_is_array_template && rhs_is_array_template && !msl_options.force_native_arrays)\n\t\t\tstatement(\"spvArrayCopy\", tag, type.array.size(), \"(\", lhs, \".elements, \", to_expression(rhs_id), \".elements);\");\n\t\tif (lhs_is_array_template && !msl_options.force_native_arrays)\n\t\t\tstatement(\"spvArrayCopy\", tag, type.array.size(), \"(\", lhs, \".elements, \", to_expression(rhs_id), \");\");\n\t\telse if (rhs_is_array_template && !msl_options.force_native_arrays)\n\t\t\tstatement(\"spvArrayCopy\", tag, type.array.size(), \"(\", lhs, \", \", to_expression(rhs_id), \".elements);\");\n\t\telse\n\t\t\tstatement(\"spvArrayCopy\", tag, type.array.size(), \"(\", lhs, \", \", to_expression(rhs_id), \");\");\n\t}\n\n\treturn true;\n}\n\nuint32_t CompilerMSL::get_physical_tess_level_array_size(spv::BuiltIn builtin) const\n{\n\tif (is_tessellating_triangles())\n\t\treturn builtin == BuiltInTessLevelInner ? 1 : 3;\n\telse\n\t\treturn builtin == BuiltInTessLevelInner ? 2 : 4;\n}\n\n// Since MSL does not allow arrays to be copied via simple variable assignment,\n// if the LHS and RHS represent an assignment of an entire array, it must be\n// implemented by calling an array copy function.\n// Returns whether the struct assignment was emitted.\nbool CompilerMSL::maybe_emit_array_assignment(uint32_t id_lhs, uint32_t id_rhs)\n{\n\t// We only care about assignments of an entire array\n\tauto &type = expression_type(id_lhs);\n\tif (!is_array(get_pointee_type(type)))\n\t\treturn false;\n\n\tauto *var = maybe_get<SPIRVariable>(id_lhs);\n\n\t// Is this a remapped, static constant? Don't do anything.\n\tif (var && var->remapped_variable && var->statically_assigned)\n\t\treturn true;\n\n\tif (ir.ids[id_rhs].get_type() == TypeConstant && var && var->deferred_declaration)\n\t{\n\t\t// Special case, if we end up declaring a variable when assigning the constant array,\n\t\t// we can avoid the copy by directly assigning the constant expression.\n\t\t// This is likely necessary to be able to use a variable as a true look-up table, as it is unlikely\n\t\t// the compiler will be able to optimize the spvArrayCopy() into a constant LUT.\n\t\t// After a variable has been declared, we can no longer assign constant arrays in MSL unfortunately.\n\t\tstatement(to_expression(id_lhs), \" = \", constant_expression(get<SPIRConstant>(id_rhs)), \";\");\n\t\treturn true;\n\t}\n\n\tif (is_tesc_shader() && has_decoration(id_lhs, DecorationBuiltIn))\n\t{\n\t\tauto builtin = BuiltIn(get_decoration(id_lhs, DecorationBuiltIn));\n\t\t// Need to manually unroll the array store.\n\t\tif (builtin == BuiltInTessLevelInner || builtin == BuiltInTessLevelOuter)\n\t\t{\n\t\t\tuint32_t array_size = get_physical_tess_level_array_size(builtin);\n\t\t\tif (array_size == 1)\n\t\t\t\tstatement(to_expression(id_lhs), \" = half(\", to_expression(id_rhs), \"[0]);\");\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor (uint32_t i = 0; i < array_size; i++)\n\t\t\t\t\tstatement(to_expression(id_lhs), \"[\", i, \"] = half(\", to_expression(id_rhs), \"[\", i, \"]);\");\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tauto lhs_storage = get_expression_effective_storage_class(id_lhs);\n\tauto rhs_storage = get_expression_effective_storage_class(id_rhs);\n\tif (!emit_array_copy(nullptr, id_lhs, id_rhs, lhs_storage, rhs_storage))\n\t\treturn false;\n\n\tregister_write(id_lhs);\n\n\treturn true;\n}\n\n// Emits one of the atomic functions. In MSL, the atomic functions operate on pointers\nvoid CompilerMSL::emit_atomic_func_op(uint32_t result_type, uint32_t result_id, const char *op, Op opcode,\n                                      uint32_t mem_order_1, uint32_t mem_order_2, bool has_mem_order_2, uint32_t obj, uint32_t op1,\n                                      bool op1_is_pointer, bool op1_is_literal, uint32_t op2)\n{\n\tstring exp;\n\n\tauto &type = get_pointee_type(expression_type(obj));\n\tauto expected_type = type.basetype;\n\tif (opcode == OpAtomicUMax || opcode == OpAtomicUMin)\n\t\texpected_type = to_unsigned_basetype(type.width);\n\telse if (opcode == OpAtomicSMax || opcode == OpAtomicSMin)\n\t\texpected_type = to_signed_basetype(type.width);\n\n\tbool use_native_image_atomic;\n\tif (msl_options.supports_msl_version(3, 1))\n\t\tuse_native_image_atomic = check_atomic_image(obj);\n\telse\n\t\tuse_native_image_atomic = false;\n\n\tif (type.width == 64)\n\t\tSPIRV_CROSS_THROW(\"MSL currently does not support 64-bit atomics.\");\n\n\tauto remapped_type = type;\n\tremapped_type.basetype = expected_type;\n\n\tauto *var = maybe_get_backing_variable(obj);\n\tif (!var)\n\t\tSPIRV_CROSS_THROW(\"No backing variable for atomic operation.\");\n\tconst auto &res_type = get<SPIRType>(var->basetype);\n\n\tbool is_atomic_compare_exchange_strong = op1_is_pointer && op1;\n\n\tbool check_discard = opcode != OpAtomicLoad && needs_frag_discard_checks() &&\n\t                     ((res_type.storage == StorageClassUniformConstant && res_type.basetype == SPIRType::Image) ||\n\t                      var->storage == StorageClassStorageBuffer || var->storage == StorageClassUniform);\n\n\t// Even compare exchange atomics are vec4 on metal for ... reasons :v\n\tuint32_t vec4_temporary_id = 0;\n\tif (use_native_image_atomic && is_atomic_compare_exchange_strong)\n\t{\n\t\tuint32_t &tmp_id = extra_sub_expressions[result_id];\n\t\tif (!tmp_id)\n\t\t{\n\t\t\ttmp_id = ir.increase_bound_by(2);\n\n\t\t\tauto vec4_type = get<SPIRType>(result_type);\n\t\t\tvec4_type.vecsize = 4;\n\t\t\tset<SPIRType>(tmp_id + 1, vec4_type);\n\t\t}\n\n\t\tvec4_temporary_id = tmp_id;\n\t}\n\n\tif (check_discard)\n\t{\n\t\tif (is_atomic_compare_exchange_strong)\n\t\t{\n\t\t\t// We're already emitting a CAS loop here; a conditional won't hurt.\n\t\t\temit_uninitialized_temporary_expression(result_type, result_id);\n\t\t\tif (vec4_temporary_id)\n\t\t\t\temit_uninitialized_temporary_expression(vec4_temporary_id + 1, vec4_temporary_id);\n\t\t\tstatement(\"if (!\", builtin_to_glsl(BuiltInHelperInvocation, StorageClassInput), \")\");\n\t\t\tbegin_scope();\n\t\t}\n\t\telse\n\t\t\texp = join(\"(!\", builtin_to_glsl(BuiltInHelperInvocation, StorageClassInput), \" ? \");\n\t}\n\n\tif (use_native_image_atomic)\n\t{\n\t\tauto obj_expression = to_expression(obj);\n\t\tauto split_index = obj_expression.find_first_of('@');\n\n\t\t// Will only be false if we're in \"force recompile later\" mode.\n\t\tif (split_index != string::npos)\n\t\t\texp += join(obj_expression.substr(0, split_index), \".\", op, \"(\", obj_expression.substr(split_index + 1));\n\t\telse\n\t\t\texp += obj_expression;\n\t}\n\telse\n\t{\n\t\texp += string(op) + \"_explicit(\";\n\t\texp += \"(\";\n\t\t// Emulate texture2D atomic operations\n\t\tif (res_type.storage == StorageClassUniformConstant && res_type.basetype == SPIRType::Image)\n\t\t{\n\t\t\texp += \"device\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\texp += get_argument_address_space(*var);\n\t\t}\n\n\t\texp += \" atomic_\";\n\t\t// For signed and unsigned min/max, we can signal this through the pointer type.\n\t\t// There is no other way, since C++ does not have explicit signage for atomics.\n\t\texp += type_to_glsl(remapped_type);\n\t\texp += \"*)\";\n\n\t\texp += \"&\";\n\t\texp += to_enclosed_expression(obj);\n\t}\n\n\tif (is_atomic_compare_exchange_strong)\n\t{\n\t\tassert(strcmp(op, \"atomic_compare_exchange_weak\") == 0);\n\t\tassert(op2);\n\t\tassert(has_mem_order_2);\n\t\texp += \", &\";\n\t\texp += to_name(vec4_temporary_id ? vec4_temporary_id : result_id);\n\t\texp += \", \";\n\t\texp += to_expression(op2);\n\n\t\tif (!use_native_image_atomic)\n\t\t{\n\t\t\texp += \", \";\n\t\t\texp += get_memory_order(mem_order_1);\n\t\t\texp += \", \";\n\t\t\texp += get_memory_order(mem_order_2);\n\t\t}\n\t\texp += \")\";\n\n\t\t// MSL only supports the weak atomic compare exchange, so emit a CAS loop here.\n\t\t// The MSL function returns false if the atomic write fails OR the comparison test fails,\n\t\t// so we must validate that it wasn't the comparison test that failed before continuing\n\t\t// the CAS loop, otherwise it will loop infinitely, with the comparison test always failing.\n\t\t// The function updates the comparator value from the memory value, so the additional\n\t\t// comparison test evaluates the memory value against the expected value.\n\t\tif (!check_discard)\n\t\t{\n\t\t\temit_uninitialized_temporary_expression(result_type, result_id);\n\t\t\tif (vec4_temporary_id)\n\t\t\t\temit_uninitialized_temporary_expression(vec4_temporary_id + 1, vec4_temporary_id);\n\t\t}\n\n\t\tstatement(\"do\");\n\t\tbegin_scope();\n\n\t\tstring scalar_expression;\n\t\tif (vec4_temporary_id)\n\t\t\tscalar_expression = join(to_expression(vec4_temporary_id), \".x\");\n\t\telse\n\t\t\tscalar_expression = to_expression(result_id);\n\n\t\tstatement(scalar_expression, \" = \", to_expression(op1), \";\");\n\t\tend_scope_decl(join(\"while (!\", exp, \" && \", scalar_expression, \" == \", to_enclosed_expression(op1), \")\"));\n\t\tif (vec4_temporary_id)\n\t\t\tstatement(to_expression(result_id), \" = \", scalar_expression, \";\");\n\n\t\t// Vulkan: (section 9.29: ...  and values returned by atomic instructions in helper invocations are undefined)\n\t\tif (check_discard)\n\t\t{\n\t\t\tend_scope();\n\t\t\tstatement(\"else\");\n\t\t\tbegin_scope();\n\t\t\tstatement(to_expression(result_id), \" = {};\");\n\t\t\tend_scope();\n\t\t}\n\t}\n\telse\n\t{\n\t\tassert(strcmp(op, \"atomic_compare_exchange_weak\") != 0);\n\n\t\tif (op1)\n\t\t{\n\t\t\texp += \", \";\n\t\t\tif (op1_is_literal)\n\t\t\t\texp += to_string(op1);\n\t\t\telse\n\t\t\t\texp += bitcast_expression(expected_type, op1);\n\t\t}\n\n\t\tif (op2)\n\t\t\texp += \", \" + to_expression(op2);\n\n\t\tif (!use_native_image_atomic)\n\t\t{\n\t\t\texp += string(\", \") + get_memory_order(mem_order_1);\n\t\t\tif (has_mem_order_2)\n\t\t\t\texp += string(\", \") + get_memory_order(mem_order_2);\n\t\t}\n\n\t\texp += \")\";\n\n\t\t// For some particular reason, atomics return vec4 in Metal ...\n\t\tif (use_native_image_atomic)\n\t\t\texp += \".x\";\n\n\t\t// Vulkan: (section 9.29: ...  and values returned by atomic instructions in helper invocations are undefined)\n\t\tif (check_discard)\n\t\t{\n\t\t\texp += \" : \";\n\t\t\tif (strcmp(op, \"atomic_store\") != 0)\n\t\t\t\texp += join(type_to_glsl(get<SPIRType>(result_type)), \"{}\");\n\t\t\telse\n\t\t\t\texp += \"((void)0)\";\n\t\t\texp += \")\";\n\t\t}\n\n\t\tif (expected_type != type.basetype)\n\t\t\texp = bitcast_expression(type, expected_type, exp);\n\n\t\tif (strcmp(op, \"atomic_store\") != 0)\n\t\t\temit_op(result_type, result_id, exp, false);\n\t\telse\n\t\t\tstatement(exp, \";\");\n\t}\n\n\tflush_all_atomic_capable_variables();\n}\n\n// Metal only supports relaxed memory order for now\nconst char *CompilerMSL::get_memory_order(uint32_t)\n{\n\treturn \"memory_order_relaxed\";\n}\n\n// Override for MSL-specific extension syntax instructions.\n// In some cases, deliberately select either the fast or precise versions of the MSL functions to match Vulkan math precision results.\nvoid CompilerMSL::emit_glsl_op(uint32_t result_type, uint32_t id, uint32_t eop, const uint32_t *args, uint32_t count)\n{\n\tauto op = static_cast<GLSLstd450>(eop);\n\n\t// If we need to do implicit bitcasts, make sure we do it with the correct type.\n\tuint32_t integer_width = get_integer_width_for_glsl_instruction(op, args, count);\n\tauto int_type = to_signed_basetype(integer_width);\n\tauto uint_type = to_unsigned_basetype(integer_width);\n\n\top = get_remapped_glsl_op(op);\n\n\tswitch (op)\n\t{\n\tcase GLSLstd450Sinh:\n\t\temit_unary_func_op(result_type, id, args[0], \"fast::sinh\");\n\t\tbreak;\n\tcase GLSLstd450Cosh:\n\t\temit_unary_func_op(result_type, id, args[0], \"fast::cosh\");\n\t\tbreak;\n\tcase GLSLstd450Tanh:\n\t\temit_unary_func_op(result_type, id, args[0], \"precise::tanh\");\n\t\tbreak;\n\tcase GLSLstd450Atan2:\n\t\temit_binary_func_op(result_type, id, args[0], args[1], \"precise::atan2\");\n\t\tbreak;\n\tcase GLSLstd450InverseSqrt:\n\t\temit_unary_func_op(result_type, id, args[0], \"rsqrt\");\n\t\tbreak;\n\tcase GLSLstd450RoundEven:\n\t\temit_unary_func_op(result_type, id, args[0], \"rint\");\n\t\tbreak;\n\n\tcase GLSLstd450FindILsb:\n\t{\n\t\t// In this template version of findLSB, we return T.\n\t\tauto basetype = expression_type(args[0]).basetype;\n\t\temit_unary_func_op_cast(result_type, id, args[0], \"spvFindLSB\", basetype, basetype);\n\t\tbreak;\n\t}\n\n\tcase GLSLstd450FindSMsb:\n\t\temit_unary_func_op_cast(result_type, id, args[0], \"spvFindSMSB\", int_type, int_type);\n\t\tbreak;\n\n\tcase GLSLstd450FindUMsb:\n\t\temit_unary_func_op_cast(result_type, id, args[0], \"spvFindUMSB\", uint_type, uint_type);\n\t\tbreak;\n\n\tcase GLSLstd450PackSnorm4x8:\n\t\temit_unary_func_op(result_type, id, args[0], \"pack_float_to_snorm4x8\");\n\t\tbreak;\n\tcase GLSLstd450PackUnorm4x8:\n\t\temit_unary_func_op(result_type, id, args[0], \"pack_float_to_unorm4x8\");\n\t\tbreak;\n\tcase GLSLstd450PackSnorm2x16:\n\t\temit_unary_func_op(result_type, id, args[0], \"pack_float_to_snorm2x16\");\n\t\tbreak;\n\tcase GLSLstd450PackUnorm2x16:\n\t\temit_unary_func_op(result_type, id, args[0], \"pack_float_to_unorm2x16\");\n\t\tbreak;\n\n\tcase GLSLstd450PackHalf2x16:\n\t{\n\t\tauto expr = join(\"as_type<uint>(half2(\", to_expression(args[0]), \"))\");\n\t\temit_op(result_type, id, expr, should_forward(args[0]));\n\t\tinherit_expression_dependencies(id, args[0]);\n\t\tbreak;\n\t}\n\n\tcase GLSLstd450UnpackSnorm4x8:\n\t\temit_unary_func_op(result_type, id, args[0], \"unpack_snorm4x8_to_float\");\n\t\tbreak;\n\tcase GLSLstd450UnpackUnorm4x8:\n\t\temit_unary_func_op(result_type, id, args[0], \"unpack_unorm4x8_to_float\");\n\t\tbreak;\n\tcase GLSLstd450UnpackSnorm2x16:\n\t\temit_unary_func_op(result_type, id, args[0], \"unpack_snorm2x16_to_float\");\n\t\tbreak;\n\tcase GLSLstd450UnpackUnorm2x16:\n\t\temit_unary_func_op(result_type, id, args[0], \"unpack_unorm2x16_to_float\");\n\t\tbreak;\n\n\tcase GLSLstd450UnpackHalf2x16:\n\t{\n\t\tauto expr = join(\"float2(as_type<half2>(\", to_expression(args[0]), \"))\");\n\t\temit_op(result_type, id, expr, should_forward(args[0]));\n\t\tinherit_expression_dependencies(id, args[0]);\n\t\tbreak;\n\t}\n\n\tcase GLSLstd450PackDouble2x32:\n\t\temit_unary_func_op(result_type, id, args[0], \"unsupported_GLSLstd450PackDouble2x32\"); // Currently unsupported\n\t\tbreak;\n\tcase GLSLstd450UnpackDouble2x32:\n\t\temit_unary_func_op(result_type, id, args[0], \"unsupported_GLSLstd450UnpackDouble2x32\"); // Currently unsupported\n\t\tbreak;\n\n\tcase GLSLstd450MatrixInverse:\n\t{\n\t\tauto &mat_type = get<SPIRType>(result_type);\n\t\tswitch (mat_type.columns)\n\t\t{\n\t\tcase 2:\n\t\t\temit_unary_func_op(result_type, id, args[0], \"spvInverse2x2\");\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\temit_unary_func_op(result_type, id, args[0], \"spvInverse3x3\");\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\temit_unary_func_op(result_type, id, args[0], \"spvInverse4x4\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase GLSLstd450FMin:\n\t\t// If the result type isn't float, don't bother calling the specific\n\t\t// precise::/fast:: version. Metal doesn't have those for half and\n\t\t// double types.\n\t\tif (get<SPIRType>(result_type).basetype != SPIRType::Float)\n\t\t\temit_binary_func_op(result_type, id, args[0], args[1], \"min\");\n\t\telse\n\t\t\temit_binary_func_op(result_type, id, args[0], args[1], \"fast::min\");\n\t\tbreak;\n\n\tcase GLSLstd450FMax:\n\t\tif (get<SPIRType>(result_type).basetype != SPIRType::Float)\n\t\t\temit_binary_func_op(result_type, id, args[0], args[1], \"max\");\n\t\telse\n\t\t\temit_binary_func_op(result_type, id, args[0], args[1], \"fast::max\");\n\t\tbreak;\n\n\tcase GLSLstd450FClamp:\n\t\t// TODO: If args[1] is 0 and args[2] is 1, emit a saturate() call.\n\t\tif (get<SPIRType>(result_type).basetype != SPIRType::Float)\n\t\t\temit_trinary_func_op(result_type, id, args[0], args[1], args[2], \"clamp\");\n\t\telse\n\t\t\temit_trinary_func_op(result_type, id, args[0], args[1], args[2], \"fast::clamp\");\n\t\tbreak;\n\n\tcase GLSLstd450NMin:\n\t\tif (get<SPIRType>(result_type).basetype != SPIRType::Float)\n\t\t\temit_binary_func_op(result_type, id, args[0], args[1], \"min\");\n\t\telse\n\t\t\temit_binary_func_op(result_type, id, args[0], args[1], \"precise::min\");\n\t\tbreak;\n\n\tcase GLSLstd450NMax:\n\t\tif (get<SPIRType>(result_type).basetype != SPIRType::Float)\n\t\t\temit_binary_func_op(result_type, id, args[0], args[1], \"max\");\n\t\telse\n\t\t\temit_binary_func_op(result_type, id, args[0], args[1], \"precise::max\");\n\t\tbreak;\n\n\tcase GLSLstd450NClamp:\n\t\t// TODO: If args[1] is 0 and args[2] is 1, emit a saturate() call.\n\t\tif (get<SPIRType>(result_type).basetype != SPIRType::Float)\n\t\t\temit_trinary_func_op(result_type, id, args[0], args[1], args[2], \"clamp\");\n\t\telse\n\t\t\temit_trinary_func_op(result_type, id, args[0], args[1], args[2], \"precise::clamp\");\n\t\tbreak;\n\n\tcase GLSLstd450InterpolateAtCentroid:\n\t{\n\t\t// We can't just emit the expression normally, because the qualified name contains a call to the default\n\t\t// interpolate method, or refers to a local variable. We saved the interface index we need; use it to construct\n\t\t// the base for the method call.\n\t\tuint32_t interface_index = get_extended_decoration(args[0], SPIRVCrossDecorationInterfaceMemberIndex);\n\t\tstring component;\n\t\tif (has_extended_decoration(args[0], SPIRVCrossDecorationInterpolantComponentExpr))\n\t\t{\n\t\t\tuint32_t index_expr = get_extended_decoration(args[0], SPIRVCrossDecorationInterpolantComponentExpr);\n\t\t\tauto *c = maybe_get<SPIRConstant>(index_expr);\n\t\t\tif (!c || c->specialization)\n\t\t\t\tcomponent = join(\"[\", to_expression(index_expr), \"]\");\n\t\t\telse\n\t\t\t\tcomponent = join(\".\", index_to_swizzle(c->scalar()));\n\t\t}\n\t\temit_op(result_type, id,\n\t\t        join(to_name(stage_in_var_id), \".\", to_member_name(get_stage_in_struct_type(), interface_index),\n\t\t             \".interpolate_at_centroid()\", component),\n\t\t        should_forward(args[0]));\n\t\tbreak;\n\t}\n\n\tcase GLSLstd450InterpolateAtSample:\n\t{\n\t\tuint32_t interface_index = get_extended_decoration(args[0], SPIRVCrossDecorationInterfaceMemberIndex);\n\t\tstring component;\n\t\tif (has_extended_decoration(args[0], SPIRVCrossDecorationInterpolantComponentExpr))\n\t\t{\n\t\t\tuint32_t index_expr = get_extended_decoration(args[0], SPIRVCrossDecorationInterpolantComponentExpr);\n\t\t\tauto *c = maybe_get<SPIRConstant>(index_expr);\n\t\t\tif (!c || c->specialization)\n\t\t\t\tcomponent = join(\"[\", to_expression(index_expr), \"]\");\n\t\t\telse\n\t\t\t\tcomponent = join(\".\", index_to_swizzle(c->scalar()));\n\t\t}\n\t\temit_op(result_type, id,\n\t\t        join(to_name(stage_in_var_id), \".\", to_member_name(get_stage_in_struct_type(), interface_index),\n\t\t             \".interpolate_at_sample(\", to_expression(args[1]), \")\", component),\n\t\t        should_forward(args[0]) && should_forward(args[1]));\n\t\tbreak;\n\t}\n\n\tcase GLSLstd450InterpolateAtOffset:\n\t{\n\t\tuint32_t interface_index = get_extended_decoration(args[0], SPIRVCrossDecorationInterfaceMemberIndex);\n\t\tstring component;\n\t\tif (has_extended_decoration(args[0], SPIRVCrossDecorationInterpolantComponentExpr))\n\t\t{\n\t\t\tuint32_t index_expr = get_extended_decoration(args[0], SPIRVCrossDecorationInterpolantComponentExpr);\n\t\t\tauto *c = maybe_get<SPIRConstant>(index_expr);\n\t\t\tif (!c || c->specialization)\n\t\t\t\tcomponent = join(\"[\", to_expression(index_expr), \"]\");\n\t\t\telse\n\t\t\t\tcomponent = join(\".\", index_to_swizzle(c->scalar()));\n\t\t}\n\t\t// Like Direct3D, Metal puts the (0, 0) at the upper-left corner, not the center as SPIR-V and GLSL do.\n\t\t// Offset the offset by (1/2 - 1/16), or 0.4375, to compensate for this.\n\t\t// It has to be (1/2 - 1/16) and not 1/2, or several CTS tests subtly break on Intel.\n\t\temit_op(result_type, id,\n\t\t        join(to_name(stage_in_var_id), \".\", to_member_name(get_stage_in_struct_type(), interface_index),\n\t\t             \".interpolate_at_offset(\", to_expression(args[1]), \" + 0.4375)\", component),\n\t\t        should_forward(args[0]) && should_forward(args[1]));\n\t\tbreak;\n\t}\n\n\tcase GLSLstd450Distance:\n\t\t// MSL does not support scalar versions here.\n\t\tif (expression_type(args[0]).vecsize == 1)\n\t\t{\n\t\t\t// Equivalent to length(a - b) -> abs(a - b).\n\t\t\temit_op(result_type, id,\n\t\t\t        join(\"abs(\", to_enclosed_unpacked_expression(args[0]), \" - \",\n\t\t\t             to_enclosed_unpacked_expression(args[1]), \")\"),\n\t\t\t        should_forward(args[0]) && should_forward(args[1]));\n\t\t\tinherit_expression_dependencies(id, args[0]);\n\t\t\tinherit_expression_dependencies(id, args[1]);\n\t\t}\n\t\telse\n\t\t\tCompilerGLSL::emit_glsl_op(result_type, id, eop, args, count);\n\t\tbreak;\n\n\tcase GLSLstd450Length:\n\t\t// MSL does not support scalar versions, so use abs().\n\t\tif (expression_type(args[0]).vecsize == 1)\n\t\t\temit_unary_func_op(result_type, id, args[0], \"abs\");\n\t\telse\n\t\t\tCompilerGLSL::emit_glsl_op(result_type, id, eop, args, count);\n\t\tbreak;\n\n\tcase GLSLstd450Normalize:\n\t{\n\t\tauto &exp_type = expression_type(args[0]);\n\t\t// MSL does not support scalar versions here.\n\t\t// MSL has no implementation for normalize in the fast:: namespace for half2 and half3\n\t\t// Returns -1 or 1 for valid input, sign() does the job.\n\t\tif (exp_type.vecsize == 1)\n\t\t\temit_unary_func_op(result_type, id, args[0], \"sign\");\n\t\telse if (exp_type.vecsize <= 3 && exp_type.basetype == SPIRType::Half)\n\t\t\temit_unary_func_op(result_type, id, args[0], \"normalize\");\n\t\telse\n\t\t\temit_unary_func_op(result_type, id, args[0], \"fast::normalize\");\n\t\tbreak;\n\t}\n\tcase GLSLstd450Reflect:\n\t\tif (get<SPIRType>(result_type).vecsize == 1)\n\t\t\temit_binary_func_op(result_type, id, args[0], args[1], \"spvReflect\");\n\t\telse\n\t\t\tCompilerGLSL::emit_glsl_op(result_type, id, eop, args, count);\n\t\tbreak;\n\n\tcase GLSLstd450Refract:\n\t\tif (get<SPIRType>(result_type).vecsize == 1)\n\t\t\temit_trinary_func_op(result_type, id, args[0], args[1], args[2], \"spvRefract\");\n\t\telse\n\t\t\tCompilerGLSL::emit_glsl_op(result_type, id, eop, args, count);\n\t\tbreak;\n\n\tcase GLSLstd450FaceForward:\n\t\tif (get<SPIRType>(result_type).vecsize == 1)\n\t\t\temit_trinary_func_op(result_type, id, args[0], args[1], args[2], \"spvFaceForward\");\n\t\telse\n\t\t\tCompilerGLSL::emit_glsl_op(result_type, id, eop, args, count);\n\t\tbreak;\n\n\tcase GLSLstd450Modf:\n\tcase GLSLstd450Frexp:\n\t{\n\t\t// Special case. If the variable is a scalar access chain, we cannot use it directly. We have to emit a temporary.\n\t\t// Another special case is if the variable is in a storage class which is not thread.\n\t\tauto *ptr = maybe_get<SPIRExpression>(args[1]);\n\t\tauto &type = expression_type(args[1]);\n\n\t\tbool is_thread_storage = storage_class_array_is_thread(type.storage);\n\t\tif (type.storage == StorageClassOutput && capture_output_to_buffer)\n\t\t\tis_thread_storage = false;\n\n\t\tif (!is_thread_storage ||\n\t\t    (ptr && ptr->access_chain && is_scalar(expression_type(args[1]))))\n\t\t{\n\t\t\tregister_call_out_argument(args[1]);\n\t\t\tforced_temporaries.insert(id);\n\n\t\t\t// Need to create temporaries and copy over to access chain after.\n\t\t\t// We cannot directly take the reference of a vector swizzle in MSL, even if it's scalar ...\n\t\t\tuint32_t &tmp_id = extra_sub_expressions[id];\n\t\t\tif (!tmp_id)\n\t\t\t\ttmp_id = ir.increase_bound_by(1);\n\n\t\t\tuint32_t tmp_type_id = get_pointee_type_id(expression_type_id(args[1]));\n\t\t\temit_uninitialized_temporary_expression(tmp_type_id, tmp_id);\n\t\t\temit_binary_func_op(result_type, id, args[0], tmp_id, eop == GLSLstd450Modf ? \"modf\" : \"frexp\");\n\t\t\tstatement(to_expression(args[1]), \" = \", to_expression(tmp_id), \";\");\n\t\t}\n\t\telse\n\t\t\tCompilerGLSL::emit_glsl_op(result_type, id, eop, args, count);\n\t\tbreak;\n\t}\n\n\tcase GLSLstd450Pow:\n\t\t// powr makes x < 0.0 undefined, just like SPIR-V.\n\t\temit_binary_func_op(result_type, id, args[0], args[1], \"powr\");\n\t\tbreak;\n\n\tdefault:\n\t\tCompilerGLSL::emit_glsl_op(result_type, id, eop, args, count);\n\t\tbreak;\n\t}\n}\n\nvoid CompilerMSL::emit_spv_amd_shader_trinary_minmax_op(uint32_t result_type, uint32_t id, uint32_t eop,\n                                                        const uint32_t *args, uint32_t count)\n{\n\tenum AMDShaderTrinaryMinMax\n\t{\n\t\tFMin3AMD = 1,\n\t\tUMin3AMD = 2,\n\t\tSMin3AMD = 3,\n\t\tFMax3AMD = 4,\n\t\tUMax3AMD = 5,\n\t\tSMax3AMD = 6,\n\t\tFMid3AMD = 7,\n\t\tUMid3AMD = 8,\n\t\tSMid3AMD = 9\n\t};\n\n\tif (!msl_options.supports_msl_version(2, 1))\n\t\tSPIRV_CROSS_THROW(\"Trinary min/max functions require MSL 2.1.\");\n\n\tauto op = static_cast<AMDShaderTrinaryMinMax>(eop);\n\n\tswitch (op)\n\t{\n\tcase FMid3AMD:\n\tcase UMid3AMD:\n\tcase SMid3AMD:\n\t\temit_trinary_func_op(result_type, id, args[0], args[1], args[2], \"median3\");\n\t\tbreak;\n\tdefault:\n\t\tCompilerGLSL::emit_spv_amd_shader_trinary_minmax_op(result_type, id, eop, args, count);\n\t\tbreak;\n\t}\n}\n\n// Emit a structure declaration for the specified interface variable.\nvoid CompilerMSL::emit_interface_block(uint32_t ib_var_id)\n{\n\tif (ib_var_id)\n\t{\n\t\tauto &ib_var = get<SPIRVariable>(ib_var_id);\n\t\tauto &ib_type = get_variable_data_type(ib_var);\n\t\t//assert(ib_type.basetype == SPIRType::Struct && !ib_type.member_types.empty());\n\t\tassert(ib_type.basetype == SPIRType::Struct);\n\t\temit_struct(ib_type);\n\t}\n}\n\n// Emits the declaration signature of the specified function.\n// If this is the entry point function, Metal-specific return value and function arguments are added.\nvoid CompilerMSL::emit_function_prototype(SPIRFunction &func, const Bitset &)\n{\n\tif (func.self != ir.default_entry_point)\n\t\tadd_function_overload(func);\n\n\tlocal_variable_names = resource_names;\n\tstring decl;\n\n\tprocessing_entry_point = func.self == ir.default_entry_point;\n\n\t// Metal helper functions must be static force-inline otherwise they will cause problems when linked together in a single Metallib.\n\tif (!processing_entry_point)\n\t\tstatement(force_inline);\n\n\tauto &type = get<SPIRType>(func.return_type);\n\n\tif (!type.array.empty() && msl_options.force_native_arrays)\n\t{\n\t\t// We cannot return native arrays in MSL, so \"return\" through an out variable.\n\t\tdecl += \"void\";\n\t}\n\telse\n\t{\n\t\tdecl += func_type_decl(type);\n\t}\n\n\tdecl += \" \";\n\tdecl += to_name(func.self);\n\tdecl += \"(\";\n\n\tif (!type.array.empty() && msl_options.force_native_arrays)\n\t{\n\t\t// Fake arrays returns by writing to an out array instead.\n\t\tdecl += \"thread \";\n\t\tdecl += type_to_glsl(type);\n\t\tdecl += \" (&spvReturnValue)\";\n\t\tdecl += type_to_array_glsl(type);\n\t\tif (!func.arguments.empty())\n\t\t\tdecl += \", \";\n\t}\n\n\tif (processing_entry_point)\n\t{\n\t\tif (msl_options.argument_buffers)\n\t\t\tdecl += entry_point_args_argument_buffer(!func.arguments.empty());\n\t\telse\n\t\t\tdecl += entry_point_args_classic(!func.arguments.empty());\n\n\t\t// append entry point args to avoid conflicts in local variable names.\n\t\tlocal_variable_names.insert(resource_names.begin(), resource_names.end());\n\n\t\t// If entry point function has variables that require early declaration,\n\t\t// ensure they each have an empty initializer, creating one if needed.\n\t\t// This is done at this late stage because the initialization expression\n\t\t// is cleared after each compilation pass.\n\t\tfor (auto var_id : vars_needing_early_declaration)\n\t\t{\n\t\t\tauto &ed_var = get<SPIRVariable>(var_id);\n\t\t\tID &initializer = ed_var.initializer;\n\t\t\tif (!initializer)\n\t\t\t\tinitializer = ir.increase_bound_by(1);\n\n\t\t\t// Do not override proper initializers.\n\t\t\tif (ir.ids[initializer].get_type() == TypeNone || ir.ids[initializer].get_type() == TypeExpression)\n\t\t\t\tset<SPIRExpression>(ed_var.initializer, \"{}\", ed_var.basetype, true);\n\t\t}\n\t}\n\n\tfor (auto &arg : func.arguments)\n\t{\n\t\tuint32_t name_id = arg.id;\n\n\t\tauto *var = maybe_get<SPIRVariable>(arg.id);\n\t\tif (var)\n\t\t{\n\t\t\t// If we need to modify the name of the variable, make sure we modify the original variable.\n\t\t\t// Our alias is just a shadow variable.\n\t\t\tif (arg.alias_global_variable && var->basevariable)\n\t\t\t\tname_id = var->basevariable;\n\n\t\t\tvar->parameter = &arg; // Hold a pointer to the parameter so we can invalidate the readonly field if needed.\n\t\t}\n\n\t\tadd_local_variable_name(name_id);\n\n\t\tdecl += argument_decl(arg);\n\n\t\tbool is_dynamic_img_sampler = has_extended_decoration(arg.id, SPIRVCrossDecorationDynamicImageSampler);\n\n\t\tauto &arg_type = get<SPIRType>(arg.type);\n\t\tif (arg_type.basetype == SPIRType::SampledImage && !is_dynamic_img_sampler)\n\t\t{\n\t\t\t// Manufacture automatic plane args for multiplanar texture\n\t\t\tuint32_t planes = 1;\n\t\t\tif (auto *constexpr_sampler = find_constexpr_sampler(name_id))\n\t\t\t\tif (constexpr_sampler->ycbcr_conversion_enable)\n\t\t\t\t\tplanes = constexpr_sampler->planes;\n\t\t\tfor (uint32_t i = 1; i < planes; i++)\n\t\t\t\tdecl += join(\", \", argument_decl(arg), plane_name_suffix, i);\n\n\t\t\t// Manufacture automatic sampler arg for SampledImage texture\n\t\t\tif (arg_type.image.dim != DimBuffer)\n\t\t\t{\n\t\t\t\tif (arg_type.array.empty() || (var ? is_var_runtime_size_array(*var) : is_runtime_size_array(arg_type)))\n\t\t\t\t{\n\t\t\t\t\tdecl += join(\", \", sampler_type(arg_type, arg.id), \" \", to_sampler_expression(name_id));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconst char *sampler_address_space =\n\t\t\t\t\t\t\tdescriptor_address_space(name_id,\n\t\t\t\t\t\t\t                         StorageClassUniformConstant,\n\t\t\t\t\t\t\t                         \"thread const\");\n\t\t\t\t\tdecl += join(\", \", sampler_address_space, \" \", sampler_type(arg_type, name_id), \"& \",\n\t\t\t\t\t             to_sampler_expression(name_id));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Manufacture automatic swizzle arg.\n\t\tif (msl_options.swizzle_texture_samples && has_sampled_images && is_sampled_image_type(arg_type) &&\n\t\t    !is_dynamic_img_sampler)\n\t\t{\n\t\t\tbool arg_is_array = !arg_type.array.empty();\n\t\t\tdecl += join(\", constant uint\", arg_is_array ? \"* \" : \"& \", to_swizzle_expression(name_id));\n\t\t}\n\n\t\tif (buffer_requires_array_length(name_id))\n\t\t{\n\t\t\tbool arg_is_array = !arg_type.array.empty();\n\t\t\tdecl += join(\", constant uint\", arg_is_array ? \"* \" : \"& \", to_buffer_size_expression(name_id));\n\t\t}\n\n\t\tif (&arg != &func.arguments.back())\n\t\t\tdecl += \", \";\n\t}\n\n\tdecl += \")\";\n\tstatement(decl);\n}\n\nstatic bool needs_chroma_reconstruction(const MSLConstexprSampler *constexpr_sampler)\n{\n\t// For now, only multiplanar images need explicit reconstruction. GBGR and BGRG images\n\t// use implicit reconstruction.\n\treturn constexpr_sampler && constexpr_sampler->ycbcr_conversion_enable && constexpr_sampler->planes > 1;\n}\n\n// Returns the texture sampling function string for the specified image and sampling characteristics.\nstring CompilerMSL::to_function_name(const TextureFunctionNameArguments &args)\n{\n\tVariableID img = args.base.img;\n\tconst MSLConstexprSampler *constexpr_sampler = nullptr;\n\tbool is_dynamic_img_sampler = false;\n\tif (auto *var = maybe_get_backing_variable(img))\n\t{\n\t\tconstexpr_sampler = find_constexpr_sampler(var->basevariable ? var->basevariable : VariableID(var->self));\n\t\tis_dynamic_img_sampler = has_extended_decoration(var->self, SPIRVCrossDecorationDynamicImageSampler);\n\t}\n\n\t// Special-case gather. We have to alter the component being looked up\n\t// in the swizzle case.\n\tif (msl_options.swizzle_texture_samples && args.base.is_gather && !is_dynamic_img_sampler &&\n\t    (!constexpr_sampler || !constexpr_sampler->ycbcr_conversion_enable))\n\t{\n\t\tbool is_compare = comparison_ids.count(img);\n\t\tadd_spv_func_and_recompile(is_compare ? SPVFuncImplGatherCompareSwizzle : SPVFuncImplGatherSwizzle);\n\t\treturn is_compare ? \"spvGatherCompareSwizzle\" : \"spvGatherSwizzle\";\n\t}\n\n\tauto *combined = maybe_get<SPIRCombinedImageSampler>(img);\n\n\t// Texture reference\n\tstring fname;\n\tif (needs_chroma_reconstruction(constexpr_sampler) && !is_dynamic_img_sampler)\n\t{\n\t\tif (constexpr_sampler->planes != 2 && constexpr_sampler->planes != 3)\n\t\t\tSPIRV_CROSS_THROW(\"Unhandled number of color image planes!\");\n\t\t// 444 images aren't downsampled, so we don't need to do linear filtering.\n\t\tif (constexpr_sampler->resolution == MSL_FORMAT_RESOLUTION_444 ||\n\t\t    constexpr_sampler->chroma_filter == MSL_SAMPLER_FILTER_NEAREST)\n\t\t{\n\t\t\tif (constexpr_sampler->planes == 2)\n\t\t\t\tadd_spv_func_and_recompile(SPVFuncImplChromaReconstructNearest2Plane);\n\t\t\telse\n\t\t\t\tadd_spv_func_and_recompile(SPVFuncImplChromaReconstructNearest3Plane);\n\t\t\tfname = \"spvChromaReconstructNearest\";\n\t\t}\n\t\telse // Linear with a downsampled format\n\t\t{\n\t\t\tfname = \"spvChromaReconstructLinear\";\n\t\t\tswitch (constexpr_sampler->resolution)\n\t\t\t{\n\t\t\tcase MSL_FORMAT_RESOLUTION_444:\n\t\t\t\tassert(false);\n\t\t\t\tbreak; // not reached\n\t\t\tcase MSL_FORMAT_RESOLUTION_422:\n\t\t\t\tswitch (constexpr_sampler->x_chroma_offset)\n\t\t\t\t{\n\t\t\t\tcase MSL_CHROMA_LOCATION_COSITED_EVEN:\n\t\t\t\t\tif (constexpr_sampler->planes == 2)\n\t\t\t\t\t\tadd_spv_func_and_recompile(SPVFuncImplChromaReconstructLinear422CositedEven2Plane);\n\t\t\t\t\telse\n\t\t\t\t\t\tadd_spv_func_and_recompile(SPVFuncImplChromaReconstructLinear422CositedEven3Plane);\n\t\t\t\t\tfname += \"422CositedEven\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase MSL_CHROMA_LOCATION_MIDPOINT:\n\t\t\t\t\tif (constexpr_sampler->planes == 2)\n\t\t\t\t\t\tadd_spv_func_and_recompile(SPVFuncImplChromaReconstructLinear422Midpoint2Plane);\n\t\t\t\t\telse\n\t\t\t\t\t\tadd_spv_func_and_recompile(SPVFuncImplChromaReconstructLinear422Midpoint3Plane);\n\t\t\t\t\tfname += \"422Midpoint\";\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Invalid chroma location.\");\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase MSL_FORMAT_RESOLUTION_420:\n\t\t\t\tfname += \"420\";\n\t\t\t\tswitch (constexpr_sampler->x_chroma_offset)\n\t\t\t\t{\n\t\t\t\tcase MSL_CHROMA_LOCATION_COSITED_EVEN:\n\t\t\t\t\tswitch (constexpr_sampler->y_chroma_offset)\n\t\t\t\t\t{\n\t\t\t\t\tcase MSL_CHROMA_LOCATION_COSITED_EVEN:\n\t\t\t\t\t\tif (constexpr_sampler->planes == 2)\n\t\t\t\t\t\t\tadd_spv_func_and_recompile(\n\t\t\t\t\t\t\t    SPVFuncImplChromaReconstructLinear420XCositedEvenYCositedEven2Plane);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tadd_spv_func_and_recompile(\n\t\t\t\t\t\t\t    SPVFuncImplChromaReconstructLinear420XCositedEvenYCositedEven3Plane);\n\t\t\t\t\t\tfname += \"XCositedEvenYCositedEven\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase MSL_CHROMA_LOCATION_MIDPOINT:\n\t\t\t\t\t\tif (constexpr_sampler->planes == 2)\n\t\t\t\t\t\t\tadd_spv_func_and_recompile(\n\t\t\t\t\t\t\t    SPVFuncImplChromaReconstructLinear420XCositedEvenYMidpoint2Plane);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tadd_spv_func_and_recompile(\n\t\t\t\t\t\t\t    SPVFuncImplChromaReconstructLinear420XCositedEvenYMidpoint3Plane);\n\t\t\t\t\t\tfname += \"XCositedEvenYMidpoint\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tSPIRV_CROSS_THROW(\"Invalid Y chroma location.\");\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase MSL_CHROMA_LOCATION_MIDPOINT:\n\t\t\t\t\tswitch (constexpr_sampler->y_chroma_offset)\n\t\t\t\t\t{\n\t\t\t\t\tcase MSL_CHROMA_LOCATION_COSITED_EVEN:\n\t\t\t\t\t\tif (constexpr_sampler->planes == 2)\n\t\t\t\t\t\t\tadd_spv_func_and_recompile(\n\t\t\t\t\t\t\t    SPVFuncImplChromaReconstructLinear420XMidpointYCositedEven2Plane);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tadd_spv_func_and_recompile(\n\t\t\t\t\t\t\t    SPVFuncImplChromaReconstructLinear420XMidpointYCositedEven3Plane);\n\t\t\t\t\t\tfname += \"XMidpointYCositedEven\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase MSL_CHROMA_LOCATION_MIDPOINT:\n\t\t\t\t\t\tif (constexpr_sampler->planes == 2)\n\t\t\t\t\t\t\tadd_spv_func_and_recompile(SPVFuncImplChromaReconstructLinear420XMidpointYMidpoint2Plane);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tadd_spv_func_and_recompile(SPVFuncImplChromaReconstructLinear420XMidpointYMidpoint3Plane);\n\t\t\t\t\t\tfname += \"XMidpointYMidpoint\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tSPIRV_CROSS_THROW(\"Invalid Y chroma location.\");\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Invalid X chroma location.\");\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tSPIRV_CROSS_THROW(\"Invalid format resolution.\");\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tfname = to_expression(combined ? combined->image : img) + \".\";\n\n\t\t// Texture function and sampler\n\t\tif (args.base.is_fetch)\n\t\t\tfname += \"read\";\n\t\telse if (args.base.is_gather)\n\t\t\tfname += \"gather\";\n\t\telse\n\t\t\tfname += \"sample\";\n\n\t\tif (args.has_dref)\n\t\t\tfname += \"_compare\";\n\t}\n\n\treturn fname;\n}\n\nstring CompilerMSL::convert_to_f32(const string &expr, uint32_t components)\n{\n\tSPIRType t { components > 1 ? OpTypeVector : OpTypeFloat };\n\tt.basetype = SPIRType::Float;\n\tt.vecsize = components;\n\tt.columns = 1;\n\treturn join(type_to_glsl_constructor(t), \"(\", expr, \")\");\n}\n\nstatic inline bool sampling_type_needs_f32_conversion(const SPIRType &type)\n{\n\t// Double is not supported to begin with, but doesn't hurt to check for completion.\n\treturn type.basetype == SPIRType::Half || type.basetype == SPIRType::Double;\n}\n\n// Returns the function args for a texture sampling function for the specified image and sampling characteristics.\nstring CompilerMSL::to_function_args(const TextureFunctionArguments &args, bool *p_forward)\n{\n\tVariableID img = args.base.img;\n\tauto &imgtype = *args.base.imgtype;\n\tuint32_t lod = args.lod;\n\tuint32_t grad_x = args.grad_x;\n\tuint32_t grad_y = args.grad_y;\n\tuint32_t bias = args.bias;\n\n\tconst MSLConstexprSampler *constexpr_sampler = nullptr;\n\tbool is_dynamic_img_sampler = false;\n\tif (auto *var = maybe_get_backing_variable(img))\n\t{\n\t\tconstexpr_sampler = find_constexpr_sampler(var->basevariable ? var->basevariable : VariableID(var->self));\n\t\tis_dynamic_img_sampler = has_extended_decoration(var->self, SPIRVCrossDecorationDynamicImageSampler);\n\t}\n\n\tstring farg_str;\n\tbool forward = true;\n\n\tif (!is_dynamic_img_sampler)\n\t{\n\t\t// Texture reference (for some cases)\n\t\tif (needs_chroma_reconstruction(constexpr_sampler))\n\t\t{\n\t\t\t// Multiplanar images need two or three textures.\n\t\t\tfarg_str += to_expression(img);\n\t\t\tfor (uint32_t i = 1; i < constexpr_sampler->planes; i++)\n\t\t\t\tfarg_str += join(\", \", to_expression(img), plane_name_suffix, i);\n\t\t}\n\t\telse if ((!constexpr_sampler || !constexpr_sampler->ycbcr_conversion_enable) &&\n\t\t         msl_options.swizzle_texture_samples && args.base.is_gather)\n\t\t{\n\t\t\tauto *combined = maybe_get<SPIRCombinedImageSampler>(img);\n\t\t\tfarg_str += to_expression(combined ? combined->image : img);\n\t\t}\n\n\t\t// Sampler reference\n\t\tif (!args.base.is_fetch)\n\t\t{\n\t\t\tif (!farg_str.empty())\n\t\t\t\tfarg_str += \", \";\n\t\t\tfarg_str += to_sampler_expression(img);\n\t\t}\n\n\t\tif ((!constexpr_sampler || !constexpr_sampler->ycbcr_conversion_enable) &&\n\t\t    msl_options.swizzle_texture_samples && args.base.is_gather)\n\t\t{\n\t\t\t// Add the swizzle constant from the swizzle buffer.\n\t\t\tfarg_str += \", \" + to_swizzle_expression(img);\n\t\t\tused_swizzle_buffer = true;\n\t\t}\n\n\t\t// Swizzled gather puts the component before the other args, to allow template\n\t\t// deduction to work.\n\t\tif (args.component && msl_options.swizzle_texture_samples)\n\t\t{\n\t\t\tforward = should_forward(args.component);\n\t\t\tfarg_str += \", \" + to_component_argument(args.component);\n\t\t}\n\t}\n\n\t// Texture coordinates\n\tforward = forward && should_forward(args.coord);\n\tauto coord_expr = to_enclosed_expression(args.coord);\n\tauto &coord_type = expression_type(args.coord);\n\tbool coord_is_fp = type_is_floating_point(coord_type);\n\tbool is_cube_fetch = false;\n\n\tstring tex_coords = coord_expr;\n\tuint32_t alt_coord_component = 0;\n\n\tswitch (imgtype.image.dim)\n\t{\n\n\tcase Dim1D:\n\t\tif (coord_type.vecsize > 1)\n\t\t\ttex_coords = enclose_expression(tex_coords) + \".x\";\n\n\t\tif (args.base.is_fetch)\n\t\t\ttex_coords = \"uint(\" + round_fp_tex_coords(tex_coords, coord_is_fp) + \")\";\n\t\telse if (sampling_type_needs_f32_conversion(coord_type))\n\t\t\ttex_coords = convert_to_f32(tex_coords, 1);\n\n\t\tif (msl_options.texture_1D_as_2D)\n\t\t{\n\t\t\tif (args.base.is_fetch)\n\t\t\t\ttex_coords = \"uint2(\" + tex_coords + \", 0)\";\n\t\t\telse\n\t\t\t\ttex_coords = \"float2(\" + tex_coords + \", 0.5)\";\n\t\t}\n\n\t\talt_coord_component = 1;\n\t\tbreak;\n\n\tcase DimBuffer:\n\t\tif (coord_type.vecsize > 1)\n\t\t\ttex_coords = enclose_expression(tex_coords) + \".x\";\n\n\t\tif (msl_options.texture_buffer_native)\n\t\t{\n\t\t\ttex_coords = \"uint(\" + round_fp_tex_coords(tex_coords, coord_is_fp) + \")\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Metal texel buffer textures are 2D, so convert 1D coord to 2D.\n\t\t\t// Support for Metal 2.1's new texture_buffer type.\n\t\t\tif (args.base.is_fetch)\n\t\t\t{\n\t\t\t\tif (msl_options.texel_buffer_texture_width > 0)\n\t\t\t\t{\n\t\t\t\t\ttex_coords = \"spvTexelBufferCoord(\" + round_fp_tex_coords(tex_coords, coord_is_fp) + \")\";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttex_coords = \"spvTexelBufferCoord(\" + round_fp_tex_coords(tex_coords, coord_is_fp) + \", \" +\n\t\t\t\t\t             to_expression(img) + \")\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\talt_coord_component = 1;\n\t\tbreak;\n\n\tcase DimSubpassData:\n\t\t// If we're using Metal's native frame-buffer fetch API for subpass inputs,\n\t\t// this path will not be hit.\n\t\ttex_coords = \"uint2(gl_FragCoord.xy)\";\n\t\talt_coord_component = 2;\n\t\tbreak;\n\n\tcase Dim2D:\n\t\tif (coord_type.vecsize > 2)\n\t\t\ttex_coords = enclose_expression(tex_coords) + \".xy\";\n\n\t\tif (args.base.is_fetch)\n\t\t\ttex_coords = \"uint2(\" + round_fp_tex_coords(tex_coords, coord_is_fp) + \")\";\n\t\telse if (sampling_type_needs_f32_conversion(coord_type))\n\t\t\ttex_coords = convert_to_f32(tex_coords, 2);\n\n\t\talt_coord_component = 2;\n\t\tbreak;\n\n\tcase Dim3D:\n\t\tif (coord_type.vecsize > 3)\n\t\t\ttex_coords = enclose_expression(tex_coords) + \".xyz\";\n\n\t\tif (args.base.is_fetch)\n\t\t\ttex_coords = \"uint3(\" + round_fp_tex_coords(tex_coords, coord_is_fp) + \")\";\n\t\telse if (sampling_type_needs_f32_conversion(coord_type))\n\t\t\ttex_coords = convert_to_f32(tex_coords, 3);\n\n\t\talt_coord_component = 3;\n\t\tbreak;\n\n\tcase DimCube:\n\t\tif (args.base.is_fetch)\n\t\t{\n\t\t\tis_cube_fetch = true;\n\t\t\ttex_coords += \".xy\";\n\t\t\ttex_coords = \"uint2(\" + round_fp_tex_coords(tex_coords, coord_is_fp) + \")\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (coord_type.vecsize > 3)\n\t\t\t\ttex_coords = enclose_expression(tex_coords) + \".xyz\";\n\t\t}\n\n\t\tif (sampling_type_needs_f32_conversion(coord_type))\n\t\t\ttex_coords = convert_to_f32(tex_coords, 3);\n\n\t\talt_coord_component = 3;\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\tif (args.base.is_fetch && args.offset)\n\t{\n\t\t// Fetch offsets must be applied directly to the coordinate.\n\t\tforward = forward && should_forward(args.offset);\n\t\tauto &type = expression_type(args.offset);\n\t\tif (imgtype.image.dim == Dim1D && msl_options.texture_1D_as_2D)\n\t\t{\n\t\t\tif (type.basetype != SPIRType::UInt)\n\t\t\t\ttex_coords += join(\" + uint2(\", bitcast_expression(SPIRType::UInt, args.offset), \", 0)\");\n\t\t\telse\n\t\t\t\ttex_coords += join(\" + uint2(\", to_enclosed_expression(args.offset), \", 0)\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (type.basetype != SPIRType::UInt)\n\t\t\t\ttex_coords += \" + \" + bitcast_expression(SPIRType::UInt, args.offset);\n\t\t\telse\n\t\t\t\ttex_coords += \" + \" + to_enclosed_expression(args.offset);\n\t\t}\n\t}\n\n\t// If projection, use alt coord as divisor\n\tif (args.base.is_proj)\n\t{\n\t\tif (sampling_type_needs_f32_conversion(coord_type))\n\t\t\ttex_coords += \" / \" + convert_to_f32(to_extract_component_expression(args.coord, alt_coord_component), 1);\n\t\telse\n\t\t\ttex_coords += \" / \" + to_extract_component_expression(args.coord, alt_coord_component);\n\t}\n\n\tif (!farg_str.empty())\n\t\tfarg_str += \", \";\n\n\tif (imgtype.image.dim == DimCube && imgtype.image.arrayed && msl_options.emulate_cube_array)\n\t{\n\t\tfarg_str += \"spvCubemapTo2DArrayFace(\" + tex_coords + \").xy\";\n\n\t\tif (is_cube_fetch)\n\t\t\tfarg_str += \", uint(\" + to_extract_component_expression(args.coord, 2) + \")\";\n\t\telse\n\t\t\tfarg_str +=\n\t\t\t    \", uint(spvCubemapTo2DArrayFace(\" + tex_coords + \").z) + (uint(\" +\n\t\t\t    round_fp_tex_coords(to_extract_component_expression(args.coord, alt_coord_component), coord_is_fp) +\n\t\t\t    \") * 6u)\";\n\n\t\tadd_spv_func_and_recompile(SPVFuncImplCubemapTo2DArrayFace);\n\t}\n\telse\n\t{\n\t\tfarg_str += tex_coords;\n\n\t\t// If fetch from cube, add face explicitly\n\t\tif (is_cube_fetch)\n\t\t{\n\t\t\t// Special case for cube arrays, face and layer are packed in one dimension.\n\t\t\tif (imgtype.image.arrayed)\n\t\t\t\tfarg_str += \", uint(\" + to_extract_component_expression(args.coord, 2) + \") % 6u\";\n\t\t\telse\n\t\t\t\tfarg_str +=\n\t\t\t\t    \", uint(\" + round_fp_tex_coords(to_extract_component_expression(args.coord, 2), coord_is_fp) + \")\";\n\t\t}\n\n\t\t// If array, use alt coord\n\t\tif (imgtype.image.arrayed)\n\t\t{\n\t\t\t// Special case for cube arrays, face and layer are packed in one dimension.\n\t\t\tif (imgtype.image.dim == DimCube && args.base.is_fetch)\n\t\t\t{\n\t\t\t\tfarg_str += \", uint(\" + to_extract_component_expression(args.coord, 2) + \") / 6u\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfarg_str +=\n\t\t\t\t    \", uint(\" +\n\t\t\t\t    round_fp_tex_coords(to_extract_component_expression(args.coord, alt_coord_component), coord_is_fp) +\n\t\t\t\t    \")\";\n\t\t\t\tif (imgtype.image.dim == DimSubpassData)\n\t\t\t\t{\n\t\t\t\t\tif (msl_options.multiview)\n\t\t\t\t\t\tfarg_str += \" + gl_ViewIndex\";\n\t\t\t\t\telse if (msl_options.arrayed_subpass_input)\n\t\t\t\t\t\tfarg_str += \" + gl_Layer\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (imgtype.image.dim == DimSubpassData)\n\t\t{\n\t\t\tif (msl_options.multiview)\n\t\t\t\tfarg_str += \", gl_ViewIndex\";\n\t\t\telse if (msl_options.arrayed_subpass_input)\n\t\t\t\tfarg_str += \", gl_Layer\";\n\t\t}\n\t}\n\n\t// Depth compare reference value\n\tif (args.dref)\n\t{\n\t\tforward = forward && should_forward(args.dref);\n\t\tfarg_str += \", \";\n\n\t\tauto &dref_type = expression_type(args.dref);\n\n\t\tstring dref_expr;\n\t\tif (args.base.is_proj)\n\t\t\tdref_expr = join(to_enclosed_expression(args.dref), \" / \",\n\t\t\t                 to_extract_component_expression(args.coord, alt_coord_component));\n\t\telse\n\t\t\tdref_expr = to_expression(args.dref);\n\n\t\tif (sampling_type_needs_f32_conversion(dref_type))\n\t\t\tdref_expr = convert_to_f32(dref_expr, 1);\n\n\t\tfarg_str += dref_expr;\n\n\t\tif (msl_options.is_macos() && (grad_x || grad_y))\n\t\t{\n\t\t\t// For sample compare, MSL does not support gradient2d for all targets (only iOS apparently according to docs).\n\t\t\t// However, the most common case here is to have a constant gradient of 0, as that is the only way to express\n\t\t\t// LOD == 0 in GLSL with sampler2DArrayShadow (cascaded shadow mapping).\n\t\t\t// We will detect a compile-time constant 0 value for gradient and promote that to level(0) on MSL.\n\t\t\tbool constant_zero_x = !grad_x || expression_is_constant_null(grad_x);\n\t\t\tbool constant_zero_y = !grad_y || expression_is_constant_null(grad_y);\n\t\t\tif (constant_zero_x && constant_zero_y &&\n\t\t\t    (!imgtype.image.arrayed || !msl_options.sample_dref_lod_array_as_grad))\n\t\t\t{\n\t\t\t\tlod = 0;\n\t\t\t\tgrad_x = 0;\n\t\t\t\tgrad_y = 0;\n\t\t\t\tfarg_str += \", level(0)\";\n\t\t\t}\n\t\t\telse if (!msl_options.supports_msl_version(2, 3))\n\t\t\t{\n\t\t\t\tSPIRV_CROSS_THROW(\"Using non-constant 0.0 gradient() qualifier for sample_compare. This is not \"\n\t\t\t\t                  \"supported on macOS prior to MSL 2.3.\");\n\t\t\t}\n\t\t}\n\n\t\tif (msl_options.is_macos() && bias)\n\t\t{\n\t\t\t// Bias is not supported either on macOS with sample_compare.\n\t\t\t// Verify it is compile-time zero, and drop the argument.\n\t\t\tif (expression_is_constant_null(bias))\n\t\t\t{\n\t\t\t\tbias = 0;\n\t\t\t}\n\t\t\telse if (!msl_options.supports_msl_version(2, 3))\n\t\t\t{\n\t\t\t\tSPIRV_CROSS_THROW(\"Using non-constant 0.0 bias() qualifier for sample_compare. This is not supported \"\n\t\t\t\t                  \"on macOS prior to MSL 2.3.\");\n\t\t\t}\n\t\t}\n\t}\n\n\t// LOD Options\n\t// Metal does not support LOD for 1D textures.\n\tif (bias && (imgtype.image.dim != Dim1D || msl_options.texture_1D_as_2D))\n\t{\n\t\tforward = forward && should_forward(bias);\n\t\tfarg_str += \", bias(\" + to_expression(bias) + \")\";\n\t}\n\n\t// Metal does not support LOD for 1D textures.\n\tif (lod && (imgtype.image.dim != Dim1D || msl_options.texture_1D_as_2D))\n\t{\n\t\tforward = forward && should_forward(lod);\n\t\tif (args.base.is_fetch)\n\t\t{\n\t\t\tfarg_str += \", \" + to_expression(lod);\n\t\t}\n\t\telse if (msl_options.sample_dref_lod_array_as_grad && args.dref && imgtype.image.arrayed)\n\t\t{\n\t\t\tif (msl_options.is_macos() && !msl_options.supports_msl_version(2, 3))\n\t\t\t\tSPIRV_CROSS_THROW(\"Using non-constant 0.0 gradient() qualifier for sample_compare. This is not \"\n\t\t\t\t                  \"supported on macOS prior to MSL 2.3.\");\n\t\t\t// Some Metal devices have a bug where the LoD is erroneously biased upward\n\t\t\t// when using a level() argument. Since this doesn't happen as much with gradient2d(),\n\t\t\t// if we perform the LoD calculation in reverse, we can pass a gradient\n\t\t\t// instead.\n\t\t\t// lod = log2(rhoMax/eta) -> exp2(lod) = rhoMax/eta\n\t\t\t// If we make all of the scale factors the same, eta will be 1 and\n\t\t\t// exp2(lod) = rho.\n\t\t\t// rhoX = dP/dx * extent; rhoY = dP/dy * extent\n\t\t\t// Therefore, dP/dx = dP/dy = exp2(lod)/extent.\n\t\t\t// (Subtracting 0.5 before exponentiation gives better results.)\n\t\t\tstring grad_opt, extent, grad_coord;\n\t\t\tVariableID base_img = img;\n\t\t\tif (auto *combined = maybe_get<SPIRCombinedImageSampler>(img))\n\t\t\t\tbase_img = combined->image;\n\t\t\tswitch (imgtype.image.dim)\n\t\t\t{\n\t\t\tcase Dim1D:\n\t\t\t\tgrad_opt = \"gradient2d\";\n\t\t\t\textent = join(\"float2(\", to_expression(base_img), \".get_width(), 1.0)\");\n\t\t\t\tbreak;\n\t\t\tcase Dim2D:\n\t\t\t\tgrad_opt = \"gradient2d\";\n\t\t\t\textent = join(\"float2(\", to_expression(base_img), \".get_width(), \", to_expression(base_img), \".get_height())\");\n\t\t\t\tbreak;\n\t\t\tcase DimCube:\n\t\t\t\tif (imgtype.image.arrayed && msl_options.emulate_cube_array)\n\t\t\t\t{\n\t\t\t\t\tgrad_opt = \"gradient2d\";\n\t\t\t\t\textent = join(\"float2(\", to_expression(base_img), \".get_width())\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (msl_options.agx_manual_cube_grad_fixup)\n\t\t\t\t\t{\n\t\t\t\t\t\tadd_spv_func_and_recompile(SPVFuncImplGradientCube);\n\t\t\t\t\t\tgrad_opt = \"spvGradientCube\";\n\t\t\t\t\t\tgrad_coord = tex_coords + \", \";\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tgrad_opt = \"gradientcube\";\n\t\t\t\t\t}\n\t\t\t\t\textent = join(\"float3(\", to_expression(base_img), \".get_width())\");\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tgrad_opt = \"unsupported_gradient_dimension\";\n\t\t\t\textent = \"float3(1.0)\";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tfarg_str += join(\", \", grad_opt, \"(\", grad_coord, \"exp2(\", to_expression(lod), \" - 0.5) / \", extent,\n\t\t\t                 \", exp2(\", to_expression(lod), \" - 0.5) / \", extent, \")\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfarg_str += \", level(\" + to_expression(lod) + \")\";\n\t\t}\n\t}\n\telse if (args.base.is_fetch && !lod && (imgtype.image.dim != Dim1D || msl_options.texture_1D_as_2D) &&\n\t         imgtype.image.dim != DimBuffer && !imgtype.image.ms && imgtype.image.sampled != 2)\n\t{\n\t\t// Lod argument is optional in OpImageFetch, but we require a LOD value, pick 0 as the default.\n\t\t// Check for sampled type as well, because is_fetch is also used for OpImageRead in MSL.\n\t\tfarg_str += \", 0\";\n\t}\n\n\t// Metal does not support LOD for 1D textures.\n\tif ((grad_x || grad_y) && (imgtype.image.dim != Dim1D || msl_options.texture_1D_as_2D))\n\t{\n\t\tforward = forward && should_forward(grad_x);\n\t\tforward = forward && should_forward(grad_y);\n\t\tstring grad_opt, grad_coord;\n\t\tswitch (imgtype.image.dim)\n\t\t{\n\t\tcase Dim1D:\n\t\tcase Dim2D:\n\t\t\tgrad_opt = \"gradient2d\";\n\t\t\tbreak;\n\t\tcase Dim3D:\n\t\t\tgrad_opt = \"gradient3d\";\n\t\t\tbreak;\n\t\tcase DimCube:\n\t\t\tif (imgtype.image.arrayed && msl_options.emulate_cube_array)\n\t\t\t{\n\t\t\t\tgrad_opt = \"gradient2d\";\n\t\t\t}\n\t\t\telse if (msl_options.agx_manual_cube_grad_fixup)\n\t\t\t{\n\t\t\t\tadd_spv_func_and_recompile(SPVFuncImplGradientCube);\n\t\t\t\tgrad_opt = \"spvGradientCube\";\n\t\t\t\tgrad_coord = tex_coords + \", \";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tgrad_opt = \"gradientcube\";\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tgrad_opt = \"unsupported_gradient_dimension\";\n\t\t\tbreak;\n\t\t}\n\t\tfarg_str += join(\", \", grad_opt, \"(\", grad_coord, to_expression(grad_x), \", \", to_expression(grad_y), \")\");\n\t}\n\n\tif (args.min_lod)\n\t{\n\t\tif (!msl_options.supports_msl_version(2, 2))\n\t\t\tSPIRV_CROSS_THROW(\"min_lod_clamp() is only supported in MSL 2.2+ and up.\");\n\n\t\tforward = forward && should_forward(args.min_lod);\n\t\tfarg_str += \", min_lod_clamp(\" + to_expression(args.min_lod) + \")\";\n\t}\n\n\t// Add offsets\n\tstring offset_expr;\n\tconst SPIRType *offset_type = nullptr;\n\tif (args.offset && !args.base.is_fetch)\n\t{\n\t\tforward = forward && should_forward(args.offset);\n\t\toffset_expr = to_expression(args.offset);\n\t\toffset_type = &expression_type(args.offset);\n\t}\n\n\tif (!offset_expr.empty())\n\t{\n\t\tswitch (imgtype.image.dim)\n\t\t{\n\t\tcase Dim1D:\n\t\t\tif (!msl_options.texture_1D_as_2D)\n\t\t\t\tbreak;\n\t\t\tif (offset_type->vecsize > 1)\n\t\t\t\toffset_expr = enclose_expression(offset_expr) + \".x\";\n\n\t\t\tfarg_str += join(\", int2(\", offset_expr, \", 0)\");\n\t\t\tbreak;\n\n\t\tcase Dim2D:\n\t\t\tif (offset_type->vecsize > 2)\n\t\t\t\toffset_expr = enclose_expression(offset_expr) + \".xy\";\n\n\t\t\tfarg_str += \", \" + offset_expr;\n\t\t\tbreak;\n\n\t\tcase Dim3D:\n\t\t\tif (offset_type->vecsize > 3)\n\t\t\t\toffset_expr = enclose_expression(offset_expr) + \".xyz\";\n\n\t\t\tfarg_str += \", \" + offset_expr;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (args.component)\n\t{\n\t\t// If 2D has gather component, ensure it also has an offset arg\n\t\tif (imgtype.image.dim == Dim2D && offset_expr.empty())\n\t\t\tfarg_str += \", int2(0)\";\n\n\t\tif (!msl_options.swizzle_texture_samples || is_dynamic_img_sampler)\n\t\t{\n\t\t\tforward = forward && should_forward(args.component);\n\n\t\t\tuint32_t image_var = 0;\n\t\t\tif (const auto *combined = maybe_get<SPIRCombinedImageSampler>(img))\n\t\t\t{\n\t\t\t\tif (const auto *img_var = maybe_get_backing_variable(combined->image))\n\t\t\t\t\timage_var = img_var->self;\n\t\t\t}\n\t\t\telse if (const auto *var = maybe_get_backing_variable(img))\n\t\t\t{\n\t\t\t\timage_var = var->self;\n\t\t\t}\n\n\t\t\tif (image_var == 0 || !is_depth_image(expression_type(image_var), image_var))\n\t\t\t\tfarg_str += \", \" + to_component_argument(args.component);\n\t\t}\n\t}\n\n\tif (args.sample)\n\t{\n\t\tforward = forward && should_forward(args.sample);\n\t\tfarg_str += \", \";\n\t\tfarg_str += to_expression(args.sample);\n\t}\n\n\t*p_forward = forward;\n\n\treturn farg_str;\n}\n\n// If the texture coordinates are floating point, invokes MSL round() function to round them.\nstring CompilerMSL::round_fp_tex_coords(string tex_coords, bool coord_is_fp)\n{\n\treturn coord_is_fp ? (\"rint(\" + tex_coords + \")\") : tex_coords;\n}\n\n// Returns a string to use in an image sampling function argument.\n// The ID must be a scalar constant.\nstring CompilerMSL::to_component_argument(uint32_t id)\n{\n\tuint32_t component_index = evaluate_constant_u32(id);\n\tswitch (component_index)\n\t{\n\tcase 0:\n\t\treturn \"component::x\";\n\tcase 1:\n\t\treturn \"component::y\";\n\tcase 2:\n\t\treturn \"component::z\";\n\tcase 3:\n\t\treturn \"component::w\";\n\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"The value (\" + to_string(component_index) + \") of OpConstant ID \" + to_string(id) +\n\t\t                  \" is not a valid Component index, which must be one of 0, 1, 2, or 3.\");\n\t}\n}\n\n// Establish sampled image as expression object and assign the sampler to it.\nvoid CompilerMSL::emit_sampled_image_op(uint32_t result_type, uint32_t result_id, uint32_t image_id, uint32_t samp_id)\n{\n\tset<SPIRCombinedImageSampler>(result_id, result_type, image_id, samp_id);\n}\n\nstring CompilerMSL::to_texture_op(const Instruction &i, bool sparse, bool *forward,\n                                  SmallVector<uint32_t> &inherited_expressions)\n{\n\tauto *ops = stream(i);\n\tuint32_t result_type_id = ops[0];\n\tuint32_t img = ops[2];\n\tauto &result_type = get<SPIRType>(result_type_id);\n\tauto op = static_cast<Op>(i.op);\n\tbool is_gather = (op == OpImageGather || op == OpImageDrefGather);\n\n\t// Bypass pointers because we need the real image struct\n\tauto &type = expression_type(img);\n\tauto &imgtype = get<SPIRType>(type.self);\n\n\tconst MSLConstexprSampler *constexpr_sampler = nullptr;\n\tbool is_dynamic_img_sampler = false;\n\tif (auto *var = maybe_get_backing_variable(img))\n\t{\n\t\tconstexpr_sampler = find_constexpr_sampler(var->basevariable ? var->basevariable : VariableID(var->self));\n\t\tis_dynamic_img_sampler = has_extended_decoration(var->self, SPIRVCrossDecorationDynamicImageSampler);\n\t}\n\n\tstring expr;\n\tif (constexpr_sampler && constexpr_sampler->ycbcr_conversion_enable && !is_dynamic_img_sampler)\n\t{\n\t\t// If this needs sampler Y'CbCr conversion, we need to do some additional\n\t\t// processing.\n\t\tswitch (constexpr_sampler->ycbcr_model)\n\t\t{\n\t\tcase MSL_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY:\n\t\tcase MSL_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY:\n\t\t\t// Default\n\t\t\tbreak;\n\t\tcase MSL_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_BT_709:\n\t\t\tadd_spv_func_and_recompile(SPVFuncImplConvertYCbCrBT709);\n\t\t\texpr += \"spvConvertYCbCrBT709(\";\n\t\t\tbreak;\n\t\tcase MSL_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_BT_601:\n\t\t\tadd_spv_func_and_recompile(SPVFuncImplConvertYCbCrBT601);\n\t\t\texpr += \"spvConvertYCbCrBT601(\";\n\t\t\tbreak;\n\t\tcase MSL_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_BT_2020:\n\t\t\tadd_spv_func_and_recompile(SPVFuncImplConvertYCbCrBT2020);\n\t\t\texpr += \"spvConvertYCbCrBT2020(\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tSPIRV_CROSS_THROW(\"Invalid Y'CbCr model conversion.\");\n\t\t}\n\n\t\tif (constexpr_sampler->ycbcr_model != MSL_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY)\n\t\t{\n\t\t\tswitch (constexpr_sampler->ycbcr_range)\n\t\t\t{\n\t\t\tcase MSL_SAMPLER_YCBCR_RANGE_ITU_FULL:\n\t\t\t\tadd_spv_func_and_recompile(SPVFuncImplExpandITUFullRange);\n\t\t\t\texpr += \"spvExpandITUFullRange(\";\n\t\t\t\tbreak;\n\t\t\tcase MSL_SAMPLER_YCBCR_RANGE_ITU_NARROW:\n\t\t\t\tadd_spv_func_and_recompile(SPVFuncImplExpandITUNarrowRange);\n\t\t\t\texpr += \"spvExpandITUNarrowRange(\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tSPIRV_CROSS_THROW(\"Invalid Y'CbCr range.\");\n\t\t\t}\n\t\t}\n\t}\n\telse if (msl_options.swizzle_texture_samples && !is_gather && is_sampled_image_type(imgtype) &&\n\t         !is_dynamic_img_sampler)\n\t{\n\t\tadd_spv_func_and_recompile(SPVFuncImplTextureSwizzle);\n\t\texpr += \"spvTextureSwizzle(\";\n\t}\n\n\tstring inner_expr = CompilerGLSL::to_texture_op(i, sparse, forward, inherited_expressions);\n\n\tif (constexpr_sampler && constexpr_sampler->ycbcr_conversion_enable && !is_dynamic_img_sampler)\n\t{\n\t\tif (!constexpr_sampler->swizzle_is_identity())\n\t\t{\n\t\t\tstatic const char swizzle_names[] = \"rgba\";\n\t\t\tif (!constexpr_sampler->swizzle_has_one_or_zero())\n\t\t\t{\n\t\t\t\t// If we can, do it inline.\n\t\t\t\texpr += inner_expr + \".\";\n\t\t\t\tfor (uint32_t c = 0; c < 4; c++)\n\t\t\t\t{\n\t\t\t\t\tswitch (constexpr_sampler->swizzle[c])\n\t\t\t\t\t{\n\t\t\t\t\tcase MSL_COMPONENT_SWIZZLE_IDENTITY:\n\t\t\t\t\t\texpr += swizzle_names[c];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase MSL_COMPONENT_SWIZZLE_R:\n\t\t\t\t\tcase MSL_COMPONENT_SWIZZLE_G:\n\t\t\t\t\tcase MSL_COMPONENT_SWIZZLE_B:\n\t\t\t\t\tcase MSL_COMPONENT_SWIZZLE_A:\n\t\t\t\t\t\texpr += swizzle_names[constexpr_sampler->swizzle[c] - MSL_COMPONENT_SWIZZLE_R];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tSPIRV_CROSS_THROW(\"Invalid component swizzle.\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Otherwise, we need to emit a temporary and swizzle that.\n\t\t\t\tuint32_t temp_id = ir.increase_bound_by(1);\n\t\t\t\temit_op(result_type_id, temp_id, inner_expr, false);\n\t\t\t\tfor (auto &inherit : inherited_expressions)\n\t\t\t\t\tinherit_expression_dependencies(temp_id, inherit);\n\t\t\t\tinherited_expressions.clear();\n\t\t\t\tinherited_expressions.push_back(temp_id);\n\n\t\t\t\tswitch (op)\n\t\t\t\t{\n\t\t\t\tcase OpImageSampleDrefImplicitLod:\n\t\t\t\tcase OpImageSampleImplicitLod:\n\t\t\t\tcase OpImageSampleProjImplicitLod:\n\t\t\t\tcase OpImageSampleProjDrefImplicitLod:\n\t\t\t\t\tregister_control_dependent_expression(temp_id);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\texpr += type_to_glsl(result_type) + \"(\";\n\t\t\t\tfor (uint32_t c = 0; c < 4; c++)\n\t\t\t\t{\n\t\t\t\t\tswitch (constexpr_sampler->swizzle[c])\n\t\t\t\t\t{\n\t\t\t\t\tcase MSL_COMPONENT_SWIZZLE_IDENTITY:\n\t\t\t\t\t\texpr += to_expression(temp_id) + \".\" + swizzle_names[c];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase MSL_COMPONENT_SWIZZLE_ZERO:\n\t\t\t\t\t\texpr += \"0\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase MSL_COMPONENT_SWIZZLE_ONE:\n\t\t\t\t\t\texpr += \"1\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase MSL_COMPONENT_SWIZZLE_R:\n\t\t\t\t\tcase MSL_COMPONENT_SWIZZLE_G:\n\t\t\t\t\tcase MSL_COMPONENT_SWIZZLE_B:\n\t\t\t\t\tcase MSL_COMPONENT_SWIZZLE_A:\n\t\t\t\t\t\texpr += to_expression(temp_id) + \".\" +\n\t\t\t\t\t\t        swizzle_names[constexpr_sampler->swizzle[c] - MSL_COMPONENT_SWIZZLE_R];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tSPIRV_CROSS_THROW(\"Invalid component swizzle.\");\n\t\t\t\t\t}\n\t\t\t\t\tif (c < 3)\n\t\t\t\t\t\texpr += \", \";\n\t\t\t\t}\n\t\t\t\texpr += \")\";\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\texpr += inner_expr;\n\t\tif (constexpr_sampler->ycbcr_model != MSL_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY)\n\t\t{\n\t\t\texpr += join(\", \", constexpr_sampler->bpc, \")\");\n\t\t\tif (constexpr_sampler->ycbcr_model != MSL_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY)\n\t\t\t\texpr += \")\";\n\t\t}\n\t}\n\telse\n\t{\n\t\texpr += inner_expr;\n\t\tif (msl_options.swizzle_texture_samples && !is_gather && is_sampled_image_type(imgtype) &&\n\t\t    !is_dynamic_img_sampler)\n\t\t{\n\t\t\t// Add the swizzle constant from the swizzle buffer.\n\t\t\texpr += \", \" + to_swizzle_expression(img) + \")\";\n\t\t\tused_swizzle_buffer = true;\n\t\t}\n\t}\n\n\treturn expr;\n}\n\nstatic string create_swizzle(MSLComponentSwizzle swizzle)\n{\n\tswitch (swizzle)\n\t{\n\tcase MSL_COMPONENT_SWIZZLE_IDENTITY:\n\t\treturn \"spvSwizzle::none\";\n\tcase MSL_COMPONENT_SWIZZLE_ZERO:\n\t\treturn \"spvSwizzle::zero\";\n\tcase MSL_COMPONENT_SWIZZLE_ONE:\n\t\treturn \"spvSwizzle::one\";\n\tcase MSL_COMPONENT_SWIZZLE_R:\n\t\treturn \"spvSwizzle::red\";\n\tcase MSL_COMPONENT_SWIZZLE_G:\n\t\treturn \"spvSwizzle::green\";\n\tcase MSL_COMPONENT_SWIZZLE_B:\n\t\treturn \"spvSwizzle::blue\";\n\tcase MSL_COMPONENT_SWIZZLE_A:\n\t\treturn \"spvSwizzle::alpha\";\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Invalid component swizzle.\");\n\t}\n}\n\n// Returns a string representation of the ID, usable as a function arg.\n// Manufacture automatic sampler arg for SampledImage texture.\nstring CompilerMSL::to_func_call_arg(const SPIRFunction::Parameter &arg, uint32_t id)\n{\n\tstring arg_str;\n\n\tauto &type = expression_type(id);\n\tbool is_dynamic_img_sampler = has_extended_decoration(arg.id, SPIRVCrossDecorationDynamicImageSampler);\n\t// If the argument *itself* is a \"dynamic\" combined-image sampler, then we can just pass that around.\n\tbool arg_is_dynamic_img_sampler = has_extended_decoration(id, SPIRVCrossDecorationDynamicImageSampler);\n\tif (is_dynamic_img_sampler && !arg_is_dynamic_img_sampler)\n\t\targ_str = join(\"spvDynamicImageSampler<\", type_to_glsl(get<SPIRType>(type.image.type)), \">(\");\n\n\tauto *c = maybe_get<SPIRConstant>(id);\n\tif (msl_options.force_native_arrays && c && !get<SPIRType>(c->constant_type).array.empty())\n\t{\n\t\t// If we are passing a constant array directly to a function for some reason,\n\t\t// the callee will expect an argument in thread const address space\n\t\t// (since we can only bind to arrays with references in MSL).\n\t\t// To resolve this, we must emit a copy in this address space.\n\t\t// This kind of code gen should be rare enough that performance is not a real concern.\n\t\t// Inline the SPIR-V to avoid this kind of suboptimal codegen.\n\t\t//\n\t\t// We risk calling this inside a continue block (invalid code),\n\t\t// so just create a thread local copy in the current function.\n\t\targ_str = join(\"_\", id, \"_array_copy\");\n\t\tauto &constants = current_function->constant_arrays_needed_on_stack;\n\t\tauto itr = find(begin(constants), end(constants), ID(id));\n\t\tif (itr == end(constants))\n\t\t{\n\t\t\tforce_recompile();\n\t\t\tconstants.push_back(id);\n\t\t}\n\t}\n\t// Dereference pointer variables where needed.\n\t// FIXME: This dereference is actually backwards. We should really just support passing pointer variables between functions.\n\telse if (should_dereference(id))\n\t\targ_str += dereference_expression(type, CompilerGLSL::to_func_call_arg(arg, id));\n\telse\n\t\targ_str += CompilerGLSL::to_func_call_arg(arg, id);\n\n\t// Need to check the base variable in case we need to apply a qualified alias.\n\tuint32_t var_id = 0;\n\tauto *var = maybe_get<SPIRVariable>(id);\n\tif (var)\n\t\tvar_id = var->basevariable;\n\n\tif (!arg_is_dynamic_img_sampler)\n\t{\n\t\tauto *constexpr_sampler = find_constexpr_sampler(var_id ? var_id : id);\n\t\tif (type.basetype == SPIRType::SampledImage)\n\t\t{\n\t\t\t// Manufacture automatic plane args for multiplanar texture\n\t\t\tuint32_t planes = 1;\n\t\t\tif (constexpr_sampler && constexpr_sampler->ycbcr_conversion_enable)\n\t\t\t{\n\t\t\t\tplanes = constexpr_sampler->planes;\n\t\t\t\t// If this parameter isn't aliasing a global, then we need to use\n\t\t\t\t// the special \"dynamic image-sampler\" class to pass it--and we need\n\t\t\t\t// to use it for *every* non-alias parameter, in case a combined\n\t\t\t\t// image-sampler with a Y'CbCr conversion is passed. Hopefully, this\n\t\t\t\t// pathological case is so rare that it should never be hit in practice.\n\t\t\t\tif (!arg.alias_global_variable)\n\t\t\t\t\tadd_spv_func_and_recompile(SPVFuncImplDynamicImageSampler);\n\t\t\t}\n\t\t\tfor (uint32_t i = 1; i < planes; i++)\n\t\t\t\targ_str += join(\", \", CompilerGLSL::to_func_call_arg(arg, id), plane_name_suffix, i);\n\t\t\t// Manufacture automatic sampler arg if the arg is a SampledImage texture.\n\t\t\tif (type.image.dim != DimBuffer)\n\t\t\t\targ_str += \", \" + to_sampler_expression(var_id ? var_id : id);\n\n\t\t\t// Add sampler Y'CbCr conversion info if we have it\n\t\t\tif (is_dynamic_img_sampler && constexpr_sampler && constexpr_sampler->ycbcr_conversion_enable)\n\t\t\t{\n\t\t\t\tSmallVector<string> samp_args;\n\n\t\t\t\tswitch (constexpr_sampler->resolution)\n\t\t\t\t{\n\t\t\t\tcase MSL_FORMAT_RESOLUTION_444:\n\t\t\t\t\t// Default\n\t\t\t\t\tbreak;\n\t\t\t\tcase MSL_FORMAT_RESOLUTION_422:\n\t\t\t\t\tsamp_args.push_back(\"spvFormatResolution::_422\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase MSL_FORMAT_RESOLUTION_420:\n\t\t\t\t\tsamp_args.push_back(\"spvFormatResolution::_420\");\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Invalid format resolution.\");\n\t\t\t\t}\n\n\t\t\t\tif (constexpr_sampler->chroma_filter != MSL_SAMPLER_FILTER_NEAREST)\n\t\t\t\t\tsamp_args.push_back(\"spvChromaFilter::linear\");\n\n\t\t\t\tif (constexpr_sampler->x_chroma_offset != MSL_CHROMA_LOCATION_COSITED_EVEN)\n\t\t\t\t\tsamp_args.push_back(\"spvXChromaLocation::midpoint\");\n\t\t\t\tif (constexpr_sampler->y_chroma_offset != MSL_CHROMA_LOCATION_COSITED_EVEN)\n\t\t\t\t\tsamp_args.push_back(\"spvYChromaLocation::midpoint\");\n\t\t\t\tswitch (constexpr_sampler->ycbcr_model)\n\t\t\t\t{\n\t\t\t\tcase MSL_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY:\n\t\t\t\t\t// Default\n\t\t\t\t\tbreak;\n\t\t\t\tcase MSL_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY:\n\t\t\t\t\tsamp_args.push_back(\"spvYCbCrModelConversion::ycbcr_identity\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase MSL_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_BT_709:\n\t\t\t\t\tsamp_args.push_back(\"spvYCbCrModelConversion::ycbcr_bt_709\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase MSL_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_BT_601:\n\t\t\t\t\tsamp_args.push_back(\"spvYCbCrModelConversion::ycbcr_bt_601\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase MSL_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_BT_2020:\n\t\t\t\t\tsamp_args.push_back(\"spvYCbCrModelConversion::ycbcr_bt_2020\");\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Invalid Y'CbCr model conversion.\");\n\t\t\t\t}\n\t\t\t\tif (constexpr_sampler->ycbcr_range != MSL_SAMPLER_YCBCR_RANGE_ITU_FULL)\n\t\t\t\t\tsamp_args.push_back(\"spvYCbCrRange::itu_narrow\");\n\t\t\t\tsamp_args.push_back(join(\"spvComponentBits(\", constexpr_sampler->bpc, \")\"));\n\t\t\t\targ_str += join(\", spvYCbCrSampler(\", merge(samp_args), \")\");\n\t\t\t}\n\t\t}\n\n\t\tif (is_dynamic_img_sampler && constexpr_sampler && constexpr_sampler->ycbcr_conversion_enable)\n\t\t\targ_str += join(\", (uint(\", create_swizzle(constexpr_sampler->swizzle[3]), \") << 24) | (uint(\",\n\t\t\t                create_swizzle(constexpr_sampler->swizzle[2]), \") << 16) | (uint(\",\n\t\t\t                create_swizzle(constexpr_sampler->swizzle[1]), \") << 8) | uint(\",\n\t\t\t                create_swizzle(constexpr_sampler->swizzle[0]), \")\");\n\t\telse if (msl_options.swizzle_texture_samples && has_sampled_images && is_sampled_image_type(type))\n\t\t\targ_str += \", \" + to_swizzle_expression(var_id ? var_id : id);\n\n\t\tif (buffer_requires_array_length(var_id))\n\t\t\targ_str += \", \" + to_buffer_size_expression(var_id ? var_id : id);\n\n\t\tif (is_dynamic_img_sampler)\n\t\t\targ_str += \")\";\n\t}\n\n\t// Emulate texture2D atomic operations\n\tauto *backing_var = maybe_get_backing_variable(var_id);\n\tif (backing_var && atomic_image_vars_emulated.count(backing_var->self))\n\t{\n\t\targ_str += \", \" + to_expression(var_id) + \"_atomic\";\n\t}\n\n\treturn arg_str;\n}\n\n// If the ID represents a sampled image that has been assigned a sampler already,\n// generate an expression for the sampler, otherwise generate a fake sampler name\n// by appending a suffix to the expression constructed from the ID.\nstring CompilerMSL::to_sampler_expression(uint32_t id)\n{\n\tauto *combined = maybe_get<SPIRCombinedImageSampler>(id);\n\tauto expr = to_expression(combined ? combined->image : VariableID(id));\n\tauto index = expr.find_first_of('[');\n\n\tuint32_t samp_id = 0;\n\tif (combined)\n\t\tsamp_id = combined->sampler;\n\n\tif (index == string::npos)\n\t\treturn samp_id ? to_expression(samp_id) : expr + sampler_name_suffix;\n\telse\n\t{\n\t\tauto image_expr = expr.substr(0, index);\n\t\tauto array_expr = expr.substr(index);\n\t\treturn samp_id ? to_expression(samp_id) : (image_expr + sampler_name_suffix + array_expr);\n\t}\n}\n\nstring CompilerMSL::to_swizzle_expression(uint32_t id)\n{\n\tauto *combined = maybe_get<SPIRCombinedImageSampler>(id);\n\n\tauto expr = to_expression(combined ? combined->image : VariableID(id));\n\tauto index = expr.find_first_of('[');\n\n\t// If an image is part of an argument buffer translate this to a legal identifier.\n\tstring::size_type period = 0;\n\twhile ((period = expr.find_first_of('.', period)) != string::npos && period < index)\n\t\texpr[period] = '_';\n\n\tif (index == string::npos)\n\t\treturn expr + swizzle_name_suffix;\n\telse\n\t{\n\t\tauto image_expr = expr.substr(0, index);\n\t\tauto array_expr = expr.substr(index);\n\t\treturn image_expr + swizzle_name_suffix + array_expr;\n\t}\n}\n\nstring CompilerMSL::to_buffer_size_expression(uint32_t id)\n{\n\tauto expr = to_expression(id);\n\tauto index = expr.find_first_of('[');\n\n\t// This is quite crude, but we need to translate the reference name (*spvDescriptorSetN.name) to\n\t// the pointer expression spvDescriptorSetN.name to make a reasonable expression here.\n\t// This only happens if we have argument buffers and we are using OpArrayLength on a lone SSBO in that set.\n\tif (expr.size() >= 3 && expr[0] == '(' && expr[1] == '*')\n\t\texpr = address_of_expression(expr);\n\n\t// If a buffer is part of an argument buffer translate this to a legal identifier.\n\tfor (auto &c : expr)\n\t\tif (c == '.')\n\t\t\tc = '_';\n\n\tif (index == string::npos)\n\t\treturn expr + buffer_size_name_suffix;\n\telse\n\t{\n\t\tauto buffer_expr = expr.substr(0, index);\n\t\tauto array_expr = expr.substr(index);\n\t\tif (auto var = maybe_get_backing_variable(id))\n\t\t{\n\t\t\tif (is_var_runtime_size_array(*var))\n\t\t\t{\n\t\t\t\tif (!msl_options.runtime_array_rich_descriptor)\n\t\t\t\t\tSPIRV_CROSS_THROW(\"OpArrayLength requires rich descriptor format\");\n\n\t\t\t\tauto last_pos = array_expr.find_last_of(']');\n\t\t\t\tif (last_pos != std::string::npos)\n\t\t\t\t\treturn buffer_expr + \".length(\" + array_expr.substr(1, last_pos - 1) + \")\";\n\t\t\t}\n\t\t}\n\t\treturn buffer_expr + buffer_size_name_suffix + array_expr;\n\t}\n}\n\n// Checks whether the type is a Block all of whose members have DecorationPatch.\nbool CompilerMSL::is_patch_block(const SPIRType &type)\n{\n\tif (!has_decoration(type.self, DecorationBlock))\n\t\treturn false;\n\n\tfor (uint32_t i = 0; i < type.member_types.size(); i++)\n\t{\n\t\tif (!has_member_decoration(type.self, i, DecorationPatch))\n\t\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n// Checks whether the ID is a row_major matrix that requires conversion before use\nbool CompilerMSL::is_non_native_row_major_matrix(uint32_t id)\n{\n\tauto *e = maybe_get<SPIRExpression>(id);\n\tif (e)\n\t\treturn e->need_transpose;\n\telse\n\t\treturn has_decoration(id, DecorationRowMajor);\n}\n\n// Checks whether the member is a row_major matrix that requires conversion before use\nbool CompilerMSL::member_is_non_native_row_major_matrix(const SPIRType &type, uint32_t index)\n{\n\treturn has_member_decoration(type.self, index, DecorationRowMajor);\n}\n\nstring CompilerMSL::convert_row_major_matrix(string exp_str, const SPIRType &exp_type, uint32_t physical_type_id,\n                                             bool is_packed, bool relaxed)\n{\n\tif (!is_matrix(exp_type))\n\t{\n\t\treturn CompilerGLSL::convert_row_major_matrix(std::move(exp_str), exp_type, physical_type_id, is_packed, relaxed);\n\t}\n\telse\n\t{\n\t\tstrip_enclosed_expression(exp_str);\n\t\tif (physical_type_id != 0 || is_packed)\n\t\t\texp_str = unpack_expression_type(exp_str, exp_type, physical_type_id, is_packed, true);\n\t\treturn join(\"transpose(\", exp_str, \")\");\n\t}\n}\n\n// Called automatically at the end of the entry point function\nvoid CompilerMSL::emit_fixup()\n{\n\tif (is_vertex_like_shader() && stage_out_var_id && !qual_pos_var_name.empty() && !capture_output_to_buffer)\n\t{\n\t\tif (options.vertex.fixup_clipspace)\n\t\t\tstatement(qual_pos_var_name, \".z = (\", qual_pos_var_name, \".z + \", qual_pos_var_name,\n\t\t\t          \".w) * 0.5;       // Adjust clip-space for Metal\");\n\n\t\tif (options.vertex.flip_vert_y)\n\t\t\tstatement(qual_pos_var_name, \".y = -(\", qual_pos_var_name, \".y);\", \"    // Invert Y-axis for Metal\");\n\t}\n}\n\n// Return a string defining a structure member, with padding and packing.\nstring CompilerMSL::to_struct_member(const SPIRType &type, uint32_t member_type_id, uint32_t index,\n                                     const string &qualifier)\n{\n\tuint32_t orig_member_type_id = member_type_id;\n\tif (member_is_remapped_physical_type(type, index))\n\t\tmember_type_id = get_extended_member_decoration(type.self, index, SPIRVCrossDecorationPhysicalTypeID);\n\tauto &physical_type = get<SPIRType>(member_type_id);\n\n\t// If this member is packed, mark it as so.\n\tstring pack_pfx;\n\n\t// Allow Metal to use the array<T> template to make arrays a value type\n\tuint32_t orig_id = 0;\n\tif (has_extended_member_decoration(type.self, index, SPIRVCrossDecorationInterfaceOrigID))\n\t\torig_id = get_extended_member_decoration(type.self, index, SPIRVCrossDecorationInterfaceOrigID);\n\n\tbool row_major = false;\n\tif (is_matrix(physical_type))\n\t\trow_major = has_member_decoration(type.self, index, DecorationRowMajor);\n\n\tSPIRType row_major_physical_type { OpTypeMatrix };\n\tconst SPIRType *declared_type = &physical_type;\n\n\t// If a struct is being declared with physical layout,\n\t// do not use array<T> wrappers.\n\t// This avoids a lot of complicated cases with packed vectors and matrices,\n\t// and generally we cannot copy full arrays in and out of buffers into Function\n\t// address space.\n\t// Array of resources should also be declared as builtin arrays.\n\tif (has_member_decoration(type.self, index, DecorationOffset))\n\t\tis_using_builtin_array = true;\n\telse if (has_extended_member_decoration(type.self, index, SPIRVCrossDecorationResourceIndexPrimary))\n\t\tis_using_builtin_array = true;\n\n\tif (member_is_packed_physical_type(type, index))\n\t{\n\t\t// If we're packing a matrix, output an appropriate typedef\n\t\tif (physical_type.basetype == SPIRType::Struct)\n\t\t{\n\t\t\tSPIRV_CROSS_THROW(\"Cannot emit a packed struct currently.\");\n\t\t}\n\t\telse if (is_matrix(physical_type))\n\t\t{\n\t\t\tuint32_t rows = physical_type.vecsize;\n\t\t\tuint32_t cols = physical_type.columns;\n\t\t\tpack_pfx = \"packed_\";\n\t\t\tif (row_major)\n\t\t\t{\n\t\t\t\t// These are stored transposed.\n\t\t\t\trows = physical_type.columns;\n\t\t\t\tcols = physical_type.vecsize;\n\t\t\t\tpack_pfx = \"packed_rm_\";\n\t\t\t}\n\t\t\tstring base_type = physical_type.width == 16 ? \"half\" : \"float\";\n\t\t\tstring td_line = \"typedef \";\n\t\t\ttd_line += \"packed_\" + base_type + to_string(rows);\n\t\t\ttd_line += \" \" + pack_pfx;\n\t\t\t// Use the actual matrix size here.\n\t\t\ttd_line += base_type + to_string(physical_type.columns) + \"x\" + to_string(physical_type.vecsize);\n\t\t\ttd_line += \"[\" + to_string(cols) + \"]\";\n\t\t\ttd_line += \";\";\n\t\t\tadd_typedef_line(td_line);\n\t\t}\n\t\telse if (!is_scalar(physical_type)) // scalar type is already packed.\n\t\t\tpack_pfx = \"packed_\";\n\t}\n\telse if (is_matrix(physical_type))\n\t{\n\t\tif (!msl_options.supports_msl_version(3, 0) &&\n\t\t    has_extended_decoration(type.self, SPIRVCrossDecorationWorkgroupStruct))\n\t\t{\n\t\t\tpack_pfx = \"spvStorage_\";\n\t\t\tadd_spv_func_and_recompile(SPVFuncImplStorageMatrix);\n\t\t\t// The pack prefix causes problems with array<T> wrappers.\n\t\t\tis_using_builtin_array = true;\n\t\t}\n\t\tif (row_major)\n\t\t{\n\t\t\t// Need to declare type with flipped vecsize/columns.\n\t\t\trow_major_physical_type = physical_type;\n\t\t\tswap(row_major_physical_type.vecsize, row_major_physical_type.columns);\n\t\t\tdeclared_type = &row_major_physical_type;\n\t\t}\n\t}\n\n\t// iOS Tier 1 argument buffers do not support writable images.\n\tif (physical_type.basetype == SPIRType::Image &&\n\t\tphysical_type.image.sampled == 2 &&\n\t\tmsl_options.is_ios() &&\n\t\tmsl_options.argument_buffers_tier <= Options::ArgumentBuffersTier::Tier1 &&\n\t\t!has_decoration(orig_id, DecorationNonWritable))\n\t{\n\t\tSPIRV_CROSS_THROW(\"Writable images are not allowed on Tier1 argument buffers on iOS.\");\n\t}\n\n\t// Array information is baked into these types.\n\tstring array_type;\n\tif (physical_type.basetype != SPIRType::Image && physical_type.basetype != SPIRType::Sampler &&\n\t    physical_type.basetype != SPIRType::SampledImage)\n\t{\n\t\tBuiltIn builtin = BuiltInMax;\n\n\t\t// Special handling. In [[stage_out]] or [[stage_in]] blocks,\n\t\t// we need flat arrays, but if we're somehow declaring gl_PerVertex for constant array reasons, we want\n\t\t// template array types to be declared.\n\t\tbool is_ib_in_out =\n\t\t\t\t((stage_out_var_id && get_stage_out_struct_type().self == type.self &&\n\t\t\t\t  variable_storage_requires_stage_io(StorageClassOutput)) ||\n\t\t\t\t (stage_in_var_id && get_stage_in_struct_type().self == type.self &&\n\t\t\t\t  variable_storage_requires_stage_io(StorageClassInput)));\n\t\tif (is_ib_in_out && is_member_builtin(type, index, &builtin))\n\t\t\tis_using_builtin_array = true;\n\t\tarray_type = type_to_array_glsl(physical_type);\n\t}\n\n\tstring decl_type;\n\tif (declared_type->vecsize > 4)\n\t{\n\t\tauto orig_type = get<SPIRType>(orig_member_type_id);\n\t\tif (is_matrix(orig_type) && row_major)\n\t\t\tswap(orig_type.vecsize, orig_type.columns);\n\t\torig_type.columns = 1;\n\t\tdecl_type = type_to_glsl(orig_type, orig_id, true);\n\n\t\tif (declared_type->columns > 1)\n\t\t\tdecl_type = join(\"spvPaddedStd140Matrix<\", decl_type, \", \", declared_type->columns, \">\");\n\t\telse\n\t\t\tdecl_type = join(\"spvPaddedStd140<\", decl_type, \">\");\n\t}\n\telse\n\t\tdecl_type = type_to_glsl(*declared_type, orig_id, true);\n\n\tauto result = join(pack_pfx, decl_type, \" \", qualifier,\n\t                   to_member_name(type, index), member_attribute_qualifier(type, index), array_type, \";\");\n\n\tis_using_builtin_array = false;\n\treturn result;\n}\n\n// Emit a structure member, padding and packing to maintain the correct memeber alignments.\nvoid CompilerMSL::emit_struct_member(const SPIRType &type, uint32_t member_type_id, uint32_t index,\n                                     const string &qualifier, uint32_t)\n{\n\t// If this member requires padding to maintain its declared offset, emit a dummy padding member before it.\n\tif (has_extended_member_decoration(type.self, index, SPIRVCrossDecorationPaddingTarget))\n\t{\n\t\tuint32_t pad_len = get_extended_member_decoration(type.self, index, SPIRVCrossDecorationPaddingTarget);\n\t\tstatement(\"char _m\", index, \"_pad\", \"[\", pad_len, \"];\");\n\t}\n\n\t// Handle HLSL-style 0-based vertex/instance index.\n\tbuiltin_declaration = true;\n\tstatement(to_struct_member(type, member_type_id, index, qualifier));\n\tbuiltin_declaration = false;\n}\n\nvoid CompilerMSL::emit_struct_padding_target(const SPIRType &type)\n{\n\tuint32_t struct_size = get_declared_struct_size_msl(type, true, true);\n\tuint32_t target_size = get_extended_decoration(type.self, SPIRVCrossDecorationPaddingTarget);\n\tif (target_size < struct_size)\n\t\tSPIRV_CROSS_THROW(\"Cannot pad with negative bytes.\");\n\telse if (target_size > struct_size)\n\t\tstatement(\"char _m0_final_padding[\", target_size - struct_size, \"];\");\n}\n\n// Return a MSL qualifier for the specified function attribute member\nstring CompilerMSL::member_attribute_qualifier(const SPIRType &type, uint32_t index)\n{\n\tauto &execution = get_entry_point();\n\n\tuint32_t mbr_type_id = type.member_types[index];\n\tauto &mbr_type = get<SPIRType>(mbr_type_id);\n\n\tBuiltIn builtin = BuiltInMax;\n\tbool is_builtin = is_member_builtin(type, index, &builtin);\n\n\tif (has_extended_member_decoration(type.self, index, SPIRVCrossDecorationResourceIndexPrimary))\n\t{\n\t\tstring quals = join(\n\t\t    \" [[id(\", get_extended_member_decoration(type.self, index, SPIRVCrossDecorationResourceIndexPrimary), \")\");\n\t\tif (interlocked_resources.count(\n\t\t        get_extended_member_decoration(type.self, index, SPIRVCrossDecorationInterfaceOrigID)))\n\t\t\tquals += \", raster_order_group(0)\";\n\t\tquals += \"]]\";\n\t\treturn quals;\n\t}\n\n\t// Vertex function inputs\n\tif (execution.model == ExecutionModelVertex && type.storage == StorageClassInput)\n\t{\n\t\tif (is_builtin)\n\t\t{\n\t\t\tswitch (builtin)\n\t\t\t{\n\t\t\tcase BuiltInVertexId:\n\t\t\tcase BuiltInVertexIndex:\n\t\t\tcase BuiltInBaseVertex:\n\t\t\tcase BuiltInInstanceId:\n\t\t\tcase BuiltInInstanceIndex:\n\t\t\tcase BuiltInBaseInstance:\n\t\t\t\tif (msl_options.vertex_for_tessellation)\n\t\t\t\t\treturn \"\";\n\t\t\t\treturn string(\" [[\") + builtin_qualifier(builtin) + \"]]\";\n\n\t\t\tcase BuiltInDrawIndex:\n\t\t\t\tSPIRV_CROSS_THROW(\"DrawIndex is not supported in MSL.\");\n\n\t\t\tdefault:\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t}\n\n\t\tuint32_t locn;\n\t\tif (is_builtin)\n\t\t\tlocn = get_or_allocate_builtin_input_member_location(builtin, type.self, index);\n\t\telse\n\t\t\tlocn = get_member_location(type.self, index);\n\n\t\tif (locn != k_unknown_location)\n\t\t\treturn string(\" [[attribute(\") + convert_to_string(locn) + \")]]\";\n\t}\n\n\t// Vertex and tessellation evaluation function outputs\n\tif (((execution.model == ExecutionModelVertex && !msl_options.vertex_for_tessellation) || is_tese_shader()) &&\n\t    type.storage == StorageClassOutput)\n\t{\n\t\tif (is_builtin)\n\t\t{\n\t\t\tswitch (builtin)\n\t\t\t{\n\t\t\tcase BuiltInPointSize:\n\t\t\t\t// Only mark the PointSize builtin if really rendering points.\n\t\t\t\t// Some shaders may include a PointSize builtin even when used to render\n\t\t\t\t// non-point topologies, and Metal will reject this builtin when compiling\n\t\t\t\t// the shader into a render pipeline that uses a non-point topology.\n\t\t\t\treturn msl_options.enable_point_size_builtin ? (string(\" [[\") + builtin_qualifier(builtin) + \"]]\") : \"\";\n\n\t\t\tcase BuiltInViewportIndex:\n\t\t\t\tif (!msl_options.supports_msl_version(2, 0))\n\t\t\t\t\tSPIRV_CROSS_THROW(\"ViewportIndex requires Metal 2.0.\");\n\t\t\t\t/* fallthrough */\n\t\t\tcase BuiltInPosition:\n\t\t\tcase BuiltInLayer:\n\t\t\t\treturn string(\" [[\") + builtin_qualifier(builtin) + \"]]\" + (mbr_type.array.empty() ? \"\" : \" \");\n\n\t\t\tcase BuiltInClipDistance:\n\t\t\t\tif (has_member_decoration(type.self, index, DecorationIndex))\n\t\t\t\t\treturn join(\" [[user(clip\", get_member_decoration(type.self, index, DecorationIndex), \")]]\");\n\t\t\t\telse\n\t\t\t\t\treturn string(\" [[\") + builtin_qualifier(builtin) + \"]]\" + (mbr_type.array.empty() ? \"\" : \" \");\n\n\t\t\tcase BuiltInCullDistance:\n\t\t\t\tif (has_member_decoration(type.self, index, DecorationIndex))\n\t\t\t\t\treturn join(\" [[user(cull\", get_member_decoration(type.self, index, DecorationIndex), \")]]\");\n\t\t\t\telse\n\t\t\t\t\treturn string(\" [[\") + builtin_qualifier(builtin) + \"]]\" + (mbr_type.array.empty() ? \"\" : \" \");\n\n\t\t\tdefault:\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t}\n\t\tstring loc_qual = member_location_attribute_qualifier(type, index);\n\t\tif (!loc_qual.empty())\n\t\t\treturn join(\" [[\", loc_qual, \"]]\");\n\t}\n\n\tif (execution.model == ExecutionModelVertex && msl_options.vertex_for_tessellation && type.storage == StorageClassOutput)\n\t{\n\t\t// For this type of shader, we always arrange for it to capture its\n\t\t// output to a buffer. For this reason, qualifiers are irrelevant here.\n\t\tif (is_builtin)\n\t\t\t// We still have to assign a location so the output struct will sort correctly.\n\t\t\tget_or_allocate_builtin_output_member_location(builtin, type.self, index);\n\t\treturn \"\";\n\t}\n\n\t// Tessellation control function inputs\n\tif (is_tesc_shader() && type.storage == StorageClassInput)\n\t{\n\t\tif (is_builtin)\n\t\t{\n\t\t\tswitch (builtin)\n\t\t\t{\n\t\t\tcase BuiltInInvocationId:\n\t\t\tcase BuiltInPrimitiveId:\n\t\t\t\tif (msl_options.multi_patch_workgroup)\n\t\t\t\t\treturn \"\";\n\t\t\t\treturn string(\" [[\") + builtin_qualifier(builtin) + \"]]\" + (mbr_type.array.empty() ? \"\" : \" \");\n\t\t\tcase BuiltInSubgroupLocalInvocationId: // FIXME: Should work in any stage\n\t\t\tcase BuiltInSubgroupSize: // FIXME: Should work in any stage\n\t\t\t\tif (msl_options.emulate_subgroups)\n\t\t\t\t\treturn \"\";\n\t\t\t\treturn string(\" [[\") + builtin_qualifier(builtin) + \"]]\" + (mbr_type.array.empty() ? \"\" : \" \");\n\t\t\tcase BuiltInPatchVertices:\n\t\t\t\treturn \"\";\n\t\t\t// Others come from stage input.\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (msl_options.multi_patch_workgroup)\n\t\t\treturn \"\";\n\n\t\tuint32_t locn;\n\t\tif (is_builtin)\n\t\t\tlocn = get_or_allocate_builtin_input_member_location(builtin, type.self, index);\n\t\telse\n\t\t\tlocn = get_member_location(type.self, index);\n\n\t\tif (locn != k_unknown_location)\n\t\t\treturn string(\" [[attribute(\") + convert_to_string(locn) + \")]]\";\n\t}\n\n\t// Tessellation control function outputs\n\tif (is_tesc_shader() && type.storage == StorageClassOutput)\n\t{\n\t\t// For this type of shader, we always arrange for it to capture its\n\t\t// output to a buffer. For this reason, qualifiers are irrelevant here.\n\t\tif (is_builtin)\n\t\t\t// We still have to assign a location so the output struct will sort correctly.\n\t\t\tget_or_allocate_builtin_output_member_location(builtin, type.self, index);\n\t\treturn \"\";\n\t}\n\n\t// Tessellation evaluation function inputs\n\tif (is_tese_shader() && type.storage == StorageClassInput)\n\t{\n\t\tif (is_builtin)\n\t\t{\n\t\t\tswitch (builtin)\n\t\t\t{\n\t\t\tcase BuiltInPrimitiveId:\n\t\t\tcase BuiltInTessCoord:\n\t\t\t\treturn string(\" [[\") + builtin_qualifier(builtin) + \"]]\";\n\t\t\tcase BuiltInPatchVertices:\n\t\t\t\treturn \"\";\n\t\t\t// Others come from stage input.\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (msl_options.raw_buffer_tese_input)\n\t\t\treturn \"\";\n\n\t\t// The special control point array must not be marked with an attribute.\n\t\tif (get_type(type.member_types[index]).basetype == SPIRType::ControlPointArray)\n\t\t\treturn \"\";\n\n\t\tuint32_t locn;\n\t\tif (is_builtin)\n\t\t\tlocn = get_or_allocate_builtin_input_member_location(builtin, type.self, index);\n\t\telse\n\t\t\tlocn = get_member_location(type.self, index);\n\n\t\tif (locn != k_unknown_location)\n\t\t\treturn string(\" [[attribute(\") + convert_to_string(locn) + \")]]\";\n\t}\n\n\t// Tessellation evaluation function outputs were handled above.\n\n\t// Fragment function inputs\n\tif (execution.model == ExecutionModelFragment && type.storage == StorageClassInput)\n\t{\n\t\tstring quals;\n\t\tif (is_builtin)\n\t\t{\n\t\t\tswitch (builtin)\n\t\t\t{\n\t\t\tcase BuiltInViewIndex:\n\t\t\t\tif (!msl_options.multiview || !msl_options.multiview_layered_rendering)\n\t\t\t\t\tbreak;\n\t\t\t\t/* fallthrough */\n\t\t\tcase BuiltInFrontFacing:\n\t\t\tcase BuiltInPointCoord:\n\t\t\tcase BuiltInFragCoord:\n\t\t\tcase BuiltInSampleId:\n\t\t\tcase BuiltInSampleMask:\n\t\t\tcase BuiltInLayer:\n\t\t\tcase BuiltInBaryCoordKHR:\n\t\t\tcase BuiltInBaryCoordNoPerspKHR:\n\t\t\t\tquals = builtin_qualifier(builtin);\n\t\t\t\tbreak;\n\n\t\t\tcase BuiltInClipDistance:\n\t\t\t\treturn join(\" [[user(clip\", get_member_decoration(type.self, index, DecorationIndex), \")]]\");\n\t\t\tcase BuiltInCullDistance:\n\t\t\t\treturn join(\" [[user(cull\", get_member_decoration(type.self, index, DecorationIndex), \")]]\");\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tquals = member_location_attribute_qualifier(type, index);\n\n\t\tif (builtin == BuiltInBaryCoordKHR || builtin == BuiltInBaryCoordNoPerspKHR)\n\t\t{\n\t\t\tif (has_member_decoration(type.self, index, DecorationFlat) ||\n\t\t\t    has_member_decoration(type.self, index, DecorationCentroid) ||\n\t\t\t    has_member_decoration(type.self, index, DecorationSample) ||\n\t\t\t    has_member_decoration(type.self, index, DecorationNoPerspective))\n\t\t\t{\n\t\t\t\t// NoPerspective is baked into the builtin type.\n\t\t\t\tSPIRV_CROSS_THROW(\n\t\t\t\t    \"Flat, Centroid, Sample, NoPerspective decorations are not supported for BaryCoord inputs.\");\n\t\t\t}\n\t\t}\n\n\t\t// Don't bother decorating integers with the 'flat' attribute; it's\n\t\t// the default (in fact, the only option). Also don't bother with the\n\t\t// FragCoord builtin; it's always noperspective on Metal.\n\t\tif (!type_is_integral(mbr_type) && (!is_builtin || builtin != BuiltInFragCoord))\n\t\t{\n\t\t\tif (has_member_decoration(type.self, index, DecorationFlat))\n\t\t\t{\n\t\t\t\tif (!quals.empty())\n\t\t\t\t\tquals += \", \";\n\t\t\t\tquals += \"flat\";\n\t\t\t}\n\t\t\telse if (has_member_decoration(type.self, index, DecorationCentroid))\n\t\t\t{\n\t\t\t\tif (!quals.empty())\n\t\t\t\t\tquals += \", \";\n\t\t\t\tif (has_member_decoration(type.self, index, DecorationNoPerspective))\n\t\t\t\t\tquals += \"centroid_no_perspective\";\n\t\t\t\telse\n\t\t\t\t\tquals += \"centroid_perspective\";\n\t\t\t}\n\t\t\telse if (has_member_decoration(type.self, index, DecorationSample))\n\t\t\t{\n\t\t\t\tif (!quals.empty())\n\t\t\t\t\tquals += \", \";\n\t\t\t\tif (has_member_decoration(type.self, index, DecorationNoPerspective))\n\t\t\t\t\tquals += \"sample_no_perspective\";\n\t\t\t\telse\n\t\t\t\t\tquals += \"sample_perspective\";\n\t\t\t}\n\t\t\telse if (has_member_decoration(type.self, index, DecorationNoPerspective))\n\t\t\t{\n\t\t\t\tif (!quals.empty())\n\t\t\t\t\tquals += \", \";\n\t\t\t\tquals += \"center_no_perspective\";\n\t\t\t}\n\t\t}\n\n\t\tif (!quals.empty())\n\t\t\treturn \" [[\" + quals + \"]]\";\n\t}\n\n\t// Fragment function outputs\n\tif (execution.model == ExecutionModelFragment && type.storage == StorageClassOutput)\n\t{\n\t\tif (is_builtin)\n\t\t{\n\t\t\tswitch (builtin)\n\t\t\t{\n\t\t\tcase BuiltInFragStencilRefEXT:\n\t\t\t\t// Similar to PointSize, only mark FragStencilRef if there's a stencil buffer.\n\t\t\t\t// Some shaders may include a FragStencilRef builtin even when used to render\n\t\t\t\t// without a stencil attachment, and Metal will reject this builtin\n\t\t\t\t// when compiling the shader into a render pipeline that does not set\n\t\t\t\t// stencilAttachmentPixelFormat.\n\t\t\t\tif (!msl_options.enable_frag_stencil_ref_builtin)\n\t\t\t\t\treturn \"\";\n\t\t\t\tif (!msl_options.supports_msl_version(2, 1))\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Stencil export only supported in MSL 2.1 and up.\");\n\t\t\t\treturn string(\" [[\") + builtin_qualifier(builtin) + \"]]\";\n\n\t\t\tcase BuiltInFragDepth:\n\t\t\t\t// Ditto FragDepth.\n\t\t\t\tif (!msl_options.enable_frag_depth_builtin)\n\t\t\t\t\treturn \"\";\n\t\t\t\t/* fallthrough */\n\t\t\tcase BuiltInSampleMask:\n\t\t\t\treturn string(\" [[\") + builtin_qualifier(builtin) + \"]]\";\n\n\t\t\tdefault:\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t}\n\t\tuint32_t locn = get_member_location(type.self, index);\n\t\t// Metal will likely complain about missing color attachments, too.\n\t\tif (locn != k_unknown_location && !(msl_options.enable_frag_output_mask & (1 << locn)))\n\t\t\treturn \"\";\n\t\tif (locn != k_unknown_location && has_member_decoration(type.self, index, DecorationIndex))\n\t\t\treturn join(\" [[color(\", locn, \"), index(\", get_member_decoration(type.self, index, DecorationIndex),\n\t\t\t            \")]]\");\n\t\telse if (locn != k_unknown_location)\n\t\t\treturn join(\" [[color(\", locn, \")]]\");\n\t\telse if (has_member_decoration(type.self, index, DecorationIndex))\n\t\t\treturn join(\" [[index(\", get_member_decoration(type.self, index, DecorationIndex), \")]]\");\n\t\telse\n\t\t\treturn \"\";\n\t}\n\n\t// Compute function inputs\n\tif (execution.model == ExecutionModelGLCompute && type.storage == StorageClassInput)\n\t{\n\t\tif (is_builtin)\n\t\t{\n\t\t\tswitch (builtin)\n\t\t\t{\n\t\t\tcase BuiltInNumSubgroups:\n\t\t\tcase BuiltInSubgroupId:\n\t\t\tcase BuiltInSubgroupLocalInvocationId: // FIXME: Should work in any stage\n\t\t\tcase BuiltInSubgroupSize: // FIXME: Should work in any stage\n\t\t\t\tif (msl_options.emulate_subgroups)\n\t\t\t\t\tbreak;\n\t\t\t\t/* fallthrough */\n\t\t\tcase BuiltInGlobalInvocationId:\n\t\t\tcase BuiltInWorkgroupId:\n\t\t\tcase BuiltInNumWorkgroups:\n\t\t\tcase BuiltInLocalInvocationId:\n\t\t\tcase BuiltInLocalInvocationIndex:\n\t\t\t\treturn string(\" [[\") + builtin_qualifier(builtin) + \"]]\";\n\n\t\t\tdefault:\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\treturn \"\";\n}\n\n// A user-defined output variable is considered to match an input variable in the subsequent\n// stage if the two variables are declared with the same Location and Component decoration and\n// match in type and decoration, except that interpolation decorations are not required to match.\n// For the purposes of interface matching, variables declared without a Component decoration are\n// considered to have a Component decoration of zero.\nstring CompilerMSL::member_location_attribute_qualifier(const SPIRType &type, uint32_t index)\n{\n\tstring quals;\n\tuint32_t comp;\n\tuint32_t locn = get_member_location(type.self, index, &comp);\n\tif (locn != k_unknown_location)\n\t{\n\t\tquals += \"user(locn\";\n\t\tquals += convert_to_string(locn);\n\t\tif (comp != k_unknown_component && comp != 0)\n\t\t{\n\t\t\tquals += \"_\";\n\t\t\tquals += convert_to_string(comp);\n\t\t}\n\t\tquals += \")\";\n\t}\n\treturn quals;\n}\n\n// Returns the location decoration of the member with the specified index in the specified type.\n// If the location of the member has been explicitly set, that location is used. If not, this\n// function assumes the members are ordered in their location order, and simply returns the\n// index as the location.\nuint32_t CompilerMSL::get_member_location(uint32_t type_id, uint32_t index, uint32_t *comp) const\n{\n\tif (comp)\n\t{\n\t\tif (has_member_decoration(type_id, index, DecorationComponent))\n\t\t\t*comp = get_member_decoration(type_id, index, DecorationComponent);\n\t\telse\n\t\t\t*comp = k_unknown_component;\n\t}\n\n\tif (has_member_decoration(type_id, index, DecorationLocation))\n\t\treturn get_member_decoration(type_id, index, DecorationLocation);\n\telse\n\t\treturn k_unknown_location;\n}\n\nuint32_t CompilerMSL::get_or_allocate_builtin_input_member_location(spv::BuiltIn builtin,\n                                                                    uint32_t type_id, uint32_t index,\n                                                                    uint32_t *comp)\n{\n\tuint32_t loc = get_member_location(type_id, index, comp);\n\tif (loc != k_unknown_location)\n\t\treturn loc;\n\n\tif (comp)\n\t\t*comp = k_unknown_component;\n\n\t// Late allocation. Find a location which is unused by the application.\n\t// This can happen for built-in inputs in tessellation which are mixed and matched with user inputs.\n\tauto &mbr_type = get<SPIRType>(get<SPIRType>(type_id).member_types[index]);\n\tuint32_t count = type_to_location_count(mbr_type);\n\n\tloc = 0;\n\n\tconst auto location_range_in_use = [this](uint32_t location, uint32_t location_count) -> bool {\n\t\tfor (uint32_t i = 0; i < location_count; i++)\n\t\t\tif (location_inputs_in_use.count(location + i) != 0)\n\t\t\t\treturn true;\n\t\treturn false;\n\t};\n\n\twhile (location_range_in_use(loc, count))\n\t\tloc++;\n\n\tset_member_decoration(type_id, index, DecorationLocation, loc);\n\n\t// Triangle tess level inputs are shared in one packed float4,\n\t// mark both builtins as sharing one location.\n\tif (!msl_options.raw_buffer_tese_input && is_tessellating_triangles() &&\n\t    (builtin == BuiltInTessLevelInner || builtin == BuiltInTessLevelOuter))\n\t{\n\t\tbuiltin_to_automatic_input_location[BuiltInTessLevelInner] = loc;\n\t\tbuiltin_to_automatic_input_location[BuiltInTessLevelOuter] = loc;\n\t}\n\telse\n\t\tbuiltin_to_automatic_input_location[builtin] = loc;\n\n\tmark_location_as_used_by_shader(loc, mbr_type, StorageClassInput, true);\n\treturn loc;\n}\n\nuint32_t CompilerMSL::get_or_allocate_builtin_output_member_location(spv::BuiltIn builtin,\n                                                                     uint32_t type_id, uint32_t index,\n                                                                     uint32_t *comp)\n{\n\tuint32_t loc = get_member_location(type_id, index, comp);\n\tif (loc != k_unknown_location)\n\t\treturn loc;\n\tloc = 0;\n\n\tif (comp)\n\t\t*comp = k_unknown_component;\n\n\t// Late allocation. Find a location which is unused by the application.\n\t// This can happen for built-in outputs in tessellation which are mixed and matched with user inputs.\n\tauto &mbr_type = get<SPIRType>(get<SPIRType>(type_id).member_types[index]);\n\tuint32_t count = type_to_location_count(mbr_type);\n\n\tconst auto location_range_in_use = [this](uint32_t location, uint32_t location_count) -> bool {\n\t\tfor (uint32_t i = 0; i < location_count; i++)\n\t\t\tif (location_outputs_in_use.count(location + i) != 0)\n\t\t\t\treturn true;\n\t\treturn false;\n\t};\n\n\twhile (location_range_in_use(loc, count))\n\t\tloc++;\n\n\tset_member_decoration(type_id, index, DecorationLocation, loc);\n\n\t// Triangle tess level inputs are shared in one packed float4;\n\t// mark both builtins as sharing one location.\n\tif (is_tessellating_triangles() && (builtin == BuiltInTessLevelInner || builtin == BuiltInTessLevelOuter))\n\t{\n\t\tbuiltin_to_automatic_output_location[BuiltInTessLevelInner] = loc;\n\t\tbuiltin_to_automatic_output_location[BuiltInTessLevelOuter] = loc;\n\t}\n\telse\n\t\tbuiltin_to_automatic_output_location[builtin] = loc;\n\n\tmark_location_as_used_by_shader(loc, mbr_type, StorageClassOutput, true);\n\treturn loc;\n}\n\n// Returns the type declaration for a function, including the\n// entry type if the current function is the entry point function\nstring CompilerMSL::func_type_decl(SPIRType &type)\n{\n\t// The regular function return type. If not processing the entry point function, that's all we need\n\tstring return_type = type_to_glsl(type) + type_to_array_glsl(type);\n\tif (!processing_entry_point)\n\t\treturn return_type;\n\n\t// If an outgoing interface block has been defined, and it should be returned, override the entry point return type\n\tbool ep_should_return_output = !get_is_rasterization_disabled();\n\tif (stage_out_var_id && ep_should_return_output)\n\t\treturn_type = type_to_glsl(get_stage_out_struct_type()) + type_to_array_glsl(type);\n\n\t// Prepend a entry type, based on the execution model\n\tstring entry_type;\n\tauto &execution = get_entry_point();\n\tswitch (execution.model)\n\t{\n\tcase ExecutionModelVertex:\n\t\tif (msl_options.vertex_for_tessellation && !msl_options.supports_msl_version(1, 2))\n\t\t\tSPIRV_CROSS_THROW(\"Tessellation requires Metal 1.2.\");\n\t\tentry_type = msl_options.vertex_for_tessellation ? \"kernel\" : \"vertex\";\n\t\tbreak;\n\tcase ExecutionModelTessellationEvaluation:\n\t\tif (!msl_options.supports_msl_version(1, 2))\n\t\t\tSPIRV_CROSS_THROW(\"Tessellation requires Metal 1.2.\");\n\t\tif (execution.flags.get(ExecutionModeIsolines))\n\t\t\tSPIRV_CROSS_THROW(\"Metal does not support isoline tessellation.\");\n\t\tif (msl_options.is_ios())\n\t\t\tentry_type = join(\"[[ patch(\", is_tessellating_triangles() ? \"triangle\" : \"quad\", \") ]] vertex\");\n\t\telse\n\t\t\tentry_type = join(\"[[ patch(\", is_tessellating_triangles() ? \"triangle\" : \"quad\", \", \",\n\t\t\t                  execution.output_vertices, \") ]] vertex\");\n\t\tbreak;\n\tcase ExecutionModelFragment:\n\t\tentry_type = uses_explicit_early_fragment_test() ? \"[[ early_fragment_tests ]] fragment\" : \"fragment\";\n\t\tbreak;\n\tcase ExecutionModelTessellationControl:\n\t\tif (!msl_options.supports_msl_version(1, 2))\n\t\t\tSPIRV_CROSS_THROW(\"Tessellation requires Metal 1.2.\");\n\t\tif (execution.flags.get(ExecutionModeIsolines))\n\t\t\tSPIRV_CROSS_THROW(\"Metal does not support isoline tessellation.\");\n\t\t/* fallthrough */\n\tcase ExecutionModelGLCompute:\n\tcase ExecutionModelKernel:\n\t\tentry_type = \"kernel\";\n\t\tbreak;\n\tdefault:\n\t\tentry_type = \"unknown\";\n\t\tbreak;\n\t}\n\n\treturn entry_type + \" \" + return_type;\n}\n\nbool CompilerMSL::is_tesc_shader() const\n{\n\treturn get_execution_model() == ExecutionModelTessellationControl;\n}\n\nbool CompilerMSL::is_tese_shader() const\n{\n\treturn get_execution_model() == ExecutionModelTessellationEvaluation;\n}\n\nbool CompilerMSL::uses_explicit_early_fragment_test()\n{\n\tauto &ep_flags = get_entry_point().flags;\n\treturn ep_flags.get(ExecutionModeEarlyFragmentTests) || ep_flags.get(ExecutionModePostDepthCoverage);\n}\n\n// In MSL, address space qualifiers are required for all pointer or reference variables\nstring CompilerMSL::get_argument_address_space(const SPIRVariable &argument)\n{\n\tconst auto &type = get<SPIRType>(argument.basetype);\n\treturn get_type_address_space(type, argument.self, true);\n}\n\nstring CompilerMSL::get_type_address_space(const SPIRType &type, uint32_t id, bool argument)\n{\n\t// This can be called for variable pointer contexts as well, so be very careful about which method we choose.\n\tBitset flags;\n\tauto *var = maybe_get<SPIRVariable>(id);\n\tif (var && type.basetype == SPIRType::Struct &&\n\t    (has_decoration(type.self, DecorationBlock) || has_decoration(type.self, DecorationBufferBlock)))\n\t\tflags = get_buffer_block_flags(id);\n\telse\n\t\tflags = get_decoration_bitset(id);\n\n\tconst char *addr_space = nullptr;\n\tswitch (type.storage)\n\t{\n\tcase StorageClassWorkgroup:\n\t\taddr_space = \"threadgroup\";\n\t\tbreak;\n\n\tcase StorageClassStorageBuffer:\n\tcase StorageClassPhysicalStorageBuffer:\n\t{\n\t\t// For arguments from variable pointers, we use the write count deduction, so\n\t\t// we should not assume any constness here. Only for global SSBOs.\n\t\tbool readonly = false;\n\t\tif (!var || has_decoration(type.self, DecorationBlock))\n\t\t\treadonly = flags.get(DecorationNonWritable);\n\n\t\taddr_space = readonly ? \"const device\" : \"device\";\n\t\tbreak;\n\t}\n\n\tcase StorageClassUniform:\n\tcase StorageClassUniformConstant:\n\tcase StorageClassPushConstant:\n\t\tif (type.basetype == SPIRType::Struct)\n\t\t{\n\t\t\tbool ssbo = has_decoration(type.self, DecorationBufferBlock);\n\t\t\tif (ssbo)\n\t\t\t\taddr_space = flags.get(DecorationNonWritable) ? \"const device\" : \"device\";\n\t\t\telse\n\t\t\t\taddr_space = \"constant\";\n\t\t}\n\t\telse if (!argument)\n\t\t{\n\t\t\taddr_space = \"constant\";\n\t\t}\n\t\telse if (type_is_msl_framebuffer_fetch(type))\n\t\t{\n\t\t\t// Subpass inputs are passed around by value.\n\t\t\taddr_space = \"\";\n\t\t}\n\t\tbreak;\n\n\tcase StorageClassFunction:\n\tcase StorageClassGeneric:\n\t\tbreak;\n\n\tcase StorageClassInput:\n\t\tif (is_tesc_shader() && var && var->basevariable == stage_in_ptr_var_id)\n\t\t\taddr_space = msl_options.multi_patch_workgroup ? \"const device\" : \"threadgroup\";\n\t\t// Don't pass tessellation levels in the device AS; we load and convert them\n\t\t// to float manually.\n\t\tif (is_tese_shader() && msl_options.raw_buffer_tese_input && var)\n\t\t{\n\t\t\tbool is_stage_in = var->basevariable == stage_in_ptr_var_id;\n\t\t\tbool is_patch_stage_in = has_decoration(var->self, DecorationPatch);\n\t\t\tbool is_builtin = has_decoration(var->self, DecorationBuiltIn);\n\t\t\tBuiltIn builtin = (BuiltIn)get_decoration(var->self, DecorationBuiltIn);\n\t\t\tbool is_tess_level = is_builtin && (builtin == BuiltInTessLevelOuter || builtin == BuiltInTessLevelInner);\n\t\t\tif (is_stage_in || (is_patch_stage_in && !is_tess_level))\n\t\t\t\taddr_space = \"const device\";\n\t\t}\n\t\tif (get_execution_model() == ExecutionModelFragment && var && var->basevariable == stage_in_var_id)\n\t\t\taddr_space = \"thread\";\n\t\tbreak;\n\n\tcase StorageClassOutput:\n\t\tif (capture_output_to_buffer)\n\t\t{\n\t\t\tif (var && type.storage == StorageClassOutput)\n\t\t\t{\n\t\t\t\tbool is_masked = is_stage_output_variable_masked(*var);\n\n\t\t\t\tif (is_masked)\n\t\t\t\t{\n\t\t\t\t\tif (is_tessellation_shader())\n\t\t\t\t\t\taddr_space = \"threadgroup\";\n\t\t\t\t\telse\n\t\t\t\t\t\taddr_space = \"thread\";\n\t\t\t\t}\n\t\t\t\telse if (variable_decl_is_remapped_storage(*var, StorageClassWorkgroup))\n\t\t\t\t\taddr_space = \"threadgroup\";\n\t\t\t}\n\n\t\t\tif (!addr_space)\n\t\t\t\taddr_space = \"device\";\n\t\t}\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\tif (!addr_space)\n\t{\n\t\t// No address space for plain values.\n\t\taddr_space = type.pointer || (argument && type.basetype == SPIRType::ControlPointArray) ? \"thread\" : \"\";\n\t}\n\n\treturn join(flags.get(DecorationVolatile) || flags.get(DecorationCoherent) ? \"volatile \" : \"\", addr_space);\n}\n\nconst char *CompilerMSL::to_restrict(uint32_t id, bool space)\n{\n\t// This can be called for variable pointer contexts as well, so be very careful about which method we choose.\n\tBitset flags;\n\tif (ir.ids[id].get_type() == TypeVariable)\n\t{\n\t\tuint32_t type_id = expression_type_id(id);\n\t\tauto &type = expression_type(id);\n\t\tif (type.basetype == SPIRType::Struct &&\n\t\t    (has_decoration(type_id, DecorationBlock) || has_decoration(type_id, DecorationBufferBlock)))\n\t\t\tflags = get_buffer_block_flags(id);\n\t\telse\n\t\t\tflags = get_decoration_bitset(id);\n\t}\n\telse\n\t\tflags = get_decoration_bitset(id);\n\n\treturn flags.get(DecorationRestrict) || flags.get(DecorationRestrictPointerEXT) ?\n\t       (space ? \"__restrict \" : \"__restrict\") : \"\";\n}\n\nstring CompilerMSL::entry_point_arg_stage_in()\n{\n\tstring decl;\n\n\tif ((is_tesc_shader() && msl_options.multi_patch_workgroup) ||\n\t    (is_tese_shader() && msl_options.raw_buffer_tese_input))\n\t\treturn decl;\n\n\t// Stage-in structure\n\tuint32_t stage_in_id;\n\tif (is_tese_shader())\n\t\tstage_in_id = patch_stage_in_var_id;\n\telse\n\t\tstage_in_id = stage_in_var_id;\n\n\tif (stage_in_id)\n\t{\n\t\tauto &var = get<SPIRVariable>(stage_in_id);\n\t\tauto &type = get_variable_data_type(var);\n\n\t\tadd_resource_name(var.self);\n\t\tdecl = join(type_to_glsl(type), \" \", to_name(var.self), \" [[stage_in]]\");\n\t}\n\n\treturn decl;\n}\n\n// Returns true if this input builtin should be a direct parameter on a shader function parameter list,\n// and false for builtins that should be passed or calculated some other way.\nbool CompilerMSL::is_direct_input_builtin(BuiltIn bi_type)\n{\n\tswitch (bi_type)\n\t{\n\t// Vertex function in\n\tcase BuiltInVertexId:\n\tcase BuiltInVertexIndex:\n\tcase BuiltInBaseVertex:\n\tcase BuiltInInstanceId:\n\tcase BuiltInInstanceIndex:\n\tcase BuiltInBaseInstance:\n\t\treturn get_execution_model() != ExecutionModelVertex || !msl_options.vertex_for_tessellation;\n\t// Tess. control function in\n\tcase BuiltInPosition:\n\tcase BuiltInPointSize:\n\tcase BuiltInClipDistance:\n\tcase BuiltInCullDistance:\n\tcase BuiltInPatchVertices:\n\t\treturn false;\n\tcase BuiltInInvocationId:\n\tcase BuiltInPrimitiveId:\n\t\treturn !is_tesc_shader() || !msl_options.multi_patch_workgroup;\n\t// Tess. evaluation function in\n\tcase BuiltInTessLevelInner:\n\tcase BuiltInTessLevelOuter:\n\t\treturn false;\n\t// Fragment function in\n\tcase BuiltInSamplePosition:\n\tcase BuiltInHelperInvocation:\n\tcase BuiltInBaryCoordKHR:\n\tcase BuiltInBaryCoordNoPerspKHR:\n\t\treturn false;\n\tcase BuiltInViewIndex:\n\t\treturn get_execution_model() == ExecutionModelFragment && msl_options.multiview &&\n\t\t       msl_options.multiview_layered_rendering;\n\t// Compute function in\n\tcase BuiltInSubgroupId:\n\tcase BuiltInNumSubgroups:\n\t\treturn !msl_options.emulate_subgroups;\n\t// Any stage function in\n\tcase BuiltInDeviceIndex:\n\tcase BuiltInSubgroupEqMask:\n\tcase BuiltInSubgroupGeMask:\n\tcase BuiltInSubgroupGtMask:\n\tcase BuiltInSubgroupLeMask:\n\tcase BuiltInSubgroupLtMask:\n\t\treturn false;\n\tcase BuiltInSubgroupSize:\n\t\tif (msl_options.fixed_subgroup_size != 0)\n\t\t\treturn false;\n\t\t/* fallthrough */\n\tcase BuiltInSubgroupLocalInvocationId:\n\t\treturn !msl_options.emulate_subgroups;\n\tdefault:\n\t\treturn true;\n\t}\n}\n\n// Returns true if this is a fragment shader that runs per sample, and false otherwise.\nbool CompilerMSL::is_sample_rate() const\n{\n\tauto &caps = get_declared_capabilities();\n\treturn get_execution_model() == ExecutionModelFragment &&\n\t       (msl_options.force_sample_rate_shading ||\n\t        std::find(caps.begin(), caps.end(), CapabilitySampleRateShading) != caps.end() ||\n\t        (msl_options.use_framebuffer_fetch_subpasses && need_subpass_input_ms));\n}\n\nbool CompilerMSL::is_intersection_query() const\n{\n\tauto &caps = get_declared_capabilities();\n\treturn std::find(caps.begin(), caps.end(), CapabilityRayQueryKHR) != caps.end();\n}\n\nvoid CompilerMSL::entry_point_args_builtin(string &ep_args)\n{\n\t// Builtin variables\n\tSmallVector<pair<SPIRVariable *, BuiltIn>, 8> active_builtins;\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t var_id, SPIRVariable &var) {\n\t\tif (var.storage != StorageClassInput)\n\t\t\treturn;\n\n\t\tauto bi_type = BuiltIn(get_decoration(var_id, DecorationBuiltIn));\n\n\t\t// Don't emit SamplePosition as a separate parameter. In the entry\n\t\t// point, we get that by calling get_sample_position() on the sample ID.\n\t\tif (is_builtin_variable(var) &&\n\t\t    get_variable_data_type(var).basetype != SPIRType::Struct &&\n\t\t    get_variable_data_type(var).basetype != SPIRType::ControlPointArray)\n\t\t{\n\t\t\t// If the builtin is not part of the active input builtin set, don't emit it.\n\t\t\t// Relevant for multiple entry-point modules which might declare unused builtins.\n\t\t\tif (!active_input_builtins.get(bi_type) || !interface_variable_exists_in_entry_point(var_id))\n\t\t\t\treturn;\n\n\t\t\t// Remember this variable. We may need to correct its type.\n\t\t\tactive_builtins.push_back(make_pair(&var, bi_type));\n\n\t\t\tif (is_direct_input_builtin(bi_type))\n\t\t\t{\n\t\t\t\tif (!ep_args.empty())\n\t\t\t\t\tep_args += \", \";\n\n\t\t\t\t// Handle HLSL-style 0-based vertex/instance index.\n\t\t\t\tbuiltin_declaration = true;\n\n\t\t\t\t// Handle different MSL gl_TessCoord types. (float2, float3)\n\t\t\t\tif (bi_type == BuiltInTessCoord && get_entry_point().flags.get(ExecutionModeQuads))\n\t\t\t\t\tep_args += \"float2 \" + to_expression(var_id) + \"In\";\n\t\t\t\telse\n\t\t\t\t\tep_args += builtin_type_decl(bi_type, var_id) + \" \" + to_expression(var_id);\n\n\t\t\t\tep_args += string(\" [[\") + builtin_qualifier(bi_type);\n\t\t\t\tif (bi_type == BuiltInSampleMask && get_entry_point().flags.get(ExecutionModePostDepthCoverage))\n\t\t\t\t{\n\t\t\t\t\tif (!msl_options.supports_msl_version(2))\n\t\t\t\t\t\tSPIRV_CROSS_THROW(\"Post-depth coverage requires MSL 2.0.\");\n\t\t\t\t\tif (msl_options.is_macos() && !msl_options.supports_msl_version(2, 3))\n\t\t\t\t\t\tSPIRV_CROSS_THROW(\"Post-depth coverage on Mac requires MSL 2.3.\");\n\t\t\t\t\tep_args += \", post_depth_coverage\";\n\t\t\t\t}\n\t\t\t\tep_args += \"]]\";\n\t\t\t\tbuiltin_declaration = false;\n\t\t\t}\n\t\t}\n\n\t\tif (has_extended_decoration(var_id, SPIRVCrossDecorationBuiltInDispatchBase))\n\t\t{\n\t\t\t// This is a special implicit builtin, not corresponding to any SPIR-V builtin,\n\t\t\t// which holds the base that was passed to vkCmdDispatchBase() or vkCmdDrawIndexed(). If it's present,\n\t\t\t// assume we emitted it for a good reason.\n\t\t\tassert(msl_options.supports_msl_version(1, 2));\n\t\t\tif (!ep_args.empty())\n\t\t\t\tep_args += \", \";\n\n\t\t\tep_args += type_to_glsl(get_variable_data_type(var)) + \" \" + to_expression(var_id) + \" [[grid_origin]]\";\n\t\t}\n\n\t\tif (has_extended_decoration(var_id, SPIRVCrossDecorationBuiltInStageInputSize))\n\t\t{\n\t\t\t// This is another special implicit builtin, not corresponding to any SPIR-V builtin,\n\t\t\t// which holds the number of vertices and instances to draw. If it's present,\n\t\t\t// assume we emitted it for a good reason.\n\t\t\tassert(msl_options.supports_msl_version(1, 2));\n\t\t\tif (!ep_args.empty())\n\t\t\t\tep_args += \", \";\n\n\t\t\tep_args += type_to_glsl(get_variable_data_type(var)) + \" \" + to_expression(var_id) + \" [[grid_size]]\";\n\t\t}\n\t});\n\n\t// Correct the types of all encountered active builtins. We couldn't do this before\n\t// because ensure_correct_builtin_type() may increase the bound, which isn't allowed\n\t// while iterating over IDs.\n\tfor (auto &var : active_builtins)\n\t\tvar.first->basetype = ensure_correct_builtin_type(var.first->basetype, var.second);\n\n\t// Handle HLSL-style 0-based vertex/instance index.\n\tif (needs_base_vertex_arg == TriState::Yes)\n\t\tep_args += built_in_func_arg(BuiltInBaseVertex, !ep_args.empty());\n\n\tif (needs_base_instance_arg == TriState::Yes)\n\t\tep_args += built_in_func_arg(BuiltInBaseInstance, !ep_args.empty());\n\n\tif (capture_output_to_buffer)\n\t{\n\t\t// Add parameters to hold the indirect draw parameters and the shader output. This has to be handled\n\t\t// specially because it needs to be a pointer, not a reference.\n\t\tif (stage_out_var_id)\n\t\t{\n\t\t\tif (!ep_args.empty())\n\t\t\t\tep_args += \", \";\n\t\t\tep_args += join(\"device \", type_to_glsl(get_stage_out_struct_type()), \"* \", output_buffer_var_name,\n\t\t\t                \" [[buffer(\", msl_options.shader_output_buffer_index, \")]]\");\n\t\t}\n\n\t\tif (is_tesc_shader())\n\t\t{\n\t\t\tif (!ep_args.empty())\n\t\t\t\tep_args += \", \";\n\t\t\tep_args +=\n\t\t\t    join(\"constant uint* spvIndirectParams [[buffer(\", msl_options.indirect_params_buffer_index, \")]]\");\n\t\t}\n\t\telse if (stage_out_var_id &&\n\t\t         !(get_execution_model() == ExecutionModelVertex && msl_options.vertex_for_tessellation))\n\t\t{\n\t\t\tif (!ep_args.empty())\n\t\t\t\tep_args += \", \";\n\t\t\tep_args +=\n\t\t\t    join(\"device uint* spvIndirectParams [[buffer(\", msl_options.indirect_params_buffer_index, \")]]\");\n\t\t}\n\n\t\tif (get_execution_model() == ExecutionModelVertex && msl_options.vertex_for_tessellation &&\n\t\t    (active_input_builtins.get(BuiltInVertexIndex) || active_input_builtins.get(BuiltInVertexId)) &&\n\t\t    msl_options.vertex_index_type != Options::IndexType::None)\n\t\t{\n\t\t\t// Add the index buffer so we can set gl_VertexIndex correctly.\n\t\t\tif (!ep_args.empty())\n\t\t\t\tep_args += \", \";\n\t\t\tswitch (msl_options.vertex_index_type)\n\t\t\t{\n\t\t\tcase Options::IndexType::None:\n\t\t\t\tbreak;\n\t\t\tcase Options::IndexType::UInt16:\n\t\t\t\tep_args += join(\"const device ushort* \", index_buffer_var_name, \" [[buffer(\",\n\t\t\t\t                msl_options.shader_index_buffer_index, \")]]\");\n\t\t\t\tbreak;\n\t\t\tcase Options::IndexType::UInt32:\n\t\t\t\tep_args += join(\"const device uint* \", index_buffer_var_name, \" [[buffer(\",\n\t\t\t\t                msl_options.shader_index_buffer_index, \")]]\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Tessellation control shaders get three additional parameters:\n\t\t// a buffer to hold the per-patch data, a buffer to hold the per-patch\n\t\t// tessellation levels, and a block of workgroup memory to hold the\n\t\t// input control point data.\n\t\tif (is_tesc_shader())\n\t\t{\n\t\t\tif (patch_stage_out_var_id)\n\t\t\t{\n\t\t\t\tif (!ep_args.empty())\n\t\t\t\t\tep_args += \", \";\n\t\t\t\tep_args +=\n\t\t\t\t    join(\"device \", type_to_glsl(get_patch_stage_out_struct_type()), \"* \", patch_output_buffer_var_name,\n\t\t\t\t         \" [[buffer(\", convert_to_string(msl_options.shader_patch_output_buffer_index), \")]]\");\n\t\t\t}\n\t\t\tif (!ep_args.empty())\n\t\t\t\tep_args += \", \";\n\t\t\tep_args += join(\"device \", get_tess_factor_struct_name(), \"* \", tess_factor_buffer_var_name, \" [[buffer(\",\n\t\t\t                convert_to_string(msl_options.shader_tess_factor_buffer_index), \")]]\");\n\n\t\t\t// Initializer for tess factors must be handled specially since it's never declared as a normal variable.\n\t\t\tuint32_t outer_factor_initializer_id = 0;\n\t\t\tuint32_t inner_factor_initializer_id = 0;\n\t\t\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\t\t\tif (!has_decoration(var.self, DecorationBuiltIn) || var.storage != StorageClassOutput || !var.initializer)\n\t\t\t\t\treturn;\n\n\t\t\t\tBuiltIn builtin = BuiltIn(get_decoration(var.self, DecorationBuiltIn));\n\t\t\t\tif (builtin == BuiltInTessLevelInner)\n\t\t\t\t\tinner_factor_initializer_id = var.initializer;\n\t\t\t\telse if (builtin == BuiltInTessLevelOuter)\n\t\t\t\t\touter_factor_initializer_id = var.initializer;\n\t\t\t});\n\n\t\t\tconst SPIRConstant *c = nullptr;\n\n\t\t\tif (outer_factor_initializer_id && (c = maybe_get<SPIRConstant>(outer_factor_initializer_id)))\n\t\t\t{\n\t\t\t\tauto &entry_func = get<SPIRFunction>(ir.default_entry_point);\n\t\t\t\tentry_func.fixup_hooks_in.push_back(\n\t\t\t\t    [=]()\n\t\t\t\t    {\n\t\t\t\t\t    uint32_t components = is_tessellating_triangles() ? 3 : 4;\n\t\t\t\t\t    for (uint32_t i = 0; i < components; i++)\n\t\t\t\t\t    {\n\t\t\t\t\t\t    statement(builtin_to_glsl(BuiltInTessLevelOuter, StorageClassOutput), \"[\", i,\n\t\t\t\t\t\t              \"] = \", \"half(\", to_expression(c->subconstants[i]), \");\");\n\t\t\t\t\t    }\n\t\t\t\t    });\n\t\t\t}\n\n\t\t\tif (inner_factor_initializer_id && (c = maybe_get<SPIRConstant>(inner_factor_initializer_id)))\n\t\t\t{\n\t\t\t\tauto &entry_func = get<SPIRFunction>(ir.default_entry_point);\n\t\t\t\tif (is_tessellating_triangles())\n\t\t\t\t{\n\t\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\t\tstatement(builtin_to_glsl(BuiltInTessLevelInner, StorageClassOutput), \" = \", \"half(\",\n\t\t\t\t\t\t          to_expression(c->subconstants[0]), \");\");\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\t\tfor (uint32_t i = 0; i < 2; i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstatement(builtin_to_glsl(BuiltInTessLevelInner, StorageClassOutput), \"[\", i, \"] = \",\n\t\t\t\t\t\t\t          \"half(\", to_expression(c->subconstants[i]), \");\");\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (stage_in_var_id)\n\t\t\t{\n\t\t\t\tif (!ep_args.empty())\n\t\t\t\t\tep_args += \", \";\n\t\t\t\tif (msl_options.multi_patch_workgroup)\n\t\t\t\t{\n\t\t\t\t\tep_args += join(\"device \", type_to_glsl(get_stage_in_struct_type()), \"* \", input_buffer_var_name,\n\t\t\t\t\t                \" [[buffer(\", convert_to_string(msl_options.shader_input_buffer_index), \")]]\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tep_args += join(\"threadgroup \", type_to_glsl(get_stage_in_struct_type()), \"* \", input_wg_var_name,\n\t\t\t\t\t                \" [[threadgroup(\", convert_to_string(msl_options.shader_input_wg_index), \")]]\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Tessellation evaluation shaders get three additional parameters:\n\t// a buffer for the per-patch data, a buffer for the per-patch\n\t// tessellation levels, and a buffer for the control point data.\n\tif (is_tese_shader() && msl_options.raw_buffer_tese_input)\n\t{\n\t\tif (patch_stage_in_var_id)\n\t\t{\n\t\t\tif (!ep_args.empty())\n\t\t\t\tep_args += \", \";\n\t\t\tep_args +=\n\t\t\t    join(\"const device \", type_to_glsl(get_patch_stage_in_struct_type()), \"* \", patch_input_buffer_var_name,\n\t\t\t         \" [[buffer(\", convert_to_string(msl_options.shader_patch_input_buffer_index), \")]]\");\n\t\t}\n\n\t\tif (tess_level_inner_var_id || tess_level_outer_var_id)\n\t\t{\n\t\t\tif (!ep_args.empty())\n\t\t\t\tep_args += \", \";\n\t\t\tep_args += join(\"const device \", get_tess_factor_struct_name(), \"* \", tess_factor_buffer_var_name,\n\t\t\t                \" [[buffer(\", convert_to_string(msl_options.shader_tess_factor_buffer_index), \")]]\");\n\t\t}\n\n\t\tif (stage_in_var_id)\n\t\t{\n\t\t\tif (!ep_args.empty())\n\t\t\t\tep_args += \", \";\n\t\t\tep_args += join(\"const device \", type_to_glsl(get_stage_in_struct_type()), \"* \", input_buffer_var_name,\n\t\t\t                \" [[buffer(\", convert_to_string(msl_options.shader_input_buffer_index), \")]]\");\n\t\t}\n\t}\n}\n\nstring CompilerMSL::entry_point_args_argument_buffer(bool append_comma)\n{\n\tstring ep_args = entry_point_arg_stage_in();\n\tBitset claimed_bindings;\n\n\tfor (uint32_t i = 0; i < kMaxArgumentBuffers; i++)\n\t{\n\t\tuint32_t id = argument_buffer_ids[i];\n\t\tif (id == 0)\n\t\t\tcontinue;\n\n\t\tadd_resource_name(id);\n\t\tauto &var = get<SPIRVariable>(id);\n\t\tauto &type = get_variable_data_type(var);\n\n\t\tif (!ep_args.empty())\n\t\t\tep_args += \", \";\n\n\t\t// Check if the argument buffer binding itself has been remapped.\n\t\tuint32_t buffer_binding;\n\t\tauto itr = resource_bindings.find({ get_entry_point().model, i, kArgumentBufferBinding });\n\t\tif (itr != end(resource_bindings))\n\t\t{\n\t\t\tbuffer_binding = itr->second.first.msl_buffer;\n\t\t\titr->second.second = true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// As a fallback, directly map desc set <-> binding.\n\t\t\t// If that was taken, take the next buffer binding.\n\t\t\tif (claimed_bindings.get(i))\n\t\t\t\tbuffer_binding = next_metal_resource_index_buffer;\n\t\t\telse\n\t\t\t\tbuffer_binding = i;\n\t\t}\n\n\t\tclaimed_bindings.set(buffer_binding);\n\n\t\tep_args += get_argument_address_space(var) + \" \" + type_to_glsl(type) + \"& \" + to_restrict(id, true) + to_name(id);\n\t\tep_args += \" [[buffer(\" + convert_to_string(buffer_binding) + \")]]\";\n\n\t\tnext_metal_resource_index_buffer = max(next_metal_resource_index_buffer, buffer_binding + 1);\n\t}\n\n\tentry_point_args_discrete_descriptors(ep_args);\n\tentry_point_args_builtin(ep_args);\n\n\tif (!ep_args.empty() && append_comma)\n\t\tep_args += \", \";\n\n\treturn ep_args;\n}\n\nconst MSLConstexprSampler *CompilerMSL::find_constexpr_sampler(uint32_t id) const\n{\n\t// Try by ID.\n\t{\n\t\tauto itr = constexpr_samplers_by_id.find(id);\n\t\tif (itr != end(constexpr_samplers_by_id))\n\t\t\treturn &itr->second;\n\t}\n\n\t// Try by binding.\n\t{\n\t\tuint32_t desc_set = get_decoration(id, DecorationDescriptorSet);\n\t\tuint32_t binding = get_decoration(id, DecorationBinding);\n\n\t\tauto itr = constexpr_samplers_by_binding.find({ desc_set, binding });\n\t\tif (itr != end(constexpr_samplers_by_binding))\n\t\t\treturn &itr->second;\n\t}\n\n\treturn nullptr;\n}\n\nvoid CompilerMSL::entry_point_args_discrete_descriptors(string &ep_args)\n{\n\t// Output resources, sorted by resource index & type\n\t// We need to sort to work around a bug on macOS 10.13 with NVidia drivers where switching between shaders\n\t// with different order of buffers can result in issues with buffer assignments inside the driver.\n\tstruct Resource\n\t{\n\t\tSPIRVariable *var;\n\t\tSPIRVariable *descriptor_alias;\n\t\tstring name;\n\t\tSPIRType::BaseType basetype;\n\t\tuint32_t index;\n\t\tuint32_t plane;\n\t\tuint32_t secondary_index;\n\t};\n\n\tSmallVector<Resource> resources;\n\n\tentry_point_bindings.clear();\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t var_id, SPIRVariable &var) {\n\t\tif ((var.storage == StorageClassUniform || var.storage == StorageClassUniformConstant ||\n\t\t     var.storage == StorageClassPushConstant || var.storage == StorageClassStorageBuffer) &&\n\t\t    !is_hidden_variable(var))\n\t\t{\n\t\t\tauto &type = get_variable_data_type(var);\n\n\t\t\tif (is_supported_argument_buffer_type(type) && var.storage != StorageClassPushConstant)\n\t\t\t{\n\t\t\t\tuint32_t desc_set = get_decoration(var_id, DecorationDescriptorSet);\n\t\t\t\tif (descriptor_set_is_argument_buffer(desc_set))\n\t\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Handle descriptor aliasing. We can handle aliasing of buffers by casting pointers,\n\t\t\t// but not for typed resources.\n\t\t\tSPIRVariable *descriptor_alias = nullptr;\n\t\t\tif (var.storage == StorageClassUniform || var.storage == StorageClassStorageBuffer)\n\t\t\t{\n\t\t\t\tfor (auto &resource : resources)\n\t\t\t\t{\n\t\t\t\t\tif (get_decoration(resource.var->self, DecorationDescriptorSet) ==\n\t\t\t\t\t    get_decoration(var_id, DecorationDescriptorSet) &&\n\t\t\t\t\t    get_decoration(resource.var->self, DecorationBinding) ==\n\t\t\t\t\t    get_decoration(var_id, DecorationBinding) &&\n\t\t\t\t\t    resource.basetype == SPIRType::Struct && type.basetype == SPIRType::Struct &&\n\t\t\t\t\t    (resource.var->storage == StorageClassUniform ||\n\t\t\t\t\t     resource.var->storage == StorageClassStorageBuffer))\n\t\t\t\t\t{\n\t\t\t\t\t\tdescriptor_alias = resource.var;\n\t\t\t\t\t\t// Self-reference marks that we should declare the resource,\n\t\t\t\t\t\t// and it's being used as an alias (so we can emit void* instead).\n\t\t\t\t\t\tresource.descriptor_alias = resource.var;\n\t\t\t\t\t\t// Need to promote interlocked usage so that the primary declaration is correct.\n\t\t\t\t\t\tif (interlocked_resources.count(var_id))\n\t\t\t\t\t\t\tinterlocked_resources.insert(resource.var->self);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst MSLConstexprSampler *constexpr_sampler = nullptr;\n\t\t\tif (type.basetype == SPIRType::SampledImage || type.basetype == SPIRType::Sampler)\n\t\t\t{\n\t\t\t\tconstexpr_sampler = find_constexpr_sampler(var_id);\n\t\t\t\tif (constexpr_sampler)\n\t\t\t\t{\n\t\t\t\t\t// Mark this ID as a constexpr sampler for later in case it came from set/bindings.\n\t\t\t\t\tconstexpr_samplers_by_id[var_id] = *constexpr_sampler;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Emulate texture2D atomic operations\n\t\t\tuint32_t secondary_index = 0;\n\t\t\tif (atomic_image_vars_emulated.count(var.self))\n\t\t\t{\n\t\t\t\tsecondary_index = get_metal_resource_index(var, SPIRType::AtomicCounter, 0);\n\t\t\t}\n\n\t\t\tif (type.basetype == SPIRType::SampledImage)\n\t\t\t{\n\t\t\t\tadd_resource_name(var_id);\n\n\t\t\t\tuint32_t plane_count = 1;\n\t\t\t\tif (constexpr_sampler && constexpr_sampler->ycbcr_conversion_enable)\n\t\t\t\t\tplane_count = constexpr_sampler->planes;\n\n\t\t\t\tentry_point_bindings.push_back(&var);\n\t\t\t\tfor (uint32_t i = 0; i < plane_count; i++)\n\t\t\t\t\tresources.push_back({ &var, descriptor_alias, to_name(var_id), SPIRType::Image,\n\t\t\t\t\t                      get_metal_resource_index(var, SPIRType::Image, i), i, secondary_index });\n\n\t\t\t\tif (type.image.dim != DimBuffer && !constexpr_sampler)\n\t\t\t\t{\n\t\t\t\t\tresources.push_back({ &var, descriptor_alias, to_sampler_expression(var_id), SPIRType::Sampler,\n\t\t\t\t\t                      get_metal_resource_index(var, SPIRType::Sampler), 0, 0 });\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (!constexpr_sampler)\n\t\t\t{\n\t\t\t\t// constexpr samplers are not declared as resources.\n\t\t\t\tadd_resource_name(var_id);\n\n\t\t\t\t// Don't allocate resource indices for aliases.\n\t\t\t\tuint32_t resource_index = ~0u;\n\t\t\t\tif (!descriptor_alias)\n\t\t\t\t\tresource_index = get_metal_resource_index(var, type.basetype);\n\n\t\t\t\tentry_point_bindings.push_back(&var);\n\t\t\t\tresources.push_back({ &var, descriptor_alias, to_name(var_id), type.basetype,\n\t\t\t\t                      resource_index, 0, secondary_index });\n\t\t\t}\n\t\t}\n\t});\n\n\tstable_sort(resources.begin(), resources.end(),\n\t            [](const Resource &lhs, const Resource &rhs)\n\t            { return tie(lhs.basetype, lhs.index) < tie(rhs.basetype, rhs.index); });\n\n\tfor (auto &r : resources)\n\t{\n\t\tauto &var = *r.var;\n\t\tauto &type = get_variable_data_type(var);\n\n\t\tuint32_t var_id = var.self;\n\n\t\tswitch (r.basetype)\n\t\t{\n\t\tcase SPIRType::Struct:\n\t\t{\n\t\t\tauto &m = ir.meta[type.self];\n\t\t\tif (m.members.size() == 0)\n\t\t\t\tbreak;\n\n\t\t\tif (r.descriptor_alias)\n\t\t\t{\n\t\t\t\tif (r.var == r.descriptor_alias)\n\t\t\t\t{\n\t\t\t\t\tauto primary_name = join(\"spvBufferAliasSet\",\n\t\t\t\t\t                         get_decoration(var_id, DecorationDescriptorSet),\n\t\t\t\t\t                         \"Binding\",\n\t\t\t\t\t                         get_decoration(var_id, DecorationBinding));\n\n\t\t\t\t\t// Declare the primary alias as void*\n\t\t\t\t\tif (!ep_args.empty())\n\t\t\t\t\t\tep_args += \", \";\n\t\t\t\t\tep_args += get_argument_address_space(var) + \" void* \" + primary_name;\n\t\t\t\t\tep_args += \" [[buffer(\" + convert_to_string(r.index) + \")\";\n\t\t\t\t\tif (interlocked_resources.count(var_id))\n\t\t\t\t\t\tep_args += \", raster_order_group(0)\";\n\t\t\t\t\tep_args += \"]]\";\n\t\t\t\t}\n\n\t\t\t\tbuffer_aliases_discrete.push_back(r.var->self);\n\t\t\t}\n\t\t\telse if (!type.array.empty())\n\t\t\t{\n\t\t\t\tif (type.array.size() > 1)\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Arrays of arrays of buffers are not supported.\");\n\n\t\t\t\tis_using_builtin_array = true;\n\t\t\t\tif (is_var_runtime_size_array(var))\n\t\t\t\t{\n\t\t\t\t\tadd_spv_func_and_recompile(SPVFuncImplVariableDescriptorArray);\n\t\t\t\t\tif (!ep_args.empty())\n\t\t\t\t\t\tep_args += \", \";\n\t\t\t\t\tconst bool ssbo = has_decoration(type.self, DecorationBufferBlock);\n\t\t\t\t\tif ((var.storage == spv::StorageClassStorageBuffer || ssbo) &&\n\t\t\t\t\t    msl_options.runtime_array_rich_descriptor)\n\t\t\t\t\t{\n\t\t\t\t\t\tadd_spv_func_and_recompile(SPVFuncImplVariableSizedDescriptor);\n\t\t\t\t\t\tep_args += \"const device spvBufferDescriptor<\" + get_argument_address_space(var) + \" \" +\n\t\t\t\t\t\t           type_to_glsl(type) + \"*>* \";\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tep_args += \"const device spvDescriptor<\" + get_argument_address_space(var) + \" \" +\n\t\t\t\t\t\t           type_to_glsl(type) + \"*>* \";\n\t\t\t\t\t}\n\t\t\t\t\tep_args += to_restrict(var_id, true) + r.name + \"_\";\n\t\t\t\t\tep_args += \" [[buffer(\" + convert_to_string(r.index) + \")\";\n\t\t\t\t\tif (interlocked_resources.count(var_id))\n\t\t\t\t\t\tep_args += \", raster_order_group(0)\";\n\t\t\t\t\tep_args += \"]]\";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tuint32_t array_size = get_resource_array_size(type, var_id);\n\t\t\t\t\tfor (uint32_t i = 0; i < array_size; ++i)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!ep_args.empty())\n\t\t\t\t\t\t\tep_args += \", \";\n\t\t\t\t\t\tep_args += get_argument_address_space(var) + \" \" + type_to_glsl(type) + \"* \" +\n\t\t\t\t\t\t           to_restrict(var_id, true) + r.name + \"_\" + convert_to_string(i);\n\t\t\t\t\t\tep_args += \" [[buffer(\" + convert_to_string(r.index + i) + \")\";\n\t\t\t\t\t\tif (interlocked_resources.count(var_id))\n\t\t\t\t\t\t\tep_args += \", raster_order_group(0)\";\n\t\t\t\t\t\tep_args += \"]]\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tis_using_builtin_array = false;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (!ep_args.empty())\n\t\t\t\t\tep_args += \", \";\n\t\t\t\tep_args += get_argument_address_space(var) + \" \";\n\n\t\t\t\tif (recursive_inputs.count(type.self))\n\t\t\t\t\tep_args += string(\"void* \") + to_restrict(var_id, true) + r.name + \"_vp\";\n\t\t\t\telse\n\t\t\t\t\tep_args += type_to_glsl(type) + \"& \" + to_restrict(var_id, true) + r.name;\n\n\t\t\t\tep_args += \" [[buffer(\" + convert_to_string(r.index) + \")\";\n\t\t\t\tif (interlocked_resources.count(var_id))\n\t\t\t\t\tep_args += \", raster_order_group(0)\";\n\t\t\t\tep_args += \"]]\";\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase SPIRType::Sampler:\n\t\t\tif (!ep_args.empty())\n\t\t\t\tep_args += \", \";\n\t\t\tep_args += sampler_type(type, var_id) + \" \" + r.name;\n\t\t\tif (is_var_runtime_size_array(var))\n\t\t\t\tep_args += \"_ [[buffer(\" + convert_to_string(r.index) + \")]]\";\n\t\t\telse\n\t\t\t\tep_args += \" [[sampler(\" + convert_to_string(r.index) + \")]]\";\n\t\t\tbreak;\n\t\tcase SPIRType::Image:\n\t\t{\n\t\t\tif (!ep_args.empty())\n\t\t\t\tep_args += \", \";\n\n\t\t\t// Use Metal's native frame-buffer fetch API for subpass inputs.\n\t\t\tconst auto &basetype = get<SPIRType>(var.basetype);\n\t\t\tif (!type_is_msl_framebuffer_fetch(basetype))\n\t\t\t{\n\t\t\t\tep_args += image_type_glsl(type, var_id) + \" \" + r.name;\n\t\t\t\tif (r.plane > 0)\n\t\t\t\t\tep_args += join(plane_name_suffix, r.plane);\n\n\t\t\t\tif (is_var_runtime_size_array(var))\n\t\t\t\t\tep_args += \"_ [[buffer(\" + convert_to_string(r.index) + \")\";\n\t\t\t\telse\n\t\t\t\t\tep_args += \" [[texture(\" + convert_to_string(r.index) + \")\";\n\n\t\t\t\tif (interlocked_resources.count(var_id))\n\t\t\t\t\tep_args += \", raster_order_group(0)\";\n\t\t\t\tep_args += \"]]\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (msl_options.is_macos() && !msl_options.supports_msl_version(2, 3))\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Framebuffer fetch on Mac is not supported before MSL 2.3.\");\n\t\t\t\tep_args += image_type_glsl(type, var_id) + \" \" + r.name;\n\t\t\t\tep_args += \" [[color(\" + convert_to_string(r.index) + \")]]\";\n\t\t\t}\n\n\t\t\t// Emulate texture2D atomic operations\n\t\t\tif (atomic_image_vars_emulated.count(var.self))\n\t\t\t{\n\t\t\t\tep_args += \", device atomic_\" + type_to_glsl(get<SPIRType>(basetype.image.type), 0);\n\t\t\t\tep_args += \"* \" + r.name + \"_atomic\";\n\t\t\t\tep_args += \" [[buffer(\" + convert_to_string(r.secondary_index) + \")\";\n\t\t\t\tif (interlocked_resources.count(var_id))\n\t\t\t\t\tep_args += \", raster_order_group(0)\";\n\t\t\t\tep_args += \"]]\";\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase SPIRType::AccelerationStructure:\n\t\t{\n\t\t\tif (is_var_runtime_size_array(var))\n\t\t\t{\n\t\t\t\tadd_spv_func_and_recompile(SPVFuncImplVariableDescriptor);\n\t\t\t\tconst auto &parent_type = get<SPIRType>(type.parent_type);\n\t\t\t\tif (!ep_args.empty())\n\t\t\t\t\tep_args += \", \";\n\t\t\t\tep_args += \"const device spvDescriptor<\" + type_to_glsl(parent_type) + \">* \" +\n\t\t\t\t           to_restrict(var_id, true) + r.name + \"_\";\n\t\t\t\tep_args += \" [[buffer(\" + convert_to_string(r.index) + \")]]\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (!ep_args.empty())\n\t\t\t\t\tep_args += \", \";\n\t\t\t\tep_args += type_to_glsl(type, var_id) + \" \" + r.name;\n\t\t\t\tep_args += \" [[buffer(\" + convert_to_string(r.index) + \")]]\";\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tif (!ep_args.empty())\n\t\t\t\tep_args += \", \";\n\t\t\tif (!type.pointer)\n\t\t\t\tep_args += get_type_address_space(get<SPIRType>(var.basetype), var_id) + \" \" +\n\t\t\t\t           type_to_glsl(type, var_id) + \"& \" + r.name;\n\t\t\telse\n\t\t\t\tep_args += type_to_glsl(type, var_id) + \" \" + r.name;\n\t\t\tep_args += \" [[buffer(\" + convert_to_string(r.index) + \")\";\n\t\t\tif (interlocked_resources.count(var_id))\n\t\t\t\tep_args += \", raster_order_group(0)\";\n\t\t\tep_args += \"]]\";\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n// Returns a string containing a comma-delimited list of args for the entry point function\n// This is the \"classic\" method of MSL 1 when we don't have argument buffer support.\nstring CompilerMSL::entry_point_args_classic(bool append_comma)\n{\n\tstring ep_args = entry_point_arg_stage_in();\n\tentry_point_args_discrete_descriptors(ep_args);\n\tentry_point_args_builtin(ep_args);\n\n\tif (!ep_args.empty() && append_comma)\n\t\tep_args += \", \";\n\n\treturn ep_args;\n}\n\nvoid CompilerMSL::fix_up_shader_inputs_outputs()\n{\n\tauto &entry_func = this->get<SPIRFunction>(ir.default_entry_point);\n\n\t// Emit a guard to ensure we don't execute beyond the last vertex.\n\t// Vertex shaders shouldn't have the problems with barriers in non-uniform control flow that\n\t// tessellation control shaders do, so early returns should be OK. We may need to revisit this\n\t// if it ever becomes possible to use barriers from a vertex shader.\n\tif (get_execution_model() == ExecutionModelVertex && msl_options.vertex_for_tessellation)\n\t{\n\t\tentry_func.fixup_hooks_in.push_back([this]() {\n\t\t\tstatement(\"if (any(\", to_expression(builtin_invocation_id_id),\n\t\t\t          \" >= \", to_expression(builtin_stage_input_size_id), \"))\");\n\t\t\tstatement(\"    return;\");\n\t\t});\n\t}\n\n\t// Look for sampled images and buffer. Add hooks to set up the swizzle constants or array lengths.\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {\n\t\tauto &type = get_variable_data_type(var);\n\t\tuint32_t var_id = var.self;\n\t\tbool ssbo = has_decoration(type.self, DecorationBufferBlock);\n\n\t\tif (var.storage == StorageClassUniformConstant && !is_hidden_variable(var))\n\t\t{\n\t\t\tif (msl_options.swizzle_texture_samples && has_sampled_images && is_sampled_image_type(type))\n\t\t\t{\n\t\t\t\tentry_func.fixup_hooks_in.push_back([this, &type, &var, var_id]() {\n\t\t\t\t\tbool is_array_type = !type.array.empty();\n\n\t\t\t\t\tuint32_t desc_set = get_decoration(var_id, DecorationDescriptorSet);\n\t\t\t\t\tif (descriptor_set_is_argument_buffer(desc_set))\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(\"constant uint\", is_array_type ? \"* \" : \"& \", to_swizzle_expression(var_id),\n\t\t\t\t\t\t          is_array_type ? \" = &\" : \" = \", to_name(argument_buffer_ids[desc_set]),\n\t\t\t\t\t\t          \".spvSwizzleConstants\", \"[\",\n\t\t\t\t\t\t          convert_to_string(get_metal_resource_index(var, SPIRType::Image)), \"];\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// If we have an array of images, we need to be able to index into it, so take a pointer instead.\n\t\t\t\t\t\tstatement(\"constant uint\", is_array_type ? \"* \" : \"& \", to_swizzle_expression(var_id),\n\t\t\t\t\t\t          is_array_type ? \" = &\" : \" = \", to_name(swizzle_buffer_id), \"[\",\n\t\t\t\t\t\t          convert_to_string(get_metal_resource_index(var, SPIRType::Image)), \"];\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\telse if ((var.storage == StorageClassStorageBuffer || (var.storage == StorageClassUniform && ssbo)) &&\n\t\t         !is_hidden_variable(var))\n\t\t{\n\t\t\tif (buffer_requires_array_length(var.self))\n\t\t\t{\n\t\t\t\tentry_func.fixup_hooks_in.push_back(\n\t\t\t\t    [this, &type, &var, var_id]()\n\t\t\t\t    {\n\t\t\t\t\t    bool is_array_type = !type.array.empty() && !is_var_runtime_size_array(var);\n\n\t\t\t\t\t    uint32_t desc_set = get_decoration(var_id, DecorationDescriptorSet);\n\t\t\t\t\t    if (descriptor_set_is_argument_buffer(desc_set))\n\t\t\t\t\t    {\n\t\t\t\t\t\t    statement(\"constant uint\", is_array_type ? \"* \" : \"& \", to_buffer_size_expression(var_id),\n\t\t\t\t\t\t              is_array_type ? \" = &\" : \" = \", to_name(argument_buffer_ids[desc_set]),\n\t\t\t\t\t\t              \".spvBufferSizeConstants\", \"[\",\n\t\t\t\t\t\t              convert_to_string(get_metal_resource_index(var, SPIRType::Image)), \"];\");\n\t\t\t\t\t    }\n\t\t\t\t\t    else\n\t\t\t\t\t    {\n\t\t\t\t\t\t    // If we have an array of images, we need to be able to index into it, so take a pointer instead.\n\t\t\t\t\t\t    statement(\"constant uint\", is_array_type ? \"* \" : \"& \", to_buffer_size_expression(var_id),\n\t\t\t\t\t\t              is_array_type ? \" = &\" : \" = \", to_name(buffer_size_buffer_id), \"[\",\n\t\t\t\t\t\t              convert_to_string(get_metal_resource_index(var, type.basetype)), \"];\");\n\t\t\t\t\t    }\n\t\t\t\t    });\n\t\t\t}\n\t\t}\n\n\t\tif (msl_options.replace_recursive_inputs && type_contains_recursion(type) &&\n\t\t    (var.storage == StorageClassUniform || var.storage == StorageClassUniformConstant ||\n\t\t     var.storage == StorageClassPushConstant || var.storage == StorageClassStorageBuffer))\n\t\t{\n\t\t\trecursive_inputs.insert(type.self);\n\t\t\tentry_func.fixup_hooks_in.push_back([this, &type, &var, var_id]() {\n\t\t\t\tauto addr_space = get_argument_address_space(var);\n\t\t\t\tauto var_name = to_name(var_id);\n\t\t\t\tstatement(addr_space, \" auto& \", to_restrict(var_id, true), var_name,\n\t\t\t\t          \" = *(\", addr_space, \" \", type_to_glsl(type), \"*)\", var_name, \"_vp;\");\n\t\t\t});\n\t\t}\n\t});\n\n\t// Builtin variables\n\tir.for_each_typed_id<SPIRVariable>([this, &entry_func](uint32_t, SPIRVariable &var) {\n\t\tuint32_t var_id = var.self;\n\t\tBuiltIn bi_type = ir.meta[var_id].decoration.builtin_type;\n\n\t\tif (var.storage != StorageClassInput && var.storage != StorageClassOutput)\n\t\t\treturn;\n\t\tif (!interface_variable_exists_in_entry_point(var.self))\n\t\t\treturn;\n\n\t\tif (var.storage == StorageClassInput && is_builtin_variable(var) && active_input_builtins.get(bi_type))\n\t\t{\n\t\t\tswitch (bi_type)\n\t\t\t{\n\t\t\tcase BuiltInSamplePosition:\n\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id), \" = get_sample_position(\",\n\t\t\t\t\t          to_expression(builtin_sample_id_id), \");\");\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase BuiltInFragCoord:\n\t\t\t\tif (is_sample_rate())\n\t\t\t\t{\n\t\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\t\tstatement(to_expression(var_id), \".xy += get_sample_position(\",\n\t\t\t\t\t\t          to_expression(builtin_sample_id_id), \") - 0.5;\");\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase BuiltInInvocationId:\n\t\t\t\t// This is direct-mapped without multi-patch workgroups.\n\t\t\t\tif (!is_tesc_shader() || !msl_options.multi_patch_workgroup)\n\t\t\t\t\tbreak;\n\n\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id), \" = \",\n\t\t\t\t\t          to_expression(builtin_invocation_id_id), \".x % \", this->get_entry_point().output_vertices,\n\t\t\t\t\t          \";\");\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase BuiltInPrimitiveId:\n\t\t\t\t// This is natively supported by fragment and tessellation evaluation shaders.\n\t\t\t\t// In tessellation control shaders, this is direct-mapped without multi-patch workgroups.\n\t\t\t\tif (!is_tesc_shader() || !msl_options.multi_patch_workgroup)\n\t\t\t\t\tbreak;\n\n\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id), \" = min(\",\n\t\t\t\t\t          to_expression(builtin_invocation_id_id), \".x / \", this->get_entry_point().output_vertices,\n\t\t\t\t\t          \", spvIndirectParams[1] - 1);\");\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase BuiltInPatchVertices:\n\t\t\t\tif (is_tese_shader())\n\t\t\t\t{\n\t\t\t\t\tif (msl_options.raw_buffer_tese_input)\n\t\t\t\t\t{\n\t\t\t\t\t\tentry_func.fixup_hooks_in.push_back(\n\t\t\t\t\t\t    [=]() {\n\t\t\t\t\t\t\t    statement(builtin_type_decl(bi_type), \" \", to_expression(var_id), \" = \",\n\t\t\t\t\t\t\t              get_entry_point().output_vertices, \";\");\n\t\t\t\t\t\t    });\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tentry_func.fixup_hooks_in.push_back(\n\t\t\t\t\t\t    [=]()\n\t\t\t\t\t\t    {\n\t\t\t\t\t\t\t    statement(builtin_type_decl(bi_type), \" \", to_expression(var_id), \" = \",\n\t\t\t\t\t\t\t              to_expression(patch_stage_in_var_id), \".gl_in.size();\");\n\t\t\t\t\t\t    });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id), \" = spvIndirectParams[0];\");\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase BuiltInTessCoord:\n\t\t\t\tif (get_entry_point().flags.get(ExecutionModeQuads))\n\t\t\t\t{\n\t\t\t\t\t// The entry point will only have a float2 TessCoord variable.\n\t\t\t\t\t// Pad to float3.\n\t\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\t\tauto name = builtin_to_glsl(BuiltInTessCoord, StorageClassInput);\n\t\t\t\t\t\tstatement(\"float3 \" + name + \" = float3(\" + name + \"In.x, \" + name + \"In.y, 0.0);\");\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Emit a fixup to account for the shifted domain. Don't do this for triangles;\n\t\t\t\t// MoltenVK will just reverse the winding order instead.\n\t\t\t\tif (msl_options.tess_domain_origin_lower_left && !is_tessellating_triangles())\n\t\t\t\t{\n\t\t\t\t\tstring tc = to_expression(var_id);\n\t\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() { statement(tc, \".y = 1.0 - \", tc, \".y;\"); });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase BuiltInSubgroupId:\n\t\t\t\tif (!msl_options.emulate_subgroups)\n\t\t\t\t\tbreak;\n\t\t\t\t// For subgroup emulation, this is the same as the local invocation index.\n\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id), \" = \",\n\t\t\t\t\t          to_expression(builtin_local_invocation_index_id), \";\");\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase BuiltInNumSubgroups:\n\t\t\t\tif (!msl_options.emulate_subgroups)\n\t\t\t\t\tbreak;\n\t\t\t\t// For subgroup emulation, this is the same as the workgroup size.\n\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\tauto &type = expression_type(builtin_workgroup_size_id);\n\t\t\t\t\tstring size_expr = to_expression(builtin_workgroup_size_id);\n\t\t\t\t\tif (type.vecsize >= 3)\n\t\t\t\t\t\tsize_expr = join(size_expr, \".x * \", size_expr, \".y * \", size_expr, \".z\");\n\t\t\t\t\telse if (type.vecsize == 2)\n\t\t\t\t\t\tsize_expr = join(size_expr, \".x * \", size_expr, \".y\");\n\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id), \" = \", size_expr, \";\");\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase BuiltInSubgroupLocalInvocationId:\n\t\t\t\tif (!msl_options.emulate_subgroups)\n\t\t\t\t\tbreak;\n\t\t\t\t// For subgroup emulation, assume subgroups of size 1.\n\t\t\t\tentry_func.fixup_hooks_in.push_back(\n\t\t\t\t    [=]() { statement(builtin_type_decl(bi_type), \" \", to_expression(var_id), \" = 0;\"); });\n\t\t\t\tbreak;\n\t\t\tcase BuiltInSubgroupSize:\n\t\t\t\tif (msl_options.emulate_subgroups)\n\t\t\t\t{\n\t\t\t\t\t// For subgroup emulation, assume subgroups of size 1.\n\t\t\t\t\tentry_func.fixup_hooks_in.push_back(\n\t\t\t\t\t    [=]() { statement(builtin_type_decl(bi_type), \" \", to_expression(var_id), \" = 1;\"); });\n\t\t\t\t}\n\t\t\t\telse if (msl_options.fixed_subgroup_size != 0)\n\t\t\t\t{\n\t\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id), \" = \",\n\t\t\t\t\t\t          msl_options.fixed_subgroup_size, \";\");\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase BuiltInSubgroupEqMask:\n\t\t\t\tif (msl_options.is_ios() && !msl_options.supports_msl_version(2, 2))\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Subgroup ballot functionality requires Metal 2.2 on iOS.\");\n\t\t\t\tif (!msl_options.supports_msl_version(2, 1))\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Subgroup ballot functionality requires Metal 2.1.\");\n\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\tif (msl_options.is_ios())\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id), \" = \", \"uint4(1 << \",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \", uint3(0));\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id), \" = \",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \" >= 32 ? uint4(0, (1 << (\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \" - 32)), uint2(0)) : uint4(1 << \",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \", uint3(0));\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase BuiltInSubgroupGeMask:\n\t\t\t\tif (msl_options.is_ios() && !msl_options.supports_msl_version(2, 2))\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Subgroup ballot functionality requires Metal 2.2 on iOS.\");\n\t\t\t\tif (!msl_options.supports_msl_version(2, 1))\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Subgroup ballot functionality requires Metal 2.1.\");\n\t\t\t\tif (msl_options.fixed_subgroup_size != 0)\n\t\t\t\t\tadd_spv_func_and_recompile(SPVFuncImplSubgroupBallot);\n\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\t// Case where index < 32, size < 32:\n\t\t\t\t\t// mask0 = bfi(0, 0xFFFFFFFF, index, size - index);\n\t\t\t\t\t// mask1 = bfi(0, 0xFFFFFFFF, 0, 0); // Gives 0\n\t\t\t\t\t// Case where index < 32 but size >= 32:\n\t\t\t\t\t// mask0 = bfi(0, 0xFFFFFFFF, index, 32 - index);\n\t\t\t\t\t// mask1 = bfi(0, 0xFFFFFFFF, 0, size - 32);\n\t\t\t\t\t// Case where index >= 32:\n\t\t\t\t\t// mask0 = bfi(0, 0xFFFFFFFF, 32, 0); // Gives 0\n\t\t\t\t\t// mask1 = bfi(0, 0xFFFFFFFF, index - 32, size - index);\n\t\t\t\t\t// This is expressed without branches to avoid divergent\n\t\t\t\t\t// control flow--hence the complicated min/max expressions.\n\t\t\t\t\t// This is further complicated by the fact that if you attempt\n\t\t\t\t\t// to bfi/bfe out-of-bounds on Metal, undefined behavior is the\n\t\t\t\t\t// result.\n\t\t\t\t\tif (msl_options.fixed_subgroup_size > 32)\n\t\t\t\t\t{\n\t\t\t\t\t\t// Don't use the subgroup size variable with fixed subgroup sizes,\n\t\t\t\t\t\t// since the variables could be defined in the wrong order.\n\t\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id),\n\t\t\t\t\t\t          \" = uint4(insert_bits(0u, 0xFFFFFFFF, min(\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \", 32u), (uint)max(32 - (int)\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id),\n\t\t\t\t\t\t          \", 0)), insert_bits(0u, 0xFFFFFFFF,\"\n\t\t\t\t\t\t          \" (uint)max((int)\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \" - 32, 0), \",\n\t\t\t\t\t\t          msl_options.fixed_subgroup_size, \" - max(\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id),\n\t\t\t\t\t\t          \", 32u)), uint2(0));\");\n\t\t\t\t\t}\n\t\t\t\t\telse if (msl_options.fixed_subgroup_size != 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id),\n\t\t\t\t\t\t          \" = uint4(insert_bits(0u, 0xFFFFFFFF, \",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \", \",\n\t\t\t\t\t\t          msl_options.fixed_subgroup_size, \" - \",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id),\n\t\t\t\t\t\t          \"), uint3(0));\");\n\t\t\t\t\t}\n\t\t\t\t\telse if (msl_options.is_ios())\n\t\t\t\t\t{\n\t\t\t\t\t\t// On iOS, the SIMD-group size will currently never exceed 32.\n\t\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id),\n\t\t\t\t\t\t          \" = uint4(insert_bits(0u, 0xFFFFFFFF, \",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \", \",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_size_id), \" - \",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \"), uint3(0));\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id),\n\t\t\t\t\t\t          \" = uint4(insert_bits(0u, 0xFFFFFFFF, min(\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \", 32u), (uint)max(min((int)\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_size_id), \", 32) - (int)\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id),\n\t\t\t\t\t\t          \", 0)), insert_bits(0u, 0xFFFFFFFF, (uint)max((int)\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \" - 32, 0), (uint)max((int)\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_size_id), \" - (int)max(\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \", 32u), 0)), uint2(0));\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase BuiltInSubgroupGtMask:\n\t\t\t\tif (msl_options.is_ios() && !msl_options.supports_msl_version(2, 2))\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Subgroup ballot functionality requires Metal 2.2 on iOS.\");\n\t\t\t\tif (!msl_options.supports_msl_version(2, 1))\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Subgroup ballot functionality requires Metal 2.1.\");\n\t\t\t\tadd_spv_func_and_recompile(SPVFuncImplSubgroupBallot);\n\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\t// The same logic applies here, except now the index is one\n\t\t\t\t\t// more than the subgroup invocation ID.\n\t\t\t\t\tif (msl_options.fixed_subgroup_size > 32)\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id),\n\t\t\t\t\t\t          \" = uint4(insert_bits(0u, 0xFFFFFFFF, min(\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \" + 1, 32u), (uint)max(32 - (int)\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id),\n\t\t\t\t\t\t          \" - 1, 0)), insert_bits(0u, 0xFFFFFFFF, (uint)max((int)\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \" + 1 - 32, 0), \",\n\t\t\t\t\t\t          msl_options.fixed_subgroup_size, \" - max(\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id),\n\t\t\t\t\t\t          \" + 1, 32u)), uint2(0));\");\n\t\t\t\t\t}\n\t\t\t\t\telse if (msl_options.fixed_subgroup_size != 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id),\n\t\t\t\t\t\t          \" = uint4(insert_bits(0u, 0xFFFFFFFF, \",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \" + 1, \",\n\t\t\t\t\t\t          msl_options.fixed_subgroup_size, \" - \",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id),\n\t\t\t\t\t\t          \" - 1), uint3(0));\");\n\t\t\t\t\t}\n\t\t\t\t\telse if (msl_options.is_ios())\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id),\n\t\t\t\t\t\t          \" = uint4(insert_bits(0u, 0xFFFFFFFF, \",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \" + 1, \",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_size_id), \" - \",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \" - 1), uint3(0));\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id),\n\t\t\t\t\t\t          \" = uint4(insert_bits(0u, 0xFFFFFFFF, min(\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \" + 1, 32u), (uint)max(min((int)\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_size_id), \", 32) - (int)\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id),\n\t\t\t\t\t\t          \" - 1, 0)), insert_bits(0u, 0xFFFFFFFF, (uint)max((int)\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \" + 1 - 32, 0), (uint)max((int)\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_size_id), \" - (int)max(\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \" + 1, 32u), 0)), uint2(0));\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase BuiltInSubgroupLeMask:\n\t\t\t\tif (msl_options.is_ios() && !msl_options.supports_msl_version(2, 2))\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Subgroup ballot functionality requires Metal 2.2 on iOS.\");\n\t\t\t\tif (!msl_options.supports_msl_version(2, 1))\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Subgroup ballot functionality requires Metal 2.1.\");\n\t\t\t\tadd_spv_func_and_recompile(SPVFuncImplSubgroupBallot);\n\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\tif (msl_options.is_ios())\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id),\n\t\t\t\t\t\t          \" = uint4(extract_bits(0xFFFFFFFF, 0, \",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \" + 1), uint3(0));\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id),\n\t\t\t\t\t\t          \" = uint4(extract_bits(0xFFFFFFFF, 0, min(\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id),\n\t\t\t\t\t\t          \" + 1, 32u)), extract_bits(0xFFFFFFFF, 0, (uint)max((int)\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \" + 1 - 32, 0)), uint2(0));\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase BuiltInSubgroupLtMask:\n\t\t\t\tif (msl_options.is_ios() && !msl_options.supports_msl_version(2, 2))\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Subgroup ballot functionality requires Metal 2.2 on iOS.\");\n\t\t\t\tif (!msl_options.supports_msl_version(2, 1))\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Subgroup ballot functionality requires Metal 2.1.\");\n\t\t\t\tadd_spv_func_and_recompile(SPVFuncImplSubgroupBallot);\n\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\tif (msl_options.is_ios())\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id),\n\t\t\t\t\t\t          \" = uint4(extract_bits(0xFFFFFFFF, 0, \",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \"), uint3(0));\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id),\n\t\t\t\t\t\t          \" = uint4(extract_bits(0xFFFFFFFF, 0, min(\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id),\n\t\t\t\t\t\t          \", 32u)), extract_bits(0xFFFFFFFF, 0, (uint)max((int)\",\n\t\t\t\t\t\t          to_expression(builtin_subgroup_invocation_id_id), \" - 32, 0)), uint2(0));\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase BuiltInViewIndex:\n\t\t\t\tif (!msl_options.multiview)\n\t\t\t\t{\n\t\t\t\t\t// According to the Vulkan spec, when not running under a multiview\n\t\t\t\t\t// render pass, ViewIndex is 0.\n\t\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\t\tstatement(\"const \", builtin_type_decl(bi_type), \" \", to_expression(var_id), \" = 0;\");\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (msl_options.view_index_from_device_index)\n\t\t\t\t{\n\t\t\t\t\t// In this case, we take the view index from that of the device we're running on.\n\t\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\t\tstatement(\"const \", builtin_type_decl(bi_type), \" \", to_expression(var_id), \" = \",\n\t\t\t\t\t\t          msl_options.device_index, \";\");\n\t\t\t\t\t});\n\t\t\t\t\t// We actually don't want to set the render_target_array_index here.\n\t\t\t\t\t// Since every physical device is rendering a different view,\n\t\t\t\t\t// there's no need for layered rendering here.\n\t\t\t\t}\n\t\t\t\telse if (!msl_options.multiview_layered_rendering)\n\t\t\t\t{\n\t\t\t\t\t// In this case, the views are rendered one at a time. The view index, then,\n\t\t\t\t\t// is just the first part of the \"view mask\".\n\t\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\t\tstatement(\"const \", builtin_type_decl(bi_type), \" \", to_expression(var_id), \" = \",\n\t\t\t\t\t\t          to_expression(view_mask_buffer_id), \"[0];\");\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (get_execution_model() == ExecutionModelFragment)\n\t\t\t\t{\n\t\t\t\t\t// Because we adjusted the view index in the vertex shader, we have to\n\t\t\t\t\t// adjust it back here.\n\t\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\t\tstatement(to_expression(var_id), \" += \", to_expression(view_mask_buffer_id), \"[0];\");\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (get_execution_model() == ExecutionModelVertex)\n\t\t\t\t{\n\t\t\t\t\t// Metal provides no special support for multiview, so we smuggle\n\t\t\t\t\t// the view index in the instance index.\n\t\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id), \" = \",\n\t\t\t\t\t\t          to_expression(view_mask_buffer_id), \"[0] + (\", to_expression(builtin_instance_idx_id),\n\t\t\t\t\t\t          \" - \", to_expression(builtin_base_instance_id), \") % \",\n\t\t\t\t\t\t          to_expression(view_mask_buffer_id), \"[1];\");\n\t\t\t\t\t\tstatement(to_expression(builtin_instance_idx_id), \" = (\",\n\t\t\t\t\t\t          to_expression(builtin_instance_idx_id), \" - \",\n\t\t\t\t\t\t          to_expression(builtin_base_instance_id), \") / \", to_expression(view_mask_buffer_id),\n\t\t\t\t\t\t          \"[1] + \", to_expression(builtin_base_instance_id), \";\");\n\t\t\t\t\t});\n\t\t\t\t\t// In addition to setting the variable itself, we also need to\n\t\t\t\t\t// set the render_target_array_index with it on output. We have to\n\t\t\t\t\t// offset this by the base view index, because Metal isn't in on\n\t\t\t\t\t// our little game here.\n\t\t\t\t\tentry_func.fixup_hooks_out.push_back([=]() {\n\t\t\t\t\t\tstatement(to_expression(builtin_layer_id), \" = \", to_expression(var_id), \" - \",\n\t\t\t\t\t\t          to_expression(view_mask_buffer_id), \"[0];\");\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase BuiltInDeviceIndex:\n\t\t\t\t// Metal pipelines belong to the devices which create them, so we'll\n\t\t\t\t// need to create a MTLPipelineState for every MTLDevice in a grouped\n\t\t\t\t// VkDevice. We can assume, then, that the device index is constant.\n\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\tstatement(\"const \", builtin_type_decl(bi_type), \" \", to_expression(var_id), \" = \",\n\t\t\t\t\t          msl_options.device_index, \";\");\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase BuiltInWorkgroupId:\n\t\t\t\tif (!msl_options.dispatch_base || !active_input_builtins.get(BuiltInWorkgroupId))\n\t\t\t\t\tbreak;\n\n\t\t\t\t// The vkCmdDispatchBase() command lets the client set the base value\n\t\t\t\t// of WorkgroupId. Metal has no direct equivalent; we must make this\n\t\t\t\t// adjustment ourselves.\n\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\tstatement(to_expression(var_id), \" += \", to_dereferenced_expression(builtin_dispatch_base_id), \";\");\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase BuiltInGlobalInvocationId:\n\t\t\t\tif (!msl_options.dispatch_base || !active_input_builtins.get(BuiltInGlobalInvocationId))\n\t\t\t\t\tbreak;\n\n\t\t\t\t// GlobalInvocationId is defined as LocalInvocationId + WorkgroupId * WorkgroupSize.\n\t\t\t\t// This needs to be adjusted too.\n\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\tauto &execution = this->get_entry_point();\n\t\t\t\t\tuint32_t workgroup_size_id = execution.workgroup_size.constant;\n\t\t\t\t\tif (workgroup_size_id)\n\t\t\t\t\t\tstatement(to_expression(var_id), \" += \", to_dereferenced_expression(builtin_dispatch_base_id),\n\t\t\t\t\t\t          \" * \", to_expression(workgroup_size_id), \";\");\n\t\t\t\t\telse\n\t\t\t\t\t\tstatement(to_expression(var_id), \" += \", to_dereferenced_expression(builtin_dispatch_base_id),\n\t\t\t\t\t\t          \" * uint3(\", execution.workgroup_size.x, \", \", execution.workgroup_size.y, \", \",\n\t\t\t\t\t\t          execution.workgroup_size.z, \");\");\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase BuiltInVertexId:\n\t\t\tcase BuiltInVertexIndex:\n\t\t\t\t// This is direct-mapped normally.\n\t\t\t\tif (!msl_options.vertex_for_tessellation)\n\t\t\t\t\tbreak;\n\n\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\tbuiltin_declaration = true;\n\t\t\t\t\tswitch (msl_options.vertex_index_type)\n\t\t\t\t\t{\n\t\t\t\t\tcase Options::IndexType::None:\n\t\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id), \" = \",\n\t\t\t\t\t\t          to_expression(builtin_invocation_id_id), \".x + \",\n\t\t\t\t\t\t          to_expression(builtin_dispatch_base_id), \".x;\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase Options::IndexType::UInt16:\n\t\t\t\t\tcase Options::IndexType::UInt32:\n\t\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id), \" = \", index_buffer_var_name,\n\t\t\t\t\t\t          \"[\", to_expression(builtin_invocation_id_id), \".x] + \",\n\t\t\t\t\t\t          to_expression(builtin_dispatch_base_id), \".x;\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tbuiltin_declaration = false;\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase BuiltInBaseVertex:\n\t\t\t\t// This is direct-mapped normally.\n\t\t\t\tif (!msl_options.vertex_for_tessellation)\n\t\t\t\t\tbreak;\n\n\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id), \" = \",\n\t\t\t\t\t          to_expression(builtin_dispatch_base_id), \".x;\");\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase BuiltInInstanceId:\n\t\t\tcase BuiltInInstanceIndex:\n\t\t\t\t// This is direct-mapped normally.\n\t\t\t\tif (!msl_options.vertex_for_tessellation)\n\t\t\t\t\tbreak;\n\n\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\tbuiltin_declaration = true;\n\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id), \" = \",\n\t\t\t\t\t          to_expression(builtin_invocation_id_id), \".y + \", to_expression(builtin_dispatch_base_id),\n\t\t\t\t\t          \".y;\");\n\t\t\t\t\tbuiltin_declaration = false;\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase BuiltInBaseInstance:\n\t\t\t\t// This is direct-mapped normally.\n\t\t\t\tif (!msl_options.vertex_for_tessellation)\n\t\t\t\t\tbreak;\n\n\t\t\t\tentry_func.fixup_hooks_in.push_back([=]() {\n\t\t\t\t\tstatement(builtin_type_decl(bi_type), \" \", to_expression(var_id), \" = \",\n\t\t\t\t\t          to_expression(builtin_dispatch_base_id), \".y;\");\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\telse if (var.storage == StorageClassOutput && get_execution_model() == ExecutionModelFragment &&\n\t\t\t\t is_builtin_variable(var) && active_output_builtins.get(bi_type) &&\n\t\t\t\t bi_type == BuiltInSampleMask && has_additional_fixed_sample_mask())\n\t\t{\n\t\t\t// If the additional fixed sample mask was set, we need to adjust the sample_mask\n\t\t\t// output to reflect that. If the shader outputs the sample_mask itself too, we need\n\t\t\t// to AND the two masks to get the final one.\n\t\t\tstring op_str = does_shader_write_sample_mask ? \" &= \" : \" = \";\n\t\t\tentry_func.fixup_hooks_out.push_back([=]() {\n\t\t\t\tstatement(to_expression(builtin_sample_mask_id), op_str, additional_fixed_sample_mask_str(), \";\");\n\t\t\t});\n\t\t}\n\t});\n}\n\n// Returns the Metal index of the resource of the specified type as used by the specified variable.\nuint32_t CompilerMSL::get_metal_resource_index(SPIRVariable &var, SPIRType::BaseType basetype, uint32_t plane)\n{\n\tauto &execution = get_entry_point();\n\tauto &var_dec = ir.meta[var.self].decoration;\n\tauto &var_type = get<SPIRType>(var.basetype);\n\tuint32_t var_desc_set = (var.storage == StorageClassPushConstant) ? kPushConstDescSet : var_dec.set;\n\tuint32_t var_binding = (var.storage == StorageClassPushConstant) ? kPushConstBinding : var_dec.binding;\n\n\t// If a matching binding has been specified, find and use it.\n\tauto itr = resource_bindings.find({ execution.model, var_desc_set, var_binding });\n\n\t// Atomic helper buffers for image atomics need to use secondary bindings as well.\n\tbool use_secondary_binding = (var_type.basetype == SPIRType::SampledImage && basetype == SPIRType::Sampler) ||\n\t                             basetype == SPIRType::AtomicCounter;\n\n\tauto resource_decoration =\n\t    use_secondary_binding ? SPIRVCrossDecorationResourceIndexSecondary : SPIRVCrossDecorationResourceIndexPrimary;\n\n\tif (plane == 1)\n\t\tresource_decoration = SPIRVCrossDecorationResourceIndexTertiary;\n\tif (plane == 2)\n\t\tresource_decoration = SPIRVCrossDecorationResourceIndexQuaternary;\n\n\tif (itr != end(resource_bindings))\n\t{\n\t\tauto &remap = itr->second;\n\t\tremap.second = true;\n\t\tswitch (basetype)\n\t\t{\n\t\tcase SPIRType::Image:\n\t\t\tset_extended_decoration(var.self, resource_decoration, remap.first.msl_texture + plane);\n\t\t\treturn remap.first.msl_texture + plane;\n\t\tcase SPIRType::Sampler:\n\t\t\tset_extended_decoration(var.self, resource_decoration, remap.first.msl_sampler);\n\t\t\treturn remap.first.msl_sampler;\n\t\tdefault:\n\t\t\tset_extended_decoration(var.self, resource_decoration, remap.first.msl_buffer);\n\t\t\treturn remap.first.msl_buffer;\n\t\t}\n\t}\n\n\t// If we have already allocated an index, keep using it.\n\tif (has_extended_decoration(var.self, resource_decoration))\n\t\treturn get_extended_decoration(var.self, resource_decoration);\n\n\tauto &type = get<SPIRType>(var.basetype);\n\n\tif (type_is_msl_framebuffer_fetch(type))\n\t{\n\t\t// Frame-buffer fetch gets its fallback resource index from the input attachment index,\n\t\t// which is then treated as color index.\n\t\treturn get_decoration(var.self, DecorationInputAttachmentIndex);\n\t}\n\telse if (msl_options.enable_decoration_binding)\n\t{\n\t\t// Allow user to enable decoration binding.\n\t\t// If there is no explicit mapping of bindings to MSL, use the declared binding as a fallback.\n\t\tif (has_decoration(var.self, DecorationBinding))\n\t\t{\n\t\t\tvar_binding = get_decoration(var.self, DecorationBinding);\n\t\t\t// Avoid emitting sentinel bindings.\n\t\t\tif (var_binding < 0x80000000u)\n\t\t\t\treturn var_binding;\n\t\t}\n\t}\n\n\t// If we did not explicitly remap, allocate bindings on demand.\n\t// We cannot reliably use Binding decorations since SPIR-V and MSL's binding models are very different.\n\n\tbool allocate_argument_buffer_ids = false;\n\n\tif (var.storage != StorageClassPushConstant)\n\t\tallocate_argument_buffer_ids = descriptor_set_is_argument_buffer(var_desc_set);\n\n\tuint32_t binding_stride = 1;\n\tfor (uint32_t i = 0; i < uint32_t(type.array.size()); i++)\n\t\tbinding_stride *= to_array_size_literal(type, i);\n\n\t// If a binding has not been specified, revert to incrementing resource indices.\n\tuint32_t resource_index;\n\n\tif (allocate_argument_buffer_ids)\n\t{\n\t\t// Allocate from a flat ID binding space.\n\t\tresource_index = next_metal_resource_ids[var_desc_set];\n\t\tnext_metal_resource_ids[var_desc_set] += binding_stride;\n\t}\n\telse\n\t{\n\t\tif (is_var_runtime_size_array(var))\n\t\t{\n\t\t\tbasetype = SPIRType::Struct;\n\t\t\tbinding_stride = 1;\n\t\t}\n\t\t// Allocate from plain bindings which are allocated per resource type.\n\t\tswitch (basetype)\n\t\t{\n\t\tcase SPIRType::Image:\n\t\t\tresource_index = next_metal_resource_index_texture;\n\t\t\tnext_metal_resource_index_texture += binding_stride;\n\t\t\tbreak;\n\t\tcase SPIRType::Sampler:\n\t\t\tresource_index = next_metal_resource_index_sampler;\n\t\t\tnext_metal_resource_index_sampler += binding_stride;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tresource_index = next_metal_resource_index_buffer;\n\t\t\tnext_metal_resource_index_buffer += binding_stride;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tset_extended_decoration(var.self, resource_decoration, resource_index);\n\treturn resource_index;\n}\n\nbool CompilerMSL::type_is_msl_framebuffer_fetch(const SPIRType &type) const\n{\n\treturn type.basetype == SPIRType::Image && type.image.dim == DimSubpassData &&\n\t       msl_options.use_framebuffer_fetch_subpasses;\n}\n\nbool CompilerMSL::type_is_pointer(const SPIRType &type) const\n{\n\tif (!type.pointer)\n\t\treturn false;\n\tauto &parent_type = get<SPIRType>(type.parent_type);\n\t// Safeguards when we forget to set pointer_depth (there is an assert for it in type_to_glsl),\n\t// but the extra check shouldn't hurt.\n\treturn (type.pointer_depth > parent_type.pointer_depth) || !parent_type.pointer;\n}\n\nbool CompilerMSL::type_is_pointer_to_pointer(const SPIRType &type) const\n{\n\tif (!type.pointer)\n\t\treturn false;\n\tauto &parent_type = get<SPIRType>(type.parent_type);\n\treturn type.pointer_depth > parent_type.pointer_depth && type_is_pointer(parent_type);\n}\n\nconst char *CompilerMSL::descriptor_address_space(uint32_t id, StorageClass storage, const char *plain_address_space) const\n{\n\tif (msl_options.argument_buffers)\n\t{\n\t\tbool storage_class_is_descriptor = storage == StorageClassUniform ||\n\t\t                                   storage == StorageClassStorageBuffer ||\n\t\t                                   storage == StorageClassUniformConstant;\n\n\t\tuint32_t desc_set = get_decoration(id, DecorationDescriptorSet);\n\t\tif (storage_class_is_descriptor && descriptor_set_is_argument_buffer(desc_set))\n\t\t{\n\t\t\t// An awkward case where we need to emit *more* address space declarations (yay!).\n\t\t\t// An example is where we pass down an array of buffer pointers to leaf functions.\n\t\t\t// It's a constant array containing pointers to constants.\n\t\t\t// The pointer array is always constant however. E.g.\n\t\t\t// device SSBO * constant (&array)[N].\n\t\t\t// const device SSBO * constant (&array)[N].\n\t\t\t// constant SSBO * constant (&array)[N].\n\t\t\t// However, this only matters for argument buffers, since for MSL 1.0 style codegen,\n\t\t\t// we emit the buffer array on stack instead, and that seems to work just fine apparently.\n\n\t\t\t// If the argument was marked as being in device address space, any pointer to member would\n\t\t\t// be const device, not constant.\n\t\t\tif (argument_buffer_device_storage_mask & (1u << desc_set))\n\t\t\t\treturn \"const device\";\n\t\t\telse\n\t\t\t\treturn \"constant\";\n\t\t}\n\t}\n\n\treturn plain_address_space;\n}\n\nstring CompilerMSL::argument_decl(const SPIRFunction::Parameter &arg)\n{\n\tauto &var = get<SPIRVariable>(arg.id);\n\tauto &type = get_variable_data_type(var);\n\tauto &var_type = get<SPIRType>(arg.type);\n\tStorageClass type_storage = var_type.storage;\n\n\t// If we need to modify the name of the variable, make sure we use the original variable.\n\t// Our alias is just a shadow variable.\n\tuint32_t name_id = var.self;\n\tif (arg.alias_global_variable && var.basevariable)\n\t\tname_id = var.basevariable;\n\n\tbool constref = !arg.alias_global_variable && is_pointer(var_type) && arg.write_count == 0;\n\t// Framebuffer fetch is plain value, const looks out of place, but it is not wrong.\n\tif (type_is_msl_framebuffer_fetch(type))\n\t\tconstref = false;\n\telse if (type_storage == StorageClassUniformConstant)\n\t\tconstref = true;\n\n\tbool type_is_image = type.basetype == SPIRType::Image || type.basetype == SPIRType::SampledImage ||\n\t                     type.basetype == SPIRType::Sampler;\n\tbool type_is_tlas = type.basetype == SPIRType::AccelerationStructure;\n\n\t// For opaque types we handle const later due to descriptor address spaces.\n\tconst char *cv_qualifier = (constref && !type_is_image) ? \"const \" : \"\";\n\tstring decl;\n\n\t// If this is a combined image-sampler for a 2D image with floating-point type,\n\t// we emitted the 'spvDynamicImageSampler' type, and this is *not* an alias parameter\n\t// for a global, then we need to emit a \"dynamic\" combined image-sampler.\n\t// Unfortunately, this is necessary to properly support passing around\n\t// combined image-samplers with Y'CbCr conversions on them.\n\tbool is_dynamic_img_sampler = !arg.alias_global_variable && type.basetype == SPIRType::SampledImage &&\n\t                              type.image.dim == Dim2D && type_is_floating_point(get<SPIRType>(type.image.type)) &&\n\t                              spv_function_implementations.count(SPVFuncImplDynamicImageSampler);\n\n\t// Allow Metal to use the array<T> template to make arrays a value type\n\tstring address_space = get_argument_address_space(var);\n\tbool builtin = has_decoration(var.self, DecorationBuiltIn);\n\tauto builtin_type = BuiltIn(get_decoration(arg.id, DecorationBuiltIn));\n\n\tif (var.basevariable && (var.basevariable == stage_in_ptr_var_id || var.basevariable == stage_out_ptr_var_id))\n\t\tdecl = join(cv_qualifier, type_to_glsl(type, arg.id));\n\telse if (builtin)\n\t{\n\t\t// Only use templated array for Clip/Cull distance when feasible.\n\t\t// In other scenarios, we need need to override array length for tess levels (if used as outputs),\n\t\t// or we need to emit the expected type for builtins (uint vs int).\n\t\tauto storage = get<SPIRType>(var.basetype).storage;\n\n\t\tif (storage == StorageClassInput &&\n\t\t    (builtin_type == BuiltInTessLevelInner || builtin_type == BuiltInTessLevelOuter))\n\t\t{\n\t\t\tis_using_builtin_array = false;\n\t\t}\n\t\telse if (builtin_type != BuiltInClipDistance && builtin_type != BuiltInCullDistance)\n\t\t{\n\t\t\tis_using_builtin_array = true;\n\t\t}\n\n\t\tif (storage == StorageClassOutput && variable_storage_requires_stage_io(storage) &&\n\t\t    !is_stage_output_builtin_masked(builtin_type))\n\t\t\tis_using_builtin_array = true;\n\n\t\tif (is_using_builtin_array)\n\t\t\tdecl = join(cv_qualifier, builtin_type_decl(builtin_type, arg.id));\n\t\telse\n\t\t\tdecl = join(cv_qualifier, type_to_glsl(type, arg.id));\n\t}\n\telse if (is_var_runtime_size_array(var))\n\t{\n\t\tconst auto *parent_type = &get<SPIRType>(type.parent_type);\n\t\tauto type_name = type_to_glsl(*parent_type, arg.id);\n\t\tif (type.basetype == SPIRType::AccelerationStructure)\n\t\t\tdecl = join(\"spvDescriptorArray<\", type_name, \">\");\n\t\telse if (type_is_image)\n\t\t\tdecl = join(\"spvDescriptorArray<\", cv_qualifier, type_name, \">\");\n\t\telse\n\t\t\tdecl = join(\"spvDescriptorArray<\", address_space, \" \", type_name, \"*>\");\n\t\taddress_space = \"const\";\n\t}\n\telse if ((type_storage == StorageClassUniform || type_storage == StorageClassStorageBuffer) && is_array(type))\n\t{\n\t\tis_using_builtin_array = true;\n\t\tdecl += join(cv_qualifier, type_to_glsl(type, arg.id), \"*\");\n\t}\n\telse if (is_dynamic_img_sampler)\n\t{\n\t\tdecl = join(cv_qualifier, \"spvDynamicImageSampler<\", type_to_glsl(get<SPIRType>(type.image.type)), \">\");\n\t\t// Mark the variable so that we can handle passing it to another function.\n\t\tset_extended_decoration(arg.id, SPIRVCrossDecorationDynamicImageSampler);\n\t}\n\telse\n\t{\n\t\t// The type is a pointer type we need to emit cv_qualifier late.\n\t\tif (type_is_pointer(type))\n\t\t{\n\t\t\tdecl = type_to_glsl(type, arg.id);\n\t\t\tif (*cv_qualifier != '\\0')\n\t\t\t\tdecl += join(\" \", cv_qualifier);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdecl = join(cv_qualifier, type_to_glsl(type, arg.id));\n\t\t}\n\t}\n\n\tif (!builtin && !is_pointer(var_type) &&\n\t    (type_storage == StorageClassFunction || type_storage == StorageClassGeneric))\n\t{\n\t\t// If the argument is a pure value and not an opaque type, we will pass by value.\n\t\tif (msl_options.force_native_arrays && is_array(type))\n\t\t{\n\t\t\t// We are receiving an array by value. This is problematic.\n\t\t\t// We cannot be sure of the target address space since we are supposed to receive a copy,\n\t\t\t// but this is not possible with MSL without some extra work.\n\t\t\t// We will have to assume we're getting a reference in thread address space.\n\t\t\t// If we happen to get a reference in constant address space, the caller must emit a copy and pass that.\n\t\t\t// Thread const therefore becomes the only logical choice, since we cannot \"create\" a constant array from\n\t\t\t// non-constant arrays, but we can create thread const from constant.\n\t\t\tdecl = string(\"thread const \") + decl;\n\t\t\tdecl += \" (&\";\n\t\t\tconst char *restrict_kw = to_restrict(name_id, true);\n\t\t\tif (*restrict_kw)\n\t\t\t{\n\t\t\t\tdecl += \" \";\n\t\t\t\tdecl += restrict_kw;\n\t\t\t}\n\t\t\tdecl += to_expression(name_id);\n\t\t\tdecl += \")\";\n\t\t\tdecl += type_to_array_glsl(type);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (!address_space.empty())\n\t\t\t\tdecl = join(address_space, \" \", decl);\n\t\t\tdecl += \" \";\n\t\t\tdecl += to_expression(name_id);\n\t\t}\n\t}\n\telse if (is_array(type) && !type_is_image)\n\t{\n\t\t// Arrays of opaque types are special cased.\n\t\tif (!address_space.empty())\n\t\t\tdecl = join(address_space, \" \", decl);\n\n\t\tconst char *argument_buffer_space = descriptor_address_space(name_id, type_storage, nullptr);\n\t\tif (argument_buffer_space)\n\t\t{\n\t\t\tdecl += \" \";\n\t\t\tdecl += argument_buffer_space;\n\t\t}\n\n\t\t// Special case, need to override the array size here if we're using tess level as an argument.\n\t\tif (is_tesc_shader() && builtin &&\n\t\t    (builtin_type == BuiltInTessLevelInner || builtin_type == BuiltInTessLevelOuter))\n\t\t{\n\t\t\tuint32_t array_size = get_physical_tess_level_array_size(builtin_type);\n\t\t\tif (array_size == 1)\n\t\t\t{\n\t\t\t\tdecl += \" &\";\n\t\t\t\tdecl += to_expression(name_id);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tdecl += \" (&\";\n\t\t\t\tdecl += to_expression(name_id);\n\t\t\t\tdecl += \")\";\n\t\t\t\tdecl += join(\"[\", array_size, \"]\");\n\t\t\t}\n\t\t}\n\t\telse if (is_var_runtime_size_array(var))\n\t\t{\n\t\t\tdecl += \" \" + to_expression(name_id);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tauto array_size_decl = type_to_array_glsl(type);\n\t\t\tif (array_size_decl.empty())\n\t\t\t\tdecl += \"& \";\n\t\t\telse\n\t\t\t\tdecl += \" (&\";\n\n\t\t\tconst char *restrict_kw = to_restrict(name_id, true);\n\t\t\tif (*restrict_kw)\n\t\t\t{\n\t\t\t\tdecl += \" \";\n\t\t\t\tdecl += restrict_kw;\n\t\t\t}\n\t\t\tdecl += to_expression(name_id);\n\n\t\t\tif (!array_size_decl.empty())\n\t\t\t{\n\t\t\t\tdecl += \")\";\n\t\t\t\tdecl += array_size_decl;\n\t\t\t}\n\t\t}\n\t}\n\telse if (!type_is_image && !type_is_tlas &&\n\t         (!pull_model_inputs.count(var.basevariable) || type.basetype == SPIRType::Struct))\n\t{\n\t\t// If this is going to be a reference to a variable pointer, the address space\n\t\t// for the reference has to go before the '&', but after the '*'.\n\t\tif (!address_space.empty())\n\t\t{\n\t\t\tif (type_is_pointer(type))\n\t\t\t{\n\t\t\t\tif (*cv_qualifier == '\\0')\n\t\t\t\t\tdecl += ' ';\n\t\t\t\tdecl += join(address_space, \" \");\n\t\t\t}\n\t\t\telse\n\t\t\t\tdecl = join(address_space, \" \", decl);\n\t\t}\n\t\tdecl += \"&\";\n\t\tdecl += \" \";\n\t\tdecl += to_restrict(name_id, true);\n\t\tdecl += to_expression(name_id);\n\t}\n\telse if (type_is_image || type_is_tlas)\n\t{\n\t\tif (is_var_runtime_size_array(var))\n\t\t{\n\t\t\tdecl = address_space + \" \" + decl + \" \" + to_expression(name_id);\n\t\t}\n\t\telse if (type.array.empty())\n\t\t{\n\t\t\t// For non-arrayed types we can just pass opaque descriptors by value.\n\t\t\t// This fixes problems if descriptors are passed by value from argument buffers and plain descriptors\n\t\t\t// in same shader.\n\t\t\t// There is no address space we can actually use, but value will work.\n\t\t\t// This will break if applications attempt to pass down descriptor arrays as arguments, but\n\t\t\t// fortunately that is extremely unlikely ...\n\t\t\tdecl += \" \";\n\t\t\tdecl += to_expression(name_id);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst char *img_address_space = descriptor_address_space(name_id, type_storage, \"thread const\");\n\t\t\tdecl = join(img_address_space, \" \", decl);\n\t\t\tdecl += \"& \";\n\t\t\tdecl += to_expression(name_id);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (!address_space.empty())\n\t\t\tdecl = join(address_space, \" \", decl);\n\t\tdecl += \" \";\n\t\tdecl += to_expression(name_id);\n\t}\n\n\t// Emulate texture2D atomic operations\n\tauto *backing_var = maybe_get_backing_variable(name_id);\n\tif (backing_var && atomic_image_vars_emulated.count(backing_var->self))\n\t{\n\t\tdecl += \", device atomic_\" + type_to_glsl(get<SPIRType>(var_type.image.type), 0);\n\t\tdecl += \"* \" + to_expression(name_id) + \"_atomic\";\n\t}\n\n\tis_using_builtin_array = false;\n\n\treturn decl;\n}\n\n// If we're currently in the entry point function, and the object\n// has a qualified name, use it, otherwise use the standard name.\nstring CompilerMSL::to_name(uint32_t id, bool allow_alias) const\n{\n\tif (current_function && (current_function->self == ir.default_entry_point))\n\t{\n\t\tauto *m = ir.find_meta(id);\n\t\tif (m && !m->decoration.qualified_alias.empty())\n\t\t\treturn m->decoration.qualified_alias;\n\t}\n\treturn Compiler::to_name(id, allow_alias);\n}\n\n// Appends the name of the member to the variable qualifier string, except for Builtins.\nstring CompilerMSL::append_member_name(const string &qualifier, const SPIRType &type, uint32_t index)\n{\n\t// Don't qualify Builtin names because they are unique and are treated as such when building expressions\n\tBuiltIn builtin = BuiltInMax;\n\tif (is_member_builtin(type, index, &builtin))\n\t\treturn builtin_to_glsl(builtin, type.storage);\n\n\t// Strip any underscore prefix from member name\n\tstring mbr_name = to_member_name(type, index);\n\tsize_t startPos = mbr_name.find_first_not_of(\"_\");\n\tmbr_name = (startPos != string::npos) ? mbr_name.substr(startPos) : \"\";\n\treturn join(qualifier, \"_\", mbr_name);\n}\n\n// Ensures that the specified name is permanently usable by prepending a prefix\n// if the first chars are _ and a digit, which indicate a transient name.\nstring CompilerMSL::ensure_valid_name(string name, string pfx)\n{\n\treturn (name.size() >= 2 && name[0] == '_' && isdigit(name[1])) ? (pfx + name) : name;\n}\n\nconst std::unordered_set<std::string> &CompilerMSL::get_reserved_keyword_set()\n{\n\tstatic const unordered_set<string> keywords = {\n\t\t\"kernel\",\n\t\t\"vertex\",\n\t\t\"fragment\",\n\t\t\"compute\",\n\t\t\"constant\",\n\t\t\"device\",\n\t\t\"bias\",\n\t\t\"level\",\n\t\t\"gradient2d\",\n\t\t\"gradientcube\",\n\t\t\"gradient3d\",\n\t\t\"min_lod_clamp\",\n\t\t\"assert\",\n\t\t\"VARIABLE_TRACEPOINT\",\n\t\t\"STATIC_DATA_TRACEPOINT\",\n\t\t\"STATIC_DATA_TRACEPOINT_V\",\n\t\t\"METAL_ALIGN\",\n\t\t\"METAL_ASM\",\n\t\t\"METAL_CONST\",\n\t\t\"METAL_DEPRECATED\",\n\t\t\"METAL_ENABLE_IF\",\n\t\t\"METAL_FUNC\",\n\t\t\"METAL_INTERNAL\",\n\t\t\"METAL_NON_NULL_RETURN\",\n\t\t\"METAL_NORETURN\",\n\t\t\"METAL_NOTHROW\",\n\t\t\"METAL_PURE\",\n\t\t\"METAL_UNAVAILABLE\",\n\t\t\"METAL_IMPLICIT\",\n\t\t\"METAL_EXPLICIT\",\n\t\t\"METAL_CONST_ARG\",\n\t\t\"METAL_ARG_UNIFORM\",\n\t\t\"METAL_ZERO_ARG\",\n\t\t\"METAL_VALID_LOD_ARG\",\n\t\t\"METAL_VALID_LEVEL_ARG\",\n\t\t\"METAL_VALID_STORE_ORDER\",\n\t\t\"METAL_VALID_LOAD_ORDER\",\n\t\t\"METAL_VALID_COMPARE_EXCHANGE_FAILURE_ORDER\",\n\t\t\"METAL_COMPATIBLE_COMPARE_EXCHANGE_ORDERS\",\n\t\t\"METAL_VALID_RENDER_TARGET\",\n\t\t\"is_function_constant_defined\",\n\t\t\"CHAR_BIT\",\n\t\t\"SCHAR_MAX\",\n\t\t\"SCHAR_MIN\",\n\t\t\"UCHAR_MAX\",\n\t\t\"CHAR_MAX\",\n\t\t\"CHAR_MIN\",\n\t\t\"USHRT_MAX\",\n\t\t\"SHRT_MAX\",\n\t\t\"SHRT_MIN\",\n\t\t\"UINT_MAX\",\n\t\t\"INT_MAX\",\n\t\t\"INT_MIN\",\n\t\t\"FLT_DIG\",\n\t\t\"FLT_MANT_DIG\",\n\t\t\"FLT_MAX_10_EXP\",\n\t\t\"FLT_MAX_EXP\",\n\t\t\"FLT_MIN_10_EXP\",\n\t\t\"FLT_MIN_EXP\",\n\t\t\"FLT_RADIX\",\n\t\t\"FLT_MAX\",\n\t\t\"FLT_MIN\",\n\t\t\"FLT_EPSILON\",\n\t\t\"FP_ILOGB0\",\n\t\t\"FP_ILOGBNAN\",\n\t\t\"MAXFLOAT\",\n\t\t\"HUGE_VALF\",\n\t\t\"INFINITY\",\n\t\t\"NAN\",\n\t\t\"M_E_F\",\n\t\t\"M_LOG2E_F\",\n\t\t\"M_LOG10E_F\",\n\t\t\"M_LN2_F\",\n\t\t\"M_LN10_F\",\n\t\t\"M_PI_F\",\n\t\t\"M_PI_2_F\",\n\t\t\"M_PI_4_F\",\n\t\t\"M_1_PI_F\",\n\t\t\"M_2_PI_F\",\n\t\t\"M_2_SQRTPI_F\",\n\t\t\"M_SQRT2_F\",\n\t\t\"M_SQRT1_2_F\",\n\t\t\"HALF_DIG\",\n\t\t\"HALF_MANT_DIG\",\n\t\t\"HALF_MAX_10_EXP\",\n\t\t\"HALF_MAX_EXP\",\n\t\t\"HALF_MIN_10_EXP\",\n\t\t\"HALF_MIN_EXP\",\n\t\t\"HALF_RADIX\",\n\t\t\"HALF_MAX\",\n\t\t\"HALF_MIN\",\n\t\t\"HALF_EPSILON\",\n\t\t\"MAXHALF\",\n\t\t\"HUGE_VALH\",\n\t\t\"M_E_H\",\n\t\t\"M_LOG2E_H\",\n\t\t\"M_LOG10E_H\",\n\t\t\"M_LN2_H\",\n\t\t\"M_LN10_H\",\n\t\t\"M_PI_H\",\n\t\t\"M_PI_2_H\",\n\t\t\"M_PI_4_H\",\n\t\t\"M_1_PI_H\",\n\t\t\"M_2_PI_H\",\n\t\t\"M_2_SQRTPI_H\",\n\t\t\"M_SQRT2_H\",\n\t\t\"M_SQRT1_2_H\",\n\t\t\"DBL_DIG\",\n\t\t\"DBL_MANT_DIG\",\n\t\t\"DBL_MAX_10_EXP\",\n\t\t\"DBL_MAX_EXP\",\n\t\t\"DBL_MIN_10_EXP\",\n\t\t\"DBL_MIN_EXP\",\n\t\t\"DBL_RADIX\",\n\t\t\"DBL_MAX\",\n\t\t\"DBL_MIN\",\n\t\t\"DBL_EPSILON\",\n\t\t\"HUGE_VAL\",\n\t\t\"M_E\",\n\t\t\"M_LOG2E\",\n\t\t\"M_LOG10E\",\n\t\t\"M_LN2\",\n\t\t\"M_LN10\",\n\t\t\"M_PI\",\n\t\t\"M_PI_2\",\n\t\t\"M_PI_4\",\n\t\t\"M_1_PI\",\n\t\t\"M_2_PI\",\n\t\t\"M_2_SQRTPI\",\n\t\t\"M_SQRT2\",\n\t\t\"M_SQRT1_2\",\n\t\t\"quad_broadcast\",\n\t\t\"thread\",\n\t\t\"threadgroup\",\n\t};\n\n\treturn keywords;\n}\n\nconst std::unordered_set<std::string> &CompilerMSL::get_illegal_func_names()\n{\n\tstatic const unordered_set<string> illegal_func_names = {\n\t\t\"main\",\n\t\t\"saturate\",\n\t\t\"assert\",\n\t\t\"fmin3\",\n\t\t\"fmax3\",\n\t\t\"divide\",\n\t\t\"VARIABLE_TRACEPOINT\",\n\t\t\"STATIC_DATA_TRACEPOINT\",\n\t\t\"STATIC_DATA_TRACEPOINT_V\",\n\t\t\"METAL_ALIGN\",\n\t\t\"METAL_ASM\",\n\t\t\"METAL_CONST\",\n\t\t\"METAL_DEPRECATED\",\n\t\t\"METAL_ENABLE_IF\",\n\t\t\"METAL_FUNC\",\n\t\t\"METAL_INTERNAL\",\n\t\t\"METAL_NON_NULL_RETURN\",\n\t\t\"METAL_NORETURN\",\n\t\t\"METAL_NOTHROW\",\n\t\t\"METAL_PURE\",\n\t\t\"METAL_UNAVAILABLE\",\n\t\t\"METAL_IMPLICIT\",\n\t\t\"METAL_EXPLICIT\",\n\t\t\"METAL_CONST_ARG\",\n\t\t\"METAL_ARG_UNIFORM\",\n\t\t\"METAL_ZERO_ARG\",\n\t\t\"METAL_VALID_LOD_ARG\",\n\t\t\"METAL_VALID_LEVEL_ARG\",\n\t\t\"METAL_VALID_STORE_ORDER\",\n\t\t\"METAL_VALID_LOAD_ORDER\",\n\t\t\"METAL_VALID_COMPARE_EXCHANGE_FAILURE_ORDER\",\n\t\t\"METAL_COMPATIBLE_COMPARE_EXCHANGE_ORDERS\",\n\t\t\"METAL_VALID_RENDER_TARGET\",\n\t\t\"is_function_constant_defined\",\n\t\t\"CHAR_BIT\",\n\t\t\"SCHAR_MAX\",\n\t\t\"SCHAR_MIN\",\n\t\t\"UCHAR_MAX\",\n\t\t\"CHAR_MAX\",\n\t\t\"CHAR_MIN\",\n\t\t\"USHRT_MAX\",\n\t\t\"SHRT_MAX\",\n\t\t\"SHRT_MIN\",\n\t\t\"UINT_MAX\",\n\t\t\"INT_MAX\",\n\t\t\"INT_MIN\",\n\t\t\"FLT_DIG\",\n\t\t\"FLT_MANT_DIG\",\n\t\t\"FLT_MAX_10_EXP\",\n\t\t\"FLT_MAX_EXP\",\n\t\t\"FLT_MIN_10_EXP\",\n\t\t\"FLT_MIN_EXP\",\n\t\t\"FLT_RADIX\",\n\t\t\"FLT_MAX\",\n\t\t\"FLT_MIN\",\n\t\t\"FLT_EPSILON\",\n\t\t\"FP_ILOGB0\",\n\t\t\"FP_ILOGBNAN\",\n\t\t\"MAXFLOAT\",\n\t\t\"HUGE_VALF\",\n\t\t\"INFINITY\",\n\t\t\"NAN\",\n\t\t\"M_E_F\",\n\t\t\"M_LOG2E_F\",\n\t\t\"M_LOG10E_F\",\n\t\t\"M_LN2_F\",\n\t\t\"M_LN10_F\",\n\t\t\"M_PI_F\",\n\t\t\"M_PI_2_F\",\n\t\t\"M_PI_4_F\",\n\t\t\"M_1_PI_F\",\n\t\t\"M_2_PI_F\",\n\t\t\"M_2_SQRTPI_F\",\n\t\t\"M_SQRT2_F\",\n\t\t\"M_SQRT1_2_F\",\n\t\t\"HALF_DIG\",\n\t\t\"HALF_MANT_DIG\",\n\t\t\"HALF_MAX_10_EXP\",\n\t\t\"HALF_MAX_EXP\",\n\t\t\"HALF_MIN_10_EXP\",\n\t\t\"HALF_MIN_EXP\",\n\t\t\"HALF_RADIX\",\n\t\t\"HALF_MAX\",\n\t\t\"HALF_MIN\",\n\t\t\"HALF_EPSILON\",\n\t\t\"MAXHALF\",\n\t\t\"HUGE_VALH\",\n\t\t\"M_E_H\",\n\t\t\"M_LOG2E_H\",\n\t\t\"M_LOG10E_H\",\n\t\t\"M_LN2_H\",\n\t\t\"M_LN10_H\",\n\t\t\"M_PI_H\",\n\t\t\"M_PI_2_H\",\n\t\t\"M_PI_4_H\",\n\t\t\"M_1_PI_H\",\n\t\t\"M_2_PI_H\",\n\t\t\"M_2_SQRTPI_H\",\n\t\t\"M_SQRT2_H\",\n\t\t\"M_SQRT1_2_H\",\n\t\t\"DBL_DIG\",\n\t\t\"DBL_MANT_DIG\",\n\t\t\"DBL_MAX_10_EXP\",\n\t\t\"DBL_MAX_EXP\",\n\t\t\"DBL_MIN_10_EXP\",\n\t\t\"DBL_MIN_EXP\",\n\t\t\"DBL_RADIX\",\n\t\t\"DBL_MAX\",\n\t\t\"DBL_MIN\",\n\t\t\"DBL_EPSILON\",\n\t\t\"HUGE_VAL\",\n\t\t\"M_E\",\n\t\t\"M_LOG2E\",\n\t\t\"M_LOG10E\",\n\t\t\"M_LN2\",\n\t\t\"M_LN10\",\n\t\t\"M_PI\",\n\t\t\"M_PI_2\",\n\t\t\"M_PI_4\",\n\t\t\"M_1_PI\",\n\t\t\"M_2_PI\",\n\t\t\"M_2_SQRTPI\",\n\t\t\"M_SQRT2\",\n\t\t\"M_SQRT1_2\",\n\t};\n\n\treturn illegal_func_names;\n}\n\n// Replace all names that match MSL keywords or Metal Standard Library functions.\nvoid CompilerMSL::replace_illegal_names()\n{\n\t// FIXME: MSL and GLSL are doing two different things here.\n\t// Agree on convention and remove this override.\n\tauto &keywords = get_reserved_keyword_set();\n\tauto &illegal_func_names = get_illegal_func_names();\n\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t self, SPIRVariable &) {\n\t\tauto *meta = ir.find_meta(self);\n\t\tif (!meta)\n\t\t\treturn;\n\n\t\tauto &dec = meta->decoration;\n\t\tif (keywords.find(dec.alias) != end(keywords))\n\t\t\tdec.alias += \"0\";\n\t});\n\n\tir.for_each_typed_id<SPIRFunction>([&](uint32_t self, SPIRFunction &) {\n\t\tauto *meta = ir.find_meta(self);\n\t\tif (!meta)\n\t\t\treturn;\n\n\t\tauto &dec = meta->decoration;\n\t\tif (illegal_func_names.find(dec.alias) != end(illegal_func_names))\n\t\t\tdec.alias += \"0\";\n\t});\n\n\tir.for_each_typed_id<SPIRType>([&](uint32_t self, SPIRType &) {\n\t\tauto *meta = ir.find_meta(self);\n\t\tif (!meta)\n\t\t\treturn;\n\n\t\tfor (auto &mbr_dec : meta->members)\n\t\t\tif (keywords.find(mbr_dec.alias) != end(keywords))\n\t\t\t\tmbr_dec.alias += \"0\";\n\t});\n\n\tCompilerGLSL::replace_illegal_names();\n}\n\nvoid CompilerMSL::replace_illegal_entry_point_names()\n{\n\tauto &illegal_func_names = get_illegal_func_names();\n\n\t// It is important to this before we fixup identifiers,\n\t// since if ep_name is reserved, we will need to fix that up,\n\t// and then copy alias back into entry.name after the fixup.\n\tfor (auto &entry : ir.entry_points)\n\t{\n\t\t// Change both the entry point name and the alias, to keep them synced.\n\t\tstring &ep_name = entry.second.name;\n\t\tif (illegal_func_names.find(ep_name) != end(illegal_func_names))\n\t\t\tep_name += \"0\";\n\n\t\tir.meta[entry.first].decoration.alias = ep_name;\n\t}\n}\n\nvoid CompilerMSL::sync_entry_point_aliases_and_names()\n{\n\tfor (auto &entry : ir.entry_points)\n\t\tentry.second.name = ir.meta[entry.first].decoration.alias;\n}\n\nstring CompilerMSL::to_member_reference(uint32_t base, const SPIRType &type, uint32_t index, bool ptr_chain_is_resolved)\n{\n\tauto *var = maybe_get_backing_variable(base);\n\t// If this is a buffer array, we have to dereference the buffer pointers.\n\t// Otherwise, if this is a pointer expression, dereference it.\n\n\tbool declared_as_pointer = false;\n\n\tif (var)\n\t{\n\t\t// Only allow -> dereference for block types. This is so we get expressions like\n\t\t// buffer[i]->first_member.second_member, rather than buffer[i]->first->second.\n\t\tconst bool is_block =\n\t\t    has_decoration(type.self, DecorationBlock) || has_decoration(type.self, DecorationBufferBlock);\n\n\t\tbool is_buffer_variable =\n\t\t    is_block && (var->storage == StorageClassUniform || var->storage == StorageClassStorageBuffer);\n\t\tdeclared_as_pointer = is_buffer_variable && is_array(get_pointee_type(var->basetype));\n\t}\n\n\tif (declared_as_pointer || (!ptr_chain_is_resolved && should_dereference(base)))\n\t\treturn join(\"->\", to_member_name(type, index));\n\telse\n\t\treturn join(\".\", to_member_name(type, index));\n}\n\nstring CompilerMSL::to_qualifiers_glsl(uint32_t id)\n{\n\tstring quals;\n\n\tauto *var = maybe_get<SPIRVariable>(id);\n\tauto &type = expression_type(id);\n\n\tif (type.storage == StorageClassWorkgroup || (var && variable_decl_is_remapped_storage(*var, StorageClassWorkgroup)))\n\t\tquals += \"threadgroup \";\n\n\treturn quals;\n}\n\n// The optional id parameter indicates the object whose type we are trying\n// to find the description for. It is optional. Most type descriptions do not\n// depend on a specific object's use of that type.\nstring CompilerMSL::type_to_glsl(const SPIRType &type, uint32_t id, bool member)\n{\n\tstring type_name;\n\n\t// Pointer?\n\tif (is_pointer(type) || type_is_array_of_pointers(type))\n\t{\n\t\tassert(type.pointer_depth > 0);\n\n\t\tconst char *restrict_kw;\n\n\t\tauto type_address_space = get_type_address_space(type, id);\n\t\tconst auto *p_parent_type = &get<SPIRType>(type.parent_type);\n\n\t\t// Work around C pointer qualifier rules. If glsl_type is a pointer type as well\n\t\t// we'll need to emit the address space to the right.\n\t\t// We could always go this route, but it makes the code unnatural.\n\t\t// Prefer emitting thread T *foo over T thread* foo since it's more readable,\n\t\t// but we'll have to emit thread T * thread * T constant bar; for example.\n\t\tif (type_is_pointer_to_pointer(type))\n\t\t\ttype_name = join(type_to_glsl(*p_parent_type, id), \" \", type_address_space, \" \");\n\t\telse\n\t\t{\n\t\t\t// Since this is not a pointer-to-pointer, ensure we've dug down to the base type.\n\t\t\t// Some situations chain pointers even though they are not formally pointers-of-pointers.\n\t\t\twhile (type_is_pointer(*p_parent_type))\n\t\t\t\tp_parent_type = &get<SPIRType>(p_parent_type->parent_type);\n\n\t\t\t// If we're emitting BDA, just use the templated type.\n\t\t\t// Emitting builtin arrays need a lot of cooperation with other code to ensure\n\t\t\t// the C-style nesting works right.\n\t\t\t// FIXME: This is somewhat of a hack.\n\t\t\tbool old_is_using_builtin_array = is_using_builtin_array;\n\t\t\tif (is_physical_pointer(type))\n\t\t\t\tis_using_builtin_array = false;\n\n\t\t\ttype_name = join(type_address_space, \" \", type_to_glsl(*p_parent_type, id));\n\n\t\t\tis_using_builtin_array = old_is_using_builtin_array;\n\t\t}\n\n\t\tswitch (type.basetype)\n\t\t{\n\t\tcase SPIRType::Image:\n\t\tcase SPIRType::SampledImage:\n\t\tcase SPIRType::Sampler:\n\t\t\t// These are handles.\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t// Anything else can be a raw pointer.\n\t\t\ttype_name += \"*\";\n\t\t\trestrict_kw = to_restrict(id, false);\n\t\t\tif (*restrict_kw)\n\t\t\t{\n\t\t\t\ttype_name += \" \";\n\t\t\t\ttype_name += restrict_kw;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\treturn type_name;\n\t}\n\n\tswitch (type.basetype)\n\t{\n\tcase SPIRType::Struct:\n\t\t// Need OpName lookup here to get a \"sensible\" name for a struct.\n\t\t// Allow Metal to use the array<T> template to make arrays a value type\n\t\ttype_name = to_name(type.self);\n\t\tbreak;\n\n\tcase SPIRType::Image:\n\tcase SPIRType::SampledImage:\n\t\treturn image_type_glsl(type, id);\n\n\tcase SPIRType::Sampler:\n\t\treturn sampler_type(type, id);\n\n\tcase SPIRType::Void:\n\t\treturn \"void\";\n\n\tcase SPIRType::AtomicCounter:\n\t\treturn \"atomic_uint\";\n\n\tcase SPIRType::ControlPointArray:\n\t\treturn join(\"patch_control_point<\", type_to_glsl(get<SPIRType>(type.parent_type), id), \">\");\n\n\tcase SPIRType::Interpolant:\n\t\treturn join(\"interpolant<\", type_to_glsl(get<SPIRType>(type.parent_type), id), \", interpolation::\",\n\t\t            has_decoration(type.self, DecorationNoPerspective) ? \"no_perspective\" : \"perspective\", \">\");\n\n\t// Scalars\n\tcase SPIRType::Boolean:\n\t{\n\t\tauto *var = maybe_get_backing_variable(id);\n\t\tif (var && var->basevariable)\n\t\t\tvar = &get<SPIRVariable>(var->basevariable);\n\n\t\t// Need to special-case threadgroup booleans. They are supposed to be logical\n\t\t// storage, but MSL compilers will sometimes crash if you use threadgroup bool.\n\t\t// Workaround this by using 16-bit types instead and fixup on load-store to this data.\n\t\tif ((var && var->storage == StorageClassWorkgroup) || type.storage == StorageClassWorkgroup || member)\n\t\t\ttype_name = \"short\";\n\t\telse\n\t\t\ttype_name = \"bool\";\n\t\tbreak;\n\t}\n\n\tcase SPIRType::Char:\n\tcase SPIRType::SByte:\n\t\ttype_name = \"char\";\n\t\tbreak;\n\tcase SPIRType::UByte:\n\t\ttype_name = \"uchar\";\n\t\tbreak;\n\tcase SPIRType::Short:\n\t\ttype_name = \"short\";\n\t\tbreak;\n\tcase SPIRType::UShort:\n\t\ttype_name = \"ushort\";\n\t\tbreak;\n\tcase SPIRType::Int:\n\t\ttype_name = \"int\";\n\t\tbreak;\n\tcase SPIRType::UInt:\n\t\ttype_name = \"uint\";\n\t\tbreak;\n\tcase SPIRType::Int64:\n\t\tif (!msl_options.supports_msl_version(2, 2))\n\t\t\tSPIRV_CROSS_THROW(\"64-bit integers are only supported in MSL 2.2 and above.\");\n\t\ttype_name = \"long\";\n\t\tbreak;\n\tcase SPIRType::UInt64:\n\t\tif (!msl_options.supports_msl_version(2, 2))\n\t\t\tSPIRV_CROSS_THROW(\"64-bit integers are only supported in MSL 2.2 and above.\");\n\t\ttype_name = \"ulong\";\n\t\tbreak;\n\tcase SPIRType::Half:\n\t\ttype_name = \"half\";\n\t\tbreak;\n\tcase SPIRType::Float:\n\t\ttype_name = \"float\";\n\t\tbreak;\n\tcase SPIRType::Double:\n\t\ttype_name = \"double\"; // Currently unsupported\n\t\tbreak;\n\tcase SPIRType::AccelerationStructure:\n\t\tif (msl_options.supports_msl_version(2, 4))\n\t\t\ttype_name = \"raytracing::acceleration_structure<raytracing::instancing>\";\n\t\telse if (msl_options.supports_msl_version(2, 3))\n\t\t\ttype_name = \"raytracing::instance_acceleration_structure\";\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"Acceleration Structure Type is supported in MSL 2.3 and above.\");\n\t\tbreak;\n\tcase SPIRType::RayQuery:\n\t\treturn \"raytracing::intersection_query<raytracing::instancing, raytracing::triangle_data>\";\n\n\tdefault:\n\t\treturn \"unknown_type\";\n\t}\n\n\t// Matrix?\n\tif (type.columns > 1)\n\t{\n\t\tauto *var = maybe_get_backing_variable(id);\n\t\tif (var && var->basevariable)\n\t\t\tvar = &get<SPIRVariable>(var->basevariable);\n\n\t\t// Need to special-case threadgroup matrices. Due to an oversight, Metal's\n\t\t// matrix struct prior to Metal 3 lacks constructors in the threadgroup AS,\n\t\t// preventing us from default-constructing or initializing matrices in threadgroup storage.\n\t\t// Work around this by using our own type as storage.\n\t\tif (((var && var->storage == StorageClassWorkgroup) || type.storage == StorageClassWorkgroup) &&\n\t\t    !msl_options.supports_msl_version(3, 0))\n\t\t{\n\t\t\tadd_spv_func_and_recompile(SPVFuncImplStorageMatrix);\n\t\t\ttype_name = \"spvStorage_\" + type_name;\n\t\t}\n\n\t\ttype_name += to_string(type.columns) + \"x\";\n\t}\n\n\t// Vector or Matrix?\n\tif (type.vecsize > 1)\n\t\ttype_name += to_string(type.vecsize);\n\n\tif (type.array.empty() || using_builtin_array())\n\t{\n\t\treturn type_name;\n\t}\n\telse\n\t{\n\t\t// Allow Metal to use the array<T> template to make arrays a value type\n\t\tadd_spv_func_and_recompile(SPVFuncImplUnsafeArray);\n\t\tstring res;\n\t\tstring sizes;\n\n\t\tfor (uint32_t i = 0; i < uint32_t(type.array.size()); i++)\n\t\t{\n\t\t\tres += \"spvUnsafeArray<\";\n\t\t\tsizes += \", \";\n\t\t\tsizes += to_array_size(type, i);\n\t\t\tsizes += \">\";\n\t\t}\n\n\t\tres += type_name + sizes;\n\t\treturn res;\n\t}\n}\n\nstring CompilerMSL::type_to_glsl(const SPIRType &type, uint32_t id)\n{\n\treturn type_to_glsl(type, id, false);\n}\n\nstring CompilerMSL::type_to_array_glsl(const SPIRType &type)\n{\n\t// Allow Metal to use the array<T> template to make arrays a value type\n\tswitch (type.basetype)\n\t{\n\tcase SPIRType::AtomicCounter:\n\tcase SPIRType::ControlPointArray:\n\tcase SPIRType::RayQuery:\n\t\treturn CompilerGLSL::type_to_array_glsl(type);\n\n\tdefault:\n\t\tif (type_is_array_of_pointers(type) || using_builtin_array())\n\t\t\treturn CompilerGLSL::type_to_array_glsl(type);\n\t\telse\n\t\t\treturn \"\";\n\t}\n}\n\nstring CompilerMSL::constant_op_expression(const SPIRConstantOp &cop)\n{\n\tswitch (cop.opcode)\n\t{\n\tcase OpQuantizeToF16:\n\t\tadd_spv_func_and_recompile(SPVFuncImplQuantizeToF16);\n\t\treturn join(\"spvQuantizeToF16(\", to_expression(cop.arguments[0]), \")\");\n\tdefault:\n\t\treturn CompilerGLSL::constant_op_expression(cop);\n\t}\n}\n\nbool CompilerMSL::variable_decl_is_remapped_storage(const SPIRVariable &variable, spv::StorageClass storage) const\n{\n\tif (variable.storage == storage)\n\t\treturn true;\n\n\tif (storage == StorageClassWorkgroup)\n\t{\n\t\t// Specially masked IO block variable.\n\t\t// Normally, we will never access IO blocks directly here.\n\t\t// The only scenario which that should occur is with a masked IO block.\n\t\tif (is_tesc_shader() && variable.storage == StorageClassOutput &&\n\t\t    has_decoration(get<SPIRType>(variable.basetype).self, DecorationBlock))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\treturn variable.storage == StorageClassOutput && is_tesc_shader() && is_stage_output_variable_masked(variable);\n\t}\n\telse if (storage == StorageClassStorageBuffer)\n\t{\n\t\t// These builtins are passed directly; we don't want to use remapping\n\t\t// for them.\n\t\tauto builtin = (BuiltIn)get_decoration(variable.self, DecorationBuiltIn);\n\t\tif (is_tese_shader() && is_builtin_variable(variable) && (builtin == BuiltInTessCoord || builtin == BuiltInPrimitiveId))\n\t\t\treturn false;\n\n\t\t// We won't be able to catch writes to control point outputs here since variable\n\t\t// refers to a function local pointer.\n\t\t// This is fine, as there cannot be concurrent writers to that memory anyways,\n\t\t// so we just ignore that case.\n\n\t\treturn (variable.storage == StorageClassOutput || variable.storage == StorageClassInput) &&\n\t\t       !variable_storage_requires_stage_io(variable.storage) &&\n\t\t       (variable.storage != StorageClassOutput || !is_stage_output_variable_masked(variable));\n\t}\n\telse\n\t{\n\t\treturn false;\n\t}\n}\n\n// GCC workaround of lambdas calling protected funcs\nstd::string CompilerMSL::variable_decl(const SPIRType &type, const std::string &name, uint32_t id)\n{\n\treturn CompilerGLSL::variable_decl(type, name, id);\n}\n\nstd::string CompilerMSL::sampler_type(const SPIRType &type, uint32_t id)\n{\n\tauto *var = maybe_get<SPIRVariable>(id);\n\tif (var && var->basevariable)\n\t{\n\t\t// Check against the base variable, and not a fake ID which might have been generated for this variable.\n\t\tid = var->basevariable;\n\t}\n\n\tif (!type.array.empty())\n\t{\n\t\tif (!msl_options.supports_msl_version(2))\n\t\t\tSPIRV_CROSS_THROW(\"MSL 2.0 or greater is required for arrays of samplers.\");\n\n\t\tif (type.array.size() > 1)\n\t\t\tSPIRV_CROSS_THROW(\"Arrays of arrays of samplers are not supported in MSL.\");\n\n\t\t// Arrays of samplers in MSL must be declared with a special array<T, N> syntax ala C++11 std::array.\n\t\t// If we have a runtime array, it could be a variable-count descriptor set binding.\n\t\tuint32_t array_size = get_resource_array_size(type, id);\n\t\tif (array_size == 0)\n\t\t{\n\t\t\tadd_spv_func_and_recompile(SPVFuncImplVariableDescriptor);\n\t\t\tadd_spv_func_and_recompile(SPVFuncImplVariableDescriptorArray);\n\t\t\tauto &parent = get<SPIRType>(get_pointee_type(type).parent_type);\n\t\t\tif (processing_entry_point)\n\t\t\t\treturn join(\"const device spvDescriptor<\", sampler_type(parent, id), \">*\");\n\t\t\treturn join(\"const spvDescriptorArray<\", sampler_type(parent, id), \">\");\n\t\t}\n\n\t\tauto &parent = get<SPIRType>(get_pointee_type(type).parent_type);\n\t\treturn join(\"array<\", sampler_type(parent, id), \", \", array_size, \">\");\n\t}\n\telse\n\t\treturn \"sampler\";\n}\n\n// Returns an MSL string describing the SPIR-V image type\nstring CompilerMSL::image_type_glsl(const SPIRType &type, uint32_t id)\n{\n\tauto *var = maybe_get<SPIRVariable>(id);\n\tif (var && var->basevariable)\n\t{\n\t\t// For comparison images, check against the base variable,\n\t\t// and not the fake ID which might have been generated for this variable.\n\t\tid = var->basevariable;\n\t}\n\n\tif (!type.array.empty())\n\t{\n\t\tuint32_t major = 2, minor = 0;\n\t\tif (msl_options.is_ios())\n\t\t{\n\t\t\tmajor = 1;\n\t\t\tminor = 2;\n\t\t}\n\t\tif (!msl_options.supports_msl_version(major, minor))\n\t\t{\n\t\t\tif (msl_options.is_ios())\n\t\t\t\tSPIRV_CROSS_THROW(\"MSL 1.2 or greater is required for arrays of textures.\");\n\t\t\telse\n\t\t\t\tSPIRV_CROSS_THROW(\"MSL 2.0 or greater is required for arrays of textures.\");\n\t\t}\n\n\t\tif (type.array.size() > 1)\n\t\t\tSPIRV_CROSS_THROW(\"Arrays of arrays of textures are not supported in MSL.\");\n\n\t\t// Arrays of images in MSL must be declared with a special array<T, N> syntax ala C++11 std::array.\n\t\t// If we have a runtime array, it could be a variable-count descriptor set binding.\n\t\tuint32_t array_size = get_resource_array_size(type, id);\n\t\tif (array_size == 0)\n\t\t{\n\t\t\tadd_spv_func_and_recompile(SPVFuncImplVariableDescriptor);\n\t\t\tadd_spv_func_and_recompile(SPVFuncImplVariableDescriptorArray);\n\t\t\tauto &parent = get<SPIRType>(get_pointee_type(type).parent_type);\n\t\t\treturn join(\"const device spvDescriptor<\", image_type_glsl(parent, id), \">*\");\n\t\t}\n\n\t\tauto &parent = get<SPIRType>(get_pointee_type(type).parent_type);\n\t\treturn join(\"array<\", image_type_glsl(parent, id), \", \", array_size, \">\");\n\t}\n\n\tstring img_type_name;\n\n\t// Bypass pointers because we need the real image struct\n\tauto &img_type = get<SPIRType>(type.self).image;\n\tif (is_depth_image(type, id))\n\t{\n\t\tswitch (img_type.dim)\n\t\t{\n\t\tcase Dim1D:\n\t\tcase Dim2D:\n\t\t\tif (img_type.dim == Dim1D && !msl_options.texture_1D_as_2D)\n\t\t\t{\n\t\t\t\t// Use a native Metal 1D texture\n\t\t\t\timg_type_name += \"depth1d_unsupported_by_metal\";\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (img_type.ms && img_type.arrayed)\n\t\t\t{\n\t\t\t\tif (!msl_options.supports_msl_version(2, 1))\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Multisampled array textures are supported from 2.1.\");\n\t\t\t\timg_type_name += \"depth2d_ms_array\";\n\t\t\t}\n\t\t\telse if (img_type.ms)\n\t\t\t\timg_type_name += \"depth2d_ms\";\n\t\t\telse if (img_type.arrayed)\n\t\t\t\timg_type_name += \"depth2d_array\";\n\t\t\telse\n\t\t\t\timg_type_name += \"depth2d\";\n\t\t\tbreak;\n\t\tcase Dim3D:\n\t\t\timg_type_name += \"depth3d_unsupported_by_metal\";\n\t\t\tbreak;\n\t\tcase DimCube:\n\t\t\tif (!msl_options.emulate_cube_array)\n\t\t\t\timg_type_name += (img_type.arrayed ? \"depthcube_array\" : \"depthcube\");\n\t\t\telse\n\t\t\t\timg_type_name += (img_type.arrayed ? \"depth2d_array\" : \"depthcube\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\timg_type_name += \"unknown_depth_texture_type\";\n\t\t\tbreak;\n\t\t}\n\t}\n\telse\n\t{\n\t\tswitch (img_type.dim)\n\t\t{\n\t\tcase DimBuffer:\n\t\t\tif (img_type.ms || img_type.arrayed)\n\t\t\t\tSPIRV_CROSS_THROW(\"Cannot use texel buffers with multisampling or array layers.\");\n\n\t\t\tif (msl_options.texture_buffer_native)\n\t\t\t{\n\t\t\t\tif (!msl_options.supports_msl_version(2, 1))\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Native texture_buffer type is only supported in MSL 2.1.\");\n\t\t\t\timg_type_name = \"texture_buffer\";\n\t\t\t}\n\t\t\telse\n\t\t\t\timg_type_name += \"texture2d\";\n\t\t\tbreak;\n\t\tcase Dim1D:\n\t\tcase Dim2D:\n\t\tcase DimSubpassData:\n\t\t{\n\t\t\tbool subpass_array =\n\t\t\t    img_type.dim == DimSubpassData && (msl_options.multiview || msl_options.arrayed_subpass_input);\n\t\t\tif (img_type.dim == Dim1D && !msl_options.texture_1D_as_2D)\n\t\t\t{\n\t\t\t\t// Use a native Metal 1D texture\n\t\t\t\timg_type_name += (img_type.arrayed ? \"texture1d_array\" : \"texture1d\");\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Use Metal's native frame-buffer fetch API for subpass inputs.\n\t\t\tif (type_is_msl_framebuffer_fetch(type))\n\t\t\t{\n\t\t\t\tauto img_type_4 = get<SPIRType>(img_type.type);\n\t\t\t\timg_type_4.vecsize = 4;\n\t\t\t\treturn type_to_glsl(img_type_4);\n\t\t\t}\n\t\t\tif (img_type.ms && (img_type.arrayed || subpass_array))\n\t\t\t{\n\t\t\t\tif (!msl_options.supports_msl_version(2, 1))\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Multisampled array textures are supported from 2.1.\");\n\t\t\t\timg_type_name += \"texture2d_ms_array\";\n\t\t\t}\n\t\t\telse if (img_type.ms)\n\t\t\t\timg_type_name += \"texture2d_ms\";\n\t\t\telse if (img_type.arrayed || subpass_array)\n\t\t\t\timg_type_name += \"texture2d_array\";\n\t\t\telse\n\t\t\t\timg_type_name += \"texture2d\";\n\t\t\tbreak;\n\t\t}\n\t\tcase Dim3D:\n\t\t\timg_type_name += \"texture3d\";\n\t\t\tbreak;\n\t\tcase DimCube:\n\t\t\tif (!msl_options.emulate_cube_array)\n\t\t\t\timg_type_name += (img_type.arrayed ? \"texturecube_array\" : \"texturecube\");\n\t\t\telse\n\t\t\t\timg_type_name += (img_type.arrayed ? \"texture2d_array\" : \"texturecube\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\timg_type_name += \"unknown_texture_type\";\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Append the pixel type\n\timg_type_name += \"<\";\n\timg_type_name += type_to_glsl(get<SPIRType>(img_type.type));\n\n\t// For unsampled images, append the sample/read/write access qualifier.\n\t// For kernel images, the access qualifier my be supplied directly by SPIR-V.\n\t// Otherwise it may be set based on whether the image is read from or written to within the shader.\n\tif (type.basetype == SPIRType::Image && type.image.sampled == 2 && type.image.dim != DimSubpassData)\n\t{\n\t\tswitch (img_type.access)\n\t\t{\n\t\tcase AccessQualifierReadOnly:\n\t\t\timg_type_name += \", access::read\";\n\t\t\tbreak;\n\n\t\tcase AccessQualifierWriteOnly:\n\t\t\timg_type_name += \", access::write\";\n\t\t\tbreak;\n\n\t\tcase AccessQualifierReadWrite:\n\t\t\timg_type_name += \", access::read_write\";\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t{\n\t\t\tauto *p_var = maybe_get_backing_variable(id);\n\t\t\tif (p_var && p_var->basevariable)\n\t\t\t\tp_var = maybe_get<SPIRVariable>(p_var->basevariable);\n\t\t\tif (p_var && !has_decoration(p_var->self, DecorationNonWritable))\n\t\t\t{\n\t\t\t\timg_type_name += \", access::\";\n\n\t\t\t\tif (!has_decoration(p_var->self, DecorationNonReadable))\n\t\t\t\t\timg_type_name += \"read_\";\n\n\t\t\t\timg_type_name += \"write\";\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\t}\n\t}\n\n\timg_type_name += \">\";\n\n\treturn img_type_name;\n}\n\nvoid CompilerMSL::emit_subgroup_op(const Instruction &i)\n{\n\tconst uint32_t *ops = stream(i);\n\tauto op = static_cast<Op>(i.op);\n\n\tif (msl_options.emulate_subgroups)\n\t{\n\t\t// In this mode, only the GroupNonUniform cap is supported. The only op\n\t\t// we need to handle, then, is OpGroupNonUniformElect.\n\t\tif (op != OpGroupNonUniformElect)\n\t\t\tSPIRV_CROSS_THROW(\"Subgroup emulation does not support operations other than Elect.\");\n\t\t// In this mode, the subgroup size is assumed to be one, so every invocation\n\t\t// is elected.\n\t\temit_op(ops[0], ops[1], \"true\", true);\n\t\treturn;\n\t}\n\n\t// Metal 2.0 is required. iOS only supports quad ops on 11.0 (2.0), with\n\t// full support in 13.0 (2.2). macOS only supports broadcast and shuffle on\n\t// 10.13 (2.0), with full support in 10.14 (2.1).\n\t// Note that Apple GPUs before A13 make no distinction between a quad-group\n\t// and a SIMD-group; all SIMD-groups are quad-groups on those.\n\tif (!msl_options.supports_msl_version(2))\n\t\tSPIRV_CROSS_THROW(\"Subgroups are only supported in Metal 2.0 and up.\");\n\n\t// If we need to do implicit bitcasts, make sure we do it with the correct type.\n\tuint32_t integer_width = get_integer_width_for_instruction(i);\n\tauto int_type = to_signed_basetype(integer_width);\n\tauto uint_type = to_unsigned_basetype(integer_width);\n\n\tif (msl_options.is_ios() && (!msl_options.supports_msl_version(2, 3) || !msl_options.ios_use_simdgroup_functions))\n\t{\n\t\tswitch (op)\n\t\t{\n\t\tdefault:\n\t\t\tSPIRV_CROSS_THROW(\"Subgroup ops beyond broadcast, ballot, and shuffle on iOS require Metal 2.3 and up.\");\n\t\tcase OpGroupNonUniformBroadcastFirst:\n\t\t\tif (!msl_options.supports_msl_version(2, 2))\n\t\t\t\tSPIRV_CROSS_THROW(\"BroadcastFirst on iOS requires Metal 2.2 and up.\");\n\t\t\tbreak;\n\t\tcase OpGroupNonUniformElect:\n\t\t\tif (!msl_options.supports_msl_version(2, 2))\n\t\t\t\tSPIRV_CROSS_THROW(\"Elect on iOS requires Metal 2.2 and up.\");\n\t\t\tbreak;\n\t\tcase OpGroupNonUniformAny:\n\t\tcase OpGroupNonUniformAll:\n\t\tcase OpGroupNonUniformAllEqual:\n\t\tcase OpGroupNonUniformBallot:\n\t\tcase OpGroupNonUniformInverseBallot:\n\t\tcase OpGroupNonUniformBallotBitExtract:\n\t\tcase OpGroupNonUniformBallotFindLSB:\n\t\tcase OpGroupNonUniformBallotFindMSB:\n\t\tcase OpGroupNonUniformBallotBitCount:\n\t\tcase OpSubgroupBallotKHR:\n\t\tcase OpSubgroupAllKHR:\n\t\tcase OpSubgroupAnyKHR:\n\t\tcase OpSubgroupAllEqualKHR:\n\t\t\tif (!msl_options.supports_msl_version(2, 2))\n\t\t\t\tSPIRV_CROSS_THROW(\"Ballot ops on iOS requires Metal 2.2 and up.\");\n\t\t\tbreak;\n\t\tcase OpGroupNonUniformBroadcast:\n\t\tcase OpGroupNonUniformShuffle:\n\t\tcase OpGroupNonUniformShuffleXor:\n\t\tcase OpGroupNonUniformShuffleUp:\n\t\tcase OpGroupNonUniformShuffleDown:\n\t\tcase OpGroupNonUniformQuadSwap:\n\t\tcase OpGroupNonUniformQuadBroadcast:\n\t\tcase OpSubgroupReadInvocationKHR:\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (msl_options.is_macos() && !msl_options.supports_msl_version(2, 1))\n\t{\n\t\tswitch (op)\n\t\t{\n\t\tdefault:\n\t\t\tSPIRV_CROSS_THROW(\"Subgroup ops beyond broadcast and shuffle on macOS require Metal 2.1 and up.\");\n\t\tcase OpGroupNonUniformBroadcast:\n\t\tcase OpGroupNonUniformShuffle:\n\t\tcase OpGroupNonUniformShuffleXor:\n\t\tcase OpGroupNonUniformShuffleUp:\n\t\tcase OpGroupNonUniformShuffleDown:\n\t\tcase OpSubgroupReadInvocationKHR:\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tuint32_t op_idx = 0;\n\tuint32_t result_type = ops[op_idx++];\n\tuint32_t id = ops[op_idx++];\n\n\tScope scope;\n\tswitch (op)\n\t{\n\tcase OpSubgroupBallotKHR:\n\tcase OpSubgroupFirstInvocationKHR:\n\tcase OpSubgroupReadInvocationKHR:\n\tcase OpSubgroupAllKHR:\n\tcase OpSubgroupAnyKHR:\n\tcase OpSubgroupAllEqualKHR:\n\t\t// These earlier instructions don't have the scope operand.\n\t\tscope = ScopeSubgroup;\n\t\tbreak;\n\tdefault:\n\t\tscope = static_cast<Scope>(evaluate_constant_u32(ops[op_idx++]));\n\t\tbreak;\n\t}\n\tif (scope != ScopeSubgroup)\n\t\tSPIRV_CROSS_THROW(\"Only subgroup scope is supported.\");\n\n\tswitch (op)\n\t{\n\tcase OpGroupNonUniformElect:\n\t\tif (msl_options.use_quadgroup_operation())\n\t\t\temit_op(result_type, id, \"quad_is_first()\", false);\n\t\telse\n\t\t\temit_op(result_type, id, \"simd_is_first()\", false);\n\t\tbreak;\n\n\tcase OpGroupNonUniformBroadcast:\n\tcase OpSubgroupReadInvocationKHR:\n\t\temit_binary_func_op(result_type, id, ops[op_idx], ops[op_idx + 1], \"spvSubgroupBroadcast\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformBroadcastFirst:\n\tcase OpSubgroupFirstInvocationKHR:\n\t\temit_unary_func_op(result_type, id, ops[op_idx], \"spvSubgroupBroadcastFirst\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformBallot:\n\tcase OpSubgroupBallotKHR:\n\t\temit_unary_func_op(result_type, id, ops[op_idx], \"spvSubgroupBallot\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformInverseBallot:\n\t\temit_binary_func_op(result_type, id, ops[op_idx], builtin_subgroup_invocation_id_id, \"spvSubgroupBallotBitExtract\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformBallotBitExtract:\n\t\temit_binary_func_op(result_type, id, ops[op_idx], ops[op_idx + 1], \"spvSubgroupBallotBitExtract\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformBallotFindLSB:\n\t\temit_binary_func_op(result_type, id, ops[op_idx], builtin_subgroup_size_id, \"spvSubgroupBallotFindLSB\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformBallotFindMSB:\n\t\temit_binary_func_op(result_type, id, ops[op_idx], builtin_subgroup_size_id, \"spvSubgroupBallotFindMSB\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformBallotBitCount:\n\t{\n\t\tauto operation = static_cast<GroupOperation>(ops[op_idx++]);\n\t\tswitch (operation)\n\t\t{\n\t\tcase GroupOperationReduce:\n\t\t\temit_binary_func_op(result_type, id, ops[op_idx], builtin_subgroup_size_id, \"spvSubgroupBallotBitCount\");\n\t\t\tbreak;\n\t\tcase GroupOperationInclusiveScan:\n\t\t\temit_binary_func_op(result_type, id, ops[op_idx], builtin_subgroup_invocation_id_id,\n\t\t\t                    \"spvSubgroupBallotInclusiveBitCount\");\n\t\t\tbreak;\n\t\tcase GroupOperationExclusiveScan:\n\t\t\temit_binary_func_op(result_type, id, ops[op_idx], builtin_subgroup_invocation_id_id,\n\t\t\t                    \"spvSubgroupBallotExclusiveBitCount\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tSPIRV_CROSS_THROW(\"Invalid BitCount operation.\");\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpGroupNonUniformShuffle:\n\t\temit_binary_func_op(result_type, id, ops[op_idx], ops[op_idx + 1], \"spvSubgroupShuffle\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformShuffleXor:\n\t\temit_binary_func_op(result_type, id, ops[op_idx], ops[op_idx + 1], \"spvSubgroupShuffleXor\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformShuffleUp:\n\t\temit_binary_func_op(result_type, id, ops[op_idx], ops[op_idx + 1], \"spvSubgroupShuffleUp\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformShuffleDown:\n\t\temit_binary_func_op(result_type, id, ops[op_idx], ops[op_idx + 1], \"spvSubgroupShuffleDown\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformAll:\n\tcase OpSubgroupAllKHR:\n\t\tif (msl_options.use_quadgroup_operation())\n\t\t\temit_unary_func_op(result_type, id, ops[op_idx], \"quad_all\");\n\t\telse\n\t\t\temit_unary_func_op(result_type, id, ops[op_idx], \"simd_all\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformAny:\n\tcase OpSubgroupAnyKHR:\n\t\tif (msl_options.use_quadgroup_operation())\n\t\t\temit_unary_func_op(result_type, id, ops[op_idx], \"quad_any\");\n\t\telse\n\t\t\temit_unary_func_op(result_type, id, ops[op_idx], \"simd_any\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformAllEqual:\n\tcase OpSubgroupAllEqualKHR:\n\t\temit_unary_func_op(result_type, id, ops[op_idx], \"spvSubgroupAllEqual\");\n\t\tbreak;\n\n\t\t// clang-format off\n#define MSL_GROUP_OP(op, msl_op) \\\ncase OpGroupNonUniform##op: \\\n\t{ \\\n\t\tauto operation = static_cast<GroupOperation>(ops[op_idx++]); \\\n\t\tif (operation == GroupOperationReduce) \\\n\t\t\temit_unary_func_op(result_type, id, ops[op_idx], \"simd_\" #msl_op); \\\n\t\telse if (operation == GroupOperationInclusiveScan) \\\n\t\t\temit_unary_func_op(result_type, id, ops[op_idx], \"simd_prefix_inclusive_\" #msl_op); \\\n\t\telse if (operation == GroupOperationExclusiveScan) \\\n\t\t\temit_unary_func_op(result_type, id, ops[op_idx], \"simd_prefix_exclusive_\" #msl_op); \\\n\t\telse if (operation == GroupOperationClusteredReduce) \\\n\t\t{ \\\n\t\t\t/* Only cluster sizes of 4 are supported. */ \\\n\t\t\tuint32_t cluster_size = evaluate_constant_u32(ops[op_idx + 1]); \\\n\t\t\tif (cluster_size != 4) \\\n\t\t\t\tSPIRV_CROSS_THROW(\"Metal only supports quad ClusteredReduce.\"); \\\n\t\t\temit_unary_func_op(result_type, id, ops[op_idx], \"quad_\" #msl_op); \\\n\t\t} \\\n\t\telse \\\n\t\t\tSPIRV_CROSS_THROW(\"Invalid group operation.\"); \\\n\t\tbreak; \\\n\t}\n\tMSL_GROUP_OP(FAdd, sum)\n\tMSL_GROUP_OP(FMul, product)\n\tMSL_GROUP_OP(IAdd, sum)\n\tMSL_GROUP_OP(IMul, product)\n#undef MSL_GROUP_OP\n\t// The others, unfortunately, don't support InclusiveScan or ExclusiveScan.\n\n#define MSL_GROUP_OP(op, msl_op) \\\ncase OpGroupNonUniform##op: \\\n\t{ \\\n\t\tauto operation = static_cast<GroupOperation>(ops[op_idx++]); \\\n\t\tif (operation == GroupOperationReduce) \\\n\t\t\temit_unary_func_op(result_type, id, ops[op_idx], \"simd_\" #msl_op); \\\n\t\telse if (operation == GroupOperationInclusiveScan) \\\n\t\t\tSPIRV_CROSS_THROW(\"Metal doesn't support InclusiveScan for OpGroupNonUniform\" #op \".\"); \\\n\t\telse if (operation == GroupOperationExclusiveScan) \\\n\t\t\tSPIRV_CROSS_THROW(\"Metal doesn't support ExclusiveScan for OpGroupNonUniform\" #op \".\"); \\\n\t\telse if (operation == GroupOperationClusteredReduce) \\\n\t\t{ \\\n\t\t\t/* Only cluster sizes of 4 are supported. */ \\\n\t\t\tuint32_t cluster_size = evaluate_constant_u32(ops[op_idx + 1]); \\\n\t\t\tif (cluster_size != 4) \\\n\t\t\t\tSPIRV_CROSS_THROW(\"Metal only supports quad ClusteredReduce.\"); \\\n\t\t\temit_unary_func_op(result_type, id, ops[op_idx], \"quad_\" #msl_op); \\\n\t\t} \\\n\t\telse \\\n\t\t\tSPIRV_CROSS_THROW(\"Invalid group operation.\"); \\\n\t\tbreak; \\\n\t}\n\n#define MSL_GROUP_OP_CAST(op, msl_op, type) \\\ncase OpGroupNonUniform##op: \\\n\t{ \\\n\t\tauto operation = static_cast<GroupOperation>(ops[op_idx++]); \\\n\t\tif (operation == GroupOperationReduce) \\\n\t\t\temit_unary_func_op_cast(result_type, id, ops[op_idx], \"simd_\" #msl_op, type, type); \\\n\t\telse if (operation == GroupOperationInclusiveScan) \\\n\t\t\tSPIRV_CROSS_THROW(\"Metal doesn't support InclusiveScan for OpGroupNonUniform\" #op \".\"); \\\n\t\telse if (operation == GroupOperationExclusiveScan) \\\n\t\t\tSPIRV_CROSS_THROW(\"Metal doesn't support ExclusiveScan for OpGroupNonUniform\" #op \".\"); \\\n\t\telse if (operation == GroupOperationClusteredReduce) \\\n\t\t{ \\\n\t\t\t/* Only cluster sizes of 4 are supported. */ \\\n\t\t\tuint32_t cluster_size = evaluate_constant_u32(ops[op_idx + 1]); \\\n\t\t\tif (cluster_size != 4) \\\n\t\t\t\tSPIRV_CROSS_THROW(\"Metal only supports quad ClusteredReduce.\"); \\\n\t\t\temit_unary_func_op_cast(result_type, id, ops[op_idx], \"quad_\" #msl_op, type, type); \\\n\t\t} \\\n\t\telse \\\n\t\t\tSPIRV_CROSS_THROW(\"Invalid group operation.\"); \\\n\t\tbreak; \\\n\t}\n\n\tMSL_GROUP_OP(FMin, min)\n\tMSL_GROUP_OP(FMax, max)\n\tMSL_GROUP_OP_CAST(SMin, min, int_type)\n\tMSL_GROUP_OP_CAST(SMax, max, int_type)\n\tMSL_GROUP_OP_CAST(UMin, min, uint_type)\n\tMSL_GROUP_OP_CAST(UMax, max, uint_type)\n\tMSL_GROUP_OP(BitwiseAnd, and)\n\tMSL_GROUP_OP(BitwiseOr, or)\n\tMSL_GROUP_OP(BitwiseXor, xor)\n\tMSL_GROUP_OP(LogicalAnd, and)\n\tMSL_GROUP_OP(LogicalOr, or)\n\tMSL_GROUP_OP(LogicalXor, xor)\n\t\t// clang-format on\n#undef MSL_GROUP_OP\n#undef MSL_GROUP_OP_CAST\n\n\tcase OpGroupNonUniformQuadSwap:\n\t\temit_binary_func_op(result_type, id, ops[op_idx], ops[op_idx + 1], \"spvQuadSwap\");\n\t\tbreak;\n\n\tcase OpGroupNonUniformQuadBroadcast:\n\t\temit_binary_func_op(result_type, id, ops[op_idx], ops[op_idx + 1], \"spvQuadBroadcast\");\n\t\tbreak;\n\n\tdefault:\n\t\tSPIRV_CROSS_THROW(\"Invalid opcode for subgroup.\");\n\t}\n\n\tregister_control_dependent_expression(id);\n}\n\nstring CompilerMSL::bitcast_glsl_op(const SPIRType &out_type, const SPIRType &in_type)\n{\n\tif (out_type.basetype == in_type.basetype)\n\t\treturn \"\";\n\n\tassert(out_type.basetype != SPIRType::Boolean);\n\tassert(in_type.basetype != SPIRType::Boolean);\n\n\tbool integral_cast = type_is_integral(out_type) && type_is_integral(in_type) && (out_type.vecsize == in_type.vecsize);\n\tbool same_size_cast = (out_type.width * out_type.vecsize) == (in_type.width * in_type.vecsize);\n\n\t// Bitcasting can only be used between types of the same overall size.\n\t// And always formally cast between integers, because it's trivial, and also\n\t// because Metal can internally cast the results of some integer ops to a larger\n\t// size (eg. short shift right becomes int), which means chaining integer ops\n\t// together may introduce size variations that SPIR-V doesn't know about.\n\tif (same_size_cast && !integral_cast)\n\t\treturn \"as_type<\" + type_to_glsl(out_type) + \">\";\n\telse\n\t\treturn type_to_glsl(out_type);\n}\n\nbool CompilerMSL::emit_complex_bitcast(uint32_t, uint32_t, uint32_t)\n{\n\t// This is handled from the outside where we deal with PtrToU/UToPtr and friends.\n\treturn false;\n}\n\n// Returns an MSL string identifying the name of a SPIR-V builtin.\n// Output builtins are qualified with the name of the stage out structure.\nstring CompilerMSL::builtin_to_glsl(BuiltIn builtin, StorageClass storage)\n{\n\tswitch (builtin)\n\t{\n\t// Handle HLSL-style 0-based vertex/instance index.\n\t// Override GLSL compiler strictness\n\tcase BuiltInVertexId:\n\t\tensure_builtin(StorageClassInput, BuiltInVertexId);\n\t\tif (msl_options.enable_base_index_zero && msl_options.supports_msl_version(1, 1) &&\n\t\t    (msl_options.ios_support_base_vertex_instance || msl_options.is_macos()))\n\t\t{\n\t\t\tif (builtin_declaration)\n\t\t\t{\n\t\t\t\tif (needs_base_vertex_arg != TriState::No)\n\t\t\t\t\tneeds_base_vertex_arg = TriState::Yes;\n\t\t\t\treturn \"gl_VertexID\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tensure_builtin(StorageClassInput, BuiltInBaseVertex);\n\t\t\t\treturn \"(gl_VertexID - gl_BaseVertex)\";\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn \"gl_VertexID\";\n\t\t}\n\tcase BuiltInInstanceId:\n\t\tensure_builtin(StorageClassInput, BuiltInInstanceId);\n\t\tif (msl_options.enable_base_index_zero && msl_options.supports_msl_version(1, 1) &&\n\t\t    (msl_options.ios_support_base_vertex_instance || msl_options.is_macos()))\n\t\t{\n\t\t\tif (builtin_declaration)\n\t\t\t{\n\t\t\t\tif (needs_base_instance_arg != TriState::No)\n\t\t\t\t\tneeds_base_instance_arg = TriState::Yes;\n\t\t\t\treturn \"gl_InstanceID\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tensure_builtin(StorageClassInput, BuiltInBaseInstance);\n\t\t\t\treturn \"(gl_InstanceID - gl_BaseInstance)\";\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn \"gl_InstanceID\";\n\t\t}\n\tcase BuiltInVertexIndex:\n\t\tensure_builtin(StorageClassInput, BuiltInVertexIndex);\n\t\tif (msl_options.enable_base_index_zero && msl_options.supports_msl_version(1, 1) &&\n\t\t    (msl_options.ios_support_base_vertex_instance || msl_options.is_macos()))\n\t\t{\n\t\t\tif (builtin_declaration)\n\t\t\t{\n\t\t\t\tif (needs_base_vertex_arg != TriState::No)\n\t\t\t\t\tneeds_base_vertex_arg = TriState::Yes;\n\t\t\t\treturn \"gl_VertexIndex\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tensure_builtin(StorageClassInput, BuiltInBaseVertex);\n\t\t\t\treturn \"(gl_VertexIndex - gl_BaseVertex)\";\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn \"gl_VertexIndex\";\n\t\t}\n\tcase BuiltInInstanceIndex:\n\t\tensure_builtin(StorageClassInput, BuiltInInstanceIndex);\n\t\tif (msl_options.enable_base_index_zero && msl_options.supports_msl_version(1, 1) &&\n\t\t    (msl_options.ios_support_base_vertex_instance || msl_options.is_macos()))\n\t\t{\n\t\t\tif (builtin_declaration)\n\t\t\t{\n\t\t\t\tif (needs_base_instance_arg != TriState::No)\n\t\t\t\t\tneeds_base_instance_arg = TriState::Yes;\n\t\t\t\treturn \"gl_InstanceIndex\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tensure_builtin(StorageClassInput, BuiltInBaseInstance);\n\t\t\t\treturn \"(gl_InstanceIndex - gl_BaseInstance)\";\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn \"gl_InstanceIndex\";\n\t\t}\n\tcase BuiltInBaseVertex:\n\t\tif (msl_options.supports_msl_version(1, 1) &&\n\t\t    (msl_options.ios_support_base_vertex_instance || msl_options.is_macos()))\n\t\t{\n\t\t\tneeds_base_vertex_arg = TriState::No;\n\t\t\treturn \"gl_BaseVertex\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSPIRV_CROSS_THROW(\"BaseVertex requires Metal 1.1 and Mac or Apple A9+ hardware.\");\n\t\t}\n\tcase BuiltInBaseInstance:\n\t\tif (msl_options.supports_msl_version(1, 1) &&\n\t\t    (msl_options.ios_support_base_vertex_instance || msl_options.is_macos()))\n\t\t{\n\t\t\tneeds_base_instance_arg = TriState::No;\n\t\t\treturn \"gl_BaseInstance\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSPIRV_CROSS_THROW(\"BaseInstance requires Metal 1.1 and Mac or Apple A9+ hardware.\");\n\t\t}\n\tcase BuiltInDrawIndex:\n\t\tSPIRV_CROSS_THROW(\"DrawIndex is not supported in MSL.\");\n\n\t// When used in the entry function, output builtins are qualified with output struct name.\n\t// Test storage class as NOT Input, as output builtins might be part of generic type.\n\t// Also don't do this for tessellation control shaders.\n\tcase BuiltInViewportIndex:\n\t\tif (!msl_options.supports_msl_version(2, 0))\n\t\t\tSPIRV_CROSS_THROW(\"ViewportIndex requires Metal 2.0.\");\n\t\t/* fallthrough */\n\tcase BuiltInFragDepth:\n\tcase BuiltInFragStencilRefEXT:\n\t\tif ((builtin == BuiltInFragDepth && !msl_options.enable_frag_depth_builtin) ||\n\t\t    (builtin == BuiltInFragStencilRefEXT && !msl_options.enable_frag_stencil_ref_builtin))\n\t\t\tbreak;\n\t\t/* fallthrough */\n\tcase BuiltInPosition:\n\tcase BuiltInPointSize:\n\tcase BuiltInClipDistance:\n\tcase BuiltInCullDistance:\n\tcase BuiltInLayer:\n\t\tif (is_tesc_shader())\n\t\t\tbreak;\n\t\tif (storage != StorageClassInput && current_function && (current_function->self == ir.default_entry_point) &&\n\t\t    !is_stage_output_builtin_masked(builtin))\n\t\t\treturn stage_out_var_name + \".\" + CompilerGLSL::builtin_to_glsl(builtin, storage);\n\t\tbreak;\n\n\tcase BuiltInSampleMask:\n\t\tif (storage == StorageClassInput && current_function && (current_function->self == ir.default_entry_point) &&\n\t\t\t(has_additional_fixed_sample_mask() || needs_sample_id))\n\t\t{\n\t\t\tstring samp_mask_in;\n\t\t\tsamp_mask_in += \"(\" + CompilerGLSL::builtin_to_glsl(builtin, storage);\n\t\t\tif (has_additional_fixed_sample_mask())\n\t\t\t\tsamp_mask_in += \" & \" + additional_fixed_sample_mask_str();\n\t\t\tif (needs_sample_id)\n\t\t\t\tsamp_mask_in += \" & (1 << gl_SampleID)\";\n\t\t\tsamp_mask_in += \")\";\n\t\t\treturn samp_mask_in;\n\t\t}\n\t\tif (storage != StorageClassInput && current_function && (current_function->self == ir.default_entry_point) &&\n\t\t    !is_stage_output_builtin_masked(builtin))\n\t\t\treturn stage_out_var_name + \".\" + CompilerGLSL::builtin_to_glsl(builtin, storage);\n\t\tbreak;\n\n\tcase BuiltInBaryCoordKHR:\n\tcase BuiltInBaryCoordNoPerspKHR:\n\t\tif (storage == StorageClassInput && current_function && (current_function->self == ir.default_entry_point))\n\t\t\treturn stage_in_var_name + \".\" + CompilerGLSL::builtin_to_glsl(builtin, storage);\n\t\tbreak;\n\n\tcase BuiltInTessLevelOuter:\n\t\tif (is_tesc_shader() && storage != StorageClassInput && current_function &&\n\t\t    (current_function->self == ir.default_entry_point))\n\t\t{\n\t\t\treturn join(tess_factor_buffer_var_name, \"[\", to_expression(builtin_primitive_id_id),\n\t\t\t            \"].edgeTessellationFactor\");\n\t\t}\n\t\tbreak;\n\n\tcase BuiltInTessLevelInner:\n\t\tif (is_tesc_shader() && storage != StorageClassInput && current_function &&\n\t\t    (current_function->self == ir.default_entry_point))\n\t\t{\n\t\t\treturn join(tess_factor_buffer_var_name, \"[\", to_expression(builtin_primitive_id_id),\n\t\t\t            \"].insideTessellationFactor\");\n\t\t}\n\t\tbreak;\n\n\tcase BuiltInHelperInvocation:\n\t\tif (needs_manual_helper_invocation_updates())\n\t\t\tbreak;\n\t\tif (msl_options.is_ios() && !msl_options.supports_msl_version(2, 3))\n\t\t\tSPIRV_CROSS_THROW(\"simd_is_helper_thread() requires version 2.3 on iOS.\");\n\t\telse if (msl_options.is_macos() && !msl_options.supports_msl_version(2, 1))\n\t\t\tSPIRV_CROSS_THROW(\"simd_is_helper_thread() requires version 2.1 on macOS.\");\n\t\t// In SPIR-V 1.6 with Volatile HelperInvocation, we cannot emit a fixup early.\n\t\treturn \"simd_is_helper_thread()\";\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn CompilerGLSL::builtin_to_glsl(builtin, storage);\n}\n\n// Returns an MSL string attribute qualifer for a SPIR-V builtin\nstring CompilerMSL::builtin_qualifier(BuiltIn builtin)\n{\n\tauto &execution = get_entry_point();\n\n\tswitch (builtin)\n\t{\n\t// Vertex function in\n\tcase BuiltInVertexId:\n\t\treturn \"vertex_id\";\n\tcase BuiltInVertexIndex:\n\t\treturn \"vertex_id\";\n\tcase BuiltInBaseVertex:\n\t\treturn \"base_vertex\";\n\tcase BuiltInInstanceId:\n\t\treturn \"instance_id\";\n\tcase BuiltInInstanceIndex:\n\t\treturn \"instance_id\";\n\tcase BuiltInBaseInstance:\n\t\treturn \"base_instance\";\n\tcase BuiltInDrawIndex:\n\t\tSPIRV_CROSS_THROW(\"DrawIndex is not supported in MSL.\");\n\n\t// Vertex function out\n\tcase BuiltInClipDistance:\n\t\treturn \"clip_distance\";\n\tcase BuiltInPointSize:\n\t\treturn \"point_size\";\n\tcase BuiltInPosition:\n\t\tif (position_invariant)\n\t\t{\n\t\t\tif (!msl_options.supports_msl_version(2, 1))\n\t\t\t\tSPIRV_CROSS_THROW(\"Invariant position is only supported on MSL 2.1 and up.\");\n\t\t\treturn \"position, invariant\";\n\t\t}\n\t\telse\n\t\t\treturn \"position\";\n\tcase BuiltInLayer:\n\t\treturn \"render_target_array_index\";\n\tcase BuiltInViewportIndex:\n\t\tif (!msl_options.supports_msl_version(2, 0))\n\t\t\tSPIRV_CROSS_THROW(\"ViewportIndex requires Metal 2.0.\");\n\t\treturn \"viewport_array_index\";\n\n\t// Tess. control function in\n\tcase BuiltInInvocationId:\n\t\tif (msl_options.multi_patch_workgroup)\n\t\t{\n\t\t\t// Shouldn't be reached.\n\t\t\tSPIRV_CROSS_THROW(\"InvocationId is computed manually with multi-patch workgroups in MSL.\");\n\t\t}\n\t\treturn \"thread_index_in_threadgroup\";\n\tcase BuiltInPatchVertices:\n\t\t// Shouldn't be reached.\n\t\tSPIRV_CROSS_THROW(\"PatchVertices is derived from the auxiliary buffer in MSL.\");\n\tcase BuiltInPrimitiveId:\n\t\tswitch (execution.model)\n\t\t{\n\t\tcase ExecutionModelTessellationControl:\n\t\t\tif (msl_options.multi_patch_workgroup)\n\t\t\t{\n\t\t\t\t// Shouldn't be reached.\n\t\t\t\tSPIRV_CROSS_THROW(\"PrimitiveId is computed manually with multi-patch workgroups in MSL.\");\n\t\t\t}\n\t\t\treturn \"threadgroup_position_in_grid\";\n\t\tcase ExecutionModelTessellationEvaluation:\n\t\t\treturn \"patch_id\";\n\t\tcase ExecutionModelFragment:\n\t\t\tif (msl_options.is_ios() && !msl_options.supports_msl_version(2, 3))\n\t\t\t\tSPIRV_CROSS_THROW(\"PrimitiveId on iOS requires MSL 2.3.\");\n\t\t\telse if (msl_options.is_macos() && !msl_options.supports_msl_version(2, 2))\n\t\t\t\tSPIRV_CROSS_THROW(\"PrimitiveId on macOS requires MSL 2.2.\");\n\t\t\treturn \"primitive_id\";\n\t\tdefault:\n\t\t\tSPIRV_CROSS_THROW(\"PrimitiveId is not supported in this execution model.\");\n\t\t}\n\n\t// Tess. control function out\n\tcase BuiltInTessLevelOuter:\n\tcase BuiltInTessLevelInner:\n\t\t// Shouldn't be reached.\n\t\tSPIRV_CROSS_THROW(\"Tessellation levels are handled specially in MSL.\");\n\n\t// Tess. evaluation function in\n\tcase BuiltInTessCoord:\n\t\treturn \"position_in_patch\";\n\n\t// Fragment function in\n\tcase BuiltInFrontFacing:\n\t\treturn \"front_facing\";\n\tcase BuiltInPointCoord:\n\t\treturn \"point_coord\";\n\tcase BuiltInFragCoord:\n\t\treturn \"position\";\n\tcase BuiltInSampleId:\n\t\treturn \"sample_id\";\n\tcase BuiltInSampleMask:\n\t\treturn \"sample_mask\";\n\tcase BuiltInSamplePosition:\n\t\t// Shouldn't be reached.\n\t\tSPIRV_CROSS_THROW(\"Sample position is retrieved by a function in MSL.\");\n\tcase BuiltInViewIndex:\n\t\tif (execution.model != ExecutionModelFragment)\n\t\t\tSPIRV_CROSS_THROW(\"ViewIndex is handled specially outside fragment shaders.\");\n\t\t// The ViewIndex was implicitly used in the prior stages to set the render_target_array_index,\n\t\t// so we can get it from there.\n\t\treturn \"render_target_array_index\";\n\n\t// Fragment function out\n\tcase BuiltInFragDepth:\n\t\tif (execution.flags.get(ExecutionModeDepthGreater))\n\t\t\treturn \"depth(greater)\";\n\t\telse if (execution.flags.get(ExecutionModeDepthLess))\n\t\t\treturn \"depth(less)\";\n\t\telse\n\t\t\treturn \"depth(any)\";\n\n\tcase BuiltInFragStencilRefEXT:\n\t\treturn \"stencil\";\n\n\t// Compute function in\n\tcase BuiltInGlobalInvocationId:\n\t\treturn \"thread_position_in_grid\";\n\n\tcase BuiltInWorkgroupId:\n\t\treturn \"threadgroup_position_in_grid\";\n\n\tcase BuiltInNumWorkgroups:\n\t\treturn \"threadgroups_per_grid\";\n\n\tcase BuiltInLocalInvocationId:\n\t\treturn \"thread_position_in_threadgroup\";\n\n\tcase BuiltInLocalInvocationIndex:\n\t\treturn \"thread_index_in_threadgroup\";\n\n\tcase BuiltInSubgroupSize:\n\t\tif (msl_options.emulate_subgroups || msl_options.fixed_subgroup_size != 0)\n\t\t\t// Shouldn't be reached.\n\t\t\tSPIRV_CROSS_THROW(\"Emitting threads_per_simdgroup attribute with fixed subgroup size??\");\n\t\tif (execution.model == ExecutionModelFragment)\n\t\t{\n\t\t\tif (!msl_options.supports_msl_version(2, 2))\n\t\t\t\tSPIRV_CROSS_THROW(\"threads_per_simdgroup requires Metal 2.2 in fragment shaders.\");\n\t\t\treturn \"threads_per_simdgroup\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// thread_execution_width is an alias for threads_per_simdgroup, and it's only available since 1.0,\n\t\t\t// but not in fragment.\n\t\t\treturn \"thread_execution_width\";\n\t\t}\n\n\tcase BuiltInNumSubgroups:\n\t\tif (msl_options.emulate_subgroups)\n\t\t\t// Shouldn't be reached.\n\t\t\tSPIRV_CROSS_THROW(\"NumSubgroups is handled specially with emulation.\");\n\t\tif (!msl_options.supports_msl_version(2))\n\t\t\tSPIRV_CROSS_THROW(\"Subgroup builtins require Metal 2.0.\");\n\t\treturn msl_options.use_quadgroup_operation() ? \"quadgroups_per_threadgroup\" : \"simdgroups_per_threadgroup\";\n\n\tcase BuiltInSubgroupId:\n\t\tif (msl_options.emulate_subgroups)\n\t\t\t// Shouldn't be reached.\n\t\t\tSPIRV_CROSS_THROW(\"SubgroupId is handled specially with emulation.\");\n\t\tif (!msl_options.supports_msl_version(2))\n\t\t\tSPIRV_CROSS_THROW(\"Subgroup builtins require Metal 2.0.\");\n\t\treturn msl_options.use_quadgroup_operation() ? \"quadgroup_index_in_threadgroup\" : \"simdgroup_index_in_threadgroup\";\n\n\tcase BuiltInSubgroupLocalInvocationId:\n\t\tif (msl_options.emulate_subgroups)\n\t\t\t// Shouldn't be reached.\n\t\t\tSPIRV_CROSS_THROW(\"SubgroupLocalInvocationId is handled specially with emulation.\");\n\t\tif (execution.model == ExecutionModelFragment)\n\t\t{\n\t\t\tif (!msl_options.supports_msl_version(2, 2))\n\t\t\t\tSPIRV_CROSS_THROW(\"thread_index_in_simdgroup requires Metal 2.2 in fragment shaders.\");\n\t\t\treturn \"thread_index_in_simdgroup\";\n\t\t}\n\t\telse if (execution.model == ExecutionModelKernel || execution.model == ExecutionModelGLCompute ||\n\t\t         execution.model == ExecutionModelTessellationControl ||\n\t\t         (execution.model == ExecutionModelVertex && msl_options.vertex_for_tessellation))\n\t\t{\n\t\t\t// We are generating a Metal kernel function.\n\t\t\tif (!msl_options.supports_msl_version(2))\n\t\t\t\tSPIRV_CROSS_THROW(\"Subgroup builtins in kernel functions require Metal 2.0.\");\n\t\t\treturn msl_options.use_quadgroup_operation() ? \"thread_index_in_quadgroup\" : \"thread_index_in_simdgroup\";\n\t\t}\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"Subgroup builtins are not available in this type of function.\");\n\n\tcase BuiltInSubgroupEqMask:\n\tcase BuiltInSubgroupGeMask:\n\tcase BuiltInSubgroupGtMask:\n\tcase BuiltInSubgroupLeMask:\n\tcase BuiltInSubgroupLtMask:\n\t\t// Shouldn't be reached.\n\t\tSPIRV_CROSS_THROW(\"Subgroup ballot masks are handled specially in MSL.\");\n\n\tcase BuiltInBaryCoordKHR:\n\t\tif (msl_options.is_ios() && !msl_options.supports_msl_version(2, 3))\n\t\t\tSPIRV_CROSS_THROW(\"Barycentrics are only supported in MSL 2.3 and above on iOS.\");\n\t\telse if (!msl_options.supports_msl_version(2, 2))\n\t\t\tSPIRV_CROSS_THROW(\"Barycentrics are only supported in MSL 2.2 and above on macOS.\");\n\t\treturn \"barycentric_coord, center_perspective\";\n\n\tcase BuiltInBaryCoordNoPerspKHR:\n\t\tif (msl_options.is_ios() && !msl_options.supports_msl_version(2, 3))\n\t\t\tSPIRV_CROSS_THROW(\"Barycentrics are only supported in MSL 2.3 and above on iOS.\");\n\t\telse if (!msl_options.supports_msl_version(2, 2))\n\t\t\tSPIRV_CROSS_THROW(\"Barycentrics are only supported in MSL 2.2 and above on macOS.\");\n\t\treturn \"barycentric_coord, center_no_perspective\";\n\n\tdefault:\n\t\treturn \"unsupported-built-in\";\n\t}\n}\n\n// Returns an MSL string type declaration for a SPIR-V builtin\nstring CompilerMSL::builtin_type_decl(BuiltIn builtin, uint32_t id)\n{\n\tswitch (builtin)\n\t{\n\t// Vertex function in\n\tcase BuiltInVertexId:\n\t\treturn \"uint\";\n\tcase BuiltInVertexIndex:\n\t\treturn \"uint\";\n\tcase BuiltInBaseVertex:\n\t\treturn \"uint\";\n\tcase BuiltInInstanceId:\n\t\treturn \"uint\";\n\tcase BuiltInInstanceIndex:\n\t\treturn \"uint\";\n\tcase BuiltInBaseInstance:\n\t\treturn \"uint\";\n\tcase BuiltInDrawIndex:\n\t\tSPIRV_CROSS_THROW(\"DrawIndex is not supported in MSL.\");\n\n\t// Vertex function out\n\tcase BuiltInClipDistance:\n\tcase BuiltInCullDistance:\n\t\treturn \"float\";\n\tcase BuiltInPointSize:\n\t\treturn \"float\";\n\tcase BuiltInPosition:\n\t\treturn \"float4\";\n\tcase BuiltInLayer:\n\t\treturn \"uint\";\n\tcase BuiltInViewportIndex:\n\t\tif (!msl_options.supports_msl_version(2, 0))\n\t\t\tSPIRV_CROSS_THROW(\"ViewportIndex requires Metal 2.0.\");\n\t\treturn \"uint\";\n\n\t// Tess. control function in\n\tcase BuiltInInvocationId:\n\t\treturn \"uint\";\n\tcase BuiltInPatchVertices:\n\t\treturn \"uint\";\n\tcase BuiltInPrimitiveId:\n\t\treturn \"uint\";\n\n\t// Tess. control function out\n\tcase BuiltInTessLevelInner:\n\t\tif (is_tese_shader())\n\t\t\treturn (msl_options.raw_buffer_tese_input || is_tessellating_triangles()) ? \"float\" : \"float2\";\n\t\treturn \"half\";\n\tcase BuiltInTessLevelOuter:\n\t\tif (is_tese_shader())\n\t\t\treturn (msl_options.raw_buffer_tese_input || is_tessellating_triangles()) ? \"float\" : \"float4\";\n\t\treturn \"half\";\n\n\t// Tess. evaluation function in\n\tcase BuiltInTessCoord:\n\t\treturn \"float3\";\n\n\t// Fragment function in\n\tcase BuiltInFrontFacing:\n\t\treturn \"bool\";\n\tcase BuiltInPointCoord:\n\t\treturn \"float2\";\n\tcase BuiltInFragCoord:\n\t\treturn \"float4\";\n\tcase BuiltInSampleId:\n\t\treturn \"uint\";\n\tcase BuiltInSampleMask:\n\t\treturn \"uint\";\n\tcase BuiltInSamplePosition:\n\t\treturn \"float2\";\n\tcase BuiltInViewIndex:\n\t\treturn \"uint\";\n\n\tcase BuiltInHelperInvocation:\n\t\treturn \"bool\";\n\n\tcase BuiltInBaryCoordKHR:\n\tcase BuiltInBaryCoordNoPerspKHR:\n\t\t// Use the type as declared, can be 1, 2 or 3 components.\n\t\treturn type_to_glsl(get_variable_data_type(get<SPIRVariable>(id)));\n\n\t// Fragment function out\n\tcase BuiltInFragDepth:\n\t\treturn \"float\";\n\n\tcase BuiltInFragStencilRefEXT:\n\t\treturn \"uint\";\n\n\t// Compute function in\n\tcase BuiltInGlobalInvocationId:\n\tcase BuiltInLocalInvocationId:\n\tcase BuiltInNumWorkgroups:\n\tcase BuiltInWorkgroupId:\n\t\treturn \"uint3\";\n\tcase BuiltInLocalInvocationIndex:\n\tcase BuiltInNumSubgroups:\n\tcase BuiltInSubgroupId:\n\tcase BuiltInSubgroupSize:\n\tcase BuiltInSubgroupLocalInvocationId:\n\t\treturn \"uint\";\n\tcase BuiltInSubgroupEqMask:\n\tcase BuiltInSubgroupGeMask:\n\tcase BuiltInSubgroupGtMask:\n\tcase BuiltInSubgroupLeMask:\n\tcase BuiltInSubgroupLtMask:\n\t\treturn \"uint4\";\n\n\tcase BuiltInDeviceIndex:\n\t\treturn \"int\";\n\n\tdefault:\n\t\treturn \"unsupported-built-in-type\";\n\t}\n}\n\n// Returns the declaration of a built-in argument to a function\nstring CompilerMSL::built_in_func_arg(BuiltIn builtin, bool prefix_comma)\n{\n\tstring bi_arg;\n\tif (prefix_comma)\n\t\tbi_arg += \", \";\n\n\t// Handle HLSL-style 0-based vertex/instance index.\n\tbuiltin_declaration = true;\n\tbi_arg += builtin_type_decl(builtin);\n\tbi_arg += string(\" \") + builtin_to_glsl(builtin, StorageClassInput);\n\tbi_arg += string(\" [[\") + builtin_qualifier(builtin) + string(\"]]\");\n\tbuiltin_declaration = false;\n\n\treturn bi_arg;\n}\n\nconst SPIRType &CompilerMSL::get_physical_member_type(const SPIRType &type, uint32_t index) const\n{\n\tif (member_is_remapped_physical_type(type, index))\n\t\treturn get<SPIRType>(get_extended_member_decoration(type.self, index, SPIRVCrossDecorationPhysicalTypeID));\n\telse\n\t\treturn get<SPIRType>(type.member_types[index]);\n}\n\nSPIRType CompilerMSL::get_presumed_input_type(const SPIRType &ib_type, uint32_t index) const\n{\n\tSPIRType type = get_physical_member_type(ib_type, index);\n\tuint32_t loc = get_member_decoration(ib_type.self, index, DecorationLocation);\n\tuint32_t cmp = get_member_decoration(ib_type.self, index, DecorationComponent);\n\tauto p_va = inputs_by_location.find({loc, cmp});\n\tif (p_va != end(inputs_by_location) && p_va->second.vecsize > type.vecsize)\n\t\ttype.vecsize = p_va->second.vecsize;\n\n\treturn type;\n}\n\nuint32_t CompilerMSL::get_declared_type_array_stride_msl(const SPIRType &type, bool is_packed, bool row_major) const\n{\n\t// Array stride in MSL is always size * array_size. sizeof(float3) == 16,\n\t// unlike GLSL and HLSL where array stride would be 16 and size 12.\n\n\t// We could use parent type here and recurse, but that makes creating physical type remappings\n\t// far more complicated. We'd rather just create the final type, and ignore having to create the entire type\n\t// hierarchy in order to compute this value, so make a temporary type on the stack.\n\n\tauto basic_type = type;\n\tbasic_type.array.clear();\n\tbasic_type.array_size_literal.clear();\n\tuint32_t value_size = get_declared_type_size_msl(basic_type, is_packed, row_major);\n\n\tuint32_t dimensions = uint32_t(type.array.size());\n\tassert(dimensions > 0);\n\tdimensions--;\n\n\t// Multiply together every dimension, except the last one.\n\tfor (uint32_t dim = 0; dim < dimensions; dim++)\n\t{\n\t\tuint32_t array_size = to_array_size_literal(type, dim);\n\t\tvalue_size *= max<uint32_t>(array_size, 1u);\n\t}\n\n\treturn value_size;\n}\n\nuint32_t CompilerMSL::get_declared_struct_member_array_stride_msl(const SPIRType &type, uint32_t index) const\n{\n\treturn get_declared_type_array_stride_msl(get_physical_member_type(type, index),\n\t                                          member_is_packed_physical_type(type, index),\n\t                                          has_member_decoration(type.self, index, DecorationRowMajor));\n}\n\nuint32_t CompilerMSL::get_declared_input_array_stride_msl(const SPIRType &type, uint32_t index) const\n{\n\treturn get_declared_type_array_stride_msl(get_presumed_input_type(type, index), false,\n\t                                          has_member_decoration(type.self, index, DecorationRowMajor));\n}\n\nuint32_t CompilerMSL::get_declared_type_matrix_stride_msl(const SPIRType &type, bool packed, bool row_major) const\n{\n\t// For packed matrices, we just use the size of the vector type.\n\t// Otherwise, MatrixStride == alignment, which is the size of the underlying vector type.\n\tif (packed)\n\t\treturn (type.width / 8) * ((row_major && type.columns > 1) ? type.columns : type.vecsize);\n\telse\n\t\treturn get_declared_type_alignment_msl(type, false, row_major);\n}\n\nuint32_t CompilerMSL::get_declared_struct_member_matrix_stride_msl(const SPIRType &type, uint32_t index) const\n{\n\treturn get_declared_type_matrix_stride_msl(get_physical_member_type(type, index),\n\t                                           member_is_packed_physical_type(type, index),\n\t                                           has_member_decoration(type.self, index, DecorationRowMajor));\n}\n\nuint32_t CompilerMSL::get_declared_input_matrix_stride_msl(const SPIRType &type, uint32_t index) const\n{\n\treturn get_declared_type_matrix_stride_msl(get_presumed_input_type(type, index), false,\n\t                                           has_member_decoration(type.self, index, DecorationRowMajor));\n}\n\nuint32_t CompilerMSL::get_declared_struct_size_msl(const SPIRType &struct_type, bool ignore_alignment,\n                                                   bool ignore_padding) const\n{\n\t// If we have a target size, that is the declared size as well.\n\tif (!ignore_padding && has_extended_decoration(struct_type.self, SPIRVCrossDecorationPaddingTarget))\n\t\treturn get_extended_decoration(struct_type.self, SPIRVCrossDecorationPaddingTarget);\n\n\tif (struct_type.member_types.empty())\n\t\treturn 0;\n\n\tuint32_t mbr_cnt = uint32_t(struct_type.member_types.size());\n\n\t// In MSL, a struct's alignment is equal to the maximum alignment of any of its members.\n\tuint32_t alignment = 1;\n\n\tif (!ignore_alignment)\n\t{\n\t\tfor (uint32_t i = 0; i < mbr_cnt; i++)\n\t\t{\n\t\t\tuint32_t mbr_alignment = get_declared_struct_member_alignment_msl(struct_type, i);\n\t\t\talignment = max(alignment, mbr_alignment);\n\t\t}\n\t}\n\n\t// Last member will always be matched to the final Offset decoration, but size of struct in MSL now depends\n\t// on physical size in MSL, and the size of the struct itself is then aligned to struct alignment.\n\tuint32_t spirv_offset = type_struct_member_offset(struct_type, mbr_cnt - 1);\n\tuint32_t msl_size = spirv_offset + get_declared_struct_member_size_msl(struct_type, mbr_cnt - 1);\n\tmsl_size = (msl_size + alignment - 1) & ~(alignment - 1);\n\treturn msl_size;\n}\n\n// Returns the byte size of a struct member.\nuint32_t CompilerMSL::get_declared_type_size_msl(const SPIRType &type, bool is_packed, bool row_major) const\n{\n\t// Pointers take 8 bytes each\n\tif (type.pointer && type.storage == StorageClassPhysicalStorageBuffer)\n\t{\n\t\tuint32_t type_size = 8 * (type.vecsize == 3 ? 4 : type.vecsize);\n\n\t\t// Work our way through potentially layered arrays,\n\t\t// stopping when we hit a pointer that is not also an array.\n\t\tint32_t dim_idx = (int32_t)type.array.size() - 1;\n\t\tauto *p_type = &type;\n\t\twhile (!type_is_pointer(*p_type) && dim_idx >= 0)\n\t\t{\n\t\t\ttype_size *= to_array_size_literal(*p_type, dim_idx);\n\t\t\tp_type = &get<SPIRType>(p_type->parent_type);\n\t\t\tdim_idx--;\n\t\t}\n\n\t\treturn type_size;\n\t}\n\n\tswitch (type.basetype)\n\t{\n\tcase SPIRType::Unknown:\n\tcase SPIRType::Void:\n\tcase SPIRType::AtomicCounter:\n\tcase SPIRType::Image:\n\tcase SPIRType::SampledImage:\n\tcase SPIRType::Sampler:\n\t\tSPIRV_CROSS_THROW(\"Querying size of opaque object.\");\n\n\tdefault:\n\t{\n\t\tif (!type.array.empty())\n\t\t{\n\t\t\tuint32_t array_size = to_array_size_literal(type);\n\t\t\treturn get_declared_type_array_stride_msl(type, is_packed, row_major) * max<uint32_t>(array_size, 1u);\n\t\t}\n\n\t\tif (type.basetype == SPIRType::Struct)\n\t\t\treturn get_declared_struct_size_msl(type);\n\n\t\tif (is_packed)\n\t\t{\n\t\t\treturn type.vecsize * type.columns * (type.width / 8);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// An unpacked 3-element vector or matrix column is the same memory size as a 4-element.\n\t\t\tuint32_t vecsize = type.vecsize;\n\t\t\tuint32_t columns = type.columns;\n\n\t\t\tif (row_major && columns > 1)\n\t\t\t\tswap(vecsize, columns);\n\n\t\t\tif (vecsize == 3)\n\t\t\t\tvecsize = 4;\n\n\t\t\treturn vecsize * columns * (type.width / 8);\n\t\t}\n\t}\n\t}\n}\n\nuint32_t CompilerMSL::get_declared_struct_member_size_msl(const SPIRType &type, uint32_t index) const\n{\n\treturn get_declared_type_size_msl(get_physical_member_type(type, index),\n\t                                  member_is_packed_physical_type(type, index),\n\t                                  has_member_decoration(type.self, index, DecorationRowMajor));\n}\n\nuint32_t CompilerMSL::get_declared_input_size_msl(const SPIRType &type, uint32_t index) const\n{\n\treturn get_declared_type_size_msl(get_presumed_input_type(type, index), false,\n\t                                  has_member_decoration(type.self, index, DecorationRowMajor));\n}\n\n// Returns the byte alignment of a type.\nuint32_t CompilerMSL::get_declared_type_alignment_msl(const SPIRType &type, bool is_packed, bool row_major) const\n{\n\t// Pointers aligns on multiples of 8 bytes\n\tif (type.pointer && type.storage == StorageClassPhysicalStorageBuffer)\n\t\treturn 8 * (type.vecsize == 3 ? 4 : type.vecsize);\n\n\tswitch (type.basetype)\n\t{\n\tcase SPIRType::Unknown:\n\tcase SPIRType::Void:\n\tcase SPIRType::AtomicCounter:\n\tcase SPIRType::Image:\n\tcase SPIRType::SampledImage:\n\tcase SPIRType::Sampler:\n\t\tSPIRV_CROSS_THROW(\"Querying alignment of opaque object.\");\n\n\tcase SPIRType::Double:\n\t\tSPIRV_CROSS_THROW(\"double types are not supported in buffers in MSL.\");\n\n\tcase SPIRType::Struct:\n\t{\n\t\t// In MSL, a struct's alignment is equal to the maximum alignment of any of its members.\n\t\tuint32_t alignment = 1;\n\t\tfor (uint32_t i = 0; i < type.member_types.size(); i++)\n\t\t\talignment = max(alignment, uint32_t(get_declared_struct_member_alignment_msl(type, i)));\n\t\treturn alignment;\n\t}\n\n\tdefault:\n\t{\n\t\tif (type.basetype == SPIRType::Int64 && !msl_options.supports_msl_version(2, 3))\n\t\t\tSPIRV_CROSS_THROW(\"long types in buffers are only supported in MSL 2.3 and above.\");\n\t\tif (type.basetype == SPIRType::UInt64 && !msl_options.supports_msl_version(2, 3))\n\t\t\tSPIRV_CROSS_THROW(\"ulong types in buffers are only supported in MSL 2.3 and above.\");\n\t\t// Alignment of packed type is the same as the underlying component or column size.\n\t\t// Alignment of unpacked type is the same as the vector size.\n\t\t// Alignment of 3-elements vector is the same as 4-elements (including packed using column).\n\t\tif (is_packed)\n\t\t{\n\t\t\t// If we have packed_T and friends, the alignment is always scalar.\n\t\t\treturn type.width / 8;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// This is the general rule for MSL. Size == alignment.\n\t\t\tuint32_t vecsize = (row_major && type.columns > 1) ? type.columns : type.vecsize;\n\t\t\treturn (type.width / 8) * (vecsize == 3 ? 4 : vecsize);\n\t\t}\n\t}\n\t}\n}\n\nuint32_t CompilerMSL::get_declared_struct_member_alignment_msl(const SPIRType &type, uint32_t index) const\n{\n\treturn get_declared_type_alignment_msl(get_physical_member_type(type, index),\n\t                                       member_is_packed_physical_type(type, index),\n\t                                       has_member_decoration(type.self, index, DecorationRowMajor));\n}\n\nuint32_t CompilerMSL::get_declared_input_alignment_msl(const SPIRType &type, uint32_t index) const\n{\n\treturn get_declared_type_alignment_msl(get_presumed_input_type(type, index), false,\n\t                                       has_member_decoration(type.self, index, DecorationRowMajor));\n}\n\nbool CompilerMSL::skip_argument(uint32_t) const\n{\n\treturn false;\n}\n\nvoid CompilerMSL::analyze_sampled_image_usage()\n{\n\tif (msl_options.swizzle_texture_samples)\n\t{\n\t\tSampledImageScanner scanner(*this);\n\t\ttraverse_all_reachable_opcodes(get<SPIRFunction>(ir.default_entry_point), scanner);\n\t}\n}\n\nbool CompilerMSL::SampledImageScanner::handle(spv::Op opcode, const uint32_t *args, uint32_t length)\n{\n\tswitch (opcode)\n\t{\n\tcase OpLoad:\n\tcase OpImage:\n\tcase OpSampledImage:\n\t{\n\t\tif (length < 3)\n\t\t\treturn false;\n\n\t\tuint32_t result_type = args[0];\n\t\tauto &type = compiler.get<SPIRType>(result_type);\n\t\tif ((type.basetype != SPIRType::Image && type.basetype != SPIRType::SampledImage) || type.image.sampled != 1)\n\t\t\treturn true;\n\n\t\tuint32_t id = args[1];\n\t\tcompiler.set<SPIRExpression>(id, \"\", result_type, true);\n\t\tbreak;\n\t}\n\tcase OpImageSampleExplicitLod:\n\tcase OpImageSampleProjExplicitLod:\n\tcase OpImageSampleDrefExplicitLod:\n\tcase OpImageSampleProjDrefExplicitLod:\n\tcase OpImageSampleImplicitLod:\n\tcase OpImageSampleProjImplicitLod:\n\tcase OpImageSampleDrefImplicitLod:\n\tcase OpImageSampleProjDrefImplicitLod:\n\tcase OpImageFetch:\n\tcase OpImageGather:\n\tcase OpImageDrefGather:\n\t\tcompiler.has_sampled_images =\n\t\t    compiler.has_sampled_images || compiler.is_sampled_image_type(compiler.expression_type(args[2]));\n\t\tcompiler.needs_swizzle_buffer_def = compiler.needs_swizzle_buffer_def || compiler.has_sampled_images;\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\treturn true;\n}\n\n// If a needed custom function wasn't added before, add it and force a recompile.\nvoid CompilerMSL::add_spv_func_and_recompile(SPVFuncImpl spv_func)\n{\n\tif (spv_function_implementations.count(spv_func) == 0)\n\t{\n\t\tspv_function_implementations.insert(spv_func);\n\t\tsuppress_missing_prototypes = true;\n\t\tforce_recompile();\n\t}\n}\n\nbool CompilerMSL::OpCodePreprocessor::handle(Op opcode, const uint32_t *args, uint32_t length)\n{\n\t// Since MSL exists in a single execution scope, function prototype declarations are not\n\t// needed, and clutter the output. If secondary functions are output (either as a SPIR-V\n\t// function implementation or as indicated by the presence of OpFunctionCall), then set\n\t// suppress_missing_prototypes to suppress compiler warnings of missing function prototypes.\n\n\t// Mark if the input requires the implementation of an SPIR-V function that does not exist in Metal.\n\tSPVFuncImpl spv_func = get_spv_func_impl(opcode, args);\n\tif (spv_func != SPVFuncImplNone)\n\t{\n\t\tcompiler.spv_function_implementations.insert(spv_func);\n\t\tsuppress_missing_prototypes = true;\n\t}\n\n\tswitch (opcode)\n\t{\n\n\tcase OpFunctionCall:\n\t\tsuppress_missing_prototypes = true;\n\t\tbreak;\n\n\tcase OpDemoteToHelperInvocationEXT:\n\t\tuses_discard = true;\n\t\tbreak;\n\n\t// Emulate texture2D atomic operations\n\tcase OpImageTexelPointer:\n\t{\n\t\tif (!compiler.msl_options.supports_msl_version(3, 1))\n\t\t{\n\t\t\tauto *var = compiler.maybe_get_backing_variable(args[2]);\n\t\t\timage_pointers_emulated[args[1]] = var ? var->self : ID(0);\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpImageWrite:\n\t\tuses_image_write = true;\n\t\tbreak;\n\n\tcase OpStore:\n\t\tcheck_resource_write(args[0]);\n\t\tbreak;\n\n\t// Emulate texture2D atomic operations\n\tcase OpAtomicExchange:\n\tcase OpAtomicCompareExchange:\n\tcase OpAtomicCompareExchangeWeak:\n\tcase OpAtomicIIncrement:\n\tcase OpAtomicIDecrement:\n\tcase OpAtomicIAdd:\n\tcase OpAtomicFAddEXT:\n\tcase OpAtomicISub:\n\tcase OpAtomicSMin:\n\tcase OpAtomicUMin:\n\tcase OpAtomicSMax:\n\tcase OpAtomicUMax:\n\tcase OpAtomicAnd:\n\tcase OpAtomicOr:\n\tcase OpAtomicXor:\n\t{\n\t\tuses_atomics = true;\n\t\tauto it = image_pointers_emulated.find(args[2]);\n\t\tif (it != image_pointers_emulated.end())\n\t\t{\n\t\t\tuses_image_write = true;\n\t\t\tcompiler.atomic_image_vars_emulated.insert(it->second);\n\t\t}\n\t\telse\n\t\t\tcheck_resource_write(args[2]);\n\t\tbreak;\n\t}\n\n\tcase OpAtomicStore:\n\t{\n\t\tuses_atomics = true;\n\t\tauto it = image_pointers_emulated.find(args[0]);\n\t\tif (it != image_pointers_emulated.end())\n\t\t{\n\t\t\tcompiler.atomic_image_vars_emulated.insert(it->second);\n\t\t\tuses_image_write = true;\n\t\t}\n\t\telse\n\t\t\tcheck_resource_write(args[0]);\n\t\tbreak;\n\t}\n\n\tcase OpAtomicLoad:\n\t{\n\t\tuses_atomics = true;\n\t\tauto it = image_pointers_emulated.find(args[2]);\n\t\tif (it != image_pointers_emulated.end())\n\t\t{\n\t\t\tcompiler.atomic_image_vars_emulated.insert(it->second);\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpGroupNonUniformInverseBallot:\n\t\tneeds_subgroup_invocation_id = true;\n\t\tbreak;\n\n\tcase OpGroupNonUniformBallotFindLSB:\n\tcase OpGroupNonUniformBallotFindMSB:\n\t\tneeds_subgroup_size = true;\n\t\tbreak;\n\n\tcase OpGroupNonUniformBallotBitCount:\n\t\tif (args[3] == GroupOperationReduce)\n\t\t\tneeds_subgroup_size = true;\n\t\telse\n\t\t\tneeds_subgroup_invocation_id = true;\n\t\tbreak;\n\n\tcase OpArrayLength:\n\t{\n\t\tauto *var = compiler.maybe_get_backing_variable(args[2]);\n\t\tif (var != nullptr)\n\t\t{\n\t\t\tif (!compiler.is_var_runtime_size_array(*var))\n\t\t\t\tcompiler.buffers_requiring_array_length.insert(var->self);\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpInBoundsAccessChain:\n\tcase OpAccessChain:\n\tcase OpPtrAccessChain:\n\t{\n\t\t// OpArrayLength might want to know if taking ArrayLength of an array of SSBOs.\n\t\tuint32_t result_type = args[0];\n\t\tuint32_t id = args[1];\n\t\tuint32_t ptr = args[2];\n\n\t\tcompiler.set<SPIRExpression>(id, \"\", result_type, true);\n\t\tcompiler.register_read(id, ptr, true);\n\t\tcompiler.ir.ids[id].set_allow_type_rewrite();\n\t\tbreak;\n\t}\n\n\tcase OpExtInst:\n\t{\n\t\tuint32_t extension_set = args[2];\n\t\tif (compiler.get<SPIRExtension>(extension_set).ext == SPIRExtension::GLSL)\n\t\t{\n\t\t\tauto op_450 = static_cast<GLSLstd450>(args[3]);\n\t\t\tswitch (op_450)\n\t\t\t{\n\t\t\tcase GLSLstd450InterpolateAtCentroid:\n\t\t\tcase GLSLstd450InterpolateAtSample:\n\t\t\tcase GLSLstd450InterpolateAtOffset:\n\t\t\t{\n\t\t\t\tif (!compiler.msl_options.supports_msl_version(2, 3))\n\t\t\t\t\tSPIRV_CROSS_THROW(\"Pull-model interpolation requires MSL 2.3.\");\n\t\t\t\t// Fragment varyings used with pull-model interpolation need special handling,\n\t\t\t\t// due to the way pull-model interpolation works in Metal.\n\t\t\t\tauto *var = compiler.maybe_get_backing_variable(args[4]);\n\t\t\t\tif (var)\n\t\t\t\t{\n\t\t\t\t\tcompiler.pull_model_inputs.insert(var->self);\n\t\t\t\t\tauto &var_type = compiler.get_variable_element_type(*var);\n\t\t\t\t\t// In addition, if this variable has a 'Sample' decoration, we need the sample ID\n\t\t\t\t\t// in order to do default interpolation.\n\t\t\t\t\tif (compiler.has_decoration(var->self, DecorationSample))\n\t\t\t\t\t{\n\t\t\t\t\t\tneeds_sample_id = true;\n\t\t\t\t\t}\n\t\t\t\t\telse if (var_type.basetype == SPIRType::Struct)\n\t\t\t\t\t{\n\t\t\t\t\t\t// Now we need to check each member and see if it has this decoration.\n\t\t\t\t\t\tfor (uint32_t i = 0; i < var_type.member_types.size(); ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (compiler.has_member_decoration(var_type.self, i, DecorationSample))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tneeds_sample_id = true;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpIsHelperInvocationEXT:\n\t\tif (compiler.needs_manual_helper_invocation_updates())\n\t\t\tneeds_helper_invocation = true;\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\t// If it has one, keep track of the instruction's result type, mapped by ID\n\tuint32_t result_type, result_id;\n\tif (compiler.instruction_to_result_type(result_type, result_id, opcode, args, length))\n\t\tresult_types[result_id] = result_type;\n\n\treturn true;\n}\n\n// If the variable is a Uniform or StorageBuffer, mark that a resource has been written to.\nvoid CompilerMSL::OpCodePreprocessor::check_resource_write(uint32_t var_id)\n{\n\tauto *p_var = compiler.maybe_get_backing_variable(var_id);\n\tStorageClass sc = p_var ? p_var->storage : StorageClassMax;\n\tif (sc == StorageClassUniform || sc == StorageClassStorageBuffer)\n\t\tuses_buffer_write = true;\n}\n\n// Returns an enumeration of a SPIR-V function that needs to be output for certain Op codes.\nCompilerMSL::SPVFuncImpl CompilerMSL::OpCodePreprocessor::get_spv_func_impl(Op opcode, const uint32_t *args)\n{\n\tswitch (opcode)\n\t{\n\tcase OpFMod:\n\t\treturn SPVFuncImplMod;\n\n\tcase OpFAdd:\n\tcase OpFSub:\n\t\tif (compiler.msl_options.invariant_float_math ||\n\t\t    compiler.has_decoration(args[1], DecorationNoContraction))\n\t\t{\n\t\t\treturn opcode == OpFAdd ? SPVFuncImplFAdd : SPVFuncImplFSub;\n\t\t}\n\t\tbreak;\n\n\tcase OpFMul:\n\tcase OpOuterProduct:\n\tcase OpMatrixTimesVector:\n\tcase OpVectorTimesMatrix:\n\tcase OpMatrixTimesMatrix:\n\t\tif (compiler.msl_options.invariant_float_math ||\n\t\t    compiler.has_decoration(args[1], DecorationNoContraction))\n\t\t{\n\t\t\treturn SPVFuncImplFMul;\n\t\t}\n\t\tbreak;\n\n\tcase OpQuantizeToF16:\n\t\treturn SPVFuncImplQuantizeToF16;\n\n\tcase OpTypeArray:\n\t{\n\t\t// Allow Metal to use the array<T> template to make arrays a value type\n\t\treturn SPVFuncImplUnsafeArray;\n\t}\n\n\t// Emulate texture2D atomic operations\n\tcase OpAtomicExchange:\n\tcase OpAtomicCompareExchange:\n\tcase OpAtomicCompareExchangeWeak:\n\tcase OpAtomicIIncrement:\n\tcase OpAtomicIDecrement:\n\tcase OpAtomicIAdd:\n\tcase OpAtomicFAddEXT:\n\tcase OpAtomicISub:\n\tcase OpAtomicSMin:\n\tcase OpAtomicUMin:\n\tcase OpAtomicSMax:\n\tcase OpAtomicUMax:\n\tcase OpAtomicAnd:\n\tcase OpAtomicOr:\n\tcase OpAtomicXor:\n\tcase OpAtomicLoad:\n\tcase OpAtomicStore:\n\t{\n\t\tauto it = image_pointers_emulated.find(args[opcode == OpAtomicStore ? 0 : 2]);\n\t\tif (it != image_pointers_emulated.end())\n\t\t{\n\t\t\tuint32_t tid = compiler.get<SPIRVariable>(it->second).basetype;\n\t\t\tif (tid && compiler.get<SPIRType>(tid).image.dim == Dim2D)\n\t\t\t\treturn SPVFuncImplImage2DAtomicCoords;\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpImageFetch:\n\tcase OpImageRead:\n\tcase OpImageWrite:\n\t{\n\t\t// Retrieve the image type, and if it's a Buffer, emit a texel coordinate function\n\t\tuint32_t tid = result_types[args[opcode == OpImageWrite ? 0 : 2]];\n\t\tif (tid && compiler.get<SPIRType>(tid).image.dim == DimBuffer && !compiler.msl_options.texture_buffer_native)\n\t\t\treturn SPVFuncImplTexelBufferCoords;\n\t\tbreak;\n\t}\n\n\tcase OpExtInst:\n\t{\n\t\tuint32_t extension_set = args[2];\n\t\tif (compiler.get<SPIRExtension>(extension_set).ext == SPIRExtension::GLSL)\n\t\t{\n\t\t\tauto op_450 = static_cast<GLSLstd450>(args[3]);\n\t\t\tswitch (op_450)\n\t\t\t{\n\t\t\tcase GLSLstd450Radians:\n\t\t\t\treturn SPVFuncImplRadians;\n\t\t\tcase GLSLstd450Degrees:\n\t\t\t\treturn SPVFuncImplDegrees;\n\t\t\tcase GLSLstd450FindILsb:\n\t\t\t\treturn SPVFuncImplFindILsb;\n\t\t\tcase GLSLstd450FindSMsb:\n\t\t\t\treturn SPVFuncImplFindSMsb;\n\t\t\tcase GLSLstd450FindUMsb:\n\t\t\t\treturn SPVFuncImplFindUMsb;\n\t\t\tcase GLSLstd450SSign:\n\t\t\t\treturn SPVFuncImplSSign;\n\t\t\tcase GLSLstd450Reflect:\n\t\t\t{\n\t\t\t\tauto &type = compiler.get<SPIRType>(args[0]);\n\t\t\t\tif (type.vecsize == 1)\n\t\t\t\t\treturn SPVFuncImplReflectScalar;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase GLSLstd450Refract:\n\t\t\t{\n\t\t\t\tauto &type = compiler.get<SPIRType>(args[0]);\n\t\t\t\tif (type.vecsize == 1)\n\t\t\t\t\treturn SPVFuncImplRefractScalar;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase GLSLstd450FaceForward:\n\t\t\t{\n\t\t\t\tauto &type = compiler.get<SPIRType>(args[0]);\n\t\t\t\tif (type.vecsize == 1)\n\t\t\t\t\treturn SPVFuncImplFaceForwardScalar;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase GLSLstd450MatrixInverse:\n\t\t\t{\n\t\t\t\tauto &mat_type = compiler.get<SPIRType>(args[0]);\n\t\t\t\tswitch (mat_type.columns)\n\t\t\t\t{\n\t\t\t\tcase 2:\n\t\t\t\t\treturn SPVFuncImplInverse2x2;\n\t\t\t\tcase 3:\n\t\t\t\t\treturn SPVFuncImplInverse3x3;\n\t\t\t\tcase 4:\n\t\t\t\t\treturn SPVFuncImplInverse4x4;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpGroupNonUniformBroadcast:\n\tcase OpSubgroupReadInvocationKHR:\n\t\treturn SPVFuncImplSubgroupBroadcast;\n\n\tcase OpGroupNonUniformBroadcastFirst:\n\tcase OpSubgroupFirstInvocationKHR:\n\t\treturn SPVFuncImplSubgroupBroadcastFirst;\n\n\tcase OpGroupNonUniformBallot:\n\tcase OpSubgroupBallotKHR:\n\t\treturn SPVFuncImplSubgroupBallot;\n\n\tcase OpGroupNonUniformInverseBallot:\n\tcase OpGroupNonUniformBallotBitExtract:\n\t\treturn SPVFuncImplSubgroupBallotBitExtract;\n\n\tcase OpGroupNonUniformBallotFindLSB:\n\t\treturn SPVFuncImplSubgroupBallotFindLSB;\n\n\tcase OpGroupNonUniformBallotFindMSB:\n\t\treturn SPVFuncImplSubgroupBallotFindMSB;\n\n\tcase OpGroupNonUniformBallotBitCount:\n\t\treturn SPVFuncImplSubgroupBallotBitCount;\n\n\tcase OpGroupNonUniformAllEqual:\n\tcase OpSubgroupAllEqualKHR:\n\t\treturn SPVFuncImplSubgroupAllEqual;\n\n\tcase OpGroupNonUniformShuffle:\n\t\treturn SPVFuncImplSubgroupShuffle;\n\n\tcase OpGroupNonUniformShuffleXor:\n\t\treturn SPVFuncImplSubgroupShuffleXor;\n\n\tcase OpGroupNonUniformShuffleUp:\n\t\treturn SPVFuncImplSubgroupShuffleUp;\n\n\tcase OpGroupNonUniformShuffleDown:\n\t\treturn SPVFuncImplSubgroupShuffleDown;\n\n\tcase OpGroupNonUniformQuadBroadcast:\n\t\treturn SPVFuncImplQuadBroadcast;\n\n\tcase OpGroupNonUniformQuadSwap:\n\t\treturn SPVFuncImplQuadSwap;\n\n\tdefault:\n\t\tbreak;\n\t}\n\treturn SPVFuncImplNone;\n}\n\n// Sort both type and meta member content based on builtin status (put builtins at end),\n// then by the required sorting aspect.\nvoid CompilerMSL::MemberSorter::sort()\n{\n\t// Create a temporary array of consecutive member indices and sort it based on how\n\t// the members should be reordered, based on builtin and sorting aspect meta info.\n\tsize_t mbr_cnt = type.member_types.size();\n\tSmallVector<uint32_t> mbr_idxs(mbr_cnt);\n\tstd::iota(mbr_idxs.begin(), mbr_idxs.end(), 0); // Fill with consecutive indices\n\tstd::stable_sort(mbr_idxs.begin(), mbr_idxs.end(), *this); // Sort member indices based on sorting aspect\n\n\tbool sort_is_identity = true;\n\tfor (uint32_t mbr_idx = 0; mbr_idx < mbr_cnt; mbr_idx++)\n\t{\n\t\tif (mbr_idx != mbr_idxs[mbr_idx])\n\t\t{\n\t\t\tsort_is_identity = false;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (sort_is_identity)\n\t\treturn;\n\n\tif (meta.members.size() < type.member_types.size())\n\t{\n\t\t// This should never trigger in normal circumstances, but to be safe.\n\t\tmeta.members.resize(type.member_types.size());\n\t}\n\n\t// Move type and meta member info to the order defined by the sorted member indices.\n\t// This is done by creating temporary copies of both member types and meta, and then\n\t// copying back to the original content at the sorted indices.\n\tauto mbr_types_cpy = type.member_types;\n\tauto mbr_meta_cpy = meta.members;\n\tfor (uint32_t mbr_idx = 0; mbr_idx < mbr_cnt; mbr_idx++)\n\t{\n\t\ttype.member_types[mbr_idx] = mbr_types_cpy[mbr_idxs[mbr_idx]];\n\t\tmeta.members[mbr_idx] = mbr_meta_cpy[mbr_idxs[mbr_idx]];\n\t}\n\n\t// If we're sorting by Offset, this might affect user code which accesses a buffer block.\n\t// We will need to redirect member indices from defined index to sorted index using reverse lookup.\n\tif (sort_aspect == SortAspect::Offset)\n\t{\n\t\ttype.member_type_index_redirection.resize(mbr_cnt);\n\t\tfor (uint32_t map_idx = 0; map_idx < mbr_cnt; map_idx++)\n\t\t\ttype.member_type_index_redirection[mbr_idxs[map_idx]] = map_idx;\n\t}\n}\n\nbool CompilerMSL::MemberSorter::operator()(uint32_t mbr_idx1, uint32_t mbr_idx2)\n{\n\tauto &mbr_meta1 = meta.members[mbr_idx1];\n\tauto &mbr_meta2 = meta.members[mbr_idx2];\n\n\tif (sort_aspect == LocationThenBuiltInType)\n\t{\n\t\t// Sort first by builtin status (put builtins at end), then by the sorting aspect.\n\t\tif (mbr_meta1.builtin != mbr_meta2.builtin)\n\t\t\treturn mbr_meta2.builtin;\n\t\telse if (mbr_meta1.builtin)\n\t\t\treturn mbr_meta1.builtin_type < mbr_meta2.builtin_type;\n\t\telse if (mbr_meta1.location == mbr_meta2.location)\n\t\t\treturn mbr_meta1.component < mbr_meta2.component;\n\t\telse\n\t\t\treturn mbr_meta1.location < mbr_meta2.location;\n\t}\n\telse\n\t\treturn mbr_meta1.offset < mbr_meta2.offset;\n}\n\nCompilerMSL::MemberSorter::MemberSorter(SPIRType &t, Meta &m, SortAspect sa)\n    : type(t)\n    , meta(m)\n    , sort_aspect(sa)\n{\n\t// Ensure enough meta info is available\n\tmeta.members.resize(max(type.member_types.size(), meta.members.size()));\n}\n\nvoid CompilerMSL::remap_constexpr_sampler(VariableID id, const MSLConstexprSampler &sampler)\n{\n\tauto &type = get<SPIRType>(get<SPIRVariable>(id).basetype);\n\tif (type.basetype != SPIRType::SampledImage && type.basetype != SPIRType::Sampler)\n\t\tSPIRV_CROSS_THROW(\"Can only remap SampledImage and Sampler type.\");\n\tif (!type.array.empty())\n\t\tSPIRV_CROSS_THROW(\"Can not remap array of samplers.\");\n\tconstexpr_samplers_by_id[id] = sampler;\n}\n\nvoid CompilerMSL::remap_constexpr_sampler_by_binding(uint32_t desc_set, uint32_t binding,\n                                                     const MSLConstexprSampler &sampler)\n{\n\tconstexpr_samplers_by_binding[{ desc_set, binding }] = sampler;\n}\n\nvoid CompilerMSL::cast_from_variable_load(uint32_t source_id, std::string &expr, const SPIRType &expr_type)\n{\n\tbool is_packed = has_extended_decoration(source_id, SPIRVCrossDecorationPhysicalTypePacked);\n\tauto *source_expr = maybe_get<SPIRExpression>(source_id);\n\tauto *var = maybe_get_backing_variable(source_id);\n\tconst SPIRType *var_type = nullptr, *phys_type = nullptr;\n\n\tif (uint32_t phys_id = get_extended_decoration(source_id, SPIRVCrossDecorationPhysicalTypeID))\n\t\tphys_type = &get<SPIRType>(phys_id);\n\telse\n\t\tphys_type = &expr_type;\n\n\tif (var)\n\t{\n\t\tsource_id = var->self;\n\t\tvar_type = &get_variable_data_type(*var);\n\t}\n\n\tbool rewrite_boolean_load =\n\t    expr_type.basetype == SPIRType::Boolean &&\n\t    (var && (var->storage == StorageClassWorkgroup || var_type->basetype == SPIRType::Struct));\n\n\t// Type fixups for workgroup variables if they are booleans.\n\tif (rewrite_boolean_load)\n\t{\n\t\tif (is_array(expr_type))\n\t\t\texpr = to_rerolled_array_expression(expr_type, expr, expr_type);\n\t\telse\n\t\t\texpr = join(type_to_glsl(expr_type), \"(\", expr, \")\");\n\t}\n\n\t// Type fixups for workgroup variables if they are matrices.\n\t// Don't do fixup for packed types; those are handled specially.\n\t// FIXME: Maybe use a type like spvStorageMatrix for packed matrices?\n\tif (!msl_options.supports_msl_version(3, 0) && var &&\n\t    (var->storage == StorageClassWorkgroup ||\n\t     (var_type->basetype == SPIRType::Struct &&\n\t      has_extended_decoration(var_type->self, SPIRVCrossDecorationWorkgroupStruct) && !is_packed)) &&\n\t    expr_type.columns > 1)\n\t{\n\t\tSPIRType matrix_type = *phys_type;\n\t\tif (source_expr && source_expr->need_transpose)\n\t\t\tswap(matrix_type.vecsize, matrix_type.columns);\n\t\tmatrix_type.array.clear();\n\t\tmatrix_type.array_size_literal.clear();\n\t\texpr = join(type_to_glsl(matrix_type), \"(\", expr, \")\");\n\t}\n\n\t// Only interested in standalone builtin variables in the switch below.\n\tif (!has_decoration(source_id, DecorationBuiltIn))\n\t{\n\t\t// If the backing variable does not match our expected sign, we can fix it up here.\n\t\t// See ensure_correct_input_type().\n\t\tif (var && var->storage == StorageClassInput)\n\t\t{\n\t\t\tauto &base_type = get<SPIRType>(var->basetype);\n\t\t\tif (base_type.basetype != SPIRType::Struct && expr_type.basetype != base_type.basetype)\n\t\t\t\texpr = join(type_to_glsl(expr_type), \"(\", expr, \")\");\n\t\t}\n\t\treturn;\n\t}\n\n\tauto builtin = static_cast<BuiltIn>(get_decoration(source_id, DecorationBuiltIn));\n\tauto expected_type = expr_type.basetype;\n\tauto expected_width = expr_type.width;\n\tswitch (builtin)\n\t{\n\tcase BuiltInGlobalInvocationId:\n\tcase BuiltInLocalInvocationId:\n\tcase BuiltInWorkgroupId:\n\tcase BuiltInLocalInvocationIndex:\n\tcase BuiltInWorkgroupSize:\n\tcase BuiltInNumWorkgroups:\n\tcase BuiltInLayer:\n\tcase BuiltInViewportIndex:\n\tcase BuiltInFragStencilRefEXT:\n\tcase BuiltInPrimitiveId:\n\tcase BuiltInSubgroupSize:\n\tcase BuiltInSubgroupLocalInvocationId:\n\tcase BuiltInViewIndex:\n\tcase BuiltInVertexIndex:\n\tcase BuiltInInstanceIndex:\n\tcase BuiltInBaseInstance:\n\tcase BuiltInBaseVertex:\n\tcase BuiltInSampleMask:\n\t\texpected_type = SPIRType::UInt;\n\t\texpected_width = 32;\n\t\tbreak;\n\n\tcase BuiltInTessLevelInner:\n\tcase BuiltInTessLevelOuter:\n\t\tif (is_tesc_shader())\n\t\t{\n\t\t\texpected_type = SPIRType::Half;\n\t\t\texpected_width = 16;\n\t\t}\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\tif (is_array(expr_type) && builtin == BuiltInSampleMask)\n\t{\n\t\t// Needs special handling.\n\t\tauto wrap_expr = join(type_to_glsl(expr_type), \"({ \");\n\t\twrap_expr += join(type_to_glsl(get<SPIRType>(expr_type.parent_type)), \"(\", expr, \")\");\n\t\twrap_expr += \" })\";\n\t\texpr = std::move(wrap_expr);\n\t}\n\telse if (expected_type != expr_type.basetype)\n\t{\n\t\tif (is_array(expr_type) && (builtin == BuiltInTessLevelInner || builtin == BuiltInTessLevelOuter))\n\t\t{\n\t\t\t// Triggers when loading TessLevel directly as an array.\n\t\t\t// Need explicit padding + cast.\n\t\t\tauto wrap_expr = join(type_to_glsl(expr_type), \"({ \");\n\n\t\t\tuint32_t array_size = get_physical_tess_level_array_size(builtin);\n\t\t\tfor (uint32_t i = 0; i < array_size; i++)\n\t\t\t{\n\t\t\t\tif (array_size > 1)\n\t\t\t\t\twrap_expr += join(\"float(\", expr, \"[\", i, \"])\");\n\t\t\t\telse\n\t\t\t\t\twrap_expr += join(\"float(\", expr, \")\");\n\t\t\t\tif (i + 1 < array_size)\n\t\t\t\t\twrap_expr += \", \";\n\t\t\t}\n\n\t\t\tif (is_tessellating_triangles())\n\t\t\t\twrap_expr += \", 0.0\";\n\n\t\t\twrap_expr += \" })\";\n\t\t\texpr = std::move(wrap_expr);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// These are of different widths, so we cannot do a straight bitcast.\n\t\t\tif (expected_width != expr_type.width)\n\t\t\t\texpr = join(type_to_glsl(expr_type), \"(\", expr, \")\");\n\t\t\telse\n\t\t\t\texpr = bitcast_expression(expr_type, expected_type, expr);\n\t\t}\n\t}\n}\n\nvoid CompilerMSL::cast_to_variable_store(uint32_t target_id, std::string &expr, const SPIRType &expr_type)\n{\n\tbool is_packed = has_extended_decoration(target_id, SPIRVCrossDecorationPhysicalTypePacked);\n\tauto *target_expr = maybe_get<SPIRExpression>(target_id);\n\tauto *var = maybe_get_backing_variable(target_id);\n\tconst SPIRType *var_type = nullptr, *phys_type = nullptr;\n\n\tif (uint32_t phys_id = get_extended_decoration(target_id, SPIRVCrossDecorationPhysicalTypeID))\n\t\tphys_type = &get<SPIRType>(phys_id);\n\telse\n\t\tphys_type = &expr_type;\n\n\tif (var)\n\t{\n\t\ttarget_id = var->self;\n\t\tvar_type = &get_variable_data_type(*var);\n\t}\n\n\tbool rewrite_boolean_store =\n\t\texpr_type.basetype == SPIRType::Boolean &&\n\t\t(var && (var->storage == StorageClassWorkgroup || var_type->basetype == SPIRType::Struct));\n\n\t// Type fixups for workgroup variables or struct members if they are booleans.\n\tif (rewrite_boolean_store)\n\t{\n\t\tif (is_array(expr_type))\n\t\t{\n\t\t\texpr = to_rerolled_array_expression(*var_type, expr, expr_type);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tauto short_type = expr_type;\n\t\t\tshort_type.basetype = SPIRType::Short;\n\t\t\texpr = join(type_to_glsl(short_type), \"(\", expr, \")\");\n\t\t}\n\t}\n\n\t// Type fixups for workgroup variables if they are matrices.\n\t// Don't do fixup for packed types; those are handled specially.\n\t// FIXME: Maybe use a type like spvStorageMatrix for packed matrices?\n\tif (!msl_options.supports_msl_version(3, 0) && var &&\n\t    (var->storage == StorageClassWorkgroup ||\n\t     (var_type->basetype == SPIRType::Struct &&\n\t      has_extended_decoration(var_type->self, SPIRVCrossDecorationWorkgroupStruct) && !is_packed)) &&\n\t    expr_type.columns > 1)\n\t{\n\t\tSPIRType matrix_type = *phys_type;\n\t\tif (target_expr && target_expr->need_transpose)\n\t\t\tswap(matrix_type.vecsize, matrix_type.columns);\n\t\texpr = join(\"spvStorage_\", type_to_glsl(matrix_type), \"(\", expr, \")\");\n\t}\n\n\t// Only interested in standalone builtin variables.\n\tif (!has_decoration(target_id, DecorationBuiltIn))\n\t\treturn;\n\n\tauto builtin = static_cast<BuiltIn>(get_decoration(target_id, DecorationBuiltIn));\n\tauto expected_type = expr_type.basetype;\n\tauto expected_width = expr_type.width;\n\tswitch (builtin)\n\t{\n\tcase BuiltInLayer:\n\tcase BuiltInViewportIndex:\n\tcase BuiltInFragStencilRefEXT:\n\tcase BuiltInPrimitiveId:\n\tcase BuiltInViewIndex:\n\t\texpected_type = SPIRType::UInt;\n\t\texpected_width = 32;\n\t\tbreak;\n\n\tcase BuiltInTessLevelInner:\n\tcase BuiltInTessLevelOuter:\n\t\texpected_type = SPIRType::Half;\n\t\texpected_width = 16;\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\tif (expected_type != expr_type.basetype)\n\t{\n\t\tif (expected_width != expr_type.width)\n\t\t{\n\t\t\t// These are of different widths, so we cannot do a straight bitcast.\n\t\t\tauto type = expr_type;\n\t\t\ttype.basetype = expected_type;\n\t\t\ttype.width = expected_width;\n\t\t\texpr = join(type_to_glsl(type), \"(\", expr, \")\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tauto type = expr_type;\n\t\t\ttype.basetype = expected_type;\n\t\t\texpr = bitcast_expression(type, expr_type.basetype, expr);\n\t\t}\n\t}\n}\n\nstring CompilerMSL::to_initializer_expression(const SPIRVariable &var)\n{\n\t// We risk getting an array initializer here with MSL. If we have an array.\n\t// FIXME: We cannot handle non-constant arrays being initialized.\n\t// We will need to inject spvArrayCopy here somehow ...\n\tauto &type = get<SPIRType>(var.basetype);\n\tstring expr;\n\tif (ir.ids[var.initializer].get_type() == TypeConstant &&\n\t    (!type.array.empty() || type.basetype == SPIRType::Struct))\n\t\texpr = constant_expression(get<SPIRConstant>(var.initializer));\n\telse\n\t\texpr = CompilerGLSL::to_initializer_expression(var);\n\t// If the initializer has more vector components than the variable, add a swizzle.\n\t// FIXME: This can't handle arrays or structs.\n\tauto &init_type = expression_type(var.initializer);\n\tif (type.array.empty() && type.basetype != SPIRType::Struct && init_type.vecsize > type.vecsize)\n\t\texpr = enclose_expression(expr + vector_swizzle(type.vecsize, 0));\n\treturn expr;\n}\n\nstring CompilerMSL::to_zero_initialized_expression(uint32_t)\n{\n\treturn \"{}\";\n}\n\nbool CompilerMSL::descriptor_set_is_argument_buffer(uint32_t desc_set) const\n{\n\tif (!msl_options.argument_buffers)\n\t\treturn false;\n\tif (desc_set >= kMaxArgumentBuffers)\n\t\treturn false;\n\n\treturn (argument_buffer_discrete_mask & (1u << desc_set)) == 0;\n}\n\nbool CompilerMSL::is_supported_argument_buffer_type(const SPIRType &type) const\n{\n\t// iOS Tier 1 argument buffers do not support writable images.\n\t// When the argument buffer is encoded, we don't know whether this image will have a\n\t// NonWritable decoration, so just use discrete arguments for all storage images on iOS.\n\tbool is_supported_type = !(type.basetype == SPIRType::Image &&\n\t\t\t\t\t\t\t   type.image.sampled == 2 &&\n\t\t\t\t\t\t\t   msl_options.is_ios() &&\n\t\t\t\t\t\t\t   msl_options.argument_buffers_tier <= Options::ArgumentBuffersTier::Tier1);\n\treturn is_supported_type && !type_is_msl_framebuffer_fetch(type);\n}\n\nvoid CompilerMSL::analyze_argument_buffers()\n{\n\t// Gather all used resources and sort them out into argument buffers.\n\t// Each argument buffer corresponds to a descriptor set in SPIR-V.\n\t// The [[id(N)]] values used correspond to the resource mapping we have for MSL.\n\t// Otherwise, the binding number is used, but this is generally not safe some types like\n\t// combined image samplers and arrays of resources. Metal needs different indices here,\n\t// while SPIR-V can have one descriptor set binding. To use argument buffers in practice,\n\t// you will need to use the remapping from the API.\n\tfor (auto &id : argument_buffer_ids)\n\t\tid = 0;\n\n\t// Output resources, sorted by resource index & type.\n\tstruct Resource\n\t{\n\t\tSPIRVariable *var;\n\t\tSPIRVariable *descriptor_alias;\n\t\tstring name;\n\t\tSPIRType::BaseType basetype;\n\t\tuint32_t index;\n\t\tuint32_t plane;\n\t};\n\tSmallVector<Resource> resources_in_set[kMaxArgumentBuffers];\n\tSmallVector<uint32_t> inline_block_vars;\n\n\tbool set_needs_swizzle_buffer[kMaxArgumentBuffers] = {};\n\tbool set_needs_buffer_sizes[kMaxArgumentBuffers] = {};\n\tbool needs_buffer_sizes = false;\n\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t self, SPIRVariable &var) {\n\t\tif ((var.storage == StorageClassUniform || var.storage == StorageClassUniformConstant ||\n\t\t     var.storage == StorageClassStorageBuffer) &&\n\t\t    !is_hidden_variable(var))\n\t\t{\n\t\t\tuint32_t desc_set = get_decoration(self, DecorationDescriptorSet);\n\t\t\t// Ignore if it's part of a push descriptor set.\n\t\t\tif (!descriptor_set_is_argument_buffer(desc_set))\n\t\t\t\treturn;\n\n\t\t\tuint32_t var_id = var.self;\n\t\t\tauto &type = get_variable_data_type(var);\n\n\t\t\tif (desc_set >= kMaxArgumentBuffers)\n\t\t\t\tSPIRV_CROSS_THROW(\"Descriptor set index is out of range.\");\n\n\t\t\tconst MSLConstexprSampler *constexpr_sampler = nullptr;\n\t\t\tif (type.basetype == SPIRType::SampledImage || type.basetype == SPIRType::Sampler)\n\t\t\t{\n\t\t\t\tconstexpr_sampler = find_constexpr_sampler(var_id);\n\t\t\t\tif (constexpr_sampler)\n\t\t\t\t{\n\t\t\t\t\t// Mark this ID as a constexpr sampler for later in case it came from set/bindings.\n\t\t\t\t\tconstexpr_samplers_by_id[var_id] = *constexpr_sampler;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Handle descriptor aliasing as well as we can.\n\t\t\t// We can handle aliasing of buffers by casting pointers, but not for typed resources.\n\t\t\t// Inline UBOs cannot be handled since it's not a pointer, but inline data.\n\t\t\tSPIRVariable *descriptor_alias = nullptr;\n\t\t\tif (var.storage == StorageClassUniform || var.storage == StorageClassStorageBuffer)\n\t\t\t{\n\t\t\t\tfor (auto &resource : resources_in_set[desc_set])\n\t\t\t\t{\n\t\t\t\t\tif (get_decoration(resource.var->self, DecorationBinding) ==\n\t\t\t\t\t    get_decoration(var_id, DecorationBinding) &&\n\t\t\t\t\t    resource.basetype == SPIRType::Struct && type.basetype == SPIRType::Struct &&\n\t\t\t\t\t    (resource.var->storage == StorageClassUniform ||\n\t\t\t\t\t     resource.var->storage == StorageClassStorageBuffer))\n\t\t\t\t\t{\n\t\t\t\t\t\tdescriptor_alias = resource.var;\n\t\t\t\t\t\t// Self-reference marks that we should declare the resource,\n\t\t\t\t\t\t// and it's being used as an alias (so we can emit void* instead).\n\t\t\t\t\t\tresource.descriptor_alias = resource.var;\n\t\t\t\t\t\t// Need to promote interlocked usage so that the primary declaration is correct.\n\t\t\t\t\t\tif (interlocked_resources.count(var_id))\n\t\t\t\t\t\t\tinterlocked_resources.insert(resource.var->self);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tuint32_t binding = get_decoration(var_id, DecorationBinding);\n\t\t\tif (type.basetype == SPIRType::SampledImage)\n\t\t\t{\n\t\t\t\tadd_resource_name(var_id);\n\n\t\t\t\tuint32_t plane_count = 1;\n\t\t\t\tif (constexpr_sampler && constexpr_sampler->ycbcr_conversion_enable)\n\t\t\t\t\tplane_count = constexpr_sampler->planes;\n\n\t\t\t\tfor (uint32_t i = 0; i < plane_count; i++)\n\t\t\t\t{\n\t\t\t\t\tuint32_t image_resource_index = get_metal_resource_index(var, SPIRType::Image, i);\n\t\t\t\t\tresources_in_set[desc_set].push_back(\n\t\t\t\t\t    { &var, descriptor_alias, to_name(var_id), SPIRType::Image, image_resource_index, i });\n\t\t\t\t}\n\n\t\t\t\tif (type.image.dim != DimBuffer && !constexpr_sampler)\n\t\t\t\t{\n\t\t\t\t\tuint32_t sampler_resource_index = get_metal_resource_index(var, SPIRType::Sampler);\n\t\t\t\t\tresources_in_set[desc_set].push_back(\n\t\t\t\t\t    { &var, descriptor_alias, to_sampler_expression(var_id), SPIRType::Sampler, sampler_resource_index, 0 });\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (inline_uniform_blocks.count(SetBindingPair{ desc_set, binding }))\n\t\t\t{\n\t\t\t\tinline_block_vars.push_back(var_id);\n\t\t\t}\n\t\t\telse if (!constexpr_sampler && is_supported_argument_buffer_type(type))\n\t\t\t{\n\t\t\t\t// constexpr samplers are not declared as resources.\n\t\t\t\t// Inline uniform blocks are always emitted at the end.\n\t\t\t\tadd_resource_name(var_id);\n\n\t\t\t\tuint32_t resource_index = ~0u;\n\t\t\t\tif (!descriptor_alias)\n\t\t\t\t\tresource_index = get_metal_resource_index(var, type.basetype);\n\n\t\t\t\tresources_in_set[desc_set].push_back(\n\t\t\t\t\t{ &var, descriptor_alias, to_name(var_id), type.basetype, resource_index, 0 });\n\n\t\t\t\t// Emulate texture2D atomic operations\n\t\t\t\tif (atomic_image_vars_emulated.count(var.self))\n\t\t\t\t{\n\t\t\t\t\tuint32_t buffer_resource_index = get_metal_resource_index(var, SPIRType::AtomicCounter, 0);\n\t\t\t\t\tresources_in_set[desc_set].push_back(\n\t\t\t\t\t\t{ &var, descriptor_alias, to_name(var_id) + \"_atomic\", SPIRType::Struct, buffer_resource_index, 0 });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check if this descriptor set needs a swizzle buffer.\n\t\t\tif (needs_swizzle_buffer_def && is_sampled_image_type(type))\n\t\t\t\tset_needs_swizzle_buffer[desc_set] = true;\n\t\t\telse if (buffer_requires_array_length(var_id))\n\t\t\t{\n\t\t\t\tset_needs_buffer_sizes[desc_set] = true;\n\t\t\t\tneeds_buffer_sizes = true;\n\t\t\t}\n\t\t}\n\t});\n\n\tif (needs_swizzle_buffer_def || needs_buffer_sizes)\n\t{\n\t\tuint32_t uint_ptr_type_id = 0;\n\n\t\t// We might have to add a swizzle buffer resource to the set.\n\t\tfor (uint32_t desc_set = 0; desc_set < kMaxArgumentBuffers; desc_set++)\n\t\t{\n\t\t\tif (!set_needs_swizzle_buffer[desc_set] && !set_needs_buffer_sizes[desc_set])\n\t\t\t\tcontinue;\n\n\t\t\tif (uint_ptr_type_id == 0)\n\t\t\t{\n\t\t\t\tuint_ptr_type_id = ir.increase_bound_by(1);\n\n\t\t\t\t// Create a buffer to hold extra data, including the swizzle constants.\n\t\t\t\tSPIRType uint_type_pointer = get_uint_type();\n\t\t\t\tuint_type_pointer.op = OpTypePointer;\n\t\t\t\tuint_type_pointer.pointer = true;\n\t\t\t\tuint_type_pointer.pointer_depth++;\n\t\t\t\tuint_type_pointer.parent_type = get_uint_type_id();\n\t\t\t\tuint_type_pointer.storage = StorageClassUniform;\n\t\t\t\tset<SPIRType>(uint_ptr_type_id, uint_type_pointer);\n\t\t\t\tset_decoration(uint_ptr_type_id, DecorationArrayStride, 4);\n\t\t\t}\n\n\t\t\tif (set_needs_swizzle_buffer[desc_set])\n\t\t\t{\n\t\t\t\tuint32_t var_id = ir.increase_bound_by(1);\n\t\t\t\tauto &var = set<SPIRVariable>(var_id, uint_ptr_type_id, StorageClassUniformConstant);\n\t\t\t\tset_name(var_id, \"spvSwizzleConstants\");\n\t\t\t\tset_decoration(var_id, DecorationDescriptorSet, desc_set);\n\t\t\t\tset_decoration(var_id, DecorationBinding, kSwizzleBufferBinding);\n\t\t\t\tresources_in_set[desc_set].push_back(\n\t\t\t\t    { &var, nullptr, to_name(var_id), SPIRType::UInt, get_metal_resource_index(var, SPIRType::UInt), 0 });\n\t\t\t}\n\n\t\t\tif (set_needs_buffer_sizes[desc_set])\n\t\t\t{\n\t\t\t\tuint32_t var_id = ir.increase_bound_by(1);\n\t\t\t\tauto &var = set<SPIRVariable>(var_id, uint_ptr_type_id, StorageClassUniformConstant);\n\t\t\t\tset_name(var_id, \"spvBufferSizeConstants\");\n\t\t\t\tset_decoration(var_id, DecorationDescriptorSet, desc_set);\n\t\t\t\tset_decoration(var_id, DecorationBinding, kBufferSizeBufferBinding);\n\t\t\t\tresources_in_set[desc_set].push_back(\n\t\t\t\t    { &var, nullptr, to_name(var_id), SPIRType::UInt, get_metal_resource_index(var, SPIRType::UInt), 0 });\n\t\t\t}\n\t\t}\n\t}\n\n\t// Now add inline uniform blocks.\n\tfor (uint32_t var_id : inline_block_vars)\n\t{\n\t\tauto &var = get<SPIRVariable>(var_id);\n\t\tuint32_t desc_set = get_decoration(var_id, DecorationDescriptorSet);\n\t\tadd_resource_name(var_id);\n\t\tresources_in_set[desc_set].push_back(\n\t\t    { &var, nullptr, to_name(var_id), SPIRType::Struct, get_metal_resource_index(var, SPIRType::Struct), 0 });\n\t}\n\n\tfor (uint32_t desc_set = 0; desc_set < kMaxArgumentBuffers; desc_set++)\n\t{\n\t\tauto &resources = resources_in_set[desc_set];\n\t\tif (resources.empty())\n\t\t\tcontinue;\n\n\t\tassert(descriptor_set_is_argument_buffer(desc_set));\n\n\t\tuint32_t next_id = ir.increase_bound_by(3);\n\t\tuint32_t type_id = next_id + 1;\n\t\tuint32_t ptr_type_id = next_id + 2;\n\t\targument_buffer_ids[desc_set] = next_id;\n\n\t\tauto &buffer_type = set<SPIRType>(type_id, OpTypeStruct);\n\n\t\tbuffer_type.basetype = SPIRType::Struct;\n\n\t\tif ((argument_buffer_device_storage_mask & (1u << desc_set)) != 0)\n\t\t{\n\t\t\tbuffer_type.storage = StorageClassStorageBuffer;\n\t\t\t// Make sure the argument buffer gets marked as const device.\n\t\t\tset_decoration(next_id, DecorationNonWritable);\n\t\t\t// Need to mark the type as a Block to enable this.\n\t\t\tset_decoration(type_id, DecorationBlock);\n\t\t}\n\t\telse\n\t\t\tbuffer_type.storage = StorageClassUniform;\n\n\t\tset_name(type_id, join(\"spvDescriptorSetBuffer\", desc_set));\n\n\t\tauto &ptr_type = set<SPIRType>(ptr_type_id, OpTypePointer);\n\t\tptr_type = buffer_type;\n\t\tptr_type.op = spv::OpTypePointer;\n\t\tptr_type.pointer = true;\n\t\tptr_type.pointer_depth++;\n\t\tptr_type.parent_type = type_id;\n\n\t\tuint32_t buffer_variable_id = next_id;\n\t\tset<SPIRVariable>(buffer_variable_id, ptr_type_id, StorageClassUniform);\n\t\tset_name(buffer_variable_id, join(\"spvDescriptorSet\", desc_set));\n\n\t\t// Ids must be emitted in ID order.\n\t\tstable_sort(begin(resources), end(resources), [&](const Resource &lhs, const Resource &rhs) -> bool {\n\t\t\treturn tie(lhs.index, lhs.basetype) < tie(rhs.index, rhs.basetype);\n\t\t});\n\n\t\tuint32_t member_index = 0;\n\t\tuint32_t next_arg_buff_index = 0;\n\t\tfor (auto &resource : resources)\n\t\t{\n\t\t\tauto &var = *resource.var;\n\t\t\tauto &type = get_variable_data_type(var);\n\n\t\t\t// If needed, synthesize and add padding members.\n\t\t\t// member_index and next_arg_buff_index are incremented when padding members are added.\n\t\t\tif (msl_options.pad_argument_buffer_resources)\n\t\t\t{\n\t\t\t\tauto &rez_bind = get_argument_buffer_resource(desc_set, next_arg_buff_index);\n\t\t\t\tif (!resource.descriptor_alias)\n\t\t\t\t{\n\t\t\t\t\twhile (resource.index > next_arg_buff_index)\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch (rez_bind.basetype)\n\t\t\t\t\t\t{\n\t\t\t\t\t\tcase SPIRType::Void:\n\t\t\t\t\t\tcase SPIRType::Boolean:\n\t\t\t\t\t\tcase SPIRType::SByte:\n\t\t\t\t\t\tcase SPIRType::UByte:\n\t\t\t\t\t\tcase SPIRType::Short:\n\t\t\t\t\t\tcase SPIRType::UShort:\n\t\t\t\t\t\tcase SPIRType::Int:\n\t\t\t\t\t\tcase SPIRType::UInt:\n\t\t\t\t\t\tcase SPIRType::Int64:\n\t\t\t\t\t\tcase SPIRType::UInt64:\n\t\t\t\t\t\tcase SPIRType::AtomicCounter:\n\t\t\t\t\t\tcase SPIRType::Half:\n\t\t\t\t\t\tcase SPIRType::Float:\n\t\t\t\t\t\tcase SPIRType::Double:\n\t\t\t\t\t\t\tadd_argument_buffer_padding_buffer_type(buffer_type, member_index, next_arg_buff_index, rez_bind);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SPIRType::Image:\n\t\t\t\t\t\t\tadd_argument_buffer_padding_image_type(buffer_type, member_index, next_arg_buff_index, rez_bind);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SPIRType::Sampler:\n\t\t\t\t\t\t\tadd_argument_buffer_padding_sampler_type(buffer_type, member_index, next_arg_buff_index, rez_bind);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SPIRType::SampledImage:\n\t\t\t\t\t\t\tif (next_arg_buff_index == rez_bind.msl_sampler)\n\t\t\t\t\t\t\t\tadd_argument_buffer_padding_sampler_type(buffer_type, member_index, next_arg_buff_index, rez_bind);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tadd_argument_buffer_padding_image_type(buffer_type, member_index, next_arg_buff_index, rez_bind);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Adjust the number of slots consumed by current member itself.\n\t\t\t\t// Use the count value from the app, instead of the shader, in case the\n\t\t\t\t// shader is only accesing part, or even one element, of the array.\n\t\t\t\tnext_arg_buff_index += rez_bind.count;\n\t\t\t}\n\n\t\t\tstring mbr_name = ensure_valid_name(resource.name, \"m\");\n\t\t\tif (resource.plane > 0)\n\t\t\t\tmbr_name += join(plane_name_suffix, resource.plane);\n\t\t\tset_member_name(buffer_type.self, member_index, mbr_name);\n\n\t\t\tif (resource.basetype == SPIRType::Sampler && type.basetype != SPIRType::Sampler)\n\t\t\t{\n\t\t\t\t// Have to synthesize a sampler type here.\n\n\t\t\t\tbool type_is_array = !type.array.empty();\n\t\t\t\tuint32_t sampler_type_id = ir.increase_bound_by(type_is_array ? 2 : 1);\n\t\t\t\tauto &new_sampler_type = set<SPIRType>(sampler_type_id, OpTypeSampler);\n\t\t\t\tnew_sampler_type.basetype = SPIRType::Sampler;\n\t\t\t\tnew_sampler_type.storage = StorageClassUniformConstant;\n\n\t\t\t\tif (type_is_array)\n\t\t\t\t{\n\t\t\t\t\tuint32_t sampler_type_array_id = sampler_type_id + 1;\n\t\t\t\t\tauto &sampler_type_array = set<SPIRType>(sampler_type_array_id, OpTypeArray);\n\t\t\t\t\tsampler_type_array = new_sampler_type;\n\t\t\t\t\tsampler_type_array.array = type.array;\n\t\t\t\t\tsampler_type_array.array_size_literal = type.array_size_literal;\n\t\t\t\t\tsampler_type_array.parent_type = sampler_type_id;\n\t\t\t\t\tbuffer_type.member_types.push_back(sampler_type_array_id);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tbuffer_type.member_types.push_back(sampler_type_id);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tuint32_t binding = get_decoration(var.self, DecorationBinding);\n\t\t\t\tSetBindingPair pair = { desc_set, binding };\n\n\t\t\t\tif (resource.basetype == SPIRType::Image || resource.basetype == SPIRType::Sampler ||\n\t\t\t\t    resource.basetype == SPIRType::SampledImage)\n\t\t\t\t{\n\t\t\t\t\t// Drop pointer information when we emit the resources into a struct.\n\t\t\t\t\tbuffer_type.member_types.push_back(get_variable_data_type_id(var));\n\t\t\t\t\tif (resource.plane == 0)\n\t\t\t\t\t\tset_qualified_name(var.self, join(to_name(buffer_variable_id), \".\", mbr_name));\n\t\t\t\t}\n\t\t\t\telse if (buffers_requiring_dynamic_offset.count(pair))\n\t\t\t\t{\n\t\t\t\t\tif (resource.descriptor_alias)\n\t\t\t\t\t\tSPIRV_CROSS_THROW(\"Descriptor aliasing is currently not supported with dynamic offsets.\");\n\n\t\t\t\t\t// Don't set the qualified name here; we'll define a variable holding the corrected buffer address later.\n\t\t\t\t\tbuffer_type.member_types.push_back(var.basetype);\n\t\t\t\t\tbuffers_requiring_dynamic_offset[pair].second = var.self;\n\t\t\t\t}\n\t\t\t\telse if (inline_uniform_blocks.count(pair))\n\t\t\t\t{\n\t\t\t\t\tif (resource.descriptor_alias)\n\t\t\t\t\t\tSPIRV_CROSS_THROW(\"Descriptor aliasing is currently not supported with inline UBOs.\");\n\n\t\t\t\t\t// Put the buffer block itself into the argument buffer.\n\t\t\t\t\tbuffer_type.member_types.push_back(get_variable_data_type_id(var));\n\t\t\t\t\tset_qualified_name(var.self, join(to_name(buffer_variable_id), \".\", mbr_name));\n\t\t\t\t}\n\t\t\t\telse if (atomic_image_vars_emulated.count(var.self))\n\t\t\t\t{\n\t\t\t\t\t// Emulate texture2D atomic operations.\n\t\t\t\t\t// Don't set the qualified name: it's already set for this variable,\n\t\t\t\t\t// and the code that references the buffer manually appends \"_atomic\"\n\t\t\t\t\t// to the name.\n\t\t\t\t\tuint32_t offset = ir.increase_bound_by(2);\n\t\t\t\t\tuint32_t atomic_type_id = offset;\n\t\t\t\t\tuint32_t type_ptr_id = offset + 1;\n\n\t\t\t\t\tSPIRType atomic_type { OpTypeInt };\n\t\t\t\t\tatomic_type.basetype = SPIRType::AtomicCounter;\n\t\t\t\t\tatomic_type.width = 32;\n\t\t\t\t\tatomic_type.vecsize = 1;\n\t\t\t\t\tset<SPIRType>(atomic_type_id, atomic_type);\n\n\t\t\t\t\tatomic_type.op = OpTypePointer;\n\t\t\t\t\tatomic_type.pointer = true;\n\t\t\t\t\tatomic_type.pointer_depth++;\n\t\t\t\t\tatomic_type.parent_type = atomic_type_id;\n\t\t\t\t\tatomic_type.storage = StorageClassStorageBuffer;\n\t\t\t\t\tauto &atomic_ptr_type = set<SPIRType>(type_ptr_id, atomic_type);\n\t\t\t\t\tatomic_ptr_type.self = atomic_type_id;\n\n\t\t\t\t\tbuffer_type.member_types.push_back(type_ptr_id);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (!resource.descriptor_alias || resource.descriptor_alias == resource.var)\n\t\t\t\t\t\tbuffer_type.member_types.push_back(var.basetype);\n\n\t\t\t\t\tif (resource.descriptor_alias && resource.descriptor_alias != resource.var)\n\t\t\t\t\t\tbuffer_aliases_argument.push_back({ var.self, resource.descriptor_alias->self });\n\t\t\t\t\telse if (type.array.empty())\n\t\t\t\t\t\tset_qualified_name(var.self, join(\"(*\", to_name(buffer_variable_id), \".\", mbr_name, \")\"));\n\t\t\t\t\telse\n\t\t\t\t\t\tset_qualified_name(var.self, join(to_name(buffer_variable_id), \".\", mbr_name));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tset_extended_member_decoration(buffer_type.self, member_index, SPIRVCrossDecorationResourceIndexPrimary,\n\t\t\t                               resource.index);\n\t\t\tset_extended_member_decoration(buffer_type.self, member_index, SPIRVCrossDecorationInterfaceOrigID,\n\t\t\t                               var.self);\n\t\t\tmember_index++;\n\t\t}\n\t}\n}\n\n// Return the resource type of the app-provided resources for the descriptor set,\n// that matches the resource index of the argument buffer index.\n// This is a two-step lookup, first lookup the resource binding number from the argument buffer index,\n// then lookup the resource binding using the binding number.\nMSLResourceBinding &CompilerMSL::get_argument_buffer_resource(uint32_t desc_set, uint32_t arg_idx)\n{\n\tauto stage = get_entry_point().model;\n\tStageSetBinding arg_idx_tuple = { stage, desc_set, arg_idx };\n\tauto arg_itr = resource_arg_buff_idx_to_binding_number.find(arg_idx_tuple);\n\tif (arg_itr != end(resource_arg_buff_idx_to_binding_number))\n\t{\n\t\tStageSetBinding bind_tuple = { stage, desc_set, arg_itr->second };\n\t\tauto bind_itr = resource_bindings.find(bind_tuple);\n\t\tif (bind_itr != end(resource_bindings))\n\t\t\treturn bind_itr->second.first;\n\t}\n\tSPIRV_CROSS_THROW(\"Argument buffer resource base type could not be determined. When padding argument buffer \"\n\t                  \"elements, all descriptor set resources must be supplied with a base type by the app.\");\n}\n\n// Adds an argument buffer padding argument buffer type as one or more members of the struct type at the member index.\n// Metal does not support arrays of buffers, so these are emitted as multiple struct members.\nvoid CompilerMSL::add_argument_buffer_padding_buffer_type(SPIRType &struct_type, uint32_t &mbr_idx,\n                                                          uint32_t &arg_buff_index, MSLResourceBinding &rez_bind)\n{\n\tif (!argument_buffer_padding_buffer_type_id)\n\t{\n\t\tuint32_t buff_type_id = ir.increase_bound_by(2);\n\t\tauto &buff_type = set<SPIRType>(buff_type_id, OpNop);\n\t\tbuff_type.basetype = rez_bind.basetype;\n\t\tbuff_type.storage = StorageClassUniformConstant;\n\n\t\tuint32_t ptr_type_id = buff_type_id + 1;\n\t\tauto &ptr_type = set<SPIRType>(ptr_type_id, OpTypePointer);\n\t\tptr_type = buff_type;\n\t\tptr_type.op = spv::OpTypePointer;\n\t\tptr_type.pointer = true;\n\t\tptr_type.pointer_depth++;\n\t\tptr_type.parent_type = buff_type_id;\n\n\t\targument_buffer_padding_buffer_type_id = ptr_type_id;\n\t}\n\n\tadd_argument_buffer_padding_type(argument_buffer_padding_buffer_type_id, struct_type, mbr_idx, arg_buff_index, rez_bind.count);\n}\n\n// Adds an argument buffer padding argument image type as a member of the struct type at the member index.\nvoid CompilerMSL::add_argument_buffer_padding_image_type(SPIRType &struct_type, uint32_t &mbr_idx,\n                                                         uint32_t &arg_buff_index, MSLResourceBinding &rez_bind)\n{\n\tif (!argument_buffer_padding_image_type_id)\n\t{\n\t\tuint32_t base_type_id = ir.increase_bound_by(2);\n\t\tauto &base_type = set<SPIRType>(base_type_id, OpTypeFloat);\n\t\tbase_type.basetype = SPIRType::Float;\n\t\tbase_type.width = 32;\n\n\t\tuint32_t img_type_id = base_type_id + 1;\n\t\tauto &img_type = set<SPIRType>(img_type_id, OpTypeImage);\n\t\timg_type.basetype = SPIRType::Image;\n\t\timg_type.storage = StorageClassUniformConstant;\n\n\t\timg_type.image.type = base_type_id;\n\t\timg_type.image.dim = Dim2D;\n\t\timg_type.image.depth = false;\n\t\timg_type.image.arrayed = false;\n\t\timg_type.image.ms = false;\n\t\timg_type.image.sampled = 1;\n\t\timg_type.image.format = ImageFormatUnknown;\n\t\timg_type.image.access = AccessQualifierMax;\n\n\t\targument_buffer_padding_image_type_id = img_type_id;\n\t}\n\n\tadd_argument_buffer_padding_type(argument_buffer_padding_image_type_id, struct_type, mbr_idx, arg_buff_index, rez_bind.count);\n}\n\n// Adds an argument buffer padding argument sampler type as a member of the struct type at the member index.\nvoid CompilerMSL::add_argument_buffer_padding_sampler_type(SPIRType &struct_type, uint32_t &mbr_idx,\n                                                           uint32_t &arg_buff_index, MSLResourceBinding &rez_bind)\n{\n\tif (!argument_buffer_padding_sampler_type_id)\n\t{\n\t\tuint32_t samp_type_id = ir.increase_bound_by(1);\n\t\tauto &samp_type = set<SPIRType>(samp_type_id, OpTypeSampler);\n\t\tsamp_type.basetype = SPIRType::Sampler;\n\t\tsamp_type.storage = StorageClassUniformConstant;\n\n\t\targument_buffer_padding_sampler_type_id = samp_type_id;\n\t}\n\n\tadd_argument_buffer_padding_type(argument_buffer_padding_sampler_type_id, struct_type, mbr_idx, arg_buff_index, rez_bind.count);\n}\n\n// Adds the argument buffer padding argument type as a member of the struct type at the member index.\n// Advances both arg_buff_index and mbr_idx to next argument slots.\nvoid CompilerMSL::add_argument_buffer_padding_type(uint32_t mbr_type_id, SPIRType &struct_type, uint32_t &mbr_idx,\n                                                   uint32_t &arg_buff_index, uint32_t count)\n{\n\tuint32_t type_id = mbr_type_id;\n\tif (count > 1)\n\t{\n\t\tuint32_t ary_type_id = ir.increase_bound_by(1);\n\t\tauto &ary_type = set<SPIRType>(ary_type_id, get<SPIRType>(type_id));\n\t\tary_type.op = OpTypeArray;\n\t\tary_type.array.push_back(count);\n\t\tary_type.array_size_literal.push_back(true);\n\t\tary_type.parent_type = type_id;\n\t\ttype_id = ary_type_id;\n\t}\n\n\tset_member_name(struct_type.self, mbr_idx, join(\"_m\", arg_buff_index, \"_pad\"));\n\tset_extended_member_decoration(struct_type.self, mbr_idx, SPIRVCrossDecorationResourceIndexPrimary, arg_buff_index);\n\tstruct_type.member_types.push_back(type_id);\n\n\targ_buff_index += count;\n\tmbr_idx++;\n}\n\nvoid CompilerMSL::activate_argument_buffer_resources()\n{\n\t// For ABI compatibility, force-enable all resources which are part of argument buffers.\n\tir.for_each_typed_id<SPIRVariable>([&](uint32_t self, const SPIRVariable &) {\n\t\tif (!has_decoration(self, DecorationDescriptorSet))\n\t\t\treturn;\n\n\t\tuint32_t desc_set = get_decoration(self, DecorationDescriptorSet);\n\t\tif (descriptor_set_is_argument_buffer(desc_set))\n\t\t\tadd_active_interface_variable(self);\n\t});\n}\n\nbool CompilerMSL::using_builtin_array() const\n{\n\treturn msl_options.force_native_arrays || is_using_builtin_array;\n}\n\nvoid CompilerMSL::set_combined_sampler_suffix(const char *suffix)\n{\n\tsampler_name_suffix = suffix;\n}\n\nconst char *CompilerMSL::get_combined_sampler_suffix() const\n{\n\treturn sampler_name_suffix.c_str();\n}\n\nvoid CompilerMSL::emit_block_hints(const SPIRBlock &)\n{\n}\n\nstring CompilerMSL::additional_fixed_sample_mask_str() const\n{\n\tchar print_buffer[32];\n#ifdef _MSC_VER\n\t// snprintf does not exist or is buggy on older MSVC versions, some of\n\t// them being used by MinGW. Use sprintf instead and disable\n\t// corresponding warning.\n#pragma warning(push)\n#pragma warning(disable : 4996)\n#endif\n#if _WIN32\n\tsprintf(print_buffer, \"0x%x\", msl_options.additional_fixed_sample_mask);\n#else\n\tsnprintf(print_buffer, sizeof(print_buffer), \"0x%x\", msl_options.additional_fixed_sample_mask);\n#endif\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n\treturn print_buffer;\n}\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv_msl.hpp",
    "content": "/*\n * Copyright 2016-2021 The Brenwill Workshop Ltd.\n * SPDX-License-Identifier: Apache-2.0 OR MIT\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * At your option, you may choose to accept this material under either:\n *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or\n *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.\n */\n\n#ifndef SPIRV_CROSS_MSL_HPP\n#define SPIRV_CROSS_MSL_HPP\n\n#include \"spirv_glsl.hpp\"\n#include <map>\n#include <set>\n#include <stddef.h>\n#include <unordered_map>\n#include <unordered_set>\n\nnamespace SPIRV_CROSS_NAMESPACE\n{\n\n// Indicates the format of a shader interface variable. Currently limited to specifying\n// if the input is an 8-bit unsigned integer, 16-bit unsigned integer, or\n// some other format.\nenum MSLShaderVariableFormat\n{\n\tMSL_SHADER_VARIABLE_FORMAT_OTHER = 0,\n\tMSL_SHADER_VARIABLE_FORMAT_UINT8 = 1,\n\tMSL_SHADER_VARIABLE_FORMAT_UINT16 = 2,\n\tMSL_SHADER_VARIABLE_FORMAT_ANY16 = 3,\n\tMSL_SHADER_VARIABLE_FORMAT_ANY32 = 4,\n\n\t// Deprecated aliases.\n\tMSL_VERTEX_FORMAT_OTHER = MSL_SHADER_VARIABLE_FORMAT_OTHER,\n\tMSL_VERTEX_FORMAT_UINT8 = MSL_SHADER_VARIABLE_FORMAT_UINT8,\n\tMSL_VERTEX_FORMAT_UINT16 = MSL_SHADER_VARIABLE_FORMAT_UINT16,\n\tMSL_SHADER_INPUT_FORMAT_OTHER = MSL_SHADER_VARIABLE_FORMAT_OTHER,\n\tMSL_SHADER_INPUT_FORMAT_UINT8 = MSL_SHADER_VARIABLE_FORMAT_UINT8,\n\tMSL_SHADER_INPUT_FORMAT_UINT16 = MSL_SHADER_VARIABLE_FORMAT_UINT16,\n\tMSL_SHADER_INPUT_FORMAT_ANY16 = MSL_SHADER_VARIABLE_FORMAT_ANY16,\n\tMSL_SHADER_INPUT_FORMAT_ANY32 = MSL_SHADER_VARIABLE_FORMAT_ANY32,\n\n\tMSL_SHADER_VARIABLE_FORMAT_INT_MAX = 0x7fffffff\n};\n\n// Indicates the rate at which a variable changes value, one of: per-vertex,\n// per-primitive, or per-patch.\nenum MSLShaderVariableRate\n{\n\tMSL_SHADER_VARIABLE_RATE_PER_VERTEX = 0,\n\tMSL_SHADER_VARIABLE_RATE_PER_PRIMITIVE = 1,\n\tMSL_SHADER_VARIABLE_RATE_PER_PATCH = 2,\n\n\tMSL_SHADER_VARIABLE_RATE_INT_MAX = 0x7fffffff,\n};\n\n// Defines MSL characteristics of a shader interface variable at a particular location.\n// After compilation, it is possible to query whether or not this location was used.\n// If vecsize is nonzero, it must be greater than or equal to the vecsize declared in the shader,\n// or behavior is undefined.\nstruct MSLShaderInterfaceVariable\n{\n\tuint32_t location = 0;\n\tuint32_t component = 0;\n\tMSLShaderVariableFormat format = MSL_SHADER_VARIABLE_FORMAT_OTHER;\n\tspv::BuiltIn builtin = spv::BuiltInMax;\n\tuint32_t vecsize = 0;\n\tMSLShaderVariableRate rate = MSL_SHADER_VARIABLE_RATE_PER_VERTEX;\n};\n\n// Matches the binding index of a MSL resource for a binding within a descriptor set.\n// Taken together, the stage, desc_set and binding combine to form a reference to a resource\n// descriptor used in a particular shading stage. The count field indicates the number of\n// resources consumed by this binding, if the binding represents an array of resources.\n// If the resource array is a run-time-sized array, which are legal in GLSL or SPIR-V, this value\n// will be used to declare the array size in MSL, which does not support run-time-sized arrays.\n// If pad_argument_buffer_resources is enabled, the base_type and count values are used to\n// specify the base type and array size of the resource in the argument buffer, if that resource\n// is not defined and used by the shader. With pad_argument_buffer_resources enabled, this\n// information will be used to pad the argument buffer structure, in order to align that\n// structure consistently for all uses, across all shaders, of the descriptor set represented\n// by the arugment buffer. If pad_argument_buffer_resources is disabled, base_type does not\n// need to be populated, and if the resource is also not a run-time sized array, the count\n// field does not need to be populated.\n// If using MSL 2.0 argument buffers, the descriptor set is not marked as a discrete descriptor set,\n// and (for iOS only) the resource is not a storage image (sampled != 2), the binding reference we\n// remap to will become an [[id(N)]] attribute within the \"descriptor set\" argument buffer structure.\n// For resources which are bound in the \"classic\" MSL 1.0 way or discrete descriptors, the remap will\n// become a [[buffer(N)]], [[texture(N)]] or [[sampler(N)]] depending on the resource types used.\nstruct MSLResourceBinding\n{\n\tspv::ExecutionModel stage = spv::ExecutionModelMax;\n\tSPIRType::BaseType basetype = SPIRType::Unknown;\n\tuint32_t desc_set = 0;\n\tuint32_t binding = 0;\n\tuint32_t count = 0;\n\tuint32_t msl_buffer = 0;\n\tuint32_t msl_texture = 0;\n\tuint32_t msl_sampler = 0;\n};\n\nenum MSLSamplerCoord\n{\n\tMSL_SAMPLER_COORD_NORMALIZED = 0,\n\tMSL_SAMPLER_COORD_PIXEL = 1,\n\tMSL_SAMPLER_INT_MAX = 0x7fffffff\n};\n\nenum MSLSamplerFilter\n{\n\tMSL_SAMPLER_FILTER_NEAREST = 0,\n\tMSL_SAMPLER_FILTER_LINEAR = 1,\n\tMSL_SAMPLER_FILTER_INT_MAX = 0x7fffffff\n};\n\nenum MSLSamplerMipFilter\n{\n\tMSL_SAMPLER_MIP_FILTER_NONE = 0,\n\tMSL_SAMPLER_MIP_FILTER_NEAREST = 1,\n\tMSL_SAMPLER_MIP_FILTER_LINEAR = 2,\n\tMSL_SAMPLER_MIP_FILTER_INT_MAX = 0x7fffffff\n};\n\nenum MSLSamplerAddress\n{\n\tMSL_SAMPLER_ADDRESS_CLAMP_TO_ZERO = 0,\n\tMSL_SAMPLER_ADDRESS_CLAMP_TO_EDGE = 1,\n\tMSL_SAMPLER_ADDRESS_CLAMP_TO_BORDER = 2,\n\tMSL_SAMPLER_ADDRESS_REPEAT = 3,\n\tMSL_SAMPLER_ADDRESS_MIRRORED_REPEAT = 4,\n\tMSL_SAMPLER_ADDRESS_INT_MAX = 0x7fffffff\n};\n\nenum MSLSamplerCompareFunc\n{\n\tMSL_SAMPLER_COMPARE_FUNC_NEVER = 0,\n\tMSL_SAMPLER_COMPARE_FUNC_LESS = 1,\n\tMSL_SAMPLER_COMPARE_FUNC_LESS_EQUAL = 2,\n\tMSL_SAMPLER_COMPARE_FUNC_GREATER = 3,\n\tMSL_SAMPLER_COMPARE_FUNC_GREATER_EQUAL = 4,\n\tMSL_SAMPLER_COMPARE_FUNC_EQUAL = 5,\n\tMSL_SAMPLER_COMPARE_FUNC_NOT_EQUAL = 6,\n\tMSL_SAMPLER_COMPARE_FUNC_ALWAYS = 7,\n\tMSL_SAMPLER_COMPARE_FUNC_INT_MAX = 0x7fffffff\n};\n\nenum MSLSamplerBorderColor\n{\n\tMSL_SAMPLER_BORDER_COLOR_TRANSPARENT_BLACK = 0,\n\tMSL_SAMPLER_BORDER_COLOR_OPAQUE_BLACK = 1,\n\tMSL_SAMPLER_BORDER_COLOR_OPAQUE_WHITE = 2,\n\tMSL_SAMPLER_BORDER_COLOR_INT_MAX = 0x7fffffff\n};\n\nenum MSLFormatResolution\n{\n\tMSL_FORMAT_RESOLUTION_444 = 0,\n\tMSL_FORMAT_RESOLUTION_422,\n\tMSL_FORMAT_RESOLUTION_420,\n\tMSL_FORMAT_RESOLUTION_INT_MAX = 0x7fffffff\n};\n\nenum MSLChromaLocation\n{\n\tMSL_CHROMA_LOCATION_COSITED_EVEN = 0,\n\tMSL_CHROMA_LOCATION_MIDPOINT,\n\tMSL_CHROMA_LOCATION_INT_MAX = 0x7fffffff\n};\n\nenum MSLComponentSwizzle\n{\n\tMSL_COMPONENT_SWIZZLE_IDENTITY = 0,\n\tMSL_COMPONENT_SWIZZLE_ZERO,\n\tMSL_COMPONENT_SWIZZLE_ONE,\n\tMSL_COMPONENT_SWIZZLE_R,\n\tMSL_COMPONENT_SWIZZLE_G,\n\tMSL_COMPONENT_SWIZZLE_B,\n\tMSL_COMPONENT_SWIZZLE_A,\n\tMSL_COMPONENT_SWIZZLE_INT_MAX = 0x7fffffff\n};\n\nenum MSLSamplerYCbCrModelConversion\n{\n\tMSL_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY = 0,\n\tMSL_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY,\n\tMSL_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_BT_709,\n\tMSL_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_BT_601,\n\tMSL_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_BT_2020,\n\tMSL_SAMPLER_YCBCR_MODEL_CONVERSION_INT_MAX = 0x7fffffff\n};\n\nenum MSLSamplerYCbCrRange\n{\n\tMSL_SAMPLER_YCBCR_RANGE_ITU_FULL = 0,\n\tMSL_SAMPLER_YCBCR_RANGE_ITU_NARROW,\n\tMSL_SAMPLER_YCBCR_RANGE_INT_MAX = 0x7fffffff\n};\n\nstruct MSLConstexprSampler\n{\n\tMSLSamplerCoord coord = MSL_SAMPLER_COORD_NORMALIZED;\n\tMSLSamplerFilter min_filter = MSL_SAMPLER_FILTER_NEAREST;\n\tMSLSamplerFilter mag_filter = MSL_SAMPLER_FILTER_NEAREST;\n\tMSLSamplerMipFilter mip_filter = MSL_SAMPLER_MIP_FILTER_NONE;\n\tMSLSamplerAddress s_address = MSL_SAMPLER_ADDRESS_CLAMP_TO_EDGE;\n\tMSLSamplerAddress t_address = MSL_SAMPLER_ADDRESS_CLAMP_TO_EDGE;\n\tMSLSamplerAddress r_address = MSL_SAMPLER_ADDRESS_CLAMP_TO_EDGE;\n\tMSLSamplerCompareFunc compare_func = MSL_SAMPLER_COMPARE_FUNC_NEVER;\n\tMSLSamplerBorderColor border_color = MSL_SAMPLER_BORDER_COLOR_TRANSPARENT_BLACK;\n\tfloat lod_clamp_min = 0.0f;\n\tfloat lod_clamp_max = 1000.0f;\n\tint max_anisotropy = 1;\n\n\t// Sampler Y'CbCr conversion parameters\n\tuint32_t planes = 0;\n\tMSLFormatResolution resolution = MSL_FORMAT_RESOLUTION_444;\n\tMSLSamplerFilter chroma_filter = MSL_SAMPLER_FILTER_NEAREST;\n\tMSLChromaLocation x_chroma_offset = MSL_CHROMA_LOCATION_COSITED_EVEN;\n\tMSLChromaLocation y_chroma_offset = MSL_CHROMA_LOCATION_COSITED_EVEN;\n\tMSLComponentSwizzle swizzle[4]; // IDENTITY, IDENTITY, IDENTITY, IDENTITY\n\tMSLSamplerYCbCrModelConversion ycbcr_model = MSL_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY;\n\tMSLSamplerYCbCrRange ycbcr_range = MSL_SAMPLER_YCBCR_RANGE_ITU_FULL;\n\tuint32_t bpc = 8;\n\n\tbool compare_enable = false;\n\tbool lod_clamp_enable = false;\n\tbool anisotropy_enable = false;\n\tbool ycbcr_conversion_enable = false;\n\n\tMSLConstexprSampler()\n\t{\n\t\tfor (uint32_t i = 0; i < 4; i++)\n\t\t\tswizzle[i] = MSL_COMPONENT_SWIZZLE_IDENTITY;\n\t}\n\tbool swizzle_is_identity() const\n\t{\n\t\treturn (swizzle[0] == MSL_COMPONENT_SWIZZLE_IDENTITY && swizzle[1] == MSL_COMPONENT_SWIZZLE_IDENTITY &&\n\t\t        swizzle[2] == MSL_COMPONENT_SWIZZLE_IDENTITY && swizzle[3] == MSL_COMPONENT_SWIZZLE_IDENTITY);\n\t}\n\tbool swizzle_has_one_or_zero() const\n\t{\n\t\treturn (swizzle[0] == MSL_COMPONENT_SWIZZLE_ZERO || swizzle[0] == MSL_COMPONENT_SWIZZLE_ONE ||\n\t\t        swizzle[1] == MSL_COMPONENT_SWIZZLE_ZERO || swizzle[1] == MSL_COMPONENT_SWIZZLE_ONE ||\n\t\t        swizzle[2] == MSL_COMPONENT_SWIZZLE_ZERO || swizzle[2] == MSL_COMPONENT_SWIZZLE_ONE ||\n\t\t        swizzle[3] == MSL_COMPONENT_SWIZZLE_ZERO || swizzle[3] == MSL_COMPONENT_SWIZZLE_ONE);\n\t}\n};\n\n// Special constant used in a MSLResourceBinding desc_set\n// element to indicate the bindings for the push constants.\n// Kinda deprecated. Just use ResourceBindingPushConstant{DescriptorSet,Binding} directly.\nstatic const uint32_t kPushConstDescSet = ResourceBindingPushConstantDescriptorSet;\n\n// Special constant used in a MSLResourceBinding binding\n// element to indicate the bindings for the push constants.\n// Kinda deprecated. Just use ResourceBindingPushConstant{DescriptorSet,Binding} directly.\nstatic const uint32_t kPushConstBinding = ResourceBindingPushConstantBinding;\n\n// Special constant used in a MSLResourceBinding binding\n// element to indicate the buffer binding for swizzle buffers.\nstatic const uint32_t kSwizzleBufferBinding = ~(1u);\n\n// Special constant used in a MSLResourceBinding binding\n// element to indicate the buffer binding for buffer size buffers to support OpArrayLength.\nstatic const uint32_t kBufferSizeBufferBinding = ~(2u);\n\n// Special constant used in a MSLResourceBinding binding\n// element to indicate the buffer binding used for the argument buffer itself.\n// This buffer binding should be kept as small as possible as all automatic bindings for buffers\n// will start at max(kArgumentBufferBinding) + 1.\nstatic const uint32_t kArgumentBufferBinding = ~(3u);\n\nstatic const uint32_t kMaxArgumentBuffers = 8;\n\n// The arbitrary maximum for the nesting of array of array copies.\nstatic const uint32_t kArrayCopyMultidimMax = 6;\n\n// Decompiles SPIR-V to Metal Shading Language\nclass CompilerMSL : public CompilerGLSL\n{\npublic:\n\t// Options for compiling to Metal Shading Language\n\tstruct Options\n\t{\n\t\ttypedef enum\n\t\t{\n\t\t\tiOS = 0,\n\t\t\tmacOS = 1\n\t\t} Platform;\n\n\t\tPlatform platform = macOS;\n\t\tuint32_t msl_version = make_msl_version(1, 2);\n\t\tuint32_t texel_buffer_texture_width = 4096; // Width of 2D Metal textures used as 1D texel buffers\n\t\tuint32_t r32ui_linear_texture_alignment = 4;\n\t\tuint32_t r32ui_alignment_constant_id = 65535;\n\t\tuint32_t swizzle_buffer_index = 30;\n\t\tuint32_t indirect_params_buffer_index = 29;\n\t\tuint32_t shader_output_buffer_index = 28;\n\t\tuint32_t shader_patch_output_buffer_index = 27;\n\t\tuint32_t shader_tess_factor_buffer_index = 26;\n\t\tuint32_t buffer_size_buffer_index = 25;\n\t\tuint32_t view_mask_buffer_index = 24;\n\t\tuint32_t dynamic_offsets_buffer_index = 23;\n\t\tuint32_t shader_input_buffer_index = 22;\n\t\tuint32_t shader_index_buffer_index = 21;\n\t\tuint32_t shader_patch_input_buffer_index = 20;\n\t\tuint32_t shader_input_wg_index = 0;\n\t\tuint32_t device_index = 0;\n\t\tuint32_t enable_frag_output_mask = 0xffffffff;\n\t\t// Metal doesn't allow setting a fixed sample mask directly in the pipeline.\n\t\t// We can evade this restriction by ANDing the internal sample_mask output\n\t\t// of the shader with the additional fixed sample mask.\n\t\tuint32_t additional_fixed_sample_mask = 0xffffffff;\n\t\tbool enable_point_size_builtin = true;\n\t\tbool enable_frag_depth_builtin = true;\n\t\tbool enable_frag_stencil_ref_builtin = true;\n\t\tbool disable_rasterization = false;\n\t\tbool capture_output_to_buffer = false;\n\t\tbool swizzle_texture_samples = false;\n\t\tbool tess_domain_origin_lower_left = false;\n\t\tbool multiview = false;\n\t\tbool multiview_layered_rendering = true;\n\t\tbool view_index_from_device_index = false;\n\t\tbool dispatch_base = false;\n\t\tbool texture_1D_as_2D = false;\n\n\t\t// Enable use of Metal argument buffers.\n\t\t// MSL 2.0 must also be enabled.\n\t\tbool argument_buffers = false;\n\n\t\t// Defines Metal argument buffer tier levels.\n\t\t// Uses same values as Metal MTLArgumentBuffersTier enumeration.\n\t\tenum class ArgumentBuffersTier\n\t\t{\n\t\t\tTier1 = 0,\n\t\t\tTier2 = 1,\n\t\t};\n\n\t\t// When using Metal argument buffers, indicates the Metal argument buffer tier level supported by the Metal platform.\n\t\t// Ignored when Options::argument_buffers is disabled.\n\t\t// - Tier1 supports writable images on macOS, but not on iOS.\n\t\t// - Tier2 supports writable images on macOS and iOS, and higher resource count limits.\n\t\t// Tier capabilities based on recommendations from Apple engineering.\n\t\tArgumentBuffersTier argument_buffers_tier = ArgumentBuffersTier::Tier1;\n\n\t\t// Enables specifick argument buffer format with extra information to track SSBO-length\n\t\tbool runtime_array_rich_descriptor = false;\n\n\t\t// Ensures vertex and instance indices start at zero. This reflects the behavior of HLSL with SV_VertexID and SV_InstanceID.\n\t\tbool enable_base_index_zero = false;\n\n\t\t// Fragment output in MSL must have at least as many components as the render pass.\n\t\t// Add support to explicit pad out components.\n\t\tbool pad_fragment_output_components = false;\n\n\t\t// Specifies whether the iOS target version supports the [[base_vertex]] and [[base_instance]] attributes.\n\t\tbool ios_support_base_vertex_instance = false;\n\n\t\t// Use Metal's native frame-buffer fetch API for subpass inputs.\n\t\tbool use_framebuffer_fetch_subpasses = false;\n\n\t\t// Enables use of \"fma\" intrinsic for invariant float math\n\t\tbool invariant_float_math = false;\n\n\t\t// Emulate texturecube_array with texture2d_array for iOS where this type is not available\n\t\tbool emulate_cube_array = false;\n\n\t\t// Allow user to enable decoration binding\n\t\tbool enable_decoration_binding = false;\n\n\t\t// Requires MSL 2.1, use the native support for texel buffers.\n\t\tbool texture_buffer_native = false;\n\n\t\t// Forces all resources which are part of an argument buffer to be considered active.\n\t\t// This ensures ABI compatibility between shaders where some resources might be unused,\n\t\t// and would otherwise declare a different IAB.\n\t\tbool force_active_argument_buffer_resources = false;\n\n\t\t// Aligns each resource in an argument buffer to its assigned index value, id(N),\n\t\t// by adding synthetic padding members in the argument buffer struct for any resources\n\t\t// in the argument buffer that are not defined and used by the shader. This allows\n\t\t// the shader to index into the correct argument in a descriptor set argument buffer\n\t\t// that is shared across shaders, where not all resources in the argument buffer are\n\t\t// defined in each shader. For this to work, an MSLResourceBinding must be provided for\n\t\t// all descriptors in any descriptor set held in an argument buffer in the shader, and\n\t\t// that MSLResourceBinding must have the basetype and count members populated correctly.\n\t\t// The implementation here assumes any inline blocks in the argument buffer is provided\n\t\t// in a Metal buffer, and doesn't take into consideration inline blocks that are\n\t\t// optionally embedded directly into the argument buffer via add_inline_uniform_block().\n\t\tbool pad_argument_buffer_resources = false;\n\n\t\t// Forces the use of plain arrays, which works around certain driver bugs on certain versions\n\t\t// of Intel Macbooks. See https://github.com/KhronosGroup/SPIRV-Cross/issues/1210.\n\t\t// May reduce performance in scenarios where arrays are copied around as value-types.\n\t\tbool force_native_arrays = false;\n\n\t\t// If a shader writes clip distance, also emit user varyings which\n\t\t// can be read in subsequent stages.\n\t\tbool enable_clip_distance_user_varying = true;\n\n\t\t// In a tessellation control shader, assume that more than one patch can be processed in a\n\t\t// single workgroup. This requires changes to the way the InvocationId and PrimitiveId\n\t\t// builtins are processed, but should result in more efficient usage of the GPU.\n\t\tbool multi_patch_workgroup = false;\n\n\t\t// Use storage buffers instead of vertex-style attributes for tessellation evaluation\n\t\t// input. This may require conversion of inputs in the generated post-tessellation\n\t\t// vertex shader, but allows the use of nested arrays.\n\t\tbool raw_buffer_tese_input = false;\n\n\t\t// If set, a vertex shader will be compiled as part of a tessellation pipeline.\n\t\t// It will be translated as a compute kernel, so it can use the global invocation ID\n\t\t// to index the output buffer.\n\t\tbool vertex_for_tessellation = false;\n\n\t\t// Assume that SubpassData images have multiple layers. Layered input attachments\n\t\t// are addressed relative to the Layer output from the vertex pipeline. This option\n\t\t// has no effect with multiview, since all input attachments are assumed to be layered\n\t\t// and will be addressed using the current ViewIndex.\n\t\tbool arrayed_subpass_input = false;\n\n\t\t// Whether to use SIMD-group or quadgroup functions to implement group non-uniform\n\t\t// operations. Some GPUs on iOS do not support the SIMD-group functions, only the\n\t\t// quadgroup functions.\n\t\tbool ios_use_simdgroup_functions = false;\n\n\t\t// If set, the subgroup size will be assumed to be one, and subgroup-related\n\t\t// builtins and operations will be emitted accordingly. This mode is intended to\n\t\t// be used by MoltenVK on hardware/software configurations which do not provide\n\t\t// sufficient support for subgroups.\n\t\tbool emulate_subgroups = false;\n\n\t\t// If nonzero, a fixed subgroup size to assume. Metal, similarly to VK_EXT_subgroup_size_control,\n\t\t// allows the SIMD-group size (aka thread execution width) to vary depending on\n\t\t// register usage and requirements. In certain circumstances--for example, a pipeline\n\t\t// in MoltenVK without VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT--\n\t\t// this is undesirable. This fixes the value of the SubgroupSize builtin, instead of\n\t\t// mapping it to the Metal builtin [[thread_execution_width]]. If the thread\n\t\t// execution width is reduced, the extra invocations will appear to be inactive.\n\t\t// If zero, the SubgroupSize will be allowed to vary, and the builtin will be mapped\n\t\t// to the Metal [[thread_execution_width]] builtin.\n\t\tuint32_t fixed_subgroup_size = 0;\n\n\t\tenum class IndexType\n\t\t{\n\t\t\tNone = 0,\n\t\t\tUInt16 = 1,\n\t\t\tUInt32 = 2\n\t\t};\n\n\t\t// The type of index in the index buffer, if present. For a compute shader, Metal\n\t\t// requires specifying the indexing at pipeline creation, rather than at draw time\n\t\t// as with graphics pipelines. This means we must create three different pipelines,\n\t\t// for no indexing, 16-bit indices, and 32-bit indices. Each requires different\n\t\t// handling for the gl_VertexIndex builtin. We may as well, then, create three\n\t\t// different shaders for these three scenarios.\n\t\tIndexType vertex_index_type = IndexType::None;\n\n\t\t// If set, a dummy [[sample_id]] input is added to a fragment shader if none is present.\n\t\t// This will force the shader to run at sample rate, assuming Metal does not optimize\n\t\t// the extra threads away.\n\t\tbool force_sample_rate_shading = false;\n\n\t\t// If set, gl_HelperInvocation will be set manually whenever a fragment is discarded.\n\t\t// Some Metal devices have a bug where simd_is_helper_thread() does not return true\n\t\t// after a fragment has been discarded. This is a workaround that is only expected to be needed\n\t\t// until the bug is fixed in Metal; it is provided as an option to allow disabling it when that occurs.\n\t\tbool manual_helper_invocation_updates = true;\n\n\t\t// If set, extra checks will be emitted in fragment shaders to prevent writes\n\t\t// from discarded fragments. Some Metal devices have a bug where writes to storage resources\n\t\t// from discarded fragment threads continue to occur, despite the fragment being\n\t\t// discarded. This is a workaround that is only expected to be needed until the\n\t\t// bug is fixed in Metal; it is provided as an option so it can be enabled\n\t\t// only when the bug is present.\n\t\tbool check_discarded_frag_stores = false;\n\n\t\t// If set, Lod operands to OpImageSample*DrefExplicitLod for 1D and 2D array images\n\t\t// will be implemented using a gradient instead of passing the level operand directly.\n\t\t// Some Metal devices have a bug where the level() argument to depth2d_array<T>::sample_compare()\n\t\t// in a fragment shader is biased by some unknown amount, possibly dependent on the\n\t\t// partial derivatives of the texture coordinates. This is a workaround that is only\n\t\t// expected to be needed until the bug is fixed in Metal; it is provided as an option\n\t\t// so it can be enabled only when the bug is present.\n\t\tbool sample_dref_lod_array_as_grad = false;\n\n\t\t// MSL doesn't guarantee coherence between writes and subsequent reads of read_write textures.\n\t\t// This inserts fences before each read of a read_write texture to ensure coherency.\n\t\t// If you're sure you never rely on this, you can set this to false for a possible performance improvement.\n\t\t// Note: Only Apple's GPU compiler takes advantage of the lack of coherency, so make sure to test on Apple GPUs if you disable this.\n\t\tbool readwrite_texture_fences = true;\n\n\t\t// Metal 3.1 introduced a Metal regression bug which causes infinite recursion during \n\t\t// Metal's analysis of an entry point input structure that is itself recursive. Enabling\n\t\t// this option will replace the recursive input declaration with a alternate variable of\n\t\t// type void*, and then cast to the correct type at the top of the entry point function.\n\t\t// The bug has been reported to Apple, and will hopefully be fixed in future releases.\n\t\tbool replace_recursive_inputs = false;\n\n\t\t// If set, manual fixups of gradient vectors for cube texture lookups will be performed.\n\t\t// All released Apple Silicon GPUs to date behave incorrectly when sampling a cube texture\n\t\t// with explicit gradients. They will ignore one of the three partial derivatives based\n\t\t// on the selected major axis, and expect the remaining derivatives to be partially\n\t\t// transformed.\n\t\tbool agx_manual_cube_grad_fixup = false;\n\n\t\tbool is_ios() const\n\t\t{\n\t\t\treturn platform == iOS;\n\t\t}\n\n\t\tbool is_macos() const\n\t\t{\n\t\t\treturn platform == macOS;\n\t\t}\n\n\t\tbool use_quadgroup_operation() const\n\t\t{\n\t\t\treturn is_ios() && !ios_use_simdgroup_functions;\n\t\t}\n\n\t\tvoid set_msl_version(uint32_t major, uint32_t minor = 0, uint32_t patch = 0)\n\t\t{\n\t\t\tmsl_version = make_msl_version(major, minor, patch);\n\t\t}\n\n\t\tbool supports_msl_version(uint32_t major, uint32_t minor = 0, uint32_t patch = 0) const\n\t\t{\n\t\t\treturn msl_version >= make_msl_version(major, minor, patch);\n\t\t}\n\n\t\tstatic uint32_t make_msl_version(uint32_t major, uint32_t minor = 0, uint32_t patch = 0)\n\t\t{\n\t\t\treturn (major * 10000) + (minor * 100) + patch;\n\t\t}\n\t};\n\n\tconst Options &get_msl_options() const\n\t{\n\t\treturn msl_options;\n\t}\n\n\tvoid set_msl_options(const Options &opts)\n\t{\n\t\tmsl_options = opts;\n\t}\n\n\t// Provide feedback to calling API to allow runtime to disable pipeline\n\t// rasterization if vertex shader requires rasterization to be disabled.\n\tbool get_is_rasterization_disabled() const\n\t{\n\t\treturn is_rasterization_disabled && (get_entry_point().model == spv::ExecutionModelVertex ||\n\t\t                                     get_entry_point().model == spv::ExecutionModelTessellationControl ||\n\t\t                                     get_entry_point().model == spv::ExecutionModelTessellationEvaluation);\n\t}\n\n\t// Provide feedback to calling API to allow it to pass an auxiliary\n\t// swizzle buffer if the shader needs it.\n\tbool needs_swizzle_buffer() const\n\t{\n\t\treturn used_swizzle_buffer;\n\t}\n\n\t// Provide feedback to calling API to allow it to pass a buffer\n\t// containing STORAGE_BUFFER buffer sizes to support OpArrayLength.\n\tbool needs_buffer_size_buffer() const\n\t{\n\t\treturn !buffers_requiring_array_length.empty();\n\t}\n\n\tbool buffer_requires_array_length(VariableID id) const\n\t{\n\t\treturn buffers_requiring_array_length.count(id) != 0;\n\t}\n\n\t// Provide feedback to calling API to allow it to pass a buffer\n\t// containing the view mask for the current multiview subpass.\n\tbool needs_view_mask_buffer() const\n\t{\n\t\treturn msl_options.multiview && !msl_options.view_index_from_device_index;\n\t}\n\n\t// Provide feedback to calling API to allow it to pass a buffer\n\t// containing the dispatch base workgroup ID.\n\tbool needs_dispatch_base_buffer() const\n\t{\n\t\treturn msl_options.dispatch_base && !msl_options.supports_msl_version(1, 2);\n\t}\n\n\t// Provide feedback to calling API to allow it to pass an output\n\t// buffer if the shader needs it.\n\tbool needs_output_buffer() const\n\t{\n\t\treturn capture_output_to_buffer && stage_out_var_id != ID(0);\n\t}\n\n\t// Provide feedback to calling API to allow it to pass a patch output\n\t// buffer if the shader needs it.\n\tbool needs_patch_output_buffer() const\n\t{\n\t\treturn capture_output_to_buffer && patch_stage_out_var_id != ID(0);\n\t}\n\n\t// Provide feedback to calling API to allow it to pass an input threadgroup\n\t// buffer if the shader needs it.\n\tbool needs_input_threadgroup_mem() const\n\t{\n\t\treturn capture_output_to_buffer && stage_in_var_id != ID(0);\n\t}\n\n\texplicit CompilerMSL(std::vector<uint32_t> spirv);\n\tCompilerMSL(const uint32_t *ir, size_t word_count);\n\texplicit CompilerMSL(const ParsedIR &ir);\n\texplicit CompilerMSL(ParsedIR &&ir);\n\n\t// input is a shader interface variable description used to fix up shader input variables.\n\t// If shader inputs are provided, is_msl_shader_input_used() will return true after\n\t// calling ::compile() if the location were used by the MSL code.\n\tvoid add_msl_shader_input(const MSLShaderInterfaceVariable &input);\n\n\t// output is a shader interface variable description used to fix up shader output variables.\n\t// If shader outputs are provided, is_msl_shader_output_used() will return true after\n\t// calling ::compile() if the location were used by the MSL code.\n\tvoid add_msl_shader_output(const MSLShaderInterfaceVariable &output);\n\n\t// resource is a resource binding to indicate the MSL buffer,\n\t// texture or sampler index to use for a particular SPIR-V description set\n\t// and binding. If resource bindings are provided,\n\t// is_msl_resource_binding_used() will return true after calling ::compile() if\n\t// the set/binding combination was used by the MSL code.\n\tvoid add_msl_resource_binding(const MSLResourceBinding &resource);\n\n\t// desc_set and binding are the SPIR-V descriptor set and binding of a buffer resource\n\t// in this shader. index is the index within the dynamic offset buffer to use. This\n\t// function marks that resource as using a dynamic offset (VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC\n\t// or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC). This function only has any effect if argument buffers\n\t// are enabled. If so, the buffer will have its address adjusted at the beginning of the shader with\n\t// an offset taken from the dynamic offset buffer.\n\tvoid add_dynamic_buffer(uint32_t desc_set, uint32_t binding, uint32_t index);\n\n\t// desc_set and binding are the SPIR-V descriptor set and binding of a buffer resource\n\t// in this shader. This function marks that resource as an inline uniform block\n\t// (VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT). This function only has any effect if argument buffers\n\t// are enabled. If so, the buffer block will be directly embedded into the argument\n\t// buffer, instead of being referenced indirectly via pointer.\n\tvoid add_inline_uniform_block(uint32_t desc_set, uint32_t binding);\n\n\t// When using MSL argument buffers, we can force \"classic\" MSL 1.0 binding schemes for certain descriptor sets.\n\t// This corresponds to VK_KHR_push_descriptor in Vulkan.\n\tvoid add_discrete_descriptor_set(uint32_t desc_set);\n\n\t// If an argument buffer is large enough, it may need to be in the device storage space rather than\n\t// constant. Opt-in to this behavior here on a per set basis.\n\tvoid set_argument_buffer_device_address_space(uint32_t desc_set, bool device_storage);\n\n\t// Query after compilation is done. This allows you to check if an input location was used by the shader.\n\tbool is_msl_shader_input_used(uint32_t location);\n\n\t// Query after compilation is done. This allows you to check if an output location were used by the shader.\n\tbool is_msl_shader_output_used(uint32_t location);\n\n\t// If not using add_msl_shader_input, it's possible\n\t// that certain builtin attributes need to be automatically assigned locations.\n\t// This is typical for tessellation builtin inputs such as tess levels, gl_Position, etc.\n\t// This returns k_unknown_location if the location was explicitly assigned with\n\t// add_msl_shader_input or the builtin is not used, otherwise returns N in [[attribute(N)]].\n\tuint32_t get_automatic_builtin_input_location(spv::BuiltIn builtin) const;\n\n\t// If not using add_msl_shader_output, it's possible\n\t// that certain builtin attributes need to be automatically assigned locations.\n\t// This is typical for tessellation builtin outputs such as tess levels, gl_Position, etc.\n\t// This returns k_unknown_location if the location were explicitly assigned with\n\t// add_msl_shader_output or the builtin were not used, otherwise returns N in [[attribute(N)]].\n\tuint32_t get_automatic_builtin_output_location(spv::BuiltIn builtin) const;\n\n\t// NOTE: Only resources which are remapped using add_msl_resource_binding will be reported here.\n\t// Constexpr samplers are always assumed to be emitted.\n\t// No specific MSLResourceBinding remapping is required for constexpr samplers as long as they are remapped\n\t// by remap_constexpr_sampler(_by_binding).\n\tbool is_msl_resource_binding_used(spv::ExecutionModel model, uint32_t set, uint32_t binding) const;\n\n\t// This must only be called after a successful call to CompilerMSL::compile().\n\t// For a variable resource ID obtained through reflection API, report the automatically assigned resource index.\n\t// If the descriptor set was part of an argument buffer, report the [[id(N)]],\n\t// or [[buffer/texture/sampler]] binding for other resources.\n\t// If the resource was a combined image sampler, report the image binding here,\n\t// use the _secondary version of this call to query the sampler half of the resource.\n\t// If no binding exists, uint32_t(-1) is returned.\n\tuint32_t get_automatic_msl_resource_binding(uint32_t id) const;\n\n\t// Same as get_automatic_msl_resource_binding, but should only be used for combined image samplers, in which case the\n\t// sampler's binding is returned instead. For any other resource type, -1 is returned.\n\t// Secondary bindings are also used for the auxillary image atomic buffer.\n\tuint32_t get_automatic_msl_resource_binding_secondary(uint32_t id) const;\n\n\t// Same as get_automatic_msl_resource_binding, but should only be used for combined image samplers for multiplanar images,\n\t// in which case the second plane's binding is returned instead. For any other resource type, -1 is returned.\n\tuint32_t get_automatic_msl_resource_binding_tertiary(uint32_t id) const;\n\n\t// Same as get_automatic_msl_resource_binding, but should only be used for combined image samplers for triplanar images,\n\t// in which case the third plane's binding is returned instead. For any other resource type, -1 is returned.\n\tuint32_t get_automatic_msl_resource_binding_quaternary(uint32_t id) const;\n\n\t// Compiles the SPIR-V code into Metal Shading Language.\n\tstd::string compile() override;\n\n\t// Remap a sampler with ID to a constexpr sampler.\n\t// Older iOS targets must use constexpr samplers in certain cases (PCF),\n\t// so a static sampler must be used.\n\t// The sampler will not consume a binding, but be declared in the entry point as a constexpr sampler.\n\t// This can be used on both combined image/samplers (sampler2D) or standalone samplers.\n\t// The remapped sampler must not be an array of samplers.\n\t// Prefer remap_constexpr_sampler_by_binding unless you're also doing reflection anyways.\n\tvoid remap_constexpr_sampler(VariableID id, const MSLConstexprSampler &sampler);\n\n\t// Same as remap_constexpr_sampler, except you provide set/binding, rather than variable ID.\n\t// Remaps based on ID take priority over set/binding remaps.\n\tvoid remap_constexpr_sampler_by_binding(uint32_t desc_set, uint32_t binding, const MSLConstexprSampler &sampler);\n\n\t// If using CompilerMSL::Options::pad_fragment_output_components, override the number of components we expect\n\t// to use for a particular location. The default is 4 if number of components is not overridden.\n\tvoid set_fragment_output_components(uint32_t location, uint32_t components);\n\n\tvoid set_combined_sampler_suffix(const char *suffix);\n\tconst char *get_combined_sampler_suffix() const;\n\nprotected:\n\t// An enum of SPIR-V functions that are implemented in additional\n\t// source code that is added to the shader if necessary.\n\tenum SPVFuncImpl : uint8_t\n\t{\n\t\tSPVFuncImplNone,\n\t\tSPVFuncImplMod,\n\t\tSPVFuncImplRadians,\n\t\tSPVFuncImplDegrees,\n\t\tSPVFuncImplFindILsb,\n\t\tSPVFuncImplFindSMsb,\n\t\tSPVFuncImplFindUMsb,\n\t\tSPVFuncImplSSign,\n\t\tSPVFuncImplArrayCopyMultidimBase,\n\t\t// Unfortunately, we cannot use recursive templates in the MSL compiler properly,\n\t\t// so stamp out variants up to some arbitrary maximum.\n\t\tSPVFuncImplArrayCopy = SPVFuncImplArrayCopyMultidimBase + 1,\n\t\tSPVFuncImplArrayOfArrayCopy2Dim = SPVFuncImplArrayCopyMultidimBase + 2,\n\t\tSPVFuncImplArrayOfArrayCopy3Dim = SPVFuncImplArrayCopyMultidimBase + 3,\n\t\tSPVFuncImplArrayOfArrayCopy4Dim = SPVFuncImplArrayCopyMultidimBase + 4,\n\t\tSPVFuncImplArrayOfArrayCopy5Dim = SPVFuncImplArrayCopyMultidimBase + 5,\n\t\tSPVFuncImplArrayOfArrayCopy6Dim = SPVFuncImplArrayCopyMultidimBase + 6,\n\t\tSPVFuncImplTexelBufferCoords,\n\t\tSPVFuncImplImage2DAtomicCoords, // Emulate texture2D atomic operations\n\t\tSPVFuncImplGradientCube,\n\t\tSPVFuncImplFMul,\n\t\tSPVFuncImplFAdd,\n\t\tSPVFuncImplFSub,\n\t\tSPVFuncImplQuantizeToF16,\n\t\tSPVFuncImplCubemapTo2DArrayFace,\n\t\tSPVFuncImplUnsafeArray, // Allow Metal to use the array<T> template to make arrays a value type\n\t\tSPVFuncImplStorageMatrix, // Allow threadgroup construction of matrices\n\t\tSPVFuncImplInverse4x4,\n\t\tSPVFuncImplInverse3x3,\n\t\tSPVFuncImplInverse2x2,\n\t\t// It is very important that this come before *Swizzle and ChromaReconstruct*, to ensure it's\n\t\t// emitted before them.\n\t\tSPVFuncImplForwardArgs,\n\t\t// Likewise, this must come before *Swizzle.\n\t\tSPVFuncImplGetSwizzle,\n\t\tSPVFuncImplTextureSwizzle,\n\t\tSPVFuncImplGatherSwizzle,\n\t\tSPVFuncImplGatherCompareSwizzle,\n\t\tSPVFuncImplSubgroupBroadcast,\n\t\tSPVFuncImplSubgroupBroadcastFirst,\n\t\tSPVFuncImplSubgroupBallot,\n\t\tSPVFuncImplSubgroupBallotBitExtract,\n\t\tSPVFuncImplSubgroupBallotFindLSB,\n\t\tSPVFuncImplSubgroupBallotFindMSB,\n\t\tSPVFuncImplSubgroupBallotBitCount,\n\t\tSPVFuncImplSubgroupAllEqual,\n\t\tSPVFuncImplSubgroupShuffle,\n\t\tSPVFuncImplSubgroupShuffleXor,\n\t\tSPVFuncImplSubgroupShuffleUp,\n\t\tSPVFuncImplSubgroupShuffleDown,\n\t\tSPVFuncImplQuadBroadcast,\n\t\tSPVFuncImplQuadSwap,\n\t\tSPVFuncImplReflectScalar,\n\t\tSPVFuncImplRefractScalar,\n\t\tSPVFuncImplFaceForwardScalar,\n\t\tSPVFuncImplChromaReconstructNearest2Plane,\n\t\tSPVFuncImplChromaReconstructNearest3Plane,\n\t\tSPVFuncImplChromaReconstructLinear422CositedEven2Plane,\n\t\tSPVFuncImplChromaReconstructLinear422CositedEven3Plane,\n\t\tSPVFuncImplChromaReconstructLinear422Midpoint2Plane,\n\t\tSPVFuncImplChromaReconstructLinear422Midpoint3Plane,\n\t\tSPVFuncImplChromaReconstructLinear420XCositedEvenYCositedEven2Plane,\n\t\tSPVFuncImplChromaReconstructLinear420XCositedEvenYCositedEven3Plane,\n\t\tSPVFuncImplChromaReconstructLinear420XMidpointYCositedEven2Plane,\n\t\tSPVFuncImplChromaReconstructLinear420XMidpointYCositedEven3Plane,\n\t\tSPVFuncImplChromaReconstructLinear420XCositedEvenYMidpoint2Plane,\n\t\tSPVFuncImplChromaReconstructLinear420XCositedEvenYMidpoint3Plane,\n\t\tSPVFuncImplChromaReconstructLinear420XMidpointYMidpoint2Plane,\n\t\tSPVFuncImplChromaReconstructLinear420XMidpointYMidpoint3Plane,\n\t\tSPVFuncImplExpandITUFullRange,\n\t\tSPVFuncImplExpandITUNarrowRange,\n\t\tSPVFuncImplConvertYCbCrBT709,\n\t\tSPVFuncImplConvertYCbCrBT601,\n\t\tSPVFuncImplConvertYCbCrBT2020,\n\t\tSPVFuncImplDynamicImageSampler,\n\t\tSPVFuncImplRayQueryIntersectionParams,\n\t\tSPVFuncImplVariableDescriptor,\n\t\tSPVFuncImplVariableSizedDescriptor,\n\t\tSPVFuncImplVariableDescriptorArray,\n\t\tSPVFuncImplPaddedStd140\n\t};\n\n\t// If the underlying resource has been used for comparison then duplicate loads of that resource must be too\n\t// Use Metal's native frame-buffer fetch API for subpass inputs.\n\tvoid emit_texture_op(const Instruction &i, bool sparse) override;\n\tvoid emit_binary_ptr_op(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1, const char *op);\n\tstd::string to_ptr_expression(uint32_t id, bool register_expression_read = true);\n\tvoid emit_binary_unord_op(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1, const char *op);\n\tvoid emit_instruction(const Instruction &instr) override;\n\tvoid emit_glsl_op(uint32_t result_type, uint32_t result_id, uint32_t op, const uint32_t *args,\n\t                  uint32_t count) override;\n\tvoid emit_spv_amd_shader_trinary_minmax_op(uint32_t result_type, uint32_t result_id, uint32_t op,\n\t                                           const uint32_t *args, uint32_t count) override;\n\tvoid emit_header() override;\n\tvoid emit_function_prototype(SPIRFunction &func, const Bitset &return_flags) override;\n\tvoid emit_sampled_image_op(uint32_t result_type, uint32_t result_id, uint32_t image_id, uint32_t samp_id) override;\n\tvoid emit_subgroup_op(const Instruction &i) override;\n\tstd::string to_texture_op(const Instruction &i, bool sparse, bool *forward,\n\t                          SmallVector<uint32_t> &inherited_expressions) override;\n\tvoid emit_fixup() override;\n\tstd::string to_struct_member(const SPIRType &type, uint32_t member_type_id, uint32_t index,\n\t                             const std::string &qualifier = \"\");\n\tvoid emit_struct_member(const SPIRType &type, uint32_t member_type_id, uint32_t index,\n\t                        const std::string &qualifier = \"\", uint32_t base_offset = 0) override;\n\tvoid emit_struct_padding_target(const SPIRType &type) override;\n\tstd::string type_to_glsl(const SPIRType &type, uint32_t id, bool member);\n\tstd::string type_to_glsl(const SPIRType &type, uint32_t id = 0) override;\n\tvoid emit_block_hints(const SPIRBlock &block) override;\n\n\t// Allow Metal to use the array<T> template to make arrays a value type\n\tstd::string type_to_array_glsl(const SPIRType &type) override;\n\tstd::string constant_op_expression(const SPIRConstantOp &cop) override;\n\n\tbool variable_decl_is_remapped_storage(const SPIRVariable &variable, spv::StorageClass storage) const override;\n\n\t// GCC workaround of lambdas calling protected functions (for older GCC versions)\n\tstd::string variable_decl(const SPIRType &type, const std::string &name, uint32_t id = 0) override;\n\n\tstd::string image_type_glsl(const SPIRType &type, uint32_t id = 0) override;\n\tstd::string sampler_type(const SPIRType &type, uint32_t id);\n\tstd::string builtin_to_glsl(spv::BuiltIn builtin, spv::StorageClass storage) override;\n\tstd::string to_func_call_arg(const SPIRFunction::Parameter &arg, uint32_t id) override;\n\tstd::string to_name(uint32_t id, bool allow_alias = true) const override;\n\tstd::string to_function_name(const TextureFunctionNameArguments &args) override;\n\tstd::string to_function_args(const TextureFunctionArguments &args, bool *p_forward) override;\n\tstd::string to_initializer_expression(const SPIRVariable &var) override;\n\tstd::string to_zero_initialized_expression(uint32_t type_id) override;\n\n\tstd::string unpack_expression_type(std::string expr_str, const SPIRType &type, uint32_t physical_type_id,\n\t                                   bool is_packed, bool row_major) override;\n\n\t// Returns true for BuiltInSampleMask because gl_SampleMask[] is an array in SPIR-V, but [[sample_mask]] is a scalar in Metal.\n\tbool builtin_translates_to_nonarray(spv::BuiltIn builtin) const override;\n\n\tstd::string bitcast_glsl_op(const SPIRType &result_type, const SPIRType &argument_type) override;\n\tbool emit_complex_bitcast(uint32_t result_id, uint32_t id, uint32_t op0) override;\n\tbool skip_argument(uint32_t id) const override;\n\tstd::string to_member_reference(uint32_t base, const SPIRType &type, uint32_t index, bool ptr_chain_is_resolved) override;\n\tstd::string to_qualifiers_glsl(uint32_t id) override;\n\tvoid replace_illegal_names() override;\n\tvoid declare_constant_arrays();\n\n\tvoid replace_illegal_entry_point_names();\n\tvoid sync_entry_point_aliases_and_names();\n\n\tstatic const std::unordered_set<std::string> &get_reserved_keyword_set();\n\tstatic const std::unordered_set<std::string> &get_illegal_func_names();\n\n\t// Constant arrays of non-primitive types (i.e. matrices) won't link properly into Metal libraries\n\tvoid declare_complex_constant_arrays();\n\n\tbool is_patch_block(const SPIRType &type);\n\tbool is_non_native_row_major_matrix(uint32_t id) override;\n\tbool member_is_non_native_row_major_matrix(const SPIRType &type, uint32_t index) override;\n\tstd::string convert_row_major_matrix(std::string exp_str, const SPIRType &exp_type, uint32_t physical_type_id,\n\t                                     bool is_packed, bool relaxed) override;\n\n\tbool is_tesc_shader() const;\n\tbool is_tese_shader() const;\n\n\tvoid preprocess_op_codes();\n\tvoid localize_global_variables();\n\tvoid extract_global_variables_from_functions();\n\tvoid mark_packable_structs();\n\tvoid mark_as_packable(SPIRType &type);\n\tvoid mark_as_workgroup_struct(SPIRType &type);\n\n\tstd::unordered_map<uint32_t, std::set<uint32_t>> function_global_vars;\n\tvoid extract_global_variables_from_function(uint32_t func_id, std::set<uint32_t> &added_arg_ids,\n\t                                            std::unordered_set<uint32_t> &global_var_ids,\n\t                                            std::unordered_set<uint32_t> &processed_func_ids);\n\tuint32_t add_interface_block(spv::StorageClass storage, bool patch = false);\n\tuint32_t add_interface_block_pointer(uint32_t ib_var_id, spv::StorageClass storage);\n\n\tstruct InterfaceBlockMeta\n\t{\n\t\tstruct LocationMeta\n\t\t{\n\t\t\tuint32_t base_type_id = 0;\n\t\t\tuint32_t num_components = 0;\n\t\t\tbool flat = false;\n\t\t\tbool noperspective = false;\n\t\t\tbool centroid = false;\n\t\t\tbool sample = false;\n\t\t};\n\t\tstd::unordered_map<uint32_t, LocationMeta> location_meta;\n\t\tbool strip_array = false;\n\t\tbool allow_local_declaration = false;\n\t};\n\n\tstd::string to_tesc_invocation_id();\n\tvoid emit_local_masked_variable(const SPIRVariable &masked_var, bool strip_array);\n\tvoid add_variable_to_interface_block(spv::StorageClass storage, const std::string &ib_var_ref, SPIRType &ib_type,\n\t                                     SPIRVariable &var, InterfaceBlockMeta &meta);\n\tvoid add_composite_variable_to_interface_block(spv::StorageClass storage, const std::string &ib_var_ref,\n\t                                               SPIRType &ib_type, SPIRVariable &var, InterfaceBlockMeta &meta);\n\tvoid add_plain_variable_to_interface_block(spv::StorageClass storage, const std::string &ib_var_ref,\n\t                                           SPIRType &ib_type, SPIRVariable &var, InterfaceBlockMeta &meta);\n\tbool add_component_variable_to_interface_block(spv::StorageClass storage, const std::string &ib_var_ref,\n\t                                               SPIRVariable &var, const SPIRType &type,\n\t                                               InterfaceBlockMeta &meta);\n\tvoid add_plain_member_variable_to_interface_block(spv::StorageClass storage,\n\t                                                  const std::string &ib_var_ref, SPIRType &ib_type,\n\t                                                  SPIRVariable &var, SPIRType &var_type,\n\t                                                  uint32_t mbr_idx, InterfaceBlockMeta &meta,\n\t                                                  const std::string &mbr_name_qual,\n\t                                                  const std::string &var_chain_qual,\n\t                                                  uint32_t &location, uint32_t &var_mbr_idx);\n\tvoid add_composite_member_variable_to_interface_block(spv::StorageClass storage,\n\t                                                      const std::string &ib_var_ref, SPIRType &ib_type,\n\t                                                      SPIRVariable &var, SPIRType &var_type,\n\t                                                      uint32_t mbr_idx, InterfaceBlockMeta &meta,\n\t                                                      const std::string &mbr_name_qual,\n\t                                                      const std::string &var_chain_qual,\n\t                                                      uint32_t &location, uint32_t &var_mbr_idx);\n\tvoid add_tess_level_input_to_interface_block(const std::string &ib_var_ref, SPIRType &ib_type, SPIRVariable &var);\n\tvoid add_tess_level_input(const std::string &base_ref, const std::string &mbr_name, SPIRVariable &var);\n\n\tvoid fix_up_interface_member_indices(spv::StorageClass storage, uint32_t ib_type_id);\n\n\tvoid mark_location_as_used_by_shader(uint32_t location, const SPIRType &type,\n\t                                     spv::StorageClass storage, bool fallback = false);\n\tuint32_t ensure_correct_builtin_type(uint32_t type_id, spv::BuiltIn builtin);\n\tuint32_t ensure_correct_input_type(uint32_t type_id, uint32_t location, uint32_t component,\n\t                                   uint32_t num_components, bool strip_array);\n\n\tvoid emit_custom_templates();\n\tvoid emit_custom_functions();\n\tvoid emit_resources();\n\tvoid emit_specialization_constants_and_structs();\n\tvoid emit_interface_block(uint32_t ib_var_id);\n\tbool maybe_emit_array_assignment(uint32_t id_lhs, uint32_t id_rhs);\n\tbool is_var_runtime_size_array(const SPIRVariable &var) const;\n\tuint32_t get_resource_array_size(const SPIRType &type, uint32_t id) const;\n\n\tvoid fix_up_shader_inputs_outputs();\n\n\tstd::string func_type_decl(SPIRType &type);\n\tstd::string entry_point_args_classic(bool append_comma);\n\tstd::string entry_point_args_argument_buffer(bool append_comma);\n\tstd::string entry_point_arg_stage_in();\n\tvoid entry_point_args_builtin(std::string &args);\n\tvoid entry_point_args_discrete_descriptors(std::string &args);\n\tstd::string append_member_name(const std::string &qualifier, const SPIRType &type, uint32_t index);\n\tstd::string ensure_valid_name(std::string name, std::string pfx);\n\tstd::string to_sampler_expression(uint32_t id);\n\tstd::string to_swizzle_expression(uint32_t id);\n\tstd::string to_buffer_size_expression(uint32_t id);\n\tbool is_sample_rate() const;\n\tbool is_intersection_query() const;\n\tbool is_direct_input_builtin(spv::BuiltIn builtin);\n\tstd::string builtin_qualifier(spv::BuiltIn builtin);\n\tstd::string builtin_type_decl(spv::BuiltIn builtin, uint32_t id = 0);\n\tstd::string built_in_func_arg(spv::BuiltIn builtin, bool prefix_comma);\n\tstd::string member_attribute_qualifier(const SPIRType &type, uint32_t index);\n\tstd::string member_location_attribute_qualifier(const SPIRType &type, uint32_t index);\n\tstd::string argument_decl(const SPIRFunction::Parameter &arg);\n\tconst char *descriptor_address_space(uint32_t id, spv::StorageClass storage, const char *plain_address_space) const;\n\tstd::string round_fp_tex_coords(std::string tex_coords, bool coord_is_fp);\n\tuint32_t get_metal_resource_index(SPIRVariable &var, SPIRType::BaseType basetype, uint32_t plane = 0);\n\tuint32_t get_member_location(uint32_t type_id, uint32_t index, uint32_t *comp = nullptr) const;\n\tuint32_t get_or_allocate_builtin_input_member_location(spv::BuiltIn builtin,\n\t                                                       uint32_t type_id, uint32_t index, uint32_t *comp = nullptr);\n\tuint32_t get_or_allocate_builtin_output_member_location(spv::BuiltIn builtin,\n\t                                                        uint32_t type_id, uint32_t index, uint32_t *comp = nullptr);\n\n\tuint32_t get_physical_tess_level_array_size(spv::BuiltIn builtin) const;\n\n\t// MSL packing rules. These compute the effective packing rules as observed by the MSL compiler in the MSL output.\n\t// These values can change depending on various extended decorations which control packing rules.\n\t// We need to make these rules match up with SPIR-V declared rules.\n\tuint32_t get_declared_type_size_msl(const SPIRType &type, bool packed, bool row_major) const;\n\tuint32_t get_declared_type_array_stride_msl(const SPIRType &type, bool packed, bool row_major) const;\n\tuint32_t get_declared_type_matrix_stride_msl(const SPIRType &type, bool packed, bool row_major) const;\n\tuint32_t get_declared_type_alignment_msl(const SPIRType &type, bool packed, bool row_major) const;\n\n\tuint32_t get_declared_struct_member_size_msl(const SPIRType &struct_type, uint32_t index) const;\n\tuint32_t get_declared_struct_member_array_stride_msl(const SPIRType &struct_type, uint32_t index) const;\n\tuint32_t get_declared_struct_member_matrix_stride_msl(const SPIRType &struct_type, uint32_t index) const;\n\tuint32_t get_declared_struct_member_alignment_msl(const SPIRType &struct_type, uint32_t index) const;\n\n\tuint32_t get_declared_input_size_msl(const SPIRType &struct_type, uint32_t index) const;\n\tuint32_t get_declared_input_array_stride_msl(const SPIRType &struct_type, uint32_t index) const;\n\tuint32_t get_declared_input_matrix_stride_msl(const SPIRType &struct_type, uint32_t index) const;\n\tuint32_t get_declared_input_alignment_msl(const SPIRType &struct_type, uint32_t index) const;\n\n\tconst SPIRType &get_physical_member_type(const SPIRType &struct_type, uint32_t index) const;\n\tSPIRType get_presumed_input_type(const SPIRType &struct_type, uint32_t index) const;\n\n\tuint32_t get_declared_struct_size_msl(const SPIRType &struct_type, bool ignore_alignment = false,\n\t                                      bool ignore_padding = false) const;\n\n\tstd::string to_component_argument(uint32_t id);\n\tvoid align_struct(SPIRType &ib_type, std::unordered_set<uint32_t> &aligned_structs);\n\tvoid mark_scalar_layout_structs(const SPIRType &ib_type);\n\tvoid mark_struct_members_packed(const SPIRType &type);\n\tvoid ensure_member_packing_rules_msl(SPIRType &ib_type, uint32_t index);\n\tbool validate_member_packing_rules_msl(const SPIRType &type, uint32_t index) const;\n\tstd::string get_argument_address_space(const SPIRVariable &argument);\n\tstd::string get_type_address_space(const SPIRType &type, uint32_t id, bool argument = false);\n\tconst char *to_restrict(uint32_t id, bool space);\n\tSPIRType &get_stage_in_struct_type();\n\tSPIRType &get_stage_out_struct_type();\n\tSPIRType &get_patch_stage_in_struct_type();\n\tSPIRType &get_patch_stage_out_struct_type();\n\tstd::string get_tess_factor_struct_name();\n\tSPIRType &get_uint_type();\n\tuint32_t get_uint_type_id();\n\tvoid emit_atomic_func_op(uint32_t result_type, uint32_t result_id, const char *op, spv::Op opcode,\n\t                         uint32_t mem_order_1, uint32_t mem_order_2, bool has_mem_order_2, uint32_t op0, uint32_t op1 = 0,\n\t                         bool op1_is_pointer = false, bool op1_is_literal = false, uint32_t op2 = 0);\n\tconst char *get_memory_order(uint32_t spv_mem_sem);\n\tvoid add_pragma_line(const std::string &line);\n\tvoid add_typedef_line(const std::string &line);\n\tvoid emit_barrier(uint32_t id_exe_scope, uint32_t id_mem_scope, uint32_t id_mem_sem);\n\tbool emit_array_copy(const char *expr, uint32_t lhs_id, uint32_t rhs_id,\n\t                     spv::StorageClass lhs_storage, spv::StorageClass rhs_storage) override;\n\tvoid build_implicit_builtins();\n\tuint32_t build_constant_uint_array_pointer();\n\tvoid emit_entry_point_declarations() override;\n\tbool uses_explicit_early_fragment_test();\n\n\tuint32_t builtin_frag_coord_id = 0;\n\tuint32_t builtin_sample_id_id = 0;\n\tuint32_t builtin_sample_mask_id = 0;\n\tuint32_t builtin_helper_invocation_id = 0;\n\tuint32_t builtin_vertex_idx_id = 0;\n\tuint32_t builtin_base_vertex_id = 0;\n\tuint32_t builtin_instance_idx_id = 0;\n\tuint32_t builtin_base_instance_id = 0;\n\tuint32_t builtin_view_idx_id = 0;\n\tuint32_t builtin_layer_id = 0;\n\tuint32_t builtin_invocation_id_id = 0;\n\tuint32_t builtin_primitive_id_id = 0;\n\tuint32_t builtin_subgroup_invocation_id_id = 0;\n\tuint32_t builtin_subgroup_size_id = 0;\n\tuint32_t builtin_dispatch_base_id = 0;\n\tuint32_t builtin_stage_input_size_id = 0;\n\tuint32_t builtin_local_invocation_index_id = 0;\n\tuint32_t builtin_workgroup_size_id = 0;\n\tuint32_t swizzle_buffer_id = 0;\n\tuint32_t buffer_size_buffer_id = 0;\n\tuint32_t view_mask_buffer_id = 0;\n\tuint32_t dynamic_offsets_buffer_id = 0;\n\tuint32_t uint_type_id = 0;\n\tuint32_t argument_buffer_padding_buffer_type_id = 0;\n\tuint32_t argument_buffer_padding_image_type_id = 0;\n\tuint32_t argument_buffer_padding_sampler_type_id = 0;\n\n\tbool does_shader_write_sample_mask = false;\n\tbool frag_shader_needs_discard_checks = false;\n\n\tvoid cast_to_variable_store(uint32_t target_id, std::string &expr, const SPIRType &expr_type) override;\n\tvoid cast_from_variable_load(uint32_t source_id, std::string &expr, const SPIRType &expr_type) override;\n\tvoid emit_store_statement(uint32_t lhs_expression, uint32_t rhs_expression) override;\n\n\tvoid analyze_sampled_image_usage();\n\n\tbool access_chain_needs_stage_io_builtin_translation(uint32_t base) override;\n\tbool prepare_access_chain_for_scalar_access(std::string &expr, const SPIRType &type, spv::StorageClass storage,\n\t                                            bool &is_packed) override;\n\tvoid fix_up_interpolant_access_chain(const uint32_t *ops, uint32_t length);\n\tvoid check_physical_type_cast(std::string &expr, const SPIRType *type, uint32_t physical_type) override;\n\n\tbool emit_tessellation_access_chain(const uint32_t *ops, uint32_t length);\n\tbool emit_tessellation_io_load(uint32_t result_type, uint32_t id, uint32_t ptr);\n\tbool is_out_of_bounds_tessellation_level(uint32_t id_lhs);\n\n\tvoid ensure_builtin(spv::StorageClass storage, spv::BuiltIn builtin);\n\n\tvoid mark_implicit_builtin(spv::StorageClass storage, spv::BuiltIn builtin, uint32_t id);\n\n\tstd::string convert_to_f32(const std::string &expr, uint32_t components);\n\n\tOptions msl_options;\n\tstd::set<SPVFuncImpl> spv_function_implementations;\n\t// Must be ordered to ensure declarations are in a specific order.\n\tstd::map<LocationComponentPair, MSLShaderInterfaceVariable> inputs_by_location;\n\tstd::unordered_map<uint32_t, MSLShaderInterfaceVariable> inputs_by_builtin;\n\tstd::map<LocationComponentPair, MSLShaderInterfaceVariable> outputs_by_location;\n\tstd::unordered_map<uint32_t, MSLShaderInterfaceVariable> outputs_by_builtin;\n\tstd::unordered_set<uint32_t> location_inputs_in_use;\n\tstd::unordered_set<uint32_t> location_inputs_in_use_fallback;\n\tstd::unordered_set<uint32_t> location_outputs_in_use;\n\tstd::unordered_set<uint32_t> location_outputs_in_use_fallback;\n\tstd::unordered_map<uint32_t, uint32_t> fragment_output_components;\n\tstd::unordered_map<uint32_t, uint32_t> builtin_to_automatic_input_location;\n\tstd::unordered_map<uint32_t, uint32_t> builtin_to_automatic_output_location;\n\tstd::set<std::string> pragma_lines;\n\tstd::set<std::string> typedef_lines;\n\tSmallVector<uint32_t> vars_needing_early_declaration;\n\n\tstd::unordered_map<StageSetBinding, std::pair<MSLResourceBinding, bool>, InternalHasher> resource_bindings;\n\tstd::unordered_map<StageSetBinding, uint32_t, InternalHasher> resource_arg_buff_idx_to_binding_number;\n\n\tuint32_t next_metal_resource_index_buffer = 0;\n\tuint32_t next_metal_resource_index_texture = 0;\n\tuint32_t next_metal_resource_index_sampler = 0;\n\t// Intentionally uninitialized, works around MSVC 2013 bug.\n\tuint32_t next_metal_resource_ids[kMaxArgumentBuffers];\n\n\tVariableID stage_in_var_id = 0;\n\tVariableID stage_out_var_id = 0;\n\tVariableID patch_stage_in_var_id = 0;\n\tVariableID patch_stage_out_var_id = 0;\n\tVariableID stage_in_ptr_var_id = 0;\n\tVariableID stage_out_ptr_var_id = 0;\n\tVariableID tess_level_inner_var_id = 0;\n\tVariableID tess_level_outer_var_id = 0;\n\tVariableID stage_out_masked_builtin_type_id = 0;\n\n\t// Handle HLSL-style 0-based vertex/instance index.\n\tenum class TriState\n\t{\n\t\tNeutral,\n\t\tNo,\n\t\tYes\n\t};\n\tTriState needs_base_vertex_arg = TriState::Neutral;\n\tTriState needs_base_instance_arg = TriState::Neutral;\n\n\tbool has_sampled_images = false;\n\tbool builtin_declaration = false; // Handle HLSL-style 0-based vertex/instance index.\n\n\tbool is_using_builtin_array = false; // Force the use of C style array declaration.\n\tbool using_builtin_array() const;\n\n\tbool is_rasterization_disabled = false;\n\tbool capture_output_to_buffer = false;\n\tbool needs_swizzle_buffer_def = false;\n\tbool used_swizzle_buffer = false;\n\tbool added_builtin_tess_level = false;\n\tbool needs_subgroup_invocation_id = false;\n\tbool needs_subgroup_size = false;\n\tbool needs_sample_id = false;\n\tbool needs_helper_invocation = false;\n\tstd::string qual_pos_var_name;\n\tstd::string stage_in_var_name = \"in\";\n\tstd::string stage_out_var_name = \"out\";\n\tstd::string patch_stage_in_var_name = \"patchIn\";\n\tstd::string patch_stage_out_var_name = \"patchOut\";\n\tstd::string sampler_name_suffix = \"Smplr\";\n\tstd::string swizzle_name_suffix = \"Swzl\";\n\tstd::string buffer_size_name_suffix = \"BufferSize\";\n\tstd::string plane_name_suffix = \"Plane\";\n\tstd::string input_wg_var_name = \"gl_in\";\n\tstd::string input_buffer_var_name = \"spvIn\";\n\tstd::string output_buffer_var_name = \"spvOut\";\n\tstd::string patch_input_buffer_var_name = \"spvPatchIn\";\n\tstd::string patch_output_buffer_var_name = \"spvPatchOut\";\n\tstd::string tess_factor_buffer_var_name = \"spvTessLevel\";\n\tstd::string index_buffer_var_name = \"spvIndices\";\n\tspv::Op previous_instruction_opcode = spv::OpNop;\n\n\t// Must be ordered since declaration is in a specific order.\n\tstd::map<uint32_t, MSLConstexprSampler> constexpr_samplers_by_id;\n\tstd::unordered_map<SetBindingPair, MSLConstexprSampler, InternalHasher> constexpr_samplers_by_binding;\n\tconst MSLConstexprSampler *find_constexpr_sampler(uint32_t id) const;\n\n\tstd::unordered_set<uint32_t> buffers_requiring_array_length;\n\tSmallVector<std::pair<uint32_t, uint32_t>> buffer_aliases_argument;\n\tSmallVector<uint32_t> buffer_aliases_discrete;\n\tstd::unordered_set<uint32_t> atomic_image_vars_emulated; // Emulate texture2D atomic operations\n\tstd::unordered_set<uint32_t> pull_model_inputs;\n\tstd::unordered_set<uint32_t> recursive_inputs;\n\n\tSmallVector<SPIRVariable *> entry_point_bindings;\n\n\t// Must be ordered since array is in a specific order.\n\tstd::map<SetBindingPair, std::pair<uint32_t, uint32_t>> buffers_requiring_dynamic_offset;\n\n\tSmallVector<uint32_t> disabled_frag_outputs;\n\n\tstd::unordered_set<SetBindingPair, InternalHasher> inline_uniform_blocks;\n\n\tuint32_t argument_buffer_ids[kMaxArgumentBuffers];\n\tuint32_t argument_buffer_discrete_mask = 0;\n\tuint32_t argument_buffer_device_storage_mask = 0;\n\n\tvoid analyze_argument_buffers();\n\tbool descriptor_set_is_argument_buffer(uint32_t desc_set) const;\n\tMSLResourceBinding &get_argument_buffer_resource(uint32_t desc_set, uint32_t arg_idx);\n\tvoid add_argument_buffer_padding_buffer_type(SPIRType &struct_type, uint32_t &mbr_idx, uint32_t &arg_buff_index, MSLResourceBinding &rez_bind);\n\tvoid add_argument_buffer_padding_image_type(SPIRType &struct_type, uint32_t &mbr_idx, uint32_t &arg_buff_index, MSLResourceBinding &rez_bind);\n\tvoid add_argument_buffer_padding_sampler_type(SPIRType &struct_type, uint32_t &mbr_idx, uint32_t &arg_buff_index, MSLResourceBinding &rez_bind);\n\tvoid add_argument_buffer_padding_type(uint32_t mbr_type_id, SPIRType &struct_type, uint32_t &mbr_idx, uint32_t &arg_buff_index, uint32_t count);\n\n\tuint32_t get_target_components_for_fragment_location(uint32_t location) const;\n\tuint32_t build_extended_vector_type(uint32_t type_id, uint32_t components,\n\t                                    SPIRType::BaseType basetype = SPIRType::Unknown);\n\tuint32_t build_msl_interpolant_type(uint32_t type_id, bool is_noperspective);\n\n\tbool suppress_missing_prototypes = false;\n\n\tvoid add_spv_func_and_recompile(SPVFuncImpl spv_func);\n\n\tvoid activate_argument_buffer_resources();\n\n\tbool type_is_msl_framebuffer_fetch(const SPIRType &type) const;\n\tbool type_is_pointer(const SPIRType &type) const;\n\tbool type_is_pointer_to_pointer(const SPIRType &type) const;\n\tbool is_supported_argument_buffer_type(const SPIRType &type) const;\n\n\tbool variable_storage_requires_stage_io(spv::StorageClass storage) const;\n\n\tbool needs_manual_helper_invocation_updates() const\n\t{\n\t\treturn msl_options.manual_helper_invocation_updates && msl_options.supports_msl_version(2, 3);\n\t}\n\tbool needs_frag_discard_checks() const\n\t{\n\t\treturn get_execution_model() == spv::ExecutionModelFragment && msl_options.supports_msl_version(2, 3) &&\n\t\t       msl_options.check_discarded_frag_stores && frag_shader_needs_discard_checks;\n\t}\n\n\tbool has_additional_fixed_sample_mask() const { return msl_options.additional_fixed_sample_mask != 0xffffffff; }\n\tstd::string additional_fixed_sample_mask_str() const;\n\n\t// OpcodeHandler that handles several MSL preprocessing operations.\n\tstruct OpCodePreprocessor : OpcodeHandler\n\t{\n\t\tOpCodePreprocessor(CompilerMSL &compiler_)\n\t\t    : compiler(compiler_)\n\t\t{\n\t\t}\n\n\t\tbool handle(spv::Op opcode, const uint32_t *args, uint32_t length) override;\n\t\tCompilerMSL::SPVFuncImpl get_spv_func_impl(spv::Op opcode, const uint32_t *args);\n\t\tvoid check_resource_write(uint32_t var_id);\n\n\t\tCompilerMSL &compiler;\n\t\tstd::unordered_map<uint32_t, uint32_t> result_types;\n\t\tstd::unordered_map<uint32_t, uint32_t> image_pointers_emulated; // Emulate texture2D atomic operations\n\t\tbool suppress_missing_prototypes = false;\n\t\tbool uses_atomics = false;\n\t\tbool uses_image_write = false;\n\t\tbool uses_buffer_write = false;\n\t\tbool uses_discard = false;\n\t\tbool needs_subgroup_invocation_id = false;\n\t\tbool needs_subgroup_size = false;\n\t\tbool needs_sample_id = false;\n\t\tbool needs_helper_invocation = false;\n\t};\n\n\t// OpcodeHandler that scans for uses of sampled images\n\tstruct SampledImageScanner : OpcodeHandler\n\t{\n\t\tSampledImageScanner(CompilerMSL &compiler_)\n\t\t    : compiler(compiler_)\n\t\t{\n\t\t}\n\n\t\tbool handle(spv::Op opcode, const uint32_t *args, uint32_t) override;\n\n\t\tCompilerMSL &compiler;\n\t};\n\n\t// Sorts the members of a SPIRType and associated Meta info based on a settable sorting\n\t// aspect, which defines which aspect of the struct members will be used to sort them.\n\t// Regardless of the sorting aspect, built-in members always appear at the end of the struct.\n\tstruct MemberSorter\n\t{\n\t\tenum SortAspect\n\t\t{\n\t\t\tLocationThenBuiltInType,\n\t\t\tOffset\n\t\t};\n\n\t\tvoid sort();\n\t\tbool operator()(uint32_t mbr_idx1, uint32_t mbr_idx2);\n\t\tMemberSorter(SPIRType &t, Meta &m, SortAspect sa);\n\n\t\tSPIRType &type;\n\t\tMeta &meta;\n\t\tSortAspect sort_aspect;\n\t};\n};\n} // namespace SPIRV_CROSS_NAMESPACE\n\n#endif\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv_parser.cpp",
    "content": "/*\n * Copyright 2018-2021 Arm Limited\n * SPDX-License-Identifier: Apache-2.0 OR MIT\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * At your option, you may choose to accept this material under either:\n *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or\n *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.\n */\n\n#include \"spirv_parser.hpp\"\n#include <assert.h>\n\nusing namespace std;\nusing namespace spv;\n\nnamespace SPIRV_CROSS_NAMESPACE\n{\nParser::Parser(vector<uint32_t> spirv)\n{\n\tir.spirv = std::move(spirv);\n}\n\nParser::Parser(const uint32_t *spirv_data, size_t word_count)\n{\n\tir.spirv = vector<uint32_t>(spirv_data, spirv_data + word_count);\n}\n\nstatic bool decoration_is_string(Decoration decoration)\n{\n\tswitch (decoration)\n\t{\n\tcase DecorationHlslSemanticGOOGLE:\n\t\treturn true;\n\n\tdefault:\n\t\treturn false;\n\t}\n}\n\nstatic inline uint32_t swap_endian(uint32_t v)\n{\n\treturn ((v >> 24) & 0x000000ffu) | ((v >> 8) & 0x0000ff00u) | ((v << 8) & 0x00ff0000u) | ((v << 24) & 0xff000000u);\n}\n\nstatic bool is_valid_spirv_version(uint32_t version)\n{\n\tswitch (version)\n\t{\n\t// Allow v99 since it tends to just work.\n\tcase 99:\n\tcase 0x10000: // SPIR-V 1.0\n\tcase 0x10100: // SPIR-V 1.1\n\tcase 0x10200: // SPIR-V 1.2\n\tcase 0x10300: // SPIR-V 1.3\n\tcase 0x10400: // SPIR-V 1.4\n\tcase 0x10500: // SPIR-V 1.5\n\tcase 0x10600: // SPIR-V 1.6\n\t\treturn true;\n\n\tdefault:\n\t\treturn false;\n\t}\n}\n\nvoid Parser::parse()\n{\n\tauto &spirv = ir.spirv;\n\n\tauto len = spirv.size();\n\tif (len < 5)\n\t\tSPIRV_CROSS_THROW(\"SPIRV file too small.\");\n\n\tauto s = spirv.data();\n\n\t// Endian-swap if we need to.\n\tif (s[0] == swap_endian(MagicNumber))\n\t\ttransform(begin(spirv), end(spirv), begin(spirv), [](uint32_t c) { return swap_endian(c); });\n\n\tif (s[0] != MagicNumber || !is_valid_spirv_version(s[1]))\n\t\tSPIRV_CROSS_THROW(\"Invalid SPIRV format.\");\n\n\tuint32_t bound = s[3];\n\n\tconst uint32_t MaximumNumberOfIDs = 0x3fffff;\n\tif (bound > MaximumNumberOfIDs)\n\t\tSPIRV_CROSS_THROW(\"ID bound exceeds limit of 0x3fffff.\\n\");\n\n\tir.set_id_bounds(bound);\n\n\tuint32_t offset = 5;\n\n\tSmallVector<Instruction> instructions;\n\twhile (offset < len)\n\t{\n\t\tInstruction instr = {};\n\t\tinstr.op = spirv[offset] & 0xffff;\n\t\tinstr.count = (spirv[offset] >> 16) & 0xffff;\n\n\t\tif (instr.count == 0)\n\t\t\tSPIRV_CROSS_THROW(\"SPIR-V instructions cannot consume 0 words. Invalid SPIR-V file.\");\n\n\t\tinstr.offset = offset + 1;\n\t\tinstr.length = instr.count - 1;\n\n\t\toffset += instr.count;\n\n\t\tif (offset > spirv.size())\n\t\t\tSPIRV_CROSS_THROW(\"SPIR-V instruction goes out of bounds.\");\n\n\t\tinstructions.push_back(instr);\n\t}\n\n\tfor (auto &i : instructions)\n\t\tparse(i);\n\n\tfor (auto &fixup : forward_pointer_fixups)\n\t{\n\t\tauto &target = get<SPIRType>(fixup.first);\n\t\tauto &source = get<SPIRType>(fixup.second);\n\t\ttarget.member_types = source.member_types;\n\t\ttarget.basetype = source.basetype;\n\t\ttarget.self = source.self;\n\t}\n\tforward_pointer_fixups.clear();\n\n\tif (current_function)\n\t\tSPIRV_CROSS_THROW(\"Function was not terminated.\");\n\tif (current_block)\n\t\tSPIRV_CROSS_THROW(\"Block was not terminated.\");\n\tif (ir.default_entry_point == 0)\n\t\tSPIRV_CROSS_THROW(\"There is no entry point in the SPIR-V module.\");\n}\n\nconst uint32_t *Parser::stream(const Instruction &instr) const\n{\n\t// If we're not going to use any arguments, just return nullptr.\n\t// We want to avoid case where we return an out of range pointer\n\t// that trips debug assertions on some platforms.\n\tif (!instr.length)\n\t\treturn nullptr;\n\n\tif (instr.offset + instr.length > ir.spirv.size())\n\t\tSPIRV_CROSS_THROW(\"Compiler::stream() out of range.\");\n\treturn &ir.spirv[instr.offset];\n}\n\nstatic string extract_string(const vector<uint32_t> &spirv, uint32_t offset)\n{\n\tstring ret;\n\tfor (uint32_t i = offset; i < spirv.size(); i++)\n\t{\n\t\tuint32_t w = spirv[i];\n\n\t\tfor (uint32_t j = 0; j < 4; j++, w >>= 8)\n\t\t{\n\t\t\tchar c = w & 0xff;\n\t\t\tif (c == '\\0')\n\t\t\t\treturn ret;\n\t\t\tret += c;\n\t\t}\n\t}\n\n\tSPIRV_CROSS_THROW(\"String was not terminated before EOF\");\n}\n\nvoid Parser::parse(const Instruction &instruction)\n{\n\tauto *ops = stream(instruction);\n\tauto op = static_cast<Op>(instruction.op);\n\tuint32_t length = instruction.length;\n\n\t// HACK for glslang that might emit OpEmitMeshTasksEXT followed by return / branch.\n\t// Instead of failing hard, just ignore it.\n\tif (ignore_trailing_block_opcodes)\n\t{\n\t\tignore_trailing_block_opcodes = false;\n\t\tif (op == OpReturn || op == OpBranch || op == OpUnreachable)\n\t\t\treturn;\n\t}\n\n\tswitch (op)\n\t{\n\tcase OpSourceContinued:\n\tcase OpSourceExtension:\n\tcase OpNop:\n\tcase OpModuleProcessed:\n\t\tbreak;\n\n\tcase OpString:\n\t{\n\t\tset<SPIRString>(ops[0], extract_string(ir.spirv, instruction.offset + 1));\n\t\tbreak;\n\t}\n\n\tcase OpMemoryModel:\n\t\tir.addressing_model = static_cast<AddressingModel>(ops[0]);\n\t\tir.memory_model = static_cast<MemoryModel>(ops[1]);\n\t\tbreak;\n\n\tcase OpSource:\n\t{\n\t\tauto lang = static_cast<SourceLanguage>(ops[0]);\n\t\tswitch (lang)\n\t\t{\n\t\tcase SourceLanguageESSL:\n\t\t\tir.source.es = true;\n\t\t\tir.source.version = ops[1];\n\t\t\tir.source.known = true;\n\t\t\tir.source.hlsl = false;\n\t\t\tbreak;\n\n\t\tcase SourceLanguageGLSL:\n\t\t\tir.source.es = false;\n\t\t\tir.source.version = ops[1];\n\t\t\tir.source.known = true;\n\t\t\tir.source.hlsl = false;\n\t\t\tbreak;\n\n\t\tcase SourceLanguageHLSL:\n\t\t\t// For purposes of cross-compiling, this is GLSL 450.\n\t\t\tir.source.es = false;\n\t\t\tir.source.version = 450;\n\t\t\tir.source.known = true;\n\t\t\tir.source.hlsl = true;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tir.source.known = false;\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpUndef:\n\t{\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tset<SPIRUndef>(id, result_type);\n\t\tif (current_block)\n\t\t\tcurrent_block->ops.push_back(instruction);\n\t\tbreak;\n\t}\n\n\tcase OpCapability:\n\t{\n\t\tuint32_t cap = ops[0];\n\t\tif (cap == CapabilityKernel)\n\t\t\tSPIRV_CROSS_THROW(\"Kernel capability not supported.\");\n\n\t\tir.declared_capabilities.push_back(static_cast<Capability>(ops[0]));\n\t\tbreak;\n\t}\n\n\tcase OpExtension:\n\t{\n\t\tauto ext = extract_string(ir.spirv, instruction.offset);\n\t\tir.declared_extensions.push_back(std::move(ext));\n\t\tbreak;\n\t}\n\n\tcase OpExtInstImport:\n\t{\n\t\tuint32_t id = ops[0];\n\n\t\tSPIRExtension::Extension spirv_ext = SPIRExtension::Unsupported;\n\n\t\tauto ext = extract_string(ir.spirv, instruction.offset + 1);\n\t\tif (ext == \"GLSL.std.450\")\n\t\t\tspirv_ext = SPIRExtension::GLSL;\n\t\telse if (ext == \"DebugInfo\")\n\t\t\tspirv_ext = SPIRExtension::SPV_debug_info;\n\t\telse if (ext == \"SPV_AMD_shader_ballot\")\n\t\t\tspirv_ext = SPIRExtension::SPV_AMD_shader_ballot;\n\t\telse if (ext == \"SPV_AMD_shader_explicit_vertex_parameter\")\n\t\t\tspirv_ext = SPIRExtension::SPV_AMD_shader_explicit_vertex_parameter;\n\t\telse if (ext == \"SPV_AMD_shader_trinary_minmax\")\n\t\t\tspirv_ext = SPIRExtension::SPV_AMD_shader_trinary_minmax;\n\t\telse if (ext == \"SPV_AMD_gcn_shader\")\n\t\t\tspirv_ext = SPIRExtension::SPV_AMD_gcn_shader;\n\t\telse if (ext == \"NonSemantic.DebugPrintf\")\n\t\t\tspirv_ext = SPIRExtension::NonSemanticDebugPrintf;\n\t\telse if (ext == \"NonSemantic.Shader.DebugInfo.100\")\n\t\t\tspirv_ext = SPIRExtension::NonSemanticShaderDebugInfo;\n\t\telse if (ext.find(\"NonSemantic.\") == 0)\n\t\t\tspirv_ext = SPIRExtension::NonSemanticGeneric;\n\n\t\tset<SPIRExtension>(id, spirv_ext);\n\t\t// Other SPIR-V extensions which have ExtInstrs are currently not supported.\n\n\t\tbreak;\n\t}\n\n\tcase OpExtInst:\n\t{\n\t\t// The SPIR-V debug information extended instructions might come at global scope.\n\t\tif (current_block)\n\t\t{\n\t\t\tcurrent_block->ops.push_back(instruction);\n\t\t\tif (length >= 2)\n\t\t\t{\n\t\t\t\tconst auto *type = maybe_get<SPIRType>(ops[0]);\n\t\t\t\tif (type)\n\t\t\t\t\tir.load_type_width.insert({ ops[1], type->width });\n\t\t\t}\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpEntryPoint:\n\t{\n\t\tauto itr =\n\t\t    ir.entry_points.insert(make_pair(ops[1], SPIREntryPoint(ops[1], static_cast<ExecutionModel>(ops[0]),\n\t\t                                                            extract_string(ir.spirv, instruction.offset + 2))));\n\t\tauto &e = itr.first->second;\n\n\t\t// Strings need nul-terminator and consume the whole word.\n\t\tuint32_t strlen_words = uint32_t((e.name.size() + 1 + 3) >> 2);\n\n\t\tfor (uint32_t i = strlen_words + 2; i < instruction.length; i++)\n\t\t\te.interface_variables.push_back(ops[i]);\n\n\t\t// Set the name of the entry point in case OpName is not provided later.\n\t\tir.set_name(ops[1], e.name);\n\n\t\t// If we don't have an entry, make the first one our \"default\".\n\t\tif (!ir.default_entry_point)\n\t\t\tir.default_entry_point = ops[1];\n\t\tbreak;\n\t}\n\n\tcase OpExecutionMode:\n\t{\n\t\tauto &execution = ir.entry_points[ops[0]];\n\t\tauto mode = static_cast<ExecutionMode>(ops[1]);\n\t\texecution.flags.set(mode);\n\n\t\tswitch (mode)\n\t\t{\n\t\tcase ExecutionModeInvocations:\n\t\t\texecution.invocations = ops[2];\n\t\t\tbreak;\n\n\t\tcase ExecutionModeLocalSize:\n\t\t\texecution.workgroup_size.x = ops[2];\n\t\t\texecution.workgroup_size.y = ops[3];\n\t\t\texecution.workgroup_size.z = ops[4];\n\t\t\tbreak;\n\n\t\tcase ExecutionModeOutputVertices:\n\t\t\texecution.output_vertices = ops[2];\n\t\t\tbreak;\n\n\t\tcase ExecutionModeOutputPrimitivesEXT:\n\t\t\texecution.output_primitives = ops[2];\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpExecutionModeId:\n\t{\n\t\tauto &execution = ir.entry_points[ops[0]];\n\t\tauto mode = static_cast<ExecutionMode>(ops[1]);\n\t\texecution.flags.set(mode);\n\n\t\tif (mode == ExecutionModeLocalSizeId)\n\t\t{\n\t\t\texecution.workgroup_size.id_x = ops[2];\n\t\t\texecution.workgroup_size.id_y = ops[3];\n\t\t\texecution.workgroup_size.id_z = ops[4];\n\t\t}\n\n\t\tbreak;\n\t}\n\n\tcase OpName:\n\t{\n\t\tuint32_t id = ops[0];\n\t\tir.set_name(id, extract_string(ir.spirv, instruction.offset + 1));\n\t\tbreak;\n\t}\n\n\tcase OpMemberName:\n\t{\n\t\tuint32_t id = ops[0];\n\t\tuint32_t member = ops[1];\n\t\tir.set_member_name(id, member, extract_string(ir.spirv, instruction.offset + 2));\n\t\tbreak;\n\t}\n\n\tcase OpDecorationGroup:\n\t{\n\t\t// Noop, this simply means an ID should be a collector of decorations.\n\t\t// The meta array is already a flat array of decorations which will contain the relevant decorations.\n\t\tbreak;\n\t}\n\n\tcase OpGroupDecorate:\n\t{\n\t\tuint32_t group_id = ops[0];\n\t\tauto &decorations = ir.meta[group_id].decoration;\n\t\tauto &flags = decorations.decoration_flags;\n\n\t\t// Copies decorations from one ID to another. Only copy decorations which are set in the group,\n\t\t// i.e., we cannot just copy the meta structure directly.\n\t\tfor (uint32_t i = 1; i < length; i++)\n\t\t{\n\t\t\tuint32_t target = ops[i];\n\t\t\tflags.for_each_bit([&](uint32_t bit) {\n\t\t\t\tauto decoration = static_cast<Decoration>(bit);\n\n\t\t\t\tif (decoration_is_string(decoration))\n\t\t\t\t{\n\t\t\t\t\tir.set_decoration_string(target, decoration, ir.get_decoration_string(group_id, decoration));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tir.meta[target].decoration_word_offset[decoration] =\n\t\t\t\t\t    ir.meta[group_id].decoration_word_offset[decoration];\n\t\t\t\t\tir.set_decoration(target, decoration, ir.get_decoration(group_id, decoration));\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpGroupMemberDecorate:\n\t{\n\t\tuint32_t group_id = ops[0];\n\t\tauto &flags = ir.meta[group_id].decoration.decoration_flags;\n\n\t\t// Copies decorations from one ID to another. Only copy decorations which are set in the group,\n\t\t// i.e., we cannot just copy the meta structure directly.\n\t\tfor (uint32_t i = 1; i + 1 < length; i += 2)\n\t\t{\n\t\t\tuint32_t target = ops[i + 0];\n\t\t\tuint32_t index = ops[i + 1];\n\t\t\tflags.for_each_bit([&](uint32_t bit) {\n\t\t\t\tauto decoration = static_cast<Decoration>(bit);\n\n\t\t\t\tif (decoration_is_string(decoration))\n\t\t\t\t\tir.set_member_decoration_string(target, index, decoration,\n\t\t\t\t\t                                ir.get_decoration_string(group_id, decoration));\n\t\t\t\telse\n\t\t\t\t\tir.set_member_decoration(target, index, decoration, ir.get_decoration(group_id, decoration));\n\t\t\t});\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpDecorate:\n\tcase OpDecorateId:\n\t{\n\t\t// OpDecorateId technically supports an array of arguments, but our only supported decorations are single uint,\n\t\t// so merge decorate and decorate-id here.\n\t\tuint32_t id = ops[0];\n\n\t\tauto decoration = static_cast<Decoration>(ops[1]);\n\t\tif (length >= 3)\n\t\t{\n\t\t\tir.meta[id].decoration_word_offset[decoration] = uint32_t(&ops[2] - ir.spirv.data());\n\t\t\tir.set_decoration(id, decoration, ops[2]);\n\t\t}\n\t\telse\n\t\t\tir.set_decoration(id, decoration);\n\n\t\tbreak;\n\t}\n\n\tcase OpDecorateStringGOOGLE:\n\t{\n\t\tuint32_t id = ops[0];\n\t\tauto decoration = static_cast<Decoration>(ops[1]);\n\t\tir.set_decoration_string(id, decoration, extract_string(ir.spirv, instruction.offset + 2));\n\t\tbreak;\n\t}\n\n\tcase OpMemberDecorate:\n\t{\n\t\tuint32_t id = ops[0];\n\t\tuint32_t member = ops[1];\n\t\tauto decoration = static_cast<Decoration>(ops[2]);\n\t\tif (length >= 4)\n\t\t\tir.set_member_decoration(id, member, decoration, ops[3]);\n\t\telse\n\t\t\tir.set_member_decoration(id, member, decoration);\n\t\tbreak;\n\t}\n\n\tcase OpMemberDecorateStringGOOGLE:\n\t{\n\t\tuint32_t id = ops[0];\n\t\tuint32_t member = ops[1];\n\t\tauto decoration = static_cast<Decoration>(ops[2]);\n\t\tir.set_member_decoration_string(id, member, decoration, extract_string(ir.spirv, instruction.offset + 3));\n\t\tbreak;\n\t}\n\n\t// Build up basic types.\n\tcase OpTypeVoid:\n\t{\n\t\tuint32_t id = ops[0];\n\t\tauto &type = set<SPIRType>(id, op);\n\t\ttype.basetype = SPIRType::Void;\n\t\tbreak;\n\t}\n\n\tcase OpTypeBool:\n\t{\n\t\tuint32_t id = ops[0];\n\t\tauto &type = set<SPIRType>(id, op);\n\t\ttype.basetype = SPIRType::Boolean;\n\t\ttype.width = 1;\n\t\tbreak;\n\t}\n\n\tcase OpTypeFloat:\n\t{\n\t\tuint32_t id = ops[0];\n\t\tuint32_t width = ops[1];\n\t\tauto &type = set<SPIRType>(id, op);\n\t\tif (width == 64)\n\t\t\ttype.basetype = SPIRType::Double;\n\t\telse if (width == 32)\n\t\t\ttype.basetype = SPIRType::Float;\n\t\telse if (width == 16)\n\t\t\ttype.basetype = SPIRType::Half;\n\t\telse\n\t\t\tSPIRV_CROSS_THROW(\"Unrecognized bit-width of floating point type.\");\n\t\ttype.width = width;\n\t\tbreak;\n\t}\n\n\tcase OpTypeInt:\n\t{\n\t\tuint32_t id = ops[0];\n\t\tuint32_t width = ops[1];\n\t\tbool signedness = ops[2] != 0;\n\t\tauto &type = set<SPIRType>(id, op);\n\t\ttype.basetype = signedness ? to_signed_basetype(width) : to_unsigned_basetype(width);\n\t\ttype.width = width;\n\t\tbreak;\n\t}\n\n\t// Build composite types by \"inheriting\".\n\t// NOTE: The self member is also copied! For pointers and array modifiers this is a good thing\n\t// since we can refer to decorations on pointee classes which is needed for UBO/SSBO, I/O blocks in geometry/tess etc.\n\tcase OpTypeVector:\n\t{\n\t\tuint32_t id = ops[0];\n\t\tuint32_t vecsize = ops[2];\n\n\t\tauto &base = get<SPIRType>(ops[1]);\n\t\tauto &vecbase = set<SPIRType>(id, base);\n\n\t\tvecbase.op = op;\n\t\tvecbase.vecsize = vecsize;\n\t\tvecbase.self = id;\n\t\tvecbase.parent_type = ops[1];\n\t\tbreak;\n\t}\n\n\tcase OpTypeMatrix:\n\t{\n\t\tuint32_t id = ops[0];\n\t\tuint32_t colcount = ops[2];\n\n\t\tauto &base = get<SPIRType>(ops[1]);\n\t\tauto &matrixbase = set<SPIRType>(id, base);\n\n\t\tmatrixbase.op = op;\n\t\tmatrixbase.columns = colcount;\n\t\tmatrixbase.self = id;\n\t\tmatrixbase.parent_type = ops[1];\n\t\tbreak;\n\t}\n\n\tcase OpTypeArray:\n\t{\n\t\tuint32_t id = ops[0];\n\t\tuint32_t tid = ops[1];\n\t\tauto &base = get<SPIRType>(tid);\n\t\tauto &arraybase = set<SPIRType>(id, base);\n\n\t\tarraybase.op = op;\n\t\tarraybase.parent_type = tid;\n\n\t\tuint32_t cid = ops[2];\n\t\tir.mark_used_as_array_length(cid);\n\t\tauto *c = maybe_get<SPIRConstant>(cid);\n\t\tbool literal = c && !c->specialization;\n\n\t\t// We're copying type information into Array types, so we'll need a fixup for any physical pointer\n\t\t// references.\n\t\tif (base.forward_pointer)\n\t\t\tforward_pointer_fixups.push_back({ id, tid });\n\n\t\tarraybase.array_size_literal.push_back(literal);\n\t\tarraybase.array.push_back(literal ? c->scalar() : cid);\n\n\t\t// .self resolves down to non-array/non-pointer type.\n\t\tarraybase.self = base.self;\n\t\tbreak;\n\t}\n\n\tcase OpTypeRuntimeArray:\n\t{\n\t\tuint32_t id = ops[0];\n\n\t\tauto &base = get<SPIRType>(ops[1]);\n\t\tauto &arraybase = set<SPIRType>(id, base);\n\n\t\t// We're copying type information into Array types, so we'll need a fixup for any physical pointer\n\t\t// references.\n\t\tif (base.forward_pointer)\n\t\t\tforward_pointer_fixups.push_back({ id, ops[1] });\n\n\t\tarraybase.op = op;\n\t\tarraybase.array.push_back(0);\n\t\tarraybase.array_size_literal.push_back(true);\n\t\tarraybase.parent_type = ops[1];\n\n\t\t// .self resolves down to non-array/non-pointer type.\n\t\tarraybase.self = base.self;\n\t\tbreak;\n\t}\n\n\tcase OpTypeImage:\n\t{\n\t\tuint32_t id = ops[0];\n\t\tauto &type = set<SPIRType>(id, op);\n\t\ttype.basetype = SPIRType::Image;\n\t\ttype.image.type = ops[1];\n\t\ttype.image.dim = static_cast<Dim>(ops[2]);\n\t\ttype.image.depth = ops[3] == 1;\n\t\ttype.image.arrayed = ops[4] != 0;\n\t\ttype.image.ms = ops[5] != 0;\n\t\ttype.image.sampled = ops[6];\n\t\ttype.image.format = static_cast<ImageFormat>(ops[7]);\n\t\ttype.image.access = (length >= 9) ? static_cast<AccessQualifier>(ops[8]) : AccessQualifierMax;\n\t\tbreak;\n\t}\n\n\tcase OpTypeSampledImage:\n\t{\n\t\tuint32_t id = ops[0];\n\t\tuint32_t imagetype = ops[1];\n\t\tauto &type = set<SPIRType>(id, op);\n\t\ttype = get<SPIRType>(imagetype);\n\t\ttype.basetype = SPIRType::SampledImage;\n\t\ttype.self = id;\n\t\tbreak;\n\t}\n\n\tcase OpTypeSampler:\n\t{\n\t\tuint32_t id = ops[0];\n\t\tauto &type = set<SPIRType>(id, op);\n\t\ttype.basetype = SPIRType::Sampler;\n\t\tbreak;\n\t}\n\n\tcase OpTypePointer:\n\t{\n\t\tuint32_t id = ops[0];\n\n\t\t// Very rarely, we might receive a FunctionPrototype here.\n\t\t// We won't be able to compile it, but we shouldn't crash when parsing.\n\t\t// We should be able to reflect.\n\t\tauto *base = maybe_get<SPIRType>(ops[2]);\n\t\tauto &ptrbase = set<SPIRType>(id, op);\n\n\t\tif (base)\n\t\t{\n\t\t\tptrbase = *base;\n\t\t\tptrbase.op = op;\n\t\t}\n\n\t\tptrbase.pointer = true;\n\t\tptrbase.pointer_depth++;\n\t\tptrbase.storage = static_cast<StorageClass>(ops[1]);\n\n\t\tif (ptrbase.storage == StorageClassAtomicCounter)\n\t\t\tptrbase.basetype = SPIRType::AtomicCounter;\n\n\t\tif (base && base->forward_pointer)\n\t\t\tforward_pointer_fixups.push_back({ id, ops[2] });\n\n\t\tptrbase.parent_type = ops[2];\n\n\t\t// Do NOT set ptrbase.self!\n\t\tbreak;\n\t}\n\n\tcase OpTypeForwardPointer:\n\t{\n\t\tuint32_t id = ops[0];\n\t\tauto &ptrbase = set<SPIRType>(id, op);\n\t\tptrbase.pointer = true;\n\t\tptrbase.pointer_depth++;\n\t\tptrbase.storage = static_cast<StorageClass>(ops[1]);\n\t\tptrbase.forward_pointer = true;\n\n\t\tif (ptrbase.storage == StorageClassAtomicCounter)\n\t\t\tptrbase.basetype = SPIRType::AtomicCounter;\n\n\t\tbreak;\n\t}\n\n\tcase OpTypeStruct:\n\t{\n\t\tuint32_t id = ops[0];\n\t\tauto &type = set<SPIRType>(id, op);\n\t\ttype.basetype = SPIRType::Struct;\n\t\tfor (uint32_t i = 1; i < length; i++)\n\t\t\ttype.member_types.push_back(ops[i]);\n\n\t\t// Check if we have seen this struct type before, with just different\n\t\t// decorations.\n\t\t//\n\t\t// Add workaround for issue #17 as well by looking at OpName for the struct\n\t\t// types, which we shouldn't normally do.\n\t\t// We should not normally have to consider type aliases like this to begin with\n\t\t// however ... glslang issues #304, #307 cover this.\n\n\t\t// For stripped names, never consider struct type aliasing.\n\t\t// We risk declaring the same struct multiple times, but type-punning is not allowed\n\t\t// so this is safe.\n\t\tbool consider_aliasing = !ir.get_name(type.self).empty();\n\t\tif (consider_aliasing)\n\t\t{\n\t\t\tfor (auto &other : global_struct_cache)\n\t\t\t{\n\t\t\t\tif (ir.get_name(type.self) == ir.get_name(other) &&\n\t\t\t\t    types_are_logically_equivalent(type, get<SPIRType>(other)))\n\t\t\t\t{\n\t\t\t\t\ttype.type_alias = other;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (type.type_alias == TypeID(0))\n\t\t\t\tglobal_struct_cache.push_back(id);\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpTypeFunction:\n\t{\n\t\tuint32_t id = ops[0];\n\t\tuint32_t ret = ops[1];\n\n\t\tauto &func = set<SPIRFunctionPrototype>(id, ret);\n\t\tfor (uint32_t i = 2; i < length; i++)\n\t\t\tfunc.parameter_types.push_back(ops[i]);\n\t\tbreak;\n\t}\n\n\tcase OpTypeAccelerationStructureKHR:\n\t{\n\t\tuint32_t id = ops[0];\n\t\tauto &type = set<SPIRType>(id, op);\n\t\ttype.basetype = SPIRType::AccelerationStructure;\n\t\tbreak;\n\t}\n\n\tcase OpTypeRayQueryKHR:\n\t{\n\t\tuint32_t id = ops[0];\n\t\tauto &type = set<SPIRType>(id, op);\n\t\ttype.basetype = SPIRType::RayQuery;\n\t\tbreak;\n\t}\n\n\t// Variable declaration\n\t// All variables are essentially pointers with a storage qualifier.\n\tcase OpVariable:\n\t{\n\t\tuint32_t type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tauto storage = static_cast<StorageClass>(ops[2]);\n\t\tuint32_t initializer = length == 4 ? ops[3] : 0;\n\n\t\tif (storage == StorageClassFunction)\n\t\t{\n\t\t\tif (!current_function)\n\t\t\t\tSPIRV_CROSS_THROW(\"No function currently in scope\");\n\t\t\tcurrent_function->add_local_variable(id);\n\t\t}\n\n\t\tset<SPIRVariable>(id, type, storage, initializer);\n\t\tbreak;\n\t}\n\n\t// OpPhi\n\t// OpPhi is a fairly magical opcode.\n\t// It selects temporary variables based on which parent block we *came from*.\n\t// In high-level languages we can \"de-SSA\" by creating a function local, and flush out temporaries to this function-local\n\t// variable to emulate SSA Phi.\n\tcase OpPhi:\n\t{\n\t\tif (!current_function)\n\t\t\tSPIRV_CROSS_THROW(\"No function currently in scope\");\n\t\tif (!current_block)\n\t\t\tSPIRV_CROSS_THROW(\"No block currently in scope\");\n\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\n\t\t// Instead of a temporary, create a new function-wide temporary with this ID instead.\n\t\tauto &var = set<SPIRVariable>(id, result_type, spv::StorageClassFunction);\n\t\tvar.phi_variable = true;\n\n\t\tcurrent_function->add_local_variable(id);\n\n\t\tfor (uint32_t i = 2; i + 2 <= length; i += 2)\n\t\t\tcurrent_block->phi_variables.push_back({ ops[i], ops[i + 1], id });\n\t\tbreak;\n\t}\n\n\t\t// Constants\n\tcase OpSpecConstant:\n\tcase OpConstant:\n\t{\n\t\tuint32_t id = ops[1];\n\t\tauto &type = get<SPIRType>(ops[0]);\n\n\t\tif (type.width > 32)\n\t\t\tset<SPIRConstant>(id, ops[0], ops[2] | (uint64_t(ops[3]) << 32), op == OpSpecConstant);\n\t\telse\n\t\t\tset<SPIRConstant>(id, ops[0], ops[2], op == OpSpecConstant);\n\t\tbreak;\n\t}\n\n\tcase OpSpecConstantFalse:\n\tcase OpConstantFalse:\n\t{\n\t\tuint32_t id = ops[1];\n\t\tset<SPIRConstant>(id, ops[0], uint32_t(0), op == OpSpecConstantFalse);\n\t\tbreak;\n\t}\n\n\tcase OpSpecConstantTrue:\n\tcase OpConstantTrue:\n\t{\n\t\tuint32_t id = ops[1];\n\t\tset<SPIRConstant>(id, ops[0], uint32_t(1), op == OpSpecConstantTrue);\n\t\tbreak;\n\t}\n\n\tcase OpConstantNull:\n\t{\n\t\tuint32_t id = ops[1];\n\t\tuint32_t type = ops[0];\n\t\tir.make_constant_null(id, type, true);\n\t\tbreak;\n\t}\n\n\tcase OpSpecConstantComposite:\n\tcase OpConstantComposite:\n\t{\n\t\tuint32_t id = ops[1];\n\t\tuint32_t type = ops[0];\n\n\t\tauto &ctype = get<SPIRType>(type);\n\n\t\t// We can have constants which are structs and arrays.\n\t\t// In this case, our SPIRConstant will be a list of other SPIRConstant ids which we\n\t\t// can refer to.\n\t\tif (ctype.basetype == SPIRType::Struct || !ctype.array.empty())\n\t\t{\n\t\t\tset<SPIRConstant>(id, type, ops + 2, length - 2, op == OpSpecConstantComposite);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tuint32_t elements = length - 2;\n\t\t\tif (elements > 4)\n\t\t\t\tSPIRV_CROSS_THROW(\"OpConstantComposite only supports 1, 2, 3 and 4 elements.\");\n\n\t\t\tSPIRConstant remapped_constant_ops[4];\n\t\t\tconst SPIRConstant *c[4];\n\t\t\tfor (uint32_t i = 0; i < elements; i++)\n\t\t\t{\n\t\t\t\t// Specialization constants operations can also be part of this.\n\t\t\t\t// We do not know their value, so any attempt to query SPIRConstant later\n\t\t\t\t// will fail. We can only propagate the ID of the expression and use to_expression on it.\n\t\t\t\tauto *constant_op = maybe_get<SPIRConstantOp>(ops[2 + i]);\n\t\t\t\tauto *undef_op = maybe_get<SPIRUndef>(ops[2 + i]);\n\t\t\t\tif (constant_op)\n\t\t\t\t{\n\t\t\t\t\tif (op == OpConstantComposite)\n\t\t\t\t\t\tSPIRV_CROSS_THROW(\"Specialization constant operation used in OpConstantComposite.\");\n\n\t\t\t\t\tremapped_constant_ops[i].make_null(get<SPIRType>(constant_op->basetype));\n\t\t\t\t\tremapped_constant_ops[i].self = constant_op->self;\n\t\t\t\t\tremapped_constant_ops[i].constant_type = constant_op->basetype;\n\t\t\t\t\tremapped_constant_ops[i].specialization = true;\n\t\t\t\t\tc[i] = &remapped_constant_ops[i];\n\t\t\t\t}\n\t\t\t\telse if (undef_op)\n\t\t\t\t{\n\t\t\t\t\t// Undefined, just pick 0.\n\t\t\t\t\tremapped_constant_ops[i].make_null(get<SPIRType>(undef_op->basetype));\n\t\t\t\t\tremapped_constant_ops[i].constant_type = undef_op->basetype;\n\t\t\t\t\tc[i] = &remapped_constant_ops[i];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tc[i] = &get<SPIRConstant>(ops[2 + i]);\n\t\t\t}\n\t\t\tset<SPIRConstant>(id, type, c, elements, op == OpSpecConstantComposite);\n\t\t}\n\t\tbreak;\n\t}\n\n\t// Functions\n\tcase OpFunction:\n\t{\n\t\tuint32_t res = ops[0];\n\t\tuint32_t id = ops[1];\n\t\t// Control\n\t\tuint32_t type = ops[3];\n\n\t\tif (current_function)\n\t\t\tSPIRV_CROSS_THROW(\"Must end a function before starting a new one!\");\n\n\t\tcurrent_function = &set<SPIRFunction>(id, res, type);\n\t\tbreak;\n\t}\n\n\tcase OpFunctionParameter:\n\t{\n\t\tuint32_t type = ops[0];\n\t\tuint32_t id = ops[1];\n\n\t\tif (!current_function)\n\t\t\tSPIRV_CROSS_THROW(\"Must be in a function!\");\n\n\t\tcurrent_function->add_parameter(type, id);\n\t\tset<SPIRVariable>(id, type, StorageClassFunction);\n\t\tbreak;\n\t}\n\n\tcase OpFunctionEnd:\n\t{\n\t\tif (current_block)\n\t\t{\n\t\t\t// Very specific error message, but seems to come up quite often.\n\t\t\tSPIRV_CROSS_THROW(\n\t\t\t    \"Cannot end a function before ending the current block.\\n\"\n\t\t\t    \"Likely cause: If this SPIR-V was created from glslang HLSL, make sure the entry point is valid.\");\n\t\t}\n\t\tcurrent_function = nullptr;\n\t\tbreak;\n\t}\n\n\t// Blocks\n\tcase OpLabel:\n\t{\n\t\t// OpLabel always starts a block.\n\t\tif (!current_function)\n\t\t\tSPIRV_CROSS_THROW(\"Blocks cannot exist outside functions!\");\n\n\t\tuint32_t id = ops[0];\n\n\t\tcurrent_function->blocks.push_back(id);\n\t\tif (!current_function->entry_block)\n\t\t\tcurrent_function->entry_block = id;\n\n\t\tif (current_block)\n\t\t\tSPIRV_CROSS_THROW(\"Cannot start a block before ending the current block.\");\n\n\t\tcurrent_block = &set<SPIRBlock>(id);\n\t\tbreak;\n\t}\n\n\t// Branch instructions end blocks.\n\tcase OpBranch:\n\t{\n\t\tif (!current_block)\n\t\t\tSPIRV_CROSS_THROW(\"Trying to end a non-existing block.\");\n\n\t\tuint32_t target = ops[0];\n\t\tcurrent_block->terminator = SPIRBlock::Direct;\n\t\tcurrent_block->next_block = target;\n\t\tcurrent_block = nullptr;\n\t\tbreak;\n\t}\n\n\tcase OpBranchConditional:\n\t{\n\t\tif (!current_block)\n\t\t\tSPIRV_CROSS_THROW(\"Trying to end a non-existing block.\");\n\n\t\tcurrent_block->condition = ops[0];\n\t\tcurrent_block->true_block = ops[1];\n\t\tcurrent_block->false_block = ops[2];\n\n\t\tcurrent_block->terminator = SPIRBlock::Select;\n\n\t\tif (current_block->true_block == current_block->false_block)\n\t\t{\n\t\t\t// Bogus conditional, translate to a direct branch.\n\t\t\t// Avoids some ugly edge cases later when analyzing CFGs.\n\n\t\t\t// There are some super jank cases where the merge block is different from the true/false,\n\t\t\t// and later branches can \"break\" out of the selection construct this way.\n\t\t\t// This is complete nonsense, but CTS hits this case.\n\t\t\t// In this scenario, we should see the selection construct as more of a Switch with one default case.\n\t\t\t// The problem here is that this breaks any attempt to break out of outer switch statements,\n\t\t\t// but it's theoretically solvable if this ever comes up using the ladder breaking system ...\n\n\t\t\tif (current_block->true_block != current_block->next_block &&\n\t\t\t    current_block->merge == SPIRBlock::MergeSelection)\n\t\t\t{\n\t\t\t\tuint32_t ids = ir.increase_bound_by(2);\n\n\t\t\t\tauto &type = set<SPIRType>(ids, OpTypeInt);\n\t\t\t\ttype.basetype = SPIRType::Int;\n\t\t\t\ttype.width = 32;\n\t\t\t\tauto &c = set<SPIRConstant>(ids + 1, ids);\n\n\t\t\t\tcurrent_block->condition = c.self;\n\t\t\t\tcurrent_block->default_block = current_block->true_block;\n\t\t\t\tcurrent_block->terminator = SPIRBlock::MultiSelect;\n\t\t\t\tir.block_meta[current_block->next_block] &= ~ParsedIR::BLOCK_META_SELECTION_MERGE_BIT;\n\t\t\t\tir.block_meta[current_block->next_block] |= ParsedIR::BLOCK_META_MULTISELECT_MERGE_BIT;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Collapse loops if we have to.\n\t\t\t\tbool collapsed_loop = current_block->true_block == current_block->merge_block &&\n\t\t\t\t                      current_block->merge == SPIRBlock::MergeLoop;\n\n\t\t\t\tif (collapsed_loop)\n\t\t\t\t{\n\t\t\t\t\tir.block_meta[current_block->merge_block] &= ~ParsedIR::BLOCK_META_LOOP_MERGE_BIT;\n\t\t\t\t\tir.block_meta[current_block->continue_block] &= ~ParsedIR::BLOCK_META_CONTINUE_BIT;\n\t\t\t\t}\n\n\t\t\t\tcurrent_block->next_block = current_block->true_block;\n\t\t\t\tcurrent_block->condition = 0;\n\t\t\t\tcurrent_block->true_block = 0;\n\t\t\t\tcurrent_block->false_block = 0;\n\t\t\t\tcurrent_block->merge_block = 0;\n\t\t\t\tcurrent_block->merge = SPIRBlock::MergeNone;\n\t\t\t\tcurrent_block->terminator = SPIRBlock::Direct;\n\t\t\t}\n\t\t}\n\n\t\tcurrent_block = nullptr;\n\t\tbreak;\n\t}\n\n\tcase OpSwitch:\n\t{\n\t\tif (!current_block)\n\t\t\tSPIRV_CROSS_THROW(\"Trying to end a non-existing block.\");\n\n\t\tcurrent_block->terminator = SPIRBlock::MultiSelect;\n\n\t\tcurrent_block->condition = ops[0];\n\t\tcurrent_block->default_block = ops[1];\n\n\t\tuint32_t remaining_ops = length - 2;\n\t\tif ((remaining_ops % 2) == 0)\n\t\t{\n\t\t\tfor (uint32_t i = 2; i + 2 <= length; i += 2)\n\t\t\t\tcurrent_block->cases_32bit.push_back({ ops[i], ops[i + 1] });\n\t\t}\n\n\t\tif ((remaining_ops % 3) == 0)\n\t\t{\n\t\t\tfor (uint32_t i = 2; i + 3 <= length; i += 3)\n\t\t\t{\n\t\t\t\tuint64_t value = (static_cast<uint64_t>(ops[i + 1]) << 32) | ops[i];\n\t\t\t\tcurrent_block->cases_64bit.push_back({ value, ops[i + 2] });\n\t\t\t}\n\t\t}\n\n\t\t// If we jump to next block, make it break instead since we're inside a switch case block at that point.\n\t\tir.block_meta[current_block->next_block] |= ParsedIR::BLOCK_META_MULTISELECT_MERGE_BIT;\n\n\t\tcurrent_block = nullptr;\n\t\tbreak;\n\t}\n\n\tcase OpKill:\n\tcase OpTerminateInvocation:\n\t{\n\t\tif (!current_block)\n\t\t\tSPIRV_CROSS_THROW(\"Trying to end a non-existing block.\");\n\t\tcurrent_block->terminator = SPIRBlock::Kill;\n\t\tcurrent_block = nullptr;\n\t\tbreak;\n\t}\n\n\tcase OpTerminateRayKHR:\n\t\t// NV variant is not a terminator.\n\t\tif (!current_block)\n\t\t\tSPIRV_CROSS_THROW(\"Trying to end a non-existing block.\");\n\t\tcurrent_block->terminator = SPIRBlock::TerminateRay;\n\t\tcurrent_block = nullptr;\n\t\tbreak;\n\n\tcase OpIgnoreIntersectionKHR:\n\t\t// NV variant is not a terminator.\n\t\tif (!current_block)\n\t\t\tSPIRV_CROSS_THROW(\"Trying to end a non-existing block.\");\n\t\tcurrent_block->terminator = SPIRBlock::IgnoreIntersection;\n\t\tcurrent_block = nullptr;\n\t\tbreak;\n\n\tcase OpEmitMeshTasksEXT:\n\t\tif (!current_block)\n\t\t\tSPIRV_CROSS_THROW(\"Trying to end a non-existing block.\");\n\t\tcurrent_block->terminator = SPIRBlock::EmitMeshTasks;\n\t\tfor (uint32_t i = 0; i < 3; i++)\n\t\t\tcurrent_block->mesh.groups[i] = ops[i];\n\t\tcurrent_block->mesh.payload = length >= 4 ? ops[3] : 0;\n\t\tcurrent_block = nullptr;\n\t\t// Currently glslang is bugged and does not treat EmitMeshTasksEXT as a terminator.\n\t\tignore_trailing_block_opcodes = true;\n\t\tbreak;\n\n\tcase OpReturn:\n\t{\n\t\tif (!current_block)\n\t\t\tSPIRV_CROSS_THROW(\"Trying to end a non-existing block.\");\n\t\tcurrent_block->terminator = SPIRBlock::Return;\n\t\tcurrent_block = nullptr;\n\t\tbreak;\n\t}\n\n\tcase OpReturnValue:\n\t{\n\t\tif (!current_block)\n\t\t\tSPIRV_CROSS_THROW(\"Trying to end a non-existing block.\");\n\t\tcurrent_block->terminator = SPIRBlock::Return;\n\t\tcurrent_block->return_value = ops[0];\n\t\tcurrent_block = nullptr;\n\t\tbreak;\n\t}\n\n\tcase OpUnreachable:\n\t{\n\t\tif (!current_block)\n\t\t\tSPIRV_CROSS_THROW(\"Trying to end a non-existing block.\");\n\t\tcurrent_block->terminator = SPIRBlock::Unreachable;\n\t\tcurrent_block = nullptr;\n\t\tbreak;\n\t}\n\n\tcase OpSelectionMerge:\n\t{\n\t\tif (!current_block)\n\t\t\tSPIRV_CROSS_THROW(\"Trying to modify a non-existing block.\");\n\n\t\tcurrent_block->next_block = ops[0];\n\t\tcurrent_block->merge = SPIRBlock::MergeSelection;\n\t\tir.block_meta[current_block->next_block] |= ParsedIR::BLOCK_META_SELECTION_MERGE_BIT;\n\n\t\tif (length >= 2)\n\t\t{\n\t\t\tif (ops[1] & SelectionControlFlattenMask)\n\t\t\t\tcurrent_block->hint = SPIRBlock::HintFlatten;\n\t\t\telse if (ops[1] & SelectionControlDontFlattenMask)\n\t\t\t\tcurrent_block->hint = SPIRBlock::HintDontFlatten;\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpLoopMerge:\n\t{\n\t\tif (!current_block)\n\t\t\tSPIRV_CROSS_THROW(\"Trying to modify a non-existing block.\");\n\n\t\tcurrent_block->merge_block = ops[0];\n\t\tcurrent_block->continue_block = ops[1];\n\t\tcurrent_block->merge = SPIRBlock::MergeLoop;\n\n\t\tir.block_meta[current_block->self] |= ParsedIR::BLOCK_META_LOOP_HEADER_BIT;\n\t\tir.block_meta[current_block->merge_block] |= ParsedIR::BLOCK_META_LOOP_MERGE_BIT;\n\n\t\tir.continue_block_to_loop_header[current_block->continue_block] = BlockID(current_block->self);\n\n\t\t// Don't add loop headers to continue blocks,\n\t\t// which would make it impossible branch into the loop header since\n\t\t// they are treated as continues.\n\t\tif (current_block->continue_block != BlockID(current_block->self))\n\t\t\tir.block_meta[current_block->continue_block] |= ParsedIR::BLOCK_META_CONTINUE_BIT;\n\n\t\tif (length >= 3)\n\t\t{\n\t\t\tif (ops[2] & LoopControlUnrollMask)\n\t\t\t\tcurrent_block->hint = SPIRBlock::HintUnroll;\n\t\t\telse if (ops[2] & LoopControlDontUnrollMask)\n\t\t\t\tcurrent_block->hint = SPIRBlock::HintDontUnroll;\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpSpecConstantOp:\n\t{\n\t\tif (length < 3)\n\t\t\tSPIRV_CROSS_THROW(\"OpSpecConstantOp not enough arguments.\");\n\n\t\tuint32_t result_type = ops[0];\n\t\tuint32_t id = ops[1];\n\t\tauto spec_op = static_cast<Op>(ops[2]);\n\n\t\tset<SPIRConstantOp>(id, result_type, spec_op, ops + 3, length - 3);\n\t\tbreak;\n\t}\n\n\tcase OpLine:\n\t{\n\t\t// OpLine might come at global scope, but we don't care about those since they will not be declared in any\n\t\t// meaningful correct order.\n\t\t// Ignore all OpLine directives which live outside a function.\n\t\tif (current_block)\n\t\t\tcurrent_block->ops.push_back(instruction);\n\n\t\t// Line directives may arrive before first OpLabel.\n\t\t// Treat this as the line of the function declaration,\n\t\t// so warnings for arguments can propagate properly.\n\t\tif (current_function)\n\t\t{\n\t\t\t// Store the first one we find and emit it before creating the function prototype.\n\t\t\tif (current_function->entry_line.file_id == 0)\n\t\t\t{\n\t\t\t\tcurrent_function->entry_line.file_id = ops[0];\n\t\t\t\tcurrent_function->entry_line.line_literal = ops[1];\n\t\t\t}\n\t\t}\n\t\tbreak;\n\t}\n\n\tcase OpNoLine:\n\t{\n\t\t// OpNoLine might come at global scope.\n\t\tif (current_block)\n\t\t\tcurrent_block->ops.push_back(instruction);\n\t\tbreak;\n\t}\n\n\t// Actual opcodes.\n\tdefault:\n\t{\n\t\tif (length >= 2)\n\t\t{\n\t\t\tconst auto *type = maybe_get<SPIRType>(ops[0]);\n\t\t\tif (type)\n\t\t\t\tir.load_type_width.insert({ ops[1], type->width });\n\t\t}\n\n\t\tif (!current_block)\n\t\t\tSPIRV_CROSS_THROW(\"Currently no block to insert opcode.\");\n\n\t\tcurrent_block->ops.push_back(instruction);\n\t\tbreak;\n\t}\n\t}\n}\n\nbool Parser::types_are_logically_equivalent(const SPIRType &a, const SPIRType &b) const\n{\n\tif (a.basetype != b.basetype)\n\t\treturn false;\n\tif (a.width != b.width)\n\t\treturn false;\n\tif (a.vecsize != b.vecsize)\n\t\treturn false;\n\tif (a.columns != b.columns)\n\t\treturn false;\n\tif (a.array.size() != b.array.size())\n\t\treturn false;\n\n\tsize_t array_count = a.array.size();\n\tif (array_count && memcmp(a.array.data(), b.array.data(), array_count * sizeof(uint32_t)) != 0)\n\t\treturn false;\n\n\tif (a.basetype == SPIRType::Image || a.basetype == SPIRType::SampledImage)\n\t{\n\t\tif (memcmp(&a.image, &b.image, sizeof(SPIRType::Image)) != 0)\n\t\t\treturn false;\n\t}\n\n\tif (a.member_types.size() != b.member_types.size())\n\t\treturn false;\n\n\tsize_t member_types = a.member_types.size();\n\tfor (size_t i = 0; i < member_types; i++)\n\t{\n\t\tif (!types_are_logically_equivalent(get<SPIRType>(a.member_types[i]), get<SPIRType>(b.member_types[i])))\n\t\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nbool Parser::variable_storage_is_aliased(const SPIRVariable &v) const\n{\n\tauto &type = get<SPIRType>(v.basetype);\n\n\tauto *type_meta = ir.find_meta(type.self);\n\n\tbool ssbo = v.storage == StorageClassStorageBuffer ||\n\t            (type_meta && type_meta->decoration.decoration_flags.get(DecorationBufferBlock));\n\tbool image = type.basetype == SPIRType::Image;\n\tbool counter = type.basetype == SPIRType::AtomicCounter;\n\n\tbool is_restrict;\n\tif (ssbo)\n\t\tis_restrict = ir.get_buffer_block_flags(v).get(DecorationRestrict);\n\telse\n\t\tis_restrict = ir.has_decoration(v.self, DecorationRestrict);\n\n\treturn !is_restrict && (ssbo || image || counter);\n}\n} // namespace SPIRV_CROSS_NAMESPACE\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv_parser.hpp",
    "content": "/*\n * Copyright 2018-2021 Arm Limited\n * SPDX-License-Identifier: Apache-2.0 OR MIT\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * At your option, you may choose to accept this material under either:\n *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or\n *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.\n */\n\n#ifndef SPIRV_CROSS_PARSER_HPP\n#define SPIRV_CROSS_PARSER_HPP\n\n#include \"spirv_cross_parsed_ir.hpp\"\n#include <stdint.h>\n\nnamespace SPIRV_CROSS_NAMESPACE\n{\nclass Parser\n{\npublic:\n\tParser(const uint32_t *spirv_data, size_t word_count);\n\tParser(std::vector<uint32_t> spirv);\n\n\tvoid parse();\n\n\tParsedIR &get_parsed_ir()\n\t{\n\t\treturn ir;\n\t}\n\nprivate:\n\tParsedIR ir;\n\tSPIRFunction *current_function = nullptr;\n\tSPIRBlock *current_block = nullptr;\n\t// For workarounds.\n\tbool ignore_trailing_block_opcodes = false;\n\n\tvoid parse(const Instruction &instr);\n\tconst uint32_t *stream(const Instruction &instr) const;\n\n\ttemplate <typename T, typename... P>\n\tT &set(uint32_t id, P &&... args)\n\t{\n\t\tir.add_typed_id(static_cast<Types>(T::type), id);\n\t\tauto &var = variant_set<T>(ir.ids[id], std::forward<P>(args)...);\n\t\tvar.self = id;\n\t\treturn var;\n\t}\n\n\ttemplate <typename T>\n\tT &get(uint32_t id)\n\t{\n\t\treturn variant_get<T>(ir.ids[id]);\n\t}\n\n\ttemplate <typename T>\n\tT *maybe_get(uint32_t id)\n\t{\n\t\tif (ir.ids[id].get_type() == static_cast<Types>(T::type))\n\t\t\treturn &get<T>(id);\n\t\telse\n\t\t\treturn nullptr;\n\t}\n\n\ttemplate <typename T>\n\tconst T &get(uint32_t id) const\n\t{\n\t\treturn variant_get<T>(ir.ids[id]);\n\t}\n\n\ttemplate <typename T>\n\tconst T *maybe_get(uint32_t id) const\n\t{\n\t\tif (ir.ids[id].get_type() == T::type)\n\t\t\treturn &get<T>(id);\n\t\telse\n\t\t\treturn nullptr;\n\t}\n\n\t// This must be an ordered data structure so we always pick the same type aliases.\n\tSmallVector<uint32_t> global_struct_cache;\n\tSmallVector<std::pair<uint32_t, uint32_t>> forward_pointer_fixups;\n\n\tbool types_are_logically_equivalent(const SPIRType &a, const SPIRType &b) const;\n\tbool variable_storage_is_aliased(const SPIRVariable &v) const;\n};\n} // namespace SPIRV_CROSS_NAMESPACE\n\n#endif\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv_reflect.cpp",
    "content": "/*\n * Copyright 2018-2021 Bradley Austin Davis\n * SPDX-License-Identifier: Apache-2.0 OR MIT\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * At your option, you may choose to accept this material under either:\n *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or\n *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.\n */\n\n#include \"spirv_reflect.hpp\"\n#include \"spirv_glsl.hpp\"\n#include <iomanip>\n\nusing namespace spv;\nusing namespace SPIRV_CROSS_NAMESPACE;\nusing namespace std;\n\nnamespace simple_json\n{\nenum class Type\n{\n\tObject,\n\tArray,\n};\n\nusing State = std::pair<Type, bool>;\nusing Stack = std::stack<State>;\n\nclass Stream\n{\n\tStack stack;\n\tStringStream<> buffer;\n\tuint32_t indent{ 0 };\n\tchar current_locale_radix_character = '.';\n\npublic:\n\tvoid set_current_locale_radix_character(char c)\n\t{\n\t\tcurrent_locale_radix_character = c;\n\t}\n\n\tvoid begin_json_object();\n\tvoid end_json_object();\n\tvoid emit_json_key(const std::string &key);\n\tvoid emit_json_key_value(const std::string &key, const std::string &value);\n\tvoid emit_json_key_value(const std::string &key, bool value);\n\tvoid emit_json_key_value(const std::string &key, uint32_t value);\n\tvoid emit_json_key_value(const std::string &key, int32_t value);\n\tvoid emit_json_key_value(const std::string &key, float value);\n\tvoid emit_json_key_object(const std::string &key);\n\tvoid emit_json_key_array(const std::string &key);\n\n\tvoid begin_json_array();\n\tvoid end_json_array();\n\tvoid emit_json_array_value(const std::string &value);\n\tvoid emit_json_array_value(uint32_t value);\n\tvoid emit_json_array_value(bool value);\n\n\tstd::string str() const\n\t{\n\t\treturn buffer.str();\n\t}\n\nprivate:\n\tinline void statement_indent()\n\t{\n\t\tfor (uint32_t i = 0; i < indent; i++)\n\t\t\tbuffer << \"    \";\n\t}\n\n\ttemplate <typename T>\n\tinline void statement_inner(T &&t)\n\t{\n\t\tbuffer << std::forward<T>(t);\n\t}\n\n\ttemplate <typename T, typename... Ts>\n\tinline void statement_inner(T &&t, Ts &&... ts)\n\t{\n\t\tbuffer << std::forward<T>(t);\n\t\tstatement_inner(std::forward<Ts>(ts)...);\n\t}\n\n\ttemplate <typename... Ts>\n\tinline void statement(Ts &&... ts)\n\t{\n\t\tstatement_indent();\n\t\tstatement_inner(std::forward<Ts>(ts)...);\n\t\tbuffer << '\\n';\n\t}\n\n\ttemplate <typename... Ts>\n\tvoid statement_no_return(Ts &&... ts)\n\t{\n\t\tstatement_indent();\n\t\tstatement_inner(std::forward<Ts>(ts)...);\n\t}\n};\n} // namespace simple_json\n\nusing namespace simple_json;\n\n// Hackery to emit JSON without using nlohmann/json C++ library (which requires a\n// higher level of compiler compliance than is required by SPIRV-Cross\nvoid Stream::begin_json_array()\n{\n\tif (!stack.empty() && stack.top().second)\n\t{\n\t\tstatement_inner(\",\\n\");\n\t}\n\tstatement(\"[\");\n\t++indent;\n\tstack.emplace(Type::Array, false);\n}\n\nvoid Stream::end_json_array()\n{\n\tif (stack.empty() || stack.top().first != Type::Array)\n\t\tSPIRV_CROSS_THROW(\"Invalid JSON state\");\n\tif (stack.top().second)\n\t{\n\t\tstatement_inner(\"\\n\");\n\t}\n\t--indent;\n\tstatement_no_return(\"]\");\n\tstack.pop();\n\tif (!stack.empty())\n\t{\n\t\tstack.top().second = true;\n\t}\n}\n\nvoid Stream::emit_json_array_value(const std::string &value)\n{\n\tif (stack.empty() || stack.top().first != Type::Array)\n\t\tSPIRV_CROSS_THROW(\"Invalid JSON state\");\n\n\tif (stack.top().second)\n\t\tstatement_inner(\",\\n\");\n\n\tstatement_no_return(\"\\\"\", value, \"\\\"\");\n\tstack.top().second = true;\n}\n\nvoid Stream::emit_json_array_value(uint32_t value)\n{\n\tif (stack.empty() || stack.top().first != Type::Array)\n\t\tSPIRV_CROSS_THROW(\"Invalid JSON state\");\n\tif (stack.top().second)\n\t\tstatement_inner(\",\\n\");\n\tstatement_no_return(std::to_string(value));\n\tstack.top().second = true;\n}\n\nvoid Stream::emit_json_array_value(bool value)\n{\n\tif (stack.empty() || stack.top().first != Type::Array)\n\t\tSPIRV_CROSS_THROW(\"Invalid JSON state\");\n\tif (stack.top().second)\n\t\tstatement_inner(\",\\n\");\n\tstatement_no_return(value ? \"true\" : \"false\");\n\tstack.top().second = true;\n}\n\nvoid Stream::begin_json_object()\n{\n\tif (!stack.empty() && stack.top().second)\n\t{\n\t\tstatement_inner(\",\\n\");\n\t}\n\tstatement(\"{\");\n\t++indent;\n\tstack.emplace(Type::Object, false);\n}\n\nvoid Stream::end_json_object()\n{\n\tif (stack.empty() || stack.top().first != Type::Object)\n\t\tSPIRV_CROSS_THROW(\"Invalid JSON state\");\n\tif (stack.top().second)\n\t{\n\t\tstatement_inner(\"\\n\");\n\t}\n\t--indent;\n\tstatement_no_return(\"}\");\n\tstack.pop();\n\tif (!stack.empty())\n\t{\n\t\tstack.top().second = true;\n\t}\n}\n\nvoid Stream::emit_json_key(const std::string &key)\n{\n\tif (stack.empty() || stack.top().first != Type::Object)\n\t\tSPIRV_CROSS_THROW(\"Invalid JSON state\");\n\n\tif (stack.top().second)\n\t\tstatement_inner(\",\\n\");\n\tstatement_no_return(\"\\\"\", key, \"\\\" : \");\n\tstack.top().second = true;\n}\n\nvoid Stream::emit_json_key_value(const std::string &key, const std::string &value)\n{\n\temit_json_key(key);\n\tstatement_inner(\"\\\"\", value, \"\\\"\");\n}\n\nvoid Stream::emit_json_key_value(const std::string &key, uint32_t value)\n{\n\temit_json_key(key);\n\tstatement_inner(value);\n}\n\nvoid Stream::emit_json_key_value(const std::string &key, int32_t value)\n{\n\temit_json_key(key);\n\tstatement_inner(value);\n}\n\nvoid Stream::emit_json_key_value(const std::string &key, float value)\n{\n\temit_json_key(key);\n\tstatement_inner(convert_to_string(value, current_locale_radix_character));\n}\n\nvoid Stream::emit_json_key_value(const std::string &key, bool value)\n{\n\temit_json_key(key);\n\tstatement_inner(value ? \"true\" : \"false\");\n}\n\nvoid Stream::emit_json_key_object(const std::string &key)\n{\n\temit_json_key(key);\n\tstatement_inner(\"{\\n\");\n\t++indent;\n\tstack.emplace(Type::Object, false);\n}\n\nvoid Stream::emit_json_key_array(const std::string &key)\n{\n\temit_json_key(key);\n\tstatement_inner(\"[\\n\");\n\t++indent;\n\tstack.emplace(Type::Array, false);\n}\n\nvoid CompilerReflection::set_format(const std::string &format)\n{\n\tif (format != \"json\")\n\t{\n\t\tSPIRV_CROSS_THROW(\"Unsupported format\");\n\t}\n}\n\nstring CompilerReflection::compile()\n{\n\tjson_stream = std::make_shared<simple_json::Stream>();\n\tjson_stream->set_current_locale_radix_character(current_locale_radix_character);\n\tjson_stream->begin_json_object();\n\treorder_type_alias();\n\temit_entry_points();\n\temit_types();\n\temit_resources();\n\temit_specialization_constants();\n\tjson_stream->end_json_object();\n\treturn json_stream->str();\n}\n\nstatic bool naturally_emit_type(const SPIRType &type)\n{\n\treturn type.basetype == SPIRType::Struct && !type.pointer && type.array.empty();\n}\n\nbool CompilerReflection::type_is_reference(const SPIRType &type) const\n{\n\t// Physical pointers and arrays of physical pointers need to refer to the pointee's type.\n\treturn is_physical_pointer(type) ||\n\t       (type_is_array_of_pointers(type) && type.storage == StorageClassPhysicalStorageBuffer);\n}\n\nvoid CompilerReflection::emit_types()\n{\n\tbool emitted_open_tag = false;\n\n\tSmallVector<uint32_t> physical_pointee_types;\n\n\t// If we have physical pointers or arrays of physical pointers, it's also helpful to emit the pointee type\n\t// and chain the type hierarchy. For POD, arrays can emit the entire type in-place.\n\tir.for_each_typed_id<SPIRType>([&](uint32_t self, SPIRType &type) {\n\t\tif (naturally_emit_type(type))\n\t\t{\n\t\t\temit_type(self, emitted_open_tag);\n\t\t}\n\t\telse if (type_is_reference(type))\n\t\t{\n\t\t\tif (!naturally_emit_type(this->get<SPIRType>(type.parent_type)) &&\n\t\t\t    find(physical_pointee_types.begin(), physical_pointee_types.end(), type.parent_type) ==\n\t\t\t        physical_pointee_types.end())\n\t\t\t{\n\t\t\t\tphysical_pointee_types.push_back(type.parent_type);\n\t\t\t}\n\t\t}\n\t});\n\n\tfor (uint32_t pointee_type : physical_pointee_types)\n\t\temit_type(pointee_type, emitted_open_tag);\n\n\tif (emitted_open_tag)\n\t{\n\t\tjson_stream->end_json_object();\n\t}\n}\n\nvoid CompilerReflection::emit_type(uint32_t type_id, bool &emitted_open_tag)\n{\n\tauto &type = get<SPIRType>(type_id);\n\tauto name = type_to_glsl(type);\n\n\tif (!emitted_open_tag)\n\t{\n\t\tjson_stream->emit_json_key_object(\"types\");\n\t\temitted_open_tag = true;\n\t}\n\tjson_stream->emit_json_key_object(\"_\" + std::to_string(type_id));\n\tjson_stream->emit_json_key_value(\"name\", name);\n\n\tif (is_physical_pointer(type))\n\t{\n\t\tjson_stream->emit_json_key_value(\"type\", \"_\" + std::to_string(type.parent_type));\n\t\tjson_stream->emit_json_key_value(\"physical_pointer\", true);\n\t}\n\telse if (!type.array.empty())\n\t{\n\t\temit_type_array(type);\n\t\tjson_stream->emit_json_key_value(\"type\", \"_\" + std::to_string(type.parent_type));\n\t\tjson_stream->emit_json_key_value(\"array_stride\", get_decoration(type_id, DecorationArrayStride));\n\t}\n\telse\n\t{\n\t\tjson_stream->emit_json_key_array(\"members\");\n\t\t// FIXME ideally we'd like to emit the size of a structure as a\n\t\t// convenience to people parsing the reflected JSON.  The problem\n\t\t// is that there's no implicit size for a type.  It's final size\n\t\t// will be determined by the top level declaration in which it's\n\t\t// included.  So there might be one size for the struct if it's\n\t\t// included in a std140 uniform block and another if it's included\n\t\t// in a std430 uniform block.\n\t\t// The solution is to include *all* potential sizes as a map of\n\t\t// layout type name to integer, but that will probably require\n\t\t// some additional logic being written in this class, or in the\n\t\t// parent CompilerGLSL class.\n\t\tauto size = type.member_types.size();\n\t\tfor (uint32_t i = 0; i < size; ++i)\n\t\t{\n\t\t\temit_type_member(type, i);\n\t\t}\n\t\tjson_stream->end_json_array();\n\t}\n\n\tjson_stream->end_json_object();\n}\n\nvoid CompilerReflection::emit_type_member(const SPIRType &type, uint32_t index)\n{\n\tauto &membertype = get<SPIRType>(type.member_types[index]);\n\tjson_stream->begin_json_object();\n\tauto name = to_member_name(type, index);\n\t// FIXME we'd like to emit the offset of each member, but such offsets are\n\t// context dependent.  See the comment above regarding structure sizes\n\tjson_stream->emit_json_key_value(\"name\", name);\n\n\tif (type_is_reference(membertype))\n\t{\n\t\tjson_stream->emit_json_key_value(\"type\", \"_\" + std::to_string(membertype.parent_type));\n\t}\n\telse if (membertype.basetype == SPIRType::Struct)\n\t{\n\t\tjson_stream->emit_json_key_value(\"type\", \"_\" + std::to_string(membertype.self));\n\t}\n\telse\n\t{\n\t\tjson_stream->emit_json_key_value(\"type\", type_to_glsl(membertype));\n\t}\n\temit_type_member_qualifiers(type, index);\n\tjson_stream->end_json_object();\n}\n\nvoid CompilerReflection::emit_type_array(const SPIRType &type)\n{\n\tif (!is_physical_pointer(type) && !type.array.empty())\n\t{\n\t\tjson_stream->emit_json_key_array(\"array\");\n\t\t// Note that we emit the zeros here as a means of identifying\n\t\t// unbounded arrays.  This is necessary as otherwise there would\n\t\t// be no way of differentiating between float[4] and float[4][]\n\t\tfor (const auto &value : type.array)\n\t\t\tjson_stream->emit_json_array_value(value);\n\t\tjson_stream->end_json_array();\n\n\t\tjson_stream->emit_json_key_array(\"array_size_is_literal\");\n\t\tfor (const auto &value : type.array_size_literal)\n\t\t\tjson_stream->emit_json_array_value(value);\n\t\tjson_stream->end_json_array();\n\t}\n}\n\nvoid CompilerReflection::emit_type_member_qualifiers(const SPIRType &type, uint32_t index)\n{\n\tauto &membertype = get<SPIRType>(type.member_types[index]);\n\temit_type_array(membertype);\n\tauto &memb = ir.meta[type.self].members;\n\tif (index < memb.size())\n\t{\n\t\tauto &dec = memb[index];\n\t\tif (dec.decoration_flags.get(DecorationLocation))\n\t\t\tjson_stream->emit_json_key_value(\"location\", dec.location);\n\t\tif (dec.decoration_flags.get(DecorationOffset))\n\t\t\tjson_stream->emit_json_key_value(\"offset\", dec.offset);\n\n\t\t// Array stride is a property of the array type, not the struct.\n\t\tif (has_decoration(type.member_types[index], DecorationArrayStride))\n\t\t\tjson_stream->emit_json_key_value(\"array_stride\",\n\t\t\t                                 get_decoration(type.member_types[index], DecorationArrayStride));\n\n\t\tif (dec.decoration_flags.get(DecorationMatrixStride))\n\t\t\tjson_stream->emit_json_key_value(\"matrix_stride\", dec.matrix_stride);\n\t\tif (dec.decoration_flags.get(DecorationRowMajor))\n\t\t\tjson_stream->emit_json_key_value(\"row_major\", true);\n\n\t\tif (is_physical_pointer(membertype))\n\t\t\tjson_stream->emit_json_key_value(\"physical_pointer\", true);\n\t}\n}\n\nstring CompilerReflection::execution_model_to_str(spv::ExecutionModel model)\n{\n\tswitch (model)\n\t{\n\tcase ExecutionModelVertex:\n\t\treturn \"vert\";\n\tcase ExecutionModelTessellationControl:\n\t\treturn \"tesc\";\n\tcase ExecutionModelTessellationEvaluation:\n\t\treturn \"tese\";\n\tcase ExecutionModelGeometry:\n\t\treturn \"geom\";\n\tcase ExecutionModelFragment:\n\t\treturn \"frag\";\n\tcase ExecutionModelGLCompute:\n\t\treturn \"comp\";\n\tcase ExecutionModelRayGenerationNV:\n\t\treturn \"rgen\";\n\tcase ExecutionModelIntersectionNV:\n\t\treturn \"rint\";\n\tcase ExecutionModelAnyHitNV:\n\t\treturn \"rahit\";\n\tcase ExecutionModelClosestHitNV:\n\t\treturn \"rchit\";\n\tcase ExecutionModelMissNV:\n\t\treturn \"rmiss\";\n\tcase ExecutionModelCallableNV:\n\t\treturn \"rcall\";\n\tdefault:\n\t\treturn \"???\";\n\t}\n}\n\n// FIXME include things like the local_size dimensions, geometry output vertex count, etc\nvoid CompilerReflection::emit_entry_points()\n{\n\tauto entries = get_entry_points_and_stages();\n\tif (!entries.empty())\n\t{\n\t\t// Needed to make output deterministic.\n\t\tsort(begin(entries), end(entries), [](const EntryPoint &a, const EntryPoint &b) -> bool {\n\t\t\tif (a.execution_model < b.execution_model)\n\t\t\t\treturn true;\n\t\t\telse if (a.execution_model > b.execution_model)\n\t\t\t\treturn false;\n\t\t\telse\n\t\t\t\treturn a.name < b.name;\n\t\t});\n\n\t\tjson_stream->emit_json_key_array(\"entryPoints\");\n\t\tfor (auto &e : entries)\n\t\t{\n\t\t\tjson_stream->begin_json_object();\n\t\t\tjson_stream->emit_json_key_value(\"name\", e.name);\n\t\t\tjson_stream->emit_json_key_value(\"mode\", execution_model_to_str(e.execution_model));\n\t\t\tif (e.execution_model == ExecutionModelGLCompute)\n\t\t\t{\n\t\t\t\tconst auto &spv_entry = get_entry_point(e.name, e.execution_model);\n\n\t\t\t\tSpecializationConstant spec_x, spec_y, spec_z;\n\t\t\t\tget_work_group_size_specialization_constants(spec_x, spec_y, spec_z);\n\n\t\t\t\tjson_stream->emit_json_key_array(\"workgroup_size\");\n\t\t\t\tjson_stream->emit_json_array_value(spec_x.id != ID(0) ? spec_x.constant_id :\n\t\t\t\t                                                        spv_entry.workgroup_size.x);\n\t\t\t\tjson_stream->emit_json_array_value(spec_y.id != ID(0) ? spec_y.constant_id :\n\t\t\t\t                                                        spv_entry.workgroup_size.y);\n\t\t\t\tjson_stream->emit_json_array_value(spec_z.id != ID(0) ? spec_z.constant_id :\n\t\t\t\t                                                        spv_entry.workgroup_size.z);\n\t\t\t\tjson_stream->end_json_array();\n\n\t\t\t\tjson_stream->emit_json_key_array(\"workgroup_size_is_spec_constant_id\");\n\t\t\t\tjson_stream->emit_json_array_value(spec_x.id != ID(0));\n\t\t\t\tjson_stream->emit_json_array_value(spec_y.id != ID(0));\n\t\t\t\tjson_stream->emit_json_array_value(spec_z.id != ID(0));\n\t\t\t\tjson_stream->end_json_array();\n\t\t\t}\n\t\t\tjson_stream->end_json_object();\n\t\t}\n\t\tjson_stream->end_json_array();\n\t}\n}\n\nvoid CompilerReflection::emit_resources()\n{\n\tauto res = get_shader_resources();\n\temit_resources(\"subpass_inputs\", res.subpass_inputs);\n\temit_resources(\"inputs\", res.stage_inputs);\n\temit_resources(\"outputs\", res.stage_outputs);\n\temit_resources(\"textures\", res.sampled_images);\n\temit_resources(\"separate_images\", res.separate_images);\n\temit_resources(\"separate_samplers\", res.separate_samplers);\n\temit_resources(\"images\", res.storage_images);\n\temit_resources(\"ssbos\", res.storage_buffers);\n\temit_resources(\"ubos\", res.uniform_buffers);\n\temit_resources(\"push_constants\", res.push_constant_buffers);\n\temit_resources(\"counters\", res.atomic_counters);\n\temit_resources(\"acceleration_structures\", res.acceleration_structures);\n}\n\nvoid CompilerReflection::emit_resources(const char *tag, const SmallVector<Resource> &resources)\n{\n\tif (resources.empty())\n\t{\n\t\treturn;\n\t}\n\n\tjson_stream->emit_json_key_array(tag);\n\tfor (auto &res : resources)\n\t{\n\t\tauto &type = get_type(res.type_id);\n\t\tauto typeflags = ir.meta[type.self].decoration.decoration_flags;\n\t\tauto &mask = get_decoration_bitset(res.id);\n\n\t\t// If we don't have a name, use the fallback for the type instead of the variable\n\t\t// for SSBOs and UBOs since those are the only meaningful names to use externally.\n\t\t// Push constant blocks are still accessed by name and not block name, even though they are technically Blocks.\n\t\tbool is_push_constant = get_storage_class(res.id) == StorageClassPushConstant;\n\t\tbool is_block = get_decoration_bitset(type.self).get(DecorationBlock) ||\n\t\t                get_decoration_bitset(type.self).get(DecorationBufferBlock);\n\n\t\tID fallback_id = !is_push_constant && is_block ? ID(res.base_type_id) : ID(res.id);\n\n\t\tjson_stream->begin_json_object();\n\n\t\tif (type.basetype == SPIRType::Struct)\n\t\t{\n\t\t\tjson_stream->emit_json_key_value(\"type\", \"_\" + std::to_string(res.base_type_id));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tjson_stream->emit_json_key_value(\"type\", type_to_glsl(type));\n\t\t}\n\n\t\tjson_stream->emit_json_key_value(\"name\", !res.name.empty() ? res.name : get_fallback_name(fallback_id));\n\t\t{\n\t\t\tbool ssbo_block = type.storage == StorageClassStorageBuffer ||\n\t\t\t                  (type.storage == StorageClassUniform && typeflags.get(DecorationBufferBlock));\n\t\t\tBitset qualifier_mask = ssbo_block ? get_buffer_block_flags(res.id) : mask;\n\n\t\t\tif (qualifier_mask.get(DecorationNonReadable))\n\t\t\t\tjson_stream->emit_json_key_value(\"writeonly\", true);\n\t\t\tif (qualifier_mask.get(DecorationNonWritable))\n\t\t\t\tjson_stream->emit_json_key_value(\"readonly\", true);\n\t\t\tif (qualifier_mask.get(DecorationRestrict))\n\t\t\t\tjson_stream->emit_json_key_value(\"restrict\", true);\n\t\t\tif (qualifier_mask.get(DecorationCoherent))\n\t\t\t\tjson_stream->emit_json_key_value(\"coherent\", true);\n\t\t\tif (qualifier_mask.get(DecorationVolatile))\n\t\t\t\tjson_stream->emit_json_key_value(\"volatile\", true);\n\t\t}\n\n\t\temit_type_array(type);\n\n\t\t{\n\t\t\tbool is_sized_block = is_block && (get_storage_class(res.id) == StorageClassUniform ||\n\t\t\t                                   get_storage_class(res.id) == StorageClassUniformConstant ||\n\t\t\t                                   get_storage_class(res.id) == StorageClassStorageBuffer);\n\t\t\tif (is_sized_block)\n\t\t\t{\n\t\t\t\tuint32_t block_size = uint32_t(get_declared_struct_size(get_type(res.base_type_id)));\n\t\t\t\tjson_stream->emit_json_key_value(\"block_size\", block_size);\n\t\t\t}\n\t\t}\n\n\t\tif (type.storage == StorageClassPushConstant)\n\t\t\tjson_stream->emit_json_key_value(\"push_constant\", true);\n\t\tif (mask.get(DecorationLocation))\n\t\t\tjson_stream->emit_json_key_value(\"location\", get_decoration(res.id, DecorationLocation));\n\t\tif (mask.get(DecorationRowMajor))\n\t\t\tjson_stream->emit_json_key_value(\"row_major\", true);\n\t\tif (mask.get(DecorationColMajor))\n\t\t\tjson_stream->emit_json_key_value(\"column_major\", true);\n\t\tif (mask.get(DecorationIndex))\n\t\t\tjson_stream->emit_json_key_value(\"index\", get_decoration(res.id, DecorationIndex));\n\t\tif (type.storage != StorageClassPushConstant && mask.get(DecorationDescriptorSet))\n\t\t\tjson_stream->emit_json_key_value(\"set\", get_decoration(res.id, DecorationDescriptorSet));\n\t\tif (mask.get(DecorationBinding))\n\t\t\tjson_stream->emit_json_key_value(\"binding\", get_decoration(res.id, DecorationBinding));\n\t\tif (mask.get(DecorationInputAttachmentIndex))\n\t\t\tjson_stream->emit_json_key_value(\"input_attachment_index\",\n\t\t\t                                 get_decoration(res.id, DecorationInputAttachmentIndex));\n\t\tif (mask.get(DecorationOffset))\n\t\t\tjson_stream->emit_json_key_value(\"offset\", get_decoration(res.id, DecorationOffset));\n\n\t\t// For images, the type itself adds a layout qualifer.\n\t\t// Only emit the format for storage images.\n\t\tif (type.basetype == SPIRType::Image && type.image.sampled == 2)\n\t\t{\n\t\t\tconst char *fmt = format_to_glsl(type.image.format);\n\t\t\tif (fmt != nullptr)\n\t\t\t\tjson_stream->emit_json_key_value(\"format\", std::string(fmt));\n\t\t}\n\t\tjson_stream->end_json_object();\n\t}\n\tjson_stream->end_json_array();\n}\n\nvoid CompilerReflection::emit_specialization_constants()\n{\n\tauto specialization_constants = get_specialization_constants();\n\tif (specialization_constants.empty())\n\t\treturn;\n\n\tjson_stream->emit_json_key_array(\"specialization_constants\");\n\tfor (const auto &spec_const : specialization_constants)\n\t{\n\t\tauto &c = get<SPIRConstant>(spec_const.id);\n\t\tauto type = get<SPIRType>(c.constant_type);\n\t\tjson_stream->begin_json_object();\n\t\tjson_stream->emit_json_key_value(\"name\", get_name(spec_const.id));\n\t\tjson_stream->emit_json_key_value(\"id\", spec_const.constant_id);\n\t\tjson_stream->emit_json_key_value(\"type\", type_to_glsl(type));\n\t\tjson_stream->emit_json_key_value(\"variable_id\", spec_const.id);\n\t\tswitch (type.basetype)\n\t\t{\n\t\tcase SPIRType::UInt:\n\t\t\tjson_stream->emit_json_key_value(\"default_value\", c.scalar());\n\t\t\tbreak;\n\n\t\tcase SPIRType::Int:\n\t\t\tjson_stream->emit_json_key_value(\"default_value\", c.scalar_i32());\n\t\t\tbreak;\n\n\t\tcase SPIRType::Float:\n\t\t\tjson_stream->emit_json_key_value(\"default_value\", c.scalar_f32());\n\t\t\tbreak;\n\n\t\tcase SPIRType::Boolean:\n\t\t\tjson_stream->emit_json_key_value(\"default_value\", c.scalar() != 0);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\tjson_stream->end_json_object();\n\t}\n\tjson_stream->end_json_array();\n}\n\nstring CompilerReflection::to_member_name(const SPIRType &type, uint32_t index) const\n{\n\tauto *type_meta = ir.find_meta(type.self);\n\n\tif (type_meta)\n\t{\n\t\tauto &memb = type_meta->members;\n\t\tif (index < memb.size() && !memb[index].alias.empty())\n\t\t\treturn memb[index].alias;\n\t\telse\n\t\t\treturn join(\"_m\", index);\n\t}\n\telse\n\t\treturn join(\"_m\", index);\n}\n"
  },
  {
    "path": "src/libraries/spirv_cross/spirv_reflect.hpp",
    "content": "/*\n * Copyright 2018-2021 Bradley Austin Davis\n * SPDX-License-Identifier: Apache-2.0 OR MIT\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * At your option, you may choose to accept this material under either:\n *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or\n *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.\n */\n\n#ifndef SPIRV_CROSS_REFLECT_HPP\n#define SPIRV_CROSS_REFLECT_HPP\n\n#include \"spirv_glsl.hpp\"\n#include <utility>\n\nnamespace simple_json\n{\nclass Stream;\n}\n\nnamespace SPIRV_CROSS_NAMESPACE\n{\nclass CompilerReflection : public CompilerGLSL\n{\n\tusing Parent = CompilerGLSL;\n\npublic:\n\texplicit CompilerReflection(std::vector<uint32_t> spirv_)\n\t    : Parent(std::move(spirv_))\n\t{\n\t\toptions.vulkan_semantics = true;\n\t}\n\n\tCompilerReflection(const uint32_t *ir_, size_t word_count)\n\t    : Parent(ir_, word_count)\n\t{\n\t\toptions.vulkan_semantics = true;\n\t}\n\n\texplicit CompilerReflection(const ParsedIR &ir_)\n\t    : CompilerGLSL(ir_)\n\t{\n\t\toptions.vulkan_semantics = true;\n\t}\n\n\texplicit CompilerReflection(ParsedIR &&ir_)\n\t    : CompilerGLSL(std::move(ir_))\n\t{\n\t\toptions.vulkan_semantics = true;\n\t}\n\n\tvoid set_format(const std::string &format);\n\tstd::string compile() override;\n\nprivate:\n\tstatic std::string execution_model_to_str(spv::ExecutionModel model);\n\n\tvoid emit_entry_points();\n\tvoid emit_types();\n\tvoid emit_resources();\n\tvoid emit_specialization_constants();\n\n\tvoid emit_type(uint32_t type_id, bool &emitted_open_tag);\n\tvoid emit_type_member(const SPIRType &type, uint32_t index);\n\tvoid emit_type_member_qualifiers(const SPIRType &type, uint32_t index);\n\tvoid emit_type_array(const SPIRType &type);\n\tvoid emit_resources(const char *tag, const SmallVector<Resource> &resources);\n\tbool type_is_reference(const SPIRType &type) const;\n\n\tstd::string to_member_name(const SPIRType &type, uint32_t index) const;\n\n\tstd::shared_ptr<simple_json::Stream> json_stream;\n};\n\n} // namespace SPIRV_CROSS_NAMESPACE\n\n#endif\n"
  },
  {
    "path": "src/libraries/stb/stb_image.h",
    "content": "/* stb_image - v2.30 - public domain image loader - http://nothings.org/stb\n                                  no warranty implied; use at your own risk\n\n   Do this:\n      #define STB_IMAGE_IMPLEMENTATION\n   before you include this file in *one* C or C++ file to create the implementation.\n\n   // i.e. it should look like this:\n   #include ...\n   #include ...\n   #include ...\n   #define STB_IMAGE_IMPLEMENTATION\n   #include \"stb_image.h\"\n\n   You can #define STBI_ASSERT(x) before the #include to avoid using assert.h.\n   And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free\n\n\n   QUICK NOTES:\n      Primarily of interest to game developers and other people who can\n          avoid problematic images and only need the trivial interface\n\n      JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib)\n      PNG 1/2/4/8/16-bit-per-channel\n\n      TGA (not sure what subset, if a subset)\n      BMP non-1bpp, non-RLE\n      PSD (composited view only, no extra channels, 8/16 bit-per-channel)\n\n      GIF (*comp always reports as 4-channel)\n      HDR (radiance rgbE format)\n      PIC (Softimage PIC)\n      PNM (PPM and PGM binary only)\n\n      Animated GIF still needs a proper API, but here's one way to do it:\n          http://gist.github.com/urraka/685d9a6340b26b830d49\n\n      - decode from memory or through FILE (define STBI_NO_STDIO to remove code)\n      - decode from arbitrary I/O callbacks\n      - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON)\n\n   Full documentation under \"DOCUMENTATION\" below.\n\n\nLICENSE\n\n  See end of file for license information.\n\nRECENT REVISION HISTORY:\n\n      2.30  (2024-05-31) avoid erroneous gcc warning\n      2.29  (2023-05-xx) optimizations\n      2.28  (2023-01-29) many error fixes, security errors, just tons of stuff\n      2.27  (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes\n      2.26  (2020-07-13) many minor fixes\n      2.25  (2020-02-02) fix warnings\n      2.24  (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically\n      2.23  (2019-08-11) fix clang static analysis warning\n      2.22  (2019-03-04) gif fixes, fix warnings\n      2.21  (2019-02-25) fix typo in comment\n      2.20  (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs\n      2.19  (2018-02-11) fix warning\n      2.18  (2018-01-30) fix warnings\n      2.17  (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings\n      2.16  (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes\n      2.15  (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC\n      2.14  (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs\n      2.13  (2016-12-04) experimental 16-bit API, only for PNG so far; fixes\n      2.12  (2016-04-02) fix typo in 2.11 PSD fix that caused crashes\n      2.11  (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64\n                         RGB-format JPEG; remove white matting in PSD;\n                         allocate large structures on the stack;\n                         correct channel count for PNG & BMP\n      2.10  (2016-01-22) avoid warning introduced in 2.09\n      2.09  (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED\n\n   See end of file for full revision history.\n\n\n ============================    Contributors    =========================\n\n Image formats                          Extensions, features\n    Sean Barrett (jpeg, png, bmp)          Jetro Lauha (stbi_info)\n    Nicolas Schulz (hdr, psd)              Martin \"SpartanJ\" Golini (stbi_info)\n    Jonathan Dummer (tga)                  James \"moose2000\" Brown (iPhone PNG)\n    Jean-Marc Lienher (gif)                Ben \"Disch\" Wenger (io callbacks)\n    Tom Seddon (pic)                       Omar Cornut (1/2/4-bit PNG)\n    Thatcher Ulrich (psd)                  Nicolas Guillemot (vertical flip)\n    Ken Miller (pgm, ppm)                  Richard Mitton (16-bit PSD)\n    github:urraka (animated gif)           Junggon Kim (PNM comments)\n    Christopher Forseth (animated gif)     Daniel Gibson (16-bit TGA)\n                                           socks-the-fox (16-bit PNG)\n                                           Jeremy Sawicki (handle all ImageNet JPGs)\n Optimizations & bugfixes                  Mikhail Morozov (1-bit BMP)\n    Fabian \"ryg\" Giesen                    Anael Seghezzi (is-16-bit query)\n    Arseny Kapoulkine                      Simon Breuss (16-bit PNM)\n    John-Mark Allen\n    Carmelo J Fdez-Aguera\n\n Bug & warning fixes\n    Marc LeBlanc            David Woo          Guillaume George     Martins Mozeiko\n    Christpher Lloyd        Jerry Jansson      Joseph Thomson       Blazej Dariusz Roszkowski\n    Phil Jordan                                Dave Moore           Roy Eltham\n    Hayaki Saito            Nathan Reed        Won Chun\n    Luke Graham             Johan Duparc       Nick Verigakis       the Horde3D community\n    Thomas Ruf              Ronny Chevalier                         github:rlyeh\n    Janez Zemva             John Bartholomew   Michal Cichon        github:romigrou\n    Jonathan Blow           Ken Hamada         Tero Hanninen        github:svdijk\n    Eugene Golushkov        Laurent Gomila     Cort Stratton        github:snagar\n    Aruelien Pocheville     Sergio Gonzalez    Thibault Reuille     github:Zelex\n    Cass Everitt            Ryamond Barbiero                        github:grim210\n    Paul Du Bois            Engin Manap        Aldo Culquicondor    github:sammyhw\n    Philipp Wiesemann       Dale Weiler        Oriol Ferrer Mesia   github:phprus\n    Josh Tobin              Neil Bickford      Matthew Gregan       github:poppolopoppo\n    Julian Raschke          Gregory Mullen     Christian Floisand   github:darealshinji\n    Baldur Karlsson         Kevin Schmidt      JR Smith             github:Michaelangel007\n                            Brad Weinberger    Matvey Cherevko      github:mosra\n    Luca Sas                Alexander Veselov  Zack Middleton       [reserved]\n    Ryan C. Gordon          [reserved]                              [reserved]\n                     DO NOT ADD YOUR NAME HERE\n\n                     Jacko Dirks\n\n  To add your name to the credits, pick a random blank space in the middle and fill it.\n  80% of merge conflicts on stb PRs are due to people adding their name at the end\n  of the credits.\n*/\n\n#ifndef STBI_INCLUDE_STB_IMAGE_H\n#define STBI_INCLUDE_STB_IMAGE_H\n\n// DOCUMENTATION\n//\n// Limitations:\n//    - no 12-bit-per-channel JPEG\n//    - no JPEGs with arithmetic coding\n//    - GIF always returns *comp=4\n//\n// Basic usage (see HDR discussion below for HDR usage):\n//    int x,y,n;\n//    unsigned char *data = stbi_load(filename, &x, &y, &n, 0);\n//    // ... process data if not NULL ...\n//    // ... x = width, y = height, n = # 8-bit components per pixel ...\n//    // ... replace '0' with '1'..'4' to force that many components per pixel\n//    // ... but 'n' will always be the number that it would have been if you said 0\n//    stbi_image_free(data);\n//\n// Standard parameters:\n//    int *x                 -- outputs image width in pixels\n//    int *y                 -- outputs image height in pixels\n//    int *channels_in_file  -- outputs # of image components in image file\n//    int desired_channels   -- if non-zero, # of image components requested in result\n//\n// The return value from an image loader is an 'unsigned char *' which points\n// to the pixel data, or NULL on an allocation failure or if the image is\n// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels,\n// with each pixel consisting of N interleaved 8-bit components; the first\n// pixel pointed to is top-left-most in the image. There is no padding between\n// image scanlines or between pixels, regardless of format. The number of\n// components N is 'desired_channels' if desired_channels is non-zero, or\n// *channels_in_file otherwise. If desired_channels is non-zero,\n// *channels_in_file has the number of components that _would_ have been\n// output otherwise. E.g. if you set desired_channels to 4, you will always\n// get RGBA output, but you can check *channels_in_file to see if it's trivially\n// opaque because e.g. there were only 3 channels in the source image.\n//\n// An output image with N components has the following components interleaved\n// in this order in each pixel:\n//\n//     N=#comp     components\n//       1           grey\n//       2           grey, alpha\n//       3           red, green, blue\n//       4           red, green, blue, alpha\n//\n// If image loading fails for any reason, the return value will be NULL,\n// and *x, *y, *channels_in_file will be unchanged. The function\n// stbi_failure_reason() can be queried for an extremely brief, end-user\n// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS\n// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly\n// more user-friendly ones.\n//\n// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized.\n//\n// To query the width, height and component count of an image without having to\n// decode the full file, you can use the stbi_info family of functions:\n//\n//   int x,y,n,ok;\n//   ok = stbi_info(filename, &x, &y, &n);\n//   // returns ok=1 and sets x, y, n if image is a supported format,\n//   // 0 otherwise.\n//\n// Note that stb_image pervasively uses ints in its public API for sizes,\n// including sizes of memory buffers. This is now part of the API and thus\n// hard to change without causing breakage. As a result, the various image\n// loaders all have certain limits on image size; these differ somewhat\n// by format but generally boil down to either just under 2GB or just under\n// 1GB. When the decoded image would be larger than this, stb_image decoding\n// will fail.\n//\n// Additionally, stb_image will reject image files that have any of their\n// dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS,\n// which defaults to 2**24 = 16777216 pixels. Due to the above memory limit,\n// the only way to have an image with such dimensions load correctly\n// is for it to have a rather extreme aspect ratio. Either way, the\n// assumption here is that such larger images are likely to be malformed\n// or malicious. If you do need to load an image with individual dimensions\n// larger than that, and it still fits in the overall size limit, you can\n// #define STBI_MAX_DIMENSIONS on your own to be something larger.\n//\n// ===========================================================================\n//\n// UNICODE:\n//\n//   If compiling for Windows and you wish to use Unicode filenames, compile\n//   with\n//       #define STBI_WINDOWS_UTF8\n//   and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert\n//   Windows wchar_t filenames to utf8.\n//\n// ===========================================================================\n//\n// Philosophy\n//\n// stb libraries are designed with the following priorities:\n//\n//    1. easy to use\n//    2. easy to maintain\n//    3. good performance\n//\n// Sometimes I let \"good performance\" creep up in priority over \"easy to maintain\",\n// and for best performance I may provide less-easy-to-use APIs that give higher\n// performance, in addition to the easy-to-use ones. Nevertheless, it's important\n// to keep in mind that from the standpoint of you, a client of this library,\n// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all.\n//\n// Some secondary priorities arise directly from the first two, some of which\n// provide more explicit reasons why performance can't be emphasized.\n//\n//    - Portable (\"ease of use\")\n//    - Small source code footprint (\"easy to maintain\")\n//    - No dependencies (\"ease of use\")\n//\n// ===========================================================================\n//\n// I/O callbacks\n//\n// I/O callbacks allow you to read from arbitrary sources, like packaged\n// files or some other source. Data read from callbacks are processed\n// through a small internal buffer (currently 128 bytes) to try to reduce\n// overhead.\n//\n// The three functions you must define are \"read\" (reads some bytes of data),\n// \"skip\" (skips some bytes of data), \"eof\" (reports if the stream is at the end).\n//\n// ===========================================================================\n//\n// SIMD support\n//\n// The JPEG decoder will try to automatically use SIMD kernels on x86 when\n// supported by the compiler. For ARM Neon support, you must explicitly\n// request it.\n//\n// (The old do-it-yourself SIMD API is no longer supported in the current\n// code.)\n//\n// On x86, SSE2 will automatically be used when available based on a run-time\n// test; if not, the generic C versions are used as a fall-back. On ARM targets,\n// the typical path is to have separate builds for NEON and non-NEON devices\n// (at least this is true for iOS and Android). Therefore, the NEON support is\n// toggled by a build flag: define STBI_NEON to get NEON loops.\n//\n// If for some reason you do not want to use any of SIMD code, or if\n// you have issues compiling it, you can disable it entirely by\n// defining STBI_NO_SIMD.\n//\n// ===========================================================================\n//\n// HDR image support   (disable by defining STBI_NO_HDR)\n//\n// stb_image supports loading HDR images in general, and currently the Radiance\n// .HDR file format specifically. You can still load any file through the existing\n// interface; if you attempt to load an HDR file, it will be automatically remapped\n// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;\n// both of these constants can be reconfigured through this interface:\n//\n//     stbi_hdr_to_ldr_gamma(2.2f);\n//     stbi_hdr_to_ldr_scale(1.0f);\n//\n// (note, do not use _inverse_ constants; stbi_image will invert them\n// appropriately).\n//\n// Additionally, there is a new, parallel interface for loading files as\n// (linear) floats to preserve the full dynamic range:\n//\n//    float *data = stbi_loadf(filename, &x, &y, &n, 0);\n//\n// If you load LDR images through this interface, those images will\n// be promoted to floating point values, run through the inverse of\n// constants corresponding to the above:\n//\n//     stbi_ldr_to_hdr_scale(1.0f);\n//     stbi_ldr_to_hdr_gamma(2.2f);\n//\n// Finally, given a filename (or an open file or memory block--see header\n// file for details) containing image data, you can query for the \"most\n// appropriate\" interface to use (that is, whether the image is HDR or\n// not), using:\n//\n//     stbi_is_hdr(char *filename);\n//\n// ===========================================================================\n//\n// iPhone PNG support:\n//\n// We optionally support converting iPhone-formatted PNGs (which store\n// premultiplied BGRA) back to RGB, even though they're internally encoded\n// differently. To enable this conversion, call\n// stbi_convert_iphone_png_to_rgb(1).\n//\n// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per\n// pixel to remove any premultiplied alpha *only* if the image file explicitly\n// says there's premultiplied data (currently only happens in iPhone images,\n// and only if iPhone convert-to-rgb processing is on).\n//\n// ===========================================================================\n//\n// ADDITIONAL CONFIGURATION\n//\n//  - You can suppress implementation of any of the decoders to reduce\n//    your code footprint by #defining one or more of the following\n//    symbols before creating the implementation.\n//\n//        STBI_NO_JPEG\n//        STBI_NO_PNG\n//        STBI_NO_BMP\n//        STBI_NO_PSD\n//        STBI_NO_TGA\n//        STBI_NO_GIF\n//        STBI_NO_HDR\n//        STBI_NO_PIC\n//        STBI_NO_PNM   (.ppm and .pgm)\n//\n//  - You can request *only* certain decoders and suppress all other ones\n//    (this will be more forward-compatible, as addition of new decoders\n//    doesn't require you to disable them explicitly):\n//\n//        STBI_ONLY_JPEG\n//        STBI_ONLY_PNG\n//        STBI_ONLY_BMP\n//        STBI_ONLY_PSD\n//        STBI_ONLY_TGA\n//        STBI_ONLY_GIF\n//        STBI_ONLY_HDR\n//        STBI_ONLY_PIC\n//        STBI_ONLY_PNM   (.ppm and .pgm)\n//\n//   - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still\n//     want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB\n//\n//  - If you define STBI_MAX_DIMENSIONS, stb_image will reject images greater\n//    than that size (in either width or height) without further processing.\n//    This is to let programs in the wild set an upper bound to prevent\n//    denial-of-service attacks on untrusted data, as one could generate a\n//    valid image of gigantic dimensions and force stb_image to allocate a\n//    huge block of memory and spend disproportionate time decoding it. By\n//    default this is set to (1 << 24), which is 16777216, but that's still\n//    very big.\n\n#ifndef STBI_NO_STDIO\n#include <stdio.h>\n#endif // STBI_NO_STDIO\n\n#define STBI_VERSION 1\n\nenum\n{\n   STBI_default = 0, // only used for desired_channels\n\n   STBI_grey       = 1,\n   STBI_grey_alpha = 2,\n   STBI_rgb        = 3,\n   STBI_rgb_alpha  = 4\n};\n\n#include <stdlib.h>\ntypedef unsigned char stbi_uc;\ntypedef unsigned short stbi_us;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef STBIDEF\n#ifdef STB_IMAGE_STATIC\n#define STBIDEF static\n#else\n#define STBIDEF extern\n#endif\n#endif\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// PRIMARY API - works on images of any type\n//\n\n//\n// load image by filename, open file, or memory buffer\n//\n\ntypedef struct\n{\n   int      (*read)  (void *user,char *data,int size);   // fill 'data' with 'size' bytes.  return number of bytes actually read\n   void     (*skip)  (void *user,int n);                 // skip the next 'n' bytes, or 'unget' the last -n bytes if negative\n   int      (*eof)   (void *user);                       // returns nonzero if we are at end of file/data\n} stbi_io_callbacks;\n\n////////////////////////////////////\n//\n// 8-bits-per-channel interface\n//\n\nSTBIDEF stbi_uc *stbi_load_from_memory   (stbi_uc           const *buffer, int len   , int *x, int *y, int *channels_in_file, int desired_channels);\nSTBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk  , void *user, int *x, int *y, int *channels_in_file, int desired_channels);\n\n#ifndef STBI_NO_STDIO\nSTBIDEF stbi_uc *stbi_load            (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);\nSTBIDEF stbi_uc *stbi_load_from_file  (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);\n// for stbi_load_from_file, file pointer is left pointing immediately after image\n#endif\n\n#ifndef STBI_NO_GIF\nSTBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp);\n#endif\n\n#ifdef STBI_WINDOWS_UTF8\nSTBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input);\n#endif\n\n////////////////////////////////////\n//\n// 16-bits-per-channel interface\n//\n\nSTBIDEF stbi_us *stbi_load_16_from_memory   (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels);\nSTBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels);\n\n#ifndef STBI_NO_STDIO\nSTBIDEF stbi_us *stbi_load_16          (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);\nSTBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);\n#endif\n\n////////////////////////////////////\n//\n// float-per-channel interface\n//\n#ifndef STBI_NO_LINEAR\n   STBIDEF float *stbi_loadf_from_memory     (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels);\n   STBIDEF float *stbi_loadf_from_callbacks  (stbi_io_callbacks const *clbk, void *user, int *x, int *y,  int *channels_in_file, int desired_channels);\n\n   #ifndef STBI_NO_STDIO\n   STBIDEF float *stbi_loadf            (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);\n   STBIDEF float *stbi_loadf_from_file  (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);\n   #endif\n#endif\n\n#ifndef STBI_NO_HDR\n   STBIDEF void   stbi_hdr_to_ldr_gamma(float gamma);\n   STBIDEF void   stbi_hdr_to_ldr_scale(float scale);\n#endif // STBI_NO_HDR\n\n#ifndef STBI_NO_LINEAR\n   STBIDEF void   stbi_ldr_to_hdr_gamma(float gamma);\n   STBIDEF void   stbi_ldr_to_hdr_scale(float scale);\n#endif // STBI_NO_LINEAR\n\n// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR\nSTBIDEF int    stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user);\nSTBIDEF int    stbi_is_hdr_from_memory(stbi_uc const *buffer, int len);\n#ifndef STBI_NO_STDIO\nSTBIDEF int      stbi_is_hdr          (char const *filename);\nSTBIDEF int      stbi_is_hdr_from_file(FILE *f);\n#endif // STBI_NO_STDIO\n\n\n// get a VERY brief reason for failure\n// on most compilers (and ALL modern mainstream compilers) this is threadsafe\nSTBIDEF const char *stbi_failure_reason  (void);\n\n// free the loaded image -- this is just free()\nSTBIDEF void     stbi_image_free      (void *retval_from_stbi_load);\n\n// get image dimensions & components without fully decoding\nSTBIDEF int      stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);\nSTBIDEF int      stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp);\nSTBIDEF int      stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len);\nSTBIDEF int      stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user);\n\n#ifndef STBI_NO_STDIO\nSTBIDEF int      stbi_info               (char const *filename,     int *x, int *y, int *comp);\nSTBIDEF int      stbi_info_from_file     (FILE *f,                  int *x, int *y, int *comp);\nSTBIDEF int      stbi_is_16_bit          (char const *filename);\nSTBIDEF int      stbi_is_16_bit_from_file(FILE *f);\n#endif\n\n\n\n// for image formats that explicitly notate that they have premultiplied alpha,\n// we just return the colors as stored in the file. set this flag to force\n// unpremultiplication. results are undefined if the unpremultiply overflow.\nSTBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply);\n\n// indicate whether we should process iphone images back to canonical format,\n// or just pass them through \"as-is\"\nSTBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert);\n\n// flip the image vertically, so the first pixel in the output array is the bottom left\nSTBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip);\n\n// as above, but only applies to images loaded on the thread that calls the function\n// this function is only available if your compiler supports thread-local variables;\n// calling it will fail to link if your compiler doesn't\nSTBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply);\nSTBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert);\nSTBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip);\n\n// ZLIB client - used by PNG, available for other purposes\n\nSTBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen);\nSTBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header);\nSTBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen);\nSTBIDEF int   stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);\n\nSTBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen);\nSTBIDEF int   stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);\n\n\n#ifdef __cplusplus\n}\n#endif\n\n//\n//\n////   end header file   /////////////////////////////////////////////////////\n#endif // STBI_INCLUDE_STB_IMAGE_H\n\n#ifdef STB_IMAGE_IMPLEMENTATION\n\n#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \\\n  || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \\\n  || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \\\n  || defined(STBI_ONLY_ZLIB)\n   #ifndef STBI_ONLY_JPEG\n   #define STBI_NO_JPEG\n   #endif\n   #ifndef STBI_ONLY_PNG\n   #define STBI_NO_PNG\n   #endif\n   #ifndef STBI_ONLY_BMP\n   #define STBI_NO_BMP\n   #endif\n   #ifndef STBI_ONLY_PSD\n   #define STBI_NO_PSD\n   #endif\n   #ifndef STBI_ONLY_TGA\n   #define STBI_NO_TGA\n   #endif\n   #ifndef STBI_ONLY_GIF\n   #define STBI_NO_GIF\n   #endif\n   #ifndef STBI_ONLY_HDR\n   #define STBI_NO_HDR\n   #endif\n   #ifndef STBI_ONLY_PIC\n   #define STBI_NO_PIC\n   #endif\n   #ifndef STBI_ONLY_PNM\n   #define STBI_NO_PNM\n   #endif\n#endif\n\n#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)\n#define STBI_NO_ZLIB\n#endif\n\n\n#include <stdarg.h>\n#include <stddef.h> // ptrdiff_t on osx\n#include <stdlib.h>\n#include <string.h>\n#include <limits.h>\n\n#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)\n#include <math.h>  // ldexp, pow\n#endif\n\n#ifndef STBI_NO_STDIO\n#include <stdio.h>\n#endif\n\n#ifndef STBI_ASSERT\n#include <assert.h>\n#define STBI_ASSERT(x) assert(x)\n#endif\n\n#ifdef __cplusplus\n#define STBI_EXTERN extern \"C\"\n#else\n#define STBI_EXTERN extern\n#endif\n\n\n#ifndef _MSC_VER\n   #ifdef __cplusplus\n   #define stbi_inline inline\n   #else\n   #define stbi_inline\n   #endif\n#else\n   #define stbi_inline __forceinline\n#endif\n\n#ifndef STBI_NO_THREAD_LOCALS\n   #if defined(__cplusplus) &&  __cplusplus >= 201103L\n      #define STBI_THREAD_LOCAL       thread_local\n   #elif defined(__GNUC__) && __GNUC__ < 5\n      #define STBI_THREAD_LOCAL       __thread\n   #elif defined(_MSC_VER)\n      #define STBI_THREAD_LOCAL       __declspec(thread)\n   #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__)\n      #define STBI_THREAD_LOCAL       _Thread_local\n   #endif\n\n   #ifndef STBI_THREAD_LOCAL\n      #if defined(__GNUC__)\n        #define STBI_THREAD_LOCAL       __thread\n      #endif\n   #endif\n#endif\n\n#if defined(_MSC_VER) || defined(__SYMBIAN32__)\ntypedef unsigned short stbi__uint16;\ntypedef   signed short stbi__int16;\ntypedef unsigned int   stbi__uint32;\ntypedef   signed int   stbi__int32;\n#else\n#include <stdint.h>\ntypedef uint16_t stbi__uint16;\ntypedef int16_t  stbi__int16;\ntypedef uint32_t stbi__uint32;\ntypedef int32_t  stbi__int32;\n#endif\n\n// should produce compiler error if size is wrong\ntypedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1];\n\n#ifdef _MSC_VER\n#define STBI_NOTUSED(v)  (void)(v)\n#else\n#define STBI_NOTUSED(v)  (void)sizeof(v)\n#endif\n\n#ifdef _MSC_VER\n#define STBI_HAS_LROTL\n#endif\n\n#ifdef STBI_HAS_LROTL\n   #define stbi_lrot(x,y)  _lrotl(x,y)\n#else\n   #define stbi_lrot(x,y)  (((x) << (y)) | ((x) >> (-(y) & 31)))\n#endif\n\n#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED))\n// ok\n#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED)\n// ok\n#else\n#error \"Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED).\"\n#endif\n\n#ifndef STBI_MALLOC\n#define STBI_MALLOC(sz)           malloc(sz)\n#define STBI_REALLOC(p,newsz)     realloc(p,newsz)\n#define STBI_FREE(p)              free(p)\n#endif\n\n#ifndef STBI_REALLOC_SIZED\n#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz)\n#endif\n\n// x86/x64 detection\n#if defined(__x86_64__) || defined(_M_X64)\n#define STBI__X64_TARGET\n#elif defined(__i386) || defined(_M_IX86)\n#define STBI__X86_TARGET\n#endif\n\n#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)\n// gcc doesn't support sse2 intrinsics unless you compile with -msse2,\n// which in turn means it gets to use SSE2 everywhere. This is unfortunate,\n// but previous attempts to provide the SSE2 functions with runtime\n// detection caused numerous issues. The way architecture extensions are\n// exposed in GCC/Clang is, sadly, not really suited for one-file libs.\n// New behavior: if compiled with -msse2, we use SSE2 without any\n// detection; if not, we don't use it at all.\n#define STBI_NO_SIMD\n#endif\n\n#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD)\n// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET\n//\n// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the\n// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant.\n// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not\n// simultaneously enabling \"-mstackrealign\".\n//\n// See https://github.com/nothings/stb/issues/81 for more information.\n//\n// So default to no SSE2 on 32-bit MinGW. If you've read this far and added\n// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2.\n#define STBI_NO_SIMD\n#endif\n\n#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET))\n#define STBI_SSE2\n#include <emmintrin.h>\n\n#ifdef _MSC_VER\n\n#if _MSC_VER >= 1400  // not VC6\n#include <intrin.h> // __cpuid\nstatic int stbi__cpuid3(void)\n{\n   int info[4];\n   __cpuid(info,1);\n   return info[3];\n}\n#else\nstatic int stbi__cpuid3(void)\n{\n   int res;\n   __asm {\n      mov  eax,1\n      cpuid\n      mov  res,edx\n   }\n   return res;\n}\n#endif\n\n#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name\n\n#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)\nstatic int stbi__sse2_available(void)\n{\n   int info3 = stbi__cpuid3();\n   return ((info3 >> 26) & 1) != 0;\n}\n#endif\n\n#else // assume GCC-style if not VC++\n#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))\n\n#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)\nstatic int stbi__sse2_available(void)\n{\n   // If we're even attempting to compile this on GCC/Clang, that means\n   // -msse2 is on, which means the compiler is allowed to use SSE2\n   // instructions at will, and so are we.\n   return 1;\n}\n#endif\n\n#endif\n#endif\n\n// ARM NEON\n#if defined(STBI_NO_SIMD) && defined(STBI_NEON)\n#undef STBI_NEON\n#endif\n\n#ifdef STBI_NEON\n#include <arm_neon.h>\n#ifdef _MSC_VER\n#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name\n#else\n#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))\n#endif\n#endif\n\n#ifndef STBI_SIMD_ALIGN\n#define STBI_SIMD_ALIGN(type, name) type name\n#endif\n\n#ifndef STBI_MAX_DIMENSIONS\n#define STBI_MAX_DIMENSIONS (1 << 24)\n#endif\n\n///////////////////////////////////////////////\n//\n//  stbi__context struct and start_xxx functions\n\n// stbi__context structure is our basic context used by all images, so it\n// contains all the IO context, plus some basic image information\ntypedef struct\n{\n   stbi__uint32 img_x, img_y;\n   int img_n, img_out_n;\n\n   stbi_io_callbacks io;\n   void *io_user_data;\n\n   int read_from_callbacks;\n   int buflen;\n   stbi_uc buffer_start[128];\n   int callback_already_read;\n\n   stbi_uc *img_buffer, *img_buffer_end;\n   stbi_uc *img_buffer_original, *img_buffer_original_end;\n} stbi__context;\n\n\nstatic void stbi__refill_buffer(stbi__context *s);\n\n// initialize a memory-decode context\nstatic void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len)\n{\n   s->io.read = NULL;\n   s->read_from_callbacks = 0;\n   s->callback_already_read = 0;\n   s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer;\n   s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len;\n}\n\n// initialize a callback-based context\nstatic void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user)\n{\n   s->io = *c;\n   s->io_user_data = user;\n   s->buflen = sizeof(s->buffer_start);\n   s->read_from_callbacks = 1;\n   s->callback_already_read = 0;\n   s->img_buffer = s->img_buffer_original = s->buffer_start;\n   stbi__refill_buffer(s);\n   s->img_buffer_original_end = s->img_buffer_end;\n}\n\n#ifndef STBI_NO_STDIO\n\nstatic int stbi__stdio_read(void *user, char *data, int size)\n{\n   return (int) fread(data,1,size,(FILE*) user);\n}\n\nstatic void stbi__stdio_skip(void *user, int n)\n{\n   int ch;\n   fseek((FILE*) user, n, SEEK_CUR);\n   ch = fgetc((FILE*) user);  /* have to read a byte to reset feof()'s flag */\n   if (ch != EOF) {\n      ungetc(ch, (FILE *) user);  /* push byte back onto stream if valid. */\n   }\n}\n\nstatic int stbi__stdio_eof(void *user)\n{\n   return feof((FILE*) user) || ferror((FILE *) user);\n}\n\nstatic stbi_io_callbacks stbi__stdio_callbacks =\n{\n   stbi__stdio_read,\n   stbi__stdio_skip,\n   stbi__stdio_eof,\n};\n\nstatic void stbi__start_file(stbi__context *s, FILE *f)\n{\n   stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f);\n}\n\n//static void stop_file(stbi__context *s) { }\n\n#endif // !STBI_NO_STDIO\n\nstatic void stbi__rewind(stbi__context *s)\n{\n   // conceptually rewind SHOULD rewind to the beginning of the stream,\n   // but we just rewind to the beginning of the initial buffer, because\n   // we only use it after doing 'test', which only ever looks at at most 92 bytes\n   s->img_buffer = s->img_buffer_original;\n   s->img_buffer_end = s->img_buffer_original_end;\n}\n\nenum\n{\n   STBI_ORDER_RGB,\n   STBI_ORDER_BGR\n};\n\ntypedef struct\n{\n   int bits_per_channel;\n   int num_channels;\n   int channel_order;\n} stbi__result_info;\n\n#ifndef STBI_NO_JPEG\nstatic int      stbi__jpeg_test(stbi__context *s);\nstatic void    *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\nstatic int      stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_PNG\nstatic int      stbi__png_test(stbi__context *s);\nstatic void    *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\nstatic int      stbi__png_info(stbi__context *s, int *x, int *y, int *comp);\nstatic int      stbi__png_is16(stbi__context *s);\n#endif\n\n#ifndef STBI_NO_BMP\nstatic int      stbi__bmp_test(stbi__context *s);\nstatic void    *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\nstatic int      stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_TGA\nstatic int      stbi__tga_test(stbi__context *s);\nstatic void    *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\nstatic int      stbi__tga_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_PSD\nstatic int      stbi__psd_test(stbi__context *s);\nstatic void    *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc);\nstatic int      stbi__psd_info(stbi__context *s, int *x, int *y, int *comp);\nstatic int      stbi__psd_is16(stbi__context *s);\n#endif\n\n#ifndef STBI_NO_HDR\nstatic int      stbi__hdr_test(stbi__context *s);\nstatic float   *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\nstatic int      stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_PIC\nstatic int      stbi__pic_test(stbi__context *s);\nstatic void    *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\nstatic int      stbi__pic_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_GIF\nstatic int      stbi__gif_test(stbi__context *s);\nstatic void    *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\nstatic void    *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp);\nstatic int      stbi__gif_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_PNM\nstatic int      stbi__pnm_test(stbi__context *s);\nstatic void    *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\nstatic int      stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp);\nstatic int      stbi__pnm_is16(stbi__context *s);\n#endif\n\nstatic\n#ifdef STBI_THREAD_LOCAL\nSTBI_THREAD_LOCAL\n#endif\nconst char *stbi__g_failure_reason;\n\nSTBIDEF const char *stbi_failure_reason(void)\n{\n   return stbi__g_failure_reason;\n}\n\n#ifndef STBI_NO_FAILURE_STRINGS\nstatic int stbi__err(const char *str)\n{\n   stbi__g_failure_reason = str;\n   return 0;\n}\n#endif\n\nstatic void *stbi__malloc(size_t size)\n{\n    return STBI_MALLOC(size);\n}\n\n// stb_image uses ints pervasively, including for offset calculations.\n// therefore the largest decoded image size we can support with the\n// current code, even on 64-bit targets, is INT_MAX. this is not a\n// significant limitation for the intended use case.\n//\n// we do, however, need to make sure our size calculations don't\n// overflow. hence a few helper functions for size calculations that\n// multiply integers together, making sure that they're non-negative\n// and no overflow occurs.\n\n// return 1 if the sum is valid, 0 on overflow.\n// negative terms are considered invalid.\nstatic int stbi__addsizes_valid(int a, int b)\n{\n   if (b < 0) return 0;\n   // now 0 <= b <= INT_MAX, hence also\n   // 0 <= INT_MAX - b <= INTMAX.\n   // And \"a + b <= INT_MAX\" (which might overflow) is the\n   // same as a <= INT_MAX - b (no overflow)\n   return a <= INT_MAX - b;\n}\n\n// returns 1 if the product is valid, 0 on overflow.\n// negative factors are considered invalid.\nstatic int stbi__mul2sizes_valid(int a, int b)\n{\n   if (a < 0 || b < 0) return 0;\n   if (b == 0) return 1; // mul-by-0 is always safe\n   // portable way to check for no overflows in a*b\n   return a <= INT_MAX/b;\n}\n\n#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR)\n// returns 1 if \"a*b + add\" has no negative terms/factors and doesn't overflow\nstatic int stbi__mad2sizes_valid(int a, int b, int add)\n{\n   return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add);\n}\n#endif\n\n// returns 1 if \"a*b*c + add\" has no negative terms/factors and doesn't overflow\nstatic int stbi__mad3sizes_valid(int a, int b, int c, int add)\n{\n   return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&\n      stbi__addsizes_valid(a*b*c, add);\n}\n\n// returns 1 if \"a*b*c*d + add\" has no negative terms/factors and doesn't overflow\n#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM)\nstatic int stbi__mad4sizes_valid(int a, int b, int c, int d, int add)\n{\n   return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&\n      stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add);\n}\n#endif\n\n#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR)\n// mallocs with size overflow checking\nstatic void *stbi__malloc_mad2(int a, int b, int add)\n{\n   if (!stbi__mad2sizes_valid(a, b, add)) return NULL;\n   return stbi__malloc(a*b + add);\n}\n#endif\n\nstatic void *stbi__malloc_mad3(int a, int b, int c, int add)\n{\n   if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL;\n   return stbi__malloc(a*b*c + add);\n}\n\n#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM)\nstatic void *stbi__malloc_mad4(int a, int b, int c, int d, int add)\n{\n   if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL;\n   return stbi__malloc(a*b*c*d + add);\n}\n#endif\n\n// returns 1 if the sum of two signed ints is valid (between -2^31 and 2^31-1 inclusive), 0 on overflow.\nstatic int stbi__addints_valid(int a, int b)\n{\n   if ((a >= 0) != (b >= 0)) return 1; // a and b have different signs, so no overflow\n   if (a < 0 && b < 0) return a >= INT_MIN - b; // same as a + b >= INT_MIN; INT_MIN - b cannot overflow since b < 0.\n   return a <= INT_MAX - b;\n}\n\n// returns 1 if the product of two ints fits in a signed short, 0 on overflow.\nstatic int stbi__mul2shorts_valid(int a, int b)\n{\n   if (b == 0 || b == -1) return 1; // multiplication by 0 is always 0; check for -1 so SHRT_MIN/b doesn't overflow\n   if ((a >= 0) == (b >= 0)) return a <= SHRT_MAX/b; // product is positive, so similar to mul2sizes_valid\n   if (b < 0) return a <= SHRT_MIN / b; // same as a * b >= SHRT_MIN\n   return a >= SHRT_MIN / b;\n}\n\n// stbi__err - error\n// stbi__errpf - error returning pointer to float\n// stbi__errpuc - error returning pointer to unsigned char\n\n#ifdef STBI_NO_FAILURE_STRINGS\n   #define stbi__err(x,y)  0\n#elif defined(STBI_FAILURE_USERMSG)\n   #define stbi__err(x,y)  stbi__err(y)\n#else\n   #define stbi__err(x,y)  stbi__err(x)\n#endif\n\n#define stbi__errpf(x,y)   ((float *)(size_t) (stbi__err(x,y)?NULL:NULL))\n#define stbi__errpuc(x,y)  ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL))\n\nSTBIDEF void stbi_image_free(void *retval_from_stbi_load)\n{\n   STBI_FREE(retval_from_stbi_load);\n}\n\n#ifndef STBI_NO_LINEAR\nstatic float   *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp);\n#endif\n\n#ifndef STBI_NO_HDR\nstatic stbi_uc *stbi__hdr_to_ldr(float   *data, int x, int y, int comp);\n#endif\n\nstatic int stbi__vertically_flip_on_load_global = 0;\n\nSTBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip)\n{\n   stbi__vertically_flip_on_load_global = flag_true_if_should_flip;\n}\n\n#ifndef STBI_THREAD_LOCAL\n#define stbi__vertically_flip_on_load  stbi__vertically_flip_on_load_global\n#else\nstatic STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set;\n\nSTBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip)\n{\n   stbi__vertically_flip_on_load_local = flag_true_if_should_flip;\n   stbi__vertically_flip_on_load_set = 1;\n}\n\n#define stbi__vertically_flip_on_load  (stbi__vertically_flip_on_load_set       \\\n                                         ? stbi__vertically_flip_on_load_local  \\\n                                         : stbi__vertically_flip_on_load_global)\n#endif // STBI_THREAD_LOCAL\n\nstatic void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc)\n{\n   memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields\n   ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed\n   ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order\n   ri->num_channels = 0;\n\n   // test the formats with a very explicit header first (at least a FOURCC\n   // or distinctive magic number first)\n   #ifndef STBI_NO_PNG\n   if (stbi__png_test(s))  return stbi__png_load(s,x,y,comp,req_comp, ri);\n   #endif\n   #ifndef STBI_NO_BMP\n   if (stbi__bmp_test(s))  return stbi__bmp_load(s,x,y,comp,req_comp, ri);\n   #endif\n   #ifndef STBI_NO_GIF\n   if (stbi__gif_test(s))  return stbi__gif_load(s,x,y,comp,req_comp, ri);\n   #endif\n   #ifndef STBI_NO_PSD\n   if (stbi__psd_test(s))  return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc);\n   #else\n   STBI_NOTUSED(bpc);\n   #endif\n   #ifndef STBI_NO_PIC\n   if (stbi__pic_test(s))  return stbi__pic_load(s,x,y,comp,req_comp, ri);\n   #endif\n\n   // then the formats that can end up attempting to load with just 1 or 2\n   // bytes matching expectations; these are prone to false positives, so\n   // try them later\n   #ifndef STBI_NO_JPEG\n   if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri);\n   #endif\n   #ifndef STBI_NO_PNM\n   if (stbi__pnm_test(s))  return stbi__pnm_load(s,x,y,comp,req_comp, ri);\n   #endif\n\n   #ifndef STBI_NO_HDR\n   if (stbi__hdr_test(s)) {\n      float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri);\n      return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);\n   }\n   #endif\n\n   #ifndef STBI_NO_TGA\n   // test tga last because it's a crappy test!\n   if (stbi__tga_test(s))\n      return stbi__tga_load(s,x,y,comp,req_comp, ri);\n   #endif\n\n   return stbi__errpuc(\"unknown image type\", \"Image not of any known type, or corrupt\");\n}\n\nstatic stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels)\n{\n   int i;\n   int img_len = w * h * channels;\n   stbi_uc *reduced;\n\n   reduced = (stbi_uc *) stbi__malloc(img_len);\n   if (reduced == NULL) return stbi__errpuc(\"outofmem\", \"Out of memory\");\n\n   for (i = 0; i < img_len; ++i)\n      reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling\n\n   STBI_FREE(orig);\n   return reduced;\n}\n\nstatic stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels)\n{\n   int i;\n   int img_len = w * h * channels;\n   stbi__uint16 *enlarged;\n\n   enlarged = (stbi__uint16 *) stbi__malloc(img_len*2);\n   if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc(\"outofmem\", \"Out of memory\");\n\n   for (i = 0; i < img_len; ++i)\n      enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff\n\n   STBI_FREE(orig);\n   return enlarged;\n}\n\nstatic void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel)\n{\n   int row;\n   size_t bytes_per_row = (size_t)w * bytes_per_pixel;\n   stbi_uc temp[2048];\n   stbi_uc *bytes = (stbi_uc *)image;\n\n   for (row = 0; row < (h>>1); row++) {\n      stbi_uc *row0 = bytes + row*bytes_per_row;\n      stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row;\n      // swap row0 with row1\n      size_t bytes_left = bytes_per_row;\n      while (bytes_left) {\n         size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp);\n         memcpy(temp, row0, bytes_copy);\n         memcpy(row0, row1, bytes_copy);\n         memcpy(row1, temp, bytes_copy);\n         row0 += bytes_copy;\n         row1 += bytes_copy;\n         bytes_left -= bytes_copy;\n      }\n   }\n}\n\n#ifndef STBI_NO_GIF\nstatic void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel)\n{\n   int slice;\n   int slice_size = w * h * bytes_per_pixel;\n\n   stbi_uc *bytes = (stbi_uc *)image;\n   for (slice = 0; slice < z; ++slice) {\n      stbi__vertical_flip(bytes, w, h, bytes_per_pixel);\n      bytes += slice_size;\n   }\n}\n#endif\n\nstatic unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   stbi__result_info ri;\n   void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8);\n\n   if (result == NULL)\n      return NULL;\n\n   // it is the responsibility of the loaders to make sure we get either 8 or 16 bit.\n   STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);\n\n   if (ri.bits_per_channel != 8) {\n      result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp);\n      ri.bits_per_channel = 8;\n   }\n\n   // @TODO: move stbi__convert_format to here\n\n   if (stbi__vertically_flip_on_load) {\n      int channels = req_comp ? req_comp : *comp;\n      stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc));\n   }\n\n   return (unsigned char *) result;\n}\n\nstatic stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   stbi__result_info ri;\n   void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16);\n\n   if (result == NULL)\n      return NULL;\n\n   // it is the responsibility of the loaders to make sure we get either 8 or 16 bit.\n   STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);\n\n   if (ri.bits_per_channel != 16) {\n      result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp);\n      ri.bits_per_channel = 16;\n   }\n\n   // @TODO: move stbi__convert_format16 to here\n   // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision\n\n   if (stbi__vertically_flip_on_load) {\n      int channels = req_comp ? req_comp : *comp;\n      stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16));\n   }\n\n   return (stbi__uint16 *) result;\n}\n\n#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR)\nstatic void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp)\n{\n   if (stbi__vertically_flip_on_load && result != NULL) {\n      int channels = req_comp ? req_comp : *comp;\n      stbi__vertical_flip(result, *x, *y, channels * sizeof(float));\n   }\n}\n#endif\n\n#ifndef STBI_NO_STDIO\n\n#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)\nSTBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide);\nSTBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default);\n#endif\n\n#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)\nSTBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input)\n{\n\treturn WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL);\n}\n#endif\n\nstatic FILE *stbi__fopen(char const *filename, char const *mode)\n{\n   FILE *f;\n#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)\n   wchar_t wMode[64];\n   wchar_t wFilename[1024];\n\tif (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename)))\n      return 0;\n\n\tif (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode)))\n      return 0;\n\n#if defined(_MSC_VER) && _MSC_VER >= 1400\n\tif (0 != _wfopen_s(&f, wFilename, wMode))\n\t\tf = 0;\n#else\n   f = _wfopen(wFilename, wMode);\n#endif\n\n#elif defined(_MSC_VER) && _MSC_VER >= 1400\n   if (0 != fopen_s(&f, filename, mode))\n      f=0;\n#else\n   f = fopen(filename, mode);\n#endif\n   return f;\n}\n\n\nSTBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp)\n{\n   FILE *f = stbi__fopen(filename, \"rb\");\n   unsigned char *result;\n   if (!f) return stbi__errpuc(\"can't fopen\", \"Unable to open file\");\n   result = stbi_load_from_file(f,x,y,comp,req_comp);\n   fclose(f);\n   return result;\n}\n\nSTBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)\n{\n   unsigned char *result;\n   stbi__context s;\n   stbi__start_file(&s,f);\n   result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);\n   if (result) {\n      // need to 'unget' all the characters in the IO buffer\n      fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);\n   }\n   return result;\n}\n\nSTBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp)\n{\n   stbi__uint16 *result;\n   stbi__context s;\n   stbi__start_file(&s,f);\n   result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp);\n   if (result) {\n      // need to 'unget' all the characters in the IO buffer\n      fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);\n   }\n   return result;\n}\n\nSTBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp)\n{\n   FILE *f = stbi__fopen(filename, \"rb\");\n   stbi__uint16 *result;\n   if (!f) return (stbi_us *) stbi__errpuc(\"can't fopen\", \"Unable to open file\");\n   result = stbi_load_from_file_16(f,x,y,comp,req_comp);\n   fclose(f);\n   return result;\n}\n\n\n#endif //!STBI_NO_STDIO\n\nSTBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels)\n{\n   stbi__context s;\n   stbi__start_mem(&s,buffer,len);\n   return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);\n}\n\nSTBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels)\n{\n   stbi__context s;\n   stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user);\n   return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);\n}\n\nSTBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)\n{\n   stbi__context s;\n   stbi__start_mem(&s,buffer,len);\n   return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);\n}\n\nSTBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)\n{\n   stbi__context s;\n   stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);\n   return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);\n}\n\n#ifndef STBI_NO_GIF\nSTBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp)\n{\n   unsigned char *result;\n   stbi__context s;\n   stbi__start_mem(&s,buffer,len);\n\n   result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp);\n   if (stbi__vertically_flip_on_load) {\n      stbi__vertical_flip_slices( result, *x, *y, *z, *comp );\n   }\n\n   return result;\n}\n#endif\n\n#ifndef STBI_NO_LINEAR\nstatic float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   unsigned char *data;\n   #ifndef STBI_NO_HDR\n   if (stbi__hdr_test(s)) {\n      stbi__result_info ri;\n      float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri);\n      if (hdr_data)\n         stbi__float_postprocess(hdr_data,x,y,comp,req_comp);\n      return hdr_data;\n   }\n   #endif\n   data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp);\n   if (data)\n      return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);\n   return stbi__errpf(\"unknown image type\", \"Image not of any known type, or corrupt\");\n}\n\nSTBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)\n{\n   stbi__context s;\n   stbi__start_mem(&s,buffer,len);\n   return stbi__loadf_main(&s,x,y,comp,req_comp);\n}\n\nSTBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)\n{\n   stbi__context s;\n   stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);\n   return stbi__loadf_main(&s,x,y,comp,req_comp);\n}\n\n#ifndef STBI_NO_STDIO\nSTBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp)\n{\n   float *result;\n   FILE *f = stbi__fopen(filename, \"rb\");\n   if (!f) return stbi__errpf(\"can't fopen\", \"Unable to open file\");\n   result = stbi_loadf_from_file(f,x,y,comp,req_comp);\n   fclose(f);\n   return result;\n}\n\nSTBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)\n{\n   stbi__context s;\n   stbi__start_file(&s,f);\n   return stbi__loadf_main(&s,x,y,comp,req_comp);\n}\n#endif // !STBI_NO_STDIO\n\n#endif // !STBI_NO_LINEAR\n\n// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is\n// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always\n// reports false!\n\nSTBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)\n{\n   #ifndef STBI_NO_HDR\n   stbi__context s;\n   stbi__start_mem(&s,buffer,len);\n   return stbi__hdr_test(&s);\n   #else\n   STBI_NOTUSED(buffer);\n   STBI_NOTUSED(len);\n   return 0;\n   #endif\n}\n\n#ifndef STBI_NO_STDIO\nSTBIDEF int      stbi_is_hdr          (char const *filename)\n{\n   FILE *f = stbi__fopen(filename, \"rb\");\n   int result=0;\n   if (f) {\n      result = stbi_is_hdr_from_file(f);\n      fclose(f);\n   }\n   return result;\n}\n\nSTBIDEF int stbi_is_hdr_from_file(FILE *f)\n{\n   #ifndef STBI_NO_HDR\n   long pos = ftell(f);\n   int res;\n   stbi__context s;\n   stbi__start_file(&s,f);\n   res = stbi__hdr_test(&s);\n   fseek(f, pos, SEEK_SET);\n   return res;\n   #else\n   STBI_NOTUSED(f);\n   return 0;\n   #endif\n}\n#endif // !STBI_NO_STDIO\n\nSTBIDEF int      stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user)\n{\n   #ifndef STBI_NO_HDR\n   stbi__context s;\n   stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);\n   return stbi__hdr_test(&s);\n   #else\n   STBI_NOTUSED(clbk);\n   STBI_NOTUSED(user);\n   return 0;\n   #endif\n}\n\n#ifndef STBI_NO_LINEAR\nstatic float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;\n\nSTBIDEF void   stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; }\nSTBIDEF void   stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; }\n#endif\n\nstatic float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;\n\nSTBIDEF void   stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; }\nSTBIDEF void   stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; }\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// Common code used by all image loaders\n//\n\nenum\n{\n   STBI__SCAN_load=0,\n   STBI__SCAN_type,\n   STBI__SCAN_header\n};\n\nstatic void stbi__refill_buffer(stbi__context *s)\n{\n   int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen);\n   s->callback_already_read += (int) (s->img_buffer - s->img_buffer_original);\n   if (n == 0) {\n      // at end of file, treat same as if from memory, but need to handle case\n      // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file\n      s->read_from_callbacks = 0;\n      s->img_buffer = s->buffer_start;\n      s->img_buffer_end = s->buffer_start+1;\n      *s->img_buffer = 0;\n   } else {\n      s->img_buffer = s->buffer_start;\n      s->img_buffer_end = s->buffer_start + n;\n   }\n}\n\nstbi_inline static stbi_uc stbi__get8(stbi__context *s)\n{\n   if (s->img_buffer < s->img_buffer_end)\n      return *s->img_buffer++;\n   if (s->read_from_callbacks) {\n      stbi__refill_buffer(s);\n      return *s->img_buffer++;\n   }\n   return 0;\n}\n\n#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)\n// nothing\n#else\nstbi_inline static int stbi__at_eof(stbi__context *s)\n{\n   if (s->io.read) {\n      if (!(s->io.eof)(s->io_user_data)) return 0;\n      // if feof() is true, check if buffer = end\n      // special case: we've only got the special 0 character at the end\n      if (s->read_from_callbacks == 0) return 1;\n   }\n\n   return s->img_buffer >= s->img_buffer_end;\n}\n#endif\n\n#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC)\n// nothing\n#else\nstatic void stbi__skip(stbi__context *s, int n)\n{\n   if (n == 0) return;  // already there!\n   if (n < 0) {\n      s->img_buffer = s->img_buffer_end;\n      return;\n   }\n   if (s->io.read) {\n      int blen = (int) (s->img_buffer_end - s->img_buffer);\n      if (blen < n) {\n         s->img_buffer = s->img_buffer_end;\n         (s->io.skip)(s->io_user_data, n - blen);\n         return;\n      }\n   }\n   s->img_buffer += n;\n}\n#endif\n\n#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM)\n// nothing\n#else\nstatic int stbi__getn(stbi__context *s, stbi_uc *buffer, int n)\n{\n   if (s->io.read) {\n      int blen = (int) (s->img_buffer_end - s->img_buffer);\n      if (blen < n) {\n         int res, count;\n\n         memcpy(buffer, s->img_buffer, blen);\n\n         count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen);\n         res = (count == (n-blen));\n         s->img_buffer = s->img_buffer_end;\n         return res;\n      }\n   }\n\n   if (s->img_buffer+n <= s->img_buffer_end) {\n      memcpy(buffer, s->img_buffer, n);\n      s->img_buffer += n;\n      return 1;\n   } else\n      return 0;\n}\n#endif\n\n#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)\n// nothing\n#else\nstatic int stbi__get16be(stbi__context *s)\n{\n   int z = stbi__get8(s);\n   return (z << 8) + stbi__get8(s);\n}\n#endif\n\n#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)\n// nothing\n#else\nstatic stbi__uint32 stbi__get32be(stbi__context *s)\n{\n   stbi__uint32 z = stbi__get16be(s);\n   return (z << 16) + stbi__get16be(s);\n}\n#endif\n\n#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF)\n// nothing\n#else\nstatic int stbi__get16le(stbi__context *s)\n{\n   int z = stbi__get8(s);\n   return z + (stbi__get8(s) << 8);\n}\n#endif\n\n#ifndef STBI_NO_BMP\nstatic stbi__uint32 stbi__get32le(stbi__context *s)\n{\n   stbi__uint32 z = stbi__get16le(s);\n   z += (stbi__uint32)stbi__get16le(s) << 16;\n   return z;\n}\n#endif\n\n#define STBI__BYTECAST(x)  ((stbi_uc) ((x) & 255))  // truncate int to byte without warnings\n\n#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)\n// nothing\n#else\n//////////////////////////////////////////////////////////////////////////////\n//\n//  generic converter from built-in img_n to req_comp\n//    individual types do this automatically as much as possible (e.g. jpeg\n//    does all cases internally since it needs to colorspace convert anyway,\n//    and it never has alpha, so very few cases ). png can automatically\n//    interleave an alpha=255 channel, but falls back to this for other cases\n//\n//  assume data buffer is malloced, so malloc a new one and free that one\n//  only failure mode is malloc failing\n\nstatic stbi_uc stbi__compute_y(int r, int g, int b)\n{\n   return (stbi_uc) (((r*77) + (g*150) +  (29*b)) >> 8);\n}\n#endif\n\n#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)\n// nothing\n#else\nstatic unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y)\n{\n   int i,j;\n   unsigned char *good;\n\n   if (req_comp == img_n) return data;\n   STBI_ASSERT(req_comp >= 1 && req_comp <= 4);\n\n   good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0);\n   if (good == NULL) {\n      STBI_FREE(data);\n      return stbi__errpuc(\"outofmem\", \"Out of memory\");\n   }\n\n   for (j=0; j < (int) y; ++j) {\n      unsigned char *src  = data + j * x * img_n   ;\n      unsigned char *dest = good + j * x * req_comp;\n\n      #define STBI__COMBO(a,b)  ((a)*8+(b))\n      #define STBI__CASE(a,b)   case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)\n      // convert source image with img_n components to one with req_comp components;\n      // avoid switch per pixel, so use switch per scanline and massive macros\n      switch (STBI__COMBO(img_n, req_comp)) {\n         STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255;                                     } break;\n         STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0];                                  } break;\n         STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255;                     } break;\n         STBI__CASE(2,1) { dest[0]=src[0];                                                  } break;\n         STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0];                                  } break;\n         STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1];                  } break;\n         STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255;        } break;\n         STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]);                   } break;\n         STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255;    } break;\n         STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]);                   } break;\n         STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break;\n         STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];                    } break;\n         default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return stbi__errpuc(\"unsupported\", \"Unsupported format conversion\");\n      }\n      #undef STBI__CASE\n   }\n\n   STBI_FREE(data);\n   return good;\n}\n#endif\n\n#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)\n// nothing\n#else\nstatic stbi__uint16 stbi__compute_y_16(int r, int g, int b)\n{\n   return (stbi__uint16) (((r*77) + (g*150) +  (29*b)) >> 8);\n}\n#endif\n\n#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)\n// nothing\n#else\nstatic stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y)\n{\n   int i,j;\n   stbi__uint16 *good;\n\n   if (req_comp == img_n) return data;\n   STBI_ASSERT(req_comp >= 1 && req_comp <= 4);\n\n   good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2);\n   if (good == NULL) {\n      STBI_FREE(data);\n      return (stbi__uint16 *) stbi__errpuc(\"outofmem\", \"Out of memory\");\n   }\n\n   for (j=0; j < (int) y; ++j) {\n      stbi__uint16 *src  = data + j * x * img_n   ;\n      stbi__uint16 *dest = good + j * x * req_comp;\n\n      #define STBI__COMBO(a,b)  ((a)*8+(b))\n      #define STBI__CASE(a,b)   case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)\n      // convert source image with img_n components to one with req_comp components;\n      // avoid switch per pixel, so use switch per scanline and massive macros\n      switch (STBI__COMBO(img_n, req_comp)) {\n         STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff;                                     } break;\n         STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0];                                     } break;\n         STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff;                     } break;\n         STBI__CASE(2,1) { dest[0]=src[0];                                                     } break;\n         STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0];                                     } break;\n         STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1];                     } break;\n         STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff;        } break;\n         STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]);                   } break;\n         STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break;\n         STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]);                   } break;\n         STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break;\n         STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];                       } break;\n         default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return (stbi__uint16*) stbi__errpuc(\"unsupported\", \"Unsupported format conversion\");\n      }\n      #undef STBI__CASE\n   }\n\n   STBI_FREE(data);\n   return good;\n}\n#endif\n\n#ifndef STBI_NO_LINEAR\nstatic float   *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp)\n{\n   int i,k,n;\n   float *output;\n   if (!data) return NULL;\n   output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0);\n   if (output == NULL) { STBI_FREE(data); return stbi__errpf(\"outofmem\", \"Out of memory\"); }\n   // compute number of non-alpha components\n   if (comp & 1) n = comp; else n = comp-1;\n   for (i=0; i < x*y; ++i) {\n      for (k=0; k < n; ++k) {\n         output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);\n      }\n   }\n   if (n < comp) {\n      for (i=0; i < x*y; ++i) {\n         output[i*comp + n] = data[i*comp + n]/255.0f;\n      }\n   }\n   STBI_FREE(data);\n   return output;\n}\n#endif\n\n#ifndef STBI_NO_HDR\n#define stbi__float2int(x)   ((int) (x))\nstatic stbi_uc *stbi__hdr_to_ldr(float   *data, int x, int y, int comp)\n{\n   int i,k,n;\n   stbi_uc *output;\n   if (!data) return NULL;\n   output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0);\n   if (output == NULL) { STBI_FREE(data); return stbi__errpuc(\"outofmem\", \"Out of memory\"); }\n   // compute number of non-alpha components\n   if (comp & 1) n = comp; else n = comp-1;\n   for (i=0; i < x*y; ++i) {\n      for (k=0; k < n; ++k) {\n         float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;\n         if (z < 0) z = 0;\n         if (z > 255) z = 255;\n         output[i*comp + k] = (stbi_uc) stbi__float2int(z);\n      }\n      if (k < comp) {\n         float z = data[i*comp+k] * 255 + 0.5f;\n         if (z < 0) z = 0;\n         if (z > 255) z = 255;\n         output[i*comp + k] = (stbi_uc) stbi__float2int(z);\n      }\n   }\n   STBI_FREE(data);\n   return output;\n}\n#endif\n\n//////////////////////////////////////////////////////////////////////////////\n//\n//  \"baseline\" JPEG/JFIF decoder\n//\n//    simple implementation\n//      - doesn't support delayed output of y-dimension\n//      - simple interface (only one output format: 8-bit interleaved RGB)\n//      - doesn't try to recover corrupt jpegs\n//      - doesn't allow partial loading, loading multiple at once\n//      - still fast on x86 (copying globals into locals doesn't help x86)\n//      - allocates lots of intermediate memory (full size of all components)\n//        - non-interleaved case requires this anyway\n//        - allows good upsampling (see next)\n//    high-quality\n//      - upsampled channels are bilinearly interpolated, even across blocks\n//      - quality integer IDCT derived from IJG's 'slow'\n//    performance\n//      - fast huffman; reasonable integer IDCT\n//      - some SIMD kernels for common paths on targets with SSE2/NEON\n//      - uses a lot of intermediate memory, could cache poorly\n\n#ifndef STBI_NO_JPEG\n\n// huffman decoding acceleration\n#define FAST_BITS   9  // larger handles more cases; smaller stomps less cache\n\ntypedef struct\n{\n   stbi_uc  fast[1 << FAST_BITS];\n   // weirdly, repacking this into AoS is a 10% speed loss, instead of a win\n   stbi__uint16 code[256];\n   stbi_uc  values[256];\n   stbi_uc  size[257];\n   unsigned int maxcode[18];\n   int    delta[17];   // old 'firstsymbol' - old 'firstcode'\n} stbi__huffman;\n\ntypedef struct\n{\n   stbi__context *s;\n   stbi__huffman huff_dc[4];\n   stbi__huffman huff_ac[4];\n   stbi__uint16 dequant[4][64];\n   stbi__int16 fast_ac[4][1 << FAST_BITS];\n\n// sizes for components, interleaved MCUs\n   int img_h_max, img_v_max;\n   int img_mcu_x, img_mcu_y;\n   int img_mcu_w, img_mcu_h;\n\n// definition of jpeg image component\n   struct\n   {\n      int id;\n      int h,v;\n      int tq;\n      int hd,ha;\n      int dc_pred;\n\n      int x,y,w2,h2;\n      stbi_uc *data;\n      void *raw_data, *raw_coeff;\n      stbi_uc *linebuf;\n      short   *coeff;   // progressive only\n      int      coeff_w, coeff_h; // number of 8x8 coefficient blocks\n   } img_comp[4];\n\n   stbi__uint32   code_buffer; // jpeg entropy-coded buffer\n   int            code_bits;   // number of valid bits\n   unsigned char  marker;      // marker seen while filling entropy buffer\n   int            nomore;      // flag if we saw a marker so must stop\n\n   int            progressive;\n   int            spec_start;\n   int            spec_end;\n   int            succ_high;\n   int            succ_low;\n   int            eob_run;\n   int            jfif;\n   int            app14_color_transform; // Adobe APP14 tag\n   int            rgb;\n\n   int scan_n, order[4];\n   int restart_interval, todo;\n\n// kernels\n   void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]);\n   void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step);\n   stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs);\n} stbi__jpeg;\n\nstatic int stbi__build_huffman(stbi__huffman *h, int *count)\n{\n   int i,j,k=0;\n   unsigned int code;\n   // build size list for each symbol (from JPEG spec)\n   for (i=0; i < 16; ++i) {\n      for (j=0; j < count[i]; ++j) {\n         h->size[k++] = (stbi_uc) (i+1);\n         if(k >= 257) return stbi__err(\"bad size list\",\"Corrupt JPEG\");\n      }\n   }\n   h->size[k] = 0;\n\n   // compute actual symbols (from jpeg spec)\n   code = 0;\n   k = 0;\n   for(j=1; j <= 16; ++j) {\n      // compute delta to add to code to compute symbol id\n      h->delta[j] = k - code;\n      if (h->size[k] == j) {\n         while (h->size[k] == j)\n            h->code[k++] = (stbi__uint16) (code++);\n         if (code-1 >= (1u << j)) return stbi__err(\"bad code lengths\",\"Corrupt JPEG\");\n      }\n      // compute largest code + 1 for this size, preshifted as needed later\n      h->maxcode[j] = code << (16-j);\n      code <<= 1;\n   }\n   h->maxcode[j] = 0xffffffff;\n\n   // build non-spec acceleration table; 255 is flag for not-accelerated\n   memset(h->fast, 255, 1 << FAST_BITS);\n   for (i=0; i < k; ++i) {\n      int s = h->size[i];\n      if (s <= FAST_BITS) {\n         int c = h->code[i] << (FAST_BITS-s);\n         int m = 1 << (FAST_BITS-s);\n         for (j=0; j < m; ++j) {\n            h->fast[c+j] = (stbi_uc) i;\n         }\n      }\n   }\n   return 1;\n}\n\n// build a table that decodes both magnitude and value of small ACs in\n// one go.\nstatic void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)\n{\n   int i;\n   for (i=0; i < (1 << FAST_BITS); ++i) {\n      stbi_uc fast = h->fast[i];\n      fast_ac[i] = 0;\n      if (fast < 255) {\n         int rs = h->values[fast];\n         int run = (rs >> 4) & 15;\n         int magbits = rs & 15;\n         int len = h->size[fast];\n\n         if (magbits && len + magbits <= FAST_BITS) {\n            // magnitude code followed by receive_extend code\n            int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);\n            int m = 1 << (magbits - 1);\n            if (k < m) k += (~0U << magbits) + 1;\n            // if the result is small enough, we can fit it in fast_ac table\n            if (k >= -128 && k <= 127)\n               fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits));\n         }\n      }\n   }\n}\n\nstatic void stbi__grow_buffer_unsafe(stbi__jpeg *j)\n{\n   do {\n      unsigned int b = j->nomore ? 0 : stbi__get8(j->s);\n      if (b == 0xff) {\n         int c = stbi__get8(j->s);\n         while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes\n         if (c != 0) {\n            j->marker = (unsigned char) c;\n            j->nomore = 1;\n            return;\n         }\n      }\n      j->code_buffer |= b << (24 - j->code_bits);\n      j->code_bits += 8;\n   } while (j->code_bits <= 24);\n}\n\n// (1 << n) - 1\nstatic const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};\n\n// decode a jpeg huffman value from the bitstream\nstbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)\n{\n   unsigned int temp;\n   int c,k;\n\n   if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\n\n   // look at the top FAST_BITS and determine what symbol ID it is,\n   // if the code is <= FAST_BITS\n   c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);\n   k = h->fast[c];\n   if (k < 255) {\n      int s = h->size[k];\n      if (s > j->code_bits)\n         return -1;\n      j->code_buffer <<= s;\n      j->code_bits -= s;\n      return h->values[k];\n   }\n\n   // naive test is to shift the code_buffer down so k bits are\n   // valid, then test against maxcode. To speed this up, we've\n   // preshifted maxcode left so that it has (16-k) 0s at the\n   // end; in other words, regardless of the number of bits, it\n   // wants to be compared against something shifted to have 16;\n   // that way we don't need to shift inside the loop.\n   temp = j->code_buffer >> 16;\n   for (k=FAST_BITS+1 ; ; ++k)\n      if (temp < h->maxcode[k])\n         break;\n   if (k == 17) {\n      // error! code not found\n      j->code_bits -= 16;\n      return -1;\n   }\n\n   if (k > j->code_bits)\n      return -1;\n\n   // convert the huffman code to the symbol id\n   c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];\n   if(c < 0 || c >= 256) // symbol id out of bounds!\n       return -1;\n   STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);\n\n   // convert the id to a symbol\n   j->code_bits -= k;\n   j->code_buffer <<= k;\n   return h->values[c];\n}\n\n// bias[n] = (-1<<n) + 1\nstatic const int stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};\n\n// combined JPEG 'receive' and JPEG 'extend', since baseline\n// always extends everything it receives.\nstbi_inline static int stbi__extend_receive(stbi__jpeg *j, int n)\n{\n   unsigned int k;\n   int sgn;\n   if (j->code_bits < n) stbi__grow_buffer_unsafe(j);\n   if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing\n\n   sgn = j->code_buffer >> 31; // sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative)\n   k = stbi_lrot(j->code_buffer, n);\n   j->code_buffer = k & ~stbi__bmask[n];\n   k &= stbi__bmask[n];\n   j->code_bits -= n;\n   return k + (stbi__jbias[n] & (sgn - 1));\n}\n\n// get some unsigned bits\nstbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n)\n{\n   unsigned int k;\n   if (j->code_bits < n) stbi__grow_buffer_unsafe(j);\n   if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing\n   k = stbi_lrot(j->code_buffer, n);\n   j->code_buffer = k & ~stbi__bmask[n];\n   k &= stbi__bmask[n];\n   j->code_bits -= n;\n   return k;\n}\n\nstbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j)\n{\n   unsigned int k;\n   if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);\n   if (j->code_bits < 1) return 0; // ran out of bits from stream, return 0s intead of continuing\n   k = j->code_buffer;\n   j->code_buffer <<= 1;\n   --j->code_bits;\n   return k & 0x80000000;\n}\n\n// given a value that's at position X in the zigzag stream,\n// where does it appear in the 8x8 matrix coded as row-major?\nstatic const stbi_uc stbi__jpeg_dezigzag[64+15] =\n{\n    0,  1,  8, 16,  9,  2,  3, 10,\n   17, 24, 32, 25, 18, 11,  4,  5,\n   12, 19, 26, 33, 40, 48, 41, 34,\n   27, 20, 13,  6,  7, 14, 21, 28,\n   35, 42, 49, 56, 57, 50, 43, 36,\n   29, 22, 15, 23, 30, 37, 44, 51,\n   58, 59, 52, 45, 38, 31, 39, 46,\n   53, 60, 61, 54, 47, 55, 62, 63,\n   // let corrupt input sample past end\n   63, 63, 63, 63, 63, 63, 63, 63,\n   63, 63, 63, 63, 63, 63, 63\n};\n\n// decode one 64-entry block--\nstatic int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant)\n{\n   int diff,dc,k;\n   int t;\n\n   if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\n   t = stbi__jpeg_huff_decode(j, hdc);\n   if (t < 0 || t > 15) return stbi__err(\"bad huffman code\",\"Corrupt JPEG\");\n\n   // 0 all the ac values now so we can do it 32-bits at a time\n   memset(data,0,64*sizeof(data[0]));\n\n   diff = t ? stbi__extend_receive(j, t) : 0;\n   if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err(\"bad delta\",\"Corrupt JPEG\");\n   dc = j->img_comp[b].dc_pred + diff;\n   j->img_comp[b].dc_pred = dc;\n   if (!stbi__mul2shorts_valid(dc, dequant[0])) return stbi__err(\"can't merge dc and ac\", \"Corrupt JPEG\");\n   data[0] = (short) (dc * dequant[0]);\n\n   // decode AC components, see JPEG spec\n   k = 1;\n   do {\n      unsigned int zig;\n      int c,r,s;\n      if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\n      c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);\n      r = fac[c];\n      if (r) { // fast-AC path\n         k += (r >> 4) & 15; // run\n         s = r & 15; // combined length\n         if (s > j->code_bits) return stbi__err(\"bad huffman code\", \"Combined length longer than code bits available\");\n         j->code_buffer <<= s;\n         j->code_bits -= s;\n         // decode into unzigzag'd location\n         zig = stbi__jpeg_dezigzag[k++];\n         data[zig] = (short) ((r >> 8) * dequant[zig]);\n      } else {\n         int rs = stbi__jpeg_huff_decode(j, hac);\n         if (rs < 0) return stbi__err(\"bad huffman code\",\"Corrupt JPEG\");\n         s = rs & 15;\n         r = rs >> 4;\n         if (s == 0) {\n            if (rs != 0xf0) break; // end block\n            k += 16;\n         } else {\n            k += r;\n            // decode into unzigzag'd location\n            zig = stbi__jpeg_dezigzag[k++];\n            data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]);\n         }\n      }\n   } while (k < 64);\n   return 1;\n}\n\nstatic int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b)\n{\n   int diff,dc;\n   int t;\n   if (j->spec_end != 0) return stbi__err(\"can't merge dc and ac\", \"Corrupt JPEG\");\n\n   if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\n\n   if (j->succ_high == 0) {\n      // first scan for DC coefficient, must be first\n      memset(data,0,64*sizeof(data[0])); // 0 all the ac values now\n      t = stbi__jpeg_huff_decode(j, hdc);\n      if (t < 0 || t > 15) return stbi__err(\"can't merge dc and ac\", \"Corrupt JPEG\");\n      diff = t ? stbi__extend_receive(j, t) : 0;\n\n      if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err(\"bad delta\", \"Corrupt JPEG\");\n      dc = j->img_comp[b].dc_pred + diff;\n      j->img_comp[b].dc_pred = dc;\n      if (!stbi__mul2shorts_valid(dc, 1 << j->succ_low)) return stbi__err(\"can't merge dc and ac\", \"Corrupt JPEG\");\n      data[0] = (short) (dc * (1 << j->succ_low));\n   } else {\n      // refinement scan for DC coefficient\n      if (stbi__jpeg_get_bit(j))\n         data[0] += (short) (1 << j->succ_low);\n   }\n   return 1;\n}\n\n// @OPTIMIZE: store non-zigzagged during the decode passes,\n// and only de-zigzag when dequantizing\nstatic int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac)\n{\n   int k;\n   if (j->spec_start == 0) return stbi__err(\"can't merge dc and ac\", \"Corrupt JPEG\");\n\n   if (j->succ_high == 0) {\n      int shift = j->succ_low;\n\n      if (j->eob_run) {\n         --j->eob_run;\n         return 1;\n      }\n\n      k = j->spec_start;\n      do {\n         unsigned int zig;\n         int c,r,s;\n         if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\n         c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);\n         r = fac[c];\n         if (r) { // fast-AC path\n            k += (r >> 4) & 15; // run\n            s = r & 15; // combined length\n            if (s > j->code_bits) return stbi__err(\"bad huffman code\", \"Combined length longer than code bits available\");\n            j->code_buffer <<= s;\n            j->code_bits -= s;\n            zig = stbi__jpeg_dezigzag[k++];\n            data[zig] = (short) ((r >> 8) * (1 << shift));\n         } else {\n            int rs = stbi__jpeg_huff_decode(j, hac);\n            if (rs < 0) return stbi__err(\"bad huffman code\",\"Corrupt JPEG\");\n            s = rs & 15;\n            r = rs >> 4;\n            if (s == 0) {\n               if (r < 15) {\n                  j->eob_run = (1 << r);\n                  if (r)\n                     j->eob_run += stbi__jpeg_get_bits(j, r);\n                  --j->eob_run;\n                  break;\n               }\n               k += 16;\n            } else {\n               k += r;\n               zig = stbi__jpeg_dezigzag[k++];\n               data[zig] = (short) (stbi__extend_receive(j,s) * (1 << shift));\n            }\n         }\n      } while (k <= j->spec_end);\n   } else {\n      // refinement scan for these AC coefficients\n\n      short bit = (short) (1 << j->succ_low);\n\n      if (j->eob_run) {\n         --j->eob_run;\n         for (k = j->spec_start; k <= j->spec_end; ++k) {\n            short *p = &data[stbi__jpeg_dezigzag[k]];\n            if (*p != 0)\n               if (stbi__jpeg_get_bit(j))\n                  if ((*p & bit)==0) {\n                     if (*p > 0)\n                        *p += bit;\n                     else\n                        *p -= bit;\n                  }\n         }\n      } else {\n         k = j->spec_start;\n         do {\n            int r,s;\n            int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh\n            if (rs < 0) return stbi__err(\"bad huffman code\",\"Corrupt JPEG\");\n            s = rs & 15;\n            r = rs >> 4;\n            if (s == 0) {\n               if (r < 15) {\n                  j->eob_run = (1 << r) - 1;\n                  if (r)\n                     j->eob_run += stbi__jpeg_get_bits(j, r);\n                  r = 64; // force end of block\n               } else {\n                  // r=15 s=0 should write 16 0s, so we just do\n                  // a run of 15 0s and then write s (which is 0),\n                  // so we don't have to do anything special here\n               }\n            } else {\n               if (s != 1) return stbi__err(\"bad huffman code\", \"Corrupt JPEG\");\n               // sign bit\n               if (stbi__jpeg_get_bit(j))\n                  s = bit;\n               else\n                  s = -bit;\n            }\n\n            // advance by r\n            while (k <= j->spec_end) {\n               short *p = &data[stbi__jpeg_dezigzag[k++]];\n               if (*p != 0) {\n                  if (stbi__jpeg_get_bit(j))\n                     if ((*p & bit)==0) {\n                        if (*p > 0)\n                           *p += bit;\n                        else\n                           *p -= bit;\n                     }\n               } else {\n                  if (r == 0) {\n                     *p = (short) s;\n                     break;\n                  }\n                  --r;\n               }\n            }\n         } while (k <= j->spec_end);\n      }\n   }\n   return 1;\n}\n\n// take a -128..127 value and stbi__clamp it and convert to 0..255\nstbi_inline static stbi_uc stbi__clamp(int x)\n{\n   // trick to use a single test to catch both cases\n   if ((unsigned int) x > 255) {\n      if (x < 0) return 0;\n      if (x > 255) return 255;\n   }\n   return (stbi_uc) x;\n}\n\n#define stbi__f2f(x)  ((int) (((x) * 4096 + 0.5)))\n#define stbi__fsh(x)  ((x) * 4096)\n\n// derived from jidctint -- DCT_ISLOW\n#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \\\n   int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \\\n   p2 = s2;                                    \\\n   p3 = s6;                                    \\\n   p1 = (p2+p3) * stbi__f2f(0.5411961f);       \\\n   t2 = p1 + p3*stbi__f2f(-1.847759065f);      \\\n   t3 = p1 + p2*stbi__f2f( 0.765366865f);      \\\n   p2 = s0;                                    \\\n   p3 = s4;                                    \\\n   t0 = stbi__fsh(p2+p3);                      \\\n   t1 = stbi__fsh(p2-p3);                      \\\n   x0 = t0+t3;                                 \\\n   x3 = t0-t3;                                 \\\n   x1 = t1+t2;                                 \\\n   x2 = t1-t2;                                 \\\n   t0 = s7;                                    \\\n   t1 = s5;                                    \\\n   t2 = s3;                                    \\\n   t3 = s1;                                    \\\n   p3 = t0+t2;                                 \\\n   p4 = t1+t3;                                 \\\n   p1 = t0+t3;                                 \\\n   p2 = t1+t2;                                 \\\n   p5 = (p3+p4)*stbi__f2f( 1.175875602f);      \\\n   t0 = t0*stbi__f2f( 0.298631336f);           \\\n   t1 = t1*stbi__f2f( 2.053119869f);           \\\n   t2 = t2*stbi__f2f( 3.072711026f);           \\\n   t3 = t3*stbi__f2f( 1.501321110f);           \\\n   p1 = p5 + p1*stbi__f2f(-0.899976223f);      \\\n   p2 = p5 + p2*stbi__f2f(-2.562915447f);      \\\n   p3 = p3*stbi__f2f(-1.961570560f);           \\\n   p4 = p4*stbi__f2f(-0.390180644f);           \\\n   t3 += p1+p4;                                \\\n   t2 += p2+p3;                                \\\n   t1 += p2+p4;                                \\\n   t0 += p1+p3;\n\nstatic void stbi__idct_block(stbi_uc *out, int out_stride, short data[64])\n{\n   int i,val[64],*v=val;\n   stbi_uc *o;\n   short *d = data;\n\n   // columns\n   for (i=0; i < 8; ++i,++d, ++v) {\n      // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing\n      if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0\n           && d[40]==0 && d[48]==0 && d[56]==0) {\n         //    no shortcut                 0     seconds\n         //    (1|2|3|4|5|6|7)==0          0     seconds\n         //    all separate               -0.047 seconds\n         //    1 && 2|3 && 4|5 && 6|7:    -0.047 seconds\n         int dcterm = d[0]*4;\n         v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;\n      } else {\n         STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])\n         // constants scaled things up by 1<<12; let's bring them back\n         // down, but keep 2 extra bits of precision\n         x0 += 512; x1 += 512; x2 += 512; x3 += 512;\n         v[ 0] = (x0+t3) >> 10;\n         v[56] = (x0-t3) >> 10;\n         v[ 8] = (x1+t2) >> 10;\n         v[48] = (x1-t2) >> 10;\n         v[16] = (x2+t1) >> 10;\n         v[40] = (x2-t1) >> 10;\n         v[24] = (x3+t0) >> 10;\n         v[32] = (x3-t0) >> 10;\n      }\n   }\n\n   for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {\n      // no fast case since the first 1D IDCT spread components out\n      STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])\n      // constants scaled things up by 1<<12, plus we had 1<<2 from first\n      // loop, plus horizontal and vertical each scale by sqrt(8) so together\n      // we've got an extra 1<<3, so 1<<17 total we need to remove.\n      // so we want to round that, which means adding 0.5 * 1<<17,\n      // aka 65536. Also, we'll end up with -128 to 127 that we want\n      // to encode as 0..255 by adding 128, so we'll add that before the shift\n      x0 += 65536 + (128<<17);\n      x1 += 65536 + (128<<17);\n      x2 += 65536 + (128<<17);\n      x3 += 65536 + (128<<17);\n      // tried computing the shifts into temps, or'ing the temps to see\n      // if any were out of range, but that was slower\n      o[0] = stbi__clamp((x0+t3) >> 17);\n      o[7] = stbi__clamp((x0-t3) >> 17);\n      o[1] = stbi__clamp((x1+t2) >> 17);\n      o[6] = stbi__clamp((x1-t2) >> 17);\n      o[2] = stbi__clamp((x2+t1) >> 17);\n      o[5] = stbi__clamp((x2-t1) >> 17);\n      o[3] = stbi__clamp((x3+t0) >> 17);\n      o[4] = stbi__clamp((x3-t0) >> 17);\n   }\n}\n\n#ifdef STBI_SSE2\n// sse2 integer IDCT. not the fastest possible implementation but it\n// produces bit-identical results to the generic C version so it's\n// fully \"transparent\".\nstatic void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])\n{\n   // This is constructed to match our regular (generic) integer IDCT exactly.\n   __m128i row0, row1, row2, row3, row4, row5, row6, row7;\n   __m128i tmp;\n\n   // dot product constant: even elems=x, odd elems=y\n   #define dct_const(x,y)  _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))\n\n   // out(0) = c0[even]*x + c0[odd]*y   (c0, x, y 16-bit, out 32-bit)\n   // out(1) = c1[even]*x + c1[odd]*y\n   #define dct_rot(out0,out1, x,y,c0,c1) \\\n      __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \\\n      __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \\\n      __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \\\n      __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \\\n      __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \\\n      __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)\n\n   // out = in << 12  (in 16-bit, out 32-bit)\n   #define dct_widen(out, in) \\\n      __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \\\n      __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)\n\n   // wide add\n   #define dct_wadd(out, a, b) \\\n      __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \\\n      __m128i out##_h = _mm_add_epi32(a##_h, b##_h)\n\n   // wide sub\n   #define dct_wsub(out, a, b) \\\n      __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \\\n      __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)\n\n   // butterfly a/b, add bias, then shift by \"s\" and pack\n   #define dct_bfly32o(out0, out1, a,b,bias,s) \\\n      { \\\n         __m128i abiased_l = _mm_add_epi32(a##_l, bias); \\\n         __m128i abiased_h = _mm_add_epi32(a##_h, bias); \\\n         dct_wadd(sum, abiased, b); \\\n         dct_wsub(dif, abiased, b); \\\n         out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \\\n         out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \\\n      }\n\n   // 8-bit interleave step (for transposes)\n   #define dct_interleave8(a, b) \\\n      tmp = a; \\\n      a = _mm_unpacklo_epi8(a, b); \\\n      b = _mm_unpackhi_epi8(tmp, b)\n\n   // 16-bit interleave step (for transposes)\n   #define dct_interleave16(a, b) \\\n      tmp = a; \\\n      a = _mm_unpacklo_epi16(a, b); \\\n      b = _mm_unpackhi_epi16(tmp, b)\n\n   #define dct_pass(bias,shift) \\\n      { \\\n         /* even part */ \\\n         dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \\\n         __m128i sum04 = _mm_add_epi16(row0, row4); \\\n         __m128i dif04 = _mm_sub_epi16(row0, row4); \\\n         dct_widen(t0e, sum04); \\\n         dct_widen(t1e, dif04); \\\n         dct_wadd(x0, t0e, t3e); \\\n         dct_wsub(x3, t0e, t3e); \\\n         dct_wadd(x1, t1e, t2e); \\\n         dct_wsub(x2, t1e, t2e); \\\n         /* odd part */ \\\n         dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \\\n         dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \\\n         __m128i sum17 = _mm_add_epi16(row1, row7); \\\n         __m128i sum35 = _mm_add_epi16(row3, row5); \\\n         dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \\\n         dct_wadd(x4, y0o, y4o); \\\n         dct_wadd(x5, y1o, y5o); \\\n         dct_wadd(x6, y2o, y5o); \\\n         dct_wadd(x7, y3o, y4o); \\\n         dct_bfly32o(row0,row7, x0,x7,bias,shift); \\\n         dct_bfly32o(row1,row6, x1,x6,bias,shift); \\\n         dct_bfly32o(row2,row5, x2,x5,bias,shift); \\\n         dct_bfly32o(row3,row4, x3,x4,bias,shift); \\\n      }\n\n   __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));\n   __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));\n   __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));\n   __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));\n   __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));\n   __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));\n   __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));\n   __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f));\n\n   // rounding biases in column/row passes, see stbi__idct_block for explanation.\n   __m128i bias_0 = _mm_set1_epi32(512);\n   __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));\n\n   // load\n   row0 = _mm_load_si128((const __m128i *) (data + 0*8));\n   row1 = _mm_load_si128((const __m128i *) (data + 1*8));\n   row2 = _mm_load_si128((const __m128i *) (data + 2*8));\n   row3 = _mm_load_si128((const __m128i *) (data + 3*8));\n   row4 = _mm_load_si128((const __m128i *) (data + 4*8));\n   row5 = _mm_load_si128((const __m128i *) (data + 5*8));\n   row6 = _mm_load_si128((const __m128i *) (data + 6*8));\n   row7 = _mm_load_si128((const __m128i *) (data + 7*8));\n\n   // column pass\n   dct_pass(bias_0, 10);\n\n   {\n      // 16bit 8x8 transpose pass 1\n      dct_interleave16(row0, row4);\n      dct_interleave16(row1, row5);\n      dct_interleave16(row2, row6);\n      dct_interleave16(row3, row7);\n\n      // transpose pass 2\n      dct_interleave16(row0, row2);\n      dct_interleave16(row1, row3);\n      dct_interleave16(row4, row6);\n      dct_interleave16(row5, row7);\n\n      // transpose pass 3\n      dct_interleave16(row0, row1);\n      dct_interleave16(row2, row3);\n      dct_interleave16(row4, row5);\n      dct_interleave16(row6, row7);\n   }\n\n   // row pass\n   dct_pass(bias_1, 17);\n\n   {\n      // pack\n      __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7\n      __m128i p1 = _mm_packus_epi16(row2, row3);\n      __m128i p2 = _mm_packus_epi16(row4, row5);\n      __m128i p3 = _mm_packus_epi16(row6, row7);\n\n      // 8bit 8x8 transpose pass 1\n      dct_interleave8(p0, p2); // a0e0a1e1...\n      dct_interleave8(p1, p3); // c0g0c1g1...\n\n      // transpose pass 2\n      dct_interleave8(p0, p1); // a0c0e0g0...\n      dct_interleave8(p2, p3); // b0d0f0h0...\n\n      // transpose pass 3\n      dct_interleave8(p0, p2); // a0b0c0d0...\n      dct_interleave8(p1, p3); // a4b4c4d4...\n\n      // store\n      _mm_storel_epi64((__m128i *) out, p0); out += out_stride;\n      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;\n      _mm_storel_epi64((__m128i *) out, p2); out += out_stride;\n      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;\n      _mm_storel_epi64((__m128i *) out, p1); out += out_stride;\n      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;\n      _mm_storel_epi64((__m128i *) out, p3); out += out_stride;\n      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));\n   }\n\n#undef dct_const\n#undef dct_rot\n#undef dct_widen\n#undef dct_wadd\n#undef dct_wsub\n#undef dct_bfly32o\n#undef dct_interleave8\n#undef dct_interleave16\n#undef dct_pass\n}\n\n#endif // STBI_SSE2\n\n#ifdef STBI_NEON\n\n// NEON integer IDCT. should produce bit-identical\n// results to the generic C version.\nstatic void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])\n{\n   int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;\n\n   int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));\n   int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));\n   int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f));\n   int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f));\n   int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));\n   int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));\n   int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));\n   int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));\n   int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f));\n   int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f));\n   int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f));\n   int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f));\n\n#define dct_long_mul(out, inq, coeff) \\\n   int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \\\n   int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)\n\n#define dct_long_mac(out, acc, inq, coeff) \\\n   int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \\\n   int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)\n\n#define dct_widen(out, inq) \\\n   int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \\\n   int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)\n\n// wide add\n#define dct_wadd(out, a, b) \\\n   int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \\\n   int32x4_t out##_h = vaddq_s32(a##_h, b##_h)\n\n// wide sub\n#define dct_wsub(out, a, b) \\\n   int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \\\n   int32x4_t out##_h = vsubq_s32(a##_h, b##_h)\n\n// butterfly a/b, then shift using \"shiftop\" by \"s\" and pack\n#define dct_bfly32o(out0,out1, a,b,shiftop,s) \\\n   { \\\n      dct_wadd(sum, a, b); \\\n      dct_wsub(dif, a, b); \\\n      out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \\\n      out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \\\n   }\n\n#define dct_pass(shiftop, shift) \\\n   { \\\n      /* even part */ \\\n      int16x8_t sum26 = vaddq_s16(row2, row6); \\\n      dct_long_mul(p1e, sum26, rot0_0); \\\n      dct_long_mac(t2e, p1e, row6, rot0_1); \\\n      dct_long_mac(t3e, p1e, row2, rot0_2); \\\n      int16x8_t sum04 = vaddq_s16(row0, row4); \\\n      int16x8_t dif04 = vsubq_s16(row0, row4); \\\n      dct_widen(t0e, sum04); \\\n      dct_widen(t1e, dif04); \\\n      dct_wadd(x0, t0e, t3e); \\\n      dct_wsub(x3, t0e, t3e); \\\n      dct_wadd(x1, t1e, t2e); \\\n      dct_wsub(x2, t1e, t2e); \\\n      /* odd part */ \\\n      int16x8_t sum15 = vaddq_s16(row1, row5); \\\n      int16x8_t sum17 = vaddq_s16(row1, row7); \\\n      int16x8_t sum35 = vaddq_s16(row3, row5); \\\n      int16x8_t sum37 = vaddq_s16(row3, row7); \\\n      int16x8_t sumodd = vaddq_s16(sum17, sum35); \\\n      dct_long_mul(p5o, sumodd, rot1_0); \\\n      dct_long_mac(p1o, p5o, sum17, rot1_1); \\\n      dct_long_mac(p2o, p5o, sum35, rot1_2); \\\n      dct_long_mul(p3o, sum37, rot2_0); \\\n      dct_long_mul(p4o, sum15, rot2_1); \\\n      dct_wadd(sump13o, p1o, p3o); \\\n      dct_wadd(sump24o, p2o, p4o); \\\n      dct_wadd(sump23o, p2o, p3o); \\\n      dct_wadd(sump14o, p1o, p4o); \\\n      dct_long_mac(x4, sump13o, row7, rot3_0); \\\n      dct_long_mac(x5, sump24o, row5, rot3_1); \\\n      dct_long_mac(x6, sump23o, row3, rot3_2); \\\n      dct_long_mac(x7, sump14o, row1, rot3_3); \\\n      dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \\\n      dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \\\n      dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \\\n      dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \\\n   }\n\n   // load\n   row0 = vld1q_s16(data + 0*8);\n   row1 = vld1q_s16(data + 1*8);\n   row2 = vld1q_s16(data + 2*8);\n   row3 = vld1q_s16(data + 3*8);\n   row4 = vld1q_s16(data + 4*8);\n   row5 = vld1q_s16(data + 5*8);\n   row6 = vld1q_s16(data + 6*8);\n   row7 = vld1q_s16(data + 7*8);\n\n   // add DC bias\n   row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));\n\n   // column pass\n   dct_pass(vrshrn_n_s32, 10);\n\n   // 16bit 8x8 transpose\n   {\n// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively.\n// whether compilers actually get this is another story, sadly.\n#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }\n#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); }\n#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); }\n\n      // pass 1\n      dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6\n      dct_trn16(row2, row3);\n      dct_trn16(row4, row5);\n      dct_trn16(row6, row7);\n\n      // pass 2\n      dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4\n      dct_trn32(row1, row3);\n      dct_trn32(row4, row6);\n      dct_trn32(row5, row7);\n\n      // pass 3\n      dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0\n      dct_trn64(row1, row5);\n      dct_trn64(row2, row6);\n      dct_trn64(row3, row7);\n\n#undef dct_trn16\n#undef dct_trn32\n#undef dct_trn64\n   }\n\n   // row pass\n   // vrshrn_n_s32 only supports shifts up to 16, we need\n   // 17. so do a non-rounding shift of 16 first then follow\n   // up with a rounding shift by 1.\n   dct_pass(vshrn_n_s32, 16);\n\n   {\n      // pack and round\n      uint8x8_t p0 = vqrshrun_n_s16(row0, 1);\n      uint8x8_t p1 = vqrshrun_n_s16(row1, 1);\n      uint8x8_t p2 = vqrshrun_n_s16(row2, 1);\n      uint8x8_t p3 = vqrshrun_n_s16(row3, 1);\n      uint8x8_t p4 = vqrshrun_n_s16(row4, 1);\n      uint8x8_t p5 = vqrshrun_n_s16(row5, 1);\n      uint8x8_t p6 = vqrshrun_n_s16(row6, 1);\n      uint8x8_t p7 = vqrshrun_n_s16(row7, 1);\n\n      // again, these can translate into one instruction, but often don't.\n#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }\n#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); }\n#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); }\n\n      // sadly can't use interleaved stores here since we only write\n      // 8 bytes to each scan line!\n\n      // 8x8 8-bit transpose pass 1\n      dct_trn8_8(p0, p1);\n      dct_trn8_8(p2, p3);\n      dct_trn8_8(p4, p5);\n      dct_trn8_8(p6, p7);\n\n      // pass 2\n      dct_trn8_16(p0, p2);\n      dct_trn8_16(p1, p3);\n      dct_trn8_16(p4, p6);\n      dct_trn8_16(p5, p7);\n\n      // pass 3\n      dct_trn8_32(p0, p4);\n      dct_trn8_32(p1, p5);\n      dct_trn8_32(p2, p6);\n      dct_trn8_32(p3, p7);\n\n      // store\n      vst1_u8(out, p0); out += out_stride;\n      vst1_u8(out, p1); out += out_stride;\n      vst1_u8(out, p2); out += out_stride;\n      vst1_u8(out, p3); out += out_stride;\n      vst1_u8(out, p4); out += out_stride;\n      vst1_u8(out, p5); out += out_stride;\n      vst1_u8(out, p6); out += out_stride;\n      vst1_u8(out, p7);\n\n#undef dct_trn8_8\n#undef dct_trn8_16\n#undef dct_trn8_32\n   }\n\n#undef dct_long_mul\n#undef dct_long_mac\n#undef dct_widen\n#undef dct_wadd\n#undef dct_wsub\n#undef dct_bfly32o\n#undef dct_pass\n}\n\n#endif // STBI_NEON\n\n#define STBI__MARKER_none  0xff\n// if there's a pending marker from the entropy stream, return that\n// otherwise, fetch from the stream and get a marker. if there's no\n// marker, return 0xff, which is never a valid marker value\nstatic stbi_uc stbi__get_marker(stbi__jpeg *j)\n{\n   stbi_uc x;\n   if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; }\n   x = stbi__get8(j->s);\n   if (x != 0xff) return STBI__MARKER_none;\n   while (x == 0xff)\n      x = stbi__get8(j->s); // consume repeated 0xff fill bytes\n   return x;\n}\n\n// in each scan, we'll have scan_n components, and the order\n// of the components is specified by order[]\n#define STBI__RESTART(x)     ((x) >= 0xd0 && (x) <= 0xd7)\n\n// after a restart interval, stbi__jpeg_reset the entropy decoder and\n// the dc prediction\nstatic void stbi__jpeg_reset(stbi__jpeg *j)\n{\n   j->code_bits = 0;\n   j->code_buffer = 0;\n   j->nomore = 0;\n   j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0;\n   j->marker = STBI__MARKER_none;\n   j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;\n   j->eob_run = 0;\n   // no more than 1<<31 MCUs if no restart_interal? that's plenty safe,\n   // since we don't even allow 1<<30 pixels\n}\n\nstatic int stbi__parse_entropy_coded_data(stbi__jpeg *z)\n{\n   stbi__jpeg_reset(z);\n   if (!z->progressive) {\n      if (z->scan_n == 1) {\n         int i,j;\n         STBI_SIMD_ALIGN(short, data[64]);\n         int n = z->order[0];\n         // non-interleaved data, we just need to process one block at a time,\n         // in trivial scanline order\n         // number of blocks to do just depends on how many actual \"pixels\" this\n         // component has, independent of interleaved MCU blocking and such\n         int w = (z->img_comp[n].x+7) >> 3;\n         int h = (z->img_comp[n].y+7) >> 3;\n         for (j=0; j < h; ++j) {\n            for (i=0; i < w; ++i) {\n               int ha = z->img_comp[n].ha;\n               if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0;\n               z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);\n               // every data block is an MCU, so countdown the restart interval\n               if (--z->todo <= 0) {\n                  if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);\n                  // if it's NOT a restart, then just bail, so we get corrupt data\n                  // rather than no data\n                  if (!STBI__RESTART(z->marker)) return 1;\n                  stbi__jpeg_reset(z);\n               }\n            }\n         }\n         return 1;\n      } else { // interleaved\n         int i,j,k,x,y;\n         STBI_SIMD_ALIGN(short, data[64]);\n         for (j=0; j < z->img_mcu_y; ++j) {\n            for (i=0; i < z->img_mcu_x; ++i) {\n               // scan an interleaved mcu... process scan_n components in order\n               for (k=0; k < z->scan_n; ++k) {\n                  int n = z->order[k];\n                  // scan out an mcu's worth of this component; that's just determined\n                  // by the basic H and V specified for the component\n                  for (y=0; y < z->img_comp[n].v; ++y) {\n                     for (x=0; x < z->img_comp[n].h; ++x) {\n                        int x2 = (i*z->img_comp[n].h + x)*8;\n                        int y2 = (j*z->img_comp[n].v + y)*8;\n                        int ha = z->img_comp[n].ha;\n                        if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0;\n                        z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data);\n                     }\n                  }\n               }\n               // after all interleaved components, that's an interleaved MCU,\n               // so now count down the restart interval\n               if (--z->todo <= 0) {\n                  if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);\n                  if (!STBI__RESTART(z->marker)) return 1;\n                  stbi__jpeg_reset(z);\n               }\n            }\n         }\n         return 1;\n      }\n   } else {\n      if (z->scan_n == 1) {\n         int i,j;\n         int n = z->order[0];\n         // non-interleaved data, we just need to process one block at a time,\n         // in trivial scanline order\n         // number of blocks to do just depends on how many actual \"pixels\" this\n         // component has, independent of interleaved MCU blocking and such\n         int w = (z->img_comp[n].x+7) >> 3;\n         int h = (z->img_comp[n].y+7) >> 3;\n         for (j=0; j < h; ++j) {\n            for (i=0; i < w; ++i) {\n               short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);\n               if (z->spec_start == 0) {\n                  if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))\n                     return 0;\n               } else {\n                  int ha = z->img_comp[n].ha;\n                  if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))\n                     return 0;\n               }\n               // every data block is an MCU, so countdown the restart interval\n               if (--z->todo <= 0) {\n                  if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);\n                  if (!STBI__RESTART(z->marker)) return 1;\n                  stbi__jpeg_reset(z);\n               }\n            }\n         }\n         return 1;\n      } else { // interleaved\n         int i,j,k,x,y;\n         for (j=0; j < z->img_mcu_y; ++j) {\n            for (i=0; i < z->img_mcu_x; ++i) {\n               // scan an interleaved mcu... process scan_n components in order\n               for (k=0; k < z->scan_n; ++k) {\n                  int n = z->order[k];\n                  // scan out an mcu's worth of this component; that's just determined\n                  // by the basic H and V specified for the component\n                  for (y=0; y < z->img_comp[n].v; ++y) {\n                     for (x=0; x < z->img_comp[n].h; ++x) {\n                        int x2 = (i*z->img_comp[n].h + x);\n                        int y2 = (j*z->img_comp[n].v + y);\n                        short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);\n                        if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))\n                           return 0;\n                     }\n                  }\n               }\n               // after all interleaved components, that's an interleaved MCU,\n               // so now count down the restart interval\n               if (--z->todo <= 0) {\n                  if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);\n                  if (!STBI__RESTART(z->marker)) return 1;\n                  stbi__jpeg_reset(z);\n               }\n            }\n         }\n         return 1;\n      }\n   }\n}\n\nstatic void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant)\n{\n   int i;\n   for (i=0; i < 64; ++i)\n      data[i] *= dequant[i];\n}\n\nstatic void stbi__jpeg_finish(stbi__jpeg *z)\n{\n   if (z->progressive) {\n      // dequantize and idct the data\n      int i,j,n;\n      for (n=0; n < z->s->img_n; ++n) {\n         int w = (z->img_comp[n].x+7) >> 3;\n         int h = (z->img_comp[n].y+7) >> 3;\n         for (j=0; j < h; ++j) {\n            for (i=0; i < w; ++i) {\n               short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);\n               stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);\n               z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);\n            }\n         }\n      }\n   }\n}\n\nstatic int stbi__process_marker(stbi__jpeg *z, int m)\n{\n   int L;\n   switch (m) {\n      case STBI__MARKER_none: // no marker found\n         return stbi__err(\"expected marker\",\"Corrupt JPEG\");\n\n      case 0xDD: // DRI - specify restart interval\n         if (stbi__get16be(z->s) != 4) return stbi__err(\"bad DRI len\",\"Corrupt JPEG\");\n         z->restart_interval = stbi__get16be(z->s);\n         return 1;\n\n      case 0xDB: // DQT - define quantization table\n         L = stbi__get16be(z->s)-2;\n         while (L > 0) {\n            int q = stbi__get8(z->s);\n            int p = q >> 4, sixteen = (p != 0);\n            int t = q & 15,i;\n            if (p != 0 && p != 1) return stbi__err(\"bad DQT type\",\"Corrupt JPEG\");\n            if (t > 3) return stbi__err(\"bad DQT table\",\"Corrupt JPEG\");\n\n            for (i=0; i < 64; ++i)\n               z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s));\n            L -= (sixteen ? 129 : 65);\n         }\n         return L==0;\n\n      case 0xC4: // DHT - define huffman table\n         L = stbi__get16be(z->s)-2;\n         while (L > 0) {\n            stbi_uc *v;\n            int sizes[16],i,n=0;\n            int q = stbi__get8(z->s);\n            int tc = q >> 4;\n            int th = q & 15;\n            if (tc > 1 || th > 3) return stbi__err(\"bad DHT header\",\"Corrupt JPEG\");\n            for (i=0; i < 16; ++i) {\n               sizes[i] = stbi__get8(z->s);\n               n += sizes[i];\n            }\n            if(n > 256) return stbi__err(\"bad DHT header\",\"Corrupt JPEG\"); // Loop over i < n would write past end of values!\n            L -= 17;\n            if (tc == 0) {\n               if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0;\n               v = z->huff_dc[th].values;\n            } else {\n               if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0;\n               v = z->huff_ac[th].values;\n            }\n            for (i=0; i < n; ++i)\n               v[i] = stbi__get8(z->s);\n            if (tc != 0)\n               stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);\n            L -= n;\n         }\n         return L==0;\n   }\n\n   // check for comment block or APP blocks\n   if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {\n      L = stbi__get16be(z->s);\n      if (L < 2) {\n         if (m == 0xFE)\n            return stbi__err(\"bad COM len\",\"Corrupt JPEG\");\n         else\n            return stbi__err(\"bad APP len\",\"Corrupt JPEG\");\n      }\n      L -= 2;\n\n      if (m == 0xE0 && L >= 5) { // JFIF APP0 segment\n         static const unsigned char tag[5] = {'J','F','I','F','\\0'};\n         int ok = 1;\n         int i;\n         for (i=0; i < 5; ++i)\n            if (stbi__get8(z->s) != tag[i])\n               ok = 0;\n         L -= 5;\n         if (ok)\n            z->jfif = 1;\n      } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment\n         static const unsigned char tag[6] = {'A','d','o','b','e','\\0'};\n         int ok = 1;\n         int i;\n         for (i=0; i < 6; ++i)\n            if (stbi__get8(z->s) != tag[i])\n               ok = 0;\n         L -= 6;\n         if (ok) {\n            stbi__get8(z->s); // version\n            stbi__get16be(z->s); // flags0\n            stbi__get16be(z->s); // flags1\n            z->app14_color_transform = stbi__get8(z->s); // color transform\n            L -= 6;\n         }\n      }\n\n      stbi__skip(z->s, L);\n      return 1;\n   }\n\n   return stbi__err(\"unknown marker\",\"Corrupt JPEG\");\n}\n\n// after we see SOS\nstatic int stbi__process_scan_header(stbi__jpeg *z)\n{\n   int i;\n   int Ls = stbi__get16be(z->s);\n   z->scan_n = stbi__get8(z->s);\n   if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err(\"bad SOS component count\",\"Corrupt JPEG\");\n   if (Ls != 6+2*z->scan_n) return stbi__err(\"bad SOS len\",\"Corrupt JPEG\");\n   for (i=0; i < z->scan_n; ++i) {\n      int id = stbi__get8(z->s), which;\n      int q = stbi__get8(z->s);\n      for (which = 0; which < z->s->img_n; ++which)\n         if (z->img_comp[which].id == id)\n            break;\n      if (which == z->s->img_n) return 0; // no match\n      z->img_comp[which].hd = q >> 4;   if (z->img_comp[which].hd > 3) return stbi__err(\"bad DC huff\",\"Corrupt JPEG\");\n      z->img_comp[which].ha = q & 15;   if (z->img_comp[which].ha > 3) return stbi__err(\"bad AC huff\",\"Corrupt JPEG\");\n      z->order[i] = which;\n   }\n\n   {\n      int aa;\n      z->spec_start = stbi__get8(z->s);\n      z->spec_end   = stbi__get8(z->s); // should be 63, but might be 0\n      aa = stbi__get8(z->s);\n      z->succ_high = (aa >> 4);\n      z->succ_low  = (aa & 15);\n      if (z->progressive) {\n         if (z->spec_start > 63 || z->spec_end > 63  || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)\n            return stbi__err(\"bad SOS\", \"Corrupt JPEG\");\n      } else {\n         if (z->spec_start != 0) return stbi__err(\"bad SOS\",\"Corrupt JPEG\");\n         if (z->succ_high != 0 || z->succ_low != 0) return stbi__err(\"bad SOS\",\"Corrupt JPEG\");\n         z->spec_end = 63;\n      }\n   }\n\n   return 1;\n}\n\nstatic int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why)\n{\n   int i;\n   for (i=0; i < ncomp; ++i) {\n      if (z->img_comp[i].raw_data) {\n         STBI_FREE(z->img_comp[i].raw_data);\n         z->img_comp[i].raw_data = NULL;\n         z->img_comp[i].data = NULL;\n      }\n      if (z->img_comp[i].raw_coeff) {\n         STBI_FREE(z->img_comp[i].raw_coeff);\n         z->img_comp[i].raw_coeff = 0;\n         z->img_comp[i].coeff = 0;\n      }\n      if (z->img_comp[i].linebuf) {\n         STBI_FREE(z->img_comp[i].linebuf);\n         z->img_comp[i].linebuf = NULL;\n      }\n   }\n   return why;\n}\n\nstatic int stbi__process_frame_header(stbi__jpeg *z, int scan)\n{\n   stbi__context *s = z->s;\n   int Lf,p,i,q, h_max=1,v_max=1,c;\n   Lf = stbi__get16be(s);         if (Lf < 11) return stbi__err(\"bad SOF len\",\"Corrupt JPEG\"); // JPEG\n   p  = stbi__get8(s);            if (p != 8) return stbi__err(\"only 8-bit\",\"JPEG format not supported: 8-bit only\"); // JPEG baseline\n   s->img_y = stbi__get16be(s);   if (s->img_y == 0) return stbi__err(\"no header height\", \"JPEG format not supported: delayed height\"); // Legal, but we don't handle it--but neither does IJG\n   s->img_x = stbi__get16be(s);   if (s->img_x == 0) return stbi__err(\"0 width\",\"Corrupt JPEG\"); // JPEG requires\n   if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err(\"too large\",\"Very large image (corrupt?)\");\n   if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err(\"too large\",\"Very large image (corrupt?)\");\n   c = stbi__get8(s);\n   if (c != 3 && c != 1 && c != 4) return stbi__err(\"bad component count\",\"Corrupt JPEG\");\n   s->img_n = c;\n   for (i=0; i < c; ++i) {\n      z->img_comp[i].data = NULL;\n      z->img_comp[i].linebuf = NULL;\n   }\n\n   if (Lf != 8+3*s->img_n) return stbi__err(\"bad SOF len\",\"Corrupt JPEG\");\n\n   z->rgb = 0;\n   for (i=0; i < s->img_n; ++i) {\n      static const unsigned char rgb[3] = { 'R', 'G', 'B' };\n      z->img_comp[i].id = stbi__get8(s);\n      if (s->img_n == 3 && z->img_comp[i].id == rgb[i])\n         ++z->rgb;\n      q = stbi__get8(s);\n      z->img_comp[i].h = (q >> 4);  if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err(\"bad H\",\"Corrupt JPEG\");\n      z->img_comp[i].v = q & 15;    if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err(\"bad V\",\"Corrupt JPEG\");\n      z->img_comp[i].tq = stbi__get8(s);  if (z->img_comp[i].tq > 3) return stbi__err(\"bad TQ\",\"Corrupt JPEG\");\n   }\n\n   if (scan != STBI__SCAN_load) return 1;\n\n   if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err(\"too large\", \"Image too large to decode\");\n\n   for (i=0; i < s->img_n; ++i) {\n      if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;\n      if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;\n   }\n\n   // check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios\n   // and I've never seen a non-corrupted JPEG file actually use them\n   for (i=0; i < s->img_n; ++i) {\n      if (h_max % z->img_comp[i].h != 0) return stbi__err(\"bad H\",\"Corrupt JPEG\");\n      if (v_max % z->img_comp[i].v != 0) return stbi__err(\"bad V\",\"Corrupt JPEG\");\n   }\n\n   // compute interleaved mcu info\n   z->img_h_max = h_max;\n   z->img_v_max = v_max;\n   z->img_mcu_w = h_max * 8;\n   z->img_mcu_h = v_max * 8;\n   // these sizes can't be more than 17 bits\n   z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;\n   z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;\n\n   for (i=0; i < s->img_n; ++i) {\n      // number of effective pixels (e.g. for non-interleaved MCU)\n      z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;\n      z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;\n      // to simplify generation, we'll allocate enough memory to decode\n      // the bogus oversized data from using interleaved MCUs and their\n      // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't\n      // discard the extra data until colorspace conversion\n      //\n      // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier)\n      // so these muls can't overflow with 32-bit ints (which we require)\n      z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;\n      z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;\n      z->img_comp[i].coeff = 0;\n      z->img_comp[i].raw_coeff = 0;\n      z->img_comp[i].linebuf = NULL;\n      z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15);\n      if (z->img_comp[i].raw_data == NULL)\n         return stbi__free_jpeg_components(z, i+1, stbi__err(\"outofmem\", \"Out of memory\"));\n      // align blocks for idct using mmx/sse\n      z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15);\n      if (z->progressive) {\n         // w2, h2 are multiples of 8 (see above)\n         z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8;\n         z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8;\n         z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15);\n         if (z->img_comp[i].raw_coeff == NULL)\n            return stbi__free_jpeg_components(z, i+1, stbi__err(\"outofmem\", \"Out of memory\"));\n         z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15);\n      }\n   }\n\n   return 1;\n}\n\n// use comparisons since in some cases we handle more than one case (e.g. SOF)\n#define stbi__DNL(x)         ((x) == 0xdc)\n#define stbi__SOI(x)         ((x) == 0xd8)\n#define stbi__EOI(x)         ((x) == 0xd9)\n#define stbi__SOF(x)         ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)\n#define stbi__SOS(x)         ((x) == 0xda)\n\n#define stbi__SOF_progressive(x)   ((x) == 0xc2)\n\nstatic int stbi__decode_jpeg_header(stbi__jpeg *z, int scan)\n{\n   int m;\n   z->jfif = 0;\n   z->app14_color_transform = -1; // valid values are 0,1,2\n   z->marker = STBI__MARKER_none; // initialize cached marker to empty\n   m = stbi__get_marker(z);\n   if (!stbi__SOI(m)) return stbi__err(\"no SOI\",\"Corrupt JPEG\");\n   if (scan == STBI__SCAN_type) return 1;\n   m = stbi__get_marker(z);\n   while (!stbi__SOF(m)) {\n      if (!stbi__process_marker(z,m)) return 0;\n      m = stbi__get_marker(z);\n      while (m == STBI__MARKER_none) {\n         // some files have extra padding after their blocks, so ok, we'll scan\n         if (stbi__at_eof(z->s)) return stbi__err(\"no SOF\", \"Corrupt JPEG\");\n         m = stbi__get_marker(z);\n      }\n   }\n   z->progressive = stbi__SOF_progressive(m);\n   if (!stbi__process_frame_header(z, scan)) return 0;\n   return 1;\n}\n\nstatic stbi_uc stbi__skip_jpeg_junk_at_end(stbi__jpeg *j)\n{\n   // some JPEGs have junk at end, skip over it but if we find what looks\n   // like a valid marker, resume there\n   while (!stbi__at_eof(j->s)) {\n      stbi_uc x = stbi__get8(j->s);\n      while (x == 0xff) { // might be a marker\n         if (stbi__at_eof(j->s)) return STBI__MARKER_none;\n         x = stbi__get8(j->s);\n         if (x != 0x00 && x != 0xff) {\n            // not a stuffed zero or lead-in to another marker, looks\n            // like an actual marker, return it\n            return x;\n         }\n         // stuffed zero has x=0 now which ends the loop, meaning we go\n         // back to regular scan loop.\n         // repeated 0xff keeps trying to read the next byte of the marker.\n      }\n   }\n   return STBI__MARKER_none;\n}\n\n// decode image to YCbCr format\nstatic int stbi__decode_jpeg_image(stbi__jpeg *j)\n{\n   int m;\n   for (m = 0; m < 4; m++) {\n      j->img_comp[m].raw_data = NULL;\n      j->img_comp[m].raw_coeff = NULL;\n   }\n   j->restart_interval = 0;\n   if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0;\n   m = stbi__get_marker(j);\n   while (!stbi__EOI(m)) {\n      if (stbi__SOS(m)) {\n         if (!stbi__process_scan_header(j)) return 0;\n         if (!stbi__parse_entropy_coded_data(j)) return 0;\n         if (j->marker == STBI__MARKER_none ) {\n         j->marker = stbi__skip_jpeg_junk_at_end(j);\n            // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0\n         }\n         m = stbi__get_marker(j);\n         if (STBI__RESTART(m))\n            m = stbi__get_marker(j);\n      } else if (stbi__DNL(m)) {\n         int Ld = stbi__get16be(j->s);\n         stbi__uint32 NL = stbi__get16be(j->s);\n         if (Ld != 4) return stbi__err(\"bad DNL len\", \"Corrupt JPEG\");\n         if (NL != j->s->img_y) return stbi__err(\"bad DNL height\", \"Corrupt JPEG\");\n         m = stbi__get_marker(j);\n      } else {\n         if (!stbi__process_marker(j, m)) return 1;\n         m = stbi__get_marker(j);\n      }\n   }\n   if (j->progressive)\n      stbi__jpeg_finish(j);\n   return 1;\n}\n\n// static jfif-centered resampling (across block boundaries)\n\ntypedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1,\n                                    int w, int hs);\n\n#define stbi__div4(x) ((stbi_uc) ((x) >> 2))\n\nstatic stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n   STBI_NOTUSED(out);\n   STBI_NOTUSED(in_far);\n   STBI_NOTUSED(w);\n   STBI_NOTUSED(hs);\n   return in_near;\n}\n\nstatic stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n   // need to generate two samples vertically for every one in input\n   int i;\n   STBI_NOTUSED(hs);\n   for (i=0; i < w; ++i)\n      out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);\n   return out;\n}\n\nstatic stbi_uc*  stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n   // need to generate two samples horizontally for every one in input\n   int i;\n   stbi_uc *input = in_near;\n\n   if (w == 1) {\n      // if only one sample, can't do any interpolation\n      out[0] = out[1] = input[0];\n      return out;\n   }\n\n   out[0] = input[0];\n   out[1] = stbi__div4(input[0]*3 + input[1] + 2);\n   for (i=1; i < w-1; ++i) {\n      int n = 3*input[i]+2;\n      out[i*2+0] = stbi__div4(n+input[i-1]);\n      out[i*2+1] = stbi__div4(n+input[i+1]);\n   }\n   out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);\n   out[i*2+1] = input[w-1];\n\n   STBI_NOTUSED(in_far);\n   STBI_NOTUSED(hs);\n\n   return out;\n}\n\n#define stbi__div16(x) ((stbi_uc) ((x) >> 4))\n\nstatic stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n   // need to generate 2x2 samples for every one in input\n   int i,t0,t1;\n   if (w == 1) {\n      out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);\n      return out;\n   }\n\n   t1 = 3*in_near[0] + in_far[0];\n   out[0] = stbi__div4(t1+2);\n   for (i=1; i < w; ++i) {\n      t0 = t1;\n      t1 = 3*in_near[i]+in_far[i];\n      out[i*2-1] = stbi__div16(3*t0 + t1 + 8);\n      out[i*2  ] = stbi__div16(3*t1 + t0 + 8);\n   }\n   out[w*2-1] = stbi__div4(t1+2);\n\n   STBI_NOTUSED(hs);\n\n   return out;\n}\n\n#if defined(STBI_SSE2) || defined(STBI_NEON)\nstatic stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n   // need to generate 2x2 samples for every one in input\n   int i=0,t0,t1;\n\n   if (w == 1) {\n      out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);\n      return out;\n   }\n\n   t1 = 3*in_near[0] + in_far[0];\n   // process groups of 8 pixels for as long as we can.\n   // note we can't handle the last pixel in a row in this loop\n   // because we need to handle the filter boundary conditions.\n   for (; i < ((w-1) & ~7); i += 8) {\n#if defined(STBI_SSE2)\n      // load and perform the vertical filtering pass\n      // this uses 3*x + y = 4*x + (y - x)\n      __m128i zero  = _mm_setzero_si128();\n      __m128i farb  = _mm_loadl_epi64((__m128i *) (in_far + i));\n      __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));\n      __m128i farw  = _mm_unpacklo_epi8(farb, zero);\n      __m128i nearw = _mm_unpacklo_epi8(nearb, zero);\n      __m128i diff  = _mm_sub_epi16(farw, nearw);\n      __m128i nears = _mm_slli_epi16(nearw, 2);\n      __m128i curr  = _mm_add_epi16(nears, diff); // current row\n\n      // horizontal filter works the same based on shifted vers of current\n      // row. \"prev\" is current row shifted right by 1 pixel; we need to\n      // insert the previous pixel value (from t1).\n      // \"next\" is current row shifted left by 1 pixel, with first pixel\n      // of next block of 8 pixels added in.\n      __m128i prv0 = _mm_slli_si128(curr, 2);\n      __m128i nxt0 = _mm_srli_si128(curr, 2);\n      __m128i prev = _mm_insert_epi16(prv0, t1, 0);\n      __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);\n\n      // horizontal filter, polyphase implementation since it's convenient:\n      // even pixels = 3*cur + prev = cur*4 + (prev - cur)\n      // odd  pixels = 3*cur + next = cur*4 + (next - cur)\n      // note the shared term.\n      __m128i bias  = _mm_set1_epi16(8);\n      __m128i curs = _mm_slli_epi16(curr, 2);\n      __m128i prvd = _mm_sub_epi16(prev, curr);\n      __m128i nxtd = _mm_sub_epi16(next, curr);\n      __m128i curb = _mm_add_epi16(curs, bias);\n      __m128i even = _mm_add_epi16(prvd, curb);\n      __m128i odd  = _mm_add_epi16(nxtd, curb);\n\n      // interleave even and odd pixels, then undo scaling.\n      __m128i int0 = _mm_unpacklo_epi16(even, odd);\n      __m128i int1 = _mm_unpackhi_epi16(even, odd);\n      __m128i de0  = _mm_srli_epi16(int0, 4);\n      __m128i de1  = _mm_srli_epi16(int1, 4);\n\n      // pack and write output\n      __m128i outv = _mm_packus_epi16(de0, de1);\n      _mm_storeu_si128((__m128i *) (out + i*2), outv);\n#elif defined(STBI_NEON)\n      // load and perform the vertical filtering pass\n      // this uses 3*x + y = 4*x + (y - x)\n      uint8x8_t farb  = vld1_u8(in_far + i);\n      uint8x8_t nearb = vld1_u8(in_near + i);\n      int16x8_t diff  = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));\n      int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));\n      int16x8_t curr  = vaddq_s16(nears, diff); // current row\n\n      // horizontal filter works the same based on shifted vers of current\n      // row. \"prev\" is current row shifted right by 1 pixel; we need to\n      // insert the previous pixel value (from t1).\n      // \"next\" is current row shifted left by 1 pixel, with first pixel\n      // of next block of 8 pixels added in.\n      int16x8_t prv0 = vextq_s16(curr, curr, 7);\n      int16x8_t nxt0 = vextq_s16(curr, curr, 1);\n      int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);\n      int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);\n\n      // horizontal filter, polyphase implementation since it's convenient:\n      // even pixels = 3*cur + prev = cur*4 + (prev - cur)\n      // odd  pixels = 3*cur + next = cur*4 + (next - cur)\n      // note the shared term.\n      int16x8_t curs = vshlq_n_s16(curr, 2);\n      int16x8_t prvd = vsubq_s16(prev, curr);\n      int16x8_t nxtd = vsubq_s16(next, curr);\n      int16x8_t even = vaddq_s16(curs, prvd);\n      int16x8_t odd  = vaddq_s16(curs, nxtd);\n\n      // undo scaling and round, then store with even/odd phases interleaved\n      uint8x8x2_t o;\n      o.val[0] = vqrshrun_n_s16(even, 4);\n      o.val[1] = vqrshrun_n_s16(odd,  4);\n      vst2_u8(out + i*2, o);\n#endif\n\n      // \"previous\" value for next iter\n      t1 = 3*in_near[i+7] + in_far[i+7];\n   }\n\n   t0 = t1;\n   t1 = 3*in_near[i] + in_far[i];\n   out[i*2] = stbi__div16(3*t1 + t0 + 8);\n\n   for (++i; i < w; ++i) {\n      t0 = t1;\n      t1 = 3*in_near[i]+in_far[i];\n      out[i*2-1] = stbi__div16(3*t0 + t1 + 8);\n      out[i*2  ] = stbi__div16(3*t1 + t0 + 8);\n   }\n   out[w*2-1] = stbi__div4(t1+2);\n\n   STBI_NOTUSED(hs);\n\n   return out;\n}\n#endif\n\nstatic stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n   // resample with nearest-neighbor\n   int i,j;\n   STBI_NOTUSED(in_far);\n   for (i=0; i < w; ++i)\n      for (j=0; j < hs; ++j)\n         out[i*hs+j] = in_near[i];\n   return out;\n}\n\n// this is a reduced-precision calculation of YCbCr-to-RGB introduced\n// to make sure the code produces the same results in both SIMD and scalar\n#define stbi__float2fixed(x)  (((int) ((x) * 4096.0f + 0.5f)) << 8)\nstatic void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step)\n{\n   int i;\n   for (i=0; i < count; ++i) {\n      int y_fixed = (y[i] << 20) + (1<<19); // rounding\n      int r,g,b;\n      int cr = pcr[i] - 128;\n      int cb = pcb[i] - 128;\n      r = y_fixed +  cr* stbi__float2fixed(1.40200f);\n      g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);\n      b = y_fixed                                     +   cb* stbi__float2fixed(1.77200f);\n      r >>= 20;\n      g >>= 20;\n      b >>= 20;\n      if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }\n      if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }\n      if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }\n      out[0] = (stbi_uc)r;\n      out[1] = (stbi_uc)g;\n      out[2] = (stbi_uc)b;\n      out[3] = 255;\n      out += step;\n   }\n}\n\n#if defined(STBI_SSE2) || defined(STBI_NEON)\nstatic void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step)\n{\n   int i = 0;\n\n#ifdef STBI_SSE2\n   // step == 3 is pretty ugly on the final interleave, and i'm not convinced\n   // it's useful in practice (you wouldn't use it for textures, for example).\n   // so just accelerate step == 4 case.\n   if (step == 4) {\n      // this is a fairly straightforward implementation and not super-optimized.\n      __m128i signflip  = _mm_set1_epi8(-0x80);\n      __m128i cr_const0 = _mm_set1_epi16(   (short) ( 1.40200f*4096.0f+0.5f));\n      __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f));\n      __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f));\n      __m128i cb_const1 = _mm_set1_epi16(   (short) ( 1.77200f*4096.0f+0.5f));\n      __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128);\n      __m128i xw = _mm_set1_epi16(255); // alpha channel\n\n      for (; i+7 < count; i += 8) {\n         // load\n         __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));\n         __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));\n         __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));\n         __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128\n         __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128\n\n         // unpack to short (and left-shift cr, cb by 8)\n         __m128i yw  = _mm_unpacklo_epi8(y_bias, y_bytes);\n         __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);\n         __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);\n\n         // color transform\n         __m128i yws = _mm_srli_epi16(yw, 4);\n         __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);\n         __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);\n         __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);\n         __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);\n         __m128i rws = _mm_add_epi16(cr0, yws);\n         __m128i gwt = _mm_add_epi16(cb0, yws);\n         __m128i bws = _mm_add_epi16(yws, cb1);\n         __m128i gws = _mm_add_epi16(gwt, cr1);\n\n         // descale\n         __m128i rw = _mm_srai_epi16(rws, 4);\n         __m128i bw = _mm_srai_epi16(bws, 4);\n         __m128i gw = _mm_srai_epi16(gws, 4);\n\n         // back to byte, set up for transpose\n         __m128i brb = _mm_packus_epi16(rw, bw);\n         __m128i gxb = _mm_packus_epi16(gw, xw);\n\n         // transpose to interleave channels\n         __m128i t0 = _mm_unpacklo_epi8(brb, gxb);\n         __m128i t1 = _mm_unpackhi_epi8(brb, gxb);\n         __m128i o0 = _mm_unpacklo_epi16(t0, t1);\n         __m128i o1 = _mm_unpackhi_epi16(t0, t1);\n\n         // store\n         _mm_storeu_si128((__m128i *) (out + 0), o0);\n         _mm_storeu_si128((__m128i *) (out + 16), o1);\n         out += 32;\n      }\n   }\n#endif\n\n#ifdef STBI_NEON\n   // in this version, step=3 support would be easy to add. but is there demand?\n   if (step == 4) {\n      // this is a fairly straightforward implementation and not super-optimized.\n      uint8x8_t signflip = vdup_n_u8(0x80);\n      int16x8_t cr_const0 = vdupq_n_s16(   (short) ( 1.40200f*4096.0f+0.5f));\n      int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f));\n      int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f));\n      int16x8_t cb_const1 = vdupq_n_s16(   (short) ( 1.77200f*4096.0f+0.5f));\n\n      for (; i+7 < count; i += 8) {\n         // load\n         uint8x8_t y_bytes  = vld1_u8(y + i);\n         uint8x8_t cr_bytes = vld1_u8(pcr + i);\n         uint8x8_t cb_bytes = vld1_u8(pcb + i);\n         int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));\n         int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));\n\n         // expand to s16\n         int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));\n         int16x8_t crw = vshll_n_s8(cr_biased, 7);\n         int16x8_t cbw = vshll_n_s8(cb_biased, 7);\n\n         // color transform\n         int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);\n         int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);\n         int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);\n         int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);\n         int16x8_t rws = vaddq_s16(yws, cr0);\n         int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);\n         int16x8_t bws = vaddq_s16(yws, cb1);\n\n         // undo scaling, round, convert to byte\n         uint8x8x4_t o;\n         o.val[0] = vqrshrun_n_s16(rws, 4);\n         o.val[1] = vqrshrun_n_s16(gws, 4);\n         o.val[2] = vqrshrun_n_s16(bws, 4);\n         o.val[3] = vdup_n_u8(255);\n\n         // store, interleaving r/g/b/a\n         vst4_u8(out, o);\n         out += 8*4;\n      }\n   }\n#endif\n\n   for (; i < count; ++i) {\n      int y_fixed = (y[i] << 20) + (1<<19); // rounding\n      int r,g,b;\n      int cr = pcr[i] - 128;\n      int cb = pcb[i] - 128;\n      r = y_fixed + cr* stbi__float2fixed(1.40200f);\n      g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);\n      b = y_fixed                                   +   cb* stbi__float2fixed(1.77200f);\n      r >>= 20;\n      g >>= 20;\n      b >>= 20;\n      if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }\n      if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }\n      if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }\n      out[0] = (stbi_uc)r;\n      out[1] = (stbi_uc)g;\n      out[2] = (stbi_uc)b;\n      out[3] = 255;\n      out += step;\n   }\n}\n#endif\n\n// set up the kernels\nstatic void stbi__setup_jpeg(stbi__jpeg *j)\n{\n   j->idct_block_kernel = stbi__idct_block;\n   j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;\n   j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;\n\n#ifdef STBI_SSE2\n   if (stbi__sse2_available()) {\n      j->idct_block_kernel = stbi__idct_simd;\n      j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;\n      j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;\n   }\n#endif\n\n#ifdef STBI_NEON\n   j->idct_block_kernel = stbi__idct_simd;\n   j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;\n   j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;\n#endif\n}\n\n// clean up the temporary component buffers\nstatic void stbi__cleanup_jpeg(stbi__jpeg *j)\n{\n   stbi__free_jpeg_components(j, j->s->img_n, 0);\n}\n\ntypedef struct\n{\n   resample_row_func resample;\n   stbi_uc *line0,*line1;\n   int hs,vs;   // expansion factor in each axis\n   int w_lores; // horizontal pixels pre-expansion\n   int ystep;   // how far through vertical expansion we are\n   int ypos;    // which pre-expansion row we're on\n} stbi__resample;\n\n// fast 0..255 * 0..255 => 0..255 rounded multiplication\nstatic stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y)\n{\n   unsigned int t = x*y + 128;\n   return (stbi_uc) ((t + (t >>8)) >> 8);\n}\n\nstatic stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp)\n{\n   int n, decode_n, is_rgb;\n   z->s->img_n = 0; // make stbi__cleanup_jpeg safe\n\n   // validate req_comp\n   if (req_comp < 0 || req_comp > 4) return stbi__errpuc(\"bad req_comp\", \"Internal error\");\n\n   // load a jpeg image from whichever source, but leave in YCbCr format\n   if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; }\n\n   // determine actual number of components to generate\n   n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1;\n\n   is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif));\n\n   if (z->s->img_n == 3 && n < 3 && !is_rgb)\n      decode_n = 1;\n   else\n      decode_n = z->s->img_n;\n\n   // nothing to do if no components requested; check this now to avoid\n   // accessing uninitialized coutput[0] later\n   if (decode_n <= 0) { stbi__cleanup_jpeg(z); return NULL; }\n\n   // resample and color-convert\n   {\n      int k;\n      unsigned int i,j;\n      stbi_uc *output;\n      stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL };\n\n      stbi__resample res_comp[4];\n\n      for (k=0; k < decode_n; ++k) {\n         stbi__resample *r = &res_comp[k];\n\n         // allocate line buffer big enough for upsampling off the edges\n         // with upsample factor of 4\n         z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3);\n         if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc(\"outofmem\", \"Out of memory\"); }\n\n         r->hs      = z->img_h_max / z->img_comp[k].h;\n         r->vs      = z->img_v_max / z->img_comp[k].v;\n         r->ystep   = r->vs >> 1;\n         r->w_lores = (z->s->img_x + r->hs-1) / r->hs;\n         r->ypos    = 0;\n         r->line0   = r->line1 = z->img_comp[k].data;\n\n         if      (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;\n         else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;\n         else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;\n         else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;\n         else                               r->resample = stbi__resample_row_generic;\n      }\n\n      // can't error after this so, this is safe\n      output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);\n      if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc(\"outofmem\", \"Out of memory\"); }\n\n      // now go ahead and resample\n      for (j=0; j < z->s->img_y; ++j) {\n         stbi_uc *out = output + n * z->s->img_x * j;\n         for (k=0; k < decode_n; ++k) {\n            stbi__resample *r = &res_comp[k];\n            int y_bot = r->ystep >= (r->vs >> 1);\n            coutput[k] = r->resample(z->img_comp[k].linebuf,\n                                     y_bot ? r->line1 : r->line0,\n                                     y_bot ? r->line0 : r->line1,\n                                     r->w_lores, r->hs);\n            if (++r->ystep >= r->vs) {\n               r->ystep = 0;\n               r->line0 = r->line1;\n               if (++r->ypos < z->img_comp[k].y)\n                  r->line1 += z->img_comp[k].w2;\n            }\n         }\n         if (n >= 3) {\n            stbi_uc *y = coutput[0];\n            if (z->s->img_n == 3) {\n               if (is_rgb) {\n                  for (i=0; i < z->s->img_x; ++i) {\n                     out[0] = y[i];\n                     out[1] = coutput[1][i];\n                     out[2] = coutput[2][i];\n                     out[3] = 255;\n                     out += n;\n                  }\n               } else {\n                  z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);\n               }\n            } else if (z->s->img_n == 4) {\n               if (z->app14_color_transform == 0) { // CMYK\n                  for (i=0; i < z->s->img_x; ++i) {\n                     stbi_uc m = coutput[3][i];\n                     out[0] = stbi__blinn_8x8(coutput[0][i], m);\n                     out[1] = stbi__blinn_8x8(coutput[1][i], m);\n                     out[2] = stbi__blinn_8x8(coutput[2][i], m);\n                     out[3] = 255;\n                     out += n;\n                  }\n               } else if (z->app14_color_transform == 2) { // YCCK\n                  z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);\n                  for (i=0; i < z->s->img_x; ++i) {\n                     stbi_uc m = coutput[3][i];\n                     out[0] = stbi__blinn_8x8(255 - out[0], m);\n                     out[1] = stbi__blinn_8x8(255 - out[1], m);\n                     out[2] = stbi__blinn_8x8(255 - out[2], m);\n                     out += n;\n                  }\n               } else { // YCbCr + alpha?  Ignore the fourth channel for now\n                  z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);\n               }\n            } else\n               for (i=0; i < z->s->img_x; ++i) {\n                  out[0] = out[1] = out[2] = y[i];\n                  out[3] = 255; // not used if n==3\n                  out += n;\n               }\n         } else {\n            if (is_rgb) {\n               if (n == 1)\n                  for (i=0; i < z->s->img_x; ++i)\n                     *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);\n               else {\n                  for (i=0; i < z->s->img_x; ++i, out += 2) {\n                     out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);\n                     out[1] = 255;\n                  }\n               }\n            } else if (z->s->img_n == 4 && z->app14_color_transform == 0) {\n               for (i=0; i < z->s->img_x; ++i) {\n                  stbi_uc m = coutput[3][i];\n                  stbi_uc r = stbi__blinn_8x8(coutput[0][i], m);\n                  stbi_uc g = stbi__blinn_8x8(coutput[1][i], m);\n                  stbi_uc b = stbi__blinn_8x8(coutput[2][i], m);\n                  out[0] = stbi__compute_y(r, g, b);\n                  out[1] = 255;\n                  out += n;\n               }\n            } else if (z->s->img_n == 4 && z->app14_color_transform == 2) {\n               for (i=0; i < z->s->img_x; ++i) {\n                  out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]);\n                  out[1] = 255;\n                  out += n;\n               }\n            } else {\n               stbi_uc *y = coutput[0];\n               if (n == 1)\n                  for (i=0; i < z->s->img_x; ++i) out[i] = y[i];\n               else\n                  for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; }\n            }\n         }\n      }\n      stbi__cleanup_jpeg(z);\n      *out_x = z->s->img_x;\n      *out_y = z->s->img_y;\n      if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output\n      return output;\n   }\n}\n\nstatic void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)\n{\n   unsigned char* result;\n   stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg));\n   if (!j) return stbi__errpuc(\"outofmem\", \"Out of memory\");\n   memset(j, 0, sizeof(stbi__jpeg));\n   STBI_NOTUSED(ri);\n   j->s = s;\n   stbi__setup_jpeg(j);\n   result = load_jpeg_image(j, x,y,comp,req_comp);\n   STBI_FREE(j);\n   return result;\n}\n\nstatic int stbi__jpeg_test(stbi__context *s)\n{\n   int r;\n   stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg));\n   if (!j) return stbi__err(\"outofmem\", \"Out of memory\");\n   memset(j, 0, sizeof(stbi__jpeg));\n   j->s = s;\n   stbi__setup_jpeg(j);\n   r = stbi__decode_jpeg_header(j, STBI__SCAN_type);\n   stbi__rewind(s);\n   STBI_FREE(j);\n   return r;\n}\n\nstatic int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp)\n{\n   if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {\n      stbi__rewind( j->s );\n      return 0;\n   }\n   if (x) *x = j->s->img_x;\n   if (y) *y = j->s->img_y;\n   if (comp) *comp = j->s->img_n >= 3 ? 3 : 1;\n   return 1;\n}\n\nstatic int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   int result;\n   stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg)));\n   if (!j) return stbi__err(\"outofmem\", \"Out of memory\");\n   memset(j, 0, sizeof(stbi__jpeg));\n   j->s = s;\n   result = stbi__jpeg_info_raw(j, x, y, comp);\n   STBI_FREE(j);\n   return result;\n}\n#endif\n\n// public domain zlib decode    v0.2  Sean Barrett 2006-11-18\n//    simple implementation\n//      - all input must be provided in an upfront buffer\n//      - all output is written to a single output buffer (can malloc/realloc)\n//    performance\n//      - fast huffman\n\n#ifndef STBI_NO_ZLIB\n\n// fast-way is faster to check than jpeg huffman, but slow way is slower\n#define STBI__ZFAST_BITS  9 // accelerate all cases in default tables\n#define STBI__ZFAST_MASK  ((1 << STBI__ZFAST_BITS) - 1)\n#define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet\n\n// zlib-style huffman encoding\n// (jpegs packs from left, zlib from right, so can't share code)\ntypedef struct\n{\n   stbi__uint16 fast[1 << STBI__ZFAST_BITS];\n   stbi__uint16 firstcode[16];\n   int maxcode[17];\n   stbi__uint16 firstsymbol[16];\n   stbi_uc  size[STBI__ZNSYMS];\n   stbi__uint16 value[STBI__ZNSYMS];\n} stbi__zhuffman;\n\nstbi_inline static int stbi__bitreverse16(int n)\n{\n  n = ((n & 0xAAAA) >>  1) | ((n & 0x5555) << 1);\n  n = ((n & 0xCCCC) >>  2) | ((n & 0x3333) << 2);\n  n = ((n & 0xF0F0) >>  4) | ((n & 0x0F0F) << 4);\n  n = ((n & 0xFF00) >>  8) | ((n & 0x00FF) << 8);\n  return n;\n}\n\nstbi_inline static int stbi__bit_reverse(int v, int bits)\n{\n   STBI_ASSERT(bits <= 16);\n   // to bit reverse n bits, reverse 16 and shift\n   // e.g. 11 bits, bit reverse and shift away 5\n   return stbi__bitreverse16(v) >> (16-bits);\n}\n\nstatic int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num)\n{\n   int i,k=0;\n   int code, next_code[16], sizes[17];\n\n   // DEFLATE spec for generating codes\n   memset(sizes, 0, sizeof(sizes));\n   memset(z->fast, 0, sizeof(z->fast));\n   for (i=0; i < num; ++i)\n      ++sizes[sizelist[i]];\n   sizes[0] = 0;\n   for (i=1; i < 16; ++i)\n      if (sizes[i] > (1 << i))\n         return stbi__err(\"bad sizes\", \"Corrupt PNG\");\n   code = 0;\n   for (i=1; i < 16; ++i) {\n      next_code[i] = code;\n      z->firstcode[i] = (stbi__uint16) code;\n      z->firstsymbol[i] = (stbi__uint16) k;\n      code = (code + sizes[i]);\n      if (sizes[i])\n         if (code-1 >= (1 << i)) return stbi__err(\"bad codelengths\",\"Corrupt PNG\");\n      z->maxcode[i] = code << (16-i); // preshift for inner loop\n      code <<= 1;\n      k += sizes[i];\n   }\n   z->maxcode[16] = 0x10000; // sentinel\n   for (i=0; i < num; ++i) {\n      int s = sizelist[i];\n      if (s) {\n         int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];\n         stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i);\n         z->size [c] = (stbi_uc     ) s;\n         z->value[c] = (stbi__uint16) i;\n         if (s <= STBI__ZFAST_BITS) {\n            int j = stbi__bit_reverse(next_code[s],s);\n            while (j < (1 << STBI__ZFAST_BITS)) {\n               z->fast[j] = fastv;\n               j += (1 << s);\n            }\n         }\n         ++next_code[s];\n      }\n   }\n   return 1;\n}\n\n// zlib-from-memory implementation for PNG reading\n//    because PNG allows splitting the zlib stream arbitrarily,\n//    and it's annoying structurally to have PNG call ZLIB call PNG,\n//    we require PNG read all the IDATs and combine them into a single\n//    memory buffer\n\ntypedef struct\n{\n   stbi_uc *zbuffer, *zbuffer_end;\n   int num_bits;\n   int hit_zeof_once;\n   stbi__uint32 code_buffer;\n\n   char *zout;\n   char *zout_start;\n   char *zout_end;\n   int   z_expandable;\n\n   stbi__zhuffman z_length, z_distance;\n} stbi__zbuf;\n\nstbi_inline static int stbi__zeof(stbi__zbuf *z)\n{\n   return (z->zbuffer >= z->zbuffer_end);\n}\n\nstbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z)\n{\n   return stbi__zeof(z) ? 0 : *z->zbuffer++;\n}\n\nstatic void stbi__fill_bits(stbi__zbuf *z)\n{\n   do {\n      if (z->code_buffer >= (1U << z->num_bits)) {\n        z->zbuffer = z->zbuffer_end;  /* treat this as EOF so we fail. */\n        return;\n      }\n      z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits;\n      z->num_bits += 8;\n   } while (z->num_bits <= 24);\n}\n\nstbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n)\n{\n   unsigned int k;\n   if (z->num_bits < n) stbi__fill_bits(z);\n   k = z->code_buffer & ((1 << n) - 1);\n   z->code_buffer >>= n;\n   z->num_bits -= n;\n   return k;\n}\n\nstatic int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)\n{\n   int b,s,k;\n   // not resolved by fast table, so compute it the slow way\n   // use jpeg approach, which requires MSbits at top\n   k = stbi__bit_reverse(a->code_buffer, 16);\n   for (s=STBI__ZFAST_BITS+1; ; ++s)\n      if (k < z->maxcode[s])\n         break;\n   if (s >= 16) return -1; // invalid code!\n   // code size is s, so:\n   b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];\n   if (b >= STBI__ZNSYMS) return -1; // some data was corrupt somewhere!\n   if (z->size[b] != s) return -1;  // was originally an assert, but report failure instead.\n   a->code_buffer >>= s;\n   a->num_bits -= s;\n   return z->value[b];\n}\n\nstbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)\n{\n   int b,s;\n   if (a->num_bits < 16) {\n      if (stbi__zeof(a)) {\n         if (!a->hit_zeof_once) {\n            // This is the first time we hit eof, insert 16 extra padding btis\n            // to allow us to keep going; if we actually consume any of them\n            // though, that is invalid data. This is caught later.\n            a->hit_zeof_once = 1;\n            a->num_bits += 16; // add 16 implicit zero bits\n         } else {\n            // We already inserted our extra 16 padding bits and are again\n            // out, this stream is actually prematurely terminated.\n            return -1;\n         }\n      } else {\n         stbi__fill_bits(a);\n      }\n   }\n   b = z->fast[a->code_buffer & STBI__ZFAST_MASK];\n   if (b) {\n      s = b >> 9;\n      a->code_buffer >>= s;\n      a->num_bits -= s;\n      return b & 511;\n   }\n   return stbi__zhuffman_decode_slowpath(a, z);\n}\n\nstatic int stbi__zexpand(stbi__zbuf *z, char *zout, int n)  // need to make room for n bytes\n{\n   char *q;\n   unsigned int cur, limit, old_limit;\n   z->zout = zout;\n   if (!z->z_expandable) return stbi__err(\"output buffer limit\",\"Corrupt PNG\");\n   cur   = (unsigned int) (z->zout - z->zout_start);\n   limit = old_limit = (unsigned) (z->zout_end - z->zout_start);\n   if (UINT_MAX - cur < (unsigned) n) return stbi__err(\"outofmem\", \"Out of memory\");\n   while (cur + n > limit) {\n      if(limit > UINT_MAX / 2) return stbi__err(\"outofmem\", \"Out of memory\");\n      limit *= 2;\n   }\n   q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);\n   STBI_NOTUSED(old_limit);\n   if (q == NULL) return stbi__err(\"outofmem\", \"Out of memory\");\n   z->zout_start = q;\n   z->zout       = q + cur;\n   z->zout_end   = q + limit;\n   return 1;\n}\n\nstatic const int stbi__zlength_base[31] = {\n   3,4,5,6,7,8,9,10,11,13,\n   15,17,19,23,27,31,35,43,51,59,\n   67,83,99,115,131,163,195,227,258,0,0 };\n\nstatic const int stbi__zlength_extra[31]=\n{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 };\n\nstatic const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,\n257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};\n\nstatic const int stbi__zdist_extra[32] =\n{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};\n\nstatic int stbi__parse_huffman_block(stbi__zbuf *a)\n{\n   char *zout = a->zout;\n   for(;;) {\n      int z = stbi__zhuffman_decode(a, &a->z_length);\n      if (z < 256) {\n         if (z < 0) return stbi__err(\"bad huffman code\",\"Corrupt PNG\"); // error in huffman codes\n         if (zout >= a->zout_end) {\n            if (!stbi__zexpand(a, zout, 1)) return 0;\n            zout = a->zout;\n         }\n         *zout++ = (char) z;\n      } else {\n         stbi_uc *p;\n         int len,dist;\n         if (z == 256) {\n            a->zout = zout;\n            if (a->hit_zeof_once && a->num_bits < 16) {\n               // The first time we hit zeof, we inserted 16 extra zero bits into our bit\n               // buffer so the decoder can just do its speculative decoding. But if we\n               // actually consumed any of those bits (which is the case when num_bits < 16),\n               // the stream actually read past the end so it is malformed.\n               return stbi__err(\"unexpected end\",\"Corrupt PNG\");\n            }\n            return 1;\n         }\n         if (z >= 286) return stbi__err(\"bad huffman code\",\"Corrupt PNG\"); // per DEFLATE, length codes 286 and 287 must not appear in compressed data\n         z -= 257;\n         len = stbi__zlength_base[z];\n         if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);\n         z = stbi__zhuffman_decode(a, &a->z_distance);\n         if (z < 0 || z >= 30) return stbi__err(\"bad huffman code\",\"Corrupt PNG\"); // per DEFLATE, distance codes 30 and 31 must not appear in compressed data\n         dist = stbi__zdist_base[z];\n         if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);\n         if (zout - a->zout_start < dist) return stbi__err(\"bad dist\",\"Corrupt PNG\");\n         if (len > a->zout_end - zout) {\n            if (!stbi__zexpand(a, zout, len)) return 0;\n            zout = a->zout;\n         }\n         p = (stbi_uc *) (zout - dist);\n         if (dist == 1) { // run of one byte; common in images.\n            stbi_uc v = *p;\n            if (len) { do *zout++ = v; while (--len); }\n         } else {\n            if (len) { do *zout++ = *p++; while (--len); }\n         }\n      }\n   }\n}\n\nstatic int stbi__compute_huffman_codes(stbi__zbuf *a)\n{\n   static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };\n   stbi__zhuffman z_codelength;\n   stbi_uc lencodes[286+32+137];//padding for maximum single op\n   stbi_uc codelength_sizes[19];\n   int i,n;\n\n   int hlit  = stbi__zreceive(a,5) + 257;\n   int hdist = stbi__zreceive(a,5) + 1;\n   int hclen = stbi__zreceive(a,4) + 4;\n   int ntot  = hlit + hdist;\n\n   memset(codelength_sizes, 0, sizeof(codelength_sizes));\n   for (i=0; i < hclen; ++i) {\n      int s = stbi__zreceive(a,3);\n      codelength_sizes[length_dezigzag[i]] = (stbi_uc) s;\n   }\n   if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0;\n\n   n = 0;\n   while (n < ntot) {\n      int c = stbi__zhuffman_decode(a, &z_codelength);\n      if (c < 0 || c >= 19) return stbi__err(\"bad codelengths\", \"Corrupt PNG\");\n      if (c < 16)\n         lencodes[n++] = (stbi_uc) c;\n      else {\n         stbi_uc fill = 0;\n         if (c == 16) {\n            c = stbi__zreceive(a,2)+3;\n            if (n == 0) return stbi__err(\"bad codelengths\", \"Corrupt PNG\");\n            fill = lencodes[n-1];\n         } else if (c == 17) {\n            c = stbi__zreceive(a,3)+3;\n         } else if (c == 18) {\n            c = stbi__zreceive(a,7)+11;\n         } else {\n            return stbi__err(\"bad codelengths\", \"Corrupt PNG\");\n         }\n         if (ntot - n < c) return stbi__err(\"bad codelengths\", \"Corrupt PNG\");\n         memset(lencodes+n, fill, c);\n         n += c;\n      }\n   }\n   if (n != ntot) return stbi__err(\"bad codelengths\",\"Corrupt PNG\");\n   if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0;\n   if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0;\n   return 1;\n}\n\nstatic int stbi__parse_uncompressed_block(stbi__zbuf *a)\n{\n   stbi_uc header[4];\n   int len,nlen,k;\n   if (a->num_bits & 7)\n      stbi__zreceive(a, a->num_bits & 7); // discard\n   // drain the bit-packed data into header\n   k = 0;\n   while (a->num_bits > 0) {\n      header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check\n      a->code_buffer >>= 8;\n      a->num_bits -= 8;\n   }\n   if (a->num_bits < 0) return stbi__err(\"zlib corrupt\",\"Corrupt PNG\");\n   // now fill header the normal way\n   while (k < 4)\n      header[k++] = stbi__zget8(a);\n   len  = header[1] * 256 + header[0];\n   nlen = header[3] * 256 + header[2];\n   if (nlen != (len ^ 0xffff)) return stbi__err(\"zlib corrupt\",\"Corrupt PNG\");\n   if (a->zbuffer + len > a->zbuffer_end) return stbi__err(\"read past buffer\",\"Corrupt PNG\");\n   if (a->zout + len > a->zout_end)\n      if (!stbi__zexpand(a, a->zout, len)) return 0;\n   memcpy(a->zout, a->zbuffer, len);\n   a->zbuffer += len;\n   a->zout += len;\n   return 1;\n}\n\nstatic int stbi__parse_zlib_header(stbi__zbuf *a)\n{\n   int cmf   = stbi__zget8(a);\n   int cm    = cmf & 15;\n   /* int cinfo = cmf >> 4; */\n   int flg   = stbi__zget8(a);\n   if (stbi__zeof(a)) return stbi__err(\"bad zlib header\",\"Corrupt PNG\"); // zlib spec\n   if ((cmf*256+flg) % 31 != 0) return stbi__err(\"bad zlib header\",\"Corrupt PNG\"); // zlib spec\n   if (flg & 32) return stbi__err(\"no preset dict\",\"Corrupt PNG\"); // preset dictionary not allowed in png\n   if (cm != 8) return stbi__err(\"bad compression\",\"Corrupt PNG\"); // DEFLATE required for png\n   // window = 1 << (8 + cinfo)... but who cares, we fully buffer output\n   return 1;\n}\n\nstatic const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] =\n{\n   8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,\n   8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,\n   8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,\n   8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,\n   8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,\n   9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,\n   9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,\n   9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,\n   7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8\n};\nstatic const stbi_uc stbi__zdefault_distance[32] =\n{\n   5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5\n};\n/*\nInit algorithm:\n{\n   int i;   // use <= to match clearly with spec\n   for (i=0; i <= 143; ++i)     stbi__zdefault_length[i]   = 8;\n   for (   ; i <= 255; ++i)     stbi__zdefault_length[i]   = 9;\n   for (   ; i <= 279; ++i)     stbi__zdefault_length[i]   = 7;\n   for (   ; i <= 287; ++i)     stbi__zdefault_length[i]   = 8;\n\n   for (i=0; i <=  31; ++i)     stbi__zdefault_distance[i] = 5;\n}\n*/\n\nstatic int stbi__parse_zlib(stbi__zbuf *a, int parse_header)\n{\n   int final, type;\n   if (parse_header)\n      if (!stbi__parse_zlib_header(a)) return 0;\n   a->num_bits = 0;\n   a->code_buffer = 0;\n   a->hit_zeof_once = 0;\n   do {\n      final = stbi__zreceive(a,1);\n      type = stbi__zreceive(a,2);\n      if (type == 0) {\n         if (!stbi__parse_uncompressed_block(a)) return 0;\n      } else if (type == 3) {\n         return 0;\n      } else {\n         if (type == 1) {\n            // use fixed code lengths\n            if (!stbi__zbuild_huffman(&a->z_length  , stbi__zdefault_length  , STBI__ZNSYMS)) return 0;\n            if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance,  32)) return 0;\n         } else {\n            if (!stbi__compute_huffman_codes(a)) return 0;\n         }\n         if (!stbi__parse_huffman_block(a)) return 0;\n      }\n   } while (!final);\n   return 1;\n}\n\nstatic int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header)\n{\n   a->zout_start = obuf;\n   a->zout       = obuf;\n   a->zout_end   = obuf + olen;\n   a->z_expandable = exp;\n\n   return stbi__parse_zlib(a, parse_header);\n}\n\nSTBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen)\n{\n   stbi__zbuf a;\n   char *p = (char *) stbi__malloc(initial_size);\n   if (p == NULL) return NULL;\n   a.zbuffer = (stbi_uc *) buffer;\n   a.zbuffer_end = (stbi_uc *) buffer + len;\n   if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {\n      if (outlen) *outlen = (int) (a.zout - a.zout_start);\n      return a.zout_start;\n   } else {\n      STBI_FREE(a.zout_start);\n      return NULL;\n   }\n}\n\nSTBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen)\n{\n   return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);\n}\n\nSTBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header)\n{\n   stbi__zbuf a;\n   char *p = (char *) stbi__malloc(initial_size);\n   if (p == NULL) return NULL;\n   a.zbuffer = (stbi_uc *) buffer;\n   a.zbuffer_end = (stbi_uc *) buffer + len;\n   if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {\n      if (outlen) *outlen = (int) (a.zout - a.zout_start);\n      return a.zout_start;\n   } else {\n      STBI_FREE(a.zout_start);\n      return NULL;\n   }\n}\n\nSTBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen)\n{\n   stbi__zbuf a;\n   a.zbuffer = (stbi_uc *) ibuffer;\n   a.zbuffer_end = (stbi_uc *) ibuffer + ilen;\n   if (stbi__do_zlib(&a, obuffer, olen, 0, 1))\n      return (int) (a.zout - a.zout_start);\n   else\n      return -1;\n}\n\nSTBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen)\n{\n   stbi__zbuf a;\n   char *p = (char *) stbi__malloc(16384);\n   if (p == NULL) return NULL;\n   a.zbuffer = (stbi_uc *) buffer;\n   a.zbuffer_end = (stbi_uc *) buffer+len;\n   if (stbi__do_zlib(&a, p, 16384, 1, 0)) {\n      if (outlen) *outlen = (int) (a.zout - a.zout_start);\n      return a.zout_start;\n   } else {\n      STBI_FREE(a.zout_start);\n      return NULL;\n   }\n}\n\nSTBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)\n{\n   stbi__zbuf a;\n   a.zbuffer = (stbi_uc *) ibuffer;\n   a.zbuffer_end = (stbi_uc *) ibuffer + ilen;\n   if (stbi__do_zlib(&a, obuffer, olen, 0, 0))\n      return (int) (a.zout - a.zout_start);\n   else\n      return -1;\n}\n#endif\n\n// public domain \"baseline\" PNG decoder   v0.10  Sean Barrett 2006-11-18\n//    simple implementation\n//      - only 8-bit samples\n//      - no CRC checking\n//      - allocates lots of intermediate memory\n//        - avoids problem of streaming data between subsystems\n//        - avoids explicit window management\n//    performance\n//      - uses stb_zlib, a PD zlib implementation with fast huffman decoding\n\n#ifndef STBI_NO_PNG\ntypedef struct\n{\n   stbi__uint32 length;\n   stbi__uint32 type;\n} stbi__pngchunk;\n\nstatic stbi__pngchunk stbi__get_chunk_header(stbi__context *s)\n{\n   stbi__pngchunk c;\n   c.length = stbi__get32be(s);\n   c.type   = stbi__get32be(s);\n   return c;\n}\n\nstatic int stbi__check_png_header(stbi__context *s)\n{\n   static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };\n   int i;\n   for (i=0; i < 8; ++i)\n      if (stbi__get8(s) != png_sig[i]) return stbi__err(\"bad png sig\",\"Not a PNG\");\n   return 1;\n}\n\ntypedef struct\n{\n   stbi__context *s;\n   stbi_uc *idata, *expanded, *out;\n   int depth;\n} stbi__png;\n\n\nenum {\n   STBI__F_none=0,\n   STBI__F_sub=1,\n   STBI__F_up=2,\n   STBI__F_avg=3,\n   STBI__F_paeth=4,\n   // synthetic filter used for first scanline to avoid needing a dummy row of 0s\n   STBI__F_avg_first\n};\n\nstatic stbi_uc first_row_filter[5] =\n{\n   STBI__F_none,\n   STBI__F_sub,\n   STBI__F_none,\n   STBI__F_avg_first,\n   STBI__F_sub // Paeth with b=c=0 turns out to be equivalent to sub\n};\n\nstatic int stbi__paeth(int a, int b, int c)\n{\n   // This formulation looks very different from the reference in the PNG spec, but is\n   // actually equivalent and has favorable data dependencies and admits straightforward\n   // generation of branch-free code, which helps performance significantly.\n   int thresh = c*3 - (a + b);\n   int lo = a < b ? a : b;\n   int hi = a < b ? b : a;\n   int t0 = (hi <= thresh) ? lo : c;\n   int t1 = (thresh <= lo) ? hi : t0;\n   return t1;\n}\n\nstatic const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };\n\n// adds an extra all-255 alpha channel\n// dest == src is legal\n// img_n must be 1 or 3\nstatic void stbi__create_png_alpha_expand8(stbi_uc *dest, stbi_uc *src, stbi__uint32 x, int img_n)\n{\n   int i;\n   // must process data backwards since we allow dest==src\n   if (img_n == 1) {\n      for (i=x-1; i >= 0; --i) {\n         dest[i*2+1] = 255;\n         dest[i*2+0] = src[i];\n      }\n   } else {\n      STBI_ASSERT(img_n == 3);\n      for (i=x-1; i >= 0; --i) {\n         dest[i*4+3] = 255;\n         dest[i*4+2] = src[i*3+2];\n         dest[i*4+1] = src[i*3+1];\n         dest[i*4+0] = src[i*3+0];\n      }\n   }\n}\n\n// create the png data from post-deflated data\nstatic int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color)\n{\n   int bytes = (depth == 16 ? 2 : 1);\n   stbi__context *s = a->s;\n   stbi__uint32 i,j,stride = x*out_n*bytes;\n   stbi__uint32 img_len, img_width_bytes;\n   stbi_uc *filter_buf;\n   int all_ok = 1;\n   int k;\n   int img_n = s->img_n; // copy it into a local for later\n\n   int output_bytes = out_n*bytes;\n   int filter_bytes = img_n*bytes;\n   int width = x;\n\n   STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);\n   a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into\n   if (!a->out) return stbi__err(\"outofmem\", \"Out of memory\");\n\n   // note: error exits here don't need to clean up a->out individually,\n   // stbi__do_png always does on error.\n   if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err(\"too large\", \"Corrupt PNG\");\n   img_width_bytes = (((img_n * x * depth) + 7) >> 3);\n   if (!stbi__mad2sizes_valid(img_width_bytes, y, img_width_bytes)) return stbi__err(\"too large\", \"Corrupt PNG\");\n   img_len = (img_width_bytes + 1) * y;\n\n   // we used to check for exact match between raw_len and img_len on non-interlaced PNGs,\n   // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros),\n   // so just check for raw_len < img_len always.\n   if (raw_len < img_len) return stbi__err(\"not enough pixels\",\"Corrupt PNG\");\n\n   // Allocate two scan lines worth of filter workspace buffer.\n   filter_buf = (stbi_uc *) stbi__malloc_mad2(img_width_bytes, 2, 0);\n   if (!filter_buf) return stbi__err(\"outofmem\", \"Out of memory\");\n\n   // Filtering for low-bit-depth images\n   if (depth < 8) {\n      filter_bytes = 1;\n      width = img_width_bytes;\n   }\n\n   for (j=0; j < y; ++j) {\n      // cur/prior filter buffers alternate\n      stbi_uc *cur = filter_buf + (j & 1)*img_width_bytes;\n      stbi_uc *prior = filter_buf + (~j & 1)*img_width_bytes;\n      stbi_uc *dest = a->out + stride*j;\n      int nk = width * filter_bytes;\n      int filter = *raw++;\n\n      // check filter type\n      if (filter > 4) {\n         all_ok = stbi__err(\"invalid filter\",\"Corrupt PNG\");\n         break;\n      }\n\n      // if first row, use special filter that doesn't sample previous row\n      if (j == 0) filter = first_row_filter[filter];\n\n      // perform actual filtering\n      switch (filter) {\n      case STBI__F_none:\n         memcpy(cur, raw, nk);\n         break;\n      case STBI__F_sub:\n         memcpy(cur, raw, filter_bytes);\n         for (k = filter_bytes; k < nk; ++k)\n            cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]);\n         break;\n      case STBI__F_up:\n         for (k = 0; k < nk; ++k)\n            cur[k] = STBI__BYTECAST(raw[k] + prior[k]);\n         break;\n      case STBI__F_avg:\n         for (k = 0; k < filter_bytes; ++k)\n            cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1));\n         for (k = filter_bytes; k < nk; ++k)\n            cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1));\n         break;\n      case STBI__F_paeth:\n         for (k = 0; k < filter_bytes; ++k)\n            cur[k] = STBI__BYTECAST(raw[k] + prior[k]); // prior[k] == stbi__paeth(0,prior[k],0)\n         for (k = filter_bytes; k < nk; ++k)\n            cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes], prior[k], prior[k-filter_bytes]));\n         break;\n      case STBI__F_avg_first:\n         memcpy(cur, raw, filter_bytes);\n         for (k = filter_bytes; k < nk; ++k)\n            cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1));\n         break;\n      }\n\n      raw += nk;\n\n      // expand decoded bits in cur to dest, also adding an extra alpha channel if desired\n      if (depth < 8) {\n         stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range\n         stbi_uc *in = cur;\n         stbi_uc *out = dest;\n         stbi_uc inb = 0;\n         stbi__uint32 nsmp = x*img_n;\n\n         // expand bits to bytes first\n         if (depth == 4) {\n            for (i=0; i < nsmp; ++i) {\n               if ((i & 1) == 0) inb = *in++;\n               *out++ = scale * (inb >> 4);\n               inb <<= 4;\n            }\n         } else if (depth == 2) {\n            for (i=0; i < nsmp; ++i) {\n               if ((i & 3) == 0) inb = *in++;\n               *out++ = scale * (inb >> 6);\n               inb <<= 2;\n            }\n         } else {\n            STBI_ASSERT(depth == 1);\n            for (i=0; i < nsmp; ++i) {\n               if ((i & 7) == 0) inb = *in++;\n               *out++ = scale * (inb >> 7);\n               inb <<= 1;\n            }\n         }\n\n         // insert alpha=255 values if desired\n         if (img_n != out_n)\n            stbi__create_png_alpha_expand8(dest, dest, x, img_n);\n      } else if (depth == 8) {\n         if (img_n == out_n)\n            memcpy(dest, cur, x*img_n);\n         else\n            stbi__create_png_alpha_expand8(dest, cur, x, img_n);\n      } else if (depth == 16) {\n         // convert the image data from big-endian to platform-native\n         stbi__uint16 *dest16 = (stbi__uint16*)dest;\n         stbi__uint32 nsmp = x*img_n;\n\n         if (img_n == out_n) {\n            for (i = 0; i < nsmp; ++i, ++dest16, cur += 2)\n               *dest16 = (cur[0] << 8) | cur[1];\n         } else {\n            STBI_ASSERT(img_n+1 == out_n);\n            if (img_n == 1) {\n               for (i = 0; i < x; ++i, dest16 += 2, cur += 2) {\n                  dest16[0] = (cur[0] << 8) | cur[1];\n                  dest16[1] = 0xffff;\n               }\n            } else {\n               STBI_ASSERT(img_n == 3);\n               for (i = 0; i < x; ++i, dest16 += 4, cur += 6) {\n                  dest16[0] = (cur[0] << 8) | cur[1];\n                  dest16[1] = (cur[2] << 8) | cur[3];\n                  dest16[2] = (cur[4] << 8) | cur[5];\n                  dest16[3] = 0xffff;\n               }\n            }\n         }\n      }\n   }\n\n   STBI_FREE(filter_buf);\n   if (!all_ok) return 0;\n\n   return 1;\n}\n\nstatic int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced)\n{\n   int bytes = (depth == 16 ? 2 : 1);\n   int out_bytes = out_n * bytes;\n   stbi_uc *final;\n   int p;\n   if (!interlaced)\n      return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);\n\n   // de-interlacing\n   final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0);\n   if (!final) return stbi__err(\"outofmem\", \"Out of memory\");\n   for (p=0; p < 7; ++p) {\n      int xorig[] = { 0,4,0,2,0,1,0 };\n      int yorig[] = { 0,0,4,0,2,0,1 };\n      int xspc[]  = { 8,8,4,4,2,2,1 };\n      int yspc[]  = { 8,8,8,4,4,2,2 };\n      int i,j,x,y;\n      // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1\n      x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];\n      y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];\n      if (x && y) {\n         stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;\n         if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {\n            STBI_FREE(final);\n            return 0;\n         }\n         for (j=0; j < y; ++j) {\n            for (i=0; i < x; ++i) {\n               int out_y = j*yspc[p]+yorig[p];\n               int out_x = i*xspc[p]+xorig[p];\n               memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes,\n                      a->out + (j*x+i)*out_bytes, out_bytes);\n            }\n         }\n         STBI_FREE(a->out);\n         image_data += img_len;\n         image_data_len -= img_len;\n      }\n   }\n   a->out = final;\n\n   return 1;\n}\n\nstatic int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n)\n{\n   stbi__context *s = z->s;\n   stbi__uint32 i, pixel_count = s->img_x * s->img_y;\n   stbi_uc *p = z->out;\n\n   // compute color-based transparency, assuming we've\n   // already got 255 as the alpha value in the output\n   STBI_ASSERT(out_n == 2 || out_n == 4);\n\n   if (out_n == 2) {\n      for (i=0; i < pixel_count; ++i) {\n         p[1] = (p[0] == tc[0] ? 0 : 255);\n         p += 2;\n      }\n   } else {\n      for (i=0; i < pixel_count; ++i) {\n         if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])\n            p[3] = 0;\n         p += 4;\n      }\n   }\n   return 1;\n}\n\nstatic int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n)\n{\n   stbi__context *s = z->s;\n   stbi__uint32 i, pixel_count = s->img_x * s->img_y;\n   stbi__uint16 *p = (stbi__uint16*) z->out;\n\n   // compute color-based transparency, assuming we've\n   // already got 65535 as the alpha value in the output\n   STBI_ASSERT(out_n == 2 || out_n == 4);\n\n   if (out_n == 2) {\n      for (i = 0; i < pixel_count; ++i) {\n         p[1] = (p[0] == tc[0] ? 0 : 65535);\n         p += 2;\n      }\n   } else {\n      for (i = 0; i < pixel_count; ++i) {\n         if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])\n            p[3] = 0;\n         p += 4;\n      }\n   }\n   return 1;\n}\n\nstatic int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n)\n{\n   stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;\n   stbi_uc *p, *temp_out, *orig = a->out;\n\n   p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0);\n   if (p == NULL) return stbi__err(\"outofmem\", \"Out of memory\");\n\n   // between here and free(out) below, exitting would leak\n   temp_out = p;\n\n   if (pal_img_n == 3) {\n      for (i=0; i < pixel_count; ++i) {\n         int n = orig[i]*4;\n         p[0] = palette[n  ];\n         p[1] = palette[n+1];\n         p[2] = palette[n+2];\n         p += 3;\n      }\n   } else {\n      for (i=0; i < pixel_count; ++i) {\n         int n = orig[i]*4;\n         p[0] = palette[n  ];\n         p[1] = palette[n+1];\n         p[2] = palette[n+2];\n         p[3] = palette[n+3];\n         p += 4;\n      }\n   }\n   STBI_FREE(a->out);\n   a->out = temp_out;\n\n   STBI_NOTUSED(len);\n\n   return 1;\n}\n\nstatic int stbi__unpremultiply_on_load_global = 0;\nstatic int stbi__de_iphone_flag_global = 0;\n\nSTBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)\n{\n   stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply;\n}\n\nSTBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)\n{\n   stbi__de_iphone_flag_global = flag_true_if_should_convert;\n}\n\n#ifndef STBI_THREAD_LOCAL\n#define stbi__unpremultiply_on_load  stbi__unpremultiply_on_load_global\n#define stbi__de_iphone_flag  stbi__de_iphone_flag_global\n#else\nstatic STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set;\nstatic STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set;\n\nSTBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply)\n{\n   stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply;\n   stbi__unpremultiply_on_load_set = 1;\n}\n\nSTBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert)\n{\n   stbi__de_iphone_flag_local = flag_true_if_should_convert;\n   stbi__de_iphone_flag_set = 1;\n}\n\n#define stbi__unpremultiply_on_load  (stbi__unpremultiply_on_load_set           \\\n                                       ? stbi__unpremultiply_on_load_local      \\\n                                       : stbi__unpremultiply_on_load_global)\n#define stbi__de_iphone_flag  (stbi__de_iphone_flag_set                         \\\n                                ? stbi__de_iphone_flag_local                    \\\n                                : stbi__de_iphone_flag_global)\n#endif // STBI_THREAD_LOCAL\n\nstatic void stbi__de_iphone(stbi__png *z)\n{\n   stbi__context *s = z->s;\n   stbi__uint32 i, pixel_count = s->img_x * s->img_y;\n   stbi_uc *p = z->out;\n\n   if (s->img_out_n == 3) {  // convert bgr to rgb\n      for (i=0; i < pixel_count; ++i) {\n         stbi_uc t = p[0];\n         p[0] = p[2];\n         p[2] = t;\n         p += 3;\n      }\n   } else {\n      STBI_ASSERT(s->img_out_n == 4);\n      if (stbi__unpremultiply_on_load) {\n         // convert bgr to rgb and unpremultiply\n         for (i=0; i < pixel_count; ++i) {\n            stbi_uc a = p[3];\n            stbi_uc t = p[0];\n            if (a) {\n               stbi_uc half = a / 2;\n               p[0] = (p[2] * 255 + half) / a;\n               p[1] = (p[1] * 255 + half) / a;\n               p[2] = ( t   * 255 + half) / a;\n            } else {\n               p[0] = p[2];\n               p[2] = t;\n            }\n            p += 4;\n         }\n      } else {\n         // convert bgr to rgb\n         for (i=0; i < pixel_count; ++i) {\n            stbi_uc t = p[0];\n            p[0] = p[2];\n            p[2] = t;\n            p += 4;\n         }\n      }\n   }\n}\n\n#define STBI__PNG_TYPE(a,b,c,d)  (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d))\n\nstatic int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)\n{\n   stbi_uc palette[1024], pal_img_n=0;\n   stbi_uc has_trans=0, tc[3]={0};\n   stbi__uint16 tc16[3];\n   stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;\n   int first=1,k,interlace=0, color=0, is_iphone=0;\n   stbi__context *s = z->s;\n\n   z->expanded = NULL;\n   z->idata = NULL;\n   z->out = NULL;\n\n   if (!stbi__check_png_header(s)) return 0;\n\n   if (scan == STBI__SCAN_type) return 1;\n\n   for (;;) {\n      stbi__pngchunk c = stbi__get_chunk_header(s);\n      switch (c.type) {\n         case STBI__PNG_TYPE('C','g','B','I'):\n            is_iphone = 1;\n            stbi__skip(s, c.length);\n            break;\n         case STBI__PNG_TYPE('I','H','D','R'): {\n            int comp,filter;\n            if (!first) return stbi__err(\"multiple IHDR\",\"Corrupt PNG\");\n            first = 0;\n            if (c.length != 13) return stbi__err(\"bad IHDR len\",\"Corrupt PNG\");\n            s->img_x = stbi__get32be(s);\n            s->img_y = stbi__get32be(s);\n            if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err(\"too large\",\"Very large image (corrupt?)\");\n            if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err(\"too large\",\"Very large image (corrupt?)\");\n            z->depth = stbi__get8(s);  if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16)  return stbi__err(\"1/2/4/8/16-bit only\",\"PNG not supported: 1/2/4/8/16-bit only\");\n            color = stbi__get8(s);  if (color > 6)         return stbi__err(\"bad ctype\",\"Corrupt PNG\");\n            if (color == 3 && z->depth == 16)                  return stbi__err(\"bad ctype\",\"Corrupt PNG\");\n            if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err(\"bad ctype\",\"Corrupt PNG\");\n            comp  = stbi__get8(s);  if (comp) return stbi__err(\"bad comp method\",\"Corrupt PNG\");\n            filter= stbi__get8(s);  if (filter) return stbi__err(\"bad filter method\",\"Corrupt PNG\");\n            interlace = stbi__get8(s); if (interlace>1) return stbi__err(\"bad interlace method\",\"Corrupt PNG\");\n            if (!s->img_x || !s->img_y) return stbi__err(\"0-pixel image\",\"Corrupt PNG\");\n            if (!pal_img_n) {\n               s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);\n               if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err(\"too large\", \"Image too large to decode\");\n            } else {\n               // if paletted, then pal_n is our final components, and\n               // img_n is # components to decompress/filter.\n               s->img_n = 1;\n               if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err(\"too large\",\"Corrupt PNG\");\n            }\n            // even with SCAN_header, have to scan to see if we have a tRNS\n            break;\n         }\n\n         case STBI__PNG_TYPE('P','L','T','E'):  {\n            if (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\n            if (c.length > 256*3) return stbi__err(\"invalid PLTE\",\"Corrupt PNG\");\n            pal_len = c.length / 3;\n            if (pal_len * 3 != c.length) return stbi__err(\"invalid PLTE\",\"Corrupt PNG\");\n            for (i=0; i < pal_len; ++i) {\n               palette[i*4+0] = stbi__get8(s);\n               palette[i*4+1] = stbi__get8(s);\n               palette[i*4+2] = stbi__get8(s);\n               palette[i*4+3] = 255;\n            }\n            break;\n         }\n\n         case STBI__PNG_TYPE('t','R','N','S'): {\n            if (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\n            if (z->idata) return stbi__err(\"tRNS after IDAT\",\"Corrupt PNG\");\n            if (pal_img_n) {\n               if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; }\n               if (pal_len == 0) return stbi__err(\"tRNS before PLTE\",\"Corrupt PNG\");\n               if (c.length > pal_len) return stbi__err(\"bad tRNS len\",\"Corrupt PNG\");\n               pal_img_n = 4;\n               for (i=0; i < c.length; ++i)\n                  palette[i*4+3] = stbi__get8(s);\n            } else {\n               if (!(s->img_n & 1)) return stbi__err(\"tRNS with alpha\",\"Corrupt PNG\");\n               if (c.length != (stbi__uint32) s->img_n*2) return stbi__err(\"bad tRNS len\",\"Corrupt PNG\");\n               has_trans = 1;\n               // non-paletted with tRNS = constant alpha. if header-scanning, we can stop now.\n               if (scan == STBI__SCAN_header) { ++s->img_n; return 1; }\n               if (z->depth == 16) {\n                  for (k = 0; k < s->img_n && k < 3; ++k) // extra loop test to suppress false GCC warning\n                     tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is\n               } else {\n                  for (k = 0; k < s->img_n && k < 3; ++k)\n                     tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger\n               }\n            }\n            break;\n         }\n\n         case STBI__PNG_TYPE('I','D','A','T'): {\n            if (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\n            if (pal_img_n && !pal_len) return stbi__err(\"no PLTE\",\"Corrupt PNG\");\n            if (scan == STBI__SCAN_header) {\n               // header scan definitely stops at first IDAT\n               if (pal_img_n)\n                  s->img_n = pal_img_n;\n               return 1;\n            }\n            if (c.length > (1u << 30)) return stbi__err(\"IDAT size limit\", \"IDAT section larger than 2^30 bytes\");\n            if ((int)(ioff + c.length) < (int)ioff) return 0;\n            if (ioff + c.length > idata_limit) {\n               stbi__uint32 idata_limit_old = idata_limit;\n               stbi_uc *p;\n               if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;\n               while (ioff + c.length > idata_limit)\n                  idata_limit *= 2;\n               STBI_NOTUSED(idata_limit_old);\n               p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err(\"outofmem\", \"Out of memory\");\n               z->idata = p;\n            }\n            if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err(\"outofdata\",\"Corrupt PNG\");\n            ioff += c.length;\n            break;\n         }\n\n         case STBI__PNG_TYPE('I','E','N','D'): {\n            stbi__uint32 raw_len, bpl;\n            if (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\n            if (scan != STBI__SCAN_load) return 1;\n            if (z->idata == NULL) return stbi__err(\"no IDAT\",\"Corrupt PNG\");\n            // initial guess for decoded data size to avoid unnecessary reallocs\n            bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component\n            raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */;\n            z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone);\n            if (z->expanded == NULL) return 0; // zlib should set error\n            STBI_FREE(z->idata); z->idata = NULL;\n            if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)\n               s->img_out_n = s->img_n+1;\n            else\n               s->img_out_n = s->img_n;\n            if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0;\n            if (has_trans) {\n               if (z->depth == 16) {\n                  if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0;\n               } else {\n                  if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0;\n               }\n            }\n            if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)\n               stbi__de_iphone(z);\n            if (pal_img_n) {\n               // pal_img_n == 3 or 4\n               s->img_n = pal_img_n; // record the actual colors we had\n               s->img_out_n = pal_img_n;\n               if (req_comp >= 3) s->img_out_n = req_comp;\n               if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))\n                  return 0;\n            } else if (has_trans) {\n               // non-paletted image with tRNS -> source image has (constant) alpha\n               ++s->img_n;\n            }\n            STBI_FREE(z->expanded); z->expanded = NULL;\n            // end of PNG chunk, read and skip CRC\n            stbi__get32be(s);\n            return 1;\n         }\n\n         default:\n            // if critical, fail\n            if (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\n            if ((c.type & (1 << 29)) == 0) {\n               #ifndef STBI_NO_FAILURE_STRINGS\n               // not threadsafe\n               static char invalid_chunk[] = \"XXXX PNG chunk not known\";\n               invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);\n               invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);\n               invalid_chunk[2] = STBI__BYTECAST(c.type >>  8);\n               invalid_chunk[3] = STBI__BYTECAST(c.type >>  0);\n               #endif\n               return stbi__err(invalid_chunk, \"PNG not supported: unknown PNG chunk type\");\n            }\n            stbi__skip(s, c.length);\n            break;\n      }\n      // end of PNG chunk, read and skip CRC\n      stbi__get32be(s);\n   }\n}\n\nstatic void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri)\n{\n   void *result=NULL;\n   if (req_comp < 0 || req_comp > 4) return stbi__errpuc(\"bad req_comp\", \"Internal error\");\n   if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {\n      if (p->depth <= 8)\n         ri->bits_per_channel = 8;\n      else if (p->depth == 16)\n         ri->bits_per_channel = 16;\n      else\n         return stbi__errpuc(\"bad bits_per_channel\", \"PNG not supported: unsupported color depth\");\n      result = p->out;\n      p->out = NULL;\n      if (req_comp && req_comp != p->s->img_out_n) {\n         if (ri->bits_per_channel == 8)\n            result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);\n         else\n            result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);\n         p->s->img_out_n = req_comp;\n         if (result == NULL) return result;\n      }\n      *x = p->s->img_x;\n      *y = p->s->img_y;\n      if (n) *n = p->s->img_n;\n   }\n   STBI_FREE(p->out);      p->out      = NULL;\n   STBI_FREE(p->expanded); p->expanded = NULL;\n   STBI_FREE(p->idata);    p->idata    = NULL;\n\n   return result;\n}\n\nstatic void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)\n{\n   stbi__png p;\n   p.s = s;\n   return stbi__do_png(&p, x,y,comp,req_comp, ri);\n}\n\nstatic int stbi__png_test(stbi__context *s)\n{\n   int r;\n   r = stbi__check_png_header(s);\n   stbi__rewind(s);\n   return r;\n}\n\nstatic int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp)\n{\n   if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {\n      stbi__rewind( p->s );\n      return 0;\n   }\n   if (x) *x = p->s->img_x;\n   if (y) *y = p->s->img_y;\n   if (comp) *comp = p->s->img_n;\n   return 1;\n}\n\nstatic int stbi__png_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   stbi__png p;\n   p.s = s;\n   return stbi__png_info_raw(&p, x, y, comp);\n}\n\nstatic int stbi__png_is16(stbi__context *s)\n{\n   stbi__png p;\n   p.s = s;\n   if (!stbi__png_info_raw(&p, NULL, NULL, NULL))\n\t   return 0;\n   if (p.depth != 16) {\n      stbi__rewind(p.s);\n      return 0;\n   }\n   return 1;\n}\n#endif\n\n// Microsoft/Windows BMP image\n\n#ifndef STBI_NO_BMP\nstatic int stbi__bmp_test_raw(stbi__context *s)\n{\n   int r;\n   int sz;\n   if (stbi__get8(s) != 'B') return 0;\n   if (stbi__get8(s) != 'M') return 0;\n   stbi__get32le(s); // discard filesize\n   stbi__get16le(s); // discard reserved\n   stbi__get16le(s); // discard reserved\n   stbi__get32le(s); // discard data offset\n   sz = stbi__get32le(s);\n   r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);\n   return r;\n}\n\nstatic int stbi__bmp_test(stbi__context *s)\n{\n   int r = stbi__bmp_test_raw(s);\n   stbi__rewind(s);\n   return r;\n}\n\n\n// returns 0..31 for the highest set bit\nstatic int stbi__high_bit(unsigned int z)\n{\n   int n=0;\n   if (z == 0) return -1;\n   if (z >= 0x10000) { n += 16; z >>= 16; }\n   if (z >= 0x00100) { n +=  8; z >>=  8; }\n   if (z >= 0x00010) { n +=  4; z >>=  4; }\n   if (z >= 0x00004) { n +=  2; z >>=  2; }\n   if (z >= 0x00002) { n +=  1;/* >>=  1;*/ }\n   return n;\n}\n\nstatic int stbi__bitcount(unsigned int a)\n{\n   a = (a & 0x55555555) + ((a >>  1) & 0x55555555); // max 2\n   a = (a & 0x33333333) + ((a >>  2) & 0x33333333); // max 4\n   a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits\n   a = (a + (a >> 8)); // max 16 per 8 bits\n   a = (a + (a >> 16)); // max 32 per 8 bits\n   return a & 0xff;\n}\n\n// extract an arbitrarily-aligned N-bit value (N=bits)\n// from v, and then make it 8-bits long and fractionally\n// extend it to full full range.\nstatic int stbi__shiftsigned(unsigned int v, int shift, int bits)\n{\n   static unsigned int mul_table[9] = {\n      0,\n      0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/,\n      0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/,\n   };\n   static unsigned int shift_table[9] = {\n      0, 0,0,1,0,2,4,6,0,\n   };\n   if (shift < 0)\n      v <<= -shift;\n   else\n      v >>= shift;\n   STBI_ASSERT(v < 256);\n   v >>= (8-bits);\n   STBI_ASSERT(bits >= 0 && bits <= 8);\n   return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits];\n}\n\ntypedef struct\n{\n   int bpp, offset, hsz;\n   unsigned int mr,mg,mb,ma, all_a;\n   int extra_read;\n} stbi__bmp_data;\n\nstatic int stbi__bmp_set_mask_defaults(stbi__bmp_data *info, int compress)\n{\n   // BI_BITFIELDS specifies masks explicitly, don't override\n   if (compress == 3)\n      return 1;\n\n   if (compress == 0) {\n      if (info->bpp == 16) {\n         info->mr = 31u << 10;\n         info->mg = 31u <<  5;\n         info->mb = 31u <<  0;\n      } else if (info->bpp == 32) {\n         info->mr = 0xffu << 16;\n         info->mg = 0xffu <<  8;\n         info->mb = 0xffu <<  0;\n         info->ma = 0xffu << 24;\n         info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0\n      } else {\n         // otherwise, use defaults, which is all-0\n         info->mr = info->mg = info->mb = info->ma = 0;\n      }\n      return 1;\n   }\n   return 0; // error\n}\n\nstatic void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)\n{\n   int hsz;\n   if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc(\"not BMP\", \"Corrupt BMP\");\n   stbi__get32le(s); // discard filesize\n   stbi__get16le(s); // discard reserved\n   stbi__get16le(s); // discard reserved\n   info->offset = stbi__get32le(s);\n   info->hsz = hsz = stbi__get32le(s);\n   info->mr = info->mg = info->mb = info->ma = 0;\n   info->extra_read = 14;\n\n   if (info->offset < 0) return stbi__errpuc(\"bad BMP\", \"bad BMP\");\n\n   if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc(\"unknown BMP\", \"BMP type not supported: unknown\");\n   if (hsz == 12) {\n      s->img_x = stbi__get16le(s);\n      s->img_y = stbi__get16le(s);\n   } else {\n      s->img_x = stbi__get32le(s);\n      s->img_y = stbi__get32le(s);\n   }\n   if (stbi__get16le(s) != 1) return stbi__errpuc(\"bad BMP\", \"bad BMP\");\n   info->bpp = stbi__get16le(s);\n   if (hsz != 12) {\n      int compress = stbi__get32le(s);\n      if (compress == 1 || compress == 2) return stbi__errpuc(\"BMP RLE\", \"BMP type not supported: RLE\");\n      if (compress >= 4) return stbi__errpuc(\"BMP JPEG/PNG\", \"BMP type not supported: unsupported compression\"); // this includes PNG/JPEG modes\n      if (compress == 3 && info->bpp != 16 && info->bpp != 32) return stbi__errpuc(\"bad BMP\", \"bad BMP\"); // bitfields requires 16 or 32 bits/pixel\n      stbi__get32le(s); // discard sizeof\n      stbi__get32le(s); // discard hres\n      stbi__get32le(s); // discard vres\n      stbi__get32le(s); // discard colorsused\n      stbi__get32le(s); // discard max important\n      if (hsz == 40 || hsz == 56) {\n         if (hsz == 56) {\n            stbi__get32le(s);\n            stbi__get32le(s);\n            stbi__get32le(s);\n            stbi__get32le(s);\n         }\n         if (info->bpp == 16 || info->bpp == 32) {\n            if (compress == 0) {\n               stbi__bmp_set_mask_defaults(info, compress);\n            } else if (compress == 3) {\n               info->mr = stbi__get32le(s);\n               info->mg = stbi__get32le(s);\n               info->mb = stbi__get32le(s);\n               info->extra_read += 12;\n               // not documented, but generated by photoshop and handled by mspaint\n               if (info->mr == info->mg && info->mg == info->mb) {\n                  // ?!?!?\n                  return stbi__errpuc(\"bad BMP\", \"bad BMP\");\n               }\n            } else\n               return stbi__errpuc(\"bad BMP\", \"bad BMP\");\n         }\n      } else {\n         // V4/V5 header\n         int i;\n         if (hsz != 108 && hsz != 124)\n            return stbi__errpuc(\"bad BMP\", \"bad BMP\");\n         info->mr = stbi__get32le(s);\n         info->mg = stbi__get32le(s);\n         info->mb = stbi__get32le(s);\n         info->ma = stbi__get32le(s);\n         if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs\n            stbi__bmp_set_mask_defaults(info, compress);\n         stbi__get32le(s); // discard color space\n         for (i=0; i < 12; ++i)\n            stbi__get32le(s); // discard color space parameters\n         if (hsz == 124) {\n            stbi__get32le(s); // discard rendering intent\n            stbi__get32le(s); // discard offset of profile data\n            stbi__get32le(s); // discard size of profile data\n            stbi__get32le(s); // discard reserved\n         }\n      }\n   }\n   return (void *) 1;\n}\n\n\nstatic void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)\n{\n   stbi_uc *out;\n   unsigned int mr=0,mg=0,mb=0,ma=0, all_a;\n   stbi_uc pal[256][4];\n   int psize=0,i,j,width;\n   int flip_vertically, pad, target;\n   stbi__bmp_data info;\n   STBI_NOTUSED(ri);\n\n   info.all_a = 255;\n   if (stbi__bmp_parse_header(s, &info) == NULL)\n      return NULL; // error code already set\n\n   flip_vertically = ((int) s->img_y) > 0;\n   s->img_y = abs((int) s->img_y);\n\n   if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc(\"too large\",\"Very large image (corrupt?)\");\n   if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc(\"too large\",\"Very large image (corrupt?)\");\n\n   mr = info.mr;\n   mg = info.mg;\n   mb = info.mb;\n   ma = info.ma;\n   all_a = info.all_a;\n\n   if (info.hsz == 12) {\n      if (info.bpp < 24)\n         psize = (info.offset - info.extra_read - 24) / 3;\n   } else {\n      if (info.bpp < 16)\n         psize = (info.offset - info.extra_read - info.hsz) >> 2;\n   }\n   if (psize == 0) {\n      // accept some number of extra bytes after the header, but if the offset points either to before\n      // the header ends or implies a large amount of extra data, reject the file as malformed\n      int bytes_read_so_far = s->callback_already_read + (int)(s->img_buffer - s->img_buffer_original);\n      int header_limit = 1024; // max we actually read is below 256 bytes currently.\n      int extra_data_limit = 256*4; // what ordinarily goes here is a palette; 256 entries*4 bytes is its max size.\n      if (bytes_read_so_far <= 0 || bytes_read_so_far > header_limit) {\n         return stbi__errpuc(\"bad header\", \"Corrupt BMP\");\n      }\n      // we established that bytes_read_so_far is positive and sensible.\n      // the first half of this test rejects offsets that are either too small positives, or\n      // negative, and guarantees that info.offset >= bytes_read_so_far > 0. this in turn\n      // ensures the number computed in the second half of the test can't overflow.\n      if (info.offset < bytes_read_so_far || info.offset - bytes_read_so_far > extra_data_limit) {\n         return stbi__errpuc(\"bad offset\", \"Corrupt BMP\");\n      } else {\n         stbi__skip(s, info.offset - bytes_read_so_far);\n      }\n   }\n\n   if (info.bpp == 24 && ma == 0xff000000)\n      s->img_n = 3;\n   else\n      s->img_n = ma ? 4 : 3;\n   if (req_comp && req_comp >= 3) // we can directly decode 3 or 4\n      target = req_comp;\n   else\n      target = s->img_n; // if they want monochrome, we'll post-convert\n\n   // sanity-check size\n   if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0))\n      return stbi__errpuc(\"too large\", \"Corrupt BMP\");\n\n   out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0);\n   if (!out) return stbi__errpuc(\"outofmem\", \"Out of memory\");\n   if (info.bpp < 16) {\n      int z=0;\n      if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc(\"invalid\", \"Corrupt BMP\"); }\n      for (i=0; i < psize; ++i) {\n         pal[i][2] = stbi__get8(s);\n         pal[i][1] = stbi__get8(s);\n         pal[i][0] = stbi__get8(s);\n         if (info.hsz != 12) stbi__get8(s);\n         pal[i][3] = 255;\n      }\n      stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4));\n      if (info.bpp == 1) width = (s->img_x + 7) >> 3;\n      else if (info.bpp == 4) width = (s->img_x + 1) >> 1;\n      else if (info.bpp == 8) width = s->img_x;\n      else { STBI_FREE(out); return stbi__errpuc(\"bad bpp\", \"Corrupt BMP\"); }\n      pad = (-width)&3;\n      if (info.bpp == 1) {\n         for (j=0; j < (int) s->img_y; ++j) {\n            int bit_offset = 7, v = stbi__get8(s);\n            for (i=0; i < (int) s->img_x; ++i) {\n               int color = (v>>bit_offset)&0x1;\n               out[z++] = pal[color][0];\n               out[z++] = pal[color][1];\n               out[z++] = pal[color][2];\n               if (target == 4) out[z++] = 255;\n               if (i+1 == (int) s->img_x) break;\n               if((--bit_offset) < 0) {\n                  bit_offset = 7;\n                  v = stbi__get8(s);\n               }\n            }\n            stbi__skip(s, pad);\n         }\n      } else {\n         for (j=0; j < (int) s->img_y; ++j) {\n            for (i=0; i < (int) s->img_x; i += 2) {\n               int v=stbi__get8(s),v2=0;\n               if (info.bpp == 4) {\n                  v2 = v & 15;\n                  v >>= 4;\n               }\n               out[z++] = pal[v][0];\n               out[z++] = pal[v][1];\n               out[z++] = pal[v][2];\n               if (target == 4) out[z++] = 255;\n               if (i+1 == (int) s->img_x) break;\n               v = (info.bpp == 8) ? stbi__get8(s) : v2;\n               out[z++] = pal[v][0];\n               out[z++] = pal[v][1];\n               out[z++] = pal[v][2];\n               if (target == 4) out[z++] = 255;\n            }\n            stbi__skip(s, pad);\n         }\n      }\n   } else {\n      int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;\n      int z = 0;\n      int easy=0;\n      stbi__skip(s, info.offset - info.extra_read - info.hsz);\n      if (info.bpp == 24) width = 3 * s->img_x;\n      else if (info.bpp == 16) width = 2*s->img_x;\n      else /* bpp = 32 and pad = 0 */ width=0;\n      pad = (-width) & 3;\n      if (info.bpp == 24) {\n         easy = 1;\n      } else if (info.bpp == 32) {\n         if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)\n            easy = 2;\n      }\n      if (!easy) {\n         if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc(\"bad masks\", \"Corrupt BMP\"); }\n         // right shift amt to put high bit in position #7\n         rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);\n         gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);\n         bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);\n         ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);\n         if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out); return stbi__errpuc(\"bad masks\", \"Corrupt BMP\"); }\n      }\n      for (j=0; j < (int) s->img_y; ++j) {\n         if (easy) {\n            for (i=0; i < (int) s->img_x; ++i) {\n               unsigned char a;\n               out[z+2] = stbi__get8(s);\n               out[z+1] = stbi__get8(s);\n               out[z+0] = stbi__get8(s);\n               z += 3;\n               a = (easy == 2 ? stbi__get8(s) : 255);\n               all_a |= a;\n               if (target == 4) out[z++] = a;\n            }\n         } else {\n            int bpp = info.bpp;\n            for (i=0; i < (int) s->img_x; ++i) {\n               stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s));\n               unsigned int a;\n               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));\n               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));\n               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));\n               a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);\n               all_a |= a;\n               if (target == 4) out[z++] = STBI__BYTECAST(a);\n            }\n         }\n         stbi__skip(s, pad);\n      }\n   }\n\n   // if alpha channel is all 0s, replace with all 255s\n   if (target == 4 && all_a == 0)\n      for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4)\n         out[i] = 255;\n\n   if (flip_vertically) {\n      stbi_uc t;\n      for (j=0; j < (int) s->img_y>>1; ++j) {\n         stbi_uc *p1 = out +      j     *s->img_x*target;\n         stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;\n         for (i=0; i < (int) s->img_x*target; ++i) {\n            t = p1[i]; p1[i] = p2[i]; p2[i] = t;\n         }\n      }\n   }\n\n   if (req_comp && req_comp != target) {\n      out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);\n      if (out == NULL) return out; // stbi__convert_format frees input on failure\n   }\n\n   *x = s->img_x;\n   *y = s->img_y;\n   if (comp) *comp = s->img_n;\n   return out;\n}\n#endif\n\n// Targa Truevision - TGA\n// by Jonathan Dummer\n#ifndef STBI_NO_TGA\n// returns STBI_rgb or whatever, 0 on error\nstatic int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16)\n{\n   // only RGB or RGBA (incl. 16bit) or grey allowed\n   if (is_rgb16) *is_rgb16 = 0;\n   switch(bits_per_pixel) {\n      case 8:  return STBI_grey;\n      case 16: if(is_grey) return STBI_grey_alpha;\n               // fallthrough\n      case 15: if(is_rgb16) *is_rgb16 = 1;\n               return STBI_rgb;\n      case 24: // fallthrough\n      case 32: return bits_per_pixel/8;\n      default: return 0;\n   }\n}\n\nstatic int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp)\n{\n    int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;\n    int sz, tga_colormap_type;\n    stbi__get8(s);                   // discard Offset\n    tga_colormap_type = stbi__get8(s); // colormap type\n    if( tga_colormap_type > 1 ) {\n        stbi__rewind(s);\n        return 0;      // only RGB or indexed allowed\n    }\n    tga_image_type = stbi__get8(s); // image type\n    if ( tga_colormap_type == 1 ) { // colormapped (paletted) image\n        if (tga_image_type != 1 && tga_image_type != 9) {\n            stbi__rewind(s);\n            return 0;\n        }\n        stbi__skip(s,4);       // skip index of first colormap entry and number of entries\n        sz = stbi__get8(s);    //   check bits per palette color entry\n        if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) {\n            stbi__rewind(s);\n            return 0;\n        }\n        stbi__skip(s,4);       // skip image x and y origin\n        tga_colormap_bpp = sz;\n    } else { // \"normal\" image w/o colormap - only RGB or grey allowed, +/- RLE\n        if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) {\n            stbi__rewind(s);\n            return 0; // only RGB or grey allowed, +/- RLE\n        }\n        stbi__skip(s,9); // skip colormap specification and image x/y origin\n        tga_colormap_bpp = 0;\n    }\n    tga_w = stbi__get16le(s);\n    if( tga_w < 1 ) {\n        stbi__rewind(s);\n        return 0;   // test width\n    }\n    tga_h = stbi__get16le(s);\n    if( tga_h < 1 ) {\n        stbi__rewind(s);\n        return 0;   // test height\n    }\n    tga_bits_per_pixel = stbi__get8(s); // bits per pixel\n    stbi__get8(s); // ignore alpha bits\n    if (tga_colormap_bpp != 0) {\n        if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {\n            // when using a colormap, tga_bits_per_pixel is the size of the indexes\n            // I don't think anything but 8 or 16bit indexes makes sense\n            stbi__rewind(s);\n            return 0;\n        }\n        tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);\n    } else {\n        tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);\n    }\n    if(!tga_comp) {\n      stbi__rewind(s);\n      return 0;\n    }\n    if (x) *x = tga_w;\n    if (y) *y = tga_h;\n    if (comp) *comp = tga_comp;\n    return 1;                   // seems to have passed everything\n}\n\nstatic int stbi__tga_test(stbi__context *s)\n{\n   int res = 0;\n   int sz, tga_color_type;\n   stbi__get8(s);      //   discard Offset\n   tga_color_type = stbi__get8(s);   //   color type\n   if ( tga_color_type > 1 ) goto errorEnd;   //   only RGB or indexed allowed\n   sz = stbi__get8(s);   //   image type\n   if ( tga_color_type == 1 ) { // colormapped (paletted) image\n      if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9\n      stbi__skip(s,4);       // skip index of first colormap entry and number of entries\n      sz = stbi__get8(s);    //   check bits per palette color entry\n      if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd;\n      stbi__skip(s,4);       // skip image x and y origin\n   } else { // \"normal\" image w/o colormap\n      if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE\n      stbi__skip(s,9); // skip colormap specification and image x/y origin\n   }\n   if ( stbi__get16le(s) < 1 ) goto errorEnd;      //   test width\n   if ( stbi__get16le(s) < 1 ) goto errorEnd;      //   test height\n   sz = stbi__get8(s);   //   bits per pixel\n   if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index\n   if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd;\n\n   res = 1; // if we got this far, everything's good and we can return 1 instead of 0\n\nerrorEnd:\n   stbi__rewind(s);\n   return res;\n}\n\n// read 16bit value and convert to 24bit RGB\nstatic void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out)\n{\n   stbi__uint16 px = (stbi__uint16)stbi__get16le(s);\n   stbi__uint16 fiveBitMask = 31;\n   // we have 3 channels with 5bits each\n   int r = (px >> 10) & fiveBitMask;\n   int g = (px >> 5) & fiveBitMask;\n   int b = px & fiveBitMask;\n   // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later\n   out[0] = (stbi_uc)((r * 255)/31);\n   out[1] = (stbi_uc)((g * 255)/31);\n   out[2] = (stbi_uc)((b * 255)/31);\n\n   // some people claim that the most significant bit might be used for alpha\n   // (possibly if an alpha-bit is set in the \"image descriptor byte\")\n   // but that only made 16bit test images completely translucent..\n   // so let's treat all 15 and 16bit TGAs as RGB with no alpha.\n}\n\nstatic void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)\n{\n   //   read in the TGA header stuff\n   int tga_offset = stbi__get8(s);\n   int tga_indexed = stbi__get8(s);\n   int tga_image_type = stbi__get8(s);\n   int tga_is_RLE = 0;\n   int tga_palette_start = stbi__get16le(s);\n   int tga_palette_len = stbi__get16le(s);\n   int tga_palette_bits = stbi__get8(s);\n   int tga_x_origin = stbi__get16le(s);\n   int tga_y_origin = stbi__get16le(s);\n   int tga_width = stbi__get16le(s);\n   int tga_height = stbi__get16le(s);\n   int tga_bits_per_pixel = stbi__get8(s);\n   int tga_comp, tga_rgb16=0;\n   int tga_inverted = stbi__get8(s);\n   // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?)\n   //   image data\n   unsigned char *tga_data;\n   unsigned char *tga_palette = NULL;\n   int i, j;\n   unsigned char raw_data[4] = {0};\n   int RLE_count = 0;\n   int RLE_repeating = 0;\n   int read_next_pixel = 1;\n   STBI_NOTUSED(ri);\n   STBI_NOTUSED(tga_x_origin); // @TODO\n   STBI_NOTUSED(tga_y_origin); // @TODO\n\n   if (tga_height > STBI_MAX_DIMENSIONS) return stbi__errpuc(\"too large\",\"Very large image (corrupt?)\");\n   if (tga_width > STBI_MAX_DIMENSIONS) return stbi__errpuc(\"too large\",\"Very large image (corrupt?)\");\n\n   //   do a tiny bit of precessing\n   if ( tga_image_type >= 8 )\n   {\n      tga_image_type -= 8;\n      tga_is_RLE = 1;\n   }\n   tga_inverted = 1 - ((tga_inverted >> 5) & 1);\n\n   //   If I'm paletted, then I'll use the number of bits from the palette\n   if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);\n   else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);\n\n   if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency\n      return stbi__errpuc(\"bad format\", \"Can't find out TGA pixelformat\");\n\n   //   tga info\n   *x = tga_width;\n   *y = tga_height;\n   if (comp) *comp = tga_comp;\n\n   if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))\n      return stbi__errpuc(\"too large\", \"Corrupt TGA\");\n\n   tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);\n   if (!tga_data) return stbi__errpuc(\"outofmem\", \"Out of memory\");\n\n   // skip to the data's starting position (offset usually = 0)\n   stbi__skip(s, tga_offset );\n\n   if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) {\n      for (i=0; i < tga_height; ++i) {\n         int row = tga_inverted ? tga_height -i - 1 : i;\n         stbi_uc *tga_row = tga_data + row*tga_width*tga_comp;\n         stbi__getn(s, tga_row, tga_width * tga_comp);\n      }\n   } else  {\n      //   do I need to load a palette?\n      if ( tga_indexed)\n      {\n         if (tga_palette_len == 0) {  /* you have to have at least one entry! */\n            STBI_FREE(tga_data);\n            return stbi__errpuc(\"bad palette\", \"Corrupt TGA\");\n         }\n\n         //   any data to skip? (offset usually = 0)\n         stbi__skip(s, tga_palette_start );\n         //   load the palette\n         tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);\n         if (!tga_palette) {\n            STBI_FREE(tga_data);\n            return stbi__errpuc(\"outofmem\", \"Out of memory\");\n         }\n         if (tga_rgb16) {\n            stbi_uc *pal_entry = tga_palette;\n            STBI_ASSERT(tga_comp == STBI_rgb);\n            for (i=0; i < tga_palette_len; ++i) {\n               stbi__tga_read_rgb16(s, pal_entry);\n               pal_entry += tga_comp;\n            }\n         } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) {\n               STBI_FREE(tga_data);\n               STBI_FREE(tga_palette);\n               return stbi__errpuc(\"bad palette\", \"Corrupt TGA\");\n         }\n      }\n      //   load the data\n      for (i=0; i < tga_width * tga_height; ++i)\n      {\n         //   if I'm in RLE mode, do I need to get a RLE stbi__pngchunk?\n         if ( tga_is_RLE )\n         {\n            if ( RLE_count == 0 )\n            {\n               //   yep, get the next byte as a RLE command\n               int RLE_cmd = stbi__get8(s);\n               RLE_count = 1 + (RLE_cmd & 127);\n               RLE_repeating = RLE_cmd >> 7;\n               read_next_pixel = 1;\n            } else if ( !RLE_repeating )\n            {\n               read_next_pixel = 1;\n            }\n         } else\n         {\n            read_next_pixel = 1;\n         }\n         //   OK, if I need to read a pixel, do it now\n         if ( read_next_pixel )\n         {\n            //   load however much data we did have\n            if ( tga_indexed )\n            {\n               // read in index, then perform the lookup\n               int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);\n               if ( pal_idx >= tga_palette_len ) {\n                  // invalid index\n                  pal_idx = 0;\n               }\n               pal_idx *= tga_comp;\n               for (j = 0; j < tga_comp; ++j) {\n                  raw_data[j] = tga_palette[pal_idx+j];\n               }\n            } else if(tga_rgb16) {\n               STBI_ASSERT(tga_comp == STBI_rgb);\n               stbi__tga_read_rgb16(s, raw_data);\n            } else {\n               //   read in the data raw\n               for (j = 0; j < tga_comp; ++j) {\n                  raw_data[j] = stbi__get8(s);\n               }\n            }\n            //   clear the reading flag for the next pixel\n            read_next_pixel = 0;\n         } // end of reading a pixel\n\n         // copy data\n         for (j = 0; j < tga_comp; ++j)\n           tga_data[i*tga_comp+j] = raw_data[j];\n\n         //   in case we're in RLE mode, keep counting down\n         --RLE_count;\n      }\n      //   do I need to invert the image?\n      if ( tga_inverted )\n      {\n         for (j = 0; j*2 < tga_height; ++j)\n         {\n            int index1 = j * tga_width * tga_comp;\n            int index2 = (tga_height - 1 - j) * tga_width * tga_comp;\n            for (i = tga_width * tga_comp; i > 0; --i)\n            {\n               unsigned char temp = tga_data[index1];\n               tga_data[index1] = tga_data[index2];\n               tga_data[index2] = temp;\n               ++index1;\n               ++index2;\n            }\n         }\n      }\n      //   clear my palette, if I had one\n      if ( tga_palette != NULL )\n      {\n         STBI_FREE( tga_palette );\n      }\n   }\n\n   // swap RGB - if the source data was RGB16, it already is in the right order\n   if (tga_comp >= 3 && !tga_rgb16)\n   {\n      unsigned char* tga_pixel = tga_data;\n      for (i=0; i < tga_width * tga_height; ++i)\n      {\n         unsigned char temp = tga_pixel[0];\n         tga_pixel[0] = tga_pixel[2];\n         tga_pixel[2] = temp;\n         tga_pixel += tga_comp;\n      }\n   }\n\n   // convert to target component count\n   if (req_comp && req_comp != tga_comp)\n      tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);\n\n   //   the things I do to get rid of an error message, and yet keep\n   //   Microsoft's C compilers happy... [8^(\n   tga_palette_start = tga_palette_len = tga_palette_bits =\n         tga_x_origin = tga_y_origin = 0;\n   STBI_NOTUSED(tga_palette_start);\n   //   OK, done\n   return tga_data;\n}\n#endif\n\n// *************************************************************************************************\n// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB\n\n#ifndef STBI_NO_PSD\nstatic int stbi__psd_test(stbi__context *s)\n{\n   int r = (stbi__get32be(s) == 0x38425053);\n   stbi__rewind(s);\n   return r;\n}\n\nstatic int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount)\n{\n   int count, nleft, len;\n\n   count = 0;\n   while ((nleft = pixelCount - count) > 0) {\n      len = stbi__get8(s);\n      if (len == 128) {\n         // No-op.\n      } else if (len < 128) {\n         // Copy next len+1 bytes literally.\n         len++;\n         if (len > nleft) return 0; // corrupt data\n         count += len;\n         while (len) {\n            *p = stbi__get8(s);\n            p += 4;\n            len--;\n         }\n      } else if (len > 128) {\n         stbi_uc   val;\n         // Next -len+1 bytes in the dest are replicated from next source byte.\n         // (Interpret len as a negative 8-bit int.)\n         len = 257 - len;\n         if (len > nleft) return 0; // corrupt data\n         val = stbi__get8(s);\n         count += len;\n         while (len) {\n            *p = val;\n            p += 4;\n            len--;\n         }\n      }\n   }\n\n   return 1;\n}\n\nstatic void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc)\n{\n   int pixelCount;\n   int channelCount, compression;\n   int channel, i;\n   int bitdepth;\n   int w,h;\n   stbi_uc *out;\n   STBI_NOTUSED(ri);\n\n   // Check identifier\n   if (stbi__get32be(s) != 0x38425053)   // \"8BPS\"\n      return stbi__errpuc(\"not PSD\", \"Corrupt PSD image\");\n\n   // Check file type version.\n   if (stbi__get16be(s) != 1)\n      return stbi__errpuc(\"wrong version\", \"Unsupported version of PSD image\");\n\n   // Skip 6 reserved bytes.\n   stbi__skip(s, 6 );\n\n   // Read the number of channels (R, G, B, A, etc).\n   channelCount = stbi__get16be(s);\n   if (channelCount < 0 || channelCount > 16)\n      return stbi__errpuc(\"wrong channel count\", \"Unsupported number of channels in PSD image\");\n\n   // Read the rows and columns of the image.\n   h = stbi__get32be(s);\n   w = stbi__get32be(s);\n\n   if (h > STBI_MAX_DIMENSIONS) return stbi__errpuc(\"too large\",\"Very large image (corrupt?)\");\n   if (w > STBI_MAX_DIMENSIONS) return stbi__errpuc(\"too large\",\"Very large image (corrupt?)\");\n\n   // Make sure the depth is 8 bits.\n   bitdepth = stbi__get16be(s);\n   if (bitdepth != 8 && bitdepth != 16)\n      return stbi__errpuc(\"unsupported bit depth\", \"PSD bit depth is not 8 or 16 bit\");\n\n   // Make sure the color mode is RGB.\n   // Valid options are:\n   //   0: Bitmap\n   //   1: Grayscale\n   //   2: Indexed color\n   //   3: RGB color\n   //   4: CMYK color\n   //   7: Multichannel\n   //   8: Duotone\n   //   9: Lab color\n   if (stbi__get16be(s) != 3)\n      return stbi__errpuc(\"wrong color format\", \"PSD is not in RGB color format\");\n\n   // Skip the Mode Data.  (It's the palette for indexed color; other info for other modes.)\n   stbi__skip(s,stbi__get32be(s) );\n\n   // Skip the image resources.  (resolution, pen tool paths, etc)\n   stbi__skip(s, stbi__get32be(s) );\n\n   // Skip the reserved data.\n   stbi__skip(s, stbi__get32be(s) );\n\n   // Find out if the data is compressed.\n   // Known values:\n   //   0: no compression\n   //   1: RLE compressed\n   compression = stbi__get16be(s);\n   if (compression > 1)\n      return stbi__errpuc(\"bad compression\", \"PSD has an unknown compression format\");\n\n   // Check size\n   if (!stbi__mad3sizes_valid(4, w, h, 0))\n      return stbi__errpuc(\"too large\", \"Corrupt PSD\");\n\n   // Create the destination image.\n\n   if (!compression && bitdepth == 16 && bpc == 16) {\n      out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0);\n      ri->bits_per_channel = 16;\n   } else\n      out = (stbi_uc *) stbi__malloc(4 * w*h);\n\n   if (!out) return stbi__errpuc(\"outofmem\", \"Out of memory\");\n   pixelCount = w*h;\n\n   // Initialize the data to zero.\n   //memset( out, 0, pixelCount * 4 );\n\n   // Finally, the image data.\n   if (compression) {\n      // RLE as used by .PSD and .TIFF\n      // Loop until you get the number of unpacked bytes you are expecting:\n      //     Read the next source byte into n.\n      //     If n is between 0 and 127 inclusive, copy the next n+1 bytes literally.\n      //     Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times.\n      //     Else if n is 128, noop.\n      // Endloop\n\n      // The RLE-compressed data is preceded by a 2-byte data count for each row in the data,\n      // which we're going to just skip.\n      stbi__skip(s, h * channelCount * 2 );\n\n      // Read the RLE data by channel.\n      for (channel = 0; channel < 4; channel++) {\n         stbi_uc *p;\n\n         p = out+channel;\n         if (channel >= channelCount) {\n            // Fill this channel with default data.\n            for (i = 0; i < pixelCount; i++, p += 4)\n               *p = (channel == 3 ? 255 : 0);\n         } else {\n            // Read the RLE data.\n            if (!stbi__psd_decode_rle(s, p, pixelCount)) {\n               STBI_FREE(out);\n               return stbi__errpuc(\"corrupt\", \"bad RLE data\");\n            }\n         }\n      }\n\n   } else {\n      // We're at the raw image data.  It's each channel in order (Red, Green, Blue, Alpha, ...)\n      // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image.\n\n      // Read the data by channel.\n      for (channel = 0; channel < 4; channel++) {\n         if (channel >= channelCount) {\n            // Fill this channel with default data.\n            if (bitdepth == 16 && bpc == 16) {\n               stbi__uint16 *q = ((stbi__uint16 *) out) + channel;\n               stbi__uint16 val = channel == 3 ? 65535 : 0;\n               for (i = 0; i < pixelCount; i++, q += 4)\n                  *q = val;\n            } else {\n               stbi_uc *p = out+channel;\n               stbi_uc val = channel == 3 ? 255 : 0;\n               for (i = 0; i < pixelCount; i++, p += 4)\n                  *p = val;\n            }\n         } else {\n            if (ri->bits_per_channel == 16) {    // output bpc\n               stbi__uint16 *q = ((stbi__uint16 *) out) + channel;\n               for (i = 0; i < pixelCount; i++, q += 4)\n                  *q = (stbi__uint16) stbi__get16be(s);\n            } else {\n               stbi_uc *p = out+channel;\n               if (bitdepth == 16) {  // input bpc\n                  for (i = 0; i < pixelCount; i++, p += 4)\n                     *p = (stbi_uc) (stbi__get16be(s) >> 8);\n               } else {\n                  for (i = 0; i < pixelCount; i++, p += 4)\n                     *p = stbi__get8(s);\n               }\n            }\n         }\n      }\n   }\n\n   // remove weird white matte from PSD\n   if (channelCount >= 4) {\n      if (ri->bits_per_channel == 16) {\n         for (i=0; i < w*h; ++i) {\n            stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i;\n            if (pixel[3] != 0 && pixel[3] != 65535) {\n               float a = pixel[3] / 65535.0f;\n               float ra = 1.0f / a;\n               float inv_a = 65535.0f * (1 - ra);\n               pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a);\n               pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a);\n               pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a);\n            }\n         }\n      } else {\n         for (i=0; i < w*h; ++i) {\n            unsigned char *pixel = out + 4*i;\n            if (pixel[3] != 0 && pixel[3] != 255) {\n               float a = pixel[3] / 255.0f;\n               float ra = 1.0f / a;\n               float inv_a = 255.0f * (1 - ra);\n               pixel[0] = (unsigned char) (pixel[0]*ra + inv_a);\n               pixel[1] = (unsigned char) (pixel[1]*ra + inv_a);\n               pixel[2] = (unsigned char) (pixel[2]*ra + inv_a);\n            }\n         }\n      }\n   }\n\n   // convert to desired output format\n   if (req_comp && req_comp != 4) {\n      if (ri->bits_per_channel == 16)\n         out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h);\n      else\n         out = stbi__convert_format(out, 4, req_comp, w, h);\n      if (out == NULL) return out; // stbi__convert_format frees input on failure\n   }\n\n   if (comp) *comp = 4;\n   *y = h;\n   *x = w;\n\n   return out;\n}\n#endif\n\n// *************************************************************************************************\n// Softimage PIC loader\n// by Tom Seddon\n//\n// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format\n// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/\n\n#ifndef STBI_NO_PIC\nstatic int stbi__pic_is4(stbi__context *s,const char *str)\n{\n   int i;\n   for (i=0; i<4; ++i)\n      if (stbi__get8(s) != (stbi_uc)str[i])\n         return 0;\n\n   return 1;\n}\n\nstatic int stbi__pic_test_core(stbi__context *s)\n{\n   int i;\n\n   if (!stbi__pic_is4(s,\"\\x53\\x80\\xF6\\x34\"))\n      return 0;\n\n   for(i=0;i<84;++i)\n      stbi__get8(s);\n\n   if (!stbi__pic_is4(s,\"PICT\"))\n      return 0;\n\n   return 1;\n}\n\ntypedef struct\n{\n   stbi_uc size,type,channel;\n} stbi__pic_packet;\n\nstatic stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest)\n{\n   int mask=0x80, i;\n\n   for (i=0; i<4; ++i, mask>>=1) {\n      if (channel & mask) {\n         if (stbi__at_eof(s)) return stbi__errpuc(\"bad file\",\"PIC file too short\");\n         dest[i]=stbi__get8(s);\n      }\n   }\n\n   return dest;\n}\n\nstatic void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src)\n{\n   int mask=0x80,i;\n\n   for (i=0;i<4; ++i, mask>>=1)\n      if (channel&mask)\n         dest[i]=src[i];\n}\n\nstatic stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result)\n{\n   int act_comp=0,num_packets=0,y,chained;\n   stbi__pic_packet packets[10];\n\n   // this will (should...) cater for even some bizarre stuff like having data\n    // for the same channel in multiple packets.\n   do {\n      stbi__pic_packet *packet;\n\n      if (num_packets==sizeof(packets)/sizeof(packets[0]))\n         return stbi__errpuc(\"bad format\",\"too many packets\");\n\n      packet = &packets[num_packets++];\n\n      chained = stbi__get8(s);\n      packet->size    = stbi__get8(s);\n      packet->type    = stbi__get8(s);\n      packet->channel = stbi__get8(s);\n\n      act_comp |= packet->channel;\n\n      if (stbi__at_eof(s))          return stbi__errpuc(\"bad file\",\"file too short (reading packets)\");\n      if (packet->size != 8)  return stbi__errpuc(\"bad format\",\"packet isn't 8bpp\");\n   } while (chained);\n\n   *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel?\n\n   for(y=0; y<height; ++y) {\n      int packet_idx;\n\n      for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {\n         stbi__pic_packet *packet = &packets[packet_idx];\n         stbi_uc *dest = result+y*width*4;\n\n         switch (packet->type) {\n            default:\n               return stbi__errpuc(\"bad format\",\"packet has bad compression type\");\n\n            case 0: {//uncompressed\n               int x;\n\n               for(x=0;x<width;++x, dest+=4)\n                  if (!stbi__readval(s,packet->channel,dest))\n                     return 0;\n               break;\n            }\n\n            case 1://Pure RLE\n               {\n                  int left=width, i;\n\n                  while (left>0) {\n                     stbi_uc count,value[4];\n\n                     count=stbi__get8(s);\n                     if (stbi__at_eof(s))   return stbi__errpuc(\"bad file\",\"file too short (pure read count)\");\n\n                     if (count > left)\n                        count = (stbi_uc) left;\n\n                     if (!stbi__readval(s,packet->channel,value))  return 0;\n\n                     for(i=0; i<count; ++i,dest+=4)\n                        stbi__copyval(packet->channel,dest,value);\n                     left -= count;\n                  }\n               }\n               break;\n\n            case 2: {//Mixed RLE\n               int left=width;\n               while (left>0) {\n                  int count = stbi__get8(s), i;\n                  if (stbi__at_eof(s))  return stbi__errpuc(\"bad file\",\"file too short (mixed read count)\");\n\n                  if (count >= 128) { // Repeated\n                     stbi_uc value[4];\n\n                     if (count==128)\n                        count = stbi__get16be(s);\n                     else\n                        count -= 127;\n                     if (count > left)\n                        return stbi__errpuc(\"bad file\",\"scanline overrun\");\n\n                     if (!stbi__readval(s,packet->channel,value))\n                        return 0;\n\n                     for(i=0;i<count;++i, dest += 4)\n                        stbi__copyval(packet->channel,dest,value);\n                  } else { // Raw\n                     ++count;\n                     if (count>left) return stbi__errpuc(\"bad file\",\"scanline overrun\");\n\n                     for(i=0;i<count;++i, dest+=4)\n                        if (!stbi__readval(s,packet->channel,dest))\n                           return 0;\n                  }\n                  left-=count;\n               }\n               break;\n            }\n         }\n      }\n   }\n\n   return result;\n}\n\nstatic void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri)\n{\n   stbi_uc *result;\n   int i, x,y, internal_comp;\n   STBI_NOTUSED(ri);\n\n   if (!comp) comp = &internal_comp;\n\n   for (i=0; i<92; ++i)\n      stbi__get8(s);\n\n   x = stbi__get16be(s);\n   y = stbi__get16be(s);\n\n   if (y > STBI_MAX_DIMENSIONS) return stbi__errpuc(\"too large\",\"Very large image (corrupt?)\");\n   if (x > STBI_MAX_DIMENSIONS) return stbi__errpuc(\"too large\",\"Very large image (corrupt?)\");\n\n   if (stbi__at_eof(s))  return stbi__errpuc(\"bad file\",\"file too short (pic header)\");\n   if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc(\"too large\", \"PIC image too large to decode\");\n\n   stbi__get32be(s); //skip `ratio'\n   stbi__get16be(s); //skip `fields'\n   stbi__get16be(s); //skip `pad'\n\n   // intermediate buffer is RGBA\n   result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0);\n   if (!result) return stbi__errpuc(\"outofmem\", \"Out of memory\");\n   memset(result, 0xff, x*y*4);\n\n   if (!stbi__pic_load_core(s,x,y,comp, result)) {\n      STBI_FREE(result);\n      result=0;\n   }\n   *px = x;\n   *py = y;\n   if (req_comp == 0) req_comp = *comp;\n   result=stbi__convert_format(result,4,req_comp,x,y);\n\n   return result;\n}\n\nstatic int stbi__pic_test(stbi__context *s)\n{\n   int r = stbi__pic_test_core(s);\n   stbi__rewind(s);\n   return r;\n}\n#endif\n\n// *************************************************************************************************\n// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb\n\n#ifndef STBI_NO_GIF\ntypedef struct\n{\n   stbi__int16 prefix;\n   stbi_uc first;\n   stbi_uc suffix;\n} stbi__gif_lzw;\n\ntypedef struct\n{\n   int w,h;\n   stbi_uc *out;                 // output buffer (always 4 components)\n   stbi_uc *background;          // The current \"background\" as far as a gif is concerned\n   stbi_uc *history;\n   int flags, bgindex, ratio, transparent, eflags;\n   stbi_uc  pal[256][4];\n   stbi_uc lpal[256][4];\n   stbi__gif_lzw codes[8192];\n   stbi_uc *color_table;\n   int parse, step;\n   int lflags;\n   int start_x, start_y;\n   int max_x, max_y;\n   int cur_x, cur_y;\n   int line_size;\n   int delay;\n} stbi__gif;\n\nstatic int stbi__gif_test_raw(stbi__context *s)\n{\n   int sz;\n   if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0;\n   sz = stbi__get8(s);\n   if (sz != '9' && sz != '7') return 0;\n   if (stbi__get8(s) != 'a') return 0;\n   return 1;\n}\n\nstatic int stbi__gif_test(stbi__context *s)\n{\n   int r = stbi__gif_test_raw(s);\n   stbi__rewind(s);\n   return r;\n}\n\nstatic void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp)\n{\n   int i;\n   for (i=0; i < num_entries; ++i) {\n      pal[i][2] = stbi__get8(s);\n      pal[i][1] = stbi__get8(s);\n      pal[i][0] = stbi__get8(s);\n      pal[i][3] = transp == i ? 0 : 255;\n   }\n}\n\nstatic int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info)\n{\n   stbi_uc version;\n   if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8')\n      return stbi__err(\"not GIF\", \"Corrupt GIF\");\n\n   version = stbi__get8(s);\n   if (version != '7' && version != '9')    return stbi__err(\"not GIF\", \"Corrupt GIF\");\n   if (stbi__get8(s) != 'a')                return stbi__err(\"not GIF\", \"Corrupt GIF\");\n\n   stbi__g_failure_reason = \"\";\n   g->w = stbi__get16le(s);\n   g->h = stbi__get16le(s);\n   g->flags = stbi__get8(s);\n   g->bgindex = stbi__get8(s);\n   g->ratio = stbi__get8(s);\n   g->transparent = -1;\n\n   if (g->w > STBI_MAX_DIMENSIONS) return stbi__err(\"too large\",\"Very large image (corrupt?)\");\n   if (g->h > STBI_MAX_DIMENSIONS) return stbi__err(\"too large\",\"Very large image (corrupt?)\");\n\n   if (comp != 0) *comp = 4;  // can't actually tell whether it's 3 or 4 until we parse the comments\n\n   if (is_info) return 1;\n\n   if (g->flags & 0x80)\n      stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);\n\n   return 1;\n}\n\nstatic int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp)\n{\n   stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif));\n   if (!g) return stbi__err(\"outofmem\", \"Out of memory\");\n   if (!stbi__gif_header(s, g, comp, 1)) {\n      STBI_FREE(g);\n      stbi__rewind( s );\n      return 0;\n   }\n   if (x) *x = g->w;\n   if (y) *y = g->h;\n   STBI_FREE(g);\n   return 1;\n}\n\nstatic void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)\n{\n   stbi_uc *p, *c;\n   int idx;\n\n   // recurse to decode the prefixes, since the linked-list is backwards,\n   // and working backwards through an interleaved image would be nasty\n   if (g->codes[code].prefix >= 0)\n      stbi__out_gif_code(g, g->codes[code].prefix);\n\n   if (g->cur_y >= g->max_y) return;\n\n   idx = g->cur_x + g->cur_y;\n   p = &g->out[idx];\n   g->history[idx / 4] = 1;\n\n   c = &g->color_table[g->codes[code].suffix * 4];\n   if (c[3] > 128) { // don't render transparent pixels;\n      p[0] = c[2];\n      p[1] = c[1];\n      p[2] = c[0];\n      p[3] = c[3];\n   }\n   g->cur_x += 4;\n\n   if (g->cur_x >= g->max_x) {\n      g->cur_x = g->start_x;\n      g->cur_y += g->step;\n\n      while (g->cur_y >= g->max_y && g->parse > 0) {\n         g->step = (1 << g->parse) * g->line_size;\n         g->cur_y = g->start_y + (g->step >> 1);\n         --g->parse;\n      }\n   }\n}\n\nstatic stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)\n{\n   stbi_uc lzw_cs;\n   stbi__int32 len, init_code;\n   stbi__uint32 first;\n   stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;\n   stbi__gif_lzw *p;\n\n   lzw_cs = stbi__get8(s);\n   if (lzw_cs > 12) return NULL;\n   clear = 1 << lzw_cs;\n   first = 1;\n   codesize = lzw_cs + 1;\n   codemask = (1 << codesize) - 1;\n   bits = 0;\n   valid_bits = 0;\n   for (init_code = 0; init_code < clear; init_code++) {\n      g->codes[init_code].prefix = -1;\n      g->codes[init_code].first = (stbi_uc) init_code;\n      g->codes[init_code].suffix = (stbi_uc) init_code;\n   }\n\n   // support no starting clear code\n   avail = clear+2;\n   oldcode = -1;\n\n   len = 0;\n   for(;;) {\n      if (valid_bits < codesize) {\n         if (len == 0) {\n            len = stbi__get8(s); // start new block\n            if (len == 0)\n               return g->out;\n         }\n         --len;\n         bits |= (stbi__int32) stbi__get8(s) << valid_bits;\n         valid_bits += 8;\n      } else {\n         stbi__int32 code = bits & codemask;\n         bits >>= codesize;\n         valid_bits -= codesize;\n         // @OPTIMIZE: is there some way we can accelerate the non-clear path?\n         if (code == clear) {  // clear code\n            codesize = lzw_cs + 1;\n            codemask = (1 << codesize) - 1;\n            avail = clear + 2;\n            oldcode = -1;\n            first = 0;\n         } else if (code == clear + 1) { // end of stream code\n            stbi__skip(s, len);\n            while ((len = stbi__get8(s)) > 0)\n               stbi__skip(s,len);\n            return g->out;\n         } else if (code <= avail) {\n            if (first) {\n               return stbi__errpuc(\"no clear code\", \"Corrupt GIF\");\n            }\n\n            if (oldcode >= 0) {\n               p = &g->codes[avail++];\n               if (avail > 8192) {\n                  return stbi__errpuc(\"too many codes\", \"Corrupt GIF\");\n               }\n\n               p->prefix = (stbi__int16) oldcode;\n               p->first = g->codes[oldcode].first;\n               p->suffix = (code == avail) ? p->first : g->codes[code].first;\n            } else if (code == avail)\n               return stbi__errpuc(\"illegal code in raster\", \"Corrupt GIF\");\n\n            stbi__out_gif_code(g, (stbi__uint16) code);\n\n            if ((avail & codemask) == 0 && avail <= 0x0FFF) {\n               codesize++;\n               codemask = (1 << codesize) - 1;\n            }\n\n            oldcode = code;\n         } else {\n            return stbi__errpuc(\"illegal code in raster\", \"Corrupt GIF\");\n         }\n      }\n   }\n}\n\n// this function is designed to support animated gifs, although stb_image doesn't support it\n// two back is the image from two frames ago, used for a very specific disposal format\nstatic stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back)\n{\n   int dispose;\n   int first_frame;\n   int pi;\n   int pcount;\n   STBI_NOTUSED(req_comp);\n\n   // on first frame, any non-written pixels get the background colour (non-transparent)\n   first_frame = 0;\n   if (g->out == 0) {\n      if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header\n      if (!stbi__mad3sizes_valid(4, g->w, g->h, 0))\n         return stbi__errpuc(\"too large\", \"GIF image is too large\");\n      pcount = g->w * g->h;\n      g->out = (stbi_uc *) stbi__malloc(4 * pcount);\n      g->background = (stbi_uc *) stbi__malloc(4 * pcount);\n      g->history = (stbi_uc *) stbi__malloc(pcount);\n      if (!g->out || !g->background || !g->history)\n         return stbi__errpuc(\"outofmem\", \"Out of memory\");\n\n      // image is treated as \"transparent\" at the start - ie, nothing overwrites the current background;\n      // background colour is only used for pixels that are not rendered first frame, after that \"background\"\n      // color refers to the color that was there the previous frame.\n      memset(g->out, 0x00, 4 * pcount);\n      memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent)\n      memset(g->history, 0x00, pcount);        // pixels that were affected previous frame\n      first_frame = 1;\n   } else {\n      // second frame - how do we dispose of the previous one?\n      dispose = (g->eflags & 0x1C) >> 2;\n      pcount = g->w * g->h;\n\n      if ((dispose == 3) && (two_back == 0)) {\n         dispose = 2; // if I don't have an image to revert back to, default to the old background\n      }\n\n      if (dispose == 3) { // use previous graphic\n         for (pi = 0; pi < pcount; ++pi) {\n            if (g->history[pi]) {\n               memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 );\n            }\n         }\n      } else if (dispose == 2) {\n         // restore what was changed last frame to background before that frame;\n         for (pi = 0; pi < pcount; ++pi) {\n            if (g->history[pi]) {\n               memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 );\n            }\n         }\n      } else {\n         // This is a non-disposal case eithe way, so just\n         // leave the pixels as is, and they will become the new background\n         // 1: do not dispose\n         // 0:  not specified.\n      }\n\n      // background is what out is after the undoing of the previou frame;\n      memcpy( g->background, g->out, 4 * g->w * g->h );\n   }\n\n   // clear my history;\n   memset( g->history, 0x00, g->w * g->h );        // pixels that were affected previous frame\n\n   for (;;) {\n      int tag = stbi__get8(s);\n      switch (tag) {\n         case 0x2C: /* Image Descriptor */\n         {\n            stbi__int32 x, y, w, h;\n            stbi_uc *o;\n\n            x = stbi__get16le(s);\n            y = stbi__get16le(s);\n            w = stbi__get16le(s);\n            h = stbi__get16le(s);\n            if (((x + w) > (g->w)) || ((y + h) > (g->h)))\n               return stbi__errpuc(\"bad Image Descriptor\", \"Corrupt GIF\");\n\n            g->line_size = g->w * 4;\n            g->start_x = x * 4;\n            g->start_y = y * g->line_size;\n            g->max_x   = g->start_x + w * 4;\n            g->max_y   = g->start_y + h * g->line_size;\n            g->cur_x   = g->start_x;\n            g->cur_y   = g->start_y;\n\n            // if the width of the specified rectangle is 0, that means\n            // we may not see *any* pixels or the image is malformed;\n            // to make sure this is caught, move the current y down to\n            // max_y (which is what out_gif_code checks).\n            if (w == 0)\n               g->cur_y = g->max_y;\n\n            g->lflags = stbi__get8(s);\n\n            if (g->lflags & 0x40) {\n               g->step = 8 * g->line_size; // first interlaced spacing\n               g->parse = 3;\n            } else {\n               g->step = g->line_size;\n               g->parse = 0;\n            }\n\n            if (g->lflags & 0x80) {\n               stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);\n               g->color_table = (stbi_uc *) g->lpal;\n            } else if (g->flags & 0x80) {\n               g->color_table = (stbi_uc *) g->pal;\n            } else\n               return stbi__errpuc(\"missing color table\", \"Corrupt GIF\");\n\n            o = stbi__process_gif_raster(s, g);\n            if (!o) return NULL;\n\n            // if this was the first frame,\n            pcount = g->w * g->h;\n            if (first_frame && (g->bgindex > 0)) {\n               // if first frame, any pixel not drawn to gets the background color\n               for (pi = 0; pi < pcount; ++pi) {\n                  if (g->history[pi] == 0) {\n                     g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be;\n                     memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 );\n                  }\n               }\n            }\n\n            return o;\n         }\n\n         case 0x21: // Comment Extension.\n         {\n            int len;\n            int ext = stbi__get8(s);\n            if (ext == 0xF9) { // Graphic Control Extension.\n               len = stbi__get8(s);\n               if (len == 4) {\n                  g->eflags = stbi__get8(s);\n                  g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths.\n\n                  // unset old transparent\n                  if (g->transparent >= 0) {\n                     g->pal[g->transparent][3] = 255;\n                  }\n                  if (g->eflags & 0x01) {\n                     g->transparent = stbi__get8(s);\n                     if (g->transparent >= 0) {\n                        g->pal[g->transparent][3] = 0;\n                     }\n                  } else {\n                     // don't need transparent\n                     stbi__skip(s, 1);\n                     g->transparent = -1;\n                  }\n               } else {\n                  stbi__skip(s, len);\n                  break;\n               }\n            }\n            while ((len = stbi__get8(s)) != 0) {\n               stbi__skip(s, len);\n            }\n            break;\n         }\n\n         case 0x3B: // gif stream termination code\n            return (stbi_uc *) s; // using '1' causes warning on some compilers\n\n         default:\n            return stbi__errpuc(\"unknown code\", \"Corrupt GIF\");\n      }\n   }\n}\n\nstatic void *stbi__load_gif_main_outofmem(stbi__gif *g, stbi_uc *out, int **delays)\n{\n   STBI_FREE(g->out);\n   STBI_FREE(g->history);\n   STBI_FREE(g->background);\n\n   if (out) STBI_FREE(out);\n   if (delays && *delays) STBI_FREE(*delays);\n   return stbi__errpuc(\"outofmem\", \"Out of memory\");\n}\n\nstatic void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp)\n{\n   if (stbi__gif_test(s)) {\n      int layers = 0;\n      stbi_uc *u = 0;\n      stbi_uc *out = 0;\n      stbi_uc *two_back = 0;\n      stbi__gif g;\n      int stride;\n      int out_size = 0;\n      int delays_size = 0;\n\n      STBI_NOTUSED(out_size);\n      STBI_NOTUSED(delays_size);\n\n      memset(&g, 0, sizeof(g));\n      if (delays) {\n         *delays = 0;\n      }\n\n      do {\n         u = stbi__gif_load_next(s, &g, comp, req_comp, two_back);\n         if (u == (stbi_uc *) s) u = 0;  // end of animated gif marker\n\n         if (u) {\n            *x = g.w;\n            *y = g.h;\n            ++layers;\n            stride = g.w * g.h * 4;\n\n            if (out) {\n               void *tmp = (stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride );\n               if (!tmp)\n                  return stbi__load_gif_main_outofmem(&g, out, delays);\n               else {\n                   out = (stbi_uc*) tmp;\n                   out_size = layers * stride;\n               }\n\n               if (delays) {\n                  int *new_delays = (int*) STBI_REALLOC_SIZED( *delays, delays_size, sizeof(int) * layers );\n                  if (!new_delays)\n                     return stbi__load_gif_main_outofmem(&g, out, delays);\n                  *delays = new_delays;\n                  delays_size = layers * sizeof(int);\n               }\n            } else {\n               out = (stbi_uc*)stbi__malloc( layers * stride );\n               if (!out)\n                  return stbi__load_gif_main_outofmem(&g, out, delays);\n               out_size = layers * stride;\n               if (delays) {\n                  *delays = (int*) stbi__malloc( layers * sizeof(int) );\n                  if (!*delays)\n                     return stbi__load_gif_main_outofmem(&g, out, delays);\n                  delays_size = layers * sizeof(int);\n               }\n            }\n            memcpy( out + ((layers - 1) * stride), u, stride );\n            if (layers >= 2) {\n               two_back = out - 2 * stride;\n            }\n\n            if (delays) {\n               (*delays)[layers - 1U] = g.delay;\n            }\n         }\n      } while (u != 0);\n\n      // free temp buffer;\n      STBI_FREE(g.out);\n      STBI_FREE(g.history);\n      STBI_FREE(g.background);\n\n      // do the final conversion after loading everything;\n      if (req_comp && req_comp != 4)\n         out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h);\n\n      *z = layers;\n      return out;\n   } else {\n      return stbi__errpuc(\"not GIF\", \"Image was not as a gif type.\");\n   }\n}\n\nstatic void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)\n{\n   stbi_uc *u = 0;\n   stbi__gif g;\n   memset(&g, 0, sizeof(g));\n   STBI_NOTUSED(ri);\n\n   u = stbi__gif_load_next(s, &g, comp, req_comp, 0);\n   if (u == (stbi_uc *) s) u = 0;  // end of animated gif marker\n   if (u) {\n      *x = g.w;\n      *y = g.h;\n\n      // moved conversion to after successful load so that the same\n      // can be done for multiple frames.\n      if (req_comp && req_comp != 4)\n         u = stbi__convert_format(u, 4, req_comp, g.w, g.h);\n   } else if (g.out) {\n      // if there was an error and we allocated an image buffer, free it!\n      STBI_FREE(g.out);\n   }\n\n   // free buffers needed for multiple frame loading;\n   STBI_FREE(g.history);\n   STBI_FREE(g.background);\n\n   return u;\n}\n\nstatic int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   return stbi__gif_info_raw(s,x,y,comp);\n}\n#endif\n\n// *************************************************************************************************\n// Radiance RGBE HDR loader\n// originally by Nicolas Schulz\n#ifndef STBI_NO_HDR\nstatic int stbi__hdr_test_core(stbi__context *s, const char *signature)\n{\n   int i;\n   for (i=0; signature[i]; ++i)\n      if (stbi__get8(s) != signature[i])\n          return 0;\n   stbi__rewind(s);\n   return 1;\n}\n\nstatic int stbi__hdr_test(stbi__context* s)\n{\n   int r = stbi__hdr_test_core(s, \"#?RADIANCE\\n\");\n   stbi__rewind(s);\n   if(!r) {\n       r = stbi__hdr_test_core(s, \"#?RGBE\\n\");\n       stbi__rewind(s);\n   }\n   return r;\n}\n\n#define STBI__HDR_BUFLEN  1024\nstatic char *stbi__hdr_gettoken(stbi__context *z, char *buffer)\n{\n   int len=0;\n   char c = '\\0';\n\n   c = (char) stbi__get8(z);\n\n   while (!stbi__at_eof(z) && c != '\\n') {\n      buffer[len++] = c;\n      if (len == STBI__HDR_BUFLEN-1) {\n         // flush to end of line\n         while (!stbi__at_eof(z) && stbi__get8(z) != '\\n')\n            ;\n         break;\n      }\n      c = (char) stbi__get8(z);\n   }\n\n   buffer[len] = 0;\n   return buffer;\n}\n\nstatic void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp)\n{\n   if ( input[3] != 0 ) {\n      float f1;\n      // Exponent\n      f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8));\n      if (req_comp <= 2)\n         output[0] = (input[0] + input[1] + input[2]) * f1 / 3;\n      else {\n         output[0] = input[0] * f1;\n         output[1] = input[1] * f1;\n         output[2] = input[2] * f1;\n      }\n      if (req_comp == 2) output[1] = 1;\n      if (req_comp == 4) output[3] = 1;\n   } else {\n      switch (req_comp) {\n         case 4: output[3] = 1; /* fallthrough */\n         case 3: output[0] = output[1] = output[2] = 0;\n                 break;\n         case 2: output[1] = 1; /* fallthrough */\n         case 1: output[0] = 0;\n                 break;\n      }\n   }\n}\n\nstatic float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)\n{\n   char buffer[STBI__HDR_BUFLEN];\n   char *token;\n   int valid = 0;\n   int width, height;\n   stbi_uc *scanline;\n   float *hdr_data;\n   int len;\n   unsigned char count, value;\n   int i, j, k, c1,c2, z;\n   const char *headerToken;\n   STBI_NOTUSED(ri);\n\n   // Check identifier\n   headerToken = stbi__hdr_gettoken(s,buffer);\n   if (strcmp(headerToken, \"#?RADIANCE\") != 0 && strcmp(headerToken, \"#?RGBE\") != 0)\n      return stbi__errpf(\"not HDR\", \"Corrupt HDR image\");\n\n   // Parse header\n   for(;;) {\n      token = stbi__hdr_gettoken(s,buffer);\n      if (token[0] == 0) break;\n      if (strcmp(token, \"FORMAT=32-bit_rle_rgbe\") == 0) valid = 1;\n   }\n\n   if (!valid)    return stbi__errpf(\"unsupported format\", \"Unsupported HDR format\");\n\n   // Parse width and height\n   // can't use sscanf() if we're not using stdio!\n   token = stbi__hdr_gettoken(s,buffer);\n   if (strncmp(token, \"-Y \", 3))  return stbi__errpf(\"unsupported data layout\", \"Unsupported HDR format\");\n   token += 3;\n   height = (int) strtol(token, &token, 10);\n   while (*token == ' ') ++token;\n   if (strncmp(token, \"+X \", 3))  return stbi__errpf(\"unsupported data layout\", \"Unsupported HDR format\");\n   token += 3;\n   width = (int) strtol(token, NULL, 10);\n\n   if (height > STBI_MAX_DIMENSIONS) return stbi__errpf(\"too large\",\"Very large image (corrupt?)\");\n   if (width > STBI_MAX_DIMENSIONS) return stbi__errpf(\"too large\",\"Very large image (corrupt?)\");\n\n   *x = width;\n   *y = height;\n\n   if (comp) *comp = 3;\n   if (req_comp == 0) req_comp = 3;\n\n   if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0))\n      return stbi__errpf(\"too large\", \"HDR image is too large\");\n\n   // Read data\n   hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0);\n   if (!hdr_data)\n      return stbi__errpf(\"outofmem\", \"Out of memory\");\n\n   // Load image data\n   // image data is stored as some number of sca\n   if ( width < 8 || width >= 32768) {\n      // Read flat data\n      for (j=0; j < height; ++j) {\n         for (i=0; i < width; ++i) {\n            stbi_uc rgbe[4];\n           main_decode_loop:\n            stbi__getn(s, rgbe, 4);\n            stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);\n         }\n      }\n   } else {\n      // Read RLE-encoded data\n      scanline = NULL;\n\n      for (j = 0; j < height; ++j) {\n         c1 = stbi__get8(s);\n         c2 = stbi__get8(s);\n         len = stbi__get8(s);\n         if (c1 != 2 || c2 != 2 || (len & 0x80)) {\n            // not run-length encoded, so we have to actually use THIS data as a decoded\n            // pixel (note this can't be a valid pixel--one of RGB must be >= 128)\n            stbi_uc rgbe[4];\n            rgbe[0] = (stbi_uc) c1;\n            rgbe[1] = (stbi_uc) c2;\n            rgbe[2] = (stbi_uc) len;\n            rgbe[3] = (stbi_uc) stbi__get8(s);\n            stbi__hdr_convert(hdr_data, rgbe, req_comp);\n            i = 1;\n            j = 0;\n            STBI_FREE(scanline);\n            goto main_decode_loop; // yes, this makes no sense\n         }\n         len <<= 8;\n         len |= stbi__get8(s);\n         if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf(\"invalid decoded scanline length\", \"corrupt HDR\"); }\n         if (scanline == NULL) {\n            scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0);\n            if (!scanline) {\n               STBI_FREE(hdr_data);\n               return stbi__errpf(\"outofmem\", \"Out of memory\");\n            }\n         }\n\n         for (k = 0; k < 4; ++k) {\n            int nleft;\n            i = 0;\n            while ((nleft = width - i) > 0) {\n               count = stbi__get8(s);\n               if (count > 128) {\n                  // Run\n                  value = stbi__get8(s);\n                  count -= 128;\n                  if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf(\"corrupt\", \"bad RLE data in HDR\"); }\n                  for (z = 0; z < count; ++z)\n                     scanline[i++ * 4 + k] = value;\n               } else {\n                  // Dump\n                  if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf(\"corrupt\", \"bad RLE data in HDR\"); }\n                  for (z = 0; z < count; ++z)\n                     scanline[i++ * 4 + k] = stbi__get8(s);\n               }\n            }\n         }\n         for (i=0; i < width; ++i)\n            stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);\n      }\n      if (scanline)\n         STBI_FREE(scanline);\n   }\n\n   return hdr_data;\n}\n\nstatic int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   char buffer[STBI__HDR_BUFLEN];\n   char *token;\n   int valid = 0;\n   int dummy;\n\n   if (!x) x = &dummy;\n   if (!y) y = &dummy;\n   if (!comp) comp = &dummy;\n\n   if (stbi__hdr_test(s) == 0) {\n       stbi__rewind( s );\n       return 0;\n   }\n\n   for(;;) {\n      token = stbi__hdr_gettoken(s,buffer);\n      if (token[0] == 0) break;\n      if (strcmp(token, \"FORMAT=32-bit_rle_rgbe\") == 0) valid = 1;\n   }\n\n   if (!valid) {\n       stbi__rewind( s );\n       return 0;\n   }\n   token = stbi__hdr_gettoken(s,buffer);\n   if (strncmp(token, \"-Y \", 3)) {\n       stbi__rewind( s );\n       return 0;\n   }\n   token += 3;\n   *y = (int) strtol(token, &token, 10);\n   while (*token == ' ') ++token;\n   if (strncmp(token, \"+X \", 3)) {\n       stbi__rewind( s );\n       return 0;\n   }\n   token += 3;\n   *x = (int) strtol(token, NULL, 10);\n   *comp = 3;\n   return 1;\n}\n#endif // STBI_NO_HDR\n\n#ifndef STBI_NO_BMP\nstatic int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   void *p;\n   stbi__bmp_data info;\n\n   info.all_a = 255;\n   p = stbi__bmp_parse_header(s, &info);\n   if (p == NULL) {\n      stbi__rewind( s );\n      return 0;\n   }\n   if (x) *x = s->img_x;\n   if (y) *y = s->img_y;\n   if (comp) {\n      if (info.bpp == 24 && info.ma == 0xff000000)\n         *comp = 3;\n      else\n         *comp = info.ma ? 4 : 3;\n   }\n   return 1;\n}\n#endif\n\n#ifndef STBI_NO_PSD\nstatic int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   int channelCount, dummy, depth;\n   if (!x) x = &dummy;\n   if (!y) y = &dummy;\n   if (!comp) comp = &dummy;\n   if (stbi__get32be(s) != 0x38425053) {\n       stbi__rewind( s );\n       return 0;\n   }\n   if (stbi__get16be(s) != 1) {\n       stbi__rewind( s );\n       return 0;\n   }\n   stbi__skip(s, 6);\n   channelCount = stbi__get16be(s);\n   if (channelCount < 0 || channelCount > 16) {\n       stbi__rewind( s );\n       return 0;\n   }\n   *y = stbi__get32be(s);\n   *x = stbi__get32be(s);\n   depth = stbi__get16be(s);\n   if (depth != 8 && depth != 16) {\n       stbi__rewind( s );\n       return 0;\n   }\n   if (stbi__get16be(s) != 3) {\n       stbi__rewind( s );\n       return 0;\n   }\n   *comp = 4;\n   return 1;\n}\n\nstatic int stbi__psd_is16(stbi__context *s)\n{\n   int channelCount, depth;\n   if (stbi__get32be(s) != 0x38425053) {\n       stbi__rewind( s );\n       return 0;\n   }\n   if (stbi__get16be(s) != 1) {\n       stbi__rewind( s );\n       return 0;\n   }\n   stbi__skip(s, 6);\n   channelCount = stbi__get16be(s);\n   if (channelCount < 0 || channelCount > 16) {\n       stbi__rewind( s );\n       return 0;\n   }\n   STBI_NOTUSED(stbi__get32be(s));\n   STBI_NOTUSED(stbi__get32be(s));\n   depth = stbi__get16be(s);\n   if (depth != 16) {\n       stbi__rewind( s );\n       return 0;\n   }\n   return 1;\n}\n#endif\n\n#ifndef STBI_NO_PIC\nstatic int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   int act_comp=0,num_packets=0,chained,dummy;\n   stbi__pic_packet packets[10];\n\n   if (!x) x = &dummy;\n   if (!y) y = &dummy;\n   if (!comp) comp = &dummy;\n\n   if (!stbi__pic_is4(s,\"\\x53\\x80\\xF6\\x34\")) {\n      stbi__rewind(s);\n      return 0;\n   }\n\n   stbi__skip(s, 88);\n\n   *x = stbi__get16be(s);\n   *y = stbi__get16be(s);\n   if (stbi__at_eof(s)) {\n      stbi__rewind( s);\n      return 0;\n   }\n   if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {\n      stbi__rewind( s );\n      return 0;\n   }\n\n   stbi__skip(s, 8);\n\n   do {\n      stbi__pic_packet *packet;\n\n      if (num_packets==sizeof(packets)/sizeof(packets[0]))\n         return 0;\n\n      packet = &packets[num_packets++];\n      chained = stbi__get8(s);\n      packet->size    = stbi__get8(s);\n      packet->type    = stbi__get8(s);\n      packet->channel = stbi__get8(s);\n      act_comp |= packet->channel;\n\n      if (stbi__at_eof(s)) {\n          stbi__rewind( s );\n          return 0;\n      }\n      if (packet->size != 8) {\n          stbi__rewind( s );\n          return 0;\n      }\n   } while (chained);\n\n   *comp = (act_comp & 0x10 ? 4 : 3);\n\n   return 1;\n}\n#endif\n\n// *************************************************************************************************\n// Portable Gray Map and Portable Pixel Map loader\n// by Ken Miller\n//\n// PGM: http://netpbm.sourceforge.net/doc/pgm.html\n// PPM: http://netpbm.sourceforge.net/doc/ppm.html\n//\n// Known limitations:\n//    Does not support comments in the header section\n//    Does not support ASCII image data (formats P2 and P3)\n\n#ifndef STBI_NO_PNM\n\nstatic int      stbi__pnm_test(stbi__context *s)\n{\n   char p, t;\n   p = (char) stbi__get8(s);\n   t = (char) stbi__get8(s);\n   if (p != 'P' || (t != '5' && t != '6')) {\n       stbi__rewind( s );\n       return 0;\n   }\n   return 1;\n}\n\nstatic void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)\n{\n   stbi_uc *out;\n   STBI_NOTUSED(ri);\n\n   ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n);\n   if (ri->bits_per_channel == 0)\n      return 0;\n\n   if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc(\"too large\",\"Very large image (corrupt?)\");\n   if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc(\"too large\",\"Very large image (corrupt?)\");\n\n   *x = s->img_x;\n   *y = s->img_y;\n   if (comp) *comp = s->img_n;\n\n   if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0))\n      return stbi__errpuc(\"too large\", \"PNM too large\");\n\n   out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0);\n   if (!out) return stbi__errpuc(\"outofmem\", \"Out of memory\");\n   if (!stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8))) {\n      STBI_FREE(out);\n      return stbi__errpuc(\"bad PNM\", \"PNM file truncated\");\n   }\n\n   if (req_comp && req_comp != s->img_n) {\n      if (ri->bits_per_channel == 16) {\n         out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, s->img_n, req_comp, s->img_x, s->img_y);\n      } else {\n         out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);\n      }\n      if (out == NULL) return out; // stbi__convert_format frees input on failure\n   }\n   return out;\n}\n\nstatic int      stbi__pnm_isspace(char c)\n{\n   return c == ' ' || c == '\\t' || c == '\\n' || c == '\\v' || c == '\\f' || c == '\\r';\n}\n\nstatic void     stbi__pnm_skip_whitespace(stbi__context *s, char *c)\n{\n   for (;;) {\n      while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))\n         *c = (char) stbi__get8(s);\n\n      if (stbi__at_eof(s) || *c != '#')\n         break;\n\n      while (!stbi__at_eof(s) && *c != '\\n' && *c != '\\r' )\n         *c = (char) stbi__get8(s);\n   }\n}\n\nstatic int      stbi__pnm_isdigit(char c)\n{\n   return c >= '0' && c <= '9';\n}\n\nstatic int      stbi__pnm_getinteger(stbi__context *s, char *c)\n{\n   int value = 0;\n\n   while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {\n      value = value*10 + (*c - '0');\n      *c = (char) stbi__get8(s);\n      if((value > 214748364) || (value == 214748364 && *c > '7'))\n          return stbi__err(\"integer parse overflow\", \"Parsing an integer in the PPM header overflowed a 32-bit int\");\n   }\n\n   return value;\n}\n\nstatic int      stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   int maxv, dummy;\n   char c, p, t;\n\n   if (!x) x = &dummy;\n   if (!y) y = &dummy;\n   if (!comp) comp = &dummy;\n\n   stbi__rewind(s);\n\n   // Get identifier\n   p = (char) stbi__get8(s);\n   t = (char) stbi__get8(s);\n   if (p != 'P' || (t != '5' && t != '6')) {\n       stbi__rewind(s);\n       return 0;\n   }\n\n   *comp = (t == '6') ? 3 : 1;  // '5' is 1-component .pgm; '6' is 3-component .ppm\n\n   c = (char) stbi__get8(s);\n   stbi__pnm_skip_whitespace(s, &c);\n\n   *x = stbi__pnm_getinteger(s, &c); // read width\n   if(*x == 0)\n       return stbi__err(\"invalid width\", \"PPM image header had zero or overflowing width\");\n   stbi__pnm_skip_whitespace(s, &c);\n\n   *y = stbi__pnm_getinteger(s, &c); // read height\n   if (*y == 0)\n       return stbi__err(\"invalid width\", \"PPM image header had zero or overflowing width\");\n   stbi__pnm_skip_whitespace(s, &c);\n\n   maxv = stbi__pnm_getinteger(s, &c);  // read max value\n   if (maxv > 65535)\n      return stbi__err(\"max value > 65535\", \"PPM image supports only 8-bit and 16-bit images\");\n   else if (maxv > 255)\n      return 16;\n   else\n      return 8;\n}\n\nstatic int stbi__pnm_is16(stbi__context *s)\n{\n   if (stbi__pnm_info(s, NULL, NULL, NULL) == 16)\n\t   return 1;\n   return 0;\n}\n#endif\n\nstatic int stbi__info_main(stbi__context *s, int *x, int *y, int *comp)\n{\n   #ifndef STBI_NO_JPEG\n   if (stbi__jpeg_info(s, x, y, comp)) return 1;\n   #endif\n\n   #ifndef STBI_NO_PNG\n   if (stbi__png_info(s, x, y, comp))  return 1;\n   #endif\n\n   #ifndef STBI_NO_GIF\n   if (stbi__gif_info(s, x, y, comp))  return 1;\n   #endif\n\n   #ifndef STBI_NO_BMP\n   if (stbi__bmp_info(s, x, y, comp))  return 1;\n   #endif\n\n   #ifndef STBI_NO_PSD\n   if (stbi__psd_info(s, x, y, comp))  return 1;\n   #endif\n\n   #ifndef STBI_NO_PIC\n   if (stbi__pic_info(s, x, y, comp))  return 1;\n   #endif\n\n   #ifndef STBI_NO_PNM\n   if (stbi__pnm_info(s, x, y, comp))  return 1;\n   #endif\n\n   #ifndef STBI_NO_HDR\n   if (stbi__hdr_info(s, x, y, comp))  return 1;\n   #endif\n\n   // test tga last because it's a crappy test!\n   #ifndef STBI_NO_TGA\n   if (stbi__tga_info(s, x, y, comp))\n       return 1;\n   #endif\n   return stbi__err(\"unknown image type\", \"Image not of any known type, or corrupt\");\n}\n\nstatic int stbi__is_16_main(stbi__context *s)\n{\n   #ifndef STBI_NO_PNG\n   if (stbi__png_is16(s))  return 1;\n   #endif\n\n   #ifndef STBI_NO_PSD\n   if (stbi__psd_is16(s))  return 1;\n   #endif\n\n   #ifndef STBI_NO_PNM\n   if (stbi__pnm_is16(s))  return 1;\n   #endif\n   return 0;\n}\n\n#ifndef STBI_NO_STDIO\nSTBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp)\n{\n    FILE *f = stbi__fopen(filename, \"rb\");\n    int result;\n    if (!f) return stbi__err(\"can't fopen\", \"Unable to open file\");\n    result = stbi_info_from_file(f, x, y, comp);\n    fclose(f);\n    return result;\n}\n\nSTBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)\n{\n   int r;\n   stbi__context s;\n   long pos = ftell(f);\n   stbi__start_file(&s, f);\n   r = stbi__info_main(&s,x,y,comp);\n   fseek(f,pos,SEEK_SET);\n   return r;\n}\n\nSTBIDEF int stbi_is_16_bit(char const *filename)\n{\n    FILE *f = stbi__fopen(filename, \"rb\");\n    int result;\n    if (!f) return stbi__err(\"can't fopen\", \"Unable to open file\");\n    result = stbi_is_16_bit_from_file(f);\n    fclose(f);\n    return result;\n}\n\nSTBIDEF int stbi_is_16_bit_from_file(FILE *f)\n{\n   int r;\n   stbi__context s;\n   long pos = ftell(f);\n   stbi__start_file(&s, f);\n   r = stbi__is_16_main(&s);\n   fseek(f,pos,SEEK_SET);\n   return r;\n}\n#endif // !STBI_NO_STDIO\n\nSTBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)\n{\n   stbi__context s;\n   stbi__start_mem(&s,buffer,len);\n   return stbi__info_main(&s,x,y,comp);\n}\n\nSTBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp)\n{\n   stbi__context s;\n   stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user);\n   return stbi__info_main(&s,x,y,comp);\n}\n\nSTBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len)\n{\n   stbi__context s;\n   stbi__start_mem(&s,buffer,len);\n   return stbi__is_16_main(&s);\n}\n\nSTBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user)\n{\n   stbi__context s;\n   stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user);\n   return stbi__is_16_main(&s);\n}\n\n#endif // STB_IMAGE_IMPLEMENTATION\n\n/*\n   revision history:\n      2.20  (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs\n      2.19  (2018-02-11) fix warning\n      2.18  (2018-01-30) fix warnings\n      2.17  (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug\n                         1-bit BMP\n                         *_is_16_bit api\n                         avoid warnings\n      2.16  (2017-07-23) all functions have 16-bit variants;\n                         STBI_NO_STDIO works again;\n                         compilation fixes;\n                         fix rounding in unpremultiply;\n                         optimize vertical flip;\n                         disable raw_len validation;\n                         documentation fixes\n      2.15  (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode;\n                         warning fixes; disable run-time SSE detection on gcc;\n                         uniform handling of optional \"return\" values;\n                         thread-safe initialization of zlib tables\n      2.14  (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs\n      2.13  (2016-11-29) add 16-bit API, only supported for PNG right now\n      2.12  (2016-04-02) fix typo in 2.11 PSD fix that caused crashes\n      2.11  (2016-04-02) allocate large structures on the stack\n                         remove white matting for transparent PSD\n                         fix reported channel count for PNG & BMP\n                         re-enable SSE2 in non-gcc 64-bit\n                         support RGB-formatted JPEG\n                         read 16-bit PNGs (only as 8-bit)\n      2.10  (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED\n      2.09  (2016-01-16) allow comments in PNM files\n                         16-bit-per-pixel TGA (not bit-per-component)\n                         info() for TGA could break due to .hdr handling\n                         info() for BMP to shares code instead of sloppy parse\n                         can use STBI_REALLOC_SIZED if allocator doesn't support realloc\n                         code cleanup\n      2.08  (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA\n      2.07  (2015-09-13) fix compiler warnings\n                         partial animated GIF support\n                         limited 16-bpc PSD support\n                         #ifdef unused functions\n                         bug with < 92 byte PIC,PNM,HDR,TGA\n      2.06  (2015-04-19) fix bug where PSD returns wrong '*comp' value\n      2.05  (2015-04-19) fix bug in progressive JPEG handling, fix warning\n      2.04  (2015-04-15) try to re-enable SIMD on MinGW 64-bit\n      2.03  (2015-04-12) extra corruption checking (mmozeiko)\n                         stbi_set_flip_vertically_on_load (nguillemot)\n                         fix NEON support; fix mingw support\n      2.02  (2015-01-19) fix incorrect assert, fix warning\n      2.01  (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2\n      2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG\n      2.00  (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg)\n                         progressive JPEG (stb)\n                         PGM/PPM support (Ken Miller)\n                         STBI_MALLOC,STBI_REALLOC,STBI_FREE\n                         GIF bugfix -- seemingly never worked\n                         STBI_NO_*, STBI_ONLY_*\n      1.48  (2014-12-14) fix incorrectly-named assert()\n      1.47  (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb)\n                         optimize PNG (ryg)\n                         fix bug in interlaced PNG with user-specified channel count (stb)\n      1.46  (2014-08-26)\n              fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG\n      1.45  (2014-08-16)\n              fix MSVC-ARM internal compiler error by wrapping malloc\n      1.44  (2014-08-07)\n              various warning fixes from Ronny Chevalier\n      1.43  (2014-07-15)\n              fix MSVC-only compiler problem in code changed in 1.42\n      1.42  (2014-07-09)\n              don't define _CRT_SECURE_NO_WARNINGS (affects user code)\n              fixes to stbi__cleanup_jpeg path\n              added STBI_ASSERT to avoid requiring assert.h\n      1.41  (2014-06-25)\n              fix search&replace from 1.36 that messed up comments/error messages\n      1.40  (2014-06-22)\n              fix gcc struct-initialization warning\n      1.39  (2014-06-15)\n              fix to TGA optimization when req_comp != number of components in TGA;\n              fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite)\n              add support for BMP version 5 (more ignored fields)\n      1.38  (2014-06-06)\n              suppress MSVC warnings on integer casts truncating values\n              fix accidental rename of 'skip' field of I/O\n      1.37  (2014-06-04)\n              remove duplicate typedef\n      1.36  (2014-06-03)\n              convert to header file single-file library\n              if de-iphone isn't set, load iphone images color-swapped instead of returning NULL\n      1.35  (2014-05-27)\n              various warnings\n              fix broken STBI_SIMD path\n              fix bug where stbi_load_from_file no longer left file pointer in correct place\n              fix broken non-easy path for 32-bit BMP (possibly never used)\n              TGA optimization by Arseny Kapoulkine\n      1.34  (unknown)\n              use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case\n      1.33  (2011-07-14)\n              make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements\n      1.32  (2011-07-13)\n              support for \"info\" function for all supported filetypes (SpartanJ)\n      1.31  (2011-06-20)\n              a few more leak fixes, bug in PNG handling (SpartanJ)\n      1.30  (2011-06-11)\n              added ability to load files via callbacks to accomidate custom input streams (Ben Wenger)\n              removed deprecated format-specific test/load functions\n              removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway\n              error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha)\n              fix inefficiency in decoding 32-bit BMP (David Woo)\n      1.29  (2010-08-16)\n              various warning fixes from Aurelien Pocheville\n      1.28  (2010-08-01)\n              fix bug in GIF palette transparency (SpartanJ)\n      1.27  (2010-08-01)\n              cast-to-stbi_uc to fix warnings\n      1.26  (2010-07-24)\n              fix bug in file buffering for PNG reported by SpartanJ\n      1.25  (2010-07-17)\n              refix trans_data warning (Won Chun)\n      1.24  (2010-07-12)\n              perf improvements reading from files on platforms with lock-heavy fgetc()\n              minor perf improvements for jpeg\n              deprecated type-specific functions so we'll get feedback if they're needed\n              attempt to fix trans_data warning (Won Chun)\n      1.23    fixed bug in iPhone support\n      1.22  (2010-07-10)\n              removed image *writing* support\n              stbi_info support from Jetro Lauha\n              GIF support from Jean-Marc Lienher\n              iPhone PNG-extensions from James Brown\n              warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva)\n      1.21    fix use of 'stbi_uc' in header (reported by jon blow)\n      1.20    added support for Softimage PIC, by Tom Seddon\n      1.19    bug in interlaced PNG corruption check (found by ryg)\n      1.18  (2008-08-02)\n              fix a threading bug (local mutable static)\n      1.17    support interlaced PNG\n      1.16    major bugfix - stbi__convert_format converted one too many pixels\n      1.15    initialize some fields for thread safety\n      1.14    fix threadsafe conversion bug\n              header-file-only version (#define STBI_HEADER_FILE_ONLY before including)\n      1.13    threadsafe\n      1.12    const qualifiers in the API\n      1.11    Support installable IDCT, colorspace conversion routines\n      1.10    Fixes for 64-bit (don't use \"unsigned long\")\n              optimized upsampling by Fabian \"ryg\" Giesen\n      1.09    Fix format-conversion for PSD code (bad global variables!)\n      1.08    Thatcher Ulrich's PSD code integrated by Nicolas Schulz\n      1.07    attempt to fix C++ warning/errors again\n      1.06    attempt to fix C++ warning/errors again\n      1.05    fix TGA loading to return correct *comp and use good luminance calc\n      1.04    default float alpha is 1, not 255; use 'void *' for stbi_image_free\n      1.03    bugfixes to STBI_NO_STDIO, STBI_NO_HDR\n      1.02    support for (subset of) HDR files, float interface for preferred access to them\n      1.01    fix bug: possible bug in handling right-side up bmps... not sure\n              fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all\n      1.00    interface to zlib that skips zlib header\n      0.99    correct handling of alpha in palette\n      0.98    TGA loader by lonesock; dynamically add loaders (untested)\n      0.97    jpeg errors on too large a file; also catch another malloc failure\n      0.96    fix detection of invalid v value - particleman@mollyrocket forum\n      0.95    during header scan, seek to markers in case of padding\n      0.94    STBI_NO_STDIO to disable stdio usage; rename all #defines the same\n      0.93    handle jpegtran output; verbose errors\n      0.92    read 4,8,16,24,32-bit BMP files of several formats\n      0.91    output 24-bit Windows 3.0 BMP files\n      0.90    fix a few more warnings; bump version number to approach 1.0\n      0.61    bugfixes due to Marc LeBlanc, Christopher Lloyd\n      0.60    fix compiling as c++\n      0.59    fix warnings: merge Dave Moore's -Wall fixes\n      0.58    fix bug: zlib uncompressed mode len/nlen was wrong endian\n      0.57    fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available\n      0.56    fix bug: zlib uncompressed mode len vs. nlen\n      0.55    fix bug: restart_interval not initialized to 0\n      0.54    allow NULL for 'int *comp'\n      0.53    fix bug in png 3->4; speedup png decoding\n      0.52    png handles req_comp=3,4 directly; minor cleanup; jpeg comments\n      0.51    obey req_comp requests, 1-component jpegs return as 1-component,\n              on 'test' only check type, not whether we support this variant\n      0.50  (2006-11-19)\n              first released version\n*/\n\n\n/*\n------------------------------------------------------------------------------\nThis software is available under 2 licenses -- choose whichever you prefer.\n------------------------------------------------------------------------------\nALTERNATIVE A - MIT License\nCopyright (c) 2017 Sean Barrett\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n------------------------------------------------------------------------------\nALTERNATIVE B - Public Domain (www.unlicense.org)\nThis is free and unencumbered software released into the public domain.\nAnyone is free to copy, modify, publish, use, compile, sell, or distribute this\nsoftware, either in source code form or as a compiled binary, for any purpose,\ncommercial or non-commercial, and by any means.\nIn jurisdictions that recognize copyright laws, the author or authors of this\nsoftware dedicate any and all copyright interest in the software to the public\ndomain. We make this dedication for the benefit of the public at large and to\nthe detriment of our heirs and successors. We intend this dedication to be an\novert act of relinquishment in perpetuity of all present and future rights to\nthis software under copyright law.\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\nACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n------------------------------------------------------------------------------\n*/\n"
  },
  {
    "path": "src/libraries/tinyexr/tinyexr.h",
    "content": "/*\nCopyright (c) 2014 - 2019, Syoyo Fujita and many contributors.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of the Syoyo Fujita nor the\n      names of its contributors may be used to endorse or promote products\n      derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n// TinyEXR contains some OpenEXR code, which is licensed under ------------\n\n///////////////////////////////////////////////////////////////////////////\n//\n// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas\n// Digital Ltd. LLC\n//\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n// *       Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// *       Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n// *       Neither the name of Industrial Light & Magic nor the names of\n// its contributors may be used to endorse or promote products derived\n// from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n///////////////////////////////////////////////////////////////////////////\n\n// End of OpenEXR license -------------------------------------------------\n\n#ifndef TINYEXR_H_\n#define TINYEXR_H_\n\n//\n//\n//   Do this:\n//    #define TINYEXR_IMPLEMENTATION\n//   before you include this file in *one* C or C++ file to create the\n//   implementation.\n//\n//   // i.e. it should look like this:\n//   #include ...\n//   #include ...\n//   #include ...\n//   #define TINYEXR_IMPLEMENTATION\n//   #include \"tinyexr.h\"\n//\n//\n\n#include <stddef.h>  // for size_t\n#include <stdint.h>  // guess stdint.h is available(C99)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// Use embedded miniz or not to decode ZIP format pixel. Linking with zlib\n// required if this flas is 0.\n#ifndef TINYEXR_USE_MINIZ\n#define TINYEXR_USE_MINIZ (1)\n#endif\n\n// Disable PIZ comporession when applying cpplint.\n#ifndef TINYEXR_USE_PIZ\n#define TINYEXR_USE_PIZ (1)\n#endif\n\n#ifndef TINYEXR_USE_ZFP\n#define TINYEXR_USE_ZFP (0)  // TinyEXR extension.\n// http://computation.llnl.gov/projects/floating-point-compression\n#endif\n\n#define TINYEXR_SUCCESS (0)\n#define TINYEXR_ERROR_INVALID_MAGIC_NUMBER (-1)\n#define TINYEXR_ERROR_INVALID_EXR_VERSION (-2)\n#define TINYEXR_ERROR_INVALID_ARGUMENT (-3)\n#define TINYEXR_ERROR_INVALID_DATA (-4)\n#define TINYEXR_ERROR_INVALID_FILE (-5)\n#define TINYEXR_ERROR_INVALID_PARAMETER (-5)\n#define TINYEXR_ERROR_CANT_OPEN_FILE (-6)\n#define TINYEXR_ERROR_UNSUPPORTED_FORMAT (-7)\n#define TINYEXR_ERROR_INVALID_HEADER (-8)\n#define TINYEXR_ERROR_UNSUPPORTED_FEATURE (-9)\n#define TINYEXR_ERROR_CANT_WRITE_FILE (-10)\n#define TINYEXR_ERROR_SERIALZATION_FAILED (-11)\n\n// @note { OpenEXR file format: http://www.openexr.com/openexrfilelayout.pdf }\n\n// pixel type: possible values are: UINT = 0 HALF = 1 FLOAT = 2\n#define TINYEXR_PIXELTYPE_UINT (0)\n#define TINYEXR_PIXELTYPE_HALF (1)\n#define TINYEXR_PIXELTYPE_FLOAT (2)\n\n#define TINYEXR_MAX_HEADER_ATTRIBUTES (1024)\n#define TINYEXR_MAX_CUSTOM_ATTRIBUTES (128)\n\n#define TINYEXR_COMPRESSIONTYPE_NONE (0)\n#define TINYEXR_COMPRESSIONTYPE_RLE (1)\n#define TINYEXR_COMPRESSIONTYPE_ZIPS (2)\n#define TINYEXR_COMPRESSIONTYPE_ZIP (3)\n#define TINYEXR_COMPRESSIONTYPE_PIZ (4)\n#define TINYEXR_COMPRESSIONTYPE_ZFP (128)  // TinyEXR extension\n\n#define TINYEXR_ZFP_COMPRESSIONTYPE_RATE (0)\n#define TINYEXR_ZFP_COMPRESSIONTYPE_PRECISION (1)\n#define TINYEXR_ZFP_COMPRESSIONTYPE_ACCURACY (2)\n\n#define TINYEXR_TILE_ONE_LEVEL (0)\n#define TINYEXR_TILE_MIPMAP_LEVELS (1)\n#define TINYEXR_TILE_RIPMAP_LEVELS (2)\n\n#define TINYEXR_TILE_ROUND_DOWN (0)\n#define TINYEXR_TILE_ROUND_UP (1)\n\ntypedef struct _EXRVersion {\n  int version;    // this must be 2\n  int tiled;      // tile format image\n  int long_name;  // long name attribute\n  int non_image;  // deep image(EXR 2.0)\n  int multipart;  // multi-part(EXR 2.0)\n} EXRVersion;\n\ntypedef struct _EXRAttribute {\n  char name[256];  // name and type are up to 255 chars long.\n  char type[256];\n  unsigned char *value;  // uint8_t*\n  int size;\n  int pad0;\n} EXRAttribute;\n\ntypedef struct _EXRChannelInfo {\n  char name[256];  // less than 255 bytes long\n  int pixel_type;\n  int x_sampling;\n  int y_sampling;\n  unsigned char p_linear;\n  unsigned char pad[3];\n} EXRChannelInfo;\n\ntypedef struct _EXRTile {\n  int offset_x;\n  int offset_y;\n  int level_x;\n  int level_y;\n\n  int width;   // actual width in a tile.\n  int height;  // actual height int a tile.\n\n  unsigned char **images;  // image[channels][pixels]\n} EXRTile;\n\ntypedef struct _EXRHeader {\n  float pixel_aspect_ratio;\n  int line_order;\n  int data_window[4];\n  int display_window[4];\n  float screen_window_center[2];\n  float screen_window_width;\n\n  int chunk_count;\n\n  // Properties for tiled format(`tiledesc`).\n  int tiled;\n  int tile_size_x;\n  int tile_size_y;\n  int tile_level_mode;\n  int tile_rounding_mode;\n\n  int long_name;\n  int non_image;\n  int multipart;\n  unsigned int header_len;\n\n  // Custom attributes(exludes required attributes(e.g. `channels`,\n  // `compression`, etc)\n  int num_custom_attributes;\n  EXRAttribute *custom_attributes;  // array of EXRAttribute. size =\n                                    // `num_custom_attributes`.\n\n  EXRChannelInfo *channels;  // [num_channels]\n\n  int *pixel_types;  // Loaded pixel type(TINYEXR_PIXELTYPE_*) of `images` for\n  // each channel. This is overwritten with `requested_pixel_types` when\n  // loading.\n  int num_channels;\n\n  int compression_type;        // compression type(TINYEXR_COMPRESSIONTYPE_*)\n  int *requested_pixel_types;  // Filled initially by\n                               // ParseEXRHeaderFrom(Meomory|File), then users\n                               // can edit it(only valid for HALF pixel type\n                               // channel)\n\n} EXRHeader;\n\ntypedef struct _EXRMultiPartHeader {\n  int num_headers;\n  EXRHeader *headers;\n\n} EXRMultiPartHeader;\n\ntypedef struct _EXRImage {\n  EXRTile *tiles;  // Tiled pixel data. The application must reconstruct image\n                   // from tiles manually. NULL if scanline format.\n  unsigned char **images;  // image[channels][pixels]. NULL if tiled format.\n\n  int width;\n  int height;\n  int num_channels;\n\n  // Properties for tile format.\n  int num_tiles;\n\n} EXRImage;\n\ntypedef struct _EXRMultiPartImage {\n  int num_images;\n  EXRImage *images;\n\n} EXRMultiPartImage;\n\ntypedef struct _DeepImage {\n  const char **channel_names;\n  float ***image;      // image[channels][scanlines][samples]\n  int **offset_table;  // offset_table[scanline][offsets]\n  int num_channels;\n  int width;\n  int height;\n  int pad0;\n} DeepImage;\n\n// @deprecated { to be removed. }\n// Loads single-frame OpenEXR image. Assume EXR image contains A(single channel\n// alpha) or RGB(A) channels.\n// Application must free image data as returned by `out_rgba`\n// Result image format is: float x RGBA x width x hight\n// Returns negative value and may set error string in `err` when there's an\n// error\nextern int LoadEXR(float **out_rgba, int *width, int *height,\n                   const char *filename, const char **err);\n\n// @deprecated { to be removed. }\n// Simple wrapper API for ParseEXRHeaderFromFile.\n// checking given file is a EXR file(by just look up header)\n// @return TINYEXR_SUCCEES for EXR image, TINYEXR_ERROR_INVALID_HEADER for\n// others\nextern int IsEXR(const char *filename);\n\n// @deprecated { to be removed. }\n// Saves single-frame OpenEXR image. Assume EXR image contains RGB(A) channels.\n// components must be 1(Grayscale), 3(RGB) or 4(RGBA).\n// Input image format is: `float x width x height`, or `float x RGB(A) x width x\n// hight`\n// Save image as fp16(HALF) format when `save_as_fp16` is positive non-zero\n// value.\n// Save image as fp32(FLOAT) format when `save_as_fp16` is 0.\n// Use ZIP compression by default.\n// Returns negative value and may set error string in `err` when there's an\n// error\nextern int SaveEXR(const float *data, const int width, const int height,\n                   const int components, const int save_as_fp16,\n                   const char *filename, const char **err);\n\n// Initialize EXRHeader struct\nextern void InitEXRHeader(EXRHeader *exr_header);\n\n// Initialize EXRImage struct\nextern void InitEXRImage(EXRImage *exr_image);\n\n// Free's internal data of EXRHeader struct\nextern int FreeEXRHeader(EXRHeader *exr_header);\n\n// Free's internal data of EXRImage struct\nextern int FreeEXRImage(EXRImage *exr_image);\n\n// Free's error message\nextern void FreeEXRErrorMessage(const char *msg);\n\n// Parse EXR version header of a file.\nextern int ParseEXRVersionFromFile(EXRVersion *version, const char *filename);\n\n// Parse EXR version header from memory-mapped EXR data.\nextern int ParseEXRVersionFromMemory(EXRVersion *version,\n                                     const unsigned char *memory, size_t size);\n\n// Parse single-part OpenEXR header from a file and initialize `EXRHeader`.\n// When there was an error message, Application must free `err` with\n// FreeEXRErrorMessage()\nextern int ParseEXRHeaderFromFile(EXRHeader *header, const EXRVersion *version,\n                                  const char *filename, const char **err);\n\n// Parse single-part OpenEXR header from a memory and initialize `EXRHeader`.\n// When there was an error message, Application must free `err` with\n// FreeEXRErrorMessage()\nextern int ParseEXRHeaderFromMemory(EXRHeader *header,\n                                    const EXRVersion *version,\n                                    const unsigned char *memory, size_t size,\n                                    const char **err);\n\n// Parse multi-part OpenEXR headers from a file and initialize `EXRHeader*`\n// array.\n// When there was an error message, Application must free `err` with\n// FreeEXRErrorMessage()\nextern int ParseEXRMultipartHeaderFromFile(EXRHeader ***headers,\n                                           int *num_headers,\n                                           const EXRVersion *version,\n                                           const char *filename,\n                                           const char **err);\n\n// Parse multi-part OpenEXR headers from a memory and initialize `EXRHeader*`\n// array\n// When there was an error message, Application must free `err` with\n// FreeEXRErrorMessage()\nextern int ParseEXRMultipartHeaderFromMemory(EXRHeader ***headers,\n                                             int *num_headers,\n                                             const EXRVersion *version,\n                                             const unsigned char *memory,\n                                             size_t size, const char **err);\n\n// Loads single-part OpenEXR image from a file.\n// Application must setup `ParseEXRHeaderFromFile` before calling this function.\n// Application can free EXRImage using `FreeEXRImage`\n// Returns negative value and may set error string in `err` when there's an\n// error\n// When there was an error message, Application must free `err` with\n// FreeEXRErrorMessage()\nextern int LoadEXRImageFromFile(EXRImage *image, const EXRHeader *header,\n                                const char *filename, const char **err);\n\n// Loads single-part OpenEXR image from a memory.\n// Application must setup `EXRHeader` with\n// `ParseEXRHeaderFromMemory` before calling this function.\n// Application can free EXRImage using `FreeEXRImage`\n// Returns negative value and may set error string in `err` when there's an\n// error\n// When there was an error message, Application must free `err` with\n// FreeEXRErrorMessage()\nextern int LoadEXRImageFromMemory(EXRImage *image, const EXRHeader *header,\n                                  const unsigned char *memory,\n                                  const size_t size, const char **err);\n\n// Loads multi-part OpenEXR image from a file.\n// Application must setup `ParseEXRMultipartHeaderFromFile` before calling this\n// function.\n// Application can free EXRImage using `FreeEXRImage`\n// Returns negative value and may set error string in `err` when there's an\n// error\n// When there was an error message, Application must free `err` with\n// FreeEXRErrorMessage()\nextern int LoadEXRMultipartImageFromFile(EXRImage *images,\n                                         const EXRHeader **headers,\n                                         unsigned int num_parts,\n                                         const char *filename,\n                                         const char **err);\n\n// Loads multi-part OpenEXR image from a memory.\n// Application must setup `EXRHeader*` array with\n// `ParseEXRMultipartHeaderFromMemory` before calling this function.\n// Application can free EXRImage using `FreeEXRImage`\n// Returns negative value and may set error string in `err` when there's an\n// error\n// When there was an error message, Application must free `err` with\n// FreeEXRErrorMessage()\nextern int LoadEXRMultipartImageFromMemory(EXRImage *images,\n                                           const EXRHeader **headers,\n                                           unsigned int num_parts,\n                                           const unsigned char *memory,\n                                           const size_t size, const char **err);\n\n// Saves multi-channel, single-frame OpenEXR image to a file.\n// Returns negative value and may set error string in `err` when there's an\n// error\n// When there was an error message, Application must free `err` with\n// FreeEXRErrorMessage()\nextern int SaveEXRImageToFile(const EXRImage *image,\n                              const EXRHeader *exr_header, const char *filename,\n                              const char **err);\n\n// Saves multi-channel, single-frame OpenEXR image to a memory.\n// Image is compressed using EXRImage.compression value.\n// Return the number of bytes if success.\n// Return zero and will set error string in `err` when there's an\n// error.\n// When there was an error message, Application must free `err` with\n// FreeEXRErrorMessage()\nextern size_t SaveEXRImageToMemory(const EXRImage *image,\n                                   const EXRHeader *exr_header,\n                                   unsigned char **memory, const char **err);\n\n// Loads single-frame OpenEXR deep image.\n// Application must free memory of variables in DeepImage(image, offset_table)\n// Returns negative value and may set error string in `err` when there's an\n// error\n// When there was an error message, Application must free `err` with\n// FreeEXRErrorMessage()\nextern int LoadDeepEXR(DeepImage *out_image, const char *filename,\n                       const char **err);\n\n// NOT YET IMPLEMENTED:\n// Saves single-frame OpenEXR deep image.\n// Returns negative value and may set error string in `err` when there's an\n// error\n// extern int SaveDeepEXR(const DeepImage *in_image, const char *filename,\n//                       const char **err);\n\n// NOT YET IMPLEMENTED:\n// Loads multi-part OpenEXR deep image.\n// Application must free memory of variables in DeepImage(image, offset_table)\n// extern int LoadMultiPartDeepEXR(DeepImage **out_image, int num_parts, const\n// char *filename,\n//                       const char **err);\n\n// For emscripten.\n// Loads single-frame OpenEXR image from memory. Assume EXR image contains\n// RGB(A) channels.\n// Returns negative value and may set error string in `err` when there's an\n// error\n// When there was an error message, Application must free `err` with\n// FreeEXRErrorMessage()\nextern int LoadEXRFromMemory(float **out_rgba, int *width, int *height,\n                             const unsigned char *memory, size_t size,\n                             const char **err);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif  // TINYEXR_H_\n\n#ifdef TINYEXR_IMPLEMENTATION\n#ifndef TINYEXR_IMPLEMENTATION_DEIFNED\n#define TINYEXR_IMPLEMENTATION_DEIFNED\n\n#include <algorithm>\n#include <cassert>\n#include <cstdio>\n#include <cstdlib>\n#include <cstring>\n#include <sstream>\n\n// #include <iostream> // debug\n\n#include <limits>\n#include <string>\n#include <vector>\n\n#if __cplusplus > 199711L\n// C++11\n#include <cstdint>\n#endif  // __cplusplus > 199711L\n\n#ifdef _OPENMP\n#include <omp.h>\n#endif\n\n#if TINYEXR_USE_MINIZ\n#else\n//  Issue #46. Please include your own zlib-compatible API header before\n//  including `tinyexr.h`\n//#include \"zlib.h\"\n#endif\n\n#if TINYEXR_USE_ZFP\n#include \"zfp.h\"\n#endif\n\nnamespace tinyexr {\n\n#if __cplusplus > 199711L\n// C++11\ntypedef uint64_t tinyexr_uint64;\ntypedef int64_t tinyexr_int64;\n#else\n// Although `long long` is not a standard type pre C++11, assume it is defined\n// as a compiler's extension.\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wc++11-long-long\"\n#endif\ntypedef unsigned long long tinyexr_uint64;\ntypedef long long tinyexr_int64;\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n#endif\n\n#if TINYEXR_USE_MINIZ\n\nnamespace miniz {\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wc++11-long-long\"\n#pragma clang diagnostic ignored \"-Wold-style-cast\"\n#pragma clang diagnostic ignored \"-Wpadded\"\n#pragma clang diagnostic ignored \"-Wsign-conversion\"\n#pragma clang diagnostic ignored \"-Wc++11-extensions\"\n#pragma clang diagnostic ignored \"-Wconversion\"\n#pragma clang diagnostic ignored \"-Wunused-function\"\n#pragma clang diagnostic ignored \"-Wc++98-compat-pedantic\"\n#pragma clang diagnostic ignored \"-Wundef\"\n\n#if __has_warning(\"-Wcomma\")\n#pragma clang diagnostic ignored \"-Wcomma\"\n#endif\n\n#if __has_warning(\"-Wmacro-redefined\")\n#pragma clang diagnostic ignored \"-Wmacro-redefined\"\n#endif\n\n#if __has_warning(\"-Wcast-qual\")\n#pragma clang diagnostic ignored \"-Wcast-qual\"\n#endif\n\n#if __has_warning(\"-Wzero-as-null-pointer-constant\")\n#pragma clang diagnostic ignored \"-Wzero-as-null-pointer-constant\"\n#endif\n\n#if __has_warning(\"-Wtautological-constant-compare\")\n#pragma clang diagnostic ignored \"-Wtautological-constant-compare\"\n#endif\n\n#endif\n\n/* miniz.c v1.15 - public domain deflate/inflate, zlib-subset, ZIP\n   reading/writing/appending, PNG writing\n   See \"unlicense\" statement at the end of this file.\n   Rich Geldreich <richgel99@gmail.com>, last updated Oct. 13, 2013\n   Implements RFC 1950: http://www.ietf.org/rfc/rfc1950.txt and RFC 1951:\n   http://www.ietf.org/rfc/rfc1951.txt\n\n   Most API's defined in miniz.c are optional. For example, to disable the\n   archive related functions just define\n   MINIZ_NO_ARCHIVE_APIS, or to get rid of all stdio usage define MINIZ_NO_STDIO\n   (see the list below for more macros).\n\n   * Change History\n     10/13/13 v1.15 r4 - Interim bugfix release while I work on the next major\n   release with Zip64 support (almost there!):\n       - Critical fix for the MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY bug\n   (thanks kahmyong.moon@hp.com) which could cause locate files to not find\n   files. This bug\n        would only have occured in earlier versions if you explicitly used this\n   flag, OR if you used mz_zip_extract_archive_file_to_heap() or\n   mz_zip_add_mem_to_archive_file_in_place()\n        (which used this flag). If you can't switch to v1.15 but want to fix\n   this bug, just remove the uses of this flag from both helper funcs (and of\n   course don't use the flag).\n       - Bugfix in mz_zip_reader_extract_to_mem_no_alloc() from kymoon when\n   pUser_read_buf is not NULL and compressed size is > uncompressed size\n       - Fixing mz_zip_reader_extract_*() funcs so they don't try to extract\n   compressed data from directory entries, to account for weird zipfiles which\n   contain zero-size compressed data on dir entries.\n         Hopefully this fix won't cause any issues on weird zip archives,\n   because it assumes the low 16-bits of zip external attributes are DOS\n   attributes (which I believe they always are in practice).\n       - Fixing mz_zip_reader_is_file_a_directory() so it doesn't check the\n   internal attributes, just the filename and external attributes\n       - mz_zip_reader_init_file() - missing MZ_FCLOSE() call if the seek failed\n       - Added cmake support for Linux builds which builds all the examples,\n   tested with clang v3.3 and gcc v4.6.\n       - Clang fix for tdefl_write_image_to_png_file_in_memory() from toffaletti\n       - Merged MZ_FORCEINLINE fix from hdeanclark\n       - Fix <time.h> include before config #ifdef, thanks emil.brink\n       - Added tdefl_write_image_to_png_file_in_memory_ex(): supports Y flipping\n   (super useful for OpenGL apps), and explicit control over the compression\n   level (so you can\n        set it to 1 for real-time compression).\n       - Merged in some compiler fixes from paulharris's github repro.\n       - Retested this build under Windows (VS 2010, including static analysis),\n   tcc  0.9.26, gcc v4.6 and clang v3.3.\n       - Added example6.c, which dumps an image of the mandelbrot set to a PNG\n   file.\n       - Modified example2 to help test the\n   MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY flag more.\n       - In r3: Bugfix to mz_zip_writer_add_file() found during merge: Fix\n   possible src file fclose() leak if alignment bytes+local header file write\n   faiiled\n                 - In r4: Minor bugfix to mz_zip_writer_add_from_zip_reader():\n   Was pushing the wrong central dir header offset, appears harmless in this\n   release, but it became a problem in the zip64 branch\n     5/20/12 v1.14 - MinGW32/64 GCC 4.6.1 compiler fixes: added MZ_FORCEINLINE,\n   #include <time.h> (thanks fermtect).\n     5/19/12 v1.13 - From jason@cornsyrup.org and kelwert@mtu.edu - Fix\n   mz_crc32() so it doesn't compute the wrong CRC-32's when mz_ulong is 64-bit.\n       - Temporarily/locally slammed in \"typedef unsigned long mz_ulong\" and\n   re-ran a randomized regression test on ~500k files.\n       - Eliminated a bunch of warnings when compiling with GCC 32-bit/64.\n       - Ran all examples, miniz.c, and tinfl.c through MSVC 2008's /analyze\n   (static analysis) option and fixed all warnings (except for the silly\n        \"Use of the comma-operator in a tested expression..\" analysis warning,\n   which I purposely use to work around a MSVC compiler warning).\n       - Created 32-bit and 64-bit Codeblocks projects/workspace. Built and\n   tested Linux executables. The codeblocks workspace is compatible with\n   Linux+Win32/x64.\n       - Added miniz_tester solution/project, which is a useful little app\n   derived from LZHAM's tester app that I use as part of the regression test.\n       - Ran miniz.c and tinfl.c through another series of regression testing on\n   ~500,000 files and archives.\n       - Modified example5.c so it purposely disables a bunch of high-level\n   functionality (MINIZ_NO_STDIO, etc.). (Thanks to corysama for the\n   MINIZ_NO_STDIO bug report.)\n       - Fix ftell() usage in examples so they exit with an error on files which\n   are too large (a limitation of the examples, not miniz itself).\n     4/12/12 v1.12 - More comments, added low-level example5.c, fixed a couple\n   minor level_and_flags issues in the archive API's.\n      level_and_flags can now be set to MZ_DEFAULT_COMPRESSION. Thanks to Bruce\n   Dawson <bruced@valvesoftware.com> for the feedback/bug report.\n     5/28/11 v1.11 - Added statement from unlicense.org\n     5/27/11 v1.10 - Substantial compressor optimizations:\n      - Level 1 is now ~4x faster than before. The L1 compressor's throughput\n   now varies between 70-110MB/sec. on a\n      - Core i7 (actual throughput varies depending on the type of data, and x64\n   vs. x86).\n      - Improved baseline L2-L9 compression perf. Also, greatly improved\n   compression perf. issues on some file types.\n      - Refactored the compression code for better readability and\n   maintainability.\n      - Added level 10 compression level (L10 has slightly better ratio than\n   level 9, but could have a potentially large\n       drop in throughput on some files).\n     5/15/11 v1.09 - Initial stable release.\n\n   * Low-level Deflate/Inflate implementation notes:\n\n     Compression: Use the \"tdefl\" API's. The compressor supports raw, static,\n   and dynamic blocks, lazy or\n     greedy parsing, match length filtering, RLE-only, and Huffman-only streams.\n   It performs and compresses\n     approximately as well as zlib.\n\n     Decompression: Use the \"tinfl\" API's. The entire decompressor is\n   implemented as a single function\n     coroutine: see tinfl_decompress(). It supports decompression into a 32KB\n   (or larger power of 2) wrapping buffer, or into a memory\n     block large enough to hold the entire file.\n\n     The low-level tdefl/tinfl API's do not make any use of dynamic memory\n   allocation.\n\n   * zlib-style API notes:\n\n     miniz.c implements a fairly large subset of zlib. There's enough\n   functionality present for it to be a drop-in\n     zlib replacement in many apps:\n        The z_stream struct, optional memory allocation callbacks\n        deflateInit/deflateInit2/deflate/deflateReset/deflateEnd/deflateBound\n        inflateInit/inflateInit2/inflate/inflateEnd\n        compress, compress2, compressBound, uncompress\n        CRC-32, Adler-32 - Using modern, minimal code size, CPU cache friendly\n   routines.\n        Supports raw deflate streams or standard zlib streams with adler-32\n   checking.\n\n     Limitations:\n      The callback API's are not implemented yet. No support for gzip headers or\n   zlib static dictionaries.\n      I've tried to closely emulate zlib's various flavors of stream flushing\n   and return status codes, but\n      there are no guarantees that miniz.c pulls this off perfectly.\n\n   * PNG writing: See the tdefl_write_image_to_png_file_in_memory() function,\n   originally written by\n     Alex Evans. Supports 1-4 bytes/pixel images.\n\n   * ZIP archive API notes:\n\n     The ZIP archive API's where designed with simplicity and efficiency in\n   mind, with just enough abstraction to\n     get the job done with minimal fuss. There are simple API's to retrieve file\n   information, read files from\n     existing archives, create new archives, append new files to existing\n   archives, or clone archive data from\n     one archive to another. It supports archives located in memory or the heap,\n   on disk (using stdio.h),\n     or you can specify custom file read/write callbacks.\n\n     - Archive reading: Just call this function to read a single file from a\n   disk archive:\n\n      void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const\n   char *pArchive_name,\n        size_t *pSize, mz_uint zip_flags);\n\n     For more complex cases, use the \"mz_zip_reader\" functions. Upon opening an\n   archive, the entire central\n     directory is located and read as-is into memory, and subsequent file access\n   only occurs when reading individual files.\n\n     - Archives file scanning: The simple way is to use this function to scan a\n   loaded archive for a specific file:\n\n     int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName,\n   const char *pComment, mz_uint flags);\n\n     The locate operation can optionally check file comments too, which (as one\n   example) can be used to identify\n     multiple versions of the same file in an archive. This function uses a\n   simple linear search through the central\n     directory, so it's not very fast.\n\n     Alternately, you can iterate through all the files in an archive (using\n   mz_zip_reader_get_num_files()) and\n     retrieve detailed info on each file by calling mz_zip_reader_file_stat().\n\n     - Archive creation: Use the \"mz_zip_writer\" functions. The ZIP writer\n   immediately writes compressed file data\n     to disk and builds an exact image of the central directory in memory. The\n   central directory image is written\n     all at once at the end of the archive file when the archive is finalized.\n\n     The archive writer can optionally align each file's local header and file\n   data to any power of 2 alignment,\n     which can be useful when the archive will be read from optical media. Also,\n   the writer supports placing\n     arbitrary data blobs at the very beginning of ZIP archives. Archives\n   written using either feature are still\n     readable by any ZIP tool.\n\n     - Archive appending: The simple way to add a single file to an archive is\n   to call this function:\n\n      mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename,\n   const char *pArchive_name,\n        const void *pBuf, size_t buf_size, const void *pComment, mz_uint16\n   comment_size, mz_uint level_and_flags);\n\n     The archive will be created if it doesn't already exist, otherwise it'll be\n   appended to.\n     Note the appending is done in-place and is not an atomic operation, so if\n   something goes wrong\n     during the operation it's possible the archive could be left without a\n   central directory (although the local\n     file headers and file data will be fine, so the archive will be\n   recoverable).\n\n     For more complex archive modification scenarios:\n     1. The safest way is to use a mz_zip_reader to read the existing archive,\n   cloning only those bits you want to\n     preserve into a new archive using using the\n   mz_zip_writer_add_from_zip_reader() function (which compiles the\n     compressed file data as-is). When you're done, delete the old archive and\n   rename the newly written archive, and\n     you're done. This is safe but requires a bunch of temporary disk space or\n   heap memory.\n\n     2. Or, you can convert an mz_zip_reader in-place to an mz_zip_writer using\n   mz_zip_writer_init_from_reader(),\n     append new files as needed, then finalize the archive which will write an\n   updated central directory to the\n     original archive. (This is basically what\n   mz_zip_add_mem_to_archive_file_in_place() does.) There's a\n     possibility that the archive's central directory could be lost with this\n   method if anything goes wrong, though.\n\n     - ZIP archive support limitations:\n     No zip64 or spanning support. Extraction functions can only handle\n   unencrypted, stored or deflated files.\n     Requires streams capable of seeking.\n\n   * This is a header file library, like stb_image.c. To get only a header file,\n   either cut and paste the\n     below header, or create miniz.h, #define MINIZ_HEADER_FILE_ONLY, and then\n   include miniz.c from it.\n\n   * Important: For best perf. be sure to customize the below macros for your\n   target platform:\n     #define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1\n     #define MINIZ_LITTLE_ENDIAN 1\n     #define MINIZ_HAS_64BIT_REGISTERS 1\n\n   * On platforms using glibc, Be sure to \"#define _LARGEFILE64_SOURCE 1\" before\n   including miniz.c to ensure miniz\n     uses the 64-bit variants: fopen64(), stat64(), etc. Otherwise you won't be\n   able to process large files\n     (i.e. 32-bit stat() fails for me on files > 0x7FFFFFFF bytes).\n*/\n\n#ifndef MINIZ_HEADER_INCLUDED\n#define MINIZ_HEADER_INCLUDED\n\n//#include <stdlib.h>\n\n// Defines to completely disable specific portions of miniz.c:\n// If all macros here are defined the only functionality remaining will be\n// CRC-32, adler-32, tinfl, and tdefl.\n\n// Define MINIZ_NO_STDIO to disable all usage and any functions which rely on\n// stdio for file I/O.\n//#define MINIZ_NO_STDIO\n\n// If MINIZ_NO_TIME is specified then the ZIP archive functions will not be able\n// to get the current time, or\n// get/set file times, and the C run-time funcs that get/set times won't be\n// called.\n// The current downside is the times written to your archives will be from 1979.\n#define MINIZ_NO_TIME\n\n// Define MINIZ_NO_ARCHIVE_APIS to disable all ZIP archive API's.\n#define MINIZ_NO_ARCHIVE_APIS\n\n// Define MINIZ_NO_ARCHIVE_APIS to disable all writing related ZIP archive\n// API's.\n//#define MINIZ_NO_ARCHIVE_WRITING_APIS\n\n// Define MINIZ_NO_ZLIB_APIS to remove all ZLIB-style compression/decompression\n// API's.\n//#define MINIZ_NO_ZLIB_APIS\n\n// Define MINIZ_NO_ZLIB_COMPATIBLE_NAME to disable zlib names, to prevent\n// conflicts against stock zlib.\n//#define MINIZ_NO_ZLIB_COMPATIBLE_NAMES\n\n// Define MINIZ_NO_MALLOC to disable all calls to malloc, free, and realloc.\n// Note if MINIZ_NO_MALLOC is defined then the user must always provide custom\n// user alloc/free/realloc\n// callbacks to the zlib and archive API's, and a few stand-alone helper API's\n// which don't provide custom user\n// functions (such as tdefl_compress_mem_to_heap() and\n// tinfl_decompress_mem_to_heap()) won't work.\n//#define MINIZ_NO_MALLOC\n\n#if defined(__TINYC__) && (defined(__linux) || defined(__linux__))\n// TODO: Work around \"error: include file 'sys\\utime.h' when compiling with tcc\n// on Linux\n#define MINIZ_NO_TIME\n#endif\n\n#if !defined(MINIZ_NO_TIME) && !defined(MINIZ_NO_ARCHIVE_APIS)\n//#include <time.h>\n#endif\n\n#if defined(_M_IX86) || defined(_M_X64) || defined(__i386__) || \\\n    defined(__i386) || defined(__i486__) || defined(__i486) ||  \\\n    defined(i386) || defined(__ia64__) || defined(__x86_64__)\n// MINIZ_X86_OR_X64_CPU is only used to help set the below macros.\n#define MINIZ_X86_OR_X64_CPU 1\n#endif\n\n#if defined(__sparcv9)\n// Big endian\n#else\n#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || MINIZ_X86_OR_X64_CPU\n// Set MINIZ_LITTLE_ENDIAN to 1 if the processor is little endian.\n#define MINIZ_LITTLE_ENDIAN 1\n#endif\n#endif\n\n#if MINIZ_X86_OR_X64_CPU\n// Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES to 1 on CPU's that permit efficient\n// integer loads and stores from unaligned addresses.\n//#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1\n#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES \\\n  0  // disable to suppress compiler warnings\n#endif\n\n#if defined(_M_X64) || defined(_WIN64) || defined(__MINGW64__) || \\\n    defined(_LP64) || defined(__LP64__) || defined(__ia64__) ||   \\\n    defined(__x86_64__)\n// Set MINIZ_HAS_64BIT_REGISTERS to 1 if operations on 64-bit integers are\n// reasonably fast (and don't involve compiler generated calls to helper\n// functions).\n#define MINIZ_HAS_64BIT_REGISTERS 1\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// ------------------- zlib-style API Definitions.\n\n// For more compatibility with zlib, miniz.c uses unsigned long for some\n// parameters/struct members. Beware: mz_ulong can be either 32 or 64-bits!\ntypedef unsigned long mz_ulong;\n\n// mz_free() internally uses the MZ_FREE() macro (which by default calls free()\n// unless you've modified the MZ_MALLOC macro) to release a block allocated from\n// the heap.\nvoid mz_free(void *p);\n\n#define MZ_ADLER32_INIT (1)\n// mz_adler32() returns the initial adler-32 value to use when called with\n// ptr==NULL.\nmz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len);\n\n#define MZ_CRC32_INIT (0)\n// mz_crc32() returns the initial CRC-32 value to use when called with\n// ptr==NULL.\nmz_ulong mz_crc32(mz_ulong crc, const unsigned char *ptr, size_t buf_len);\n\n// Compression strategies.\nenum {\n  MZ_DEFAULT_STRATEGY = 0,\n  MZ_FILTERED = 1,\n  MZ_HUFFMAN_ONLY = 2,\n  MZ_RLE = 3,\n  MZ_FIXED = 4\n};\n\n// Method\n#define MZ_DEFLATED 8\n\n#ifndef MINIZ_NO_ZLIB_APIS\n\n// Heap allocation callbacks.\n// Note that mz_alloc_func parameter types purpsosely differ from zlib's:\n// items/size is size_t, not unsigned long.\ntypedef void *(*mz_alloc_func)(void *opaque, size_t items, size_t size);\ntypedef void (*mz_free_func)(void *opaque, void *address);\ntypedef void *(*mz_realloc_func)(void *opaque, void *address, size_t items,\n                                 size_t size);\n\n#define MZ_VERSION \"9.1.15\"\n#define MZ_VERNUM 0x91F0\n#define MZ_VER_MAJOR 9\n#define MZ_VER_MINOR 1\n#define MZ_VER_REVISION 15\n#define MZ_VER_SUBREVISION 0\n\n// Flush values. For typical usage you only need MZ_NO_FLUSH and MZ_FINISH. The\n// other values are for advanced use (refer to the zlib docs).\nenum {\n  MZ_NO_FLUSH = 0,\n  MZ_PARTIAL_FLUSH = 1,\n  MZ_SYNC_FLUSH = 2,\n  MZ_FULL_FLUSH = 3,\n  MZ_FINISH = 4,\n  MZ_BLOCK = 5\n};\n\n// Return status codes. MZ_PARAM_ERROR is non-standard.\nenum {\n  MZ_OK = 0,\n  MZ_STREAM_END = 1,\n  MZ_NEED_DICT = 2,\n  MZ_ERRNO = -1,\n  MZ_STREAM_ERROR = -2,\n  MZ_DATA_ERROR = -3,\n  MZ_MEM_ERROR = -4,\n  MZ_BUF_ERROR = -5,\n  MZ_VERSION_ERROR = -6,\n  MZ_PARAM_ERROR = -10000\n};\n\n// Compression levels: 0-9 are the standard zlib-style levels, 10 is best\n// possible compression (not zlib compatible, and may be very slow),\n// MZ_DEFAULT_COMPRESSION=MZ_DEFAULT_LEVEL.\nenum {\n  MZ_NO_COMPRESSION = 0,\n  MZ_BEST_SPEED = 1,\n  MZ_BEST_COMPRESSION = 9,\n  MZ_UBER_COMPRESSION = 10,\n  MZ_DEFAULT_LEVEL = 6,\n  MZ_DEFAULT_COMPRESSION = -1\n};\n\n// Window bits\n#define MZ_DEFAULT_WINDOW_BITS 15\n\nstruct mz_internal_state;\n\n// Compression/decompression stream struct.\ntypedef struct mz_stream_s {\n  const unsigned char *next_in;  // pointer to next byte to read\n  unsigned int avail_in;         // number of bytes available at next_in\n  mz_ulong total_in;             // total number of bytes consumed so far\n\n  unsigned char *next_out;  // pointer to next byte to write\n  unsigned int avail_out;   // number of bytes that can be written to next_out\n  mz_ulong total_out;       // total number of bytes produced so far\n\n  char *msg;                        // error msg (unused)\n  struct mz_internal_state *state;  // internal state, allocated by zalloc/zfree\n\n  mz_alloc_func\n      zalloc;          // optional heap allocation function (defaults to malloc)\n  mz_free_func zfree;  // optional heap free function (defaults to free)\n  void *opaque;        // heap alloc function user pointer\n\n  int data_type;      // data_type (unused)\n  mz_ulong adler;     // adler32 of the source or uncompressed data\n  mz_ulong reserved;  // not used\n} mz_stream;\n\ntypedef mz_stream *mz_streamp;\n\n// Returns the version string of miniz.c.\nconst char *mz_version(void);\n\n// mz_deflateInit() initializes a compressor with default options:\n// Parameters:\n//  pStream must point to an initialized mz_stream struct.\n//  level must be between [MZ_NO_COMPRESSION, MZ_BEST_COMPRESSION].\n//  level 1 enables a specially optimized compression function that's been\n//  optimized purely for performance, not ratio.\n//  (This special func. is currently only enabled when\n//  MINIZ_USE_UNALIGNED_LOADS_AND_STORES and MINIZ_LITTLE_ENDIAN are defined.)\n// Return values:\n//  MZ_OK on success.\n//  MZ_STREAM_ERROR if the stream is bogus.\n//  MZ_PARAM_ERROR if the input parameters are bogus.\n//  MZ_MEM_ERROR on out of memory.\nint mz_deflateInit(mz_streamp pStream, int level);\n\n// mz_deflateInit2() is like mz_deflate(), except with more control:\n// Additional parameters:\n//   method must be MZ_DEFLATED\n//   window_bits must be MZ_DEFAULT_WINDOW_BITS (to wrap the deflate stream with\n//   zlib header/adler-32 footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate/no\n//   header or footer)\n//   mem_level must be between [1, 9] (it's checked but ignored by miniz.c)\nint mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits,\n                    int mem_level, int strategy);\n\n// Quickly resets a compressor without having to reallocate anything. Same as\n// calling mz_deflateEnd() followed by mz_deflateInit()/mz_deflateInit2().\nint mz_deflateReset(mz_streamp pStream);\n\n// mz_deflate() compresses the input to output, consuming as much of the input\n// and producing as much output as possible.\n// Parameters:\n//   pStream is the stream to read from and write to. You must initialize/update\n//   the next_in, avail_in, next_out, and avail_out members.\n//   flush may be MZ_NO_FLUSH, MZ_PARTIAL_FLUSH/MZ_SYNC_FLUSH, MZ_FULL_FLUSH, or\n//   MZ_FINISH.\n// Return values:\n//   MZ_OK on success (when flushing, or if more input is needed but not\n//   available, and/or there's more output to be written but the output buffer\n//   is full).\n//   MZ_STREAM_END if all input has been consumed and all output bytes have been\n//   written. Don't call mz_deflate() on the stream anymore.\n//   MZ_STREAM_ERROR if the stream is bogus.\n//   MZ_PARAM_ERROR if one of the parameters is invalid.\n//   MZ_BUF_ERROR if no forward progress is possible because the input and/or\n//   output buffers are empty. (Fill up the input buffer or free up some output\n//   space and try again.)\nint mz_deflate(mz_streamp pStream, int flush);\n\n// mz_deflateEnd() deinitializes a compressor:\n// Return values:\n//  MZ_OK on success.\n//  MZ_STREAM_ERROR if the stream is bogus.\nint mz_deflateEnd(mz_streamp pStream);\n\n// mz_deflateBound() returns a (very) conservative upper bound on the amount of\n// data that could be generated by deflate(), assuming flush is set to only\n// MZ_NO_FLUSH or MZ_FINISH.\nmz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len);\n\n// Single-call compression functions mz_compress() and mz_compress2():\n// Returns MZ_OK on success, or one of the error codes from mz_deflate() on\n// failure.\nint mz_compress(unsigned char *pDest, mz_ulong *pDest_len,\n                const unsigned char *pSource, mz_ulong source_len);\nint mz_compress2(unsigned char *pDest, mz_ulong *pDest_len,\n                 const unsigned char *pSource, mz_ulong source_len, int level);\n\n// mz_compressBound() returns a (very) conservative upper bound on the amount of\n// data that could be generated by calling mz_compress().\nmz_ulong mz_compressBound(mz_ulong source_len);\n\n// Initializes a decompressor.\nint mz_inflateInit(mz_streamp pStream);\n\n// mz_inflateInit2() is like mz_inflateInit() with an additional option that\n// controls the window size and whether or not the stream has been wrapped with\n// a zlib header/footer:\n// window_bits must be MZ_DEFAULT_WINDOW_BITS (to parse zlib header/footer) or\n// -MZ_DEFAULT_WINDOW_BITS (raw deflate).\nint mz_inflateInit2(mz_streamp pStream, int window_bits);\n\n// Decompresses the input stream to the output, consuming only as much of the\n// input as needed, and writing as much to the output as possible.\n// Parameters:\n//   pStream is the stream to read from and write to. You must initialize/update\n//   the next_in, avail_in, next_out, and avail_out members.\n//   flush may be MZ_NO_FLUSH, MZ_SYNC_FLUSH, or MZ_FINISH.\n//   On the first call, if flush is MZ_FINISH it's assumed the input and output\n//   buffers are both sized large enough to decompress the entire stream in a\n//   single call (this is slightly faster).\n//   MZ_FINISH implies that there are no more source bytes available beside\n//   what's already in the input buffer, and that the output buffer is large\n//   enough to hold the rest of the decompressed data.\n// Return values:\n//   MZ_OK on success. Either more input is needed but not available, and/or\n//   there's more output to be written but the output buffer is full.\n//   MZ_STREAM_END if all needed input has been consumed and all output bytes\n//   have been written. For zlib streams, the adler-32 of the decompressed data\n//   has also been verified.\n//   MZ_STREAM_ERROR if the stream is bogus.\n//   MZ_DATA_ERROR if the deflate stream is invalid.\n//   MZ_PARAM_ERROR if one of the parameters is invalid.\n//   MZ_BUF_ERROR if no forward progress is possible because the input buffer is\n//   empty but the inflater needs more input to continue, or if the output\n//   buffer is not large enough. Call mz_inflate() again\n//   with more input data, or with more room in the output buffer (except when\n//   using single call decompression, described above).\nint mz_inflate(mz_streamp pStream, int flush);\n\n// Deinitializes a decompressor.\nint mz_inflateEnd(mz_streamp pStream);\n\n// Single-call decompression.\n// Returns MZ_OK on success, or one of the error codes from mz_inflate() on\n// failure.\nint mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len,\n                  const unsigned char *pSource, mz_ulong source_len);\n\n// Returns a string description of the specified error code, or NULL if the\n// error code is invalid.\nconst char *mz_error(int err);\n\n// Redefine zlib-compatible names to miniz equivalents, so miniz.c can be used\n// as a drop-in replacement for the subset of zlib that miniz.c supports.\n// Define MINIZ_NO_ZLIB_COMPATIBLE_NAMES to disable zlib-compatibility if you\n// use zlib in the same project.\n#ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES\ntypedef unsigned char Byte;\ntypedef unsigned int uInt;\ntypedef mz_ulong uLong;\ntypedef Byte Bytef;\ntypedef uInt uIntf;\ntypedef char charf;\ntypedef int intf;\ntypedef void *voidpf;\ntypedef uLong uLongf;\ntypedef void *voidp;\ntypedef void *const voidpc;\n#define Z_NULL 0\n#define Z_NO_FLUSH MZ_NO_FLUSH\n#define Z_PARTIAL_FLUSH MZ_PARTIAL_FLUSH\n#define Z_SYNC_FLUSH MZ_SYNC_FLUSH\n#define Z_FULL_FLUSH MZ_FULL_FLUSH\n#define Z_FINISH MZ_FINISH\n#define Z_BLOCK MZ_BLOCK\n#define Z_OK MZ_OK\n#define Z_STREAM_END MZ_STREAM_END\n#define Z_NEED_DICT MZ_NEED_DICT\n#define Z_ERRNO MZ_ERRNO\n#define Z_STREAM_ERROR MZ_STREAM_ERROR\n#define Z_DATA_ERROR MZ_DATA_ERROR\n#define Z_MEM_ERROR MZ_MEM_ERROR\n#define Z_BUF_ERROR MZ_BUF_ERROR\n#define Z_VERSION_ERROR MZ_VERSION_ERROR\n#define Z_PARAM_ERROR MZ_PARAM_ERROR\n#define Z_NO_COMPRESSION MZ_NO_COMPRESSION\n#define Z_BEST_SPEED MZ_BEST_SPEED\n#define Z_BEST_COMPRESSION MZ_BEST_COMPRESSION\n#define Z_DEFAULT_COMPRESSION MZ_DEFAULT_COMPRESSION\n#define Z_DEFAULT_STRATEGY MZ_DEFAULT_STRATEGY\n#define Z_FILTERED MZ_FILTERED\n#define Z_HUFFMAN_ONLY MZ_HUFFMAN_ONLY\n#define Z_RLE MZ_RLE\n#define Z_FIXED MZ_FIXED\n#define Z_DEFLATED MZ_DEFLATED\n#define Z_DEFAULT_WINDOW_BITS MZ_DEFAULT_WINDOW_BITS\n#define alloc_func mz_alloc_func\n#define free_func mz_free_func\n#define internal_state mz_internal_state\n#define z_stream mz_stream\n#define deflateInit mz_deflateInit\n#define deflateInit2 mz_deflateInit2\n#define deflateReset mz_deflateReset\n#define deflate mz_deflate\n#define deflateEnd mz_deflateEnd\n#define deflateBound mz_deflateBound\n#define compress mz_compress\n#define compress2 mz_compress2\n#define compressBound mz_compressBound\n#define inflateInit mz_inflateInit\n#define inflateInit2 mz_inflateInit2\n#define inflate mz_inflate\n#define inflateEnd mz_inflateEnd\n#define uncompress mz_uncompress\n#define crc32 mz_crc32\n#define adler32 mz_adler32\n#define MAX_WBITS 15\n#define MAX_MEM_LEVEL 9\n#define zError mz_error\n#define ZLIB_VERSION MZ_VERSION\n#define ZLIB_VERNUM MZ_VERNUM\n#define ZLIB_VER_MAJOR MZ_VER_MAJOR\n#define ZLIB_VER_MINOR MZ_VER_MINOR\n#define ZLIB_VER_REVISION MZ_VER_REVISION\n#define ZLIB_VER_SUBREVISION MZ_VER_SUBREVISION\n#define zlibVersion mz_version\n#define zlib_version mz_version()\n#endif  // #ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES\n\n#endif  // MINIZ_NO_ZLIB_APIS\n\n// ------------------- Types and macros\n\ntypedef unsigned char mz_uint8;\ntypedef signed short mz_int16;\ntypedef unsigned short mz_uint16;\ntypedef unsigned int mz_uint32;\ntypedef unsigned int mz_uint;\ntypedef long long mz_int64;\ntypedef unsigned long long mz_uint64;\ntypedef int mz_bool;\n\n#define MZ_FALSE (0)\n#define MZ_TRUE (1)\n\n// An attempt to work around MSVC's spammy \"warning C4127: conditional\n// expression is constant\" message.\n#ifdef _MSC_VER\n#define MZ_MACRO_END while (0, 0)\n#else\n#define MZ_MACRO_END while (0)\n#endif\n\n// ------------------- ZIP archive reading/writing\n\n#ifndef MINIZ_NO_ARCHIVE_APIS\n\nenum {\n  MZ_ZIP_MAX_IO_BUF_SIZE = 64 * 1024,\n  MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE = 260,\n  MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE = 256\n};\n\ntypedef struct {\n  mz_uint32 m_file_index;\n  mz_uint32 m_central_dir_ofs;\n  mz_uint16 m_version_made_by;\n  mz_uint16 m_version_needed;\n  mz_uint16 m_bit_flag;\n  mz_uint16 m_method;\n#ifndef MINIZ_NO_TIME\n  time_t m_time;\n#endif\n  mz_uint32 m_crc32;\n  mz_uint64 m_comp_size;\n  mz_uint64 m_uncomp_size;\n  mz_uint16 m_internal_attr;\n  mz_uint32 m_external_attr;\n  mz_uint64 m_local_header_ofs;\n  mz_uint32 m_comment_size;\n  char m_filename[MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE];\n  char m_comment[MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE];\n} mz_zip_archive_file_stat;\n\ntypedef size_t (*mz_file_read_func)(void *pOpaque, mz_uint64 file_ofs,\n                                    void *pBuf, size_t n);\ntypedef size_t (*mz_file_write_func)(void *pOpaque, mz_uint64 file_ofs,\n                                     const void *pBuf, size_t n);\n\nstruct mz_zip_internal_state_tag;\ntypedef struct mz_zip_internal_state_tag mz_zip_internal_state;\n\ntypedef enum {\n  MZ_ZIP_MODE_INVALID = 0,\n  MZ_ZIP_MODE_READING = 1,\n  MZ_ZIP_MODE_WRITING = 2,\n  MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED = 3\n} mz_zip_mode;\n\ntypedef struct mz_zip_archive_tag {\n  mz_uint64 m_archive_size;\n  mz_uint64 m_central_directory_file_ofs;\n  mz_uint m_total_files;\n  mz_zip_mode m_zip_mode;\n\n  mz_uint m_file_offset_alignment;\n\n  mz_alloc_func m_pAlloc;\n  mz_free_func m_pFree;\n  mz_realloc_func m_pRealloc;\n  void *m_pAlloc_opaque;\n\n  mz_file_read_func m_pRead;\n  mz_file_write_func m_pWrite;\n  void *m_pIO_opaque;\n\n  mz_zip_internal_state *m_pState;\n\n} mz_zip_archive;\n\ntypedef enum {\n  MZ_ZIP_FLAG_CASE_SENSITIVE = 0x0100,\n  MZ_ZIP_FLAG_IGNORE_PATH = 0x0200,\n  MZ_ZIP_FLAG_COMPRESSED_DATA = 0x0400,\n  MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY = 0x0800\n} mz_zip_flags;\n\n// ZIP archive reading\n\n// Inits a ZIP archive reader.\n// These functions read and validate the archive's central directory.\nmz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size,\n                           mz_uint32 flags);\nmz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem,\n                               size_t size, mz_uint32 flags);\n\n#ifndef MINIZ_NO_STDIO\nmz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename,\n                                mz_uint32 flags);\n#endif\n\n// Returns the total number of files in the archive.\nmz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip);\n\n// Returns detailed information about an archive file entry.\nmz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index,\n                                mz_zip_archive_file_stat *pStat);\n\n// Determines if an archive file entry is a directory entry.\nmz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip,\n                                          mz_uint file_index);\nmz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip,\n                                        mz_uint file_index);\n\n// Retrieves the filename of an archive file entry.\n// Returns the number of bytes written to pFilename, or if filename_buf_size is\n// 0 this function returns the number of bytes needed to fully store the\n// filename.\nmz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index,\n                                   char *pFilename, mz_uint filename_buf_size);\n\n// Attempts to locates a file in the archive's central directory.\n// Valid flags: MZ_ZIP_FLAG_CASE_SENSITIVE, MZ_ZIP_FLAG_IGNORE_PATH\n// Returns -1 if the file cannot be found.\nint mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName,\n                              const char *pComment, mz_uint flags);\n\n// Extracts a archive file to a memory buffer using no memory allocation.\nmz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip,\n                                              mz_uint file_index, void *pBuf,\n                                              size_t buf_size, mz_uint flags,\n                                              void *pUser_read_buf,\n                                              size_t user_read_buf_size);\nmz_bool mz_zip_reader_extract_file_to_mem_no_alloc(\n    mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size,\n    mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size);\n\n// Extracts a archive file to a memory buffer.\nmz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index,\n                                     void *pBuf, size_t buf_size,\n                                     mz_uint flags);\nmz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip,\n                                          const char *pFilename, void *pBuf,\n                                          size_t buf_size, mz_uint flags);\n\n// Extracts a archive file to a dynamically allocated heap buffer.\nvoid *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index,\n                                    size_t *pSize, mz_uint flags);\nvoid *mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip,\n                                         const char *pFilename, size_t *pSize,\n                                         mz_uint flags);\n\n// Extracts a archive file using a callback function to output the file's data.\nmz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip,\n                                          mz_uint file_index,\n                                          mz_file_write_func pCallback,\n                                          void *pOpaque, mz_uint flags);\nmz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip,\n                                               const char *pFilename,\n                                               mz_file_write_func pCallback,\n                                               void *pOpaque, mz_uint flags);\n\n#ifndef MINIZ_NO_STDIO\n// Extracts a archive file to a disk file and sets its last accessed and\n// modified times.\n// This function only extracts files, not archive directory records.\nmz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index,\n                                      const char *pDst_filename, mz_uint flags);\nmz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip,\n                                           const char *pArchive_filename,\n                                           const char *pDst_filename,\n                                           mz_uint flags);\n#endif\n\n// Ends archive reading, freeing all allocations, and closing the input archive\n// file if mz_zip_reader_init_file() was used.\nmz_bool mz_zip_reader_end(mz_zip_archive *pZip);\n\n// ZIP archive writing\n\n#ifndef MINIZ_NO_ARCHIVE_WRITING_APIS\n\n// Inits a ZIP archive writer.\nmz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size);\nmz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip,\n                                size_t size_to_reserve_at_beginning,\n                                size_t initial_allocation_size);\n\n#ifndef MINIZ_NO_STDIO\nmz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename,\n                                mz_uint64 size_to_reserve_at_beginning);\n#endif\n\n// Converts a ZIP archive reader object into a writer object, to allow efficient\n// in-place file appends to occur on an existing archive.\n// For archives opened using mz_zip_reader_init_file, pFilename must be the\n// archive's filename so it can be reopened for writing. If the file can't be\n// reopened, mz_zip_reader_end() will be called.\n// For archives opened using mz_zip_reader_init_mem, the memory block must be\n// growable using the realloc callback (which defaults to realloc unless you've\n// overridden it).\n// Finally, for archives opened using mz_zip_reader_init, the mz_zip_archive's\n// user provided m_pWrite function cannot be NULL.\n// Note: In-place archive modification is not recommended unless you know what\n// you're doing, because if execution stops or something goes wrong before\n// the archive is finalized the file's central directory will be hosed.\nmz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip,\n                                       const char *pFilename);\n\n// Adds the contents of a memory buffer to an archive. These functions record\n// the current local time into the archive.\n// To add a directory entry, call this method with an archive name ending in a\n// forwardslash with empty buffer.\n// level_and_flags - compression level (0-10, see MZ_BEST_SPEED,\n// MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or\n// just set to MZ_DEFAULT_COMPRESSION.\nmz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name,\n                              const void *pBuf, size_t buf_size,\n                              mz_uint level_and_flags);\nmz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip,\n                                 const char *pArchive_name, const void *pBuf,\n                                 size_t buf_size, const void *pComment,\n                                 mz_uint16 comment_size,\n                                 mz_uint level_and_flags, mz_uint64 uncomp_size,\n                                 mz_uint32 uncomp_crc32);\n\n#ifndef MINIZ_NO_STDIO\n// Adds the contents of a disk file to an archive. This function also records\n// the disk file's modified time into the archive.\n// level_and_flags - compression level (0-10, see MZ_BEST_SPEED,\n// MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or\n// just set to MZ_DEFAULT_COMPRESSION.\nmz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name,\n                               const char *pSrc_filename, const void *pComment,\n                               mz_uint16 comment_size, mz_uint level_and_flags);\n#endif\n\n// Adds a file to an archive by fully cloning the data from another archive.\n// This function fully clones the source file's compressed data (no\n// recompression), along with its full filename, extra data, and comment fields.\nmz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip,\n                                          mz_zip_archive *pSource_zip,\n                                          mz_uint file_index);\n\n// Finalizes the archive by writing the central directory records followed by\n// the end of central directory record.\n// After an archive is finalized, the only valid call on the mz_zip_archive\n// struct is mz_zip_writer_end().\n// An archive must be manually finalized by calling this function for it to be\n// valid.\nmz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip);\nmz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **pBuf,\n                                            size_t *pSize);\n\n// Ends archive writing, freeing all allocations, and closing the output file if\n// mz_zip_writer_init_file() was used.\n// Note for the archive to be valid, it must have been finalized before ending.\nmz_bool mz_zip_writer_end(mz_zip_archive *pZip);\n\n// Misc. high-level helper functions:\n\n// mz_zip_add_mem_to_archive_file_in_place() efficiently (but not atomically)\n// appends a memory blob to a ZIP archive.\n// level_and_flags - compression level (0-10, see MZ_BEST_SPEED,\n// MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or\n// just set to MZ_DEFAULT_COMPRESSION.\nmz_bool mz_zip_add_mem_to_archive_file_in_place(\n    const char *pZip_filename, const char *pArchive_name, const void *pBuf,\n    size_t buf_size, const void *pComment, mz_uint16 comment_size,\n    mz_uint level_and_flags);\n\n// Reads a single file from an archive into a heap block.\n// Returns NULL on failure.\nvoid *mz_zip_extract_archive_file_to_heap(const char *pZip_filename,\n                                          const char *pArchive_name,\n                                          size_t *pSize, mz_uint zip_flags);\n\n#endif  // #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS\n\n#endif  // #ifndef MINIZ_NO_ARCHIVE_APIS\n\n// ------------------- Low-level Decompression API Definitions\n\n// Decompression flags used by tinfl_decompress().\n// TINFL_FLAG_PARSE_ZLIB_HEADER: If set, the input has a valid zlib header and\n// ends with an adler32 checksum (it's a valid zlib stream). Otherwise, the\n// input is a raw deflate stream.\n// TINFL_FLAG_HAS_MORE_INPUT: If set, there are more input bytes available\n// beyond the end of the supplied input buffer. If clear, the input buffer\n// contains all remaining input.\n// TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF: If set, the output buffer is large\n// enough to hold the entire decompressed stream. If clear, the output buffer is\n// at least the size of the dictionary (typically 32KB).\n// TINFL_FLAG_COMPUTE_ADLER32: Force adler-32 checksum computation of the\n// decompressed bytes.\nenum {\n  TINFL_FLAG_PARSE_ZLIB_HEADER = 1,\n  TINFL_FLAG_HAS_MORE_INPUT = 2,\n  TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF = 4,\n  TINFL_FLAG_COMPUTE_ADLER32 = 8\n};\n\n// High level decompression functions:\n// tinfl_decompress_mem_to_heap() decompresses a block in memory to a heap block\n// allocated via malloc().\n// On entry:\n//  pSrc_buf, src_buf_len: Pointer and size of the Deflate or zlib source data\n//  to decompress.\n// On return:\n//  Function returns a pointer to the decompressed data, or NULL on failure.\n//  *pOut_len will be set to the decompressed data's size, which could be larger\n//  than src_buf_len on uncompressible data.\n//  The caller must call mz_free() on the returned block when it's no longer\n//  needed.\nvoid *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len,\n                                   size_t *pOut_len, int flags);\n\n// tinfl_decompress_mem_to_mem() decompresses a block in memory to another block\n// in memory.\n// Returns TINFL_DECOMPRESS_MEM_TO_MEM_FAILED on failure, or the number of bytes\n// written on success.\n#define TINFL_DECOMPRESS_MEM_TO_MEM_FAILED ((size_t)(-1))\nsize_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len,\n                                   const void *pSrc_buf, size_t src_buf_len,\n                                   int flags);\n\n// tinfl_decompress_mem_to_callback() decompresses a block in memory to an\n// internal 32KB buffer, and a user provided callback function will be called to\n// flush the buffer.\n// Returns 1 on success or 0 on failure.\ntypedef int (*tinfl_put_buf_func_ptr)(const void *pBuf, int len, void *pUser);\nint tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size,\n                                     tinfl_put_buf_func_ptr pPut_buf_func,\n                                     void *pPut_buf_user, int flags);\n\nstruct tinfl_decompressor_tag;\ntypedef struct tinfl_decompressor_tag tinfl_decompressor;\n\n// Max size of LZ dictionary.\n#define TINFL_LZ_DICT_SIZE 32768\n\n// Return status.\ntypedef enum {\n  TINFL_STATUS_BAD_PARAM = -3,\n  TINFL_STATUS_ADLER32_MISMATCH = -2,\n  TINFL_STATUS_FAILED = -1,\n  TINFL_STATUS_DONE = 0,\n  TINFL_STATUS_NEEDS_MORE_INPUT = 1,\n  TINFL_STATUS_HAS_MORE_OUTPUT = 2\n} tinfl_status;\n\n// Initializes the decompressor to its initial state.\n#define tinfl_init(r) \\\n  do {                \\\n    (r)->m_state = 0; \\\n  }                   \\\n  MZ_MACRO_END\n#define tinfl_get_adler32(r) (r)->m_check_adler32\n\n// Main low-level decompressor coroutine function. This is the only function\n// actually needed for decompression. All the other functions are just\n// high-level helpers for improved usability.\n// This is a universal API, i.e. it can be used as a building block to build any\n// desired higher level decompression API. In the limit case, it can be called\n// once per every byte input or output.\ntinfl_status tinfl_decompress(tinfl_decompressor *r,\n                              const mz_uint8 *pIn_buf_next,\n                              size_t *pIn_buf_size, mz_uint8 *pOut_buf_start,\n                              mz_uint8 *pOut_buf_next, size_t *pOut_buf_size,\n                              const mz_uint32 decomp_flags);\n\n// Internal/private bits follow.\nenum {\n  TINFL_MAX_HUFF_TABLES = 3,\n  TINFL_MAX_HUFF_SYMBOLS_0 = 288,\n  TINFL_MAX_HUFF_SYMBOLS_1 = 32,\n  TINFL_MAX_HUFF_SYMBOLS_2 = 19,\n  TINFL_FAST_LOOKUP_BITS = 10,\n  TINFL_FAST_LOOKUP_SIZE = 1 << TINFL_FAST_LOOKUP_BITS\n};\n\ntypedef struct {\n  mz_uint8 m_code_size[TINFL_MAX_HUFF_SYMBOLS_0];\n  mz_int16 m_look_up[TINFL_FAST_LOOKUP_SIZE],\n      m_tree[TINFL_MAX_HUFF_SYMBOLS_0 * 2];\n} tinfl_huff_table;\n\n#if MINIZ_HAS_64BIT_REGISTERS\n#define TINFL_USE_64BIT_BITBUF 1\n#endif\n\n#if TINFL_USE_64BIT_BITBUF\ntypedef mz_uint64 tinfl_bit_buf_t;\n#define TINFL_BITBUF_SIZE (64)\n#else\ntypedef mz_uint32 tinfl_bit_buf_t;\n#define TINFL_BITBUF_SIZE (32)\n#endif\n\nstruct tinfl_decompressor_tag {\n  mz_uint32 m_state, m_num_bits, m_zhdr0, m_zhdr1, m_z_adler32, m_final, m_type,\n      m_check_adler32, m_dist, m_counter, m_num_extra,\n      m_table_sizes[TINFL_MAX_HUFF_TABLES];\n  tinfl_bit_buf_t m_bit_buf;\n  size_t m_dist_from_out_buf_start;\n  tinfl_huff_table m_tables[TINFL_MAX_HUFF_TABLES];\n  mz_uint8 m_raw_header[4],\n      m_len_codes[TINFL_MAX_HUFF_SYMBOLS_0 + TINFL_MAX_HUFF_SYMBOLS_1 + 137];\n};\n\n// ------------------- Low-level Compression API Definitions\n\n// Set TDEFL_LESS_MEMORY to 1 to use less memory (compression will be slightly\n// slower, and raw/dynamic blocks will be output more frequently).\n#define TDEFL_LESS_MEMORY 0\n\n// tdefl_init() compression flags logically OR'd together (low 12 bits contain\n// the max. number of probes per dictionary search):\n// TDEFL_DEFAULT_MAX_PROBES: The compressor defaults to 128 dictionary probes\n// per dictionary search. 0=Huffman only, 1=Huffman+LZ (fastest/crap\n// compression), 4095=Huffman+LZ (slowest/best compression).\nenum {\n  TDEFL_HUFFMAN_ONLY = 0,\n  TDEFL_DEFAULT_MAX_PROBES = 128,\n  TDEFL_MAX_PROBES_MASK = 0xFFF\n};\n\n// TDEFL_WRITE_ZLIB_HEADER: If set, the compressor outputs a zlib header before\n// the deflate data, and the Adler-32 of the source data at the end. Otherwise,\n// you'll get raw deflate data.\n// TDEFL_COMPUTE_ADLER32: Always compute the adler-32 of the input data (even\n// when not writing zlib headers).\n// TDEFL_GREEDY_PARSING_FLAG: Set to use faster greedy parsing, instead of more\n// efficient lazy parsing.\n// TDEFL_NONDETERMINISTIC_PARSING_FLAG: Enable to decrease the compressor's\n// initialization time to the minimum, but the output may vary from run to run\n// given the same input (depending on the contents of memory).\n// TDEFL_RLE_MATCHES: Only look for RLE matches (matches with a distance of 1)\n// TDEFL_FILTER_MATCHES: Discards matches <= 5 chars if enabled.\n// TDEFL_FORCE_ALL_STATIC_BLOCKS: Disable usage of optimized Huffman tables.\n// TDEFL_FORCE_ALL_RAW_BLOCKS: Only use raw (uncompressed) deflate blocks.\n// The low 12 bits are reserved to control the max # of hash probes per\n// dictionary lookup (see TDEFL_MAX_PROBES_MASK).\nenum {\n  TDEFL_WRITE_ZLIB_HEADER = 0x01000,\n  TDEFL_COMPUTE_ADLER32 = 0x02000,\n  TDEFL_GREEDY_PARSING_FLAG = 0x04000,\n  TDEFL_NONDETERMINISTIC_PARSING_FLAG = 0x08000,\n  TDEFL_RLE_MATCHES = 0x10000,\n  TDEFL_FILTER_MATCHES = 0x20000,\n  TDEFL_FORCE_ALL_STATIC_BLOCKS = 0x40000,\n  TDEFL_FORCE_ALL_RAW_BLOCKS = 0x80000\n};\n\n// High level compression functions:\n// tdefl_compress_mem_to_heap() compresses a block in memory to a heap block\n// allocated via malloc().\n// On entry:\n//  pSrc_buf, src_buf_len: Pointer and size of source block to compress.\n//  flags: The max match finder probes (default is 128) logically OR'd against\n//  the above flags. Higher probes are slower but improve compression.\n// On return:\n//  Function returns a pointer to the compressed data, or NULL on failure.\n//  *pOut_len will be set to the compressed data's size, which could be larger\n//  than src_buf_len on uncompressible data.\n//  The caller must free() the returned block when it's no longer needed.\nvoid *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len,\n                                 size_t *pOut_len, int flags);\n\n// tdefl_compress_mem_to_mem() compresses a block in memory to another block in\n// memory.\n// Returns 0 on failure.\nsize_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len,\n                                 const void *pSrc_buf, size_t src_buf_len,\n                                 int flags);\n\n// Compresses an image to a compressed PNG file in memory.\n// On entry:\n//  pImage, w, h, and num_chans describe the image to compress. num_chans may be\n//  1, 2, 3, or 4.\n//  The image pitch in bytes per scanline will be w*num_chans. The leftmost\n//  pixel on the top scanline is stored first in memory.\n//  level may range from [0,10], use MZ_NO_COMPRESSION, MZ_BEST_SPEED,\n//  MZ_BEST_COMPRESSION, etc. or a decent default is MZ_DEFAULT_LEVEL\n//  If flip is true, the image will be flipped on the Y axis (useful for OpenGL\n//  apps).\n// On return:\n//  Function returns a pointer to the compressed data, or NULL on failure.\n//  *pLen_out will be set to the size of the PNG image file.\n//  The caller must mz_free() the returned heap block (which will typically be\n//  larger than *pLen_out) when it's no longer needed.\nvoid *tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w,\n                                                 int h, int num_chans,\n                                                 size_t *pLen_out,\n                                                 mz_uint level, mz_bool flip);\nvoid *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h,\n                                              int num_chans, size_t *pLen_out);\n\n// Output stream interface. The compressor uses this interface to write\n// compressed data. It'll typically be called TDEFL_OUT_BUF_SIZE at a time.\ntypedef mz_bool (*tdefl_put_buf_func_ptr)(const void *pBuf, int len,\n                                          void *pUser);\n\n// tdefl_compress_mem_to_output() compresses a block to an output stream. The\n// above helpers use this function internally.\nmz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len,\n                                     tdefl_put_buf_func_ptr pPut_buf_func,\n                                     void *pPut_buf_user, int flags);\n\nenum {\n  TDEFL_MAX_HUFF_TABLES = 3,\n  TDEFL_MAX_HUFF_SYMBOLS_0 = 288,\n  TDEFL_MAX_HUFF_SYMBOLS_1 = 32,\n  TDEFL_MAX_HUFF_SYMBOLS_2 = 19,\n  TDEFL_LZ_DICT_SIZE = 32768,\n  TDEFL_LZ_DICT_SIZE_MASK = TDEFL_LZ_DICT_SIZE - 1,\n  TDEFL_MIN_MATCH_LEN = 3,\n  TDEFL_MAX_MATCH_LEN = 258\n};\n\n// TDEFL_OUT_BUF_SIZE MUST be large enough to hold a single entire compressed\n// output block (using static/fixed Huffman codes).\n#if TDEFL_LESS_MEMORY\nenum {\n  TDEFL_LZ_CODE_BUF_SIZE = 24 * 1024,\n  TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13) / 10,\n  TDEFL_MAX_HUFF_SYMBOLS = 288,\n  TDEFL_LZ_HASH_BITS = 12,\n  TDEFL_LEVEL1_HASH_SIZE_MASK = 4095,\n  TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3,\n  TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS\n};\n#else\nenum {\n  TDEFL_LZ_CODE_BUF_SIZE = 64 * 1024,\n  TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13) / 10,\n  TDEFL_MAX_HUFF_SYMBOLS = 288,\n  TDEFL_LZ_HASH_BITS = 15,\n  TDEFL_LEVEL1_HASH_SIZE_MASK = 4095,\n  TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3,\n  TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS\n};\n#endif\n\n// The low-level tdefl functions below may be used directly if the above helper\n// functions aren't flexible enough. The low-level functions don't make any heap\n// allocations, unlike the above helper functions.\ntypedef enum {\n  TDEFL_STATUS_BAD_PARAM = -2,\n  TDEFL_STATUS_PUT_BUF_FAILED = -1,\n  TDEFL_STATUS_OKAY = 0,\n  TDEFL_STATUS_DONE = 1\n} tdefl_status;\n\n// Must map to MZ_NO_FLUSH, MZ_SYNC_FLUSH, etc. enums\ntypedef enum {\n  TDEFL_NO_FLUSH = 0,\n  TDEFL_SYNC_FLUSH = 2,\n  TDEFL_FULL_FLUSH = 3,\n  TDEFL_FINISH = 4\n} tdefl_flush;\n\n// tdefl's compression state structure.\ntypedef struct {\n  tdefl_put_buf_func_ptr m_pPut_buf_func;\n  void *m_pPut_buf_user;\n  mz_uint m_flags, m_max_probes[2];\n  int m_greedy_parsing;\n  mz_uint m_adler32, m_lookahead_pos, m_lookahead_size, m_dict_size;\n  mz_uint8 *m_pLZ_code_buf, *m_pLZ_flags, *m_pOutput_buf, *m_pOutput_buf_end;\n  mz_uint m_num_flags_left, m_total_lz_bytes, m_lz_code_buf_dict_pos, m_bits_in,\n      m_bit_buffer;\n  mz_uint m_saved_match_dist, m_saved_match_len, m_saved_lit,\n      m_output_flush_ofs, m_output_flush_remaining, m_finished, m_block_index,\n      m_wants_to_finish;\n  tdefl_status m_prev_return_status;\n  const void *m_pIn_buf;\n  void *m_pOut_buf;\n  size_t *m_pIn_buf_size, *m_pOut_buf_size;\n  tdefl_flush m_flush;\n  const mz_uint8 *m_pSrc;\n  size_t m_src_buf_left, m_out_buf_ofs;\n  mz_uint8 m_dict[TDEFL_LZ_DICT_SIZE + TDEFL_MAX_MATCH_LEN - 1];\n  mz_uint16 m_huff_count[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS];\n  mz_uint16 m_huff_codes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS];\n  mz_uint8 m_huff_code_sizes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS];\n  mz_uint8 m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE];\n  mz_uint16 m_next[TDEFL_LZ_DICT_SIZE];\n  mz_uint16 m_hash[TDEFL_LZ_HASH_SIZE];\n  mz_uint8 m_output_buf[TDEFL_OUT_BUF_SIZE];\n} tdefl_compressor;\n\n// Initializes the compressor.\n// There is no corresponding deinit() function because the tdefl API's do not\n// dynamically allocate memory.\n// pBut_buf_func: If NULL, output data will be supplied to the specified\n// callback. In this case, the user should call the tdefl_compress_buffer() API\n// for compression.\n// If pBut_buf_func is NULL the user should always call the tdefl_compress()\n// API.\n// flags: See the above enums (TDEFL_HUFFMAN_ONLY, TDEFL_WRITE_ZLIB_HEADER,\n// etc.)\ntdefl_status tdefl_init(tdefl_compressor *d,\n                        tdefl_put_buf_func_ptr pPut_buf_func,\n                        void *pPut_buf_user, int flags);\n\n// Compresses a block of data, consuming as much of the specified input buffer\n// as possible, and writing as much compressed data to the specified output\n// buffer as possible.\ntdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf,\n                            size_t *pIn_buf_size, void *pOut_buf,\n                            size_t *pOut_buf_size, tdefl_flush flush);\n\n// tdefl_compress_buffer() is only usable when the tdefl_init() is called with a\n// non-NULL tdefl_put_buf_func_ptr.\n// tdefl_compress_buffer() always consumes the entire input buffer.\ntdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf,\n                                   size_t in_buf_size, tdefl_flush flush);\n\ntdefl_status tdefl_get_prev_return_status(tdefl_compressor *d);\nmz_uint32 tdefl_get_adler32(tdefl_compressor *d);\n\n// Can't use tdefl_create_comp_flags_from_zip_params if MINIZ_NO_ZLIB_APIS isn't\n// defined, because it uses some of its macros.\n#ifndef MINIZ_NO_ZLIB_APIS\n// Create tdefl_compress() flags given zlib-style compression parameters.\n// level may range from [0,10] (where 10 is absolute max compression, but may be\n// much slower on some files)\n// window_bits may be -15 (raw deflate) or 15 (zlib)\n// strategy may be either MZ_DEFAULT_STRATEGY, MZ_FILTERED, MZ_HUFFMAN_ONLY,\n// MZ_RLE, or MZ_FIXED\nmz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits,\n                                                int strategy);\n#endif  // #ifndef MINIZ_NO_ZLIB_APIS\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif  // MINIZ_HEADER_INCLUDED\n\n// ------------------- End of Header: Implementation follows. (If you only want\n// the header, define MINIZ_HEADER_FILE_ONLY.)\n\n#ifndef MINIZ_HEADER_FILE_ONLY\n\ntypedef unsigned char mz_validate_uint16[sizeof(mz_uint16) == 2 ? 1 : -1];\ntypedef unsigned char mz_validate_uint32[sizeof(mz_uint32) == 4 ? 1 : -1];\ntypedef unsigned char mz_validate_uint64[sizeof(mz_uint64) == 8 ? 1 : -1];\n\n//#include <assert.h>\n//#include <string.h>\n\n#define MZ_ASSERT(x) assert(x)\n\n#ifdef MINIZ_NO_MALLOC\n#define MZ_MALLOC(x) NULL\n#define MZ_FREE(x) (void)x, ((void)0)\n#define MZ_REALLOC(p, x) NULL\n#else\n#define MZ_MALLOC(x) malloc(x)\n#define MZ_FREE(x) free(x)\n#define MZ_REALLOC(p, x) realloc(p, x)\n#endif\n\n#define MZ_MAX(a, b) (((a) > (b)) ? (a) : (b))\n#define MZ_MIN(a, b) (((a) < (b)) ? (a) : (b))\n#define MZ_CLEAR_OBJ(obj) memset(&(obj), 0, sizeof(obj))\n\n#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN\n#define MZ_READ_LE16(p) *((const mz_uint16 *)(p))\n#define MZ_READ_LE32(p) *((const mz_uint32 *)(p))\n#else\n#define MZ_READ_LE16(p)                      \\\n  ((mz_uint32)(((const mz_uint8 *)(p))[0]) | \\\n   ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U))\n#define MZ_READ_LE32(p)                               \\\n  ((mz_uint32)(((const mz_uint8 *)(p))[0]) |          \\\n   ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U) |  \\\n   ((mz_uint32)(((const mz_uint8 *)(p))[2]) << 16U) | \\\n   ((mz_uint32)(((const mz_uint8 *)(p))[3]) << 24U))\n#endif\n\n#ifdef _MSC_VER\n#define MZ_FORCEINLINE __forceinline\n#elif defined(__GNUC__)\n#define MZ_FORCEINLINE inline __attribute__((__always_inline__))\n#else\n#define MZ_FORCEINLINE inline\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// ------------------- zlib-style API's\n\nmz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len) {\n  mz_uint32 i, s1 = (mz_uint32)(adler & 0xffff), s2 = (mz_uint32)(adler >> 16);\n  size_t block_len = buf_len % 5552;\n  if (!ptr) return MZ_ADLER32_INIT;\n  while (buf_len) {\n    for (i = 0; i + 7 < block_len; i += 8, ptr += 8) {\n      s1 += ptr[0], s2 += s1;\n      s1 += ptr[1], s2 += s1;\n      s1 += ptr[2], s2 += s1;\n      s1 += ptr[3], s2 += s1;\n      s1 += ptr[4], s2 += s1;\n      s1 += ptr[5], s2 += s1;\n      s1 += ptr[6], s2 += s1;\n      s1 += ptr[7], s2 += s1;\n    }\n    for (; i < block_len; ++i) s1 += *ptr++, s2 += s1;\n    s1 %= 65521U, s2 %= 65521U;\n    buf_len -= block_len;\n    block_len = 5552;\n  }\n  return (s2 << 16) + s1;\n}\n\n// Karl Malbrain's compact CRC-32. See \"A compact CCITT crc16 and crc32 C\n// implementation that balances processor cache usage against speed\":\n// http://www.geocities.com/malbrain/\nmz_ulong mz_crc32(mz_ulong crc, const mz_uint8 *ptr, size_t buf_len) {\n  static const mz_uint32 s_crc32[16] = {\n      0,          0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4,\n      0x4db26158, 0x5005713c, 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,\n      0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c};\n  mz_uint32 crcu32 = (mz_uint32)crc;\n  if (!ptr) return MZ_CRC32_INIT;\n  crcu32 = ~crcu32;\n  while (buf_len--) {\n    mz_uint8 b = *ptr++;\n    crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b & 0xF)];\n    crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b >> 4)];\n  }\n  return ~crcu32;\n}\n\nvoid mz_free(void *p) { MZ_FREE(p); }\n\n#ifndef MINIZ_NO_ZLIB_APIS\n\nstatic void *def_alloc_func(void *opaque, size_t items, size_t size) {\n  (void)opaque, (void)items, (void)size;\n  return MZ_MALLOC(items * size);\n}\nstatic void def_free_func(void *opaque, void *address) {\n  (void)opaque, (void)address;\n  MZ_FREE(address);\n}\n// static void *def_realloc_func(void *opaque, void *address, size_t items,\n//                              size_t size) {\n//  (void)opaque, (void)address, (void)items, (void)size;\n//  return MZ_REALLOC(address, items * size);\n//}\n\nconst char *mz_version(void) { return MZ_VERSION; }\n\nint mz_deflateInit(mz_streamp pStream, int level) {\n  return mz_deflateInit2(pStream, level, MZ_DEFLATED, MZ_DEFAULT_WINDOW_BITS, 9,\n                         MZ_DEFAULT_STRATEGY);\n}\n\nint mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits,\n                    int mem_level, int strategy) {\n  tdefl_compressor *pComp;\n  mz_uint comp_flags =\n      TDEFL_COMPUTE_ADLER32 |\n      tdefl_create_comp_flags_from_zip_params(level, window_bits, strategy);\n\n  if (!pStream) return MZ_STREAM_ERROR;\n  if ((method != MZ_DEFLATED) || ((mem_level < 1) || (mem_level > 9)) ||\n      ((window_bits != MZ_DEFAULT_WINDOW_BITS) &&\n       (-window_bits != MZ_DEFAULT_WINDOW_BITS)))\n    return MZ_PARAM_ERROR;\n\n  pStream->data_type = 0;\n  pStream->adler = MZ_ADLER32_INIT;\n  pStream->msg = NULL;\n  pStream->reserved = 0;\n  pStream->total_in = 0;\n  pStream->total_out = 0;\n  if (!pStream->zalloc) pStream->zalloc = def_alloc_func;\n  if (!pStream->zfree) pStream->zfree = def_free_func;\n\n  pComp = (tdefl_compressor *)pStream->zalloc(pStream->opaque, 1,\n                                              sizeof(tdefl_compressor));\n  if (!pComp) return MZ_MEM_ERROR;\n\n  pStream->state = (struct mz_internal_state *)pComp;\n\n  if (tdefl_init(pComp, NULL, NULL, comp_flags) != TDEFL_STATUS_OKAY) {\n    mz_deflateEnd(pStream);\n    return MZ_PARAM_ERROR;\n  }\n\n  return MZ_OK;\n}\n\nint mz_deflateReset(mz_streamp pStream) {\n  if ((!pStream) || (!pStream->state) || (!pStream->zalloc) ||\n      (!pStream->zfree))\n    return MZ_STREAM_ERROR;\n  pStream->total_in = pStream->total_out = 0;\n  tdefl_init((tdefl_compressor *)pStream->state, NULL, NULL,\n             ((tdefl_compressor *)pStream->state)->m_flags);\n  return MZ_OK;\n}\n\nint mz_deflate(mz_streamp pStream, int flush) {\n  size_t in_bytes, out_bytes;\n  mz_ulong orig_total_in, orig_total_out;\n  int mz_status = MZ_OK;\n\n  if ((!pStream) || (!pStream->state) || (flush < 0) || (flush > MZ_FINISH) ||\n      (!pStream->next_out))\n    return MZ_STREAM_ERROR;\n  if (!pStream->avail_out) return MZ_BUF_ERROR;\n\n  if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH;\n\n  if (((tdefl_compressor *)pStream->state)->m_prev_return_status ==\n      TDEFL_STATUS_DONE)\n    return (flush == MZ_FINISH) ? MZ_STREAM_END : MZ_BUF_ERROR;\n\n  orig_total_in = pStream->total_in;\n  orig_total_out = pStream->total_out;\n  for (;;) {\n    tdefl_status defl_status;\n    in_bytes = pStream->avail_in;\n    out_bytes = pStream->avail_out;\n\n    defl_status = tdefl_compress((tdefl_compressor *)pStream->state,\n                                 pStream->next_in, &in_bytes, pStream->next_out,\n                                 &out_bytes, (tdefl_flush)flush);\n    pStream->next_in += (mz_uint)in_bytes;\n    pStream->avail_in -= (mz_uint)in_bytes;\n    pStream->total_in += (mz_uint)in_bytes;\n    pStream->adler = tdefl_get_adler32((tdefl_compressor *)pStream->state);\n\n    pStream->next_out += (mz_uint)out_bytes;\n    pStream->avail_out -= (mz_uint)out_bytes;\n    pStream->total_out += (mz_uint)out_bytes;\n\n    if (defl_status < 0) {\n      mz_status = MZ_STREAM_ERROR;\n      break;\n    } else if (defl_status == TDEFL_STATUS_DONE) {\n      mz_status = MZ_STREAM_END;\n      break;\n    } else if (!pStream->avail_out)\n      break;\n    else if ((!pStream->avail_in) && (flush != MZ_FINISH)) {\n      if ((flush) || (pStream->total_in != orig_total_in) ||\n          (pStream->total_out != orig_total_out))\n        break;\n      return MZ_BUF_ERROR;  // Can't make forward progress without some input.\n    }\n  }\n  return mz_status;\n}\n\nint mz_deflateEnd(mz_streamp pStream) {\n  if (!pStream) return MZ_STREAM_ERROR;\n  if (pStream->state) {\n    pStream->zfree(pStream->opaque, pStream->state);\n    pStream->state = NULL;\n  }\n  return MZ_OK;\n}\n\nmz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len) {\n  (void)pStream;\n  // This is really over conservative. (And lame, but it's actually pretty\n  // tricky to compute a true upper bound given the way tdefl's blocking works.)\n  return MZ_MAX(128 + (source_len * 110) / 100,\n                128 + source_len + ((source_len / (31 * 1024)) + 1) * 5);\n}\n\nint mz_compress2(unsigned char *pDest, mz_ulong *pDest_len,\n                 const unsigned char *pSource, mz_ulong source_len, int level) {\n  int status;\n  mz_stream stream;\n  memset(&stream, 0, sizeof(stream));\n\n  // In case mz_ulong is 64-bits (argh I hate longs).\n  if ((source_len | *pDest_len) > 0xFFFFFFFFU) return MZ_PARAM_ERROR;\n\n  stream.next_in = pSource;\n  stream.avail_in = (mz_uint32)source_len;\n  stream.next_out = pDest;\n  stream.avail_out = (mz_uint32)*pDest_len;\n\n  status = mz_deflateInit(&stream, level);\n  if (status != MZ_OK) return status;\n\n  status = mz_deflate(&stream, MZ_FINISH);\n  if (status != MZ_STREAM_END) {\n    mz_deflateEnd(&stream);\n    return (status == MZ_OK) ? MZ_BUF_ERROR : status;\n  }\n\n  *pDest_len = stream.total_out;\n  return mz_deflateEnd(&stream);\n}\n\nint mz_compress(unsigned char *pDest, mz_ulong *pDest_len,\n                const unsigned char *pSource, mz_ulong source_len) {\n  return mz_compress2(pDest, pDest_len, pSource, source_len,\n                      MZ_DEFAULT_COMPRESSION);\n}\n\nmz_ulong mz_compressBound(mz_ulong source_len) {\n  return mz_deflateBound(NULL, source_len);\n}\n\ntypedef struct {\n  tinfl_decompressor m_decomp;\n  mz_uint m_dict_ofs, m_dict_avail, m_first_call, m_has_flushed;\n  int m_window_bits;\n  mz_uint8 m_dict[TINFL_LZ_DICT_SIZE];\n  tinfl_status m_last_status;\n} inflate_state;\n\nint mz_inflateInit2(mz_streamp pStream, int window_bits) {\n  inflate_state *pDecomp;\n  if (!pStream) return MZ_STREAM_ERROR;\n  if ((window_bits != MZ_DEFAULT_WINDOW_BITS) &&\n      (-window_bits != MZ_DEFAULT_WINDOW_BITS))\n    return MZ_PARAM_ERROR;\n\n  pStream->data_type = 0;\n  pStream->adler = 0;\n  pStream->msg = NULL;\n  pStream->total_in = 0;\n  pStream->total_out = 0;\n  pStream->reserved = 0;\n  if (!pStream->zalloc) pStream->zalloc = def_alloc_func;\n  if (!pStream->zfree) pStream->zfree = def_free_func;\n\n  pDecomp = (inflate_state *)pStream->zalloc(pStream->opaque, 1,\n                                             sizeof(inflate_state));\n  if (!pDecomp) return MZ_MEM_ERROR;\n\n  pStream->state = (struct mz_internal_state *)pDecomp;\n\n  tinfl_init(&pDecomp->m_decomp);\n  pDecomp->m_dict_ofs = 0;\n  pDecomp->m_dict_avail = 0;\n  pDecomp->m_last_status = TINFL_STATUS_NEEDS_MORE_INPUT;\n  pDecomp->m_first_call = 1;\n  pDecomp->m_has_flushed = 0;\n  pDecomp->m_window_bits = window_bits;\n\n  return MZ_OK;\n}\n\nint mz_inflateInit(mz_streamp pStream) {\n  return mz_inflateInit2(pStream, MZ_DEFAULT_WINDOW_BITS);\n}\n\nint mz_inflate(mz_streamp pStream, int flush) {\n  inflate_state *pState;\n  mz_uint n, first_call, decomp_flags = TINFL_FLAG_COMPUTE_ADLER32;\n  size_t in_bytes, out_bytes, orig_avail_in;\n  tinfl_status status;\n\n  if ((!pStream) || (!pStream->state)) return MZ_STREAM_ERROR;\n  if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH;\n  if ((flush) && (flush != MZ_SYNC_FLUSH) && (flush != MZ_FINISH))\n    return MZ_STREAM_ERROR;\n\n  pState = (inflate_state *)pStream->state;\n  if (pState->m_window_bits > 0) decomp_flags |= TINFL_FLAG_PARSE_ZLIB_HEADER;\n  orig_avail_in = pStream->avail_in;\n\n  first_call = pState->m_first_call;\n  pState->m_first_call = 0;\n  if (pState->m_last_status < 0) return MZ_DATA_ERROR;\n\n  if (pState->m_has_flushed && (flush != MZ_FINISH)) return MZ_STREAM_ERROR;\n  pState->m_has_flushed |= (flush == MZ_FINISH);\n\n  if ((flush == MZ_FINISH) && (first_call)) {\n    // MZ_FINISH on the first call implies that the input and output buffers are\n    // large enough to hold the entire compressed/decompressed file.\n    decomp_flags |= TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF;\n    in_bytes = pStream->avail_in;\n    out_bytes = pStream->avail_out;\n    status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes,\n                              pStream->next_out, pStream->next_out, &out_bytes,\n                              decomp_flags);\n    pState->m_last_status = status;\n    pStream->next_in += (mz_uint)in_bytes;\n    pStream->avail_in -= (mz_uint)in_bytes;\n    pStream->total_in += (mz_uint)in_bytes;\n    pStream->adler = tinfl_get_adler32(&pState->m_decomp);\n    pStream->next_out += (mz_uint)out_bytes;\n    pStream->avail_out -= (mz_uint)out_bytes;\n    pStream->total_out += (mz_uint)out_bytes;\n\n    if (status < 0)\n      return MZ_DATA_ERROR;\n    else if (status != TINFL_STATUS_DONE) {\n      pState->m_last_status = TINFL_STATUS_FAILED;\n      return MZ_BUF_ERROR;\n    }\n    return MZ_STREAM_END;\n  }\n  // flush != MZ_FINISH then we must assume there's more input.\n  if (flush != MZ_FINISH) decomp_flags |= TINFL_FLAG_HAS_MORE_INPUT;\n\n  if (pState->m_dict_avail) {\n    n = MZ_MIN(pState->m_dict_avail, pStream->avail_out);\n    memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n);\n    pStream->next_out += n;\n    pStream->avail_out -= n;\n    pStream->total_out += n;\n    pState->m_dict_avail -= n;\n    pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1);\n    return ((pState->m_last_status == TINFL_STATUS_DONE) &&\n            (!pState->m_dict_avail))\n               ? MZ_STREAM_END\n               : MZ_OK;\n  }\n\n  for (;;) {\n    in_bytes = pStream->avail_in;\n    out_bytes = TINFL_LZ_DICT_SIZE - pState->m_dict_ofs;\n\n    status = tinfl_decompress(\n        &pState->m_decomp, pStream->next_in, &in_bytes, pState->m_dict,\n        pState->m_dict + pState->m_dict_ofs, &out_bytes, decomp_flags);\n    pState->m_last_status = status;\n\n    pStream->next_in += (mz_uint)in_bytes;\n    pStream->avail_in -= (mz_uint)in_bytes;\n    pStream->total_in += (mz_uint)in_bytes;\n    pStream->adler = tinfl_get_adler32(&pState->m_decomp);\n\n    pState->m_dict_avail = (mz_uint)out_bytes;\n\n    n = MZ_MIN(pState->m_dict_avail, pStream->avail_out);\n    memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n);\n    pStream->next_out += n;\n    pStream->avail_out -= n;\n    pStream->total_out += n;\n    pState->m_dict_avail -= n;\n    pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1);\n\n    if (status < 0)\n      return MZ_DATA_ERROR;  // Stream is corrupted (there could be some\n    // uncompressed data left in the output dictionary -\n    // oh well).\n    else if ((status == TINFL_STATUS_NEEDS_MORE_INPUT) && (!orig_avail_in))\n      return MZ_BUF_ERROR;  // Signal caller that we can't make forward progress\n                            // without supplying more input or by setting flush\n                            // to MZ_FINISH.\n    else if (flush == MZ_FINISH) {\n      // The output buffer MUST be large to hold the remaining uncompressed data\n      // when flush==MZ_FINISH.\n      if (status == TINFL_STATUS_DONE)\n        return pState->m_dict_avail ? MZ_BUF_ERROR : MZ_STREAM_END;\n      // status here must be TINFL_STATUS_HAS_MORE_OUTPUT, which means there's\n      // at least 1 more byte on the way. If there's no more room left in the\n      // output buffer then something is wrong.\n      else if (!pStream->avail_out)\n        return MZ_BUF_ERROR;\n    } else if ((status == TINFL_STATUS_DONE) || (!pStream->avail_in) ||\n               (!pStream->avail_out) || (pState->m_dict_avail))\n      break;\n  }\n\n  return ((status == TINFL_STATUS_DONE) && (!pState->m_dict_avail))\n             ? MZ_STREAM_END\n             : MZ_OK;\n}\n\nint mz_inflateEnd(mz_streamp pStream) {\n  if (!pStream) return MZ_STREAM_ERROR;\n  if (pStream->state) {\n    pStream->zfree(pStream->opaque, pStream->state);\n    pStream->state = NULL;\n  }\n  return MZ_OK;\n}\n\nint mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len,\n                  const unsigned char *pSource, mz_ulong source_len) {\n  mz_stream stream;\n  int status;\n  memset(&stream, 0, sizeof(stream));\n\n  // In case mz_ulong is 64-bits (argh I hate longs).\n  if ((source_len | *pDest_len) > 0xFFFFFFFFU) return MZ_PARAM_ERROR;\n\n  stream.next_in = pSource;\n  stream.avail_in = (mz_uint32)source_len;\n  stream.next_out = pDest;\n  stream.avail_out = (mz_uint32)*pDest_len;\n\n  status = mz_inflateInit(&stream);\n  if (status != MZ_OK) return status;\n\n  status = mz_inflate(&stream, MZ_FINISH);\n  if (status != MZ_STREAM_END) {\n    mz_inflateEnd(&stream);\n    return ((status == MZ_BUF_ERROR) && (!stream.avail_in)) ? MZ_DATA_ERROR\n                                                            : status;\n  }\n  *pDest_len = stream.total_out;\n\n  return mz_inflateEnd(&stream);\n}\n\nconst char *mz_error(int err) {\n  static struct {\n    int m_err;\n    const char *m_pDesc;\n  } s_error_descs[] = {{MZ_OK, \"\"},\n                       {MZ_STREAM_END, \"stream end\"},\n                       {MZ_NEED_DICT, \"need dictionary\"},\n                       {MZ_ERRNO, \"file error\"},\n                       {MZ_STREAM_ERROR, \"stream error\"},\n                       {MZ_DATA_ERROR, \"data error\"},\n                       {MZ_MEM_ERROR, \"out of memory\"},\n                       {MZ_BUF_ERROR, \"buf error\"},\n                       {MZ_VERSION_ERROR, \"version error\"},\n                       {MZ_PARAM_ERROR, \"parameter error\"}};\n  mz_uint i;\n  for (i = 0; i < sizeof(s_error_descs) / sizeof(s_error_descs[0]); ++i)\n    if (s_error_descs[i].m_err == err) return s_error_descs[i].m_pDesc;\n  return NULL;\n}\n\n#endif  // MINIZ_NO_ZLIB_APIS\n\n// ------------------- Low-level Decompression (completely independent from all\n// compression API's)\n\n#define TINFL_MEMCPY(d, s, l) memcpy(d, s, l)\n#define TINFL_MEMSET(p, c, l) memset(p, c, l)\n\n#define TINFL_CR_BEGIN  \\\n  switch (r->m_state) { \\\n    case 0:\n#define TINFL_CR_RETURN(state_index, result) \\\n  do {                                       \\\n    status = result;                         \\\n    r->m_state = state_index;                \\\n    goto common_exit;                        \\\n    case state_index:;                       \\\n  }                                          \\\n  MZ_MACRO_END\n#define TINFL_CR_RETURN_FOREVER(state_index, result) \\\n  do {                                               \\\n    for (;;) {                                       \\\n      TINFL_CR_RETURN(state_index, result);          \\\n    }                                                \\\n  }                                                  \\\n  MZ_MACRO_END\n#define TINFL_CR_FINISH }\n\n// TODO: If the caller has indicated that there's no more input, and we attempt\n// to read beyond the input buf, then something is wrong with the input because\n// the inflator never\n// reads ahead more than it needs to. Currently TINFL_GET_BYTE() pads the end of\n// the stream with 0's in this scenario.\n#define TINFL_GET_BYTE(state_index, c)                                 \\\n  do {                                                                 \\\n    if (pIn_buf_cur >= pIn_buf_end) {                                  \\\n      for (;;) {                                                       \\\n        if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) {                \\\n          TINFL_CR_RETURN(state_index, TINFL_STATUS_NEEDS_MORE_INPUT); \\\n          if (pIn_buf_cur < pIn_buf_end) {                             \\\n            c = *pIn_buf_cur++;                                        \\\n            break;                                                     \\\n          }                                                            \\\n        } else {                                                       \\\n          c = 0;                                                       \\\n          break;                                                       \\\n        }                                                              \\\n      }                                                                \\\n    } else                                                             \\\n      c = *pIn_buf_cur++;                                              \\\n  }                                                                    \\\n  MZ_MACRO_END\n\n#define TINFL_NEED_BITS(state_index, n)            \\\n  do {                                             \\\n    mz_uint c;                                     \\\n    TINFL_GET_BYTE(state_index, c);                \\\n    bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); \\\n    num_bits += 8;                                 \\\n  } while (num_bits < (mz_uint)(n))\n#define TINFL_SKIP_BITS(state_index, n) \\\n  do {                                  \\\n    if (num_bits < (mz_uint)(n)) {      \\\n      TINFL_NEED_BITS(state_index, n);  \\\n    }                                   \\\n    bit_buf >>= (n);                    \\\n    num_bits -= (n);                    \\\n  }                                     \\\n  MZ_MACRO_END\n#define TINFL_GET_BITS(state_index, b, n) \\\n  do {                                    \\\n    if (num_bits < (mz_uint)(n)) {        \\\n      TINFL_NEED_BITS(state_index, n);    \\\n    }                                     \\\n    b = bit_buf & ((1 << (n)) - 1);       \\\n    bit_buf >>= (n);                      \\\n    num_bits -= (n);                      \\\n  }                                       \\\n  MZ_MACRO_END\n\n// TINFL_HUFF_BITBUF_FILL() is only used rarely, when the number of bytes\n// remaining in the input buffer falls below 2.\n// It reads just enough bytes from the input stream that are needed to decode\n// the next Huffman code (and absolutely no more). It works by trying to fully\n// decode a\n// Huffman code by using whatever bits are currently present in the bit buffer.\n// If this fails, it reads another byte, and tries again until it succeeds or\n// until the\n// bit buffer contains >=15 bits (deflate's max. Huffman code size).\n#define TINFL_HUFF_BITBUF_FILL(state_index, pHuff)                     \\\n  do {                                                                 \\\n    temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \\\n    if (temp >= 0) {                                                   \\\n      code_len = temp >> 9;                                            \\\n      if ((code_len) && (num_bits >= code_len)) break;                 \\\n    } else if (num_bits > TINFL_FAST_LOOKUP_BITS) {                    \\\n      code_len = TINFL_FAST_LOOKUP_BITS;                               \\\n      do {                                                             \\\n        temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \\\n      } while ((temp < 0) && (num_bits >= (code_len + 1)));            \\\n      if (temp >= 0) break;                                            \\\n    }                                                                  \\\n    TINFL_GET_BYTE(state_index, c);                                    \\\n    bit_buf |= (((tinfl_bit_buf_t)c) << num_bits);                     \\\n    num_bits += 8;                                                     \\\n  } while (num_bits < 15);\n\n// TINFL_HUFF_DECODE() decodes the next Huffman coded symbol. It's more complex\n// than you would initially expect because the zlib API expects the decompressor\n// to never read\n// beyond the final byte of the deflate stream. (In other words, when this macro\n// wants to read another byte from the input, it REALLY needs another byte in\n// order to fully\n// decode the next Huffman code.) Handling this properly is particularly\n// important on raw deflate (non-zlib) streams, which aren't followed by a byte\n// aligned adler-32.\n// The slow path is only executed at the very end of the input buffer.\n#define TINFL_HUFF_DECODE(state_index, sym, pHuff)                             \\\n  do {                                                                         \\\n    int temp;                                                                  \\\n    mz_uint code_len, c;                                                       \\\n    if (num_bits < 15) {                                                       \\\n      if ((pIn_buf_end - pIn_buf_cur) < 2) {                                   \\\n        TINFL_HUFF_BITBUF_FILL(state_index, pHuff);                            \\\n      } else {                                                                 \\\n        bit_buf |= (((tinfl_bit_buf_t)pIn_buf_cur[0]) << num_bits) |           \\\n                   (((tinfl_bit_buf_t)pIn_buf_cur[1]) << (num_bits + 8));      \\\n        pIn_buf_cur += 2;                                                      \\\n        num_bits += 16;                                                        \\\n      }                                                                        \\\n    }                                                                          \\\n    if ((temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= \\\n        0)                                                                     \\\n      code_len = temp >> 9, temp &= 511;                                       \\\n    else {                                                                     \\\n      code_len = TINFL_FAST_LOOKUP_BITS;                                       \\\n      do {                                                                     \\\n        temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)];         \\\n      } while (temp < 0);                                                      \\\n    }                                                                          \\\n    sym = temp;                                                                \\\n    bit_buf >>= code_len;                                                      \\\n    num_bits -= code_len;                                                      \\\n  }                                                                            \\\n  MZ_MACRO_END\n\ntinfl_status tinfl_decompress(tinfl_decompressor *r,\n                              const mz_uint8 *pIn_buf_next,\n                              size_t *pIn_buf_size, mz_uint8 *pOut_buf_start,\n                              mz_uint8 *pOut_buf_next, size_t *pOut_buf_size,\n                              const mz_uint32 decomp_flags) {\n  static const int s_length_base[31] = {\n      3,  4,  5,  6,  7,  8,  9,  10,  11,  13,  15,  17,  19,  23, 27, 31,\n      35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0,  0};\n  static const int s_length_extra[31] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,\n                                         1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4,\n                                         4, 4, 5, 5, 5, 5, 0, 0, 0};\n  static const int s_dist_base[32] = {\n      1,    2,    3,    4,    5,    7,     9,     13,    17,  25,   33,\n      49,   65,   97,   129,  193,  257,   385,   513,   769, 1025, 1537,\n      2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0,   0};\n  static const int s_dist_extra[32] = {0, 0, 0,  0,  1,  1,  2,  2,  3,  3,\n                                       4, 4, 5,  5,  6,  6,  7,  7,  8,  8,\n                                       9, 9, 10, 10, 11, 11, 12, 12, 13, 13};\n  static const mz_uint8 s_length_dezigzag[19] = {\n      16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};\n  static const int s_min_table_sizes[3] = {257, 1, 4};\n\n  tinfl_status status = TINFL_STATUS_FAILED;\n  mz_uint32 num_bits, dist, counter, num_extra;\n  tinfl_bit_buf_t bit_buf;\n  const mz_uint8 *pIn_buf_cur = pIn_buf_next, *const pIn_buf_end =\n                                                  pIn_buf_next + *pIn_buf_size;\n  mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end =\n                                              pOut_buf_next + *pOut_buf_size;\n  size_t out_buf_size_mask =\n             (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)\n                 ? (size_t)-1\n                 : ((pOut_buf_next - pOut_buf_start) + *pOut_buf_size) - 1,\n         dist_from_out_buf_start;\n\n  // Ensure the output buffer's size is a power of 2, unless the output buffer\n  // is large enough to hold the entire output file (in which case it doesn't\n  // matter).\n  if (((out_buf_size_mask + 1) & out_buf_size_mask) ||\n      (pOut_buf_next < pOut_buf_start)) {\n    *pIn_buf_size = *pOut_buf_size = 0;\n    return TINFL_STATUS_BAD_PARAM;\n  }\n\n  num_bits = r->m_num_bits;\n  bit_buf = r->m_bit_buf;\n  dist = r->m_dist;\n  counter = r->m_counter;\n  num_extra = r->m_num_extra;\n  dist_from_out_buf_start = r->m_dist_from_out_buf_start;\n  TINFL_CR_BEGIN\n\n  bit_buf = num_bits = dist = counter = num_extra = r->m_zhdr0 = r->m_zhdr1 = 0;\n  r->m_z_adler32 = r->m_check_adler32 = 1;\n  if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) {\n    TINFL_GET_BYTE(1, r->m_zhdr0);\n    TINFL_GET_BYTE(2, r->m_zhdr1);\n    counter = (((r->m_zhdr0 * 256 + r->m_zhdr1) % 31 != 0) ||\n               (r->m_zhdr1 & 32) || ((r->m_zhdr0 & 15) != 8));\n    if (!(decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF))\n      counter |= (((1U << (8U + (r->m_zhdr0 >> 4))) > 32768U) ||\n                  ((out_buf_size_mask + 1) <\n                   (size_t)(1ULL << (8U + (r->m_zhdr0 >> 4)))));\n    if (counter) {\n      TINFL_CR_RETURN_FOREVER(36, TINFL_STATUS_FAILED);\n    }\n  }\n\n  do {\n    TINFL_GET_BITS(3, r->m_final, 3);\n    r->m_type = r->m_final >> 1;\n    if (r->m_type == 0) {\n      TINFL_SKIP_BITS(5, num_bits & 7);\n      for (counter = 0; counter < 4; ++counter) {\n        if (num_bits)\n          TINFL_GET_BITS(6, r->m_raw_header[counter], 8);\n        else\n          TINFL_GET_BYTE(7, r->m_raw_header[counter]);\n      }\n      if ((counter = (r->m_raw_header[0] | (r->m_raw_header[1] << 8))) !=\n          (mz_uint)(0xFFFF ^\n                    (r->m_raw_header[2] | (r->m_raw_header[3] << 8)))) {\n        TINFL_CR_RETURN_FOREVER(39, TINFL_STATUS_FAILED);\n      }\n      while ((counter) && (num_bits)) {\n        TINFL_GET_BITS(51, dist, 8);\n        while (pOut_buf_cur >= pOut_buf_end) {\n          TINFL_CR_RETURN(52, TINFL_STATUS_HAS_MORE_OUTPUT);\n        }\n        *pOut_buf_cur++ = (mz_uint8)dist;\n        counter--;\n      }\n      while (counter) {\n        size_t n;\n        while (pOut_buf_cur >= pOut_buf_end) {\n          TINFL_CR_RETURN(9, TINFL_STATUS_HAS_MORE_OUTPUT);\n        }\n        while (pIn_buf_cur >= pIn_buf_end) {\n          if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) {\n            TINFL_CR_RETURN(38, TINFL_STATUS_NEEDS_MORE_INPUT);\n          } else {\n            TINFL_CR_RETURN_FOREVER(40, TINFL_STATUS_FAILED);\n          }\n        }\n        n = MZ_MIN(MZ_MIN((size_t)(pOut_buf_end - pOut_buf_cur),\n                          (size_t)(pIn_buf_end - pIn_buf_cur)),\n                   counter);\n        TINFL_MEMCPY(pOut_buf_cur, pIn_buf_cur, n);\n        pIn_buf_cur += n;\n        pOut_buf_cur += n;\n        counter -= (mz_uint)n;\n      }\n    } else if (r->m_type == 3) {\n      TINFL_CR_RETURN_FOREVER(10, TINFL_STATUS_FAILED);\n    } else {\n      if (r->m_type == 1) {\n        mz_uint8 *p = r->m_tables[0].m_code_size;\n        mz_uint i;\n        r->m_table_sizes[0] = 288;\n        r->m_table_sizes[1] = 32;\n        TINFL_MEMSET(r->m_tables[1].m_code_size, 5, 32);\n        for (i = 0; i <= 143; ++i) *p++ = 8;\n        for (; i <= 255; ++i) *p++ = 9;\n        for (; i <= 279; ++i) *p++ = 7;\n        for (; i <= 287; ++i) *p++ = 8;\n      } else {\n        for (counter = 0; counter < 3; counter++) {\n          TINFL_GET_BITS(11, r->m_table_sizes[counter], \"\\05\\05\\04\"[counter]);\n          r->m_table_sizes[counter] += s_min_table_sizes[counter];\n        }\n        MZ_CLEAR_OBJ(r->m_tables[2].m_code_size);\n        for (counter = 0; counter < r->m_table_sizes[2]; counter++) {\n          mz_uint s;\n          TINFL_GET_BITS(14, s, 3);\n          r->m_tables[2].m_code_size[s_length_dezigzag[counter]] = (mz_uint8)s;\n        }\n        r->m_table_sizes[2] = 19;\n      }\n      for (; (int)r->m_type >= 0; r->m_type--) {\n        int tree_next, tree_cur;\n        tinfl_huff_table *pTable;\n        mz_uint i, j, used_syms, total, sym_index, next_code[17],\n            total_syms[16];\n        pTable = &r->m_tables[r->m_type];\n        MZ_CLEAR_OBJ(total_syms);\n        MZ_CLEAR_OBJ(pTable->m_look_up);\n        MZ_CLEAR_OBJ(pTable->m_tree);\n        for (i = 0; i < r->m_table_sizes[r->m_type]; ++i)\n          total_syms[pTable->m_code_size[i]]++;\n        used_syms = 0, total = 0;\n        next_code[0] = next_code[1] = 0;\n        for (i = 1; i <= 15; ++i) {\n          used_syms += total_syms[i];\n          next_code[i + 1] = (total = ((total + total_syms[i]) << 1));\n        }\n        if ((65536 != total) && (used_syms > 1)) {\n          TINFL_CR_RETURN_FOREVER(35, TINFL_STATUS_FAILED);\n        }\n        for (tree_next = -1, sym_index = 0;\n             sym_index < r->m_table_sizes[r->m_type]; ++sym_index) {\n          mz_uint rev_code = 0, l, cur_code,\n                  code_size = pTable->m_code_size[sym_index];\n          if (!code_size) continue;\n          cur_code = next_code[code_size]++;\n          for (l = code_size; l > 0; l--, cur_code >>= 1)\n            rev_code = (rev_code << 1) | (cur_code & 1);\n          if (code_size <= TINFL_FAST_LOOKUP_BITS) {\n            mz_int16 k = (mz_int16)((code_size << 9) | sym_index);\n            while (rev_code < TINFL_FAST_LOOKUP_SIZE) {\n              pTable->m_look_up[rev_code] = k;\n              rev_code += (1 << code_size);\n            }\n            continue;\n          }\n          if (0 ==\n              (tree_cur = pTable->m_look_up[rev_code &\n                                            (TINFL_FAST_LOOKUP_SIZE - 1)])) {\n            pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)] =\n                (mz_int16)tree_next;\n            tree_cur = tree_next;\n            tree_next -= 2;\n          }\n          rev_code >>= (TINFL_FAST_LOOKUP_BITS - 1);\n          for (j = code_size; j > (TINFL_FAST_LOOKUP_BITS + 1); j--) {\n            tree_cur -= ((rev_code >>= 1) & 1);\n            if (!pTable->m_tree[-tree_cur - 1]) {\n              pTable->m_tree[-tree_cur - 1] = (mz_int16)tree_next;\n              tree_cur = tree_next;\n              tree_next -= 2;\n            } else\n              tree_cur = pTable->m_tree[-tree_cur - 1];\n          }\n          tree_cur -= ((rev_code >>= 1) & 1);\n          pTable->m_tree[-tree_cur - 1] = (mz_int16)sym_index;\n        }\n        if (r->m_type == 2) {\n          for (counter = 0;\n               counter < (r->m_table_sizes[0] + r->m_table_sizes[1]);) {\n            mz_uint s;\n            TINFL_HUFF_DECODE(16, dist, &r->m_tables[2]);\n            if (dist < 16) {\n              r->m_len_codes[counter++] = (mz_uint8)dist;\n              continue;\n            }\n            if ((dist == 16) && (!counter)) {\n              TINFL_CR_RETURN_FOREVER(17, TINFL_STATUS_FAILED);\n            }\n            num_extra = \"\\02\\03\\07\"[dist - 16];\n            TINFL_GET_BITS(18, s, num_extra);\n            s += \"\\03\\03\\013\"[dist - 16];\n            TINFL_MEMSET(r->m_len_codes + counter,\n                         (dist == 16) ? r->m_len_codes[counter - 1] : 0, s);\n            counter += s;\n          }\n          if ((r->m_table_sizes[0] + r->m_table_sizes[1]) != counter) {\n            TINFL_CR_RETURN_FOREVER(21, TINFL_STATUS_FAILED);\n          }\n          TINFL_MEMCPY(r->m_tables[0].m_code_size, r->m_len_codes,\n                       r->m_table_sizes[0]);\n          TINFL_MEMCPY(r->m_tables[1].m_code_size,\n                       r->m_len_codes + r->m_table_sizes[0],\n                       r->m_table_sizes[1]);\n        }\n      }\n      for (;;) {\n        mz_uint8 *pSrc;\n        for (;;) {\n          if (((pIn_buf_end - pIn_buf_cur) < 4) ||\n              ((pOut_buf_end - pOut_buf_cur) < 2)) {\n            TINFL_HUFF_DECODE(23, counter, &r->m_tables[0]);\n            if (counter >= 256) break;\n            while (pOut_buf_cur >= pOut_buf_end) {\n              TINFL_CR_RETURN(24, TINFL_STATUS_HAS_MORE_OUTPUT);\n            }\n            *pOut_buf_cur++ = (mz_uint8)counter;\n          } else {\n            int sym2;\n            mz_uint code_len;\n#if TINFL_USE_64BIT_BITBUF\n            if (num_bits < 30) {\n              bit_buf |=\n                  (((tinfl_bit_buf_t)MZ_READ_LE32(pIn_buf_cur)) << num_bits);\n              pIn_buf_cur += 4;\n              num_bits += 32;\n            }\n#else\n            if (num_bits < 15) {\n              bit_buf |=\n                  (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits);\n              pIn_buf_cur += 2;\n              num_bits += 16;\n            }\n#endif\n            if ((sym2 =\n                     r->m_tables[0]\n                         .m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >=\n                0)\n              code_len = sym2 >> 9;\n            else {\n              code_len = TINFL_FAST_LOOKUP_BITS;\n              do {\n                sym2 = r->m_tables[0]\n                           .m_tree[~sym2 + ((bit_buf >> code_len++) & 1)];\n              } while (sym2 < 0);\n            }\n            counter = sym2;\n            bit_buf >>= code_len;\n            num_bits -= code_len;\n            if (counter & 256) break;\n\n#if !TINFL_USE_64BIT_BITBUF\n            if (num_bits < 15) {\n              bit_buf |=\n                  (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits);\n              pIn_buf_cur += 2;\n              num_bits += 16;\n            }\n#endif\n            if ((sym2 =\n                     r->m_tables[0]\n                         .m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >=\n                0)\n              code_len = sym2 >> 9;\n            else {\n              code_len = TINFL_FAST_LOOKUP_BITS;\n              do {\n                sym2 = r->m_tables[0]\n                           .m_tree[~sym2 + ((bit_buf >> code_len++) & 1)];\n              } while (sym2 < 0);\n            }\n            bit_buf >>= code_len;\n            num_bits -= code_len;\n\n            pOut_buf_cur[0] = (mz_uint8)counter;\n            if (sym2 & 256) {\n              pOut_buf_cur++;\n              counter = sym2;\n              break;\n            }\n            pOut_buf_cur[1] = (mz_uint8)sym2;\n            pOut_buf_cur += 2;\n          }\n        }\n        if ((counter &= 511) == 256) break;\n\n        num_extra = s_length_extra[counter - 257];\n        counter = s_length_base[counter - 257];\n        if (num_extra) {\n          mz_uint extra_bits;\n          TINFL_GET_BITS(25, extra_bits, num_extra);\n          counter += extra_bits;\n        }\n\n        TINFL_HUFF_DECODE(26, dist, &r->m_tables[1]);\n        num_extra = s_dist_extra[dist];\n        dist = s_dist_base[dist];\n        if (num_extra) {\n          mz_uint extra_bits;\n          TINFL_GET_BITS(27, extra_bits, num_extra);\n          dist += extra_bits;\n        }\n\n        dist_from_out_buf_start = pOut_buf_cur - pOut_buf_start;\n        if ((dist > dist_from_out_buf_start) &&\n            (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) {\n          TINFL_CR_RETURN_FOREVER(37, TINFL_STATUS_FAILED);\n        }\n\n        pSrc = pOut_buf_start +\n               ((dist_from_out_buf_start - dist) & out_buf_size_mask);\n\n        if ((MZ_MAX(pOut_buf_cur, pSrc) + counter) > pOut_buf_end) {\n          while (counter--) {\n            while (pOut_buf_cur >= pOut_buf_end) {\n              TINFL_CR_RETURN(53, TINFL_STATUS_HAS_MORE_OUTPUT);\n            }\n            *pOut_buf_cur++ =\n                pOut_buf_start[(dist_from_out_buf_start++ - dist) &\n                               out_buf_size_mask];\n          }\n          continue;\n        }\n#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES\n        else if ((counter >= 9) && (counter <= dist)) {\n          const mz_uint8 *pSrc_end = pSrc + (counter & ~7);\n          do {\n            ((mz_uint32 *)pOut_buf_cur)[0] = ((const mz_uint32 *)pSrc)[0];\n            ((mz_uint32 *)pOut_buf_cur)[1] = ((const mz_uint32 *)pSrc)[1];\n            pOut_buf_cur += 8;\n          } while ((pSrc += 8) < pSrc_end);\n          if ((counter &= 7) < 3) {\n            if (counter) {\n              pOut_buf_cur[0] = pSrc[0];\n              if (counter > 1) pOut_buf_cur[1] = pSrc[1];\n              pOut_buf_cur += counter;\n            }\n            continue;\n          }\n        }\n#endif\n        do {\n          pOut_buf_cur[0] = pSrc[0];\n          pOut_buf_cur[1] = pSrc[1];\n          pOut_buf_cur[2] = pSrc[2];\n          pOut_buf_cur += 3;\n          pSrc += 3;\n        } while ((int)(counter -= 3) > 2);\n        if ((int)counter > 0) {\n          pOut_buf_cur[0] = pSrc[0];\n          if ((int)counter > 1) pOut_buf_cur[1] = pSrc[1];\n          pOut_buf_cur += counter;\n        }\n      }\n    }\n  } while (!(r->m_final & 1));\n  if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) {\n    TINFL_SKIP_BITS(32, num_bits & 7);\n    for (counter = 0; counter < 4; ++counter) {\n      mz_uint s;\n      if (num_bits)\n        TINFL_GET_BITS(41, s, 8);\n      else\n        TINFL_GET_BYTE(42, s);\n      r->m_z_adler32 = (r->m_z_adler32 << 8) | s;\n    }\n  }\n  TINFL_CR_RETURN_FOREVER(34, TINFL_STATUS_DONE);\n  TINFL_CR_FINISH\n\ncommon_exit:\n  r->m_num_bits = num_bits;\n  r->m_bit_buf = bit_buf;\n  r->m_dist = dist;\n  r->m_counter = counter;\n  r->m_num_extra = num_extra;\n  r->m_dist_from_out_buf_start = dist_from_out_buf_start;\n  *pIn_buf_size = pIn_buf_cur - pIn_buf_next;\n  *pOut_buf_size = pOut_buf_cur - pOut_buf_next;\n  if ((decomp_flags &\n       (TINFL_FLAG_PARSE_ZLIB_HEADER | TINFL_FLAG_COMPUTE_ADLER32)) &&\n      (status >= 0)) {\n    const mz_uint8 *ptr = pOut_buf_next;\n    size_t buf_len = *pOut_buf_size;\n    mz_uint32 i, s1 = r->m_check_adler32 & 0xffff,\n                 s2 = r->m_check_adler32 >> 16;\n    size_t block_len = buf_len % 5552;\n    while (buf_len) {\n      for (i = 0; i + 7 < block_len; i += 8, ptr += 8) {\n        s1 += ptr[0], s2 += s1;\n        s1 += ptr[1], s2 += s1;\n        s1 += ptr[2], s2 += s1;\n        s1 += ptr[3], s2 += s1;\n        s1 += ptr[4], s2 += s1;\n        s1 += ptr[5], s2 += s1;\n        s1 += ptr[6], s2 += s1;\n        s1 += ptr[7], s2 += s1;\n      }\n      for (; i < block_len; ++i) s1 += *ptr++, s2 += s1;\n      s1 %= 65521U, s2 %= 65521U;\n      buf_len -= block_len;\n      block_len = 5552;\n    }\n    r->m_check_adler32 = (s2 << 16) + s1;\n    if ((status == TINFL_STATUS_DONE) &&\n        (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) &&\n        (r->m_check_adler32 != r->m_z_adler32))\n      status = TINFL_STATUS_ADLER32_MISMATCH;\n  }\n  return status;\n}\n\n// Higher level helper functions.\nvoid *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len,\n                                   size_t *pOut_len, int flags) {\n  tinfl_decompressor decomp;\n  void *pBuf = NULL, *pNew_buf;\n  size_t src_buf_ofs = 0, out_buf_capacity = 0;\n  *pOut_len = 0;\n  tinfl_init(&decomp);\n  for (;;) {\n    size_t src_buf_size = src_buf_len - src_buf_ofs,\n           dst_buf_size = out_buf_capacity - *pOut_len, new_out_buf_capacity;\n    tinfl_status status = tinfl_decompress(\n        &decomp, (const mz_uint8 *)pSrc_buf + src_buf_ofs, &src_buf_size,\n        (mz_uint8 *)pBuf, pBuf ? (mz_uint8 *)pBuf + *pOut_len : NULL,\n        &dst_buf_size,\n        (flags & ~TINFL_FLAG_HAS_MORE_INPUT) |\n            TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF);\n    if ((status < 0) || (status == TINFL_STATUS_NEEDS_MORE_INPUT)) {\n      MZ_FREE(pBuf);\n      *pOut_len = 0;\n      return NULL;\n    }\n    src_buf_ofs += src_buf_size;\n    *pOut_len += dst_buf_size;\n    if (status == TINFL_STATUS_DONE) break;\n    new_out_buf_capacity = out_buf_capacity * 2;\n    if (new_out_buf_capacity < 128) new_out_buf_capacity = 128;\n    pNew_buf = MZ_REALLOC(pBuf, new_out_buf_capacity);\n    if (!pNew_buf) {\n      MZ_FREE(pBuf);\n      *pOut_len = 0;\n      return NULL;\n    }\n    pBuf = pNew_buf;\n    out_buf_capacity = new_out_buf_capacity;\n  }\n  return pBuf;\n}\n\nsize_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len,\n                                   const void *pSrc_buf, size_t src_buf_len,\n                                   int flags) {\n  tinfl_decompressor decomp;\n  tinfl_status status;\n  tinfl_init(&decomp);\n  status =\n      tinfl_decompress(&decomp, (const mz_uint8 *)pSrc_buf, &src_buf_len,\n                       (mz_uint8 *)pOut_buf, (mz_uint8 *)pOut_buf, &out_buf_len,\n                       (flags & ~TINFL_FLAG_HAS_MORE_INPUT) |\n                           TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF);\n  return (status != TINFL_STATUS_DONE) ? TINFL_DECOMPRESS_MEM_TO_MEM_FAILED\n                                       : out_buf_len;\n}\n\nint tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size,\n                                     tinfl_put_buf_func_ptr pPut_buf_func,\n                                     void *pPut_buf_user, int flags) {\n  int result = 0;\n  tinfl_decompressor decomp;\n  mz_uint8 *pDict = (mz_uint8 *)MZ_MALLOC(TINFL_LZ_DICT_SIZE);\n  size_t in_buf_ofs = 0, dict_ofs = 0;\n  if (!pDict) return TINFL_STATUS_FAILED;\n  tinfl_init(&decomp);\n  for (;;) {\n    size_t in_buf_size = *pIn_buf_size - in_buf_ofs,\n           dst_buf_size = TINFL_LZ_DICT_SIZE - dict_ofs;\n    tinfl_status status =\n        tinfl_decompress(&decomp, (const mz_uint8 *)pIn_buf + in_buf_ofs,\n                         &in_buf_size, pDict, pDict + dict_ofs, &dst_buf_size,\n                         (flags & ~(TINFL_FLAG_HAS_MORE_INPUT |\n                                    TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)));\n    in_buf_ofs += in_buf_size;\n    if ((dst_buf_size) &&\n        (!(*pPut_buf_func)(pDict + dict_ofs, (int)dst_buf_size, pPut_buf_user)))\n      break;\n    if (status != TINFL_STATUS_HAS_MORE_OUTPUT) {\n      result = (status == TINFL_STATUS_DONE);\n      break;\n    }\n    dict_ofs = (dict_ofs + dst_buf_size) & (TINFL_LZ_DICT_SIZE - 1);\n  }\n  MZ_FREE(pDict);\n  *pIn_buf_size = in_buf_ofs;\n  return result;\n}\n\n// ------------------- Low-level Compression (independent from all decompression\n// API's)\n\n// Purposely making these tables static for faster init and thread safety.\nstatic const mz_uint16 s_tdefl_len_sym[256] = {\n    257, 258, 259, 260, 261, 262, 263, 264, 265, 265, 266, 266, 267, 267, 268,\n    268, 269, 269, 269, 269, 270, 270, 270, 270, 271, 271, 271, 271, 272, 272,\n    272, 272, 273, 273, 273, 273, 273, 273, 273, 273, 274, 274, 274, 274, 274,\n    274, 274, 274, 275, 275, 275, 275, 275, 275, 275, 275, 276, 276, 276, 276,\n    276, 276, 276, 276, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,\n    277, 277, 277, 277, 277, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278,\n    278, 278, 278, 278, 278, 278, 279, 279, 279, 279, 279, 279, 279, 279, 279,\n    279, 279, 279, 279, 279, 279, 279, 280, 280, 280, 280, 280, 280, 280, 280,\n    280, 280, 280, 280, 280, 280, 280, 280, 281, 281, 281, 281, 281, 281, 281,\n    281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,\n    281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 282, 282, 282, 282, 282,\n    282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282,\n    282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 283, 283, 283,\n    283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,\n    283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 284,\n    284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284,\n    284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284,\n    285};\n\nstatic const mz_uint8 s_tdefl_len_extra[256] = {\n    0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,\n    2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0};\n\nstatic const mz_uint8 s_tdefl_small_dist_sym[512] = {\n    0,  1,  2,  3,  4,  4,  5,  5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,  8,\n    8,  8,  8,  8,  8,  9,  9,  9,  9,  9,  9,  9,  9,  10, 10, 10, 10, 10, 10,\n    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11,\n    11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,\n    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,\n    12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,\n    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,\n    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,\n    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,\n    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,\n    14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,\n    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,\n    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,\n    15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n    16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,\n    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17};\n\nstatic const mz_uint8 s_tdefl_small_dist_extra[512] = {\n    0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n    3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n    6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7};\n\nstatic const mz_uint8 s_tdefl_large_dist_sym[128] = {\n    0,  0,  18, 19, 20, 20, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24,\n    24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26,\n    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27,\n    27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n    28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29};\n\nstatic const mz_uint8 s_tdefl_large_dist_extra[128] = {\n    0,  0,  8,  8,  9,  9,  9,  9,  10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11,\n    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12,\n    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,\n    12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,\n    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,\n    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,\n    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13};\n\n// Radix sorts tdefl_sym_freq[] array by 16-bit key m_key. Returns ptr to sorted\n// values.\ntypedef struct {\n  mz_uint16 m_key, m_sym_index;\n} tdefl_sym_freq;\nstatic tdefl_sym_freq *tdefl_radix_sort_syms(mz_uint num_syms,\n                                             tdefl_sym_freq *pSyms0,\n                                             tdefl_sym_freq *pSyms1) {\n  mz_uint32 total_passes = 2, pass_shift, pass, i, hist[256 * 2];\n  tdefl_sym_freq *pCur_syms = pSyms0, *pNew_syms = pSyms1;\n  MZ_CLEAR_OBJ(hist);\n  for (i = 0; i < num_syms; i++) {\n    mz_uint freq = pSyms0[i].m_key;\n    hist[freq & 0xFF]++;\n    hist[256 + ((freq >> 8) & 0xFF)]++;\n  }\n  while ((total_passes > 1) && (num_syms == hist[(total_passes - 1) * 256]))\n    total_passes--;\n  for (pass_shift = 0, pass = 0; pass < total_passes; pass++, pass_shift += 8) {\n    const mz_uint32 *pHist = &hist[pass << 8];\n    mz_uint offsets[256], cur_ofs = 0;\n    for (i = 0; i < 256; i++) {\n      offsets[i] = cur_ofs;\n      cur_ofs += pHist[i];\n    }\n    for (i = 0; i < num_syms; i++)\n      pNew_syms[offsets[(pCur_syms[i].m_key >> pass_shift) & 0xFF]++] =\n          pCur_syms[i];\n    {\n      tdefl_sym_freq *t = pCur_syms;\n      pCur_syms = pNew_syms;\n      pNew_syms = t;\n    }\n  }\n  return pCur_syms;\n}\n\n// tdefl_calculate_minimum_redundancy() originally written by: Alistair Moffat,\n// alistair@cs.mu.oz.au, Jyrki Katajainen, jyrki@diku.dk, November 1996.\nstatic void tdefl_calculate_minimum_redundancy(tdefl_sym_freq *A, int n) {\n  int root, leaf, next, avbl, used, dpth;\n  if (n == 0)\n    return;\n  else if (n == 1) {\n    A[0].m_key = 1;\n    return;\n  }\n  A[0].m_key += A[1].m_key;\n  root = 0;\n  leaf = 2;\n  for (next = 1; next < n - 1; next++) {\n    if (leaf >= n || A[root].m_key < A[leaf].m_key) {\n      A[next].m_key = A[root].m_key;\n      A[root++].m_key = (mz_uint16)next;\n    } else\n      A[next].m_key = A[leaf++].m_key;\n    if (leaf >= n || (root < next && A[root].m_key < A[leaf].m_key)) {\n      A[next].m_key = (mz_uint16)(A[next].m_key + A[root].m_key);\n      A[root++].m_key = (mz_uint16)next;\n    } else\n      A[next].m_key = (mz_uint16)(A[next].m_key + A[leaf++].m_key);\n  }\n  A[n - 2].m_key = 0;\n  for (next = n - 3; next >= 0; next--)\n    A[next].m_key = A[A[next].m_key].m_key + 1;\n  avbl = 1;\n  used = dpth = 0;\n  root = n - 2;\n  next = n - 1;\n  while (avbl > 0) {\n    while (root >= 0 && (int)A[root].m_key == dpth) {\n      used++;\n      root--;\n    }\n    while (avbl > used) {\n      A[next--].m_key = (mz_uint16)(dpth);\n      avbl--;\n    }\n    avbl = 2 * used;\n    dpth++;\n    used = 0;\n  }\n}\n\n// Limits canonical Huffman code table's max code size.\nenum { TDEFL_MAX_SUPPORTED_HUFF_CODESIZE = 32 };\nstatic void tdefl_huffman_enforce_max_code_size(int *pNum_codes,\n                                                int code_list_len,\n                                                int max_code_size) {\n  int i;\n  mz_uint32 total = 0;\n  if (code_list_len <= 1) return;\n  for (i = max_code_size + 1; i <= TDEFL_MAX_SUPPORTED_HUFF_CODESIZE; i++)\n    pNum_codes[max_code_size] += pNum_codes[i];\n  for (i = max_code_size; i > 0; i--)\n    total += (((mz_uint32)pNum_codes[i]) << (max_code_size - i));\n  while (total != (1UL << max_code_size)) {\n    pNum_codes[max_code_size]--;\n    for (i = max_code_size - 1; i > 0; i--)\n      if (pNum_codes[i]) {\n        pNum_codes[i]--;\n        pNum_codes[i + 1] += 2;\n        break;\n      }\n    total--;\n  }\n}\n\nstatic void tdefl_optimize_huffman_table(tdefl_compressor *d, int table_num,\n                                         int table_len, int code_size_limit,\n                                         int static_table) {\n  int i, j, l, num_codes[1 + TDEFL_MAX_SUPPORTED_HUFF_CODESIZE];\n  mz_uint next_code[TDEFL_MAX_SUPPORTED_HUFF_CODESIZE + 1];\n  MZ_CLEAR_OBJ(num_codes);\n  if (static_table) {\n    for (i = 0; i < table_len; i++)\n      num_codes[d->m_huff_code_sizes[table_num][i]]++;\n  } else {\n    tdefl_sym_freq syms0[TDEFL_MAX_HUFF_SYMBOLS], syms1[TDEFL_MAX_HUFF_SYMBOLS],\n        *pSyms;\n    int num_used_syms = 0;\n    const mz_uint16 *pSym_count = &d->m_huff_count[table_num][0];\n    for (i = 0; i < table_len; i++)\n      if (pSym_count[i]) {\n        syms0[num_used_syms].m_key = (mz_uint16)pSym_count[i];\n        syms0[num_used_syms++].m_sym_index = (mz_uint16)i;\n      }\n\n    pSyms = tdefl_radix_sort_syms(num_used_syms, syms0, syms1);\n    tdefl_calculate_minimum_redundancy(pSyms, num_used_syms);\n\n    for (i = 0; i < num_used_syms; i++) num_codes[pSyms[i].m_key]++;\n\n    tdefl_huffman_enforce_max_code_size(num_codes, num_used_syms,\n                                        code_size_limit);\n\n    MZ_CLEAR_OBJ(d->m_huff_code_sizes[table_num]);\n    MZ_CLEAR_OBJ(d->m_huff_codes[table_num]);\n    for (i = 1, j = num_used_syms; i <= code_size_limit; i++)\n      for (l = num_codes[i]; l > 0; l--)\n        d->m_huff_code_sizes[table_num][pSyms[--j].m_sym_index] = (mz_uint8)(i);\n  }\n\n  next_code[1] = 0;\n  for (j = 0, i = 2; i <= code_size_limit; i++)\n    next_code[i] = j = ((j + num_codes[i - 1]) << 1);\n\n  for (i = 0; i < table_len; i++) {\n    mz_uint rev_code = 0, code, code_size;\n    if ((code_size = d->m_huff_code_sizes[table_num][i]) == 0) continue;\n    code = next_code[code_size]++;\n    for (l = code_size; l > 0; l--, code >>= 1)\n      rev_code = (rev_code << 1) | (code & 1);\n    d->m_huff_codes[table_num][i] = (mz_uint16)rev_code;\n  }\n}\n\n#define TDEFL_PUT_BITS(b, l)                               \\\n  do {                                                     \\\n    mz_uint bits = b;                                      \\\n    mz_uint len = l;                                       \\\n    MZ_ASSERT(bits <= ((1U << len) - 1U));                 \\\n    d->m_bit_buffer |= (bits << d->m_bits_in);             \\\n    d->m_bits_in += len;                                   \\\n    while (d->m_bits_in >= 8) {                            \\\n      if (d->m_pOutput_buf < d->m_pOutput_buf_end)         \\\n        *d->m_pOutput_buf++ = (mz_uint8)(d->m_bit_buffer); \\\n      d->m_bit_buffer >>= 8;                               \\\n      d->m_bits_in -= 8;                                   \\\n    }                                                      \\\n  }                                                        \\\n  MZ_MACRO_END\n\n#define TDEFL_RLE_PREV_CODE_SIZE()                                        \\\n  {                                                                       \\\n    if (rle_repeat_count) {                                               \\\n      if (rle_repeat_count < 3) {                                         \\\n        d->m_huff_count[2][prev_code_size] = (mz_uint16)(                 \\\n            d->m_huff_count[2][prev_code_size] + rle_repeat_count);       \\\n        while (rle_repeat_count--)                                        \\\n          packed_code_sizes[num_packed_code_sizes++] = prev_code_size;    \\\n      } else {                                                            \\\n        d->m_huff_count[2][16] = (mz_uint16)(d->m_huff_count[2][16] + 1); \\\n        packed_code_sizes[num_packed_code_sizes++] = 16;                  \\\n        packed_code_sizes[num_packed_code_sizes++] =                      \\\n            (mz_uint8)(rle_repeat_count - 3);                             \\\n      }                                                                   \\\n      rle_repeat_count = 0;                                               \\\n    }                                                                     \\\n  }\n\n#define TDEFL_RLE_ZERO_CODE_SIZE()                                            \\\n  {                                                                           \\\n    if (rle_z_count) {                                                        \\\n      if (rle_z_count < 3) {                                                  \\\n        d->m_huff_count[2][0] =                                               \\\n            (mz_uint16)(d->m_huff_count[2][0] + rle_z_count);                 \\\n        while (rle_z_count--) packed_code_sizes[num_packed_code_sizes++] = 0; \\\n      } else if (rle_z_count <= 10) {                                         \\\n        d->m_huff_count[2][17] = (mz_uint16)(d->m_huff_count[2][17] + 1);     \\\n        packed_code_sizes[num_packed_code_sizes++] = 17;                      \\\n        packed_code_sizes[num_packed_code_sizes++] =                          \\\n            (mz_uint8)(rle_z_count - 3);                                      \\\n      } else {                                                                \\\n        d->m_huff_count[2][18] = (mz_uint16)(d->m_huff_count[2][18] + 1);     \\\n        packed_code_sizes[num_packed_code_sizes++] = 18;                      \\\n        packed_code_sizes[num_packed_code_sizes++] =                          \\\n            (mz_uint8)(rle_z_count - 11);                                     \\\n      }                                                                       \\\n      rle_z_count = 0;                                                        \\\n    }                                                                         \\\n  }\n\nstatic mz_uint8 s_tdefl_packed_code_size_syms_swizzle[] = {\n    16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};\n\nstatic void tdefl_start_dynamic_block(tdefl_compressor *d) {\n  int num_lit_codes, num_dist_codes, num_bit_lengths;\n  mz_uint i, total_code_sizes_to_pack, num_packed_code_sizes, rle_z_count,\n      rle_repeat_count, packed_code_sizes_index;\n  mz_uint8\n      code_sizes_to_pack[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1],\n      packed_code_sizes[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1],\n      prev_code_size = 0xFF;\n\n  d->m_huff_count[0][256] = 1;\n\n  tdefl_optimize_huffman_table(d, 0, TDEFL_MAX_HUFF_SYMBOLS_0, 15, MZ_FALSE);\n  tdefl_optimize_huffman_table(d, 1, TDEFL_MAX_HUFF_SYMBOLS_1, 15, MZ_FALSE);\n\n  for (num_lit_codes = 286; num_lit_codes > 257; num_lit_codes--)\n    if (d->m_huff_code_sizes[0][num_lit_codes - 1]) break;\n  for (num_dist_codes = 30; num_dist_codes > 1; num_dist_codes--)\n    if (d->m_huff_code_sizes[1][num_dist_codes - 1]) break;\n\n  memcpy(code_sizes_to_pack, &d->m_huff_code_sizes[0][0], num_lit_codes);\n  memcpy(code_sizes_to_pack + num_lit_codes, &d->m_huff_code_sizes[1][0],\n         num_dist_codes);\n  total_code_sizes_to_pack = num_lit_codes + num_dist_codes;\n  num_packed_code_sizes = 0;\n  rle_z_count = 0;\n  rle_repeat_count = 0;\n\n  memset(&d->m_huff_count[2][0], 0,\n         sizeof(d->m_huff_count[2][0]) * TDEFL_MAX_HUFF_SYMBOLS_2);\n  for (i = 0; i < total_code_sizes_to_pack; i++) {\n    mz_uint8 code_size = code_sizes_to_pack[i];\n    if (!code_size) {\n      TDEFL_RLE_PREV_CODE_SIZE();\n      if (++rle_z_count == 138) {\n        TDEFL_RLE_ZERO_CODE_SIZE();\n      }\n    } else {\n      TDEFL_RLE_ZERO_CODE_SIZE();\n      if (code_size != prev_code_size) {\n        TDEFL_RLE_PREV_CODE_SIZE();\n        d->m_huff_count[2][code_size] =\n            (mz_uint16)(d->m_huff_count[2][code_size] + 1);\n        packed_code_sizes[num_packed_code_sizes++] = code_size;\n      } else if (++rle_repeat_count == 6) {\n        TDEFL_RLE_PREV_CODE_SIZE();\n      }\n    }\n    prev_code_size = code_size;\n  }\n  if (rle_repeat_count) {\n    TDEFL_RLE_PREV_CODE_SIZE();\n  } else {\n    TDEFL_RLE_ZERO_CODE_SIZE();\n  }\n\n  tdefl_optimize_huffman_table(d, 2, TDEFL_MAX_HUFF_SYMBOLS_2, 7, MZ_FALSE);\n\n  TDEFL_PUT_BITS(2, 2);\n\n  TDEFL_PUT_BITS(num_lit_codes - 257, 5);\n  TDEFL_PUT_BITS(num_dist_codes - 1, 5);\n\n  for (num_bit_lengths = 18; num_bit_lengths >= 0; num_bit_lengths--)\n    if (d->m_huff_code_sizes\n            [2][s_tdefl_packed_code_size_syms_swizzle[num_bit_lengths]])\n      break;\n  num_bit_lengths = MZ_MAX(4, (num_bit_lengths + 1));\n  TDEFL_PUT_BITS(num_bit_lengths - 4, 4);\n  for (i = 0; (int)i < num_bit_lengths; i++)\n    TDEFL_PUT_BITS(\n        d->m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[i]], 3);\n\n  for (packed_code_sizes_index = 0;\n       packed_code_sizes_index < num_packed_code_sizes;) {\n    mz_uint code = packed_code_sizes[packed_code_sizes_index++];\n    MZ_ASSERT(code < TDEFL_MAX_HUFF_SYMBOLS_2);\n    TDEFL_PUT_BITS(d->m_huff_codes[2][code], d->m_huff_code_sizes[2][code]);\n    if (code >= 16)\n      TDEFL_PUT_BITS(packed_code_sizes[packed_code_sizes_index++],\n                     \"\\02\\03\\07\"[code - 16]);\n  }\n}\n\nstatic void tdefl_start_static_block(tdefl_compressor *d) {\n  mz_uint i;\n  mz_uint8 *p = &d->m_huff_code_sizes[0][0];\n\n  for (i = 0; i <= 143; ++i) *p++ = 8;\n  for (; i <= 255; ++i) *p++ = 9;\n  for (; i <= 279; ++i) *p++ = 7;\n  for (; i <= 287; ++i) *p++ = 8;\n\n  memset(d->m_huff_code_sizes[1], 5, 32);\n\n  tdefl_optimize_huffman_table(d, 0, 288, 15, MZ_TRUE);\n  tdefl_optimize_huffman_table(d, 1, 32, 15, MZ_TRUE);\n\n  TDEFL_PUT_BITS(1, 2);\n}\n\nstatic const mz_uint mz_bitmasks[17] = {\n    0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF,\n    0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF};\n\n#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && \\\n    MINIZ_HAS_64BIT_REGISTERS\nstatic mz_bool tdefl_compress_lz_codes(tdefl_compressor *d) {\n  mz_uint flags;\n  mz_uint8 *pLZ_codes;\n  mz_uint8 *pOutput_buf = d->m_pOutput_buf;\n  mz_uint8 *pLZ_code_buf_end = d->m_pLZ_code_buf;\n  mz_uint64 bit_buffer = d->m_bit_buffer;\n  mz_uint bits_in = d->m_bits_in;\n\n#define TDEFL_PUT_BITS_FAST(b, l)                \\\n  {                                              \\\n    bit_buffer |= (((mz_uint64)(b)) << bits_in); \\\n    bits_in += (l);                              \\\n  }\n\n  flags = 1;\n  for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < pLZ_code_buf_end;\n       flags >>= 1) {\n    if (flags == 1) flags = *pLZ_codes++ | 0x100;\n\n    if (flags & 1) {\n      mz_uint s0, s1, n0, n1, sym, num_extra_bits;\n      mz_uint match_len = pLZ_codes[0],\n              match_dist = *(const mz_uint16 *)(pLZ_codes + 1);\n      pLZ_codes += 3;\n\n      MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);\n      TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][s_tdefl_len_sym[match_len]],\n                          d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);\n      TDEFL_PUT_BITS_FAST(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]],\n                          s_tdefl_len_extra[match_len]);\n\n      // This sequence coaxes MSVC into using cmov's vs. jmp's.\n      s0 = s_tdefl_small_dist_sym[match_dist & 511];\n      n0 = s_tdefl_small_dist_extra[match_dist & 511];\n      s1 = s_tdefl_large_dist_sym[match_dist >> 8];\n      n1 = s_tdefl_large_dist_extra[match_dist >> 8];\n      sym = (match_dist < 512) ? s0 : s1;\n      num_extra_bits = (match_dist < 512) ? n0 : n1;\n\n      MZ_ASSERT(d->m_huff_code_sizes[1][sym]);\n      TDEFL_PUT_BITS_FAST(d->m_huff_codes[1][sym],\n                          d->m_huff_code_sizes[1][sym]);\n      TDEFL_PUT_BITS_FAST(match_dist & mz_bitmasks[num_extra_bits],\n                          num_extra_bits);\n    } else {\n      mz_uint lit = *pLZ_codes++;\n      MZ_ASSERT(d->m_huff_code_sizes[0][lit]);\n      TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit],\n                          d->m_huff_code_sizes[0][lit]);\n\n      if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end)) {\n        flags >>= 1;\n        lit = *pLZ_codes++;\n        MZ_ASSERT(d->m_huff_code_sizes[0][lit]);\n        TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit],\n                            d->m_huff_code_sizes[0][lit]);\n\n        if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end)) {\n          flags >>= 1;\n          lit = *pLZ_codes++;\n          MZ_ASSERT(d->m_huff_code_sizes[0][lit]);\n          TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit],\n                              d->m_huff_code_sizes[0][lit]);\n        }\n      }\n    }\n\n    if (pOutput_buf >= d->m_pOutput_buf_end) return MZ_FALSE;\n\n    *(mz_uint64 *)pOutput_buf = bit_buffer;\n    pOutput_buf += (bits_in >> 3);\n    bit_buffer >>= (bits_in & ~7);\n    bits_in &= 7;\n  }\n\n#undef TDEFL_PUT_BITS_FAST\n\n  d->m_pOutput_buf = pOutput_buf;\n  d->m_bits_in = 0;\n  d->m_bit_buffer = 0;\n\n  while (bits_in) {\n    mz_uint32 n = MZ_MIN(bits_in, 16);\n    TDEFL_PUT_BITS((mz_uint)bit_buffer & mz_bitmasks[n], n);\n    bit_buffer >>= n;\n    bits_in -= n;\n  }\n\n  TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]);\n\n  return (d->m_pOutput_buf < d->m_pOutput_buf_end);\n}\n#else\nstatic mz_bool tdefl_compress_lz_codes(tdefl_compressor *d) {\n  mz_uint flags;\n  mz_uint8 *pLZ_codes;\n\n  flags = 1;\n  for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < d->m_pLZ_code_buf;\n       flags >>= 1) {\n    if (flags == 1) flags = *pLZ_codes++ | 0x100;\n    if (flags & 1) {\n      mz_uint sym, num_extra_bits;\n      mz_uint match_len = pLZ_codes[0],\n              match_dist = (pLZ_codes[1] | (pLZ_codes[2] << 8));\n      pLZ_codes += 3;\n\n      MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);\n      TDEFL_PUT_BITS(d->m_huff_codes[0][s_tdefl_len_sym[match_len]],\n                     d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);\n      TDEFL_PUT_BITS(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]],\n                     s_tdefl_len_extra[match_len]);\n\n      if (match_dist < 512) {\n        sym = s_tdefl_small_dist_sym[match_dist];\n        num_extra_bits = s_tdefl_small_dist_extra[match_dist];\n      } else {\n        sym = s_tdefl_large_dist_sym[match_dist >> 8];\n        num_extra_bits = s_tdefl_large_dist_extra[match_dist >> 8];\n      }\n      MZ_ASSERT(d->m_huff_code_sizes[1][sym]);\n      TDEFL_PUT_BITS(d->m_huff_codes[1][sym], d->m_huff_code_sizes[1][sym]);\n      TDEFL_PUT_BITS(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits);\n    } else {\n      mz_uint lit = *pLZ_codes++;\n      MZ_ASSERT(d->m_huff_code_sizes[0][lit]);\n      TDEFL_PUT_BITS(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]);\n    }\n  }\n\n  TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]);\n\n  return (d->m_pOutput_buf < d->m_pOutput_buf_end);\n}\n#endif  // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN &&\n        // MINIZ_HAS_64BIT_REGISTERS\n\nstatic mz_bool tdefl_compress_block(tdefl_compressor *d, mz_bool static_block) {\n  if (static_block)\n    tdefl_start_static_block(d);\n  else\n    tdefl_start_dynamic_block(d);\n  return tdefl_compress_lz_codes(d);\n}\n\nstatic int tdefl_flush_block(tdefl_compressor *d, int flush) {\n  mz_uint saved_bit_buf, saved_bits_in;\n  mz_uint8 *pSaved_output_buf;\n  mz_bool comp_block_succeeded = MZ_FALSE;\n  int n, use_raw_block =\n             ((d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS) != 0) &&\n             (d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size;\n  mz_uint8 *pOutput_buf_start =\n      ((d->m_pPut_buf_func == NULL) &&\n       ((*d->m_pOut_buf_size - d->m_out_buf_ofs) >= TDEFL_OUT_BUF_SIZE))\n          ? ((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs)\n          : d->m_output_buf;\n\n  d->m_pOutput_buf = pOutput_buf_start;\n  d->m_pOutput_buf_end = d->m_pOutput_buf + TDEFL_OUT_BUF_SIZE - 16;\n\n  MZ_ASSERT(!d->m_output_flush_remaining);\n  d->m_output_flush_ofs = 0;\n  d->m_output_flush_remaining = 0;\n\n  *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> d->m_num_flags_left);\n  d->m_pLZ_code_buf -= (d->m_num_flags_left == 8);\n\n  if ((d->m_flags & TDEFL_WRITE_ZLIB_HEADER) && (!d->m_block_index)) {\n    TDEFL_PUT_BITS(0x78, 8);\n    TDEFL_PUT_BITS(0x01, 8);\n  }\n\n  TDEFL_PUT_BITS(flush == TDEFL_FINISH, 1);\n\n  pSaved_output_buf = d->m_pOutput_buf;\n  saved_bit_buf = d->m_bit_buffer;\n  saved_bits_in = d->m_bits_in;\n\n  if (!use_raw_block)\n    comp_block_succeeded =\n        tdefl_compress_block(d, (d->m_flags & TDEFL_FORCE_ALL_STATIC_BLOCKS) ||\n                                    (d->m_total_lz_bytes < 48));\n\n  // If the block gets expanded, forget the current contents of the output\n  // buffer and send a raw block instead.\n  if (((use_raw_block) ||\n       ((d->m_total_lz_bytes) && ((d->m_pOutput_buf - pSaved_output_buf + 1U) >=\n                                  d->m_total_lz_bytes))) &&\n      ((d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size)) {\n    mz_uint i;\n    d->m_pOutput_buf = pSaved_output_buf;\n    d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in;\n    TDEFL_PUT_BITS(0, 2);\n    if (d->m_bits_in) {\n      TDEFL_PUT_BITS(0, 8 - d->m_bits_in);\n    }\n    for (i = 2; i; --i, d->m_total_lz_bytes ^= 0xFFFF) {\n      TDEFL_PUT_BITS(d->m_total_lz_bytes & 0xFFFF, 16);\n    }\n    for (i = 0; i < d->m_total_lz_bytes; ++i) {\n      TDEFL_PUT_BITS(\n          d->m_dict[(d->m_lz_code_buf_dict_pos + i) & TDEFL_LZ_DICT_SIZE_MASK],\n          8);\n    }\n  }\n  // Check for the extremely unlikely (if not impossible) case of the compressed\n  // block not fitting into the output buffer when using dynamic codes.\n  else if (!comp_block_succeeded) {\n    d->m_pOutput_buf = pSaved_output_buf;\n    d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in;\n    tdefl_compress_block(d, MZ_TRUE);\n  }\n\n  if (flush) {\n    if (flush == TDEFL_FINISH) {\n      if (d->m_bits_in) {\n        TDEFL_PUT_BITS(0, 8 - d->m_bits_in);\n      }\n      if (d->m_flags & TDEFL_WRITE_ZLIB_HEADER) {\n        mz_uint i, a = d->m_adler32;\n        for (i = 0; i < 4; i++) {\n          TDEFL_PUT_BITS((a >> 24) & 0xFF, 8);\n          a <<= 8;\n        }\n      }\n    } else {\n      mz_uint i, z = 0;\n      TDEFL_PUT_BITS(0, 3);\n      if (d->m_bits_in) {\n        TDEFL_PUT_BITS(0, 8 - d->m_bits_in);\n      }\n      for (i = 2; i; --i, z ^= 0xFFFF) {\n        TDEFL_PUT_BITS(z & 0xFFFF, 16);\n      }\n    }\n  }\n\n  MZ_ASSERT(d->m_pOutput_buf < d->m_pOutput_buf_end);\n\n  memset(&d->m_huff_count[0][0], 0,\n         sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0);\n  memset(&d->m_huff_count[1][0], 0,\n         sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1);\n\n  d->m_pLZ_code_buf = d->m_lz_code_buf + 1;\n  d->m_pLZ_flags = d->m_lz_code_buf;\n  d->m_num_flags_left = 8;\n  d->m_lz_code_buf_dict_pos += d->m_total_lz_bytes;\n  d->m_total_lz_bytes = 0;\n  d->m_block_index++;\n\n  if ((n = (int)(d->m_pOutput_buf - pOutput_buf_start)) != 0) {\n    if (d->m_pPut_buf_func) {\n      *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf;\n      if (!(*d->m_pPut_buf_func)(d->m_output_buf, n, d->m_pPut_buf_user))\n        return (d->m_prev_return_status = TDEFL_STATUS_PUT_BUF_FAILED);\n    } else if (pOutput_buf_start == d->m_output_buf) {\n      int bytes_to_copy = (int)MZ_MIN(\n          (size_t)n, (size_t)(*d->m_pOut_buf_size - d->m_out_buf_ofs));\n      memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, d->m_output_buf,\n             bytes_to_copy);\n      d->m_out_buf_ofs += bytes_to_copy;\n      if ((n -= bytes_to_copy) != 0) {\n        d->m_output_flush_ofs = bytes_to_copy;\n        d->m_output_flush_remaining = n;\n      }\n    } else {\n      d->m_out_buf_ofs += n;\n    }\n  }\n\n  return d->m_output_flush_remaining;\n}\n\n#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES\n#define TDEFL_READ_UNALIGNED_WORD(p) *(const mz_uint16 *)(p)\nstatic MZ_FORCEINLINE void tdefl_find_match(\n    tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist,\n    mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len) {\n  mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK,\n                match_len = *pMatch_len, probe_pos = pos, next_probe_pos,\n                probe_len;\n  mz_uint num_probes_left = d->m_max_probes[match_len >= 32];\n  const mz_uint16 *s = (const mz_uint16 *)(d->m_dict + pos), *p, *q;\n  mz_uint16 c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]),\n            s01 = TDEFL_READ_UNALIGNED_WORD(s);\n  MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN);\n  if (max_match_len <= match_len) return;\n  for (;;) {\n    for (;;) {\n      if (--num_probes_left == 0) return;\n#define TDEFL_PROBE                                                            \\\n  next_probe_pos = d->m_next[probe_pos];                                       \\\n  if ((!next_probe_pos) ||                                                     \\\n      ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist))       \\\n    return;                                                                    \\\n  probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK;                        \\\n  if (TDEFL_READ_UNALIGNED_WORD(&d->m_dict[probe_pos + match_len - 1]) == c01) \\\n    break;\n      TDEFL_PROBE;\n      TDEFL_PROBE;\n      TDEFL_PROBE;\n    }\n    if (!dist) break;\n    q = (const mz_uint16 *)(d->m_dict + probe_pos);\n    if (TDEFL_READ_UNALIGNED_WORD(q) != s01) continue;\n    p = s;\n    probe_len = 32;\n    do {\n    } while (\n        (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&\n        (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&\n        (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&\n        (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&\n        (--probe_len > 0));\n    if (!probe_len) {\n      *pMatch_dist = dist;\n      *pMatch_len = MZ_MIN(max_match_len, TDEFL_MAX_MATCH_LEN);\n      break;\n    } else if ((probe_len = ((mz_uint)(p - s) * 2) +\n                            (mz_uint)(*(const mz_uint8 *)p ==\n                                      *(const mz_uint8 *)q)) > match_len) {\n      *pMatch_dist = dist;\n      if ((*pMatch_len = match_len = MZ_MIN(max_match_len, probe_len)) ==\n          max_match_len)\n        break;\n      c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]);\n    }\n  }\n}\n#else\nstatic MZ_FORCEINLINE void tdefl_find_match(\n    tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist,\n    mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len) {\n  mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK,\n                match_len = *pMatch_len, probe_pos = pos, next_probe_pos,\n                probe_len;\n  mz_uint num_probes_left = d->m_max_probes[match_len >= 32];\n  const mz_uint8 *s = d->m_dict + pos, *p, *q;\n  mz_uint8 c0 = d->m_dict[pos + match_len], c1 = d->m_dict[pos + match_len - 1];\n  MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN);\n  if (max_match_len <= match_len) return;\n  for (;;) {\n    for (;;) {\n      if (--num_probes_left == 0) return;\n#define TDEFL_PROBE                                                      \\\n  next_probe_pos = d->m_next[probe_pos];                                 \\\n  if ((!next_probe_pos) ||                                               \\\n      ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) \\\n    return;                                                              \\\n  probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK;                  \\\n  if ((d->m_dict[probe_pos + match_len] == c0) &&                        \\\n      (d->m_dict[probe_pos + match_len - 1] == c1))                      \\\n    break;\n      TDEFL_PROBE;\n      TDEFL_PROBE;\n      TDEFL_PROBE;\n    }\n    if (!dist) break;\n    p = s;\n    q = d->m_dict + probe_pos;\n    for (probe_len = 0; probe_len < max_match_len; probe_len++)\n      if (*p++ != *q++) break;\n    if (probe_len > match_len) {\n      *pMatch_dist = dist;\n      if ((*pMatch_len = match_len = probe_len) == max_match_len) return;\n      c0 = d->m_dict[pos + match_len];\n      c1 = d->m_dict[pos + match_len - 1];\n    }\n  }\n}\n#endif  // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES\n\n#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN\nstatic mz_bool tdefl_compress_fast(tdefl_compressor *d) {\n  // Faster, minimally featured LZRW1-style match+parse loop with better\n  // register utilization. Intended for applications where raw throughput is\n  // valued more highly than ratio.\n  mz_uint lookahead_pos = d->m_lookahead_pos,\n          lookahead_size = d->m_lookahead_size, dict_size = d->m_dict_size,\n          total_lz_bytes = d->m_total_lz_bytes,\n          num_flags_left = d->m_num_flags_left;\n  mz_uint8 *pLZ_code_buf = d->m_pLZ_code_buf, *pLZ_flags = d->m_pLZ_flags;\n  mz_uint cur_pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK;\n\n  while ((d->m_src_buf_left) || ((d->m_flush) && (lookahead_size))) {\n    const mz_uint TDEFL_COMP_FAST_LOOKAHEAD_SIZE = 4096;\n    mz_uint dst_pos =\n        (lookahead_pos + lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK;\n    mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(\n        d->m_src_buf_left, TDEFL_COMP_FAST_LOOKAHEAD_SIZE - lookahead_size);\n    d->m_src_buf_left -= num_bytes_to_process;\n    lookahead_size += num_bytes_to_process;\n\n    while (num_bytes_to_process) {\n      mz_uint32 n = MZ_MIN(TDEFL_LZ_DICT_SIZE - dst_pos, num_bytes_to_process);\n      memcpy(d->m_dict + dst_pos, d->m_pSrc, n);\n      if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1))\n        memcpy(d->m_dict + TDEFL_LZ_DICT_SIZE + dst_pos, d->m_pSrc,\n               MZ_MIN(n, (TDEFL_MAX_MATCH_LEN - 1) - dst_pos));\n      d->m_pSrc += n;\n      dst_pos = (dst_pos + n) & TDEFL_LZ_DICT_SIZE_MASK;\n      num_bytes_to_process -= n;\n    }\n\n    dict_size = MZ_MIN(TDEFL_LZ_DICT_SIZE - lookahead_size, dict_size);\n    if ((!d->m_flush) && (lookahead_size < TDEFL_COMP_FAST_LOOKAHEAD_SIZE))\n      break;\n\n    while (lookahead_size >= 4) {\n      mz_uint cur_match_dist, cur_match_len = 1;\n      mz_uint8 *pCur_dict = d->m_dict + cur_pos;\n      mz_uint first_trigram = (*(const mz_uint32 *)pCur_dict) & 0xFFFFFF;\n      mz_uint hash =\n          (first_trigram ^ (first_trigram >> (24 - (TDEFL_LZ_HASH_BITS - 8)))) &\n          TDEFL_LEVEL1_HASH_SIZE_MASK;\n      mz_uint probe_pos = d->m_hash[hash];\n      d->m_hash[hash] = (mz_uint16)lookahead_pos;\n\n      if (((cur_match_dist = (mz_uint16)(lookahead_pos - probe_pos)) <=\n           dict_size) &&\n          ((*(const mz_uint32 *)(d->m_dict +\n                                 (probe_pos &= TDEFL_LZ_DICT_SIZE_MASK)) &\n            0xFFFFFF) == first_trigram)) {\n        const mz_uint16 *p = (const mz_uint16 *)pCur_dict;\n        const mz_uint16 *q = (const mz_uint16 *)(d->m_dict + probe_pos);\n        mz_uint32 probe_len = 32;\n        do {\n        } while ((TDEFL_READ_UNALIGNED_WORD(++p) ==\n                  TDEFL_READ_UNALIGNED_WORD(++q)) &&\n                 (TDEFL_READ_UNALIGNED_WORD(++p) ==\n                  TDEFL_READ_UNALIGNED_WORD(++q)) &&\n                 (TDEFL_READ_UNALIGNED_WORD(++p) ==\n                  TDEFL_READ_UNALIGNED_WORD(++q)) &&\n                 (TDEFL_READ_UNALIGNED_WORD(++p) ==\n                  TDEFL_READ_UNALIGNED_WORD(++q)) &&\n                 (--probe_len > 0));\n        cur_match_len = ((mz_uint)(p - (const mz_uint16 *)pCur_dict) * 2) +\n                        (mz_uint)(*(const mz_uint8 *)p == *(const mz_uint8 *)q);\n        if (!probe_len)\n          cur_match_len = cur_match_dist ? TDEFL_MAX_MATCH_LEN : 0;\n\n        if ((cur_match_len < TDEFL_MIN_MATCH_LEN) ||\n            ((cur_match_len == TDEFL_MIN_MATCH_LEN) &&\n             (cur_match_dist >= 8U * 1024U))) {\n          cur_match_len = 1;\n          *pLZ_code_buf++ = (mz_uint8)first_trigram;\n          *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1);\n          d->m_huff_count[0][(mz_uint8)first_trigram]++;\n        } else {\n          mz_uint32 s0, s1;\n          cur_match_len = MZ_MIN(cur_match_len, lookahead_size);\n\n          MZ_ASSERT((cur_match_len >= TDEFL_MIN_MATCH_LEN) &&\n                    (cur_match_dist >= 1) &&\n                    (cur_match_dist <= TDEFL_LZ_DICT_SIZE));\n\n          cur_match_dist--;\n\n          pLZ_code_buf[0] = (mz_uint8)(cur_match_len - TDEFL_MIN_MATCH_LEN);\n          *(mz_uint16 *)(&pLZ_code_buf[1]) = (mz_uint16)cur_match_dist;\n          pLZ_code_buf += 3;\n          *pLZ_flags = (mz_uint8)((*pLZ_flags >> 1) | 0x80);\n\n          s0 = s_tdefl_small_dist_sym[cur_match_dist & 511];\n          s1 = s_tdefl_large_dist_sym[cur_match_dist >> 8];\n          d->m_huff_count[1][(cur_match_dist < 512) ? s0 : s1]++;\n\n          d->m_huff_count[0][s_tdefl_len_sym[cur_match_len -\n                                             TDEFL_MIN_MATCH_LEN]]++;\n        }\n      } else {\n        *pLZ_code_buf++ = (mz_uint8)first_trigram;\n        *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1);\n        d->m_huff_count[0][(mz_uint8)first_trigram]++;\n      }\n\n      if (--num_flags_left == 0) {\n        num_flags_left = 8;\n        pLZ_flags = pLZ_code_buf++;\n      }\n\n      total_lz_bytes += cur_match_len;\n      lookahead_pos += cur_match_len;\n      dict_size = MZ_MIN(dict_size + cur_match_len, TDEFL_LZ_DICT_SIZE);\n      cur_pos = (cur_pos + cur_match_len) & TDEFL_LZ_DICT_SIZE_MASK;\n      MZ_ASSERT(lookahead_size >= cur_match_len);\n      lookahead_size -= cur_match_len;\n\n      if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) {\n        int n;\n        d->m_lookahead_pos = lookahead_pos;\n        d->m_lookahead_size = lookahead_size;\n        d->m_dict_size = dict_size;\n        d->m_total_lz_bytes = total_lz_bytes;\n        d->m_pLZ_code_buf = pLZ_code_buf;\n        d->m_pLZ_flags = pLZ_flags;\n        d->m_num_flags_left = num_flags_left;\n        if ((n = tdefl_flush_block(d, 0)) != 0)\n          return (n < 0) ? MZ_FALSE : MZ_TRUE;\n        total_lz_bytes = d->m_total_lz_bytes;\n        pLZ_code_buf = d->m_pLZ_code_buf;\n        pLZ_flags = d->m_pLZ_flags;\n        num_flags_left = d->m_num_flags_left;\n      }\n    }\n\n    while (lookahead_size) {\n      mz_uint8 lit = d->m_dict[cur_pos];\n\n      total_lz_bytes++;\n      *pLZ_code_buf++ = lit;\n      *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1);\n      if (--num_flags_left == 0) {\n        num_flags_left = 8;\n        pLZ_flags = pLZ_code_buf++;\n      }\n\n      d->m_huff_count[0][lit]++;\n\n      lookahead_pos++;\n      dict_size = MZ_MIN(dict_size + 1, TDEFL_LZ_DICT_SIZE);\n      cur_pos = (cur_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK;\n      lookahead_size--;\n\n      if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) {\n        int n;\n        d->m_lookahead_pos = lookahead_pos;\n        d->m_lookahead_size = lookahead_size;\n        d->m_dict_size = dict_size;\n        d->m_total_lz_bytes = total_lz_bytes;\n        d->m_pLZ_code_buf = pLZ_code_buf;\n        d->m_pLZ_flags = pLZ_flags;\n        d->m_num_flags_left = num_flags_left;\n        if ((n = tdefl_flush_block(d, 0)) != 0)\n          return (n < 0) ? MZ_FALSE : MZ_TRUE;\n        total_lz_bytes = d->m_total_lz_bytes;\n        pLZ_code_buf = d->m_pLZ_code_buf;\n        pLZ_flags = d->m_pLZ_flags;\n        num_flags_left = d->m_num_flags_left;\n      }\n    }\n  }\n\n  d->m_lookahead_pos = lookahead_pos;\n  d->m_lookahead_size = lookahead_size;\n  d->m_dict_size = dict_size;\n  d->m_total_lz_bytes = total_lz_bytes;\n  d->m_pLZ_code_buf = pLZ_code_buf;\n  d->m_pLZ_flags = pLZ_flags;\n  d->m_num_flags_left = num_flags_left;\n  return MZ_TRUE;\n}\n#endif  // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN\n\nstatic MZ_FORCEINLINE void tdefl_record_literal(tdefl_compressor *d,\n                                                mz_uint8 lit) {\n  d->m_total_lz_bytes++;\n  *d->m_pLZ_code_buf++ = lit;\n  *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> 1);\n  if (--d->m_num_flags_left == 0) {\n    d->m_num_flags_left = 8;\n    d->m_pLZ_flags = d->m_pLZ_code_buf++;\n  }\n  d->m_huff_count[0][lit]++;\n}\n\nstatic MZ_FORCEINLINE void tdefl_record_match(tdefl_compressor *d,\n                                              mz_uint match_len,\n                                              mz_uint match_dist) {\n  mz_uint32 s0, s1;\n\n  MZ_ASSERT((match_len >= TDEFL_MIN_MATCH_LEN) && (match_dist >= 1) &&\n            (match_dist <= TDEFL_LZ_DICT_SIZE));\n\n  d->m_total_lz_bytes += match_len;\n\n  d->m_pLZ_code_buf[0] = (mz_uint8)(match_len - TDEFL_MIN_MATCH_LEN);\n\n  match_dist -= 1;\n  d->m_pLZ_code_buf[1] = (mz_uint8)(match_dist & 0xFF);\n  d->m_pLZ_code_buf[2] = (mz_uint8)(match_dist >> 8);\n  d->m_pLZ_code_buf += 3;\n\n  *d->m_pLZ_flags = (mz_uint8)((*d->m_pLZ_flags >> 1) | 0x80);\n  if (--d->m_num_flags_left == 0) {\n    d->m_num_flags_left = 8;\n    d->m_pLZ_flags = d->m_pLZ_code_buf++;\n  }\n\n  s0 = s_tdefl_small_dist_sym[match_dist & 511];\n  s1 = s_tdefl_large_dist_sym[(match_dist >> 8) & 127];\n  d->m_huff_count[1][(match_dist < 512) ? s0 : s1]++;\n\n  if (match_len >= TDEFL_MIN_MATCH_LEN)\n    d->m_huff_count[0][s_tdefl_len_sym[match_len - TDEFL_MIN_MATCH_LEN]]++;\n}\n\nstatic mz_bool tdefl_compress_normal(tdefl_compressor *d) {\n  const mz_uint8 *pSrc = d->m_pSrc;\n  size_t src_buf_left = d->m_src_buf_left;\n  tdefl_flush flush = d->m_flush;\n\n  while ((src_buf_left) || ((flush) && (d->m_lookahead_size))) {\n    mz_uint len_to_move, cur_match_dist, cur_match_len, cur_pos;\n    // Update dictionary and hash chains. Keeps the lookahead size equal to\n    // TDEFL_MAX_MATCH_LEN.\n    if ((d->m_lookahead_size + d->m_dict_size) >= (TDEFL_MIN_MATCH_LEN - 1)) {\n      mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) &\n                        TDEFL_LZ_DICT_SIZE_MASK,\n              ins_pos = d->m_lookahead_pos + d->m_lookahead_size - 2;\n      mz_uint hash = (d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK]\n                      << TDEFL_LZ_HASH_SHIFT) ^\n                     d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK];\n      mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(\n          src_buf_left, TDEFL_MAX_MATCH_LEN - d->m_lookahead_size);\n      const mz_uint8 *pSrc_end = pSrc + num_bytes_to_process;\n      src_buf_left -= num_bytes_to_process;\n      d->m_lookahead_size += num_bytes_to_process;\n      while (pSrc != pSrc_end) {\n        mz_uint8 c = *pSrc++;\n        d->m_dict[dst_pos] = c;\n        if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1))\n          d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c;\n        hash = ((hash << TDEFL_LZ_HASH_SHIFT) ^ c) & (TDEFL_LZ_HASH_SIZE - 1);\n        d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash];\n        d->m_hash[hash] = (mz_uint16)(ins_pos);\n        dst_pos = (dst_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK;\n        ins_pos++;\n      }\n    } else {\n      while ((src_buf_left) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN)) {\n        mz_uint8 c = *pSrc++;\n        mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) &\n                          TDEFL_LZ_DICT_SIZE_MASK;\n        src_buf_left--;\n        d->m_dict[dst_pos] = c;\n        if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1))\n          d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c;\n        if ((++d->m_lookahead_size + d->m_dict_size) >= TDEFL_MIN_MATCH_LEN) {\n          mz_uint ins_pos = d->m_lookahead_pos + (d->m_lookahead_size - 1) - 2;\n          mz_uint hash = ((d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK]\n                           << (TDEFL_LZ_HASH_SHIFT * 2)) ^\n                          (d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK]\n                           << TDEFL_LZ_HASH_SHIFT) ^\n                          c) &\n                         (TDEFL_LZ_HASH_SIZE - 1);\n          d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash];\n          d->m_hash[hash] = (mz_uint16)(ins_pos);\n        }\n      }\n    }\n    d->m_dict_size =\n        MZ_MIN(TDEFL_LZ_DICT_SIZE - d->m_lookahead_size, d->m_dict_size);\n    if ((!flush) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN)) break;\n\n    // Simple lazy/greedy parsing state machine.\n    len_to_move = 1;\n    cur_match_dist = 0;\n    cur_match_len =\n        d->m_saved_match_len ? d->m_saved_match_len : (TDEFL_MIN_MATCH_LEN - 1);\n    cur_pos = d->m_lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK;\n    if (d->m_flags & (TDEFL_RLE_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS)) {\n      if ((d->m_dict_size) && (!(d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS))) {\n        mz_uint8 c = d->m_dict[(cur_pos - 1) & TDEFL_LZ_DICT_SIZE_MASK];\n        cur_match_len = 0;\n        while (cur_match_len < d->m_lookahead_size) {\n          if (d->m_dict[cur_pos + cur_match_len] != c) break;\n          cur_match_len++;\n        }\n        if (cur_match_len < TDEFL_MIN_MATCH_LEN)\n          cur_match_len = 0;\n        else\n          cur_match_dist = 1;\n      }\n    } else {\n      tdefl_find_match(d, d->m_lookahead_pos, d->m_dict_size,\n                       d->m_lookahead_size, &cur_match_dist, &cur_match_len);\n    }\n    if (((cur_match_len == TDEFL_MIN_MATCH_LEN) &&\n         (cur_match_dist >= 8U * 1024U)) ||\n        (cur_pos == cur_match_dist) ||\n        ((d->m_flags & TDEFL_FILTER_MATCHES) && (cur_match_len <= 5))) {\n      cur_match_dist = cur_match_len = 0;\n    }\n    if (d->m_saved_match_len) {\n      if (cur_match_len > d->m_saved_match_len) {\n        tdefl_record_literal(d, (mz_uint8)d->m_saved_lit);\n        if (cur_match_len >= 128) {\n          tdefl_record_match(d, cur_match_len, cur_match_dist);\n          d->m_saved_match_len = 0;\n          len_to_move = cur_match_len;\n        } else {\n          d->m_saved_lit = d->m_dict[cur_pos];\n          d->m_saved_match_dist = cur_match_dist;\n          d->m_saved_match_len = cur_match_len;\n        }\n      } else {\n        tdefl_record_match(d, d->m_saved_match_len, d->m_saved_match_dist);\n        len_to_move = d->m_saved_match_len - 1;\n        d->m_saved_match_len = 0;\n      }\n    } else if (!cur_match_dist)\n      tdefl_record_literal(d,\n                           d->m_dict[MZ_MIN(cur_pos, sizeof(d->m_dict) - 1)]);\n    else if ((d->m_greedy_parsing) || (d->m_flags & TDEFL_RLE_MATCHES) ||\n             (cur_match_len >= 128)) {\n      tdefl_record_match(d, cur_match_len, cur_match_dist);\n      len_to_move = cur_match_len;\n    } else {\n      d->m_saved_lit = d->m_dict[MZ_MIN(cur_pos, sizeof(d->m_dict) - 1)];\n      d->m_saved_match_dist = cur_match_dist;\n      d->m_saved_match_len = cur_match_len;\n    }\n    // Move the lookahead forward by len_to_move bytes.\n    d->m_lookahead_pos += len_to_move;\n    MZ_ASSERT(d->m_lookahead_size >= len_to_move);\n    d->m_lookahead_size -= len_to_move;\n    d->m_dict_size =\n        MZ_MIN(d->m_dict_size + len_to_move, (mz_uint)TDEFL_LZ_DICT_SIZE);\n    // Check if it's time to flush the current LZ codes to the internal output\n    // buffer.\n    if ((d->m_pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) ||\n        ((d->m_total_lz_bytes > 31 * 1024) &&\n         (((((mz_uint)(d->m_pLZ_code_buf - d->m_lz_code_buf) * 115) >> 7) >=\n           d->m_total_lz_bytes) ||\n          (d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS)))) {\n      int n;\n      d->m_pSrc = pSrc;\n      d->m_src_buf_left = src_buf_left;\n      if ((n = tdefl_flush_block(d, 0)) != 0)\n        return (n < 0) ? MZ_FALSE : MZ_TRUE;\n    }\n  }\n\n  d->m_pSrc = pSrc;\n  d->m_src_buf_left = src_buf_left;\n  return MZ_TRUE;\n}\n\nstatic tdefl_status tdefl_flush_output_buffer(tdefl_compressor *d) {\n  if (d->m_pIn_buf_size) {\n    *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf;\n  }\n\n  if (d->m_pOut_buf_size) {\n    size_t n = MZ_MIN(*d->m_pOut_buf_size - d->m_out_buf_ofs,\n                      d->m_output_flush_remaining);\n    memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs,\n           d->m_output_buf + d->m_output_flush_ofs, n);\n    d->m_output_flush_ofs += (mz_uint)n;\n    d->m_output_flush_remaining -= (mz_uint)n;\n    d->m_out_buf_ofs += n;\n\n    *d->m_pOut_buf_size = d->m_out_buf_ofs;\n  }\n\n  return (d->m_finished && !d->m_output_flush_remaining) ? TDEFL_STATUS_DONE\n                                                         : TDEFL_STATUS_OKAY;\n}\n\ntdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf,\n                            size_t *pIn_buf_size, void *pOut_buf,\n                            size_t *pOut_buf_size, tdefl_flush flush) {\n  if (!d) {\n    if (pIn_buf_size) *pIn_buf_size = 0;\n    if (pOut_buf_size) *pOut_buf_size = 0;\n    return TDEFL_STATUS_BAD_PARAM;\n  }\n\n  d->m_pIn_buf = pIn_buf;\n  d->m_pIn_buf_size = pIn_buf_size;\n  d->m_pOut_buf = pOut_buf;\n  d->m_pOut_buf_size = pOut_buf_size;\n  d->m_pSrc = (const mz_uint8 *)(pIn_buf);\n  d->m_src_buf_left = pIn_buf_size ? *pIn_buf_size : 0;\n  d->m_out_buf_ofs = 0;\n  d->m_flush = flush;\n\n  if (((d->m_pPut_buf_func != NULL) ==\n       ((pOut_buf != NULL) || (pOut_buf_size != NULL))) ||\n      (d->m_prev_return_status != TDEFL_STATUS_OKAY) ||\n      (d->m_wants_to_finish && (flush != TDEFL_FINISH)) ||\n      (pIn_buf_size && *pIn_buf_size && !pIn_buf) ||\n      (pOut_buf_size && *pOut_buf_size && !pOut_buf)) {\n    if (pIn_buf_size) *pIn_buf_size = 0;\n    if (pOut_buf_size) *pOut_buf_size = 0;\n    return (d->m_prev_return_status = TDEFL_STATUS_BAD_PARAM);\n  }\n  d->m_wants_to_finish |= (flush == TDEFL_FINISH);\n\n  if ((d->m_output_flush_remaining) || (d->m_finished))\n    return (d->m_prev_return_status = tdefl_flush_output_buffer(d));\n\n#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN\n  if (((d->m_flags & TDEFL_MAX_PROBES_MASK) == 1) &&\n      ((d->m_flags & TDEFL_GREEDY_PARSING_FLAG) != 0) &&\n      ((d->m_flags & (TDEFL_FILTER_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS |\n                      TDEFL_RLE_MATCHES)) == 0)) {\n    if (!tdefl_compress_fast(d)) return d->m_prev_return_status;\n  } else\n#endif  // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN\n  {\n    if (!tdefl_compress_normal(d)) return d->m_prev_return_status;\n  }\n\n  if ((d->m_flags & (TDEFL_WRITE_ZLIB_HEADER | TDEFL_COMPUTE_ADLER32)) &&\n      (pIn_buf))\n    d->m_adler32 =\n        (mz_uint32)mz_adler32(d->m_adler32, (const mz_uint8 *)pIn_buf,\n                              d->m_pSrc - (const mz_uint8 *)pIn_buf);\n\n  if ((flush) && (!d->m_lookahead_size) && (!d->m_src_buf_left) &&\n      (!d->m_output_flush_remaining)) {\n    if (tdefl_flush_block(d, flush) < 0) return d->m_prev_return_status;\n    d->m_finished = (flush == TDEFL_FINISH);\n    if (flush == TDEFL_FULL_FLUSH) {\n      MZ_CLEAR_OBJ(d->m_hash);\n      MZ_CLEAR_OBJ(d->m_next);\n      d->m_dict_size = 0;\n    }\n  }\n\n  return (d->m_prev_return_status = tdefl_flush_output_buffer(d));\n}\n\ntdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf,\n                                   size_t in_buf_size, tdefl_flush flush) {\n  MZ_ASSERT(d->m_pPut_buf_func);\n  return tdefl_compress(d, pIn_buf, &in_buf_size, NULL, NULL, flush);\n}\n\ntdefl_status tdefl_init(tdefl_compressor *d,\n                        tdefl_put_buf_func_ptr pPut_buf_func,\n                        void *pPut_buf_user, int flags) {\n  d->m_pPut_buf_func = pPut_buf_func;\n  d->m_pPut_buf_user = pPut_buf_user;\n  d->m_flags = (mz_uint)(flags);\n  d->m_max_probes[0] = 1 + ((flags & 0xFFF) + 2) / 3;\n  d->m_greedy_parsing = (flags & TDEFL_GREEDY_PARSING_FLAG) != 0;\n  d->m_max_probes[1] = 1 + (((flags & 0xFFF) >> 2) + 2) / 3;\n  if (!(flags & TDEFL_NONDETERMINISTIC_PARSING_FLAG)) MZ_CLEAR_OBJ(d->m_hash);\n  d->m_lookahead_pos = d->m_lookahead_size = d->m_dict_size =\n      d->m_total_lz_bytes = d->m_lz_code_buf_dict_pos = d->m_bits_in = 0;\n  d->m_output_flush_ofs = d->m_output_flush_remaining = d->m_finished =\n      d->m_block_index = d->m_bit_buffer = d->m_wants_to_finish = 0;\n  d->m_pLZ_code_buf = d->m_lz_code_buf + 1;\n  d->m_pLZ_flags = d->m_lz_code_buf;\n  d->m_num_flags_left = 8;\n  d->m_pOutput_buf = d->m_output_buf;\n  d->m_pOutput_buf_end = d->m_output_buf;\n  d->m_prev_return_status = TDEFL_STATUS_OKAY;\n  d->m_saved_match_dist = d->m_saved_match_len = d->m_saved_lit = 0;\n  d->m_adler32 = 1;\n  d->m_pIn_buf = NULL;\n  d->m_pOut_buf = NULL;\n  d->m_pIn_buf_size = NULL;\n  d->m_pOut_buf_size = NULL;\n  d->m_flush = TDEFL_NO_FLUSH;\n  d->m_pSrc = NULL;\n  d->m_src_buf_left = 0;\n  d->m_out_buf_ofs = 0;\n  memset(&d->m_huff_count[0][0], 0,\n         sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0);\n  memset(&d->m_huff_count[1][0], 0,\n         sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1);\n  return TDEFL_STATUS_OKAY;\n}\n\ntdefl_status tdefl_get_prev_return_status(tdefl_compressor *d) {\n  return d->m_prev_return_status;\n}\n\nmz_uint32 tdefl_get_adler32(tdefl_compressor *d) { return d->m_adler32; }\n\nmz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len,\n                                     tdefl_put_buf_func_ptr pPut_buf_func,\n                                     void *pPut_buf_user, int flags) {\n  tdefl_compressor *pComp;\n  mz_bool succeeded;\n  if (((buf_len) && (!pBuf)) || (!pPut_buf_func)) return MZ_FALSE;\n  pComp = (tdefl_compressor *)MZ_MALLOC(sizeof(tdefl_compressor));\n  if (!pComp) return MZ_FALSE;\n  succeeded = (tdefl_init(pComp, pPut_buf_func, pPut_buf_user, flags) ==\n               TDEFL_STATUS_OKAY);\n  succeeded =\n      succeeded && (tdefl_compress_buffer(pComp, pBuf, buf_len, TDEFL_FINISH) ==\n                    TDEFL_STATUS_DONE);\n  MZ_FREE(pComp);\n  return succeeded;\n}\n\ntypedef struct {\n  size_t m_size, m_capacity;\n  mz_uint8 *m_pBuf;\n  mz_bool m_expandable;\n} tdefl_output_buffer;\n\nstatic mz_bool tdefl_output_buffer_putter(const void *pBuf, int len,\n                                          void *pUser) {\n  tdefl_output_buffer *p = (tdefl_output_buffer *)pUser;\n  size_t new_size = p->m_size + len;\n  if (new_size > p->m_capacity) {\n    size_t new_capacity = p->m_capacity;\n    mz_uint8 *pNew_buf;\n    if (!p->m_expandable) return MZ_FALSE;\n    do {\n      new_capacity = MZ_MAX(128U, new_capacity << 1U);\n    } while (new_size > new_capacity);\n    pNew_buf = (mz_uint8 *)MZ_REALLOC(p->m_pBuf, new_capacity);\n    if (!pNew_buf) return MZ_FALSE;\n    p->m_pBuf = pNew_buf;\n    p->m_capacity = new_capacity;\n  }\n  memcpy((mz_uint8 *)p->m_pBuf + p->m_size, pBuf, len);\n  p->m_size = new_size;\n  return MZ_TRUE;\n}\n\nvoid *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len,\n                                 size_t *pOut_len, int flags) {\n  tdefl_output_buffer out_buf;\n  MZ_CLEAR_OBJ(out_buf);\n  if (!pOut_len)\n    return MZ_FALSE;\n  else\n    *pOut_len = 0;\n  out_buf.m_expandable = MZ_TRUE;\n  if (!tdefl_compress_mem_to_output(\n          pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags))\n    return NULL;\n  *pOut_len = out_buf.m_size;\n  return out_buf.m_pBuf;\n}\n\nsize_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len,\n                                 const void *pSrc_buf, size_t src_buf_len,\n                                 int flags) {\n  tdefl_output_buffer out_buf;\n  MZ_CLEAR_OBJ(out_buf);\n  if (!pOut_buf) return 0;\n  out_buf.m_pBuf = (mz_uint8 *)pOut_buf;\n  out_buf.m_capacity = out_buf_len;\n  if (!tdefl_compress_mem_to_output(\n          pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags))\n    return 0;\n  return out_buf.m_size;\n}\n\n#ifndef MINIZ_NO_ZLIB_APIS\nstatic const mz_uint s_tdefl_num_probes[11] = {0,   1,   6,   32,  16,  32,\n                                               128, 256, 512, 768, 1500};\n\n// level may actually range from [0,10] (10 is a \"hidden\" max level, where we\n// want a bit more compression and it's fine if throughput to fall off a cliff\n// on some files).\nmz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits,\n                                                int strategy) {\n  mz_uint comp_flags =\n      s_tdefl_num_probes[(level >= 0) ? MZ_MIN(10, level) : MZ_DEFAULT_LEVEL] |\n      ((level <= 3) ? TDEFL_GREEDY_PARSING_FLAG : 0);\n  if (window_bits > 0) comp_flags |= TDEFL_WRITE_ZLIB_HEADER;\n\n  if (!level)\n    comp_flags |= TDEFL_FORCE_ALL_RAW_BLOCKS;\n  else if (strategy == MZ_FILTERED)\n    comp_flags |= TDEFL_FILTER_MATCHES;\n  else if (strategy == MZ_HUFFMAN_ONLY)\n    comp_flags &= ~TDEFL_MAX_PROBES_MASK;\n  else if (strategy == MZ_FIXED)\n    comp_flags |= TDEFL_FORCE_ALL_STATIC_BLOCKS;\n  else if (strategy == MZ_RLE)\n    comp_flags |= TDEFL_RLE_MATCHES;\n\n  return comp_flags;\n}\n#endif  // MINIZ_NO_ZLIB_APIS\n\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable : 4204)  // nonstandard extension used : non-constant\n                                 // aggregate initializer (also supported by GNU\n                                 // C and C99, so no big deal)\n#pragma warning(disable : 4244)  // 'initializing': conversion from '__int64' to\n                                 // 'int', possible loss of data\n#pragma warning(disable : 4267)  // 'argument': conversion from '__int64' to\n                                 // 'int', possible loss of data\n#pragma warning(disable : 4996)  // 'strdup': The POSIX name for this item is\n                                 // deprecated. Instead, use the ISO C and C++\n                                 // conformant name: _strdup.\n#endif\n\n// Simple PNG writer function by Alex Evans, 2011. Released into the public\n// domain: https://gist.github.com/908299, more context at\n// http://altdevblogaday.org/2011/04/06/a-smaller-jpg-encoder/.\n// This is actually a modification of Alex's original code so PNG files\n// generated by this function pass pngcheck.\nvoid *tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w,\n                                                 int h, int num_chans,\n                                                 size_t *pLen_out,\n                                                 mz_uint level, mz_bool flip) {\n  // Using a local copy of this array here in case MINIZ_NO_ZLIB_APIS was\n  // defined.\n  static const mz_uint s_tdefl_png_num_probes[11] = {\n      0, 1, 6, 32, 16, 32, 128, 256, 512, 768, 1500};\n  tdefl_compressor *pComp =\n      (tdefl_compressor *)MZ_MALLOC(sizeof(tdefl_compressor));\n  tdefl_output_buffer out_buf;\n  int i, bpl = w * num_chans, y, z;\n  mz_uint32 c;\n  *pLen_out = 0;\n  if (!pComp) return NULL;\n  MZ_CLEAR_OBJ(out_buf);\n  out_buf.m_expandable = MZ_TRUE;\n  out_buf.m_capacity = 57 + MZ_MAX(64, (1 + bpl) * h);\n  if (NULL == (out_buf.m_pBuf = (mz_uint8 *)MZ_MALLOC(out_buf.m_capacity))) {\n    MZ_FREE(pComp);\n    return NULL;\n  }\n  // write dummy header\n  for (z = 41; z; --z) tdefl_output_buffer_putter(&z, 1, &out_buf);\n  // compress image data\n  tdefl_init(\n      pComp, tdefl_output_buffer_putter, &out_buf,\n      s_tdefl_png_num_probes[MZ_MIN(10, level)] | TDEFL_WRITE_ZLIB_HEADER);\n  for (y = 0; y < h; ++y) {\n    tdefl_compress_buffer(pComp, &z, 1, TDEFL_NO_FLUSH);\n    tdefl_compress_buffer(pComp,\n                          (mz_uint8 *)pImage + (flip ? (h - 1 - y) : y) * bpl,\n                          bpl, TDEFL_NO_FLUSH);\n  }\n  if (tdefl_compress_buffer(pComp, NULL, 0, TDEFL_FINISH) !=\n      TDEFL_STATUS_DONE) {\n    MZ_FREE(pComp);\n    MZ_FREE(out_buf.m_pBuf);\n    return NULL;\n  }\n  // write real header\n  *pLen_out = out_buf.m_size - 41;\n  {\n    static const mz_uint8 chans[] = {0x00, 0x00, 0x04, 0x02, 0x06};\n    mz_uint8 pnghdr[41] = {0x89,\n                           0x50,\n                           0x4e,\n                           0x47,\n                           0x0d,\n                           0x0a,\n                           0x1a,\n                           0x0a,\n                           0x00,\n                           0x00,\n                           0x00,\n                           0x0d,\n                           0x49,\n                           0x48,\n                           0x44,\n                           0x52,\n                           0,\n                           0,\n                           (mz_uint8)(w >> 8),\n                           (mz_uint8)w,\n                           0,\n                           0,\n                           (mz_uint8)(h >> 8),\n                           (mz_uint8)h,\n                           8,\n                           chans[num_chans],\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           (mz_uint8)(*pLen_out >> 24),\n                           (mz_uint8)(*pLen_out >> 16),\n                           (mz_uint8)(*pLen_out >> 8),\n                           (mz_uint8)*pLen_out,\n                           0x49,\n                           0x44,\n                           0x41,\n                           0x54};\n    c = (mz_uint32)mz_crc32(MZ_CRC32_INIT, pnghdr + 12, 17);\n    for (i = 0; i < 4; ++i, c <<= 8)\n      ((mz_uint8 *)(pnghdr + 29))[i] = (mz_uint8)(c >> 24);\n    memcpy(out_buf.m_pBuf, pnghdr, 41);\n  }\n  // write footer (IDAT CRC-32, followed by IEND chunk)\n  if (!tdefl_output_buffer_putter(\n          \"\\0\\0\\0\\0\\0\\0\\0\\0\\x49\\x45\\x4e\\x44\\xae\\x42\\x60\\x82\", 16, &out_buf)) {\n    *pLen_out = 0;\n    MZ_FREE(pComp);\n    MZ_FREE(out_buf.m_pBuf);\n    return NULL;\n  }\n  c = (mz_uint32)mz_crc32(MZ_CRC32_INIT, out_buf.m_pBuf + 41 - 4,\n                          *pLen_out + 4);\n  for (i = 0; i < 4; ++i, c <<= 8)\n    (out_buf.m_pBuf + out_buf.m_size - 16)[i] = (mz_uint8)(c >> 24);\n  // compute final size of file, grab compressed data buffer and return\n  *pLen_out += 57;\n  MZ_FREE(pComp);\n  return out_buf.m_pBuf;\n}\nvoid *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h,\n                                              int num_chans, size_t *pLen_out) {\n  // Level 6 corresponds to TDEFL_DEFAULT_MAX_PROBES or MZ_DEFAULT_LEVEL (but we\n  // can't depend on MZ_DEFAULT_LEVEL being available in case the zlib API's\n  // where #defined out)\n  return tdefl_write_image_to_png_file_in_memory_ex(pImage, w, h, num_chans,\n                                                    pLen_out, 6, MZ_FALSE);\n}\n\n// ------------------- .ZIP archive reading\n\n#ifndef MINIZ_NO_ARCHIVE_APIS\n#error \"No arvhive APIs\"\n\n#ifdef MINIZ_NO_STDIO\n#define MZ_FILE void *\n#else\n#include <stdio.h>\n#include <sys/stat.h>\n\n#if defined(_MSC_VER) || defined(__MINGW64__)\nstatic FILE *mz_fopen(const char *pFilename, const char *pMode) {\n  FILE *pFile = NULL;\n  fopen_s(&pFile, pFilename, pMode);\n  return pFile;\n}\nstatic FILE *mz_freopen(const char *pPath, const char *pMode, FILE *pStream) {\n  FILE *pFile = NULL;\n  if (freopen_s(&pFile, pPath, pMode, pStream)) return NULL;\n  return pFile;\n}\n#ifndef MINIZ_NO_TIME\n#include <sys/utime.h>\n#endif\n#define MZ_FILE FILE\n#define MZ_FOPEN mz_fopen\n#define MZ_FCLOSE fclose\n#define MZ_FREAD fread\n#define MZ_FWRITE fwrite\n#define MZ_FTELL64 _ftelli64\n#define MZ_FSEEK64 _fseeki64\n#define MZ_FILE_STAT_STRUCT _stat\n#define MZ_FILE_STAT _stat\n#define MZ_FFLUSH fflush\n#define MZ_FREOPEN mz_freopen\n#define MZ_DELETE_FILE remove\n#elif defined(__MINGW32__)\n#ifndef MINIZ_NO_TIME\n#include <sys/utime.h>\n#endif\n#define MZ_FILE FILE\n#define MZ_FOPEN(f, m) fopen(f, m)\n#define MZ_FCLOSE fclose\n#define MZ_FREAD fread\n#define MZ_FWRITE fwrite\n#define MZ_FTELL64 ftello64\n#define MZ_FSEEK64 fseeko64\n#define MZ_FILE_STAT_STRUCT _stat\n#define MZ_FILE_STAT _stat\n#define MZ_FFLUSH fflush\n#define MZ_FREOPEN(f, m, s) freopen(f, m, s)\n#define MZ_DELETE_FILE remove\n#elif defined(__TINYC__)\n#ifndef MINIZ_NO_TIME\n#include <sys/utime.h>\n#endif\n#define MZ_FILE FILE\n#define MZ_FOPEN(f, m) fopen(f, m)\n#define MZ_FCLOSE fclose\n#define MZ_FREAD fread\n#define MZ_FWRITE fwrite\n#define MZ_FTELL64 ftell\n#define MZ_FSEEK64 fseek\n#define MZ_FILE_STAT_STRUCT stat\n#define MZ_FILE_STAT stat\n#define MZ_FFLUSH fflush\n#define MZ_FREOPEN(f, m, s) freopen(f, m, s)\n#define MZ_DELETE_FILE remove\n#elif defined(__GNUC__) && defined(_LARGEFILE64_SOURCE) && _LARGEFILE64_SOURCE\n#ifndef MINIZ_NO_TIME\n#include <utime.h>\n#endif\n#define MZ_FILE FILE\n#define MZ_FOPEN(f, m) fopen64(f, m)\n#define MZ_FCLOSE fclose\n#define MZ_FREAD fread\n#define MZ_FWRITE fwrite\n#define MZ_FTELL64 ftello64\n#define MZ_FSEEK64 fseeko64\n#define MZ_FILE_STAT_STRUCT stat64\n#define MZ_FILE_STAT stat64\n#define MZ_FFLUSH fflush\n#define MZ_FREOPEN(p, m, s) freopen64(p, m, s)\n#define MZ_DELETE_FILE remove\n#else\n#ifndef MINIZ_NO_TIME\n#include <utime.h>\n#endif\n#define MZ_FILE FILE\n#define MZ_FOPEN(f, m) fopen(f, m)\n#define MZ_FCLOSE fclose\n#define MZ_FREAD fread\n#define MZ_FWRITE fwrite\n#define MZ_FTELL64 ftello\n#define MZ_FSEEK64 fseeko\n#define MZ_FILE_STAT_STRUCT stat\n#define MZ_FILE_STAT stat\n#define MZ_FFLUSH fflush\n#define MZ_FREOPEN(f, m, s) freopen(f, m, s)\n#define MZ_DELETE_FILE remove\n#endif  // #ifdef _MSC_VER\n#endif  // #ifdef MINIZ_NO_STDIO\n\n#define MZ_TOLOWER(c) ((((c) >= 'A') && ((c) <= 'Z')) ? ((c) - 'A' + 'a') : (c))\n\n// Various ZIP archive enums. To completely avoid cross platform compiler\n// alignment and platform endian issues, miniz.c doesn't use structs for any of\n// this stuff.\nenum {\n  // ZIP archive identifiers and record sizes\n  MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG = 0x06054b50,\n  MZ_ZIP_CENTRAL_DIR_HEADER_SIG = 0x02014b50,\n  MZ_ZIP_LOCAL_DIR_HEADER_SIG = 0x04034b50,\n  MZ_ZIP_LOCAL_DIR_HEADER_SIZE = 30,\n  MZ_ZIP_CENTRAL_DIR_HEADER_SIZE = 46,\n  MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE = 22,\n  // Central directory header record offsets\n  MZ_ZIP_CDH_SIG_OFS = 0,\n  MZ_ZIP_CDH_VERSION_MADE_BY_OFS = 4,\n  MZ_ZIP_CDH_VERSION_NEEDED_OFS = 6,\n  MZ_ZIP_CDH_BIT_FLAG_OFS = 8,\n  MZ_ZIP_CDH_METHOD_OFS = 10,\n  MZ_ZIP_CDH_FILE_TIME_OFS = 12,\n  MZ_ZIP_CDH_FILE_DATE_OFS = 14,\n  MZ_ZIP_CDH_CRC32_OFS = 16,\n  MZ_ZIP_CDH_COMPRESSED_SIZE_OFS = 20,\n  MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS = 24,\n  MZ_ZIP_CDH_FILENAME_LEN_OFS = 28,\n  MZ_ZIP_CDH_EXTRA_LEN_OFS = 30,\n  MZ_ZIP_CDH_COMMENT_LEN_OFS = 32,\n  MZ_ZIP_CDH_DISK_START_OFS = 34,\n  MZ_ZIP_CDH_INTERNAL_ATTR_OFS = 36,\n  MZ_ZIP_CDH_EXTERNAL_ATTR_OFS = 38,\n  MZ_ZIP_CDH_LOCAL_HEADER_OFS = 42,\n  // Local directory header offsets\n  MZ_ZIP_LDH_SIG_OFS = 0,\n  MZ_ZIP_LDH_VERSION_NEEDED_OFS = 4,\n  MZ_ZIP_LDH_BIT_FLAG_OFS = 6,\n  MZ_ZIP_LDH_METHOD_OFS = 8,\n  MZ_ZIP_LDH_FILE_TIME_OFS = 10,\n  MZ_ZIP_LDH_FILE_DATE_OFS = 12,\n  MZ_ZIP_LDH_CRC32_OFS = 14,\n  MZ_ZIP_LDH_COMPRESSED_SIZE_OFS = 18,\n  MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS = 22,\n  MZ_ZIP_LDH_FILENAME_LEN_OFS = 26,\n  MZ_ZIP_LDH_EXTRA_LEN_OFS = 28,\n  // End of central directory offsets\n  MZ_ZIP_ECDH_SIG_OFS = 0,\n  MZ_ZIP_ECDH_NUM_THIS_DISK_OFS = 4,\n  MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS = 6,\n  MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS = 8,\n  MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS = 10,\n  MZ_ZIP_ECDH_CDIR_SIZE_OFS = 12,\n  MZ_ZIP_ECDH_CDIR_OFS_OFS = 16,\n  MZ_ZIP_ECDH_COMMENT_SIZE_OFS = 20,\n};\n\ntypedef struct {\n  void *m_p;\n  size_t m_size, m_capacity;\n  mz_uint m_element_size;\n} mz_zip_array;\n\nstruct mz_zip_internal_state_tag {\n  mz_zip_array m_central_dir;\n  mz_zip_array m_central_dir_offsets;\n  mz_zip_array m_sorted_central_dir_offsets;\n  MZ_FILE *m_pFile;\n  void *m_pMem;\n  size_t m_mem_size;\n  size_t m_mem_capacity;\n};\n\n#define MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(array_ptr, element_size) \\\n  (array_ptr)->m_element_size = element_size\n#define MZ_ZIP_ARRAY_ELEMENT(array_ptr, element_type, index) \\\n  ((element_type *)((array_ptr)->m_p))[index]\n\nstatic MZ_FORCEINLINE void mz_zip_array_clear(mz_zip_archive *pZip,\n                                              mz_zip_array *pArray) {\n  pZip->m_pFree(pZip->m_pAlloc_opaque, pArray->m_p);\n  memset(pArray, 0, sizeof(mz_zip_array));\n}\n\nstatic mz_bool mz_zip_array_ensure_capacity(mz_zip_archive *pZip,\n                                            mz_zip_array *pArray,\n                                            size_t min_new_capacity,\n                                            mz_uint growing) {\n  void *pNew_p;\n  size_t new_capacity = min_new_capacity;\n  MZ_ASSERT(pArray->m_element_size);\n  if (pArray->m_capacity >= min_new_capacity) return MZ_TRUE;\n  if (growing) {\n    new_capacity = MZ_MAX(1, pArray->m_capacity);\n    while (new_capacity < min_new_capacity) new_capacity *= 2;\n  }\n  if (NULL == (pNew_p = pZip->m_pRealloc(pZip->m_pAlloc_opaque, pArray->m_p,\n                                         pArray->m_element_size, new_capacity)))\n    return MZ_FALSE;\n  pArray->m_p = pNew_p;\n  pArray->m_capacity = new_capacity;\n  return MZ_TRUE;\n}\n\nstatic MZ_FORCEINLINE mz_bool mz_zip_array_reserve(mz_zip_archive *pZip,\n                                                   mz_zip_array *pArray,\n                                                   size_t new_capacity,\n                                                   mz_uint growing) {\n  if (new_capacity > pArray->m_capacity) {\n    if (!mz_zip_array_ensure_capacity(pZip, pArray, new_capacity, growing))\n      return MZ_FALSE;\n  }\n  return MZ_TRUE;\n}\n\nstatic MZ_FORCEINLINE mz_bool mz_zip_array_resize(mz_zip_archive *pZip,\n                                                  mz_zip_array *pArray,\n                                                  size_t new_size,\n                                                  mz_uint growing) {\n  if (new_size > pArray->m_capacity) {\n    if (!mz_zip_array_ensure_capacity(pZip, pArray, new_size, growing))\n      return MZ_FALSE;\n  }\n  pArray->m_size = new_size;\n  return MZ_TRUE;\n}\n\nstatic MZ_FORCEINLINE mz_bool mz_zip_array_ensure_room(mz_zip_archive *pZip,\n                                                       mz_zip_array *pArray,\n                                                       size_t n) {\n  return mz_zip_array_reserve(pZip, pArray, pArray->m_size + n, MZ_TRUE);\n}\n\nstatic MZ_FORCEINLINE mz_bool mz_zip_array_push_back(mz_zip_archive *pZip,\n                                                     mz_zip_array *pArray,\n                                                     const void *pElements,\n                                                     size_t n) {\n  size_t orig_size = pArray->m_size;\n  if (!mz_zip_array_resize(pZip, pArray, orig_size + n, MZ_TRUE))\n    return MZ_FALSE;\n  memcpy((mz_uint8 *)pArray->m_p + orig_size * pArray->m_element_size,\n         pElements, n * pArray->m_element_size);\n  return MZ_TRUE;\n}\n\n#ifndef MINIZ_NO_TIME\nstatic time_t mz_zip_dos_to_time_t(int dos_time, int dos_date) {\n  struct tm tm;\n  memset(&tm, 0, sizeof(tm));\n  tm.tm_isdst = -1;\n  tm.tm_year = ((dos_date >> 9) & 127) + 1980 - 1900;\n  tm.tm_mon = ((dos_date >> 5) & 15) - 1;\n  tm.tm_mday = dos_date & 31;\n  tm.tm_hour = (dos_time >> 11) & 31;\n  tm.tm_min = (dos_time >> 5) & 63;\n  tm.tm_sec = (dos_time << 1) & 62;\n  return mktime(&tm);\n}\n\nstatic void mz_zip_time_to_dos_time(time_t time, mz_uint16 *pDOS_time,\n                                    mz_uint16 *pDOS_date) {\n#ifdef _MSC_VER\n  struct tm tm_struct;\n  struct tm *tm = &tm_struct;\n  errno_t err = localtime_s(tm, &time);\n  if (err) {\n    *pDOS_date = 0;\n    *pDOS_time = 0;\n    return;\n  }\n#else\n  struct tm *tm = localtime(&time);\n#endif\n  *pDOS_time = (mz_uint16)(((tm->tm_hour) << 11) + ((tm->tm_min) << 5) +\n                           ((tm->tm_sec) >> 1));\n  *pDOS_date = (mz_uint16)(((tm->tm_year + 1900 - 1980) << 9) +\n                           ((tm->tm_mon + 1) << 5) + tm->tm_mday);\n}\n#endif\n\n#ifndef MINIZ_NO_STDIO\nstatic mz_bool mz_zip_get_file_modified_time(const char *pFilename,\n                                             mz_uint16 *pDOS_time,\n                                             mz_uint16 *pDOS_date) {\n#ifdef MINIZ_NO_TIME\n  (void)pFilename;\n  *pDOS_date = *pDOS_time = 0;\n#else\n  struct MZ_FILE_STAT_STRUCT file_stat;\n  // On Linux with x86 glibc, this call will fail on large files (>= 0x80000000\n  // bytes) unless you compiled with _LARGEFILE64_SOURCE. Argh.\n  if (MZ_FILE_STAT(pFilename, &file_stat) != 0) return MZ_FALSE;\n  mz_zip_time_to_dos_time(file_stat.st_mtime, pDOS_time, pDOS_date);\n#endif  // #ifdef MINIZ_NO_TIME\n  return MZ_TRUE;\n}\n\n#ifndef MINIZ_NO_TIME\nstatic mz_bool mz_zip_set_file_times(const char *pFilename, time_t access_time,\n                                     time_t modified_time) {\n  struct utimbuf t;\n  t.actime = access_time;\n  t.modtime = modified_time;\n  return !utime(pFilename, &t);\n}\n#endif  // #ifndef MINIZ_NO_TIME\n#endif  // #ifndef MINIZ_NO_STDIO\n\nstatic mz_bool mz_zip_reader_init_internal(mz_zip_archive *pZip,\n                                           mz_uint32 flags) {\n  (void)flags;\n  if ((!pZip) || (pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_INVALID))\n    return MZ_FALSE;\n\n  if (!pZip->m_pAlloc) pZip->m_pAlloc = def_alloc_func;\n  if (!pZip->m_pFree) pZip->m_pFree = def_free_func;\n  if (!pZip->m_pRealloc) pZip->m_pRealloc = def_realloc_func;\n\n  pZip->m_zip_mode = MZ_ZIP_MODE_READING;\n  pZip->m_archive_size = 0;\n  pZip->m_central_directory_file_ofs = 0;\n  pZip->m_total_files = 0;\n\n  if (NULL == (pZip->m_pState = (mz_zip_internal_state *)pZip->m_pAlloc(\n                   pZip->m_pAlloc_opaque, 1, sizeof(mz_zip_internal_state))))\n    return MZ_FALSE;\n  memset(pZip->m_pState, 0, sizeof(mz_zip_internal_state));\n  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir,\n                                sizeof(mz_uint8));\n  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir_offsets,\n                                sizeof(mz_uint32));\n  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_sorted_central_dir_offsets,\n                                sizeof(mz_uint32));\n  return MZ_TRUE;\n}\n\nstatic MZ_FORCEINLINE mz_bool\nmz_zip_reader_filename_less(const mz_zip_array *pCentral_dir_array,\n                            const mz_zip_array *pCentral_dir_offsets,\n                            mz_uint l_index, mz_uint r_index) {\n  const mz_uint8 *pL = &MZ_ZIP_ARRAY_ELEMENT(\n                     pCentral_dir_array, mz_uint8,\n                     MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32,\n                                          l_index)),\n                 *pE;\n  const mz_uint8 *pR = &MZ_ZIP_ARRAY_ELEMENT(\n      pCentral_dir_array, mz_uint8,\n      MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, r_index));\n  mz_uint l_len = MZ_READ_LE16(pL + MZ_ZIP_CDH_FILENAME_LEN_OFS),\n          r_len = MZ_READ_LE16(pR + MZ_ZIP_CDH_FILENAME_LEN_OFS);\n  mz_uint8 l = 0, r = 0;\n  pL += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE;\n  pR += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE;\n  pE = pL + MZ_MIN(l_len, r_len);\n  while (pL < pE) {\n    if ((l = MZ_TOLOWER(*pL)) != (r = MZ_TOLOWER(*pR))) break;\n    pL++;\n    pR++;\n  }\n  return (pL == pE) ? (l_len < r_len) : (l < r);\n}\n\n#define MZ_SWAP_UINT32(a, b) \\\n  do {                       \\\n    mz_uint32 t = a;         \\\n    a = b;                   \\\n    b = t;                   \\\n  }                          \\\n  MZ_MACRO_END\n\n// Heap sort of lowercased filenames, used to help accelerate plain central\n// directory searches by mz_zip_reader_locate_file(). (Could also use qsort(),\n// but it could allocate memory.)\nstatic void mz_zip_reader_sort_central_dir_offsets_by_filename(\n    mz_zip_archive *pZip) {\n  mz_zip_internal_state *pState = pZip->m_pState;\n  const mz_zip_array *pCentral_dir_offsets = &pState->m_central_dir_offsets;\n  const mz_zip_array *pCentral_dir = &pState->m_central_dir;\n  mz_uint32 *pIndices = &MZ_ZIP_ARRAY_ELEMENT(\n      &pState->m_sorted_central_dir_offsets, mz_uint32, 0);\n  const int size = pZip->m_total_files;\n  int start = (size - 2) >> 1, end;\n  while (start >= 0) {\n    int child, root = start;\n    for (;;) {\n      if ((child = (root << 1) + 1) >= size) break;\n      child +=\n          (((child + 1) < size) &&\n           (mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets,\n                                        pIndices[child], pIndices[child + 1])));\n      if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets,\n                                       pIndices[root], pIndices[child]))\n        break;\n      MZ_SWAP_UINT32(pIndices[root], pIndices[child]);\n      root = child;\n    }\n    start--;\n  }\n\n  end = size - 1;\n  while (end > 0) {\n    int child, root = 0;\n    MZ_SWAP_UINT32(pIndices[end], pIndices[0]);\n    for (;;) {\n      if ((child = (root << 1) + 1) >= end) break;\n      child +=\n          (((child + 1) < end) &&\n           mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets,\n                                       pIndices[child], pIndices[child + 1]));\n      if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets,\n                                       pIndices[root], pIndices[child]))\n        break;\n      MZ_SWAP_UINT32(pIndices[root], pIndices[child]);\n      root = child;\n    }\n    end--;\n  }\n}\n\nstatic mz_bool mz_zip_reader_read_central_dir(mz_zip_archive *pZip,\n                                              mz_uint32 flags) {\n  mz_uint cdir_size, num_this_disk, cdir_disk_index;\n  mz_uint64 cdir_ofs;\n  mz_int64 cur_file_ofs;\n  const mz_uint8 *p;\n  mz_uint32 buf_u32[4096 / sizeof(mz_uint32)];\n  mz_uint8 *pBuf = (mz_uint8 *)buf_u32;\n  mz_bool sort_central_dir =\n      ((flags & MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY) == 0);\n  // Basic sanity checks - reject files which are too small, and check the first\n  // 4 bytes of the file to make sure a local header is there.\n  if (pZip->m_archive_size < MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE)\n    return MZ_FALSE;\n  // Find the end of central directory record by scanning the file from the end\n  // towards the beginning.\n  cur_file_ofs =\n      MZ_MAX((mz_int64)pZip->m_archive_size - (mz_int64)sizeof(buf_u32), 0);\n  for (;;) {\n    int i,\n        n = (int)MZ_MIN(sizeof(buf_u32), pZip->m_archive_size - cur_file_ofs);\n    if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, n) != (mz_uint)n)\n      return MZ_FALSE;\n    for (i = n - 4; i >= 0; --i)\n      if (MZ_READ_LE32(pBuf + i) == MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG) break;\n    if (i >= 0) {\n      cur_file_ofs += i;\n      break;\n    }\n    if ((!cur_file_ofs) || ((pZip->m_archive_size - cur_file_ofs) >=\n                            (0xFFFF + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE)))\n      return MZ_FALSE;\n    cur_file_ofs = MZ_MAX(cur_file_ofs - (sizeof(buf_u32) - 3), 0);\n  }\n  // Read and verify the end of central directory record.\n  if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf,\n                    MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) !=\n      MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE)\n    return MZ_FALSE;\n  if ((MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_SIG_OFS) !=\n       MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG) ||\n      ((pZip->m_total_files =\n            MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS)) !=\n       MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS)))\n    return MZ_FALSE;\n\n  num_this_disk = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_THIS_DISK_OFS);\n  cdir_disk_index = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS);\n  if (((num_this_disk | cdir_disk_index) != 0) &&\n      ((num_this_disk != 1) || (cdir_disk_index != 1)))\n    return MZ_FALSE;\n\n  if ((cdir_size = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_SIZE_OFS)) <\n      pZip->m_total_files * MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)\n    return MZ_FALSE;\n\n  cdir_ofs = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_OFS_OFS);\n  if ((cdir_ofs + (mz_uint64)cdir_size) > pZip->m_archive_size) return MZ_FALSE;\n\n  pZip->m_central_directory_file_ofs = cdir_ofs;\n\n  if (pZip->m_total_files) {\n    mz_uint i, n;\n\n    // Read the entire central directory into a heap block, and allocate another\n    // heap block to hold the unsorted central dir file record offsets, and\n    // another to hold the sorted indices.\n    if ((!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir, cdir_size,\n                              MZ_FALSE)) ||\n        (!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir_offsets,\n                              pZip->m_total_files, MZ_FALSE)))\n      return MZ_FALSE;\n\n    if (sort_central_dir) {\n      if (!mz_zip_array_resize(pZip,\n                               &pZip->m_pState->m_sorted_central_dir_offsets,\n                               pZip->m_total_files, MZ_FALSE))\n        return MZ_FALSE;\n    }\n\n    if (pZip->m_pRead(pZip->m_pIO_opaque, cdir_ofs,\n                      pZip->m_pState->m_central_dir.m_p,\n                      cdir_size) != cdir_size)\n      return MZ_FALSE;\n\n    // Now create an index into the central directory file records, do some\n    // basic sanity checking on each record, and check for zip64 entries (which\n    // are not yet supported).\n    p = (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p;\n    for (n = cdir_size, i = 0; i < pZip->m_total_files; ++i) {\n      mz_uint total_header_size, comp_size, decomp_size, disk_index;\n      if ((n < MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) ||\n          (MZ_READ_LE32(p) != MZ_ZIP_CENTRAL_DIR_HEADER_SIG))\n        return MZ_FALSE;\n      MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32,\n                           i) =\n          (mz_uint32)(p - (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p);\n      if (sort_central_dir)\n        MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_sorted_central_dir_offsets,\n                             mz_uint32, i) = i;\n      comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS);\n      decomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS);\n      if (((!MZ_READ_LE32(p + MZ_ZIP_CDH_METHOD_OFS)) &&\n           (decomp_size != comp_size)) ||\n          (decomp_size && !comp_size) || (decomp_size == 0xFFFFFFFF) ||\n          (comp_size == 0xFFFFFFFF))\n        return MZ_FALSE;\n      disk_index = MZ_READ_LE16(p + MZ_ZIP_CDH_DISK_START_OFS);\n      if ((disk_index != num_this_disk) && (disk_index != 1)) return MZ_FALSE;\n      if (((mz_uint64)MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS) +\n           MZ_ZIP_LOCAL_DIR_HEADER_SIZE + comp_size) > pZip->m_archive_size)\n        return MZ_FALSE;\n      if ((total_header_size = MZ_ZIP_CENTRAL_DIR_HEADER_SIZE +\n                               MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) +\n                               MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS) +\n                               MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS)) >\n          n)\n        return MZ_FALSE;\n      n -= total_header_size;\n      p += total_header_size;\n    }\n  }\n\n  if (sort_central_dir)\n    mz_zip_reader_sort_central_dir_offsets_by_filename(pZip);\n\n  return MZ_TRUE;\n}\n\nmz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size,\n                           mz_uint32 flags) {\n  if ((!pZip) || (!pZip->m_pRead)) return MZ_FALSE;\n  if (!mz_zip_reader_init_internal(pZip, flags)) return MZ_FALSE;\n  pZip->m_archive_size = size;\n  if (!mz_zip_reader_read_central_dir(pZip, flags)) {\n    mz_zip_reader_end(pZip);\n    return MZ_FALSE;\n  }\n  return MZ_TRUE;\n}\n\nstatic size_t mz_zip_mem_read_func(void *pOpaque, mz_uint64 file_ofs,\n                                   void *pBuf, size_t n) {\n  mz_zip_archive *pZip = (mz_zip_archive *)pOpaque;\n  size_t s = (file_ofs >= pZip->m_archive_size)\n                 ? 0\n                 : (size_t)MZ_MIN(pZip->m_archive_size - file_ofs, n);\n  memcpy(pBuf, (const mz_uint8 *)pZip->m_pState->m_pMem + file_ofs, s);\n  return s;\n}\n\nmz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem,\n                               size_t size, mz_uint32 flags) {\n  if (!mz_zip_reader_init_internal(pZip, flags)) return MZ_FALSE;\n  pZip->m_archive_size = size;\n  pZip->m_pRead = mz_zip_mem_read_func;\n  pZip->m_pIO_opaque = pZip;\n#ifdef __cplusplus\n  pZip->m_pState->m_pMem = const_cast<void *>(pMem);\n#else\n  pZip->m_pState->m_pMem = (void *)pMem;\n#endif\n  pZip->m_pState->m_mem_size = size;\n  if (!mz_zip_reader_read_central_dir(pZip, flags)) {\n    mz_zip_reader_end(pZip);\n    return MZ_FALSE;\n  }\n  return MZ_TRUE;\n}\n\n#ifndef MINIZ_NO_STDIO\nstatic size_t mz_zip_file_read_func(void *pOpaque, mz_uint64 file_ofs,\n                                    void *pBuf, size_t n) {\n  mz_zip_archive *pZip = (mz_zip_archive *)pOpaque;\n  mz_int64 cur_ofs = MZ_FTELL64(pZip->m_pState->m_pFile);\n  if (((mz_int64)file_ofs < 0) ||\n      (((cur_ofs != (mz_int64)file_ofs)) &&\n       (MZ_FSEEK64(pZip->m_pState->m_pFile, (mz_int64)file_ofs, SEEK_SET))))\n    return 0;\n  return MZ_FREAD(pBuf, 1, n, pZip->m_pState->m_pFile);\n}\n\nmz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename,\n                                mz_uint32 flags) {\n  mz_uint64 file_size;\n  MZ_FILE *pFile = MZ_FOPEN(pFilename, \"rb\");\n  if (!pFile) return MZ_FALSE;\n  if (MZ_FSEEK64(pFile, 0, SEEK_END)) {\n    MZ_FCLOSE(pFile);\n    return MZ_FALSE;\n  }\n  file_size = MZ_FTELL64(pFile);\n  if (!mz_zip_reader_init_internal(pZip, flags)) {\n    MZ_FCLOSE(pFile);\n    return MZ_FALSE;\n  }\n  pZip->m_pRead = mz_zip_file_read_func;\n  pZip->m_pIO_opaque = pZip;\n  pZip->m_pState->m_pFile = pFile;\n  pZip->m_archive_size = file_size;\n  if (!mz_zip_reader_read_central_dir(pZip, flags)) {\n    mz_zip_reader_end(pZip);\n    return MZ_FALSE;\n  }\n  return MZ_TRUE;\n}\n#endif  // #ifndef MINIZ_NO_STDIO\n\nmz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip) {\n  return pZip ? pZip->m_total_files : 0;\n}\n\nstatic MZ_FORCEINLINE const mz_uint8 *mz_zip_reader_get_cdh(\n    mz_zip_archive *pZip, mz_uint file_index) {\n  if ((!pZip) || (!pZip->m_pState) || (file_index >= pZip->m_total_files) ||\n      (pZip->m_zip_mode != MZ_ZIP_MODE_READING))\n    return NULL;\n  return &MZ_ZIP_ARRAY_ELEMENT(\n      &pZip->m_pState->m_central_dir, mz_uint8,\n      MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32,\n                           file_index));\n}\n\nmz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip,\n                                        mz_uint file_index) {\n  mz_uint m_bit_flag;\n  const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);\n  if (!p) return MZ_FALSE;\n  m_bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS);\n  return (m_bit_flag & 1);\n}\n\nmz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip,\n                                          mz_uint file_index) {\n  mz_uint filename_len, external_attr;\n  const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);\n  if (!p) return MZ_FALSE;\n\n  // First see if the filename ends with a '/' character.\n  filename_len = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS);\n  if (filename_len) {\n    if (*(p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_len - 1) == '/')\n      return MZ_TRUE;\n  }\n\n  // Bugfix: This code was also checking if the internal attribute was non-zero,\n  // which wasn't correct.\n  // Most/all zip writers (hopefully) set DOS file/directory attributes in the\n  // low 16-bits, so check for the DOS directory flag and ignore the source OS\n  // ID in the created by field.\n  // FIXME: Remove this check? Is it necessary - we already check the filename.\n  external_attr = MZ_READ_LE32(p + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS);\n  if ((external_attr & 0x10) != 0) return MZ_TRUE;\n\n  return MZ_FALSE;\n}\n\nmz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index,\n                                mz_zip_archive_file_stat *pStat) {\n  mz_uint n;\n  const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);\n  if ((!p) || (!pStat)) return MZ_FALSE;\n\n  // Unpack the central directory record.\n  pStat->m_file_index = file_index;\n  pStat->m_central_dir_ofs = MZ_ZIP_ARRAY_ELEMENT(\n      &pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index);\n  pStat->m_version_made_by = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_MADE_BY_OFS);\n  pStat->m_version_needed = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_NEEDED_OFS);\n  pStat->m_bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS);\n  pStat->m_method = MZ_READ_LE16(p + MZ_ZIP_CDH_METHOD_OFS);\n#ifndef MINIZ_NO_TIME\n  pStat->m_time =\n      mz_zip_dos_to_time_t(MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_TIME_OFS),\n                           MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_DATE_OFS));\n#endif\n  pStat->m_crc32 = MZ_READ_LE32(p + MZ_ZIP_CDH_CRC32_OFS);\n  pStat->m_comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS);\n  pStat->m_uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS);\n  pStat->m_internal_attr = MZ_READ_LE16(p + MZ_ZIP_CDH_INTERNAL_ATTR_OFS);\n  pStat->m_external_attr = MZ_READ_LE32(p + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS);\n  pStat->m_local_header_ofs = MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS);\n\n  // Copy as much of the filename and comment as possible.\n  n = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS);\n  n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE - 1);\n  memcpy(pStat->m_filename, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n);\n  pStat->m_filename[n] = '\\0';\n\n  n = MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS);\n  n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE - 1);\n  pStat->m_comment_size = n;\n  memcpy(pStat->m_comment,\n         p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE +\n             MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) +\n             MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS),\n         n);\n  pStat->m_comment[n] = '\\0';\n\n  return MZ_TRUE;\n}\n\nmz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index,\n                                   char *pFilename, mz_uint filename_buf_size) {\n  mz_uint n;\n  const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);\n  if (!p) {\n    if (filename_buf_size) pFilename[0] = '\\0';\n    return 0;\n  }\n  n = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS);\n  if (filename_buf_size) {\n    n = MZ_MIN(n, filename_buf_size - 1);\n    memcpy(pFilename, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n);\n    pFilename[n] = '\\0';\n  }\n  return n + 1;\n}\n\nstatic MZ_FORCEINLINE mz_bool mz_zip_reader_string_equal(const char *pA,\n                                                         const char *pB,\n                                                         mz_uint len,\n                                                         mz_uint flags) {\n  mz_uint i;\n  if (flags & MZ_ZIP_FLAG_CASE_SENSITIVE) return 0 == memcmp(pA, pB, len);\n  for (i = 0; i < len; ++i)\n    if (MZ_TOLOWER(pA[i]) != MZ_TOLOWER(pB[i])) return MZ_FALSE;\n  return MZ_TRUE;\n}\n\nstatic MZ_FORCEINLINE int mz_zip_reader_filename_compare(\n    const mz_zip_array *pCentral_dir_array,\n    const mz_zip_array *pCentral_dir_offsets, mz_uint l_index, const char *pR,\n    mz_uint r_len) {\n  const mz_uint8 *pL = &MZ_ZIP_ARRAY_ELEMENT(\n                     pCentral_dir_array, mz_uint8,\n                     MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32,\n                                          l_index)),\n                 *pE;\n  mz_uint l_len = MZ_READ_LE16(pL + MZ_ZIP_CDH_FILENAME_LEN_OFS);\n  mz_uint8 l = 0, r = 0;\n  pL += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE;\n  pE = pL + MZ_MIN(l_len, r_len);\n  while (pL < pE) {\n    if ((l = MZ_TOLOWER(*pL)) != (r = MZ_TOLOWER(*pR))) break;\n    pL++;\n    pR++;\n  }\n  return (pL == pE) ? (int)(l_len - r_len) : (l - r);\n}\n\nstatic int mz_zip_reader_locate_file_binary_search(mz_zip_archive *pZip,\n                                                   const char *pFilename) {\n  mz_zip_internal_state *pState = pZip->m_pState;\n  const mz_zip_array *pCentral_dir_offsets = &pState->m_central_dir_offsets;\n  const mz_zip_array *pCentral_dir = &pState->m_central_dir;\n  mz_uint32 *pIndices = &MZ_ZIP_ARRAY_ELEMENT(\n      &pState->m_sorted_central_dir_offsets, mz_uint32, 0);\n  const int size = pZip->m_total_files;\n  const mz_uint filename_len = (mz_uint)strlen(pFilename);\n  int l = 0, h = size - 1;\n  while (l <= h) {\n    int m = (l + h) >> 1, file_index = pIndices[m],\n        comp =\n            mz_zip_reader_filename_compare(pCentral_dir, pCentral_dir_offsets,\n                                           file_index, pFilename, filename_len);\n    if (!comp)\n      return file_index;\n    else if (comp < 0)\n      l = m + 1;\n    else\n      h = m - 1;\n  }\n  return -1;\n}\n\nint mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName,\n                              const char *pComment, mz_uint flags) {\n  mz_uint file_index;\n  size_t name_len, comment_len;\n  if ((!pZip) || (!pZip->m_pState) || (!pName) ||\n      (pZip->m_zip_mode != MZ_ZIP_MODE_READING))\n    return -1;\n  if (((flags & (MZ_ZIP_FLAG_IGNORE_PATH | MZ_ZIP_FLAG_CASE_SENSITIVE)) == 0) &&\n      (!pComment) && (pZip->m_pState->m_sorted_central_dir_offsets.m_size))\n    return mz_zip_reader_locate_file_binary_search(pZip, pName);\n  name_len = strlen(pName);\n  if (name_len > 0xFFFF) return -1;\n  comment_len = pComment ? strlen(pComment) : 0;\n  if (comment_len > 0xFFFF) return -1;\n  for (file_index = 0; file_index < pZip->m_total_files; file_index++) {\n    const mz_uint8 *pHeader = &MZ_ZIP_ARRAY_ELEMENT(\n        &pZip->m_pState->m_central_dir, mz_uint8,\n        MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32,\n                             file_index));\n    mz_uint filename_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_FILENAME_LEN_OFS);\n    const char *pFilename =\n        (const char *)pHeader + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE;\n    if (filename_len < name_len) continue;\n    if (comment_len) {\n      mz_uint file_extra_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_EXTRA_LEN_OFS),\n              file_comment_len =\n                  MZ_READ_LE16(pHeader + MZ_ZIP_CDH_COMMENT_LEN_OFS);\n      const char *pFile_comment = pFilename + filename_len + file_extra_len;\n      if ((file_comment_len != comment_len) ||\n          (!mz_zip_reader_string_equal(pComment, pFile_comment,\n                                       file_comment_len, flags)))\n        continue;\n    }\n    if ((flags & MZ_ZIP_FLAG_IGNORE_PATH) && (filename_len)) {\n      int ofs = filename_len - 1;\n      do {\n        if ((pFilename[ofs] == '/') || (pFilename[ofs] == '\\\\') ||\n            (pFilename[ofs] == ':'))\n          break;\n      } while (--ofs >= 0);\n      ofs++;\n      pFilename += ofs;\n      filename_len -= ofs;\n    }\n    if ((filename_len == name_len) &&\n        (mz_zip_reader_string_equal(pName, pFilename, filename_len, flags)))\n      return file_index;\n  }\n  return -1;\n}\n\nmz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip,\n                                              mz_uint file_index, void *pBuf,\n                                              size_t buf_size, mz_uint flags,\n                                              void *pUser_read_buf,\n                                              size_t user_read_buf_size) {\n  int status = TINFL_STATUS_DONE;\n  mz_uint64 needed_size, cur_file_ofs, comp_remaining,\n      out_buf_ofs = 0, read_buf_size, read_buf_ofs = 0, read_buf_avail;\n  mz_zip_archive_file_stat file_stat;\n  void *pRead_buf;\n  mz_uint32\n      local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) /\n                       sizeof(mz_uint32)];\n  mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32;\n  tinfl_decompressor inflator;\n\n  if ((buf_size) && (!pBuf)) return MZ_FALSE;\n\n  if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat)) return MZ_FALSE;\n\n  // Empty file, or a directory (but not always a directory - I've seen odd zips\n  // with directories that have compressed data which inflates to 0 bytes)\n  if (!file_stat.m_comp_size) return MZ_TRUE;\n\n  // Entry is a subdirectory (I've seen old zips with dir entries which have\n  // compressed deflate data which inflates to 0 bytes, but these entries claim\n  // to uncompress to 512 bytes in the headers).\n  // I'm torn how to handle this case - should it fail instead?\n  if (mz_zip_reader_is_file_a_directory(pZip, file_index)) return MZ_TRUE;\n\n  // Encryption and patch files are not supported.\n  if (file_stat.m_bit_flag & (1 | 32)) return MZ_FALSE;\n\n  // This function only supports stored and deflate.\n  if ((!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (file_stat.m_method != 0) &&\n      (file_stat.m_method != MZ_DEFLATED))\n    return MZ_FALSE;\n\n  // Ensure supplied output buffer is large enough.\n  needed_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? file_stat.m_comp_size\n                                                      : file_stat.m_uncomp_size;\n  if (buf_size < needed_size) return MZ_FALSE;\n\n  // Read and parse the local directory entry.\n  cur_file_ofs = file_stat.m_local_header_ofs;\n  if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pLocal_header,\n                    MZ_ZIP_LOCAL_DIR_HEADER_SIZE) !=\n      MZ_ZIP_LOCAL_DIR_HEADER_SIZE)\n    return MZ_FALSE;\n  if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG)\n    return MZ_FALSE;\n\n  cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE +\n                  MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) +\n                  MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS);\n  if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size)\n    return MZ_FALSE;\n\n  if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!file_stat.m_method)) {\n    // The file is stored or the caller has requested the compressed data.\n    if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf,\n                      (size_t)needed_size) != needed_size)\n      return MZ_FALSE;\n    return ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) != 0) ||\n           (mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf,\n                     (size_t)file_stat.m_uncomp_size) == file_stat.m_crc32);\n  }\n\n  // Decompress the file either directly from memory or from a file input\n  // buffer.\n  tinfl_init(&inflator);\n\n  if (pZip->m_pState->m_pMem) {\n    // Read directly from the archive in memory.\n    pRead_buf = (mz_uint8 *)pZip->m_pState->m_pMem + cur_file_ofs;\n    read_buf_size = read_buf_avail = file_stat.m_comp_size;\n    comp_remaining = 0;\n  } else if (pUser_read_buf) {\n    // Use a user provided read buffer.\n    if (!user_read_buf_size) return MZ_FALSE;\n    pRead_buf = (mz_uint8 *)pUser_read_buf;\n    read_buf_size = user_read_buf_size;\n    read_buf_avail = 0;\n    comp_remaining = file_stat.m_comp_size;\n  } else {\n    // Temporarily allocate a read buffer.\n    read_buf_size =\n        MZ_MIN(file_stat.m_comp_size, (mz_uint)MZ_ZIP_MAX_IO_BUF_SIZE);\n#ifdef _MSC_VER\n    if (((0, sizeof(size_t) == sizeof(mz_uint32))) &&\n        (read_buf_size > 0x7FFFFFFF))\n#else\n    if (((sizeof(size_t) == sizeof(mz_uint32))) && (read_buf_size > 0x7FFFFFFF))\n#endif\n      return MZ_FALSE;\n    if (NULL == (pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1,\n                                            (size_t)read_buf_size)))\n      return MZ_FALSE;\n    read_buf_avail = 0;\n    comp_remaining = file_stat.m_comp_size;\n  }\n\n  do {\n    size_t in_buf_size,\n        out_buf_size = (size_t)(file_stat.m_uncomp_size - out_buf_ofs);\n    if ((!read_buf_avail) && (!pZip->m_pState->m_pMem)) {\n      read_buf_avail = MZ_MIN(read_buf_size, comp_remaining);\n      if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf,\n                        (size_t)read_buf_avail) != read_buf_avail) {\n        status = TINFL_STATUS_FAILED;\n        break;\n      }\n      cur_file_ofs += read_buf_avail;\n      comp_remaining -= read_buf_avail;\n      read_buf_ofs = 0;\n    }\n    in_buf_size = (size_t)read_buf_avail;\n    status = tinfl_decompress(\n        &inflator, (mz_uint8 *)pRead_buf + read_buf_ofs, &in_buf_size,\n        (mz_uint8 *)pBuf, (mz_uint8 *)pBuf + out_buf_ofs, &out_buf_size,\n        TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF |\n            (comp_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0));\n    read_buf_avail -= in_buf_size;\n    read_buf_ofs += in_buf_size;\n    out_buf_ofs += out_buf_size;\n  } while (status == TINFL_STATUS_NEEDS_MORE_INPUT);\n\n  if (status == TINFL_STATUS_DONE) {\n    // Make sure the entire file was decompressed, and check its CRC.\n    if ((out_buf_ofs != file_stat.m_uncomp_size) ||\n        (mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf,\n                  (size_t)file_stat.m_uncomp_size) != file_stat.m_crc32))\n      status = TINFL_STATUS_FAILED;\n  }\n\n  if ((!pZip->m_pState->m_pMem) && (!pUser_read_buf))\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);\n\n  return status == TINFL_STATUS_DONE;\n}\n\nmz_bool mz_zip_reader_extract_file_to_mem_no_alloc(\n    mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size,\n    mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size) {\n  int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags);\n  if (file_index < 0) return MZ_FALSE;\n  return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size,\n                                               flags, pUser_read_buf,\n                                               user_read_buf_size);\n}\n\nmz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index,\n                                     void *pBuf, size_t buf_size,\n                                     mz_uint flags) {\n  return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size,\n                                               flags, NULL, 0);\n}\n\nmz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip,\n                                          const char *pFilename, void *pBuf,\n                                          size_t buf_size, mz_uint flags) {\n  return mz_zip_reader_extract_file_to_mem_no_alloc(pZip, pFilename, pBuf,\n                                                    buf_size, flags, NULL, 0);\n}\n\nvoid *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index,\n                                    size_t *pSize, mz_uint flags) {\n  mz_uint64 comp_size, uncomp_size, alloc_size;\n  const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);\n  void *pBuf;\n\n  if (pSize) *pSize = 0;\n  if (!p) return NULL;\n\n  comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS);\n  uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS);\n\n  alloc_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? comp_size : uncomp_size;\n#ifdef _MSC_VER\n  if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (alloc_size > 0x7FFFFFFF))\n#else\n  if (((sizeof(size_t) == sizeof(mz_uint32))) && (alloc_size > 0x7FFFFFFF))\n#endif\n    return NULL;\n  if (NULL ==\n      (pBuf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)alloc_size)))\n    return NULL;\n\n  if (!mz_zip_reader_extract_to_mem(pZip, file_index, pBuf, (size_t)alloc_size,\n                                    flags)) {\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);\n    return NULL;\n  }\n\n  if (pSize) *pSize = (size_t)alloc_size;\n  return pBuf;\n}\n\nvoid *mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip,\n                                         const char *pFilename, size_t *pSize,\n                                         mz_uint flags) {\n  int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags);\n  if (file_index < 0) {\n    if (pSize) *pSize = 0;\n    return MZ_FALSE;\n  }\n  return mz_zip_reader_extract_to_heap(pZip, file_index, pSize, flags);\n}\n\nmz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip,\n                                          mz_uint file_index,\n                                          mz_file_write_func pCallback,\n                                          void *pOpaque, mz_uint flags) {\n  int status = TINFL_STATUS_DONE;\n  mz_uint file_crc32 = MZ_CRC32_INIT;\n  mz_uint64 read_buf_size, read_buf_ofs = 0, read_buf_avail, comp_remaining,\n                           out_buf_ofs = 0, cur_file_ofs;\n  mz_zip_archive_file_stat file_stat;\n  void *pRead_buf = NULL;\n  void *pWrite_buf = NULL;\n  mz_uint32\n      local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) /\n                       sizeof(mz_uint32)];\n  mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32;\n\n  if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat)) return MZ_FALSE;\n\n  // Empty file, or a directory (but not always a directory - I've seen odd zips\n  // with directories that have compressed data which inflates to 0 bytes)\n  if (!file_stat.m_comp_size) return MZ_TRUE;\n\n  // Entry is a subdirectory (I've seen old zips with dir entries which have\n  // compressed deflate data which inflates to 0 bytes, but these entries claim\n  // to uncompress to 512 bytes in the headers).\n  // I'm torn how to handle this case - should it fail instead?\n  if (mz_zip_reader_is_file_a_directory(pZip, file_index)) return MZ_TRUE;\n\n  // Encryption and patch files are not supported.\n  if (file_stat.m_bit_flag & (1 | 32)) return MZ_FALSE;\n\n  // This function only supports stored and deflate.\n  if ((!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (file_stat.m_method != 0) &&\n      (file_stat.m_method != MZ_DEFLATED))\n    return MZ_FALSE;\n\n  // Read and parse the local directory entry.\n  cur_file_ofs = file_stat.m_local_header_ofs;\n  if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pLocal_header,\n                    MZ_ZIP_LOCAL_DIR_HEADER_SIZE) !=\n      MZ_ZIP_LOCAL_DIR_HEADER_SIZE)\n    return MZ_FALSE;\n  if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG)\n    return MZ_FALSE;\n\n  cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE +\n                  MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) +\n                  MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS);\n  if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size)\n    return MZ_FALSE;\n\n  // Decompress the file either directly from memory or from a file input\n  // buffer.\n  if (pZip->m_pState->m_pMem) {\n    pRead_buf = (mz_uint8 *)pZip->m_pState->m_pMem + cur_file_ofs;\n    read_buf_size = read_buf_avail = file_stat.m_comp_size;\n    comp_remaining = 0;\n  } else {\n    read_buf_size =\n        MZ_MIN(file_stat.m_comp_size, (mz_uint)MZ_ZIP_MAX_IO_BUF_SIZE);\n    if (NULL == (pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1,\n                                            (size_t)read_buf_size)))\n      return MZ_FALSE;\n    read_buf_avail = 0;\n    comp_remaining = file_stat.m_comp_size;\n  }\n\n  if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!file_stat.m_method)) {\n    // The file is stored or the caller has requested the compressed data.\n    if (pZip->m_pState->m_pMem) {\n#ifdef _MSC_VER\n      if (((0, sizeof(size_t) == sizeof(mz_uint32))) &&\n          (file_stat.m_comp_size > 0xFFFFFFFF))\n#else\n      if (((sizeof(size_t) == sizeof(mz_uint32))) &&\n          (file_stat.m_comp_size > 0xFFFFFFFF))\n#endif\n        return MZ_FALSE;\n      if (pCallback(pOpaque, out_buf_ofs, pRead_buf,\n                    (size_t)file_stat.m_comp_size) != file_stat.m_comp_size)\n        status = TINFL_STATUS_FAILED;\n      else if (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA))\n        file_crc32 =\n            (mz_uint32)mz_crc32(file_crc32, (const mz_uint8 *)pRead_buf,\n                                (size_t)file_stat.m_comp_size);\n      cur_file_ofs += file_stat.m_comp_size;\n      out_buf_ofs += file_stat.m_comp_size;\n      comp_remaining = 0;\n    } else {\n      while (comp_remaining) {\n        read_buf_avail = MZ_MIN(read_buf_size, comp_remaining);\n        if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf,\n                          (size_t)read_buf_avail) != read_buf_avail) {\n          status = TINFL_STATUS_FAILED;\n          break;\n        }\n\n        if (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA))\n          file_crc32 = (mz_uint32)mz_crc32(\n              file_crc32, (const mz_uint8 *)pRead_buf, (size_t)read_buf_avail);\n\n        if (pCallback(pOpaque, out_buf_ofs, pRead_buf,\n                      (size_t)read_buf_avail) != read_buf_avail) {\n          status = TINFL_STATUS_FAILED;\n          break;\n        }\n        cur_file_ofs += read_buf_avail;\n        out_buf_ofs += read_buf_avail;\n        comp_remaining -= read_buf_avail;\n      }\n    }\n  } else {\n    tinfl_decompressor inflator;\n    tinfl_init(&inflator);\n\n    if (NULL == (pWrite_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1,\n                                             TINFL_LZ_DICT_SIZE)))\n      status = TINFL_STATUS_FAILED;\n    else {\n      do {\n        mz_uint8 *pWrite_buf_cur =\n            (mz_uint8 *)pWrite_buf + (out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1));\n        size_t in_buf_size,\n            out_buf_size =\n                TINFL_LZ_DICT_SIZE - (out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1));\n        if ((!read_buf_avail) && (!pZip->m_pState->m_pMem)) {\n          read_buf_avail = MZ_MIN(read_buf_size, comp_remaining);\n          if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf,\n                            (size_t)read_buf_avail) != read_buf_avail) {\n            status = TINFL_STATUS_FAILED;\n            break;\n          }\n          cur_file_ofs += read_buf_avail;\n          comp_remaining -= read_buf_avail;\n          read_buf_ofs = 0;\n        }\n\n        in_buf_size = (size_t)read_buf_avail;\n        status = tinfl_decompress(\n            &inflator, (const mz_uint8 *)pRead_buf + read_buf_ofs, &in_buf_size,\n            (mz_uint8 *)pWrite_buf, pWrite_buf_cur, &out_buf_size,\n            comp_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0);\n        read_buf_avail -= in_buf_size;\n        read_buf_ofs += in_buf_size;\n\n        if (out_buf_size) {\n          if (pCallback(pOpaque, out_buf_ofs, pWrite_buf_cur, out_buf_size) !=\n              out_buf_size) {\n            status = TINFL_STATUS_FAILED;\n            break;\n          }\n          file_crc32 =\n              (mz_uint32)mz_crc32(file_crc32, pWrite_buf_cur, out_buf_size);\n          if ((out_buf_ofs += out_buf_size) > file_stat.m_uncomp_size) {\n            status = TINFL_STATUS_FAILED;\n            break;\n          }\n        }\n      } while ((status == TINFL_STATUS_NEEDS_MORE_INPUT) ||\n               (status == TINFL_STATUS_HAS_MORE_OUTPUT));\n    }\n  }\n\n  if ((status == TINFL_STATUS_DONE) &&\n      (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA))) {\n    // Make sure the entire file was decompressed, and check its CRC.\n    if ((out_buf_ofs != file_stat.m_uncomp_size) ||\n        (file_crc32 != file_stat.m_crc32))\n      status = TINFL_STATUS_FAILED;\n  }\n\n  if (!pZip->m_pState->m_pMem) pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);\n  if (pWrite_buf) pZip->m_pFree(pZip->m_pAlloc_opaque, pWrite_buf);\n\n  return status == TINFL_STATUS_DONE;\n}\n\nmz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip,\n                                               const char *pFilename,\n                                               mz_file_write_func pCallback,\n                                               void *pOpaque, mz_uint flags) {\n  int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags);\n  if (file_index < 0) return MZ_FALSE;\n  return mz_zip_reader_extract_to_callback(pZip, file_index, pCallback, pOpaque,\n                                           flags);\n}\n\n#ifndef MINIZ_NO_STDIO\nstatic size_t mz_zip_file_write_callback(void *pOpaque, mz_uint64 ofs,\n                                         const void *pBuf, size_t n) {\n  (void)ofs;\n  return MZ_FWRITE(pBuf, 1, n, (MZ_FILE *)pOpaque);\n}\n\nmz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index,\n                                      const char *pDst_filename,\n                                      mz_uint flags) {\n  mz_bool status;\n  mz_zip_archive_file_stat file_stat;\n  MZ_FILE *pFile;\n  if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat)) return MZ_FALSE;\n  pFile = MZ_FOPEN(pDst_filename, \"wb\");\n  if (!pFile) return MZ_FALSE;\n  status = mz_zip_reader_extract_to_callback(\n      pZip, file_index, mz_zip_file_write_callback, pFile, flags);\n  if (MZ_FCLOSE(pFile) == EOF) return MZ_FALSE;\n#ifndef MINIZ_NO_TIME\n  if (status)\n    mz_zip_set_file_times(pDst_filename, file_stat.m_time, file_stat.m_time);\n#endif\n  return status;\n}\n#endif  // #ifndef MINIZ_NO_STDIO\n\nmz_bool mz_zip_reader_end(mz_zip_archive *pZip) {\n  if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) ||\n      (pZip->m_zip_mode != MZ_ZIP_MODE_READING))\n    return MZ_FALSE;\n\n  if (pZip->m_pState) {\n    mz_zip_internal_state *pState = pZip->m_pState;\n    pZip->m_pState = NULL;\n    mz_zip_array_clear(pZip, &pState->m_central_dir);\n    mz_zip_array_clear(pZip, &pState->m_central_dir_offsets);\n    mz_zip_array_clear(pZip, &pState->m_sorted_central_dir_offsets);\n\n#ifndef MINIZ_NO_STDIO\n    if (pState->m_pFile) {\n      MZ_FCLOSE(pState->m_pFile);\n      pState->m_pFile = NULL;\n    }\n#endif  // #ifndef MINIZ_NO_STDIO\n\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pState);\n  }\n  pZip->m_zip_mode = MZ_ZIP_MODE_INVALID;\n\n  return MZ_TRUE;\n}\n\n#ifndef MINIZ_NO_STDIO\nmz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip,\n                                           const char *pArchive_filename,\n                                           const char *pDst_filename,\n                                           mz_uint flags) {\n  int file_index =\n      mz_zip_reader_locate_file(pZip, pArchive_filename, NULL, flags);\n  if (file_index < 0) return MZ_FALSE;\n  return mz_zip_reader_extract_to_file(pZip, file_index, pDst_filename, flags);\n}\n#endif\n\n// ------------------- .ZIP archive writing\n\n#ifndef MINIZ_NO_ARCHIVE_WRITING_APIS\n\nstatic void mz_write_le16(mz_uint8 *p, mz_uint16 v) {\n  p[0] = (mz_uint8)v;\n  p[1] = (mz_uint8)(v >> 8);\n}\nstatic void mz_write_le32(mz_uint8 *p, mz_uint32 v) {\n  p[0] = (mz_uint8)v;\n  p[1] = (mz_uint8)(v >> 8);\n  p[2] = (mz_uint8)(v >> 16);\n  p[3] = (mz_uint8)(v >> 24);\n}\n#define MZ_WRITE_LE16(p, v) mz_write_le16((mz_uint8 *)(p), (mz_uint16)(v))\n#define MZ_WRITE_LE32(p, v) mz_write_le32((mz_uint8 *)(p), (mz_uint32)(v))\n\nmz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size) {\n  if ((!pZip) || (pZip->m_pState) || (!pZip->m_pWrite) ||\n      (pZip->m_zip_mode != MZ_ZIP_MODE_INVALID))\n    return MZ_FALSE;\n\n  if (pZip->m_file_offset_alignment) {\n    // Ensure user specified file offset alignment is a power of 2.\n    if (pZip->m_file_offset_alignment & (pZip->m_file_offset_alignment - 1))\n      return MZ_FALSE;\n  }\n\n  if (!pZip->m_pAlloc) pZip->m_pAlloc = def_alloc_func;\n  if (!pZip->m_pFree) pZip->m_pFree = def_free_func;\n  if (!pZip->m_pRealloc) pZip->m_pRealloc = def_realloc_func;\n\n  pZip->m_zip_mode = MZ_ZIP_MODE_WRITING;\n  pZip->m_archive_size = existing_size;\n  pZip->m_central_directory_file_ofs = 0;\n  pZip->m_total_files = 0;\n\n  if (NULL == (pZip->m_pState = (mz_zip_internal_state *)pZip->m_pAlloc(\n                   pZip->m_pAlloc_opaque, 1, sizeof(mz_zip_internal_state))))\n    return MZ_FALSE;\n  memset(pZip->m_pState, 0, sizeof(mz_zip_internal_state));\n  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir,\n                                sizeof(mz_uint8));\n  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir_offsets,\n                                sizeof(mz_uint32));\n  MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_sorted_central_dir_offsets,\n                                sizeof(mz_uint32));\n  return MZ_TRUE;\n}\n\nstatic size_t mz_zip_heap_write_func(void *pOpaque, mz_uint64 file_ofs,\n                                     const void *pBuf, size_t n) {\n  mz_zip_archive *pZip = (mz_zip_archive *)pOpaque;\n  mz_zip_internal_state *pState = pZip->m_pState;\n  mz_uint64 new_size = MZ_MAX(file_ofs + n, pState->m_mem_size);\n#ifdef _MSC_VER\n  if ((!n) ||\n      ((0, sizeof(size_t) == sizeof(mz_uint32)) && (new_size > 0x7FFFFFFF)))\n#else\n  if ((!n) ||\n      ((sizeof(size_t) == sizeof(mz_uint32)) && (new_size > 0x7FFFFFFF)))\n#endif\n    return 0;\n  if (new_size > pState->m_mem_capacity) {\n    void *pNew_block;\n    size_t new_capacity = MZ_MAX(64, pState->m_mem_capacity);\n    while (new_capacity < new_size) new_capacity *= 2;\n    if (NULL == (pNew_block = pZip->m_pRealloc(\n                     pZip->m_pAlloc_opaque, pState->m_pMem, 1, new_capacity)))\n      return 0;\n    pState->m_pMem = pNew_block;\n    pState->m_mem_capacity = new_capacity;\n  }\n  memcpy((mz_uint8 *)pState->m_pMem + file_ofs, pBuf, n);\n  pState->m_mem_size = (size_t)new_size;\n  return n;\n}\n\nmz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip,\n                                size_t size_to_reserve_at_beginning,\n                                size_t initial_allocation_size) {\n  pZip->m_pWrite = mz_zip_heap_write_func;\n  pZip->m_pIO_opaque = pZip;\n  if (!mz_zip_writer_init(pZip, size_to_reserve_at_beginning)) return MZ_FALSE;\n  if (0 != (initial_allocation_size = MZ_MAX(initial_allocation_size,\n                                             size_to_reserve_at_beginning))) {\n    if (NULL == (pZip->m_pState->m_pMem = pZip->m_pAlloc(\n                     pZip->m_pAlloc_opaque, 1, initial_allocation_size))) {\n      mz_zip_writer_end(pZip);\n      return MZ_FALSE;\n    }\n    pZip->m_pState->m_mem_capacity = initial_allocation_size;\n  }\n  return MZ_TRUE;\n}\n\n#ifndef MINIZ_NO_STDIO\nstatic size_t mz_zip_file_write_func(void *pOpaque, mz_uint64 file_ofs,\n                                     const void *pBuf, size_t n) {\n  mz_zip_archive *pZip = (mz_zip_archive *)pOpaque;\n  mz_int64 cur_ofs = MZ_FTELL64(pZip->m_pState->m_pFile);\n  if (((mz_int64)file_ofs < 0) ||\n      (((cur_ofs != (mz_int64)file_ofs)) &&\n       (MZ_FSEEK64(pZip->m_pState->m_pFile, (mz_int64)file_ofs, SEEK_SET))))\n    return 0;\n  return MZ_FWRITE(pBuf, 1, n, pZip->m_pState->m_pFile);\n}\n\nmz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename,\n                                mz_uint64 size_to_reserve_at_beginning) {\n  MZ_FILE *pFile;\n  pZip->m_pWrite = mz_zip_file_write_func;\n  pZip->m_pIO_opaque = pZip;\n  if (!mz_zip_writer_init(pZip, size_to_reserve_at_beginning)) return MZ_FALSE;\n  if (NULL == (pFile = MZ_FOPEN(pFilename, \"wb\"))) {\n    mz_zip_writer_end(pZip);\n    return MZ_FALSE;\n  }\n  pZip->m_pState->m_pFile = pFile;\n  if (size_to_reserve_at_beginning) {\n    mz_uint64 cur_ofs = 0;\n    char buf[4096];\n    MZ_CLEAR_OBJ(buf);\n    do {\n      size_t n = (size_t)MZ_MIN(sizeof(buf), size_to_reserve_at_beginning);\n      if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_ofs, buf, n) != n) {\n        mz_zip_writer_end(pZip);\n        return MZ_FALSE;\n      }\n      cur_ofs += n;\n      size_to_reserve_at_beginning -= n;\n    } while (size_to_reserve_at_beginning);\n  }\n  return MZ_TRUE;\n}\n#endif  // #ifndef MINIZ_NO_STDIO\n\nmz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip,\n                                       const char *pFilename) {\n  mz_zip_internal_state *pState;\n  if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING))\n    return MZ_FALSE;\n  // No sense in trying to write to an archive that's already at the support max\n  // size\n  if ((pZip->m_total_files == 0xFFFF) ||\n      ((pZip->m_archive_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE +\n        MZ_ZIP_LOCAL_DIR_HEADER_SIZE) > 0xFFFFFFFF))\n    return MZ_FALSE;\n\n  pState = pZip->m_pState;\n\n  if (pState->m_pFile) {\n#ifdef MINIZ_NO_STDIO\n    pFilename;\n    return MZ_FALSE;\n#else\n    // Archive is being read from stdio - try to reopen as writable.\n    if (pZip->m_pIO_opaque != pZip) return MZ_FALSE;\n    if (!pFilename) return MZ_FALSE;\n    pZip->m_pWrite = mz_zip_file_write_func;\n    if (NULL ==\n        (pState->m_pFile = MZ_FREOPEN(pFilename, \"r+b\", pState->m_pFile))) {\n      // The mz_zip_archive is now in a bogus state because pState->m_pFile is\n      // NULL, so just close it.\n      mz_zip_reader_end(pZip);\n      return MZ_FALSE;\n    }\n#endif  // #ifdef MINIZ_NO_STDIO\n  } else if (pState->m_pMem) {\n    // Archive lives in a memory block. Assume it's from the heap that we can\n    // resize using the realloc callback.\n    if (pZip->m_pIO_opaque != pZip) return MZ_FALSE;\n    pState->m_mem_capacity = pState->m_mem_size;\n    pZip->m_pWrite = mz_zip_heap_write_func;\n  }\n  // Archive is being read via a user provided read function - make sure the\n  // user has specified a write function too.\n  else if (!pZip->m_pWrite)\n    return MZ_FALSE;\n\n  // Start writing new files at the archive's current central directory\n  // location.\n  pZip->m_archive_size = pZip->m_central_directory_file_ofs;\n  pZip->m_zip_mode = MZ_ZIP_MODE_WRITING;\n  pZip->m_central_directory_file_ofs = 0;\n\n  return MZ_TRUE;\n}\n\nmz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name,\n                              const void *pBuf, size_t buf_size,\n                              mz_uint level_and_flags) {\n  return mz_zip_writer_add_mem_ex(pZip, pArchive_name, pBuf, buf_size, NULL, 0,\n                                  level_and_flags, 0, 0);\n}\n\ntypedef struct {\n  mz_zip_archive *m_pZip;\n  mz_uint64 m_cur_archive_file_ofs;\n  mz_uint64 m_comp_size;\n} mz_zip_writer_add_state;\n\nstatic mz_bool mz_zip_writer_add_put_buf_callback(const void *pBuf, int len,\n                                                  void *pUser) {\n  mz_zip_writer_add_state *pState = (mz_zip_writer_add_state *)pUser;\n  if ((int)pState->m_pZip->m_pWrite(pState->m_pZip->m_pIO_opaque,\n                                    pState->m_cur_archive_file_ofs, pBuf,\n                                    len) != len)\n    return MZ_FALSE;\n  pState->m_cur_archive_file_ofs += len;\n  pState->m_comp_size += len;\n  return MZ_TRUE;\n}\n\nstatic mz_bool mz_zip_writer_create_local_dir_header(\n    mz_zip_archive *pZip, mz_uint8 *pDst, mz_uint16 filename_size,\n    mz_uint16 extra_size, mz_uint64 uncomp_size, mz_uint64 comp_size,\n    mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags,\n    mz_uint16 dos_time, mz_uint16 dos_date) {\n  (void)pZip;\n  memset(pDst, 0, MZ_ZIP_LOCAL_DIR_HEADER_SIZE);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_SIG_OFS, MZ_ZIP_LOCAL_DIR_HEADER_SIG);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_VERSION_NEEDED_OFS, method ? 20 : 0);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_BIT_FLAG_OFS, bit_flags);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_METHOD_OFS, method);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILE_TIME_OFS, dos_time);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILE_DATE_OFS, dos_date);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_CRC32_OFS, uncomp_crc32);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_COMPRESSED_SIZE_OFS, comp_size);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS, uncomp_size);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILENAME_LEN_OFS, filename_size);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_EXTRA_LEN_OFS, extra_size);\n  return MZ_TRUE;\n}\n\nstatic mz_bool mz_zip_writer_create_central_dir_header(\n    mz_zip_archive *pZip, mz_uint8 *pDst, mz_uint16 filename_size,\n    mz_uint16 extra_size, mz_uint16 comment_size, mz_uint64 uncomp_size,\n    mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method,\n    mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date,\n    mz_uint64 local_header_ofs, mz_uint32 ext_attributes) {\n  (void)pZip;\n  memset(pDst, 0, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_SIG_OFS, MZ_ZIP_CENTRAL_DIR_HEADER_SIG);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_VERSION_NEEDED_OFS, method ? 20 : 0);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_BIT_FLAG_OFS, bit_flags);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_METHOD_OFS, method);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILE_TIME_OFS, dos_time);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILE_DATE_OFS, dos_date);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_CRC32_OFS, uncomp_crc32);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS, comp_size);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS, uncomp_size);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILENAME_LEN_OFS, filename_size);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_EXTRA_LEN_OFS, extra_size);\n  MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_COMMENT_LEN_OFS, comment_size);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS, ext_attributes);\n  MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_LOCAL_HEADER_OFS, local_header_ofs);\n  return MZ_TRUE;\n}\n\nstatic mz_bool mz_zip_writer_add_to_central_dir(\n    mz_zip_archive *pZip, const char *pFilename, mz_uint16 filename_size,\n    const void *pExtra, mz_uint16 extra_size, const void *pComment,\n    mz_uint16 comment_size, mz_uint64 uncomp_size, mz_uint64 comp_size,\n    mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags,\n    mz_uint16 dos_time, mz_uint16 dos_date, mz_uint64 local_header_ofs,\n    mz_uint32 ext_attributes) {\n  mz_zip_internal_state *pState = pZip->m_pState;\n  mz_uint32 central_dir_ofs = (mz_uint32)pState->m_central_dir.m_size;\n  size_t orig_central_dir_size = pState->m_central_dir.m_size;\n  mz_uint8 central_dir_header[MZ_ZIP_CENTRAL_DIR_HEADER_SIZE];\n\n  // No zip64 support yet\n  if ((local_header_ofs > 0xFFFFFFFF) ||\n      (((mz_uint64)pState->m_central_dir.m_size +\n        MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_size + extra_size +\n        comment_size) > 0xFFFFFFFF))\n    return MZ_FALSE;\n\n  if (!mz_zip_writer_create_central_dir_header(\n          pZip, central_dir_header, filename_size, extra_size, comment_size,\n          uncomp_size, comp_size, uncomp_crc32, method, bit_flags, dos_time,\n          dos_date, local_header_ofs, ext_attributes))\n    return MZ_FALSE;\n\n  if ((!mz_zip_array_push_back(pZip, &pState->m_central_dir, central_dir_header,\n                               MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)) ||\n      (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pFilename,\n                               filename_size)) ||\n      (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pExtra,\n                               extra_size)) ||\n      (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pComment,\n                               comment_size)) ||\n      (!mz_zip_array_push_back(pZip, &pState->m_central_dir_offsets,\n                               &central_dir_ofs, 1))) {\n    // Try to push the central directory array back into its original state.\n    mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size,\n                        MZ_FALSE);\n    return MZ_FALSE;\n  }\n\n  return MZ_TRUE;\n}\n\nstatic mz_bool mz_zip_writer_validate_archive_name(const char *pArchive_name) {\n  // Basic ZIP archive filename validity checks: Valid filenames cannot start\n  // with a forward slash, cannot contain a drive letter, and cannot use\n  // DOS-style backward slashes.\n  if (*pArchive_name == '/') return MZ_FALSE;\n  while (*pArchive_name) {\n    if ((*pArchive_name == '\\\\') || (*pArchive_name == ':')) return MZ_FALSE;\n    pArchive_name++;\n  }\n  return MZ_TRUE;\n}\n\nstatic mz_uint mz_zip_writer_compute_padding_needed_for_file_alignment(\n    mz_zip_archive *pZip) {\n  mz_uint32 n;\n  if (!pZip->m_file_offset_alignment) return 0;\n  n = (mz_uint32)(pZip->m_archive_size & (pZip->m_file_offset_alignment - 1));\n  return (pZip->m_file_offset_alignment - n) &\n         (pZip->m_file_offset_alignment - 1);\n}\n\nstatic mz_bool mz_zip_writer_write_zeros(mz_zip_archive *pZip,\n                                         mz_uint64 cur_file_ofs, mz_uint32 n) {\n  char buf[4096];\n  memset(buf, 0, MZ_MIN(sizeof(buf), n));\n  while (n) {\n    mz_uint32 s = MZ_MIN(sizeof(buf), n);\n    if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_file_ofs, buf, s) != s)\n      return MZ_FALSE;\n    cur_file_ofs += s;\n    n -= s;\n  }\n  return MZ_TRUE;\n}\n\nmz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip,\n                                 const char *pArchive_name, const void *pBuf,\n                                 size_t buf_size, const void *pComment,\n                                 mz_uint16 comment_size,\n                                 mz_uint level_and_flags, mz_uint64 uncomp_size,\n                                 mz_uint32 uncomp_crc32) {\n  mz_uint16 method = 0, dos_time = 0, dos_date = 0;\n  mz_uint level, ext_attributes = 0, num_alignment_padding_bytes;\n  mz_uint64 local_dir_header_ofs = pZip->m_archive_size,\n            cur_archive_file_ofs = pZip->m_archive_size, comp_size = 0;\n  size_t archive_name_size;\n  mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE];\n  tdefl_compressor *pComp = NULL;\n  mz_bool store_data_uncompressed;\n  mz_zip_internal_state *pState;\n\n  if ((int)level_and_flags < 0) level_and_flags = MZ_DEFAULT_LEVEL;\n  level = level_and_flags & 0xF;\n  store_data_uncompressed =\n      ((!level) || (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA));\n\n  if ((!pZip) || (!pZip->m_pState) ||\n      (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || ((buf_size) && (!pBuf)) ||\n      (!pArchive_name) || ((comment_size) && (!pComment)) ||\n      (pZip->m_total_files == 0xFFFF) || (level > MZ_UBER_COMPRESSION))\n    return MZ_FALSE;\n\n  pState = pZip->m_pState;\n\n  if ((!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (uncomp_size))\n    return MZ_FALSE;\n  // No zip64 support yet\n  if ((buf_size > 0xFFFFFFFF) || (uncomp_size > 0xFFFFFFFF)) return MZ_FALSE;\n  if (!mz_zip_writer_validate_archive_name(pArchive_name)) return MZ_FALSE;\n\n#ifndef MINIZ_NO_TIME\n  {\n    time_t cur_time;\n    time(&cur_time);\n    mz_zip_time_to_dos_time(cur_time, &dos_time, &dos_date);\n  }\n#endif  // #ifndef MINIZ_NO_TIME\n\n  archive_name_size = strlen(pArchive_name);\n  if (archive_name_size > 0xFFFF) return MZ_FALSE;\n\n  num_alignment_padding_bytes =\n      mz_zip_writer_compute_padding_needed_for_file_alignment(pZip);\n\n  // no zip64 support yet\n  if ((pZip->m_total_files == 0xFFFF) ||\n      ((pZip->m_archive_size + num_alignment_padding_bytes +\n        MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE +\n        comment_size + archive_name_size) > 0xFFFFFFFF))\n    return MZ_FALSE;\n\n  if ((archive_name_size) && (pArchive_name[archive_name_size - 1] == '/')) {\n    // Set DOS Subdirectory attribute bit.\n    ext_attributes |= 0x10;\n    // Subdirectories cannot contain data.\n    if ((buf_size) || (uncomp_size)) return MZ_FALSE;\n  }\n\n  // Try to do any allocations before writing to the archive, so if an\n  // allocation fails the file remains unmodified. (A good idea if we're doing\n  // an in-place modification.)\n  if ((!mz_zip_array_ensure_room(\n          pZip, &pState->m_central_dir,\n          MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + archive_name_size + comment_size)) ||\n      (!mz_zip_array_ensure_room(pZip, &pState->m_central_dir_offsets, 1)))\n    return MZ_FALSE;\n\n  if ((!store_data_uncompressed) && (buf_size)) {\n    if (NULL == (pComp = (tdefl_compressor *)pZip->m_pAlloc(\n                     pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor))))\n      return MZ_FALSE;\n  }\n\n  if (!mz_zip_writer_write_zeros(\n          pZip, cur_archive_file_ofs,\n          num_alignment_padding_bytes + sizeof(local_dir_header))) {\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);\n    return MZ_FALSE;\n  }\n  local_dir_header_ofs += num_alignment_padding_bytes;\n  if (pZip->m_file_offset_alignment) {\n    MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) ==\n              0);\n  }\n  cur_archive_file_ofs +=\n      num_alignment_padding_bytes + sizeof(local_dir_header);\n\n  MZ_CLEAR_OBJ(local_dir_header);\n  if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name,\n                     archive_name_size) != archive_name_size) {\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);\n    return MZ_FALSE;\n  }\n  cur_archive_file_ofs += archive_name_size;\n\n  if (!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) {\n    uncomp_crc32 =\n        (mz_uint32)mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, buf_size);\n    uncomp_size = buf_size;\n    if (uncomp_size <= 3) {\n      level = 0;\n      store_data_uncompressed = MZ_TRUE;\n    }\n  }\n\n  if (store_data_uncompressed) {\n    if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pBuf,\n                       buf_size) != buf_size) {\n      pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);\n      return MZ_FALSE;\n    }\n\n    cur_archive_file_ofs += buf_size;\n    comp_size = buf_size;\n\n    if (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA) method = MZ_DEFLATED;\n  } else if (buf_size) {\n    mz_zip_writer_add_state state;\n\n    state.m_pZip = pZip;\n    state.m_cur_archive_file_ofs = cur_archive_file_ofs;\n    state.m_comp_size = 0;\n\n    if ((tdefl_init(pComp, mz_zip_writer_add_put_buf_callback, &state,\n                    tdefl_create_comp_flags_from_zip_params(\n                        level, -15, MZ_DEFAULT_STRATEGY)) !=\n         TDEFL_STATUS_OKAY) ||\n        (tdefl_compress_buffer(pComp, pBuf, buf_size, TDEFL_FINISH) !=\n         TDEFL_STATUS_DONE)) {\n      pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);\n      return MZ_FALSE;\n    }\n\n    comp_size = state.m_comp_size;\n    cur_archive_file_ofs = state.m_cur_archive_file_ofs;\n\n    method = MZ_DEFLATED;\n  }\n\n  pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);\n  pComp = NULL;\n\n  // no zip64 support yet\n  if ((comp_size > 0xFFFFFFFF) || (cur_archive_file_ofs > 0xFFFFFFFF))\n    return MZ_FALSE;\n\n  if (!mz_zip_writer_create_local_dir_header(\n          pZip, local_dir_header, (mz_uint16)archive_name_size, 0, uncomp_size,\n          comp_size, uncomp_crc32, method, 0, dos_time, dos_date))\n    return MZ_FALSE;\n\n  if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header,\n                     sizeof(local_dir_header)) != sizeof(local_dir_header))\n    return MZ_FALSE;\n\n  if (!mz_zip_writer_add_to_central_dir(\n          pZip, pArchive_name, (mz_uint16)archive_name_size, NULL, 0, pComment,\n          comment_size, uncomp_size, comp_size, uncomp_crc32, method, 0,\n          dos_time, dos_date, local_dir_header_ofs, ext_attributes))\n    return MZ_FALSE;\n\n  pZip->m_total_files++;\n  pZip->m_archive_size = cur_archive_file_ofs;\n\n  return MZ_TRUE;\n}\n\n#ifndef MINIZ_NO_STDIO\nmz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name,\n                               const char *pSrc_filename, const void *pComment,\n                               mz_uint16 comment_size,\n                               mz_uint level_and_flags) {\n  mz_uint uncomp_crc32 = MZ_CRC32_INIT, level, num_alignment_padding_bytes;\n  mz_uint16 method = 0, dos_time = 0, dos_date = 0, ext_attributes = 0;\n  mz_uint64 local_dir_header_ofs = pZip->m_archive_size,\n            cur_archive_file_ofs = pZip->m_archive_size, uncomp_size = 0,\n            comp_size = 0;\n  size_t archive_name_size;\n  mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE];\n  MZ_FILE *pSrc_file = NULL;\n\n  if ((int)level_and_flags < 0) level_and_flags = MZ_DEFAULT_LEVEL;\n  level = level_and_flags & 0xF;\n\n  if ((!pZip) || (!pZip->m_pState) ||\n      (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || (!pArchive_name) ||\n      ((comment_size) && (!pComment)) || (level > MZ_UBER_COMPRESSION))\n    return MZ_FALSE;\n  if (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA) return MZ_FALSE;\n  if (!mz_zip_writer_validate_archive_name(pArchive_name)) return MZ_FALSE;\n\n  archive_name_size = strlen(pArchive_name);\n  if (archive_name_size > 0xFFFF) return MZ_FALSE;\n\n  num_alignment_padding_bytes =\n      mz_zip_writer_compute_padding_needed_for_file_alignment(pZip);\n\n  // no zip64 support yet\n  if ((pZip->m_total_files == 0xFFFF) ||\n      ((pZip->m_archive_size + num_alignment_padding_bytes +\n        MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE +\n        comment_size + archive_name_size) > 0xFFFFFFFF))\n    return MZ_FALSE;\n\n  if (!mz_zip_get_file_modified_time(pSrc_filename, &dos_time, &dos_date))\n    return MZ_FALSE;\n\n  pSrc_file = MZ_FOPEN(pSrc_filename, \"rb\");\n  if (!pSrc_file) return MZ_FALSE;\n  MZ_FSEEK64(pSrc_file, 0, SEEK_END);\n  uncomp_size = MZ_FTELL64(pSrc_file);\n  MZ_FSEEK64(pSrc_file, 0, SEEK_SET);\n\n  if (uncomp_size > 0xFFFFFFFF) {\n    // No zip64 support yet\n    MZ_FCLOSE(pSrc_file);\n    return MZ_FALSE;\n  }\n  if (uncomp_size <= 3) level = 0;\n\n  if (!mz_zip_writer_write_zeros(\n          pZip, cur_archive_file_ofs,\n          num_alignment_padding_bytes + sizeof(local_dir_header))) {\n    MZ_FCLOSE(pSrc_file);\n    return MZ_FALSE;\n  }\n  local_dir_header_ofs += num_alignment_padding_bytes;\n  if (pZip->m_file_offset_alignment) {\n    MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) ==\n              0);\n  }\n  cur_archive_file_ofs +=\n      num_alignment_padding_bytes + sizeof(local_dir_header);\n\n  MZ_CLEAR_OBJ(local_dir_header);\n  if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name,\n                     archive_name_size) != archive_name_size) {\n    MZ_FCLOSE(pSrc_file);\n    return MZ_FALSE;\n  }\n  cur_archive_file_ofs += archive_name_size;\n\n  if (uncomp_size) {\n    mz_uint64 uncomp_remaining = uncomp_size;\n    void *pRead_buf =\n        pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, MZ_ZIP_MAX_IO_BUF_SIZE);\n    if (!pRead_buf) {\n      MZ_FCLOSE(pSrc_file);\n      return MZ_FALSE;\n    }\n\n    if (!level) {\n      while (uncomp_remaining) {\n        mz_uint n =\n            (mz_uint)MZ_MIN((mz_uint)MZ_ZIP_MAX_IO_BUF_SIZE, uncomp_remaining);\n        if ((MZ_FREAD(pRead_buf, 1, n, pSrc_file) != n) ||\n            (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pRead_buf,\n                            n) != n)) {\n          pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);\n          MZ_FCLOSE(pSrc_file);\n          return MZ_FALSE;\n        }\n        uncomp_crc32 =\n            (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, n);\n        uncomp_remaining -= n;\n        cur_archive_file_ofs += n;\n      }\n      comp_size = uncomp_size;\n    } else {\n      mz_bool result = MZ_FALSE;\n      mz_zip_writer_add_state state;\n      tdefl_compressor *pComp = (tdefl_compressor *)pZip->m_pAlloc(\n          pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor));\n      if (!pComp) {\n        pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);\n        MZ_FCLOSE(pSrc_file);\n        return MZ_FALSE;\n      }\n\n      state.m_pZip = pZip;\n      state.m_cur_archive_file_ofs = cur_archive_file_ofs;\n      state.m_comp_size = 0;\n\n      if (tdefl_init(pComp, mz_zip_writer_add_put_buf_callback, &state,\n                     tdefl_create_comp_flags_from_zip_params(\n                         level, -15, MZ_DEFAULT_STRATEGY)) !=\n          TDEFL_STATUS_OKAY) {\n        pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);\n        pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);\n        MZ_FCLOSE(pSrc_file);\n        return MZ_FALSE;\n      }\n\n      for (;;) {\n        size_t in_buf_size = (mz_uint32)MZ_MIN(uncomp_remaining,\n                                               (mz_uint)MZ_ZIP_MAX_IO_BUF_SIZE);\n        tdefl_status status;\n\n        if (MZ_FREAD(pRead_buf, 1, in_buf_size, pSrc_file) != in_buf_size)\n          break;\n\n        uncomp_crc32 = (mz_uint32)mz_crc32(\n            uncomp_crc32, (const mz_uint8 *)pRead_buf, in_buf_size);\n        uncomp_remaining -= in_buf_size;\n\n        status = tdefl_compress_buffer(\n            pComp, pRead_buf, in_buf_size,\n            uncomp_remaining ? TDEFL_NO_FLUSH : TDEFL_FINISH);\n        if (status == TDEFL_STATUS_DONE) {\n          result = MZ_TRUE;\n          break;\n        } else if (status != TDEFL_STATUS_OKAY)\n          break;\n      }\n\n      pZip->m_pFree(pZip->m_pAlloc_opaque, pComp);\n\n      if (!result) {\n        pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);\n        MZ_FCLOSE(pSrc_file);\n        return MZ_FALSE;\n      }\n\n      comp_size = state.m_comp_size;\n      cur_archive_file_ofs = state.m_cur_archive_file_ofs;\n\n      method = MZ_DEFLATED;\n    }\n\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf);\n  }\n\n  MZ_FCLOSE(pSrc_file);\n  pSrc_file = NULL;\n\n  // no zip64 support yet\n  if ((comp_size > 0xFFFFFFFF) || (cur_archive_file_ofs > 0xFFFFFFFF))\n    return MZ_FALSE;\n\n  if (!mz_zip_writer_create_local_dir_header(\n          pZip, local_dir_header, (mz_uint16)archive_name_size, 0, uncomp_size,\n          comp_size, uncomp_crc32, method, 0, dos_time, dos_date))\n    return MZ_FALSE;\n\n  if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header,\n                     sizeof(local_dir_header)) != sizeof(local_dir_header))\n    return MZ_FALSE;\n\n  if (!mz_zip_writer_add_to_central_dir(\n          pZip, pArchive_name, (mz_uint16)archive_name_size, NULL, 0, pComment,\n          comment_size, uncomp_size, comp_size, uncomp_crc32, method, 0,\n          dos_time, dos_date, local_dir_header_ofs, ext_attributes))\n    return MZ_FALSE;\n\n  pZip->m_total_files++;\n  pZip->m_archive_size = cur_archive_file_ofs;\n\n  return MZ_TRUE;\n}\n#endif  // #ifndef MINIZ_NO_STDIO\n\nmz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip,\n                                          mz_zip_archive *pSource_zip,\n                                          mz_uint file_index) {\n  mz_uint n, bit_flags, num_alignment_padding_bytes;\n  mz_uint64 comp_bytes_remaining, local_dir_header_ofs;\n  mz_uint64 cur_src_file_ofs, cur_dst_file_ofs;\n  mz_uint32\n      local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) /\n                       sizeof(mz_uint32)];\n  mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32;\n  mz_uint8 central_header[MZ_ZIP_CENTRAL_DIR_HEADER_SIZE];\n  size_t orig_central_dir_size;\n  mz_zip_internal_state *pState;\n  void *pBuf;\n  const mz_uint8 *pSrc_central_header;\n\n  if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING))\n    return MZ_FALSE;\n  if (NULL ==\n      (pSrc_central_header = mz_zip_reader_get_cdh(pSource_zip, file_index)))\n    return MZ_FALSE;\n  pState = pZip->m_pState;\n\n  num_alignment_padding_bytes =\n      mz_zip_writer_compute_padding_needed_for_file_alignment(pZip);\n\n  // no zip64 support yet\n  if ((pZip->m_total_files == 0xFFFF) ||\n      ((pZip->m_archive_size + num_alignment_padding_bytes +\n        MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) >\n       0xFFFFFFFF))\n    return MZ_FALSE;\n\n  cur_src_file_ofs =\n      MZ_READ_LE32(pSrc_central_header + MZ_ZIP_CDH_LOCAL_HEADER_OFS);\n  cur_dst_file_ofs = pZip->m_archive_size;\n\n  if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs,\n                           pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) !=\n      MZ_ZIP_LOCAL_DIR_HEADER_SIZE)\n    return MZ_FALSE;\n  if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG)\n    return MZ_FALSE;\n  cur_src_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE;\n\n  if (!mz_zip_writer_write_zeros(pZip, cur_dst_file_ofs,\n                                 num_alignment_padding_bytes))\n    return MZ_FALSE;\n  cur_dst_file_ofs += num_alignment_padding_bytes;\n  local_dir_header_ofs = cur_dst_file_ofs;\n  if (pZip->m_file_offset_alignment) {\n    MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) ==\n              0);\n  }\n\n  if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pLocal_header,\n                     MZ_ZIP_LOCAL_DIR_HEADER_SIZE) !=\n      MZ_ZIP_LOCAL_DIR_HEADER_SIZE)\n    return MZ_FALSE;\n  cur_dst_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE;\n\n  n = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) +\n      MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS);\n  comp_bytes_remaining =\n      n + MZ_READ_LE32(pSrc_central_header + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS);\n\n  if (NULL == (pBuf = pZip->m_pAlloc(\n                   pZip->m_pAlloc_opaque, 1,\n                   (size_t)MZ_MAX(sizeof(mz_uint32) * 4,\n                                  MZ_MIN((mz_uint)MZ_ZIP_MAX_IO_BUF_SIZE,\n                                         comp_bytes_remaining)))))\n    return MZ_FALSE;\n\n  while (comp_bytes_remaining) {\n    n = (mz_uint)MZ_MIN((mz_uint)MZ_ZIP_MAX_IO_BUF_SIZE, comp_bytes_remaining);\n    if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pBuf,\n                             n) != n) {\n      pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);\n      return MZ_FALSE;\n    }\n    cur_src_file_ofs += n;\n\n    if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pBuf, n) != n) {\n      pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);\n      return MZ_FALSE;\n    }\n    cur_dst_file_ofs += n;\n\n    comp_bytes_remaining -= n;\n  }\n\n  bit_flags = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_BIT_FLAG_OFS);\n  if (bit_flags & 8) {\n    // Copy data descriptor\n    if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pBuf,\n                             sizeof(mz_uint32) * 4) != sizeof(mz_uint32) * 4) {\n      pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);\n      return MZ_FALSE;\n    }\n\n    n = sizeof(mz_uint32) * ((MZ_READ_LE32(pBuf) == 0x08074b50) ? 4 : 3);\n    if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pBuf, n) != n) {\n      pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);\n      return MZ_FALSE;\n    }\n\n    cur_src_file_ofs += n;\n    cur_dst_file_ofs += n;\n  }\n  pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf);\n\n  // no zip64 support yet\n  if (cur_dst_file_ofs > 0xFFFFFFFF) return MZ_FALSE;\n\n  orig_central_dir_size = pState->m_central_dir.m_size;\n\n  memcpy(central_header, pSrc_central_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE);\n  MZ_WRITE_LE32(central_header + MZ_ZIP_CDH_LOCAL_HEADER_OFS,\n                local_dir_header_ofs);\n  if (!mz_zip_array_push_back(pZip, &pState->m_central_dir, central_header,\n                              MZ_ZIP_CENTRAL_DIR_HEADER_SIZE))\n    return MZ_FALSE;\n\n  n = MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_FILENAME_LEN_OFS) +\n      MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_EXTRA_LEN_OFS) +\n      MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_COMMENT_LEN_OFS);\n  if (!mz_zip_array_push_back(\n          pZip, &pState->m_central_dir,\n          pSrc_central_header + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n)) {\n    mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size,\n                        MZ_FALSE);\n    return MZ_FALSE;\n  }\n\n  if (pState->m_central_dir.m_size > 0xFFFFFFFF) return MZ_FALSE;\n  n = (mz_uint32)orig_central_dir_size;\n  if (!mz_zip_array_push_back(pZip, &pState->m_central_dir_offsets, &n, 1)) {\n    mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size,\n                        MZ_FALSE);\n    return MZ_FALSE;\n  }\n\n  pZip->m_total_files++;\n  pZip->m_archive_size = cur_dst_file_ofs;\n\n  return MZ_TRUE;\n}\n\nmz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip) {\n  mz_zip_internal_state *pState;\n  mz_uint64 central_dir_ofs, central_dir_size;\n  mz_uint8 hdr[MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE];\n\n  if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING))\n    return MZ_FALSE;\n\n  pState = pZip->m_pState;\n\n  // no zip64 support yet\n  if ((pZip->m_total_files > 0xFFFF) ||\n      ((pZip->m_archive_size + pState->m_central_dir.m_size +\n        MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) > 0xFFFFFFFF))\n    return MZ_FALSE;\n\n  central_dir_ofs = 0;\n  central_dir_size = 0;\n  if (pZip->m_total_files) {\n    // Write central directory\n    central_dir_ofs = pZip->m_archive_size;\n    central_dir_size = pState->m_central_dir.m_size;\n    pZip->m_central_directory_file_ofs = central_dir_ofs;\n    if (pZip->m_pWrite(pZip->m_pIO_opaque, central_dir_ofs,\n                       pState->m_central_dir.m_p,\n                       (size_t)central_dir_size) != central_dir_size)\n      return MZ_FALSE;\n    pZip->m_archive_size += central_dir_size;\n  }\n\n  // Write end of central directory record\n  MZ_CLEAR_OBJ(hdr);\n  MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_SIG_OFS,\n                MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG);\n  MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS,\n                pZip->m_total_files);\n  MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS, pZip->m_total_files);\n  MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_CDIR_SIZE_OFS, central_dir_size);\n  MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_CDIR_OFS_OFS, central_dir_ofs);\n\n  if (pZip->m_pWrite(pZip->m_pIO_opaque, pZip->m_archive_size, hdr,\n                     sizeof(hdr)) != sizeof(hdr))\n    return MZ_FALSE;\n#ifndef MINIZ_NO_STDIO\n  if ((pState->m_pFile) && (MZ_FFLUSH(pState->m_pFile) == EOF)) return MZ_FALSE;\n#endif  // #ifndef MINIZ_NO_STDIO\n\n  pZip->m_archive_size += sizeof(hdr);\n\n  pZip->m_zip_mode = MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED;\n  return MZ_TRUE;\n}\n\nmz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **pBuf,\n                                            size_t *pSize) {\n  if ((!pZip) || (!pZip->m_pState) || (!pBuf) || (!pSize)) return MZ_FALSE;\n  if (pZip->m_pWrite != mz_zip_heap_write_func) return MZ_FALSE;\n  if (!mz_zip_writer_finalize_archive(pZip)) return MZ_FALSE;\n\n  *pBuf = pZip->m_pState->m_pMem;\n  *pSize = pZip->m_pState->m_mem_size;\n  pZip->m_pState->m_pMem = NULL;\n  pZip->m_pState->m_mem_size = pZip->m_pState->m_mem_capacity = 0;\n  return MZ_TRUE;\n}\n\nmz_bool mz_zip_writer_end(mz_zip_archive *pZip) {\n  mz_zip_internal_state *pState;\n  mz_bool status = MZ_TRUE;\n  if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) ||\n      ((pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) &&\n       (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED)))\n    return MZ_FALSE;\n\n  pState = pZip->m_pState;\n  pZip->m_pState = NULL;\n  mz_zip_array_clear(pZip, &pState->m_central_dir);\n  mz_zip_array_clear(pZip, &pState->m_central_dir_offsets);\n  mz_zip_array_clear(pZip, &pState->m_sorted_central_dir_offsets);\n\n#ifndef MINIZ_NO_STDIO\n  if (pState->m_pFile) {\n    MZ_FCLOSE(pState->m_pFile);\n    pState->m_pFile = NULL;\n  }\n#endif  // #ifndef MINIZ_NO_STDIO\n\n  if ((pZip->m_pWrite == mz_zip_heap_write_func) && (pState->m_pMem)) {\n    pZip->m_pFree(pZip->m_pAlloc_opaque, pState->m_pMem);\n    pState->m_pMem = NULL;\n  }\n\n  pZip->m_pFree(pZip->m_pAlloc_opaque, pState);\n  pZip->m_zip_mode = MZ_ZIP_MODE_INVALID;\n  return status;\n}\n\n#ifndef MINIZ_NO_STDIO\nmz_bool mz_zip_add_mem_to_archive_file_in_place(\n    const char *pZip_filename, const char *pArchive_name, const void *pBuf,\n    size_t buf_size, const void *pComment, mz_uint16 comment_size,\n    mz_uint level_and_flags) {\n  mz_bool status, created_new_archive = MZ_FALSE;\n  mz_zip_archive zip_archive;\n  struct MZ_FILE_STAT_STRUCT file_stat;\n  MZ_CLEAR_OBJ(zip_archive);\n  if ((int)level_and_flags < 0) level_and_flags = MZ_DEFAULT_LEVEL;\n  if ((!pZip_filename) || (!pArchive_name) || ((buf_size) && (!pBuf)) ||\n      ((comment_size) && (!pComment)) ||\n      ((level_and_flags & 0xF) > MZ_UBER_COMPRESSION))\n    return MZ_FALSE;\n  if (!mz_zip_writer_validate_archive_name(pArchive_name)) return MZ_FALSE;\n  if (MZ_FILE_STAT(pZip_filename, &file_stat) != 0) {\n    // Create a new archive.\n    if (!mz_zip_writer_init_file(&zip_archive, pZip_filename, 0))\n      return MZ_FALSE;\n    created_new_archive = MZ_TRUE;\n  } else {\n    // Append to an existing archive.\n    if (!mz_zip_reader_init_file(\n            &zip_archive, pZip_filename,\n            level_and_flags | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY))\n      return MZ_FALSE;\n    if (!mz_zip_writer_init_from_reader(&zip_archive, pZip_filename)) {\n      mz_zip_reader_end(&zip_archive);\n      return MZ_FALSE;\n    }\n  }\n  status =\n      mz_zip_writer_add_mem_ex(&zip_archive, pArchive_name, pBuf, buf_size,\n                               pComment, comment_size, level_and_flags, 0, 0);\n  // Always finalize, even if adding failed for some reason, so we have a valid\n  // central directory. (This may not always succeed, but we can try.)\n  if (!mz_zip_writer_finalize_archive(&zip_archive)) status = MZ_FALSE;\n  if (!mz_zip_writer_end(&zip_archive)) status = MZ_FALSE;\n  if ((!status) && (created_new_archive)) {\n    // It's a new archive and something went wrong, so just delete it.\n    int ignoredStatus = MZ_DELETE_FILE(pZip_filename);\n    (void)ignoredStatus;\n  }\n  return status;\n}\n\nvoid *mz_zip_extract_archive_file_to_heap(const char *pZip_filename,\n                                          const char *pArchive_name,\n                                          size_t *pSize, mz_uint flags) {\n  int file_index;\n  mz_zip_archive zip_archive;\n  void *p = NULL;\n\n  if (pSize) *pSize = 0;\n\n  if ((!pZip_filename) || (!pArchive_name)) return NULL;\n\n  MZ_CLEAR_OBJ(zip_archive);\n  if (!mz_zip_reader_init_file(\n          &zip_archive, pZip_filename,\n          flags | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY))\n    return NULL;\n\n  if ((file_index = mz_zip_reader_locate_file(&zip_archive, pArchive_name, NULL,\n                                              flags)) >= 0)\n    p = mz_zip_reader_extract_to_heap(&zip_archive, file_index, pSize, flags);\n\n  mz_zip_reader_end(&zip_archive);\n  return p;\n}\n\n#endif  // #ifndef MINIZ_NO_STDIO\n\n#endif  // #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS\n\n#endif  // #ifndef MINIZ_NO_ARCHIVE_APIS\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif  // MINIZ_HEADER_FILE_ONLY\n\n/*\n  This is free and unencumbered software released into the public domain.\n\n  Anyone is free to copy, modify, publish, use, compile, sell, or\n  distribute this software, either in source code form or as a compiled\n  binary, for any purpose, commercial or non-commercial, and by any\n  means.\n\n  In jurisdictions that recognize copyright laws, the author or authors\n  of this software dedicate any and all copyright interest in the\n  software to the public domain. We make this dedication for the benefit\n  of the public at large and to the detriment of our heirs and\n  successors. We intend this dedication to be an overt act of\n  relinquishment in perpetuity of all present and future rights to this\n  software under copyright law.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n  OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n  ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n  OTHER DEALINGS IN THE SOFTWARE.\n\n  For more information, please refer to <http://unlicense.org/>\n*/\n\n// ---------------------- end of miniz ----------------------------------------\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n}  // namespace miniz\n#else\n\n// Reuse MINIZ_LITTE_ENDIAN macro\n\n#if defined(__sparcv9)\n// Big endian\n#else\n#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || MINIZ_X86_OR_X64_CPU\n// Set MINIZ_LITTLE_ENDIAN to 1 if the processor is little endian.\n#define MINIZ_LITTLE_ENDIAN 1\n#endif\n#endif\n\n#endif  // TINYEXR_USE_MINIZ\n\n// static bool IsBigEndian(void) {\n//  union {\n//    unsigned int i;\n//    char c[4];\n//  } bint = {0x01020304};\n//\n//  return bint.c[0] == 1;\n//}\n\nstatic void SetErrorMessage(const std::string &msg, const char **err) {\n  if (err) {\n#ifdef _WIN32\n    (*err) = _strdup(msg.c_str());\n#else\n    (*err) = strdup(msg.c_str());\n#endif\n  }\n}\n\nstatic const int kEXRVersionSize = 8;\n\nstatic void cpy2(unsigned short *dst_val, const unsigned short *src_val) {\n  unsigned char *dst = reinterpret_cast<unsigned char *>(dst_val);\n  const unsigned char *src = reinterpret_cast<const unsigned char *>(src_val);\n\n  dst[0] = src[0];\n  dst[1] = src[1];\n}\n\nstatic void swap2(unsigned short *val) {\n#ifdef MINIZ_LITTLE_ENDIAN\n  (void)val;\n#else\n  unsigned short tmp = *val;\n  unsigned char *dst = reinterpret_cast<unsigned char *>(val);\n  unsigned char *src = reinterpret_cast<unsigned char *>(&tmp);\n\n  dst[0] = src[1];\n  dst[1] = src[0];\n#endif\n}\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wunused-function\"\n#endif\nstatic void cpy4(int *dst_val, const int *src_val) {\n  unsigned char *dst = reinterpret_cast<unsigned char *>(dst_val);\n  const unsigned char *src = reinterpret_cast<const unsigned char *>(src_val);\n\n  dst[0] = src[0];\n  dst[1] = src[1];\n  dst[2] = src[2];\n  dst[3] = src[3];\n}\n\nstatic void cpy4(unsigned int *dst_val, const unsigned int *src_val) {\n  unsigned char *dst = reinterpret_cast<unsigned char *>(dst_val);\n  const unsigned char *src = reinterpret_cast<const unsigned char *>(src_val);\n\n  dst[0] = src[0];\n  dst[1] = src[1];\n  dst[2] = src[2];\n  dst[3] = src[3];\n}\n\nstatic void cpy4(float *dst_val, const float *src_val) {\n  unsigned char *dst = reinterpret_cast<unsigned char *>(dst_val);\n  const unsigned char *src = reinterpret_cast<const unsigned char *>(src_val);\n\n  dst[0] = src[0];\n  dst[1] = src[1];\n  dst[2] = src[2];\n  dst[3] = src[3];\n}\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\nstatic void swap4(unsigned int *val) {\n#ifdef MINIZ_LITTLE_ENDIAN\n  (void)val;\n#else\n  unsigned int tmp = *val;\n  unsigned char *dst = reinterpret_cast<unsigned char *>(val);\n  unsigned char *src = reinterpret_cast<unsigned char *>(&tmp);\n\n  dst[0] = src[3];\n  dst[1] = src[2];\n  dst[2] = src[1];\n  dst[3] = src[0];\n#endif\n}\n\n#if 0\nstatic void cpy8(tinyexr::tinyexr_uint64 *dst_val, const tinyexr::tinyexr_uint64 *src_val) {\n  unsigned char *dst = reinterpret_cast<unsigned char *>(dst_val);\n  const unsigned char *src = reinterpret_cast<const unsigned char *>(src_val);\n\n  dst[0] = src[0];\n  dst[1] = src[1];\n  dst[2] = src[2];\n  dst[3] = src[3];\n  dst[4] = src[4];\n  dst[5] = src[5];\n  dst[6] = src[6];\n  dst[7] = src[7];\n}\n#endif\n\nstatic void swap8(tinyexr::tinyexr_uint64 *val) {\n#ifdef MINIZ_LITTLE_ENDIAN\n  (void)val;\n#else\n  tinyexr::tinyexr_uint64 tmp = (*val);\n  unsigned char *dst = reinterpret_cast<unsigned char *>(val);\n  unsigned char *src = reinterpret_cast<unsigned char *>(&tmp);\n\n  dst[0] = src[7];\n  dst[1] = src[6];\n  dst[2] = src[5];\n  dst[3] = src[4];\n  dst[4] = src[3];\n  dst[5] = src[2];\n  dst[6] = src[1];\n  dst[7] = src[0];\n#endif\n}\n\n// https://gist.github.com/rygorous/2156668\n// Reuse MINIZ_LITTLE_ENDIAN flag from miniz.\nunion FP32 {\n  unsigned int u;\n  float f;\n  struct {\n#if MINIZ_LITTLE_ENDIAN\n    unsigned int Mantissa : 23;\n    unsigned int Exponent : 8;\n    unsigned int Sign : 1;\n#else\n    unsigned int Sign : 1;\n    unsigned int Exponent : 8;\n    unsigned int Mantissa : 23;\n#endif\n  } s;\n};\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wpadded\"\n#endif\n\nunion FP16 {\n  unsigned short u;\n  struct {\n#if MINIZ_LITTLE_ENDIAN\n    unsigned int Mantissa : 10;\n    unsigned int Exponent : 5;\n    unsigned int Sign : 1;\n#else\n    unsigned int Sign : 1;\n    unsigned int Exponent : 5;\n    unsigned int Mantissa : 10;\n#endif\n  } s;\n};\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\nstatic FP32 half_to_float(FP16 h) {\n  static const FP32 magic = {113 << 23};\n  static const unsigned int shifted_exp = 0x7c00\n                                          << 13;  // exponent mask after shift\n  FP32 o;\n\n  o.u = (h.u & 0x7fffU) << 13U;           // exponent/mantissa bits\n  unsigned int exp_ = shifted_exp & o.u;  // just the exponent\n  o.u += (127 - 15) << 23;                // exponent adjust\n\n  // handle exponent special cases\n  if (exp_ == shifted_exp)    // Inf/NaN?\n    o.u += (128 - 16) << 23;  // extra exp adjust\n  else if (exp_ == 0)         // Zero/Denormal?\n  {\n    o.u += 1 << 23;  // extra exp adjust\n    o.f -= magic.f;  // renormalize\n  }\n\n  o.u |= (h.u & 0x8000U) << 16U;  // sign bit\n  return o;\n}\n\nstatic FP16 float_to_half_full(FP32 f) {\n  FP16 o = {0};\n\n  // Based on ISPC reference code (with minor modifications)\n  if (f.s.Exponent == 0)  // Signed zero/denormal (which will underflow)\n    o.s.Exponent = 0;\n  else if (f.s.Exponent == 255)  // Inf or NaN (all exponent bits set)\n  {\n    o.s.Exponent = 31;\n    o.s.Mantissa = f.s.Mantissa ? 0x200 : 0;  // NaN->qNaN and Inf->Inf\n  } else                                      // Normalized number\n  {\n    // Exponent unbias the single, then bias the halfp\n    int newexp = f.s.Exponent - 127 + 15;\n    if (newexp >= 31)  // Overflow, return signed infinity\n      o.s.Exponent = 31;\n    else if (newexp <= 0)  // Underflow\n    {\n      if ((14 - newexp) <= 24)  // Mantissa might be non-zero\n      {\n        unsigned int mant = f.s.Mantissa | 0x800000;  // Hidden 1 bit\n        o.s.Mantissa = mant >> (14 - newexp);\n        if ((mant >> (13 - newexp)) & 1)  // Check for rounding\n          o.u++;  // Round, might overflow into exp bit, but this is OK\n      }\n    } else {\n      o.s.Exponent = static_cast<unsigned int>(newexp);\n      o.s.Mantissa = f.s.Mantissa >> 13;\n      if (f.s.Mantissa & 0x1000)  // Check for rounding\n        o.u++;                    // Round, might overflow to inf, this is OK\n    }\n  }\n\n  o.s.Sign = f.s.Sign;\n  return o;\n}\n\n// NOTE: From OpenEXR code\n// #define IMF_INCREASING_Y  0\n// #define IMF_DECREASING_Y  1\n// #define IMF_RAMDOM_Y    2\n//\n// #define IMF_NO_COMPRESSION  0\n// #define IMF_RLE_COMPRESSION 1\n// #define IMF_ZIPS_COMPRESSION  2\n// #define IMF_ZIP_COMPRESSION 3\n// #define IMF_PIZ_COMPRESSION 4\n// #define IMF_PXR24_COMPRESSION 5\n// #define IMF_B44_COMPRESSION 6\n// #define IMF_B44A_COMPRESSION  7\n\n#ifdef __clang__\n#pragma clang diagnostic push\n\n#if __has_warning(\"-Wzero-as-null-pointer-constant\")\n#pragma clang diagnostic ignored \"-Wzero-as-null-pointer-constant\"\n#endif\n\n#endif\n\nstatic const char *ReadString(std::string *s, const char *ptr, size_t len) {\n  // Read untile NULL(\\0).\n  const char *p = ptr;\n  const char *q = ptr;\n  while ((size_t(q - ptr) < len) && (*q) != 0) {\n    q++;\n  }\n\n  if (size_t(q - ptr) >= len) {\n    (*s) = std::string();\n    return NULL;\n  }\n\n  (*s) = std::string(p, q);\n\n  return q + 1;  // skip '\\0'\n}\n\nstatic bool ReadAttribute(std::string *name, std::string *type,\n                          std::vector<unsigned char> *data, size_t *marker_size,\n                          const char *marker, size_t size) {\n  size_t name_len = strnlen(marker, size);\n  if (name_len == size) {\n    // String does not have a terminating character.\n    return false;\n  }\n  *name = std::string(marker, name_len);\n\n  marker += name_len + 1;\n  size -= name_len + 1;\n\n  size_t type_len = strnlen(marker, size);\n  if (type_len == size) {\n    return false;\n  }\n  *type = std::string(marker, type_len);\n\n  marker += type_len + 1;\n  size -= type_len + 1;\n\n  if (size < sizeof(uint32_t)) {\n    return false;\n  }\n\n  uint32_t data_len;\n  memcpy(&data_len, marker, sizeof(uint32_t));\n  tinyexr::swap4(reinterpret_cast<unsigned int *>(&data_len));\n\n  if (data_len == 0) {\n    if ((*type).compare(\"string\") == 0) {\n      // Accept empty string attribute.\n\n      marker += sizeof(uint32_t);\n      size -= sizeof(uint32_t);\n\n      *marker_size = name_len + 1 + type_len + 1 + sizeof(uint32_t);\n\n      data->resize(1);\n      (*data)[0] = '\\0';\n\n      return true;\n    } else {\n      return false;\n    }\n  }\n\n  marker += sizeof(uint32_t);\n  size -= sizeof(uint32_t);\n\n  if (size < data_len) {\n    return false;\n  }\n\n  data->resize(static_cast<size_t>(data_len));\n  memcpy(&data->at(0), marker, static_cast<size_t>(data_len));\n\n  *marker_size = name_len + 1 + type_len + 1 + sizeof(uint32_t) + data_len;\n  return true;\n}\n\nstatic void WriteAttributeToMemory(std::vector<unsigned char> *out,\n                                   const char *name, const char *type,\n                                   const unsigned char *data, int len) {\n  out->insert(out->end(), name, name + strlen(name) + 1);\n  out->insert(out->end(), type, type + strlen(type) + 1);\n\n  int outLen = len;\n  tinyexr::swap4(reinterpret_cast<unsigned int *>(&outLen));\n  out->insert(out->end(), reinterpret_cast<unsigned char *>(&outLen),\n              reinterpret_cast<unsigned char *>(&outLen) + sizeof(int));\n  out->insert(out->end(), data, data + len);\n}\n\ntypedef struct {\n  std::string name;  // less than 255 bytes long\n  int pixel_type;\n  int x_sampling;\n  int y_sampling;\n  unsigned char p_linear;\n  unsigned char pad[3];\n} ChannelInfo;\n\ntypedef struct {\n  std::vector<tinyexr::ChannelInfo> channels;\n  std::vector<EXRAttribute> attributes;\n\n  int data_window[4];\n  int line_order;\n  int display_window[4];\n  float screen_window_center[2];\n  float screen_window_width;\n  float pixel_aspect_ratio;\n\n  int chunk_count;\n\n  // Tiled format\n  int tile_size_x;\n  int tile_size_y;\n  int tile_level_mode;\n  int tile_rounding_mode;\n\n  unsigned int header_len;\n\n  int compression_type;\n\n  void clear() {\n    channels.clear();\n    attributes.clear();\n\n    data_window[0] = 0;\n    data_window[1] = 0;\n    data_window[2] = 0;\n    data_window[3] = 0;\n    line_order = 0;\n    display_window[0] = 0;\n    display_window[1] = 0;\n    display_window[2] = 0;\n    display_window[3] = 0;\n    screen_window_center[0] = 0.0f;\n    screen_window_center[1] = 0.0f;\n    screen_window_width = 0.0f;\n    pixel_aspect_ratio = 0.0f;\n\n    chunk_count = 0;\n\n    // Tiled format\n    tile_size_x = 0;\n    tile_size_y = 0;\n    tile_level_mode = 0;\n    tile_rounding_mode = 0;\n\n    header_len = 0;\n    compression_type = 0;\n  }\n} HeaderInfo;\n\nstatic bool ReadChannelInfo(std::vector<ChannelInfo> &channels,\n                            const std::vector<unsigned char> &data) {\n  const char *p = reinterpret_cast<const char *>(&data.at(0));\n\n  for (;;) {\n    if ((*p) == 0) {\n      break;\n    }\n    ChannelInfo info;\n\n    tinyexr_int64 data_len = static_cast<tinyexr_int64>(data.size()) -\n                             (p - reinterpret_cast<const char *>(data.data()));\n    if (data_len < 0) {\n      return false;\n    }\n\n    p = ReadString(&info.name, p, size_t(data_len));\n    if ((p == NULL) && (info.name.empty())) {\n      // Buffer overrun. Issue #51.\n      return false;\n    }\n\n    const unsigned char *data_end =\n        reinterpret_cast<const unsigned char *>(p) + 16;\n    if (data_end >= (data.data() + data.size())) {\n      return false;\n    }\n\n    memcpy(&info.pixel_type, p, sizeof(int));\n    p += 4;\n    info.p_linear = static_cast<unsigned char>(p[0]);  // uchar\n    p += 1 + 3;                                        // reserved: uchar[3]\n    memcpy(&info.x_sampling, p, sizeof(int));          // int\n    p += 4;\n    memcpy(&info.y_sampling, p, sizeof(int));  // int\n    p += 4;\n\n    tinyexr::swap4(reinterpret_cast<unsigned int *>(&info.pixel_type));\n    tinyexr::swap4(reinterpret_cast<unsigned int *>(&info.x_sampling));\n    tinyexr::swap4(reinterpret_cast<unsigned int *>(&info.y_sampling));\n\n    channels.push_back(info);\n  }\n\n  return true;\n}\n\nstatic void WriteChannelInfo(std::vector<unsigned char> &data,\n                             const std::vector<ChannelInfo> &channels) {\n  size_t sz = 0;\n\n  // Calculate total size.\n  for (size_t c = 0; c < channels.size(); c++) {\n    sz += strlen(channels[c].name.c_str()) + 1;  // +1 for \\0\n    sz += 16;                                    // 4 * int\n  }\n  data.resize(sz + 1);\n\n  unsigned char *p = &data.at(0);\n\n  for (size_t c = 0; c < channels.size(); c++) {\n    memcpy(p, channels[c].name.c_str(), strlen(channels[c].name.c_str()));\n    p += strlen(channels[c].name.c_str());\n    (*p) = '\\0';\n    p++;\n\n    int pixel_type = channels[c].pixel_type;\n    int x_sampling = channels[c].x_sampling;\n    int y_sampling = channels[c].y_sampling;\n    tinyexr::swap4(reinterpret_cast<unsigned int *>(&pixel_type));\n    tinyexr::swap4(reinterpret_cast<unsigned int *>(&x_sampling));\n    tinyexr::swap4(reinterpret_cast<unsigned int *>(&y_sampling));\n\n    memcpy(p, &pixel_type, sizeof(int));\n    p += sizeof(int);\n\n    (*p) = channels[c].p_linear;\n    p += 4;\n\n    memcpy(p, &x_sampling, sizeof(int));\n    p += sizeof(int);\n\n    memcpy(p, &y_sampling, sizeof(int));\n    p += sizeof(int);\n  }\n\n  (*p) = '\\0';\n}\n\nstatic void CompressZip(unsigned char *dst,\n                        tinyexr::tinyexr_uint64 &compressedSize,\n                        const unsigned char *src, unsigned long src_size) {\n  std::vector<unsigned char> tmpBuf(src_size);\n\n  //\n  // Apply EXR-specific? postprocess. Grabbed from OpenEXR's\n  // ImfZipCompressor.cpp\n  //\n\n  //\n  // Reorder the pixel data.\n  //\n\n  const char *srcPtr = reinterpret_cast<const char *>(src);\n\n  {\n    char *t1 = reinterpret_cast<char *>(&tmpBuf.at(0));\n    char *t2 = reinterpret_cast<char *>(&tmpBuf.at(0)) + (src_size + 1) / 2;\n    const char *stop = srcPtr + src_size;\n\n    for (;;) {\n      if (srcPtr < stop)\n        *(t1++) = *(srcPtr++);\n      else\n        break;\n\n      if (srcPtr < stop)\n        *(t2++) = *(srcPtr++);\n      else\n        break;\n    }\n  }\n\n  //\n  // Predictor.\n  //\n\n  {\n    unsigned char *t = &tmpBuf.at(0) + 1;\n    unsigned char *stop = &tmpBuf.at(0) + src_size;\n    int p = t[-1];\n\n    while (t < stop) {\n      int d = int(t[0]) - p + (128 + 256);\n      p = t[0];\n      t[0] = static_cast<unsigned char>(d);\n      ++t;\n    }\n  }\n\n#if TINYEXR_USE_MINIZ\n  //\n  // Compress the data using miniz\n  //\n\n  miniz::mz_ulong outSize = miniz::mz_compressBound(src_size);\n  int ret = miniz::mz_compress(\n      dst, &outSize, static_cast<const unsigned char *>(&tmpBuf.at(0)),\n      src_size);\n  assert(ret == miniz::MZ_OK);\n  (void)ret;\n\n  compressedSize = outSize;\n#else\n  uLong outSize = compressBound(static_cast<uLong>(src_size));\n  int ret = compress(dst, &outSize, static_cast<const Bytef *>(&tmpBuf.at(0)),\n                     src_size);\n  assert(ret == Z_OK);\n\n  compressedSize = outSize;\n#endif\n\n  // Use uncompressed data when compressed data is larger than uncompressed.\n  // (Issue 40)\n  if (compressedSize >= src_size) {\n    compressedSize = src_size;\n    memcpy(dst, src, src_size);\n  }\n}\n\nstatic bool DecompressZip(unsigned char *dst,\n                          unsigned long *uncompressed_size /* inout */,\n                          const unsigned char *src, unsigned long src_size) {\n  if ((*uncompressed_size) == src_size) {\n    // Data is not compressed(Issue 40).\n    memcpy(dst, src, src_size);\n    return true;\n  }\n  std::vector<unsigned char> tmpBuf(*uncompressed_size);\n\n#if TINYEXR_USE_MINIZ\n  int ret =\n      miniz::mz_uncompress(&tmpBuf.at(0), uncompressed_size, src, src_size);\n  if (miniz::MZ_OK != ret) {\n    return false;\n  }\n#else\n  int ret = uncompress(&tmpBuf.at(0), uncompressed_size, src, src_size);\n  if (Z_OK != ret) {\n    return false;\n  }\n#endif\n\n  //\n  // Apply EXR-specific? postprocess. Grabbed from OpenEXR's\n  // ImfZipCompressor.cpp\n  //\n\n  // Predictor.\n  {\n    unsigned char *t = &tmpBuf.at(0) + 1;\n    unsigned char *stop = &tmpBuf.at(0) + (*uncompressed_size);\n\n    while (t < stop) {\n      int d = int(t[-1]) + int(t[0]) - 128;\n      t[0] = static_cast<unsigned char>(d);\n      ++t;\n    }\n  }\n\n  // Reorder the pixel data.\n  {\n    const char *t1 = reinterpret_cast<const char *>(&tmpBuf.at(0));\n    const char *t2 = reinterpret_cast<const char *>(&tmpBuf.at(0)) +\n                     (*uncompressed_size + 1) / 2;\n    char *s = reinterpret_cast<char *>(dst);\n    char *stop = s + (*uncompressed_size);\n\n    for (;;) {\n      if (s < stop)\n        *(s++) = *(t1++);\n      else\n        break;\n\n      if (s < stop)\n        *(s++) = *(t2++);\n      else\n        break;\n    }\n  }\n\n  return true;\n}\n\n// RLE code from OpenEXR --------------------------------------\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wsign-conversion\"\n#endif\n\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable : 4204)  // nonstandard extension used : non-constant\n                                 // aggregate initializer (also supported by GNU\n                                 // C and C99, so no big deal)\n#pragma warning(disable : 4244)  // 'initializing': conversion from '__int64' to\n                                 // 'int', possible loss of data\n#pragma warning(disable : 4267)  // 'argument': conversion from '__int64' to\n                                 // 'int', possible loss of data\n#pragma warning(disable : 4996)  // 'strdup': The POSIX name for this item is\n                                 // deprecated. Instead, use the ISO C and C++\n                                 // conformant name: _strdup.\n#endif\n\nconst int MIN_RUN_LENGTH = 3;\nconst int MAX_RUN_LENGTH = 127;\n\n//\n// Compress an array of bytes, using run-length encoding,\n// and return the length of the compressed data.\n//\n\nstatic int rleCompress(int inLength, const char in[], signed char out[]) {\n  const char *inEnd = in + inLength;\n  const char *runStart = in;\n  const char *runEnd = in + 1;\n  signed char *outWrite = out;\n\n  while (runStart < inEnd) {\n    while (runEnd < inEnd && *runStart == *runEnd &&\n           runEnd - runStart - 1 < MAX_RUN_LENGTH) {\n      ++runEnd;\n    }\n\n    if (runEnd - runStart >= MIN_RUN_LENGTH) {\n      //\n      // Compressable run\n      //\n\n      *outWrite++ = static_cast<char>(runEnd - runStart) - 1;\n      *outWrite++ = *(reinterpret_cast<const signed char *>(runStart));\n      runStart = runEnd;\n    } else {\n      //\n      // Uncompressable run\n      //\n\n      while (runEnd < inEnd &&\n             ((runEnd + 1 >= inEnd || *runEnd != *(runEnd + 1)) ||\n              (runEnd + 2 >= inEnd || *(runEnd + 1) != *(runEnd + 2))) &&\n             runEnd - runStart < MAX_RUN_LENGTH) {\n        ++runEnd;\n      }\n\n      *outWrite++ = static_cast<char>(runStart - runEnd);\n\n      while (runStart < runEnd) {\n        *outWrite++ = *(reinterpret_cast<const signed char *>(runStart++));\n      }\n    }\n\n    ++runEnd;\n  }\n\n  return static_cast<int>(outWrite - out);\n}\n\n//\n// Uncompress an array of bytes compressed with rleCompress().\n// Returns the length of the oncompressed data, or 0 if the\n// length of the uncompressed data would be more than maxLength.\n//\n\nstatic int rleUncompress(int inLength, int maxLength, const signed char in[],\n                         char out[]) {\n  char *outStart = out;\n\n  while (inLength > 0) {\n    if (*in < 0) {\n      int count = -(static_cast<int>(*in++));\n      inLength -= count + 1;\n\n      // Fixes #116: Add bounds check to in buffer.\n      if ((0 > (maxLength -= count)) || (inLength < 0)) return 0;\n\n      memcpy(out, in, count);\n      out += count;\n      in += count;\n    } else {\n      int count = *in++;\n      inLength -= 2;\n\n      if (0 > (maxLength -= count + 1)) return 0;\n\n      memset(out, *reinterpret_cast<const char *>(in), count + 1);\n      out += count + 1;\n\n      in++;\n    }\n  }\n\n  return static_cast<int>(out - outStart);\n}\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\n// End of RLE code from OpenEXR -----------------------------------\n\nstatic void CompressRle(unsigned char *dst,\n                        tinyexr::tinyexr_uint64 &compressedSize,\n                        const unsigned char *src, unsigned long src_size) {\n  std::vector<unsigned char> tmpBuf(src_size);\n\n  //\n  // Apply EXR-specific? postprocess. Grabbed from OpenEXR's\n  // ImfRleCompressor.cpp\n  //\n\n  //\n  // Reorder the pixel data.\n  //\n\n  const char *srcPtr = reinterpret_cast<const char *>(src);\n\n  {\n    char *t1 = reinterpret_cast<char *>(&tmpBuf.at(0));\n    char *t2 = reinterpret_cast<char *>(&tmpBuf.at(0)) + (src_size + 1) / 2;\n    const char *stop = srcPtr + src_size;\n\n    for (;;) {\n      if (srcPtr < stop)\n        *(t1++) = *(srcPtr++);\n      else\n        break;\n\n      if (srcPtr < stop)\n        *(t2++) = *(srcPtr++);\n      else\n        break;\n    }\n  }\n\n  //\n  // Predictor.\n  //\n\n  {\n    unsigned char *t = &tmpBuf.at(0) + 1;\n    unsigned char *stop = &tmpBuf.at(0) + src_size;\n    int p = t[-1];\n\n    while (t < stop) {\n      int d = int(t[0]) - p + (128 + 256);\n      p = t[0];\n      t[0] = static_cast<unsigned char>(d);\n      ++t;\n    }\n  }\n\n  // outSize will be (srcSiz * 3) / 2 at max.\n  int outSize = rleCompress(static_cast<int>(src_size),\n                            reinterpret_cast<const char *>(&tmpBuf.at(0)),\n                            reinterpret_cast<signed char *>(dst));\n  assert(outSize > 0);\n\n  compressedSize = static_cast<tinyexr::tinyexr_uint64>(outSize);\n\n  // Use uncompressed data when compressed data is larger than uncompressed.\n  // (Issue 40)\n  if (compressedSize >= src_size) {\n    compressedSize = src_size;\n    memcpy(dst, src, src_size);\n  }\n}\n\nstatic bool DecompressRle(unsigned char *dst,\n                          const unsigned long uncompressed_size,\n                          const unsigned char *src, unsigned long src_size) {\n  if (uncompressed_size == src_size) {\n    // Data is not compressed(Issue 40).\n    memcpy(dst, src, src_size);\n    return true;\n  }\n\n  // Workaround for issue #112.\n  // TODO(syoyo): Add more robust out-of-bounds check in `rleUncompress`.\n  if (src_size <= 2) {\n    return false;\n  }\n\n  std::vector<unsigned char> tmpBuf(uncompressed_size);\n\n  int ret = rleUncompress(static_cast<int>(src_size),\n                          static_cast<int>(uncompressed_size),\n                          reinterpret_cast<const signed char *>(src),\n                          reinterpret_cast<char *>(&tmpBuf.at(0)));\n  if (ret != static_cast<int>(uncompressed_size)) {\n    return false;\n  }\n\n  //\n  // Apply EXR-specific? postprocess. Grabbed from OpenEXR's\n  // ImfRleCompressor.cpp\n  //\n\n  // Predictor.\n  {\n    unsigned char *t = &tmpBuf.at(0) + 1;\n    unsigned char *stop = &tmpBuf.at(0) + uncompressed_size;\n\n    while (t < stop) {\n      int d = int(t[-1]) + int(t[0]) - 128;\n      t[0] = static_cast<unsigned char>(d);\n      ++t;\n    }\n  }\n\n  // Reorder the pixel data.\n  {\n    const char *t1 = reinterpret_cast<const char *>(&tmpBuf.at(0));\n    const char *t2 = reinterpret_cast<const char *>(&tmpBuf.at(0)) +\n                     (uncompressed_size + 1) / 2;\n    char *s = reinterpret_cast<char *>(dst);\n    char *stop = s + uncompressed_size;\n\n    for (;;) {\n      if (s < stop)\n        *(s++) = *(t1++);\n      else\n        break;\n\n      if (s < stop)\n        *(s++) = *(t2++);\n      else\n        break;\n    }\n  }\n\n  return true;\n}\n\n#if TINYEXR_USE_PIZ\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wc++11-long-long\"\n#pragma clang diagnostic ignored \"-Wold-style-cast\"\n#pragma clang diagnostic ignored \"-Wpadded\"\n#pragma clang diagnostic ignored \"-Wsign-conversion\"\n#pragma clang diagnostic ignored \"-Wc++11-extensions\"\n#pragma clang diagnostic ignored \"-Wconversion\"\n#pragma clang diagnostic ignored \"-Wc++98-compat-pedantic\"\n\n#if __has_warning(\"-Wcast-qual\")\n#pragma clang diagnostic ignored \"-Wcast-qual\"\n#endif\n\n#endif\n\n//\n// PIZ compress/uncompress, based on OpenEXR's ImfPizCompressor.cpp\n//\n// -----------------------------------------------------------------\n// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas\n// Digital Ltd. LLC)\n// (3 clause BSD license)\n//\n\nstruct PIZChannelData {\n  unsigned short *start;\n  unsigned short *end;\n  int nx;\n  int ny;\n  int ys;\n  int size;\n};\n\n//-----------------------------------------------------------------------------\n//\n//  16-bit Haar Wavelet encoding and decoding\n//\n//  The source code in this file is derived from the encoding\n//  and decoding routines written by Christian Rouet for his\n//  PIZ image file format.\n//\n//-----------------------------------------------------------------------------\n\n//\n// Wavelet basis functions without modulo arithmetic; they produce\n// the best compression ratios when the wavelet-transformed data are\n// Huffman-encoded, but the wavelet transform works only for 14-bit\n// data (untransformed data values must be less than (1 << 14)).\n//\n\ninline void wenc14(unsigned short a, unsigned short b, unsigned short &l,\n                   unsigned short &h) {\n  short as = static_cast<short>(a);\n  short bs = static_cast<short>(b);\n\n  short ms = (as + bs) >> 1;\n  short ds = as - bs;\n\n  l = static_cast<unsigned short>(ms);\n  h = static_cast<unsigned short>(ds);\n}\n\ninline void wdec14(unsigned short l, unsigned short h, unsigned short &a,\n                   unsigned short &b) {\n  short ls = static_cast<short>(l);\n  short hs = static_cast<short>(h);\n\n  int hi = hs;\n  int ai = ls + (hi & 1) + (hi >> 1);\n\n  short as = static_cast<short>(ai);\n  short bs = static_cast<short>(ai - hi);\n\n  a = static_cast<unsigned short>(as);\n  b = static_cast<unsigned short>(bs);\n}\n\n//\n// Wavelet basis functions with modulo arithmetic; they work with full\n// 16-bit data, but Huffman-encoding the wavelet-transformed data doesn't\n// compress the data quite as well.\n//\n\nconst int NBITS = 16;\nconst int A_OFFSET = 1 << (NBITS - 1);\nconst int M_OFFSET = 1 << (NBITS - 1);\nconst int MOD_MASK = (1 << NBITS) - 1;\n\ninline void wenc16(unsigned short a, unsigned short b, unsigned short &l,\n                   unsigned short &h) {\n  int ao = (a + A_OFFSET) & MOD_MASK;\n  int m = ((ao + b) >> 1);\n  int d = ao - b;\n\n  if (d < 0) m = (m + M_OFFSET) & MOD_MASK;\n\n  d &= MOD_MASK;\n\n  l = static_cast<unsigned short>(m);\n  h = static_cast<unsigned short>(d);\n}\n\ninline void wdec16(unsigned short l, unsigned short h, unsigned short &a,\n                   unsigned short &b) {\n  int m = l;\n  int d = h;\n  int bb = (m - (d >> 1)) & MOD_MASK;\n  int aa = (d + bb - A_OFFSET) & MOD_MASK;\n  b = static_cast<unsigned short>(bb);\n  a = static_cast<unsigned short>(aa);\n}\n\n//\n// 2D Wavelet encoding:\n//\n\nstatic void wav2Encode(\n    unsigned short *in,  // io: values are transformed in place\n    int nx,              // i : x size\n    int ox,              // i : x offset\n    int ny,              // i : y size\n    int oy,              // i : y offset\n    unsigned short mx)   // i : maximum in[x][y] value\n{\n  bool w14 = (mx < (1 << 14));\n  int n = (nx > ny) ? ny : nx;\n  int p = 1;   // == 1 <<  level\n  int p2 = 2;  // == 1 << (level+1)\n\n  //\n  // Hierachical loop on smaller dimension n\n  //\n\n  while (p2 <= n) {\n    unsigned short *py = in;\n    unsigned short *ey = in + oy * (ny - p2);\n    int oy1 = oy * p;\n    int oy2 = oy * p2;\n    int ox1 = ox * p;\n    int ox2 = ox * p2;\n    unsigned short i00, i01, i10, i11;\n\n    //\n    // Y loop\n    //\n\n    for (; py <= ey; py += oy2) {\n      unsigned short *px = py;\n      unsigned short *ex = py + ox * (nx - p2);\n\n      //\n      // X loop\n      //\n\n      for (; px <= ex; px += ox2) {\n        unsigned short *p01 = px + ox1;\n        unsigned short *p10 = px + oy1;\n        unsigned short *p11 = p10 + ox1;\n\n        //\n        // 2D wavelet encoding\n        //\n\n        if (w14) {\n          wenc14(*px, *p01, i00, i01);\n          wenc14(*p10, *p11, i10, i11);\n          wenc14(i00, i10, *px, *p10);\n          wenc14(i01, i11, *p01, *p11);\n        } else {\n          wenc16(*px, *p01, i00, i01);\n          wenc16(*p10, *p11, i10, i11);\n          wenc16(i00, i10, *px, *p10);\n          wenc16(i01, i11, *p01, *p11);\n        }\n      }\n\n      //\n      // Encode (1D) odd column (still in Y loop)\n      //\n\n      if (nx & p) {\n        unsigned short *p10 = px + oy1;\n\n        if (w14)\n          wenc14(*px, *p10, i00, *p10);\n        else\n          wenc16(*px, *p10, i00, *p10);\n\n        *px = i00;\n      }\n    }\n\n    //\n    // Encode (1D) odd line (must loop in X)\n    //\n\n    if (ny & p) {\n      unsigned short *px = py;\n      unsigned short *ex = py + ox * (nx - p2);\n\n      for (; px <= ex; px += ox2) {\n        unsigned short *p01 = px + ox1;\n\n        if (w14)\n          wenc14(*px, *p01, i00, *p01);\n        else\n          wenc16(*px, *p01, i00, *p01);\n\n        *px = i00;\n      }\n    }\n\n    //\n    // Next level\n    //\n\n    p = p2;\n    p2 <<= 1;\n  }\n}\n\n//\n// 2D Wavelet decoding:\n//\n\nstatic void wav2Decode(\n    unsigned short *in,  // io: values are transformed in place\n    int nx,              // i : x size\n    int ox,              // i : x offset\n    int ny,              // i : y size\n    int oy,              // i : y offset\n    unsigned short mx)   // i : maximum in[x][y] value\n{\n  bool w14 = (mx < (1 << 14));\n  int n = (nx > ny) ? ny : nx;\n  int p = 1;\n  int p2;\n\n  //\n  // Search max level\n  //\n\n  while (p <= n) p <<= 1;\n\n  p >>= 1;\n  p2 = p;\n  p >>= 1;\n\n  //\n  // Hierarchical loop on smaller dimension n\n  //\n\n  while (p >= 1) {\n    unsigned short *py = in;\n    unsigned short *ey = in + oy * (ny - p2);\n    int oy1 = oy * p;\n    int oy2 = oy * p2;\n    int ox1 = ox * p;\n    int ox2 = ox * p2;\n    unsigned short i00, i01, i10, i11;\n\n    //\n    // Y loop\n    //\n\n    for (; py <= ey; py += oy2) {\n      unsigned short *px = py;\n      unsigned short *ex = py + ox * (nx - p2);\n\n      //\n      // X loop\n      //\n\n      for (; px <= ex; px += ox2) {\n        unsigned short *p01 = px + ox1;\n        unsigned short *p10 = px + oy1;\n        unsigned short *p11 = p10 + ox1;\n\n        //\n        // 2D wavelet decoding\n        //\n\n        if (w14) {\n          wdec14(*px, *p10, i00, i10);\n          wdec14(*p01, *p11, i01, i11);\n          wdec14(i00, i01, *px, *p01);\n          wdec14(i10, i11, *p10, *p11);\n        } else {\n          wdec16(*px, *p10, i00, i10);\n          wdec16(*p01, *p11, i01, i11);\n          wdec16(i00, i01, *px, *p01);\n          wdec16(i10, i11, *p10, *p11);\n        }\n      }\n\n      //\n      // Decode (1D) odd column (still in Y loop)\n      //\n\n      if (nx & p) {\n        unsigned short *p10 = px + oy1;\n\n        if (w14)\n          wdec14(*px, *p10, i00, *p10);\n        else\n          wdec16(*px, *p10, i00, *p10);\n\n        *px = i00;\n      }\n    }\n\n    //\n    // Decode (1D) odd line (must loop in X)\n    //\n\n    if (ny & p) {\n      unsigned short *px = py;\n      unsigned short *ex = py + ox * (nx - p2);\n\n      for (; px <= ex; px += ox2) {\n        unsigned short *p01 = px + ox1;\n\n        if (w14)\n          wdec14(*px, *p01, i00, *p01);\n        else\n          wdec16(*px, *p01, i00, *p01);\n\n        *px = i00;\n      }\n    }\n\n    //\n    // Next level\n    //\n\n    p2 = p;\n    p >>= 1;\n  }\n}\n\n//-----------------------------------------------------------------------------\n//\n//  16-bit Huffman compression and decompression.\n//\n//  The source code in this file is derived from the 8-bit\n//  Huffman compression and decompression routines written\n//  by Christian Rouet for his PIZ image file format.\n//\n//-----------------------------------------------------------------------------\n\n// Adds some modification for tinyexr.\n\nconst int HUF_ENCBITS = 16;  // literal (value) bit length\nconst int HUF_DECBITS = 14;  // decoding bit size (>= 8)\n\nconst int HUF_ENCSIZE = (1 << HUF_ENCBITS) + 1;  // encoding table size\nconst int HUF_DECSIZE = 1 << HUF_DECBITS;        // decoding table size\nconst int HUF_DECMASK = HUF_DECSIZE - 1;\n\nstruct HufDec {  // short code    long code\n  //-------------------------------\n  int len : 8;   // code length    0\n  int lit : 24;  // lit      p size\n  int *p;        // 0      lits\n};\n\ninline long long hufLength(long long code) { return code & 63; }\n\ninline long long hufCode(long long code) { return code >> 6; }\n\ninline void outputBits(int nBits, long long bits, long long &c, int &lc,\n                       char *&out) {\n  c <<= nBits;\n  lc += nBits;\n\n  c |= bits;\n\n  while (lc >= 8) *out++ = static_cast<char>((c >> (lc -= 8)));\n}\n\ninline long long getBits(int nBits, long long &c, int &lc, const char *&in) {\n  while (lc < nBits) {\n    c = (c << 8) | *(reinterpret_cast<const unsigned char *>(in++));\n    lc += 8;\n  }\n\n  lc -= nBits;\n  return (c >> lc) & ((1 << nBits) - 1);\n}\n\n//\n// ENCODING TABLE BUILDING & (UN)PACKING\n//\n\n//\n// Build a \"canonical\" Huffman code table:\n//  - for each (uncompressed) symbol, hcode contains the length\n//    of the corresponding code (in the compressed data)\n//  - canonical codes are computed and stored in hcode\n//  - the rules for constructing canonical codes are as follows:\n//    * shorter codes (if filled with zeroes to the right)\n//      have a numerically higher value than longer codes\n//    * for codes with the same length, numerical values\n//      increase with numerical symbol values\n//  - because the canonical code table can be constructed from\n//    symbol lengths alone, the code table can be transmitted\n//    without sending the actual code values\n//  - see http://www.compressconsult.com/huffman/\n//\n\nstatic void hufCanonicalCodeTable(long long hcode[HUF_ENCSIZE]) {\n  long long n[59];\n\n  //\n  // For each i from 0 through 58, count the\n  // number of different codes of length i, and\n  // store the count in n[i].\n  //\n\n  for (int i = 0; i <= 58; ++i) n[i] = 0;\n\n  for (int i = 0; i < HUF_ENCSIZE; ++i) n[hcode[i]] += 1;\n\n  //\n  // For each i from 58 through 1, compute the\n  // numerically lowest code with length i, and\n  // store that code in n[i].\n  //\n\n  long long c = 0;\n\n  for (int i = 58; i > 0; --i) {\n    long long nc = ((c + n[i]) >> 1);\n    n[i] = c;\n    c = nc;\n  }\n\n  //\n  // hcode[i] contains the length, l, of the\n  // code for symbol i.  Assign the next available\n  // code of length l to the symbol and store both\n  // l and the code in hcode[i].\n  //\n\n  for (int i = 0; i < HUF_ENCSIZE; ++i) {\n    int l = static_cast<int>(hcode[i]);\n\n    if (l > 0) hcode[i] = l | (n[l]++ << 6);\n  }\n}\n\n//\n// Compute Huffman codes (based on frq input) and store them in frq:\n//  - code structure is : [63:lsb - 6:msb] | [5-0: bit length];\n//  - max code length is 58 bits;\n//  - codes outside the range [im-iM] have a null length (unused values);\n//  - original frequencies are destroyed;\n//  - encoding tables are used by hufEncode() and hufBuildDecTable();\n//\n\nstruct FHeapCompare {\n  bool operator()(long long *a, long long *b) { return *a > *b; }\n};\n\nstatic void hufBuildEncTable(\n    long long *frq,  // io: input frequencies [HUF_ENCSIZE], output table\n    int *im,         //  o: min frq index\n    int *iM)         //  o: max frq index\n{\n  //\n  // This function assumes that when it is called, array frq\n  // indicates the frequency of all possible symbols in the data\n  // that are to be Huffman-encoded.  (frq[i] contains the number\n  // of occurrences of symbol i in the data.)\n  //\n  // The loop below does three things:\n  //\n  // 1) Finds the minimum and maximum indices that point\n  //    to non-zero entries in frq:\n  //\n  //     frq[im] != 0, and frq[i] == 0 for all i < im\n  //     frq[iM] != 0, and frq[i] == 0 for all i > iM\n  //\n  // 2) Fills array fHeap with pointers to all non-zero\n  //    entries in frq.\n  //\n  // 3) Initializes array hlink such that hlink[i] == i\n  //    for all array entries.\n  //\n\n  std::vector<int> hlink(HUF_ENCSIZE);\n  std::vector<long long *> fHeap(HUF_ENCSIZE);\n\n  *im = 0;\n\n  while (!frq[*im]) (*im)++;\n\n  int nf = 0;\n\n  for (int i = *im; i < HUF_ENCSIZE; i++) {\n    hlink[i] = i;\n\n    if (frq[i]) {\n      fHeap[nf] = &frq[i];\n      nf++;\n      *iM = i;\n    }\n  }\n\n  //\n  // Add a pseudo-symbol, with a frequency count of 1, to frq;\n  // adjust the fHeap and hlink array accordingly.  Function\n  // hufEncode() uses the pseudo-symbol for run-length encoding.\n  //\n\n  (*iM)++;\n  frq[*iM] = 1;\n  fHeap[nf] = &frq[*iM];\n  nf++;\n\n  //\n  // Build an array, scode, such that scode[i] contains the number\n  // of bits assigned to symbol i.  Conceptually this is done by\n  // constructing a tree whose leaves are the symbols with non-zero\n  // frequency:\n  //\n  //     Make a heap that contains all symbols with a non-zero frequency,\n  //     with the least frequent symbol on top.\n  //\n  //     Repeat until only one symbol is left on the heap:\n  //\n  //         Take the two least frequent symbols off the top of the heap.\n  //         Create a new node that has first two nodes as children, and\n  //         whose frequency is the sum of the frequencies of the first\n  //         two nodes.  Put the new node back into the heap.\n  //\n  // The last node left on the heap is the root of the tree.  For each\n  // leaf node, the distance between the root and the leaf is the length\n  // of the code for the corresponding symbol.\n  //\n  // The loop below doesn't actually build the tree; instead we compute\n  // the distances of the leaves from the root on the fly.  When a new\n  // node is added to the heap, then that node's descendants are linked\n  // into a single linear list that starts at the new node, and the code\n  // lengths of the descendants (that is, their distance from the root\n  // of the tree) are incremented by one.\n  //\n\n  std::make_heap(&fHeap[0], &fHeap[nf], FHeapCompare());\n\n  std::vector<long long> scode(HUF_ENCSIZE);\n  memset(scode.data(), 0, sizeof(long long) * HUF_ENCSIZE);\n\n  while (nf > 1) {\n    //\n    // Find the indices, mm and m, of the two smallest non-zero frq\n    // values in fHeap, add the smallest frq to the second-smallest\n    // frq, and remove the smallest frq value from fHeap.\n    //\n\n    int mm = fHeap[0] - frq;\n    std::pop_heap(&fHeap[0], &fHeap[nf], FHeapCompare());\n    --nf;\n\n    int m = fHeap[0] - frq;\n    std::pop_heap(&fHeap[0], &fHeap[nf], FHeapCompare());\n\n    frq[m] += frq[mm];\n    std::push_heap(&fHeap[0], &fHeap[nf], FHeapCompare());\n\n    //\n    // The entries in scode are linked into lists with the\n    // entries in hlink serving as \"next\" pointers and with\n    // the end of a list marked by hlink[j] == j.\n    //\n    // Traverse the lists that start at scode[m] and scode[mm].\n    // For each element visited, increment the length of the\n    // corresponding code by one bit. (If we visit scode[j]\n    // during the traversal, then the code for symbol j becomes\n    // one bit longer.)\n    //\n    // Merge the lists that start at scode[m] and scode[mm]\n    // into a single list that starts at scode[m].\n    //\n\n    //\n    // Add a bit to all codes in the first list.\n    //\n\n    for (int j = m;; j = hlink[j]) {\n      scode[j]++;\n\n      assert(scode[j] <= 58);\n\n      if (hlink[j] == j) {\n        //\n        // Merge the two lists.\n        //\n\n        hlink[j] = mm;\n        break;\n      }\n    }\n\n    //\n    // Add a bit to all codes in the second list\n    //\n\n    for (int j = mm;; j = hlink[j]) {\n      scode[j]++;\n\n      assert(scode[j] <= 58);\n\n      if (hlink[j] == j) break;\n    }\n  }\n\n  //\n  // Build a canonical Huffman code table, replacing the code\n  // lengths in scode with (code, code length) pairs.  Copy the\n  // code table from scode into frq.\n  //\n\n  hufCanonicalCodeTable(scode.data());\n  memcpy(frq, scode.data(), sizeof(long long) * HUF_ENCSIZE);\n}\n\n//\n// Pack an encoding table:\n//  - only code lengths, not actual codes, are stored\n//  - runs of zeroes are compressed as follows:\n//\n//    unpacked    packed\n//    --------------------------------\n//    1 zero    0  (6 bits)\n//    2 zeroes    59\n//    3 zeroes    60\n//    4 zeroes    61\n//    5 zeroes    62\n//    n zeroes (6 or more)  63 n-6  (6 + 8 bits)\n//\n\nconst int SHORT_ZEROCODE_RUN = 59;\nconst int LONG_ZEROCODE_RUN = 63;\nconst int SHORTEST_LONG_RUN = 2 + LONG_ZEROCODE_RUN - SHORT_ZEROCODE_RUN;\nconst int LONGEST_LONG_RUN = 255 + SHORTEST_LONG_RUN;\n\nstatic void hufPackEncTable(\n    const long long *hcode,  // i : encoding table [HUF_ENCSIZE]\n    int im,                  // i : min hcode index\n    int iM,                  // i : max hcode index\n    char **pcode)            //  o: ptr to packed table (updated)\n{\n  char *p = *pcode;\n  long long c = 0;\n  int lc = 0;\n\n  for (; im <= iM; im++) {\n    int l = hufLength(hcode[im]);\n\n    if (l == 0) {\n      int zerun = 1;\n\n      while ((im < iM) && (zerun < LONGEST_LONG_RUN)) {\n        if (hufLength(hcode[im + 1]) > 0) break;\n        im++;\n        zerun++;\n      }\n\n      if (zerun >= 2) {\n        if (zerun >= SHORTEST_LONG_RUN) {\n          outputBits(6, LONG_ZEROCODE_RUN, c, lc, p);\n          outputBits(8, zerun - SHORTEST_LONG_RUN, c, lc, p);\n        } else {\n          outputBits(6, SHORT_ZEROCODE_RUN + zerun - 2, c, lc, p);\n        }\n        continue;\n      }\n    }\n\n    outputBits(6, l, c, lc, p);\n  }\n\n  if (lc > 0) *p++ = (unsigned char)(c << (8 - lc));\n\n  *pcode = p;\n}\n\n//\n// Unpack an encoding table packed by hufPackEncTable():\n//\n\nstatic bool hufUnpackEncTable(\n    const char **pcode,  // io: ptr to packed table (updated)\n    int ni,              // i : input size (in bytes)\n    int im,              // i : min hcode index\n    int iM,              // i : max hcode index\n    long long *hcode)    //  o: encoding table [HUF_ENCSIZE]\n{\n  memset(hcode, 0, sizeof(long long) * HUF_ENCSIZE);\n\n  const char *p = *pcode;\n  long long c = 0;\n  int lc = 0;\n\n  for (; im <= iM; im++) {\n    if (p - *pcode > ni) {\n      return false;\n    }\n\n    long long l = hcode[im] = getBits(6, c, lc, p);  // code length\n\n    if (l == (long long)LONG_ZEROCODE_RUN) {\n      if (p - *pcode > ni) {\n        return false;\n      }\n\n      int zerun = getBits(8, c, lc, p) + SHORTEST_LONG_RUN;\n\n      if (im + zerun > iM + 1) {\n        return false;\n      }\n\n      while (zerun--) hcode[im++] = 0;\n\n      im--;\n    } else if (l >= (long long)SHORT_ZEROCODE_RUN) {\n      int zerun = l - SHORT_ZEROCODE_RUN + 2;\n\n      if (im + zerun > iM + 1) {\n        return false;\n      }\n\n      while (zerun--) hcode[im++] = 0;\n\n      im--;\n    }\n  }\n\n  *pcode = const_cast<char *>(p);\n\n  hufCanonicalCodeTable(hcode);\n\n  return true;\n}\n\n//\n// DECODING TABLE BUILDING\n//\n\n//\n// Clear a newly allocated decoding table so that it contains only zeroes.\n//\n\nstatic void hufClearDecTable(HufDec *hdecod)  // io: (allocated by caller)\n//     decoding table [HUF_DECSIZE]\n{\n  for (int i = 0; i < HUF_DECSIZE; i++) {\n    hdecod[i].len = 0;\n    hdecod[i].lit = 0;\n    hdecod[i].p = NULL;\n  }\n  // memset(hdecod, 0, sizeof(HufDec) * HUF_DECSIZE);\n}\n\n//\n// Build a decoding hash table based on the encoding table hcode:\n//  - short codes (<= HUF_DECBITS) are resolved with a single table access;\n//  - long code entry allocations are not optimized, because long codes are\n//    unfrequent;\n//  - decoding tables are used by hufDecode();\n//\n\nstatic bool hufBuildDecTable(const long long *hcode,  // i : encoding table\n                             int im,                  // i : min index in hcode\n                             int iM,                  // i : max index in hcode\n                             HufDec *hdecod)  //  o: (allocated by caller)\n//     decoding table [HUF_DECSIZE]\n{\n  //\n  // Init hashtable & loop on all codes.\n  // Assumes that hufClearDecTable(hdecod) has already been called.\n  //\n\n  for (; im <= iM; im++) {\n    long long c = hufCode(hcode[im]);\n    int l = hufLength(hcode[im]);\n\n    if (c >> l) {\n      //\n      // Error: c is supposed to be an l-bit code,\n      // but c contains a value that is greater\n      // than the largest l-bit number.\n      //\n\n      // invalidTableEntry();\n      return false;\n    }\n\n    if (l > HUF_DECBITS) {\n      //\n      // Long code: add a secondary entry\n      //\n\n      HufDec *pl = hdecod + (c >> (l - HUF_DECBITS));\n\n      if (pl->len) {\n        //\n        // Error: a short code has already\n        // been stored in table entry *pl.\n        //\n\n        // invalidTableEntry();\n        return false;\n      }\n\n      pl->lit++;\n\n      if (pl->p) {\n        int *p = pl->p;\n        pl->p = new int[pl->lit];\n\n        for (int i = 0; i < pl->lit - 1; ++i) pl->p[i] = p[i];\n\n        delete[] p;\n      } else {\n        pl->p = new int[1];\n      }\n\n      pl->p[pl->lit - 1] = im;\n    } else if (l) {\n      //\n      // Short code: init all primary entries\n      //\n\n      HufDec *pl = hdecod + (c << (HUF_DECBITS - l));\n\n      for (long long i = 1ULL << (HUF_DECBITS - l); i > 0; i--, pl++) {\n        if (pl->len || pl->p) {\n          //\n          // Error: a short code or a long code has\n          // already been stored in table entry *pl.\n          //\n\n          // invalidTableEntry();\n          return false;\n        }\n\n        pl->len = l;\n        pl->lit = im;\n      }\n    }\n  }\n\n  return true;\n}\n\n//\n// Free the long code entries of a decoding table built by hufBuildDecTable()\n//\n\nstatic void hufFreeDecTable(HufDec *hdecod)  // io: Decoding table\n{\n  for (int i = 0; i < HUF_DECSIZE; i++) {\n    if (hdecod[i].p) {\n      delete[] hdecod[i].p;\n      hdecod[i].p = 0;\n    }\n  }\n}\n\n//\n// ENCODING\n//\n\ninline void outputCode(long long code, long long &c, int &lc, char *&out) {\n  outputBits(hufLength(code), hufCode(code), c, lc, out);\n}\n\ninline void sendCode(long long sCode, int runCount, long long runCode,\n                     long long &c, int &lc, char *&out) {\n  //\n  // Output a run of runCount instances of the symbol sCount.\n  // Output the symbols explicitly, or if that is shorter, output\n  // the sCode symbol once followed by a runCode symbol and runCount\n  // expressed as an 8-bit number.\n  //\n\n  if (hufLength(sCode) + hufLength(runCode) + 8 < hufLength(sCode) * runCount) {\n    outputCode(sCode, c, lc, out);\n    outputCode(runCode, c, lc, out);\n    outputBits(8, runCount, c, lc, out);\n  } else {\n    while (runCount-- >= 0) outputCode(sCode, c, lc, out);\n  }\n}\n\n//\n// Encode (compress) ni values based on the Huffman encoding table hcode:\n//\n\nstatic int hufEncode            // return: output size (in bits)\n    (const long long *hcode,    // i : encoding table\n     const unsigned short *in,  // i : uncompressed input buffer\n     const int ni,              // i : input buffer size (in bytes)\n     int rlc,                   // i : rl code\n     char *out)                 //  o: compressed output buffer\n{\n  char *outStart = out;\n  long long c = 0;  // bits not yet written to out\n  int lc = 0;       // number of valid bits in c (LSB)\n  int s = in[0];\n  int cs = 0;\n\n  //\n  // Loop on input values\n  //\n\n  for (int i = 1; i < ni; i++) {\n    //\n    // Count same values or send code\n    //\n\n    if (s == in[i] && cs < 255) {\n      cs++;\n    } else {\n      sendCode(hcode[s], cs, hcode[rlc], c, lc, out);\n      cs = 0;\n    }\n\n    s = in[i];\n  }\n\n  //\n  // Send remaining code\n  //\n\n  sendCode(hcode[s], cs, hcode[rlc], c, lc, out);\n\n  if (lc) *out = (c << (8 - lc)) & 0xff;\n\n  return (out - outStart) * 8 + lc;\n}\n\n//\n// DECODING\n//\n\n//\n// In order to force the compiler to inline them,\n// getChar() and getCode() are implemented as macros\n// instead of \"inline\" functions.\n//\n\n#define getChar(c, lc, in)                   \\\n  {                                          \\\n    c = (c << 8) | *(unsigned char *)(in++); \\\n    lc += 8;                                 \\\n  }\n\n#if 0\n#define getCode(po, rlc, c, lc, in, out, ob, oe) \\\n  {                                              \\\n    if (po == rlc) {                             \\\n      if (lc < 8) getChar(c, lc, in);            \\\n                                                 \\\n      lc -= 8;                                   \\\n                                                 \\\n      unsigned char cs = (c >> lc);              \\\n                                                 \\\n      if (out + cs > oe) return false;           \\\n                                                 \\\n      /* TinyEXR issue 78 */                     \\\n      unsigned short s = out[-1];                \\\n                                                 \\\n      while (cs-- > 0) *out++ = s;               \\\n    } else if (out < oe) {                       \\\n      *out++ = po;                               \\\n    } else {                                     \\\n      return false;                              \\\n    }                                            \\\n  }\n#else\nstatic bool getCode(int po, int rlc, long long &c, int &lc, const char *&in,\n                    const char *in_end, unsigned short *&out,\n                    const unsigned short *ob, const unsigned short *oe) {\n  (void)ob;\n  if (po == rlc) {\n    if (lc < 8) {\n      /* TinyEXR issue 78 */\n      if ((in + 1) >= in_end) {\n        return false;\n      }\n\n      getChar(c, lc, in);\n    }\n\n    lc -= 8;\n\n    unsigned char cs = (c >> lc);\n\n    if (out + cs > oe) return false;\n\n    // Bounds check for safety\n    // Issue 100.\n    if ((out - 1) < ob) return false;\n    unsigned short s = out[-1];\n\n    while (cs-- > 0) *out++ = s;\n  } else if (out < oe) {\n    *out++ = po;\n  } else {\n    return false;\n  }\n  return true;\n}\n#endif\n\n//\n// Decode (uncompress) ni bits based on encoding & decoding tables:\n//\n\nstatic bool hufDecode(const long long *hcode,  // i : encoding table\n                      const HufDec *hdecod,    // i : decoding table\n                      const char *in,          // i : compressed input buffer\n                      int ni,                  // i : input size (in bits)\n                      int rlc,                 // i : run-length code\n                      int no,  // i : expected output size (in bytes)\n                      unsigned short *out)  //  o: uncompressed output buffer\n{\n  long long c = 0;\n  int lc = 0;\n  unsigned short *outb = out;          // begin\n  unsigned short *oe = out + no;       // end\n  const char *ie = in + (ni + 7) / 8;  // input byte size\n\n  //\n  // Loop on input bytes\n  //\n\n  while (in < ie) {\n    getChar(c, lc, in);\n\n    //\n    // Access decoding table\n    //\n\n    while (lc >= HUF_DECBITS) {\n      const HufDec pl = hdecod[(c >> (lc - HUF_DECBITS)) & HUF_DECMASK];\n\n      if (pl.len) {\n        //\n        // Get short code\n        //\n\n        lc -= pl.len;\n        // std::cout << \"lit = \" << pl.lit << std::endl;\n        // std::cout << \"rlc = \" << rlc << std::endl;\n        // std::cout << \"c = \" << c << std::endl;\n        // std::cout << \"lc = \" << lc << std::endl;\n        // std::cout << \"in = \" << in << std::endl;\n        // std::cout << \"out = \" << out << std::endl;\n        // std::cout << \"oe = \" << oe << std::endl;\n        if (!getCode(pl.lit, rlc, c, lc, in, ie, out, outb, oe)) {\n          return false;\n        }\n      } else {\n        if (!pl.p) {\n          return false;\n        }\n        // invalidCode(); // wrong code\n\n        //\n        // Search long code\n        //\n\n        int j;\n\n        for (j = 0; j < pl.lit; j++) {\n          int l = hufLength(hcode[pl.p[j]]);\n\n          while (lc < l && in < ie)  // get more bits\n            getChar(c, lc, in);\n\n          if (lc >= l) {\n            if (hufCode(hcode[pl.p[j]]) ==\n                ((c >> (lc - l)) & (((long long)(1) << l) - 1))) {\n              //\n              // Found : get long code\n              //\n\n              lc -= l;\n              if (!getCode(pl.p[j], rlc, c, lc, in, ie, out, outb, oe)) {\n                return false;\n              }\n              break;\n            }\n          }\n        }\n\n        if (j == pl.lit) {\n          return false;\n          // invalidCode(); // Not found\n        }\n      }\n    }\n  }\n\n  //\n  // Get remaining (short) codes\n  //\n\n  int i = (8 - ni) & 7;\n  c >>= i;\n  lc -= i;\n\n  while (lc > 0) {\n    const HufDec pl = hdecod[(c << (HUF_DECBITS - lc)) & HUF_DECMASK];\n\n    if (pl.len) {\n      lc -= pl.len;\n      if (!getCode(pl.lit, rlc, c, lc, in, ie, out, outb, oe)) {\n        return false;\n      }\n    } else {\n      return false;\n      // invalidCode(); // wrong (long) code\n    }\n  }\n\n  if (out - outb != no) {\n    return false;\n  }\n  // notEnoughData ();\n\n  return true;\n}\n\nstatic void countFrequencies(std::vector<long long> &freq,\n                             const unsigned short data[/*n*/], int n) {\n  for (int i = 0; i < HUF_ENCSIZE; ++i) freq[i] = 0;\n\n  for (int i = 0; i < n; ++i) ++freq[data[i]];\n}\n\nstatic void writeUInt(char buf[4], unsigned int i) {\n  unsigned char *b = (unsigned char *)buf;\n\n  b[0] = i;\n  b[1] = i >> 8;\n  b[2] = i >> 16;\n  b[3] = i >> 24;\n}\n\nstatic unsigned int readUInt(const char buf[4]) {\n  const unsigned char *b = (const unsigned char *)buf;\n\n  return (b[0] & 0x000000ff) | ((b[1] << 8) & 0x0000ff00) |\n         ((b[2] << 16) & 0x00ff0000) | ((b[3] << 24) & 0xff000000);\n}\n\n//\n// EXTERNAL INTERFACE\n//\n\nstatic int hufCompress(const unsigned short raw[], int nRaw,\n                       char compressed[]) {\n  if (nRaw == 0) return 0;\n\n  std::vector<long long> freq(HUF_ENCSIZE);\n\n  countFrequencies(freq, raw, nRaw);\n\n  int im = 0;\n  int iM = 0;\n  hufBuildEncTable(freq.data(), &im, &iM);\n\n  char *tableStart = compressed + 20;\n  char *tableEnd = tableStart;\n  hufPackEncTable(freq.data(), im, iM, &tableEnd);\n  int tableLength = tableEnd - tableStart;\n\n  char *dataStart = tableEnd;\n  int nBits = hufEncode(freq.data(), raw, nRaw, iM, dataStart);\n  int data_length = (nBits + 7) / 8;\n\n  writeUInt(compressed, im);\n  writeUInt(compressed + 4, iM);\n  writeUInt(compressed + 8, tableLength);\n  writeUInt(compressed + 12, nBits);\n  writeUInt(compressed + 16, 0);  // room for future extensions\n\n  return dataStart + data_length - compressed;\n}\n\nstatic bool hufUncompress(const char compressed[], int nCompressed,\n                          std::vector<unsigned short> *raw) {\n  if (nCompressed == 0) {\n    if (raw->size() != 0) return false;\n\n    return false;\n  }\n\n  int im = readUInt(compressed);\n  int iM = readUInt(compressed + 4);\n  // int tableLength = readUInt (compressed + 8);\n  int nBits = readUInt(compressed + 12);\n\n  if (im < 0 || im >= HUF_ENCSIZE || iM < 0 || iM >= HUF_ENCSIZE) return false;\n\n  const char *ptr = compressed + 20;\n\n  //\n  // Fast decoder needs at least 2x64-bits of compressed data, and\n  // needs to be run-able on this platform. Otherwise, fall back\n  // to the original decoder\n  //\n\n  // if (FastHufDecoder::enabled() && nBits > 128)\n  //{\n  //    FastHufDecoder fhd (ptr, nCompressed - (ptr - compressed), im, iM, iM);\n  //    fhd.decode ((unsigned char*)ptr, nBits, raw, nRaw);\n  //}\n  // else\n  {\n    std::vector<long long> freq(HUF_ENCSIZE);\n    std::vector<HufDec> hdec(HUF_DECSIZE);\n\n    hufClearDecTable(&hdec.at(0));\n\n    hufUnpackEncTable(&ptr, nCompressed - (ptr - compressed), im, iM,\n                      &freq.at(0));\n\n    {\n      if (nBits > 8 * (nCompressed - (ptr - compressed))) {\n        return false;\n      }\n\n      hufBuildDecTable(&freq.at(0), im, iM, &hdec.at(0));\n      hufDecode(&freq.at(0), &hdec.at(0), ptr, nBits, iM, raw->size(),\n                raw->data());\n    }\n    // catch (...)\n    //{\n    //    hufFreeDecTable (hdec);\n    //    throw;\n    //}\n\n    hufFreeDecTable(&hdec.at(0));\n  }\n\n  return true;\n}\n\n//\n// Functions to compress the range of values in the pixel data\n//\n\nconst int USHORT_RANGE = (1 << 16);\nconst int BITMAP_SIZE = (USHORT_RANGE >> 3);\n\nstatic void bitmapFromData(const unsigned short data[/*nData*/], int nData,\n                           unsigned char bitmap[BITMAP_SIZE],\n                           unsigned short &minNonZero,\n                           unsigned short &maxNonZero) {\n  for (int i = 0; i < BITMAP_SIZE; ++i) bitmap[i] = 0;\n\n  for (int i = 0; i < nData; ++i) bitmap[data[i] >> 3] |= (1 << (data[i] & 7));\n\n  bitmap[0] &= ~1;  // zero is not explicitly stored in\n                    // the bitmap; we assume that the\n                    // data always contain zeroes\n  minNonZero = BITMAP_SIZE - 1;\n  maxNonZero = 0;\n\n  for (int i = 0; i < BITMAP_SIZE; ++i) {\n    if (bitmap[i]) {\n      if (minNonZero > i) minNonZero = i;\n      if (maxNonZero < i) maxNonZero = i;\n    }\n  }\n}\n\nstatic unsigned short forwardLutFromBitmap(\n    const unsigned char bitmap[BITMAP_SIZE], unsigned short lut[USHORT_RANGE]) {\n  int k = 0;\n\n  for (int i = 0; i < USHORT_RANGE; ++i) {\n    if ((i == 0) || (bitmap[i >> 3] & (1 << (i & 7))))\n      lut[i] = k++;\n    else\n      lut[i] = 0;\n  }\n\n  return k - 1;  // maximum value stored in lut[],\n}  // i.e. number of ones in bitmap minus 1\n\nstatic unsigned short reverseLutFromBitmap(\n    const unsigned char bitmap[BITMAP_SIZE], unsigned short lut[USHORT_RANGE]) {\n  int k = 0;\n\n  for (int i = 0; i < USHORT_RANGE; ++i) {\n    if ((i == 0) || (bitmap[i >> 3] & (1 << (i & 7)))) lut[k++] = i;\n  }\n\n  int n = k - 1;\n\n  while (k < USHORT_RANGE) lut[k++] = 0;\n\n  return n;  // maximum k where lut[k] is non-zero,\n}  // i.e. number of ones in bitmap minus 1\n\nstatic void applyLut(const unsigned short lut[USHORT_RANGE],\n                     unsigned short data[/*nData*/], int nData) {\n  for (int i = 0; i < nData; ++i) data[i] = lut[data[i]];\n}\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif  // __clang__\n\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n\nstatic bool CompressPiz(unsigned char *outPtr, unsigned int *outSize,\n                        const unsigned char *inPtr, size_t inSize,\n                        const std::vector<ChannelInfo> &channelInfo,\n                        int data_width, int num_lines) {\n  std::vector<unsigned char> bitmap(BITMAP_SIZE);\n  unsigned short minNonZero;\n  unsigned short maxNonZero;\n\n#if !MINIZ_LITTLE_ENDIAN\n  // @todo { PIZ compression on BigEndian architecture. }\n  assert(0);\n  return false;\n#endif\n\n  // Assume `inSize` is multiple of 2 or 4.\n  std::vector<unsigned short> tmpBuffer(inSize / sizeof(unsigned short));\n\n  std::vector<PIZChannelData> channelData(channelInfo.size());\n  unsigned short *tmpBufferEnd = &tmpBuffer.at(0);\n\n  for (size_t c = 0; c < channelData.size(); c++) {\n    PIZChannelData &cd = channelData[c];\n\n    cd.start = tmpBufferEnd;\n    cd.end = cd.start;\n\n    cd.nx = data_width;\n    cd.ny = num_lines;\n    // cd.ys = c.channel().ySampling;\n\n    size_t pixelSize = sizeof(int);  // UINT and FLOAT\n    if (channelInfo[c].pixel_type == TINYEXR_PIXELTYPE_HALF) {\n      pixelSize = sizeof(short);\n    }\n\n    cd.size = static_cast<int>(pixelSize / sizeof(short));\n\n    tmpBufferEnd += cd.nx * cd.ny * cd.size;\n  }\n\n  const unsigned char *ptr = inPtr;\n  for (int y = 0; y < num_lines; ++y) {\n    for (size_t i = 0; i < channelData.size(); ++i) {\n      PIZChannelData &cd = channelData[i];\n\n      // if (modp (y, cd.ys) != 0)\n      //    continue;\n\n      size_t n = static_cast<size_t>(cd.nx * cd.size);\n      memcpy(cd.end, ptr, n * sizeof(unsigned short));\n      ptr += n * sizeof(unsigned short);\n      cd.end += n;\n    }\n  }\n\n  bitmapFromData(&tmpBuffer.at(0), static_cast<int>(tmpBuffer.size()),\n                 bitmap.data(), minNonZero, maxNonZero);\n\n  std::vector<unsigned short> lut(USHORT_RANGE);\n  unsigned short maxValue = forwardLutFromBitmap(bitmap.data(), lut.data());\n  applyLut(lut.data(), &tmpBuffer.at(0), static_cast<int>(tmpBuffer.size()));\n\n  //\n  // Store range compression info in _outBuffer\n  //\n\n  char *buf = reinterpret_cast<char *>(outPtr);\n\n  memcpy(buf, &minNonZero, sizeof(unsigned short));\n  buf += sizeof(unsigned short);\n  memcpy(buf, &maxNonZero, sizeof(unsigned short));\n  buf += sizeof(unsigned short);\n\n  if (minNonZero <= maxNonZero) {\n    memcpy(buf, reinterpret_cast<char *>(&bitmap[0] + minNonZero),\n           maxNonZero - minNonZero + 1);\n    buf += maxNonZero - minNonZero + 1;\n  }\n\n  //\n  // Apply wavelet encoding\n  //\n\n  for (size_t i = 0; i < channelData.size(); ++i) {\n    PIZChannelData &cd = channelData[i];\n\n    for (int j = 0; j < cd.size; ++j) {\n      wav2Encode(cd.start + j, cd.nx, cd.size, cd.ny, cd.nx * cd.size,\n                 maxValue);\n    }\n  }\n\n  //\n  // Apply Huffman encoding; append the result to _outBuffer\n  //\n\n  // length header(4byte), then huff data. Initialize length header with zero,\n  // then later fill it by `length`.\n  char *lengthPtr = buf;\n  int zero = 0;\n  memcpy(buf, &zero, sizeof(int));\n  buf += sizeof(int);\n\n  int length =\n      hufCompress(&tmpBuffer.at(0), static_cast<int>(tmpBuffer.size()), buf);\n  memcpy(lengthPtr, &length, sizeof(int));\n\n  (*outSize) = static_cast<unsigned int>(\n      (reinterpret_cast<unsigned char *>(buf) - outPtr) +\n      static_cast<unsigned int>(length));\n\n  // Use uncompressed data when compressed data is larger than uncompressed.\n  // (Issue 40)\n  if ((*outSize) >= inSize) {\n    (*outSize) = static_cast<unsigned int>(inSize);\n    memcpy(outPtr, inPtr, inSize);\n  }\n  return true;\n}\n\nstatic bool DecompressPiz(unsigned char *outPtr, const unsigned char *inPtr,\n                          size_t tmpBufSize, size_t inLen, int num_channels,\n                          const EXRChannelInfo *channels, int data_width,\n                          int num_lines) {\n  if (inLen == tmpBufSize) {\n    // Data is not compressed(Issue 40).\n    memcpy(outPtr, inPtr, inLen);\n    return true;\n  }\n\n  std::vector<unsigned char> bitmap(BITMAP_SIZE);\n  unsigned short minNonZero;\n  unsigned short maxNonZero;\n\n#if !MINIZ_LITTLE_ENDIAN\n  // @todo { PIZ compression on BigEndian architecture. }\n  assert(0);\n  return false;\n#endif\n\n  memset(bitmap.data(), 0, BITMAP_SIZE);\n\n  const unsigned char *ptr = inPtr;\n  // minNonZero = *(reinterpret_cast<const unsigned short *>(ptr));\n  tinyexr::cpy2(&minNonZero, reinterpret_cast<const unsigned short *>(ptr));\n  // maxNonZero = *(reinterpret_cast<const unsigned short *>(ptr + 2));\n  tinyexr::cpy2(&maxNonZero, reinterpret_cast<const unsigned short *>(ptr + 2));\n  ptr += 4;\n\n  if (maxNonZero >= BITMAP_SIZE) {\n    return false;\n  }\n\n  if (minNonZero <= maxNonZero) {\n    memcpy(reinterpret_cast<char *>(&bitmap[0] + minNonZero), ptr,\n           maxNonZero - minNonZero + 1);\n    ptr += maxNonZero - minNonZero + 1;\n  }\n\n  std::vector<unsigned short> lut(USHORT_RANGE);\n  memset(lut.data(), 0, sizeof(unsigned short) * USHORT_RANGE);\n  unsigned short maxValue = reverseLutFromBitmap(bitmap.data(), lut.data());\n\n  //\n  // Huffman decoding\n  //\n\n  int length;\n\n  // length = *(reinterpret_cast<const int *>(ptr));\n  tinyexr::cpy4(&length, reinterpret_cast<const int *>(ptr));\n  ptr += sizeof(int);\n\n  if (size_t((ptr - inPtr) + length) > inLen) {\n    return false;\n  }\n\n  std::vector<unsigned short> tmpBuffer(tmpBufSize);\n  hufUncompress(reinterpret_cast<const char *>(ptr), length, &tmpBuffer);\n\n  //\n  // Wavelet decoding\n  //\n\n  std::vector<PIZChannelData> channelData(static_cast<size_t>(num_channels));\n\n  unsigned short *tmpBufferEnd = &tmpBuffer.at(0);\n\n  for (size_t i = 0; i < static_cast<size_t>(num_channels); ++i) {\n    const EXRChannelInfo &chan = channels[i];\n\n    size_t pixelSize = sizeof(int);  // UINT and FLOAT\n    if (chan.pixel_type == TINYEXR_PIXELTYPE_HALF) {\n      pixelSize = sizeof(short);\n    }\n\n    channelData[i].start = tmpBufferEnd;\n    channelData[i].end = channelData[i].start;\n    channelData[i].nx = data_width;\n    channelData[i].ny = num_lines;\n    // channelData[i].ys = 1;\n    channelData[i].size = static_cast<int>(pixelSize / sizeof(short));\n\n    tmpBufferEnd += channelData[i].nx * channelData[i].ny * channelData[i].size;\n  }\n\n  for (size_t i = 0; i < channelData.size(); ++i) {\n    PIZChannelData &cd = channelData[i];\n\n    for (int j = 0; j < cd.size; ++j) {\n      wav2Decode(cd.start + j, cd.nx, cd.size, cd.ny, cd.nx * cd.size,\n                 maxValue);\n    }\n  }\n\n  //\n  // Expand the pixel data to their original range\n  //\n\n  applyLut(lut.data(), &tmpBuffer.at(0), static_cast<int>(tmpBufSize));\n\n  for (int y = 0; y < num_lines; y++) {\n    for (size_t i = 0; i < channelData.size(); ++i) {\n      PIZChannelData &cd = channelData[i];\n\n      // if (modp (y, cd.ys) != 0)\n      //    continue;\n\n      size_t n = static_cast<size_t>(cd.nx * cd.size);\n      memcpy(outPtr, cd.end, static_cast<size_t>(n * sizeof(unsigned short)));\n      outPtr += n * sizeof(unsigned short);\n      cd.end += n;\n    }\n  }\n\n  return true;\n}\n#endif  // TINYEXR_USE_PIZ\n\n#if TINYEXR_USE_ZFP\nstruct ZFPCompressionParam {\n  double rate;\n  int precision;\n  double tolerance;\n  int type;  // TINYEXR_ZFP_COMPRESSIONTYPE_*\n\n  ZFPCompressionParam() {\n    type = TINYEXR_ZFP_COMPRESSIONTYPE_RATE;\n    rate = 2.0;\n    precision = 0;\n    tolerance = 0.0f;\n  }\n};\n\nbool FindZFPCompressionParam(ZFPCompressionParam *param,\n                             const EXRAttribute *attributes,\n                             int num_attributes) {\n  bool foundType = false;\n\n  for (int i = 0; i < num_attributes; i++) {\n    if ((strcmp(attributes[i].name, \"zfpCompressionType\") == 0) &&\n        (attributes[i].size == 1)) {\n      param->type = static_cast<int>(attributes[i].value[0]);\n\n      foundType = true;\n    }\n  }\n\n  if (!foundType) {\n    return false;\n  }\n\n  if (param->type == TINYEXR_ZFP_COMPRESSIONTYPE_RATE) {\n    for (int i = 0; i < num_attributes; i++) {\n      if ((strcmp(attributes[i].name, \"zfpCompressionRate\") == 0) &&\n          (attributes[i].size == 8)) {\n        param->rate = *(reinterpret_cast<double *>(attributes[i].value));\n        return true;\n      }\n    }\n  } else if (param->type == TINYEXR_ZFP_COMPRESSIONTYPE_PRECISION) {\n    for (int i = 0; i < num_attributes; i++) {\n      if ((strcmp(attributes[i].name, \"zfpCompressionPrecision\") == 0) &&\n          (attributes[i].size == 4)) {\n        param->rate = *(reinterpret_cast<int *>(attributes[i].value));\n        return true;\n      }\n    }\n  } else if (param->type == TINYEXR_ZFP_COMPRESSIONTYPE_ACCURACY) {\n    for (int i = 0; i < num_attributes; i++) {\n      if ((strcmp(attributes[i].name, \"zfpCompressionTolerance\") == 0) &&\n          (attributes[i].size == 8)) {\n        param->tolerance = *(reinterpret_cast<double *>(attributes[i].value));\n        return true;\n      }\n    }\n  } else {\n    assert(0);\n  }\n\n  return false;\n}\n\n// Assume pixel format is FLOAT for all channels.\nstatic bool DecompressZfp(float *dst, int dst_width, int dst_num_lines,\n                          int num_channels, const unsigned char *src,\n                          unsigned long src_size,\n                          const ZFPCompressionParam &param) {\n  size_t uncompressed_size = dst_width * dst_num_lines * num_channels;\n\n  if (uncompressed_size == src_size) {\n    // Data is not compressed(Issue 40).\n    memcpy(dst, src, src_size);\n  }\n\n  zfp_stream *zfp = NULL;\n  zfp_field *field = NULL;\n\n  assert((dst_width % 4) == 0);\n  assert((dst_num_lines % 4) == 0);\n\n  if ((dst_width & 3U) || (dst_num_lines & 3U)) {\n    return false;\n  }\n\n  field =\n      zfp_field_2d(reinterpret_cast<void *>(const_cast<unsigned char *>(src)),\n                   zfp_type_float, dst_width, dst_num_lines * num_channels);\n  zfp = zfp_stream_open(NULL);\n\n  if (param.type == TINYEXR_ZFP_COMPRESSIONTYPE_RATE) {\n    zfp_stream_set_rate(zfp, param.rate, zfp_type_float, /* dimention */ 2,\n                        /* write random access */ 0);\n  } else if (param.type == TINYEXR_ZFP_COMPRESSIONTYPE_PRECISION) {\n    zfp_stream_set_precision(zfp, param.precision, zfp_type_float);\n  } else if (param.type == TINYEXR_ZFP_COMPRESSIONTYPE_ACCURACY) {\n    zfp_stream_set_accuracy(zfp, param.tolerance, zfp_type_float);\n  } else {\n    assert(0);\n  }\n\n  size_t buf_size = zfp_stream_maximum_size(zfp, field);\n  std::vector<unsigned char> buf(buf_size);\n  memcpy(&buf.at(0), src, src_size);\n\n  bitstream *stream = stream_open(&buf.at(0), buf_size);\n  zfp_stream_set_bit_stream(zfp, stream);\n  zfp_stream_rewind(zfp);\n\n  size_t image_size = dst_width * dst_num_lines;\n\n  for (int c = 0; c < num_channels; c++) {\n    // decompress 4x4 pixel block.\n    for (int y = 0; y < dst_num_lines; y += 4) {\n      for (int x = 0; x < dst_width; x += 4) {\n        float fblock[16];\n        zfp_decode_block_float_2(zfp, fblock);\n        for (int j = 0; j < 4; j++) {\n          for (int i = 0; i < 4; i++) {\n            dst[c * image_size + ((y + j) * dst_width + (x + i))] =\n                fblock[j * 4 + i];\n          }\n        }\n      }\n    }\n  }\n\n  zfp_field_free(field);\n  zfp_stream_close(zfp);\n  stream_close(stream);\n\n  return true;\n}\n\n// Assume pixel format is FLOAT for all channels.\nbool CompressZfp(std::vector<unsigned char> *outBuf, unsigned int *outSize,\n                 const float *inPtr, int width, int num_lines, int num_channels,\n                 const ZFPCompressionParam &param) {\n  zfp_stream *zfp = NULL;\n  zfp_field *field = NULL;\n\n  assert((width % 4) == 0);\n  assert((num_lines % 4) == 0);\n\n  if ((width & 3U) || (num_lines & 3U)) {\n    return false;\n  }\n\n  // create input array.\n  field = zfp_field_2d(reinterpret_cast<void *>(const_cast<float *>(inPtr)),\n                       zfp_type_float, width, num_lines * num_channels);\n\n  zfp = zfp_stream_open(NULL);\n\n  if (param.type == TINYEXR_ZFP_COMPRESSIONTYPE_RATE) {\n    zfp_stream_set_rate(zfp, param.rate, zfp_type_float, 2, 0);\n  } else if (param.type == TINYEXR_ZFP_COMPRESSIONTYPE_PRECISION) {\n    zfp_stream_set_precision(zfp, param.precision, zfp_type_float);\n  } else if (param.type == TINYEXR_ZFP_COMPRESSIONTYPE_ACCURACY) {\n    zfp_stream_set_accuracy(zfp, param.tolerance, zfp_type_float);\n  } else {\n    assert(0);\n  }\n\n  size_t buf_size = zfp_stream_maximum_size(zfp, field);\n\n  outBuf->resize(buf_size);\n\n  bitstream *stream = stream_open(&outBuf->at(0), buf_size);\n  zfp_stream_set_bit_stream(zfp, stream);\n  zfp_field_free(field);\n\n  size_t image_size = width * num_lines;\n\n  for (int c = 0; c < num_channels; c++) {\n    // compress 4x4 pixel block.\n    for (int y = 0; y < num_lines; y += 4) {\n      for (int x = 0; x < width; x += 4) {\n        float fblock[16];\n        for (int j = 0; j < 4; j++) {\n          for (int i = 0; i < 4; i++) {\n            fblock[j * 4 + i] =\n                inPtr[c * image_size + ((y + j) * width + (x + i))];\n          }\n        }\n        zfp_encode_block_float_2(zfp, fblock);\n      }\n    }\n  }\n\n  zfp_stream_flush(zfp);\n  (*outSize) = zfp_stream_compressed_size(zfp);\n\n  zfp_stream_close(zfp);\n\n  return true;\n}\n\n#endif\n\n//\n// -----------------------------------------------------------------\n//\n\n// TODO(syoyo): Refactor function arguments.\nstatic bool DecodePixelData(/* out */ unsigned char **out_images,\n                            const int *requested_pixel_types,\n                            const unsigned char *data_ptr, size_t data_len,\n                            int compression_type, int line_order, int width,\n                            int height, int x_stride, int y, int line_no,\n                            int num_lines, size_t pixel_data_size,\n                            size_t num_attributes,\n                            const EXRAttribute *attributes, size_t num_channels,\n                            const EXRChannelInfo *channels,\n                            const std::vector<size_t> &channel_offset_list) {\n  if (compression_type == TINYEXR_COMPRESSIONTYPE_PIZ) {  // PIZ\n#if TINYEXR_USE_PIZ\n    if ((width == 0) || (num_lines == 0) || (pixel_data_size == 0)) {\n      // Invalid input #90\n      return false;\n    }\n\n    // Allocate original data size.\n    std::vector<unsigned char> outBuf(static_cast<size_t>(\n        static_cast<size_t>(width * num_lines) * pixel_data_size));\n    size_t tmpBufLen = outBuf.size();\n\n    bool ret = tinyexr::DecompressPiz(\n        reinterpret_cast<unsigned char *>(&outBuf.at(0)), data_ptr, tmpBufLen,\n        data_len, static_cast<int>(num_channels), channels, width, num_lines);\n\n    if (!ret) {\n      return false;\n    }\n\n    // For PIZ_COMPRESSION:\n    //   pixel sample data for channel 0 for scanline 0\n    //   pixel sample data for channel 1 for scanline 0\n    //   pixel sample data for channel ... for scanline 0\n    //   pixel sample data for channel n for scanline 0\n    //   pixel sample data for channel 0 for scanline 1\n    //   pixel sample data for channel 1 for scanline 1\n    //   pixel sample data for channel ... for scanline 1\n    //   pixel sample data for channel n for scanline 1\n    //   ...\n    for (size_t c = 0; c < static_cast<size_t>(num_channels); c++) {\n      if (channels[c].pixel_type == TINYEXR_PIXELTYPE_HALF) {\n        for (size_t v = 0; v < static_cast<size_t>(num_lines); v++) {\n          const unsigned short *line_ptr = reinterpret_cast<unsigned short *>(\n              &outBuf.at(v * pixel_data_size * static_cast<size_t>(width) +\n                         channel_offset_list[c] * static_cast<size_t>(width)));\n          for (size_t u = 0; u < static_cast<size_t>(width); u++) {\n            FP16 hf;\n\n            // hf.u = line_ptr[u];\n            // use `cpy` to avoid unaligned memory access when compiler's\n            // optimization is on.\n            tinyexr::cpy2(&(hf.u), line_ptr + u);\n\n            tinyexr::swap2(reinterpret_cast<unsigned short *>(&hf.u));\n\n            if (requested_pixel_types[c] == TINYEXR_PIXELTYPE_HALF) {\n              unsigned short *image =\n                  reinterpret_cast<unsigned short **>(out_images)[c];\n              if (line_order == 0) {\n                image += (static_cast<size_t>(line_no) + v) *\n                             static_cast<size_t>(x_stride) +\n                         u;\n              } else {\n                image += static_cast<size_t>(\n                             (height - 1 - (line_no + static_cast<int>(v)))) *\n                             static_cast<size_t>(x_stride) +\n                         u;\n              }\n              *image = hf.u;\n            } else {  // HALF -> FLOAT\n              FP32 f32 = half_to_float(hf);\n              float *image = reinterpret_cast<float **>(out_images)[c];\n              size_t offset = 0;\n              if (line_order == 0) {\n                offset = (static_cast<size_t>(line_no) + v) *\n                             static_cast<size_t>(x_stride) +\n                         u;\n              } else {\n                offset = static_cast<size_t>(\n                             (height - 1 - (line_no + static_cast<int>(v)))) *\n                             static_cast<size_t>(x_stride) +\n                         u;\n              }\n              image += offset;\n              *image = f32.f;\n            }\n          }\n        }\n      } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_UINT) {\n        assert(requested_pixel_types[c] == TINYEXR_PIXELTYPE_UINT);\n\n        for (size_t v = 0; v < static_cast<size_t>(num_lines); v++) {\n          const unsigned int *line_ptr = reinterpret_cast<unsigned int *>(\n              &outBuf.at(v * pixel_data_size * static_cast<size_t>(width) +\n                         channel_offset_list[c] * static_cast<size_t>(width)));\n          for (size_t u = 0; u < static_cast<size_t>(width); u++) {\n            unsigned int val;\n            // val = line_ptr[u];\n            tinyexr::cpy4(&val, line_ptr + u);\n\n            tinyexr::swap4(&val);\n\n            unsigned int *image =\n                reinterpret_cast<unsigned int **>(out_images)[c];\n            if (line_order == 0) {\n              image += (static_cast<size_t>(line_no) + v) *\n                           static_cast<size_t>(x_stride) +\n                       u;\n            } else {\n              image += static_cast<size_t>(\n                           (height - 1 - (line_no + static_cast<int>(v)))) *\n                           static_cast<size_t>(x_stride) +\n                       u;\n            }\n            *image = val;\n          }\n        }\n      } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT) {\n        assert(requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT);\n        for (size_t v = 0; v < static_cast<size_t>(num_lines); v++) {\n          const float *line_ptr = reinterpret_cast<float *>(&outBuf.at(\n              v * pixel_data_size * static_cast<size_t>(x_stride) +\n              channel_offset_list[c] * static_cast<size_t>(x_stride)));\n          for (size_t u = 0; u < static_cast<size_t>(width); u++) {\n            float val;\n            // val = line_ptr[u];\n            tinyexr::cpy4(&val, line_ptr + u);\n\n            tinyexr::swap4(reinterpret_cast<unsigned int *>(&val));\n\n            float *image = reinterpret_cast<float **>(out_images)[c];\n            if (line_order == 0) {\n              image += (static_cast<size_t>(line_no) + v) *\n                           static_cast<size_t>(x_stride) +\n                       u;\n            } else {\n              image += static_cast<size_t>(\n                           (height - 1 - (line_no + static_cast<int>(v)))) *\n                           static_cast<size_t>(x_stride) +\n                       u;\n            }\n            *image = val;\n          }\n        }\n      } else {\n        assert(0);\n      }\n    }\n#else\n    assert(0 && \"PIZ is enabled in this build\");\n    return false;\n#endif\n\n  } else if (compression_type == TINYEXR_COMPRESSIONTYPE_ZIPS ||\n             compression_type == TINYEXR_COMPRESSIONTYPE_ZIP) {\n    // Allocate original data size.\n    std::vector<unsigned char> outBuf(static_cast<size_t>(width) *\n                                      static_cast<size_t>(num_lines) *\n                                      pixel_data_size);\n\n    unsigned long dstLen = static_cast<unsigned long>(outBuf.size());\n    assert(dstLen > 0);\n    if (!tinyexr::DecompressZip(\n            reinterpret_cast<unsigned char *>(&outBuf.at(0)), &dstLen, data_ptr,\n            static_cast<unsigned long>(data_len))) {\n      return false;\n    }\n\n    // For ZIP_COMPRESSION:\n    //   pixel sample data for channel 0 for scanline 0\n    //   pixel sample data for channel 1 for scanline 0\n    //   pixel sample data for channel ... for scanline 0\n    //   pixel sample data for channel n for scanline 0\n    //   pixel sample data for channel 0 for scanline 1\n    //   pixel sample data for channel 1 for scanline 1\n    //   pixel sample data for channel ... for scanline 1\n    //   pixel sample data for channel n for scanline 1\n    //   ...\n    for (size_t c = 0; c < static_cast<size_t>(num_channels); c++) {\n      if (channels[c].pixel_type == TINYEXR_PIXELTYPE_HALF) {\n        for (size_t v = 0; v < static_cast<size_t>(num_lines); v++) {\n          const unsigned short *line_ptr = reinterpret_cast<unsigned short *>(\n              &outBuf.at(v * static_cast<size_t>(pixel_data_size) *\n                             static_cast<size_t>(width) +\n                         channel_offset_list[c] * static_cast<size_t>(width)));\n          for (size_t u = 0; u < static_cast<size_t>(width); u++) {\n            tinyexr::FP16 hf;\n\n            // hf.u = line_ptr[u];\n            tinyexr::cpy2(&(hf.u), line_ptr + u);\n\n            tinyexr::swap2(reinterpret_cast<unsigned short *>(&hf.u));\n\n            if (requested_pixel_types[c] == TINYEXR_PIXELTYPE_HALF) {\n              unsigned short *image =\n                  reinterpret_cast<unsigned short **>(out_images)[c];\n              if (line_order == 0) {\n                image += (static_cast<size_t>(line_no) + v) *\n                             static_cast<size_t>(x_stride) +\n                         u;\n              } else {\n                image += (static_cast<size_t>(height) - 1U -\n                          (static_cast<size_t>(line_no) + v)) *\n                             static_cast<size_t>(x_stride) +\n                         u;\n              }\n              *image = hf.u;\n            } else {  // HALF -> FLOAT\n              tinyexr::FP32 f32 = half_to_float(hf);\n              float *image = reinterpret_cast<float **>(out_images)[c];\n              size_t offset = 0;\n              if (line_order == 0) {\n                offset = (static_cast<size_t>(line_no) + v) *\n                             static_cast<size_t>(x_stride) +\n                         u;\n              } else {\n                offset = (static_cast<size_t>(height) - 1U -\n                          (static_cast<size_t>(line_no) + v)) *\n                             static_cast<size_t>(x_stride) +\n                         u;\n              }\n              image += offset;\n\n              *image = f32.f;\n            }\n          }\n        }\n      } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_UINT) {\n        assert(requested_pixel_types[c] == TINYEXR_PIXELTYPE_UINT);\n\n        for (size_t v = 0; v < static_cast<size_t>(num_lines); v++) {\n          const unsigned int *line_ptr = reinterpret_cast<unsigned int *>(\n              &outBuf.at(v * pixel_data_size * static_cast<size_t>(width) +\n                         channel_offset_list[c] * static_cast<size_t>(width)));\n          for (size_t u = 0; u < static_cast<size_t>(width); u++) {\n            unsigned int val;\n            // val = line_ptr[u];\n            tinyexr::cpy4(&val, line_ptr + u);\n\n            tinyexr::swap4(&val);\n\n            unsigned int *image =\n                reinterpret_cast<unsigned int **>(out_images)[c];\n            if (line_order == 0) {\n              image += (static_cast<size_t>(line_no) + v) *\n                           static_cast<size_t>(x_stride) +\n                       u;\n            } else {\n              image += (static_cast<size_t>(height) - 1U -\n                        (static_cast<size_t>(line_no) + v)) *\n                           static_cast<size_t>(x_stride) +\n                       u;\n            }\n            *image = val;\n          }\n        }\n      } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT) {\n        assert(requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT);\n        for (size_t v = 0; v < static_cast<size_t>(num_lines); v++) {\n          const float *line_ptr = reinterpret_cast<float *>(\n              &outBuf.at(v * pixel_data_size * static_cast<size_t>(width) +\n                         channel_offset_list[c] * static_cast<size_t>(width)));\n          for (size_t u = 0; u < static_cast<size_t>(width); u++) {\n            float val;\n            // val = line_ptr[u];\n            tinyexr::cpy4(&val, line_ptr + u);\n\n            tinyexr::swap4(reinterpret_cast<unsigned int *>(&val));\n\n            float *image = reinterpret_cast<float **>(out_images)[c];\n            if (line_order == 0) {\n              image += (static_cast<size_t>(line_no) + v) *\n                           static_cast<size_t>(x_stride) +\n                       u;\n            } else {\n              image += (static_cast<size_t>(height) - 1U -\n                        (static_cast<size_t>(line_no) + v)) *\n                           static_cast<size_t>(x_stride) +\n                       u;\n            }\n            *image = val;\n          }\n        }\n      } else {\n        assert(0);\n        return false;\n      }\n    }\n  } else if (compression_type == TINYEXR_COMPRESSIONTYPE_RLE) {\n    // Allocate original data size.\n    std::vector<unsigned char> outBuf(static_cast<size_t>(width) *\n                                      static_cast<size_t>(num_lines) *\n                                      pixel_data_size);\n\n    unsigned long dstLen = static_cast<unsigned long>(outBuf.size());\n    if (dstLen == 0) {\n      return false;\n    }\n\n    if (!tinyexr::DecompressRle(reinterpret_cast<unsigned char *>(&outBuf.at(0)),\n                           dstLen, data_ptr,\n                           static_cast<unsigned long>(data_len))) {\n      return false;\n    }\n\n    // For RLE_COMPRESSION:\n    //   pixel sample data for channel 0 for scanline 0\n    //   pixel sample data for channel 1 for scanline 0\n    //   pixel sample data for channel ... for scanline 0\n    //   pixel sample data for channel n for scanline 0\n    //   pixel sample data for channel 0 for scanline 1\n    //   pixel sample data for channel 1 for scanline 1\n    //   pixel sample data for channel ... for scanline 1\n    //   pixel sample data for channel n for scanline 1\n    //   ...\n    for (size_t c = 0; c < static_cast<size_t>(num_channels); c++) {\n      if (channels[c].pixel_type == TINYEXR_PIXELTYPE_HALF) {\n        for (size_t v = 0; v < static_cast<size_t>(num_lines); v++) {\n          const unsigned short *line_ptr = reinterpret_cast<unsigned short *>(\n              &outBuf.at(v * static_cast<size_t>(pixel_data_size) *\n                             static_cast<size_t>(width) +\n                         channel_offset_list[c] * static_cast<size_t>(width)));\n          for (size_t u = 0; u < static_cast<size_t>(width); u++) {\n            tinyexr::FP16 hf;\n\n            // hf.u = line_ptr[u];\n            tinyexr::cpy2(&(hf.u), line_ptr + u);\n\n            tinyexr::swap2(reinterpret_cast<unsigned short *>(&hf.u));\n\n            if (requested_pixel_types[c] == TINYEXR_PIXELTYPE_HALF) {\n              unsigned short *image =\n                  reinterpret_cast<unsigned short **>(out_images)[c];\n              if (line_order == 0) {\n                image += (static_cast<size_t>(line_no) + v) *\n                             static_cast<size_t>(x_stride) +\n                         u;\n              } else {\n                image += (static_cast<size_t>(height) - 1U -\n                          (static_cast<size_t>(line_no) + v)) *\n                             static_cast<size_t>(x_stride) +\n                         u;\n              }\n              *image = hf.u;\n            } else {  // HALF -> FLOAT\n              tinyexr::FP32 f32 = half_to_float(hf);\n              float *image = reinterpret_cast<float **>(out_images)[c];\n              if (line_order == 0) {\n                image += (static_cast<size_t>(line_no) + v) *\n                             static_cast<size_t>(x_stride) +\n                         u;\n              } else {\n                image += (static_cast<size_t>(height) - 1U -\n                          (static_cast<size_t>(line_no) + v)) *\n                             static_cast<size_t>(x_stride) +\n                         u;\n              }\n              *image = f32.f;\n            }\n          }\n        }\n      } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_UINT) {\n        assert(requested_pixel_types[c] == TINYEXR_PIXELTYPE_UINT);\n\n        for (size_t v = 0; v < static_cast<size_t>(num_lines); v++) {\n          const unsigned int *line_ptr = reinterpret_cast<unsigned int *>(\n              &outBuf.at(v * pixel_data_size * static_cast<size_t>(width) +\n                         channel_offset_list[c] * static_cast<size_t>(width)));\n          for (size_t u = 0; u < static_cast<size_t>(width); u++) {\n            unsigned int val;\n            // val = line_ptr[u];\n            tinyexr::cpy4(&val, line_ptr + u);\n\n            tinyexr::swap4(&val);\n\n            unsigned int *image =\n                reinterpret_cast<unsigned int **>(out_images)[c];\n            if (line_order == 0) {\n              image += (static_cast<size_t>(line_no) + v) *\n                           static_cast<size_t>(x_stride) +\n                       u;\n            } else {\n              image += (static_cast<size_t>(height) - 1U -\n                        (static_cast<size_t>(line_no) + v)) *\n                           static_cast<size_t>(x_stride) +\n                       u;\n            }\n            *image = val;\n          }\n        }\n      } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT) {\n        assert(requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT);\n        for (size_t v = 0; v < static_cast<size_t>(num_lines); v++) {\n          const float *line_ptr = reinterpret_cast<float *>(\n              &outBuf.at(v * pixel_data_size * static_cast<size_t>(width) +\n                         channel_offset_list[c] * static_cast<size_t>(width)));\n          for (size_t u = 0; u < static_cast<size_t>(width); u++) {\n            float val;\n            // val = line_ptr[u];\n            tinyexr::cpy4(&val, line_ptr + u);\n\n            tinyexr::swap4(reinterpret_cast<unsigned int *>(&val));\n\n            float *image = reinterpret_cast<float **>(out_images)[c];\n            if (line_order == 0) {\n              image += (static_cast<size_t>(line_no) + v) *\n                           static_cast<size_t>(x_stride) +\n                       u;\n            } else {\n              image += (static_cast<size_t>(height) - 1U -\n                        (static_cast<size_t>(line_no) + v)) *\n                           static_cast<size_t>(x_stride) +\n                       u;\n            }\n            *image = val;\n          }\n        }\n      } else {\n        assert(0);\n        return false;\n      }\n    }\n  } else if (compression_type == TINYEXR_COMPRESSIONTYPE_ZFP) {\n#if TINYEXR_USE_ZFP\n    tinyexr::ZFPCompressionParam zfp_compression_param;\n    if (!FindZFPCompressionParam(&zfp_compression_param, attributes,\n                                 num_attributes)) {\n      assert(0);\n      return false;\n    }\n\n    // Allocate original data size.\n    std::vector<unsigned char> outBuf(static_cast<size_t>(width) *\n                                      static_cast<size_t>(num_lines) *\n                                      pixel_data_size);\n\n    unsigned long dstLen = outBuf.size();\n    assert(dstLen > 0);\n    tinyexr::DecompressZfp(reinterpret_cast<float *>(&outBuf.at(0)), width,\n                           num_lines, num_channels, data_ptr,\n                           static_cast<unsigned long>(data_len),\n                           zfp_compression_param);\n\n    // For ZFP_COMPRESSION:\n    //   pixel sample data for channel 0 for scanline 0\n    //   pixel sample data for channel 1 for scanline 0\n    //   pixel sample data for channel ... for scanline 0\n    //   pixel sample data for channel n for scanline 0\n    //   pixel sample data for channel 0 for scanline 1\n    //   pixel sample data for channel 1 for scanline 1\n    //   pixel sample data for channel ... for scanline 1\n    //   pixel sample data for channel n for scanline 1\n    //   ...\n    for (size_t c = 0; c < static_cast<size_t>(num_channels); c++) {\n      assert(channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT);\n      if (channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT) {\n        assert(requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT);\n        for (size_t v = 0; v < static_cast<size_t>(num_lines); v++) {\n          const float *line_ptr = reinterpret_cast<float *>(\n              &outBuf.at(v * pixel_data_size * static_cast<size_t>(width) +\n                         channel_offset_list[c] * static_cast<size_t>(width)));\n          for (size_t u = 0; u < static_cast<size_t>(width); u++) {\n            float val;\n            tinyexr::cpy4(&val, line_ptr + u);\n\n            tinyexr::swap4(reinterpret_cast<unsigned int *>(&val));\n\n            float *image = reinterpret_cast<float **>(out_images)[c];\n            if (line_order == 0) {\n              image += (static_cast<size_t>(line_no) + v) *\n                           static_cast<size_t>(x_stride) +\n                       u;\n            } else {\n              image += (static_cast<size_t>(height) - 1U -\n                        (static_cast<size_t>(line_no) + v)) *\n                           static_cast<size_t>(x_stride) +\n                       u;\n            }\n            *image = val;\n          }\n        }\n      } else {\n        assert(0);\n        return false;\n      }\n    }\n#else\n    (void)attributes;\n    (void)num_attributes;\n    (void)num_channels;\n    assert(0);\n    return false;\n#endif\n  } else if (compression_type == TINYEXR_COMPRESSIONTYPE_NONE) {\n    for (size_t c = 0; c < num_channels; c++) {\n      for (size_t v = 0; v < static_cast<size_t>(num_lines); v++) {\n        if (channels[c].pixel_type == TINYEXR_PIXELTYPE_HALF) {\n          const unsigned short *line_ptr =\n              reinterpret_cast<const unsigned short *>(\n                  data_ptr + v * pixel_data_size * size_t(width) +\n                  channel_offset_list[c] * static_cast<size_t>(width));\n\n          if (requested_pixel_types[c] == TINYEXR_PIXELTYPE_HALF) {\n            unsigned short *outLine =\n                reinterpret_cast<unsigned short *>(out_images[c]);\n            if (line_order == 0) {\n              outLine += (size_t(y) + v) * size_t(x_stride);\n            } else {\n              outLine +=\n                  (size_t(height) - 1 - (size_t(y) + v)) * size_t(x_stride);\n            }\n\n            for (int u = 0; u < width; u++) {\n              tinyexr::FP16 hf;\n\n              // hf.u = line_ptr[u];\n              tinyexr::cpy2(&(hf.u), line_ptr + u);\n\n              tinyexr::swap2(reinterpret_cast<unsigned short *>(&hf.u));\n\n              outLine[u] = hf.u;\n            }\n          } else if (requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT) {\n            float *outLine = reinterpret_cast<float *>(out_images[c]);\n            if (line_order == 0) {\n              outLine += (size_t(y) + v) * size_t(x_stride);\n            } else {\n              outLine +=\n                  (size_t(height) - 1 - (size_t(y) + v)) * size_t(x_stride);\n            }\n\n            if (reinterpret_cast<const unsigned char *>(line_ptr + width) >\n                (data_ptr + data_len)) {\n              // Insufficient data size\n              return false;\n            }\n\n            for (int u = 0; u < width; u++) {\n              tinyexr::FP16 hf;\n\n              // address may not be aliged. use byte-wise copy for safety.#76\n              // hf.u = line_ptr[u];\n              tinyexr::cpy2(&(hf.u), line_ptr + u);\n\n              tinyexr::swap2(reinterpret_cast<unsigned short *>(&hf.u));\n\n              tinyexr::FP32 f32 = half_to_float(hf);\n\n              outLine[u] = f32.f;\n            }\n          } else {\n            assert(0);\n            return false;\n          }\n        } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT) {\n          const float *line_ptr = reinterpret_cast<const float *>(\n              data_ptr + v * pixel_data_size * size_t(width) +\n              channel_offset_list[c] * static_cast<size_t>(width));\n\n          float *outLine = reinterpret_cast<float *>(out_images[c]);\n          if (line_order == 0) {\n            outLine += (size_t(y) + v) * size_t(x_stride);\n          } else {\n            outLine +=\n                (size_t(height) - 1 - (size_t(y) + v)) * size_t(x_stride);\n          }\n\n          if (reinterpret_cast<const unsigned char *>(line_ptr + width) >\n              (data_ptr + data_len)) {\n            // Insufficient data size\n            return false;\n          }\n\n          for (int u = 0; u < width; u++) {\n            float val;\n            tinyexr::cpy4(&val, line_ptr + u);\n\n            tinyexr::swap4(reinterpret_cast<unsigned int *>(&val));\n\n            outLine[u] = val;\n          }\n        } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_UINT) {\n          const unsigned int *line_ptr = reinterpret_cast<const unsigned int *>(\n              data_ptr + v * pixel_data_size * size_t(width) +\n              channel_offset_list[c] * static_cast<size_t>(width));\n\n          unsigned int *outLine =\n              reinterpret_cast<unsigned int *>(out_images[c]);\n          if (line_order == 0) {\n            outLine += (size_t(y) + v) * size_t(x_stride);\n          } else {\n            outLine +=\n                (size_t(height) - 1 - (size_t(y) + v)) * size_t(x_stride);\n          }\n\n          for (int u = 0; u < width; u++) {\n            if (reinterpret_cast<const unsigned char *>(line_ptr + u) >=\n                (data_ptr + data_len)) {\n              // Corrupsed data?\n              return false;\n            }\n\n            unsigned int val;\n            tinyexr::cpy4(&val, line_ptr + u);\n\n            tinyexr::swap4(reinterpret_cast<unsigned int *>(&val));\n\n            outLine[u] = val;\n          }\n        }\n      }\n    }\n  }\n\n  return true;\n}\n\nstatic void DecodeTiledPixelData(\n    unsigned char **out_images, int *width, int *height,\n    const int *requested_pixel_types, const unsigned char *data_ptr,\n    size_t data_len, int compression_type, int line_order, int data_width,\n    int data_height, int tile_offset_x, int tile_offset_y, int tile_size_x,\n    int tile_size_y, size_t pixel_data_size, size_t num_attributes,\n    const EXRAttribute *attributes, size_t num_channels,\n    const EXRChannelInfo *channels,\n    const std::vector<size_t> &channel_offset_list) {\n  assert(tile_offset_x * tile_size_x < data_width);\n  assert(tile_offset_y * tile_size_y < data_height);\n\n  // Compute actual image size in a tile.\n  if ((tile_offset_x + 1) * tile_size_x >= data_width) {\n    (*width) = data_width - (tile_offset_x * tile_size_x);\n  } else {\n    (*width) = tile_size_x;\n  }\n\n  if ((tile_offset_y + 1) * tile_size_y >= data_height) {\n    (*height) = data_height - (tile_offset_y * tile_size_y);\n  } else {\n    (*height) = tile_size_y;\n  }\n\n  // Image size = tile size.\n  DecodePixelData(out_images, requested_pixel_types, data_ptr, data_len,\n                  compression_type, line_order, (*width), tile_size_y,\n                  /* stride */ tile_size_x, /* y */ 0, /* line_no */ 0,\n                  (*height), pixel_data_size, num_attributes, attributes,\n                  num_channels, channels, channel_offset_list);\n}\n\nstatic bool ComputeChannelLayout(std::vector<size_t> *channel_offset_list,\n                                 int *pixel_data_size, size_t *channel_offset,\n                                 int num_channels,\n                                 const EXRChannelInfo *channels) {\n  channel_offset_list->resize(static_cast<size_t>(num_channels));\n\n  (*pixel_data_size) = 0;\n  (*channel_offset) = 0;\n\n  for (size_t c = 0; c < static_cast<size_t>(num_channels); c++) {\n    (*channel_offset_list)[c] = (*channel_offset);\n    if (channels[c].pixel_type == TINYEXR_PIXELTYPE_HALF) {\n      (*pixel_data_size) += sizeof(unsigned short);\n      (*channel_offset) += sizeof(unsigned short);\n    } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT) {\n      (*pixel_data_size) += sizeof(float);\n      (*channel_offset) += sizeof(float);\n    } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_UINT) {\n      (*pixel_data_size) += sizeof(unsigned int);\n      (*channel_offset) += sizeof(unsigned int);\n    } else {\n      // ???\n      return false;\n    }\n  }\n  return true;\n}\n\nstatic unsigned char **AllocateImage(int num_channels,\n                                     const EXRChannelInfo *channels,\n                                     const int *requested_pixel_types,\n                                     int data_width, int data_height) {\n  unsigned char **images =\n      reinterpret_cast<unsigned char **>(static_cast<float **>(\n          malloc(sizeof(float *) * static_cast<size_t>(num_channels))));\n\n  for (size_t c = 0; c < static_cast<size_t>(num_channels); c++) {\n    size_t data_len =\n        static_cast<size_t>(data_width) * static_cast<size_t>(data_height);\n    if (channels[c].pixel_type == TINYEXR_PIXELTYPE_HALF) {\n      // pixel_data_size += sizeof(unsigned short);\n      // channel_offset += sizeof(unsigned short);\n      // Alloc internal image for half type.\n      if (requested_pixel_types[c] == TINYEXR_PIXELTYPE_HALF) {\n        images[c] =\n            reinterpret_cast<unsigned char *>(static_cast<unsigned short *>(\n                malloc(sizeof(unsigned short) * data_len)));\n      } else if (requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT) {\n        images[c] = reinterpret_cast<unsigned char *>(\n            static_cast<float *>(malloc(sizeof(float) * data_len)));\n      } else {\n        assert(0);\n      }\n    } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT) {\n      // pixel_data_size += sizeof(float);\n      // channel_offset += sizeof(float);\n      images[c] = reinterpret_cast<unsigned char *>(\n          static_cast<float *>(malloc(sizeof(float) * data_len)));\n    } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_UINT) {\n      // pixel_data_size += sizeof(unsigned int);\n      // channel_offset += sizeof(unsigned int);\n      images[c] = reinterpret_cast<unsigned char *>(\n          static_cast<unsigned int *>(malloc(sizeof(unsigned int) * data_len)));\n    } else {\n      assert(0);\n    }\n  }\n\n  return images;\n}\n\nstatic int ParseEXRHeader(HeaderInfo *info, bool *empty_header,\n                          const EXRVersion *version, std::string *err,\n                          const unsigned char *buf, size_t size) {\n  const char *marker = reinterpret_cast<const char *>(&buf[0]);\n\n  if (empty_header) {\n    (*empty_header) = false;\n  }\n\n  if (version->multipart) {\n    if (size > 0 && marker[0] == '\\0') {\n      // End of header list.\n      if (empty_header) {\n        (*empty_header) = true;\n      }\n      return TINYEXR_SUCCESS;\n    }\n  }\n\n  // According to the spec, the header of every OpenEXR file must contain at\n  // least the following attributes:\n  //\n  // channels chlist\n  // compression compression\n  // dataWindow box2i\n  // displayWindow box2i\n  // lineOrder lineOrder\n  // pixelAspectRatio float\n  // screenWindowCenter v2f\n  // screenWindowWidth float\n  bool has_channels = false;\n  bool has_compression = false;\n  bool has_data_window = false;\n  bool has_display_window = false;\n  bool has_line_order = false;\n  bool has_pixel_aspect_ratio = false;\n  bool has_screen_window_center = false;\n  bool has_screen_window_width = false;\n\n  info->data_window[0] = 0;\n  info->data_window[1] = 0;\n  info->data_window[2] = 0;\n  info->data_window[3] = 0;\n  info->line_order = 0;  // @fixme\n  info->display_window[0] = 0;\n  info->display_window[1] = 0;\n  info->display_window[2] = 0;\n  info->display_window[3] = 0;\n  info->screen_window_center[0] = 0.0f;\n  info->screen_window_center[1] = 0.0f;\n  info->screen_window_width = -1.0f;\n  info->pixel_aspect_ratio = -1.0f;\n\n  info->tile_size_x = -1;\n  info->tile_size_y = -1;\n  info->tile_level_mode = -1;\n  info->tile_rounding_mode = -1;\n\n  info->attributes.clear();\n\n  // Read attributes\n  size_t orig_size = size;\n  for (size_t nattr = 0; nattr < TINYEXR_MAX_HEADER_ATTRIBUTES; nattr++) {\n    if (0 == size) {\n      if (err) {\n        (*err) += \"Insufficient data size for attributes.\\n\";\n      }\n      return TINYEXR_ERROR_INVALID_DATA;\n    } else if (marker[0] == '\\0') {\n      size--;\n      break;\n    }\n\n    std::string attr_name;\n    std::string attr_type;\n    std::vector<unsigned char> data;\n    size_t marker_size;\n    if (!tinyexr::ReadAttribute(&attr_name, &attr_type, &data, &marker_size,\n                                marker, size)) {\n      if (err) {\n        (*err) += \"Failed to read attribute.\\n\";\n      }\n      return TINYEXR_ERROR_INVALID_DATA;\n    }\n    marker += marker_size;\n    size -= marker_size;\n\n    if (version->tiled && attr_name.compare(\"tiles\") == 0) {\n      unsigned int x_size, y_size;\n      unsigned char tile_mode;\n      assert(data.size() == 9);\n      memcpy(&x_size, &data.at(0), sizeof(int));\n      memcpy(&y_size, &data.at(4), sizeof(int));\n      tile_mode = data[8];\n      tinyexr::swap4(&x_size);\n      tinyexr::swap4(&y_size);\n\n      info->tile_size_x = static_cast<int>(x_size);\n      info->tile_size_y = static_cast<int>(y_size);\n\n      // mode = levelMode + roundingMode * 16\n      info->tile_level_mode = tile_mode & 0x3;\n      info->tile_rounding_mode = (tile_mode >> 4) & 0x1;\n\n    } else if (attr_name.compare(\"compression\") == 0) {\n      bool ok = false;\n      if (data[0] < TINYEXR_COMPRESSIONTYPE_PIZ) {\n        ok = true;\n      }\n\n      if (data[0] == TINYEXR_COMPRESSIONTYPE_PIZ) {\n#if TINYEXR_USE_PIZ\n        ok = true;\n#else\n        if (err) {\n          (*err) = \"PIZ compression is not supported.\";\n        }\n        return TINYEXR_ERROR_UNSUPPORTED_FORMAT;\n#endif\n      }\n\n      if (data[0] == TINYEXR_COMPRESSIONTYPE_ZFP) {\n#if TINYEXR_USE_ZFP\n        ok = true;\n#else\n        if (err) {\n          (*err) = \"ZFP compression is not supported.\";\n        }\n        return TINYEXR_ERROR_UNSUPPORTED_FORMAT;\n#endif\n      }\n\n      if (!ok) {\n        if (err) {\n          (*err) = \"Unknown compression type.\";\n        }\n        return TINYEXR_ERROR_UNSUPPORTED_FORMAT;\n      }\n\n      info->compression_type = static_cast<int>(data[0]);\n      has_compression = true;\n\n    } else if (attr_name.compare(\"channels\") == 0) {\n      // name: zero-terminated string, from 1 to 255 bytes long\n      // pixel type: int, possible values are: UINT = 0 HALF = 1 FLOAT = 2\n      // pLinear: unsigned char, possible values are 0 and 1\n      // reserved: three chars, should be zero\n      // xSampling: int\n      // ySampling: int\n\n      if (!ReadChannelInfo(info->channels, data)) {\n        if (err) {\n          (*err) += \"Failed to parse channel info.\\n\";\n        }\n        return TINYEXR_ERROR_INVALID_DATA;\n      }\n\n      if (info->channels.size() < 1) {\n        if (err) {\n          (*err) += \"# of channels is zero.\\n\";\n        }\n        return TINYEXR_ERROR_INVALID_DATA;\n      }\n\n      has_channels = true;\n\n    } else if (attr_name.compare(\"dataWindow\") == 0) {\n      if (data.size() >= 16) {\n        memcpy(&info->data_window[0], &data.at(0), sizeof(int));\n        memcpy(&info->data_window[1], &data.at(4), sizeof(int));\n        memcpy(&info->data_window[2], &data.at(8), sizeof(int));\n        memcpy(&info->data_window[3], &data.at(12), sizeof(int));\n        tinyexr::swap4(reinterpret_cast<unsigned int *>(&info->data_window[0]));\n        tinyexr::swap4(reinterpret_cast<unsigned int *>(&info->data_window[1]));\n        tinyexr::swap4(reinterpret_cast<unsigned int *>(&info->data_window[2]));\n        tinyexr::swap4(reinterpret_cast<unsigned int *>(&info->data_window[3]));\n        has_data_window = true;\n      }\n    } else if (attr_name.compare(\"displayWindow\") == 0) {\n      if (data.size() >= 16) {\n        memcpy(&info->display_window[0], &data.at(0), sizeof(int));\n        memcpy(&info->display_window[1], &data.at(4), sizeof(int));\n        memcpy(&info->display_window[2], &data.at(8), sizeof(int));\n        memcpy(&info->display_window[3], &data.at(12), sizeof(int));\n        tinyexr::swap4(\n            reinterpret_cast<unsigned int *>(&info->display_window[0]));\n        tinyexr::swap4(\n            reinterpret_cast<unsigned int *>(&info->display_window[1]));\n        tinyexr::swap4(\n            reinterpret_cast<unsigned int *>(&info->display_window[2]));\n        tinyexr::swap4(\n            reinterpret_cast<unsigned int *>(&info->display_window[3]));\n\n        has_display_window = true;\n      }\n    } else if (attr_name.compare(\"lineOrder\") == 0) {\n      if (data.size() >= 1) {\n        info->line_order = static_cast<int>(data[0]);\n        has_line_order = true;\n      }\n    } else if (attr_name.compare(\"pixelAspectRatio\") == 0) {\n      if (data.size() >= sizeof(float)) {\n        memcpy(&info->pixel_aspect_ratio, &data.at(0), sizeof(float));\n        tinyexr::swap4(\n            reinterpret_cast<unsigned int *>(&info->pixel_aspect_ratio));\n        has_pixel_aspect_ratio = true;\n      }\n    } else if (attr_name.compare(\"screenWindowCenter\") == 0) {\n      if (data.size() >= 8) {\n        memcpy(&info->screen_window_center[0], &data.at(0), sizeof(float));\n        memcpy(&info->screen_window_center[1], &data.at(4), sizeof(float));\n        tinyexr::swap4(\n            reinterpret_cast<unsigned int *>(&info->screen_window_center[0]));\n        tinyexr::swap4(\n            reinterpret_cast<unsigned int *>(&info->screen_window_center[1]));\n        has_screen_window_center = true;\n      }\n    } else if (attr_name.compare(\"screenWindowWidth\") == 0) {\n      if (data.size() >= sizeof(float)) {\n        memcpy(&info->screen_window_width, &data.at(0), sizeof(float));\n        tinyexr::swap4(\n            reinterpret_cast<unsigned int *>(&info->screen_window_width));\n\n        has_screen_window_width = true;\n      }\n    } else if (attr_name.compare(\"chunkCount\") == 0) {\n      if (data.size() >= sizeof(int)) {\n        memcpy(&info->chunk_count, &data.at(0), sizeof(int));\n        tinyexr::swap4(reinterpret_cast<unsigned int *>(&info->chunk_count));\n      }\n    } else {\n      // Custom attribute(up to TINYEXR_MAX_CUSTOM_ATTRIBUTES)\n      if (info->attributes.size() < TINYEXR_MAX_CUSTOM_ATTRIBUTES) {\n        EXRAttribute attrib;\n#ifdef _MSC_VER\n        strncpy_s(attrib.name, attr_name.c_str(), 255);\n        strncpy_s(attrib.type, attr_type.c_str(), 255);\n#else\n        strncpy(attrib.name, attr_name.c_str(), 255);\n        strncpy(attrib.type, attr_type.c_str(), 255);\n#endif\n        attrib.name[255] = '\\0';\n        attrib.type[255] = '\\0';\n        attrib.size = static_cast<int>(data.size());\n        attrib.value = static_cast<unsigned char *>(malloc(data.size()));\n        memcpy(reinterpret_cast<char *>(attrib.value), &data.at(0),\n               data.size());\n        info->attributes.push_back(attrib);\n      }\n    }\n  }\n\n  // Check if required attributes exist\n  {\n    std::stringstream ss_err;\n\n    if (!has_compression) {\n      ss_err << \"\\\"compression\\\" attribute not found in the header.\"\n             << std::endl;\n    }\n\n    if (!has_channels) {\n      ss_err << \"\\\"channels\\\" attribute not found in the header.\" << std::endl;\n    }\n\n    if (!has_line_order) {\n      ss_err << \"\\\"lineOrder\\\" attribute not found in the header.\" << std::endl;\n    }\n\n    if (!has_display_window) {\n      ss_err << \"\\\"displayWindow\\\" attribute not found in the header.\"\n             << std::endl;\n    }\n\n    if (!has_data_window) {\n      ss_err << \"\\\"dataWindow\\\" attribute not found in the header or invalid.\"\n             << std::endl;\n    }\n\n    if (!has_pixel_aspect_ratio) {\n      ss_err << \"\\\"pixelAspectRatio\\\" attribute not found in the header.\"\n             << std::endl;\n    }\n\n    if (!has_screen_window_width) {\n      ss_err << \"\\\"screenWindowWidth\\\" attribute not found in the header.\"\n             << std::endl;\n    }\n\n    if (!has_screen_window_center) {\n      ss_err << \"\\\"screenWindowCenter\\\" attribute not found in the header.\"\n             << std::endl;\n    }\n\n    if (!(ss_err.str().empty())) {\n      if (err) {\n        (*err) += ss_err.str();\n      }\n      return TINYEXR_ERROR_INVALID_HEADER;\n    }\n  }\n\n  info->header_len = static_cast<unsigned int>(orig_size - size);\n\n  return TINYEXR_SUCCESS;\n}\n\n// C++ HeaderInfo to C EXRHeader conversion.\nstatic void ConvertHeader(EXRHeader *exr_header, const HeaderInfo &info) {\n  exr_header->pixel_aspect_ratio = info.pixel_aspect_ratio;\n  exr_header->screen_window_center[0] = info.screen_window_center[0];\n  exr_header->screen_window_center[1] = info.screen_window_center[1];\n  exr_header->screen_window_width = info.screen_window_width;\n  exr_header->chunk_count = info.chunk_count;\n  exr_header->display_window[0] = info.display_window[0];\n  exr_header->display_window[1] = info.display_window[1];\n  exr_header->display_window[2] = info.display_window[2];\n  exr_header->display_window[3] = info.display_window[3];\n  exr_header->data_window[0] = info.data_window[0];\n  exr_header->data_window[1] = info.data_window[1];\n  exr_header->data_window[2] = info.data_window[2];\n  exr_header->data_window[3] = info.data_window[3];\n  exr_header->line_order = info.line_order;\n  exr_header->compression_type = info.compression_type;\n\n  exr_header->tile_size_x = info.tile_size_x;\n  exr_header->tile_size_y = info.tile_size_y;\n  exr_header->tile_level_mode = info.tile_level_mode;\n  exr_header->tile_rounding_mode = info.tile_rounding_mode;\n\n  exr_header->num_channels = static_cast<int>(info.channels.size());\n\n  exr_header->channels = static_cast<EXRChannelInfo *>(malloc(\n      sizeof(EXRChannelInfo) * static_cast<size_t>(exr_header->num_channels)));\n  for (size_t c = 0; c < static_cast<size_t>(exr_header->num_channels); c++) {\n#ifdef _MSC_VER\n    strncpy_s(exr_header->channels[c].name, info.channels[c].name.c_str(), 255);\n#else\n    strncpy(exr_header->channels[c].name, info.channels[c].name.c_str(), 255);\n#endif\n    // manually add '\\0' for safety.\n    exr_header->channels[c].name[255] = '\\0';\n\n    exr_header->channels[c].pixel_type = info.channels[c].pixel_type;\n    exr_header->channels[c].p_linear = info.channels[c].p_linear;\n    exr_header->channels[c].x_sampling = info.channels[c].x_sampling;\n    exr_header->channels[c].y_sampling = info.channels[c].y_sampling;\n  }\n\n  exr_header->pixel_types = static_cast<int *>(\n      malloc(sizeof(int) * static_cast<size_t>(exr_header->num_channels)));\n  for (size_t c = 0; c < static_cast<size_t>(exr_header->num_channels); c++) {\n    exr_header->pixel_types[c] = info.channels[c].pixel_type;\n  }\n\n  // Initially fill with values of `pixel_types`\n  exr_header->requested_pixel_types = static_cast<int *>(\n      malloc(sizeof(int) * static_cast<size_t>(exr_header->num_channels)));\n  for (size_t c = 0; c < static_cast<size_t>(exr_header->num_channels); c++) {\n    exr_header->requested_pixel_types[c] = info.channels[c].pixel_type;\n  }\n\n  exr_header->num_custom_attributes = static_cast<int>(info.attributes.size());\n\n  if (exr_header->num_custom_attributes > 0) {\n    // TODO(syoyo): Report warning when # of attributes exceeds\n    // `TINYEXR_MAX_CUSTOM_ATTRIBUTES`\n    if (exr_header->num_custom_attributes > TINYEXR_MAX_CUSTOM_ATTRIBUTES) {\n      exr_header->num_custom_attributes = TINYEXR_MAX_CUSTOM_ATTRIBUTES;\n    }\n\n    exr_header->custom_attributes = static_cast<EXRAttribute *>(malloc(\n        sizeof(EXRAttribute) * size_t(exr_header->num_custom_attributes)));\n\n    for (size_t i = 0; i < info.attributes.size(); i++) {\n      memcpy(exr_header->custom_attributes[i].name, info.attributes[i].name,\n             256);\n      memcpy(exr_header->custom_attributes[i].type, info.attributes[i].type,\n             256);\n      exr_header->custom_attributes[i].size = info.attributes[i].size;\n      // Just copy poiner\n      exr_header->custom_attributes[i].value = info.attributes[i].value;\n    }\n\n  } else {\n    exr_header->custom_attributes = NULL;\n  }\n\n  exr_header->header_len = info.header_len;\n}\n\nstatic int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header,\n                       const std::vector<tinyexr::tinyexr_uint64> &offsets,\n                       const unsigned char *head, const size_t size,\n                       std::string *err) {\n  int num_channels = exr_header->num_channels;\n\n  int num_scanline_blocks = 1;\n  if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZIP) {\n    num_scanline_blocks = 16;\n  } else if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_PIZ) {\n    num_scanline_blocks = 32;\n  } else if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZFP) {\n    num_scanline_blocks = 16;\n  }\n\n  int data_width = exr_header->data_window[2] - exr_header->data_window[0] + 1;\n  int data_height = exr_header->data_window[3] - exr_header->data_window[1] + 1;\n\n  if ((data_width < 0) || (data_height < 0)) {\n    if (err) {\n      std::stringstream ss;\n      ss << \"Invalid data width or data height: \" << data_width << \", \"\n         << data_height << std::endl;\n      (*err) += ss.str();\n    }\n    return TINYEXR_ERROR_INVALID_DATA;\n  }\n\n  // Do not allow too large data_width and data_height. header invalid?\n  {\n    const int threshold = 1024 * 8192;  // heuristics\n    if ((data_width > threshold) || (data_height > threshold)) {\n      if (err) {\n        std::stringstream ss;\n        ss << \"data_with or data_height too large. data_width: \" << data_width\n           << \", \"\n           << \"data_height = \" << data_height << std::endl;\n        (*err) += ss.str();\n      }\n      return TINYEXR_ERROR_INVALID_DATA;\n    }\n  }\n\n  size_t num_blocks = offsets.size();\n\n  std::vector<size_t> channel_offset_list;\n  int pixel_data_size = 0;\n  size_t channel_offset = 0;\n  if (!tinyexr::ComputeChannelLayout(&channel_offset_list, &pixel_data_size,\n                                     &channel_offset, num_channels,\n                                     exr_header->channels)) {\n    if (err) {\n      (*err) += \"Failed to compute channel layout.\\n\";\n    }\n    return TINYEXR_ERROR_INVALID_DATA;\n  }\n\n  bool invalid_data = false;  // TODO(LTE): Use atomic lock for MT safety.\n\n  if (exr_header->tiled) {\n    // value check\n    if (exr_header->tile_size_x < 0) {\n      if (err) {\n        std::stringstream ss;\n        ss << \"Invalid tile size x : \" << exr_header->tile_size_x << \"\\n\";\n        (*err) += ss.str();\n      }\n      return TINYEXR_ERROR_INVALID_HEADER;\n    }\n\n    if (exr_header->tile_size_y < 0) {\n      if (err) {\n        std::stringstream ss;\n        ss << \"Invalid tile size y : \" << exr_header->tile_size_y << \"\\n\";\n        (*err) += ss.str();\n      }\n      return TINYEXR_ERROR_INVALID_HEADER;\n    }\n\n    size_t num_tiles = offsets.size();  // = # of blocks\n\n    exr_image->tiles = static_cast<EXRTile *>(\n        calloc(sizeof(EXRTile), static_cast<size_t>(num_tiles)));\n\n    for (size_t tile_idx = 0; tile_idx < num_tiles; tile_idx++) {\n      // Allocate memory for each tile.\n      exr_image->tiles[tile_idx].images = tinyexr::AllocateImage(\n          num_channels, exr_header->channels, exr_header->requested_pixel_types,\n          exr_header->tile_size_x, exr_header->tile_size_y);\n\n      // 16 byte: tile coordinates\n      // 4 byte : data size\n      // ~      : data(uncompressed or compressed)\n      if (offsets[tile_idx] + sizeof(int) * 5 > size) {\n        if (err) {\n          (*err) += \"Insufficient data size.\\n\";\n        }\n        return TINYEXR_ERROR_INVALID_DATA;\n      }\n\n      size_t data_size = size_t(size - (offsets[tile_idx] + sizeof(int) * 5));\n      const unsigned char *data_ptr =\n          reinterpret_cast<const unsigned char *>(head + offsets[tile_idx]);\n\n      int tile_coordinates[4];\n      memcpy(tile_coordinates, data_ptr, sizeof(int) * 4);\n      tinyexr::swap4(reinterpret_cast<unsigned int *>(&tile_coordinates[0]));\n      tinyexr::swap4(reinterpret_cast<unsigned int *>(&tile_coordinates[1]));\n      tinyexr::swap4(reinterpret_cast<unsigned int *>(&tile_coordinates[2]));\n      tinyexr::swap4(reinterpret_cast<unsigned int *>(&tile_coordinates[3]));\n\n      // @todo{ LoD }\n      if (tile_coordinates[2] != 0) {\n        return TINYEXR_ERROR_UNSUPPORTED_FEATURE;\n      }\n      if (tile_coordinates[3] != 0) {\n        return TINYEXR_ERROR_UNSUPPORTED_FEATURE;\n      }\n\n      int data_len;\n      memcpy(&data_len, data_ptr + 16,\n             sizeof(int));  // 16 = sizeof(tile_coordinates)\n      tinyexr::swap4(reinterpret_cast<unsigned int *>(&data_len));\n\n      if (data_len < 4 || size_t(data_len) > data_size) {\n        if (err) {\n          (*err) += \"Insufficient data length.\\n\";\n        }\n        return TINYEXR_ERROR_INVALID_DATA;\n      }\n\n      // Move to data addr: 20 = 16 + 4;\n      data_ptr += 20;\n\n      tinyexr::DecodeTiledPixelData(\n          exr_image->tiles[tile_idx].images,\n          &(exr_image->tiles[tile_idx].width),\n          &(exr_image->tiles[tile_idx].height),\n          exr_header->requested_pixel_types, data_ptr,\n          static_cast<size_t>(data_len), exr_header->compression_type,\n          exr_header->line_order, data_width, data_height, tile_coordinates[0],\n          tile_coordinates[1], exr_header->tile_size_x, exr_header->tile_size_y,\n          static_cast<size_t>(pixel_data_size),\n          static_cast<size_t>(exr_header->num_custom_attributes),\n          exr_header->custom_attributes,\n          static_cast<size_t>(exr_header->num_channels), exr_header->channels,\n          channel_offset_list);\n\n      exr_image->tiles[tile_idx].offset_x = tile_coordinates[0];\n      exr_image->tiles[tile_idx].offset_y = tile_coordinates[1];\n      exr_image->tiles[tile_idx].level_x = tile_coordinates[2];\n      exr_image->tiles[tile_idx].level_y = tile_coordinates[3];\n\n      exr_image->num_tiles = static_cast<int>(num_tiles);\n    }\n  } else {  // scanline format\n\n    // Don't allow too large image(256GB * pixel_data_size or more). Workaround\n    // for #104.\n    size_t total_data_len =\n        size_t(data_width) * size_t(data_height) * size_t(num_channels);\n    if ((total_data_len == 0) || (total_data_len >= 0x4000000000)) {\n      if (err) {\n        std::stringstream ss;\n        ss << \"Image data size is zero or too large: width = \" << data_width\n           << \", height = \" << data_height << \", channels = \" << num_channels\n           << std::endl;\n        (*err) += ss.str();\n      }\n      return TINYEXR_ERROR_INVALID_DATA;\n    }\n\n    exr_image->images = tinyexr::AllocateImage(\n        num_channels, exr_header->channels, exr_header->requested_pixel_types,\n        data_width, data_height);\n\n#ifdef _OPENMP\n#pragma omp parallel for\n#endif\n    for (int y = 0; y < static_cast<int>(num_blocks); y++) {\n      size_t y_idx = static_cast<size_t>(y);\n\n      if (offsets[y_idx] + sizeof(int) * 2 > size) {\n        invalid_data = true;\n      } else {\n        // 4 byte: scan line\n        // 4 byte: data size\n        // ~     : pixel data(uncompressed or compressed)\n        size_t data_size = size_t(size - (offsets[y_idx] + sizeof(int) * 2));\n        const unsigned char *data_ptr =\n            reinterpret_cast<const unsigned char *>(head + offsets[y_idx]);\n\n        int line_no;\n        memcpy(&line_no, data_ptr, sizeof(int));\n        int data_len;\n        memcpy(&data_len, data_ptr + 4, sizeof(int));\n        tinyexr::swap4(reinterpret_cast<unsigned int *>(&line_no));\n        tinyexr::swap4(reinterpret_cast<unsigned int *>(&data_len));\n\n        if (size_t(data_len) > data_size) {\n          invalid_data = true;\n        } else if (data_len == 0) {\n          // TODO(syoyo): May be ok to raise the threshold for example `data_len\n          // < 4`\n          invalid_data = true;\n        } else {\n          // line_no may be negative.\n          int end_line_no = (std::min)(line_no + num_scanline_blocks,\n                                       (exr_header->data_window[3] + 1));\n\n          int num_lines = end_line_no - line_no;\n\n          if (num_lines <= 0) {\n            invalid_data = true;\n          } else {\n            // Move to data addr: 8 = 4 + 4;\n            data_ptr += 8;\n\n            // Adjust line_no with data_window.bmin.y\n\n            // overflow check\n            tinyexr_int64 lno = static_cast<tinyexr_int64>(line_no) - static_cast<tinyexr_int64>(exr_header->data_window[1]);\n            if (lno > std::numeric_limits<int>::max()) {\n              line_no = -1; // invalid\n            } else if (lno < -std::numeric_limits<int>::max()) {\n              line_no = -1; // invalid\n            } else {\n              line_no -= exr_header->data_window[1];\n            }\n\n            if (line_no < 0) {\n              invalid_data = true;\n            } else {\n              if (!tinyexr::DecodePixelData(\n                      exr_image->images, exr_header->requested_pixel_types,\n                      data_ptr, static_cast<size_t>(data_len),\n                      exr_header->compression_type, exr_header->line_order,\n                      data_width, data_height, data_width, y, line_no,\n                      num_lines, static_cast<size_t>(pixel_data_size),\n                      static_cast<size_t>(exr_header->num_custom_attributes),\n                      exr_header->custom_attributes,\n                      static_cast<size_t>(exr_header->num_channels),\n                      exr_header->channels, channel_offset_list)) {\n                invalid_data = true;\n              }\n            }\n          }\n        }\n      }\n    }  // omp parallel\n  }\n\n  if (invalid_data) {\n    if (err) {\n      std::stringstream ss;\n      (*err) += \"Invalid data found when decoding pixels.\\n\";\n    }\n    return TINYEXR_ERROR_INVALID_DATA;\n  }\n\n  // Overwrite `pixel_type` with `requested_pixel_type`.\n  {\n    for (int c = 0; c < exr_header->num_channels; c++) {\n      exr_header->pixel_types[c] = exr_header->requested_pixel_types[c];\n    }\n  }\n\n  {\n    exr_image->num_channels = num_channels;\n\n    exr_image->width = data_width;\n    exr_image->height = data_height;\n  }\n\n  return TINYEXR_SUCCESS;\n}\n\nstatic bool ReconstructLineOffsets(\n    std::vector<tinyexr::tinyexr_uint64> *offsets, size_t n,\n    const unsigned char *head, const unsigned char *marker, const size_t size) {\n  assert(head < marker);\n  assert(offsets->size() == n);\n\n  for (size_t i = 0; i < n; i++) {\n    size_t offset = static_cast<size_t>(marker - head);\n    // Offset should not exceed whole EXR file/data size.\n    if ((offset + sizeof(tinyexr::tinyexr_uint64)) >= size) {\n      return false;\n    }\n\n    int y;\n    unsigned int data_len;\n\n    memcpy(&y, marker, sizeof(int));\n    memcpy(&data_len, marker + 4, sizeof(unsigned int));\n\n    if (data_len >= size) {\n      return false;\n    }\n\n    tinyexr::swap4(reinterpret_cast<unsigned int *>(&y));\n    tinyexr::swap4(reinterpret_cast<unsigned int *>(&data_len));\n\n    (*offsets)[i] = offset;\n\n    marker += data_len + 8;  // 8 = 4 bytes(y) + 4 bytes(data_len)\n  }\n\n  return true;\n}\n\nstatic int DecodeEXRImage(EXRImage *exr_image, const EXRHeader *exr_header,\n                          const unsigned char *head,\n                          const unsigned char *marker, const size_t size,\n                          const char **err) {\n  if (exr_image == NULL || exr_header == NULL || head == NULL ||\n      marker == NULL || (size <= tinyexr::kEXRVersionSize)) {\n    tinyexr::SetErrorMessage(\"Invalid argument for DecodeEXRImage().\", err);\n    return TINYEXR_ERROR_INVALID_ARGUMENT;\n  }\n\n  int num_scanline_blocks = 1;\n  if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZIP) {\n    num_scanline_blocks = 16;\n  } else if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_PIZ) {\n    num_scanline_blocks = 32;\n  } else if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZFP) {\n    num_scanline_blocks = 16;\n  }\n\n  int data_width = exr_header->data_window[2] - exr_header->data_window[0];\n  if (data_width >= std::numeric_limits<int>::max()) {\n    // Issue 63\n    tinyexr::SetErrorMessage(\"Invalid data width value\", err);\n    return TINYEXR_ERROR_INVALID_DATA;\n  }\n  data_width++;\n\n  int data_height = exr_header->data_window[3] - exr_header->data_window[1];\n  if (data_height >= std::numeric_limits<int>::max()) {\n    tinyexr::SetErrorMessage(\"Invalid data height value\", err);\n    return TINYEXR_ERROR_INVALID_DATA;\n  }\n  data_height++;\n\n  if ((data_width < 0) || (data_height < 0)) {\n    tinyexr::SetErrorMessage(\"data width or data height is negative.\", err);\n    return TINYEXR_ERROR_INVALID_DATA;\n  }\n\n  // Do not allow too large data_width and data_height. header invalid?\n  {\n    const int threshold = 1024 * 8192;  // heuristics\n    if (data_width > threshold) {\n      tinyexr::SetErrorMessage(\"data width too large.\", err);\n      return TINYEXR_ERROR_INVALID_DATA;\n    }\n    if (data_height > threshold) {\n      tinyexr::SetErrorMessage(\"data height too large.\", err);\n      return TINYEXR_ERROR_INVALID_DATA;\n    }\n  }\n\n  // Read offset tables.\n  size_t num_blocks = 0;\n\n  if (exr_header->chunk_count > 0) {\n    // Use `chunkCount` attribute.\n    num_blocks = static_cast<size_t>(exr_header->chunk_count);\n  } else if (exr_header->tiled) {\n    // @todo { LoD }\n    size_t num_x_tiles = static_cast<size_t>(data_width) /\n                         static_cast<size_t>(exr_header->tile_size_x);\n    if (num_x_tiles * static_cast<size_t>(exr_header->tile_size_x) <\n        static_cast<size_t>(data_width)) {\n      num_x_tiles++;\n    }\n    size_t num_y_tiles = static_cast<size_t>(data_height) /\n                         static_cast<size_t>(exr_header->tile_size_y);\n    if (num_y_tiles * static_cast<size_t>(exr_header->tile_size_y) <\n        static_cast<size_t>(data_height)) {\n      num_y_tiles++;\n    }\n\n    num_blocks = num_x_tiles * num_y_tiles;\n  } else {\n    num_blocks = static_cast<size_t>(data_height) /\n                 static_cast<size_t>(num_scanline_blocks);\n    if (num_blocks * static_cast<size_t>(num_scanline_blocks) <\n        static_cast<size_t>(data_height)) {\n      num_blocks++;\n    }\n  }\n\n  std::vector<tinyexr::tinyexr_uint64> offsets(num_blocks);\n\n  for (size_t y = 0; y < num_blocks; y++) {\n    tinyexr::tinyexr_uint64 offset;\n    // Issue #81\n    if ((marker + sizeof(tinyexr_uint64)) >= (head + size)) {\n      tinyexr::SetErrorMessage(\"Insufficient data size in offset table.\", err);\n      return TINYEXR_ERROR_INVALID_DATA;\n    }\n\n    memcpy(&offset, marker, sizeof(tinyexr::tinyexr_uint64));\n    tinyexr::swap8(&offset);\n    if (offset >= size) {\n      tinyexr::SetErrorMessage(\"Invalid offset value in DecodeEXRImage.\", err);\n      return TINYEXR_ERROR_INVALID_DATA;\n    }\n    marker += sizeof(tinyexr::tinyexr_uint64);  // = 8\n    offsets[y] = offset;\n  }\n\n  // If line offsets are invalid, we try to reconstruct it.\n  // See OpenEXR/IlmImf/ImfScanLineInputFile.cpp::readLineOffsets() for details.\n  for (size_t y = 0; y < num_blocks; y++) {\n    if (offsets[y] <= 0) {\n      // TODO(syoyo) Report as warning?\n      // if (err) {\n      //  stringstream ss;\n      //  ss << \"Incomplete lineOffsets.\" << std::endl;\n      //  (*err) += ss.str();\n      //}\n      bool ret =\n          ReconstructLineOffsets(&offsets, num_blocks, head, marker, size);\n      if (ret) {\n        // OK\n        break;\n      } else {\n        tinyexr::SetErrorMessage(\n            \"Cannot reconstruct lineOffset table in DecodeEXRImage.\", err);\n        return TINYEXR_ERROR_INVALID_DATA;\n      }\n    }\n  }\n\n  {\n    std::string e;\n    int ret = DecodeChunk(exr_image, exr_header, offsets, head, size, &e);\n\n    if (ret != TINYEXR_SUCCESS) {\n      if (!e.empty()) {\n        tinyexr::SetErrorMessage(e, err);\n      }\n\n      // release memory(if exists)\n      if ((exr_header->num_channels > 0) && exr_image && exr_image->images) {\n        for (size_t c = 0; c < size_t(exr_header->num_channels); c++) {\n          if (exr_image->images[c]) {\n            free(exr_image->images[c]);\n            exr_image->images[c] = NULL;\n          }\n        }\n        free(exr_image->images);\n        exr_image->images = NULL;\n      }\n    }\n\n    return ret;\n  }\n}\n\n}  // namespace tinyexr\n\nint LoadEXR(float **out_rgba, int *width, int *height, const char *filename,\n            const char **err) {\n  if (out_rgba == NULL) {\n    tinyexr::SetErrorMessage(\"Invalid argument for LoadEXR()\", err);\n    return TINYEXR_ERROR_INVALID_ARGUMENT;\n  }\n\n  EXRVersion exr_version;\n  EXRImage exr_image;\n  EXRHeader exr_header;\n  InitEXRHeader(&exr_header);\n  InitEXRImage(&exr_image);\n\n  {\n    int ret = ParseEXRVersionFromFile(&exr_version, filename);\n    if (ret != TINYEXR_SUCCESS) {\n      tinyexr::SetErrorMessage(\"Invalid EXR header.\", err);\n      return ret;\n    }\n\n    if (exr_version.multipart || exr_version.non_image) {\n      tinyexr::SetErrorMessage(\n          \"Loading multipart or DeepImage is not supported  in LoadEXR() API\",\n          err);\n      return TINYEXR_ERROR_INVALID_DATA;  // @fixme.\n    }\n  }\n\n  {\n    int ret = ParseEXRHeaderFromFile(&exr_header, &exr_version, filename, err);\n    if (ret != TINYEXR_SUCCESS) {\n      FreeEXRHeader(&exr_header);\n      return ret;\n    }\n  }\n\n  // Read HALF channel as FLOAT.\n  for (int i = 0; i < exr_header.num_channels; i++) {\n    if (exr_header.pixel_types[i] == TINYEXR_PIXELTYPE_HALF) {\n      exr_header.requested_pixel_types[i] = TINYEXR_PIXELTYPE_FLOAT;\n    }\n  }\n\n  {\n    int ret = LoadEXRImageFromFile(&exr_image, &exr_header, filename, err);\n    if (ret != TINYEXR_SUCCESS) {\n      FreeEXRHeader(&exr_header);\n      return ret;\n    }\n  }\n\n  // RGBA\n  int idxR = -1;\n  int idxG = -1;\n  int idxB = -1;\n  int idxA = -1;\n  for (int c = 0; c < exr_header.num_channels; c++) {\n    if (strcmp(exr_header.channels[c].name, \"R\") == 0) {\n      idxR = c;\n    } else if (strcmp(exr_header.channels[c].name, \"G\") == 0) {\n      idxG = c;\n    } else if (strcmp(exr_header.channels[c].name, \"B\") == 0) {\n      idxB = c;\n    } else if (strcmp(exr_header.channels[c].name, \"A\") == 0) {\n      idxA = c;\n    }\n  }\n\n  if (exr_header.num_channels == 1) {\n    // Grayscale channel only.\n\n    (*out_rgba) = reinterpret_cast<float *>(\n        malloc(4 * sizeof(float) * static_cast<size_t>(exr_image.width) *\n               static_cast<size_t>(exr_image.height)));\n\n    if (exr_header.tiled) {\n      for (int it = 0; it < exr_image.num_tiles; it++) {\n        for (int j = 0; j < exr_header.tile_size_y; j++) {\n          for (int i = 0; i < exr_header.tile_size_x; i++) {\n            const int ii =\n                exr_image.tiles[it].offset_x * exr_header.tile_size_x + i;\n            const int jj =\n                exr_image.tiles[it].offset_y * exr_header.tile_size_y + j;\n            const int idx = ii + jj * exr_image.width;\n\n            // out of region check.\n            if (ii >= exr_image.width) {\n              continue;\n            }\n            if (jj >= exr_image.height) {\n              continue;\n            }\n            const int srcIdx = i + j * exr_header.tile_size_x;\n            unsigned char **src = exr_image.tiles[it].images;\n            (*out_rgba)[4 * idx + 0] =\n                reinterpret_cast<float **>(src)[0][srcIdx];\n            (*out_rgba)[4 * idx + 1] =\n                reinterpret_cast<float **>(src)[0][srcIdx];\n            (*out_rgba)[4 * idx + 2] =\n                reinterpret_cast<float **>(src)[0][srcIdx];\n            (*out_rgba)[4 * idx + 3] =\n                reinterpret_cast<float **>(src)[0][srcIdx];\n          }\n        }\n      }\n    } else {\n      for (int i = 0; i < exr_image.width * exr_image.height; i++) {\n        const float val = reinterpret_cast<float **>(exr_image.images)[0][i];\n        (*out_rgba)[4 * i + 0] = val;\n        (*out_rgba)[4 * i + 1] = val;\n        (*out_rgba)[4 * i + 2] = val;\n        (*out_rgba)[4 * i + 3] = val;\n      }\n    }\n  } else {\n    // Assume RGB(A)\n\n    if (idxR == -1) {\n      tinyexr::SetErrorMessage(\"R channel not found\", err);\n\n      // @todo { free exr_image }\n      FreeEXRHeader(&exr_header);\n      return TINYEXR_ERROR_INVALID_DATA;\n    }\n\n    if (idxG == -1) {\n      tinyexr::SetErrorMessage(\"G channel not found\", err);\n      // @todo { free exr_image }\n      FreeEXRHeader(&exr_header);\n      return TINYEXR_ERROR_INVALID_DATA;\n    }\n\n    if (idxB == -1) {\n      tinyexr::SetErrorMessage(\"B channel not found\", err);\n      // @todo { free exr_image }\n      FreeEXRHeader(&exr_header);\n      return TINYEXR_ERROR_INVALID_DATA;\n    }\n\n    (*out_rgba) = reinterpret_cast<float *>(\n        malloc(4 * sizeof(float) * static_cast<size_t>(exr_image.width) *\n               static_cast<size_t>(exr_image.height)));\n    if (exr_header.tiled) {\n      for (int it = 0; it < exr_image.num_tiles; it++) {\n        for (int j = 0; j < exr_header.tile_size_y; j++) {\n          for (int i = 0; i < exr_header.tile_size_x; i++) {\n            const int ii =\n                exr_image.tiles[it].offset_x * exr_header.tile_size_x + i;\n            const int jj =\n                exr_image.tiles[it].offset_y * exr_header.tile_size_y + j;\n            const int idx = ii + jj * exr_image.width;\n\n            // out of region check.\n            if (ii >= exr_image.width) {\n              continue;\n            }\n            if (jj >= exr_image.height) {\n              continue;\n            }\n            const int srcIdx = i + j * exr_header.tile_size_x;\n            unsigned char **src = exr_image.tiles[it].images;\n            (*out_rgba)[4 * idx + 0] =\n                reinterpret_cast<float **>(src)[idxR][srcIdx];\n            (*out_rgba)[4 * idx + 1] =\n                reinterpret_cast<float **>(src)[idxG][srcIdx];\n            (*out_rgba)[4 * idx + 2] =\n                reinterpret_cast<float **>(src)[idxB][srcIdx];\n            if (idxA != -1) {\n              (*out_rgba)[4 * idx + 3] =\n                  reinterpret_cast<float **>(src)[idxA][srcIdx];\n            } else {\n              (*out_rgba)[4 * idx + 3] = 1.0;\n            }\n          }\n        }\n      }\n    } else {\n      for (int i = 0; i < exr_image.width * exr_image.height; i++) {\n        (*out_rgba)[4 * i + 0] =\n            reinterpret_cast<float **>(exr_image.images)[idxR][i];\n        (*out_rgba)[4 * i + 1] =\n            reinterpret_cast<float **>(exr_image.images)[idxG][i];\n        (*out_rgba)[4 * i + 2] =\n            reinterpret_cast<float **>(exr_image.images)[idxB][i];\n        if (idxA != -1) {\n          (*out_rgba)[4 * i + 3] =\n              reinterpret_cast<float **>(exr_image.images)[idxA][i];\n        } else {\n          (*out_rgba)[4 * i + 3] = 1.0;\n        }\n      }\n    }\n  }\n\n  (*width) = exr_image.width;\n  (*height) = exr_image.height;\n\n  FreeEXRHeader(&exr_header);\n  FreeEXRImage(&exr_image);\n\n  return TINYEXR_SUCCESS;\n}\n\nint IsEXR(const char *filename) {\n  EXRVersion exr_version;\n\n  int ret = ParseEXRVersionFromFile(&exr_version, filename);\n  if (ret != TINYEXR_SUCCESS) {\n    return TINYEXR_ERROR_INVALID_HEADER;\n  }\n\n  return TINYEXR_SUCCESS;\n}\n\nint ParseEXRHeaderFromMemory(EXRHeader *exr_header, const EXRVersion *version,\n                             const unsigned char *memory, size_t size,\n                             const char **err) {\n  if (memory == NULL || exr_header == NULL) {\n    tinyexr::SetErrorMessage(\n        \"Invalid argument. `memory` or `exr_header` argument is null in \"\n        \"ParseEXRHeaderFromMemory()\",\n        err);\n\n    // Invalid argument\n    return TINYEXR_ERROR_INVALID_ARGUMENT;\n  }\n\n  if (size < tinyexr::kEXRVersionSize) {\n    tinyexr::SetErrorMessage(\"Insufficient header/data size.\\n\", err);\n    return TINYEXR_ERROR_INVALID_DATA;\n  }\n\n  const unsigned char *marker = memory + tinyexr::kEXRVersionSize;\n  size_t marker_size = size - tinyexr::kEXRVersionSize;\n\n  tinyexr::HeaderInfo info;\n  info.clear();\n\n  std::string err_str;\n  int ret = ParseEXRHeader(&info, NULL, version, &err_str, marker, marker_size);\n\n  if (ret != TINYEXR_SUCCESS) {\n    if (err && !err_str.empty()) {\n      tinyexr::SetErrorMessage(err_str, err);\n    }\n  }\n\n  ConvertHeader(exr_header, info);\n\n  // transfoer `tiled` from version.\n  exr_header->tiled = version->tiled;\n\n  return ret;\n}\n\nint LoadEXRFromMemory(float **out_rgba, int *width, int *height,\n                      const unsigned char *memory, size_t size,\n                      const char **err) {\n  if (out_rgba == NULL || memory == NULL) {\n    tinyexr::SetErrorMessage(\"Invalid argument for LoadEXRFromMemory\", err);\n    return TINYEXR_ERROR_INVALID_ARGUMENT;\n  }\n\n  EXRVersion exr_version;\n  EXRImage exr_image;\n  EXRHeader exr_header;\n\n  InitEXRHeader(&exr_header);\n\n  int ret = ParseEXRVersionFromMemory(&exr_version, memory, size);\n  if (ret != TINYEXR_SUCCESS) {\n    tinyexr::SetErrorMessage(\"Failed to parse EXR version\", err);\n    return ret;\n  }\n\n  ret = ParseEXRHeaderFromMemory(&exr_header, &exr_version, memory, size, err);\n  if (ret != TINYEXR_SUCCESS) {\n    return ret;\n  }\n\n  // Read HALF channel as FLOAT.\n  for (int i = 0; i < exr_header.num_channels; i++) {\n    if (exr_header.pixel_types[i] == TINYEXR_PIXELTYPE_HALF) {\n      exr_header.requested_pixel_types[i] = TINYEXR_PIXELTYPE_FLOAT;\n    }\n  }\n\n  InitEXRImage(&exr_image);\n  ret = LoadEXRImageFromMemory(&exr_image, &exr_header, memory, size, err);\n  if (ret != TINYEXR_SUCCESS) {\n    return ret;\n  }\n\n  // RGBA\n  int idxR = -1;\n  int idxG = -1;\n  int idxB = -1;\n  int idxA = -1;\n  for (int c = 0; c < exr_header.num_channels; c++) {\n    if (strcmp(exr_header.channels[c].name, \"R\") == 0) {\n      idxR = c;\n    } else if (strcmp(exr_header.channels[c].name, \"G\") == 0) {\n      idxG = c;\n    } else if (strcmp(exr_header.channels[c].name, \"B\") == 0) {\n      idxB = c;\n    } else if (strcmp(exr_header.channels[c].name, \"A\") == 0) {\n      idxA = c;\n    }\n  }\n\n  // TODO(syoyo): Refactor removing same code as used in LoadEXR().\n  if (exr_header.num_channels == 1) {\n    // Grayscale channel only.\n\n    (*out_rgba) = reinterpret_cast<float *>(\n        malloc(4 * sizeof(float) * static_cast<size_t>(exr_image.width) *\n               static_cast<size_t>(exr_image.height)));\n\n    if (exr_header.tiled) {\n      for (int it = 0; it < exr_image.num_tiles; it++) {\n        for (int j = 0; j < exr_header.tile_size_y; j++) {\n          for (int i = 0; i < exr_header.tile_size_x; i++) {\n            const int ii =\n                exr_image.tiles[it].offset_x * exr_header.tile_size_x + i;\n            const int jj =\n                exr_image.tiles[it].offset_y * exr_header.tile_size_y + j;\n            const int idx = ii + jj * exr_image.width;\n\n            // out of region check.\n            if (ii >= exr_image.width) {\n              continue;\n            }\n            if (jj >= exr_image.height) {\n              continue;\n            }\n            const int srcIdx = i + j * exr_header.tile_size_x;\n            unsigned char **src = exr_image.tiles[it].images;\n            (*out_rgba)[4 * idx + 0] =\n                reinterpret_cast<float **>(src)[0][srcIdx];\n            (*out_rgba)[4 * idx + 1] =\n                reinterpret_cast<float **>(src)[0][srcIdx];\n            (*out_rgba)[4 * idx + 2] =\n                reinterpret_cast<float **>(src)[0][srcIdx];\n            (*out_rgba)[4 * idx + 3] =\n                reinterpret_cast<float **>(src)[0][srcIdx];\n          }\n        }\n      }\n    } else {\n      for (int i = 0; i < exr_image.width * exr_image.height; i++) {\n        const float val = reinterpret_cast<float **>(exr_image.images)[0][i];\n        (*out_rgba)[4 * i + 0] = val;\n        (*out_rgba)[4 * i + 1] = val;\n        (*out_rgba)[4 * i + 2] = val;\n        (*out_rgba)[4 * i + 3] = val;\n      }\n    }\n\n  } else {\n    // TODO(syoyo): Support non RGBA image.\n\n    if (idxR == -1) {\n      tinyexr::SetErrorMessage(\"R channel not found\", err);\n\n      // @todo { free exr_image }\n      return TINYEXR_ERROR_INVALID_DATA;\n    }\n\n    if (idxG == -1) {\n      tinyexr::SetErrorMessage(\"G channel not found\", err);\n      // @todo { free exr_image }\n      return TINYEXR_ERROR_INVALID_DATA;\n    }\n\n    if (idxB == -1) {\n      tinyexr::SetErrorMessage(\"B channel not found\", err);\n      // @todo { free exr_image }\n      return TINYEXR_ERROR_INVALID_DATA;\n    }\n\n    (*out_rgba) = reinterpret_cast<float *>(\n        malloc(4 * sizeof(float) * static_cast<size_t>(exr_image.width) *\n               static_cast<size_t>(exr_image.height)));\n\n    if (exr_header.tiled) {\n      for (int it = 0; it < exr_image.num_tiles; it++) {\n        for (int j = 0; j < exr_header.tile_size_y; j++)\n          for (int i = 0; i < exr_header.tile_size_x; i++) {\n            const int ii =\n                exr_image.tiles[it].offset_x * exr_header.tile_size_x + i;\n            const int jj =\n                exr_image.tiles[it].offset_y * exr_header.tile_size_y + j;\n            const int idx = ii + jj * exr_image.width;\n\n            // out of region check.\n            if (ii >= exr_image.width) {\n              continue;\n            }\n            if (jj >= exr_image.height) {\n              continue;\n            }\n            const int srcIdx = i + j * exr_header.tile_size_x;\n            unsigned char **src = exr_image.tiles[it].images;\n            (*out_rgba)[4 * idx + 0] =\n                reinterpret_cast<float **>(src)[idxR][srcIdx];\n            (*out_rgba)[4 * idx + 1] =\n                reinterpret_cast<float **>(src)[idxG][srcIdx];\n            (*out_rgba)[4 * idx + 2] =\n                reinterpret_cast<float **>(src)[idxB][srcIdx];\n            if (idxA != -1) {\n              (*out_rgba)[4 * idx + 3] =\n                  reinterpret_cast<float **>(src)[idxA][srcIdx];\n            } else {\n              (*out_rgba)[4 * idx + 3] = 1.0;\n            }\n          }\n      }\n    } else {\n      for (int i = 0; i < exr_image.width * exr_image.height; i++) {\n        (*out_rgba)[4 * i + 0] =\n            reinterpret_cast<float **>(exr_image.images)[idxR][i];\n        (*out_rgba)[4 * i + 1] =\n            reinterpret_cast<float **>(exr_image.images)[idxG][i];\n        (*out_rgba)[4 * i + 2] =\n            reinterpret_cast<float **>(exr_image.images)[idxB][i];\n        if (idxA != -1) {\n          (*out_rgba)[4 * i + 3] =\n              reinterpret_cast<float **>(exr_image.images)[idxA][i];\n        } else {\n          (*out_rgba)[4 * i + 3] = 1.0;\n        }\n      }\n    }\n  }\n\n  (*width) = exr_image.width;\n  (*height) = exr_image.height;\n\n  FreeEXRHeader(&exr_header);\n  FreeEXRImage(&exr_image);\n\n  return TINYEXR_SUCCESS;\n}\n\nint LoadEXRImageFromFile(EXRImage *exr_image, const EXRHeader *exr_header,\n                         const char *filename, const char **err) {\n  if (exr_image == NULL) {\n    tinyexr::SetErrorMessage(\"Invalid argument for LoadEXRImageFromFile\", err);\n    return TINYEXR_ERROR_INVALID_ARGUMENT;\n  }\n\n#ifdef _WIN32\n  FILE *fp = NULL;\n  fopen_s(&fp, filename, \"rb\");\n#else\n  FILE *fp = fopen(filename, \"rb\");\n#endif\n  if (!fp) {\n    tinyexr::SetErrorMessage(\"Cannot read file \" + std::string(filename), err);\n    return TINYEXR_ERROR_CANT_OPEN_FILE;\n  }\n\n  size_t filesize;\n  // Compute size\n  fseek(fp, 0, SEEK_END);\n  filesize = static_cast<size_t>(ftell(fp));\n  fseek(fp, 0, SEEK_SET);\n\n  if (filesize < 16) {\n    tinyexr::SetErrorMessage(\"File size too short \" + std::string(filename),\n                             err);\n    return TINYEXR_ERROR_INVALID_FILE;\n  }\n\n  std::vector<unsigned char> buf(filesize);  // @todo { use mmap }\n  {\n    size_t ret;\n    ret = fread(&buf[0], 1, filesize, fp);\n    assert(ret == filesize);\n    fclose(fp);\n    (void)ret;\n  }\n\n  return LoadEXRImageFromMemory(exr_image, exr_header, &buf.at(0), filesize,\n                                err);\n}\n\nint LoadEXRImageFromMemory(EXRImage *exr_image, const EXRHeader *exr_header,\n                           const unsigned char *memory, const size_t size,\n                           const char **err) {\n  if (exr_image == NULL || memory == NULL ||\n      (size < tinyexr::kEXRVersionSize)) {\n    tinyexr::SetErrorMessage(\"Invalid argument for LoadEXRImageFromMemory\",\n                             err);\n    return TINYEXR_ERROR_INVALID_ARGUMENT;\n  }\n\n  if (exr_header->header_len == 0) {\n    tinyexr::SetErrorMessage(\"EXRHeader variable is not initialized.\", err);\n    return TINYEXR_ERROR_INVALID_ARGUMENT;\n  }\n\n  const unsigned char *head = memory;\n  const unsigned char *marker = reinterpret_cast<const unsigned char *>(\n      memory + exr_header->header_len +\n      8);  // +8 for magic number + version header.\n  return tinyexr::DecodeEXRImage(exr_image, exr_header, head, marker, size,\n                                 err);\n}\n\nsize_t SaveEXRImageToMemory(const EXRImage *exr_image,\n                            const EXRHeader *exr_header,\n                            unsigned char **memory_out, const char **err) {\n  if (exr_image == NULL || memory_out == NULL ||\n      exr_header->compression_type < 0) {\n    tinyexr::SetErrorMessage(\"Invalid argument for SaveEXRImageToMemory\", err);\n    return 0;\n  }\n\n#if !TINYEXR_USE_PIZ\n  if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_PIZ) {\n    tinyexr::SetErrorMessage(\"PIZ compression is not supported in this build\",\n                             err);\n    return 0;\n  }\n#endif\n\n#if !TINYEXR_USE_ZFP\n  if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZFP) {\n    tinyexr::SetErrorMessage(\"ZFP compression is not supported in this build\",\n                             err);\n    return 0;\n  }\n#endif\n\n#if TINYEXR_USE_ZFP\n  for (size_t i = 0; i < static_cast<size_t>(exr_header->num_channels); i++) {\n    if (exr_header->requested_pixel_types[i] != TINYEXR_PIXELTYPE_FLOAT) {\n      tinyexr::SetErrorMessage(\"Pixel type must be FLOAT for ZFP compression\",\n                               err);\n      return 0;\n    }\n  }\n#endif\n\n  std::vector<unsigned char> memory;\n\n  // Header\n  {\n    const char header[] = {0x76, 0x2f, 0x31, 0x01};\n    memory.insert(memory.end(), header, header + 4);\n  }\n\n  // Version, scanline.\n  {\n    char marker[] = {2, 0, 0, 0};\n    /* @todo\n    if (exr_header->tiled) {\n      marker[1] |= 0x2;\n    }\n    if (exr_header->long_name) {\n      marker[1] |= 0x4;\n    }\n    if (exr_header->non_image) {\n      marker[1] |= 0x8;\n    }\n    if (exr_header->multipart) {\n      marker[1] |= 0x10;\n    }\n    */\n    memory.insert(memory.end(), marker, marker + 4);\n  }\n\n  int num_scanlines = 1;\n  if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZIP) {\n    num_scanlines = 16;\n  } else if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_PIZ) {\n    num_scanlines = 32;\n  } else if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZFP) {\n    num_scanlines = 16;\n  }\n\n  // Write attributes.\n  std::vector<tinyexr::ChannelInfo> channels;\n  {\n    std::vector<unsigned char> data;\n\n    for (int c = 0; c < exr_header->num_channels; c++) {\n      tinyexr::ChannelInfo info;\n      info.p_linear = 0;\n      info.pixel_type = exr_header->requested_pixel_types[c];\n      info.x_sampling = 1;\n      info.y_sampling = 1;\n      info.name = std::string(exr_header->channels[c].name);\n      channels.push_back(info);\n    }\n\n    tinyexr::WriteChannelInfo(data, channels);\n\n    tinyexr::WriteAttributeToMemory(&memory, \"channels\", \"chlist\", &data.at(0),\n                                    static_cast<int>(data.size()));\n  }\n\n  {\n    int comp = exr_header->compression_type;\n    tinyexr::swap4(reinterpret_cast<unsigned int *>(&comp));\n    tinyexr::WriteAttributeToMemory(\n        &memory, \"compression\", \"compression\",\n        reinterpret_cast<const unsigned char *>(&comp), 1);\n  }\n\n  {\n    int data[4] = {0, 0, exr_image->width - 1, exr_image->height - 1};\n    tinyexr::swap4(reinterpret_cast<unsigned int *>(&data[0]));\n    tinyexr::swap4(reinterpret_cast<unsigned int *>(&data[1]));\n    tinyexr::swap4(reinterpret_cast<unsigned int *>(&data[2]));\n    tinyexr::swap4(reinterpret_cast<unsigned int *>(&data[3]));\n    tinyexr::WriteAttributeToMemory(\n        &memory, \"dataWindow\", \"box2i\",\n        reinterpret_cast<const unsigned char *>(data), sizeof(int) * 4);\n    tinyexr::WriteAttributeToMemory(\n        &memory, \"displayWindow\", \"box2i\",\n        reinterpret_cast<const unsigned char *>(data), sizeof(int) * 4);\n  }\n\n  {\n    unsigned char line_order = 0;  // @fixme { read line_order from EXRHeader }\n    tinyexr::WriteAttributeToMemory(&memory, \"lineOrder\", \"lineOrder\",\n                                    &line_order, 1);\n  }\n\n  {\n    float aspectRatio = 1.0f;\n    tinyexr::swap4(reinterpret_cast<unsigned int *>(&aspectRatio));\n    tinyexr::WriteAttributeToMemory(\n        &memory, \"pixelAspectRatio\", \"float\",\n        reinterpret_cast<const unsigned char *>(&aspectRatio), sizeof(float));\n  }\n\n  {\n    float center[2] = {0.0f, 0.0f};\n    tinyexr::swap4(reinterpret_cast<unsigned int *>(&center[0]));\n    tinyexr::swap4(reinterpret_cast<unsigned int *>(&center[1]));\n    tinyexr::WriteAttributeToMemory(\n        &memory, \"screenWindowCenter\", \"v2f\",\n        reinterpret_cast<const unsigned char *>(center), 2 * sizeof(float));\n  }\n\n  {\n    float w = static_cast<float>(exr_image->width);\n    tinyexr::swap4(reinterpret_cast<unsigned int *>(&w));\n    tinyexr::WriteAttributeToMemory(&memory, \"screenWindowWidth\", \"float\",\n                                    reinterpret_cast<const unsigned char *>(&w),\n                                    sizeof(float));\n  }\n\n  // Custom attributes\n  if (exr_header->num_custom_attributes > 0) {\n    for (int i = 0; i < exr_header->num_custom_attributes; i++) {\n      tinyexr::WriteAttributeToMemory(\n          &memory, exr_header->custom_attributes[i].name,\n          exr_header->custom_attributes[i].type,\n          reinterpret_cast<const unsigned char *>(\n              exr_header->custom_attributes[i].value),\n          exr_header->custom_attributes[i].size);\n    }\n  }\n\n  {  // end of header\n    unsigned char e = 0;\n    memory.push_back(e);\n  }\n\n  int num_blocks = exr_image->height / num_scanlines;\n  if (num_blocks * num_scanlines < exr_image->height) {\n    num_blocks++;\n  }\n\n  std::vector<tinyexr::tinyexr_uint64> offsets(static_cast<size_t>(num_blocks));\n\n  size_t headerSize = memory.size();\n  tinyexr::tinyexr_uint64 offset =\n      headerSize +\n      static_cast<size_t>(num_blocks) *\n          sizeof(\n              tinyexr::tinyexr_int64);  // sizeof(header) + sizeof(offsetTable)\n\n  std::vector<std::vector<unsigned char> > data_list(\n      static_cast<size_t>(num_blocks));\n  std::vector<size_t> channel_offset_list(\n      static_cast<size_t>(exr_header->num_channels));\n\n  int pixel_data_size = 0;\n  size_t channel_offset = 0;\n  for (size_t c = 0; c < static_cast<size_t>(exr_header->num_channels); c++) {\n    channel_offset_list[c] = channel_offset;\n    if (exr_header->requested_pixel_types[c] == TINYEXR_PIXELTYPE_HALF) {\n      pixel_data_size += sizeof(unsigned short);\n      channel_offset += sizeof(unsigned short);\n    } else if (exr_header->requested_pixel_types[c] ==\n               TINYEXR_PIXELTYPE_FLOAT) {\n      pixel_data_size += sizeof(float);\n      channel_offset += sizeof(float);\n    } else if (exr_header->requested_pixel_types[c] == TINYEXR_PIXELTYPE_UINT) {\n      pixel_data_size += sizeof(unsigned int);\n      channel_offset += sizeof(unsigned int);\n    } else {\n      assert(0);\n    }\n  }\n\n#if TINYEXR_USE_ZFP\n  tinyexr::ZFPCompressionParam zfp_compression_param;\n\n  // Use ZFP compression parameter from custom attributes(if such a parameter\n  // exists)\n  {\n    bool ret = tinyexr::FindZFPCompressionParam(\n        &zfp_compression_param, exr_header->custom_attributes,\n        exr_header->num_custom_attributes);\n\n    if (!ret) {\n      // Use predefined compression parameter.\n      zfp_compression_param.type = 0;\n      zfp_compression_param.rate = 2;\n    }\n  }\n#endif\n\n// Use signed int since some OpenMP compiler doesn't allow unsigned type for\n// `parallel for`\n#ifdef _OPENMP\n#pragma omp parallel for\n#endif\n  for (int i = 0; i < num_blocks; i++) {\n    size_t ii = static_cast<size_t>(i);\n    int start_y = num_scanlines * i;\n    int endY = (std::min)(num_scanlines * (i + 1), exr_image->height);\n    int h = endY - start_y;\n\n    std::vector<unsigned char> buf(\n        static_cast<size_t>(exr_image->width * h * pixel_data_size));\n\n    for (size_t c = 0; c < static_cast<size_t>(exr_header->num_channels); c++) {\n      if (exr_header->pixel_types[c] == TINYEXR_PIXELTYPE_HALF) {\n        if (exr_header->requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT) {\n          for (int y = 0; y < h; y++) {\n            // Assume increasing Y\n            float *line_ptr = reinterpret_cast<float *>(&buf.at(\n                static_cast<size_t>(pixel_data_size * y * exr_image->width) +\n                channel_offset_list[c] *\n                    static_cast<size_t>(exr_image->width)));\n            for (int x = 0; x < exr_image->width; x++) {\n              tinyexr::FP16 h16;\n              h16.u = reinterpret_cast<unsigned short **>(\n                  exr_image->images)[c][(y + start_y) * exr_image->width + x];\n\n              tinyexr::FP32 f32 = half_to_float(h16);\n\n              tinyexr::swap4(reinterpret_cast<unsigned int *>(&f32.f));\n\n              // line_ptr[x] = f32.f;\n              tinyexr::cpy4(line_ptr + x, &(f32.f));\n            }\n          }\n        } else if (exr_header->requested_pixel_types[c] ==\n                   TINYEXR_PIXELTYPE_HALF) {\n          for (int y = 0; y < h; y++) {\n            // Assume increasing Y\n            unsigned short *line_ptr = reinterpret_cast<unsigned short *>(\n                &buf.at(static_cast<size_t>(pixel_data_size * y *\n                                            exr_image->width) +\n                        channel_offset_list[c] *\n                            static_cast<size_t>(exr_image->width)));\n            for (int x = 0; x < exr_image->width; x++) {\n              unsigned short val = reinterpret_cast<unsigned short **>(\n                  exr_image->images)[c][(y + start_y) * exr_image->width + x];\n\n              tinyexr::swap2(&val);\n\n              // line_ptr[x] = val;\n              tinyexr::cpy2(line_ptr + x, &val);\n            }\n          }\n        } else {\n          assert(0);\n        }\n\n      } else if (exr_header->pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT) {\n        if (exr_header->requested_pixel_types[c] == TINYEXR_PIXELTYPE_HALF) {\n          for (int y = 0; y < h; y++) {\n            // Assume increasing Y\n            unsigned short *line_ptr = reinterpret_cast<unsigned short *>(\n                &buf.at(static_cast<size_t>(pixel_data_size * y *\n                                            exr_image->width) +\n                        channel_offset_list[c] *\n                            static_cast<size_t>(exr_image->width)));\n            for (int x = 0; x < exr_image->width; x++) {\n              tinyexr::FP32 f32;\n              f32.f = reinterpret_cast<float **>(\n                  exr_image->images)[c][(y + start_y) * exr_image->width + x];\n\n              tinyexr::FP16 h16;\n              h16 = float_to_half_full(f32);\n\n              tinyexr::swap2(reinterpret_cast<unsigned short *>(&h16.u));\n\n              // line_ptr[x] = h16.u;\n              tinyexr::cpy2(line_ptr + x, &(h16.u));\n            }\n          }\n        } else if (exr_header->requested_pixel_types[c] ==\n                   TINYEXR_PIXELTYPE_FLOAT) {\n          for (int y = 0; y < h; y++) {\n            // Assume increasing Y\n            float *line_ptr = reinterpret_cast<float *>(&buf.at(\n                static_cast<size_t>(pixel_data_size * y * exr_image->width) +\n                channel_offset_list[c] *\n                    static_cast<size_t>(exr_image->width)));\n            for (int x = 0; x < exr_image->width; x++) {\n              float val = reinterpret_cast<float **>(\n                  exr_image->images)[c][(y + start_y) * exr_image->width + x];\n\n              tinyexr::swap4(reinterpret_cast<unsigned int *>(&val));\n\n              // line_ptr[x] = val;\n              tinyexr::cpy4(line_ptr + x, &val);\n            }\n          }\n        } else {\n          assert(0);\n        }\n      } else if (exr_header->pixel_types[c] == TINYEXR_PIXELTYPE_UINT) {\n        for (int y = 0; y < h; y++) {\n          // Assume increasing Y\n          unsigned int *line_ptr = reinterpret_cast<unsigned int *>(&buf.at(\n              static_cast<size_t>(pixel_data_size * y * exr_image->width) +\n              channel_offset_list[c] * static_cast<size_t>(exr_image->width)));\n          for (int x = 0; x < exr_image->width; x++) {\n            unsigned int val = reinterpret_cast<unsigned int **>(\n                exr_image->images)[c][(y + start_y) * exr_image->width + x];\n\n            tinyexr::swap4(&val);\n\n            // line_ptr[x] = val;\n            tinyexr::cpy4(line_ptr + x, &val);\n          }\n        }\n      }\n    }\n\n    if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_NONE) {\n      // 4 byte: scan line\n      // 4 byte: data size\n      // ~     : pixel data(uncompressed)\n      std::vector<unsigned char> header(8);\n      unsigned int data_len = static_cast<unsigned int>(buf.size());\n      memcpy(&header.at(0), &start_y, sizeof(int));\n      memcpy(&header.at(4), &data_len, sizeof(unsigned int));\n\n      tinyexr::swap4(reinterpret_cast<unsigned int *>(&header.at(0)));\n      tinyexr::swap4(reinterpret_cast<unsigned int *>(&header.at(4)));\n\n      data_list[ii].insert(data_list[ii].end(), header.begin(), header.end());\n      data_list[ii].insert(data_list[ii].end(), buf.begin(),\n                           buf.begin() + data_len);\n\n    } else if ((exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZIPS) ||\n               (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZIP)) {\n#if TINYEXR_USE_MINIZ\n      std::vector<unsigned char> block(tinyexr::miniz::mz_compressBound(\n          static_cast<unsigned long>(buf.size())));\n#else\n      std::vector<unsigned char> block(\n          compressBound(static_cast<uLong>(buf.size())));\n#endif\n      tinyexr::tinyexr_uint64 outSize = block.size();\n\n      tinyexr::CompressZip(&block.at(0), outSize,\n                           reinterpret_cast<const unsigned char *>(&buf.at(0)),\n                           static_cast<unsigned long>(buf.size()));\n\n      // 4 byte: scan line\n      // 4 byte: data size\n      // ~     : pixel data(compressed)\n      std::vector<unsigned char> header(8);\n      unsigned int data_len = static_cast<unsigned int>(outSize);  // truncate\n      memcpy(&header.at(0), &start_y, sizeof(int));\n      memcpy(&header.at(4), &data_len, sizeof(unsigned int));\n\n      tinyexr::swap4(reinterpret_cast<unsigned int *>(&header.at(0)));\n      tinyexr::swap4(reinterpret_cast<unsigned int *>(&header.at(4)));\n\n      data_list[ii].insert(data_list[ii].end(), header.begin(), header.end());\n      data_list[ii].insert(data_list[ii].end(), block.begin(),\n                           block.begin() + data_len);\n\n    } else if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_RLE) {\n      // (buf.size() * 3) / 2 would be enough.\n      std::vector<unsigned char> block((buf.size() * 3) / 2);\n\n      tinyexr::tinyexr_uint64 outSize = block.size();\n\n      tinyexr::CompressRle(&block.at(0), outSize,\n                           reinterpret_cast<const unsigned char *>(&buf.at(0)),\n                           static_cast<unsigned long>(buf.size()));\n\n      // 4 byte: scan line\n      // 4 byte: data size\n      // ~     : pixel data(compressed)\n      std::vector<unsigned char> header(8);\n      unsigned int data_len = static_cast<unsigned int>(outSize);  // truncate\n      memcpy(&header.at(0), &start_y, sizeof(int));\n      memcpy(&header.at(4), &data_len, sizeof(unsigned int));\n\n      tinyexr::swap4(reinterpret_cast<unsigned int *>(&header.at(0)));\n      tinyexr::swap4(reinterpret_cast<unsigned int *>(&header.at(4)));\n\n      data_list[ii].insert(data_list[ii].end(), header.begin(), header.end());\n      data_list[ii].insert(data_list[ii].end(), block.begin(),\n                           block.begin() + data_len);\n\n    } else if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_PIZ) {\n#if TINYEXR_USE_PIZ\n      unsigned int bufLen =\n          8192 + static_cast<unsigned int>(\n                     2 * static_cast<unsigned int>(\n                             buf.size()));  // @fixme { compute good bound. }\n      std::vector<unsigned char> block(bufLen);\n      unsigned int outSize = static_cast<unsigned int>(block.size());\n\n      CompressPiz(&block.at(0), &outSize,\n                  reinterpret_cast<const unsigned char *>(&buf.at(0)),\n                  buf.size(), channels, exr_image->width, h);\n\n      // 4 byte: scan line\n      // 4 byte: data size\n      // ~     : pixel data(compressed)\n      std::vector<unsigned char> header(8);\n      unsigned int data_len = outSize;\n      memcpy(&header.at(0), &start_y, sizeof(int));\n      memcpy(&header.at(4), &data_len, sizeof(unsigned int));\n\n      tinyexr::swap4(reinterpret_cast<unsigned int *>(&header.at(0)));\n      tinyexr::swap4(reinterpret_cast<unsigned int *>(&header.at(4)));\n\n      data_list[ii].insert(data_list[ii].end(), header.begin(), header.end());\n      data_list[ii].insert(data_list[ii].end(), block.begin(),\n                           block.begin() + data_len);\n\n#else\n      assert(0);\n#endif\n    } else if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZFP) {\n#if TINYEXR_USE_ZFP\n      std::vector<unsigned char> block;\n      unsigned int outSize;\n\n      tinyexr::CompressZfp(\n          &block, &outSize, reinterpret_cast<const float *>(&buf.at(0)),\n          exr_image->width, h, exr_header->num_channels, zfp_compression_param);\n\n      // 4 byte: scan line\n      // 4 byte: data size\n      // ~     : pixel data(compressed)\n      std::vector<unsigned char> header(8);\n      unsigned int data_len = outSize;\n      memcpy(&header.at(0), &start_y, sizeof(int));\n      memcpy(&header.at(4), &data_len, sizeof(unsigned int));\n\n      tinyexr::swap4(reinterpret_cast<unsigned int *>(&header.at(0)));\n      tinyexr::swap4(reinterpret_cast<unsigned int *>(&header.at(4)));\n\n      data_list[ii].insert(data_list[ii].end(), header.begin(), header.end());\n      data_list[ii].insert(data_list[ii].end(), block.begin(),\n                           block.begin() + data_len);\n\n#else\n      assert(0);\n#endif\n    } else {\n      assert(0);\n    }\n  }  // omp parallel\n\n  for (size_t i = 0; i < static_cast<size_t>(num_blocks); i++) {\n    offsets[i] = offset;\n    tinyexr::swap8(reinterpret_cast<tinyexr::tinyexr_uint64 *>(&offsets[i]));\n    offset += data_list[i].size();\n  }\n\n  size_t totalSize = static_cast<size_t>(offset);\n  {\n    memory.insert(\n        memory.end(), reinterpret_cast<unsigned char *>(&offsets.at(0)),\n        reinterpret_cast<unsigned char *>(&offsets.at(0)) +\n            sizeof(tinyexr::tinyexr_uint64) * static_cast<size_t>(num_blocks));\n  }\n\n  if (memory.size() == 0) {\n    tinyexr::SetErrorMessage(\"Output memory size is zero\", err);\n    return 0;\n  }\n\n  (*memory_out) = static_cast<unsigned char *>(malloc(totalSize));\n  memcpy((*memory_out), &memory.at(0), memory.size());\n  unsigned char *memory_ptr = *memory_out + memory.size();\n\n  for (size_t i = 0; i < static_cast<size_t>(num_blocks); i++) {\n    memcpy(memory_ptr, &data_list[i].at(0), data_list[i].size());\n    memory_ptr += data_list[i].size();\n  }\n\n  return totalSize;  // OK\n}\n\nint SaveEXRImageToFile(const EXRImage *exr_image, const EXRHeader *exr_header,\n                       const char *filename, const char **err) {\n  if (exr_image == NULL || filename == NULL ||\n      exr_header->compression_type < 0) {\n    tinyexr::SetErrorMessage(\"Invalid argument for SaveEXRImageToFile\", err);\n    return TINYEXR_ERROR_INVALID_ARGUMENT;\n  }\n\n#if !TINYEXR_USE_PIZ\n  if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_PIZ) {\n    tinyexr::SetErrorMessage(\"PIZ compression is not supported in this build\",\n                             err);\n    return TINYEXR_ERROR_UNSUPPORTED_FEATURE;\n  }\n#endif\n\n#if !TINYEXR_USE_ZFP\n  if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZFP) {\n    tinyexr::SetErrorMessage(\"ZFP compression is not supported in this build\",\n                             err);\n    return TINYEXR_ERROR_UNSUPPORTED_FEATURE;\n  }\n#endif\n\n#ifdef _WIN32\n  FILE *fp = NULL;\n  fopen_s(&fp, filename, \"wb\");\n#else\n  FILE *fp = fopen(filename, \"wb\");\n#endif\n  if (!fp) {\n    tinyexr::SetErrorMessage(\"Cannot write a file\", err);\n    return TINYEXR_ERROR_CANT_WRITE_FILE;\n  }\n\n  unsigned char *mem = NULL;\n  size_t mem_size = SaveEXRImageToMemory(exr_image, exr_header, &mem, err);\n  if (mem_size == 0) {\n    return TINYEXR_ERROR_SERIALZATION_FAILED;\n  }\n\n  size_t written_size = 0;\n  if ((mem_size > 0) && mem) {\n    written_size = fwrite(mem, 1, mem_size, fp);\n  }\n  free(mem);\n\n  fclose(fp);\n\n  if (written_size != mem_size) {\n    tinyexr::SetErrorMessage(\"Cannot write a file\", err);\n    return TINYEXR_ERROR_CANT_WRITE_FILE;\n  }\n\n  return TINYEXR_SUCCESS;\n}\n\nint LoadDeepEXR(DeepImage *deep_image, const char *filename, const char **err) {\n  if (deep_image == NULL) {\n    tinyexr::SetErrorMessage(\"Invalid argument for LoadDeepEXR\", err);\n    return TINYEXR_ERROR_INVALID_ARGUMENT;\n  }\n\n#ifdef _MSC_VER\n  FILE *fp = NULL;\n  errno_t errcode = fopen_s(&fp, filename, \"rb\");\n  if ((0 != errcode) || (!fp)) {\n    tinyexr::SetErrorMessage(\"Cannot read a file \" + std::string(filename),\n                             err);\n    return TINYEXR_ERROR_CANT_OPEN_FILE;\n  }\n#else\n  FILE *fp = fopen(filename, \"rb\");\n  if (!fp) {\n    tinyexr::SetErrorMessage(\"Cannot read a file \" + std::string(filename),\n                             err);\n    return TINYEXR_ERROR_CANT_OPEN_FILE;\n  }\n#endif\n\n  size_t filesize;\n  // Compute size\n  fseek(fp, 0, SEEK_END);\n  filesize = static_cast<size_t>(ftell(fp));\n  fseek(fp, 0, SEEK_SET);\n\n  if (filesize == 0) {\n    fclose(fp);\n    tinyexr::SetErrorMessage(\"File size is zero : \" + std::string(filename),\n                             err);\n    return TINYEXR_ERROR_INVALID_FILE;\n  }\n\n  std::vector<char> buf(filesize);  // @todo { use mmap }\n  {\n    size_t ret;\n    ret = fread(&buf[0], 1, filesize, fp);\n    assert(ret == filesize);\n    (void)ret;\n  }\n  fclose(fp);\n\n  const char *head = &buf[0];\n  const char *marker = &buf[0];\n\n  // Header check.\n  {\n    const char header[] = {0x76, 0x2f, 0x31, 0x01};\n\n    if (memcmp(marker, header, 4) != 0) {\n      tinyexr::SetErrorMessage(\"Invalid magic number\", err);\n      return TINYEXR_ERROR_INVALID_MAGIC_NUMBER;\n    }\n    marker += 4;\n  }\n\n  // Version, scanline.\n  {\n    // ver 2.0, scanline, deep bit on(0x800)\n    // must be [2, 0, 0, 0]\n    if (marker[0] != 2 || marker[1] != 8 || marker[2] != 0 || marker[3] != 0) {\n      tinyexr::SetErrorMessage(\"Unsupported version or scanline\", err);\n      return TINYEXR_ERROR_UNSUPPORTED_FORMAT;\n    }\n\n    marker += 4;\n  }\n\n  int dx = -1;\n  int dy = -1;\n  int dw = -1;\n  int dh = -1;\n  int num_scanline_blocks = 1;  // 16 for ZIP compression.\n  int compression_type = -1;\n  int num_channels = -1;\n  std::vector<tinyexr::ChannelInfo> channels;\n\n  // Read attributes\n  size_t size = filesize - tinyexr::kEXRVersionSize;\n  for (;;) {\n    if (0 == size) {\n      return TINYEXR_ERROR_INVALID_DATA;\n    } else if (marker[0] == '\\0') {\n      marker++;\n      size--;\n      break;\n    }\n\n    std::string attr_name;\n    std::string attr_type;\n    std::vector<unsigned char> data;\n    size_t marker_size;\n    if (!tinyexr::ReadAttribute(&attr_name, &attr_type, &data, &marker_size,\n                                marker, size)) {\n      std::stringstream ss;\n      ss << \"Failed to parse attribute\\n\";\n      tinyexr::SetErrorMessage(ss.str(), err);\n      return TINYEXR_ERROR_INVALID_DATA;\n    }\n    marker += marker_size;\n    size -= marker_size;\n\n    if (attr_name.compare(\"compression\") == 0) {\n      compression_type = data[0];\n      if (compression_type > TINYEXR_COMPRESSIONTYPE_PIZ) {\n        std::stringstream ss;\n        ss << \"Unsupported compression type : \" << compression_type;\n        tinyexr::SetErrorMessage(ss.str(), err);\n        return TINYEXR_ERROR_UNSUPPORTED_FORMAT;\n      }\n\n      if (compression_type == TINYEXR_COMPRESSIONTYPE_ZIP) {\n        num_scanline_blocks = 16;\n      }\n\n    } else if (attr_name.compare(\"channels\") == 0) {\n      // name: zero-terminated string, from 1 to 255 bytes long\n      // pixel type: int, possible values are: UINT = 0 HALF = 1 FLOAT = 2\n      // pLinear: unsigned char, possible values are 0 and 1\n      // reserved: three chars, should be zero\n      // xSampling: int\n      // ySampling: int\n\n      if (!tinyexr::ReadChannelInfo(channels, data)) {\n        tinyexr::SetErrorMessage(\"Failed to parse channel info\", err);\n        return TINYEXR_ERROR_INVALID_DATA;\n      }\n\n      num_channels = static_cast<int>(channels.size());\n\n      if (num_channels < 1) {\n        tinyexr::SetErrorMessage(\"Invalid channels format\", err);\n        return TINYEXR_ERROR_INVALID_DATA;\n      }\n\n    } else if (attr_name.compare(\"dataWindow\") == 0) {\n      memcpy(&dx, &data.at(0), sizeof(int));\n      memcpy(&dy, &data.at(4), sizeof(int));\n      memcpy(&dw, &data.at(8), sizeof(int));\n      memcpy(&dh, &data.at(12), sizeof(int));\n      tinyexr::swap4(reinterpret_cast<unsigned int *>(&dx));\n      tinyexr::swap4(reinterpret_cast<unsigned int *>(&dy));\n      tinyexr::swap4(reinterpret_cast<unsigned int *>(&dw));\n      tinyexr::swap4(reinterpret_cast<unsigned int *>(&dh));\n\n    } else if (attr_name.compare(\"displayWindow\") == 0) {\n      int x;\n      int y;\n      int w;\n      int h;\n      memcpy(&x, &data.at(0), sizeof(int));\n      memcpy(&y, &data.at(4), sizeof(int));\n      memcpy(&w, &data.at(8), sizeof(int));\n      memcpy(&h, &data.at(12), sizeof(int));\n      tinyexr::swap4(reinterpret_cast<unsigned int *>(&x));\n      tinyexr::swap4(reinterpret_cast<unsigned int *>(&y));\n      tinyexr::swap4(reinterpret_cast<unsigned int *>(&w));\n      tinyexr::swap4(reinterpret_cast<unsigned int *>(&h));\n    }\n  }\n\n  assert(dx >= 0);\n  assert(dy >= 0);\n  assert(dw >= 0);\n  assert(dh >= 0);\n  assert(num_channels >= 1);\n\n  int data_width = dw - dx + 1;\n  int data_height = dh - dy + 1;\n\n  std::vector<float> image(\n      static_cast<size_t>(data_width * data_height * 4));  // 4 = RGBA\n\n  // Read offset tables.\n  int num_blocks = data_height / num_scanline_blocks;\n  if (num_blocks * num_scanline_blocks < data_height) {\n    num_blocks++;\n  }\n\n  std::vector<tinyexr::tinyexr_int64> offsets(static_cast<size_t>(num_blocks));\n\n  for (size_t y = 0; y < static_cast<size_t>(num_blocks); y++) {\n    tinyexr::tinyexr_int64 offset;\n    memcpy(&offset, marker, sizeof(tinyexr::tinyexr_int64));\n    tinyexr::swap8(reinterpret_cast<tinyexr::tinyexr_uint64 *>(&offset));\n    marker += sizeof(tinyexr::tinyexr_int64);  // = 8\n    offsets[y] = offset;\n  }\n\n#if TINYEXR_USE_PIZ\n  if ((compression_type == TINYEXR_COMPRESSIONTYPE_NONE) ||\n      (compression_type == TINYEXR_COMPRESSIONTYPE_RLE) ||\n      (compression_type == TINYEXR_COMPRESSIONTYPE_ZIPS) ||\n      (compression_type == TINYEXR_COMPRESSIONTYPE_ZIP) ||\n      (compression_type == TINYEXR_COMPRESSIONTYPE_PIZ)) {\n#else\n  if ((compression_type == TINYEXR_COMPRESSIONTYPE_NONE) ||\n      (compression_type == TINYEXR_COMPRESSIONTYPE_RLE) ||\n      (compression_type == TINYEXR_COMPRESSIONTYPE_ZIPS) ||\n      (compression_type == TINYEXR_COMPRESSIONTYPE_ZIP)) {\n#endif\n    // OK\n  } else {\n    tinyexr::SetErrorMessage(\"Unsupported compression format\", err);\n    return TINYEXR_ERROR_UNSUPPORTED_FORMAT;\n  }\n\n  deep_image->image = static_cast<float ***>(\n      malloc(sizeof(float **) * static_cast<size_t>(num_channels)));\n  for (int c = 0; c < num_channels; c++) {\n    deep_image->image[c] = static_cast<float **>(\n        malloc(sizeof(float *) * static_cast<size_t>(data_height)));\n    for (int y = 0; y < data_height; y++) {\n    }\n  }\n\n  deep_image->offset_table = static_cast<int **>(\n      malloc(sizeof(int *) * static_cast<size_t>(data_height)));\n  for (int y = 0; y < data_height; y++) {\n    deep_image->offset_table[y] = static_cast<int *>(\n        malloc(sizeof(int) * static_cast<size_t>(data_width)));\n  }\n\n  for (size_t y = 0; y < static_cast<size_t>(num_blocks); y++) {\n    const unsigned char *data_ptr =\n        reinterpret_cast<const unsigned char *>(head + offsets[y]);\n\n    // int: y coordinate\n    // int64: packed size of pixel offset table\n    // int64: packed size of sample data\n    // int64: unpacked size of sample data\n    // compressed pixel offset table\n    // compressed sample data\n    int line_no;\n    tinyexr::tinyexr_int64 packedOffsetTableSize;\n    tinyexr::tinyexr_int64 packedSampleDataSize;\n    tinyexr::tinyexr_int64 unpackedSampleDataSize;\n    memcpy(&line_no, data_ptr, sizeof(int));\n    memcpy(&packedOffsetTableSize, data_ptr + 4,\n           sizeof(tinyexr::tinyexr_int64));\n    memcpy(&packedSampleDataSize, data_ptr + 12,\n           sizeof(tinyexr::tinyexr_int64));\n    memcpy(&unpackedSampleDataSize, data_ptr + 20,\n           sizeof(tinyexr::tinyexr_int64));\n\n    tinyexr::swap4(reinterpret_cast<unsigned int *>(&line_no));\n    tinyexr::swap8(\n        reinterpret_cast<tinyexr::tinyexr_uint64 *>(&packedOffsetTableSize));\n    tinyexr::swap8(\n        reinterpret_cast<tinyexr::tinyexr_uint64 *>(&packedSampleDataSize));\n    tinyexr::swap8(\n        reinterpret_cast<tinyexr::tinyexr_uint64 *>(&unpackedSampleDataSize));\n\n    std::vector<int> pixelOffsetTable(static_cast<size_t>(data_width));\n\n    // decode pixel offset table.\n    {\n      unsigned long dstLen =\n          static_cast<unsigned long>(pixelOffsetTable.size() * sizeof(int));\n      if (!tinyexr::DecompressZip(\n              reinterpret_cast<unsigned char *>(&pixelOffsetTable.at(0)),\n              &dstLen, data_ptr + 28,\n              static_cast<unsigned long>(packedOffsetTableSize))) {\n        return false;\n      }\n\n      assert(dstLen == pixelOffsetTable.size() * sizeof(int));\n      for (size_t i = 0; i < static_cast<size_t>(data_width); i++) {\n        deep_image->offset_table[y][i] = pixelOffsetTable[i];\n      }\n    }\n\n    std::vector<unsigned char> sample_data(\n        static_cast<size_t>(unpackedSampleDataSize));\n\n    // decode sample data.\n    {\n      unsigned long dstLen = static_cast<unsigned long>(unpackedSampleDataSize);\n      if (dstLen) {\n        if (!tinyexr::DecompressZip(\n                reinterpret_cast<unsigned char *>(&sample_data.at(0)), &dstLen,\n                data_ptr + 28 + packedOffsetTableSize,\n                static_cast<unsigned long>(packedSampleDataSize))) {\n          return false;\n        }\n        assert(dstLen == static_cast<unsigned long>(unpackedSampleDataSize));\n      }\n    }\n\n    // decode sample\n    int sampleSize = -1;\n    std::vector<int> channel_offset_list(static_cast<size_t>(num_channels));\n    {\n      int channel_offset = 0;\n      for (size_t i = 0; i < static_cast<size_t>(num_channels); i++) {\n        channel_offset_list[i] = channel_offset;\n        if (channels[i].pixel_type == TINYEXR_PIXELTYPE_UINT) {  // UINT\n          channel_offset += 4;\n        } else if (channels[i].pixel_type == TINYEXR_PIXELTYPE_HALF) {  // half\n          channel_offset += 2;\n        } else if (channels[i].pixel_type ==\n                   TINYEXR_PIXELTYPE_FLOAT) {  // float\n          channel_offset += 4;\n        } else {\n          assert(0);\n        }\n      }\n      sampleSize = channel_offset;\n    }\n    assert(sampleSize >= 2);\n\n    assert(static_cast<size_t>(\n               pixelOffsetTable[static_cast<size_t>(data_width - 1)] *\n               sampleSize) == sample_data.size());\n    int samples_per_line = static_cast<int>(sample_data.size()) / sampleSize;\n\n    //\n    // Alloc memory\n    //\n\n    //\n    // pixel data is stored as image[channels][pixel_samples]\n    //\n    {\n      tinyexr::tinyexr_uint64 data_offset = 0;\n      for (size_t c = 0; c < static_cast<size_t>(num_channels); c++) {\n        deep_image->image[c][y] = static_cast<float *>(\n            malloc(sizeof(float) * static_cast<size_t>(samples_per_line)));\n\n        if (channels[c].pixel_type == 0) {  // UINT\n          for (size_t x = 0; x < static_cast<size_t>(samples_per_line); x++) {\n            unsigned int ui;\n            unsigned int *src_ptr = reinterpret_cast<unsigned int *>(\n                &sample_data.at(size_t(data_offset) + x * sizeof(int)));\n            tinyexr::cpy4(&ui, src_ptr);\n            deep_image->image[c][y][x] = static_cast<float>(ui);  // @fixme\n          }\n          data_offset +=\n              sizeof(unsigned int) * static_cast<size_t>(samples_per_line);\n        } else if (channels[c].pixel_type == 1) {  // half\n          for (size_t x = 0; x < static_cast<size_t>(samples_per_line); x++) {\n            tinyexr::FP16 f16;\n            const unsigned short *src_ptr = reinterpret_cast<unsigned short *>(\n                &sample_data.at(size_t(data_offset) + x * sizeof(short)));\n            tinyexr::cpy2(&(f16.u), src_ptr);\n            tinyexr::FP32 f32 = half_to_float(f16);\n            deep_image->image[c][y][x] = f32.f;\n          }\n          data_offset += sizeof(short) * static_cast<size_t>(samples_per_line);\n        } else {  // float\n          for (size_t x = 0; x < static_cast<size_t>(samples_per_line); x++) {\n            float f;\n            const float *src_ptr = reinterpret_cast<float *>(\n                &sample_data.at(size_t(data_offset) + x * sizeof(float)));\n            tinyexr::cpy4(&f, src_ptr);\n            deep_image->image[c][y][x] = f;\n          }\n          data_offset += sizeof(float) * static_cast<size_t>(samples_per_line);\n        }\n      }\n    }\n  }  // y\n\n  deep_image->width = data_width;\n  deep_image->height = data_height;\n\n  deep_image->channel_names = static_cast<const char **>(\n      malloc(sizeof(const char *) * static_cast<size_t>(num_channels)));\n  for (size_t c = 0; c < static_cast<size_t>(num_channels); c++) {\n#ifdef _WIN32\n    deep_image->channel_names[c] = _strdup(channels[c].name.c_str());\n#else\n    deep_image->channel_names[c] = strdup(channels[c].name.c_str());\n#endif\n  }\n  deep_image->num_channels = num_channels;\n\n  return TINYEXR_SUCCESS;\n}\n\nvoid InitEXRImage(EXRImage *exr_image) {\n  if (exr_image == NULL) {\n    return;\n  }\n\n  exr_image->width = 0;\n  exr_image->height = 0;\n  exr_image->num_channels = 0;\n\n  exr_image->images = NULL;\n  exr_image->tiles = NULL;\n\n  exr_image->num_tiles = 0;\n}\n\nvoid FreeEXRErrorMessage(const char *msg) {\n  if (msg) {\n    free(reinterpret_cast<void *>(const_cast<char *>(msg)));\n  }\n  return;\n}\n\nvoid InitEXRHeader(EXRHeader *exr_header) {\n  if (exr_header == NULL) {\n    return;\n  }\n\n  memset(exr_header, 0, sizeof(EXRHeader));\n}\n\nint FreeEXRHeader(EXRHeader *exr_header) {\n  if (exr_header == NULL) {\n    return TINYEXR_ERROR_INVALID_ARGUMENT;\n  }\n\n  if (exr_header->channels) {\n    free(exr_header->channels);\n  }\n\n  if (exr_header->pixel_types) {\n    free(exr_header->pixel_types);\n  }\n\n  if (exr_header->requested_pixel_types) {\n    free(exr_header->requested_pixel_types);\n  }\n\n  for (int i = 0; i < exr_header->num_custom_attributes; i++) {\n    if (exr_header->custom_attributes[i].value) {\n      free(exr_header->custom_attributes[i].value);\n    }\n  }\n\n  if (exr_header->custom_attributes) {\n    free(exr_header->custom_attributes);\n  }\n\n  return TINYEXR_SUCCESS;\n}\n\nint FreeEXRImage(EXRImage *exr_image) {\n  if (exr_image == NULL) {\n    return TINYEXR_ERROR_INVALID_ARGUMENT;\n  }\n\n  for (int i = 0; i < exr_image->num_channels; i++) {\n    if (exr_image->images && exr_image->images[i]) {\n      free(exr_image->images[i]);\n    }\n  }\n\n  if (exr_image->images) {\n    free(exr_image->images);\n  }\n\n  if (exr_image->tiles) {\n    for (int tid = 0; tid < exr_image->num_tiles; tid++) {\n      for (int i = 0; i < exr_image->num_channels; i++) {\n        if (exr_image->tiles[tid].images && exr_image->tiles[tid].images[i]) {\n          free(exr_image->tiles[tid].images[i]);\n        }\n      }\n      if (exr_image->tiles[tid].images) {\n        free(exr_image->tiles[tid].images);\n      }\n    }\n    free(exr_image->tiles);\n  }\n\n  return TINYEXR_SUCCESS;\n}\n\nint ParseEXRHeaderFromFile(EXRHeader *exr_header, const EXRVersion *exr_version,\n                           const char *filename, const char **err) {\n  if (exr_header == NULL || exr_version == NULL || filename == NULL) {\n    tinyexr::SetErrorMessage(\"Invalid argument for ParseEXRHeaderFromFile\",\n                             err);\n    return TINYEXR_ERROR_INVALID_ARGUMENT;\n  }\n\n#ifdef _WIN32\n  FILE *fp = NULL;\n  fopen_s(&fp, filename, \"rb\");\n#else\n  FILE *fp = fopen(filename, \"rb\");\n#endif\n  if (!fp) {\n    tinyexr::SetErrorMessage(\"Cannot read file \" + std::string(filename), err);\n    return TINYEXR_ERROR_CANT_OPEN_FILE;\n  }\n\n  size_t filesize;\n  // Compute size\n  fseek(fp, 0, SEEK_END);\n  filesize = static_cast<size_t>(ftell(fp));\n  fseek(fp, 0, SEEK_SET);\n\n  std::vector<unsigned char> buf(filesize);  // @todo { use mmap }\n  {\n    size_t ret;\n    ret = fread(&buf[0], 1, filesize, fp);\n    assert(ret == filesize);\n    fclose(fp);\n\n    if (ret != filesize) {\n      tinyexr::SetErrorMessage(\"fread() error on \" + std::string(filename),\n                               err);\n      return TINYEXR_ERROR_INVALID_FILE;\n    }\n  }\n\n  return ParseEXRHeaderFromMemory(exr_header, exr_version, &buf.at(0), filesize,\n                                  err);\n}\n\nint ParseEXRMultipartHeaderFromMemory(EXRHeader ***exr_headers,\n                                      int *num_headers,\n                                      const EXRVersion *exr_version,\n                                      const unsigned char *memory, size_t size,\n                                      const char **err) {\n  if (memory == NULL || exr_headers == NULL || num_headers == NULL ||\n      exr_version == NULL) {\n    // Invalid argument\n    tinyexr::SetErrorMessage(\n        \"Invalid argument for ParseEXRMultipartHeaderFromMemory\", err);\n    return TINYEXR_ERROR_INVALID_ARGUMENT;\n  }\n\n  if (size < tinyexr::kEXRVersionSize) {\n    tinyexr::SetErrorMessage(\"Data size too short\", err);\n    return TINYEXR_ERROR_INVALID_DATA;\n  }\n\n  const unsigned char *marker = memory + tinyexr::kEXRVersionSize;\n  size_t marker_size = size - tinyexr::kEXRVersionSize;\n\n  std::vector<tinyexr::HeaderInfo> infos;\n\n  for (;;) {\n    tinyexr::HeaderInfo info;\n    info.clear();\n\n    std::string err_str;\n    bool empty_header = false;\n    int ret = ParseEXRHeader(&info, &empty_header, exr_version, &err_str,\n                             marker, marker_size);\n\n    if (ret != TINYEXR_SUCCESS) {\n      tinyexr::SetErrorMessage(err_str, err);\n      return ret;\n    }\n\n    if (empty_header) {\n      marker += 1;  // skip '\\0'\n      break;\n    }\n\n    // `chunkCount` must exist in the header.\n    if (info.chunk_count == 0) {\n      tinyexr::SetErrorMessage(\n          \"`chunkCount' attribute is not found in the header.\", err);\n      return TINYEXR_ERROR_INVALID_DATA;\n    }\n\n    infos.push_back(info);\n\n    // move to next header.\n    marker += info.header_len;\n    size -= info.header_len;\n  }\n\n  // allocate memory for EXRHeader and create array of EXRHeader pointers.\n  (*exr_headers) =\n      static_cast<EXRHeader **>(malloc(sizeof(EXRHeader *) * infos.size()));\n  for (size_t i = 0; i < infos.size(); i++) {\n    EXRHeader *exr_header = static_cast<EXRHeader *>(malloc(sizeof(EXRHeader)));\n\n    ConvertHeader(exr_header, infos[i]);\n\n    // transfoer `tiled` from version.\n    exr_header->tiled = exr_version->tiled;\n\n    (*exr_headers)[i] = exr_header;\n  }\n\n  (*num_headers) = static_cast<int>(infos.size());\n\n  return TINYEXR_SUCCESS;\n}\n\nint ParseEXRMultipartHeaderFromFile(EXRHeader ***exr_headers, int *num_headers,\n                                    const EXRVersion *exr_version,\n                                    const char *filename, const char **err) {\n  if (exr_headers == NULL || num_headers == NULL || exr_version == NULL ||\n      filename == NULL) {\n    tinyexr::SetErrorMessage(\n        \"Invalid argument for ParseEXRMultipartHeaderFromFile()\", err);\n    return TINYEXR_ERROR_INVALID_ARGUMENT;\n  }\n\n#ifdef _WIN32\n  FILE *fp = NULL;\n  fopen_s(&fp, filename, \"rb\");\n#else\n  FILE *fp = fopen(filename, \"rb\");\n#endif\n  if (!fp) {\n    tinyexr::SetErrorMessage(\"Cannot read file \" + std::string(filename), err);\n    return TINYEXR_ERROR_CANT_OPEN_FILE;\n  }\n\n  size_t filesize;\n  // Compute size\n  fseek(fp, 0, SEEK_END);\n  filesize = static_cast<size_t>(ftell(fp));\n  fseek(fp, 0, SEEK_SET);\n\n  std::vector<unsigned char> buf(filesize);  // @todo { use mmap }\n  {\n    size_t ret;\n    ret = fread(&buf[0], 1, filesize, fp);\n    assert(ret == filesize);\n    fclose(fp);\n\n    if (ret != filesize) {\n      tinyexr::SetErrorMessage(\"`fread' error. file may be corrupted.\", err);\n      return TINYEXR_ERROR_INVALID_FILE;\n    }\n  }\n\n  return ParseEXRMultipartHeaderFromMemory(\n      exr_headers, num_headers, exr_version, &buf.at(0), filesize, err);\n}\n\nint ParseEXRVersionFromMemory(EXRVersion *version, const unsigned char *memory,\n                              size_t size) {\n  if (version == NULL || memory == NULL) {\n    return TINYEXR_ERROR_INVALID_ARGUMENT;\n  }\n\n  if (size < tinyexr::kEXRVersionSize) {\n    return TINYEXR_ERROR_INVALID_DATA;\n  }\n\n  const unsigned char *marker = memory;\n\n  // Header check.\n  {\n    const char header[] = {0x76, 0x2f, 0x31, 0x01};\n\n    if (memcmp(marker, header, 4) != 0) {\n      return TINYEXR_ERROR_INVALID_MAGIC_NUMBER;\n    }\n    marker += 4;\n  }\n\n  version->tiled = false;\n  version->long_name = false;\n  version->non_image = false;\n  version->multipart = false;\n\n  // Parse version header.\n  {\n    // must be 2\n    if (marker[0] != 2) {\n      return TINYEXR_ERROR_INVALID_EXR_VERSION;\n    }\n\n    if (version == NULL) {\n      return TINYEXR_SUCCESS;  // May OK\n    }\n\n    version->version = 2;\n\n    if (marker[1] & 0x2) {  // 9th bit\n      version->tiled = true;\n    }\n    if (marker[1] & 0x4) {  // 10th bit\n      version->long_name = true;\n    }\n    if (marker[1] & 0x8) {        // 11th bit\n      version->non_image = true;  // (deep image)\n    }\n    if (marker[1] & 0x10) {  // 12th bit\n      version->multipart = true;\n    }\n  }\n\n  return TINYEXR_SUCCESS;\n}\n\nint ParseEXRVersionFromFile(EXRVersion *version, const char *filename) {\n  if (filename == NULL) {\n    return TINYEXR_ERROR_INVALID_ARGUMENT;\n  }\n\n#ifdef _WIN32\n  FILE *fp = NULL;\n  fopen_s(&fp, filename, \"rb\");\n#else\n  FILE *fp = fopen(filename, \"rb\");\n#endif\n  if (!fp) {\n    return TINYEXR_ERROR_CANT_OPEN_FILE;\n  }\n\n  size_t file_size;\n  // Compute size\n  fseek(fp, 0, SEEK_END);\n  file_size = static_cast<size_t>(ftell(fp));\n  fseek(fp, 0, SEEK_SET);\n\n  if (file_size < tinyexr::kEXRVersionSize) {\n    return TINYEXR_ERROR_INVALID_FILE;\n  }\n\n  unsigned char buf[tinyexr::kEXRVersionSize];\n  size_t ret = fread(&buf[0], 1, tinyexr::kEXRVersionSize, fp);\n  fclose(fp);\n\n  if (ret != tinyexr::kEXRVersionSize) {\n    return TINYEXR_ERROR_INVALID_FILE;\n  }\n\n  return ParseEXRVersionFromMemory(version, buf, tinyexr::kEXRVersionSize);\n}\n\nint LoadEXRMultipartImageFromMemory(EXRImage *exr_images,\n                                    const EXRHeader **exr_headers,\n                                    unsigned int num_parts,\n                                    const unsigned char *memory,\n                                    const size_t size, const char **err) {\n  if (exr_images == NULL || exr_headers == NULL || num_parts == 0 ||\n      memory == NULL || (size <= tinyexr::kEXRVersionSize)) {\n    tinyexr::SetErrorMessage(\n        \"Invalid argument for LoadEXRMultipartImageFromMemory()\", err);\n    return TINYEXR_ERROR_INVALID_ARGUMENT;\n  }\n\n  // compute total header size.\n  size_t total_header_size = 0;\n  for (unsigned int i = 0; i < num_parts; i++) {\n    if (exr_headers[i]->header_len == 0) {\n      tinyexr::SetErrorMessage(\"EXRHeader variable is not initialized.\", err);\n      return TINYEXR_ERROR_INVALID_ARGUMENT;\n    }\n\n    total_header_size += exr_headers[i]->header_len;\n  }\n\n  const char *marker = reinterpret_cast<const char *>(\n      memory + total_header_size + 4 +\n      4);  // +8 for magic number and version header.\n\n  marker += 1;  // Skip empty header.\n\n  // NOTE 1:\n  //   In multipart image, There is 'part number' before chunk data.\n  //   4 byte : part number\n  //   4+     : chunk\n  //\n  // NOTE 2:\n  //   EXR spec says 'part number' is 'unsigned long' but actually this is\n  //   'unsigned int(4 bytes)' in OpenEXR implementation...\n  //   http://www.openexr.com/openexrfilelayout.pdf\n\n  // Load chunk offset table.\n  std::vector<std::vector<tinyexr::tinyexr_uint64> > chunk_offset_table_list;\n  for (size_t i = 0; i < static_cast<size_t>(num_parts); i++) {\n    std::vector<tinyexr::tinyexr_uint64> offset_table(\n        static_cast<size_t>(exr_headers[i]->chunk_count));\n\n    for (size_t c = 0; c < offset_table.size(); c++) {\n      tinyexr::tinyexr_uint64 offset;\n      memcpy(&offset, marker, 8);\n      tinyexr::swap8(&offset);\n\n      if (offset >= size) {\n        tinyexr::SetErrorMessage(\"Invalid offset size in EXR header chunks.\",\n                                 err);\n        return TINYEXR_ERROR_INVALID_DATA;\n      }\n\n      offset_table[c] = offset + 4;  // +4 to skip 'part number'\n      marker += 8;\n    }\n\n    chunk_offset_table_list.push_back(offset_table);\n  }\n\n  // Decode image.\n  for (size_t i = 0; i < static_cast<size_t>(num_parts); i++) {\n    std::vector<tinyexr::tinyexr_uint64> &offset_table =\n        chunk_offset_table_list[i];\n\n    // First check 'part number' is identitical to 'i'\n    for (size_t c = 0; c < offset_table.size(); c++) {\n      const unsigned char *part_number_addr =\n          memory + offset_table[c] - 4;  // -4 to move to 'part number' field.\n      unsigned int part_no;\n      memcpy(&part_no, part_number_addr, sizeof(unsigned int));  // 4\n      tinyexr::swap4(&part_no);\n\n      if (part_no != i) {\n        tinyexr::SetErrorMessage(\"Invalid `part number' in EXR header chunks.\",\n                                 err);\n        return TINYEXR_ERROR_INVALID_DATA;\n      }\n    }\n\n    std::string e;\n    int ret = tinyexr::DecodeChunk(&exr_images[i], exr_headers[i], offset_table,\n                                   memory, size, &e);\n    if (ret != TINYEXR_SUCCESS) {\n      if (!e.empty()) {\n        tinyexr::SetErrorMessage(e, err);\n      }\n      return ret;\n    }\n  }\n\n  return TINYEXR_SUCCESS;\n}\n\nint LoadEXRMultipartImageFromFile(EXRImage *exr_images,\n                                  const EXRHeader **exr_headers,\n                                  unsigned int num_parts, const char *filename,\n                                  const char **err) {\n  if (exr_images == NULL || exr_headers == NULL || num_parts == 0) {\n    tinyexr::SetErrorMessage(\n        \"Invalid argument for LoadEXRMultipartImageFromFile\", err);\n    return TINYEXR_ERROR_INVALID_ARGUMENT;\n  }\n\n#ifdef _WIN32\n  FILE *fp = NULL;\n  fopen_s(&fp, filename, \"rb\");\n#else\n  FILE *fp = fopen(filename, \"rb\");\n#endif\n  if (!fp) {\n    tinyexr::SetErrorMessage(\"Cannot read file \" + std::string(filename), err);\n    return TINYEXR_ERROR_CANT_OPEN_FILE;\n  }\n\n  size_t filesize;\n  // Compute size\n  fseek(fp, 0, SEEK_END);\n  filesize = static_cast<size_t>(ftell(fp));\n  fseek(fp, 0, SEEK_SET);\n\n  std::vector<unsigned char> buf(filesize);  //  @todo { use mmap }\n  {\n    size_t ret;\n    ret = fread(&buf[0], 1, filesize, fp);\n    assert(ret == filesize);\n    fclose(fp);\n    (void)ret;\n  }\n\n  return LoadEXRMultipartImageFromMemory(exr_images, exr_headers, num_parts,\n                                         &buf.at(0), filesize, err);\n}\n\nint SaveEXR(const float *data, int width, int height, int components,\n            const int save_as_fp16, const char *outfilename, const char **err) {\n  if ((components == 1) || components == 3 || components == 4) {\n    // OK\n  } else {\n    std::stringstream ss;\n    ss << \"Unsupported component value : \" << components << std::endl;\n\n    tinyexr::SetErrorMessage(ss.str(), err);\n    return TINYEXR_ERROR_INVALID_ARGUMENT;\n  }\n\n  EXRHeader header;\n  InitEXRHeader(&header);\n\n  if ((width < 16) && (height < 16)) {\n    // No compression for small image.\n    header.compression_type = TINYEXR_COMPRESSIONTYPE_NONE;\n  } else {\n    header.compression_type = TINYEXR_COMPRESSIONTYPE_ZIP;\n  }\n\n  EXRImage image;\n  InitEXRImage(&image);\n\n  image.num_channels = components;\n\n  std::vector<float> images[4];\n\n  if (components == 1) {\n    images[0].resize(static_cast<size_t>(width * height));\n    memcpy(images[0].data(), data, sizeof(float) * size_t(width * height));\n  } else {\n    images[0].resize(static_cast<size_t>(width * height));\n    images[1].resize(static_cast<size_t>(width * height));\n    images[2].resize(static_cast<size_t>(width * height));\n    images[3].resize(static_cast<size_t>(width * height));\n\n    // Split RGB(A)RGB(A)RGB(A)... into R, G and B(and A) layers\n    for (size_t i = 0; i < static_cast<size_t>(width * height); i++) {\n      images[0][i] = data[static_cast<size_t>(components) * i + 0];\n      images[1][i] = data[static_cast<size_t>(components) * i + 1];\n      images[2][i] = data[static_cast<size_t>(components) * i + 2];\n      if (components == 4) {\n        images[3][i] = data[static_cast<size_t>(components) * i + 3];\n      }\n    }\n  }\n\n  float *image_ptr[4] = {0, 0, 0, 0};\n  if (components == 4) {\n    image_ptr[0] = &(images[3].at(0));  // A\n    image_ptr[1] = &(images[2].at(0));  // B\n    image_ptr[2] = &(images[1].at(0));  // G\n    image_ptr[3] = &(images[0].at(0));  // R\n  } else if (components == 3) {\n    image_ptr[0] = &(images[2].at(0));  // B\n    image_ptr[1] = &(images[1].at(0));  // G\n    image_ptr[2] = &(images[0].at(0));  // R\n  } else if (components == 1) {\n    image_ptr[0] = &(images[0].at(0));  // A\n  }\n\n  image.images = reinterpret_cast<unsigned char **>(image_ptr);\n  image.width = width;\n  image.height = height;\n\n  header.num_channels = components;\n  header.channels = static_cast<EXRChannelInfo *>(malloc(\n      sizeof(EXRChannelInfo) * static_cast<size_t>(header.num_channels)));\n  // Must be (A)BGR order, since most of EXR viewers expect this channel order.\n  if (components == 4) {\n#ifdef _MSC_VER\n    strncpy_s(header.channels[0].name, \"A\", 255);\n    strncpy_s(header.channels[1].name, \"B\", 255);\n    strncpy_s(header.channels[2].name, \"G\", 255);\n    strncpy_s(header.channels[3].name, \"R\", 255);\n#else\n    strncpy(header.channels[0].name, \"A\", 255);\n    strncpy(header.channels[1].name, \"B\", 255);\n    strncpy(header.channels[2].name, \"G\", 255);\n    strncpy(header.channels[3].name, \"R\", 255);\n#endif\n    header.channels[0].name[strlen(\"A\")] = '\\0';\n    header.channels[1].name[strlen(\"B\")] = '\\0';\n    header.channels[2].name[strlen(\"G\")] = '\\0';\n    header.channels[3].name[strlen(\"R\")] = '\\0';\n  } else if (components == 3) {\n#ifdef _MSC_VER\n    strncpy_s(header.channels[0].name, \"B\", 255);\n    strncpy_s(header.channels[1].name, \"G\", 255);\n    strncpy_s(header.channels[2].name, \"R\", 255);\n#else\n    strncpy(header.channels[0].name, \"B\", 255);\n    strncpy(header.channels[1].name, \"G\", 255);\n    strncpy(header.channels[2].name, \"R\", 255);\n#endif\n    header.channels[0].name[strlen(\"B\")] = '\\0';\n    header.channels[1].name[strlen(\"G\")] = '\\0';\n    header.channels[2].name[strlen(\"R\")] = '\\0';\n  } else {\n#ifdef _MSC_VER\n    strncpy_s(header.channels[0].name, \"A\", 255);\n#else\n    strncpy(header.channels[0].name, \"A\", 255);\n#endif\n    header.channels[0].name[strlen(\"A\")] = '\\0';\n  }\n\n  header.pixel_types = static_cast<int *>(\n      malloc(sizeof(int) * static_cast<size_t>(header.num_channels)));\n  header.requested_pixel_types = static_cast<int *>(\n      malloc(sizeof(int) * static_cast<size_t>(header.num_channels)));\n  for (int i = 0; i < header.num_channels; i++) {\n    header.pixel_types[i] =\n        TINYEXR_PIXELTYPE_FLOAT;  // pixel type of input image\n\n    if (save_as_fp16 > 0) {\n      header.requested_pixel_types[i] =\n          TINYEXR_PIXELTYPE_HALF;  // save with half(fp16) pixel format\n    } else {\n      header.requested_pixel_types[i] =\n          TINYEXR_PIXELTYPE_FLOAT;  // save with float(fp32) pixel format(i.e.\n                                    // no precision reduction)\n    }\n  }\n\n  int ret = SaveEXRImageToFile(&image, &header, outfilename, err);\n  if (ret != TINYEXR_SUCCESS) {\n    return ret;\n  }\n\n  free(header.channels);\n  free(header.pixel_types);\n  free(header.requested_pixel_types);\n\n  return ret;\n}\n\n#ifdef __clang__\n// zero-as-null-ppinter-constant\n#pragma clang diagnostic pop\n#endif\n\n#endif  // TINYEXR_IMPLEMENTATION_DEIFNED\n#endif  // TINYEXR_IMPLEMENTATION\n"
  },
  {
    "path": "src/libraries/utf8/utf8/checked.h",
    "content": "// Copyright 2006 Nemanja Trifunovic\n\n/*\nPermission is hereby granted, free of charge, to any person or organization\nobtaining a copy of the software and accompanying documentation covered by\nthis license (the \"Software\") to use, reproduce, display, distribute,\nexecute, and transmit the Software, and to prepare derivative works of the\nSoftware, and to permit third-parties to whom the Software is furnished to\ndo so, all subject to the following:\n\nThe copyright notices in the Software and this entire statement, including\nthe above license grant, this restriction and the following disclaimer,\nmust be included in all copies of the Software, in whole or in part, and\nall derivative works of the Software, unless such copies or derivative\nworks are solely in the form of machine-executable object code generated by\na source language processor.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\nSHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\nFOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n*/\n\n\n#ifndef UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731\n#define UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731\n\n#include \"core.h\"\n#include <stdexcept>\n\nnamespace utf8\n{\n    // Base for the exceptions that may be thrown from the library\n    class exception : public ::std::exception {\n    };\n\n    // Exceptions that may be thrown from the library functions.\n    class invalid_code_point : public exception {\n        uint32_t cp;\n    public:\n        invalid_code_point(uint32_t cp) : cp(cp) {}\n        virtual const char* what() const throw() { return \"Invalid code point\"; }\n        uint32_t code_point() const {return cp;}\n    };\n\n    class invalid_utf8 : public exception {\n        uint8_t u8;\n    public:\n        invalid_utf8 (uint8_t u) : u8(u) {}\n        virtual const char* what() const throw() { return \"Invalid UTF-8\"; }\n        uint8_t utf8_octet() const {return u8;}\n    };\n\n    class invalid_utf16 : public exception {\n        uint16_t u16;\n    public:\n        invalid_utf16 (uint16_t u) : u16(u) {}\n        virtual const char* what() const throw() { return \"Invalid UTF-16\"; }\n        uint16_t utf16_word() const {return u16;}\n    };\n\n    class not_enough_room : public exception {\n    public:\n        virtual const char* what() const throw() { return \"Not enough space\"; }\n    };\n\n    /// The library API - functions intended to be called by the users\n\n    template <typename octet_iterator>\n    octet_iterator append(uint32_t cp, octet_iterator result)\n    {\n        if (!utf8::internal::is_code_point_valid(cp))\n            throw invalid_code_point(cp);\n\n        if (cp < 0x80)                        // one octet\n            *(result++) = static_cast<uint8_t>(cp);\n        else if (cp < 0x800) {                // two octets\n            *(result++) = static_cast<uint8_t>((cp >> 6)            | 0xc0);\n            *(result++) = static_cast<uint8_t>((cp & 0x3f)          | 0x80);\n        }\n        else if (cp < 0x10000) {              // three octets\n            *(result++) = static_cast<uint8_t>((cp >> 12)           | 0xe0);\n            *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f)   | 0x80);\n            *(result++) = static_cast<uint8_t>((cp & 0x3f)          | 0x80);\n        }\n        else {                                // four octets\n            *(result++) = static_cast<uint8_t>((cp >> 18)           | 0xf0);\n            *(result++) = static_cast<uint8_t>(((cp >> 12) & 0x3f)  | 0x80);\n            *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f)   | 0x80);\n            *(result++) = static_cast<uint8_t>((cp & 0x3f)          | 0x80);\n        }\n        return result;\n    }\n\n    template <typename octet_iterator, typename output_iterator>\n    output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, uint32_t replacement)\n    {\n        while (start != end) {\n            octet_iterator sequence_start = start;\n            internal::utf_error err_code = utf8::internal::validate_next(start, end);\n            switch (err_code) {\n                case internal::UTF8_OK :\n                    for (octet_iterator it = sequence_start; it != start; ++it)\n                        *out++ = *it;\n                    break;\n                case internal::NOT_ENOUGH_ROOM:\n                    throw not_enough_room();\n                case internal::INVALID_LEAD:\n                    out = utf8::append (replacement, out);\n                    ++start;\n                    break;\n                case internal::INCOMPLETE_SEQUENCE:\n                case internal::OVERLONG_SEQUENCE:\n                case internal::INVALID_CODE_POINT:\n                    out = utf8::append (replacement, out);\n                    ++start;\n                    // just one replacement mark for the sequence\n                    while (start != end && utf8::internal::is_trail(*start))\n                        ++start;\n                    break;\n            }\n        }\n        return out;\n    }\n\n    template <typename octet_iterator, typename output_iterator>\n    inline output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out)\n    {\n        static const uint32_t replacement_marker = utf8::internal::mask16(0xfffd);\n        return utf8::replace_invalid(start, end, out, replacement_marker);\n    }\n\n    template <typename octet_iterator>\n    uint32_t next(octet_iterator& it, octet_iterator end)\n    {\n        uint32_t cp = 0;\n        internal::utf_error err_code = utf8::internal::validate_next(it, end, cp);\n        switch (err_code) {\n            case internal::UTF8_OK :\n                break;\n            case internal::NOT_ENOUGH_ROOM :\n                throw not_enough_room();\n            case internal::INVALID_LEAD :\n            case internal::INCOMPLETE_SEQUENCE :\n            case internal::OVERLONG_SEQUENCE :\n                throw invalid_utf8(*it);\n            case internal::INVALID_CODE_POINT :\n                throw invalid_code_point(cp);\n        }\n        return cp;\n    }\n\n    template <typename octet_iterator>\n    uint32_t peek_next(octet_iterator it, octet_iterator end)\n    {\n        return utf8::next(it, end);\n    }\n\n    template <typename octet_iterator>\n    uint32_t prior(octet_iterator& it, octet_iterator start)\n    {\n        // can't do much if it == start\n        if (it == start)\n            throw not_enough_room();\n\n        octet_iterator end = it;\n        // Go back until we hit either a lead octet or start\n        while (utf8::internal::is_trail(*(--it)))\n            if (it == start)\n                throw invalid_utf8(*it); // error - no lead byte in the sequence\n        return utf8::peek_next(it, end);\n    }\n\n    /// Deprecated in versions that include \"prior\"\n    template <typename octet_iterator>\n    uint32_t previous(octet_iterator& it, octet_iterator pass_start)\n    {\n        octet_iterator end = it;\n        while (utf8::internal::is_trail(*(--it)))\n            if (it == pass_start)\n                throw invalid_utf8(*it); // error - no lead byte in the sequence\n        octet_iterator temp = it;\n        return utf8::next(temp, end);\n    }\n\n    template <typename octet_iterator, typename distance_type>\n    void advance (octet_iterator& it, distance_type n, octet_iterator end)\n    {\n        for (distance_type i = 0; i < n; ++i)\n            utf8::next(it, end);\n    }\n\n    template <typename octet_iterator>\n    typename std::iterator_traits<octet_iterator>::difference_type\n    distance (octet_iterator first, octet_iterator last)\n    {\n        typename std::iterator_traits<octet_iterator>::difference_type dist;\n        for (dist = 0; first < last; ++dist)\n            utf8::next(first, last);\n        return dist;\n    }\n\n    template <typename u16bit_iterator, typename octet_iterator>\n    octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result)\n    {\n        while (start != end) {\n            uint32_t cp = utf8::internal::mask16(*start++);\n            // Take care of surrogate pairs first\n            if (utf8::internal::is_lead_surrogate(cp)) {\n                if (start != end) {\n                    uint32_t trail_surrogate = utf8::internal::mask16(*start++);\n                    if (utf8::internal::is_trail_surrogate(trail_surrogate))\n                        cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET;\n                    else\n                        throw invalid_utf16(static_cast<uint16_t>(trail_surrogate));\n                }\n                else\n                    throw invalid_utf16(static_cast<uint16_t>(cp));\n\n            }\n            // Lone trail surrogate\n            else if (utf8::internal::is_trail_surrogate(cp))\n                throw invalid_utf16(static_cast<uint16_t>(cp));\n\n            result = utf8::append(cp, result);\n        }\n        return result;\n    }\n\n    template <typename u16bit_iterator, typename octet_iterator>\n    u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result)\n    {\n        while (start != end) {\n            uint32_t cp = utf8::next(start, end);\n            if (cp > 0xffff) { //make a surrogate pair\n                *result++ = static_cast<uint16_t>((cp >> 10)   + internal::LEAD_OFFSET);\n                *result++ = static_cast<uint16_t>((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN);\n            }\n            else\n                *result++ = static_cast<uint16_t>(cp);\n        }\n        return result;\n    }\n\n    template <typename octet_iterator, typename u32bit_iterator>\n    octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result)\n    {\n        while (start != end)\n            result = utf8::append(*(start++), result);\n\n        return result;\n    }\n\n    template <typename octet_iterator, typename u32bit_iterator>\n    u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result)\n    {\n        while (start != end)\n            (*result++) = utf8::next(start, end);\n\n        return result;\n    }\n\n    // The iterator class\n    template <typename octet_iterator>\n    class iterator : public std::iterator <std::bidirectional_iterator_tag, uint32_t> {\n      octet_iterator it;\n      octet_iterator range_start;\n      octet_iterator range_end;\n      public:\n      iterator () {}\n      explicit iterator (const octet_iterator& octet_it,\n                         const octet_iterator& range_start,\n                         const octet_iterator& range_end) :\n               it(octet_it), range_start(range_start), range_end(range_end)\n      {\n          if (it < range_start || it > range_end)\n              throw std::out_of_range(\"Invalid utf-8 iterator position\");\n      }\n      // the default \"big three\" are OK\n      octet_iterator base () const { return it; }\n      uint32_t operator * () const\n      {\n          octet_iterator temp = it;\n          return utf8::next(temp, range_end);\n      }\n      bool operator == (const iterator& rhs) const\n      {\n          if (range_start != rhs.range_start || range_end != rhs.range_end)\n              throw std::logic_error(\"Comparing utf-8 iterators defined with different ranges\");\n          return (it == rhs.it);\n      }\n      bool operator != (const iterator& rhs) const\n      {\n          return !(operator == (rhs));\n      }\n      iterator& operator ++ ()\n      {\n          utf8::next(it, range_end);\n          return *this;\n      }\n      iterator operator ++ (int)\n      {\n          iterator temp = *this;\n          utf8::next(it, range_end);\n          return temp;\n      }\n      iterator& operator -- ()\n      {\n          utf8::prior(it, range_start);\n          return *this;\n      }\n      iterator operator -- (int)\n      {\n          iterator temp = *this;\n          utf8::prior(it, range_start);\n          return temp;\n      }\n    }; // class iterator\n\n} // namespace utf8\n\n#endif //header guard\n\n\n"
  },
  {
    "path": "src/libraries/utf8/utf8/core.h",
    "content": "// Copyright 2006 Nemanja Trifunovic\n\n/*\nPermission is hereby granted, free of charge, to any person or organization\nobtaining a copy of the software and accompanying documentation covered by\nthis license (the \"Software\") to use, reproduce, display, distribute,\nexecute, and transmit the Software, and to prepare derivative works of the\nSoftware, and to permit third-parties to whom the Software is furnished to\ndo so, all subject to the following:\n\nThe copyright notices in the Software and this entire statement, including\nthe above license grant, this restriction and the following disclaimer,\nmust be included in all copies of the Software, in whole or in part, and\nall derivative works of the Software, unless such copies or derivative\nworks are solely in the form of machine-executable object code generated by\na source language processor.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\nSHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\nFOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n*/\n\n\n#ifndef UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731\n#define UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731\n\n#include <iterator>\n\nnamespace utf8\n{\n    // The typedefs for 8-bit, 16-bit and 32-bit unsigned integers\n    // You may need to change them to match your system.\n    // These typedefs have the same names as ones from cstdint, or boost/cstdint\n    typedef unsigned char   uint8_t;\n    typedef unsigned short  uint16_t;\n    typedef unsigned int    uint32_t;\n\n// Helper code - not intended to be directly called by the library users. May be changed at any time\nnamespace internal\n{\n    // Unicode constants\n    // Leading (high) surrogates: 0xd800 - 0xdbff\n    // Trailing (low) surrogates: 0xdc00 - 0xdfff\n    const uint16_t LEAD_SURROGATE_MIN  = 0xd800u;\n    const uint16_t LEAD_SURROGATE_MAX  = 0xdbffu;\n    const uint16_t TRAIL_SURROGATE_MIN = 0xdc00u;\n    const uint16_t TRAIL_SURROGATE_MAX = 0xdfffu;\n    const uint16_t LEAD_OFFSET         = LEAD_SURROGATE_MIN - (0x10000 >> 10);\n    const uint32_t SURROGATE_OFFSET    = 0x10000u - (LEAD_SURROGATE_MIN << 10) - TRAIL_SURROGATE_MIN;\n\n    // Maximum valid value for a Unicode code point\n    const uint32_t CODE_POINT_MAX      = 0x0010ffffu;\n\n    template<typename octet_type>\n    inline uint8_t mask8(octet_type oc)\n    {\n        return static_cast<uint8_t>(0xff & oc);\n    }\n    template<typename u16_type>\n    inline uint16_t mask16(u16_type oc)\n    {\n        return static_cast<uint16_t>(0xffff & oc);\n    }\n    template<typename octet_type>\n    inline bool is_trail(octet_type oc)\n    {\n        return ((utf8::internal::mask8(oc) >> 6) == 0x2);\n    }\n\n    template <typename u16>\n    inline bool is_lead_surrogate(u16 cp)\n    {\n        return (cp >= LEAD_SURROGATE_MIN && cp <= LEAD_SURROGATE_MAX);\n    }\n\n    template <typename u16>\n    inline bool is_trail_surrogate(u16 cp)\n    {\n        return (cp >= TRAIL_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX);\n    }\n\n    template <typename u16>\n    inline bool is_surrogate(u16 cp)\n    {\n        return (cp >= LEAD_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX);\n    }\n\n    template <typename u32>\n    inline bool is_code_point_valid(u32 cp)\n    {\n        return (cp <= CODE_POINT_MAX && !utf8::internal::is_surrogate(cp));\n    }\n\n    template <typename octet_iterator>\n    inline typename std::iterator_traits<octet_iterator>::difference_type\n    sequence_length(octet_iterator lead_it)\n    {\n        uint8_t lead = utf8::internal::mask8(*lead_it);\n        if (lead < 0x80)\n            return 1;\n        else if ((lead >> 5) == 0x6)\n            return 2;\n        else if ((lead >> 4) == 0xe)\n            return 3;\n        else if ((lead >> 3) == 0x1e)\n            return 4;\n        else\n            return 0;\n    }\n\n    template <typename octet_difference_type>\n    inline bool is_overlong_sequence(uint32_t cp, octet_difference_type length)\n    {\n        if (cp < 0x80) {\n            if (length != 1) \n                return true;\n        }\n        else if (cp < 0x800) {\n            if (length != 2) \n                return true;\n        }\n        else if (cp < 0x10000) {\n            if (length != 3) \n                return true;\n        }\n\n        return false;\n    }\n\n    enum utf_error {UTF8_OK, NOT_ENOUGH_ROOM, INVALID_LEAD, INCOMPLETE_SEQUENCE, OVERLONG_SEQUENCE, INVALID_CODE_POINT};\n\n    /// Helper for get_sequence_x\n    template <typename octet_iterator>\n    utf_error increase_safely(octet_iterator& it, octet_iterator end)\n    {\n        if (++it == end)\n            return NOT_ENOUGH_ROOM;\n\n        if (!utf8::internal::is_trail(*it))\n            return INCOMPLETE_SEQUENCE;\n        \n        return UTF8_OK;\n    }\n\n    #define UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(IT, END) {utf_error ret = increase_safely(IT, END); if (ret != UTF8_OK) return ret;}    \n\n    /// get_sequence_x functions decode utf-8 sequences of the length x\n    template <typename octet_iterator>\n    utf_error get_sequence_1(octet_iterator& it, octet_iterator end, uint32_t& code_point)\n    {\n        if (it == end)\n            return NOT_ENOUGH_ROOM;\n\n        code_point = utf8::internal::mask8(*it);\n\n        return UTF8_OK;\n    }\n\n    template <typename octet_iterator>\n    utf_error get_sequence_2(octet_iterator& it, octet_iterator end, uint32_t& code_point)\n    {\n        if (it == end) \n            return NOT_ENOUGH_ROOM;\n        \n        code_point = utf8::internal::mask8(*it);\n\n        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)\n\n        code_point = ((code_point << 6) & 0x7ff) + ((*it) & 0x3f);\n\n        return UTF8_OK;\n    }\n\n    template <typename octet_iterator>\n    utf_error get_sequence_3(octet_iterator& it, octet_iterator end, uint32_t& code_point)\n    {\n        if (it == end)\n            return NOT_ENOUGH_ROOM;\n            \n        code_point = utf8::internal::mask8(*it);\n\n        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)\n\n        code_point = ((code_point << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff);\n\n        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)\n\n        code_point += (*it) & 0x3f;\n\n        return UTF8_OK;\n    }\n\n    template <typename octet_iterator>\n    utf_error get_sequence_4(octet_iterator& it, octet_iterator end, uint32_t& code_point)\n    {\n        if (it == end)\n           return NOT_ENOUGH_ROOM;\n\n        code_point = utf8::internal::mask8(*it);\n\n        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)\n\n        code_point = ((code_point << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff);\n\n        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)\n\n        code_point += (utf8::internal::mask8(*it) << 6) & 0xfff;\n\n        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)\n\n        code_point += (*it) & 0x3f;\n\n        return UTF8_OK;\n    }\n\n    #undef UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR\n\n    template <typename octet_iterator>\n    utf_error validate_next(octet_iterator& it, octet_iterator end, uint32_t& code_point)\n    {\n        // Save the original value of it so we can go back in case of failure\n        // Of course, it does not make much sense with i.e. stream iterators\n        octet_iterator original_it = it;\n\n        uint32_t cp = 0;\n        // Determine the sequence length based on the lead octet\n        typedef typename std::iterator_traits<octet_iterator>::difference_type octet_difference_type;\n        const octet_difference_type length = utf8::internal::sequence_length(it);\n\n        // Get trail octets and calculate the code point\n        utf_error err = UTF8_OK;\n        switch (length) {\n            case 0: \n                return INVALID_LEAD;\n            case 1:\n                err = utf8::internal::get_sequence_1(it, end, cp);\n                break;\n            case 2:\n                err = utf8::internal::get_sequence_2(it, end, cp);\n            break;\n            case 3:\n                err = utf8::internal::get_sequence_3(it, end, cp);\n            break;\n            case 4:\n                err = utf8::internal::get_sequence_4(it, end, cp);\n            break;\n        }\n\n        if (err == UTF8_OK) {\n            // Decoding succeeded. Now, security checks...\n            if (utf8::internal::is_code_point_valid(cp)) {\n                if (!utf8::internal::is_overlong_sequence(cp, length)){\n                    // Passed! Return here.\n                    code_point = cp;\n                    ++it;\n                    return UTF8_OK;\n                }\n                else\n                    err = OVERLONG_SEQUENCE;\n            }\n            else \n                err = INVALID_CODE_POINT;\n        }\n\n        // Failure branch - restore the original value of the iterator\n        it = original_it;\n        return err;\n    }\n\n    template <typename octet_iterator>\n    inline utf_error validate_next(octet_iterator& it, octet_iterator end) {\n        uint32_t ignored;\n        return utf8::internal::validate_next(it, end, ignored);\n    }\n\n} // namespace internal\n\n    /// The library API - functions intended to be called by the users\n\n    // Byte order mark\n    const uint8_t bom[] = {0xef, 0xbb, 0xbf};\n\n    template <typename octet_iterator>\n    octet_iterator find_invalid(octet_iterator start, octet_iterator end)\n    {\n        octet_iterator result = start;\n        while (result != end) {\n            utf8::internal::utf_error err_code = utf8::internal::validate_next(result, end);\n            if (err_code != internal::UTF8_OK)\n                return result;\n        }\n        return result;\n    }\n\n    template <typename octet_iterator>\n    inline bool is_valid(octet_iterator start, octet_iterator end)\n    {\n        return (utf8::find_invalid(start, end) == end);\n    }\n\n    template <typename octet_iterator>\n    inline bool starts_with_bom (octet_iterator it, octet_iterator end)\n    {\n        return (\n            ((it != end) && (utf8::internal::mask8(*it++)) == bom[0]) &&\n            ((it != end) && (utf8::internal::mask8(*it++)) == bom[1]) &&\n            ((it != end) && (utf8::internal::mask8(*it))   == bom[2])\n           );\n    }\n\t\n    //Deprecated in release 2.3 \n    template <typename octet_iterator>\n    inline bool is_bom (octet_iterator it)\n    {\n        return (\n            (utf8::internal::mask8(*it++)) == bom[0] &&\n            (utf8::internal::mask8(*it++)) == bom[1] &&\n            (utf8::internal::mask8(*it))   == bom[2]\n           );\n    }\n} // namespace utf8\n\n#endif // header guard\n\n\n"
  },
  {
    "path": "src/libraries/utf8/utf8/unchecked.h",
    "content": "// Copyright 2006 Nemanja Trifunovic\n\n/*\nPermission is hereby granted, free of charge, to any person or organization\nobtaining a copy of the software and accompanying documentation covered by\nthis license (the \"Software\") to use, reproduce, display, distribute,\nexecute, and transmit the Software, and to prepare derivative works of the\nSoftware, and to permit third-parties to whom the Software is furnished to\ndo so, all subject to the following:\n\nThe copyright notices in the Software and this entire statement, including\nthe above license grant, this restriction and the following disclaimer,\nmust be included in all copies of the Software, in whole or in part, and\nall derivative works of the Software, unless such copies or derivative\nworks are solely in the form of machine-executable object code generated by\na source language processor.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\nSHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\nFOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n*/\n\n\n#ifndef UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731\n#define UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731\n\n#include \"core.h\"\n\nnamespace utf8\n{\n    namespace unchecked \n    {\n        template <typename octet_iterator>\n        octet_iterator append(uint32_t cp, octet_iterator result)\n        {\n            if (cp < 0x80)                        // one octet\n                *(result++) = static_cast<uint8_t>(cp);  \n            else if (cp < 0x800) {                // two octets\n                *(result++) = static_cast<uint8_t>((cp >> 6)          | 0xc0);\n                *(result++) = static_cast<uint8_t>((cp & 0x3f)        | 0x80);\n            }\n            else if (cp < 0x10000) {              // three octets\n                *(result++) = static_cast<uint8_t>((cp >> 12)         | 0xe0);\n                *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80);\n                *(result++) = static_cast<uint8_t>((cp & 0x3f)        | 0x80);\n            }\n            else {                                // four octets\n                *(result++) = static_cast<uint8_t>((cp >> 18)         | 0xf0);\n                *(result++) = static_cast<uint8_t>(((cp >> 12) & 0x3f)| 0x80);\n                *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80);\n                *(result++) = static_cast<uint8_t>((cp & 0x3f)        | 0x80);\n            }\n            return result;\n        }\n\n        template <typename octet_iterator>\n        uint32_t next(octet_iterator& it)\n        {\n            uint32_t cp = utf8::internal::mask8(*it);\n            typename std::iterator_traits<octet_iterator>::difference_type length = utf8::internal::sequence_length(it);\n            switch (length) {\n                case 1:\n                    break;\n                case 2:\n                    it++;\n                    cp = ((cp << 6) & 0x7ff) + ((*it) & 0x3f);\n                    break;\n                case 3:\n                    ++it; \n                    cp = ((cp << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff);\n                    ++it;\n                    cp += (*it) & 0x3f;\n                    break;\n                case 4:\n                    ++it;\n                    cp = ((cp << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff);                \n                    ++it;\n                    cp += (utf8::internal::mask8(*it) << 6) & 0xfff;\n                    ++it;\n                    cp += (*it) & 0x3f; \n                    break;\n            }\n            ++it;\n            return cp;        \n        }\n\n        template <typename octet_iterator>\n        uint32_t peek_next(octet_iterator it)\n        {\n            return utf8::unchecked::next(it);    \n        }\n\n        template <typename octet_iterator>\n        uint32_t prior(octet_iterator& it)\n        {\n            while (utf8::internal::is_trail(*(--it))) ;\n            octet_iterator temp = it;\n            return utf8::unchecked::next(temp);\n        }\n\n        // Deprecated in versions that include prior, but only for the sake of consistency (see utf8::previous)\n        template <typename octet_iterator>\n        inline uint32_t previous(octet_iterator& it)\n        {\n            return utf8::unchecked::prior(it);\n        }\n\n        template <typename octet_iterator, typename distance_type>\n        void advance (octet_iterator& it, distance_type n)\n        {\n            for (distance_type i = 0; i < n; ++i)\n                utf8::unchecked::next(it);\n        }\n\n        template <typename octet_iterator>\n        typename std::iterator_traits<octet_iterator>::difference_type\n        distance (octet_iterator first, octet_iterator last)\n        {\n            typename std::iterator_traits<octet_iterator>::difference_type dist;\n            for (dist = 0; first < last; ++dist) \n                utf8::unchecked::next(first);\n            return dist;\n        }\n\n        template <typename u16bit_iterator, typename octet_iterator>\n        octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result)\n        {       \n            while (start != end) {\n                uint32_t cp = utf8::internal::mask16(*start++);\n            // Take care of surrogate pairs first\n                if (utf8::internal::is_lead_surrogate(cp)) {\n                    uint32_t trail_surrogate = utf8::internal::mask16(*start++);\n                    cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET;\n                }\n                result = utf8::unchecked::append(cp, result);\n            }\n            return result;         \n        }\n\n        template <typename u16bit_iterator, typename octet_iterator>\n        u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result)\n        {\n            while (start < end) {\n                uint32_t cp = utf8::unchecked::next(start);\n                if (cp > 0xffff) { //make a surrogate pair\n                    *result++ = static_cast<uint16_t>((cp >> 10)   + internal::LEAD_OFFSET);\n                    *result++ = static_cast<uint16_t>((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN);\n                }\n                else\n                    *result++ = static_cast<uint16_t>(cp);\n            }\n            return result;\n        }\n\n        template <typename octet_iterator, typename u32bit_iterator>\n        octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result)\n        {\n            while (start != end)\n                result = utf8::unchecked::append(*(start++), result);\n\n            return result;\n        }\n\n        template <typename octet_iterator, typename u32bit_iterator>\n        u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result)\n        {\n            while (start < end)\n                (*result++) = utf8::unchecked::next(start);\n\n            return result;\n        }\n\n        // The iterator class\n        template <typename octet_iterator>\n          class iterator : public std::iterator <std::bidirectional_iterator_tag, uint32_t> { \n            octet_iterator it;\n            public:\n            iterator () {}\n            explicit iterator (const octet_iterator& octet_it): it(octet_it) {}\n            // the default \"big three\" are OK\n            octet_iterator base () const { return it; }\n            uint32_t operator * () const\n            {\n                octet_iterator temp = it;\n                return utf8::unchecked::next(temp);\n            }\n            bool operator == (const iterator& rhs) const \n            { \n                return (it == rhs.it);\n            }\n            bool operator != (const iterator& rhs) const\n            {\n                return !(operator == (rhs));\n            }\n            iterator& operator ++ () \n            {\n                ::std::advance(it, utf8::internal::sequence_length(it));\n                return *this;\n            }\n            iterator operator ++ (int)\n            {\n                iterator temp = *this;\n                ::std::advance(it, utf8::internal::sequence_length(it));\n                return temp;\n            }  \n            iterator& operator -- ()\n            {\n                utf8::unchecked::prior(it);\n                return *this;\n            }\n            iterator operator -- (int)\n            {\n                iterator temp = *this;\n                utf8::unchecked::prior(it);\n                return temp;\n            }\n          }; // class iterator\n\n    } // namespace utf8::unchecked\n} // namespace utf8 \n\n\n#endif // header guard\n\n"
  },
  {
    "path": "src/libraries/utf8/utf8.h",
    "content": "// Copyright 2006 Nemanja Trifunovic\r\n\r\n/*\r\nPermission is hereby granted, free of charge, to any person or organization\r\nobtaining a copy of the software and accompanying documentation covered by\r\nthis license (the \"Software\") to use, reproduce, display, distribute,\r\nexecute, and transmit the Software, and to prepare derivative works of the\r\nSoftware, and to permit third-parties to whom the Software is furnished to\r\ndo so, all subject to the following:\r\n\r\nThe copyright notices in the Software and this entire statement, including\r\nthe above license grant, this restriction and the following disclaimer,\r\nmust be included in all copies of the Software, in whole or in part, and\r\nall derivative works of the Software, unless such copies or derivative\r\nworks are solely in the form of machine-executable object code generated by\r\na source language processor.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\r\nSHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\r\nFOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\r\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r\nDEALINGS IN THE SOFTWARE.\r\n*/\r\n\r\n\r\n#ifndef UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731\r\n#define UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731\r\n\r\n#include \"utf8/checked.h\"\r\n#include \"utf8/unchecked.h\"\r\n\r\n#endif // header guard\r\n"
  },
  {
    "path": "src/libraries/vk_video/vulkan_video_codec_av1std.h",
    "content": "#ifndef VULKAN_VIDEO_CODEC_AV1STD_H_\n#define VULKAN_VIDEO_CODEC_AV1STD_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// vulkan_video_codec_av1std is a preprocessor guard. Do not pass it to API calls.\n#define vulkan_video_codec_av1std 1\n#include \"vulkan_video_codecs_common.h\"\n#define STD_VIDEO_AV1_NUM_REF_FRAMES      8\n#define STD_VIDEO_AV1_REFS_PER_FRAME      7\n#define STD_VIDEO_AV1_TOTAL_REFS_PER_FRAME 8\n#define STD_VIDEO_AV1_MAX_TILE_COLS       64\n#define STD_VIDEO_AV1_MAX_TILE_ROWS       64\n#define STD_VIDEO_AV1_MAX_SEGMENTS        8\n#define STD_VIDEO_AV1_SEG_LVL_MAX         8\n#define STD_VIDEO_AV1_PRIMARY_REF_NONE    7\n#define STD_VIDEO_AV1_SELECT_INTEGER_MV   2\n#define STD_VIDEO_AV1_SELECT_SCREEN_CONTENT_TOOLS 2\n#define STD_VIDEO_AV1_SKIP_MODE_FRAMES    2\n#define STD_VIDEO_AV1_MAX_LOOP_FILTER_STRENGTHS 4\n#define STD_VIDEO_AV1_LOOP_FILTER_ADJUSTMENTS 2\n#define STD_VIDEO_AV1_MAX_CDEF_FILTER_STRENGTHS 8\n#define STD_VIDEO_AV1_MAX_NUM_PLANES      3\n#define STD_VIDEO_AV1_GLOBAL_MOTION_PARAMS 6\n#define STD_VIDEO_AV1_MAX_NUM_Y_POINTS    14\n#define STD_VIDEO_AV1_MAX_NUM_CB_POINTS   10\n#define STD_VIDEO_AV1_MAX_NUM_CR_POINTS   10\n#define STD_VIDEO_AV1_MAX_NUM_POS_LUMA    24\n#define STD_VIDEO_AV1_MAX_NUM_POS_CHROMA  25\n\ntypedef enum StdVideoAV1Profile {\n    STD_VIDEO_AV1_PROFILE_MAIN = 0,\n    STD_VIDEO_AV1_PROFILE_HIGH = 1,\n    STD_VIDEO_AV1_PROFILE_PROFESSIONAL = 2,\n    STD_VIDEO_AV1_PROFILE_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_AV1_PROFILE_MAX_ENUM = 0x7FFFFFFF\n} StdVideoAV1Profile;\n\ntypedef enum StdVideoAV1Level {\n    STD_VIDEO_AV1_LEVEL_2_0 = 0,\n    STD_VIDEO_AV1_LEVEL_2_1 = 1,\n    STD_VIDEO_AV1_LEVEL_2_2 = 2,\n    STD_VIDEO_AV1_LEVEL_2_3 = 3,\n    STD_VIDEO_AV1_LEVEL_3_0 = 4,\n    STD_VIDEO_AV1_LEVEL_3_1 = 5,\n    STD_VIDEO_AV1_LEVEL_3_2 = 6,\n    STD_VIDEO_AV1_LEVEL_3_3 = 7,\n    STD_VIDEO_AV1_LEVEL_4_0 = 8,\n    STD_VIDEO_AV1_LEVEL_4_1 = 9,\n    STD_VIDEO_AV1_LEVEL_4_2 = 10,\n    STD_VIDEO_AV1_LEVEL_4_3 = 11,\n    STD_VIDEO_AV1_LEVEL_5_0 = 12,\n    STD_VIDEO_AV1_LEVEL_5_1 = 13,\n    STD_VIDEO_AV1_LEVEL_5_2 = 14,\n    STD_VIDEO_AV1_LEVEL_5_3 = 15,\n    STD_VIDEO_AV1_LEVEL_6_0 = 16,\n    STD_VIDEO_AV1_LEVEL_6_1 = 17,\n    STD_VIDEO_AV1_LEVEL_6_2 = 18,\n    STD_VIDEO_AV1_LEVEL_6_3 = 19,\n    STD_VIDEO_AV1_LEVEL_7_0 = 20,\n    STD_VIDEO_AV1_LEVEL_7_1 = 21,\n    STD_VIDEO_AV1_LEVEL_7_2 = 22,\n    STD_VIDEO_AV1_LEVEL_7_3 = 23,\n    STD_VIDEO_AV1_LEVEL_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_AV1_LEVEL_MAX_ENUM = 0x7FFFFFFF\n} StdVideoAV1Level;\n\ntypedef enum StdVideoAV1FrameType {\n    STD_VIDEO_AV1_FRAME_TYPE_KEY = 0,\n    STD_VIDEO_AV1_FRAME_TYPE_INTER = 1,\n    STD_VIDEO_AV1_FRAME_TYPE_INTRA_ONLY = 2,\n    STD_VIDEO_AV1_FRAME_TYPE_SWITCH = 3,\n    STD_VIDEO_AV1_FRAME_TYPE_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_AV1_FRAME_TYPE_MAX_ENUM = 0x7FFFFFFF\n} StdVideoAV1FrameType;\n\ntypedef enum StdVideoAV1ReferenceName {\n    STD_VIDEO_AV1_REFERENCE_NAME_INTRA_FRAME = 0,\n    STD_VIDEO_AV1_REFERENCE_NAME_LAST_FRAME = 1,\n    STD_VIDEO_AV1_REFERENCE_NAME_LAST2_FRAME = 2,\n    STD_VIDEO_AV1_REFERENCE_NAME_LAST3_FRAME = 3,\n    STD_VIDEO_AV1_REFERENCE_NAME_GOLDEN_FRAME = 4,\n    STD_VIDEO_AV1_REFERENCE_NAME_BWDREF_FRAME = 5,\n    STD_VIDEO_AV1_REFERENCE_NAME_ALTREF2_FRAME = 6,\n    STD_VIDEO_AV1_REFERENCE_NAME_ALTREF_FRAME = 7,\n    STD_VIDEO_AV1_REFERENCE_NAME_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_AV1_REFERENCE_NAME_MAX_ENUM = 0x7FFFFFFF\n} StdVideoAV1ReferenceName;\n\ntypedef enum StdVideoAV1InterpolationFilter {\n    STD_VIDEO_AV1_INTERPOLATION_FILTER_EIGHTTAP = 0,\n    STD_VIDEO_AV1_INTERPOLATION_FILTER_EIGHTTAP_SMOOTH = 1,\n    STD_VIDEO_AV1_INTERPOLATION_FILTER_EIGHTTAP_SHARP = 2,\n    STD_VIDEO_AV1_INTERPOLATION_FILTER_BILINEAR = 3,\n    STD_VIDEO_AV1_INTERPOLATION_FILTER_SWITCHABLE = 4,\n    STD_VIDEO_AV1_INTERPOLATION_FILTER_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_AV1_INTERPOLATION_FILTER_MAX_ENUM = 0x7FFFFFFF\n} StdVideoAV1InterpolationFilter;\n\ntypedef enum StdVideoAV1TxMode {\n    STD_VIDEO_AV1_TX_MODE_ONLY_4X4 = 0,\n    STD_VIDEO_AV1_TX_MODE_LARGEST = 1,\n    STD_VIDEO_AV1_TX_MODE_SELECT = 2,\n    STD_VIDEO_AV1_TX_MODE_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_AV1_TX_MODE_MAX_ENUM = 0x7FFFFFFF\n} StdVideoAV1TxMode;\n\ntypedef enum StdVideoAV1FrameRestorationType {\n    STD_VIDEO_AV1_FRAME_RESTORATION_TYPE_NONE = 0,\n    STD_VIDEO_AV1_FRAME_RESTORATION_TYPE_WIENER = 1,\n    STD_VIDEO_AV1_FRAME_RESTORATION_TYPE_SGRPROJ = 2,\n    STD_VIDEO_AV1_FRAME_RESTORATION_TYPE_SWITCHABLE = 3,\n    STD_VIDEO_AV1_FRAME_RESTORATION_TYPE_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_AV1_FRAME_RESTORATION_TYPE_MAX_ENUM = 0x7FFFFFFF\n} StdVideoAV1FrameRestorationType;\n\ntypedef enum StdVideoAV1ColorPrimaries {\n    STD_VIDEO_AV1_COLOR_PRIMARIES_BT_709 = 1,\n    STD_VIDEO_AV1_COLOR_PRIMARIES_UNSPECIFIED = 2,\n    STD_VIDEO_AV1_COLOR_PRIMARIES_BT_470_M = 4,\n    STD_VIDEO_AV1_COLOR_PRIMARIES_BT_470_B_G = 5,\n    STD_VIDEO_AV1_COLOR_PRIMARIES_BT_601 = 6,\n    STD_VIDEO_AV1_COLOR_PRIMARIES_SMPTE_240 = 7,\n    STD_VIDEO_AV1_COLOR_PRIMARIES_GENERIC_FILM = 8,\n    STD_VIDEO_AV1_COLOR_PRIMARIES_BT_2020 = 9,\n    STD_VIDEO_AV1_COLOR_PRIMARIES_XYZ = 10,\n    STD_VIDEO_AV1_COLOR_PRIMARIES_SMPTE_431 = 11,\n    STD_VIDEO_AV1_COLOR_PRIMARIES_SMPTE_432 = 12,\n    STD_VIDEO_AV1_COLOR_PRIMARIES_EBU_3213 = 22,\n    STD_VIDEO_AV1_COLOR_PRIMARIES_INVALID = 0x7FFFFFFF,\n  // STD_VIDEO_AV1_COLOR_PRIMARIES_BT_UNSPECIFIED is a deprecated alias\n    STD_VIDEO_AV1_COLOR_PRIMARIES_BT_UNSPECIFIED = STD_VIDEO_AV1_COLOR_PRIMARIES_UNSPECIFIED,\n    STD_VIDEO_AV1_COLOR_PRIMARIES_MAX_ENUM = 0x7FFFFFFF\n} StdVideoAV1ColorPrimaries;\n\ntypedef enum StdVideoAV1TransferCharacteristics {\n    STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_RESERVED_0 = 0,\n    STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_BT_709 = 1,\n    STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_UNSPECIFIED = 2,\n    STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_RESERVED_3 = 3,\n    STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_BT_470_M = 4,\n    STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_BT_470_B_G = 5,\n    STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_BT_601 = 6,\n    STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_SMPTE_240 = 7,\n    STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_LINEAR = 8,\n    STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_LOG_100 = 9,\n    STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_LOG_100_SQRT10 = 10,\n    STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_IEC_61966 = 11,\n    STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_BT_1361 = 12,\n    STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_SRGB = 13,\n    STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_BT_2020_10_BIT = 14,\n    STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_BT_2020_12_BIT = 15,\n    STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_SMPTE_2084 = 16,\n    STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_SMPTE_428 = 17,\n    STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_HLG = 18,\n    STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_MAX_ENUM = 0x7FFFFFFF\n} StdVideoAV1TransferCharacteristics;\n\ntypedef enum StdVideoAV1MatrixCoefficients {\n    STD_VIDEO_AV1_MATRIX_COEFFICIENTS_IDENTITY = 0,\n    STD_VIDEO_AV1_MATRIX_COEFFICIENTS_BT_709 = 1,\n    STD_VIDEO_AV1_MATRIX_COEFFICIENTS_UNSPECIFIED = 2,\n    STD_VIDEO_AV1_MATRIX_COEFFICIENTS_RESERVED_3 = 3,\n    STD_VIDEO_AV1_MATRIX_COEFFICIENTS_FCC = 4,\n    STD_VIDEO_AV1_MATRIX_COEFFICIENTS_BT_470_B_G = 5,\n    STD_VIDEO_AV1_MATRIX_COEFFICIENTS_BT_601 = 6,\n    STD_VIDEO_AV1_MATRIX_COEFFICIENTS_SMPTE_240 = 7,\n    STD_VIDEO_AV1_MATRIX_COEFFICIENTS_SMPTE_YCGCO = 8,\n    STD_VIDEO_AV1_MATRIX_COEFFICIENTS_BT_2020_NCL = 9,\n    STD_VIDEO_AV1_MATRIX_COEFFICIENTS_BT_2020_CL = 10,\n    STD_VIDEO_AV1_MATRIX_COEFFICIENTS_SMPTE_2085 = 11,\n    STD_VIDEO_AV1_MATRIX_COEFFICIENTS_CHROMAT_NCL = 12,\n    STD_VIDEO_AV1_MATRIX_COEFFICIENTS_CHROMAT_CL = 13,\n    STD_VIDEO_AV1_MATRIX_COEFFICIENTS_ICTCP = 14,\n    STD_VIDEO_AV1_MATRIX_COEFFICIENTS_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_AV1_MATRIX_COEFFICIENTS_MAX_ENUM = 0x7FFFFFFF\n} StdVideoAV1MatrixCoefficients;\n\ntypedef enum StdVideoAV1ChromaSamplePosition {\n    STD_VIDEO_AV1_CHROMA_SAMPLE_POSITION_UNKNOWN = 0,\n    STD_VIDEO_AV1_CHROMA_SAMPLE_POSITION_VERTICAL = 1,\n    STD_VIDEO_AV1_CHROMA_SAMPLE_POSITION_COLOCATED = 2,\n    STD_VIDEO_AV1_CHROMA_SAMPLE_POSITION_RESERVED = 3,\n    STD_VIDEO_AV1_CHROMA_SAMPLE_POSITION_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_AV1_CHROMA_SAMPLE_POSITION_MAX_ENUM = 0x7FFFFFFF\n} StdVideoAV1ChromaSamplePosition;\ntypedef struct StdVideoAV1ColorConfigFlags {\n    uint32_t    mono_chrome : 1;\n    uint32_t    color_range : 1;\n    uint32_t    separate_uv_delta_q : 1;\n    uint32_t    color_description_present_flag : 1;\n    uint32_t    reserved : 28;\n} StdVideoAV1ColorConfigFlags;\n\ntypedef struct StdVideoAV1ColorConfig {\n    StdVideoAV1ColorConfigFlags           flags;\n    uint8_t                               BitDepth;\n    uint8_t                               subsampling_x;\n    uint8_t                               subsampling_y;\n    uint8_t                               reserved1;\n    StdVideoAV1ColorPrimaries             color_primaries;\n    StdVideoAV1TransferCharacteristics    transfer_characteristics;\n    StdVideoAV1MatrixCoefficients         matrix_coefficients;\n    StdVideoAV1ChromaSamplePosition       chroma_sample_position;\n} StdVideoAV1ColorConfig;\n\ntypedef struct StdVideoAV1TimingInfoFlags {\n    uint32_t    equal_picture_interval : 1;\n    uint32_t    reserved : 31;\n} StdVideoAV1TimingInfoFlags;\n\ntypedef struct StdVideoAV1TimingInfo {\n    StdVideoAV1TimingInfoFlags    flags;\n    uint32_t                      num_units_in_display_tick;\n    uint32_t                      time_scale;\n    uint32_t                      num_ticks_per_picture_minus_1;\n} StdVideoAV1TimingInfo;\n\ntypedef struct StdVideoAV1LoopFilterFlags {\n    uint32_t    loop_filter_delta_enabled : 1;\n    uint32_t    loop_filter_delta_update : 1;\n    uint32_t    reserved : 30;\n} StdVideoAV1LoopFilterFlags;\n\ntypedef struct StdVideoAV1LoopFilter {\n    StdVideoAV1LoopFilterFlags    flags;\n    uint8_t                       loop_filter_level[STD_VIDEO_AV1_MAX_LOOP_FILTER_STRENGTHS];\n    uint8_t                       loop_filter_sharpness;\n    uint8_t                       update_ref_delta;\n    int8_t                        loop_filter_ref_deltas[STD_VIDEO_AV1_TOTAL_REFS_PER_FRAME];\n    uint8_t                       update_mode_delta;\n    int8_t                        loop_filter_mode_deltas[STD_VIDEO_AV1_LOOP_FILTER_ADJUSTMENTS];\n} StdVideoAV1LoopFilter;\n\ntypedef struct StdVideoAV1QuantizationFlags {\n    uint32_t    using_qmatrix : 1;\n    uint32_t    diff_uv_delta : 1;\n    uint32_t    reserved : 30;\n} StdVideoAV1QuantizationFlags;\n\ntypedef struct StdVideoAV1Quantization {\n    StdVideoAV1QuantizationFlags    flags;\n    uint8_t                         base_q_idx;\n    int8_t                          DeltaQYDc;\n    int8_t                          DeltaQUDc;\n    int8_t                          DeltaQUAc;\n    int8_t                          DeltaQVDc;\n    int8_t                          DeltaQVAc;\n    uint8_t                         qm_y;\n    uint8_t                         qm_u;\n    uint8_t                         qm_v;\n} StdVideoAV1Quantization;\n\ntypedef struct StdVideoAV1Segmentation {\n    uint8_t    FeatureEnabled[STD_VIDEO_AV1_MAX_SEGMENTS];\n    int16_t    FeatureData[STD_VIDEO_AV1_MAX_SEGMENTS][STD_VIDEO_AV1_SEG_LVL_MAX];\n} StdVideoAV1Segmentation;\n\ntypedef struct StdVideoAV1TileInfoFlags {\n    uint32_t    uniform_tile_spacing_flag : 1;\n    uint32_t    reserved : 31;\n} StdVideoAV1TileInfoFlags;\n\ntypedef struct StdVideoAV1TileInfo {\n    StdVideoAV1TileInfoFlags    flags;\n    uint8_t                     TileCols;\n    uint8_t                     TileRows;\n    uint16_t                    context_update_tile_id;\n    uint8_t                     tile_size_bytes_minus_1;\n    uint8_t                     reserved1[7];\n    const uint16_t*             pMiColStarts;\n    const uint16_t*             pMiRowStarts;\n    const uint16_t*             pWidthInSbsMinus1;\n    const uint16_t*             pHeightInSbsMinus1;\n} StdVideoAV1TileInfo;\n\ntypedef struct StdVideoAV1CDEF {\n    uint8_t    cdef_damping_minus_3;\n    uint8_t    cdef_bits;\n    uint8_t    cdef_y_pri_strength[STD_VIDEO_AV1_MAX_CDEF_FILTER_STRENGTHS];\n    uint8_t    cdef_y_sec_strength[STD_VIDEO_AV1_MAX_CDEF_FILTER_STRENGTHS];\n    uint8_t    cdef_uv_pri_strength[STD_VIDEO_AV1_MAX_CDEF_FILTER_STRENGTHS];\n    uint8_t    cdef_uv_sec_strength[STD_VIDEO_AV1_MAX_CDEF_FILTER_STRENGTHS];\n} StdVideoAV1CDEF;\n\ntypedef struct StdVideoAV1LoopRestoration {\n    StdVideoAV1FrameRestorationType    FrameRestorationType[STD_VIDEO_AV1_MAX_NUM_PLANES];\n    uint16_t                           LoopRestorationSize[STD_VIDEO_AV1_MAX_NUM_PLANES];\n} StdVideoAV1LoopRestoration;\n\ntypedef struct StdVideoAV1GlobalMotion {\n    uint8_t    GmType[STD_VIDEO_AV1_NUM_REF_FRAMES];\n    int32_t    gm_params[STD_VIDEO_AV1_NUM_REF_FRAMES][STD_VIDEO_AV1_GLOBAL_MOTION_PARAMS];\n} StdVideoAV1GlobalMotion;\n\ntypedef struct StdVideoAV1FilmGrainFlags {\n    uint32_t    chroma_scaling_from_luma : 1;\n    uint32_t    overlap_flag : 1;\n    uint32_t    clip_to_restricted_range : 1;\n    uint32_t    update_grain : 1;\n    uint32_t    reserved : 28;\n} StdVideoAV1FilmGrainFlags;\n\ntypedef struct StdVideoAV1FilmGrain {\n    StdVideoAV1FilmGrainFlags    flags;\n    uint8_t                      grain_scaling_minus_8;\n    uint8_t                      ar_coeff_lag;\n    uint8_t                      ar_coeff_shift_minus_6;\n    uint8_t                      grain_scale_shift;\n    uint16_t                     grain_seed;\n    uint8_t                      film_grain_params_ref_idx;\n    uint8_t                      num_y_points;\n    uint8_t                      point_y_value[STD_VIDEO_AV1_MAX_NUM_Y_POINTS];\n    uint8_t                      point_y_scaling[STD_VIDEO_AV1_MAX_NUM_Y_POINTS];\n    uint8_t                      num_cb_points;\n    uint8_t                      point_cb_value[STD_VIDEO_AV1_MAX_NUM_CB_POINTS];\n    uint8_t                      point_cb_scaling[STD_VIDEO_AV1_MAX_NUM_CB_POINTS];\n    uint8_t                      num_cr_points;\n    uint8_t                      point_cr_value[STD_VIDEO_AV1_MAX_NUM_CR_POINTS];\n    uint8_t                      point_cr_scaling[STD_VIDEO_AV1_MAX_NUM_CR_POINTS];\n    int8_t                       ar_coeffs_y_plus_128[STD_VIDEO_AV1_MAX_NUM_POS_LUMA];\n    int8_t                       ar_coeffs_cb_plus_128[STD_VIDEO_AV1_MAX_NUM_POS_CHROMA];\n    int8_t                       ar_coeffs_cr_plus_128[STD_VIDEO_AV1_MAX_NUM_POS_CHROMA];\n    uint8_t                      cb_mult;\n    uint8_t                      cb_luma_mult;\n    uint16_t                     cb_offset;\n    uint8_t                      cr_mult;\n    uint8_t                      cr_luma_mult;\n    uint16_t                     cr_offset;\n} StdVideoAV1FilmGrain;\n\ntypedef struct StdVideoAV1SequenceHeaderFlags {\n    uint32_t    still_picture : 1;\n    uint32_t    reduced_still_picture_header : 1;\n    uint32_t    use_128x128_superblock : 1;\n    uint32_t    enable_filter_intra : 1;\n    uint32_t    enable_intra_edge_filter : 1;\n    uint32_t    enable_interintra_compound : 1;\n    uint32_t    enable_masked_compound : 1;\n    uint32_t    enable_warped_motion : 1;\n    uint32_t    enable_dual_filter : 1;\n    uint32_t    enable_order_hint : 1;\n    uint32_t    enable_jnt_comp : 1;\n    uint32_t    enable_ref_frame_mvs : 1;\n    uint32_t    frame_id_numbers_present_flag : 1;\n    uint32_t    enable_superres : 1;\n    uint32_t    enable_cdef : 1;\n    uint32_t    enable_restoration : 1;\n    uint32_t    film_grain_params_present : 1;\n    uint32_t    timing_info_present_flag : 1;\n    uint32_t    initial_display_delay_present_flag : 1;\n    uint32_t    reserved : 13;\n} StdVideoAV1SequenceHeaderFlags;\n\ntypedef struct StdVideoAV1SequenceHeader {\n    StdVideoAV1SequenceHeaderFlags    flags;\n    StdVideoAV1Profile                seq_profile;\n    uint8_t                           frame_width_bits_minus_1;\n    uint8_t                           frame_height_bits_minus_1;\n    uint16_t                          max_frame_width_minus_1;\n    uint16_t                          max_frame_height_minus_1;\n    uint8_t                           delta_frame_id_length_minus_2;\n    uint8_t                           additional_frame_id_length_minus_1;\n    uint8_t                           order_hint_bits_minus_1;\n    uint8_t                           seq_force_integer_mv;\n    uint8_t                           seq_force_screen_content_tools;\n    uint8_t                           reserved1[5];\n    const StdVideoAV1ColorConfig*     pColorConfig;\n    const StdVideoAV1TimingInfo*      pTimingInfo;\n} StdVideoAV1SequenceHeader;\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vk_video/vulkan_video_codec_av1std_decode.h",
    "content": "#ifndef VULKAN_VIDEO_CODEC_AV1STD_DECODE_H_\n#define VULKAN_VIDEO_CODEC_AV1STD_DECODE_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// vulkan_video_codec_av1std_decode is a preprocessor guard. Do not pass it to API calls.\n#define vulkan_video_codec_av1std_decode 1\n#include \"vulkan_video_codec_av1std.h\"\n\n#define VK_STD_VULKAN_VIDEO_CODEC_AV1_DECODE_API_VERSION_1_0_0 VK_MAKE_VIDEO_STD_VERSION(1, 0, 0)\n\n#define VK_STD_VULKAN_VIDEO_CODEC_AV1_DECODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_AV1_DECODE_API_VERSION_1_0_0\n#define VK_STD_VULKAN_VIDEO_CODEC_AV1_DECODE_EXTENSION_NAME \"VK_STD_vulkan_video_codec_av1_decode\"\ntypedef struct StdVideoDecodeAV1PictureInfoFlags {\n    uint32_t    error_resilient_mode : 1;\n    uint32_t    disable_cdf_update : 1;\n    uint32_t    use_superres : 1;\n    uint32_t    render_and_frame_size_different : 1;\n    uint32_t    allow_screen_content_tools : 1;\n    uint32_t    is_filter_switchable : 1;\n    uint32_t    force_integer_mv : 1;\n    uint32_t    frame_size_override_flag : 1;\n    uint32_t    buffer_removal_time_present_flag : 1;\n    uint32_t    allow_intrabc : 1;\n    uint32_t    frame_refs_short_signaling : 1;\n    uint32_t    allow_high_precision_mv : 1;\n    uint32_t    is_motion_mode_switchable : 1;\n    uint32_t    use_ref_frame_mvs : 1;\n    uint32_t    disable_frame_end_update_cdf : 1;\n    uint32_t    allow_warped_motion : 1;\n    uint32_t    reduced_tx_set : 1;\n    uint32_t    reference_select : 1;\n    uint32_t    skip_mode_present : 1;\n    uint32_t    delta_q_present : 1;\n    uint32_t    delta_lf_present : 1;\n    uint32_t    delta_lf_multi : 1;\n    uint32_t    segmentation_enabled : 1;\n    uint32_t    segmentation_update_map : 1;\n    uint32_t    segmentation_temporal_update : 1;\n    uint32_t    segmentation_update_data : 1;\n    uint32_t    UsesLr : 1;\n    uint32_t    usesChromaLr : 1;\n    uint32_t    apply_grain : 1;\n    uint32_t    reserved : 3;\n} StdVideoDecodeAV1PictureInfoFlags;\n\ntypedef struct StdVideoDecodeAV1PictureInfo {\n    StdVideoDecodeAV1PictureInfoFlags    flags;\n    StdVideoAV1FrameType                 frame_type;\n    uint32_t                             current_frame_id;\n    uint8_t                              OrderHint;\n    uint8_t                              primary_ref_frame;\n    uint8_t                              refresh_frame_flags;\n    uint8_t                              reserved1;\n    StdVideoAV1InterpolationFilter       interpolation_filter;\n    StdVideoAV1TxMode                    TxMode;\n    uint8_t                              delta_q_res;\n    uint8_t                              delta_lf_res;\n    uint8_t                              SkipModeFrame[STD_VIDEO_AV1_SKIP_MODE_FRAMES];\n    uint8_t                              coded_denom;\n    uint8_t                              reserved2[3];\n    uint8_t                              OrderHints[STD_VIDEO_AV1_NUM_REF_FRAMES];\n    uint32_t                             expectedFrameId[STD_VIDEO_AV1_NUM_REF_FRAMES];\n    const StdVideoAV1TileInfo*           pTileInfo;\n    const StdVideoAV1Quantization*       pQuantization;\n    const StdVideoAV1Segmentation*       pSegmentation;\n    const StdVideoAV1LoopFilter*         pLoopFilter;\n    const StdVideoAV1CDEF*               pCDEF;\n    const StdVideoAV1LoopRestoration*    pLoopRestoration;\n    const StdVideoAV1GlobalMotion*       pGlobalMotion;\n    const StdVideoAV1FilmGrain*          pFilmGrain;\n} StdVideoDecodeAV1PictureInfo;\n\ntypedef struct StdVideoDecodeAV1ReferenceInfoFlags {\n    uint32_t    disable_frame_end_update_cdf : 1;\n    uint32_t    segmentation_enabled : 1;\n    uint32_t    reserved : 30;\n} StdVideoDecodeAV1ReferenceInfoFlags;\n\ntypedef struct StdVideoDecodeAV1ReferenceInfo {\n    StdVideoDecodeAV1ReferenceInfoFlags    flags;\n    uint8_t                                frame_type;\n    uint8_t                                RefFrameSignBias;\n    uint8_t                                OrderHint;\n    uint8_t                                SavedOrderHints[STD_VIDEO_AV1_NUM_REF_FRAMES];\n} StdVideoDecodeAV1ReferenceInfo;\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vk_video/vulkan_video_codec_av1std_encode.h",
    "content": "#ifndef VULKAN_VIDEO_CODEC_AV1STD_ENCODE_H_\n#define VULKAN_VIDEO_CODEC_AV1STD_ENCODE_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// vulkan_video_codec_av1std_encode is a preprocessor guard. Do not pass it to API calls.\n#define vulkan_video_codec_av1std_encode 1\n#include \"vulkan_video_codec_av1std.h\"\n\n#define VK_STD_VULKAN_VIDEO_CODEC_AV1_ENCODE_API_VERSION_1_0_0 VK_MAKE_VIDEO_STD_VERSION(1, 0, 0)\n\n#define VK_STD_VULKAN_VIDEO_CODEC_AV1_ENCODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_AV1_ENCODE_API_VERSION_1_0_0\n#define VK_STD_VULKAN_VIDEO_CODEC_AV1_ENCODE_EXTENSION_NAME \"VK_STD_vulkan_video_codec_av1_encode\"\ntypedef struct StdVideoEncodeAV1DecoderModelInfo {\n    uint8_t     buffer_delay_length_minus_1;\n    uint8_t     buffer_removal_time_length_minus_1;\n    uint8_t     frame_presentation_time_length_minus_1;\n    uint8_t     reserved1;\n    uint32_t    num_units_in_decoding_tick;\n} StdVideoEncodeAV1DecoderModelInfo;\n\ntypedef struct StdVideoEncodeAV1ExtensionHeader {\n    uint8_t    temporal_id;\n    uint8_t    spatial_id;\n} StdVideoEncodeAV1ExtensionHeader;\n\ntypedef struct StdVideoEncodeAV1OperatingPointInfoFlags {\n    uint32_t    decoder_model_present_for_this_op : 1;\n    uint32_t    low_delay_mode_flag : 1;\n    uint32_t    initial_display_delay_present_for_this_op : 1;\n    uint32_t    reserved : 29;\n} StdVideoEncodeAV1OperatingPointInfoFlags;\n\ntypedef struct StdVideoEncodeAV1OperatingPointInfo {\n    StdVideoEncodeAV1OperatingPointInfoFlags    flags;\n    uint16_t                                    operating_point_idc;\n    uint8_t                                     seq_level_idx;\n    uint8_t                                     seq_tier;\n    uint32_t                                    decoder_buffer_delay;\n    uint32_t                                    encoder_buffer_delay;\n    uint8_t                                     initial_display_delay_minus_1;\n} StdVideoEncodeAV1OperatingPointInfo;\n\ntypedef struct StdVideoEncodeAV1PictureInfoFlags {\n    uint32_t    error_resilient_mode : 1;\n    uint32_t    disable_cdf_update : 1;\n    uint32_t    use_superres : 1;\n    uint32_t    render_and_frame_size_different : 1;\n    uint32_t    allow_screen_content_tools : 1;\n    uint32_t    is_filter_switchable : 1;\n    uint32_t    force_integer_mv : 1;\n    uint32_t    frame_size_override_flag : 1;\n    uint32_t    buffer_removal_time_present_flag : 1;\n    uint32_t    allow_intrabc : 1;\n    uint32_t    frame_refs_short_signaling : 1;\n    uint32_t    allow_high_precision_mv : 1;\n    uint32_t    is_motion_mode_switchable : 1;\n    uint32_t    use_ref_frame_mvs : 1;\n    uint32_t    disable_frame_end_update_cdf : 1;\n    uint32_t    allow_warped_motion : 1;\n    uint32_t    reduced_tx_set : 1;\n    uint32_t    skip_mode_present : 1;\n    uint32_t    delta_q_present : 1;\n    uint32_t    delta_lf_present : 1;\n    uint32_t    delta_lf_multi : 1;\n    uint32_t    segmentation_enabled : 1;\n    uint32_t    segmentation_update_map : 1;\n    uint32_t    segmentation_temporal_update : 1;\n    uint32_t    segmentation_update_data : 1;\n    uint32_t    UsesLr : 1;\n    uint32_t    usesChromaLr : 1;\n    uint32_t    show_frame : 1;\n    uint32_t    showable_frame : 1;\n    uint32_t    reserved : 3;\n} StdVideoEncodeAV1PictureInfoFlags;\n\ntypedef struct StdVideoEncodeAV1PictureInfo {\n    StdVideoEncodeAV1PictureInfoFlags          flags;\n    StdVideoAV1FrameType                       frame_type;\n    uint32_t                                   frame_presentation_time;\n    uint32_t                                   current_frame_id;\n    uint8_t                                    order_hint;\n    uint8_t                                    primary_ref_frame;\n    uint8_t                                    refresh_frame_flags;\n    uint8_t                                    coded_denom;\n    uint16_t                                   render_width_minus_1;\n    uint16_t                                   render_height_minus_1;\n    StdVideoAV1InterpolationFilter             interpolation_filter;\n    StdVideoAV1TxMode                          TxMode;\n    uint8_t                                    delta_q_res;\n    uint8_t                                    delta_lf_res;\n    uint8_t                                    ref_order_hint[STD_VIDEO_AV1_NUM_REF_FRAMES];\n    int8_t                                     ref_frame_idx[STD_VIDEO_AV1_REFS_PER_FRAME];\n    uint8_t                                    reserved1[3];\n    uint32_t                                   delta_frame_id_minus_1[STD_VIDEO_AV1_REFS_PER_FRAME];\n    const StdVideoAV1TileInfo*                 pTileInfo;\n    const StdVideoAV1Quantization*             pQuantization;\n    const StdVideoAV1Segmentation*             pSegmentation;\n    const StdVideoAV1LoopFilter*               pLoopFilter;\n    const StdVideoAV1CDEF*                     pCDEF;\n    const StdVideoAV1LoopRestoration*          pLoopRestoration;\n    const StdVideoAV1GlobalMotion*             pGlobalMotion;\n    const StdVideoEncodeAV1ExtensionHeader*    pExtensionHeader;\n    const uint32_t*                            pBufferRemovalTimes;\n} StdVideoEncodeAV1PictureInfo;\n\ntypedef struct StdVideoEncodeAV1ReferenceInfoFlags {\n    uint32_t    disable_frame_end_update_cdf : 1;\n    uint32_t    segmentation_enabled : 1;\n    uint32_t    reserved : 30;\n} StdVideoEncodeAV1ReferenceInfoFlags;\n\ntypedef struct StdVideoEncodeAV1ReferenceInfo {\n    StdVideoEncodeAV1ReferenceInfoFlags        flags;\n    uint32_t                                   RefFrameId;\n    StdVideoAV1FrameType                       frame_type;\n    uint8_t                                    OrderHint;\n    uint8_t                                    reserved1[3];\n    const StdVideoEncodeAV1ExtensionHeader*    pExtensionHeader;\n} StdVideoEncodeAV1ReferenceInfo;\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vk_video/vulkan_video_codec_h264std.h",
    "content": "#ifndef VULKAN_VIDEO_CODEC_H264STD_H_\n#define VULKAN_VIDEO_CODEC_H264STD_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// vulkan_video_codec_h264std is a preprocessor guard. Do not pass it to API calls.\n#define vulkan_video_codec_h264std 1\n#include \"vulkan_video_codecs_common.h\"\n#define STD_VIDEO_H264_CPB_CNT_LIST_SIZE  32\n#define STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS 6\n#define STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS 16\n#define STD_VIDEO_H264_SCALING_LIST_8X8_NUM_LISTS 6\n#define STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS 64\n#define STD_VIDEO_H264_MAX_NUM_LIST_REF   32\n#define STD_VIDEO_H264_MAX_CHROMA_PLANES  2\n#define STD_VIDEO_H264_NO_REFERENCE_PICTURE 0xFF\n\ntypedef enum StdVideoH264ChromaFormatIdc {\n    STD_VIDEO_H264_CHROMA_FORMAT_IDC_MONOCHROME = 0,\n    STD_VIDEO_H264_CHROMA_FORMAT_IDC_420 = 1,\n    STD_VIDEO_H264_CHROMA_FORMAT_IDC_422 = 2,\n    STD_VIDEO_H264_CHROMA_FORMAT_IDC_444 = 3,\n    STD_VIDEO_H264_CHROMA_FORMAT_IDC_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_H264_CHROMA_FORMAT_IDC_MAX_ENUM = 0x7FFFFFFF\n} StdVideoH264ChromaFormatIdc;\n\ntypedef enum StdVideoH264ProfileIdc {\n    STD_VIDEO_H264_PROFILE_IDC_BASELINE = 66,\n    STD_VIDEO_H264_PROFILE_IDC_MAIN = 77,\n    STD_VIDEO_H264_PROFILE_IDC_HIGH = 100,\n    STD_VIDEO_H264_PROFILE_IDC_HIGH_444_PREDICTIVE = 244,\n    STD_VIDEO_H264_PROFILE_IDC_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_H264_PROFILE_IDC_MAX_ENUM = 0x7FFFFFFF\n} StdVideoH264ProfileIdc;\n\ntypedef enum StdVideoH264LevelIdc {\n    STD_VIDEO_H264_LEVEL_IDC_1_0 = 0,\n    STD_VIDEO_H264_LEVEL_IDC_1_1 = 1,\n    STD_VIDEO_H264_LEVEL_IDC_1_2 = 2,\n    STD_VIDEO_H264_LEVEL_IDC_1_3 = 3,\n    STD_VIDEO_H264_LEVEL_IDC_2_0 = 4,\n    STD_VIDEO_H264_LEVEL_IDC_2_1 = 5,\n    STD_VIDEO_H264_LEVEL_IDC_2_2 = 6,\n    STD_VIDEO_H264_LEVEL_IDC_3_0 = 7,\n    STD_VIDEO_H264_LEVEL_IDC_3_1 = 8,\n    STD_VIDEO_H264_LEVEL_IDC_3_2 = 9,\n    STD_VIDEO_H264_LEVEL_IDC_4_0 = 10,\n    STD_VIDEO_H264_LEVEL_IDC_4_1 = 11,\n    STD_VIDEO_H264_LEVEL_IDC_4_2 = 12,\n    STD_VIDEO_H264_LEVEL_IDC_5_0 = 13,\n    STD_VIDEO_H264_LEVEL_IDC_5_1 = 14,\n    STD_VIDEO_H264_LEVEL_IDC_5_2 = 15,\n    STD_VIDEO_H264_LEVEL_IDC_6_0 = 16,\n    STD_VIDEO_H264_LEVEL_IDC_6_1 = 17,\n    STD_VIDEO_H264_LEVEL_IDC_6_2 = 18,\n    STD_VIDEO_H264_LEVEL_IDC_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_H264_LEVEL_IDC_MAX_ENUM = 0x7FFFFFFF\n} StdVideoH264LevelIdc;\n\ntypedef enum StdVideoH264PocType {\n    STD_VIDEO_H264_POC_TYPE_0 = 0,\n    STD_VIDEO_H264_POC_TYPE_1 = 1,\n    STD_VIDEO_H264_POC_TYPE_2 = 2,\n    STD_VIDEO_H264_POC_TYPE_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_H264_POC_TYPE_MAX_ENUM = 0x7FFFFFFF\n} StdVideoH264PocType;\n\ntypedef enum StdVideoH264AspectRatioIdc {\n    STD_VIDEO_H264_ASPECT_RATIO_IDC_UNSPECIFIED = 0,\n    STD_VIDEO_H264_ASPECT_RATIO_IDC_SQUARE = 1,\n    STD_VIDEO_H264_ASPECT_RATIO_IDC_12_11 = 2,\n    STD_VIDEO_H264_ASPECT_RATIO_IDC_10_11 = 3,\n    STD_VIDEO_H264_ASPECT_RATIO_IDC_16_11 = 4,\n    STD_VIDEO_H264_ASPECT_RATIO_IDC_40_33 = 5,\n    STD_VIDEO_H264_ASPECT_RATIO_IDC_24_11 = 6,\n    STD_VIDEO_H264_ASPECT_RATIO_IDC_20_11 = 7,\n    STD_VIDEO_H264_ASPECT_RATIO_IDC_32_11 = 8,\n    STD_VIDEO_H264_ASPECT_RATIO_IDC_80_33 = 9,\n    STD_VIDEO_H264_ASPECT_RATIO_IDC_18_11 = 10,\n    STD_VIDEO_H264_ASPECT_RATIO_IDC_15_11 = 11,\n    STD_VIDEO_H264_ASPECT_RATIO_IDC_64_33 = 12,\n    STD_VIDEO_H264_ASPECT_RATIO_IDC_160_99 = 13,\n    STD_VIDEO_H264_ASPECT_RATIO_IDC_4_3 = 14,\n    STD_VIDEO_H264_ASPECT_RATIO_IDC_3_2 = 15,\n    STD_VIDEO_H264_ASPECT_RATIO_IDC_2_1 = 16,\n    STD_VIDEO_H264_ASPECT_RATIO_IDC_EXTENDED_SAR = 255,\n    STD_VIDEO_H264_ASPECT_RATIO_IDC_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_H264_ASPECT_RATIO_IDC_MAX_ENUM = 0x7FFFFFFF\n} StdVideoH264AspectRatioIdc;\n\ntypedef enum StdVideoH264WeightedBipredIdc {\n    STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_DEFAULT = 0,\n    STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_EXPLICIT = 1,\n    STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_IMPLICIT = 2,\n    STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_MAX_ENUM = 0x7FFFFFFF\n} StdVideoH264WeightedBipredIdc;\n\ntypedef enum StdVideoH264ModificationOfPicNumsIdc {\n    STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_SHORT_TERM_SUBTRACT = 0,\n    STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_SHORT_TERM_ADD = 1,\n    STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_LONG_TERM = 2,\n    STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_END = 3,\n    STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_MAX_ENUM = 0x7FFFFFFF\n} StdVideoH264ModificationOfPicNumsIdc;\n\ntypedef enum StdVideoH264MemMgmtControlOp {\n    STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_END = 0,\n    STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_UNMARK_SHORT_TERM = 1,\n    STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_UNMARK_LONG_TERM = 2,\n    STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_MARK_LONG_TERM = 3,\n    STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_SET_MAX_LONG_TERM_INDEX = 4,\n    STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_UNMARK_ALL = 5,\n    STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_MARK_CURRENT_AS_LONG_TERM = 6,\n    STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_MAX_ENUM = 0x7FFFFFFF\n} StdVideoH264MemMgmtControlOp;\n\ntypedef enum StdVideoH264CabacInitIdc {\n    STD_VIDEO_H264_CABAC_INIT_IDC_0 = 0,\n    STD_VIDEO_H264_CABAC_INIT_IDC_1 = 1,\n    STD_VIDEO_H264_CABAC_INIT_IDC_2 = 2,\n    STD_VIDEO_H264_CABAC_INIT_IDC_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_H264_CABAC_INIT_IDC_MAX_ENUM = 0x7FFFFFFF\n} StdVideoH264CabacInitIdc;\n\ntypedef enum StdVideoH264DisableDeblockingFilterIdc {\n    STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_DISABLED = 0,\n    STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_ENABLED = 1,\n    STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_PARTIAL = 2,\n    STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_MAX_ENUM = 0x7FFFFFFF\n} StdVideoH264DisableDeblockingFilterIdc;\n\ntypedef enum StdVideoH264SliceType {\n    STD_VIDEO_H264_SLICE_TYPE_P = 0,\n    STD_VIDEO_H264_SLICE_TYPE_B = 1,\n    STD_VIDEO_H264_SLICE_TYPE_I = 2,\n    STD_VIDEO_H264_SLICE_TYPE_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_H264_SLICE_TYPE_MAX_ENUM = 0x7FFFFFFF\n} StdVideoH264SliceType;\n\ntypedef enum StdVideoH264PictureType {\n    STD_VIDEO_H264_PICTURE_TYPE_P = 0,\n    STD_VIDEO_H264_PICTURE_TYPE_B = 1,\n    STD_VIDEO_H264_PICTURE_TYPE_I = 2,\n    STD_VIDEO_H264_PICTURE_TYPE_IDR = 5,\n    STD_VIDEO_H264_PICTURE_TYPE_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_H264_PICTURE_TYPE_MAX_ENUM = 0x7FFFFFFF\n} StdVideoH264PictureType;\n\ntypedef enum StdVideoH264NonVclNaluType {\n    STD_VIDEO_H264_NON_VCL_NALU_TYPE_SPS = 0,\n    STD_VIDEO_H264_NON_VCL_NALU_TYPE_PPS = 1,\n    STD_VIDEO_H264_NON_VCL_NALU_TYPE_AUD = 2,\n    STD_VIDEO_H264_NON_VCL_NALU_TYPE_PREFIX = 3,\n    STD_VIDEO_H264_NON_VCL_NALU_TYPE_END_OF_SEQUENCE = 4,\n    STD_VIDEO_H264_NON_VCL_NALU_TYPE_END_OF_STREAM = 5,\n    STD_VIDEO_H264_NON_VCL_NALU_TYPE_PRECODED = 6,\n    STD_VIDEO_H264_NON_VCL_NALU_TYPE_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_H264_NON_VCL_NALU_TYPE_MAX_ENUM = 0x7FFFFFFF\n} StdVideoH264NonVclNaluType;\ntypedef struct StdVideoH264SpsVuiFlags {\n    uint32_t    aspect_ratio_info_present_flag : 1;\n    uint32_t    overscan_info_present_flag : 1;\n    uint32_t    overscan_appropriate_flag : 1;\n    uint32_t    video_signal_type_present_flag : 1;\n    uint32_t    video_full_range_flag : 1;\n    uint32_t    color_description_present_flag : 1;\n    uint32_t    chroma_loc_info_present_flag : 1;\n    uint32_t    timing_info_present_flag : 1;\n    uint32_t    fixed_frame_rate_flag : 1;\n    uint32_t    bitstream_restriction_flag : 1;\n    uint32_t    nal_hrd_parameters_present_flag : 1;\n    uint32_t    vcl_hrd_parameters_present_flag : 1;\n} StdVideoH264SpsVuiFlags;\n\ntypedef struct StdVideoH264HrdParameters {\n    uint8_t     cpb_cnt_minus1;\n    uint8_t     bit_rate_scale;\n    uint8_t     cpb_size_scale;\n    uint8_t     reserved1;\n    uint32_t    bit_rate_value_minus1[STD_VIDEO_H264_CPB_CNT_LIST_SIZE];\n    uint32_t    cpb_size_value_minus1[STD_VIDEO_H264_CPB_CNT_LIST_SIZE];\n    uint8_t     cbr_flag[STD_VIDEO_H264_CPB_CNT_LIST_SIZE];\n    uint32_t    initial_cpb_removal_delay_length_minus1;\n    uint32_t    cpb_removal_delay_length_minus1;\n    uint32_t    dpb_output_delay_length_minus1;\n    uint32_t    time_offset_length;\n} StdVideoH264HrdParameters;\n\ntypedef struct StdVideoH264SequenceParameterSetVui {\n    StdVideoH264SpsVuiFlags             flags;\n    StdVideoH264AspectRatioIdc          aspect_ratio_idc;\n    uint16_t                            sar_width;\n    uint16_t                            sar_height;\n    uint8_t                             video_format;\n    uint8_t                             colour_primaries;\n    uint8_t                             transfer_characteristics;\n    uint8_t                             matrix_coefficients;\n    uint32_t                            num_units_in_tick;\n    uint32_t                            time_scale;\n    uint8_t                             max_num_reorder_frames;\n    uint8_t                             max_dec_frame_buffering;\n    uint8_t                             chroma_sample_loc_type_top_field;\n    uint8_t                             chroma_sample_loc_type_bottom_field;\n    uint32_t                            reserved1;\n    const StdVideoH264HrdParameters*    pHrdParameters;\n} StdVideoH264SequenceParameterSetVui;\n\ntypedef struct StdVideoH264SpsFlags {\n    uint32_t    constraint_set0_flag : 1;\n    uint32_t    constraint_set1_flag : 1;\n    uint32_t    constraint_set2_flag : 1;\n    uint32_t    constraint_set3_flag : 1;\n    uint32_t    constraint_set4_flag : 1;\n    uint32_t    constraint_set5_flag : 1;\n    uint32_t    direct_8x8_inference_flag : 1;\n    uint32_t    mb_adaptive_frame_field_flag : 1;\n    uint32_t    frame_mbs_only_flag : 1;\n    uint32_t    delta_pic_order_always_zero_flag : 1;\n    uint32_t    separate_colour_plane_flag : 1;\n    uint32_t    gaps_in_frame_num_value_allowed_flag : 1;\n    uint32_t    qpprime_y_zero_transform_bypass_flag : 1;\n    uint32_t    frame_cropping_flag : 1;\n    uint32_t    seq_scaling_matrix_present_flag : 1;\n    uint32_t    vui_parameters_present_flag : 1;\n} StdVideoH264SpsFlags;\n\ntypedef struct StdVideoH264ScalingLists {\n    uint16_t    scaling_list_present_mask;\n    uint16_t    use_default_scaling_matrix_mask;\n    uint8_t     ScalingList4x4[STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS][STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS];\n    uint8_t     ScalingList8x8[STD_VIDEO_H264_SCALING_LIST_8X8_NUM_LISTS][STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS];\n} StdVideoH264ScalingLists;\n\ntypedef struct StdVideoH264SequenceParameterSet {\n    StdVideoH264SpsFlags                          flags;\n    StdVideoH264ProfileIdc                        profile_idc;\n    StdVideoH264LevelIdc                          level_idc;\n    StdVideoH264ChromaFormatIdc                   chroma_format_idc;\n    uint8_t                                       seq_parameter_set_id;\n    uint8_t                                       bit_depth_luma_minus8;\n    uint8_t                                       bit_depth_chroma_minus8;\n    uint8_t                                       log2_max_frame_num_minus4;\n    StdVideoH264PocType                           pic_order_cnt_type;\n    int32_t                                       offset_for_non_ref_pic;\n    int32_t                                       offset_for_top_to_bottom_field;\n    uint8_t                                       log2_max_pic_order_cnt_lsb_minus4;\n    uint8_t                                       num_ref_frames_in_pic_order_cnt_cycle;\n    uint8_t                                       max_num_ref_frames;\n    uint8_t                                       reserved1;\n    uint32_t                                      pic_width_in_mbs_minus1;\n    uint32_t                                      pic_height_in_map_units_minus1;\n    uint32_t                                      frame_crop_left_offset;\n    uint32_t                                      frame_crop_right_offset;\n    uint32_t                                      frame_crop_top_offset;\n    uint32_t                                      frame_crop_bottom_offset;\n    uint32_t                                      reserved2;\n    const int32_t*                                pOffsetForRefFrame;\n    const StdVideoH264ScalingLists*               pScalingLists;\n    const StdVideoH264SequenceParameterSetVui*    pSequenceParameterSetVui;\n} StdVideoH264SequenceParameterSet;\n\ntypedef struct StdVideoH264PpsFlags {\n    uint32_t    transform_8x8_mode_flag : 1;\n    uint32_t    redundant_pic_cnt_present_flag : 1;\n    uint32_t    constrained_intra_pred_flag : 1;\n    uint32_t    deblocking_filter_control_present_flag : 1;\n    uint32_t    weighted_pred_flag : 1;\n    uint32_t    bottom_field_pic_order_in_frame_present_flag : 1;\n    uint32_t    entropy_coding_mode_flag : 1;\n    uint32_t    pic_scaling_matrix_present_flag : 1;\n} StdVideoH264PpsFlags;\n\ntypedef struct StdVideoH264PictureParameterSet {\n    StdVideoH264PpsFlags               flags;\n    uint8_t                            seq_parameter_set_id;\n    uint8_t                            pic_parameter_set_id;\n    uint8_t                            num_ref_idx_l0_default_active_minus1;\n    uint8_t                            num_ref_idx_l1_default_active_minus1;\n    StdVideoH264WeightedBipredIdc      weighted_bipred_idc;\n    int8_t                             pic_init_qp_minus26;\n    int8_t                             pic_init_qs_minus26;\n    int8_t                             chroma_qp_index_offset;\n    int8_t                             second_chroma_qp_index_offset;\n    const StdVideoH264ScalingLists*    pScalingLists;\n} StdVideoH264PictureParameterSet;\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vk_video/vulkan_video_codec_h264std_decode.h",
    "content": "#ifndef VULKAN_VIDEO_CODEC_H264STD_DECODE_H_\n#define VULKAN_VIDEO_CODEC_H264STD_DECODE_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// vulkan_video_codec_h264std_decode is a preprocessor guard. Do not pass it to API calls.\n#define vulkan_video_codec_h264std_decode 1\n#include \"vulkan_video_codec_h264std.h\"\n\n#define VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_API_VERSION_1_0_0 VK_MAKE_VIDEO_STD_VERSION(1, 0, 0)\n\n#define VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_API_VERSION_1_0_0\n#define VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_EXTENSION_NAME \"VK_STD_vulkan_video_codec_h264_decode\"\n#define STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE 2\n\ntypedef enum StdVideoDecodeH264FieldOrderCount {\n    STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_TOP = 0,\n    STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_BOTTOM = 1,\n    STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_MAX_ENUM = 0x7FFFFFFF\n} StdVideoDecodeH264FieldOrderCount;\ntypedef struct StdVideoDecodeH264PictureInfoFlags {\n    uint32_t    field_pic_flag : 1;\n    uint32_t    is_intra : 1;\n    uint32_t    IdrPicFlag : 1;\n    uint32_t    bottom_field_flag : 1;\n    uint32_t    is_reference : 1;\n    uint32_t    complementary_field_pair : 1;\n} StdVideoDecodeH264PictureInfoFlags;\n\ntypedef struct StdVideoDecodeH264PictureInfo {\n    StdVideoDecodeH264PictureInfoFlags    flags;\n    uint8_t                               seq_parameter_set_id;\n    uint8_t                               pic_parameter_set_id;\n    uint8_t                               reserved1;\n    uint8_t                               reserved2;\n    uint16_t                              frame_num;\n    uint16_t                              idr_pic_id;\n    int32_t                               PicOrderCnt[STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE];\n} StdVideoDecodeH264PictureInfo;\n\ntypedef struct StdVideoDecodeH264ReferenceInfoFlags {\n    uint32_t    top_field_flag : 1;\n    uint32_t    bottom_field_flag : 1;\n    uint32_t    used_for_long_term_reference : 1;\n    uint32_t    is_non_existing : 1;\n} StdVideoDecodeH264ReferenceInfoFlags;\n\ntypedef struct StdVideoDecodeH264ReferenceInfo {\n    StdVideoDecodeH264ReferenceInfoFlags    flags;\n    uint16_t                                FrameNum;\n    uint16_t                                reserved;\n    int32_t                                 PicOrderCnt[STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE];\n} StdVideoDecodeH264ReferenceInfo;\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vk_video/vulkan_video_codec_h264std_encode.h",
    "content": "#ifndef VULKAN_VIDEO_CODEC_H264STD_ENCODE_H_\n#define VULKAN_VIDEO_CODEC_H264STD_ENCODE_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// vulkan_video_codec_h264std_encode is a preprocessor guard. Do not pass it to API calls.\n#define vulkan_video_codec_h264std_encode 1\n#include \"vulkan_video_codec_h264std.h\"\n\n#define VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_API_VERSION_1_0_0 VK_MAKE_VIDEO_STD_VERSION(1, 0, 0)\n\n#define VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_API_VERSION_1_0_0\n#define VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_EXTENSION_NAME \"VK_STD_vulkan_video_codec_h264_encode\"\ntypedef struct StdVideoEncodeH264WeightTableFlags {\n    uint32_t    luma_weight_l0_flag;\n    uint32_t    chroma_weight_l0_flag;\n    uint32_t    luma_weight_l1_flag;\n    uint32_t    chroma_weight_l1_flag;\n} StdVideoEncodeH264WeightTableFlags;\n\ntypedef struct StdVideoEncodeH264WeightTable {\n    StdVideoEncodeH264WeightTableFlags    flags;\n    uint8_t                               luma_log2_weight_denom;\n    uint8_t                               chroma_log2_weight_denom;\n    int8_t                                luma_weight_l0[STD_VIDEO_H264_MAX_NUM_LIST_REF];\n    int8_t                                luma_offset_l0[STD_VIDEO_H264_MAX_NUM_LIST_REF];\n    int8_t                                chroma_weight_l0[STD_VIDEO_H264_MAX_NUM_LIST_REF][STD_VIDEO_H264_MAX_CHROMA_PLANES];\n    int8_t                                chroma_offset_l0[STD_VIDEO_H264_MAX_NUM_LIST_REF][STD_VIDEO_H264_MAX_CHROMA_PLANES];\n    int8_t                                luma_weight_l1[STD_VIDEO_H264_MAX_NUM_LIST_REF];\n    int8_t                                luma_offset_l1[STD_VIDEO_H264_MAX_NUM_LIST_REF];\n    int8_t                                chroma_weight_l1[STD_VIDEO_H264_MAX_NUM_LIST_REF][STD_VIDEO_H264_MAX_CHROMA_PLANES];\n    int8_t                                chroma_offset_l1[STD_VIDEO_H264_MAX_NUM_LIST_REF][STD_VIDEO_H264_MAX_CHROMA_PLANES];\n} StdVideoEncodeH264WeightTable;\n\ntypedef struct StdVideoEncodeH264SliceHeaderFlags {\n    uint32_t    direct_spatial_mv_pred_flag : 1;\n    uint32_t    num_ref_idx_active_override_flag : 1;\n    uint32_t    reserved : 30;\n} StdVideoEncodeH264SliceHeaderFlags;\n\ntypedef struct StdVideoEncodeH264PictureInfoFlags {\n    uint32_t    IdrPicFlag : 1;\n    uint32_t    is_reference : 1;\n    uint32_t    no_output_of_prior_pics_flag : 1;\n    uint32_t    long_term_reference_flag : 1;\n    uint32_t    adaptive_ref_pic_marking_mode_flag : 1;\n    uint32_t    reserved : 27;\n} StdVideoEncodeH264PictureInfoFlags;\n\ntypedef struct StdVideoEncodeH264ReferenceInfoFlags {\n    uint32_t    used_for_long_term_reference : 1;\n    uint32_t    reserved : 31;\n} StdVideoEncodeH264ReferenceInfoFlags;\n\ntypedef struct StdVideoEncodeH264ReferenceListsInfoFlags {\n    uint32_t    ref_pic_list_modification_flag_l0 : 1;\n    uint32_t    ref_pic_list_modification_flag_l1 : 1;\n    uint32_t    reserved : 30;\n} StdVideoEncodeH264ReferenceListsInfoFlags;\n\ntypedef struct StdVideoEncodeH264RefListModEntry {\n    StdVideoH264ModificationOfPicNumsIdc    modification_of_pic_nums_idc;\n    uint16_t                                abs_diff_pic_num_minus1;\n    uint16_t                                long_term_pic_num;\n} StdVideoEncodeH264RefListModEntry;\n\ntypedef struct StdVideoEncodeH264RefPicMarkingEntry {\n    StdVideoH264MemMgmtControlOp    memory_management_control_operation;\n    uint16_t                        difference_of_pic_nums_minus1;\n    uint16_t                        long_term_pic_num;\n    uint16_t                        long_term_frame_idx;\n    uint16_t                        max_long_term_frame_idx_plus1;\n} StdVideoEncodeH264RefPicMarkingEntry;\n\ntypedef struct StdVideoEncodeH264ReferenceListsInfo {\n    StdVideoEncodeH264ReferenceListsInfoFlags      flags;\n    uint8_t                                        num_ref_idx_l0_active_minus1;\n    uint8_t                                        num_ref_idx_l1_active_minus1;\n    uint8_t                                        RefPicList0[STD_VIDEO_H264_MAX_NUM_LIST_REF];\n    uint8_t                                        RefPicList1[STD_VIDEO_H264_MAX_NUM_LIST_REF];\n    uint8_t                                        refList0ModOpCount;\n    uint8_t                                        refList1ModOpCount;\n    uint8_t                                        refPicMarkingOpCount;\n    uint8_t                                        reserved1[7];\n    const StdVideoEncodeH264RefListModEntry*       pRefList0ModOperations;\n    const StdVideoEncodeH264RefListModEntry*       pRefList1ModOperations;\n    const StdVideoEncodeH264RefPicMarkingEntry*    pRefPicMarkingOperations;\n} StdVideoEncodeH264ReferenceListsInfo;\n\ntypedef struct StdVideoEncodeH264PictureInfo {\n    StdVideoEncodeH264PictureInfoFlags             flags;\n    uint8_t                                        seq_parameter_set_id;\n    uint8_t                                        pic_parameter_set_id;\n    uint16_t                                       idr_pic_id;\n    StdVideoH264PictureType                        primary_pic_type;\n    uint32_t                                       frame_num;\n    int32_t                                        PicOrderCnt;\n    uint8_t                                        temporal_id;\n    uint8_t                                        reserved1[3];\n    const StdVideoEncodeH264ReferenceListsInfo*    pRefLists;\n} StdVideoEncodeH264PictureInfo;\n\ntypedef struct StdVideoEncodeH264ReferenceInfo {\n    StdVideoEncodeH264ReferenceInfoFlags    flags;\n    StdVideoH264PictureType                 primary_pic_type;\n    uint32_t                                FrameNum;\n    int32_t                                 PicOrderCnt;\n    uint16_t                                long_term_pic_num;\n    uint16_t                                long_term_frame_idx;\n    uint8_t                                 temporal_id;\n} StdVideoEncodeH264ReferenceInfo;\n\ntypedef struct StdVideoEncodeH264SliceHeader {\n    StdVideoEncodeH264SliceHeaderFlags        flags;\n    uint32_t                                  first_mb_in_slice;\n    StdVideoH264SliceType                     slice_type;\n    int8_t                                    slice_alpha_c0_offset_div2;\n    int8_t                                    slice_beta_offset_div2;\n    int8_t                                    slice_qp_delta;\n    uint8_t                                   reserved1;\n    StdVideoH264CabacInitIdc                  cabac_init_idc;\n    StdVideoH264DisableDeblockingFilterIdc    disable_deblocking_filter_idc;\n    const StdVideoEncodeH264WeightTable*      pWeightTable;\n} StdVideoEncodeH264SliceHeader;\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vk_video/vulkan_video_codec_h265std.h",
    "content": "#ifndef VULKAN_VIDEO_CODEC_H265STD_H_\n#define VULKAN_VIDEO_CODEC_H265STD_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// vulkan_video_codec_h265std is a preprocessor guard. Do not pass it to API calls.\n#define vulkan_video_codec_h265std 1\n#include \"vulkan_video_codecs_common.h\"\n#define STD_VIDEO_H265_CPB_CNT_LIST_SIZE  32\n#define STD_VIDEO_H265_SUBLAYERS_LIST_SIZE 7\n#define STD_VIDEO_H265_SCALING_LIST_4X4_NUM_LISTS 6\n#define STD_VIDEO_H265_SCALING_LIST_4X4_NUM_ELEMENTS 16\n#define STD_VIDEO_H265_SCALING_LIST_8X8_NUM_LISTS 6\n#define STD_VIDEO_H265_SCALING_LIST_8X8_NUM_ELEMENTS 64\n#define STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS 6\n#define STD_VIDEO_H265_SCALING_LIST_16X16_NUM_ELEMENTS 64\n#define STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS 2\n#define STD_VIDEO_H265_SCALING_LIST_32X32_NUM_ELEMENTS 64\n#define STD_VIDEO_H265_CHROMA_QP_OFFSET_LIST_SIZE 6\n#define STD_VIDEO_H265_CHROMA_QP_OFFSET_TILE_COLS_LIST_SIZE 19\n#define STD_VIDEO_H265_CHROMA_QP_OFFSET_TILE_ROWS_LIST_SIZE 21\n#define STD_VIDEO_H265_PREDICTOR_PALETTE_COMPONENTS_LIST_SIZE 3\n#define STD_VIDEO_H265_PREDICTOR_PALETTE_COMP_ENTRIES_LIST_SIZE 128\n#define STD_VIDEO_H265_MAX_NUM_LIST_REF   15\n#define STD_VIDEO_H265_MAX_CHROMA_PLANES  2\n#define STD_VIDEO_H265_MAX_SHORT_TERM_REF_PIC_SETS 64\n#define STD_VIDEO_H265_MAX_DPB_SIZE       16\n#define STD_VIDEO_H265_MAX_LONG_TERM_REF_PICS_SPS 32\n#define STD_VIDEO_H265_MAX_LONG_TERM_PICS 16\n#define STD_VIDEO_H265_MAX_DELTA_POC      48\n#define STD_VIDEO_H265_NO_REFERENCE_PICTURE 0xFF\n\ntypedef enum StdVideoH265ChromaFormatIdc {\n    STD_VIDEO_H265_CHROMA_FORMAT_IDC_MONOCHROME = 0,\n    STD_VIDEO_H265_CHROMA_FORMAT_IDC_420 = 1,\n    STD_VIDEO_H265_CHROMA_FORMAT_IDC_422 = 2,\n    STD_VIDEO_H265_CHROMA_FORMAT_IDC_444 = 3,\n    STD_VIDEO_H265_CHROMA_FORMAT_IDC_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_H265_CHROMA_FORMAT_IDC_MAX_ENUM = 0x7FFFFFFF\n} StdVideoH265ChromaFormatIdc;\n\ntypedef enum StdVideoH265ProfileIdc {\n    STD_VIDEO_H265_PROFILE_IDC_MAIN = 1,\n    STD_VIDEO_H265_PROFILE_IDC_MAIN_10 = 2,\n    STD_VIDEO_H265_PROFILE_IDC_MAIN_STILL_PICTURE = 3,\n    STD_VIDEO_H265_PROFILE_IDC_FORMAT_RANGE_EXTENSIONS = 4,\n    STD_VIDEO_H265_PROFILE_IDC_SCC_EXTENSIONS = 9,\n    STD_VIDEO_H265_PROFILE_IDC_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_H265_PROFILE_IDC_MAX_ENUM = 0x7FFFFFFF\n} StdVideoH265ProfileIdc;\n\ntypedef enum StdVideoH265LevelIdc {\n    STD_VIDEO_H265_LEVEL_IDC_1_0 = 0,\n    STD_VIDEO_H265_LEVEL_IDC_2_0 = 1,\n    STD_VIDEO_H265_LEVEL_IDC_2_1 = 2,\n    STD_VIDEO_H265_LEVEL_IDC_3_0 = 3,\n    STD_VIDEO_H265_LEVEL_IDC_3_1 = 4,\n    STD_VIDEO_H265_LEVEL_IDC_4_0 = 5,\n    STD_VIDEO_H265_LEVEL_IDC_4_1 = 6,\n    STD_VIDEO_H265_LEVEL_IDC_5_0 = 7,\n    STD_VIDEO_H265_LEVEL_IDC_5_1 = 8,\n    STD_VIDEO_H265_LEVEL_IDC_5_2 = 9,\n    STD_VIDEO_H265_LEVEL_IDC_6_0 = 10,\n    STD_VIDEO_H265_LEVEL_IDC_6_1 = 11,\n    STD_VIDEO_H265_LEVEL_IDC_6_2 = 12,\n    STD_VIDEO_H265_LEVEL_IDC_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_H265_LEVEL_IDC_MAX_ENUM = 0x7FFFFFFF\n} StdVideoH265LevelIdc;\n\ntypedef enum StdVideoH265SliceType {\n    STD_VIDEO_H265_SLICE_TYPE_B = 0,\n    STD_VIDEO_H265_SLICE_TYPE_P = 1,\n    STD_VIDEO_H265_SLICE_TYPE_I = 2,\n    STD_VIDEO_H265_SLICE_TYPE_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_H265_SLICE_TYPE_MAX_ENUM = 0x7FFFFFFF\n} StdVideoH265SliceType;\n\ntypedef enum StdVideoH265PictureType {\n    STD_VIDEO_H265_PICTURE_TYPE_P = 0,\n    STD_VIDEO_H265_PICTURE_TYPE_B = 1,\n    STD_VIDEO_H265_PICTURE_TYPE_I = 2,\n    STD_VIDEO_H265_PICTURE_TYPE_IDR = 3,\n    STD_VIDEO_H265_PICTURE_TYPE_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_H265_PICTURE_TYPE_MAX_ENUM = 0x7FFFFFFF\n} StdVideoH265PictureType;\n\ntypedef enum StdVideoH265AspectRatioIdc {\n    STD_VIDEO_H265_ASPECT_RATIO_IDC_UNSPECIFIED = 0,\n    STD_VIDEO_H265_ASPECT_RATIO_IDC_SQUARE = 1,\n    STD_VIDEO_H265_ASPECT_RATIO_IDC_12_11 = 2,\n    STD_VIDEO_H265_ASPECT_RATIO_IDC_10_11 = 3,\n    STD_VIDEO_H265_ASPECT_RATIO_IDC_16_11 = 4,\n    STD_VIDEO_H265_ASPECT_RATIO_IDC_40_33 = 5,\n    STD_VIDEO_H265_ASPECT_RATIO_IDC_24_11 = 6,\n    STD_VIDEO_H265_ASPECT_RATIO_IDC_20_11 = 7,\n    STD_VIDEO_H265_ASPECT_RATIO_IDC_32_11 = 8,\n    STD_VIDEO_H265_ASPECT_RATIO_IDC_80_33 = 9,\n    STD_VIDEO_H265_ASPECT_RATIO_IDC_18_11 = 10,\n    STD_VIDEO_H265_ASPECT_RATIO_IDC_15_11 = 11,\n    STD_VIDEO_H265_ASPECT_RATIO_IDC_64_33 = 12,\n    STD_VIDEO_H265_ASPECT_RATIO_IDC_160_99 = 13,\n    STD_VIDEO_H265_ASPECT_RATIO_IDC_4_3 = 14,\n    STD_VIDEO_H265_ASPECT_RATIO_IDC_3_2 = 15,\n    STD_VIDEO_H265_ASPECT_RATIO_IDC_2_1 = 16,\n    STD_VIDEO_H265_ASPECT_RATIO_IDC_EXTENDED_SAR = 255,\n    STD_VIDEO_H265_ASPECT_RATIO_IDC_INVALID = 0x7FFFFFFF,\n    STD_VIDEO_H265_ASPECT_RATIO_IDC_MAX_ENUM = 0x7FFFFFFF\n} StdVideoH265AspectRatioIdc;\ntypedef struct StdVideoH265DecPicBufMgr {\n    uint32_t    max_latency_increase_plus1[STD_VIDEO_H265_SUBLAYERS_LIST_SIZE];\n    uint8_t     max_dec_pic_buffering_minus1[STD_VIDEO_H265_SUBLAYERS_LIST_SIZE];\n    uint8_t     max_num_reorder_pics[STD_VIDEO_H265_SUBLAYERS_LIST_SIZE];\n} StdVideoH265DecPicBufMgr;\n\ntypedef struct StdVideoH265SubLayerHrdParameters {\n    uint32_t    bit_rate_value_minus1[STD_VIDEO_H265_CPB_CNT_LIST_SIZE];\n    uint32_t    cpb_size_value_minus1[STD_VIDEO_H265_CPB_CNT_LIST_SIZE];\n    uint32_t    cpb_size_du_value_minus1[STD_VIDEO_H265_CPB_CNT_LIST_SIZE];\n    uint32_t    bit_rate_du_value_minus1[STD_VIDEO_H265_CPB_CNT_LIST_SIZE];\n    uint32_t    cbr_flag;\n} StdVideoH265SubLayerHrdParameters;\n\ntypedef struct StdVideoH265HrdFlags {\n    uint32_t    nal_hrd_parameters_present_flag : 1;\n    uint32_t    vcl_hrd_parameters_present_flag : 1;\n    uint32_t    sub_pic_hrd_params_present_flag : 1;\n    uint32_t    sub_pic_cpb_params_in_pic_timing_sei_flag : 1;\n    uint32_t    fixed_pic_rate_general_flag : 8;\n    uint32_t    fixed_pic_rate_within_cvs_flag : 8;\n    uint32_t    low_delay_hrd_flag : 8;\n} StdVideoH265HrdFlags;\n\ntypedef struct StdVideoH265HrdParameters {\n    StdVideoH265HrdFlags                        flags;\n    uint8_t                                     tick_divisor_minus2;\n    uint8_t                                     du_cpb_removal_delay_increment_length_minus1;\n    uint8_t                                     dpb_output_delay_du_length_minus1;\n    uint8_t                                     bit_rate_scale;\n    uint8_t                                     cpb_size_scale;\n    uint8_t                                     cpb_size_du_scale;\n    uint8_t                                     initial_cpb_removal_delay_length_minus1;\n    uint8_t                                     au_cpb_removal_delay_length_minus1;\n    uint8_t                                     dpb_output_delay_length_minus1;\n    uint8_t                                     cpb_cnt_minus1[STD_VIDEO_H265_SUBLAYERS_LIST_SIZE];\n    uint16_t                                    elemental_duration_in_tc_minus1[STD_VIDEO_H265_SUBLAYERS_LIST_SIZE];\n    uint16_t                                    reserved[3];\n    const StdVideoH265SubLayerHrdParameters*    pSubLayerHrdParametersNal;\n    const StdVideoH265SubLayerHrdParameters*    pSubLayerHrdParametersVcl;\n} StdVideoH265HrdParameters;\n\ntypedef struct StdVideoH265VpsFlags {\n    uint32_t    vps_temporal_id_nesting_flag : 1;\n    uint32_t    vps_sub_layer_ordering_info_present_flag : 1;\n    uint32_t    vps_timing_info_present_flag : 1;\n    uint32_t    vps_poc_proportional_to_timing_flag : 1;\n} StdVideoH265VpsFlags;\n\ntypedef struct StdVideoH265ProfileTierLevelFlags {\n    uint32_t    general_tier_flag : 1;\n    uint32_t    general_progressive_source_flag : 1;\n    uint32_t    general_interlaced_source_flag : 1;\n    uint32_t    general_non_packed_constraint_flag : 1;\n    uint32_t    general_frame_only_constraint_flag : 1;\n} StdVideoH265ProfileTierLevelFlags;\n\ntypedef struct StdVideoH265ProfileTierLevel {\n    StdVideoH265ProfileTierLevelFlags    flags;\n    StdVideoH265ProfileIdc               general_profile_idc;\n    StdVideoH265LevelIdc                 general_level_idc;\n} StdVideoH265ProfileTierLevel;\n\ntypedef struct StdVideoH265VideoParameterSet {\n    StdVideoH265VpsFlags                   flags;\n    uint8_t                                vps_video_parameter_set_id;\n    uint8_t                                vps_max_sub_layers_minus1;\n    uint8_t                                reserved1;\n    uint8_t                                reserved2;\n    uint32_t                               vps_num_units_in_tick;\n    uint32_t                               vps_time_scale;\n    uint32_t                               vps_num_ticks_poc_diff_one_minus1;\n    uint32_t                               reserved3;\n    const StdVideoH265DecPicBufMgr*        pDecPicBufMgr;\n    const StdVideoH265HrdParameters*       pHrdParameters;\n    const StdVideoH265ProfileTierLevel*    pProfileTierLevel;\n} StdVideoH265VideoParameterSet;\n\ntypedef struct StdVideoH265ScalingLists {\n    uint8_t    ScalingList4x4[STD_VIDEO_H265_SCALING_LIST_4X4_NUM_LISTS][STD_VIDEO_H265_SCALING_LIST_4X4_NUM_ELEMENTS];\n    uint8_t    ScalingList8x8[STD_VIDEO_H265_SCALING_LIST_8X8_NUM_LISTS][STD_VIDEO_H265_SCALING_LIST_8X8_NUM_ELEMENTS];\n    uint8_t    ScalingList16x16[STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS][STD_VIDEO_H265_SCALING_LIST_16X16_NUM_ELEMENTS];\n    uint8_t    ScalingList32x32[STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS][STD_VIDEO_H265_SCALING_LIST_32X32_NUM_ELEMENTS];\n    uint8_t    ScalingListDCCoef16x16[STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS];\n    uint8_t    ScalingListDCCoef32x32[STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS];\n} StdVideoH265ScalingLists;\n\ntypedef struct StdVideoH265SpsVuiFlags {\n    uint32_t    aspect_ratio_info_present_flag : 1;\n    uint32_t    overscan_info_present_flag : 1;\n    uint32_t    overscan_appropriate_flag : 1;\n    uint32_t    video_signal_type_present_flag : 1;\n    uint32_t    video_full_range_flag : 1;\n    uint32_t    colour_description_present_flag : 1;\n    uint32_t    chroma_loc_info_present_flag : 1;\n    uint32_t    neutral_chroma_indication_flag : 1;\n    uint32_t    field_seq_flag : 1;\n    uint32_t    frame_field_info_present_flag : 1;\n    uint32_t    default_display_window_flag : 1;\n    uint32_t    vui_timing_info_present_flag : 1;\n    uint32_t    vui_poc_proportional_to_timing_flag : 1;\n    uint32_t    vui_hrd_parameters_present_flag : 1;\n    uint32_t    bitstream_restriction_flag : 1;\n    uint32_t    tiles_fixed_structure_flag : 1;\n    uint32_t    motion_vectors_over_pic_boundaries_flag : 1;\n    uint32_t    restricted_ref_pic_lists_flag : 1;\n} StdVideoH265SpsVuiFlags;\n\ntypedef struct StdVideoH265SequenceParameterSetVui {\n    StdVideoH265SpsVuiFlags             flags;\n    StdVideoH265AspectRatioIdc          aspect_ratio_idc;\n    uint16_t                            sar_width;\n    uint16_t                            sar_height;\n    uint8_t                             video_format;\n    uint8_t                             colour_primaries;\n    uint8_t                             transfer_characteristics;\n    uint8_t                             matrix_coeffs;\n    uint8_t                             chroma_sample_loc_type_top_field;\n    uint8_t                             chroma_sample_loc_type_bottom_field;\n    uint8_t                             reserved1;\n    uint8_t                             reserved2;\n    uint16_t                            def_disp_win_left_offset;\n    uint16_t                            def_disp_win_right_offset;\n    uint16_t                            def_disp_win_top_offset;\n    uint16_t                            def_disp_win_bottom_offset;\n    uint32_t                            vui_num_units_in_tick;\n    uint32_t                            vui_time_scale;\n    uint32_t                            vui_num_ticks_poc_diff_one_minus1;\n    uint16_t                            min_spatial_segmentation_idc;\n    uint16_t                            reserved3;\n    uint8_t                             max_bytes_per_pic_denom;\n    uint8_t                             max_bits_per_min_cu_denom;\n    uint8_t                             log2_max_mv_length_horizontal;\n    uint8_t                             log2_max_mv_length_vertical;\n    const StdVideoH265HrdParameters*    pHrdParameters;\n} StdVideoH265SequenceParameterSetVui;\n\ntypedef struct StdVideoH265PredictorPaletteEntries {\n    uint16_t    PredictorPaletteEntries[STD_VIDEO_H265_PREDICTOR_PALETTE_COMPONENTS_LIST_SIZE][STD_VIDEO_H265_PREDICTOR_PALETTE_COMP_ENTRIES_LIST_SIZE];\n} StdVideoH265PredictorPaletteEntries;\n\ntypedef struct StdVideoH265SpsFlags {\n    uint32_t    sps_temporal_id_nesting_flag : 1;\n    uint32_t    separate_colour_plane_flag : 1;\n    uint32_t    conformance_window_flag : 1;\n    uint32_t    sps_sub_layer_ordering_info_present_flag : 1;\n    uint32_t    scaling_list_enabled_flag : 1;\n    uint32_t    sps_scaling_list_data_present_flag : 1;\n    uint32_t    amp_enabled_flag : 1;\n    uint32_t    sample_adaptive_offset_enabled_flag : 1;\n    uint32_t    pcm_enabled_flag : 1;\n    uint32_t    pcm_loop_filter_disabled_flag : 1;\n    uint32_t    long_term_ref_pics_present_flag : 1;\n    uint32_t    sps_temporal_mvp_enabled_flag : 1;\n    uint32_t    strong_intra_smoothing_enabled_flag : 1;\n    uint32_t    vui_parameters_present_flag : 1;\n    uint32_t    sps_extension_present_flag : 1;\n    uint32_t    sps_range_extension_flag : 1;\n    uint32_t    transform_skip_rotation_enabled_flag : 1;\n    uint32_t    transform_skip_context_enabled_flag : 1;\n    uint32_t    implicit_rdpcm_enabled_flag : 1;\n    uint32_t    explicit_rdpcm_enabled_flag : 1;\n    uint32_t    extended_precision_processing_flag : 1;\n    uint32_t    intra_smoothing_disabled_flag : 1;\n    uint32_t    high_precision_offsets_enabled_flag : 1;\n    uint32_t    persistent_rice_adaptation_enabled_flag : 1;\n    uint32_t    cabac_bypass_alignment_enabled_flag : 1;\n    uint32_t    sps_scc_extension_flag : 1;\n    uint32_t    sps_curr_pic_ref_enabled_flag : 1;\n    uint32_t    palette_mode_enabled_flag : 1;\n    uint32_t    sps_palette_predictor_initializers_present_flag : 1;\n    uint32_t    intra_boundary_filtering_disabled_flag : 1;\n} StdVideoH265SpsFlags;\n\ntypedef struct StdVideoH265ShortTermRefPicSetFlags {\n    uint32_t    inter_ref_pic_set_prediction_flag : 1;\n    uint32_t    delta_rps_sign : 1;\n} StdVideoH265ShortTermRefPicSetFlags;\n\ntypedef struct StdVideoH265ShortTermRefPicSet {\n    StdVideoH265ShortTermRefPicSetFlags    flags;\n    uint32_t                               delta_idx_minus1;\n    uint16_t                               use_delta_flag;\n    uint16_t                               abs_delta_rps_minus1;\n    uint16_t                               used_by_curr_pic_flag;\n    uint16_t                               used_by_curr_pic_s0_flag;\n    uint16_t                               used_by_curr_pic_s1_flag;\n    uint16_t                               reserved1;\n    uint8_t                                reserved2;\n    uint8_t                                reserved3;\n    uint8_t                                num_negative_pics;\n    uint8_t                                num_positive_pics;\n    uint16_t                               delta_poc_s0_minus1[STD_VIDEO_H265_MAX_DPB_SIZE];\n    uint16_t                               delta_poc_s1_minus1[STD_VIDEO_H265_MAX_DPB_SIZE];\n} StdVideoH265ShortTermRefPicSet;\n\ntypedef struct StdVideoH265LongTermRefPicsSps {\n    uint32_t    used_by_curr_pic_lt_sps_flag;\n    uint32_t    lt_ref_pic_poc_lsb_sps[STD_VIDEO_H265_MAX_LONG_TERM_REF_PICS_SPS];\n} StdVideoH265LongTermRefPicsSps;\n\ntypedef struct StdVideoH265SequenceParameterSet {\n    StdVideoH265SpsFlags                          flags;\n    StdVideoH265ChromaFormatIdc                   chroma_format_idc;\n    uint32_t                                      pic_width_in_luma_samples;\n    uint32_t                                      pic_height_in_luma_samples;\n    uint8_t                                       sps_video_parameter_set_id;\n    uint8_t                                       sps_max_sub_layers_minus1;\n    uint8_t                                       sps_seq_parameter_set_id;\n    uint8_t                                       bit_depth_luma_minus8;\n    uint8_t                                       bit_depth_chroma_minus8;\n    uint8_t                                       log2_max_pic_order_cnt_lsb_minus4;\n    uint8_t                                       log2_min_luma_coding_block_size_minus3;\n    uint8_t                                       log2_diff_max_min_luma_coding_block_size;\n    uint8_t                                       log2_min_luma_transform_block_size_minus2;\n    uint8_t                                       log2_diff_max_min_luma_transform_block_size;\n    uint8_t                                       max_transform_hierarchy_depth_inter;\n    uint8_t                                       max_transform_hierarchy_depth_intra;\n    uint8_t                                       num_short_term_ref_pic_sets;\n    uint8_t                                       num_long_term_ref_pics_sps;\n    uint8_t                                       pcm_sample_bit_depth_luma_minus1;\n    uint8_t                                       pcm_sample_bit_depth_chroma_minus1;\n    uint8_t                                       log2_min_pcm_luma_coding_block_size_minus3;\n    uint8_t                                       log2_diff_max_min_pcm_luma_coding_block_size;\n    uint8_t                                       reserved1;\n    uint8_t                                       reserved2;\n    uint8_t                                       palette_max_size;\n    uint8_t                                       delta_palette_max_predictor_size;\n    uint8_t                                       motion_vector_resolution_control_idc;\n    uint8_t                                       sps_num_palette_predictor_initializers_minus1;\n    uint32_t                                      conf_win_left_offset;\n    uint32_t                                      conf_win_right_offset;\n    uint32_t                                      conf_win_top_offset;\n    uint32_t                                      conf_win_bottom_offset;\n    const StdVideoH265ProfileTierLevel*           pProfileTierLevel;\n    const StdVideoH265DecPicBufMgr*               pDecPicBufMgr;\n    const StdVideoH265ScalingLists*               pScalingLists;\n    const StdVideoH265ShortTermRefPicSet*         pShortTermRefPicSet;\n    const StdVideoH265LongTermRefPicsSps*         pLongTermRefPicsSps;\n    const StdVideoH265SequenceParameterSetVui*    pSequenceParameterSetVui;\n    const StdVideoH265PredictorPaletteEntries*    pPredictorPaletteEntries;\n} StdVideoH265SequenceParameterSet;\n\ntypedef struct StdVideoH265PpsFlags {\n    uint32_t    dependent_slice_segments_enabled_flag : 1;\n    uint32_t    output_flag_present_flag : 1;\n    uint32_t    sign_data_hiding_enabled_flag : 1;\n    uint32_t    cabac_init_present_flag : 1;\n    uint32_t    constrained_intra_pred_flag : 1;\n    uint32_t    transform_skip_enabled_flag : 1;\n    uint32_t    cu_qp_delta_enabled_flag : 1;\n    uint32_t    pps_slice_chroma_qp_offsets_present_flag : 1;\n    uint32_t    weighted_pred_flag : 1;\n    uint32_t    weighted_bipred_flag : 1;\n    uint32_t    transquant_bypass_enabled_flag : 1;\n    uint32_t    tiles_enabled_flag : 1;\n    uint32_t    entropy_coding_sync_enabled_flag : 1;\n    uint32_t    uniform_spacing_flag : 1;\n    uint32_t    loop_filter_across_tiles_enabled_flag : 1;\n    uint32_t    pps_loop_filter_across_slices_enabled_flag : 1;\n    uint32_t    deblocking_filter_control_present_flag : 1;\n    uint32_t    deblocking_filter_override_enabled_flag : 1;\n    uint32_t    pps_deblocking_filter_disabled_flag : 1;\n    uint32_t    pps_scaling_list_data_present_flag : 1;\n    uint32_t    lists_modification_present_flag : 1;\n    uint32_t    slice_segment_header_extension_present_flag : 1;\n    uint32_t    pps_extension_present_flag : 1;\n    uint32_t    cross_component_prediction_enabled_flag : 1;\n    uint32_t    chroma_qp_offset_list_enabled_flag : 1;\n    uint32_t    pps_curr_pic_ref_enabled_flag : 1;\n    uint32_t    residual_adaptive_colour_transform_enabled_flag : 1;\n    uint32_t    pps_slice_act_qp_offsets_present_flag : 1;\n    uint32_t    pps_palette_predictor_initializers_present_flag : 1;\n    uint32_t    monochrome_palette_flag : 1;\n    uint32_t    pps_range_extension_flag : 1;\n} StdVideoH265PpsFlags;\n\ntypedef struct StdVideoH265PictureParameterSet {\n    StdVideoH265PpsFlags                          flags;\n    uint8_t                                       pps_pic_parameter_set_id;\n    uint8_t                                       pps_seq_parameter_set_id;\n    uint8_t                                       sps_video_parameter_set_id;\n    uint8_t                                       num_extra_slice_header_bits;\n    uint8_t                                       num_ref_idx_l0_default_active_minus1;\n    uint8_t                                       num_ref_idx_l1_default_active_minus1;\n    int8_t                                        init_qp_minus26;\n    uint8_t                                       diff_cu_qp_delta_depth;\n    int8_t                                        pps_cb_qp_offset;\n    int8_t                                        pps_cr_qp_offset;\n    int8_t                                        pps_beta_offset_div2;\n    int8_t                                        pps_tc_offset_div2;\n    uint8_t                                       log2_parallel_merge_level_minus2;\n    uint8_t                                       log2_max_transform_skip_block_size_minus2;\n    uint8_t                                       diff_cu_chroma_qp_offset_depth;\n    uint8_t                                       chroma_qp_offset_list_len_minus1;\n    int8_t                                        cb_qp_offset_list[STD_VIDEO_H265_CHROMA_QP_OFFSET_LIST_SIZE];\n    int8_t                                        cr_qp_offset_list[STD_VIDEO_H265_CHROMA_QP_OFFSET_LIST_SIZE];\n    uint8_t                                       log2_sao_offset_scale_luma;\n    uint8_t                                       log2_sao_offset_scale_chroma;\n    int8_t                                        pps_act_y_qp_offset_plus5;\n    int8_t                                        pps_act_cb_qp_offset_plus5;\n    int8_t                                        pps_act_cr_qp_offset_plus3;\n    uint8_t                                       pps_num_palette_predictor_initializers;\n    uint8_t                                       luma_bit_depth_entry_minus8;\n    uint8_t                                       chroma_bit_depth_entry_minus8;\n    uint8_t                                       num_tile_columns_minus1;\n    uint8_t                                       num_tile_rows_minus1;\n    uint8_t                                       reserved1;\n    uint8_t                                       reserved2;\n    uint16_t                                      column_width_minus1[STD_VIDEO_H265_CHROMA_QP_OFFSET_TILE_COLS_LIST_SIZE];\n    uint16_t                                      row_height_minus1[STD_VIDEO_H265_CHROMA_QP_OFFSET_TILE_ROWS_LIST_SIZE];\n    uint32_t                                      reserved3;\n    const StdVideoH265ScalingLists*               pScalingLists;\n    const StdVideoH265PredictorPaletteEntries*    pPredictorPaletteEntries;\n} StdVideoH265PictureParameterSet;\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vk_video/vulkan_video_codec_h265std_decode.h",
    "content": "#ifndef VULKAN_VIDEO_CODEC_H265STD_DECODE_H_\n#define VULKAN_VIDEO_CODEC_H265STD_DECODE_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// vulkan_video_codec_h265std_decode is a preprocessor guard. Do not pass it to API calls.\n#define vulkan_video_codec_h265std_decode 1\n#include \"vulkan_video_codec_h265std.h\"\n\n#define VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_API_VERSION_1_0_0 VK_MAKE_VIDEO_STD_VERSION(1, 0, 0)\n\n#define VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_API_VERSION_1_0_0\n#define VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_EXTENSION_NAME \"VK_STD_vulkan_video_codec_h265_decode\"\n#define STD_VIDEO_DECODE_H265_REF_PIC_SET_LIST_SIZE 8\ntypedef struct StdVideoDecodeH265PictureInfoFlags {\n    uint32_t    IrapPicFlag : 1;\n    uint32_t    IdrPicFlag  : 1;\n    uint32_t    IsReference : 1;\n    uint32_t    short_term_ref_pic_set_sps_flag : 1;\n} StdVideoDecodeH265PictureInfoFlags;\n\ntypedef struct StdVideoDecodeH265PictureInfo {\n    StdVideoDecodeH265PictureInfoFlags    flags;\n    uint8_t                               sps_video_parameter_set_id;\n    uint8_t                               pps_seq_parameter_set_id;\n    uint8_t                               pps_pic_parameter_set_id;\n    uint8_t                               NumDeltaPocsOfRefRpsIdx;\n    int32_t                               PicOrderCntVal;\n    uint16_t                              NumBitsForSTRefPicSetInSlice;\n    uint16_t                              reserved;\n    uint8_t                               RefPicSetStCurrBefore[STD_VIDEO_DECODE_H265_REF_PIC_SET_LIST_SIZE];\n    uint8_t                               RefPicSetStCurrAfter[STD_VIDEO_DECODE_H265_REF_PIC_SET_LIST_SIZE];\n    uint8_t                               RefPicSetLtCurr[STD_VIDEO_DECODE_H265_REF_PIC_SET_LIST_SIZE];\n} StdVideoDecodeH265PictureInfo;\n\ntypedef struct StdVideoDecodeH265ReferenceInfoFlags {\n    uint32_t    used_for_long_term_reference : 1;\n    uint32_t    unused_for_reference : 1;\n} StdVideoDecodeH265ReferenceInfoFlags;\n\ntypedef struct StdVideoDecodeH265ReferenceInfo {\n    StdVideoDecodeH265ReferenceInfoFlags    flags;\n    int32_t                                 PicOrderCntVal;\n} StdVideoDecodeH265ReferenceInfo;\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vk_video/vulkan_video_codec_h265std_encode.h",
    "content": "#ifndef VULKAN_VIDEO_CODEC_H265STD_ENCODE_H_\n#define VULKAN_VIDEO_CODEC_H265STD_ENCODE_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// vulkan_video_codec_h265std_encode is a preprocessor guard. Do not pass it to API calls.\n#define vulkan_video_codec_h265std_encode 1\n#include \"vulkan_video_codec_h265std.h\"\n\n#define VK_STD_VULKAN_VIDEO_CODEC_H265_ENCODE_API_VERSION_1_0_0 VK_MAKE_VIDEO_STD_VERSION(1, 0, 0)\n\n#define VK_STD_VULKAN_VIDEO_CODEC_H265_ENCODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H265_ENCODE_API_VERSION_1_0_0\n#define VK_STD_VULKAN_VIDEO_CODEC_H265_ENCODE_EXTENSION_NAME \"VK_STD_vulkan_video_codec_h265_encode\"\ntypedef struct StdVideoEncodeH265WeightTableFlags {\n    uint16_t    luma_weight_l0_flag;\n    uint16_t    chroma_weight_l0_flag;\n    uint16_t    luma_weight_l1_flag;\n    uint16_t    chroma_weight_l1_flag;\n} StdVideoEncodeH265WeightTableFlags;\n\ntypedef struct StdVideoEncodeH265WeightTable {\n    StdVideoEncodeH265WeightTableFlags    flags;\n    uint8_t                               luma_log2_weight_denom;\n    int8_t                                delta_chroma_log2_weight_denom;\n    int8_t                                delta_luma_weight_l0[STD_VIDEO_H265_MAX_NUM_LIST_REF];\n    int8_t                                luma_offset_l0[STD_VIDEO_H265_MAX_NUM_LIST_REF];\n    int8_t                                delta_chroma_weight_l0[STD_VIDEO_H265_MAX_NUM_LIST_REF][STD_VIDEO_H265_MAX_CHROMA_PLANES];\n    int8_t                                delta_chroma_offset_l0[STD_VIDEO_H265_MAX_NUM_LIST_REF][STD_VIDEO_H265_MAX_CHROMA_PLANES];\n    int8_t                                delta_luma_weight_l1[STD_VIDEO_H265_MAX_NUM_LIST_REF];\n    int8_t                                luma_offset_l1[STD_VIDEO_H265_MAX_NUM_LIST_REF];\n    int8_t                                delta_chroma_weight_l1[STD_VIDEO_H265_MAX_NUM_LIST_REF][STD_VIDEO_H265_MAX_CHROMA_PLANES];\n    int8_t                                delta_chroma_offset_l1[STD_VIDEO_H265_MAX_NUM_LIST_REF][STD_VIDEO_H265_MAX_CHROMA_PLANES];\n} StdVideoEncodeH265WeightTable;\n\ntypedef struct StdVideoEncodeH265SliceSegmentHeaderFlags {\n    uint32_t    first_slice_segment_in_pic_flag : 1;\n    uint32_t    dependent_slice_segment_flag : 1;\n    uint32_t    slice_sao_luma_flag : 1;\n    uint32_t    slice_sao_chroma_flag : 1;\n    uint32_t    num_ref_idx_active_override_flag : 1;\n    uint32_t    mvd_l1_zero_flag : 1;\n    uint32_t    cabac_init_flag : 1;\n    uint32_t    cu_chroma_qp_offset_enabled_flag : 1;\n    uint32_t    deblocking_filter_override_flag : 1;\n    uint32_t    slice_deblocking_filter_disabled_flag : 1;\n    uint32_t    collocated_from_l0_flag : 1;\n    uint32_t    slice_loop_filter_across_slices_enabled_flag : 1;\n    uint32_t    reserved : 20;\n} StdVideoEncodeH265SliceSegmentHeaderFlags;\n\ntypedef struct StdVideoEncodeH265SliceSegmentHeader {\n    StdVideoEncodeH265SliceSegmentHeaderFlags    flags;\n    StdVideoH265SliceType                        slice_type;\n    uint32_t                                     slice_segment_address;\n    uint8_t                                      collocated_ref_idx;\n    uint8_t                                      MaxNumMergeCand;\n    int8_t                                       slice_cb_qp_offset;\n    int8_t                                       slice_cr_qp_offset;\n    int8_t                                       slice_beta_offset_div2;\n    int8_t                                       slice_tc_offset_div2;\n    int8_t                                       slice_act_y_qp_offset;\n    int8_t                                       slice_act_cb_qp_offset;\n    int8_t                                       slice_act_cr_qp_offset;\n    int8_t                                       slice_qp_delta;\n    uint16_t                                     reserved1;\n    const StdVideoEncodeH265WeightTable*         pWeightTable;\n} StdVideoEncodeH265SliceSegmentHeader;\n\ntypedef struct StdVideoEncodeH265ReferenceListsInfoFlags {\n    uint32_t    ref_pic_list_modification_flag_l0 : 1;\n    uint32_t    ref_pic_list_modification_flag_l1 : 1;\n    uint32_t    reserved : 30;\n} StdVideoEncodeH265ReferenceListsInfoFlags;\n\ntypedef struct StdVideoEncodeH265ReferenceListsInfo {\n    StdVideoEncodeH265ReferenceListsInfoFlags    flags;\n    uint8_t                                      num_ref_idx_l0_active_minus1;\n    uint8_t                                      num_ref_idx_l1_active_minus1;\n    uint8_t                                      RefPicList0[STD_VIDEO_H265_MAX_NUM_LIST_REF];\n    uint8_t                                      RefPicList1[STD_VIDEO_H265_MAX_NUM_LIST_REF];\n    uint8_t                                      list_entry_l0[STD_VIDEO_H265_MAX_NUM_LIST_REF];\n    uint8_t                                      list_entry_l1[STD_VIDEO_H265_MAX_NUM_LIST_REF];\n} StdVideoEncodeH265ReferenceListsInfo;\n\ntypedef struct StdVideoEncodeH265PictureInfoFlags {\n    uint32_t    is_reference : 1;\n    uint32_t    IrapPicFlag : 1;\n    uint32_t    used_for_long_term_reference : 1;\n    uint32_t    discardable_flag : 1;\n    uint32_t    cross_layer_bla_flag : 1;\n    uint32_t    pic_output_flag : 1;\n    uint32_t    no_output_of_prior_pics_flag : 1;\n    uint32_t    short_term_ref_pic_set_sps_flag : 1;\n    uint32_t    slice_temporal_mvp_enabled_flag : 1;\n    uint32_t    reserved : 23;\n} StdVideoEncodeH265PictureInfoFlags;\n\ntypedef struct StdVideoEncodeH265LongTermRefPics {\n    uint8_t     num_long_term_sps;\n    uint8_t     num_long_term_pics;\n    uint8_t     lt_idx_sps[STD_VIDEO_H265_MAX_LONG_TERM_REF_PICS_SPS];\n    uint8_t     poc_lsb_lt[STD_VIDEO_H265_MAX_LONG_TERM_PICS];\n    uint16_t    used_by_curr_pic_lt_flag;\n    uint8_t     delta_poc_msb_present_flag[STD_VIDEO_H265_MAX_DELTA_POC];\n    uint8_t     delta_poc_msb_cycle_lt[STD_VIDEO_H265_MAX_DELTA_POC];\n} StdVideoEncodeH265LongTermRefPics;\n\ntypedef struct StdVideoEncodeH265PictureInfo {\n    StdVideoEncodeH265PictureInfoFlags             flags;\n    StdVideoH265PictureType                        pic_type;\n    uint8_t                                        sps_video_parameter_set_id;\n    uint8_t                                        pps_seq_parameter_set_id;\n    uint8_t                                        pps_pic_parameter_set_id;\n    uint8_t                                        short_term_ref_pic_set_idx;\n    int32_t                                        PicOrderCntVal;\n    uint8_t                                        TemporalId;\n    uint8_t                                        reserved1[7];\n    const StdVideoEncodeH265ReferenceListsInfo*    pRefLists;\n    const StdVideoH265ShortTermRefPicSet*          pShortTermRefPicSet;\n    const StdVideoEncodeH265LongTermRefPics*       pLongTermRefPics;\n} StdVideoEncodeH265PictureInfo;\n\ntypedef struct StdVideoEncodeH265ReferenceInfoFlags {\n    uint32_t    used_for_long_term_reference : 1;\n    uint32_t    unused_for_reference : 1;\n    uint32_t    reserved : 30;\n} StdVideoEncodeH265ReferenceInfoFlags;\n\ntypedef struct StdVideoEncodeH265ReferenceInfo {\n    StdVideoEncodeH265ReferenceInfoFlags    flags;\n    StdVideoH265PictureType                 pic_type;\n    int32_t                                 PicOrderCntVal;\n    uint8_t                                 TemporalId;\n} StdVideoEncodeH265ReferenceInfo;\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vk_video/vulkan_video_codecs_common.h",
    "content": "#ifndef VULKAN_VIDEO_CODECS_COMMON_H_\n#define VULKAN_VIDEO_CODECS_COMMON_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// vulkan_video_codecs_common is a preprocessor guard. Do not pass it to API calls.\n#define vulkan_video_codecs_common 1\n#if !defined(VK_NO_STDINT_H)\n    #include <stdint.h>\n#endif\n\n#define VK_MAKE_VIDEO_STD_VERSION(major, minor, patch) \\\n    ((((uint32_t)(major)) << 22) | (((uint32_t)(minor)) << 12) | ((uint32_t)(patch)))\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vma/vk_mem_alloc.h",
    "content": "//\n// Copyright (c) 2017-2025 Advanced Micro Devices, Inc. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\n#ifndef AMD_VULKAN_MEMORY_ALLOCATOR_H\n#define AMD_VULKAN_MEMORY_ALLOCATOR_H\n\n/** \\mainpage Vulkan Memory Allocator\n\n<b>Version 3.2.1</b>\n\nCopyright (c) 2017-2025 Advanced Micro Devices, Inc. All rights reserved. \\n\nLicense: MIT \\n\nSee also: [product page on GPUOpen](https://gpuopen.com/gaming-product/vulkan-memory-allocator/),\n[repository on GitHub](https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator)\n\n\n<b>API documentation divided into groups:</b> [Topics](topics.html)\n\n<b>General documentation chapters:</b>\n\n- <b>User guide</b>\n  - \\subpage quick_start\n    - [Project setup](@ref quick_start_project_setup)\n    - [Initialization](@ref quick_start_initialization)\n    - [Resource allocation](@ref quick_start_resource_allocation)\n  - \\subpage choosing_memory_type\n    - [Usage](@ref choosing_memory_type_usage)\n    - [Required and preferred flags](@ref choosing_memory_type_required_preferred_flags)\n    - [Explicit memory types](@ref choosing_memory_type_explicit_memory_types)\n    - [Custom memory pools](@ref choosing_memory_type_custom_memory_pools)\n    - [Dedicated allocations](@ref choosing_memory_type_dedicated_allocations)\n  - \\subpage memory_mapping\n    - [Copy functions](@ref memory_mapping_copy_functions)\n    - [Mapping functions](@ref memory_mapping_mapping_functions)\n    - [Persistently mapped memory](@ref memory_mapping_persistently_mapped_memory)\n    - [Cache flush and invalidate](@ref memory_mapping_cache_control)\n  - \\subpage staying_within_budget\n    - [Querying for budget](@ref staying_within_budget_querying_for_budget)\n    - [Controlling memory usage](@ref staying_within_budget_controlling_memory_usage)\n  - \\subpage resource_aliasing\n  - \\subpage custom_memory_pools\n    - [Choosing memory type index](@ref custom_memory_pools_MemTypeIndex)\n    - [When not to use custom pools](@ref custom_memory_pools_when_not_use)\n    - [Linear allocation algorithm](@ref linear_algorithm)\n      - [Free-at-once](@ref linear_algorithm_free_at_once)\n      - [Stack](@ref linear_algorithm_stack)\n      - [Double stack](@ref linear_algorithm_double_stack)\n      - [Ring buffer](@ref linear_algorithm_ring_buffer)\n  - \\subpage defragmentation\n  - \\subpage statistics\n    - [Numeric statistics](@ref statistics_numeric_statistics)\n    - [JSON dump](@ref statistics_json_dump)\n  - \\subpage allocation_annotation\n    - [Allocation user data](@ref allocation_user_data)\n    - [Allocation names](@ref allocation_names)\n  - \\subpage virtual_allocator\n  - \\subpage debugging_memory_usage\n    - [Memory initialization](@ref debugging_memory_usage_initialization)\n    - [Margins](@ref debugging_memory_usage_margins)\n    - [Corruption detection](@ref debugging_memory_usage_corruption_detection)\n    - [Leak detection features](@ref debugging_memory_usage_leak_detection)\n  - \\subpage other_api_interop\n- \\subpage usage_patterns\n    - [GPU-only resource](@ref usage_patterns_gpu_only)\n    - [Staging copy for upload](@ref usage_patterns_staging_copy_upload)\n    - [Readback](@ref usage_patterns_readback)\n    - [Advanced data uploading](@ref usage_patterns_advanced_data_uploading)\n    - [Other use cases](@ref usage_patterns_other_use_cases)\n- \\subpage configuration\n  - [Pointers to Vulkan functions](@ref config_Vulkan_functions)\n  - [Custom host memory allocator](@ref custom_memory_allocator)\n  - [Device memory allocation callbacks](@ref allocation_callbacks)\n  - [Device heap memory limit](@ref heap_memory_limit)\n- <b>Extension support</b>\n    - \\subpage vk_khr_dedicated_allocation\n    - \\subpage enabling_buffer_device_address\n    - \\subpage vk_ext_memory_priority\n    - \\subpage vk_amd_device_coherent_memory\n    - \\subpage vk_khr_external_memory_win32\n- \\subpage general_considerations\n  - [Thread safety](@ref general_considerations_thread_safety)\n  - [Versioning and compatibility](@ref general_considerations_versioning_and_compatibility)\n  - [Validation layer warnings](@ref general_considerations_validation_layer_warnings)\n  - [Allocation algorithm](@ref general_considerations_allocation_algorithm)\n  - [Features not supported](@ref general_considerations_features_not_supported)\n\n\\defgroup group_init Library initialization\n\n\\brief API elements related to the initialization and management of the entire library, especially #VmaAllocator object.\n\n\\defgroup group_alloc Memory allocation\n\n\\brief API elements related to the allocation, deallocation, and management of Vulkan memory, buffers, images.\nMost basic ones being: vmaCreateBuffer(), vmaCreateImage().\n\n\\defgroup group_virtual Virtual allocator\n\n\\brief API elements related to the mechanism of \\ref virtual_allocator - using the core allocation algorithm\nfor user-defined purpose without allocating any real GPU memory.\n\n\\defgroup group_stats Statistics\n\n\\brief API elements that query current status of the allocator, from memory usage, budget, to full dump of the internal state in JSON format.\nSee documentation chapter: \\ref statistics.\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if !defined(VULKAN_H_)\n#include <vulkan/vulkan.h>\n#endif\n\n#if !defined(VMA_VULKAN_VERSION)\n    #if defined(VK_VERSION_1_4)\n        #define VMA_VULKAN_VERSION 1004000\n    #elif defined(VK_VERSION_1_3)\n        #define VMA_VULKAN_VERSION 1003000\n    #elif defined(VK_VERSION_1_2)\n        #define VMA_VULKAN_VERSION 1002000\n    #elif defined(VK_VERSION_1_1)\n        #define VMA_VULKAN_VERSION 1001000\n    #else\n        #define VMA_VULKAN_VERSION 1000000\n    #endif\n#endif\n\n#if defined(__ANDROID__) && defined(VK_NO_PROTOTYPES) && VMA_STATIC_VULKAN_FUNCTIONS\n    extern PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;\n    extern PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr;\n    extern PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties;\n    extern PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties;\n    extern PFN_vkAllocateMemory vkAllocateMemory;\n    extern PFN_vkFreeMemory vkFreeMemory;\n    extern PFN_vkMapMemory vkMapMemory;\n    extern PFN_vkUnmapMemory vkUnmapMemory;\n    extern PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges;\n    extern PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges;\n    extern PFN_vkBindBufferMemory vkBindBufferMemory;\n    extern PFN_vkBindImageMemory vkBindImageMemory;\n    extern PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements;\n    extern PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements;\n    extern PFN_vkCreateBuffer vkCreateBuffer;\n    extern PFN_vkDestroyBuffer vkDestroyBuffer;\n    extern PFN_vkCreateImage vkCreateImage;\n    extern PFN_vkDestroyImage vkDestroyImage;\n    extern PFN_vkCmdCopyBuffer vkCmdCopyBuffer;\n    #if VMA_VULKAN_VERSION >= 1001000\n        extern PFN_vkGetBufferMemoryRequirements2 vkGetBufferMemoryRequirements2;\n        extern PFN_vkGetImageMemoryRequirements2 vkGetImageMemoryRequirements2;\n        extern PFN_vkBindBufferMemory2 vkBindBufferMemory2;\n        extern PFN_vkBindImageMemory2 vkBindImageMemory2;\n        extern PFN_vkGetPhysicalDeviceMemoryProperties2 vkGetPhysicalDeviceMemoryProperties2;\n    #endif // #if VMA_VULKAN_VERSION >= 1001000\n#endif // #if defined(__ANDROID__) && VMA_STATIC_VULKAN_FUNCTIONS && VK_NO_PROTOTYPES\n\n#if !defined(VMA_DEDICATED_ALLOCATION)\n    #if VK_KHR_get_memory_requirements2 && VK_KHR_dedicated_allocation\n        #define VMA_DEDICATED_ALLOCATION 1\n    #else\n        #define VMA_DEDICATED_ALLOCATION 0\n    #endif\n#endif\n\n#if !defined(VMA_BIND_MEMORY2)\n    #if VK_KHR_bind_memory2\n        #define VMA_BIND_MEMORY2 1\n    #else\n        #define VMA_BIND_MEMORY2 0\n    #endif\n#endif\n\n#if !defined(VMA_MEMORY_BUDGET)\n    #if VK_EXT_memory_budget && (VK_KHR_get_physical_device_properties2 || VMA_VULKAN_VERSION >= 1001000)\n        #define VMA_MEMORY_BUDGET 1\n    #else\n        #define VMA_MEMORY_BUDGET 0\n    #endif\n#endif\n\n// Defined to 1 when VK_KHR_buffer_device_address device extension or equivalent core Vulkan 1.2 feature is defined in its headers.\n#if !defined(VMA_BUFFER_DEVICE_ADDRESS)\n    #if VK_KHR_buffer_device_address || VMA_VULKAN_VERSION >= 1002000\n        #define VMA_BUFFER_DEVICE_ADDRESS 1\n    #else\n        #define VMA_BUFFER_DEVICE_ADDRESS 0\n    #endif\n#endif\n\n// Defined to 1 when VK_EXT_memory_priority device extension is defined in Vulkan headers.\n#if !defined(VMA_MEMORY_PRIORITY)\n    #if VK_EXT_memory_priority\n        #define VMA_MEMORY_PRIORITY 1\n    #else\n        #define VMA_MEMORY_PRIORITY 0\n    #endif\n#endif\n\n// Defined to 1 when VK_KHR_maintenance4 device extension is defined in Vulkan headers.\n#if !defined(VMA_KHR_MAINTENANCE4)\n    #if VK_KHR_maintenance4\n        #define VMA_KHR_MAINTENANCE4 1\n    #else\n        #define VMA_KHR_MAINTENANCE4 0\n    #endif\n#endif\n\n// Defined to 1 when VK_KHR_maintenance5 device extension is defined in Vulkan headers.\n#if !defined(VMA_KHR_MAINTENANCE5)\n    #if VK_KHR_maintenance5\n        #define VMA_KHR_MAINTENANCE5 1\n    #else\n        #define VMA_KHR_MAINTENANCE5 0\n    #endif\n#endif\n\n\n// Defined to 1 when VK_KHR_external_memory device extension is defined in Vulkan headers.\n#if !defined(VMA_EXTERNAL_MEMORY)\n    #if VK_KHR_external_memory\n        #define VMA_EXTERNAL_MEMORY 1\n    #else\n        #define VMA_EXTERNAL_MEMORY 0\n    #endif\n#endif\n\n// Defined to 1 when VK_KHR_external_memory_win32 device extension is defined in Vulkan headers.\n#if !defined(VMA_EXTERNAL_MEMORY_WIN32)\n    #if VK_KHR_external_memory_win32\n        #define VMA_EXTERNAL_MEMORY_WIN32 1\n    #else\n        #define VMA_EXTERNAL_MEMORY_WIN32 0\n    #endif\n#endif\n\n// Define these macros to decorate all public functions with additional code,\n// before and after returned type, appropriately. This may be useful for\n// exporting the functions when compiling VMA as a separate library. Example:\n// #define VMA_CALL_PRE  __declspec(dllexport)\n// #define VMA_CALL_POST __cdecl\n#ifndef VMA_CALL_PRE\n    #define VMA_CALL_PRE\n#endif\n#ifndef VMA_CALL_POST\n    #define VMA_CALL_POST\n#endif\n\n// Define this macro to decorate pNext pointers with an attribute specifying the Vulkan\n// structure that will be extended via the pNext chain.\n#ifndef VMA_EXTENDS_VK_STRUCT\n    #define VMA_EXTENDS_VK_STRUCT(vkStruct)\n#endif\n\n// Define this macro to decorate pointers with an attribute specifying the\n// length of the array they point to if they are not null.\n//\n// The length may be one of\n// - The name of another parameter in the argument list where the pointer is declared\n// - The name of another member in the struct where the pointer is declared\n// - The name of a member of a struct type, meaning the value of that member in\n//   the context of the call. For example\n//   VMA_LEN_IF_NOT_NULL(\"VkPhysicalDeviceMemoryProperties::memoryHeapCount\"),\n//   this means the number of memory heaps available in the device associated\n//   with the VmaAllocator being dealt with.\n#ifndef VMA_LEN_IF_NOT_NULL\n    #define VMA_LEN_IF_NOT_NULL(len)\n#endif\n\n// The VMA_NULLABLE macro is defined to be _Nullable when compiling with Clang.\n// see: https://clang.llvm.org/docs/AttributeReference.html#nullable\n#ifndef VMA_NULLABLE\n    #ifdef __clang__\n        #define VMA_NULLABLE _Nullable\n    #else\n        #define VMA_NULLABLE\n    #endif\n#endif\n\n// The VMA_NOT_NULL macro is defined to be _Nonnull when compiling with Clang.\n// see: https://clang.llvm.org/docs/AttributeReference.html#nonnull\n#ifndef VMA_NOT_NULL\n    #ifdef __clang__\n        #define VMA_NOT_NULL _Nonnull\n    #else\n        #define VMA_NOT_NULL\n    #endif\n#endif\n\n// If non-dispatchable handles are represented as pointers then we can give\n// then nullability annotations\n#ifndef VMA_NOT_NULL_NON_DISPATCHABLE\n    #if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)\n        #define VMA_NOT_NULL_NON_DISPATCHABLE VMA_NOT_NULL\n    #else\n        #define VMA_NOT_NULL_NON_DISPATCHABLE\n    #endif\n#endif\n\n#ifndef VMA_NULLABLE_NON_DISPATCHABLE\n    #if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)\n        #define VMA_NULLABLE_NON_DISPATCHABLE VMA_NULLABLE\n    #else\n        #define VMA_NULLABLE_NON_DISPATCHABLE\n    #endif\n#endif\n\n#ifndef VMA_STATS_STRING_ENABLED\n    #define VMA_STATS_STRING_ENABLED 1\n#endif\n\n////////////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////////////\n//\n//    INTERFACE\n//\n////////////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////////////\n\n// Sections for managing code placement in file, only for development purposes e.g. for convenient folding inside an IDE.\n#ifndef _VMA_ENUM_DECLARATIONS\n\n/**\n\\addtogroup group_init\n@{\n*/\n\n/// Flags for created #VmaAllocator.\ntypedef enum VmaAllocatorCreateFlagBits\n{\n    /** \\brief Allocator and all objects created from it will not be synchronized internally, so you must guarantee they are used from only one thread at a time or synchronized externally by you.\n\n    Using this flag may increase performance because internal mutexes are not used.\n    */\n    VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT = 0x00000001,\n    /** \\brief Enables usage of VK_KHR_dedicated_allocation extension.\n\n    The flag works only if VmaAllocatorCreateInfo::vulkanApiVersion `== VK_API_VERSION_1_0`.\n    When it is `VK_API_VERSION_1_1`, the flag is ignored because the extension has been promoted to Vulkan 1.1.\n\n    Using this extension will automatically allocate dedicated blocks of memory for\n    some buffers and images instead of suballocating place for them out of bigger\n    memory blocks (as if you explicitly used #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT\n    flag) when it is recommended by the driver. It may improve performance on some\n    GPUs.\n\n    You may set this flag only if you found out that following device extensions are\n    supported, you enabled them while creating Vulkan device passed as\n    VmaAllocatorCreateInfo::device, and you want them to be used internally by this\n    library:\n\n    - VK_KHR_get_memory_requirements2 (device extension)\n    - VK_KHR_dedicated_allocation (device extension)\n\n    When this flag is set, you can experience following warnings reported by Vulkan\n    validation layer. You can ignore them.\n\n    > vkBindBufferMemory(): Binding memory to buffer 0x2d but vkGetBufferMemoryRequirements() has not been called on that buffer.\n    */\n    VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT = 0x00000002,\n    /**\n    Enables usage of VK_KHR_bind_memory2 extension.\n\n    The flag works only if VmaAllocatorCreateInfo::vulkanApiVersion `== VK_API_VERSION_1_0`.\n    When it is `VK_API_VERSION_1_1`, the flag is ignored because the extension has been promoted to Vulkan 1.1.\n\n    You may set this flag only if you found out that this device extension is supported,\n    you enabled it while creating Vulkan device passed as VmaAllocatorCreateInfo::device,\n    and you want it to be used internally by this library.\n\n    The extension provides functions `vkBindBufferMemory2KHR` and `vkBindImageMemory2KHR`,\n    which allow to pass a chain of `pNext` structures while binding.\n    This flag is required if you use `pNext` parameter in vmaBindBufferMemory2() or vmaBindImageMemory2().\n    */\n    VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT = 0x00000004,\n    /**\n    Enables usage of VK_EXT_memory_budget extension.\n\n    You may set this flag only if you found out that this device extension is supported,\n    you enabled it while creating Vulkan device passed as VmaAllocatorCreateInfo::device,\n    and you want it to be used internally by this library, along with another instance extension\n    VK_KHR_get_physical_device_properties2, which is required by it (or Vulkan 1.1, where this extension is promoted).\n\n    The extension provides query for current memory usage and budget, which will probably\n    be more accurate than an estimation used by the library otherwise.\n    */\n    VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT = 0x00000008,\n    /**\n    Enables usage of VK_AMD_device_coherent_memory extension.\n\n    You may set this flag only if you:\n\n    - found out that this device extension is supported and enabled it while creating Vulkan device passed as VmaAllocatorCreateInfo::device,\n    - checked that `VkPhysicalDeviceCoherentMemoryFeaturesAMD::deviceCoherentMemory` is true and set it while creating the Vulkan device,\n    - want it to be used internally by this library.\n\n    The extension and accompanying device feature provide access to memory types with\n    `VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD` and `VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD` flags.\n    They are useful mostly for writing breadcrumb markers - a common method for debugging GPU crash/hang/TDR.\n\n    When the extension is not enabled, such memory types are still enumerated, but their usage is illegal.\n    To protect from this error, if you don't create the allocator with this flag, it will refuse to allocate any memory or create a custom pool in such memory type,\n    returning `VK_ERROR_FEATURE_NOT_PRESENT`.\n    */\n    VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT = 0x00000010,\n    /**\n    Enables usage of \"buffer device address\" feature, which allows you to use function\n    `vkGetBufferDeviceAddress*` to get raw GPU pointer to a buffer and pass it for usage inside a shader.\n\n    You may set this flag only if you:\n\n    1. (For Vulkan version < 1.2) Found as available and enabled device extension\n    VK_KHR_buffer_device_address.\n    This extension is promoted to core Vulkan 1.2.\n    2. Found as available and enabled device feature `VkPhysicalDeviceBufferDeviceAddressFeatures::bufferDeviceAddress`.\n\n    When this flag is set, you can create buffers with `VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT` using VMA.\n    The library automatically adds `VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT` to\n    allocated memory blocks wherever it might be needed.\n\n    For more information, see documentation chapter \\ref enabling_buffer_device_address.\n    */\n    VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT = 0x00000020,\n    /**\n    Enables usage of VK_EXT_memory_priority extension in the library.\n\n    You may set this flag only if you found available and enabled this device extension,\n    along with `VkPhysicalDeviceMemoryPriorityFeaturesEXT::memoryPriority == VK_TRUE`,\n    while creating Vulkan device passed as VmaAllocatorCreateInfo::device.\n\n    When this flag is used, VmaAllocationCreateInfo::priority and VmaPoolCreateInfo::priority\n    are used to set priorities of allocated Vulkan memory. Without it, these variables are ignored.\n\n    A priority must be a floating-point value between 0 and 1, indicating the priority of the allocation relative to other memory allocations.\n    Larger values are higher priority. The granularity of the priorities is implementation-dependent.\n    It is automatically passed to every call to `vkAllocateMemory` done by the library using structure `VkMemoryPriorityAllocateInfoEXT`.\n    The value to be used for default priority is 0.5.\n    For more details, see the documentation of the VK_EXT_memory_priority extension.\n    */\n    VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT = 0x00000040,\n    /**\n    Enables usage of VK_KHR_maintenance4 extension in the library.\n\n    You may set this flag only if you found available and enabled this device extension,\n    while creating Vulkan device passed as VmaAllocatorCreateInfo::device.\n    */\n    VMA_ALLOCATOR_CREATE_KHR_MAINTENANCE4_BIT = 0x00000080,\n    /**\n    Enables usage of VK_KHR_maintenance5 extension in the library.\n\n    You should set this flag if you found available and enabled this device extension,\n    while creating Vulkan device passed as VmaAllocatorCreateInfo::device.\n    */\n    VMA_ALLOCATOR_CREATE_KHR_MAINTENANCE5_BIT = 0x00000100,\n\n    /**\n    Enables usage of VK_KHR_external_memory_win32 extension in the library.\n\n    You should set this flag if you found available and enabled this device extension,\n    while creating Vulkan device passed as VmaAllocatorCreateInfo::device.\n    For more information, see \\ref vk_khr_external_memory_win32.\n    */\n    VMA_ALLOCATOR_CREATE_KHR_EXTERNAL_MEMORY_WIN32_BIT = 0x00000200,\n\n    VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VmaAllocatorCreateFlagBits;\n/// See #VmaAllocatorCreateFlagBits.\ntypedef VkFlags VmaAllocatorCreateFlags;\n\n/** @} */\n\n/**\n\\addtogroup group_alloc\n@{\n*/\n\n/// \\brief Intended usage of the allocated memory.\ntypedef enum VmaMemoryUsage\n{\n    /** No intended memory usage specified.\n    Use other members of VmaAllocationCreateInfo to specify your requirements.\n    */\n    VMA_MEMORY_USAGE_UNKNOWN = 0,\n    /**\n    \\deprecated Obsolete, preserved for backward compatibility.\n    Prefers `VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT`.\n    */\n    VMA_MEMORY_USAGE_GPU_ONLY = 1,\n    /**\n    \\deprecated Obsolete, preserved for backward compatibility.\n    Guarantees `VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT` and `VK_MEMORY_PROPERTY_HOST_COHERENT_BIT`.\n    */\n    VMA_MEMORY_USAGE_CPU_ONLY = 2,\n    /**\n    \\deprecated Obsolete, preserved for backward compatibility.\n    Guarantees `VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT`, prefers `VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT`.\n    */\n    VMA_MEMORY_USAGE_CPU_TO_GPU = 3,\n    /**\n    \\deprecated Obsolete, preserved for backward compatibility.\n    Guarantees `VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT`, prefers `VK_MEMORY_PROPERTY_HOST_CACHED_BIT`.\n    */\n    VMA_MEMORY_USAGE_GPU_TO_CPU = 4,\n    /**\n    \\deprecated Obsolete, preserved for backward compatibility.\n    Prefers not `VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT`.\n    */\n    VMA_MEMORY_USAGE_CPU_COPY = 5,\n    /**\n    Lazily allocated GPU memory having `VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT`.\n    Exists mostly on mobile platforms. Using it on desktop PC or other GPUs with no such memory type present will fail the allocation.\n\n    Usage: Memory for transient attachment images (color attachments, depth attachments etc.), created with `VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT`.\n\n    Allocations with this usage are always created as dedicated - it implies #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT.\n    */\n    VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED = 6,\n    /**\n    Selects best memory type automatically.\n    This flag is recommended for most common use cases.\n\n    When using this flag, if you want to map the allocation (using vmaMapMemory() or #VMA_ALLOCATION_CREATE_MAPPED_BIT),\n    you must pass one of the flags: #VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT or #VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT\n    in VmaAllocationCreateInfo::flags.\n\n    It can be used only with functions that let the library know `VkBufferCreateInfo` or `VkImageCreateInfo`, e.g.\n    vmaCreateBuffer(), vmaCreateImage(), vmaFindMemoryTypeIndexForBufferInfo(), vmaFindMemoryTypeIndexForImageInfo()\n    and not with generic memory allocation functions.\n    */\n    VMA_MEMORY_USAGE_AUTO = 7,\n    /**\n    Selects best memory type automatically with preference for GPU (device) memory.\n\n    When using this flag, if you want to map the allocation (using vmaMapMemory() or #VMA_ALLOCATION_CREATE_MAPPED_BIT),\n    you must pass one of the flags: #VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT or #VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT\n    in VmaAllocationCreateInfo::flags.\n\n    It can be used only with functions that let the library know `VkBufferCreateInfo` or `VkImageCreateInfo`, e.g.\n    vmaCreateBuffer(), vmaCreateImage(), vmaFindMemoryTypeIndexForBufferInfo(), vmaFindMemoryTypeIndexForImageInfo()\n    and not with generic memory allocation functions.\n    */\n    VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE = 8,\n    /**\n    Selects best memory type automatically with preference for CPU (host) memory.\n\n    When using this flag, if you want to map the allocation (using vmaMapMemory() or #VMA_ALLOCATION_CREATE_MAPPED_BIT),\n    you must pass one of the flags: #VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT or #VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT\n    in VmaAllocationCreateInfo::flags.\n\n    It can be used only with functions that let the library know `VkBufferCreateInfo` or `VkImageCreateInfo`, e.g.\n    vmaCreateBuffer(), vmaCreateImage(), vmaFindMemoryTypeIndexForBufferInfo(), vmaFindMemoryTypeIndexForImageInfo()\n    and not with generic memory allocation functions.\n    */\n    VMA_MEMORY_USAGE_AUTO_PREFER_HOST = 9,\n\n    VMA_MEMORY_USAGE_MAX_ENUM = 0x7FFFFFFF\n} VmaMemoryUsage;\n\n/// Flags to be passed as VmaAllocationCreateInfo::flags.\ntypedef enum VmaAllocationCreateFlagBits\n{\n    /** \\brief Set this flag if the allocation should have its own memory block.\n\n    Use it for special, big resources, like fullscreen images used as attachments.\n\n    If you use this flag while creating a buffer or an image, `VkMemoryDedicatedAllocateInfo`\n    structure is applied if possible.\n    */\n    VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT = 0x00000001,\n\n    /** \\brief Set this flag to only try to allocate from existing `VkDeviceMemory` blocks and never create new such block.\n\n    If new allocation cannot be placed in any of the existing blocks, allocation\n    fails with `VK_ERROR_OUT_OF_DEVICE_MEMORY` error.\n\n    You should not use #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT and\n    #VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT at the same time. It makes no sense.\n    */\n    VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT = 0x00000002,\n    /** \\brief Set this flag to use a memory that will be persistently mapped and retrieve pointer to it.\n\n    Pointer to mapped memory will be returned through VmaAllocationInfo::pMappedData.\n\n    It is valid to use this flag for allocation made from memory type that is not\n    `HOST_VISIBLE`. This flag is then ignored and memory is not mapped. This is\n    useful if you need an allocation that is efficient to use on GPU\n    (`DEVICE_LOCAL`) and still want to map it directly if possible on platforms that\n    support it (e.g. Intel GPU).\n    */\n    VMA_ALLOCATION_CREATE_MAPPED_BIT = 0x00000004,\n    /** \\deprecated Preserved for backward compatibility. Consider using vmaSetAllocationName() instead.\n\n    Set this flag to treat VmaAllocationCreateInfo::pUserData as pointer to a\n    null-terminated string. Instead of copying pointer value, a local copy of the\n    string is made and stored in allocation's `pName`. The string is automatically\n    freed together with the allocation. It is also used in vmaBuildStatsString().\n    */\n    VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT = 0x00000020,\n    /** Allocation will be created from upper stack in a double stack pool.\n\n    This flag is only allowed for custom pools created with #VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT flag.\n    */\n    VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT = 0x00000040,\n    /** Create both buffer/image and allocation, but don't bind them together.\n    It is useful when you want to bind yourself to do some more advanced binding, e.g. using some extensions.\n    The flag is meaningful only with functions that bind by default: vmaCreateBuffer(), vmaCreateImage().\n    Otherwise it is ignored.\n\n    If you want to make sure the new buffer/image is not tied to the new memory allocation\n    through `VkMemoryDedicatedAllocateInfoKHR` structure in case the allocation ends up in its own memory block,\n    use also flag #VMA_ALLOCATION_CREATE_CAN_ALIAS_BIT.\n    */\n    VMA_ALLOCATION_CREATE_DONT_BIND_BIT = 0x00000080,\n    /** Create allocation only if additional device memory required for it, if any, won't exceed\n    memory budget. Otherwise return `VK_ERROR_OUT_OF_DEVICE_MEMORY`.\n    */\n    VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT = 0x00000100,\n    /** \\brief Set this flag if the allocated memory will have aliasing resources.\n\n    Usage of this flag prevents supplying `VkMemoryDedicatedAllocateInfoKHR` when #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT is specified.\n    Otherwise created dedicated memory will not be suitable for aliasing resources, resulting in Vulkan Validation Layer errors.\n    */\n    VMA_ALLOCATION_CREATE_CAN_ALIAS_BIT = 0x00000200,\n    /**\n    Requests possibility to map the allocation (using vmaMapMemory() or #VMA_ALLOCATION_CREATE_MAPPED_BIT).\n\n    - If you use #VMA_MEMORY_USAGE_AUTO or other `VMA_MEMORY_USAGE_AUTO*` value,\n      you must use this flag to be able to map the allocation. Otherwise, mapping is incorrect.\n    - If you use other value of #VmaMemoryUsage, this flag is ignored and mapping is always possible in memory types that are `HOST_VISIBLE`.\n      This includes allocations created in \\ref custom_memory_pools.\n\n    Declares that mapped memory will only be written sequentially, e.g. using `memcpy()` or a loop writing number-by-number,\n    never read or accessed randomly, so a memory type can be selected that is uncached and write-combined.\n\n    \\warning Violating this declaration may work correctly, but will likely be very slow.\n    Watch out for implicit reads introduced by doing e.g. `pMappedData[i] += x;`\n    Better prepare your data in a local variable and `memcpy()` it to the mapped pointer all at once.\n    */\n    VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT = 0x00000400,\n    /**\n    Requests possibility to map the allocation (using vmaMapMemory() or #VMA_ALLOCATION_CREATE_MAPPED_BIT).\n\n    - If you use #VMA_MEMORY_USAGE_AUTO or other `VMA_MEMORY_USAGE_AUTO*` value,\n      you must use this flag to be able to map the allocation. Otherwise, mapping is incorrect.\n    - If you use other value of #VmaMemoryUsage, this flag is ignored and mapping is always possible in memory types that are `HOST_VISIBLE`.\n      This includes allocations created in \\ref custom_memory_pools.\n\n    Declares that mapped memory can be read, written, and accessed in random order,\n    so a `HOST_CACHED` memory type is preferred.\n    */\n    VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT = 0x00000800,\n    /**\n    Together with #VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT or #VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT,\n    it says that despite request for host access, a not-`HOST_VISIBLE` memory type can be selected\n    if it may improve performance.\n\n    By using this flag, you declare that you will check if the allocation ended up in a `HOST_VISIBLE` memory type\n    (e.g. using vmaGetAllocationMemoryProperties()) and if not, you will create some \"staging\" buffer and\n    issue an explicit transfer to write/read your data.\n    To prepare for this possibility, don't forget to add appropriate flags like\n    `VK_BUFFER_USAGE_TRANSFER_DST_BIT`, `VK_BUFFER_USAGE_TRANSFER_SRC_BIT` to the parameters of created buffer or image.\n    */\n    VMA_ALLOCATION_CREATE_HOST_ACCESS_ALLOW_TRANSFER_INSTEAD_BIT = 0x00001000,\n    /** Allocation strategy that chooses smallest possible free range for the allocation\n    to minimize memory usage and fragmentation, possibly at the expense of allocation time.\n    */\n    VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT = 0x00010000,\n    /** Allocation strategy that chooses first suitable free range for the allocation -\n    not necessarily in terms of the smallest offset but the one that is easiest and fastest to find\n    to minimize allocation time, possibly at the expense of allocation quality.\n    */\n    VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT = 0x00020000,\n    /** Allocation strategy that chooses always the lowest offset in available space.\n    This is not the most efficient strategy but achieves highly packed data.\n    Used internally by defragmentation, not recommended in typical usage.\n    */\n    VMA_ALLOCATION_CREATE_STRATEGY_MIN_OFFSET_BIT  = 0x00040000,\n    /** Alias to #VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT.\n    */\n    VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT = VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT,\n    /** Alias to #VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT.\n    */\n    VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT = VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT,\n    /** A bit mask to extract only `STRATEGY` bits from entire set of flags.\n    */\n    VMA_ALLOCATION_CREATE_STRATEGY_MASK =\n        VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT |\n        VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT |\n        VMA_ALLOCATION_CREATE_STRATEGY_MIN_OFFSET_BIT,\n\n    VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VmaAllocationCreateFlagBits;\n/// See #VmaAllocationCreateFlagBits.\ntypedef VkFlags VmaAllocationCreateFlags;\n\n/// Flags to be passed as VmaPoolCreateInfo::flags.\ntypedef enum VmaPoolCreateFlagBits\n{\n    /** \\brief Use this flag if you always allocate only buffers and linear images or only optimal images out of this pool and so Buffer-Image Granularity can be ignored.\n\n    This is an optional optimization flag.\n\n    If you always allocate using vmaCreateBuffer(), vmaCreateImage(),\n    vmaAllocateMemoryForBuffer(), then you don't need to use it because allocator\n    knows exact type of your allocations so it can handle Buffer-Image Granularity\n    in the optimal way.\n\n    If you also allocate using vmaAllocateMemoryForImage() or vmaAllocateMemory(),\n    exact type of such allocations is not known, so allocator must be conservative\n    in handling Buffer-Image Granularity, which can lead to suboptimal allocation\n    (wasted memory). In that case, if you can make sure you always allocate only\n    buffers and linear images or only optimal images out of this pool, use this flag\n    to make allocator disregard Buffer-Image Granularity and so make allocations\n    faster and more optimal.\n    */\n    VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT = 0x00000002,\n\n    /** \\brief Enables alternative, linear allocation algorithm in this pool.\n\n    Specify this flag to enable linear allocation algorithm, which always creates\n    new allocations after last one and doesn't reuse space from allocations freed in\n    between. It trades memory consumption for simplified algorithm and data\n    structure, which has better performance and uses less memory for metadata.\n\n    By using this flag, you can achieve behavior of free-at-once, stack,\n    ring buffer, and double stack.\n    For details, see documentation chapter \\ref linear_algorithm.\n    */\n    VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT = 0x00000004,\n\n    /** Bit mask to extract only `ALGORITHM` bits from entire set of flags.\n    */\n    VMA_POOL_CREATE_ALGORITHM_MASK =\n        VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT,\n\n    VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VmaPoolCreateFlagBits;\n/// Flags to be passed as VmaPoolCreateInfo::flags. See #VmaPoolCreateFlagBits.\ntypedef VkFlags VmaPoolCreateFlags;\n\n/// Flags to be passed as VmaDefragmentationInfo::flags.\ntypedef enum VmaDefragmentationFlagBits\n{\n    /* \\brief Use simple but fast algorithm for defragmentation.\n    May not achieve best results but will require least time to compute and least allocations to copy.\n    */\n    VMA_DEFRAGMENTATION_FLAG_ALGORITHM_FAST_BIT = 0x1,\n    /* \\brief Default defragmentation algorithm, applied also when no `ALGORITHM` flag is specified.\n    Offers a balance between defragmentation quality and the amount of allocations and bytes that need to be moved.\n    */\n    VMA_DEFRAGMENTATION_FLAG_ALGORITHM_BALANCED_BIT = 0x2,\n    /* \\brief Perform full defragmentation of memory.\n    Can result in notably more time to compute and allocations to copy, but will achieve best memory packing.\n    */\n    VMA_DEFRAGMENTATION_FLAG_ALGORITHM_FULL_BIT = 0x4,\n    /** \\brief Use the most roboust algorithm at the cost of time to compute and number of copies to make.\n    Only available when bufferImageGranularity is greater than 1, since it aims to reduce\n    alignment issues between different types of resources.\n    Otherwise falls back to same behavior as #VMA_DEFRAGMENTATION_FLAG_ALGORITHM_FULL_BIT.\n    */\n    VMA_DEFRAGMENTATION_FLAG_ALGORITHM_EXTENSIVE_BIT = 0x8,\n\n    /// A bit mask to extract only `ALGORITHM` bits from entire set of flags.\n    VMA_DEFRAGMENTATION_FLAG_ALGORITHM_MASK =\n        VMA_DEFRAGMENTATION_FLAG_ALGORITHM_FAST_BIT |\n        VMA_DEFRAGMENTATION_FLAG_ALGORITHM_BALANCED_BIT |\n        VMA_DEFRAGMENTATION_FLAG_ALGORITHM_FULL_BIT |\n        VMA_DEFRAGMENTATION_FLAG_ALGORITHM_EXTENSIVE_BIT,\n\n    VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VmaDefragmentationFlagBits;\n/// See #VmaDefragmentationFlagBits.\ntypedef VkFlags VmaDefragmentationFlags;\n\n/// Operation performed on single defragmentation move. See structure #VmaDefragmentationMove.\ntypedef enum VmaDefragmentationMoveOperation\n{\n    /// Buffer/image has been recreated at `dstTmpAllocation`, data has been copied, old buffer/image has been destroyed. `srcAllocation` should be changed to point to the new place. This is the default value set by vmaBeginDefragmentationPass().\n    VMA_DEFRAGMENTATION_MOVE_OPERATION_COPY = 0,\n    /// Set this value if you cannot move the allocation. New place reserved at `dstTmpAllocation` will be freed. `srcAllocation` will remain unchanged.\n    VMA_DEFRAGMENTATION_MOVE_OPERATION_IGNORE = 1,\n    /// Set this value if you decide to abandon the allocation and you destroyed the buffer/image. New place reserved at `dstTmpAllocation` will be freed, along with `srcAllocation`, which will be destroyed.\n    VMA_DEFRAGMENTATION_MOVE_OPERATION_DESTROY = 2,\n} VmaDefragmentationMoveOperation;\n\n/** @} */\n\n/**\n\\addtogroup group_virtual\n@{\n*/\n\n/// Flags to be passed as VmaVirtualBlockCreateInfo::flags.\ntypedef enum VmaVirtualBlockCreateFlagBits\n{\n    /** \\brief Enables alternative, linear allocation algorithm in this virtual block.\n\n    Specify this flag to enable linear allocation algorithm, which always creates\n    new allocations after last one and doesn't reuse space from allocations freed in\n    between. It trades memory consumption for simplified algorithm and data\n    structure, which has better performance and uses less memory for metadata.\n\n    By using this flag, you can achieve behavior of free-at-once, stack,\n    ring buffer, and double stack.\n    For details, see documentation chapter \\ref linear_algorithm.\n    */\n    VMA_VIRTUAL_BLOCK_CREATE_LINEAR_ALGORITHM_BIT = 0x00000001,\n\n    /** \\brief Bit mask to extract only `ALGORITHM` bits from entire set of flags.\n    */\n    VMA_VIRTUAL_BLOCK_CREATE_ALGORITHM_MASK =\n        VMA_VIRTUAL_BLOCK_CREATE_LINEAR_ALGORITHM_BIT,\n\n    VMA_VIRTUAL_BLOCK_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VmaVirtualBlockCreateFlagBits;\n/// Flags to be passed as VmaVirtualBlockCreateInfo::flags. See #VmaVirtualBlockCreateFlagBits.\ntypedef VkFlags VmaVirtualBlockCreateFlags;\n\n/// Flags to be passed as VmaVirtualAllocationCreateInfo::flags.\ntypedef enum VmaVirtualAllocationCreateFlagBits\n{\n    /** \\brief Allocation will be created from upper stack in a double stack pool.\n\n    This flag is only allowed for virtual blocks created with #VMA_VIRTUAL_BLOCK_CREATE_LINEAR_ALGORITHM_BIT flag.\n    */\n    VMA_VIRTUAL_ALLOCATION_CREATE_UPPER_ADDRESS_BIT = VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT,\n    /** \\brief Allocation strategy that tries to minimize memory usage.\n    */\n    VMA_VIRTUAL_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT = VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT,\n    /** \\brief Allocation strategy that tries to minimize allocation time.\n    */\n    VMA_VIRTUAL_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT = VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT,\n    /** Allocation strategy that chooses always the lowest offset in available space.\n    This is not the most efficient strategy but achieves highly packed data.\n    */\n    VMA_VIRTUAL_ALLOCATION_CREATE_STRATEGY_MIN_OFFSET_BIT = VMA_ALLOCATION_CREATE_STRATEGY_MIN_OFFSET_BIT,\n    /** \\brief A bit mask to extract only `STRATEGY` bits from entire set of flags.\n\n    These strategy flags are binary compatible with equivalent flags in #VmaAllocationCreateFlagBits.\n    */\n    VMA_VIRTUAL_ALLOCATION_CREATE_STRATEGY_MASK = VMA_ALLOCATION_CREATE_STRATEGY_MASK,\n\n    VMA_VIRTUAL_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VmaVirtualAllocationCreateFlagBits;\n/// Flags to be passed as VmaVirtualAllocationCreateInfo::flags. See #VmaVirtualAllocationCreateFlagBits.\ntypedef VkFlags VmaVirtualAllocationCreateFlags;\n\n/** @} */\n\n#endif // _VMA_ENUM_DECLARATIONS\n\n#ifndef _VMA_DATA_TYPES_DECLARATIONS\n\n/**\n\\addtogroup group_init\n@{ */\n\n/** \\struct VmaAllocator\n\\brief Represents main object of this library initialized.\n\nFill structure #VmaAllocatorCreateInfo and call function vmaCreateAllocator() to create it.\nCall function vmaDestroyAllocator() to destroy it.\n\nIt is recommended to create just one object of this type per `VkDevice` object,\nright after Vulkan is initialized and keep it alive until before Vulkan device is destroyed.\n*/\nVK_DEFINE_HANDLE(VmaAllocator)\n\n/** @} */\n\n/**\n\\addtogroup group_alloc\n@{\n*/\n\n/** \\struct VmaPool\n\\brief Represents custom memory pool\n\nFill structure VmaPoolCreateInfo and call function vmaCreatePool() to create it.\nCall function vmaDestroyPool() to destroy it.\n\nFor more information see [Custom memory pools](@ref choosing_memory_type_custom_memory_pools).\n*/\nVK_DEFINE_HANDLE(VmaPool)\n\n/** \\struct VmaAllocation\n\\brief Represents single memory allocation.\n\nIt may be either dedicated block of `VkDeviceMemory` or a specific region of a bigger block of this type\nplus unique offset.\n\nThere are multiple ways to create such object.\nYou need to fill structure VmaAllocationCreateInfo.\nFor more information see [Choosing memory type](@ref choosing_memory_type).\n\nAlthough the library provides convenience functions that create Vulkan buffer or image,\nallocate memory for it and bind them together,\nbinding of the allocation to a buffer or an image is out of scope of the allocation itself.\nAllocation object can exist without buffer/image bound,\nbinding can be done manually by the user, and destruction of it can be done\nindependently of destruction of the allocation.\n\nThe object also remembers its size and some other information.\nTo retrieve this information, use function vmaGetAllocationInfo() and inspect\nreturned structure VmaAllocationInfo.\n*/\nVK_DEFINE_HANDLE(VmaAllocation)\n\n/** \\struct VmaDefragmentationContext\n\\brief An opaque object that represents started defragmentation process.\n\nFill structure #VmaDefragmentationInfo and call function vmaBeginDefragmentation() to create it.\nCall function vmaEndDefragmentation() to destroy it.\n*/\nVK_DEFINE_HANDLE(VmaDefragmentationContext)\n\n/** @} */\n\n/**\n\\addtogroup group_virtual\n@{\n*/\n\n/** \\struct VmaVirtualAllocation\n\\brief Represents single memory allocation done inside VmaVirtualBlock.\n\nUse it as a unique identifier to virtual allocation within the single block.\n\nUse value `VK_NULL_HANDLE` to represent a null/invalid allocation.\n*/\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VmaVirtualAllocation)\n\n/** @} */\n\n/**\n\\addtogroup group_virtual\n@{\n*/\n\n/** \\struct VmaVirtualBlock\n\\brief Handle to a virtual block object that allows to use core allocation algorithm without allocating any real GPU memory.\n\nFill in #VmaVirtualBlockCreateInfo structure and use vmaCreateVirtualBlock() to create it. Use vmaDestroyVirtualBlock() to destroy it.\nFor more information, see documentation chapter \\ref virtual_allocator.\n\nThis object is not thread-safe - should not be used from multiple threads simultaneously, must be synchronized externally.\n*/\nVK_DEFINE_HANDLE(VmaVirtualBlock)\n\n/** @} */\n\n/**\n\\addtogroup group_init\n@{\n*/\n\n/// Callback function called after successful vkAllocateMemory.\ntypedef void (VKAPI_PTR* PFN_vmaAllocateDeviceMemoryFunction)(\n    VmaAllocator VMA_NOT_NULL                    allocator,\n    uint32_t                                     memoryType,\n    VkDeviceMemory VMA_NOT_NULL_NON_DISPATCHABLE memory,\n    VkDeviceSize                                 size,\n    void* VMA_NULLABLE                           pUserData);\n\n/// Callback function called before vkFreeMemory.\ntypedef void (VKAPI_PTR* PFN_vmaFreeDeviceMemoryFunction)(\n    VmaAllocator VMA_NOT_NULL                    allocator,\n    uint32_t                                     memoryType,\n    VkDeviceMemory VMA_NOT_NULL_NON_DISPATCHABLE memory,\n    VkDeviceSize                                 size,\n    void* VMA_NULLABLE                           pUserData);\n\n/** \\brief Set of callbacks that the library will call for `vkAllocateMemory` and `vkFreeMemory`.\n\nProvided for informative purpose, e.g. to gather statistics about number of\nallocations or total amount of memory allocated in Vulkan.\n\nUsed in VmaAllocatorCreateInfo::pDeviceMemoryCallbacks.\n*/\ntypedef struct VmaDeviceMemoryCallbacks\n{\n    /// Optional, can be null.\n    PFN_vmaAllocateDeviceMemoryFunction VMA_NULLABLE pfnAllocate;\n    /// Optional, can be null.\n    PFN_vmaFreeDeviceMemoryFunction VMA_NULLABLE pfnFree;\n    /// Optional, can be null.\n    void* VMA_NULLABLE pUserData;\n} VmaDeviceMemoryCallbacks;\n\n/** \\brief Pointers to some Vulkan functions - a subset used by the library.\n\nUsed in VmaAllocatorCreateInfo::pVulkanFunctions.\n*/\ntypedef struct VmaVulkanFunctions\n{\n    /// Required when using VMA_DYNAMIC_VULKAN_FUNCTIONS.\n    PFN_vkGetInstanceProcAddr VMA_NULLABLE vkGetInstanceProcAddr;\n    /// Required when using VMA_DYNAMIC_VULKAN_FUNCTIONS.\n    PFN_vkGetDeviceProcAddr VMA_NULLABLE vkGetDeviceProcAddr;\n    PFN_vkGetPhysicalDeviceProperties VMA_NULLABLE vkGetPhysicalDeviceProperties;\n    PFN_vkGetPhysicalDeviceMemoryProperties VMA_NULLABLE vkGetPhysicalDeviceMemoryProperties;\n    PFN_vkAllocateMemory VMA_NULLABLE vkAllocateMemory;\n    PFN_vkFreeMemory VMA_NULLABLE vkFreeMemory;\n    PFN_vkMapMemory VMA_NULLABLE vkMapMemory;\n    PFN_vkUnmapMemory VMA_NULLABLE vkUnmapMemory;\n    PFN_vkFlushMappedMemoryRanges VMA_NULLABLE vkFlushMappedMemoryRanges;\n    PFN_vkInvalidateMappedMemoryRanges VMA_NULLABLE vkInvalidateMappedMemoryRanges;\n    PFN_vkBindBufferMemory VMA_NULLABLE vkBindBufferMemory;\n    PFN_vkBindImageMemory VMA_NULLABLE vkBindImageMemory;\n    PFN_vkGetBufferMemoryRequirements VMA_NULLABLE vkGetBufferMemoryRequirements;\n    PFN_vkGetImageMemoryRequirements VMA_NULLABLE vkGetImageMemoryRequirements;\n    PFN_vkCreateBuffer VMA_NULLABLE vkCreateBuffer;\n    PFN_vkDestroyBuffer VMA_NULLABLE vkDestroyBuffer;\n    PFN_vkCreateImage VMA_NULLABLE vkCreateImage;\n    PFN_vkDestroyImage VMA_NULLABLE vkDestroyImage;\n    PFN_vkCmdCopyBuffer VMA_NULLABLE vkCmdCopyBuffer;\n#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000\n    /// Fetch \"vkGetBufferMemoryRequirements2\" on Vulkan >= 1.1, fetch \"vkGetBufferMemoryRequirements2KHR\" when using VK_KHR_dedicated_allocation extension.\n    PFN_vkGetBufferMemoryRequirements2KHR VMA_NULLABLE vkGetBufferMemoryRequirements2KHR;\n    /// Fetch \"vkGetImageMemoryRequirements2\" on Vulkan >= 1.1, fetch \"vkGetImageMemoryRequirements2KHR\" when using VK_KHR_dedicated_allocation extension.\n    PFN_vkGetImageMemoryRequirements2KHR VMA_NULLABLE vkGetImageMemoryRequirements2KHR;\n#endif\n#if VMA_BIND_MEMORY2 || VMA_VULKAN_VERSION >= 1001000\n    /// Fetch \"vkBindBufferMemory2\" on Vulkan >= 1.1, fetch \"vkBindBufferMemory2KHR\" when using VK_KHR_bind_memory2 extension.\n    PFN_vkBindBufferMemory2KHR VMA_NULLABLE vkBindBufferMemory2KHR;\n    /// Fetch \"vkBindImageMemory2\" on Vulkan >= 1.1, fetch \"vkBindImageMemory2KHR\" when using VK_KHR_bind_memory2 extension.\n    PFN_vkBindImageMemory2KHR VMA_NULLABLE vkBindImageMemory2KHR;\n#endif\n#if VMA_MEMORY_BUDGET || VMA_VULKAN_VERSION >= 1001000\n    /// Fetch from \"vkGetPhysicalDeviceMemoryProperties2\" on Vulkan >= 1.1, but you can also fetch it from \"vkGetPhysicalDeviceMemoryProperties2KHR\" if you enabled extension VK_KHR_get_physical_device_properties2.\n    PFN_vkGetPhysicalDeviceMemoryProperties2KHR VMA_NULLABLE vkGetPhysicalDeviceMemoryProperties2KHR;\n#endif\n#if VMA_KHR_MAINTENANCE4 || VMA_VULKAN_VERSION >= 1003000\n    /// Fetch from \"vkGetDeviceBufferMemoryRequirements\" on Vulkan >= 1.3, but you can also fetch it from \"vkGetDeviceBufferMemoryRequirementsKHR\" if you enabled extension VK_KHR_maintenance4.\n    PFN_vkGetDeviceBufferMemoryRequirementsKHR VMA_NULLABLE vkGetDeviceBufferMemoryRequirements;\n    /// Fetch from \"vkGetDeviceImageMemoryRequirements\" on Vulkan >= 1.3, but you can also fetch it from \"vkGetDeviceImageMemoryRequirementsKHR\" if you enabled extension VK_KHR_maintenance4.\n    PFN_vkGetDeviceImageMemoryRequirementsKHR VMA_NULLABLE vkGetDeviceImageMemoryRequirements;\n#endif\n#if VMA_EXTERNAL_MEMORY_WIN32\n    PFN_vkGetMemoryWin32HandleKHR VMA_NULLABLE vkGetMemoryWin32HandleKHR;\n#else\n    void* VMA_NULLABLE vkGetMemoryWin32HandleKHR;\n#endif\n} VmaVulkanFunctions;\n\n/// Description of a Allocator to be created.\ntypedef struct VmaAllocatorCreateInfo\n{\n    /// Flags for created allocator. Use #VmaAllocatorCreateFlagBits enum.\n    VmaAllocatorCreateFlags flags;\n    /// Vulkan physical device.\n    /** It must be valid throughout whole lifetime of created allocator. */\n    VkPhysicalDevice VMA_NOT_NULL physicalDevice;\n    /// Vulkan device.\n    /** It must be valid throughout whole lifetime of created allocator. */\n    VkDevice VMA_NOT_NULL device;\n    /// Preferred size of a single `VkDeviceMemory` block to be allocated from large heaps > 1 GiB. Optional.\n    /** Set to 0 to use default, which is currently 256 MiB. */\n    VkDeviceSize preferredLargeHeapBlockSize;\n    /// Custom CPU memory allocation callbacks. Optional.\n    /** Optional, can be null. When specified, will also be used for all CPU-side memory allocations. */\n    const VkAllocationCallbacks* VMA_NULLABLE pAllocationCallbacks;\n    /// Informative callbacks for `vkAllocateMemory`, `vkFreeMemory`. Optional.\n    /** Optional, can be null. */\n    const VmaDeviceMemoryCallbacks* VMA_NULLABLE pDeviceMemoryCallbacks;\n    /** \\brief Either null or a pointer to an array of limits on maximum number of bytes that can be allocated out of particular Vulkan memory heap.\n\n    If not NULL, it must be a pointer to an array of\n    `VkPhysicalDeviceMemoryProperties::memoryHeapCount` elements, defining limit on\n    maximum number of bytes that can be allocated out of particular Vulkan memory\n    heap.\n\n    Any of the elements may be equal to `VK_WHOLE_SIZE`, which means no limit on that\n    heap. This is also the default in case of `pHeapSizeLimit` = NULL.\n\n    If there is a limit defined for a heap:\n\n    - If user tries to allocate more memory from that heap using this allocator,\n      the allocation fails with `VK_ERROR_OUT_OF_DEVICE_MEMORY`.\n    - If the limit is smaller than heap size reported in `VkMemoryHeap::size`, the\n      value of this limit will be reported instead when using vmaGetMemoryProperties().\n\n    Warning! Using this feature may not be equivalent to installing a GPU with\n    smaller amount of memory, because graphics driver doesn't necessary fail new\n    allocations with `VK_ERROR_OUT_OF_DEVICE_MEMORY` result when memory capacity is\n    exceeded. It may return success and just silently migrate some device memory\n    blocks to system RAM. This driver behavior can also be controlled using\n    VK_AMD_memory_overallocation_behavior extension.\n    */\n    const VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(\"VkPhysicalDeviceMemoryProperties::memoryHeapCount\") pHeapSizeLimit;\n\n    /** \\brief Pointers to Vulkan functions. Can be null.\n\n    For details see [Pointers to Vulkan functions](@ref config_Vulkan_functions).\n    */\n    const VmaVulkanFunctions* VMA_NULLABLE pVulkanFunctions;\n    /** \\brief Handle to Vulkan instance object.\n\n    Starting from version 3.0.0 this member is no longer optional, it must be set!\n    */\n    VkInstance VMA_NOT_NULL instance;\n    /** \\brief Optional. Vulkan version that the application uses.\n\n    It must be a value in the format as created by macro `VK_MAKE_VERSION` or a constant like: `VK_API_VERSION_1_1`, `VK_API_VERSION_1_0`.\n    The patch version number specified is ignored. Only the major and minor versions are considered.\n    Only versions 1.0...1.4 are supported by the current implementation.\n    Leaving it initialized to zero is equivalent to `VK_API_VERSION_1_0`.\n    It must match the Vulkan version used by the application and supported on the selected physical device,\n    so it must be no higher than `VkApplicationInfo::apiVersion` passed to `vkCreateInstance`\n    and no higher than `VkPhysicalDeviceProperties::apiVersion` found on the physical device used.\n    */\n    uint32_t vulkanApiVersion;\n#if VMA_EXTERNAL_MEMORY\n    /** \\brief Either null or a pointer to an array of external memory handle types for each Vulkan memory type.\n\n    If not NULL, it must be a pointer to an array of `VkPhysicalDeviceMemoryProperties::memoryTypeCount`\n    elements, defining external memory handle types of particular Vulkan memory type,\n    to be passed using `VkExportMemoryAllocateInfoKHR`.\n\n    Any of the elements may be equal to 0, which means not to use `VkExportMemoryAllocateInfoKHR` on this memory type.\n    This is also the default in case of `pTypeExternalMemoryHandleTypes` = NULL.\n    */\n    const VkExternalMemoryHandleTypeFlagsKHR* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(\"VkPhysicalDeviceMemoryProperties::memoryTypeCount\") pTypeExternalMemoryHandleTypes;\n#endif // #if VMA_EXTERNAL_MEMORY\n} VmaAllocatorCreateInfo;\n\n/// Information about existing #VmaAllocator object.\ntypedef struct VmaAllocatorInfo\n{\n    /** \\brief Handle to Vulkan instance object.\n\n    This is the same value as has been passed through VmaAllocatorCreateInfo::instance.\n    */\n    VkInstance VMA_NOT_NULL instance;\n    /** \\brief Handle to Vulkan physical device object.\n\n    This is the same value as has been passed through VmaAllocatorCreateInfo::physicalDevice.\n    */\n    VkPhysicalDevice VMA_NOT_NULL physicalDevice;\n    /** \\brief Handle to Vulkan device object.\n\n    This is the same value as has been passed through VmaAllocatorCreateInfo::device.\n    */\n    VkDevice VMA_NOT_NULL device;\n} VmaAllocatorInfo;\n\n/** @} */\n\n/**\n\\addtogroup group_stats\n@{\n*/\n\n/** \\brief Calculated statistics of memory usage e.g. in a specific memory type, heap, custom pool, or total.\n\nThese are fast to calculate.\nSee functions: vmaGetHeapBudgets(), vmaGetPoolStatistics().\n*/\ntypedef struct VmaStatistics\n{\n    /** \\brief Number of `VkDeviceMemory` objects - Vulkan memory blocks allocated.\n    */\n    uint32_t blockCount;\n    /** \\brief Number of #VmaAllocation objects allocated.\n\n    Dedicated allocations have their own blocks, so each one adds 1 to `allocationCount` as well as `blockCount`.\n    */\n    uint32_t allocationCount;\n    /** \\brief Number of bytes allocated in `VkDeviceMemory` blocks.\n\n    \\note To avoid confusion, please be aware that what Vulkan calls an \"allocation\" - a whole `VkDeviceMemory` object\n    (e.g. as in `VkPhysicalDeviceLimits::maxMemoryAllocationCount`) is called a \"block\" in VMA, while VMA calls\n    \"allocation\" a #VmaAllocation object that represents a memory region sub-allocated from such block, usually for a single buffer or image.\n    */\n    VkDeviceSize blockBytes;\n    /** \\brief Total number of bytes occupied by all #VmaAllocation objects.\n\n    Always less or equal than `blockBytes`.\n    Difference `(blockBytes - allocationBytes)` is the amount of memory allocated from Vulkan\n    but unused by any #VmaAllocation.\n    */\n    VkDeviceSize allocationBytes;\n} VmaStatistics;\n\n/** \\brief More detailed statistics than #VmaStatistics.\n\nThese are slower to calculate. Use for debugging purposes.\nSee functions: vmaCalculateStatistics(), vmaCalculatePoolStatistics().\n\nPrevious version of the statistics API provided averages, but they have been removed\nbecause they can be easily calculated as:\n\n\\code\nVkDeviceSize allocationSizeAvg = detailedStats.statistics.allocationBytes / detailedStats.statistics.allocationCount;\nVkDeviceSize unusedBytes = detailedStats.statistics.blockBytes - detailedStats.statistics.allocationBytes;\nVkDeviceSize unusedRangeSizeAvg = unusedBytes / detailedStats.unusedRangeCount;\n\\endcode\n*/\ntypedef struct VmaDetailedStatistics\n{\n    /// Basic statistics.\n    VmaStatistics statistics;\n    /// Number of free ranges of memory between allocations.\n    uint32_t unusedRangeCount;\n    /// Smallest allocation size. `VK_WHOLE_SIZE` if there are 0 allocations.\n    VkDeviceSize allocationSizeMin;\n    /// Largest allocation size. 0 if there are 0 allocations.\n    VkDeviceSize allocationSizeMax;\n    /// Smallest empty range size. `VK_WHOLE_SIZE` if there are 0 empty ranges.\n    VkDeviceSize unusedRangeSizeMin;\n    /// Largest empty range size. 0 if there are 0 empty ranges.\n    VkDeviceSize unusedRangeSizeMax;\n} VmaDetailedStatistics;\n\n/** \\brief  General statistics from current state of the Allocator -\ntotal memory usage across all memory heaps and types.\n\nThese are slower to calculate. Use for debugging purposes.\nSee function vmaCalculateStatistics().\n*/\ntypedef struct VmaTotalStatistics\n{\n    VmaDetailedStatistics memoryType[VK_MAX_MEMORY_TYPES];\n    VmaDetailedStatistics memoryHeap[VK_MAX_MEMORY_HEAPS];\n    VmaDetailedStatistics total;\n} VmaTotalStatistics;\n\n/** \\brief Statistics of current memory usage and available budget for a specific memory heap.\n\nThese are fast to calculate.\nSee function vmaGetHeapBudgets().\n*/\ntypedef struct VmaBudget\n{\n    /** \\brief Statistics fetched from the library.\n    */\n    VmaStatistics statistics;\n    /** \\brief Estimated current memory usage of the program, in bytes.\n\n    Fetched from system using VK_EXT_memory_budget extension if enabled.\n\n    It might be different than `statistics.blockBytes` (usually higher) due to additional implicit objects\n    also occupying the memory, like swapchain, pipelines, descriptor heaps, command buffers, or\n    `VkDeviceMemory` blocks allocated outside of this library, if any.\n    */\n    VkDeviceSize usage;\n    /** \\brief Estimated amount of memory available to the program, in bytes.\n\n    Fetched from system using VK_EXT_memory_budget extension if enabled.\n\n    It might be different (most probably smaller) than `VkMemoryHeap::size[heapIndex]` due to factors\n    external to the program, decided by the operating system.\n    Difference `budget - usage` is the amount of additional memory that can probably\n    be allocated without problems. Exceeding the budget may result in various problems.\n    */\n    VkDeviceSize budget;\n} VmaBudget;\n\n/** @} */\n\n/**\n\\addtogroup group_alloc\n@{\n*/\n\n/** \\brief Parameters of new #VmaAllocation.\n\nTo be used with functions like vmaCreateBuffer(), vmaCreateImage(), and many others.\n*/\ntypedef struct VmaAllocationCreateInfo\n{\n    /// Use #VmaAllocationCreateFlagBits enum.\n    VmaAllocationCreateFlags flags;\n    /** \\brief Intended usage of memory.\n\n    You can leave #VMA_MEMORY_USAGE_UNKNOWN if you specify memory requirements in other way. \\n\n    If `pool` is not null, this member is ignored.\n    */\n    VmaMemoryUsage usage;\n    /** \\brief Flags that must be set in a Memory Type chosen for an allocation.\n\n    Leave 0 if you specify memory requirements in other way. \\n\n    If `pool` is not null, this member is ignored.*/\n    VkMemoryPropertyFlags requiredFlags;\n    /** \\brief Flags that preferably should be set in a memory type chosen for an allocation.\n\n    Set to 0 if no additional flags are preferred. \\n\n    If `pool` is not null, this member is ignored. */\n    VkMemoryPropertyFlags preferredFlags;\n    /** \\brief Bitmask containing one bit set for every memory type acceptable for this allocation.\n\n    Value 0 is equivalent to `UINT32_MAX` - it means any memory type is accepted if\n    it meets other requirements specified by this structure, with no further\n    restrictions on memory type index. \\n\n    If `pool` is not null, this member is ignored.\n    */\n    uint32_t memoryTypeBits;\n    /** \\brief Pool that this allocation should be created in.\n\n    Leave `VK_NULL_HANDLE` to allocate from default pool. If not null, members:\n    `usage`, `requiredFlags`, `preferredFlags`, `memoryTypeBits` are ignored.\n    */\n    VmaPool VMA_NULLABLE pool;\n    /** \\brief Custom general-purpose pointer that will be stored in #VmaAllocation, can be read as VmaAllocationInfo::pUserData and changed using vmaSetAllocationUserData().\n\n    If #VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT is used, it must be either\n    null or pointer to a null-terminated string. The string will be then copied to\n    internal buffer, so it doesn't need to be valid after allocation call.\n    */\n    void* VMA_NULLABLE pUserData;\n    /** \\brief A floating-point value between 0 and 1, indicating the priority of the allocation relative to other memory allocations.\n\n    It is used only when #VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT flag was used during creation of the #VmaAllocator object\n    and this allocation ends up as dedicated or is explicitly forced as dedicated using #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT.\n    Otherwise, it has the priority of a memory block where it is placed and this variable is ignored.\n    */\n    float priority;\n} VmaAllocationCreateInfo;\n\n/// Describes parameter of created #VmaPool.\ntypedef struct VmaPoolCreateInfo\n{\n    /** \\brief Vulkan memory type index to allocate this pool from.\n    */\n    uint32_t memoryTypeIndex;\n    /** \\brief Use combination of #VmaPoolCreateFlagBits.\n    */\n    VmaPoolCreateFlags flags;\n    /** \\brief Size of a single `VkDeviceMemory` block to be allocated as part of this pool, in bytes. Optional.\n\n    Specify nonzero to set explicit, constant size of memory blocks used by this\n    pool.\n\n    Leave 0 to use default and let the library manage block sizes automatically.\n    Sizes of particular blocks may vary.\n    In this case, the pool will also support dedicated allocations.\n    */\n    VkDeviceSize blockSize;\n    /** \\brief Minimum number of blocks to be always allocated in this pool, even if they stay empty.\n\n    Set to 0 to have no preallocated blocks and allow the pool be completely empty.\n    */\n    size_t minBlockCount;\n    /** \\brief Maximum number of blocks that can be allocated in this pool. Optional.\n\n    Set to 0 to use default, which is `SIZE_MAX`, which means no limit.\n\n    Set to same value as VmaPoolCreateInfo::minBlockCount to have fixed amount of memory allocated\n    throughout whole lifetime of this pool.\n    */\n    size_t maxBlockCount;\n    /** \\brief A floating-point value between 0 and 1, indicating the priority of the allocations in this pool relative to other memory allocations.\n\n    It is used only when #VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT flag was used during creation of the #VmaAllocator object.\n    Otherwise, this variable is ignored.\n    */\n    float priority;\n    /** \\brief Additional minimum alignment to be used for all allocations created from this pool. Can be 0.\n\n    Leave 0 (default) not to impose any additional alignment. If not 0, it must be a power of two.\n    It can be useful in cases where alignment returned by Vulkan by functions like `vkGetBufferMemoryRequirements` is not enough,\n    e.g. when doing interop with OpenGL.\n    */\n    VkDeviceSize minAllocationAlignment;\n    /** \\brief Additional `pNext` chain to be attached to `VkMemoryAllocateInfo` used for every allocation made by this pool. Optional.\n\n    Optional, can be null. If not null, it must point to a `pNext` chain of structures that can be attached to `VkMemoryAllocateInfo`.\n    It can be useful for special needs such as adding `VkExportMemoryAllocateInfoKHR`.\n    Structures pointed by this member must remain alive and unchanged for the whole lifetime of the custom pool.\n\n    Please note that some structures, e.g. `VkMemoryPriorityAllocateInfoEXT`, `VkMemoryDedicatedAllocateInfoKHR`,\n    can be attached automatically by this library when using other, more convenient of its features.\n    */\n    void* VMA_NULLABLE VMA_EXTENDS_VK_STRUCT(VkMemoryAllocateInfo) pMemoryAllocateNext;\n} VmaPoolCreateInfo;\n\n/** @} */\n\n/**\n\\addtogroup group_alloc\n@{\n*/\n\n/**\nParameters of #VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().\n\nThere is also an extended version of this structure that carries additional parameters: #VmaAllocationInfo2.\n*/\ntypedef struct VmaAllocationInfo\n{\n    /** \\brief Memory type index that this allocation was allocated from.\n\n    It never changes.\n    */\n    uint32_t memoryType;\n    /** \\brief Handle to Vulkan memory object.\n\n    Same memory object can be shared by multiple allocations.\n\n    It can change after the allocation is moved during \\ref defragmentation.\n    */\n    VkDeviceMemory VMA_NULLABLE_NON_DISPATCHABLE deviceMemory;\n    /** \\brief Offset in `VkDeviceMemory` object to the beginning of this allocation, in bytes. `(deviceMemory, offset)` pair is unique to this allocation.\n\n    You usually don't need to use this offset. If you create a buffer or an image together with the allocation using e.g. function\n    vmaCreateBuffer(), vmaCreateImage(), functions that operate on these resources refer to the beginning of the buffer or image,\n    not entire device memory block. Functions like vmaMapMemory(), vmaBindBufferMemory() also refer to the beginning of the allocation\n    and apply this offset automatically.\n\n    It can change after the allocation is moved during \\ref defragmentation.\n    */\n    VkDeviceSize offset;\n    /** \\brief Size of this allocation, in bytes.\n\n    It never changes.\n\n    \\note Allocation size returned in this variable may be greater than the size\n    requested for the resource e.g. as `VkBufferCreateInfo::size`. Whole size of the\n    allocation is accessible for operations on memory e.g. using a pointer after\n    mapping with vmaMapMemory(), but operations on the resource e.g. using\n    `vkCmdCopyBuffer` must be limited to the size of the resource.\n    */\n    VkDeviceSize size;\n    /** \\brief Pointer to the beginning of this allocation as mapped data.\n\n    If the allocation hasn't been mapped using vmaMapMemory() and hasn't been\n    created with #VMA_ALLOCATION_CREATE_MAPPED_BIT flag, this value is null.\n\n    It can change after call to vmaMapMemory(), vmaUnmapMemory().\n    It can also change after the allocation is moved during \\ref defragmentation.\n    */\n    void* VMA_NULLABLE pMappedData;\n    /** \\brief Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vmaSetAllocationUserData().\n\n    It can change after call to vmaSetAllocationUserData() for this allocation.\n    */\n    void* VMA_NULLABLE pUserData;\n    /** \\brief Custom allocation name that was set with vmaSetAllocationName().\n\n    It can change after call to vmaSetAllocationName() for this allocation.\n\n    Another way to set custom name is to pass it in VmaAllocationCreateInfo::pUserData with\n    additional flag #VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT set [DEPRECATED].\n    */\n    const char* VMA_NULLABLE pName;\n} VmaAllocationInfo;\n\n/// Extended parameters of a #VmaAllocation object that can be retrieved using function vmaGetAllocationInfo2().\ntypedef struct VmaAllocationInfo2\n{\n    /** \\brief Basic parameters of the allocation.\n    \n    If you need only these, you can use function vmaGetAllocationInfo() and structure #VmaAllocationInfo instead.\n    */\n    VmaAllocationInfo allocationInfo;\n    /** \\brief Size of the `VkDeviceMemory` block that the allocation belongs to.\n    \n    In case of an allocation with dedicated memory, it will be equal to `allocationInfo.size`.\n    */\n    VkDeviceSize blockSize;\n    /** \\brief `VK_TRUE` if the allocation has dedicated memory, `VK_FALSE` if it was placed as part of a larger memory block.\n    \n    When `VK_TRUE`, it also means `VkMemoryDedicatedAllocateInfo` was used when creating the allocation\n    (if VK_KHR_dedicated_allocation extension or Vulkan version >= 1.1 is enabled).\n    */\n    VkBool32 dedicatedMemory;\n} VmaAllocationInfo2;\n\n/** Callback function called during vmaBeginDefragmentation() to check custom criterion about ending current defragmentation pass.\n\nShould return true if the defragmentation needs to stop current pass.\n*/\ntypedef VkBool32 (VKAPI_PTR* PFN_vmaCheckDefragmentationBreakFunction)(void* VMA_NULLABLE pUserData);\n\n/** \\brief Parameters for defragmentation.\n\nTo be used with function vmaBeginDefragmentation().\n*/\ntypedef struct VmaDefragmentationInfo\n{\n    /// \\brief Use combination of #VmaDefragmentationFlagBits.\n    VmaDefragmentationFlags flags;\n    /** \\brief Custom pool to be defragmented.\n\n    If null then default pools will undergo defragmentation process.\n    */\n    VmaPool VMA_NULLABLE pool;\n    /** \\brief Maximum numbers of bytes that can be copied during single pass, while moving allocations to different places.\n\n    `0` means no limit.\n    */\n    VkDeviceSize maxBytesPerPass;\n    /** \\brief Maximum number of allocations that can be moved during single pass to a different place.\n\n    `0` means no limit.\n    */\n    uint32_t maxAllocationsPerPass;\n    /** \\brief Optional custom callback for stopping vmaBeginDefragmentation().\n\n    Have to return true for breaking current defragmentation pass.\n    */\n    PFN_vmaCheckDefragmentationBreakFunction VMA_NULLABLE pfnBreakCallback;\n    /// \\brief Optional data to pass to custom callback for stopping pass of defragmentation.\n    void* VMA_NULLABLE pBreakCallbackUserData;\n} VmaDefragmentationInfo;\n\n/// Single move of an allocation to be done for defragmentation.\ntypedef struct VmaDefragmentationMove\n{\n    /// Operation to be performed on the allocation by vmaEndDefragmentationPass(). Default value is #VMA_DEFRAGMENTATION_MOVE_OPERATION_COPY. You can modify it.\n    VmaDefragmentationMoveOperation operation;\n    /// Allocation that should be moved.\n    VmaAllocation VMA_NOT_NULL srcAllocation;\n    /** \\brief Temporary allocation pointing to destination memory that will replace `srcAllocation`.\n\n    \\warning Do not store this allocation in your data structures! It exists only temporarily, for the duration of the defragmentation pass,\n    to be used for binding new buffer/image to the destination memory using e.g. vmaBindBufferMemory().\n    vmaEndDefragmentationPass() will destroy it and make `srcAllocation` point to this memory.\n    */\n    VmaAllocation VMA_NOT_NULL dstTmpAllocation;\n} VmaDefragmentationMove;\n\n/** \\brief Parameters for incremental defragmentation steps.\n\nTo be used with function vmaBeginDefragmentationPass().\n*/\ntypedef struct VmaDefragmentationPassMoveInfo\n{\n    /// Number of elements in the `pMoves` array.\n    uint32_t moveCount;\n    /** \\brief Array of moves to be performed by the user in the current defragmentation pass.\n\n    Pointer to an array of `moveCount` elements, owned by VMA, created in vmaBeginDefragmentationPass(), destroyed in vmaEndDefragmentationPass().\n\n    For each element, you should:\n\n    1. Create a new buffer/image in the place pointed by VmaDefragmentationMove::dstMemory + VmaDefragmentationMove::dstOffset.\n    2. Copy data from the VmaDefragmentationMove::srcAllocation e.g. using `vkCmdCopyBuffer`, `vkCmdCopyImage`.\n    3. Make sure these commands finished executing on the GPU.\n    4. Destroy the old buffer/image.\n\n    Only then you can finish defragmentation pass by calling vmaEndDefragmentationPass().\n    After this call, the allocation will point to the new place in memory.\n\n    Alternatively, if you cannot move specific allocation, you can set VmaDefragmentationMove::operation to #VMA_DEFRAGMENTATION_MOVE_OPERATION_IGNORE.\n\n    Alternatively, if you decide you want to completely remove the allocation:\n\n    1. Destroy its buffer/image.\n    2. Set VmaDefragmentationMove::operation to #VMA_DEFRAGMENTATION_MOVE_OPERATION_DESTROY.\n\n    Then, after vmaEndDefragmentationPass() the allocation will be freed.\n    */\n    VmaDefragmentationMove* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(moveCount) pMoves;\n} VmaDefragmentationPassMoveInfo;\n\n/// Statistics returned for defragmentation process in function vmaEndDefragmentation().\ntypedef struct VmaDefragmentationStats\n{\n    /// Total number of bytes that have been copied while moving allocations to different places.\n    VkDeviceSize bytesMoved;\n    /// Total number of bytes that have been released to the system by freeing empty `VkDeviceMemory` objects.\n    VkDeviceSize bytesFreed;\n    /// Number of allocations that have been moved to different places.\n    uint32_t allocationsMoved;\n    /// Number of empty `VkDeviceMemory` objects that have been released to the system.\n    uint32_t deviceMemoryBlocksFreed;\n} VmaDefragmentationStats;\n\n/** @} */\n\n/**\n\\addtogroup group_virtual\n@{\n*/\n\n/// Parameters of created #VmaVirtualBlock object to be passed to vmaCreateVirtualBlock().\ntypedef struct VmaVirtualBlockCreateInfo\n{\n    /** \\brief Total size of the virtual block.\n\n    Sizes can be expressed in bytes or any units you want as long as you are consistent in using them.\n    For example, if you allocate from some array of structures, 1 can mean single instance of entire structure.\n    */\n    VkDeviceSize size;\n\n    /** \\brief Use combination of #VmaVirtualBlockCreateFlagBits.\n    */\n    VmaVirtualBlockCreateFlags flags;\n\n    /** \\brief Custom CPU memory allocation callbacks. Optional.\n\n    Optional, can be null. When specified, they will be used for all CPU-side memory allocations.\n    */\n    const VkAllocationCallbacks* VMA_NULLABLE pAllocationCallbacks;\n} VmaVirtualBlockCreateInfo;\n\n/// Parameters of created virtual allocation to be passed to vmaVirtualAllocate().\ntypedef struct VmaVirtualAllocationCreateInfo\n{\n    /** \\brief Size of the allocation.\n\n    Cannot be zero.\n    */\n    VkDeviceSize size;\n    /** \\brief Required alignment of the allocation. Optional.\n\n    Must be power of two. Special value 0 has the same meaning as 1 - means no special alignment is required, so allocation can start at any offset.\n    */\n    VkDeviceSize alignment;\n    /** \\brief Use combination of #VmaVirtualAllocationCreateFlagBits.\n    */\n    VmaVirtualAllocationCreateFlags flags;\n    /** \\brief Custom pointer to be associated with the allocation. Optional.\n\n    It can be any value and can be used for user-defined purposes. It can be fetched or changed later.\n    */\n    void* VMA_NULLABLE pUserData;\n} VmaVirtualAllocationCreateInfo;\n\n/// Parameters of an existing virtual allocation, returned by vmaGetVirtualAllocationInfo().\ntypedef struct VmaVirtualAllocationInfo\n{\n    /** \\brief Offset of the allocation.\n\n    Offset at which the allocation was made.\n    */\n    VkDeviceSize offset;\n    /** \\brief Size of the allocation.\n\n    Same value as passed in VmaVirtualAllocationCreateInfo::size.\n    */\n    VkDeviceSize size;\n    /** \\brief Custom pointer associated with the allocation.\n\n    Same value as passed in VmaVirtualAllocationCreateInfo::pUserData or to vmaSetVirtualAllocationUserData().\n    */\n    void* VMA_NULLABLE pUserData;\n} VmaVirtualAllocationInfo;\n\n/** @} */\n\n#endif // _VMA_DATA_TYPES_DECLARATIONS\n\n#ifndef _VMA_FUNCTION_HEADERS\n\n/**\n\\addtogroup group_init\n@{\n*/\n\n/// Creates #VmaAllocator object.\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateAllocator(\n    const VmaAllocatorCreateInfo* VMA_NOT_NULL pCreateInfo,\n    VmaAllocator VMA_NULLABLE* VMA_NOT_NULL pAllocator);\n\n/// Destroys allocator object.\nVMA_CALL_PRE void VMA_CALL_POST vmaDestroyAllocator(\n    VmaAllocator VMA_NULLABLE allocator);\n\n/** \\brief Returns information about existing #VmaAllocator object - handle to Vulkan device etc.\n\nIt might be useful if you want to keep just the #VmaAllocator handle and fetch other required handles to\n`VkPhysicalDevice`, `VkDevice` etc. every time using this function.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaGetAllocatorInfo(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocatorInfo* VMA_NOT_NULL pAllocatorInfo);\n\n/**\nPhysicalDeviceProperties are fetched from physicalDevice by the allocator.\nYou can access it here, without fetching it again on your own.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaGetPhysicalDeviceProperties(\n    VmaAllocator VMA_NOT_NULL allocator,\n    const VkPhysicalDeviceProperties* VMA_NULLABLE* VMA_NOT_NULL ppPhysicalDeviceProperties);\n\n/**\nPhysicalDeviceMemoryProperties are fetched from physicalDevice by the allocator.\nYou can access it here, without fetching it again on your own.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaGetMemoryProperties(\n    VmaAllocator VMA_NOT_NULL allocator,\n    const VkPhysicalDeviceMemoryProperties* VMA_NULLABLE* VMA_NOT_NULL ppPhysicalDeviceMemoryProperties);\n\n/**\n\\brief Given Memory Type Index, returns Property Flags of this memory type.\n\nThis is just a convenience function. Same information can be obtained using\nvmaGetMemoryProperties().\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaGetMemoryTypeProperties(\n    VmaAllocator VMA_NOT_NULL allocator,\n    uint32_t memoryTypeIndex,\n    VkMemoryPropertyFlags* VMA_NOT_NULL pFlags);\n\n/** \\brief Sets index of the current frame.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaSetCurrentFrameIndex(\n    VmaAllocator VMA_NOT_NULL allocator,\n    uint32_t frameIndex);\n\n/** @} */\n\n/**\n\\addtogroup group_stats\n@{\n*/\n\n/** \\brief Retrieves statistics from current state of the Allocator.\n\nThis function is called \"calculate\" not \"get\" because it has to traverse all\ninternal data structures, so it may be quite slow. Use it for debugging purposes.\nFor faster but more brief statistics suitable to be called every frame or every allocation,\nuse vmaGetHeapBudgets().\n\nNote that when using allocator from multiple threads, returned information may immediately\nbecome outdated.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaCalculateStatistics(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaTotalStatistics* VMA_NOT_NULL pStats);\n\n/** \\brief Retrieves information about current memory usage and budget for all memory heaps.\n\n\\param allocator\n\\param[out] pBudgets Must point to array with number of elements at least equal to number of memory heaps in physical device used.\n\nThis function is called \"get\" not \"calculate\" because it is very fast, suitable to be called\nevery frame or every allocation. For more detailed statistics use vmaCalculateStatistics().\n\nNote that when using allocator from multiple threads, returned information may immediately\nbecome outdated.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaGetHeapBudgets(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaBudget* VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(\"VkPhysicalDeviceMemoryProperties::memoryHeapCount\") pBudgets);\n\n/** @} */\n\n/**\n\\addtogroup group_alloc\n@{\n*/\n\n/**\n\\brief Helps to find memoryTypeIndex, given memoryTypeBits and VmaAllocationCreateInfo.\n\nThis algorithm tries to find a memory type that:\n\n- Is allowed by memoryTypeBits.\n- Contains all the flags from pAllocationCreateInfo->requiredFlags.\n- Matches intended usage.\n- Has as many flags from pAllocationCreateInfo->preferredFlags as possible.\n\n\\return Returns VK_ERROR_FEATURE_NOT_PRESENT if not found. Receiving such result\nfrom this function or any other allocating function probably means that your\ndevice doesn't support any memory type with requested features for the specific\ntype of resource you want to use it for. Please check parameters of your\nresource, like image layout (OPTIMAL versus LINEAR) or mip level count.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaFindMemoryTypeIndex(\n    VmaAllocator VMA_NOT_NULL allocator,\n    uint32_t memoryTypeBits,\n    const VmaAllocationCreateInfo* VMA_NOT_NULL pAllocationCreateInfo,\n    uint32_t* VMA_NOT_NULL pMemoryTypeIndex);\n\n/**\n\\brief Helps to find memoryTypeIndex, given VkBufferCreateInfo and VmaAllocationCreateInfo.\n\nIt can be useful e.g. to determine value to be used as VmaPoolCreateInfo::memoryTypeIndex.\nIt internally creates a temporary, dummy buffer that never has memory bound.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaFindMemoryTypeIndexForBufferInfo(\n    VmaAllocator VMA_NOT_NULL allocator,\n    const VkBufferCreateInfo* VMA_NOT_NULL pBufferCreateInfo,\n    const VmaAllocationCreateInfo* VMA_NOT_NULL pAllocationCreateInfo,\n    uint32_t* VMA_NOT_NULL pMemoryTypeIndex);\n\n/**\n\\brief Helps to find memoryTypeIndex, given VkImageCreateInfo and VmaAllocationCreateInfo.\n\nIt can be useful e.g. to determine value to be used as VmaPoolCreateInfo::memoryTypeIndex.\nIt internally creates a temporary, dummy image that never has memory bound.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaFindMemoryTypeIndexForImageInfo(\n    VmaAllocator VMA_NOT_NULL allocator,\n    const VkImageCreateInfo* VMA_NOT_NULL pImageCreateInfo,\n    const VmaAllocationCreateInfo* VMA_NOT_NULL pAllocationCreateInfo,\n    uint32_t* VMA_NOT_NULL pMemoryTypeIndex);\n\n/** \\brief Allocates Vulkan device memory and creates #VmaPool object.\n\n\\param allocator Allocator object.\n\\param pCreateInfo Parameters of pool to create.\n\\param[out] pPool Handle to created pool.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCreatePool(\n    VmaAllocator VMA_NOT_NULL allocator,\n    const VmaPoolCreateInfo* VMA_NOT_NULL pCreateInfo,\n    VmaPool VMA_NULLABLE* VMA_NOT_NULL pPool);\n\n/** \\brief Destroys #VmaPool object and frees Vulkan device memory.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaDestroyPool(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaPool VMA_NULLABLE pool);\n\n/** @} */\n\n/**\n\\addtogroup group_stats\n@{\n*/\n\n/** \\brief Retrieves statistics of existing #VmaPool object.\n\n\\param allocator Allocator object.\n\\param pool Pool object.\n\\param[out] pPoolStats Statistics of specified pool.\n\nNote that when using the pool from multiple threads, returned information may immediately\nbecome outdated.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaGetPoolStatistics(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaPool VMA_NOT_NULL pool,\n    VmaStatistics* VMA_NOT_NULL pPoolStats);\n\n/** \\brief Retrieves detailed statistics of existing #VmaPool object.\n\n\\param allocator Allocator object.\n\\param pool Pool object.\n\\param[out] pPoolStats Statistics of specified pool.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaCalculatePoolStatistics(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaPool VMA_NOT_NULL pool,\n    VmaDetailedStatistics* VMA_NOT_NULL pPoolStats);\n\n/** @} */\n\n/**\n\\addtogroup group_alloc\n@{\n*/\n\n/** \\brief Checks magic number in margins around all allocations in given memory pool in search for corruptions.\n\nCorruption detection is enabled only when `VMA_DEBUG_DETECT_CORRUPTION` macro is defined to nonzero,\n`VMA_DEBUG_MARGIN` is defined to nonzero and the pool is created in memory type that is\n`HOST_VISIBLE` and `HOST_COHERENT`. For more information, see [Corruption detection](@ref debugging_memory_usage_corruption_detection).\n\nPossible return values:\n\n- `VK_ERROR_FEATURE_NOT_PRESENT` - corruption detection is not enabled for specified pool.\n- `VK_SUCCESS` - corruption detection has been performed and succeeded.\n- `VK_ERROR_UNKNOWN` - corruption detection has been performed and found memory corruptions around one of the allocations.\n  `VMA_ASSERT` is also fired in that case.\n- Other value: Error returned by Vulkan, e.g. memory mapping failure.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCheckPoolCorruption(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaPool VMA_NOT_NULL pool);\n\n/** \\brief Retrieves name of a custom pool.\n\nAfter the call `ppName` is either null or points to an internally-owned null-terminated string\ncontaining name of the pool that was previously set. The pointer becomes invalid when the pool is\ndestroyed or its name is changed using vmaSetPoolName().\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaGetPoolName(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaPool VMA_NOT_NULL pool,\n    const char* VMA_NULLABLE* VMA_NOT_NULL ppName);\n\n/** \\brief Sets name of a custom pool.\n\n`pName` can be either null or pointer to a null-terminated string with new name for the pool.\nFunction makes internal copy of the string, so it can be changed or freed immediately after this call.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaSetPoolName(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaPool VMA_NOT_NULL pool,\n    const char* VMA_NULLABLE pName);\n\n/** \\brief General purpose memory allocation.\n\n\\param allocator\n\\param pVkMemoryRequirements\n\\param pCreateInfo\n\\param[out] pAllocation Handle to allocated memory.\n\\param[out] pAllocationInfo Optional. Information about allocated memory. It can be later fetched using function vmaGetAllocationInfo().\n\nYou should free the memory using vmaFreeMemory() or vmaFreeMemoryPages().\n\nIt is recommended to use vmaAllocateMemoryForBuffer(), vmaAllocateMemoryForImage(),\nvmaCreateBuffer(), vmaCreateImage() instead whenever possible.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaAllocateMemory(\n    VmaAllocator VMA_NOT_NULL allocator,\n    const VkMemoryRequirements* VMA_NOT_NULL pVkMemoryRequirements,\n    const VmaAllocationCreateInfo* VMA_NOT_NULL pCreateInfo,\n    VmaAllocation VMA_NULLABLE* VMA_NOT_NULL pAllocation,\n    VmaAllocationInfo* VMA_NULLABLE pAllocationInfo);\n\n/** \\brief General purpose memory allocation for multiple allocation objects at once.\n\n\\param allocator Allocator object.\n\\param pVkMemoryRequirements Memory requirements for each allocation.\n\\param pCreateInfo Creation parameters for each allocation.\n\\param allocationCount Number of allocations to make.\n\\param[out] pAllocations Pointer to array that will be filled with handles to created allocations.\n\\param[out] pAllocationInfo Optional. Pointer to array that will be filled with parameters of created allocations.\n\nYou should free the memory using vmaFreeMemory() or vmaFreeMemoryPages().\n\nWord \"pages\" is just a suggestion to use this function to allocate pieces of memory needed for sparse binding.\nIt is just a general purpose allocation function able to make multiple allocations at once.\nIt may be internally optimized to be more efficient than calling vmaAllocateMemory() `allocationCount` times.\n\nAll allocations are made using same parameters. All of them are created out of the same memory pool and type.\nIf any allocation fails, all allocations already made within this function call are also freed, so that when\nreturned result is not `VK_SUCCESS`, `pAllocation` array is always entirely filled with `VK_NULL_HANDLE`.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaAllocateMemoryPages(\n    VmaAllocator VMA_NOT_NULL allocator,\n    const VkMemoryRequirements* VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pVkMemoryRequirements,\n    const VmaAllocationCreateInfo* VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pCreateInfo,\n    size_t allocationCount,\n    VmaAllocation VMA_NULLABLE* VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pAllocations,\n    VmaAllocationInfo* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) pAllocationInfo);\n\n/** \\brief Allocates memory suitable for given `VkBuffer`.\n\n\\param allocator\n\\param buffer\n\\param pCreateInfo\n\\param[out] pAllocation Handle to allocated memory.\n\\param[out] pAllocationInfo Optional. Information about allocated memory. It can be later fetched using function vmaGetAllocationInfo().\n\nIt only creates #VmaAllocation. To bind the memory to the buffer, use vmaBindBufferMemory().\n\nThis is a special-purpose function. In most cases you should use vmaCreateBuffer().\n\nYou must free the allocation using vmaFreeMemory() when no longer needed.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaAllocateMemoryForBuffer(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VkBuffer VMA_NOT_NULL_NON_DISPATCHABLE buffer,\n    const VmaAllocationCreateInfo* VMA_NOT_NULL pCreateInfo,\n    VmaAllocation VMA_NULLABLE* VMA_NOT_NULL pAllocation,\n    VmaAllocationInfo* VMA_NULLABLE pAllocationInfo);\n\n/** \\brief Allocates memory suitable for given `VkImage`.\n\n\\param allocator\n\\param image\n\\param pCreateInfo\n\\param[out] pAllocation Handle to allocated memory.\n\\param[out] pAllocationInfo Optional. Information about allocated memory. It can be later fetched using function vmaGetAllocationInfo().\n\nIt only creates #VmaAllocation. To bind the memory to the buffer, use vmaBindImageMemory().\n\nThis is a special-purpose function. In most cases you should use vmaCreateImage().\n\nYou must free the allocation using vmaFreeMemory() when no longer needed.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaAllocateMemoryForImage(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VkImage VMA_NOT_NULL_NON_DISPATCHABLE image,\n    const VmaAllocationCreateInfo* VMA_NOT_NULL pCreateInfo,\n    VmaAllocation VMA_NULLABLE* VMA_NOT_NULL pAllocation,\n    VmaAllocationInfo* VMA_NULLABLE pAllocationInfo);\n\n/** \\brief Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(), or vmaAllocateMemoryForImage().\n\nPassing `VK_NULL_HANDLE` as `allocation` is valid. Such function call is just skipped.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaFreeMemory(\n    VmaAllocator VMA_NOT_NULL allocator,\n    const VmaAllocation VMA_NULLABLE allocation);\n\n/** \\brief Frees memory and destroys multiple allocations.\n\nWord \"pages\" is just a suggestion to use this function to free pieces of memory used for sparse binding.\nIt is just a general purpose function to free memory and destroy allocations made using e.g. vmaAllocateMemory(),\nvmaAllocateMemoryPages() and other functions.\nIt may be internally optimized to be more efficient than calling vmaFreeMemory() `allocationCount` times.\n\nAllocations in `pAllocations` array can come from any memory pools and types.\nPassing `VK_NULL_HANDLE` as elements of `pAllocations` array is valid. Such entries are just skipped.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaFreeMemoryPages(\n    VmaAllocator VMA_NOT_NULL allocator,\n    size_t allocationCount,\n    const VmaAllocation VMA_NULLABLE* VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pAllocations);\n\n/** \\brief Returns current information about specified allocation.\n\nCurrent parameters of given allocation are returned in `pAllocationInfo`.\n\nAlthough this function doesn't lock any mutex, so it should be quite efficient,\nyou should avoid calling it too often.\nYou can retrieve same VmaAllocationInfo structure while creating your resource, from function\nvmaCreateBuffer(), vmaCreateImage(). You can remember it if you are sure parameters don't change\n(e.g. due to defragmentation).\n\nThere is also a new function vmaGetAllocationInfo2() that offers extended information\nabout the allocation, returned using new structure #VmaAllocationInfo2.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaGetAllocationInfo(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation,\n    VmaAllocationInfo* VMA_NOT_NULL pAllocationInfo);\n\n/** \\brief Returns extended information about specified allocation.\n\nCurrent parameters of given allocation are returned in `pAllocationInfo`.\nExtended parameters in structure #VmaAllocationInfo2 include memory block size\nand a flag telling whether the allocation has dedicated memory.\nIt can be useful e.g. for interop with OpenGL.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaGetAllocationInfo2(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation,\n    VmaAllocationInfo2* VMA_NOT_NULL pAllocationInfo);\n\n/** \\brief Sets pUserData in given allocation to new value.\n\nThe value of pointer `pUserData` is copied to allocation's `pUserData`.\nIt is opaque, so you can use it however you want - e.g.\nas a pointer, ordinal number or some handle to you own data.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaSetAllocationUserData(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation,\n    void* VMA_NULLABLE pUserData);\n\n/** \\brief Sets pName in given allocation to new value.\n\n`pName` must be either null, or pointer to a null-terminated string. The function\nmakes local copy of the string and sets it as allocation's `pName`. String\npassed as pName doesn't need to be valid for whole lifetime of the allocation -\nyou can free it after this call. String previously pointed by allocation's\n`pName` is freed from memory.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaSetAllocationName(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation,\n    const char* VMA_NULLABLE pName);\n\n/**\n\\brief Given an allocation, returns Property Flags of its memory type.\n\nThis is just a convenience function. Same information can be obtained using\nvmaGetAllocationInfo() + vmaGetMemoryProperties().\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaGetAllocationMemoryProperties(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation,\n    VkMemoryPropertyFlags* VMA_NOT_NULL pFlags);\n\n\n#if VMA_EXTERNAL_MEMORY_WIN32\n/**\n\\brief Given an allocation, returns Win32 handle that may be imported by other processes or APIs.\n\n\\param hTargetProcess Must be a valid handle to target process or null. If it's null, the function returns\n    handle for the current process.\n\\param[out] pHandle Output parameter that returns the handle.\n\nThe function fills `pHandle` with handle that can be used in target process.\nThe handle is fetched using function `vkGetMemoryWin32HandleKHR`.\nWhen no longer needed, you must close it using:\n\n\\code\nCloseHandle(handle);\n\\endcode\n\nYou can close it any time, before or after destroying the allocation object.\nIt is reference-counted internally by Windows.\n\nNote the handle is returned for the entire `VkDeviceMemory` block that the allocation belongs to.\nIf the allocation is sub-allocated from a larger block, you may need to consider the offset of the allocation\n(VmaAllocationInfo::offset).\n\nIf the function fails with `VK_ERROR_FEATURE_NOT_PRESENT` error code, please double-check\nthat VmaVulkanFunctions::vkGetMemoryWin32HandleKHR function pointer is set, e.g. either by using `VMA_DYNAMIC_VULKAN_FUNCTIONS`\nor by manually passing it through VmaAllocatorCreateInfo::pVulkanFunctions.\n\nFor more information, see chapter \\ref vk_khr_external_memory_win32.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaGetMemoryWin32Handle(VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation, HANDLE hTargetProcess, HANDLE* VMA_NOT_NULL pHandle);\n#endif // VMA_EXTERNAL_MEMORY_WIN32\n\n/** \\brief Maps memory represented by given allocation and returns pointer to it.\n\nMaps memory represented by given allocation to make it accessible to CPU code.\nWhen succeeded, `*ppData` contains pointer to first byte of this memory.\n\n\\warning\nIf the allocation is part of a bigger `VkDeviceMemory` block, returned pointer is\ncorrectly offsetted to the beginning of region assigned to this particular allocation.\nUnlike the result of `vkMapMemory`, it points to the allocation, not to the beginning of the whole block.\nYou should not add VmaAllocationInfo::offset to it!\n\nMapping is internally reference-counted and synchronized, so despite raw Vulkan\nfunction `vkMapMemory()` cannot be used to map same block of `VkDeviceMemory`\nmultiple times simultaneously, it is safe to call this function on allocations\nassigned to the same memory block. Actual Vulkan memory will be mapped on first\nmapping and unmapped on last unmapping.\n\nIf the function succeeded, you must call vmaUnmapMemory() to unmap the\nallocation when mapping is no longer needed or before freeing the allocation, at\nthe latest.\n\nIt also safe to call this function multiple times on the same allocation. You\nmust call vmaUnmapMemory() same number of times as you called vmaMapMemory().\n\nIt is also safe to call this function on allocation created with\n#VMA_ALLOCATION_CREATE_MAPPED_BIT flag. Its memory stays mapped all the time.\nYou must still call vmaUnmapMemory() same number of times as you called\nvmaMapMemory(). You must not call vmaUnmapMemory() additional time to free the\n\"0-th\" mapping made automatically due to #VMA_ALLOCATION_CREATE_MAPPED_BIT flag.\n\nThis function fails when used on allocation made in memory type that is not\n`HOST_VISIBLE`.\n\nThis function doesn't automatically flush or invalidate caches.\nIf the allocation is made from a memory types that is not `HOST_COHERENT`,\nyou also need to use vmaInvalidateAllocation() / vmaFlushAllocation(), as required by Vulkan specification.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaMapMemory(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation,\n    void* VMA_NULLABLE* VMA_NOT_NULL ppData);\n\n/** \\brief Unmaps memory represented by given allocation, mapped previously using vmaMapMemory().\n\nFor details, see description of vmaMapMemory().\n\nThis function doesn't automatically flush or invalidate caches.\nIf the allocation is made from a memory types that is not `HOST_COHERENT`,\nyou also need to use vmaInvalidateAllocation() / vmaFlushAllocation(), as required by Vulkan specification.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaUnmapMemory(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation);\n\n/** \\brief Flushes memory of given allocation.\n\nCalls `vkFlushMappedMemoryRanges()` for memory associated with given range of given allocation.\nIt needs to be called after writing to a mapped memory for memory types that are not `HOST_COHERENT`.\nUnmap operation doesn't do that automatically.\n\n- `offset` must be relative to the beginning of allocation.\n- `size` can be `VK_WHOLE_SIZE`. It means all memory from `offset` the the end of given allocation.\n- `offset` and `size` don't have to be aligned.\n  They are internally rounded down/up to multiply of `nonCoherentAtomSize`.\n- If `size` is 0, this call is ignored.\n- If memory type that the `allocation` belongs to is not `HOST_VISIBLE` or it is `HOST_COHERENT`,\n  this call is ignored.\n\nWarning! `offset` and `size` are relative to the contents of given `allocation`.\nIf you mean whole allocation, you can pass 0 and `VK_WHOLE_SIZE`, respectively.\nDo not pass allocation's offset as `offset`!!!\n\nThis function returns the `VkResult` from `vkFlushMappedMemoryRanges` if it is\ncalled, otherwise `VK_SUCCESS`.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaFlushAllocation(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation,\n    VkDeviceSize offset,\n    VkDeviceSize size);\n\n/** \\brief Invalidates memory of given allocation.\n\nCalls `vkInvalidateMappedMemoryRanges()` for memory associated with given range of given allocation.\nIt needs to be called before reading from a mapped memory for memory types that are not `HOST_COHERENT`.\nMap operation doesn't do that automatically.\n\n- `offset` must be relative to the beginning of allocation.\n- `size` can be `VK_WHOLE_SIZE`. It means all memory from `offset` the the end of given allocation.\n- `offset` and `size` don't have to be aligned.\n  They are internally rounded down/up to multiply of `nonCoherentAtomSize`.\n- If `size` is 0, this call is ignored.\n- If memory type that the `allocation` belongs to is not `HOST_VISIBLE` or it is `HOST_COHERENT`,\n  this call is ignored.\n\nWarning! `offset` and `size` are relative to the contents of given `allocation`.\nIf you mean whole allocation, you can pass 0 and `VK_WHOLE_SIZE`, respectively.\nDo not pass allocation's offset as `offset`!!!\n\nThis function returns the `VkResult` from `vkInvalidateMappedMemoryRanges` if\nit is called, otherwise `VK_SUCCESS`.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaInvalidateAllocation(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation,\n    VkDeviceSize offset,\n    VkDeviceSize size);\n\n/** \\brief Flushes memory of given set of allocations.\n\nCalls `vkFlushMappedMemoryRanges()` for memory associated with given ranges of given allocations.\nFor more information, see documentation of vmaFlushAllocation().\n\n\\param allocator\n\\param allocationCount\n\\param allocations\n\\param offsets If not null, it must point to an array of offsets of regions to flush, relative to the beginning of respective allocations. Null means all offsets are zero.\n\\param sizes If not null, it must point to an array of sizes of regions to flush in respective allocations. Null means `VK_WHOLE_SIZE` for all allocations.\n\nThis function returns the `VkResult` from `vkFlushMappedMemoryRanges` if it is\ncalled, otherwise `VK_SUCCESS`.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaFlushAllocations(\n    VmaAllocator VMA_NOT_NULL allocator,\n    uint32_t allocationCount,\n    const VmaAllocation VMA_NOT_NULL* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) allocations,\n    const VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) offsets,\n    const VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) sizes);\n\n/** \\brief Invalidates memory of given set of allocations.\n\nCalls `vkInvalidateMappedMemoryRanges()` for memory associated with given ranges of given allocations.\nFor more information, see documentation of vmaInvalidateAllocation().\n\n\\param allocator\n\\param allocationCount\n\\param allocations\n\\param offsets If not null, it must point to an array of offsets of regions to flush, relative to the beginning of respective allocations. Null means all offsets are zero.\n\\param sizes If not null, it must point to an array of sizes of regions to flush in respective allocations. Null means `VK_WHOLE_SIZE` for all allocations.\n\nThis function returns the `VkResult` from `vkInvalidateMappedMemoryRanges` if it is\ncalled, otherwise `VK_SUCCESS`.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaInvalidateAllocations(\n    VmaAllocator VMA_NOT_NULL allocator,\n    uint32_t allocationCount,\n    const VmaAllocation VMA_NOT_NULL* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) allocations,\n    const VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) offsets,\n    const VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) sizes);\n\n/** \\brief Maps the allocation temporarily if needed, copies data from specified host pointer to it, and flushes the memory from the host caches if needed.\n\n\\param allocator\n\\param pSrcHostPointer Pointer to the host data that become source of the copy.\n\\param dstAllocation   Handle to the allocation that becomes destination of the copy.\n\\param dstAllocationLocalOffset  Offset within `dstAllocation` where to write copied data, in bytes.\n\\param size            Number of bytes to copy.\n\nThis is a convenience function that allows to copy data from a host pointer to an allocation easily.\nSame behavior can be achieved by calling vmaMapMemory(), `memcpy()`, vmaUnmapMemory(), vmaFlushAllocation().\n\nThis function can be called only for allocations created in a memory type that has `VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT` flag.\nIt can be ensured e.g. by using #VMA_MEMORY_USAGE_AUTO and #VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT or\n#VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT.\nOtherwise, the function will fail and generate a Validation Layers error.\n\n`dstAllocationLocalOffset` is relative to the contents of given `dstAllocation`.\nIf you mean whole allocation, you should pass 0.\nDo not pass allocation's offset within device memory block this parameter!\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCopyMemoryToAllocation(\n    VmaAllocator VMA_NOT_NULL allocator,\n    const void* VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(size) pSrcHostPointer,\n    VmaAllocation VMA_NOT_NULL dstAllocation,\n    VkDeviceSize dstAllocationLocalOffset,\n    VkDeviceSize size);\n\n/** \\brief Invalidates memory in the host caches if needed, maps the allocation temporarily if needed, and copies data from it to a specified host pointer.\n\n\\param allocator\n\\param srcAllocation   Handle to the allocation that becomes source of the copy.\n\\param srcAllocationLocalOffset  Offset within `srcAllocation` where to read copied data, in bytes.\n\\param pDstHostPointer Pointer to the host memory that become destination of the copy.\n\\param size            Number of bytes to copy.\n\nThis is a convenience function that allows to copy data from an allocation to a host pointer easily.\nSame behavior can be achieved by calling vmaInvalidateAllocation(), vmaMapMemory(), `memcpy()`, vmaUnmapMemory().\n\nThis function should be called only for allocations created in a memory type that has `VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT`\nand `VK_MEMORY_PROPERTY_HOST_CACHED_BIT` flag.\nIt can be ensured e.g. by using #VMA_MEMORY_USAGE_AUTO and #VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT.\nOtherwise, the function may fail and generate a Validation Layers error.\nIt may also work very slowly when reading from an uncached memory.\n\n`srcAllocationLocalOffset` is relative to the contents of given `srcAllocation`.\nIf you mean whole allocation, you should pass 0.\nDo not pass allocation's offset within device memory block as this parameter!\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCopyAllocationToMemory(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL srcAllocation,\n    VkDeviceSize srcAllocationLocalOffset,\n    void* VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(size) pDstHostPointer,\n    VkDeviceSize size);\n\n/** \\brief Checks magic number in margins around all allocations in given memory types (in both default and custom pools) in search for corruptions.\n\n\\param allocator\n\\param memoryTypeBits Bit mask, where each bit set means that a memory type with that index should be checked.\n\nCorruption detection is enabled only when `VMA_DEBUG_DETECT_CORRUPTION` macro is defined to nonzero,\n`VMA_DEBUG_MARGIN` is defined to nonzero and only for memory types that are\n`HOST_VISIBLE` and `HOST_COHERENT`. For more information, see [Corruption detection](@ref debugging_memory_usage_corruption_detection).\n\nPossible return values:\n\n- `VK_ERROR_FEATURE_NOT_PRESENT` - corruption detection is not enabled for any of specified memory types.\n- `VK_SUCCESS` - corruption detection has been performed and succeeded.\n- `VK_ERROR_UNKNOWN` - corruption detection has been performed and found memory corruptions around one of the allocations.\n  `VMA_ASSERT` is also fired in that case.\n- Other value: Error returned by Vulkan, e.g. memory mapping failure.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCheckCorruption(\n    VmaAllocator VMA_NOT_NULL allocator,\n    uint32_t memoryTypeBits);\n\n/** \\brief Begins defragmentation process.\n\n\\param allocator Allocator object.\n\\param pInfo Structure filled with parameters of defragmentation.\n\\param[out] pContext Context object that must be passed to vmaEndDefragmentation() to finish defragmentation.\n\\returns\n- `VK_SUCCESS` if defragmentation can begin.\n- `VK_ERROR_FEATURE_NOT_PRESENT` if defragmentation is not supported.\n\nFor more information about defragmentation, see documentation chapter:\n[Defragmentation](@ref defragmentation).\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaBeginDefragmentation(\n    VmaAllocator VMA_NOT_NULL allocator,\n    const VmaDefragmentationInfo* VMA_NOT_NULL pInfo,\n    VmaDefragmentationContext VMA_NULLABLE* VMA_NOT_NULL pContext);\n\n/** \\brief Ends defragmentation process.\n\n\\param allocator Allocator object.\n\\param context Context object that has been created by vmaBeginDefragmentation().\n\\param[out] pStats Optional stats for the defragmentation. Can be null.\n\nUse this function to finish defragmentation started by vmaBeginDefragmentation().\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaEndDefragmentation(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaDefragmentationContext VMA_NOT_NULL context,\n    VmaDefragmentationStats* VMA_NULLABLE pStats);\n\n/** \\brief Starts single defragmentation pass.\n\n\\param allocator Allocator object.\n\\param context Context object that has been created by vmaBeginDefragmentation().\n\\param[out] pPassInfo Computed information for current pass.\n\\returns\n- `VK_SUCCESS` if no more moves are possible. Then you can omit call to vmaEndDefragmentationPass() and simply end whole defragmentation.\n- `VK_INCOMPLETE` if there are pending moves returned in `pPassInfo`. You need to perform them, call vmaEndDefragmentationPass(),\n  and then preferably try another pass with vmaBeginDefragmentationPass().\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaBeginDefragmentationPass(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaDefragmentationContext VMA_NOT_NULL context,\n    VmaDefragmentationPassMoveInfo* VMA_NOT_NULL pPassInfo);\n\n/** \\brief Ends single defragmentation pass.\n\n\\param allocator Allocator object.\n\\param context Context object that has been created by vmaBeginDefragmentation().\n\\param pPassInfo Computed information for current pass filled by vmaBeginDefragmentationPass() and possibly modified by you.\n\nReturns `VK_SUCCESS` if no more moves are possible or `VK_INCOMPLETE` if more defragmentations are possible.\n\nEnds incremental defragmentation pass and commits all defragmentation moves from `pPassInfo`.\nAfter this call:\n\n- Allocations at `pPassInfo[i].srcAllocation` that had `pPassInfo[i].operation ==` #VMA_DEFRAGMENTATION_MOVE_OPERATION_COPY\n  (which is the default) will be pointing to the new destination place.\n- Allocation at `pPassInfo[i].srcAllocation` that had `pPassInfo[i].operation ==` #VMA_DEFRAGMENTATION_MOVE_OPERATION_DESTROY\n  will be freed.\n\nIf no more moves are possible you can end whole defragmentation.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaEndDefragmentationPass(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaDefragmentationContext VMA_NOT_NULL context,\n    VmaDefragmentationPassMoveInfo* VMA_NOT_NULL pPassInfo);\n\n/** \\brief Binds buffer to allocation.\n\nBinds specified buffer to region of memory represented by specified allocation.\nGets `VkDeviceMemory` handle and offset from the allocation.\nIf you want to create a buffer, allocate memory for it and bind them together separately,\nyou should use this function for binding instead of standard `vkBindBufferMemory()`,\nbecause it ensures proper synchronization so that when a `VkDeviceMemory` object is used by multiple\nallocations, calls to `vkBind*Memory()` or `vkMapMemory()` won't happen from multiple threads simultaneously\n(which is illegal in Vulkan).\n\nIt is recommended to use function vmaCreateBuffer() instead of this one.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaBindBufferMemory(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation,\n    VkBuffer VMA_NOT_NULL_NON_DISPATCHABLE buffer);\n\n/** \\brief Binds buffer to allocation with additional parameters.\n\n\\param allocator\n\\param allocation\n\\param allocationLocalOffset Additional offset to be added while binding, relative to the beginning of the `allocation`. Normally it should be 0.\n\\param buffer\n\\param pNext A chain of structures to be attached to `VkBindBufferMemoryInfoKHR` structure used internally. Normally it should be null.\n\nThis function is similar to vmaBindBufferMemory(), but it provides additional parameters.\n\nIf `pNext` is not null, #VmaAllocator object must have been created with #VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT flag\nor with VmaAllocatorCreateInfo::vulkanApiVersion `>= VK_API_VERSION_1_1`. Otherwise the call fails.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaBindBufferMemory2(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation,\n    VkDeviceSize allocationLocalOffset,\n    VkBuffer VMA_NOT_NULL_NON_DISPATCHABLE buffer,\n    const void* VMA_NULLABLE VMA_EXTENDS_VK_STRUCT(VkBindBufferMemoryInfoKHR) pNext);\n\n/** \\brief Binds image to allocation.\n\nBinds specified image to region of memory represented by specified allocation.\nGets `VkDeviceMemory` handle and offset from the allocation.\nIf you want to create an image, allocate memory for it and bind them together separately,\nyou should use this function for binding instead of standard `vkBindImageMemory()`,\nbecause it ensures proper synchronization so that when a `VkDeviceMemory` object is used by multiple\nallocations, calls to `vkBind*Memory()` or `vkMapMemory()` won't happen from multiple threads simultaneously\n(which is illegal in Vulkan).\n\nIt is recommended to use function vmaCreateImage() instead of this one.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaBindImageMemory(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation,\n    VkImage VMA_NOT_NULL_NON_DISPATCHABLE image);\n\n/** \\brief Binds image to allocation with additional parameters.\n\n\\param allocator\n\\param allocation\n\\param allocationLocalOffset Additional offset to be added while binding, relative to the beginning of the `allocation`. Normally it should be 0.\n\\param image\n\\param pNext A chain of structures to be attached to `VkBindImageMemoryInfoKHR` structure used internally. Normally it should be null.\n\nThis function is similar to vmaBindImageMemory(), but it provides additional parameters.\n\nIf `pNext` is not null, #VmaAllocator object must have been created with #VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT flag\nor with VmaAllocatorCreateInfo::vulkanApiVersion `>= VK_API_VERSION_1_1`. Otherwise the call fails.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaBindImageMemory2(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation,\n    VkDeviceSize allocationLocalOffset,\n    VkImage VMA_NOT_NULL_NON_DISPATCHABLE image,\n    const void* VMA_NULLABLE VMA_EXTENDS_VK_STRUCT(VkBindImageMemoryInfoKHR) pNext);\n\n/** \\brief Creates a new `VkBuffer`, allocates and binds memory for it.\n\n\\param allocator\n\\param pBufferCreateInfo\n\\param pAllocationCreateInfo\n\\param[out] pBuffer Buffer that was created.\n\\param[out] pAllocation Allocation that was created.\n\\param[out] pAllocationInfo Optional. Information about allocated memory. It can be later fetched using function vmaGetAllocationInfo().\n\nThis function automatically:\n\n-# Creates buffer.\n-# Allocates appropriate memory for it.\n-# Binds the buffer with the memory.\n\nIf any of these operations fail, buffer and allocation are not created,\nreturned value is negative error code, `*pBuffer` and `*pAllocation` are null.\n\nIf the function succeeded, you must destroy both buffer and allocation when you\nno longer need them using either convenience function vmaDestroyBuffer() or\nseparately, using `vkDestroyBuffer()` and vmaFreeMemory().\n\nIf #VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT flag was used,\nVK_KHR_dedicated_allocation extension is used internally to query driver whether\nit requires or prefers the new buffer to have dedicated allocation. If yes,\nand if dedicated allocation is possible\n(#VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT is not used), it creates dedicated\nallocation for this buffer, just like when using\n#VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT.\n\n\\note This function creates a new `VkBuffer`. Sub-allocation of parts of one large buffer,\nalthough recommended as a good practice, is out of scope of this library and could be implemented\nby the user as a higher-level logic on top of VMA.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateBuffer(\n    VmaAllocator VMA_NOT_NULL allocator,\n    const VkBufferCreateInfo* VMA_NOT_NULL pBufferCreateInfo,\n    const VmaAllocationCreateInfo* VMA_NOT_NULL pAllocationCreateInfo,\n    VkBuffer VMA_NULLABLE_NON_DISPATCHABLE* VMA_NOT_NULL pBuffer,\n    VmaAllocation VMA_NULLABLE* VMA_NOT_NULL pAllocation,\n    VmaAllocationInfo* VMA_NULLABLE pAllocationInfo);\n\n/** \\brief Creates a buffer with additional minimum alignment.\n\nSimilar to vmaCreateBuffer() but provides additional parameter `minAlignment` which allows to specify custom,\nminimum alignment to be used when placing the buffer inside a larger memory block, which may be needed e.g.\nfor interop with OpenGL.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateBufferWithAlignment(\n    VmaAllocator VMA_NOT_NULL allocator,\n    const VkBufferCreateInfo* VMA_NOT_NULL pBufferCreateInfo,\n    const VmaAllocationCreateInfo* VMA_NOT_NULL pAllocationCreateInfo,\n    VkDeviceSize minAlignment,\n    VkBuffer VMA_NULLABLE_NON_DISPATCHABLE* VMA_NOT_NULL pBuffer,\n    VmaAllocation VMA_NULLABLE* VMA_NOT_NULL pAllocation,\n    VmaAllocationInfo* VMA_NULLABLE pAllocationInfo);\n\n/** \\brief Creates a new `VkBuffer`, binds already created memory for it.\n\n\\param allocator\n\\param allocation Allocation that provides memory to be used for binding new buffer to it.\n\\param pBufferCreateInfo\n\\param[out] pBuffer Buffer that was created.\n\nThis function automatically:\n\n-# Creates buffer.\n-# Binds the buffer with the supplied memory.\n\nIf any of these operations fail, buffer is not created,\nreturned value is negative error code and `*pBuffer` is null.\n\nIf the function succeeded, you must destroy the buffer when you\nno longer need it using `vkDestroyBuffer()`. If you want to also destroy the corresponding\nallocation you can use convenience function vmaDestroyBuffer().\n\n\\note There is a new version of this function augmented with parameter `allocationLocalOffset` - see vmaCreateAliasingBuffer2().\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateAliasingBuffer(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation,\n    const VkBufferCreateInfo* VMA_NOT_NULL pBufferCreateInfo,\n    VkBuffer VMA_NULLABLE_NON_DISPATCHABLE* VMA_NOT_NULL pBuffer);\n\n/** \\brief Creates a new `VkBuffer`, binds already created memory for it.\n\n\\param allocator\n\\param allocation Allocation that provides memory to be used for binding new buffer to it.\n\\param allocationLocalOffset Additional offset to be added while binding, relative to the beginning of the allocation. Normally it should be 0.\n\\param pBufferCreateInfo \n\\param[out] pBuffer Buffer that was created.\n\nThis function automatically:\n\n-# Creates buffer.\n-# Binds the buffer with the supplied memory.\n\nIf any of these operations fail, buffer is not created,\nreturned value is negative error code and `*pBuffer` is null.\n\nIf the function succeeded, you must destroy the buffer when you\nno longer need it using `vkDestroyBuffer()`. If you want to also destroy the corresponding\nallocation you can use convenience function vmaDestroyBuffer().\n\n\\note This is a new version of the function augmented with parameter `allocationLocalOffset`.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateAliasingBuffer2(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation,\n    VkDeviceSize allocationLocalOffset,\n    const VkBufferCreateInfo* VMA_NOT_NULL pBufferCreateInfo,\n    VkBuffer VMA_NULLABLE_NON_DISPATCHABLE* VMA_NOT_NULL pBuffer);\n\n/** \\brief Destroys Vulkan buffer and frees allocated memory.\n\nThis is just a convenience function equivalent to:\n\n\\code\nvkDestroyBuffer(device, buffer, allocationCallbacks);\nvmaFreeMemory(allocator, allocation);\n\\endcode\n\nIt is safe to pass null as buffer and/or allocation.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaDestroyBuffer(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VkBuffer VMA_NULLABLE_NON_DISPATCHABLE buffer,\n    VmaAllocation VMA_NULLABLE allocation);\n\n/// Function similar to vmaCreateBuffer().\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateImage(\n    VmaAllocator VMA_NOT_NULL allocator,\n    const VkImageCreateInfo* VMA_NOT_NULL pImageCreateInfo,\n    const VmaAllocationCreateInfo* VMA_NOT_NULL pAllocationCreateInfo,\n    VkImage VMA_NULLABLE_NON_DISPATCHABLE* VMA_NOT_NULL pImage,\n    VmaAllocation VMA_NULLABLE* VMA_NOT_NULL pAllocation,\n    VmaAllocationInfo* VMA_NULLABLE pAllocationInfo);\n\n/// Function similar to vmaCreateAliasingBuffer() but for images.\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateAliasingImage(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation,\n    const VkImageCreateInfo* VMA_NOT_NULL pImageCreateInfo,\n    VkImage VMA_NULLABLE_NON_DISPATCHABLE* VMA_NOT_NULL pImage);\n\n/// Function similar to vmaCreateAliasingBuffer2() but for images.\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateAliasingImage2(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation,\n    VkDeviceSize allocationLocalOffset,\n    const VkImageCreateInfo* VMA_NOT_NULL pImageCreateInfo,\n    VkImage VMA_NULLABLE_NON_DISPATCHABLE* VMA_NOT_NULL pImage);\n\n/** \\brief Destroys Vulkan image and frees allocated memory.\n\nThis is just a convenience function equivalent to:\n\n\\code\nvkDestroyImage(device, image, allocationCallbacks);\nvmaFreeMemory(allocator, allocation);\n\\endcode\n\nIt is safe to pass null as image and/or allocation.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaDestroyImage(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VkImage VMA_NULLABLE_NON_DISPATCHABLE image,\n    VmaAllocation VMA_NULLABLE allocation);\n\n/** @} */\n\n/**\n\\addtogroup group_virtual\n@{\n*/\n\n/** \\brief Creates new #VmaVirtualBlock object.\n\n\\param pCreateInfo Parameters for creation.\n\\param[out] pVirtualBlock Returned virtual block object or `VMA_NULL` if creation failed.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateVirtualBlock(\n    const VmaVirtualBlockCreateInfo* VMA_NOT_NULL pCreateInfo,\n    VmaVirtualBlock VMA_NULLABLE* VMA_NOT_NULL pVirtualBlock);\n\n/** \\brief Destroys #VmaVirtualBlock object.\n\nPlease note that you should consciously handle virtual allocations that could remain unfreed in the block.\nYou should either free them individually using vmaVirtualFree() or call vmaClearVirtualBlock()\nif you are sure this is what you want. If you do neither, an assert is called.\n\nIf you keep pointers to some additional metadata associated with your virtual allocations in their `pUserData`,\ndon't forget to free them.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaDestroyVirtualBlock(\n    VmaVirtualBlock VMA_NULLABLE virtualBlock);\n\n/** \\brief Returns true of the #VmaVirtualBlock is empty - contains 0 virtual allocations and has all its space available for new allocations.\n*/\nVMA_CALL_PRE VkBool32 VMA_CALL_POST vmaIsVirtualBlockEmpty(\n    VmaVirtualBlock VMA_NOT_NULL virtualBlock);\n\n/** \\brief Returns information about a specific virtual allocation within a virtual block, like its size and `pUserData` pointer.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaGetVirtualAllocationInfo(\n    VmaVirtualBlock VMA_NOT_NULL virtualBlock,\n    VmaVirtualAllocation VMA_NOT_NULL_NON_DISPATCHABLE allocation, VmaVirtualAllocationInfo* VMA_NOT_NULL pVirtualAllocInfo);\n\n/** \\brief Allocates new virtual allocation inside given #VmaVirtualBlock.\n\nIf the allocation fails due to not enough free space available, `VK_ERROR_OUT_OF_DEVICE_MEMORY` is returned\n(despite the function doesn't ever allocate actual GPU memory).\n`pAllocation` is then set to `VK_NULL_HANDLE` and `pOffset`, if not null, it set to `UINT64_MAX`.\n\n\\param virtualBlock Virtual block\n\\param pCreateInfo Parameters for the allocation\n\\param[out] pAllocation Returned handle of the new allocation\n\\param[out] pOffset Returned offset of the new allocation. Optional, can be null.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaVirtualAllocate(\n    VmaVirtualBlock VMA_NOT_NULL virtualBlock,\n    const VmaVirtualAllocationCreateInfo* VMA_NOT_NULL pCreateInfo,\n    VmaVirtualAllocation VMA_NULLABLE_NON_DISPATCHABLE* VMA_NOT_NULL pAllocation,\n    VkDeviceSize* VMA_NULLABLE pOffset);\n\n/** \\brief Frees virtual allocation inside given #VmaVirtualBlock.\n\nIt is correct to call this function with `allocation == VK_NULL_HANDLE` - it does nothing.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaVirtualFree(\n    VmaVirtualBlock VMA_NOT_NULL virtualBlock,\n    VmaVirtualAllocation VMA_NULLABLE_NON_DISPATCHABLE allocation);\n\n/** \\brief Frees all virtual allocations inside given #VmaVirtualBlock.\n\nYou must either call this function or free each virtual allocation individually with vmaVirtualFree()\nbefore destroying a virtual block. Otherwise, an assert is called.\n\nIf you keep pointer to some additional metadata associated with your virtual allocation in its `pUserData`,\ndon't forget to free it as well.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaClearVirtualBlock(\n    VmaVirtualBlock VMA_NOT_NULL virtualBlock);\n\n/** \\brief Changes custom pointer associated with given virtual allocation.\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaSetVirtualAllocationUserData(\n    VmaVirtualBlock VMA_NOT_NULL virtualBlock,\n    VmaVirtualAllocation VMA_NOT_NULL_NON_DISPATCHABLE allocation,\n    void* VMA_NULLABLE pUserData);\n\n/** \\brief Calculates and returns statistics about virtual allocations and memory usage in given #VmaVirtualBlock.\n\nThis function is fast to call. For more detailed statistics, see vmaCalculateVirtualBlockStatistics().\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaGetVirtualBlockStatistics(\n    VmaVirtualBlock VMA_NOT_NULL virtualBlock,\n    VmaStatistics* VMA_NOT_NULL pStats);\n\n/** \\brief Calculates and returns detailed statistics about virtual allocations and memory usage in given #VmaVirtualBlock.\n\nThis function is slow to call. Use for debugging purposes.\nFor less detailed statistics, see vmaGetVirtualBlockStatistics().\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaCalculateVirtualBlockStatistics(\n    VmaVirtualBlock VMA_NOT_NULL virtualBlock,\n    VmaDetailedStatistics* VMA_NOT_NULL pStats);\n\n/** @} */\n\n#if VMA_STATS_STRING_ENABLED\n/**\n\\addtogroup group_stats\n@{\n*/\n\n/** \\brief Builds and returns a null-terminated string in JSON format with information about given #VmaVirtualBlock.\n\\param virtualBlock Virtual block.\n\\param[out] ppStatsString Returned string.\n\\param detailedMap Pass `VK_FALSE` to only obtain statistics as returned by vmaCalculateVirtualBlockStatistics(). Pass `VK_TRUE` to also obtain full list of allocations and free spaces.\n\nReturned string must be freed using vmaFreeVirtualBlockStatsString().\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaBuildVirtualBlockStatsString(\n    VmaVirtualBlock VMA_NOT_NULL virtualBlock,\n    char* VMA_NULLABLE* VMA_NOT_NULL ppStatsString,\n    VkBool32 detailedMap);\n\n/// Frees a string returned by vmaBuildVirtualBlockStatsString().\nVMA_CALL_PRE void VMA_CALL_POST vmaFreeVirtualBlockStatsString(\n    VmaVirtualBlock VMA_NOT_NULL virtualBlock,\n    char* VMA_NULLABLE pStatsString);\n\n/** \\brief Builds and returns statistics as a null-terminated string in JSON format.\n\\param allocator\n\\param[out] ppStatsString Must be freed using vmaFreeStatsString() function.\n\\param detailedMap\n*/\nVMA_CALL_PRE void VMA_CALL_POST vmaBuildStatsString(\n    VmaAllocator VMA_NOT_NULL allocator,\n    char* VMA_NULLABLE* VMA_NOT_NULL ppStatsString,\n    VkBool32 detailedMap);\n\nVMA_CALL_PRE void VMA_CALL_POST vmaFreeStatsString(\n    VmaAllocator VMA_NOT_NULL allocator,\n    char* VMA_NULLABLE pStatsString);\n\n/** @} */\n\n#endif // VMA_STATS_STRING_ENABLED\n\n#endif // _VMA_FUNCTION_HEADERS\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // AMD_VULKAN_MEMORY_ALLOCATOR_H\n\n////////////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////////////\n//\n//    IMPLEMENTATION\n//\n////////////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////////////\n\n// For Visual Studio IntelliSense.\n#if defined(__cplusplus) && defined(__INTELLISENSE__)\n#define VMA_IMPLEMENTATION\n#endif\n\n#ifdef VMA_IMPLEMENTATION\n#undef VMA_IMPLEMENTATION\n\n#include <cstdint>\n#include <cstdlib>\n#include <cstring>\n#include <cinttypes>\n#include <utility>\n#include <type_traits>\n\n#if !defined(VMA_CPP20)\n    #if __cplusplus >= 202002L || _MSVC_LANG >= 202002L // C++20\n        #define VMA_CPP20 1\n    #else\n        #define VMA_CPP20 0\n    #endif\n#endif\n\n#ifdef _MSC_VER\n    #include <intrin.h> // For functions like __popcnt, _BitScanForward etc.\n#endif\n#if VMA_CPP20\n    #include <bit>\n#endif\n\n#if VMA_STATS_STRING_ENABLED\n    #include <cstdio> // For snprintf\n#endif\n\n/*******************************************************************************\nCONFIGURATION SECTION\n\nDefine some of these macros before each #include of this header or change them\nhere if you need other then default behavior depending on your environment.\n*/\n#ifndef _VMA_CONFIGURATION\n\n/*\nDefine this macro to 1 to make the library fetch pointers to Vulkan functions\ninternally, like:\n\n    vulkanFunctions.vkAllocateMemory = &vkAllocateMemory;\n*/\n#if !defined(VMA_STATIC_VULKAN_FUNCTIONS) && !defined(VK_NO_PROTOTYPES)\n    #define VMA_STATIC_VULKAN_FUNCTIONS 1\n#endif\n\n/*\nDefine this macro to 1 to make the library fetch pointers to Vulkan functions\ninternally, like:\n\n    vulkanFunctions.vkAllocateMemory = (PFN_vkAllocateMemory)vkGetDeviceProcAddr(device, \"vkAllocateMemory\");\n\nTo use this feature in new versions of VMA you now have to pass\nVmaVulkanFunctions::vkGetInstanceProcAddr and vkGetDeviceProcAddr as\nVmaAllocatorCreateInfo::pVulkanFunctions. Other members can be null.\n*/\n#if !defined(VMA_DYNAMIC_VULKAN_FUNCTIONS)\n    #define VMA_DYNAMIC_VULKAN_FUNCTIONS 1\n#endif\n\n#ifndef VMA_USE_STL_SHARED_MUTEX\n    #if __cplusplus >= 201703L || _MSVC_LANG >= 201703L // C++17\n        #define VMA_USE_STL_SHARED_MUTEX 1\n    // Visual studio defines __cplusplus properly only when passed additional parameter: /Zc:__cplusplus\n    // Otherwise it is always 199711L, despite shared_mutex works since Visual Studio 2015 Update 2.\n    #elif defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023918 && __cplusplus == 199711L && _MSVC_LANG >= 201703L\n        #define VMA_USE_STL_SHARED_MUTEX 1\n    #else\n        #define VMA_USE_STL_SHARED_MUTEX 0\n    #endif\n#endif\n\n/*\nDefine this macro to include custom header files without having to edit this file directly, e.g.:\n\n    // Inside of \"my_vma_configuration_user_includes.h\":\n\n    #include \"my_custom_assert.h\" // for MY_CUSTOM_ASSERT\n    #include \"my_custom_min.h\" // for my_custom_min\n    #include <algorithm>\n    #include <mutex>\n\n    // Inside a different file, which includes \"vk_mem_alloc.h\":\n\n    #define VMA_CONFIGURATION_USER_INCLUDES_H \"my_vma_configuration_user_includes.h\"\n    #define VMA_ASSERT(expr) MY_CUSTOM_ASSERT(expr)\n    #define VMA_MIN(v1, v2)  (my_custom_min(v1, v2))\n    #include \"vk_mem_alloc.h\"\n    ...\n\nThe following headers are used in this CONFIGURATION section only, so feel free to\nremove them if not needed.\n*/\n#if !defined(VMA_CONFIGURATION_USER_INCLUDES_H)\n    #include <cassert> // for assert\n    #include <algorithm> // for min, max, swap\n    #include <mutex>\n#else\n    #include VMA_CONFIGURATION_USER_INCLUDES_H\n#endif\n\n#ifndef VMA_NULL\n   // Value used as null pointer. Define it to e.g.: nullptr, NULL, 0, (void*)0.\n   #define VMA_NULL   nullptr\n#endif\n\n#ifndef VMA_FALLTHROUGH\n    #if __cplusplus >= 201703L || _MSVC_LANG >= 201703L // C++17\n        #define VMA_FALLTHROUGH [[fallthrough]]\n    #else\n        #define VMA_FALLTHROUGH\n    #endif\n#endif\n\n// Normal assert to check for programmer's errors, especially in Debug configuration.\n#ifndef VMA_ASSERT\n   #ifdef NDEBUG\n       #define VMA_ASSERT(expr)\n   #else\n       #define VMA_ASSERT(expr)         assert(expr)\n   #endif\n#endif\n\n// Assert that will be called very often, like inside data structures e.g. operator[].\n// Making it non-empty can make program slow.\n#ifndef VMA_HEAVY_ASSERT\n   #ifdef NDEBUG\n       #define VMA_HEAVY_ASSERT(expr)\n   #else\n       #define VMA_HEAVY_ASSERT(expr)   //VMA_ASSERT(expr)\n   #endif\n#endif\n\n// Assert used for reporting memory leaks - unfreed allocations.\n#ifndef VMA_ASSERT_LEAK\n    #define VMA_ASSERT_LEAK(expr)   VMA_ASSERT(expr)\n#endif\n\n// If your compiler is not compatible with C++17 and definition of\n// aligned_alloc() function is missing, uncommenting following line may help:\n\n//#include <malloc.h>\n\n#if defined(__ANDROID_API__) && (__ANDROID_API__ < 16)\n#include <cstdlib>\nstatic void* vma_aligned_alloc(size_t alignment, size_t size)\n{\n    // alignment must be >= sizeof(void*)\n    if(alignment < sizeof(void*))\n    {\n        alignment = sizeof(void*);\n    }\n\n    return memalign(alignment, size);\n}\n#elif defined(__APPLE__) || defined(__ANDROID__) || (defined(__linux__) && defined(__GLIBCXX__) && !defined(_GLIBCXX_HAVE_ALIGNED_ALLOC))\n#include <cstdlib>\n\n#if defined(__APPLE__)\n#include <AvailabilityMacros.h>\n#endif\n\nstatic void* vma_aligned_alloc(size_t alignment, size_t size)\n{\n    // Unfortunately, aligned_alloc causes VMA to crash due to it returning null pointers. (At least under 11.4)\n    // Therefore, for now disable this specific exception until a proper solution is found.\n    //#if defined(__APPLE__) && (defined(MAC_OS_X_VERSION_10_16) || defined(__IPHONE_14_0))\n    //#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_16 || __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_14_0\n    //    // For C++14, usr/include/malloc/_malloc.h declares aligned_alloc()) only\n    //    // with the MacOSX11.0 SDK in Xcode 12 (which is what adds\n    //    // MAC_OS_X_VERSION_10_16), even though the function is marked\n    //    // available for 10.15. That is why the preprocessor checks for 10.16 but\n    //    // the __builtin_available checks for 10.15.\n    //    // People who use C++17 could call aligned_alloc with the 10.15 SDK already.\n    //    if (__builtin_available(macOS 10.15, iOS 13, *))\n    //        return aligned_alloc(alignment, size);\n    //#endif\n    //#endif\n\n    // alignment must be >= sizeof(void*)\n    if(alignment < sizeof(void*))\n    {\n        alignment = sizeof(void*);\n    }\n\n    void *pointer;\n    if(posix_memalign(&pointer, alignment, size) == 0)\n        return pointer;\n    return VMA_NULL;\n}\n#elif defined(_WIN32)\nstatic void* vma_aligned_alloc(size_t alignment, size_t size)\n{\n    return _aligned_malloc(size, alignment);\n}\n#elif __cplusplus >= 201703L || _MSVC_LANG >= 201703L // C++17\nstatic void* vma_aligned_alloc(size_t alignment, size_t size)\n{\n    return aligned_alloc(alignment, size);\n}\n#else\nstatic void* vma_aligned_alloc(size_t alignment, size_t size)\n{\n    VMA_ASSERT(0 && \"Could not implement aligned_alloc automatically. Please enable C++17 or later in your compiler or provide custom implementation of macro VMA_SYSTEM_ALIGNED_MALLOC (and VMA_SYSTEM_ALIGNED_FREE if needed) using the API of your system.\");\n    return VMA_NULL;\n}\n#endif\n\n#if defined(_WIN32)\nstatic void vma_aligned_free(void* ptr)\n{\n    _aligned_free(ptr);\n}\n#else\nstatic void vma_aligned_free(void* VMA_NULLABLE ptr)\n{\n    free(ptr);\n}\n#endif\n\n#ifndef VMA_ALIGN_OF\n   #define VMA_ALIGN_OF(type)       (alignof(type))\n#endif\n\n#ifndef VMA_SYSTEM_ALIGNED_MALLOC\n   #define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment) vma_aligned_alloc((alignment), (size))\n#endif\n\n#ifndef VMA_SYSTEM_ALIGNED_FREE\n   // VMA_SYSTEM_FREE is the old name, but might have been defined by the user\n   #if defined(VMA_SYSTEM_FREE)\n      #define VMA_SYSTEM_ALIGNED_FREE(ptr)     VMA_SYSTEM_FREE(ptr)\n   #else\n      #define VMA_SYSTEM_ALIGNED_FREE(ptr)     vma_aligned_free(ptr)\n    #endif\n#endif\n\n#ifndef VMA_COUNT_BITS_SET\n    // Returns number of bits set to 1 in (v)\n    #define VMA_COUNT_BITS_SET(v) VmaCountBitsSet(v)\n#endif\n\n#ifndef VMA_BITSCAN_LSB\n    // Scans integer for index of first nonzero value from the Least Significant Bit (LSB). If mask is 0 then returns UINT8_MAX\n    #define VMA_BITSCAN_LSB(mask) VmaBitScanLSB(mask)\n#endif\n\n#ifndef VMA_BITSCAN_MSB\n    // Scans integer for index of first nonzero value from the Most Significant Bit (MSB). If mask is 0 then returns UINT8_MAX\n    #define VMA_BITSCAN_MSB(mask) VmaBitScanMSB(mask)\n#endif\n\n#ifndef VMA_MIN\n   #define VMA_MIN(v1, v2)    ((std::min)((v1), (v2)))\n#endif\n\n#ifndef VMA_MAX\n   #define VMA_MAX(v1, v2)    ((std::max)((v1), (v2)))\n#endif\n\n#ifndef VMA_SORT\n   #define VMA_SORT(beg, end, cmp)  std::sort(beg, end, cmp)\n#endif\n\n#ifndef VMA_DEBUG_LOG_FORMAT\n   #define VMA_DEBUG_LOG_FORMAT(format, ...)\n   /*\n   #define VMA_DEBUG_LOG_FORMAT(format, ...) do { \\\n       printf((format), __VA_ARGS__); \\\n       printf(\"\\n\"); \\\n   } while(false)\n   */\n#endif\n\n#ifndef VMA_DEBUG_LOG\n    #define VMA_DEBUG_LOG(str)   VMA_DEBUG_LOG_FORMAT(\"%s\", (str))\n#endif\n\n#ifndef VMA_LEAK_LOG_FORMAT\n    #define VMA_LEAK_LOG_FORMAT(format, ...)   VMA_DEBUG_LOG_FORMAT(format, __VA_ARGS__)\n#endif\n\n#ifndef VMA_CLASS_NO_COPY\n    #define VMA_CLASS_NO_COPY(className) \\\n        private: \\\n            className(const className&) = delete; \\\n            className& operator=(const className&) = delete;\n#endif\n#ifndef VMA_CLASS_NO_COPY_NO_MOVE\n    #define VMA_CLASS_NO_COPY_NO_MOVE(className) \\\n        private: \\\n            className(const className&) = delete; \\\n            className(className&&) = delete; \\\n            className& operator=(const className&) = delete; \\\n            className& operator=(className&&) = delete;\n#endif\n\n// Define this macro to 1 to enable functions: vmaBuildStatsString, vmaFreeStatsString.\n#if VMA_STATS_STRING_ENABLED\n    static inline void VmaUint32ToStr(char* VMA_NOT_NULL outStr, size_t strLen, uint32_t num)\n    {\n        snprintf(outStr, strLen, \"%\" PRIu32, num);\n    }\n    static inline void VmaUint64ToStr(char* VMA_NOT_NULL outStr, size_t strLen, uint64_t num)\n    {\n        snprintf(outStr, strLen, \"%\" PRIu64, num);\n    }\n    static inline void VmaPtrToStr(char* VMA_NOT_NULL outStr, size_t strLen, const void* ptr)\n    {\n        snprintf(outStr, strLen, \"%p\", ptr);\n    }\n#endif\n\n#ifndef VMA_MUTEX\n    class VmaMutex\n    {\n    VMA_CLASS_NO_COPY_NO_MOVE(VmaMutex)\n    public:\n        VmaMutex() { }\n        void Lock() { m_Mutex.lock(); }\n        void Unlock() { m_Mutex.unlock(); }\n        bool TryLock() { return m_Mutex.try_lock(); }\n    private:\n        std::mutex m_Mutex;\n    };\n    #define VMA_MUTEX VmaMutex\n#endif\n\n// Read-write mutex, where \"read\" is shared access, \"write\" is exclusive access.\n#ifndef VMA_RW_MUTEX\n    #if VMA_USE_STL_SHARED_MUTEX\n        // Use std::shared_mutex from C++17.\n        #include <shared_mutex>\n        class VmaRWMutex\n        {\n        public:\n            void LockRead() { m_Mutex.lock_shared(); }\n            void UnlockRead() { m_Mutex.unlock_shared(); }\n            bool TryLockRead() { return m_Mutex.try_lock_shared(); }\n            void LockWrite() { m_Mutex.lock(); }\n            void UnlockWrite() { m_Mutex.unlock(); }\n            bool TryLockWrite() { return m_Mutex.try_lock(); }\n        private:\n            std::shared_mutex m_Mutex;\n        };\n        #define VMA_RW_MUTEX VmaRWMutex\n    #elif defined(_WIN32) && defined(WINVER) && defined(SRWLOCK_INIT) && WINVER >= 0x0600\n        // Use SRWLOCK from WinAPI.\n        // Minimum supported client = Windows Vista, server = Windows Server 2008.\n        class VmaRWMutex\n        {\n        public:\n            VmaRWMutex() { InitializeSRWLock(&m_Lock); }\n            void LockRead() { AcquireSRWLockShared(&m_Lock); }\n            void UnlockRead() { ReleaseSRWLockShared(&m_Lock); }\n            bool TryLockRead() { return TryAcquireSRWLockShared(&m_Lock) != FALSE; }\n            void LockWrite() { AcquireSRWLockExclusive(&m_Lock); }\n            void UnlockWrite() { ReleaseSRWLockExclusive(&m_Lock); }\n            bool TryLockWrite() { return TryAcquireSRWLockExclusive(&m_Lock) != FALSE; }\n        private:\n            SRWLOCK m_Lock;\n        };\n        #define VMA_RW_MUTEX VmaRWMutex\n    #else\n        // Less efficient fallback: Use normal mutex.\n        class VmaRWMutex\n        {\n        public:\n            void LockRead() { m_Mutex.Lock(); }\n            void UnlockRead() { m_Mutex.Unlock(); }\n            bool TryLockRead() { return m_Mutex.TryLock(); }\n            void LockWrite() { m_Mutex.Lock(); }\n            void UnlockWrite() { m_Mutex.Unlock(); }\n            bool TryLockWrite() { return m_Mutex.TryLock(); }\n        private:\n            VMA_MUTEX m_Mutex;\n        };\n        #define VMA_RW_MUTEX VmaRWMutex\n    #endif // #if VMA_USE_STL_SHARED_MUTEX\n#endif // #ifndef VMA_RW_MUTEX\n\n/*\nIf providing your own implementation, you need to implement a subset of std::atomic.\n*/\n#ifndef VMA_ATOMIC_UINT32\n    #include <atomic>\n    #define VMA_ATOMIC_UINT32 std::atomic<uint32_t>\n#endif\n\n#ifndef VMA_ATOMIC_UINT64\n    #include <atomic>\n    #define VMA_ATOMIC_UINT64 std::atomic<uint64_t>\n#endif\n\n#ifndef VMA_DEBUG_ALWAYS_DEDICATED_MEMORY\n    /**\n    Every allocation will have its own memory block.\n    Define to 1 for debugging purposes only.\n    */\n    #define VMA_DEBUG_ALWAYS_DEDICATED_MEMORY (0)\n#endif\n\n#ifndef VMA_MIN_ALIGNMENT\n    /**\n    Minimum alignment of all allocations, in bytes.\n    Set to more than 1 for debugging purposes. Must be power of two.\n    */\n    #ifdef VMA_DEBUG_ALIGNMENT // Old name\n        #define VMA_MIN_ALIGNMENT VMA_DEBUG_ALIGNMENT\n    #else\n        #define VMA_MIN_ALIGNMENT (1)\n    #endif\n#endif\n\n#ifndef VMA_DEBUG_MARGIN\n    /**\n    Minimum margin after every allocation, in bytes.\n    Set nonzero for debugging purposes only.\n    */\n    #define VMA_DEBUG_MARGIN (0)\n#endif\n\n#ifndef VMA_DEBUG_INITIALIZE_ALLOCATIONS\n    /**\n    Define this macro to 1 to automatically fill new allocations and destroyed\n    allocations with some bit pattern.\n    */\n    #define VMA_DEBUG_INITIALIZE_ALLOCATIONS (0)\n#endif\n\n#ifndef VMA_DEBUG_DETECT_CORRUPTION\n    /**\n    Define this macro to 1 together with non-zero value of VMA_DEBUG_MARGIN to\n    enable writing magic value to the margin after every allocation and\n    validating it, so that memory corruptions (out-of-bounds writes) are detected.\n    */\n    #define VMA_DEBUG_DETECT_CORRUPTION (0)\n#endif\n\n#ifndef VMA_DEBUG_GLOBAL_MUTEX\n    /**\n    Set this to 1 for debugging purposes only, to enable single mutex protecting all\n    entry calls to the library. Can be useful for debugging multithreading issues.\n    */\n    #define VMA_DEBUG_GLOBAL_MUTEX (0)\n#endif\n\n#ifndef VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY\n    /**\n    Minimum value for VkPhysicalDeviceLimits::bufferImageGranularity.\n    Set to more than 1 for debugging purposes only. Must be power of two.\n    */\n    #define VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY (1)\n#endif\n\n#ifndef VMA_DEBUG_DONT_EXCEED_MAX_MEMORY_ALLOCATION_COUNT\n    /*\n    Set this to 1 to make VMA never exceed VkPhysicalDeviceLimits::maxMemoryAllocationCount\n    and return error instead of leaving up to Vulkan implementation what to do in such cases.\n    */\n    #define VMA_DEBUG_DONT_EXCEED_MAX_MEMORY_ALLOCATION_COUNT (0)\n#endif\n\n#ifndef VMA_SMALL_HEAP_MAX_SIZE\n   /// Maximum size of a memory heap in Vulkan to consider it \"small\".\n   #define VMA_SMALL_HEAP_MAX_SIZE (1024ull * 1024 * 1024)\n#endif\n\n#ifndef VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE\n   /// Default size of a block allocated as single VkDeviceMemory from a \"large\" heap.\n   #define VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE (256ull * 1024 * 1024)\n#endif\n\n/*\nMapping hysteresis is a logic that launches when vmaMapMemory/vmaUnmapMemory is called\nor a persistently mapped allocation is created and destroyed several times in a row.\nIt keeps additional +1 mapping of a device memory block to prevent calling actual\nvkMapMemory/vkUnmapMemory too many times, which may improve performance and help\ntools like RenderDoc.\n*/\n#ifndef VMA_MAPPING_HYSTERESIS_ENABLED\n    #define VMA_MAPPING_HYSTERESIS_ENABLED 1\n#endif\n\n#define VMA_VALIDATE(cond) do { if(!(cond)) { \\\n        VMA_ASSERT(0 && \"Validation failed: \" #cond); \\\n        return false; \\\n    } } while(false)\n\n/*******************************************************************************\nEND OF CONFIGURATION\n*/\n#endif // _VMA_CONFIGURATION\n\n\nstatic const uint8_t VMA_ALLOCATION_FILL_PATTERN_CREATED = 0xDC;\nstatic const uint8_t VMA_ALLOCATION_FILL_PATTERN_DESTROYED = 0xEF;\n// Decimal 2139416166, float NaN, little-endian binary 66 E6 84 7F.\nstatic const uint32_t VMA_CORRUPTION_DETECTION_MAGIC_VALUE = 0x7F84E666;\n\n// Copy of some Vulkan definitions so we don't need to check their existence just to handle few constants.\nstatic const uint32_t VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD_COPY = 0x00000040;\nstatic const uint32_t VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD_COPY = 0x00000080;\nstatic const uint32_t VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_COPY = 0x00020000;\nstatic const uint32_t VK_IMAGE_CREATE_DISJOINT_BIT_COPY = 0x00000200;\nstatic const int32_t VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT_COPY = 1000158000;\nstatic const uint32_t VMA_ALLOCATION_INTERNAL_STRATEGY_MIN_OFFSET = 0x10000000u;\nstatic const uint32_t VMA_ALLOCATION_TRY_COUNT = 32;\nstatic const uint32_t VMA_VENDOR_ID_AMD = 4098;\n\n// This one is tricky. Vulkan specification defines this code as available since\n// Vulkan 1.0, but doesn't actually define it in Vulkan SDK earlier than 1.2.131.\n// See pull request #207.\n#define VK_ERROR_UNKNOWN_COPY ((VkResult)-13)\n\n\n#if VMA_STATS_STRING_ENABLED\n// Correspond to values of enum VmaSuballocationType.\nstatic const char* VMA_SUBALLOCATION_TYPE_NAMES[] =\n{\n    \"FREE\",\n    \"UNKNOWN\",\n    \"BUFFER\",\n    \"IMAGE_UNKNOWN\",\n    \"IMAGE_LINEAR\",\n    \"IMAGE_OPTIMAL\",\n};\n#endif\n\nstatic VkAllocationCallbacks VmaEmptyAllocationCallbacks =\n    { VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL };\n\n\n#ifndef _VMA_ENUM_DECLARATIONS\n\nenum VmaSuballocationType\n{\n    VMA_SUBALLOCATION_TYPE_FREE = 0,\n    VMA_SUBALLOCATION_TYPE_UNKNOWN = 1,\n    VMA_SUBALLOCATION_TYPE_BUFFER = 2,\n    VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN = 3,\n    VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR = 4,\n    VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL = 5,\n    VMA_SUBALLOCATION_TYPE_MAX_ENUM = 0x7FFFFFFF\n};\n\nenum VMA_CACHE_OPERATION\n{\n    VMA_CACHE_FLUSH,\n    VMA_CACHE_INVALIDATE\n};\n\nenum class VmaAllocationRequestType\n{\n    Normal,\n    TLSF,\n    // Used by \"Linear\" algorithm.\n    UpperAddress,\n    EndOf1st,\n    EndOf2nd,\n};\n\n#endif // _VMA_ENUM_DECLARATIONS\n\n#ifndef _VMA_FORWARD_DECLARATIONS\n// Opaque handle used by allocation algorithms to identify single allocation in any conforming way.\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VmaAllocHandle);\n\nstruct VmaMutexLock;\nstruct VmaMutexLockRead;\nstruct VmaMutexLockWrite;\n\ntemplate<typename T>\nstruct AtomicTransactionalIncrement;\n\ntemplate<typename T>\nstruct VmaStlAllocator;\n\ntemplate<typename T, typename AllocatorT>\nclass VmaVector;\n\ntemplate<typename T, typename AllocatorT, size_t N>\nclass VmaSmallVector;\n\ntemplate<typename T>\nclass VmaPoolAllocator;\n\ntemplate<typename T>\nstruct VmaListItem;\n\ntemplate<typename T>\nclass VmaRawList;\n\ntemplate<typename T, typename AllocatorT>\nclass VmaList;\n\ntemplate<typename ItemTypeTraits>\nclass VmaIntrusiveLinkedList;\n\n#if VMA_STATS_STRING_ENABLED\nclass VmaStringBuilder;\nclass VmaJsonWriter;\n#endif\n\nclass VmaDeviceMemoryBlock;\n\nstruct VmaDedicatedAllocationListItemTraits;\nclass VmaDedicatedAllocationList;\n\nstruct VmaSuballocation;\nstruct VmaSuballocationOffsetLess;\nstruct VmaSuballocationOffsetGreater;\nstruct VmaSuballocationItemSizeLess;\n\ntypedef VmaList<VmaSuballocation, VmaStlAllocator<VmaSuballocation>> VmaSuballocationList;\n\nstruct VmaAllocationRequest;\n\nclass VmaBlockMetadata;\nclass VmaBlockMetadata_Linear;\nclass VmaBlockMetadata_TLSF;\n\nclass VmaBlockVector;\n\nstruct VmaPoolListItemTraits;\n\nstruct VmaCurrentBudgetData;\n\nclass VmaAllocationObjectAllocator;\n\n#endif // _VMA_FORWARD_DECLARATIONS\n\n\n#ifndef _VMA_FUNCTIONS\n\n/*\nReturns number of bits set to 1 in (v).\n\nOn specific platforms and compilers you can use intrinsics like:\n\nVisual Studio:\n    return __popcnt(v);\nGCC, Clang:\n    return static_cast<uint32_t>(__builtin_popcount(v));\n\nDefine macro VMA_COUNT_BITS_SET to provide your optimized implementation.\nBut you need to check in runtime whether user's CPU supports these, as some old processors don't.\n*/\nstatic inline uint32_t VmaCountBitsSet(uint32_t v)\n{\n#if VMA_CPP20\n    return std::popcount(v);\n#else\n    uint32_t c = v - ((v >> 1) & 0x55555555);\n    c = ((c >> 2) & 0x33333333) + (c & 0x33333333);\n    c = ((c >> 4) + c) & 0x0F0F0F0F;\n    c = ((c >> 8) + c) & 0x00FF00FF;\n    c = ((c >> 16) + c) & 0x0000FFFF;\n    return c;\n#endif\n}\n\nstatic inline uint8_t VmaBitScanLSB(uint64_t mask)\n{\n#if defined(_MSC_VER) && defined(_WIN64)\n    unsigned long pos;\n    if (_BitScanForward64(&pos, mask))\n        return static_cast<uint8_t>(pos);\n    return UINT8_MAX;\n#elif VMA_CPP20\n    if(mask)\n        return static_cast<uint8_t>(std::countr_zero(mask));\n    return UINT8_MAX;\n#elif defined __GNUC__ || defined __clang__\n    return static_cast<uint8_t>(__builtin_ffsll(mask)) - 1U;\n#else\n    uint8_t pos = 0;\n    uint64_t bit = 1;\n    do\n    {\n        if (mask & bit)\n            return pos;\n        bit <<= 1;\n    } while (pos++ < 63);\n    return UINT8_MAX;\n#endif\n}\n\nstatic inline uint8_t VmaBitScanLSB(uint32_t mask)\n{\n#ifdef _MSC_VER\n    unsigned long pos;\n    if (_BitScanForward(&pos, mask))\n        return static_cast<uint8_t>(pos);\n    return UINT8_MAX;\n#elif VMA_CPP20\n    if(mask)\n        return static_cast<uint8_t>(std::countr_zero(mask));\n    return UINT8_MAX;\n#elif defined __GNUC__ || defined __clang__\n    return static_cast<uint8_t>(__builtin_ffs(mask)) - 1U;\n#else\n    uint8_t pos = 0;\n    uint32_t bit = 1;\n    do\n    {\n        if (mask & bit)\n            return pos;\n        bit <<= 1;\n    } while (pos++ < 31);\n    return UINT8_MAX;\n#endif\n}\n\nstatic inline uint8_t VmaBitScanMSB(uint64_t mask)\n{\n#if defined(_MSC_VER) && defined(_WIN64)\n    unsigned long pos;\n    if (_BitScanReverse64(&pos, mask))\n        return static_cast<uint8_t>(pos);\n#elif VMA_CPP20\n    if(mask)\n        return 63 - static_cast<uint8_t>(std::countl_zero(mask));\n#elif defined __GNUC__ || defined __clang__\n    if (mask)\n        return 63 - static_cast<uint8_t>(__builtin_clzll(mask));\n#else\n    uint8_t pos = 63;\n    uint64_t bit = 1ULL << 63;\n    do\n    {\n        if (mask & bit)\n            return pos;\n        bit >>= 1;\n    } while (pos-- > 0);\n#endif\n    return UINT8_MAX;\n}\n\nstatic inline uint8_t VmaBitScanMSB(uint32_t mask)\n{\n#ifdef _MSC_VER\n    unsigned long pos;\n    if (_BitScanReverse(&pos, mask))\n        return static_cast<uint8_t>(pos);\n#elif VMA_CPP20\n    if(mask)\n        return 31 - static_cast<uint8_t>(std::countl_zero(mask));\n#elif defined __GNUC__ || defined __clang__\n    if (mask)\n        return 31 - static_cast<uint8_t>(__builtin_clz(mask));\n#else\n    uint8_t pos = 31;\n    uint32_t bit = 1UL << 31;\n    do\n    {\n        if (mask & bit)\n            return pos;\n        bit >>= 1;\n    } while (pos-- > 0);\n#endif\n    return UINT8_MAX;\n}\n\n/*\nReturns true if given number is a power of two.\nT must be unsigned integer number or signed integer but always nonnegative.\nFor 0 returns true.\n*/\ntemplate <typename T>\ninline bool VmaIsPow2(T x)\n{\n    return (x & (x - 1)) == 0;\n}\n\n// Aligns given value up to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 16.\n// Use types like uint32_t, uint64_t as T.\ntemplate <typename T>\nstatic inline T VmaAlignUp(T val, T alignment)\n{\n    VMA_HEAVY_ASSERT(VmaIsPow2(alignment));\n    return (val + alignment - 1) & ~(alignment - 1);\n}\n\n// Aligns given value down to nearest multiply of align value. For example: VmaAlignDown(11, 8) = 8.\n// Use types like uint32_t, uint64_t as T.\ntemplate <typename T>\nstatic inline T VmaAlignDown(T val, T alignment)\n{\n    VMA_HEAVY_ASSERT(VmaIsPow2(alignment));\n    return val & ~(alignment - 1);\n}\n\n// Division with mathematical rounding to nearest number.\ntemplate <typename T>\nstatic inline T VmaRoundDiv(T x, T y)\n{\n    return (x + (y / (T)2)) / y;\n}\n\n// Divide by 'y' and round up to nearest integer.\ntemplate <typename T>\nstatic inline T VmaDivideRoundingUp(T x, T y)\n{\n    return (x + y - (T)1) / y;\n}\n\n// Returns smallest power of 2 greater or equal to v.\nstatic inline uint32_t VmaNextPow2(uint32_t v)\n{\n    v--;\n    v |= v >> 1;\n    v |= v >> 2;\n    v |= v >> 4;\n    v |= v >> 8;\n    v |= v >> 16;\n    v++;\n    return v;\n}\n\nstatic inline uint64_t VmaNextPow2(uint64_t v)\n{\n    v--;\n    v |= v >> 1;\n    v |= v >> 2;\n    v |= v >> 4;\n    v |= v >> 8;\n    v |= v >> 16;\n    v |= v >> 32;\n    v++;\n    return v;\n}\n\n// Returns largest power of 2 less or equal to v.\nstatic inline uint32_t VmaPrevPow2(uint32_t v)\n{\n    v |= v >> 1;\n    v |= v >> 2;\n    v |= v >> 4;\n    v |= v >> 8;\n    v |= v >> 16;\n    v = v ^ (v >> 1);\n    return v;\n}\n\nstatic inline uint64_t VmaPrevPow2(uint64_t v)\n{\n    v |= v >> 1;\n    v |= v >> 2;\n    v |= v >> 4;\n    v |= v >> 8;\n    v |= v >> 16;\n    v |= v >> 32;\n    v = v ^ (v >> 1);\n    return v;\n}\n\nstatic inline bool VmaStrIsEmpty(const char* pStr)\n{\n    return pStr == VMA_NULL || *pStr == '\\0';\n}\n\n/*\nReturns true if two memory blocks occupy overlapping pages.\nResourceA must be in less memory offset than ResourceB.\n\nAlgorithm is based on \"Vulkan 1.0.39 - A Specification (with all registered Vulkan extensions)\"\nchapter 11.6 \"Resource Memory Association\", paragraph \"Buffer-Image Granularity\".\n*/\nstatic inline bool VmaBlocksOnSamePage(\n    VkDeviceSize resourceAOffset,\n    VkDeviceSize resourceASize,\n    VkDeviceSize resourceBOffset,\n    VkDeviceSize pageSize)\n{\n    VMA_ASSERT(resourceAOffset + resourceASize <= resourceBOffset && resourceASize > 0 && pageSize > 0);\n    VkDeviceSize resourceAEnd = resourceAOffset + resourceASize - 1;\n    VkDeviceSize resourceAEndPage = resourceAEnd & ~(pageSize - 1);\n    VkDeviceSize resourceBStart = resourceBOffset;\n    VkDeviceSize resourceBStartPage = resourceBStart & ~(pageSize - 1);\n    return resourceAEndPage == resourceBStartPage;\n}\n\n/*\nReturns true if given suballocation types could conflict and must respect\nVkPhysicalDeviceLimits::bufferImageGranularity. They conflict if one is buffer\nor linear image and another one is optimal image. If type is unknown, behave\nconservatively.\n*/\nstatic inline bool VmaIsBufferImageGranularityConflict(\n    VmaSuballocationType suballocType1,\n    VmaSuballocationType suballocType2)\n{\n    if (suballocType1 > suballocType2)\n    {\n        std::swap(suballocType1, suballocType2);\n    }\n\n    switch (suballocType1)\n    {\n    case VMA_SUBALLOCATION_TYPE_FREE:\n        return false;\n    case VMA_SUBALLOCATION_TYPE_UNKNOWN:\n        return true;\n    case VMA_SUBALLOCATION_TYPE_BUFFER:\n        return\n            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||\n            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;\n    case VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN:\n        return\n            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||\n            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR ||\n            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;\n    case VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR:\n        return\n            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;\n    case VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL:\n        return false;\n    default:\n        VMA_ASSERT(0);\n        return true;\n    }\n}\n\nstatic void VmaWriteMagicValue(void* pData, VkDeviceSize offset)\n{\n#if VMA_DEBUG_MARGIN > 0 && VMA_DEBUG_DETECT_CORRUPTION\n    uint32_t* pDst = (uint32_t*)((char*)pData + offset);\n    const size_t numberCount = VMA_DEBUG_MARGIN / sizeof(uint32_t);\n    for (size_t i = 0; i < numberCount; ++i, ++pDst)\n    {\n        *pDst = VMA_CORRUPTION_DETECTION_MAGIC_VALUE;\n    }\n#else\n    // no-op\n#endif\n}\n\nstatic bool VmaValidateMagicValue(const void* pData, VkDeviceSize offset)\n{\n#if VMA_DEBUG_MARGIN > 0 && VMA_DEBUG_DETECT_CORRUPTION\n    const uint32_t* pSrc = (const uint32_t*)((const char*)pData + offset);\n    const size_t numberCount = VMA_DEBUG_MARGIN / sizeof(uint32_t);\n    for (size_t i = 0; i < numberCount; ++i, ++pSrc)\n    {\n        if (*pSrc != VMA_CORRUPTION_DETECTION_MAGIC_VALUE)\n        {\n            return false;\n        }\n    }\n#endif\n    return true;\n}\n\n/*\nFills structure with parameters of an example buffer to be used for transfers\nduring GPU memory defragmentation.\n*/\nstatic void VmaFillGpuDefragmentationBufferCreateInfo(VkBufferCreateInfo& outBufCreateInfo)\n{\n    memset(&outBufCreateInfo, 0, sizeof(outBufCreateInfo));\n    outBufCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;\n    outBufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;\n    outBufCreateInfo.size = (VkDeviceSize)VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE; // Example size.\n}\n\n\n/*\nPerforms binary search and returns iterator to first element that is greater or\nequal to (key), according to comparison (cmp).\n\nCmp should return true if first argument is less than second argument.\n\nReturned value is the found element, if present in the collection or place where\nnew element with value (key) should be inserted.\n*/\ntemplate <typename CmpLess, typename IterT, typename KeyT>\nstatic IterT VmaBinaryFindFirstNotLess(IterT beg, IterT end, const KeyT& key, const CmpLess& cmp)\n{\n    size_t down = 0, up = size_t(end - beg);\n    while (down < up)\n    {\n        const size_t mid = down + (up - down) / 2;  // Overflow-safe midpoint calculation\n        if (cmp(*(beg + mid), key))\n        {\n            down = mid + 1;\n        }\n        else\n        {\n            up = mid;\n        }\n    }\n    return beg + down;\n}\n\ntemplate<typename CmpLess, typename IterT, typename KeyT>\nIterT VmaBinaryFindSorted(const IterT& beg, const IterT& end, const KeyT& value, const CmpLess& cmp)\n{\n    IterT it = VmaBinaryFindFirstNotLess<CmpLess, IterT, KeyT>(\n        beg, end, value, cmp);\n    if (it == end ||\n        (!cmp(*it, value) && !cmp(value, *it)))\n    {\n        return it;\n    }\n    return end;\n}\n\n/*\nReturns true if all pointers in the array are not-null and unique.\nWarning! O(n^2) complexity. Use only inside VMA_HEAVY_ASSERT.\nT must be pointer type, e.g. VmaAllocation, VmaPool.\n*/\ntemplate<typename T>\nstatic bool VmaValidatePointerArray(uint32_t count, const T* arr)\n{\n    for (uint32_t i = 0; i < count; ++i)\n    {\n        const T iPtr = arr[i];\n        if (iPtr == VMA_NULL)\n        {\n            return false;\n        }\n        for (uint32_t j = i + 1; j < count; ++j)\n        {\n            if (iPtr == arr[j])\n            {\n                return false;\n            }\n        }\n    }\n    return true;\n}\n\ntemplate<typename MainT, typename NewT>\nstatic inline void VmaPnextChainPushFront(MainT* mainStruct, NewT* newStruct)\n{\n    newStruct->pNext = mainStruct->pNext;\n    mainStruct->pNext = newStruct;\n}\n// Finds structure with s->sType == sType in mainStruct->pNext chain.\n// Returns pointer to it. If not found, returns null.\ntemplate<typename FindT, typename MainT>\nstatic inline const FindT* VmaPnextChainFind(const MainT* mainStruct, VkStructureType sType)\n{\n    for(const VkBaseInStructure* s = (const VkBaseInStructure*)mainStruct->pNext;\n        s != VMA_NULL; s = s->pNext)\n    {\n        if(s->sType == sType)\n        {\n            return (const FindT*)s;\n        }\n    }\n    return VMA_NULL;\n}\n\n// An abstraction over buffer or image `usage` flags, depending on available extensions.\nstruct VmaBufferImageUsage\n{\n#if VMA_KHR_MAINTENANCE5\n    typedef uint64_t BaseType; // VkFlags64\n#else\n    typedef uint32_t BaseType; // VkFlags32\n#endif\n\n    static const VmaBufferImageUsage UNKNOWN;\n\n    BaseType Value;\n\n    VmaBufferImageUsage() { *this = UNKNOWN; }\n    explicit VmaBufferImageUsage(BaseType usage) : Value(usage) { }\n    VmaBufferImageUsage(const VkBufferCreateInfo &createInfo, bool useKhrMaintenance5);\n    explicit VmaBufferImageUsage(const VkImageCreateInfo &createInfo);\n\n    bool operator==(const VmaBufferImageUsage& rhs) const { return Value == rhs.Value; }\n    bool operator!=(const VmaBufferImageUsage& rhs) const { return Value != rhs.Value; }\n\n    bool Contains(BaseType flag) const { return (Value & flag) != 0; }\n    bool ContainsDeviceAccess() const\n    {\n        // This relies on values of VK_IMAGE_USAGE_TRANSFER* being the same as VK_BUFFER_IMAGE_TRANSFER*.\n        return (Value & ~BaseType(VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT)) != 0;\n    }\n};\n\nconst VmaBufferImageUsage VmaBufferImageUsage::UNKNOWN = VmaBufferImageUsage(0);\n\nVmaBufferImageUsage::VmaBufferImageUsage(const VkBufferCreateInfo &createInfo,\n    bool useKhrMaintenance5)\n{\n#if VMA_KHR_MAINTENANCE5\n    if(useKhrMaintenance5)\n    {\n        // If VkBufferCreateInfo::pNext chain contains VkBufferUsageFlags2CreateInfoKHR,\n        // take usage from it and ignore VkBufferCreateInfo::usage, per specification\n        // of the VK_KHR_maintenance5 extension.\n        const VkBufferUsageFlags2CreateInfoKHR* const usageFlags2 =\n            VmaPnextChainFind<VkBufferUsageFlags2CreateInfoKHR>(&createInfo, VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR);\n        if(usageFlags2)\n        {\n            this->Value = usageFlags2->usage;\n            return;\n        }\n    }\n#endif\n\n    this->Value = (BaseType)createInfo.usage;\n}\n\nVmaBufferImageUsage::VmaBufferImageUsage(const VkImageCreateInfo &createInfo)\n{\n    // Maybe in the future there will be VK_KHR_maintenanceN extension with structure\n    // VkImageUsageFlags2CreateInfoKHR, like the one for buffers...\n\n    this->Value = (BaseType)createInfo.usage;\n}\n\n// This is the main algorithm that guides the selection of a memory type best for an allocation -\n// converts usage to required/preferred/not preferred flags.\nstatic bool FindMemoryPreferences(\n    bool isIntegratedGPU,\n    const VmaAllocationCreateInfo& allocCreateInfo,\n    VmaBufferImageUsage bufImgUsage,\n    VkMemoryPropertyFlags& outRequiredFlags,\n    VkMemoryPropertyFlags& outPreferredFlags,\n    VkMemoryPropertyFlags& outNotPreferredFlags)\n{\n    outRequiredFlags = allocCreateInfo.requiredFlags;\n    outPreferredFlags = allocCreateInfo.preferredFlags;\n    outNotPreferredFlags = 0;\n\n    switch(allocCreateInfo.usage)\n    {\n    case VMA_MEMORY_USAGE_UNKNOWN:\n        break;\n    case VMA_MEMORY_USAGE_GPU_ONLY:\n        if(!isIntegratedGPU || (outPreferredFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)\n        {\n            outPreferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;\n        }\n        break;\n    case VMA_MEMORY_USAGE_CPU_ONLY:\n        outRequiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;\n        break;\n    case VMA_MEMORY_USAGE_CPU_TO_GPU:\n        outRequiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;\n        if(!isIntegratedGPU || (outPreferredFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)\n        {\n            outPreferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;\n        }\n        break;\n    case VMA_MEMORY_USAGE_GPU_TO_CPU:\n        outRequiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;\n        outPreferredFlags |= VK_MEMORY_PROPERTY_HOST_CACHED_BIT;\n        break;\n    case VMA_MEMORY_USAGE_CPU_COPY:\n        outNotPreferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;\n        break;\n    case VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED:\n        outRequiredFlags |= VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT;\n        break;\n    case VMA_MEMORY_USAGE_AUTO:\n    case VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE:\n    case VMA_MEMORY_USAGE_AUTO_PREFER_HOST:\n    {\n        if(bufImgUsage == VmaBufferImageUsage::UNKNOWN)\n        {\n            VMA_ASSERT(0 && \"VMA_MEMORY_USAGE_AUTO* values can only be used with functions like vmaCreateBuffer, vmaCreateImage so that the details of the created resource are known.\"\n                \" Maybe you use VkBufferUsageFlags2CreateInfoKHR but forgot to use VMA_ALLOCATOR_CREATE_KHR_MAINTENANCE5_BIT?\" );\n            return false;\n        }\n\n        const bool deviceAccess = bufImgUsage.ContainsDeviceAccess();\n        const bool hostAccessSequentialWrite = (allocCreateInfo.flags & VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT) != 0;\n        const bool hostAccessRandom = (allocCreateInfo.flags & VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT) != 0;\n        const bool hostAccessAllowTransferInstead = (allocCreateInfo.flags & VMA_ALLOCATION_CREATE_HOST_ACCESS_ALLOW_TRANSFER_INSTEAD_BIT) != 0;\n        const bool preferDevice = allocCreateInfo.usage == VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE;\n        const bool preferHost = allocCreateInfo.usage == VMA_MEMORY_USAGE_AUTO_PREFER_HOST;\n\n        // CPU random access - e.g. a buffer written to or transferred from GPU to read back on CPU.\n        if(hostAccessRandom)\n        {\n            // Prefer cached. Cannot require it, because some platforms don't have it (e.g. Raspberry Pi - see #362)!\n            outPreferredFlags |= VK_MEMORY_PROPERTY_HOST_CACHED_BIT;\n\n            if (!isIntegratedGPU && deviceAccess && hostAccessAllowTransferInstead && !preferHost)\n            {\n                // Nice if it will end up in HOST_VISIBLE, but more importantly prefer DEVICE_LOCAL.\n                // Omitting HOST_VISIBLE here is intentional.\n                // In case there is DEVICE_LOCAL | HOST_VISIBLE | HOST_CACHED, it will pick that one.\n                // Otherwise, this will give same weight to DEVICE_LOCAL as HOST_VISIBLE | HOST_CACHED and select the former if occurs first on the list.\n                outPreferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;\n            }\n            else\n            {\n                // Always CPU memory.\n                outRequiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;\n            }\n        }\n        // CPU sequential write - may be CPU or host-visible GPU memory, uncached and write-combined.\n        else if(hostAccessSequentialWrite)\n        {\n            // Want uncached and write-combined.\n            outNotPreferredFlags |= VK_MEMORY_PROPERTY_HOST_CACHED_BIT;\n\n            if(!isIntegratedGPU && deviceAccess && hostAccessAllowTransferInstead && !preferHost)\n            {\n                outPreferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;\n            }\n            else\n            {\n                outRequiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;\n                // Direct GPU access, CPU sequential write (e.g. a dynamic uniform buffer updated every frame)\n                if(deviceAccess)\n                {\n                    // Could go to CPU memory or GPU BAR/unified. Up to the user to decide. If no preference, choose GPU memory.\n                    if(preferHost)\n                        outNotPreferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;\n                    else\n                        outPreferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;\n                }\n                // GPU no direct access, CPU sequential write (e.g. an upload buffer to be transferred to the GPU)\n                else\n                {\n                    // Could go to CPU memory or GPU BAR/unified. Up to the user to decide. If no preference, choose CPU memory.\n                    if(preferDevice)\n                        outPreferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;\n                    else\n                        outNotPreferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;\n                }\n            }\n        }\n        // No CPU access\n        else\n        {\n            // if(deviceAccess)\n            //\n            // GPU access, no CPU access (e.g. a color attachment image) - prefer GPU memory,\n            // unless there is a clear preference from the user not to do so.\n            //\n            // else:\n            //\n            // No direct GPU access, no CPU access, just transfers.\n            // It may be staging copy intended for e.g. preserving image for next frame (then better GPU memory) or\n            // a \"swap file\" copy to free some GPU memory (then better CPU memory).\n            // Up to the user to decide. If no preferece, assume the former and choose GPU memory.\n\n            if(preferHost)\n                outNotPreferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;\n            else\n                outPreferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;\n        }\n        break;\n    }\n    default:\n        VMA_ASSERT(0);\n    }\n\n    // Avoid DEVICE_COHERENT unless explicitly requested.\n    if(((allocCreateInfo.requiredFlags | allocCreateInfo.preferredFlags) &\n        (VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD_COPY | VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD_COPY)) == 0)\n    {\n        outNotPreferredFlags |= VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD_COPY;\n    }\n\n    return true;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Memory allocation\n\nstatic void* VmaMalloc(const VkAllocationCallbacks* pAllocationCallbacks, size_t size, size_t alignment)\n{\n    void* result = VMA_NULL;\n    if ((pAllocationCallbacks != VMA_NULL) &&\n        (pAllocationCallbacks->pfnAllocation != VMA_NULL))\n    {\n        result = (*pAllocationCallbacks->pfnAllocation)(\n            pAllocationCallbacks->pUserData,\n            size,\n            alignment,\n            VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);\n    }\n    else\n    {\n        result = VMA_SYSTEM_ALIGNED_MALLOC(size, alignment);\n    }\n    VMA_ASSERT(result != VMA_NULL && \"CPU memory allocation failed.\");\n    return result;\n}\n\nstatic void VmaFree(const VkAllocationCallbacks* pAllocationCallbacks, void* ptr)\n{\n    if ((pAllocationCallbacks != VMA_NULL) &&\n        (pAllocationCallbacks->pfnFree != VMA_NULL))\n    {\n        (*pAllocationCallbacks->pfnFree)(pAllocationCallbacks->pUserData, ptr);\n    }\n    else\n    {\n        VMA_SYSTEM_ALIGNED_FREE(ptr);\n    }\n}\n\ntemplate<typename T>\nstatic T* VmaAllocate(const VkAllocationCallbacks* pAllocationCallbacks)\n{\n    return (T*)VmaMalloc(pAllocationCallbacks, sizeof(T), VMA_ALIGN_OF(T));\n}\n\ntemplate<typename T>\nstatic T* VmaAllocateArray(const VkAllocationCallbacks* pAllocationCallbacks, size_t count)\n{\n    return (T*)VmaMalloc(pAllocationCallbacks, sizeof(T) * count, VMA_ALIGN_OF(T));\n}\n\n#define vma_new(allocator, type)   new(VmaAllocate<type>(allocator))(type)\n\n#define vma_new_array(allocator, type, count)   new(VmaAllocateArray<type>((allocator), (count)))(type)\n\ntemplate<typename T>\nstatic void vma_delete(const VkAllocationCallbacks* pAllocationCallbacks, T* ptr)\n{\n    ptr->~T();\n    VmaFree(pAllocationCallbacks, ptr);\n}\n\ntemplate<typename T>\nstatic void vma_delete_array(const VkAllocationCallbacks* pAllocationCallbacks, T* ptr, size_t count)\n{\n    if (ptr != VMA_NULL)\n    {\n        for (size_t i = count; i--; )\n        {\n            ptr[i].~T();\n        }\n        VmaFree(pAllocationCallbacks, ptr);\n    }\n}\n\nstatic char* VmaCreateStringCopy(const VkAllocationCallbacks* allocs, const char* srcStr)\n{\n    if (srcStr != VMA_NULL)\n    {\n        const size_t len = strlen(srcStr);\n        char* const result = vma_new_array(allocs, char, len + 1);\n        memcpy(result, srcStr, len + 1);\n        return result;\n    }\n    return VMA_NULL;\n}\n\n#if VMA_STATS_STRING_ENABLED\nstatic char* VmaCreateStringCopy(const VkAllocationCallbacks* allocs, const char* srcStr, size_t strLen)\n{\n    if (srcStr != VMA_NULL)\n    {\n        char* const result = vma_new_array(allocs, char, strLen + 1);\n        memcpy(result, srcStr, strLen);\n        result[strLen] = '\\0';\n        return result;\n    }\n    return VMA_NULL;\n}\n#endif // VMA_STATS_STRING_ENABLED\n\nstatic void VmaFreeString(const VkAllocationCallbacks* allocs, char* str)\n{\n    if (str != VMA_NULL)\n    {\n        const size_t len = strlen(str);\n        vma_delete_array(allocs, str, len + 1);\n    }\n}\n\ntemplate<typename CmpLess, typename VectorT>\nsize_t VmaVectorInsertSorted(VectorT& vector, const typename VectorT::value_type& value)\n{\n    const size_t indexToInsert = VmaBinaryFindFirstNotLess(\n        vector.data(),\n        vector.data() + vector.size(),\n        value,\n        CmpLess()) - vector.data();\n    VmaVectorInsert(vector, indexToInsert, value);\n    return indexToInsert;\n}\n\ntemplate<typename CmpLess, typename VectorT>\nbool VmaVectorRemoveSorted(VectorT& vector, const typename VectorT::value_type& value)\n{\n    CmpLess comparator;\n    typename VectorT::iterator it = VmaBinaryFindFirstNotLess(\n        vector.begin(),\n        vector.end(),\n        value,\n        comparator);\n    if ((it != vector.end()) && !comparator(*it, value) && !comparator(value, *it))\n    {\n        size_t indexToRemove = it - vector.begin();\n        VmaVectorRemove(vector, indexToRemove);\n        return true;\n    }\n    return false;\n}\n#endif // _VMA_FUNCTIONS\n\n#ifndef _VMA_STATISTICS_FUNCTIONS\n\nstatic void VmaClearStatistics(VmaStatistics& outStats)\n{\n    outStats.blockCount = 0;\n    outStats.allocationCount = 0;\n    outStats.blockBytes = 0;\n    outStats.allocationBytes = 0;\n}\n\nstatic void VmaAddStatistics(VmaStatistics& inoutStats, const VmaStatistics& src)\n{\n    inoutStats.blockCount += src.blockCount;\n    inoutStats.allocationCount += src.allocationCount;\n    inoutStats.blockBytes += src.blockBytes;\n    inoutStats.allocationBytes += src.allocationBytes;\n}\n\nstatic void VmaClearDetailedStatistics(VmaDetailedStatistics& outStats)\n{\n    VmaClearStatistics(outStats.statistics);\n    outStats.unusedRangeCount = 0;\n    outStats.allocationSizeMin = VK_WHOLE_SIZE;\n    outStats.allocationSizeMax = 0;\n    outStats.unusedRangeSizeMin = VK_WHOLE_SIZE;\n    outStats.unusedRangeSizeMax = 0;\n}\n\nstatic void VmaAddDetailedStatisticsAllocation(VmaDetailedStatistics& inoutStats, VkDeviceSize size)\n{\n    inoutStats.statistics.allocationCount++;\n    inoutStats.statistics.allocationBytes += size;\n    inoutStats.allocationSizeMin = VMA_MIN(inoutStats.allocationSizeMin, size);\n    inoutStats.allocationSizeMax = VMA_MAX(inoutStats.allocationSizeMax, size);\n}\n\nstatic void VmaAddDetailedStatisticsUnusedRange(VmaDetailedStatistics& inoutStats, VkDeviceSize size)\n{\n    inoutStats.unusedRangeCount++;\n    inoutStats.unusedRangeSizeMin = VMA_MIN(inoutStats.unusedRangeSizeMin, size);\n    inoutStats.unusedRangeSizeMax = VMA_MAX(inoutStats.unusedRangeSizeMax, size);\n}\n\nstatic void VmaAddDetailedStatistics(VmaDetailedStatistics& inoutStats, const VmaDetailedStatistics& src)\n{\n    VmaAddStatistics(inoutStats.statistics, src.statistics);\n    inoutStats.unusedRangeCount += src.unusedRangeCount;\n    inoutStats.allocationSizeMin = VMA_MIN(inoutStats.allocationSizeMin, src.allocationSizeMin);\n    inoutStats.allocationSizeMax = VMA_MAX(inoutStats.allocationSizeMax, src.allocationSizeMax);\n    inoutStats.unusedRangeSizeMin = VMA_MIN(inoutStats.unusedRangeSizeMin, src.unusedRangeSizeMin);\n    inoutStats.unusedRangeSizeMax = VMA_MAX(inoutStats.unusedRangeSizeMax, src.unusedRangeSizeMax);\n}\n\n#endif // _VMA_STATISTICS_FUNCTIONS\n\n#ifndef _VMA_MUTEX_LOCK\n// Helper RAII class to lock a mutex in constructor and unlock it in destructor (at the end of scope).\nstruct VmaMutexLock\n{\n    VMA_CLASS_NO_COPY_NO_MOVE(VmaMutexLock)\npublic:\n    VmaMutexLock(VMA_MUTEX& mutex, bool useMutex = true) :\n        m_pMutex(useMutex ? &mutex : VMA_NULL)\n    {\n        if (m_pMutex) { m_pMutex->Lock(); }\n    }\n    ~VmaMutexLock() {  if (m_pMutex) { m_pMutex->Unlock(); } }\n\nprivate:\n    VMA_MUTEX* m_pMutex;\n};\n\n// Helper RAII class to lock a RW mutex in constructor and unlock it in destructor (at the end of scope), for reading.\nstruct VmaMutexLockRead\n{\n    VMA_CLASS_NO_COPY_NO_MOVE(VmaMutexLockRead)\npublic:\n    VmaMutexLockRead(VMA_RW_MUTEX& mutex, bool useMutex) :\n        m_pMutex(useMutex ? &mutex : VMA_NULL)\n    {\n        if (m_pMutex) { m_pMutex->LockRead(); }\n    }\n    ~VmaMutexLockRead() { if (m_pMutex) { m_pMutex->UnlockRead(); } }\n\nprivate:\n    VMA_RW_MUTEX* m_pMutex;\n};\n\n// Helper RAII class to lock a RW mutex in constructor and unlock it in destructor (at the end of scope), for writing.\nstruct VmaMutexLockWrite\n{\n    VMA_CLASS_NO_COPY_NO_MOVE(VmaMutexLockWrite)\npublic:\n    VmaMutexLockWrite(VMA_RW_MUTEX& mutex, bool useMutex)\n        : m_pMutex(useMutex ? &mutex : VMA_NULL)\n    {\n        if (m_pMutex) { m_pMutex->LockWrite(); }\n    }\n    ~VmaMutexLockWrite() { if (m_pMutex) { m_pMutex->UnlockWrite(); } }\n\nprivate:\n    VMA_RW_MUTEX* m_pMutex;\n};\n\n#if VMA_DEBUG_GLOBAL_MUTEX\n    static VMA_MUTEX gDebugGlobalMutex;\n    #define VMA_DEBUG_GLOBAL_MUTEX_LOCK VmaMutexLock debugGlobalMutexLock(gDebugGlobalMutex, true);\n#else\n    #define VMA_DEBUG_GLOBAL_MUTEX_LOCK\n#endif\n#endif // _VMA_MUTEX_LOCK\n\n#ifndef _VMA_ATOMIC_TRANSACTIONAL_INCREMENT\n// An object that increments given atomic but decrements it back in the destructor unless Commit() is called.\ntemplate<typename AtomicT>\nstruct AtomicTransactionalIncrement\n{\npublic:\n    using T = decltype(AtomicT().load());\n\n    ~AtomicTransactionalIncrement()\n    {\n        if(m_Atomic)\n            --(*m_Atomic);\n    }\n\n    void Commit() { m_Atomic = VMA_NULL; }\n    T Increment(AtomicT* atomic)\n    {\n        m_Atomic = atomic;\n        return m_Atomic->fetch_add(1);\n    }\n\nprivate:\n    AtomicT* m_Atomic = VMA_NULL;\n};\n#endif // _VMA_ATOMIC_TRANSACTIONAL_INCREMENT\n\n#ifndef _VMA_STL_ALLOCATOR\n// STL-compatible allocator.\ntemplate<typename T>\nstruct VmaStlAllocator\n{\n    const VkAllocationCallbacks* const m_pCallbacks;\n    typedef T value_type;\n\n    VmaStlAllocator(const VkAllocationCallbacks* pCallbacks) : m_pCallbacks(pCallbacks) {}\n    template<typename U>\n    VmaStlAllocator(const VmaStlAllocator<U>& src) : m_pCallbacks(src.m_pCallbacks) {}\n    VmaStlAllocator(const VmaStlAllocator&) = default;\n    VmaStlAllocator& operator=(const VmaStlAllocator&) = delete;\n\n    T* allocate(size_t n) { return VmaAllocateArray<T>(m_pCallbacks, n); }\n    void deallocate(T* p, size_t n) { VmaFree(m_pCallbacks, p); }\n\n    template<typename U>\n    bool operator==(const VmaStlAllocator<U>& rhs) const\n    {\n        return m_pCallbacks == rhs.m_pCallbacks;\n    }\n    template<typename U>\n    bool operator!=(const VmaStlAllocator<U>& rhs) const\n    {\n        return m_pCallbacks != rhs.m_pCallbacks;\n    }\n};\n#endif // _VMA_STL_ALLOCATOR\n\n#ifndef _VMA_VECTOR\n/* Class with interface compatible with subset of std::vector.\nT must be POD because constructors and destructors are not called and memcpy is\nused for these objects. */\ntemplate<typename T, typename AllocatorT>\nclass VmaVector\n{\npublic:\n    typedef T value_type;\n    typedef T* iterator;\n    typedef const T* const_iterator;\n\n    VmaVector(const AllocatorT& allocator);\n    VmaVector(size_t count, const AllocatorT& allocator);\n    // This version of the constructor is here for compatibility with pre-C++14 std::vector.\n    // value is unused.\n    VmaVector(size_t count, const T& value, const AllocatorT& allocator) : VmaVector(count, allocator) {}\n    VmaVector(const VmaVector<T, AllocatorT>& src);\n    VmaVector& operator=(const VmaVector& rhs);\n    ~VmaVector() { VmaFree(m_Allocator.m_pCallbacks, m_pArray); }\n\n    bool empty() const { return m_Count == 0; }\n    size_t size() const { return m_Count; }\n    T* data() { return m_pArray; }\n    T& front() { VMA_HEAVY_ASSERT(m_Count > 0); return m_pArray[0]; }\n    T& back() { VMA_HEAVY_ASSERT(m_Count > 0); return m_pArray[m_Count - 1]; }\n    const T* data() const { return m_pArray; }\n    const T& front() const { VMA_HEAVY_ASSERT(m_Count > 0); return m_pArray[0]; }\n    const T& back() const { VMA_HEAVY_ASSERT(m_Count > 0); return m_pArray[m_Count - 1]; }\n\n    iterator begin() { return m_pArray; }\n    iterator end() { return m_pArray + m_Count; }\n    const_iterator cbegin() const { return m_pArray; }\n    const_iterator cend() const { return m_pArray + m_Count; }\n    const_iterator begin() const { return cbegin(); }\n    const_iterator end() const { return cend(); }\n\n    void pop_front() { VMA_HEAVY_ASSERT(m_Count > 0); remove(0); }\n    void pop_back() { VMA_HEAVY_ASSERT(m_Count > 0); resize(size() - 1); }\n    void push_front(const T& src) { insert(0, src); }\n\n    void push_back(const T& src);\n    void reserve(size_t newCapacity, bool freeMemory = false);\n    void resize(size_t newCount);\n    void clear() { resize(0); }\n    void shrink_to_fit();\n    void insert(size_t index, const T& src);\n    void remove(size_t index);\n\n    T& operator[](size_t index) { VMA_HEAVY_ASSERT(index < m_Count); return m_pArray[index]; }\n    const T& operator[](size_t index) const { VMA_HEAVY_ASSERT(index < m_Count); return m_pArray[index]; }\n\nprivate:\n    AllocatorT m_Allocator;\n    T* m_pArray;\n    size_t m_Count;\n    size_t m_Capacity;\n};\n\n#ifndef _VMA_VECTOR_FUNCTIONS\ntemplate<typename T, typename AllocatorT>\nVmaVector<T, AllocatorT>::VmaVector(const AllocatorT& allocator)\n    : m_Allocator(allocator),\n    m_pArray(VMA_NULL),\n    m_Count(0),\n    m_Capacity(0) {}\n\ntemplate<typename T, typename AllocatorT>\nVmaVector<T, AllocatorT>::VmaVector(size_t count, const AllocatorT& allocator)\n    : m_Allocator(allocator),\n    m_pArray(count ? (T*)VmaAllocateArray<T>(allocator.m_pCallbacks, count) : VMA_NULL),\n    m_Count(count),\n    m_Capacity(count) {}\n\ntemplate<typename T, typename AllocatorT>\nVmaVector<T, AllocatorT>::VmaVector(const VmaVector& src)\n    : m_Allocator(src.m_Allocator),\n    m_pArray(src.m_Count ? (T*)VmaAllocateArray<T>(src.m_Allocator.m_pCallbacks, src.m_Count) : VMA_NULL),\n    m_Count(src.m_Count),\n    m_Capacity(src.m_Count)\n{\n    if (m_Count != 0)\n    {\n        memcpy(m_pArray, src.m_pArray, m_Count * sizeof(T));\n    }\n}\n\ntemplate<typename T, typename AllocatorT>\nVmaVector<T, AllocatorT>& VmaVector<T, AllocatorT>::operator=(const VmaVector& rhs)\n{\n    if (&rhs != this)\n    {\n        resize(rhs.m_Count);\n        if (m_Count != 0)\n        {\n            memcpy(m_pArray, rhs.m_pArray, m_Count * sizeof(T));\n        }\n    }\n    return *this;\n}\n\ntemplate<typename T, typename AllocatorT>\nvoid VmaVector<T, AllocatorT>::push_back(const T& src)\n{\n    const size_t newIndex = size();\n    resize(newIndex + 1);\n    m_pArray[newIndex] = src;\n}\n\ntemplate<typename T, typename AllocatorT>\nvoid VmaVector<T, AllocatorT>::reserve(size_t newCapacity, bool freeMemory)\n{\n    newCapacity = VMA_MAX(newCapacity, m_Count);\n\n    if ((newCapacity < m_Capacity) && !freeMemory)\n    {\n        newCapacity = m_Capacity;\n    }\n\n    if (newCapacity != m_Capacity)\n    {\n        T* const newArray = newCapacity ? VmaAllocateArray<T>(m_Allocator, newCapacity) : VMA_NULL;\n        if (m_Count != 0)\n        {\n            memcpy(newArray, m_pArray, m_Count * sizeof(T));\n        }\n        VmaFree(m_Allocator.m_pCallbacks, m_pArray);\n        m_Capacity = newCapacity;\n        m_pArray = newArray;\n    }\n}\n\ntemplate<typename T, typename AllocatorT>\nvoid VmaVector<T, AllocatorT>::resize(size_t newCount)\n{\n    size_t newCapacity = m_Capacity;\n    if (newCount > m_Capacity)\n    {\n        newCapacity = VMA_MAX(newCount, VMA_MAX(m_Capacity * 3 / 2, (size_t)8));\n    }\n\n    if (newCapacity != m_Capacity)\n    {\n        T* const newArray = newCapacity ? VmaAllocateArray<T>(m_Allocator.m_pCallbacks, newCapacity) : VMA_NULL;\n        const size_t elementsToCopy = VMA_MIN(m_Count, newCount);\n        if (elementsToCopy != 0)\n        {\n            memcpy(newArray, m_pArray, elementsToCopy * sizeof(T));\n        }\n        VmaFree(m_Allocator.m_pCallbacks, m_pArray);\n        m_Capacity = newCapacity;\n        m_pArray = newArray;\n    }\n\n    m_Count = newCount;\n}\n\ntemplate<typename T, typename AllocatorT>\nvoid VmaVector<T, AllocatorT>::shrink_to_fit()\n{\n    if (m_Capacity > m_Count)\n    {\n        T* newArray = VMA_NULL;\n        if (m_Count > 0)\n        {\n            newArray = VmaAllocateArray<T>(m_Allocator.m_pCallbacks, m_Count);\n            memcpy(newArray, m_pArray, m_Count * sizeof(T));\n        }\n        VmaFree(m_Allocator.m_pCallbacks, m_pArray);\n        m_Capacity = m_Count;\n        m_pArray = newArray;\n    }\n}\n\ntemplate<typename T, typename AllocatorT>\nvoid VmaVector<T, AllocatorT>::insert(size_t index, const T& src)\n{\n    VMA_HEAVY_ASSERT(index <= m_Count);\n    const size_t oldCount = size();\n    resize(oldCount + 1);\n    if (index < oldCount)\n    {\n        memmove(m_pArray + (index + 1), m_pArray + index, (oldCount - index) * sizeof(T));\n    }\n    m_pArray[index] = src;\n}\n\ntemplate<typename T, typename AllocatorT>\nvoid VmaVector<T, AllocatorT>::remove(size_t index)\n{\n    VMA_HEAVY_ASSERT(index < m_Count);\n    const size_t oldCount = size();\n    if (index < oldCount - 1)\n    {\n        memmove(m_pArray + index, m_pArray + (index + 1), (oldCount - index - 1) * sizeof(T));\n    }\n    resize(oldCount - 1);\n}\n#endif // _VMA_VECTOR_FUNCTIONS\n\ntemplate<typename T, typename allocatorT>\nstatic void VmaVectorInsert(VmaVector<T, allocatorT>& vec, size_t index, const T& item)\n{\n    vec.insert(index, item);\n}\n\ntemplate<typename T, typename allocatorT>\nstatic void VmaVectorRemove(VmaVector<T, allocatorT>& vec, size_t index)\n{\n    vec.remove(index);\n}\n#endif // _VMA_VECTOR\n\n#ifndef _VMA_SMALL_VECTOR\n/*\nThis is a vector (a variable-sized array), optimized for the case when the array is small.\n\nIt contains some number of elements in-place, which allows it to avoid heap allocation\nwhen the actual number of elements is below that threshold. This allows normal \"small\"\ncases to be fast without losing generality for large inputs.\n*/\ntemplate<typename T, typename AllocatorT, size_t N>\nclass VmaSmallVector\n{\npublic:\n    typedef T value_type;\n    typedef T* iterator;\n\n    VmaSmallVector(const AllocatorT& allocator);\n    VmaSmallVector(size_t count, const AllocatorT& allocator);\n    template<typename SrcT, typename SrcAllocatorT, size_t SrcN>\n    VmaSmallVector(const VmaSmallVector<SrcT, SrcAllocatorT, SrcN>&) = delete;\n    template<typename SrcT, typename SrcAllocatorT, size_t SrcN>\n    VmaSmallVector<T, AllocatorT, N>& operator=(const VmaSmallVector<SrcT, SrcAllocatorT, SrcN>&) = delete;\n    ~VmaSmallVector() = default;\n\n    bool empty() const { return m_Count == 0; }\n    size_t size() const { return m_Count; }\n    T* data() { return m_Count > N ? m_DynamicArray.data() : m_StaticArray; }\n    T& front() { VMA_HEAVY_ASSERT(m_Count > 0); return data()[0]; }\n    T& back() { VMA_HEAVY_ASSERT(m_Count > 0); return data()[m_Count - 1]; }\n    const T* data() const { return m_Count > N ? m_DynamicArray.data() : m_StaticArray; }\n    const T& front() const { VMA_HEAVY_ASSERT(m_Count > 0); return data()[0]; }\n    const T& back() const { VMA_HEAVY_ASSERT(m_Count > 0); return data()[m_Count - 1]; }\n\n    iterator begin() { return data(); }\n    iterator end() { return data() + m_Count; }\n\n    void pop_front() { VMA_HEAVY_ASSERT(m_Count > 0); remove(0); }\n    void pop_back() { VMA_HEAVY_ASSERT(m_Count > 0); resize(size() - 1); }\n    void push_front(const T& src) { insert(0, src); }\n\n    void push_back(const T& src);\n    void resize(size_t newCount, bool freeMemory = false);\n    void clear(bool freeMemory = false);\n    void insert(size_t index, const T& src);\n    void remove(size_t index);\n\n    T& operator[](size_t index) { VMA_HEAVY_ASSERT(index < m_Count); return data()[index]; }\n    const T& operator[](size_t index) const { VMA_HEAVY_ASSERT(index < m_Count); return data()[index]; }\n\nprivate:\n    size_t m_Count;\n    T m_StaticArray[N]; // Used when m_Size <= N\n    VmaVector<T, AllocatorT> m_DynamicArray; // Used when m_Size > N\n};\n\n#ifndef _VMA_SMALL_VECTOR_FUNCTIONS\ntemplate<typename T, typename AllocatorT, size_t N>\nVmaSmallVector<T, AllocatorT, N>::VmaSmallVector(const AllocatorT& allocator)\n    : m_Count(0),\n    m_DynamicArray(allocator) {}\n\ntemplate<typename T, typename AllocatorT, size_t N>\nVmaSmallVector<T, AllocatorT, N>::VmaSmallVector(size_t count, const AllocatorT& allocator)\n    : m_Count(count),\n    m_DynamicArray(count > N ? count : 0, allocator) {}\n\ntemplate<typename T, typename AllocatorT, size_t N>\nvoid VmaSmallVector<T, AllocatorT, N>::push_back(const T& src)\n{\n    const size_t newIndex = size();\n    resize(newIndex + 1);\n    data()[newIndex] = src;\n}\n\ntemplate<typename T, typename AllocatorT, size_t N>\nvoid VmaSmallVector<T, AllocatorT, N>::resize(size_t newCount, bool freeMemory)\n{\n    if (newCount > N && m_Count > N)\n    {\n        // Any direction, staying in m_DynamicArray\n        m_DynamicArray.resize(newCount);\n        if (freeMemory)\n        {\n            m_DynamicArray.shrink_to_fit();\n        }\n    }\n    else if (newCount > N && m_Count <= N)\n    {\n        // Growing, moving from m_StaticArray to m_DynamicArray\n        m_DynamicArray.resize(newCount);\n        if (m_Count > 0)\n        {\n            memcpy(m_DynamicArray.data(), m_StaticArray, m_Count * sizeof(T));\n        }\n    }\n    else if (newCount <= N && m_Count > N)\n    {\n        // Shrinking, moving from m_DynamicArray to m_StaticArray\n        if (newCount > 0)\n        {\n            memcpy(m_StaticArray, m_DynamicArray.data(), newCount * sizeof(T));\n        }\n        m_DynamicArray.resize(0);\n        if (freeMemory)\n        {\n            m_DynamicArray.shrink_to_fit();\n        }\n    }\n    else\n    {\n        // Any direction, staying in m_StaticArray - nothing to do here\n    }\n    m_Count = newCount;\n}\n\ntemplate<typename T, typename AllocatorT, size_t N>\nvoid VmaSmallVector<T, AllocatorT, N>::clear(bool freeMemory)\n{\n    m_DynamicArray.clear();\n    if (freeMemory)\n    {\n        m_DynamicArray.shrink_to_fit();\n    }\n    m_Count = 0;\n}\n\ntemplate<typename T, typename AllocatorT, size_t N>\nvoid VmaSmallVector<T, AllocatorT, N>::insert(size_t index, const T& src)\n{\n    VMA_HEAVY_ASSERT(index <= m_Count);\n    const size_t oldCount = size();\n    resize(oldCount + 1);\n    T* const dataPtr = data();\n    if (index < oldCount)\n    {\n        //  I know, this could be more optimal for case where memmove can be memcpy directly from m_StaticArray to m_DynamicArray.\n        memmove(dataPtr + (index + 1), dataPtr + index, (oldCount - index) * sizeof(T));\n    }\n    dataPtr[index] = src;\n}\n\ntemplate<typename T, typename AllocatorT, size_t N>\nvoid VmaSmallVector<T, AllocatorT, N>::remove(size_t index)\n{\n    VMA_HEAVY_ASSERT(index < m_Count);\n    const size_t oldCount = size();\n    if (index < oldCount - 1)\n    {\n        //  I know, this could be more optimal for case where memmove can be memcpy directly from m_DynamicArray to m_StaticArray.\n        T* const dataPtr = data();\n        memmove(dataPtr + index, dataPtr + (index + 1), (oldCount - index - 1) * sizeof(T));\n    }\n    resize(oldCount - 1);\n}\n#endif // _VMA_SMALL_VECTOR_FUNCTIONS\n#endif // _VMA_SMALL_VECTOR\n\n#ifndef _VMA_POOL_ALLOCATOR\n/*\nAllocator for objects of type T using a list of arrays (pools) to speed up\nallocation. Number of elements that can be allocated is not bounded because\nallocator can create multiple blocks.\n*/\ntemplate<typename T>\nclass VmaPoolAllocator\n{\n    VMA_CLASS_NO_COPY_NO_MOVE(VmaPoolAllocator)\npublic:\n    VmaPoolAllocator(const VkAllocationCallbacks* pAllocationCallbacks, uint32_t firstBlockCapacity);\n    ~VmaPoolAllocator();\n    template<typename... Types> T* Alloc(Types&&... args);\n    void Free(T* ptr);\n\nprivate:\n    union Item\n    {\n        uint32_t NextFreeIndex;\n        alignas(T) char Value[sizeof(T)];\n    };\n    struct ItemBlock\n    {\n        Item* pItems;\n        uint32_t Capacity;\n        uint32_t FirstFreeIndex;\n    };\n\n    const VkAllocationCallbacks* m_pAllocationCallbacks;\n    const uint32_t m_FirstBlockCapacity;\n    VmaVector<ItemBlock, VmaStlAllocator<ItemBlock>> m_ItemBlocks;\n\n    ItemBlock& CreateNewBlock();\n};\n\n#ifndef _VMA_POOL_ALLOCATOR_FUNCTIONS\ntemplate<typename T>\nVmaPoolAllocator<T>::VmaPoolAllocator(const VkAllocationCallbacks* pAllocationCallbacks, uint32_t firstBlockCapacity)\n    : m_pAllocationCallbacks(pAllocationCallbacks),\n    m_FirstBlockCapacity(firstBlockCapacity),\n    m_ItemBlocks(VmaStlAllocator<ItemBlock>(pAllocationCallbacks))\n{\n    VMA_ASSERT(m_FirstBlockCapacity > 1);\n}\n\ntemplate<typename T>\nVmaPoolAllocator<T>::~VmaPoolAllocator()\n{\n    for (size_t i = m_ItemBlocks.size(); i--;)\n        vma_delete_array(m_pAllocationCallbacks, m_ItemBlocks[i].pItems, m_ItemBlocks[i].Capacity);\n    m_ItemBlocks.clear();\n}\n\ntemplate<typename T>\ntemplate<typename... Types> T* VmaPoolAllocator<T>::Alloc(Types&&... args)\n{\n    for (size_t i = m_ItemBlocks.size(); i--; )\n    {\n        ItemBlock& block = m_ItemBlocks[i];\n        // This block has some free items: Use first one.\n        if (block.FirstFreeIndex != UINT32_MAX)\n        {\n            Item* const pItem = &block.pItems[block.FirstFreeIndex];\n            block.FirstFreeIndex = pItem->NextFreeIndex;\n            T* result = (T*)&pItem->Value;\n            new(result)T(std::forward<Types>(args)...); // Explicit constructor call.\n            return result;\n        }\n    }\n\n    // No block has free item: Create new one and use it.\n    ItemBlock& newBlock = CreateNewBlock();\n    Item* const pItem = &newBlock.pItems[0];\n    newBlock.FirstFreeIndex = pItem->NextFreeIndex;\n    T* result = (T*)&pItem->Value;\n    new(result) T(std::forward<Types>(args)...); // Explicit constructor call.\n    return result;\n}\n\ntemplate<typename T>\nvoid VmaPoolAllocator<T>::Free(T* ptr)\n{\n    // Search all memory blocks to find ptr.\n    for (size_t i = m_ItemBlocks.size(); i--; )\n    {\n        ItemBlock& block = m_ItemBlocks[i];\n\n        // Casting to union.\n        Item* pItemPtr;\n        memcpy(&pItemPtr, &ptr, sizeof(pItemPtr));\n\n        // Check if pItemPtr is in address range of this block.\n        if ((pItemPtr >= block.pItems) && (pItemPtr < block.pItems + block.Capacity))\n        {\n            ptr->~T(); // Explicit destructor call.\n            const uint32_t index = static_cast<uint32_t>(pItemPtr - block.pItems);\n            pItemPtr->NextFreeIndex = block.FirstFreeIndex;\n            block.FirstFreeIndex = index;\n            return;\n        }\n    }\n    VMA_ASSERT(0 && \"Pointer doesn't belong to this memory pool.\");\n}\n\ntemplate<typename T>\ntypename VmaPoolAllocator<T>::ItemBlock& VmaPoolAllocator<T>::CreateNewBlock()\n{\n    const uint32_t newBlockCapacity = m_ItemBlocks.empty() ?\n        m_FirstBlockCapacity : m_ItemBlocks.back().Capacity * 3 / 2;\n\n    const ItemBlock newBlock =\n    {\n        vma_new_array(m_pAllocationCallbacks, Item, newBlockCapacity),\n        newBlockCapacity,\n        0\n    };\n\n    m_ItemBlocks.push_back(newBlock);\n\n    // Setup singly-linked list of all free items in this block.\n    for (uint32_t i = 0; i < newBlockCapacity - 1; ++i)\n        newBlock.pItems[i].NextFreeIndex = i + 1;\n    newBlock.pItems[newBlockCapacity - 1].NextFreeIndex = UINT32_MAX;\n    return m_ItemBlocks.back();\n}\n#endif // _VMA_POOL_ALLOCATOR_FUNCTIONS\n#endif // _VMA_POOL_ALLOCATOR\n\n#ifndef _VMA_RAW_LIST\ntemplate<typename T>\nstruct VmaListItem\n{\n    VmaListItem* pPrev;\n    VmaListItem* pNext;\n    T Value;\n};\n\n// Doubly linked list.\ntemplate<typename T>\nclass VmaRawList\n{\n    VMA_CLASS_NO_COPY_NO_MOVE(VmaRawList)\npublic:\n    typedef VmaListItem<T> ItemType;\n\n    VmaRawList(const VkAllocationCallbacks* pAllocationCallbacks);\n    // Intentionally not calling Clear, because that would be unnecessary\n    // computations to return all items to m_ItemAllocator as free.\n    ~VmaRawList() = default;\n\n    size_t GetCount() const { return m_Count; }\n    bool IsEmpty() const { return m_Count == 0; }\n\n    ItemType* Front() { return m_pFront; }\n    ItemType* Back() { return m_pBack; }\n    const ItemType* Front() const { return m_pFront; }\n    const ItemType* Back() const { return m_pBack; }\n\n    ItemType* PushFront();\n    ItemType* PushBack();\n    ItemType* PushFront(const T& value);\n    ItemType* PushBack(const T& value);\n    void PopFront();\n    void PopBack();\n\n    // Item can be null - it means PushBack.\n    ItemType* InsertBefore(ItemType* pItem);\n    // Item can be null - it means PushFront.\n    ItemType* InsertAfter(ItemType* pItem);\n    ItemType* InsertBefore(ItemType* pItem, const T& value);\n    ItemType* InsertAfter(ItemType* pItem, const T& value);\n\n    void Clear();\n    void Remove(ItemType* pItem);\n\nprivate:\n    const VkAllocationCallbacks* const m_pAllocationCallbacks;\n    VmaPoolAllocator<ItemType> m_ItemAllocator;\n    ItemType* m_pFront;\n    ItemType* m_pBack;\n    size_t m_Count;\n};\n\n#ifndef _VMA_RAW_LIST_FUNCTIONS\ntemplate<typename T>\nVmaRawList<T>::VmaRawList(const VkAllocationCallbacks* pAllocationCallbacks)\n    : m_pAllocationCallbacks(pAllocationCallbacks),\n    m_ItemAllocator(pAllocationCallbacks, 128),\n    m_pFront(VMA_NULL),\n    m_pBack(VMA_NULL),\n    m_Count(0) {}\n\ntemplate<typename T>\nVmaListItem<T>* VmaRawList<T>::PushFront()\n{\n    ItemType* const pNewItem = m_ItemAllocator.Alloc();\n    pNewItem->pPrev = VMA_NULL;\n    if (IsEmpty())\n    {\n        pNewItem->pNext = VMA_NULL;\n        m_pFront = pNewItem;\n        m_pBack = pNewItem;\n        m_Count = 1;\n    }\n    else\n    {\n        pNewItem->pNext = m_pFront;\n        m_pFront->pPrev = pNewItem;\n        m_pFront = pNewItem;\n        ++m_Count;\n    }\n    return pNewItem;\n}\n\ntemplate<typename T>\nVmaListItem<T>* VmaRawList<T>::PushBack()\n{\n    ItemType* const pNewItem = m_ItemAllocator.Alloc();\n    pNewItem->pNext = VMA_NULL;\n    if(IsEmpty())\n    {\n        pNewItem->pPrev = VMA_NULL;\n        m_pFront = pNewItem;\n        m_pBack = pNewItem;\n        m_Count = 1;\n    }\n    else\n    {\n        pNewItem->pPrev = m_pBack;\n        m_pBack->pNext = pNewItem;\n        m_pBack = pNewItem;\n        ++m_Count;\n    }\n    return pNewItem;\n}\n\ntemplate<typename T>\nVmaListItem<T>* VmaRawList<T>::PushFront(const T& value)\n{\n    ItemType* const pNewItem = PushFront();\n    pNewItem->Value = value;\n    return pNewItem;\n}\n\ntemplate<typename T>\nVmaListItem<T>* VmaRawList<T>::PushBack(const T& value)\n{\n    ItemType* const pNewItem = PushBack();\n    pNewItem->Value = value;\n    return pNewItem;\n}\n\ntemplate<typename T>\nvoid VmaRawList<T>::PopFront()\n{\n    VMA_HEAVY_ASSERT(m_Count > 0);\n    ItemType* const pFrontItem = m_pFront;\n    ItemType* const pNextItem = pFrontItem->pNext;\n    if (pNextItem != VMA_NULL)\n    {\n        pNextItem->pPrev = VMA_NULL;\n    }\n    m_pFront = pNextItem;\n    m_ItemAllocator.Free(pFrontItem);\n    --m_Count;\n}\n\ntemplate<typename T>\nvoid VmaRawList<T>::PopBack()\n{\n    VMA_HEAVY_ASSERT(m_Count > 0);\n    ItemType* const pBackItem = m_pBack;\n    ItemType* const pPrevItem = pBackItem->pPrev;\n    if(pPrevItem != VMA_NULL)\n    {\n        pPrevItem->pNext = VMA_NULL;\n    }\n    m_pBack = pPrevItem;\n    m_ItemAllocator.Free(pBackItem);\n    --m_Count;\n}\n\ntemplate<typename T>\nvoid VmaRawList<T>::Clear()\n{\n    if (IsEmpty() == false)\n    {\n        ItemType* pItem = m_pBack;\n        while (pItem != VMA_NULL)\n        {\n            ItemType* const pPrevItem = pItem->pPrev;\n            m_ItemAllocator.Free(pItem);\n            pItem = pPrevItem;\n        }\n        m_pFront = VMA_NULL;\n        m_pBack = VMA_NULL;\n        m_Count = 0;\n    }\n}\n\ntemplate<typename T>\nvoid VmaRawList<T>::Remove(ItemType* pItem)\n{\n    VMA_HEAVY_ASSERT(pItem != VMA_NULL);\n    VMA_HEAVY_ASSERT(m_Count > 0);\n\n    if(pItem->pPrev != VMA_NULL)\n    {\n        pItem->pPrev->pNext = pItem->pNext;\n    }\n    else\n    {\n        VMA_HEAVY_ASSERT(m_pFront == pItem);\n        m_pFront = pItem->pNext;\n    }\n\n    if(pItem->pNext != VMA_NULL)\n    {\n        pItem->pNext->pPrev = pItem->pPrev;\n    }\n    else\n    {\n        VMA_HEAVY_ASSERT(m_pBack == pItem);\n        m_pBack = pItem->pPrev;\n    }\n\n    m_ItemAllocator.Free(pItem);\n    --m_Count;\n}\n\ntemplate<typename T>\nVmaListItem<T>* VmaRawList<T>::InsertBefore(ItemType* pItem)\n{\n    if(pItem != VMA_NULL)\n    {\n        ItemType* const prevItem = pItem->pPrev;\n        ItemType* const newItem = m_ItemAllocator.Alloc();\n        newItem->pPrev = prevItem;\n        newItem->pNext = pItem;\n        pItem->pPrev = newItem;\n        if(prevItem != VMA_NULL)\n        {\n            prevItem->pNext = newItem;\n        }\n        else\n        {\n            VMA_HEAVY_ASSERT(m_pFront == pItem);\n            m_pFront = newItem;\n        }\n        ++m_Count;\n        return newItem;\n    }\n    else\n        return PushBack();\n}\n\ntemplate<typename T>\nVmaListItem<T>* VmaRawList<T>::InsertAfter(ItemType* pItem)\n{\n    if(pItem != VMA_NULL)\n    {\n        ItemType* const nextItem = pItem->pNext;\n        ItemType* const newItem = m_ItemAllocator.Alloc();\n        newItem->pNext = nextItem;\n        newItem->pPrev = pItem;\n        pItem->pNext = newItem;\n        if(nextItem != VMA_NULL)\n        {\n            nextItem->pPrev = newItem;\n        }\n        else\n        {\n            VMA_HEAVY_ASSERT(m_pBack == pItem);\n            m_pBack = newItem;\n        }\n        ++m_Count;\n        return newItem;\n    }\n    else\n        return PushFront();\n}\n\ntemplate<typename T>\nVmaListItem<T>* VmaRawList<T>::InsertBefore(ItemType* pItem, const T& value)\n{\n    ItemType* const newItem = InsertBefore(pItem);\n    newItem->Value = value;\n    return newItem;\n}\n\ntemplate<typename T>\nVmaListItem<T>* VmaRawList<T>::InsertAfter(ItemType* pItem, const T& value)\n{\n    ItemType* const newItem = InsertAfter(pItem);\n    newItem->Value = value;\n    return newItem;\n}\n#endif // _VMA_RAW_LIST_FUNCTIONS\n#endif // _VMA_RAW_LIST\n\n#ifndef _VMA_LIST\ntemplate<typename T, typename AllocatorT>\nclass VmaList\n{\n    VMA_CLASS_NO_COPY_NO_MOVE(VmaList)\npublic:\n    class reverse_iterator;\n    class const_iterator;\n    class const_reverse_iterator;\n\n    class iterator\n    {\n        friend class const_iterator;\n        friend class VmaList<T, AllocatorT>;\n    public:\n        iterator() :  m_pList(VMA_NULL), m_pItem(VMA_NULL) {}\n        iterator(const reverse_iterator& src) : m_pList(src.m_pList), m_pItem(src.m_pItem) {}\n\n        T& operator*() const { VMA_HEAVY_ASSERT(m_pItem != VMA_NULL); return m_pItem->Value; }\n        T* operator->() const { VMA_HEAVY_ASSERT(m_pItem != VMA_NULL); return &m_pItem->Value; }\n\n        bool operator==(const iterator& rhs) const { VMA_HEAVY_ASSERT(m_pList == rhs.m_pList); return m_pItem == rhs.m_pItem; }\n        bool operator!=(const iterator& rhs) const { VMA_HEAVY_ASSERT(m_pList == rhs.m_pList); return m_pItem != rhs.m_pItem; }\n\n        iterator operator++(int) { iterator result = *this; ++*this; return result; }\n        iterator operator--(int) { iterator result = *this; --*this; return result; }\n\n        iterator& operator++() { VMA_HEAVY_ASSERT(m_pItem != VMA_NULL); m_pItem = m_pItem->pNext; return *this; }\n        iterator& operator--();\n\n    private:\n        VmaRawList<T>* m_pList;\n        VmaListItem<T>* m_pItem;\n\n        iterator(VmaRawList<T>* pList, VmaListItem<T>* pItem) : m_pList(pList),  m_pItem(pItem) {}\n    };\n    class reverse_iterator\n    {\n        friend class const_reverse_iterator;\n        friend class VmaList<T, AllocatorT>;\n    public:\n        reverse_iterator() : m_pList(VMA_NULL), m_pItem(VMA_NULL) {}\n        reverse_iterator(const iterator& src) : m_pList(src.m_pList), m_pItem(src.m_pItem) {}\n\n        T& operator*() const { VMA_HEAVY_ASSERT(m_pItem != VMA_NULL); return m_pItem->Value; }\n        T* operator->() const { VMA_HEAVY_ASSERT(m_pItem != VMA_NULL); return &m_pItem->Value; }\n\n        bool operator==(const reverse_iterator& rhs) const { VMA_HEAVY_ASSERT(m_pList == rhs.m_pList); return m_pItem == rhs.m_pItem; }\n        bool operator!=(const reverse_iterator& rhs) const { VMA_HEAVY_ASSERT(m_pList == rhs.m_pList); return m_pItem != rhs.m_pItem; }\n\n        reverse_iterator operator++(int) { reverse_iterator result = *this; ++* this; return result; }\n        reverse_iterator operator--(int) { reverse_iterator result = *this; --* this; return result; }\n\n        reverse_iterator& operator++() { VMA_HEAVY_ASSERT(m_pItem != VMA_NULL); m_pItem = m_pItem->pPrev; return *this; }\n        reverse_iterator& operator--();\n\n    private:\n        VmaRawList<T>* m_pList;\n        VmaListItem<T>* m_pItem;\n\n        reverse_iterator(VmaRawList<T>* pList, VmaListItem<T>* pItem) : m_pList(pList),  m_pItem(pItem) {}\n    };\n    class const_iterator\n    {\n        friend class VmaList<T, AllocatorT>;\n    public:\n        const_iterator() : m_pList(VMA_NULL), m_pItem(VMA_NULL) {}\n        const_iterator(const iterator& src) : m_pList(src.m_pList), m_pItem(src.m_pItem) {}\n        const_iterator(const reverse_iterator& src) : m_pList(src.m_pList), m_pItem(src.m_pItem) {}\n\n        iterator drop_const() { return { const_cast<VmaRawList<T>*>(m_pList), const_cast<VmaListItem<T>*>(m_pItem) }; }\n\n        const T& operator*() const { VMA_HEAVY_ASSERT(m_pItem != VMA_NULL); return m_pItem->Value; }\n        const T* operator->() const { VMA_HEAVY_ASSERT(m_pItem != VMA_NULL); return &m_pItem->Value; }\n\n        bool operator==(const const_iterator& rhs) const { VMA_HEAVY_ASSERT(m_pList == rhs.m_pList); return m_pItem == rhs.m_pItem; }\n        bool operator!=(const const_iterator& rhs) const { VMA_HEAVY_ASSERT(m_pList == rhs.m_pList); return m_pItem != rhs.m_pItem; }\n\n        const_iterator operator++(int) { const_iterator result = *this; ++* this; return result; }\n        const_iterator operator--(int) { const_iterator result = *this; --* this; return result; }\n\n        const_iterator& operator++() { VMA_HEAVY_ASSERT(m_pItem != VMA_NULL); m_pItem = m_pItem->pNext; return *this; }\n        const_iterator& operator--();\n\n    private:\n        const VmaRawList<T>* m_pList;\n        const VmaListItem<T>* m_pItem;\n\n        const_iterator(const VmaRawList<T>* pList, const VmaListItem<T>* pItem) : m_pList(pList), m_pItem(pItem) {}\n    };\n    class const_reverse_iterator\n    {\n        friend class VmaList<T, AllocatorT>;\n    public:\n        const_reverse_iterator() : m_pList(VMA_NULL), m_pItem(VMA_NULL) {}\n        const_reverse_iterator(const reverse_iterator& src) : m_pList(src.m_pList), m_pItem(src.m_pItem) {}\n        const_reverse_iterator(const iterator& src) : m_pList(src.m_pList), m_pItem(src.m_pItem) {}\n\n        reverse_iterator drop_const() { return { const_cast<VmaRawList<T>*>(m_pList), const_cast<VmaListItem<T>*>(m_pItem) }; }\n\n        const T& operator*() const { VMA_HEAVY_ASSERT(m_pItem != VMA_NULL); return m_pItem->Value; }\n        const T* operator->() const { VMA_HEAVY_ASSERT(m_pItem != VMA_NULL); return &m_pItem->Value; }\n\n        bool operator==(const const_reverse_iterator& rhs) const { VMA_HEAVY_ASSERT(m_pList == rhs.m_pList); return m_pItem == rhs.m_pItem; }\n        bool operator!=(const const_reverse_iterator& rhs) const { VMA_HEAVY_ASSERT(m_pList == rhs.m_pList); return m_pItem != rhs.m_pItem; }\n\n        const_reverse_iterator operator++(int) { const_reverse_iterator result = *this; ++* this; return result; }\n        const_reverse_iterator operator--(int) { const_reverse_iterator result = *this; --* this; return result; }\n\n        const_reverse_iterator& operator++() { VMA_HEAVY_ASSERT(m_pItem != VMA_NULL); m_pItem = m_pItem->pPrev; return *this; }\n        const_reverse_iterator& operator--();\n\n    private:\n        const VmaRawList<T>* m_pList;\n        const VmaListItem<T>* m_pItem;\n\n        const_reverse_iterator(const VmaRawList<T>* pList, const VmaListItem<T>* pItem) : m_pList(pList), m_pItem(pItem) {}\n    };\n\n    VmaList(const AllocatorT& allocator) : m_RawList(allocator.m_pCallbacks) {}\n\n    bool empty() const { return m_RawList.IsEmpty(); }\n    size_t size() const { return m_RawList.GetCount(); }\n\n    iterator begin() { return iterator(&m_RawList, m_RawList.Front()); }\n    iterator end() { return iterator(&m_RawList, VMA_NULL); }\n\n    const_iterator cbegin() const { return const_iterator(&m_RawList, m_RawList.Front()); }\n    const_iterator cend() const { return const_iterator(&m_RawList, VMA_NULL); }\n\n    const_iterator begin() const { return cbegin(); }\n    const_iterator end() const { return cend(); }\n\n    reverse_iterator rbegin() { return reverse_iterator(&m_RawList, m_RawList.Back()); }\n    reverse_iterator rend() { return reverse_iterator(&m_RawList, VMA_NULL); }\n\n    const_reverse_iterator crbegin() const { return const_reverse_iterator(&m_RawList, m_RawList.Back()); }\n    const_reverse_iterator crend() const { return const_reverse_iterator(&m_RawList, VMA_NULL); }\n\n    const_reverse_iterator rbegin() const { return crbegin(); }\n    const_reverse_iterator rend() const { return crend(); }\n\n    void push_back(const T& value) { m_RawList.PushBack(value); }\n    iterator insert(iterator it, const T& value) { return iterator(&m_RawList, m_RawList.InsertBefore(it.m_pItem, value)); }\n\n    void clear() { m_RawList.Clear(); }\n    void erase(iterator it) { m_RawList.Remove(it.m_pItem); }\n\nprivate:\n    VmaRawList<T> m_RawList;\n};\n\n#ifndef _VMA_LIST_FUNCTIONS\ntemplate<typename T, typename AllocatorT>\ntypename VmaList<T, AllocatorT>::iterator& VmaList<T, AllocatorT>::iterator::operator--()\n{\n    if (m_pItem != VMA_NULL)\n    {\n        m_pItem = m_pItem->pPrev;\n    }\n    else\n    {\n        VMA_HEAVY_ASSERT(!m_pList->IsEmpty());\n        m_pItem = m_pList->Back();\n    }\n    return *this;\n}\n\ntemplate<typename T, typename AllocatorT>\ntypename VmaList<T, AllocatorT>::reverse_iterator& VmaList<T, AllocatorT>::reverse_iterator::operator--()\n{\n    if (m_pItem != VMA_NULL)\n    {\n        m_pItem = m_pItem->pNext;\n    }\n    else\n    {\n        VMA_HEAVY_ASSERT(!m_pList->IsEmpty());\n        m_pItem = m_pList->Front();\n    }\n    return *this;\n}\n\ntemplate<typename T, typename AllocatorT>\ntypename VmaList<T, AllocatorT>::const_iterator& VmaList<T, AllocatorT>::const_iterator::operator--()\n{\n    if (m_pItem != VMA_NULL)\n    {\n        m_pItem = m_pItem->pPrev;\n    }\n    else\n    {\n        VMA_HEAVY_ASSERT(!m_pList->IsEmpty());\n        m_pItem = m_pList->Back();\n    }\n    return *this;\n}\n\ntemplate<typename T, typename AllocatorT>\ntypename VmaList<T, AllocatorT>::const_reverse_iterator& VmaList<T, AllocatorT>::const_reverse_iterator::operator--()\n{\n    if (m_pItem != VMA_NULL)\n    {\n        m_pItem = m_pItem->pNext;\n    }\n    else\n    {\n        VMA_HEAVY_ASSERT(!m_pList->IsEmpty());\n        m_pItem = m_pList->Back();\n    }\n    return *this;\n}\n#endif // _VMA_LIST_FUNCTIONS\n#endif // _VMA_LIST\n\n#ifndef _VMA_INTRUSIVE_LINKED_LIST\n/*\nExpected interface of ItemTypeTraits:\nstruct MyItemTypeTraits\n{\n    typedef MyItem ItemType;\n    static ItemType* GetPrev(const ItemType* item) { return item->myPrevPtr; }\n    static ItemType* GetNext(const ItemType* item) { return item->myNextPtr; }\n    static ItemType*& AccessPrev(ItemType* item) { return item->myPrevPtr; }\n    static ItemType*& AccessNext(ItemType* item) { return item->myNextPtr; }\n};\n*/\ntemplate<typename ItemTypeTraits>\nclass VmaIntrusiveLinkedList\n{\npublic:\n    typedef typename ItemTypeTraits::ItemType ItemType;\n    static ItemType* GetPrev(const ItemType* item) { return ItemTypeTraits::GetPrev(item); }\n    static ItemType* GetNext(const ItemType* item) { return ItemTypeTraits::GetNext(item); }\n\n    // Movable, not copyable.\n    VmaIntrusiveLinkedList() = default;\n    VmaIntrusiveLinkedList(VmaIntrusiveLinkedList && src);\n    VmaIntrusiveLinkedList(const VmaIntrusiveLinkedList&) = delete;\n    VmaIntrusiveLinkedList& operator=(VmaIntrusiveLinkedList&& src);\n    VmaIntrusiveLinkedList& operator=(const VmaIntrusiveLinkedList&) = delete;\n    ~VmaIntrusiveLinkedList() { VMA_HEAVY_ASSERT(IsEmpty()); }\n\n    size_t GetCount() const { return m_Count; }\n    bool IsEmpty() const { return m_Count == 0; }\n    ItemType* Front() { return m_Front; }\n    ItemType* Back() { return m_Back; }\n    const ItemType* Front() const { return m_Front; }\n    const ItemType* Back() const { return m_Back; }\n\n    void PushBack(ItemType* item);\n    void PushFront(ItemType* item);\n    ItemType* PopBack();\n    ItemType* PopFront();\n\n    // MyItem can be null - it means PushBack.\n    void InsertBefore(ItemType* existingItem, ItemType* newItem);\n    // MyItem can be null - it means PushFront.\n    void InsertAfter(ItemType* existingItem, ItemType* newItem);\n    void Remove(ItemType* item);\n    void RemoveAll();\n\nprivate:\n    ItemType* m_Front = VMA_NULL;\n    ItemType* m_Back = VMA_NULL;\n    size_t m_Count = 0;\n};\n\n#ifndef _VMA_INTRUSIVE_LINKED_LIST_FUNCTIONS\ntemplate<typename ItemTypeTraits>\nVmaIntrusiveLinkedList<ItemTypeTraits>::VmaIntrusiveLinkedList(VmaIntrusiveLinkedList&& src)\n    : m_Front(src.m_Front), m_Back(src.m_Back), m_Count(src.m_Count)\n{\n    src.m_Front = src.m_Back = VMA_NULL;\n    src.m_Count = 0;\n}\n\ntemplate<typename ItemTypeTraits>\nVmaIntrusiveLinkedList<ItemTypeTraits>& VmaIntrusiveLinkedList<ItemTypeTraits>::operator=(VmaIntrusiveLinkedList&& src)\n{\n    if (&src != this)\n    {\n        VMA_HEAVY_ASSERT(IsEmpty());\n        m_Front = src.m_Front;\n        m_Back = src.m_Back;\n        m_Count = src.m_Count;\n        src.m_Front = src.m_Back = VMA_NULL;\n        src.m_Count = 0;\n    }\n    return *this;\n}\n\ntemplate<typename ItemTypeTraits>\nvoid VmaIntrusiveLinkedList<ItemTypeTraits>::PushBack(ItemType* item)\n{\n    VMA_HEAVY_ASSERT(ItemTypeTraits::GetPrev(item) == VMA_NULL && ItemTypeTraits::GetNext(item) == VMA_NULL);\n    if (IsEmpty())\n    {\n        m_Front = item;\n        m_Back = item;\n        m_Count = 1;\n    }\n    else\n    {\n        ItemTypeTraits::AccessPrev(item) = m_Back;\n        ItemTypeTraits::AccessNext(m_Back) = item;\n        m_Back = item;\n        ++m_Count;\n    }\n}\n\ntemplate<typename ItemTypeTraits>\nvoid VmaIntrusiveLinkedList<ItemTypeTraits>::PushFront(ItemType* item)\n{\n    VMA_HEAVY_ASSERT(ItemTypeTraits::GetPrev(item) == VMA_NULL && ItemTypeTraits::GetNext(item) == VMA_NULL);\n    if (IsEmpty())\n    {\n        m_Front = item;\n        m_Back = item;\n        m_Count = 1;\n    }\n    else\n    {\n        ItemTypeTraits::AccessNext(item) = m_Front;\n        ItemTypeTraits::AccessPrev(m_Front) = item;\n        m_Front = item;\n        ++m_Count;\n    }\n}\n\ntemplate<typename ItemTypeTraits>\ntypename VmaIntrusiveLinkedList<ItemTypeTraits>::ItemType* VmaIntrusiveLinkedList<ItemTypeTraits>::PopBack()\n{\n    VMA_HEAVY_ASSERT(m_Count > 0);\n    ItemType* const backItem = m_Back;\n    ItemType* const prevItem = ItemTypeTraits::GetPrev(backItem);\n    if (prevItem != VMA_NULL)\n    {\n        ItemTypeTraits::AccessNext(prevItem) = VMA_NULL;\n    }\n    m_Back = prevItem;\n    --m_Count;\n    ItemTypeTraits::AccessPrev(backItem) = VMA_NULL;\n    ItemTypeTraits::AccessNext(backItem) = VMA_NULL;\n    return backItem;\n}\n\ntemplate<typename ItemTypeTraits>\ntypename VmaIntrusiveLinkedList<ItemTypeTraits>::ItemType* VmaIntrusiveLinkedList<ItemTypeTraits>::PopFront()\n{\n    VMA_HEAVY_ASSERT(m_Count > 0);\n    ItemType* const frontItem = m_Front;\n    ItemType* const nextItem = ItemTypeTraits::GetNext(frontItem);\n    if (nextItem != VMA_NULL)\n    {\n        ItemTypeTraits::AccessPrev(nextItem) = VMA_NULL;\n    }\n    m_Front = nextItem;\n    --m_Count;\n    ItemTypeTraits::AccessPrev(frontItem) = VMA_NULL;\n    ItemTypeTraits::AccessNext(frontItem) = VMA_NULL;\n    return frontItem;\n}\n\ntemplate<typename ItemTypeTraits>\nvoid VmaIntrusiveLinkedList<ItemTypeTraits>::InsertBefore(ItemType* existingItem, ItemType* newItem)\n{\n    VMA_HEAVY_ASSERT(newItem != VMA_NULL && ItemTypeTraits::GetPrev(newItem) == VMA_NULL && ItemTypeTraits::GetNext(newItem) == VMA_NULL);\n    if (existingItem != VMA_NULL)\n    {\n        ItemType* const prevItem = ItemTypeTraits::GetPrev(existingItem);\n        ItemTypeTraits::AccessPrev(newItem) = prevItem;\n        ItemTypeTraits::AccessNext(newItem) = existingItem;\n        ItemTypeTraits::AccessPrev(existingItem) = newItem;\n        if (prevItem != VMA_NULL)\n        {\n            ItemTypeTraits::AccessNext(prevItem) = newItem;\n        }\n        else\n        {\n            VMA_HEAVY_ASSERT(m_Front == existingItem);\n            m_Front = newItem;\n        }\n        ++m_Count;\n    }\n    else\n        PushBack(newItem);\n}\n\ntemplate<typename ItemTypeTraits>\nvoid VmaIntrusiveLinkedList<ItemTypeTraits>::InsertAfter(ItemType* existingItem, ItemType* newItem)\n{\n    VMA_HEAVY_ASSERT(newItem != VMA_NULL && ItemTypeTraits::GetPrev(newItem) == VMA_NULL && ItemTypeTraits::GetNext(newItem) == VMA_NULL);\n    if (existingItem != VMA_NULL)\n    {\n        ItemType* const nextItem = ItemTypeTraits::GetNext(existingItem);\n        ItemTypeTraits::AccessNext(newItem) = nextItem;\n        ItemTypeTraits::AccessPrev(newItem) = existingItem;\n        ItemTypeTraits::AccessNext(existingItem) = newItem;\n        if (nextItem != VMA_NULL)\n        {\n            ItemTypeTraits::AccessPrev(nextItem) = newItem;\n        }\n        else\n        {\n            VMA_HEAVY_ASSERT(m_Back == existingItem);\n            m_Back = newItem;\n        }\n        ++m_Count;\n    }\n    else\n        return PushFront(newItem);\n}\n\ntemplate<typename ItemTypeTraits>\nvoid VmaIntrusiveLinkedList<ItemTypeTraits>::Remove(ItemType* item)\n{\n    VMA_HEAVY_ASSERT(item != VMA_NULL && m_Count > 0);\n    if (ItemTypeTraits::GetPrev(item) != VMA_NULL)\n    {\n        ItemTypeTraits::AccessNext(ItemTypeTraits::AccessPrev(item)) = ItemTypeTraits::GetNext(item);\n    }\n    else\n    {\n        VMA_HEAVY_ASSERT(m_Front == item);\n        m_Front = ItemTypeTraits::GetNext(item);\n    }\n\n    if (ItemTypeTraits::GetNext(item) != VMA_NULL)\n    {\n        ItemTypeTraits::AccessPrev(ItemTypeTraits::AccessNext(item)) = ItemTypeTraits::GetPrev(item);\n    }\n    else\n    {\n        VMA_HEAVY_ASSERT(m_Back == item);\n        m_Back = ItemTypeTraits::GetPrev(item);\n    }\n    ItemTypeTraits::AccessPrev(item) = VMA_NULL;\n    ItemTypeTraits::AccessNext(item) = VMA_NULL;\n    --m_Count;\n}\n\ntemplate<typename ItemTypeTraits>\nvoid VmaIntrusiveLinkedList<ItemTypeTraits>::RemoveAll()\n{\n    if (!IsEmpty())\n    {\n        ItemType* item = m_Back;\n        while (item != VMA_NULL)\n        {\n            ItemType* const prevItem = ItemTypeTraits::AccessPrev(item);\n            ItemTypeTraits::AccessPrev(item) = VMA_NULL;\n            ItemTypeTraits::AccessNext(item) = VMA_NULL;\n            item = prevItem;\n        }\n        m_Front = VMA_NULL;\n        m_Back = VMA_NULL;\n        m_Count = 0;\n    }\n}\n#endif // _VMA_INTRUSIVE_LINKED_LIST_FUNCTIONS\n#endif // _VMA_INTRUSIVE_LINKED_LIST\n\n#if !defined(_VMA_STRING_BUILDER) && VMA_STATS_STRING_ENABLED\nclass VmaStringBuilder\n{\npublic:\n    VmaStringBuilder(const VkAllocationCallbacks* allocationCallbacks) : m_Data(VmaStlAllocator<char>(allocationCallbacks)) {}\n    ~VmaStringBuilder() = default;\n\n    size_t GetLength() const { return m_Data.size(); }\n    const char* GetData() const { return m_Data.data(); }\n    void AddNewLine() { Add('\\n'); }\n    void Add(char ch) { m_Data.push_back(ch); }\n\n    void Add(const char* pStr);\n    void AddNumber(uint32_t num);\n    void AddNumber(uint64_t num);\n    void AddPointer(const void* ptr);\n\nprivate:\n    VmaVector<char, VmaStlAllocator<char>> m_Data;\n};\n\n#ifndef _VMA_STRING_BUILDER_FUNCTIONS\nvoid VmaStringBuilder::Add(const char* pStr)\n{\n    const size_t strLen = strlen(pStr);\n    if (strLen > 0)\n    {\n        const size_t oldCount = m_Data.size();\n        m_Data.resize(oldCount + strLen);\n        memcpy(m_Data.data() + oldCount, pStr, strLen);\n    }\n}\n\nvoid VmaStringBuilder::AddNumber(uint32_t num)\n{\n    char buf[11];\n    buf[10] = '\\0';\n    char* p = &buf[10];\n    do\n    {\n        *--p = '0' + (char)(num % 10);\n        num /= 10;\n    } while (num);\n    Add(p);\n}\n\nvoid VmaStringBuilder::AddNumber(uint64_t num)\n{\n    char buf[21];\n    buf[20] = '\\0';\n    char* p = &buf[20];\n    do\n    {\n        *--p = '0' + (char)(num % 10);\n        num /= 10;\n    } while (num);\n    Add(p);\n}\n\nvoid VmaStringBuilder::AddPointer(const void* ptr)\n{\n    char buf[21];\n    VmaPtrToStr(buf, sizeof(buf), ptr);\n    Add(buf);\n}\n#endif //_VMA_STRING_BUILDER_FUNCTIONS\n#endif // _VMA_STRING_BUILDER\n\n#if !defined(_VMA_JSON_WRITER) && VMA_STATS_STRING_ENABLED\n/*\nAllows to conveniently build a correct JSON document to be written to the\nVmaStringBuilder passed to the constructor.\n*/\nclass VmaJsonWriter\n{\n    VMA_CLASS_NO_COPY_NO_MOVE(VmaJsonWriter)\npublic:\n    // sb - string builder to write the document to. Must remain alive for the whole lifetime of this object.\n    VmaJsonWriter(const VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder& sb);\n    ~VmaJsonWriter();\n\n    // Begins object by writing \"{\".\n    // Inside an object, you must call pairs of WriteString and a value, e.g.:\n    // j.BeginObject(true); j.WriteString(\"A\"); j.WriteNumber(1); j.WriteString(\"B\"); j.WriteNumber(2); j.EndObject();\n    // Will write: { \"A\": 1, \"B\": 2 }\n    void BeginObject(bool singleLine = false);\n    // Ends object by writing \"}\".\n    void EndObject();\n\n    // Begins array by writing \"[\".\n    // Inside an array, you can write a sequence of any values.\n    void BeginArray(bool singleLine = false);\n    // Ends array by writing \"[\".\n    void EndArray();\n\n    // Writes a string value inside \"\".\n    // pStr can contain any ANSI characters, including '\"', new line etc. - they will be properly escaped.\n    void WriteString(const char* pStr);\n\n    // Begins writing a string value.\n    // Call BeginString, ContinueString, ContinueString, ..., EndString instead of\n    // WriteString to conveniently build the string content incrementally, made of\n    // parts including numbers.\n    void BeginString(const char* pStr = VMA_NULL);\n    // Posts next part of an open string.\n    void ContinueString(const char* pStr);\n    // Posts next part of an open string. The number is converted to decimal characters.\n    void ContinueString(uint32_t n);\n    void ContinueString(uint64_t n);\n    // Posts next part of an open string. Pointer value is converted to characters\n    // using \"%p\" formatting - shown as hexadecimal number, e.g.: 000000081276Ad00\n    void ContinueString_Pointer(const void* ptr);\n    // Ends writing a string value by writing '\"'.\n    void EndString(const char* pStr = VMA_NULL);\n\n    // Writes a number value.\n    void WriteNumber(uint32_t n);\n    void WriteNumber(uint64_t n);\n    // Writes a boolean value - false or true.\n    void WriteBool(bool b);\n    // Writes a null value.\n    void WriteNull();\n\nprivate:\n    enum COLLECTION_TYPE\n    {\n        COLLECTION_TYPE_OBJECT,\n        COLLECTION_TYPE_ARRAY,\n    };\n    struct StackItem\n    {\n        COLLECTION_TYPE type;\n        uint32_t valueCount;\n        bool singleLineMode;\n    };\n\n    static const char* const INDENT;\n\n    VmaStringBuilder& m_SB;\n    VmaVector< StackItem, VmaStlAllocator<StackItem> > m_Stack;\n    bool m_InsideString;\n\n    void BeginValue(bool isString);\n    void WriteIndent(bool oneLess = false);\n};\nconst char* const VmaJsonWriter::INDENT = \"  \";\n\n#ifndef _VMA_JSON_WRITER_FUNCTIONS\nVmaJsonWriter::VmaJsonWriter(const VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder& sb)\n    : m_SB(sb),\n    m_Stack(VmaStlAllocator<StackItem>(pAllocationCallbacks)),\n    m_InsideString(false) {}\n\nVmaJsonWriter::~VmaJsonWriter()\n{\n    VMA_ASSERT(!m_InsideString);\n    VMA_ASSERT(m_Stack.empty());\n}\n\nvoid VmaJsonWriter::BeginObject(bool singleLine)\n{\n    VMA_ASSERT(!m_InsideString);\n\n    BeginValue(false);\n    m_SB.Add('{');\n\n    StackItem item;\n    item.type = COLLECTION_TYPE_OBJECT;\n    item.valueCount = 0;\n    item.singleLineMode = singleLine;\n    m_Stack.push_back(item);\n}\n\nvoid VmaJsonWriter::EndObject()\n{\n    VMA_ASSERT(!m_InsideString);\n\n    WriteIndent(true);\n    m_SB.Add('}');\n\n    VMA_ASSERT(!m_Stack.empty() && m_Stack.back().type == COLLECTION_TYPE_OBJECT);\n    m_Stack.pop_back();\n}\n\nvoid VmaJsonWriter::BeginArray(bool singleLine)\n{\n    VMA_ASSERT(!m_InsideString);\n\n    BeginValue(false);\n    m_SB.Add('[');\n\n    StackItem item;\n    item.type = COLLECTION_TYPE_ARRAY;\n    item.valueCount = 0;\n    item.singleLineMode = singleLine;\n    m_Stack.push_back(item);\n}\n\nvoid VmaJsonWriter::EndArray()\n{\n    VMA_ASSERT(!m_InsideString);\n\n    WriteIndent(true);\n    m_SB.Add(']');\n\n    VMA_ASSERT(!m_Stack.empty() && m_Stack.back().type == COLLECTION_TYPE_ARRAY);\n    m_Stack.pop_back();\n}\n\nvoid VmaJsonWriter::WriteString(const char* pStr)\n{\n    BeginString(pStr);\n    EndString();\n}\n\nvoid VmaJsonWriter::BeginString(const char* pStr)\n{\n    VMA_ASSERT(!m_InsideString);\n\n    BeginValue(true);\n    m_SB.Add('\"');\n    m_InsideString = true;\n    if (pStr != VMA_NULL && pStr[0] != '\\0')\n    {\n        ContinueString(pStr);\n    }\n}\n\nvoid VmaJsonWriter::ContinueString(const char* pStr)\n{\n    VMA_ASSERT(m_InsideString);\n\n    const size_t strLen = strlen(pStr);\n    for (size_t i = 0; i < strLen; ++i)\n    {\n        char ch = pStr[i];\n        if (ch == '\\\\')\n        {\n            m_SB.Add(\"\\\\\\\\\");\n        }\n        else if (ch == '\"')\n        {\n            m_SB.Add(\"\\\\\\\"\");\n        }\n        else if ((uint8_t)ch >= 32)\n        {\n            m_SB.Add(ch);\n        }\n        else switch (ch)\n        {\n        case '\\b':\n            m_SB.Add(\"\\\\b\");\n            break;\n        case '\\f':\n            m_SB.Add(\"\\\\f\");\n            break;\n        case '\\n':\n            m_SB.Add(\"\\\\n\");\n            break;\n        case '\\r':\n            m_SB.Add(\"\\\\r\");\n            break;\n        case '\\t':\n            m_SB.Add(\"\\\\t\");\n            break;\n        default:\n            VMA_ASSERT(0 && \"Character not currently supported.\");\n        }\n    }\n}\n\nvoid VmaJsonWriter::ContinueString(uint32_t n)\n{\n    VMA_ASSERT(m_InsideString);\n    m_SB.AddNumber(n);\n}\n\nvoid VmaJsonWriter::ContinueString(uint64_t n)\n{\n    VMA_ASSERT(m_InsideString);\n    m_SB.AddNumber(n);\n}\n\nvoid VmaJsonWriter::ContinueString_Pointer(const void* ptr)\n{\n    VMA_ASSERT(m_InsideString);\n    m_SB.AddPointer(ptr);\n}\n\nvoid VmaJsonWriter::EndString(const char* pStr)\n{\n    VMA_ASSERT(m_InsideString);\n    if (pStr != VMA_NULL && pStr[0] != '\\0')\n    {\n        ContinueString(pStr);\n    }\n    m_SB.Add('\"');\n    m_InsideString = false;\n}\n\nvoid VmaJsonWriter::WriteNumber(uint32_t n)\n{\n    VMA_ASSERT(!m_InsideString);\n    BeginValue(false);\n    m_SB.AddNumber(n);\n}\n\nvoid VmaJsonWriter::WriteNumber(uint64_t n)\n{\n    VMA_ASSERT(!m_InsideString);\n    BeginValue(false);\n    m_SB.AddNumber(n);\n}\n\nvoid VmaJsonWriter::WriteBool(bool b)\n{\n    VMA_ASSERT(!m_InsideString);\n    BeginValue(false);\n    m_SB.Add(b ? \"true\" : \"false\");\n}\n\nvoid VmaJsonWriter::WriteNull()\n{\n    VMA_ASSERT(!m_InsideString);\n    BeginValue(false);\n    m_SB.Add(\"null\");\n}\n\nvoid VmaJsonWriter::BeginValue(bool isString)\n{\n    if (!m_Stack.empty())\n    {\n        StackItem& currItem = m_Stack.back();\n        if (currItem.type == COLLECTION_TYPE_OBJECT &&\n            currItem.valueCount % 2 == 0)\n        {\n            VMA_ASSERT(isString);\n        }\n\n        if (currItem.type == COLLECTION_TYPE_OBJECT &&\n            currItem.valueCount % 2 != 0)\n        {\n            m_SB.Add(\": \");\n        }\n        else if (currItem.valueCount > 0)\n        {\n            m_SB.Add(\", \");\n            WriteIndent();\n        }\n        else\n        {\n            WriteIndent();\n        }\n        ++currItem.valueCount;\n    }\n}\n\nvoid VmaJsonWriter::WriteIndent(bool oneLess)\n{\n    if (!m_Stack.empty() && !m_Stack.back().singleLineMode)\n    {\n        m_SB.AddNewLine();\n\n        size_t count = m_Stack.size();\n        if (count > 0 && oneLess)\n        {\n            --count;\n        }\n        for (size_t i = 0; i < count; ++i)\n        {\n            m_SB.Add(INDENT);\n        }\n    }\n}\n#endif // _VMA_JSON_WRITER_FUNCTIONS\n\nstatic void VmaPrintDetailedStatistics(VmaJsonWriter& json, const VmaDetailedStatistics& stat)\n{\n    json.BeginObject();\n\n    json.WriteString(\"BlockCount\");\n    json.WriteNumber(stat.statistics.blockCount);\n    json.WriteString(\"BlockBytes\");\n    json.WriteNumber(stat.statistics.blockBytes);\n    json.WriteString(\"AllocationCount\");\n    json.WriteNumber(stat.statistics.allocationCount);\n    json.WriteString(\"AllocationBytes\");\n    json.WriteNumber(stat.statistics.allocationBytes);\n    json.WriteString(\"UnusedRangeCount\");\n    json.WriteNumber(stat.unusedRangeCount);\n\n    if (stat.statistics.allocationCount > 1)\n    {\n        json.WriteString(\"AllocationSizeMin\");\n        json.WriteNumber(stat.allocationSizeMin);\n        json.WriteString(\"AllocationSizeMax\");\n        json.WriteNumber(stat.allocationSizeMax);\n    }\n    if (stat.unusedRangeCount > 1)\n    {\n        json.WriteString(\"UnusedRangeSizeMin\");\n        json.WriteNumber(stat.unusedRangeSizeMin);\n        json.WriteString(\"UnusedRangeSizeMax\");\n        json.WriteNumber(stat.unusedRangeSizeMax);\n    }\n    json.EndObject();\n}\n#endif // _VMA_JSON_WRITER\n\n#ifndef _VMA_MAPPING_HYSTERESIS\n\nclass VmaMappingHysteresis\n{\n    VMA_CLASS_NO_COPY_NO_MOVE(VmaMappingHysteresis)\npublic:\n    VmaMappingHysteresis() = default;\n\n    uint32_t GetExtraMapping() const { return m_ExtraMapping; }\n\n    // Call when Map was called.\n    // Returns true if switched to extra +1 mapping reference count.\n    bool PostMap()\n    {\n#if VMA_MAPPING_HYSTERESIS_ENABLED\n        if(m_ExtraMapping == 0)\n        {\n            ++m_MajorCounter;\n            if(m_MajorCounter >= COUNTER_MIN_EXTRA_MAPPING)\n            {\n                m_ExtraMapping = 1;\n                m_MajorCounter = 0;\n                m_MinorCounter = 0;\n                return true;\n            }\n        }\n        else // m_ExtraMapping == 1\n            PostMinorCounter();\n#endif // #if VMA_MAPPING_HYSTERESIS_ENABLED\n        return false;\n    }\n\n    // Call when Unmap was called.\n    void PostUnmap()\n    {\n#if VMA_MAPPING_HYSTERESIS_ENABLED\n        if(m_ExtraMapping == 0)\n            ++m_MajorCounter;\n        else // m_ExtraMapping == 1\n            PostMinorCounter();\n#endif // #if VMA_MAPPING_HYSTERESIS_ENABLED\n    }\n\n    // Call when allocation was made from the memory block.\n    void PostAlloc()\n    {\n#if VMA_MAPPING_HYSTERESIS_ENABLED\n        if(m_ExtraMapping == 1)\n            ++m_MajorCounter;\n        else // m_ExtraMapping == 0\n            PostMinorCounter();\n#endif // #if VMA_MAPPING_HYSTERESIS_ENABLED\n    }\n\n    // Call when allocation was freed from the memory block.\n    // Returns true if switched to extra -1 mapping reference count.\n    bool PostFree()\n    {\n#if VMA_MAPPING_HYSTERESIS_ENABLED\n        if(m_ExtraMapping == 1)\n        {\n            ++m_MajorCounter;\n            if(m_MajorCounter >= COUNTER_MIN_EXTRA_MAPPING &&\n                m_MajorCounter > m_MinorCounter + 1)\n            {\n                m_ExtraMapping = 0;\n                m_MajorCounter = 0;\n                m_MinorCounter = 0;\n                return true;\n            }\n        }\n        else // m_ExtraMapping == 0\n            PostMinorCounter();\n#endif // #if VMA_MAPPING_HYSTERESIS_ENABLED\n        return false;\n    }\n\nprivate:\n    static const int32_t COUNTER_MIN_EXTRA_MAPPING = 7;\n\n    uint32_t m_MinorCounter = 0;\n    uint32_t m_MajorCounter = 0;\n    uint32_t m_ExtraMapping = 0; // 0 or 1.\n\n    void PostMinorCounter()\n    {\n        if(m_MinorCounter < m_MajorCounter)\n        {\n            ++m_MinorCounter;\n        }\n        else if(m_MajorCounter > 0)\n        {\n            --m_MajorCounter;\n            --m_MinorCounter;\n        }\n    }\n};\n\n#endif // _VMA_MAPPING_HYSTERESIS\n\n#if VMA_EXTERNAL_MEMORY_WIN32\nclass VmaWin32Handle\n{\npublic:\n    VmaWin32Handle() noexcept : m_hHandle(VMA_NULL) { }\n    explicit VmaWin32Handle(HANDLE hHandle) noexcept : m_hHandle(hHandle) { }\n    ~VmaWin32Handle() noexcept { if (m_hHandle != VMA_NULL) { ::CloseHandle(m_hHandle); } }\n    VMA_CLASS_NO_COPY_NO_MOVE(VmaWin32Handle)\n\npublic:\n    // Strengthened\n    VkResult GetHandle(VkDevice device, VkDeviceMemory memory, PFN_vkGetMemoryWin32HandleKHR pvkGetMemoryWin32HandleKHR, HANDLE hTargetProcess, bool useMutex, HANDLE* pHandle) noexcept\n    {\n        *pHandle = VMA_NULL;\n        // Try to get handle first.\n        if (m_hHandle != VMA_NULL)\n        {\n            *pHandle = Duplicate(hTargetProcess);\n            return VK_SUCCESS;\n        }\n\n        VkResult res = VK_SUCCESS;\n        // If failed, try to create it.\n        {\n            VmaMutexLockWrite lock(m_Mutex, useMutex);\n            if (m_hHandle == VMA_NULL)\n            {\n                res = Create(device, memory, pvkGetMemoryWin32HandleKHR, &m_hHandle);\n            }\n        }\n\n        *pHandle = Duplicate(hTargetProcess);\n        return res;\n    }\n\n    operator bool() const noexcept { return m_hHandle != VMA_NULL; }\nprivate:\n    // Not atomic\n    static VkResult Create(VkDevice device, VkDeviceMemory memory, PFN_vkGetMemoryWin32HandleKHR pvkGetMemoryWin32HandleKHR, HANDLE* pHandle) noexcept\n    {\n        VkResult res = VK_ERROR_FEATURE_NOT_PRESENT;\n        if (pvkGetMemoryWin32HandleKHR != VMA_NULL)\n        {\n            VkMemoryGetWin32HandleInfoKHR handleInfo{ };\n            handleInfo.sType = VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR;\n            handleInfo.memory = memory;\n            handleInfo.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR;\n            res = pvkGetMemoryWin32HandleKHR(device, &handleInfo, pHandle);\n        }\n        return res;\n    }\n    HANDLE Duplicate(HANDLE hTargetProcess = VMA_NULL) const noexcept\n    {\n        if (!m_hHandle)\n            return m_hHandle;\n\n        HANDLE hCurrentProcess = ::GetCurrentProcess();\n        HANDLE hDupHandle = VMA_NULL;\n        if (!::DuplicateHandle(hCurrentProcess, m_hHandle, hTargetProcess ? hTargetProcess : hCurrentProcess, &hDupHandle, 0, FALSE, DUPLICATE_SAME_ACCESS))\n        {\n            VMA_ASSERT(0 && \"Failed to duplicate handle.\");\n        }\n        return hDupHandle;\n    }\nprivate:\n    HANDLE m_hHandle;\n    VMA_RW_MUTEX m_Mutex; // Protects access m_Handle\n};\n#else \nclass VmaWin32Handle\n{\n    // ABI compatibility\n    void* placeholder = VMA_NULL;\n    VMA_RW_MUTEX placeholder2;\n};\n#endif // VMA_EXTERNAL_MEMORY_WIN32\n\n\n#ifndef _VMA_DEVICE_MEMORY_BLOCK\n/*\nRepresents a single block of device memory (`VkDeviceMemory`) with all the\ndata about its regions (aka suballocations, #VmaAllocation), assigned and free.\n\nThread-safety:\n- Access to m_pMetadata must be externally synchronized.\n- Map, Unmap, Bind* are synchronized internally.\n*/\nclass VmaDeviceMemoryBlock\n{\n    VMA_CLASS_NO_COPY_NO_MOVE(VmaDeviceMemoryBlock)\npublic:\n    VmaBlockMetadata* m_pMetadata;\n\n    VmaDeviceMemoryBlock(VmaAllocator hAllocator);\n    ~VmaDeviceMemoryBlock();\n\n    // Always call after construction.\n    void Init(\n        VmaAllocator hAllocator,\n        VmaPool hParentPool,\n        uint32_t newMemoryTypeIndex,\n        VkDeviceMemory newMemory,\n        VkDeviceSize newSize,\n        uint32_t id,\n        uint32_t algorithm,\n        VkDeviceSize bufferImageGranularity);\n    // Always call before destruction.\n    void Destroy(VmaAllocator allocator);\n\n    VmaPool GetParentPool() const { return m_hParentPool; }\n    VkDeviceMemory GetDeviceMemory() const { return m_hMemory; }\n    uint32_t GetMemoryTypeIndex() const { return m_MemoryTypeIndex; }\n    uint32_t GetId() const { return m_Id; }\n    void* GetMappedData() const { return m_pMappedData; }\n    uint32_t GetMapRefCount() const { return m_MapCount; }\n\n    // Call when allocation/free was made from m_pMetadata.\n    // Used for m_MappingHysteresis.\n    void PostAlloc(VmaAllocator hAllocator);\n    void PostFree(VmaAllocator hAllocator);\n\n    // Validates all data structures inside this object. If not valid, returns false.\n    bool Validate() const;\n    VkResult CheckCorruption(VmaAllocator hAllocator);\n\n    // ppData can be null.\n    VkResult Map(VmaAllocator hAllocator, uint32_t count, void** ppData);\n    void Unmap(VmaAllocator hAllocator, uint32_t count);\n\n    VkResult WriteMagicValueAfterAllocation(VmaAllocator hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize);\n    VkResult ValidateMagicValueAfterAllocation(VmaAllocator hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize);\n\n    VkResult BindBufferMemory(\n        const VmaAllocator hAllocator,\n        const VmaAllocation hAllocation,\n        VkDeviceSize allocationLocalOffset,\n        VkBuffer hBuffer,\n        const void* pNext);\n    VkResult BindImageMemory(\n        const VmaAllocator hAllocator,\n        const VmaAllocation hAllocation,\n        VkDeviceSize allocationLocalOffset,\n        VkImage hImage,\n        const void* pNext);\n#if VMA_EXTERNAL_MEMORY_WIN32\n    VkResult CreateWin32Handle(\n        const VmaAllocator hAllocator,\n        PFN_vkGetMemoryWin32HandleKHR pvkGetMemoryWin32HandleKHR,\n        HANDLE hTargetProcess,\n        HANDLE* pHandle)noexcept;\n#endif // VMA_EXTERNAL_MEMORY_WIN32\nprivate:\n    VmaPool m_hParentPool; // VK_NULL_HANDLE if not belongs to custom pool.\n    uint32_t m_MemoryTypeIndex;\n    uint32_t m_Id;\n    VkDeviceMemory m_hMemory;\n\n    /*\n    Protects access to m_hMemory so it is not used by multiple threads simultaneously, e.g. vkMapMemory, vkBindBufferMemory.\n    Also protects m_MapCount, m_pMappedData.\n    Allocations, deallocations, any change in m_pMetadata is protected by parent's VmaBlockVector::m_Mutex.\n    */\n    VMA_MUTEX m_MapAndBindMutex;\n    VmaMappingHysteresis m_MappingHysteresis;\n    uint32_t m_MapCount;\n    void* m_pMappedData;\n\n    VmaWin32Handle m_Handle;\n};\n#endif // _VMA_DEVICE_MEMORY_BLOCK\n\n#ifndef _VMA_ALLOCATION_T\nstruct VmaAllocationExtraData\n{\n    void* m_pMappedData = VMA_NULL; // Not null means memory is mapped.\n    VmaWin32Handle m_Handle;\n};\n\nstruct VmaAllocation_T\n{\n    friend struct VmaDedicatedAllocationListItemTraits;\n\n    enum FLAGS\n    {\n        FLAG_PERSISTENT_MAP   = 0x01,\n        FLAG_MAPPING_ALLOWED  = 0x02,\n    };\n\npublic:\n    enum ALLOCATION_TYPE\n    {\n        ALLOCATION_TYPE_NONE,\n        ALLOCATION_TYPE_BLOCK,\n        ALLOCATION_TYPE_DEDICATED,\n    };\n\n    // This struct is allocated using VmaPoolAllocator.\n    VmaAllocation_T(bool mappingAllowed);\n    ~VmaAllocation_T();\n\n    void InitBlockAllocation(\n        VmaDeviceMemoryBlock* block,\n        VmaAllocHandle allocHandle,\n        VkDeviceSize alignment,\n        VkDeviceSize size,\n        uint32_t memoryTypeIndex,\n        VmaSuballocationType suballocationType,\n        bool mapped);\n    // pMappedData not null means allocation is created with MAPPED flag.\n    void InitDedicatedAllocation(\n        VmaAllocator allocator,\n        VmaPool hParentPool,\n        uint32_t memoryTypeIndex,\n        VkDeviceMemory hMemory,\n        VmaSuballocationType suballocationType,\n        void* pMappedData,\n        VkDeviceSize size);\n    void Destroy(VmaAllocator allocator);\n\n    ALLOCATION_TYPE GetType() const { return (ALLOCATION_TYPE)m_Type; }\n    VkDeviceSize GetAlignment() const { return m_Alignment; }\n    VkDeviceSize GetSize() const { return m_Size; }\n    void* GetUserData() const { return m_pUserData; }\n    const char* GetName() const { return m_pName; }\n    VmaSuballocationType GetSuballocationType() const { return (VmaSuballocationType)m_SuballocationType; }\n\n    VmaDeviceMemoryBlock* GetBlock() const { VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK); return m_BlockAllocation.m_Block; }\n    uint32_t GetMemoryTypeIndex() const { return m_MemoryTypeIndex; }\n    bool IsPersistentMap() const { return (m_Flags & FLAG_PERSISTENT_MAP) != 0; }\n    bool IsMappingAllowed() const { return (m_Flags & FLAG_MAPPING_ALLOWED) != 0; }\n\n    void SetUserData(VmaAllocator hAllocator, void* pUserData) { m_pUserData = pUserData; }\n    void SetName(VmaAllocator hAllocator, const char* pName);\n    void FreeName(VmaAllocator hAllocator);\n    uint8_t SwapBlockAllocation(VmaAllocator hAllocator, VmaAllocation allocation);\n    VmaAllocHandle GetAllocHandle() const;\n    VkDeviceSize GetOffset() const;\n    VmaPool GetParentPool() const;\n    VkDeviceMemory GetMemory() const;\n    void* GetMappedData() const;\n\n    void BlockAllocMap();\n    void BlockAllocUnmap();\n    VkResult DedicatedAllocMap(VmaAllocator hAllocator, void** ppData);\n    void DedicatedAllocUnmap(VmaAllocator hAllocator);\n\n#if VMA_STATS_STRING_ENABLED\n    VmaBufferImageUsage GetBufferImageUsage() const { return m_BufferImageUsage; }\n    void InitBufferUsage(const VkBufferCreateInfo &createInfo, bool useKhrMaintenance5)\n    {\n        VMA_ASSERT(m_BufferImageUsage == VmaBufferImageUsage::UNKNOWN);\n        m_BufferImageUsage = VmaBufferImageUsage(createInfo, useKhrMaintenance5);\n    }\n    void InitImageUsage(const VkImageCreateInfo &createInfo)\n    {\n        VMA_ASSERT(m_BufferImageUsage == VmaBufferImageUsage::UNKNOWN);\n        m_BufferImageUsage = VmaBufferImageUsage(createInfo);\n    }\n    void PrintParameters(class VmaJsonWriter& json) const;\n#endif\n\n#if VMA_EXTERNAL_MEMORY_WIN32\n    VkResult GetWin32Handle(VmaAllocator hAllocator, HANDLE hTargetProcess, HANDLE* hHandle) noexcept;\n#endif // VMA_EXTERNAL_MEMORY_WIN32\n\nprivate:\n    // Allocation out of VmaDeviceMemoryBlock.\n    struct BlockAllocation\n    {\n        VmaDeviceMemoryBlock* m_Block;\n        VmaAllocHandle m_AllocHandle;\n    };\n    // Allocation for an object that has its own private VkDeviceMemory.\n    struct DedicatedAllocation\n    {\n        VmaPool m_hParentPool; // VK_NULL_HANDLE if not belongs to custom pool.\n        VkDeviceMemory m_hMemory;\n        VmaAllocationExtraData* m_ExtraData;\n        VmaAllocation_T* m_Prev;\n        VmaAllocation_T* m_Next;\n    };\n    union\n    {\n        // Allocation out of VmaDeviceMemoryBlock.\n        BlockAllocation m_BlockAllocation;\n        // Allocation for an object that has its own private VkDeviceMemory.\n        DedicatedAllocation m_DedicatedAllocation;\n    };\n\n    VkDeviceSize m_Alignment;\n    VkDeviceSize m_Size;\n    void* m_pUserData;\n    char* m_pName;\n    uint32_t m_MemoryTypeIndex;\n    uint8_t m_Type; // ALLOCATION_TYPE\n    uint8_t m_SuballocationType; // VmaSuballocationType\n    // Reference counter for vmaMapMemory()/vmaUnmapMemory().\n    uint8_t m_MapCount;\n    uint8_t m_Flags; // enum FLAGS\n#if VMA_STATS_STRING_ENABLED\n    VmaBufferImageUsage m_BufferImageUsage; // 0 if unknown.\n#endif\n\n    void EnsureExtraData(VmaAllocator hAllocator);\n};\n#endif // _VMA_ALLOCATION_T\n\n#ifndef _VMA_DEDICATED_ALLOCATION_LIST_ITEM_TRAITS\nstruct VmaDedicatedAllocationListItemTraits\n{\n    typedef VmaAllocation_T ItemType;\n\n    static ItemType* GetPrev(const ItemType* item)\n    {\n        VMA_HEAVY_ASSERT(item->GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);\n        return item->m_DedicatedAllocation.m_Prev;\n    }\n    static ItemType* GetNext(const ItemType* item)\n    {\n        VMA_HEAVY_ASSERT(item->GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);\n        return item->m_DedicatedAllocation.m_Next;\n    }\n    static ItemType*& AccessPrev(ItemType* item)\n    {\n        VMA_HEAVY_ASSERT(item->GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);\n        return item->m_DedicatedAllocation.m_Prev;\n    }\n    static ItemType*& AccessNext(ItemType* item)\n    {\n        VMA_HEAVY_ASSERT(item->GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);\n        return item->m_DedicatedAllocation.m_Next;\n    }\n};\n#endif // _VMA_DEDICATED_ALLOCATION_LIST_ITEM_TRAITS\n\n#ifndef _VMA_DEDICATED_ALLOCATION_LIST\n/*\nStores linked list of VmaAllocation_T objects.\nThread-safe, synchronized internally.\n*/\nclass VmaDedicatedAllocationList\n{\n    VMA_CLASS_NO_COPY_NO_MOVE(VmaDedicatedAllocationList)\npublic:\n    VmaDedicatedAllocationList() {}\n    ~VmaDedicatedAllocationList();\n\n    void Init(bool useMutex) { m_UseMutex = useMutex; }\n    bool Validate();\n\n    void AddDetailedStatistics(VmaDetailedStatistics& inoutStats);\n    void AddStatistics(VmaStatistics& inoutStats);\n#if VMA_STATS_STRING_ENABLED\n    // Writes JSON array with the list of allocations.\n    void BuildStatsString(VmaJsonWriter& json);\n#endif\n\n    bool IsEmpty();\n    void Register(VmaAllocation alloc);\n    void Unregister(VmaAllocation alloc);\n\nprivate:\n    typedef VmaIntrusiveLinkedList<VmaDedicatedAllocationListItemTraits> DedicatedAllocationLinkedList;\n\n    bool m_UseMutex = true;\n    VMA_RW_MUTEX m_Mutex;\n    DedicatedAllocationLinkedList m_AllocationList;\n};\n\n#ifndef _VMA_DEDICATED_ALLOCATION_LIST_FUNCTIONS\n\nVmaDedicatedAllocationList::~VmaDedicatedAllocationList()\n{\n    VMA_HEAVY_ASSERT(Validate());\n\n    if (!m_AllocationList.IsEmpty())\n    {\n        VMA_ASSERT_LEAK(false && \"Unfreed dedicated allocations found!\");\n    }\n}\n\nbool VmaDedicatedAllocationList::Validate()\n{\n    const size_t declaredCount = m_AllocationList.GetCount();\n    size_t actualCount = 0;\n    VmaMutexLockRead lock(m_Mutex, m_UseMutex);\n    for (VmaAllocation alloc = m_AllocationList.Front();\n        alloc != VMA_NULL; alloc = m_AllocationList.GetNext(alloc))\n    {\n        ++actualCount;\n    }\n    VMA_VALIDATE(actualCount == declaredCount);\n\n    return true;\n}\n\nvoid VmaDedicatedAllocationList::AddDetailedStatistics(VmaDetailedStatistics& inoutStats)\n{\n    for(auto* item = m_AllocationList.Front(); item != VMA_NULL; item = DedicatedAllocationLinkedList::GetNext(item))\n    {\n        const VkDeviceSize size = item->GetSize();\n        inoutStats.statistics.blockCount++;\n        inoutStats.statistics.blockBytes += size;\n        VmaAddDetailedStatisticsAllocation(inoutStats, item->GetSize());\n    }\n}\n\nvoid VmaDedicatedAllocationList::AddStatistics(VmaStatistics& inoutStats)\n{\n    VmaMutexLockRead lock(m_Mutex, m_UseMutex);\n\n    const uint32_t allocCount = (uint32_t)m_AllocationList.GetCount();\n    inoutStats.blockCount += allocCount;\n    inoutStats.allocationCount += allocCount;\n\n    for(auto* item = m_AllocationList.Front(); item != VMA_NULL; item = DedicatedAllocationLinkedList::GetNext(item))\n    {\n        const VkDeviceSize size = item->GetSize();\n        inoutStats.blockBytes += size;\n        inoutStats.allocationBytes += size;\n    }\n}\n\n#if VMA_STATS_STRING_ENABLED\nvoid VmaDedicatedAllocationList::BuildStatsString(VmaJsonWriter& json)\n{\n    VmaMutexLockRead lock(m_Mutex, m_UseMutex);\n    json.BeginArray();\n    for (VmaAllocation alloc = m_AllocationList.Front();\n        alloc != VMA_NULL; alloc = m_AllocationList.GetNext(alloc))\n    {\n        json.BeginObject(true);\n        alloc->PrintParameters(json);\n        json.EndObject();\n    }\n    json.EndArray();\n}\n#endif // VMA_STATS_STRING_ENABLED\n\nbool VmaDedicatedAllocationList::IsEmpty()\n{\n    VmaMutexLockRead lock(m_Mutex, m_UseMutex);\n    return m_AllocationList.IsEmpty();\n}\n\nvoid VmaDedicatedAllocationList::Register(VmaAllocation alloc)\n{\n    VmaMutexLockWrite lock(m_Mutex, m_UseMutex);\n    m_AllocationList.PushBack(alloc);\n}\n\nvoid VmaDedicatedAllocationList::Unregister(VmaAllocation alloc)\n{\n    VmaMutexLockWrite lock(m_Mutex, m_UseMutex);\n    m_AllocationList.Remove(alloc);\n}\n#endif // _VMA_DEDICATED_ALLOCATION_LIST_FUNCTIONS\n#endif // _VMA_DEDICATED_ALLOCATION_LIST\n\n#ifndef _VMA_SUBALLOCATION\n/*\nRepresents a region of VmaDeviceMemoryBlock that is either assigned and returned as\nallocated memory block or free.\n*/\nstruct VmaSuballocation\n{\n    VkDeviceSize offset;\n    VkDeviceSize size;\n    void* userData;\n    VmaSuballocationType type;\n};\n\n// Comparator for offsets.\nstruct VmaSuballocationOffsetLess\n{\n    bool operator()(const VmaSuballocation& lhs, const VmaSuballocation& rhs) const\n    {\n        return lhs.offset < rhs.offset;\n    }\n};\n\nstruct VmaSuballocationOffsetGreater\n{\n    bool operator()(const VmaSuballocation& lhs, const VmaSuballocation& rhs) const\n    {\n        return lhs.offset > rhs.offset;\n    }\n};\n\nstruct VmaSuballocationItemSizeLess\n{\n    bool operator()(const VmaSuballocationList::iterator lhs,\n        const VmaSuballocationList::iterator rhs) const\n    {\n        return lhs->size < rhs->size;\n    }\n\n    bool operator()(const VmaSuballocationList::iterator lhs,\n        VkDeviceSize rhsSize) const\n    {\n        return lhs->size < rhsSize;\n    }\n};\n#endif // _VMA_SUBALLOCATION\n\n#ifndef _VMA_ALLOCATION_REQUEST\n/*\nParameters of planned allocation inside a VmaDeviceMemoryBlock.\nitem points to a FREE suballocation.\n*/\nstruct VmaAllocationRequest\n{\n    VmaAllocHandle allocHandle;\n    VkDeviceSize size;\n    VmaSuballocationList::iterator item;\n    void* customData;\n    uint64_t algorithmData;\n    VmaAllocationRequestType type;\n};\n#endif // _VMA_ALLOCATION_REQUEST\n\n#ifndef _VMA_BLOCK_METADATA\n/*\nData structure used for bookkeeping of allocations and unused ranges of memory\nin a single VkDeviceMemory block.\n*/\nclass VmaBlockMetadata\n{\n    VMA_CLASS_NO_COPY_NO_MOVE(VmaBlockMetadata)\npublic:\n    // pAllocationCallbacks, if not null, must be owned externally - alive and unchanged for the whole lifetime of this object.\n    VmaBlockMetadata(const VkAllocationCallbacks* pAllocationCallbacks,\n        VkDeviceSize bufferImageGranularity, bool isVirtual);\n    virtual ~VmaBlockMetadata() = default;\n\n    virtual void Init(VkDeviceSize size) { m_Size = size; }\n    bool IsVirtual() const { return m_IsVirtual; }\n    VkDeviceSize GetSize() const { return m_Size; }\n\n    // Validates all data structures inside this object. If not valid, returns false.\n    virtual bool Validate() const = 0;\n    virtual size_t GetAllocationCount() const = 0;\n    virtual size_t GetFreeRegionsCount() const = 0;\n    virtual VkDeviceSize GetSumFreeSize() const = 0;\n    // Returns true if this block is empty - contains only single free suballocation.\n    virtual bool IsEmpty() const = 0;\n    virtual void GetAllocationInfo(VmaAllocHandle allocHandle, VmaVirtualAllocationInfo& outInfo) = 0;\n    virtual VkDeviceSize GetAllocationOffset(VmaAllocHandle allocHandle) const = 0;\n    virtual void* GetAllocationUserData(VmaAllocHandle allocHandle) const = 0;\n\n    virtual VmaAllocHandle GetAllocationListBegin() const = 0;\n    virtual VmaAllocHandle GetNextAllocation(VmaAllocHandle prevAlloc) const = 0;\n    virtual VkDeviceSize GetNextFreeRegionSize(VmaAllocHandle alloc) const = 0;\n\n    // Shouldn't modify blockCount.\n    virtual void AddDetailedStatistics(VmaDetailedStatistics& inoutStats) const = 0;\n    virtual void AddStatistics(VmaStatistics& inoutStats) const = 0;\n\n#if VMA_STATS_STRING_ENABLED\n    virtual void PrintDetailedMap(class VmaJsonWriter& json) const = 0;\n#endif\n\n    // Tries to find a place for suballocation with given parameters inside this block.\n    // If succeeded, fills pAllocationRequest and returns true.\n    // If failed, returns false.\n    virtual bool CreateAllocationRequest(\n        VkDeviceSize allocSize,\n        VkDeviceSize allocAlignment,\n        bool upperAddress,\n        VmaSuballocationType allocType,\n        // Always one of VMA_ALLOCATION_CREATE_STRATEGY_* or VMA_ALLOCATION_INTERNAL_STRATEGY_* flags.\n        uint32_t strategy,\n        VmaAllocationRequest* pAllocationRequest) = 0;\n\n    virtual VkResult CheckCorruption(const void* pBlockData) = 0;\n\n    // Makes actual allocation based on request. Request must already be checked and valid.\n    virtual void Alloc(\n        const VmaAllocationRequest& request,\n        VmaSuballocationType type,\n        void* userData) = 0;\n\n    // Frees suballocation assigned to given memory region.\n    virtual void Free(VmaAllocHandle allocHandle) = 0;\n\n    // Frees all allocations.\n    // Careful! Don't call it if there are VmaAllocation objects owned by userData of cleared allocations!\n    virtual void Clear() = 0;\n\n    virtual void SetAllocationUserData(VmaAllocHandle allocHandle, void* userData) = 0;\n    virtual void DebugLogAllAllocations() const = 0;\n\nprotected:\n    const VkAllocationCallbacks* GetAllocationCallbacks() const { return m_pAllocationCallbacks; }\n    VkDeviceSize GetBufferImageGranularity() const { return m_BufferImageGranularity; }\n    VkDeviceSize GetDebugMargin() const { return VkDeviceSize(IsVirtual() ? 0 : VMA_DEBUG_MARGIN); }\n\n    void DebugLogAllocation(VkDeviceSize offset, VkDeviceSize size, void* userData) const;\n#if VMA_STATS_STRING_ENABLED\n    // mapRefCount == UINT32_MAX means unspecified.\n    void PrintDetailedMap_Begin(class VmaJsonWriter& json,\n        VkDeviceSize unusedBytes,\n        size_t allocationCount,\n        size_t unusedRangeCount) const;\n    void PrintDetailedMap_Allocation(class VmaJsonWriter& json,\n        VkDeviceSize offset, VkDeviceSize size, void* userData) const;\n    void PrintDetailedMap_UnusedRange(class VmaJsonWriter& json,\n        VkDeviceSize offset,\n        VkDeviceSize size) const;\n    void PrintDetailedMap_End(class VmaJsonWriter& json) const;\n#endif\n\nprivate:\n    VkDeviceSize m_Size;\n    const VkAllocationCallbacks* m_pAllocationCallbacks;\n    const VkDeviceSize m_BufferImageGranularity;\n    const bool m_IsVirtual;\n};\n\n#ifndef _VMA_BLOCK_METADATA_FUNCTIONS\nVmaBlockMetadata::VmaBlockMetadata(const VkAllocationCallbacks* pAllocationCallbacks,\n    VkDeviceSize bufferImageGranularity, bool isVirtual)\n    : m_Size(0),\n    m_pAllocationCallbacks(pAllocationCallbacks),\n    m_BufferImageGranularity(bufferImageGranularity),\n    m_IsVirtual(isVirtual) {}\n\nvoid VmaBlockMetadata::DebugLogAllocation(VkDeviceSize offset, VkDeviceSize size, void* userData) const\n{\n    if (IsVirtual())\n    {\n        VMA_LEAK_LOG_FORMAT(\"UNFREED VIRTUAL ALLOCATION; Offset: %\" PRIu64 \"; Size: %\" PRIu64 \"; UserData: %p\", offset, size, userData);\n    }\n    else\n    {\n        VMA_ASSERT(userData != VMA_NULL);\n        VmaAllocation allocation = reinterpret_cast<VmaAllocation>(userData);\n\n        userData = allocation->GetUserData();\n        const char* name = allocation->GetName();\n\n#if VMA_STATS_STRING_ENABLED\n        VMA_LEAK_LOG_FORMAT(\"UNFREED ALLOCATION; Offset: %\" PRIu64 \"; Size: %\" PRIu64 \"; UserData: %p; Name: %s; Type: %s; Usage: %\" PRIu64,\n            offset, size, userData, name ? name : \"vma_empty\",\n            VMA_SUBALLOCATION_TYPE_NAMES[allocation->GetSuballocationType()],\n            (uint64_t)allocation->GetBufferImageUsage().Value);\n#else\n        VMA_LEAK_LOG_FORMAT(\"UNFREED ALLOCATION; Offset: %\" PRIu64 \"; Size: %\" PRIu64 \"; UserData: %p; Name: %s; Type: %u\",\n            offset, size, userData, name ? name : \"vma_empty\",\n            (unsigned)allocation->GetSuballocationType());\n#endif // VMA_STATS_STRING_ENABLED\n    }\n\n}\n\n#if VMA_STATS_STRING_ENABLED\nvoid VmaBlockMetadata::PrintDetailedMap_Begin(class VmaJsonWriter& json,\n    VkDeviceSize unusedBytes, size_t allocationCount, size_t unusedRangeCount) const\n{\n    json.WriteString(\"TotalBytes\");\n    json.WriteNumber(GetSize());\n\n    json.WriteString(\"UnusedBytes\");\n    json.WriteNumber(unusedBytes);\n\n    json.WriteString(\"Allocations\");\n    json.WriteNumber((uint64_t)allocationCount);\n\n    json.WriteString(\"UnusedRanges\");\n    json.WriteNumber((uint64_t)unusedRangeCount);\n\n    json.WriteString(\"Suballocations\");\n    json.BeginArray();\n}\n\nvoid VmaBlockMetadata::PrintDetailedMap_Allocation(class VmaJsonWriter& json,\n    VkDeviceSize offset, VkDeviceSize size, void* userData) const\n{\n    json.BeginObject(true);\n\n    json.WriteString(\"Offset\");\n    json.WriteNumber(offset);\n\n    if (IsVirtual())\n    {\n        json.WriteString(\"Size\");\n        json.WriteNumber(size);\n        if (userData)\n        {\n            json.WriteString(\"CustomData\");\n            json.BeginString();\n            json.ContinueString_Pointer(userData);\n            json.EndString();\n        }\n    }\n    else\n    {\n        ((VmaAllocation)userData)->PrintParameters(json);\n    }\n\n    json.EndObject();\n}\n\nvoid VmaBlockMetadata::PrintDetailedMap_UnusedRange(class VmaJsonWriter& json,\n    VkDeviceSize offset, VkDeviceSize size) const\n{\n    json.BeginObject(true);\n\n    json.WriteString(\"Offset\");\n    json.WriteNumber(offset);\n\n    json.WriteString(\"Type\");\n    json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[VMA_SUBALLOCATION_TYPE_FREE]);\n\n    json.WriteString(\"Size\");\n    json.WriteNumber(size);\n\n    json.EndObject();\n}\n\nvoid VmaBlockMetadata::PrintDetailedMap_End(class VmaJsonWriter& json) const\n{\n    json.EndArray();\n}\n#endif // VMA_STATS_STRING_ENABLED\n#endif // _VMA_BLOCK_METADATA_FUNCTIONS\n#endif // _VMA_BLOCK_METADATA\n\n#ifndef _VMA_BLOCK_BUFFER_IMAGE_GRANULARITY\n// Before deleting object of this class remember to call 'Destroy()'\nclass VmaBlockBufferImageGranularity final\n{\npublic:\n    struct ValidationContext\n    {\n        const VkAllocationCallbacks* allocCallbacks;\n        uint16_t* pageAllocs;\n    };\n\n    VmaBlockBufferImageGranularity(VkDeviceSize bufferImageGranularity);\n    ~VmaBlockBufferImageGranularity();\n\n    bool IsEnabled() const { return m_BufferImageGranularity > MAX_LOW_BUFFER_IMAGE_GRANULARITY; }\n\n    void Init(const VkAllocationCallbacks* pAllocationCallbacks, VkDeviceSize size);\n    // Before destroying object you must call free it's memory\n    void Destroy(const VkAllocationCallbacks* pAllocationCallbacks);\n\n    void RoundupAllocRequest(VmaSuballocationType allocType,\n        VkDeviceSize& inOutAllocSize,\n        VkDeviceSize& inOutAllocAlignment) const;\n\n    bool CheckConflictAndAlignUp(VkDeviceSize& inOutAllocOffset,\n        VkDeviceSize allocSize,\n        VkDeviceSize blockOffset,\n        VkDeviceSize blockSize,\n        VmaSuballocationType allocType) const;\n\n    void AllocPages(uint8_t allocType, VkDeviceSize offset, VkDeviceSize size);\n    void FreePages(VkDeviceSize offset, VkDeviceSize size);\n    void Clear();\n\n    ValidationContext StartValidation(const VkAllocationCallbacks* pAllocationCallbacks,\n        bool isVirutal) const;\n    bool Validate(ValidationContext& ctx, VkDeviceSize offset, VkDeviceSize size) const;\n    bool FinishValidation(ValidationContext& ctx) const;\n\nprivate:\n    static const uint16_t MAX_LOW_BUFFER_IMAGE_GRANULARITY = 256;\n\n    struct RegionInfo\n    {\n        uint8_t allocType;\n        uint16_t allocCount;\n    };\n\n    VkDeviceSize m_BufferImageGranularity;\n    uint32_t m_RegionCount;\n    RegionInfo* m_RegionInfo;\n\n    uint32_t GetStartPage(VkDeviceSize offset) const { return OffsetToPageIndex(offset & ~(m_BufferImageGranularity - 1)); }\n    uint32_t GetEndPage(VkDeviceSize offset, VkDeviceSize size) const { return OffsetToPageIndex((offset + size - 1) & ~(m_BufferImageGranularity - 1)); }\n\n    uint32_t OffsetToPageIndex(VkDeviceSize offset) const;\n    void AllocPage(RegionInfo& page, uint8_t allocType);\n};\n\n#ifndef _VMA_BLOCK_BUFFER_IMAGE_GRANULARITY_FUNCTIONS\nVmaBlockBufferImageGranularity::VmaBlockBufferImageGranularity(VkDeviceSize bufferImageGranularity)\n    : m_BufferImageGranularity(bufferImageGranularity),\n    m_RegionCount(0),\n    m_RegionInfo(VMA_NULL) {}\n\nVmaBlockBufferImageGranularity::~VmaBlockBufferImageGranularity()\n{\n    VMA_ASSERT(m_RegionInfo == VMA_NULL && \"Free not called before destroying object!\");\n}\n\nvoid VmaBlockBufferImageGranularity::Init(const VkAllocationCallbacks* pAllocationCallbacks, VkDeviceSize size)\n{\n    if (IsEnabled())\n    {\n        m_RegionCount = static_cast<uint32_t>(VmaDivideRoundingUp(size, m_BufferImageGranularity));\n        m_RegionInfo = vma_new_array(pAllocationCallbacks, RegionInfo, m_RegionCount);\n        memset(m_RegionInfo, 0, m_RegionCount * sizeof(RegionInfo));\n    }\n}\n\nvoid VmaBlockBufferImageGranularity::Destroy(const VkAllocationCallbacks* pAllocationCallbacks)\n{\n    if (m_RegionInfo)\n    {\n        vma_delete_array(pAllocationCallbacks, m_RegionInfo, m_RegionCount);\n        m_RegionInfo = VMA_NULL;\n    }\n}\n\nvoid VmaBlockBufferImageGranularity::RoundupAllocRequest(VmaSuballocationType allocType,\n    VkDeviceSize& inOutAllocSize,\n    VkDeviceSize& inOutAllocAlignment) const\n{\n    if (m_BufferImageGranularity > 1 &&\n        m_BufferImageGranularity <= MAX_LOW_BUFFER_IMAGE_GRANULARITY)\n    {\n        if (allocType == VMA_SUBALLOCATION_TYPE_UNKNOWN ||\n            allocType == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||\n            allocType == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL)\n        {\n            inOutAllocAlignment = VMA_MAX(inOutAllocAlignment, m_BufferImageGranularity);\n            inOutAllocSize = VmaAlignUp(inOutAllocSize, m_BufferImageGranularity);\n        }\n    }\n}\n\nbool VmaBlockBufferImageGranularity::CheckConflictAndAlignUp(VkDeviceSize& inOutAllocOffset,\n    VkDeviceSize allocSize,\n    VkDeviceSize blockOffset,\n    VkDeviceSize blockSize,\n    VmaSuballocationType allocType) const\n{\n    if (IsEnabled())\n    {\n        uint32_t startPage = GetStartPage(inOutAllocOffset);\n        if (m_RegionInfo[startPage].allocCount > 0 &&\n            VmaIsBufferImageGranularityConflict(static_cast<VmaSuballocationType>(m_RegionInfo[startPage].allocType), allocType))\n        {\n            inOutAllocOffset = VmaAlignUp(inOutAllocOffset, m_BufferImageGranularity);\n            if (blockSize < allocSize + inOutAllocOffset - blockOffset)\n                return true;\n            ++startPage;\n        }\n        uint32_t endPage = GetEndPage(inOutAllocOffset, allocSize);\n        if (endPage != startPage &&\n            m_RegionInfo[endPage].allocCount > 0 &&\n            VmaIsBufferImageGranularityConflict(static_cast<VmaSuballocationType>(m_RegionInfo[endPage].allocType), allocType))\n        {\n            return true;\n        }\n    }\n    return false;\n}\n\nvoid VmaBlockBufferImageGranularity::AllocPages(uint8_t allocType, VkDeviceSize offset, VkDeviceSize size)\n{\n    if (IsEnabled())\n    {\n        uint32_t startPage = GetStartPage(offset);\n        AllocPage(m_RegionInfo[startPage], allocType);\n\n        uint32_t endPage = GetEndPage(offset, size);\n        if (startPage != endPage)\n            AllocPage(m_RegionInfo[endPage], allocType);\n    }\n}\n\nvoid VmaBlockBufferImageGranularity::FreePages(VkDeviceSize offset, VkDeviceSize size)\n{\n    if (IsEnabled())\n    {\n        uint32_t startPage = GetStartPage(offset);\n        --m_RegionInfo[startPage].allocCount;\n        if (m_RegionInfo[startPage].allocCount == 0)\n            m_RegionInfo[startPage].allocType = VMA_SUBALLOCATION_TYPE_FREE;\n        uint32_t endPage = GetEndPage(offset, size);\n        if (startPage != endPage)\n        {\n            --m_RegionInfo[endPage].allocCount;\n            if (m_RegionInfo[endPage].allocCount == 0)\n                m_RegionInfo[endPage].allocType = VMA_SUBALLOCATION_TYPE_FREE;\n        }\n    }\n}\n\nvoid VmaBlockBufferImageGranularity::Clear()\n{\n    if (m_RegionInfo)\n        memset(m_RegionInfo, 0, m_RegionCount * sizeof(RegionInfo));\n}\n\nVmaBlockBufferImageGranularity::ValidationContext VmaBlockBufferImageGranularity::StartValidation(\n    const VkAllocationCallbacks* pAllocationCallbacks, bool isVirutal) const\n{\n    ValidationContext ctx{ pAllocationCallbacks, VMA_NULL };\n    if (!isVirutal && IsEnabled())\n    {\n        ctx.pageAllocs = vma_new_array(pAllocationCallbacks, uint16_t, m_RegionCount);\n        memset(ctx.pageAllocs, 0, m_RegionCount * sizeof(uint16_t));\n    }\n    return ctx;\n}\n\nbool VmaBlockBufferImageGranularity::Validate(ValidationContext& ctx,\n    VkDeviceSize offset, VkDeviceSize size) const\n{\n    if (IsEnabled())\n    {\n        uint32_t start = GetStartPage(offset);\n        ++ctx.pageAllocs[start];\n        VMA_VALIDATE(m_RegionInfo[start].allocCount > 0);\n\n        uint32_t end = GetEndPage(offset, size);\n        if (start != end)\n        {\n            ++ctx.pageAllocs[end];\n            VMA_VALIDATE(m_RegionInfo[end].allocCount > 0);\n        }\n    }\n    return true;\n}\n\nbool VmaBlockBufferImageGranularity::FinishValidation(ValidationContext& ctx) const\n{\n    // Check proper page structure\n    if (IsEnabled())\n    {\n        VMA_ASSERT(ctx.pageAllocs != VMA_NULL && \"Validation context not initialized!\");\n\n        for (uint32_t page = 0; page < m_RegionCount; ++page)\n        {\n            VMA_VALIDATE(ctx.pageAllocs[page] == m_RegionInfo[page].allocCount);\n        }\n        vma_delete_array(ctx.allocCallbacks, ctx.pageAllocs, m_RegionCount);\n        ctx.pageAllocs = VMA_NULL;\n    }\n    return true;\n}\n\nuint32_t VmaBlockBufferImageGranularity::OffsetToPageIndex(VkDeviceSize offset) const\n{\n    return static_cast<uint32_t>(offset >> VMA_BITSCAN_MSB(m_BufferImageGranularity));\n}\n\nvoid VmaBlockBufferImageGranularity::AllocPage(RegionInfo& page, uint8_t allocType)\n{\n    // When current alloc type is free then it can be overridden by new type\n    if (page.allocCount == 0 || (page.allocCount > 0 && page.allocType == VMA_SUBALLOCATION_TYPE_FREE))\n        page.allocType = allocType;\n\n    ++page.allocCount;\n}\n#endif // _VMA_BLOCK_BUFFER_IMAGE_GRANULARITY_FUNCTIONS\n#endif // _VMA_BLOCK_BUFFER_IMAGE_GRANULARITY\n\n#ifndef _VMA_BLOCK_METADATA_LINEAR\n/*\nAllocations and their references in internal data structure look like this:\n\nif(m_2ndVectorMode == SECOND_VECTOR_EMPTY):\n\n        0 +-------+\n          |       |\n          |       |\n          |       |\n          +-------+\n          | Alloc |  1st[m_1stNullItemsBeginCount]\n          +-------+\n          | Alloc |  1st[m_1stNullItemsBeginCount + 1]\n          +-------+\n          |  ...  |\n          +-------+\n          | Alloc |  1st[1st.size() - 1]\n          +-------+\n          |       |\n          |       |\n          |       |\nGetSize() +-------+\n\nif(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER):\n\n        0 +-------+\n          | Alloc |  2nd[0]\n          +-------+\n          | Alloc |  2nd[1]\n          +-------+\n          |  ...  |\n          +-------+\n          | Alloc |  2nd[2nd.size() - 1]\n          +-------+\n          |       |\n          |       |\n          |       |\n          +-------+\n          | Alloc |  1st[m_1stNullItemsBeginCount]\n          +-------+\n          | Alloc |  1st[m_1stNullItemsBeginCount + 1]\n          +-------+\n          |  ...  |\n          +-------+\n          | Alloc |  1st[1st.size() - 1]\n          +-------+\n          |       |\nGetSize() +-------+\n\nif(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK):\n\n        0 +-------+\n          |       |\n          |       |\n          |       |\n          +-------+\n          | Alloc |  1st[m_1stNullItemsBeginCount]\n          +-------+\n          | Alloc |  1st[m_1stNullItemsBeginCount + 1]\n          +-------+\n          |  ...  |\n          +-------+\n          | Alloc |  1st[1st.size() - 1]\n          +-------+\n          |       |\n          |       |\n          |       |\n          +-------+\n          | Alloc |  2nd[2nd.size() - 1]\n          +-------+\n          |  ...  |\n          +-------+\n          | Alloc |  2nd[1]\n          +-------+\n          | Alloc |  2nd[0]\nGetSize() +-------+\n\n*/\nclass VmaBlockMetadata_Linear : public VmaBlockMetadata\n{\n    VMA_CLASS_NO_COPY_NO_MOVE(VmaBlockMetadata_Linear)\npublic:\n    VmaBlockMetadata_Linear(const VkAllocationCallbacks* pAllocationCallbacks,\n        VkDeviceSize bufferImageGranularity, bool isVirtual);\n    virtual ~VmaBlockMetadata_Linear() = default;\n\n    VkDeviceSize GetSumFreeSize() const override { return m_SumFreeSize; }\n    bool IsEmpty() const override { return GetAllocationCount() == 0; }\n    VkDeviceSize GetAllocationOffset(VmaAllocHandle allocHandle) const override { return (VkDeviceSize)allocHandle - 1; }\n\n    void Init(VkDeviceSize size) override;\n    bool Validate() const override;\n    size_t GetAllocationCount() const override;\n    size_t GetFreeRegionsCount() const override;\n\n    void AddDetailedStatistics(VmaDetailedStatistics& inoutStats) const override;\n    void AddStatistics(VmaStatistics& inoutStats) const override;\n\n#if VMA_STATS_STRING_ENABLED\n    void PrintDetailedMap(class VmaJsonWriter& json) const override;\n#endif\n\n    bool CreateAllocationRequest(\n        VkDeviceSize allocSize,\n        VkDeviceSize allocAlignment,\n        bool upperAddress,\n        VmaSuballocationType allocType,\n        uint32_t strategy,\n        VmaAllocationRequest* pAllocationRequest) override;\n\n    VkResult CheckCorruption(const void* pBlockData) override;\n\n    void Alloc(\n        const VmaAllocationRequest& request,\n        VmaSuballocationType type,\n        void* userData) override;\n\n    void Free(VmaAllocHandle allocHandle) override;\n    void GetAllocationInfo(VmaAllocHandle allocHandle, VmaVirtualAllocationInfo& outInfo) override;\n    void* GetAllocationUserData(VmaAllocHandle allocHandle) const override;\n    VmaAllocHandle GetAllocationListBegin() const override;\n    VmaAllocHandle GetNextAllocation(VmaAllocHandle prevAlloc) const override;\n    VkDeviceSize GetNextFreeRegionSize(VmaAllocHandle alloc) const override;\n    void Clear() override;\n    void SetAllocationUserData(VmaAllocHandle allocHandle, void* userData) override;\n    void DebugLogAllAllocations() const override;\n\nprivate:\n    /*\n    There are two suballocation vectors, used in ping-pong way.\n    The one with index m_1stVectorIndex is called 1st.\n    The one with index (m_1stVectorIndex ^ 1) is called 2nd.\n    2nd can be non-empty only when 1st is not empty.\n    When 2nd is not empty, m_2ndVectorMode indicates its mode of operation.\n    */\n    typedef VmaVector<VmaSuballocation, VmaStlAllocator<VmaSuballocation>> SuballocationVectorType;\n\n    enum SECOND_VECTOR_MODE\n    {\n        SECOND_VECTOR_EMPTY,\n        /*\n        Suballocations in 2nd vector are created later than the ones in 1st, but they\n        all have smaller offset.\n        */\n        SECOND_VECTOR_RING_BUFFER,\n        /*\n        Suballocations in 2nd vector are upper side of double stack.\n        They all have offsets higher than those in 1st vector.\n        Top of this stack means smaller offsets, but higher indices in this vector.\n        */\n        SECOND_VECTOR_DOUBLE_STACK,\n    };\n\n    VkDeviceSize m_SumFreeSize;\n    SuballocationVectorType m_Suballocations0, m_Suballocations1;\n    uint32_t m_1stVectorIndex;\n    SECOND_VECTOR_MODE m_2ndVectorMode;\n    // Number of items in 1st vector with hAllocation = null at the beginning.\n    size_t m_1stNullItemsBeginCount;\n    // Number of other items in 1st vector with hAllocation = null somewhere in the middle.\n    size_t m_1stNullItemsMiddleCount;\n    // Number of items in 2nd vector with hAllocation = null.\n    size_t m_2ndNullItemsCount;\n\n    SuballocationVectorType& AccessSuballocations1st() { return m_1stVectorIndex ? m_Suballocations1 : m_Suballocations0; }\n    SuballocationVectorType& AccessSuballocations2nd() { return m_1stVectorIndex ? m_Suballocations0 : m_Suballocations1; }\n    const SuballocationVectorType& AccessSuballocations1st() const { return m_1stVectorIndex ? m_Suballocations1 : m_Suballocations0; }\n    const SuballocationVectorType& AccessSuballocations2nd() const { return m_1stVectorIndex ? m_Suballocations0 : m_Suballocations1; }\n\n    VmaSuballocation& FindSuballocation(VkDeviceSize offset) const;\n    bool ShouldCompact1st() const;\n    void CleanupAfterFree();\n\n    bool CreateAllocationRequest_LowerAddress(\n        VkDeviceSize allocSize,\n        VkDeviceSize allocAlignment,\n        VmaSuballocationType allocType,\n        uint32_t strategy,\n        VmaAllocationRequest* pAllocationRequest);\n    bool CreateAllocationRequest_UpperAddress(\n        VkDeviceSize allocSize,\n        VkDeviceSize allocAlignment,\n        VmaSuballocationType allocType,\n        uint32_t strategy,\n        VmaAllocationRequest* pAllocationRequest);\n};\n\n#ifndef _VMA_BLOCK_METADATA_LINEAR_FUNCTIONS\nVmaBlockMetadata_Linear::VmaBlockMetadata_Linear(const VkAllocationCallbacks* pAllocationCallbacks,\n    VkDeviceSize bufferImageGranularity, bool isVirtual)\n    : VmaBlockMetadata(pAllocationCallbacks, bufferImageGranularity, isVirtual),\n    m_SumFreeSize(0),\n    m_Suballocations0(VmaStlAllocator<VmaSuballocation>(pAllocationCallbacks)),\n    m_Suballocations1(VmaStlAllocator<VmaSuballocation>(pAllocationCallbacks)),\n    m_1stVectorIndex(0),\n    m_2ndVectorMode(SECOND_VECTOR_EMPTY),\n    m_1stNullItemsBeginCount(0),\n    m_1stNullItemsMiddleCount(0),\n    m_2ndNullItemsCount(0) {}\n\nvoid VmaBlockMetadata_Linear::Init(VkDeviceSize size)\n{\n    VmaBlockMetadata::Init(size);\n    m_SumFreeSize = size;\n}\n\nbool VmaBlockMetadata_Linear::Validate() const\n{\n    const SuballocationVectorType& suballocations1st = AccessSuballocations1st();\n    const SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();\n\n    VMA_VALIDATE(suballocations2nd.empty() == (m_2ndVectorMode == SECOND_VECTOR_EMPTY));\n    VMA_VALIDATE(!suballocations1st.empty() ||\n        suballocations2nd.empty() ||\n        m_2ndVectorMode != SECOND_VECTOR_RING_BUFFER);\n\n    if (!suballocations1st.empty())\n    {\n        // Null item at the beginning should be accounted into m_1stNullItemsBeginCount.\n        VMA_VALIDATE(suballocations1st[m_1stNullItemsBeginCount].type != VMA_SUBALLOCATION_TYPE_FREE);\n        // Null item at the end should be just pop_back().\n        VMA_VALIDATE(suballocations1st.back().type != VMA_SUBALLOCATION_TYPE_FREE);\n    }\n    if (!suballocations2nd.empty())\n    {\n        // Null item at the end should be just pop_back().\n        VMA_VALIDATE(suballocations2nd.back().type != VMA_SUBALLOCATION_TYPE_FREE);\n    }\n\n    VMA_VALIDATE(m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount <= suballocations1st.size());\n    VMA_VALIDATE(m_2ndNullItemsCount <= suballocations2nd.size());\n\n    VkDeviceSize sumUsedSize = 0;\n    const size_t suballoc1stCount = suballocations1st.size();\n    const VkDeviceSize debugMargin = GetDebugMargin();\n    VkDeviceSize offset = 0;\n\n    if (m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)\n    {\n        const size_t suballoc2ndCount = suballocations2nd.size();\n        size_t nullItem2ndCount = 0;\n        for (size_t i = 0; i < suballoc2ndCount; ++i)\n        {\n            const VmaSuballocation& suballoc = suballocations2nd[i];\n            const bool currFree = (suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);\n\n            VmaAllocation const alloc = (VmaAllocation)suballoc.userData;\n            if (!IsVirtual())\n            {\n                VMA_VALIDATE(currFree == (alloc == VK_NULL_HANDLE));\n            }\n            VMA_VALIDATE(suballoc.offset >= offset);\n\n            if (!currFree)\n            {\n                if (!IsVirtual())\n                {\n                    VMA_VALIDATE((VkDeviceSize)alloc->GetAllocHandle() == suballoc.offset + 1);\n                    VMA_VALIDATE(alloc->GetSize() == suballoc.size);\n                }\n                sumUsedSize += suballoc.size;\n            }\n            else\n            {\n                ++nullItem2ndCount;\n            }\n\n            offset = suballoc.offset + suballoc.size + debugMargin;\n        }\n\n        VMA_VALIDATE(nullItem2ndCount == m_2ndNullItemsCount);\n    }\n\n    for (size_t i = 0; i < m_1stNullItemsBeginCount; ++i)\n    {\n        const VmaSuballocation& suballoc = suballocations1st[i];\n        VMA_VALIDATE(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE &&\n            suballoc.userData == VMA_NULL);\n    }\n\n    size_t nullItem1stCount = m_1stNullItemsBeginCount;\n\n    for (size_t i = m_1stNullItemsBeginCount; i < suballoc1stCount; ++i)\n    {\n        const VmaSuballocation& suballoc = suballocations1st[i];\n        const bool currFree = (suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);\n\n        VmaAllocation const alloc = (VmaAllocation)suballoc.userData;\n        if (!IsVirtual())\n        {\n            VMA_VALIDATE(currFree == (alloc == VK_NULL_HANDLE));\n        }\n        VMA_VALIDATE(suballoc.offset >= offset);\n        VMA_VALIDATE(i >= m_1stNullItemsBeginCount || currFree);\n\n        if (!currFree)\n        {\n            if (!IsVirtual())\n            {\n                VMA_VALIDATE((VkDeviceSize)alloc->GetAllocHandle() == suballoc.offset + 1);\n                VMA_VALIDATE(alloc->GetSize() == suballoc.size);\n            }\n            sumUsedSize += suballoc.size;\n        }\n        else\n        {\n            ++nullItem1stCount;\n        }\n\n        offset = suballoc.offset + suballoc.size + debugMargin;\n    }\n    VMA_VALIDATE(nullItem1stCount == m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount);\n\n    if (m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)\n    {\n        const size_t suballoc2ndCount = suballocations2nd.size();\n        size_t nullItem2ndCount = 0;\n        for (size_t i = suballoc2ndCount; i--; )\n        {\n            const VmaSuballocation& suballoc = suballocations2nd[i];\n            const bool currFree = (suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);\n\n            VmaAllocation const alloc = (VmaAllocation)suballoc.userData;\n            if (!IsVirtual())\n            {\n                VMA_VALIDATE(currFree == (alloc == VK_NULL_HANDLE));\n            }\n            VMA_VALIDATE(suballoc.offset >= offset);\n\n            if (!currFree)\n            {\n                if (!IsVirtual())\n                {\n                    VMA_VALIDATE((VkDeviceSize)alloc->GetAllocHandle() == suballoc.offset + 1);\n                    VMA_VALIDATE(alloc->GetSize() == suballoc.size);\n                }\n                sumUsedSize += suballoc.size;\n            }\n            else\n            {\n                ++nullItem2ndCount;\n            }\n\n            offset = suballoc.offset + suballoc.size + debugMargin;\n        }\n\n        VMA_VALIDATE(nullItem2ndCount == m_2ndNullItemsCount);\n    }\n\n    VMA_VALIDATE(offset <= GetSize());\n    VMA_VALIDATE(m_SumFreeSize == GetSize() - sumUsedSize);\n\n    return true;\n}\n\nsize_t VmaBlockMetadata_Linear::GetAllocationCount() const\n{\n    return AccessSuballocations1st().size() - m_1stNullItemsBeginCount - m_1stNullItemsMiddleCount +\n        AccessSuballocations2nd().size() - m_2ndNullItemsCount;\n}\n\nsize_t VmaBlockMetadata_Linear::GetFreeRegionsCount() const\n{\n    // Function only used for defragmentation, which is disabled for this algorithm\n    VMA_ASSERT(0);\n    return SIZE_MAX;\n}\n\nvoid VmaBlockMetadata_Linear::AddDetailedStatistics(VmaDetailedStatistics& inoutStats) const\n{\n    const VkDeviceSize size = GetSize();\n    const SuballocationVectorType& suballocations1st = AccessSuballocations1st();\n    const SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();\n    const size_t suballoc1stCount = suballocations1st.size();\n    const size_t suballoc2ndCount = suballocations2nd.size();\n\n    inoutStats.statistics.blockCount++;\n    inoutStats.statistics.blockBytes += size;\n\n    VkDeviceSize lastOffset = 0;\n\n    if (m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)\n    {\n        const VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;\n        size_t nextAlloc2ndIndex = 0;\n        while (lastOffset < freeSpace2ndTo1stEnd)\n        {\n            // Find next non-null allocation or move nextAllocIndex to the end.\n            while (nextAlloc2ndIndex < suballoc2ndCount &&\n                suballocations2nd[nextAlloc2ndIndex].userData == VMA_NULL)\n            {\n                ++nextAlloc2ndIndex;\n            }\n\n            // Found non-null allocation.\n            if (nextAlloc2ndIndex < suballoc2ndCount)\n            {\n                const VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];\n\n                // 1. Process free space before this allocation.\n                if (lastOffset < suballoc.offset)\n                {\n                    // There is free space from lastOffset to suballoc.offset.\n                    const VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;\n                    VmaAddDetailedStatisticsUnusedRange(inoutStats, unusedRangeSize);\n                }\n\n                // 2. Process this allocation.\n                // There is allocation with suballoc.offset, suballoc.size.\n                VmaAddDetailedStatisticsAllocation(inoutStats, suballoc.size);\n\n                // 3. Prepare for next iteration.\n                lastOffset = suballoc.offset + suballoc.size;\n                ++nextAlloc2ndIndex;\n            }\n            // We are at the end.\n            else\n            {\n                // There is free space from lastOffset to freeSpace2ndTo1stEnd.\n                if (lastOffset < freeSpace2ndTo1stEnd)\n                {\n                    const VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;\n                    VmaAddDetailedStatisticsUnusedRange(inoutStats, unusedRangeSize);\n                }\n\n                // End of loop.\n                lastOffset = freeSpace2ndTo1stEnd;\n            }\n        }\n    }\n\n    size_t nextAlloc1stIndex = m_1stNullItemsBeginCount;\n    const VkDeviceSize freeSpace1stTo2ndEnd =\n        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;\n    while (lastOffset < freeSpace1stTo2ndEnd)\n    {\n        // Find next non-null allocation or move nextAllocIndex to the end.\n        while (nextAlloc1stIndex < suballoc1stCount &&\n            suballocations1st[nextAlloc1stIndex].userData == VMA_NULL)\n        {\n            ++nextAlloc1stIndex;\n        }\n\n        // Found non-null allocation.\n        if (nextAlloc1stIndex < suballoc1stCount)\n        {\n            const VmaSuballocation& suballoc = suballocations1st[nextAlloc1stIndex];\n\n            // 1. Process free space before this allocation.\n            if (lastOffset < suballoc.offset)\n            {\n                // There is free space from lastOffset to suballoc.offset.\n                const VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;\n                VmaAddDetailedStatisticsUnusedRange(inoutStats, unusedRangeSize);\n            }\n\n            // 2. Process this allocation.\n            // There is allocation with suballoc.offset, suballoc.size.\n            VmaAddDetailedStatisticsAllocation(inoutStats, suballoc.size);\n\n            // 3. Prepare for next iteration.\n            lastOffset = suballoc.offset + suballoc.size;\n            ++nextAlloc1stIndex;\n        }\n        // We are at the end.\n        else\n        {\n            // There is free space from lastOffset to freeSpace1stTo2ndEnd.\n            if (lastOffset < freeSpace1stTo2ndEnd)\n            {\n                const VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;\n                VmaAddDetailedStatisticsUnusedRange(inoutStats, unusedRangeSize);\n            }\n\n            // End of loop.\n            lastOffset = freeSpace1stTo2ndEnd;\n        }\n    }\n\n    if (m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)\n    {\n        size_t nextAlloc2ndIndex = suballocations2nd.size() - 1;\n        while (lastOffset < size)\n        {\n            // Find next non-null allocation or move nextAllocIndex to the end.\n            while (nextAlloc2ndIndex != SIZE_MAX &&\n                suballocations2nd[nextAlloc2ndIndex].userData == VMA_NULL)\n            {\n                --nextAlloc2ndIndex;\n            }\n\n            // Found non-null allocation.\n            if (nextAlloc2ndIndex != SIZE_MAX)\n            {\n                const VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];\n\n                // 1. Process free space before this allocation.\n                if (lastOffset < suballoc.offset)\n                {\n                    // There is free space from lastOffset to suballoc.offset.\n                    const VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;\n                    VmaAddDetailedStatisticsUnusedRange(inoutStats, unusedRangeSize);\n                }\n\n                // 2. Process this allocation.\n                // There is allocation with suballoc.offset, suballoc.size.\n                VmaAddDetailedStatisticsAllocation(inoutStats, suballoc.size);\n\n                // 3. Prepare for next iteration.\n                lastOffset = suballoc.offset + suballoc.size;\n                --nextAlloc2ndIndex;\n            }\n            // We are at the end.\n            else\n            {\n                // There is free space from lastOffset to size.\n                if (lastOffset < size)\n                {\n                    const VkDeviceSize unusedRangeSize = size - lastOffset;\n                    VmaAddDetailedStatisticsUnusedRange(inoutStats, unusedRangeSize);\n                }\n\n                // End of loop.\n                lastOffset = size;\n            }\n        }\n    }\n}\n\nvoid VmaBlockMetadata_Linear::AddStatistics(VmaStatistics& inoutStats) const\n{\n    const SuballocationVectorType& suballocations1st = AccessSuballocations1st();\n    const SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();\n    const VkDeviceSize size = GetSize();\n    const size_t suballoc1stCount = suballocations1st.size();\n    const size_t suballoc2ndCount = suballocations2nd.size();\n\n    inoutStats.blockCount++;\n    inoutStats.blockBytes += size;\n    inoutStats.allocationBytes += size - m_SumFreeSize;\n\n    VkDeviceSize lastOffset = 0;\n\n    if (m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)\n    {\n        const VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;\n        size_t nextAlloc2ndIndex = m_1stNullItemsBeginCount;\n        while (lastOffset < freeSpace2ndTo1stEnd)\n        {\n            // Find next non-null allocation or move nextAlloc2ndIndex to the end.\n            while (nextAlloc2ndIndex < suballoc2ndCount &&\n                suballocations2nd[nextAlloc2ndIndex].userData == VMA_NULL)\n            {\n                ++nextAlloc2ndIndex;\n            }\n\n            // Found non-null allocation.\n            if (nextAlloc2ndIndex < suballoc2ndCount)\n            {\n                const VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];\n\n                // Process this allocation.\n                // There is allocation with suballoc.offset, suballoc.size.\n                ++inoutStats.allocationCount;\n\n                // Prepare for next iteration.\n                lastOffset = suballoc.offset + suballoc.size;\n                ++nextAlloc2ndIndex;\n            }\n            // We are at the end.\n            else\n            {\n                // End of loop.\n                lastOffset = freeSpace2ndTo1stEnd;\n            }\n        }\n    }\n\n    size_t nextAlloc1stIndex = m_1stNullItemsBeginCount;\n    const VkDeviceSize freeSpace1stTo2ndEnd =\n        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;\n    while (lastOffset < freeSpace1stTo2ndEnd)\n    {\n        // Find next non-null allocation or move nextAllocIndex to the end.\n        while (nextAlloc1stIndex < suballoc1stCount &&\n            suballocations1st[nextAlloc1stIndex].userData == VMA_NULL)\n        {\n            ++nextAlloc1stIndex;\n        }\n\n        // Found non-null allocation.\n        if (nextAlloc1stIndex < suballoc1stCount)\n        {\n            const VmaSuballocation& suballoc = suballocations1st[nextAlloc1stIndex];\n\n            // Process this allocation.\n            // There is allocation with suballoc.offset, suballoc.size.\n            ++inoutStats.allocationCount;\n\n            // Prepare for next iteration.\n            lastOffset = suballoc.offset + suballoc.size;\n            ++nextAlloc1stIndex;\n        }\n        // We are at the end.\n        else\n        {\n            // End of loop.\n            lastOffset = freeSpace1stTo2ndEnd;\n        }\n    }\n\n    if (m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)\n    {\n        size_t nextAlloc2ndIndex = suballocations2nd.size() - 1;\n        while (lastOffset < size)\n        {\n            // Find next non-null allocation or move nextAlloc2ndIndex to the end.\n            while (nextAlloc2ndIndex != SIZE_MAX &&\n                suballocations2nd[nextAlloc2ndIndex].userData == VMA_NULL)\n            {\n                --nextAlloc2ndIndex;\n            }\n\n            // Found non-null allocation.\n            if (nextAlloc2ndIndex != SIZE_MAX)\n            {\n                const VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];\n\n                // Process this allocation.\n                // There is allocation with suballoc.offset, suballoc.size.\n                ++inoutStats.allocationCount;\n\n                // Prepare for next iteration.\n                lastOffset = suballoc.offset + suballoc.size;\n                --nextAlloc2ndIndex;\n            }\n            // We are at the end.\n            else\n            {\n                // End of loop.\n                lastOffset = size;\n            }\n        }\n    }\n}\n\n#if VMA_STATS_STRING_ENABLED\nvoid VmaBlockMetadata_Linear::PrintDetailedMap(class VmaJsonWriter& json) const\n{\n    const VkDeviceSize size = GetSize();\n    const SuballocationVectorType& suballocations1st = AccessSuballocations1st();\n    const SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();\n    const size_t suballoc1stCount = suballocations1st.size();\n    const size_t suballoc2ndCount = suballocations2nd.size();\n\n    // FIRST PASS\n\n    size_t unusedRangeCount = 0;\n    VkDeviceSize usedBytes = 0;\n\n    VkDeviceSize lastOffset = 0;\n\n    size_t alloc2ndCount = 0;\n    if (m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)\n    {\n        const VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;\n        size_t nextAlloc2ndIndex = 0;\n        while (lastOffset < freeSpace2ndTo1stEnd)\n        {\n            // Find next non-null allocation or move nextAlloc2ndIndex to the end.\n            while (nextAlloc2ndIndex < suballoc2ndCount &&\n                suballocations2nd[nextAlloc2ndIndex].userData == VMA_NULL)\n            {\n                ++nextAlloc2ndIndex;\n            }\n\n            // Found non-null allocation.\n            if (nextAlloc2ndIndex < suballoc2ndCount)\n            {\n                const VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];\n\n                // 1. Process free space before this allocation.\n                if (lastOffset < suballoc.offset)\n                {\n                    // There is free space from lastOffset to suballoc.offset.\n                    ++unusedRangeCount;\n                }\n\n                // 2. Process this allocation.\n                // There is allocation with suballoc.offset, suballoc.size.\n                ++alloc2ndCount;\n                usedBytes += suballoc.size;\n\n                // 3. Prepare for next iteration.\n                lastOffset = suballoc.offset + suballoc.size;\n                ++nextAlloc2ndIndex;\n            }\n            // We are at the end.\n            else\n            {\n                if (lastOffset < freeSpace2ndTo1stEnd)\n                {\n                    // There is free space from lastOffset to freeSpace2ndTo1stEnd.\n                    ++unusedRangeCount;\n                }\n\n                // End of loop.\n                lastOffset = freeSpace2ndTo1stEnd;\n            }\n        }\n    }\n\n    size_t nextAlloc1stIndex = m_1stNullItemsBeginCount;\n    size_t alloc1stCount = 0;\n    const VkDeviceSize freeSpace1stTo2ndEnd =\n        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;\n    while (lastOffset < freeSpace1stTo2ndEnd)\n    {\n        // Find next non-null allocation or move nextAllocIndex to the end.\n        while (nextAlloc1stIndex < suballoc1stCount &&\n            suballocations1st[nextAlloc1stIndex].userData == VMA_NULL)\n        {\n            ++nextAlloc1stIndex;\n        }\n\n        // Found non-null allocation.\n        if (nextAlloc1stIndex < suballoc1stCount)\n        {\n            const VmaSuballocation& suballoc = suballocations1st[nextAlloc1stIndex];\n\n            // 1. Process free space before this allocation.\n            if (lastOffset < suballoc.offset)\n            {\n                // There is free space from lastOffset to suballoc.offset.\n                ++unusedRangeCount;\n            }\n\n            // 2. Process this allocation.\n            // There is allocation with suballoc.offset, suballoc.size.\n            ++alloc1stCount;\n            usedBytes += suballoc.size;\n\n            // 3. Prepare for next iteration.\n            lastOffset = suballoc.offset + suballoc.size;\n            ++nextAlloc1stIndex;\n        }\n        // We are at the end.\n        else\n        {\n            if (lastOffset < freeSpace1stTo2ndEnd)\n            {\n                // There is free space from lastOffset to freeSpace1stTo2ndEnd.\n                ++unusedRangeCount;\n            }\n\n            // End of loop.\n            lastOffset = freeSpace1stTo2ndEnd;\n        }\n    }\n\n    if (m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)\n    {\n        size_t nextAlloc2ndIndex = suballocations2nd.size() - 1;\n        while (lastOffset < size)\n        {\n            // Find next non-null allocation or move nextAlloc2ndIndex to the end.\n            while (nextAlloc2ndIndex != SIZE_MAX &&\n                suballocations2nd[nextAlloc2ndIndex].userData == VMA_NULL)\n            {\n                --nextAlloc2ndIndex;\n            }\n\n            // Found non-null allocation.\n            if (nextAlloc2ndIndex != SIZE_MAX)\n            {\n                const VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];\n\n                // 1. Process free space before this allocation.\n                if (lastOffset < suballoc.offset)\n                {\n                    // There is free space from lastOffset to suballoc.offset.\n                    ++unusedRangeCount;\n                }\n\n                // 2. Process this allocation.\n                // There is allocation with suballoc.offset, suballoc.size.\n                ++alloc2ndCount;\n                usedBytes += suballoc.size;\n\n                // 3. Prepare for next iteration.\n                lastOffset = suballoc.offset + suballoc.size;\n                --nextAlloc2ndIndex;\n            }\n            // We are at the end.\n            else\n            {\n                if (lastOffset < size)\n                {\n                    // There is free space from lastOffset to size.\n                    ++unusedRangeCount;\n                }\n\n                // End of loop.\n                lastOffset = size;\n            }\n        }\n    }\n\n    const VkDeviceSize unusedBytes = size - usedBytes;\n    PrintDetailedMap_Begin(json, unusedBytes, alloc1stCount + alloc2ndCount, unusedRangeCount);\n\n    // SECOND PASS\n    lastOffset = 0;\n\n    if (m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)\n    {\n        const VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;\n        size_t nextAlloc2ndIndex = 0;\n        while (lastOffset < freeSpace2ndTo1stEnd)\n        {\n            // Find next non-null allocation or move nextAlloc2ndIndex to the end.\n            while (nextAlloc2ndIndex < suballoc2ndCount &&\n                suballocations2nd[nextAlloc2ndIndex].userData == VMA_NULL)\n            {\n                ++nextAlloc2ndIndex;\n            }\n\n            // Found non-null allocation.\n            if (nextAlloc2ndIndex < suballoc2ndCount)\n            {\n                const VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];\n\n                // 1. Process free space before this allocation.\n                if (lastOffset < suballoc.offset)\n                {\n                    // There is free space from lastOffset to suballoc.offset.\n                    const VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;\n                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);\n                }\n\n                // 2. Process this allocation.\n                // There is allocation with suballoc.offset, suballoc.size.\n                PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.size, suballoc.userData);\n\n                // 3. Prepare for next iteration.\n                lastOffset = suballoc.offset + suballoc.size;\n                ++nextAlloc2ndIndex;\n            }\n            // We are at the end.\n            else\n            {\n                if (lastOffset < freeSpace2ndTo1stEnd)\n                {\n                    // There is free space from lastOffset to freeSpace2ndTo1stEnd.\n                    const VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;\n                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);\n                }\n\n                // End of loop.\n                lastOffset = freeSpace2ndTo1stEnd;\n            }\n        }\n    }\n\n    nextAlloc1stIndex = m_1stNullItemsBeginCount;\n    while (lastOffset < freeSpace1stTo2ndEnd)\n    {\n        // Find next non-null allocation or move nextAllocIndex to the end.\n        while (nextAlloc1stIndex < suballoc1stCount &&\n            suballocations1st[nextAlloc1stIndex].userData == VMA_NULL)\n        {\n            ++nextAlloc1stIndex;\n        }\n\n        // Found non-null allocation.\n        if (nextAlloc1stIndex < suballoc1stCount)\n        {\n            const VmaSuballocation& suballoc = suballocations1st[nextAlloc1stIndex];\n\n            // 1. Process free space before this allocation.\n            if (lastOffset < suballoc.offset)\n            {\n                // There is free space from lastOffset to suballoc.offset.\n                const VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;\n                PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);\n            }\n\n            // 2. Process this allocation.\n            // There is allocation with suballoc.offset, suballoc.size.\n            PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.size, suballoc.userData);\n\n            // 3. Prepare for next iteration.\n            lastOffset = suballoc.offset + suballoc.size;\n            ++nextAlloc1stIndex;\n        }\n        // We are at the end.\n        else\n        {\n            if (lastOffset < freeSpace1stTo2ndEnd)\n            {\n                // There is free space from lastOffset to freeSpace1stTo2ndEnd.\n                const VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;\n                PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);\n            }\n\n            // End of loop.\n            lastOffset = freeSpace1stTo2ndEnd;\n        }\n    }\n\n    if (m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)\n    {\n        size_t nextAlloc2ndIndex = suballocations2nd.size() - 1;\n        while (lastOffset < size)\n        {\n            // Find next non-null allocation or move nextAlloc2ndIndex to the end.\n            while (nextAlloc2ndIndex != SIZE_MAX &&\n                suballocations2nd[nextAlloc2ndIndex].userData == VMA_NULL)\n            {\n                --nextAlloc2ndIndex;\n            }\n\n            // Found non-null allocation.\n            if (nextAlloc2ndIndex != SIZE_MAX)\n            {\n                const VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];\n\n                // 1. Process free space before this allocation.\n                if (lastOffset < suballoc.offset)\n                {\n                    // There is free space from lastOffset to suballoc.offset.\n                    const VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;\n                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);\n                }\n\n                // 2. Process this allocation.\n                // There is allocation with suballoc.offset, suballoc.size.\n                PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.size, suballoc.userData);\n\n                // 3. Prepare for next iteration.\n                lastOffset = suballoc.offset + suballoc.size;\n                --nextAlloc2ndIndex;\n            }\n            // We are at the end.\n            else\n            {\n                if (lastOffset < size)\n                {\n                    // There is free space from lastOffset to size.\n                    const VkDeviceSize unusedRangeSize = size - lastOffset;\n                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);\n                }\n\n                // End of loop.\n                lastOffset = size;\n            }\n        }\n    }\n\n    PrintDetailedMap_End(json);\n}\n#endif // VMA_STATS_STRING_ENABLED\n\nbool VmaBlockMetadata_Linear::CreateAllocationRequest(\n    VkDeviceSize allocSize,\n    VkDeviceSize allocAlignment,\n    bool upperAddress,\n    VmaSuballocationType allocType,\n    uint32_t strategy,\n    VmaAllocationRequest* pAllocationRequest)\n{\n    VMA_ASSERT(allocSize > 0);\n    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);\n    VMA_ASSERT(pAllocationRequest != VMA_NULL);\n    VMA_HEAVY_ASSERT(Validate());\n\n    if(allocSize > GetSize())\n        return false;\n\n    pAllocationRequest->size = allocSize;\n    return upperAddress ?\n        CreateAllocationRequest_UpperAddress(\n            allocSize, allocAlignment, allocType, strategy, pAllocationRequest) :\n        CreateAllocationRequest_LowerAddress(\n            allocSize, allocAlignment, allocType, strategy, pAllocationRequest);\n}\n\nVkResult VmaBlockMetadata_Linear::CheckCorruption(const void* pBlockData)\n{\n    VMA_ASSERT(!IsVirtual());\n    SuballocationVectorType& suballocations1st = AccessSuballocations1st();\n    for (size_t i = m_1stNullItemsBeginCount, count = suballocations1st.size(); i < count; ++i)\n    {\n        const VmaSuballocation& suballoc = suballocations1st[i];\n        if (suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)\n        {\n            if (!VmaValidateMagicValue(pBlockData, suballoc.offset + suballoc.size))\n            {\n                VMA_ASSERT(0 && \"MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!\");\n                return VK_ERROR_UNKNOWN_COPY;\n            }\n        }\n    }\n\n    SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();\n    for (size_t i = 0, count = suballocations2nd.size(); i < count; ++i)\n    {\n        const VmaSuballocation& suballoc = suballocations2nd[i];\n        if (suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)\n        {\n            if (!VmaValidateMagicValue(pBlockData, suballoc.offset + suballoc.size))\n            {\n                VMA_ASSERT(0 && \"MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!\");\n                return VK_ERROR_UNKNOWN_COPY;\n            }\n        }\n    }\n\n    return VK_SUCCESS;\n}\n\nvoid VmaBlockMetadata_Linear::Alloc(\n    const VmaAllocationRequest& request,\n    VmaSuballocationType type,\n    void* userData)\n{\n    const VkDeviceSize offset = (VkDeviceSize)request.allocHandle - 1;\n    const VmaSuballocation newSuballoc = { offset, request.size, userData, type };\n\n    switch (request.type)\n    {\n    case VmaAllocationRequestType::UpperAddress:\n    {\n        VMA_ASSERT(m_2ndVectorMode != SECOND_VECTOR_RING_BUFFER &&\n            \"CRITICAL ERROR: Trying to use linear allocator as double stack while it was already used as ring buffer.\");\n        SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();\n        suballocations2nd.push_back(newSuballoc);\n        m_2ndVectorMode = SECOND_VECTOR_DOUBLE_STACK;\n    }\n    break;\n    case VmaAllocationRequestType::EndOf1st:\n    {\n        SuballocationVectorType& suballocations1st = AccessSuballocations1st();\n\n        VMA_ASSERT(suballocations1st.empty() ||\n            offset >= suballocations1st.back().offset + suballocations1st.back().size);\n        // Check if it fits before the end of the block.\n        VMA_ASSERT(offset + request.size <= GetSize());\n\n        suballocations1st.push_back(newSuballoc);\n    }\n    break;\n    case VmaAllocationRequestType::EndOf2nd:\n    {\n        SuballocationVectorType& suballocations1st = AccessSuballocations1st();\n        // New allocation at the end of 2-part ring buffer, so before first allocation from 1st vector.\n        VMA_ASSERT(!suballocations1st.empty() &&\n            offset + request.size <= suballocations1st[m_1stNullItemsBeginCount].offset);\n        SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();\n\n        switch (m_2ndVectorMode)\n        {\n        case SECOND_VECTOR_EMPTY:\n            // First allocation from second part ring buffer.\n            VMA_ASSERT(suballocations2nd.empty());\n            m_2ndVectorMode = SECOND_VECTOR_RING_BUFFER;\n            break;\n        case SECOND_VECTOR_RING_BUFFER:\n            // 2-part ring buffer is already started.\n            VMA_ASSERT(!suballocations2nd.empty());\n            break;\n        case SECOND_VECTOR_DOUBLE_STACK:\n            VMA_ASSERT(0 && \"CRITICAL ERROR: Trying to use linear allocator as ring buffer while it was already used as double stack.\");\n            break;\n        default:\n            VMA_ASSERT(0);\n        }\n\n        suballocations2nd.push_back(newSuballoc);\n    }\n    break;\n    default:\n        VMA_ASSERT(0 && \"CRITICAL INTERNAL ERROR.\");\n    }\n\n    m_SumFreeSize -= newSuballoc.size;\n}\n\nvoid VmaBlockMetadata_Linear::Free(VmaAllocHandle allocHandle)\n{\n    SuballocationVectorType& suballocations1st = AccessSuballocations1st();\n    SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();\n    VkDeviceSize offset = (VkDeviceSize)allocHandle - 1;\n\n    if (!suballocations1st.empty())\n    {\n        // First allocation: Mark it as next empty at the beginning.\n        VmaSuballocation& firstSuballoc = suballocations1st[m_1stNullItemsBeginCount];\n        if (firstSuballoc.offset == offset)\n        {\n            firstSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;\n            firstSuballoc.userData = VMA_NULL;\n            m_SumFreeSize += firstSuballoc.size;\n            ++m_1stNullItemsBeginCount;\n            CleanupAfterFree();\n            return;\n        }\n    }\n\n    // Last allocation in 2-part ring buffer or top of upper stack (same logic).\n    if (m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER ||\n        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)\n    {\n        VmaSuballocation& lastSuballoc = suballocations2nd.back();\n        if (lastSuballoc.offset == offset)\n        {\n            m_SumFreeSize += lastSuballoc.size;\n            suballocations2nd.pop_back();\n            CleanupAfterFree();\n            return;\n        }\n    }\n    // Last allocation in 1st vector.\n    else if (m_2ndVectorMode == SECOND_VECTOR_EMPTY)\n    {\n        VmaSuballocation& lastSuballoc = suballocations1st.back();\n        if (lastSuballoc.offset == offset)\n        {\n            m_SumFreeSize += lastSuballoc.size;\n            suballocations1st.pop_back();\n            CleanupAfterFree();\n            return;\n        }\n    }\n\n    VmaSuballocation refSuballoc;\n    refSuballoc.offset = offset;\n    // Rest of members stays uninitialized intentionally for better performance.\n\n    // Item from the middle of 1st vector.\n    {\n        const SuballocationVectorType::iterator it = VmaBinaryFindSorted(\n            suballocations1st.begin() + m_1stNullItemsBeginCount,\n            suballocations1st.end(),\n            refSuballoc,\n            VmaSuballocationOffsetLess());\n        if (it != suballocations1st.end())\n        {\n            it->type = VMA_SUBALLOCATION_TYPE_FREE;\n            it->userData = VMA_NULL;\n            ++m_1stNullItemsMiddleCount;\n            m_SumFreeSize += it->size;\n            CleanupAfterFree();\n            return;\n        }\n    }\n\n    if (m_2ndVectorMode != SECOND_VECTOR_EMPTY)\n    {\n        // Item from the middle of 2nd vector.\n        const SuballocationVectorType::iterator it = m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER ?\n            VmaBinaryFindSorted(suballocations2nd.begin(), suballocations2nd.end(), refSuballoc, VmaSuballocationOffsetLess()) :\n            VmaBinaryFindSorted(suballocations2nd.begin(), suballocations2nd.end(), refSuballoc, VmaSuballocationOffsetGreater());\n        if (it != suballocations2nd.end())\n        {\n            it->type = VMA_SUBALLOCATION_TYPE_FREE;\n            it->userData = VMA_NULL;\n            ++m_2ndNullItemsCount;\n            m_SumFreeSize += it->size;\n            CleanupAfterFree();\n            return;\n        }\n    }\n\n    VMA_ASSERT(0 && \"Allocation to free not found in linear allocator!\");\n}\n\nvoid VmaBlockMetadata_Linear::GetAllocationInfo(VmaAllocHandle allocHandle, VmaVirtualAllocationInfo& outInfo)\n{\n    outInfo.offset = (VkDeviceSize)allocHandle - 1;\n    VmaSuballocation& suballoc = FindSuballocation(outInfo.offset);\n    outInfo.size = suballoc.size;\n    outInfo.pUserData = suballoc.userData;\n}\n\nvoid* VmaBlockMetadata_Linear::GetAllocationUserData(VmaAllocHandle allocHandle) const\n{\n    return FindSuballocation((VkDeviceSize)allocHandle - 1).userData;\n}\n\nVmaAllocHandle VmaBlockMetadata_Linear::GetAllocationListBegin() const\n{\n    // Function only used for defragmentation, which is disabled for this algorithm\n    VMA_ASSERT(0);\n    return VK_NULL_HANDLE;\n}\n\nVmaAllocHandle VmaBlockMetadata_Linear::GetNextAllocation(VmaAllocHandle prevAlloc) const\n{\n    // Function only used for defragmentation, which is disabled for this algorithm\n    VMA_ASSERT(0);\n    return VK_NULL_HANDLE;\n}\n\nVkDeviceSize VmaBlockMetadata_Linear::GetNextFreeRegionSize(VmaAllocHandle alloc) const\n{\n    // Function only used for defragmentation, which is disabled for this algorithm\n    VMA_ASSERT(0);\n    return 0;\n}\n\nvoid VmaBlockMetadata_Linear::Clear()\n{\n    m_SumFreeSize = GetSize();\n    m_Suballocations0.clear();\n    m_Suballocations1.clear();\n    // Leaving m_1stVectorIndex unchanged - it doesn't matter.\n    m_2ndVectorMode = SECOND_VECTOR_EMPTY;\n    m_1stNullItemsBeginCount = 0;\n    m_1stNullItemsMiddleCount = 0;\n    m_2ndNullItemsCount = 0;\n}\n\nvoid VmaBlockMetadata_Linear::SetAllocationUserData(VmaAllocHandle allocHandle, void* userData)\n{\n    VmaSuballocation& suballoc = FindSuballocation((VkDeviceSize)allocHandle - 1);\n    suballoc.userData = userData;\n}\n\nvoid VmaBlockMetadata_Linear::DebugLogAllAllocations() const\n{\n    const SuballocationVectorType& suballocations1st = AccessSuballocations1st();\n    for (auto it = suballocations1st.begin() + m_1stNullItemsBeginCount; it != suballocations1st.end(); ++it)\n        if (it->type != VMA_SUBALLOCATION_TYPE_FREE)\n            DebugLogAllocation(it->offset, it->size, it->userData);\n\n    const SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();\n    for (auto it = suballocations2nd.begin(); it != suballocations2nd.end(); ++it)\n        if (it->type != VMA_SUBALLOCATION_TYPE_FREE)\n            DebugLogAllocation(it->offset, it->size, it->userData);\n}\n\nVmaSuballocation& VmaBlockMetadata_Linear::FindSuballocation(VkDeviceSize offset) const\n{\n    const SuballocationVectorType& suballocations1st = AccessSuballocations1st();\n    const SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();\n\n    VmaSuballocation refSuballoc;\n    refSuballoc.offset = offset;\n    // Rest of members stays uninitialized intentionally for better performance.\n\n    // Item from the 1st vector.\n    {\n        SuballocationVectorType::const_iterator it = VmaBinaryFindSorted(\n            suballocations1st.begin() + m_1stNullItemsBeginCount,\n            suballocations1st.end(),\n            refSuballoc,\n            VmaSuballocationOffsetLess());\n        if (it != suballocations1st.end())\n        {\n            return const_cast<VmaSuballocation&>(*it);\n        }\n    }\n\n    if (m_2ndVectorMode != SECOND_VECTOR_EMPTY)\n    {\n        // Rest of members stays uninitialized intentionally for better performance.\n        SuballocationVectorType::const_iterator it = m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER ?\n            VmaBinaryFindSorted(suballocations2nd.begin(), suballocations2nd.end(), refSuballoc, VmaSuballocationOffsetLess()) :\n            VmaBinaryFindSorted(suballocations2nd.begin(), suballocations2nd.end(), refSuballoc, VmaSuballocationOffsetGreater());\n        if (it != suballocations2nd.end())\n        {\n            return const_cast<VmaSuballocation&>(*it);\n        }\n    }\n\n    VMA_ASSERT(0 && \"Allocation not found in linear allocator!\");\n    return const_cast<VmaSuballocation&>(suballocations1st.back()); // Should never occur.\n}\n\nbool VmaBlockMetadata_Linear::ShouldCompact1st() const\n{\n    const size_t nullItemCount = m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount;\n    const size_t suballocCount = AccessSuballocations1st().size();\n    return suballocCount > 32 && nullItemCount * 2 >= (suballocCount - nullItemCount) * 3;\n}\n\nvoid VmaBlockMetadata_Linear::CleanupAfterFree()\n{\n    SuballocationVectorType& suballocations1st = AccessSuballocations1st();\n    SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();\n\n    if (IsEmpty())\n    {\n        suballocations1st.clear();\n        suballocations2nd.clear();\n        m_1stNullItemsBeginCount = 0;\n        m_1stNullItemsMiddleCount = 0;\n        m_2ndNullItemsCount = 0;\n        m_2ndVectorMode = SECOND_VECTOR_EMPTY;\n    }\n    else\n    {\n        const size_t suballoc1stCount = suballocations1st.size();\n        const size_t nullItem1stCount = m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount;\n        VMA_ASSERT(nullItem1stCount <= suballoc1stCount);\n\n        // Find more null items at the beginning of 1st vector.\n        while (m_1stNullItemsBeginCount < suballoc1stCount &&\n            suballocations1st[m_1stNullItemsBeginCount].type == VMA_SUBALLOCATION_TYPE_FREE)\n        {\n            ++m_1stNullItemsBeginCount;\n            --m_1stNullItemsMiddleCount;\n        }\n\n        // Find more null items at the end of 1st vector.\n        while (m_1stNullItemsMiddleCount > 0 &&\n            suballocations1st.back().type == VMA_SUBALLOCATION_TYPE_FREE)\n        {\n            --m_1stNullItemsMiddleCount;\n            suballocations1st.pop_back();\n        }\n\n        // Find more null items at the end of 2nd vector.\n        while (m_2ndNullItemsCount > 0 &&\n            suballocations2nd.back().type == VMA_SUBALLOCATION_TYPE_FREE)\n        {\n            --m_2ndNullItemsCount;\n            suballocations2nd.pop_back();\n        }\n\n        // Find more null items at the beginning of 2nd vector.\n        while (m_2ndNullItemsCount > 0 &&\n            suballocations2nd[0].type == VMA_SUBALLOCATION_TYPE_FREE)\n        {\n            --m_2ndNullItemsCount;\n            VmaVectorRemove(suballocations2nd, 0);\n        }\n\n        if (ShouldCompact1st())\n        {\n            const size_t nonNullItemCount = suballoc1stCount - nullItem1stCount;\n            size_t srcIndex = m_1stNullItemsBeginCount;\n            for (size_t dstIndex = 0; dstIndex < nonNullItemCount; ++dstIndex)\n            {\n                while (suballocations1st[srcIndex].type == VMA_SUBALLOCATION_TYPE_FREE)\n                {\n                    ++srcIndex;\n                }\n                if (dstIndex != srcIndex)\n                {\n                    suballocations1st[dstIndex] = suballocations1st[srcIndex];\n                }\n                ++srcIndex;\n            }\n            suballocations1st.resize(nonNullItemCount);\n            m_1stNullItemsBeginCount = 0;\n            m_1stNullItemsMiddleCount = 0;\n        }\n\n        // 2nd vector became empty.\n        if (suballocations2nd.empty())\n        {\n            m_2ndVectorMode = SECOND_VECTOR_EMPTY;\n        }\n\n        // 1st vector became empty.\n        if (suballocations1st.size() - m_1stNullItemsBeginCount == 0)\n        {\n            suballocations1st.clear();\n            m_1stNullItemsBeginCount = 0;\n\n            if (!suballocations2nd.empty() && m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)\n            {\n                // Swap 1st with 2nd. Now 2nd is empty.\n                m_2ndVectorMode = SECOND_VECTOR_EMPTY;\n                m_1stNullItemsMiddleCount = m_2ndNullItemsCount;\n                while (m_1stNullItemsBeginCount < suballocations2nd.size() &&\n                    suballocations2nd[m_1stNullItemsBeginCount].type == VMA_SUBALLOCATION_TYPE_FREE)\n                {\n                    ++m_1stNullItemsBeginCount;\n                    --m_1stNullItemsMiddleCount;\n                }\n                m_2ndNullItemsCount = 0;\n                m_1stVectorIndex ^= 1;\n            }\n        }\n    }\n\n    VMA_HEAVY_ASSERT(Validate());\n}\n\nbool VmaBlockMetadata_Linear::CreateAllocationRequest_LowerAddress(\n    VkDeviceSize allocSize,\n    VkDeviceSize allocAlignment,\n    VmaSuballocationType allocType,\n    uint32_t strategy,\n    VmaAllocationRequest* pAllocationRequest)\n{\n    const VkDeviceSize blockSize = GetSize();\n    const VkDeviceSize debugMargin = GetDebugMargin();\n    const VkDeviceSize bufferImageGranularity = GetBufferImageGranularity();\n    SuballocationVectorType& suballocations1st = AccessSuballocations1st();\n    SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();\n\n    if (m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)\n    {\n        // Try to allocate at the end of 1st vector.\n\n        VkDeviceSize resultBaseOffset = 0;\n        if (!suballocations1st.empty())\n        {\n            const VmaSuballocation& lastSuballoc = suballocations1st.back();\n            resultBaseOffset = lastSuballoc.offset + lastSuballoc.size + debugMargin;\n        }\n\n        // Start from offset equal to beginning of free space.\n        VkDeviceSize resultOffset = resultBaseOffset;\n\n        // Apply alignment.\n        resultOffset = VmaAlignUp(resultOffset, allocAlignment);\n\n        // Check previous suballocations for BufferImageGranularity conflicts.\n        // Make bigger alignment if necessary.\n        if (bufferImageGranularity > 1 && bufferImageGranularity != allocAlignment && !suballocations1st.empty())\n        {\n            bool bufferImageGranularityConflict = false;\n            for (size_t prevSuballocIndex = suballocations1st.size(); prevSuballocIndex--; )\n            {\n                const VmaSuballocation& prevSuballoc = suballocations1st[prevSuballocIndex];\n                if (VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))\n                {\n                    if (VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))\n                    {\n                        bufferImageGranularityConflict = true;\n                        break;\n                    }\n                }\n                else\n                    // Already on previous page.\n                    break;\n            }\n            if (bufferImageGranularityConflict)\n            {\n                resultOffset = VmaAlignUp(resultOffset, bufferImageGranularity);\n            }\n        }\n\n        const VkDeviceSize freeSpaceEnd = m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ?\n            suballocations2nd.back().offset : blockSize;\n\n        // There is enough free space at the end after alignment.\n        if (resultOffset + allocSize + debugMargin <= freeSpaceEnd)\n        {\n            // Check next suballocations for BufferImageGranularity conflicts.\n            // If conflict exists, allocation cannot be made here.\n            if ((allocSize % bufferImageGranularity || resultOffset % bufferImageGranularity) && m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)\n            {\n                for (size_t nextSuballocIndex = suballocations2nd.size(); nextSuballocIndex--; )\n                {\n                    const VmaSuballocation& nextSuballoc = suballocations2nd[nextSuballocIndex];\n                    if (VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))\n                    {\n                        if (VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))\n                        {\n                            return false;\n                        }\n                    }\n                    else\n                    {\n                        // Already on previous page.\n                        break;\n                    }\n                }\n            }\n\n            // All tests passed: Success.\n            pAllocationRequest->allocHandle = (VmaAllocHandle)(resultOffset + 1);\n            // pAllocationRequest->item, customData unused.\n            pAllocationRequest->type = VmaAllocationRequestType::EndOf1st;\n            return true;\n        }\n    }\n\n    // Wrap-around to end of 2nd vector. Try to allocate there, watching for the\n    // beginning of 1st vector as the end of free space.\n    if (m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)\n    {\n        VMA_ASSERT(!suballocations1st.empty());\n\n        VkDeviceSize resultBaseOffset = 0;\n        if (!suballocations2nd.empty())\n        {\n            const VmaSuballocation& lastSuballoc = suballocations2nd.back();\n            resultBaseOffset = lastSuballoc.offset + lastSuballoc.size + debugMargin;\n        }\n\n        // Start from offset equal to beginning of free space.\n        VkDeviceSize resultOffset = resultBaseOffset;\n\n        // Apply alignment.\n        resultOffset = VmaAlignUp(resultOffset, allocAlignment);\n\n        // Check previous suballocations for BufferImageGranularity conflicts.\n        // Make bigger alignment if necessary.\n        if (bufferImageGranularity > 1 && bufferImageGranularity != allocAlignment && !suballocations2nd.empty())\n        {\n            bool bufferImageGranularityConflict = false;\n            for (size_t prevSuballocIndex = suballocations2nd.size(); prevSuballocIndex--; )\n            {\n                const VmaSuballocation& prevSuballoc = suballocations2nd[prevSuballocIndex];\n                if (VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))\n                {\n                    if (VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))\n                    {\n                        bufferImageGranularityConflict = true;\n                        break;\n                    }\n                }\n                else\n                    // Already on previous page.\n                    break;\n            }\n            if (bufferImageGranularityConflict)\n            {\n                resultOffset = VmaAlignUp(resultOffset, bufferImageGranularity);\n            }\n        }\n\n        size_t index1st = m_1stNullItemsBeginCount;\n\n        // There is enough free space at the end after alignment.\n        if ((index1st == suballocations1st.size() && resultOffset + allocSize + debugMargin <= blockSize) ||\n            (index1st < suballocations1st.size() && resultOffset + allocSize + debugMargin <= suballocations1st[index1st].offset))\n        {\n            // Check next suballocations for BufferImageGranularity conflicts.\n            // If conflict exists, allocation cannot be made here.\n            if (allocSize % bufferImageGranularity || resultOffset % bufferImageGranularity)\n            {\n                for (size_t nextSuballocIndex = index1st;\n                    nextSuballocIndex < suballocations1st.size();\n                    nextSuballocIndex++)\n                {\n                    const VmaSuballocation& nextSuballoc = suballocations1st[nextSuballocIndex];\n                    if (VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))\n                    {\n                        if (VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))\n                        {\n                            return false;\n                        }\n                    }\n                    else\n                    {\n                        // Already on next page.\n                        break;\n                    }\n                }\n            }\n\n            // All tests passed: Success.\n            pAllocationRequest->allocHandle = (VmaAllocHandle)(resultOffset + 1);\n            pAllocationRequest->type = VmaAllocationRequestType::EndOf2nd;\n            // pAllocationRequest->item, customData unused.\n            return true;\n        }\n    }\n\n    return false;\n}\n\nbool VmaBlockMetadata_Linear::CreateAllocationRequest_UpperAddress(\n    VkDeviceSize allocSize,\n    VkDeviceSize allocAlignment,\n    VmaSuballocationType allocType,\n    uint32_t strategy,\n    VmaAllocationRequest* pAllocationRequest)\n{\n    const VkDeviceSize blockSize = GetSize();\n    const VkDeviceSize bufferImageGranularity = GetBufferImageGranularity();\n    SuballocationVectorType& suballocations1st = AccessSuballocations1st();\n    SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();\n\n    if (m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)\n    {\n        VMA_ASSERT(0 && \"Trying to use pool with linear algorithm as double stack, while it is already being used as ring buffer.\");\n        return false;\n    }\n\n    // Try to allocate before 2nd.back(), or end of block if 2nd.empty().\n    if (allocSize > blockSize)\n    {\n        return false;\n    }\n    VkDeviceSize resultBaseOffset = blockSize - allocSize;\n    if (!suballocations2nd.empty())\n    {\n        const VmaSuballocation& lastSuballoc = suballocations2nd.back();\n        resultBaseOffset = lastSuballoc.offset - allocSize;\n        if (allocSize > lastSuballoc.offset)\n        {\n            return false;\n        }\n    }\n\n    // Start from offset equal to end of free space.\n    VkDeviceSize resultOffset = resultBaseOffset;\n\n    const VkDeviceSize debugMargin = GetDebugMargin();\n\n    // Apply debugMargin at the end.\n    if (debugMargin > 0)\n    {\n        if (resultOffset < debugMargin)\n        {\n            return false;\n        }\n        resultOffset -= debugMargin;\n    }\n\n    // Apply alignment.\n    resultOffset = VmaAlignDown(resultOffset, allocAlignment);\n\n    // Check next suballocations from 2nd for BufferImageGranularity conflicts.\n    // Make bigger alignment if necessary.\n    if (bufferImageGranularity > 1 && bufferImageGranularity != allocAlignment && !suballocations2nd.empty())\n    {\n        bool bufferImageGranularityConflict = false;\n        for (size_t nextSuballocIndex = suballocations2nd.size(); nextSuballocIndex--; )\n        {\n            const VmaSuballocation& nextSuballoc = suballocations2nd[nextSuballocIndex];\n            if (VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))\n            {\n                if (VmaIsBufferImageGranularityConflict(nextSuballoc.type, allocType))\n                {\n                    bufferImageGranularityConflict = true;\n                    break;\n                }\n            }\n            else\n                // Already on previous page.\n                break;\n        }\n        if (bufferImageGranularityConflict)\n        {\n            resultOffset = VmaAlignDown(resultOffset, bufferImageGranularity);\n        }\n    }\n\n    // There is enough free space.\n    const VkDeviceSize endOf1st = !suballocations1st.empty() ?\n        suballocations1st.back().offset + suballocations1st.back().size :\n        0;\n    if (endOf1st + debugMargin <= resultOffset)\n    {\n        // Check previous suballocations for BufferImageGranularity conflicts.\n        // If conflict exists, allocation cannot be made here.\n        if (bufferImageGranularity > 1)\n        {\n            for (size_t prevSuballocIndex = suballocations1st.size(); prevSuballocIndex--; )\n            {\n                const VmaSuballocation& prevSuballoc = suballocations1st[prevSuballocIndex];\n                if (VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))\n                {\n                    if (VmaIsBufferImageGranularityConflict(allocType, prevSuballoc.type))\n                    {\n                        return false;\n                    }\n                }\n                else\n                {\n                    // Already on next page.\n                    break;\n                }\n            }\n        }\n\n        // All tests passed: Success.\n        pAllocationRequest->allocHandle = (VmaAllocHandle)(resultOffset + 1);\n        // pAllocationRequest->item unused.\n        pAllocationRequest->type = VmaAllocationRequestType::UpperAddress;\n        return true;\n    }\n\n    return false;\n}\n#endif // _VMA_BLOCK_METADATA_LINEAR_FUNCTIONS\n#endif // _VMA_BLOCK_METADATA_LINEAR\n\n#ifndef _VMA_BLOCK_METADATA_TLSF\n// To not search current larger region if first allocation won't succeed and skip to smaller range\n// use with VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT as strategy in CreateAllocationRequest().\n// When fragmentation and reusal of previous blocks doesn't matter then use with\n// VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT for fastest alloc time possible.\nclass VmaBlockMetadata_TLSF : public VmaBlockMetadata\n{\n    VMA_CLASS_NO_COPY_NO_MOVE(VmaBlockMetadata_TLSF)\npublic:\n    VmaBlockMetadata_TLSF(const VkAllocationCallbacks* pAllocationCallbacks,\n        VkDeviceSize bufferImageGranularity, bool isVirtual);\n    virtual ~VmaBlockMetadata_TLSF();\n\n    size_t GetAllocationCount() const override { return m_AllocCount; }\n    size_t GetFreeRegionsCount() const override { return m_BlocksFreeCount + 1; }\n    VkDeviceSize GetSumFreeSize() const override { return m_BlocksFreeSize + m_NullBlock->size; }\n    bool IsEmpty() const override { return m_NullBlock->offset == 0; }\n    VkDeviceSize GetAllocationOffset(VmaAllocHandle allocHandle) const override { return ((Block*)allocHandle)->offset; }\n\n    void Init(VkDeviceSize size) override;\n    bool Validate() const override;\n\n    void AddDetailedStatistics(VmaDetailedStatistics& inoutStats) const override;\n    void AddStatistics(VmaStatistics& inoutStats) const override;\n\n#if VMA_STATS_STRING_ENABLED\n    void PrintDetailedMap(class VmaJsonWriter& json) const override;\n#endif\n\n    bool CreateAllocationRequest(\n        VkDeviceSize allocSize,\n        VkDeviceSize allocAlignment,\n        bool upperAddress,\n        VmaSuballocationType allocType,\n        uint32_t strategy,\n        VmaAllocationRequest* pAllocationRequest) override;\n\n    VkResult CheckCorruption(const void* pBlockData) override;\n    void Alloc(\n        const VmaAllocationRequest& request,\n        VmaSuballocationType type,\n        void* userData) override;\n\n    void Free(VmaAllocHandle allocHandle) override;\n    void GetAllocationInfo(VmaAllocHandle allocHandle, VmaVirtualAllocationInfo& outInfo) override;\n    void* GetAllocationUserData(VmaAllocHandle allocHandle) const override;\n    VmaAllocHandle GetAllocationListBegin() const override;\n    VmaAllocHandle GetNextAllocation(VmaAllocHandle prevAlloc) const override;\n    VkDeviceSize GetNextFreeRegionSize(VmaAllocHandle alloc) const override;\n    void Clear() override;\n    void SetAllocationUserData(VmaAllocHandle allocHandle, void* userData) override;\n    void DebugLogAllAllocations() const override;\n\nprivate:\n    // According to original paper it should be preferable 4 or 5:\n    // M. Masmano, I. Ripoll, A. Crespo, and J. Real \"TLSF: a New Dynamic Memory Allocator for Real-Time Systems\"\n    // http://www.gii.upv.es/tlsf/files/ecrts04_tlsf.pdf\n    static const uint8_t SECOND_LEVEL_INDEX = 5;\n    static const uint16_t SMALL_BUFFER_SIZE = 256;\n    static const uint32_t INITIAL_BLOCK_ALLOC_COUNT = 16;\n    static const uint8_t MEMORY_CLASS_SHIFT = 7;\n    static const uint8_t MAX_MEMORY_CLASSES = 65 - MEMORY_CLASS_SHIFT;\n\n    class Block\n    {\n    public:\n        VkDeviceSize offset;\n        VkDeviceSize size;\n        Block* prevPhysical;\n        Block* nextPhysical;\n\n        void MarkFree() { prevFree = VMA_NULL; }\n        void MarkTaken() { prevFree = this; }\n        bool IsFree() const { return prevFree != this; }\n        void*& UserData() { VMA_HEAVY_ASSERT(!IsFree()); return userData; }\n        Block*& PrevFree() { return prevFree; }\n        Block*& NextFree() { VMA_HEAVY_ASSERT(IsFree()); return nextFree; }\n\n    private:\n        Block* prevFree; // Address of the same block here indicates that block is taken\n        union\n        {\n            Block* nextFree;\n            void* userData;\n        };\n    };\n\n    size_t m_AllocCount;\n    // Total number of free blocks besides null block\n    size_t m_BlocksFreeCount;\n    // Total size of free blocks excluding null block\n    VkDeviceSize m_BlocksFreeSize;\n    uint32_t m_IsFreeBitmap;\n    uint8_t m_MemoryClasses;\n    uint32_t m_InnerIsFreeBitmap[MAX_MEMORY_CLASSES];\n    uint32_t m_ListsCount;\n    /*\n    * 0: 0-3 lists for small buffers\n    * 1+: 0-(2^SLI-1) lists for normal buffers\n    */\n    Block** m_FreeList;\n    VmaPoolAllocator<Block> m_BlockAllocator;\n    Block* m_NullBlock;\n    VmaBlockBufferImageGranularity m_GranularityHandler;\n\n    uint8_t SizeToMemoryClass(VkDeviceSize size) const;\n    uint16_t SizeToSecondIndex(VkDeviceSize size, uint8_t memoryClass) const;\n    uint32_t GetListIndex(uint8_t memoryClass, uint16_t secondIndex) const;\n    uint32_t GetListIndex(VkDeviceSize size) const;\n\n    void RemoveFreeBlock(Block* block);\n    void InsertFreeBlock(Block* block);\n    void MergeBlock(Block* block, Block* prev);\n\n    Block* FindFreeBlock(VkDeviceSize size, uint32_t& listIndex) const;\n    bool CheckBlock(\n        Block& block,\n        uint32_t listIndex,\n        VkDeviceSize allocSize,\n        VkDeviceSize allocAlignment,\n        VmaSuballocationType allocType,\n        VmaAllocationRequest* pAllocationRequest);\n};\n\n#ifndef _VMA_BLOCK_METADATA_TLSF_FUNCTIONS\nVmaBlockMetadata_TLSF::VmaBlockMetadata_TLSF(const VkAllocationCallbacks* pAllocationCallbacks,\n    VkDeviceSize bufferImageGranularity, bool isVirtual)\n    : VmaBlockMetadata(pAllocationCallbacks, bufferImageGranularity, isVirtual),\n    m_AllocCount(0),\n    m_BlocksFreeCount(0),\n    m_BlocksFreeSize(0),\n    m_IsFreeBitmap(0),\n    m_MemoryClasses(0),\n    m_ListsCount(0),\n    m_FreeList(VMA_NULL),\n    m_BlockAllocator(pAllocationCallbacks, INITIAL_BLOCK_ALLOC_COUNT),\n    m_NullBlock(VMA_NULL),\n    m_GranularityHandler(bufferImageGranularity) {}\n\nVmaBlockMetadata_TLSF::~VmaBlockMetadata_TLSF()\n{\n    if (m_FreeList)\n        vma_delete_array(GetAllocationCallbacks(), m_FreeList, m_ListsCount);\n    m_GranularityHandler.Destroy(GetAllocationCallbacks());\n}\n\nvoid VmaBlockMetadata_TLSF::Init(VkDeviceSize size)\n{\n    VmaBlockMetadata::Init(size);\n\n    if (!IsVirtual())\n        m_GranularityHandler.Init(GetAllocationCallbacks(), size);\n\n    m_NullBlock = m_BlockAllocator.Alloc();\n    m_NullBlock->size = size;\n    m_NullBlock->offset = 0;\n    m_NullBlock->prevPhysical = VMA_NULL;\n    m_NullBlock->nextPhysical = VMA_NULL;\n    m_NullBlock->MarkFree();\n    m_NullBlock->NextFree() = VMA_NULL;\n    m_NullBlock->PrevFree() = VMA_NULL;\n    uint8_t memoryClass = SizeToMemoryClass(size);\n    uint16_t sli = SizeToSecondIndex(size, memoryClass);\n    m_ListsCount = (memoryClass == 0 ? 0 : (memoryClass - 1) * (1UL << SECOND_LEVEL_INDEX) + sli) + 1;\n    if (IsVirtual())\n        m_ListsCount += 1UL << SECOND_LEVEL_INDEX;\n    else\n        m_ListsCount += 4;\n\n    m_MemoryClasses = memoryClass + uint8_t(2);\n    memset(m_InnerIsFreeBitmap, 0, MAX_MEMORY_CLASSES * sizeof(uint32_t));\n\n    m_FreeList = vma_new_array(GetAllocationCallbacks(), Block*, m_ListsCount);\n    memset(m_FreeList, 0, m_ListsCount * sizeof(Block*));\n}\n\nbool VmaBlockMetadata_TLSF::Validate() const\n{\n    VMA_VALIDATE(GetSumFreeSize() <= GetSize());\n\n    VkDeviceSize calculatedSize = m_NullBlock->size;\n    VkDeviceSize calculatedFreeSize = m_NullBlock->size;\n    size_t allocCount = 0;\n    size_t freeCount = 0;\n\n    // Check integrity of free lists\n    for (uint32_t list = 0; list < m_ListsCount; ++list)\n    {\n        Block* block = m_FreeList[list];\n        if (block != VMA_NULL)\n        {\n            VMA_VALIDATE(block->IsFree());\n            VMA_VALIDATE(block->PrevFree() == VMA_NULL);\n            while (block->NextFree())\n            {\n                VMA_VALIDATE(block->NextFree()->IsFree());\n                VMA_VALIDATE(block->NextFree()->PrevFree() == block);\n                block = block->NextFree();\n            }\n        }\n    }\n\n    VkDeviceSize nextOffset = m_NullBlock->offset;\n    auto validateCtx = m_GranularityHandler.StartValidation(GetAllocationCallbacks(), IsVirtual());\n\n    VMA_VALIDATE(m_NullBlock->nextPhysical == VMA_NULL);\n    if (m_NullBlock->prevPhysical)\n    {\n        VMA_VALIDATE(m_NullBlock->prevPhysical->nextPhysical == m_NullBlock);\n    }\n    // Check all blocks\n    for (Block* prev = m_NullBlock->prevPhysical; prev != VMA_NULL; prev = prev->prevPhysical)\n    {\n        VMA_VALIDATE(prev->offset + prev->size == nextOffset);\n        nextOffset = prev->offset;\n        calculatedSize += prev->size;\n\n        uint32_t listIndex = GetListIndex(prev->size);\n        if (prev->IsFree())\n        {\n            ++freeCount;\n            // Check if free block belongs to free list\n            Block* freeBlock = m_FreeList[listIndex];\n            VMA_VALIDATE(freeBlock != VMA_NULL);\n\n            bool found = false;\n            do\n            {\n                if (freeBlock == prev)\n                    found = true;\n\n                freeBlock = freeBlock->NextFree();\n            } while (!found && freeBlock != VMA_NULL);\n\n            VMA_VALIDATE(found);\n            calculatedFreeSize += prev->size;\n        }\n        else\n        {\n            ++allocCount;\n            // Check if taken block is not on a free list\n            Block* freeBlock = m_FreeList[listIndex];\n            while (freeBlock)\n            {\n                VMA_VALIDATE(freeBlock != prev);\n                freeBlock = freeBlock->NextFree();\n            }\n\n            if (!IsVirtual())\n            {\n                VMA_VALIDATE(m_GranularityHandler.Validate(validateCtx, prev->offset, prev->size));\n            }\n        }\n\n        if (prev->prevPhysical)\n        {\n            VMA_VALIDATE(prev->prevPhysical->nextPhysical == prev);\n        }\n    }\n\n    if (!IsVirtual())\n    {\n        VMA_VALIDATE(m_GranularityHandler.FinishValidation(validateCtx));\n    }\n\n    VMA_VALIDATE(nextOffset == 0);\n    VMA_VALIDATE(calculatedSize == GetSize());\n    VMA_VALIDATE(calculatedFreeSize == GetSumFreeSize());\n    VMA_VALIDATE(allocCount == m_AllocCount);\n    VMA_VALIDATE(freeCount == m_BlocksFreeCount);\n\n    return true;\n}\n\nvoid VmaBlockMetadata_TLSF::AddDetailedStatistics(VmaDetailedStatistics& inoutStats) const\n{\n    inoutStats.statistics.blockCount++;\n    inoutStats.statistics.blockBytes += GetSize();\n    if (m_NullBlock->size > 0)\n        VmaAddDetailedStatisticsUnusedRange(inoutStats, m_NullBlock->size);\n\n    for (Block* block = m_NullBlock->prevPhysical; block != VMA_NULL; block = block->prevPhysical)\n    {\n        if (block->IsFree())\n            VmaAddDetailedStatisticsUnusedRange(inoutStats, block->size);\n        else\n            VmaAddDetailedStatisticsAllocation(inoutStats, block->size);\n    }\n}\n\nvoid VmaBlockMetadata_TLSF::AddStatistics(VmaStatistics& inoutStats) const\n{\n    inoutStats.blockCount++;\n    inoutStats.allocationCount += (uint32_t)m_AllocCount;\n    inoutStats.blockBytes += GetSize();\n    inoutStats.allocationBytes += GetSize() - GetSumFreeSize();\n}\n\n#if VMA_STATS_STRING_ENABLED\nvoid VmaBlockMetadata_TLSF::PrintDetailedMap(class VmaJsonWriter& json) const\n{\n    size_t blockCount = m_AllocCount + m_BlocksFreeCount;\n    VmaStlAllocator<Block*> allocator(GetAllocationCallbacks());\n    VmaVector<Block*, VmaStlAllocator<Block*>> blockList(blockCount, allocator);\n\n    size_t i = blockCount;\n    for (Block* block = m_NullBlock->prevPhysical; block != VMA_NULL; block = block->prevPhysical)\n    {\n        blockList[--i] = block;\n    }\n    VMA_ASSERT(i == 0);\n\n    VmaDetailedStatistics stats;\n    VmaClearDetailedStatistics(stats);\n    AddDetailedStatistics(stats);\n\n    PrintDetailedMap_Begin(json,\n        stats.statistics.blockBytes - stats.statistics.allocationBytes,\n        stats.statistics.allocationCount,\n        stats.unusedRangeCount);\n\n    for (; i < blockCount; ++i)\n    {\n        Block* block = blockList[i];\n        if (block->IsFree())\n            PrintDetailedMap_UnusedRange(json, block->offset, block->size);\n        else\n            PrintDetailedMap_Allocation(json, block->offset, block->size, block->UserData());\n    }\n    if (m_NullBlock->size > 0)\n        PrintDetailedMap_UnusedRange(json, m_NullBlock->offset, m_NullBlock->size);\n\n    PrintDetailedMap_End(json);\n}\n#endif\n\nbool VmaBlockMetadata_TLSF::CreateAllocationRequest(\n    VkDeviceSize allocSize,\n    VkDeviceSize allocAlignment,\n    bool upperAddress,\n    VmaSuballocationType allocType,\n    uint32_t strategy,\n    VmaAllocationRequest* pAllocationRequest)\n{\n    VMA_ASSERT(allocSize > 0 && \"Cannot allocate empty block!\");\n    VMA_ASSERT(!upperAddress && \"VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT can be used only with linear algorithm.\");\n\n    // For small granularity round up\n    if (!IsVirtual())\n        m_GranularityHandler.RoundupAllocRequest(allocType, allocSize, allocAlignment);\n\n    allocSize += GetDebugMargin();\n    // Quick check for too small pool\n    if (allocSize > GetSumFreeSize())\n        return false;\n\n    // If no free blocks in pool then check only null block\n    if (m_BlocksFreeCount == 0)\n        return CheckBlock(*m_NullBlock, m_ListsCount, allocSize, allocAlignment, allocType, pAllocationRequest);\n\n    // Round up to the next block\n    VkDeviceSize sizeForNextList = allocSize;\n    VkDeviceSize smallSizeStep = VkDeviceSize(SMALL_BUFFER_SIZE / (IsVirtual() ? 1 << SECOND_LEVEL_INDEX : 4));\n    if (allocSize > SMALL_BUFFER_SIZE)\n    {\n        sizeForNextList += (1ULL << (VMA_BITSCAN_MSB(allocSize) - SECOND_LEVEL_INDEX));\n    }\n    else if (allocSize > SMALL_BUFFER_SIZE - smallSizeStep)\n        sizeForNextList = SMALL_BUFFER_SIZE + 1;\n    else\n        sizeForNextList += smallSizeStep;\n\n    uint32_t nextListIndex = m_ListsCount;\n    uint32_t prevListIndex = m_ListsCount;\n    Block* nextListBlock = VMA_NULL;\n    Block* prevListBlock = VMA_NULL;\n\n    // Check blocks according to strategies\n    if (strategy & VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT)\n    {\n        // Quick check for larger block first\n        nextListBlock = FindFreeBlock(sizeForNextList, nextListIndex);\n        if (nextListBlock != VMA_NULL && CheckBlock(*nextListBlock, nextListIndex, allocSize, allocAlignment, allocType, pAllocationRequest))\n            return true;\n\n        // If not fitted then null block\n        if (CheckBlock(*m_NullBlock, m_ListsCount, allocSize, allocAlignment, allocType, pAllocationRequest))\n            return true;\n\n        // Null block failed, search larger bucket\n        while (nextListBlock)\n        {\n            if (CheckBlock(*nextListBlock, nextListIndex, allocSize, allocAlignment, allocType, pAllocationRequest))\n                return true;\n            nextListBlock = nextListBlock->NextFree();\n        }\n\n        // Failed again, check best fit bucket\n        prevListBlock = FindFreeBlock(allocSize, prevListIndex);\n        while (prevListBlock)\n        {\n            if (CheckBlock(*prevListBlock, prevListIndex, allocSize, allocAlignment, allocType, pAllocationRequest))\n                return true;\n            prevListBlock = prevListBlock->NextFree();\n        }\n    }\n    else if (strategy & VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT)\n    {\n        // Check best fit bucket\n        prevListBlock = FindFreeBlock(allocSize, prevListIndex);\n        while (prevListBlock)\n        {\n            if (CheckBlock(*prevListBlock, prevListIndex, allocSize, allocAlignment, allocType, pAllocationRequest))\n                return true;\n            prevListBlock = prevListBlock->NextFree();\n        }\n\n        // If failed check null block\n        if (CheckBlock(*m_NullBlock, m_ListsCount, allocSize, allocAlignment, allocType, pAllocationRequest))\n            return true;\n\n        // Check larger bucket\n        nextListBlock = FindFreeBlock(sizeForNextList, nextListIndex);\n        while (nextListBlock)\n        {\n            if (CheckBlock(*nextListBlock, nextListIndex, allocSize, allocAlignment, allocType, pAllocationRequest))\n                return true;\n            nextListBlock = nextListBlock->NextFree();\n        }\n    }\n    else if (strategy & VMA_ALLOCATION_CREATE_STRATEGY_MIN_OFFSET_BIT )\n    {\n        // Perform search from the start\n        VmaStlAllocator<Block*> allocator(GetAllocationCallbacks());\n        VmaVector<Block*, VmaStlAllocator<Block*>> blockList(m_BlocksFreeCount, allocator);\n\n        size_t i = m_BlocksFreeCount;\n        for (Block* block = m_NullBlock->prevPhysical; block != VMA_NULL; block = block->prevPhysical)\n        {\n            if (block->IsFree() && block->size >= allocSize)\n                blockList[--i] = block;\n        }\n\n        for (; i < m_BlocksFreeCount; ++i)\n        {\n            Block& block = *blockList[i];\n            if (CheckBlock(block, GetListIndex(block.size), allocSize, allocAlignment, allocType, pAllocationRequest))\n                return true;\n        }\n\n        // If failed check null block\n        if (CheckBlock(*m_NullBlock, m_ListsCount, allocSize, allocAlignment, allocType, pAllocationRequest))\n            return true;\n\n        // Whole range searched, no more memory\n        return false;\n    }\n    else\n    {\n        // Check larger bucket\n        nextListBlock = FindFreeBlock(sizeForNextList, nextListIndex);\n        while (nextListBlock)\n        {\n            if (CheckBlock(*nextListBlock, nextListIndex, allocSize, allocAlignment, allocType, pAllocationRequest))\n                return true;\n            nextListBlock = nextListBlock->NextFree();\n        }\n\n        // If failed check null block\n        if (CheckBlock(*m_NullBlock, m_ListsCount, allocSize, allocAlignment, allocType, pAllocationRequest))\n            return true;\n\n        // Check best fit bucket\n        prevListBlock = FindFreeBlock(allocSize, prevListIndex);\n        while (prevListBlock)\n        {\n            if (CheckBlock(*prevListBlock, prevListIndex, allocSize, allocAlignment, allocType, pAllocationRequest))\n                return true;\n            prevListBlock = prevListBlock->NextFree();\n        }\n    }\n\n    // Worst case, full search has to be done\n    while (++nextListIndex < m_ListsCount)\n    {\n        nextListBlock = m_FreeList[nextListIndex];\n        while (nextListBlock)\n        {\n            if (CheckBlock(*nextListBlock, nextListIndex, allocSize, allocAlignment, allocType, pAllocationRequest))\n                return true;\n            nextListBlock = nextListBlock->NextFree();\n        }\n    }\n\n    // No more memory sadly\n    return false;\n}\n\nVkResult VmaBlockMetadata_TLSF::CheckCorruption(const void* pBlockData)\n{\n    for (Block* block = m_NullBlock->prevPhysical; block != VMA_NULL; block = block->prevPhysical)\n    {\n        if (!block->IsFree())\n        {\n            if (!VmaValidateMagicValue(pBlockData, block->offset + block->size))\n            {\n                VMA_ASSERT(0 && \"MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!\");\n                return VK_ERROR_UNKNOWN_COPY;\n            }\n        }\n    }\n\n    return VK_SUCCESS;\n}\n\nvoid VmaBlockMetadata_TLSF::Alloc(\n    const VmaAllocationRequest& request,\n    VmaSuballocationType type,\n    void* userData)\n{\n    VMA_ASSERT(request.type == VmaAllocationRequestType::TLSF);\n\n    // Get block and pop it from the free list\n    Block* currentBlock = (Block*)request.allocHandle;\n    VkDeviceSize offset = request.algorithmData;\n    VMA_ASSERT(currentBlock != VMA_NULL);\n    VMA_ASSERT(currentBlock->offset <= offset);\n\n    if (currentBlock != m_NullBlock)\n        RemoveFreeBlock(currentBlock);\n\n    VkDeviceSize debugMargin = GetDebugMargin();\n    VkDeviceSize missingAlignment = offset - currentBlock->offset;\n\n    // Append missing alignment to prev block or create new one\n    if (missingAlignment)\n    {\n        Block* prevBlock = currentBlock->prevPhysical;\n        VMA_ASSERT(prevBlock != VMA_NULL && \"There should be no missing alignment at offset 0!\");\n\n        if (prevBlock->IsFree() && prevBlock->size != debugMargin)\n        {\n            uint32_t oldList = GetListIndex(prevBlock->size);\n            prevBlock->size += missingAlignment;\n            // Check if new size crosses list bucket\n            if (oldList != GetListIndex(prevBlock->size))\n            {\n                prevBlock->size -= missingAlignment;\n                RemoveFreeBlock(prevBlock);\n                prevBlock->size += missingAlignment;\n                InsertFreeBlock(prevBlock);\n            }\n            else\n                m_BlocksFreeSize += missingAlignment;\n        }\n        else\n        {\n            Block* newBlock = m_BlockAllocator.Alloc();\n            currentBlock->prevPhysical = newBlock;\n            prevBlock->nextPhysical = newBlock;\n            newBlock->prevPhysical = prevBlock;\n            newBlock->nextPhysical = currentBlock;\n            newBlock->size = missingAlignment;\n            newBlock->offset = currentBlock->offset;\n            newBlock->MarkTaken();\n\n            InsertFreeBlock(newBlock);\n        }\n\n        currentBlock->size -= missingAlignment;\n        currentBlock->offset += missingAlignment;\n    }\n\n    VkDeviceSize size = request.size + debugMargin;\n    if (currentBlock->size == size)\n    {\n        if (currentBlock == m_NullBlock)\n        {\n            // Setup new null block\n            m_NullBlock = m_BlockAllocator.Alloc();\n            m_NullBlock->size = 0;\n            m_NullBlock->offset = currentBlock->offset + size;\n            m_NullBlock->prevPhysical = currentBlock;\n            m_NullBlock->nextPhysical = VMA_NULL;\n            m_NullBlock->MarkFree();\n            m_NullBlock->PrevFree() = VMA_NULL;\n            m_NullBlock->NextFree() = VMA_NULL;\n            currentBlock->nextPhysical = m_NullBlock;\n            currentBlock->MarkTaken();\n        }\n    }\n    else\n    {\n        VMA_ASSERT(currentBlock->size > size && \"Proper block already found, shouldn't find smaller one!\");\n\n        // Create new free block\n        Block* newBlock = m_BlockAllocator.Alloc();\n        newBlock->size = currentBlock->size - size;\n        newBlock->offset = currentBlock->offset + size;\n        newBlock->prevPhysical = currentBlock;\n        newBlock->nextPhysical = currentBlock->nextPhysical;\n        currentBlock->nextPhysical = newBlock;\n        currentBlock->size = size;\n\n        if (currentBlock == m_NullBlock)\n        {\n            m_NullBlock = newBlock;\n            m_NullBlock->MarkFree();\n            m_NullBlock->NextFree() = VMA_NULL;\n            m_NullBlock->PrevFree() = VMA_NULL;\n            currentBlock->MarkTaken();\n        }\n        else\n        {\n            newBlock->nextPhysical->prevPhysical = newBlock;\n            newBlock->MarkTaken();\n            InsertFreeBlock(newBlock);\n        }\n    }\n    currentBlock->UserData() = userData;\n\n    if (debugMargin > 0)\n    {\n        currentBlock->size -= debugMargin;\n        Block* newBlock = m_BlockAllocator.Alloc();\n        newBlock->size = debugMargin;\n        newBlock->offset = currentBlock->offset + currentBlock->size;\n        newBlock->prevPhysical = currentBlock;\n        newBlock->nextPhysical = currentBlock->nextPhysical;\n        newBlock->MarkTaken();\n        currentBlock->nextPhysical->prevPhysical = newBlock;\n        currentBlock->nextPhysical = newBlock;\n        InsertFreeBlock(newBlock);\n    }\n\n    if (!IsVirtual())\n        m_GranularityHandler.AllocPages((uint8_t)(uintptr_t)request.customData,\n            currentBlock->offset, currentBlock->size);\n    ++m_AllocCount;\n}\n\nvoid VmaBlockMetadata_TLSF::Free(VmaAllocHandle allocHandle)\n{\n    Block* block = (Block*)allocHandle;\n    Block* next = block->nextPhysical;\n    VMA_ASSERT(!block->IsFree() && \"Block is already free!\");\n\n    if (!IsVirtual())\n        m_GranularityHandler.FreePages(block->offset, block->size);\n    --m_AllocCount;\n\n    VkDeviceSize debugMargin = GetDebugMargin();\n    if (debugMargin > 0)\n    {\n        RemoveFreeBlock(next);\n        MergeBlock(next, block);\n        block = next;\n        next = next->nextPhysical;\n    }\n\n    // Try merging\n    Block* prev = block->prevPhysical;\n    if (prev != VMA_NULL && prev->IsFree() && prev->size != debugMargin)\n    {\n        RemoveFreeBlock(prev);\n        MergeBlock(block, prev);\n    }\n\n    if (!next->IsFree())\n        InsertFreeBlock(block);\n    else if (next == m_NullBlock)\n        MergeBlock(m_NullBlock, block);\n    else\n    {\n        RemoveFreeBlock(next);\n        MergeBlock(next, block);\n        InsertFreeBlock(next);\n    }\n}\n\nvoid VmaBlockMetadata_TLSF::GetAllocationInfo(VmaAllocHandle allocHandle, VmaVirtualAllocationInfo& outInfo)\n{\n    Block* block = (Block*)allocHandle;\n    VMA_ASSERT(!block->IsFree() && \"Cannot get allocation info for free block!\");\n    outInfo.offset = block->offset;\n    outInfo.size = block->size;\n    outInfo.pUserData = block->UserData();\n}\n\nvoid* VmaBlockMetadata_TLSF::GetAllocationUserData(VmaAllocHandle allocHandle) const\n{\n    Block* block = (Block*)allocHandle;\n    VMA_ASSERT(!block->IsFree() && \"Cannot get user data for free block!\");\n    return block->UserData();\n}\n\nVmaAllocHandle VmaBlockMetadata_TLSF::GetAllocationListBegin() const\n{\n    if (m_AllocCount == 0)\n        return VK_NULL_HANDLE;\n\n    for (Block* block = m_NullBlock->prevPhysical; block; block = block->prevPhysical)\n    {\n        if (!block->IsFree())\n            return (VmaAllocHandle)block;\n    }\n    VMA_ASSERT(false && \"If m_AllocCount > 0 then should find any allocation!\");\n    return VK_NULL_HANDLE;\n}\n\nVmaAllocHandle VmaBlockMetadata_TLSF::GetNextAllocation(VmaAllocHandle prevAlloc) const\n{\n    Block* startBlock = (Block*)prevAlloc;\n    VMA_ASSERT(!startBlock->IsFree() && \"Incorrect block!\");\n\n    for (Block* block = startBlock->prevPhysical; block; block = block->prevPhysical)\n    {\n        if (!block->IsFree())\n            return (VmaAllocHandle)block;\n    }\n    return VK_NULL_HANDLE;\n}\n\nVkDeviceSize VmaBlockMetadata_TLSF::GetNextFreeRegionSize(VmaAllocHandle alloc) const\n{\n    Block* block = (Block*)alloc;\n    VMA_ASSERT(!block->IsFree() && \"Incorrect block!\");\n\n    if (block->prevPhysical)\n        return block->prevPhysical->IsFree() ? block->prevPhysical->size : 0;\n    return 0;\n}\n\nvoid VmaBlockMetadata_TLSF::Clear()\n{\n    m_AllocCount = 0;\n    m_BlocksFreeCount = 0;\n    m_BlocksFreeSize = 0;\n    m_IsFreeBitmap = 0;\n    m_NullBlock->offset = 0;\n    m_NullBlock->size = GetSize();\n    Block* block = m_NullBlock->prevPhysical;\n    m_NullBlock->prevPhysical = VMA_NULL;\n    while (block)\n    {\n        Block* prev = block->prevPhysical;\n        m_BlockAllocator.Free(block);\n        block = prev;\n    }\n    memset(m_FreeList, 0, m_ListsCount * sizeof(Block*));\n    memset(m_InnerIsFreeBitmap, 0, m_MemoryClasses * sizeof(uint32_t));\n    m_GranularityHandler.Clear();\n}\n\nvoid VmaBlockMetadata_TLSF::SetAllocationUserData(VmaAllocHandle allocHandle, void* userData)\n{\n    Block* block = (Block*)allocHandle;\n    VMA_ASSERT(!block->IsFree() && \"Trying to set user data for not allocated block!\");\n    block->UserData() = userData;\n}\n\nvoid VmaBlockMetadata_TLSF::DebugLogAllAllocations() const\n{\n    for (Block* block = m_NullBlock->prevPhysical; block != VMA_NULL; block = block->prevPhysical)\n        if (!block->IsFree())\n            DebugLogAllocation(block->offset, block->size, block->UserData());\n}\n\nuint8_t VmaBlockMetadata_TLSF::SizeToMemoryClass(VkDeviceSize size) const\n{\n    if (size > SMALL_BUFFER_SIZE)\n        return uint8_t(VMA_BITSCAN_MSB(size) - MEMORY_CLASS_SHIFT);\n    return 0;\n}\n\nuint16_t VmaBlockMetadata_TLSF::SizeToSecondIndex(VkDeviceSize size, uint8_t memoryClass) const\n{\n    if (memoryClass == 0)\n    {\n        if (IsVirtual())\n            return static_cast<uint16_t>((size - 1) / 8);\n        else\n            return static_cast<uint16_t>((size - 1) / 64);\n    }\n    return static_cast<uint16_t>((size >> (memoryClass + MEMORY_CLASS_SHIFT - SECOND_LEVEL_INDEX)) ^ (1U << SECOND_LEVEL_INDEX));\n}\n\nuint32_t VmaBlockMetadata_TLSF::GetListIndex(uint8_t memoryClass, uint16_t secondIndex) const\n{\n    if (memoryClass == 0)\n        return secondIndex;\n\n    const uint32_t index = static_cast<uint32_t>(memoryClass - 1) * (1 << SECOND_LEVEL_INDEX) + secondIndex;\n    if (IsVirtual())\n        return index + (1 << SECOND_LEVEL_INDEX);\n    else\n        return index + 4;\n}\n\nuint32_t VmaBlockMetadata_TLSF::GetListIndex(VkDeviceSize size) const\n{\n    uint8_t memoryClass = SizeToMemoryClass(size);\n    return GetListIndex(memoryClass, SizeToSecondIndex(size, memoryClass));\n}\n\nvoid VmaBlockMetadata_TLSF::RemoveFreeBlock(Block* block)\n{\n    VMA_ASSERT(block != m_NullBlock);\n    VMA_ASSERT(block->IsFree());\n\n    if (block->NextFree() != VMA_NULL)\n        block->NextFree()->PrevFree() = block->PrevFree();\n    if (block->PrevFree() != VMA_NULL)\n        block->PrevFree()->NextFree() = block->NextFree();\n    else\n    {\n        uint8_t memClass = SizeToMemoryClass(block->size);\n        uint16_t secondIndex = SizeToSecondIndex(block->size, memClass);\n        uint32_t index = GetListIndex(memClass, secondIndex);\n        VMA_ASSERT(m_FreeList[index] == block);\n        m_FreeList[index] = block->NextFree();\n        if (block->NextFree() == VMA_NULL)\n        {\n            m_InnerIsFreeBitmap[memClass] &= ~(1U << secondIndex);\n            if (m_InnerIsFreeBitmap[memClass] == 0)\n                m_IsFreeBitmap &= ~(1UL << memClass);\n        }\n    }\n    block->MarkTaken();\n    block->UserData() = VMA_NULL;\n    --m_BlocksFreeCount;\n    m_BlocksFreeSize -= block->size;\n}\n\nvoid VmaBlockMetadata_TLSF::InsertFreeBlock(Block* block)\n{\n    VMA_ASSERT(block != m_NullBlock);\n    VMA_ASSERT(!block->IsFree() && \"Cannot insert block twice!\");\n\n    uint8_t memClass = SizeToMemoryClass(block->size);\n    uint16_t secondIndex = SizeToSecondIndex(block->size, memClass);\n    uint32_t index = GetListIndex(memClass, secondIndex);\n    VMA_ASSERT(index < m_ListsCount);\n    block->PrevFree() = VMA_NULL;\n    block->NextFree() = m_FreeList[index];\n    m_FreeList[index] = block;\n    if (block->NextFree() != VMA_NULL)\n        block->NextFree()->PrevFree() = block;\n    else\n    {\n        m_InnerIsFreeBitmap[memClass] |= 1U << secondIndex;\n        m_IsFreeBitmap |= 1UL << memClass;\n    }\n    ++m_BlocksFreeCount;\n    m_BlocksFreeSize += block->size;\n}\n\nvoid VmaBlockMetadata_TLSF::MergeBlock(Block* block, Block* prev)\n{\n    VMA_ASSERT(block->prevPhysical == prev && \"Cannot merge separate physical regions!\");\n    VMA_ASSERT(!prev->IsFree() && \"Cannot merge block that belongs to free list!\");\n\n    block->offset = prev->offset;\n    block->size += prev->size;\n    block->prevPhysical = prev->prevPhysical;\n    if (block->prevPhysical)\n        block->prevPhysical->nextPhysical = block;\n    m_BlockAllocator.Free(prev);\n}\n\nVmaBlockMetadata_TLSF::Block* VmaBlockMetadata_TLSF::FindFreeBlock(VkDeviceSize size, uint32_t& listIndex) const\n{\n    uint8_t memoryClass = SizeToMemoryClass(size);\n    uint32_t innerFreeMap = m_InnerIsFreeBitmap[memoryClass] & (~0U << SizeToSecondIndex(size, memoryClass));\n    if (!innerFreeMap)\n    {\n        // Check higher levels for available blocks\n        uint32_t freeMap = m_IsFreeBitmap & (~0UL << (memoryClass + 1));\n        if (!freeMap)\n            return VMA_NULL; // No more memory available\n\n        // Find lowest free region\n        memoryClass = VMA_BITSCAN_LSB(freeMap);\n        innerFreeMap = m_InnerIsFreeBitmap[memoryClass];\n        VMA_ASSERT(innerFreeMap != 0);\n    }\n    // Find lowest free subregion\n    listIndex = GetListIndex(memoryClass, VMA_BITSCAN_LSB(innerFreeMap));\n    VMA_ASSERT(m_FreeList[listIndex]);\n    return m_FreeList[listIndex];\n}\n\nbool VmaBlockMetadata_TLSF::CheckBlock(\n    Block& block,\n    uint32_t listIndex,\n    VkDeviceSize allocSize,\n    VkDeviceSize allocAlignment,\n    VmaSuballocationType allocType,\n    VmaAllocationRequest* pAllocationRequest)\n{\n    VMA_ASSERT(block.IsFree() && \"Block is already taken!\");\n\n    VkDeviceSize alignedOffset = VmaAlignUp(block.offset, allocAlignment);\n    if (block.size < allocSize + alignedOffset - block.offset)\n        return false;\n\n    // Check for granularity conflicts\n    if (!IsVirtual() &&\n        m_GranularityHandler.CheckConflictAndAlignUp(alignedOffset, allocSize, block.offset, block.size, allocType))\n        return false;\n\n    // Alloc successful\n    pAllocationRequest->type = VmaAllocationRequestType::TLSF;\n    pAllocationRequest->allocHandle = (VmaAllocHandle)&block;\n    pAllocationRequest->size = allocSize - GetDebugMargin();\n    pAllocationRequest->customData = (void*)allocType;\n    pAllocationRequest->algorithmData = alignedOffset;\n\n    // Place block at the start of list if it's normal block\n    if (listIndex != m_ListsCount && block.PrevFree())\n    {\n        block.PrevFree()->NextFree() = block.NextFree();\n        if (block.NextFree())\n            block.NextFree()->PrevFree() = block.PrevFree();\n        block.PrevFree() = VMA_NULL;\n        block.NextFree() = m_FreeList[listIndex];\n        m_FreeList[listIndex] = &block;\n        if (block.NextFree())\n            block.NextFree()->PrevFree() = &block;\n    }\n\n    return true;\n}\n#endif // _VMA_BLOCK_METADATA_TLSF_FUNCTIONS\n#endif // _VMA_BLOCK_METADATA_TLSF\n\n#ifndef _VMA_BLOCK_VECTOR\n/*\nSequence of VmaDeviceMemoryBlock. Represents memory blocks allocated for a specific\nVulkan memory type.\n\nSynchronized internally with a mutex.\n*/\nclass VmaBlockVector\n{\n    friend struct VmaDefragmentationContext_T;\n    VMA_CLASS_NO_COPY_NO_MOVE(VmaBlockVector)\npublic:\n    VmaBlockVector(\n        VmaAllocator hAllocator,\n        VmaPool hParentPool,\n        uint32_t memoryTypeIndex,\n        VkDeviceSize preferredBlockSize,\n        size_t minBlockCount,\n        size_t maxBlockCount,\n        VkDeviceSize bufferImageGranularity,\n        bool explicitBlockSize,\n        uint32_t algorithm,\n        float priority,\n        VkDeviceSize minAllocationAlignment,\n        void* pMemoryAllocateNext);\n    ~VmaBlockVector();\n\n    VmaAllocator GetAllocator() const { return m_hAllocator; }\n    VmaPool GetParentPool() const { return m_hParentPool; }\n    bool IsCustomPool() const { return m_hParentPool != VMA_NULL; }\n    uint32_t GetMemoryTypeIndex() const { return m_MemoryTypeIndex; }\n    VkDeviceSize GetPreferredBlockSize() const { return m_PreferredBlockSize; }\n    VkDeviceSize GetBufferImageGranularity() const { return m_BufferImageGranularity; }\n    uint32_t GetAlgorithm() const { return m_Algorithm; }\n    bool HasExplicitBlockSize() const { return m_ExplicitBlockSize; }\n    float GetPriority() const { return m_Priority; }\n    const void* GetAllocationNextPtr() const { return m_pMemoryAllocateNext; }\n    // To be used only while the m_Mutex is locked. Used during defragmentation.\n    size_t GetBlockCount() const { return m_Blocks.size(); }\n    // To be used only while the m_Mutex is locked. Used during defragmentation.\n    VmaDeviceMemoryBlock* GetBlock(size_t index) const { return m_Blocks[index]; }\n    VMA_RW_MUTEX &GetMutex() { return m_Mutex; }\n\n    VkResult CreateMinBlocks();\n    void AddStatistics(VmaStatistics& inoutStats);\n    void AddDetailedStatistics(VmaDetailedStatistics& inoutStats);\n    bool IsEmpty();\n    bool IsCorruptionDetectionEnabled() const;\n\n    VkResult Allocate(\n        VkDeviceSize size,\n        VkDeviceSize alignment,\n        const VmaAllocationCreateInfo& createInfo,\n        VmaSuballocationType suballocType,\n        size_t allocationCount,\n        VmaAllocation* pAllocations);\n\n    void Free(const VmaAllocation hAllocation);\n\n#if VMA_STATS_STRING_ENABLED\n    void PrintDetailedMap(class VmaJsonWriter& json);\n#endif\n\n    VkResult CheckCorruption();\n\nprivate:\n    const VmaAllocator m_hAllocator;\n    const VmaPool m_hParentPool;\n    const uint32_t m_MemoryTypeIndex;\n    const VkDeviceSize m_PreferredBlockSize;\n    const size_t m_MinBlockCount;\n    const size_t m_MaxBlockCount;\n    const VkDeviceSize m_BufferImageGranularity;\n    const bool m_ExplicitBlockSize;\n    const uint32_t m_Algorithm;\n    const float m_Priority;\n    const VkDeviceSize m_MinAllocationAlignment;\n\n    void* const m_pMemoryAllocateNext;\n    VMA_RW_MUTEX m_Mutex;\n    // Incrementally sorted by sumFreeSize, ascending.\n    VmaVector<VmaDeviceMemoryBlock*, VmaStlAllocator<VmaDeviceMemoryBlock*>> m_Blocks;\n    uint32_t m_NextBlockId;\n    bool m_IncrementalSort = true;\n\n    void SetIncrementalSort(bool val) { m_IncrementalSort = val; }\n\n    VkDeviceSize CalcMaxBlockSize() const;\n    // Finds and removes given block from vector.\n    void Remove(VmaDeviceMemoryBlock* pBlock);\n    // Performs single step in sorting m_Blocks. They may not be fully sorted\n    // after this call.\n    void IncrementallySortBlocks();\n    void SortByFreeSize();\n\n    VkResult AllocatePage(\n        VkDeviceSize size,\n        VkDeviceSize alignment,\n        const VmaAllocationCreateInfo& createInfo,\n        VmaSuballocationType suballocType,\n        VmaAllocation* pAllocation);\n\n    VkResult AllocateFromBlock(\n        VmaDeviceMemoryBlock* pBlock,\n        VkDeviceSize size,\n        VkDeviceSize alignment,\n        VmaAllocationCreateFlags allocFlags,\n        void* pUserData,\n        VmaSuballocationType suballocType,\n        uint32_t strategy,\n        VmaAllocation* pAllocation);\n\n    VkResult CommitAllocationRequest(\n        VmaAllocationRequest& allocRequest,\n        VmaDeviceMemoryBlock* pBlock,\n        VkDeviceSize alignment,\n        VmaAllocationCreateFlags allocFlags,\n        void* pUserData,\n        VmaSuballocationType suballocType,\n        VmaAllocation* pAllocation);\n\n    VkResult CreateBlock(VkDeviceSize blockSize, size_t* pNewBlockIndex);\n    bool HasEmptyBlock();\n};\n#endif // _VMA_BLOCK_VECTOR\n\n#ifndef _VMA_DEFRAGMENTATION_CONTEXT\nstruct VmaDefragmentationContext_T\n{\n    VMA_CLASS_NO_COPY_NO_MOVE(VmaDefragmentationContext_T)\npublic:\n    VmaDefragmentationContext_T(\n        VmaAllocator hAllocator,\n        const VmaDefragmentationInfo& info);\n    ~VmaDefragmentationContext_T();\n\n    void GetStats(VmaDefragmentationStats& outStats) { outStats = m_GlobalStats; }\n\n    VkResult DefragmentPassBegin(VmaDefragmentationPassMoveInfo& moveInfo);\n    VkResult DefragmentPassEnd(VmaDefragmentationPassMoveInfo& moveInfo);\n\nprivate:\n    // Max number of allocations to ignore due to size constraints before ending single pass\n    static const uint8_t MAX_ALLOCS_TO_IGNORE = 16;\n    enum class CounterStatus { Pass, Ignore, End };\n\n    struct FragmentedBlock\n    {\n        uint32_t data;\n        VmaDeviceMemoryBlock* block;\n    };\n    struct StateBalanced\n    {\n        VkDeviceSize avgFreeSize = 0;\n        VkDeviceSize avgAllocSize = UINT64_MAX;\n    };\n    struct StateExtensive\n    {\n        enum class Operation : uint8_t\n        {\n            FindFreeBlockBuffer, FindFreeBlockTexture, FindFreeBlockAll,\n            MoveBuffers, MoveTextures, MoveAll,\n            Cleanup, Done\n        };\n\n        Operation operation = Operation::FindFreeBlockTexture;\n        size_t firstFreeBlock = SIZE_MAX;\n    };\n    struct MoveAllocationData\n    {\n        VkDeviceSize size;\n        VkDeviceSize alignment;\n        VmaSuballocationType type;\n        VmaAllocationCreateFlags flags;\n        VmaDefragmentationMove move = {};\n    };\n\n    const VkDeviceSize m_MaxPassBytes;\n    const uint32_t m_MaxPassAllocations;\n    const PFN_vmaCheckDefragmentationBreakFunction m_BreakCallback;\n    void* m_BreakCallbackUserData;\n\n    VmaStlAllocator<VmaDefragmentationMove> m_MoveAllocator;\n    VmaVector<VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove>> m_Moves;\n\n    uint8_t m_IgnoredAllocs = 0;\n    uint32_t m_Algorithm;\n    uint32_t m_BlockVectorCount;\n    VmaBlockVector* m_PoolBlockVector;\n    VmaBlockVector** m_pBlockVectors;\n    size_t m_ImmovableBlockCount = 0;\n    VmaDefragmentationStats m_GlobalStats = { 0 };\n    VmaDefragmentationStats m_PassStats = { 0 };\n    void* m_AlgorithmState = VMA_NULL;\n\n    static MoveAllocationData GetMoveData(VmaAllocHandle handle, VmaBlockMetadata* metadata);\n    CounterStatus CheckCounters(VkDeviceSize bytes);\n    bool IncrementCounters(VkDeviceSize bytes);\n    bool ReallocWithinBlock(VmaBlockVector& vector, VmaDeviceMemoryBlock* block);\n    bool AllocInOtherBlock(size_t start, size_t end, MoveAllocationData& data, VmaBlockVector& vector);\n\n    bool ComputeDefragmentation(VmaBlockVector& vector, size_t index);\n    bool ComputeDefragmentation_Fast(VmaBlockVector& vector);\n    bool ComputeDefragmentation_Balanced(VmaBlockVector& vector, size_t index, bool update);\n    bool ComputeDefragmentation_Full(VmaBlockVector& vector);\n    bool ComputeDefragmentation_Extensive(VmaBlockVector& vector, size_t index);\n\n    void UpdateVectorStatistics(VmaBlockVector& vector, StateBalanced& state);\n    bool MoveDataToFreeBlocks(VmaSuballocationType currentType,\n        VmaBlockVector& vector, size_t firstFreeBlock,\n        bool& texturePresent, bool& bufferPresent, bool& otherPresent);\n};\n#endif // _VMA_DEFRAGMENTATION_CONTEXT\n\n#ifndef _VMA_POOL_T\nstruct VmaPool_T\n{\n    friend struct VmaPoolListItemTraits;\n    VMA_CLASS_NO_COPY_NO_MOVE(VmaPool_T)\npublic:\n    VmaBlockVector m_BlockVector;\n    VmaDedicatedAllocationList m_DedicatedAllocations;\n\n    VmaPool_T(\n        VmaAllocator hAllocator,\n        const VmaPoolCreateInfo& createInfo,\n        VkDeviceSize preferredBlockSize);\n    ~VmaPool_T();\n\n    uint32_t GetId() const { return m_Id; }\n    void SetId(uint32_t id) { VMA_ASSERT(m_Id == 0); m_Id = id; }\n\n    const char* GetName() const { return m_Name; }\n    void SetName(const char* pName);\n\n#if VMA_STATS_STRING_ENABLED\n    //void PrintDetailedMap(class VmaStringBuilder& sb);\n#endif\n\nprivate:\n    uint32_t m_Id;\n    char* m_Name;\n    VmaPool_T* m_PrevPool = VMA_NULL;\n    VmaPool_T* m_NextPool = VMA_NULL;\n};\n\nstruct VmaPoolListItemTraits\n{\n    typedef VmaPool_T ItemType;\n\n    static ItemType* GetPrev(const ItemType* item) { return item->m_PrevPool; }\n    static ItemType* GetNext(const ItemType* item) { return item->m_NextPool; }\n    static ItemType*& AccessPrev(ItemType* item) { return item->m_PrevPool; }\n    static ItemType*& AccessNext(ItemType* item) { return item->m_NextPool; }\n};\n#endif // _VMA_POOL_T\n\n#ifndef _VMA_CURRENT_BUDGET_DATA\nstruct VmaCurrentBudgetData\n{\n    VMA_CLASS_NO_COPY_NO_MOVE(VmaCurrentBudgetData)\npublic:\n\n    VMA_ATOMIC_UINT32 m_BlockCount[VK_MAX_MEMORY_HEAPS];\n    VMA_ATOMIC_UINT32 m_AllocationCount[VK_MAX_MEMORY_HEAPS];\n    VMA_ATOMIC_UINT64 m_BlockBytes[VK_MAX_MEMORY_HEAPS];\n    VMA_ATOMIC_UINT64 m_AllocationBytes[VK_MAX_MEMORY_HEAPS];\n\n#if VMA_MEMORY_BUDGET\n    VMA_ATOMIC_UINT32 m_OperationsSinceBudgetFetch;\n    VMA_RW_MUTEX m_BudgetMutex;\n    uint64_t m_VulkanUsage[VK_MAX_MEMORY_HEAPS];\n    uint64_t m_VulkanBudget[VK_MAX_MEMORY_HEAPS];\n    uint64_t m_BlockBytesAtBudgetFetch[VK_MAX_MEMORY_HEAPS];\n#endif // VMA_MEMORY_BUDGET\n\n    VmaCurrentBudgetData();\n\n    void AddAllocation(uint32_t heapIndex, VkDeviceSize allocationSize);\n    void RemoveAllocation(uint32_t heapIndex, VkDeviceSize allocationSize);\n};\n\n#ifndef _VMA_CURRENT_BUDGET_DATA_FUNCTIONS\nVmaCurrentBudgetData::VmaCurrentBudgetData()\n{\n    for (uint32_t heapIndex = 0; heapIndex < VK_MAX_MEMORY_HEAPS; ++heapIndex)\n    {\n        m_BlockCount[heapIndex] = 0;\n        m_AllocationCount[heapIndex] = 0;\n        m_BlockBytes[heapIndex] = 0;\n        m_AllocationBytes[heapIndex] = 0;\n#if VMA_MEMORY_BUDGET\n        m_VulkanUsage[heapIndex] = 0;\n        m_VulkanBudget[heapIndex] = 0;\n        m_BlockBytesAtBudgetFetch[heapIndex] = 0;\n#endif\n    }\n\n#if VMA_MEMORY_BUDGET\n    m_OperationsSinceBudgetFetch = 0;\n#endif\n}\n\nvoid VmaCurrentBudgetData::AddAllocation(uint32_t heapIndex, VkDeviceSize allocationSize)\n{\n    m_AllocationBytes[heapIndex] += allocationSize;\n    ++m_AllocationCount[heapIndex];\n#if VMA_MEMORY_BUDGET\n    ++m_OperationsSinceBudgetFetch;\n#endif\n}\n\nvoid VmaCurrentBudgetData::RemoveAllocation(uint32_t heapIndex, VkDeviceSize allocationSize)\n{\n    VMA_ASSERT(m_AllocationBytes[heapIndex] >= allocationSize);\n    m_AllocationBytes[heapIndex] -= allocationSize;\n    VMA_ASSERT(m_AllocationCount[heapIndex] > 0);\n    --m_AllocationCount[heapIndex];\n#if VMA_MEMORY_BUDGET\n    ++m_OperationsSinceBudgetFetch;\n#endif\n}\n#endif // _VMA_CURRENT_BUDGET_DATA_FUNCTIONS\n#endif // _VMA_CURRENT_BUDGET_DATA\n\n#ifndef _VMA_ALLOCATION_OBJECT_ALLOCATOR\n/*\nThread-safe wrapper over VmaPoolAllocator free list, for allocation of VmaAllocation_T objects.\n*/\nclass VmaAllocationObjectAllocator\n{\n    VMA_CLASS_NO_COPY_NO_MOVE(VmaAllocationObjectAllocator)\npublic:\n    VmaAllocationObjectAllocator(const VkAllocationCallbacks* pAllocationCallbacks)\n        : m_Allocator(pAllocationCallbacks, 1024) {}\n\n    template<typename... Types> VmaAllocation Allocate(Types&&... args);\n    void Free(VmaAllocation hAlloc);\n\nprivate:\n    VMA_MUTEX m_Mutex;\n    VmaPoolAllocator<VmaAllocation_T> m_Allocator;\n};\n\ntemplate<typename... Types>\nVmaAllocation VmaAllocationObjectAllocator::Allocate(Types&&... args)\n{\n    VmaMutexLock mutexLock(m_Mutex);\n    return m_Allocator.Alloc<Types...>(std::forward<Types>(args)...);\n}\n\nvoid VmaAllocationObjectAllocator::Free(VmaAllocation hAlloc)\n{\n    VmaMutexLock mutexLock(m_Mutex);\n    m_Allocator.Free(hAlloc);\n}\n#endif // _VMA_ALLOCATION_OBJECT_ALLOCATOR\n\n#ifndef _VMA_VIRTUAL_BLOCK_T\nstruct VmaVirtualBlock_T\n{\n    VMA_CLASS_NO_COPY_NO_MOVE(VmaVirtualBlock_T)\npublic:\n    const bool m_AllocationCallbacksSpecified;\n    const VkAllocationCallbacks m_AllocationCallbacks;\n\n    VmaVirtualBlock_T(const VmaVirtualBlockCreateInfo& createInfo);\n    ~VmaVirtualBlock_T();\n\n    VkResult Init() { return VK_SUCCESS; }\n    bool IsEmpty() const { return m_Metadata->IsEmpty(); }\n    void Free(VmaVirtualAllocation allocation) { m_Metadata->Free((VmaAllocHandle)allocation); }\n    void SetAllocationUserData(VmaVirtualAllocation allocation, void* userData) { m_Metadata->SetAllocationUserData((VmaAllocHandle)allocation, userData); }\n    void Clear() { m_Metadata->Clear(); }\n\n    const VkAllocationCallbacks* GetAllocationCallbacks() const;\n    void GetAllocationInfo(VmaVirtualAllocation allocation, VmaVirtualAllocationInfo& outInfo);\n    VkResult Allocate(const VmaVirtualAllocationCreateInfo& createInfo, VmaVirtualAllocation& outAllocation,\n        VkDeviceSize* outOffset);\n    void GetStatistics(VmaStatistics& outStats) const;\n    void CalculateDetailedStatistics(VmaDetailedStatistics& outStats) const;\n#if VMA_STATS_STRING_ENABLED\n    void BuildStatsString(bool detailedMap, VmaStringBuilder& sb) const;\n#endif\n\nprivate:\n    VmaBlockMetadata* m_Metadata;\n};\n\n#ifndef _VMA_VIRTUAL_BLOCK_T_FUNCTIONS\nVmaVirtualBlock_T::VmaVirtualBlock_T(const VmaVirtualBlockCreateInfo& createInfo)\n    : m_AllocationCallbacksSpecified(createInfo.pAllocationCallbacks != VMA_NULL),\n    m_AllocationCallbacks(createInfo.pAllocationCallbacks != VMA_NULL ? *createInfo.pAllocationCallbacks : VmaEmptyAllocationCallbacks)\n{\n    const uint32_t algorithm = createInfo.flags & VMA_VIRTUAL_BLOCK_CREATE_ALGORITHM_MASK;\n    switch (algorithm)\n    {\n    case 0:\n        m_Metadata = vma_new(GetAllocationCallbacks(), VmaBlockMetadata_TLSF)(VK_NULL_HANDLE, 1, true);\n        break;\n    case VMA_VIRTUAL_BLOCK_CREATE_LINEAR_ALGORITHM_BIT:\n        m_Metadata = vma_new(GetAllocationCallbacks(), VmaBlockMetadata_Linear)(VK_NULL_HANDLE, 1, true);\n        break;\n    default:\n        VMA_ASSERT(0);\n        m_Metadata = vma_new(GetAllocationCallbacks(), VmaBlockMetadata_TLSF)(VK_NULL_HANDLE, 1, true);\n    }\n\n    m_Metadata->Init(createInfo.size);\n}\n\nVmaVirtualBlock_T::~VmaVirtualBlock_T()\n{\n    // Define macro VMA_DEBUG_LOG_FORMAT or more specialized VMA_LEAK_LOG_FORMAT\n    // to receive the list of the unfreed allocations.\n    if (!m_Metadata->IsEmpty())\n        m_Metadata->DebugLogAllAllocations();\n    // This is the most important assert in the entire library.\n    // Hitting it means you have some memory leak - unreleased virtual allocations.\n    VMA_ASSERT_LEAK(m_Metadata->IsEmpty() && \"Some virtual allocations were not freed before destruction of this virtual block!\");\n\n    vma_delete(GetAllocationCallbacks(), m_Metadata);\n}\n\nconst VkAllocationCallbacks* VmaVirtualBlock_T::GetAllocationCallbacks() const\n{\n    return m_AllocationCallbacksSpecified ? &m_AllocationCallbacks : VMA_NULL;\n}\n\nvoid VmaVirtualBlock_T::GetAllocationInfo(VmaVirtualAllocation allocation, VmaVirtualAllocationInfo& outInfo)\n{\n    m_Metadata->GetAllocationInfo((VmaAllocHandle)allocation, outInfo);\n}\n\nVkResult VmaVirtualBlock_T::Allocate(const VmaVirtualAllocationCreateInfo& createInfo, VmaVirtualAllocation& outAllocation,\n    VkDeviceSize* outOffset)\n{\n    VmaAllocationRequest request = {};\n    if (m_Metadata->CreateAllocationRequest(\n        createInfo.size, // allocSize\n        VMA_MAX(createInfo.alignment, (VkDeviceSize)1), // allocAlignment\n        (createInfo.flags & VMA_VIRTUAL_ALLOCATION_CREATE_UPPER_ADDRESS_BIT) != 0, // upperAddress\n        VMA_SUBALLOCATION_TYPE_UNKNOWN, // allocType - unimportant\n        createInfo.flags & VMA_VIRTUAL_ALLOCATION_CREATE_STRATEGY_MASK, // strategy\n        &request))\n    {\n        m_Metadata->Alloc(request,\n            VMA_SUBALLOCATION_TYPE_UNKNOWN, // type - unimportant\n            createInfo.pUserData);\n        outAllocation = (VmaVirtualAllocation)request.allocHandle;\n        if(outOffset)\n            *outOffset = m_Metadata->GetAllocationOffset(request.allocHandle);\n        return VK_SUCCESS;\n    }\n    outAllocation = (VmaVirtualAllocation)VK_NULL_HANDLE;\n    if (outOffset)\n        *outOffset = UINT64_MAX;\n    return VK_ERROR_OUT_OF_DEVICE_MEMORY;\n}\n\nvoid VmaVirtualBlock_T::GetStatistics(VmaStatistics& outStats) const\n{\n    VmaClearStatistics(outStats);\n    m_Metadata->AddStatistics(outStats);\n}\n\nvoid VmaVirtualBlock_T::CalculateDetailedStatistics(VmaDetailedStatistics& outStats) const\n{\n    VmaClearDetailedStatistics(outStats);\n    m_Metadata->AddDetailedStatistics(outStats);\n}\n\n#if VMA_STATS_STRING_ENABLED\nvoid VmaVirtualBlock_T::BuildStatsString(bool detailedMap, VmaStringBuilder& sb) const\n{\n    VmaJsonWriter json(GetAllocationCallbacks(), sb);\n    json.BeginObject();\n\n    VmaDetailedStatistics stats;\n    CalculateDetailedStatistics(stats);\n\n    json.WriteString(\"Stats\");\n    VmaPrintDetailedStatistics(json, stats);\n\n    if (detailedMap)\n    {\n        json.WriteString(\"Details\");\n        json.BeginObject();\n        m_Metadata->PrintDetailedMap(json);\n        json.EndObject();\n    }\n\n    json.EndObject();\n}\n#endif // VMA_STATS_STRING_ENABLED\n#endif // _VMA_VIRTUAL_BLOCK_T_FUNCTIONS\n#endif // _VMA_VIRTUAL_BLOCK_T\n\n\n// Main allocator object.\nstruct VmaAllocator_T\n{\n    VMA_CLASS_NO_COPY_NO_MOVE(VmaAllocator_T)\npublic:\n    const bool m_UseMutex;\n    const uint32_t m_VulkanApiVersion;\n    bool m_UseKhrDedicatedAllocation; // Can be set only if m_VulkanApiVersion < VK_MAKE_VERSION(1, 1, 0).\n    bool m_UseKhrBindMemory2; // Can be set only if m_VulkanApiVersion < VK_MAKE_VERSION(1, 1, 0).\n    bool m_UseExtMemoryBudget;\n    bool m_UseAmdDeviceCoherentMemory;\n    bool m_UseKhrBufferDeviceAddress;\n    bool m_UseExtMemoryPriority;\n    bool m_UseKhrMaintenance4;\n    bool m_UseKhrMaintenance5;\n    bool m_UseKhrExternalMemoryWin32;\n    const VkDevice m_hDevice;\n    const VkInstance m_hInstance;\n    const bool m_AllocationCallbacksSpecified;\n    const VkAllocationCallbacks m_AllocationCallbacks;\n    VmaDeviceMemoryCallbacks m_DeviceMemoryCallbacks;\n    VmaAllocationObjectAllocator m_AllocationObjectAllocator;\n\n    // Each bit (1 << i) is set if HeapSizeLimit is enabled for that heap, so cannot allocate more than the heap size.\n    uint32_t m_HeapSizeLimitMask;\n\n    VkPhysicalDeviceProperties m_PhysicalDeviceProperties;\n    VkPhysicalDeviceMemoryProperties m_MemProps;\n\n    // Default pools.\n    VmaBlockVector* m_pBlockVectors[VK_MAX_MEMORY_TYPES];\n    VmaDedicatedAllocationList m_DedicatedAllocations[VK_MAX_MEMORY_TYPES];\n\n    VmaCurrentBudgetData m_Budget;\n    VMA_ATOMIC_UINT32 m_DeviceMemoryCount; // Total number of VkDeviceMemory objects.\n\n    VmaAllocator_T(const VmaAllocatorCreateInfo* pCreateInfo);\n    VkResult Init(const VmaAllocatorCreateInfo* pCreateInfo);\n    ~VmaAllocator_T();\n\n    const VkAllocationCallbacks* GetAllocationCallbacks() const\n    {\n        return m_AllocationCallbacksSpecified ? &m_AllocationCallbacks : VMA_NULL;\n    }\n    const VmaVulkanFunctions& GetVulkanFunctions() const\n    {\n        return m_VulkanFunctions;\n    }\n\n    VkPhysicalDevice GetPhysicalDevice() const { return m_PhysicalDevice; }\n\n    VkDeviceSize GetBufferImageGranularity() const\n    {\n        return VMA_MAX(\n            static_cast<VkDeviceSize>(VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY),\n            m_PhysicalDeviceProperties.limits.bufferImageGranularity);\n    }\n\n    uint32_t GetMemoryHeapCount() const { return m_MemProps.memoryHeapCount; }\n    uint32_t GetMemoryTypeCount() const { return m_MemProps.memoryTypeCount; }\n\n    uint32_t MemoryTypeIndexToHeapIndex(uint32_t memTypeIndex) const\n    {\n        VMA_ASSERT(memTypeIndex < m_MemProps.memoryTypeCount);\n        return m_MemProps.memoryTypes[memTypeIndex].heapIndex;\n    }\n    // True when specific memory type is HOST_VISIBLE but not HOST_COHERENT.\n    bool IsMemoryTypeNonCoherent(uint32_t memTypeIndex) const\n    {\n        return (m_MemProps.memoryTypes[memTypeIndex].propertyFlags & (VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) ==\n            VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;\n    }\n    // Minimum alignment for all allocations in specific memory type.\n    VkDeviceSize GetMemoryTypeMinAlignment(uint32_t memTypeIndex) const\n    {\n        return IsMemoryTypeNonCoherent(memTypeIndex) ?\n            VMA_MAX((VkDeviceSize)VMA_MIN_ALIGNMENT, m_PhysicalDeviceProperties.limits.nonCoherentAtomSize) :\n            (VkDeviceSize)VMA_MIN_ALIGNMENT;\n    }\n\n    bool IsIntegratedGpu() const\n    {\n        return m_PhysicalDeviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU;\n    }\n\n    uint32_t GetGlobalMemoryTypeBits() const { return m_GlobalMemoryTypeBits; }\n\n    void GetBufferMemoryRequirements(\n        VkBuffer hBuffer,\n        VkMemoryRequirements& memReq,\n        bool& requiresDedicatedAllocation,\n        bool& prefersDedicatedAllocation) const;\n    void GetImageMemoryRequirements(\n        VkImage hImage,\n        VkMemoryRequirements& memReq,\n        bool& requiresDedicatedAllocation,\n        bool& prefersDedicatedAllocation) const;\n    VkResult FindMemoryTypeIndex(\n        uint32_t memoryTypeBits,\n        const VmaAllocationCreateInfo* pAllocationCreateInfo,\n        VmaBufferImageUsage bufImgUsage,\n        uint32_t* pMemoryTypeIndex) const;\n\n    // Main allocation function.\n    VkResult AllocateMemory(\n        const VkMemoryRequirements& vkMemReq,\n        bool requiresDedicatedAllocation,\n        bool prefersDedicatedAllocation,\n        VkBuffer dedicatedBuffer,\n        VkImage dedicatedImage,\n        VmaBufferImageUsage dedicatedBufferImageUsage,\n        const VmaAllocationCreateInfo& createInfo,\n        VmaSuballocationType suballocType,\n        size_t allocationCount,\n        VmaAllocation* pAllocations);\n\n    // Main deallocation function.\n    void FreeMemory(\n        size_t allocationCount,\n        const VmaAllocation* pAllocations);\n\n    void CalculateStatistics(VmaTotalStatistics* pStats);\n\n    void GetHeapBudgets(\n        VmaBudget* outBudgets, uint32_t firstHeap, uint32_t heapCount);\n\n#if VMA_STATS_STRING_ENABLED\n    void PrintDetailedMap(class VmaJsonWriter& json);\n#endif\n\n    void GetAllocationInfo(VmaAllocation hAllocation, VmaAllocationInfo* pAllocationInfo);\n    void GetAllocationInfo2(VmaAllocation hAllocation, VmaAllocationInfo2* pAllocationInfo);\n\n    VkResult CreatePool(const VmaPoolCreateInfo* pCreateInfo, VmaPool* pPool);\n    void DestroyPool(VmaPool pool);\n    void GetPoolStatistics(VmaPool pool, VmaStatistics* pPoolStats);\n    void CalculatePoolStatistics(VmaPool pool, VmaDetailedStatistics* pPoolStats);\n\n    void SetCurrentFrameIndex(uint32_t frameIndex);\n    uint32_t GetCurrentFrameIndex() const { return m_CurrentFrameIndex.load(); }\n\n    VkResult CheckPoolCorruption(VmaPool hPool);\n    VkResult CheckCorruption(uint32_t memoryTypeBits);\n\n    // Call to Vulkan function vkAllocateMemory with accompanying bookkeeping.\n    VkResult AllocateVulkanMemory(const VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory);\n    // Call to Vulkan function vkFreeMemory with accompanying bookkeeping.\n    void FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory);\n    // Call to Vulkan function vkBindBufferMemory or vkBindBufferMemory2KHR.\n    VkResult BindVulkanBuffer(\n        VkDeviceMemory memory,\n        VkDeviceSize memoryOffset,\n        VkBuffer buffer,\n        const void* pNext);\n    // Call to Vulkan function vkBindImageMemory or vkBindImageMemory2KHR.\n    VkResult BindVulkanImage(\n        VkDeviceMemory memory,\n        VkDeviceSize memoryOffset,\n        VkImage image,\n        const void* pNext);\n\n    VkResult Map(VmaAllocation hAllocation, void** ppData);\n    void Unmap(VmaAllocation hAllocation);\n\n    VkResult BindBufferMemory(\n        VmaAllocation hAllocation,\n        VkDeviceSize allocationLocalOffset,\n        VkBuffer hBuffer,\n        const void* pNext);\n    VkResult BindImageMemory(\n        VmaAllocation hAllocation,\n        VkDeviceSize allocationLocalOffset,\n        VkImage hImage,\n        const void* pNext);\n\n    VkResult FlushOrInvalidateAllocation(\n        VmaAllocation hAllocation,\n        VkDeviceSize offset, VkDeviceSize size,\n        VMA_CACHE_OPERATION op);\n    VkResult FlushOrInvalidateAllocations(\n        uint32_t allocationCount,\n        const VmaAllocation* allocations,\n        const VkDeviceSize* offsets, const VkDeviceSize* sizes,\n        VMA_CACHE_OPERATION op);\n\n    VkResult CopyMemoryToAllocation(\n        const void* pSrcHostPointer,\n        VmaAllocation dstAllocation,\n        VkDeviceSize dstAllocationLocalOffset,\n        VkDeviceSize size);\n    VkResult CopyAllocationToMemory(\n        VmaAllocation srcAllocation,\n        VkDeviceSize srcAllocationLocalOffset,\n        void* pDstHostPointer,\n        VkDeviceSize size);\n\n    void FillAllocation(const VmaAllocation hAllocation, uint8_t pattern);\n\n    /*\n    Returns bit mask of memory types that can support defragmentation on GPU as\n    they support creation of required buffer for copy operations.\n    */\n    uint32_t GetGpuDefragmentationMemoryTypeBits();\n\n#if VMA_EXTERNAL_MEMORY\n    VkExternalMemoryHandleTypeFlagsKHR GetExternalMemoryHandleTypeFlags(uint32_t memTypeIndex) const\n    {\n        return m_TypeExternalMemoryHandleTypes[memTypeIndex];\n    }\n#endif // #if VMA_EXTERNAL_MEMORY\n\nprivate:\n    VkDeviceSize m_PreferredLargeHeapBlockSize;\n\n    VkPhysicalDevice m_PhysicalDevice;\n    VMA_ATOMIC_UINT32 m_CurrentFrameIndex;\n    VMA_ATOMIC_UINT32 m_GpuDefragmentationMemoryTypeBits; // UINT32_MAX means uninitialized.\n#if VMA_EXTERNAL_MEMORY\n    VkExternalMemoryHandleTypeFlagsKHR m_TypeExternalMemoryHandleTypes[VK_MAX_MEMORY_TYPES];\n#endif // #if VMA_EXTERNAL_MEMORY\n\n    VMA_RW_MUTEX m_PoolsMutex;\n    typedef VmaIntrusiveLinkedList<VmaPoolListItemTraits> PoolList;\n    // Protected by m_PoolsMutex.\n    PoolList m_Pools;\n    uint32_t m_NextPoolId;\n\n    VmaVulkanFunctions m_VulkanFunctions;\n\n    // Global bit mask AND-ed with any memoryTypeBits to disallow certain memory types.\n    uint32_t m_GlobalMemoryTypeBits;\n\n    void ImportVulkanFunctions(const VmaVulkanFunctions* pVulkanFunctions);\n\n#if VMA_STATIC_VULKAN_FUNCTIONS == 1\n    void ImportVulkanFunctions_Static();\n#endif\n\n    void ImportVulkanFunctions_Custom(const VmaVulkanFunctions* pVulkanFunctions);\n\n#if VMA_DYNAMIC_VULKAN_FUNCTIONS == 1\n    void ImportVulkanFunctions_Dynamic();\n#endif\n\n    void ValidateVulkanFunctions();\n\n    VkDeviceSize CalcPreferredBlockSize(uint32_t memTypeIndex);\n\n    VkResult AllocateMemoryOfType(\n        VmaPool pool,\n        VkDeviceSize size,\n        VkDeviceSize alignment,\n        bool dedicatedPreferred,\n        VkBuffer dedicatedBuffer,\n        VkImage dedicatedImage,\n        VmaBufferImageUsage dedicatedBufferImageUsage,\n        const VmaAllocationCreateInfo& createInfo,\n        uint32_t memTypeIndex,\n        VmaSuballocationType suballocType,\n        VmaDedicatedAllocationList& dedicatedAllocations,\n        VmaBlockVector& blockVector,\n        size_t allocationCount,\n        VmaAllocation* pAllocations);\n\n    // Helper function only to be used inside AllocateDedicatedMemory.\n    VkResult AllocateDedicatedMemoryPage(\n        VmaPool pool,\n        VkDeviceSize size,\n        VmaSuballocationType suballocType,\n        uint32_t memTypeIndex,\n        const VkMemoryAllocateInfo& allocInfo,\n        bool map,\n        bool isUserDataString,\n        bool isMappingAllowed,\n        void* pUserData,\n        VmaAllocation* pAllocation);\n\n    // Allocates and registers new VkDeviceMemory specifically for dedicated allocations.\n    VkResult AllocateDedicatedMemory(\n        VmaPool pool,\n        VkDeviceSize size,\n        VmaSuballocationType suballocType,\n        VmaDedicatedAllocationList& dedicatedAllocations,\n        uint32_t memTypeIndex,\n        bool map,\n        bool isUserDataString,\n        bool isMappingAllowed,\n        bool canAliasMemory,\n        void* pUserData,\n        float priority,\n        VkBuffer dedicatedBuffer,\n        VkImage dedicatedImage,\n        VmaBufferImageUsage dedicatedBufferImageUsage,\n        size_t allocationCount,\n        VmaAllocation* pAllocations,\n        const void* pNextChain = VMA_NULL);\n\n    void FreeDedicatedMemory(const VmaAllocation allocation);\n\n    VkResult CalcMemTypeParams(\n        VmaAllocationCreateInfo& outCreateInfo,\n        uint32_t memTypeIndex,\n        VkDeviceSize size,\n        size_t allocationCount);\n    VkResult CalcAllocationParams(\n        VmaAllocationCreateInfo& outCreateInfo,\n        bool dedicatedRequired,\n        bool dedicatedPreferred);\n\n    /*\n    Calculates and returns bit mask of memory types that can support defragmentation\n    on GPU as they support creation of required buffer for copy operations.\n    */\n    uint32_t CalculateGpuDefragmentationMemoryTypeBits() const;\n    uint32_t CalculateGlobalMemoryTypeBits() const;\n\n    bool GetFlushOrInvalidateRange(\n        VmaAllocation allocation,\n        VkDeviceSize offset, VkDeviceSize size,\n        VkMappedMemoryRange& outRange) const;\n\n#if VMA_MEMORY_BUDGET\n    void UpdateVulkanBudget();\n#endif // #if VMA_MEMORY_BUDGET\n};\n\n\n#ifndef _VMA_MEMORY_FUNCTIONS\nstatic void* VmaMalloc(VmaAllocator hAllocator, size_t size, size_t alignment)\n{\n    return VmaMalloc(&hAllocator->m_AllocationCallbacks, size, alignment);\n}\n\nstatic void VmaFree(VmaAllocator hAllocator, void* ptr)\n{\n    VmaFree(&hAllocator->m_AllocationCallbacks, ptr);\n}\n\ntemplate<typename T>\nstatic T* VmaAllocate(VmaAllocator hAllocator)\n{\n    return (T*)VmaMalloc(hAllocator, sizeof(T), VMA_ALIGN_OF(T));\n}\n\ntemplate<typename T>\nstatic T* VmaAllocateArray(VmaAllocator hAllocator, size_t count)\n{\n    return (T*)VmaMalloc(hAllocator, sizeof(T) * count, VMA_ALIGN_OF(T));\n}\n\ntemplate<typename T>\nstatic void vma_delete(VmaAllocator hAllocator, T* ptr)\n{\n    if(ptr != VMA_NULL)\n    {\n        ptr->~T();\n        VmaFree(hAllocator, ptr);\n    }\n}\n\ntemplate<typename T>\nstatic void vma_delete_array(VmaAllocator hAllocator, T* ptr, size_t count)\n{\n    if(ptr != VMA_NULL)\n    {\n        for(size_t i = count; i--; )\n            ptr[i].~T();\n        VmaFree(hAllocator, ptr);\n    }\n}\n#endif // _VMA_MEMORY_FUNCTIONS\n\n#ifndef _VMA_DEVICE_MEMORY_BLOCK_FUNCTIONS\nVmaDeviceMemoryBlock::VmaDeviceMemoryBlock(VmaAllocator hAllocator)\n    : m_pMetadata(VMA_NULL),\n    m_MemoryTypeIndex(UINT32_MAX),\n    m_Id(0),\n    m_hMemory(VK_NULL_HANDLE),\n    m_MapCount(0),\n    m_pMappedData(VMA_NULL){}\n\nVmaDeviceMemoryBlock::~VmaDeviceMemoryBlock()\n{\n    VMA_ASSERT_LEAK(m_MapCount == 0 && \"VkDeviceMemory block is being destroyed while it is still mapped.\");\n    VMA_ASSERT_LEAK(m_hMemory == VK_NULL_HANDLE);\n}\n\nvoid VmaDeviceMemoryBlock::Init(\n    VmaAllocator hAllocator,\n    VmaPool hParentPool,\n    uint32_t newMemoryTypeIndex,\n    VkDeviceMemory newMemory,\n    VkDeviceSize newSize,\n    uint32_t id,\n    uint32_t algorithm,\n    VkDeviceSize bufferImageGranularity)\n{\n    VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);\n\n    m_hParentPool = hParentPool;\n    m_MemoryTypeIndex = newMemoryTypeIndex;\n    m_Id = id;\n    m_hMemory = newMemory;\n\n    switch (algorithm)\n    {\n    case 0:\n        m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_TLSF)(hAllocator->GetAllocationCallbacks(),\n            bufferImageGranularity, false); // isVirtual\n        break;\n    case VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT:\n        m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Linear)(hAllocator->GetAllocationCallbacks(),\n            bufferImageGranularity, false); // isVirtual\n        break;\n    default:\n        VMA_ASSERT(0);\n        m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_TLSF)(hAllocator->GetAllocationCallbacks(),\n            bufferImageGranularity, false); // isVirtual\n    }\n    m_pMetadata->Init(newSize);\n}\n\nvoid VmaDeviceMemoryBlock::Destroy(VmaAllocator allocator)\n{\n    // Define macro VMA_DEBUG_LOG_FORMAT or more specialized VMA_LEAK_LOG_FORMAT\n    // to receive the list of the unfreed allocations.\n    if (!m_pMetadata->IsEmpty())\n        m_pMetadata->DebugLogAllAllocations();\n    // This is the most important assert in the entire library.\n    // Hitting it means you have some memory leak - unreleased VmaAllocation objects.\n    VMA_ASSERT_LEAK(m_pMetadata->IsEmpty() && \"Some allocations were not freed before destruction of this memory block!\");\n\n    VMA_ASSERT_LEAK(m_hMemory != VK_NULL_HANDLE);\n    allocator->FreeVulkanMemory(m_MemoryTypeIndex, m_pMetadata->GetSize(), m_hMemory);\n    m_hMemory = VK_NULL_HANDLE;\n\n    vma_delete(allocator, m_pMetadata);\n    m_pMetadata = VMA_NULL;\n}\n\nvoid VmaDeviceMemoryBlock::PostAlloc(VmaAllocator hAllocator)\n{\n    VmaMutexLock lock(m_MapAndBindMutex, hAllocator->m_UseMutex);\n    m_MappingHysteresis.PostAlloc();\n}\n\nvoid VmaDeviceMemoryBlock::PostFree(VmaAllocator hAllocator)\n{\n    VmaMutexLock lock(m_MapAndBindMutex, hAllocator->m_UseMutex);\n    if(m_MappingHysteresis.PostFree())\n    {\n        VMA_ASSERT(m_MappingHysteresis.GetExtraMapping() == 0);\n        if (m_MapCount == 0)\n        {\n            m_pMappedData = VMA_NULL;\n            (*hAllocator->GetVulkanFunctions().vkUnmapMemory)(hAllocator->m_hDevice, m_hMemory);\n        }\n    }\n}\n\nbool VmaDeviceMemoryBlock::Validate() const\n{\n    VMA_VALIDATE((m_hMemory != VK_NULL_HANDLE) &&\n        (m_pMetadata->GetSize() != 0));\n\n    return m_pMetadata->Validate();\n}\n\nVkResult VmaDeviceMemoryBlock::CheckCorruption(VmaAllocator hAllocator)\n{\n    void* pData = VMA_NULL;\n    VkResult res = Map(hAllocator, 1, &pData);\n    if (res != VK_SUCCESS)\n    {\n        return res;\n    }\n\n    res = m_pMetadata->CheckCorruption(pData);\n\n    Unmap(hAllocator, 1);\n\n    return res;\n}\n\nVkResult VmaDeviceMemoryBlock::Map(VmaAllocator hAllocator, uint32_t count, void** ppData)\n{\n    if (count == 0)\n    {\n        return VK_SUCCESS;\n    }\n\n    VmaMutexLock lock(m_MapAndBindMutex, hAllocator->m_UseMutex);\n    const uint32_t oldTotalMapCount = m_MapCount + m_MappingHysteresis.GetExtraMapping();\n    if (oldTotalMapCount != 0)\n    {\n        VMA_ASSERT(m_pMappedData != VMA_NULL);\n        m_MappingHysteresis.PostMap();\n        m_MapCount += count;\n        if (ppData != VMA_NULL)\n        {\n            *ppData = m_pMappedData;\n        }\n        return VK_SUCCESS;\n    }\n    else\n    {\n        VkResult result = (*hAllocator->GetVulkanFunctions().vkMapMemory)(\n            hAllocator->m_hDevice,\n            m_hMemory,\n            0, // offset\n            VK_WHOLE_SIZE,\n            0, // flags\n            &m_pMappedData);\n        if (result == VK_SUCCESS)\n        {\n            VMA_ASSERT(m_pMappedData != VMA_NULL);\n            m_MappingHysteresis.PostMap();\n            m_MapCount = count;\n            if (ppData != VMA_NULL)\n            {\n                *ppData = m_pMappedData;\n            }\n        }\n        return result;\n    }\n}\n\nvoid VmaDeviceMemoryBlock::Unmap(VmaAllocator hAllocator, uint32_t count)\n{\n    if (count == 0)\n    {\n        return;\n    }\n\n    VmaMutexLock lock(m_MapAndBindMutex, hAllocator->m_UseMutex);\n    if (m_MapCount >= count)\n    {\n        m_MapCount -= count;\n        const uint32_t totalMapCount = m_MapCount + m_MappingHysteresis.GetExtraMapping();\n        if (totalMapCount == 0)\n        {\n            m_pMappedData = VMA_NULL;\n            (*hAllocator->GetVulkanFunctions().vkUnmapMemory)(hAllocator->m_hDevice, m_hMemory);\n        }\n        m_MappingHysteresis.PostUnmap();\n    }\n    else\n    {\n        VMA_ASSERT(0 && \"VkDeviceMemory block is being unmapped while it was not previously mapped.\");\n    }\n}\n\nVkResult VmaDeviceMemoryBlock::WriteMagicValueAfterAllocation(VmaAllocator hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize)\n{\n    VMA_ASSERT(VMA_DEBUG_MARGIN > 0 && VMA_DEBUG_MARGIN % 4 == 0 && VMA_DEBUG_DETECT_CORRUPTION);\n\n    void* pData;\n    VkResult res = Map(hAllocator, 1, &pData);\n    if (res != VK_SUCCESS)\n    {\n        return res;\n    }\n\n    VmaWriteMagicValue(pData, allocOffset + allocSize);\n\n    Unmap(hAllocator, 1);\n    return VK_SUCCESS;\n}\n\nVkResult VmaDeviceMemoryBlock::ValidateMagicValueAfterAllocation(VmaAllocator hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize)\n{\n    VMA_ASSERT(VMA_DEBUG_MARGIN > 0 && VMA_DEBUG_MARGIN % 4 == 0 && VMA_DEBUG_DETECT_CORRUPTION);\n\n    void* pData;\n    VkResult res = Map(hAllocator, 1, &pData);\n    if (res != VK_SUCCESS)\n    {\n        return res;\n    }\n\n    if (!VmaValidateMagicValue(pData, allocOffset + allocSize))\n    {\n        VMA_ASSERT(0 && \"MEMORY CORRUPTION DETECTED AFTER FREED ALLOCATION!\");\n    }\n\n    Unmap(hAllocator, 1);\n    return VK_SUCCESS;\n}\n\nVkResult VmaDeviceMemoryBlock::BindBufferMemory(\n    const VmaAllocator hAllocator,\n    const VmaAllocation hAllocation,\n    VkDeviceSize allocationLocalOffset,\n    VkBuffer hBuffer,\n    const void* pNext)\n{\n    VMA_ASSERT(hAllocation->GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &&\n        hAllocation->GetBlock() == this);\n    VMA_ASSERT(allocationLocalOffset < hAllocation->GetSize() &&\n        \"Invalid allocationLocalOffset. Did you forget that this offset is relative to the beginning of the allocation, not the whole memory block?\");\n    const VkDeviceSize memoryOffset = hAllocation->GetOffset() + allocationLocalOffset;\n    // This lock is important so that we don't call vkBind... and/or vkMap... simultaneously on the same VkDeviceMemory from multiple threads.\n    VmaMutexLock lock(m_MapAndBindMutex, hAllocator->m_UseMutex);\n    return hAllocator->BindVulkanBuffer(m_hMemory, memoryOffset, hBuffer, pNext);\n}\n\nVkResult VmaDeviceMemoryBlock::BindImageMemory(\n    const VmaAllocator hAllocator,\n    const VmaAllocation hAllocation,\n    VkDeviceSize allocationLocalOffset,\n    VkImage hImage,\n    const void* pNext)\n{\n    VMA_ASSERT(hAllocation->GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &&\n        hAllocation->GetBlock() == this);\n    VMA_ASSERT(allocationLocalOffset < hAllocation->GetSize() &&\n        \"Invalid allocationLocalOffset. Did you forget that this offset is relative to the beginning of the allocation, not the whole memory block?\");\n    const VkDeviceSize memoryOffset = hAllocation->GetOffset() + allocationLocalOffset;\n    // This lock is important so that we don't call vkBind... and/or vkMap... simultaneously on the same VkDeviceMemory from multiple threads.\n    VmaMutexLock lock(m_MapAndBindMutex, hAllocator->m_UseMutex);\n    return hAllocator->BindVulkanImage(m_hMemory, memoryOffset, hImage, pNext);\n}\n\n#if VMA_EXTERNAL_MEMORY_WIN32\nVkResult VmaDeviceMemoryBlock::CreateWin32Handle(const VmaAllocator hAllocator, PFN_vkGetMemoryWin32HandleKHR pvkGetMemoryWin32HandleKHR, HANDLE hTargetProcess, HANDLE* pHandle) noexcept\n{\n    VMA_ASSERT(pHandle);\n    return m_Handle.GetHandle(hAllocator->m_hDevice, m_hMemory, pvkGetMemoryWin32HandleKHR, hTargetProcess, hAllocator->m_UseMutex, pHandle);\n}\n#endif // VMA_EXTERNAL_MEMORY_WIN32\n#endif // _VMA_DEVICE_MEMORY_BLOCK_FUNCTIONS\n\n#ifndef _VMA_ALLOCATION_T_FUNCTIONS\nVmaAllocation_T::VmaAllocation_T(bool mappingAllowed)\n    : m_Alignment{ 1 },\n    m_Size{ 0 },\n    m_pUserData{ VMA_NULL },\n    m_pName{ VMA_NULL },\n    m_MemoryTypeIndex{ 0 },\n    m_Type{ (uint8_t)ALLOCATION_TYPE_NONE },\n    m_SuballocationType{ (uint8_t)VMA_SUBALLOCATION_TYPE_UNKNOWN },\n    m_MapCount{ 0 },\n    m_Flags{ 0 }\n{\n    if(mappingAllowed)\n        m_Flags |= (uint8_t)FLAG_MAPPING_ALLOWED;\n}\n\nVmaAllocation_T::~VmaAllocation_T()\n{\n    VMA_ASSERT_LEAK(m_MapCount == 0 && \"Allocation was not unmapped before destruction.\");\n\n    // Check if owned string was freed.\n    VMA_ASSERT(m_pName == VMA_NULL);\n}\n\nvoid VmaAllocation_T::InitBlockAllocation(\n    VmaDeviceMemoryBlock* block,\n    VmaAllocHandle allocHandle,\n    VkDeviceSize alignment,\n    VkDeviceSize size,\n    uint32_t memoryTypeIndex,\n    VmaSuballocationType suballocationType,\n    bool mapped)\n{\n    VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);\n    VMA_ASSERT(block != VMA_NULL);\n    m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;\n    m_Alignment = alignment;\n    m_Size = size;\n    m_MemoryTypeIndex = memoryTypeIndex;\n    if(mapped)\n    {\n        VMA_ASSERT(IsMappingAllowed() && \"Mapping is not allowed on this allocation! Please use one of the new VMA_ALLOCATION_CREATE_HOST_ACCESS_* flags when creating it.\");\n        m_Flags |= (uint8_t)FLAG_PERSISTENT_MAP;\n    }\n    m_SuballocationType = (uint8_t)suballocationType;\n    m_BlockAllocation.m_Block = block;\n    m_BlockAllocation.m_AllocHandle = allocHandle;\n}\n\nvoid VmaAllocation_T::InitDedicatedAllocation(\n    VmaAllocator allocator,\n    VmaPool hParentPool,\n    uint32_t memoryTypeIndex,\n    VkDeviceMemory hMemory,\n    VmaSuballocationType suballocationType,\n    void* pMappedData,\n    VkDeviceSize size)\n{\n    VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);\n    VMA_ASSERT(hMemory != VK_NULL_HANDLE);\n    m_Type = (uint8_t)ALLOCATION_TYPE_DEDICATED;\n    m_Alignment = 0;\n    m_Size = size;\n    m_MemoryTypeIndex = memoryTypeIndex;\n    m_SuballocationType = (uint8_t)suballocationType;\n    m_DedicatedAllocation.m_ExtraData = VMA_NULL;\n    m_DedicatedAllocation.m_hParentPool = hParentPool;\n    m_DedicatedAllocation.m_hMemory = hMemory;\n    m_DedicatedAllocation.m_Prev = VMA_NULL;\n    m_DedicatedAllocation.m_Next = VMA_NULL;\n\n    if (pMappedData != VMA_NULL)\n    {\n        VMA_ASSERT(IsMappingAllowed() && \"Mapping is not allowed on this allocation! Please use one of the new VMA_ALLOCATION_CREATE_HOST_ACCESS_* flags when creating it.\");\n        m_Flags |= (uint8_t)FLAG_PERSISTENT_MAP;\n        EnsureExtraData(allocator);\n        m_DedicatedAllocation.m_ExtraData->m_pMappedData = pMappedData;\n    }\n}\n\nvoid VmaAllocation_T::Destroy(VmaAllocator allocator)\n{\n    FreeName(allocator);\n\n    if (GetType() == ALLOCATION_TYPE_DEDICATED)\n    {\n        vma_delete(allocator, m_DedicatedAllocation.m_ExtraData);\n    }\n}\n\nvoid VmaAllocation_T::SetName(VmaAllocator hAllocator, const char* pName)\n{\n    VMA_ASSERT(pName == VMA_NULL || pName != m_pName);\n\n    FreeName(hAllocator);\n\n    if (pName != VMA_NULL)\n        m_pName = VmaCreateStringCopy(hAllocator->GetAllocationCallbacks(), pName);\n}\n\nuint8_t VmaAllocation_T::SwapBlockAllocation(VmaAllocator hAllocator, VmaAllocation allocation)\n{\n    VMA_ASSERT(allocation != VMA_NULL);\n    VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);\n    VMA_ASSERT(allocation->m_Type == ALLOCATION_TYPE_BLOCK);\n\n    if (m_MapCount != 0)\n        m_BlockAllocation.m_Block->Unmap(hAllocator, m_MapCount);\n\n    m_BlockAllocation.m_Block->m_pMetadata->SetAllocationUserData(m_BlockAllocation.m_AllocHandle, allocation);\n    std::swap(m_BlockAllocation, allocation->m_BlockAllocation);\n    m_BlockAllocation.m_Block->m_pMetadata->SetAllocationUserData(m_BlockAllocation.m_AllocHandle, this);\n\n#if VMA_STATS_STRING_ENABLED\n    std::swap(m_BufferImageUsage, allocation->m_BufferImageUsage);\n#endif\n    return m_MapCount;\n}\n\nVmaAllocHandle VmaAllocation_T::GetAllocHandle() const\n{\n    switch (m_Type)\n    {\n    case ALLOCATION_TYPE_BLOCK:\n        return m_BlockAllocation.m_AllocHandle;\n    case ALLOCATION_TYPE_DEDICATED:\n        return VK_NULL_HANDLE;\n    default:\n        VMA_ASSERT(0);\n        return VK_NULL_HANDLE;\n    }\n}\n\nVkDeviceSize VmaAllocation_T::GetOffset() const\n{\n    switch (m_Type)\n    {\n    case ALLOCATION_TYPE_BLOCK:\n        return m_BlockAllocation.m_Block->m_pMetadata->GetAllocationOffset(m_BlockAllocation.m_AllocHandle);\n    case ALLOCATION_TYPE_DEDICATED:\n        return 0;\n    default:\n        VMA_ASSERT(0);\n        return 0;\n    }\n}\n\nVmaPool VmaAllocation_T::GetParentPool() const\n{\n    switch (m_Type)\n    {\n    case ALLOCATION_TYPE_BLOCK:\n        return m_BlockAllocation.m_Block->GetParentPool();\n    case ALLOCATION_TYPE_DEDICATED:\n        return m_DedicatedAllocation.m_hParentPool;\n    default:\n        VMA_ASSERT(0);\n        return VK_NULL_HANDLE;\n    }\n}\n\nVkDeviceMemory VmaAllocation_T::GetMemory() const\n{\n    switch (m_Type)\n    {\n    case ALLOCATION_TYPE_BLOCK:\n        return m_BlockAllocation.m_Block->GetDeviceMemory();\n    case ALLOCATION_TYPE_DEDICATED:\n        return m_DedicatedAllocation.m_hMemory;\n    default:\n        VMA_ASSERT(0);\n        return VK_NULL_HANDLE;\n    }\n}\n\nvoid* VmaAllocation_T::GetMappedData() const\n{\n    switch (m_Type)\n    {\n    case ALLOCATION_TYPE_BLOCK:\n        if (m_MapCount != 0 || IsPersistentMap())\n        {\n            void* pBlockData = m_BlockAllocation.m_Block->GetMappedData();\n            VMA_ASSERT(pBlockData != VMA_NULL);\n            return (char*)pBlockData + GetOffset();\n        }\n        else\n        {\n            return VMA_NULL;\n        }\n        break;\n    case ALLOCATION_TYPE_DEDICATED:\n        VMA_ASSERT((m_DedicatedAllocation.m_ExtraData != VMA_NULL && m_DedicatedAllocation.m_ExtraData->m_pMappedData != VMA_NULL) ==\n            (m_MapCount != 0 || IsPersistentMap()));\n        return m_DedicatedAllocation.m_ExtraData != VMA_NULL ? m_DedicatedAllocation.m_ExtraData->m_pMappedData : VMA_NULL;\n    default:\n        VMA_ASSERT(0);\n        return VMA_NULL;\n    }\n}\n\nvoid VmaAllocation_T::BlockAllocMap()\n{\n    VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);\n    VMA_ASSERT(IsMappingAllowed() && \"Mapping is not allowed on this allocation! Please use one of the new VMA_ALLOCATION_CREATE_HOST_ACCESS_* flags when creating it.\");\n\n    if (m_MapCount < 0xFF)\n    {\n        ++m_MapCount;\n    }\n    else\n    {\n        VMA_ASSERT(0 && \"Allocation mapped too many times simultaneously.\");\n    }\n}\n\nvoid VmaAllocation_T::BlockAllocUnmap()\n{\n    VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);\n\n    if (m_MapCount > 0)\n    {\n        --m_MapCount;\n    }\n    else\n    {\n        VMA_ASSERT(0 && \"Unmapping allocation not previously mapped.\");\n    }\n}\n\nVkResult VmaAllocation_T::DedicatedAllocMap(VmaAllocator hAllocator, void** ppData)\n{\n    VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);\n    VMA_ASSERT(IsMappingAllowed() && \"Mapping is not allowed on this allocation! Please use one of the new VMA_ALLOCATION_CREATE_HOST_ACCESS_* flags when creating it.\");\n\n    EnsureExtraData(hAllocator);\n\n    if (m_MapCount != 0 || IsPersistentMap())\n    {\n        if (m_MapCount < 0xFF)\n        {\n            VMA_ASSERT(m_DedicatedAllocation.m_ExtraData->m_pMappedData != VMA_NULL);\n            *ppData = m_DedicatedAllocation.m_ExtraData->m_pMappedData;\n            ++m_MapCount;\n            return VK_SUCCESS;\n        }\n        else\n        {\n            VMA_ASSERT(0 && \"Dedicated allocation mapped too many times simultaneously.\");\n            return VK_ERROR_MEMORY_MAP_FAILED;\n        }\n    }\n    else\n    {\n        VkResult result = (*hAllocator->GetVulkanFunctions().vkMapMemory)(\n            hAllocator->m_hDevice,\n            m_DedicatedAllocation.m_hMemory,\n            0, // offset\n            VK_WHOLE_SIZE,\n            0, // flags\n            ppData);\n        if (result == VK_SUCCESS)\n        {\n            m_DedicatedAllocation.m_ExtraData->m_pMappedData = *ppData;\n            m_MapCount = 1;\n        }\n        return result;\n    }\n}\n\nvoid VmaAllocation_T::DedicatedAllocUnmap(VmaAllocator hAllocator)\n{\n    VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);\n\n    if (m_MapCount > 0)\n    {\n        --m_MapCount;\n        if (m_MapCount == 0 && !IsPersistentMap())\n        {\n            VMA_ASSERT(m_DedicatedAllocation.m_ExtraData != VMA_NULL);\n            m_DedicatedAllocation.m_ExtraData->m_pMappedData = VMA_NULL;\n            (*hAllocator->GetVulkanFunctions().vkUnmapMemory)(\n                hAllocator->m_hDevice,\n                m_DedicatedAllocation.m_hMemory);\n        }\n    }\n    else\n    {\n        VMA_ASSERT(0 && \"Unmapping dedicated allocation not previously mapped.\");\n    }\n}\n\n#if VMA_STATS_STRING_ENABLED\nvoid VmaAllocation_T::PrintParameters(class VmaJsonWriter& json) const\n{\n    json.WriteString(\"Type\");\n    json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[m_SuballocationType]);\n\n    json.WriteString(\"Size\");\n    json.WriteNumber(m_Size);\n    json.WriteString(\"Usage\");\n    json.WriteNumber(m_BufferImageUsage.Value); // It may be uint32_t or uint64_t.\n\n    if (m_pUserData != VMA_NULL)\n    {\n        json.WriteString(\"CustomData\");\n        json.BeginString();\n        json.ContinueString_Pointer(m_pUserData);\n        json.EndString();\n    }\n    if (m_pName != VMA_NULL)\n    {\n        json.WriteString(\"Name\");\n        json.WriteString(m_pName);\n    }\n}\n#if VMA_EXTERNAL_MEMORY_WIN32\nVkResult VmaAllocation_T::GetWin32Handle(VmaAllocator hAllocator, HANDLE hTargetProcess, HANDLE* pHandle) noexcept\n{\n    auto pvkGetMemoryWin32HandleKHR = hAllocator->GetVulkanFunctions().vkGetMemoryWin32HandleKHR;\n    switch (m_Type)\n    {\n    case ALLOCATION_TYPE_BLOCK:\n        return m_BlockAllocation.m_Block->CreateWin32Handle(hAllocator, pvkGetMemoryWin32HandleKHR, hTargetProcess, pHandle);\n    case ALLOCATION_TYPE_DEDICATED:\n        EnsureExtraData(hAllocator);\n        return m_DedicatedAllocation.m_ExtraData->m_Handle.GetHandle(hAllocator->m_hDevice, m_DedicatedAllocation.m_hMemory, pvkGetMemoryWin32HandleKHR, hTargetProcess, hAllocator->m_UseMutex, pHandle);\n    default:\n        VMA_ASSERT(0);\n        return VK_ERROR_FEATURE_NOT_PRESENT;\n    }\n}\n#endif // VMA_EXTERNAL_MEMORY_WIN32\n#endif // VMA_STATS_STRING_ENABLED\n\nvoid VmaAllocation_T::EnsureExtraData(VmaAllocator hAllocator)\n{\n    if (m_DedicatedAllocation.m_ExtraData == VMA_NULL)\n    {\n        m_DedicatedAllocation.m_ExtraData = vma_new(hAllocator, VmaAllocationExtraData)();\n    }\n}\n\nvoid VmaAllocation_T::FreeName(VmaAllocator hAllocator)\n{\n    if(m_pName)\n    {\n        VmaFreeString(hAllocator->GetAllocationCallbacks(), m_pName);\n        m_pName = VMA_NULL;\n    }\n}\n#endif // _VMA_ALLOCATION_T_FUNCTIONS\n\n#ifndef _VMA_BLOCK_VECTOR_FUNCTIONS\nVmaBlockVector::VmaBlockVector(\n    VmaAllocator hAllocator,\n    VmaPool hParentPool,\n    uint32_t memoryTypeIndex,\n    VkDeviceSize preferredBlockSize,\n    size_t minBlockCount,\n    size_t maxBlockCount,\n    VkDeviceSize bufferImageGranularity,\n    bool explicitBlockSize,\n    uint32_t algorithm,\n    float priority,\n    VkDeviceSize minAllocationAlignment,\n    void* pMemoryAllocateNext)\n    : m_hAllocator(hAllocator),\n    m_hParentPool(hParentPool),\n    m_MemoryTypeIndex(memoryTypeIndex),\n    m_PreferredBlockSize(preferredBlockSize),\n    m_MinBlockCount(minBlockCount),\n    m_MaxBlockCount(maxBlockCount),\n    m_BufferImageGranularity(bufferImageGranularity),\n    m_ExplicitBlockSize(explicitBlockSize),\n    m_Algorithm(algorithm),\n    m_Priority(priority),\n    m_MinAllocationAlignment(minAllocationAlignment),\n    m_pMemoryAllocateNext(pMemoryAllocateNext),\n    m_Blocks(VmaStlAllocator<VmaDeviceMemoryBlock*>(hAllocator->GetAllocationCallbacks())),\n    m_NextBlockId(0) {}\n\nVmaBlockVector::~VmaBlockVector()\n{\n    for (size_t i = m_Blocks.size(); i--; )\n    {\n        m_Blocks[i]->Destroy(m_hAllocator);\n        vma_delete(m_hAllocator, m_Blocks[i]);\n    }\n}\n\nVkResult VmaBlockVector::CreateMinBlocks()\n{\n    for (size_t i = 0; i < m_MinBlockCount; ++i)\n    {\n        VkResult res = CreateBlock(m_PreferredBlockSize, VMA_NULL);\n        if (res != VK_SUCCESS)\n        {\n            return res;\n        }\n    }\n    return VK_SUCCESS;\n}\n\nvoid VmaBlockVector::AddStatistics(VmaStatistics& inoutStats)\n{\n    VmaMutexLockRead lock(m_Mutex, m_hAllocator->m_UseMutex);\n\n    const size_t blockCount = m_Blocks.size();\n    for (uint32_t blockIndex = 0; blockIndex < blockCount; ++blockIndex)\n    {\n        const VmaDeviceMemoryBlock* const pBlock = m_Blocks[blockIndex];\n        VMA_ASSERT(pBlock);\n        VMA_HEAVY_ASSERT(pBlock->Validate());\n        pBlock->m_pMetadata->AddStatistics(inoutStats);\n    }\n}\n\nvoid VmaBlockVector::AddDetailedStatistics(VmaDetailedStatistics& inoutStats)\n{\n    VmaMutexLockRead lock(m_Mutex, m_hAllocator->m_UseMutex);\n\n    const size_t blockCount = m_Blocks.size();\n    for (uint32_t blockIndex = 0; blockIndex < blockCount; ++blockIndex)\n    {\n        const VmaDeviceMemoryBlock* const pBlock = m_Blocks[blockIndex];\n        VMA_ASSERT(pBlock);\n        VMA_HEAVY_ASSERT(pBlock->Validate());\n        pBlock->m_pMetadata->AddDetailedStatistics(inoutStats);\n    }\n}\n\nbool VmaBlockVector::IsEmpty()\n{\n    VmaMutexLockRead lock(m_Mutex, m_hAllocator->m_UseMutex);\n    return m_Blocks.empty();\n}\n\nbool VmaBlockVector::IsCorruptionDetectionEnabled() const\n{\n    const uint32_t requiredMemFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;\n    return (VMA_DEBUG_DETECT_CORRUPTION != 0) &&\n        (VMA_DEBUG_MARGIN > 0) &&\n        (m_Algorithm == 0 || m_Algorithm == VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT) &&\n        (m_hAllocator->m_MemProps.memoryTypes[m_MemoryTypeIndex].propertyFlags & requiredMemFlags) == requiredMemFlags;\n}\n\nVkResult VmaBlockVector::Allocate(\n    VkDeviceSize size,\n    VkDeviceSize alignment,\n    const VmaAllocationCreateInfo& createInfo,\n    VmaSuballocationType suballocType,\n    size_t allocationCount,\n    VmaAllocation* pAllocations)\n{\n    size_t allocIndex;\n    VkResult res = VK_SUCCESS;\n\n    alignment = VMA_MAX(alignment, m_MinAllocationAlignment);\n\n    if (IsCorruptionDetectionEnabled())\n    {\n        size = VmaAlignUp<VkDeviceSize>(size, sizeof(VMA_CORRUPTION_DETECTION_MAGIC_VALUE));\n        alignment = VmaAlignUp<VkDeviceSize>(alignment, sizeof(VMA_CORRUPTION_DETECTION_MAGIC_VALUE));\n    }\n\n    {\n        VmaMutexLockWrite lock(m_Mutex, m_hAllocator->m_UseMutex);\n        for (allocIndex = 0; allocIndex < allocationCount; ++allocIndex)\n        {\n            res = AllocatePage(\n                size,\n                alignment,\n                createInfo,\n                suballocType,\n                pAllocations + allocIndex);\n            if (res != VK_SUCCESS)\n            {\n                break;\n            }\n        }\n    }\n\n    if (res != VK_SUCCESS)\n    {\n        // Free all already created allocations.\n        while (allocIndex--)\n            Free(pAllocations[allocIndex]);\n        memset(pAllocations, 0, sizeof(VmaAllocation) * allocationCount);\n    }\n\n    return res;\n}\n\nVkResult VmaBlockVector::AllocatePage(\n    VkDeviceSize size,\n    VkDeviceSize alignment,\n    const VmaAllocationCreateInfo& createInfo,\n    VmaSuballocationType suballocType,\n    VmaAllocation* pAllocation)\n{\n    const bool isUpperAddress = (createInfo.flags & VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT) != 0;\n\n    VkDeviceSize freeMemory;\n    {\n        const uint32_t heapIndex = m_hAllocator->MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex);\n        VmaBudget heapBudget = {};\n        m_hAllocator->GetHeapBudgets(&heapBudget, heapIndex, 1);\n        freeMemory = (heapBudget.usage < heapBudget.budget) ? (heapBudget.budget - heapBudget.usage) : 0;\n    }\n\n    const bool canFallbackToDedicated = !HasExplicitBlockSize() &&\n        (createInfo.flags & VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT) == 0;\n    const bool canCreateNewBlock =\n        ((createInfo.flags & VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT) == 0) &&\n        (m_Blocks.size() < m_MaxBlockCount) &&\n        (freeMemory >= size || !canFallbackToDedicated);\n    uint32_t strategy = createInfo.flags & VMA_ALLOCATION_CREATE_STRATEGY_MASK;\n\n    // Upper address can only be used with linear allocator and within single memory block.\n    if (isUpperAddress &&\n        (m_Algorithm != VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT || m_MaxBlockCount > 1))\n    {\n        return VK_ERROR_FEATURE_NOT_PRESENT;\n    }\n\n    // Early reject: requested allocation size is larger that maximum block size for this block vector.\n    if (size + VMA_DEBUG_MARGIN > m_PreferredBlockSize)\n    {\n        return VK_ERROR_OUT_OF_DEVICE_MEMORY;\n    }\n\n    // 1. Search existing allocations. Try to allocate.\n    if (m_Algorithm == VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT)\n    {\n        // Use only last block.\n        if (!m_Blocks.empty())\n        {\n            VmaDeviceMemoryBlock* const pCurrBlock = m_Blocks.back();\n            VMA_ASSERT(pCurrBlock);\n            VkResult res = AllocateFromBlock(\n                pCurrBlock, size, alignment, createInfo.flags, createInfo.pUserData, suballocType, strategy, pAllocation);\n            if (res == VK_SUCCESS)\n            {\n                VMA_DEBUG_LOG_FORMAT(\"    Returned from last block #%\" PRIu32, pCurrBlock->GetId());\n                IncrementallySortBlocks();\n                return VK_SUCCESS;\n            }\n        }\n    }\n    else\n    {\n        if (strategy != VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT) // MIN_MEMORY or default\n        {\n            const bool isHostVisible =\n                (m_hAllocator->m_MemProps.memoryTypes[m_MemoryTypeIndex].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0;\n            if(isHostVisible)\n            {\n                const bool isMappingAllowed = (createInfo.flags &\n                    (VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT)) != 0;\n                /*\n                For non-mappable allocations, check blocks that are not mapped first.\n                For mappable allocations, check blocks that are already mapped first.\n                This way, having many blocks, we will separate mappable and non-mappable allocations,\n                hopefully limiting the number of blocks that are mapped, which will help tools like RenderDoc.\n                */\n                for(size_t mappingI = 0; mappingI < 2; ++mappingI)\n                {\n                    // Forward order in m_Blocks - prefer blocks with smallest amount of free space.\n                    for (size_t blockIndex = 0; blockIndex < m_Blocks.size(); ++blockIndex)\n                    {\n                        VmaDeviceMemoryBlock* const pCurrBlock = m_Blocks[blockIndex];\n                        VMA_ASSERT(pCurrBlock);\n                        const bool isBlockMapped = pCurrBlock->GetMappedData() != VMA_NULL;\n                        if((mappingI == 0) == (isMappingAllowed == isBlockMapped))\n                        {\n                            VkResult res = AllocateFromBlock(\n                                pCurrBlock, size, alignment, createInfo.flags, createInfo.pUserData, suballocType, strategy, pAllocation);\n                            if (res == VK_SUCCESS)\n                            {\n                                VMA_DEBUG_LOG_FORMAT(\"    Returned from existing block #%\" PRIu32, pCurrBlock->GetId());\n                                IncrementallySortBlocks();\n                                return VK_SUCCESS;\n                            }\n                        }\n                    }\n                }\n            }\n            else\n            {\n                // Forward order in m_Blocks - prefer blocks with smallest amount of free space.\n                for (size_t blockIndex = 0; blockIndex < m_Blocks.size(); ++blockIndex)\n                {\n                    VmaDeviceMemoryBlock* const pCurrBlock = m_Blocks[blockIndex];\n                    VMA_ASSERT(pCurrBlock);\n                    VkResult res = AllocateFromBlock(\n                        pCurrBlock, size, alignment, createInfo.flags, createInfo.pUserData, suballocType, strategy, pAllocation);\n                    if (res == VK_SUCCESS)\n                    {\n                        VMA_DEBUG_LOG_FORMAT(\"    Returned from existing block #%\" PRIu32, pCurrBlock->GetId());\n                        IncrementallySortBlocks();\n                        return VK_SUCCESS;\n                    }\n                }\n            }\n        }\n        else // VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT\n        {\n            // Backward order in m_Blocks - prefer blocks with largest amount of free space.\n            for (size_t blockIndex = m_Blocks.size(); blockIndex--; )\n            {\n                VmaDeviceMemoryBlock* const pCurrBlock = m_Blocks[blockIndex];\n                VMA_ASSERT(pCurrBlock);\n                VkResult res = AllocateFromBlock(pCurrBlock, size, alignment, createInfo.flags, createInfo.pUserData, suballocType, strategy, pAllocation);\n                if (res == VK_SUCCESS)\n                {\n                    VMA_DEBUG_LOG_FORMAT(\"    Returned from existing block #%\" PRIu32, pCurrBlock->GetId());\n                    IncrementallySortBlocks();\n                    return VK_SUCCESS;\n                }\n            }\n        }\n    }\n\n    // 2. Try to create new block.\n    if (canCreateNewBlock)\n    {\n        // Calculate optimal size for new block.\n        VkDeviceSize newBlockSize = m_PreferredBlockSize;\n        uint32_t newBlockSizeShift = 0;\n        const uint32_t NEW_BLOCK_SIZE_SHIFT_MAX = 3;\n\n        if (!m_ExplicitBlockSize)\n        {\n            // Allocate 1/8, 1/4, 1/2 as first blocks.\n            const VkDeviceSize maxExistingBlockSize = CalcMaxBlockSize();\n            for (uint32_t i = 0; i < NEW_BLOCK_SIZE_SHIFT_MAX; ++i)\n            {\n                const VkDeviceSize smallerNewBlockSize = newBlockSize / 2;\n                if (smallerNewBlockSize > maxExistingBlockSize && smallerNewBlockSize >= size * 2)\n                {\n                    newBlockSize = smallerNewBlockSize;\n                    ++newBlockSizeShift;\n                }\n                else\n                {\n                    break;\n                }\n            }\n        }\n\n        size_t newBlockIndex = 0;\n        VkResult res = (newBlockSize <= freeMemory || !canFallbackToDedicated) ?\n            CreateBlock(newBlockSize, &newBlockIndex) : VK_ERROR_OUT_OF_DEVICE_MEMORY;\n        // Allocation of this size failed? Try 1/2, 1/4, 1/8 of m_PreferredBlockSize.\n        if (!m_ExplicitBlockSize)\n        {\n            while (res < 0 && newBlockSizeShift < NEW_BLOCK_SIZE_SHIFT_MAX)\n            {\n                const VkDeviceSize smallerNewBlockSize = newBlockSize / 2;\n                if (smallerNewBlockSize >= size)\n                {\n                    newBlockSize = smallerNewBlockSize;\n                    ++newBlockSizeShift;\n                    res = (newBlockSize <= freeMemory || !canFallbackToDedicated) ?\n                        CreateBlock(newBlockSize, &newBlockIndex) : VK_ERROR_OUT_OF_DEVICE_MEMORY;\n                }\n                else\n                {\n                    break;\n                }\n            }\n        }\n\n        if (res == VK_SUCCESS)\n        {\n            VmaDeviceMemoryBlock* const pBlock = m_Blocks[newBlockIndex];\n            VMA_ASSERT(pBlock->m_pMetadata->GetSize() >= size);\n\n            res = AllocateFromBlock(\n                pBlock, size, alignment, createInfo.flags, createInfo.pUserData, suballocType, strategy, pAllocation);\n            if (res == VK_SUCCESS)\n            {\n                VMA_DEBUG_LOG_FORMAT(\"    Created new block #%\" PRIu32 \" Size=%\" PRIu64, pBlock->GetId(), newBlockSize);\n                IncrementallySortBlocks();\n                return VK_SUCCESS;\n            }\n            else\n            {\n                // Allocation from new block failed, possibly due to VMA_DEBUG_MARGIN or alignment.\n                return VK_ERROR_OUT_OF_DEVICE_MEMORY;\n            }\n        }\n    }\n\n    return VK_ERROR_OUT_OF_DEVICE_MEMORY;\n}\n\nvoid VmaBlockVector::Free(const VmaAllocation hAllocation)\n{\n    VmaDeviceMemoryBlock* pBlockToDelete = VMA_NULL;\n\n    bool budgetExceeded = false;\n    {\n        const uint32_t heapIndex = m_hAllocator->MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex);\n        VmaBudget heapBudget = {};\n        m_hAllocator->GetHeapBudgets(&heapBudget, heapIndex, 1);\n        budgetExceeded = heapBudget.usage >= heapBudget.budget;\n    }\n\n    // Scope for lock.\n    {\n        VmaMutexLockWrite lock(m_Mutex, m_hAllocator->m_UseMutex);\n\n        VmaDeviceMemoryBlock* pBlock = hAllocation->GetBlock();\n\n        if (IsCorruptionDetectionEnabled())\n        {\n            VkResult res = pBlock->ValidateMagicValueAfterAllocation(m_hAllocator, hAllocation->GetOffset(), hAllocation->GetSize());\n            VMA_ASSERT(res == VK_SUCCESS && \"Couldn't map block memory to validate magic value.\");\n        }\n\n        if (hAllocation->IsPersistentMap())\n        {\n            pBlock->Unmap(m_hAllocator, 1);\n        }\n\n        const bool hadEmptyBlockBeforeFree = HasEmptyBlock();\n        pBlock->m_pMetadata->Free(hAllocation->GetAllocHandle());\n        pBlock->PostFree(m_hAllocator);\n        VMA_HEAVY_ASSERT(pBlock->Validate());\n\n        VMA_DEBUG_LOG_FORMAT(\"  Freed from MemoryTypeIndex=%\" PRIu32, m_MemoryTypeIndex);\n\n        const bool canDeleteBlock = m_Blocks.size() > m_MinBlockCount;\n        // pBlock became empty after this deallocation.\n        if (pBlock->m_pMetadata->IsEmpty())\n        {\n            // Already had empty block. We don't want to have two, so delete this one.\n            if ((hadEmptyBlockBeforeFree || budgetExceeded) && canDeleteBlock)\n            {\n                pBlockToDelete = pBlock;\n                Remove(pBlock);\n            }\n            // else: We now have one empty block - leave it. A hysteresis to avoid allocating whole block back and forth.\n        }\n        // pBlock didn't become empty, but we have another empty block - find and free that one.\n        // (This is optional, heuristics.)\n        else if (hadEmptyBlockBeforeFree && canDeleteBlock)\n        {\n            VmaDeviceMemoryBlock* pLastBlock = m_Blocks.back();\n            if (pLastBlock->m_pMetadata->IsEmpty())\n            {\n                pBlockToDelete = pLastBlock;\n                m_Blocks.pop_back();\n            }\n        }\n\n        IncrementallySortBlocks();\n\n        m_hAllocator->m_Budget.RemoveAllocation(m_hAllocator->MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex), hAllocation->GetSize());\n        hAllocation->Destroy(m_hAllocator);\n        m_hAllocator->m_AllocationObjectAllocator.Free(hAllocation);\n    }\n\n    // Destruction of a free block. Deferred until this point, outside of mutex\n    // lock, for performance reason.\n    if (pBlockToDelete != VMA_NULL)\n    {\n        VMA_DEBUG_LOG_FORMAT(\"    Deleted empty block #%\" PRIu32, pBlockToDelete->GetId());\n        pBlockToDelete->Destroy(m_hAllocator);\n        vma_delete(m_hAllocator, pBlockToDelete);\n    }\n}\n\nVkDeviceSize VmaBlockVector::CalcMaxBlockSize() const\n{\n    VkDeviceSize result = 0;\n    for (size_t i = m_Blocks.size(); i--; )\n    {\n        result = VMA_MAX(result, m_Blocks[i]->m_pMetadata->GetSize());\n        if (result >= m_PreferredBlockSize)\n        {\n            break;\n        }\n    }\n    return result;\n}\n\nvoid VmaBlockVector::Remove(VmaDeviceMemoryBlock* pBlock)\n{\n    for (uint32_t blockIndex = 0; blockIndex < m_Blocks.size(); ++blockIndex)\n    {\n        if (m_Blocks[blockIndex] == pBlock)\n        {\n            VmaVectorRemove(m_Blocks, blockIndex);\n            return;\n        }\n    }\n    VMA_ASSERT(0);\n}\n\nvoid VmaBlockVector::IncrementallySortBlocks()\n{\n    if (!m_IncrementalSort)\n        return;\n    if (m_Algorithm != VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT)\n    {\n        // Bubble sort only until first swap.\n        for (size_t i = 1; i < m_Blocks.size(); ++i)\n        {\n            if (m_Blocks[i - 1]->m_pMetadata->GetSumFreeSize() > m_Blocks[i]->m_pMetadata->GetSumFreeSize())\n            {\n                std::swap(m_Blocks[i - 1], m_Blocks[i]);\n                return;\n            }\n        }\n    }\n}\n\nvoid VmaBlockVector::SortByFreeSize()\n{\n    VMA_SORT(m_Blocks.begin(), m_Blocks.end(),\n        [](VmaDeviceMemoryBlock* b1, VmaDeviceMemoryBlock* b2) -> bool\n        {\n            return b1->m_pMetadata->GetSumFreeSize() < b2->m_pMetadata->GetSumFreeSize();\n        });\n}\n\nVkResult VmaBlockVector::AllocateFromBlock(\n    VmaDeviceMemoryBlock* pBlock,\n    VkDeviceSize size,\n    VkDeviceSize alignment,\n    VmaAllocationCreateFlags allocFlags,\n    void* pUserData,\n    VmaSuballocationType suballocType,\n    uint32_t strategy,\n    VmaAllocation* pAllocation)\n{\n    const bool isUpperAddress = (allocFlags & VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT) != 0;\n\n    VmaAllocationRequest currRequest = {};\n    if (pBlock->m_pMetadata->CreateAllocationRequest(\n        size,\n        alignment,\n        isUpperAddress,\n        suballocType,\n        strategy,\n        &currRequest))\n    {\n        return CommitAllocationRequest(currRequest, pBlock, alignment, allocFlags, pUserData, suballocType, pAllocation);\n    }\n    return VK_ERROR_OUT_OF_DEVICE_MEMORY;\n}\n\nVkResult VmaBlockVector::CommitAllocationRequest(\n    VmaAllocationRequest& allocRequest,\n    VmaDeviceMemoryBlock* pBlock,\n    VkDeviceSize alignment,\n    VmaAllocationCreateFlags allocFlags,\n    void* pUserData,\n    VmaSuballocationType suballocType,\n    VmaAllocation* pAllocation)\n{\n    const bool mapped = (allocFlags & VMA_ALLOCATION_CREATE_MAPPED_BIT) != 0;\n    const bool isUserDataString = (allocFlags & VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT) != 0;\n    const bool isMappingAllowed = (allocFlags &\n        (VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT)) != 0;\n\n    pBlock->PostAlloc(m_hAllocator);\n    // Allocate from pCurrBlock.\n    if (mapped)\n    {\n        VkResult res = pBlock->Map(m_hAllocator, 1, VMA_NULL);\n        if (res != VK_SUCCESS)\n        {\n            return res;\n        }\n    }\n\n    *pAllocation = m_hAllocator->m_AllocationObjectAllocator.Allocate(isMappingAllowed);\n    pBlock->m_pMetadata->Alloc(allocRequest, suballocType, *pAllocation);\n    (*pAllocation)->InitBlockAllocation(\n        pBlock,\n        allocRequest.allocHandle,\n        alignment,\n        allocRequest.size, // Not size, as actual allocation size may be larger than requested!\n        m_MemoryTypeIndex,\n        suballocType,\n        mapped);\n    VMA_HEAVY_ASSERT(pBlock->Validate());\n    if (isUserDataString)\n        (*pAllocation)->SetName(m_hAllocator, (const char*)pUserData);\n    else\n        (*pAllocation)->SetUserData(m_hAllocator, pUserData);\n    m_hAllocator->m_Budget.AddAllocation(m_hAllocator->MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex), allocRequest.size);\n    if (VMA_DEBUG_INITIALIZE_ALLOCATIONS)\n    {\n        m_hAllocator->FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);\n    }\n    if (IsCorruptionDetectionEnabled())\n    {\n        VkResult res = pBlock->WriteMagicValueAfterAllocation(m_hAllocator, (*pAllocation)->GetOffset(), allocRequest.size);\n        VMA_ASSERT(res == VK_SUCCESS && \"Couldn't map block memory to write magic value.\");\n    }\n    return VK_SUCCESS;\n}\n\nVkResult VmaBlockVector::CreateBlock(VkDeviceSize blockSize, size_t* pNewBlockIndex)\n{\n    VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };\n    allocInfo.pNext = m_pMemoryAllocateNext;\n    allocInfo.memoryTypeIndex = m_MemoryTypeIndex;\n    allocInfo.allocationSize = blockSize;\n\n#if VMA_BUFFER_DEVICE_ADDRESS\n    // Every standalone block can potentially contain a buffer with VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT - always enable the feature.\n    VkMemoryAllocateFlagsInfoKHR allocFlagsInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHR };\n    if (m_hAllocator->m_UseKhrBufferDeviceAddress)\n    {\n        allocFlagsInfo.flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR;\n        VmaPnextChainPushFront(&allocInfo, &allocFlagsInfo);\n    }\n#endif // VMA_BUFFER_DEVICE_ADDRESS\n\n#if VMA_MEMORY_PRIORITY\n    VkMemoryPriorityAllocateInfoEXT priorityInfo = { VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT };\n    if (m_hAllocator->m_UseExtMemoryPriority)\n    {\n        VMA_ASSERT(m_Priority >= 0.f && m_Priority <= 1.f);\n        priorityInfo.priority = m_Priority;\n        VmaPnextChainPushFront(&allocInfo, &priorityInfo);\n    }\n#endif // VMA_MEMORY_PRIORITY\n\n#if VMA_EXTERNAL_MEMORY\n    // Attach VkExportMemoryAllocateInfoKHR if necessary.\n    VkExportMemoryAllocateInfoKHR exportMemoryAllocInfo = { VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR };\n    exportMemoryAllocInfo.handleTypes = m_hAllocator->GetExternalMemoryHandleTypeFlags(m_MemoryTypeIndex);\n    if (exportMemoryAllocInfo.handleTypes != 0)\n    {\n        VmaPnextChainPushFront(&allocInfo, &exportMemoryAllocInfo);\n    }\n#endif // VMA_EXTERNAL_MEMORY\n\n    VkDeviceMemory mem = VK_NULL_HANDLE;\n    VkResult res = m_hAllocator->AllocateVulkanMemory(&allocInfo, &mem);\n    if (res < 0)\n    {\n        return res;\n    }\n\n    // New VkDeviceMemory successfully created.\n\n    // Create new Allocation for it.\n    VmaDeviceMemoryBlock* const pBlock = vma_new(m_hAllocator, VmaDeviceMemoryBlock)(m_hAllocator);\n    pBlock->Init(\n        m_hAllocator,\n        m_hParentPool,\n        m_MemoryTypeIndex,\n        mem,\n        allocInfo.allocationSize,\n        m_NextBlockId++,\n        m_Algorithm,\n        m_BufferImageGranularity);\n\n    m_Blocks.push_back(pBlock);\n    if (pNewBlockIndex != VMA_NULL)\n    {\n        *pNewBlockIndex = m_Blocks.size() - 1;\n    }\n\n    return VK_SUCCESS;\n}\n\nbool VmaBlockVector::HasEmptyBlock()\n{\n    for (size_t index = 0, count = m_Blocks.size(); index < count; ++index)\n    {\n        VmaDeviceMemoryBlock* const pBlock = m_Blocks[index];\n        if (pBlock->m_pMetadata->IsEmpty())\n        {\n            return true;\n        }\n    }\n    return false;\n}\n\n#if VMA_STATS_STRING_ENABLED\nvoid VmaBlockVector::PrintDetailedMap(class VmaJsonWriter& json)\n{\n    VmaMutexLockRead lock(m_Mutex, m_hAllocator->m_UseMutex);\n\n\n    json.BeginObject();\n    for (size_t i = 0; i < m_Blocks.size(); ++i)\n    {\n        json.BeginString();\n        json.ContinueString(m_Blocks[i]->GetId());\n        json.EndString();\n\n        json.BeginObject();\n        json.WriteString(\"MapRefCount\");\n        json.WriteNumber(m_Blocks[i]->GetMapRefCount());\n\n        m_Blocks[i]->m_pMetadata->PrintDetailedMap(json);\n        json.EndObject();\n    }\n    json.EndObject();\n}\n#endif // VMA_STATS_STRING_ENABLED\n\nVkResult VmaBlockVector::CheckCorruption()\n{\n    if (!IsCorruptionDetectionEnabled())\n    {\n        return VK_ERROR_FEATURE_NOT_PRESENT;\n    }\n\n    VmaMutexLockRead lock(m_Mutex, m_hAllocator->m_UseMutex);\n    for (uint32_t blockIndex = 0; blockIndex < m_Blocks.size(); ++blockIndex)\n    {\n        VmaDeviceMemoryBlock* const pBlock = m_Blocks[blockIndex];\n        VMA_ASSERT(pBlock);\n        VkResult res = pBlock->CheckCorruption(m_hAllocator);\n        if (res != VK_SUCCESS)\n        {\n            return res;\n        }\n    }\n    return VK_SUCCESS;\n}\n\n#endif // _VMA_BLOCK_VECTOR_FUNCTIONS\n\n#ifndef _VMA_DEFRAGMENTATION_CONTEXT_FUNCTIONS\nVmaDefragmentationContext_T::VmaDefragmentationContext_T(\n    VmaAllocator hAllocator,\n    const VmaDefragmentationInfo& info)\n    : m_MaxPassBytes(info.maxBytesPerPass == 0 ? VK_WHOLE_SIZE : info.maxBytesPerPass),\n    m_MaxPassAllocations(info.maxAllocationsPerPass == 0 ? UINT32_MAX : info.maxAllocationsPerPass),\n    m_BreakCallback(info.pfnBreakCallback),\n    m_BreakCallbackUserData(info.pBreakCallbackUserData),\n    m_MoveAllocator(hAllocator->GetAllocationCallbacks()),\n    m_Moves(m_MoveAllocator)\n{\n    m_Algorithm = info.flags & VMA_DEFRAGMENTATION_FLAG_ALGORITHM_MASK;\n\n    if (info.pool != VMA_NULL)\n    {\n        m_BlockVectorCount = 1;\n        m_PoolBlockVector = &info.pool->m_BlockVector;\n        m_pBlockVectors = &m_PoolBlockVector;\n        m_PoolBlockVector->SetIncrementalSort(false);\n        m_PoolBlockVector->SortByFreeSize();\n    }\n    else\n    {\n        m_BlockVectorCount = hAllocator->GetMemoryTypeCount();\n        m_PoolBlockVector = VMA_NULL;\n        m_pBlockVectors = hAllocator->m_pBlockVectors;\n        for (uint32_t i = 0; i < m_BlockVectorCount; ++i)\n        {\n            VmaBlockVector* vector = m_pBlockVectors[i];\n            if (vector != VMA_NULL)\n            {\n                vector->SetIncrementalSort(false);\n                vector->SortByFreeSize();\n            }\n        }\n    }\n\n    switch (m_Algorithm)\n    {\n    case 0: // Default algorithm\n        m_Algorithm = VMA_DEFRAGMENTATION_FLAG_ALGORITHM_BALANCED_BIT;\n        m_AlgorithmState = vma_new_array(hAllocator, StateBalanced, m_BlockVectorCount);\n        break;\n    case VMA_DEFRAGMENTATION_FLAG_ALGORITHM_BALANCED_BIT:\n        m_AlgorithmState = vma_new_array(hAllocator, StateBalanced, m_BlockVectorCount);\n        break;\n    case VMA_DEFRAGMENTATION_FLAG_ALGORITHM_EXTENSIVE_BIT:\n        if (hAllocator->GetBufferImageGranularity() > 1)\n        {\n            m_AlgorithmState = vma_new_array(hAllocator, StateExtensive, m_BlockVectorCount);\n        }\n        break;\n    }\n}\n\nVmaDefragmentationContext_T::~VmaDefragmentationContext_T()\n{\n    if (m_PoolBlockVector != VMA_NULL)\n    {\n        m_PoolBlockVector->SetIncrementalSort(true);\n    }\n    else\n    {\n        for (uint32_t i = 0; i < m_BlockVectorCount; ++i)\n        {\n            VmaBlockVector* vector = m_pBlockVectors[i];\n            if (vector != VMA_NULL)\n                vector->SetIncrementalSort(true);\n        }\n    }\n\n    if (m_AlgorithmState)\n    {\n        switch (m_Algorithm)\n        {\n        case VMA_DEFRAGMENTATION_FLAG_ALGORITHM_BALANCED_BIT:\n            vma_delete_array(m_MoveAllocator.m_pCallbacks, reinterpret_cast<StateBalanced*>(m_AlgorithmState), m_BlockVectorCount);\n            break;\n        case VMA_DEFRAGMENTATION_FLAG_ALGORITHM_EXTENSIVE_BIT:\n            vma_delete_array(m_MoveAllocator.m_pCallbacks, reinterpret_cast<StateExtensive*>(m_AlgorithmState), m_BlockVectorCount);\n            break;\n        default:\n            VMA_ASSERT(0);\n        }\n    }\n}\n\nVkResult VmaDefragmentationContext_T::DefragmentPassBegin(VmaDefragmentationPassMoveInfo& moveInfo)\n{\n    if (m_PoolBlockVector != VMA_NULL)\n    {\n        VmaMutexLockWrite lock(m_PoolBlockVector->GetMutex(), m_PoolBlockVector->GetAllocator()->m_UseMutex);\n\n        if (m_PoolBlockVector->GetBlockCount() > 1)\n            ComputeDefragmentation(*m_PoolBlockVector, 0);\n        else if (m_PoolBlockVector->GetBlockCount() == 1)\n            ReallocWithinBlock(*m_PoolBlockVector, m_PoolBlockVector->GetBlock(0));\n    }\n    else\n    {\n        for (uint32_t i = 0; i < m_BlockVectorCount; ++i)\n        {\n            if (m_pBlockVectors[i] != VMA_NULL)\n            {\n                VmaMutexLockWrite lock(m_pBlockVectors[i]->GetMutex(), m_pBlockVectors[i]->GetAllocator()->m_UseMutex);\n\n                if (m_pBlockVectors[i]->GetBlockCount() > 1)\n                {\n                    if (ComputeDefragmentation(*m_pBlockVectors[i], i))\n                        break;\n                }\n                else if (m_pBlockVectors[i]->GetBlockCount() == 1)\n                {\n                    if (ReallocWithinBlock(*m_pBlockVectors[i], m_pBlockVectors[i]->GetBlock(0)))\n                        break;\n                }\n            }\n        }\n    }\n\n    moveInfo.moveCount = static_cast<uint32_t>(m_Moves.size());\n    if (moveInfo.moveCount > 0)\n    {\n        moveInfo.pMoves = m_Moves.data();\n        return VK_INCOMPLETE;\n    }\n\n    moveInfo.pMoves = VMA_NULL;\n    return VK_SUCCESS;\n}\n\nVkResult VmaDefragmentationContext_T::DefragmentPassEnd(VmaDefragmentationPassMoveInfo& moveInfo)\n{\n    VMA_ASSERT(moveInfo.moveCount > 0 ? moveInfo.pMoves != VMA_NULL : true);\n\n    VkResult result = VK_SUCCESS;\n    VmaStlAllocator<FragmentedBlock> blockAllocator(m_MoveAllocator.m_pCallbacks);\n    VmaVector<FragmentedBlock, VmaStlAllocator<FragmentedBlock>> immovableBlocks(blockAllocator);\n    VmaVector<FragmentedBlock, VmaStlAllocator<FragmentedBlock>> mappedBlocks(blockAllocator);\n\n    VmaAllocator allocator = VMA_NULL;\n    for (uint32_t i = 0; i < moveInfo.moveCount; ++i)\n    {\n        VmaDefragmentationMove& move = moveInfo.pMoves[i];\n        size_t prevCount = 0, currentCount = 0;\n        VkDeviceSize freedBlockSize = 0;\n\n        uint32_t vectorIndex;\n        VmaBlockVector* vector;\n        if (m_PoolBlockVector != VMA_NULL)\n        {\n            vectorIndex = 0;\n            vector = m_PoolBlockVector;\n        }\n        else\n        {\n            vectorIndex = move.srcAllocation->GetMemoryTypeIndex();\n            vector = m_pBlockVectors[vectorIndex];\n            VMA_ASSERT(vector != VMA_NULL);\n        }\n\n        switch (move.operation)\n        {\n        case VMA_DEFRAGMENTATION_MOVE_OPERATION_COPY:\n        {\n            uint8_t mapCount = move.srcAllocation->SwapBlockAllocation(vector->m_hAllocator, move.dstTmpAllocation);\n            if (mapCount > 0)\n            {\n                allocator = vector->m_hAllocator;\n                VmaDeviceMemoryBlock* newMapBlock = move.srcAllocation->GetBlock();\n                bool notPresent = true;\n                for (FragmentedBlock& block : mappedBlocks)\n                {\n                    if (block.block == newMapBlock)\n                    {\n                        notPresent = false;\n                        block.data += mapCount;\n                        break;\n                    }\n                }\n                if (notPresent)\n                    mappedBlocks.push_back({ mapCount, newMapBlock });\n            }\n\n            // Scope for locks, Free have it's own lock\n            {\n                VmaMutexLockRead lock(vector->GetMutex(), vector->GetAllocator()->m_UseMutex);\n                prevCount = vector->GetBlockCount();\n                freedBlockSize = move.dstTmpAllocation->GetBlock()->m_pMetadata->GetSize();\n            }\n            vector->Free(move.dstTmpAllocation);\n            {\n                VmaMutexLockRead lock(vector->GetMutex(), vector->GetAllocator()->m_UseMutex);\n                currentCount = vector->GetBlockCount();\n            }\n\n            result = VK_INCOMPLETE;\n            break;\n        }\n        case VMA_DEFRAGMENTATION_MOVE_OPERATION_IGNORE:\n        {\n            m_PassStats.bytesMoved -= move.srcAllocation->GetSize();\n            --m_PassStats.allocationsMoved;\n            vector->Free(move.dstTmpAllocation);\n\n            VmaDeviceMemoryBlock* newBlock = move.srcAllocation->GetBlock();\n            bool notPresent = true;\n            for (const FragmentedBlock& block : immovableBlocks)\n            {\n                if (block.block == newBlock)\n                {\n                    notPresent = false;\n                    break;\n                }\n            }\n            if (notPresent)\n                immovableBlocks.push_back({ vectorIndex, newBlock });\n            break;\n        }\n        case VMA_DEFRAGMENTATION_MOVE_OPERATION_DESTROY:\n        {\n            m_PassStats.bytesMoved -= move.srcAllocation->GetSize();\n            --m_PassStats.allocationsMoved;\n            // Scope for locks, Free have it's own lock\n            {\n                VmaMutexLockRead lock(vector->GetMutex(), vector->GetAllocator()->m_UseMutex);\n                prevCount = vector->GetBlockCount();\n                freedBlockSize = move.srcAllocation->GetBlock()->m_pMetadata->GetSize();\n            }\n            vector->Free(move.srcAllocation);\n            {\n                VmaMutexLockRead lock(vector->GetMutex(), vector->GetAllocator()->m_UseMutex);\n                currentCount = vector->GetBlockCount();\n            }\n            freedBlockSize *= prevCount - currentCount;\n\n            VkDeviceSize dstBlockSize;\n            {\n                VmaMutexLockRead lock(vector->GetMutex(), vector->GetAllocator()->m_UseMutex);\n                dstBlockSize = move.dstTmpAllocation->GetBlock()->m_pMetadata->GetSize();\n            }\n            vector->Free(move.dstTmpAllocation);\n            {\n                VmaMutexLockRead lock(vector->GetMutex(), vector->GetAllocator()->m_UseMutex);\n                freedBlockSize += dstBlockSize * (currentCount - vector->GetBlockCount());\n                currentCount = vector->GetBlockCount();\n            }\n\n            result = VK_INCOMPLETE;\n            break;\n        }\n        default:\n            VMA_ASSERT(0);\n        }\n\n        if (prevCount > currentCount)\n        {\n            size_t freedBlocks = prevCount - currentCount;\n            m_PassStats.deviceMemoryBlocksFreed += static_cast<uint32_t>(freedBlocks);\n            m_PassStats.bytesFreed += freedBlockSize;\n        }\n\n        if(m_Algorithm == VMA_DEFRAGMENTATION_FLAG_ALGORITHM_EXTENSIVE_BIT &&\n            m_AlgorithmState != VMA_NULL)\n        {\n            // Avoid unnecessary tries to allocate when new free block is available\n            StateExtensive& state = reinterpret_cast<StateExtensive*>(m_AlgorithmState)[vectorIndex];\n            if (state.firstFreeBlock != SIZE_MAX)\n            {\n                const size_t diff = prevCount - currentCount;\n                if (state.firstFreeBlock >= diff)\n                {\n                    state.firstFreeBlock -= diff;\n                    if (state.firstFreeBlock != 0)\n                        state.firstFreeBlock -= vector->GetBlock(state.firstFreeBlock - 1)->m_pMetadata->IsEmpty();\n                }\n                else\n                    state.firstFreeBlock = 0;\n            }\n        }\n    }\n    moveInfo.moveCount = 0;\n    moveInfo.pMoves = VMA_NULL;\n    m_Moves.clear();\n\n    // Update stats\n    m_GlobalStats.allocationsMoved += m_PassStats.allocationsMoved;\n    m_GlobalStats.bytesFreed += m_PassStats.bytesFreed;\n    m_GlobalStats.bytesMoved += m_PassStats.bytesMoved;\n    m_GlobalStats.deviceMemoryBlocksFreed += m_PassStats.deviceMemoryBlocksFreed;\n    m_PassStats = { 0 };\n\n    // Move blocks with immovable allocations according to algorithm\n    if (immovableBlocks.size() > 0)\n    {\n        do\n        {\n            if(m_Algorithm == VMA_DEFRAGMENTATION_FLAG_ALGORITHM_EXTENSIVE_BIT)\n            {\n                if (m_AlgorithmState != VMA_NULL)\n                {\n                    bool swapped = false;\n                    // Move to the start of free blocks range\n                    for (const FragmentedBlock& block : immovableBlocks)\n                    {\n                        StateExtensive& state = reinterpret_cast<StateExtensive*>(m_AlgorithmState)[block.data];\n                        if (state.operation != StateExtensive::Operation::Cleanup)\n                        {\n                            VmaBlockVector* vector = m_pBlockVectors[block.data];\n                            VmaMutexLockWrite lock(vector->GetMutex(), vector->GetAllocator()->m_UseMutex);\n\n                            for (size_t i = 0, count = vector->GetBlockCount() - m_ImmovableBlockCount; i < count; ++i)\n                            {\n                                if (vector->GetBlock(i) == block.block)\n                                {\n                                    std::swap(vector->m_Blocks[i], vector->m_Blocks[vector->GetBlockCount() - ++m_ImmovableBlockCount]);\n                                    if (state.firstFreeBlock != SIZE_MAX)\n                                    {\n                                        if (i + 1 < state.firstFreeBlock)\n                                        {\n                                            if (state.firstFreeBlock > 1)\n                                                std::swap(vector->m_Blocks[i], vector->m_Blocks[--state.firstFreeBlock]);\n                                            else\n                                                --state.firstFreeBlock;\n                                        }\n                                    }\n                                    swapped = true;\n                                    break;\n                                }\n                            }\n                        }\n                    }\n                    if (swapped)\n                        result = VK_INCOMPLETE;\n                    break;\n                }\n            }\n\n            // Move to the beginning\n            for (const FragmentedBlock& block : immovableBlocks)\n            {\n                VmaBlockVector* vector = m_pBlockVectors[block.data];\n                VmaMutexLockWrite lock(vector->GetMutex(), vector->GetAllocator()->m_UseMutex);\n\n                for (size_t i = m_ImmovableBlockCount; i < vector->GetBlockCount(); ++i)\n                {\n                    if (vector->GetBlock(i) == block.block)\n                    {\n                        std::swap(vector->m_Blocks[i], vector->m_Blocks[m_ImmovableBlockCount++]);\n                        break;\n                    }\n                }\n            }\n        } while (false);\n    }\n\n    // Bulk-map destination blocks\n    for (const FragmentedBlock& block : mappedBlocks)\n    {\n        VkResult res = block.block->Map(allocator, block.data, VMA_NULL);\n        VMA_ASSERT(res == VK_SUCCESS);\n    }\n    return result;\n}\n\nbool VmaDefragmentationContext_T::ComputeDefragmentation(VmaBlockVector& vector, size_t index)\n{\n    switch (m_Algorithm)\n    {\n    case VMA_DEFRAGMENTATION_FLAG_ALGORITHM_FAST_BIT:\n        return ComputeDefragmentation_Fast(vector);\n    case VMA_DEFRAGMENTATION_FLAG_ALGORITHM_BALANCED_BIT:\n        return ComputeDefragmentation_Balanced(vector, index, true);\n    case VMA_DEFRAGMENTATION_FLAG_ALGORITHM_FULL_BIT:\n        return ComputeDefragmentation_Full(vector);\n    case VMA_DEFRAGMENTATION_FLAG_ALGORITHM_EXTENSIVE_BIT:\n        return ComputeDefragmentation_Extensive(vector, index);\n    default:\n        VMA_ASSERT(0);\n        return ComputeDefragmentation_Balanced(vector, index, true);\n    }\n}\n\nVmaDefragmentationContext_T::MoveAllocationData VmaDefragmentationContext_T::GetMoveData(\n    VmaAllocHandle handle, VmaBlockMetadata* metadata)\n{\n    MoveAllocationData moveData;\n    moveData.move.srcAllocation = (VmaAllocation)metadata->GetAllocationUserData(handle);\n    moveData.size = moveData.move.srcAllocation->GetSize();\n    moveData.alignment = moveData.move.srcAllocation->GetAlignment();\n    moveData.type = moveData.move.srcAllocation->GetSuballocationType();\n    moveData.flags = 0;\n\n    if (moveData.move.srcAllocation->IsPersistentMap())\n        moveData.flags |= VMA_ALLOCATION_CREATE_MAPPED_BIT;\n    if (moveData.move.srcAllocation->IsMappingAllowed())\n        moveData.flags |= VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT;\n\n    return moveData;\n}\n\nVmaDefragmentationContext_T::CounterStatus VmaDefragmentationContext_T::CheckCounters(VkDeviceSize bytes)\n{\n    // Check custom criteria if exists\n    if (m_BreakCallback && m_BreakCallback(m_BreakCallbackUserData))\n        return CounterStatus::End;\n\n    // Ignore allocation if will exceed max size for copy\n    if (m_PassStats.bytesMoved + bytes > m_MaxPassBytes)\n    {\n        if (++m_IgnoredAllocs < MAX_ALLOCS_TO_IGNORE)\n            return CounterStatus::Ignore;\n        else\n            return CounterStatus::End;\n    }\n    else\n        m_IgnoredAllocs = 0;\n    return CounterStatus::Pass;\n}\n\nbool VmaDefragmentationContext_T::IncrementCounters(VkDeviceSize bytes)\n{\n    m_PassStats.bytesMoved += bytes;\n    // Early return when max found\n    if (++m_PassStats.allocationsMoved >= m_MaxPassAllocations || m_PassStats.bytesMoved >= m_MaxPassBytes)\n    {\n        VMA_ASSERT((m_PassStats.allocationsMoved == m_MaxPassAllocations ||\n            m_PassStats.bytesMoved == m_MaxPassBytes) && \"Exceeded maximal pass threshold!\");\n        return true;\n    }\n    return false;\n}\n\nbool VmaDefragmentationContext_T::ReallocWithinBlock(VmaBlockVector& vector, VmaDeviceMemoryBlock* block)\n{\n    VmaBlockMetadata* metadata = block->m_pMetadata;\n\n    for (VmaAllocHandle handle = metadata->GetAllocationListBegin();\n        handle != VK_NULL_HANDLE;\n        handle = metadata->GetNextAllocation(handle))\n    {\n        MoveAllocationData moveData = GetMoveData(handle, metadata);\n        // Ignore newly created allocations by defragmentation algorithm\n        if (moveData.move.srcAllocation->GetUserData() == this)\n            continue;\n        switch (CheckCounters(moveData.move.srcAllocation->GetSize()))\n        {\n        case CounterStatus::Ignore:\n            continue;\n        case CounterStatus::End:\n            return true;\n        case CounterStatus::Pass:\n            break;\n        default:\n            VMA_ASSERT(0);\n        }\n\n        VkDeviceSize offset = moveData.move.srcAllocation->GetOffset();\n        if (offset != 0 && metadata->GetSumFreeSize() >= moveData.size)\n        {\n            VmaAllocationRequest request = {};\n            if (metadata->CreateAllocationRequest(\n                moveData.size,\n                moveData.alignment,\n                false,\n                moveData.type,\n                VMA_ALLOCATION_CREATE_STRATEGY_MIN_OFFSET_BIT,\n                &request))\n            {\n                if (metadata->GetAllocationOffset(request.allocHandle) < offset)\n                {\n                    if (vector.CommitAllocationRequest(\n                        request,\n                        block,\n                        moveData.alignment,\n                        moveData.flags,\n                        this,\n                        moveData.type,\n                        &moveData.move.dstTmpAllocation) == VK_SUCCESS)\n                    {\n                        m_Moves.push_back(moveData.move);\n                        if (IncrementCounters(moveData.size))\n                            return true;\n                    }\n                }\n            }\n        }\n    }\n    return false;\n}\n\nbool VmaDefragmentationContext_T::AllocInOtherBlock(size_t start, size_t end, MoveAllocationData& data, VmaBlockVector& vector)\n{\n    for (; start < end; ++start)\n    {\n        VmaDeviceMemoryBlock* dstBlock = vector.GetBlock(start);\n        if (dstBlock->m_pMetadata->GetSumFreeSize() >= data.size)\n        {\n            if (vector.AllocateFromBlock(dstBlock,\n                data.size,\n                data.alignment,\n                data.flags,\n                this,\n                data.type,\n                0,\n                &data.move.dstTmpAllocation) == VK_SUCCESS)\n            {\n                m_Moves.push_back(data.move);\n                if (IncrementCounters(data.size))\n                    return true;\n                break;\n            }\n        }\n    }\n    return false;\n}\n\nbool VmaDefragmentationContext_T::ComputeDefragmentation_Fast(VmaBlockVector& vector)\n{\n    // Move only between blocks\n\n    // Go through allocations in last blocks and try to fit them inside first ones\n    for (size_t i = vector.GetBlockCount() - 1; i > m_ImmovableBlockCount; --i)\n    {\n        VmaBlockMetadata* metadata = vector.GetBlock(i)->m_pMetadata;\n\n        for (VmaAllocHandle handle = metadata->GetAllocationListBegin();\n            handle != VK_NULL_HANDLE;\n            handle = metadata->GetNextAllocation(handle))\n        {\n            MoveAllocationData moveData = GetMoveData(handle, metadata);\n            // Ignore newly created allocations by defragmentation algorithm\n            if (moveData.move.srcAllocation->GetUserData() == this)\n                continue;\n            switch (CheckCounters(moveData.move.srcAllocation->GetSize()))\n            {\n            case CounterStatus::Ignore:\n                continue;\n            case CounterStatus::End:\n                return true;\n            case CounterStatus::Pass:\n                break;\n            default:\n                VMA_ASSERT(0);\n            }\n\n            // Check all previous blocks for free space\n            if (AllocInOtherBlock(0, i, moveData, vector))\n                return true;\n        }\n    }\n    return false;\n}\n\nbool VmaDefragmentationContext_T::ComputeDefragmentation_Balanced(VmaBlockVector& vector, size_t index, bool update)\n{\n    // Go over every allocation and try to fit it in previous blocks at lowest offsets,\n    // if not possible: realloc within single block to minimize offset (exclude offset == 0),\n    // but only if there are noticeable gaps between them (some heuristic, ex. average size of allocation in block)\n    VMA_ASSERT(m_AlgorithmState != VMA_NULL);\n\n    StateBalanced& vectorState = reinterpret_cast<StateBalanced*>(m_AlgorithmState)[index];\n    if (update && vectorState.avgAllocSize == UINT64_MAX)\n        UpdateVectorStatistics(vector, vectorState);\n\n    const size_t startMoveCount = m_Moves.size();\n    VkDeviceSize minimalFreeRegion = vectorState.avgFreeSize / 2;\n    for (size_t i = vector.GetBlockCount() - 1; i > m_ImmovableBlockCount; --i)\n    {\n        VmaDeviceMemoryBlock* block = vector.GetBlock(i);\n        VmaBlockMetadata* metadata = block->m_pMetadata;\n        VkDeviceSize prevFreeRegionSize = 0;\n\n        for (VmaAllocHandle handle = metadata->GetAllocationListBegin();\n            handle != VK_NULL_HANDLE;\n            handle = metadata->GetNextAllocation(handle))\n        {\n            MoveAllocationData moveData = GetMoveData(handle, metadata);\n            // Ignore newly created allocations by defragmentation algorithm\n            if (moveData.move.srcAllocation->GetUserData() == this)\n                continue;\n            switch (CheckCounters(moveData.move.srcAllocation->GetSize()))\n            {\n            case CounterStatus::Ignore:\n                continue;\n            case CounterStatus::End:\n                return true;\n            case CounterStatus::Pass:\n                break;\n            default:\n                VMA_ASSERT(0);\n            }\n\n            // Check all previous blocks for free space\n            const size_t prevMoveCount = m_Moves.size();\n            if (AllocInOtherBlock(0, i, moveData, vector))\n                return true;\n\n            VkDeviceSize nextFreeRegionSize = metadata->GetNextFreeRegionSize(handle);\n            // If no room found then realloc within block for lower offset\n            VkDeviceSize offset = moveData.move.srcAllocation->GetOffset();\n            if (prevMoveCount == m_Moves.size() && offset != 0 && metadata->GetSumFreeSize() >= moveData.size)\n            {\n                // Check if realloc will make sense\n                if (prevFreeRegionSize >= minimalFreeRegion ||\n                    nextFreeRegionSize >= minimalFreeRegion ||\n                    moveData.size <= vectorState.avgFreeSize ||\n                    moveData.size <= vectorState.avgAllocSize)\n                {\n                    VmaAllocationRequest request = {};\n                    if (metadata->CreateAllocationRequest(\n                        moveData.size,\n                        moveData.alignment,\n                        false,\n                        moveData.type,\n                        VMA_ALLOCATION_CREATE_STRATEGY_MIN_OFFSET_BIT,\n                        &request))\n                    {\n                        if (metadata->GetAllocationOffset(request.allocHandle) < offset)\n                        {\n                            if (vector.CommitAllocationRequest(\n                                request,\n                                block,\n                                moveData.alignment,\n                                moveData.flags,\n                                this,\n                                moveData.type,\n                                &moveData.move.dstTmpAllocation) == VK_SUCCESS)\n                            {\n                                m_Moves.push_back(moveData.move);\n                                if (IncrementCounters(moveData.size))\n                                    return true;\n                            }\n                        }\n                    }\n                }\n            }\n            prevFreeRegionSize = nextFreeRegionSize;\n        }\n    }\n\n    // No moves performed, update statistics to current vector state\n    if (startMoveCount == m_Moves.size() && !update)\n    {\n        vectorState.avgAllocSize = UINT64_MAX;\n        return ComputeDefragmentation_Balanced(vector, index, false);\n    }\n    return false;\n}\n\nbool VmaDefragmentationContext_T::ComputeDefragmentation_Full(VmaBlockVector& vector)\n{\n    // Go over every allocation and try to fit it in previous blocks at lowest offsets,\n    // if not possible: realloc within single block to minimize offset (exclude offset == 0)\n\n    for (size_t i = vector.GetBlockCount() - 1; i > m_ImmovableBlockCount; --i)\n    {\n        VmaDeviceMemoryBlock* block = vector.GetBlock(i);\n        VmaBlockMetadata* metadata = block->m_pMetadata;\n\n        for (VmaAllocHandle handle = metadata->GetAllocationListBegin();\n            handle != VK_NULL_HANDLE;\n            handle = metadata->GetNextAllocation(handle))\n        {\n            MoveAllocationData moveData = GetMoveData(handle, metadata);\n            // Ignore newly created allocations by defragmentation algorithm\n            if (moveData.move.srcAllocation->GetUserData() == this)\n                continue;\n            switch (CheckCounters(moveData.move.srcAllocation->GetSize()))\n            {\n            case CounterStatus::Ignore:\n                continue;\n            case CounterStatus::End:\n                return true;\n            case CounterStatus::Pass:\n                break;\n            default:\n                VMA_ASSERT(0);\n            }\n\n            // Check all previous blocks for free space\n            const size_t prevMoveCount = m_Moves.size();\n            if (AllocInOtherBlock(0, i, moveData, vector))\n                return true;\n\n            // If no room found then realloc within block for lower offset\n            VkDeviceSize offset = moveData.move.srcAllocation->GetOffset();\n            if (prevMoveCount == m_Moves.size() && offset != 0 && metadata->GetSumFreeSize() >= moveData.size)\n            {\n                VmaAllocationRequest request = {};\n                if (metadata->CreateAllocationRequest(\n                    moveData.size,\n                    moveData.alignment,\n                    false,\n                    moveData.type,\n                    VMA_ALLOCATION_CREATE_STRATEGY_MIN_OFFSET_BIT,\n                    &request))\n                {\n                    if (metadata->GetAllocationOffset(request.allocHandle) < offset)\n                    {\n                        if (vector.CommitAllocationRequest(\n                            request,\n                            block,\n                            moveData.alignment,\n                            moveData.flags,\n                            this,\n                            moveData.type,\n                            &moveData.move.dstTmpAllocation) == VK_SUCCESS)\n                        {\n                            m_Moves.push_back(moveData.move);\n                            if (IncrementCounters(moveData.size))\n                                return true;\n                        }\n                    }\n                }\n            }\n        }\n    }\n    return false;\n}\n\nbool VmaDefragmentationContext_T::ComputeDefragmentation_Extensive(VmaBlockVector& vector, size_t index)\n{\n    // First free single block, then populate it to the brim, then free another block, and so on\n\n    // Fallback to previous algorithm since without granularity conflicts it can achieve max packing\n    if (vector.m_BufferImageGranularity == 1)\n        return ComputeDefragmentation_Full(vector);\n\n    VMA_ASSERT(m_AlgorithmState != VMA_NULL);\n\n    StateExtensive& vectorState = reinterpret_cast<StateExtensive*>(m_AlgorithmState)[index];\n\n    bool texturePresent = false, bufferPresent = false, otherPresent = false;\n    switch (vectorState.operation)\n    {\n    case StateExtensive::Operation::Done: // Vector defragmented\n        return false;\n    case StateExtensive::Operation::FindFreeBlockBuffer:\n    case StateExtensive::Operation::FindFreeBlockTexture:\n    case StateExtensive::Operation::FindFreeBlockAll:\n    {\n        // No more blocks to free, just perform fast realloc and move to cleanup\n        if (vectorState.firstFreeBlock == 0)\n        {\n            vectorState.operation = StateExtensive::Operation::Cleanup;\n            return ComputeDefragmentation_Fast(vector);\n        }\n\n        // No free blocks, have to clear last one\n        size_t last = (vectorState.firstFreeBlock == SIZE_MAX ? vector.GetBlockCount() : vectorState.firstFreeBlock) - 1;\n        VmaBlockMetadata* freeMetadata = vector.GetBlock(last)->m_pMetadata;\n\n        const size_t prevMoveCount = m_Moves.size();\n        for (VmaAllocHandle handle = freeMetadata->GetAllocationListBegin();\n            handle != VK_NULL_HANDLE;\n            handle = freeMetadata->GetNextAllocation(handle))\n        {\n            MoveAllocationData moveData = GetMoveData(handle, freeMetadata);\n            switch (CheckCounters(moveData.move.srcAllocation->GetSize()))\n            {\n            case CounterStatus::Ignore:\n                continue;\n            case CounterStatus::End:\n                return true;\n            case CounterStatus::Pass:\n                break;\n            default:\n                VMA_ASSERT(0);\n            }\n\n            // Check all previous blocks for free space\n            if (AllocInOtherBlock(0, last, moveData, vector))\n            {\n                // Full clear performed already\n                if (prevMoveCount != m_Moves.size() && freeMetadata->GetNextAllocation(handle) == VK_NULL_HANDLE)\n                    vectorState.firstFreeBlock = last;\n                return true;\n            }\n        }\n\n        if (prevMoveCount == m_Moves.size())\n        {\n            // Cannot perform full clear, have to move data in other blocks around\n            if (last != 0)\n            {\n                for (size_t i = last - 1; i; --i)\n                {\n                    if (ReallocWithinBlock(vector, vector.GetBlock(i)))\n                        return true;\n                }\n            }\n\n            if (prevMoveCount == m_Moves.size())\n            {\n                // No possible reallocs within blocks, try to move them around fast\n                return ComputeDefragmentation_Fast(vector);\n            }\n        }\n        else\n        {\n            switch (vectorState.operation)\n            {\n            case StateExtensive::Operation::FindFreeBlockBuffer:\n                vectorState.operation = StateExtensive::Operation::MoveBuffers;\n                break;\n            case StateExtensive::Operation::FindFreeBlockTexture:\n                vectorState.operation = StateExtensive::Operation::MoveTextures;\n                break;\n            case StateExtensive::Operation::FindFreeBlockAll:\n                vectorState.operation = StateExtensive::Operation::MoveAll;\n                break;\n            default:\n                VMA_ASSERT(0);\n                vectorState.operation = StateExtensive::Operation::MoveTextures;\n            }\n            vectorState.firstFreeBlock = last;\n            // Nothing done, block found without reallocations, can perform another reallocs in same pass\n            return ComputeDefragmentation_Extensive(vector, index);\n        }\n        break;\n    }\n    case StateExtensive::Operation::MoveTextures:\n    {\n        if (MoveDataToFreeBlocks(VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL, vector,\n            vectorState.firstFreeBlock, texturePresent, bufferPresent, otherPresent))\n        {\n            if (texturePresent)\n            {\n                vectorState.operation = StateExtensive::Operation::FindFreeBlockTexture;\n                return ComputeDefragmentation_Extensive(vector, index);\n            }\n\n            if (!bufferPresent && !otherPresent)\n            {\n                vectorState.operation = StateExtensive::Operation::Cleanup;\n                break;\n            }\n\n            // No more textures to move, check buffers\n            vectorState.operation = StateExtensive::Operation::MoveBuffers;\n            bufferPresent = false;\n            otherPresent = false;\n        }\n        else\n            break;\n        VMA_FALLTHROUGH; // Fallthrough\n    }\n    case StateExtensive::Operation::MoveBuffers:\n    {\n        if (MoveDataToFreeBlocks(VMA_SUBALLOCATION_TYPE_BUFFER, vector,\n            vectorState.firstFreeBlock, texturePresent, bufferPresent, otherPresent))\n        {\n            if (bufferPresent)\n            {\n                vectorState.operation = StateExtensive::Operation::FindFreeBlockBuffer;\n                return ComputeDefragmentation_Extensive(vector, index);\n            }\n\n            if (!otherPresent)\n            {\n                vectorState.operation = StateExtensive::Operation::Cleanup;\n                break;\n            }\n\n            // No more buffers to move, check all others\n            vectorState.operation = StateExtensive::Operation::MoveAll;\n            otherPresent = false;\n        }\n        else\n            break;\n        VMA_FALLTHROUGH; // Fallthrough\n    }\n    case StateExtensive::Operation::MoveAll:\n    {\n        if (MoveDataToFreeBlocks(VMA_SUBALLOCATION_TYPE_FREE, vector,\n            vectorState.firstFreeBlock, texturePresent, bufferPresent, otherPresent))\n        {\n            if (otherPresent)\n            {\n                vectorState.operation = StateExtensive::Operation::FindFreeBlockBuffer;\n                return ComputeDefragmentation_Extensive(vector, index);\n            }\n            // Everything moved\n            vectorState.operation = StateExtensive::Operation::Cleanup;\n        }\n        break;\n    }\n    case StateExtensive::Operation::Cleanup:\n        // Cleanup is handled below so that other operations may reuse the cleanup code. This case is here to prevent the unhandled enum value warning (C4062).\n        break;\n    }\n\n    if (vectorState.operation == StateExtensive::Operation::Cleanup)\n    {\n        // All other work done, pack data in blocks even tighter if possible\n        const size_t prevMoveCount = m_Moves.size();\n        for (size_t i = 0; i < vector.GetBlockCount(); ++i)\n        {\n            if (ReallocWithinBlock(vector, vector.GetBlock(i)))\n                return true;\n        }\n\n        if (prevMoveCount == m_Moves.size())\n            vectorState.operation = StateExtensive::Operation::Done;\n    }\n    return false;\n}\n\nvoid VmaDefragmentationContext_T::UpdateVectorStatistics(VmaBlockVector& vector, StateBalanced& state)\n{\n    size_t allocCount = 0;\n    size_t freeCount = 0;\n    state.avgFreeSize = 0;\n    state.avgAllocSize = 0;\n\n    for (size_t i = 0; i < vector.GetBlockCount(); ++i)\n    {\n        VmaBlockMetadata* metadata = vector.GetBlock(i)->m_pMetadata;\n\n        allocCount += metadata->GetAllocationCount();\n        freeCount += metadata->GetFreeRegionsCount();\n        state.avgFreeSize += metadata->GetSumFreeSize();\n        state.avgAllocSize += metadata->GetSize();\n    }\n\n    state.avgAllocSize = (state.avgAllocSize - state.avgFreeSize) / allocCount;\n    state.avgFreeSize /= freeCount;\n}\n\nbool VmaDefragmentationContext_T::MoveDataToFreeBlocks(VmaSuballocationType currentType,\n    VmaBlockVector& vector, size_t firstFreeBlock,\n    bool& texturePresent, bool& bufferPresent, bool& otherPresent)\n{\n    const size_t prevMoveCount = m_Moves.size();\n    for (size_t i = firstFreeBlock ; i;)\n    {\n        VmaDeviceMemoryBlock* block = vector.GetBlock(--i);\n        VmaBlockMetadata* metadata = block->m_pMetadata;\n\n        for (VmaAllocHandle handle = metadata->GetAllocationListBegin();\n            handle != VK_NULL_HANDLE;\n            handle = metadata->GetNextAllocation(handle))\n        {\n            MoveAllocationData moveData = GetMoveData(handle, metadata);\n            // Ignore newly created allocations by defragmentation algorithm\n            if (moveData.move.srcAllocation->GetUserData() == this)\n                continue;\n            switch (CheckCounters(moveData.move.srcAllocation->GetSize()))\n            {\n            case CounterStatus::Ignore:\n                continue;\n            case CounterStatus::End:\n                return true;\n            case CounterStatus::Pass:\n                break;\n            default:\n                VMA_ASSERT(0);\n            }\n\n            // Move only single type of resources at once\n            if (!VmaIsBufferImageGranularityConflict(moveData.type, currentType))\n            {\n                // Try to fit allocation into free blocks\n                if (AllocInOtherBlock(firstFreeBlock, vector.GetBlockCount(), moveData, vector))\n                    return false;\n            }\n\n            if (!VmaIsBufferImageGranularityConflict(moveData.type, VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL))\n                texturePresent = true;\n            else if (!VmaIsBufferImageGranularityConflict(moveData.type, VMA_SUBALLOCATION_TYPE_BUFFER))\n                bufferPresent = true;\n            else\n                otherPresent = true;\n        }\n    }\n    return prevMoveCount == m_Moves.size();\n}\n#endif // _VMA_DEFRAGMENTATION_CONTEXT_FUNCTIONS\n\n#ifndef _VMA_POOL_T_FUNCTIONS\nVmaPool_T::VmaPool_T(\n    VmaAllocator hAllocator,\n    const VmaPoolCreateInfo& createInfo,\n    VkDeviceSize preferredBlockSize)\n    : m_BlockVector(\n        hAllocator,\n        this, // hParentPool\n        createInfo.memoryTypeIndex,\n        createInfo.blockSize != 0 ? createInfo.blockSize : preferredBlockSize,\n        createInfo.minBlockCount,\n        createInfo.maxBlockCount,\n        (createInfo.flags& VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT) != 0 ? 1 : hAllocator->GetBufferImageGranularity(),\n        createInfo.blockSize != 0, // explicitBlockSize\n        createInfo.flags & VMA_POOL_CREATE_ALGORITHM_MASK, // algorithm\n        createInfo.priority,\n        VMA_MAX(hAllocator->GetMemoryTypeMinAlignment(createInfo.memoryTypeIndex), createInfo.minAllocationAlignment),\n        createInfo.pMemoryAllocateNext),\n    m_Id(0),\n    m_Name(VMA_NULL) {}\n\nVmaPool_T::~VmaPool_T()\n{\n    VMA_ASSERT(m_PrevPool == VMA_NULL && m_NextPool == VMA_NULL);\n\n    const VkAllocationCallbacks* allocs = m_BlockVector.GetAllocator()->GetAllocationCallbacks();\n    VmaFreeString(allocs, m_Name);\n}\n\nvoid VmaPool_T::SetName(const char* pName)\n{\n    const VkAllocationCallbacks* allocs = m_BlockVector.GetAllocator()->GetAllocationCallbacks();\n    VmaFreeString(allocs, m_Name);\n\n    if (pName != VMA_NULL)\n    {\n        m_Name = VmaCreateStringCopy(allocs, pName);\n    }\n    else\n    {\n        m_Name = VMA_NULL;\n    }\n}\n#endif // _VMA_POOL_T_FUNCTIONS\n\n#ifndef _VMA_ALLOCATOR_T_FUNCTIONS\nVmaAllocator_T::VmaAllocator_T(const VmaAllocatorCreateInfo* pCreateInfo) :\n    m_UseMutex((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT) == 0),\n    m_VulkanApiVersion(pCreateInfo->vulkanApiVersion != 0 ? pCreateInfo->vulkanApiVersion : VK_API_VERSION_1_0),\n    m_UseKhrDedicatedAllocation((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT) != 0),\n    m_UseKhrBindMemory2((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT) != 0),\n    m_UseExtMemoryBudget((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT) != 0),\n    m_UseAmdDeviceCoherentMemory((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT) != 0),\n    m_UseKhrBufferDeviceAddress((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT) != 0),\n    m_UseExtMemoryPriority((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT) != 0),\n    m_UseKhrMaintenance4((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_KHR_MAINTENANCE4_BIT) != 0),\n    m_UseKhrMaintenance5((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_KHR_MAINTENANCE5_BIT) != 0),\n    m_UseKhrExternalMemoryWin32((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_KHR_EXTERNAL_MEMORY_WIN32_BIT) != 0),\n    m_hDevice(pCreateInfo->device),\n    m_hInstance(pCreateInfo->instance),\n    m_AllocationCallbacksSpecified(pCreateInfo->pAllocationCallbacks != VMA_NULL),\n    m_AllocationCallbacks(pCreateInfo->pAllocationCallbacks ?\n        *pCreateInfo->pAllocationCallbacks : VmaEmptyAllocationCallbacks),\n    m_AllocationObjectAllocator(&m_AllocationCallbacks),\n    m_HeapSizeLimitMask(0),\n    m_DeviceMemoryCount(0),\n    m_PreferredLargeHeapBlockSize(0),\n    m_PhysicalDevice(pCreateInfo->physicalDevice),\n    m_GpuDefragmentationMemoryTypeBits(UINT32_MAX),\n    m_NextPoolId(0),\n    m_GlobalMemoryTypeBits(UINT32_MAX)\n{\n    if(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))\n    {\n        m_UseKhrDedicatedAllocation = false;\n        m_UseKhrBindMemory2 = false;\n    }\n\n    if(VMA_DEBUG_DETECT_CORRUPTION)\n    {\n        // Needs to be multiply of uint32_t size because we are going to write VMA_CORRUPTION_DETECTION_MAGIC_VALUE to it.\n        VMA_ASSERT(VMA_DEBUG_MARGIN % sizeof(uint32_t) == 0);\n    }\n\n    VMA_ASSERT(pCreateInfo->physicalDevice && pCreateInfo->device && pCreateInfo->instance);\n\n    if(m_VulkanApiVersion < VK_MAKE_VERSION(1, 1, 0))\n    {\n#if !(VMA_DEDICATED_ALLOCATION)\n        if((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT) != 0)\n        {\n            VMA_ASSERT(0 && \"VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT set but required extensions are disabled by preprocessor macros.\");\n        }\n#endif\n#if !(VMA_BIND_MEMORY2)\n        if((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT) != 0)\n        {\n            VMA_ASSERT(0 && \"VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT set but required extension is disabled by preprocessor macros.\");\n        }\n#endif\n    }\n#if !(VMA_MEMORY_BUDGET)\n    if((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT) != 0)\n    {\n        VMA_ASSERT(0 && \"VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT set but required extension is disabled by preprocessor macros.\");\n    }\n#endif\n#if !(VMA_BUFFER_DEVICE_ADDRESS)\n    if(m_UseKhrBufferDeviceAddress)\n    {\n        VMA_ASSERT(0 && \"VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT is set but required extension or Vulkan 1.2 is not available in your Vulkan header or its support in VMA has been disabled by a preprocessor macro.\");\n    }\n#endif\n#if VMA_VULKAN_VERSION < 1004000\n    VMA_ASSERT(m_VulkanApiVersion < VK_MAKE_VERSION(1, 4, 0) && \"vulkanApiVersion >= VK_API_VERSION_1_4 but required Vulkan version is disabled by preprocessor macros.\");\n#endif\n#if VMA_VULKAN_VERSION < 1003000\n    VMA_ASSERT(m_VulkanApiVersion < VK_MAKE_VERSION(1, 3, 0) && \"vulkanApiVersion >= VK_API_VERSION_1_3 but required Vulkan version is disabled by preprocessor macros.\");\n#endif\n#if VMA_VULKAN_VERSION < 1002000\n    VMA_ASSERT(m_VulkanApiVersion < VK_MAKE_VERSION(1, 2, 0) && \"vulkanApiVersion >= VK_API_VERSION_1_2 but required Vulkan version is disabled by preprocessor macros.\");\n#endif\n#if VMA_VULKAN_VERSION < 1001000\n    VMA_ASSERT(m_VulkanApiVersion < VK_MAKE_VERSION(1, 1, 0) && \"vulkanApiVersion >= VK_API_VERSION_1_1 but required Vulkan version is disabled by preprocessor macros.\");\n#endif\n#if !(VMA_MEMORY_PRIORITY)\n    if(m_UseExtMemoryPriority)\n    {\n        VMA_ASSERT(0 && \"VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT is set but required extension is not available in your Vulkan header or its support in VMA has been disabled by a preprocessor macro.\");\n    }\n#endif\n#if !(VMA_KHR_MAINTENANCE4)\n    if(m_UseKhrMaintenance4)\n    {\n        VMA_ASSERT(0 && \"VMA_ALLOCATOR_CREATE_KHR_MAINTENANCE4_BIT is set but required extension is not available in your Vulkan header or its support in VMA has been disabled by a preprocessor macro.\");\n    }\n#endif\n#if !(VMA_KHR_MAINTENANCE5)\n    if(m_UseKhrMaintenance5)\n    {\n        VMA_ASSERT(0 && \"VMA_ALLOCATOR_CREATE_KHR_MAINTENANCE5_BIT is set but required extension is not available in your Vulkan header or its support in VMA has been disabled by a preprocessor macro.\");\n    }\n#endif\n#if !(VMA_KHR_MAINTENANCE5)\n    if(m_UseKhrMaintenance5)\n    {\n        VMA_ASSERT(0 && \"VMA_ALLOCATOR_CREATE_KHR_MAINTENANCE5_BIT is set but required extension is not available in your Vulkan header or its support in VMA has been disabled by a preprocessor macro.\");\n    }\n#endif\n\n#if !(VMA_EXTERNAL_MEMORY_WIN32)\n    if(m_UseKhrExternalMemoryWin32)\n    {\n        VMA_ASSERT(0 && \"VMA_ALLOCATOR_CREATE_KHR_EXTERNAL_MEMORY_WIN32_BIT is set but required extension is not available in your Vulkan header or its support in VMA has been disabled by a preprocessor macro.\");\n    }\n#endif\n\n    memset(&m_DeviceMemoryCallbacks, 0 ,sizeof(m_DeviceMemoryCallbacks));\n    memset(&m_PhysicalDeviceProperties, 0, sizeof(m_PhysicalDeviceProperties));\n    memset(&m_MemProps, 0, sizeof(m_MemProps));\n\n    memset(&m_pBlockVectors, 0, sizeof(m_pBlockVectors));\n    memset(&m_VulkanFunctions, 0, sizeof(m_VulkanFunctions));\n\n#if VMA_EXTERNAL_MEMORY\n    memset(&m_TypeExternalMemoryHandleTypes, 0, sizeof(m_TypeExternalMemoryHandleTypes));\n#endif // #if VMA_EXTERNAL_MEMORY\n\n    if(pCreateInfo->pDeviceMemoryCallbacks != VMA_NULL)\n    {\n        m_DeviceMemoryCallbacks.pUserData = pCreateInfo->pDeviceMemoryCallbacks->pUserData;\n        m_DeviceMemoryCallbacks.pfnAllocate = pCreateInfo->pDeviceMemoryCallbacks->pfnAllocate;\n        m_DeviceMemoryCallbacks.pfnFree = pCreateInfo->pDeviceMemoryCallbacks->pfnFree;\n    }\n\n    ImportVulkanFunctions(pCreateInfo->pVulkanFunctions);\n\n    (*m_VulkanFunctions.vkGetPhysicalDeviceProperties)(m_PhysicalDevice, &m_PhysicalDeviceProperties);\n    (*m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties)(m_PhysicalDevice, &m_MemProps);\n\n    VMA_ASSERT(VmaIsPow2(VMA_MIN_ALIGNMENT));\n    VMA_ASSERT(VmaIsPow2(VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY));\n    VMA_ASSERT(VmaIsPow2(m_PhysicalDeviceProperties.limits.bufferImageGranularity));\n    VMA_ASSERT(VmaIsPow2(m_PhysicalDeviceProperties.limits.nonCoherentAtomSize));\n\n    m_PreferredLargeHeapBlockSize = (pCreateInfo->preferredLargeHeapBlockSize != 0) ?\n        pCreateInfo->preferredLargeHeapBlockSize : static_cast<VkDeviceSize>(VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE);\n\n    m_GlobalMemoryTypeBits = CalculateGlobalMemoryTypeBits();\n\n#if VMA_EXTERNAL_MEMORY\n    if(pCreateInfo->pTypeExternalMemoryHandleTypes != VMA_NULL)\n    {\n        memcpy(m_TypeExternalMemoryHandleTypes, pCreateInfo->pTypeExternalMemoryHandleTypes,\n            sizeof(VkExternalMemoryHandleTypeFlagsKHR) * GetMemoryTypeCount());\n    }\n#endif // #if VMA_EXTERNAL_MEMORY\n\n    if(pCreateInfo->pHeapSizeLimit != VMA_NULL)\n    {\n        for(uint32_t heapIndex = 0; heapIndex < GetMemoryHeapCount(); ++heapIndex)\n        {\n            const VkDeviceSize limit = pCreateInfo->pHeapSizeLimit[heapIndex];\n            if(limit != VK_WHOLE_SIZE)\n            {\n                m_HeapSizeLimitMask |= 1u << heapIndex;\n                if(limit < m_MemProps.memoryHeaps[heapIndex].size)\n                {\n                    m_MemProps.memoryHeaps[heapIndex].size = limit;\n                }\n            }\n        }\n    }\n\n    for(uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)\n    {\n        // Create only supported types\n        if((m_GlobalMemoryTypeBits & (1u << memTypeIndex)) != 0)\n        {\n            const VkDeviceSize preferredBlockSize = CalcPreferredBlockSize(memTypeIndex);\n            m_pBlockVectors[memTypeIndex] = vma_new(this, VmaBlockVector)(\n                this,\n                VK_NULL_HANDLE, // hParentPool\n                memTypeIndex,\n                preferredBlockSize,\n                0,\n                SIZE_MAX,\n                GetBufferImageGranularity(),\n                false, // explicitBlockSize\n                0, // algorithm\n                0.5f, // priority (0.5 is the default per Vulkan spec)\n                GetMemoryTypeMinAlignment(memTypeIndex), // minAllocationAlignment\n                VMA_NULL); // // pMemoryAllocateNext\n            // No need to call m_pBlockVectors[memTypeIndex][blockVectorTypeIndex]->CreateMinBlocks here,\n            // because minBlockCount is 0.\n        }\n    }\n}\n\nVkResult VmaAllocator_T::Init(const VmaAllocatorCreateInfo* pCreateInfo)\n{\n    VkResult res = VK_SUCCESS;\n\n#if VMA_MEMORY_BUDGET\n    if(m_UseExtMemoryBudget)\n    {\n        UpdateVulkanBudget();\n    }\n#endif // #if VMA_MEMORY_BUDGET\n\n    return res;\n}\n\nVmaAllocator_T::~VmaAllocator_T()\n{\n    VMA_ASSERT(m_Pools.IsEmpty());\n\n    for(size_t memTypeIndex = GetMemoryTypeCount(); memTypeIndex--; )\n    {\n        vma_delete(this, m_pBlockVectors[memTypeIndex]);\n    }\n}\n\nvoid VmaAllocator_T::ImportVulkanFunctions(const VmaVulkanFunctions* pVulkanFunctions)\n{\n#if VMA_STATIC_VULKAN_FUNCTIONS == 1\n    ImportVulkanFunctions_Static();\n#endif\n\n    if(pVulkanFunctions != VMA_NULL)\n    {\n        ImportVulkanFunctions_Custom(pVulkanFunctions);\n    }\n\n#if VMA_DYNAMIC_VULKAN_FUNCTIONS == 1\n    ImportVulkanFunctions_Dynamic();\n#endif\n\n    ValidateVulkanFunctions();\n}\n\n#if VMA_STATIC_VULKAN_FUNCTIONS == 1\n\nvoid VmaAllocator_T::ImportVulkanFunctions_Static()\n{\n    // Vulkan 1.0\n    m_VulkanFunctions.vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)vkGetInstanceProcAddr;\n    m_VulkanFunctions.vkGetDeviceProcAddr = (PFN_vkGetDeviceProcAddr)vkGetDeviceProcAddr;\n    m_VulkanFunctions.vkGetPhysicalDeviceProperties = (PFN_vkGetPhysicalDeviceProperties)vkGetPhysicalDeviceProperties;\n    m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties = (PFN_vkGetPhysicalDeviceMemoryProperties)vkGetPhysicalDeviceMemoryProperties;\n    m_VulkanFunctions.vkAllocateMemory = (PFN_vkAllocateMemory)vkAllocateMemory;\n    m_VulkanFunctions.vkFreeMemory = (PFN_vkFreeMemory)vkFreeMemory;\n    m_VulkanFunctions.vkMapMemory = (PFN_vkMapMemory)vkMapMemory;\n    m_VulkanFunctions.vkUnmapMemory = (PFN_vkUnmapMemory)vkUnmapMemory;\n    m_VulkanFunctions.vkFlushMappedMemoryRanges = (PFN_vkFlushMappedMemoryRanges)vkFlushMappedMemoryRanges;\n    m_VulkanFunctions.vkInvalidateMappedMemoryRanges = (PFN_vkInvalidateMappedMemoryRanges)vkInvalidateMappedMemoryRanges;\n    m_VulkanFunctions.vkBindBufferMemory = (PFN_vkBindBufferMemory)vkBindBufferMemory;\n    m_VulkanFunctions.vkBindImageMemory = (PFN_vkBindImageMemory)vkBindImageMemory;\n    m_VulkanFunctions.vkGetBufferMemoryRequirements = (PFN_vkGetBufferMemoryRequirements)vkGetBufferMemoryRequirements;\n    m_VulkanFunctions.vkGetImageMemoryRequirements = (PFN_vkGetImageMemoryRequirements)vkGetImageMemoryRequirements;\n    m_VulkanFunctions.vkCreateBuffer = (PFN_vkCreateBuffer)vkCreateBuffer;\n    m_VulkanFunctions.vkDestroyBuffer = (PFN_vkDestroyBuffer)vkDestroyBuffer;\n    m_VulkanFunctions.vkCreateImage = (PFN_vkCreateImage)vkCreateImage;\n    m_VulkanFunctions.vkDestroyImage = (PFN_vkDestroyImage)vkDestroyImage;\n    m_VulkanFunctions.vkCmdCopyBuffer = (PFN_vkCmdCopyBuffer)vkCmdCopyBuffer;\n\n    // Vulkan 1.1\n#if VMA_VULKAN_VERSION >= 1001000\n    if(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))\n    {\n        m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR = (PFN_vkGetBufferMemoryRequirements2)vkGetBufferMemoryRequirements2;\n        m_VulkanFunctions.vkGetImageMemoryRequirements2KHR = (PFN_vkGetImageMemoryRequirements2)vkGetImageMemoryRequirements2;\n        m_VulkanFunctions.vkBindBufferMemory2KHR = (PFN_vkBindBufferMemory2)vkBindBufferMemory2;\n        m_VulkanFunctions.vkBindImageMemory2KHR = (PFN_vkBindImageMemory2)vkBindImageMemory2;\n    }\n#endif\n\n#if VMA_VULKAN_VERSION >= 1001000\n    if(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))\n    {\n        m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties2KHR = (PFN_vkGetPhysicalDeviceMemoryProperties2)vkGetPhysicalDeviceMemoryProperties2;\n    }\n#endif\n\n#if VMA_VULKAN_VERSION >= 1003000\n    if(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 3, 0))\n    {\n        m_VulkanFunctions.vkGetDeviceBufferMemoryRequirements = (PFN_vkGetDeviceBufferMemoryRequirements)vkGetDeviceBufferMemoryRequirements;\n        m_VulkanFunctions.vkGetDeviceImageMemoryRequirements = (PFN_vkGetDeviceImageMemoryRequirements)vkGetDeviceImageMemoryRequirements;\n    }\n#endif\n}\n\n#endif // VMA_STATIC_VULKAN_FUNCTIONS == 1\n\nvoid VmaAllocator_T::ImportVulkanFunctions_Custom(const VmaVulkanFunctions* pVulkanFunctions)\n{\n    VMA_ASSERT(pVulkanFunctions != VMA_NULL);\n\n#define VMA_COPY_IF_NOT_NULL(funcName) \\\n    if(pVulkanFunctions->funcName != VMA_NULL) m_VulkanFunctions.funcName = pVulkanFunctions->funcName;\n\n    VMA_COPY_IF_NOT_NULL(vkGetInstanceProcAddr);\n    VMA_COPY_IF_NOT_NULL(vkGetDeviceProcAddr);\n    VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceProperties);\n    VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceMemoryProperties);\n    VMA_COPY_IF_NOT_NULL(vkAllocateMemory);\n    VMA_COPY_IF_NOT_NULL(vkFreeMemory);\n    VMA_COPY_IF_NOT_NULL(vkMapMemory);\n    VMA_COPY_IF_NOT_NULL(vkUnmapMemory);\n    VMA_COPY_IF_NOT_NULL(vkFlushMappedMemoryRanges);\n    VMA_COPY_IF_NOT_NULL(vkInvalidateMappedMemoryRanges);\n    VMA_COPY_IF_NOT_NULL(vkBindBufferMemory);\n    VMA_COPY_IF_NOT_NULL(vkBindImageMemory);\n    VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements);\n    VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements);\n    VMA_COPY_IF_NOT_NULL(vkCreateBuffer);\n    VMA_COPY_IF_NOT_NULL(vkDestroyBuffer);\n    VMA_COPY_IF_NOT_NULL(vkCreateImage);\n    VMA_COPY_IF_NOT_NULL(vkDestroyImage);\n    VMA_COPY_IF_NOT_NULL(vkCmdCopyBuffer);\n\n#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000\n    VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements2KHR);\n    VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements2KHR);\n#endif\n\n#if VMA_BIND_MEMORY2 || VMA_VULKAN_VERSION >= 1001000\n    VMA_COPY_IF_NOT_NULL(vkBindBufferMemory2KHR);\n    VMA_COPY_IF_NOT_NULL(vkBindImageMemory2KHR);\n#endif\n\n#if VMA_MEMORY_BUDGET || VMA_VULKAN_VERSION >= 1001000\n    VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceMemoryProperties2KHR);\n#endif\n\n#if VMA_KHR_MAINTENANCE4 || VMA_VULKAN_VERSION >= 1003000\n    VMA_COPY_IF_NOT_NULL(vkGetDeviceBufferMemoryRequirements);\n    VMA_COPY_IF_NOT_NULL(vkGetDeviceImageMemoryRequirements);\n#endif\n#if VMA_EXTERNAL_MEMORY_WIN32\n    VMA_COPY_IF_NOT_NULL(vkGetMemoryWin32HandleKHR);\n#endif\n#undef VMA_COPY_IF_NOT_NULL\n}\n\n#if VMA_DYNAMIC_VULKAN_FUNCTIONS == 1\n\nvoid VmaAllocator_T::ImportVulkanFunctions_Dynamic()\n{\n    VMA_ASSERT(m_VulkanFunctions.vkGetInstanceProcAddr && m_VulkanFunctions.vkGetDeviceProcAddr &&\n        \"To use VMA_DYNAMIC_VULKAN_FUNCTIONS in new versions of VMA you now have to pass \"\n        \"VmaVulkanFunctions::vkGetInstanceProcAddr and vkGetDeviceProcAddr as VmaAllocatorCreateInfo::pVulkanFunctions. \"\n        \"Other members can be null.\");\n\n#define VMA_FETCH_INSTANCE_FUNC(memberName, functionPointerType, functionNameString) \\\n    if(m_VulkanFunctions.memberName == VMA_NULL) \\\n        m_VulkanFunctions.memberName = \\\n            (functionPointerType)m_VulkanFunctions.vkGetInstanceProcAddr(m_hInstance, functionNameString);\n#define VMA_FETCH_DEVICE_FUNC(memberName, functionPointerType, functionNameString) \\\n    if(m_VulkanFunctions.memberName == VMA_NULL) \\\n        m_VulkanFunctions.memberName = \\\n            (functionPointerType)m_VulkanFunctions.vkGetDeviceProcAddr(m_hDevice, functionNameString);\n\n    VMA_FETCH_INSTANCE_FUNC(vkGetPhysicalDeviceProperties, PFN_vkGetPhysicalDeviceProperties, \"vkGetPhysicalDeviceProperties\");\n    VMA_FETCH_INSTANCE_FUNC(vkGetPhysicalDeviceMemoryProperties, PFN_vkGetPhysicalDeviceMemoryProperties, \"vkGetPhysicalDeviceMemoryProperties\");\n    VMA_FETCH_DEVICE_FUNC(vkAllocateMemory, PFN_vkAllocateMemory, \"vkAllocateMemory\");\n    VMA_FETCH_DEVICE_FUNC(vkFreeMemory, PFN_vkFreeMemory, \"vkFreeMemory\");\n    VMA_FETCH_DEVICE_FUNC(vkMapMemory, PFN_vkMapMemory, \"vkMapMemory\");\n    VMA_FETCH_DEVICE_FUNC(vkUnmapMemory, PFN_vkUnmapMemory, \"vkUnmapMemory\");\n    VMA_FETCH_DEVICE_FUNC(vkFlushMappedMemoryRanges, PFN_vkFlushMappedMemoryRanges, \"vkFlushMappedMemoryRanges\");\n    VMA_FETCH_DEVICE_FUNC(vkInvalidateMappedMemoryRanges, PFN_vkInvalidateMappedMemoryRanges, \"vkInvalidateMappedMemoryRanges\");\n    VMA_FETCH_DEVICE_FUNC(vkBindBufferMemory, PFN_vkBindBufferMemory, \"vkBindBufferMemory\");\n    VMA_FETCH_DEVICE_FUNC(vkBindImageMemory, PFN_vkBindImageMemory, \"vkBindImageMemory\");\n    VMA_FETCH_DEVICE_FUNC(vkGetBufferMemoryRequirements, PFN_vkGetBufferMemoryRequirements, \"vkGetBufferMemoryRequirements\");\n    VMA_FETCH_DEVICE_FUNC(vkGetImageMemoryRequirements, PFN_vkGetImageMemoryRequirements, \"vkGetImageMemoryRequirements\");\n    VMA_FETCH_DEVICE_FUNC(vkCreateBuffer, PFN_vkCreateBuffer, \"vkCreateBuffer\");\n    VMA_FETCH_DEVICE_FUNC(vkDestroyBuffer, PFN_vkDestroyBuffer, \"vkDestroyBuffer\");\n    VMA_FETCH_DEVICE_FUNC(vkCreateImage, PFN_vkCreateImage, \"vkCreateImage\");\n    VMA_FETCH_DEVICE_FUNC(vkDestroyImage, PFN_vkDestroyImage, \"vkDestroyImage\");\n    VMA_FETCH_DEVICE_FUNC(vkCmdCopyBuffer, PFN_vkCmdCopyBuffer, \"vkCmdCopyBuffer\");\n\n#if VMA_VULKAN_VERSION >= 1001000\n    if(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))\n    {\n        VMA_FETCH_DEVICE_FUNC(vkGetBufferMemoryRequirements2KHR, PFN_vkGetBufferMemoryRequirements2, \"vkGetBufferMemoryRequirements2\");\n        VMA_FETCH_DEVICE_FUNC(vkGetImageMemoryRequirements2KHR, PFN_vkGetImageMemoryRequirements2, \"vkGetImageMemoryRequirements2\");\n        VMA_FETCH_DEVICE_FUNC(vkBindBufferMemory2KHR, PFN_vkBindBufferMemory2, \"vkBindBufferMemory2\");\n        VMA_FETCH_DEVICE_FUNC(vkBindImageMemory2KHR, PFN_vkBindImageMemory2, \"vkBindImageMemory2\");\n    }\n#endif\n\n#if VMA_MEMORY_BUDGET || VMA_VULKAN_VERSION >= 1001000\n    if(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))\n    {\n        VMA_FETCH_INSTANCE_FUNC(vkGetPhysicalDeviceMemoryProperties2KHR, PFN_vkGetPhysicalDeviceMemoryProperties2KHR, \"vkGetPhysicalDeviceMemoryProperties2\");\n        // Try to fetch the pointer from the other name, based on suspected driver bug - see issue #410.\n        VMA_FETCH_INSTANCE_FUNC(vkGetPhysicalDeviceMemoryProperties2KHR, PFN_vkGetPhysicalDeviceMemoryProperties2KHR, \"vkGetPhysicalDeviceMemoryProperties2KHR\");\n    }\n    else if(m_UseExtMemoryBudget)\n    {\n        VMA_FETCH_INSTANCE_FUNC(vkGetPhysicalDeviceMemoryProperties2KHR, PFN_vkGetPhysicalDeviceMemoryProperties2KHR, \"vkGetPhysicalDeviceMemoryProperties2KHR\");\n        // Try to fetch the pointer from the other name, based on suspected driver bug - see issue #410.\n        VMA_FETCH_INSTANCE_FUNC(vkGetPhysicalDeviceMemoryProperties2KHR, PFN_vkGetPhysicalDeviceMemoryProperties2KHR, \"vkGetPhysicalDeviceMemoryProperties2\");\n    }\n#endif\n\n#if VMA_DEDICATED_ALLOCATION\n    if(m_UseKhrDedicatedAllocation)\n    {\n        VMA_FETCH_DEVICE_FUNC(vkGetBufferMemoryRequirements2KHR, PFN_vkGetBufferMemoryRequirements2KHR, \"vkGetBufferMemoryRequirements2KHR\");\n        VMA_FETCH_DEVICE_FUNC(vkGetImageMemoryRequirements2KHR, PFN_vkGetImageMemoryRequirements2KHR, \"vkGetImageMemoryRequirements2KHR\");\n    }\n#endif\n\n#if VMA_BIND_MEMORY2\n    if(m_UseKhrBindMemory2)\n    {\n        VMA_FETCH_DEVICE_FUNC(vkBindBufferMemory2KHR, PFN_vkBindBufferMemory2KHR, \"vkBindBufferMemory2KHR\");\n        VMA_FETCH_DEVICE_FUNC(vkBindImageMemory2KHR, PFN_vkBindImageMemory2KHR, \"vkBindImageMemory2KHR\");\n    }\n#endif // #if VMA_BIND_MEMORY2\n\n#if VMA_MEMORY_BUDGET || VMA_VULKAN_VERSION >= 1001000\n    if(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))\n    {\n        VMA_FETCH_INSTANCE_FUNC(vkGetPhysicalDeviceMemoryProperties2KHR, PFN_vkGetPhysicalDeviceMemoryProperties2KHR, \"vkGetPhysicalDeviceMemoryProperties2\");\n    }\n    else if(m_UseExtMemoryBudget)\n    {\n        VMA_FETCH_INSTANCE_FUNC(vkGetPhysicalDeviceMemoryProperties2KHR, PFN_vkGetPhysicalDeviceMemoryProperties2KHR, \"vkGetPhysicalDeviceMemoryProperties2KHR\");\n    }\n#endif // #if VMA_MEMORY_BUDGET\n\n#if VMA_VULKAN_VERSION >= 1003000\n    if(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 3, 0))\n    {\n        VMA_FETCH_DEVICE_FUNC(vkGetDeviceBufferMemoryRequirements, PFN_vkGetDeviceBufferMemoryRequirements, \"vkGetDeviceBufferMemoryRequirements\");\n        VMA_FETCH_DEVICE_FUNC(vkGetDeviceImageMemoryRequirements, PFN_vkGetDeviceImageMemoryRequirements, \"vkGetDeviceImageMemoryRequirements\");\n    }\n#endif\n#if VMA_KHR_MAINTENANCE4\n    if(m_UseKhrMaintenance4)\n    {\n        VMA_FETCH_DEVICE_FUNC(vkGetDeviceBufferMemoryRequirements, PFN_vkGetDeviceBufferMemoryRequirementsKHR, \"vkGetDeviceBufferMemoryRequirementsKHR\");\n        VMA_FETCH_DEVICE_FUNC(vkGetDeviceImageMemoryRequirements, PFN_vkGetDeviceImageMemoryRequirementsKHR, \"vkGetDeviceImageMemoryRequirementsKHR\");\n    }\n#endif\n#if VMA_EXTERNAL_MEMORY_WIN32\n    if (m_UseKhrExternalMemoryWin32)\n    {\n        VMA_FETCH_DEVICE_FUNC(vkGetMemoryWin32HandleKHR, PFN_vkGetMemoryWin32HandleKHR, \"vkGetMemoryWin32HandleKHR\");\n    }\n#endif\n#undef VMA_FETCH_DEVICE_FUNC\n#undef VMA_FETCH_INSTANCE_FUNC\n}\n\n#endif // VMA_DYNAMIC_VULKAN_FUNCTIONS == 1\n\nvoid VmaAllocator_T::ValidateVulkanFunctions()\n{\n    VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceProperties != VMA_NULL);\n    VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties != VMA_NULL);\n    VMA_ASSERT(m_VulkanFunctions.vkAllocateMemory != VMA_NULL);\n    VMA_ASSERT(m_VulkanFunctions.vkFreeMemory != VMA_NULL);\n    VMA_ASSERT(m_VulkanFunctions.vkMapMemory != VMA_NULL);\n    VMA_ASSERT(m_VulkanFunctions.vkUnmapMemory != VMA_NULL);\n    VMA_ASSERT(m_VulkanFunctions.vkFlushMappedMemoryRanges != VMA_NULL);\n    VMA_ASSERT(m_VulkanFunctions.vkInvalidateMappedMemoryRanges != VMA_NULL);\n    VMA_ASSERT(m_VulkanFunctions.vkBindBufferMemory != VMA_NULL);\n    VMA_ASSERT(m_VulkanFunctions.vkBindImageMemory != VMA_NULL);\n    VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements != VMA_NULL);\n    VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements != VMA_NULL);\n    VMA_ASSERT(m_VulkanFunctions.vkCreateBuffer != VMA_NULL);\n    VMA_ASSERT(m_VulkanFunctions.vkDestroyBuffer != VMA_NULL);\n    VMA_ASSERT(m_VulkanFunctions.vkCreateImage != VMA_NULL);\n    VMA_ASSERT(m_VulkanFunctions.vkDestroyImage != VMA_NULL);\n    VMA_ASSERT(m_VulkanFunctions.vkCmdCopyBuffer != VMA_NULL);\n\n#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000\n    if(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0) || m_UseKhrDedicatedAllocation)\n    {\n        VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR != VMA_NULL);\n        VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements2KHR != VMA_NULL);\n    }\n#endif\n\n#if VMA_BIND_MEMORY2 || VMA_VULKAN_VERSION >= 1001000\n    if(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0) || m_UseKhrBindMemory2)\n    {\n        VMA_ASSERT(m_VulkanFunctions.vkBindBufferMemory2KHR != VMA_NULL);\n        VMA_ASSERT(m_VulkanFunctions.vkBindImageMemory2KHR != VMA_NULL);\n    }\n#endif\n\n#if VMA_MEMORY_BUDGET || VMA_VULKAN_VERSION >= 1001000\n    if(m_UseExtMemoryBudget || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))\n    {\n        VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties2KHR != VMA_NULL);\n    }\n#endif\n#if VMA_EXTERNAL_MEMORY_WIN32\n    if (m_UseKhrExternalMemoryWin32)\n    {\n        VMA_ASSERT(m_VulkanFunctions.vkGetMemoryWin32HandleKHR != VMA_NULL);\n    }\n#endif\n\n    // Not validating these due to suspected driver bugs with these function\n    // pointers being null despite correct extension or Vulkan version is enabled.\n    // See issue #397. Their usage in VMA is optional anyway.\n    //\n    // VMA_ASSERT(m_VulkanFunctions.vkGetDeviceBufferMemoryRequirements != VMA_NULL);\n    // VMA_ASSERT(m_VulkanFunctions.vkGetDeviceImageMemoryRequirements != VMA_NULL);\n}\n\nVkDeviceSize VmaAllocator_T::CalcPreferredBlockSize(uint32_t memTypeIndex)\n{\n    const uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);\n    const VkDeviceSize heapSize = m_MemProps.memoryHeaps[heapIndex].size;\n    const bool isSmallHeap = heapSize <= VMA_SMALL_HEAP_MAX_SIZE;\n    return VmaAlignUp(isSmallHeap ? (heapSize / 8) : m_PreferredLargeHeapBlockSize, (VkDeviceSize)32);\n}\n\nVkResult VmaAllocator_T::AllocateMemoryOfType(\n    VmaPool pool,\n    VkDeviceSize size,\n    VkDeviceSize alignment,\n    bool dedicatedPreferred,\n    VkBuffer dedicatedBuffer,\n    VkImage dedicatedImage,\n    VmaBufferImageUsage dedicatedBufferImageUsage,\n    const VmaAllocationCreateInfo& createInfo,\n    uint32_t memTypeIndex,\n    VmaSuballocationType suballocType,\n    VmaDedicatedAllocationList& dedicatedAllocations,\n    VmaBlockVector& blockVector,\n    size_t allocationCount,\n    VmaAllocation* pAllocations)\n{\n    VMA_ASSERT(pAllocations != VMA_NULL);\n    VMA_DEBUG_LOG_FORMAT(\"  AllocateMemory: MemoryTypeIndex=%\" PRIu32 \", AllocationCount=%zu, Size=%\" PRIu64, memTypeIndex, allocationCount, size);\n\n    VmaAllocationCreateInfo finalCreateInfo = createInfo;\n    VkResult res = CalcMemTypeParams(\n        finalCreateInfo,\n        memTypeIndex,\n        size,\n        allocationCount);\n    if(res != VK_SUCCESS)\n        return res;\n\n    if((finalCreateInfo.flags & VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT) != 0)\n    {\n        return AllocateDedicatedMemory(\n            pool,\n            size,\n            suballocType,\n            dedicatedAllocations,\n            memTypeIndex,\n            (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_MAPPED_BIT) != 0,\n            (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT) != 0,\n            (finalCreateInfo.flags &\n                (VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT)) != 0,\n            (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_CAN_ALIAS_BIT) != 0,\n            finalCreateInfo.pUserData,\n            finalCreateInfo.priority,\n            dedicatedBuffer,\n            dedicatedImage,\n            dedicatedBufferImageUsage,\n            allocationCount,\n            pAllocations,\n            blockVector.GetAllocationNextPtr());\n    }\n    else\n    {\n        const bool canAllocateDedicated =\n            (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT) == 0 &&\n            (pool == VK_NULL_HANDLE || !blockVector.HasExplicitBlockSize());\n\n        if(canAllocateDedicated)\n        {\n            // Heuristics: Allocate dedicated memory if requested size if greater than half of preferred block size.\n            if(size > blockVector.GetPreferredBlockSize() / 2)\n            {\n                dedicatedPreferred = true;\n            }\n            // Protection against creating each allocation as dedicated when we reach or exceed heap size/budget,\n            // which can quickly deplete maxMemoryAllocationCount: Don't prefer dedicated allocations when above\n            // 3/4 of the maximum allocation count.\n            if(m_PhysicalDeviceProperties.limits.maxMemoryAllocationCount < UINT32_MAX / 4 &&\n                m_DeviceMemoryCount.load() > m_PhysicalDeviceProperties.limits.maxMemoryAllocationCount * 3 / 4)\n            {\n                dedicatedPreferred = false;\n            }\n\n            if(dedicatedPreferred)\n            {\n                res = AllocateDedicatedMemory(\n                    pool,\n                    size,\n                    suballocType,\n                    dedicatedAllocations,\n                    memTypeIndex,\n                    (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_MAPPED_BIT) != 0,\n                    (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT) != 0,\n                    (finalCreateInfo.flags &\n                        (VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT)) != 0,\n                    (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_CAN_ALIAS_BIT) != 0,\n                    finalCreateInfo.pUserData,\n                    finalCreateInfo.priority,\n                    dedicatedBuffer,\n                    dedicatedImage,\n                    dedicatedBufferImageUsage,\n                    allocationCount,\n                    pAllocations,\n                    blockVector.GetAllocationNextPtr());\n                if(res == VK_SUCCESS)\n                {\n                    // Succeeded: AllocateDedicatedMemory function already filled pMemory, nothing more to do here.\n                    VMA_DEBUG_LOG(\"    Allocated as DedicatedMemory\");\n                    return VK_SUCCESS;\n                }\n            }\n        }\n\n        res = blockVector.Allocate(\n            size,\n            alignment,\n            finalCreateInfo,\n            suballocType,\n            allocationCount,\n            pAllocations);\n        if(res == VK_SUCCESS)\n            return VK_SUCCESS;\n\n        // Try dedicated memory.\n        if(canAllocateDedicated && !dedicatedPreferred)\n        {\n            res = AllocateDedicatedMemory(\n                pool,\n                size,\n                suballocType,\n                dedicatedAllocations,\n                memTypeIndex,\n                (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_MAPPED_BIT) != 0,\n                (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT) != 0,\n                (finalCreateInfo.flags &\n                    (VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT)) != 0,\n                (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_CAN_ALIAS_BIT) != 0,\n                finalCreateInfo.pUserData,\n                finalCreateInfo.priority,\n                dedicatedBuffer,\n                dedicatedImage,\n                dedicatedBufferImageUsage,\n                allocationCount,\n                pAllocations,\n                blockVector.GetAllocationNextPtr());\n            if(res == VK_SUCCESS)\n            {\n                // Succeeded: AllocateDedicatedMemory function already filled pMemory, nothing more to do here.\n                VMA_DEBUG_LOG(\"    Allocated as DedicatedMemory\");\n                return VK_SUCCESS;\n            }\n        }\n        // Everything failed: Return error code.\n        VMA_DEBUG_LOG(\"    vkAllocateMemory FAILED\");\n        return res;\n    }\n}\n\nVkResult VmaAllocator_T::AllocateDedicatedMemory(\n    VmaPool pool,\n    VkDeviceSize size,\n    VmaSuballocationType suballocType,\n    VmaDedicatedAllocationList& dedicatedAllocations,\n    uint32_t memTypeIndex,\n    bool map,\n    bool isUserDataString,\n    bool isMappingAllowed,\n    bool canAliasMemory,\n    void* pUserData,\n    float priority,\n    VkBuffer dedicatedBuffer,\n    VkImage dedicatedImage,\n    VmaBufferImageUsage dedicatedBufferImageUsage,\n    size_t allocationCount,\n    VmaAllocation* pAllocations,\n    const void* pNextChain)\n{\n    VMA_ASSERT(allocationCount > 0 && pAllocations);\n\n    VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };\n    allocInfo.memoryTypeIndex = memTypeIndex;\n    allocInfo.allocationSize = size;\n    allocInfo.pNext = pNextChain;\n\n#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000\n    VkMemoryDedicatedAllocateInfoKHR dedicatedAllocInfo = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR };\n    if(!canAliasMemory)\n    {\n        if(m_UseKhrDedicatedAllocation || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))\n        {\n            if(dedicatedBuffer != VK_NULL_HANDLE)\n            {\n                VMA_ASSERT(dedicatedImage == VK_NULL_HANDLE);\n                dedicatedAllocInfo.buffer = dedicatedBuffer;\n                VmaPnextChainPushFront(&allocInfo, &dedicatedAllocInfo);\n            }\n            else if(dedicatedImage != VK_NULL_HANDLE)\n            {\n                dedicatedAllocInfo.image = dedicatedImage;\n                VmaPnextChainPushFront(&allocInfo, &dedicatedAllocInfo);\n            }\n        }\n    }\n#endif // #if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000\n\n#if VMA_BUFFER_DEVICE_ADDRESS\n    VkMemoryAllocateFlagsInfoKHR allocFlagsInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHR };\n    if(m_UseKhrBufferDeviceAddress)\n    {\n        bool canContainBufferWithDeviceAddress = true;\n        if(dedicatedBuffer != VK_NULL_HANDLE)\n        {\n            canContainBufferWithDeviceAddress = dedicatedBufferImageUsage == VmaBufferImageUsage::UNKNOWN ||\n                dedicatedBufferImageUsage.Contains(VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT);\n        }\n        else if(dedicatedImage != VK_NULL_HANDLE)\n        {\n            canContainBufferWithDeviceAddress = false;\n        }\n        if(canContainBufferWithDeviceAddress)\n        {\n            allocFlagsInfo.flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR;\n            VmaPnextChainPushFront(&allocInfo, &allocFlagsInfo);\n        }\n    }\n#endif // #if VMA_BUFFER_DEVICE_ADDRESS\n\n#if VMA_MEMORY_PRIORITY\n    VkMemoryPriorityAllocateInfoEXT priorityInfo = { VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT };\n    if(m_UseExtMemoryPriority)\n    {\n        VMA_ASSERT(priority >= 0.f && priority <= 1.f);\n        priorityInfo.priority = priority;\n        VmaPnextChainPushFront(&allocInfo, &priorityInfo);\n    }\n#endif // #if VMA_MEMORY_PRIORITY\n\n#if VMA_EXTERNAL_MEMORY\n    // Attach VkExportMemoryAllocateInfoKHR if necessary.\n    VkExportMemoryAllocateInfoKHR exportMemoryAllocInfo = { VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR };\n    exportMemoryAllocInfo.handleTypes = GetExternalMemoryHandleTypeFlags(memTypeIndex);\n    if(exportMemoryAllocInfo.handleTypes != 0)\n    {\n        VmaPnextChainPushFront(&allocInfo, &exportMemoryAllocInfo);\n    }\n#endif // #if VMA_EXTERNAL_MEMORY\n\n    size_t allocIndex;\n    VkResult res = VK_SUCCESS;\n    for(allocIndex = 0; allocIndex < allocationCount; ++allocIndex)\n    {\n        res = AllocateDedicatedMemoryPage(\n            pool,\n            size,\n            suballocType,\n            memTypeIndex,\n            allocInfo,\n            map,\n            isUserDataString,\n            isMappingAllowed,\n            pUserData,\n            pAllocations + allocIndex);\n        if(res != VK_SUCCESS)\n        {\n            break;\n        }\n    }\n\n    if(res == VK_SUCCESS)\n    {\n        for (allocIndex = 0; allocIndex < allocationCount; ++allocIndex)\n        {\n            dedicatedAllocations.Register(pAllocations[allocIndex]);\n        }\n        VMA_DEBUG_LOG_FORMAT(\"    Allocated DedicatedMemory Count=%zu, MemoryTypeIndex=#%\" PRIu32, allocationCount, memTypeIndex);\n    }\n    else\n    {\n        // Free all already created allocations.\n        while(allocIndex--)\n        {\n            VmaAllocation currAlloc = pAllocations[allocIndex];\n            VkDeviceMemory hMemory = currAlloc->GetMemory();\n\n            /*\n            There is no need to call this, because Vulkan spec allows to skip vkUnmapMemory\n            before vkFreeMemory.\n\n            if(currAlloc->GetMappedData() != VMA_NULL)\n            {\n                (*m_VulkanFunctions.vkUnmapMemory)(m_hDevice, hMemory);\n            }\n            */\n\n            FreeVulkanMemory(memTypeIndex, currAlloc->GetSize(), hMemory);\n            m_Budget.RemoveAllocation(MemoryTypeIndexToHeapIndex(memTypeIndex), currAlloc->GetSize());\n            m_AllocationObjectAllocator.Free(currAlloc);\n        }\n\n        memset(pAllocations, 0, sizeof(VmaAllocation) * allocationCount);\n    }\n\n    return res;\n}\n\nVkResult VmaAllocator_T::AllocateDedicatedMemoryPage(\n    VmaPool pool,\n    VkDeviceSize size,\n    VmaSuballocationType suballocType,\n    uint32_t memTypeIndex,\n    const VkMemoryAllocateInfo& allocInfo,\n    bool map,\n    bool isUserDataString,\n    bool isMappingAllowed,\n    void* pUserData,\n    VmaAllocation* pAllocation)\n{\n    VkDeviceMemory hMemory = VK_NULL_HANDLE;\n    VkResult res = AllocateVulkanMemory(&allocInfo, &hMemory);\n    if(res < 0)\n    {\n        VMA_DEBUG_LOG(\"    vkAllocateMemory FAILED\");\n        return res;\n    }\n\n    void* pMappedData = VMA_NULL;\n    if(map)\n    {\n        res = (*m_VulkanFunctions.vkMapMemory)(\n            m_hDevice,\n            hMemory,\n            0,\n            VK_WHOLE_SIZE,\n            0,\n            &pMappedData);\n        if(res < 0)\n        {\n            VMA_DEBUG_LOG(\"    vkMapMemory FAILED\");\n            FreeVulkanMemory(memTypeIndex, size, hMemory);\n            return res;\n        }\n    }\n\n    *pAllocation = m_AllocationObjectAllocator.Allocate(isMappingAllowed);\n    (*pAllocation)->InitDedicatedAllocation(this, pool, memTypeIndex, hMemory, suballocType, pMappedData, size);\n    if (isUserDataString)\n        (*pAllocation)->SetName(this, (const char*)pUserData);\n    else\n        (*pAllocation)->SetUserData(this, pUserData);\n    m_Budget.AddAllocation(MemoryTypeIndexToHeapIndex(memTypeIndex), size);\n    if(VMA_DEBUG_INITIALIZE_ALLOCATIONS)\n    {\n        FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);\n    }\n\n    return VK_SUCCESS;\n}\n\nvoid VmaAllocator_T::GetBufferMemoryRequirements(\n    VkBuffer hBuffer,\n    VkMemoryRequirements& memReq,\n    bool& requiresDedicatedAllocation,\n    bool& prefersDedicatedAllocation) const\n{\n#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000\n    if(m_UseKhrDedicatedAllocation || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))\n    {\n        VkBufferMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR };\n        memReqInfo.buffer = hBuffer;\n\n        VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };\n\n        VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };\n        VmaPnextChainPushFront(&memReq2, &memDedicatedReq);\n\n        (*m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR)(m_hDevice, &memReqInfo, &memReq2);\n\n        memReq = memReq2.memoryRequirements;\n        requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);\n        prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);\n    }\n    else\n#endif // #if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000\n    {\n        (*m_VulkanFunctions.vkGetBufferMemoryRequirements)(m_hDevice, hBuffer, &memReq);\n        requiresDedicatedAllocation = false;\n        prefersDedicatedAllocation  = false;\n    }\n}\n\nvoid VmaAllocator_T::GetImageMemoryRequirements(\n    VkImage hImage,\n    VkMemoryRequirements& memReq,\n    bool& requiresDedicatedAllocation,\n    bool& prefersDedicatedAllocation) const\n{\n#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000\n    if(m_UseKhrDedicatedAllocation || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))\n    {\n        VkImageMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR };\n        memReqInfo.image = hImage;\n\n        VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };\n\n        VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };\n        VmaPnextChainPushFront(&memReq2, &memDedicatedReq);\n\n        (*m_VulkanFunctions.vkGetImageMemoryRequirements2KHR)(m_hDevice, &memReqInfo, &memReq2);\n\n        memReq = memReq2.memoryRequirements;\n        requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);\n        prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);\n    }\n    else\n#endif // #if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000\n    {\n        (*m_VulkanFunctions.vkGetImageMemoryRequirements)(m_hDevice, hImage, &memReq);\n        requiresDedicatedAllocation = false;\n        prefersDedicatedAllocation  = false;\n    }\n}\n\nVkResult VmaAllocator_T::FindMemoryTypeIndex(\n    uint32_t memoryTypeBits,\n    const VmaAllocationCreateInfo* pAllocationCreateInfo,\n    VmaBufferImageUsage bufImgUsage,\n    uint32_t* pMemoryTypeIndex) const\n{\n    memoryTypeBits &= GetGlobalMemoryTypeBits();\n\n    if(pAllocationCreateInfo->memoryTypeBits != 0)\n    {\n        memoryTypeBits &= pAllocationCreateInfo->memoryTypeBits;\n    }\n\n    VkMemoryPropertyFlags requiredFlags = 0, preferredFlags = 0, notPreferredFlags = 0;\n    if(!FindMemoryPreferences(\n        IsIntegratedGpu(),\n        *pAllocationCreateInfo,\n        bufImgUsage,\n        requiredFlags, preferredFlags, notPreferredFlags))\n    {\n        return VK_ERROR_FEATURE_NOT_PRESENT;\n    }\n\n    *pMemoryTypeIndex = UINT32_MAX;\n    uint32_t minCost = UINT32_MAX;\n    for(uint32_t memTypeIndex = 0, memTypeBit = 1;\n        memTypeIndex < GetMemoryTypeCount();\n        ++memTypeIndex, memTypeBit <<= 1)\n    {\n        // This memory type is acceptable according to memoryTypeBits bitmask.\n        if((memTypeBit & memoryTypeBits) != 0)\n        {\n            const VkMemoryPropertyFlags currFlags =\n                m_MemProps.memoryTypes[memTypeIndex].propertyFlags;\n            // This memory type contains requiredFlags.\n            if((requiredFlags & ~currFlags) == 0)\n            {\n                // Calculate cost as number of bits from preferredFlags not present in this memory type.\n                uint32_t currCost = VMA_COUNT_BITS_SET(preferredFlags & ~currFlags) +\n                    VMA_COUNT_BITS_SET(currFlags & notPreferredFlags);\n                // Remember memory type with lowest cost.\n                if(currCost < minCost)\n                {\n                    *pMemoryTypeIndex = memTypeIndex;\n                    if(currCost == 0)\n                    {\n                        return VK_SUCCESS;\n                    }\n                    minCost = currCost;\n                }\n            }\n        }\n    }\n    return (*pMemoryTypeIndex != UINT32_MAX) ? VK_SUCCESS : VK_ERROR_FEATURE_NOT_PRESENT;\n}\n\nVkResult VmaAllocator_T::CalcMemTypeParams(\n    VmaAllocationCreateInfo& inoutCreateInfo,\n    uint32_t memTypeIndex,\n    VkDeviceSize size,\n    size_t allocationCount)\n{\n    // If memory type is not HOST_VISIBLE, disable MAPPED.\n    if((inoutCreateInfo.flags & VMA_ALLOCATION_CREATE_MAPPED_BIT) != 0 &&\n        (m_MemProps.memoryTypes[memTypeIndex].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)\n    {\n        inoutCreateInfo.flags &= ~VMA_ALLOCATION_CREATE_MAPPED_BIT;\n    }\n\n    if((inoutCreateInfo.flags & VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT) != 0 &&\n        (inoutCreateInfo.flags & VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT) != 0)\n    {\n        const uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);\n        VmaBudget heapBudget = {};\n        GetHeapBudgets(&heapBudget, heapIndex, 1);\n        if(heapBudget.usage + size * allocationCount > heapBudget.budget)\n        {\n            return VK_ERROR_OUT_OF_DEVICE_MEMORY;\n        }\n    }\n    return VK_SUCCESS;\n}\n\nVkResult VmaAllocator_T::CalcAllocationParams(\n    VmaAllocationCreateInfo& inoutCreateInfo,\n    bool dedicatedRequired,\n    bool dedicatedPreferred)\n{\n    VMA_ASSERT((inoutCreateInfo.flags &\n        (VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT)) !=\n        (VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT) &&\n        \"Specifying both flags VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT and VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT is incorrect.\");\n    VMA_ASSERT((((inoutCreateInfo.flags & VMA_ALLOCATION_CREATE_HOST_ACCESS_ALLOW_TRANSFER_INSTEAD_BIT) == 0 ||\n        (inoutCreateInfo.flags & (VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT)) != 0)) &&\n        \"Specifying VMA_ALLOCATION_CREATE_HOST_ACCESS_ALLOW_TRANSFER_INSTEAD_BIT requires also VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT or VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT.\");\n    if(inoutCreateInfo.usage == VMA_MEMORY_USAGE_AUTO || inoutCreateInfo.usage == VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE || inoutCreateInfo.usage == VMA_MEMORY_USAGE_AUTO_PREFER_HOST)\n    {\n        if((inoutCreateInfo.flags & VMA_ALLOCATION_CREATE_MAPPED_BIT) != 0)\n        {\n            VMA_ASSERT((inoutCreateInfo.flags & (VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT)) != 0 &&\n                \"When using VMA_ALLOCATION_CREATE_MAPPED_BIT and usage = VMA_MEMORY_USAGE_AUTO*, you must also specify VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT or VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT.\");\n        }\n    }\n\n    // If memory is lazily allocated, it should be always dedicated.\n    if(dedicatedRequired ||\n        inoutCreateInfo.usage == VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED)\n    {\n        inoutCreateInfo.flags |= VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT;\n    }\n\n    if(inoutCreateInfo.pool != VK_NULL_HANDLE)\n    {\n        if(inoutCreateInfo.pool->m_BlockVector.HasExplicitBlockSize() &&\n            (inoutCreateInfo.flags & VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT) != 0)\n        {\n            VMA_ASSERT(0 && \"Specifying VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT while current custom pool doesn't support dedicated allocations.\");\n            return VK_ERROR_FEATURE_NOT_PRESENT;\n        }\n        inoutCreateInfo.priority = inoutCreateInfo.pool->m_BlockVector.GetPriority();\n    }\n\n    if((inoutCreateInfo.flags & VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT) != 0 &&\n        (inoutCreateInfo.flags & VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT) != 0)\n    {\n        VMA_ASSERT(0 && \"Specifying VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT together with VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT makes no sense.\");\n        return VK_ERROR_FEATURE_NOT_PRESENT;\n    }\n\n    if(VMA_DEBUG_ALWAYS_DEDICATED_MEMORY &&\n        (inoutCreateInfo.flags & VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT) != 0)\n    {\n        inoutCreateInfo.flags |= VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT;\n    }\n\n    // Non-auto USAGE values imply HOST_ACCESS flags.\n    // And so does VMA_MEMORY_USAGE_UNKNOWN because it is used with custom pools.\n    // Which specific flag is used doesn't matter. They change things only when used with VMA_MEMORY_USAGE_AUTO*.\n    // Otherwise they just protect from assert on mapping.\n    if(inoutCreateInfo.usage != VMA_MEMORY_USAGE_AUTO &&\n        inoutCreateInfo.usage != VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE &&\n        inoutCreateInfo.usage != VMA_MEMORY_USAGE_AUTO_PREFER_HOST)\n    {\n        if((inoutCreateInfo.flags & (VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT)) == 0)\n        {\n            inoutCreateInfo.flags |= VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT;\n        }\n    }\n\n    return VK_SUCCESS;\n}\n\nVkResult VmaAllocator_T::AllocateMemory(\n    const VkMemoryRequirements& vkMemReq,\n    bool requiresDedicatedAllocation,\n    bool prefersDedicatedAllocation,\n    VkBuffer dedicatedBuffer,\n    VkImage dedicatedImage,\n    VmaBufferImageUsage dedicatedBufferImageUsage,\n    const VmaAllocationCreateInfo& createInfo,\n    VmaSuballocationType suballocType,\n    size_t allocationCount,\n    VmaAllocation* pAllocations)\n{\n    memset(pAllocations, 0, sizeof(VmaAllocation) * allocationCount);\n\n    VMA_ASSERT(VmaIsPow2(vkMemReq.alignment));\n\n    if(vkMemReq.size == 0)\n    {\n        return VK_ERROR_INITIALIZATION_FAILED;\n    }\n\n    VmaAllocationCreateInfo createInfoFinal = createInfo;\n    VkResult res = CalcAllocationParams(createInfoFinal, requiresDedicatedAllocation, prefersDedicatedAllocation);\n    if(res != VK_SUCCESS)\n        return res;\n\n    if(createInfoFinal.pool != VK_NULL_HANDLE)\n    {\n        VmaBlockVector& blockVector = createInfoFinal.pool->m_BlockVector;\n        return AllocateMemoryOfType(\n            createInfoFinal.pool,\n            vkMemReq.size,\n            vkMemReq.alignment,\n            prefersDedicatedAllocation,\n            dedicatedBuffer,\n            dedicatedImage,\n            dedicatedBufferImageUsage,\n            createInfoFinal,\n            blockVector.GetMemoryTypeIndex(),\n            suballocType,\n            createInfoFinal.pool->m_DedicatedAllocations,\n            blockVector,\n            allocationCount,\n            pAllocations);\n    }\n    else\n    {\n        // Bit mask of memory Vulkan types acceptable for this allocation.\n        uint32_t memoryTypeBits = vkMemReq.memoryTypeBits;\n        uint32_t memTypeIndex = UINT32_MAX;\n        res = FindMemoryTypeIndex(memoryTypeBits, &createInfoFinal, dedicatedBufferImageUsage, &memTypeIndex);\n        // Can't find any single memory type matching requirements. res is VK_ERROR_FEATURE_NOT_PRESENT.\n        if(res != VK_SUCCESS)\n            return res;\n        do\n        {\n            VmaBlockVector* blockVector = m_pBlockVectors[memTypeIndex];\n            VMA_ASSERT(blockVector && \"Trying to use unsupported memory type!\");\n            res = AllocateMemoryOfType(\n                VK_NULL_HANDLE,\n                vkMemReq.size,\n                vkMemReq.alignment,\n                requiresDedicatedAllocation || prefersDedicatedAllocation,\n                dedicatedBuffer,\n                dedicatedImage,\n                dedicatedBufferImageUsage,\n                createInfoFinal,\n                memTypeIndex,\n                suballocType,\n                m_DedicatedAllocations[memTypeIndex],\n                *blockVector,\n                allocationCount,\n                pAllocations);\n            // Allocation succeeded\n            if(res == VK_SUCCESS)\n                return VK_SUCCESS;\n\n            // Remove old memTypeIndex from list of possibilities.\n            memoryTypeBits &= ~(1u << memTypeIndex);\n            // Find alternative memTypeIndex.\n            res = FindMemoryTypeIndex(memoryTypeBits, &createInfoFinal, dedicatedBufferImageUsage, &memTypeIndex);\n        } while(res == VK_SUCCESS);\n\n        // No other matching memory type index could be found.\n        // Not returning res, which is VK_ERROR_FEATURE_NOT_PRESENT, because we already failed to allocate once.\n        return VK_ERROR_OUT_OF_DEVICE_MEMORY;\n    }\n}\n\nvoid VmaAllocator_T::FreeMemory(\n    size_t allocationCount,\n    const VmaAllocation* pAllocations)\n{\n    VMA_ASSERT(pAllocations);\n\n    for(size_t allocIndex = allocationCount; allocIndex--; )\n    {\n        VmaAllocation allocation = pAllocations[allocIndex];\n\n        if(allocation != VK_NULL_HANDLE)\n        {\n            if(VMA_DEBUG_INITIALIZE_ALLOCATIONS)\n            {\n                FillAllocation(allocation, VMA_ALLOCATION_FILL_PATTERN_DESTROYED);\n            }\n\n            switch(allocation->GetType())\n            {\n            case VmaAllocation_T::ALLOCATION_TYPE_BLOCK:\n                {\n                    VmaBlockVector* pBlockVector = VMA_NULL;\n                    VmaPool hPool = allocation->GetParentPool();\n                    if(hPool != VK_NULL_HANDLE)\n                    {\n                        pBlockVector = &hPool->m_BlockVector;\n                    }\n                    else\n                    {\n                        const uint32_t memTypeIndex = allocation->GetMemoryTypeIndex();\n                        pBlockVector = m_pBlockVectors[memTypeIndex];\n                        VMA_ASSERT(pBlockVector && \"Trying to free memory of unsupported type!\");\n                    }\n                    pBlockVector->Free(allocation);\n                }\n                break;\n            case VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:\n                FreeDedicatedMemory(allocation);\n                break;\n            default:\n                VMA_ASSERT(0);\n            }\n        }\n    }\n}\n\nvoid VmaAllocator_T::CalculateStatistics(VmaTotalStatistics* pStats)\n{\n    // Initialize.\n    VmaClearDetailedStatistics(pStats->total);\n    for(uint32_t i = 0; i < VK_MAX_MEMORY_TYPES; ++i)\n        VmaClearDetailedStatistics(pStats->memoryType[i]);\n    for(uint32_t i = 0; i < VK_MAX_MEMORY_HEAPS; ++i)\n        VmaClearDetailedStatistics(pStats->memoryHeap[i]);\n\n    // Process default pools.\n    for(uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)\n    {\n        VmaBlockVector* const pBlockVector = m_pBlockVectors[memTypeIndex];\n        if (pBlockVector != VMA_NULL)\n            pBlockVector->AddDetailedStatistics(pStats->memoryType[memTypeIndex]);\n    }\n\n    // Process custom pools.\n    {\n        VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);\n        for(VmaPool pool = m_Pools.Front(); pool != VMA_NULL; pool = m_Pools.GetNext(pool))\n        {\n            VmaBlockVector& blockVector = pool->m_BlockVector;\n            const uint32_t memTypeIndex = blockVector.GetMemoryTypeIndex();\n            blockVector.AddDetailedStatistics(pStats->memoryType[memTypeIndex]);\n            pool->m_DedicatedAllocations.AddDetailedStatistics(pStats->memoryType[memTypeIndex]);\n        }\n    }\n\n    // Process dedicated allocations.\n    for(uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)\n    {\n        m_DedicatedAllocations[memTypeIndex].AddDetailedStatistics(pStats->memoryType[memTypeIndex]);\n    }\n\n    // Sum from memory types to memory heaps.\n    for(uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)\n    {\n        const uint32_t memHeapIndex = m_MemProps.memoryTypes[memTypeIndex].heapIndex;\n        VmaAddDetailedStatistics(pStats->memoryHeap[memHeapIndex], pStats->memoryType[memTypeIndex]);\n    }\n\n    // Sum from memory heaps to total.\n    for(uint32_t memHeapIndex = 0; memHeapIndex < GetMemoryHeapCount(); ++memHeapIndex)\n        VmaAddDetailedStatistics(pStats->total, pStats->memoryHeap[memHeapIndex]);\n\n    VMA_ASSERT(pStats->total.statistics.allocationCount == 0 ||\n        pStats->total.allocationSizeMax >= pStats->total.allocationSizeMin);\n    VMA_ASSERT(pStats->total.unusedRangeCount == 0 ||\n        pStats->total.unusedRangeSizeMax >= pStats->total.unusedRangeSizeMin);\n}\n\nvoid VmaAllocator_T::GetHeapBudgets(VmaBudget* outBudgets, uint32_t firstHeap, uint32_t heapCount)\n{\n#if VMA_MEMORY_BUDGET\n    if(m_UseExtMemoryBudget)\n    {\n        if(m_Budget.m_OperationsSinceBudgetFetch < 30)\n        {\n            VmaMutexLockRead lockRead(m_Budget.m_BudgetMutex, m_UseMutex);\n            for(uint32_t i = 0; i < heapCount; ++i, ++outBudgets)\n            {\n                const uint32_t heapIndex = firstHeap + i;\n\n                outBudgets->statistics.blockCount = m_Budget.m_BlockCount[heapIndex];\n                outBudgets->statistics.allocationCount = m_Budget.m_AllocationCount[heapIndex];\n                outBudgets->statistics.blockBytes = m_Budget.m_BlockBytes[heapIndex];\n                outBudgets->statistics.allocationBytes = m_Budget.m_AllocationBytes[heapIndex];\n\n                if(m_Budget.m_VulkanUsage[heapIndex] + outBudgets->statistics.blockBytes > m_Budget.m_BlockBytesAtBudgetFetch[heapIndex])\n                {\n                    outBudgets->usage = m_Budget.m_VulkanUsage[heapIndex] +\n                        outBudgets->statistics.blockBytes - m_Budget.m_BlockBytesAtBudgetFetch[heapIndex];\n                }\n                else\n                {\n                    outBudgets->usage = 0;\n                }\n\n                // Have to take MIN with heap size because explicit HeapSizeLimit is included in it.\n                outBudgets->budget = VMA_MIN(\n                    m_Budget.m_VulkanBudget[heapIndex], m_MemProps.memoryHeaps[heapIndex].size);\n            }\n        }\n        else\n        {\n            UpdateVulkanBudget(); // Outside of mutex lock\n            GetHeapBudgets(outBudgets, firstHeap, heapCount); // Recursion\n        }\n    }\n    else\n#endif\n    {\n        for(uint32_t i = 0; i < heapCount; ++i, ++outBudgets)\n        {\n            const uint32_t heapIndex = firstHeap + i;\n\n            outBudgets->statistics.blockCount = m_Budget.m_BlockCount[heapIndex];\n            outBudgets->statistics.allocationCount = m_Budget.m_AllocationCount[heapIndex];\n            outBudgets->statistics.blockBytes = m_Budget.m_BlockBytes[heapIndex];\n            outBudgets->statistics.allocationBytes = m_Budget.m_AllocationBytes[heapIndex];\n\n            outBudgets->usage = outBudgets->statistics.blockBytes;\n            outBudgets->budget = m_MemProps.memoryHeaps[heapIndex].size * 8 / 10; // 80% heuristics.\n        }\n    }\n}\n\nvoid VmaAllocator_T::GetAllocationInfo(VmaAllocation hAllocation, VmaAllocationInfo* pAllocationInfo)\n{\n    pAllocationInfo->memoryType = hAllocation->GetMemoryTypeIndex();\n    pAllocationInfo->deviceMemory = hAllocation->GetMemory();\n    pAllocationInfo->offset = hAllocation->GetOffset();\n    pAllocationInfo->size = hAllocation->GetSize();\n    pAllocationInfo->pMappedData = hAllocation->GetMappedData();\n    pAllocationInfo->pUserData = hAllocation->GetUserData();\n    pAllocationInfo->pName = hAllocation->GetName();\n}\n\nvoid VmaAllocator_T::GetAllocationInfo2(VmaAllocation hAllocation, VmaAllocationInfo2* pAllocationInfo)\n{\n    GetAllocationInfo(hAllocation, &pAllocationInfo->allocationInfo);\n\n    switch (hAllocation->GetType())\n    {\n    case VmaAllocation_T::ALLOCATION_TYPE_BLOCK:\n        pAllocationInfo->blockSize = hAllocation->GetBlock()->m_pMetadata->GetSize();\n        pAllocationInfo->dedicatedMemory = VK_FALSE;\n        break;\n    case VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:\n        pAllocationInfo->blockSize = pAllocationInfo->allocationInfo.size;\n        pAllocationInfo->dedicatedMemory = VK_TRUE;\n        break;\n    default:\n        VMA_ASSERT(0);\n    }\n}\n\nVkResult VmaAllocator_T::CreatePool(const VmaPoolCreateInfo* pCreateInfo, VmaPool* pPool)\n{\n    VMA_DEBUG_LOG_FORMAT(\"  CreatePool: MemoryTypeIndex=%\" PRIu32 \", flags=%\" PRIu32, pCreateInfo->memoryTypeIndex, pCreateInfo->flags);\n\n    VmaPoolCreateInfo newCreateInfo = *pCreateInfo;\n\n    // Protection against uninitialized new structure member. If garbage data are left there, this pointer dereference would crash.\n    if(pCreateInfo->pMemoryAllocateNext)\n    {\n        VMA_ASSERT(((const VkBaseInStructure*)pCreateInfo->pMemoryAllocateNext)->sType != 0);\n    }\n\n    if(newCreateInfo.maxBlockCount == 0)\n    {\n        newCreateInfo.maxBlockCount = SIZE_MAX;\n    }\n    if(newCreateInfo.minBlockCount > newCreateInfo.maxBlockCount)\n    {\n        return VK_ERROR_INITIALIZATION_FAILED;\n    }\n    // Memory type index out of range or forbidden.\n    if(pCreateInfo->memoryTypeIndex >= GetMemoryTypeCount() ||\n        ((1u << pCreateInfo->memoryTypeIndex) & m_GlobalMemoryTypeBits) == 0)\n    {\n        return VK_ERROR_FEATURE_NOT_PRESENT;\n    }\n    if(newCreateInfo.minAllocationAlignment > 0)\n    {\n        VMA_ASSERT(VmaIsPow2(newCreateInfo.minAllocationAlignment));\n    }\n\n    const VkDeviceSize preferredBlockSize = CalcPreferredBlockSize(newCreateInfo.memoryTypeIndex);\n\n    *pPool = vma_new(this, VmaPool_T)(this, newCreateInfo, preferredBlockSize);\n\n    VkResult res = (*pPool)->m_BlockVector.CreateMinBlocks();\n    if(res != VK_SUCCESS)\n    {\n        vma_delete(this, *pPool);\n        *pPool = VMA_NULL;\n        return res;\n    }\n\n    // Add to m_Pools.\n    {\n        VmaMutexLockWrite lock(m_PoolsMutex, m_UseMutex);\n        (*pPool)->SetId(m_NextPoolId++);\n        m_Pools.PushBack(*pPool);\n    }\n\n    return VK_SUCCESS;\n}\n\nvoid VmaAllocator_T::DestroyPool(VmaPool pool)\n{\n    // Remove from m_Pools.\n    {\n        VmaMutexLockWrite lock(m_PoolsMutex, m_UseMutex);\n        m_Pools.Remove(pool);\n    }\n\n    vma_delete(this, pool);\n}\n\nvoid VmaAllocator_T::GetPoolStatistics(VmaPool pool, VmaStatistics* pPoolStats)\n{\n    VmaClearStatistics(*pPoolStats);\n    pool->m_BlockVector.AddStatistics(*pPoolStats);\n    pool->m_DedicatedAllocations.AddStatistics(*pPoolStats);\n}\n\nvoid VmaAllocator_T::CalculatePoolStatistics(VmaPool pool, VmaDetailedStatistics* pPoolStats)\n{\n    VmaClearDetailedStatistics(*pPoolStats);\n    pool->m_BlockVector.AddDetailedStatistics(*pPoolStats);\n    pool->m_DedicatedAllocations.AddDetailedStatistics(*pPoolStats);\n}\n\nvoid VmaAllocator_T::SetCurrentFrameIndex(uint32_t frameIndex)\n{\n    m_CurrentFrameIndex.store(frameIndex);\n\n#if VMA_MEMORY_BUDGET\n    if(m_UseExtMemoryBudget)\n    {\n        UpdateVulkanBudget();\n    }\n#endif // #if VMA_MEMORY_BUDGET\n}\n\nVkResult VmaAllocator_T::CheckPoolCorruption(VmaPool hPool)\n{\n    return hPool->m_BlockVector.CheckCorruption();\n}\n\nVkResult VmaAllocator_T::CheckCorruption(uint32_t memoryTypeBits)\n{\n    VkResult finalRes = VK_ERROR_FEATURE_NOT_PRESENT;\n\n    // Process default pools.\n    for(uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)\n    {\n        VmaBlockVector* const pBlockVector = m_pBlockVectors[memTypeIndex];\n        if(pBlockVector != VMA_NULL)\n        {\n            VkResult localRes = pBlockVector->CheckCorruption();\n            switch(localRes)\n            {\n            case VK_ERROR_FEATURE_NOT_PRESENT:\n                break;\n            case VK_SUCCESS:\n                finalRes = VK_SUCCESS;\n                break;\n            default:\n                return localRes;\n            }\n        }\n    }\n\n    // Process custom pools.\n    {\n        VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);\n        for(VmaPool pool = m_Pools.Front(); pool != VMA_NULL; pool = m_Pools.GetNext(pool))\n        {\n            if(((1u << pool->m_BlockVector.GetMemoryTypeIndex()) & memoryTypeBits) != 0)\n            {\n                VkResult localRes = pool->m_BlockVector.CheckCorruption();\n                switch(localRes)\n                {\n                case VK_ERROR_FEATURE_NOT_PRESENT:\n                    break;\n                case VK_SUCCESS:\n                    finalRes = VK_SUCCESS;\n                    break;\n                default:\n                    return localRes;\n                }\n            }\n        }\n    }\n\n    return finalRes;\n}\n\nVkResult VmaAllocator_T::AllocateVulkanMemory(const VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory)\n{\n    AtomicTransactionalIncrement<VMA_ATOMIC_UINT32> deviceMemoryCountIncrement;\n    const uint64_t prevDeviceMemoryCount = deviceMemoryCountIncrement.Increment(&m_DeviceMemoryCount);\n#if VMA_DEBUG_DONT_EXCEED_MAX_MEMORY_ALLOCATION_COUNT\n    if(prevDeviceMemoryCount >= m_PhysicalDeviceProperties.limits.maxMemoryAllocationCount)\n    {\n        return VK_ERROR_TOO_MANY_OBJECTS;\n    }\n#endif\n\n    const uint32_t heapIndex = MemoryTypeIndexToHeapIndex(pAllocateInfo->memoryTypeIndex);\n\n    // HeapSizeLimit is in effect for this heap.\n    if((m_HeapSizeLimitMask & (1u << heapIndex)) != 0)\n    {\n        const VkDeviceSize heapSize = m_MemProps.memoryHeaps[heapIndex].size;\n        VkDeviceSize blockBytes = m_Budget.m_BlockBytes[heapIndex];\n        for(;;)\n        {\n            const VkDeviceSize blockBytesAfterAllocation = blockBytes + pAllocateInfo->allocationSize;\n            if(blockBytesAfterAllocation > heapSize)\n            {\n                return VK_ERROR_OUT_OF_DEVICE_MEMORY;\n            }\n            if(m_Budget.m_BlockBytes[heapIndex].compare_exchange_strong(blockBytes, blockBytesAfterAllocation))\n            {\n                break;\n            }\n        }\n    }\n    else\n    {\n        m_Budget.m_BlockBytes[heapIndex] += pAllocateInfo->allocationSize;\n    }\n    ++m_Budget.m_BlockCount[heapIndex];\n\n    // VULKAN CALL vkAllocateMemory.\n    VkResult res = (*m_VulkanFunctions.vkAllocateMemory)(m_hDevice, pAllocateInfo, GetAllocationCallbacks(), pMemory);\n\n    if(res == VK_SUCCESS)\n    {\n#if VMA_MEMORY_BUDGET\n        ++m_Budget.m_OperationsSinceBudgetFetch;\n#endif\n\n        // Informative callback.\n        if(m_DeviceMemoryCallbacks.pfnAllocate != VMA_NULL)\n        {\n            (*m_DeviceMemoryCallbacks.pfnAllocate)(this, pAllocateInfo->memoryTypeIndex, *pMemory, pAllocateInfo->allocationSize, m_DeviceMemoryCallbacks.pUserData);\n        }\n\n        deviceMemoryCountIncrement.Commit();\n    }\n    else\n    {\n        --m_Budget.m_BlockCount[heapIndex];\n        m_Budget.m_BlockBytes[heapIndex] -= pAllocateInfo->allocationSize;\n    }\n\n    return res;\n}\n\nvoid VmaAllocator_T::FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory)\n{\n    // Informative callback.\n    if(m_DeviceMemoryCallbacks.pfnFree != VMA_NULL)\n    {\n        (*m_DeviceMemoryCallbacks.pfnFree)(this, memoryType, hMemory, size, m_DeviceMemoryCallbacks.pUserData);\n    }\n\n    // VULKAN CALL vkFreeMemory.\n    (*m_VulkanFunctions.vkFreeMemory)(m_hDevice, hMemory, GetAllocationCallbacks());\n\n    const uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memoryType);\n    --m_Budget.m_BlockCount[heapIndex];\n    m_Budget.m_BlockBytes[heapIndex] -= size;\n\n    --m_DeviceMemoryCount;\n}\n\nVkResult VmaAllocator_T::BindVulkanBuffer(\n    VkDeviceMemory memory,\n    VkDeviceSize memoryOffset,\n    VkBuffer buffer,\n    const void* pNext)\n{\n    if(pNext != VMA_NULL)\n    {\n#if VMA_VULKAN_VERSION >= 1001000 || VMA_BIND_MEMORY2\n        if((m_UseKhrBindMemory2 || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0)) &&\n            m_VulkanFunctions.vkBindBufferMemory2KHR != VMA_NULL)\n        {\n            VkBindBufferMemoryInfoKHR bindBufferMemoryInfo = { VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR };\n            bindBufferMemoryInfo.pNext = pNext;\n            bindBufferMemoryInfo.buffer = buffer;\n            bindBufferMemoryInfo.memory = memory;\n            bindBufferMemoryInfo.memoryOffset = memoryOffset;\n            return (*m_VulkanFunctions.vkBindBufferMemory2KHR)(m_hDevice, 1, &bindBufferMemoryInfo);\n        }\n        else\n#endif // #if VMA_VULKAN_VERSION >= 1001000 || VMA_BIND_MEMORY2\n        {\n            return VK_ERROR_EXTENSION_NOT_PRESENT;\n        }\n    }\n    else\n    {\n        return (*m_VulkanFunctions.vkBindBufferMemory)(m_hDevice, buffer, memory, memoryOffset);\n    }\n}\n\nVkResult VmaAllocator_T::BindVulkanImage(\n    VkDeviceMemory memory,\n    VkDeviceSize memoryOffset,\n    VkImage image,\n    const void* pNext)\n{\n    if(pNext != VMA_NULL)\n    {\n#if VMA_VULKAN_VERSION >= 1001000 || VMA_BIND_MEMORY2\n        if((m_UseKhrBindMemory2 || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0)) &&\n            m_VulkanFunctions.vkBindImageMemory2KHR != VMA_NULL)\n        {\n            VkBindImageMemoryInfoKHR bindBufferMemoryInfo = { VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR };\n            bindBufferMemoryInfo.pNext = pNext;\n            bindBufferMemoryInfo.image = image;\n            bindBufferMemoryInfo.memory = memory;\n            bindBufferMemoryInfo.memoryOffset = memoryOffset;\n            return (*m_VulkanFunctions.vkBindImageMemory2KHR)(m_hDevice, 1, &bindBufferMemoryInfo);\n        }\n        else\n#endif // #if VMA_BIND_MEMORY2\n        {\n            return VK_ERROR_EXTENSION_NOT_PRESENT;\n        }\n    }\n    else\n    {\n        return (*m_VulkanFunctions.vkBindImageMemory)(m_hDevice, image, memory, memoryOffset);\n    }\n}\n\nVkResult VmaAllocator_T::Map(VmaAllocation hAllocation, void** ppData)\n{\n    switch(hAllocation->GetType())\n    {\n    case VmaAllocation_T::ALLOCATION_TYPE_BLOCK:\n        {\n            VmaDeviceMemoryBlock* const pBlock = hAllocation->GetBlock();\n            char *pBytes = VMA_NULL;\n            VkResult res = pBlock->Map(this, 1, (void**)&pBytes);\n            if(res == VK_SUCCESS)\n            {\n                *ppData = pBytes + (ptrdiff_t)hAllocation->GetOffset();\n                hAllocation->BlockAllocMap();\n            }\n            return res;\n        }\n    case VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:\n        return hAllocation->DedicatedAllocMap(this, ppData);\n    default:\n        VMA_ASSERT(0);\n        return VK_ERROR_MEMORY_MAP_FAILED;\n    }\n}\n\nvoid VmaAllocator_T::Unmap(VmaAllocation hAllocation)\n{\n    switch(hAllocation->GetType())\n    {\n    case VmaAllocation_T::ALLOCATION_TYPE_BLOCK:\n        {\n            VmaDeviceMemoryBlock* const pBlock = hAllocation->GetBlock();\n            hAllocation->BlockAllocUnmap();\n            pBlock->Unmap(this, 1);\n        }\n        break;\n    case VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:\n        hAllocation->DedicatedAllocUnmap(this);\n        break;\n    default:\n        VMA_ASSERT(0);\n    }\n}\n\nVkResult VmaAllocator_T::BindBufferMemory(\n    VmaAllocation hAllocation,\n    VkDeviceSize allocationLocalOffset,\n    VkBuffer hBuffer,\n    const void* pNext)\n{\n    VkResult res = VK_ERROR_UNKNOWN_COPY;\n    switch(hAllocation->GetType())\n    {\n    case VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:\n        res = BindVulkanBuffer(hAllocation->GetMemory(), allocationLocalOffset, hBuffer, pNext);\n        break;\n    case VmaAllocation_T::ALLOCATION_TYPE_BLOCK:\n    {\n        VmaDeviceMemoryBlock* const pBlock = hAllocation->GetBlock();\n        VMA_ASSERT(pBlock && \"Binding buffer to allocation that doesn't belong to any block.\");\n        res = pBlock->BindBufferMemory(this, hAllocation, allocationLocalOffset, hBuffer, pNext);\n        break;\n    }\n    default:\n        VMA_ASSERT(0);\n    }\n    return res;\n}\n\nVkResult VmaAllocator_T::BindImageMemory(\n    VmaAllocation hAllocation,\n    VkDeviceSize allocationLocalOffset,\n    VkImage hImage,\n    const void* pNext)\n{\n    VkResult res = VK_ERROR_UNKNOWN_COPY;\n    switch(hAllocation->GetType())\n    {\n    case VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:\n        res = BindVulkanImage(hAllocation->GetMemory(), allocationLocalOffset, hImage, pNext);\n        break;\n    case VmaAllocation_T::ALLOCATION_TYPE_BLOCK:\n    {\n        VmaDeviceMemoryBlock* pBlock = hAllocation->GetBlock();\n        VMA_ASSERT(pBlock && \"Binding image to allocation that doesn't belong to any block.\");\n        res = pBlock->BindImageMemory(this, hAllocation, allocationLocalOffset, hImage, pNext);\n        break;\n    }\n    default:\n        VMA_ASSERT(0);\n    }\n    return res;\n}\n\nVkResult VmaAllocator_T::FlushOrInvalidateAllocation(\n    VmaAllocation hAllocation,\n    VkDeviceSize offset, VkDeviceSize size,\n    VMA_CACHE_OPERATION op)\n{\n    VkResult res = VK_SUCCESS;\n\n    VkMappedMemoryRange memRange = {};\n    if(GetFlushOrInvalidateRange(hAllocation, offset, size, memRange))\n    {\n        switch(op)\n        {\n        case VMA_CACHE_FLUSH:\n            res = (*GetVulkanFunctions().vkFlushMappedMemoryRanges)(m_hDevice, 1, &memRange);\n            break;\n        case VMA_CACHE_INVALIDATE:\n            res = (*GetVulkanFunctions().vkInvalidateMappedMemoryRanges)(m_hDevice, 1, &memRange);\n            break;\n        default:\n            VMA_ASSERT(0);\n        }\n    }\n    // else: Just ignore this call.\n    return res;\n}\n\nVkResult VmaAllocator_T::FlushOrInvalidateAllocations(\n    uint32_t allocationCount,\n    const VmaAllocation* allocations,\n    const VkDeviceSize* offsets, const VkDeviceSize* sizes,\n    VMA_CACHE_OPERATION op)\n{\n    typedef VmaStlAllocator<VkMappedMemoryRange> RangeAllocator;\n    typedef VmaSmallVector<VkMappedMemoryRange, RangeAllocator, 16> RangeVector;\n    RangeVector ranges = RangeVector(RangeAllocator(GetAllocationCallbacks()));\n\n    for(uint32_t allocIndex = 0; allocIndex < allocationCount; ++allocIndex)\n    {\n        const VmaAllocation alloc = allocations[allocIndex];\n        const VkDeviceSize offset = offsets != VMA_NULL ? offsets[allocIndex] : 0;\n        const VkDeviceSize size = sizes != VMA_NULL ? sizes[allocIndex] : VK_WHOLE_SIZE;\n        VkMappedMemoryRange newRange;\n        if(GetFlushOrInvalidateRange(alloc, offset, size, newRange))\n        {\n            ranges.push_back(newRange);\n        }\n    }\n\n    VkResult res = VK_SUCCESS;\n    if(!ranges.empty())\n    {\n        switch(op)\n        {\n        case VMA_CACHE_FLUSH:\n            res = (*GetVulkanFunctions().vkFlushMappedMemoryRanges)(m_hDevice, (uint32_t)ranges.size(), ranges.data());\n            break;\n        case VMA_CACHE_INVALIDATE:\n            res = (*GetVulkanFunctions().vkInvalidateMappedMemoryRanges)(m_hDevice, (uint32_t)ranges.size(), ranges.data());\n            break;\n        default:\n            VMA_ASSERT(0);\n        }\n    }\n    // else: Just ignore this call.\n    return res;\n}\n\nVkResult VmaAllocator_T::CopyMemoryToAllocation(\n    const void* pSrcHostPointer,\n    VmaAllocation dstAllocation,\n    VkDeviceSize dstAllocationLocalOffset,\n    VkDeviceSize size)\n{\n    void* dstMappedData = VMA_NULL;\n    VkResult res = Map(dstAllocation, &dstMappedData);\n    if(res == VK_SUCCESS)\n    {\n        memcpy((char*)dstMappedData + dstAllocationLocalOffset, pSrcHostPointer, (size_t)size);\n        Unmap(dstAllocation);\n        res = FlushOrInvalidateAllocation(dstAllocation, dstAllocationLocalOffset, size, VMA_CACHE_FLUSH);\n    }\n    return res;\n}\n\nVkResult VmaAllocator_T::CopyAllocationToMemory(\n    VmaAllocation srcAllocation,\n    VkDeviceSize srcAllocationLocalOffset,\n    void* pDstHostPointer,\n    VkDeviceSize size)\n{\n    void* srcMappedData = VMA_NULL;\n    VkResult res = Map(srcAllocation, &srcMappedData);\n    if(res == VK_SUCCESS)\n    {\n        res = FlushOrInvalidateAllocation(srcAllocation, srcAllocationLocalOffset, size, VMA_CACHE_INVALIDATE);\n        if(res == VK_SUCCESS)\n        {\n            memcpy(pDstHostPointer, (const char*)srcMappedData + srcAllocationLocalOffset, (size_t)size);\n            Unmap(srcAllocation);\n        }\n    }\n    return res;\n}\n\nvoid VmaAllocator_T::FreeDedicatedMemory(const VmaAllocation allocation)\n{\n    VMA_ASSERT(allocation && allocation->GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);\n\n    const uint32_t memTypeIndex = allocation->GetMemoryTypeIndex();\n    VmaPool parentPool = allocation->GetParentPool();\n    if(parentPool == VK_NULL_HANDLE)\n    {\n        // Default pool\n        m_DedicatedAllocations[memTypeIndex].Unregister(allocation);\n    }\n    else\n    {\n        // Custom pool\n        parentPool->m_DedicatedAllocations.Unregister(allocation);\n    }\n\n    VkDeviceMemory hMemory = allocation->GetMemory();\n\n    /*\n    There is no need to call this, because Vulkan spec allows to skip vkUnmapMemory\n    before vkFreeMemory.\n\n    if(allocation->GetMappedData() != VMA_NULL)\n    {\n        (*m_VulkanFunctions.vkUnmapMemory)(m_hDevice, hMemory);\n    }\n    */\n\n    FreeVulkanMemory(memTypeIndex, allocation->GetSize(), hMemory);\n\n    m_Budget.RemoveAllocation(MemoryTypeIndexToHeapIndex(allocation->GetMemoryTypeIndex()), allocation->GetSize());\n    allocation->Destroy(this);\n    m_AllocationObjectAllocator.Free(allocation);\n\n    VMA_DEBUG_LOG_FORMAT(\"    Freed DedicatedMemory MemoryTypeIndex=%\" PRIu32, memTypeIndex);\n}\n\nuint32_t VmaAllocator_T::CalculateGpuDefragmentationMemoryTypeBits() const\n{\n    VkBufferCreateInfo dummyBufCreateInfo;\n    VmaFillGpuDefragmentationBufferCreateInfo(dummyBufCreateInfo);\n\n    uint32_t memoryTypeBits = 0;\n\n    // Create buffer.\n    VkBuffer buf = VK_NULL_HANDLE;\n    VkResult res = (*GetVulkanFunctions().vkCreateBuffer)(\n        m_hDevice, &dummyBufCreateInfo, GetAllocationCallbacks(), &buf);\n    if(res == VK_SUCCESS)\n    {\n        // Query for supported memory types.\n        VkMemoryRequirements memReq;\n        (*GetVulkanFunctions().vkGetBufferMemoryRequirements)(m_hDevice, buf, &memReq);\n        memoryTypeBits = memReq.memoryTypeBits;\n\n        // Destroy buffer.\n        (*GetVulkanFunctions().vkDestroyBuffer)(m_hDevice, buf, GetAllocationCallbacks());\n    }\n\n    return memoryTypeBits;\n}\n\nuint32_t VmaAllocator_T::CalculateGlobalMemoryTypeBits() const\n{\n    // Make sure memory information is already fetched.\n    VMA_ASSERT(GetMemoryTypeCount() > 0);\n\n    uint32_t memoryTypeBits = UINT32_MAX;\n\n    if(!m_UseAmdDeviceCoherentMemory)\n    {\n        // Exclude memory types that have VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD.\n        for(uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)\n        {\n            if((m_MemProps.memoryTypes[memTypeIndex].propertyFlags & VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD_COPY) != 0)\n            {\n                memoryTypeBits &= ~(1u << memTypeIndex);\n            }\n        }\n    }\n\n    return memoryTypeBits;\n}\n\nbool VmaAllocator_T::GetFlushOrInvalidateRange(\n    VmaAllocation allocation,\n    VkDeviceSize offset, VkDeviceSize size,\n    VkMappedMemoryRange& outRange) const\n{\n    const uint32_t memTypeIndex = allocation->GetMemoryTypeIndex();\n    if(size > 0 && IsMemoryTypeNonCoherent(memTypeIndex))\n    {\n        const VkDeviceSize nonCoherentAtomSize = m_PhysicalDeviceProperties.limits.nonCoherentAtomSize;\n        const VkDeviceSize allocationSize = allocation->GetSize();\n        VMA_ASSERT(offset <= allocationSize);\n\n        outRange.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;\n        outRange.pNext = VMA_NULL;\n        outRange.memory = allocation->GetMemory();\n\n        switch(allocation->GetType())\n        {\n        case VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:\n            outRange.offset = VmaAlignDown(offset, nonCoherentAtomSize);\n            if(size == VK_WHOLE_SIZE)\n            {\n                outRange.size = allocationSize - outRange.offset;\n            }\n            else\n            {\n                VMA_ASSERT(offset + size <= allocationSize);\n                outRange.size = VMA_MIN(\n                    VmaAlignUp(size + (offset - outRange.offset), nonCoherentAtomSize),\n                    allocationSize - outRange.offset);\n            }\n            break;\n        case VmaAllocation_T::ALLOCATION_TYPE_BLOCK:\n        {\n            // 1. Still within this allocation.\n            outRange.offset = VmaAlignDown(offset, nonCoherentAtomSize);\n            if(size == VK_WHOLE_SIZE)\n            {\n                size = allocationSize - offset;\n            }\n            else\n            {\n                VMA_ASSERT(offset + size <= allocationSize);\n            }\n            outRange.size = VmaAlignUp(size + (offset - outRange.offset), nonCoherentAtomSize);\n\n            // 2. Adjust to whole block.\n            const VkDeviceSize allocationOffset = allocation->GetOffset();\n            VMA_ASSERT(allocationOffset % nonCoherentAtomSize == 0);\n            const VkDeviceSize blockSize = allocation->GetBlock()->m_pMetadata->GetSize();\n            outRange.offset += allocationOffset;\n            outRange.size = VMA_MIN(outRange.size, blockSize - outRange.offset);\n\n            break;\n        }\n        default:\n            VMA_ASSERT(0);\n        }\n        return true;\n    }\n    return false;\n}\n\n#if VMA_MEMORY_BUDGET\nvoid VmaAllocator_T::UpdateVulkanBudget()\n{\n    VMA_ASSERT(m_UseExtMemoryBudget);\n\n    VkPhysicalDeviceMemoryProperties2KHR memProps = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR };\n\n    VkPhysicalDeviceMemoryBudgetPropertiesEXT budgetProps = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT };\n    VmaPnextChainPushFront(&memProps, &budgetProps);\n\n    GetVulkanFunctions().vkGetPhysicalDeviceMemoryProperties2KHR(m_PhysicalDevice, &memProps);\n\n    {\n        VmaMutexLockWrite lockWrite(m_Budget.m_BudgetMutex, m_UseMutex);\n\n        for(uint32_t heapIndex = 0; heapIndex < GetMemoryHeapCount(); ++heapIndex)\n        {\n            m_Budget.m_VulkanUsage[heapIndex] = budgetProps.heapUsage[heapIndex];\n            m_Budget.m_VulkanBudget[heapIndex] = budgetProps.heapBudget[heapIndex];\n            m_Budget.m_BlockBytesAtBudgetFetch[heapIndex] = m_Budget.m_BlockBytes[heapIndex].load();\n\n            // Some bugged drivers return the budget incorrectly, e.g. 0 or much bigger than heap size.\n            if(m_Budget.m_VulkanBudget[heapIndex] == 0)\n            {\n                m_Budget.m_VulkanBudget[heapIndex] = m_MemProps.memoryHeaps[heapIndex].size * 8 / 10; // 80% heuristics.\n            }\n            else if(m_Budget.m_VulkanBudget[heapIndex] > m_MemProps.memoryHeaps[heapIndex].size)\n            {\n                m_Budget.m_VulkanBudget[heapIndex] = m_MemProps.memoryHeaps[heapIndex].size;\n            }\n            if(m_Budget.m_VulkanUsage[heapIndex] == 0 && m_Budget.m_BlockBytesAtBudgetFetch[heapIndex] > 0)\n            {\n                m_Budget.m_VulkanUsage[heapIndex] = m_Budget.m_BlockBytesAtBudgetFetch[heapIndex];\n            }\n        }\n        m_Budget.m_OperationsSinceBudgetFetch = 0;\n    }\n}\n#endif // VMA_MEMORY_BUDGET\n\nvoid VmaAllocator_T::FillAllocation(const VmaAllocation hAllocation, uint8_t pattern)\n{\n    if(VMA_DEBUG_INITIALIZE_ALLOCATIONS &&\n        hAllocation->IsMappingAllowed() &&\n        (m_MemProps.memoryTypes[hAllocation->GetMemoryTypeIndex()].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)\n    {\n        void* pData = VMA_NULL;\n        VkResult res = Map(hAllocation, &pData);\n        if(res == VK_SUCCESS)\n        {\n            memset(pData, (int)pattern, (size_t)hAllocation->GetSize());\n            FlushOrInvalidateAllocation(hAllocation, 0, VK_WHOLE_SIZE, VMA_CACHE_FLUSH);\n            Unmap(hAllocation);\n        }\n        else\n        {\n            VMA_ASSERT(0 && \"VMA_DEBUG_INITIALIZE_ALLOCATIONS is enabled, but couldn't map memory to fill allocation.\");\n        }\n    }\n}\n\nuint32_t VmaAllocator_T::GetGpuDefragmentationMemoryTypeBits()\n{\n    uint32_t memoryTypeBits = m_GpuDefragmentationMemoryTypeBits.load();\n    if(memoryTypeBits == UINT32_MAX)\n    {\n        memoryTypeBits = CalculateGpuDefragmentationMemoryTypeBits();\n        m_GpuDefragmentationMemoryTypeBits.store(memoryTypeBits);\n    }\n    return memoryTypeBits;\n}\n\n#if VMA_STATS_STRING_ENABLED\nvoid VmaAllocator_T::PrintDetailedMap(VmaJsonWriter& json)\n{\n    json.WriteString(\"DefaultPools\");\n    json.BeginObject();\n    {\n        for (uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)\n        {\n            VmaBlockVector* pBlockVector = m_pBlockVectors[memTypeIndex];\n            VmaDedicatedAllocationList& dedicatedAllocList = m_DedicatedAllocations[memTypeIndex];\n            if (pBlockVector != VMA_NULL)\n            {\n                json.BeginString(\"Type \");\n                json.ContinueString(memTypeIndex);\n                json.EndString();\n                json.BeginObject();\n                {\n                    json.WriteString(\"PreferredBlockSize\");\n                    json.WriteNumber(pBlockVector->GetPreferredBlockSize());\n\n                    json.WriteString(\"Blocks\");\n                    pBlockVector->PrintDetailedMap(json);\n\n                    json.WriteString(\"DedicatedAllocations\");\n                    dedicatedAllocList.BuildStatsString(json);\n                }\n                json.EndObject();\n            }\n        }\n    }\n    json.EndObject();\n\n    json.WriteString(\"CustomPools\");\n    json.BeginObject();\n    {\n        VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);\n        if (!m_Pools.IsEmpty())\n        {\n            for (uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)\n            {\n                bool displayType = true;\n                size_t index = 0;\n                for (VmaPool pool = m_Pools.Front(); pool != VMA_NULL; pool = m_Pools.GetNext(pool))\n                {\n                    VmaBlockVector& blockVector = pool->m_BlockVector;\n                    if (blockVector.GetMemoryTypeIndex() == memTypeIndex)\n                    {\n                        if (displayType)\n                        {\n                            json.BeginString(\"Type \");\n                            json.ContinueString(memTypeIndex);\n                            json.EndString();\n                            json.BeginArray();\n                            displayType = false;\n                        }\n\n                        json.BeginObject();\n                        {\n                            json.WriteString(\"Name\");\n                            json.BeginString();\n                            json.ContinueString((uint64_t)index++);\n                            if (pool->GetName())\n                            {\n                                json.ContinueString(\" - \");\n                                json.ContinueString(pool->GetName());\n                            }\n                            json.EndString();\n\n                            json.WriteString(\"PreferredBlockSize\");\n                            json.WriteNumber(blockVector.GetPreferredBlockSize());\n\n                            json.WriteString(\"Blocks\");\n                            blockVector.PrintDetailedMap(json);\n\n                            json.WriteString(\"DedicatedAllocations\");\n                            pool->m_DedicatedAllocations.BuildStatsString(json);\n                        }\n                        json.EndObject();\n                    }\n                }\n\n                if (!displayType)\n                    json.EndArray();\n            }\n        }\n    }\n    json.EndObject();\n}\n#endif // VMA_STATS_STRING_ENABLED\n#endif // _VMA_ALLOCATOR_T_FUNCTIONS\n\n\n#ifndef _VMA_PUBLIC_INTERFACE\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateAllocator(\n    const VmaAllocatorCreateInfo* pCreateInfo,\n    VmaAllocator* pAllocator)\n{\n    VMA_ASSERT(pCreateInfo && pAllocator);\n    VMA_ASSERT(pCreateInfo->vulkanApiVersion == 0 ||\n        (VK_VERSION_MAJOR(pCreateInfo->vulkanApiVersion) == 1 && VK_VERSION_MINOR(pCreateInfo->vulkanApiVersion) <= 4));\n    VMA_DEBUG_LOG(\"vmaCreateAllocator\");\n    *pAllocator = vma_new(pCreateInfo->pAllocationCallbacks, VmaAllocator_T)(pCreateInfo);\n    VkResult result = (*pAllocator)->Init(pCreateInfo);\n    if(result < 0)\n    {\n        vma_delete(pCreateInfo->pAllocationCallbacks, *pAllocator);\n        *pAllocator = VK_NULL_HANDLE;\n    }\n    return result;\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaDestroyAllocator(\n    VmaAllocator allocator)\n{\n    if(allocator != VK_NULL_HANDLE)\n    {\n        VMA_DEBUG_LOG(\"vmaDestroyAllocator\");\n        VkAllocationCallbacks allocationCallbacks = allocator->m_AllocationCallbacks; // Have to copy the callbacks when destroying.\n        vma_delete(&allocationCallbacks, allocator);\n    }\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaGetAllocatorInfo(VmaAllocator allocator, VmaAllocatorInfo* pAllocatorInfo)\n{\n    VMA_ASSERT(allocator && pAllocatorInfo);\n    pAllocatorInfo->instance = allocator->m_hInstance;\n    pAllocatorInfo->physicalDevice = allocator->GetPhysicalDevice();\n    pAllocatorInfo->device = allocator->m_hDevice;\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaGetPhysicalDeviceProperties(\n    VmaAllocator allocator,\n    const VkPhysicalDeviceProperties **ppPhysicalDeviceProperties)\n{\n    VMA_ASSERT(allocator && ppPhysicalDeviceProperties);\n    *ppPhysicalDeviceProperties = &allocator->m_PhysicalDeviceProperties;\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaGetMemoryProperties(\n    VmaAllocator allocator,\n    const VkPhysicalDeviceMemoryProperties** ppPhysicalDeviceMemoryProperties)\n{\n    VMA_ASSERT(allocator && ppPhysicalDeviceMemoryProperties);\n    *ppPhysicalDeviceMemoryProperties = &allocator->m_MemProps;\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaGetMemoryTypeProperties(\n    VmaAllocator allocator,\n    uint32_t memoryTypeIndex,\n    VkMemoryPropertyFlags* pFlags)\n{\n    VMA_ASSERT(allocator && pFlags);\n    VMA_ASSERT(memoryTypeIndex < allocator->GetMemoryTypeCount());\n    *pFlags = allocator->m_MemProps.memoryTypes[memoryTypeIndex].propertyFlags;\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaSetCurrentFrameIndex(\n    VmaAllocator allocator,\n    uint32_t frameIndex)\n{\n    VMA_ASSERT(allocator);\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    allocator->SetCurrentFrameIndex(frameIndex);\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaCalculateStatistics(\n    VmaAllocator allocator,\n    VmaTotalStatistics* pStats)\n{\n    VMA_ASSERT(allocator && pStats);\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n    allocator->CalculateStatistics(pStats);\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaGetHeapBudgets(\n    VmaAllocator allocator,\n    VmaBudget* pBudgets)\n{\n    VMA_ASSERT(allocator && pBudgets);\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n    allocator->GetHeapBudgets(pBudgets, 0, allocator->GetMemoryHeapCount());\n}\n\n#if VMA_STATS_STRING_ENABLED\n\nVMA_CALL_PRE void VMA_CALL_POST vmaBuildStatsString(\n    VmaAllocator allocator,\n    char** ppStatsString,\n    VkBool32 detailedMap)\n{\n    VMA_ASSERT(allocator && ppStatsString);\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    VmaStringBuilder sb(allocator->GetAllocationCallbacks());\n    {\n        VmaBudget budgets[VK_MAX_MEMORY_HEAPS];\n        allocator->GetHeapBudgets(budgets, 0, allocator->GetMemoryHeapCount());\n\n        VmaTotalStatistics stats;\n        allocator->CalculateStatistics(&stats);\n\n        VmaJsonWriter json(allocator->GetAllocationCallbacks(), sb);\n        json.BeginObject();\n        {\n            json.WriteString(\"General\");\n            json.BeginObject();\n            {\n                const VkPhysicalDeviceProperties& deviceProperties = allocator->m_PhysicalDeviceProperties;\n                const VkPhysicalDeviceMemoryProperties& memoryProperties = allocator->m_MemProps;\n\n                json.WriteString(\"API\");\n                json.WriteString(\"Vulkan\");\n\n                json.WriteString(\"apiVersion\");\n                json.BeginString();\n                json.ContinueString(VK_VERSION_MAJOR(deviceProperties.apiVersion));\n                json.ContinueString(\".\");\n                json.ContinueString(VK_VERSION_MINOR(deviceProperties.apiVersion));\n                json.ContinueString(\".\");\n                json.ContinueString(VK_VERSION_PATCH(deviceProperties.apiVersion));\n                json.EndString();\n\n                json.WriteString(\"GPU\");\n                json.WriteString(deviceProperties.deviceName);\n                json.WriteString(\"deviceType\");\n                json.WriteNumber(static_cast<uint32_t>(deviceProperties.deviceType));\n\n                json.WriteString(\"maxMemoryAllocationCount\");\n                json.WriteNumber(deviceProperties.limits.maxMemoryAllocationCount);\n                json.WriteString(\"bufferImageGranularity\");\n                json.WriteNumber(deviceProperties.limits.bufferImageGranularity);\n                json.WriteString(\"nonCoherentAtomSize\");\n                json.WriteNumber(deviceProperties.limits.nonCoherentAtomSize);\n\n                json.WriteString(\"memoryHeapCount\");\n                json.WriteNumber(memoryProperties.memoryHeapCount);\n                json.WriteString(\"memoryTypeCount\");\n                json.WriteNumber(memoryProperties.memoryTypeCount);\n            }\n            json.EndObject();\n        }\n        {\n            json.WriteString(\"Total\");\n            VmaPrintDetailedStatistics(json, stats.total);\n        }\n        {\n            json.WriteString(\"MemoryInfo\");\n            json.BeginObject();\n            {\n                for (uint32_t heapIndex = 0; heapIndex < allocator->GetMemoryHeapCount(); ++heapIndex)\n                {\n                    json.BeginString(\"Heap \");\n                    json.ContinueString(heapIndex);\n                    json.EndString();\n                    json.BeginObject();\n                    {\n                        const VkMemoryHeap& heapInfo = allocator->m_MemProps.memoryHeaps[heapIndex];\n                        json.WriteString(\"Flags\");\n                        json.BeginArray(true);\n                        {\n                            if (heapInfo.flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT)\n                                json.WriteString(\"DEVICE_LOCAL\");\n                        #if VMA_VULKAN_VERSION >= 1001000\n                            if (heapInfo.flags & VK_MEMORY_HEAP_MULTI_INSTANCE_BIT)\n                                json.WriteString(\"MULTI_INSTANCE\");\n                        #endif\n\n                            VkMemoryHeapFlags flags = heapInfo.flags &\n                                ~(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT\n                        #if VMA_VULKAN_VERSION >= 1001000\n                                    | VK_MEMORY_HEAP_MULTI_INSTANCE_BIT\n                        #endif\n                                    );\n                            if (flags != 0)\n                                json.WriteNumber(flags);\n                        }\n                        json.EndArray();\n\n                        json.WriteString(\"Size\");\n                        json.WriteNumber(heapInfo.size);\n\n                        json.WriteString(\"Budget\");\n                        json.BeginObject();\n                        {\n                            json.WriteString(\"BudgetBytes\");\n                            json.WriteNumber(budgets[heapIndex].budget);\n                            json.WriteString(\"UsageBytes\");\n                            json.WriteNumber(budgets[heapIndex].usage);\n                        }\n                        json.EndObject();\n\n                        json.WriteString(\"Stats\");\n                        VmaPrintDetailedStatistics(json, stats.memoryHeap[heapIndex]);\n\n                        json.WriteString(\"MemoryPools\");\n                        json.BeginObject();\n                        {\n                            for (uint32_t typeIndex = 0; typeIndex < allocator->GetMemoryTypeCount(); ++typeIndex)\n                            {\n                                if (allocator->MemoryTypeIndexToHeapIndex(typeIndex) == heapIndex)\n                                {\n                                    json.BeginString(\"Type \");\n                                    json.ContinueString(typeIndex);\n                                    json.EndString();\n                                    json.BeginObject();\n                                    {\n                                        json.WriteString(\"Flags\");\n                                        json.BeginArray(true);\n                                        {\n                                            VkMemoryPropertyFlags flags = allocator->m_MemProps.memoryTypes[typeIndex].propertyFlags;\n                                            if (flags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)\n                                                json.WriteString(\"DEVICE_LOCAL\");\n                                            if (flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)\n                                                json.WriteString(\"HOST_VISIBLE\");\n                                            if (flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)\n                                                json.WriteString(\"HOST_COHERENT\");\n                                            if (flags & VK_MEMORY_PROPERTY_HOST_CACHED_BIT)\n                                                json.WriteString(\"HOST_CACHED\");\n                                            if (flags & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT)\n                                                json.WriteString(\"LAZILY_ALLOCATED\");\n                                        #if VMA_VULKAN_VERSION >= 1001000\n                                            if (flags & VK_MEMORY_PROPERTY_PROTECTED_BIT)\n                                                json.WriteString(\"PROTECTED\");\n                                        #endif\n                                        #if VK_AMD_device_coherent_memory\n                                            if (flags & VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD_COPY)\n                                                json.WriteString(\"DEVICE_COHERENT_AMD\");\n                                            if (flags & VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD_COPY)\n                                                json.WriteString(\"DEVICE_UNCACHED_AMD\");\n                                        #endif\n\n                                            flags &= ~(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT\n                                        #if VMA_VULKAN_VERSION >= 1001000\n                                                | VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT\n                                        #endif\n                                        #if VK_AMD_device_coherent_memory\n                                                | VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD_COPY\n                                                | VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD_COPY\n                                        #endif\n                                                | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT\n                                                | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT\n                                                | VK_MEMORY_PROPERTY_HOST_CACHED_BIT);\n                                            if (flags != 0)\n                                                json.WriteNumber(flags);\n                                        }\n                                        json.EndArray();\n\n                                        json.WriteString(\"Stats\");\n                                        VmaPrintDetailedStatistics(json, stats.memoryType[typeIndex]);\n                                    }\n                                    json.EndObject();\n                                }\n                            }\n\n                        }\n                        json.EndObject();\n                    }\n                    json.EndObject();\n                }\n            }\n            json.EndObject();\n        }\n\n        if (detailedMap == VK_TRUE)\n            allocator->PrintDetailedMap(json);\n\n        json.EndObject();\n    }\n\n    *ppStatsString = VmaCreateStringCopy(allocator->GetAllocationCallbacks(), sb.GetData(), sb.GetLength());\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaFreeStatsString(\n    VmaAllocator allocator,\n    char* pStatsString)\n{\n    if(pStatsString != VMA_NULL)\n    {\n        VMA_ASSERT(allocator);\n        VmaFreeString(allocator->GetAllocationCallbacks(), pStatsString);\n    }\n}\n\n#endif // VMA_STATS_STRING_ENABLED\n\n/*\nThis function is not protected by any mutex because it just reads immutable data.\n*/\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaFindMemoryTypeIndex(\n    VmaAllocator allocator,\n    uint32_t memoryTypeBits,\n    const VmaAllocationCreateInfo* pAllocationCreateInfo,\n    uint32_t* pMemoryTypeIndex)\n{\n    VMA_ASSERT(allocator != VK_NULL_HANDLE);\n    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);\n    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);\n\n    return allocator->FindMemoryTypeIndex(memoryTypeBits, pAllocationCreateInfo, VmaBufferImageUsage::UNKNOWN, pMemoryTypeIndex);\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaFindMemoryTypeIndexForBufferInfo(\n    VmaAllocator allocator,\n    const VkBufferCreateInfo* pBufferCreateInfo,\n    const VmaAllocationCreateInfo* pAllocationCreateInfo,\n    uint32_t* pMemoryTypeIndex)\n{\n    VMA_ASSERT(allocator != VK_NULL_HANDLE);\n    VMA_ASSERT(pBufferCreateInfo != VMA_NULL);\n    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);\n    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);\n\n    const VkDevice hDev = allocator->m_hDevice;\n    const VmaVulkanFunctions* funcs = &allocator->GetVulkanFunctions();\n    VkResult res;\n\n#if VMA_KHR_MAINTENANCE4 || VMA_VULKAN_VERSION >= 1003000\n    if(funcs->vkGetDeviceBufferMemoryRequirements)\n    {\n        // Can query straight from VkBufferCreateInfo :)\n        VkDeviceBufferMemoryRequirementsKHR devBufMemReq = {VK_STRUCTURE_TYPE_DEVICE_BUFFER_MEMORY_REQUIREMENTS_KHR};\n        devBufMemReq.pCreateInfo = pBufferCreateInfo;\n\n        VkMemoryRequirements2 memReq = {VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2};\n        (*funcs->vkGetDeviceBufferMemoryRequirements)(hDev, &devBufMemReq, &memReq);\n\n        res = allocator->FindMemoryTypeIndex(\n            memReq.memoryRequirements.memoryTypeBits, pAllocationCreateInfo,\n            VmaBufferImageUsage(*pBufferCreateInfo, allocator->m_UseKhrMaintenance5), pMemoryTypeIndex);\n    }\n    else\n#endif // VMA_KHR_MAINTENANCE4 || VMA_VULKAN_VERSION >= 1003000\n    {\n        // Must create a dummy buffer to query :(\n        VkBuffer hBuffer = VK_NULL_HANDLE;\n        res = funcs->vkCreateBuffer(\n            hDev, pBufferCreateInfo, allocator->GetAllocationCallbacks(), &hBuffer);\n        if(res == VK_SUCCESS)\n        {\n            VkMemoryRequirements memReq = {};\n            funcs->vkGetBufferMemoryRequirements(hDev, hBuffer, &memReq);\n\n            res = allocator->FindMemoryTypeIndex(\n                memReq.memoryTypeBits, pAllocationCreateInfo,\n                VmaBufferImageUsage(*pBufferCreateInfo, allocator->m_UseKhrMaintenance5), pMemoryTypeIndex);\n\n            funcs->vkDestroyBuffer(\n                hDev, hBuffer, allocator->GetAllocationCallbacks());\n        }\n    }\n    return res;\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaFindMemoryTypeIndexForImageInfo(\n    VmaAllocator allocator,\n    const VkImageCreateInfo* pImageCreateInfo,\n    const VmaAllocationCreateInfo* pAllocationCreateInfo,\n    uint32_t* pMemoryTypeIndex)\n{\n    VMA_ASSERT(allocator != VK_NULL_HANDLE);\n    VMA_ASSERT(pImageCreateInfo != VMA_NULL);\n    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);\n    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);\n\n    const VkDevice hDev = allocator->m_hDevice;\n    const VmaVulkanFunctions* funcs = &allocator->GetVulkanFunctions();\n    VkResult res;\n\n#if VMA_KHR_MAINTENANCE4 || VMA_VULKAN_VERSION >= 1003000\n    if(funcs->vkGetDeviceImageMemoryRequirements)\n    {\n        // Can query straight from VkImageCreateInfo :)\n        VkDeviceImageMemoryRequirementsKHR devImgMemReq = {VK_STRUCTURE_TYPE_DEVICE_IMAGE_MEMORY_REQUIREMENTS_KHR};\n        devImgMemReq.pCreateInfo = pImageCreateInfo;\n        VMA_ASSERT(pImageCreateInfo->tiling != VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT_COPY && (pImageCreateInfo->flags & VK_IMAGE_CREATE_DISJOINT_BIT_COPY) == 0 &&\n            \"Cannot use this VkImageCreateInfo with vmaFindMemoryTypeIndexForImageInfo as I don't know what to pass as VkDeviceImageMemoryRequirements::planeAspect.\");\n\n        VkMemoryRequirements2 memReq = {VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2};\n        (*funcs->vkGetDeviceImageMemoryRequirements)(hDev, &devImgMemReq, &memReq);\n\n        res = allocator->FindMemoryTypeIndex(\n            memReq.memoryRequirements.memoryTypeBits, pAllocationCreateInfo,\n            VmaBufferImageUsage(*pImageCreateInfo), pMemoryTypeIndex);\n    }\n    else\n#endif // VMA_KHR_MAINTENANCE4 || VMA_VULKAN_VERSION >= 1003000\n    {\n        // Must create a dummy image to query :(\n        VkImage hImage = VK_NULL_HANDLE;\n        res = funcs->vkCreateImage(\n            hDev, pImageCreateInfo, allocator->GetAllocationCallbacks(), &hImage);\n        if(res == VK_SUCCESS)\n        {\n            VkMemoryRequirements memReq = {};\n            funcs->vkGetImageMemoryRequirements(hDev, hImage, &memReq);\n\n            res = allocator->FindMemoryTypeIndex(\n                memReq.memoryTypeBits, pAllocationCreateInfo,\n                VmaBufferImageUsage(*pImageCreateInfo), pMemoryTypeIndex);\n\n            funcs->vkDestroyImage(\n                hDev, hImage, allocator->GetAllocationCallbacks());\n        }\n    }\n    return res;\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCreatePool(\n    VmaAllocator allocator,\n    const VmaPoolCreateInfo* pCreateInfo,\n    VmaPool* pPool)\n{\n    VMA_ASSERT(allocator && pCreateInfo && pPool);\n\n    VMA_DEBUG_LOG(\"vmaCreatePool\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    return allocator->CreatePool(pCreateInfo, pPool);\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaDestroyPool(\n    VmaAllocator allocator,\n    VmaPool pool)\n{\n    VMA_ASSERT(allocator);\n\n    if(pool == VK_NULL_HANDLE)\n    {\n        return;\n    }\n\n    VMA_DEBUG_LOG(\"vmaDestroyPool\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    allocator->DestroyPool(pool);\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaGetPoolStatistics(\n    VmaAllocator allocator,\n    VmaPool pool,\n    VmaStatistics* pPoolStats)\n{\n    VMA_ASSERT(allocator && pool && pPoolStats);\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    allocator->GetPoolStatistics(pool, pPoolStats);\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaCalculatePoolStatistics(\n    VmaAllocator allocator,\n    VmaPool pool,\n    VmaDetailedStatistics* pPoolStats)\n{\n    VMA_ASSERT(allocator && pool && pPoolStats);\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    allocator->CalculatePoolStatistics(pool, pPoolStats);\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCheckPoolCorruption(VmaAllocator allocator, VmaPool pool)\n{\n    VMA_ASSERT(allocator && pool);\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    VMA_DEBUG_LOG(\"vmaCheckPoolCorruption\");\n\n    return allocator->CheckPoolCorruption(pool);\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaGetPoolName(\n    VmaAllocator allocator,\n    VmaPool pool,\n    const char** ppName)\n{\n    VMA_ASSERT(allocator && pool && ppName);\n\n    VMA_DEBUG_LOG(\"vmaGetPoolName\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    *ppName = pool->GetName();\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaSetPoolName(\n    VmaAllocator allocator,\n    VmaPool pool,\n    const char* pName)\n{\n    VMA_ASSERT(allocator && pool);\n\n    VMA_DEBUG_LOG(\"vmaSetPoolName\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    pool->SetName(pName);\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaAllocateMemory(\n    VmaAllocator allocator,\n    const VkMemoryRequirements* pVkMemoryRequirements,\n    const VmaAllocationCreateInfo* pCreateInfo,\n    VmaAllocation* pAllocation,\n    VmaAllocationInfo* pAllocationInfo)\n{\n    VMA_ASSERT(allocator && pVkMemoryRequirements && pCreateInfo && pAllocation);\n\n    VMA_DEBUG_LOG(\"vmaAllocateMemory\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    VkResult result = allocator->AllocateMemory(\n        *pVkMemoryRequirements,\n        false, // requiresDedicatedAllocation\n        false, // prefersDedicatedAllocation\n        VK_NULL_HANDLE, // dedicatedBuffer\n        VK_NULL_HANDLE, // dedicatedImage\n        VmaBufferImageUsage::UNKNOWN, // dedicatedBufferImageUsage\n        *pCreateInfo,\n        VMA_SUBALLOCATION_TYPE_UNKNOWN,\n        1, // allocationCount\n        pAllocation);\n\n    if(pAllocationInfo != VMA_NULL && result == VK_SUCCESS)\n    {\n        allocator->GetAllocationInfo(*pAllocation, pAllocationInfo);\n    }\n\n    return result;\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaAllocateMemoryPages(\n    VmaAllocator allocator,\n    const VkMemoryRequirements* pVkMemoryRequirements,\n    const VmaAllocationCreateInfo* pCreateInfo,\n    size_t allocationCount,\n    VmaAllocation* pAllocations,\n    VmaAllocationInfo* pAllocationInfo)\n{\n    if(allocationCount == 0)\n    {\n        return VK_SUCCESS;\n    }\n\n    VMA_ASSERT(allocator && pVkMemoryRequirements && pCreateInfo && pAllocations);\n\n    VMA_DEBUG_LOG(\"vmaAllocateMemoryPages\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    VkResult result = allocator->AllocateMemory(\n        *pVkMemoryRequirements,\n        false, // requiresDedicatedAllocation\n        false, // prefersDedicatedAllocation\n        VK_NULL_HANDLE, // dedicatedBuffer\n        VK_NULL_HANDLE, // dedicatedImage\n        VmaBufferImageUsage::UNKNOWN, // dedicatedBufferImageUsage\n        *pCreateInfo,\n        VMA_SUBALLOCATION_TYPE_UNKNOWN,\n        allocationCount,\n        pAllocations);\n\n    if(pAllocationInfo != VMA_NULL && result == VK_SUCCESS)\n    {\n        for(size_t i = 0; i < allocationCount; ++i)\n        {\n            allocator->GetAllocationInfo(pAllocations[i], pAllocationInfo + i);\n        }\n    }\n\n    return result;\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaAllocateMemoryForBuffer(\n    VmaAllocator allocator,\n    VkBuffer buffer,\n    const VmaAllocationCreateInfo* pCreateInfo,\n    VmaAllocation* pAllocation,\n    VmaAllocationInfo* pAllocationInfo)\n{\n    VMA_ASSERT(allocator && buffer != VK_NULL_HANDLE && pCreateInfo && pAllocation);\n\n    VMA_DEBUG_LOG(\"vmaAllocateMemoryForBuffer\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    VkMemoryRequirements vkMemReq = {};\n    bool requiresDedicatedAllocation = false;\n    bool prefersDedicatedAllocation = false;\n    allocator->GetBufferMemoryRequirements(buffer, vkMemReq,\n        requiresDedicatedAllocation,\n        prefersDedicatedAllocation);\n\n    VkResult result = allocator->AllocateMemory(\n        vkMemReq,\n        requiresDedicatedAllocation,\n        prefersDedicatedAllocation,\n        buffer, // dedicatedBuffer\n        VK_NULL_HANDLE, // dedicatedImage\n        VmaBufferImageUsage::UNKNOWN, // dedicatedBufferImageUsage\n        *pCreateInfo,\n        VMA_SUBALLOCATION_TYPE_BUFFER,\n        1, // allocationCount\n        pAllocation);\n\n    if(pAllocationInfo && result == VK_SUCCESS)\n    {\n        allocator->GetAllocationInfo(*pAllocation, pAllocationInfo);\n    }\n\n    return result;\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaAllocateMemoryForImage(\n    VmaAllocator allocator,\n    VkImage image,\n    const VmaAllocationCreateInfo* pCreateInfo,\n    VmaAllocation* pAllocation,\n    VmaAllocationInfo* pAllocationInfo)\n{\n    VMA_ASSERT(allocator && image != VK_NULL_HANDLE && pCreateInfo && pAllocation);\n\n    VMA_DEBUG_LOG(\"vmaAllocateMemoryForImage\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    VkMemoryRequirements vkMemReq = {};\n    bool requiresDedicatedAllocation = false;\n    bool prefersDedicatedAllocation  = false;\n    allocator->GetImageMemoryRequirements(image, vkMemReq,\n        requiresDedicatedAllocation, prefersDedicatedAllocation);\n\n    VkResult result = allocator->AllocateMemory(\n        vkMemReq,\n        requiresDedicatedAllocation,\n        prefersDedicatedAllocation,\n        VK_NULL_HANDLE, // dedicatedBuffer\n        image, // dedicatedImage\n        VmaBufferImageUsage::UNKNOWN, // dedicatedBufferImageUsage\n        *pCreateInfo,\n        VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN,\n        1, // allocationCount\n        pAllocation);\n\n    if(pAllocationInfo && result == VK_SUCCESS)\n    {\n        allocator->GetAllocationInfo(*pAllocation, pAllocationInfo);\n    }\n\n    return result;\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaFreeMemory(\n    VmaAllocator allocator,\n    VmaAllocation allocation)\n{\n    VMA_ASSERT(allocator);\n\n    if(allocation == VK_NULL_HANDLE)\n    {\n        return;\n    }\n\n    VMA_DEBUG_LOG(\"vmaFreeMemory\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    allocator->FreeMemory(\n        1, // allocationCount\n        &allocation);\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaFreeMemoryPages(\n    VmaAllocator allocator,\n    size_t allocationCount,\n    const VmaAllocation* pAllocations)\n{\n    if(allocationCount == 0)\n    {\n        return;\n    }\n\n    VMA_ASSERT(allocator);\n\n    VMA_DEBUG_LOG(\"vmaFreeMemoryPages\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    allocator->FreeMemory(allocationCount, pAllocations);\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaGetAllocationInfo(\n    VmaAllocator allocator,\n    VmaAllocation allocation,\n    VmaAllocationInfo* pAllocationInfo)\n{\n    VMA_ASSERT(allocator && allocation && pAllocationInfo);\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    allocator->GetAllocationInfo(allocation, pAllocationInfo);\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaGetAllocationInfo2(\n    VmaAllocator allocator,\n    VmaAllocation allocation,\n    VmaAllocationInfo2* pAllocationInfo)\n{\n    VMA_ASSERT(allocator && allocation && pAllocationInfo);\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    allocator->GetAllocationInfo2(allocation, pAllocationInfo);\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaSetAllocationUserData(\n    VmaAllocator allocator,\n    VmaAllocation allocation,\n    void* pUserData)\n{\n    VMA_ASSERT(allocator && allocation);\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    allocation->SetUserData(allocator, pUserData);\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaSetAllocationName(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation,\n    const char* VMA_NULLABLE pName)\n{\n    allocation->SetName(allocator, pName);\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaGetAllocationMemoryProperties(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation,\n    VkMemoryPropertyFlags* VMA_NOT_NULL pFlags)\n{\n    VMA_ASSERT(allocator && allocation && pFlags);\n    const uint32_t memTypeIndex = allocation->GetMemoryTypeIndex();\n    *pFlags = allocator->m_MemProps.memoryTypes[memTypeIndex].propertyFlags;\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaMapMemory(\n    VmaAllocator allocator,\n    VmaAllocation allocation,\n    void** ppData)\n{\n    VMA_ASSERT(allocator && allocation && ppData);\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    return allocator->Map(allocation, ppData);\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaUnmapMemory(\n    VmaAllocator allocator,\n    VmaAllocation allocation)\n{\n    VMA_ASSERT(allocator && allocation);\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    allocator->Unmap(allocation);\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaFlushAllocation(\n    VmaAllocator allocator,\n    VmaAllocation allocation,\n    VkDeviceSize offset,\n    VkDeviceSize size)\n{\n    VMA_ASSERT(allocator && allocation);\n\n    VMA_DEBUG_LOG(\"vmaFlushAllocation\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    return allocator->FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_FLUSH);\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaInvalidateAllocation(\n    VmaAllocator allocator,\n    VmaAllocation allocation,\n    VkDeviceSize offset,\n    VkDeviceSize size)\n{\n    VMA_ASSERT(allocator && allocation);\n\n    VMA_DEBUG_LOG(\"vmaInvalidateAllocation\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    return allocator->FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_INVALIDATE);\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaFlushAllocations(\n    VmaAllocator allocator,\n    uint32_t allocationCount,\n    const VmaAllocation* allocations,\n    const VkDeviceSize* offsets,\n    const VkDeviceSize* sizes)\n{\n    VMA_ASSERT(allocator);\n\n    if(allocationCount == 0)\n    {\n        return VK_SUCCESS;\n    }\n\n    VMA_ASSERT(allocations);\n\n    VMA_DEBUG_LOG(\"vmaFlushAllocations\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    return allocator->FlushOrInvalidateAllocations(allocationCount, allocations, offsets, sizes, VMA_CACHE_FLUSH);\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaInvalidateAllocations(\n    VmaAllocator allocator,\n    uint32_t allocationCount,\n    const VmaAllocation* allocations,\n    const VkDeviceSize* offsets,\n    const VkDeviceSize* sizes)\n{\n    VMA_ASSERT(allocator);\n\n    if(allocationCount == 0)\n    {\n        return VK_SUCCESS;\n    }\n\n    VMA_ASSERT(allocations);\n\n    VMA_DEBUG_LOG(\"vmaInvalidateAllocations\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    return allocator->FlushOrInvalidateAllocations(allocationCount, allocations, offsets, sizes, VMA_CACHE_INVALIDATE);\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCopyMemoryToAllocation(\n    VmaAllocator allocator,\n    const void* pSrcHostPointer,\n    VmaAllocation dstAllocation,\n    VkDeviceSize dstAllocationLocalOffset,\n    VkDeviceSize size)\n{\n    VMA_ASSERT(allocator && pSrcHostPointer && dstAllocation);\n\n    if(size == 0)\n    {\n        return VK_SUCCESS;\n    }\n\n    VMA_DEBUG_LOG(\"vmaCopyMemoryToAllocation\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    return allocator->CopyMemoryToAllocation(pSrcHostPointer, dstAllocation, dstAllocationLocalOffset, size);\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCopyAllocationToMemory(\n    VmaAllocator allocator,\n    VmaAllocation srcAllocation,\n    VkDeviceSize srcAllocationLocalOffset,\n    void* pDstHostPointer,\n    VkDeviceSize size)\n{\n    VMA_ASSERT(allocator && srcAllocation && pDstHostPointer);\n\n    if(size == 0)\n    {\n        return VK_SUCCESS;\n    }\n\n    VMA_DEBUG_LOG(\"vmaCopyAllocationToMemory\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    return allocator->CopyAllocationToMemory(srcAllocation, srcAllocationLocalOffset, pDstHostPointer, size);\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCheckCorruption(\n    VmaAllocator allocator,\n    uint32_t memoryTypeBits)\n{\n    VMA_ASSERT(allocator);\n\n    VMA_DEBUG_LOG(\"vmaCheckCorruption\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    return allocator->CheckCorruption(memoryTypeBits);\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaBeginDefragmentation(\n    VmaAllocator allocator,\n    const VmaDefragmentationInfo* pInfo,\n    VmaDefragmentationContext* pContext)\n{\n    VMA_ASSERT(allocator && pInfo && pContext);\n\n    VMA_DEBUG_LOG(\"vmaBeginDefragmentation\");\n\n    if (pInfo->pool != VMA_NULL)\n    {\n        // Check if run on supported algorithms\n        if (pInfo->pool->m_BlockVector.GetAlgorithm() & VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT)\n            return VK_ERROR_FEATURE_NOT_PRESENT;\n    }\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    *pContext = vma_new(allocator, VmaDefragmentationContext_T)(allocator, *pInfo);\n    return VK_SUCCESS;\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaEndDefragmentation(\n    VmaAllocator allocator,\n    VmaDefragmentationContext context,\n    VmaDefragmentationStats* pStats)\n{\n    VMA_ASSERT(allocator && context);\n\n    VMA_DEBUG_LOG(\"vmaEndDefragmentation\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    if (pStats)\n        context->GetStats(*pStats);\n    vma_delete(allocator, context);\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaBeginDefragmentationPass(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaDefragmentationContext VMA_NOT_NULL context,\n    VmaDefragmentationPassMoveInfo* VMA_NOT_NULL pPassInfo)\n{\n    VMA_ASSERT(context && pPassInfo);\n\n    VMA_DEBUG_LOG(\"vmaBeginDefragmentationPass\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    return context->DefragmentPassBegin(*pPassInfo);\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaEndDefragmentationPass(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaDefragmentationContext VMA_NOT_NULL context,\n    VmaDefragmentationPassMoveInfo* VMA_NOT_NULL pPassInfo)\n{\n    VMA_ASSERT(context && pPassInfo);\n\n    VMA_DEBUG_LOG(\"vmaEndDefragmentationPass\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    return context->DefragmentPassEnd(*pPassInfo);\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaBindBufferMemory(\n    VmaAllocator allocator,\n    VmaAllocation allocation,\n    VkBuffer buffer)\n{\n    VMA_ASSERT(allocator && allocation && buffer);\n\n    VMA_DEBUG_LOG(\"vmaBindBufferMemory\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    return allocator->BindBufferMemory(allocation, 0, buffer, VMA_NULL);\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaBindBufferMemory2(\n    VmaAllocator allocator,\n    VmaAllocation allocation,\n    VkDeviceSize allocationLocalOffset,\n    VkBuffer buffer,\n    const void* pNext)\n{\n    VMA_ASSERT(allocator && allocation && buffer);\n\n    VMA_DEBUG_LOG(\"vmaBindBufferMemory2\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    return allocator->BindBufferMemory(allocation, allocationLocalOffset, buffer, pNext);\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaBindImageMemory(\n    VmaAllocator allocator,\n    VmaAllocation allocation,\n    VkImage image)\n{\n    VMA_ASSERT(allocator && allocation && image);\n\n    VMA_DEBUG_LOG(\"vmaBindImageMemory\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    return allocator->BindImageMemory(allocation, 0, image, VMA_NULL);\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaBindImageMemory2(\n    VmaAllocator allocator,\n    VmaAllocation allocation,\n    VkDeviceSize allocationLocalOffset,\n    VkImage image,\n    const void* pNext)\n{\n    VMA_ASSERT(allocator && allocation && image);\n\n    VMA_DEBUG_LOG(\"vmaBindImageMemory2\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n        return allocator->BindImageMemory(allocation, allocationLocalOffset, image, pNext);\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateBuffer(\n    VmaAllocator allocator,\n    const VkBufferCreateInfo* pBufferCreateInfo,\n    const VmaAllocationCreateInfo* pAllocationCreateInfo,\n    VkBuffer* pBuffer,\n    VmaAllocation* pAllocation,\n    VmaAllocationInfo* pAllocationInfo)\n{\n    VMA_ASSERT(allocator && pBufferCreateInfo && pAllocationCreateInfo && pBuffer && pAllocation);\n\n    if(pBufferCreateInfo->size == 0)\n    {\n        return VK_ERROR_INITIALIZATION_FAILED;\n    }\n    if((pBufferCreateInfo->usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_COPY) != 0 &&\n        !allocator->m_UseKhrBufferDeviceAddress)\n    {\n        VMA_ASSERT(0 && \"Creating a buffer with VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT is not valid if VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT was not used.\");\n        return VK_ERROR_INITIALIZATION_FAILED;\n    }\n\n    VMA_DEBUG_LOG(\"vmaCreateBuffer\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    *pBuffer = VK_NULL_HANDLE;\n    *pAllocation = VK_NULL_HANDLE;\n\n    // 1. Create VkBuffer.\n    VkResult res = (*allocator->GetVulkanFunctions().vkCreateBuffer)(\n        allocator->m_hDevice,\n        pBufferCreateInfo,\n        allocator->GetAllocationCallbacks(),\n        pBuffer);\n    if(res >= 0)\n    {\n        // 2. vkGetBufferMemoryRequirements.\n        VkMemoryRequirements vkMemReq = {};\n        bool requiresDedicatedAllocation = false;\n        bool prefersDedicatedAllocation  = false;\n        allocator->GetBufferMemoryRequirements(*pBuffer, vkMemReq,\n            requiresDedicatedAllocation, prefersDedicatedAllocation);\n\n        // 3. Allocate memory using allocator.\n        res = allocator->AllocateMemory(\n            vkMemReq,\n            requiresDedicatedAllocation,\n            prefersDedicatedAllocation,\n            *pBuffer, // dedicatedBuffer\n            VK_NULL_HANDLE, // dedicatedImage\n            VmaBufferImageUsage(*pBufferCreateInfo, allocator->m_UseKhrMaintenance5), // dedicatedBufferImageUsage\n            *pAllocationCreateInfo,\n            VMA_SUBALLOCATION_TYPE_BUFFER,\n            1, // allocationCount\n            pAllocation);\n\n        if(res >= 0)\n        {\n            // 3. Bind buffer with memory.\n            if((pAllocationCreateInfo->flags & VMA_ALLOCATION_CREATE_DONT_BIND_BIT) == 0)\n            {\n                res = allocator->BindBufferMemory(*pAllocation, 0, *pBuffer, VMA_NULL);\n            }\n            if(res >= 0)\n            {\n                // All steps succeeded.\n                #if VMA_STATS_STRING_ENABLED\n                    (*pAllocation)->InitBufferUsage(*pBufferCreateInfo, allocator->m_UseKhrMaintenance5);\n                #endif\n                if(pAllocationInfo != VMA_NULL)\n                {\n                    allocator->GetAllocationInfo(*pAllocation, pAllocationInfo);\n                }\n\n                return VK_SUCCESS;\n            }\n            allocator->FreeMemory(\n                1, // allocationCount\n                pAllocation);\n            *pAllocation = VK_NULL_HANDLE;\n            (*allocator->GetVulkanFunctions().vkDestroyBuffer)(allocator->m_hDevice, *pBuffer, allocator->GetAllocationCallbacks());\n            *pBuffer = VK_NULL_HANDLE;\n            return res;\n        }\n        (*allocator->GetVulkanFunctions().vkDestroyBuffer)(allocator->m_hDevice, *pBuffer, allocator->GetAllocationCallbacks());\n        *pBuffer = VK_NULL_HANDLE;\n        return res;\n    }\n    return res;\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateBufferWithAlignment(\n    VmaAllocator allocator,\n    const VkBufferCreateInfo* pBufferCreateInfo,\n    const VmaAllocationCreateInfo* pAllocationCreateInfo,\n    VkDeviceSize minAlignment,\n    VkBuffer* pBuffer,\n    VmaAllocation* pAllocation,\n    VmaAllocationInfo* pAllocationInfo)\n{\n    VMA_ASSERT(allocator && pBufferCreateInfo && pAllocationCreateInfo && VmaIsPow2(minAlignment) && pBuffer && pAllocation);\n\n    if(pBufferCreateInfo->size == 0)\n    {\n        return VK_ERROR_INITIALIZATION_FAILED;\n    }\n    if((pBufferCreateInfo->usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_COPY) != 0 &&\n        !allocator->m_UseKhrBufferDeviceAddress)\n    {\n        VMA_ASSERT(0 && \"Creating a buffer with VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT is not valid if VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT was not used.\");\n        return VK_ERROR_INITIALIZATION_FAILED;\n    }\n\n    VMA_DEBUG_LOG(\"vmaCreateBufferWithAlignment\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    *pBuffer = VK_NULL_HANDLE;\n    *pAllocation = VK_NULL_HANDLE;\n\n    // 1. Create VkBuffer.\n    VkResult res = (*allocator->GetVulkanFunctions().vkCreateBuffer)(\n        allocator->m_hDevice,\n        pBufferCreateInfo,\n        allocator->GetAllocationCallbacks(),\n        pBuffer);\n    if(res >= 0)\n    {\n        // 2. vkGetBufferMemoryRequirements.\n        VkMemoryRequirements vkMemReq = {};\n        bool requiresDedicatedAllocation = false;\n        bool prefersDedicatedAllocation  = false;\n        allocator->GetBufferMemoryRequirements(*pBuffer, vkMemReq,\n            requiresDedicatedAllocation, prefersDedicatedAllocation);\n\n        // 2a. Include minAlignment\n        vkMemReq.alignment = VMA_MAX(vkMemReq.alignment, minAlignment);\n\n        // 3. Allocate memory using allocator.\n        res = allocator->AllocateMemory(\n            vkMemReq,\n            requiresDedicatedAllocation,\n            prefersDedicatedAllocation,\n            *pBuffer, // dedicatedBuffer\n            VK_NULL_HANDLE, // dedicatedImage\n            VmaBufferImageUsage(*pBufferCreateInfo, allocator->m_UseKhrMaintenance5), // dedicatedBufferImageUsage\n            *pAllocationCreateInfo,\n            VMA_SUBALLOCATION_TYPE_BUFFER,\n            1, // allocationCount\n            pAllocation);\n\n        if(res >= 0)\n        {\n            // 3. Bind buffer with memory.\n            if((pAllocationCreateInfo->flags & VMA_ALLOCATION_CREATE_DONT_BIND_BIT) == 0)\n            {\n                res = allocator->BindBufferMemory(*pAllocation, 0, *pBuffer, VMA_NULL);\n            }\n            if(res >= 0)\n            {\n                // All steps succeeded.\n                #if VMA_STATS_STRING_ENABLED\n                    (*pAllocation)->InitBufferUsage(*pBufferCreateInfo, allocator->m_UseKhrMaintenance5);\n                #endif\n                if(pAllocationInfo != VMA_NULL)\n                {\n                    allocator->GetAllocationInfo(*pAllocation, pAllocationInfo);\n                }\n\n                return VK_SUCCESS;\n            }\n            allocator->FreeMemory(\n                1, // allocationCount\n                pAllocation);\n            *pAllocation = VK_NULL_HANDLE;\n            (*allocator->GetVulkanFunctions().vkDestroyBuffer)(allocator->m_hDevice, *pBuffer, allocator->GetAllocationCallbacks());\n            *pBuffer = VK_NULL_HANDLE;\n            return res;\n        }\n        (*allocator->GetVulkanFunctions().vkDestroyBuffer)(allocator->m_hDevice, *pBuffer, allocator->GetAllocationCallbacks());\n        *pBuffer = VK_NULL_HANDLE;\n        return res;\n    }\n    return res;\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateAliasingBuffer(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation,\n    const VkBufferCreateInfo* VMA_NOT_NULL pBufferCreateInfo,\n    VkBuffer VMA_NULLABLE_NON_DISPATCHABLE* VMA_NOT_NULL pBuffer)\n{\n    return vmaCreateAliasingBuffer2(allocator, allocation, 0, pBufferCreateInfo, pBuffer);\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateAliasingBuffer2(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation,\n    VkDeviceSize allocationLocalOffset,\n    const VkBufferCreateInfo* VMA_NOT_NULL pBufferCreateInfo,\n    VkBuffer VMA_NULLABLE_NON_DISPATCHABLE* VMA_NOT_NULL pBuffer)\n{\n    VMA_ASSERT(allocator && pBufferCreateInfo && pBuffer && allocation);\n    VMA_ASSERT(allocationLocalOffset + pBufferCreateInfo->size <= allocation->GetSize());\n\n    VMA_DEBUG_LOG(\"vmaCreateAliasingBuffer2\");\n\n    *pBuffer = VK_NULL_HANDLE;\n\n    if (pBufferCreateInfo->size == 0)\n    {\n        return VK_ERROR_INITIALIZATION_FAILED;\n    }\n    if ((pBufferCreateInfo->usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_COPY) != 0 &&\n        !allocator->m_UseKhrBufferDeviceAddress)\n    {\n        VMA_ASSERT(0 && \"Creating a buffer with VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT is not valid if VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT was not used.\");\n        return VK_ERROR_INITIALIZATION_FAILED;\n    }\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    // 1. Create VkBuffer.\n    VkResult res = (*allocator->GetVulkanFunctions().vkCreateBuffer)(\n        allocator->m_hDevice,\n        pBufferCreateInfo,\n        allocator->GetAllocationCallbacks(),\n        pBuffer);\n    if (res >= 0)\n    {\n        // 2. Bind buffer with memory.\n        res = allocator->BindBufferMemory(allocation, allocationLocalOffset, *pBuffer, VMA_NULL);\n        if (res >= 0)\n        {\n            return VK_SUCCESS;\n        }\n        (*allocator->GetVulkanFunctions().vkDestroyBuffer)(allocator->m_hDevice, *pBuffer, allocator->GetAllocationCallbacks());\n    }\n    return res;\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaDestroyBuffer(\n    VmaAllocator allocator,\n    VkBuffer buffer,\n    VmaAllocation allocation)\n{\n    VMA_ASSERT(allocator);\n\n    if(buffer == VK_NULL_HANDLE && allocation == VK_NULL_HANDLE)\n    {\n        return;\n    }\n\n    VMA_DEBUG_LOG(\"vmaDestroyBuffer\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    if(buffer != VK_NULL_HANDLE)\n    {\n        (*allocator->GetVulkanFunctions().vkDestroyBuffer)(allocator->m_hDevice, buffer, allocator->GetAllocationCallbacks());\n    }\n\n    if(allocation != VK_NULL_HANDLE)\n    {\n        allocator->FreeMemory(\n            1, // allocationCount\n            &allocation);\n    }\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateImage(\n    VmaAllocator allocator,\n    const VkImageCreateInfo* pImageCreateInfo,\n    const VmaAllocationCreateInfo* pAllocationCreateInfo,\n    VkImage* pImage,\n    VmaAllocation* pAllocation,\n    VmaAllocationInfo* pAllocationInfo)\n{\n    VMA_ASSERT(allocator && pImageCreateInfo && pAllocationCreateInfo && pImage && pAllocation);\n\n    if(pImageCreateInfo->extent.width == 0 ||\n        pImageCreateInfo->extent.height == 0 ||\n        pImageCreateInfo->extent.depth == 0 ||\n        pImageCreateInfo->mipLevels == 0 ||\n        pImageCreateInfo->arrayLayers == 0)\n    {\n        return VK_ERROR_INITIALIZATION_FAILED;\n    }\n\n    VMA_DEBUG_LOG(\"vmaCreateImage\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    *pImage = VK_NULL_HANDLE;\n    *pAllocation = VK_NULL_HANDLE;\n\n    // 1. Create VkImage.\n    VkResult res = (*allocator->GetVulkanFunctions().vkCreateImage)(\n        allocator->m_hDevice,\n        pImageCreateInfo,\n        allocator->GetAllocationCallbacks(),\n        pImage);\n    if(res == VK_SUCCESS)\n    {\n        VmaSuballocationType suballocType = pImageCreateInfo->tiling == VK_IMAGE_TILING_OPTIMAL ?\n            VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL :\n            VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR;\n\n        // 2. Allocate memory using allocator.\n        VkMemoryRequirements vkMemReq = {};\n        bool requiresDedicatedAllocation = false;\n        bool prefersDedicatedAllocation  = false;\n        allocator->GetImageMemoryRequirements(*pImage, vkMemReq,\n            requiresDedicatedAllocation, prefersDedicatedAllocation);\n\n        res = allocator->AllocateMemory(\n            vkMemReq,\n            requiresDedicatedAllocation,\n            prefersDedicatedAllocation,\n            VK_NULL_HANDLE, // dedicatedBuffer\n            *pImage, // dedicatedImage\n            VmaBufferImageUsage(*pImageCreateInfo), // dedicatedBufferImageUsage\n            *pAllocationCreateInfo,\n            suballocType,\n            1, // allocationCount\n            pAllocation);\n\n        if(res == VK_SUCCESS)\n        {\n            // 3. Bind image with memory.\n            if((pAllocationCreateInfo->flags & VMA_ALLOCATION_CREATE_DONT_BIND_BIT) == 0)\n            {\n                res = allocator->BindImageMemory(*pAllocation, 0, *pImage, VMA_NULL);\n            }\n            if(res == VK_SUCCESS)\n            {\n                // All steps succeeded.\n                #if VMA_STATS_STRING_ENABLED\n                    (*pAllocation)->InitImageUsage(*pImageCreateInfo);\n                #endif\n                if(pAllocationInfo != VMA_NULL)\n                {\n                    allocator->GetAllocationInfo(*pAllocation, pAllocationInfo);\n                }\n\n                return VK_SUCCESS;\n            }\n            allocator->FreeMemory(\n                1, // allocationCount\n                pAllocation);\n            *pAllocation = VK_NULL_HANDLE;\n            (*allocator->GetVulkanFunctions().vkDestroyImage)(allocator->m_hDevice, *pImage, allocator->GetAllocationCallbacks());\n            *pImage = VK_NULL_HANDLE;\n            return res;\n        }\n        (*allocator->GetVulkanFunctions().vkDestroyImage)(allocator->m_hDevice, *pImage, allocator->GetAllocationCallbacks());\n        *pImage = VK_NULL_HANDLE;\n        return res;\n    }\n    return res;\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateAliasingImage(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation,\n    const VkImageCreateInfo* VMA_NOT_NULL pImageCreateInfo,\n    VkImage VMA_NULLABLE_NON_DISPATCHABLE* VMA_NOT_NULL pImage)\n{\n    return vmaCreateAliasingImage2(allocator, allocation, 0, pImageCreateInfo, pImage);\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateAliasingImage2(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation,\n    VkDeviceSize allocationLocalOffset,\n    const VkImageCreateInfo* VMA_NOT_NULL pImageCreateInfo,\n    VkImage VMA_NULLABLE_NON_DISPATCHABLE* VMA_NOT_NULL pImage)\n{\n    VMA_ASSERT(allocator && pImageCreateInfo && pImage && allocation);\n\n    *pImage = VK_NULL_HANDLE;\n\n    VMA_DEBUG_LOG(\"vmaCreateImage2\");\n\n    if (pImageCreateInfo->extent.width == 0 ||\n        pImageCreateInfo->extent.height == 0 ||\n        pImageCreateInfo->extent.depth == 0 ||\n        pImageCreateInfo->mipLevels == 0 ||\n        pImageCreateInfo->arrayLayers == 0)\n    {\n        return VK_ERROR_INITIALIZATION_FAILED;\n    }\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    // 1. Create VkImage.\n    VkResult res = (*allocator->GetVulkanFunctions().vkCreateImage)(\n        allocator->m_hDevice,\n        pImageCreateInfo,\n        allocator->GetAllocationCallbacks(),\n        pImage);\n    if (res >= 0)\n    {\n        // 2. Bind image with memory.\n        res = allocator->BindImageMemory(allocation, allocationLocalOffset, *pImage, VMA_NULL);\n        if (res >= 0)\n        {\n            return VK_SUCCESS;\n        }\n        (*allocator->GetVulkanFunctions().vkDestroyImage)(allocator->m_hDevice, *pImage, allocator->GetAllocationCallbacks());\n    }\n    return res;\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaDestroyImage(\n    VmaAllocator VMA_NOT_NULL allocator,\n    VkImage VMA_NULLABLE_NON_DISPATCHABLE image,\n    VmaAllocation VMA_NULLABLE allocation)\n{\n    VMA_ASSERT(allocator);\n\n    if(image == VK_NULL_HANDLE && allocation == VK_NULL_HANDLE)\n    {\n        return;\n    }\n\n    VMA_DEBUG_LOG(\"vmaDestroyImage\");\n\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK\n\n    if(image != VK_NULL_HANDLE)\n    {\n        (*allocator->GetVulkanFunctions().vkDestroyImage)(allocator->m_hDevice, image, allocator->GetAllocationCallbacks());\n    }\n    if(allocation != VK_NULL_HANDLE)\n    {\n        allocator->FreeMemory(\n            1, // allocationCount\n            &allocation);\n    }\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateVirtualBlock(\n    const VmaVirtualBlockCreateInfo* VMA_NOT_NULL pCreateInfo,\n    VmaVirtualBlock VMA_NULLABLE * VMA_NOT_NULL pVirtualBlock)\n{\n    VMA_ASSERT(pCreateInfo && pVirtualBlock);\n    VMA_ASSERT(pCreateInfo->size > 0);\n    VMA_DEBUG_LOG(\"vmaCreateVirtualBlock\");\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK;\n    *pVirtualBlock = vma_new(pCreateInfo->pAllocationCallbacks, VmaVirtualBlock_T)(*pCreateInfo);\n    VkResult res = (*pVirtualBlock)->Init();\n    if(res < 0)\n    {\n        vma_delete(pCreateInfo->pAllocationCallbacks, *pVirtualBlock);\n        *pVirtualBlock = VK_NULL_HANDLE;\n    }\n    return res;\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaDestroyVirtualBlock(VmaVirtualBlock VMA_NULLABLE virtualBlock)\n{\n    if(virtualBlock != VK_NULL_HANDLE)\n    {\n        VMA_DEBUG_LOG(\"vmaDestroyVirtualBlock\");\n        VMA_DEBUG_GLOBAL_MUTEX_LOCK;\n        VkAllocationCallbacks allocationCallbacks = virtualBlock->m_AllocationCallbacks; // Have to copy the callbacks when destroying.\n        vma_delete(&allocationCallbacks, virtualBlock);\n    }\n}\n\nVMA_CALL_PRE VkBool32 VMA_CALL_POST vmaIsVirtualBlockEmpty(VmaVirtualBlock VMA_NOT_NULL virtualBlock)\n{\n    VMA_ASSERT(virtualBlock != VK_NULL_HANDLE);\n    VMA_DEBUG_LOG(\"vmaIsVirtualBlockEmpty\");\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK;\n    return virtualBlock->IsEmpty() ? VK_TRUE : VK_FALSE;\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaGetVirtualAllocationInfo(VmaVirtualBlock VMA_NOT_NULL virtualBlock,\n    VmaVirtualAllocation VMA_NOT_NULL_NON_DISPATCHABLE allocation, VmaVirtualAllocationInfo* VMA_NOT_NULL pVirtualAllocInfo)\n{\n    VMA_ASSERT(virtualBlock != VK_NULL_HANDLE && pVirtualAllocInfo != VMA_NULL);\n    VMA_DEBUG_LOG(\"vmaGetVirtualAllocationInfo\");\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK;\n    virtualBlock->GetAllocationInfo(allocation, *pVirtualAllocInfo);\n}\n\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaVirtualAllocate(VmaVirtualBlock VMA_NOT_NULL virtualBlock,\n    const VmaVirtualAllocationCreateInfo* VMA_NOT_NULL pCreateInfo, VmaVirtualAllocation VMA_NULLABLE_NON_DISPATCHABLE* VMA_NOT_NULL pAllocation,\n    VkDeviceSize* VMA_NULLABLE pOffset)\n{\n    VMA_ASSERT(virtualBlock != VK_NULL_HANDLE && pCreateInfo != VMA_NULL && pAllocation != VMA_NULL);\n    VMA_DEBUG_LOG(\"vmaVirtualAllocate\");\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK;\n    return virtualBlock->Allocate(*pCreateInfo, *pAllocation, pOffset);\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaVirtualFree(VmaVirtualBlock VMA_NOT_NULL virtualBlock, VmaVirtualAllocation VMA_NULLABLE_NON_DISPATCHABLE allocation)\n{\n    if(allocation != VK_NULL_HANDLE)\n    {\n        VMA_ASSERT(virtualBlock != VK_NULL_HANDLE);\n        VMA_DEBUG_LOG(\"vmaVirtualFree\");\n        VMA_DEBUG_GLOBAL_MUTEX_LOCK;\n        virtualBlock->Free(allocation);\n    }\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaClearVirtualBlock(VmaVirtualBlock VMA_NOT_NULL virtualBlock)\n{\n    VMA_ASSERT(virtualBlock != VK_NULL_HANDLE);\n    VMA_DEBUG_LOG(\"vmaClearVirtualBlock\");\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK;\n    virtualBlock->Clear();\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaSetVirtualAllocationUserData(VmaVirtualBlock VMA_NOT_NULL virtualBlock,\n    VmaVirtualAllocation VMA_NOT_NULL_NON_DISPATCHABLE allocation, void* VMA_NULLABLE pUserData)\n{\n    VMA_ASSERT(virtualBlock != VK_NULL_HANDLE);\n    VMA_DEBUG_LOG(\"vmaSetVirtualAllocationUserData\");\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK;\n    virtualBlock->SetAllocationUserData(allocation, pUserData);\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaGetVirtualBlockStatistics(VmaVirtualBlock VMA_NOT_NULL virtualBlock,\n    VmaStatistics* VMA_NOT_NULL pStats)\n{\n    VMA_ASSERT(virtualBlock != VK_NULL_HANDLE && pStats != VMA_NULL);\n    VMA_DEBUG_LOG(\"vmaGetVirtualBlockStatistics\");\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK;\n    virtualBlock->GetStatistics(*pStats);\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaCalculateVirtualBlockStatistics(VmaVirtualBlock VMA_NOT_NULL virtualBlock,\n    VmaDetailedStatistics* VMA_NOT_NULL pStats)\n{\n    VMA_ASSERT(virtualBlock != VK_NULL_HANDLE && pStats != VMA_NULL);\n    VMA_DEBUG_LOG(\"vmaCalculateVirtualBlockStatistics\");\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK;\n    virtualBlock->CalculateDetailedStatistics(*pStats);\n}\n\n#if VMA_STATS_STRING_ENABLED\n\nVMA_CALL_PRE void VMA_CALL_POST vmaBuildVirtualBlockStatsString(VmaVirtualBlock VMA_NOT_NULL virtualBlock,\n    char* VMA_NULLABLE * VMA_NOT_NULL ppStatsString, VkBool32 detailedMap)\n{\n    VMA_ASSERT(virtualBlock != VK_NULL_HANDLE && ppStatsString != VMA_NULL);\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK;\n    const VkAllocationCallbacks* allocationCallbacks = virtualBlock->GetAllocationCallbacks();\n    VmaStringBuilder sb(allocationCallbacks);\n    virtualBlock->BuildStatsString(detailedMap != VK_FALSE, sb);\n    *ppStatsString = VmaCreateStringCopy(allocationCallbacks, sb.GetData(), sb.GetLength());\n}\n\nVMA_CALL_PRE void VMA_CALL_POST vmaFreeVirtualBlockStatsString(VmaVirtualBlock VMA_NOT_NULL virtualBlock,\n    char* VMA_NULLABLE pStatsString)\n{\n    if(pStatsString != VMA_NULL)\n    {\n        VMA_ASSERT(virtualBlock != VK_NULL_HANDLE);\n        VMA_DEBUG_GLOBAL_MUTEX_LOCK;\n        VmaFreeString(virtualBlock->GetAllocationCallbacks(), pStatsString);\n    }\n}\n#if VMA_EXTERNAL_MEMORY_WIN32\nVMA_CALL_PRE VkResult VMA_CALL_POST vmaGetMemoryWin32Handle(VmaAllocator VMA_NOT_NULL allocator,\n    VmaAllocation VMA_NOT_NULL allocation, HANDLE hTargetProcess, HANDLE* VMA_NOT_NULL pHandle)\n{\n    VMA_ASSERT(allocator && allocation && pHandle);\n    VMA_DEBUG_GLOBAL_MUTEX_LOCK;\n    return allocation->GetWin32Handle(allocator, hTargetProcess, pHandle);\n}\n#endif // VMA_EXTERNAL_MEMORY_WIN32 \n#endif // VMA_STATS_STRING_ENABLED\n#endif // _VMA_PUBLIC_INTERFACE\n#endif // VMA_IMPLEMENTATION\n\n/**\n\\page quick_start Quick start\n\n\\section quick_start_project_setup Project setup\n\nVulkan Memory Allocator comes in form of a \"stb-style\" single header file.\nWhile you can pull the entire repository e.g. as Git module, there is also Cmake script provided,\nyou don't need to build it as a separate library project.\nYou can add file \"vk_mem_alloc.h\" directly to your project and submit it to code repository next to your other source files.\n\n\"Single header\" doesn't mean that everything is contained in C/C++ declarations,\nlike it tends to be in case of inline functions or C++ templates.\nIt means that implementation is bundled with interface in a single file and needs to be extracted using preprocessor macro.\nIf you don't do it properly, it will result in linker errors.\n\nTo do it properly:\n\n-# Include \"vk_mem_alloc.h\" file in each CPP file where you want to use the library.\n   This includes declarations of all members of the library.\n-# In exactly one CPP file define following macro before this include.\n   It enables also internal definitions.\n\n\\code\n#define VMA_IMPLEMENTATION\n#include \"vk_mem_alloc.h\"\n\\endcode\n\nIt may be a good idea to create dedicated CPP file just for this purpose, e.g. \"VmaUsage.cpp\".\n\nThis library includes header `<vulkan/vulkan.h>`, which in turn\nincludes `<windows.h>` on Windows. If you need some specific macros defined\nbefore including these headers (like `WIN32_LEAN_AND_MEAN` or\n`WINVER` for Windows, `VK_USE_PLATFORM_WIN32_KHR` for Vulkan), you must define\nthem before every `#include` of this library.\nIt may be a good idea to create a dedicate header file for this purpose, e.g. \"VmaUsage.h\",\nthat will be included in other source files instead of VMA header directly.\n\nThis library is written in C++, but has C-compatible interface.\nThus, you can include and use \"vk_mem_alloc.h\" in C or C++ code, but full\nimplementation with `VMA_IMPLEMENTATION` macro must be compiled as C++, NOT as C.\nSome features of C++14 are used and required. Features of C++20 are used optionally when available.\nSome headers of standard C and C++ library are used, but STL containers, RTTI, or C++ exceptions are not used.\n\n\n\\section quick_start_initialization Initialization\n\nVMA offers library interface in a style similar to Vulkan, with object handles like #VmaAllocation,\nstructures describing parameters of objects to be created like #VmaAllocationCreateInfo,\nand errors codes returned from functions using `VkResult` type.\n\nThe first and the main object that needs to be created is #VmaAllocator.\nIt represents the initialization of the entire library.\nOnly one such object should be created per `VkDevice`.\nYou should create it at program startup, after `VkDevice` was created, and before any device memory allocator needs to be made.\nIt must be destroyed before `VkDevice` is destroyed.\n\nAt program startup:\n\n-# Initialize Vulkan to have `VkInstance`, `VkPhysicalDevice`, `VkDevice` object.\n-# Fill VmaAllocatorCreateInfo structure and call vmaCreateAllocator() to create #VmaAllocator object.\n\nOnly members `physicalDevice`, `device`, `instance` are required.\nHowever, you should inform the library which Vulkan version do you use by setting\nVmaAllocatorCreateInfo::vulkanApiVersion and which extensions did you enable\nby setting VmaAllocatorCreateInfo::flags.\nOtherwise, VMA would use only features of Vulkan 1.0 core with no extensions.\nSee below for details.\n\n\\subsection quick_start_initialization_selecting_vulkan_version Selecting Vulkan version\n\nVMA supports Vulkan version down to 1.0, for backward compatibility.\nIf you want to use higher version, you need to inform the library about it.\nThis is a two-step process.\n\n<b>Step 1: Compile time.</b> By default, VMA compiles with code supporting the highest\nVulkan version found in the included `<vulkan/vulkan.h>` that is also supported by the library.\nIf this is OK, you don't need to do anything.\nHowever, if you want to compile VMA as if only some lower Vulkan version was available,\ndefine macro `VMA_VULKAN_VERSION` before every `#include \"vk_mem_alloc.h\"`.\nIt should have decimal numeric value in form of ABBBCCC, where A = major, BBB = minor, CCC = patch Vulkan version.\nFor example, to compile against Vulkan 1.2:\n\n\\code\n#define VMA_VULKAN_VERSION 1002000 // Vulkan 1.2\n#include \"vk_mem_alloc.h\"\n\\endcode\n\n<b>Step 2: Runtime.</b> Even when compiled with higher Vulkan version available,\nVMA can use only features of a lower version, which is configurable during creation of the #VmaAllocator object.\nBy default, only Vulkan 1.0 is used.\nTo initialize the allocator with support for higher Vulkan version, you need to set member\nVmaAllocatorCreateInfo::vulkanApiVersion to an appropriate value, e.g. using constants like `VK_API_VERSION_1_2`.\nSee code sample below.\n\n\\subsection quick_start_initialization_importing_vulkan_functions Importing Vulkan functions\n\nYou may need to configure importing Vulkan functions. There are 3 ways to do this:\n\n-# **If you link with Vulkan static library** (e.g. \"vulkan-1.lib\" on Windows):\n   - You don't need to do anything.\n   - VMA will use these, as macro `VMA_STATIC_VULKAN_FUNCTIONS` is defined to 1 by default.\n-# **If you want VMA to fetch pointers to Vulkan functions dynamically** using `vkGetInstanceProcAddr`,\n   `vkGetDeviceProcAddr` (this is the option presented in the example below):\n   - Define `VMA_STATIC_VULKAN_FUNCTIONS` to 0, `VMA_DYNAMIC_VULKAN_FUNCTIONS` to 1.\n   - Provide pointers to these two functions via VmaVulkanFunctions::vkGetInstanceProcAddr,\n     VmaVulkanFunctions::vkGetDeviceProcAddr.\n   - The library will fetch pointers to all other functions it needs internally.\n-# **If you fetch pointers to all Vulkan functions in a custom way**, e.g. using some loader like\n   [Volk](https://github.com/zeux/volk):\n   - Define `VMA_STATIC_VULKAN_FUNCTIONS` and `VMA_DYNAMIC_VULKAN_FUNCTIONS` to 0.\n   - Pass these pointers via structure #VmaVulkanFunctions.\n\n\\subsection quick_start_initialization_enabling_extensions Enabling extensions\n\nVMA can automatically use following Vulkan extensions.\nIf you found them available on the selected physical device and you enabled them\nwhile creating `VkInstance` / `VkDevice` object, inform VMA about their availability\nby setting appropriate flags in VmaAllocatorCreateInfo::flags.\n\nVulkan extension              | VMA flag\n------------------------------|-----------------------------------------------------\nVK_KHR_dedicated_allocation   | #VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT\nVK_KHR_bind_memory2           | #VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT\nVK_KHR_maintenance4           | #VMA_ALLOCATOR_CREATE_KHR_MAINTENANCE4_BIT\nVK_KHR_maintenance5           | #VMA_ALLOCATOR_CREATE_KHR_MAINTENANCE5_BIT\nVK_EXT_memory_budget          | #VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT\nVK_KHR_buffer_device_address  | #VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT\nVK_EXT_memory_priority        | #VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT\nVK_AMD_device_coherent_memory | #VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT\nVK_KHR_external_memory_win32  | #VMA_ALLOCATOR_CREATE_KHR_EXTERNAL_MEMORY_WIN32_BIT\n\nExample with fetching pointers to Vulkan functions dynamically:\n\n\\code\n#define VMA_STATIC_VULKAN_FUNCTIONS 0\n#define VMA_DYNAMIC_VULKAN_FUNCTIONS 1\n#include \"vk_mem_alloc.h\"\n\n...\n\nVmaVulkanFunctions vulkanFunctions = {};\nvulkanFunctions.vkGetInstanceProcAddr = &vkGetInstanceProcAddr;\nvulkanFunctions.vkGetDeviceProcAddr = &vkGetDeviceProcAddr;\n\nVmaAllocatorCreateInfo allocatorCreateInfo = {};\nallocatorCreateInfo.flags = VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT;\nallocatorCreateInfo.vulkanApiVersion = VK_API_VERSION_1_2;\nallocatorCreateInfo.physicalDevice = physicalDevice;\nallocatorCreateInfo.device = device;\nallocatorCreateInfo.instance = instance;\nallocatorCreateInfo.pVulkanFunctions = &vulkanFunctions;\n\nVmaAllocator allocator;\nvmaCreateAllocator(&allocatorCreateInfo, &allocator);\n\n// Entire program...\n\n// At the end, don't forget to:\nvmaDestroyAllocator(allocator);\n\\endcode\n\n\n\\subsection quick_start_initialization_other_config Other configuration options\n\nThere are additional configuration options available through preprocessor macros that you can define\nbefore including VMA header and through parameters passed in #VmaAllocatorCreateInfo.\nThey include a possibility to use your own callbacks for host memory allocations (`VkAllocationCallbacks`),\ncallbacks for device memory allocations (instead of `vkAllocateMemory`, `vkFreeMemory`),\nor your custom `VMA_ASSERT` macro, among others.\nFor more information, see: @ref configuration.\n\n\n\\section quick_start_resource_allocation Resource allocation\n\nWhen you want to create a buffer or image:\n\n-# Fill `VkBufferCreateInfo` / `VkImageCreateInfo` structure.\n-# Fill VmaAllocationCreateInfo structure.\n-# Call vmaCreateBuffer() / vmaCreateImage() to get `VkBuffer`/`VkImage` with memory\n   already allocated and bound to it, plus #VmaAllocation objects that represents its underlying memory.\n\n\\code\nVkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };\nbufferInfo.size = 65536;\nbufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;\n\nVmaAllocationCreateInfo allocInfo = {};\nallocInfo.usage = VMA_MEMORY_USAGE_AUTO;\n\nVkBuffer buffer;\nVmaAllocation allocation;\nvmaCreateBuffer(allocator, &bufferInfo, &allocInfo, &buffer, &allocation, nullptr);\n\\endcode\n\nDon't forget to destroy your buffer and allocation objects when no longer needed:\n\n\\code\nvmaDestroyBuffer(allocator, buffer, allocation);\n\\endcode\n\nIf you need to map the buffer, you must set flag\n#VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT or #VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT\nin VmaAllocationCreateInfo::flags.\nThere are many additional parameters that can control the choice of memory type to be used for the allocation\nand other features.\nFor more information, see documentation chapters: @ref choosing_memory_type, @ref memory_mapping.\n\n\n\\page choosing_memory_type Choosing memory type\n\nPhysical devices in Vulkan support various combinations of memory heaps and\ntypes. Help with choosing correct and optimal memory type for your specific\nresource is one of the key features of this library. You can use it by filling\nappropriate members of VmaAllocationCreateInfo structure, as described below.\nYou can also combine multiple methods.\n\n-# If you just want to find memory type index that meets your requirements, you\n   can use function: vmaFindMemoryTypeIndexForBufferInfo(),\n   vmaFindMemoryTypeIndexForImageInfo(), vmaFindMemoryTypeIndex().\n-# If you want to allocate a region of device memory without association with any\n   specific image or buffer, you can use function vmaAllocateMemory(). Usage of\n   this function is not recommended and usually not needed.\n   vmaAllocateMemoryPages() function is also provided for creating multiple allocations at once,\n   which may be useful for sparse binding.\n-# If you already have a buffer or an image created, you want to allocate memory\n   for it and then you will bind it yourself, you can use function\n   vmaAllocateMemoryForBuffer(), vmaAllocateMemoryForImage().\n   For binding you should use functions: vmaBindBufferMemory(), vmaBindImageMemory()\n   or their extended versions: vmaBindBufferMemory2(), vmaBindImageMemory2().\n-# If you want to create a buffer or an image, allocate memory for it, and bind\n   them together, all in one call, you can use function vmaCreateBuffer(),\n   vmaCreateImage().\n   <b>This is the easiest and recommended way to use this library!</b>\n\nWhen using 3. or 4., the library internally queries Vulkan for memory types\nsupported for that buffer or image (function `vkGetBufferMemoryRequirements()`)\nand uses only one of these types.\n\nIf no memory type can be found that meets all the requirements, these functions\nreturn `VK_ERROR_FEATURE_NOT_PRESENT`.\n\nYou can leave VmaAllocationCreateInfo structure completely filled with zeros.\nIt means no requirements are specified for memory type.\nIt is valid, although not very useful.\n\n\\section choosing_memory_type_usage Usage\n\nThe easiest way to specify memory requirements is to fill member\nVmaAllocationCreateInfo::usage using one of the values of enum #VmaMemoryUsage.\nIt defines high level, common usage types.\nSince version 3 of the library, it is recommended to use #VMA_MEMORY_USAGE_AUTO to let it select best memory type for your resource automatically.\n\nFor example, if you want to create a uniform buffer that will be filled using\ntransfer only once or infrequently and then used for rendering every frame as a uniform buffer, you can\ndo it using following code. The buffer will most likely end up in a memory type with\n`VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT` to be fast to access by the GPU device.\n\n\\code\nVkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };\nbufferInfo.size = 65536;\nbufferInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;\n\nVmaAllocationCreateInfo allocInfo = {};\nallocInfo.usage = VMA_MEMORY_USAGE_AUTO;\n\nVkBuffer buffer;\nVmaAllocation allocation;\nvmaCreateBuffer(allocator, &bufferInfo, &allocInfo, &buffer, &allocation, nullptr);\n\\endcode\n\nIf you have a preference for putting the resource in GPU (device) memory or CPU (host) memory\non systems with discrete graphics card that have the memories separate, you can use\n#VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE or #VMA_MEMORY_USAGE_AUTO_PREFER_HOST.\n\nWhen using `VMA_MEMORY_USAGE_AUTO*` while you want to map the allocated memory,\nyou also need to specify one of the host access flags:\n#VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT or #VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT.\nThis will help the library decide about preferred memory type to ensure it has `VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT`\nso you can map it.\n\nFor example, a staging buffer that will be filled via mapped pointer and then\nused as a source of transfer to the buffer described previously can be created like this.\nIt will likely end up in a memory type that is `HOST_VISIBLE` and `HOST_COHERENT`\nbut not `HOST_CACHED` (meaning uncached, write-combined) and not `DEVICE_LOCAL` (meaning system RAM).\n\n\\code\nVkBufferCreateInfo stagingBufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };\nstagingBufferInfo.size = 65536;\nstagingBufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;\n\nVmaAllocationCreateInfo stagingAllocInfo = {};\nstagingAllocInfo.usage = VMA_MEMORY_USAGE_AUTO;\nstagingAllocInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT;\n\nVkBuffer stagingBuffer;\nVmaAllocation stagingAllocation;\nvmaCreateBuffer(allocator, &stagingBufferInfo, &stagingAllocInfo, &stagingBuffer, &stagingAllocation, nullptr);\n\\endcode\n\nFor more examples of creating different kinds of resources, see chapter \\ref usage_patterns.\nSee also: @ref memory_mapping.\n\nUsage values `VMA_MEMORY_USAGE_AUTO*` are legal to use only when the library knows\nabout the resource being created by having `VkBufferCreateInfo` / `VkImageCreateInfo` passed,\nso they work with functions like: vmaCreateBuffer(), vmaCreateImage(), vmaFindMemoryTypeIndexForBufferInfo() etc.\nIf you allocate raw memory using function vmaAllocateMemory(), you have to use other means of selecting\nmemory type, as described below.\n\n\\note\nOld usage values (`VMA_MEMORY_USAGE_GPU_ONLY`, `VMA_MEMORY_USAGE_CPU_ONLY`,\n`VMA_MEMORY_USAGE_CPU_TO_GPU`, `VMA_MEMORY_USAGE_GPU_TO_CPU`, `VMA_MEMORY_USAGE_CPU_COPY`)\nare still available and work same way as in previous versions of the library\nfor backward compatibility, but they are deprecated.\n\n\\section choosing_memory_type_required_preferred_flags Required and preferred flags\n\nYou can specify more detailed requirements by filling members\nVmaAllocationCreateInfo::requiredFlags and VmaAllocationCreateInfo::preferredFlags\nwith a combination of bits from enum `VkMemoryPropertyFlags`. For example,\nif you want to create a buffer that will be persistently mapped on host (so it\nmust be `HOST_VISIBLE`) and preferably will also be `HOST_COHERENT` and `HOST_CACHED`,\nuse following code:\n\n\\code\nVmaAllocationCreateInfo allocInfo = {};\nallocInfo.requiredFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;\nallocInfo.preferredFlags = VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT;\nallocInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT;\n\nVkBuffer buffer;\nVmaAllocation allocation;\nvmaCreateBuffer(allocator, &bufferInfo, &allocInfo, &buffer, &allocation, nullptr);\n\\endcode\n\nA memory type is chosen that has all the required flags and as many preferred\nflags set as possible.\n\nValue passed in VmaAllocationCreateInfo::usage is internally converted to a set of required and preferred flags,\nplus some extra \"magic\" (heuristics).\n\n\\section choosing_memory_type_explicit_memory_types Explicit memory types\n\nIf you inspected memory types available on the physical device and <b>you have\na preference for memory types that you want to use</b>, you can fill member\nVmaAllocationCreateInfo::memoryTypeBits. It is a bit mask, where each bit set\nmeans that a memory type with that index is allowed to be used for the\nallocation. Special value 0, just like `UINT32_MAX`, means there are no\nrestrictions to memory type index.\n\nPlease note that this member is NOT just a memory type index.\nStill you can use it to choose just one, specific memory type.\nFor example, if you already determined that your buffer should be created in\nmemory type 2, use following code:\n\n\\code\nuint32_t memoryTypeIndex = 2;\n\nVmaAllocationCreateInfo allocInfo = {};\nallocInfo.memoryTypeBits = 1u << memoryTypeIndex;\n\nVkBuffer buffer;\nVmaAllocation allocation;\nvmaCreateBuffer(allocator, &bufferInfo, &allocInfo, &buffer, &allocation, nullptr);\n\\endcode\n\nYou can also use this parameter to <b>exclude some memory types</b>.\nIf you inspect memory heaps and types available on the current physical device and\nyou determine that for some reason you don't want to use a specific memory type for the allocation,\nyou can enable automatic memory type selection but exclude certain memory type or types\nby setting all bits of `memoryTypeBits` to 1 except the ones you choose.\n\n\\code\n// ...\nuint32_t excludedMemoryTypeIndex = 2;\nVmaAllocationCreateInfo allocInfo = {};\nallocInfo.usage = VMA_MEMORY_USAGE_AUTO;\nallocInfo.memoryTypeBits = ~(1u << excludedMemoryTypeIndex);\n// ...\n\\endcode\n\n\n\\section choosing_memory_type_custom_memory_pools Custom memory pools\n\nIf you allocate from custom memory pool, all the ways of specifying memory\nrequirements described above are not applicable and the aforementioned members\nof VmaAllocationCreateInfo structure are ignored. Memory type is selected\nexplicitly when creating the pool and then used to make all the allocations from\nthat pool. For further details, see \\ref custom_memory_pools.\n\n\\section choosing_memory_type_dedicated_allocations Dedicated allocations\n\nMemory for allocations is reserved out of larger block of `VkDeviceMemory`\nallocated from Vulkan internally. That is the main feature of this whole library.\nYou can still request a separate memory block to be created for an allocation,\njust like you would do in a trivial solution without using any allocator.\nIn that case, a buffer or image is always bound to that memory at offset 0.\nThis is called a \"dedicated allocation\".\nYou can explicitly request it by using flag #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT.\nThe library can also internally decide to use dedicated allocation in some cases, e.g.:\n\n- When the size of the allocation is large.\n- When [VK_KHR_dedicated_allocation](@ref vk_khr_dedicated_allocation) extension is enabled\n  and it reports that dedicated allocation is required or recommended for the resource.\n- When allocation of next big memory block fails due to not enough device memory,\n  but allocation with the exact requested size succeeds.\n\n\n\\page memory_mapping Memory mapping\n\nTo \"map memory\" in Vulkan means to obtain a CPU pointer to `VkDeviceMemory`,\nto be able to read from it or write to it in CPU code.\nMapping is possible only of memory allocated from a memory type that has\n`VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT` flag.\nFunctions `vkMapMemory()`, `vkUnmapMemory()` are designed for this purpose.\nYou can use them directly with memory allocated by this library,\nbut it is not recommended because of following issue:\nMapping the same `VkDeviceMemory` block multiple times is illegal - only one mapping at a time is allowed.\nThis includes mapping disjoint regions. Mapping is not reference-counted internally by Vulkan.\nIt is also not thread-safe.\nBecause of this, Vulkan Memory Allocator provides following facilities:\n\n\\note If you want to be able to map an allocation, you need to specify one of the flags\n#VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT or #VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT\nin VmaAllocationCreateInfo::flags. These flags are required for an allocation to be mappable\nwhen using #VMA_MEMORY_USAGE_AUTO or other `VMA_MEMORY_USAGE_AUTO*` enum values.\nFor other usage values they are ignored and every such allocation made in `HOST_VISIBLE` memory type is mappable,\nbut these flags can still be used for consistency.\n\n\\section memory_mapping_copy_functions Copy functions\n\nThe easiest way to copy data from a host pointer to an allocation is to use convenience function vmaCopyMemoryToAllocation().\nIt automatically maps the Vulkan memory temporarily (if not already mapped), performs `memcpy`,\nand calls `vkFlushMappedMemoryRanges` (if required - if memory type is not `HOST_COHERENT`).\n\nIt is also the safest one, because using `memcpy` avoids a risk of accidentally introducing memory reads\n(e.g. by doing `pMappedVectors[i] += v`), which may be very slow on memory types that are not `HOST_CACHED`.\n\n\\code\nstruct ConstantBuffer\n{\n    ...\n};\nConstantBuffer constantBufferData = ...\n\nVkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };\nbufCreateInfo.size = sizeof(ConstantBuffer);\nbufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;\n\nVmaAllocationCreateInfo allocCreateInfo = {};\nallocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;\nallocCreateInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT;\n\nVkBuffer buf;\nVmaAllocation alloc;\nvmaCreateBuffer(allocator, &bufCreateInfo, &allocCreateInfo, &buf, &alloc, nullptr);\n\nvmaCopyMemoryToAllocation(allocator, &constantBufferData, alloc, 0, sizeof(ConstantBuffer));\n\\endcode\n\nCopy in the other direction - from an allocation to a host pointer can be performed the same way using function vmaCopyAllocationToMemory().\n\n\\section memory_mapping_mapping_functions Mapping functions\n\nThe library provides following functions for mapping of a specific allocation: vmaMapMemory(), vmaUnmapMemory().\nThey are safer and more convenient to use than standard Vulkan functions.\nYou can map an allocation multiple times simultaneously - mapping is reference-counted internally.\nYou can also map different allocations simultaneously regardless of whether they use the same `VkDeviceMemory` block.\nThe way it is implemented is that the library always maps entire memory block, not just region of the allocation.\nFor further details, see description of vmaMapMemory() function.\nExample:\n\n\\code\n// Having these objects initialized:\nstruct ConstantBuffer\n{\n    ...\n};\nConstantBuffer constantBufferData = ...\n\nVmaAllocator allocator = ...\nVkBuffer constantBuffer = ...\nVmaAllocation constantBufferAllocation = ...\n\n// You can map and fill your buffer using following code:\n\nvoid* mappedData;\nvmaMapMemory(allocator, constantBufferAllocation, &mappedData);\nmemcpy(mappedData, &constantBufferData, sizeof(constantBufferData));\nvmaUnmapMemory(allocator, constantBufferAllocation);\n\\endcode\n\nWhen mapping, you may see a warning from Vulkan validation layer similar to this one:\n\n<i>Mapping an image with layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL can result in undefined behavior if this memory is used by the device. Only GENERAL or PREINITIALIZED should be used.</i>\n\nIt happens because the library maps entire `VkDeviceMemory` block, where different\ntypes of images and buffers may end up together, especially on GPUs with unified memory like Intel.\nYou can safely ignore it if you are sure you access only memory of the intended\nobject that you wanted to map.\n\n\n\\section memory_mapping_persistently_mapped_memory Persistently mapped memory\n\nKeeping your memory persistently mapped is generally OK in Vulkan.\nYou don't need to unmap it before using its data on the GPU.\nThe library provides a special feature designed for that:\nAllocations made with #VMA_ALLOCATION_CREATE_MAPPED_BIT flag set in\nVmaAllocationCreateInfo::flags stay mapped all the time,\nso you can just access CPU pointer to it any time\nwithout a need to call any \"map\" or \"unmap\" function.\nExample:\n\n\\code\nVkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };\nbufCreateInfo.size = sizeof(ConstantBuffer);\nbufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;\n\nVmaAllocationCreateInfo allocCreateInfo = {};\nallocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;\nallocCreateInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT |\n    VMA_ALLOCATION_CREATE_MAPPED_BIT;\n\nVkBuffer buf;\nVmaAllocation alloc;\nVmaAllocationInfo allocInfo;\nvmaCreateBuffer(allocator, &bufCreateInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);\n\n// Buffer is already mapped. You can access its memory.\nmemcpy(allocInfo.pMappedData, &constantBufferData, sizeof(constantBufferData));\n\\endcode\n\n\\note #VMA_ALLOCATION_CREATE_MAPPED_BIT by itself doesn't guarantee that the allocation will end up\nin a mappable memory type.\nFor this, you need to also specify #VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT or\n#VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT.\n#VMA_ALLOCATION_CREATE_MAPPED_BIT only guarantees that if the memory is `HOST_VISIBLE`, the allocation will be mapped on creation.\nFor an example of how to make use of this fact, see section \\ref usage_patterns_advanced_data_uploading.\n\n\\section memory_mapping_cache_control Cache flush and invalidate\n\nMemory in Vulkan doesn't need to be unmapped before using it on GPU,\nbut unless a memory types has `VK_MEMORY_PROPERTY_HOST_COHERENT_BIT` flag set,\nyou need to manually **invalidate** cache before reading of mapped pointer\nand **flush** cache after writing to mapped pointer.\nMap/unmap operations don't do that automatically.\nVulkan provides following functions for this purpose `vkFlushMappedMemoryRanges()`,\n`vkInvalidateMappedMemoryRanges()`, but this library provides more convenient\nfunctions that refer to given allocation object: vmaFlushAllocation(),\nvmaInvalidateAllocation(),\nor multiple objects at once: vmaFlushAllocations(), vmaInvalidateAllocations().\n\nRegions of memory specified for flush/invalidate must be aligned to\n`VkPhysicalDeviceLimits::nonCoherentAtomSize`. This is automatically ensured by the library.\nIn any memory type that is `HOST_VISIBLE` but not `HOST_COHERENT`, all allocations\nwithin blocks are aligned to this value, so their offsets are always multiply of\n`nonCoherentAtomSize` and two different allocations never share same \"line\" of this size.\n\nAlso, Windows drivers from all 3 PC GPU vendors (AMD, Intel, NVIDIA)\ncurrently provide `HOST_COHERENT` flag on all memory types that are\n`HOST_VISIBLE`, so on PC you may not need to bother.\n\n\n\\page staying_within_budget Staying within budget\n\nWhen developing a graphics-intensive game or program, it is important to avoid allocating\nmore GPU memory than it is physically available. When the memory is over-committed,\nvarious bad things can happen, depending on the specific GPU, graphics driver, and\noperating system:\n\n- It may just work without any problems.\n- The application may slow down because some memory blocks are moved to system RAM\n  and the GPU has to access them through PCI Express bus.\n- A new allocation may take very long time to complete, even few seconds, and possibly\n  freeze entire system.\n- The new allocation may fail with `VK_ERROR_OUT_OF_DEVICE_MEMORY`.\n- It may even result in GPU crash (TDR), observed as `VK_ERROR_DEVICE_LOST`\n  returned somewhere later.\n\n\\section staying_within_budget_querying_for_budget Querying for budget\n\nTo query for current memory usage and available budget, use function vmaGetHeapBudgets().\nReturned structure #VmaBudget contains quantities expressed in bytes, per Vulkan memory heap.\n\nPlease note that this function returns different information and works faster than\nvmaCalculateStatistics(). vmaGetHeapBudgets() can be called every frame or even before every\nallocation, while vmaCalculateStatistics() is intended to be used rarely,\nonly to obtain statistical information, e.g. for debugging purposes.\n\nIt is recommended to use <b>VK_EXT_memory_budget</b> device extension to obtain information\nabout the budget from Vulkan device. VMA is able to use this extension automatically.\nWhen not enabled, the allocator behaves same way, but then it estimates current usage\nand available budget based on its internal information and Vulkan memory heap sizes,\nwhich may be less precise. In order to use this extension:\n\n1. Make sure extensions VK_EXT_memory_budget and VK_KHR_get_physical_device_properties2\n   required by it are available and enable them. Please note that the first is a device\n   extension and the second is instance extension!\n2. Use flag #VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT when creating #VmaAllocator object.\n3. Make sure to call vmaSetCurrentFrameIndex() every frame. Budget is queried from\n   Vulkan inside of it to avoid overhead of querying it with every allocation.\n\n\\section staying_within_budget_controlling_memory_usage Controlling memory usage\n\nThere are many ways in which you can try to stay within the budget.\n\nFirst, when making new allocation requires allocating a new memory block, the library\ntries not to exceed the budget automatically. If a block with default recommended size\n(e.g. 256 MB) would go over budget, a smaller block is allocated, possibly even\ndedicated memory for just this resource.\n\nIf the size of the requested resource plus current memory usage is more than the\nbudget, by default the library still tries to create it, leaving it to the Vulkan\nimplementation whether the allocation succeeds or fails. You can change this behavior\nby using #VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT flag. With it, the allocation is\nnot made if it would exceed the budget or if the budget is already exceeded.\nVMA then tries to make the allocation from the next eligible Vulkan memory type.\nIf all of them fail, the call then fails with `VK_ERROR_OUT_OF_DEVICE_MEMORY`.\nExample usage pattern may be to pass the #VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT flag\nwhen creating resources that are not essential for the application (e.g. the texture\nof a specific object) and not to pass it when creating critically important resources\n(e.g. render targets).\n\nOn AMD graphics cards there is a custom vendor extension available: <b>VK_AMD_memory_overallocation_behavior</b>\nthat allows to control the behavior of the Vulkan implementation in out-of-memory cases -\nwhether it should fail with an error code or still allow the allocation.\nUsage of this extension involves only passing extra structure on Vulkan device creation,\nso it is out of scope of this library.\n\nFinally, you can also use #VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT flag to make sure\na new allocation is created only when it fits inside one of the existing memory blocks.\nIf it would require to allocate a new block, if fails instead with `VK_ERROR_OUT_OF_DEVICE_MEMORY`.\nThis also ensures that the function call is very fast because it never goes to Vulkan\nto obtain a new block.\n\n\\note Creating \\ref custom_memory_pools with VmaPoolCreateInfo::minBlockCount\nset to more than 0 will currently try to allocate memory blocks without checking whether they\nfit within budget.\n\n\n\\page resource_aliasing Resource aliasing (overlap)\n\nNew explicit graphics APIs (Vulkan and Direct3D 12), thanks to manual memory\nmanagement, give an opportunity to alias (overlap) multiple resources in the\nsame region of memory - a feature not available in the old APIs (Direct3D 11, OpenGL).\nIt can be useful to save video memory, but it must be used with caution.\n\nFor example, if you know the flow of your whole render frame in advance, you\nare going to use some intermediate textures or buffers only during a small range of render passes,\nand you know these ranges don't overlap in time, you can bind these resources to\nthe same place in memory, even if they have completely different parameters (width, height, format etc.).\n\n![Resource aliasing (overlap)](../gfx/Aliasing.png)\n\nSuch scenario is possible using VMA, but you need to create your images manually.\nThen you need to calculate parameters of an allocation to be made using formula:\n\n- allocation size = max(size of each image)\n- allocation alignment = max(alignment of each image)\n- allocation memoryTypeBits = bitwise AND(memoryTypeBits of each image)\n\nFollowing example shows two different images bound to the same place in memory,\nallocated to fit largest of them.\n\n\\code\n// A 512x512 texture to be sampled.\nVkImageCreateInfo img1CreateInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };\nimg1CreateInfo.imageType = VK_IMAGE_TYPE_2D;\nimg1CreateInfo.extent.width = 512;\nimg1CreateInfo.extent.height = 512;\nimg1CreateInfo.extent.depth = 1;\nimg1CreateInfo.mipLevels = 10;\nimg1CreateInfo.arrayLayers = 1;\nimg1CreateInfo.format = VK_FORMAT_R8G8B8A8_SRGB;\nimg1CreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL;\nimg1CreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;\nimg1CreateInfo.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;\nimg1CreateInfo.samples = VK_SAMPLE_COUNT_1_BIT;\n\n// A full screen texture to be used as color attachment.\nVkImageCreateInfo img2CreateInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };\nimg2CreateInfo.imageType = VK_IMAGE_TYPE_2D;\nimg2CreateInfo.extent.width = 1920;\nimg2CreateInfo.extent.height = 1080;\nimg2CreateInfo.extent.depth = 1;\nimg2CreateInfo.mipLevels = 1;\nimg2CreateInfo.arrayLayers = 1;\nimg2CreateInfo.format = VK_FORMAT_R8G8B8A8_UNORM;\nimg2CreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL;\nimg2CreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;\nimg2CreateInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;\nimg2CreateInfo.samples = VK_SAMPLE_COUNT_1_BIT;\n\nVkImage img1;\nres = vkCreateImage(device, &img1CreateInfo, nullptr, &img1);\nVkImage img2;\nres = vkCreateImage(device, &img2CreateInfo, nullptr, &img2);\n\nVkMemoryRequirements img1MemReq;\nvkGetImageMemoryRequirements(device, img1, &img1MemReq);\nVkMemoryRequirements img2MemReq;\nvkGetImageMemoryRequirements(device, img2, &img2MemReq);\n\nVkMemoryRequirements finalMemReq = {};\nfinalMemReq.size = std::max(img1MemReq.size, img2MemReq.size);\nfinalMemReq.alignment = std::max(img1MemReq.alignment, img2MemReq.alignment);\nfinalMemReq.memoryTypeBits = img1MemReq.memoryTypeBits & img2MemReq.memoryTypeBits;\n// Validate if(finalMemReq.memoryTypeBits != 0)\n\nVmaAllocationCreateInfo allocCreateInfo = {};\nallocCreateInfo.preferredFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;\n\nVmaAllocation alloc;\nres = vmaAllocateMemory(allocator, &finalMemReq, &allocCreateInfo, &alloc, nullptr);\n\nres = vmaBindImageMemory(allocator, alloc, img1);\nres = vmaBindImageMemory(allocator, alloc, img2);\n\n// You can use img1, img2 here, but not at the same time!\n\nvmaFreeMemory(allocator, alloc);\nvkDestroyImage(allocator, img2, nullptr);\nvkDestroyImage(allocator, img1, nullptr);\n\\endcode\n\nVMA also provides convenience functions that create a buffer or image and bind it to memory\nrepresented by an existing #VmaAllocation:\nvmaCreateAliasingBuffer(), vmaCreateAliasingBuffer2(),\nvmaCreateAliasingImage(), vmaCreateAliasingImage2().\nVersions with \"2\" offer additional parameter `allocationLocalOffset`.\n\nRemember that using resources that alias in memory requires proper synchronization.\nYou need to issue a memory barrier to make sure commands that use `img1` and `img2`\ndon't overlap on GPU timeline.\nYou also need to treat a resource after aliasing as uninitialized - containing garbage data.\nFor example, if you use `img1` and then want to use `img2`, you need to issue\nan image memory barrier for `img2` with `oldLayout` = `VK_IMAGE_LAYOUT_UNDEFINED`.\n\nAdditional considerations:\n\n- Vulkan also allows to interpret contents of memory between aliasing resources consistently in some cases.\nSee chapter 11.8. \"Memory Aliasing\" of Vulkan specification or `VK_IMAGE_CREATE_ALIAS_BIT` flag.\n- You can create more complex layout where different images and buffers are bound\nat different offsets inside one large allocation. For example, one can imagine\na big texture used in some render passes, aliasing with a set of many small buffers\nused between in some further passes. To bind a resource at non-zero offset in an allocation,\nuse vmaBindBufferMemory2() / vmaBindImageMemory2().\n- Before allocating memory for the resources you want to alias, check `memoryTypeBits`\nreturned in memory requirements of each resource to make sure the bits overlap.\nSome GPUs may expose multiple memory types suitable e.g. only for buffers or\nimages with `COLOR_ATTACHMENT` usage, so the sets of memory types supported by your\nresources may be disjoint. Aliasing them is not possible in that case.\n\n\n\\page custom_memory_pools Custom memory pools\n\nA memory pool contains a number of `VkDeviceMemory` blocks.\nThe library automatically creates and manages default pool for each memory type available on the device.\nDefault memory pool automatically grows in size.\nSize of allocated blocks is also variable and managed automatically.\nYou are using default pools whenever you leave VmaAllocationCreateInfo::pool = null.\n\nYou can create custom pool and allocate memory out of it.\nIt can be useful if you want to:\n\n- Keep certain kind of allocations separate from others.\n- Enforce particular, fixed size of Vulkan memory blocks.\n- Limit maximum amount of Vulkan memory allocated for that pool.\n- Reserve minimum or fixed amount of Vulkan memory always preallocated for that pool.\n- Use extra parameters for a set of your allocations that are available in #VmaPoolCreateInfo but not in\n  #VmaAllocationCreateInfo - e.g., custom minimum alignment, custom `pNext` chain.\n- Perform defragmentation on a specific subset of your allocations.\n\nTo use custom memory pools:\n\n-# Fill VmaPoolCreateInfo structure.\n-# Call vmaCreatePool() to obtain #VmaPool handle.\n-# When making an allocation, set VmaAllocationCreateInfo::pool to this handle.\n   You don't need to specify any other parameters of this structure, like `usage`.\n\nExample:\n\n\\code\n// Find memoryTypeIndex for the pool.\nVkBufferCreateInfo sampleBufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };\nsampleBufCreateInfo.size = 0x10000; // Doesn't matter.\nsampleBufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;\n\nVmaAllocationCreateInfo sampleAllocCreateInfo = {};\nsampleAllocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;\n\nuint32_t memTypeIndex;\nVkResult res = vmaFindMemoryTypeIndexForBufferInfo(allocator,\n    &sampleBufCreateInfo, &sampleAllocCreateInfo, &memTypeIndex);\n// Check res...\n\n// Create a pool that can have at most 2 blocks, 128 MiB each.\nVmaPoolCreateInfo poolCreateInfo = {};\npoolCreateInfo.memoryTypeIndex = memTypeIndex;\npoolCreateInfo.blockSize = 128ull * 1024 * 1024;\npoolCreateInfo.maxBlockCount = 2;\n\nVmaPool pool;\nres = vmaCreatePool(allocator, &poolCreateInfo, &pool);\n// Check res...\n\n// Allocate a buffer out of it.\nVkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };\nbufCreateInfo.size = 1024;\nbufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;\n\nVmaAllocationCreateInfo allocCreateInfo = {};\nallocCreateInfo.pool = pool;\n\nVkBuffer buf;\nVmaAllocation alloc;\nres = vmaCreateBuffer(allocator, &bufCreateInfo, &allocCreateInfo, &buf, &alloc, nullptr);\n// Check res...\n\\endcode\n\nYou have to free all allocations made from this pool before destroying it.\n\n\\code\nvmaDestroyBuffer(allocator, buf, alloc);\nvmaDestroyPool(allocator, pool);\n\\endcode\n\nNew versions of this library support creating dedicated allocations in custom pools.\nIt is supported only when VmaPoolCreateInfo::blockSize = 0.\nTo use this feature, set VmaAllocationCreateInfo::pool to the pointer to your custom pool and\nVmaAllocationCreateInfo::flags to #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT.\n\n\n\\section custom_memory_pools_MemTypeIndex Choosing memory type index\n\nWhen creating a pool, you must explicitly specify memory type index.\nTo find the one suitable for your buffers or images, you can use helper functions\nvmaFindMemoryTypeIndexForBufferInfo(), vmaFindMemoryTypeIndexForImageInfo().\nYou need to provide structures with example parameters of buffers or images\nthat you are going to create in that pool.\n\n\\code\nVkBufferCreateInfo exampleBufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };\nexampleBufCreateInfo.size = 1024; // Doesn't matter\nexampleBufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;\n\nVmaAllocationCreateInfo allocCreateInfo = {};\nallocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;\n\nuint32_t memTypeIndex;\nvmaFindMemoryTypeIndexForBufferInfo(allocator, &exampleBufCreateInfo, &allocCreateInfo, &memTypeIndex);\n\nVmaPoolCreateInfo poolCreateInfo = {};\npoolCreateInfo.memoryTypeIndex = memTypeIndex;\n// ...\n\\endcode\n\nWhen creating buffers/images allocated in that pool, provide following parameters:\n\n- `VkBufferCreateInfo`: Prefer to pass same parameters as above.\n  Otherwise you risk creating resources in a memory type that is not suitable for them, which may result in undefined behavior.\n  Using different `VK_BUFFER_USAGE_` flags may work, but you shouldn't create images in a pool intended for buffers\n  or the other way around.\n- VmaAllocationCreateInfo: You don't need to pass same parameters. Fill only `pool` member.\n  Other members are ignored anyway.\n\n\n\\section custom_memory_pools_when_not_use When not to use custom pools\n\nCustom pools are commonly overused by VMA users.\nWhile it may feel natural to keep some logical groups of resources separate in memory,\nin most cases it does more harm than good.\nUsing custom pool shouldn't be your first choice.\nInstead, please make all allocations from default pools first and only use custom pools\nif you can prove and measure that it is beneficial in some way,\ne.g. it results in lower memory usage, better performance, etc.\n\nUsing custom pools has disadvantages:\n\n- Each pool has its own collection of `VkDeviceMemory` blocks.\n  Some of them may be partially or even completely empty.\n  Spreading allocations across multiple pools increases the amount of wasted (allocated but unbound) memory.\n- You must manually choose specific memory type to be used by a custom pool (set as VmaPoolCreateInfo::memoryTypeIndex).\n  When using default pools, best memory type for each of your allocations can be selected automatically\n  using a carefully design algorithm that works across all kinds of GPUs.\n- If an allocation from a custom pool at specific memory type fails, entire allocation operation returns failure.\n  When using default pools, VMA tries another compatible memory type.\n- If you set VmaPoolCreateInfo::blockSize != 0, each memory block has the same size,\n  while default pools start from small blocks and only allocate next blocks larger and larger\n  up to the preferred block size.\n\nMany of the common concerns can be addressed in a different way than using custom pools:\n\n- If you want to keep your allocations of certain size (small versus large) or certain lifetime (transient versus long lived)\n  separate, you likely don't need to.\n  VMA uses a high quality allocation algorithm that manages memory well in various cases.\n  Please measure and check if using custom pools provides a benefit.\n- If you want to keep your images and buffers separate, you don't need to.\n  VMA respects `bufferImageGranularity` limit automatically.\n- If you want to keep your mapped and not mapped allocations separate, you don't need to.\n  VMA respects `nonCoherentAtomSize` limit automatically.\n  It also maps only those `VkDeviceMemory` blocks that need to map any allocation.\n  It even tries to keep mappable and non-mappable allocations in separate blocks to minimize the amount of mapped memory.\n- If you want to choose a custom size for the default memory block, you can set it globally instead\n  using VmaAllocatorCreateInfo::preferredLargeHeapBlockSize.\n- If you want to select specific memory type for your allocation,\n  you can set VmaAllocationCreateInfo::memoryTypeBits to `(1u << myMemoryTypeIndex)` instead.\n- If you need to create a buffer with certain minimum alignment, you can still do it\n  using default pools with dedicated function vmaCreateBufferWithAlignment().\n\n\n\\section linear_algorithm Linear allocation algorithm\n\nEach Vulkan memory block managed by this library has accompanying metadata that\nkeeps track of used and unused regions. By default, the metadata structure and\nalgorithm tries to find best place for new allocations among free regions to\noptimize memory usage. This way you can allocate and free objects in any order.\n\n![Default allocation algorithm](../gfx/Linear_allocator_1_algo_default.png)\n\nSometimes there is a need to use simpler, linear allocation algorithm. You can\ncreate custom pool that uses such algorithm by adding flag\n#VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT to VmaPoolCreateInfo::flags while creating\n#VmaPool object. Then an alternative metadata management is used. It always\ncreates new allocations after last one and doesn't reuse free regions after\nallocations freed in the middle. It results in better allocation performance and\nless memory consumed by metadata.\n\n![Linear allocation algorithm](../gfx/Linear_allocator_2_algo_linear.png)\n\nWith this one flag, you can create a custom pool that can be used in many ways:\nfree-at-once, stack, double stack, and ring buffer. See below for details.\nYou don't need to specify explicitly which of these options you are going to use - it is detected automatically.\n\n\\subsection linear_algorithm_free_at_once Free-at-once\n\nIn a pool that uses linear algorithm, you still need to free all the allocations\nindividually, e.g. by using vmaFreeMemory() or vmaDestroyBuffer(). You can free\nthem in any order. New allocations are always made after last one - free space\nin the middle is not reused. However, when you release all the allocation and\nthe pool becomes empty, allocation starts from the beginning again. This way you\ncan use linear algorithm to speed up creation of allocations that you are going\nto release all at once.\n\n![Free-at-once](../gfx/Linear_allocator_3_free_at_once.png)\n\nThis mode is also available for pools created with VmaPoolCreateInfo::maxBlockCount\nvalue that allows multiple memory blocks.\n\n\\subsection linear_algorithm_stack Stack\n\nWhen you free an allocation that was created last, its space can be reused.\nThanks to this, if you always release allocations in the order opposite to their\ncreation (LIFO - Last In First Out), you can achieve behavior of a stack.\n\n![Stack](../gfx/Linear_allocator_4_stack.png)\n\nThis mode is also available for pools created with VmaPoolCreateInfo::maxBlockCount\nvalue that allows multiple memory blocks.\n\n\\subsection linear_algorithm_double_stack Double stack\n\nThe space reserved by a custom pool with linear algorithm may be used by two\nstacks:\n\n- First, default one, growing up from offset 0.\n- Second, \"upper\" one, growing down from the end towards lower offsets.\n\nTo make allocation from the upper stack, add flag #VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT\nto VmaAllocationCreateInfo::flags.\n\n![Double stack](../gfx/Linear_allocator_7_double_stack.png)\n\nDouble stack is available only in pools with one memory block -\nVmaPoolCreateInfo::maxBlockCount must be 1. Otherwise behavior is undefined.\n\nWhen the two stacks' ends meet so there is not enough space between them for a\nnew allocation, such allocation fails with usual\n`VK_ERROR_OUT_OF_DEVICE_MEMORY` error.\n\n\\subsection linear_algorithm_ring_buffer Ring buffer\n\nWhen you free some allocations from the beginning and there is not enough free space\nfor a new one at the end of a pool, allocator's \"cursor\" wraps around to the\nbeginning and starts allocation there. Thanks to this, if you always release\nallocations in the same order as you created them (FIFO - First In First Out),\nyou can achieve behavior of a ring buffer / queue.\n\n![Ring buffer](../gfx/Linear_allocator_5_ring_buffer.png)\n\nRing buffer is available only in pools with one memory block -\nVmaPoolCreateInfo::maxBlockCount must be 1. Otherwise behavior is undefined.\n\n\\note \\ref defragmentation is not supported in custom pools created with #VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT.\n\n\n\\page defragmentation Defragmentation\n\nInterleaved allocations and deallocations of many objects of varying size can\ncause fragmentation over time, which can lead to a situation where the library is unable\nto find a continuous range of free memory for a new allocation despite there is\nenough free space, just scattered across many small free ranges between existing\nallocations.\n\nTo mitigate this problem, you can use defragmentation feature.\nIt doesn't happen automatically though and needs your cooperation,\nbecause VMA is a low level library that only allocates memory.\nIt cannot recreate buffers and images in a new place as it doesn't remember the contents of `VkBufferCreateInfo` / `VkImageCreateInfo` structures.\nIt cannot copy their contents as it doesn't record any commands to a command buffer.\n\nExample:\n\n\\code\nVmaDefragmentationInfo defragInfo = {};\ndefragInfo.pool = myPool;\ndefragInfo.flags = VMA_DEFRAGMENTATION_FLAG_ALGORITHM_FAST_BIT;\n\nVmaDefragmentationContext defragCtx;\nVkResult res = vmaBeginDefragmentation(allocator, &defragInfo, &defragCtx);\n// Check res...\n\nfor(;;)\n{\n    VmaDefragmentationPassMoveInfo pass;\n    res = vmaBeginDefragmentationPass(allocator, defragCtx, &pass);\n    if(res == VK_SUCCESS)\n        break;\n    else if(res != VK_INCOMPLETE)\n        // Handle error...\n\n    for(uint32_t i = 0; i < pass.moveCount; ++i)\n    {\n        // Inspect pass.pMoves[i].srcAllocation, identify what buffer/image it represents.\n        VmaAllocationInfo allocInfo;\n        vmaGetAllocationInfo(allocator, pass.pMoves[i].srcAllocation, &allocInfo);\n        MyEngineResourceData* resData = (MyEngineResourceData*)allocInfo.pUserData;\n\n        // Recreate and bind this buffer/image at: pass.pMoves[i].dstMemory, pass.pMoves[i].dstOffset.\n        VkImageCreateInfo imgCreateInfo = ...\n        VkImage newImg;\n        res = vkCreateImage(device, &imgCreateInfo, nullptr, &newImg);\n        // Check res...\n        res = vmaBindImageMemory(allocator, pass.pMoves[i].dstTmpAllocation, newImg);\n        // Check res...\n\n        // Issue a vkCmdCopyBuffer/vkCmdCopyImage to copy its content to the new place.\n        vkCmdCopyImage(cmdBuf, resData->img, ..., newImg, ...);\n    }\n\n    // Make sure the copy commands finished executing.\n    vkWaitForFences(...);\n\n    // Destroy old buffers/images bound with pass.pMoves[i].srcAllocation.\n    for(uint32_t i = 0; i < pass.moveCount; ++i)\n    {\n        // ...\n        vkDestroyImage(device, resData->img, nullptr);\n    }\n\n    // Update appropriate descriptors to point to the new places...\n\n    res = vmaEndDefragmentationPass(allocator, defragCtx, &pass);\n    if(res == VK_SUCCESS)\n        break;\n    else if(res != VK_INCOMPLETE)\n        // Handle error...\n}\n\nvmaEndDefragmentation(allocator, defragCtx, nullptr);\n\\endcode\n\nAlthough functions like vmaCreateBuffer(), vmaCreateImage(), vmaDestroyBuffer(), vmaDestroyImage()\ncreate/destroy an allocation and a buffer/image at once, these are just a shortcut for\ncreating the resource, allocating memory, and binding them together.\nDefragmentation works on memory allocations only. You must handle the rest manually.\nDefragmentation is an iterative process that should repreat \"passes\" as long as related functions\nreturn `VK_INCOMPLETE` not `VK_SUCCESS`.\nIn each pass:\n\n1. vmaBeginDefragmentationPass() function call:\n   - Calculates and returns the list of allocations to be moved in this pass.\n     Note this can be a time-consuming process.\n   - Reserves destination memory for them by creating temporary destination allocations\n     that you can query for their `VkDeviceMemory` + offset using vmaGetAllocationInfo().\n2. Inside the pass, **you should**:\n   - Inspect the returned list of allocations to be moved.\n   - Create new buffers/images and bind them at the returned destination temporary allocations.\n   - Copy data from source to destination resources if necessary.\n   - Destroy the source buffers/images, but NOT their allocations.\n3. vmaEndDefragmentationPass() function call:\n   - Frees the source memory reserved for the allocations that are moved.\n   - Modifies source #VmaAllocation objects that are moved to point to the destination reserved memory.\n   - Frees `VkDeviceMemory` blocks that became empty.\n\nUnlike in previous iterations of the defragmentation API, there is no list of \"movable\" allocations passed as a parameter.\nDefragmentation algorithm tries to move all suitable allocations.\nYou can, however, refuse to move some of them inside a defragmentation pass, by setting\n`pass.pMoves[i].operation` to #VMA_DEFRAGMENTATION_MOVE_OPERATION_IGNORE.\nThis is not recommended and may result in suboptimal packing of the allocations after defragmentation.\nIf you cannot ensure any allocation can be moved, it is better to keep movable allocations separate in a custom pool.\n\nInside a pass, for each allocation that should be moved:\n\n- You should copy its data from the source to the destination place by calling e.g. `vkCmdCopyBuffer()`, `vkCmdCopyImage()`.\n  - You need to make sure these commands finished executing before destroying the source buffers/images and before calling vmaEndDefragmentationPass().\n- If a resource doesn't contain any meaningful data, e.g. it is a transient color attachment image to be cleared,\n  filled, and used temporarily in each rendering frame, you can just recreate this image\n  without copying its data.\n- If the resource is in `HOST_VISIBLE` and `HOST_CACHED` memory, you can copy its data on the CPU\n  using `memcpy()`.\n- If you cannot move the allocation, you can set `pass.pMoves[i].operation` to #VMA_DEFRAGMENTATION_MOVE_OPERATION_IGNORE.\n  This will cancel the move.\n  - vmaEndDefragmentationPass() will then free the destination memory\n    not the source memory of the allocation, leaving it unchanged.\n- If you decide the allocation is unimportant and can be destroyed instead of moved (e.g. it wasn't used for long time),\n  you can set `pass.pMoves[i].operation` to #VMA_DEFRAGMENTATION_MOVE_OPERATION_DESTROY.\n  - vmaEndDefragmentationPass() will then free both source and destination memory, and will destroy the source #VmaAllocation object.\n\nYou can defragment a specific custom pool by setting VmaDefragmentationInfo::pool\n(like in the example above) or all the default pools by setting this member to null.\n\nDefragmentation is always performed in each pool separately.\nAllocations are never moved between different Vulkan memory types.\nThe size of the destination memory reserved for a moved allocation is the same as the original one.\nAlignment of an allocation as it was determined using `vkGetBufferMemoryRequirements()` etc. is also respected after defragmentation.\nBuffers/images should be recreated with the same `VkBufferCreateInfo` / `VkImageCreateInfo` parameters as the original ones.\n\nYou can perform the defragmentation incrementally to limit the number of allocations and bytes to be moved\nin each pass, e.g. to call it in sync with render frames and not to experience too big hitches.\nSee members: VmaDefragmentationInfo::maxBytesPerPass, VmaDefragmentationInfo::maxAllocationsPerPass.\n\nIt is also safe to perform the defragmentation asynchronously to render frames and other Vulkan and VMA\nusage, possibly from multiple threads, with the exception that allocations\nreturned in VmaDefragmentationPassMoveInfo::pMoves shouldn't be destroyed until the defragmentation pass is ended.\n\n<b>Mapping</b> is preserved on allocations that are moved during defragmentation.\nWhether through #VMA_ALLOCATION_CREATE_MAPPED_BIT or vmaMapMemory(), the allocations\nare mapped at their new place. Of course, pointer to the mapped data changes, so it needs to be queried\nusing VmaAllocationInfo::pMappedData.\n\n\\note Defragmentation is not supported in custom pools created with #VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT.\n\n\n\\page statistics Statistics\n\nThis library contains several functions that return information about its internal state,\nespecially the amount of memory allocated from Vulkan.\n\n\\section statistics_numeric_statistics Numeric statistics\n\nIf you need to obtain basic statistics about memory usage per heap, together with current budget,\nyou can call function vmaGetHeapBudgets() and inspect structure #VmaBudget.\nThis is useful to keep track of memory usage and stay within budget\n(see also \\ref staying_within_budget).\nExample:\n\n\\code\nuint32_t heapIndex = ...\n\nVmaBudget budgets[VK_MAX_MEMORY_HEAPS];\nvmaGetHeapBudgets(allocator, budgets);\n\nprintf(\"My heap currently has %u allocations taking %llu B,\\n\",\n    budgets[heapIndex].statistics.allocationCount,\n    budgets[heapIndex].statistics.allocationBytes);\nprintf(\"allocated out of %u Vulkan device memory blocks taking %llu B,\\n\",\n    budgets[heapIndex].statistics.blockCount,\n    budgets[heapIndex].statistics.blockBytes);\nprintf(\"Vulkan reports total usage %llu B with budget %llu B.\\n\",\n    budgets[heapIndex].usage,\n    budgets[heapIndex].budget);\n\\endcode\n\nYou can query for more detailed statistics per memory heap, type, and totals,\nincluding minimum and maximum allocation size and unused range size,\nby calling function vmaCalculateStatistics() and inspecting structure #VmaTotalStatistics.\nThis function is slower though, as it has to traverse all the internal data structures,\nso it should be used only for debugging purposes.\n\nYou can query for statistics of a custom pool using function vmaGetPoolStatistics()\nor vmaCalculatePoolStatistics().\n\nYou can query for information about a specific allocation using function vmaGetAllocationInfo().\nIt fill structure #VmaAllocationInfo.\n\n\\section statistics_json_dump JSON dump\n\nYou can dump internal state of the allocator to a string in JSON format using function vmaBuildStatsString().\nThe result is guaranteed to be correct JSON.\nIt uses ANSI encoding.\nAny strings provided by user (see [Allocation names](@ref allocation_names))\nare copied as-is and properly escaped for JSON, so if they use UTF-8, ISO-8859-2 or any other encoding,\nthis JSON string can be treated as using this encoding.\nIt must be freed using function vmaFreeStatsString().\n\nThe format of this JSON string is not part of official documentation of the library,\nbut it will not change in backward-incompatible way without increasing library major version number\nand appropriate mention in changelog.\n\nThe JSON string contains all the data that can be obtained using vmaCalculateStatistics().\nIt can also contain detailed map of allocated memory blocks and their regions -\nfree and occupied by allocations.\nThis allows e.g. to visualize the memory or assess fragmentation.\n\n\n\\page allocation_annotation Allocation names and user data\n\n\\section allocation_user_data Allocation user data\n\nYou can annotate allocations with your own information, e.g. for debugging purposes.\nTo do that, fill VmaAllocationCreateInfo::pUserData field when creating\nan allocation. It is an opaque `void*` pointer. You can use it e.g. as a pointer,\nsome handle, index, key, ordinal number or any other value that would associate\nthe allocation with your custom metadata.\nIt is useful to identify appropriate data structures in your engine given #VmaAllocation,\ne.g. when doing \\ref defragmentation.\n\n\\code\nVkBufferCreateInfo bufCreateInfo = ...\n\nMyBufferMetadata* pMetadata = CreateBufferMetadata();\n\nVmaAllocationCreateInfo allocCreateInfo = {};\nallocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;\nallocCreateInfo.pUserData = pMetadata;\n\nVkBuffer buffer;\nVmaAllocation allocation;\nvmaCreateBuffer(allocator, &bufCreateInfo, &allocCreateInfo, &buffer, &allocation, nullptr);\n\\endcode\n\nThe pointer may be later retrieved as VmaAllocationInfo::pUserData:\n\n\\code\nVmaAllocationInfo allocInfo;\nvmaGetAllocationInfo(allocator, allocation, &allocInfo);\nMyBufferMetadata* pMetadata = (MyBufferMetadata*)allocInfo.pUserData;\n\\endcode\n\nIt can also be changed using function vmaSetAllocationUserData().\n\nValues of (non-zero) allocations' `pUserData` are printed in JSON report created by\nvmaBuildStatsString() in hexadecimal form.\n\n\\section allocation_names Allocation names\n\nAn allocation can also carry a null-terminated string, giving a name to the allocation.\nTo set it, call vmaSetAllocationName().\nThe library creates internal copy of the string, so the pointer you pass doesn't need\nto be valid for whole lifetime of the allocation. You can free it after the call.\n\n\\code\nstd::string imageName = \"Texture: \";\nimageName += fileName;\nvmaSetAllocationName(allocator, allocation, imageName.c_str());\n\\endcode\n\nThe string can be later retrieved by inspecting VmaAllocationInfo::pName.\nIt is also printed in JSON report created by vmaBuildStatsString().\n\n\\note Setting string name to VMA allocation doesn't automatically set it to the Vulkan buffer or image created with it.\nYou must do it manually using an extension like VK_EXT_debug_utils, which is independent of this library.\n\n\n\\page virtual_allocator Virtual allocator\n\nAs an extra feature, the core allocation algorithm of the library is exposed through a simple and convenient API of \"virtual allocator\".\nIt doesn't allocate any real GPU memory. It just keeps track of used and free regions of a \"virtual block\".\nYou can use it to allocate your own memory or other objects, even completely unrelated to Vulkan.\nA common use case is sub-allocation of pieces of one large GPU buffer.\n\n\\section virtual_allocator_creating_virtual_block Creating virtual block\n\nTo use this functionality, there is no main \"allocator\" object.\nYou don't need to have #VmaAllocator object created.\nAll you need to do is to create a separate #VmaVirtualBlock object for each block of memory you want to be managed by the allocator:\n\n-# Fill in #VmaVirtualBlockCreateInfo structure.\n-# Call vmaCreateVirtualBlock(). Get new #VmaVirtualBlock object.\n\nExample:\n\n\\code\nVmaVirtualBlockCreateInfo blockCreateInfo = {};\nblockCreateInfo.size = 1048576; // 1 MB\n\nVmaVirtualBlock block;\nVkResult res = vmaCreateVirtualBlock(&blockCreateInfo, &block);\n\\endcode\n\n\\section virtual_allocator_making_virtual_allocations Making virtual allocations\n\n#VmaVirtualBlock object contains internal data structure that keeps track of free and occupied regions\nusing the same code as the main Vulkan memory allocator.\nSimilarly to #VmaAllocation for standard GPU allocations, there is #VmaVirtualAllocation type\nthat represents an opaque handle to an allocation within the virtual block.\n\nIn order to make such allocation:\n\n-# Fill in #VmaVirtualAllocationCreateInfo structure.\n-# Call vmaVirtualAllocate(). Get new #VmaVirtualAllocation object that represents the allocation.\n   You can also receive `VkDeviceSize offset` that was assigned to the allocation.\n\nExample:\n\n\\code\nVmaVirtualAllocationCreateInfo allocCreateInfo = {};\nallocCreateInfo.size = 4096; // 4 KB\n\nVmaVirtualAllocation alloc;\nVkDeviceSize offset;\nres = vmaVirtualAllocate(block, &allocCreateInfo, &alloc, &offset);\nif(res == VK_SUCCESS)\n{\n    // Use the 4 KB of your memory starting at offset.\n}\nelse\n{\n    // Allocation failed - no space for it could be found. Handle this error!\n}\n\\endcode\n\n\\section virtual_allocator_deallocation Deallocation\n\nWhen no longer needed, an allocation can be freed by calling vmaVirtualFree().\nYou can only pass to this function an allocation that was previously returned by vmaVirtualAllocate()\ncalled for the same #VmaVirtualBlock.\n\nWhen whole block is no longer needed, the block object can be released by calling vmaDestroyVirtualBlock().\nAll allocations must be freed before the block is destroyed, which is checked internally by an assert.\nHowever, if you don't want to call vmaVirtualFree() for each allocation, you can use vmaClearVirtualBlock() to free them all at once -\na feature not available in normal Vulkan memory allocator. Example:\n\n\\code\nvmaVirtualFree(block, alloc);\nvmaDestroyVirtualBlock(block);\n\\endcode\n\n\\section virtual_allocator_allocation_parameters Allocation parameters\n\nYou can attach a custom pointer to each allocation by using vmaSetVirtualAllocationUserData().\nIts default value is null.\nIt can be used to store any data that needs to be associated with that allocation - e.g. an index, a handle, or a pointer to some\nlarger data structure containing more information. Example:\n\n\\code\nstruct CustomAllocData\n{\n    std::string m_AllocName;\n};\nCustomAllocData* allocData = new CustomAllocData();\nallocData->m_AllocName = \"My allocation 1\";\nvmaSetVirtualAllocationUserData(block, alloc, allocData);\n\\endcode\n\nThe pointer can later be fetched, along with allocation offset and size, by passing the allocation handle to function\nvmaGetVirtualAllocationInfo() and inspecting returned structure #VmaVirtualAllocationInfo.\nIf you allocated a new object to be used as the custom pointer, don't forget to delete that object before freeing the allocation!\nExample:\n\n\\code\nVmaVirtualAllocationInfo allocInfo;\nvmaGetVirtualAllocationInfo(block, alloc, &allocInfo);\ndelete (CustomAllocData*)allocInfo.pUserData;\n\nvmaVirtualFree(block, alloc);\n\\endcode\n\n\\section virtual_allocator_alignment_and_units Alignment and units\n\nIt feels natural to express sizes and offsets in bytes.\nIf an offset of an allocation needs to be aligned to a multiply of some number (e.g. 4 bytes), you can fill optional member\nVmaVirtualAllocationCreateInfo::alignment to request it. Example:\n\n\\code\nVmaVirtualAllocationCreateInfo allocCreateInfo = {};\nallocCreateInfo.size = 4096; // 4 KB\nallocCreateInfo.alignment = 4; // Returned offset must be a multiply of 4 B\n\nVmaVirtualAllocation alloc;\nres = vmaVirtualAllocate(block, &allocCreateInfo, &alloc, nullptr);\n\\endcode\n\nAlignments of different allocations made from one block may vary.\nHowever, if all alignments and sizes are always multiply of some size e.g. 4 B or `sizeof(MyDataStruct)`,\nyou can express all sizes, alignments, and offsets in multiples of that size instead of individual bytes.\nIt might be more convenient, but you need to make sure to use this new unit consistently in all the places:\n\n- VmaVirtualBlockCreateInfo::size\n- VmaVirtualAllocationCreateInfo::size and VmaVirtualAllocationCreateInfo::alignment\n- Using offset returned by vmaVirtualAllocate() or in VmaVirtualAllocationInfo::offset\n\n\\section virtual_allocator_statistics Statistics\n\nYou can obtain statistics of a virtual block using vmaGetVirtualBlockStatistics()\n(to get brief statistics that are fast to calculate)\nor vmaCalculateVirtualBlockStatistics() (to get more detailed statistics, slower to calculate).\nThe functions fill structures #VmaStatistics, #VmaDetailedStatistics respectively - same as used by the normal Vulkan memory allocator.\nExample:\n\n\\code\nVmaStatistics stats;\nvmaGetVirtualBlockStatistics(block, &stats);\nprintf(\"My virtual block has %llu bytes used by %u virtual allocations\\n\",\n    stats.allocationBytes, stats.allocationCount);\n\\endcode\n\nYou can also request a full list of allocations and free regions as a string in JSON format by calling\nvmaBuildVirtualBlockStatsString().\nReturned string must be later freed using vmaFreeVirtualBlockStatsString().\nThe format of this string differs from the one returned by the main Vulkan allocator, but it is similar.\n\n\\section virtual_allocator_additional_considerations Additional considerations\n\nThe \"virtual allocator\" functionality is implemented on a level of individual memory blocks.\nKeeping track of a whole collection of blocks, allocating new ones when out of free space,\ndeleting empty ones, and deciding which one to try first for a new allocation must be implemented by the user.\n\nAlternative allocation algorithms are supported, just like in custom pools of the real GPU memory.\nSee enum #VmaVirtualBlockCreateFlagBits to learn how to specify them (e.g. #VMA_VIRTUAL_BLOCK_CREATE_LINEAR_ALGORITHM_BIT).\nYou can find their description in chapter \\ref custom_memory_pools.\nAllocation strategies are also supported.\nSee enum #VmaVirtualAllocationCreateFlagBits to learn how to specify them (e.g. #VMA_VIRTUAL_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT).\n\nFollowing features are supported only by the allocator of the real GPU memory and not by virtual allocations:\nbuffer-image granularity, `VMA_DEBUG_MARGIN`, `VMA_MIN_ALIGNMENT`.\n\n\n\\page debugging_memory_usage Debugging incorrect memory usage\n\nIf you suspect a bug with memory usage, like usage of uninitialized memory or\nmemory being overwritten out of bounds of an allocation,\nyou can use debug features of this library to verify this.\n\n\\section debugging_memory_usage_initialization Memory initialization\n\nIf you experience a bug with incorrect and nondeterministic data in your program and you suspect uninitialized memory to be used,\nyou can enable automatic memory initialization to verify this.\nTo do it, define macro `VMA_DEBUG_INITIALIZE_ALLOCATIONS` to 1.\n\n\\code\n#define VMA_DEBUG_INITIALIZE_ALLOCATIONS 1\n#include \"vk_mem_alloc.h\"\n\\endcode\n\nIt makes memory of new allocations initialized to bit pattern `0xDCDCDCDC`.\nBefore an allocation is destroyed, its memory is filled with bit pattern `0xEFEFEFEF`.\nMemory is automatically mapped and unmapped if necessary.\n\nIf you find these values while debugging your program, good chances are that you incorrectly\nread Vulkan memory that is allocated but not initialized, or already freed, respectively.\n\nMemory initialization works only with memory types that are `HOST_VISIBLE` and with allocations that can be mapped.\nIt works also with dedicated allocations.\n\n\\section debugging_memory_usage_margins Margins\n\nBy default, allocations are laid out in memory blocks next to each other if possible\n(considering required alignment, `bufferImageGranularity`, and `nonCoherentAtomSize`).\n\n![Allocations without margin](../gfx/Margins_1.png)\n\nDefine macro `VMA_DEBUG_MARGIN` to some non-zero value (e.g. 16) to enforce specified\nnumber of bytes as a margin after every allocation.\n\n\\code\n#define VMA_DEBUG_MARGIN 16\n#include \"vk_mem_alloc.h\"\n\\endcode\n\n![Allocations with margin](../gfx/Margins_2.png)\n\nIf your bug goes away after enabling margins, it means it may be caused by memory\nbeing overwritten outside of allocation boundaries. It is not 100% certain though.\nChange in application behavior may also be caused by different order and distribution\nof allocations across memory blocks after margins are applied.\n\nMargins work with all types of memory.\n\nMargin is applied only to allocations made out of memory blocks and not to dedicated\nallocations, which have their own memory block of specific size.\nIt is thus not applied to allocations made using #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT flag\nor those automatically decided to put into dedicated allocations, e.g. due to its\nlarge size or recommended by VK_KHR_dedicated_allocation extension.\n\nMargins appear in [JSON dump](@ref statistics_json_dump) as part of free space.\n\nNote that enabling margins increases memory usage and fragmentation.\n\nMargins do not apply to \\ref virtual_allocator.\n\n\\section debugging_memory_usage_corruption_detection Corruption detection\n\nYou can additionally define macro `VMA_DEBUG_DETECT_CORRUPTION` to 1 to enable validation\nof contents of the margins.\n\n\\code\n#define VMA_DEBUG_MARGIN 16\n#define VMA_DEBUG_DETECT_CORRUPTION 1\n#include \"vk_mem_alloc.h\"\n\\endcode\n\nWhen this feature is enabled, number of bytes specified as `VMA_DEBUG_MARGIN`\n(it must be multiply of 4) after every allocation is filled with a magic number.\nThis idea is also know as \"canary\".\nMemory is automatically mapped and unmapped if necessary.\n\nThis number is validated automatically when the allocation is destroyed.\nIf it is not equal to the expected value, `VMA_ASSERT()` is executed.\nIt clearly means that either CPU or GPU overwritten the memory outside of boundaries of the allocation,\nwhich indicates a serious bug.\n\nYou can also explicitly request checking margins of all allocations in all memory blocks\nthat belong to specified memory types by using function vmaCheckCorruption(),\nor in memory blocks that belong to specified custom pool, by using function\nvmaCheckPoolCorruption().\n\nMargin validation (corruption detection) works only for memory types that are\n`HOST_VISIBLE` and `HOST_COHERENT`.\n\n\n\\section debugging_memory_usage_leak_detection Leak detection features\n\nAt allocation and allocator destruction time VMA checks for unfreed and unmapped blocks using\n`VMA_ASSERT_LEAK()`. This macro defaults to an assertion, triggering a typically fatal error in Debug\nbuilds, and doing nothing in Release builds. You can provide your own definition of `VMA_ASSERT_LEAK()`\nto change this behavior.\n\nAt memory block destruction time VMA lists out all unfreed allocations using the `VMA_LEAK_LOG_FORMAT()`\nmacro, which defaults to `VMA_DEBUG_LOG_FORMAT`, which in turn defaults to a no-op.\nIf you're having trouble with leaks - for example, the aforementioned assertion triggers, but you don't\nquite know \\em why -, overriding this macro to print out the the leaking blocks, combined with assigning\nindividual names to allocations using vmaSetAllocationName(), can greatly aid in fixing them.\n\n\\page other_api_interop Interop with other graphics APIs\n\nVMA provides some features that help with interoperability with other graphics APIs, e.g. OpenGL.\n\n\\section opengl_interop_exporting_memory Exporting memory\n\nIf you want to attach `VkExportMemoryAllocateInfoKHR` or other structure to `pNext` chain of memory allocations made by the library:\n\nYou can create \\ref custom_memory_pools for such allocations.\nDefine and fill in your `VkExportMemoryAllocateInfoKHR` structure and attach it to VmaPoolCreateInfo::pMemoryAllocateNext\nwhile creating the custom pool.\nPlease note that the structure must remain alive and unchanged for the whole lifetime of the #VmaPool,\nnot only while creating it, as no copy of the structure is made,\nbut its original pointer is used for each allocation instead.\n\nIf you want to export all memory allocated by VMA from certain memory types,\nalso dedicated allocations or other allocations made from default pools,\nan alternative solution is to fill in VmaAllocatorCreateInfo::pTypeExternalMemoryHandleTypes.\nIt should point to an array with `VkExternalMemoryHandleTypeFlagsKHR` to be automatically passed by the library\nthrough `VkExportMemoryAllocateInfoKHR` on each allocation made from a specific memory type.\nPlease note that new versions of the library also support dedicated allocations created in custom pools.\n\nYou should not mix these two methods in a way that allows to apply both to the same memory type.\nOtherwise, `VkExportMemoryAllocateInfoKHR` structure would be attached twice to the `pNext` chain of `VkMemoryAllocateInfo`.\n\n\n\\section opengl_interop_custom_alignment Custom alignment\n\nBuffers or images exported to a different API like OpenGL may require a different alignment,\nhigher than the one used by the library automatically, queried from functions like `vkGetBufferMemoryRequirements`.\nTo impose such alignment:\n\nYou can create \\ref custom_memory_pools for such allocations.\nSet VmaPoolCreateInfo::minAllocationAlignment member to the minimum alignment required for each allocation\nto be made out of this pool.\nThe alignment actually used will be the maximum of this member and the alignment returned for the specific buffer or image\nfrom a function like `vkGetBufferMemoryRequirements`, which is called by VMA automatically.\n\nIf you want to create a buffer with a specific minimum alignment out of default pools,\nuse special function vmaCreateBufferWithAlignment(), which takes additional parameter `minAlignment`.\n\nNote the problem of alignment affects only resources placed inside bigger `VkDeviceMemory` blocks and not dedicated\nallocations, as these, by definition, always have alignment = 0 because the resource is bound to the beginning of its dedicated block.\nYou can ensure that an allocation is created as dedicated by using #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT.\nContrary to Direct3D 12, Vulkan doesn't have a concept of alignment of the entire memory block passed on its allocation.\n\n\\section opengl_interop_extended_allocation_information Extended allocation information\n\nIf you want to rely on VMA to allocate your buffers and images inside larger memory blocks,\nbut you need to know the size of the entire block and whether the allocation was made\nwith its own dedicated memory, use function vmaGetAllocationInfo2() to retrieve\nextended allocation information in structure #VmaAllocationInfo2.\n\n\n\n\\page usage_patterns Recommended usage patterns\n\nVulkan gives great flexibility in memory allocation.\nThis chapter shows the most common patterns.\n\nSee also slides from talk:\n[Sawicki, Adam. Advanced Graphics Techniques Tutorial: Memory management in Vulkan and DX12. Game Developers Conference, 2018](https://www.gdcvault.com/play/1025458/Advanced-Graphics-Techniques-Tutorial-New)\n\n\n\\section usage_patterns_gpu_only GPU-only resource\n\n<b>When:</b>\nAny resources that you frequently write and read on GPU,\ne.g. images used as color attachments (aka \"render targets\"), depth-stencil attachments,\nimages/buffers used as storage image/buffer (aka \"Unordered Access View (UAV)\").\n\n<b>What to do:</b>\nLet the library select the optimal memory type, which will likely have `VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT`.\n\n\\code\nVkImageCreateInfo imgCreateInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };\nimgCreateInfo.imageType = VK_IMAGE_TYPE_2D;\nimgCreateInfo.extent.width = 3840;\nimgCreateInfo.extent.height = 2160;\nimgCreateInfo.extent.depth = 1;\nimgCreateInfo.mipLevels = 1;\nimgCreateInfo.arrayLayers = 1;\nimgCreateInfo.format = VK_FORMAT_R8G8B8A8_UNORM;\nimgCreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL;\nimgCreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;\nimgCreateInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;\nimgCreateInfo.samples = VK_SAMPLE_COUNT_1_BIT;\n\nVmaAllocationCreateInfo allocCreateInfo = {};\nallocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;\nallocCreateInfo.flags = VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT;\nallocCreateInfo.priority = 1.0f;\n\nVkImage img;\nVmaAllocation alloc;\nvmaCreateImage(allocator, &imgCreateInfo, &allocCreateInfo, &img, &alloc, nullptr);\n\\endcode\n\n<b>Also consider:</b>\nConsider creating them as dedicated allocations using #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT,\nespecially if they are large or if you plan to destroy and recreate them with different sizes\ne.g. when display resolution changes.\nPrefer to create such resources first and all other GPU resources (like textures and vertex buffers) later.\nWhen VK_EXT_memory_priority extension is enabled, it is also worth setting high priority to such allocation\nto decrease chances to be evicted to system memory by the operating system.\n\n\\section usage_patterns_staging_copy_upload Staging copy for upload\n\n<b>When:</b>\nA \"staging\" buffer than you want to map and fill from CPU code, then use as a source of transfer\nto some GPU resource.\n\n<b>What to do:</b>\nUse flag #VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT.\nLet the library select the optimal memory type, which will always have `VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT`.\n\n\\code\nVkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };\nbufCreateInfo.size = 65536;\nbufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;\n\nVmaAllocationCreateInfo allocCreateInfo = {};\nallocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;\nallocCreateInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT |\n    VMA_ALLOCATION_CREATE_MAPPED_BIT;\n\nVkBuffer buf;\nVmaAllocation alloc;\nVmaAllocationInfo allocInfo;\nvmaCreateBuffer(allocator, &bufCreateInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);\n\n...\n\nmemcpy(allocInfo.pMappedData, myData, myDataSize);\n\\endcode\n\n<b>Also consider:</b>\nYou can map the allocation using vmaMapMemory() or you can create it as persistenly mapped\nusing #VMA_ALLOCATION_CREATE_MAPPED_BIT, as in the example above.\n\n\n\\section usage_patterns_readback Readback\n\n<b>When:</b>\nBuffers for data written by or transferred from the GPU that you want to read back on the CPU,\ne.g. results of some computations.\n\n<b>What to do:</b>\nUse flag #VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT.\nLet the library select the optimal memory type, which will always have `VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT`\nand `VK_MEMORY_PROPERTY_HOST_CACHED_BIT`.\n\n\\code\nVkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };\nbufCreateInfo.size = 65536;\nbufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;\n\nVmaAllocationCreateInfo allocCreateInfo = {};\nallocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;\nallocCreateInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT |\n    VMA_ALLOCATION_CREATE_MAPPED_BIT;\n\nVkBuffer buf;\nVmaAllocation alloc;\nVmaAllocationInfo allocInfo;\nvmaCreateBuffer(allocator, &bufCreateInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);\n\n...\n\nconst float* downloadedData = (const float*)allocInfo.pMappedData;\n\\endcode\n\n\n\\section usage_patterns_advanced_data_uploading Advanced data uploading\n\nFor resources that you frequently write on CPU via mapped pointer and\nfrequently read on GPU e.g. as a uniform buffer (also called \"dynamic\"), multiple options are possible:\n\n-# Easiest solution is to have one copy of the resource in `HOST_VISIBLE` memory,\n   even if it means system RAM (not `DEVICE_LOCAL`) on systems with a discrete graphics card,\n   and make the device reach out to that resource directly.\n   - Reads performed by the device will then go through PCI Express bus.\n     The performance of this access may be limited, but it may be fine depending on the size\n     of this resource (whether it is small enough to quickly end up in GPU cache) and the sparsity\n     of access.\n-# On systems with unified memory (e.g. AMD APU or Intel integrated graphics, mobile chips),\n   a memory type may be available that is both `HOST_VISIBLE` (available for mapping) and `DEVICE_LOCAL`\n   (fast to access from the GPU). Then, it is likely the best choice for such type of resource.\n-# Systems with a discrete graphics card and separate video memory may or may not expose\n   a memory type that is both `HOST_VISIBLE` and `DEVICE_LOCAL`, also known as Base Address Register (BAR).\n   If they do, it represents a piece of VRAM (or entire VRAM, if ReBAR is enabled in the motherboard BIOS)\n   that is available to CPU for mapping.\n   - Writes performed by the host to that memory go through PCI Express bus.\n     The performance of these writes may be limited, but it may be fine, especially on PCIe 4.0,\n     as long as rules of using uncached and write-combined memory are followed - only sequential writes and no reads.\n-# Finally, you may need or prefer to create a separate copy of the resource in `DEVICE_LOCAL` memory,\n   a separate \"staging\" copy in `HOST_VISIBLE` memory and perform an explicit transfer command between them.\n\nThankfully, VMA offers an aid to create and use such resources in the the way optimal\nfor the current Vulkan device. To help the library make the best choice,\nuse flag #VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT together with\n#VMA_ALLOCATION_CREATE_HOST_ACCESS_ALLOW_TRANSFER_INSTEAD_BIT.\nIt will then prefer a memory type that is both `DEVICE_LOCAL` and `HOST_VISIBLE` (integrated memory or BAR),\nbut if no such memory type is available or allocation from it fails\n(PC graphics cards have only 256 MB of BAR by default, unless ReBAR is supported and enabled in BIOS),\nit will fall back to `DEVICE_LOCAL` memory for fast GPU access.\nIt is then up to you to detect that the allocation ended up in a memory type that is not `HOST_VISIBLE`,\nso you need to create another \"staging\" allocation and perform explicit transfers.\n\n\\code\nVkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };\nbufCreateInfo.size = 65536;\nbufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;\n\nVmaAllocationCreateInfo allocCreateInfo = {};\nallocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;\nallocCreateInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT |\n    VMA_ALLOCATION_CREATE_HOST_ACCESS_ALLOW_TRANSFER_INSTEAD_BIT |\n    VMA_ALLOCATION_CREATE_MAPPED_BIT;\n\nVkBuffer buf;\nVmaAllocation alloc;\nVmaAllocationInfo allocInfo;\nVkResult result = vmaCreateBuffer(allocator, &bufCreateInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);\n// Check result...\n\nVkMemoryPropertyFlags memPropFlags;\nvmaGetAllocationMemoryProperties(allocator, alloc, &memPropFlags);\n\nif(memPropFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)\n{\n    // Allocation ended up in a mappable memory and is already mapped - write to it directly.\n\n    // [Executed in runtime]:\n    memcpy(allocInfo.pMappedData, myData, myDataSize);\n    result = vmaFlushAllocation(allocator, alloc, 0, VK_WHOLE_SIZE);\n    // Check result...\n\n    VkBufferMemoryBarrier bufMemBarrier = { VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER };\n    bufMemBarrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;\n    bufMemBarrier.dstAccessMask = VK_ACCESS_UNIFORM_READ_BIT;\n    bufMemBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n    bufMemBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n    bufMemBarrier.buffer = buf;\n    bufMemBarrier.offset = 0;\n    bufMemBarrier.size = VK_WHOLE_SIZE;\n\n    vkCmdPipelineBarrier(cmdBuf, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,\n        0, 0, nullptr, 1, &bufMemBarrier, 0, nullptr);\n}\nelse\n{\n    // Allocation ended up in a non-mappable memory - a transfer using a staging buffer is required.\n    VkBufferCreateInfo stagingBufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };\n    stagingBufCreateInfo.size = 65536;\n    stagingBufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;\n\n    VmaAllocationCreateInfo stagingAllocCreateInfo = {};\n    stagingAllocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;\n    stagingAllocCreateInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT |\n        VMA_ALLOCATION_CREATE_MAPPED_BIT;\n\n    VkBuffer stagingBuf;\n    VmaAllocation stagingAlloc;\n    VmaAllocationInfo stagingAllocInfo;\n    result = vmaCreateBuffer(allocator, &stagingBufCreateInfo, &stagingAllocCreateInfo,\n        &stagingBuf, &stagingAlloc, &stagingAllocInfo);\n    // Check result...\n\n    // [Executed in runtime]:\n    memcpy(stagingAllocInfo.pMappedData, myData, myDataSize);\n    result = vmaFlushAllocation(allocator, stagingAlloc, 0, VK_WHOLE_SIZE);\n    // Check result...\n\n    VkBufferMemoryBarrier bufMemBarrier = { VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER };\n    bufMemBarrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;\n    bufMemBarrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;\n    bufMemBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n    bufMemBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n    bufMemBarrier.buffer = stagingBuf;\n    bufMemBarrier.offset = 0;\n    bufMemBarrier.size = VK_WHOLE_SIZE;\n\n    vkCmdPipelineBarrier(cmdBuf, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,\n        0, 0, nullptr, 1, &bufMemBarrier, 0, nullptr);\n\n    VkBufferCopy bufCopy = {\n        0, // srcOffset\n        0, // dstOffset,\n        myDataSize, // size\n    };\n\n    vkCmdCopyBuffer(cmdBuf, stagingBuf, buf, 1, &bufCopy);\n\n    VkBufferMemoryBarrier bufMemBarrier2 = { VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER };\n    bufMemBarrier2.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;\n    bufMemBarrier2.dstAccessMask = VK_ACCESS_UNIFORM_READ_BIT; // We created a uniform buffer\n    bufMemBarrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n    bufMemBarrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n    bufMemBarrier2.buffer = buf;\n    bufMemBarrier2.offset = 0;\n    bufMemBarrier2.size = VK_WHOLE_SIZE;\n\n    vkCmdPipelineBarrier(cmdBuf, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,\n        0, 0, nullptr, 1, &bufMemBarrier2, 0, nullptr);\n}\n\\endcode\n\n\\section usage_patterns_other_use_cases Other use cases\n\nHere are some other, less obvious use cases and their recommended settings:\n\n- An image that is used only as transfer source and destination, but it should stay on the device,\n  as it is used to temporarily store a copy of some texture, e.g. from the current to the next frame,\n  for temporal antialiasing or other temporal effects.\n  - Use `VkImageCreateInfo::usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT`\n  - Use VmaAllocationCreateInfo::usage = #VMA_MEMORY_USAGE_AUTO\n- An image that is used only as transfer source and destination, but it should be placed\n  in the system RAM despite it doesn't need to be mapped, because it serves as a \"swap\" copy to evict\n  least recently used textures from VRAM.\n  - Use `VkImageCreateInfo::usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT`\n  - Use VmaAllocationCreateInfo::usage = #VMA_MEMORY_USAGE_AUTO_PREFER_HOST,\n    as VMA needs a hint here to differentiate from the previous case.\n- A buffer that you want to map and write from the CPU, directly read from the GPU\n  (e.g. as a uniform or vertex buffer), but you have a clear preference to place it in device or\n  host memory due to its large size.\n  - Use `VkBufferCreateInfo::usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT`\n  - Use VmaAllocationCreateInfo::usage = #VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE or #VMA_MEMORY_USAGE_AUTO_PREFER_HOST\n  - Use VmaAllocationCreateInfo::flags = #VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT\n\n\n\\page configuration Configuration\n\nPlease check \"CONFIGURATION SECTION\" in the code to find macros that you can define\nbefore each include of this file or change directly in this file to provide\nyour own implementation of basic facilities like assert, `min()` and `max()` functions,\nmutex, atomic etc.\n\nFor example, define `VMA_ASSERT(expr)` before including the library to provide\ncustom implementation of the assertion, compatible with your project.\nBy default it is defined to standard C `assert(expr)` in `_DEBUG` configuration\nand empty otherwise.\n\nSimilarly, you can define `VMA_LEAK_LOG_FORMAT` macro to enable printing of leaked (unfreed) allocations,\nincluding their names and other parameters. Example:\n\n\\code\n#define VMA_LEAK_LOG_FORMAT(format, ...) do { \\\n        printf((format), __VA_ARGS__); \\\n        printf(\"\\n\"); \\\n    } while(false)\n\\endcode\n\n\\section config_Vulkan_functions Pointers to Vulkan functions\n\nThere are multiple ways to import pointers to Vulkan functions in the library.\nIn the simplest case you don't need to do anything.\nIf the compilation or linking of your program or the initialization of the #VmaAllocator\ndoesn't work for you, you can try to reconfigure it.\n\nFirst, the allocator tries to fetch pointers to Vulkan functions linked statically,\nlike this:\n\n\\code\nm_VulkanFunctions.vkAllocateMemory = (PFN_vkAllocateMemory)vkAllocateMemory;\n\\endcode\n\nIf you want to disable this feature, set configuration macro: `#define VMA_STATIC_VULKAN_FUNCTIONS 0`.\n\nSecond, you can provide the pointers yourself by setting member VmaAllocatorCreateInfo::pVulkanFunctions.\nYou can fetch them e.g. using functions `vkGetInstanceProcAddr` and `vkGetDeviceProcAddr` or\nby using a helper library like [volk](https://github.com/zeux/volk).\n\nThird, VMA tries to fetch remaining pointers that are still null by calling\n`vkGetInstanceProcAddr` and `vkGetDeviceProcAddr` on its own.\nYou need to only fill in VmaVulkanFunctions::vkGetInstanceProcAddr and VmaVulkanFunctions::vkGetDeviceProcAddr.\nOther pointers will be fetched automatically.\nIf you want to disable this feature, set configuration macro: `#define VMA_DYNAMIC_VULKAN_FUNCTIONS 0`.\n\nFinally, all the function pointers required by the library (considering selected\nVulkan version and enabled extensions) are checked with `VMA_ASSERT` if they are not null.\n\n\n\\section custom_memory_allocator Custom host memory allocator\n\nIf you use custom allocator for CPU memory rather than default operator `new`\nand `delete` from C++, you can make this library using your allocator as well\nby filling optional member VmaAllocatorCreateInfo::pAllocationCallbacks. These\nfunctions will be passed to Vulkan, as well as used by the library itself to\nmake any CPU-side allocations.\n\n\\section allocation_callbacks Device memory allocation callbacks\n\nThe library makes calls to `vkAllocateMemory()` and `vkFreeMemory()` internally.\nYou can setup callbacks to be informed about these calls, e.g. for the purpose\nof gathering some statistics. To do it, fill optional member\nVmaAllocatorCreateInfo::pDeviceMemoryCallbacks.\n\n\\section heap_memory_limit Device heap memory limit\n\nWhen device memory of certain heap runs out of free space, new allocations may\nfail (returning error code) or they may succeed, silently pushing some existing_\nmemory blocks from GPU VRAM to system RAM (which degrades performance). This\nbehavior is implementation-dependent - it depends on GPU vendor and graphics\ndriver.\n\nOn AMD cards it can be controlled while creating Vulkan device object by using\nVK_AMD_memory_overallocation_behavior extension, if available.\n\nAlternatively, if you want to test how your program behaves with limited amount of Vulkan device\nmemory available without switching your graphics card to one that really has\nsmaller VRAM, you can use a feature of this library intended for this purpose.\nTo do it, fill optional member VmaAllocatorCreateInfo::pHeapSizeLimit.\n\n\n\n\\page vk_khr_dedicated_allocation VK_KHR_dedicated_allocation\n\nVK_KHR_dedicated_allocation is a Vulkan extension which can be used to improve\nperformance on some GPUs. It augments Vulkan API with possibility to query\ndriver whether it prefers particular buffer or image to have its own, dedicated\nallocation (separate `VkDeviceMemory` block) for better efficiency - to be able\nto do some internal optimizations. The extension is supported by this library.\nIt will be used automatically when enabled.\n\nIt has been promoted to core Vulkan 1.1, so if you use eligible Vulkan version\nand inform VMA about it by setting VmaAllocatorCreateInfo::vulkanApiVersion,\nyou are all set.\n\nOtherwise, if you want to use it as an extension:\n\n1 . When creating Vulkan device, check if following 2 device extensions are\nsupported (call `vkEnumerateDeviceExtensionProperties()`).\nIf yes, enable them (fill `VkDeviceCreateInfo::ppEnabledExtensionNames`).\n\n- VK_KHR_get_memory_requirements2\n- VK_KHR_dedicated_allocation\n\nIf you enabled these extensions:\n\n2 . Use #VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT flag when creating\nyour #VmaAllocator to inform the library that you enabled required extensions\nand you want the library to use them.\n\n\\code\nallocatorInfo.flags |= VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT;\n\nvmaCreateAllocator(&allocatorInfo, &allocator);\n\\endcode\n\nThat is all. The extension will be automatically used whenever you create a\nbuffer using vmaCreateBuffer() or image using vmaCreateImage().\n\nWhen using the extension together with Vulkan Validation Layer, you will receive\nwarnings like this:\n\n_vkBindBufferMemory(): Binding memory to buffer 0x33 but vkGetBufferMemoryRequirements() has not been called on that buffer._\n\nIt is OK, you should just ignore it. It happens because you use function\n`vkGetBufferMemoryRequirements2KHR()` instead of standard\n`vkGetBufferMemoryRequirements()`, while the validation layer seems to be\nunaware of it.\n\nTo learn more about this extension, see:\n\n- [VK_KHR_dedicated_allocation in Vulkan specification](https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/chap50.html#VK_KHR_dedicated_allocation)\n- [VK_KHR_dedicated_allocation unofficial manual](http://asawicki.info/articles/VK_KHR_dedicated_allocation.php5)\n\n\n\n\\page vk_ext_memory_priority VK_EXT_memory_priority\n\nVK_EXT_memory_priority is a device extension that allows to pass additional \"priority\"\nvalue to Vulkan memory allocations that the implementation may use prefer certain\nbuffers and images that are critical for performance to stay in device-local memory\nin cases when the memory is over-subscribed, while some others may be moved to the system memory.\n\nVMA offers convenient usage of this extension.\nIf you enable it, you can pass \"priority\" parameter when creating allocations or custom pools\nand the library automatically passes the value to Vulkan using this extension.\n\nIf you want to use this extension in connection with VMA, follow these steps:\n\n\\section vk_ext_memory_priority_initialization Initialization\n\n1) Call `vkEnumerateDeviceExtensionProperties` for the physical device.\nCheck if the extension is supported - if returned array of `VkExtensionProperties` contains \"VK_EXT_memory_priority\".\n\n2) Call `vkGetPhysicalDeviceFeatures2` for the physical device instead of old `vkGetPhysicalDeviceFeatures`.\nAttach additional structure `VkPhysicalDeviceMemoryPriorityFeaturesEXT` to `VkPhysicalDeviceFeatures2::pNext` to be returned.\nCheck if the device feature is really supported - check if `VkPhysicalDeviceMemoryPriorityFeaturesEXT::memoryPriority` is true.\n\n3) While creating device with `vkCreateDevice`, enable this extension - add \"VK_EXT_memory_priority\"\nto the list passed as `VkDeviceCreateInfo::ppEnabledExtensionNames`.\n\n4) While creating the device, also don't set `VkDeviceCreateInfo::pEnabledFeatures`.\nFill in `VkPhysicalDeviceFeatures2` structure instead and pass it as `VkDeviceCreateInfo::pNext`.\nEnable this device feature - attach additional structure `VkPhysicalDeviceMemoryPriorityFeaturesEXT` to\n`VkPhysicalDeviceFeatures2::pNext` chain and set its member `memoryPriority` to `VK_TRUE`.\n\n5) While creating #VmaAllocator with vmaCreateAllocator() inform VMA that you\nhave enabled this extension and feature - add #VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT\nto VmaAllocatorCreateInfo::flags.\n\n\\section vk_ext_memory_priority_usage Usage\n\nWhen using this extension, you should initialize following member:\n\n- VmaAllocationCreateInfo::priority when creating a dedicated allocation with #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT.\n- VmaPoolCreateInfo::priority when creating a custom pool.\n\nIt should be a floating-point value between `0.0f` and `1.0f`, where recommended default is `0.5f`.\nMemory allocated with higher value can be treated by the Vulkan implementation as higher priority\nand so it can have lower chances of being pushed out to system memory, experiencing degraded performance.\n\nIt might be a good idea to create performance-critical resources like color-attachment or depth-stencil images\nas dedicated and set high priority to them. For example:\n\n\\code\nVkImageCreateInfo imgCreateInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };\nimgCreateInfo.imageType = VK_IMAGE_TYPE_2D;\nimgCreateInfo.extent.width = 3840;\nimgCreateInfo.extent.height = 2160;\nimgCreateInfo.extent.depth = 1;\nimgCreateInfo.mipLevels = 1;\nimgCreateInfo.arrayLayers = 1;\nimgCreateInfo.format = VK_FORMAT_R8G8B8A8_UNORM;\nimgCreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL;\nimgCreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;\nimgCreateInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;\nimgCreateInfo.samples = VK_SAMPLE_COUNT_1_BIT;\n\nVmaAllocationCreateInfo allocCreateInfo = {};\nallocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;\nallocCreateInfo.flags = VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT;\nallocCreateInfo.priority = 1.0f;\n\nVkImage img;\nVmaAllocation alloc;\nvmaCreateImage(allocator, &imgCreateInfo, &allocCreateInfo, &img, &alloc, nullptr);\n\\endcode\n\n`priority` member is ignored in the following situations:\n\n- Allocations created in custom pools: They inherit the priority, along with all other allocation parameters\n  from the parameters passed in #VmaPoolCreateInfo when the pool was created.\n- Allocations created in default pools: They inherit the priority from the parameters\n  VMA used when creating default pools, which means `priority == 0.5f`.\n\n\n\\page vk_amd_device_coherent_memory VK_AMD_device_coherent_memory\n\nVK_AMD_device_coherent_memory is a device extension that enables access to\nadditional memory types with `VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD` and\n`VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD` flag. It is useful mostly for\nallocation of buffers intended for writing \"breadcrumb markers\" in between passes\nor draw calls, which in turn are useful for debugging GPU crash/hang/TDR cases.\n\nWhen the extension is available but has not been enabled, Vulkan physical device\nstill exposes those memory types, but their usage is forbidden. VMA automatically\ntakes care of that - it returns `VK_ERROR_FEATURE_NOT_PRESENT` when an attempt\nto allocate memory of such type is made.\n\nIf you want to use this extension in connection with VMA, follow these steps:\n\n\\section vk_amd_device_coherent_memory_initialization Initialization\n\n1) Call `vkEnumerateDeviceExtensionProperties` for the physical device.\nCheck if the extension is supported - if returned array of `VkExtensionProperties` contains \"VK_AMD_device_coherent_memory\".\n\n2) Call `vkGetPhysicalDeviceFeatures2` for the physical device instead of old `vkGetPhysicalDeviceFeatures`.\nAttach additional structure `VkPhysicalDeviceCoherentMemoryFeaturesAMD` to `VkPhysicalDeviceFeatures2::pNext` to be returned.\nCheck if the device feature is really supported - check if `VkPhysicalDeviceCoherentMemoryFeaturesAMD::deviceCoherentMemory` is true.\n\n3) While creating device with `vkCreateDevice`, enable this extension - add \"VK_AMD_device_coherent_memory\"\nto the list passed as `VkDeviceCreateInfo::ppEnabledExtensionNames`.\n\n4) While creating the device, also don't set `VkDeviceCreateInfo::pEnabledFeatures`.\nFill in `VkPhysicalDeviceFeatures2` structure instead and pass it as `VkDeviceCreateInfo::pNext`.\nEnable this device feature - attach additional structure `VkPhysicalDeviceCoherentMemoryFeaturesAMD` to\n`VkPhysicalDeviceFeatures2::pNext` and set its member `deviceCoherentMemory` to `VK_TRUE`.\n\n5) While creating #VmaAllocator with vmaCreateAllocator() inform VMA that you\nhave enabled this extension and feature - add #VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT\nto VmaAllocatorCreateInfo::flags.\n\n\\section vk_amd_device_coherent_memory_usage Usage\n\nAfter following steps described above, you can create VMA allocations and custom pools\nout of the special `DEVICE_COHERENT` and `DEVICE_UNCACHED` memory types on eligible\ndevices. There are multiple ways to do it, for example:\n\n- You can request or prefer to allocate out of such memory types by adding\n  `VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD` to VmaAllocationCreateInfo::requiredFlags\n  or VmaAllocationCreateInfo::preferredFlags. Those flags can be freely mixed with\n  other ways of \\ref choosing_memory_type, like setting VmaAllocationCreateInfo::usage.\n- If you manually found memory type index to use for this purpose, force allocation\n  from this specific index by setting VmaAllocationCreateInfo::memoryTypeBits `= 1u << index`.\n\n\\section vk_amd_device_coherent_memory_more_information More information\n\nTo learn more about this extension, see [VK_AMD_device_coherent_memory in Vulkan specification](https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_AMD_device_coherent_memory.html)\n\nExample use of this extension can be found in the code of the sample and test suite\naccompanying this library.\n\n\n\\page vk_khr_external_memory_win32 VK_KHR_external_memory_win32\n\nOn Windows, the VK_KHR_external_memory_win32 device extension allows exporting a Win32 `HANDLE`\nof a `VkDeviceMemory` block, to be able to reference the memory on other Vulkan logical devices or instances,\nin multiple processes, and/or in multiple APIs.\nVMA offers support for it.\n\n\\section vk_khr_external_memory_win32_initialization Initialization\n\n1) Make sure the extension is defined in the code by including following header before including VMA:\n\n\\code\n#include <vulkan/vulkan_win32.h>\n\\endcode\n\n2) Check if \"VK_KHR_external_memory_win32\" is available among device extensions.\nEnable it when creating the `VkDevice` object.\n\n3) Enable the usage of this extension in VMA by setting flag #VMA_ALLOCATOR_CREATE_KHR_EXTERNAL_MEMORY_WIN32_BIT\nwhen calling vmaCreateAllocator().\n\n4) Make sure that VMA has access to the `vkGetMemoryWin32HandleKHR` function by either enabling `VMA_DYNAMIC_VULKAN_FUNCTIONS` macro\nor setting VmaVulkanFunctions::vkGetMemoryWin32HandleKHR explicitly.\nFor more information, see \\ref quick_start_initialization_importing_vulkan_functions.\n\n\\section vk_khr_external_memory_win32_preparations Preparations\n\nYou can find example usage among tests, in file \"Tests.cpp\", function `TestWin32Handles()`.\n\nTo use the extenion, buffers need to be created with `VkExternalMemoryBufferCreateInfoKHR` attached to their `pNext` chain,\nand memory allocations need to be made with `VkExportMemoryAllocateInfoKHR` attached to their `pNext` chain.\nTo make use of them, you need to use \\ref custom_memory_pools. Example:\n\n\\code\n// Define an example buffer and allocation parameters.\nVkExternalMemoryBufferCreateInfoKHR externalMemBufCreateInfo = {\n    VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR,\n    nullptr,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT\n};\nVkBufferCreateInfo exampleBufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };\nexampleBufCreateInfo.size = 0x10000; // Doesn't matter here.\nexampleBufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;\nexampleBufCreateInfo.pNext = &externalMemBufCreateInfo;\n\nVmaAllocationCreateInfo exampleAllocCreateInfo = {};\nexampleAllocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;\n\n// Find memory type index to use for the custom pool.\nuint32_t memTypeIndex;\nVkResult res = vmaFindMemoryTypeIndexForBufferInfo(g_Allocator,\n    &exampleBufCreateInfo, &exampleAllocCreateInfo, &memTypeIndex);\n// Check res...\n\n// Create a custom pool.\nconstexpr static VkExportMemoryAllocateInfoKHR exportMemAllocInfo = {\n    VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR,\n    nullptr,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT\n};\nVmaPoolCreateInfo poolCreateInfo = {};\npoolCreateInfo.memoryTypeIndex = memTypeIndex;\npoolCreateInfo.pMemoryAllocateNext = (void*)&exportMemAllocInfo;\n\nVmaPool pool;\nres = vmaCreatePool(g_Allocator, &poolCreateInfo, &pool);\n// Check res...\n\n// YOUR OTHER CODE COMES HERE....\n\n// At the end, don't forget to destroy it!\nvmaDestroyPool(g_Allocator, pool);\n\\endcode\n\nNote that the structure passed as VmaPoolCreateInfo::pMemoryAllocateNext must remain alive and unchanged\nfor the whole lifetime of the custom pool, because it will be used when the pool allocates a new device memory block.\nNo copy is made internally. This is why variable `exportMemAllocInfo` is defined as `static`.\n\n\\section vk_khr_external_memory_win32_memory_allocation Memory allocation\n\nFinally, you can create a buffer with an allocation out of the custom pool.\nThe buffer should use same flags as the sample buffer used to find the memory type.\nIt should also specify `VkExternalMemoryBufferCreateInfoKHR` in its `pNext` chain.\n\n\\code\nVkExternalMemoryBufferCreateInfoKHR externalMemBufCreateInfo = {\n    VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR,\n    nullptr,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT\n};\nVkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };\nbufCreateInfo.size = // Your desired buffer size.\nbufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;\nbufCreateInfo.pNext = &externalMemBufCreateInfo;\n\nVmaAllocationCreateInfo allocCreateInfo = {};\nallocCreateInfo.pool = pool;  // It is enough to set this one member.\n\nVkBuffer buf;\nVmaAllocation alloc;\nres = vmaCreateBuffer(g_Allocator, &bufCreateInfo, &allocCreateInfo, &buf, &alloc, nullptr);\n// Check res...\n\n// YOUR OTHER CODE COMES HERE....\n\n// At the end, don't forget to destroy it!\nvmaDestroyBuffer(g_Allocator, buf, alloc);\n\\endcode\n\nIf you need each allocation to have its own device memory block and start at offset 0, you can still do \nby using #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT flag. It works also with custom pools.\n\n\\section vk_khr_external_memory_win32_exporting_win32_handle Exporting Win32 handle\n\nAfter the allocation is created, you can acquire a Win32 `HANDLE` to the `VkDeviceMemory` block it belongs to.\nVMA function vmaGetMemoryWin32Handle() is a replacement of the Vulkan function `vkGetMemoryWin32HandleKHR`.\n\n\\code\nHANDLE handle;\nres = vmaGetMemoryWin32Handle(g_Allocator, alloc, nullptr, &handle);\n// Check res...\n\n// YOUR OTHER CODE COMES HERE....\n\n// At the end, you must close the handle.\nCloseHandle(handle);\n\\endcode\n\nDocumentation of the VK_KHR_external_memory_win32 extension states that:\n\n> If handleType is defined as an NT handle, vkGetMemoryWin32HandleKHR must be called no more than once for each valid unique combination of memory and handleType.\n\nThis is ensured automatically inside VMA.\nThe library fetches the handle on first use, remembers it internally, and closes it when the memory block or dedicated allocation is destroyed.\nEvery time you call vmaGetMemoryWin32Handle(), VMA calls `DuplicateHandle` and returns a new handle that you need to close.\n\nFor further information, please check documentation of the vmaGetMemoryWin32Handle() function.\n\n\n\\page enabling_buffer_device_address Enabling buffer device address\n\nDevice extension VK_KHR_buffer_device_address\nallow to fetch raw GPU pointer to a buffer and pass it for usage in a shader code.\nIt has been promoted to core Vulkan 1.2.\n\nIf you want to use this feature in connection with VMA, follow these steps:\n\n\\section enabling_buffer_device_address_initialization Initialization\n\n1) (For Vulkan version < 1.2) Call `vkEnumerateDeviceExtensionProperties` for the physical device.\nCheck if the extension is supported - if returned array of `VkExtensionProperties` contains\n\"VK_KHR_buffer_device_address\".\n\n2) Call `vkGetPhysicalDeviceFeatures2` for the physical device instead of old `vkGetPhysicalDeviceFeatures`.\nAttach additional structure `VkPhysicalDeviceBufferDeviceAddressFeatures*` to `VkPhysicalDeviceFeatures2::pNext` to be returned.\nCheck if the device feature is really supported - check if `VkPhysicalDeviceBufferDeviceAddressFeatures::bufferDeviceAddress` is true.\n\n3) (For Vulkan version < 1.2) While creating device with `vkCreateDevice`, enable this extension - add\n\"VK_KHR_buffer_device_address\" to the list passed as `VkDeviceCreateInfo::ppEnabledExtensionNames`.\n\n4) While creating the device, also don't set `VkDeviceCreateInfo::pEnabledFeatures`.\nFill in `VkPhysicalDeviceFeatures2` structure instead and pass it as `VkDeviceCreateInfo::pNext`.\nEnable this device feature - attach additional structure `VkPhysicalDeviceBufferDeviceAddressFeatures*` to\n`VkPhysicalDeviceFeatures2::pNext` and set its member `bufferDeviceAddress` to `VK_TRUE`.\n\n5) While creating #VmaAllocator with vmaCreateAllocator() inform VMA that you\nhave enabled this feature - add #VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT\nto VmaAllocatorCreateInfo::flags.\n\n\\section enabling_buffer_device_address_usage Usage\n\nAfter following steps described above, you can create buffers with `VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT*` using VMA.\nThe library automatically adds `VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT*` to\nallocated memory blocks wherever it might be needed.\n\nPlease note that the library supports only `VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT*`.\nThe second part of this functionality related to \"capture and replay\" is not supported,\nas it is intended for usage in debugging tools like RenderDoc, not in everyday Vulkan usage.\n\n\\section enabling_buffer_device_address_more_information More information\n\nTo learn more about this extension, see [VK_KHR_buffer_device_address in Vulkan specification](https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/chap46.html#VK_KHR_buffer_device_address)\n\nExample use of this extension can be found in the code of the sample and test suite\naccompanying this library.\n\n\\page general_considerations General considerations\n\n\\section general_considerations_thread_safety Thread safety\n\n- The library has no global state, so separate #VmaAllocator objects can be used\n  independently.\n  There should be no need to create multiple such objects though - one per `VkDevice` is enough.\n- By default, all calls to functions that take #VmaAllocator as first parameter\n  are safe to call from multiple threads simultaneously because they are\n  synchronized internally when needed.\n  This includes allocation and deallocation from default memory pool, as well as custom #VmaPool.\n- When the allocator is created with #VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT\n  flag, calls to functions that take such #VmaAllocator object must be\n  synchronized externally.\n- Access to a #VmaAllocation object must be externally synchronized. For example,\n  you must not call vmaGetAllocationInfo() and vmaMapMemory() from different\n  threads at the same time if you pass the same #VmaAllocation object to these\n  functions.\n- #VmaVirtualBlock is not safe to be used from multiple threads simultaneously.\n\n\\section general_considerations_versioning_and_compatibility Versioning and compatibility\n\nThe library uses [**Semantic Versioning**](https://semver.org/),\nwhich means version numbers follow convention: Major.Minor.Patch (e.g. 2.3.0), where:\n\n- Incremented Patch version means a release is backward- and forward-compatible,\n  introducing only some internal improvements, bug fixes, optimizations etc.\n  or changes that are out of scope of the official API described in this documentation.\n- Incremented Minor version means a release is backward-compatible,\n  so existing code that uses the library should continue to work, while some new\n  symbols could have been added: new structures, functions, new values in existing\n  enums and bit flags, new structure members, but not new function parameters.\n- Incrementing Major version means a release could break some backward compatibility.\n\nAll changes between official releases are documented in file \"CHANGELOG.md\".\n\n\\warning Backward compatibility is considered on the level of C++ source code, not binary linkage.\nAdding new members to existing structures is treated as backward compatible if initializing\nthe new members to binary zero results in the old behavior.\nYou should always fully initialize all library structures to zeros and not rely on their\nexact binary size.\n\n\\section general_considerations_validation_layer_warnings Validation layer warnings\n\nWhen using this library, you can meet following types of warnings issued by\nVulkan validation layer. They don't necessarily indicate a bug, so you may need\nto just ignore them.\n\n- *vkBindBufferMemory(): Binding memory to buffer 0xeb8e4 but vkGetBufferMemoryRequirements() has not been called on that buffer.*\n  - It happens when VK_KHR_dedicated_allocation extension is enabled.\n    `vkGetBufferMemoryRequirements2KHR` function is used instead, while validation layer seems to be unaware of it.\n- *Mapping an image with layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL can result in undefined behavior if this memory is used by the device. Only GENERAL or PREINITIALIZED should be used.*\n  - It happens when you map a buffer or image, because the library maps entire\n    `VkDeviceMemory` block, where different types of images and buffers may end\n    up together, especially on GPUs with unified memory like Intel.\n- *Non-linear image 0xebc91 is aliased with linear buffer 0xeb8e4 which may indicate a bug.*\n  - It may happen when you use [defragmentation](@ref defragmentation).\n\n\\section general_considerations_allocation_algorithm Allocation algorithm\n\nThe library uses following algorithm for allocation, in order:\n\n-# Try to find free range of memory in existing blocks.\n-# If failed, try to create a new block of `VkDeviceMemory`, with preferred block size.\n-# If failed, try to create such block with size / 2, size / 4, size / 8.\n-# If failed, try to allocate separate `VkDeviceMemory` for this allocation,\n   just like when you use #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT.\n-# If failed, choose other memory type that meets the requirements specified in\n   VmaAllocationCreateInfo and go to point 1.\n-# If failed, return `VK_ERROR_OUT_OF_DEVICE_MEMORY`.\n\n\\section general_considerations_features_not_supported Features not supported\n\nFeatures deliberately excluded from the scope of this library:\n\n-# **Data transfer.** Uploading (streaming) and downloading data of buffers and images\n   between CPU and GPU memory and related synchronization is responsibility of the user.\n   Defining some \"texture\" object that would automatically stream its data from a\n   staging copy in CPU memory to GPU memory would rather be a feature of another,\n   higher-level library implemented on top of VMA.\n   VMA doesn't record any commands to a `VkCommandBuffer`. It just allocates memory.\n-# **Recreation of buffers and images.** Although the library has functions for\n   buffer and image creation: vmaCreateBuffer(), vmaCreateImage(), you need to\n   recreate these objects yourself after defragmentation. That is because the big\n   structures `VkBufferCreateInfo`, `VkImageCreateInfo` are not stored in\n   #VmaAllocation object.\n-# **Handling CPU memory allocation failures.** When dynamically creating small C++\n   objects in CPU memory (not Vulkan memory), allocation failures are not checked\n   and handled gracefully, because that would complicate code significantly and\n   is usually not needed in desktop PC applications anyway.\n   Success of an allocation is just checked with an assert.\n-# **Code free of any compiler warnings.** Maintaining the library to compile and\n   work correctly on so many different platforms is hard enough. Being free of\n   any warnings, on any version of any compiler, is simply not feasible.\n   There are many preprocessor macros that make some variables unused, function parameters unreferenced,\n   or conditional expressions constant in some configurations.\n   The code of this library should not be bigger or more complicated just to silence these warnings.\n   It is recommended to disable such warnings instead.\n-# This is a C++ library with C interface. **Bindings or ports to any other programming languages** are welcome as external projects but\n   are not going to be included into this repository.\n*/\n"
  },
  {
    "path": "src/libraries/volk/volk.c",
    "content": "/* This file is part of volk library; see volk.h for version/license details */\n/* clang-format off */\n#include \"volk.h\"\n\n#ifdef _WIN32\n\ttypedef const char* LPCSTR;\n\ttypedef struct HINSTANCE__* HINSTANCE;\n\ttypedef HINSTANCE HMODULE;\n\t#if defined(_MINWINDEF_)\n\t\t/* minwindef.h defines FARPROC, and attempting to redefine it may conflict with -Wstrict-prototypes */\n\t#elif defined(_WIN64)\n\t\ttypedef __int64 (__stdcall* FARPROC)(void);\n\t#else\n\t\ttypedef int (__stdcall* FARPROC)(void);\n\t#endif\n#else\n#\tinclude <dlfcn.h>\n#endif\n\n#ifdef __APPLE__\n#\tinclude <stdlib.h>\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef _WIN32\n__declspec(dllimport) HMODULE __stdcall LoadLibraryA(LPCSTR);\n__declspec(dllimport) FARPROC __stdcall GetProcAddress(HMODULE, LPCSTR);\n__declspec(dllimport) int __stdcall FreeLibrary(HMODULE);\n#endif\n\n#if defined(__GNUC__)\n#    define VOLK_DISABLE_GCC_PEDANTIC_WARNINGS \\\n\t\t_Pragma(\"GCC diagnostic push\") \\\n\t\t_Pragma(\"GCC diagnostic ignored \\\"-Wpedantic\\\"\")\n#    define VOLK_RESTORE_GCC_PEDANTIC_WARNINGS \\\n\t\t_Pragma(\"GCC diagnostic pop\")\n#else\n#    define VOLK_DISABLE_GCC_PEDANTIC_WARNINGS\n#    define VOLK_RESTORE_GCC_PEDANTIC_WARNINGS\n#endif\n\nstatic void* loadedModule = NULL;\nstatic VkInstance loadedInstance = VK_NULL_HANDLE;\nstatic VkDevice loadedDevice = VK_NULL_HANDLE;\n\nstatic void volkGenLoadLoader(void* context, PFN_vkVoidFunction (*load)(void*, const char*));\nstatic void volkGenLoadInstance(void* context, PFN_vkVoidFunction (*load)(void*, const char*));\nstatic void volkGenLoadDevice(void* context, PFN_vkVoidFunction (*load)(void*, const char*));\nstatic void volkGenLoadDeviceTable(struct VolkDeviceTable* table, void* context, PFN_vkVoidFunction (*load)(void*, const char*));\n\nstatic PFN_vkVoidFunction vkGetInstanceProcAddrStub(void* context, const char* name)\n{\n\treturn vkGetInstanceProcAddr((VkInstance)context, name);\n}\n\nstatic PFN_vkVoidFunction vkGetDeviceProcAddrStub(void* context, const char* name)\n{\n\treturn vkGetDeviceProcAddr((VkDevice)context, name);\n}\n\nstatic PFN_vkVoidFunction nullProcAddrStub(void* context, const char* name)\n{\n\t(void)context;\n\t(void)name;\n\treturn NULL;\n}\n\nVkResult volkInitialize(void)\n{\n#if defined(_WIN32)\n\tHMODULE module = LoadLibraryA(\"vulkan-1.dll\");\n\tif (!module)\n\t\treturn VK_ERROR_INITIALIZATION_FAILED;\n\n\t// note: function pointer is cast through void function pointer to silence cast-function-type warning on gcc8\n\tvkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)(void(*)(void))GetProcAddress(module, \"vkGetInstanceProcAddr\");\n#elif defined(__APPLE__)\n\tvoid* module = dlopen(\"libvulkan.dylib\", RTLD_NOW | RTLD_LOCAL);\n\tif (!module)\n\t\tmodule = dlopen(\"libvulkan.1.dylib\", RTLD_NOW | RTLD_LOCAL);\n\tif (!module)\n\t\tmodule = dlopen(\"libMoltenVK.dylib\", RTLD_NOW | RTLD_LOCAL);\n    // Add support for using Vulkan and MoltenVK in a Framework. App store rules for iOS\n    // strictly enforce no .dylib's. If they aren't found it just falls through\n    if (!module)\n        module = dlopen(\"vulkan.framework/vulkan\", RTLD_NOW | RTLD_LOCAL);\n    if (!module)\n        module = dlopen(\"MoltenVK.framework/MoltenVK\", RTLD_NOW | RTLD_LOCAL);\n\t// modern versions of macOS don't search /usr/local/lib automatically contrary to what man dlopen says\n\t// Vulkan SDK uses this as the system-wide installation location, so we're going to fallback to this if all else fails\n\tif (!module && getenv(\"DYLD_FALLBACK_LIBRARY_PATH\") == NULL)\n\t\tmodule = dlopen(\"/usr/local/lib/libvulkan.dylib\", RTLD_NOW | RTLD_LOCAL);\n\tif (!module)\n\t\treturn VK_ERROR_INITIALIZATION_FAILED;\n\n\tvkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)dlsym(module, \"vkGetInstanceProcAddr\");\n#else\n\tvoid* module = dlopen(\"libvulkan.so.1\", RTLD_NOW | RTLD_LOCAL);\n\tif (!module)\n\t\tmodule = dlopen(\"libvulkan.so\", RTLD_NOW | RTLD_LOCAL);\n\tif (!module)\n\t\treturn VK_ERROR_INITIALIZATION_FAILED;\n\tVOLK_DISABLE_GCC_PEDANTIC_WARNINGS\n\tvkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)dlsym(module, \"vkGetInstanceProcAddr\");\n\tVOLK_RESTORE_GCC_PEDANTIC_WARNINGS\n#endif\n\n\tloadedModule = module;\n\tvolkGenLoadLoader(NULL, vkGetInstanceProcAddrStub);\n\n\treturn VK_SUCCESS;\n}\n\nvoid volkInitializeCustom(PFN_vkGetInstanceProcAddr handler)\n{\n\tvkGetInstanceProcAddr = handler;\n\n\tloadedModule = NULL;\n\tvolkGenLoadLoader(NULL, vkGetInstanceProcAddrStub);\n}\n\nvoid volkFinalize(void)\n{\n\tif (loadedModule)\n\t{\n#if defined(_WIN32)\n\t\tFreeLibrary((HMODULE)loadedModule);\n#else\n\t\tdlclose(loadedModule);\n#endif\n\t}\n\n\tvkGetInstanceProcAddr = NULL;\n\tvolkGenLoadLoader(NULL, nullProcAddrStub);\n\tvolkGenLoadInstance(NULL, nullProcAddrStub);\n\tvolkGenLoadDevice(NULL, nullProcAddrStub);\n\n\tloadedModule = NULL;\n\tloadedInstance = VK_NULL_HANDLE;\n\tloadedDevice = VK_NULL_HANDLE;\n}\n\nuint32_t volkGetInstanceVersion(void)\n{\n#if defined(VK_VERSION_1_1)\n\tuint32_t apiVersion = 0;\n\tif (vkEnumerateInstanceVersion && vkEnumerateInstanceVersion(&apiVersion) == VK_SUCCESS)\n\t\treturn apiVersion;\n#endif\n\n\tif (vkCreateInstance)\n\t\treturn VK_API_VERSION_1_0;\n\n\treturn 0;\n}\n\nvoid volkLoadInstance(VkInstance instance)\n{\n\tloadedInstance = instance;\n\tvolkGenLoadInstance(instance, vkGetInstanceProcAddrStub);\n\tvolkGenLoadDevice(instance, vkGetInstanceProcAddrStub);\n}\n\nvoid volkLoadInstanceOnly(VkInstance instance)\n{\n\tloadedInstance = instance;\n\tvolkGenLoadInstance(instance, vkGetInstanceProcAddrStub);\n}\n\nVkInstance volkGetLoadedInstance(void)\n{\n\treturn loadedInstance;\n}\n\nvoid volkLoadDevice(VkDevice device)\n{\n\tloadedDevice = device;\n\tvolkGenLoadDevice(device, vkGetDeviceProcAddrStub);\n}\n\nVkDevice volkGetLoadedDevice(void)\n{\n\treturn loadedDevice;\n}\n\nvoid volkLoadDeviceTable(struct VolkDeviceTable* table, VkDevice device)\n{\n\tvolkGenLoadDeviceTable(table, device, vkGetDeviceProcAddrStub);\n}\n\nstatic void volkGenLoadLoader(void* context, PFN_vkVoidFunction (*load)(void*, const char*))\n{\n\t/* VOLK_GENERATE_LOAD_LOADER */\n#if defined(VK_VERSION_1_0)\n\tvkCreateInstance = (PFN_vkCreateInstance)load(context, \"vkCreateInstance\");\n\tvkEnumerateInstanceExtensionProperties = (PFN_vkEnumerateInstanceExtensionProperties)load(context, \"vkEnumerateInstanceExtensionProperties\");\n\tvkEnumerateInstanceLayerProperties = (PFN_vkEnumerateInstanceLayerProperties)load(context, \"vkEnumerateInstanceLayerProperties\");\n#endif /* defined(VK_VERSION_1_0) */\n#if defined(VK_VERSION_1_1)\n\tvkEnumerateInstanceVersion = (PFN_vkEnumerateInstanceVersion)load(context, \"vkEnumerateInstanceVersion\");\n#endif /* defined(VK_VERSION_1_1) */\n\t/* VOLK_GENERATE_LOAD_LOADER */\n}\n\nstatic void volkGenLoadInstance(void* context, PFN_vkVoidFunction (*load)(void*, const char*))\n{\n\t/* VOLK_GENERATE_LOAD_INSTANCE */\n#if defined(VK_VERSION_1_0)\n\tvkCreateDevice = (PFN_vkCreateDevice)load(context, \"vkCreateDevice\");\n\tvkDestroyInstance = (PFN_vkDestroyInstance)load(context, \"vkDestroyInstance\");\n\tvkEnumerateDeviceExtensionProperties = (PFN_vkEnumerateDeviceExtensionProperties)load(context, \"vkEnumerateDeviceExtensionProperties\");\n\tvkEnumerateDeviceLayerProperties = (PFN_vkEnumerateDeviceLayerProperties)load(context, \"vkEnumerateDeviceLayerProperties\");\n\tvkEnumeratePhysicalDevices = (PFN_vkEnumeratePhysicalDevices)load(context, \"vkEnumeratePhysicalDevices\");\n\tvkGetDeviceProcAddr = (PFN_vkGetDeviceProcAddr)load(context, \"vkGetDeviceProcAddr\");\n\tvkGetPhysicalDeviceFeatures = (PFN_vkGetPhysicalDeviceFeatures)load(context, \"vkGetPhysicalDeviceFeatures\");\n\tvkGetPhysicalDeviceFormatProperties = (PFN_vkGetPhysicalDeviceFormatProperties)load(context, \"vkGetPhysicalDeviceFormatProperties\");\n\tvkGetPhysicalDeviceImageFormatProperties = (PFN_vkGetPhysicalDeviceImageFormatProperties)load(context, \"vkGetPhysicalDeviceImageFormatProperties\");\n\tvkGetPhysicalDeviceMemoryProperties = (PFN_vkGetPhysicalDeviceMemoryProperties)load(context, \"vkGetPhysicalDeviceMemoryProperties\");\n\tvkGetPhysicalDeviceProperties = (PFN_vkGetPhysicalDeviceProperties)load(context, \"vkGetPhysicalDeviceProperties\");\n\tvkGetPhysicalDeviceQueueFamilyProperties = (PFN_vkGetPhysicalDeviceQueueFamilyProperties)load(context, \"vkGetPhysicalDeviceQueueFamilyProperties\");\n\tvkGetPhysicalDeviceSparseImageFormatProperties = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties)load(context, \"vkGetPhysicalDeviceSparseImageFormatProperties\");\n#endif /* defined(VK_VERSION_1_0) */\n#if defined(VK_VERSION_1_1)\n\tvkEnumeratePhysicalDeviceGroups = (PFN_vkEnumeratePhysicalDeviceGroups)load(context, \"vkEnumeratePhysicalDeviceGroups\");\n\tvkGetPhysicalDeviceExternalBufferProperties = (PFN_vkGetPhysicalDeviceExternalBufferProperties)load(context, \"vkGetPhysicalDeviceExternalBufferProperties\");\n\tvkGetPhysicalDeviceExternalFenceProperties = (PFN_vkGetPhysicalDeviceExternalFenceProperties)load(context, \"vkGetPhysicalDeviceExternalFenceProperties\");\n\tvkGetPhysicalDeviceExternalSemaphoreProperties = (PFN_vkGetPhysicalDeviceExternalSemaphoreProperties)load(context, \"vkGetPhysicalDeviceExternalSemaphoreProperties\");\n\tvkGetPhysicalDeviceFeatures2 = (PFN_vkGetPhysicalDeviceFeatures2)load(context, \"vkGetPhysicalDeviceFeatures2\");\n\tvkGetPhysicalDeviceFormatProperties2 = (PFN_vkGetPhysicalDeviceFormatProperties2)load(context, \"vkGetPhysicalDeviceFormatProperties2\");\n\tvkGetPhysicalDeviceImageFormatProperties2 = (PFN_vkGetPhysicalDeviceImageFormatProperties2)load(context, \"vkGetPhysicalDeviceImageFormatProperties2\");\n\tvkGetPhysicalDeviceMemoryProperties2 = (PFN_vkGetPhysicalDeviceMemoryProperties2)load(context, \"vkGetPhysicalDeviceMemoryProperties2\");\n\tvkGetPhysicalDeviceProperties2 = (PFN_vkGetPhysicalDeviceProperties2)load(context, \"vkGetPhysicalDeviceProperties2\");\n\tvkGetPhysicalDeviceQueueFamilyProperties2 = (PFN_vkGetPhysicalDeviceQueueFamilyProperties2)load(context, \"vkGetPhysicalDeviceQueueFamilyProperties2\");\n\tvkGetPhysicalDeviceSparseImageFormatProperties2 = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties2)load(context, \"vkGetPhysicalDeviceSparseImageFormatProperties2\");\n#endif /* defined(VK_VERSION_1_1) */\n#if defined(VK_VERSION_1_3)\n\tvkGetPhysicalDeviceToolProperties = (PFN_vkGetPhysicalDeviceToolProperties)load(context, \"vkGetPhysicalDeviceToolProperties\");\n#endif /* defined(VK_VERSION_1_3) */\n#if defined(VK_EXT_acquire_drm_display)\n\tvkAcquireDrmDisplayEXT = (PFN_vkAcquireDrmDisplayEXT)load(context, \"vkAcquireDrmDisplayEXT\");\n\tvkGetDrmDisplayEXT = (PFN_vkGetDrmDisplayEXT)load(context, \"vkGetDrmDisplayEXT\");\n#endif /* defined(VK_EXT_acquire_drm_display) */\n#if defined(VK_EXT_acquire_xlib_display)\n\tvkAcquireXlibDisplayEXT = (PFN_vkAcquireXlibDisplayEXT)load(context, \"vkAcquireXlibDisplayEXT\");\n\tvkGetRandROutputDisplayEXT = (PFN_vkGetRandROutputDisplayEXT)load(context, \"vkGetRandROutputDisplayEXT\");\n#endif /* defined(VK_EXT_acquire_xlib_display) */\n#if defined(VK_EXT_calibrated_timestamps)\n\tvkGetPhysicalDeviceCalibrateableTimeDomainsEXT = (PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT)load(context, \"vkGetPhysicalDeviceCalibrateableTimeDomainsEXT\");\n#endif /* defined(VK_EXT_calibrated_timestamps) */\n#if defined(VK_EXT_debug_report)\n\tvkCreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT)load(context, \"vkCreateDebugReportCallbackEXT\");\n\tvkDebugReportMessageEXT = (PFN_vkDebugReportMessageEXT)load(context, \"vkDebugReportMessageEXT\");\n\tvkDestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT)load(context, \"vkDestroyDebugReportCallbackEXT\");\n#endif /* defined(VK_EXT_debug_report) */\n#if defined(VK_EXT_debug_utils)\n\tvkCmdBeginDebugUtilsLabelEXT = (PFN_vkCmdBeginDebugUtilsLabelEXT)load(context, \"vkCmdBeginDebugUtilsLabelEXT\");\n\tvkCmdEndDebugUtilsLabelEXT = (PFN_vkCmdEndDebugUtilsLabelEXT)load(context, \"vkCmdEndDebugUtilsLabelEXT\");\n\tvkCmdInsertDebugUtilsLabelEXT = (PFN_vkCmdInsertDebugUtilsLabelEXT)load(context, \"vkCmdInsertDebugUtilsLabelEXT\");\n\tvkCreateDebugUtilsMessengerEXT = (PFN_vkCreateDebugUtilsMessengerEXT)load(context, \"vkCreateDebugUtilsMessengerEXT\");\n\tvkDestroyDebugUtilsMessengerEXT = (PFN_vkDestroyDebugUtilsMessengerEXT)load(context, \"vkDestroyDebugUtilsMessengerEXT\");\n\tvkQueueBeginDebugUtilsLabelEXT = (PFN_vkQueueBeginDebugUtilsLabelEXT)load(context, \"vkQueueBeginDebugUtilsLabelEXT\");\n\tvkQueueEndDebugUtilsLabelEXT = (PFN_vkQueueEndDebugUtilsLabelEXT)load(context, \"vkQueueEndDebugUtilsLabelEXT\");\n\tvkQueueInsertDebugUtilsLabelEXT = (PFN_vkQueueInsertDebugUtilsLabelEXT)load(context, \"vkQueueInsertDebugUtilsLabelEXT\");\n\tvkSetDebugUtilsObjectNameEXT = (PFN_vkSetDebugUtilsObjectNameEXT)load(context, \"vkSetDebugUtilsObjectNameEXT\");\n\tvkSetDebugUtilsObjectTagEXT = (PFN_vkSetDebugUtilsObjectTagEXT)load(context, \"vkSetDebugUtilsObjectTagEXT\");\n\tvkSubmitDebugUtilsMessageEXT = (PFN_vkSubmitDebugUtilsMessageEXT)load(context, \"vkSubmitDebugUtilsMessageEXT\");\n#endif /* defined(VK_EXT_debug_utils) */\n#if defined(VK_EXT_direct_mode_display)\n\tvkReleaseDisplayEXT = (PFN_vkReleaseDisplayEXT)load(context, \"vkReleaseDisplayEXT\");\n#endif /* defined(VK_EXT_direct_mode_display) */\n#if defined(VK_EXT_directfb_surface)\n\tvkCreateDirectFBSurfaceEXT = (PFN_vkCreateDirectFBSurfaceEXT)load(context, \"vkCreateDirectFBSurfaceEXT\");\n\tvkGetPhysicalDeviceDirectFBPresentationSupportEXT = (PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT)load(context, \"vkGetPhysicalDeviceDirectFBPresentationSupportEXT\");\n#endif /* defined(VK_EXT_directfb_surface) */\n#if defined(VK_EXT_display_surface_counter)\n\tvkGetPhysicalDeviceSurfaceCapabilities2EXT = (PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT)load(context, \"vkGetPhysicalDeviceSurfaceCapabilities2EXT\");\n#endif /* defined(VK_EXT_display_surface_counter) */\n#if defined(VK_EXT_full_screen_exclusive)\n\tvkGetPhysicalDeviceSurfacePresentModes2EXT = (PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT)load(context, \"vkGetPhysicalDeviceSurfacePresentModes2EXT\");\n#endif /* defined(VK_EXT_full_screen_exclusive) */\n#if defined(VK_EXT_headless_surface)\n\tvkCreateHeadlessSurfaceEXT = (PFN_vkCreateHeadlessSurfaceEXT)load(context, \"vkCreateHeadlessSurfaceEXT\");\n#endif /* defined(VK_EXT_headless_surface) */\n#if defined(VK_EXT_metal_surface)\n\tvkCreateMetalSurfaceEXT = (PFN_vkCreateMetalSurfaceEXT)load(context, \"vkCreateMetalSurfaceEXT\");\n#endif /* defined(VK_EXT_metal_surface) */\n#if defined(VK_EXT_sample_locations)\n\tvkGetPhysicalDeviceMultisamplePropertiesEXT = (PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT)load(context, \"vkGetPhysicalDeviceMultisamplePropertiesEXT\");\n#endif /* defined(VK_EXT_sample_locations) */\n#if defined(VK_EXT_tooling_info)\n\tvkGetPhysicalDeviceToolPropertiesEXT = (PFN_vkGetPhysicalDeviceToolPropertiesEXT)load(context, \"vkGetPhysicalDeviceToolPropertiesEXT\");\n#endif /* defined(VK_EXT_tooling_info) */\n#if defined(VK_FUCHSIA_imagepipe_surface)\n\tvkCreateImagePipeSurfaceFUCHSIA = (PFN_vkCreateImagePipeSurfaceFUCHSIA)load(context, \"vkCreateImagePipeSurfaceFUCHSIA\");\n#endif /* defined(VK_FUCHSIA_imagepipe_surface) */\n#if defined(VK_GGP_stream_descriptor_surface)\n\tvkCreateStreamDescriptorSurfaceGGP = (PFN_vkCreateStreamDescriptorSurfaceGGP)load(context, \"vkCreateStreamDescriptorSurfaceGGP\");\n#endif /* defined(VK_GGP_stream_descriptor_surface) */\n#if defined(VK_KHR_android_surface)\n\tvkCreateAndroidSurfaceKHR = (PFN_vkCreateAndroidSurfaceKHR)load(context, \"vkCreateAndroidSurfaceKHR\");\n#endif /* defined(VK_KHR_android_surface) */\n#if defined(VK_KHR_calibrated_timestamps)\n\tvkGetPhysicalDeviceCalibrateableTimeDomainsKHR = (PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsKHR)load(context, \"vkGetPhysicalDeviceCalibrateableTimeDomainsKHR\");\n#endif /* defined(VK_KHR_calibrated_timestamps) */\n#if defined(VK_KHR_cooperative_matrix)\n\tvkGetPhysicalDeviceCooperativeMatrixPropertiesKHR = (PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR)load(context, \"vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR\");\n#endif /* defined(VK_KHR_cooperative_matrix) */\n#if defined(VK_KHR_device_group_creation)\n\tvkEnumeratePhysicalDeviceGroupsKHR = (PFN_vkEnumeratePhysicalDeviceGroupsKHR)load(context, \"vkEnumeratePhysicalDeviceGroupsKHR\");\n#endif /* defined(VK_KHR_device_group_creation) */\n#if defined(VK_KHR_display)\n\tvkCreateDisplayModeKHR = (PFN_vkCreateDisplayModeKHR)load(context, \"vkCreateDisplayModeKHR\");\n\tvkCreateDisplayPlaneSurfaceKHR = (PFN_vkCreateDisplayPlaneSurfaceKHR)load(context, \"vkCreateDisplayPlaneSurfaceKHR\");\n\tvkGetDisplayModePropertiesKHR = (PFN_vkGetDisplayModePropertiesKHR)load(context, \"vkGetDisplayModePropertiesKHR\");\n\tvkGetDisplayPlaneCapabilitiesKHR = (PFN_vkGetDisplayPlaneCapabilitiesKHR)load(context, \"vkGetDisplayPlaneCapabilitiesKHR\");\n\tvkGetDisplayPlaneSupportedDisplaysKHR = (PFN_vkGetDisplayPlaneSupportedDisplaysKHR)load(context, \"vkGetDisplayPlaneSupportedDisplaysKHR\");\n\tvkGetPhysicalDeviceDisplayPlanePropertiesKHR = (PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR)load(context, \"vkGetPhysicalDeviceDisplayPlanePropertiesKHR\");\n\tvkGetPhysicalDeviceDisplayPropertiesKHR = (PFN_vkGetPhysicalDeviceDisplayPropertiesKHR)load(context, \"vkGetPhysicalDeviceDisplayPropertiesKHR\");\n#endif /* defined(VK_KHR_display) */\n#if defined(VK_KHR_external_fence_capabilities)\n\tvkGetPhysicalDeviceExternalFencePropertiesKHR = (PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR)load(context, \"vkGetPhysicalDeviceExternalFencePropertiesKHR\");\n#endif /* defined(VK_KHR_external_fence_capabilities) */\n#if defined(VK_KHR_external_memory_capabilities)\n\tvkGetPhysicalDeviceExternalBufferPropertiesKHR = (PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR)load(context, \"vkGetPhysicalDeviceExternalBufferPropertiesKHR\");\n#endif /* defined(VK_KHR_external_memory_capabilities) */\n#if defined(VK_KHR_external_semaphore_capabilities)\n\tvkGetPhysicalDeviceExternalSemaphorePropertiesKHR = (PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR)load(context, \"vkGetPhysicalDeviceExternalSemaphorePropertiesKHR\");\n#endif /* defined(VK_KHR_external_semaphore_capabilities) */\n#if defined(VK_KHR_fragment_shading_rate)\n\tvkGetPhysicalDeviceFragmentShadingRatesKHR = (PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR)load(context, \"vkGetPhysicalDeviceFragmentShadingRatesKHR\");\n#endif /* defined(VK_KHR_fragment_shading_rate) */\n#if defined(VK_KHR_get_display_properties2)\n\tvkGetDisplayModeProperties2KHR = (PFN_vkGetDisplayModeProperties2KHR)load(context, \"vkGetDisplayModeProperties2KHR\");\n\tvkGetDisplayPlaneCapabilities2KHR = (PFN_vkGetDisplayPlaneCapabilities2KHR)load(context, \"vkGetDisplayPlaneCapabilities2KHR\");\n\tvkGetPhysicalDeviceDisplayPlaneProperties2KHR = (PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR)load(context, \"vkGetPhysicalDeviceDisplayPlaneProperties2KHR\");\n\tvkGetPhysicalDeviceDisplayProperties2KHR = (PFN_vkGetPhysicalDeviceDisplayProperties2KHR)load(context, \"vkGetPhysicalDeviceDisplayProperties2KHR\");\n#endif /* defined(VK_KHR_get_display_properties2) */\n#if defined(VK_KHR_get_physical_device_properties2)\n\tvkGetPhysicalDeviceFeatures2KHR = (PFN_vkGetPhysicalDeviceFeatures2KHR)load(context, \"vkGetPhysicalDeviceFeatures2KHR\");\n\tvkGetPhysicalDeviceFormatProperties2KHR = (PFN_vkGetPhysicalDeviceFormatProperties2KHR)load(context, \"vkGetPhysicalDeviceFormatProperties2KHR\");\n\tvkGetPhysicalDeviceImageFormatProperties2KHR = (PFN_vkGetPhysicalDeviceImageFormatProperties2KHR)load(context, \"vkGetPhysicalDeviceImageFormatProperties2KHR\");\n\tvkGetPhysicalDeviceMemoryProperties2KHR = (PFN_vkGetPhysicalDeviceMemoryProperties2KHR)load(context, \"vkGetPhysicalDeviceMemoryProperties2KHR\");\n\tvkGetPhysicalDeviceProperties2KHR = (PFN_vkGetPhysicalDeviceProperties2KHR)load(context, \"vkGetPhysicalDeviceProperties2KHR\");\n\tvkGetPhysicalDeviceQueueFamilyProperties2KHR = (PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR)load(context, \"vkGetPhysicalDeviceQueueFamilyProperties2KHR\");\n\tvkGetPhysicalDeviceSparseImageFormatProperties2KHR = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR)load(context, \"vkGetPhysicalDeviceSparseImageFormatProperties2KHR\");\n#endif /* defined(VK_KHR_get_physical_device_properties2) */\n#if defined(VK_KHR_get_surface_capabilities2)\n\tvkGetPhysicalDeviceSurfaceCapabilities2KHR = (PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR)load(context, \"vkGetPhysicalDeviceSurfaceCapabilities2KHR\");\n\tvkGetPhysicalDeviceSurfaceFormats2KHR = (PFN_vkGetPhysicalDeviceSurfaceFormats2KHR)load(context, \"vkGetPhysicalDeviceSurfaceFormats2KHR\");\n#endif /* defined(VK_KHR_get_surface_capabilities2) */\n#if defined(VK_KHR_performance_query)\n\tvkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR = (PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR)load(context, \"vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR\");\n\tvkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR = (PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR)load(context, \"vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR\");\n#endif /* defined(VK_KHR_performance_query) */\n#if defined(VK_KHR_surface)\n\tvkDestroySurfaceKHR = (PFN_vkDestroySurfaceKHR)load(context, \"vkDestroySurfaceKHR\");\n\tvkGetPhysicalDeviceSurfaceCapabilitiesKHR = (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)load(context, \"vkGetPhysicalDeviceSurfaceCapabilitiesKHR\");\n\tvkGetPhysicalDeviceSurfaceFormatsKHR = (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)load(context, \"vkGetPhysicalDeviceSurfaceFormatsKHR\");\n\tvkGetPhysicalDeviceSurfacePresentModesKHR = (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)load(context, \"vkGetPhysicalDeviceSurfacePresentModesKHR\");\n\tvkGetPhysicalDeviceSurfaceSupportKHR = (PFN_vkGetPhysicalDeviceSurfaceSupportKHR)load(context, \"vkGetPhysicalDeviceSurfaceSupportKHR\");\n#endif /* defined(VK_KHR_surface) */\n#if defined(VK_KHR_video_encode_queue)\n\tvkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR = (PFN_vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR)load(context, \"vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR\");\n#endif /* defined(VK_KHR_video_encode_queue) */\n#if defined(VK_KHR_video_queue)\n\tvkGetPhysicalDeviceVideoCapabilitiesKHR = (PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR)load(context, \"vkGetPhysicalDeviceVideoCapabilitiesKHR\");\n\tvkGetPhysicalDeviceVideoFormatPropertiesKHR = (PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR)load(context, \"vkGetPhysicalDeviceVideoFormatPropertiesKHR\");\n#endif /* defined(VK_KHR_video_queue) */\n#if defined(VK_KHR_wayland_surface)\n\tvkCreateWaylandSurfaceKHR = (PFN_vkCreateWaylandSurfaceKHR)load(context, \"vkCreateWaylandSurfaceKHR\");\n\tvkGetPhysicalDeviceWaylandPresentationSupportKHR = (PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)load(context, \"vkGetPhysicalDeviceWaylandPresentationSupportKHR\");\n#endif /* defined(VK_KHR_wayland_surface) */\n#if defined(VK_KHR_win32_surface)\n\tvkCreateWin32SurfaceKHR = (PFN_vkCreateWin32SurfaceKHR)load(context, \"vkCreateWin32SurfaceKHR\");\n\tvkGetPhysicalDeviceWin32PresentationSupportKHR = (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)load(context, \"vkGetPhysicalDeviceWin32PresentationSupportKHR\");\n#endif /* defined(VK_KHR_win32_surface) */\n#if defined(VK_KHR_xcb_surface)\n\tvkCreateXcbSurfaceKHR = (PFN_vkCreateXcbSurfaceKHR)load(context, \"vkCreateXcbSurfaceKHR\");\n\tvkGetPhysicalDeviceXcbPresentationSupportKHR = (PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)load(context, \"vkGetPhysicalDeviceXcbPresentationSupportKHR\");\n#endif /* defined(VK_KHR_xcb_surface) */\n#if defined(VK_KHR_xlib_surface)\n\tvkCreateXlibSurfaceKHR = (PFN_vkCreateXlibSurfaceKHR)load(context, \"vkCreateXlibSurfaceKHR\");\n\tvkGetPhysicalDeviceXlibPresentationSupportKHR = (PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)load(context, \"vkGetPhysicalDeviceXlibPresentationSupportKHR\");\n#endif /* defined(VK_KHR_xlib_surface) */\n#if defined(VK_MVK_ios_surface)\n\tvkCreateIOSSurfaceMVK = (PFN_vkCreateIOSSurfaceMVK)load(context, \"vkCreateIOSSurfaceMVK\");\n#endif /* defined(VK_MVK_ios_surface) */\n#if defined(VK_MVK_macos_surface)\n\tvkCreateMacOSSurfaceMVK = (PFN_vkCreateMacOSSurfaceMVK)load(context, \"vkCreateMacOSSurfaceMVK\");\n#endif /* defined(VK_MVK_macos_surface) */\n#if defined(VK_NN_vi_surface)\n\tvkCreateViSurfaceNN = (PFN_vkCreateViSurfaceNN)load(context, \"vkCreateViSurfaceNN\");\n#endif /* defined(VK_NN_vi_surface) */\n#if defined(VK_NV_acquire_winrt_display)\n\tvkAcquireWinrtDisplayNV = (PFN_vkAcquireWinrtDisplayNV)load(context, \"vkAcquireWinrtDisplayNV\");\n\tvkGetWinrtDisplayNV = (PFN_vkGetWinrtDisplayNV)load(context, \"vkGetWinrtDisplayNV\");\n#endif /* defined(VK_NV_acquire_winrt_display) */\n#if defined(VK_NV_cooperative_matrix)\n\tvkGetPhysicalDeviceCooperativeMatrixPropertiesNV = (PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV)load(context, \"vkGetPhysicalDeviceCooperativeMatrixPropertiesNV\");\n#endif /* defined(VK_NV_cooperative_matrix) */\n#if defined(VK_NV_cooperative_matrix2)\n\tvkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV = (PFN_vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV)load(context, \"vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV\");\n#endif /* defined(VK_NV_cooperative_matrix2) */\n#if defined(VK_NV_cooperative_vector)\n\tvkGetPhysicalDeviceCooperativeVectorPropertiesNV = (PFN_vkGetPhysicalDeviceCooperativeVectorPropertiesNV)load(context, \"vkGetPhysicalDeviceCooperativeVectorPropertiesNV\");\n#endif /* defined(VK_NV_cooperative_vector) */\n#if defined(VK_NV_coverage_reduction_mode)\n\tvkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV = (PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV)load(context, \"vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV\");\n#endif /* defined(VK_NV_coverage_reduction_mode) */\n#if defined(VK_NV_external_memory_capabilities)\n\tvkGetPhysicalDeviceExternalImageFormatPropertiesNV = (PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV)load(context, \"vkGetPhysicalDeviceExternalImageFormatPropertiesNV\");\n#endif /* defined(VK_NV_external_memory_capabilities) */\n#if defined(VK_NV_optical_flow)\n\tvkGetPhysicalDeviceOpticalFlowImageFormatsNV = (PFN_vkGetPhysicalDeviceOpticalFlowImageFormatsNV)load(context, \"vkGetPhysicalDeviceOpticalFlowImageFormatsNV\");\n#endif /* defined(VK_NV_optical_flow) */\n#if defined(VK_QNX_screen_surface)\n\tvkCreateScreenSurfaceQNX = (PFN_vkCreateScreenSurfaceQNX)load(context, \"vkCreateScreenSurfaceQNX\");\n\tvkGetPhysicalDeviceScreenPresentationSupportQNX = (PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX)load(context, \"vkGetPhysicalDeviceScreenPresentationSupportQNX\");\n#endif /* defined(VK_QNX_screen_surface) */\n#if (defined(VK_KHR_device_group) && defined(VK_KHR_surface)) || (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1))\n\tvkGetPhysicalDevicePresentRectanglesKHR = (PFN_vkGetPhysicalDevicePresentRectanglesKHR)load(context, \"vkGetPhysicalDevicePresentRectanglesKHR\");\n#endif /* (defined(VK_KHR_device_group) && defined(VK_KHR_surface)) || (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1)) */\n\t/* VOLK_GENERATE_LOAD_INSTANCE */\n}\n\nstatic void volkGenLoadDevice(void* context, PFN_vkVoidFunction (*load)(void*, const char*))\n{\n\t/* VOLK_GENERATE_LOAD_DEVICE */\n#if defined(VK_VERSION_1_0)\n\tvkAllocateCommandBuffers = (PFN_vkAllocateCommandBuffers)load(context, \"vkAllocateCommandBuffers\");\n\tvkAllocateDescriptorSets = (PFN_vkAllocateDescriptorSets)load(context, \"vkAllocateDescriptorSets\");\n\tvkAllocateMemory = (PFN_vkAllocateMemory)load(context, \"vkAllocateMemory\");\n\tvkBeginCommandBuffer = (PFN_vkBeginCommandBuffer)load(context, \"vkBeginCommandBuffer\");\n\tvkBindBufferMemory = (PFN_vkBindBufferMemory)load(context, \"vkBindBufferMemory\");\n\tvkBindImageMemory = (PFN_vkBindImageMemory)load(context, \"vkBindImageMemory\");\n\tvkCmdBeginQuery = (PFN_vkCmdBeginQuery)load(context, \"vkCmdBeginQuery\");\n\tvkCmdBeginRenderPass = (PFN_vkCmdBeginRenderPass)load(context, \"vkCmdBeginRenderPass\");\n\tvkCmdBindDescriptorSets = (PFN_vkCmdBindDescriptorSets)load(context, \"vkCmdBindDescriptorSets\");\n\tvkCmdBindIndexBuffer = (PFN_vkCmdBindIndexBuffer)load(context, \"vkCmdBindIndexBuffer\");\n\tvkCmdBindPipeline = (PFN_vkCmdBindPipeline)load(context, \"vkCmdBindPipeline\");\n\tvkCmdBindVertexBuffers = (PFN_vkCmdBindVertexBuffers)load(context, \"vkCmdBindVertexBuffers\");\n\tvkCmdBlitImage = (PFN_vkCmdBlitImage)load(context, \"vkCmdBlitImage\");\n\tvkCmdClearAttachments = (PFN_vkCmdClearAttachments)load(context, \"vkCmdClearAttachments\");\n\tvkCmdClearColorImage = (PFN_vkCmdClearColorImage)load(context, \"vkCmdClearColorImage\");\n\tvkCmdClearDepthStencilImage = (PFN_vkCmdClearDepthStencilImage)load(context, \"vkCmdClearDepthStencilImage\");\n\tvkCmdCopyBuffer = (PFN_vkCmdCopyBuffer)load(context, \"vkCmdCopyBuffer\");\n\tvkCmdCopyBufferToImage = (PFN_vkCmdCopyBufferToImage)load(context, \"vkCmdCopyBufferToImage\");\n\tvkCmdCopyImage = (PFN_vkCmdCopyImage)load(context, \"vkCmdCopyImage\");\n\tvkCmdCopyImageToBuffer = (PFN_vkCmdCopyImageToBuffer)load(context, \"vkCmdCopyImageToBuffer\");\n\tvkCmdCopyQueryPoolResults = (PFN_vkCmdCopyQueryPoolResults)load(context, \"vkCmdCopyQueryPoolResults\");\n\tvkCmdDispatch = (PFN_vkCmdDispatch)load(context, \"vkCmdDispatch\");\n\tvkCmdDispatchIndirect = (PFN_vkCmdDispatchIndirect)load(context, \"vkCmdDispatchIndirect\");\n\tvkCmdDraw = (PFN_vkCmdDraw)load(context, \"vkCmdDraw\");\n\tvkCmdDrawIndexed = (PFN_vkCmdDrawIndexed)load(context, \"vkCmdDrawIndexed\");\n\tvkCmdDrawIndexedIndirect = (PFN_vkCmdDrawIndexedIndirect)load(context, \"vkCmdDrawIndexedIndirect\");\n\tvkCmdDrawIndirect = (PFN_vkCmdDrawIndirect)load(context, \"vkCmdDrawIndirect\");\n\tvkCmdEndQuery = (PFN_vkCmdEndQuery)load(context, \"vkCmdEndQuery\");\n\tvkCmdEndRenderPass = (PFN_vkCmdEndRenderPass)load(context, \"vkCmdEndRenderPass\");\n\tvkCmdExecuteCommands = (PFN_vkCmdExecuteCommands)load(context, \"vkCmdExecuteCommands\");\n\tvkCmdFillBuffer = (PFN_vkCmdFillBuffer)load(context, \"vkCmdFillBuffer\");\n\tvkCmdNextSubpass = (PFN_vkCmdNextSubpass)load(context, \"vkCmdNextSubpass\");\n\tvkCmdPipelineBarrier = (PFN_vkCmdPipelineBarrier)load(context, \"vkCmdPipelineBarrier\");\n\tvkCmdPushConstants = (PFN_vkCmdPushConstants)load(context, \"vkCmdPushConstants\");\n\tvkCmdResetEvent = (PFN_vkCmdResetEvent)load(context, \"vkCmdResetEvent\");\n\tvkCmdResetQueryPool = (PFN_vkCmdResetQueryPool)load(context, \"vkCmdResetQueryPool\");\n\tvkCmdResolveImage = (PFN_vkCmdResolveImage)load(context, \"vkCmdResolveImage\");\n\tvkCmdSetBlendConstants = (PFN_vkCmdSetBlendConstants)load(context, \"vkCmdSetBlendConstants\");\n\tvkCmdSetDepthBias = (PFN_vkCmdSetDepthBias)load(context, \"vkCmdSetDepthBias\");\n\tvkCmdSetDepthBounds = (PFN_vkCmdSetDepthBounds)load(context, \"vkCmdSetDepthBounds\");\n\tvkCmdSetEvent = (PFN_vkCmdSetEvent)load(context, \"vkCmdSetEvent\");\n\tvkCmdSetLineWidth = (PFN_vkCmdSetLineWidth)load(context, \"vkCmdSetLineWidth\");\n\tvkCmdSetScissor = (PFN_vkCmdSetScissor)load(context, \"vkCmdSetScissor\");\n\tvkCmdSetStencilCompareMask = (PFN_vkCmdSetStencilCompareMask)load(context, \"vkCmdSetStencilCompareMask\");\n\tvkCmdSetStencilReference = (PFN_vkCmdSetStencilReference)load(context, \"vkCmdSetStencilReference\");\n\tvkCmdSetStencilWriteMask = (PFN_vkCmdSetStencilWriteMask)load(context, \"vkCmdSetStencilWriteMask\");\n\tvkCmdSetViewport = (PFN_vkCmdSetViewport)load(context, \"vkCmdSetViewport\");\n\tvkCmdUpdateBuffer = (PFN_vkCmdUpdateBuffer)load(context, \"vkCmdUpdateBuffer\");\n\tvkCmdWaitEvents = (PFN_vkCmdWaitEvents)load(context, \"vkCmdWaitEvents\");\n\tvkCmdWriteTimestamp = (PFN_vkCmdWriteTimestamp)load(context, \"vkCmdWriteTimestamp\");\n\tvkCreateBuffer = (PFN_vkCreateBuffer)load(context, \"vkCreateBuffer\");\n\tvkCreateBufferView = (PFN_vkCreateBufferView)load(context, \"vkCreateBufferView\");\n\tvkCreateCommandPool = (PFN_vkCreateCommandPool)load(context, \"vkCreateCommandPool\");\n\tvkCreateComputePipelines = (PFN_vkCreateComputePipelines)load(context, \"vkCreateComputePipelines\");\n\tvkCreateDescriptorPool = (PFN_vkCreateDescriptorPool)load(context, \"vkCreateDescriptorPool\");\n\tvkCreateDescriptorSetLayout = (PFN_vkCreateDescriptorSetLayout)load(context, \"vkCreateDescriptorSetLayout\");\n\tvkCreateEvent = (PFN_vkCreateEvent)load(context, \"vkCreateEvent\");\n\tvkCreateFence = (PFN_vkCreateFence)load(context, \"vkCreateFence\");\n\tvkCreateFramebuffer = (PFN_vkCreateFramebuffer)load(context, \"vkCreateFramebuffer\");\n\tvkCreateGraphicsPipelines = (PFN_vkCreateGraphicsPipelines)load(context, \"vkCreateGraphicsPipelines\");\n\tvkCreateImage = (PFN_vkCreateImage)load(context, \"vkCreateImage\");\n\tvkCreateImageView = (PFN_vkCreateImageView)load(context, \"vkCreateImageView\");\n\tvkCreatePipelineCache = (PFN_vkCreatePipelineCache)load(context, \"vkCreatePipelineCache\");\n\tvkCreatePipelineLayout = (PFN_vkCreatePipelineLayout)load(context, \"vkCreatePipelineLayout\");\n\tvkCreateQueryPool = (PFN_vkCreateQueryPool)load(context, \"vkCreateQueryPool\");\n\tvkCreateRenderPass = (PFN_vkCreateRenderPass)load(context, \"vkCreateRenderPass\");\n\tvkCreateSampler = (PFN_vkCreateSampler)load(context, \"vkCreateSampler\");\n\tvkCreateSemaphore = (PFN_vkCreateSemaphore)load(context, \"vkCreateSemaphore\");\n\tvkCreateShaderModule = (PFN_vkCreateShaderModule)load(context, \"vkCreateShaderModule\");\n\tvkDestroyBuffer = (PFN_vkDestroyBuffer)load(context, \"vkDestroyBuffer\");\n\tvkDestroyBufferView = (PFN_vkDestroyBufferView)load(context, \"vkDestroyBufferView\");\n\tvkDestroyCommandPool = (PFN_vkDestroyCommandPool)load(context, \"vkDestroyCommandPool\");\n\tvkDestroyDescriptorPool = (PFN_vkDestroyDescriptorPool)load(context, \"vkDestroyDescriptorPool\");\n\tvkDestroyDescriptorSetLayout = (PFN_vkDestroyDescriptorSetLayout)load(context, \"vkDestroyDescriptorSetLayout\");\n\tvkDestroyDevice = (PFN_vkDestroyDevice)load(context, \"vkDestroyDevice\");\n\tvkDestroyEvent = (PFN_vkDestroyEvent)load(context, \"vkDestroyEvent\");\n\tvkDestroyFence = (PFN_vkDestroyFence)load(context, \"vkDestroyFence\");\n\tvkDestroyFramebuffer = (PFN_vkDestroyFramebuffer)load(context, \"vkDestroyFramebuffer\");\n\tvkDestroyImage = (PFN_vkDestroyImage)load(context, \"vkDestroyImage\");\n\tvkDestroyImageView = (PFN_vkDestroyImageView)load(context, \"vkDestroyImageView\");\n\tvkDestroyPipeline = (PFN_vkDestroyPipeline)load(context, \"vkDestroyPipeline\");\n\tvkDestroyPipelineCache = (PFN_vkDestroyPipelineCache)load(context, \"vkDestroyPipelineCache\");\n\tvkDestroyPipelineLayout = (PFN_vkDestroyPipelineLayout)load(context, \"vkDestroyPipelineLayout\");\n\tvkDestroyQueryPool = (PFN_vkDestroyQueryPool)load(context, \"vkDestroyQueryPool\");\n\tvkDestroyRenderPass = (PFN_vkDestroyRenderPass)load(context, \"vkDestroyRenderPass\");\n\tvkDestroySampler = (PFN_vkDestroySampler)load(context, \"vkDestroySampler\");\n\tvkDestroySemaphore = (PFN_vkDestroySemaphore)load(context, \"vkDestroySemaphore\");\n\tvkDestroyShaderModule = (PFN_vkDestroyShaderModule)load(context, \"vkDestroyShaderModule\");\n\tvkDeviceWaitIdle = (PFN_vkDeviceWaitIdle)load(context, \"vkDeviceWaitIdle\");\n\tvkEndCommandBuffer = (PFN_vkEndCommandBuffer)load(context, \"vkEndCommandBuffer\");\n\tvkFlushMappedMemoryRanges = (PFN_vkFlushMappedMemoryRanges)load(context, \"vkFlushMappedMemoryRanges\");\n\tvkFreeCommandBuffers = (PFN_vkFreeCommandBuffers)load(context, \"vkFreeCommandBuffers\");\n\tvkFreeDescriptorSets = (PFN_vkFreeDescriptorSets)load(context, \"vkFreeDescriptorSets\");\n\tvkFreeMemory = (PFN_vkFreeMemory)load(context, \"vkFreeMemory\");\n\tvkGetBufferMemoryRequirements = (PFN_vkGetBufferMemoryRequirements)load(context, \"vkGetBufferMemoryRequirements\");\n\tvkGetDeviceMemoryCommitment = (PFN_vkGetDeviceMemoryCommitment)load(context, \"vkGetDeviceMemoryCommitment\");\n\tvkGetDeviceQueue = (PFN_vkGetDeviceQueue)load(context, \"vkGetDeviceQueue\");\n\tvkGetEventStatus = (PFN_vkGetEventStatus)load(context, \"vkGetEventStatus\");\n\tvkGetFenceStatus = (PFN_vkGetFenceStatus)load(context, \"vkGetFenceStatus\");\n\tvkGetImageMemoryRequirements = (PFN_vkGetImageMemoryRequirements)load(context, \"vkGetImageMemoryRequirements\");\n\tvkGetImageSparseMemoryRequirements = (PFN_vkGetImageSparseMemoryRequirements)load(context, \"vkGetImageSparseMemoryRequirements\");\n\tvkGetImageSubresourceLayout = (PFN_vkGetImageSubresourceLayout)load(context, \"vkGetImageSubresourceLayout\");\n\tvkGetPipelineCacheData = (PFN_vkGetPipelineCacheData)load(context, \"vkGetPipelineCacheData\");\n\tvkGetQueryPoolResults = (PFN_vkGetQueryPoolResults)load(context, \"vkGetQueryPoolResults\");\n\tvkGetRenderAreaGranularity = (PFN_vkGetRenderAreaGranularity)load(context, \"vkGetRenderAreaGranularity\");\n\tvkInvalidateMappedMemoryRanges = (PFN_vkInvalidateMappedMemoryRanges)load(context, \"vkInvalidateMappedMemoryRanges\");\n\tvkMapMemory = (PFN_vkMapMemory)load(context, \"vkMapMemory\");\n\tvkMergePipelineCaches = (PFN_vkMergePipelineCaches)load(context, \"vkMergePipelineCaches\");\n\tvkQueueBindSparse = (PFN_vkQueueBindSparse)load(context, \"vkQueueBindSparse\");\n\tvkQueueSubmit = (PFN_vkQueueSubmit)load(context, \"vkQueueSubmit\");\n\tvkQueueWaitIdle = (PFN_vkQueueWaitIdle)load(context, \"vkQueueWaitIdle\");\n\tvkResetCommandBuffer = (PFN_vkResetCommandBuffer)load(context, \"vkResetCommandBuffer\");\n\tvkResetCommandPool = (PFN_vkResetCommandPool)load(context, \"vkResetCommandPool\");\n\tvkResetDescriptorPool = (PFN_vkResetDescriptorPool)load(context, \"vkResetDescriptorPool\");\n\tvkResetEvent = (PFN_vkResetEvent)load(context, \"vkResetEvent\");\n\tvkResetFences = (PFN_vkResetFences)load(context, \"vkResetFences\");\n\tvkSetEvent = (PFN_vkSetEvent)load(context, \"vkSetEvent\");\n\tvkUnmapMemory = (PFN_vkUnmapMemory)load(context, \"vkUnmapMemory\");\n\tvkUpdateDescriptorSets = (PFN_vkUpdateDescriptorSets)load(context, \"vkUpdateDescriptorSets\");\n\tvkWaitForFences = (PFN_vkWaitForFences)load(context, \"vkWaitForFences\");\n#endif /* defined(VK_VERSION_1_0) */\n#if defined(VK_VERSION_1_1)\n\tvkBindBufferMemory2 = (PFN_vkBindBufferMemory2)load(context, \"vkBindBufferMemory2\");\n\tvkBindImageMemory2 = (PFN_vkBindImageMemory2)load(context, \"vkBindImageMemory2\");\n\tvkCmdDispatchBase = (PFN_vkCmdDispatchBase)load(context, \"vkCmdDispatchBase\");\n\tvkCmdSetDeviceMask = (PFN_vkCmdSetDeviceMask)load(context, \"vkCmdSetDeviceMask\");\n\tvkCreateDescriptorUpdateTemplate = (PFN_vkCreateDescriptorUpdateTemplate)load(context, \"vkCreateDescriptorUpdateTemplate\");\n\tvkCreateSamplerYcbcrConversion = (PFN_vkCreateSamplerYcbcrConversion)load(context, \"vkCreateSamplerYcbcrConversion\");\n\tvkDestroyDescriptorUpdateTemplate = (PFN_vkDestroyDescriptorUpdateTemplate)load(context, \"vkDestroyDescriptorUpdateTemplate\");\n\tvkDestroySamplerYcbcrConversion = (PFN_vkDestroySamplerYcbcrConversion)load(context, \"vkDestroySamplerYcbcrConversion\");\n\tvkGetBufferMemoryRequirements2 = (PFN_vkGetBufferMemoryRequirements2)load(context, \"vkGetBufferMemoryRequirements2\");\n\tvkGetDescriptorSetLayoutSupport = (PFN_vkGetDescriptorSetLayoutSupport)load(context, \"vkGetDescriptorSetLayoutSupport\");\n\tvkGetDeviceGroupPeerMemoryFeatures = (PFN_vkGetDeviceGroupPeerMemoryFeatures)load(context, \"vkGetDeviceGroupPeerMemoryFeatures\");\n\tvkGetDeviceQueue2 = (PFN_vkGetDeviceQueue2)load(context, \"vkGetDeviceQueue2\");\n\tvkGetImageMemoryRequirements2 = (PFN_vkGetImageMemoryRequirements2)load(context, \"vkGetImageMemoryRequirements2\");\n\tvkGetImageSparseMemoryRequirements2 = (PFN_vkGetImageSparseMemoryRequirements2)load(context, \"vkGetImageSparseMemoryRequirements2\");\n\tvkTrimCommandPool = (PFN_vkTrimCommandPool)load(context, \"vkTrimCommandPool\");\n\tvkUpdateDescriptorSetWithTemplate = (PFN_vkUpdateDescriptorSetWithTemplate)load(context, \"vkUpdateDescriptorSetWithTemplate\");\n#endif /* defined(VK_VERSION_1_1) */\n#if defined(VK_VERSION_1_2)\n\tvkCmdBeginRenderPass2 = (PFN_vkCmdBeginRenderPass2)load(context, \"vkCmdBeginRenderPass2\");\n\tvkCmdDrawIndexedIndirectCount = (PFN_vkCmdDrawIndexedIndirectCount)load(context, \"vkCmdDrawIndexedIndirectCount\");\n\tvkCmdDrawIndirectCount = (PFN_vkCmdDrawIndirectCount)load(context, \"vkCmdDrawIndirectCount\");\n\tvkCmdEndRenderPass2 = (PFN_vkCmdEndRenderPass2)load(context, \"vkCmdEndRenderPass2\");\n\tvkCmdNextSubpass2 = (PFN_vkCmdNextSubpass2)load(context, \"vkCmdNextSubpass2\");\n\tvkCreateRenderPass2 = (PFN_vkCreateRenderPass2)load(context, \"vkCreateRenderPass2\");\n\tvkGetBufferDeviceAddress = (PFN_vkGetBufferDeviceAddress)load(context, \"vkGetBufferDeviceAddress\");\n\tvkGetBufferOpaqueCaptureAddress = (PFN_vkGetBufferOpaqueCaptureAddress)load(context, \"vkGetBufferOpaqueCaptureAddress\");\n\tvkGetDeviceMemoryOpaqueCaptureAddress = (PFN_vkGetDeviceMemoryOpaqueCaptureAddress)load(context, \"vkGetDeviceMemoryOpaqueCaptureAddress\");\n\tvkGetSemaphoreCounterValue = (PFN_vkGetSemaphoreCounterValue)load(context, \"vkGetSemaphoreCounterValue\");\n\tvkResetQueryPool = (PFN_vkResetQueryPool)load(context, \"vkResetQueryPool\");\n\tvkSignalSemaphore = (PFN_vkSignalSemaphore)load(context, \"vkSignalSemaphore\");\n\tvkWaitSemaphores = (PFN_vkWaitSemaphores)load(context, \"vkWaitSemaphores\");\n#endif /* defined(VK_VERSION_1_2) */\n#if defined(VK_VERSION_1_3)\n\tvkCmdBeginRendering = (PFN_vkCmdBeginRendering)load(context, \"vkCmdBeginRendering\");\n\tvkCmdBindVertexBuffers2 = (PFN_vkCmdBindVertexBuffers2)load(context, \"vkCmdBindVertexBuffers2\");\n\tvkCmdBlitImage2 = (PFN_vkCmdBlitImage2)load(context, \"vkCmdBlitImage2\");\n\tvkCmdCopyBuffer2 = (PFN_vkCmdCopyBuffer2)load(context, \"vkCmdCopyBuffer2\");\n\tvkCmdCopyBufferToImage2 = (PFN_vkCmdCopyBufferToImage2)load(context, \"vkCmdCopyBufferToImage2\");\n\tvkCmdCopyImage2 = (PFN_vkCmdCopyImage2)load(context, \"vkCmdCopyImage2\");\n\tvkCmdCopyImageToBuffer2 = (PFN_vkCmdCopyImageToBuffer2)load(context, \"vkCmdCopyImageToBuffer2\");\n\tvkCmdEndRendering = (PFN_vkCmdEndRendering)load(context, \"vkCmdEndRendering\");\n\tvkCmdPipelineBarrier2 = (PFN_vkCmdPipelineBarrier2)load(context, \"vkCmdPipelineBarrier2\");\n\tvkCmdResetEvent2 = (PFN_vkCmdResetEvent2)load(context, \"vkCmdResetEvent2\");\n\tvkCmdResolveImage2 = (PFN_vkCmdResolveImage2)load(context, \"vkCmdResolveImage2\");\n\tvkCmdSetCullMode = (PFN_vkCmdSetCullMode)load(context, \"vkCmdSetCullMode\");\n\tvkCmdSetDepthBiasEnable = (PFN_vkCmdSetDepthBiasEnable)load(context, \"vkCmdSetDepthBiasEnable\");\n\tvkCmdSetDepthBoundsTestEnable = (PFN_vkCmdSetDepthBoundsTestEnable)load(context, \"vkCmdSetDepthBoundsTestEnable\");\n\tvkCmdSetDepthCompareOp = (PFN_vkCmdSetDepthCompareOp)load(context, \"vkCmdSetDepthCompareOp\");\n\tvkCmdSetDepthTestEnable = (PFN_vkCmdSetDepthTestEnable)load(context, \"vkCmdSetDepthTestEnable\");\n\tvkCmdSetDepthWriteEnable = (PFN_vkCmdSetDepthWriteEnable)load(context, \"vkCmdSetDepthWriteEnable\");\n\tvkCmdSetEvent2 = (PFN_vkCmdSetEvent2)load(context, \"vkCmdSetEvent2\");\n\tvkCmdSetFrontFace = (PFN_vkCmdSetFrontFace)load(context, \"vkCmdSetFrontFace\");\n\tvkCmdSetPrimitiveRestartEnable = (PFN_vkCmdSetPrimitiveRestartEnable)load(context, \"vkCmdSetPrimitiveRestartEnable\");\n\tvkCmdSetPrimitiveTopology = (PFN_vkCmdSetPrimitiveTopology)load(context, \"vkCmdSetPrimitiveTopology\");\n\tvkCmdSetRasterizerDiscardEnable = (PFN_vkCmdSetRasterizerDiscardEnable)load(context, \"vkCmdSetRasterizerDiscardEnable\");\n\tvkCmdSetScissorWithCount = (PFN_vkCmdSetScissorWithCount)load(context, \"vkCmdSetScissorWithCount\");\n\tvkCmdSetStencilOp = (PFN_vkCmdSetStencilOp)load(context, \"vkCmdSetStencilOp\");\n\tvkCmdSetStencilTestEnable = (PFN_vkCmdSetStencilTestEnable)load(context, \"vkCmdSetStencilTestEnable\");\n\tvkCmdSetViewportWithCount = (PFN_vkCmdSetViewportWithCount)load(context, \"vkCmdSetViewportWithCount\");\n\tvkCmdWaitEvents2 = (PFN_vkCmdWaitEvents2)load(context, \"vkCmdWaitEvents2\");\n\tvkCmdWriteTimestamp2 = (PFN_vkCmdWriteTimestamp2)load(context, \"vkCmdWriteTimestamp2\");\n\tvkCreatePrivateDataSlot = (PFN_vkCreatePrivateDataSlot)load(context, \"vkCreatePrivateDataSlot\");\n\tvkDestroyPrivateDataSlot = (PFN_vkDestroyPrivateDataSlot)load(context, \"vkDestroyPrivateDataSlot\");\n\tvkGetDeviceBufferMemoryRequirements = (PFN_vkGetDeviceBufferMemoryRequirements)load(context, \"vkGetDeviceBufferMemoryRequirements\");\n\tvkGetDeviceImageMemoryRequirements = (PFN_vkGetDeviceImageMemoryRequirements)load(context, \"vkGetDeviceImageMemoryRequirements\");\n\tvkGetDeviceImageSparseMemoryRequirements = (PFN_vkGetDeviceImageSparseMemoryRequirements)load(context, \"vkGetDeviceImageSparseMemoryRequirements\");\n\tvkGetPrivateData = (PFN_vkGetPrivateData)load(context, \"vkGetPrivateData\");\n\tvkQueueSubmit2 = (PFN_vkQueueSubmit2)load(context, \"vkQueueSubmit2\");\n\tvkSetPrivateData = (PFN_vkSetPrivateData)load(context, \"vkSetPrivateData\");\n#endif /* defined(VK_VERSION_1_3) */\n#if defined(VK_VERSION_1_4)\n\tvkCmdBindDescriptorSets2 = (PFN_vkCmdBindDescriptorSets2)load(context, \"vkCmdBindDescriptorSets2\");\n\tvkCmdBindIndexBuffer2 = (PFN_vkCmdBindIndexBuffer2)load(context, \"vkCmdBindIndexBuffer2\");\n\tvkCmdPushConstants2 = (PFN_vkCmdPushConstants2)load(context, \"vkCmdPushConstants2\");\n\tvkCmdPushDescriptorSet = (PFN_vkCmdPushDescriptorSet)load(context, \"vkCmdPushDescriptorSet\");\n\tvkCmdPushDescriptorSet2 = (PFN_vkCmdPushDescriptorSet2)load(context, \"vkCmdPushDescriptorSet2\");\n\tvkCmdPushDescriptorSetWithTemplate = (PFN_vkCmdPushDescriptorSetWithTemplate)load(context, \"vkCmdPushDescriptorSetWithTemplate\");\n\tvkCmdPushDescriptorSetWithTemplate2 = (PFN_vkCmdPushDescriptorSetWithTemplate2)load(context, \"vkCmdPushDescriptorSetWithTemplate2\");\n\tvkCmdSetLineStipple = (PFN_vkCmdSetLineStipple)load(context, \"vkCmdSetLineStipple\");\n\tvkCmdSetRenderingAttachmentLocations = (PFN_vkCmdSetRenderingAttachmentLocations)load(context, \"vkCmdSetRenderingAttachmentLocations\");\n\tvkCmdSetRenderingInputAttachmentIndices = (PFN_vkCmdSetRenderingInputAttachmentIndices)load(context, \"vkCmdSetRenderingInputAttachmentIndices\");\n\tvkCopyImageToImage = (PFN_vkCopyImageToImage)load(context, \"vkCopyImageToImage\");\n\tvkCopyImageToMemory = (PFN_vkCopyImageToMemory)load(context, \"vkCopyImageToMemory\");\n\tvkCopyMemoryToImage = (PFN_vkCopyMemoryToImage)load(context, \"vkCopyMemoryToImage\");\n\tvkGetDeviceImageSubresourceLayout = (PFN_vkGetDeviceImageSubresourceLayout)load(context, \"vkGetDeviceImageSubresourceLayout\");\n\tvkGetImageSubresourceLayout2 = (PFN_vkGetImageSubresourceLayout2)load(context, \"vkGetImageSubresourceLayout2\");\n\tvkGetRenderingAreaGranularity = (PFN_vkGetRenderingAreaGranularity)load(context, \"vkGetRenderingAreaGranularity\");\n\tvkMapMemory2 = (PFN_vkMapMemory2)load(context, \"vkMapMemory2\");\n\tvkTransitionImageLayout = (PFN_vkTransitionImageLayout)load(context, \"vkTransitionImageLayout\");\n\tvkUnmapMemory2 = (PFN_vkUnmapMemory2)load(context, \"vkUnmapMemory2\");\n#endif /* defined(VK_VERSION_1_4) */\n#if defined(VK_AMDX_shader_enqueue)\n\tvkCmdDispatchGraphAMDX = (PFN_vkCmdDispatchGraphAMDX)load(context, \"vkCmdDispatchGraphAMDX\");\n\tvkCmdDispatchGraphIndirectAMDX = (PFN_vkCmdDispatchGraphIndirectAMDX)load(context, \"vkCmdDispatchGraphIndirectAMDX\");\n\tvkCmdDispatchGraphIndirectCountAMDX = (PFN_vkCmdDispatchGraphIndirectCountAMDX)load(context, \"vkCmdDispatchGraphIndirectCountAMDX\");\n\tvkCmdInitializeGraphScratchMemoryAMDX = (PFN_vkCmdInitializeGraphScratchMemoryAMDX)load(context, \"vkCmdInitializeGraphScratchMemoryAMDX\");\n\tvkCreateExecutionGraphPipelinesAMDX = (PFN_vkCreateExecutionGraphPipelinesAMDX)load(context, \"vkCreateExecutionGraphPipelinesAMDX\");\n\tvkGetExecutionGraphPipelineNodeIndexAMDX = (PFN_vkGetExecutionGraphPipelineNodeIndexAMDX)load(context, \"vkGetExecutionGraphPipelineNodeIndexAMDX\");\n\tvkGetExecutionGraphPipelineScratchSizeAMDX = (PFN_vkGetExecutionGraphPipelineScratchSizeAMDX)load(context, \"vkGetExecutionGraphPipelineScratchSizeAMDX\");\n#endif /* defined(VK_AMDX_shader_enqueue) */\n#if defined(VK_AMD_anti_lag)\n\tvkAntiLagUpdateAMD = (PFN_vkAntiLagUpdateAMD)load(context, \"vkAntiLagUpdateAMD\");\n#endif /* defined(VK_AMD_anti_lag) */\n#if defined(VK_AMD_buffer_marker)\n\tvkCmdWriteBufferMarkerAMD = (PFN_vkCmdWriteBufferMarkerAMD)load(context, \"vkCmdWriteBufferMarkerAMD\");\n#endif /* defined(VK_AMD_buffer_marker) */\n#if defined(VK_AMD_buffer_marker) && (defined(VK_VERSION_1_3) || defined(VK_KHR_synchronization2))\n\tvkCmdWriteBufferMarker2AMD = (PFN_vkCmdWriteBufferMarker2AMD)load(context, \"vkCmdWriteBufferMarker2AMD\");\n#endif /* defined(VK_AMD_buffer_marker) && (defined(VK_VERSION_1_3) || defined(VK_KHR_synchronization2)) */\n#if defined(VK_AMD_display_native_hdr)\n\tvkSetLocalDimmingAMD = (PFN_vkSetLocalDimmingAMD)load(context, \"vkSetLocalDimmingAMD\");\n#endif /* defined(VK_AMD_display_native_hdr) */\n#if defined(VK_AMD_draw_indirect_count)\n\tvkCmdDrawIndexedIndirectCountAMD = (PFN_vkCmdDrawIndexedIndirectCountAMD)load(context, \"vkCmdDrawIndexedIndirectCountAMD\");\n\tvkCmdDrawIndirectCountAMD = (PFN_vkCmdDrawIndirectCountAMD)load(context, \"vkCmdDrawIndirectCountAMD\");\n#endif /* defined(VK_AMD_draw_indirect_count) */\n#if defined(VK_AMD_shader_info)\n\tvkGetShaderInfoAMD = (PFN_vkGetShaderInfoAMD)load(context, \"vkGetShaderInfoAMD\");\n#endif /* defined(VK_AMD_shader_info) */\n#if defined(VK_ANDROID_external_memory_android_hardware_buffer)\n\tvkGetAndroidHardwareBufferPropertiesANDROID = (PFN_vkGetAndroidHardwareBufferPropertiesANDROID)load(context, \"vkGetAndroidHardwareBufferPropertiesANDROID\");\n\tvkGetMemoryAndroidHardwareBufferANDROID = (PFN_vkGetMemoryAndroidHardwareBufferANDROID)load(context, \"vkGetMemoryAndroidHardwareBufferANDROID\");\n#endif /* defined(VK_ANDROID_external_memory_android_hardware_buffer) */\n#if defined(VK_EXT_attachment_feedback_loop_dynamic_state)\n\tvkCmdSetAttachmentFeedbackLoopEnableEXT = (PFN_vkCmdSetAttachmentFeedbackLoopEnableEXT)load(context, \"vkCmdSetAttachmentFeedbackLoopEnableEXT\");\n#endif /* defined(VK_EXT_attachment_feedback_loop_dynamic_state) */\n#if defined(VK_EXT_buffer_device_address)\n\tvkGetBufferDeviceAddressEXT = (PFN_vkGetBufferDeviceAddressEXT)load(context, \"vkGetBufferDeviceAddressEXT\");\n#endif /* defined(VK_EXT_buffer_device_address) */\n#if defined(VK_EXT_calibrated_timestamps)\n\tvkGetCalibratedTimestampsEXT = (PFN_vkGetCalibratedTimestampsEXT)load(context, \"vkGetCalibratedTimestampsEXT\");\n#endif /* defined(VK_EXT_calibrated_timestamps) */\n#if defined(VK_EXT_color_write_enable)\n\tvkCmdSetColorWriteEnableEXT = (PFN_vkCmdSetColorWriteEnableEXT)load(context, \"vkCmdSetColorWriteEnableEXT\");\n#endif /* defined(VK_EXT_color_write_enable) */\n#if defined(VK_EXT_conditional_rendering)\n\tvkCmdBeginConditionalRenderingEXT = (PFN_vkCmdBeginConditionalRenderingEXT)load(context, \"vkCmdBeginConditionalRenderingEXT\");\n\tvkCmdEndConditionalRenderingEXT = (PFN_vkCmdEndConditionalRenderingEXT)load(context, \"vkCmdEndConditionalRenderingEXT\");\n#endif /* defined(VK_EXT_conditional_rendering) */\n#if defined(VK_EXT_debug_marker)\n\tvkCmdDebugMarkerBeginEXT = (PFN_vkCmdDebugMarkerBeginEXT)load(context, \"vkCmdDebugMarkerBeginEXT\");\n\tvkCmdDebugMarkerEndEXT = (PFN_vkCmdDebugMarkerEndEXT)load(context, \"vkCmdDebugMarkerEndEXT\");\n\tvkCmdDebugMarkerInsertEXT = (PFN_vkCmdDebugMarkerInsertEXT)load(context, \"vkCmdDebugMarkerInsertEXT\");\n\tvkDebugMarkerSetObjectNameEXT = (PFN_vkDebugMarkerSetObjectNameEXT)load(context, \"vkDebugMarkerSetObjectNameEXT\");\n\tvkDebugMarkerSetObjectTagEXT = (PFN_vkDebugMarkerSetObjectTagEXT)load(context, \"vkDebugMarkerSetObjectTagEXT\");\n#endif /* defined(VK_EXT_debug_marker) */\n#if defined(VK_EXT_depth_bias_control)\n\tvkCmdSetDepthBias2EXT = (PFN_vkCmdSetDepthBias2EXT)load(context, \"vkCmdSetDepthBias2EXT\");\n#endif /* defined(VK_EXT_depth_bias_control) */\n#if defined(VK_EXT_descriptor_buffer)\n\tvkCmdBindDescriptorBufferEmbeddedSamplersEXT = (PFN_vkCmdBindDescriptorBufferEmbeddedSamplersEXT)load(context, \"vkCmdBindDescriptorBufferEmbeddedSamplersEXT\");\n\tvkCmdBindDescriptorBuffersEXT = (PFN_vkCmdBindDescriptorBuffersEXT)load(context, \"vkCmdBindDescriptorBuffersEXT\");\n\tvkCmdSetDescriptorBufferOffsetsEXT = (PFN_vkCmdSetDescriptorBufferOffsetsEXT)load(context, \"vkCmdSetDescriptorBufferOffsetsEXT\");\n\tvkGetBufferOpaqueCaptureDescriptorDataEXT = (PFN_vkGetBufferOpaqueCaptureDescriptorDataEXT)load(context, \"vkGetBufferOpaqueCaptureDescriptorDataEXT\");\n\tvkGetDescriptorEXT = (PFN_vkGetDescriptorEXT)load(context, \"vkGetDescriptorEXT\");\n\tvkGetDescriptorSetLayoutBindingOffsetEXT = (PFN_vkGetDescriptorSetLayoutBindingOffsetEXT)load(context, \"vkGetDescriptorSetLayoutBindingOffsetEXT\");\n\tvkGetDescriptorSetLayoutSizeEXT = (PFN_vkGetDescriptorSetLayoutSizeEXT)load(context, \"vkGetDescriptorSetLayoutSizeEXT\");\n\tvkGetImageOpaqueCaptureDescriptorDataEXT = (PFN_vkGetImageOpaqueCaptureDescriptorDataEXT)load(context, \"vkGetImageOpaqueCaptureDescriptorDataEXT\");\n\tvkGetImageViewOpaqueCaptureDescriptorDataEXT = (PFN_vkGetImageViewOpaqueCaptureDescriptorDataEXT)load(context, \"vkGetImageViewOpaqueCaptureDescriptorDataEXT\");\n\tvkGetSamplerOpaqueCaptureDescriptorDataEXT = (PFN_vkGetSamplerOpaqueCaptureDescriptorDataEXT)load(context, \"vkGetSamplerOpaqueCaptureDescriptorDataEXT\");\n#endif /* defined(VK_EXT_descriptor_buffer) */\n#if defined(VK_EXT_descriptor_buffer) && (defined(VK_KHR_acceleration_structure) || defined(VK_NV_ray_tracing))\n\tvkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT = (PFN_vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT)load(context, \"vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT\");\n#endif /* defined(VK_EXT_descriptor_buffer) && (defined(VK_KHR_acceleration_structure) || defined(VK_NV_ray_tracing)) */\n#if defined(VK_EXT_device_fault)\n\tvkGetDeviceFaultInfoEXT = (PFN_vkGetDeviceFaultInfoEXT)load(context, \"vkGetDeviceFaultInfoEXT\");\n#endif /* defined(VK_EXT_device_fault) */\n#if defined(VK_EXT_device_generated_commands)\n\tvkCmdExecuteGeneratedCommandsEXT = (PFN_vkCmdExecuteGeneratedCommandsEXT)load(context, \"vkCmdExecuteGeneratedCommandsEXT\");\n\tvkCmdPreprocessGeneratedCommandsEXT = (PFN_vkCmdPreprocessGeneratedCommandsEXT)load(context, \"vkCmdPreprocessGeneratedCommandsEXT\");\n\tvkCreateIndirectCommandsLayoutEXT = (PFN_vkCreateIndirectCommandsLayoutEXT)load(context, \"vkCreateIndirectCommandsLayoutEXT\");\n\tvkCreateIndirectExecutionSetEXT = (PFN_vkCreateIndirectExecutionSetEXT)load(context, \"vkCreateIndirectExecutionSetEXT\");\n\tvkDestroyIndirectCommandsLayoutEXT = (PFN_vkDestroyIndirectCommandsLayoutEXT)load(context, \"vkDestroyIndirectCommandsLayoutEXT\");\n\tvkDestroyIndirectExecutionSetEXT = (PFN_vkDestroyIndirectExecutionSetEXT)load(context, \"vkDestroyIndirectExecutionSetEXT\");\n\tvkGetGeneratedCommandsMemoryRequirementsEXT = (PFN_vkGetGeneratedCommandsMemoryRequirementsEXT)load(context, \"vkGetGeneratedCommandsMemoryRequirementsEXT\");\n\tvkUpdateIndirectExecutionSetPipelineEXT = (PFN_vkUpdateIndirectExecutionSetPipelineEXT)load(context, \"vkUpdateIndirectExecutionSetPipelineEXT\");\n\tvkUpdateIndirectExecutionSetShaderEXT = (PFN_vkUpdateIndirectExecutionSetShaderEXT)load(context, \"vkUpdateIndirectExecutionSetShaderEXT\");\n#endif /* defined(VK_EXT_device_generated_commands) */\n#if defined(VK_EXT_discard_rectangles)\n\tvkCmdSetDiscardRectangleEXT = (PFN_vkCmdSetDiscardRectangleEXT)load(context, \"vkCmdSetDiscardRectangleEXT\");\n#endif /* defined(VK_EXT_discard_rectangles) */\n#if defined(VK_EXT_discard_rectangles) && VK_EXT_DISCARD_RECTANGLES_SPEC_VERSION >= 2\n\tvkCmdSetDiscardRectangleEnableEXT = (PFN_vkCmdSetDiscardRectangleEnableEXT)load(context, \"vkCmdSetDiscardRectangleEnableEXT\");\n\tvkCmdSetDiscardRectangleModeEXT = (PFN_vkCmdSetDiscardRectangleModeEXT)load(context, \"vkCmdSetDiscardRectangleModeEXT\");\n#endif /* defined(VK_EXT_discard_rectangles) && VK_EXT_DISCARD_RECTANGLES_SPEC_VERSION >= 2 */\n#if defined(VK_EXT_display_control)\n\tvkDisplayPowerControlEXT = (PFN_vkDisplayPowerControlEXT)load(context, \"vkDisplayPowerControlEXT\");\n\tvkGetSwapchainCounterEXT = (PFN_vkGetSwapchainCounterEXT)load(context, \"vkGetSwapchainCounterEXT\");\n\tvkRegisterDeviceEventEXT = (PFN_vkRegisterDeviceEventEXT)load(context, \"vkRegisterDeviceEventEXT\");\n\tvkRegisterDisplayEventEXT = (PFN_vkRegisterDisplayEventEXT)load(context, \"vkRegisterDisplayEventEXT\");\n#endif /* defined(VK_EXT_display_control) */\n#if defined(VK_EXT_external_memory_host)\n\tvkGetMemoryHostPointerPropertiesEXT = (PFN_vkGetMemoryHostPointerPropertiesEXT)load(context, \"vkGetMemoryHostPointerPropertiesEXT\");\n#endif /* defined(VK_EXT_external_memory_host) */\n#if defined(VK_EXT_external_memory_metal)\n\tvkGetMemoryMetalHandleEXT = (PFN_vkGetMemoryMetalHandleEXT)load(context, \"vkGetMemoryMetalHandleEXT\");\n\tvkGetMemoryMetalHandlePropertiesEXT = (PFN_vkGetMemoryMetalHandlePropertiesEXT)load(context, \"vkGetMemoryMetalHandlePropertiesEXT\");\n#endif /* defined(VK_EXT_external_memory_metal) */\n#if defined(VK_EXT_full_screen_exclusive)\n\tvkAcquireFullScreenExclusiveModeEXT = (PFN_vkAcquireFullScreenExclusiveModeEXT)load(context, \"vkAcquireFullScreenExclusiveModeEXT\");\n\tvkReleaseFullScreenExclusiveModeEXT = (PFN_vkReleaseFullScreenExclusiveModeEXT)load(context, \"vkReleaseFullScreenExclusiveModeEXT\");\n#endif /* defined(VK_EXT_full_screen_exclusive) */\n#if defined(VK_EXT_full_screen_exclusive) && (defined(VK_KHR_device_group) || defined(VK_VERSION_1_1))\n\tvkGetDeviceGroupSurfacePresentModes2EXT = (PFN_vkGetDeviceGroupSurfacePresentModes2EXT)load(context, \"vkGetDeviceGroupSurfacePresentModes2EXT\");\n#endif /* defined(VK_EXT_full_screen_exclusive) && (defined(VK_KHR_device_group) || defined(VK_VERSION_1_1)) */\n#if defined(VK_EXT_hdr_metadata)\n\tvkSetHdrMetadataEXT = (PFN_vkSetHdrMetadataEXT)load(context, \"vkSetHdrMetadataEXT\");\n#endif /* defined(VK_EXT_hdr_metadata) */\n#if defined(VK_EXT_host_image_copy)\n\tvkCopyImageToImageEXT = (PFN_vkCopyImageToImageEXT)load(context, \"vkCopyImageToImageEXT\");\n\tvkCopyImageToMemoryEXT = (PFN_vkCopyImageToMemoryEXT)load(context, \"vkCopyImageToMemoryEXT\");\n\tvkCopyMemoryToImageEXT = (PFN_vkCopyMemoryToImageEXT)load(context, \"vkCopyMemoryToImageEXT\");\n\tvkTransitionImageLayoutEXT = (PFN_vkTransitionImageLayoutEXT)load(context, \"vkTransitionImageLayoutEXT\");\n#endif /* defined(VK_EXT_host_image_copy) */\n#if defined(VK_EXT_host_query_reset)\n\tvkResetQueryPoolEXT = (PFN_vkResetQueryPoolEXT)load(context, \"vkResetQueryPoolEXT\");\n#endif /* defined(VK_EXT_host_query_reset) */\n#if defined(VK_EXT_image_drm_format_modifier)\n\tvkGetImageDrmFormatModifierPropertiesEXT = (PFN_vkGetImageDrmFormatModifierPropertiesEXT)load(context, \"vkGetImageDrmFormatModifierPropertiesEXT\");\n#endif /* defined(VK_EXT_image_drm_format_modifier) */\n#if defined(VK_EXT_line_rasterization)\n\tvkCmdSetLineStippleEXT = (PFN_vkCmdSetLineStippleEXT)load(context, \"vkCmdSetLineStippleEXT\");\n#endif /* defined(VK_EXT_line_rasterization) */\n#if defined(VK_EXT_mesh_shader)\n\tvkCmdDrawMeshTasksEXT = (PFN_vkCmdDrawMeshTasksEXT)load(context, \"vkCmdDrawMeshTasksEXT\");\n\tvkCmdDrawMeshTasksIndirectEXT = (PFN_vkCmdDrawMeshTasksIndirectEXT)load(context, \"vkCmdDrawMeshTasksIndirectEXT\");\n#endif /* defined(VK_EXT_mesh_shader) */\n#if defined(VK_EXT_mesh_shader) && (defined(VK_KHR_draw_indirect_count) || defined(VK_VERSION_1_2))\n\tvkCmdDrawMeshTasksIndirectCountEXT = (PFN_vkCmdDrawMeshTasksIndirectCountEXT)load(context, \"vkCmdDrawMeshTasksIndirectCountEXT\");\n#endif /* defined(VK_EXT_mesh_shader) && (defined(VK_KHR_draw_indirect_count) || defined(VK_VERSION_1_2)) */\n#if defined(VK_EXT_metal_objects)\n\tvkExportMetalObjectsEXT = (PFN_vkExportMetalObjectsEXT)load(context, \"vkExportMetalObjectsEXT\");\n#endif /* defined(VK_EXT_metal_objects) */\n#if defined(VK_EXT_multi_draw)\n\tvkCmdDrawMultiEXT = (PFN_vkCmdDrawMultiEXT)load(context, \"vkCmdDrawMultiEXT\");\n\tvkCmdDrawMultiIndexedEXT = (PFN_vkCmdDrawMultiIndexedEXT)load(context, \"vkCmdDrawMultiIndexedEXT\");\n#endif /* defined(VK_EXT_multi_draw) */\n#if defined(VK_EXT_opacity_micromap)\n\tvkBuildMicromapsEXT = (PFN_vkBuildMicromapsEXT)load(context, \"vkBuildMicromapsEXT\");\n\tvkCmdBuildMicromapsEXT = (PFN_vkCmdBuildMicromapsEXT)load(context, \"vkCmdBuildMicromapsEXT\");\n\tvkCmdCopyMemoryToMicromapEXT = (PFN_vkCmdCopyMemoryToMicromapEXT)load(context, \"vkCmdCopyMemoryToMicromapEXT\");\n\tvkCmdCopyMicromapEXT = (PFN_vkCmdCopyMicromapEXT)load(context, \"vkCmdCopyMicromapEXT\");\n\tvkCmdCopyMicromapToMemoryEXT = (PFN_vkCmdCopyMicromapToMemoryEXT)load(context, \"vkCmdCopyMicromapToMemoryEXT\");\n\tvkCmdWriteMicromapsPropertiesEXT = (PFN_vkCmdWriteMicromapsPropertiesEXT)load(context, \"vkCmdWriteMicromapsPropertiesEXT\");\n\tvkCopyMemoryToMicromapEXT = (PFN_vkCopyMemoryToMicromapEXT)load(context, \"vkCopyMemoryToMicromapEXT\");\n\tvkCopyMicromapEXT = (PFN_vkCopyMicromapEXT)load(context, \"vkCopyMicromapEXT\");\n\tvkCopyMicromapToMemoryEXT = (PFN_vkCopyMicromapToMemoryEXT)load(context, \"vkCopyMicromapToMemoryEXT\");\n\tvkCreateMicromapEXT = (PFN_vkCreateMicromapEXT)load(context, \"vkCreateMicromapEXT\");\n\tvkDestroyMicromapEXT = (PFN_vkDestroyMicromapEXT)load(context, \"vkDestroyMicromapEXT\");\n\tvkGetDeviceMicromapCompatibilityEXT = (PFN_vkGetDeviceMicromapCompatibilityEXT)load(context, \"vkGetDeviceMicromapCompatibilityEXT\");\n\tvkGetMicromapBuildSizesEXT = (PFN_vkGetMicromapBuildSizesEXT)load(context, \"vkGetMicromapBuildSizesEXT\");\n\tvkWriteMicromapsPropertiesEXT = (PFN_vkWriteMicromapsPropertiesEXT)load(context, \"vkWriteMicromapsPropertiesEXT\");\n#endif /* defined(VK_EXT_opacity_micromap) */\n#if defined(VK_EXT_pageable_device_local_memory)\n\tvkSetDeviceMemoryPriorityEXT = (PFN_vkSetDeviceMemoryPriorityEXT)load(context, \"vkSetDeviceMemoryPriorityEXT\");\n#endif /* defined(VK_EXT_pageable_device_local_memory) */\n#if defined(VK_EXT_pipeline_properties)\n\tvkGetPipelinePropertiesEXT = (PFN_vkGetPipelinePropertiesEXT)load(context, \"vkGetPipelinePropertiesEXT\");\n#endif /* defined(VK_EXT_pipeline_properties) */\n#if defined(VK_EXT_private_data)\n\tvkCreatePrivateDataSlotEXT = (PFN_vkCreatePrivateDataSlotEXT)load(context, \"vkCreatePrivateDataSlotEXT\");\n\tvkDestroyPrivateDataSlotEXT = (PFN_vkDestroyPrivateDataSlotEXT)load(context, \"vkDestroyPrivateDataSlotEXT\");\n\tvkGetPrivateDataEXT = (PFN_vkGetPrivateDataEXT)load(context, \"vkGetPrivateDataEXT\");\n\tvkSetPrivateDataEXT = (PFN_vkSetPrivateDataEXT)load(context, \"vkSetPrivateDataEXT\");\n#endif /* defined(VK_EXT_private_data) */\n#if defined(VK_EXT_sample_locations)\n\tvkCmdSetSampleLocationsEXT = (PFN_vkCmdSetSampleLocationsEXT)load(context, \"vkCmdSetSampleLocationsEXT\");\n#endif /* defined(VK_EXT_sample_locations) */\n#if defined(VK_EXT_shader_module_identifier)\n\tvkGetShaderModuleCreateInfoIdentifierEXT = (PFN_vkGetShaderModuleCreateInfoIdentifierEXT)load(context, \"vkGetShaderModuleCreateInfoIdentifierEXT\");\n\tvkGetShaderModuleIdentifierEXT = (PFN_vkGetShaderModuleIdentifierEXT)load(context, \"vkGetShaderModuleIdentifierEXT\");\n#endif /* defined(VK_EXT_shader_module_identifier) */\n#if defined(VK_EXT_shader_object)\n\tvkCmdBindShadersEXT = (PFN_vkCmdBindShadersEXT)load(context, \"vkCmdBindShadersEXT\");\n\tvkCreateShadersEXT = (PFN_vkCreateShadersEXT)load(context, \"vkCreateShadersEXT\");\n\tvkDestroyShaderEXT = (PFN_vkDestroyShaderEXT)load(context, \"vkDestroyShaderEXT\");\n\tvkGetShaderBinaryDataEXT = (PFN_vkGetShaderBinaryDataEXT)load(context, \"vkGetShaderBinaryDataEXT\");\n#endif /* defined(VK_EXT_shader_object) */\n#if defined(VK_EXT_swapchain_maintenance1)\n\tvkReleaseSwapchainImagesEXT = (PFN_vkReleaseSwapchainImagesEXT)load(context, \"vkReleaseSwapchainImagesEXT\");\n#endif /* defined(VK_EXT_swapchain_maintenance1) */\n#if defined(VK_EXT_transform_feedback)\n\tvkCmdBeginQueryIndexedEXT = (PFN_vkCmdBeginQueryIndexedEXT)load(context, \"vkCmdBeginQueryIndexedEXT\");\n\tvkCmdBeginTransformFeedbackEXT = (PFN_vkCmdBeginTransformFeedbackEXT)load(context, \"vkCmdBeginTransformFeedbackEXT\");\n\tvkCmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)load(context, \"vkCmdBindTransformFeedbackBuffersEXT\");\n\tvkCmdDrawIndirectByteCountEXT = (PFN_vkCmdDrawIndirectByteCountEXT)load(context, \"vkCmdDrawIndirectByteCountEXT\");\n\tvkCmdEndQueryIndexedEXT = (PFN_vkCmdEndQueryIndexedEXT)load(context, \"vkCmdEndQueryIndexedEXT\");\n\tvkCmdEndTransformFeedbackEXT = (PFN_vkCmdEndTransformFeedbackEXT)load(context, \"vkCmdEndTransformFeedbackEXT\");\n#endif /* defined(VK_EXT_transform_feedback) */\n#if defined(VK_EXT_validation_cache)\n\tvkCreateValidationCacheEXT = (PFN_vkCreateValidationCacheEXT)load(context, \"vkCreateValidationCacheEXT\");\n\tvkDestroyValidationCacheEXT = (PFN_vkDestroyValidationCacheEXT)load(context, \"vkDestroyValidationCacheEXT\");\n\tvkGetValidationCacheDataEXT = (PFN_vkGetValidationCacheDataEXT)load(context, \"vkGetValidationCacheDataEXT\");\n\tvkMergeValidationCachesEXT = (PFN_vkMergeValidationCachesEXT)load(context, \"vkMergeValidationCachesEXT\");\n#endif /* defined(VK_EXT_validation_cache) */\n#if defined(VK_FUCHSIA_buffer_collection)\n\tvkCreateBufferCollectionFUCHSIA = (PFN_vkCreateBufferCollectionFUCHSIA)load(context, \"vkCreateBufferCollectionFUCHSIA\");\n\tvkDestroyBufferCollectionFUCHSIA = (PFN_vkDestroyBufferCollectionFUCHSIA)load(context, \"vkDestroyBufferCollectionFUCHSIA\");\n\tvkGetBufferCollectionPropertiesFUCHSIA = (PFN_vkGetBufferCollectionPropertiesFUCHSIA)load(context, \"vkGetBufferCollectionPropertiesFUCHSIA\");\n\tvkSetBufferCollectionBufferConstraintsFUCHSIA = (PFN_vkSetBufferCollectionBufferConstraintsFUCHSIA)load(context, \"vkSetBufferCollectionBufferConstraintsFUCHSIA\");\n\tvkSetBufferCollectionImageConstraintsFUCHSIA = (PFN_vkSetBufferCollectionImageConstraintsFUCHSIA)load(context, \"vkSetBufferCollectionImageConstraintsFUCHSIA\");\n#endif /* defined(VK_FUCHSIA_buffer_collection) */\n#if defined(VK_FUCHSIA_external_memory)\n\tvkGetMemoryZirconHandleFUCHSIA = (PFN_vkGetMemoryZirconHandleFUCHSIA)load(context, \"vkGetMemoryZirconHandleFUCHSIA\");\n\tvkGetMemoryZirconHandlePropertiesFUCHSIA = (PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA)load(context, \"vkGetMemoryZirconHandlePropertiesFUCHSIA\");\n#endif /* defined(VK_FUCHSIA_external_memory) */\n#if defined(VK_FUCHSIA_external_semaphore)\n\tvkGetSemaphoreZirconHandleFUCHSIA = (PFN_vkGetSemaphoreZirconHandleFUCHSIA)load(context, \"vkGetSemaphoreZirconHandleFUCHSIA\");\n\tvkImportSemaphoreZirconHandleFUCHSIA = (PFN_vkImportSemaphoreZirconHandleFUCHSIA)load(context, \"vkImportSemaphoreZirconHandleFUCHSIA\");\n#endif /* defined(VK_FUCHSIA_external_semaphore) */\n#if defined(VK_GOOGLE_display_timing)\n\tvkGetPastPresentationTimingGOOGLE = (PFN_vkGetPastPresentationTimingGOOGLE)load(context, \"vkGetPastPresentationTimingGOOGLE\");\n\tvkGetRefreshCycleDurationGOOGLE = (PFN_vkGetRefreshCycleDurationGOOGLE)load(context, \"vkGetRefreshCycleDurationGOOGLE\");\n#endif /* defined(VK_GOOGLE_display_timing) */\n#if defined(VK_HUAWEI_cluster_culling_shader)\n\tvkCmdDrawClusterHUAWEI = (PFN_vkCmdDrawClusterHUAWEI)load(context, \"vkCmdDrawClusterHUAWEI\");\n\tvkCmdDrawClusterIndirectHUAWEI = (PFN_vkCmdDrawClusterIndirectHUAWEI)load(context, \"vkCmdDrawClusterIndirectHUAWEI\");\n#endif /* defined(VK_HUAWEI_cluster_culling_shader) */\n#if defined(VK_HUAWEI_invocation_mask)\n\tvkCmdBindInvocationMaskHUAWEI = (PFN_vkCmdBindInvocationMaskHUAWEI)load(context, \"vkCmdBindInvocationMaskHUAWEI\");\n#endif /* defined(VK_HUAWEI_invocation_mask) */\n#if defined(VK_HUAWEI_subpass_shading) && VK_HUAWEI_SUBPASS_SHADING_SPEC_VERSION >= 2\n\tvkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = (PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI)load(context, \"vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI\");\n#endif /* defined(VK_HUAWEI_subpass_shading) && VK_HUAWEI_SUBPASS_SHADING_SPEC_VERSION >= 2 */\n#if defined(VK_HUAWEI_subpass_shading)\n\tvkCmdSubpassShadingHUAWEI = (PFN_vkCmdSubpassShadingHUAWEI)load(context, \"vkCmdSubpassShadingHUAWEI\");\n#endif /* defined(VK_HUAWEI_subpass_shading) */\n#if defined(VK_INTEL_performance_query)\n\tvkAcquirePerformanceConfigurationINTEL = (PFN_vkAcquirePerformanceConfigurationINTEL)load(context, \"vkAcquirePerformanceConfigurationINTEL\");\n\tvkCmdSetPerformanceMarkerINTEL = (PFN_vkCmdSetPerformanceMarkerINTEL)load(context, \"vkCmdSetPerformanceMarkerINTEL\");\n\tvkCmdSetPerformanceOverrideINTEL = (PFN_vkCmdSetPerformanceOverrideINTEL)load(context, \"vkCmdSetPerformanceOverrideINTEL\");\n\tvkCmdSetPerformanceStreamMarkerINTEL = (PFN_vkCmdSetPerformanceStreamMarkerINTEL)load(context, \"vkCmdSetPerformanceStreamMarkerINTEL\");\n\tvkGetPerformanceParameterINTEL = (PFN_vkGetPerformanceParameterINTEL)load(context, \"vkGetPerformanceParameterINTEL\");\n\tvkInitializePerformanceApiINTEL = (PFN_vkInitializePerformanceApiINTEL)load(context, \"vkInitializePerformanceApiINTEL\");\n\tvkQueueSetPerformanceConfigurationINTEL = (PFN_vkQueueSetPerformanceConfigurationINTEL)load(context, \"vkQueueSetPerformanceConfigurationINTEL\");\n\tvkReleasePerformanceConfigurationINTEL = (PFN_vkReleasePerformanceConfigurationINTEL)load(context, \"vkReleasePerformanceConfigurationINTEL\");\n\tvkUninitializePerformanceApiINTEL = (PFN_vkUninitializePerformanceApiINTEL)load(context, \"vkUninitializePerformanceApiINTEL\");\n#endif /* defined(VK_INTEL_performance_query) */\n#if defined(VK_KHR_acceleration_structure)\n\tvkBuildAccelerationStructuresKHR = (PFN_vkBuildAccelerationStructuresKHR)load(context, \"vkBuildAccelerationStructuresKHR\");\n\tvkCmdBuildAccelerationStructuresIndirectKHR = (PFN_vkCmdBuildAccelerationStructuresIndirectKHR)load(context, \"vkCmdBuildAccelerationStructuresIndirectKHR\");\n\tvkCmdBuildAccelerationStructuresKHR = (PFN_vkCmdBuildAccelerationStructuresKHR)load(context, \"vkCmdBuildAccelerationStructuresKHR\");\n\tvkCmdCopyAccelerationStructureKHR = (PFN_vkCmdCopyAccelerationStructureKHR)load(context, \"vkCmdCopyAccelerationStructureKHR\");\n\tvkCmdCopyAccelerationStructureToMemoryKHR = (PFN_vkCmdCopyAccelerationStructureToMemoryKHR)load(context, \"vkCmdCopyAccelerationStructureToMemoryKHR\");\n\tvkCmdCopyMemoryToAccelerationStructureKHR = (PFN_vkCmdCopyMemoryToAccelerationStructureKHR)load(context, \"vkCmdCopyMemoryToAccelerationStructureKHR\");\n\tvkCmdWriteAccelerationStructuresPropertiesKHR = (PFN_vkCmdWriteAccelerationStructuresPropertiesKHR)load(context, \"vkCmdWriteAccelerationStructuresPropertiesKHR\");\n\tvkCopyAccelerationStructureKHR = (PFN_vkCopyAccelerationStructureKHR)load(context, \"vkCopyAccelerationStructureKHR\");\n\tvkCopyAccelerationStructureToMemoryKHR = (PFN_vkCopyAccelerationStructureToMemoryKHR)load(context, \"vkCopyAccelerationStructureToMemoryKHR\");\n\tvkCopyMemoryToAccelerationStructureKHR = (PFN_vkCopyMemoryToAccelerationStructureKHR)load(context, \"vkCopyMemoryToAccelerationStructureKHR\");\n\tvkCreateAccelerationStructureKHR = (PFN_vkCreateAccelerationStructureKHR)load(context, \"vkCreateAccelerationStructureKHR\");\n\tvkDestroyAccelerationStructureKHR = (PFN_vkDestroyAccelerationStructureKHR)load(context, \"vkDestroyAccelerationStructureKHR\");\n\tvkGetAccelerationStructureBuildSizesKHR = (PFN_vkGetAccelerationStructureBuildSizesKHR)load(context, \"vkGetAccelerationStructureBuildSizesKHR\");\n\tvkGetAccelerationStructureDeviceAddressKHR = (PFN_vkGetAccelerationStructureDeviceAddressKHR)load(context, \"vkGetAccelerationStructureDeviceAddressKHR\");\n\tvkGetDeviceAccelerationStructureCompatibilityKHR = (PFN_vkGetDeviceAccelerationStructureCompatibilityKHR)load(context, \"vkGetDeviceAccelerationStructureCompatibilityKHR\");\n\tvkWriteAccelerationStructuresPropertiesKHR = (PFN_vkWriteAccelerationStructuresPropertiesKHR)load(context, \"vkWriteAccelerationStructuresPropertiesKHR\");\n#endif /* defined(VK_KHR_acceleration_structure) */\n#if defined(VK_KHR_bind_memory2)\n\tvkBindBufferMemory2KHR = (PFN_vkBindBufferMemory2KHR)load(context, \"vkBindBufferMemory2KHR\");\n\tvkBindImageMemory2KHR = (PFN_vkBindImageMemory2KHR)load(context, \"vkBindImageMemory2KHR\");\n#endif /* defined(VK_KHR_bind_memory2) */\n#if defined(VK_KHR_buffer_device_address)\n\tvkGetBufferDeviceAddressKHR = (PFN_vkGetBufferDeviceAddressKHR)load(context, \"vkGetBufferDeviceAddressKHR\");\n\tvkGetBufferOpaqueCaptureAddressKHR = (PFN_vkGetBufferOpaqueCaptureAddressKHR)load(context, \"vkGetBufferOpaqueCaptureAddressKHR\");\n\tvkGetDeviceMemoryOpaqueCaptureAddressKHR = (PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR)load(context, \"vkGetDeviceMemoryOpaqueCaptureAddressKHR\");\n#endif /* defined(VK_KHR_buffer_device_address) */\n#if defined(VK_KHR_calibrated_timestamps)\n\tvkGetCalibratedTimestampsKHR = (PFN_vkGetCalibratedTimestampsKHR)load(context, \"vkGetCalibratedTimestampsKHR\");\n#endif /* defined(VK_KHR_calibrated_timestamps) */\n#if defined(VK_KHR_copy_commands2)\n\tvkCmdBlitImage2KHR = (PFN_vkCmdBlitImage2KHR)load(context, \"vkCmdBlitImage2KHR\");\n\tvkCmdCopyBuffer2KHR = (PFN_vkCmdCopyBuffer2KHR)load(context, \"vkCmdCopyBuffer2KHR\");\n\tvkCmdCopyBufferToImage2KHR = (PFN_vkCmdCopyBufferToImage2KHR)load(context, \"vkCmdCopyBufferToImage2KHR\");\n\tvkCmdCopyImage2KHR = (PFN_vkCmdCopyImage2KHR)load(context, \"vkCmdCopyImage2KHR\");\n\tvkCmdCopyImageToBuffer2KHR = (PFN_vkCmdCopyImageToBuffer2KHR)load(context, \"vkCmdCopyImageToBuffer2KHR\");\n\tvkCmdResolveImage2KHR = (PFN_vkCmdResolveImage2KHR)load(context, \"vkCmdResolveImage2KHR\");\n#endif /* defined(VK_KHR_copy_commands2) */\n#if defined(VK_KHR_create_renderpass2)\n\tvkCmdBeginRenderPass2KHR = (PFN_vkCmdBeginRenderPass2KHR)load(context, \"vkCmdBeginRenderPass2KHR\");\n\tvkCmdEndRenderPass2KHR = (PFN_vkCmdEndRenderPass2KHR)load(context, \"vkCmdEndRenderPass2KHR\");\n\tvkCmdNextSubpass2KHR = (PFN_vkCmdNextSubpass2KHR)load(context, \"vkCmdNextSubpass2KHR\");\n\tvkCreateRenderPass2KHR = (PFN_vkCreateRenderPass2KHR)load(context, \"vkCreateRenderPass2KHR\");\n#endif /* defined(VK_KHR_create_renderpass2) */\n#if defined(VK_KHR_deferred_host_operations)\n\tvkCreateDeferredOperationKHR = (PFN_vkCreateDeferredOperationKHR)load(context, \"vkCreateDeferredOperationKHR\");\n\tvkDeferredOperationJoinKHR = (PFN_vkDeferredOperationJoinKHR)load(context, \"vkDeferredOperationJoinKHR\");\n\tvkDestroyDeferredOperationKHR = (PFN_vkDestroyDeferredOperationKHR)load(context, \"vkDestroyDeferredOperationKHR\");\n\tvkGetDeferredOperationMaxConcurrencyKHR = (PFN_vkGetDeferredOperationMaxConcurrencyKHR)load(context, \"vkGetDeferredOperationMaxConcurrencyKHR\");\n\tvkGetDeferredOperationResultKHR = (PFN_vkGetDeferredOperationResultKHR)load(context, \"vkGetDeferredOperationResultKHR\");\n#endif /* defined(VK_KHR_deferred_host_operations) */\n#if defined(VK_KHR_descriptor_update_template)\n\tvkCreateDescriptorUpdateTemplateKHR = (PFN_vkCreateDescriptorUpdateTemplateKHR)load(context, \"vkCreateDescriptorUpdateTemplateKHR\");\n\tvkDestroyDescriptorUpdateTemplateKHR = (PFN_vkDestroyDescriptorUpdateTemplateKHR)load(context, \"vkDestroyDescriptorUpdateTemplateKHR\");\n\tvkUpdateDescriptorSetWithTemplateKHR = (PFN_vkUpdateDescriptorSetWithTemplateKHR)load(context, \"vkUpdateDescriptorSetWithTemplateKHR\");\n#endif /* defined(VK_KHR_descriptor_update_template) */\n#if defined(VK_KHR_device_group)\n\tvkCmdDispatchBaseKHR = (PFN_vkCmdDispatchBaseKHR)load(context, \"vkCmdDispatchBaseKHR\");\n\tvkCmdSetDeviceMaskKHR = (PFN_vkCmdSetDeviceMaskKHR)load(context, \"vkCmdSetDeviceMaskKHR\");\n\tvkGetDeviceGroupPeerMemoryFeaturesKHR = (PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR)load(context, \"vkGetDeviceGroupPeerMemoryFeaturesKHR\");\n#endif /* defined(VK_KHR_device_group) */\n#if defined(VK_KHR_display_swapchain)\n\tvkCreateSharedSwapchainsKHR = (PFN_vkCreateSharedSwapchainsKHR)load(context, \"vkCreateSharedSwapchainsKHR\");\n#endif /* defined(VK_KHR_display_swapchain) */\n#if defined(VK_KHR_draw_indirect_count)\n\tvkCmdDrawIndexedIndirectCountKHR = (PFN_vkCmdDrawIndexedIndirectCountKHR)load(context, \"vkCmdDrawIndexedIndirectCountKHR\");\n\tvkCmdDrawIndirectCountKHR = (PFN_vkCmdDrawIndirectCountKHR)load(context, \"vkCmdDrawIndirectCountKHR\");\n#endif /* defined(VK_KHR_draw_indirect_count) */\n#if defined(VK_KHR_dynamic_rendering)\n\tvkCmdBeginRenderingKHR = (PFN_vkCmdBeginRenderingKHR)load(context, \"vkCmdBeginRenderingKHR\");\n\tvkCmdEndRenderingKHR = (PFN_vkCmdEndRenderingKHR)load(context, \"vkCmdEndRenderingKHR\");\n#endif /* defined(VK_KHR_dynamic_rendering) */\n#if defined(VK_KHR_dynamic_rendering_local_read)\n\tvkCmdSetRenderingAttachmentLocationsKHR = (PFN_vkCmdSetRenderingAttachmentLocationsKHR)load(context, \"vkCmdSetRenderingAttachmentLocationsKHR\");\n\tvkCmdSetRenderingInputAttachmentIndicesKHR = (PFN_vkCmdSetRenderingInputAttachmentIndicesKHR)load(context, \"vkCmdSetRenderingInputAttachmentIndicesKHR\");\n#endif /* defined(VK_KHR_dynamic_rendering_local_read) */\n#if defined(VK_KHR_external_fence_fd)\n\tvkGetFenceFdKHR = (PFN_vkGetFenceFdKHR)load(context, \"vkGetFenceFdKHR\");\n\tvkImportFenceFdKHR = (PFN_vkImportFenceFdKHR)load(context, \"vkImportFenceFdKHR\");\n#endif /* defined(VK_KHR_external_fence_fd) */\n#if defined(VK_KHR_external_fence_win32)\n\tvkGetFenceWin32HandleKHR = (PFN_vkGetFenceWin32HandleKHR)load(context, \"vkGetFenceWin32HandleKHR\");\n\tvkImportFenceWin32HandleKHR = (PFN_vkImportFenceWin32HandleKHR)load(context, \"vkImportFenceWin32HandleKHR\");\n#endif /* defined(VK_KHR_external_fence_win32) */\n#if defined(VK_KHR_external_memory_fd)\n\tvkGetMemoryFdKHR = (PFN_vkGetMemoryFdKHR)load(context, \"vkGetMemoryFdKHR\");\n\tvkGetMemoryFdPropertiesKHR = (PFN_vkGetMemoryFdPropertiesKHR)load(context, \"vkGetMemoryFdPropertiesKHR\");\n#endif /* defined(VK_KHR_external_memory_fd) */\n#if defined(VK_KHR_external_memory_win32)\n\tvkGetMemoryWin32HandleKHR = (PFN_vkGetMemoryWin32HandleKHR)load(context, \"vkGetMemoryWin32HandleKHR\");\n\tvkGetMemoryWin32HandlePropertiesKHR = (PFN_vkGetMemoryWin32HandlePropertiesKHR)load(context, \"vkGetMemoryWin32HandlePropertiesKHR\");\n#endif /* defined(VK_KHR_external_memory_win32) */\n#if defined(VK_KHR_external_semaphore_fd)\n\tvkGetSemaphoreFdKHR = (PFN_vkGetSemaphoreFdKHR)load(context, \"vkGetSemaphoreFdKHR\");\n\tvkImportSemaphoreFdKHR = (PFN_vkImportSemaphoreFdKHR)load(context, \"vkImportSemaphoreFdKHR\");\n#endif /* defined(VK_KHR_external_semaphore_fd) */\n#if defined(VK_KHR_external_semaphore_win32)\n\tvkGetSemaphoreWin32HandleKHR = (PFN_vkGetSemaphoreWin32HandleKHR)load(context, \"vkGetSemaphoreWin32HandleKHR\");\n\tvkImportSemaphoreWin32HandleKHR = (PFN_vkImportSemaphoreWin32HandleKHR)load(context, \"vkImportSemaphoreWin32HandleKHR\");\n#endif /* defined(VK_KHR_external_semaphore_win32) */\n#if defined(VK_KHR_fragment_shading_rate)\n\tvkCmdSetFragmentShadingRateKHR = (PFN_vkCmdSetFragmentShadingRateKHR)load(context, \"vkCmdSetFragmentShadingRateKHR\");\n#endif /* defined(VK_KHR_fragment_shading_rate) */\n#if defined(VK_KHR_get_memory_requirements2)\n\tvkGetBufferMemoryRequirements2KHR = (PFN_vkGetBufferMemoryRequirements2KHR)load(context, \"vkGetBufferMemoryRequirements2KHR\");\n\tvkGetImageMemoryRequirements2KHR = (PFN_vkGetImageMemoryRequirements2KHR)load(context, \"vkGetImageMemoryRequirements2KHR\");\n\tvkGetImageSparseMemoryRequirements2KHR = (PFN_vkGetImageSparseMemoryRequirements2KHR)load(context, \"vkGetImageSparseMemoryRequirements2KHR\");\n#endif /* defined(VK_KHR_get_memory_requirements2) */\n#if defined(VK_KHR_line_rasterization)\n\tvkCmdSetLineStippleKHR = (PFN_vkCmdSetLineStippleKHR)load(context, \"vkCmdSetLineStippleKHR\");\n#endif /* defined(VK_KHR_line_rasterization) */\n#if defined(VK_KHR_maintenance1)\n\tvkTrimCommandPoolKHR = (PFN_vkTrimCommandPoolKHR)load(context, \"vkTrimCommandPoolKHR\");\n#endif /* defined(VK_KHR_maintenance1) */\n#if defined(VK_KHR_maintenance3)\n\tvkGetDescriptorSetLayoutSupportKHR = (PFN_vkGetDescriptorSetLayoutSupportKHR)load(context, \"vkGetDescriptorSetLayoutSupportKHR\");\n#endif /* defined(VK_KHR_maintenance3) */\n#if defined(VK_KHR_maintenance4)\n\tvkGetDeviceBufferMemoryRequirementsKHR = (PFN_vkGetDeviceBufferMemoryRequirementsKHR)load(context, \"vkGetDeviceBufferMemoryRequirementsKHR\");\n\tvkGetDeviceImageMemoryRequirementsKHR = (PFN_vkGetDeviceImageMemoryRequirementsKHR)load(context, \"vkGetDeviceImageMemoryRequirementsKHR\");\n\tvkGetDeviceImageSparseMemoryRequirementsKHR = (PFN_vkGetDeviceImageSparseMemoryRequirementsKHR)load(context, \"vkGetDeviceImageSparseMemoryRequirementsKHR\");\n#endif /* defined(VK_KHR_maintenance4) */\n#if defined(VK_KHR_maintenance5)\n\tvkCmdBindIndexBuffer2KHR = (PFN_vkCmdBindIndexBuffer2KHR)load(context, \"vkCmdBindIndexBuffer2KHR\");\n\tvkGetDeviceImageSubresourceLayoutKHR = (PFN_vkGetDeviceImageSubresourceLayoutKHR)load(context, \"vkGetDeviceImageSubresourceLayoutKHR\");\n\tvkGetImageSubresourceLayout2KHR = (PFN_vkGetImageSubresourceLayout2KHR)load(context, \"vkGetImageSubresourceLayout2KHR\");\n\tvkGetRenderingAreaGranularityKHR = (PFN_vkGetRenderingAreaGranularityKHR)load(context, \"vkGetRenderingAreaGranularityKHR\");\n#endif /* defined(VK_KHR_maintenance5) */\n#if defined(VK_KHR_maintenance6)\n\tvkCmdBindDescriptorSets2KHR = (PFN_vkCmdBindDescriptorSets2KHR)load(context, \"vkCmdBindDescriptorSets2KHR\");\n\tvkCmdPushConstants2KHR = (PFN_vkCmdPushConstants2KHR)load(context, \"vkCmdPushConstants2KHR\");\n#endif /* defined(VK_KHR_maintenance6) */\n#if defined(VK_KHR_maintenance6) && defined(VK_KHR_push_descriptor)\n\tvkCmdPushDescriptorSet2KHR = (PFN_vkCmdPushDescriptorSet2KHR)load(context, \"vkCmdPushDescriptorSet2KHR\");\n\tvkCmdPushDescriptorSetWithTemplate2KHR = (PFN_vkCmdPushDescriptorSetWithTemplate2KHR)load(context, \"vkCmdPushDescriptorSetWithTemplate2KHR\");\n#endif /* defined(VK_KHR_maintenance6) && defined(VK_KHR_push_descriptor) */\n#if defined(VK_KHR_maintenance6) && defined(VK_EXT_descriptor_buffer)\n\tvkCmdBindDescriptorBufferEmbeddedSamplers2EXT = (PFN_vkCmdBindDescriptorBufferEmbeddedSamplers2EXT)load(context, \"vkCmdBindDescriptorBufferEmbeddedSamplers2EXT\");\n\tvkCmdSetDescriptorBufferOffsets2EXT = (PFN_vkCmdSetDescriptorBufferOffsets2EXT)load(context, \"vkCmdSetDescriptorBufferOffsets2EXT\");\n#endif /* defined(VK_KHR_maintenance6) && defined(VK_EXT_descriptor_buffer) */\n#if defined(VK_KHR_map_memory2)\n\tvkMapMemory2KHR = (PFN_vkMapMemory2KHR)load(context, \"vkMapMemory2KHR\");\n\tvkUnmapMemory2KHR = (PFN_vkUnmapMemory2KHR)load(context, \"vkUnmapMemory2KHR\");\n#endif /* defined(VK_KHR_map_memory2) */\n#if defined(VK_KHR_performance_query)\n\tvkAcquireProfilingLockKHR = (PFN_vkAcquireProfilingLockKHR)load(context, \"vkAcquireProfilingLockKHR\");\n\tvkReleaseProfilingLockKHR = (PFN_vkReleaseProfilingLockKHR)load(context, \"vkReleaseProfilingLockKHR\");\n#endif /* defined(VK_KHR_performance_query) */\n#if defined(VK_KHR_pipeline_binary)\n\tvkCreatePipelineBinariesKHR = (PFN_vkCreatePipelineBinariesKHR)load(context, \"vkCreatePipelineBinariesKHR\");\n\tvkDestroyPipelineBinaryKHR = (PFN_vkDestroyPipelineBinaryKHR)load(context, \"vkDestroyPipelineBinaryKHR\");\n\tvkGetPipelineBinaryDataKHR = (PFN_vkGetPipelineBinaryDataKHR)load(context, \"vkGetPipelineBinaryDataKHR\");\n\tvkGetPipelineKeyKHR = (PFN_vkGetPipelineKeyKHR)load(context, \"vkGetPipelineKeyKHR\");\n\tvkReleaseCapturedPipelineDataKHR = (PFN_vkReleaseCapturedPipelineDataKHR)load(context, \"vkReleaseCapturedPipelineDataKHR\");\n#endif /* defined(VK_KHR_pipeline_binary) */\n#if defined(VK_KHR_pipeline_executable_properties)\n\tvkGetPipelineExecutableInternalRepresentationsKHR = (PFN_vkGetPipelineExecutableInternalRepresentationsKHR)load(context, \"vkGetPipelineExecutableInternalRepresentationsKHR\");\n\tvkGetPipelineExecutablePropertiesKHR = (PFN_vkGetPipelineExecutablePropertiesKHR)load(context, \"vkGetPipelineExecutablePropertiesKHR\");\n\tvkGetPipelineExecutableStatisticsKHR = (PFN_vkGetPipelineExecutableStatisticsKHR)load(context, \"vkGetPipelineExecutableStatisticsKHR\");\n#endif /* defined(VK_KHR_pipeline_executable_properties) */\n#if defined(VK_KHR_present_wait)\n\tvkWaitForPresentKHR = (PFN_vkWaitForPresentKHR)load(context, \"vkWaitForPresentKHR\");\n#endif /* defined(VK_KHR_present_wait) */\n#if defined(VK_KHR_push_descriptor)\n\tvkCmdPushDescriptorSetKHR = (PFN_vkCmdPushDescriptorSetKHR)load(context, \"vkCmdPushDescriptorSetKHR\");\n#endif /* defined(VK_KHR_push_descriptor) */\n#if defined(VK_KHR_ray_tracing_maintenance1) && defined(VK_KHR_ray_tracing_pipeline)\n\tvkCmdTraceRaysIndirect2KHR = (PFN_vkCmdTraceRaysIndirect2KHR)load(context, \"vkCmdTraceRaysIndirect2KHR\");\n#endif /* defined(VK_KHR_ray_tracing_maintenance1) && defined(VK_KHR_ray_tracing_pipeline) */\n#if defined(VK_KHR_ray_tracing_pipeline)\n\tvkCmdSetRayTracingPipelineStackSizeKHR = (PFN_vkCmdSetRayTracingPipelineStackSizeKHR)load(context, \"vkCmdSetRayTracingPipelineStackSizeKHR\");\n\tvkCmdTraceRaysIndirectKHR = (PFN_vkCmdTraceRaysIndirectKHR)load(context, \"vkCmdTraceRaysIndirectKHR\");\n\tvkCmdTraceRaysKHR = (PFN_vkCmdTraceRaysKHR)load(context, \"vkCmdTraceRaysKHR\");\n\tvkCreateRayTracingPipelinesKHR = (PFN_vkCreateRayTracingPipelinesKHR)load(context, \"vkCreateRayTracingPipelinesKHR\");\n\tvkGetRayTracingCaptureReplayShaderGroupHandlesKHR = (PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR)load(context, \"vkGetRayTracingCaptureReplayShaderGroupHandlesKHR\");\n\tvkGetRayTracingShaderGroupHandlesKHR = (PFN_vkGetRayTracingShaderGroupHandlesKHR)load(context, \"vkGetRayTracingShaderGroupHandlesKHR\");\n\tvkGetRayTracingShaderGroupStackSizeKHR = (PFN_vkGetRayTracingShaderGroupStackSizeKHR)load(context, \"vkGetRayTracingShaderGroupStackSizeKHR\");\n#endif /* defined(VK_KHR_ray_tracing_pipeline) */\n#if defined(VK_KHR_sampler_ycbcr_conversion)\n\tvkCreateSamplerYcbcrConversionKHR = (PFN_vkCreateSamplerYcbcrConversionKHR)load(context, \"vkCreateSamplerYcbcrConversionKHR\");\n\tvkDestroySamplerYcbcrConversionKHR = (PFN_vkDestroySamplerYcbcrConversionKHR)load(context, \"vkDestroySamplerYcbcrConversionKHR\");\n#endif /* defined(VK_KHR_sampler_ycbcr_conversion) */\n#if defined(VK_KHR_shared_presentable_image)\n\tvkGetSwapchainStatusKHR = (PFN_vkGetSwapchainStatusKHR)load(context, \"vkGetSwapchainStatusKHR\");\n#endif /* defined(VK_KHR_shared_presentable_image) */\n#if defined(VK_KHR_swapchain)\n\tvkAcquireNextImageKHR = (PFN_vkAcquireNextImageKHR)load(context, \"vkAcquireNextImageKHR\");\n\tvkCreateSwapchainKHR = (PFN_vkCreateSwapchainKHR)load(context, \"vkCreateSwapchainKHR\");\n\tvkDestroySwapchainKHR = (PFN_vkDestroySwapchainKHR)load(context, \"vkDestroySwapchainKHR\");\n\tvkGetSwapchainImagesKHR = (PFN_vkGetSwapchainImagesKHR)load(context, \"vkGetSwapchainImagesKHR\");\n\tvkQueuePresentKHR = (PFN_vkQueuePresentKHR)load(context, \"vkQueuePresentKHR\");\n#endif /* defined(VK_KHR_swapchain) */\n#if defined(VK_KHR_synchronization2)\n\tvkCmdPipelineBarrier2KHR = (PFN_vkCmdPipelineBarrier2KHR)load(context, \"vkCmdPipelineBarrier2KHR\");\n\tvkCmdResetEvent2KHR = (PFN_vkCmdResetEvent2KHR)load(context, \"vkCmdResetEvent2KHR\");\n\tvkCmdSetEvent2KHR = (PFN_vkCmdSetEvent2KHR)load(context, \"vkCmdSetEvent2KHR\");\n\tvkCmdWaitEvents2KHR = (PFN_vkCmdWaitEvents2KHR)load(context, \"vkCmdWaitEvents2KHR\");\n\tvkCmdWriteTimestamp2KHR = (PFN_vkCmdWriteTimestamp2KHR)load(context, \"vkCmdWriteTimestamp2KHR\");\n\tvkQueueSubmit2KHR = (PFN_vkQueueSubmit2KHR)load(context, \"vkQueueSubmit2KHR\");\n#endif /* defined(VK_KHR_synchronization2) */\n#if defined(VK_KHR_timeline_semaphore)\n\tvkGetSemaphoreCounterValueKHR = (PFN_vkGetSemaphoreCounterValueKHR)load(context, \"vkGetSemaphoreCounterValueKHR\");\n\tvkSignalSemaphoreKHR = (PFN_vkSignalSemaphoreKHR)load(context, \"vkSignalSemaphoreKHR\");\n\tvkWaitSemaphoresKHR = (PFN_vkWaitSemaphoresKHR)load(context, \"vkWaitSemaphoresKHR\");\n#endif /* defined(VK_KHR_timeline_semaphore) */\n#if defined(VK_KHR_video_decode_queue)\n\tvkCmdDecodeVideoKHR = (PFN_vkCmdDecodeVideoKHR)load(context, \"vkCmdDecodeVideoKHR\");\n#endif /* defined(VK_KHR_video_decode_queue) */\n#if defined(VK_KHR_video_encode_queue)\n\tvkCmdEncodeVideoKHR = (PFN_vkCmdEncodeVideoKHR)load(context, \"vkCmdEncodeVideoKHR\");\n\tvkGetEncodedVideoSessionParametersKHR = (PFN_vkGetEncodedVideoSessionParametersKHR)load(context, \"vkGetEncodedVideoSessionParametersKHR\");\n#endif /* defined(VK_KHR_video_encode_queue) */\n#if defined(VK_KHR_video_queue)\n\tvkBindVideoSessionMemoryKHR = (PFN_vkBindVideoSessionMemoryKHR)load(context, \"vkBindVideoSessionMemoryKHR\");\n\tvkCmdBeginVideoCodingKHR = (PFN_vkCmdBeginVideoCodingKHR)load(context, \"vkCmdBeginVideoCodingKHR\");\n\tvkCmdControlVideoCodingKHR = (PFN_vkCmdControlVideoCodingKHR)load(context, \"vkCmdControlVideoCodingKHR\");\n\tvkCmdEndVideoCodingKHR = (PFN_vkCmdEndVideoCodingKHR)load(context, \"vkCmdEndVideoCodingKHR\");\n\tvkCreateVideoSessionKHR = (PFN_vkCreateVideoSessionKHR)load(context, \"vkCreateVideoSessionKHR\");\n\tvkCreateVideoSessionParametersKHR = (PFN_vkCreateVideoSessionParametersKHR)load(context, \"vkCreateVideoSessionParametersKHR\");\n\tvkDestroyVideoSessionKHR = (PFN_vkDestroyVideoSessionKHR)load(context, \"vkDestroyVideoSessionKHR\");\n\tvkDestroyVideoSessionParametersKHR = (PFN_vkDestroyVideoSessionParametersKHR)load(context, \"vkDestroyVideoSessionParametersKHR\");\n\tvkGetVideoSessionMemoryRequirementsKHR = (PFN_vkGetVideoSessionMemoryRequirementsKHR)load(context, \"vkGetVideoSessionMemoryRequirementsKHR\");\n\tvkUpdateVideoSessionParametersKHR = (PFN_vkUpdateVideoSessionParametersKHR)load(context, \"vkUpdateVideoSessionParametersKHR\");\n#endif /* defined(VK_KHR_video_queue) */\n#if defined(VK_NVX_binary_import)\n\tvkCmdCuLaunchKernelNVX = (PFN_vkCmdCuLaunchKernelNVX)load(context, \"vkCmdCuLaunchKernelNVX\");\n\tvkCreateCuFunctionNVX = (PFN_vkCreateCuFunctionNVX)load(context, \"vkCreateCuFunctionNVX\");\n\tvkCreateCuModuleNVX = (PFN_vkCreateCuModuleNVX)load(context, \"vkCreateCuModuleNVX\");\n\tvkDestroyCuFunctionNVX = (PFN_vkDestroyCuFunctionNVX)load(context, \"vkDestroyCuFunctionNVX\");\n\tvkDestroyCuModuleNVX = (PFN_vkDestroyCuModuleNVX)load(context, \"vkDestroyCuModuleNVX\");\n#endif /* defined(VK_NVX_binary_import) */\n#if defined(VK_NVX_image_view_handle)\n\tvkGetImageViewHandleNVX = (PFN_vkGetImageViewHandleNVX)load(context, \"vkGetImageViewHandleNVX\");\n#endif /* defined(VK_NVX_image_view_handle) */\n#if defined(VK_NVX_image_view_handle) && VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION >= 3\n\tvkGetImageViewHandle64NVX = (PFN_vkGetImageViewHandle64NVX)load(context, \"vkGetImageViewHandle64NVX\");\n#endif /* defined(VK_NVX_image_view_handle) && VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION >= 3 */\n#if defined(VK_NVX_image_view_handle) && VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION >= 2\n\tvkGetImageViewAddressNVX = (PFN_vkGetImageViewAddressNVX)load(context, \"vkGetImageViewAddressNVX\");\n#endif /* defined(VK_NVX_image_view_handle) && VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION >= 2 */\n#if defined(VK_NV_clip_space_w_scaling)\n\tvkCmdSetViewportWScalingNV = (PFN_vkCmdSetViewportWScalingNV)load(context, \"vkCmdSetViewportWScalingNV\");\n#endif /* defined(VK_NV_clip_space_w_scaling) */\n#if defined(VK_NV_cluster_acceleration_structure)\n\tvkCmdBuildClusterAccelerationStructureIndirectNV = (PFN_vkCmdBuildClusterAccelerationStructureIndirectNV)load(context, \"vkCmdBuildClusterAccelerationStructureIndirectNV\");\n\tvkGetClusterAccelerationStructureBuildSizesNV = (PFN_vkGetClusterAccelerationStructureBuildSizesNV)load(context, \"vkGetClusterAccelerationStructureBuildSizesNV\");\n#endif /* defined(VK_NV_cluster_acceleration_structure) */\n#if defined(VK_NV_cooperative_vector)\n\tvkCmdConvertCooperativeVectorMatrixNV = (PFN_vkCmdConvertCooperativeVectorMatrixNV)load(context, \"vkCmdConvertCooperativeVectorMatrixNV\");\n\tvkConvertCooperativeVectorMatrixNV = (PFN_vkConvertCooperativeVectorMatrixNV)load(context, \"vkConvertCooperativeVectorMatrixNV\");\n#endif /* defined(VK_NV_cooperative_vector) */\n#if defined(VK_NV_copy_memory_indirect)\n\tvkCmdCopyMemoryIndirectNV = (PFN_vkCmdCopyMemoryIndirectNV)load(context, \"vkCmdCopyMemoryIndirectNV\");\n\tvkCmdCopyMemoryToImageIndirectNV = (PFN_vkCmdCopyMemoryToImageIndirectNV)load(context, \"vkCmdCopyMemoryToImageIndirectNV\");\n#endif /* defined(VK_NV_copy_memory_indirect) */\n#if defined(VK_NV_cuda_kernel_launch)\n\tvkCmdCudaLaunchKernelNV = (PFN_vkCmdCudaLaunchKernelNV)load(context, \"vkCmdCudaLaunchKernelNV\");\n\tvkCreateCudaFunctionNV = (PFN_vkCreateCudaFunctionNV)load(context, \"vkCreateCudaFunctionNV\");\n\tvkCreateCudaModuleNV = (PFN_vkCreateCudaModuleNV)load(context, \"vkCreateCudaModuleNV\");\n\tvkDestroyCudaFunctionNV = (PFN_vkDestroyCudaFunctionNV)load(context, \"vkDestroyCudaFunctionNV\");\n\tvkDestroyCudaModuleNV = (PFN_vkDestroyCudaModuleNV)load(context, \"vkDestroyCudaModuleNV\");\n\tvkGetCudaModuleCacheNV = (PFN_vkGetCudaModuleCacheNV)load(context, \"vkGetCudaModuleCacheNV\");\n#endif /* defined(VK_NV_cuda_kernel_launch) */\n#if defined(VK_NV_device_diagnostic_checkpoints)\n\tvkCmdSetCheckpointNV = (PFN_vkCmdSetCheckpointNV)load(context, \"vkCmdSetCheckpointNV\");\n\tvkGetQueueCheckpointDataNV = (PFN_vkGetQueueCheckpointDataNV)load(context, \"vkGetQueueCheckpointDataNV\");\n#endif /* defined(VK_NV_device_diagnostic_checkpoints) */\n#if defined(VK_NV_device_diagnostic_checkpoints) && (defined(VK_VERSION_1_3) || defined(VK_KHR_synchronization2))\n\tvkGetQueueCheckpointData2NV = (PFN_vkGetQueueCheckpointData2NV)load(context, \"vkGetQueueCheckpointData2NV\");\n#endif /* defined(VK_NV_device_diagnostic_checkpoints) && (defined(VK_VERSION_1_3) || defined(VK_KHR_synchronization2)) */\n#if defined(VK_NV_device_generated_commands)\n\tvkCmdBindPipelineShaderGroupNV = (PFN_vkCmdBindPipelineShaderGroupNV)load(context, \"vkCmdBindPipelineShaderGroupNV\");\n\tvkCmdExecuteGeneratedCommandsNV = (PFN_vkCmdExecuteGeneratedCommandsNV)load(context, \"vkCmdExecuteGeneratedCommandsNV\");\n\tvkCmdPreprocessGeneratedCommandsNV = (PFN_vkCmdPreprocessGeneratedCommandsNV)load(context, \"vkCmdPreprocessGeneratedCommandsNV\");\n\tvkCreateIndirectCommandsLayoutNV = (PFN_vkCreateIndirectCommandsLayoutNV)load(context, \"vkCreateIndirectCommandsLayoutNV\");\n\tvkDestroyIndirectCommandsLayoutNV = (PFN_vkDestroyIndirectCommandsLayoutNV)load(context, \"vkDestroyIndirectCommandsLayoutNV\");\n\tvkGetGeneratedCommandsMemoryRequirementsNV = (PFN_vkGetGeneratedCommandsMemoryRequirementsNV)load(context, \"vkGetGeneratedCommandsMemoryRequirementsNV\");\n#endif /* defined(VK_NV_device_generated_commands) */\n#if defined(VK_NV_device_generated_commands_compute)\n\tvkCmdUpdatePipelineIndirectBufferNV = (PFN_vkCmdUpdatePipelineIndirectBufferNV)load(context, \"vkCmdUpdatePipelineIndirectBufferNV\");\n\tvkGetPipelineIndirectDeviceAddressNV = (PFN_vkGetPipelineIndirectDeviceAddressNV)load(context, \"vkGetPipelineIndirectDeviceAddressNV\");\n\tvkGetPipelineIndirectMemoryRequirementsNV = (PFN_vkGetPipelineIndirectMemoryRequirementsNV)load(context, \"vkGetPipelineIndirectMemoryRequirementsNV\");\n#endif /* defined(VK_NV_device_generated_commands_compute) */\n#if defined(VK_NV_external_memory_rdma)\n\tvkGetMemoryRemoteAddressNV = (PFN_vkGetMemoryRemoteAddressNV)load(context, \"vkGetMemoryRemoteAddressNV\");\n#endif /* defined(VK_NV_external_memory_rdma) */\n#if defined(VK_NV_external_memory_win32)\n\tvkGetMemoryWin32HandleNV = (PFN_vkGetMemoryWin32HandleNV)load(context, \"vkGetMemoryWin32HandleNV\");\n#endif /* defined(VK_NV_external_memory_win32) */\n#if defined(VK_NV_fragment_shading_rate_enums)\n\tvkCmdSetFragmentShadingRateEnumNV = (PFN_vkCmdSetFragmentShadingRateEnumNV)load(context, \"vkCmdSetFragmentShadingRateEnumNV\");\n#endif /* defined(VK_NV_fragment_shading_rate_enums) */\n#if defined(VK_NV_low_latency2)\n\tvkGetLatencyTimingsNV = (PFN_vkGetLatencyTimingsNV)load(context, \"vkGetLatencyTimingsNV\");\n\tvkLatencySleepNV = (PFN_vkLatencySleepNV)load(context, \"vkLatencySleepNV\");\n\tvkQueueNotifyOutOfBandNV = (PFN_vkQueueNotifyOutOfBandNV)load(context, \"vkQueueNotifyOutOfBandNV\");\n\tvkSetLatencyMarkerNV = (PFN_vkSetLatencyMarkerNV)load(context, \"vkSetLatencyMarkerNV\");\n\tvkSetLatencySleepModeNV = (PFN_vkSetLatencySleepModeNV)load(context, \"vkSetLatencySleepModeNV\");\n#endif /* defined(VK_NV_low_latency2) */\n#if defined(VK_NV_memory_decompression)\n\tvkCmdDecompressMemoryIndirectCountNV = (PFN_vkCmdDecompressMemoryIndirectCountNV)load(context, \"vkCmdDecompressMemoryIndirectCountNV\");\n\tvkCmdDecompressMemoryNV = (PFN_vkCmdDecompressMemoryNV)load(context, \"vkCmdDecompressMemoryNV\");\n#endif /* defined(VK_NV_memory_decompression) */\n#if defined(VK_NV_mesh_shader)\n\tvkCmdDrawMeshTasksIndirectNV = (PFN_vkCmdDrawMeshTasksIndirectNV)load(context, \"vkCmdDrawMeshTasksIndirectNV\");\n\tvkCmdDrawMeshTasksNV = (PFN_vkCmdDrawMeshTasksNV)load(context, \"vkCmdDrawMeshTasksNV\");\n#endif /* defined(VK_NV_mesh_shader) */\n#if defined(VK_NV_mesh_shader) && (defined(VK_KHR_draw_indirect_count) || defined(VK_VERSION_1_2))\n\tvkCmdDrawMeshTasksIndirectCountNV = (PFN_vkCmdDrawMeshTasksIndirectCountNV)load(context, \"vkCmdDrawMeshTasksIndirectCountNV\");\n#endif /* defined(VK_NV_mesh_shader) && (defined(VK_KHR_draw_indirect_count) || defined(VK_VERSION_1_2)) */\n#if defined(VK_NV_optical_flow)\n\tvkBindOpticalFlowSessionImageNV = (PFN_vkBindOpticalFlowSessionImageNV)load(context, \"vkBindOpticalFlowSessionImageNV\");\n\tvkCmdOpticalFlowExecuteNV = (PFN_vkCmdOpticalFlowExecuteNV)load(context, \"vkCmdOpticalFlowExecuteNV\");\n\tvkCreateOpticalFlowSessionNV = (PFN_vkCreateOpticalFlowSessionNV)load(context, \"vkCreateOpticalFlowSessionNV\");\n\tvkDestroyOpticalFlowSessionNV = (PFN_vkDestroyOpticalFlowSessionNV)load(context, \"vkDestroyOpticalFlowSessionNV\");\n#endif /* defined(VK_NV_optical_flow) */\n#if defined(VK_NV_partitioned_acceleration_structure)\n\tvkCmdBuildPartitionedAccelerationStructuresNV = (PFN_vkCmdBuildPartitionedAccelerationStructuresNV)load(context, \"vkCmdBuildPartitionedAccelerationStructuresNV\");\n\tvkGetPartitionedAccelerationStructuresBuildSizesNV = (PFN_vkGetPartitionedAccelerationStructuresBuildSizesNV)load(context, \"vkGetPartitionedAccelerationStructuresBuildSizesNV\");\n#endif /* defined(VK_NV_partitioned_acceleration_structure) */\n#if defined(VK_NV_ray_tracing)\n\tvkBindAccelerationStructureMemoryNV = (PFN_vkBindAccelerationStructureMemoryNV)load(context, \"vkBindAccelerationStructureMemoryNV\");\n\tvkCmdBuildAccelerationStructureNV = (PFN_vkCmdBuildAccelerationStructureNV)load(context, \"vkCmdBuildAccelerationStructureNV\");\n\tvkCmdCopyAccelerationStructureNV = (PFN_vkCmdCopyAccelerationStructureNV)load(context, \"vkCmdCopyAccelerationStructureNV\");\n\tvkCmdTraceRaysNV = (PFN_vkCmdTraceRaysNV)load(context, \"vkCmdTraceRaysNV\");\n\tvkCmdWriteAccelerationStructuresPropertiesNV = (PFN_vkCmdWriteAccelerationStructuresPropertiesNV)load(context, \"vkCmdWriteAccelerationStructuresPropertiesNV\");\n\tvkCompileDeferredNV = (PFN_vkCompileDeferredNV)load(context, \"vkCompileDeferredNV\");\n\tvkCreateAccelerationStructureNV = (PFN_vkCreateAccelerationStructureNV)load(context, \"vkCreateAccelerationStructureNV\");\n\tvkCreateRayTracingPipelinesNV = (PFN_vkCreateRayTracingPipelinesNV)load(context, \"vkCreateRayTracingPipelinesNV\");\n\tvkDestroyAccelerationStructureNV = (PFN_vkDestroyAccelerationStructureNV)load(context, \"vkDestroyAccelerationStructureNV\");\n\tvkGetAccelerationStructureHandleNV = (PFN_vkGetAccelerationStructureHandleNV)load(context, \"vkGetAccelerationStructureHandleNV\");\n\tvkGetAccelerationStructureMemoryRequirementsNV = (PFN_vkGetAccelerationStructureMemoryRequirementsNV)load(context, \"vkGetAccelerationStructureMemoryRequirementsNV\");\n\tvkGetRayTracingShaderGroupHandlesNV = (PFN_vkGetRayTracingShaderGroupHandlesNV)load(context, \"vkGetRayTracingShaderGroupHandlesNV\");\n#endif /* defined(VK_NV_ray_tracing) */\n#if defined(VK_NV_scissor_exclusive) && VK_NV_SCISSOR_EXCLUSIVE_SPEC_VERSION >= 2\n\tvkCmdSetExclusiveScissorEnableNV = (PFN_vkCmdSetExclusiveScissorEnableNV)load(context, \"vkCmdSetExclusiveScissorEnableNV\");\n#endif /* defined(VK_NV_scissor_exclusive) && VK_NV_SCISSOR_EXCLUSIVE_SPEC_VERSION >= 2 */\n#if defined(VK_NV_scissor_exclusive)\n\tvkCmdSetExclusiveScissorNV = (PFN_vkCmdSetExclusiveScissorNV)load(context, \"vkCmdSetExclusiveScissorNV\");\n#endif /* defined(VK_NV_scissor_exclusive) */\n#if defined(VK_NV_shading_rate_image)\n\tvkCmdBindShadingRateImageNV = (PFN_vkCmdBindShadingRateImageNV)load(context, \"vkCmdBindShadingRateImageNV\");\n\tvkCmdSetCoarseSampleOrderNV = (PFN_vkCmdSetCoarseSampleOrderNV)load(context, \"vkCmdSetCoarseSampleOrderNV\");\n\tvkCmdSetViewportShadingRatePaletteNV = (PFN_vkCmdSetViewportShadingRatePaletteNV)load(context, \"vkCmdSetViewportShadingRatePaletteNV\");\n#endif /* defined(VK_NV_shading_rate_image) */\n#if defined(VK_QCOM_tile_properties)\n\tvkGetDynamicRenderingTilePropertiesQCOM = (PFN_vkGetDynamicRenderingTilePropertiesQCOM)load(context, \"vkGetDynamicRenderingTilePropertiesQCOM\");\n\tvkGetFramebufferTilePropertiesQCOM = (PFN_vkGetFramebufferTilePropertiesQCOM)load(context, \"vkGetFramebufferTilePropertiesQCOM\");\n#endif /* defined(VK_QCOM_tile_properties) */\n#if defined(VK_QNX_external_memory_screen_buffer)\n\tvkGetScreenBufferPropertiesQNX = (PFN_vkGetScreenBufferPropertiesQNX)load(context, \"vkGetScreenBufferPropertiesQNX\");\n#endif /* defined(VK_QNX_external_memory_screen_buffer) */\n#if defined(VK_VALVE_descriptor_set_host_mapping)\n\tvkGetDescriptorSetHostMappingVALVE = (PFN_vkGetDescriptorSetHostMappingVALVE)load(context, \"vkGetDescriptorSetHostMappingVALVE\");\n\tvkGetDescriptorSetLayoutHostMappingInfoVALVE = (PFN_vkGetDescriptorSetLayoutHostMappingInfoVALVE)load(context, \"vkGetDescriptorSetLayoutHostMappingInfoVALVE\");\n#endif /* defined(VK_VALVE_descriptor_set_host_mapping) */\n#if (defined(VK_EXT_depth_clamp_control)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clamp_control))\n\tvkCmdSetDepthClampRangeEXT = (PFN_vkCmdSetDepthClampRangeEXT)load(context, \"vkCmdSetDepthClampRangeEXT\");\n#endif /* (defined(VK_EXT_depth_clamp_control)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clamp_control)) */\n#if (defined(VK_EXT_extended_dynamic_state)) || (defined(VK_EXT_shader_object))\n\tvkCmdBindVertexBuffers2EXT = (PFN_vkCmdBindVertexBuffers2EXT)load(context, \"vkCmdBindVertexBuffers2EXT\");\n\tvkCmdSetCullModeEXT = (PFN_vkCmdSetCullModeEXT)load(context, \"vkCmdSetCullModeEXT\");\n\tvkCmdSetDepthBoundsTestEnableEXT = (PFN_vkCmdSetDepthBoundsTestEnableEXT)load(context, \"vkCmdSetDepthBoundsTestEnableEXT\");\n\tvkCmdSetDepthCompareOpEXT = (PFN_vkCmdSetDepthCompareOpEXT)load(context, \"vkCmdSetDepthCompareOpEXT\");\n\tvkCmdSetDepthTestEnableEXT = (PFN_vkCmdSetDepthTestEnableEXT)load(context, \"vkCmdSetDepthTestEnableEXT\");\n\tvkCmdSetDepthWriteEnableEXT = (PFN_vkCmdSetDepthWriteEnableEXT)load(context, \"vkCmdSetDepthWriteEnableEXT\");\n\tvkCmdSetFrontFaceEXT = (PFN_vkCmdSetFrontFaceEXT)load(context, \"vkCmdSetFrontFaceEXT\");\n\tvkCmdSetPrimitiveTopologyEXT = (PFN_vkCmdSetPrimitiveTopologyEXT)load(context, \"vkCmdSetPrimitiveTopologyEXT\");\n\tvkCmdSetScissorWithCountEXT = (PFN_vkCmdSetScissorWithCountEXT)load(context, \"vkCmdSetScissorWithCountEXT\");\n\tvkCmdSetStencilOpEXT = (PFN_vkCmdSetStencilOpEXT)load(context, \"vkCmdSetStencilOpEXT\");\n\tvkCmdSetStencilTestEnableEXT = (PFN_vkCmdSetStencilTestEnableEXT)load(context, \"vkCmdSetStencilTestEnableEXT\");\n\tvkCmdSetViewportWithCountEXT = (PFN_vkCmdSetViewportWithCountEXT)load(context, \"vkCmdSetViewportWithCountEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state)) || (defined(VK_EXT_shader_object)) */\n#if (defined(VK_EXT_extended_dynamic_state2)) || (defined(VK_EXT_shader_object))\n\tvkCmdSetDepthBiasEnableEXT = (PFN_vkCmdSetDepthBiasEnableEXT)load(context, \"vkCmdSetDepthBiasEnableEXT\");\n\tvkCmdSetLogicOpEXT = (PFN_vkCmdSetLogicOpEXT)load(context, \"vkCmdSetLogicOpEXT\");\n\tvkCmdSetPatchControlPointsEXT = (PFN_vkCmdSetPatchControlPointsEXT)load(context, \"vkCmdSetPatchControlPointsEXT\");\n\tvkCmdSetPrimitiveRestartEnableEXT = (PFN_vkCmdSetPrimitiveRestartEnableEXT)load(context, \"vkCmdSetPrimitiveRestartEnableEXT\");\n\tvkCmdSetRasterizerDiscardEnableEXT = (PFN_vkCmdSetRasterizerDiscardEnableEXT)load(context, \"vkCmdSetRasterizerDiscardEnableEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state2)) || (defined(VK_EXT_shader_object)) */\n#if (defined(VK_EXT_extended_dynamic_state3)) || (defined(VK_EXT_shader_object))\n\tvkCmdSetAlphaToCoverageEnableEXT = (PFN_vkCmdSetAlphaToCoverageEnableEXT)load(context, \"vkCmdSetAlphaToCoverageEnableEXT\");\n\tvkCmdSetAlphaToOneEnableEXT = (PFN_vkCmdSetAlphaToOneEnableEXT)load(context, \"vkCmdSetAlphaToOneEnableEXT\");\n\tvkCmdSetColorBlendEnableEXT = (PFN_vkCmdSetColorBlendEnableEXT)load(context, \"vkCmdSetColorBlendEnableEXT\");\n\tvkCmdSetColorBlendEquationEXT = (PFN_vkCmdSetColorBlendEquationEXT)load(context, \"vkCmdSetColorBlendEquationEXT\");\n\tvkCmdSetColorWriteMaskEXT = (PFN_vkCmdSetColorWriteMaskEXT)load(context, \"vkCmdSetColorWriteMaskEXT\");\n\tvkCmdSetDepthClampEnableEXT = (PFN_vkCmdSetDepthClampEnableEXT)load(context, \"vkCmdSetDepthClampEnableEXT\");\n\tvkCmdSetLogicOpEnableEXT = (PFN_vkCmdSetLogicOpEnableEXT)load(context, \"vkCmdSetLogicOpEnableEXT\");\n\tvkCmdSetPolygonModeEXT = (PFN_vkCmdSetPolygonModeEXT)load(context, \"vkCmdSetPolygonModeEXT\");\n\tvkCmdSetRasterizationSamplesEXT = (PFN_vkCmdSetRasterizationSamplesEXT)load(context, \"vkCmdSetRasterizationSamplesEXT\");\n\tvkCmdSetSampleMaskEXT = (PFN_vkCmdSetSampleMaskEXT)load(context, \"vkCmdSetSampleMaskEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3)) || (defined(VK_EXT_shader_object)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && (defined(VK_KHR_maintenance2) || defined(VK_VERSION_1_1))) || (defined(VK_EXT_shader_object))\n\tvkCmdSetTessellationDomainOriginEXT = (PFN_vkCmdSetTessellationDomainOriginEXT)load(context, \"vkCmdSetTessellationDomainOriginEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && (defined(VK_KHR_maintenance2) || defined(VK_VERSION_1_1))) || (defined(VK_EXT_shader_object)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_transform_feedback)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_transform_feedback))\n\tvkCmdSetRasterizationStreamEXT = (PFN_vkCmdSetRasterizationStreamEXT)load(context, \"vkCmdSetRasterizationStreamEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_transform_feedback)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_transform_feedback)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_conservative_rasterization)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_conservative_rasterization))\n\tvkCmdSetConservativeRasterizationModeEXT = (PFN_vkCmdSetConservativeRasterizationModeEXT)load(context, \"vkCmdSetConservativeRasterizationModeEXT\");\n\tvkCmdSetExtraPrimitiveOverestimationSizeEXT = (PFN_vkCmdSetExtraPrimitiveOverestimationSizeEXT)load(context, \"vkCmdSetExtraPrimitiveOverestimationSizeEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_conservative_rasterization)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_conservative_rasterization)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_depth_clip_enable)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clip_enable))\n\tvkCmdSetDepthClipEnableEXT = (PFN_vkCmdSetDepthClipEnableEXT)load(context, \"vkCmdSetDepthClipEnableEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_depth_clip_enable)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clip_enable)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_sample_locations)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_sample_locations))\n\tvkCmdSetSampleLocationsEnableEXT = (PFN_vkCmdSetSampleLocationsEnableEXT)load(context, \"vkCmdSetSampleLocationsEnableEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_sample_locations)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_sample_locations)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_blend_operation_advanced)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_blend_operation_advanced))\n\tvkCmdSetColorBlendAdvancedEXT = (PFN_vkCmdSetColorBlendAdvancedEXT)load(context, \"vkCmdSetColorBlendAdvancedEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_blend_operation_advanced)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_blend_operation_advanced)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_provoking_vertex)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_provoking_vertex))\n\tvkCmdSetProvokingVertexModeEXT = (PFN_vkCmdSetProvokingVertexModeEXT)load(context, \"vkCmdSetProvokingVertexModeEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_provoking_vertex)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_provoking_vertex)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_line_rasterization)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_line_rasterization))\n\tvkCmdSetLineRasterizationModeEXT = (PFN_vkCmdSetLineRasterizationModeEXT)load(context, \"vkCmdSetLineRasterizationModeEXT\");\n\tvkCmdSetLineStippleEnableEXT = (PFN_vkCmdSetLineStippleEnableEXT)load(context, \"vkCmdSetLineStippleEnableEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_line_rasterization)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_line_rasterization)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_depth_clip_control)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clip_control))\n\tvkCmdSetDepthClipNegativeOneToOneEXT = (PFN_vkCmdSetDepthClipNegativeOneToOneEXT)load(context, \"vkCmdSetDepthClipNegativeOneToOneEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_depth_clip_control)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clip_control)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_clip_space_w_scaling)) || (defined(VK_EXT_shader_object) && defined(VK_NV_clip_space_w_scaling))\n\tvkCmdSetViewportWScalingEnableNV = (PFN_vkCmdSetViewportWScalingEnableNV)load(context, \"vkCmdSetViewportWScalingEnableNV\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_clip_space_w_scaling)) || (defined(VK_EXT_shader_object) && defined(VK_NV_clip_space_w_scaling)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_viewport_swizzle)) || (defined(VK_EXT_shader_object) && defined(VK_NV_viewport_swizzle))\n\tvkCmdSetViewportSwizzleNV = (PFN_vkCmdSetViewportSwizzleNV)load(context, \"vkCmdSetViewportSwizzleNV\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_viewport_swizzle)) || (defined(VK_EXT_shader_object) && defined(VK_NV_viewport_swizzle)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_fragment_coverage_to_color)) || (defined(VK_EXT_shader_object) && defined(VK_NV_fragment_coverage_to_color))\n\tvkCmdSetCoverageToColorEnableNV = (PFN_vkCmdSetCoverageToColorEnableNV)load(context, \"vkCmdSetCoverageToColorEnableNV\");\n\tvkCmdSetCoverageToColorLocationNV = (PFN_vkCmdSetCoverageToColorLocationNV)load(context, \"vkCmdSetCoverageToColorLocationNV\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_fragment_coverage_to_color)) || (defined(VK_EXT_shader_object) && defined(VK_NV_fragment_coverage_to_color)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_framebuffer_mixed_samples)) || (defined(VK_EXT_shader_object) && defined(VK_NV_framebuffer_mixed_samples))\n\tvkCmdSetCoverageModulationModeNV = (PFN_vkCmdSetCoverageModulationModeNV)load(context, \"vkCmdSetCoverageModulationModeNV\");\n\tvkCmdSetCoverageModulationTableEnableNV = (PFN_vkCmdSetCoverageModulationTableEnableNV)load(context, \"vkCmdSetCoverageModulationTableEnableNV\");\n\tvkCmdSetCoverageModulationTableNV = (PFN_vkCmdSetCoverageModulationTableNV)load(context, \"vkCmdSetCoverageModulationTableNV\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_framebuffer_mixed_samples)) || (defined(VK_EXT_shader_object) && defined(VK_NV_framebuffer_mixed_samples)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_shading_rate_image)) || (defined(VK_EXT_shader_object) && defined(VK_NV_shading_rate_image))\n\tvkCmdSetShadingRateImageEnableNV = (PFN_vkCmdSetShadingRateImageEnableNV)load(context, \"vkCmdSetShadingRateImageEnableNV\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_shading_rate_image)) || (defined(VK_EXT_shader_object) && defined(VK_NV_shading_rate_image)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_representative_fragment_test)) || (defined(VK_EXT_shader_object) && defined(VK_NV_representative_fragment_test))\n\tvkCmdSetRepresentativeFragmentTestEnableNV = (PFN_vkCmdSetRepresentativeFragmentTestEnableNV)load(context, \"vkCmdSetRepresentativeFragmentTestEnableNV\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_representative_fragment_test)) || (defined(VK_EXT_shader_object) && defined(VK_NV_representative_fragment_test)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_coverage_reduction_mode)) || (defined(VK_EXT_shader_object) && defined(VK_NV_coverage_reduction_mode))\n\tvkCmdSetCoverageReductionModeNV = (PFN_vkCmdSetCoverageReductionModeNV)load(context, \"vkCmdSetCoverageReductionModeNV\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_coverage_reduction_mode)) || (defined(VK_EXT_shader_object) && defined(VK_NV_coverage_reduction_mode)) */\n#if (defined(VK_EXT_host_image_copy)) || (defined(VK_EXT_image_compression_control))\n\tvkGetImageSubresourceLayout2EXT = (PFN_vkGetImageSubresourceLayout2EXT)load(context, \"vkGetImageSubresourceLayout2EXT\");\n#endif /* (defined(VK_EXT_host_image_copy)) || (defined(VK_EXT_image_compression_control)) */\n#if (defined(VK_EXT_shader_object)) || (defined(VK_EXT_vertex_input_dynamic_state))\n\tvkCmdSetVertexInputEXT = (PFN_vkCmdSetVertexInputEXT)load(context, \"vkCmdSetVertexInputEXT\");\n#endif /* (defined(VK_EXT_shader_object)) || (defined(VK_EXT_vertex_input_dynamic_state)) */\n#if (defined(VK_KHR_descriptor_update_template) && defined(VK_KHR_push_descriptor)) || (defined(VK_KHR_push_descriptor) && (defined(VK_VERSION_1_1) || defined(VK_KHR_descriptor_update_template)))\n\tvkCmdPushDescriptorSetWithTemplateKHR = (PFN_vkCmdPushDescriptorSetWithTemplateKHR)load(context, \"vkCmdPushDescriptorSetWithTemplateKHR\");\n#endif /* (defined(VK_KHR_descriptor_update_template) && defined(VK_KHR_push_descriptor)) || (defined(VK_KHR_push_descriptor) && (defined(VK_VERSION_1_1) || defined(VK_KHR_descriptor_update_template))) */\n#if (defined(VK_KHR_device_group) && defined(VK_KHR_surface)) || (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1))\n\tvkGetDeviceGroupPresentCapabilitiesKHR = (PFN_vkGetDeviceGroupPresentCapabilitiesKHR)load(context, \"vkGetDeviceGroupPresentCapabilitiesKHR\");\n\tvkGetDeviceGroupSurfacePresentModesKHR = (PFN_vkGetDeviceGroupSurfacePresentModesKHR)load(context, \"vkGetDeviceGroupSurfacePresentModesKHR\");\n#endif /* (defined(VK_KHR_device_group) && defined(VK_KHR_surface)) || (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1)) */\n#if (defined(VK_KHR_device_group) && defined(VK_KHR_swapchain)) || (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1))\n\tvkAcquireNextImage2KHR = (PFN_vkAcquireNextImage2KHR)load(context, \"vkAcquireNextImage2KHR\");\n#endif /* (defined(VK_KHR_device_group) && defined(VK_KHR_swapchain)) || (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1)) */\n\t/* VOLK_GENERATE_LOAD_DEVICE */\n}\n\nstatic void volkGenLoadDeviceTable(struct VolkDeviceTable* table, void* context, PFN_vkVoidFunction (*load)(void*, const char*))\n{\n\t/* VOLK_GENERATE_LOAD_DEVICE_TABLE */\n#if defined(VK_VERSION_1_0)\n\ttable->vkAllocateCommandBuffers = (PFN_vkAllocateCommandBuffers)load(context, \"vkAllocateCommandBuffers\");\n\ttable->vkAllocateDescriptorSets = (PFN_vkAllocateDescriptorSets)load(context, \"vkAllocateDescriptorSets\");\n\ttable->vkAllocateMemory = (PFN_vkAllocateMemory)load(context, \"vkAllocateMemory\");\n\ttable->vkBeginCommandBuffer = (PFN_vkBeginCommandBuffer)load(context, \"vkBeginCommandBuffer\");\n\ttable->vkBindBufferMemory = (PFN_vkBindBufferMemory)load(context, \"vkBindBufferMemory\");\n\ttable->vkBindImageMemory = (PFN_vkBindImageMemory)load(context, \"vkBindImageMemory\");\n\ttable->vkCmdBeginQuery = (PFN_vkCmdBeginQuery)load(context, \"vkCmdBeginQuery\");\n\ttable->vkCmdBeginRenderPass = (PFN_vkCmdBeginRenderPass)load(context, \"vkCmdBeginRenderPass\");\n\ttable->vkCmdBindDescriptorSets = (PFN_vkCmdBindDescriptorSets)load(context, \"vkCmdBindDescriptorSets\");\n\ttable->vkCmdBindIndexBuffer = (PFN_vkCmdBindIndexBuffer)load(context, \"vkCmdBindIndexBuffer\");\n\ttable->vkCmdBindPipeline = (PFN_vkCmdBindPipeline)load(context, \"vkCmdBindPipeline\");\n\ttable->vkCmdBindVertexBuffers = (PFN_vkCmdBindVertexBuffers)load(context, \"vkCmdBindVertexBuffers\");\n\ttable->vkCmdBlitImage = (PFN_vkCmdBlitImage)load(context, \"vkCmdBlitImage\");\n\ttable->vkCmdClearAttachments = (PFN_vkCmdClearAttachments)load(context, \"vkCmdClearAttachments\");\n\ttable->vkCmdClearColorImage = (PFN_vkCmdClearColorImage)load(context, \"vkCmdClearColorImage\");\n\ttable->vkCmdClearDepthStencilImage = (PFN_vkCmdClearDepthStencilImage)load(context, \"vkCmdClearDepthStencilImage\");\n\ttable->vkCmdCopyBuffer = (PFN_vkCmdCopyBuffer)load(context, \"vkCmdCopyBuffer\");\n\ttable->vkCmdCopyBufferToImage = (PFN_vkCmdCopyBufferToImage)load(context, \"vkCmdCopyBufferToImage\");\n\ttable->vkCmdCopyImage = (PFN_vkCmdCopyImage)load(context, \"vkCmdCopyImage\");\n\ttable->vkCmdCopyImageToBuffer = (PFN_vkCmdCopyImageToBuffer)load(context, \"vkCmdCopyImageToBuffer\");\n\ttable->vkCmdCopyQueryPoolResults = (PFN_vkCmdCopyQueryPoolResults)load(context, \"vkCmdCopyQueryPoolResults\");\n\ttable->vkCmdDispatch = (PFN_vkCmdDispatch)load(context, \"vkCmdDispatch\");\n\ttable->vkCmdDispatchIndirect = (PFN_vkCmdDispatchIndirect)load(context, \"vkCmdDispatchIndirect\");\n\ttable->vkCmdDraw = (PFN_vkCmdDraw)load(context, \"vkCmdDraw\");\n\ttable->vkCmdDrawIndexed = (PFN_vkCmdDrawIndexed)load(context, \"vkCmdDrawIndexed\");\n\ttable->vkCmdDrawIndexedIndirect = (PFN_vkCmdDrawIndexedIndirect)load(context, \"vkCmdDrawIndexedIndirect\");\n\ttable->vkCmdDrawIndirect = (PFN_vkCmdDrawIndirect)load(context, \"vkCmdDrawIndirect\");\n\ttable->vkCmdEndQuery = (PFN_vkCmdEndQuery)load(context, \"vkCmdEndQuery\");\n\ttable->vkCmdEndRenderPass = (PFN_vkCmdEndRenderPass)load(context, \"vkCmdEndRenderPass\");\n\ttable->vkCmdExecuteCommands = (PFN_vkCmdExecuteCommands)load(context, \"vkCmdExecuteCommands\");\n\ttable->vkCmdFillBuffer = (PFN_vkCmdFillBuffer)load(context, \"vkCmdFillBuffer\");\n\ttable->vkCmdNextSubpass = (PFN_vkCmdNextSubpass)load(context, \"vkCmdNextSubpass\");\n\ttable->vkCmdPipelineBarrier = (PFN_vkCmdPipelineBarrier)load(context, \"vkCmdPipelineBarrier\");\n\ttable->vkCmdPushConstants = (PFN_vkCmdPushConstants)load(context, \"vkCmdPushConstants\");\n\ttable->vkCmdResetEvent = (PFN_vkCmdResetEvent)load(context, \"vkCmdResetEvent\");\n\ttable->vkCmdResetQueryPool = (PFN_vkCmdResetQueryPool)load(context, \"vkCmdResetQueryPool\");\n\ttable->vkCmdResolveImage = (PFN_vkCmdResolveImage)load(context, \"vkCmdResolveImage\");\n\ttable->vkCmdSetBlendConstants = (PFN_vkCmdSetBlendConstants)load(context, \"vkCmdSetBlendConstants\");\n\ttable->vkCmdSetDepthBias = (PFN_vkCmdSetDepthBias)load(context, \"vkCmdSetDepthBias\");\n\ttable->vkCmdSetDepthBounds = (PFN_vkCmdSetDepthBounds)load(context, \"vkCmdSetDepthBounds\");\n\ttable->vkCmdSetEvent = (PFN_vkCmdSetEvent)load(context, \"vkCmdSetEvent\");\n\ttable->vkCmdSetLineWidth = (PFN_vkCmdSetLineWidth)load(context, \"vkCmdSetLineWidth\");\n\ttable->vkCmdSetScissor = (PFN_vkCmdSetScissor)load(context, \"vkCmdSetScissor\");\n\ttable->vkCmdSetStencilCompareMask = (PFN_vkCmdSetStencilCompareMask)load(context, \"vkCmdSetStencilCompareMask\");\n\ttable->vkCmdSetStencilReference = (PFN_vkCmdSetStencilReference)load(context, \"vkCmdSetStencilReference\");\n\ttable->vkCmdSetStencilWriteMask = (PFN_vkCmdSetStencilWriteMask)load(context, \"vkCmdSetStencilWriteMask\");\n\ttable->vkCmdSetViewport = (PFN_vkCmdSetViewport)load(context, \"vkCmdSetViewport\");\n\ttable->vkCmdUpdateBuffer = (PFN_vkCmdUpdateBuffer)load(context, \"vkCmdUpdateBuffer\");\n\ttable->vkCmdWaitEvents = (PFN_vkCmdWaitEvents)load(context, \"vkCmdWaitEvents\");\n\ttable->vkCmdWriteTimestamp = (PFN_vkCmdWriteTimestamp)load(context, \"vkCmdWriteTimestamp\");\n\ttable->vkCreateBuffer = (PFN_vkCreateBuffer)load(context, \"vkCreateBuffer\");\n\ttable->vkCreateBufferView = (PFN_vkCreateBufferView)load(context, \"vkCreateBufferView\");\n\ttable->vkCreateCommandPool = (PFN_vkCreateCommandPool)load(context, \"vkCreateCommandPool\");\n\ttable->vkCreateComputePipelines = (PFN_vkCreateComputePipelines)load(context, \"vkCreateComputePipelines\");\n\ttable->vkCreateDescriptorPool = (PFN_vkCreateDescriptorPool)load(context, \"vkCreateDescriptorPool\");\n\ttable->vkCreateDescriptorSetLayout = (PFN_vkCreateDescriptorSetLayout)load(context, \"vkCreateDescriptorSetLayout\");\n\ttable->vkCreateEvent = (PFN_vkCreateEvent)load(context, \"vkCreateEvent\");\n\ttable->vkCreateFence = (PFN_vkCreateFence)load(context, \"vkCreateFence\");\n\ttable->vkCreateFramebuffer = (PFN_vkCreateFramebuffer)load(context, \"vkCreateFramebuffer\");\n\ttable->vkCreateGraphicsPipelines = (PFN_vkCreateGraphicsPipelines)load(context, \"vkCreateGraphicsPipelines\");\n\ttable->vkCreateImage = (PFN_vkCreateImage)load(context, \"vkCreateImage\");\n\ttable->vkCreateImageView = (PFN_vkCreateImageView)load(context, \"vkCreateImageView\");\n\ttable->vkCreatePipelineCache = (PFN_vkCreatePipelineCache)load(context, \"vkCreatePipelineCache\");\n\ttable->vkCreatePipelineLayout = (PFN_vkCreatePipelineLayout)load(context, \"vkCreatePipelineLayout\");\n\ttable->vkCreateQueryPool = (PFN_vkCreateQueryPool)load(context, \"vkCreateQueryPool\");\n\ttable->vkCreateRenderPass = (PFN_vkCreateRenderPass)load(context, \"vkCreateRenderPass\");\n\ttable->vkCreateSampler = (PFN_vkCreateSampler)load(context, \"vkCreateSampler\");\n\ttable->vkCreateSemaphore = (PFN_vkCreateSemaphore)load(context, \"vkCreateSemaphore\");\n\ttable->vkCreateShaderModule = (PFN_vkCreateShaderModule)load(context, \"vkCreateShaderModule\");\n\ttable->vkDestroyBuffer = (PFN_vkDestroyBuffer)load(context, \"vkDestroyBuffer\");\n\ttable->vkDestroyBufferView = (PFN_vkDestroyBufferView)load(context, \"vkDestroyBufferView\");\n\ttable->vkDestroyCommandPool = (PFN_vkDestroyCommandPool)load(context, \"vkDestroyCommandPool\");\n\ttable->vkDestroyDescriptorPool = (PFN_vkDestroyDescriptorPool)load(context, \"vkDestroyDescriptorPool\");\n\ttable->vkDestroyDescriptorSetLayout = (PFN_vkDestroyDescriptorSetLayout)load(context, \"vkDestroyDescriptorSetLayout\");\n\ttable->vkDestroyDevice = (PFN_vkDestroyDevice)load(context, \"vkDestroyDevice\");\n\ttable->vkDestroyEvent = (PFN_vkDestroyEvent)load(context, \"vkDestroyEvent\");\n\ttable->vkDestroyFence = (PFN_vkDestroyFence)load(context, \"vkDestroyFence\");\n\ttable->vkDestroyFramebuffer = (PFN_vkDestroyFramebuffer)load(context, \"vkDestroyFramebuffer\");\n\ttable->vkDestroyImage = (PFN_vkDestroyImage)load(context, \"vkDestroyImage\");\n\ttable->vkDestroyImageView = (PFN_vkDestroyImageView)load(context, \"vkDestroyImageView\");\n\ttable->vkDestroyPipeline = (PFN_vkDestroyPipeline)load(context, \"vkDestroyPipeline\");\n\ttable->vkDestroyPipelineCache = (PFN_vkDestroyPipelineCache)load(context, \"vkDestroyPipelineCache\");\n\ttable->vkDestroyPipelineLayout = (PFN_vkDestroyPipelineLayout)load(context, \"vkDestroyPipelineLayout\");\n\ttable->vkDestroyQueryPool = (PFN_vkDestroyQueryPool)load(context, \"vkDestroyQueryPool\");\n\ttable->vkDestroyRenderPass = (PFN_vkDestroyRenderPass)load(context, \"vkDestroyRenderPass\");\n\ttable->vkDestroySampler = (PFN_vkDestroySampler)load(context, \"vkDestroySampler\");\n\ttable->vkDestroySemaphore = (PFN_vkDestroySemaphore)load(context, \"vkDestroySemaphore\");\n\ttable->vkDestroyShaderModule = (PFN_vkDestroyShaderModule)load(context, \"vkDestroyShaderModule\");\n\ttable->vkDeviceWaitIdle = (PFN_vkDeviceWaitIdle)load(context, \"vkDeviceWaitIdle\");\n\ttable->vkEndCommandBuffer = (PFN_vkEndCommandBuffer)load(context, \"vkEndCommandBuffer\");\n\ttable->vkFlushMappedMemoryRanges = (PFN_vkFlushMappedMemoryRanges)load(context, \"vkFlushMappedMemoryRanges\");\n\ttable->vkFreeCommandBuffers = (PFN_vkFreeCommandBuffers)load(context, \"vkFreeCommandBuffers\");\n\ttable->vkFreeDescriptorSets = (PFN_vkFreeDescriptorSets)load(context, \"vkFreeDescriptorSets\");\n\ttable->vkFreeMemory = (PFN_vkFreeMemory)load(context, \"vkFreeMemory\");\n\ttable->vkGetBufferMemoryRequirements = (PFN_vkGetBufferMemoryRequirements)load(context, \"vkGetBufferMemoryRequirements\");\n\ttable->vkGetDeviceMemoryCommitment = (PFN_vkGetDeviceMemoryCommitment)load(context, \"vkGetDeviceMemoryCommitment\");\n\ttable->vkGetDeviceQueue = (PFN_vkGetDeviceQueue)load(context, \"vkGetDeviceQueue\");\n\ttable->vkGetEventStatus = (PFN_vkGetEventStatus)load(context, \"vkGetEventStatus\");\n\ttable->vkGetFenceStatus = (PFN_vkGetFenceStatus)load(context, \"vkGetFenceStatus\");\n\ttable->vkGetImageMemoryRequirements = (PFN_vkGetImageMemoryRequirements)load(context, \"vkGetImageMemoryRequirements\");\n\ttable->vkGetImageSparseMemoryRequirements = (PFN_vkGetImageSparseMemoryRequirements)load(context, \"vkGetImageSparseMemoryRequirements\");\n\ttable->vkGetImageSubresourceLayout = (PFN_vkGetImageSubresourceLayout)load(context, \"vkGetImageSubresourceLayout\");\n\ttable->vkGetPipelineCacheData = (PFN_vkGetPipelineCacheData)load(context, \"vkGetPipelineCacheData\");\n\ttable->vkGetQueryPoolResults = (PFN_vkGetQueryPoolResults)load(context, \"vkGetQueryPoolResults\");\n\ttable->vkGetRenderAreaGranularity = (PFN_vkGetRenderAreaGranularity)load(context, \"vkGetRenderAreaGranularity\");\n\ttable->vkInvalidateMappedMemoryRanges = (PFN_vkInvalidateMappedMemoryRanges)load(context, \"vkInvalidateMappedMemoryRanges\");\n\ttable->vkMapMemory = (PFN_vkMapMemory)load(context, \"vkMapMemory\");\n\ttable->vkMergePipelineCaches = (PFN_vkMergePipelineCaches)load(context, \"vkMergePipelineCaches\");\n\ttable->vkQueueBindSparse = (PFN_vkQueueBindSparse)load(context, \"vkQueueBindSparse\");\n\ttable->vkQueueSubmit = (PFN_vkQueueSubmit)load(context, \"vkQueueSubmit\");\n\ttable->vkQueueWaitIdle = (PFN_vkQueueWaitIdle)load(context, \"vkQueueWaitIdle\");\n\ttable->vkResetCommandBuffer = (PFN_vkResetCommandBuffer)load(context, \"vkResetCommandBuffer\");\n\ttable->vkResetCommandPool = (PFN_vkResetCommandPool)load(context, \"vkResetCommandPool\");\n\ttable->vkResetDescriptorPool = (PFN_vkResetDescriptorPool)load(context, \"vkResetDescriptorPool\");\n\ttable->vkResetEvent = (PFN_vkResetEvent)load(context, \"vkResetEvent\");\n\ttable->vkResetFences = (PFN_vkResetFences)load(context, \"vkResetFences\");\n\ttable->vkSetEvent = (PFN_vkSetEvent)load(context, \"vkSetEvent\");\n\ttable->vkUnmapMemory = (PFN_vkUnmapMemory)load(context, \"vkUnmapMemory\");\n\ttable->vkUpdateDescriptorSets = (PFN_vkUpdateDescriptorSets)load(context, \"vkUpdateDescriptorSets\");\n\ttable->vkWaitForFences = (PFN_vkWaitForFences)load(context, \"vkWaitForFences\");\n#endif /* defined(VK_VERSION_1_0) */\n#if defined(VK_VERSION_1_1)\n\ttable->vkBindBufferMemory2 = (PFN_vkBindBufferMemory2)load(context, \"vkBindBufferMemory2\");\n\ttable->vkBindImageMemory2 = (PFN_vkBindImageMemory2)load(context, \"vkBindImageMemory2\");\n\ttable->vkCmdDispatchBase = (PFN_vkCmdDispatchBase)load(context, \"vkCmdDispatchBase\");\n\ttable->vkCmdSetDeviceMask = (PFN_vkCmdSetDeviceMask)load(context, \"vkCmdSetDeviceMask\");\n\ttable->vkCreateDescriptorUpdateTemplate = (PFN_vkCreateDescriptorUpdateTemplate)load(context, \"vkCreateDescriptorUpdateTemplate\");\n\ttable->vkCreateSamplerYcbcrConversion = (PFN_vkCreateSamplerYcbcrConversion)load(context, \"vkCreateSamplerYcbcrConversion\");\n\ttable->vkDestroyDescriptorUpdateTemplate = (PFN_vkDestroyDescriptorUpdateTemplate)load(context, \"vkDestroyDescriptorUpdateTemplate\");\n\ttable->vkDestroySamplerYcbcrConversion = (PFN_vkDestroySamplerYcbcrConversion)load(context, \"vkDestroySamplerYcbcrConversion\");\n\ttable->vkGetBufferMemoryRequirements2 = (PFN_vkGetBufferMemoryRequirements2)load(context, \"vkGetBufferMemoryRequirements2\");\n\ttable->vkGetDescriptorSetLayoutSupport = (PFN_vkGetDescriptorSetLayoutSupport)load(context, \"vkGetDescriptorSetLayoutSupport\");\n\ttable->vkGetDeviceGroupPeerMemoryFeatures = (PFN_vkGetDeviceGroupPeerMemoryFeatures)load(context, \"vkGetDeviceGroupPeerMemoryFeatures\");\n\ttable->vkGetDeviceQueue2 = (PFN_vkGetDeviceQueue2)load(context, \"vkGetDeviceQueue2\");\n\ttable->vkGetImageMemoryRequirements2 = (PFN_vkGetImageMemoryRequirements2)load(context, \"vkGetImageMemoryRequirements2\");\n\ttable->vkGetImageSparseMemoryRequirements2 = (PFN_vkGetImageSparseMemoryRequirements2)load(context, \"vkGetImageSparseMemoryRequirements2\");\n\ttable->vkTrimCommandPool = (PFN_vkTrimCommandPool)load(context, \"vkTrimCommandPool\");\n\ttable->vkUpdateDescriptorSetWithTemplate = (PFN_vkUpdateDescriptorSetWithTemplate)load(context, \"vkUpdateDescriptorSetWithTemplate\");\n#endif /* defined(VK_VERSION_1_1) */\n#if defined(VK_VERSION_1_2)\n\ttable->vkCmdBeginRenderPass2 = (PFN_vkCmdBeginRenderPass2)load(context, \"vkCmdBeginRenderPass2\");\n\ttable->vkCmdDrawIndexedIndirectCount = (PFN_vkCmdDrawIndexedIndirectCount)load(context, \"vkCmdDrawIndexedIndirectCount\");\n\ttable->vkCmdDrawIndirectCount = (PFN_vkCmdDrawIndirectCount)load(context, \"vkCmdDrawIndirectCount\");\n\ttable->vkCmdEndRenderPass2 = (PFN_vkCmdEndRenderPass2)load(context, \"vkCmdEndRenderPass2\");\n\ttable->vkCmdNextSubpass2 = (PFN_vkCmdNextSubpass2)load(context, \"vkCmdNextSubpass2\");\n\ttable->vkCreateRenderPass2 = (PFN_vkCreateRenderPass2)load(context, \"vkCreateRenderPass2\");\n\ttable->vkGetBufferDeviceAddress = (PFN_vkGetBufferDeviceAddress)load(context, \"vkGetBufferDeviceAddress\");\n\ttable->vkGetBufferOpaqueCaptureAddress = (PFN_vkGetBufferOpaqueCaptureAddress)load(context, \"vkGetBufferOpaqueCaptureAddress\");\n\ttable->vkGetDeviceMemoryOpaqueCaptureAddress = (PFN_vkGetDeviceMemoryOpaqueCaptureAddress)load(context, \"vkGetDeviceMemoryOpaqueCaptureAddress\");\n\ttable->vkGetSemaphoreCounterValue = (PFN_vkGetSemaphoreCounterValue)load(context, \"vkGetSemaphoreCounterValue\");\n\ttable->vkResetQueryPool = (PFN_vkResetQueryPool)load(context, \"vkResetQueryPool\");\n\ttable->vkSignalSemaphore = (PFN_vkSignalSemaphore)load(context, \"vkSignalSemaphore\");\n\ttable->vkWaitSemaphores = (PFN_vkWaitSemaphores)load(context, \"vkWaitSemaphores\");\n#endif /* defined(VK_VERSION_1_2) */\n#if defined(VK_VERSION_1_3)\n\ttable->vkCmdBeginRendering = (PFN_vkCmdBeginRendering)load(context, \"vkCmdBeginRendering\");\n\ttable->vkCmdBindVertexBuffers2 = (PFN_vkCmdBindVertexBuffers2)load(context, \"vkCmdBindVertexBuffers2\");\n\ttable->vkCmdBlitImage2 = (PFN_vkCmdBlitImage2)load(context, \"vkCmdBlitImage2\");\n\ttable->vkCmdCopyBuffer2 = (PFN_vkCmdCopyBuffer2)load(context, \"vkCmdCopyBuffer2\");\n\ttable->vkCmdCopyBufferToImage2 = (PFN_vkCmdCopyBufferToImage2)load(context, \"vkCmdCopyBufferToImage2\");\n\ttable->vkCmdCopyImage2 = (PFN_vkCmdCopyImage2)load(context, \"vkCmdCopyImage2\");\n\ttable->vkCmdCopyImageToBuffer2 = (PFN_vkCmdCopyImageToBuffer2)load(context, \"vkCmdCopyImageToBuffer2\");\n\ttable->vkCmdEndRendering = (PFN_vkCmdEndRendering)load(context, \"vkCmdEndRendering\");\n\ttable->vkCmdPipelineBarrier2 = (PFN_vkCmdPipelineBarrier2)load(context, \"vkCmdPipelineBarrier2\");\n\ttable->vkCmdResetEvent2 = (PFN_vkCmdResetEvent2)load(context, \"vkCmdResetEvent2\");\n\ttable->vkCmdResolveImage2 = (PFN_vkCmdResolveImage2)load(context, \"vkCmdResolveImage2\");\n\ttable->vkCmdSetCullMode = (PFN_vkCmdSetCullMode)load(context, \"vkCmdSetCullMode\");\n\ttable->vkCmdSetDepthBiasEnable = (PFN_vkCmdSetDepthBiasEnable)load(context, \"vkCmdSetDepthBiasEnable\");\n\ttable->vkCmdSetDepthBoundsTestEnable = (PFN_vkCmdSetDepthBoundsTestEnable)load(context, \"vkCmdSetDepthBoundsTestEnable\");\n\ttable->vkCmdSetDepthCompareOp = (PFN_vkCmdSetDepthCompareOp)load(context, \"vkCmdSetDepthCompareOp\");\n\ttable->vkCmdSetDepthTestEnable = (PFN_vkCmdSetDepthTestEnable)load(context, \"vkCmdSetDepthTestEnable\");\n\ttable->vkCmdSetDepthWriteEnable = (PFN_vkCmdSetDepthWriteEnable)load(context, \"vkCmdSetDepthWriteEnable\");\n\ttable->vkCmdSetEvent2 = (PFN_vkCmdSetEvent2)load(context, \"vkCmdSetEvent2\");\n\ttable->vkCmdSetFrontFace = (PFN_vkCmdSetFrontFace)load(context, \"vkCmdSetFrontFace\");\n\ttable->vkCmdSetPrimitiveRestartEnable = (PFN_vkCmdSetPrimitiveRestartEnable)load(context, \"vkCmdSetPrimitiveRestartEnable\");\n\ttable->vkCmdSetPrimitiveTopology = (PFN_vkCmdSetPrimitiveTopology)load(context, \"vkCmdSetPrimitiveTopology\");\n\ttable->vkCmdSetRasterizerDiscardEnable = (PFN_vkCmdSetRasterizerDiscardEnable)load(context, \"vkCmdSetRasterizerDiscardEnable\");\n\ttable->vkCmdSetScissorWithCount = (PFN_vkCmdSetScissorWithCount)load(context, \"vkCmdSetScissorWithCount\");\n\ttable->vkCmdSetStencilOp = (PFN_vkCmdSetStencilOp)load(context, \"vkCmdSetStencilOp\");\n\ttable->vkCmdSetStencilTestEnable = (PFN_vkCmdSetStencilTestEnable)load(context, \"vkCmdSetStencilTestEnable\");\n\ttable->vkCmdSetViewportWithCount = (PFN_vkCmdSetViewportWithCount)load(context, \"vkCmdSetViewportWithCount\");\n\ttable->vkCmdWaitEvents2 = (PFN_vkCmdWaitEvents2)load(context, \"vkCmdWaitEvents2\");\n\ttable->vkCmdWriteTimestamp2 = (PFN_vkCmdWriteTimestamp2)load(context, \"vkCmdWriteTimestamp2\");\n\ttable->vkCreatePrivateDataSlot = (PFN_vkCreatePrivateDataSlot)load(context, \"vkCreatePrivateDataSlot\");\n\ttable->vkDestroyPrivateDataSlot = (PFN_vkDestroyPrivateDataSlot)load(context, \"vkDestroyPrivateDataSlot\");\n\ttable->vkGetDeviceBufferMemoryRequirements = (PFN_vkGetDeviceBufferMemoryRequirements)load(context, \"vkGetDeviceBufferMemoryRequirements\");\n\ttable->vkGetDeviceImageMemoryRequirements = (PFN_vkGetDeviceImageMemoryRequirements)load(context, \"vkGetDeviceImageMemoryRequirements\");\n\ttable->vkGetDeviceImageSparseMemoryRequirements = (PFN_vkGetDeviceImageSparseMemoryRequirements)load(context, \"vkGetDeviceImageSparseMemoryRequirements\");\n\ttable->vkGetPrivateData = (PFN_vkGetPrivateData)load(context, \"vkGetPrivateData\");\n\ttable->vkQueueSubmit2 = (PFN_vkQueueSubmit2)load(context, \"vkQueueSubmit2\");\n\ttable->vkSetPrivateData = (PFN_vkSetPrivateData)load(context, \"vkSetPrivateData\");\n#endif /* defined(VK_VERSION_1_3) */\n#if defined(VK_VERSION_1_4)\n\ttable->vkCmdBindDescriptorSets2 = (PFN_vkCmdBindDescriptorSets2)load(context, \"vkCmdBindDescriptorSets2\");\n\ttable->vkCmdBindIndexBuffer2 = (PFN_vkCmdBindIndexBuffer2)load(context, \"vkCmdBindIndexBuffer2\");\n\ttable->vkCmdPushConstants2 = (PFN_vkCmdPushConstants2)load(context, \"vkCmdPushConstants2\");\n\ttable->vkCmdPushDescriptorSet = (PFN_vkCmdPushDescriptorSet)load(context, \"vkCmdPushDescriptorSet\");\n\ttable->vkCmdPushDescriptorSet2 = (PFN_vkCmdPushDescriptorSet2)load(context, \"vkCmdPushDescriptorSet2\");\n\ttable->vkCmdPushDescriptorSetWithTemplate = (PFN_vkCmdPushDescriptorSetWithTemplate)load(context, \"vkCmdPushDescriptorSetWithTemplate\");\n\ttable->vkCmdPushDescriptorSetWithTemplate2 = (PFN_vkCmdPushDescriptorSetWithTemplate2)load(context, \"vkCmdPushDescriptorSetWithTemplate2\");\n\ttable->vkCmdSetLineStipple = (PFN_vkCmdSetLineStipple)load(context, \"vkCmdSetLineStipple\");\n\ttable->vkCmdSetRenderingAttachmentLocations = (PFN_vkCmdSetRenderingAttachmentLocations)load(context, \"vkCmdSetRenderingAttachmentLocations\");\n\ttable->vkCmdSetRenderingInputAttachmentIndices = (PFN_vkCmdSetRenderingInputAttachmentIndices)load(context, \"vkCmdSetRenderingInputAttachmentIndices\");\n\ttable->vkCopyImageToImage = (PFN_vkCopyImageToImage)load(context, \"vkCopyImageToImage\");\n\ttable->vkCopyImageToMemory = (PFN_vkCopyImageToMemory)load(context, \"vkCopyImageToMemory\");\n\ttable->vkCopyMemoryToImage = (PFN_vkCopyMemoryToImage)load(context, \"vkCopyMemoryToImage\");\n\ttable->vkGetDeviceImageSubresourceLayout = (PFN_vkGetDeviceImageSubresourceLayout)load(context, \"vkGetDeviceImageSubresourceLayout\");\n\ttable->vkGetImageSubresourceLayout2 = (PFN_vkGetImageSubresourceLayout2)load(context, \"vkGetImageSubresourceLayout2\");\n\ttable->vkGetRenderingAreaGranularity = (PFN_vkGetRenderingAreaGranularity)load(context, \"vkGetRenderingAreaGranularity\");\n\ttable->vkMapMemory2 = (PFN_vkMapMemory2)load(context, \"vkMapMemory2\");\n\ttable->vkTransitionImageLayout = (PFN_vkTransitionImageLayout)load(context, \"vkTransitionImageLayout\");\n\ttable->vkUnmapMemory2 = (PFN_vkUnmapMemory2)load(context, \"vkUnmapMemory2\");\n#endif /* defined(VK_VERSION_1_4) */\n#if defined(VK_AMDX_shader_enqueue)\n\ttable->vkCmdDispatchGraphAMDX = (PFN_vkCmdDispatchGraphAMDX)load(context, \"vkCmdDispatchGraphAMDX\");\n\ttable->vkCmdDispatchGraphIndirectAMDX = (PFN_vkCmdDispatchGraphIndirectAMDX)load(context, \"vkCmdDispatchGraphIndirectAMDX\");\n\ttable->vkCmdDispatchGraphIndirectCountAMDX = (PFN_vkCmdDispatchGraphIndirectCountAMDX)load(context, \"vkCmdDispatchGraphIndirectCountAMDX\");\n\ttable->vkCmdInitializeGraphScratchMemoryAMDX = (PFN_vkCmdInitializeGraphScratchMemoryAMDX)load(context, \"vkCmdInitializeGraphScratchMemoryAMDX\");\n\ttable->vkCreateExecutionGraphPipelinesAMDX = (PFN_vkCreateExecutionGraphPipelinesAMDX)load(context, \"vkCreateExecutionGraphPipelinesAMDX\");\n\ttable->vkGetExecutionGraphPipelineNodeIndexAMDX = (PFN_vkGetExecutionGraphPipelineNodeIndexAMDX)load(context, \"vkGetExecutionGraphPipelineNodeIndexAMDX\");\n\ttable->vkGetExecutionGraphPipelineScratchSizeAMDX = (PFN_vkGetExecutionGraphPipelineScratchSizeAMDX)load(context, \"vkGetExecutionGraphPipelineScratchSizeAMDX\");\n#endif /* defined(VK_AMDX_shader_enqueue) */\n#if defined(VK_AMD_anti_lag)\n\ttable->vkAntiLagUpdateAMD = (PFN_vkAntiLagUpdateAMD)load(context, \"vkAntiLagUpdateAMD\");\n#endif /* defined(VK_AMD_anti_lag) */\n#if defined(VK_AMD_buffer_marker)\n\ttable->vkCmdWriteBufferMarkerAMD = (PFN_vkCmdWriteBufferMarkerAMD)load(context, \"vkCmdWriteBufferMarkerAMD\");\n#endif /* defined(VK_AMD_buffer_marker) */\n#if defined(VK_AMD_buffer_marker) && (defined(VK_VERSION_1_3) || defined(VK_KHR_synchronization2))\n\ttable->vkCmdWriteBufferMarker2AMD = (PFN_vkCmdWriteBufferMarker2AMD)load(context, \"vkCmdWriteBufferMarker2AMD\");\n#endif /* defined(VK_AMD_buffer_marker) && (defined(VK_VERSION_1_3) || defined(VK_KHR_synchronization2)) */\n#if defined(VK_AMD_display_native_hdr)\n\ttable->vkSetLocalDimmingAMD = (PFN_vkSetLocalDimmingAMD)load(context, \"vkSetLocalDimmingAMD\");\n#endif /* defined(VK_AMD_display_native_hdr) */\n#if defined(VK_AMD_draw_indirect_count)\n\ttable->vkCmdDrawIndexedIndirectCountAMD = (PFN_vkCmdDrawIndexedIndirectCountAMD)load(context, \"vkCmdDrawIndexedIndirectCountAMD\");\n\ttable->vkCmdDrawIndirectCountAMD = (PFN_vkCmdDrawIndirectCountAMD)load(context, \"vkCmdDrawIndirectCountAMD\");\n#endif /* defined(VK_AMD_draw_indirect_count) */\n#if defined(VK_AMD_shader_info)\n\ttable->vkGetShaderInfoAMD = (PFN_vkGetShaderInfoAMD)load(context, \"vkGetShaderInfoAMD\");\n#endif /* defined(VK_AMD_shader_info) */\n#if defined(VK_ANDROID_external_memory_android_hardware_buffer)\n\ttable->vkGetAndroidHardwareBufferPropertiesANDROID = (PFN_vkGetAndroidHardwareBufferPropertiesANDROID)load(context, \"vkGetAndroidHardwareBufferPropertiesANDROID\");\n\ttable->vkGetMemoryAndroidHardwareBufferANDROID = (PFN_vkGetMemoryAndroidHardwareBufferANDROID)load(context, \"vkGetMemoryAndroidHardwareBufferANDROID\");\n#endif /* defined(VK_ANDROID_external_memory_android_hardware_buffer) */\n#if defined(VK_EXT_attachment_feedback_loop_dynamic_state)\n\ttable->vkCmdSetAttachmentFeedbackLoopEnableEXT = (PFN_vkCmdSetAttachmentFeedbackLoopEnableEXT)load(context, \"vkCmdSetAttachmentFeedbackLoopEnableEXT\");\n#endif /* defined(VK_EXT_attachment_feedback_loop_dynamic_state) */\n#if defined(VK_EXT_buffer_device_address)\n\ttable->vkGetBufferDeviceAddressEXT = (PFN_vkGetBufferDeviceAddressEXT)load(context, \"vkGetBufferDeviceAddressEXT\");\n#endif /* defined(VK_EXT_buffer_device_address) */\n#if defined(VK_EXT_calibrated_timestamps)\n\ttable->vkGetCalibratedTimestampsEXT = (PFN_vkGetCalibratedTimestampsEXT)load(context, \"vkGetCalibratedTimestampsEXT\");\n#endif /* defined(VK_EXT_calibrated_timestamps) */\n#if defined(VK_EXT_color_write_enable)\n\ttable->vkCmdSetColorWriteEnableEXT = (PFN_vkCmdSetColorWriteEnableEXT)load(context, \"vkCmdSetColorWriteEnableEXT\");\n#endif /* defined(VK_EXT_color_write_enable) */\n#if defined(VK_EXT_conditional_rendering)\n\ttable->vkCmdBeginConditionalRenderingEXT = (PFN_vkCmdBeginConditionalRenderingEXT)load(context, \"vkCmdBeginConditionalRenderingEXT\");\n\ttable->vkCmdEndConditionalRenderingEXT = (PFN_vkCmdEndConditionalRenderingEXT)load(context, \"vkCmdEndConditionalRenderingEXT\");\n#endif /* defined(VK_EXT_conditional_rendering) */\n#if defined(VK_EXT_debug_marker)\n\ttable->vkCmdDebugMarkerBeginEXT = (PFN_vkCmdDebugMarkerBeginEXT)load(context, \"vkCmdDebugMarkerBeginEXT\");\n\ttable->vkCmdDebugMarkerEndEXT = (PFN_vkCmdDebugMarkerEndEXT)load(context, \"vkCmdDebugMarkerEndEXT\");\n\ttable->vkCmdDebugMarkerInsertEXT = (PFN_vkCmdDebugMarkerInsertEXT)load(context, \"vkCmdDebugMarkerInsertEXT\");\n\ttable->vkDebugMarkerSetObjectNameEXT = (PFN_vkDebugMarkerSetObjectNameEXT)load(context, \"vkDebugMarkerSetObjectNameEXT\");\n\ttable->vkDebugMarkerSetObjectTagEXT = (PFN_vkDebugMarkerSetObjectTagEXT)load(context, \"vkDebugMarkerSetObjectTagEXT\");\n#endif /* defined(VK_EXT_debug_marker) */\n#if defined(VK_EXT_depth_bias_control)\n\ttable->vkCmdSetDepthBias2EXT = (PFN_vkCmdSetDepthBias2EXT)load(context, \"vkCmdSetDepthBias2EXT\");\n#endif /* defined(VK_EXT_depth_bias_control) */\n#if defined(VK_EXT_descriptor_buffer)\n\ttable->vkCmdBindDescriptorBufferEmbeddedSamplersEXT = (PFN_vkCmdBindDescriptorBufferEmbeddedSamplersEXT)load(context, \"vkCmdBindDescriptorBufferEmbeddedSamplersEXT\");\n\ttable->vkCmdBindDescriptorBuffersEXT = (PFN_vkCmdBindDescriptorBuffersEXT)load(context, \"vkCmdBindDescriptorBuffersEXT\");\n\ttable->vkCmdSetDescriptorBufferOffsetsEXT = (PFN_vkCmdSetDescriptorBufferOffsetsEXT)load(context, \"vkCmdSetDescriptorBufferOffsetsEXT\");\n\ttable->vkGetBufferOpaqueCaptureDescriptorDataEXT = (PFN_vkGetBufferOpaqueCaptureDescriptorDataEXT)load(context, \"vkGetBufferOpaqueCaptureDescriptorDataEXT\");\n\ttable->vkGetDescriptorEXT = (PFN_vkGetDescriptorEXT)load(context, \"vkGetDescriptorEXT\");\n\ttable->vkGetDescriptorSetLayoutBindingOffsetEXT = (PFN_vkGetDescriptorSetLayoutBindingOffsetEXT)load(context, \"vkGetDescriptorSetLayoutBindingOffsetEXT\");\n\ttable->vkGetDescriptorSetLayoutSizeEXT = (PFN_vkGetDescriptorSetLayoutSizeEXT)load(context, \"vkGetDescriptorSetLayoutSizeEXT\");\n\ttable->vkGetImageOpaqueCaptureDescriptorDataEXT = (PFN_vkGetImageOpaqueCaptureDescriptorDataEXT)load(context, \"vkGetImageOpaqueCaptureDescriptorDataEXT\");\n\ttable->vkGetImageViewOpaqueCaptureDescriptorDataEXT = (PFN_vkGetImageViewOpaqueCaptureDescriptorDataEXT)load(context, \"vkGetImageViewOpaqueCaptureDescriptorDataEXT\");\n\ttable->vkGetSamplerOpaqueCaptureDescriptorDataEXT = (PFN_vkGetSamplerOpaqueCaptureDescriptorDataEXT)load(context, \"vkGetSamplerOpaqueCaptureDescriptorDataEXT\");\n#endif /* defined(VK_EXT_descriptor_buffer) */\n#if defined(VK_EXT_descriptor_buffer) && (defined(VK_KHR_acceleration_structure) || defined(VK_NV_ray_tracing))\n\ttable->vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT = (PFN_vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT)load(context, \"vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT\");\n#endif /* defined(VK_EXT_descriptor_buffer) && (defined(VK_KHR_acceleration_structure) || defined(VK_NV_ray_tracing)) */\n#if defined(VK_EXT_device_fault)\n\ttable->vkGetDeviceFaultInfoEXT = (PFN_vkGetDeviceFaultInfoEXT)load(context, \"vkGetDeviceFaultInfoEXT\");\n#endif /* defined(VK_EXT_device_fault) */\n#if defined(VK_EXT_device_generated_commands)\n\ttable->vkCmdExecuteGeneratedCommandsEXT = (PFN_vkCmdExecuteGeneratedCommandsEXT)load(context, \"vkCmdExecuteGeneratedCommandsEXT\");\n\ttable->vkCmdPreprocessGeneratedCommandsEXT = (PFN_vkCmdPreprocessGeneratedCommandsEXT)load(context, \"vkCmdPreprocessGeneratedCommandsEXT\");\n\ttable->vkCreateIndirectCommandsLayoutEXT = (PFN_vkCreateIndirectCommandsLayoutEXT)load(context, \"vkCreateIndirectCommandsLayoutEXT\");\n\ttable->vkCreateIndirectExecutionSetEXT = (PFN_vkCreateIndirectExecutionSetEXT)load(context, \"vkCreateIndirectExecutionSetEXT\");\n\ttable->vkDestroyIndirectCommandsLayoutEXT = (PFN_vkDestroyIndirectCommandsLayoutEXT)load(context, \"vkDestroyIndirectCommandsLayoutEXT\");\n\ttable->vkDestroyIndirectExecutionSetEXT = (PFN_vkDestroyIndirectExecutionSetEXT)load(context, \"vkDestroyIndirectExecutionSetEXT\");\n\ttable->vkGetGeneratedCommandsMemoryRequirementsEXT = (PFN_vkGetGeneratedCommandsMemoryRequirementsEXT)load(context, \"vkGetGeneratedCommandsMemoryRequirementsEXT\");\n\ttable->vkUpdateIndirectExecutionSetPipelineEXT = (PFN_vkUpdateIndirectExecutionSetPipelineEXT)load(context, \"vkUpdateIndirectExecutionSetPipelineEXT\");\n\ttable->vkUpdateIndirectExecutionSetShaderEXT = (PFN_vkUpdateIndirectExecutionSetShaderEXT)load(context, \"vkUpdateIndirectExecutionSetShaderEXT\");\n#endif /* defined(VK_EXT_device_generated_commands) */\n#if defined(VK_EXT_discard_rectangles)\n\ttable->vkCmdSetDiscardRectangleEXT = (PFN_vkCmdSetDiscardRectangleEXT)load(context, \"vkCmdSetDiscardRectangleEXT\");\n#endif /* defined(VK_EXT_discard_rectangles) */\n#if defined(VK_EXT_discard_rectangles) && VK_EXT_DISCARD_RECTANGLES_SPEC_VERSION >= 2\n\ttable->vkCmdSetDiscardRectangleEnableEXT = (PFN_vkCmdSetDiscardRectangleEnableEXT)load(context, \"vkCmdSetDiscardRectangleEnableEXT\");\n\ttable->vkCmdSetDiscardRectangleModeEXT = (PFN_vkCmdSetDiscardRectangleModeEXT)load(context, \"vkCmdSetDiscardRectangleModeEXT\");\n#endif /* defined(VK_EXT_discard_rectangles) && VK_EXT_DISCARD_RECTANGLES_SPEC_VERSION >= 2 */\n#if defined(VK_EXT_display_control)\n\ttable->vkDisplayPowerControlEXT = (PFN_vkDisplayPowerControlEXT)load(context, \"vkDisplayPowerControlEXT\");\n\ttable->vkGetSwapchainCounterEXT = (PFN_vkGetSwapchainCounterEXT)load(context, \"vkGetSwapchainCounterEXT\");\n\ttable->vkRegisterDeviceEventEXT = (PFN_vkRegisterDeviceEventEXT)load(context, \"vkRegisterDeviceEventEXT\");\n\ttable->vkRegisterDisplayEventEXT = (PFN_vkRegisterDisplayEventEXT)load(context, \"vkRegisterDisplayEventEXT\");\n#endif /* defined(VK_EXT_display_control) */\n#if defined(VK_EXT_external_memory_host)\n\ttable->vkGetMemoryHostPointerPropertiesEXT = (PFN_vkGetMemoryHostPointerPropertiesEXT)load(context, \"vkGetMemoryHostPointerPropertiesEXT\");\n#endif /* defined(VK_EXT_external_memory_host) */\n#if defined(VK_EXT_external_memory_metal)\n\ttable->vkGetMemoryMetalHandleEXT = (PFN_vkGetMemoryMetalHandleEXT)load(context, \"vkGetMemoryMetalHandleEXT\");\n\ttable->vkGetMemoryMetalHandlePropertiesEXT = (PFN_vkGetMemoryMetalHandlePropertiesEXT)load(context, \"vkGetMemoryMetalHandlePropertiesEXT\");\n#endif /* defined(VK_EXT_external_memory_metal) */\n#if defined(VK_EXT_full_screen_exclusive)\n\ttable->vkAcquireFullScreenExclusiveModeEXT = (PFN_vkAcquireFullScreenExclusiveModeEXT)load(context, \"vkAcquireFullScreenExclusiveModeEXT\");\n\ttable->vkReleaseFullScreenExclusiveModeEXT = (PFN_vkReleaseFullScreenExclusiveModeEXT)load(context, \"vkReleaseFullScreenExclusiveModeEXT\");\n#endif /* defined(VK_EXT_full_screen_exclusive) */\n#if defined(VK_EXT_full_screen_exclusive) && (defined(VK_KHR_device_group) || defined(VK_VERSION_1_1))\n\ttable->vkGetDeviceGroupSurfacePresentModes2EXT = (PFN_vkGetDeviceGroupSurfacePresentModes2EXT)load(context, \"vkGetDeviceGroupSurfacePresentModes2EXT\");\n#endif /* defined(VK_EXT_full_screen_exclusive) && (defined(VK_KHR_device_group) || defined(VK_VERSION_1_1)) */\n#if defined(VK_EXT_hdr_metadata)\n\ttable->vkSetHdrMetadataEXT = (PFN_vkSetHdrMetadataEXT)load(context, \"vkSetHdrMetadataEXT\");\n#endif /* defined(VK_EXT_hdr_metadata) */\n#if defined(VK_EXT_host_image_copy)\n\ttable->vkCopyImageToImageEXT = (PFN_vkCopyImageToImageEXT)load(context, \"vkCopyImageToImageEXT\");\n\ttable->vkCopyImageToMemoryEXT = (PFN_vkCopyImageToMemoryEXT)load(context, \"vkCopyImageToMemoryEXT\");\n\ttable->vkCopyMemoryToImageEXT = (PFN_vkCopyMemoryToImageEXT)load(context, \"vkCopyMemoryToImageEXT\");\n\ttable->vkTransitionImageLayoutEXT = (PFN_vkTransitionImageLayoutEXT)load(context, \"vkTransitionImageLayoutEXT\");\n#endif /* defined(VK_EXT_host_image_copy) */\n#if defined(VK_EXT_host_query_reset)\n\ttable->vkResetQueryPoolEXT = (PFN_vkResetQueryPoolEXT)load(context, \"vkResetQueryPoolEXT\");\n#endif /* defined(VK_EXT_host_query_reset) */\n#if defined(VK_EXT_image_drm_format_modifier)\n\ttable->vkGetImageDrmFormatModifierPropertiesEXT = (PFN_vkGetImageDrmFormatModifierPropertiesEXT)load(context, \"vkGetImageDrmFormatModifierPropertiesEXT\");\n#endif /* defined(VK_EXT_image_drm_format_modifier) */\n#if defined(VK_EXT_line_rasterization)\n\ttable->vkCmdSetLineStippleEXT = (PFN_vkCmdSetLineStippleEXT)load(context, \"vkCmdSetLineStippleEXT\");\n#endif /* defined(VK_EXT_line_rasterization) */\n#if defined(VK_EXT_mesh_shader)\n\ttable->vkCmdDrawMeshTasksEXT = (PFN_vkCmdDrawMeshTasksEXT)load(context, \"vkCmdDrawMeshTasksEXT\");\n\ttable->vkCmdDrawMeshTasksIndirectEXT = (PFN_vkCmdDrawMeshTasksIndirectEXT)load(context, \"vkCmdDrawMeshTasksIndirectEXT\");\n#endif /* defined(VK_EXT_mesh_shader) */\n#if defined(VK_EXT_mesh_shader) && (defined(VK_KHR_draw_indirect_count) || defined(VK_VERSION_1_2))\n\ttable->vkCmdDrawMeshTasksIndirectCountEXT = (PFN_vkCmdDrawMeshTasksIndirectCountEXT)load(context, \"vkCmdDrawMeshTasksIndirectCountEXT\");\n#endif /* defined(VK_EXT_mesh_shader) && (defined(VK_KHR_draw_indirect_count) || defined(VK_VERSION_1_2)) */\n#if defined(VK_EXT_metal_objects)\n\ttable->vkExportMetalObjectsEXT = (PFN_vkExportMetalObjectsEXT)load(context, \"vkExportMetalObjectsEXT\");\n#endif /* defined(VK_EXT_metal_objects) */\n#if defined(VK_EXT_multi_draw)\n\ttable->vkCmdDrawMultiEXT = (PFN_vkCmdDrawMultiEXT)load(context, \"vkCmdDrawMultiEXT\");\n\ttable->vkCmdDrawMultiIndexedEXT = (PFN_vkCmdDrawMultiIndexedEXT)load(context, \"vkCmdDrawMultiIndexedEXT\");\n#endif /* defined(VK_EXT_multi_draw) */\n#if defined(VK_EXT_opacity_micromap)\n\ttable->vkBuildMicromapsEXT = (PFN_vkBuildMicromapsEXT)load(context, \"vkBuildMicromapsEXT\");\n\ttable->vkCmdBuildMicromapsEXT = (PFN_vkCmdBuildMicromapsEXT)load(context, \"vkCmdBuildMicromapsEXT\");\n\ttable->vkCmdCopyMemoryToMicromapEXT = (PFN_vkCmdCopyMemoryToMicromapEXT)load(context, \"vkCmdCopyMemoryToMicromapEXT\");\n\ttable->vkCmdCopyMicromapEXT = (PFN_vkCmdCopyMicromapEXT)load(context, \"vkCmdCopyMicromapEXT\");\n\ttable->vkCmdCopyMicromapToMemoryEXT = (PFN_vkCmdCopyMicromapToMemoryEXT)load(context, \"vkCmdCopyMicromapToMemoryEXT\");\n\ttable->vkCmdWriteMicromapsPropertiesEXT = (PFN_vkCmdWriteMicromapsPropertiesEXT)load(context, \"vkCmdWriteMicromapsPropertiesEXT\");\n\ttable->vkCopyMemoryToMicromapEXT = (PFN_vkCopyMemoryToMicromapEXT)load(context, \"vkCopyMemoryToMicromapEXT\");\n\ttable->vkCopyMicromapEXT = (PFN_vkCopyMicromapEXT)load(context, \"vkCopyMicromapEXT\");\n\ttable->vkCopyMicromapToMemoryEXT = (PFN_vkCopyMicromapToMemoryEXT)load(context, \"vkCopyMicromapToMemoryEXT\");\n\ttable->vkCreateMicromapEXT = (PFN_vkCreateMicromapEXT)load(context, \"vkCreateMicromapEXT\");\n\ttable->vkDestroyMicromapEXT = (PFN_vkDestroyMicromapEXT)load(context, \"vkDestroyMicromapEXT\");\n\ttable->vkGetDeviceMicromapCompatibilityEXT = (PFN_vkGetDeviceMicromapCompatibilityEXT)load(context, \"vkGetDeviceMicromapCompatibilityEXT\");\n\ttable->vkGetMicromapBuildSizesEXT = (PFN_vkGetMicromapBuildSizesEXT)load(context, \"vkGetMicromapBuildSizesEXT\");\n\ttable->vkWriteMicromapsPropertiesEXT = (PFN_vkWriteMicromapsPropertiesEXT)load(context, \"vkWriteMicromapsPropertiesEXT\");\n#endif /* defined(VK_EXT_opacity_micromap) */\n#if defined(VK_EXT_pageable_device_local_memory)\n\ttable->vkSetDeviceMemoryPriorityEXT = (PFN_vkSetDeviceMemoryPriorityEXT)load(context, \"vkSetDeviceMemoryPriorityEXT\");\n#endif /* defined(VK_EXT_pageable_device_local_memory) */\n#if defined(VK_EXT_pipeline_properties)\n\ttable->vkGetPipelinePropertiesEXT = (PFN_vkGetPipelinePropertiesEXT)load(context, \"vkGetPipelinePropertiesEXT\");\n#endif /* defined(VK_EXT_pipeline_properties) */\n#if defined(VK_EXT_private_data)\n\ttable->vkCreatePrivateDataSlotEXT = (PFN_vkCreatePrivateDataSlotEXT)load(context, \"vkCreatePrivateDataSlotEXT\");\n\ttable->vkDestroyPrivateDataSlotEXT = (PFN_vkDestroyPrivateDataSlotEXT)load(context, \"vkDestroyPrivateDataSlotEXT\");\n\ttable->vkGetPrivateDataEXT = (PFN_vkGetPrivateDataEXT)load(context, \"vkGetPrivateDataEXT\");\n\ttable->vkSetPrivateDataEXT = (PFN_vkSetPrivateDataEXT)load(context, \"vkSetPrivateDataEXT\");\n#endif /* defined(VK_EXT_private_data) */\n#if defined(VK_EXT_sample_locations)\n\ttable->vkCmdSetSampleLocationsEXT = (PFN_vkCmdSetSampleLocationsEXT)load(context, \"vkCmdSetSampleLocationsEXT\");\n#endif /* defined(VK_EXT_sample_locations) */\n#if defined(VK_EXT_shader_module_identifier)\n\ttable->vkGetShaderModuleCreateInfoIdentifierEXT = (PFN_vkGetShaderModuleCreateInfoIdentifierEXT)load(context, \"vkGetShaderModuleCreateInfoIdentifierEXT\");\n\ttable->vkGetShaderModuleIdentifierEXT = (PFN_vkGetShaderModuleIdentifierEXT)load(context, \"vkGetShaderModuleIdentifierEXT\");\n#endif /* defined(VK_EXT_shader_module_identifier) */\n#if defined(VK_EXT_shader_object)\n\ttable->vkCmdBindShadersEXT = (PFN_vkCmdBindShadersEXT)load(context, \"vkCmdBindShadersEXT\");\n\ttable->vkCreateShadersEXT = (PFN_vkCreateShadersEXT)load(context, \"vkCreateShadersEXT\");\n\ttable->vkDestroyShaderEXT = (PFN_vkDestroyShaderEXT)load(context, \"vkDestroyShaderEXT\");\n\ttable->vkGetShaderBinaryDataEXT = (PFN_vkGetShaderBinaryDataEXT)load(context, \"vkGetShaderBinaryDataEXT\");\n#endif /* defined(VK_EXT_shader_object) */\n#if defined(VK_EXT_swapchain_maintenance1)\n\ttable->vkReleaseSwapchainImagesEXT = (PFN_vkReleaseSwapchainImagesEXT)load(context, \"vkReleaseSwapchainImagesEXT\");\n#endif /* defined(VK_EXT_swapchain_maintenance1) */\n#if defined(VK_EXT_transform_feedback)\n\ttable->vkCmdBeginQueryIndexedEXT = (PFN_vkCmdBeginQueryIndexedEXT)load(context, \"vkCmdBeginQueryIndexedEXT\");\n\ttable->vkCmdBeginTransformFeedbackEXT = (PFN_vkCmdBeginTransformFeedbackEXT)load(context, \"vkCmdBeginTransformFeedbackEXT\");\n\ttable->vkCmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)load(context, \"vkCmdBindTransformFeedbackBuffersEXT\");\n\ttable->vkCmdDrawIndirectByteCountEXT = (PFN_vkCmdDrawIndirectByteCountEXT)load(context, \"vkCmdDrawIndirectByteCountEXT\");\n\ttable->vkCmdEndQueryIndexedEXT = (PFN_vkCmdEndQueryIndexedEXT)load(context, \"vkCmdEndQueryIndexedEXT\");\n\ttable->vkCmdEndTransformFeedbackEXT = (PFN_vkCmdEndTransformFeedbackEXT)load(context, \"vkCmdEndTransformFeedbackEXT\");\n#endif /* defined(VK_EXT_transform_feedback) */\n#if defined(VK_EXT_validation_cache)\n\ttable->vkCreateValidationCacheEXT = (PFN_vkCreateValidationCacheEXT)load(context, \"vkCreateValidationCacheEXT\");\n\ttable->vkDestroyValidationCacheEXT = (PFN_vkDestroyValidationCacheEXT)load(context, \"vkDestroyValidationCacheEXT\");\n\ttable->vkGetValidationCacheDataEXT = (PFN_vkGetValidationCacheDataEXT)load(context, \"vkGetValidationCacheDataEXT\");\n\ttable->vkMergeValidationCachesEXT = (PFN_vkMergeValidationCachesEXT)load(context, \"vkMergeValidationCachesEXT\");\n#endif /* defined(VK_EXT_validation_cache) */\n#if defined(VK_FUCHSIA_buffer_collection)\n\ttable->vkCreateBufferCollectionFUCHSIA = (PFN_vkCreateBufferCollectionFUCHSIA)load(context, \"vkCreateBufferCollectionFUCHSIA\");\n\ttable->vkDestroyBufferCollectionFUCHSIA = (PFN_vkDestroyBufferCollectionFUCHSIA)load(context, \"vkDestroyBufferCollectionFUCHSIA\");\n\ttable->vkGetBufferCollectionPropertiesFUCHSIA = (PFN_vkGetBufferCollectionPropertiesFUCHSIA)load(context, \"vkGetBufferCollectionPropertiesFUCHSIA\");\n\ttable->vkSetBufferCollectionBufferConstraintsFUCHSIA = (PFN_vkSetBufferCollectionBufferConstraintsFUCHSIA)load(context, \"vkSetBufferCollectionBufferConstraintsFUCHSIA\");\n\ttable->vkSetBufferCollectionImageConstraintsFUCHSIA = (PFN_vkSetBufferCollectionImageConstraintsFUCHSIA)load(context, \"vkSetBufferCollectionImageConstraintsFUCHSIA\");\n#endif /* defined(VK_FUCHSIA_buffer_collection) */\n#if defined(VK_FUCHSIA_external_memory)\n\ttable->vkGetMemoryZirconHandleFUCHSIA = (PFN_vkGetMemoryZirconHandleFUCHSIA)load(context, \"vkGetMemoryZirconHandleFUCHSIA\");\n\ttable->vkGetMemoryZirconHandlePropertiesFUCHSIA = (PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA)load(context, \"vkGetMemoryZirconHandlePropertiesFUCHSIA\");\n#endif /* defined(VK_FUCHSIA_external_memory) */\n#if defined(VK_FUCHSIA_external_semaphore)\n\ttable->vkGetSemaphoreZirconHandleFUCHSIA = (PFN_vkGetSemaphoreZirconHandleFUCHSIA)load(context, \"vkGetSemaphoreZirconHandleFUCHSIA\");\n\ttable->vkImportSemaphoreZirconHandleFUCHSIA = (PFN_vkImportSemaphoreZirconHandleFUCHSIA)load(context, \"vkImportSemaphoreZirconHandleFUCHSIA\");\n#endif /* defined(VK_FUCHSIA_external_semaphore) */\n#if defined(VK_GOOGLE_display_timing)\n\ttable->vkGetPastPresentationTimingGOOGLE = (PFN_vkGetPastPresentationTimingGOOGLE)load(context, \"vkGetPastPresentationTimingGOOGLE\");\n\ttable->vkGetRefreshCycleDurationGOOGLE = (PFN_vkGetRefreshCycleDurationGOOGLE)load(context, \"vkGetRefreshCycleDurationGOOGLE\");\n#endif /* defined(VK_GOOGLE_display_timing) */\n#if defined(VK_HUAWEI_cluster_culling_shader)\n\ttable->vkCmdDrawClusterHUAWEI = (PFN_vkCmdDrawClusterHUAWEI)load(context, \"vkCmdDrawClusterHUAWEI\");\n\ttable->vkCmdDrawClusterIndirectHUAWEI = (PFN_vkCmdDrawClusterIndirectHUAWEI)load(context, \"vkCmdDrawClusterIndirectHUAWEI\");\n#endif /* defined(VK_HUAWEI_cluster_culling_shader) */\n#if defined(VK_HUAWEI_invocation_mask)\n\ttable->vkCmdBindInvocationMaskHUAWEI = (PFN_vkCmdBindInvocationMaskHUAWEI)load(context, \"vkCmdBindInvocationMaskHUAWEI\");\n#endif /* defined(VK_HUAWEI_invocation_mask) */\n#if defined(VK_HUAWEI_subpass_shading) && VK_HUAWEI_SUBPASS_SHADING_SPEC_VERSION >= 2\n\ttable->vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = (PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI)load(context, \"vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI\");\n#endif /* defined(VK_HUAWEI_subpass_shading) && VK_HUAWEI_SUBPASS_SHADING_SPEC_VERSION >= 2 */\n#if defined(VK_HUAWEI_subpass_shading)\n\ttable->vkCmdSubpassShadingHUAWEI = (PFN_vkCmdSubpassShadingHUAWEI)load(context, \"vkCmdSubpassShadingHUAWEI\");\n#endif /* defined(VK_HUAWEI_subpass_shading) */\n#if defined(VK_INTEL_performance_query)\n\ttable->vkAcquirePerformanceConfigurationINTEL = (PFN_vkAcquirePerformanceConfigurationINTEL)load(context, \"vkAcquirePerformanceConfigurationINTEL\");\n\ttable->vkCmdSetPerformanceMarkerINTEL = (PFN_vkCmdSetPerformanceMarkerINTEL)load(context, \"vkCmdSetPerformanceMarkerINTEL\");\n\ttable->vkCmdSetPerformanceOverrideINTEL = (PFN_vkCmdSetPerformanceOverrideINTEL)load(context, \"vkCmdSetPerformanceOverrideINTEL\");\n\ttable->vkCmdSetPerformanceStreamMarkerINTEL = (PFN_vkCmdSetPerformanceStreamMarkerINTEL)load(context, \"vkCmdSetPerformanceStreamMarkerINTEL\");\n\ttable->vkGetPerformanceParameterINTEL = (PFN_vkGetPerformanceParameterINTEL)load(context, \"vkGetPerformanceParameterINTEL\");\n\ttable->vkInitializePerformanceApiINTEL = (PFN_vkInitializePerformanceApiINTEL)load(context, \"vkInitializePerformanceApiINTEL\");\n\ttable->vkQueueSetPerformanceConfigurationINTEL = (PFN_vkQueueSetPerformanceConfigurationINTEL)load(context, \"vkQueueSetPerformanceConfigurationINTEL\");\n\ttable->vkReleasePerformanceConfigurationINTEL = (PFN_vkReleasePerformanceConfigurationINTEL)load(context, \"vkReleasePerformanceConfigurationINTEL\");\n\ttable->vkUninitializePerformanceApiINTEL = (PFN_vkUninitializePerformanceApiINTEL)load(context, \"vkUninitializePerformanceApiINTEL\");\n#endif /* defined(VK_INTEL_performance_query) */\n#if defined(VK_KHR_acceleration_structure)\n\ttable->vkBuildAccelerationStructuresKHR = (PFN_vkBuildAccelerationStructuresKHR)load(context, \"vkBuildAccelerationStructuresKHR\");\n\ttable->vkCmdBuildAccelerationStructuresIndirectKHR = (PFN_vkCmdBuildAccelerationStructuresIndirectKHR)load(context, \"vkCmdBuildAccelerationStructuresIndirectKHR\");\n\ttable->vkCmdBuildAccelerationStructuresKHR = (PFN_vkCmdBuildAccelerationStructuresKHR)load(context, \"vkCmdBuildAccelerationStructuresKHR\");\n\ttable->vkCmdCopyAccelerationStructureKHR = (PFN_vkCmdCopyAccelerationStructureKHR)load(context, \"vkCmdCopyAccelerationStructureKHR\");\n\ttable->vkCmdCopyAccelerationStructureToMemoryKHR = (PFN_vkCmdCopyAccelerationStructureToMemoryKHR)load(context, \"vkCmdCopyAccelerationStructureToMemoryKHR\");\n\ttable->vkCmdCopyMemoryToAccelerationStructureKHR = (PFN_vkCmdCopyMemoryToAccelerationStructureKHR)load(context, \"vkCmdCopyMemoryToAccelerationStructureKHR\");\n\ttable->vkCmdWriteAccelerationStructuresPropertiesKHR = (PFN_vkCmdWriteAccelerationStructuresPropertiesKHR)load(context, \"vkCmdWriteAccelerationStructuresPropertiesKHR\");\n\ttable->vkCopyAccelerationStructureKHR = (PFN_vkCopyAccelerationStructureKHR)load(context, \"vkCopyAccelerationStructureKHR\");\n\ttable->vkCopyAccelerationStructureToMemoryKHR = (PFN_vkCopyAccelerationStructureToMemoryKHR)load(context, \"vkCopyAccelerationStructureToMemoryKHR\");\n\ttable->vkCopyMemoryToAccelerationStructureKHR = (PFN_vkCopyMemoryToAccelerationStructureKHR)load(context, \"vkCopyMemoryToAccelerationStructureKHR\");\n\ttable->vkCreateAccelerationStructureKHR = (PFN_vkCreateAccelerationStructureKHR)load(context, \"vkCreateAccelerationStructureKHR\");\n\ttable->vkDestroyAccelerationStructureKHR = (PFN_vkDestroyAccelerationStructureKHR)load(context, \"vkDestroyAccelerationStructureKHR\");\n\ttable->vkGetAccelerationStructureBuildSizesKHR = (PFN_vkGetAccelerationStructureBuildSizesKHR)load(context, \"vkGetAccelerationStructureBuildSizesKHR\");\n\ttable->vkGetAccelerationStructureDeviceAddressKHR = (PFN_vkGetAccelerationStructureDeviceAddressKHR)load(context, \"vkGetAccelerationStructureDeviceAddressKHR\");\n\ttable->vkGetDeviceAccelerationStructureCompatibilityKHR = (PFN_vkGetDeviceAccelerationStructureCompatibilityKHR)load(context, \"vkGetDeviceAccelerationStructureCompatibilityKHR\");\n\ttable->vkWriteAccelerationStructuresPropertiesKHR = (PFN_vkWriteAccelerationStructuresPropertiesKHR)load(context, \"vkWriteAccelerationStructuresPropertiesKHR\");\n#endif /* defined(VK_KHR_acceleration_structure) */\n#if defined(VK_KHR_bind_memory2)\n\ttable->vkBindBufferMemory2KHR = (PFN_vkBindBufferMemory2KHR)load(context, \"vkBindBufferMemory2KHR\");\n\ttable->vkBindImageMemory2KHR = (PFN_vkBindImageMemory2KHR)load(context, \"vkBindImageMemory2KHR\");\n#endif /* defined(VK_KHR_bind_memory2) */\n#if defined(VK_KHR_buffer_device_address)\n\ttable->vkGetBufferDeviceAddressKHR = (PFN_vkGetBufferDeviceAddressKHR)load(context, \"vkGetBufferDeviceAddressKHR\");\n\ttable->vkGetBufferOpaqueCaptureAddressKHR = (PFN_vkGetBufferOpaqueCaptureAddressKHR)load(context, \"vkGetBufferOpaqueCaptureAddressKHR\");\n\ttable->vkGetDeviceMemoryOpaqueCaptureAddressKHR = (PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR)load(context, \"vkGetDeviceMemoryOpaqueCaptureAddressKHR\");\n#endif /* defined(VK_KHR_buffer_device_address) */\n#if defined(VK_KHR_calibrated_timestamps)\n\ttable->vkGetCalibratedTimestampsKHR = (PFN_vkGetCalibratedTimestampsKHR)load(context, \"vkGetCalibratedTimestampsKHR\");\n#endif /* defined(VK_KHR_calibrated_timestamps) */\n#if defined(VK_KHR_copy_commands2)\n\ttable->vkCmdBlitImage2KHR = (PFN_vkCmdBlitImage2KHR)load(context, \"vkCmdBlitImage2KHR\");\n\ttable->vkCmdCopyBuffer2KHR = (PFN_vkCmdCopyBuffer2KHR)load(context, \"vkCmdCopyBuffer2KHR\");\n\ttable->vkCmdCopyBufferToImage2KHR = (PFN_vkCmdCopyBufferToImage2KHR)load(context, \"vkCmdCopyBufferToImage2KHR\");\n\ttable->vkCmdCopyImage2KHR = (PFN_vkCmdCopyImage2KHR)load(context, \"vkCmdCopyImage2KHR\");\n\ttable->vkCmdCopyImageToBuffer2KHR = (PFN_vkCmdCopyImageToBuffer2KHR)load(context, \"vkCmdCopyImageToBuffer2KHR\");\n\ttable->vkCmdResolveImage2KHR = (PFN_vkCmdResolveImage2KHR)load(context, \"vkCmdResolveImage2KHR\");\n#endif /* defined(VK_KHR_copy_commands2) */\n#if defined(VK_KHR_create_renderpass2)\n\ttable->vkCmdBeginRenderPass2KHR = (PFN_vkCmdBeginRenderPass2KHR)load(context, \"vkCmdBeginRenderPass2KHR\");\n\ttable->vkCmdEndRenderPass2KHR = (PFN_vkCmdEndRenderPass2KHR)load(context, \"vkCmdEndRenderPass2KHR\");\n\ttable->vkCmdNextSubpass2KHR = (PFN_vkCmdNextSubpass2KHR)load(context, \"vkCmdNextSubpass2KHR\");\n\ttable->vkCreateRenderPass2KHR = (PFN_vkCreateRenderPass2KHR)load(context, \"vkCreateRenderPass2KHR\");\n#endif /* defined(VK_KHR_create_renderpass2) */\n#if defined(VK_KHR_deferred_host_operations)\n\ttable->vkCreateDeferredOperationKHR = (PFN_vkCreateDeferredOperationKHR)load(context, \"vkCreateDeferredOperationKHR\");\n\ttable->vkDeferredOperationJoinKHR = (PFN_vkDeferredOperationJoinKHR)load(context, \"vkDeferredOperationJoinKHR\");\n\ttable->vkDestroyDeferredOperationKHR = (PFN_vkDestroyDeferredOperationKHR)load(context, \"vkDestroyDeferredOperationKHR\");\n\ttable->vkGetDeferredOperationMaxConcurrencyKHR = (PFN_vkGetDeferredOperationMaxConcurrencyKHR)load(context, \"vkGetDeferredOperationMaxConcurrencyKHR\");\n\ttable->vkGetDeferredOperationResultKHR = (PFN_vkGetDeferredOperationResultKHR)load(context, \"vkGetDeferredOperationResultKHR\");\n#endif /* defined(VK_KHR_deferred_host_operations) */\n#if defined(VK_KHR_descriptor_update_template)\n\ttable->vkCreateDescriptorUpdateTemplateKHR = (PFN_vkCreateDescriptorUpdateTemplateKHR)load(context, \"vkCreateDescriptorUpdateTemplateKHR\");\n\ttable->vkDestroyDescriptorUpdateTemplateKHR = (PFN_vkDestroyDescriptorUpdateTemplateKHR)load(context, \"vkDestroyDescriptorUpdateTemplateKHR\");\n\ttable->vkUpdateDescriptorSetWithTemplateKHR = (PFN_vkUpdateDescriptorSetWithTemplateKHR)load(context, \"vkUpdateDescriptorSetWithTemplateKHR\");\n#endif /* defined(VK_KHR_descriptor_update_template) */\n#if defined(VK_KHR_device_group)\n\ttable->vkCmdDispatchBaseKHR = (PFN_vkCmdDispatchBaseKHR)load(context, \"vkCmdDispatchBaseKHR\");\n\ttable->vkCmdSetDeviceMaskKHR = (PFN_vkCmdSetDeviceMaskKHR)load(context, \"vkCmdSetDeviceMaskKHR\");\n\ttable->vkGetDeviceGroupPeerMemoryFeaturesKHR = (PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR)load(context, \"vkGetDeviceGroupPeerMemoryFeaturesKHR\");\n#endif /* defined(VK_KHR_device_group) */\n#if defined(VK_KHR_display_swapchain)\n\ttable->vkCreateSharedSwapchainsKHR = (PFN_vkCreateSharedSwapchainsKHR)load(context, \"vkCreateSharedSwapchainsKHR\");\n#endif /* defined(VK_KHR_display_swapchain) */\n#if defined(VK_KHR_draw_indirect_count)\n\ttable->vkCmdDrawIndexedIndirectCountKHR = (PFN_vkCmdDrawIndexedIndirectCountKHR)load(context, \"vkCmdDrawIndexedIndirectCountKHR\");\n\ttable->vkCmdDrawIndirectCountKHR = (PFN_vkCmdDrawIndirectCountKHR)load(context, \"vkCmdDrawIndirectCountKHR\");\n#endif /* defined(VK_KHR_draw_indirect_count) */\n#if defined(VK_KHR_dynamic_rendering)\n\ttable->vkCmdBeginRenderingKHR = (PFN_vkCmdBeginRenderingKHR)load(context, \"vkCmdBeginRenderingKHR\");\n\ttable->vkCmdEndRenderingKHR = (PFN_vkCmdEndRenderingKHR)load(context, \"vkCmdEndRenderingKHR\");\n#endif /* defined(VK_KHR_dynamic_rendering) */\n#if defined(VK_KHR_dynamic_rendering_local_read)\n\ttable->vkCmdSetRenderingAttachmentLocationsKHR = (PFN_vkCmdSetRenderingAttachmentLocationsKHR)load(context, \"vkCmdSetRenderingAttachmentLocationsKHR\");\n\ttable->vkCmdSetRenderingInputAttachmentIndicesKHR = (PFN_vkCmdSetRenderingInputAttachmentIndicesKHR)load(context, \"vkCmdSetRenderingInputAttachmentIndicesKHR\");\n#endif /* defined(VK_KHR_dynamic_rendering_local_read) */\n#if defined(VK_KHR_external_fence_fd)\n\ttable->vkGetFenceFdKHR = (PFN_vkGetFenceFdKHR)load(context, \"vkGetFenceFdKHR\");\n\ttable->vkImportFenceFdKHR = (PFN_vkImportFenceFdKHR)load(context, \"vkImportFenceFdKHR\");\n#endif /* defined(VK_KHR_external_fence_fd) */\n#if defined(VK_KHR_external_fence_win32)\n\ttable->vkGetFenceWin32HandleKHR = (PFN_vkGetFenceWin32HandleKHR)load(context, \"vkGetFenceWin32HandleKHR\");\n\ttable->vkImportFenceWin32HandleKHR = (PFN_vkImportFenceWin32HandleKHR)load(context, \"vkImportFenceWin32HandleKHR\");\n#endif /* defined(VK_KHR_external_fence_win32) */\n#if defined(VK_KHR_external_memory_fd)\n\ttable->vkGetMemoryFdKHR = (PFN_vkGetMemoryFdKHR)load(context, \"vkGetMemoryFdKHR\");\n\ttable->vkGetMemoryFdPropertiesKHR = (PFN_vkGetMemoryFdPropertiesKHR)load(context, \"vkGetMemoryFdPropertiesKHR\");\n#endif /* defined(VK_KHR_external_memory_fd) */\n#if defined(VK_KHR_external_memory_win32)\n\ttable->vkGetMemoryWin32HandleKHR = (PFN_vkGetMemoryWin32HandleKHR)load(context, \"vkGetMemoryWin32HandleKHR\");\n\ttable->vkGetMemoryWin32HandlePropertiesKHR = (PFN_vkGetMemoryWin32HandlePropertiesKHR)load(context, \"vkGetMemoryWin32HandlePropertiesKHR\");\n#endif /* defined(VK_KHR_external_memory_win32) */\n#if defined(VK_KHR_external_semaphore_fd)\n\ttable->vkGetSemaphoreFdKHR = (PFN_vkGetSemaphoreFdKHR)load(context, \"vkGetSemaphoreFdKHR\");\n\ttable->vkImportSemaphoreFdKHR = (PFN_vkImportSemaphoreFdKHR)load(context, \"vkImportSemaphoreFdKHR\");\n#endif /* defined(VK_KHR_external_semaphore_fd) */\n#if defined(VK_KHR_external_semaphore_win32)\n\ttable->vkGetSemaphoreWin32HandleKHR = (PFN_vkGetSemaphoreWin32HandleKHR)load(context, \"vkGetSemaphoreWin32HandleKHR\");\n\ttable->vkImportSemaphoreWin32HandleKHR = (PFN_vkImportSemaphoreWin32HandleKHR)load(context, \"vkImportSemaphoreWin32HandleKHR\");\n#endif /* defined(VK_KHR_external_semaphore_win32) */\n#if defined(VK_KHR_fragment_shading_rate)\n\ttable->vkCmdSetFragmentShadingRateKHR = (PFN_vkCmdSetFragmentShadingRateKHR)load(context, \"vkCmdSetFragmentShadingRateKHR\");\n#endif /* defined(VK_KHR_fragment_shading_rate) */\n#if defined(VK_KHR_get_memory_requirements2)\n\ttable->vkGetBufferMemoryRequirements2KHR = (PFN_vkGetBufferMemoryRequirements2KHR)load(context, \"vkGetBufferMemoryRequirements2KHR\");\n\ttable->vkGetImageMemoryRequirements2KHR = (PFN_vkGetImageMemoryRequirements2KHR)load(context, \"vkGetImageMemoryRequirements2KHR\");\n\ttable->vkGetImageSparseMemoryRequirements2KHR = (PFN_vkGetImageSparseMemoryRequirements2KHR)load(context, \"vkGetImageSparseMemoryRequirements2KHR\");\n#endif /* defined(VK_KHR_get_memory_requirements2) */\n#if defined(VK_KHR_line_rasterization)\n\ttable->vkCmdSetLineStippleKHR = (PFN_vkCmdSetLineStippleKHR)load(context, \"vkCmdSetLineStippleKHR\");\n#endif /* defined(VK_KHR_line_rasterization) */\n#if defined(VK_KHR_maintenance1)\n\ttable->vkTrimCommandPoolKHR = (PFN_vkTrimCommandPoolKHR)load(context, \"vkTrimCommandPoolKHR\");\n#endif /* defined(VK_KHR_maintenance1) */\n#if defined(VK_KHR_maintenance3)\n\ttable->vkGetDescriptorSetLayoutSupportKHR = (PFN_vkGetDescriptorSetLayoutSupportKHR)load(context, \"vkGetDescriptorSetLayoutSupportKHR\");\n#endif /* defined(VK_KHR_maintenance3) */\n#if defined(VK_KHR_maintenance4)\n\ttable->vkGetDeviceBufferMemoryRequirementsKHR = (PFN_vkGetDeviceBufferMemoryRequirementsKHR)load(context, \"vkGetDeviceBufferMemoryRequirementsKHR\");\n\ttable->vkGetDeviceImageMemoryRequirementsKHR = (PFN_vkGetDeviceImageMemoryRequirementsKHR)load(context, \"vkGetDeviceImageMemoryRequirementsKHR\");\n\ttable->vkGetDeviceImageSparseMemoryRequirementsKHR = (PFN_vkGetDeviceImageSparseMemoryRequirementsKHR)load(context, \"vkGetDeviceImageSparseMemoryRequirementsKHR\");\n#endif /* defined(VK_KHR_maintenance4) */\n#if defined(VK_KHR_maintenance5)\n\ttable->vkCmdBindIndexBuffer2KHR = (PFN_vkCmdBindIndexBuffer2KHR)load(context, \"vkCmdBindIndexBuffer2KHR\");\n\ttable->vkGetDeviceImageSubresourceLayoutKHR = (PFN_vkGetDeviceImageSubresourceLayoutKHR)load(context, \"vkGetDeviceImageSubresourceLayoutKHR\");\n\ttable->vkGetImageSubresourceLayout2KHR = (PFN_vkGetImageSubresourceLayout2KHR)load(context, \"vkGetImageSubresourceLayout2KHR\");\n\ttable->vkGetRenderingAreaGranularityKHR = (PFN_vkGetRenderingAreaGranularityKHR)load(context, \"vkGetRenderingAreaGranularityKHR\");\n#endif /* defined(VK_KHR_maintenance5) */\n#if defined(VK_KHR_maintenance6)\n\ttable->vkCmdBindDescriptorSets2KHR = (PFN_vkCmdBindDescriptorSets2KHR)load(context, \"vkCmdBindDescriptorSets2KHR\");\n\ttable->vkCmdPushConstants2KHR = (PFN_vkCmdPushConstants2KHR)load(context, \"vkCmdPushConstants2KHR\");\n#endif /* defined(VK_KHR_maintenance6) */\n#if defined(VK_KHR_maintenance6) && defined(VK_KHR_push_descriptor)\n\ttable->vkCmdPushDescriptorSet2KHR = (PFN_vkCmdPushDescriptorSet2KHR)load(context, \"vkCmdPushDescriptorSet2KHR\");\n\ttable->vkCmdPushDescriptorSetWithTemplate2KHR = (PFN_vkCmdPushDescriptorSetWithTemplate2KHR)load(context, \"vkCmdPushDescriptorSetWithTemplate2KHR\");\n#endif /* defined(VK_KHR_maintenance6) && defined(VK_KHR_push_descriptor) */\n#if defined(VK_KHR_maintenance6) && defined(VK_EXT_descriptor_buffer)\n\ttable->vkCmdBindDescriptorBufferEmbeddedSamplers2EXT = (PFN_vkCmdBindDescriptorBufferEmbeddedSamplers2EXT)load(context, \"vkCmdBindDescriptorBufferEmbeddedSamplers2EXT\");\n\ttable->vkCmdSetDescriptorBufferOffsets2EXT = (PFN_vkCmdSetDescriptorBufferOffsets2EXT)load(context, \"vkCmdSetDescriptorBufferOffsets2EXT\");\n#endif /* defined(VK_KHR_maintenance6) && defined(VK_EXT_descriptor_buffer) */\n#if defined(VK_KHR_map_memory2)\n\ttable->vkMapMemory2KHR = (PFN_vkMapMemory2KHR)load(context, \"vkMapMemory2KHR\");\n\ttable->vkUnmapMemory2KHR = (PFN_vkUnmapMemory2KHR)load(context, \"vkUnmapMemory2KHR\");\n#endif /* defined(VK_KHR_map_memory2) */\n#if defined(VK_KHR_performance_query)\n\ttable->vkAcquireProfilingLockKHR = (PFN_vkAcquireProfilingLockKHR)load(context, \"vkAcquireProfilingLockKHR\");\n\ttable->vkReleaseProfilingLockKHR = (PFN_vkReleaseProfilingLockKHR)load(context, \"vkReleaseProfilingLockKHR\");\n#endif /* defined(VK_KHR_performance_query) */\n#if defined(VK_KHR_pipeline_binary)\n\ttable->vkCreatePipelineBinariesKHR = (PFN_vkCreatePipelineBinariesKHR)load(context, \"vkCreatePipelineBinariesKHR\");\n\ttable->vkDestroyPipelineBinaryKHR = (PFN_vkDestroyPipelineBinaryKHR)load(context, \"vkDestroyPipelineBinaryKHR\");\n\ttable->vkGetPipelineBinaryDataKHR = (PFN_vkGetPipelineBinaryDataKHR)load(context, \"vkGetPipelineBinaryDataKHR\");\n\ttable->vkGetPipelineKeyKHR = (PFN_vkGetPipelineKeyKHR)load(context, \"vkGetPipelineKeyKHR\");\n\ttable->vkReleaseCapturedPipelineDataKHR = (PFN_vkReleaseCapturedPipelineDataKHR)load(context, \"vkReleaseCapturedPipelineDataKHR\");\n#endif /* defined(VK_KHR_pipeline_binary) */\n#if defined(VK_KHR_pipeline_executable_properties)\n\ttable->vkGetPipelineExecutableInternalRepresentationsKHR = (PFN_vkGetPipelineExecutableInternalRepresentationsKHR)load(context, \"vkGetPipelineExecutableInternalRepresentationsKHR\");\n\ttable->vkGetPipelineExecutablePropertiesKHR = (PFN_vkGetPipelineExecutablePropertiesKHR)load(context, \"vkGetPipelineExecutablePropertiesKHR\");\n\ttable->vkGetPipelineExecutableStatisticsKHR = (PFN_vkGetPipelineExecutableStatisticsKHR)load(context, \"vkGetPipelineExecutableStatisticsKHR\");\n#endif /* defined(VK_KHR_pipeline_executable_properties) */\n#if defined(VK_KHR_present_wait)\n\ttable->vkWaitForPresentKHR = (PFN_vkWaitForPresentKHR)load(context, \"vkWaitForPresentKHR\");\n#endif /* defined(VK_KHR_present_wait) */\n#if defined(VK_KHR_push_descriptor)\n\ttable->vkCmdPushDescriptorSetKHR = (PFN_vkCmdPushDescriptorSetKHR)load(context, \"vkCmdPushDescriptorSetKHR\");\n#endif /* defined(VK_KHR_push_descriptor) */\n#if defined(VK_KHR_ray_tracing_maintenance1) && defined(VK_KHR_ray_tracing_pipeline)\n\ttable->vkCmdTraceRaysIndirect2KHR = (PFN_vkCmdTraceRaysIndirect2KHR)load(context, \"vkCmdTraceRaysIndirect2KHR\");\n#endif /* defined(VK_KHR_ray_tracing_maintenance1) && defined(VK_KHR_ray_tracing_pipeline) */\n#if defined(VK_KHR_ray_tracing_pipeline)\n\ttable->vkCmdSetRayTracingPipelineStackSizeKHR = (PFN_vkCmdSetRayTracingPipelineStackSizeKHR)load(context, \"vkCmdSetRayTracingPipelineStackSizeKHR\");\n\ttable->vkCmdTraceRaysIndirectKHR = (PFN_vkCmdTraceRaysIndirectKHR)load(context, \"vkCmdTraceRaysIndirectKHR\");\n\ttable->vkCmdTraceRaysKHR = (PFN_vkCmdTraceRaysKHR)load(context, \"vkCmdTraceRaysKHR\");\n\ttable->vkCreateRayTracingPipelinesKHR = (PFN_vkCreateRayTracingPipelinesKHR)load(context, \"vkCreateRayTracingPipelinesKHR\");\n\ttable->vkGetRayTracingCaptureReplayShaderGroupHandlesKHR = (PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR)load(context, \"vkGetRayTracingCaptureReplayShaderGroupHandlesKHR\");\n\ttable->vkGetRayTracingShaderGroupHandlesKHR = (PFN_vkGetRayTracingShaderGroupHandlesKHR)load(context, \"vkGetRayTracingShaderGroupHandlesKHR\");\n\ttable->vkGetRayTracingShaderGroupStackSizeKHR = (PFN_vkGetRayTracingShaderGroupStackSizeKHR)load(context, \"vkGetRayTracingShaderGroupStackSizeKHR\");\n#endif /* defined(VK_KHR_ray_tracing_pipeline) */\n#if defined(VK_KHR_sampler_ycbcr_conversion)\n\ttable->vkCreateSamplerYcbcrConversionKHR = (PFN_vkCreateSamplerYcbcrConversionKHR)load(context, \"vkCreateSamplerYcbcrConversionKHR\");\n\ttable->vkDestroySamplerYcbcrConversionKHR = (PFN_vkDestroySamplerYcbcrConversionKHR)load(context, \"vkDestroySamplerYcbcrConversionKHR\");\n#endif /* defined(VK_KHR_sampler_ycbcr_conversion) */\n#if defined(VK_KHR_shared_presentable_image)\n\ttable->vkGetSwapchainStatusKHR = (PFN_vkGetSwapchainStatusKHR)load(context, \"vkGetSwapchainStatusKHR\");\n#endif /* defined(VK_KHR_shared_presentable_image) */\n#if defined(VK_KHR_swapchain)\n\ttable->vkAcquireNextImageKHR = (PFN_vkAcquireNextImageKHR)load(context, \"vkAcquireNextImageKHR\");\n\ttable->vkCreateSwapchainKHR = (PFN_vkCreateSwapchainKHR)load(context, \"vkCreateSwapchainKHR\");\n\ttable->vkDestroySwapchainKHR = (PFN_vkDestroySwapchainKHR)load(context, \"vkDestroySwapchainKHR\");\n\ttable->vkGetSwapchainImagesKHR = (PFN_vkGetSwapchainImagesKHR)load(context, \"vkGetSwapchainImagesKHR\");\n\ttable->vkQueuePresentKHR = (PFN_vkQueuePresentKHR)load(context, \"vkQueuePresentKHR\");\n#endif /* defined(VK_KHR_swapchain) */\n#if defined(VK_KHR_synchronization2)\n\ttable->vkCmdPipelineBarrier2KHR = (PFN_vkCmdPipelineBarrier2KHR)load(context, \"vkCmdPipelineBarrier2KHR\");\n\ttable->vkCmdResetEvent2KHR = (PFN_vkCmdResetEvent2KHR)load(context, \"vkCmdResetEvent2KHR\");\n\ttable->vkCmdSetEvent2KHR = (PFN_vkCmdSetEvent2KHR)load(context, \"vkCmdSetEvent2KHR\");\n\ttable->vkCmdWaitEvents2KHR = (PFN_vkCmdWaitEvents2KHR)load(context, \"vkCmdWaitEvents2KHR\");\n\ttable->vkCmdWriteTimestamp2KHR = (PFN_vkCmdWriteTimestamp2KHR)load(context, \"vkCmdWriteTimestamp2KHR\");\n\ttable->vkQueueSubmit2KHR = (PFN_vkQueueSubmit2KHR)load(context, \"vkQueueSubmit2KHR\");\n#endif /* defined(VK_KHR_synchronization2) */\n#if defined(VK_KHR_timeline_semaphore)\n\ttable->vkGetSemaphoreCounterValueKHR = (PFN_vkGetSemaphoreCounterValueKHR)load(context, \"vkGetSemaphoreCounterValueKHR\");\n\ttable->vkSignalSemaphoreKHR = (PFN_vkSignalSemaphoreKHR)load(context, \"vkSignalSemaphoreKHR\");\n\ttable->vkWaitSemaphoresKHR = (PFN_vkWaitSemaphoresKHR)load(context, \"vkWaitSemaphoresKHR\");\n#endif /* defined(VK_KHR_timeline_semaphore) */\n#if defined(VK_KHR_video_decode_queue)\n\ttable->vkCmdDecodeVideoKHR = (PFN_vkCmdDecodeVideoKHR)load(context, \"vkCmdDecodeVideoKHR\");\n#endif /* defined(VK_KHR_video_decode_queue) */\n#if defined(VK_KHR_video_encode_queue)\n\ttable->vkCmdEncodeVideoKHR = (PFN_vkCmdEncodeVideoKHR)load(context, \"vkCmdEncodeVideoKHR\");\n\ttable->vkGetEncodedVideoSessionParametersKHR = (PFN_vkGetEncodedVideoSessionParametersKHR)load(context, \"vkGetEncodedVideoSessionParametersKHR\");\n#endif /* defined(VK_KHR_video_encode_queue) */\n#if defined(VK_KHR_video_queue)\n\ttable->vkBindVideoSessionMemoryKHR = (PFN_vkBindVideoSessionMemoryKHR)load(context, \"vkBindVideoSessionMemoryKHR\");\n\ttable->vkCmdBeginVideoCodingKHR = (PFN_vkCmdBeginVideoCodingKHR)load(context, \"vkCmdBeginVideoCodingKHR\");\n\ttable->vkCmdControlVideoCodingKHR = (PFN_vkCmdControlVideoCodingKHR)load(context, \"vkCmdControlVideoCodingKHR\");\n\ttable->vkCmdEndVideoCodingKHR = (PFN_vkCmdEndVideoCodingKHR)load(context, \"vkCmdEndVideoCodingKHR\");\n\ttable->vkCreateVideoSessionKHR = (PFN_vkCreateVideoSessionKHR)load(context, \"vkCreateVideoSessionKHR\");\n\ttable->vkCreateVideoSessionParametersKHR = (PFN_vkCreateVideoSessionParametersKHR)load(context, \"vkCreateVideoSessionParametersKHR\");\n\ttable->vkDestroyVideoSessionKHR = (PFN_vkDestroyVideoSessionKHR)load(context, \"vkDestroyVideoSessionKHR\");\n\ttable->vkDestroyVideoSessionParametersKHR = (PFN_vkDestroyVideoSessionParametersKHR)load(context, \"vkDestroyVideoSessionParametersKHR\");\n\ttable->vkGetVideoSessionMemoryRequirementsKHR = (PFN_vkGetVideoSessionMemoryRequirementsKHR)load(context, \"vkGetVideoSessionMemoryRequirementsKHR\");\n\ttable->vkUpdateVideoSessionParametersKHR = (PFN_vkUpdateVideoSessionParametersKHR)load(context, \"vkUpdateVideoSessionParametersKHR\");\n#endif /* defined(VK_KHR_video_queue) */\n#if defined(VK_NVX_binary_import)\n\ttable->vkCmdCuLaunchKernelNVX = (PFN_vkCmdCuLaunchKernelNVX)load(context, \"vkCmdCuLaunchKernelNVX\");\n\ttable->vkCreateCuFunctionNVX = (PFN_vkCreateCuFunctionNVX)load(context, \"vkCreateCuFunctionNVX\");\n\ttable->vkCreateCuModuleNVX = (PFN_vkCreateCuModuleNVX)load(context, \"vkCreateCuModuleNVX\");\n\ttable->vkDestroyCuFunctionNVX = (PFN_vkDestroyCuFunctionNVX)load(context, \"vkDestroyCuFunctionNVX\");\n\ttable->vkDestroyCuModuleNVX = (PFN_vkDestroyCuModuleNVX)load(context, \"vkDestroyCuModuleNVX\");\n#endif /* defined(VK_NVX_binary_import) */\n#if defined(VK_NVX_image_view_handle)\n\ttable->vkGetImageViewHandleNVX = (PFN_vkGetImageViewHandleNVX)load(context, \"vkGetImageViewHandleNVX\");\n#endif /* defined(VK_NVX_image_view_handle) */\n#if defined(VK_NVX_image_view_handle) && VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION >= 3\n\ttable->vkGetImageViewHandle64NVX = (PFN_vkGetImageViewHandle64NVX)load(context, \"vkGetImageViewHandle64NVX\");\n#endif /* defined(VK_NVX_image_view_handle) && VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION >= 3 */\n#if defined(VK_NVX_image_view_handle) && VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION >= 2\n\ttable->vkGetImageViewAddressNVX = (PFN_vkGetImageViewAddressNVX)load(context, \"vkGetImageViewAddressNVX\");\n#endif /* defined(VK_NVX_image_view_handle) && VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION >= 2 */\n#if defined(VK_NV_clip_space_w_scaling)\n\ttable->vkCmdSetViewportWScalingNV = (PFN_vkCmdSetViewportWScalingNV)load(context, \"vkCmdSetViewportWScalingNV\");\n#endif /* defined(VK_NV_clip_space_w_scaling) */\n#if defined(VK_NV_cluster_acceleration_structure)\n\ttable->vkCmdBuildClusterAccelerationStructureIndirectNV = (PFN_vkCmdBuildClusterAccelerationStructureIndirectNV)load(context, \"vkCmdBuildClusterAccelerationStructureIndirectNV\");\n\ttable->vkGetClusterAccelerationStructureBuildSizesNV = (PFN_vkGetClusterAccelerationStructureBuildSizesNV)load(context, \"vkGetClusterAccelerationStructureBuildSizesNV\");\n#endif /* defined(VK_NV_cluster_acceleration_structure) */\n#if defined(VK_NV_cooperative_vector)\n\ttable->vkCmdConvertCooperativeVectorMatrixNV = (PFN_vkCmdConvertCooperativeVectorMatrixNV)load(context, \"vkCmdConvertCooperativeVectorMatrixNV\");\n\ttable->vkConvertCooperativeVectorMatrixNV = (PFN_vkConvertCooperativeVectorMatrixNV)load(context, \"vkConvertCooperativeVectorMatrixNV\");\n#endif /* defined(VK_NV_cooperative_vector) */\n#if defined(VK_NV_copy_memory_indirect)\n\ttable->vkCmdCopyMemoryIndirectNV = (PFN_vkCmdCopyMemoryIndirectNV)load(context, \"vkCmdCopyMemoryIndirectNV\");\n\ttable->vkCmdCopyMemoryToImageIndirectNV = (PFN_vkCmdCopyMemoryToImageIndirectNV)load(context, \"vkCmdCopyMemoryToImageIndirectNV\");\n#endif /* defined(VK_NV_copy_memory_indirect) */\n#if defined(VK_NV_cuda_kernel_launch)\n\ttable->vkCmdCudaLaunchKernelNV = (PFN_vkCmdCudaLaunchKernelNV)load(context, \"vkCmdCudaLaunchKernelNV\");\n\ttable->vkCreateCudaFunctionNV = (PFN_vkCreateCudaFunctionNV)load(context, \"vkCreateCudaFunctionNV\");\n\ttable->vkCreateCudaModuleNV = (PFN_vkCreateCudaModuleNV)load(context, \"vkCreateCudaModuleNV\");\n\ttable->vkDestroyCudaFunctionNV = (PFN_vkDestroyCudaFunctionNV)load(context, \"vkDestroyCudaFunctionNV\");\n\ttable->vkDestroyCudaModuleNV = (PFN_vkDestroyCudaModuleNV)load(context, \"vkDestroyCudaModuleNV\");\n\ttable->vkGetCudaModuleCacheNV = (PFN_vkGetCudaModuleCacheNV)load(context, \"vkGetCudaModuleCacheNV\");\n#endif /* defined(VK_NV_cuda_kernel_launch) */\n#if defined(VK_NV_device_diagnostic_checkpoints)\n\ttable->vkCmdSetCheckpointNV = (PFN_vkCmdSetCheckpointNV)load(context, \"vkCmdSetCheckpointNV\");\n\ttable->vkGetQueueCheckpointDataNV = (PFN_vkGetQueueCheckpointDataNV)load(context, \"vkGetQueueCheckpointDataNV\");\n#endif /* defined(VK_NV_device_diagnostic_checkpoints) */\n#if defined(VK_NV_device_diagnostic_checkpoints) && (defined(VK_VERSION_1_3) || defined(VK_KHR_synchronization2))\n\ttable->vkGetQueueCheckpointData2NV = (PFN_vkGetQueueCheckpointData2NV)load(context, \"vkGetQueueCheckpointData2NV\");\n#endif /* defined(VK_NV_device_diagnostic_checkpoints) && (defined(VK_VERSION_1_3) || defined(VK_KHR_synchronization2)) */\n#if defined(VK_NV_device_generated_commands)\n\ttable->vkCmdBindPipelineShaderGroupNV = (PFN_vkCmdBindPipelineShaderGroupNV)load(context, \"vkCmdBindPipelineShaderGroupNV\");\n\ttable->vkCmdExecuteGeneratedCommandsNV = (PFN_vkCmdExecuteGeneratedCommandsNV)load(context, \"vkCmdExecuteGeneratedCommandsNV\");\n\ttable->vkCmdPreprocessGeneratedCommandsNV = (PFN_vkCmdPreprocessGeneratedCommandsNV)load(context, \"vkCmdPreprocessGeneratedCommandsNV\");\n\ttable->vkCreateIndirectCommandsLayoutNV = (PFN_vkCreateIndirectCommandsLayoutNV)load(context, \"vkCreateIndirectCommandsLayoutNV\");\n\ttable->vkDestroyIndirectCommandsLayoutNV = (PFN_vkDestroyIndirectCommandsLayoutNV)load(context, \"vkDestroyIndirectCommandsLayoutNV\");\n\ttable->vkGetGeneratedCommandsMemoryRequirementsNV = (PFN_vkGetGeneratedCommandsMemoryRequirementsNV)load(context, \"vkGetGeneratedCommandsMemoryRequirementsNV\");\n#endif /* defined(VK_NV_device_generated_commands) */\n#if defined(VK_NV_device_generated_commands_compute)\n\ttable->vkCmdUpdatePipelineIndirectBufferNV = (PFN_vkCmdUpdatePipelineIndirectBufferNV)load(context, \"vkCmdUpdatePipelineIndirectBufferNV\");\n\ttable->vkGetPipelineIndirectDeviceAddressNV = (PFN_vkGetPipelineIndirectDeviceAddressNV)load(context, \"vkGetPipelineIndirectDeviceAddressNV\");\n\ttable->vkGetPipelineIndirectMemoryRequirementsNV = (PFN_vkGetPipelineIndirectMemoryRequirementsNV)load(context, \"vkGetPipelineIndirectMemoryRequirementsNV\");\n#endif /* defined(VK_NV_device_generated_commands_compute) */\n#if defined(VK_NV_external_memory_rdma)\n\ttable->vkGetMemoryRemoteAddressNV = (PFN_vkGetMemoryRemoteAddressNV)load(context, \"vkGetMemoryRemoteAddressNV\");\n#endif /* defined(VK_NV_external_memory_rdma) */\n#if defined(VK_NV_external_memory_win32)\n\ttable->vkGetMemoryWin32HandleNV = (PFN_vkGetMemoryWin32HandleNV)load(context, \"vkGetMemoryWin32HandleNV\");\n#endif /* defined(VK_NV_external_memory_win32) */\n#if defined(VK_NV_fragment_shading_rate_enums)\n\ttable->vkCmdSetFragmentShadingRateEnumNV = (PFN_vkCmdSetFragmentShadingRateEnumNV)load(context, \"vkCmdSetFragmentShadingRateEnumNV\");\n#endif /* defined(VK_NV_fragment_shading_rate_enums) */\n#if defined(VK_NV_low_latency2)\n\ttable->vkGetLatencyTimingsNV = (PFN_vkGetLatencyTimingsNV)load(context, \"vkGetLatencyTimingsNV\");\n\ttable->vkLatencySleepNV = (PFN_vkLatencySleepNV)load(context, \"vkLatencySleepNV\");\n\ttable->vkQueueNotifyOutOfBandNV = (PFN_vkQueueNotifyOutOfBandNV)load(context, \"vkQueueNotifyOutOfBandNV\");\n\ttable->vkSetLatencyMarkerNV = (PFN_vkSetLatencyMarkerNV)load(context, \"vkSetLatencyMarkerNV\");\n\ttable->vkSetLatencySleepModeNV = (PFN_vkSetLatencySleepModeNV)load(context, \"vkSetLatencySleepModeNV\");\n#endif /* defined(VK_NV_low_latency2) */\n#if defined(VK_NV_memory_decompression)\n\ttable->vkCmdDecompressMemoryIndirectCountNV = (PFN_vkCmdDecompressMemoryIndirectCountNV)load(context, \"vkCmdDecompressMemoryIndirectCountNV\");\n\ttable->vkCmdDecompressMemoryNV = (PFN_vkCmdDecompressMemoryNV)load(context, \"vkCmdDecompressMemoryNV\");\n#endif /* defined(VK_NV_memory_decompression) */\n#if defined(VK_NV_mesh_shader)\n\ttable->vkCmdDrawMeshTasksIndirectNV = (PFN_vkCmdDrawMeshTasksIndirectNV)load(context, \"vkCmdDrawMeshTasksIndirectNV\");\n\ttable->vkCmdDrawMeshTasksNV = (PFN_vkCmdDrawMeshTasksNV)load(context, \"vkCmdDrawMeshTasksNV\");\n#endif /* defined(VK_NV_mesh_shader) */\n#if defined(VK_NV_mesh_shader) && (defined(VK_KHR_draw_indirect_count) || defined(VK_VERSION_1_2))\n\ttable->vkCmdDrawMeshTasksIndirectCountNV = (PFN_vkCmdDrawMeshTasksIndirectCountNV)load(context, \"vkCmdDrawMeshTasksIndirectCountNV\");\n#endif /* defined(VK_NV_mesh_shader) && (defined(VK_KHR_draw_indirect_count) || defined(VK_VERSION_1_2)) */\n#if defined(VK_NV_optical_flow)\n\ttable->vkBindOpticalFlowSessionImageNV = (PFN_vkBindOpticalFlowSessionImageNV)load(context, \"vkBindOpticalFlowSessionImageNV\");\n\ttable->vkCmdOpticalFlowExecuteNV = (PFN_vkCmdOpticalFlowExecuteNV)load(context, \"vkCmdOpticalFlowExecuteNV\");\n\ttable->vkCreateOpticalFlowSessionNV = (PFN_vkCreateOpticalFlowSessionNV)load(context, \"vkCreateOpticalFlowSessionNV\");\n\ttable->vkDestroyOpticalFlowSessionNV = (PFN_vkDestroyOpticalFlowSessionNV)load(context, \"vkDestroyOpticalFlowSessionNV\");\n#endif /* defined(VK_NV_optical_flow) */\n#if defined(VK_NV_partitioned_acceleration_structure)\n\ttable->vkCmdBuildPartitionedAccelerationStructuresNV = (PFN_vkCmdBuildPartitionedAccelerationStructuresNV)load(context, \"vkCmdBuildPartitionedAccelerationStructuresNV\");\n\ttable->vkGetPartitionedAccelerationStructuresBuildSizesNV = (PFN_vkGetPartitionedAccelerationStructuresBuildSizesNV)load(context, \"vkGetPartitionedAccelerationStructuresBuildSizesNV\");\n#endif /* defined(VK_NV_partitioned_acceleration_structure) */\n#if defined(VK_NV_ray_tracing)\n\ttable->vkBindAccelerationStructureMemoryNV = (PFN_vkBindAccelerationStructureMemoryNV)load(context, \"vkBindAccelerationStructureMemoryNV\");\n\ttable->vkCmdBuildAccelerationStructureNV = (PFN_vkCmdBuildAccelerationStructureNV)load(context, \"vkCmdBuildAccelerationStructureNV\");\n\ttable->vkCmdCopyAccelerationStructureNV = (PFN_vkCmdCopyAccelerationStructureNV)load(context, \"vkCmdCopyAccelerationStructureNV\");\n\ttable->vkCmdTraceRaysNV = (PFN_vkCmdTraceRaysNV)load(context, \"vkCmdTraceRaysNV\");\n\ttable->vkCmdWriteAccelerationStructuresPropertiesNV = (PFN_vkCmdWriteAccelerationStructuresPropertiesNV)load(context, \"vkCmdWriteAccelerationStructuresPropertiesNV\");\n\ttable->vkCompileDeferredNV = (PFN_vkCompileDeferredNV)load(context, \"vkCompileDeferredNV\");\n\ttable->vkCreateAccelerationStructureNV = (PFN_vkCreateAccelerationStructureNV)load(context, \"vkCreateAccelerationStructureNV\");\n\ttable->vkCreateRayTracingPipelinesNV = (PFN_vkCreateRayTracingPipelinesNV)load(context, \"vkCreateRayTracingPipelinesNV\");\n\ttable->vkDestroyAccelerationStructureNV = (PFN_vkDestroyAccelerationStructureNV)load(context, \"vkDestroyAccelerationStructureNV\");\n\ttable->vkGetAccelerationStructureHandleNV = (PFN_vkGetAccelerationStructureHandleNV)load(context, \"vkGetAccelerationStructureHandleNV\");\n\ttable->vkGetAccelerationStructureMemoryRequirementsNV = (PFN_vkGetAccelerationStructureMemoryRequirementsNV)load(context, \"vkGetAccelerationStructureMemoryRequirementsNV\");\n\ttable->vkGetRayTracingShaderGroupHandlesNV = (PFN_vkGetRayTracingShaderGroupHandlesNV)load(context, \"vkGetRayTracingShaderGroupHandlesNV\");\n#endif /* defined(VK_NV_ray_tracing) */\n#if defined(VK_NV_scissor_exclusive) && VK_NV_SCISSOR_EXCLUSIVE_SPEC_VERSION >= 2\n\ttable->vkCmdSetExclusiveScissorEnableNV = (PFN_vkCmdSetExclusiveScissorEnableNV)load(context, \"vkCmdSetExclusiveScissorEnableNV\");\n#endif /* defined(VK_NV_scissor_exclusive) && VK_NV_SCISSOR_EXCLUSIVE_SPEC_VERSION >= 2 */\n#if defined(VK_NV_scissor_exclusive)\n\ttable->vkCmdSetExclusiveScissorNV = (PFN_vkCmdSetExclusiveScissorNV)load(context, \"vkCmdSetExclusiveScissorNV\");\n#endif /* defined(VK_NV_scissor_exclusive) */\n#if defined(VK_NV_shading_rate_image)\n\ttable->vkCmdBindShadingRateImageNV = (PFN_vkCmdBindShadingRateImageNV)load(context, \"vkCmdBindShadingRateImageNV\");\n\ttable->vkCmdSetCoarseSampleOrderNV = (PFN_vkCmdSetCoarseSampleOrderNV)load(context, \"vkCmdSetCoarseSampleOrderNV\");\n\ttable->vkCmdSetViewportShadingRatePaletteNV = (PFN_vkCmdSetViewportShadingRatePaletteNV)load(context, \"vkCmdSetViewportShadingRatePaletteNV\");\n#endif /* defined(VK_NV_shading_rate_image) */\n#if defined(VK_QCOM_tile_properties)\n\ttable->vkGetDynamicRenderingTilePropertiesQCOM = (PFN_vkGetDynamicRenderingTilePropertiesQCOM)load(context, \"vkGetDynamicRenderingTilePropertiesQCOM\");\n\ttable->vkGetFramebufferTilePropertiesQCOM = (PFN_vkGetFramebufferTilePropertiesQCOM)load(context, \"vkGetFramebufferTilePropertiesQCOM\");\n#endif /* defined(VK_QCOM_tile_properties) */\n#if defined(VK_QNX_external_memory_screen_buffer)\n\ttable->vkGetScreenBufferPropertiesQNX = (PFN_vkGetScreenBufferPropertiesQNX)load(context, \"vkGetScreenBufferPropertiesQNX\");\n#endif /* defined(VK_QNX_external_memory_screen_buffer) */\n#if defined(VK_VALVE_descriptor_set_host_mapping)\n\ttable->vkGetDescriptorSetHostMappingVALVE = (PFN_vkGetDescriptorSetHostMappingVALVE)load(context, \"vkGetDescriptorSetHostMappingVALVE\");\n\ttable->vkGetDescriptorSetLayoutHostMappingInfoVALVE = (PFN_vkGetDescriptorSetLayoutHostMappingInfoVALVE)load(context, \"vkGetDescriptorSetLayoutHostMappingInfoVALVE\");\n#endif /* defined(VK_VALVE_descriptor_set_host_mapping) */\n#if (defined(VK_EXT_depth_clamp_control)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clamp_control))\n\ttable->vkCmdSetDepthClampRangeEXT = (PFN_vkCmdSetDepthClampRangeEXT)load(context, \"vkCmdSetDepthClampRangeEXT\");\n#endif /* (defined(VK_EXT_depth_clamp_control)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clamp_control)) */\n#if (defined(VK_EXT_extended_dynamic_state)) || (defined(VK_EXT_shader_object))\n\ttable->vkCmdBindVertexBuffers2EXT = (PFN_vkCmdBindVertexBuffers2EXT)load(context, \"vkCmdBindVertexBuffers2EXT\");\n\ttable->vkCmdSetCullModeEXT = (PFN_vkCmdSetCullModeEXT)load(context, \"vkCmdSetCullModeEXT\");\n\ttable->vkCmdSetDepthBoundsTestEnableEXT = (PFN_vkCmdSetDepthBoundsTestEnableEXT)load(context, \"vkCmdSetDepthBoundsTestEnableEXT\");\n\ttable->vkCmdSetDepthCompareOpEXT = (PFN_vkCmdSetDepthCompareOpEXT)load(context, \"vkCmdSetDepthCompareOpEXT\");\n\ttable->vkCmdSetDepthTestEnableEXT = (PFN_vkCmdSetDepthTestEnableEXT)load(context, \"vkCmdSetDepthTestEnableEXT\");\n\ttable->vkCmdSetDepthWriteEnableEXT = (PFN_vkCmdSetDepthWriteEnableEXT)load(context, \"vkCmdSetDepthWriteEnableEXT\");\n\ttable->vkCmdSetFrontFaceEXT = (PFN_vkCmdSetFrontFaceEXT)load(context, \"vkCmdSetFrontFaceEXT\");\n\ttable->vkCmdSetPrimitiveTopologyEXT = (PFN_vkCmdSetPrimitiveTopologyEXT)load(context, \"vkCmdSetPrimitiveTopologyEXT\");\n\ttable->vkCmdSetScissorWithCountEXT = (PFN_vkCmdSetScissorWithCountEXT)load(context, \"vkCmdSetScissorWithCountEXT\");\n\ttable->vkCmdSetStencilOpEXT = (PFN_vkCmdSetStencilOpEXT)load(context, \"vkCmdSetStencilOpEXT\");\n\ttable->vkCmdSetStencilTestEnableEXT = (PFN_vkCmdSetStencilTestEnableEXT)load(context, \"vkCmdSetStencilTestEnableEXT\");\n\ttable->vkCmdSetViewportWithCountEXT = (PFN_vkCmdSetViewportWithCountEXT)load(context, \"vkCmdSetViewportWithCountEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state)) || (defined(VK_EXT_shader_object)) */\n#if (defined(VK_EXT_extended_dynamic_state2)) || (defined(VK_EXT_shader_object))\n\ttable->vkCmdSetDepthBiasEnableEXT = (PFN_vkCmdSetDepthBiasEnableEXT)load(context, \"vkCmdSetDepthBiasEnableEXT\");\n\ttable->vkCmdSetLogicOpEXT = (PFN_vkCmdSetLogicOpEXT)load(context, \"vkCmdSetLogicOpEXT\");\n\ttable->vkCmdSetPatchControlPointsEXT = (PFN_vkCmdSetPatchControlPointsEXT)load(context, \"vkCmdSetPatchControlPointsEXT\");\n\ttable->vkCmdSetPrimitiveRestartEnableEXT = (PFN_vkCmdSetPrimitiveRestartEnableEXT)load(context, \"vkCmdSetPrimitiveRestartEnableEXT\");\n\ttable->vkCmdSetRasterizerDiscardEnableEXT = (PFN_vkCmdSetRasterizerDiscardEnableEXT)load(context, \"vkCmdSetRasterizerDiscardEnableEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state2)) || (defined(VK_EXT_shader_object)) */\n#if (defined(VK_EXT_extended_dynamic_state3)) || (defined(VK_EXT_shader_object))\n\ttable->vkCmdSetAlphaToCoverageEnableEXT = (PFN_vkCmdSetAlphaToCoverageEnableEXT)load(context, \"vkCmdSetAlphaToCoverageEnableEXT\");\n\ttable->vkCmdSetAlphaToOneEnableEXT = (PFN_vkCmdSetAlphaToOneEnableEXT)load(context, \"vkCmdSetAlphaToOneEnableEXT\");\n\ttable->vkCmdSetColorBlendEnableEXT = (PFN_vkCmdSetColorBlendEnableEXT)load(context, \"vkCmdSetColorBlendEnableEXT\");\n\ttable->vkCmdSetColorBlendEquationEXT = (PFN_vkCmdSetColorBlendEquationEXT)load(context, \"vkCmdSetColorBlendEquationEXT\");\n\ttable->vkCmdSetColorWriteMaskEXT = (PFN_vkCmdSetColorWriteMaskEXT)load(context, \"vkCmdSetColorWriteMaskEXT\");\n\ttable->vkCmdSetDepthClampEnableEXT = (PFN_vkCmdSetDepthClampEnableEXT)load(context, \"vkCmdSetDepthClampEnableEXT\");\n\ttable->vkCmdSetLogicOpEnableEXT = (PFN_vkCmdSetLogicOpEnableEXT)load(context, \"vkCmdSetLogicOpEnableEXT\");\n\ttable->vkCmdSetPolygonModeEXT = (PFN_vkCmdSetPolygonModeEXT)load(context, \"vkCmdSetPolygonModeEXT\");\n\ttable->vkCmdSetRasterizationSamplesEXT = (PFN_vkCmdSetRasterizationSamplesEXT)load(context, \"vkCmdSetRasterizationSamplesEXT\");\n\ttable->vkCmdSetSampleMaskEXT = (PFN_vkCmdSetSampleMaskEXT)load(context, \"vkCmdSetSampleMaskEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3)) || (defined(VK_EXT_shader_object)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && (defined(VK_KHR_maintenance2) || defined(VK_VERSION_1_1))) || (defined(VK_EXT_shader_object))\n\ttable->vkCmdSetTessellationDomainOriginEXT = (PFN_vkCmdSetTessellationDomainOriginEXT)load(context, \"vkCmdSetTessellationDomainOriginEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && (defined(VK_KHR_maintenance2) || defined(VK_VERSION_1_1))) || (defined(VK_EXT_shader_object)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_transform_feedback)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_transform_feedback))\n\ttable->vkCmdSetRasterizationStreamEXT = (PFN_vkCmdSetRasterizationStreamEXT)load(context, \"vkCmdSetRasterizationStreamEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_transform_feedback)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_transform_feedback)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_conservative_rasterization)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_conservative_rasterization))\n\ttable->vkCmdSetConservativeRasterizationModeEXT = (PFN_vkCmdSetConservativeRasterizationModeEXT)load(context, \"vkCmdSetConservativeRasterizationModeEXT\");\n\ttable->vkCmdSetExtraPrimitiveOverestimationSizeEXT = (PFN_vkCmdSetExtraPrimitiveOverestimationSizeEXT)load(context, \"vkCmdSetExtraPrimitiveOverestimationSizeEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_conservative_rasterization)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_conservative_rasterization)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_depth_clip_enable)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clip_enable))\n\ttable->vkCmdSetDepthClipEnableEXT = (PFN_vkCmdSetDepthClipEnableEXT)load(context, \"vkCmdSetDepthClipEnableEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_depth_clip_enable)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clip_enable)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_sample_locations)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_sample_locations))\n\ttable->vkCmdSetSampleLocationsEnableEXT = (PFN_vkCmdSetSampleLocationsEnableEXT)load(context, \"vkCmdSetSampleLocationsEnableEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_sample_locations)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_sample_locations)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_blend_operation_advanced)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_blend_operation_advanced))\n\ttable->vkCmdSetColorBlendAdvancedEXT = (PFN_vkCmdSetColorBlendAdvancedEXT)load(context, \"vkCmdSetColorBlendAdvancedEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_blend_operation_advanced)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_blend_operation_advanced)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_provoking_vertex)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_provoking_vertex))\n\ttable->vkCmdSetProvokingVertexModeEXT = (PFN_vkCmdSetProvokingVertexModeEXT)load(context, \"vkCmdSetProvokingVertexModeEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_provoking_vertex)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_provoking_vertex)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_line_rasterization)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_line_rasterization))\n\ttable->vkCmdSetLineRasterizationModeEXT = (PFN_vkCmdSetLineRasterizationModeEXT)load(context, \"vkCmdSetLineRasterizationModeEXT\");\n\ttable->vkCmdSetLineStippleEnableEXT = (PFN_vkCmdSetLineStippleEnableEXT)load(context, \"vkCmdSetLineStippleEnableEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_line_rasterization)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_line_rasterization)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_depth_clip_control)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clip_control))\n\ttable->vkCmdSetDepthClipNegativeOneToOneEXT = (PFN_vkCmdSetDepthClipNegativeOneToOneEXT)load(context, \"vkCmdSetDepthClipNegativeOneToOneEXT\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_depth_clip_control)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clip_control)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_clip_space_w_scaling)) || (defined(VK_EXT_shader_object) && defined(VK_NV_clip_space_w_scaling))\n\ttable->vkCmdSetViewportWScalingEnableNV = (PFN_vkCmdSetViewportWScalingEnableNV)load(context, \"vkCmdSetViewportWScalingEnableNV\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_clip_space_w_scaling)) || (defined(VK_EXT_shader_object) && defined(VK_NV_clip_space_w_scaling)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_viewport_swizzle)) || (defined(VK_EXT_shader_object) && defined(VK_NV_viewport_swizzle))\n\ttable->vkCmdSetViewportSwizzleNV = (PFN_vkCmdSetViewportSwizzleNV)load(context, \"vkCmdSetViewportSwizzleNV\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_viewport_swizzle)) || (defined(VK_EXT_shader_object) && defined(VK_NV_viewport_swizzle)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_fragment_coverage_to_color)) || (defined(VK_EXT_shader_object) && defined(VK_NV_fragment_coverage_to_color))\n\ttable->vkCmdSetCoverageToColorEnableNV = (PFN_vkCmdSetCoverageToColorEnableNV)load(context, \"vkCmdSetCoverageToColorEnableNV\");\n\ttable->vkCmdSetCoverageToColorLocationNV = (PFN_vkCmdSetCoverageToColorLocationNV)load(context, \"vkCmdSetCoverageToColorLocationNV\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_fragment_coverage_to_color)) || (defined(VK_EXT_shader_object) && defined(VK_NV_fragment_coverage_to_color)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_framebuffer_mixed_samples)) || (defined(VK_EXT_shader_object) && defined(VK_NV_framebuffer_mixed_samples))\n\ttable->vkCmdSetCoverageModulationModeNV = (PFN_vkCmdSetCoverageModulationModeNV)load(context, \"vkCmdSetCoverageModulationModeNV\");\n\ttable->vkCmdSetCoverageModulationTableEnableNV = (PFN_vkCmdSetCoverageModulationTableEnableNV)load(context, \"vkCmdSetCoverageModulationTableEnableNV\");\n\ttable->vkCmdSetCoverageModulationTableNV = (PFN_vkCmdSetCoverageModulationTableNV)load(context, \"vkCmdSetCoverageModulationTableNV\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_framebuffer_mixed_samples)) || (defined(VK_EXT_shader_object) && defined(VK_NV_framebuffer_mixed_samples)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_shading_rate_image)) || (defined(VK_EXT_shader_object) && defined(VK_NV_shading_rate_image))\n\ttable->vkCmdSetShadingRateImageEnableNV = (PFN_vkCmdSetShadingRateImageEnableNV)load(context, \"vkCmdSetShadingRateImageEnableNV\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_shading_rate_image)) || (defined(VK_EXT_shader_object) && defined(VK_NV_shading_rate_image)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_representative_fragment_test)) || (defined(VK_EXT_shader_object) && defined(VK_NV_representative_fragment_test))\n\ttable->vkCmdSetRepresentativeFragmentTestEnableNV = (PFN_vkCmdSetRepresentativeFragmentTestEnableNV)load(context, \"vkCmdSetRepresentativeFragmentTestEnableNV\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_representative_fragment_test)) || (defined(VK_EXT_shader_object) && defined(VK_NV_representative_fragment_test)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_coverage_reduction_mode)) || (defined(VK_EXT_shader_object) && defined(VK_NV_coverage_reduction_mode))\n\ttable->vkCmdSetCoverageReductionModeNV = (PFN_vkCmdSetCoverageReductionModeNV)load(context, \"vkCmdSetCoverageReductionModeNV\");\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_coverage_reduction_mode)) || (defined(VK_EXT_shader_object) && defined(VK_NV_coverage_reduction_mode)) */\n#if (defined(VK_EXT_host_image_copy)) || (defined(VK_EXT_image_compression_control))\n\ttable->vkGetImageSubresourceLayout2EXT = (PFN_vkGetImageSubresourceLayout2EXT)load(context, \"vkGetImageSubresourceLayout2EXT\");\n#endif /* (defined(VK_EXT_host_image_copy)) || (defined(VK_EXT_image_compression_control)) */\n#if (defined(VK_EXT_shader_object)) || (defined(VK_EXT_vertex_input_dynamic_state))\n\ttable->vkCmdSetVertexInputEXT = (PFN_vkCmdSetVertexInputEXT)load(context, \"vkCmdSetVertexInputEXT\");\n#endif /* (defined(VK_EXT_shader_object)) || (defined(VK_EXT_vertex_input_dynamic_state)) */\n#if (defined(VK_KHR_descriptor_update_template) && defined(VK_KHR_push_descriptor)) || (defined(VK_KHR_push_descriptor) && (defined(VK_VERSION_1_1) || defined(VK_KHR_descriptor_update_template)))\n\ttable->vkCmdPushDescriptorSetWithTemplateKHR = (PFN_vkCmdPushDescriptorSetWithTemplateKHR)load(context, \"vkCmdPushDescriptorSetWithTemplateKHR\");\n#endif /* (defined(VK_KHR_descriptor_update_template) && defined(VK_KHR_push_descriptor)) || (defined(VK_KHR_push_descriptor) && (defined(VK_VERSION_1_1) || defined(VK_KHR_descriptor_update_template))) */\n#if (defined(VK_KHR_device_group) && defined(VK_KHR_surface)) || (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1))\n\ttable->vkGetDeviceGroupPresentCapabilitiesKHR = (PFN_vkGetDeviceGroupPresentCapabilitiesKHR)load(context, \"vkGetDeviceGroupPresentCapabilitiesKHR\");\n\ttable->vkGetDeviceGroupSurfacePresentModesKHR = (PFN_vkGetDeviceGroupSurfacePresentModesKHR)load(context, \"vkGetDeviceGroupSurfacePresentModesKHR\");\n#endif /* (defined(VK_KHR_device_group) && defined(VK_KHR_surface)) || (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1)) */\n#if (defined(VK_KHR_device_group) && defined(VK_KHR_swapchain)) || (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1))\n\ttable->vkAcquireNextImage2KHR = (PFN_vkAcquireNextImage2KHR)load(context, \"vkAcquireNextImage2KHR\");\n#endif /* (defined(VK_KHR_device_group) && defined(VK_KHR_swapchain)) || (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1)) */\n\t/* VOLK_GENERATE_LOAD_DEVICE_TABLE */\n}\n\n#ifdef __GNUC__\n#ifdef VOLK_DEFAULT_VISIBILITY\n#\tpragma GCC visibility push(default)\n#else\n#\tpragma GCC visibility push(hidden)\n#endif\n#endif\n\n/* VOLK_GENERATE_PROTOTYPES_C */\n#if defined(VK_VERSION_1_0)\nPFN_vkAllocateCommandBuffers vkAllocateCommandBuffers;\nPFN_vkAllocateDescriptorSets vkAllocateDescriptorSets;\nPFN_vkAllocateMemory vkAllocateMemory;\nPFN_vkBeginCommandBuffer vkBeginCommandBuffer;\nPFN_vkBindBufferMemory vkBindBufferMemory;\nPFN_vkBindImageMemory vkBindImageMemory;\nPFN_vkCmdBeginQuery vkCmdBeginQuery;\nPFN_vkCmdBeginRenderPass vkCmdBeginRenderPass;\nPFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets;\nPFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer;\nPFN_vkCmdBindPipeline vkCmdBindPipeline;\nPFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers;\nPFN_vkCmdBlitImage vkCmdBlitImage;\nPFN_vkCmdClearAttachments vkCmdClearAttachments;\nPFN_vkCmdClearColorImage vkCmdClearColorImage;\nPFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage;\nPFN_vkCmdCopyBuffer vkCmdCopyBuffer;\nPFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage;\nPFN_vkCmdCopyImage vkCmdCopyImage;\nPFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer;\nPFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults;\nPFN_vkCmdDispatch vkCmdDispatch;\nPFN_vkCmdDispatchIndirect vkCmdDispatchIndirect;\nPFN_vkCmdDraw vkCmdDraw;\nPFN_vkCmdDrawIndexed vkCmdDrawIndexed;\nPFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect;\nPFN_vkCmdDrawIndirect vkCmdDrawIndirect;\nPFN_vkCmdEndQuery vkCmdEndQuery;\nPFN_vkCmdEndRenderPass vkCmdEndRenderPass;\nPFN_vkCmdExecuteCommands vkCmdExecuteCommands;\nPFN_vkCmdFillBuffer vkCmdFillBuffer;\nPFN_vkCmdNextSubpass vkCmdNextSubpass;\nPFN_vkCmdPipelineBarrier vkCmdPipelineBarrier;\nPFN_vkCmdPushConstants vkCmdPushConstants;\nPFN_vkCmdResetEvent vkCmdResetEvent;\nPFN_vkCmdResetQueryPool vkCmdResetQueryPool;\nPFN_vkCmdResolveImage vkCmdResolveImage;\nPFN_vkCmdSetBlendConstants vkCmdSetBlendConstants;\nPFN_vkCmdSetDepthBias vkCmdSetDepthBias;\nPFN_vkCmdSetDepthBounds vkCmdSetDepthBounds;\nPFN_vkCmdSetEvent vkCmdSetEvent;\nPFN_vkCmdSetLineWidth vkCmdSetLineWidth;\nPFN_vkCmdSetScissor vkCmdSetScissor;\nPFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask;\nPFN_vkCmdSetStencilReference vkCmdSetStencilReference;\nPFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask;\nPFN_vkCmdSetViewport vkCmdSetViewport;\nPFN_vkCmdUpdateBuffer vkCmdUpdateBuffer;\nPFN_vkCmdWaitEvents vkCmdWaitEvents;\nPFN_vkCmdWriteTimestamp vkCmdWriteTimestamp;\nPFN_vkCreateBuffer vkCreateBuffer;\nPFN_vkCreateBufferView vkCreateBufferView;\nPFN_vkCreateCommandPool vkCreateCommandPool;\nPFN_vkCreateComputePipelines vkCreateComputePipelines;\nPFN_vkCreateDescriptorPool vkCreateDescriptorPool;\nPFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout;\nPFN_vkCreateDevice vkCreateDevice;\nPFN_vkCreateEvent vkCreateEvent;\nPFN_vkCreateFence vkCreateFence;\nPFN_vkCreateFramebuffer vkCreateFramebuffer;\nPFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines;\nPFN_vkCreateImage vkCreateImage;\nPFN_vkCreateImageView vkCreateImageView;\nPFN_vkCreateInstance vkCreateInstance;\nPFN_vkCreatePipelineCache vkCreatePipelineCache;\nPFN_vkCreatePipelineLayout vkCreatePipelineLayout;\nPFN_vkCreateQueryPool vkCreateQueryPool;\nPFN_vkCreateRenderPass vkCreateRenderPass;\nPFN_vkCreateSampler vkCreateSampler;\nPFN_vkCreateSemaphore vkCreateSemaphore;\nPFN_vkCreateShaderModule vkCreateShaderModule;\nPFN_vkDestroyBuffer vkDestroyBuffer;\nPFN_vkDestroyBufferView vkDestroyBufferView;\nPFN_vkDestroyCommandPool vkDestroyCommandPool;\nPFN_vkDestroyDescriptorPool vkDestroyDescriptorPool;\nPFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout;\nPFN_vkDestroyDevice vkDestroyDevice;\nPFN_vkDestroyEvent vkDestroyEvent;\nPFN_vkDestroyFence vkDestroyFence;\nPFN_vkDestroyFramebuffer vkDestroyFramebuffer;\nPFN_vkDestroyImage vkDestroyImage;\nPFN_vkDestroyImageView vkDestroyImageView;\nPFN_vkDestroyInstance vkDestroyInstance;\nPFN_vkDestroyPipeline vkDestroyPipeline;\nPFN_vkDestroyPipelineCache vkDestroyPipelineCache;\nPFN_vkDestroyPipelineLayout vkDestroyPipelineLayout;\nPFN_vkDestroyQueryPool vkDestroyQueryPool;\nPFN_vkDestroyRenderPass vkDestroyRenderPass;\nPFN_vkDestroySampler vkDestroySampler;\nPFN_vkDestroySemaphore vkDestroySemaphore;\nPFN_vkDestroyShaderModule vkDestroyShaderModule;\nPFN_vkDeviceWaitIdle vkDeviceWaitIdle;\nPFN_vkEndCommandBuffer vkEndCommandBuffer;\nPFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties;\nPFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties;\nPFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties;\nPFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties;\nPFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices;\nPFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges;\nPFN_vkFreeCommandBuffers vkFreeCommandBuffers;\nPFN_vkFreeDescriptorSets vkFreeDescriptorSets;\nPFN_vkFreeMemory vkFreeMemory;\nPFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements;\nPFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment;\nPFN_vkGetDeviceProcAddr vkGetDeviceProcAddr;\nPFN_vkGetDeviceQueue vkGetDeviceQueue;\nPFN_vkGetEventStatus vkGetEventStatus;\nPFN_vkGetFenceStatus vkGetFenceStatus;\nPFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements;\nPFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements;\nPFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout;\nPFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;\nPFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures;\nPFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties;\nPFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties;\nPFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties;\nPFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties;\nPFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties;\nPFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties;\nPFN_vkGetPipelineCacheData vkGetPipelineCacheData;\nPFN_vkGetQueryPoolResults vkGetQueryPoolResults;\nPFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity;\nPFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges;\nPFN_vkMapMemory vkMapMemory;\nPFN_vkMergePipelineCaches vkMergePipelineCaches;\nPFN_vkQueueBindSparse vkQueueBindSparse;\nPFN_vkQueueSubmit vkQueueSubmit;\nPFN_vkQueueWaitIdle vkQueueWaitIdle;\nPFN_vkResetCommandBuffer vkResetCommandBuffer;\nPFN_vkResetCommandPool vkResetCommandPool;\nPFN_vkResetDescriptorPool vkResetDescriptorPool;\nPFN_vkResetEvent vkResetEvent;\nPFN_vkResetFences vkResetFences;\nPFN_vkSetEvent vkSetEvent;\nPFN_vkUnmapMemory vkUnmapMemory;\nPFN_vkUpdateDescriptorSets vkUpdateDescriptorSets;\nPFN_vkWaitForFences vkWaitForFences;\n#endif /* defined(VK_VERSION_1_0) */\n#if defined(VK_VERSION_1_1)\nPFN_vkBindBufferMemory2 vkBindBufferMemory2;\nPFN_vkBindImageMemory2 vkBindImageMemory2;\nPFN_vkCmdDispatchBase vkCmdDispatchBase;\nPFN_vkCmdSetDeviceMask vkCmdSetDeviceMask;\nPFN_vkCreateDescriptorUpdateTemplate vkCreateDescriptorUpdateTemplate;\nPFN_vkCreateSamplerYcbcrConversion vkCreateSamplerYcbcrConversion;\nPFN_vkDestroyDescriptorUpdateTemplate vkDestroyDescriptorUpdateTemplate;\nPFN_vkDestroySamplerYcbcrConversion vkDestroySamplerYcbcrConversion;\nPFN_vkEnumerateInstanceVersion vkEnumerateInstanceVersion;\nPFN_vkEnumeratePhysicalDeviceGroups vkEnumeratePhysicalDeviceGroups;\nPFN_vkGetBufferMemoryRequirements2 vkGetBufferMemoryRequirements2;\nPFN_vkGetDescriptorSetLayoutSupport vkGetDescriptorSetLayoutSupport;\nPFN_vkGetDeviceGroupPeerMemoryFeatures vkGetDeviceGroupPeerMemoryFeatures;\nPFN_vkGetDeviceQueue2 vkGetDeviceQueue2;\nPFN_vkGetImageMemoryRequirements2 vkGetImageMemoryRequirements2;\nPFN_vkGetImageSparseMemoryRequirements2 vkGetImageSparseMemoryRequirements2;\nPFN_vkGetPhysicalDeviceExternalBufferProperties vkGetPhysicalDeviceExternalBufferProperties;\nPFN_vkGetPhysicalDeviceExternalFenceProperties vkGetPhysicalDeviceExternalFenceProperties;\nPFN_vkGetPhysicalDeviceExternalSemaphoreProperties vkGetPhysicalDeviceExternalSemaphoreProperties;\nPFN_vkGetPhysicalDeviceFeatures2 vkGetPhysicalDeviceFeatures2;\nPFN_vkGetPhysicalDeviceFormatProperties2 vkGetPhysicalDeviceFormatProperties2;\nPFN_vkGetPhysicalDeviceImageFormatProperties2 vkGetPhysicalDeviceImageFormatProperties2;\nPFN_vkGetPhysicalDeviceMemoryProperties2 vkGetPhysicalDeviceMemoryProperties2;\nPFN_vkGetPhysicalDeviceProperties2 vkGetPhysicalDeviceProperties2;\nPFN_vkGetPhysicalDeviceQueueFamilyProperties2 vkGetPhysicalDeviceQueueFamilyProperties2;\nPFN_vkGetPhysicalDeviceSparseImageFormatProperties2 vkGetPhysicalDeviceSparseImageFormatProperties2;\nPFN_vkTrimCommandPool vkTrimCommandPool;\nPFN_vkUpdateDescriptorSetWithTemplate vkUpdateDescriptorSetWithTemplate;\n#endif /* defined(VK_VERSION_1_1) */\n#if defined(VK_VERSION_1_2)\nPFN_vkCmdBeginRenderPass2 vkCmdBeginRenderPass2;\nPFN_vkCmdDrawIndexedIndirectCount vkCmdDrawIndexedIndirectCount;\nPFN_vkCmdDrawIndirectCount vkCmdDrawIndirectCount;\nPFN_vkCmdEndRenderPass2 vkCmdEndRenderPass2;\nPFN_vkCmdNextSubpass2 vkCmdNextSubpass2;\nPFN_vkCreateRenderPass2 vkCreateRenderPass2;\nPFN_vkGetBufferDeviceAddress vkGetBufferDeviceAddress;\nPFN_vkGetBufferOpaqueCaptureAddress vkGetBufferOpaqueCaptureAddress;\nPFN_vkGetDeviceMemoryOpaqueCaptureAddress vkGetDeviceMemoryOpaqueCaptureAddress;\nPFN_vkGetSemaphoreCounterValue vkGetSemaphoreCounterValue;\nPFN_vkResetQueryPool vkResetQueryPool;\nPFN_vkSignalSemaphore vkSignalSemaphore;\nPFN_vkWaitSemaphores vkWaitSemaphores;\n#endif /* defined(VK_VERSION_1_2) */\n#if defined(VK_VERSION_1_3)\nPFN_vkCmdBeginRendering vkCmdBeginRendering;\nPFN_vkCmdBindVertexBuffers2 vkCmdBindVertexBuffers2;\nPFN_vkCmdBlitImage2 vkCmdBlitImage2;\nPFN_vkCmdCopyBuffer2 vkCmdCopyBuffer2;\nPFN_vkCmdCopyBufferToImage2 vkCmdCopyBufferToImage2;\nPFN_vkCmdCopyImage2 vkCmdCopyImage2;\nPFN_vkCmdCopyImageToBuffer2 vkCmdCopyImageToBuffer2;\nPFN_vkCmdEndRendering vkCmdEndRendering;\nPFN_vkCmdPipelineBarrier2 vkCmdPipelineBarrier2;\nPFN_vkCmdResetEvent2 vkCmdResetEvent2;\nPFN_vkCmdResolveImage2 vkCmdResolveImage2;\nPFN_vkCmdSetCullMode vkCmdSetCullMode;\nPFN_vkCmdSetDepthBiasEnable vkCmdSetDepthBiasEnable;\nPFN_vkCmdSetDepthBoundsTestEnable vkCmdSetDepthBoundsTestEnable;\nPFN_vkCmdSetDepthCompareOp vkCmdSetDepthCompareOp;\nPFN_vkCmdSetDepthTestEnable vkCmdSetDepthTestEnable;\nPFN_vkCmdSetDepthWriteEnable vkCmdSetDepthWriteEnable;\nPFN_vkCmdSetEvent2 vkCmdSetEvent2;\nPFN_vkCmdSetFrontFace vkCmdSetFrontFace;\nPFN_vkCmdSetPrimitiveRestartEnable vkCmdSetPrimitiveRestartEnable;\nPFN_vkCmdSetPrimitiveTopology vkCmdSetPrimitiveTopology;\nPFN_vkCmdSetRasterizerDiscardEnable vkCmdSetRasterizerDiscardEnable;\nPFN_vkCmdSetScissorWithCount vkCmdSetScissorWithCount;\nPFN_vkCmdSetStencilOp vkCmdSetStencilOp;\nPFN_vkCmdSetStencilTestEnable vkCmdSetStencilTestEnable;\nPFN_vkCmdSetViewportWithCount vkCmdSetViewportWithCount;\nPFN_vkCmdWaitEvents2 vkCmdWaitEvents2;\nPFN_vkCmdWriteTimestamp2 vkCmdWriteTimestamp2;\nPFN_vkCreatePrivateDataSlot vkCreatePrivateDataSlot;\nPFN_vkDestroyPrivateDataSlot vkDestroyPrivateDataSlot;\nPFN_vkGetDeviceBufferMemoryRequirements vkGetDeviceBufferMemoryRequirements;\nPFN_vkGetDeviceImageMemoryRequirements vkGetDeviceImageMemoryRequirements;\nPFN_vkGetDeviceImageSparseMemoryRequirements vkGetDeviceImageSparseMemoryRequirements;\nPFN_vkGetPhysicalDeviceToolProperties vkGetPhysicalDeviceToolProperties;\nPFN_vkGetPrivateData vkGetPrivateData;\nPFN_vkQueueSubmit2 vkQueueSubmit2;\nPFN_vkSetPrivateData vkSetPrivateData;\n#endif /* defined(VK_VERSION_1_3) */\n#if defined(VK_VERSION_1_4)\nPFN_vkCmdBindDescriptorSets2 vkCmdBindDescriptorSets2;\nPFN_vkCmdBindIndexBuffer2 vkCmdBindIndexBuffer2;\nPFN_vkCmdPushConstants2 vkCmdPushConstants2;\nPFN_vkCmdPushDescriptorSet vkCmdPushDescriptorSet;\nPFN_vkCmdPushDescriptorSet2 vkCmdPushDescriptorSet2;\nPFN_vkCmdPushDescriptorSetWithTemplate vkCmdPushDescriptorSetWithTemplate;\nPFN_vkCmdPushDescriptorSetWithTemplate2 vkCmdPushDescriptorSetWithTemplate2;\nPFN_vkCmdSetLineStipple vkCmdSetLineStipple;\nPFN_vkCmdSetRenderingAttachmentLocations vkCmdSetRenderingAttachmentLocations;\nPFN_vkCmdSetRenderingInputAttachmentIndices vkCmdSetRenderingInputAttachmentIndices;\nPFN_vkCopyImageToImage vkCopyImageToImage;\nPFN_vkCopyImageToMemory vkCopyImageToMemory;\nPFN_vkCopyMemoryToImage vkCopyMemoryToImage;\nPFN_vkGetDeviceImageSubresourceLayout vkGetDeviceImageSubresourceLayout;\nPFN_vkGetImageSubresourceLayout2 vkGetImageSubresourceLayout2;\nPFN_vkGetRenderingAreaGranularity vkGetRenderingAreaGranularity;\nPFN_vkMapMemory2 vkMapMemory2;\nPFN_vkTransitionImageLayout vkTransitionImageLayout;\nPFN_vkUnmapMemory2 vkUnmapMemory2;\n#endif /* defined(VK_VERSION_1_4) */\n#if defined(VK_AMDX_shader_enqueue)\nPFN_vkCmdDispatchGraphAMDX vkCmdDispatchGraphAMDX;\nPFN_vkCmdDispatchGraphIndirectAMDX vkCmdDispatchGraphIndirectAMDX;\nPFN_vkCmdDispatchGraphIndirectCountAMDX vkCmdDispatchGraphIndirectCountAMDX;\nPFN_vkCmdInitializeGraphScratchMemoryAMDX vkCmdInitializeGraphScratchMemoryAMDX;\nPFN_vkCreateExecutionGraphPipelinesAMDX vkCreateExecutionGraphPipelinesAMDX;\nPFN_vkGetExecutionGraphPipelineNodeIndexAMDX vkGetExecutionGraphPipelineNodeIndexAMDX;\nPFN_vkGetExecutionGraphPipelineScratchSizeAMDX vkGetExecutionGraphPipelineScratchSizeAMDX;\n#endif /* defined(VK_AMDX_shader_enqueue) */\n#if defined(VK_AMD_anti_lag)\nPFN_vkAntiLagUpdateAMD vkAntiLagUpdateAMD;\n#endif /* defined(VK_AMD_anti_lag) */\n#if defined(VK_AMD_buffer_marker)\nPFN_vkCmdWriteBufferMarkerAMD vkCmdWriteBufferMarkerAMD;\n#endif /* defined(VK_AMD_buffer_marker) */\n#if defined(VK_AMD_buffer_marker) && (defined(VK_VERSION_1_3) || defined(VK_KHR_synchronization2))\nPFN_vkCmdWriteBufferMarker2AMD vkCmdWriteBufferMarker2AMD;\n#endif /* defined(VK_AMD_buffer_marker) && (defined(VK_VERSION_1_3) || defined(VK_KHR_synchronization2)) */\n#if defined(VK_AMD_display_native_hdr)\nPFN_vkSetLocalDimmingAMD vkSetLocalDimmingAMD;\n#endif /* defined(VK_AMD_display_native_hdr) */\n#if defined(VK_AMD_draw_indirect_count)\nPFN_vkCmdDrawIndexedIndirectCountAMD vkCmdDrawIndexedIndirectCountAMD;\nPFN_vkCmdDrawIndirectCountAMD vkCmdDrawIndirectCountAMD;\n#endif /* defined(VK_AMD_draw_indirect_count) */\n#if defined(VK_AMD_shader_info)\nPFN_vkGetShaderInfoAMD vkGetShaderInfoAMD;\n#endif /* defined(VK_AMD_shader_info) */\n#if defined(VK_ANDROID_external_memory_android_hardware_buffer)\nPFN_vkGetAndroidHardwareBufferPropertiesANDROID vkGetAndroidHardwareBufferPropertiesANDROID;\nPFN_vkGetMemoryAndroidHardwareBufferANDROID vkGetMemoryAndroidHardwareBufferANDROID;\n#endif /* defined(VK_ANDROID_external_memory_android_hardware_buffer) */\n#if defined(VK_EXT_acquire_drm_display)\nPFN_vkAcquireDrmDisplayEXT vkAcquireDrmDisplayEXT;\nPFN_vkGetDrmDisplayEXT vkGetDrmDisplayEXT;\n#endif /* defined(VK_EXT_acquire_drm_display) */\n#if defined(VK_EXT_acquire_xlib_display)\nPFN_vkAcquireXlibDisplayEXT vkAcquireXlibDisplayEXT;\nPFN_vkGetRandROutputDisplayEXT vkGetRandROutputDisplayEXT;\n#endif /* defined(VK_EXT_acquire_xlib_display) */\n#if defined(VK_EXT_attachment_feedback_loop_dynamic_state)\nPFN_vkCmdSetAttachmentFeedbackLoopEnableEXT vkCmdSetAttachmentFeedbackLoopEnableEXT;\n#endif /* defined(VK_EXT_attachment_feedback_loop_dynamic_state) */\n#if defined(VK_EXT_buffer_device_address)\nPFN_vkGetBufferDeviceAddressEXT vkGetBufferDeviceAddressEXT;\n#endif /* defined(VK_EXT_buffer_device_address) */\n#if defined(VK_EXT_calibrated_timestamps)\nPFN_vkGetCalibratedTimestampsEXT vkGetCalibratedTimestampsEXT;\nPFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT vkGetPhysicalDeviceCalibrateableTimeDomainsEXT;\n#endif /* defined(VK_EXT_calibrated_timestamps) */\n#if defined(VK_EXT_color_write_enable)\nPFN_vkCmdSetColorWriteEnableEXT vkCmdSetColorWriteEnableEXT;\n#endif /* defined(VK_EXT_color_write_enable) */\n#if defined(VK_EXT_conditional_rendering)\nPFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT;\nPFN_vkCmdEndConditionalRenderingEXT vkCmdEndConditionalRenderingEXT;\n#endif /* defined(VK_EXT_conditional_rendering) */\n#if defined(VK_EXT_debug_marker)\nPFN_vkCmdDebugMarkerBeginEXT vkCmdDebugMarkerBeginEXT;\nPFN_vkCmdDebugMarkerEndEXT vkCmdDebugMarkerEndEXT;\nPFN_vkCmdDebugMarkerInsertEXT vkCmdDebugMarkerInsertEXT;\nPFN_vkDebugMarkerSetObjectNameEXT vkDebugMarkerSetObjectNameEXT;\nPFN_vkDebugMarkerSetObjectTagEXT vkDebugMarkerSetObjectTagEXT;\n#endif /* defined(VK_EXT_debug_marker) */\n#if defined(VK_EXT_debug_report)\nPFN_vkCreateDebugReportCallbackEXT vkCreateDebugReportCallbackEXT;\nPFN_vkDebugReportMessageEXT vkDebugReportMessageEXT;\nPFN_vkDestroyDebugReportCallbackEXT vkDestroyDebugReportCallbackEXT;\n#endif /* defined(VK_EXT_debug_report) */\n#if defined(VK_EXT_debug_utils)\nPFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT;\nPFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT;\nPFN_vkCmdInsertDebugUtilsLabelEXT vkCmdInsertDebugUtilsLabelEXT;\nPFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT;\nPFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT;\nPFN_vkQueueBeginDebugUtilsLabelEXT vkQueueBeginDebugUtilsLabelEXT;\nPFN_vkQueueEndDebugUtilsLabelEXT vkQueueEndDebugUtilsLabelEXT;\nPFN_vkQueueInsertDebugUtilsLabelEXT vkQueueInsertDebugUtilsLabelEXT;\nPFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXT;\nPFN_vkSetDebugUtilsObjectTagEXT vkSetDebugUtilsObjectTagEXT;\nPFN_vkSubmitDebugUtilsMessageEXT vkSubmitDebugUtilsMessageEXT;\n#endif /* defined(VK_EXT_debug_utils) */\n#if defined(VK_EXT_depth_bias_control)\nPFN_vkCmdSetDepthBias2EXT vkCmdSetDepthBias2EXT;\n#endif /* defined(VK_EXT_depth_bias_control) */\n#if defined(VK_EXT_descriptor_buffer)\nPFN_vkCmdBindDescriptorBufferEmbeddedSamplersEXT vkCmdBindDescriptorBufferEmbeddedSamplersEXT;\nPFN_vkCmdBindDescriptorBuffersEXT vkCmdBindDescriptorBuffersEXT;\nPFN_vkCmdSetDescriptorBufferOffsetsEXT vkCmdSetDescriptorBufferOffsetsEXT;\nPFN_vkGetBufferOpaqueCaptureDescriptorDataEXT vkGetBufferOpaqueCaptureDescriptorDataEXT;\nPFN_vkGetDescriptorEXT vkGetDescriptorEXT;\nPFN_vkGetDescriptorSetLayoutBindingOffsetEXT vkGetDescriptorSetLayoutBindingOffsetEXT;\nPFN_vkGetDescriptorSetLayoutSizeEXT vkGetDescriptorSetLayoutSizeEXT;\nPFN_vkGetImageOpaqueCaptureDescriptorDataEXT vkGetImageOpaqueCaptureDescriptorDataEXT;\nPFN_vkGetImageViewOpaqueCaptureDescriptorDataEXT vkGetImageViewOpaqueCaptureDescriptorDataEXT;\nPFN_vkGetSamplerOpaqueCaptureDescriptorDataEXT vkGetSamplerOpaqueCaptureDescriptorDataEXT;\n#endif /* defined(VK_EXT_descriptor_buffer) */\n#if defined(VK_EXT_descriptor_buffer) && (defined(VK_KHR_acceleration_structure) || defined(VK_NV_ray_tracing))\nPFN_vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT;\n#endif /* defined(VK_EXT_descriptor_buffer) && (defined(VK_KHR_acceleration_structure) || defined(VK_NV_ray_tracing)) */\n#if defined(VK_EXT_device_fault)\nPFN_vkGetDeviceFaultInfoEXT vkGetDeviceFaultInfoEXT;\n#endif /* defined(VK_EXT_device_fault) */\n#if defined(VK_EXT_device_generated_commands)\nPFN_vkCmdExecuteGeneratedCommandsEXT vkCmdExecuteGeneratedCommandsEXT;\nPFN_vkCmdPreprocessGeneratedCommandsEXT vkCmdPreprocessGeneratedCommandsEXT;\nPFN_vkCreateIndirectCommandsLayoutEXT vkCreateIndirectCommandsLayoutEXT;\nPFN_vkCreateIndirectExecutionSetEXT vkCreateIndirectExecutionSetEXT;\nPFN_vkDestroyIndirectCommandsLayoutEXT vkDestroyIndirectCommandsLayoutEXT;\nPFN_vkDestroyIndirectExecutionSetEXT vkDestroyIndirectExecutionSetEXT;\nPFN_vkGetGeneratedCommandsMemoryRequirementsEXT vkGetGeneratedCommandsMemoryRequirementsEXT;\nPFN_vkUpdateIndirectExecutionSetPipelineEXT vkUpdateIndirectExecutionSetPipelineEXT;\nPFN_vkUpdateIndirectExecutionSetShaderEXT vkUpdateIndirectExecutionSetShaderEXT;\n#endif /* defined(VK_EXT_device_generated_commands) */\n#if defined(VK_EXT_direct_mode_display)\nPFN_vkReleaseDisplayEXT vkReleaseDisplayEXT;\n#endif /* defined(VK_EXT_direct_mode_display) */\n#if defined(VK_EXT_directfb_surface)\nPFN_vkCreateDirectFBSurfaceEXT vkCreateDirectFBSurfaceEXT;\nPFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT vkGetPhysicalDeviceDirectFBPresentationSupportEXT;\n#endif /* defined(VK_EXT_directfb_surface) */\n#if defined(VK_EXT_discard_rectangles)\nPFN_vkCmdSetDiscardRectangleEXT vkCmdSetDiscardRectangleEXT;\n#endif /* defined(VK_EXT_discard_rectangles) */\n#if defined(VK_EXT_discard_rectangles) && VK_EXT_DISCARD_RECTANGLES_SPEC_VERSION >= 2\nPFN_vkCmdSetDiscardRectangleEnableEXT vkCmdSetDiscardRectangleEnableEXT;\nPFN_vkCmdSetDiscardRectangleModeEXT vkCmdSetDiscardRectangleModeEXT;\n#endif /* defined(VK_EXT_discard_rectangles) && VK_EXT_DISCARD_RECTANGLES_SPEC_VERSION >= 2 */\n#if defined(VK_EXT_display_control)\nPFN_vkDisplayPowerControlEXT vkDisplayPowerControlEXT;\nPFN_vkGetSwapchainCounterEXT vkGetSwapchainCounterEXT;\nPFN_vkRegisterDeviceEventEXT vkRegisterDeviceEventEXT;\nPFN_vkRegisterDisplayEventEXT vkRegisterDisplayEventEXT;\n#endif /* defined(VK_EXT_display_control) */\n#if defined(VK_EXT_display_surface_counter)\nPFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT vkGetPhysicalDeviceSurfaceCapabilities2EXT;\n#endif /* defined(VK_EXT_display_surface_counter) */\n#if defined(VK_EXT_external_memory_host)\nPFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT;\n#endif /* defined(VK_EXT_external_memory_host) */\n#if defined(VK_EXT_external_memory_metal)\nPFN_vkGetMemoryMetalHandleEXT vkGetMemoryMetalHandleEXT;\nPFN_vkGetMemoryMetalHandlePropertiesEXT vkGetMemoryMetalHandlePropertiesEXT;\n#endif /* defined(VK_EXT_external_memory_metal) */\n#if defined(VK_EXT_full_screen_exclusive)\nPFN_vkAcquireFullScreenExclusiveModeEXT vkAcquireFullScreenExclusiveModeEXT;\nPFN_vkGetPhysicalDeviceSurfacePresentModes2EXT vkGetPhysicalDeviceSurfacePresentModes2EXT;\nPFN_vkReleaseFullScreenExclusiveModeEXT vkReleaseFullScreenExclusiveModeEXT;\n#endif /* defined(VK_EXT_full_screen_exclusive) */\n#if defined(VK_EXT_full_screen_exclusive) && (defined(VK_KHR_device_group) || defined(VK_VERSION_1_1))\nPFN_vkGetDeviceGroupSurfacePresentModes2EXT vkGetDeviceGroupSurfacePresentModes2EXT;\n#endif /* defined(VK_EXT_full_screen_exclusive) && (defined(VK_KHR_device_group) || defined(VK_VERSION_1_1)) */\n#if defined(VK_EXT_hdr_metadata)\nPFN_vkSetHdrMetadataEXT vkSetHdrMetadataEXT;\n#endif /* defined(VK_EXT_hdr_metadata) */\n#if defined(VK_EXT_headless_surface)\nPFN_vkCreateHeadlessSurfaceEXT vkCreateHeadlessSurfaceEXT;\n#endif /* defined(VK_EXT_headless_surface) */\n#if defined(VK_EXT_host_image_copy)\nPFN_vkCopyImageToImageEXT vkCopyImageToImageEXT;\nPFN_vkCopyImageToMemoryEXT vkCopyImageToMemoryEXT;\nPFN_vkCopyMemoryToImageEXT vkCopyMemoryToImageEXT;\nPFN_vkTransitionImageLayoutEXT vkTransitionImageLayoutEXT;\n#endif /* defined(VK_EXT_host_image_copy) */\n#if defined(VK_EXT_host_query_reset)\nPFN_vkResetQueryPoolEXT vkResetQueryPoolEXT;\n#endif /* defined(VK_EXT_host_query_reset) */\n#if defined(VK_EXT_image_drm_format_modifier)\nPFN_vkGetImageDrmFormatModifierPropertiesEXT vkGetImageDrmFormatModifierPropertiesEXT;\n#endif /* defined(VK_EXT_image_drm_format_modifier) */\n#if defined(VK_EXT_line_rasterization)\nPFN_vkCmdSetLineStippleEXT vkCmdSetLineStippleEXT;\n#endif /* defined(VK_EXT_line_rasterization) */\n#if defined(VK_EXT_mesh_shader)\nPFN_vkCmdDrawMeshTasksEXT vkCmdDrawMeshTasksEXT;\nPFN_vkCmdDrawMeshTasksIndirectEXT vkCmdDrawMeshTasksIndirectEXT;\n#endif /* defined(VK_EXT_mesh_shader) */\n#if defined(VK_EXT_mesh_shader) && (defined(VK_KHR_draw_indirect_count) || defined(VK_VERSION_1_2))\nPFN_vkCmdDrawMeshTasksIndirectCountEXT vkCmdDrawMeshTasksIndirectCountEXT;\n#endif /* defined(VK_EXT_mesh_shader) && (defined(VK_KHR_draw_indirect_count) || defined(VK_VERSION_1_2)) */\n#if defined(VK_EXT_metal_objects)\nPFN_vkExportMetalObjectsEXT vkExportMetalObjectsEXT;\n#endif /* defined(VK_EXT_metal_objects) */\n#if defined(VK_EXT_metal_surface)\nPFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT;\n#endif /* defined(VK_EXT_metal_surface) */\n#if defined(VK_EXT_multi_draw)\nPFN_vkCmdDrawMultiEXT vkCmdDrawMultiEXT;\nPFN_vkCmdDrawMultiIndexedEXT vkCmdDrawMultiIndexedEXT;\n#endif /* defined(VK_EXT_multi_draw) */\n#if defined(VK_EXT_opacity_micromap)\nPFN_vkBuildMicromapsEXT vkBuildMicromapsEXT;\nPFN_vkCmdBuildMicromapsEXT vkCmdBuildMicromapsEXT;\nPFN_vkCmdCopyMemoryToMicromapEXT vkCmdCopyMemoryToMicromapEXT;\nPFN_vkCmdCopyMicromapEXT vkCmdCopyMicromapEXT;\nPFN_vkCmdCopyMicromapToMemoryEXT vkCmdCopyMicromapToMemoryEXT;\nPFN_vkCmdWriteMicromapsPropertiesEXT vkCmdWriteMicromapsPropertiesEXT;\nPFN_vkCopyMemoryToMicromapEXT vkCopyMemoryToMicromapEXT;\nPFN_vkCopyMicromapEXT vkCopyMicromapEXT;\nPFN_vkCopyMicromapToMemoryEXT vkCopyMicromapToMemoryEXT;\nPFN_vkCreateMicromapEXT vkCreateMicromapEXT;\nPFN_vkDestroyMicromapEXT vkDestroyMicromapEXT;\nPFN_vkGetDeviceMicromapCompatibilityEXT vkGetDeviceMicromapCompatibilityEXT;\nPFN_vkGetMicromapBuildSizesEXT vkGetMicromapBuildSizesEXT;\nPFN_vkWriteMicromapsPropertiesEXT vkWriteMicromapsPropertiesEXT;\n#endif /* defined(VK_EXT_opacity_micromap) */\n#if defined(VK_EXT_pageable_device_local_memory)\nPFN_vkSetDeviceMemoryPriorityEXT vkSetDeviceMemoryPriorityEXT;\n#endif /* defined(VK_EXT_pageable_device_local_memory) */\n#if defined(VK_EXT_pipeline_properties)\nPFN_vkGetPipelinePropertiesEXT vkGetPipelinePropertiesEXT;\n#endif /* defined(VK_EXT_pipeline_properties) */\n#if defined(VK_EXT_private_data)\nPFN_vkCreatePrivateDataSlotEXT vkCreatePrivateDataSlotEXT;\nPFN_vkDestroyPrivateDataSlotEXT vkDestroyPrivateDataSlotEXT;\nPFN_vkGetPrivateDataEXT vkGetPrivateDataEXT;\nPFN_vkSetPrivateDataEXT vkSetPrivateDataEXT;\n#endif /* defined(VK_EXT_private_data) */\n#if defined(VK_EXT_sample_locations)\nPFN_vkCmdSetSampleLocationsEXT vkCmdSetSampleLocationsEXT;\nPFN_vkGetPhysicalDeviceMultisamplePropertiesEXT vkGetPhysicalDeviceMultisamplePropertiesEXT;\n#endif /* defined(VK_EXT_sample_locations) */\n#if defined(VK_EXT_shader_module_identifier)\nPFN_vkGetShaderModuleCreateInfoIdentifierEXT vkGetShaderModuleCreateInfoIdentifierEXT;\nPFN_vkGetShaderModuleIdentifierEXT vkGetShaderModuleIdentifierEXT;\n#endif /* defined(VK_EXT_shader_module_identifier) */\n#if defined(VK_EXT_shader_object)\nPFN_vkCmdBindShadersEXT vkCmdBindShadersEXT;\nPFN_vkCreateShadersEXT vkCreateShadersEXT;\nPFN_vkDestroyShaderEXT vkDestroyShaderEXT;\nPFN_vkGetShaderBinaryDataEXT vkGetShaderBinaryDataEXT;\n#endif /* defined(VK_EXT_shader_object) */\n#if defined(VK_EXT_swapchain_maintenance1)\nPFN_vkReleaseSwapchainImagesEXT vkReleaseSwapchainImagesEXT;\n#endif /* defined(VK_EXT_swapchain_maintenance1) */\n#if defined(VK_EXT_tooling_info)\nPFN_vkGetPhysicalDeviceToolPropertiesEXT vkGetPhysicalDeviceToolPropertiesEXT;\n#endif /* defined(VK_EXT_tooling_info) */\n#if defined(VK_EXT_transform_feedback)\nPFN_vkCmdBeginQueryIndexedEXT vkCmdBeginQueryIndexedEXT;\nPFN_vkCmdBeginTransformFeedbackEXT vkCmdBeginTransformFeedbackEXT;\nPFN_vkCmdBindTransformFeedbackBuffersEXT vkCmdBindTransformFeedbackBuffersEXT;\nPFN_vkCmdDrawIndirectByteCountEXT vkCmdDrawIndirectByteCountEXT;\nPFN_vkCmdEndQueryIndexedEXT vkCmdEndQueryIndexedEXT;\nPFN_vkCmdEndTransformFeedbackEXT vkCmdEndTransformFeedbackEXT;\n#endif /* defined(VK_EXT_transform_feedback) */\n#if defined(VK_EXT_validation_cache)\nPFN_vkCreateValidationCacheEXT vkCreateValidationCacheEXT;\nPFN_vkDestroyValidationCacheEXT vkDestroyValidationCacheEXT;\nPFN_vkGetValidationCacheDataEXT vkGetValidationCacheDataEXT;\nPFN_vkMergeValidationCachesEXT vkMergeValidationCachesEXT;\n#endif /* defined(VK_EXT_validation_cache) */\n#if defined(VK_FUCHSIA_buffer_collection)\nPFN_vkCreateBufferCollectionFUCHSIA vkCreateBufferCollectionFUCHSIA;\nPFN_vkDestroyBufferCollectionFUCHSIA vkDestroyBufferCollectionFUCHSIA;\nPFN_vkGetBufferCollectionPropertiesFUCHSIA vkGetBufferCollectionPropertiesFUCHSIA;\nPFN_vkSetBufferCollectionBufferConstraintsFUCHSIA vkSetBufferCollectionBufferConstraintsFUCHSIA;\nPFN_vkSetBufferCollectionImageConstraintsFUCHSIA vkSetBufferCollectionImageConstraintsFUCHSIA;\n#endif /* defined(VK_FUCHSIA_buffer_collection) */\n#if defined(VK_FUCHSIA_external_memory)\nPFN_vkGetMemoryZirconHandleFUCHSIA vkGetMemoryZirconHandleFUCHSIA;\nPFN_vkGetMemoryZirconHandlePropertiesFUCHSIA vkGetMemoryZirconHandlePropertiesFUCHSIA;\n#endif /* defined(VK_FUCHSIA_external_memory) */\n#if defined(VK_FUCHSIA_external_semaphore)\nPFN_vkGetSemaphoreZirconHandleFUCHSIA vkGetSemaphoreZirconHandleFUCHSIA;\nPFN_vkImportSemaphoreZirconHandleFUCHSIA vkImportSemaphoreZirconHandleFUCHSIA;\n#endif /* defined(VK_FUCHSIA_external_semaphore) */\n#if defined(VK_FUCHSIA_imagepipe_surface)\nPFN_vkCreateImagePipeSurfaceFUCHSIA vkCreateImagePipeSurfaceFUCHSIA;\n#endif /* defined(VK_FUCHSIA_imagepipe_surface) */\n#if defined(VK_GGP_stream_descriptor_surface)\nPFN_vkCreateStreamDescriptorSurfaceGGP vkCreateStreamDescriptorSurfaceGGP;\n#endif /* defined(VK_GGP_stream_descriptor_surface) */\n#if defined(VK_GOOGLE_display_timing)\nPFN_vkGetPastPresentationTimingGOOGLE vkGetPastPresentationTimingGOOGLE;\nPFN_vkGetRefreshCycleDurationGOOGLE vkGetRefreshCycleDurationGOOGLE;\n#endif /* defined(VK_GOOGLE_display_timing) */\n#if defined(VK_HUAWEI_cluster_culling_shader)\nPFN_vkCmdDrawClusterHUAWEI vkCmdDrawClusterHUAWEI;\nPFN_vkCmdDrawClusterIndirectHUAWEI vkCmdDrawClusterIndirectHUAWEI;\n#endif /* defined(VK_HUAWEI_cluster_culling_shader) */\n#if defined(VK_HUAWEI_invocation_mask)\nPFN_vkCmdBindInvocationMaskHUAWEI vkCmdBindInvocationMaskHUAWEI;\n#endif /* defined(VK_HUAWEI_invocation_mask) */\n#if defined(VK_HUAWEI_subpass_shading) && VK_HUAWEI_SUBPASS_SHADING_SPEC_VERSION >= 2\nPFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI;\n#endif /* defined(VK_HUAWEI_subpass_shading) && VK_HUAWEI_SUBPASS_SHADING_SPEC_VERSION >= 2 */\n#if defined(VK_HUAWEI_subpass_shading)\nPFN_vkCmdSubpassShadingHUAWEI vkCmdSubpassShadingHUAWEI;\n#endif /* defined(VK_HUAWEI_subpass_shading) */\n#if defined(VK_INTEL_performance_query)\nPFN_vkAcquirePerformanceConfigurationINTEL vkAcquirePerformanceConfigurationINTEL;\nPFN_vkCmdSetPerformanceMarkerINTEL vkCmdSetPerformanceMarkerINTEL;\nPFN_vkCmdSetPerformanceOverrideINTEL vkCmdSetPerformanceOverrideINTEL;\nPFN_vkCmdSetPerformanceStreamMarkerINTEL vkCmdSetPerformanceStreamMarkerINTEL;\nPFN_vkGetPerformanceParameterINTEL vkGetPerformanceParameterINTEL;\nPFN_vkInitializePerformanceApiINTEL vkInitializePerformanceApiINTEL;\nPFN_vkQueueSetPerformanceConfigurationINTEL vkQueueSetPerformanceConfigurationINTEL;\nPFN_vkReleasePerformanceConfigurationINTEL vkReleasePerformanceConfigurationINTEL;\nPFN_vkUninitializePerformanceApiINTEL vkUninitializePerformanceApiINTEL;\n#endif /* defined(VK_INTEL_performance_query) */\n#if defined(VK_KHR_acceleration_structure)\nPFN_vkBuildAccelerationStructuresKHR vkBuildAccelerationStructuresKHR;\nPFN_vkCmdBuildAccelerationStructuresIndirectKHR vkCmdBuildAccelerationStructuresIndirectKHR;\nPFN_vkCmdBuildAccelerationStructuresKHR vkCmdBuildAccelerationStructuresKHR;\nPFN_vkCmdCopyAccelerationStructureKHR vkCmdCopyAccelerationStructureKHR;\nPFN_vkCmdCopyAccelerationStructureToMemoryKHR vkCmdCopyAccelerationStructureToMemoryKHR;\nPFN_vkCmdCopyMemoryToAccelerationStructureKHR vkCmdCopyMemoryToAccelerationStructureKHR;\nPFN_vkCmdWriteAccelerationStructuresPropertiesKHR vkCmdWriteAccelerationStructuresPropertiesKHR;\nPFN_vkCopyAccelerationStructureKHR vkCopyAccelerationStructureKHR;\nPFN_vkCopyAccelerationStructureToMemoryKHR vkCopyAccelerationStructureToMemoryKHR;\nPFN_vkCopyMemoryToAccelerationStructureKHR vkCopyMemoryToAccelerationStructureKHR;\nPFN_vkCreateAccelerationStructureKHR vkCreateAccelerationStructureKHR;\nPFN_vkDestroyAccelerationStructureKHR vkDestroyAccelerationStructureKHR;\nPFN_vkGetAccelerationStructureBuildSizesKHR vkGetAccelerationStructureBuildSizesKHR;\nPFN_vkGetAccelerationStructureDeviceAddressKHR vkGetAccelerationStructureDeviceAddressKHR;\nPFN_vkGetDeviceAccelerationStructureCompatibilityKHR vkGetDeviceAccelerationStructureCompatibilityKHR;\nPFN_vkWriteAccelerationStructuresPropertiesKHR vkWriteAccelerationStructuresPropertiesKHR;\n#endif /* defined(VK_KHR_acceleration_structure) */\n#if defined(VK_KHR_android_surface)\nPFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR;\n#endif /* defined(VK_KHR_android_surface) */\n#if defined(VK_KHR_bind_memory2)\nPFN_vkBindBufferMemory2KHR vkBindBufferMemory2KHR;\nPFN_vkBindImageMemory2KHR vkBindImageMemory2KHR;\n#endif /* defined(VK_KHR_bind_memory2) */\n#if defined(VK_KHR_buffer_device_address)\nPFN_vkGetBufferDeviceAddressKHR vkGetBufferDeviceAddressKHR;\nPFN_vkGetBufferOpaqueCaptureAddressKHR vkGetBufferOpaqueCaptureAddressKHR;\nPFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR vkGetDeviceMemoryOpaqueCaptureAddressKHR;\n#endif /* defined(VK_KHR_buffer_device_address) */\n#if defined(VK_KHR_calibrated_timestamps)\nPFN_vkGetCalibratedTimestampsKHR vkGetCalibratedTimestampsKHR;\nPFN_vkGetPhysicalDeviceCalibrateableTimeDomainsKHR vkGetPhysicalDeviceCalibrateableTimeDomainsKHR;\n#endif /* defined(VK_KHR_calibrated_timestamps) */\n#if defined(VK_KHR_cooperative_matrix)\nPFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR;\n#endif /* defined(VK_KHR_cooperative_matrix) */\n#if defined(VK_KHR_copy_commands2)\nPFN_vkCmdBlitImage2KHR vkCmdBlitImage2KHR;\nPFN_vkCmdCopyBuffer2KHR vkCmdCopyBuffer2KHR;\nPFN_vkCmdCopyBufferToImage2KHR vkCmdCopyBufferToImage2KHR;\nPFN_vkCmdCopyImage2KHR vkCmdCopyImage2KHR;\nPFN_vkCmdCopyImageToBuffer2KHR vkCmdCopyImageToBuffer2KHR;\nPFN_vkCmdResolveImage2KHR vkCmdResolveImage2KHR;\n#endif /* defined(VK_KHR_copy_commands2) */\n#if defined(VK_KHR_create_renderpass2)\nPFN_vkCmdBeginRenderPass2KHR vkCmdBeginRenderPass2KHR;\nPFN_vkCmdEndRenderPass2KHR vkCmdEndRenderPass2KHR;\nPFN_vkCmdNextSubpass2KHR vkCmdNextSubpass2KHR;\nPFN_vkCreateRenderPass2KHR vkCreateRenderPass2KHR;\n#endif /* defined(VK_KHR_create_renderpass2) */\n#if defined(VK_KHR_deferred_host_operations)\nPFN_vkCreateDeferredOperationKHR vkCreateDeferredOperationKHR;\nPFN_vkDeferredOperationJoinKHR vkDeferredOperationJoinKHR;\nPFN_vkDestroyDeferredOperationKHR vkDestroyDeferredOperationKHR;\nPFN_vkGetDeferredOperationMaxConcurrencyKHR vkGetDeferredOperationMaxConcurrencyKHR;\nPFN_vkGetDeferredOperationResultKHR vkGetDeferredOperationResultKHR;\n#endif /* defined(VK_KHR_deferred_host_operations) */\n#if defined(VK_KHR_descriptor_update_template)\nPFN_vkCreateDescriptorUpdateTemplateKHR vkCreateDescriptorUpdateTemplateKHR;\nPFN_vkDestroyDescriptorUpdateTemplateKHR vkDestroyDescriptorUpdateTemplateKHR;\nPFN_vkUpdateDescriptorSetWithTemplateKHR vkUpdateDescriptorSetWithTemplateKHR;\n#endif /* defined(VK_KHR_descriptor_update_template) */\n#if defined(VK_KHR_device_group)\nPFN_vkCmdDispatchBaseKHR vkCmdDispatchBaseKHR;\nPFN_vkCmdSetDeviceMaskKHR vkCmdSetDeviceMaskKHR;\nPFN_vkGetDeviceGroupPeerMemoryFeaturesKHR vkGetDeviceGroupPeerMemoryFeaturesKHR;\n#endif /* defined(VK_KHR_device_group) */\n#if defined(VK_KHR_device_group_creation)\nPFN_vkEnumeratePhysicalDeviceGroupsKHR vkEnumeratePhysicalDeviceGroupsKHR;\n#endif /* defined(VK_KHR_device_group_creation) */\n#if defined(VK_KHR_display)\nPFN_vkCreateDisplayModeKHR vkCreateDisplayModeKHR;\nPFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR;\nPFN_vkGetDisplayModePropertiesKHR vkGetDisplayModePropertiesKHR;\nPFN_vkGetDisplayPlaneCapabilitiesKHR vkGetDisplayPlaneCapabilitiesKHR;\nPFN_vkGetDisplayPlaneSupportedDisplaysKHR vkGetDisplayPlaneSupportedDisplaysKHR;\nPFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR vkGetPhysicalDeviceDisplayPlanePropertiesKHR;\nPFN_vkGetPhysicalDeviceDisplayPropertiesKHR vkGetPhysicalDeviceDisplayPropertiesKHR;\n#endif /* defined(VK_KHR_display) */\n#if defined(VK_KHR_display_swapchain)\nPFN_vkCreateSharedSwapchainsKHR vkCreateSharedSwapchainsKHR;\n#endif /* defined(VK_KHR_display_swapchain) */\n#if defined(VK_KHR_draw_indirect_count)\nPFN_vkCmdDrawIndexedIndirectCountKHR vkCmdDrawIndexedIndirectCountKHR;\nPFN_vkCmdDrawIndirectCountKHR vkCmdDrawIndirectCountKHR;\n#endif /* defined(VK_KHR_draw_indirect_count) */\n#if defined(VK_KHR_dynamic_rendering)\nPFN_vkCmdBeginRenderingKHR vkCmdBeginRenderingKHR;\nPFN_vkCmdEndRenderingKHR vkCmdEndRenderingKHR;\n#endif /* defined(VK_KHR_dynamic_rendering) */\n#if defined(VK_KHR_dynamic_rendering_local_read)\nPFN_vkCmdSetRenderingAttachmentLocationsKHR vkCmdSetRenderingAttachmentLocationsKHR;\nPFN_vkCmdSetRenderingInputAttachmentIndicesKHR vkCmdSetRenderingInputAttachmentIndicesKHR;\n#endif /* defined(VK_KHR_dynamic_rendering_local_read) */\n#if defined(VK_KHR_external_fence_capabilities)\nPFN_vkGetPhysicalDeviceExternalFencePropertiesKHR vkGetPhysicalDeviceExternalFencePropertiesKHR;\n#endif /* defined(VK_KHR_external_fence_capabilities) */\n#if defined(VK_KHR_external_fence_fd)\nPFN_vkGetFenceFdKHR vkGetFenceFdKHR;\nPFN_vkImportFenceFdKHR vkImportFenceFdKHR;\n#endif /* defined(VK_KHR_external_fence_fd) */\n#if defined(VK_KHR_external_fence_win32)\nPFN_vkGetFenceWin32HandleKHR vkGetFenceWin32HandleKHR;\nPFN_vkImportFenceWin32HandleKHR vkImportFenceWin32HandleKHR;\n#endif /* defined(VK_KHR_external_fence_win32) */\n#if defined(VK_KHR_external_memory_capabilities)\nPFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR vkGetPhysicalDeviceExternalBufferPropertiesKHR;\n#endif /* defined(VK_KHR_external_memory_capabilities) */\n#if defined(VK_KHR_external_memory_fd)\nPFN_vkGetMemoryFdKHR vkGetMemoryFdKHR;\nPFN_vkGetMemoryFdPropertiesKHR vkGetMemoryFdPropertiesKHR;\n#endif /* defined(VK_KHR_external_memory_fd) */\n#if defined(VK_KHR_external_memory_win32)\nPFN_vkGetMemoryWin32HandleKHR vkGetMemoryWin32HandleKHR;\nPFN_vkGetMemoryWin32HandlePropertiesKHR vkGetMemoryWin32HandlePropertiesKHR;\n#endif /* defined(VK_KHR_external_memory_win32) */\n#if defined(VK_KHR_external_semaphore_capabilities)\nPFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR vkGetPhysicalDeviceExternalSemaphorePropertiesKHR;\n#endif /* defined(VK_KHR_external_semaphore_capabilities) */\n#if defined(VK_KHR_external_semaphore_fd)\nPFN_vkGetSemaphoreFdKHR vkGetSemaphoreFdKHR;\nPFN_vkImportSemaphoreFdKHR vkImportSemaphoreFdKHR;\n#endif /* defined(VK_KHR_external_semaphore_fd) */\n#if defined(VK_KHR_external_semaphore_win32)\nPFN_vkGetSemaphoreWin32HandleKHR vkGetSemaphoreWin32HandleKHR;\nPFN_vkImportSemaphoreWin32HandleKHR vkImportSemaphoreWin32HandleKHR;\n#endif /* defined(VK_KHR_external_semaphore_win32) */\n#if defined(VK_KHR_fragment_shading_rate)\nPFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR;\nPFN_vkGetPhysicalDeviceFragmentShadingRatesKHR vkGetPhysicalDeviceFragmentShadingRatesKHR;\n#endif /* defined(VK_KHR_fragment_shading_rate) */\n#if defined(VK_KHR_get_display_properties2)\nPFN_vkGetDisplayModeProperties2KHR vkGetDisplayModeProperties2KHR;\nPFN_vkGetDisplayPlaneCapabilities2KHR vkGetDisplayPlaneCapabilities2KHR;\nPFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR vkGetPhysicalDeviceDisplayPlaneProperties2KHR;\nPFN_vkGetPhysicalDeviceDisplayProperties2KHR vkGetPhysicalDeviceDisplayProperties2KHR;\n#endif /* defined(VK_KHR_get_display_properties2) */\n#if defined(VK_KHR_get_memory_requirements2)\nPFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR;\nPFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR;\nPFN_vkGetImageSparseMemoryRequirements2KHR vkGetImageSparseMemoryRequirements2KHR;\n#endif /* defined(VK_KHR_get_memory_requirements2) */\n#if defined(VK_KHR_get_physical_device_properties2)\nPFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR;\nPFN_vkGetPhysicalDeviceFormatProperties2KHR vkGetPhysicalDeviceFormatProperties2KHR;\nPFN_vkGetPhysicalDeviceImageFormatProperties2KHR vkGetPhysicalDeviceImageFormatProperties2KHR;\nPFN_vkGetPhysicalDeviceMemoryProperties2KHR vkGetPhysicalDeviceMemoryProperties2KHR;\nPFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR;\nPFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR vkGetPhysicalDeviceQueueFamilyProperties2KHR;\nPFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR vkGetPhysicalDeviceSparseImageFormatProperties2KHR;\n#endif /* defined(VK_KHR_get_physical_device_properties2) */\n#if defined(VK_KHR_get_surface_capabilities2)\nPFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR vkGetPhysicalDeviceSurfaceCapabilities2KHR;\nPFN_vkGetPhysicalDeviceSurfaceFormats2KHR vkGetPhysicalDeviceSurfaceFormats2KHR;\n#endif /* defined(VK_KHR_get_surface_capabilities2) */\n#if defined(VK_KHR_line_rasterization)\nPFN_vkCmdSetLineStippleKHR vkCmdSetLineStippleKHR;\n#endif /* defined(VK_KHR_line_rasterization) */\n#if defined(VK_KHR_maintenance1)\nPFN_vkTrimCommandPoolKHR vkTrimCommandPoolKHR;\n#endif /* defined(VK_KHR_maintenance1) */\n#if defined(VK_KHR_maintenance3)\nPFN_vkGetDescriptorSetLayoutSupportKHR vkGetDescriptorSetLayoutSupportKHR;\n#endif /* defined(VK_KHR_maintenance3) */\n#if defined(VK_KHR_maintenance4)\nPFN_vkGetDeviceBufferMemoryRequirementsKHR vkGetDeviceBufferMemoryRequirementsKHR;\nPFN_vkGetDeviceImageMemoryRequirementsKHR vkGetDeviceImageMemoryRequirementsKHR;\nPFN_vkGetDeviceImageSparseMemoryRequirementsKHR vkGetDeviceImageSparseMemoryRequirementsKHR;\n#endif /* defined(VK_KHR_maintenance4) */\n#if defined(VK_KHR_maintenance5)\nPFN_vkCmdBindIndexBuffer2KHR vkCmdBindIndexBuffer2KHR;\nPFN_vkGetDeviceImageSubresourceLayoutKHR vkGetDeviceImageSubresourceLayoutKHR;\nPFN_vkGetImageSubresourceLayout2KHR vkGetImageSubresourceLayout2KHR;\nPFN_vkGetRenderingAreaGranularityKHR vkGetRenderingAreaGranularityKHR;\n#endif /* defined(VK_KHR_maintenance5) */\n#if defined(VK_KHR_maintenance6)\nPFN_vkCmdBindDescriptorSets2KHR vkCmdBindDescriptorSets2KHR;\nPFN_vkCmdPushConstants2KHR vkCmdPushConstants2KHR;\n#endif /* defined(VK_KHR_maintenance6) */\n#if defined(VK_KHR_maintenance6) && defined(VK_KHR_push_descriptor)\nPFN_vkCmdPushDescriptorSet2KHR vkCmdPushDescriptorSet2KHR;\nPFN_vkCmdPushDescriptorSetWithTemplate2KHR vkCmdPushDescriptorSetWithTemplate2KHR;\n#endif /* defined(VK_KHR_maintenance6) && defined(VK_KHR_push_descriptor) */\n#if defined(VK_KHR_maintenance6) && defined(VK_EXT_descriptor_buffer)\nPFN_vkCmdBindDescriptorBufferEmbeddedSamplers2EXT vkCmdBindDescriptorBufferEmbeddedSamplers2EXT;\nPFN_vkCmdSetDescriptorBufferOffsets2EXT vkCmdSetDescriptorBufferOffsets2EXT;\n#endif /* defined(VK_KHR_maintenance6) && defined(VK_EXT_descriptor_buffer) */\n#if defined(VK_KHR_map_memory2)\nPFN_vkMapMemory2KHR vkMapMemory2KHR;\nPFN_vkUnmapMemory2KHR vkUnmapMemory2KHR;\n#endif /* defined(VK_KHR_map_memory2) */\n#if defined(VK_KHR_performance_query)\nPFN_vkAcquireProfilingLockKHR vkAcquireProfilingLockKHR;\nPFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR;\nPFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR;\nPFN_vkReleaseProfilingLockKHR vkReleaseProfilingLockKHR;\n#endif /* defined(VK_KHR_performance_query) */\n#if defined(VK_KHR_pipeline_binary)\nPFN_vkCreatePipelineBinariesKHR vkCreatePipelineBinariesKHR;\nPFN_vkDestroyPipelineBinaryKHR vkDestroyPipelineBinaryKHR;\nPFN_vkGetPipelineBinaryDataKHR vkGetPipelineBinaryDataKHR;\nPFN_vkGetPipelineKeyKHR vkGetPipelineKeyKHR;\nPFN_vkReleaseCapturedPipelineDataKHR vkReleaseCapturedPipelineDataKHR;\n#endif /* defined(VK_KHR_pipeline_binary) */\n#if defined(VK_KHR_pipeline_executable_properties)\nPFN_vkGetPipelineExecutableInternalRepresentationsKHR vkGetPipelineExecutableInternalRepresentationsKHR;\nPFN_vkGetPipelineExecutablePropertiesKHR vkGetPipelineExecutablePropertiesKHR;\nPFN_vkGetPipelineExecutableStatisticsKHR vkGetPipelineExecutableStatisticsKHR;\n#endif /* defined(VK_KHR_pipeline_executable_properties) */\n#if defined(VK_KHR_present_wait)\nPFN_vkWaitForPresentKHR vkWaitForPresentKHR;\n#endif /* defined(VK_KHR_present_wait) */\n#if defined(VK_KHR_push_descriptor)\nPFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR;\n#endif /* defined(VK_KHR_push_descriptor) */\n#if defined(VK_KHR_ray_tracing_maintenance1) && defined(VK_KHR_ray_tracing_pipeline)\nPFN_vkCmdTraceRaysIndirect2KHR vkCmdTraceRaysIndirect2KHR;\n#endif /* defined(VK_KHR_ray_tracing_maintenance1) && defined(VK_KHR_ray_tracing_pipeline) */\n#if defined(VK_KHR_ray_tracing_pipeline)\nPFN_vkCmdSetRayTracingPipelineStackSizeKHR vkCmdSetRayTracingPipelineStackSizeKHR;\nPFN_vkCmdTraceRaysIndirectKHR vkCmdTraceRaysIndirectKHR;\nPFN_vkCmdTraceRaysKHR vkCmdTraceRaysKHR;\nPFN_vkCreateRayTracingPipelinesKHR vkCreateRayTracingPipelinesKHR;\nPFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR vkGetRayTracingCaptureReplayShaderGroupHandlesKHR;\nPFN_vkGetRayTracingShaderGroupHandlesKHR vkGetRayTracingShaderGroupHandlesKHR;\nPFN_vkGetRayTracingShaderGroupStackSizeKHR vkGetRayTracingShaderGroupStackSizeKHR;\n#endif /* defined(VK_KHR_ray_tracing_pipeline) */\n#if defined(VK_KHR_sampler_ycbcr_conversion)\nPFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionKHR;\nPFN_vkDestroySamplerYcbcrConversionKHR vkDestroySamplerYcbcrConversionKHR;\n#endif /* defined(VK_KHR_sampler_ycbcr_conversion) */\n#if defined(VK_KHR_shared_presentable_image)\nPFN_vkGetSwapchainStatusKHR vkGetSwapchainStatusKHR;\n#endif /* defined(VK_KHR_shared_presentable_image) */\n#if defined(VK_KHR_surface)\nPFN_vkDestroySurfaceKHR vkDestroySurfaceKHR;\nPFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR;\nPFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR;\nPFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR;\nPFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR;\n#endif /* defined(VK_KHR_surface) */\n#if defined(VK_KHR_swapchain)\nPFN_vkAcquireNextImageKHR vkAcquireNextImageKHR;\nPFN_vkCreateSwapchainKHR vkCreateSwapchainKHR;\nPFN_vkDestroySwapchainKHR vkDestroySwapchainKHR;\nPFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR;\nPFN_vkQueuePresentKHR vkQueuePresentKHR;\n#endif /* defined(VK_KHR_swapchain) */\n#if defined(VK_KHR_synchronization2)\nPFN_vkCmdPipelineBarrier2KHR vkCmdPipelineBarrier2KHR;\nPFN_vkCmdResetEvent2KHR vkCmdResetEvent2KHR;\nPFN_vkCmdSetEvent2KHR vkCmdSetEvent2KHR;\nPFN_vkCmdWaitEvents2KHR vkCmdWaitEvents2KHR;\nPFN_vkCmdWriteTimestamp2KHR vkCmdWriteTimestamp2KHR;\nPFN_vkQueueSubmit2KHR vkQueueSubmit2KHR;\n#endif /* defined(VK_KHR_synchronization2) */\n#if defined(VK_KHR_timeline_semaphore)\nPFN_vkGetSemaphoreCounterValueKHR vkGetSemaphoreCounterValueKHR;\nPFN_vkSignalSemaphoreKHR vkSignalSemaphoreKHR;\nPFN_vkWaitSemaphoresKHR vkWaitSemaphoresKHR;\n#endif /* defined(VK_KHR_timeline_semaphore) */\n#if defined(VK_KHR_video_decode_queue)\nPFN_vkCmdDecodeVideoKHR vkCmdDecodeVideoKHR;\n#endif /* defined(VK_KHR_video_decode_queue) */\n#if defined(VK_KHR_video_encode_queue)\nPFN_vkCmdEncodeVideoKHR vkCmdEncodeVideoKHR;\nPFN_vkGetEncodedVideoSessionParametersKHR vkGetEncodedVideoSessionParametersKHR;\nPFN_vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR;\n#endif /* defined(VK_KHR_video_encode_queue) */\n#if defined(VK_KHR_video_queue)\nPFN_vkBindVideoSessionMemoryKHR vkBindVideoSessionMemoryKHR;\nPFN_vkCmdBeginVideoCodingKHR vkCmdBeginVideoCodingKHR;\nPFN_vkCmdControlVideoCodingKHR vkCmdControlVideoCodingKHR;\nPFN_vkCmdEndVideoCodingKHR vkCmdEndVideoCodingKHR;\nPFN_vkCreateVideoSessionKHR vkCreateVideoSessionKHR;\nPFN_vkCreateVideoSessionParametersKHR vkCreateVideoSessionParametersKHR;\nPFN_vkDestroyVideoSessionKHR vkDestroyVideoSessionKHR;\nPFN_vkDestroyVideoSessionParametersKHR vkDestroyVideoSessionParametersKHR;\nPFN_vkGetPhysicalDeviceVideoCapabilitiesKHR vkGetPhysicalDeviceVideoCapabilitiesKHR;\nPFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR vkGetPhysicalDeviceVideoFormatPropertiesKHR;\nPFN_vkGetVideoSessionMemoryRequirementsKHR vkGetVideoSessionMemoryRequirementsKHR;\nPFN_vkUpdateVideoSessionParametersKHR vkUpdateVideoSessionParametersKHR;\n#endif /* defined(VK_KHR_video_queue) */\n#if defined(VK_KHR_wayland_surface)\nPFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR;\nPFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR vkGetPhysicalDeviceWaylandPresentationSupportKHR;\n#endif /* defined(VK_KHR_wayland_surface) */\n#if defined(VK_KHR_win32_surface)\nPFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR;\nPFN_vkGetPhysicalDeviceWin32PresentationSupportKHR vkGetPhysicalDeviceWin32PresentationSupportKHR;\n#endif /* defined(VK_KHR_win32_surface) */\n#if defined(VK_KHR_xcb_surface)\nPFN_vkCreateXcbSurfaceKHR vkCreateXcbSurfaceKHR;\nPFN_vkGetPhysicalDeviceXcbPresentationSupportKHR vkGetPhysicalDeviceXcbPresentationSupportKHR;\n#endif /* defined(VK_KHR_xcb_surface) */\n#if defined(VK_KHR_xlib_surface)\nPFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR;\nPFN_vkGetPhysicalDeviceXlibPresentationSupportKHR vkGetPhysicalDeviceXlibPresentationSupportKHR;\n#endif /* defined(VK_KHR_xlib_surface) */\n#if defined(VK_MVK_ios_surface)\nPFN_vkCreateIOSSurfaceMVK vkCreateIOSSurfaceMVK;\n#endif /* defined(VK_MVK_ios_surface) */\n#if defined(VK_MVK_macos_surface)\nPFN_vkCreateMacOSSurfaceMVK vkCreateMacOSSurfaceMVK;\n#endif /* defined(VK_MVK_macos_surface) */\n#if defined(VK_NN_vi_surface)\nPFN_vkCreateViSurfaceNN vkCreateViSurfaceNN;\n#endif /* defined(VK_NN_vi_surface) */\n#if defined(VK_NVX_binary_import)\nPFN_vkCmdCuLaunchKernelNVX vkCmdCuLaunchKernelNVX;\nPFN_vkCreateCuFunctionNVX vkCreateCuFunctionNVX;\nPFN_vkCreateCuModuleNVX vkCreateCuModuleNVX;\nPFN_vkDestroyCuFunctionNVX vkDestroyCuFunctionNVX;\nPFN_vkDestroyCuModuleNVX vkDestroyCuModuleNVX;\n#endif /* defined(VK_NVX_binary_import) */\n#if defined(VK_NVX_image_view_handle)\nPFN_vkGetImageViewHandleNVX vkGetImageViewHandleNVX;\n#endif /* defined(VK_NVX_image_view_handle) */\n#if defined(VK_NVX_image_view_handle) && VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION >= 3\nPFN_vkGetImageViewHandle64NVX vkGetImageViewHandle64NVX;\n#endif /* defined(VK_NVX_image_view_handle) && VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION >= 3 */\n#if defined(VK_NVX_image_view_handle) && VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION >= 2\nPFN_vkGetImageViewAddressNVX vkGetImageViewAddressNVX;\n#endif /* defined(VK_NVX_image_view_handle) && VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION >= 2 */\n#if defined(VK_NV_acquire_winrt_display)\nPFN_vkAcquireWinrtDisplayNV vkAcquireWinrtDisplayNV;\nPFN_vkGetWinrtDisplayNV vkGetWinrtDisplayNV;\n#endif /* defined(VK_NV_acquire_winrt_display) */\n#if defined(VK_NV_clip_space_w_scaling)\nPFN_vkCmdSetViewportWScalingNV vkCmdSetViewportWScalingNV;\n#endif /* defined(VK_NV_clip_space_w_scaling) */\n#if defined(VK_NV_cluster_acceleration_structure)\nPFN_vkCmdBuildClusterAccelerationStructureIndirectNV vkCmdBuildClusterAccelerationStructureIndirectNV;\nPFN_vkGetClusterAccelerationStructureBuildSizesNV vkGetClusterAccelerationStructureBuildSizesNV;\n#endif /* defined(VK_NV_cluster_acceleration_structure) */\n#if defined(VK_NV_cooperative_matrix)\nPFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV vkGetPhysicalDeviceCooperativeMatrixPropertiesNV;\n#endif /* defined(VK_NV_cooperative_matrix) */\n#if defined(VK_NV_cooperative_matrix2)\nPFN_vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV;\n#endif /* defined(VK_NV_cooperative_matrix2) */\n#if defined(VK_NV_cooperative_vector)\nPFN_vkCmdConvertCooperativeVectorMatrixNV vkCmdConvertCooperativeVectorMatrixNV;\nPFN_vkConvertCooperativeVectorMatrixNV vkConvertCooperativeVectorMatrixNV;\nPFN_vkGetPhysicalDeviceCooperativeVectorPropertiesNV vkGetPhysicalDeviceCooperativeVectorPropertiesNV;\n#endif /* defined(VK_NV_cooperative_vector) */\n#if defined(VK_NV_copy_memory_indirect)\nPFN_vkCmdCopyMemoryIndirectNV vkCmdCopyMemoryIndirectNV;\nPFN_vkCmdCopyMemoryToImageIndirectNV vkCmdCopyMemoryToImageIndirectNV;\n#endif /* defined(VK_NV_copy_memory_indirect) */\n#if defined(VK_NV_coverage_reduction_mode)\nPFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV;\n#endif /* defined(VK_NV_coverage_reduction_mode) */\n#if defined(VK_NV_cuda_kernel_launch)\nPFN_vkCmdCudaLaunchKernelNV vkCmdCudaLaunchKernelNV;\nPFN_vkCreateCudaFunctionNV vkCreateCudaFunctionNV;\nPFN_vkCreateCudaModuleNV vkCreateCudaModuleNV;\nPFN_vkDestroyCudaFunctionNV vkDestroyCudaFunctionNV;\nPFN_vkDestroyCudaModuleNV vkDestroyCudaModuleNV;\nPFN_vkGetCudaModuleCacheNV vkGetCudaModuleCacheNV;\n#endif /* defined(VK_NV_cuda_kernel_launch) */\n#if defined(VK_NV_device_diagnostic_checkpoints)\nPFN_vkCmdSetCheckpointNV vkCmdSetCheckpointNV;\nPFN_vkGetQueueCheckpointDataNV vkGetQueueCheckpointDataNV;\n#endif /* defined(VK_NV_device_diagnostic_checkpoints) */\n#if defined(VK_NV_device_diagnostic_checkpoints) && (defined(VK_VERSION_1_3) || defined(VK_KHR_synchronization2))\nPFN_vkGetQueueCheckpointData2NV vkGetQueueCheckpointData2NV;\n#endif /* defined(VK_NV_device_diagnostic_checkpoints) && (defined(VK_VERSION_1_3) || defined(VK_KHR_synchronization2)) */\n#if defined(VK_NV_device_generated_commands)\nPFN_vkCmdBindPipelineShaderGroupNV vkCmdBindPipelineShaderGroupNV;\nPFN_vkCmdExecuteGeneratedCommandsNV vkCmdExecuteGeneratedCommandsNV;\nPFN_vkCmdPreprocessGeneratedCommandsNV vkCmdPreprocessGeneratedCommandsNV;\nPFN_vkCreateIndirectCommandsLayoutNV vkCreateIndirectCommandsLayoutNV;\nPFN_vkDestroyIndirectCommandsLayoutNV vkDestroyIndirectCommandsLayoutNV;\nPFN_vkGetGeneratedCommandsMemoryRequirementsNV vkGetGeneratedCommandsMemoryRequirementsNV;\n#endif /* defined(VK_NV_device_generated_commands) */\n#if defined(VK_NV_device_generated_commands_compute)\nPFN_vkCmdUpdatePipelineIndirectBufferNV vkCmdUpdatePipelineIndirectBufferNV;\nPFN_vkGetPipelineIndirectDeviceAddressNV vkGetPipelineIndirectDeviceAddressNV;\nPFN_vkGetPipelineIndirectMemoryRequirementsNV vkGetPipelineIndirectMemoryRequirementsNV;\n#endif /* defined(VK_NV_device_generated_commands_compute) */\n#if defined(VK_NV_external_memory_capabilities)\nPFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV vkGetPhysicalDeviceExternalImageFormatPropertiesNV;\n#endif /* defined(VK_NV_external_memory_capabilities) */\n#if defined(VK_NV_external_memory_rdma)\nPFN_vkGetMemoryRemoteAddressNV vkGetMemoryRemoteAddressNV;\n#endif /* defined(VK_NV_external_memory_rdma) */\n#if defined(VK_NV_external_memory_win32)\nPFN_vkGetMemoryWin32HandleNV vkGetMemoryWin32HandleNV;\n#endif /* defined(VK_NV_external_memory_win32) */\n#if defined(VK_NV_fragment_shading_rate_enums)\nPFN_vkCmdSetFragmentShadingRateEnumNV vkCmdSetFragmentShadingRateEnumNV;\n#endif /* defined(VK_NV_fragment_shading_rate_enums) */\n#if defined(VK_NV_low_latency2)\nPFN_vkGetLatencyTimingsNV vkGetLatencyTimingsNV;\nPFN_vkLatencySleepNV vkLatencySleepNV;\nPFN_vkQueueNotifyOutOfBandNV vkQueueNotifyOutOfBandNV;\nPFN_vkSetLatencyMarkerNV vkSetLatencyMarkerNV;\nPFN_vkSetLatencySleepModeNV vkSetLatencySleepModeNV;\n#endif /* defined(VK_NV_low_latency2) */\n#if defined(VK_NV_memory_decompression)\nPFN_vkCmdDecompressMemoryIndirectCountNV vkCmdDecompressMemoryIndirectCountNV;\nPFN_vkCmdDecompressMemoryNV vkCmdDecompressMemoryNV;\n#endif /* defined(VK_NV_memory_decompression) */\n#if defined(VK_NV_mesh_shader)\nPFN_vkCmdDrawMeshTasksIndirectNV vkCmdDrawMeshTasksIndirectNV;\nPFN_vkCmdDrawMeshTasksNV vkCmdDrawMeshTasksNV;\n#endif /* defined(VK_NV_mesh_shader) */\n#if defined(VK_NV_mesh_shader) && (defined(VK_KHR_draw_indirect_count) || defined(VK_VERSION_1_2))\nPFN_vkCmdDrawMeshTasksIndirectCountNV vkCmdDrawMeshTasksIndirectCountNV;\n#endif /* defined(VK_NV_mesh_shader) && (defined(VK_KHR_draw_indirect_count) || defined(VK_VERSION_1_2)) */\n#if defined(VK_NV_optical_flow)\nPFN_vkBindOpticalFlowSessionImageNV vkBindOpticalFlowSessionImageNV;\nPFN_vkCmdOpticalFlowExecuteNV vkCmdOpticalFlowExecuteNV;\nPFN_vkCreateOpticalFlowSessionNV vkCreateOpticalFlowSessionNV;\nPFN_vkDestroyOpticalFlowSessionNV vkDestroyOpticalFlowSessionNV;\nPFN_vkGetPhysicalDeviceOpticalFlowImageFormatsNV vkGetPhysicalDeviceOpticalFlowImageFormatsNV;\n#endif /* defined(VK_NV_optical_flow) */\n#if defined(VK_NV_partitioned_acceleration_structure)\nPFN_vkCmdBuildPartitionedAccelerationStructuresNV vkCmdBuildPartitionedAccelerationStructuresNV;\nPFN_vkGetPartitionedAccelerationStructuresBuildSizesNV vkGetPartitionedAccelerationStructuresBuildSizesNV;\n#endif /* defined(VK_NV_partitioned_acceleration_structure) */\n#if defined(VK_NV_ray_tracing)\nPFN_vkBindAccelerationStructureMemoryNV vkBindAccelerationStructureMemoryNV;\nPFN_vkCmdBuildAccelerationStructureNV vkCmdBuildAccelerationStructureNV;\nPFN_vkCmdCopyAccelerationStructureNV vkCmdCopyAccelerationStructureNV;\nPFN_vkCmdTraceRaysNV vkCmdTraceRaysNV;\nPFN_vkCmdWriteAccelerationStructuresPropertiesNV vkCmdWriteAccelerationStructuresPropertiesNV;\nPFN_vkCompileDeferredNV vkCompileDeferredNV;\nPFN_vkCreateAccelerationStructureNV vkCreateAccelerationStructureNV;\nPFN_vkCreateRayTracingPipelinesNV vkCreateRayTracingPipelinesNV;\nPFN_vkDestroyAccelerationStructureNV vkDestroyAccelerationStructureNV;\nPFN_vkGetAccelerationStructureHandleNV vkGetAccelerationStructureHandleNV;\nPFN_vkGetAccelerationStructureMemoryRequirementsNV vkGetAccelerationStructureMemoryRequirementsNV;\nPFN_vkGetRayTracingShaderGroupHandlesNV vkGetRayTracingShaderGroupHandlesNV;\n#endif /* defined(VK_NV_ray_tracing) */\n#if defined(VK_NV_scissor_exclusive) && VK_NV_SCISSOR_EXCLUSIVE_SPEC_VERSION >= 2\nPFN_vkCmdSetExclusiveScissorEnableNV vkCmdSetExclusiveScissorEnableNV;\n#endif /* defined(VK_NV_scissor_exclusive) && VK_NV_SCISSOR_EXCLUSIVE_SPEC_VERSION >= 2 */\n#if defined(VK_NV_scissor_exclusive)\nPFN_vkCmdSetExclusiveScissorNV vkCmdSetExclusiveScissorNV;\n#endif /* defined(VK_NV_scissor_exclusive) */\n#if defined(VK_NV_shading_rate_image)\nPFN_vkCmdBindShadingRateImageNV vkCmdBindShadingRateImageNV;\nPFN_vkCmdSetCoarseSampleOrderNV vkCmdSetCoarseSampleOrderNV;\nPFN_vkCmdSetViewportShadingRatePaletteNV vkCmdSetViewportShadingRatePaletteNV;\n#endif /* defined(VK_NV_shading_rate_image) */\n#if defined(VK_QCOM_tile_properties)\nPFN_vkGetDynamicRenderingTilePropertiesQCOM vkGetDynamicRenderingTilePropertiesQCOM;\nPFN_vkGetFramebufferTilePropertiesQCOM vkGetFramebufferTilePropertiesQCOM;\n#endif /* defined(VK_QCOM_tile_properties) */\n#if defined(VK_QNX_external_memory_screen_buffer)\nPFN_vkGetScreenBufferPropertiesQNX vkGetScreenBufferPropertiesQNX;\n#endif /* defined(VK_QNX_external_memory_screen_buffer) */\n#if defined(VK_QNX_screen_surface)\nPFN_vkCreateScreenSurfaceQNX vkCreateScreenSurfaceQNX;\nPFN_vkGetPhysicalDeviceScreenPresentationSupportQNX vkGetPhysicalDeviceScreenPresentationSupportQNX;\n#endif /* defined(VK_QNX_screen_surface) */\n#if defined(VK_VALVE_descriptor_set_host_mapping)\nPFN_vkGetDescriptorSetHostMappingVALVE vkGetDescriptorSetHostMappingVALVE;\nPFN_vkGetDescriptorSetLayoutHostMappingInfoVALVE vkGetDescriptorSetLayoutHostMappingInfoVALVE;\n#endif /* defined(VK_VALVE_descriptor_set_host_mapping) */\n#if (defined(VK_EXT_depth_clamp_control)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clamp_control))\nPFN_vkCmdSetDepthClampRangeEXT vkCmdSetDepthClampRangeEXT;\n#endif /* (defined(VK_EXT_depth_clamp_control)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clamp_control)) */\n#if (defined(VK_EXT_extended_dynamic_state)) || (defined(VK_EXT_shader_object))\nPFN_vkCmdBindVertexBuffers2EXT vkCmdBindVertexBuffers2EXT;\nPFN_vkCmdSetCullModeEXT vkCmdSetCullModeEXT;\nPFN_vkCmdSetDepthBoundsTestEnableEXT vkCmdSetDepthBoundsTestEnableEXT;\nPFN_vkCmdSetDepthCompareOpEXT vkCmdSetDepthCompareOpEXT;\nPFN_vkCmdSetDepthTestEnableEXT vkCmdSetDepthTestEnableEXT;\nPFN_vkCmdSetDepthWriteEnableEXT vkCmdSetDepthWriteEnableEXT;\nPFN_vkCmdSetFrontFaceEXT vkCmdSetFrontFaceEXT;\nPFN_vkCmdSetPrimitiveTopologyEXT vkCmdSetPrimitiveTopologyEXT;\nPFN_vkCmdSetScissorWithCountEXT vkCmdSetScissorWithCountEXT;\nPFN_vkCmdSetStencilOpEXT vkCmdSetStencilOpEXT;\nPFN_vkCmdSetStencilTestEnableEXT vkCmdSetStencilTestEnableEXT;\nPFN_vkCmdSetViewportWithCountEXT vkCmdSetViewportWithCountEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state)) || (defined(VK_EXT_shader_object)) */\n#if (defined(VK_EXT_extended_dynamic_state2)) || (defined(VK_EXT_shader_object))\nPFN_vkCmdSetDepthBiasEnableEXT vkCmdSetDepthBiasEnableEXT;\nPFN_vkCmdSetLogicOpEXT vkCmdSetLogicOpEXT;\nPFN_vkCmdSetPatchControlPointsEXT vkCmdSetPatchControlPointsEXT;\nPFN_vkCmdSetPrimitiveRestartEnableEXT vkCmdSetPrimitiveRestartEnableEXT;\nPFN_vkCmdSetRasterizerDiscardEnableEXT vkCmdSetRasterizerDiscardEnableEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state2)) || (defined(VK_EXT_shader_object)) */\n#if (defined(VK_EXT_extended_dynamic_state3)) || (defined(VK_EXT_shader_object))\nPFN_vkCmdSetAlphaToCoverageEnableEXT vkCmdSetAlphaToCoverageEnableEXT;\nPFN_vkCmdSetAlphaToOneEnableEXT vkCmdSetAlphaToOneEnableEXT;\nPFN_vkCmdSetColorBlendEnableEXT vkCmdSetColorBlendEnableEXT;\nPFN_vkCmdSetColorBlendEquationEXT vkCmdSetColorBlendEquationEXT;\nPFN_vkCmdSetColorWriteMaskEXT vkCmdSetColorWriteMaskEXT;\nPFN_vkCmdSetDepthClampEnableEXT vkCmdSetDepthClampEnableEXT;\nPFN_vkCmdSetLogicOpEnableEXT vkCmdSetLogicOpEnableEXT;\nPFN_vkCmdSetPolygonModeEXT vkCmdSetPolygonModeEXT;\nPFN_vkCmdSetRasterizationSamplesEXT vkCmdSetRasterizationSamplesEXT;\nPFN_vkCmdSetSampleMaskEXT vkCmdSetSampleMaskEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3)) || (defined(VK_EXT_shader_object)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && (defined(VK_KHR_maintenance2) || defined(VK_VERSION_1_1))) || (defined(VK_EXT_shader_object))\nPFN_vkCmdSetTessellationDomainOriginEXT vkCmdSetTessellationDomainOriginEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && (defined(VK_KHR_maintenance2) || defined(VK_VERSION_1_1))) || (defined(VK_EXT_shader_object)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_transform_feedback)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_transform_feedback))\nPFN_vkCmdSetRasterizationStreamEXT vkCmdSetRasterizationStreamEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_transform_feedback)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_transform_feedback)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_conservative_rasterization)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_conservative_rasterization))\nPFN_vkCmdSetConservativeRasterizationModeEXT vkCmdSetConservativeRasterizationModeEXT;\nPFN_vkCmdSetExtraPrimitiveOverestimationSizeEXT vkCmdSetExtraPrimitiveOverestimationSizeEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_conservative_rasterization)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_conservative_rasterization)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_depth_clip_enable)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clip_enable))\nPFN_vkCmdSetDepthClipEnableEXT vkCmdSetDepthClipEnableEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_depth_clip_enable)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clip_enable)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_sample_locations)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_sample_locations))\nPFN_vkCmdSetSampleLocationsEnableEXT vkCmdSetSampleLocationsEnableEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_sample_locations)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_sample_locations)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_blend_operation_advanced)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_blend_operation_advanced))\nPFN_vkCmdSetColorBlendAdvancedEXT vkCmdSetColorBlendAdvancedEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_blend_operation_advanced)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_blend_operation_advanced)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_provoking_vertex)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_provoking_vertex))\nPFN_vkCmdSetProvokingVertexModeEXT vkCmdSetProvokingVertexModeEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_provoking_vertex)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_provoking_vertex)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_line_rasterization)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_line_rasterization))\nPFN_vkCmdSetLineRasterizationModeEXT vkCmdSetLineRasterizationModeEXT;\nPFN_vkCmdSetLineStippleEnableEXT vkCmdSetLineStippleEnableEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_line_rasterization)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_line_rasterization)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_depth_clip_control)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clip_control))\nPFN_vkCmdSetDepthClipNegativeOneToOneEXT vkCmdSetDepthClipNegativeOneToOneEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_depth_clip_control)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clip_control)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_clip_space_w_scaling)) || (defined(VK_EXT_shader_object) && defined(VK_NV_clip_space_w_scaling))\nPFN_vkCmdSetViewportWScalingEnableNV vkCmdSetViewportWScalingEnableNV;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_clip_space_w_scaling)) || (defined(VK_EXT_shader_object) && defined(VK_NV_clip_space_w_scaling)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_viewport_swizzle)) || (defined(VK_EXT_shader_object) && defined(VK_NV_viewport_swizzle))\nPFN_vkCmdSetViewportSwizzleNV vkCmdSetViewportSwizzleNV;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_viewport_swizzle)) || (defined(VK_EXT_shader_object) && defined(VK_NV_viewport_swizzle)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_fragment_coverage_to_color)) || (defined(VK_EXT_shader_object) && defined(VK_NV_fragment_coverage_to_color))\nPFN_vkCmdSetCoverageToColorEnableNV vkCmdSetCoverageToColorEnableNV;\nPFN_vkCmdSetCoverageToColorLocationNV vkCmdSetCoverageToColorLocationNV;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_fragment_coverage_to_color)) || (defined(VK_EXT_shader_object) && defined(VK_NV_fragment_coverage_to_color)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_framebuffer_mixed_samples)) || (defined(VK_EXT_shader_object) && defined(VK_NV_framebuffer_mixed_samples))\nPFN_vkCmdSetCoverageModulationModeNV vkCmdSetCoverageModulationModeNV;\nPFN_vkCmdSetCoverageModulationTableEnableNV vkCmdSetCoverageModulationTableEnableNV;\nPFN_vkCmdSetCoverageModulationTableNV vkCmdSetCoverageModulationTableNV;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_framebuffer_mixed_samples)) || (defined(VK_EXT_shader_object) && defined(VK_NV_framebuffer_mixed_samples)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_shading_rate_image)) || (defined(VK_EXT_shader_object) && defined(VK_NV_shading_rate_image))\nPFN_vkCmdSetShadingRateImageEnableNV vkCmdSetShadingRateImageEnableNV;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_shading_rate_image)) || (defined(VK_EXT_shader_object) && defined(VK_NV_shading_rate_image)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_representative_fragment_test)) || (defined(VK_EXT_shader_object) && defined(VK_NV_representative_fragment_test))\nPFN_vkCmdSetRepresentativeFragmentTestEnableNV vkCmdSetRepresentativeFragmentTestEnableNV;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_representative_fragment_test)) || (defined(VK_EXT_shader_object) && defined(VK_NV_representative_fragment_test)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_coverage_reduction_mode)) || (defined(VK_EXT_shader_object) && defined(VK_NV_coverage_reduction_mode))\nPFN_vkCmdSetCoverageReductionModeNV vkCmdSetCoverageReductionModeNV;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_coverage_reduction_mode)) || (defined(VK_EXT_shader_object) && defined(VK_NV_coverage_reduction_mode)) */\n#if (defined(VK_EXT_host_image_copy)) || (defined(VK_EXT_image_compression_control))\nPFN_vkGetImageSubresourceLayout2EXT vkGetImageSubresourceLayout2EXT;\n#endif /* (defined(VK_EXT_host_image_copy)) || (defined(VK_EXT_image_compression_control)) */\n#if (defined(VK_EXT_shader_object)) || (defined(VK_EXT_vertex_input_dynamic_state))\nPFN_vkCmdSetVertexInputEXT vkCmdSetVertexInputEXT;\n#endif /* (defined(VK_EXT_shader_object)) || (defined(VK_EXT_vertex_input_dynamic_state)) */\n#if (defined(VK_KHR_descriptor_update_template) && defined(VK_KHR_push_descriptor)) || (defined(VK_KHR_push_descriptor) && (defined(VK_VERSION_1_1) || defined(VK_KHR_descriptor_update_template)))\nPFN_vkCmdPushDescriptorSetWithTemplateKHR vkCmdPushDescriptorSetWithTemplateKHR;\n#endif /* (defined(VK_KHR_descriptor_update_template) && defined(VK_KHR_push_descriptor)) || (defined(VK_KHR_push_descriptor) && (defined(VK_VERSION_1_1) || defined(VK_KHR_descriptor_update_template))) */\n#if (defined(VK_KHR_device_group) && defined(VK_KHR_surface)) || (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1))\nPFN_vkGetDeviceGroupPresentCapabilitiesKHR vkGetDeviceGroupPresentCapabilitiesKHR;\nPFN_vkGetDeviceGroupSurfacePresentModesKHR vkGetDeviceGroupSurfacePresentModesKHR;\nPFN_vkGetPhysicalDevicePresentRectanglesKHR vkGetPhysicalDevicePresentRectanglesKHR;\n#endif /* (defined(VK_KHR_device_group) && defined(VK_KHR_surface)) || (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1)) */\n#if (defined(VK_KHR_device_group) && defined(VK_KHR_swapchain)) || (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1))\nPFN_vkAcquireNextImage2KHR vkAcquireNextImage2KHR;\n#endif /* (defined(VK_KHR_device_group) && defined(VK_KHR_swapchain)) || (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1)) */\n/* VOLK_GENERATE_PROTOTYPES_C */\n\n#ifdef __GNUC__\n#\tpragma GCC visibility pop\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n/* clang-format on */\n"
  },
  {
    "path": "src/libraries/volk/volk.h",
    "content": "/**\n * volk\n *\n * Copyright (C) 2018-2025, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)\n * Report bugs and download new versions at https://github.com/zeux/volk\n *\n * This library is distributed under the MIT License. See notice at the end of this file.\n */\n/* clang-format off */\n#ifndef VOLK_H_\n#define VOLK_H_\n\n#if defined(VULKAN_H_) && !defined(VK_NO_PROTOTYPES)\n#\terror To use volk, you need to define VK_NO_PROTOTYPES before including vulkan.h\n#endif\n\n/* VOLK_GENERATE_VERSION_DEFINE */\n#define VOLK_HEADER_VERSION 307\n/* VOLK_GENERATE_VERSION_DEFINE */\n\n#ifndef VK_NO_PROTOTYPES\n#\tdefine VK_NO_PROTOTYPES\n#endif\n\n#ifndef VULKAN_H_\n#\tifdef VOLK_VULKAN_H_PATH\n#\t\tinclude VOLK_VULKAN_H_PATH\n#\telif defined(VK_USE_PLATFORM_WIN32_KHR)\n#\t\tinclude <vulkan/vk_platform.h>\n#\t\tinclude <vulkan/vulkan_core.h>\n\n\t\t/* When VK_USE_PLATFORM_WIN32_KHR is defined, instead of including vulkan.h directly, we include individual parts of the SDK\n\t\t * This is necessary to avoid including <windows.h> which is very heavy - it takes 200ms to parse without WIN32_LEAN_AND_MEAN\n\t\t * and 100ms to parse with it. vulkan_win32.h only needs a few symbols that are easy to redefine ourselves.\n\t\t */\n\t\ttypedef unsigned long DWORD;\n\t\ttypedef const wchar_t* LPCWSTR;\n\t\ttypedef void* HANDLE;\n\t\ttypedef struct HINSTANCE__* HINSTANCE;\n\t\ttypedef struct HWND__* HWND;\n\t\ttypedef struct HMONITOR__* HMONITOR;\n\t\ttypedef struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES;\n\n#\t\tinclude <vulkan/vulkan_win32.h>\n\n#\t\tifdef VK_ENABLE_BETA_EXTENSIONS\n#\t\t\tinclude <vulkan/vulkan_beta.h>\n#\t\tendif\n#\telse\n#\t\tinclude <vulkan/vulkan.h>\n#\tendif\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nstruct VolkDeviceTable;\n\n/**\n * Initialize library by loading Vulkan loader; call this function before creating the Vulkan instance.\n *\n * Returns VK_SUCCESS on success and VK_ERROR_INITIALIZATION_FAILED otherwise.\n */\nVkResult volkInitialize(void);\n\n/**\n * Initialize library by providing a custom handler to load global symbols.\n *\n * This function can be used instead of volkInitialize.\n * The handler function pointer will be asked to load global Vulkan symbols which require no instance\n * (such as vkCreateInstance, vkEnumerateInstance* and vkEnumerateInstanceVersion if available).\n */\nvoid volkInitializeCustom(PFN_vkGetInstanceProcAddr handler);\n\n/**\n * Finalize library by unloading Vulkan loader and resetting global symbols to NULL.\n *\n * This function does not need to be called on process exit (as loader will be unloaded automatically) or if volkInitialize failed.\n * In general this function is optional to call but may be useful in rare cases eg if volk needs to be reinitialized multiple times.\n */\nvoid volkFinalize(void);\n\n/**\n * Get Vulkan instance version supported by the Vulkan loader, or 0 if Vulkan isn't supported\n *\n * Returns 0 if volkInitialize wasn't called or failed.\n */\nuint32_t volkGetInstanceVersion(void);\n\n/**\n * Load global function pointers using application-created VkInstance; call this function after creating the Vulkan instance.\n */\nvoid volkLoadInstance(VkInstance instance);\n\n/**\n * Load global function pointers using application-created VkInstance; call this function after creating the Vulkan instance.\n * Skips loading device-based function pointers, requires usage of volkLoadDevice afterwards.\n */\nvoid volkLoadInstanceOnly(VkInstance instance);\n\n/**\n * Load global function pointers using application-created VkDevice; call this function after creating the Vulkan device.\n *\n * Note: this is not suitable for applications that want to use multiple VkDevice objects concurrently.\n */\nvoid volkLoadDevice(VkDevice device);\n\n/**\n * Return last VkInstance for which global function pointers have been loaded via volkLoadInstance(),\n * or VK_NULL_HANDLE if volkLoadInstance() has not been called.\n */\nVkInstance volkGetLoadedInstance(void);\n\n/**\n * Return last VkDevice for which global function pointers have been loaded via volkLoadDevice(),\n * or VK_NULL_HANDLE if volkLoadDevice() has not been called.\n */\nVkDevice volkGetLoadedDevice(void);\n\n/**\n * Load function pointers using application-created VkDevice into a table.\n * Application should use function pointers from that table instead of using global function pointers.\n */\nvoid volkLoadDeviceTable(struct VolkDeviceTable* table, VkDevice device);\n\n/**\n * Device-specific function pointer table\n */\nstruct VolkDeviceTable\n{\n\t/* VOLK_GENERATE_DEVICE_TABLE */\n#if defined(VK_VERSION_1_0)\n\tPFN_vkAllocateCommandBuffers vkAllocateCommandBuffers;\n\tPFN_vkAllocateDescriptorSets vkAllocateDescriptorSets;\n\tPFN_vkAllocateMemory vkAllocateMemory;\n\tPFN_vkBeginCommandBuffer vkBeginCommandBuffer;\n\tPFN_vkBindBufferMemory vkBindBufferMemory;\n\tPFN_vkBindImageMemory vkBindImageMemory;\n\tPFN_vkCmdBeginQuery vkCmdBeginQuery;\n\tPFN_vkCmdBeginRenderPass vkCmdBeginRenderPass;\n\tPFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets;\n\tPFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer;\n\tPFN_vkCmdBindPipeline vkCmdBindPipeline;\n\tPFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers;\n\tPFN_vkCmdBlitImage vkCmdBlitImage;\n\tPFN_vkCmdClearAttachments vkCmdClearAttachments;\n\tPFN_vkCmdClearColorImage vkCmdClearColorImage;\n\tPFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage;\n\tPFN_vkCmdCopyBuffer vkCmdCopyBuffer;\n\tPFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage;\n\tPFN_vkCmdCopyImage vkCmdCopyImage;\n\tPFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer;\n\tPFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults;\n\tPFN_vkCmdDispatch vkCmdDispatch;\n\tPFN_vkCmdDispatchIndirect vkCmdDispatchIndirect;\n\tPFN_vkCmdDraw vkCmdDraw;\n\tPFN_vkCmdDrawIndexed vkCmdDrawIndexed;\n\tPFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect;\n\tPFN_vkCmdDrawIndirect vkCmdDrawIndirect;\n\tPFN_vkCmdEndQuery vkCmdEndQuery;\n\tPFN_vkCmdEndRenderPass vkCmdEndRenderPass;\n\tPFN_vkCmdExecuteCommands vkCmdExecuteCommands;\n\tPFN_vkCmdFillBuffer vkCmdFillBuffer;\n\tPFN_vkCmdNextSubpass vkCmdNextSubpass;\n\tPFN_vkCmdPipelineBarrier vkCmdPipelineBarrier;\n\tPFN_vkCmdPushConstants vkCmdPushConstants;\n\tPFN_vkCmdResetEvent vkCmdResetEvent;\n\tPFN_vkCmdResetQueryPool vkCmdResetQueryPool;\n\tPFN_vkCmdResolveImage vkCmdResolveImage;\n\tPFN_vkCmdSetBlendConstants vkCmdSetBlendConstants;\n\tPFN_vkCmdSetDepthBias vkCmdSetDepthBias;\n\tPFN_vkCmdSetDepthBounds vkCmdSetDepthBounds;\n\tPFN_vkCmdSetEvent vkCmdSetEvent;\n\tPFN_vkCmdSetLineWidth vkCmdSetLineWidth;\n\tPFN_vkCmdSetScissor vkCmdSetScissor;\n\tPFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask;\n\tPFN_vkCmdSetStencilReference vkCmdSetStencilReference;\n\tPFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask;\n\tPFN_vkCmdSetViewport vkCmdSetViewport;\n\tPFN_vkCmdUpdateBuffer vkCmdUpdateBuffer;\n\tPFN_vkCmdWaitEvents vkCmdWaitEvents;\n\tPFN_vkCmdWriteTimestamp vkCmdWriteTimestamp;\n\tPFN_vkCreateBuffer vkCreateBuffer;\n\tPFN_vkCreateBufferView vkCreateBufferView;\n\tPFN_vkCreateCommandPool vkCreateCommandPool;\n\tPFN_vkCreateComputePipelines vkCreateComputePipelines;\n\tPFN_vkCreateDescriptorPool vkCreateDescriptorPool;\n\tPFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout;\n\tPFN_vkCreateEvent vkCreateEvent;\n\tPFN_vkCreateFence vkCreateFence;\n\tPFN_vkCreateFramebuffer vkCreateFramebuffer;\n\tPFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines;\n\tPFN_vkCreateImage vkCreateImage;\n\tPFN_vkCreateImageView vkCreateImageView;\n\tPFN_vkCreatePipelineCache vkCreatePipelineCache;\n\tPFN_vkCreatePipelineLayout vkCreatePipelineLayout;\n\tPFN_vkCreateQueryPool vkCreateQueryPool;\n\tPFN_vkCreateRenderPass vkCreateRenderPass;\n\tPFN_vkCreateSampler vkCreateSampler;\n\tPFN_vkCreateSemaphore vkCreateSemaphore;\n\tPFN_vkCreateShaderModule vkCreateShaderModule;\n\tPFN_vkDestroyBuffer vkDestroyBuffer;\n\tPFN_vkDestroyBufferView vkDestroyBufferView;\n\tPFN_vkDestroyCommandPool vkDestroyCommandPool;\n\tPFN_vkDestroyDescriptorPool vkDestroyDescriptorPool;\n\tPFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout;\n\tPFN_vkDestroyDevice vkDestroyDevice;\n\tPFN_vkDestroyEvent vkDestroyEvent;\n\tPFN_vkDestroyFence vkDestroyFence;\n\tPFN_vkDestroyFramebuffer vkDestroyFramebuffer;\n\tPFN_vkDestroyImage vkDestroyImage;\n\tPFN_vkDestroyImageView vkDestroyImageView;\n\tPFN_vkDestroyPipeline vkDestroyPipeline;\n\tPFN_vkDestroyPipelineCache vkDestroyPipelineCache;\n\tPFN_vkDestroyPipelineLayout vkDestroyPipelineLayout;\n\tPFN_vkDestroyQueryPool vkDestroyQueryPool;\n\tPFN_vkDestroyRenderPass vkDestroyRenderPass;\n\tPFN_vkDestroySampler vkDestroySampler;\n\tPFN_vkDestroySemaphore vkDestroySemaphore;\n\tPFN_vkDestroyShaderModule vkDestroyShaderModule;\n\tPFN_vkDeviceWaitIdle vkDeviceWaitIdle;\n\tPFN_vkEndCommandBuffer vkEndCommandBuffer;\n\tPFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges;\n\tPFN_vkFreeCommandBuffers vkFreeCommandBuffers;\n\tPFN_vkFreeDescriptorSets vkFreeDescriptorSets;\n\tPFN_vkFreeMemory vkFreeMemory;\n\tPFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements;\n\tPFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment;\n\tPFN_vkGetDeviceQueue vkGetDeviceQueue;\n\tPFN_vkGetEventStatus vkGetEventStatus;\n\tPFN_vkGetFenceStatus vkGetFenceStatus;\n\tPFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements;\n\tPFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements;\n\tPFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout;\n\tPFN_vkGetPipelineCacheData vkGetPipelineCacheData;\n\tPFN_vkGetQueryPoolResults vkGetQueryPoolResults;\n\tPFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity;\n\tPFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges;\n\tPFN_vkMapMemory vkMapMemory;\n\tPFN_vkMergePipelineCaches vkMergePipelineCaches;\n\tPFN_vkQueueBindSparse vkQueueBindSparse;\n\tPFN_vkQueueSubmit vkQueueSubmit;\n\tPFN_vkQueueWaitIdle vkQueueWaitIdle;\n\tPFN_vkResetCommandBuffer vkResetCommandBuffer;\n\tPFN_vkResetCommandPool vkResetCommandPool;\n\tPFN_vkResetDescriptorPool vkResetDescriptorPool;\n\tPFN_vkResetEvent vkResetEvent;\n\tPFN_vkResetFences vkResetFences;\n\tPFN_vkSetEvent vkSetEvent;\n\tPFN_vkUnmapMemory vkUnmapMemory;\n\tPFN_vkUpdateDescriptorSets vkUpdateDescriptorSets;\n\tPFN_vkWaitForFences vkWaitForFences;\n#endif /* defined(VK_VERSION_1_0) */\n#if defined(VK_VERSION_1_1)\n\tPFN_vkBindBufferMemory2 vkBindBufferMemory2;\n\tPFN_vkBindImageMemory2 vkBindImageMemory2;\n\tPFN_vkCmdDispatchBase vkCmdDispatchBase;\n\tPFN_vkCmdSetDeviceMask vkCmdSetDeviceMask;\n\tPFN_vkCreateDescriptorUpdateTemplate vkCreateDescriptorUpdateTemplate;\n\tPFN_vkCreateSamplerYcbcrConversion vkCreateSamplerYcbcrConversion;\n\tPFN_vkDestroyDescriptorUpdateTemplate vkDestroyDescriptorUpdateTemplate;\n\tPFN_vkDestroySamplerYcbcrConversion vkDestroySamplerYcbcrConversion;\n\tPFN_vkGetBufferMemoryRequirements2 vkGetBufferMemoryRequirements2;\n\tPFN_vkGetDescriptorSetLayoutSupport vkGetDescriptorSetLayoutSupport;\n\tPFN_vkGetDeviceGroupPeerMemoryFeatures vkGetDeviceGroupPeerMemoryFeatures;\n\tPFN_vkGetDeviceQueue2 vkGetDeviceQueue2;\n\tPFN_vkGetImageMemoryRequirements2 vkGetImageMemoryRequirements2;\n\tPFN_vkGetImageSparseMemoryRequirements2 vkGetImageSparseMemoryRequirements2;\n\tPFN_vkTrimCommandPool vkTrimCommandPool;\n\tPFN_vkUpdateDescriptorSetWithTemplate vkUpdateDescriptorSetWithTemplate;\n#endif /* defined(VK_VERSION_1_1) */\n#if defined(VK_VERSION_1_2)\n\tPFN_vkCmdBeginRenderPass2 vkCmdBeginRenderPass2;\n\tPFN_vkCmdDrawIndexedIndirectCount vkCmdDrawIndexedIndirectCount;\n\tPFN_vkCmdDrawIndirectCount vkCmdDrawIndirectCount;\n\tPFN_vkCmdEndRenderPass2 vkCmdEndRenderPass2;\n\tPFN_vkCmdNextSubpass2 vkCmdNextSubpass2;\n\tPFN_vkCreateRenderPass2 vkCreateRenderPass2;\n\tPFN_vkGetBufferDeviceAddress vkGetBufferDeviceAddress;\n\tPFN_vkGetBufferOpaqueCaptureAddress vkGetBufferOpaqueCaptureAddress;\n\tPFN_vkGetDeviceMemoryOpaqueCaptureAddress vkGetDeviceMemoryOpaqueCaptureAddress;\n\tPFN_vkGetSemaphoreCounterValue vkGetSemaphoreCounterValue;\n\tPFN_vkResetQueryPool vkResetQueryPool;\n\tPFN_vkSignalSemaphore vkSignalSemaphore;\n\tPFN_vkWaitSemaphores vkWaitSemaphores;\n#endif /* defined(VK_VERSION_1_2) */\n#if defined(VK_VERSION_1_3)\n\tPFN_vkCmdBeginRendering vkCmdBeginRendering;\n\tPFN_vkCmdBindVertexBuffers2 vkCmdBindVertexBuffers2;\n\tPFN_vkCmdBlitImage2 vkCmdBlitImage2;\n\tPFN_vkCmdCopyBuffer2 vkCmdCopyBuffer2;\n\tPFN_vkCmdCopyBufferToImage2 vkCmdCopyBufferToImage2;\n\tPFN_vkCmdCopyImage2 vkCmdCopyImage2;\n\tPFN_vkCmdCopyImageToBuffer2 vkCmdCopyImageToBuffer2;\n\tPFN_vkCmdEndRendering vkCmdEndRendering;\n\tPFN_vkCmdPipelineBarrier2 vkCmdPipelineBarrier2;\n\tPFN_vkCmdResetEvent2 vkCmdResetEvent2;\n\tPFN_vkCmdResolveImage2 vkCmdResolveImage2;\n\tPFN_vkCmdSetCullMode vkCmdSetCullMode;\n\tPFN_vkCmdSetDepthBiasEnable vkCmdSetDepthBiasEnable;\n\tPFN_vkCmdSetDepthBoundsTestEnable vkCmdSetDepthBoundsTestEnable;\n\tPFN_vkCmdSetDepthCompareOp vkCmdSetDepthCompareOp;\n\tPFN_vkCmdSetDepthTestEnable vkCmdSetDepthTestEnable;\n\tPFN_vkCmdSetDepthWriteEnable vkCmdSetDepthWriteEnable;\n\tPFN_vkCmdSetEvent2 vkCmdSetEvent2;\n\tPFN_vkCmdSetFrontFace vkCmdSetFrontFace;\n\tPFN_vkCmdSetPrimitiveRestartEnable vkCmdSetPrimitiveRestartEnable;\n\tPFN_vkCmdSetPrimitiveTopology vkCmdSetPrimitiveTopology;\n\tPFN_vkCmdSetRasterizerDiscardEnable vkCmdSetRasterizerDiscardEnable;\n\tPFN_vkCmdSetScissorWithCount vkCmdSetScissorWithCount;\n\tPFN_vkCmdSetStencilOp vkCmdSetStencilOp;\n\tPFN_vkCmdSetStencilTestEnable vkCmdSetStencilTestEnable;\n\tPFN_vkCmdSetViewportWithCount vkCmdSetViewportWithCount;\n\tPFN_vkCmdWaitEvents2 vkCmdWaitEvents2;\n\tPFN_vkCmdWriteTimestamp2 vkCmdWriteTimestamp2;\n\tPFN_vkCreatePrivateDataSlot vkCreatePrivateDataSlot;\n\tPFN_vkDestroyPrivateDataSlot vkDestroyPrivateDataSlot;\n\tPFN_vkGetDeviceBufferMemoryRequirements vkGetDeviceBufferMemoryRequirements;\n\tPFN_vkGetDeviceImageMemoryRequirements vkGetDeviceImageMemoryRequirements;\n\tPFN_vkGetDeviceImageSparseMemoryRequirements vkGetDeviceImageSparseMemoryRequirements;\n\tPFN_vkGetPrivateData vkGetPrivateData;\n\tPFN_vkQueueSubmit2 vkQueueSubmit2;\n\tPFN_vkSetPrivateData vkSetPrivateData;\n#endif /* defined(VK_VERSION_1_3) */\n#if defined(VK_VERSION_1_4)\n\tPFN_vkCmdBindDescriptorSets2 vkCmdBindDescriptorSets2;\n\tPFN_vkCmdBindIndexBuffer2 vkCmdBindIndexBuffer2;\n\tPFN_vkCmdPushConstants2 vkCmdPushConstants2;\n\tPFN_vkCmdPushDescriptorSet vkCmdPushDescriptorSet;\n\tPFN_vkCmdPushDescriptorSet2 vkCmdPushDescriptorSet2;\n\tPFN_vkCmdPushDescriptorSetWithTemplate vkCmdPushDescriptorSetWithTemplate;\n\tPFN_vkCmdPushDescriptorSetWithTemplate2 vkCmdPushDescriptorSetWithTemplate2;\n\tPFN_vkCmdSetLineStipple vkCmdSetLineStipple;\n\tPFN_vkCmdSetRenderingAttachmentLocations vkCmdSetRenderingAttachmentLocations;\n\tPFN_vkCmdSetRenderingInputAttachmentIndices vkCmdSetRenderingInputAttachmentIndices;\n\tPFN_vkCopyImageToImage vkCopyImageToImage;\n\tPFN_vkCopyImageToMemory vkCopyImageToMemory;\n\tPFN_vkCopyMemoryToImage vkCopyMemoryToImage;\n\tPFN_vkGetDeviceImageSubresourceLayout vkGetDeviceImageSubresourceLayout;\n\tPFN_vkGetImageSubresourceLayout2 vkGetImageSubresourceLayout2;\n\tPFN_vkGetRenderingAreaGranularity vkGetRenderingAreaGranularity;\n\tPFN_vkMapMemory2 vkMapMemory2;\n\tPFN_vkTransitionImageLayout vkTransitionImageLayout;\n\tPFN_vkUnmapMemory2 vkUnmapMemory2;\n#endif /* defined(VK_VERSION_1_4) */\n#if defined(VK_AMDX_shader_enqueue)\n\tPFN_vkCmdDispatchGraphAMDX vkCmdDispatchGraphAMDX;\n\tPFN_vkCmdDispatchGraphIndirectAMDX vkCmdDispatchGraphIndirectAMDX;\n\tPFN_vkCmdDispatchGraphIndirectCountAMDX vkCmdDispatchGraphIndirectCountAMDX;\n\tPFN_vkCmdInitializeGraphScratchMemoryAMDX vkCmdInitializeGraphScratchMemoryAMDX;\n\tPFN_vkCreateExecutionGraphPipelinesAMDX vkCreateExecutionGraphPipelinesAMDX;\n\tPFN_vkGetExecutionGraphPipelineNodeIndexAMDX vkGetExecutionGraphPipelineNodeIndexAMDX;\n\tPFN_vkGetExecutionGraphPipelineScratchSizeAMDX vkGetExecutionGraphPipelineScratchSizeAMDX;\n#endif /* defined(VK_AMDX_shader_enqueue) */\n#if defined(VK_AMD_anti_lag)\n\tPFN_vkAntiLagUpdateAMD vkAntiLagUpdateAMD;\n#endif /* defined(VK_AMD_anti_lag) */\n#if defined(VK_AMD_buffer_marker)\n\tPFN_vkCmdWriteBufferMarkerAMD vkCmdWriteBufferMarkerAMD;\n#endif /* defined(VK_AMD_buffer_marker) */\n#if defined(VK_AMD_buffer_marker) && (defined(VK_VERSION_1_3) || defined(VK_KHR_synchronization2))\n\tPFN_vkCmdWriteBufferMarker2AMD vkCmdWriteBufferMarker2AMD;\n#endif /* defined(VK_AMD_buffer_marker) && (defined(VK_VERSION_1_3) || defined(VK_KHR_synchronization2)) */\n#if defined(VK_AMD_display_native_hdr)\n\tPFN_vkSetLocalDimmingAMD vkSetLocalDimmingAMD;\n#endif /* defined(VK_AMD_display_native_hdr) */\n#if defined(VK_AMD_draw_indirect_count)\n\tPFN_vkCmdDrawIndexedIndirectCountAMD vkCmdDrawIndexedIndirectCountAMD;\n\tPFN_vkCmdDrawIndirectCountAMD vkCmdDrawIndirectCountAMD;\n#endif /* defined(VK_AMD_draw_indirect_count) */\n#if defined(VK_AMD_shader_info)\n\tPFN_vkGetShaderInfoAMD vkGetShaderInfoAMD;\n#endif /* defined(VK_AMD_shader_info) */\n#if defined(VK_ANDROID_external_memory_android_hardware_buffer)\n\tPFN_vkGetAndroidHardwareBufferPropertiesANDROID vkGetAndroidHardwareBufferPropertiesANDROID;\n\tPFN_vkGetMemoryAndroidHardwareBufferANDROID vkGetMemoryAndroidHardwareBufferANDROID;\n#endif /* defined(VK_ANDROID_external_memory_android_hardware_buffer) */\n#if defined(VK_EXT_attachment_feedback_loop_dynamic_state)\n\tPFN_vkCmdSetAttachmentFeedbackLoopEnableEXT vkCmdSetAttachmentFeedbackLoopEnableEXT;\n#endif /* defined(VK_EXT_attachment_feedback_loop_dynamic_state) */\n#if defined(VK_EXT_buffer_device_address)\n\tPFN_vkGetBufferDeviceAddressEXT vkGetBufferDeviceAddressEXT;\n#endif /* defined(VK_EXT_buffer_device_address) */\n#if defined(VK_EXT_calibrated_timestamps)\n\tPFN_vkGetCalibratedTimestampsEXT vkGetCalibratedTimestampsEXT;\n#endif /* defined(VK_EXT_calibrated_timestamps) */\n#if defined(VK_EXT_color_write_enable)\n\tPFN_vkCmdSetColorWriteEnableEXT vkCmdSetColorWriteEnableEXT;\n#endif /* defined(VK_EXT_color_write_enable) */\n#if defined(VK_EXT_conditional_rendering)\n\tPFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT;\n\tPFN_vkCmdEndConditionalRenderingEXT vkCmdEndConditionalRenderingEXT;\n#endif /* defined(VK_EXT_conditional_rendering) */\n#if defined(VK_EXT_debug_marker)\n\tPFN_vkCmdDebugMarkerBeginEXT vkCmdDebugMarkerBeginEXT;\n\tPFN_vkCmdDebugMarkerEndEXT vkCmdDebugMarkerEndEXT;\n\tPFN_vkCmdDebugMarkerInsertEXT vkCmdDebugMarkerInsertEXT;\n\tPFN_vkDebugMarkerSetObjectNameEXT vkDebugMarkerSetObjectNameEXT;\n\tPFN_vkDebugMarkerSetObjectTagEXT vkDebugMarkerSetObjectTagEXT;\n#endif /* defined(VK_EXT_debug_marker) */\n#if defined(VK_EXT_depth_bias_control)\n\tPFN_vkCmdSetDepthBias2EXT vkCmdSetDepthBias2EXT;\n#endif /* defined(VK_EXT_depth_bias_control) */\n#if defined(VK_EXT_descriptor_buffer)\n\tPFN_vkCmdBindDescriptorBufferEmbeddedSamplersEXT vkCmdBindDescriptorBufferEmbeddedSamplersEXT;\n\tPFN_vkCmdBindDescriptorBuffersEXT vkCmdBindDescriptorBuffersEXT;\n\tPFN_vkCmdSetDescriptorBufferOffsetsEXT vkCmdSetDescriptorBufferOffsetsEXT;\n\tPFN_vkGetBufferOpaqueCaptureDescriptorDataEXT vkGetBufferOpaqueCaptureDescriptorDataEXT;\n\tPFN_vkGetDescriptorEXT vkGetDescriptorEXT;\n\tPFN_vkGetDescriptorSetLayoutBindingOffsetEXT vkGetDescriptorSetLayoutBindingOffsetEXT;\n\tPFN_vkGetDescriptorSetLayoutSizeEXT vkGetDescriptorSetLayoutSizeEXT;\n\tPFN_vkGetImageOpaqueCaptureDescriptorDataEXT vkGetImageOpaqueCaptureDescriptorDataEXT;\n\tPFN_vkGetImageViewOpaqueCaptureDescriptorDataEXT vkGetImageViewOpaqueCaptureDescriptorDataEXT;\n\tPFN_vkGetSamplerOpaqueCaptureDescriptorDataEXT vkGetSamplerOpaqueCaptureDescriptorDataEXT;\n#endif /* defined(VK_EXT_descriptor_buffer) */\n#if defined(VK_EXT_descriptor_buffer) && (defined(VK_KHR_acceleration_structure) || defined(VK_NV_ray_tracing))\n\tPFN_vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT;\n#endif /* defined(VK_EXT_descriptor_buffer) && (defined(VK_KHR_acceleration_structure) || defined(VK_NV_ray_tracing)) */\n#if defined(VK_EXT_device_fault)\n\tPFN_vkGetDeviceFaultInfoEXT vkGetDeviceFaultInfoEXT;\n#endif /* defined(VK_EXT_device_fault) */\n#if defined(VK_EXT_device_generated_commands)\n\tPFN_vkCmdExecuteGeneratedCommandsEXT vkCmdExecuteGeneratedCommandsEXT;\n\tPFN_vkCmdPreprocessGeneratedCommandsEXT vkCmdPreprocessGeneratedCommandsEXT;\n\tPFN_vkCreateIndirectCommandsLayoutEXT vkCreateIndirectCommandsLayoutEXT;\n\tPFN_vkCreateIndirectExecutionSetEXT vkCreateIndirectExecutionSetEXT;\n\tPFN_vkDestroyIndirectCommandsLayoutEXT vkDestroyIndirectCommandsLayoutEXT;\n\tPFN_vkDestroyIndirectExecutionSetEXT vkDestroyIndirectExecutionSetEXT;\n\tPFN_vkGetGeneratedCommandsMemoryRequirementsEXT vkGetGeneratedCommandsMemoryRequirementsEXT;\n\tPFN_vkUpdateIndirectExecutionSetPipelineEXT vkUpdateIndirectExecutionSetPipelineEXT;\n\tPFN_vkUpdateIndirectExecutionSetShaderEXT vkUpdateIndirectExecutionSetShaderEXT;\n#endif /* defined(VK_EXT_device_generated_commands) */\n#if defined(VK_EXT_discard_rectangles)\n\tPFN_vkCmdSetDiscardRectangleEXT vkCmdSetDiscardRectangleEXT;\n#endif /* defined(VK_EXT_discard_rectangles) */\n#if defined(VK_EXT_discard_rectangles) && VK_EXT_DISCARD_RECTANGLES_SPEC_VERSION >= 2\n\tPFN_vkCmdSetDiscardRectangleEnableEXT vkCmdSetDiscardRectangleEnableEXT;\n\tPFN_vkCmdSetDiscardRectangleModeEXT vkCmdSetDiscardRectangleModeEXT;\n#endif /* defined(VK_EXT_discard_rectangles) && VK_EXT_DISCARD_RECTANGLES_SPEC_VERSION >= 2 */\n#if defined(VK_EXT_display_control)\n\tPFN_vkDisplayPowerControlEXT vkDisplayPowerControlEXT;\n\tPFN_vkGetSwapchainCounterEXT vkGetSwapchainCounterEXT;\n\tPFN_vkRegisterDeviceEventEXT vkRegisterDeviceEventEXT;\n\tPFN_vkRegisterDisplayEventEXT vkRegisterDisplayEventEXT;\n#endif /* defined(VK_EXT_display_control) */\n#if defined(VK_EXT_external_memory_host)\n\tPFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT;\n#endif /* defined(VK_EXT_external_memory_host) */\n#if defined(VK_EXT_external_memory_metal)\n\tPFN_vkGetMemoryMetalHandleEXT vkGetMemoryMetalHandleEXT;\n\tPFN_vkGetMemoryMetalHandlePropertiesEXT vkGetMemoryMetalHandlePropertiesEXT;\n#endif /* defined(VK_EXT_external_memory_metal) */\n#if defined(VK_EXT_full_screen_exclusive)\n\tPFN_vkAcquireFullScreenExclusiveModeEXT vkAcquireFullScreenExclusiveModeEXT;\n\tPFN_vkReleaseFullScreenExclusiveModeEXT vkReleaseFullScreenExclusiveModeEXT;\n#endif /* defined(VK_EXT_full_screen_exclusive) */\n#if defined(VK_EXT_full_screen_exclusive) && (defined(VK_KHR_device_group) || defined(VK_VERSION_1_1))\n\tPFN_vkGetDeviceGroupSurfacePresentModes2EXT vkGetDeviceGroupSurfacePresentModes2EXT;\n#endif /* defined(VK_EXT_full_screen_exclusive) && (defined(VK_KHR_device_group) || defined(VK_VERSION_1_1)) */\n#if defined(VK_EXT_hdr_metadata)\n\tPFN_vkSetHdrMetadataEXT vkSetHdrMetadataEXT;\n#endif /* defined(VK_EXT_hdr_metadata) */\n#if defined(VK_EXT_host_image_copy)\n\tPFN_vkCopyImageToImageEXT vkCopyImageToImageEXT;\n\tPFN_vkCopyImageToMemoryEXT vkCopyImageToMemoryEXT;\n\tPFN_vkCopyMemoryToImageEXT vkCopyMemoryToImageEXT;\n\tPFN_vkTransitionImageLayoutEXT vkTransitionImageLayoutEXT;\n#endif /* defined(VK_EXT_host_image_copy) */\n#if defined(VK_EXT_host_query_reset)\n\tPFN_vkResetQueryPoolEXT vkResetQueryPoolEXT;\n#endif /* defined(VK_EXT_host_query_reset) */\n#if defined(VK_EXT_image_drm_format_modifier)\n\tPFN_vkGetImageDrmFormatModifierPropertiesEXT vkGetImageDrmFormatModifierPropertiesEXT;\n#endif /* defined(VK_EXT_image_drm_format_modifier) */\n#if defined(VK_EXT_line_rasterization)\n\tPFN_vkCmdSetLineStippleEXT vkCmdSetLineStippleEXT;\n#endif /* defined(VK_EXT_line_rasterization) */\n#if defined(VK_EXT_mesh_shader)\n\tPFN_vkCmdDrawMeshTasksEXT vkCmdDrawMeshTasksEXT;\n\tPFN_vkCmdDrawMeshTasksIndirectEXT vkCmdDrawMeshTasksIndirectEXT;\n#endif /* defined(VK_EXT_mesh_shader) */\n#if defined(VK_EXT_mesh_shader) && (defined(VK_KHR_draw_indirect_count) || defined(VK_VERSION_1_2))\n\tPFN_vkCmdDrawMeshTasksIndirectCountEXT vkCmdDrawMeshTasksIndirectCountEXT;\n#endif /* defined(VK_EXT_mesh_shader) && (defined(VK_KHR_draw_indirect_count) || defined(VK_VERSION_1_2)) */\n#if defined(VK_EXT_metal_objects)\n\tPFN_vkExportMetalObjectsEXT vkExportMetalObjectsEXT;\n#endif /* defined(VK_EXT_metal_objects) */\n#if defined(VK_EXT_multi_draw)\n\tPFN_vkCmdDrawMultiEXT vkCmdDrawMultiEXT;\n\tPFN_vkCmdDrawMultiIndexedEXT vkCmdDrawMultiIndexedEXT;\n#endif /* defined(VK_EXT_multi_draw) */\n#if defined(VK_EXT_opacity_micromap)\n\tPFN_vkBuildMicromapsEXT vkBuildMicromapsEXT;\n\tPFN_vkCmdBuildMicromapsEXT vkCmdBuildMicromapsEXT;\n\tPFN_vkCmdCopyMemoryToMicromapEXT vkCmdCopyMemoryToMicromapEXT;\n\tPFN_vkCmdCopyMicromapEXT vkCmdCopyMicromapEXT;\n\tPFN_vkCmdCopyMicromapToMemoryEXT vkCmdCopyMicromapToMemoryEXT;\n\tPFN_vkCmdWriteMicromapsPropertiesEXT vkCmdWriteMicromapsPropertiesEXT;\n\tPFN_vkCopyMemoryToMicromapEXT vkCopyMemoryToMicromapEXT;\n\tPFN_vkCopyMicromapEXT vkCopyMicromapEXT;\n\tPFN_vkCopyMicromapToMemoryEXT vkCopyMicromapToMemoryEXT;\n\tPFN_vkCreateMicromapEXT vkCreateMicromapEXT;\n\tPFN_vkDestroyMicromapEXT vkDestroyMicromapEXT;\n\tPFN_vkGetDeviceMicromapCompatibilityEXT vkGetDeviceMicromapCompatibilityEXT;\n\tPFN_vkGetMicromapBuildSizesEXT vkGetMicromapBuildSizesEXT;\n\tPFN_vkWriteMicromapsPropertiesEXT vkWriteMicromapsPropertiesEXT;\n#endif /* defined(VK_EXT_opacity_micromap) */\n#if defined(VK_EXT_pageable_device_local_memory)\n\tPFN_vkSetDeviceMemoryPriorityEXT vkSetDeviceMemoryPriorityEXT;\n#endif /* defined(VK_EXT_pageable_device_local_memory) */\n#if defined(VK_EXT_pipeline_properties)\n\tPFN_vkGetPipelinePropertiesEXT vkGetPipelinePropertiesEXT;\n#endif /* defined(VK_EXT_pipeline_properties) */\n#if defined(VK_EXT_private_data)\n\tPFN_vkCreatePrivateDataSlotEXT vkCreatePrivateDataSlotEXT;\n\tPFN_vkDestroyPrivateDataSlotEXT vkDestroyPrivateDataSlotEXT;\n\tPFN_vkGetPrivateDataEXT vkGetPrivateDataEXT;\n\tPFN_vkSetPrivateDataEXT vkSetPrivateDataEXT;\n#endif /* defined(VK_EXT_private_data) */\n#if defined(VK_EXT_sample_locations)\n\tPFN_vkCmdSetSampleLocationsEXT vkCmdSetSampleLocationsEXT;\n#endif /* defined(VK_EXT_sample_locations) */\n#if defined(VK_EXT_shader_module_identifier)\n\tPFN_vkGetShaderModuleCreateInfoIdentifierEXT vkGetShaderModuleCreateInfoIdentifierEXT;\n\tPFN_vkGetShaderModuleIdentifierEXT vkGetShaderModuleIdentifierEXT;\n#endif /* defined(VK_EXT_shader_module_identifier) */\n#if defined(VK_EXT_shader_object)\n\tPFN_vkCmdBindShadersEXT vkCmdBindShadersEXT;\n\tPFN_vkCreateShadersEXT vkCreateShadersEXT;\n\tPFN_vkDestroyShaderEXT vkDestroyShaderEXT;\n\tPFN_vkGetShaderBinaryDataEXT vkGetShaderBinaryDataEXT;\n#endif /* defined(VK_EXT_shader_object) */\n#if defined(VK_EXT_swapchain_maintenance1)\n\tPFN_vkReleaseSwapchainImagesEXT vkReleaseSwapchainImagesEXT;\n#endif /* defined(VK_EXT_swapchain_maintenance1) */\n#if defined(VK_EXT_transform_feedback)\n\tPFN_vkCmdBeginQueryIndexedEXT vkCmdBeginQueryIndexedEXT;\n\tPFN_vkCmdBeginTransformFeedbackEXT vkCmdBeginTransformFeedbackEXT;\n\tPFN_vkCmdBindTransformFeedbackBuffersEXT vkCmdBindTransformFeedbackBuffersEXT;\n\tPFN_vkCmdDrawIndirectByteCountEXT vkCmdDrawIndirectByteCountEXT;\n\tPFN_vkCmdEndQueryIndexedEXT vkCmdEndQueryIndexedEXT;\n\tPFN_vkCmdEndTransformFeedbackEXT vkCmdEndTransformFeedbackEXT;\n#endif /* defined(VK_EXT_transform_feedback) */\n#if defined(VK_EXT_validation_cache)\n\tPFN_vkCreateValidationCacheEXT vkCreateValidationCacheEXT;\n\tPFN_vkDestroyValidationCacheEXT vkDestroyValidationCacheEXT;\n\tPFN_vkGetValidationCacheDataEXT vkGetValidationCacheDataEXT;\n\tPFN_vkMergeValidationCachesEXT vkMergeValidationCachesEXT;\n#endif /* defined(VK_EXT_validation_cache) */\n#if defined(VK_FUCHSIA_buffer_collection)\n\tPFN_vkCreateBufferCollectionFUCHSIA vkCreateBufferCollectionFUCHSIA;\n\tPFN_vkDestroyBufferCollectionFUCHSIA vkDestroyBufferCollectionFUCHSIA;\n\tPFN_vkGetBufferCollectionPropertiesFUCHSIA vkGetBufferCollectionPropertiesFUCHSIA;\n\tPFN_vkSetBufferCollectionBufferConstraintsFUCHSIA vkSetBufferCollectionBufferConstraintsFUCHSIA;\n\tPFN_vkSetBufferCollectionImageConstraintsFUCHSIA vkSetBufferCollectionImageConstraintsFUCHSIA;\n#endif /* defined(VK_FUCHSIA_buffer_collection) */\n#if defined(VK_FUCHSIA_external_memory)\n\tPFN_vkGetMemoryZirconHandleFUCHSIA vkGetMemoryZirconHandleFUCHSIA;\n\tPFN_vkGetMemoryZirconHandlePropertiesFUCHSIA vkGetMemoryZirconHandlePropertiesFUCHSIA;\n#endif /* defined(VK_FUCHSIA_external_memory) */\n#if defined(VK_FUCHSIA_external_semaphore)\n\tPFN_vkGetSemaphoreZirconHandleFUCHSIA vkGetSemaphoreZirconHandleFUCHSIA;\n\tPFN_vkImportSemaphoreZirconHandleFUCHSIA vkImportSemaphoreZirconHandleFUCHSIA;\n#endif /* defined(VK_FUCHSIA_external_semaphore) */\n#if defined(VK_GOOGLE_display_timing)\n\tPFN_vkGetPastPresentationTimingGOOGLE vkGetPastPresentationTimingGOOGLE;\n\tPFN_vkGetRefreshCycleDurationGOOGLE vkGetRefreshCycleDurationGOOGLE;\n#endif /* defined(VK_GOOGLE_display_timing) */\n#if defined(VK_HUAWEI_cluster_culling_shader)\n\tPFN_vkCmdDrawClusterHUAWEI vkCmdDrawClusterHUAWEI;\n\tPFN_vkCmdDrawClusterIndirectHUAWEI vkCmdDrawClusterIndirectHUAWEI;\n#endif /* defined(VK_HUAWEI_cluster_culling_shader) */\n#if defined(VK_HUAWEI_invocation_mask)\n\tPFN_vkCmdBindInvocationMaskHUAWEI vkCmdBindInvocationMaskHUAWEI;\n#endif /* defined(VK_HUAWEI_invocation_mask) */\n#if defined(VK_HUAWEI_subpass_shading) && VK_HUAWEI_SUBPASS_SHADING_SPEC_VERSION >= 2\n\tPFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI;\n#endif /* defined(VK_HUAWEI_subpass_shading) && VK_HUAWEI_SUBPASS_SHADING_SPEC_VERSION >= 2 */\n#if defined(VK_HUAWEI_subpass_shading)\n\tPFN_vkCmdSubpassShadingHUAWEI vkCmdSubpassShadingHUAWEI;\n#endif /* defined(VK_HUAWEI_subpass_shading) */\n#if defined(VK_INTEL_performance_query)\n\tPFN_vkAcquirePerformanceConfigurationINTEL vkAcquirePerformanceConfigurationINTEL;\n\tPFN_vkCmdSetPerformanceMarkerINTEL vkCmdSetPerformanceMarkerINTEL;\n\tPFN_vkCmdSetPerformanceOverrideINTEL vkCmdSetPerformanceOverrideINTEL;\n\tPFN_vkCmdSetPerformanceStreamMarkerINTEL vkCmdSetPerformanceStreamMarkerINTEL;\n\tPFN_vkGetPerformanceParameterINTEL vkGetPerformanceParameterINTEL;\n\tPFN_vkInitializePerformanceApiINTEL vkInitializePerformanceApiINTEL;\n\tPFN_vkQueueSetPerformanceConfigurationINTEL vkQueueSetPerformanceConfigurationINTEL;\n\tPFN_vkReleasePerformanceConfigurationINTEL vkReleasePerformanceConfigurationINTEL;\n\tPFN_vkUninitializePerformanceApiINTEL vkUninitializePerformanceApiINTEL;\n#endif /* defined(VK_INTEL_performance_query) */\n#if defined(VK_KHR_acceleration_structure)\n\tPFN_vkBuildAccelerationStructuresKHR vkBuildAccelerationStructuresKHR;\n\tPFN_vkCmdBuildAccelerationStructuresIndirectKHR vkCmdBuildAccelerationStructuresIndirectKHR;\n\tPFN_vkCmdBuildAccelerationStructuresKHR vkCmdBuildAccelerationStructuresKHR;\n\tPFN_vkCmdCopyAccelerationStructureKHR vkCmdCopyAccelerationStructureKHR;\n\tPFN_vkCmdCopyAccelerationStructureToMemoryKHR vkCmdCopyAccelerationStructureToMemoryKHR;\n\tPFN_vkCmdCopyMemoryToAccelerationStructureKHR vkCmdCopyMemoryToAccelerationStructureKHR;\n\tPFN_vkCmdWriteAccelerationStructuresPropertiesKHR vkCmdWriteAccelerationStructuresPropertiesKHR;\n\tPFN_vkCopyAccelerationStructureKHR vkCopyAccelerationStructureKHR;\n\tPFN_vkCopyAccelerationStructureToMemoryKHR vkCopyAccelerationStructureToMemoryKHR;\n\tPFN_vkCopyMemoryToAccelerationStructureKHR vkCopyMemoryToAccelerationStructureKHR;\n\tPFN_vkCreateAccelerationStructureKHR vkCreateAccelerationStructureKHR;\n\tPFN_vkDestroyAccelerationStructureKHR vkDestroyAccelerationStructureKHR;\n\tPFN_vkGetAccelerationStructureBuildSizesKHR vkGetAccelerationStructureBuildSizesKHR;\n\tPFN_vkGetAccelerationStructureDeviceAddressKHR vkGetAccelerationStructureDeviceAddressKHR;\n\tPFN_vkGetDeviceAccelerationStructureCompatibilityKHR vkGetDeviceAccelerationStructureCompatibilityKHR;\n\tPFN_vkWriteAccelerationStructuresPropertiesKHR vkWriteAccelerationStructuresPropertiesKHR;\n#endif /* defined(VK_KHR_acceleration_structure) */\n#if defined(VK_KHR_bind_memory2)\n\tPFN_vkBindBufferMemory2KHR vkBindBufferMemory2KHR;\n\tPFN_vkBindImageMemory2KHR vkBindImageMemory2KHR;\n#endif /* defined(VK_KHR_bind_memory2) */\n#if defined(VK_KHR_buffer_device_address)\n\tPFN_vkGetBufferDeviceAddressKHR vkGetBufferDeviceAddressKHR;\n\tPFN_vkGetBufferOpaqueCaptureAddressKHR vkGetBufferOpaqueCaptureAddressKHR;\n\tPFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR vkGetDeviceMemoryOpaqueCaptureAddressKHR;\n#endif /* defined(VK_KHR_buffer_device_address) */\n#if defined(VK_KHR_calibrated_timestamps)\n\tPFN_vkGetCalibratedTimestampsKHR vkGetCalibratedTimestampsKHR;\n#endif /* defined(VK_KHR_calibrated_timestamps) */\n#if defined(VK_KHR_copy_commands2)\n\tPFN_vkCmdBlitImage2KHR vkCmdBlitImage2KHR;\n\tPFN_vkCmdCopyBuffer2KHR vkCmdCopyBuffer2KHR;\n\tPFN_vkCmdCopyBufferToImage2KHR vkCmdCopyBufferToImage2KHR;\n\tPFN_vkCmdCopyImage2KHR vkCmdCopyImage2KHR;\n\tPFN_vkCmdCopyImageToBuffer2KHR vkCmdCopyImageToBuffer2KHR;\n\tPFN_vkCmdResolveImage2KHR vkCmdResolveImage2KHR;\n#endif /* defined(VK_KHR_copy_commands2) */\n#if defined(VK_KHR_create_renderpass2)\n\tPFN_vkCmdBeginRenderPass2KHR vkCmdBeginRenderPass2KHR;\n\tPFN_vkCmdEndRenderPass2KHR vkCmdEndRenderPass2KHR;\n\tPFN_vkCmdNextSubpass2KHR vkCmdNextSubpass2KHR;\n\tPFN_vkCreateRenderPass2KHR vkCreateRenderPass2KHR;\n#endif /* defined(VK_KHR_create_renderpass2) */\n#if defined(VK_KHR_deferred_host_operations)\n\tPFN_vkCreateDeferredOperationKHR vkCreateDeferredOperationKHR;\n\tPFN_vkDeferredOperationJoinKHR vkDeferredOperationJoinKHR;\n\tPFN_vkDestroyDeferredOperationKHR vkDestroyDeferredOperationKHR;\n\tPFN_vkGetDeferredOperationMaxConcurrencyKHR vkGetDeferredOperationMaxConcurrencyKHR;\n\tPFN_vkGetDeferredOperationResultKHR vkGetDeferredOperationResultKHR;\n#endif /* defined(VK_KHR_deferred_host_operations) */\n#if defined(VK_KHR_descriptor_update_template)\n\tPFN_vkCreateDescriptorUpdateTemplateKHR vkCreateDescriptorUpdateTemplateKHR;\n\tPFN_vkDestroyDescriptorUpdateTemplateKHR vkDestroyDescriptorUpdateTemplateKHR;\n\tPFN_vkUpdateDescriptorSetWithTemplateKHR vkUpdateDescriptorSetWithTemplateKHR;\n#endif /* defined(VK_KHR_descriptor_update_template) */\n#if defined(VK_KHR_device_group)\n\tPFN_vkCmdDispatchBaseKHR vkCmdDispatchBaseKHR;\n\tPFN_vkCmdSetDeviceMaskKHR vkCmdSetDeviceMaskKHR;\n\tPFN_vkGetDeviceGroupPeerMemoryFeaturesKHR vkGetDeviceGroupPeerMemoryFeaturesKHR;\n#endif /* defined(VK_KHR_device_group) */\n#if defined(VK_KHR_display_swapchain)\n\tPFN_vkCreateSharedSwapchainsKHR vkCreateSharedSwapchainsKHR;\n#endif /* defined(VK_KHR_display_swapchain) */\n#if defined(VK_KHR_draw_indirect_count)\n\tPFN_vkCmdDrawIndexedIndirectCountKHR vkCmdDrawIndexedIndirectCountKHR;\n\tPFN_vkCmdDrawIndirectCountKHR vkCmdDrawIndirectCountKHR;\n#endif /* defined(VK_KHR_draw_indirect_count) */\n#if defined(VK_KHR_dynamic_rendering)\n\tPFN_vkCmdBeginRenderingKHR vkCmdBeginRenderingKHR;\n\tPFN_vkCmdEndRenderingKHR vkCmdEndRenderingKHR;\n#endif /* defined(VK_KHR_dynamic_rendering) */\n#if defined(VK_KHR_dynamic_rendering_local_read)\n\tPFN_vkCmdSetRenderingAttachmentLocationsKHR vkCmdSetRenderingAttachmentLocationsKHR;\n\tPFN_vkCmdSetRenderingInputAttachmentIndicesKHR vkCmdSetRenderingInputAttachmentIndicesKHR;\n#endif /* defined(VK_KHR_dynamic_rendering_local_read) */\n#if defined(VK_KHR_external_fence_fd)\n\tPFN_vkGetFenceFdKHR vkGetFenceFdKHR;\n\tPFN_vkImportFenceFdKHR vkImportFenceFdKHR;\n#endif /* defined(VK_KHR_external_fence_fd) */\n#if defined(VK_KHR_external_fence_win32)\n\tPFN_vkGetFenceWin32HandleKHR vkGetFenceWin32HandleKHR;\n\tPFN_vkImportFenceWin32HandleKHR vkImportFenceWin32HandleKHR;\n#endif /* defined(VK_KHR_external_fence_win32) */\n#if defined(VK_KHR_external_memory_fd)\n\tPFN_vkGetMemoryFdKHR vkGetMemoryFdKHR;\n\tPFN_vkGetMemoryFdPropertiesKHR vkGetMemoryFdPropertiesKHR;\n#endif /* defined(VK_KHR_external_memory_fd) */\n#if defined(VK_KHR_external_memory_win32)\n\tPFN_vkGetMemoryWin32HandleKHR vkGetMemoryWin32HandleKHR;\n\tPFN_vkGetMemoryWin32HandlePropertiesKHR vkGetMemoryWin32HandlePropertiesKHR;\n#endif /* defined(VK_KHR_external_memory_win32) */\n#if defined(VK_KHR_external_semaphore_fd)\n\tPFN_vkGetSemaphoreFdKHR vkGetSemaphoreFdKHR;\n\tPFN_vkImportSemaphoreFdKHR vkImportSemaphoreFdKHR;\n#endif /* defined(VK_KHR_external_semaphore_fd) */\n#if defined(VK_KHR_external_semaphore_win32)\n\tPFN_vkGetSemaphoreWin32HandleKHR vkGetSemaphoreWin32HandleKHR;\n\tPFN_vkImportSemaphoreWin32HandleKHR vkImportSemaphoreWin32HandleKHR;\n#endif /* defined(VK_KHR_external_semaphore_win32) */\n#if defined(VK_KHR_fragment_shading_rate)\n\tPFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR;\n#endif /* defined(VK_KHR_fragment_shading_rate) */\n#if defined(VK_KHR_get_memory_requirements2)\n\tPFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR;\n\tPFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR;\n\tPFN_vkGetImageSparseMemoryRequirements2KHR vkGetImageSparseMemoryRequirements2KHR;\n#endif /* defined(VK_KHR_get_memory_requirements2) */\n#if defined(VK_KHR_line_rasterization)\n\tPFN_vkCmdSetLineStippleKHR vkCmdSetLineStippleKHR;\n#endif /* defined(VK_KHR_line_rasterization) */\n#if defined(VK_KHR_maintenance1)\n\tPFN_vkTrimCommandPoolKHR vkTrimCommandPoolKHR;\n#endif /* defined(VK_KHR_maintenance1) */\n#if defined(VK_KHR_maintenance3)\n\tPFN_vkGetDescriptorSetLayoutSupportKHR vkGetDescriptorSetLayoutSupportKHR;\n#endif /* defined(VK_KHR_maintenance3) */\n#if defined(VK_KHR_maintenance4)\n\tPFN_vkGetDeviceBufferMemoryRequirementsKHR vkGetDeviceBufferMemoryRequirementsKHR;\n\tPFN_vkGetDeviceImageMemoryRequirementsKHR vkGetDeviceImageMemoryRequirementsKHR;\n\tPFN_vkGetDeviceImageSparseMemoryRequirementsKHR vkGetDeviceImageSparseMemoryRequirementsKHR;\n#endif /* defined(VK_KHR_maintenance4) */\n#if defined(VK_KHR_maintenance5)\n\tPFN_vkCmdBindIndexBuffer2KHR vkCmdBindIndexBuffer2KHR;\n\tPFN_vkGetDeviceImageSubresourceLayoutKHR vkGetDeviceImageSubresourceLayoutKHR;\n\tPFN_vkGetImageSubresourceLayout2KHR vkGetImageSubresourceLayout2KHR;\n\tPFN_vkGetRenderingAreaGranularityKHR vkGetRenderingAreaGranularityKHR;\n#endif /* defined(VK_KHR_maintenance5) */\n#if defined(VK_KHR_maintenance6)\n\tPFN_vkCmdBindDescriptorSets2KHR vkCmdBindDescriptorSets2KHR;\n\tPFN_vkCmdPushConstants2KHR vkCmdPushConstants2KHR;\n#endif /* defined(VK_KHR_maintenance6) */\n#if defined(VK_KHR_maintenance6) && defined(VK_KHR_push_descriptor)\n\tPFN_vkCmdPushDescriptorSet2KHR vkCmdPushDescriptorSet2KHR;\n\tPFN_vkCmdPushDescriptorSetWithTemplate2KHR vkCmdPushDescriptorSetWithTemplate2KHR;\n#endif /* defined(VK_KHR_maintenance6) && defined(VK_KHR_push_descriptor) */\n#if defined(VK_KHR_maintenance6) && defined(VK_EXT_descriptor_buffer)\n\tPFN_vkCmdBindDescriptorBufferEmbeddedSamplers2EXT vkCmdBindDescriptorBufferEmbeddedSamplers2EXT;\n\tPFN_vkCmdSetDescriptorBufferOffsets2EXT vkCmdSetDescriptorBufferOffsets2EXT;\n#endif /* defined(VK_KHR_maintenance6) && defined(VK_EXT_descriptor_buffer) */\n#if defined(VK_KHR_map_memory2)\n\tPFN_vkMapMemory2KHR vkMapMemory2KHR;\n\tPFN_vkUnmapMemory2KHR vkUnmapMemory2KHR;\n#endif /* defined(VK_KHR_map_memory2) */\n#if defined(VK_KHR_performance_query)\n\tPFN_vkAcquireProfilingLockKHR vkAcquireProfilingLockKHR;\n\tPFN_vkReleaseProfilingLockKHR vkReleaseProfilingLockKHR;\n#endif /* defined(VK_KHR_performance_query) */\n#if defined(VK_KHR_pipeline_binary)\n\tPFN_vkCreatePipelineBinariesKHR vkCreatePipelineBinariesKHR;\n\tPFN_vkDestroyPipelineBinaryKHR vkDestroyPipelineBinaryKHR;\n\tPFN_vkGetPipelineBinaryDataKHR vkGetPipelineBinaryDataKHR;\n\tPFN_vkGetPipelineKeyKHR vkGetPipelineKeyKHR;\n\tPFN_vkReleaseCapturedPipelineDataKHR vkReleaseCapturedPipelineDataKHR;\n#endif /* defined(VK_KHR_pipeline_binary) */\n#if defined(VK_KHR_pipeline_executable_properties)\n\tPFN_vkGetPipelineExecutableInternalRepresentationsKHR vkGetPipelineExecutableInternalRepresentationsKHR;\n\tPFN_vkGetPipelineExecutablePropertiesKHR vkGetPipelineExecutablePropertiesKHR;\n\tPFN_vkGetPipelineExecutableStatisticsKHR vkGetPipelineExecutableStatisticsKHR;\n#endif /* defined(VK_KHR_pipeline_executable_properties) */\n#if defined(VK_KHR_present_wait)\n\tPFN_vkWaitForPresentKHR vkWaitForPresentKHR;\n#endif /* defined(VK_KHR_present_wait) */\n#if defined(VK_KHR_push_descriptor)\n\tPFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR;\n#endif /* defined(VK_KHR_push_descriptor) */\n#if defined(VK_KHR_ray_tracing_maintenance1) && defined(VK_KHR_ray_tracing_pipeline)\n\tPFN_vkCmdTraceRaysIndirect2KHR vkCmdTraceRaysIndirect2KHR;\n#endif /* defined(VK_KHR_ray_tracing_maintenance1) && defined(VK_KHR_ray_tracing_pipeline) */\n#if defined(VK_KHR_ray_tracing_pipeline)\n\tPFN_vkCmdSetRayTracingPipelineStackSizeKHR vkCmdSetRayTracingPipelineStackSizeKHR;\n\tPFN_vkCmdTraceRaysIndirectKHR vkCmdTraceRaysIndirectKHR;\n\tPFN_vkCmdTraceRaysKHR vkCmdTraceRaysKHR;\n\tPFN_vkCreateRayTracingPipelinesKHR vkCreateRayTracingPipelinesKHR;\n\tPFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR vkGetRayTracingCaptureReplayShaderGroupHandlesKHR;\n\tPFN_vkGetRayTracingShaderGroupHandlesKHR vkGetRayTracingShaderGroupHandlesKHR;\n\tPFN_vkGetRayTracingShaderGroupStackSizeKHR vkGetRayTracingShaderGroupStackSizeKHR;\n#endif /* defined(VK_KHR_ray_tracing_pipeline) */\n#if defined(VK_KHR_sampler_ycbcr_conversion)\n\tPFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionKHR;\n\tPFN_vkDestroySamplerYcbcrConversionKHR vkDestroySamplerYcbcrConversionKHR;\n#endif /* defined(VK_KHR_sampler_ycbcr_conversion) */\n#if defined(VK_KHR_shared_presentable_image)\n\tPFN_vkGetSwapchainStatusKHR vkGetSwapchainStatusKHR;\n#endif /* defined(VK_KHR_shared_presentable_image) */\n#if defined(VK_KHR_swapchain)\n\tPFN_vkAcquireNextImageKHR vkAcquireNextImageKHR;\n\tPFN_vkCreateSwapchainKHR vkCreateSwapchainKHR;\n\tPFN_vkDestroySwapchainKHR vkDestroySwapchainKHR;\n\tPFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR;\n\tPFN_vkQueuePresentKHR vkQueuePresentKHR;\n#endif /* defined(VK_KHR_swapchain) */\n#if defined(VK_KHR_synchronization2)\n\tPFN_vkCmdPipelineBarrier2KHR vkCmdPipelineBarrier2KHR;\n\tPFN_vkCmdResetEvent2KHR vkCmdResetEvent2KHR;\n\tPFN_vkCmdSetEvent2KHR vkCmdSetEvent2KHR;\n\tPFN_vkCmdWaitEvents2KHR vkCmdWaitEvents2KHR;\n\tPFN_vkCmdWriteTimestamp2KHR vkCmdWriteTimestamp2KHR;\n\tPFN_vkQueueSubmit2KHR vkQueueSubmit2KHR;\n#endif /* defined(VK_KHR_synchronization2) */\n#if defined(VK_KHR_timeline_semaphore)\n\tPFN_vkGetSemaphoreCounterValueKHR vkGetSemaphoreCounterValueKHR;\n\tPFN_vkSignalSemaphoreKHR vkSignalSemaphoreKHR;\n\tPFN_vkWaitSemaphoresKHR vkWaitSemaphoresKHR;\n#endif /* defined(VK_KHR_timeline_semaphore) */\n#if defined(VK_KHR_video_decode_queue)\n\tPFN_vkCmdDecodeVideoKHR vkCmdDecodeVideoKHR;\n#endif /* defined(VK_KHR_video_decode_queue) */\n#if defined(VK_KHR_video_encode_queue)\n\tPFN_vkCmdEncodeVideoKHR vkCmdEncodeVideoKHR;\n\tPFN_vkGetEncodedVideoSessionParametersKHR vkGetEncodedVideoSessionParametersKHR;\n#endif /* defined(VK_KHR_video_encode_queue) */\n#if defined(VK_KHR_video_queue)\n\tPFN_vkBindVideoSessionMemoryKHR vkBindVideoSessionMemoryKHR;\n\tPFN_vkCmdBeginVideoCodingKHR vkCmdBeginVideoCodingKHR;\n\tPFN_vkCmdControlVideoCodingKHR vkCmdControlVideoCodingKHR;\n\tPFN_vkCmdEndVideoCodingKHR vkCmdEndVideoCodingKHR;\n\tPFN_vkCreateVideoSessionKHR vkCreateVideoSessionKHR;\n\tPFN_vkCreateVideoSessionParametersKHR vkCreateVideoSessionParametersKHR;\n\tPFN_vkDestroyVideoSessionKHR vkDestroyVideoSessionKHR;\n\tPFN_vkDestroyVideoSessionParametersKHR vkDestroyVideoSessionParametersKHR;\n\tPFN_vkGetVideoSessionMemoryRequirementsKHR vkGetVideoSessionMemoryRequirementsKHR;\n\tPFN_vkUpdateVideoSessionParametersKHR vkUpdateVideoSessionParametersKHR;\n#endif /* defined(VK_KHR_video_queue) */\n#if defined(VK_NVX_binary_import)\n\tPFN_vkCmdCuLaunchKernelNVX vkCmdCuLaunchKernelNVX;\n\tPFN_vkCreateCuFunctionNVX vkCreateCuFunctionNVX;\n\tPFN_vkCreateCuModuleNVX vkCreateCuModuleNVX;\n\tPFN_vkDestroyCuFunctionNVX vkDestroyCuFunctionNVX;\n\tPFN_vkDestroyCuModuleNVX vkDestroyCuModuleNVX;\n#endif /* defined(VK_NVX_binary_import) */\n#if defined(VK_NVX_image_view_handle)\n\tPFN_vkGetImageViewHandleNVX vkGetImageViewHandleNVX;\n#endif /* defined(VK_NVX_image_view_handle) */\n#if defined(VK_NVX_image_view_handle) && VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION >= 3\n\tPFN_vkGetImageViewHandle64NVX vkGetImageViewHandle64NVX;\n#endif /* defined(VK_NVX_image_view_handle) && VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION >= 3 */\n#if defined(VK_NVX_image_view_handle) && VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION >= 2\n\tPFN_vkGetImageViewAddressNVX vkGetImageViewAddressNVX;\n#endif /* defined(VK_NVX_image_view_handle) && VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION >= 2 */\n#if defined(VK_NV_clip_space_w_scaling)\n\tPFN_vkCmdSetViewportWScalingNV vkCmdSetViewportWScalingNV;\n#endif /* defined(VK_NV_clip_space_w_scaling) */\n#if defined(VK_NV_cluster_acceleration_structure)\n\tPFN_vkCmdBuildClusterAccelerationStructureIndirectNV vkCmdBuildClusterAccelerationStructureIndirectNV;\n\tPFN_vkGetClusterAccelerationStructureBuildSizesNV vkGetClusterAccelerationStructureBuildSizesNV;\n#endif /* defined(VK_NV_cluster_acceleration_structure) */\n#if defined(VK_NV_cooperative_vector)\n\tPFN_vkCmdConvertCooperativeVectorMatrixNV vkCmdConvertCooperativeVectorMatrixNV;\n\tPFN_vkConvertCooperativeVectorMatrixNV vkConvertCooperativeVectorMatrixNV;\n#endif /* defined(VK_NV_cooperative_vector) */\n#if defined(VK_NV_copy_memory_indirect)\n\tPFN_vkCmdCopyMemoryIndirectNV vkCmdCopyMemoryIndirectNV;\n\tPFN_vkCmdCopyMemoryToImageIndirectNV vkCmdCopyMemoryToImageIndirectNV;\n#endif /* defined(VK_NV_copy_memory_indirect) */\n#if defined(VK_NV_cuda_kernel_launch)\n\tPFN_vkCmdCudaLaunchKernelNV vkCmdCudaLaunchKernelNV;\n\tPFN_vkCreateCudaFunctionNV vkCreateCudaFunctionNV;\n\tPFN_vkCreateCudaModuleNV vkCreateCudaModuleNV;\n\tPFN_vkDestroyCudaFunctionNV vkDestroyCudaFunctionNV;\n\tPFN_vkDestroyCudaModuleNV vkDestroyCudaModuleNV;\n\tPFN_vkGetCudaModuleCacheNV vkGetCudaModuleCacheNV;\n#endif /* defined(VK_NV_cuda_kernel_launch) */\n#if defined(VK_NV_device_diagnostic_checkpoints)\n\tPFN_vkCmdSetCheckpointNV vkCmdSetCheckpointNV;\n\tPFN_vkGetQueueCheckpointDataNV vkGetQueueCheckpointDataNV;\n#endif /* defined(VK_NV_device_diagnostic_checkpoints) */\n#if defined(VK_NV_device_diagnostic_checkpoints) && (defined(VK_VERSION_1_3) || defined(VK_KHR_synchronization2))\n\tPFN_vkGetQueueCheckpointData2NV vkGetQueueCheckpointData2NV;\n#endif /* defined(VK_NV_device_diagnostic_checkpoints) && (defined(VK_VERSION_1_3) || defined(VK_KHR_synchronization2)) */\n#if defined(VK_NV_device_generated_commands)\n\tPFN_vkCmdBindPipelineShaderGroupNV vkCmdBindPipelineShaderGroupNV;\n\tPFN_vkCmdExecuteGeneratedCommandsNV vkCmdExecuteGeneratedCommandsNV;\n\tPFN_vkCmdPreprocessGeneratedCommandsNV vkCmdPreprocessGeneratedCommandsNV;\n\tPFN_vkCreateIndirectCommandsLayoutNV vkCreateIndirectCommandsLayoutNV;\n\tPFN_vkDestroyIndirectCommandsLayoutNV vkDestroyIndirectCommandsLayoutNV;\n\tPFN_vkGetGeneratedCommandsMemoryRequirementsNV vkGetGeneratedCommandsMemoryRequirementsNV;\n#endif /* defined(VK_NV_device_generated_commands) */\n#if defined(VK_NV_device_generated_commands_compute)\n\tPFN_vkCmdUpdatePipelineIndirectBufferNV vkCmdUpdatePipelineIndirectBufferNV;\n\tPFN_vkGetPipelineIndirectDeviceAddressNV vkGetPipelineIndirectDeviceAddressNV;\n\tPFN_vkGetPipelineIndirectMemoryRequirementsNV vkGetPipelineIndirectMemoryRequirementsNV;\n#endif /* defined(VK_NV_device_generated_commands_compute) */\n#if defined(VK_NV_external_memory_rdma)\n\tPFN_vkGetMemoryRemoteAddressNV vkGetMemoryRemoteAddressNV;\n#endif /* defined(VK_NV_external_memory_rdma) */\n#if defined(VK_NV_external_memory_win32)\n\tPFN_vkGetMemoryWin32HandleNV vkGetMemoryWin32HandleNV;\n#endif /* defined(VK_NV_external_memory_win32) */\n#if defined(VK_NV_fragment_shading_rate_enums)\n\tPFN_vkCmdSetFragmentShadingRateEnumNV vkCmdSetFragmentShadingRateEnumNV;\n#endif /* defined(VK_NV_fragment_shading_rate_enums) */\n#if defined(VK_NV_low_latency2)\n\tPFN_vkGetLatencyTimingsNV vkGetLatencyTimingsNV;\n\tPFN_vkLatencySleepNV vkLatencySleepNV;\n\tPFN_vkQueueNotifyOutOfBandNV vkQueueNotifyOutOfBandNV;\n\tPFN_vkSetLatencyMarkerNV vkSetLatencyMarkerNV;\n\tPFN_vkSetLatencySleepModeNV vkSetLatencySleepModeNV;\n#endif /* defined(VK_NV_low_latency2) */\n#if defined(VK_NV_memory_decompression)\n\tPFN_vkCmdDecompressMemoryIndirectCountNV vkCmdDecompressMemoryIndirectCountNV;\n\tPFN_vkCmdDecompressMemoryNV vkCmdDecompressMemoryNV;\n#endif /* defined(VK_NV_memory_decompression) */\n#if defined(VK_NV_mesh_shader)\n\tPFN_vkCmdDrawMeshTasksIndirectNV vkCmdDrawMeshTasksIndirectNV;\n\tPFN_vkCmdDrawMeshTasksNV vkCmdDrawMeshTasksNV;\n#endif /* defined(VK_NV_mesh_shader) */\n#if defined(VK_NV_mesh_shader) && (defined(VK_KHR_draw_indirect_count) || defined(VK_VERSION_1_2))\n\tPFN_vkCmdDrawMeshTasksIndirectCountNV vkCmdDrawMeshTasksIndirectCountNV;\n#endif /* defined(VK_NV_mesh_shader) && (defined(VK_KHR_draw_indirect_count) || defined(VK_VERSION_1_2)) */\n#if defined(VK_NV_optical_flow)\n\tPFN_vkBindOpticalFlowSessionImageNV vkBindOpticalFlowSessionImageNV;\n\tPFN_vkCmdOpticalFlowExecuteNV vkCmdOpticalFlowExecuteNV;\n\tPFN_vkCreateOpticalFlowSessionNV vkCreateOpticalFlowSessionNV;\n\tPFN_vkDestroyOpticalFlowSessionNV vkDestroyOpticalFlowSessionNV;\n#endif /* defined(VK_NV_optical_flow) */\n#if defined(VK_NV_partitioned_acceleration_structure)\n\tPFN_vkCmdBuildPartitionedAccelerationStructuresNV vkCmdBuildPartitionedAccelerationStructuresNV;\n\tPFN_vkGetPartitionedAccelerationStructuresBuildSizesNV vkGetPartitionedAccelerationStructuresBuildSizesNV;\n#endif /* defined(VK_NV_partitioned_acceleration_structure) */\n#if defined(VK_NV_ray_tracing)\n\tPFN_vkBindAccelerationStructureMemoryNV vkBindAccelerationStructureMemoryNV;\n\tPFN_vkCmdBuildAccelerationStructureNV vkCmdBuildAccelerationStructureNV;\n\tPFN_vkCmdCopyAccelerationStructureNV vkCmdCopyAccelerationStructureNV;\n\tPFN_vkCmdTraceRaysNV vkCmdTraceRaysNV;\n\tPFN_vkCmdWriteAccelerationStructuresPropertiesNV vkCmdWriteAccelerationStructuresPropertiesNV;\n\tPFN_vkCompileDeferredNV vkCompileDeferredNV;\n\tPFN_vkCreateAccelerationStructureNV vkCreateAccelerationStructureNV;\n\tPFN_vkCreateRayTracingPipelinesNV vkCreateRayTracingPipelinesNV;\n\tPFN_vkDestroyAccelerationStructureNV vkDestroyAccelerationStructureNV;\n\tPFN_vkGetAccelerationStructureHandleNV vkGetAccelerationStructureHandleNV;\n\tPFN_vkGetAccelerationStructureMemoryRequirementsNV vkGetAccelerationStructureMemoryRequirementsNV;\n\tPFN_vkGetRayTracingShaderGroupHandlesNV vkGetRayTracingShaderGroupHandlesNV;\n#endif /* defined(VK_NV_ray_tracing) */\n#if defined(VK_NV_scissor_exclusive) && VK_NV_SCISSOR_EXCLUSIVE_SPEC_VERSION >= 2\n\tPFN_vkCmdSetExclusiveScissorEnableNV vkCmdSetExclusiveScissorEnableNV;\n#endif /* defined(VK_NV_scissor_exclusive) && VK_NV_SCISSOR_EXCLUSIVE_SPEC_VERSION >= 2 */\n#if defined(VK_NV_scissor_exclusive)\n\tPFN_vkCmdSetExclusiveScissorNV vkCmdSetExclusiveScissorNV;\n#endif /* defined(VK_NV_scissor_exclusive) */\n#if defined(VK_NV_shading_rate_image)\n\tPFN_vkCmdBindShadingRateImageNV vkCmdBindShadingRateImageNV;\n\tPFN_vkCmdSetCoarseSampleOrderNV vkCmdSetCoarseSampleOrderNV;\n\tPFN_vkCmdSetViewportShadingRatePaletteNV vkCmdSetViewportShadingRatePaletteNV;\n#endif /* defined(VK_NV_shading_rate_image) */\n#if defined(VK_QCOM_tile_properties)\n\tPFN_vkGetDynamicRenderingTilePropertiesQCOM vkGetDynamicRenderingTilePropertiesQCOM;\n\tPFN_vkGetFramebufferTilePropertiesQCOM vkGetFramebufferTilePropertiesQCOM;\n#endif /* defined(VK_QCOM_tile_properties) */\n#if defined(VK_QNX_external_memory_screen_buffer)\n\tPFN_vkGetScreenBufferPropertiesQNX vkGetScreenBufferPropertiesQNX;\n#endif /* defined(VK_QNX_external_memory_screen_buffer) */\n#if defined(VK_VALVE_descriptor_set_host_mapping)\n\tPFN_vkGetDescriptorSetHostMappingVALVE vkGetDescriptorSetHostMappingVALVE;\n\tPFN_vkGetDescriptorSetLayoutHostMappingInfoVALVE vkGetDescriptorSetLayoutHostMappingInfoVALVE;\n#endif /* defined(VK_VALVE_descriptor_set_host_mapping) */\n#if (defined(VK_EXT_depth_clamp_control)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clamp_control))\n\tPFN_vkCmdSetDepthClampRangeEXT vkCmdSetDepthClampRangeEXT;\n#endif /* (defined(VK_EXT_depth_clamp_control)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clamp_control)) */\n#if (defined(VK_EXT_extended_dynamic_state)) || (defined(VK_EXT_shader_object))\n\tPFN_vkCmdBindVertexBuffers2EXT vkCmdBindVertexBuffers2EXT;\n\tPFN_vkCmdSetCullModeEXT vkCmdSetCullModeEXT;\n\tPFN_vkCmdSetDepthBoundsTestEnableEXT vkCmdSetDepthBoundsTestEnableEXT;\n\tPFN_vkCmdSetDepthCompareOpEXT vkCmdSetDepthCompareOpEXT;\n\tPFN_vkCmdSetDepthTestEnableEXT vkCmdSetDepthTestEnableEXT;\n\tPFN_vkCmdSetDepthWriteEnableEXT vkCmdSetDepthWriteEnableEXT;\n\tPFN_vkCmdSetFrontFaceEXT vkCmdSetFrontFaceEXT;\n\tPFN_vkCmdSetPrimitiveTopologyEXT vkCmdSetPrimitiveTopologyEXT;\n\tPFN_vkCmdSetScissorWithCountEXT vkCmdSetScissorWithCountEXT;\n\tPFN_vkCmdSetStencilOpEXT vkCmdSetStencilOpEXT;\n\tPFN_vkCmdSetStencilTestEnableEXT vkCmdSetStencilTestEnableEXT;\n\tPFN_vkCmdSetViewportWithCountEXT vkCmdSetViewportWithCountEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state)) || (defined(VK_EXT_shader_object)) */\n#if (defined(VK_EXT_extended_dynamic_state2)) || (defined(VK_EXT_shader_object))\n\tPFN_vkCmdSetDepthBiasEnableEXT vkCmdSetDepthBiasEnableEXT;\n\tPFN_vkCmdSetLogicOpEXT vkCmdSetLogicOpEXT;\n\tPFN_vkCmdSetPatchControlPointsEXT vkCmdSetPatchControlPointsEXT;\n\tPFN_vkCmdSetPrimitiveRestartEnableEXT vkCmdSetPrimitiveRestartEnableEXT;\n\tPFN_vkCmdSetRasterizerDiscardEnableEXT vkCmdSetRasterizerDiscardEnableEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state2)) || (defined(VK_EXT_shader_object)) */\n#if (defined(VK_EXT_extended_dynamic_state3)) || (defined(VK_EXT_shader_object))\n\tPFN_vkCmdSetAlphaToCoverageEnableEXT vkCmdSetAlphaToCoverageEnableEXT;\n\tPFN_vkCmdSetAlphaToOneEnableEXT vkCmdSetAlphaToOneEnableEXT;\n\tPFN_vkCmdSetColorBlendEnableEXT vkCmdSetColorBlendEnableEXT;\n\tPFN_vkCmdSetColorBlendEquationEXT vkCmdSetColorBlendEquationEXT;\n\tPFN_vkCmdSetColorWriteMaskEXT vkCmdSetColorWriteMaskEXT;\n\tPFN_vkCmdSetDepthClampEnableEXT vkCmdSetDepthClampEnableEXT;\n\tPFN_vkCmdSetLogicOpEnableEXT vkCmdSetLogicOpEnableEXT;\n\tPFN_vkCmdSetPolygonModeEXT vkCmdSetPolygonModeEXT;\n\tPFN_vkCmdSetRasterizationSamplesEXT vkCmdSetRasterizationSamplesEXT;\n\tPFN_vkCmdSetSampleMaskEXT vkCmdSetSampleMaskEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3)) || (defined(VK_EXT_shader_object)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && (defined(VK_KHR_maintenance2) || defined(VK_VERSION_1_1))) || (defined(VK_EXT_shader_object))\n\tPFN_vkCmdSetTessellationDomainOriginEXT vkCmdSetTessellationDomainOriginEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && (defined(VK_KHR_maintenance2) || defined(VK_VERSION_1_1))) || (defined(VK_EXT_shader_object)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_transform_feedback)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_transform_feedback))\n\tPFN_vkCmdSetRasterizationStreamEXT vkCmdSetRasterizationStreamEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_transform_feedback)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_transform_feedback)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_conservative_rasterization)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_conservative_rasterization))\n\tPFN_vkCmdSetConservativeRasterizationModeEXT vkCmdSetConservativeRasterizationModeEXT;\n\tPFN_vkCmdSetExtraPrimitiveOverestimationSizeEXT vkCmdSetExtraPrimitiveOverestimationSizeEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_conservative_rasterization)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_conservative_rasterization)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_depth_clip_enable)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clip_enable))\n\tPFN_vkCmdSetDepthClipEnableEXT vkCmdSetDepthClipEnableEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_depth_clip_enable)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clip_enable)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_sample_locations)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_sample_locations))\n\tPFN_vkCmdSetSampleLocationsEnableEXT vkCmdSetSampleLocationsEnableEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_sample_locations)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_sample_locations)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_blend_operation_advanced)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_blend_operation_advanced))\n\tPFN_vkCmdSetColorBlendAdvancedEXT vkCmdSetColorBlendAdvancedEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_blend_operation_advanced)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_blend_operation_advanced)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_provoking_vertex)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_provoking_vertex))\n\tPFN_vkCmdSetProvokingVertexModeEXT vkCmdSetProvokingVertexModeEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_provoking_vertex)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_provoking_vertex)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_line_rasterization)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_line_rasterization))\n\tPFN_vkCmdSetLineRasterizationModeEXT vkCmdSetLineRasterizationModeEXT;\n\tPFN_vkCmdSetLineStippleEnableEXT vkCmdSetLineStippleEnableEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_line_rasterization)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_line_rasterization)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_depth_clip_control)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clip_control))\n\tPFN_vkCmdSetDepthClipNegativeOneToOneEXT vkCmdSetDepthClipNegativeOneToOneEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_depth_clip_control)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clip_control)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_clip_space_w_scaling)) || (defined(VK_EXT_shader_object) && defined(VK_NV_clip_space_w_scaling))\n\tPFN_vkCmdSetViewportWScalingEnableNV vkCmdSetViewportWScalingEnableNV;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_clip_space_w_scaling)) || (defined(VK_EXT_shader_object) && defined(VK_NV_clip_space_w_scaling)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_viewport_swizzle)) || (defined(VK_EXT_shader_object) && defined(VK_NV_viewport_swizzle))\n\tPFN_vkCmdSetViewportSwizzleNV vkCmdSetViewportSwizzleNV;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_viewport_swizzle)) || (defined(VK_EXT_shader_object) && defined(VK_NV_viewport_swizzle)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_fragment_coverage_to_color)) || (defined(VK_EXT_shader_object) && defined(VK_NV_fragment_coverage_to_color))\n\tPFN_vkCmdSetCoverageToColorEnableNV vkCmdSetCoverageToColorEnableNV;\n\tPFN_vkCmdSetCoverageToColorLocationNV vkCmdSetCoverageToColorLocationNV;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_fragment_coverage_to_color)) || (defined(VK_EXT_shader_object) && defined(VK_NV_fragment_coverage_to_color)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_framebuffer_mixed_samples)) || (defined(VK_EXT_shader_object) && defined(VK_NV_framebuffer_mixed_samples))\n\tPFN_vkCmdSetCoverageModulationModeNV vkCmdSetCoverageModulationModeNV;\n\tPFN_vkCmdSetCoverageModulationTableEnableNV vkCmdSetCoverageModulationTableEnableNV;\n\tPFN_vkCmdSetCoverageModulationTableNV vkCmdSetCoverageModulationTableNV;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_framebuffer_mixed_samples)) || (defined(VK_EXT_shader_object) && defined(VK_NV_framebuffer_mixed_samples)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_shading_rate_image)) || (defined(VK_EXT_shader_object) && defined(VK_NV_shading_rate_image))\n\tPFN_vkCmdSetShadingRateImageEnableNV vkCmdSetShadingRateImageEnableNV;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_shading_rate_image)) || (defined(VK_EXT_shader_object) && defined(VK_NV_shading_rate_image)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_representative_fragment_test)) || (defined(VK_EXT_shader_object) && defined(VK_NV_representative_fragment_test))\n\tPFN_vkCmdSetRepresentativeFragmentTestEnableNV vkCmdSetRepresentativeFragmentTestEnableNV;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_representative_fragment_test)) || (defined(VK_EXT_shader_object) && defined(VK_NV_representative_fragment_test)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_coverage_reduction_mode)) || (defined(VK_EXT_shader_object) && defined(VK_NV_coverage_reduction_mode))\n\tPFN_vkCmdSetCoverageReductionModeNV vkCmdSetCoverageReductionModeNV;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_coverage_reduction_mode)) || (defined(VK_EXT_shader_object) && defined(VK_NV_coverage_reduction_mode)) */\n#if (defined(VK_EXT_host_image_copy)) || (defined(VK_EXT_image_compression_control))\n\tPFN_vkGetImageSubresourceLayout2EXT vkGetImageSubresourceLayout2EXT;\n#endif /* (defined(VK_EXT_host_image_copy)) || (defined(VK_EXT_image_compression_control)) */\n#if (defined(VK_EXT_shader_object)) || (defined(VK_EXT_vertex_input_dynamic_state))\n\tPFN_vkCmdSetVertexInputEXT vkCmdSetVertexInputEXT;\n#endif /* (defined(VK_EXT_shader_object)) || (defined(VK_EXT_vertex_input_dynamic_state)) */\n#if (defined(VK_KHR_descriptor_update_template) && defined(VK_KHR_push_descriptor)) || (defined(VK_KHR_push_descriptor) && (defined(VK_VERSION_1_1) || defined(VK_KHR_descriptor_update_template)))\n\tPFN_vkCmdPushDescriptorSetWithTemplateKHR vkCmdPushDescriptorSetWithTemplateKHR;\n#endif /* (defined(VK_KHR_descriptor_update_template) && defined(VK_KHR_push_descriptor)) || (defined(VK_KHR_push_descriptor) && (defined(VK_VERSION_1_1) || defined(VK_KHR_descriptor_update_template))) */\n#if (defined(VK_KHR_device_group) && defined(VK_KHR_surface)) || (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1))\n\tPFN_vkGetDeviceGroupPresentCapabilitiesKHR vkGetDeviceGroupPresentCapabilitiesKHR;\n\tPFN_vkGetDeviceGroupSurfacePresentModesKHR vkGetDeviceGroupSurfacePresentModesKHR;\n#endif /* (defined(VK_KHR_device_group) && defined(VK_KHR_surface)) || (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1)) */\n#if (defined(VK_KHR_device_group) && defined(VK_KHR_swapchain)) || (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1))\n\tPFN_vkAcquireNextImage2KHR vkAcquireNextImage2KHR;\n#endif /* (defined(VK_KHR_device_group) && defined(VK_KHR_swapchain)) || (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1)) */\n\t/* VOLK_GENERATE_DEVICE_TABLE */\n};\n\n/* VOLK_GENERATE_PROTOTYPES_H */\n#if defined(VK_VERSION_1_0)\nextern PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers;\nextern PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets;\nextern PFN_vkAllocateMemory vkAllocateMemory;\nextern PFN_vkBeginCommandBuffer vkBeginCommandBuffer;\nextern PFN_vkBindBufferMemory vkBindBufferMemory;\nextern PFN_vkBindImageMemory vkBindImageMemory;\nextern PFN_vkCmdBeginQuery vkCmdBeginQuery;\nextern PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass;\nextern PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets;\nextern PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer;\nextern PFN_vkCmdBindPipeline vkCmdBindPipeline;\nextern PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers;\nextern PFN_vkCmdBlitImage vkCmdBlitImage;\nextern PFN_vkCmdClearAttachments vkCmdClearAttachments;\nextern PFN_vkCmdClearColorImage vkCmdClearColorImage;\nextern PFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage;\nextern PFN_vkCmdCopyBuffer vkCmdCopyBuffer;\nextern PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage;\nextern PFN_vkCmdCopyImage vkCmdCopyImage;\nextern PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer;\nextern PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults;\nextern PFN_vkCmdDispatch vkCmdDispatch;\nextern PFN_vkCmdDispatchIndirect vkCmdDispatchIndirect;\nextern PFN_vkCmdDraw vkCmdDraw;\nextern PFN_vkCmdDrawIndexed vkCmdDrawIndexed;\nextern PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect;\nextern PFN_vkCmdDrawIndirect vkCmdDrawIndirect;\nextern PFN_vkCmdEndQuery vkCmdEndQuery;\nextern PFN_vkCmdEndRenderPass vkCmdEndRenderPass;\nextern PFN_vkCmdExecuteCommands vkCmdExecuteCommands;\nextern PFN_vkCmdFillBuffer vkCmdFillBuffer;\nextern PFN_vkCmdNextSubpass vkCmdNextSubpass;\nextern PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier;\nextern PFN_vkCmdPushConstants vkCmdPushConstants;\nextern PFN_vkCmdResetEvent vkCmdResetEvent;\nextern PFN_vkCmdResetQueryPool vkCmdResetQueryPool;\nextern PFN_vkCmdResolveImage vkCmdResolveImage;\nextern PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants;\nextern PFN_vkCmdSetDepthBias vkCmdSetDepthBias;\nextern PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds;\nextern PFN_vkCmdSetEvent vkCmdSetEvent;\nextern PFN_vkCmdSetLineWidth vkCmdSetLineWidth;\nextern PFN_vkCmdSetScissor vkCmdSetScissor;\nextern PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask;\nextern PFN_vkCmdSetStencilReference vkCmdSetStencilReference;\nextern PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask;\nextern PFN_vkCmdSetViewport vkCmdSetViewport;\nextern PFN_vkCmdUpdateBuffer vkCmdUpdateBuffer;\nextern PFN_vkCmdWaitEvents vkCmdWaitEvents;\nextern PFN_vkCmdWriteTimestamp vkCmdWriteTimestamp;\nextern PFN_vkCreateBuffer vkCreateBuffer;\nextern PFN_vkCreateBufferView vkCreateBufferView;\nextern PFN_vkCreateCommandPool vkCreateCommandPool;\nextern PFN_vkCreateComputePipelines vkCreateComputePipelines;\nextern PFN_vkCreateDescriptorPool vkCreateDescriptorPool;\nextern PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout;\nextern PFN_vkCreateDevice vkCreateDevice;\nextern PFN_vkCreateEvent vkCreateEvent;\nextern PFN_vkCreateFence vkCreateFence;\nextern PFN_vkCreateFramebuffer vkCreateFramebuffer;\nextern PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines;\nextern PFN_vkCreateImage vkCreateImage;\nextern PFN_vkCreateImageView vkCreateImageView;\nextern PFN_vkCreateInstance vkCreateInstance;\nextern PFN_vkCreatePipelineCache vkCreatePipelineCache;\nextern PFN_vkCreatePipelineLayout vkCreatePipelineLayout;\nextern PFN_vkCreateQueryPool vkCreateQueryPool;\nextern PFN_vkCreateRenderPass vkCreateRenderPass;\nextern PFN_vkCreateSampler vkCreateSampler;\nextern PFN_vkCreateSemaphore vkCreateSemaphore;\nextern PFN_vkCreateShaderModule vkCreateShaderModule;\nextern PFN_vkDestroyBuffer vkDestroyBuffer;\nextern PFN_vkDestroyBufferView vkDestroyBufferView;\nextern PFN_vkDestroyCommandPool vkDestroyCommandPool;\nextern PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool;\nextern PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout;\nextern PFN_vkDestroyDevice vkDestroyDevice;\nextern PFN_vkDestroyEvent vkDestroyEvent;\nextern PFN_vkDestroyFence vkDestroyFence;\nextern PFN_vkDestroyFramebuffer vkDestroyFramebuffer;\nextern PFN_vkDestroyImage vkDestroyImage;\nextern PFN_vkDestroyImageView vkDestroyImageView;\nextern PFN_vkDestroyInstance vkDestroyInstance;\nextern PFN_vkDestroyPipeline vkDestroyPipeline;\nextern PFN_vkDestroyPipelineCache vkDestroyPipelineCache;\nextern PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout;\nextern PFN_vkDestroyQueryPool vkDestroyQueryPool;\nextern PFN_vkDestroyRenderPass vkDestroyRenderPass;\nextern PFN_vkDestroySampler vkDestroySampler;\nextern PFN_vkDestroySemaphore vkDestroySemaphore;\nextern PFN_vkDestroyShaderModule vkDestroyShaderModule;\nextern PFN_vkDeviceWaitIdle vkDeviceWaitIdle;\nextern PFN_vkEndCommandBuffer vkEndCommandBuffer;\nextern PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties;\nextern PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties;\nextern PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties;\nextern PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties;\nextern PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices;\nextern PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges;\nextern PFN_vkFreeCommandBuffers vkFreeCommandBuffers;\nextern PFN_vkFreeDescriptorSets vkFreeDescriptorSets;\nextern PFN_vkFreeMemory vkFreeMemory;\nextern PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements;\nextern PFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment;\nextern PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr;\nextern PFN_vkGetDeviceQueue vkGetDeviceQueue;\nextern PFN_vkGetEventStatus vkGetEventStatus;\nextern PFN_vkGetFenceStatus vkGetFenceStatus;\nextern PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements;\nextern PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements;\nextern PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout;\nextern PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;\nextern PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures;\nextern PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties;\nextern PFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties;\nextern PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties;\nextern PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties;\nextern PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties;\nextern PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties;\nextern PFN_vkGetPipelineCacheData vkGetPipelineCacheData;\nextern PFN_vkGetQueryPoolResults vkGetQueryPoolResults;\nextern PFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity;\nextern PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges;\nextern PFN_vkMapMemory vkMapMemory;\nextern PFN_vkMergePipelineCaches vkMergePipelineCaches;\nextern PFN_vkQueueBindSparse vkQueueBindSparse;\nextern PFN_vkQueueSubmit vkQueueSubmit;\nextern PFN_vkQueueWaitIdle vkQueueWaitIdle;\nextern PFN_vkResetCommandBuffer vkResetCommandBuffer;\nextern PFN_vkResetCommandPool vkResetCommandPool;\nextern PFN_vkResetDescriptorPool vkResetDescriptorPool;\nextern PFN_vkResetEvent vkResetEvent;\nextern PFN_vkResetFences vkResetFences;\nextern PFN_vkSetEvent vkSetEvent;\nextern PFN_vkUnmapMemory vkUnmapMemory;\nextern PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets;\nextern PFN_vkWaitForFences vkWaitForFences;\n#endif /* defined(VK_VERSION_1_0) */\n#if defined(VK_VERSION_1_1)\nextern PFN_vkBindBufferMemory2 vkBindBufferMemory2;\nextern PFN_vkBindImageMemory2 vkBindImageMemory2;\nextern PFN_vkCmdDispatchBase vkCmdDispatchBase;\nextern PFN_vkCmdSetDeviceMask vkCmdSetDeviceMask;\nextern PFN_vkCreateDescriptorUpdateTemplate vkCreateDescriptorUpdateTemplate;\nextern PFN_vkCreateSamplerYcbcrConversion vkCreateSamplerYcbcrConversion;\nextern PFN_vkDestroyDescriptorUpdateTemplate vkDestroyDescriptorUpdateTemplate;\nextern PFN_vkDestroySamplerYcbcrConversion vkDestroySamplerYcbcrConversion;\nextern PFN_vkEnumerateInstanceVersion vkEnumerateInstanceVersion;\nextern PFN_vkEnumeratePhysicalDeviceGroups vkEnumeratePhysicalDeviceGroups;\nextern PFN_vkGetBufferMemoryRequirements2 vkGetBufferMemoryRequirements2;\nextern PFN_vkGetDescriptorSetLayoutSupport vkGetDescriptorSetLayoutSupport;\nextern PFN_vkGetDeviceGroupPeerMemoryFeatures vkGetDeviceGroupPeerMemoryFeatures;\nextern PFN_vkGetDeviceQueue2 vkGetDeviceQueue2;\nextern PFN_vkGetImageMemoryRequirements2 vkGetImageMemoryRequirements2;\nextern PFN_vkGetImageSparseMemoryRequirements2 vkGetImageSparseMemoryRequirements2;\nextern PFN_vkGetPhysicalDeviceExternalBufferProperties vkGetPhysicalDeviceExternalBufferProperties;\nextern PFN_vkGetPhysicalDeviceExternalFenceProperties vkGetPhysicalDeviceExternalFenceProperties;\nextern PFN_vkGetPhysicalDeviceExternalSemaphoreProperties vkGetPhysicalDeviceExternalSemaphoreProperties;\nextern PFN_vkGetPhysicalDeviceFeatures2 vkGetPhysicalDeviceFeatures2;\nextern PFN_vkGetPhysicalDeviceFormatProperties2 vkGetPhysicalDeviceFormatProperties2;\nextern PFN_vkGetPhysicalDeviceImageFormatProperties2 vkGetPhysicalDeviceImageFormatProperties2;\nextern PFN_vkGetPhysicalDeviceMemoryProperties2 vkGetPhysicalDeviceMemoryProperties2;\nextern PFN_vkGetPhysicalDeviceProperties2 vkGetPhysicalDeviceProperties2;\nextern PFN_vkGetPhysicalDeviceQueueFamilyProperties2 vkGetPhysicalDeviceQueueFamilyProperties2;\nextern PFN_vkGetPhysicalDeviceSparseImageFormatProperties2 vkGetPhysicalDeviceSparseImageFormatProperties2;\nextern PFN_vkTrimCommandPool vkTrimCommandPool;\nextern PFN_vkUpdateDescriptorSetWithTemplate vkUpdateDescriptorSetWithTemplate;\n#endif /* defined(VK_VERSION_1_1) */\n#if defined(VK_VERSION_1_2)\nextern PFN_vkCmdBeginRenderPass2 vkCmdBeginRenderPass2;\nextern PFN_vkCmdDrawIndexedIndirectCount vkCmdDrawIndexedIndirectCount;\nextern PFN_vkCmdDrawIndirectCount vkCmdDrawIndirectCount;\nextern PFN_vkCmdEndRenderPass2 vkCmdEndRenderPass2;\nextern PFN_vkCmdNextSubpass2 vkCmdNextSubpass2;\nextern PFN_vkCreateRenderPass2 vkCreateRenderPass2;\nextern PFN_vkGetBufferDeviceAddress vkGetBufferDeviceAddress;\nextern PFN_vkGetBufferOpaqueCaptureAddress vkGetBufferOpaqueCaptureAddress;\nextern PFN_vkGetDeviceMemoryOpaqueCaptureAddress vkGetDeviceMemoryOpaqueCaptureAddress;\nextern PFN_vkGetSemaphoreCounterValue vkGetSemaphoreCounterValue;\nextern PFN_vkResetQueryPool vkResetQueryPool;\nextern PFN_vkSignalSemaphore vkSignalSemaphore;\nextern PFN_vkWaitSemaphores vkWaitSemaphores;\n#endif /* defined(VK_VERSION_1_2) */\n#if defined(VK_VERSION_1_3)\nextern PFN_vkCmdBeginRendering vkCmdBeginRendering;\nextern PFN_vkCmdBindVertexBuffers2 vkCmdBindVertexBuffers2;\nextern PFN_vkCmdBlitImage2 vkCmdBlitImage2;\nextern PFN_vkCmdCopyBuffer2 vkCmdCopyBuffer2;\nextern PFN_vkCmdCopyBufferToImage2 vkCmdCopyBufferToImage2;\nextern PFN_vkCmdCopyImage2 vkCmdCopyImage2;\nextern PFN_vkCmdCopyImageToBuffer2 vkCmdCopyImageToBuffer2;\nextern PFN_vkCmdEndRendering vkCmdEndRendering;\nextern PFN_vkCmdPipelineBarrier2 vkCmdPipelineBarrier2;\nextern PFN_vkCmdResetEvent2 vkCmdResetEvent2;\nextern PFN_vkCmdResolveImage2 vkCmdResolveImage2;\nextern PFN_vkCmdSetCullMode vkCmdSetCullMode;\nextern PFN_vkCmdSetDepthBiasEnable vkCmdSetDepthBiasEnable;\nextern PFN_vkCmdSetDepthBoundsTestEnable vkCmdSetDepthBoundsTestEnable;\nextern PFN_vkCmdSetDepthCompareOp vkCmdSetDepthCompareOp;\nextern PFN_vkCmdSetDepthTestEnable vkCmdSetDepthTestEnable;\nextern PFN_vkCmdSetDepthWriteEnable vkCmdSetDepthWriteEnable;\nextern PFN_vkCmdSetEvent2 vkCmdSetEvent2;\nextern PFN_vkCmdSetFrontFace vkCmdSetFrontFace;\nextern PFN_vkCmdSetPrimitiveRestartEnable vkCmdSetPrimitiveRestartEnable;\nextern PFN_vkCmdSetPrimitiveTopology vkCmdSetPrimitiveTopology;\nextern PFN_vkCmdSetRasterizerDiscardEnable vkCmdSetRasterizerDiscardEnable;\nextern PFN_vkCmdSetScissorWithCount vkCmdSetScissorWithCount;\nextern PFN_vkCmdSetStencilOp vkCmdSetStencilOp;\nextern PFN_vkCmdSetStencilTestEnable vkCmdSetStencilTestEnable;\nextern PFN_vkCmdSetViewportWithCount vkCmdSetViewportWithCount;\nextern PFN_vkCmdWaitEvents2 vkCmdWaitEvents2;\nextern PFN_vkCmdWriteTimestamp2 vkCmdWriteTimestamp2;\nextern PFN_vkCreatePrivateDataSlot vkCreatePrivateDataSlot;\nextern PFN_vkDestroyPrivateDataSlot vkDestroyPrivateDataSlot;\nextern PFN_vkGetDeviceBufferMemoryRequirements vkGetDeviceBufferMemoryRequirements;\nextern PFN_vkGetDeviceImageMemoryRequirements vkGetDeviceImageMemoryRequirements;\nextern PFN_vkGetDeviceImageSparseMemoryRequirements vkGetDeviceImageSparseMemoryRequirements;\nextern PFN_vkGetPhysicalDeviceToolProperties vkGetPhysicalDeviceToolProperties;\nextern PFN_vkGetPrivateData vkGetPrivateData;\nextern PFN_vkQueueSubmit2 vkQueueSubmit2;\nextern PFN_vkSetPrivateData vkSetPrivateData;\n#endif /* defined(VK_VERSION_1_3) */\n#if defined(VK_VERSION_1_4)\nextern PFN_vkCmdBindDescriptorSets2 vkCmdBindDescriptorSets2;\nextern PFN_vkCmdBindIndexBuffer2 vkCmdBindIndexBuffer2;\nextern PFN_vkCmdPushConstants2 vkCmdPushConstants2;\nextern PFN_vkCmdPushDescriptorSet vkCmdPushDescriptorSet;\nextern PFN_vkCmdPushDescriptorSet2 vkCmdPushDescriptorSet2;\nextern PFN_vkCmdPushDescriptorSetWithTemplate vkCmdPushDescriptorSetWithTemplate;\nextern PFN_vkCmdPushDescriptorSetWithTemplate2 vkCmdPushDescriptorSetWithTemplate2;\nextern PFN_vkCmdSetLineStipple vkCmdSetLineStipple;\nextern PFN_vkCmdSetRenderingAttachmentLocations vkCmdSetRenderingAttachmentLocations;\nextern PFN_vkCmdSetRenderingInputAttachmentIndices vkCmdSetRenderingInputAttachmentIndices;\nextern PFN_vkCopyImageToImage vkCopyImageToImage;\nextern PFN_vkCopyImageToMemory vkCopyImageToMemory;\nextern PFN_vkCopyMemoryToImage vkCopyMemoryToImage;\nextern PFN_vkGetDeviceImageSubresourceLayout vkGetDeviceImageSubresourceLayout;\nextern PFN_vkGetImageSubresourceLayout2 vkGetImageSubresourceLayout2;\nextern PFN_vkGetRenderingAreaGranularity vkGetRenderingAreaGranularity;\nextern PFN_vkMapMemory2 vkMapMemory2;\nextern PFN_vkTransitionImageLayout vkTransitionImageLayout;\nextern PFN_vkUnmapMemory2 vkUnmapMemory2;\n#endif /* defined(VK_VERSION_1_4) */\n#if defined(VK_AMDX_shader_enqueue)\nextern PFN_vkCmdDispatchGraphAMDX vkCmdDispatchGraphAMDX;\nextern PFN_vkCmdDispatchGraphIndirectAMDX vkCmdDispatchGraphIndirectAMDX;\nextern PFN_vkCmdDispatchGraphIndirectCountAMDX vkCmdDispatchGraphIndirectCountAMDX;\nextern PFN_vkCmdInitializeGraphScratchMemoryAMDX vkCmdInitializeGraphScratchMemoryAMDX;\nextern PFN_vkCreateExecutionGraphPipelinesAMDX vkCreateExecutionGraphPipelinesAMDX;\nextern PFN_vkGetExecutionGraphPipelineNodeIndexAMDX vkGetExecutionGraphPipelineNodeIndexAMDX;\nextern PFN_vkGetExecutionGraphPipelineScratchSizeAMDX vkGetExecutionGraphPipelineScratchSizeAMDX;\n#endif /* defined(VK_AMDX_shader_enqueue) */\n#if defined(VK_AMD_anti_lag)\nextern PFN_vkAntiLagUpdateAMD vkAntiLagUpdateAMD;\n#endif /* defined(VK_AMD_anti_lag) */\n#if defined(VK_AMD_buffer_marker)\nextern PFN_vkCmdWriteBufferMarkerAMD vkCmdWriteBufferMarkerAMD;\n#endif /* defined(VK_AMD_buffer_marker) */\n#if defined(VK_AMD_buffer_marker) && (defined(VK_VERSION_1_3) || defined(VK_KHR_synchronization2))\nextern PFN_vkCmdWriteBufferMarker2AMD vkCmdWriteBufferMarker2AMD;\n#endif /* defined(VK_AMD_buffer_marker) && (defined(VK_VERSION_1_3) || defined(VK_KHR_synchronization2)) */\n#if defined(VK_AMD_display_native_hdr)\nextern PFN_vkSetLocalDimmingAMD vkSetLocalDimmingAMD;\n#endif /* defined(VK_AMD_display_native_hdr) */\n#if defined(VK_AMD_draw_indirect_count)\nextern PFN_vkCmdDrawIndexedIndirectCountAMD vkCmdDrawIndexedIndirectCountAMD;\nextern PFN_vkCmdDrawIndirectCountAMD vkCmdDrawIndirectCountAMD;\n#endif /* defined(VK_AMD_draw_indirect_count) */\n#if defined(VK_AMD_shader_info)\nextern PFN_vkGetShaderInfoAMD vkGetShaderInfoAMD;\n#endif /* defined(VK_AMD_shader_info) */\n#if defined(VK_ANDROID_external_memory_android_hardware_buffer)\nextern PFN_vkGetAndroidHardwareBufferPropertiesANDROID vkGetAndroidHardwareBufferPropertiesANDROID;\nextern PFN_vkGetMemoryAndroidHardwareBufferANDROID vkGetMemoryAndroidHardwareBufferANDROID;\n#endif /* defined(VK_ANDROID_external_memory_android_hardware_buffer) */\n#if defined(VK_EXT_acquire_drm_display)\nextern PFN_vkAcquireDrmDisplayEXT vkAcquireDrmDisplayEXT;\nextern PFN_vkGetDrmDisplayEXT vkGetDrmDisplayEXT;\n#endif /* defined(VK_EXT_acquire_drm_display) */\n#if defined(VK_EXT_acquire_xlib_display)\nextern PFN_vkAcquireXlibDisplayEXT vkAcquireXlibDisplayEXT;\nextern PFN_vkGetRandROutputDisplayEXT vkGetRandROutputDisplayEXT;\n#endif /* defined(VK_EXT_acquire_xlib_display) */\n#if defined(VK_EXT_attachment_feedback_loop_dynamic_state)\nextern PFN_vkCmdSetAttachmentFeedbackLoopEnableEXT vkCmdSetAttachmentFeedbackLoopEnableEXT;\n#endif /* defined(VK_EXT_attachment_feedback_loop_dynamic_state) */\n#if defined(VK_EXT_buffer_device_address)\nextern PFN_vkGetBufferDeviceAddressEXT vkGetBufferDeviceAddressEXT;\n#endif /* defined(VK_EXT_buffer_device_address) */\n#if defined(VK_EXT_calibrated_timestamps)\nextern PFN_vkGetCalibratedTimestampsEXT vkGetCalibratedTimestampsEXT;\nextern PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT vkGetPhysicalDeviceCalibrateableTimeDomainsEXT;\n#endif /* defined(VK_EXT_calibrated_timestamps) */\n#if defined(VK_EXT_color_write_enable)\nextern PFN_vkCmdSetColorWriteEnableEXT vkCmdSetColorWriteEnableEXT;\n#endif /* defined(VK_EXT_color_write_enable) */\n#if defined(VK_EXT_conditional_rendering)\nextern PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT;\nextern PFN_vkCmdEndConditionalRenderingEXT vkCmdEndConditionalRenderingEXT;\n#endif /* defined(VK_EXT_conditional_rendering) */\n#if defined(VK_EXT_debug_marker)\nextern PFN_vkCmdDebugMarkerBeginEXT vkCmdDebugMarkerBeginEXT;\nextern PFN_vkCmdDebugMarkerEndEXT vkCmdDebugMarkerEndEXT;\nextern PFN_vkCmdDebugMarkerInsertEXT vkCmdDebugMarkerInsertEXT;\nextern PFN_vkDebugMarkerSetObjectNameEXT vkDebugMarkerSetObjectNameEXT;\nextern PFN_vkDebugMarkerSetObjectTagEXT vkDebugMarkerSetObjectTagEXT;\n#endif /* defined(VK_EXT_debug_marker) */\n#if defined(VK_EXT_debug_report)\nextern PFN_vkCreateDebugReportCallbackEXT vkCreateDebugReportCallbackEXT;\nextern PFN_vkDebugReportMessageEXT vkDebugReportMessageEXT;\nextern PFN_vkDestroyDebugReportCallbackEXT vkDestroyDebugReportCallbackEXT;\n#endif /* defined(VK_EXT_debug_report) */\n#if defined(VK_EXT_debug_utils)\nextern PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT;\nextern PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT;\nextern PFN_vkCmdInsertDebugUtilsLabelEXT vkCmdInsertDebugUtilsLabelEXT;\nextern PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT;\nextern PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT;\nextern PFN_vkQueueBeginDebugUtilsLabelEXT vkQueueBeginDebugUtilsLabelEXT;\nextern PFN_vkQueueEndDebugUtilsLabelEXT vkQueueEndDebugUtilsLabelEXT;\nextern PFN_vkQueueInsertDebugUtilsLabelEXT vkQueueInsertDebugUtilsLabelEXT;\nextern PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXT;\nextern PFN_vkSetDebugUtilsObjectTagEXT vkSetDebugUtilsObjectTagEXT;\nextern PFN_vkSubmitDebugUtilsMessageEXT vkSubmitDebugUtilsMessageEXT;\n#endif /* defined(VK_EXT_debug_utils) */\n#if defined(VK_EXT_depth_bias_control)\nextern PFN_vkCmdSetDepthBias2EXT vkCmdSetDepthBias2EXT;\n#endif /* defined(VK_EXT_depth_bias_control) */\n#if defined(VK_EXT_descriptor_buffer)\nextern PFN_vkCmdBindDescriptorBufferEmbeddedSamplersEXT vkCmdBindDescriptorBufferEmbeddedSamplersEXT;\nextern PFN_vkCmdBindDescriptorBuffersEXT vkCmdBindDescriptorBuffersEXT;\nextern PFN_vkCmdSetDescriptorBufferOffsetsEXT vkCmdSetDescriptorBufferOffsetsEXT;\nextern PFN_vkGetBufferOpaqueCaptureDescriptorDataEXT vkGetBufferOpaqueCaptureDescriptorDataEXT;\nextern PFN_vkGetDescriptorEXT vkGetDescriptorEXT;\nextern PFN_vkGetDescriptorSetLayoutBindingOffsetEXT vkGetDescriptorSetLayoutBindingOffsetEXT;\nextern PFN_vkGetDescriptorSetLayoutSizeEXT vkGetDescriptorSetLayoutSizeEXT;\nextern PFN_vkGetImageOpaqueCaptureDescriptorDataEXT vkGetImageOpaqueCaptureDescriptorDataEXT;\nextern PFN_vkGetImageViewOpaqueCaptureDescriptorDataEXT vkGetImageViewOpaqueCaptureDescriptorDataEXT;\nextern PFN_vkGetSamplerOpaqueCaptureDescriptorDataEXT vkGetSamplerOpaqueCaptureDescriptorDataEXT;\n#endif /* defined(VK_EXT_descriptor_buffer) */\n#if defined(VK_EXT_descriptor_buffer) && (defined(VK_KHR_acceleration_structure) || defined(VK_NV_ray_tracing))\nextern PFN_vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT;\n#endif /* defined(VK_EXT_descriptor_buffer) && (defined(VK_KHR_acceleration_structure) || defined(VK_NV_ray_tracing)) */\n#if defined(VK_EXT_device_fault)\nextern PFN_vkGetDeviceFaultInfoEXT vkGetDeviceFaultInfoEXT;\n#endif /* defined(VK_EXT_device_fault) */\n#if defined(VK_EXT_device_generated_commands)\nextern PFN_vkCmdExecuteGeneratedCommandsEXT vkCmdExecuteGeneratedCommandsEXT;\nextern PFN_vkCmdPreprocessGeneratedCommandsEXT vkCmdPreprocessGeneratedCommandsEXT;\nextern PFN_vkCreateIndirectCommandsLayoutEXT vkCreateIndirectCommandsLayoutEXT;\nextern PFN_vkCreateIndirectExecutionSetEXT vkCreateIndirectExecutionSetEXT;\nextern PFN_vkDestroyIndirectCommandsLayoutEXT vkDestroyIndirectCommandsLayoutEXT;\nextern PFN_vkDestroyIndirectExecutionSetEXT vkDestroyIndirectExecutionSetEXT;\nextern PFN_vkGetGeneratedCommandsMemoryRequirementsEXT vkGetGeneratedCommandsMemoryRequirementsEXT;\nextern PFN_vkUpdateIndirectExecutionSetPipelineEXT vkUpdateIndirectExecutionSetPipelineEXT;\nextern PFN_vkUpdateIndirectExecutionSetShaderEXT vkUpdateIndirectExecutionSetShaderEXT;\n#endif /* defined(VK_EXT_device_generated_commands) */\n#if defined(VK_EXT_direct_mode_display)\nextern PFN_vkReleaseDisplayEXT vkReleaseDisplayEXT;\n#endif /* defined(VK_EXT_direct_mode_display) */\n#if defined(VK_EXT_directfb_surface)\nextern PFN_vkCreateDirectFBSurfaceEXT vkCreateDirectFBSurfaceEXT;\nextern PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT vkGetPhysicalDeviceDirectFBPresentationSupportEXT;\n#endif /* defined(VK_EXT_directfb_surface) */\n#if defined(VK_EXT_discard_rectangles)\nextern PFN_vkCmdSetDiscardRectangleEXT vkCmdSetDiscardRectangleEXT;\n#endif /* defined(VK_EXT_discard_rectangles) */\n#if defined(VK_EXT_discard_rectangles) && VK_EXT_DISCARD_RECTANGLES_SPEC_VERSION >= 2\nextern PFN_vkCmdSetDiscardRectangleEnableEXT vkCmdSetDiscardRectangleEnableEXT;\nextern PFN_vkCmdSetDiscardRectangleModeEXT vkCmdSetDiscardRectangleModeEXT;\n#endif /* defined(VK_EXT_discard_rectangles) && VK_EXT_DISCARD_RECTANGLES_SPEC_VERSION >= 2 */\n#if defined(VK_EXT_display_control)\nextern PFN_vkDisplayPowerControlEXT vkDisplayPowerControlEXT;\nextern PFN_vkGetSwapchainCounterEXT vkGetSwapchainCounterEXT;\nextern PFN_vkRegisterDeviceEventEXT vkRegisterDeviceEventEXT;\nextern PFN_vkRegisterDisplayEventEXT vkRegisterDisplayEventEXT;\n#endif /* defined(VK_EXT_display_control) */\n#if defined(VK_EXT_display_surface_counter)\nextern PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT vkGetPhysicalDeviceSurfaceCapabilities2EXT;\n#endif /* defined(VK_EXT_display_surface_counter) */\n#if defined(VK_EXT_external_memory_host)\nextern PFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT;\n#endif /* defined(VK_EXT_external_memory_host) */\n#if defined(VK_EXT_external_memory_metal)\nextern PFN_vkGetMemoryMetalHandleEXT vkGetMemoryMetalHandleEXT;\nextern PFN_vkGetMemoryMetalHandlePropertiesEXT vkGetMemoryMetalHandlePropertiesEXT;\n#endif /* defined(VK_EXT_external_memory_metal) */\n#if defined(VK_EXT_full_screen_exclusive)\nextern PFN_vkAcquireFullScreenExclusiveModeEXT vkAcquireFullScreenExclusiveModeEXT;\nextern PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT vkGetPhysicalDeviceSurfacePresentModes2EXT;\nextern PFN_vkReleaseFullScreenExclusiveModeEXT vkReleaseFullScreenExclusiveModeEXT;\n#endif /* defined(VK_EXT_full_screen_exclusive) */\n#if defined(VK_EXT_full_screen_exclusive) && (defined(VK_KHR_device_group) || defined(VK_VERSION_1_1))\nextern PFN_vkGetDeviceGroupSurfacePresentModes2EXT vkGetDeviceGroupSurfacePresentModes2EXT;\n#endif /* defined(VK_EXT_full_screen_exclusive) && (defined(VK_KHR_device_group) || defined(VK_VERSION_1_1)) */\n#if defined(VK_EXT_hdr_metadata)\nextern PFN_vkSetHdrMetadataEXT vkSetHdrMetadataEXT;\n#endif /* defined(VK_EXT_hdr_metadata) */\n#if defined(VK_EXT_headless_surface)\nextern PFN_vkCreateHeadlessSurfaceEXT vkCreateHeadlessSurfaceEXT;\n#endif /* defined(VK_EXT_headless_surface) */\n#if defined(VK_EXT_host_image_copy)\nextern PFN_vkCopyImageToImageEXT vkCopyImageToImageEXT;\nextern PFN_vkCopyImageToMemoryEXT vkCopyImageToMemoryEXT;\nextern PFN_vkCopyMemoryToImageEXT vkCopyMemoryToImageEXT;\nextern PFN_vkTransitionImageLayoutEXT vkTransitionImageLayoutEXT;\n#endif /* defined(VK_EXT_host_image_copy) */\n#if defined(VK_EXT_host_query_reset)\nextern PFN_vkResetQueryPoolEXT vkResetQueryPoolEXT;\n#endif /* defined(VK_EXT_host_query_reset) */\n#if defined(VK_EXT_image_drm_format_modifier)\nextern PFN_vkGetImageDrmFormatModifierPropertiesEXT vkGetImageDrmFormatModifierPropertiesEXT;\n#endif /* defined(VK_EXT_image_drm_format_modifier) */\n#if defined(VK_EXT_line_rasterization)\nextern PFN_vkCmdSetLineStippleEXT vkCmdSetLineStippleEXT;\n#endif /* defined(VK_EXT_line_rasterization) */\n#if defined(VK_EXT_mesh_shader)\nextern PFN_vkCmdDrawMeshTasksEXT vkCmdDrawMeshTasksEXT;\nextern PFN_vkCmdDrawMeshTasksIndirectEXT vkCmdDrawMeshTasksIndirectEXT;\n#endif /* defined(VK_EXT_mesh_shader) */\n#if defined(VK_EXT_mesh_shader) && (defined(VK_KHR_draw_indirect_count) || defined(VK_VERSION_1_2))\nextern PFN_vkCmdDrawMeshTasksIndirectCountEXT vkCmdDrawMeshTasksIndirectCountEXT;\n#endif /* defined(VK_EXT_mesh_shader) && (defined(VK_KHR_draw_indirect_count) || defined(VK_VERSION_1_2)) */\n#if defined(VK_EXT_metal_objects)\nextern PFN_vkExportMetalObjectsEXT vkExportMetalObjectsEXT;\n#endif /* defined(VK_EXT_metal_objects) */\n#if defined(VK_EXT_metal_surface)\nextern PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT;\n#endif /* defined(VK_EXT_metal_surface) */\n#if defined(VK_EXT_multi_draw)\nextern PFN_vkCmdDrawMultiEXT vkCmdDrawMultiEXT;\nextern PFN_vkCmdDrawMultiIndexedEXT vkCmdDrawMultiIndexedEXT;\n#endif /* defined(VK_EXT_multi_draw) */\n#if defined(VK_EXT_opacity_micromap)\nextern PFN_vkBuildMicromapsEXT vkBuildMicromapsEXT;\nextern PFN_vkCmdBuildMicromapsEXT vkCmdBuildMicromapsEXT;\nextern PFN_vkCmdCopyMemoryToMicromapEXT vkCmdCopyMemoryToMicromapEXT;\nextern PFN_vkCmdCopyMicromapEXT vkCmdCopyMicromapEXT;\nextern PFN_vkCmdCopyMicromapToMemoryEXT vkCmdCopyMicromapToMemoryEXT;\nextern PFN_vkCmdWriteMicromapsPropertiesEXT vkCmdWriteMicromapsPropertiesEXT;\nextern PFN_vkCopyMemoryToMicromapEXT vkCopyMemoryToMicromapEXT;\nextern PFN_vkCopyMicromapEXT vkCopyMicromapEXT;\nextern PFN_vkCopyMicromapToMemoryEXT vkCopyMicromapToMemoryEXT;\nextern PFN_vkCreateMicromapEXT vkCreateMicromapEXT;\nextern PFN_vkDestroyMicromapEXT vkDestroyMicromapEXT;\nextern PFN_vkGetDeviceMicromapCompatibilityEXT vkGetDeviceMicromapCompatibilityEXT;\nextern PFN_vkGetMicromapBuildSizesEXT vkGetMicromapBuildSizesEXT;\nextern PFN_vkWriteMicromapsPropertiesEXT vkWriteMicromapsPropertiesEXT;\n#endif /* defined(VK_EXT_opacity_micromap) */\n#if defined(VK_EXT_pageable_device_local_memory)\nextern PFN_vkSetDeviceMemoryPriorityEXT vkSetDeviceMemoryPriorityEXT;\n#endif /* defined(VK_EXT_pageable_device_local_memory) */\n#if defined(VK_EXT_pipeline_properties)\nextern PFN_vkGetPipelinePropertiesEXT vkGetPipelinePropertiesEXT;\n#endif /* defined(VK_EXT_pipeline_properties) */\n#if defined(VK_EXT_private_data)\nextern PFN_vkCreatePrivateDataSlotEXT vkCreatePrivateDataSlotEXT;\nextern PFN_vkDestroyPrivateDataSlotEXT vkDestroyPrivateDataSlotEXT;\nextern PFN_vkGetPrivateDataEXT vkGetPrivateDataEXT;\nextern PFN_vkSetPrivateDataEXT vkSetPrivateDataEXT;\n#endif /* defined(VK_EXT_private_data) */\n#if defined(VK_EXT_sample_locations)\nextern PFN_vkCmdSetSampleLocationsEXT vkCmdSetSampleLocationsEXT;\nextern PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT vkGetPhysicalDeviceMultisamplePropertiesEXT;\n#endif /* defined(VK_EXT_sample_locations) */\n#if defined(VK_EXT_shader_module_identifier)\nextern PFN_vkGetShaderModuleCreateInfoIdentifierEXT vkGetShaderModuleCreateInfoIdentifierEXT;\nextern PFN_vkGetShaderModuleIdentifierEXT vkGetShaderModuleIdentifierEXT;\n#endif /* defined(VK_EXT_shader_module_identifier) */\n#if defined(VK_EXT_shader_object)\nextern PFN_vkCmdBindShadersEXT vkCmdBindShadersEXT;\nextern PFN_vkCreateShadersEXT vkCreateShadersEXT;\nextern PFN_vkDestroyShaderEXT vkDestroyShaderEXT;\nextern PFN_vkGetShaderBinaryDataEXT vkGetShaderBinaryDataEXT;\n#endif /* defined(VK_EXT_shader_object) */\n#if defined(VK_EXT_swapchain_maintenance1)\nextern PFN_vkReleaseSwapchainImagesEXT vkReleaseSwapchainImagesEXT;\n#endif /* defined(VK_EXT_swapchain_maintenance1) */\n#if defined(VK_EXT_tooling_info)\nextern PFN_vkGetPhysicalDeviceToolPropertiesEXT vkGetPhysicalDeviceToolPropertiesEXT;\n#endif /* defined(VK_EXT_tooling_info) */\n#if defined(VK_EXT_transform_feedback)\nextern PFN_vkCmdBeginQueryIndexedEXT vkCmdBeginQueryIndexedEXT;\nextern PFN_vkCmdBeginTransformFeedbackEXT vkCmdBeginTransformFeedbackEXT;\nextern PFN_vkCmdBindTransformFeedbackBuffersEXT vkCmdBindTransformFeedbackBuffersEXT;\nextern PFN_vkCmdDrawIndirectByteCountEXT vkCmdDrawIndirectByteCountEXT;\nextern PFN_vkCmdEndQueryIndexedEXT vkCmdEndQueryIndexedEXT;\nextern PFN_vkCmdEndTransformFeedbackEXT vkCmdEndTransformFeedbackEXT;\n#endif /* defined(VK_EXT_transform_feedback) */\n#if defined(VK_EXT_validation_cache)\nextern PFN_vkCreateValidationCacheEXT vkCreateValidationCacheEXT;\nextern PFN_vkDestroyValidationCacheEXT vkDestroyValidationCacheEXT;\nextern PFN_vkGetValidationCacheDataEXT vkGetValidationCacheDataEXT;\nextern PFN_vkMergeValidationCachesEXT vkMergeValidationCachesEXT;\n#endif /* defined(VK_EXT_validation_cache) */\n#if defined(VK_FUCHSIA_buffer_collection)\nextern PFN_vkCreateBufferCollectionFUCHSIA vkCreateBufferCollectionFUCHSIA;\nextern PFN_vkDestroyBufferCollectionFUCHSIA vkDestroyBufferCollectionFUCHSIA;\nextern PFN_vkGetBufferCollectionPropertiesFUCHSIA vkGetBufferCollectionPropertiesFUCHSIA;\nextern PFN_vkSetBufferCollectionBufferConstraintsFUCHSIA vkSetBufferCollectionBufferConstraintsFUCHSIA;\nextern PFN_vkSetBufferCollectionImageConstraintsFUCHSIA vkSetBufferCollectionImageConstraintsFUCHSIA;\n#endif /* defined(VK_FUCHSIA_buffer_collection) */\n#if defined(VK_FUCHSIA_external_memory)\nextern PFN_vkGetMemoryZirconHandleFUCHSIA vkGetMemoryZirconHandleFUCHSIA;\nextern PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA vkGetMemoryZirconHandlePropertiesFUCHSIA;\n#endif /* defined(VK_FUCHSIA_external_memory) */\n#if defined(VK_FUCHSIA_external_semaphore)\nextern PFN_vkGetSemaphoreZirconHandleFUCHSIA vkGetSemaphoreZirconHandleFUCHSIA;\nextern PFN_vkImportSemaphoreZirconHandleFUCHSIA vkImportSemaphoreZirconHandleFUCHSIA;\n#endif /* defined(VK_FUCHSIA_external_semaphore) */\n#if defined(VK_FUCHSIA_imagepipe_surface)\nextern PFN_vkCreateImagePipeSurfaceFUCHSIA vkCreateImagePipeSurfaceFUCHSIA;\n#endif /* defined(VK_FUCHSIA_imagepipe_surface) */\n#if defined(VK_GGP_stream_descriptor_surface)\nextern PFN_vkCreateStreamDescriptorSurfaceGGP vkCreateStreamDescriptorSurfaceGGP;\n#endif /* defined(VK_GGP_stream_descriptor_surface) */\n#if defined(VK_GOOGLE_display_timing)\nextern PFN_vkGetPastPresentationTimingGOOGLE vkGetPastPresentationTimingGOOGLE;\nextern PFN_vkGetRefreshCycleDurationGOOGLE vkGetRefreshCycleDurationGOOGLE;\n#endif /* defined(VK_GOOGLE_display_timing) */\n#if defined(VK_HUAWEI_cluster_culling_shader)\nextern PFN_vkCmdDrawClusterHUAWEI vkCmdDrawClusterHUAWEI;\nextern PFN_vkCmdDrawClusterIndirectHUAWEI vkCmdDrawClusterIndirectHUAWEI;\n#endif /* defined(VK_HUAWEI_cluster_culling_shader) */\n#if defined(VK_HUAWEI_invocation_mask)\nextern PFN_vkCmdBindInvocationMaskHUAWEI vkCmdBindInvocationMaskHUAWEI;\n#endif /* defined(VK_HUAWEI_invocation_mask) */\n#if defined(VK_HUAWEI_subpass_shading) && VK_HUAWEI_SUBPASS_SHADING_SPEC_VERSION >= 2\nextern PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI;\n#endif /* defined(VK_HUAWEI_subpass_shading) && VK_HUAWEI_SUBPASS_SHADING_SPEC_VERSION >= 2 */\n#if defined(VK_HUAWEI_subpass_shading)\nextern PFN_vkCmdSubpassShadingHUAWEI vkCmdSubpassShadingHUAWEI;\n#endif /* defined(VK_HUAWEI_subpass_shading) */\n#if defined(VK_INTEL_performance_query)\nextern PFN_vkAcquirePerformanceConfigurationINTEL vkAcquirePerformanceConfigurationINTEL;\nextern PFN_vkCmdSetPerformanceMarkerINTEL vkCmdSetPerformanceMarkerINTEL;\nextern PFN_vkCmdSetPerformanceOverrideINTEL vkCmdSetPerformanceOverrideINTEL;\nextern PFN_vkCmdSetPerformanceStreamMarkerINTEL vkCmdSetPerformanceStreamMarkerINTEL;\nextern PFN_vkGetPerformanceParameterINTEL vkGetPerformanceParameterINTEL;\nextern PFN_vkInitializePerformanceApiINTEL vkInitializePerformanceApiINTEL;\nextern PFN_vkQueueSetPerformanceConfigurationINTEL vkQueueSetPerformanceConfigurationINTEL;\nextern PFN_vkReleasePerformanceConfigurationINTEL vkReleasePerformanceConfigurationINTEL;\nextern PFN_vkUninitializePerformanceApiINTEL vkUninitializePerformanceApiINTEL;\n#endif /* defined(VK_INTEL_performance_query) */\n#if defined(VK_KHR_acceleration_structure)\nextern PFN_vkBuildAccelerationStructuresKHR vkBuildAccelerationStructuresKHR;\nextern PFN_vkCmdBuildAccelerationStructuresIndirectKHR vkCmdBuildAccelerationStructuresIndirectKHR;\nextern PFN_vkCmdBuildAccelerationStructuresKHR vkCmdBuildAccelerationStructuresKHR;\nextern PFN_vkCmdCopyAccelerationStructureKHR vkCmdCopyAccelerationStructureKHR;\nextern PFN_vkCmdCopyAccelerationStructureToMemoryKHR vkCmdCopyAccelerationStructureToMemoryKHR;\nextern PFN_vkCmdCopyMemoryToAccelerationStructureKHR vkCmdCopyMemoryToAccelerationStructureKHR;\nextern PFN_vkCmdWriteAccelerationStructuresPropertiesKHR vkCmdWriteAccelerationStructuresPropertiesKHR;\nextern PFN_vkCopyAccelerationStructureKHR vkCopyAccelerationStructureKHR;\nextern PFN_vkCopyAccelerationStructureToMemoryKHR vkCopyAccelerationStructureToMemoryKHR;\nextern PFN_vkCopyMemoryToAccelerationStructureKHR vkCopyMemoryToAccelerationStructureKHR;\nextern PFN_vkCreateAccelerationStructureKHR vkCreateAccelerationStructureKHR;\nextern PFN_vkDestroyAccelerationStructureKHR vkDestroyAccelerationStructureKHR;\nextern PFN_vkGetAccelerationStructureBuildSizesKHR vkGetAccelerationStructureBuildSizesKHR;\nextern PFN_vkGetAccelerationStructureDeviceAddressKHR vkGetAccelerationStructureDeviceAddressKHR;\nextern PFN_vkGetDeviceAccelerationStructureCompatibilityKHR vkGetDeviceAccelerationStructureCompatibilityKHR;\nextern PFN_vkWriteAccelerationStructuresPropertiesKHR vkWriteAccelerationStructuresPropertiesKHR;\n#endif /* defined(VK_KHR_acceleration_structure) */\n#if defined(VK_KHR_android_surface)\nextern PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR;\n#endif /* defined(VK_KHR_android_surface) */\n#if defined(VK_KHR_bind_memory2)\nextern PFN_vkBindBufferMemory2KHR vkBindBufferMemory2KHR;\nextern PFN_vkBindImageMemory2KHR vkBindImageMemory2KHR;\n#endif /* defined(VK_KHR_bind_memory2) */\n#if defined(VK_KHR_buffer_device_address)\nextern PFN_vkGetBufferDeviceAddressKHR vkGetBufferDeviceAddressKHR;\nextern PFN_vkGetBufferOpaqueCaptureAddressKHR vkGetBufferOpaqueCaptureAddressKHR;\nextern PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR vkGetDeviceMemoryOpaqueCaptureAddressKHR;\n#endif /* defined(VK_KHR_buffer_device_address) */\n#if defined(VK_KHR_calibrated_timestamps)\nextern PFN_vkGetCalibratedTimestampsKHR vkGetCalibratedTimestampsKHR;\nextern PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsKHR vkGetPhysicalDeviceCalibrateableTimeDomainsKHR;\n#endif /* defined(VK_KHR_calibrated_timestamps) */\n#if defined(VK_KHR_cooperative_matrix)\nextern PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR;\n#endif /* defined(VK_KHR_cooperative_matrix) */\n#if defined(VK_KHR_copy_commands2)\nextern PFN_vkCmdBlitImage2KHR vkCmdBlitImage2KHR;\nextern PFN_vkCmdCopyBuffer2KHR vkCmdCopyBuffer2KHR;\nextern PFN_vkCmdCopyBufferToImage2KHR vkCmdCopyBufferToImage2KHR;\nextern PFN_vkCmdCopyImage2KHR vkCmdCopyImage2KHR;\nextern PFN_vkCmdCopyImageToBuffer2KHR vkCmdCopyImageToBuffer2KHR;\nextern PFN_vkCmdResolveImage2KHR vkCmdResolveImage2KHR;\n#endif /* defined(VK_KHR_copy_commands2) */\n#if defined(VK_KHR_create_renderpass2)\nextern PFN_vkCmdBeginRenderPass2KHR vkCmdBeginRenderPass2KHR;\nextern PFN_vkCmdEndRenderPass2KHR vkCmdEndRenderPass2KHR;\nextern PFN_vkCmdNextSubpass2KHR vkCmdNextSubpass2KHR;\nextern PFN_vkCreateRenderPass2KHR vkCreateRenderPass2KHR;\n#endif /* defined(VK_KHR_create_renderpass2) */\n#if defined(VK_KHR_deferred_host_operations)\nextern PFN_vkCreateDeferredOperationKHR vkCreateDeferredOperationKHR;\nextern PFN_vkDeferredOperationJoinKHR vkDeferredOperationJoinKHR;\nextern PFN_vkDestroyDeferredOperationKHR vkDestroyDeferredOperationKHR;\nextern PFN_vkGetDeferredOperationMaxConcurrencyKHR vkGetDeferredOperationMaxConcurrencyKHR;\nextern PFN_vkGetDeferredOperationResultKHR vkGetDeferredOperationResultKHR;\n#endif /* defined(VK_KHR_deferred_host_operations) */\n#if defined(VK_KHR_descriptor_update_template)\nextern PFN_vkCreateDescriptorUpdateTemplateKHR vkCreateDescriptorUpdateTemplateKHR;\nextern PFN_vkDestroyDescriptorUpdateTemplateKHR vkDestroyDescriptorUpdateTemplateKHR;\nextern PFN_vkUpdateDescriptorSetWithTemplateKHR vkUpdateDescriptorSetWithTemplateKHR;\n#endif /* defined(VK_KHR_descriptor_update_template) */\n#if defined(VK_KHR_device_group)\nextern PFN_vkCmdDispatchBaseKHR vkCmdDispatchBaseKHR;\nextern PFN_vkCmdSetDeviceMaskKHR vkCmdSetDeviceMaskKHR;\nextern PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR vkGetDeviceGroupPeerMemoryFeaturesKHR;\n#endif /* defined(VK_KHR_device_group) */\n#if defined(VK_KHR_device_group_creation)\nextern PFN_vkEnumeratePhysicalDeviceGroupsKHR vkEnumeratePhysicalDeviceGroupsKHR;\n#endif /* defined(VK_KHR_device_group_creation) */\n#if defined(VK_KHR_display)\nextern PFN_vkCreateDisplayModeKHR vkCreateDisplayModeKHR;\nextern PFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR;\nextern PFN_vkGetDisplayModePropertiesKHR vkGetDisplayModePropertiesKHR;\nextern PFN_vkGetDisplayPlaneCapabilitiesKHR vkGetDisplayPlaneCapabilitiesKHR;\nextern PFN_vkGetDisplayPlaneSupportedDisplaysKHR vkGetDisplayPlaneSupportedDisplaysKHR;\nextern PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR vkGetPhysicalDeviceDisplayPlanePropertiesKHR;\nextern PFN_vkGetPhysicalDeviceDisplayPropertiesKHR vkGetPhysicalDeviceDisplayPropertiesKHR;\n#endif /* defined(VK_KHR_display) */\n#if defined(VK_KHR_display_swapchain)\nextern PFN_vkCreateSharedSwapchainsKHR vkCreateSharedSwapchainsKHR;\n#endif /* defined(VK_KHR_display_swapchain) */\n#if defined(VK_KHR_draw_indirect_count)\nextern PFN_vkCmdDrawIndexedIndirectCountKHR vkCmdDrawIndexedIndirectCountKHR;\nextern PFN_vkCmdDrawIndirectCountKHR vkCmdDrawIndirectCountKHR;\n#endif /* defined(VK_KHR_draw_indirect_count) */\n#if defined(VK_KHR_dynamic_rendering)\nextern PFN_vkCmdBeginRenderingKHR vkCmdBeginRenderingKHR;\nextern PFN_vkCmdEndRenderingKHR vkCmdEndRenderingKHR;\n#endif /* defined(VK_KHR_dynamic_rendering) */\n#if defined(VK_KHR_dynamic_rendering_local_read)\nextern PFN_vkCmdSetRenderingAttachmentLocationsKHR vkCmdSetRenderingAttachmentLocationsKHR;\nextern PFN_vkCmdSetRenderingInputAttachmentIndicesKHR vkCmdSetRenderingInputAttachmentIndicesKHR;\n#endif /* defined(VK_KHR_dynamic_rendering_local_read) */\n#if defined(VK_KHR_external_fence_capabilities)\nextern PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR vkGetPhysicalDeviceExternalFencePropertiesKHR;\n#endif /* defined(VK_KHR_external_fence_capabilities) */\n#if defined(VK_KHR_external_fence_fd)\nextern PFN_vkGetFenceFdKHR vkGetFenceFdKHR;\nextern PFN_vkImportFenceFdKHR vkImportFenceFdKHR;\n#endif /* defined(VK_KHR_external_fence_fd) */\n#if defined(VK_KHR_external_fence_win32)\nextern PFN_vkGetFenceWin32HandleKHR vkGetFenceWin32HandleKHR;\nextern PFN_vkImportFenceWin32HandleKHR vkImportFenceWin32HandleKHR;\n#endif /* defined(VK_KHR_external_fence_win32) */\n#if defined(VK_KHR_external_memory_capabilities)\nextern PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR vkGetPhysicalDeviceExternalBufferPropertiesKHR;\n#endif /* defined(VK_KHR_external_memory_capabilities) */\n#if defined(VK_KHR_external_memory_fd)\nextern PFN_vkGetMemoryFdKHR vkGetMemoryFdKHR;\nextern PFN_vkGetMemoryFdPropertiesKHR vkGetMemoryFdPropertiesKHR;\n#endif /* defined(VK_KHR_external_memory_fd) */\n#if defined(VK_KHR_external_memory_win32)\nextern PFN_vkGetMemoryWin32HandleKHR vkGetMemoryWin32HandleKHR;\nextern PFN_vkGetMemoryWin32HandlePropertiesKHR vkGetMemoryWin32HandlePropertiesKHR;\n#endif /* defined(VK_KHR_external_memory_win32) */\n#if defined(VK_KHR_external_semaphore_capabilities)\nextern PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR vkGetPhysicalDeviceExternalSemaphorePropertiesKHR;\n#endif /* defined(VK_KHR_external_semaphore_capabilities) */\n#if defined(VK_KHR_external_semaphore_fd)\nextern PFN_vkGetSemaphoreFdKHR vkGetSemaphoreFdKHR;\nextern PFN_vkImportSemaphoreFdKHR vkImportSemaphoreFdKHR;\n#endif /* defined(VK_KHR_external_semaphore_fd) */\n#if defined(VK_KHR_external_semaphore_win32)\nextern PFN_vkGetSemaphoreWin32HandleKHR vkGetSemaphoreWin32HandleKHR;\nextern PFN_vkImportSemaphoreWin32HandleKHR vkImportSemaphoreWin32HandleKHR;\n#endif /* defined(VK_KHR_external_semaphore_win32) */\n#if defined(VK_KHR_fragment_shading_rate)\nextern PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR;\nextern PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR vkGetPhysicalDeviceFragmentShadingRatesKHR;\n#endif /* defined(VK_KHR_fragment_shading_rate) */\n#if defined(VK_KHR_get_display_properties2)\nextern PFN_vkGetDisplayModeProperties2KHR vkGetDisplayModeProperties2KHR;\nextern PFN_vkGetDisplayPlaneCapabilities2KHR vkGetDisplayPlaneCapabilities2KHR;\nextern PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR vkGetPhysicalDeviceDisplayPlaneProperties2KHR;\nextern PFN_vkGetPhysicalDeviceDisplayProperties2KHR vkGetPhysicalDeviceDisplayProperties2KHR;\n#endif /* defined(VK_KHR_get_display_properties2) */\n#if defined(VK_KHR_get_memory_requirements2)\nextern PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR;\nextern PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR;\nextern PFN_vkGetImageSparseMemoryRequirements2KHR vkGetImageSparseMemoryRequirements2KHR;\n#endif /* defined(VK_KHR_get_memory_requirements2) */\n#if defined(VK_KHR_get_physical_device_properties2)\nextern PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR;\nextern PFN_vkGetPhysicalDeviceFormatProperties2KHR vkGetPhysicalDeviceFormatProperties2KHR;\nextern PFN_vkGetPhysicalDeviceImageFormatProperties2KHR vkGetPhysicalDeviceImageFormatProperties2KHR;\nextern PFN_vkGetPhysicalDeviceMemoryProperties2KHR vkGetPhysicalDeviceMemoryProperties2KHR;\nextern PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR;\nextern PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR vkGetPhysicalDeviceQueueFamilyProperties2KHR;\nextern PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR vkGetPhysicalDeviceSparseImageFormatProperties2KHR;\n#endif /* defined(VK_KHR_get_physical_device_properties2) */\n#if defined(VK_KHR_get_surface_capabilities2)\nextern PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR vkGetPhysicalDeviceSurfaceCapabilities2KHR;\nextern PFN_vkGetPhysicalDeviceSurfaceFormats2KHR vkGetPhysicalDeviceSurfaceFormats2KHR;\n#endif /* defined(VK_KHR_get_surface_capabilities2) */\n#if defined(VK_KHR_line_rasterization)\nextern PFN_vkCmdSetLineStippleKHR vkCmdSetLineStippleKHR;\n#endif /* defined(VK_KHR_line_rasterization) */\n#if defined(VK_KHR_maintenance1)\nextern PFN_vkTrimCommandPoolKHR vkTrimCommandPoolKHR;\n#endif /* defined(VK_KHR_maintenance1) */\n#if defined(VK_KHR_maintenance3)\nextern PFN_vkGetDescriptorSetLayoutSupportKHR vkGetDescriptorSetLayoutSupportKHR;\n#endif /* defined(VK_KHR_maintenance3) */\n#if defined(VK_KHR_maintenance4)\nextern PFN_vkGetDeviceBufferMemoryRequirementsKHR vkGetDeviceBufferMemoryRequirementsKHR;\nextern PFN_vkGetDeviceImageMemoryRequirementsKHR vkGetDeviceImageMemoryRequirementsKHR;\nextern PFN_vkGetDeviceImageSparseMemoryRequirementsKHR vkGetDeviceImageSparseMemoryRequirementsKHR;\n#endif /* defined(VK_KHR_maintenance4) */\n#if defined(VK_KHR_maintenance5)\nextern PFN_vkCmdBindIndexBuffer2KHR vkCmdBindIndexBuffer2KHR;\nextern PFN_vkGetDeviceImageSubresourceLayoutKHR vkGetDeviceImageSubresourceLayoutKHR;\nextern PFN_vkGetImageSubresourceLayout2KHR vkGetImageSubresourceLayout2KHR;\nextern PFN_vkGetRenderingAreaGranularityKHR vkGetRenderingAreaGranularityKHR;\n#endif /* defined(VK_KHR_maintenance5) */\n#if defined(VK_KHR_maintenance6)\nextern PFN_vkCmdBindDescriptorSets2KHR vkCmdBindDescriptorSets2KHR;\nextern PFN_vkCmdPushConstants2KHR vkCmdPushConstants2KHR;\n#endif /* defined(VK_KHR_maintenance6) */\n#if defined(VK_KHR_maintenance6) && defined(VK_KHR_push_descriptor)\nextern PFN_vkCmdPushDescriptorSet2KHR vkCmdPushDescriptorSet2KHR;\nextern PFN_vkCmdPushDescriptorSetWithTemplate2KHR vkCmdPushDescriptorSetWithTemplate2KHR;\n#endif /* defined(VK_KHR_maintenance6) && defined(VK_KHR_push_descriptor) */\n#if defined(VK_KHR_maintenance6) && defined(VK_EXT_descriptor_buffer)\nextern PFN_vkCmdBindDescriptorBufferEmbeddedSamplers2EXT vkCmdBindDescriptorBufferEmbeddedSamplers2EXT;\nextern PFN_vkCmdSetDescriptorBufferOffsets2EXT vkCmdSetDescriptorBufferOffsets2EXT;\n#endif /* defined(VK_KHR_maintenance6) && defined(VK_EXT_descriptor_buffer) */\n#if defined(VK_KHR_map_memory2)\nextern PFN_vkMapMemory2KHR vkMapMemory2KHR;\nextern PFN_vkUnmapMemory2KHR vkUnmapMemory2KHR;\n#endif /* defined(VK_KHR_map_memory2) */\n#if defined(VK_KHR_performance_query)\nextern PFN_vkAcquireProfilingLockKHR vkAcquireProfilingLockKHR;\nextern PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR;\nextern PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR;\nextern PFN_vkReleaseProfilingLockKHR vkReleaseProfilingLockKHR;\n#endif /* defined(VK_KHR_performance_query) */\n#if defined(VK_KHR_pipeline_binary)\nextern PFN_vkCreatePipelineBinariesKHR vkCreatePipelineBinariesKHR;\nextern PFN_vkDestroyPipelineBinaryKHR vkDestroyPipelineBinaryKHR;\nextern PFN_vkGetPipelineBinaryDataKHR vkGetPipelineBinaryDataKHR;\nextern PFN_vkGetPipelineKeyKHR vkGetPipelineKeyKHR;\nextern PFN_vkReleaseCapturedPipelineDataKHR vkReleaseCapturedPipelineDataKHR;\n#endif /* defined(VK_KHR_pipeline_binary) */\n#if defined(VK_KHR_pipeline_executable_properties)\nextern PFN_vkGetPipelineExecutableInternalRepresentationsKHR vkGetPipelineExecutableInternalRepresentationsKHR;\nextern PFN_vkGetPipelineExecutablePropertiesKHR vkGetPipelineExecutablePropertiesKHR;\nextern PFN_vkGetPipelineExecutableStatisticsKHR vkGetPipelineExecutableStatisticsKHR;\n#endif /* defined(VK_KHR_pipeline_executable_properties) */\n#if defined(VK_KHR_present_wait)\nextern PFN_vkWaitForPresentKHR vkWaitForPresentKHR;\n#endif /* defined(VK_KHR_present_wait) */\n#if defined(VK_KHR_push_descriptor)\nextern PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR;\n#endif /* defined(VK_KHR_push_descriptor) */\n#if defined(VK_KHR_ray_tracing_maintenance1) && defined(VK_KHR_ray_tracing_pipeline)\nextern PFN_vkCmdTraceRaysIndirect2KHR vkCmdTraceRaysIndirect2KHR;\n#endif /* defined(VK_KHR_ray_tracing_maintenance1) && defined(VK_KHR_ray_tracing_pipeline) */\n#if defined(VK_KHR_ray_tracing_pipeline)\nextern PFN_vkCmdSetRayTracingPipelineStackSizeKHR vkCmdSetRayTracingPipelineStackSizeKHR;\nextern PFN_vkCmdTraceRaysIndirectKHR vkCmdTraceRaysIndirectKHR;\nextern PFN_vkCmdTraceRaysKHR vkCmdTraceRaysKHR;\nextern PFN_vkCreateRayTracingPipelinesKHR vkCreateRayTracingPipelinesKHR;\nextern PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR vkGetRayTracingCaptureReplayShaderGroupHandlesKHR;\nextern PFN_vkGetRayTracingShaderGroupHandlesKHR vkGetRayTracingShaderGroupHandlesKHR;\nextern PFN_vkGetRayTracingShaderGroupStackSizeKHR vkGetRayTracingShaderGroupStackSizeKHR;\n#endif /* defined(VK_KHR_ray_tracing_pipeline) */\n#if defined(VK_KHR_sampler_ycbcr_conversion)\nextern PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionKHR;\nextern PFN_vkDestroySamplerYcbcrConversionKHR vkDestroySamplerYcbcrConversionKHR;\n#endif /* defined(VK_KHR_sampler_ycbcr_conversion) */\n#if defined(VK_KHR_shared_presentable_image)\nextern PFN_vkGetSwapchainStatusKHR vkGetSwapchainStatusKHR;\n#endif /* defined(VK_KHR_shared_presentable_image) */\n#if defined(VK_KHR_surface)\nextern PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR;\nextern PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR;\nextern PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR;\nextern PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR;\nextern PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR;\n#endif /* defined(VK_KHR_surface) */\n#if defined(VK_KHR_swapchain)\nextern PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR;\nextern PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR;\nextern PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR;\nextern PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR;\nextern PFN_vkQueuePresentKHR vkQueuePresentKHR;\n#endif /* defined(VK_KHR_swapchain) */\n#if defined(VK_KHR_synchronization2)\nextern PFN_vkCmdPipelineBarrier2KHR vkCmdPipelineBarrier2KHR;\nextern PFN_vkCmdResetEvent2KHR vkCmdResetEvent2KHR;\nextern PFN_vkCmdSetEvent2KHR vkCmdSetEvent2KHR;\nextern PFN_vkCmdWaitEvents2KHR vkCmdWaitEvents2KHR;\nextern PFN_vkCmdWriteTimestamp2KHR vkCmdWriteTimestamp2KHR;\nextern PFN_vkQueueSubmit2KHR vkQueueSubmit2KHR;\n#endif /* defined(VK_KHR_synchronization2) */\n#if defined(VK_KHR_timeline_semaphore)\nextern PFN_vkGetSemaphoreCounterValueKHR vkGetSemaphoreCounterValueKHR;\nextern PFN_vkSignalSemaphoreKHR vkSignalSemaphoreKHR;\nextern PFN_vkWaitSemaphoresKHR vkWaitSemaphoresKHR;\n#endif /* defined(VK_KHR_timeline_semaphore) */\n#if defined(VK_KHR_video_decode_queue)\nextern PFN_vkCmdDecodeVideoKHR vkCmdDecodeVideoKHR;\n#endif /* defined(VK_KHR_video_decode_queue) */\n#if defined(VK_KHR_video_encode_queue)\nextern PFN_vkCmdEncodeVideoKHR vkCmdEncodeVideoKHR;\nextern PFN_vkGetEncodedVideoSessionParametersKHR vkGetEncodedVideoSessionParametersKHR;\nextern PFN_vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR;\n#endif /* defined(VK_KHR_video_encode_queue) */\n#if defined(VK_KHR_video_queue)\nextern PFN_vkBindVideoSessionMemoryKHR vkBindVideoSessionMemoryKHR;\nextern PFN_vkCmdBeginVideoCodingKHR vkCmdBeginVideoCodingKHR;\nextern PFN_vkCmdControlVideoCodingKHR vkCmdControlVideoCodingKHR;\nextern PFN_vkCmdEndVideoCodingKHR vkCmdEndVideoCodingKHR;\nextern PFN_vkCreateVideoSessionKHR vkCreateVideoSessionKHR;\nextern PFN_vkCreateVideoSessionParametersKHR vkCreateVideoSessionParametersKHR;\nextern PFN_vkDestroyVideoSessionKHR vkDestroyVideoSessionKHR;\nextern PFN_vkDestroyVideoSessionParametersKHR vkDestroyVideoSessionParametersKHR;\nextern PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR vkGetPhysicalDeviceVideoCapabilitiesKHR;\nextern PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR vkGetPhysicalDeviceVideoFormatPropertiesKHR;\nextern PFN_vkGetVideoSessionMemoryRequirementsKHR vkGetVideoSessionMemoryRequirementsKHR;\nextern PFN_vkUpdateVideoSessionParametersKHR vkUpdateVideoSessionParametersKHR;\n#endif /* defined(VK_KHR_video_queue) */\n#if defined(VK_KHR_wayland_surface)\nextern PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR;\nextern PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR vkGetPhysicalDeviceWaylandPresentationSupportKHR;\n#endif /* defined(VK_KHR_wayland_surface) */\n#if defined(VK_KHR_win32_surface)\nextern PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR;\nextern PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR vkGetPhysicalDeviceWin32PresentationSupportKHR;\n#endif /* defined(VK_KHR_win32_surface) */\n#if defined(VK_KHR_xcb_surface)\nextern PFN_vkCreateXcbSurfaceKHR vkCreateXcbSurfaceKHR;\nextern PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR vkGetPhysicalDeviceXcbPresentationSupportKHR;\n#endif /* defined(VK_KHR_xcb_surface) */\n#if defined(VK_KHR_xlib_surface)\nextern PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR;\nextern PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR vkGetPhysicalDeviceXlibPresentationSupportKHR;\n#endif /* defined(VK_KHR_xlib_surface) */\n#if defined(VK_MVK_ios_surface)\nextern PFN_vkCreateIOSSurfaceMVK vkCreateIOSSurfaceMVK;\n#endif /* defined(VK_MVK_ios_surface) */\n#if defined(VK_MVK_macos_surface)\nextern PFN_vkCreateMacOSSurfaceMVK vkCreateMacOSSurfaceMVK;\n#endif /* defined(VK_MVK_macos_surface) */\n#if defined(VK_NN_vi_surface)\nextern PFN_vkCreateViSurfaceNN vkCreateViSurfaceNN;\n#endif /* defined(VK_NN_vi_surface) */\n#if defined(VK_NVX_binary_import)\nextern PFN_vkCmdCuLaunchKernelNVX vkCmdCuLaunchKernelNVX;\nextern PFN_vkCreateCuFunctionNVX vkCreateCuFunctionNVX;\nextern PFN_vkCreateCuModuleNVX vkCreateCuModuleNVX;\nextern PFN_vkDestroyCuFunctionNVX vkDestroyCuFunctionNVX;\nextern PFN_vkDestroyCuModuleNVX vkDestroyCuModuleNVX;\n#endif /* defined(VK_NVX_binary_import) */\n#if defined(VK_NVX_image_view_handle)\nextern PFN_vkGetImageViewHandleNVX vkGetImageViewHandleNVX;\n#endif /* defined(VK_NVX_image_view_handle) */\n#if defined(VK_NVX_image_view_handle) && VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION >= 3\nextern PFN_vkGetImageViewHandle64NVX vkGetImageViewHandle64NVX;\n#endif /* defined(VK_NVX_image_view_handle) && VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION >= 3 */\n#if defined(VK_NVX_image_view_handle) && VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION >= 2\nextern PFN_vkGetImageViewAddressNVX vkGetImageViewAddressNVX;\n#endif /* defined(VK_NVX_image_view_handle) && VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION >= 2 */\n#if defined(VK_NV_acquire_winrt_display)\nextern PFN_vkAcquireWinrtDisplayNV vkAcquireWinrtDisplayNV;\nextern PFN_vkGetWinrtDisplayNV vkGetWinrtDisplayNV;\n#endif /* defined(VK_NV_acquire_winrt_display) */\n#if defined(VK_NV_clip_space_w_scaling)\nextern PFN_vkCmdSetViewportWScalingNV vkCmdSetViewportWScalingNV;\n#endif /* defined(VK_NV_clip_space_w_scaling) */\n#if defined(VK_NV_cluster_acceleration_structure)\nextern PFN_vkCmdBuildClusterAccelerationStructureIndirectNV vkCmdBuildClusterAccelerationStructureIndirectNV;\nextern PFN_vkGetClusterAccelerationStructureBuildSizesNV vkGetClusterAccelerationStructureBuildSizesNV;\n#endif /* defined(VK_NV_cluster_acceleration_structure) */\n#if defined(VK_NV_cooperative_matrix)\nextern PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV vkGetPhysicalDeviceCooperativeMatrixPropertiesNV;\n#endif /* defined(VK_NV_cooperative_matrix) */\n#if defined(VK_NV_cooperative_matrix2)\nextern PFN_vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV;\n#endif /* defined(VK_NV_cooperative_matrix2) */\n#if defined(VK_NV_cooperative_vector)\nextern PFN_vkCmdConvertCooperativeVectorMatrixNV vkCmdConvertCooperativeVectorMatrixNV;\nextern PFN_vkConvertCooperativeVectorMatrixNV vkConvertCooperativeVectorMatrixNV;\nextern PFN_vkGetPhysicalDeviceCooperativeVectorPropertiesNV vkGetPhysicalDeviceCooperativeVectorPropertiesNV;\n#endif /* defined(VK_NV_cooperative_vector) */\n#if defined(VK_NV_copy_memory_indirect)\nextern PFN_vkCmdCopyMemoryIndirectNV vkCmdCopyMemoryIndirectNV;\nextern PFN_vkCmdCopyMemoryToImageIndirectNV vkCmdCopyMemoryToImageIndirectNV;\n#endif /* defined(VK_NV_copy_memory_indirect) */\n#if defined(VK_NV_coverage_reduction_mode)\nextern PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV;\n#endif /* defined(VK_NV_coverage_reduction_mode) */\n#if defined(VK_NV_cuda_kernel_launch)\nextern PFN_vkCmdCudaLaunchKernelNV vkCmdCudaLaunchKernelNV;\nextern PFN_vkCreateCudaFunctionNV vkCreateCudaFunctionNV;\nextern PFN_vkCreateCudaModuleNV vkCreateCudaModuleNV;\nextern PFN_vkDestroyCudaFunctionNV vkDestroyCudaFunctionNV;\nextern PFN_vkDestroyCudaModuleNV vkDestroyCudaModuleNV;\nextern PFN_vkGetCudaModuleCacheNV vkGetCudaModuleCacheNV;\n#endif /* defined(VK_NV_cuda_kernel_launch) */\n#if defined(VK_NV_device_diagnostic_checkpoints)\nextern PFN_vkCmdSetCheckpointNV vkCmdSetCheckpointNV;\nextern PFN_vkGetQueueCheckpointDataNV vkGetQueueCheckpointDataNV;\n#endif /* defined(VK_NV_device_diagnostic_checkpoints) */\n#if defined(VK_NV_device_diagnostic_checkpoints) && (defined(VK_VERSION_1_3) || defined(VK_KHR_synchronization2))\nextern PFN_vkGetQueueCheckpointData2NV vkGetQueueCheckpointData2NV;\n#endif /* defined(VK_NV_device_diagnostic_checkpoints) && (defined(VK_VERSION_1_3) || defined(VK_KHR_synchronization2)) */\n#if defined(VK_NV_device_generated_commands)\nextern PFN_vkCmdBindPipelineShaderGroupNV vkCmdBindPipelineShaderGroupNV;\nextern PFN_vkCmdExecuteGeneratedCommandsNV vkCmdExecuteGeneratedCommandsNV;\nextern PFN_vkCmdPreprocessGeneratedCommandsNV vkCmdPreprocessGeneratedCommandsNV;\nextern PFN_vkCreateIndirectCommandsLayoutNV vkCreateIndirectCommandsLayoutNV;\nextern PFN_vkDestroyIndirectCommandsLayoutNV vkDestroyIndirectCommandsLayoutNV;\nextern PFN_vkGetGeneratedCommandsMemoryRequirementsNV vkGetGeneratedCommandsMemoryRequirementsNV;\n#endif /* defined(VK_NV_device_generated_commands) */\n#if defined(VK_NV_device_generated_commands_compute)\nextern PFN_vkCmdUpdatePipelineIndirectBufferNV vkCmdUpdatePipelineIndirectBufferNV;\nextern PFN_vkGetPipelineIndirectDeviceAddressNV vkGetPipelineIndirectDeviceAddressNV;\nextern PFN_vkGetPipelineIndirectMemoryRequirementsNV vkGetPipelineIndirectMemoryRequirementsNV;\n#endif /* defined(VK_NV_device_generated_commands_compute) */\n#if defined(VK_NV_external_memory_capabilities)\nextern PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV vkGetPhysicalDeviceExternalImageFormatPropertiesNV;\n#endif /* defined(VK_NV_external_memory_capabilities) */\n#if defined(VK_NV_external_memory_rdma)\nextern PFN_vkGetMemoryRemoteAddressNV vkGetMemoryRemoteAddressNV;\n#endif /* defined(VK_NV_external_memory_rdma) */\n#if defined(VK_NV_external_memory_win32)\nextern PFN_vkGetMemoryWin32HandleNV vkGetMemoryWin32HandleNV;\n#endif /* defined(VK_NV_external_memory_win32) */\n#if defined(VK_NV_fragment_shading_rate_enums)\nextern PFN_vkCmdSetFragmentShadingRateEnumNV vkCmdSetFragmentShadingRateEnumNV;\n#endif /* defined(VK_NV_fragment_shading_rate_enums) */\n#if defined(VK_NV_low_latency2)\nextern PFN_vkGetLatencyTimingsNV vkGetLatencyTimingsNV;\nextern PFN_vkLatencySleepNV vkLatencySleepNV;\nextern PFN_vkQueueNotifyOutOfBandNV vkQueueNotifyOutOfBandNV;\nextern PFN_vkSetLatencyMarkerNV vkSetLatencyMarkerNV;\nextern PFN_vkSetLatencySleepModeNV vkSetLatencySleepModeNV;\n#endif /* defined(VK_NV_low_latency2) */\n#if defined(VK_NV_memory_decompression)\nextern PFN_vkCmdDecompressMemoryIndirectCountNV vkCmdDecompressMemoryIndirectCountNV;\nextern PFN_vkCmdDecompressMemoryNV vkCmdDecompressMemoryNV;\n#endif /* defined(VK_NV_memory_decompression) */\n#if defined(VK_NV_mesh_shader)\nextern PFN_vkCmdDrawMeshTasksIndirectNV vkCmdDrawMeshTasksIndirectNV;\nextern PFN_vkCmdDrawMeshTasksNV vkCmdDrawMeshTasksNV;\n#endif /* defined(VK_NV_mesh_shader) */\n#if defined(VK_NV_mesh_shader) && (defined(VK_KHR_draw_indirect_count) || defined(VK_VERSION_1_2))\nextern PFN_vkCmdDrawMeshTasksIndirectCountNV vkCmdDrawMeshTasksIndirectCountNV;\n#endif /* defined(VK_NV_mesh_shader) && (defined(VK_KHR_draw_indirect_count) || defined(VK_VERSION_1_2)) */\n#if defined(VK_NV_optical_flow)\nextern PFN_vkBindOpticalFlowSessionImageNV vkBindOpticalFlowSessionImageNV;\nextern PFN_vkCmdOpticalFlowExecuteNV vkCmdOpticalFlowExecuteNV;\nextern PFN_vkCreateOpticalFlowSessionNV vkCreateOpticalFlowSessionNV;\nextern PFN_vkDestroyOpticalFlowSessionNV vkDestroyOpticalFlowSessionNV;\nextern PFN_vkGetPhysicalDeviceOpticalFlowImageFormatsNV vkGetPhysicalDeviceOpticalFlowImageFormatsNV;\n#endif /* defined(VK_NV_optical_flow) */\n#if defined(VK_NV_partitioned_acceleration_structure)\nextern PFN_vkCmdBuildPartitionedAccelerationStructuresNV vkCmdBuildPartitionedAccelerationStructuresNV;\nextern PFN_vkGetPartitionedAccelerationStructuresBuildSizesNV vkGetPartitionedAccelerationStructuresBuildSizesNV;\n#endif /* defined(VK_NV_partitioned_acceleration_structure) */\n#if defined(VK_NV_ray_tracing)\nextern PFN_vkBindAccelerationStructureMemoryNV vkBindAccelerationStructureMemoryNV;\nextern PFN_vkCmdBuildAccelerationStructureNV vkCmdBuildAccelerationStructureNV;\nextern PFN_vkCmdCopyAccelerationStructureNV vkCmdCopyAccelerationStructureNV;\nextern PFN_vkCmdTraceRaysNV vkCmdTraceRaysNV;\nextern PFN_vkCmdWriteAccelerationStructuresPropertiesNV vkCmdWriteAccelerationStructuresPropertiesNV;\nextern PFN_vkCompileDeferredNV vkCompileDeferredNV;\nextern PFN_vkCreateAccelerationStructureNV vkCreateAccelerationStructureNV;\nextern PFN_vkCreateRayTracingPipelinesNV vkCreateRayTracingPipelinesNV;\nextern PFN_vkDestroyAccelerationStructureNV vkDestroyAccelerationStructureNV;\nextern PFN_vkGetAccelerationStructureHandleNV vkGetAccelerationStructureHandleNV;\nextern PFN_vkGetAccelerationStructureMemoryRequirementsNV vkGetAccelerationStructureMemoryRequirementsNV;\nextern PFN_vkGetRayTracingShaderGroupHandlesNV vkGetRayTracingShaderGroupHandlesNV;\n#endif /* defined(VK_NV_ray_tracing) */\n#if defined(VK_NV_scissor_exclusive) && VK_NV_SCISSOR_EXCLUSIVE_SPEC_VERSION >= 2\nextern PFN_vkCmdSetExclusiveScissorEnableNV vkCmdSetExclusiveScissorEnableNV;\n#endif /* defined(VK_NV_scissor_exclusive) && VK_NV_SCISSOR_EXCLUSIVE_SPEC_VERSION >= 2 */\n#if defined(VK_NV_scissor_exclusive)\nextern PFN_vkCmdSetExclusiveScissorNV vkCmdSetExclusiveScissorNV;\n#endif /* defined(VK_NV_scissor_exclusive) */\n#if defined(VK_NV_shading_rate_image)\nextern PFN_vkCmdBindShadingRateImageNV vkCmdBindShadingRateImageNV;\nextern PFN_vkCmdSetCoarseSampleOrderNV vkCmdSetCoarseSampleOrderNV;\nextern PFN_vkCmdSetViewportShadingRatePaletteNV vkCmdSetViewportShadingRatePaletteNV;\n#endif /* defined(VK_NV_shading_rate_image) */\n#if defined(VK_QCOM_tile_properties)\nextern PFN_vkGetDynamicRenderingTilePropertiesQCOM vkGetDynamicRenderingTilePropertiesQCOM;\nextern PFN_vkGetFramebufferTilePropertiesQCOM vkGetFramebufferTilePropertiesQCOM;\n#endif /* defined(VK_QCOM_tile_properties) */\n#if defined(VK_QNX_external_memory_screen_buffer)\nextern PFN_vkGetScreenBufferPropertiesQNX vkGetScreenBufferPropertiesQNX;\n#endif /* defined(VK_QNX_external_memory_screen_buffer) */\n#if defined(VK_QNX_screen_surface)\nextern PFN_vkCreateScreenSurfaceQNX vkCreateScreenSurfaceQNX;\nextern PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX vkGetPhysicalDeviceScreenPresentationSupportQNX;\n#endif /* defined(VK_QNX_screen_surface) */\n#if defined(VK_VALVE_descriptor_set_host_mapping)\nextern PFN_vkGetDescriptorSetHostMappingVALVE vkGetDescriptorSetHostMappingVALVE;\nextern PFN_vkGetDescriptorSetLayoutHostMappingInfoVALVE vkGetDescriptorSetLayoutHostMappingInfoVALVE;\n#endif /* defined(VK_VALVE_descriptor_set_host_mapping) */\n#if (defined(VK_EXT_depth_clamp_control)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clamp_control))\nextern PFN_vkCmdSetDepthClampRangeEXT vkCmdSetDepthClampRangeEXT;\n#endif /* (defined(VK_EXT_depth_clamp_control)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clamp_control)) */\n#if (defined(VK_EXT_extended_dynamic_state)) || (defined(VK_EXT_shader_object))\nextern PFN_vkCmdBindVertexBuffers2EXT vkCmdBindVertexBuffers2EXT;\nextern PFN_vkCmdSetCullModeEXT vkCmdSetCullModeEXT;\nextern PFN_vkCmdSetDepthBoundsTestEnableEXT vkCmdSetDepthBoundsTestEnableEXT;\nextern PFN_vkCmdSetDepthCompareOpEXT vkCmdSetDepthCompareOpEXT;\nextern PFN_vkCmdSetDepthTestEnableEXT vkCmdSetDepthTestEnableEXT;\nextern PFN_vkCmdSetDepthWriteEnableEXT vkCmdSetDepthWriteEnableEXT;\nextern PFN_vkCmdSetFrontFaceEXT vkCmdSetFrontFaceEXT;\nextern PFN_vkCmdSetPrimitiveTopologyEXT vkCmdSetPrimitiveTopologyEXT;\nextern PFN_vkCmdSetScissorWithCountEXT vkCmdSetScissorWithCountEXT;\nextern PFN_vkCmdSetStencilOpEXT vkCmdSetStencilOpEXT;\nextern PFN_vkCmdSetStencilTestEnableEXT vkCmdSetStencilTestEnableEXT;\nextern PFN_vkCmdSetViewportWithCountEXT vkCmdSetViewportWithCountEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state)) || (defined(VK_EXT_shader_object)) */\n#if (defined(VK_EXT_extended_dynamic_state2)) || (defined(VK_EXT_shader_object))\nextern PFN_vkCmdSetDepthBiasEnableEXT vkCmdSetDepthBiasEnableEXT;\nextern PFN_vkCmdSetLogicOpEXT vkCmdSetLogicOpEXT;\nextern PFN_vkCmdSetPatchControlPointsEXT vkCmdSetPatchControlPointsEXT;\nextern PFN_vkCmdSetPrimitiveRestartEnableEXT vkCmdSetPrimitiveRestartEnableEXT;\nextern PFN_vkCmdSetRasterizerDiscardEnableEXT vkCmdSetRasterizerDiscardEnableEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state2)) || (defined(VK_EXT_shader_object)) */\n#if (defined(VK_EXT_extended_dynamic_state3)) || (defined(VK_EXT_shader_object))\nextern PFN_vkCmdSetAlphaToCoverageEnableEXT vkCmdSetAlphaToCoverageEnableEXT;\nextern PFN_vkCmdSetAlphaToOneEnableEXT vkCmdSetAlphaToOneEnableEXT;\nextern PFN_vkCmdSetColorBlendEnableEXT vkCmdSetColorBlendEnableEXT;\nextern PFN_vkCmdSetColorBlendEquationEXT vkCmdSetColorBlendEquationEXT;\nextern PFN_vkCmdSetColorWriteMaskEXT vkCmdSetColorWriteMaskEXT;\nextern PFN_vkCmdSetDepthClampEnableEXT vkCmdSetDepthClampEnableEXT;\nextern PFN_vkCmdSetLogicOpEnableEXT vkCmdSetLogicOpEnableEXT;\nextern PFN_vkCmdSetPolygonModeEXT vkCmdSetPolygonModeEXT;\nextern PFN_vkCmdSetRasterizationSamplesEXT vkCmdSetRasterizationSamplesEXT;\nextern PFN_vkCmdSetSampleMaskEXT vkCmdSetSampleMaskEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3)) || (defined(VK_EXT_shader_object)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && (defined(VK_KHR_maintenance2) || defined(VK_VERSION_1_1))) || (defined(VK_EXT_shader_object))\nextern PFN_vkCmdSetTessellationDomainOriginEXT vkCmdSetTessellationDomainOriginEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && (defined(VK_KHR_maintenance2) || defined(VK_VERSION_1_1))) || (defined(VK_EXT_shader_object)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_transform_feedback)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_transform_feedback))\nextern PFN_vkCmdSetRasterizationStreamEXT vkCmdSetRasterizationStreamEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_transform_feedback)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_transform_feedback)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_conservative_rasterization)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_conservative_rasterization))\nextern PFN_vkCmdSetConservativeRasterizationModeEXT vkCmdSetConservativeRasterizationModeEXT;\nextern PFN_vkCmdSetExtraPrimitiveOverestimationSizeEXT vkCmdSetExtraPrimitiveOverestimationSizeEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_conservative_rasterization)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_conservative_rasterization)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_depth_clip_enable)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clip_enable))\nextern PFN_vkCmdSetDepthClipEnableEXT vkCmdSetDepthClipEnableEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_depth_clip_enable)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clip_enable)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_sample_locations)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_sample_locations))\nextern PFN_vkCmdSetSampleLocationsEnableEXT vkCmdSetSampleLocationsEnableEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_sample_locations)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_sample_locations)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_blend_operation_advanced)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_blend_operation_advanced))\nextern PFN_vkCmdSetColorBlendAdvancedEXT vkCmdSetColorBlendAdvancedEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_blend_operation_advanced)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_blend_operation_advanced)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_provoking_vertex)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_provoking_vertex))\nextern PFN_vkCmdSetProvokingVertexModeEXT vkCmdSetProvokingVertexModeEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_provoking_vertex)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_provoking_vertex)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_line_rasterization)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_line_rasterization))\nextern PFN_vkCmdSetLineRasterizationModeEXT vkCmdSetLineRasterizationModeEXT;\nextern PFN_vkCmdSetLineStippleEnableEXT vkCmdSetLineStippleEnableEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_line_rasterization)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_line_rasterization)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_depth_clip_control)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clip_control))\nextern PFN_vkCmdSetDepthClipNegativeOneToOneEXT vkCmdSetDepthClipNegativeOneToOneEXT;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_EXT_depth_clip_control)) || (defined(VK_EXT_shader_object) && defined(VK_EXT_depth_clip_control)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_clip_space_w_scaling)) || (defined(VK_EXT_shader_object) && defined(VK_NV_clip_space_w_scaling))\nextern PFN_vkCmdSetViewportWScalingEnableNV vkCmdSetViewportWScalingEnableNV;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_clip_space_w_scaling)) || (defined(VK_EXT_shader_object) && defined(VK_NV_clip_space_w_scaling)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_viewport_swizzle)) || (defined(VK_EXT_shader_object) && defined(VK_NV_viewport_swizzle))\nextern PFN_vkCmdSetViewportSwizzleNV vkCmdSetViewportSwizzleNV;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_viewport_swizzle)) || (defined(VK_EXT_shader_object) && defined(VK_NV_viewport_swizzle)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_fragment_coverage_to_color)) || (defined(VK_EXT_shader_object) && defined(VK_NV_fragment_coverage_to_color))\nextern PFN_vkCmdSetCoverageToColorEnableNV vkCmdSetCoverageToColorEnableNV;\nextern PFN_vkCmdSetCoverageToColorLocationNV vkCmdSetCoverageToColorLocationNV;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_fragment_coverage_to_color)) || (defined(VK_EXT_shader_object) && defined(VK_NV_fragment_coverage_to_color)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_framebuffer_mixed_samples)) || (defined(VK_EXT_shader_object) && defined(VK_NV_framebuffer_mixed_samples))\nextern PFN_vkCmdSetCoverageModulationModeNV vkCmdSetCoverageModulationModeNV;\nextern PFN_vkCmdSetCoverageModulationTableEnableNV vkCmdSetCoverageModulationTableEnableNV;\nextern PFN_vkCmdSetCoverageModulationTableNV vkCmdSetCoverageModulationTableNV;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_framebuffer_mixed_samples)) || (defined(VK_EXT_shader_object) && defined(VK_NV_framebuffer_mixed_samples)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_shading_rate_image)) || (defined(VK_EXT_shader_object) && defined(VK_NV_shading_rate_image))\nextern PFN_vkCmdSetShadingRateImageEnableNV vkCmdSetShadingRateImageEnableNV;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_shading_rate_image)) || (defined(VK_EXT_shader_object) && defined(VK_NV_shading_rate_image)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_representative_fragment_test)) || (defined(VK_EXT_shader_object) && defined(VK_NV_representative_fragment_test))\nextern PFN_vkCmdSetRepresentativeFragmentTestEnableNV vkCmdSetRepresentativeFragmentTestEnableNV;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_representative_fragment_test)) || (defined(VK_EXT_shader_object) && defined(VK_NV_representative_fragment_test)) */\n#if (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_coverage_reduction_mode)) || (defined(VK_EXT_shader_object) && defined(VK_NV_coverage_reduction_mode))\nextern PFN_vkCmdSetCoverageReductionModeNV vkCmdSetCoverageReductionModeNV;\n#endif /* (defined(VK_EXT_extended_dynamic_state3) && defined(VK_NV_coverage_reduction_mode)) || (defined(VK_EXT_shader_object) && defined(VK_NV_coverage_reduction_mode)) */\n#if (defined(VK_EXT_host_image_copy)) || (defined(VK_EXT_image_compression_control))\nextern PFN_vkGetImageSubresourceLayout2EXT vkGetImageSubresourceLayout2EXT;\n#endif /* (defined(VK_EXT_host_image_copy)) || (defined(VK_EXT_image_compression_control)) */\n#if (defined(VK_EXT_shader_object)) || (defined(VK_EXT_vertex_input_dynamic_state))\nextern PFN_vkCmdSetVertexInputEXT vkCmdSetVertexInputEXT;\n#endif /* (defined(VK_EXT_shader_object)) || (defined(VK_EXT_vertex_input_dynamic_state)) */\n#if (defined(VK_KHR_descriptor_update_template) && defined(VK_KHR_push_descriptor)) || (defined(VK_KHR_push_descriptor) && (defined(VK_VERSION_1_1) || defined(VK_KHR_descriptor_update_template)))\nextern PFN_vkCmdPushDescriptorSetWithTemplateKHR vkCmdPushDescriptorSetWithTemplateKHR;\n#endif /* (defined(VK_KHR_descriptor_update_template) && defined(VK_KHR_push_descriptor)) || (defined(VK_KHR_push_descriptor) && (defined(VK_VERSION_1_1) || defined(VK_KHR_descriptor_update_template))) */\n#if (defined(VK_KHR_device_group) && defined(VK_KHR_surface)) || (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1))\nextern PFN_vkGetDeviceGroupPresentCapabilitiesKHR vkGetDeviceGroupPresentCapabilitiesKHR;\nextern PFN_vkGetDeviceGroupSurfacePresentModesKHR vkGetDeviceGroupSurfacePresentModesKHR;\nextern PFN_vkGetPhysicalDevicePresentRectanglesKHR vkGetPhysicalDevicePresentRectanglesKHR;\n#endif /* (defined(VK_KHR_device_group) && defined(VK_KHR_surface)) || (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1)) */\n#if (defined(VK_KHR_device_group) && defined(VK_KHR_swapchain)) || (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1))\nextern PFN_vkAcquireNextImage2KHR vkAcquireNextImage2KHR;\n#endif /* (defined(VK_KHR_device_group) && defined(VK_KHR_swapchain)) || (defined(VK_KHR_swapchain) && defined(VK_VERSION_1_1)) */\n/* VOLK_GENERATE_PROTOTYPES_H */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n\n#ifdef VOLK_IMPLEMENTATION\n#undef VOLK_IMPLEMENTATION\n/* Prevent tools like dependency checkers from detecting a cyclic dependency */\n#define VOLK_SOURCE \"volk.c\"\n#include VOLK_SOURCE\n#endif\n\n/**\n * Copyright (c) 2018-2025 Arseny Kapoulkine\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n*/\n/* clang-format on */\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vk_icd.h",
    "content": "/*\n * Copyright 2015-2023 The Khronos Group Inc.\n * Copyright 2015-2023 Valve Corporation\n * Copyright 2015-2023 LunarG, Inc.\n *\n * SPDX-License-Identifier: Apache-2.0\n */\n#pragma once\n\n#include \"vulkan.h\"\n#include <stdbool.h>\n\n// Loader-ICD version negotiation API.  Versions add the following features:\n//   Version 0 - Initial.  Doesn't support vk_icdGetInstanceProcAddr\n//               or vk_icdNegotiateLoaderICDInterfaceVersion.\n//   Version 1 - Add support for vk_icdGetInstanceProcAddr.\n//   Version 2 - Add Loader/ICD Interface version negotiation\n//               via vk_icdNegotiateLoaderICDInterfaceVersion.\n//   Version 3 - Add ICD creation/destruction of KHR_surface objects.\n//   Version 4 - Add unknown physical device extension querying via\n//               vk_icdGetPhysicalDeviceProcAddr.\n//   Version 5 - Tells ICDs that the loader is now paying attention to the\n//               application version of Vulkan passed into the ApplicationInfo\n//               structure during vkCreateInstance.  This will tell the ICD\n//               that if the loader is older, it should automatically fail a\n//               call for any API version > 1.0.  Otherwise, the loader will\n//               manually determine if it can support the expected version.\n//   Version 6 - Add support for vk_icdEnumerateAdapterPhysicalDevices.\n//   Version 7 - If an ICD supports any of the following functions, they must be\n//               queryable with vk_icdGetInstanceProcAddr:\n//                   vk_icdNegotiateLoaderICDInterfaceVersion\n//                   vk_icdGetPhysicalDeviceProcAddr\n//                   vk_icdEnumerateAdapterPhysicalDevices (Windows only)\n//               In addition, these functions no longer need to be exported directly.\n//               This version allows drivers provided through the extension\n//               VK_LUNARG_direct_driver_loading be able to support the entire\n//               Driver-Loader interface.\n\n#define CURRENT_LOADER_ICD_INTERFACE_VERSION 7\n#define MIN_SUPPORTED_LOADER_ICD_INTERFACE_VERSION 0\n#define MIN_PHYS_DEV_EXTENSION_ICD_INTERFACE_VERSION 4\n\n// Old typedefs that don't follow a proper naming convention but are preserved for compatibility\ntypedef VkResult(VKAPI_PTR *PFN_vkNegotiateLoaderICDInterfaceVersion)(uint32_t *pVersion);\n// This is defined in vk_layer.h which will be found by the loader, but if an ICD is building against this\n// file directly, it won't be found.\n#ifndef PFN_GetPhysicalDeviceProcAddr\ntypedef PFN_vkVoidFunction(VKAPI_PTR *PFN_GetPhysicalDeviceProcAddr)(VkInstance instance, const char *pName);\n#endif\n\n// Typedefs for loader/ICD interface\ntypedef VkResult (VKAPI_PTR *PFN_vk_icdNegotiateLoaderICDInterfaceVersion)(uint32_t* pVersion);\ntypedef PFN_vkVoidFunction (VKAPI_PTR *PFN_vk_icdGetInstanceProcAddr)(VkInstance instance, const char* pName);\ntypedef PFN_vkVoidFunction (VKAPI_PTR *PFN_vk_icdGetPhysicalDeviceProcAddr)(VkInstance instance, const char* pName);\n#if defined(VK_USE_PLATFORM_WIN32_KHR)\ntypedef VkResult (VKAPI_PTR *PFN_vk_icdEnumerateAdapterPhysicalDevices)(VkInstance instance, LUID adapterLUID,\n    uint32_t* pPhysicalDeviceCount, VkPhysicalDevice* pPhysicalDevices);\n#endif\n\n// Prototypes for loader/ICD interface\n#if !defined(VK_NO_PROTOTYPES)\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n    VKAPI_ATTR VkResult VKAPI_CALL vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t* pVersion);\n    VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_icdGetInstanceProcAddr(VkInstance instance, const char* pName);\n    VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_icdGetPhysicalDeviceProcAddr(VkInstance instance, const char* pName);\n#if defined(VK_USE_PLATFORM_WIN32_KHR)\n    VKAPI_ATTR VkResult VKAPI_CALL vk_icdEnumerateAdapterPhysicalDevices(VkInstance instance, LUID adapterLUID,\n        uint32_t* pPhysicalDeviceCount, VkPhysicalDevice* pPhysicalDevices);\n#endif\n#ifdef __cplusplus\n}\n#endif\n#endif\n\n/*\n * The ICD must reserve space for a pointer for the loader's dispatch\n * table, at the start of <each object>.\n * The ICD must initialize this variable using the SET_LOADER_MAGIC_VALUE macro.\n */\n\n#define ICD_LOADER_MAGIC 0x01CDC0DE\n\ntypedef union {\n    uintptr_t loaderMagic;\n    void *loaderData;\n} VK_LOADER_DATA;\n\nstatic inline void set_loader_magic_value(void *pNewObject) {\n    VK_LOADER_DATA *loader_info = (VK_LOADER_DATA *)pNewObject;\n    loader_info->loaderMagic = ICD_LOADER_MAGIC;\n}\n\nstatic inline bool valid_loader_magic_value(void *pNewObject) {\n    const VK_LOADER_DATA *loader_info = (VK_LOADER_DATA *)pNewObject;\n    return (loader_info->loaderMagic & 0xffffffff) == ICD_LOADER_MAGIC;\n}\n\n/*\n * Windows and Linux ICDs will treat VkSurfaceKHR as a pointer to a struct that\n * contains the platform-specific connection and surface information.\n */\ntypedef enum {\n    VK_ICD_WSI_PLATFORM_MIR,\n    VK_ICD_WSI_PLATFORM_WAYLAND,\n    VK_ICD_WSI_PLATFORM_WIN32,\n    VK_ICD_WSI_PLATFORM_XCB,\n    VK_ICD_WSI_PLATFORM_XLIB,\n    VK_ICD_WSI_PLATFORM_ANDROID,\n    VK_ICD_WSI_PLATFORM_MACOS,\n    VK_ICD_WSI_PLATFORM_IOS,\n    VK_ICD_WSI_PLATFORM_DISPLAY,\n    VK_ICD_WSI_PLATFORM_HEADLESS,\n    VK_ICD_WSI_PLATFORM_METAL,\n    VK_ICD_WSI_PLATFORM_DIRECTFB,\n    VK_ICD_WSI_PLATFORM_VI,\n    VK_ICD_WSI_PLATFORM_GGP,\n    VK_ICD_WSI_PLATFORM_SCREEN,\n    VK_ICD_WSI_PLATFORM_FUCHSIA,\n} VkIcdWsiPlatform;\n\ntypedef struct {\n    VkIcdWsiPlatform platform;\n} VkIcdSurfaceBase;\n\n#ifdef VK_USE_PLATFORM_MIR_KHR\ntypedef struct {\n    VkIcdSurfaceBase base;\n    MirConnection *connection;\n    MirSurface *mirSurface;\n} VkIcdSurfaceMir;\n#endif  // VK_USE_PLATFORM_MIR_KHR\n\n#ifdef VK_USE_PLATFORM_WAYLAND_KHR\ntypedef struct {\n    VkIcdSurfaceBase base;\n    struct wl_display *display;\n    struct wl_surface *surface;\n} VkIcdSurfaceWayland;\n#endif  // VK_USE_PLATFORM_WAYLAND_KHR\n\n#ifdef VK_USE_PLATFORM_WIN32_KHR\ntypedef struct {\n    VkIcdSurfaceBase base;\n    HINSTANCE hinstance;\n    HWND hwnd;\n} VkIcdSurfaceWin32;\n#endif  // VK_USE_PLATFORM_WIN32_KHR\n\n#ifdef VK_USE_PLATFORM_XCB_KHR\ntypedef struct {\n    VkIcdSurfaceBase base;\n    xcb_connection_t *connection;\n    xcb_window_t window;\n} VkIcdSurfaceXcb;\n#endif  // VK_USE_PLATFORM_XCB_KHR\n\n#ifdef VK_USE_PLATFORM_XLIB_KHR\ntypedef struct {\n    VkIcdSurfaceBase base;\n    Display *dpy;\n    Window window;\n} VkIcdSurfaceXlib;\n#endif  // VK_USE_PLATFORM_XLIB_KHR\n\n#ifdef VK_USE_PLATFORM_DIRECTFB_EXT\ntypedef struct {\n    VkIcdSurfaceBase base;\n    IDirectFB *dfb;\n    IDirectFBSurface *surface;\n} VkIcdSurfaceDirectFB;\n#endif  // VK_USE_PLATFORM_DIRECTFB_EXT\n\n#ifdef VK_USE_PLATFORM_ANDROID_KHR\ntypedef struct {\n    VkIcdSurfaceBase base;\n    struct ANativeWindow *window;\n} VkIcdSurfaceAndroid;\n#endif  // VK_USE_PLATFORM_ANDROID_KHR\n\n#ifdef VK_USE_PLATFORM_MACOS_MVK\ntypedef struct {\n    VkIcdSurfaceBase base;\n    const void *pView;\n} VkIcdSurfaceMacOS;\n#endif  // VK_USE_PLATFORM_MACOS_MVK\n\n#ifdef VK_USE_PLATFORM_IOS_MVK\ntypedef struct {\n    VkIcdSurfaceBase base;\n    const void *pView;\n} VkIcdSurfaceIOS;\n#endif  // VK_USE_PLATFORM_IOS_MVK\n\n#ifdef VK_USE_PLATFORM_GGP\ntypedef struct {\n    VkIcdSurfaceBase base;\n    GgpStreamDescriptor streamDescriptor;\n} VkIcdSurfaceGgp;\n#endif  // VK_USE_PLATFORM_GGP\n\ntypedef struct {\n    VkIcdSurfaceBase base;\n    VkDisplayModeKHR displayMode;\n    uint32_t planeIndex;\n    uint32_t planeStackIndex;\n    VkSurfaceTransformFlagBitsKHR transform;\n    float globalAlpha;\n    VkDisplayPlaneAlphaFlagBitsKHR alphaMode;\n    VkExtent2D imageExtent;\n} VkIcdSurfaceDisplay;\n\ntypedef struct {\n    VkIcdSurfaceBase base;\n} VkIcdSurfaceHeadless;\n\n#ifdef VK_USE_PLATFORM_METAL_EXT\ntypedef struct {\n    VkIcdSurfaceBase base;\n    const CAMetalLayer *pLayer;\n} VkIcdSurfaceMetal;\n#endif // VK_USE_PLATFORM_METAL_EXT\n\n#ifdef VK_USE_PLATFORM_VI_NN\ntypedef struct {\n    VkIcdSurfaceBase base;\n    void *window;\n} VkIcdSurfaceVi;\n#endif // VK_USE_PLATFORM_VI_NN\n\n#ifdef VK_USE_PLATFORM_SCREEN_QNX\ntypedef struct {\n    VkIcdSurfaceBase base;\n    struct _screen_context *context;\n    struct _screen_window *window;\n} VkIcdSurfaceScreen;\n#endif  // VK_USE_PLATFORM_SCREEN_QNX\n\n#ifdef VK_USE_PLATFORM_FUCHSIA\ntypedef struct {\n  VkIcdSurfaceBase base;\n} VkIcdSurfaceImagePipe;\n#endif // VK_USE_PLATFORM_FUCHSIA\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vk_layer.h",
    "content": "/*\n * Copyright 2015-2023 The Khronos Group Inc.\n * Copyright 2015-2023 Valve Corporation\n * Copyright 2015-2023 LunarG, Inc.\n *\n * SPDX-License-Identifier: Apache-2.0\n */\n#pragma once\n\n/* Need to define dispatch table\n * Core struct can then have ptr to dispatch table at the top\n * Along with object ptrs for current and next OBJ\n */\n\n#include \"vulkan_core.h\"\n\n#define MAX_NUM_UNKNOWN_EXTS 250\n\n // Loader-Layer version negotiation API.  Versions add the following features:\n //   Versions 0/1 - Initial.  Doesn't support vk_layerGetPhysicalDeviceProcAddr\n //                  or vk_icdNegotiateLoaderLayerInterfaceVersion.\n //   Version 2    - Add support for vk_layerGetPhysicalDeviceProcAddr and\n //                  vk_icdNegotiateLoaderLayerInterfaceVersion.\n#define CURRENT_LOADER_LAYER_INTERFACE_VERSION 2\n#define MIN_SUPPORTED_LOADER_LAYER_INTERFACE_VERSION 1\n\n#define VK_CURRENT_CHAIN_VERSION 1\n\n// Typedef for use in the interfaces below\ntypedef PFN_vkVoidFunction (VKAPI_PTR *PFN_GetPhysicalDeviceProcAddr)(VkInstance instance, const char* pName);\n\n// Version negotiation values\ntypedef enum VkNegotiateLayerStructType {\n    LAYER_NEGOTIATE_UNINTIALIZED = 0,\n    LAYER_NEGOTIATE_INTERFACE_STRUCT = 1,\n} VkNegotiateLayerStructType;\n\n// Version negotiation structures\ntypedef struct VkNegotiateLayerInterface {\n    VkNegotiateLayerStructType sType;\n    void *pNext;\n    uint32_t loaderLayerInterfaceVersion;\n    PFN_vkGetInstanceProcAddr pfnGetInstanceProcAddr;\n    PFN_vkGetDeviceProcAddr pfnGetDeviceProcAddr;\n    PFN_GetPhysicalDeviceProcAddr pfnGetPhysicalDeviceProcAddr;\n} VkNegotiateLayerInterface;\n\n// Version negotiation functions\ntypedef VkResult (VKAPI_PTR *PFN_vkNegotiateLoaderLayerInterfaceVersion)(VkNegotiateLayerInterface *pVersionStruct);\n\n// Function prototype for unknown physical device extension command\ntypedef VkResult(VKAPI_PTR *PFN_PhysDevExt)(VkPhysicalDevice phys_device);\n\n// ------------------------------------------------------------------------------------------------\n// CreateInstance and CreateDevice support structures\n\n/* Sub type of structure for instance and device loader ext of CreateInfo.\n * When sType == VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO\n * or sType == VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO\n * then VkLayerFunction indicates struct type pointed to by pNext\n */\ntypedef enum VkLayerFunction_ {\n    VK_LAYER_LINK_INFO = 0,\n    VK_LOADER_DATA_CALLBACK = 1,\n    VK_LOADER_LAYER_CREATE_DEVICE_CALLBACK = 2,\n    VK_LOADER_FEATURES = 3,\n} VkLayerFunction;\n\ntypedef struct VkLayerInstanceLink_ {\n    struct VkLayerInstanceLink_ *pNext;\n    PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr;\n    PFN_GetPhysicalDeviceProcAddr pfnNextGetPhysicalDeviceProcAddr;\n} VkLayerInstanceLink;\n\n/*\n * When creating the device chain the loader needs to pass\n * down information about it's device structure needed at\n * the end of the chain. Passing the data via the\n * VkLayerDeviceInfo avoids issues with finding the\n * exact instance being used.\n */\ntypedef struct VkLayerDeviceInfo_ {\n    void *device_info;\n    PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr;\n} VkLayerDeviceInfo;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkSetInstanceLoaderData)(VkInstance instance,\n        void *object);\ntypedef VkResult (VKAPI_PTR *PFN_vkSetDeviceLoaderData)(VkDevice device,\n        void *object);\ntypedef VkResult (VKAPI_PTR *PFN_vkLayerCreateDevice)(VkInstance instance, VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,\n\t\t\t\t\t\t      const VkAllocationCallbacks *pAllocator, VkDevice *pDevice, PFN_vkGetInstanceProcAddr layerGIPA, PFN_vkGetDeviceProcAddr *nextGDPA);\ntypedef void (VKAPI_PTR *PFN_vkLayerDestroyDevice)(VkDevice physicalDevice, const VkAllocationCallbacks *pAllocator, PFN_vkDestroyDevice destroyFunction);\n\ntypedef enum VkLoaderFeastureFlagBits {\n    VK_LOADER_FEATURE_PHYSICAL_DEVICE_SORTING = 0x00000001,\n} VkLoaderFlagBits;\ntypedef VkFlags VkLoaderFeatureFlags;\n\ntypedef struct {\n    VkStructureType sType; // VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO\n    const void *pNext;\n    VkLayerFunction function;\n    union {\n        VkLayerInstanceLink *pLayerInfo;\n        PFN_vkSetInstanceLoaderData pfnSetInstanceLoaderData;\n        struct {\n\t        PFN_vkLayerCreateDevice pfnLayerCreateDevice;\n\t        PFN_vkLayerDestroyDevice pfnLayerDestroyDevice;\n\t    } layerDevice;\n        VkLoaderFeatureFlags loaderFeatures;\n    } u;\n} VkLayerInstanceCreateInfo;\n\ntypedef struct VkLayerDeviceLink_ {\n    struct VkLayerDeviceLink_ *pNext;\n    PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr;\n    PFN_vkGetDeviceProcAddr pfnNextGetDeviceProcAddr;\n} VkLayerDeviceLink;\n\ntypedef struct {\n    VkStructureType sType; // VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO\n    const void *pNext;\n    VkLayerFunction function;\n    union {\n        VkLayerDeviceLink *pLayerInfo;\n        PFN_vkSetDeviceLoaderData pfnSetDeviceLoaderData;\n    } u;\n} VkLayerDeviceCreateInfo;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nVKAPI_ATTR VkResult VKAPI_CALL vkNegotiateLoaderLayerInterfaceVersion(VkNegotiateLayerInterface *pVersionStruct);\n\ntypedef enum VkChainType {\n    VK_CHAIN_TYPE_UNKNOWN = 0,\n    VK_CHAIN_TYPE_ENUMERATE_INSTANCE_EXTENSION_PROPERTIES = 1,\n    VK_CHAIN_TYPE_ENUMERATE_INSTANCE_LAYER_PROPERTIES = 2,\n    VK_CHAIN_TYPE_ENUMERATE_INSTANCE_VERSION = 3,\n} VkChainType;\n\ntypedef struct VkChainHeader {\n    VkChainType type;\n    uint32_t version;\n    uint32_t size;\n} VkChainHeader;\n\ntypedef struct VkEnumerateInstanceExtensionPropertiesChain {\n    VkChainHeader header;\n    VkResult(VKAPI_PTR *pfnNextLayer)(const struct VkEnumerateInstanceExtensionPropertiesChain *, const char *, uint32_t *,\n                                      VkExtensionProperties *);\n    const struct VkEnumerateInstanceExtensionPropertiesChain *pNextLink;\n\n#if defined(__cplusplus)\n    inline VkResult CallDown(const char *pLayerName, uint32_t *pPropertyCount, VkExtensionProperties *pProperties) const {\n        return pfnNextLayer(pNextLink, pLayerName, pPropertyCount, pProperties);\n    }\n#endif\n} VkEnumerateInstanceExtensionPropertiesChain;\n\ntypedef struct VkEnumerateInstanceLayerPropertiesChain {\n    VkChainHeader header;\n    VkResult(VKAPI_PTR *pfnNextLayer)(const struct VkEnumerateInstanceLayerPropertiesChain *, uint32_t *, VkLayerProperties *);\n    const struct VkEnumerateInstanceLayerPropertiesChain *pNextLink;\n\n#if defined(__cplusplus)\n    inline VkResult CallDown(uint32_t *pPropertyCount, VkLayerProperties *pProperties) const {\n        return pfnNextLayer(pNextLink, pPropertyCount, pProperties);\n    }\n#endif\n} VkEnumerateInstanceLayerPropertiesChain;\n\ntypedef struct VkEnumerateInstanceVersionChain {\n    VkChainHeader header;\n    VkResult(VKAPI_PTR *pfnNextLayer)(const struct VkEnumerateInstanceVersionChain *, uint32_t *);\n    const struct VkEnumerateInstanceVersionChain *pNextLink;\n\n#if defined(__cplusplus)\n    inline VkResult CallDown(uint32_t *pApiVersion) const {\n        return pfnNextLayer(pNextLink, pApiVersion);\n    }\n#endif\n} VkEnumerateInstanceVersionChain;\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vk_platform.h",
    "content": "//\n// File: vk_platform.h\n//\n/*\n** Copyright 2014-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n\n#ifndef VK_PLATFORM_H_\n#define VK_PLATFORM_H_\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif // __cplusplus\n\n/*\n***************************************************************************************************\n*   Platform-specific directives and type declarations\n***************************************************************************************************\n*/\n\n/* Platform-specific calling convention macros.\n *\n * Platforms should define these so that Vulkan clients call Vulkan commands\n * with the same calling conventions that the Vulkan implementation expects.\n *\n * VKAPI_ATTR - Placed before the return type in function declarations.\n *              Useful for C++11 and GCC/Clang-style function attribute syntax.\n * VKAPI_CALL - Placed after the return type in function declarations.\n *              Useful for MSVC-style calling convention syntax.\n * VKAPI_PTR  - Placed between the '(' and '*' in function pointer types.\n *\n * Function declaration:  VKAPI_ATTR void VKAPI_CALL vkCommand(void);\n * Function pointer type: typedef void (VKAPI_PTR *PFN_vkCommand)(void);\n */\n#if defined(_WIN32)\n    // On Windows, Vulkan commands use the stdcall convention\n    #define VKAPI_ATTR\n    #define VKAPI_CALL __stdcall\n    #define VKAPI_PTR  VKAPI_CALL\n#elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH < 7\n    #error \"Vulkan is not supported for the 'armeabi' NDK ABI\"\n#elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7 && defined(__ARM_32BIT_STATE)\n    // On Android 32-bit ARM targets, Vulkan functions use the \"hardfloat\"\n    // calling convention, i.e. float parameters are passed in registers. This\n    // is true even if the rest of the application passes floats on the stack,\n    // as it does by default when compiling for the armeabi-v7a NDK ABI.\n    #define VKAPI_ATTR __attribute__((pcs(\"aapcs-vfp\")))\n    #define VKAPI_CALL\n    #define VKAPI_PTR  VKAPI_ATTR\n#else\n    // On other platforms, use the default calling convention\n    #define VKAPI_ATTR\n    #define VKAPI_CALL\n    #define VKAPI_PTR\n#endif\n\n#if !defined(VK_NO_STDDEF_H)\n    #include <stddef.h>\n#endif // !defined(VK_NO_STDDEF_H)\n\n#if !defined(VK_NO_STDINT_H)\n    #if defined(_MSC_VER) && (_MSC_VER < 1600)\n        typedef signed   __int8  int8_t;\n        typedef unsigned __int8  uint8_t;\n        typedef signed   __int16 int16_t;\n        typedef unsigned __int16 uint16_t;\n        typedef signed   __int32 int32_t;\n        typedef unsigned __int32 uint32_t;\n        typedef signed   __int64 int64_t;\n        typedef unsigned __int64 uint64_t;\n    #else\n        #include <stdint.h>\n    #endif\n#endif // !defined(VK_NO_STDINT_H)\n\n#ifdef __cplusplus\n} // extern \"C\"\n#endif // __cplusplus\n\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan.h",
    "content": "#ifndef VULKAN_H_\n#define VULKAN_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n#include \"vk_platform.h\"\n#include \"vulkan_core.h\"\n\n#ifdef VK_USE_PLATFORM_ANDROID_KHR\n#include \"vulkan_android.h\"\n#endif\n\n#ifdef VK_USE_PLATFORM_FUCHSIA\n#include <zircon/types.h>\n#include \"vulkan_fuchsia.h\"\n#endif\n\n#ifdef VK_USE_PLATFORM_IOS_MVK\n#include \"vulkan_ios.h\"\n#endif\n\n\n#ifdef VK_USE_PLATFORM_MACOS_MVK\n#include \"vulkan_macos.h\"\n#endif\n\n#ifdef VK_USE_PLATFORM_METAL_EXT\n#include \"vulkan_metal.h\"\n#endif\n\n#ifdef VK_USE_PLATFORM_VI_NN\n#include \"vulkan_vi.h\"\n#endif\n\n\n#ifdef VK_USE_PLATFORM_WAYLAND_KHR\n#include \"vulkan_wayland.h\"\n#endif\n\n\n#ifdef VK_USE_PLATFORM_WIN32_KHR\n#include <windows.h>\n#include \"vulkan_win32.h\"\n#endif\n\n\n#ifdef VK_USE_PLATFORM_XCB_KHR\n#include <xcb/xcb.h>\n#include \"vulkan_xcb.h\"\n#endif\n\n\n#ifdef VK_USE_PLATFORM_XLIB_KHR\n#include <X11/Xlib.h>\n#include \"vulkan_xlib.h\"\n#endif\n\n\n#ifdef VK_USE_PLATFORM_DIRECTFB_EXT\n#include <directfb.h>\n#include \"vulkan_directfb.h\"\n#endif\n\n\n#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT\n#include <X11/Xlib.h>\n#include <X11/extensions/Xrandr.h>\n#include \"vulkan_xlib_xrandr.h\"\n#endif\n\n\n#ifdef VK_USE_PLATFORM_GGP\n#include <ggp_c/vulkan_types.h>\n#include \"vulkan_ggp.h\"\n#endif\n\n\n#ifdef VK_USE_PLATFORM_SCREEN_QNX\n#include <screen/screen.h>\n#include \"vulkan_screen.h\"\n#endif\n\n\n#ifdef VK_USE_PLATFORM_SCI\n#include <nvscisync.h>\n#include <nvscibuf.h>\n#include \"vulkan_sci.h\"\n#endif\n\n\n#ifdef VK_ENABLE_BETA_EXTENSIONS\n#include \"vulkan_beta.h\"\n#endif\n\n#endif // VULKAN_H_\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan.hpp",
    "content": "// Copyright 2015-2025 The Khronos Group Inc.\n//\n// SPDX-License-Identifier: Apache-2.0 OR MIT\n//\n\n// This header is generated from the Khronos Vulkan XML API Registry.\n\n#ifndef VULKAN_HPP\n#define VULKAN_HPP\n\n#include <vulkan/vulkan_hpp_macros.hpp>\n\n#if defined( VULKAN_HPP_ENABLE_STD_MODULE ) && defined( VULKAN_HPP_STD_MODULE )\n#  include <string.h>\nimport VULKAN_HPP_STD_MODULE;\n#else\n#  include <algorithm>\n#  include <array>     // ArrayWrapperND\n#  include <string.h>  // strnlen\n#  include <string>    // std::string\n#  include <utility>   // std::exchange\n#endif\n#include <vulkan/vulkan.h>\n\n#if 17 <= VULKAN_HPP_CPP_VERSION && !( defined( VULKAN_HPP_ENABLE_STD_MODULE ) && defined( VULKAN_HPP_STD_MODULE ) )\n#  include <string_view>\n#endif\n\n#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE ) && !( defined( VULKAN_HPP_ENABLE_STD_MODULE ) && defined( VULKAN_HPP_STD_MODULE ) )\n#  include <tuple>   // std::tie\n#  include <vector>  // std::vector\n#endif\n\n#if !defined( VULKAN_HPP_NO_EXCEPTIONS ) && !( defined( VULKAN_HPP_ENABLE_STD_MODULE ) && defined( VULKAN_HPP_STD_MODULE ) )\n#  include <system_error>  // std::is_error_code_enum\n#endif\n\n#if ( VULKAN_HPP_ASSERT == assert )\n#  include <cassert>\n#endif\n\n#if VULKAN_HPP_ENABLE_DYNAMIC_LOADER_TOOL == 1\n#  if defined( __unix__ ) || defined( __APPLE__ ) || defined( __QNX__ ) || defined( __Fuchsia__ )\n#    include <dlfcn.h>\n#  elif defined( _WIN32 ) && !defined( VULKAN_HPP_NO_WIN32_PROTOTYPES )\nusing HINSTANCE = struct HINSTANCE__ *;\n#    if defined( _WIN64 )\nusing FARPROC   = int64_t( __stdcall * )();\n#    else\nusing FARPROC = int( __stdcall * )();\n#    endif\nextern \"C\" __declspec( dllimport ) HINSTANCE __stdcall LoadLibraryA( char const * lpLibFileName );\nextern \"C\" __declspec( dllimport ) int __stdcall FreeLibrary( HINSTANCE hLibModule );\nextern \"C\" __declspec( dllimport ) FARPROC __stdcall GetProcAddress( HINSTANCE hModule, const char * lpProcName );\n#  endif\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR ) && !( defined( VULKAN_HPP_ENABLE_STD_MODULE ) && defined( VULKAN_HPP_STD_MODULE ) )\n#  include <compare>\n#endif\n\n#if defined( VULKAN_HPP_SUPPORT_SPAN ) && !( defined( VULKAN_HPP_ENABLE_STD_MODULE ) && defined( VULKAN_HPP_STD_MODULE ) )\n#  include <span>\n#endif\n\nstatic_assert( VK_HEADER_VERSION == 307, \"Wrong VK_HEADER_VERSION!\" );\n\n// <tuple> includes <sys/sysmacros.h> through some other header\n// this results in major(x) being resolved to gnu_dev_major(x)\n// which is an expression in a constructor initializer list.\n#if defined( major )\n#  undef major\n#endif\n#if defined( minor )\n#  undef minor\n#endif\n\n// Windows defines MemoryBarrier which is deprecated and collides\n// with the VULKAN_HPP_NAMESPACE::MemoryBarrier struct.\n#if defined( MemoryBarrier )\n#  undef MemoryBarrier\n#endif\n\n// XLib.h defines True/False, which collides with our vk::True/vk::False\n// ->  undef them and provide some namepace-secure constexpr\n#if defined( True )\n#  undef True\nconstexpr int True = 1;\n#endif\n#if defined( False )\n#  undef False\nconstexpr int False = 0;\n#endif\n\nnamespace VULKAN_HPP_NAMESPACE\n{\n  template <typename T, size_t N>\n  class ArrayWrapper1D : public std::array<T, N>\n  {\n  public:\n    VULKAN_HPP_CONSTEXPR ArrayWrapper1D() VULKAN_HPP_NOEXCEPT : std::array<T, N>() {}\n\n    VULKAN_HPP_CONSTEXPR ArrayWrapper1D( std::array<T, N> const & data ) VULKAN_HPP_NOEXCEPT : std::array<T, N>( data ) {}\n\n    template <typename B = T, typename std::enable_if<std::is_same<B, char>::value, int>::type = 0>\n    VULKAN_HPP_CONSTEXPR_14 ArrayWrapper1D( std::string const & data ) VULKAN_HPP_NOEXCEPT\n    {\n      copy( data.data(), data.length() );\n    }\n\n#if 17 <= VULKAN_HPP_CPP_VERSION\n    template <typename B = T, typename std::enable_if<std::is_same<B, char>::value, int>::type = 0>\n    VULKAN_HPP_CONSTEXPR_14 ArrayWrapper1D( std::string_view data ) VULKAN_HPP_NOEXCEPT\n    {\n      copy( data.data(), data.length() );\n    }\n#endif\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 0 )\n    // on 32 bit compiles, needs overloads on index type int to resolve ambiguities\n    VULKAN_HPP_CONSTEXPR T const & operator[]( int index ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::array<T, N>::operator[]( index );\n    }\n\n    T & operator[]( int index ) VULKAN_HPP_NOEXCEPT\n    {\n      return std::array<T, N>::operator[]( index );\n    }\n#endif\n\n    operator T const *() const VULKAN_HPP_NOEXCEPT\n    {\n      return this->data();\n    }\n\n    operator T *() VULKAN_HPP_NOEXCEPT\n    {\n      return this->data();\n    }\n\n    template <typename B = T, typename std::enable_if<std::is_same<B, char>::value, int>::type = 0>\n    operator std::string() const\n    {\n      return std::string( this->data(), strnlen( this->data(), N ) );\n    }\n\n#if 17 <= VULKAN_HPP_CPP_VERSION\n    template <typename B = T, typename std::enable_if<std::is_same<B, char>::value, int>::type = 0>\n    operator std::string_view() const\n    {\n      return std::string_view( this->data(), strnlen( this->data(), N ) );\n    }\n#endif\n\n  private:\n    VULKAN_HPP_CONSTEXPR_14 void copy( char const * data, size_t len ) VULKAN_HPP_NOEXCEPT\n    {\n      size_t n = ( std::min )( N - 1, len );\n      for ( size_t i = 0; i < n; ++i )\n      {\n        ( *this )[i] = data[i];\n      }\n      ( *this )[n] = 0;\n    }\n  };\n\n// relational operators between ArrayWrapper1D of chars with potentially different sizes\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n  template <size_t N, size_t M>\n  std::strong_ordering operator<=>( ArrayWrapper1D<char, N> const & lhs, ArrayWrapper1D<char, M> const & rhs ) VULKAN_HPP_NOEXCEPT\n  {\n    int result = strcmp( lhs.data(), rhs.data() );\n    return ( result < 0 ) ? std::strong_ordering::less : ( ( result > 0 ) ? std::strong_ordering::greater : std::strong_ordering::equal );\n  }\n#else\n  template <size_t N, size_t M>\n  bool operator<( ArrayWrapper1D<char, N> const & lhs, ArrayWrapper1D<char, M> const & rhs ) VULKAN_HPP_NOEXCEPT\n  {\n    return strcmp( lhs.data(), rhs.data() ) < 0;\n  }\n\n  template <size_t N, size_t M>\n  bool operator<=( ArrayWrapper1D<char, N> const & lhs, ArrayWrapper1D<char, M> const & rhs ) VULKAN_HPP_NOEXCEPT\n  {\n    return strcmp( lhs.data(), rhs.data() ) <= 0;\n  }\n\n  template <size_t N, size_t M>\n  bool operator>( ArrayWrapper1D<char, N> const & lhs, ArrayWrapper1D<char, M> const & rhs ) VULKAN_HPP_NOEXCEPT\n  {\n    return strcmp( lhs.data(), rhs.data() ) > 0;\n  }\n\n  template <size_t N, size_t M>\n  bool operator>=( ArrayWrapper1D<char, N> const & lhs, ArrayWrapper1D<char, M> const & rhs ) VULKAN_HPP_NOEXCEPT\n  {\n    return strcmp( lhs.data(), rhs.data() ) >= 0;\n  }\n#endif\n\n  template <size_t N, size_t M>\n  bool operator==( ArrayWrapper1D<char, N> const & lhs, ArrayWrapper1D<char, M> const & rhs ) VULKAN_HPP_NOEXCEPT\n  {\n    return strcmp( lhs.data(), rhs.data() ) == 0;\n  }\n\n  template <size_t N, size_t M>\n  bool operator!=( ArrayWrapper1D<char, N> const & lhs, ArrayWrapper1D<char, M> const & rhs ) VULKAN_HPP_NOEXCEPT\n  {\n    return strcmp( lhs.data(), rhs.data() ) != 0;\n  }\n\n// specialization of relational operators between std::string and arrays of chars\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n  template <size_t N>\n  std::strong_ordering operator<=>( std::string const & lhs, ArrayWrapper1D<char, N> const & rhs ) VULKAN_HPP_NOEXCEPT\n  {\n    return lhs <=> rhs.data();\n  }\n#else\n  template <size_t N>\n  bool operator<( std::string const & lhs, ArrayWrapper1D<char, N> const & rhs ) VULKAN_HPP_NOEXCEPT\n  {\n    return lhs < rhs.data();\n  }\n\n  template <size_t N>\n  bool operator<=( std::string const & lhs, ArrayWrapper1D<char, N> const & rhs ) VULKAN_HPP_NOEXCEPT\n  {\n    return lhs <= rhs.data();\n  }\n\n  template <size_t N>\n  bool operator>( std::string const & lhs, ArrayWrapper1D<char, N> const & rhs ) VULKAN_HPP_NOEXCEPT\n  {\n    return lhs > rhs.data();\n  }\n\n  template <size_t N>\n  bool operator>=( std::string const & lhs, ArrayWrapper1D<char, N> const & rhs ) VULKAN_HPP_NOEXCEPT\n  {\n    return lhs >= rhs.data();\n  }\n#endif\n\n  template <size_t N>\n  bool operator==( std::string const & lhs, ArrayWrapper1D<char, N> const & rhs ) VULKAN_HPP_NOEXCEPT\n  {\n    return lhs == rhs.data();\n  }\n\n  template <size_t N>\n  bool operator!=( std::string const & lhs, ArrayWrapper1D<char, N> const & rhs ) VULKAN_HPP_NOEXCEPT\n  {\n    return lhs != rhs.data();\n  }\n\n  template <typename T, size_t N, size_t M>\n  class ArrayWrapper2D : public std::array<ArrayWrapper1D<T, M>, N>\n  {\n  public:\n    VULKAN_HPP_CONSTEXPR ArrayWrapper2D() VULKAN_HPP_NOEXCEPT : std::array<ArrayWrapper1D<T, M>, N>() {}\n\n    VULKAN_HPP_CONSTEXPR ArrayWrapper2D( std::array<std::array<T, M>, N> const & data ) VULKAN_HPP_NOEXCEPT\n      : std::array<ArrayWrapper1D<T, M>, N>( *reinterpret_cast<std::array<ArrayWrapper1D<T, M>, N> const *>( &data ) )\n    {\n    }\n  };\n\n#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n  template <typename T>\n  class ArrayProxy\n  {\n  public:\n    VULKAN_HPP_CONSTEXPR ArrayProxy() VULKAN_HPP_NOEXCEPT\n      : m_count( 0 )\n      , m_ptr( nullptr )\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ArrayProxy( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n      : m_count( 0 )\n      , m_ptr( nullptr )\n    {\n    }\n\n    ArrayProxy( T const & value ) VULKAN_HPP_NOEXCEPT\n      : m_count( 1 )\n      , m_ptr( &value )\n    {\n    }\n\n    ArrayProxy( uint32_t count, T const * ptr ) VULKAN_HPP_NOEXCEPT\n      : m_count( count )\n      , m_ptr( ptr )\n    {\n    }\n\n    template <std::size_t C>\n    ArrayProxy( T const ( &ptr )[C] ) VULKAN_HPP_NOEXCEPT\n      : m_count( C )\n      , m_ptr( ptr )\n    {\n    }\n\n#  if __GNUC__ >= 9\n#    pragma GCC diagnostic push\n#    pragma GCC diagnostic ignored \"-Winit-list-lifetime\"\n#  endif\n\n    ArrayProxy( std::initializer_list<T> const & list ) VULKAN_HPP_NOEXCEPT\n      : m_count( static_cast<uint32_t>( list.size() ) )\n      , m_ptr( list.begin() )\n    {\n    }\n\n    template <typename B = T, typename std::enable_if<std::is_const<B>::value, int>::type = 0>\n    ArrayProxy( std::initializer_list<typename std::remove_const<T>::type> const & list ) VULKAN_HPP_NOEXCEPT\n      : m_count( static_cast<uint32_t>( list.size() ) )\n      , m_ptr( list.begin() )\n    {\n    }\n\n#  if __GNUC__ >= 9\n#    pragma GCC diagnostic pop\n#  endif\n\n    // Any type with a .data() return type implicitly convertible to T*, and a .size() return type implicitly\n    // convertible to size_t. The const version can capture temporaries, with lifetime ending at end of statement.\n    template <typename V,\n              typename std::enable_if<std::is_convertible<decltype( std::declval<V>().data() ), T *>::value &&\n                                      std::is_convertible<decltype( std::declval<V>().size() ), std::size_t>::value>::type * = nullptr>\n    ArrayProxy( V const & v ) VULKAN_HPP_NOEXCEPT\n      : m_count( static_cast<uint32_t>( v.size() ) )\n      , m_ptr( v.data() )\n    {\n    }\n\n    const T * begin() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_ptr;\n    }\n\n    const T * end() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_ptr + m_count;\n    }\n\n    const T & front() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( m_count && m_ptr );\n      return *m_ptr;\n    }\n\n    const T & back() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( m_count && m_ptr );\n      return *( m_ptr + m_count - 1 );\n    }\n\n    bool empty() const VULKAN_HPP_NOEXCEPT\n    {\n      return ( m_count == 0 );\n    }\n\n    uint32_t size() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_count;\n    }\n\n    T const * data() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_ptr;\n    }\n\n  private:\n    uint32_t  m_count;\n    T const * m_ptr;\n  };\n\n  template <typename T>\n  class ArrayProxyNoTemporaries\n  {\n  public:\n    VULKAN_HPP_CONSTEXPR ArrayProxyNoTemporaries() VULKAN_HPP_NOEXCEPT\n      : m_count( 0 )\n      , m_ptr( nullptr )\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ArrayProxyNoTemporaries( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n      : m_count( 0 )\n      , m_ptr( nullptr )\n    {\n    }\n\n    template <typename B = T, typename std::enable_if<std::is_convertible<B, T>::value && std::is_lvalue_reference<B>::value, int>::type = 0>\n    ArrayProxyNoTemporaries( B && value ) VULKAN_HPP_NOEXCEPT\n      : m_count( 1 )\n      , m_ptr( &value )\n    {\n    }\n\n    ArrayProxyNoTemporaries( uint32_t count, T * ptr ) VULKAN_HPP_NOEXCEPT\n      : m_count( count )\n      , m_ptr( ptr )\n    {\n    }\n\n    template <std::size_t C>\n    ArrayProxyNoTemporaries( T ( &ptr )[C] ) VULKAN_HPP_NOEXCEPT\n      : m_count( C )\n      , m_ptr( ptr )\n    {\n    }\n\n    template <std::size_t C>\n    ArrayProxyNoTemporaries( T ( &&ptr )[C] ) = delete;\n\n    // Any l-value reference with a .data() return type implicitly convertible to T*, and a .size() return type implicitly convertible to size_t.\n    template <typename V,\n              typename std::enable_if<!std::is_convertible<decltype( std::declval<V>().begin() ), T *>::value &&\n                                        std::is_convertible<decltype( std::declval<V>().data() ), T *>::value &&\n                                        std::is_convertible<decltype( std::declval<V>().size() ), std::size_t>::value && std::is_lvalue_reference<V>::value,\n                                      int>::type = 0>\n    ArrayProxyNoTemporaries( V && v ) VULKAN_HPP_NOEXCEPT\n      : m_count( static_cast<uint32_t>( v.size() ) )\n      , m_ptr( v.data() )\n    {\n    }\n\n    // Any l-value reference with a .begin() return type implicitly convertible to T*, and a .size() return type implicitly convertible to size_t.\n    template <typename V,\n              typename std::enable_if<std::is_convertible<decltype( std::declval<V>().begin() ), T *>::value &&\n                                        std::is_convertible<decltype( std::declval<V>().size() ), std::size_t>::value && std::is_lvalue_reference<V>::value,\n                                      int>::type = 0>\n    ArrayProxyNoTemporaries( V && v ) VULKAN_HPP_NOEXCEPT\n      : m_count( static_cast<uint32_t>( v.size() ) )\n      , m_ptr( v.begin() )\n    {\n    }\n\n    const T * begin() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_ptr;\n    }\n\n    const T * end() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_ptr + m_count;\n    }\n\n    const T & front() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( m_count && m_ptr );\n      return *m_ptr;\n    }\n\n    const T & back() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( m_count && m_ptr );\n      return *( m_ptr + m_count - 1 );\n    }\n\n    bool empty() const VULKAN_HPP_NOEXCEPT\n    {\n      return ( m_count == 0 );\n    }\n\n    uint32_t size() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_count;\n    }\n\n    T * data() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_ptr;\n    }\n\n  private:\n    uint32_t m_count;\n    T *      m_ptr;\n  };\n\n  template <typename T>\n  class StridedArrayProxy : protected ArrayProxy<T>\n  {\n  public:\n    using ArrayProxy<T>::ArrayProxy;\n\n    StridedArrayProxy( uint32_t count, T const * ptr, uint32_t stride ) VULKAN_HPP_NOEXCEPT\n      : ArrayProxy<T>( count, ptr )\n      , m_stride( stride )\n    {\n      VULKAN_HPP_ASSERT( sizeof( T ) <= stride );\n    }\n\n    using ArrayProxy<T>::begin;\n\n    const T * end() const VULKAN_HPP_NOEXCEPT\n    {\n      return reinterpret_cast<T const *>( static_cast<uint8_t const *>( begin() ) + size() * m_stride );\n    }\n\n    using ArrayProxy<T>::front;\n\n    const T & back() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( begin() && size() );\n      return *reinterpret_cast<T const *>( static_cast<uint8_t const *>( begin() ) + ( size() - 1 ) * m_stride );\n    }\n\n    using ArrayProxy<T>::empty;\n    using ArrayProxy<T>::size;\n    using ArrayProxy<T>::data;\n\n    uint32_t stride() const\n    {\n      return m_stride;\n    }\n\n  private:\n    uint32_t m_stride = sizeof( T );\n  };\n\n  template <typename RefType>\n  class Optional\n  {\n  public:\n    Optional( RefType & reference ) VULKAN_HPP_NOEXCEPT\n    {\n      m_ptr = &reference;\n    }\n\n    Optional( RefType * ptr ) VULKAN_HPP_NOEXCEPT\n    {\n      m_ptr = ptr;\n    }\n\n    Optional( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_ptr = nullptr;\n    }\n\n    operator RefType *() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_ptr;\n    }\n\n    RefType const * operator->() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_ptr;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return !!m_ptr;\n    }\n\n  private:\n    RefType * m_ptr;\n  };\n\n  template <typename X, typename Y>\n  struct StructExtends\n  {\n    enum\n    {\n      value = false\n    };\n  };\n\n  template <typename Type, class...>\n  struct IsPartOfStructureChain\n  {\n    static const bool valid = false;\n  };\n\n  template <typename Type, typename Head, typename... Tail>\n  struct IsPartOfStructureChain<Type, Head, Tail...>\n  {\n    static const bool valid = std::is_same<Type, Head>::value || IsPartOfStructureChain<Type, Tail...>::valid;\n  };\n\n  template <size_t Index, typename T, typename... ChainElements>\n  struct StructureChainContains\n  {\n    static const bool value = std::is_same<T, typename std::tuple_element<Index, std::tuple<ChainElements...>>::type>::value ||\n                              StructureChainContains<Index - 1, T, ChainElements...>::value;\n  };\n\n  template <typename T, typename... ChainElements>\n  struct StructureChainContains<0, T, ChainElements...>\n  {\n    static const bool value = std::is_same<T, typename std::tuple_element<0, std::tuple<ChainElements...>>::type>::value;\n  };\n\n  template <size_t Index, typename... ChainElements>\n  struct StructureChainValidation\n  {\n    using TestType          = typename std::tuple_element<Index, std::tuple<ChainElements...>>::type;\n    static const bool valid = StructExtends<TestType, typename std::tuple_element<0, std::tuple<ChainElements...>>::type>::value &&\n                              ( TestType::allowDuplicate || !StructureChainContains<Index - 1, TestType, ChainElements...>::value ) &&\n                              StructureChainValidation<Index - 1, ChainElements...>::valid;\n  };\n\n  template <typename... ChainElements>\n  struct StructureChainValidation<0, ChainElements...>\n  {\n    static const bool valid = true;\n  };\n\n  template <typename... ChainElements>\n  class StructureChain : public std::tuple<ChainElements...>\n  {\n    // Note: StructureChain has no move constructor or move assignment operator, as it is not supposed to contain movable containers.\n    //       In order to get a copy-operation on a move-operations, those functions are neither deleted nor defaulted.\n  public:\n    StructureChain() VULKAN_HPP_NOEXCEPT\n    {\n      static_assert( StructureChainValidation<sizeof...( ChainElements ) - 1, ChainElements...>::valid, \"The structure chain is not valid!\" );\n      link<sizeof...( ChainElements ) - 1>();\n    }\n\n    StructureChain( StructureChain const & rhs ) VULKAN_HPP_NOEXCEPT : std::tuple<ChainElements...>( rhs )\n    {\n      static_assert( StructureChainValidation<sizeof...( ChainElements ) - 1, ChainElements...>::valid, \"The structure chain is not valid!\" );\n      link( &std::get<0>( *this ),\n            &std::get<0>( rhs ),\n            reinterpret_cast<VkBaseOutStructure *>( &std::get<0>( *this ) ),\n            reinterpret_cast<VkBaseInStructure const *>( &std::get<0>( rhs ) ) );\n    }\n\n    StructureChain( ChainElements const &... elems ) VULKAN_HPP_NOEXCEPT : std::tuple<ChainElements...>( elems... )\n    {\n      static_assert( StructureChainValidation<sizeof...( ChainElements ) - 1, ChainElements...>::valid, \"The structure chain is not valid!\" );\n      link<sizeof...( ChainElements ) - 1>();\n    }\n\n    StructureChain & operator=( StructureChain const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      std::tuple<ChainElements...>::operator=( rhs );\n      link( &std::get<0>( *this ),\n            &std::get<0>( rhs ),\n            reinterpret_cast<VkBaseOutStructure *>( &std::get<0>( *this ) ),\n            reinterpret_cast<VkBaseInStructure const *>( &std::get<0>( rhs ) ) );\n      return *this;\n    }\n\n    template <typename T = typename std::tuple_element<0, std::tuple<ChainElements...>>::type, size_t Which = 0>\n    T & get() VULKAN_HPP_NOEXCEPT\n    {\n      return std::get<ChainElementIndex<0, T, Which, void, ChainElements...>::value>( static_cast<std::tuple<ChainElements...> &>( *this ) );\n    }\n\n    template <typename T = typename std::tuple_element<0, std::tuple<ChainElements...>>::type, size_t Which = 0>\n    T const & get() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::get<ChainElementIndex<0, T, Which, void, ChainElements...>::value>( static_cast<std::tuple<ChainElements...> const &>( *this ) );\n    }\n\n    template <typename T0, typename T1, typename... Ts>\n    std::tuple<T0 &, T1 &, Ts &...> get() VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( get<T0>(), get<T1>(), get<Ts>()... );\n    }\n\n    template <typename T0, typename T1, typename... Ts>\n    std::tuple<T0 const &, T1 const &, Ts const &...> get() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( get<T0>(), get<T1>(), get<Ts>()... );\n    }\n\n    // assign a complete structure to the StructureChain without modifying the chaining\n    template <typename T = typename std::tuple_element<0, std::tuple<ChainElements...>>::type, size_t Which = 0>\n    StructureChain & assign( const T & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      T &  lhs   = get<T, Which>();\n      auto pNext = lhs.pNext;\n      lhs        = rhs;\n      lhs.pNext  = pNext;\n      return *this;\n    }\n\n    template <typename ClassType, size_t Which = 0>\n    typename std::enable_if<std::is_same<ClassType, typename std::tuple_element<0, std::tuple<ChainElements...>>::type>::value && ( Which == 0 ), bool>::type\n      isLinked() const VULKAN_HPP_NOEXCEPT\n    {\n      return true;\n    }\n\n    template <typename ClassType, size_t Which = 0>\n    typename std::enable_if<!std::is_same<ClassType, typename std::tuple_element<0, std::tuple<ChainElements...>>::type>::value || ( Which != 0 ), bool>::type\n      isLinked() const VULKAN_HPP_NOEXCEPT\n    {\n      static_assert( IsPartOfStructureChain<ClassType, ChainElements...>::valid, \"Can't unlink Structure that's not part of this StructureChain!\" );\n      return isLinked( reinterpret_cast<VkBaseInStructure const *>( &get<ClassType, Which>() ) );\n    }\n\n    template <typename ClassType, size_t Which = 0>\n    typename std::enable_if<!std::is_same<ClassType, typename std::tuple_element<0, std::tuple<ChainElements...>>::type>::value || ( Which != 0 ), void>::type\n      relink() VULKAN_HPP_NOEXCEPT\n    {\n      static_assert( IsPartOfStructureChain<ClassType, ChainElements...>::valid, \"Can't relink Structure that's not part of this StructureChain!\" );\n      auto pNext = reinterpret_cast<VkBaseInStructure *>( &get<ClassType, Which>() );\n      VULKAN_HPP_ASSERT( !isLinked( pNext ) );\n      auto & headElement = std::get<0>( static_cast<std::tuple<ChainElements...> &>( *this ) );\n      pNext->pNext       = reinterpret_cast<VkBaseInStructure const *>( headElement.pNext );\n      headElement.pNext  = pNext;\n    }\n\n    template <typename ClassType, size_t Which = 0>\n    typename std::enable_if<!std::is_same<ClassType, typename std::tuple_element<0, std::tuple<ChainElements...>>::type>::value || ( Which != 0 ), void>::type\n      unlink() VULKAN_HPP_NOEXCEPT\n    {\n      static_assert( IsPartOfStructureChain<ClassType, ChainElements...>::valid, \"Can't unlink Structure that's not part of this StructureChain!\" );\n      unlink( reinterpret_cast<VkBaseOutStructure const *>( &get<ClassType, Which>() ) );\n    }\n\n  private:\n    template <int Index, typename T, int Which, typename, class First, class... Types>\n    struct ChainElementIndex : ChainElementIndex<Index + 1, T, Which, void, Types...>\n    {\n    };\n\n    template <int Index, typename T, int Which, class First, class... Types>\n    struct ChainElementIndex<Index, T, Which, typename std::enable_if<!std::is_same<T, First>::value, void>::type, First, Types...>\n      : ChainElementIndex<Index + 1, T, Which, void, Types...>\n    {\n    };\n\n    template <int Index, typename T, int Which, class First, class... Types>\n    struct ChainElementIndex<Index, T, Which, typename std::enable_if<std::is_same<T, First>::value, void>::type, First, Types...>\n      : ChainElementIndex<Index + 1, T, Which - 1, void, Types...>\n    {\n    };\n\n    template <int Index, typename T, class First, class... Types>\n    struct ChainElementIndex<Index, T, 0, typename std::enable_if<std::is_same<T, First>::value, void>::type, First, Types...>\n      : std::integral_constant<int, Index>\n    {\n    };\n\n    bool isLinked( VkBaseInStructure const * pNext ) const VULKAN_HPP_NOEXCEPT\n    {\n      VkBaseInStructure const * elementPtr =\n        reinterpret_cast<VkBaseInStructure const *>( &std::get<0>( static_cast<std::tuple<ChainElements...> const &>( *this ) ) );\n      while ( elementPtr )\n      {\n        if ( elementPtr->pNext == pNext )\n        {\n          return true;\n        }\n        elementPtr = elementPtr->pNext;\n      }\n      return false;\n    }\n\n    template <size_t Index>\n    typename std::enable_if<Index != 0, void>::type link() VULKAN_HPP_NOEXCEPT\n    {\n      auto & x = std::get<Index - 1>( static_cast<std::tuple<ChainElements...> &>( *this ) );\n      x.pNext  = &std::get<Index>( static_cast<std::tuple<ChainElements...> &>( *this ) );\n      link<Index - 1>();\n    }\n\n    template <size_t Index>\n    typename std::enable_if<Index == 0, void>::type link() VULKAN_HPP_NOEXCEPT\n    {\n    }\n\n    void link( void * dstBase, void const * srcBase, VkBaseOutStructure * dst, VkBaseInStructure const * src )\n    {\n      while ( src->pNext )\n      {\n        std::ptrdiff_t offset = reinterpret_cast<char const *>( src->pNext ) - reinterpret_cast<char const *>( srcBase );\n        dst->pNext            = reinterpret_cast<VkBaseOutStructure *>( reinterpret_cast<char *>( dstBase ) + offset );\n        dst                   = dst->pNext;\n        src                   = src->pNext;\n      }\n      dst->pNext = nullptr;\n    }\n\n    void unlink( VkBaseOutStructure const * pNext ) VULKAN_HPP_NOEXCEPT\n    {\n      VkBaseOutStructure * elementPtr = reinterpret_cast<VkBaseOutStructure *>( &std::get<0>( static_cast<std::tuple<ChainElements...> &>( *this ) ) );\n      while ( elementPtr && ( elementPtr->pNext != pNext ) )\n      {\n        elementPtr = elementPtr->pNext;\n      }\n      if ( elementPtr )\n      {\n        elementPtr->pNext = pNext->pNext;\n      }\n      else\n      {\n        VULKAN_HPP_ASSERT( false );  // fires, if the ClassType member has already been unlinked !\n      }\n    }\n  };\n\n  // interupt the VULKAN_HPP_NAMESPACE for a moment to add specializations of std::tuple_size and std::tuple_element for the StructureChain!\n}\n\nnamespace std\n{\n  template <typename... Elements>\n  struct tuple_size<VULKAN_HPP_NAMESPACE::StructureChain<Elements...>>\n  {\n    static constexpr size_t value = std::tuple_size<std::tuple<Elements...>>::value;\n  };\n\n  template <std::size_t Index, typename... Elements>\n  struct tuple_element<Index, VULKAN_HPP_NAMESPACE::StructureChain<Elements...>>\n  {\n    using type = typename std::tuple_element<Index, std::tuple<Elements...>>::type;\n  };\n}  // namespace std\n\nnamespace VULKAN_HPP_NAMESPACE\n{\n\n#  if !defined( VULKAN_HPP_NO_SMART_HANDLE )\n  template <typename Type, typename Dispatch>\n  class UniqueHandleTraits;\n\n  template <typename Type, typename Dispatch>\n  class UniqueHandle : public UniqueHandleTraits<Type, Dispatch>::deleter\n  {\n  private:\n    using Deleter = typename UniqueHandleTraits<Type, Dispatch>::deleter;\n\n  public:\n    using element_type = Type;\n\n    UniqueHandle() : Deleter(), m_value() {}\n\n    explicit UniqueHandle( Type const & value, Deleter const & deleter = Deleter() ) VULKAN_HPP_NOEXCEPT\n      : Deleter( deleter )\n      , m_value( value )\n    {\n    }\n\n    UniqueHandle( UniqueHandle const & ) = delete;\n\n    UniqueHandle( UniqueHandle && other ) VULKAN_HPP_NOEXCEPT\n      : Deleter( std::move( static_cast<Deleter &>( other ) ) )\n      , m_value( other.release() )\n    {\n    }\n\n    ~UniqueHandle() VULKAN_HPP_NOEXCEPT\n    {\n      if ( m_value )\n      {\n        this->destroy( m_value );\n      }\n    }\n\n    UniqueHandle & operator=( UniqueHandle const & ) = delete;\n\n    UniqueHandle & operator=( UniqueHandle && other ) VULKAN_HPP_NOEXCEPT\n    {\n      reset( other.release() );\n      *static_cast<Deleter *>( this ) = std::move( static_cast<Deleter &>( other ) );\n      return *this;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_value.operator bool();\n    }\n\n#    if defined( VULKAN_HPP_SMART_HANDLE_IMPLICIT_CAST )\n    operator Type() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_value;\n    }\n#    endif\n\n    Type const * operator->() const VULKAN_HPP_NOEXCEPT\n    {\n      return &m_value;\n    }\n\n    Type * operator->() VULKAN_HPP_NOEXCEPT\n    {\n      return &m_value;\n    }\n\n    Type const & operator*() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_value;\n    }\n\n    Type & operator*() VULKAN_HPP_NOEXCEPT\n    {\n      return m_value;\n    }\n\n    const Type & get() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_value;\n    }\n\n    Type & get() VULKAN_HPP_NOEXCEPT\n    {\n      return m_value;\n    }\n\n    void reset( Type const & value = Type() ) VULKAN_HPP_NOEXCEPT\n    {\n      if ( m_value != value )\n      {\n        if ( m_value )\n        {\n          this->destroy( m_value );\n        }\n        m_value = value;\n      }\n    }\n\n    Type release() VULKAN_HPP_NOEXCEPT\n    {\n      Type value = m_value;\n      m_value    = nullptr;\n      return value;\n    }\n\n    void swap( UniqueHandle<Type, Dispatch> & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      std::swap( m_value, rhs.m_value );\n      std::swap( static_cast<Deleter &>( *this ), static_cast<Deleter &>( rhs ) );\n    }\n\n  private:\n    Type m_value;\n  };\n\n  template <typename UniqueType>\n  VULKAN_HPP_INLINE std::vector<typename UniqueType::element_type> uniqueToRaw( std::vector<UniqueType> const & handles )\n  {\n    std::vector<typename UniqueType::element_type> newBuffer( handles.size() );\n    std::transform( handles.begin(), handles.end(), newBuffer.begin(), []( UniqueType const & handle ) { return handle.get(); } );\n    return newBuffer;\n  }\n\n  template <typename Type, typename Dispatch>\n  VULKAN_HPP_INLINE void swap( UniqueHandle<Type, Dispatch> & lhs, UniqueHandle<Type, Dispatch> & rhs ) VULKAN_HPP_NOEXCEPT\n  {\n    lhs.swap( rhs );\n  }\n#  endif\n#endif  // VULKAN_HPP_DISABLE_ENHANCED_MODE\n\n  namespace detail\n  {\n    class DispatchLoaderBase\n    {\n    public:\n      DispatchLoaderBase() = default;\n      DispatchLoaderBase( std::nullptr_t )\n#if !defined( NDEBUG )\n        : m_valid( false )\n#endif\n      {\n      }\n\n#if !defined( NDEBUG )\n      size_t getVkHeaderVersion() const\n      {\n        VULKAN_HPP_ASSERT( m_valid );\n        return vkHeaderVersion;\n      }\n\n    private:\n      size_t vkHeaderVersion = VK_HEADER_VERSION;\n      bool   m_valid         = true;\n#endif\n    };\n\n#if !defined( VK_NO_PROTOTYPES ) || ( defined( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC ) && ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 0 ) )\n    class DispatchLoaderStatic : public DispatchLoaderBase\n    {\n    public:\n      //=== VK_VERSION_1_0 ===\n\n      VkResult\n        vkCreateInstance( const VkInstanceCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkInstance * pInstance ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateInstance( pCreateInfo, pAllocator, pInstance );\n      }\n\n      void vkDestroyInstance( VkInstance instance, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyInstance( instance, pAllocator );\n      }\n\n      VkResult vkEnumeratePhysicalDevices( VkInstance instance, uint32_t * pPhysicalDeviceCount, VkPhysicalDevice * pPhysicalDevices ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkEnumeratePhysicalDevices( instance, pPhysicalDeviceCount, pPhysicalDevices );\n      }\n\n      void vkGetPhysicalDeviceFeatures( VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures * pFeatures ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceFeatures( physicalDevice, pFeatures );\n      }\n\n      void vkGetPhysicalDeviceFormatProperties( VkPhysicalDevice     physicalDevice,\n                                                VkFormat             format,\n                                                VkFormatProperties * pFormatProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceFormatProperties( physicalDevice, format, pFormatProperties );\n      }\n\n      VkResult vkGetPhysicalDeviceImageFormatProperties( VkPhysicalDevice          physicalDevice,\n                                                         VkFormat                  format,\n                                                         VkImageType               type,\n                                                         VkImageTiling             tiling,\n                                                         VkImageUsageFlags         usage,\n                                                         VkImageCreateFlags        flags,\n                                                         VkImageFormatProperties * pImageFormatProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceImageFormatProperties( physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties );\n      }\n\n      void vkGetPhysicalDeviceProperties( VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceProperties( physicalDevice, pProperties );\n      }\n\n      void vkGetPhysicalDeviceQueueFamilyProperties( VkPhysicalDevice          physicalDevice,\n                                                     uint32_t *                pQueueFamilyPropertyCount,\n                                                     VkQueueFamilyProperties * pQueueFamilyProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceQueueFamilyProperties( physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties );\n      }\n\n      void vkGetPhysicalDeviceMemoryProperties( VkPhysicalDevice                   physicalDevice,\n                                                VkPhysicalDeviceMemoryProperties * pMemoryProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceMemoryProperties( physicalDevice, pMemoryProperties );\n      }\n\n      PFN_vkVoidFunction vkGetInstanceProcAddr( VkInstance instance, const char * pName ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetInstanceProcAddr( instance, pName );\n      }\n\n      PFN_vkVoidFunction vkGetDeviceProcAddr( VkDevice device, const char * pName ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeviceProcAddr( device, pName );\n      }\n\n      VkResult vkCreateDevice( VkPhysicalDevice              physicalDevice,\n                               const VkDeviceCreateInfo *    pCreateInfo,\n                               const VkAllocationCallbacks * pAllocator,\n                               VkDevice *                    pDevice ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateDevice( physicalDevice, pCreateInfo, pAllocator, pDevice );\n      }\n\n      void vkDestroyDevice( VkDevice device, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyDevice( device, pAllocator );\n      }\n\n      VkResult vkEnumerateInstanceExtensionProperties( const char *            pLayerName,\n                                                       uint32_t *              pPropertyCount,\n                                                       VkExtensionProperties * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkEnumerateInstanceExtensionProperties( pLayerName, pPropertyCount, pProperties );\n      }\n\n      VkResult vkEnumerateDeviceExtensionProperties( VkPhysicalDevice        physicalDevice,\n                                                     const char *            pLayerName,\n                                                     uint32_t *              pPropertyCount,\n                                                     VkExtensionProperties * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkEnumerateDeviceExtensionProperties( physicalDevice, pLayerName, pPropertyCount, pProperties );\n      }\n\n      VkResult vkEnumerateInstanceLayerProperties( uint32_t * pPropertyCount, VkLayerProperties * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkEnumerateInstanceLayerProperties( pPropertyCount, pProperties );\n      }\n\n      VkResult vkEnumerateDeviceLayerProperties( VkPhysicalDevice    physicalDevice,\n                                                 uint32_t *          pPropertyCount,\n                                                 VkLayerProperties * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkEnumerateDeviceLayerProperties( physicalDevice, pPropertyCount, pProperties );\n      }\n\n      void vkGetDeviceQueue( VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue * pQueue ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeviceQueue( device, queueFamilyIndex, queueIndex, pQueue );\n      }\n\n      VkResult vkQueueSubmit( VkQueue queue, uint32_t submitCount, const VkSubmitInfo * pSubmits, VkFence fence ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkQueueSubmit( queue, submitCount, pSubmits, fence );\n      }\n\n      VkResult vkQueueWaitIdle( VkQueue queue ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkQueueWaitIdle( queue );\n      }\n\n      VkResult vkDeviceWaitIdle( VkDevice device ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDeviceWaitIdle( device );\n      }\n\n      VkResult vkAllocateMemory( VkDevice                      device,\n                                 const VkMemoryAllocateInfo *  pAllocateInfo,\n                                 const VkAllocationCallbacks * pAllocator,\n                                 VkDeviceMemory *              pMemory ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkAllocateMemory( device, pAllocateInfo, pAllocator, pMemory );\n      }\n\n      void vkFreeMemory( VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkFreeMemory( device, memory, pAllocator );\n      }\n\n      VkResult vkMapMemory( VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void ** ppData ) const\n        VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkMapMemory( device, memory, offset, size, flags, ppData );\n      }\n\n      void vkUnmapMemory( VkDevice device, VkDeviceMemory memory ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkUnmapMemory( device, memory );\n      }\n\n      VkResult vkFlushMappedMemoryRanges( VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange * pMemoryRanges ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkFlushMappedMemoryRanges( device, memoryRangeCount, pMemoryRanges );\n      }\n\n      VkResult vkInvalidateMappedMemoryRanges( VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange * pMemoryRanges ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkInvalidateMappedMemoryRanges( device, memoryRangeCount, pMemoryRanges );\n      }\n\n      void vkGetDeviceMemoryCommitment( VkDevice device, VkDeviceMemory memory, VkDeviceSize * pCommittedMemoryInBytes ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeviceMemoryCommitment( device, memory, pCommittedMemoryInBytes );\n      }\n\n      VkResult vkBindBufferMemory( VkDevice device, VkBuffer buffer, VkDeviceMemory memory, VkDeviceSize memoryOffset ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkBindBufferMemory( device, buffer, memory, memoryOffset );\n      }\n\n      VkResult vkBindImageMemory( VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkBindImageMemory( device, image, memory, memoryOffset );\n      }\n\n      void vkGetBufferMemoryRequirements( VkDevice device, VkBuffer buffer, VkMemoryRequirements * pMemoryRequirements ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetBufferMemoryRequirements( device, buffer, pMemoryRequirements );\n      }\n\n      void vkGetImageMemoryRequirements( VkDevice device, VkImage image, VkMemoryRequirements * pMemoryRequirements ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetImageMemoryRequirements( device, image, pMemoryRequirements );\n      }\n\n      void vkGetImageSparseMemoryRequirements( VkDevice                          device,\n                                               VkImage                           image,\n                                               uint32_t *                        pSparseMemoryRequirementCount,\n                                               VkSparseImageMemoryRequirements * pSparseMemoryRequirements ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetImageSparseMemoryRequirements( device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements );\n      }\n\n      void vkGetPhysicalDeviceSparseImageFormatProperties( VkPhysicalDevice                physicalDevice,\n                                                           VkFormat                        format,\n                                                           VkImageType                     type,\n                                                           VkSampleCountFlagBits           samples,\n                                                           VkImageUsageFlags               usage,\n                                                           VkImageTiling                   tiling,\n                                                           uint32_t *                      pPropertyCount,\n                                                           VkSparseImageFormatProperties * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceSparseImageFormatProperties( physicalDevice, format, type, samples, usage, tiling, pPropertyCount, pProperties );\n      }\n\n      VkResult vkQueueBindSparse( VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo * pBindInfo, VkFence fence ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkQueueBindSparse( queue, bindInfoCount, pBindInfo, fence );\n      }\n\n      VkResult vkCreateFence( VkDevice                      device,\n                              const VkFenceCreateInfo *     pCreateInfo,\n                              const VkAllocationCallbacks * pAllocator,\n                              VkFence *                     pFence ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateFence( device, pCreateInfo, pAllocator, pFence );\n      }\n\n      void vkDestroyFence( VkDevice device, VkFence fence, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyFence( device, fence, pAllocator );\n      }\n\n      VkResult vkResetFences( VkDevice device, uint32_t fenceCount, const VkFence * pFences ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkResetFences( device, fenceCount, pFences );\n      }\n\n      VkResult vkGetFenceStatus( VkDevice device, VkFence fence ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetFenceStatus( device, fence );\n      }\n\n      VkResult vkWaitForFences( VkDevice device, uint32_t fenceCount, const VkFence * pFences, VkBool32 waitAll, uint64_t timeout ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkWaitForFences( device, fenceCount, pFences, waitAll, timeout );\n      }\n\n      VkResult vkCreateSemaphore( VkDevice                      device,\n                                  const VkSemaphoreCreateInfo * pCreateInfo,\n                                  const VkAllocationCallbacks * pAllocator,\n                                  VkSemaphore *                 pSemaphore ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateSemaphore( device, pCreateInfo, pAllocator, pSemaphore );\n      }\n\n      void vkDestroySemaphore( VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroySemaphore( device, semaphore, pAllocator );\n      }\n\n      VkResult vkCreateEvent( VkDevice                      device,\n                              const VkEventCreateInfo *     pCreateInfo,\n                              const VkAllocationCallbacks * pAllocator,\n                              VkEvent *                     pEvent ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateEvent( device, pCreateInfo, pAllocator, pEvent );\n      }\n\n      void vkDestroyEvent( VkDevice device, VkEvent event, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyEvent( device, event, pAllocator );\n      }\n\n      VkResult vkGetEventStatus( VkDevice device, VkEvent event ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetEventStatus( device, event );\n      }\n\n      VkResult vkSetEvent( VkDevice device, VkEvent event ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkSetEvent( device, event );\n      }\n\n      VkResult vkResetEvent( VkDevice device, VkEvent event ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkResetEvent( device, event );\n      }\n\n      VkResult vkCreateQueryPool( VkDevice                      device,\n                                  const VkQueryPoolCreateInfo * pCreateInfo,\n                                  const VkAllocationCallbacks * pAllocator,\n                                  VkQueryPool *                 pQueryPool ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateQueryPool( device, pCreateInfo, pAllocator, pQueryPool );\n      }\n\n      void vkDestroyQueryPool( VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyQueryPool( device, queryPool, pAllocator );\n      }\n\n      VkResult vkGetQueryPoolResults( VkDevice           device,\n                                      VkQueryPool        queryPool,\n                                      uint32_t           firstQuery,\n                                      uint32_t           queryCount,\n                                      size_t             dataSize,\n                                      void *             pData,\n                                      VkDeviceSize       stride,\n                                      VkQueryResultFlags flags ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetQueryPoolResults( device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags );\n      }\n\n      VkResult vkCreateBuffer( VkDevice                      device,\n                               const VkBufferCreateInfo *    pCreateInfo,\n                               const VkAllocationCallbacks * pAllocator,\n                               VkBuffer *                    pBuffer ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateBuffer( device, pCreateInfo, pAllocator, pBuffer );\n      }\n\n      void vkDestroyBuffer( VkDevice device, VkBuffer buffer, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyBuffer( device, buffer, pAllocator );\n      }\n\n      VkResult vkCreateBufferView( VkDevice                       device,\n                                   const VkBufferViewCreateInfo * pCreateInfo,\n                                   const VkAllocationCallbacks *  pAllocator,\n                                   VkBufferView *                 pView ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateBufferView( device, pCreateInfo, pAllocator, pView );\n      }\n\n      void vkDestroyBufferView( VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyBufferView( device, bufferView, pAllocator );\n      }\n\n      VkResult vkCreateImage( VkDevice                      device,\n                              const VkImageCreateInfo *     pCreateInfo,\n                              const VkAllocationCallbacks * pAllocator,\n                              VkImage *                     pImage ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateImage( device, pCreateInfo, pAllocator, pImage );\n      }\n\n      void vkDestroyImage( VkDevice device, VkImage image, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyImage( device, image, pAllocator );\n      }\n\n      void vkGetImageSubresourceLayout( VkDevice                   device,\n                                        VkImage                    image,\n                                        const VkImageSubresource * pSubresource,\n                                        VkSubresourceLayout *      pLayout ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetImageSubresourceLayout( device, image, pSubresource, pLayout );\n      }\n\n      VkResult vkCreateImageView( VkDevice                      device,\n                                  const VkImageViewCreateInfo * pCreateInfo,\n                                  const VkAllocationCallbacks * pAllocator,\n                                  VkImageView *                 pView ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateImageView( device, pCreateInfo, pAllocator, pView );\n      }\n\n      void vkDestroyImageView( VkDevice device, VkImageView imageView, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyImageView( device, imageView, pAllocator );\n      }\n\n      VkResult vkCreateShaderModule( VkDevice                         device,\n                                     const VkShaderModuleCreateInfo * pCreateInfo,\n                                     const VkAllocationCallbacks *    pAllocator,\n                                     VkShaderModule *                 pShaderModule ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateShaderModule( device, pCreateInfo, pAllocator, pShaderModule );\n      }\n\n      void vkDestroyShaderModule( VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyShaderModule( device, shaderModule, pAllocator );\n      }\n\n      VkResult vkCreatePipelineCache( VkDevice                          device,\n                                      const VkPipelineCacheCreateInfo * pCreateInfo,\n                                      const VkAllocationCallbacks *     pAllocator,\n                                      VkPipelineCache *                 pPipelineCache ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreatePipelineCache( device, pCreateInfo, pAllocator, pPipelineCache );\n      }\n\n      void vkDestroyPipelineCache( VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyPipelineCache( device, pipelineCache, pAllocator );\n      }\n\n      VkResult vkGetPipelineCacheData( VkDevice device, VkPipelineCache pipelineCache, size_t * pDataSize, void * pData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPipelineCacheData( device, pipelineCache, pDataSize, pData );\n      }\n\n      VkResult\n        vkMergePipelineCaches( VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache * pSrcCaches ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkMergePipelineCaches( device, dstCache, srcCacheCount, pSrcCaches );\n      }\n\n      VkResult vkCreateGraphicsPipelines( VkDevice                             device,\n                                          VkPipelineCache                      pipelineCache,\n                                          uint32_t                             createInfoCount,\n                                          const VkGraphicsPipelineCreateInfo * pCreateInfos,\n                                          const VkAllocationCallbacks *        pAllocator,\n                                          VkPipeline *                         pPipelines ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateGraphicsPipelines( device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines );\n      }\n\n      VkResult vkCreateComputePipelines( VkDevice                            device,\n                                         VkPipelineCache                     pipelineCache,\n                                         uint32_t                            createInfoCount,\n                                         const VkComputePipelineCreateInfo * pCreateInfos,\n                                         const VkAllocationCallbacks *       pAllocator,\n                                         VkPipeline *                        pPipelines ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateComputePipelines( device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines );\n      }\n\n      void vkDestroyPipeline( VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyPipeline( device, pipeline, pAllocator );\n      }\n\n      VkResult vkCreatePipelineLayout( VkDevice                           device,\n                                       const VkPipelineLayoutCreateInfo * pCreateInfo,\n                                       const VkAllocationCallbacks *      pAllocator,\n                                       VkPipelineLayout *                 pPipelineLayout ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreatePipelineLayout( device, pCreateInfo, pAllocator, pPipelineLayout );\n      }\n\n      void vkDestroyPipelineLayout( VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyPipelineLayout( device, pipelineLayout, pAllocator );\n      }\n\n      VkResult vkCreateSampler( VkDevice                      device,\n                                const VkSamplerCreateInfo *   pCreateInfo,\n                                const VkAllocationCallbacks * pAllocator,\n                                VkSampler *                   pSampler ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateSampler( device, pCreateInfo, pAllocator, pSampler );\n      }\n\n      void vkDestroySampler( VkDevice device, VkSampler sampler, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroySampler( device, sampler, pAllocator );\n      }\n\n      VkResult vkCreateDescriptorSetLayout( VkDevice                                device,\n                                            const VkDescriptorSetLayoutCreateInfo * pCreateInfo,\n                                            const VkAllocationCallbacks *           pAllocator,\n                                            VkDescriptorSetLayout *                 pSetLayout ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateDescriptorSetLayout( device, pCreateInfo, pAllocator, pSetLayout );\n      }\n\n      void vkDestroyDescriptorSetLayout( VkDevice                      device,\n                                         VkDescriptorSetLayout         descriptorSetLayout,\n                                         const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyDescriptorSetLayout( device, descriptorSetLayout, pAllocator );\n      }\n\n      VkResult vkCreateDescriptorPool( VkDevice                           device,\n                                       const VkDescriptorPoolCreateInfo * pCreateInfo,\n                                       const VkAllocationCallbacks *      pAllocator,\n                                       VkDescriptorPool *                 pDescriptorPool ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateDescriptorPool( device, pCreateInfo, pAllocator, pDescriptorPool );\n      }\n\n      void vkDestroyDescriptorPool( VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyDescriptorPool( device, descriptorPool, pAllocator );\n      }\n\n      VkResult vkResetDescriptorPool( VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkResetDescriptorPool( device, descriptorPool, flags );\n      }\n\n      VkResult vkAllocateDescriptorSets( VkDevice                            device,\n                                         const VkDescriptorSetAllocateInfo * pAllocateInfo,\n                                         VkDescriptorSet *                   pDescriptorSets ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkAllocateDescriptorSets( device, pAllocateInfo, pDescriptorSets );\n      }\n\n      VkResult vkFreeDescriptorSets( VkDevice                device,\n                                     VkDescriptorPool        descriptorPool,\n                                     uint32_t                descriptorSetCount,\n                                     const VkDescriptorSet * pDescriptorSets ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkFreeDescriptorSets( device, descriptorPool, descriptorSetCount, pDescriptorSets );\n      }\n\n      void vkUpdateDescriptorSets( VkDevice                     device,\n                                   uint32_t                     descriptorWriteCount,\n                                   const VkWriteDescriptorSet * pDescriptorWrites,\n                                   uint32_t                     descriptorCopyCount,\n                                   const VkCopyDescriptorSet *  pDescriptorCopies ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkUpdateDescriptorSets( device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies );\n      }\n\n      VkResult vkCreateFramebuffer( VkDevice                        device,\n                                    const VkFramebufferCreateInfo * pCreateInfo,\n                                    const VkAllocationCallbacks *   pAllocator,\n                                    VkFramebuffer *                 pFramebuffer ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateFramebuffer( device, pCreateInfo, pAllocator, pFramebuffer );\n      }\n\n      void vkDestroyFramebuffer( VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyFramebuffer( device, framebuffer, pAllocator );\n      }\n\n      VkResult vkCreateRenderPass( VkDevice                       device,\n                                   const VkRenderPassCreateInfo * pCreateInfo,\n                                   const VkAllocationCallbacks *  pAllocator,\n                                   VkRenderPass *                 pRenderPass ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateRenderPass( device, pCreateInfo, pAllocator, pRenderPass );\n      }\n\n      void vkDestroyRenderPass( VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyRenderPass( device, renderPass, pAllocator );\n      }\n\n      void vkGetRenderAreaGranularity( VkDevice device, VkRenderPass renderPass, VkExtent2D * pGranularity ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetRenderAreaGranularity( device, renderPass, pGranularity );\n      }\n\n      VkResult vkCreateCommandPool( VkDevice                        device,\n                                    const VkCommandPoolCreateInfo * pCreateInfo,\n                                    const VkAllocationCallbacks *   pAllocator,\n                                    VkCommandPool *                 pCommandPool ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateCommandPool( device, pCreateInfo, pAllocator, pCommandPool );\n      }\n\n      void vkDestroyCommandPool( VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyCommandPool( device, commandPool, pAllocator );\n      }\n\n      VkResult vkResetCommandPool( VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkResetCommandPool( device, commandPool, flags );\n      }\n\n      VkResult vkAllocateCommandBuffers( VkDevice                            device,\n                                         const VkCommandBufferAllocateInfo * pAllocateInfo,\n                                         VkCommandBuffer *                   pCommandBuffers ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkAllocateCommandBuffers( device, pAllocateInfo, pCommandBuffers );\n      }\n\n      void vkFreeCommandBuffers( VkDevice                device,\n                                 VkCommandPool           commandPool,\n                                 uint32_t                commandBufferCount,\n                                 const VkCommandBuffer * pCommandBuffers ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkFreeCommandBuffers( device, commandPool, commandBufferCount, pCommandBuffers );\n      }\n\n      VkResult vkBeginCommandBuffer( VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo * pBeginInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkBeginCommandBuffer( commandBuffer, pBeginInfo );\n      }\n\n      VkResult vkEndCommandBuffer( VkCommandBuffer commandBuffer ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkEndCommandBuffer( commandBuffer );\n      }\n\n      VkResult vkResetCommandBuffer( VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkResetCommandBuffer( commandBuffer, flags );\n      }\n\n      void vkCmdBindPipeline( VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBindPipeline( commandBuffer, pipelineBindPoint, pipeline );\n      }\n\n      void vkCmdSetViewport( VkCommandBuffer    commandBuffer,\n                             uint32_t           firstViewport,\n                             uint32_t           viewportCount,\n                             const VkViewport * pViewports ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetViewport( commandBuffer, firstViewport, viewportCount, pViewports );\n      }\n\n      void vkCmdSetScissor( VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D * pScissors ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetScissor( commandBuffer, firstScissor, scissorCount, pScissors );\n      }\n\n      void vkCmdSetLineWidth( VkCommandBuffer commandBuffer, float lineWidth ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetLineWidth( commandBuffer, lineWidth );\n      }\n\n      void vkCmdSetDepthBias( VkCommandBuffer commandBuffer,\n                              float           depthBiasConstantFactor,\n                              float           depthBiasClamp,\n                              float           depthBiasSlopeFactor ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDepthBias( commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor );\n      }\n\n      void vkCmdSetBlendConstants( VkCommandBuffer commandBuffer, const float blendConstants[4] ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetBlendConstants( commandBuffer, blendConstants );\n      }\n\n      void vkCmdSetDepthBounds( VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDepthBounds( commandBuffer, minDepthBounds, maxDepthBounds );\n      }\n\n      void vkCmdSetStencilCompareMask( VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetStencilCompareMask( commandBuffer, faceMask, compareMask );\n      }\n\n      void vkCmdSetStencilWriteMask( VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetStencilWriteMask( commandBuffer, faceMask, writeMask );\n      }\n\n      void vkCmdSetStencilReference( VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetStencilReference( commandBuffer, faceMask, reference );\n      }\n\n      void vkCmdBindDescriptorSets( VkCommandBuffer         commandBuffer,\n                                    VkPipelineBindPoint     pipelineBindPoint,\n                                    VkPipelineLayout        layout,\n                                    uint32_t                firstSet,\n                                    uint32_t                descriptorSetCount,\n                                    const VkDescriptorSet * pDescriptorSets,\n                                    uint32_t                dynamicOffsetCount,\n                                    const uint32_t *        pDynamicOffsets ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBindDescriptorSets(\n          commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets );\n      }\n\n      void vkCmdBindIndexBuffer( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBindIndexBuffer( commandBuffer, buffer, offset, indexType );\n      }\n\n      void vkCmdBindVertexBuffers( VkCommandBuffer      commandBuffer,\n                                   uint32_t             firstBinding,\n                                   uint32_t             bindingCount,\n                                   const VkBuffer *     pBuffers,\n                                   const VkDeviceSize * pOffsets ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBindVertexBuffers( commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets );\n      }\n\n      void vkCmdDraw( VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance ) const\n        VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDraw( commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance );\n      }\n\n      void vkCmdDrawIndexed( VkCommandBuffer commandBuffer,\n                             uint32_t        indexCount,\n                             uint32_t        instanceCount,\n                             uint32_t        firstIndex,\n                             int32_t         vertexOffset,\n                             uint32_t        firstInstance ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDrawIndexed( commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance );\n      }\n\n      void\n        vkCmdDrawIndirect( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDrawIndirect( commandBuffer, buffer, offset, drawCount, stride );\n      }\n\n      void vkCmdDrawIndexedIndirect( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride ) const\n        VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDrawIndexedIndirect( commandBuffer, buffer, offset, drawCount, stride );\n      }\n\n      void vkCmdDispatch( VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDispatch( commandBuffer, groupCountX, groupCountY, groupCountZ );\n      }\n\n      void vkCmdDispatchIndirect( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDispatchIndirect( commandBuffer, buffer, offset );\n      }\n\n      void vkCmdCopyBuffer( VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferCopy * pRegions ) const\n        VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCopyBuffer( commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions );\n      }\n\n      void vkCmdCopyImage( VkCommandBuffer     commandBuffer,\n                           VkImage             srcImage,\n                           VkImageLayout       srcImageLayout,\n                           VkImage             dstImage,\n                           VkImageLayout       dstImageLayout,\n                           uint32_t            regionCount,\n                           const VkImageCopy * pRegions ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCopyImage( commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions );\n      }\n\n      void vkCmdBlitImage( VkCommandBuffer     commandBuffer,\n                           VkImage             srcImage,\n                           VkImageLayout       srcImageLayout,\n                           VkImage             dstImage,\n                           VkImageLayout       dstImageLayout,\n                           uint32_t            regionCount,\n                           const VkImageBlit * pRegions,\n                           VkFilter            filter ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBlitImage( commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter );\n      }\n\n      void vkCmdCopyBufferToImage( VkCommandBuffer           commandBuffer,\n                                   VkBuffer                  srcBuffer,\n                                   VkImage                   dstImage,\n                                   VkImageLayout             dstImageLayout,\n                                   uint32_t                  regionCount,\n                                   const VkBufferImageCopy * pRegions ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCopyBufferToImage( commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions );\n      }\n\n      void vkCmdCopyImageToBuffer( VkCommandBuffer           commandBuffer,\n                                   VkImage                   srcImage,\n                                   VkImageLayout             srcImageLayout,\n                                   VkBuffer                  dstBuffer,\n                                   uint32_t                  regionCount,\n                                   const VkBufferImageCopy * pRegions ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCopyImageToBuffer( commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions );\n      }\n\n      void vkCmdUpdateBuffer( VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const void * pData ) const\n        VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdUpdateBuffer( commandBuffer, dstBuffer, dstOffset, dataSize, pData );\n      }\n\n      void\n        vkCmdFillBuffer( VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdFillBuffer( commandBuffer, dstBuffer, dstOffset, size, data );\n      }\n\n      void vkCmdClearColorImage( VkCommandBuffer                 commandBuffer,\n                                 VkImage                         image,\n                                 VkImageLayout                   imageLayout,\n                                 const VkClearColorValue *       pColor,\n                                 uint32_t                        rangeCount,\n                                 const VkImageSubresourceRange * pRanges ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdClearColorImage( commandBuffer, image, imageLayout, pColor, rangeCount, pRanges );\n      }\n\n      void vkCmdClearDepthStencilImage( VkCommandBuffer                  commandBuffer,\n                                        VkImage                          image,\n                                        VkImageLayout                    imageLayout,\n                                        const VkClearDepthStencilValue * pDepthStencil,\n                                        uint32_t                         rangeCount,\n                                        const VkImageSubresourceRange *  pRanges ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdClearDepthStencilImage( commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges );\n      }\n\n      void vkCmdClearAttachments( VkCommandBuffer           commandBuffer,\n                                  uint32_t                  attachmentCount,\n                                  const VkClearAttachment * pAttachments,\n                                  uint32_t                  rectCount,\n                                  const VkClearRect *       pRects ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdClearAttachments( commandBuffer, attachmentCount, pAttachments, rectCount, pRects );\n      }\n\n      void vkCmdResolveImage( VkCommandBuffer        commandBuffer,\n                              VkImage                srcImage,\n                              VkImageLayout          srcImageLayout,\n                              VkImage                dstImage,\n                              VkImageLayout          dstImageLayout,\n                              uint32_t               regionCount,\n                              const VkImageResolve * pRegions ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdResolveImage( commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions );\n      }\n\n      void vkCmdSetEvent( VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetEvent( commandBuffer, event, stageMask );\n      }\n\n      void vkCmdResetEvent( VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdResetEvent( commandBuffer, event, stageMask );\n      }\n\n      void vkCmdWaitEvents( VkCommandBuffer               commandBuffer,\n                            uint32_t                      eventCount,\n                            const VkEvent *               pEvents,\n                            VkPipelineStageFlags          srcStageMask,\n                            VkPipelineStageFlags          dstStageMask,\n                            uint32_t                      memoryBarrierCount,\n                            const VkMemoryBarrier *       pMemoryBarriers,\n                            uint32_t                      bufferMemoryBarrierCount,\n                            const VkBufferMemoryBarrier * pBufferMemoryBarriers,\n                            uint32_t                      imageMemoryBarrierCount,\n                            const VkImageMemoryBarrier *  pImageMemoryBarriers ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdWaitEvents( commandBuffer,\n                                  eventCount,\n                                  pEvents,\n                                  srcStageMask,\n                                  dstStageMask,\n                                  memoryBarrierCount,\n                                  pMemoryBarriers,\n                                  bufferMemoryBarrierCount,\n                                  pBufferMemoryBarriers,\n                                  imageMemoryBarrierCount,\n                                  pImageMemoryBarriers );\n      }\n\n      void vkCmdPipelineBarrier( VkCommandBuffer               commandBuffer,\n                                 VkPipelineStageFlags          srcStageMask,\n                                 VkPipelineStageFlags          dstStageMask,\n                                 VkDependencyFlags             dependencyFlags,\n                                 uint32_t                      memoryBarrierCount,\n                                 const VkMemoryBarrier *       pMemoryBarriers,\n                                 uint32_t                      bufferMemoryBarrierCount,\n                                 const VkBufferMemoryBarrier * pBufferMemoryBarriers,\n                                 uint32_t                      imageMemoryBarrierCount,\n                                 const VkImageMemoryBarrier *  pImageMemoryBarriers ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdPipelineBarrier( commandBuffer,\n                                       srcStageMask,\n                                       dstStageMask,\n                                       dependencyFlags,\n                                       memoryBarrierCount,\n                                       pMemoryBarriers,\n                                       bufferMemoryBarrierCount,\n                                       pBufferMemoryBarriers,\n                                       imageMemoryBarrierCount,\n                                       pImageMemoryBarriers );\n      }\n\n      void vkCmdBeginQuery( VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBeginQuery( commandBuffer, queryPool, query, flags );\n      }\n\n      void vkCmdEndQuery( VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdEndQuery( commandBuffer, queryPool, query );\n      }\n\n      void vkCmdResetQueryPool( VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdResetQueryPool( commandBuffer, queryPool, firstQuery, queryCount );\n      }\n\n      void vkCmdWriteTimestamp( VkCommandBuffer         commandBuffer,\n                                VkPipelineStageFlagBits pipelineStage,\n                                VkQueryPool             queryPool,\n                                uint32_t                query ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdWriteTimestamp( commandBuffer, pipelineStage, queryPool, query );\n      }\n\n      void vkCmdCopyQueryPoolResults( VkCommandBuffer    commandBuffer,\n                                      VkQueryPool        queryPool,\n                                      uint32_t           firstQuery,\n                                      uint32_t           queryCount,\n                                      VkBuffer           dstBuffer,\n                                      VkDeviceSize       dstOffset,\n                                      VkDeviceSize       stride,\n                                      VkQueryResultFlags flags ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCopyQueryPoolResults( commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags );\n      }\n\n      void vkCmdPushConstants( VkCommandBuffer    commandBuffer,\n                               VkPipelineLayout   layout,\n                               VkShaderStageFlags stageFlags,\n                               uint32_t           offset,\n                               uint32_t           size,\n                               const void *       pValues ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdPushConstants( commandBuffer, layout, stageFlags, offset, size, pValues );\n      }\n\n      void vkCmdBeginRenderPass( VkCommandBuffer               commandBuffer,\n                                 const VkRenderPassBeginInfo * pRenderPassBegin,\n                                 VkSubpassContents             contents ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBeginRenderPass( commandBuffer, pRenderPassBegin, contents );\n      }\n\n      void vkCmdNextSubpass( VkCommandBuffer commandBuffer, VkSubpassContents contents ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdNextSubpass( commandBuffer, contents );\n      }\n\n      void vkCmdEndRenderPass( VkCommandBuffer commandBuffer ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdEndRenderPass( commandBuffer );\n      }\n\n      void vkCmdExecuteCommands( VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer * pCommandBuffers ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdExecuteCommands( commandBuffer, commandBufferCount, pCommandBuffers );\n      }\n\n      //=== VK_VERSION_1_1 ===\n\n      VkResult vkEnumerateInstanceVersion( uint32_t * pApiVersion ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkEnumerateInstanceVersion( pApiVersion );\n      }\n\n      VkResult vkBindBufferMemory2( VkDevice device, uint32_t bindInfoCount, const VkBindBufferMemoryInfo * pBindInfos ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkBindBufferMemory2( device, bindInfoCount, pBindInfos );\n      }\n\n      VkResult vkBindImageMemory2( VkDevice device, uint32_t bindInfoCount, const VkBindImageMemoryInfo * pBindInfos ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkBindImageMemory2( device, bindInfoCount, pBindInfos );\n      }\n\n      void vkGetDeviceGroupPeerMemoryFeatures( VkDevice                   device,\n                                               uint32_t                   heapIndex,\n                                               uint32_t                   localDeviceIndex,\n                                               uint32_t                   remoteDeviceIndex,\n                                               VkPeerMemoryFeatureFlags * pPeerMemoryFeatures ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeviceGroupPeerMemoryFeatures( device, heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures );\n      }\n\n      void vkCmdSetDeviceMask( VkCommandBuffer commandBuffer, uint32_t deviceMask ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDeviceMask( commandBuffer, deviceMask );\n      }\n\n      void vkCmdDispatchBase( VkCommandBuffer commandBuffer,\n                              uint32_t        baseGroupX,\n                              uint32_t        baseGroupY,\n                              uint32_t        baseGroupZ,\n                              uint32_t        groupCountX,\n                              uint32_t        groupCountY,\n                              uint32_t        groupCountZ ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDispatchBase( commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ );\n      }\n\n      VkResult vkEnumeratePhysicalDeviceGroups( VkInstance                        instance,\n                                                uint32_t *                        pPhysicalDeviceGroupCount,\n                                                VkPhysicalDeviceGroupProperties * pPhysicalDeviceGroupProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkEnumeratePhysicalDeviceGroups( instance, pPhysicalDeviceGroupCount, pPhysicalDeviceGroupProperties );\n      }\n\n      void vkGetImageMemoryRequirements2( VkDevice                               device,\n                                          const VkImageMemoryRequirementsInfo2 * pInfo,\n                                          VkMemoryRequirements2 *                pMemoryRequirements ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetImageMemoryRequirements2( device, pInfo, pMemoryRequirements );\n      }\n\n      void vkGetBufferMemoryRequirements2( VkDevice                                device,\n                                           const VkBufferMemoryRequirementsInfo2 * pInfo,\n                                           VkMemoryRequirements2 *                 pMemoryRequirements ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetBufferMemoryRequirements2( device, pInfo, pMemoryRequirements );\n      }\n\n      void vkGetImageSparseMemoryRequirements2( VkDevice                                     device,\n                                                const VkImageSparseMemoryRequirementsInfo2 * pInfo,\n                                                uint32_t *                                   pSparseMemoryRequirementCount,\n                                                VkSparseImageMemoryRequirements2 *           pSparseMemoryRequirements ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetImageSparseMemoryRequirements2( device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements );\n      }\n\n      void vkGetPhysicalDeviceFeatures2( VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2 * pFeatures ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceFeatures2( physicalDevice, pFeatures );\n      }\n\n      void vkGetPhysicalDeviceProperties2( VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties2 * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceProperties2( physicalDevice, pProperties );\n      }\n\n      void vkGetPhysicalDeviceFormatProperties2( VkPhysicalDevice      physicalDevice,\n                                                 VkFormat              format,\n                                                 VkFormatProperties2 * pFormatProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceFormatProperties2( physicalDevice, format, pFormatProperties );\n      }\n\n      VkResult vkGetPhysicalDeviceImageFormatProperties2( VkPhysicalDevice                         physicalDevice,\n                                                          const VkPhysicalDeviceImageFormatInfo2 * pImageFormatInfo,\n                                                          VkImageFormatProperties2 *               pImageFormatProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceImageFormatProperties2( physicalDevice, pImageFormatInfo, pImageFormatProperties );\n      }\n\n      void vkGetPhysicalDeviceQueueFamilyProperties2( VkPhysicalDevice           physicalDevice,\n                                                      uint32_t *                 pQueueFamilyPropertyCount,\n                                                      VkQueueFamilyProperties2 * pQueueFamilyProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceQueueFamilyProperties2( physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties );\n      }\n\n      void vkGetPhysicalDeviceMemoryProperties2( VkPhysicalDevice                    physicalDevice,\n                                                 VkPhysicalDeviceMemoryProperties2 * pMemoryProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceMemoryProperties2( physicalDevice, pMemoryProperties );\n      }\n\n      void vkGetPhysicalDeviceSparseImageFormatProperties2( VkPhysicalDevice                               physicalDevice,\n                                                            const VkPhysicalDeviceSparseImageFormatInfo2 * pFormatInfo,\n                                                            uint32_t *                                     pPropertyCount,\n                                                            VkSparseImageFormatProperties2 *               pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceSparseImageFormatProperties2( physicalDevice, pFormatInfo, pPropertyCount, pProperties );\n      }\n\n      void vkTrimCommandPool( VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlags flags ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkTrimCommandPool( device, commandPool, flags );\n      }\n\n      void vkGetDeviceQueue2( VkDevice device, const VkDeviceQueueInfo2 * pQueueInfo, VkQueue * pQueue ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeviceQueue2( device, pQueueInfo, pQueue );\n      }\n\n      VkResult vkCreateSamplerYcbcrConversion( VkDevice                                   device,\n                                               const VkSamplerYcbcrConversionCreateInfo * pCreateInfo,\n                                               const VkAllocationCallbacks *              pAllocator,\n                                               VkSamplerYcbcrConversion *                 pYcbcrConversion ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateSamplerYcbcrConversion( device, pCreateInfo, pAllocator, pYcbcrConversion );\n      }\n\n      void vkDestroySamplerYcbcrConversion( VkDevice                      device,\n                                            VkSamplerYcbcrConversion      ycbcrConversion,\n                                            const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroySamplerYcbcrConversion( device, ycbcrConversion, pAllocator );\n      }\n\n      VkResult vkCreateDescriptorUpdateTemplate( VkDevice                                     device,\n                                                 const VkDescriptorUpdateTemplateCreateInfo * pCreateInfo,\n                                                 const VkAllocationCallbacks *                pAllocator,\n                                                 VkDescriptorUpdateTemplate *                 pDescriptorUpdateTemplate ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateDescriptorUpdateTemplate( device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate );\n      }\n\n      void vkDestroyDescriptorUpdateTemplate( VkDevice                      device,\n                                              VkDescriptorUpdateTemplate    descriptorUpdateTemplate,\n                                              const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyDescriptorUpdateTemplate( device, descriptorUpdateTemplate, pAllocator );\n      }\n\n      void vkUpdateDescriptorSetWithTemplate( VkDevice                   device,\n                                              VkDescriptorSet            descriptorSet,\n                                              VkDescriptorUpdateTemplate descriptorUpdateTemplate,\n                                              const void *               pData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkUpdateDescriptorSetWithTemplate( device, descriptorSet, descriptorUpdateTemplate, pData );\n      }\n\n      void vkGetPhysicalDeviceExternalBufferProperties( VkPhysicalDevice                           physicalDevice,\n                                                        const VkPhysicalDeviceExternalBufferInfo * pExternalBufferInfo,\n                                                        VkExternalBufferProperties *               pExternalBufferProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceExternalBufferProperties( physicalDevice, pExternalBufferInfo, pExternalBufferProperties );\n      }\n\n      void vkGetPhysicalDeviceExternalFenceProperties( VkPhysicalDevice                          physicalDevice,\n                                                       const VkPhysicalDeviceExternalFenceInfo * pExternalFenceInfo,\n                                                       VkExternalFenceProperties *               pExternalFenceProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceExternalFenceProperties( physicalDevice, pExternalFenceInfo, pExternalFenceProperties );\n      }\n\n      void vkGetPhysicalDeviceExternalSemaphoreProperties( VkPhysicalDevice                              physicalDevice,\n                                                           const VkPhysicalDeviceExternalSemaphoreInfo * pExternalSemaphoreInfo,\n                                                           VkExternalSemaphoreProperties * pExternalSemaphoreProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceExternalSemaphoreProperties( physicalDevice, pExternalSemaphoreInfo, pExternalSemaphoreProperties );\n      }\n\n      void vkGetDescriptorSetLayoutSupport( VkDevice                                device,\n                                            const VkDescriptorSetLayoutCreateInfo * pCreateInfo,\n                                            VkDescriptorSetLayoutSupport *          pSupport ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDescriptorSetLayoutSupport( device, pCreateInfo, pSupport );\n      }\n\n      //=== VK_VERSION_1_2 ===\n\n      void vkCmdDrawIndirectCount( VkCommandBuffer commandBuffer,\n                                   VkBuffer        buffer,\n                                   VkDeviceSize    offset,\n                                   VkBuffer        countBuffer,\n                                   VkDeviceSize    countBufferOffset,\n                                   uint32_t        maxDrawCount,\n                                   uint32_t        stride ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDrawIndirectCount( commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride );\n      }\n\n      void vkCmdDrawIndexedIndirectCount( VkCommandBuffer commandBuffer,\n                                          VkBuffer        buffer,\n                                          VkDeviceSize    offset,\n                                          VkBuffer        countBuffer,\n                                          VkDeviceSize    countBufferOffset,\n                                          uint32_t        maxDrawCount,\n                                          uint32_t        stride ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDrawIndexedIndirectCount( commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride );\n      }\n\n      VkResult vkCreateRenderPass2( VkDevice                        device,\n                                    const VkRenderPassCreateInfo2 * pCreateInfo,\n                                    const VkAllocationCallbacks *   pAllocator,\n                                    VkRenderPass *                  pRenderPass ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateRenderPass2( device, pCreateInfo, pAllocator, pRenderPass );\n      }\n\n      void vkCmdBeginRenderPass2( VkCommandBuffer               commandBuffer,\n                                  const VkRenderPassBeginInfo * pRenderPassBegin,\n                                  const VkSubpassBeginInfo *    pSubpassBeginInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBeginRenderPass2( commandBuffer, pRenderPassBegin, pSubpassBeginInfo );\n      }\n\n      void vkCmdNextSubpass2( VkCommandBuffer            commandBuffer,\n                              const VkSubpassBeginInfo * pSubpassBeginInfo,\n                              const VkSubpassEndInfo *   pSubpassEndInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdNextSubpass2( commandBuffer, pSubpassBeginInfo, pSubpassEndInfo );\n      }\n\n      void vkCmdEndRenderPass2( VkCommandBuffer commandBuffer, const VkSubpassEndInfo * pSubpassEndInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdEndRenderPass2( commandBuffer, pSubpassEndInfo );\n      }\n\n      void vkResetQueryPool( VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkResetQueryPool( device, queryPool, firstQuery, queryCount );\n      }\n\n      VkResult vkGetSemaphoreCounterValue( VkDevice device, VkSemaphore semaphore, uint64_t * pValue ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetSemaphoreCounterValue( device, semaphore, pValue );\n      }\n\n      VkResult vkWaitSemaphores( VkDevice device, const VkSemaphoreWaitInfo * pWaitInfo, uint64_t timeout ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkWaitSemaphores( device, pWaitInfo, timeout );\n      }\n\n      VkResult vkSignalSemaphore( VkDevice device, const VkSemaphoreSignalInfo * pSignalInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkSignalSemaphore( device, pSignalInfo );\n      }\n\n      VkDeviceAddress vkGetBufferDeviceAddress( VkDevice device, const VkBufferDeviceAddressInfo * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetBufferDeviceAddress( device, pInfo );\n      }\n\n      uint64_t vkGetBufferOpaqueCaptureAddress( VkDevice device, const VkBufferDeviceAddressInfo * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetBufferOpaqueCaptureAddress( device, pInfo );\n      }\n\n      uint64_t vkGetDeviceMemoryOpaqueCaptureAddress( VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeviceMemoryOpaqueCaptureAddress( device, pInfo );\n      }\n\n      //=== VK_VERSION_1_3 ===\n\n      VkResult vkGetPhysicalDeviceToolProperties( VkPhysicalDevice                 physicalDevice,\n                                                  uint32_t *                       pToolCount,\n                                                  VkPhysicalDeviceToolProperties * pToolProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceToolProperties( physicalDevice, pToolCount, pToolProperties );\n      }\n\n      VkResult vkCreatePrivateDataSlot( VkDevice                            device,\n                                        const VkPrivateDataSlotCreateInfo * pCreateInfo,\n                                        const VkAllocationCallbacks *       pAllocator,\n                                        VkPrivateDataSlot *                 pPrivateDataSlot ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreatePrivateDataSlot( device, pCreateInfo, pAllocator, pPrivateDataSlot );\n      }\n\n      void vkDestroyPrivateDataSlot( VkDevice device, VkPrivateDataSlot privateDataSlot, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyPrivateDataSlot( device, privateDataSlot, pAllocator );\n      }\n\n      VkResult vkSetPrivateData( VkDevice device, VkObjectType objectType, uint64_t objectHandle, VkPrivateDataSlot privateDataSlot, uint64_t data ) const\n        VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkSetPrivateData( device, objectType, objectHandle, privateDataSlot, data );\n      }\n\n      void vkGetPrivateData( VkDevice device, VkObjectType objectType, uint64_t objectHandle, VkPrivateDataSlot privateDataSlot, uint64_t * pData ) const\n        VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPrivateData( device, objectType, objectHandle, privateDataSlot, pData );\n      }\n\n      void vkCmdSetEvent2( VkCommandBuffer commandBuffer, VkEvent event, const VkDependencyInfo * pDependencyInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetEvent2( commandBuffer, event, pDependencyInfo );\n      }\n\n      void vkCmdResetEvent2( VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2 stageMask ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdResetEvent2( commandBuffer, event, stageMask );\n      }\n\n      void vkCmdWaitEvents2( VkCommandBuffer          commandBuffer,\n                             uint32_t                 eventCount,\n                             const VkEvent *          pEvents,\n                             const VkDependencyInfo * pDependencyInfos ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdWaitEvents2( commandBuffer, eventCount, pEvents, pDependencyInfos );\n      }\n\n      void vkCmdPipelineBarrier2( VkCommandBuffer commandBuffer, const VkDependencyInfo * pDependencyInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdPipelineBarrier2( commandBuffer, pDependencyInfo );\n      }\n\n      void vkCmdWriteTimestamp2( VkCommandBuffer commandBuffer, VkPipelineStageFlags2 stage, VkQueryPool queryPool, uint32_t query ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdWriteTimestamp2( commandBuffer, stage, queryPool, query );\n      }\n\n      VkResult vkQueueSubmit2( VkQueue queue, uint32_t submitCount, const VkSubmitInfo2 * pSubmits, VkFence fence ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkQueueSubmit2( queue, submitCount, pSubmits, fence );\n      }\n\n      void vkCmdCopyBuffer2( VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 * pCopyBufferInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCopyBuffer2( commandBuffer, pCopyBufferInfo );\n      }\n\n      void vkCmdCopyImage2( VkCommandBuffer commandBuffer, const VkCopyImageInfo2 * pCopyImageInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCopyImage2( commandBuffer, pCopyImageInfo );\n      }\n\n      void vkCmdCopyBufferToImage2( VkCommandBuffer commandBuffer, const VkCopyBufferToImageInfo2 * pCopyBufferToImageInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCopyBufferToImage2( commandBuffer, pCopyBufferToImageInfo );\n      }\n\n      void vkCmdCopyImageToBuffer2( VkCommandBuffer commandBuffer, const VkCopyImageToBufferInfo2 * pCopyImageToBufferInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCopyImageToBuffer2( commandBuffer, pCopyImageToBufferInfo );\n      }\n\n      void vkCmdBlitImage2( VkCommandBuffer commandBuffer, const VkBlitImageInfo2 * pBlitImageInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBlitImage2( commandBuffer, pBlitImageInfo );\n      }\n\n      void vkCmdResolveImage2( VkCommandBuffer commandBuffer, const VkResolveImageInfo2 * pResolveImageInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdResolveImage2( commandBuffer, pResolveImageInfo );\n      }\n\n      void vkCmdBeginRendering( VkCommandBuffer commandBuffer, const VkRenderingInfo * pRenderingInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBeginRendering( commandBuffer, pRenderingInfo );\n      }\n\n      void vkCmdEndRendering( VkCommandBuffer commandBuffer ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdEndRendering( commandBuffer );\n      }\n\n      void vkCmdSetCullMode( VkCommandBuffer commandBuffer, VkCullModeFlags cullMode ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetCullMode( commandBuffer, cullMode );\n      }\n\n      void vkCmdSetFrontFace( VkCommandBuffer commandBuffer, VkFrontFace frontFace ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetFrontFace( commandBuffer, frontFace );\n      }\n\n      void vkCmdSetPrimitiveTopology( VkCommandBuffer commandBuffer, VkPrimitiveTopology primitiveTopology ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetPrimitiveTopology( commandBuffer, primitiveTopology );\n      }\n\n      void vkCmdSetViewportWithCount( VkCommandBuffer commandBuffer, uint32_t viewportCount, const VkViewport * pViewports ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetViewportWithCount( commandBuffer, viewportCount, pViewports );\n      }\n\n      void vkCmdSetScissorWithCount( VkCommandBuffer commandBuffer, uint32_t scissorCount, const VkRect2D * pScissors ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetScissorWithCount( commandBuffer, scissorCount, pScissors );\n      }\n\n      void vkCmdBindVertexBuffers2( VkCommandBuffer      commandBuffer,\n                                    uint32_t             firstBinding,\n                                    uint32_t             bindingCount,\n                                    const VkBuffer *     pBuffers,\n                                    const VkDeviceSize * pOffsets,\n                                    const VkDeviceSize * pSizes,\n                                    const VkDeviceSize * pStrides ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBindVertexBuffers2( commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes, pStrides );\n      }\n\n      void vkCmdSetDepthTestEnable( VkCommandBuffer commandBuffer, VkBool32 depthTestEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDepthTestEnable( commandBuffer, depthTestEnable );\n      }\n\n      void vkCmdSetDepthWriteEnable( VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDepthWriteEnable( commandBuffer, depthWriteEnable );\n      }\n\n      void vkCmdSetDepthCompareOp( VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDepthCompareOp( commandBuffer, depthCompareOp );\n      }\n\n      void vkCmdSetDepthBoundsTestEnable( VkCommandBuffer commandBuffer, VkBool32 depthBoundsTestEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDepthBoundsTestEnable( commandBuffer, depthBoundsTestEnable );\n      }\n\n      void vkCmdSetStencilTestEnable( VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetStencilTestEnable( commandBuffer, stencilTestEnable );\n      }\n\n      void vkCmdSetStencilOp( VkCommandBuffer    commandBuffer,\n                              VkStencilFaceFlags faceMask,\n                              VkStencilOp        failOp,\n                              VkStencilOp        passOp,\n                              VkStencilOp        depthFailOp,\n                              VkCompareOp        compareOp ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetStencilOp( commandBuffer, faceMask, failOp, passOp, depthFailOp, compareOp );\n      }\n\n      void vkCmdSetRasterizerDiscardEnable( VkCommandBuffer commandBuffer, VkBool32 rasterizerDiscardEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetRasterizerDiscardEnable( commandBuffer, rasterizerDiscardEnable );\n      }\n\n      void vkCmdSetDepthBiasEnable( VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDepthBiasEnable( commandBuffer, depthBiasEnable );\n      }\n\n      void vkCmdSetPrimitiveRestartEnable( VkCommandBuffer commandBuffer, VkBool32 primitiveRestartEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetPrimitiveRestartEnable( commandBuffer, primitiveRestartEnable );\n      }\n\n      void vkGetDeviceBufferMemoryRequirements( VkDevice                                 device,\n                                                const VkDeviceBufferMemoryRequirements * pInfo,\n                                                VkMemoryRequirements2 *                  pMemoryRequirements ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeviceBufferMemoryRequirements( device, pInfo, pMemoryRequirements );\n      }\n\n      void vkGetDeviceImageMemoryRequirements( VkDevice                                device,\n                                               const VkDeviceImageMemoryRequirements * pInfo,\n                                               VkMemoryRequirements2 *                 pMemoryRequirements ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeviceImageMemoryRequirements( device, pInfo, pMemoryRequirements );\n      }\n\n      void vkGetDeviceImageSparseMemoryRequirements( VkDevice                                device,\n                                                     const VkDeviceImageMemoryRequirements * pInfo,\n                                                     uint32_t *                              pSparseMemoryRequirementCount,\n                                                     VkSparseImageMemoryRequirements2 *      pSparseMemoryRequirements ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeviceImageSparseMemoryRequirements( device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements );\n      }\n\n      //=== VK_VERSION_1_4 ===\n\n      void vkCmdSetLineStipple( VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, uint16_t lineStipplePattern ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetLineStipple( commandBuffer, lineStippleFactor, lineStipplePattern );\n      }\n\n      VkResult vkMapMemory2( VkDevice device, const VkMemoryMapInfo * pMemoryMapInfo, void ** ppData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkMapMemory2( device, pMemoryMapInfo, ppData );\n      }\n\n      VkResult vkUnmapMemory2( VkDevice device, const VkMemoryUnmapInfo * pMemoryUnmapInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkUnmapMemory2( device, pMemoryUnmapInfo );\n      }\n\n      void vkCmdBindIndexBuffer2( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkDeviceSize size, VkIndexType indexType ) const\n        VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBindIndexBuffer2( commandBuffer, buffer, offset, size, indexType );\n      }\n\n      void vkGetRenderingAreaGranularity( VkDevice device, const VkRenderingAreaInfo * pRenderingAreaInfo, VkExtent2D * pGranularity ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetRenderingAreaGranularity( device, pRenderingAreaInfo, pGranularity );\n      }\n\n      void vkGetDeviceImageSubresourceLayout( VkDevice                             device,\n                                              const VkDeviceImageSubresourceInfo * pInfo,\n                                              VkSubresourceLayout2 *               pLayout ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeviceImageSubresourceLayout( device, pInfo, pLayout );\n      }\n\n      void vkGetImageSubresourceLayout2( VkDevice                    device,\n                                         VkImage                     image,\n                                         const VkImageSubresource2 * pSubresource,\n                                         VkSubresourceLayout2 *      pLayout ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetImageSubresourceLayout2( device, image, pSubresource, pLayout );\n      }\n\n      void vkCmdPushDescriptorSet( VkCommandBuffer              commandBuffer,\n                                   VkPipelineBindPoint          pipelineBindPoint,\n                                   VkPipelineLayout             layout,\n                                   uint32_t                     set,\n                                   uint32_t                     descriptorWriteCount,\n                                   const VkWriteDescriptorSet * pDescriptorWrites ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdPushDescriptorSet( commandBuffer, pipelineBindPoint, layout, set, descriptorWriteCount, pDescriptorWrites );\n      }\n\n      void vkCmdPushDescriptorSetWithTemplate( VkCommandBuffer            commandBuffer,\n                                               VkDescriptorUpdateTemplate descriptorUpdateTemplate,\n                                               VkPipelineLayout           layout,\n                                               uint32_t                   set,\n                                               const void *               pData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdPushDescriptorSetWithTemplate( commandBuffer, descriptorUpdateTemplate, layout, set, pData );\n      }\n\n      void vkCmdSetRenderingAttachmentLocations( VkCommandBuffer                           commandBuffer,\n                                                 const VkRenderingAttachmentLocationInfo * pLocationInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetRenderingAttachmentLocations( commandBuffer, pLocationInfo );\n      }\n\n      void vkCmdSetRenderingInputAttachmentIndices( VkCommandBuffer                             commandBuffer,\n                                                    const VkRenderingInputAttachmentIndexInfo * pInputAttachmentIndexInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetRenderingInputAttachmentIndices( commandBuffer, pInputAttachmentIndexInfo );\n      }\n\n      void vkCmdBindDescriptorSets2( VkCommandBuffer commandBuffer, const VkBindDescriptorSetsInfo * pBindDescriptorSetsInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBindDescriptorSets2( commandBuffer, pBindDescriptorSetsInfo );\n      }\n\n      void vkCmdPushConstants2( VkCommandBuffer commandBuffer, const VkPushConstantsInfo * pPushConstantsInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdPushConstants2( commandBuffer, pPushConstantsInfo );\n      }\n\n      void vkCmdPushDescriptorSet2( VkCommandBuffer commandBuffer, const VkPushDescriptorSetInfo * pPushDescriptorSetInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdPushDescriptorSet2( commandBuffer, pPushDescriptorSetInfo );\n      }\n\n      void vkCmdPushDescriptorSetWithTemplate2( VkCommandBuffer                             commandBuffer,\n                                                const VkPushDescriptorSetWithTemplateInfo * pPushDescriptorSetWithTemplateInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdPushDescriptorSetWithTemplate2( commandBuffer, pPushDescriptorSetWithTemplateInfo );\n      }\n\n      VkResult vkCopyMemoryToImage( VkDevice device, const VkCopyMemoryToImageInfo * pCopyMemoryToImageInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCopyMemoryToImage( device, pCopyMemoryToImageInfo );\n      }\n\n      VkResult vkCopyImageToMemory( VkDevice device, const VkCopyImageToMemoryInfo * pCopyImageToMemoryInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCopyImageToMemory( device, pCopyImageToMemoryInfo );\n      }\n\n      VkResult vkCopyImageToImage( VkDevice device, const VkCopyImageToImageInfo * pCopyImageToImageInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCopyImageToImage( device, pCopyImageToImageInfo );\n      }\n\n      VkResult\n        vkTransitionImageLayout( VkDevice device, uint32_t transitionCount, const VkHostImageLayoutTransitionInfo * pTransitions ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkTransitionImageLayout( device, transitionCount, pTransitions );\n      }\n\n      //=== VK_KHR_surface ===\n\n      void vkDestroySurfaceKHR( VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroySurfaceKHR( instance, surface, pAllocator );\n      }\n\n      VkResult vkGetPhysicalDeviceSurfaceSupportKHR( VkPhysicalDevice physicalDevice,\n                                                     uint32_t         queueFamilyIndex,\n                                                     VkSurfaceKHR     surface,\n                                                     VkBool32 *       pSupported ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceSurfaceSupportKHR( physicalDevice, queueFamilyIndex, surface, pSupported );\n      }\n\n      VkResult vkGetPhysicalDeviceSurfaceCapabilitiesKHR( VkPhysicalDevice           physicalDevice,\n                                                          VkSurfaceKHR               surface,\n                                                          VkSurfaceCapabilitiesKHR * pSurfaceCapabilities ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceSurfaceCapabilitiesKHR( physicalDevice, surface, pSurfaceCapabilities );\n      }\n\n      VkResult vkGetPhysicalDeviceSurfaceFormatsKHR( VkPhysicalDevice     physicalDevice,\n                                                     VkSurfaceKHR         surface,\n                                                     uint32_t *           pSurfaceFormatCount,\n                                                     VkSurfaceFormatKHR * pSurfaceFormats ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceSurfaceFormatsKHR( physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats );\n      }\n\n      VkResult vkGetPhysicalDeviceSurfacePresentModesKHR( VkPhysicalDevice   physicalDevice,\n                                                          VkSurfaceKHR       surface,\n                                                          uint32_t *         pPresentModeCount,\n                                                          VkPresentModeKHR * pPresentModes ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceSurfacePresentModesKHR( physicalDevice, surface, pPresentModeCount, pPresentModes );\n      }\n\n      //=== VK_KHR_swapchain ===\n\n      VkResult vkCreateSwapchainKHR( VkDevice                         device,\n                                     const VkSwapchainCreateInfoKHR * pCreateInfo,\n                                     const VkAllocationCallbacks *    pAllocator,\n                                     VkSwapchainKHR *                 pSwapchain ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateSwapchainKHR( device, pCreateInfo, pAllocator, pSwapchain );\n      }\n\n      void vkDestroySwapchainKHR( VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroySwapchainKHR( device, swapchain, pAllocator );\n      }\n\n      VkResult vkGetSwapchainImagesKHR( VkDevice       device,\n                                        VkSwapchainKHR swapchain,\n                                        uint32_t *     pSwapchainImageCount,\n                                        VkImage *      pSwapchainImages ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetSwapchainImagesKHR( device, swapchain, pSwapchainImageCount, pSwapchainImages );\n      }\n\n      VkResult vkAcquireNextImageKHR(\n        VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout, VkSemaphore semaphore, VkFence fence, uint32_t * pImageIndex ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkAcquireNextImageKHR( device, swapchain, timeout, semaphore, fence, pImageIndex );\n      }\n\n      VkResult vkQueuePresentKHR( VkQueue queue, const VkPresentInfoKHR * pPresentInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkQueuePresentKHR( queue, pPresentInfo );\n      }\n\n      VkResult vkGetDeviceGroupPresentCapabilitiesKHR( VkDevice                              device,\n                                                       VkDeviceGroupPresentCapabilitiesKHR * pDeviceGroupPresentCapabilities ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeviceGroupPresentCapabilitiesKHR( device, pDeviceGroupPresentCapabilities );\n      }\n\n      VkResult\n        vkGetDeviceGroupSurfacePresentModesKHR( VkDevice device, VkSurfaceKHR surface, VkDeviceGroupPresentModeFlagsKHR * pModes ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeviceGroupSurfacePresentModesKHR( device, surface, pModes );\n      }\n\n      VkResult vkGetPhysicalDevicePresentRectanglesKHR( VkPhysicalDevice physicalDevice,\n                                                        VkSurfaceKHR     surface,\n                                                        uint32_t *       pRectCount,\n                                                        VkRect2D *       pRects ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDevicePresentRectanglesKHR( physicalDevice, surface, pRectCount, pRects );\n      }\n\n      VkResult vkAcquireNextImage2KHR( VkDevice device, const VkAcquireNextImageInfoKHR * pAcquireInfo, uint32_t * pImageIndex ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkAcquireNextImage2KHR( device, pAcquireInfo, pImageIndex );\n      }\n\n      //=== VK_KHR_display ===\n\n      VkResult vkGetPhysicalDeviceDisplayPropertiesKHR( VkPhysicalDevice         physicalDevice,\n                                                        uint32_t *               pPropertyCount,\n                                                        VkDisplayPropertiesKHR * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceDisplayPropertiesKHR( physicalDevice, pPropertyCount, pProperties );\n      }\n\n      VkResult vkGetPhysicalDeviceDisplayPlanePropertiesKHR( VkPhysicalDevice              physicalDevice,\n                                                             uint32_t *                    pPropertyCount,\n                                                             VkDisplayPlanePropertiesKHR * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceDisplayPlanePropertiesKHR( physicalDevice, pPropertyCount, pProperties );\n      }\n\n      VkResult vkGetDisplayPlaneSupportedDisplaysKHR( VkPhysicalDevice physicalDevice,\n                                                      uint32_t         planeIndex,\n                                                      uint32_t *       pDisplayCount,\n                                                      VkDisplayKHR *   pDisplays ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDisplayPlaneSupportedDisplaysKHR( physicalDevice, planeIndex, pDisplayCount, pDisplays );\n      }\n\n      VkResult vkGetDisplayModePropertiesKHR( VkPhysicalDevice             physicalDevice,\n                                              VkDisplayKHR                 display,\n                                              uint32_t *                   pPropertyCount,\n                                              VkDisplayModePropertiesKHR * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDisplayModePropertiesKHR( physicalDevice, display, pPropertyCount, pProperties );\n      }\n\n      VkResult vkCreateDisplayModeKHR( VkPhysicalDevice                   physicalDevice,\n                                       VkDisplayKHR                       display,\n                                       const VkDisplayModeCreateInfoKHR * pCreateInfo,\n                                       const VkAllocationCallbacks *      pAllocator,\n                                       VkDisplayModeKHR *                 pMode ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateDisplayModeKHR( physicalDevice, display, pCreateInfo, pAllocator, pMode );\n      }\n\n      VkResult vkGetDisplayPlaneCapabilitiesKHR( VkPhysicalDevice                physicalDevice,\n                                                 VkDisplayModeKHR                mode,\n                                                 uint32_t                        planeIndex,\n                                                 VkDisplayPlaneCapabilitiesKHR * pCapabilities ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDisplayPlaneCapabilitiesKHR( physicalDevice, mode, planeIndex, pCapabilities );\n      }\n\n      VkResult vkCreateDisplayPlaneSurfaceKHR( VkInstance                            instance,\n                                               const VkDisplaySurfaceCreateInfoKHR * pCreateInfo,\n                                               const VkAllocationCallbacks *         pAllocator,\n                                               VkSurfaceKHR *                        pSurface ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateDisplayPlaneSurfaceKHR( instance, pCreateInfo, pAllocator, pSurface );\n      }\n\n      //=== VK_KHR_display_swapchain ===\n\n      VkResult vkCreateSharedSwapchainsKHR( VkDevice                         device,\n                                            uint32_t                         swapchainCount,\n                                            const VkSwapchainCreateInfoKHR * pCreateInfos,\n                                            const VkAllocationCallbacks *    pAllocator,\n                                            VkSwapchainKHR *                 pSwapchains ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateSharedSwapchainsKHR( device, swapchainCount, pCreateInfos, pAllocator, pSwapchains );\n      }\n\n#  if defined( VK_USE_PLATFORM_XLIB_KHR )\n      //=== VK_KHR_xlib_surface ===\n\n      VkResult vkCreateXlibSurfaceKHR( VkInstance                         instance,\n                                       const VkXlibSurfaceCreateInfoKHR * pCreateInfo,\n                                       const VkAllocationCallbacks *      pAllocator,\n                                       VkSurfaceKHR *                     pSurface ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateXlibSurfaceKHR( instance, pCreateInfo, pAllocator, pSurface );\n      }\n\n      VkBool32 vkGetPhysicalDeviceXlibPresentationSupportKHR( VkPhysicalDevice physicalDevice,\n                                                              uint32_t         queueFamilyIndex,\n                                                              Display *        dpy,\n                                                              VisualID         visualID ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceXlibPresentationSupportKHR( physicalDevice, queueFamilyIndex, dpy, visualID );\n      }\n#  endif /*VK_USE_PLATFORM_XLIB_KHR*/\n\n#  if defined( VK_USE_PLATFORM_XCB_KHR )\n      //=== VK_KHR_xcb_surface ===\n\n      VkResult vkCreateXcbSurfaceKHR( VkInstance                        instance,\n                                      const VkXcbSurfaceCreateInfoKHR * pCreateInfo,\n                                      const VkAllocationCallbacks *     pAllocator,\n                                      VkSurfaceKHR *                    pSurface ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateXcbSurfaceKHR( instance, pCreateInfo, pAllocator, pSurface );\n      }\n\n      VkBool32 vkGetPhysicalDeviceXcbPresentationSupportKHR( VkPhysicalDevice   physicalDevice,\n                                                             uint32_t           queueFamilyIndex,\n                                                             xcb_connection_t * connection,\n                                                             xcb_visualid_t     visual_id ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceXcbPresentationSupportKHR( physicalDevice, queueFamilyIndex, connection, visual_id );\n      }\n#  endif /*VK_USE_PLATFORM_XCB_KHR*/\n\n#  if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n      //=== VK_KHR_wayland_surface ===\n\n      VkResult vkCreateWaylandSurfaceKHR( VkInstance                            instance,\n                                          const VkWaylandSurfaceCreateInfoKHR * pCreateInfo,\n                                          const VkAllocationCallbacks *         pAllocator,\n                                          VkSurfaceKHR *                        pSurface ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateWaylandSurfaceKHR( instance, pCreateInfo, pAllocator, pSurface );\n      }\n\n      VkBool32 vkGetPhysicalDeviceWaylandPresentationSupportKHR( VkPhysicalDevice    physicalDevice,\n                                                                 uint32_t            queueFamilyIndex,\n                                                                 struct wl_display * display ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceWaylandPresentationSupportKHR( physicalDevice, queueFamilyIndex, display );\n      }\n#  endif /*VK_USE_PLATFORM_WAYLAND_KHR*/\n\n#  if defined( VK_USE_PLATFORM_ANDROID_KHR )\n      //=== VK_KHR_android_surface ===\n\n      VkResult vkCreateAndroidSurfaceKHR( VkInstance                            instance,\n                                          const VkAndroidSurfaceCreateInfoKHR * pCreateInfo,\n                                          const VkAllocationCallbacks *         pAllocator,\n                                          VkSurfaceKHR *                        pSurface ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateAndroidSurfaceKHR( instance, pCreateInfo, pAllocator, pSurface );\n      }\n#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_KHR_win32_surface ===\n\n      VkResult vkCreateWin32SurfaceKHR( VkInstance                          instance,\n                                        const VkWin32SurfaceCreateInfoKHR * pCreateInfo,\n                                        const VkAllocationCallbacks *       pAllocator,\n                                        VkSurfaceKHR *                      pSurface ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateWin32SurfaceKHR( instance, pCreateInfo, pAllocator, pSurface );\n      }\n\n      VkBool32 vkGetPhysicalDeviceWin32PresentationSupportKHR( VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceWin32PresentationSupportKHR( physicalDevice, queueFamilyIndex );\n      }\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n      //=== VK_EXT_debug_report ===\n\n      VkResult vkCreateDebugReportCallbackEXT( VkInstance                                 instance,\n                                               const VkDebugReportCallbackCreateInfoEXT * pCreateInfo,\n                                               const VkAllocationCallbacks *              pAllocator,\n                                               VkDebugReportCallbackEXT *                 pCallback ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateDebugReportCallbackEXT( instance, pCreateInfo, pAllocator, pCallback );\n      }\n\n      void vkDestroyDebugReportCallbackEXT( VkInstance                    instance,\n                                            VkDebugReportCallbackEXT      callback,\n                                            const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyDebugReportCallbackEXT( instance, callback, pAllocator );\n      }\n\n      void vkDebugReportMessageEXT( VkInstance                 instance,\n                                    VkDebugReportFlagsEXT      flags,\n                                    VkDebugReportObjectTypeEXT objectType,\n                                    uint64_t                   object,\n                                    size_t                     location,\n                                    int32_t                    messageCode,\n                                    const char *               pLayerPrefix,\n                                    const char *               pMessage ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDebugReportMessageEXT( instance, flags, objectType, object, location, messageCode, pLayerPrefix, pMessage );\n      }\n\n      //=== VK_EXT_debug_marker ===\n\n      VkResult vkDebugMarkerSetObjectTagEXT( VkDevice device, const VkDebugMarkerObjectTagInfoEXT * pTagInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDebugMarkerSetObjectTagEXT( device, pTagInfo );\n      }\n\n      VkResult vkDebugMarkerSetObjectNameEXT( VkDevice device, const VkDebugMarkerObjectNameInfoEXT * pNameInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDebugMarkerSetObjectNameEXT( device, pNameInfo );\n      }\n\n      void vkCmdDebugMarkerBeginEXT( VkCommandBuffer commandBuffer, const VkDebugMarkerMarkerInfoEXT * pMarkerInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDebugMarkerBeginEXT( commandBuffer, pMarkerInfo );\n      }\n\n      void vkCmdDebugMarkerEndEXT( VkCommandBuffer commandBuffer ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDebugMarkerEndEXT( commandBuffer );\n      }\n\n      void vkCmdDebugMarkerInsertEXT( VkCommandBuffer commandBuffer, const VkDebugMarkerMarkerInfoEXT * pMarkerInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDebugMarkerInsertEXT( commandBuffer, pMarkerInfo );\n      }\n\n      //=== VK_KHR_video_queue ===\n\n      VkResult vkGetPhysicalDeviceVideoCapabilitiesKHR( VkPhysicalDevice              physicalDevice,\n                                                        const VkVideoProfileInfoKHR * pVideoProfile,\n                                                        VkVideoCapabilitiesKHR *      pCapabilities ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceVideoCapabilitiesKHR( physicalDevice, pVideoProfile, pCapabilities );\n      }\n\n      VkResult vkGetPhysicalDeviceVideoFormatPropertiesKHR( VkPhysicalDevice                           physicalDevice,\n                                                            const VkPhysicalDeviceVideoFormatInfoKHR * pVideoFormatInfo,\n                                                            uint32_t *                                 pVideoFormatPropertyCount,\n                                                            VkVideoFormatPropertiesKHR *               pVideoFormatProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceVideoFormatPropertiesKHR( physicalDevice, pVideoFormatInfo, pVideoFormatPropertyCount, pVideoFormatProperties );\n      }\n\n      VkResult vkCreateVideoSessionKHR( VkDevice                            device,\n                                        const VkVideoSessionCreateInfoKHR * pCreateInfo,\n                                        const VkAllocationCallbacks *       pAllocator,\n                                        VkVideoSessionKHR *                 pVideoSession ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateVideoSessionKHR( device, pCreateInfo, pAllocator, pVideoSession );\n      }\n\n      void vkDestroyVideoSessionKHR( VkDevice device, VkVideoSessionKHR videoSession, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyVideoSessionKHR( device, videoSession, pAllocator );\n      }\n\n      VkResult vkGetVideoSessionMemoryRequirementsKHR( VkDevice                              device,\n                                                       VkVideoSessionKHR                     videoSession,\n                                                       uint32_t *                            pMemoryRequirementsCount,\n                                                       VkVideoSessionMemoryRequirementsKHR * pMemoryRequirements ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetVideoSessionMemoryRequirementsKHR( device, videoSession, pMemoryRequirementsCount, pMemoryRequirements );\n      }\n\n      VkResult vkBindVideoSessionMemoryKHR( VkDevice                                device,\n                                            VkVideoSessionKHR                       videoSession,\n                                            uint32_t                                bindSessionMemoryInfoCount,\n                                            const VkBindVideoSessionMemoryInfoKHR * pBindSessionMemoryInfos ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkBindVideoSessionMemoryKHR( device, videoSession, bindSessionMemoryInfoCount, pBindSessionMemoryInfos );\n      }\n\n      VkResult vkCreateVideoSessionParametersKHR( VkDevice                                      device,\n                                                  const VkVideoSessionParametersCreateInfoKHR * pCreateInfo,\n                                                  const VkAllocationCallbacks *                 pAllocator,\n                                                  VkVideoSessionParametersKHR *                 pVideoSessionParameters ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateVideoSessionParametersKHR( device, pCreateInfo, pAllocator, pVideoSessionParameters );\n      }\n\n      VkResult vkUpdateVideoSessionParametersKHR( VkDevice                                      device,\n                                                  VkVideoSessionParametersKHR                   videoSessionParameters,\n                                                  const VkVideoSessionParametersUpdateInfoKHR * pUpdateInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkUpdateVideoSessionParametersKHR( device, videoSessionParameters, pUpdateInfo );\n      }\n\n      void vkDestroyVideoSessionParametersKHR( VkDevice                      device,\n                                               VkVideoSessionParametersKHR   videoSessionParameters,\n                                               const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyVideoSessionParametersKHR( device, videoSessionParameters, pAllocator );\n      }\n\n      void vkCmdBeginVideoCodingKHR( VkCommandBuffer commandBuffer, const VkVideoBeginCodingInfoKHR * pBeginInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBeginVideoCodingKHR( commandBuffer, pBeginInfo );\n      }\n\n      void vkCmdEndVideoCodingKHR( VkCommandBuffer commandBuffer, const VkVideoEndCodingInfoKHR * pEndCodingInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdEndVideoCodingKHR( commandBuffer, pEndCodingInfo );\n      }\n\n      void vkCmdControlVideoCodingKHR( VkCommandBuffer commandBuffer, const VkVideoCodingControlInfoKHR * pCodingControlInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdControlVideoCodingKHR( commandBuffer, pCodingControlInfo );\n      }\n\n      //=== VK_KHR_video_decode_queue ===\n\n      void vkCmdDecodeVideoKHR( VkCommandBuffer commandBuffer, const VkVideoDecodeInfoKHR * pDecodeInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDecodeVideoKHR( commandBuffer, pDecodeInfo );\n      }\n\n      //=== VK_EXT_transform_feedback ===\n\n      void vkCmdBindTransformFeedbackBuffersEXT( VkCommandBuffer      commandBuffer,\n                                                 uint32_t             firstBinding,\n                                                 uint32_t             bindingCount,\n                                                 const VkBuffer *     pBuffers,\n                                                 const VkDeviceSize * pOffsets,\n                                                 const VkDeviceSize * pSizes ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBindTransformFeedbackBuffersEXT( commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes );\n      }\n\n      void vkCmdBeginTransformFeedbackEXT( VkCommandBuffer      commandBuffer,\n                                           uint32_t             firstCounterBuffer,\n                                           uint32_t             counterBufferCount,\n                                           const VkBuffer *     pCounterBuffers,\n                                           const VkDeviceSize * pCounterBufferOffsets ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBeginTransformFeedbackEXT( commandBuffer, firstCounterBuffer, counterBufferCount, pCounterBuffers, pCounterBufferOffsets );\n      }\n\n      void vkCmdEndTransformFeedbackEXT( VkCommandBuffer      commandBuffer,\n                                         uint32_t             firstCounterBuffer,\n                                         uint32_t             counterBufferCount,\n                                         const VkBuffer *     pCounterBuffers,\n                                         const VkDeviceSize * pCounterBufferOffsets ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdEndTransformFeedbackEXT( commandBuffer, firstCounterBuffer, counterBufferCount, pCounterBuffers, pCounterBufferOffsets );\n      }\n\n      void vkCmdBeginQueryIndexedEXT( VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags, uint32_t index ) const\n        VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBeginQueryIndexedEXT( commandBuffer, queryPool, query, flags, index );\n      }\n\n      void vkCmdEndQueryIndexedEXT( VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query, uint32_t index ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdEndQueryIndexedEXT( commandBuffer, queryPool, query, index );\n      }\n\n      void vkCmdDrawIndirectByteCountEXT( VkCommandBuffer commandBuffer,\n                                          uint32_t        instanceCount,\n                                          uint32_t        firstInstance,\n                                          VkBuffer        counterBuffer,\n                                          VkDeviceSize    counterBufferOffset,\n                                          uint32_t        counterOffset,\n                                          uint32_t        vertexStride ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDrawIndirectByteCountEXT( commandBuffer, instanceCount, firstInstance, counterBuffer, counterBufferOffset, counterOffset, vertexStride );\n      }\n\n      //=== VK_NVX_binary_import ===\n\n      VkResult vkCreateCuModuleNVX( VkDevice                        device,\n                                    const VkCuModuleCreateInfoNVX * pCreateInfo,\n                                    const VkAllocationCallbacks *   pAllocator,\n                                    VkCuModuleNVX *                 pModule ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateCuModuleNVX( device, pCreateInfo, pAllocator, pModule );\n      }\n\n      VkResult vkCreateCuFunctionNVX( VkDevice                          device,\n                                      const VkCuFunctionCreateInfoNVX * pCreateInfo,\n                                      const VkAllocationCallbacks *     pAllocator,\n                                      VkCuFunctionNVX *                 pFunction ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateCuFunctionNVX( device, pCreateInfo, pAllocator, pFunction );\n      }\n\n      void vkDestroyCuModuleNVX( VkDevice device, VkCuModuleNVX module, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyCuModuleNVX( device, module, pAllocator );\n      }\n\n      void vkDestroyCuFunctionNVX( VkDevice device, VkCuFunctionNVX function, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyCuFunctionNVX( device, function, pAllocator );\n      }\n\n      void vkCmdCuLaunchKernelNVX( VkCommandBuffer commandBuffer, const VkCuLaunchInfoNVX * pLaunchInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCuLaunchKernelNVX( commandBuffer, pLaunchInfo );\n      }\n\n      //=== VK_NVX_image_view_handle ===\n\n      uint32_t vkGetImageViewHandleNVX( VkDevice device, const VkImageViewHandleInfoNVX * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetImageViewHandleNVX( device, pInfo );\n      }\n\n      uint64_t vkGetImageViewHandle64NVX( VkDevice device, const VkImageViewHandleInfoNVX * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetImageViewHandle64NVX( device, pInfo );\n      }\n\n      VkResult vkGetImageViewAddressNVX( VkDevice device, VkImageView imageView, VkImageViewAddressPropertiesNVX * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetImageViewAddressNVX( device, imageView, pProperties );\n      }\n\n      //=== VK_AMD_draw_indirect_count ===\n\n      void vkCmdDrawIndirectCountAMD( VkCommandBuffer commandBuffer,\n                                      VkBuffer        buffer,\n                                      VkDeviceSize    offset,\n                                      VkBuffer        countBuffer,\n                                      VkDeviceSize    countBufferOffset,\n                                      uint32_t        maxDrawCount,\n                                      uint32_t        stride ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDrawIndirectCountAMD( commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride );\n      }\n\n      void vkCmdDrawIndexedIndirectCountAMD( VkCommandBuffer commandBuffer,\n                                             VkBuffer        buffer,\n                                             VkDeviceSize    offset,\n                                             VkBuffer        countBuffer,\n                                             VkDeviceSize    countBufferOffset,\n                                             uint32_t        maxDrawCount,\n                                             uint32_t        stride ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDrawIndexedIndirectCountAMD( commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride );\n      }\n\n      //=== VK_AMD_shader_info ===\n\n      VkResult vkGetShaderInfoAMD( VkDevice              device,\n                                   VkPipeline            pipeline,\n                                   VkShaderStageFlagBits shaderStage,\n                                   VkShaderInfoTypeAMD   infoType,\n                                   size_t *              pInfoSize,\n                                   void *                pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetShaderInfoAMD( device, pipeline, shaderStage, infoType, pInfoSize, pInfo );\n      }\n\n      //=== VK_KHR_dynamic_rendering ===\n\n      void vkCmdBeginRenderingKHR( VkCommandBuffer commandBuffer, const VkRenderingInfo * pRenderingInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBeginRenderingKHR( commandBuffer, pRenderingInfo );\n      }\n\n      void vkCmdEndRenderingKHR( VkCommandBuffer commandBuffer ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdEndRenderingKHR( commandBuffer );\n      }\n\n#  if defined( VK_USE_PLATFORM_GGP )\n      //=== VK_GGP_stream_descriptor_surface ===\n\n      VkResult vkCreateStreamDescriptorSurfaceGGP( VkInstance                                     instance,\n                                                   const VkStreamDescriptorSurfaceCreateInfoGGP * pCreateInfo,\n                                                   const VkAllocationCallbacks *                  pAllocator,\n                                                   VkSurfaceKHR *                                 pSurface ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateStreamDescriptorSurfaceGGP( instance, pCreateInfo, pAllocator, pSurface );\n      }\n#  endif /*VK_USE_PLATFORM_GGP*/\n\n      //=== VK_NV_external_memory_capabilities ===\n\n      VkResult\n        vkGetPhysicalDeviceExternalImageFormatPropertiesNV( VkPhysicalDevice                    physicalDevice,\n                                                            VkFormat                            format,\n                                                            VkImageType                         type,\n                                                            VkImageTiling                       tiling,\n                                                            VkImageUsageFlags                   usage,\n                                                            VkImageCreateFlags                  flags,\n                                                            VkExternalMemoryHandleTypeFlagsNV   externalHandleType,\n                                                            VkExternalImageFormatPropertiesNV * pExternalImageFormatProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceExternalImageFormatPropertiesNV(\n          physicalDevice, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties );\n      }\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_NV_external_memory_win32 ===\n\n      VkResult vkGetMemoryWin32HandleNV( VkDevice                          device,\n                                         VkDeviceMemory                    memory,\n                                         VkExternalMemoryHandleTypeFlagsNV handleType,\n                                         HANDLE *                          pHandle ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetMemoryWin32HandleNV( device, memory, handleType, pHandle );\n      }\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n      //=== VK_KHR_get_physical_device_properties2 ===\n\n      void vkGetPhysicalDeviceFeatures2KHR( VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2 * pFeatures ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceFeatures2KHR( physicalDevice, pFeatures );\n      }\n\n      void vkGetPhysicalDeviceProperties2KHR( VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties2 * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceProperties2KHR( physicalDevice, pProperties );\n      }\n\n      void vkGetPhysicalDeviceFormatProperties2KHR( VkPhysicalDevice      physicalDevice,\n                                                    VkFormat              format,\n                                                    VkFormatProperties2 * pFormatProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceFormatProperties2KHR( physicalDevice, format, pFormatProperties );\n      }\n\n      VkResult vkGetPhysicalDeviceImageFormatProperties2KHR( VkPhysicalDevice                         physicalDevice,\n                                                             const VkPhysicalDeviceImageFormatInfo2 * pImageFormatInfo,\n                                                             VkImageFormatProperties2 *               pImageFormatProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceImageFormatProperties2KHR( physicalDevice, pImageFormatInfo, pImageFormatProperties );\n      }\n\n      void vkGetPhysicalDeviceQueueFamilyProperties2KHR( VkPhysicalDevice           physicalDevice,\n                                                         uint32_t *                 pQueueFamilyPropertyCount,\n                                                         VkQueueFamilyProperties2 * pQueueFamilyProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceQueueFamilyProperties2KHR( physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties );\n      }\n\n      void vkGetPhysicalDeviceMemoryProperties2KHR( VkPhysicalDevice                    physicalDevice,\n                                                    VkPhysicalDeviceMemoryProperties2 * pMemoryProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceMemoryProperties2KHR( physicalDevice, pMemoryProperties );\n      }\n\n      void vkGetPhysicalDeviceSparseImageFormatProperties2KHR( VkPhysicalDevice                               physicalDevice,\n                                                               const VkPhysicalDeviceSparseImageFormatInfo2 * pFormatInfo,\n                                                               uint32_t *                                     pPropertyCount,\n                                                               VkSparseImageFormatProperties2 *               pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceSparseImageFormatProperties2KHR( physicalDevice, pFormatInfo, pPropertyCount, pProperties );\n      }\n\n      //=== VK_KHR_device_group ===\n\n      void vkGetDeviceGroupPeerMemoryFeaturesKHR( VkDevice                   device,\n                                                  uint32_t                   heapIndex,\n                                                  uint32_t                   localDeviceIndex,\n                                                  uint32_t                   remoteDeviceIndex,\n                                                  VkPeerMemoryFeatureFlags * pPeerMemoryFeatures ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeviceGroupPeerMemoryFeaturesKHR( device, heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures );\n      }\n\n      void vkCmdSetDeviceMaskKHR( VkCommandBuffer commandBuffer, uint32_t deviceMask ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDeviceMaskKHR( commandBuffer, deviceMask );\n      }\n\n      void vkCmdDispatchBaseKHR( VkCommandBuffer commandBuffer,\n                                 uint32_t        baseGroupX,\n                                 uint32_t        baseGroupY,\n                                 uint32_t        baseGroupZ,\n                                 uint32_t        groupCountX,\n                                 uint32_t        groupCountY,\n                                 uint32_t        groupCountZ ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDispatchBaseKHR( commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ );\n      }\n\n#  if defined( VK_USE_PLATFORM_VI_NN )\n      //=== VK_NN_vi_surface ===\n\n      VkResult vkCreateViSurfaceNN( VkInstance                      instance,\n                                    const VkViSurfaceCreateInfoNN * pCreateInfo,\n                                    const VkAllocationCallbacks *   pAllocator,\n                                    VkSurfaceKHR *                  pSurface ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateViSurfaceNN( instance, pCreateInfo, pAllocator, pSurface );\n      }\n#  endif /*VK_USE_PLATFORM_VI_NN*/\n\n      //=== VK_KHR_maintenance1 ===\n\n      void vkTrimCommandPoolKHR( VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlags flags ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkTrimCommandPoolKHR( device, commandPool, flags );\n      }\n\n      //=== VK_KHR_device_group_creation ===\n\n      VkResult vkEnumeratePhysicalDeviceGroupsKHR( VkInstance                        instance,\n                                                   uint32_t *                        pPhysicalDeviceGroupCount,\n                                                   VkPhysicalDeviceGroupProperties * pPhysicalDeviceGroupProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkEnumeratePhysicalDeviceGroupsKHR( instance, pPhysicalDeviceGroupCount, pPhysicalDeviceGroupProperties );\n      }\n\n      //=== VK_KHR_external_memory_capabilities ===\n\n      void vkGetPhysicalDeviceExternalBufferPropertiesKHR( VkPhysicalDevice                           physicalDevice,\n                                                           const VkPhysicalDeviceExternalBufferInfo * pExternalBufferInfo,\n                                                           VkExternalBufferProperties *               pExternalBufferProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceExternalBufferPropertiesKHR( physicalDevice, pExternalBufferInfo, pExternalBufferProperties );\n      }\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_KHR_external_memory_win32 ===\n\n      VkResult\n        vkGetMemoryWin32HandleKHR( VkDevice device, const VkMemoryGetWin32HandleInfoKHR * pGetWin32HandleInfo, HANDLE * pHandle ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetMemoryWin32HandleKHR( device, pGetWin32HandleInfo, pHandle );\n      }\n\n      VkResult vkGetMemoryWin32HandlePropertiesKHR( VkDevice                           device,\n                                                    VkExternalMemoryHandleTypeFlagBits handleType,\n                                                    HANDLE                             handle,\n                                                    VkMemoryWin32HandlePropertiesKHR * pMemoryWin32HandleProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetMemoryWin32HandlePropertiesKHR( device, handleType, handle, pMemoryWin32HandleProperties );\n      }\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n      //=== VK_KHR_external_memory_fd ===\n\n      VkResult vkGetMemoryFdKHR( VkDevice device, const VkMemoryGetFdInfoKHR * pGetFdInfo, int * pFd ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetMemoryFdKHR( device, pGetFdInfo, pFd );\n      }\n\n      VkResult vkGetMemoryFdPropertiesKHR( VkDevice                           device,\n                                           VkExternalMemoryHandleTypeFlagBits handleType,\n                                           int                                fd,\n                                           VkMemoryFdPropertiesKHR *          pMemoryFdProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetMemoryFdPropertiesKHR( device, handleType, fd, pMemoryFdProperties );\n      }\n\n      //=== VK_KHR_external_semaphore_capabilities ===\n\n      void vkGetPhysicalDeviceExternalSemaphorePropertiesKHR( VkPhysicalDevice                              physicalDevice,\n                                                              const VkPhysicalDeviceExternalSemaphoreInfo * pExternalSemaphoreInfo,\n                                                              VkExternalSemaphoreProperties * pExternalSemaphoreProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceExternalSemaphorePropertiesKHR( physicalDevice, pExternalSemaphoreInfo, pExternalSemaphoreProperties );\n      }\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_KHR_external_semaphore_win32 ===\n\n      VkResult vkImportSemaphoreWin32HandleKHR( VkDevice                                    device,\n                                                const VkImportSemaphoreWin32HandleInfoKHR * pImportSemaphoreWin32HandleInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkImportSemaphoreWin32HandleKHR( device, pImportSemaphoreWin32HandleInfo );\n      }\n\n      VkResult vkGetSemaphoreWin32HandleKHR( VkDevice                                 device,\n                                             const VkSemaphoreGetWin32HandleInfoKHR * pGetWin32HandleInfo,\n                                             HANDLE *                                 pHandle ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetSemaphoreWin32HandleKHR( device, pGetWin32HandleInfo, pHandle );\n      }\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n      //=== VK_KHR_external_semaphore_fd ===\n\n      VkResult vkImportSemaphoreFdKHR( VkDevice device, const VkImportSemaphoreFdInfoKHR * pImportSemaphoreFdInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkImportSemaphoreFdKHR( device, pImportSemaphoreFdInfo );\n      }\n\n      VkResult vkGetSemaphoreFdKHR( VkDevice device, const VkSemaphoreGetFdInfoKHR * pGetFdInfo, int * pFd ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetSemaphoreFdKHR( device, pGetFdInfo, pFd );\n      }\n\n      //=== VK_KHR_push_descriptor ===\n\n      void vkCmdPushDescriptorSetKHR( VkCommandBuffer              commandBuffer,\n                                      VkPipelineBindPoint          pipelineBindPoint,\n                                      VkPipelineLayout             layout,\n                                      uint32_t                     set,\n                                      uint32_t                     descriptorWriteCount,\n                                      const VkWriteDescriptorSet * pDescriptorWrites ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdPushDescriptorSetKHR( commandBuffer, pipelineBindPoint, layout, set, descriptorWriteCount, pDescriptorWrites );\n      }\n\n      void vkCmdPushDescriptorSetWithTemplateKHR( VkCommandBuffer            commandBuffer,\n                                                  VkDescriptorUpdateTemplate descriptorUpdateTemplate,\n                                                  VkPipelineLayout           layout,\n                                                  uint32_t                   set,\n                                                  const void *               pData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdPushDescriptorSetWithTemplateKHR( commandBuffer, descriptorUpdateTemplate, layout, set, pData );\n      }\n\n      //=== VK_EXT_conditional_rendering ===\n\n      void vkCmdBeginConditionalRenderingEXT( VkCommandBuffer                            commandBuffer,\n                                              const VkConditionalRenderingBeginInfoEXT * pConditionalRenderingBegin ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBeginConditionalRenderingEXT( commandBuffer, pConditionalRenderingBegin );\n      }\n\n      void vkCmdEndConditionalRenderingEXT( VkCommandBuffer commandBuffer ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdEndConditionalRenderingEXT( commandBuffer );\n      }\n\n      //=== VK_KHR_descriptor_update_template ===\n\n      VkResult vkCreateDescriptorUpdateTemplateKHR( VkDevice                                     device,\n                                                    const VkDescriptorUpdateTemplateCreateInfo * pCreateInfo,\n                                                    const VkAllocationCallbacks *                pAllocator,\n                                                    VkDescriptorUpdateTemplate *                 pDescriptorUpdateTemplate ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateDescriptorUpdateTemplateKHR( device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate );\n      }\n\n      void vkDestroyDescriptorUpdateTemplateKHR( VkDevice                      device,\n                                                 VkDescriptorUpdateTemplate    descriptorUpdateTemplate,\n                                                 const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyDescriptorUpdateTemplateKHR( device, descriptorUpdateTemplate, pAllocator );\n      }\n\n      void vkUpdateDescriptorSetWithTemplateKHR( VkDevice                   device,\n                                                 VkDescriptorSet            descriptorSet,\n                                                 VkDescriptorUpdateTemplate descriptorUpdateTemplate,\n                                                 const void *               pData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkUpdateDescriptorSetWithTemplateKHR( device, descriptorSet, descriptorUpdateTemplate, pData );\n      }\n\n      //=== VK_NV_clip_space_w_scaling ===\n\n      void vkCmdSetViewportWScalingNV( VkCommandBuffer              commandBuffer,\n                                       uint32_t                     firstViewport,\n                                       uint32_t                     viewportCount,\n                                       const VkViewportWScalingNV * pViewportWScalings ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetViewportWScalingNV( commandBuffer, firstViewport, viewportCount, pViewportWScalings );\n      }\n\n      //=== VK_EXT_direct_mode_display ===\n\n      VkResult vkReleaseDisplayEXT( VkPhysicalDevice physicalDevice, VkDisplayKHR display ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkReleaseDisplayEXT( physicalDevice, display );\n      }\n\n#  if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )\n      //=== VK_EXT_acquire_xlib_display ===\n\n      VkResult vkAcquireXlibDisplayEXT( VkPhysicalDevice physicalDevice, Display * dpy, VkDisplayKHR display ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkAcquireXlibDisplayEXT( physicalDevice, dpy, display );\n      }\n\n      VkResult\n        vkGetRandROutputDisplayEXT( VkPhysicalDevice physicalDevice, Display * dpy, RROutput rrOutput, VkDisplayKHR * pDisplay ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetRandROutputDisplayEXT( physicalDevice, dpy, rrOutput, pDisplay );\n      }\n#  endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/\n\n      //=== VK_EXT_display_surface_counter ===\n\n      VkResult vkGetPhysicalDeviceSurfaceCapabilities2EXT( VkPhysicalDevice            physicalDevice,\n                                                           VkSurfaceKHR                surface,\n                                                           VkSurfaceCapabilities2EXT * pSurfaceCapabilities ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceSurfaceCapabilities2EXT( physicalDevice, surface, pSurfaceCapabilities );\n      }\n\n      //=== VK_EXT_display_control ===\n\n      VkResult vkDisplayPowerControlEXT( VkDevice device, VkDisplayKHR display, const VkDisplayPowerInfoEXT * pDisplayPowerInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDisplayPowerControlEXT( device, display, pDisplayPowerInfo );\n      }\n\n      VkResult vkRegisterDeviceEventEXT( VkDevice                      device,\n                                         const VkDeviceEventInfoEXT *  pDeviceEventInfo,\n                                         const VkAllocationCallbacks * pAllocator,\n                                         VkFence *                     pFence ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkRegisterDeviceEventEXT( device, pDeviceEventInfo, pAllocator, pFence );\n      }\n\n      VkResult vkRegisterDisplayEventEXT( VkDevice                      device,\n                                          VkDisplayKHR                  display,\n                                          const VkDisplayEventInfoEXT * pDisplayEventInfo,\n                                          const VkAllocationCallbacks * pAllocator,\n                                          VkFence *                     pFence ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkRegisterDisplayEventEXT( device, display, pDisplayEventInfo, pAllocator, pFence );\n      }\n\n      VkResult vkGetSwapchainCounterEXT( VkDevice                    device,\n                                         VkSwapchainKHR              swapchain,\n                                         VkSurfaceCounterFlagBitsEXT counter,\n                                         uint64_t *                  pCounterValue ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetSwapchainCounterEXT( device, swapchain, counter, pCounterValue );\n      }\n\n      //=== VK_GOOGLE_display_timing ===\n\n      VkResult vkGetRefreshCycleDurationGOOGLE( VkDevice                       device,\n                                                VkSwapchainKHR                 swapchain,\n                                                VkRefreshCycleDurationGOOGLE * pDisplayTimingProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetRefreshCycleDurationGOOGLE( device, swapchain, pDisplayTimingProperties );\n      }\n\n      VkResult vkGetPastPresentationTimingGOOGLE( VkDevice                         device,\n                                                  VkSwapchainKHR                   swapchain,\n                                                  uint32_t *                       pPresentationTimingCount,\n                                                  VkPastPresentationTimingGOOGLE * pPresentationTimings ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPastPresentationTimingGOOGLE( device, swapchain, pPresentationTimingCount, pPresentationTimings );\n      }\n\n      //=== VK_EXT_discard_rectangles ===\n\n      void vkCmdSetDiscardRectangleEXT( VkCommandBuffer  commandBuffer,\n                                        uint32_t         firstDiscardRectangle,\n                                        uint32_t         discardRectangleCount,\n                                        const VkRect2D * pDiscardRectangles ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDiscardRectangleEXT( commandBuffer, firstDiscardRectangle, discardRectangleCount, pDiscardRectangles );\n      }\n\n      void vkCmdSetDiscardRectangleEnableEXT( VkCommandBuffer commandBuffer, VkBool32 discardRectangleEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDiscardRectangleEnableEXT( commandBuffer, discardRectangleEnable );\n      }\n\n      void vkCmdSetDiscardRectangleModeEXT( VkCommandBuffer commandBuffer, VkDiscardRectangleModeEXT discardRectangleMode ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDiscardRectangleModeEXT( commandBuffer, discardRectangleMode );\n      }\n\n      //=== VK_EXT_hdr_metadata ===\n\n      void vkSetHdrMetadataEXT( VkDevice                 device,\n                                uint32_t                 swapchainCount,\n                                const VkSwapchainKHR *   pSwapchains,\n                                const VkHdrMetadataEXT * pMetadata ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkSetHdrMetadataEXT( device, swapchainCount, pSwapchains, pMetadata );\n      }\n\n      //=== VK_KHR_create_renderpass2 ===\n\n      VkResult vkCreateRenderPass2KHR( VkDevice                        device,\n                                       const VkRenderPassCreateInfo2 * pCreateInfo,\n                                       const VkAllocationCallbacks *   pAllocator,\n                                       VkRenderPass *                  pRenderPass ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateRenderPass2KHR( device, pCreateInfo, pAllocator, pRenderPass );\n      }\n\n      void vkCmdBeginRenderPass2KHR( VkCommandBuffer               commandBuffer,\n                                     const VkRenderPassBeginInfo * pRenderPassBegin,\n                                     const VkSubpassBeginInfo *    pSubpassBeginInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBeginRenderPass2KHR( commandBuffer, pRenderPassBegin, pSubpassBeginInfo );\n      }\n\n      void vkCmdNextSubpass2KHR( VkCommandBuffer            commandBuffer,\n                                 const VkSubpassBeginInfo * pSubpassBeginInfo,\n                                 const VkSubpassEndInfo *   pSubpassEndInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdNextSubpass2KHR( commandBuffer, pSubpassBeginInfo, pSubpassEndInfo );\n      }\n\n      void vkCmdEndRenderPass2KHR( VkCommandBuffer commandBuffer, const VkSubpassEndInfo * pSubpassEndInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdEndRenderPass2KHR( commandBuffer, pSubpassEndInfo );\n      }\n\n      //=== VK_KHR_shared_presentable_image ===\n\n      VkResult vkGetSwapchainStatusKHR( VkDevice device, VkSwapchainKHR swapchain ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetSwapchainStatusKHR( device, swapchain );\n      }\n\n      //=== VK_KHR_external_fence_capabilities ===\n\n      void vkGetPhysicalDeviceExternalFencePropertiesKHR( VkPhysicalDevice                          physicalDevice,\n                                                          const VkPhysicalDeviceExternalFenceInfo * pExternalFenceInfo,\n                                                          VkExternalFenceProperties *               pExternalFenceProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceExternalFencePropertiesKHR( physicalDevice, pExternalFenceInfo, pExternalFenceProperties );\n      }\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_KHR_external_fence_win32 ===\n\n      VkResult vkImportFenceWin32HandleKHR( VkDevice device, const VkImportFenceWin32HandleInfoKHR * pImportFenceWin32HandleInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkImportFenceWin32HandleKHR( device, pImportFenceWin32HandleInfo );\n      }\n\n      VkResult vkGetFenceWin32HandleKHR( VkDevice device, const VkFenceGetWin32HandleInfoKHR * pGetWin32HandleInfo, HANDLE * pHandle ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetFenceWin32HandleKHR( device, pGetWin32HandleInfo, pHandle );\n      }\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n      //=== VK_KHR_external_fence_fd ===\n\n      VkResult vkImportFenceFdKHR( VkDevice device, const VkImportFenceFdInfoKHR * pImportFenceFdInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkImportFenceFdKHR( device, pImportFenceFdInfo );\n      }\n\n      VkResult vkGetFenceFdKHR( VkDevice device, const VkFenceGetFdInfoKHR * pGetFdInfo, int * pFd ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetFenceFdKHR( device, pGetFdInfo, pFd );\n      }\n\n      //=== VK_KHR_performance_query ===\n\n      VkResult\n        vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR( VkPhysicalDevice                     physicalDevice,\n                                                                         uint32_t                             queueFamilyIndex,\n                                                                         uint32_t *                           pCounterCount,\n                                                                         VkPerformanceCounterKHR *            pCounters,\n                                                                         VkPerformanceCounterDescriptionKHR * pCounterDescriptions ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(\n          physicalDevice, queueFamilyIndex, pCounterCount, pCounters, pCounterDescriptions );\n      }\n\n      void vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR( VkPhysicalDevice                            physicalDevice,\n                                                                    const VkQueryPoolPerformanceCreateInfoKHR * pPerformanceQueryCreateInfo,\n                                                                    uint32_t *                                  pNumPasses ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR( physicalDevice, pPerformanceQueryCreateInfo, pNumPasses );\n      }\n\n      VkResult vkAcquireProfilingLockKHR( VkDevice device, const VkAcquireProfilingLockInfoKHR * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkAcquireProfilingLockKHR( device, pInfo );\n      }\n\n      void vkReleaseProfilingLockKHR( VkDevice device ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkReleaseProfilingLockKHR( device );\n      }\n\n      //=== VK_KHR_get_surface_capabilities2 ===\n\n      VkResult vkGetPhysicalDeviceSurfaceCapabilities2KHR( VkPhysicalDevice                        physicalDevice,\n                                                           const VkPhysicalDeviceSurfaceInfo2KHR * pSurfaceInfo,\n                                                           VkSurfaceCapabilities2KHR *             pSurfaceCapabilities ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceSurfaceCapabilities2KHR( physicalDevice, pSurfaceInfo, pSurfaceCapabilities );\n      }\n\n      VkResult vkGetPhysicalDeviceSurfaceFormats2KHR( VkPhysicalDevice                        physicalDevice,\n                                                      const VkPhysicalDeviceSurfaceInfo2KHR * pSurfaceInfo,\n                                                      uint32_t *                              pSurfaceFormatCount,\n                                                      VkSurfaceFormat2KHR *                   pSurfaceFormats ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceSurfaceFormats2KHR( physicalDevice, pSurfaceInfo, pSurfaceFormatCount, pSurfaceFormats );\n      }\n\n      //=== VK_KHR_get_display_properties2 ===\n\n      VkResult vkGetPhysicalDeviceDisplayProperties2KHR( VkPhysicalDevice          physicalDevice,\n                                                         uint32_t *                pPropertyCount,\n                                                         VkDisplayProperties2KHR * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceDisplayProperties2KHR( physicalDevice, pPropertyCount, pProperties );\n      }\n\n      VkResult vkGetPhysicalDeviceDisplayPlaneProperties2KHR( VkPhysicalDevice               physicalDevice,\n                                                              uint32_t *                     pPropertyCount,\n                                                              VkDisplayPlaneProperties2KHR * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceDisplayPlaneProperties2KHR( physicalDevice, pPropertyCount, pProperties );\n      }\n\n      VkResult vkGetDisplayModeProperties2KHR( VkPhysicalDevice              physicalDevice,\n                                               VkDisplayKHR                  display,\n                                               uint32_t *                    pPropertyCount,\n                                               VkDisplayModeProperties2KHR * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDisplayModeProperties2KHR( physicalDevice, display, pPropertyCount, pProperties );\n      }\n\n      VkResult vkGetDisplayPlaneCapabilities2KHR( VkPhysicalDevice                 physicalDevice,\n                                                  const VkDisplayPlaneInfo2KHR *   pDisplayPlaneInfo,\n                                                  VkDisplayPlaneCapabilities2KHR * pCapabilities ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDisplayPlaneCapabilities2KHR( physicalDevice, pDisplayPlaneInfo, pCapabilities );\n      }\n\n#  if defined( VK_USE_PLATFORM_IOS_MVK )\n      //=== VK_MVK_ios_surface ===\n\n      VkResult vkCreateIOSSurfaceMVK( VkInstance                        instance,\n                                      const VkIOSSurfaceCreateInfoMVK * pCreateInfo,\n                                      const VkAllocationCallbacks *     pAllocator,\n                                      VkSurfaceKHR *                    pSurface ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateIOSSurfaceMVK( instance, pCreateInfo, pAllocator, pSurface );\n      }\n#  endif /*VK_USE_PLATFORM_IOS_MVK*/\n\n#  if defined( VK_USE_PLATFORM_MACOS_MVK )\n      //=== VK_MVK_macos_surface ===\n\n      VkResult vkCreateMacOSSurfaceMVK( VkInstance                          instance,\n                                        const VkMacOSSurfaceCreateInfoMVK * pCreateInfo,\n                                        const VkAllocationCallbacks *       pAllocator,\n                                        VkSurfaceKHR *                      pSurface ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateMacOSSurfaceMVK( instance, pCreateInfo, pAllocator, pSurface );\n      }\n#  endif /*VK_USE_PLATFORM_MACOS_MVK*/\n\n      //=== VK_EXT_debug_utils ===\n\n      VkResult vkSetDebugUtilsObjectNameEXT( VkDevice device, const VkDebugUtilsObjectNameInfoEXT * pNameInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkSetDebugUtilsObjectNameEXT( device, pNameInfo );\n      }\n\n      VkResult vkSetDebugUtilsObjectTagEXT( VkDevice device, const VkDebugUtilsObjectTagInfoEXT * pTagInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkSetDebugUtilsObjectTagEXT( device, pTagInfo );\n      }\n\n      void vkQueueBeginDebugUtilsLabelEXT( VkQueue queue, const VkDebugUtilsLabelEXT * pLabelInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkQueueBeginDebugUtilsLabelEXT( queue, pLabelInfo );\n      }\n\n      void vkQueueEndDebugUtilsLabelEXT( VkQueue queue ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkQueueEndDebugUtilsLabelEXT( queue );\n      }\n\n      void vkQueueInsertDebugUtilsLabelEXT( VkQueue queue, const VkDebugUtilsLabelEXT * pLabelInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkQueueInsertDebugUtilsLabelEXT( queue, pLabelInfo );\n      }\n\n      void vkCmdBeginDebugUtilsLabelEXT( VkCommandBuffer commandBuffer, const VkDebugUtilsLabelEXT * pLabelInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBeginDebugUtilsLabelEXT( commandBuffer, pLabelInfo );\n      }\n\n      void vkCmdEndDebugUtilsLabelEXT( VkCommandBuffer commandBuffer ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdEndDebugUtilsLabelEXT( commandBuffer );\n      }\n\n      void vkCmdInsertDebugUtilsLabelEXT( VkCommandBuffer commandBuffer, const VkDebugUtilsLabelEXT * pLabelInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdInsertDebugUtilsLabelEXT( commandBuffer, pLabelInfo );\n      }\n\n      VkResult vkCreateDebugUtilsMessengerEXT( VkInstance                                 instance,\n                                               const VkDebugUtilsMessengerCreateInfoEXT * pCreateInfo,\n                                               const VkAllocationCallbacks *              pAllocator,\n                                               VkDebugUtilsMessengerEXT *                 pMessenger ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateDebugUtilsMessengerEXT( instance, pCreateInfo, pAllocator, pMessenger );\n      }\n\n      void vkDestroyDebugUtilsMessengerEXT( VkInstance                    instance,\n                                            VkDebugUtilsMessengerEXT      messenger,\n                                            const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyDebugUtilsMessengerEXT( instance, messenger, pAllocator );\n      }\n\n      void vkSubmitDebugUtilsMessageEXT( VkInstance                                   instance,\n                                         VkDebugUtilsMessageSeverityFlagBitsEXT       messageSeverity,\n                                         VkDebugUtilsMessageTypeFlagsEXT              messageTypes,\n                                         const VkDebugUtilsMessengerCallbackDataEXT * pCallbackData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkSubmitDebugUtilsMessageEXT( instance, messageSeverity, messageTypes, pCallbackData );\n      }\n\n#  if defined( VK_USE_PLATFORM_ANDROID_KHR )\n      //=== VK_ANDROID_external_memory_android_hardware_buffer ===\n\n      VkResult vkGetAndroidHardwareBufferPropertiesANDROID( VkDevice                                   device,\n                                                            const struct AHardwareBuffer *             buffer,\n                                                            VkAndroidHardwareBufferPropertiesANDROID * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetAndroidHardwareBufferPropertiesANDROID( device, buffer, pProperties );\n      }\n\n      VkResult vkGetMemoryAndroidHardwareBufferANDROID( VkDevice                                            device,\n                                                        const VkMemoryGetAndroidHardwareBufferInfoANDROID * pInfo,\n                                                        struct AHardwareBuffer **                           pBuffer ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetMemoryAndroidHardwareBufferANDROID( device, pInfo, pBuffer );\n      }\n#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n      //=== VK_AMDX_shader_enqueue ===\n\n      VkResult vkCreateExecutionGraphPipelinesAMDX( VkDevice                                       device,\n                                                    VkPipelineCache                                pipelineCache,\n                                                    uint32_t                                       createInfoCount,\n                                                    const VkExecutionGraphPipelineCreateInfoAMDX * pCreateInfos,\n                                                    const VkAllocationCallbacks *                  pAllocator,\n                                                    VkPipeline *                                   pPipelines ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateExecutionGraphPipelinesAMDX( device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines );\n      }\n\n      VkResult vkGetExecutionGraphPipelineScratchSizeAMDX( VkDevice                                  device,\n                                                           VkPipeline                                executionGraph,\n                                                           VkExecutionGraphPipelineScratchSizeAMDX * pSizeInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetExecutionGraphPipelineScratchSizeAMDX( device, executionGraph, pSizeInfo );\n      }\n\n      VkResult vkGetExecutionGraphPipelineNodeIndexAMDX( VkDevice                                        device,\n                                                         VkPipeline                                      executionGraph,\n                                                         const VkPipelineShaderStageNodeCreateInfoAMDX * pNodeInfo,\n                                                         uint32_t *                                      pNodeIndex ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetExecutionGraphPipelineNodeIndexAMDX( device, executionGraph, pNodeInfo, pNodeIndex );\n      }\n\n      void vkCmdInitializeGraphScratchMemoryAMDX( VkCommandBuffer commandBuffer,\n                                                  VkPipeline      executionGraph,\n                                                  VkDeviceAddress scratch,\n                                                  VkDeviceSize    scratchSize ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdInitializeGraphScratchMemoryAMDX( commandBuffer, executionGraph, scratch, scratchSize );\n      }\n\n      void vkCmdDispatchGraphAMDX( VkCommandBuffer                      commandBuffer,\n                                   VkDeviceAddress                      scratch,\n                                   VkDeviceSize                         scratchSize,\n                                   const VkDispatchGraphCountInfoAMDX * pCountInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDispatchGraphAMDX( commandBuffer, scratch, scratchSize, pCountInfo );\n      }\n\n      void vkCmdDispatchGraphIndirectAMDX( VkCommandBuffer                      commandBuffer,\n                                           VkDeviceAddress                      scratch,\n                                           VkDeviceSize                         scratchSize,\n                                           const VkDispatchGraphCountInfoAMDX * pCountInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDispatchGraphIndirectAMDX( commandBuffer, scratch, scratchSize, pCountInfo );\n      }\n\n      void vkCmdDispatchGraphIndirectCountAMDX( VkCommandBuffer commandBuffer,\n                                                VkDeviceAddress scratch,\n                                                VkDeviceSize    scratchSize,\n                                                VkDeviceAddress countInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDispatchGraphIndirectCountAMDX( commandBuffer, scratch, scratchSize, countInfo );\n      }\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n      //=== VK_EXT_sample_locations ===\n\n      void vkCmdSetSampleLocationsEXT( VkCommandBuffer commandBuffer, const VkSampleLocationsInfoEXT * pSampleLocationsInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetSampleLocationsEXT( commandBuffer, pSampleLocationsInfo );\n      }\n\n      void vkGetPhysicalDeviceMultisamplePropertiesEXT( VkPhysicalDevice             physicalDevice,\n                                                        VkSampleCountFlagBits        samples,\n                                                        VkMultisamplePropertiesEXT * pMultisampleProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceMultisamplePropertiesEXT( physicalDevice, samples, pMultisampleProperties );\n      }\n\n      //=== VK_KHR_get_memory_requirements2 ===\n\n      void vkGetImageMemoryRequirements2KHR( VkDevice                               device,\n                                             const VkImageMemoryRequirementsInfo2 * pInfo,\n                                             VkMemoryRequirements2 *                pMemoryRequirements ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetImageMemoryRequirements2KHR( device, pInfo, pMemoryRequirements );\n      }\n\n      void vkGetBufferMemoryRequirements2KHR( VkDevice                                device,\n                                              const VkBufferMemoryRequirementsInfo2 * pInfo,\n                                              VkMemoryRequirements2 *                 pMemoryRequirements ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetBufferMemoryRequirements2KHR( device, pInfo, pMemoryRequirements );\n      }\n\n      void vkGetImageSparseMemoryRequirements2KHR( VkDevice                                     device,\n                                                   const VkImageSparseMemoryRequirementsInfo2 * pInfo,\n                                                   uint32_t *                                   pSparseMemoryRequirementCount,\n                                                   VkSparseImageMemoryRequirements2 *           pSparseMemoryRequirements ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetImageSparseMemoryRequirements2KHR( device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements );\n      }\n\n      //=== VK_KHR_acceleration_structure ===\n\n      VkResult vkCreateAccelerationStructureKHR( VkDevice                                     device,\n                                                 const VkAccelerationStructureCreateInfoKHR * pCreateInfo,\n                                                 const VkAllocationCallbacks *                pAllocator,\n                                                 VkAccelerationStructureKHR *                 pAccelerationStructure ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateAccelerationStructureKHR( device, pCreateInfo, pAllocator, pAccelerationStructure );\n      }\n\n      void vkDestroyAccelerationStructureKHR( VkDevice                      device,\n                                              VkAccelerationStructureKHR    accelerationStructure,\n                                              const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyAccelerationStructureKHR( device, accelerationStructure, pAllocator );\n      }\n\n      void vkCmdBuildAccelerationStructuresKHR( VkCommandBuffer                                          commandBuffer,\n                                                uint32_t                                                 infoCount,\n                                                const VkAccelerationStructureBuildGeometryInfoKHR *      pInfos,\n                                                const VkAccelerationStructureBuildRangeInfoKHR * const * ppBuildRangeInfos ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBuildAccelerationStructuresKHR( commandBuffer, infoCount, pInfos, ppBuildRangeInfos );\n      }\n\n      void vkCmdBuildAccelerationStructuresIndirectKHR( VkCommandBuffer                                     commandBuffer,\n                                                        uint32_t                                            infoCount,\n                                                        const VkAccelerationStructureBuildGeometryInfoKHR * pInfos,\n                                                        const VkDeviceAddress *                             pIndirectDeviceAddresses,\n                                                        const uint32_t *                                    pIndirectStrides,\n                                                        const uint32_t * const *                            ppMaxPrimitiveCounts ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBuildAccelerationStructuresIndirectKHR(\n          commandBuffer, infoCount, pInfos, pIndirectDeviceAddresses, pIndirectStrides, ppMaxPrimitiveCounts );\n      }\n\n      VkResult vkBuildAccelerationStructuresKHR( VkDevice                                                 device,\n                                                 VkDeferredOperationKHR                                   deferredOperation,\n                                                 uint32_t                                                 infoCount,\n                                                 const VkAccelerationStructureBuildGeometryInfoKHR *      pInfos,\n                                                 const VkAccelerationStructureBuildRangeInfoKHR * const * ppBuildRangeInfos ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkBuildAccelerationStructuresKHR( device, deferredOperation, infoCount, pInfos, ppBuildRangeInfos );\n      }\n\n      VkResult vkCopyAccelerationStructureKHR( VkDevice                                   device,\n                                               VkDeferredOperationKHR                     deferredOperation,\n                                               const VkCopyAccelerationStructureInfoKHR * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCopyAccelerationStructureKHR( device, deferredOperation, pInfo );\n      }\n\n      VkResult vkCopyAccelerationStructureToMemoryKHR( VkDevice                                           device,\n                                                       VkDeferredOperationKHR                             deferredOperation,\n                                                       const VkCopyAccelerationStructureToMemoryInfoKHR * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCopyAccelerationStructureToMemoryKHR( device, deferredOperation, pInfo );\n      }\n\n      VkResult vkCopyMemoryToAccelerationStructureKHR( VkDevice                                           device,\n                                                       VkDeferredOperationKHR                             deferredOperation,\n                                                       const VkCopyMemoryToAccelerationStructureInfoKHR * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCopyMemoryToAccelerationStructureKHR( device, deferredOperation, pInfo );\n      }\n\n      VkResult vkWriteAccelerationStructuresPropertiesKHR( VkDevice                           device,\n                                                           uint32_t                           accelerationStructureCount,\n                                                           const VkAccelerationStructureKHR * pAccelerationStructures,\n                                                           VkQueryType                        queryType,\n                                                           size_t                             dataSize,\n                                                           void *                             pData,\n                                                           size_t                             stride ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkWriteAccelerationStructuresPropertiesKHR( device, accelerationStructureCount, pAccelerationStructures, queryType, dataSize, pData, stride );\n      }\n\n      void vkCmdCopyAccelerationStructureKHR( VkCommandBuffer commandBuffer, const VkCopyAccelerationStructureInfoKHR * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCopyAccelerationStructureKHR( commandBuffer, pInfo );\n      }\n\n      void vkCmdCopyAccelerationStructureToMemoryKHR( VkCommandBuffer                                    commandBuffer,\n                                                      const VkCopyAccelerationStructureToMemoryInfoKHR * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCopyAccelerationStructureToMemoryKHR( commandBuffer, pInfo );\n      }\n\n      void vkCmdCopyMemoryToAccelerationStructureKHR( VkCommandBuffer                                    commandBuffer,\n                                                      const VkCopyMemoryToAccelerationStructureInfoKHR * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCopyMemoryToAccelerationStructureKHR( commandBuffer, pInfo );\n      }\n\n      VkDeviceAddress vkGetAccelerationStructureDeviceAddressKHR( VkDevice                                            device,\n                                                                  const VkAccelerationStructureDeviceAddressInfoKHR * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetAccelerationStructureDeviceAddressKHR( device, pInfo );\n      }\n\n      void vkCmdWriteAccelerationStructuresPropertiesKHR( VkCommandBuffer                    commandBuffer,\n                                                          uint32_t                           accelerationStructureCount,\n                                                          const VkAccelerationStructureKHR * pAccelerationStructures,\n                                                          VkQueryType                        queryType,\n                                                          VkQueryPool                        queryPool,\n                                                          uint32_t                           firstQuery ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdWriteAccelerationStructuresPropertiesKHR(\n          commandBuffer, accelerationStructureCount, pAccelerationStructures, queryType, queryPool, firstQuery );\n      }\n\n      void vkGetDeviceAccelerationStructureCompatibilityKHR( VkDevice                                      device,\n                                                             const VkAccelerationStructureVersionInfoKHR * pVersionInfo,\n                                                             VkAccelerationStructureCompatibilityKHR *     pCompatibility ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeviceAccelerationStructureCompatibilityKHR( device, pVersionInfo, pCompatibility );\n      }\n\n      void vkGetAccelerationStructureBuildSizesKHR( VkDevice                                            device,\n                                                    VkAccelerationStructureBuildTypeKHR                 buildType,\n                                                    const VkAccelerationStructureBuildGeometryInfoKHR * pBuildInfo,\n                                                    const uint32_t *                                    pMaxPrimitiveCounts,\n                                                    VkAccelerationStructureBuildSizesInfoKHR *          pSizeInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetAccelerationStructureBuildSizesKHR( device, buildType, pBuildInfo, pMaxPrimitiveCounts, pSizeInfo );\n      }\n\n      //=== VK_KHR_ray_tracing_pipeline ===\n\n      void vkCmdTraceRaysKHR( VkCommandBuffer                         commandBuffer,\n                              const VkStridedDeviceAddressRegionKHR * pRaygenShaderBindingTable,\n                              const VkStridedDeviceAddressRegionKHR * pMissShaderBindingTable,\n                              const VkStridedDeviceAddressRegionKHR * pHitShaderBindingTable,\n                              const VkStridedDeviceAddressRegionKHR * pCallableShaderBindingTable,\n                              uint32_t                                width,\n                              uint32_t                                height,\n                              uint32_t                                depth ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdTraceRaysKHR(\n          commandBuffer, pRaygenShaderBindingTable, pMissShaderBindingTable, pHitShaderBindingTable, pCallableShaderBindingTable, width, height, depth );\n      }\n\n      VkResult vkCreateRayTracingPipelinesKHR( VkDevice                                  device,\n                                               VkDeferredOperationKHR                    deferredOperation,\n                                               VkPipelineCache                           pipelineCache,\n                                               uint32_t                                  createInfoCount,\n                                               const VkRayTracingPipelineCreateInfoKHR * pCreateInfos,\n                                               const VkAllocationCallbacks *             pAllocator,\n                                               VkPipeline *                              pPipelines ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateRayTracingPipelinesKHR( device, deferredOperation, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines );\n      }\n\n      VkResult vkGetRayTracingShaderGroupHandlesKHR(\n        VkDevice device, VkPipeline pipeline, uint32_t firstGroup, uint32_t groupCount, size_t dataSize, void * pData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetRayTracingShaderGroupHandlesKHR( device, pipeline, firstGroup, groupCount, dataSize, pData );\n      }\n\n      VkResult vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(\n        VkDevice device, VkPipeline pipeline, uint32_t firstGroup, uint32_t groupCount, size_t dataSize, void * pData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetRayTracingCaptureReplayShaderGroupHandlesKHR( device, pipeline, firstGroup, groupCount, dataSize, pData );\n      }\n\n      void vkCmdTraceRaysIndirectKHR( VkCommandBuffer                         commandBuffer,\n                                      const VkStridedDeviceAddressRegionKHR * pRaygenShaderBindingTable,\n                                      const VkStridedDeviceAddressRegionKHR * pMissShaderBindingTable,\n                                      const VkStridedDeviceAddressRegionKHR * pHitShaderBindingTable,\n                                      const VkStridedDeviceAddressRegionKHR * pCallableShaderBindingTable,\n                                      VkDeviceAddress                         indirectDeviceAddress ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdTraceRaysIndirectKHR(\n          commandBuffer, pRaygenShaderBindingTable, pMissShaderBindingTable, pHitShaderBindingTable, pCallableShaderBindingTable, indirectDeviceAddress );\n      }\n\n      VkDeviceSize vkGetRayTracingShaderGroupStackSizeKHR( VkDevice               device,\n                                                           VkPipeline             pipeline,\n                                                           uint32_t               group,\n                                                           VkShaderGroupShaderKHR groupShader ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetRayTracingShaderGroupStackSizeKHR( device, pipeline, group, groupShader );\n      }\n\n      void vkCmdSetRayTracingPipelineStackSizeKHR( VkCommandBuffer commandBuffer, uint32_t pipelineStackSize ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetRayTracingPipelineStackSizeKHR( commandBuffer, pipelineStackSize );\n      }\n\n      //=== VK_KHR_sampler_ycbcr_conversion ===\n\n      VkResult vkCreateSamplerYcbcrConversionKHR( VkDevice                                   device,\n                                                  const VkSamplerYcbcrConversionCreateInfo * pCreateInfo,\n                                                  const VkAllocationCallbacks *              pAllocator,\n                                                  VkSamplerYcbcrConversion *                 pYcbcrConversion ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateSamplerYcbcrConversionKHR( device, pCreateInfo, pAllocator, pYcbcrConversion );\n      }\n\n      void vkDestroySamplerYcbcrConversionKHR( VkDevice                      device,\n                                               VkSamplerYcbcrConversion      ycbcrConversion,\n                                               const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroySamplerYcbcrConversionKHR( device, ycbcrConversion, pAllocator );\n      }\n\n      //=== VK_KHR_bind_memory2 ===\n\n      VkResult vkBindBufferMemory2KHR( VkDevice device, uint32_t bindInfoCount, const VkBindBufferMemoryInfo * pBindInfos ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkBindBufferMemory2KHR( device, bindInfoCount, pBindInfos );\n      }\n\n      VkResult vkBindImageMemory2KHR( VkDevice device, uint32_t bindInfoCount, const VkBindImageMemoryInfo * pBindInfos ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkBindImageMemory2KHR( device, bindInfoCount, pBindInfos );\n      }\n\n      //=== VK_EXT_image_drm_format_modifier ===\n\n      VkResult vkGetImageDrmFormatModifierPropertiesEXT( VkDevice                                device,\n                                                         VkImage                                 image,\n                                                         VkImageDrmFormatModifierPropertiesEXT * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetImageDrmFormatModifierPropertiesEXT( device, image, pProperties );\n      }\n\n      //=== VK_EXT_validation_cache ===\n\n      VkResult vkCreateValidationCacheEXT( VkDevice                               device,\n                                           const VkValidationCacheCreateInfoEXT * pCreateInfo,\n                                           const VkAllocationCallbacks *          pAllocator,\n                                           VkValidationCacheEXT *                 pValidationCache ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateValidationCacheEXT( device, pCreateInfo, pAllocator, pValidationCache );\n      }\n\n      void\n        vkDestroyValidationCacheEXT( VkDevice device, VkValidationCacheEXT validationCache, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyValidationCacheEXT( device, validationCache, pAllocator );\n      }\n\n      VkResult vkMergeValidationCachesEXT( VkDevice                     device,\n                                           VkValidationCacheEXT         dstCache,\n                                           uint32_t                     srcCacheCount,\n                                           const VkValidationCacheEXT * pSrcCaches ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkMergeValidationCachesEXT( device, dstCache, srcCacheCount, pSrcCaches );\n      }\n\n      VkResult vkGetValidationCacheDataEXT( VkDevice device, VkValidationCacheEXT validationCache, size_t * pDataSize, void * pData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetValidationCacheDataEXT( device, validationCache, pDataSize, pData );\n      }\n\n      //=== VK_NV_shading_rate_image ===\n\n      void vkCmdBindShadingRateImageNV( VkCommandBuffer commandBuffer, VkImageView imageView, VkImageLayout imageLayout ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBindShadingRateImageNV( commandBuffer, imageView, imageLayout );\n      }\n\n      void vkCmdSetViewportShadingRatePaletteNV( VkCommandBuffer                commandBuffer,\n                                                 uint32_t                       firstViewport,\n                                                 uint32_t                       viewportCount,\n                                                 const VkShadingRatePaletteNV * pShadingRatePalettes ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetViewportShadingRatePaletteNV( commandBuffer, firstViewport, viewportCount, pShadingRatePalettes );\n      }\n\n      void vkCmdSetCoarseSampleOrderNV( VkCommandBuffer                     commandBuffer,\n                                        VkCoarseSampleOrderTypeNV           sampleOrderType,\n                                        uint32_t                            customSampleOrderCount,\n                                        const VkCoarseSampleOrderCustomNV * pCustomSampleOrders ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetCoarseSampleOrderNV( commandBuffer, sampleOrderType, customSampleOrderCount, pCustomSampleOrders );\n      }\n\n      //=== VK_NV_ray_tracing ===\n\n      VkResult vkCreateAccelerationStructureNV( VkDevice                                    device,\n                                                const VkAccelerationStructureCreateInfoNV * pCreateInfo,\n                                                const VkAllocationCallbacks *               pAllocator,\n                                                VkAccelerationStructureNV *                 pAccelerationStructure ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateAccelerationStructureNV( device, pCreateInfo, pAllocator, pAccelerationStructure );\n      }\n\n      void vkDestroyAccelerationStructureNV( VkDevice                      device,\n                                             VkAccelerationStructureNV     accelerationStructure,\n                                             const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyAccelerationStructureNV( device, accelerationStructure, pAllocator );\n      }\n\n      void vkGetAccelerationStructureMemoryRequirementsNV( VkDevice                                                device,\n                                                           const VkAccelerationStructureMemoryRequirementsInfoNV * pInfo,\n                                                           VkMemoryRequirements2KHR * pMemoryRequirements ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetAccelerationStructureMemoryRequirementsNV( device, pInfo, pMemoryRequirements );\n      }\n\n      VkResult vkBindAccelerationStructureMemoryNV( VkDevice                                        device,\n                                                    uint32_t                                        bindInfoCount,\n                                                    const VkBindAccelerationStructureMemoryInfoNV * pBindInfos ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkBindAccelerationStructureMemoryNV( device, bindInfoCount, pBindInfos );\n      }\n\n      void vkCmdBuildAccelerationStructureNV( VkCommandBuffer                       commandBuffer,\n                                              const VkAccelerationStructureInfoNV * pInfo,\n                                              VkBuffer                              instanceData,\n                                              VkDeviceSize                          instanceOffset,\n                                              VkBool32                              update,\n                                              VkAccelerationStructureNV             dst,\n                                              VkAccelerationStructureNV             src,\n                                              VkBuffer                              scratch,\n                                              VkDeviceSize                          scratchOffset ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBuildAccelerationStructureNV( commandBuffer, pInfo, instanceData, instanceOffset, update, dst, src, scratch, scratchOffset );\n      }\n\n      void vkCmdCopyAccelerationStructureNV( VkCommandBuffer                    commandBuffer,\n                                             VkAccelerationStructureNV          dst,\n                                             VkAccelerationStructureNV          src,\n                                             VkCopyAccelerationStructureModeKHR mode ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCopyAccelerationStructureNV( commandBuffer, dst, src, mode );\n      }\n\n      void vkCmdTraceRaysNV( VkCommandBuffer commandBuffer,\n                             VkBuffer        raygenShaderBindingTableBuffer,\n                             VkDeviceSize    raygenShaderBindingOffset,\n                             VkBuffer        missShaderBindingTableBuffer,\n                             VkDeviceSize    missShaderBindingOffset,\n                             VkDeviceSize    missShaderBindingStride,\n                             VkBuffer        hitShaderBindingTableBuffer,\n                             VkDeviceSize    hitShaderBindingOffset,\n                             VkDeviceSize    hitShaderBindingStride,\n                             VkBuffer        callableShaderBindingTableBuffer,\n                             VkDeviceSize    callableShaderBindingOffset,\n                             VkDeviceSize    callableShaderBindingStride,\n                             uint32_t        width,\n                             uint32_t        height,\n                             uint32_t        depth ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdTraceRaysNV( commandBuffer,\n                                   raygenShaderBindingTableBuffer,\n                                   raygenShaderBindingOffset,\n                                   missShaderBindingTableBuffer,\n                                   missShaderBindingOffset,\n                                   missShaderBindingStride,\n                                   hitShaderBindingTableBuffer,\n                                   hitShaderBindingOffset,\n                                   hitShaderBindingStride,\n                                   callableShaderBindingTableBuffer,\n                                   callableShaderBindingOffset,\n                                   callableShaderBindingStride,\n                                   width,\n                                   height,\n                                   depth );\n      }\n\n      VkResult vkCreateRayTracingPipelinesNV( VkDevice                                 device,\n                                              VkPipelineCache                          pipelineCache,\n                                              uint32_t                                 createInfoCount,\n                                              const VkRayTracingPipelineCreateInfoNV * pCreateInfos,\n                                              const VkAllocationCallbacks *            pAllocator,\n                                              VkPipeline *                             pPipelines ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateRayTracingPipelinesNV( device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines );\n      }\n\n      VkResult vkGetRayTracingShaderGroupHandlesNV(\n        VkDevice device, VkPipeline pipeline, uint32_t firstGroup, uint32_t groupCount, size_t dataSize, void * pData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetRayTracingShaderGroupHandlesNV( device, pipeline, firstGroup, groupCount, dataSize, pData );\n      }\n\n      VkResult vkGetAccelerationStructureHandleNV( VkDevice                  device,\n                                                   VkAccelerationStructureNV accelerationStructure,\n                                                   size_t                    dataSize,\n                                                   void *                    pData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetAccelerationStructureHandleNV( device, accelerationStructure, dataSize, pData );\n      }\n\n      void vkCmdWriteAccelerationStructuresPropertiesNV( VkCommandBuffer                   commandBuffer,\n                                                         uint32_t                          accelerationStructureCount,\n                                                         const VkAccelerationStructureNV * pAccelerationStructures,\n                                                         VkQueryType                       queryType,\n                                                         VkQueryPool                       queryPool,\n                                                         uint32_t                          firstQuery ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdWriteAccelerationStructuresPropertiesNV(\n          commandBuffer, accelerationStructureCount, pAccelerationStructures, queryType, queryPool, firstQuery );\n      }\n\n      VkResult vkCompileDeferredNV( VkDevice device, VkPipeline pipeline, uint32_t shader ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCompileDeferredNV( device, pipeline, shader );\n      }\n\n      //=== VK_KHR_maintenance3 ===\n\n      void vkGetDescriptorSetLayoutSupportKHR( VkDevice                                device,\n                                               const VkDescriptorSetLayoutCreateInfo * pCreateInfo,\n                                               VkDescriptorSetLayoutSupport *          pSupport ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDescriptorSetLayoutSupportKHR( device, pCreateInfo, pSupport );\n      }\n\n      //=== VK_KHR_draw_indirect_count ===\n\n      void vkCmdDrawIndirectCountKHR( VkCommandBuffer commandBuffer,\n                                      VkBuffer        buffer,\n                                      VkDeviceSize    offset,\n                                      VkBuffer        countBuffer,\n                                      VkDeviceSize    countBufferOffset,\n                                      uint32_t        maxDrawCount,\n                                      uint32_t        stride ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDrawIndirectCountKHR( commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride );\n      }\n\n      void vkCmdDrawIndexedIndirectCountKHR( VkCommandBuffer commandBuffer,\n                                             VkBuffer        buffer,\n                                             VkDeviceSize    offset,\n                                             VkBuffer        countBuffer,\n                                             VkDeviceSize    countBufferOffset,\n                                             uint32_t        maxDrawCount,\n                                             uint32_t        stride ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDrawIndexedIndirectCountKHR( commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride );\n      }\n\n      //=== VK_EXT_external_memory_host ===\n\n      VkResult vkGetMemoryHostPointerPropertiesEXT( VkDevice                           device,\n                                                    VkExternalMemoryHandleTypeFlagBits handleType,\n                                                    const void *                       pHostPointer,\n                                                    VkMemoryHostPointerPropertiesEXT * pMemoryHostPointerProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetMemoryHostPointerPropertiesEXT( device, handleType, pHostPointer, pMemoryHostPointerProperties );\n      }\n\n      //=== VK_AMD_buffer_marker ===\n\n      void vkCmdWriteBufferMarkerAMD( VkCommandBuffer         commandBuffer,\n                                      VkPipelineStageFlagBits pipelineStage,\n                                      VkBuffer                dstBuffer,\n                                      VkDeviceSize            dstOffset,\n                                      uint32_t                marker ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdWriteBufferMarkerAMD( commandBuffer, pipelineStage, dstBuffer, dstOffset, marker );\n      }\n\n      void vkCmdWriteBufferMarker2AMD(\n        VkCommandBuffer commandBuffer, VkPipelineStageFlags2 stage, VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdWriteBufferMarker2AMD( commandBuffer, stage, dstBuffer, dstOffset, marker );\n      }\n\n      //=== VK_EXT_calibrated_timestamps ===\n\n      VkResult vkGetPhysicalDeviceCalibrateableTimeDomainsEXT( VkPhysicalDevice  physicalDevice,\n                                                               uint32_t *        pTimeDomainCount,\n                                                               VkTimeDomainKHR * pTimeDomains ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceCalibrateableTimeDomainsEXT( physicalDevice, pTimeDomainCount, pTimeDomains );\n      }\n\n      VkResult vkGetCalibratedTimestampsEXT( VkDevice                             device,\n                                             uint32_t                             timestampCount,\n                                             const VkCalibratedTimestampInfoKHR * pTimestampInfos,\n                                             uint64_t *                           pTimestamps,\n                                             uint64_t *                           pMaxDeviation ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetCalibratedTimestampsEXT( device, timestampCount, pTimestampInfos, pTimestamps, pMaxDeviation );\n      }\n\n      //=== VK_NV_mesh_shader ===\n\n      void vkCmdDrawMeshTasksNV( VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDrawMeshTasksNV( commandBuffer, taskCount, firstTask );\n      }\n\n      void vkCmdDrawMeshTasksIndirectNV( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride ) const\n        VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDrawMeshTasksIndirectNV( commandBuffer, buffer, offset, drawCount, stride );\n      }\n\n      void vkCmdDrawMeshTasksIndirectCountNV( VkCommandBuffer commandBuffer,\n                                              VkBuffer        buffer,\n                                              VkDeviceSize    offset,\n                                              VkBuffer        countBuffer,\n                                              VkDeviceSize    countBufferOffset,\n                                              uint32_t        maxDrawCount,\n                                              uint32_t        stride ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDrawMeshTasksIndirectCountNV( commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride );\n      }\n\n      //=== VK_NV_scissor_exclusive ===\n\n      void vkCmdSetExclusiveScissorEnableNV( VkCommandBuffer  commandBuffer,\n                                             uint32_t         firstExclusiveScissor,\n                                             uint32_t         exclusiveScissorCount,\n                                             const VkBool32 * pExclusiveScissorEnables ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetExclusiveScissorEnableNV( commandBuffer, firstExclusiveScissor, exclusiveScissorCount, pExclusiveScissorEnables );\n      }\n\n      void vkCmdSetExclusiveScissorNV( VkCommandBuffer  commandBuffer,\n                                       uint32_t         firstExclusiveScissor,\n                                       uint32_t         exclusiveScissorCount,\n                                       const VkRect2D * pExclusiveScissors ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetExclusiveScissorNV( commandBuffer, firstExclusiveScissor, exclusiveScissorCount, pExclusiveScissors );\n      }\n\n      //=== VK_NV_device_diagnostic_checkpoints ===\n\n      void vkCmdSetCheckpointNV( VkCommandBuffer commandBuffer, const void * pCheckpointMarker ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetCheckpointNV( commandBuffer, pCheckpointMarker );\n      }\n\n      void vkGetQueueCheckpointDataNV( VkQueue queue, uint32_t * pCheckpointDataCount, VkCheckpointDataNV * pCheckpointData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetQueueCheckpointDataNV( queue, pCheckpointDataCount, pCheckpointData );\n      }\n\n      void vkGetQueueCheckpointData2NV( VkQueue queue, uint32_t * pCheckpointDataCount, VkCheckpointData2NV * pCheckpointData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetQueueCheckpointData2NV( queue, pCheckpointDataCount, pCheckpointData );\n      }\n\n      //=== VK_KHR_timeline_semaphore ===\n\n      VkResult vkGetSemaphoreCounterValueKHR( VkDevice device, VkSemaphore semaphore, uint64_t * pValue ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetSemaphoreCounterValueKHR( device, semaphore, pValue );\n      }\n\n      VkResult vkWaitSemaphoresKHR( VkDevice device, const VkSemaphoreWaitInfo * pWaitInfo, uint64_t timeout ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkWaitSemaphoresKHR( device, pWaitInfo, timeout );\n      }\n\n      VkResult vkSignalSemaphoreKHR( VkDevice device, const VkSemaphoreSignalInfo * pSignalInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkSignalSemaphoreKHR( device, pSignalInfo );\n      }\n\n      //=== VK_INTEL_performance_query ===\n\n      VkResult vkInitializePerformanceApiINTEL( VkDevice device, const VkInitializePerformanceApiInfoINTEL * pInitializeInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkInitializePerformanceApiINTEL( device, pInitializeInfo );\n      }\n\n      void vkUninitializePerformanceApiINTEL( VkDevice device ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkUninitializePerformanceApiINTEL( device );\n      }\n\n      VkResult vkCmdSetPerformanceMarkerINTEL( VkCommandBuffer commandBuffer, const VkPerformanceMarkerInfoINTEL * pMarkerInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetPerformanceMarkerINTEL( commandBuffer, pMarkerInfo );\n      }\n\n      VkResult vkCmdSetPerformanceStreamMarkerINTEL( VkCommandBuffer                            commandBuffer,\n                                                     const VkPerformanceStreamMarkerInfoINTEL * pMarkerInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetPerformanceStreamMarkerINTEL( commandBuffer, pMarkerInfo );\n      }\n\n      VkResult vkCmdSetPerformanceOverrideINTEL( VkCommandBuffer commandBuffer, const VkPerformanceOverrideInfoINTEL * pOverrideInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetPerformanceOverrideINTEL( commandBuffer, pOverrideInfo );\n      }\n\n      VkResult vkAcquirePerformanceConfigurationINTEL( VkDevice                                           device,\n                                                       const VkPerformanceConfigurationAcquireInfoINTEL * pAcquireInfo,\n                                                       VkPerformanceConfigurationINTEL *                  pConfiguration ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkAcquirePerformanceConfigurationINTEL( device, pAcquireInfo, pConfiguration );\n      }\n\n      VkResult vkReleasePerformanceConfigurationINTEL( VkDevice device, VkPerformanceConfigurationINTEL configuration ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkReleasePerformanceConfigurationINTEL( device, configuration );\n      }\n\n      VkResult vkQueueSetPerformanceConfigurationINTEL( VkQueue queue, VkPerformanceConfigurationINTEL configuration ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkQueueSetPerformanceConfigurationINTEL( queue, configuration );\n      }\n\n      VkResult\n        vkGetPerformanceParameterINTEL( VkDevice device, VkPerformanceParameterTypeINTEL parameter, VkPerformanceValueINTEL * pValue ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPerformanceParameterINTEL( device, parameter, pValue );\n      }\n\n      //=== VK_AMD_display_native_hdr ===\n\n      void vkSetLocalDimmingAMD( VkDevice device, VkSwapchainKHR swapChain, VkBool32 localDimmingEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkSetLocalDimmingAMD( device, swapChain, localDimmingEnable );\n      }\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n      //=== VK_FUCHSIA_imagepipe_surface ===\n\n      VkResult vkCreateImagePipeSurfaceFUCHSIA( VkInstance                                  instance,\n                                                const VkImagePipeSurfaceCreateInfoFUCHSIA * pCreateInfo,\n                                                const VkAllocationCallbacks *               pAllocator,\n                                                VkSurfaceKHR *                              pSurface ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateImagePipeSurfaceFUCHSIA( instance, pCreateInfo, pAllocator, pSurface );\n      }\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n      //=== VK_EXT_metal_surface ===\n\n      VkResult vkCreateMetalSurfaceEXT( VkInstance                          instance,\n                                        const VkMetalSurfaceCreateInfoEXT * pCreateInfo,\n                                        const VkAllocationCallbacks *       pAllocator,\n                                        VkSurfaceKHR *                      pSurface ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateMetalSurfaceEXT( instance, pCreateInfo, pAllocator, pSurface );\n      }\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n      //=== VK_KHR_fragment_shading_rate ===\n\n      VkResult vkGetPhysicalDeviceFragmentShadingRatesKHR( VkPhysicalDevice                         physicalDevice,\n                                                           uint32_t *                               pFragmentShadingRateCount,\n                                                           VkPhysicalDeviceFragmentShadingRateKHR * pFragmentShadingRates ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceFragmentShadingRatesKHR( physicalDevice, pFragmentShadingRateCount, pFragmentShadingRates );\n      }\n\n      void vkCmdSetFragmentShadingRateKHR( VkCommandBuffer                          commandBuffer,\n                                           const VkExtent2D *                       pFragmentSize,\n                                           const VkFragmentShadingRateCombinerOpKHR combinerOps[2] ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetFragmentShadingRateKHR( commandBuffer, pFragmentSize, combinerOps );\n      }\n\n      //=== VK_KHR_dynamic_rendering_local_read ===\n\n      void vkCmdSetRenderingAttachmentLocationsKHR( VkCommandBuffer                           commandBuffer,\n                                                    const VkRenderingAttachmentLocationInfo * pLocationInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetRenderingAttachmentLocationsKHR( commandBuffer, pLocationInfo );\n      }\n\n      void vkCmdSetRenderingInputAttachmentIndicesKHR( VkCommandBuffer                             commandBuffer,\n                                                       const VkRenderingInputAttachmentIndexInfo * pInputAttachmentIndexInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetRenderingInputAttachmentIndicesKHR( commandBuffer, pInputAttachmentIndexInfo );\n      }\n\n      //=== VK_EXT_buffer_device_address ===\n\n      VkDeviceAddress vkGetBufferDeviceAddressEXT( VkDevice device, const VkBufferDeviceAddressInfo * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetBufferDeviceAddressEXT( device, pInfo );\n      }\n\n      //=== VK_EXT_tooling_info ===\n\n      VkResult vkGetPhysicalDeviceToolPropertiesEXT( VkPhysicalDevice                 physicalDevice,\n                                                     uint32_t *                       pToolCount,\n                                                     VkPhysicalDeviceToolProperties * pToolProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceToolPropertiesEXT( physicalDevice, pToolCount, pToolProperties );\n      }\n\n      //=== VK_KHR_present_wait ===\n\n      VkResult vkWaitForPresentKHR( VkDevice device, VkSwapchainKHR swapchain, uint64_t presentId, uint64_t timeout ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkWaitForPresentKHR( device, swapchain, presentId, timeout );\n      }\n\n      //=== VK_NV_cooperative_matrix ===\n\n      VkResult vkGetPhysicalDeviceCooperativeMatrixPropertiesNV( VkPhysicalDevice                  physicalDevice,\n                                                                 uint32_t *                        pPropertyCount,\n                                                                 VkCooperativeMatrixPropertiesNV * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceCooperativeMatrixPropertiesNV( physicalDevice, pPropertyCount, pProperties );\n      }\n\n      //=== VK_NV_coverage_reduction_mode ===\n\n      VkResult vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(\n        VkPhysicalDevice physicalDevice, uint32_t * pCombinationCount, VkFramebufferMixedSamplesCombinationNV * pCombinations ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV( physicalDevice, pCombinationCount, pCombinations );\n      }\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_EXT_full_screen_exclusive ===\n\n      VkResult vkGetPhysicalDeviceSurfacePresentModes2EXT( VkPhysicalDevice                        physicalDevice,\n                                                           const VkPhysicalDeviceSurfaceInfo2KHR * pSurfaceInfo,\n                                                           uint32_t *                              pPresentModeCount,\n                                                           VkPresentModeKHR *                      pPresentModes ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceSurfacePresentModes2EXT( physicalDevice, pSurfaceInfo, pPresentModeCount, pPresentModes );\n      }\n\n      VkResult vkAcquireFullScreenExclusiveModeEXT( VkDevice device, VkSwapchainKHR swapchain ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkAcquireFullScreenExclusiveModeEXT( device, swapchain );\n      }\n\n      VkResult vkReleaseFullScreenExclusiveModeEXT( VkDevice device, VkSwapchainKHR swapchain ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkReleaseFullScreenExclusiveModeEXT( device, swapchain );\n      }\n\n      VkResult vkGetDeviceGroupSurfacePresentModes2EXT( VkDevice                                device,\n                                                        const VkPhysicalDeviceSurfaceInfo2KHR * pSurfaceInfo,\n                                                        VkDeviceGroupPresentModeFlagsKHR *      pModes ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeviceGroupSurfacePresentModes2EXT( device, pSurfaceInfo, pModes );\n      }\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n      //=== VK_EXT_headless_surface ===\n\n      VkResult vkCreateHeadlessSurfaceEXT( VkInstance                             instance,\n                                           const VkHeadlessSurfaceCreateInfoEXT * pCreateInfo,\n                                           const VkAllocationCallbacks *          pAllocator,\n                                           VkSurfaceKHR *                         pSurface ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateHeadlessSurfaceEXT( instance, pCreateInfo, pAllocator, pSurface );\n      }\n\n      //=== VK_KHR_buffer_device_address ===\n\n      VkDeviceAddress vkGetBufferDeviceAddressKHR( VkDevice device, const VkBufferDeviceAddressInfo * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetBufferDeviceAddressKHR( device, pInfo );\n      }\n\n      uint64_t vkGetBufferOpaqueCaptureAddressKHR( VkDevice device, const VkBufferDeviceAddressInfo * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetBufferOpaqueCaptureAddressKHR( device, pInfo );\n      }\n\n      uint64_t vkGetDeviceMemoryOpaqueCaptureAddressKHR( VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeviceMemoryOpaqueCaptureAddressKHR( device, pInfo );\n      }\n\n      //=== VK_EXT_line_rasterization ===\n\n      void vkCmdSetLineStippleEXT( VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, uint16_t lineStipplePattern ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetLineStippleEXT( commandBuffer, lineStippleFactor, lineStipplePattern );\n      }\n\n      //=== VK_EXT_host_query_reset ===\n\n      void vkResetQueryPoolEXT( VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkResetQueryPoolEXT( device, queryPool, firstQuery, queryCount );\n      }\n\n      //=== VK_EXT_extended_dynamic_state ===\n\n      void vkCmdSetCullModeEXT( VkCommandBuffer commandBuffer, VkCullModeFlags cullMode ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetCullModeEXT( commandBuffer, cullMode );\n      }\n\n      void vkCmdSetFrontFaceEXT( VkCommandBuffer commandBuffer, VkFrontFace frontFace ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetFrontFaceEXT( commandBuffer, frontFace );\n      }\n\n      void vkCmdSetPrimitiveTopologyEXT( VkCommandBuffer commandBuffer, VkPrimitiveTopology primitiveTopology ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetPrimitiveTopologyEXT( commandBuffer, primitiveTopology );\n      }\n\n      void vkCmdSetViewportWithCountEXT( VkCommandBuffer commandBuffer, uint32_t viewportCount, const VkViewport * pViewports ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetViewportWithCountEXT( commandBuffer, viewportCount, pViewports );\n      }\n\n      void vkCmdSetScissorWithCountEXT( VkCommandBuffer commandBuffer, uint32_t scissorCount, const VkRect2D * pScissors ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetScissorWithCountEXT( commandBuffer, scissorCount, pScissors );\n      }\n\n      void vkCmdBindVertexBuffers2EXT( VkCommandBuffer      commandBuffer,\n                                       uint32_t             firstBinding,\n                                       uint32_t             bindingCount,\n                                       const VkBuffer *     pBuffers,\n                                       const VkDeviceSize * pOffsets,\n                                       const VkDeviceSize * pSizes,\n                                       const VkDeviceSize * pStrides ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBindVertexBuffers2EXT( commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes, pStrides );\n      }\n\n      void vkCmdSetDepthTestEnableEXT( VkCommandBuffer commandBuffer, VkBool32 depthTestEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDepthTestEnableEXT( commandBuffer, depthTestEnable );\n      }\n\n      void vkCmdSetDepthWriteEnableEXT( VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDepthWriteEnableEXT( commandBuffer, depthWriteEnable );\n      }\n\n      void vkCmdSetDepthCompareOpEXT( VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDepthCompareOpEXT( commandBuffer, depthCompareOp );\n      }\n\n      void vkCmdSetDepthBoundsTestEnableEXT( VkCommandBuffer commandBuffer, VkBool32 depthBoundsTestEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDepthBoundsTestEnableEXT( commandBuffer, depthBoundsTestEnable );\n      }\n\n      void vkCmdSetStencilTestEnableEXT( VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetStencilTestEnableEXT( commandBuffer, stencilTestEnable );\n      }\n\n      void vkCmdSetStencilOpEXT( VkCommandBuffer    commandBuffer,\n                                 VkStencilFaceFlags faceMask,\n                                 VkStencilOp        failOp,\n                                 VkStencilOp        passOp,\n                                 VkStencilOp        depthFailOp,\n                                 VkCompareOp        compareOp ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetStencilOpEXT( commandBuffer, faceMask, failOp, passOp, depthFailOp, compareOp );\n      }\n\n      //=== VK_KHR_deferred_host_operations ===\n\n      VkResult vkCreateDeferredOperationKHR( VkDevice                      device,\n                                             const VkAllocationCallbacks * pAllocator,\n                                             VkDeferredOperationKHR *      pDeferredOperation ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateDeferredOperationKHR( device, pAllocator, pDeferredOperation );\n      }\n\n      void\n        vkDestroyDeferredOperationKHR( VkDevice device, VkDeferredOperationKHR operation, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyDeferredOperationKHR( device, operation, pAllocator );\n      }\n\n      uint32_t vkGetDeferredOperationMaxConcurrencyKHR( VkDevice device, VkDeferredOperationKHR operation ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeferredOperationMaxConcurrencyKHR( device, operation );\n      }\n\n      VkResult vkGetDeferredOperationResultKHR( VkDevice device, VkDeferredOperationKHR operation ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeferredOperationResultKHR( device, operation );\n      }\n\n      VkResult vkDeferredOperationJoinKHR( VkDevice device, VkDeferredOperationKHR operation ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDeferredOperationJoinKHR( device, operation );\n      }\n\n      //=== VK_KHR_pipeline_executable_properties ===\n\n      VkResult vkGetPipelineExecutablePropertiesKHR( VkDevice                            device,\n                                                     const VkPipelineInfoKHR *           pPipelineInfo,\n                                                     uint32_t *                          pExecutableCount,\n                                                     VkPipelineExecutablePropertiesKHR * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPipelineExecutablePropertiesKHR( device, pPipelineInfo, pExecutableCount, pProperties );\n      }\n\n      VkResult vkGetPipelineExecutableStatisticsKHR( VkDevice                            device,\n                                                     const VkPipelineExecutableInfoKHR * pExecutableInfo,\n                                                     uint32_t *                          pStatisticCount,\n                                                     VkPipelineExecutableStatisticKHR *  pStatistics ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPipelineExecutableStatisticsKHR( device, pExecutableInfo, pStatisticCount, pStatistics );\n      }\n\n      VkResult\n        vkGetPipelineExecutableInternalRepresentationsKHR( VkDevice                                        device,\n                                                           const VkPipelineExecutableInfoKHR *             pExecutableInfo,\n                                                           uint32_t *                                      pInternalRepresentationCount,\n                                                           VkPipelineExecutableInternalRepresentationKHR * pInternalRepresentations ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPipelineExecutableInternalRepresentationsKHR( device, pExecutableInfo, pInternalRepresentationCount, pInternalRepresentations );\n      }\n\n      //=== VK_EXT_host_image_copy ===\n\n      VkResult vkCopyMemoryToImageEXT( VkDevice device, const VkCopyMemoryToImageInfo * pCopyMemoryToImageInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCopyMemoryToImageEXT( device, pCopyMemoryToImageInfo );\n      }\n\n      VkResult vkCopyImageToMemoryEXT( VkDevice device, const VkCopyImageToMemoryInfo * pCopyImageToMemoryInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCopyImageToMemoryEXT( device, pCopyImageToMemoryInfo );\n      }\n\n      VkResult vkCopyImageToImageEXT( VkDevice device, const VkCopyImageToImageInfo * pCopyImageToImageInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCopyImageToImageEXT( device, pCopyImageToImageInfo );\n      }\n\n      VkResult\n        vkTransitionImageLayoutEXT( VkDevice device, uint32_t transitionCount, const VkHostImageLayoutTransitionInfo * pTransitions ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkTransitionImageLayoutEXT( device, transitionCount, pTransitions );\n      }\n\n      void vkGetImageSubresourceLayout2EXT( VkDevice                    device,\n                                            VkImage                     image,\n                                            const VkImageSubresource2 * pSubresource,\n                                            VkSubresourceLayout2 *      pLayout ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetImageSubresourceLayout2EXT( device, image, pSubresource, pLayout );\n      }\n\n      //=== VK_KHR_map_memory2 ===\n\n      VkResult vkMapMemory2KHR( VkDevice device, const VkMemoryMapInfo * pMemoryMapInfo, void ** ppData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkMapMemory2KHR( device, pMemoryMapInfo, ppData );\n      }\n\n      VkResult vkUnmapMemory2KHR( VkDevice device, const VkMemoryUnmapInfo * pMemoryUnmapInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkUnmapMemory2KHR( device, pMemoryUnmapInfo );\n      }\n\n      //=== VK_EXT_swapchain_maintenance1 ===\n\n      VkResult vkReleaseSwapchainImagesEXT( VkDevice device, const VkReleaseSwapchainImagesInfoEXT * pReleaseInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkReleaseSwapchainImagesEXT( device, pReleaseInfo );\n      }\n\n      //=== VK_NV_device_generated_commands ===\n\n      void vkGetGeneratedCommandsMemoryRequirementsNV( VkDevice                                            device,\n                                                       const VkGeneratedCommandsMemoryRequirementsInfoNV * pInfo,\n                                                       VkMemoryRequirements2 *                             pMemoryRequirements ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetGeneratedCommandsMemoryRequirementsNV( device, pInfo, pMemoryRequirements );\n      }\n\n      void vkCmdPreprocessGeneratedCommandsNV( VkCommandBuffer                   commandBuffer,\n                                               const VkGeneratedCommandsInfoNV * pGeneratedCommandsInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdPreprocessGeneratedCommandsNV( commandBuffer, pGeneratedCommandsInfo );\n      }\n\n      void vkCmdExecuteGeneratedCommandsNV( VkCommandBuffer                   commandBuffer,\n                                            VkBool32                          isPreprocessed,\n                                            const VkGeneratedCommandsInfoNV * pGeneratedCommandsInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdExecuteGeneratedCommandsNV( commandBuffer, isPreprocessed, pGeneratedCommandsInfo );\n      }\n\n      void vkCmdBindPipelineShaderGroupNV( VkCommandBuffer     commandBuffer,\n                                           VkPipelineBindPoint pipelineBindPoint,\n                                           VkPipeline          pipeline,\n                                           uint32_t            groupIndex ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBindPipelineShaderGroupNV( commandBuffer, pipelineBindPoint, pipeline, groupIndex );\n      }\n\n      VkResult vkCreateIndirectCommandsLayoutNV( VkDevice                                     device,\n                                                 const VkIndirectCommandsLayoutCreateInfoNV * pCreateInfo,\n                                                 const VkAllocationCallbacks *                pAllocator,\n                                                 VkIndirectCommandsLayoutNV *                 pIndirectCommandsLayout ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateIndirectCommandsLayoutNV( device, pCreateInfo, pAllocator, pIndirectCommandsLayout );\n      }\n\n      void vkDestroyIndirectCommandsLayoutNV( VkDevice                      device,\n                                              VkIndirectCommandsLayoutNV    indirectCommandsLayout,\n                                              const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyIndirectCommandsLayoutNV( device, indirectCommandsLayout, pAllocator );\n      }\n\n      //=== VK_EXT_depth_bias_control ===\n\n      void vkCmdSetDepthBias2EXT( VkCommandBuffer commandBuffer, const VkDepthBiasInfoEXT * pDepthBiasInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDepthBias2EXT( commandBuffer, pDepthBiasInfo );\n      }\n\n      //=== VK_EXT_acquire_drm_display ===\n\n      VkResult vkAcquireDrmDisplayEXT( VkPhysicalDevice physicalDevice, int32_t drmFd, VkDisplayKHR display ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkAcquireDrmDisplayEXT( physicalDevice, drmFd, display );\n      }\n\n      VkResult vkGetDrmDisplayEXT( VkPhysicalDevice physicalDevice, int32_t drmFd, uint32_t connectorId, VkDisplayKHR * display ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDrmDisplayEXT( physicalDevice, drmFd, connectorId, display );\n      }\n\n      //=== VK_EXT_private_data ===\n\n      VkResult vkCreatePrivateDataSlotEXT( VkDevice                            device,\n                                           const VkPrivateDataSlotCreateInfo * pCreateInfo,\n                                           const VkAllocationCallbacks *       pAllocator,\n                                           VkPrivateDataSlot *                 pPrivateDataSlot ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreatePrivateDataSlotEXT( device, pCreateInfo, pAllocator, pPrivateDataSlot );\n      }\n\n      void vkDestroyPrivateDataSlotEXT( VkDevice device, VkPrivateDataSlot privateDataSlot, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyPrivateDataSlotEXT( device, privateDataSlot, pAllocator );\n      }\n\n      VkResult vkSetPrivateDataEXT( VkDevice device, VkObjectType objectType, uint64_t objectHandle, VkPrivateDataSlot privateDataSlot, uint64_t data ) const\n        VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkSetPrivateDataEXT( device, objectType, objectHandle, privateDataSlot, data );\n      }\n\n      void vkGetPrivateDataEXT( VkDevice device, VkObjectType objectType, uint64_t objectHandle, VkPrivateDataSlot privateDataSlot, uint64_t * pData ) const\n        VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPrivateDataEXT( device, objectType, objectHandle, privateDataSlot, pData );\n      }\n\n      //=== VK_KHR_video_encode_queue ===\n\n      VkResult\n        vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR( VkPhysicalDevice                                       physicalDevice,\n                                                                 const VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR * pQualityLevelInfo,\n                                                                 VkVideoEncodeQualityLevelPropertiesKHR * pQualityLevelProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR( physicalDevice, pQualityLevelInfo, pQualityLevelProperties );\n      }\n\n      VkResult vkGetEncodedVideoSessionParametersKHR( VkDevice                                         device,\n                                                      const VkVideoEncodeSessionParametersGetInfoKHR * pVideoSessionParametersInfo,\n                                                      VkVideoEncodeSessionParametersFeedbackInfoKHR *  pFeedbackInfo,\n                                                      size_t *                                         pDataSize,\n                                                      void *                                           pData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetEncodedVideoSessionParametersKHR( device, pVideoSessionParametersInfo, pFeedbackInfo, pDataSize, pData );\n      }\n\n      void vkCmdEncodeVideoKHR( VkCommandBuffer commandBuffer, const VkVideoEncodeInfoKHR * pEncodeInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdEncodeVideoKHR( commandBuffer, pEncodeInfo );\n      }\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n      //=== VK_NV_cuda_kernel_launch ===\n\n      VkResult vkCreateCudaModuleNV( VkDevice                         device,\n                                     const VkCudaModuleCreateInfoNV * pCreateInfo,\n                                     const VkAllocationCallbacks *    pAllocator,\n                                     VkCudaModuleNV *                 pModule ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateCudaModuleNV( device, pCreateInfo, pAllocator, pModule );\n      }\n\n      VkResult vkGetCudaModuleCacheNV( VkDevice device, VkCudaModuleNV module, size_t * pCacheSize, void * pCacheData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetCudaModuleCacheNV( device, module, pCacheSize, pCacheData );\n      }\n\n      VkResult vkCreateCudaFunctionNV( VkDevice                           device,\n                                       const VkCudaFunctionCreateInfoNV * pCreateInfo,\n                                       const VkAllocationCallbacks *      pAllocator,\n                                       VkCudaFunctionNV *                 pFunction ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateCudaFunctionNV( device, pCreateInfo, pAllocator, pFunction );\n      }\n\n      void vkDestroyCudaModuleNV( VkDevice device, VkCudaModuleNV module, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyCudaModuleNV( device, module, pAllocator );\n      }\n\n      void vkDestroyCudaFunctionNV( VkDevice device, VkCudaFunctionNV function, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyCudaFunctionNV( device, function, pAllocator );\n      }\n\n      void vkCmdCudaLaunchKernelNV( VkCommandBuffer commandBuffer, const VkCudaLaunchInfoNV * pLaunchInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCudaLaunchKernelNV( commandBuffer, pLaunchInfo );\n      }\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n      //=== VK_EXT_metal_objects ===\n\n      void vkExportMetalObjectsEXT( VkDevice device, VkExportMetalObjectsInfoEXT * pMetalObjectsInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkExportMetalObjectsEXT( device, pMetalObjectsInfo );\n      }\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n      //=== VK_KHR_synchronization2 ===\n\n      void vkCmdSetEvent2KHR( VkCommandBuffer commandBuffer, VkEvent event, const VkDependencyInfo * pDependencyInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetEvent2KHR( commandBuffer, event, pDependencyInfo );\n      }\n\n      void vkCmdResetEvent2KHR( VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2 stageMask ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdResetEvent2KHR( commandBuffer, event, stageMask );\n      }\n\n      void vkCmdWaitEvents2KHR( VkCommandBuffer          commandBuffer,\n                                uint32_t                 eventCount,\n                                const VkEvent *          pEvents,\n                                const VkDependencyInfo * pDependencyInfos ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdWaitEvents2KHR( commandBuffer, eventCount, pEvents, pDependencyInfos );\n      }\n\n      void vkCmdPipelineBarrier2KHR( VkCommandBuffer commandBuffer, const VkDependencyInfo * pDependencyInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdPipelineBarrier2KHR( commandBuffer, pDependencyInfo );\n      }\n\n      void\n        vkCmdWriteTimestamp2KHR( VkCommandBuffer commandBuffer, VkPipelineStageFlags2 stage, VkQueryPool queryPool, uint32_t query ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdWriteTimestamp2KHR( commandBuffer, stage, queryPool, query );\n      }\n\n      VkResult vkQueueSubmit2KHR( VkQueue queue, uint32_t submitCount, const VkSubmitInfo2 * pSubmits, VkFence fence ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkQueueSubmit2KHR( queue, submitCount, pSubmits, fence );\n      }\n\n      //=== VK_EXT_descriptor_buffer ===\n\n      void vkGetDescriptorSetLayoutSizeEXT( VkDevice device, VkDescriptorSetLayout layout, VkDeviceSize * pLayoutSizeInBytes ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDescriptorSetLayoutSizeEXT( device, layout, pLayoutSizeInBytes );\n      }\n\n      void vkGetDescriptorSetLayoutBindingOffsetEXT( VkDevice              device,\n                                                     VkDescriptorSetLayout layout,\n                                                     uint32_t              binding,\n                                                     VkDeviceSize *        pOffset ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDescriptorSetLayoutBindingOffsetEXT( device, layout, binding, pOffset );\n      }\n\n      void vkGetDescriptorEXT( VkDevice device, const VkDescriptorGetInfoEXT * pDescriptorInfo, size_t dataSize, void * pDescriptor ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDescriptorEXT( device, pDescriptorInfo, dataSize, pDescriptor );\n      }\n\n      void vkCmdBindDescriptorBuffersEXT( VkCommandBuffer                          commandBuffer,\n                                          uint32_t                                 bufferCount,\n                                          const VkDescriptorBufferBindingInfoEXT * pBindingInfos ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBindDescriptorBuffersEXT( commandBuffer, bufferCount, pBindingInfos );\n      }\n\n      void vkCmdSetDescriptorBufferOffsetsEXT( VkCommandBuffer      commandBuffer,\n                                               VkPipelineBindPoint  pipelineBindPoint,\n                                               VkPipelineLayout     layout,\n                                               uint32_t             firstSet,\n                                               uint32_t             setCount,\n                                               const uint32_t *     pBufferIndices,\n                                               const VkDeviceSize * pOffsets ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDescriptorBufferOffsetsEXT( commandBuffer, pipelineBindPoint, layout, firstSet, setCount, pBufferIndices, pOffsets );\n      }\n\n      void vkCmdBindDescriptorBufferEmbeddedSamplersEXT( VkCommandBuffer     commandBuffer,\n                                                         VkPipelineBindPoint pipelineBindPoint,\n                                                         VkPipelineLayout    layout,\n                                                         uint32_t            set ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBindDescriptorBufferEmbeddedSamplersEXT( commandBuffer, pipelineBindPoint, layout, set );\n      }\n\n      VkResult\n        vkGetBufferOpaqueCaptureDescriptorDataEXT( VkDevice device, const VkBufferCaptureDescriptorDataInfoEXT * pInfo, void * pData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetBufferOpaqueCaptureDescriptorDataEXT( device, pInfo, pData );\n      }\n\n      VkResult\n        vkGetImageOpaqueCaptureDescriptorDataEXT( VkDevice device, const VkImageCaptureDescriptorDataInfoEXT * pInfo, void * pData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetImageOpaqueCaptureDescriptorDataEXT( device, pInfo, pData );\n      }\n\n      VkResult vkGetImageViewOpaqueCaptureDescriptorDataEXT( VkDevice                                        device,\n                                                             const VkImageViewCaptureDescriptorDataInfoEXT * pInfo,\n                                                             void *                                          pData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetImageViewOpaqueCaptureDescriptorDataEXT( device, pInfo, pData );\n      }\n\n      VkResult vkGetSamplerOpaqueCaptureDescriptorDataEXT( VkDevice                                      device,\n                                                           const VkSamplerCaptureDescriptorDataInfoEXT * pInfo,\n                                                           void *                                        pData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetSamplerOpaqueCaptureDescriptorDataEXT( device, pInfo, pData );\n      }\n\n      VkResult vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT( VkDevice                                                    device,\n                                                                         const VkAccelerationStructureCaptureDescriptorDataInfoEXT * pInfo,\n                                                                         void * pData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT( device, pInfo, pData );\n      }\n\n      //=== VK_NV_fragment_shading_rate_enums ===\n\n      void vkCmdSetFragmentShadingRateEnumNV( VkCommandBuffer                          commandBuffer,\n                                              VkFragmentShadingRateNV                  shadingRate,\n                                              const VkFragmentShadingRateCombinerOpKHR combinerOps[2] ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetFragmentShadingRateEnumNV( commandBuffer, shadingRate, combinerOps );\n      }\n\n      //=== VK_EXT_mesh_shader ===\n\n      void vkCmdDrawMeshTasksEXT( VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDrawMeshTasksEXT( commandBuffer, groupCountX, groupCountY, groupCountZ );\n      }\n\n      void vkCmdDrawMeshTasksIndirectEXT( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride ) const\n        VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDrawMeshTasksIndirectEXT( commandBuffer, buffer, offset, drawCount, stride );\n      }\n\n      void vkCmdDrawMeshTasksIndirectCountEXT( VkCommandBuffer commandBuffer,\n                                               VkBuffer        buffer,\n                                               VkDeviceSize    offset,\n                                               VkBuffer        countBuffer,\n                                               VkDeviceSize    countBufferOffset,\n                                               uint32_t        maxDrawCount,\n                                               uint32_t        stride ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDrawMeshTasksIndirectCountEXT( commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride );\n      }\n\n      //=== VK_KHR_copy_commands2 ===\n\n      void vkCmdCopyBuffer2KHR( VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 * pCopyBufferInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCopyBuffer2KHR( commandBuffer, pCopyBufferInfo );\n      }\n\n      void vkCmdCopyImage2KHR( VkCommandBuffer commandBuffer, const VkCopyImageInfo2 * pCopyImageInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCopyImage2KHR( commandBuffer, pCopyImageInfo );\n      }\n\n      void vkCmdCopyBufferToImage2KHR( VkCommandBuffer commandBuffer, const VkCopyBufferToImageInfo2 * pCopyBufferToImageInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCopyBufferToImage2KHR( commandBuffer, pCopyBufferToImageInfo );\n      }\n\n      void vkCmdCopyImageToBuffer2KHR( VkCommandBuffer commandBuffer, const VkCopyImageToBufferInfo2 * pCopyImageToBufferInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCopyImageToBuffer2KHR( commandBuffer, pCopyImageToBufferInfo );\n      }\n\n      void vkCmdBlitImage2KHR( VkCommandBuffer commandBuffer, const VkBlitImageInfo2 * pBlitImageInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBlitImage2KHR( commandBuffer, pBlitImageInfo );\n      }\n\n      void vkCmdResolveImage2KHR( VkCommandBuffer commandBuffer, const VkResolveImageInfo2 * pResolveImageInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdResolveImage2KHR( commandBuffer, pResolveImageInfo );\n      }\n\n      //=== VK_EXT_device_fault ===\n\n      VkResult vkGetDeviceFaultInfoEXT( VkDevice device, VkDeviceFaultCountsEXT * pFaultCounts, VkDeviceFaultInfoEXT * pFaultInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeviceFaultInfoEXT( device, pFaultCounts, pFaultInfo );\n      }\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_NV_acquire_winrt_display ===\n\n      VkResult vkAcquireWinrtDisplayNV( VkPhysicalDevice physicalDevice, VkDisplayKHR display ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkAcquireWinrtDisplayNV( physicalDevice, display );\n      }\n\n      VkResult vkGetWinrtDisplayNV( VkPhysicalDevice physicalDevice, uint32_t deviceRelativeId, VkDisplayKHR * pDisplay ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetWinrtDisplayNV( physicalDevice, deviceRelativeId, pDisplay );\n      }\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#  if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n      //=== VK_EXT_directfb_surface ===\n\n      VkResult vkCreateDirectFBSurfaceEXT( VkInstance                             instance,\n                                           const VkDirectFBSurfaceCreateInfoEXT * pCreateInfo,\n                                           const VkAllocationCallbacks *          pAllocator,\n                                           VkSurfaceKHR *                         pSurface ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateDirectFBSurfaceEXT( instance, pCreateInfo, pAllocator, pSurface );\n      }\n\n      VkBool32 vkGetPhysicalDeviceDirectFBPresentationSupportEXT( VkPhysicalDevice physicalDevice,\n                                                                  uint32_t         queueFamilyIndex,\n                                                                  IDirectFB *      dfb ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceDirectFBPresentationSupportEXT( physicalDevice, queueFamilyIndex, dfb );\n      }\n#  endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n\n      //=== VK_EXT_vertex_input_dynamic_state ===\n\n      void vkCmdSetVertexInputEXT( VkCommandBuffer                               commandBuffer,\n                                   uint32_t                                      vertexBindingDescriptionCount,\n                                   const VkVertexInputBindingDescription2EXT *   pVertexBindingDescriptions,\n                                   uint32_t                                      vertexAttributeDescriptionCount,\n                                   const VkVertexInputAttributeDescription2EXT * pVertexAttributeDescriptions ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetVertexInputEXT(\n          commandBuffer, vertexBindingDescriptionCount, pVertexBindingDescriptions, vertexAttributeDescriptionCount, pVertexAttributeDescriptions );\n      }\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n      //=== VK_FUCHSIA_external_memory ===\n\n      VkResult vkGetMemoryZirconHandleFUCHSIA( VkDevice                                   device,\n                                               const VkMemoryGetZirconHandleInfoFUCHSIA * pGetZirconHandleInfo,\n                                               zx_handle_t *                              pZirconHandle ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetMemoryZirconHandleFUCHSIA( device, pGetZirconHandleInfo, pZirconHandle );\n      }\n\n      VkResult vkGetMemoryZirconHandlePropertiesFUCHSIA( VkDevice                                device,\n                                                         VkExternalMemoryHandleTypeFlagBits      handleType,\n                                                         zx_handle_t                             zirconHandle,\n                                                         VkMemoryZirconHandlePropertiesFUCHSIA * pMemoryZirconHandleProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetMemoryZirconHandlePropertiesFUCHSIA( device, handleType, zirconHandle, pMemoryZirconHandleProperties );\n      }\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n      //=== VK_FUCHSIA_external_semaphore ===\n\n      VkResult\n        vkImportSemaphoreZirconHandleFUCHSIA( VkDevice                                         device,\n                                              const VkImportSemaphoreZirconHandleInfoFUCHSIA * pImportSemaphoreZirconHandleInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkImportSemaphoreZirconHandleFUCHSIA( device, pImportSemaphoreZirconHandleInfo );\n      }\n\n      VkResult vkGetSemaphoreZirconHandleFUCHSIA( VkDevice                                      device,\n                                                  const VkSemaphoreGetZirconHandleInfoFUCHSIA * pGetZirconHandleInfo,\n                                                  zx_handle_t *                                 pZirconHandle ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetSemaphoreZirconHandleFUCHSIA( device, pGetZirconHandleInfo, pZirconHandle );\n      }\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n      //=== VK_FUCHSIA_buffer_collection ===\n\n      VkResult vkCreateBufferCollectionFUCHSIA( VkDevice                                    device,\n                                                const VkBufferCollectionCreateInfoFUCHSIA * pCreateInfo,\n                                                const VkAllocationCallbacks *               pAllocator,\n                                                VkBufferCollectionFUCHSIA *                 pCollection ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateBufferCollectionFUCHSIA( device, pCreateInfo, pAllocator, pCollection );\n      }\n\n      VkResult vkSetBufferCollectionImageConstraintsFUCHSIA( VkDevice                              device,\n                                                             VkBufferCollectionFUCHSIA             collection,\n                                                             const VkImageConstraintsInfoFUCHSIA * pImageConstraintsInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkSetBufferCollectionImageConstraintsFUCHSIA( device, collection, pImageConstraintsInfo );\n      }\n\n      VkResult vkSetBufferCollectionBufferConstraintsFUCHSIA( VkDevice                               device,\n                                                              VkBufferCollectionFUCHSIA              collection,\n                                                              const VkBufferConstraintsInfoFUCHSIA * pBufferConstraintsInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkSetBufferCollectionBufferConstraintsFUCHSIA( device, collection, pBufferConstraintsInfo );\n      }\n\n      void vkDestroyBufferCollectionFUCHSIA( VkDevice                      device,\n                                             VkBufferCollectionFUCHSIA     collection,\n                                             const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyBufferCollectionFUCHSIA( device, collection, pAllocator );\n      }\n\n      VkResult vkGetBufferCollectionPropertiesFUCHSIA( VkDevice                              device,\n                                                       VkBufferCollectionFUCHSIA             collection,\n                                                       VkBufferCollectionPropertiesFUCHSIA * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetBufferCollectionPropertiesFUCHSIA( device, collection, pProperties );\n      }\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n      //=== VK_HUAWEI_subpass_shading ===\n\n      VkResult\n        vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI( VkDevice device, VkRenderPass renderpass, VkExtent2D * pMaxWorkgroupSize ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI( device, renderpass, pMaxWorkgroupSize );\n      }\n\n      void vkCmdSubpassShadingHUAWEI( VkCommandBuffer commandBuffer ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSubpassShadingHUAWEI( commandBuffer );\n      }\n\n      //=== VK_HUAWEI_invocation_mask ===\n\n      void vkCmdBindInvocationMaskHUAWEI( VkCommandBuffer commandBuffer, VkImageView imageView, VkImageLayout imageLayout ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBindInvocationMaskHUAWEI( commandBuffer, imageView, imageLayout );\n      }\n\n      //=== VK_NV_external_memory_rdma ===\n\n      VkResult vkGetMemoryRemoteAddressNV( VkDevice                               device,\n                                           const VkMemoryGetRemoteAddressInfoNV * pMemoryGetRemoteAddressInfo,\n                                           VkRemoteAddressNV *                    pAddress ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetMemoryRemoteAddressNV( device, pMemoryGetRemoteAddressInfo, pAddress );\n      }\n\n      //=== VK_EXT_pipeline_properties ===\n\n      VkResult vkGetPipelinePropertiesEXT( VkDevice                  device,\n                                           const VkPipelineInfoEXT * pPipelineInfo,\n                                           VkBaseOutStructure *      pPipelineProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPipelinePropertiesEXT( device, pPipelineInfo, pPipelineProperties );\n      }\n\n      //=== VK_EXT_extended_dynamic_state2 ===\n\n      void vkCmdSetPatchControlPointsEXT( VkCommandBuffer commandBuffer, uint32_t patchControlPoints ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetPatchControlPointsEXT( commandBuffer, patchControlPoints );\n      }\n\n      void vkCmdSetRasterizerDiscardEnableEXT( VkCommandBuffer commandBuffer, VkBool32 rasterizerDiscardEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetRasterizerDiscardEnableEXT( commandBuffer, rasterizerDiscardEnable );\n      }\n\n      void vkCmdSetDepthBiasEnableEXT( VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDepthBiasEnableEXT( commandBuffer, depthBiasEnable );\n      }\n\n      void vkCmdSetLogicOpEXT( VkCommandBuffer commandBuffer, VkLogicOp logicOp ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetLogicOpEXT( commandBuffer, logicOp );\n      }\n\n      void vkCmdSetPrimitiveRestartEnableEXT( VkCommandBuffer commandBuffer, VkBool32 primitiveRestartEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetPrimitiveRestartEnableEXT( commandBuffer, primitiveRestartEnable );\n      }\n\n#  if defined( VK_USE_PLATFORM_SCREEN_QNX )\n      //=== VK_QNX_screen_surface ===\n\n      VkResult vkCreateScreenSurfaceQNX( VkInstance                           instance,\n                                         const VkScreenSurfaceCreateInfoQNX * pCreateInfo,\n                                         const VkAllocationCallbacks *        pAllocator,\n                                         VkSurfaceKHR *                       pSurface ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateScreenSurfaceQNX( instance, pCreateInfo, pAllocator, pSurface );\n      }\n\n      VkBool32 vkGetPhysicalDeviceScreenPresentationSupportQNX( VkPhysicalDevice        physicalDevice,\n                                                                uint32_t                queueFamilyIndex,\n                                                                struct _screen_window * window ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceScreenPresentationSupportQNX( physicalDevice, queueFamilyIndex, window );\n      }\n#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n      //=== VK_EXT_color_write_enable ===\n\n      void vkCmdSetColorWriteEnableEXT( VkCommandBuffer commandBuffer, uint32_t attachmentCount, const VkBool32 * pColorWriteEnables ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetColorWriteEnableEXT( commandBuffer, attachmentCount, pColorWriteEnables );\n      }\n\n      //=== VK_KHR_ray_tracing_maintenance1 ===\n\n      void vkCmdTraceRaysIndirect2KHR( VkCommandBuffer commandBuffer, VkDeviceAddress indirectDeviceAddress ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdTraceRaysIndirect2KHR( commandBuffer, indirectDeviceAddress );\n      }\n\n      //=== VK_EXT_multi_draw ===\n\n      void vkCmdDrawMultiEXT( VkCommandBuffer            commandBuffer,\n                              uint32_t                   drawCount,\n                              const VkMultiDrawInfoEXT * pVertexInfo,\n                              uint32_t                   instanceCount,\n                              uint32_t                   firstInstance,\n                              uint32_t                   stride ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDrawMultiEXT( commandBuffer, drawCount, pVertexInfo, instanceCount, firstInstance, stride );\n      }\n\n      void vkCmdDrawMultiIndexedEXT( VkCommandBuffer                   commandBuffer,\n                                     uint32_t                          drawCount,\n                                     const VkMultiDrawIndexedInfoEXT * pIndexInfo,\n                                     uint32_t                          instanceCount,\n                                     uint32_t                          firstInstance,\n                                     uint32_t                          stride,\n                                     const int32_t *                   pVertexOffset ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDrawMultiIndexedEXT( commandBuffer, drawCount, pIndexInfo, instanceCount, firstInstance, stride, pVertexOffset );\n      }\n\n      //=== VK_EXT_opacity_micromap ===\n\n      VkResult vkCreateMicromapEXT( VkDevice                        device,\n                                    const VkMicromapCreateInfoEXT * pCreateInfo,\n                                    const VkAllocationCallbacks *   pAllocator,\n                                    VkMicromapEXT *                 pMicromap ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateMicromapEXT( device, pCreateInfo, pAllocator, pMicromap );\n      }\n\n      void vkDestroyMicromapEXT( VkDevice device, VkMicromapEXT micromap, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyMicromapEXT( device, micromap, pAllocator );\n      }\n\n      void vkCmdBuildMicromapsEXT( VkCommandBuffer commandBuffer, uint32_t infoCount, const VkMicromapBuildInfoEXT * pInfos ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBuildMicromapsEXT( commandBuffer, infoCount, pInfos );\n      }\n\n      VkResult vkBuildMicromapsEXT( VkDevice                       device,\n                                    VkDeferredOperationKHR         deferredOperation,\n                                    uint32_t                       infoCount,\n                                    const VkMicromapBuildInfoEXT * pInfos ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkBuildMicromapsEXT( device, deferredOperation, infoCount, pInfos );\n      }\n\n      VkResult vkCopyMicromapEXT( VkDevice device, VkDeferredOperationKHR deferredOperation, const VkCopyMicromapInfoEXT * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCopyMicromapEXT( device, deferredOperation, pInfo );\n      }\n\n      VkResult vkCopyMicromapToMemoryEXT( VkDevice                              device,\n                                          VkDeferredOperationKHR                deferredOperation,\n                                          const VkCopyMicromapToMemoryInfoEXT * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCopyMicromapToMemoryEXT( device, deferredOperation, pInfo );\n      }\n\n      VkResult vkCopyMemoryToMicromapEXT( VkDevice                              device,\n                                          VkDeferredOperationKHR                deferredOperation,\n                                          const VkCopyMemoryToMicromapInfoEXT * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCopyMemoryToMicromapEXT( device, deferredOperation, pInfo );\n      }\n\n      VkResult vkWriteMicromapsPropertiesEXT( VkDevice              device,\n                                              uint32_t              micromapCount,\n                                              const VkMicromapEXT * pMicromaps,\n                                              VkQueryType           queryType,\n                                              size_t                dataSize,\n                                              void *                pData,\n                                              size_t                stride ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkWriteMicromapsPropertiesEXT( device, micromapCount, pMicromaps, queryType, dataSize, pData, stride );\n      }\n\n      void vkCmdCopyMicromapEXT( VkCommandBuffer commandBuffer, const VkCopyMicromapInfoEXT * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCopyMicromapEXT( commandBuffer, pInfo );\n      }\n\n      void vkCmdCopyMicromapToMemoryEXT( VkCommandBuffer commandBuffer, const VkCopyMicromapToMemoryInfoEXT * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCopyMicromapToMemoryEXT( commandBuffer, pInfo );\n      }\n\n      void vkCmdCopyMemoryToMicromapEXT( VkCommandBuffer commandBuffer, const VkCopyMemoryToMicromapInfoEXT * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCopyMemoryToMicromapEXT( commandBuffer, pInfo );\n      }\n\n      void vkCmdWriteMicromapsPropertiesEXT( VkCommandBuffer       commandBuffer,\n                                             uint32_t              micromapCount,\n                                             const VkMicromapEXT * pMicromaps,\n                                             VkQueryType           queryType,\n                                             VkQueryPool           queryPool,\n                                             uint32_t              firstQuery ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdWriteMicromapsPropertiesEXT( commandBuffer, micromapCount, pMicromaps, queryType, queryPool, firstQuery );\n      }\n\n      void vkGetDeviceMicromapCompatibilityEXT( VkDevice                                  device,\n                                                const VkMicromapVersionInfoEXT *          pVersionInfo,\n                                                VkAccelerationStructureCompatibilityKHR * pCompatibility ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeviceMicromapCompatibilityEXT( device, pVersionInfo, pCompatibility );\n      }\n\n      void vkGetMicromapBuildSizesEXT( VkDevice                            device,\n                                       VkAccelerationStructureBuildTypeKHR buildType,\n                                       const VkMicromapBuildInfoEXT *      pBuildInfo,\n                                       VkMicromapBuildSizesInfoEXT *       pSizeInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetMicromapBuildSizesEXT( device, buildType, pBuildInfo, pSizeInfo );\n      }\n\n      //=== VK_HUAWEI_cluster_culling_shader ===\n\n      void vkCmdDrawClusterHUAWEI( VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDrawClusterHUAWEI( commandBuffer, groupCountX, groupCountY, groupCountZ );\n      }\n\n      void vkCmdDrawClusterIndirectHUAWEI( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDrawClusterIndirectHUAWEI( commandBuffer, buffer, offset );\n      }\n\n      //=== VK_EXT_pageable_device_local_memory ===\n\n      void vkSetDeviceMemoryPriorityEXT( VkDevice device, VkDeviceMemory memory, float priority ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkSetDeviceMemoryPriorityEXT( device, memory, priority );\n      }\n\n      //=== VK_KHR_maintenance4 ===\n\n      void vkGetDeviceBufferMemoryRequirementsKHR( VkDevice                                 device,\n                                                   const VkDeviceBufferMemoryRequirements * pInfo,\n                                                   VkMemoryRequirements2 *                  pMemoryRequirements ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeviceBufferMemoryRequirementsKHR( device, pInfo, pMemoryRequirements );\n      }\n\n      void vkGetDeviceImageMemoryRequirementsKHR( VkDevice                                device,\n                                                  const VkDeviceImageMemoryRequirements * pInfo,\n                                                  VkMemoryRequirements2 *                 pMemoryRequirements ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeviceImageMemoryRequirementsKHR( device, pInfo, pMemoryRequirements );\n      }\n\n      void vkGetDeviceImageSparseMemoryRequirementsKHR( VkDevice                                device,\n                                                        const VkDeviceImageMemoryRequirements * pInfo,\n                                                        uint32_t *                              pSparseMemoryRequirementCount,\n                                                        VkSparseImageMemoryRequirements2 *      pSparseMemoryRequirements ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeviceImageSparseMemoryRequirementsKHR( device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements );\n      }\n\n      //=== VK_VALVE_descriptor_set_host_mapping ===\n\n      void vkGetDescriptorSetLayoutHostMappingInfoVALVE( VkDevice                                     device,\n                                                         const VkDescriptorSetBindingReferenceVALVE * pBindingReference,\n                                                         VkDescriptorSetLayoutHostMappingInfoVALVE *  pHostMapping ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDescriptorSetLayoutHostMappingInfoVALVE( device, pBindingReference, pHostMapping );\n      }\n\n      void vkGetDescriptorSetHostMappingVALVE( VkDevice device, VkDescriptorSet descriptorSet, void ** ppData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDescriptorSetHostMappingVALVE( device, descriptorSet, ppData );\n      }\n\n      //=== VK_NV_copy_memory_indirect ===\n\n      void vkCmdCopyMemoryIndirectNV( VkCommandBuffer commandBuffer,\n                                      VkDeviceAddress copyBufferAddress,\n                                      uint32_t        copyCount,\n                                      uint32_t        stride ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCopyMemoryIndirectNV( commandBuffer, copyBufferAddress, copyCount, stride );\n      }\n\n      void vkCmdCopyMemoryToImageIndirectNV( VkCommandBuffer                  commandBuffer,\n                                             VkDeviceAddress                  copyBufferAddress,\n                                             uint32_t                         copyCount,\n                                             uint32_t                         stride,\n                                             VkImage                          dstImage,\n                                             VkImageLayout                    dstImageLayout,\n                                             const VkImageSubresourceLayers * pImageSubresources ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdCopyMemoryToImageIndirectNV( commandBuffer, copyBufferAddress, copyCount, stride, dstImage, dstImageLayout, pImageSubresources );\n      }\n\n      //=== VK_NV_memory_decompression ===\n\n      void vkCmdDecompressMemoryNV( VkCommandBuffer                    commandBuffer,\n                                    uint32_t                           decompressRegionCount,\n                                    const VkDecompressMemoryRegionNV * pDecompressMemoryRegions ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDecompressMemoryNV( commandBuffer, decompressRegionCount, pDecompressMemoryRegions );\n      }\n\n      void vkCmdDecompressMemoryIndirectCountNV( VkCommandBuffer commandBuffer,\n                                                 VkDeviceAddress indirectCommandsAddress,\n                                                 VkDeviceAddress indirectCommandsCountAddress,\n                                                 uint32_t        stride ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdDecompressMemoryIndirectCountNV( commandBuffer, indirectCommandsAddress, indirectCommandsCountAddress, stride );\n      }\n\n      //=== VK_NV_device_generated_commands_compute ===\n\n      void vkGetPipelineIndirectMemoryRequirementsNV( VkDevice                            device,\n                                                      const VkComputePipelineCreateInfo * pCreateInfo,\n                                                      VkMemoryRequirements2 *             pMemoryRequirements ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPipelineIndirectMemoryRequirementsNV( device, pCreateInfo, pMemoryRequirements );\n      }\n\n      void vkCmdUpdatePipelineIndirectBufferNV( VkCommandBuffer     commandBuffer,\n                                                VkPipelineBindPoint pipelineBindPoint,\n                                                VkPipeline          pipeline ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdUpdatePipelineIndirectBufferNV( commandBuffer, pipelineBindPoint, pipeline );\n      }\n\n      VkDeviceAddress vkGetPipelineIndirectDeviceAddressNV( VkDevice device, const VkPipelineIndirectDeviceAddressInfoNV * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPipelineIndirectDeviceAddressNV( device, pInfo );\n      }\n\n      //=== VK_EXT_extended_dynamic_state3 ===\n\n      void vkCmdSetDepthClampEnableEXT( VkCommandBuffer commandBuffer, VkBool32 depthClampEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDepthClampEnableEXT( commandBuffer, depthClampEnable );\n      }\n\n      void vkCmdSetPolygonModeEXT( VkCommandBuffer commandBuffer, VkPolygonMode polygonMode ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetPolygonModeEXT( commandBuffer, polygonMode );\n      }\n\n      void vkCmdSetRasterizationSamplesEXT( VkCommandBuffer commandBuffer, VkSampleCountFlagBits rasterizationSamples ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetRasterizationSamplesEXT( commandBuffer, rasterizationSamples );\n      }\n\n      void vkCmdSetSampleMaskEXT( VkCommandBuffer commandBuffer, VkSampleCountFlagBits samples, const VkSampleMask * pSampleMask ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetSampleMaskEXT( commandBuffer, samples, pSampleMask );\n      }\n\n      void vkCmdSetAlphaToCoverageEnableEXT( VkCommandBuffer commandBuffer, VkBool32 alphaToCoverageEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetAlphaToCoverageEnableEXT( commandBuffer, alphaToCoverageEnable );\n      }\n\n      void vkCmdSetAlphaToOneEnableEXT( VkCommandBuffer commandBuffer, VkBool32 alphaToOneEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetAlphaToOneEnableEXT( commandBuffer, alphaToOneEnable );\n      }\n\n      void vkCmdSetLogicOpEnableEXT( VkCommandBuffer commandBuffer, VkBool32 logicOpEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetLogicOpEnableEXT( commandBuffer, logicOpEnable );\n      }\n\n      void vkCmdSetColorBlendEnableEXT( VkCommandBuffer  commandBuffer,\n                                        uint32_t         firstAttachment,\n                                        uint32_t         attachmentCount,\n                                        const VkBool32 * pColorBlendEnables ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetColorBlendEnableEXT( commandBuffer, firstAttachment, attachmentCount, pColorBlendEnables );\n      }\n\n      void vkCmdSetColorBlendEquationEXT( VkCommandBuffer                 commandBuffer,\n                                          uint32_t                        firstAttachment,\n                                          uint32_t                        attachmentCount,\n                                          const VkColorBlendEquationEXT * pColorBlendEquations ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetColorBlendEquationEXT( commandBuffer, firstAttachment, attachmentCount, pColorBlendEquations );\n      }\n\n      void vkCmdSetColorWriteMaskEXT( VkCommandBuffer               commandBuffer,\n                                      uint32_t                      firstAttachment,\n                                      uint32_t                      attachmentCount,\n                                      const VkColorComponentFlags * pColorWriteMasks ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetColorWriteMaskEXT( commandBuffer, firstAttachment, attachmentCount, pColorWriteMasks );\n      }\n\n      void vkCmdSetTessellationDomainOriginEXT( VkCommandBuffer commandBuffer, VkTessellationDomainOrigin domainOrigin ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetTessellationDomainOriginEXT( commandBuffer, domainOrigin );\n      }\n\n      void vkCmdSetRasterizationStreamEXT( VkCommandBuffer commandBuffer, uint32_t rasterizationStream ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetRasterizationStreamEXT( commandBuffer, rasterizationStream );\n      }\n\n      void vkCmdSetConservativeRasterizationModeEXT( VkCommandBuffer                    commandBuffer,\n                                                     VkConservativeRasterizationModeEXT conservativeRasterizationMode ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetConservativeRasterizationModeEXT( commandBuffer, conservativeRasterizationMode );\n      }\n\n      void vkCmdSetExtraPrimitiveOverestimationSizeEXT( VkCommandBuffer commandBuffer, float extraPrimitiveOverestimationSize ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetExtraPrimitiveOverestimationSizeEXT( commandBuffer, extraPrimitiveOverestimationSize );\n      }\n\n      void vkCmdSetDepthClipEnableEXT( VkCommandBuffer commandBuffer, VkBool32 depthClipEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDepthClipEnableEXT( commandBuffer, depthClipEnable );\n      }\n\n      void vkCmdSetSampleLocationsEnableEXT( VkCommandBuffer commandBuffer, VkBool32 sampleLocationsEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetSampleLocationsEnableEXT( commandBuffer, sampleLocationsEnable );\n      }\n\n      void vkCmdSetColorBlendAdvancedEXT( VkCommandBuffer                 commandBuffer,\n                                          uint32_t                        firstAttachment,\n                                          uint32_t                        attachmentCount,\n                                          const VkColorBlendAdvancedEXT * pColorBlendAdvanced ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetColorBlendAdvancedEXT( commandBuffer, firstAttachment, attachmentCount, pColorBlendAdvanced );\n      }\n\n      void vkCmdSetProvokingVertexModeEXT( VkCommandBuffer commandBuffer, VkProvokingVertexModeEXT provokingVertexMode ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetProvokingVertexModeEXT( commandBuffer, provokingVertexMode );\n      }\n\n      void vkCmdSetLineRasterizationModeEXT( VkCommandBuffer commandBuffer, VkLineRasterizationModeEXT lineRasterizationMode ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetLineRasterizationModeEXT( commandBuffer, lineRasterizationMode );\n      }\n\n      void vkCmdSetLineStippleEnableEXT( VkCommandBuffer commandBuffer, VkBool32 stippledLineEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetLineStippleEnableEXT( commandBuffer, stippledLineEnable );\n      }\n\n      void vkCmdSetDepthClipNegativeOneToOneEXT( VkCommandBuffer commandBuffer, VkBool32 negativeOneToOne ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDepthClipNegativeOneToOneEXT( commandBuffer, negativeOneToOne );\n      }\n\n      void vkCmdSetViewportWScalingEnableNV( VkCommandBuffer commandBuffer, VkBool32 viewportWScalingEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetViewportWScalingEnableNV( commandBuffer, viewportWScalingEnable );\n      }\n\n      void vkCmdSetViewportSwizzleNV( VkCommandBuffer             commandBuffer,\n                                      uint32_t                    firstViewport,\n                                      uint32_t                    viewportCount,\n                                      const VkViewportSwizzleNV * pViewportSwizzles ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetViewportSwizzleNV( commandBuffer, firstViewport, viewportCount, pViewportSwizzles );\n      }\n\n      void vkCmdSetCoverageToColorEnableNV( VkCommandBuffer commandBuffer, VkBool32 coverageToColorEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetCoverageToColorEnableNV( commandBuffer, coverageToColorEnable );\n      }\n\n      void vkCmdSetCoverageToColorLocationNV( VkCommandBuffer commandBuffer, uint32_t coverageToColorLocation ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetCoverageToColorLocationNV( commandBuffer, coverageToColorLocation );\n      }\n\n      void vkCmdSetCoverageModulationModeNV( VkCommandBuffer commandBuffer, VkCoverageModulationModeNV coverageModulationMode ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetCoverageModulationModeNV( commandBuffer, coverageModulationMode );\n      }\n\n      void vkCmdSetCoverageModulationTableEnableNV( VkCommandBuffer commandBuffer, VkBool32 coverageModulationTableEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetCoverageModulationTableEnableNV( commandBuffer, coverageModulationTableEnable );\n      }\n\n      void vkCmdSetCoverageModulationTableNV( VkCommandBuffer commandBuffer,\n                                              uint32_t        coverageModulationTableCount,\n                                              const float *   pCoverageModulationTable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetCoverageModulationTableNV( commandBuffer, coverageModulationTableCount, pCoverageModulationTable );\n      }\n\n      void vkCmdSetShadingRateImageEnableNV( VkCommandBuffer commandBuffer, VkBool32 shadingRateImageEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetShadingRateImageEnableNV( commandBuffer, shadingRateImageEnable );\n      }\n\n      void vkCmdSetRepresentativeFragmentTestEnableNV( VkCommandBuffer commandBuffer, VkBool32 representativeFragmentTestEnable ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetRepresentativeFragmentTestEnableNV( commandBuffer, representativeFragmentTestEnable );\n      }\n\n      void vkCmdSetCoverageReductionModeNV( VkCommandBuffer commandBuffer, VkCoverageReductionModeNV coverageReductionMode ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetCoverageReductionModeNV( commandBuffer, coverageReductionMode );\n      }\n\n      //=== VK_EXT_shader_module_identifier ===\n\n      void vkGetShaderModuleIdentifierEXT( VkDevice device, VkShaderModule shaderModule, VkShaderModuleIdentifierEXT * pIdentifier ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetShaderModuleIdentifierEXT( device, shaderModule, pIdentifier );\n      }\n\n      void vkGetShaderModuleCreateInfoIdentifierEXT( VkDevice                         device,\n                                                     const VkShaderModuleCreateInfo * pCreateInfo,\n                                                     VkShaderModuleIdentifierEXT *    pIdentifier ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetShaderModuleCreateInfoIdentifierEXT( device, pCreateInfo, pIdentifier );\n      }\n\n      //=== VK_NV_optical_flow ===\n\n      VkResult vkGetPhysicalDeviceOpticalFlowImageFormatsNV( VkPhysicalDevice                       physicalDevice,\n                                                             const VkOpticalFlowImageFormatInfoNV * pOpticalFlowImageFormatInfo,\n                                                             uint32_t *                             pFormatCount,\n                                                             VkOpticalFlowImageFormatPropertiesNV * pImageFormatProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceOpticalFlowImageFormatsNV( physicalDevice, pOpticalFlowImageFormatInfo, pFormatCount, pImageFormatProperties );\n      }\n\n      VkResult vkCreateOpticalFlowSessionNV( VkDevice                                 device,\n                                             const VkOpticalFlowSessionCreateInfoNV * pCreateInfo,\n                                             const VkAllocationCallbacks *            pAllocator,\n                                             VkOpticalFlowSessionNV *                 pSession ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateOpticalFlowSessionNV( device, pCreateInfo, pAllocator, pSession );\n      }\n\n      void vkDestroyOpticalFlowSessionNV( VkDevice device, VkOpticalFlowSessionNV session, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyOpticalFlowSessionNV( device, session, pAllocator );\n      }\n\n      VkResult vkBindOpticalFlowSessionImageNV( VkDevice                           device,\n                                                VkOpticalFlowSessionNV             session,\n                                                VkOpticalFlowSessionBindingPointNV bindingPoint,\n                                                VkImageView                        view,\n                                                VkImageLayout                      layout ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkBindOpticalFlowSessionImageNV( device, session, bindingPoint, view, layout );\n      }\n\n      void vkCmdOpticalFlowExecuteNV( VkCommandBuffer                    commandBuffer,\n                                      VkOpticalFlowSessionNV             session,\n                                      const VkOpticalFlowExecuteInfoNV * pExecuteInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdOpticalFlowExecuteNV( commandBuffer, session, pExecuteInfo );\n      }\n\n      //=== VK_KHR_maintenance5 ===\n\n      void vkCmdBindIndexBuffer2KHR( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkDeviceSize size, VkIndexType indexType ) const\n        VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBindIndexBuffer2KHR( commandBuffer, buffer, offset, size, indexType );\n      }\n\n      void\n        vkGetRenderingAreaGranularityKHR( VkDevice device, const VkRenderingAreaInfo * pRenderingAreaInfo, VkExtent2D * pGranularity ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetRenderingAreaGranularityKHR( device, pRenderingAreaInfo, pGranularity );\n      }\n\n      void vkGetDeviceImageSubresourceLayoutKHR( VkDevice                             device,\n                                                 const VkDeviceImageSubresourceInfo * pInfo,\n                                                 VkSubresourceLayout2 *               pLayout ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDeviceImageSubresourceLayoutKHR( device, pInfo, pLayout );\n      }\n\n      void vkGetImageSubresourceLayout2KHR( VkDevice                    device,\n                                            VkImage                     image,\n                                            const VkImageSubresource2 * pSubresource,\n                                            VkSubresourceLayout2 *      pLayout ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetImageSubresourceLayout2KHR( device, image, pSubresource, pLayout );\n      }\n\n      //=== VK_AMD_anti_lag ===\n\n      void vkAntiLagUpdateAMD( VkDevice device, const VkAntiLagDataAMD * pData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkAntiLagUpdateAMD( device, pData );\n      }\n\n      //=== VK_EXT_shader_object ===\n\n      VkResult vkCreateShadersEXT( VkDevice                      device,\n                                   uint32_t                      createInfoCount,\n                                   const VkShaderCreateInfoEXT * pCreateInfos,\n                                   const VkAllocationCallbacks * pAllocator,\n                                   VkShaderEXT *                 pShaders ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateShadersEXT( device, createInfoCount, pCreateInfos, pAllocator, pShaders );\n      }\n\n      void vkDestroyShaderEXT( VkDevice device, VkShaderEXT shader, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyShaderEXT( device, shader, pAllocator );\n      }\n\n      VkResult vkGetShaderBinaryDataEXT( VkDevice device, VkShaderEXT shader, size_t * pDataSize, void * pData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetShaderBinaryDataEXT( device, shader, pDataSize, pData );\n      }\n\n      void vkCmdBindShadersEXT( VkCommandBuffer               commandBuffer,\n                                uint32_t                      stageCount,\n                                const VkShaderStageFlagBits * pStages,\n                                const VkShaderEXT *           pShaders ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBindShadersEXT( commandBuffer, stageCount, pStages, pShaders );\n      }\n\n      void vkCmdSetDepthClampRangeEXT( VkCommandBuffer              commandBuffer,\n                                       VkDepthClampModeEXT          depthClampMode,\n                                       const VkDepthClampRangeEXT * pDepthClampRange ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDepthClampRangeEXT( commandBuffer, depthClampMode, pDepthClampRange );\n      }\n\n      //=== VK_KHR_pipeline_binary ===\n\n      VkResult vkCreatePipelineBinariesKHR( VkDevice                              device,\n                                            const VkPipelineBinaryCreateInfoKHR * pCreateInfo,\n                                            const VkAllocationCallbacks *         pAllocator,\n                                            VkPipelineBinaryHandlesInfoKHR *      pBinaries ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreatePipelineBinariesKHR( device, pCreateInfo, pAllocator, pBinaries );\n      }\n\n      void vkDestroyPipelineBinaryKHR( VkDevice device, VkPipelineBinaryKHR pipelineBinary, const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyPipelineBinaryKHR( device, pipelineBinary, pAllocator );\n      }\n\n      VkResult vkGetPipelineKeyKHR( VkDevice                        device,\n                                    const VkPipelineCreateInfoKHR * pPipelineCreateInfo,\n                                    VkPipelineBinaryKeyKHR *        pPipelineKey ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPipelineKeyKHR( device, pPipelineCreateInfo, pPipelineKey );\n      }\n\n      VkResult vkGetPipelineBinaryDataKHR( VkDevice                            device,\n                                           const VkPipelineBinaryDataInfoKHR * pInfo,\n                                           VkPipelineBinaryKeyKHR *            pPipelineBinaryKey,\n                                           size_t *                            pPipelineBinaryDataSize,\n                                           void *                              pPipelineBinaryData ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPipelineBinaryDataKHR( device, pInfo, pPipelineBinaryKey, pPipelineBinaryDataSize, pPipelineBinaryData );\n      }\n\n      VkResult vkReleaseCapturedPipelineDataKHR( VkDevice                                     device,\n                                                 const VkReleaseCapturedPipelineDataInfoKHR * pInfo,\n                                                 const VkAllocationCallbacks *                pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkReleaseCapturedPipelineDataKHR( device, pInfo, pAllocator );\n      }\n\n      //=== VK_QCOM_tile_properties ===\n\n      VkResult vkGetFramebufferTilePropertiesQCOM( VkDevice               device,\n                                                   VkFramebuffer          framebuffer,\n                                                   uint32_t *             pPropertiesCount,\n                                                   VkTilePropertiesQCOM * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetFramebufferTilePropertiesQCOM( device, framebuffer, pPropertiesCount, pProperties );\n      }\n\n      VkResult vkGetDynamicRenderingTilePropertiesQCOM( VkDevice                device,\n                                                        const VkRenderingInfo * pRenderingInfo,\n                                                        VkTilePropertiesQCOM *  pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetDynamicRenderingTilePropertiesQCOM( device, pRenderingInfo, pProperties );\n      }\n\n      //=== VK_NV_cooperative_vector ===\n\n      VkResult vkGetPhysicalDeviceCooperativeVectorPropertiesNV( VkPhysicalDevice                  physicalDevice,\n                                                                 uint32_t *                        pPropertyCount,\n                                                                 VkCooperativeVectorPropertiesNV * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceCooperativeVectorPropertiesNV( physicalDevice, pPropertyCount, pProperties );\n      }\n\n      VkResult vkConvertCooperativeVectorMatrixNV( VkDevice device, const VkConvertCooperativeVectorMatrixInfoNV * pInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkConvertCooperativeVectorMatrixNV( device, pInfo );\n      }\n\n      void vkCmdConvertCooperativeVectorMatrixNV( VkCommandBuffer                                commandBuffer,\n                                                  uint32_t                                       infoCount,\n                                                  const VkConvertCooperativeVectorMatrixInfoNV * pInfos ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdConvertCooperativeVectorMatrixNV( commandBuffer, infoCount, pInfos );\n      }\n\n      //=== VK_NV_low_latency2 ===\n\n      VkResult vkSetLatencySleepModeNV( VkDevice device, VkSwapchainKHR swapchain, const VkLatencySleepModeInfoNV * pSleepModeInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkSetLatencySleepModeNV( device, swapchain, pSleepModeInfo );\n      }\n\n      VkResult vkLatencySleepNV( VkDevice device, VkSwapchainKHR swapchain, const VkLatencySleepInfoNV * pSleepInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkLatencySleepNV( device, swapchain, pSleepInfo );\n      }\n\n      void vkSetLatencyMarkerNV( VkDevice device, VkSwapchainKHR swapchain, const VkSetLatencyMarkerInfoNV * pLatencyMarkerInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkSetLatencyMarkerNV( device, swapchain, pLatencyMarkerInfo );\n      }\n\n      void vkGetLatencyTimingsNV( VkDevice device, VkSwapchainKHR swapchain, VkGetLatencyMarkerInfoNV * pLatencyMarkerInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetLatencyTimingsNV( device, swapchain, pLatencyMarkerInfo );\n      }\n\n      void vkQueueNotifyOutOfBandNV( VkQueue queue, const VkOutOfBandQueueTypeInfoNV * pQueueTypeInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkQueueNotifyOutOfBandNV( queue, pQueueTypeInfo );\n      }\n\n      //=== VK_KHR_cooperative_matrix ===\n\n      VkResult vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR( VkPhysicalDevice                   physicalDevice,\n                                                                  uint32_t *                         pPropertyCount,\n                                                                  VkCooperativeMatrixPropertiesKHR * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR( physicalDevice, pPropertyCount, pProperties );\n      }\n\n      //=== VK_EXT_attachment_feedback_loop_dynamic_state ===\n\n      void vkCmdSetAttachmentFeedbackLoopEnableEXT( VkCommandBuffer commandBuffer, VkImageAspectFlags aspectMask ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetAttachmentFeedbackLoopEnableEXT( commandBuffer, aspectMask );\n      }\n\n#  if defined( VK_USE_PLATFORM_SCREEN_QNX )\n      //=== VK_QNX_external_memory_screen_buffer ===\n\n      VkResult vkGetScreenBufferPropertiesQNX( VkDevice                      device,\n                                               const struct _screen_buffer * buffer,\n                                               VkScreenBufferPropertiesQNX * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetScreenBufferPropertiesQNX( device, buffer, pProperties );\n      }\n#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n      //=== VK_KHR_line_rasterization ===\n\n      void vkCmdSetLineStippleKHR( VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, uint16_t lineStipplePattern ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetLineStippleKHR( commandBuffer, lineStippleFactor, lineStipplePattern );\n      }\n\n      //=== VK_KHR_calibrated_timestamps ===\n\n      VkResult vkGetPhysicalDeviceCalibrateableTimeDomainsKHR( VkPhysicalDevice  physicalDevice,\n                                                               uint32_t *        pTimeDomainCount,\n                                                               VkTimeDomainKHR * pTimeDomains ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceCalibrateableTimeDomainsKHR( physicalDevice, pTimeDomainCount, pTimeDomains );\n      }\n\n      VkResult vkGetCalibratedTimestampsKHR( VkDevice                             device,\n                                             uint32_t                             timestampCount,\n                                             const VkCalibratedTimestampInfoKHR * pTimestampInfos,\n                                             uint64_t *                           pTimestamps,\n                                             uint64_t *                           pMaxDeviation ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetCalibratedTimestampsKHR( device, timestampCount, pTimestampInfos, pTimestamps, pMaxDeviation );\n      }\n\n      //=== VK_KHR_maintenance6 ===\n\n      void vkCmdBindDescriptorSets2KHR( VkCommandBuffer commandBuffer, const VkBindDescriptorSetsInfo * pBindDescriptorSetsInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBindDescriptorSets2KHR( commandBuffer, pBindDescriptorSetsInfo );\n      }\n\n      void vkCmdPushConstants2KHR( VkCommandBuffer commandBuffer, const VkPushConstantsInfo * pPushConstantsInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdPushConstants2KHR( commandBuffer, pPushConstantsInfo );\n      }\n\n      void vkCmdPushDescriptorSet2KHR( VkCommandBuffer commandBuffer, const VkPushDescriptorSetInfo * pPushDescriptorSetInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdPushDescriptorSet2KHR( commandBuffer, pPushDescriptorSetInfo );\n      }\n\n      void vkCmdPushDescriptorSetWithTemplate2KHR( VkCommandBuffer                             commandBuffer,\n                                                   const VkPushDescriptorSetWithTemplateInfo * pPushDescriptorSetWithTemplateInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdPushDescriptorSetWithTemplate2KHR( commandBuffer, pPushDescriptorSetWithTemplateInfo );\n      }\n\n      void vkCmdSetDescriptorBufferOffsets2EXT( VkCommandBuffer                             commandBuffer,\n                                                const VkSetDescriptorBufferOffsetsInfoEXT * pSetDescriptorBufferOffsetsInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdSetDescriptorBufferOffsets2EXT( commandBuffer, pSetDescriptorBufferOffsetsInfo );\n      }\n\n      void vkCmdBindDescriptorBufferEmbeddedSamplers2EXT(\n        VkCommandBuffer                                       commandBuffer,\n        const VkBindDescriptorBufferEmbeddedSamplersInfoEXT * pBindDescriptorBufferEmbeddedSamplersInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBindDescriptorBufferEmbeddedSamplers2EXT( commandBuffer, pBindDescriptorBufferEmbeddedSamplersInfo );\n      }\n\n      //=== VK_NV_cluster_acceleration_structure ===\n\n      void vkGetClusterAccelerationStructureBuildSizesNV( VkDevice                                          device,\n                                                          const VkClusterAccelerationStructureInputInfoNV * pInfo,\n                                                          VkAccelerationStructureBuildSizesInfoKHR *        pSizeInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetClusterAccelerationStructureBuildSizesNV( device, pInfo, pSizeInfo );\n      }\n\n      void vkCmdBuildClusterAccelerationStructureIndirectNV( VkCommandBuffer                                      commandBuffer,\n                                                             const VkClusterAccelerationStructureCommandsInfoNV * pCommandInfos ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBuildClusterAccelerationStructureIndirectNV( commandBuffer, pCommandInfos );\n      }\n\n      //=== VK_NV_partitioned_acceleration_structure ===\n\n      void vkGetPartitionedAccelerationStructuresBuildSizesNV( VkDevice                                                   device,\n                                                               const VkPartitionedAccelerationStructureInstancesInputNV * pInfo,\n                                                               VkAccelerationStructureBuildSizesInfoKHR *                 pSizeInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPartitionedAccelerationStructuresBuildSizesNV( device, pInfo, pSizeInfo );\n      }\n\n      void vkCmdBuildPartitionedAccelerationStructuresNV( VkCommandBuffer                                       commandBuffer,\n                                                          const VkBuildPartitionedAccelerationStructureInfoNV * pBuildInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdBuildPartitionedAccelerationStructuresNV( commandBuffer, pBuildInfo );\n      }\n\n      //=== VK_EXT_device_generated_commands ===\n\n      void vkGetGeneratedCommandsMemoryRequirementsEXT( VkDevice                                             device,\n                                                        const VkGeneratedCommandsMemoryRequirementsInfoEXT * pInfo,\n                                                        VkMemoryRequirements2 *                              pMemoryRequirements ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetGeneratedCommandsMemoryRequirementsEXT( device, pInfo, pMemoryRequirements );\n      }\n\n      void vkCmdPreprocessGeneratedCommandsEXT( VkCommandBuffer                    commandBuffer,\n                                                const VkGeneratedCommandsInfoEXT * pGeneratedCommandsInfo,\n                                                VkCommandBuffer                    stateCommandBuffer ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdPreprocessGeneratedCommandsEXT( commandBuffer, pGeneratedCommandsInfo, stateCommandBuffer );\n      }\n\n      void vkCmdExecuteGeneratedCommandsEXT( VkCommandBuffer                    commandBuffer,\n                                             VkBool32                           isPreprocessed,\n                                             const VkGeneratedCommandsInfoEXT * pGeneratedCommandsInfo ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCmdExecuteGeneratedCommandsEXT( commandBuffer, isPreprocessed, pGeneratedCommandsInfo );\n      }\n\n      VkResult vkCreateIndirectCommandsLayoutEXT( VkDevice                                      device,\n                                                  const VkIndirectCommandsLayoutCreateInfoEXT * pCreateInfo,\n                                                  const VkAllocationCallbacks *                 pAllocator,\n                                                  VkIndirectCommandsLayoutEXT *                 pIndirectCommandsLayout ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateIndirectCommandsLayoutEXT( device, pCreateInfo, pAllocator, pIndirectCommandsLayout );\n      }\n\n      void vkDestroyIndirectCommandsLayoutEXT( VkDevice                      device,\n                                               VkIndirectCommandsLayoutEXT   indirectCommandsLayout,\n                                               const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyIndirectCommandsLayoutEXT( device, indirectCommandsLayout, pAllocator );\n      }\n\n      VkResult vkCreateIndirectExecutionSetEXT( VkDevice                                    device,\n                                                const VkIndirectExecutionSetCreateInfoEXT * pCreateInfo,\n                                                const VkAllocationCallbacks *               pAllocator,\n                                                VkIndirectExecutionSetEXT *                 pIndirectExecutionSet ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkCreateIndirectExecutionSetEXT( device, pCreateInfo, pAllocator, pIndirectExecutionSet );\n      }\n\n      void vkDestroyIndirectExecutionSetEXT( VkDevice                      device,\n                                             VkIndirectExecutionSetEXT     indirectExecutionSet,\n                                             const VkAllocationCallbacks * pAllocator ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkDestroyIndirectExecutionSetEXT( device, indirectExecutionSet, pAllocator );\n      }\n\n      void vkUpdateIndirectExecutionSetPipelineEXT( VkDevice                                       device,\n                                                    VkIndirectExecutionSetEXT                      indirectExecutionSet,\n                                                    uint32_t                                       executionSetWriteCount,\n                                                    const VkWriteIndirectExecutionSetPipelineEXT * pExecutionSetWrites ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkUpdateIndirectExecutionSetPipelineEXT( device, indirectExecutionSet, executionSetWriteCount, pExecutionSetWrites );\n      }\n\n      void vkUpdateIndirectExecutionSetShaderEXT( VkDevice                                     device,\n                                                  VkIndirectExecutionSetEXT                    indirectExecutionSet,\n                                                  uint32_t                                     executionSetWriteCount,\n                                                  const VkWriteIndirectExecutionSetShaderEXT * pExecutionSetWrites ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkUpdateIndirectExecutionSetShaderEXT( device, indirectExecutionSet, executionSetWriteCount, pExecutionSetWrites );\n      }\n\n      //=== VK_NV_cooperative_matrix2 ===\n\n      VkResult vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV(\n        VkPhysicalDevice physicalDevice, uint32_t * pPropertyCount, VkCooperativeMatrixFlexibleDimensionsPropertiesNV * pProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV( physicalDevice, pPropertyCount, pProperties );\n      }\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n      //=== VK_EXT_external_memory_metal ===\n\n      VkResult\n        vkGetMemoryMetalHandleEXT( VkDevice device, const VkMemoryGetMetalHandleInfoEXT * pGetMetalHandleInfo, void ** pHandle ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetMemoryMetalHandleEXT( device, pGetMetalHandleInfo, pHandle );\n      }\n\n      VkResult vkGetMemoryMetalHandlePropertiesEXT( VkDevice                           device,\n                                                    VkExternalMemoryHandleTypeFlagBits handleType,\n                                                    const void *                       pHandle,\n                                                    VkMemoryMetalHandlePropertiesEXT * pMemoryMetalHandleProperties ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ::vkGetMemoryMetalHandlePropertiesEXT( device, handleType, pHandle, pMemoryMetalHandleProperties );\n      }\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n    };\n\n    inline DispatchLoaderStatic & getDispatchLoaderStatic()\n    {\n      static DispatchLoaderStatic dls;\n      return dls;\n    }\n#endif\n\n  }  // namespace detail\n#if ( 14 <= VULKAN_HPP_CPP_VERSION )\n  using std::exchange;\n#else\n  template <class T, class U = T>\n  VULKAN_HPP_CONSTEXPR_14 VULKAN_HPP_INLINE T exchange( T & obj, U && newValue )\n  {\n    T oldValue = std::move( obj );\n    obj        = std::forward<U>( newValue );\n    return oldValue;\n  }\n#endif\n\n#if !defined( VULKAN_HPP_NO_SMART_HANDLE )\n  struct AllocationCallbacks;\n\n  namespace detail\n  {\n    template <typename OwnerType, typename Dispatch>\n    class ObjectDestroy\n    {\n    public:\n      ObjectDestroy() = default;\n\n      ObjectDestroy( OwnerType                                                   owner,\n                     Optional<const vk::AllocationCallbacks> allocationCallbacks VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                     Dispatch const & dispatch                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) VULKAN_HPP_NOEXCEPT\n        : m_owner( owner )\n        , m_allocationCallbacks( allocationCallbacks )\n        , m_dispatch( &dispatch )\n      {\n      }\n\n      OwnerType getOwner() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_owner;\n      }\n\n      Optional<const vk::AllocationCallbacks> getAllocator() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_allocationCallbacks;\n      }\n\n      Dispatch const & getDispatch() const VULKAN_HPP_NOEXCEPT\n      {\n        return *m_dispatch;\n      }\n\n    protected:\n      template <typename T>\n      void destroy( T t ) VULKAN_HPP_NOEXCEPT\n      {\n        VULKAN_HPP_ASSERT( m_owner && m_dispatch );\n        m_owner.destroy( t, m_allocationCallbacks, *m_dispatch );\n      }\n\n    private:\n      OwnerType                               m_owner               = {};\n      Optional<const vk::AllocationCallbacks> m_allocationCallbacks = nullptr;\n      Dispatch const *                        m_dispatch            = nullptr;\n    };\n\n    class NoParent;\n\n    template <typename Dispatch>\n    class ObjectDestroy<NoParent, Dispatch>\n    {\n    public:\n      ObjectDestroy() = default;\n\n      ObjectDestroy( Optional<const vk::AllocationCallbacks> allocationCallbacks,\n                     Dispatch const & dispatch               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) VULKAN_HPP_NOEXCEPT\n        : m_allocationCallbacks( allocationCallbacks )\n        , m_dispatch( &dispatch )\n      {\n      }\n\n      Optional<const vk::AllocationCallbacks> getAllocator() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_allocationCallbacks;\n      }\n\n      Dispatch const & getDispatch() const VULKAN_HPP_NOEXCEPT\n      {\n        return *m_dispatch;\n      }\n\n    protected:\n      template <typename T>\n      void destroy( T t ) VULKAN_HPP_NOEXCEPT\n      {\n        VULKAN_HPP_ASSERT( m_dispatch );\n        t.destroy( m_allocationCallbacks, *m_dispatch );\n      }\n\n    private:\n      Optional<const vk::AllocationCallbacks> m_allocationCallbacks = nullptr;\n      Dispatch const *                        m_dispatch            = nullptr;\n    };\n\n    template <typename OwnerType, typename Dispatch>\n    class ObjectFree\n    {\n    public:\n      ObjectFree() = default;\n\n      ObjectFree( OwnerType                                               owner,\n                  Optional<const AllocationCallbacks> allocationCallbacks VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & dispatch                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) VULKAN_HPP_NOEXCEPT\n        : m_owner( owner )\n        , m_allocationCallbacks( allocationCallbacks )\n        , m_dispatch( &dispatch )\n      {\n      }\n\n      OwnerType getOwner() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_owner;\n      }\n\n      Optional<const AllocationCallbacks> getAllocator() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_allocationCallbacks;\n      }\n\n      Dispatch const & getDispatch() const VULKAN_HPP_NOEXCEPT\n      {\n        return *m_dispatch;\n      }\n\n    protected:\n      template <typename T>\n      void destroy( T t ) VULKAN_HPP_NOEXCEPT\n      {\n        VULKAN_HPP_ASSERT( m_owner && m_dispatch );\n        ( m_owner.free )( t, m_allocationCallbacks, *m_dispatch );\n      }\n\n    private:\n      OwnerType                           m_owner               = {};\n      Optional<const AllocationCallbacks> m_allocationCallbacks = nullptr;\n      Dispatch const *                    m_dispatch            = nullptr;\n    };\n\n    template <typename OwnerType, typename Dispatch>\n    class ObjectRelease\n    {\n    public:\n      ObjectRelease() = default;\n\n      ObjectRelease( OwnerType owner, Dispatch const & dispatch VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) VULKAN_HPP_NOEXCEPT\n        : m_owner( owner )\n        , m_dispatch( &dispatch )\n      {\n      }\n\n      OwnerType getOwner() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_owner;\n      }\n\n      Dispatch const & getDispatch() const VULKAN_HPP_NOEXCEPT\n      {\n        return *m_dispatch;\n      }\n\n    protected:\n      template <typename T>\n      void destroy( T t ) VULKAN_HPP_NOEXCEPT\n      {\n        VULKAN_HPP_ASSERT( m_owner && m_dispatch );\n        m_owner.release( t, *m_dispatch );\n      }\n\n    private:\n      OwnerType        m_owner    = {};\n      Dispatch const * m_dispatch = nullptr;\n    };\n\n    template <typename OwnerType, typename PoolType, typename Dispatch>\n    class PoolFree\n    {\n    public:\n      PoolFree() = default;\n\n      PoolFree( OwnerType owner, PoolType pool, Dispatch const & dispatch VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) VULKAN_HPP_NOEXCEPT\n        : m_owner( owner )\n        , m_pool( pool )\n        , m_dispatch( &dispatch )\n      {\n      }\n\n      OwnerType getOwner() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_owner;\n      }\n\n      PoolType getPool() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_pool;\n      }\n\n      Dispatch const & getDispatch() const VULKAN_HPP_NOEXCEPT\n      {\n        return *m_dispatch;\n      }\n\n    protected:\n      template <typename T>\n      void destroy( T t ) VULKAN_HPP_NOEXCEPT\n      {\n        ( m_owner.free )( m_pool, t, *m_dispatch );\n      }\n\n    private:\n      OwnerType        m_owner    = OwnerType();\n      PoolType         m_pool     = PoolType();\n      Dispatch const * m_dispatch = nullptr;\n    };\n\n  }     // namespace detail\n#endif  // !VULKAN_HPP_NO_SMART_HANDLE\n\n  //==================\n  //=== BASE TYPEs ===\n  //==================\n\n  using Bool32          = uint32_t;\n  using DeviceAddress   = uint64_t;\n  using DeviceSize      = uint64_t;\n  using RemoteAddressNV = void *;\n  using SampleMask      = uint32_t;\n\n  template <typename Type, Type value = Type{}>\n  struct CppType\n  {\n  };\n}  // namespace VULKAN_HPP_NAMESPACE\n\n#include <vulkan/vulkan_enums.hpp>\n#if !defined( VULKAN_HPP_NO_TO_STRING )\n#  include <vulkan/vulkan_to_string.hpp>\n#endif\n\n#ifndef VULKAN_HPP_NO_EXCEPTIONS\nnamespace std\n{\n  template <>\n  struct is_error_code_enum<VULKAN_HPP_NAMESPACE::Result> : public true_type\n  {\n  };\n}  // namespace std\n#endif\n\nnamespace VULKAN_HPP_NAMESPACE\n{\n#ifndef VULKAN_HPP_NO_EXCEPTIONS\n  class ErrorCategoryImpl : public std::error_category\n  {\n  public:\n    virtual const char * name() const VULKAN_HPP_NOEXCEPT override\n    {\n      return VULKAN_HPP_NAMESPACE_STRING \"::Result\";\n    }\n\n    virtual std::string message( int ev ) const override\n    {\n#  if defined( VULKAN_HPP_NO_TO_STRING )\n      return std::to_string( ev );\n#  else\n      return VULKAN_HPP_NAMESPACE::to_string( static_cast<VULKAN_HPP_NAMESPACE::Result>( ev ) );\n#  endif\n    }\n  };\n\n  class Error\n  {\n  public:\n    Error() VULKAN_HPP_NOEXCEPT                = default;\n    Error( const Error & ) VULKAN_HPP_NOEXCEPT = default;\n    virtual ~Error() VULKAN_HPP_NOEXCEPT       = default;\n\n    virtual const char * what() const VULKAN_HPP_NOEXCEPT = 0;\n  };\n\n  class LogicError\n    : public Error\n    , public std::logic_error\n  {\n  public:\n    explicit LogicError( const std::string & what ) : Error(), std::logic_error( what ) {}\n\n    explicit LogicError( char const * what ) : Error(), std::logic_error( what ) {}\n\n    virtual const char * what() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::logic_error::what();\n    }\n  };\n\n  class SystemError\n    : public Error\n    , public std::system_error\n  {\n  public:\n    SystemError( std::error_code ec ) : Error(), std::system_error( ec ) {}\n\n    SystemError( std::error_code ec, std::string const & what ) : Error(), std::system_error( ec, what ) {}\n\n    SystemError( std::error_code ec, char const * what ) : Error(), std::system_error( ec, what ) {}\n\n    SystemError( int ev, std::error_category const & ecat ) : Error(), std::system_error( ev, ecat ) {}\n\n    SystemError( int ev, std::error_category const & ecat, std::string const & what ) : Error(), std::system_error( ev, ecat, what ) {}\n\n    SystemError( int ev, std::error_category const & ecat, char const * what ) : Error(), std::system_error( ev, ecat, what ) {}\n\n    virtual const char * what() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::system_error::what();\n    }\n  };\n\n  VULKAN_HPP_INLINE const std::error_category & errorCategory() VULKAN_HPP_NOEXCEPT\n  {\n    static ErrorCategoryImpl instance;\n    return instance;\n  }\n\n  VULKAN_HPP_INLINE std::error_code make_error_code( Result e ) VULKAN_HPP_NOEXCEPT\n  {\n    return std::error_code( static_cast<int>( e ), errorCategory() );\n  }\n\n  VULKAN_HPP_INLINE std::error_condition make_error_condition( Result e ) VULKAN_HPP_NOEXCEPT\n  {\n    return std::error_condition( static_cast<int>( e ), errorCategory() );\n  }\n\n  class OutOfHostMemoryError : public SystemError\n  {\n  public:\n    OutOfHostMemoryError( std::string const & message ) : SystemError( make_error_code( Result::eErrorOutOfHostMemory ), message ) {}\n\n    OutOfHostMemoryError( char const * message ) : SystemError( make_error_code( Result::eErrorOutOfHostMemory ), message ) {}\n  };\n\n  class OutOfDeviceMemoryError : public SystemError\n  {\n  public:\n    OutOfDeviceMemoryError( std::string const & message ) : SystemError( make_error_code( Result::eErrorOutOfDeviceMemory ), message ) {}\n\n    OutOfDeviceMemoryError( char const * message ) : SystemError( make_error_code( Result::eErrorOutOfDeviceMemory ), message ) {}\n  };\n\n  class InitializationFailedError : public SystemError\n  {\n  public:\n    InitializationFailedError( std::string const & message ) : SystemError( make_error_code( Result::eErrorInitializationFailed ), message ) {}\n\n    InitializationFailedError( char const * message ) : SystemError( make_error_code( Result::eErrorInitializationFailed ), message ) {}\n  };\n\n  class DeviceLostError : public SystemError\n  {\n  public:\n    DeviceLostError( std::string const & message ) : SystemError( make_error_code( Result::eErrorDeviceLost ), message ) {}\n\n    DeviceLostError( char const * message ) : SystemError( make_error_code( Result::eErrorDeviceLost ), message ) {}\n  };\n\n  class MemoryMapFailedError : public SystemError\n  {\n  public:\n    MemoryMapFailedError( std::string const & message ) : SystemError( make_error_code( Result::eErrorMemoryMapFailed ), message ) {}\n\n    MemoryMapFailedError( char const * message ) : SystemError( make_error_code( Result::eErrorMemoryMapFailed ), message ) {}\n  };\n\n  class LayerNotPresentError : public SystemError\n  {\n  public:\n    LayerNotPresentError( std::string const & message ) : SystemError( make_error_code( Result::eErrorLayerNotPresent ), message ) {}\n\n    LayerNotPresentError( char const * message ) : SystemError( make_error_code( Result::eErrorLayerNotPresent ), message ) {}\n  };\n\n  class ExtensionNotPresentError : public SystemError\n  {\n  public:\n    ExtensionNotPresentError( std::string const & message ) : SystemError( make_error_code( Result::eErrorExtensionNotPresent ), message ) {}\n\n    ExtensionNotPresentError( char const * message ) : SystemError( make_error_code( Result::eErrorExtensionNotPresent ), message ) {}\n  };\n\n  class FeatureNotPresentError : public SystemError\n  {\n  public:\n    FeatureNotPresentError( std::string const & message ) : SystemError( make_error_code( Result::eErrorFeatureNotPresent ), message ) {}\n\n    FeatureNotPresentError( char const * message ) : SystemError( make_error_code( Result::eErrorFeatureNotPresent ), message ) {}\n  };\n\n  class IncompatibleDriverError : public SystemError\n  {\n  public:\n    IncompatibleDriverError( std::string const & message ) : SystemError( make_error_code( Result::eErrorIncompatibleDriver ), message ) {}\n\n    IncompatibleDriverError( char const * message ) : SystemError( make_error_code( Result::eErrorIncompatibleDriver ), message ) {}\n  };\n\n  class TooManyObjectsError : public SystemError\n  {\n  public:\n    TooManyObjectsError( std::string const & message ) : SystemError( make_error_code( Result::eErrorTooManyObjects ), message ) {}\n\n    TooManyObjectsError( char const * message ) : SystemError( make_error_code( Result::eErrorTooManyObjects ), message ) {}\n  };\n\n  class FormatNotSupportedError : public SystemError\n  {\n  public:\n    FormatNotSupportedError( std::string const & message ) : SystemError( make_error_code( Result::eErrorFormatNotSupported ), message ) {}\n\n    FormatNotSupportedError( char const * message ) : SystemError( make_error_code( Result::eErrorFormatNotSupported ), message ) {}\n  };\n\n  class FragmentedPoolError : public SystemError\n  {\n  public:\n    FragmentedPoolError( std::string const & message ) : SystemError( make_error_code( Result::eErrorFragmentedPool ), message ) {}\n\n    FragmentedPoolError( char const * message ) : SystemError( make_error_code( Result::eErrorFragmentedPool ), message ) {}\n  };\n\n  class UnknownError : public SystemError\n  {\n  public:\n    UnknownError( std::string const & message ) : SystemError( make_error_code( Result::eErrorUnknown ), message ) {}\n\n    UnknownError( char const * message ) : SystemError( make_error_code( Result::eErrorUnknown ), message ) {}\n  };\n\n  class OutOfPoolMemoryError : public SystemError\n  {\n  public:\n    OutOfPoolMemoryError( std::string const & message ) : SystemError( make_error_code( Result::eErrorOutOfPoolMemory ), message ) {}\n\n    OutOfPoolMemoryError( char const * message ) : SystemError( make_error_code( Result::eErrorOutOfPoolMemory ), message ) {}\n  };\n\n  class InvalidExternalHandleError : public SystemError\n  {\n  public:\n    InvalidExternalHandleError( std::string const & message ) : SystemError( make_error_code( Result::eErrorInvalidExternalHandle ), message ) {}\n\n    InvalidExternalHandleError( char const * message ) : SystemError( make_error_code( Result::eErrorInvalidExternalHandle ), message ) {}\n  };\n\n  class FragmentationError : public SystemError\n  {\n  public:\n    FragmentationError( std::string const & message ) : SystemError( make_error_code( Result::eErrorFragmentation ), message ) {}\n\n    FragmentationError( char const * message ) : SystemError( make_error_code( Result::eErrorFragmentation ), message ) {}\n  };\n\n  class InvalidOpaqueCaptureAddressError : public SystemError\n  {\n  public:\n    InvalidOpaqueCaptureAddressError( std::string const & message ) : SystemError( make_error_code( Result::eErrorInvalidOpaqueCaptureAddress ), message ) {}\n\n    InvalidOpaqueCaptureAddressError( char const * message ) : SystemError( make_error_code( Result::eErrorInvalidOpaqueCaptureAddress ), message ) {}\n  };\n\n  class NotPermittedError : public SystemError\n  {\n  public:\n    NotPermittedError( std::string const & message ) : SystemError( make_error_code( Result::eErrorNotPermitted ), message ) {}\n\n    NotPermittedError( char const * message ) : SystemError( make_error_code( Result::eErrorNotPermitted ), message ) {}\n  };\n\n  class SurfaceLostKHRError : public SystemError\n  {\n  public:\n    SurfaceLostKHRError( std::string const & message ) : SystemError( make_error_code( Result::eErrorSurfaceLostKHR ), message ) {}\n\n    SurfaceLostKHRError( char const * message ) : SystemError( make_error_code( Result::eErrorSurfaceLostKHR ), message ) {}\n  };\n\n  class NativeWindowInUseKHRError : public SystemError\n  {\n  public:\n    NativeWindowInUseKHRError( std::string const & message ) : SystemError( make_error_code( Result::eErrorNativeWindowInUseKHR ), message ) {}\n\n    NativeWindowInUseKHRError( char const * message ) : SystemError( make_error_code( Result::eErrorNativeWindowInUseKHR ), message ) {}\n  };\n\n  class OutOfDateKHRError : public SystemError\n  {\n  public:\n    OutOfDateKHRError( std::string const & message ) : SystemError( make_error_code( Result::eErrorOutOfDateKHR ), message ) {}\n\n    OutOfDateKHRError( char const * message ) : SystemError( make_error_code( Result::eErrorOutOfDateKHR ), message ) {}\n  };\n\n  class IncompatibleDisplayKHRError : public SystemError\n  {\n  public:\n    IncompatibleDisplayKHRError( std::string const & message ) : SystemError( make_error_code( Result::eErrorIncompatibleDisplayKHR ), message ) {}\n\n    IncompatibleDisplayKHRError( char const * message ) : SystemError( make_error_code( Result::eErrorIncompatibleDisplayKHR ), message ) {}\n  };\n\n  class ValidationFailedEXTError : public SystemError\n  {\n  public:\n    ValidationFailedEXTError( std::string const & message ) : SystemError( make_error_code( Result::eErrorValidationFailedEXT ), message ) {}\n\n    ValidationFailedEXTError( char const * message ) : SystemError( make_error_code( Result::eErrorValidationFailedEXT ), message ) {}\n  };\n\n  class InvalidShaderNVError : public SystemError\n  {\n  public:\n    InvalidShaderNVError( std::string const & message ) : SystemError( make_error_code( Result::eErrorInvalidShaderNV ), message ) {}\n\n    InvalidShaderNVError( char const * message ) : SystemError( make_error_code( Result::eErrorInvalidShaderNV ), message ) {}\n  };\n\n  class ImageUsageNotSupportedKHRError : public SystemError\n  {\n  public:\n    ImageUsageNotSupportedKHRError( std::string const & message ) : SystemError( make_error_code( Result::eErrorImageUsageNotSupportedKHR ), message ) {}\n\n    ImageUsageNotSupportedKHRError( char const * message ) : SystemError( make_error_code( Result::eErrorImageUsageNotSupportedKHR ), message ) {}\n  };\n\n  class VideoPictureLayoutNotSupportedKHRError : public SystemError\n  {\n  public:\n    VideoPictureLayoutNotSupportedKHRError( std::string const & message )\n      : SystemError( make_error_code( Result::eErrorVideoPictureLayoutNotSupportedKHR ), message )\n    {\n    }\n\n    VideoPictureLayoutNotSupportedKHRError( char const * message ) : SystemError( make_error_code( Result::eErrorVideoPictureLayoutNotSupportedKHR ), message )\n    {\n    }\n  };\n\n  class VideoProfileOperationNotSupportedKHRError : public SystemError\n  {\n  public:\n    VideoProfileOperationNotSupportedKHRError( std::string const & message )\n      : SystemError( make_error_code( Result::eErrorVideoProfileOperationNotSupportedKHR ), message )\n    {\n    }\n\n    VideoProfileOperationNotSupportedKHRError( char const * message )\n      : SystemError( make_error_code( Result::eErrorVideoProfileOperationNotSupportedKHR ), message )\n    {\n    }\n  };\n\n  class VideoProfileFormatNotSupportedKHRError : public SystemError\n  {\n  public:\n    VideoProfileFormatNotSupportedKHRError( std::string const & message )\n      : SystemError( make_error_code( Result::eErrorVideoProfileFormatNotSupportedKHR ), message )\n    {\n    }\n\n    VideoProfileFormatNotSupportedKHRError( char const * message ) : SystemError( make_error_code( Result::eErrorVideoProfileFormatNotSupportedKHR ), message )\n    {\n    }\n  };\n\n  class VideoProfileCodecNotSupportedKHRError : public SystemError\n  {\n  public:\n    VideoProfileCodecNotSupportedKHRError( std::string const & message )\n      : SystemError( make_error_code( Result::eErrorVideoProfileCodecNotSupportedKHR ), message )\n    {\n    }\n\n    VideoProfileCodecNotSupportedKHRError( char const * message ) : SystemError( make_error_code( Result::eErrorVideoProfileCodecNotSupportedKHR ), message ) {}\n  };\n\n  class VideoStdVersionNotSupportedKHRError : public SystemError\n  {\n  public:\n    VideoStdVersionNotSupportedKHRError( std::string const & message ) : SystemError( make_error_code( Result::eErrorVideoStdVersionNotSupportedKHR ), message )\n    {\n    }\n\n    VideoStdVersionNotSupportedKHRError( char const * message ) : SystemError( make_error_code( Result::eErrorVideoStdVersionNotSupportedKHR ), message ) {}\n  };\n\n  class InvalidDrmFormatModifierPlaneLayoutEXTError : public SystemError\n  {\n  public:\n    InvalidDrmFormatModifierPlaneLayoutEXTError( std::string const & message )\n      : SystemError( make_error_code( Result::eErrorInvalidDrmFormatModifierPlaneLayoutEXT ), message )\n    {\n    }\n\n    InvalidDrmFormatModifierPlaneLayoutEXTError( char const * message )\n      : SystemError( make_error_code( Result::eErrorInvalidDrmFormatModifierPlaneLayoutEXT ), message )\n    {\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  class FullScreenExclusiveModeLostEXTError : public SystemError\n  {\n  public:\n    FullScreenExclusiveModeLostEXTError( std::string const & message ) : SystemError( make_error_code( Result::eErrorFullScreenExclusiveModeLostEXT ), message )\n    {\n    }\n\n    FullScreenExclusiveModeLostEXTError( char const * message ) : SystemError( make_error_code( Result::eErrorFullScreenExclusiveModeLostEXT ), message ) {}\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  class InvalidVideoStdParametersKHRError : public SystemError\n  {\n  public:\n    InvalidVideoStdParametersKHRError( std::string const & message ) : SystemError( make_error_code( Result::eErrorInvalidVideoStdParametersKHR ), message ) {}\n\n    InvalidVideoStdParametersKHRError( char const * message ) : SystemError( make_error_code( Result::eErrorInvalidVideoStdParametersKHR ), message ) {}\n  };\n\n  class CompressionExhaustedEXTError : public SystemError\n  {\n  public:\n    CompressionExhaustedEXTError( std::string const & message ) : SystemError( make_error_code( Result::eErrorCompressionExhaustedEXT ), message ) {}\n\n    CompressionExhaustedEXTError( char const * message ) : SystemError( make_error_code( Result::eErrorCompressionExhaustedEXT ), message ) {}\n  };\n\n  class NotEnoughSpaceKHRError : public SystemError\n  {\n  public:\n    NotEnoughSpaceKHRError( std::string const & message ) : SystemError( make_error_code( Result::eErrorNotEnoughSpaceKHR ), message ) {}\n\n    NotEnoughSpaceKHRError( char const * message ) : SystemError( make_error_code( Result::eErrorNotEnoughSpaceKHR ), message ) {}\n  };\n\n  namespace detail\n  {\n    [[noreturn]] VULKAN_HPP_INLINE void throwResultException( Result result, char const * message )\n    {\n      switch ( result )\n      {\n        case Result::eErrorOutOfHostMemory: throw OutOfHostMemoryError( message );\n        case Result::eErrorOutOfDeviceMemory: throw OutOfDeviceMemoryError( message );\n        case Result::eErrorInitializationFailed: throw InitializationFailedError( message );\n        case Result::eErrorDeviceLost: throw DeviceLostError( message );\n        case Result::eErrorMemoryMapFailed: throw MemoryMapFailedError( message );\n        case Result::eErrorLayerNotPresent: throw LayerNotPresentError( message );\n        case Result::eErrorExtensionNotPresent: throw ExtensionNotPresentError( message );\n        case Result::eErrorFeatureNotPresent: throw FeatureNotPresentError( message );\n        case Result::eErrorIncompatibleDriver: throw IncompatibleDriverError( message );\n        case Result::eErrorTooManyObjects: throw TooManyObjectsError( message );\n        case Result::eErrorFormatNotSupported: throw FormatNotSupportedError( message );\n        case Result::eErrorFragmentedPool: throw FragmentedPoolError( message );\n        case Result::eErrorUnknown: throw UnknownError( message );\n        case Result::eErrorOutOfPoolMemory: throw OutOfPoolMemoryError( message );\n        case Result::eErrorInvalidExternalHandle: throw InvalidExternalHandleError( message );\n        case Result::eErrorFragmentation: throw FragmentationError( message );\n        case Result::eErrorInvalidOpaqueCaptureAddress: throw InvalidOpaqueCaptureAddressError( message );\n        case Result::eErrorNotPermitted: throw NotPermittedError( message );\n        case Result::eErrorSurfaceLostKHR: throw SurfaceLostKHRError( message );\n        case Result::eErrorNativeWindowInUseKHR: throw NativeWindowInUseKHRError( message );\n        case Result::eErrorOutOfDateKHR: throw OutOfDateKHRError( message );\n        case Result::eErrorIncompatibleDisplayKHR: throw IncompatibleDisplayKHRError( message );\n        case Result::eErrorValidationFailedEXT: throw ValidationFailedEXTError( message );\n        case Result::eErrorInvalidShaderNV: throw InvalidShaderNVError( message );\n        case Result::eErrorImageUsageNotSupportedKHR: throw ImageUsageNotSupportedKHRError( message );\n        case Result::eErrorVideoPictureLayoutNotSupportedKHR: throw VideoPictureLayoutNotSupportedKHRError( message );\n        case Result::eErrorVideoProfileOperationNotSupportedKHR: throw VideoProfileOperationNotSupportedKHRError( message );\n        case Result::eErrorVideoProfileFormatNotSupportedKHR: throw VideoProfileFormatNotSupportedKHRError( message );\n        case Result::eErrorVideoProfileCodecNotSupportedKHR: throw VideoProfileCodecNotSupportedKHRError( message );\n        case Result::eErrorVideoStdVersionNotSupportedKHR: throw VideoStdVersionNotSupportedKHRError( message );\n        case Result::eErrorInvalidDrmFormatModifierPlaneLayoutEXT: throw InvalidDrmFormatModifierPlaneLayoutEXTError( message );\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n        case Result::eErrorFullScreenExclusiveModeLostEXT: throw FullScreenExclusiveModeLostEXTError( message );\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n        case Result::eErrorInvalidVideoStdParametersKHR: throw InvalidVideoStdParametersKHRError( message );\n        case Result::eErrorCompressionExhaustedEXT: throw CompressionExhaustedEXTError( message );\n        case Result::eErrorNotEnoughSpaceKHR: throw NotEnoughSpaceKHRError( message );\n        default: throw SystemError( make_error_code( result ), message );\n      }\n    }\n  }  // namespace detail\n#endif\n\n  template <typename T>\n  struct ResultValue\n  {\n#ifdef VULKAN_HPP_HAS_NOEXCEPT\n    ResultValue( Result r, T & v ) VULKAN_HPP_NOEXCEPT( VULKAN_HPP_NOEXCEPT( T( v ) ) )\n#else\n    ResultValue( Result r, T & v )\n#endif\n      : result( r ), value( v )\n    {\n    }\n\n#ifdef VULKAN_HPP_HAS_NOEXCEPT\n    ResultValue( Result r, T && v ) VULKAN_HPP_NOEXCEPT( VULKAN_HPP_NOEXCEPT( T( std::move( v ) ) ) )\n#else\n    ResultValue( Result r, T && v )\n#endif\n      : result( r ), value( std::move( v ) )\n    {\n    }\n\n    Result result;\n    T      value;\n\n    operator std::tuple<Result &, T &>() VULKAN_HPP_NOEXCEPT\n    {\n      return std::tuple<Result &, T &>( result, value );\n    }\n  };\n\n#if !defined( VULKAN_HPP_NO_SMART_HANDLE )\n  template <typename Type, typename Dispatch>\n  struct ResultValue<UniqueHandle<Type, Dispatch>>\n  {\n#  ifdef VULKAN_HPP_HAS_NOEXCEPT\n    ResultValue( Result r, UniqueHandle<Type, Dispatch> && v ) VULKAN_HPP_NOEXCEPT\n#  else\n    ResultValue( Result r, UniqueHandle<Type, Dispatch> && v )\n#  endif\n      : result( r )\n      , value( std::move( v ) )\n    {\n    }\n\n    VULKAN_HPP_DEPRECATED(\n      \"asTuple() on an l-value is deprecated, as it implicitly moves the UniqueHandle out of the ResultValue. Use asTuple() on an r-value instead, requiring to explicitly move the UniqueHandle.\" )\n\n    std::tuple<Result, UniqueHandle<Type, Dispatch>> asTuple() &\n    {\n      return std::make_tuple( result, std::move( value ) );\n    }\n\n    std::tuple<Result, UniqueHandle<Type, Dispatch>> asTuple() &&\n    {\n      return std::make_tuple( result, std::move( value ) );\n    }\n\n    Result                       result;\n    UniqueHandle<Type, Dispatch> value;\n  };\n\n  template <typename Type, typename Dispatch>\n  struct ResultValue<std::vector<UniqueHandle<Type, Dispatch>>>\n  {\n#  ifdef VULKAN_HPP_HAS_NOEXCEPT\n    ResultValue( Result r, std::vector<UniqueHandle<Type, Dispatch>> && v ) VULKAN_HPP_NOEXCEPT\n#  else\n    ResultValue( Result r, std::vector<UniqueHandle<Type, Dispatch>> && v )\n#  endif\n      : result( r )\n      , value( std::move( v ) )\n    {\n    }\n\n    VULKAN_HPP_DEPRECATED(\n      \"asTuple() on an l-value is deprecated, as it implicitly moves the UniqueHandle out of the ResultValue. Use asTuple() on an r-value instead, requiring to explicitly move the UniqueHandle.\" )\n\n    std::tuple<Result, std::vector<UniqueHandle<Type, Dispatch>>> asTuple() &\n    {\n      return std::make_tuple( result, std::move( value ) );\n    }\n\n    std::tuple<Result, std::vector<UniqueHandle<Type, Dispatch>>> asTuple() &&\n    {\n      return std::make_tuple( result, std::move( value ) );\n    }\n\n    Result                                    result;\n    std::vector<UniqueHandle<Type, Dispatch>> value;\n  };\n#endif\n\n  template <typename T>\n  struct ResultValueType\n  {\n#ifdef VULKAN_HPP_NO_EXCEPTIONS\n    using type = ResultValue<T>;\n#else\n    using type = T;\n#endif\n  };\n\n  template <>\n  struct ResultValueType<void>\n  {\n#ifdef VULKAN_HPP_NO_EXCEPTIONS\n    using type = Result;\n#else\n    using type = void;\n#endif\n  };\n\n  namespace detail\n  {\n    template <typename T>\n    void ignore( T const & ) VULKAN_HPP_NOEXCEPT\n    {\n    }\n\n    VULKAN_HPP_INLINE typename VULKAN_HPP_NAMESPACE::ResultValueType<void>::type createResultValueType( VULKAN_HPP_NAMESPACE::Result result )\n    {\n#ifdef VULKAN_HPP_NO_EXCEPTIONS\n      return result;\n#else\n      VULKAN_HPP_NAMESPACE::detail::ignore( result );\n#endif\n    }\n\n    template <typename T>\n    VULKAN_HPP_INLINE typename VULKAN_HPP_NAMESPACE::ResultValueType<T>::type createResultValueType( VULKAN_HPP_NAMESPACE::Result result, T & data )\n    {\n#ifdef VULKAN_HPP_NO_EXCEPTIONS\n      return ResultValue<T>( result, data );\n#else\n      VULKAN_HPP_NAMESPACE::detail::ignore( result );\n      return data;\n#endif\n    }\n\n    template <typename T>\n    VULKAN_HPP_INLINE typename VULKAN_HPP_NAMESPACE::ResultValueType<T>::type createResultValueType( VULKAN_HPP_NAMESPACE::Result result, T && data )\n    {\n#ifdef VULKAN_HPP_NO_EXCEPTIONS\n      return ResultValue<T>( result, std::move( data ) );\n#else\n      VULKAN_HPP_NAMESPACE::detail::ignore( result );\n      return std::move( data );\n#endif\n    }\n  }  // namespace detail\n\n  namespace detail\n  {\n    VULKAN_HPP_INLINE void resultCheck( Result result, char const * message )\n    {\n#ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_NAMESPACE::detail::ignore( result );  // just in case VULKAN_HPP_ASSERT_ON_RESULT is empty\n      VULKAN_HPP_NAMESPACE::detail::ignore( message );\n      VULKAN_HPP_ASSERT_ON_RESULT( result == Result::eSuccess );\n#else\n      if ( result != Result::eSuccess )\n      {\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, message );\n      }\n#endif\n    }\n\n    VULKAN_HPP_INLINE void resultCheck( Result result, char const * message, std::initializer_list<Result> successCodes )\n    {\n#ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_NAMESPACE::detail::ignore( result );  // just in case VULKAN_HPP_ASSERT_ON_RESULT is empty\n      VULKAN_HPP_NAMESPACE::detail::ignore( message );\n      VULKAN_HPP_NAMESPACE::detail::ignore( successCodes );  // just in case VULKAN_HPP_ASSERT_ON_RESULT is empty\n      VULKAN_HPP_ASSERT_ON_RESULT( std::find( successCodes.begin(), successCodes.end(), result ) != successCodes.end() );\n#else\n      if ( std::find( successCodes.begin(), successCodes.end(), result ) == successCodes.end() )\n      {\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, message );\n      }\n#endif\n    }\n  }  // namespace detail\n\n  //===========================\n  //=== CONSTEXPR CONSTANTs ===\n  //===========================\n\n  //=== VK_VERSION_1_0 ===\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t AttachmentUnused          = VK_ATTACHMENT_UNUSED;\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t False                     = VK_FALSE;\n  VULKAN_HPP_CONSTEXPR_INLINE float    LodClampNone              = VK_LOD_CLAMP_NONE;\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t QueueFamilyIgnored        = VK_QUEUE_FAMILY_IGNORED;\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t RemainingArrayLayers      = VK_REMAINING_ARRAY_LAYERS;\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t RemainingMipLevels        = VK_REMAINING_MIP_LEVELS;\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t SubpassExternal           = VK_SUBPASS_EXTERNAL;\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t True                      = VK_TRUE;\n  VULKAN_HPP_CONSTEXPR_INLINE uint64_t WholeSize                 = VK_WHOLE_SIZE;\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t MaxMemoryTypes            = VK_MAX_MEMORY_TYPES;\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t MaxPhysicalDeviceNameSize = VK_MAX_PHYSICAL_DEVICE_NAME_SIZE;\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t UuidSize                  = VK_UUID_SIZE;\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t MaxExtensionNameSize      = VK_MAX_EXTENSION_NAME_SIZE;\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t MaxDescriptionSize        = VK_MAX_DESCRIPTION_SIZE;\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t MaxMemoryHeaps            = VK_MAX_MEMORY_HEAPS;\n\n  //=== VK_VERSION_1_1 ===\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t MaxDeviceGroupSize  = VK_MAX_DEVICE_GROUP_SIZE;\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t LuidSize            = VK_LUID_SIZE;\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t QueueFamilyExternal = VK_QUEUE_FAMILY_EXTERNAL;\n\n  //=== VK_VERSION_1_2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t MaxDriverNameSize = VK_MAX_DRIVER_NAME_SIZE;\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t MaxDriverInfoSize = VK_MAX_DRIVER_INFO_SIZE;\n\n  //=== VK_VERSION_1_4 ===\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t MaxGlobalPrioritySize = VK_MAX_GLOBAL_PRIORITY_SIZE;\n\n  //=== VK_KHR_device_group_creation ===\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t MaxDeviceGroupSizeKHR = VK_MAX_DEVICE_GROUP_SIZE_KHR;\n\n  //=== VK_KHR_external_memory_capabilities ===\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t LuidSizeKHR = VK_LUID_SIZE_KHR;\n\n  //=== VK_KHR_external_memory ===\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t QueueFamilyExternalKHR = VK_QUEUE_FAMILY_EXTERNAL_KHR;\n\n  //=== VK_EXT_queue_family_foreign ===\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t QueueFamilyForeignEXT = VK_QUEUE_FAMILY_FOREIGN_EXT;\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  //=== VK_AMDX_shader_enqueue ===\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t ShaderIndexUnusedAMDX = VK_SHADER_INDEX_UNUSED_AMDX;\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  //=== VK_KHR_ray_tracing_pipeline ===\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t ShaderUnusedKHR = VK_SHADER_UNUSED_KHR;\n\n  //=== VK_NV_ray_tracing ===\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t ShaderUnusedNV = VK_SHADER_UNUSED_NV;\n\n  //=== VK_KHR_global_priority ===\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t MaxGlobalPrioritySizeKHR = VK_MAX_GLOBAL_PRIORITY_SIZE_KHR;\n\n  //=== VK_KHR_driver_properties ===\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t MaxDriverNameSizeKHR = VK_MAX_DRIVER_NAME_SIZE_KHR;\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t MaxDriverInfoSizeKHR = VK_MAX_DRIVER_INFO_SIZE_KHR;\n\n  //=== VK_EXT_global_priority_query ===\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t MaxGlobalPrioritySizeEXT = VK_MAX_GLOBAL_PRIORITY_SIZE_EXT;\n\n  //=== VK_EXT_image_sliced_view_of_3d ===\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t Remaining3DSlicesEXT = VK_REMAINING_3D_SLICES_EXT;\n\n  //=== VK_EXT_shader_module_identifier ===\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t MaxShaderModuleIdentifierSizeEXT = VK_MAX_SHADER_MODULE_IDENTIFIER_SIZE_EXT;\n\n  //=== VK_KHR_pipeline_binary ===\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t MaxPipelineBinaryKeySizeKHR = VK_MAX_PIPELINE_BINARY_KEY_SIZE_KHR;\n\n  //=== VK_KHR_video_decode_av1 ===\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t MaxVideoAv1ReferencesPerFrameKHR = VK_MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR;\n\n  //=== VK_NV_partitioned_acceleration_structure ===\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t PartitionedAccelerationStructurePartitionIndexGlobalNV = VK_PARTITIONED_ACCELERATION_STRUCTURE_PARTITION_INDEX_GLOBAL_NV;\n\n  //========================\n  //=== CONSTEXPR VALUEs ===\n  //========================\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t HeaderVersion      = VK_HEADER_VERSION;\n  VULKAN_HPP_CONSTEXPR_INLINE uint32_t Use64BitPtrDefines = VK_USE_64_BIT_PTR_DEFINES;\n\n  //=========================\n  //=== CONSTEXPR CALLEEs ===\n  //=========================\n  template <typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type>\n  VULKAN_HPP_CONSTEXPR uint32_t apiVersionMajor( T const version )\n  {\n    return ( ( (uint32_t)( version ) >> 22U ) & 0x7FU );\n  }\n\n  template <typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type>\n  VULKAN_HPP_CONSTEXPR uint32_t apiVersionMinor( T const version )\n  {\n    return ( ( (uint32_t)( version ) >> 12U ) & 0x3FFU );\n  }\n\n  template <typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type>\n  VULKAN_HPP_CONSTEXPR uint32_t apiVersionPatch( T const version )\n  {\n    return ( (uint32_t)(version)&0xFFFU );\n  }\n\n  template <typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type>\n  VULKAN_HPP_CONSTEXPR uint32_t apiVersionVariant( T const version )\n  {\n    return ( (uint32_t)( version ) >> 29U );\n  }\n\n  template <typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type>\n  VULKAN_HPP_CONSTEXPR uint32_t makeApiVersion( T const variant, T const major, T const minor, T const patch )\n  {\n    return ( ( ( (uint32_t)( variant ) ) << 29U ) | ( ( (uint32_t)( major ) ) << 22U ) | ( ( (uint32_t)( minor ) ) << 12U ) | ( (uint32_t)( patch ) ) );\n  }\n\n  template <typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type>\n  VULKAN_HPP_DEPRECATED( \"This define is deprecated. VK_MAKE_API_VERSION should be used instead.\" )\n  VULKAN_HPP_CONSTEXPR uint32_t makeVersion( T const major, T const minor, T const patch )\n  {\n    return ( ( ( (uint32_t)( major ) ) << 22U ) | ( ( (uint32_t)( minor ) ) << 12U ) | ( (uint32_t)( patch ) ) );\n  }\n\n  template <typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type>\n  VULKAN_HPP_DEPRECATED( \"This define is deprecated. VK_API_VERSION_MAJOR should be used instead.\" )\n  VULKAN_HPP_CONSTEXPR uint32_t versionMajor( T const version )\n  {\n    return ( (uint32_t)( version ) >> 22U );\n  }\n\n  template <typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type>\n  VULKAN_HPP_DEPRECATED( \"This define is deprecated. VK_API_VERSION_MINOR should be used instead.\" )\n  VULKAN_HPP_CONSTEXPR uint32_t versionMinor( T const version )\n  {\n    return ( ( (uint32_t)( version ) >> 12U ) & 0x3FFU );\n  }\n\n  template <typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type>\n  VULKAN_HPP_DEPRECATED( \"This define is deprecated. VK_API_VERSION_PATCH should be used instead.\" )\n  VULKAN_HPP_CONSTEXPR uint32_t versionPatch( T const version )\n  {\n    return ( (uint32_t)(version)&0xFFFU );\n  }\n\n  //=========================\n  //=== CONSTEXPR CALLERs ===\n  //=========================\n  VULKAN_HPP_CONSTEXPR_INLINE auto ApiVersion            = makeApiVersion( 0, 1, 0, 0 );\n  VULKAN_HPP_CONSTEXPR_INLINE auto ApiVersion10          = makeApiVersion( 0, 1, 0, 0 );\n  VULKAN_HPP_CONSTEXPR_INLINE auto ApiVersion11          = makeApiVersion( 0, 1, 1, 0 );\n  VULKAN_HPP_CONSTEXPR_INLINE auto ApiVersion12          = makeApiVersion( 0, 1, 2, 0 );\n  VULKAN_HPP_CONSTEXPR_INLINE auto ApiVersion13          = makeApiVersion( 0, 1, 3, 0 );\n  VULKAN_HPP_CONSTEXPR_INLINE auto ApiVersion14          = makeApiVersion( 0, 1, 4, 0 );\n  VULKAN_HPP_CONSTEXPR_INLINE auto HeaderVersionComplete = makeApiVersion( 0, 1, 4, VK_HEADER_VERSION );\n\n  //=================================\n  //=== CONSTEXPR EXTENSION NAMEs ===\n  //=================================\n\n  //=== VK_KHR_surface ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRSurfaceExtensionName = VK_KHR_SURFACE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRSurfaceSpecVersion   = VK_KHR_SURFACE_SPEC_VERSION;\n\n  //=== VK_KHR_swapchain ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRSwapchainExtensionName = VK_KHR_SWAPCHAIN_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRSwapchainSpecVersion   = VK_KHR_SWAPCHAIN_SPEC_VERSION;\n\n  //=== VK_KHR_display ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDisplayExtensionName = VK_KHR_DISPLAY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDisplaySpecVersion   = VK_KHR_DISPLAY_SPEC_VERSION;\n\n  //=== VK_KHR_display_swapchain ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDisplaySwapchainExtensionName = VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDisplaySwapchainSpecVersion   = VK_KHR_DISPLAY_SWAPCHAIN_SPEC_VERSION;\n\n#if defined( VK_USE_PLATFORM_XLIB_KHR )\n  //=== VK_KHR_xlib_surface ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRXlibSurfaceExtensionName = VK_KHR_XLIB_SURFACE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRXlibSurfaceSpecVersion   = VK_KHR_XLIB_SURFACE_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_XLIB_KHR*/\n\n#if defined( VK_USE_PLATFORM_XCB_KHR )\n  //=== VK_KHR_xcb_surface ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRXcbSurfaceExtensionName = VK_KHR_XCB_SURFACE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRXcbSurfaceSpecVersion   = VK_KHR_XCB_SURFACE_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_XCB_KHR*/\n\n#if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n  //=== VK_KHR_wayland_surface ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRWaylandSurfaceExtensionName = VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRWaylandSurfaceSpecVersion   = VK_KHR_WAYLAND_SURFACE_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_WAYLAND_KHR*/\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  //=== VK_KHR_android_surface ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRAndroidSurfaceExtensionName = VK_KHR_ANDROID_SURFACE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRAndroidSurfaceSpecVersion   = VK_KHR_ANDROID_SURFACE_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_KHR_win32_surface ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRWin32SurfaceExtensionName = VK_KHR_WIN32_SURFACE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRWin32SurfaceSpecVersion   = VK_KHR_WIN32_SURFACE_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_EXT_debug_report ===\n  VULKAN_HPP_DEPRECATED( \"The VK_EXT_debug_report extension has been deprecated by VK_EXT_debug_utils.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDebugReportExtensionName = VK_EXT_DEBUG_REPORT_EXTENSION_NAME;\n  VULKAN_HPP_DEPRECATED( \"The VK_EXT_debug_report extension has been deprecated by VK_EXT_debug_utils.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDebugReportSpecVersion = VK_EXT_DEBUG_REPORT_SPEC_VERSION;\n\n  //=== VK_NV_glsl_shader ===\n  VULKAN_HPP_DEPRECATED( \"The VK_NV_glsl_shader extension has been deprecated.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVGlslShaderExtensionName = VK_NV_GLSL_SHADER_EXTENSION_NAME;\n  VULKAN_HPP_DEPRECATED( \"The VK_NV_glsl_shader extension has been deprecated.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVGlslShaderSpecVersion = VK_NV_GLSL_SHADER_SPEC_VERSION;\n\n  //=== VK_EXT_depth_range_unrestricted ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDepthRangeUnrestrictedExtensionName = VK_EXT_DEPTH_RANGE_UNRESTRICTED_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDepthRangeUnrestrictedSpecVersion   = VK_EXT_DEPTH_RANGE_UNRESTRICTED_SPEC_VERSION;\n\n  //=== VK_KHR_sampler_mirror_clamp_to_edge ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRSamplerMirrorClampToEdgeExtensionName = VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRSamplerMirrorClampToEdgeSpecVersion   = VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_SPEC_VERSION;\n\n  //=== VK_IMG_filter_cubic ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto IMGFilterCubicExtensionName = VK_IMG_FILTER_CUBIC_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto IMGFilterCubicSpecVersion   = VK_IMG_FILTER_CUBIC_SPEC_VERSION;\n\n  //=== VK_AMD_rasterization_order ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDRasterizationOrderExtensionName = VK_AMD_RASTERIZATION_ORDER_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDRasterizationOrderSpecVersion   = VK_AMD_RASTERIZATION_ORDER_SPEC_VERSION;\n\n  //=== VK_AMD_shader_trinary_minmax ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDShaderTrinaryMinmaxExtensionName = VK_AMD_SHADER_TRINARY_MINMAX_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDShaderTrinaryMinmaxSpecVersion   = VK_AMD_SHADER_TRINARY_MINMAX_SPEC_VERSION;\n\n  //=== VK_AMD_shader_explicit_vertex_parameter ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDShaderExplicitVertexParameterExtensionName = VK_AMD_SHADER_EXPLICIT_VERTEX_PARAMETER_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDShaderExplicitVertexParameterSpecVersion   = VK_AMD_SHADER_EXPLICIT_VERTEX_PARAMETER_SPEC_VERSION;\n\n  //=== VK_EXT_debug_marker ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDebugMarkerExtensionName = VK_EXT_DEBUG_MARKER_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDebugMarkerSpecVersion   = VK_EXT_DEBUG_MARKER_SPEC_VERSION;\n\n  //=== VK_KHR_video_queue ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoQueueExtensionName = VK_KHR_VIDEO_QUEUE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoQueueSpecVersion   = VK_KHR_VIDEO_QUEUE_SPEC_VERSION;\n\n  //=== VK_KHR_video_decode_queue ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoDecodeQueueExtensionName = VK_KHR_VIDEO_DECODE_QUEUE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoDecodeQueueSpecVersion   = VK_KHR_VIDEO_DECODE_QUEUE_SPEC_VERSION;\n\n  //=== VK_AMD_gcn_shader ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDGcnShaderExtensionName = VK_AMD_GCN_SHADER_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDGcnShaderSpecVersion   = VK_AMD_GCN_SHADER_SPEC_VERSION;\n\n  //=== VK_NV_dedicated_allocation ===\n  VULKAN_HPP_DEPRECATED( \"The VK_NV_dedicated_allocation extension has been deprecated by VK_KHR_dedicated_allocation.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVDedicatedAllocationExtensionName = VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME;\n  VULKAN_HPP_DEPRECATED( \"The VK_NV_dedicated_allocation extension has been deprecated by VK_KHR_dedicated_allocation.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVDedicatedAllocationSpecVersion = VK_NV_DEDICATED_ALLOCATION_SPEC_VERSION;\n\n  //=== VK_EXT_transform_feedback ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTTransformFeedbackExtensionName = VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTTransformFeedbackSpecVersion   = VK_EXT_TRANSFORM_FEEDBACK_SPEC_VERSION;\n\n  //=== VK_NVX_binary_import ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVXBinaryImportExtensionName = VK_NVX_BINARY_IMPORT_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVXBinaryImportSpecVersion   = VK_NVX_BINARY_IMPORT_SPEC_VERSION;\n\n  //=== VK_NVX_image_view_handle ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVXImageViewHandleExtensionName = VK_NVX_IMAGE_VIEW_HANDLE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVXImageViewHandleSpecVersion   = VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION;\n\n  //=== VK_AMD_draw_indirect_count ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDDrawIndirectCountExtensionName = VK_AMD_DRAW_INDIRECT_COUNT_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDDrawIndirectCountSpecVersion   = VK_AMD_DRAW_INDIRECT_COUNT_SPEC_VERSION;\n\n  //=== VK_AMD_negative_viewport_height ===\n  VULKAN_HPP_DEPRECATED( \"The VK_AMD_negative_viewport_height extension has been obsoleted by VK_KHR_maintenance1.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDNegativeViewportHeightExtensionName = VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_EXTENSION_NAME;\n  VULKAN_HPP_DEPRECATED( \"The VK_AMD_negative_viewport_height extension has been obsoleted by VK_KHR_maintenance1.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDNegativeViewportHeightSpecVersion = VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_SPEC_VERSION;\n\n  //=== VK_AMD_gpu_shader_half_float ===\n  VULKAN_HPP_DEPRECATED( \"The VK_AMD_gpu_shader_half_float extension has been deprecated by VK_KHR_shader_float16_int8.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDGpuShaderHalfFloatExtensionName = VK_AMD_GPU_SHADER_HALF_FLOAT_EXTENSION_NAME;\n  VULKAN_HPP_DEPRECATED( \"The VK_AMD_gpu_shader_half_float extension has been deprecated by VK_KHR_shader_float16_int8.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDGpuShaderHalfFloatSpecVersion = VK_AMD_GPU_SHADER_HALF_FLOAT_SPEC_VERSION;\n\n  //=== VK_AMD_shader_ballot ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDShaderBallotExtensionName = VK_AMD_SHADER_BALLOT_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDShaderBallotSpecVersion   = VK_AMD_SHADER_BALLOT_SPEC_VERSION;\n\n  //=== VK_KHR_video_encode_h264 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoEncodeH264ExtensionName = VK_KHR_VIDEO_ENCODE_H264_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoEncodeH264SpecVersion   = VK_KHR_VIDEO_ENCODE_H264_SPEC_VERSION;\n\n  //=== VK_KHR_video_encode_h265 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoEncodeH265ExtensionName = VK_KHR_VIDEO_ENCODE_H265_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoEncodeH265SpecVersion   = VK_KHR_VIDEO_ENCODE_H265_SPEC_VERSION;\n\n  //=== VK_KHR_video_decode_h264 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoDecodeH264ExtensionName = VK_KHR_VIDEO_DECODE_H264_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoDecodeH264SpecVersion   = VK_KHR_VIDEO_DECODE_H264_SPEC_VERSION;\n\n  //=== VK_AMD_texture_gather_bias_lod ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDTextureGatherBiasLodExtensionName = VK_AMD_TEXTURE_GATHER_BIAS_LOD_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDTextureGatherBiasLodSpecVersion   = VK_AMD_TEXTURE_GATHER_BIAS_LOD_SPEC_VERSION;\n\n  //=== VK_AMD_shader_info ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDShaderInfoExtensionName = VK_AMD_SHADER_INFO_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDShaderInfoSpecVersion   = VK_AMD_SHADER_INFO_SPEC_VERSION;\n\n  //=== VK_KHR_dynamic_rendering ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDynamicRenderingExtensionName = VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDynamicRenderingSpecVersion   = VK_KHR_DYNAMIC_RENDERING_SPEC_VERSION;\n\n  //=== VK_AMD_shader_image_load_store_lod ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDShaderImageLoadStoreLodExtensionName = VK_AMD_SHADER_IMAGE_LOAD_STORE_LOD_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDShaderImageLoadStoreLodSpecVersion   = VK_AMD_SHADER_IMAGE_LOAD_STORE_LOD_SPEC_VERSION;\n\n#if defined( VK_USE_PLATFORM_GGP )\n  //=== VK_GGP_stream_descriptor_surface ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto GGPStreamDescriptorSurfaceExtensionName = VK_GGP_STREAM_DESCRIPTOR_SURFACE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto GGPStreamDescriptorSurfaceSpecVersion   = VK_GGP_STREAM_DESCRIPTOR_SURFACE_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_GGP*/\n\n  //=== VK_NV_corner_sampled_image ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVCornerSampledImageExtensionName = VK_NV_CORNER_SAMPLED_IMAGE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVCornerSampledImageSpecVersion   = VK_NV_CORNER_SAMPLED_IMAGE_SPEC_VERSION;\n\n  //=== VK_KHR_multiview ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRMultiviewExtensionName = VK_KHR_MULTIVIEW_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRMultiviewSpecVersion   = VK_KHR_MULTIVIEW_SPEC_VERSION;\n\n  //=== VK_IMG_format_pvrtc ===\n  VULKAN_HPP_DEPRECATED( \"The VK_IMG_format_pvrtc extension has been deprecated.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto IMGFormatPvrtcExtensionName = VK_IMG_FORMAT_PVRTC_EXTENSION_NAME;\n  VULKAN_HPP_DEPRECATED( \"The VK_IMG_format_pvrtc extension has been deprecated.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto IMGFormatPvrtcSpecVersion = VK_IMG_FORMAT_PVRTC_SPEC_VERSION;\n\n  //=== VK_NV_external_memory_capabilities ===\n  VULKAN_HPP_DEPRECATED( \"The VK_NV_external_memory_capabilities extension has been deprecated by VK_KHR_external_memory_capabilities.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVExternalMemoryCapabilitiesExtensionName = VK_NV_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME;\n  VULKAN_HPP_DEPRECATED( \"The VK_NV_external_memory_capabilities extension has been deprecated by VK_KHR_external_memory_capabilities.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVExternalMemoryCapabilitiesSpecVersion = VK_NV_EXTERNAL_MEMORY_CAPABILITIES_SPEC_VERSION;\n\n  //=== VK_NV_external_memory ===\n  VULKAN_HPP_DEPRECATED( \"The VK_NV_external_memory extension has been deprecated by VK_KHR_external_memory.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVExternalMemoryExtensionName = VK_NV_EXTERNAL_MEMORY_EXTENSION_NAME;\n  VULKAN_HPP_DEPRECATED( \"The VK_NV_external_memory extension has been deprecated by VK_KHR_external_memory.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVExternalMemorySpecVersion = VK_NV_EXTERNAL_MEMORY_SPEC_VERSION;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_NV_external_memory_win32 ===\n  VULKAN_HPP_DEPRECATED( \"The VK_NV_external_memory_win32 extension has been deprecated by VK_KHR_external_memory_win32.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVExternalMemoryWin32ExtensionName = VK_NV_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME;\n  VULKAN_HPP_DEPRECATED( \"The VK_NV_external_memory_win32 extension has been deprecated by VK_KHR_external_memory_win32.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVExternalMemoryWin32SpecVersion = VK_NV_EXTERNAL_MEMORY_WIN32_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_NV_win32_keyed_mutex ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVWin32KeyedMutexExtensionName = VK_NV_WIN32_KEYED_MUTEX_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVWin32KeyedMutexSpecVersion   = VK_NV_WIN32_KEYED_MUTEX_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_KHR_get_physical_device_properties2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRGetPhysicalDeviceProperties2ExtensionName = VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRGetPhysicalDeviceProperties2SpecVersion   = VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION;\n\n  //=== VK_KHR_device_group ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDeviceGroupExtensionName = VK_KHR_DEVICE_GROUP_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDeviceGroupSpecVersion   = VK_KHR_DEVICE_GROUP_SPEC_VERSION;\n\n  //=== VK_EXT_validation_flags ===\n  VULKAN_HPP_DEPRECATED( \"The VK_EXT_validation_flags extension has been deprecated by VK_EXT_layer_settings.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTValidationFlagsExtensionName = VK_EXT_VALIDATION_FLAGS_EXTENSION_NAME;\n  VULKAN_HPP_DEPRECATED( \"The VK_EXT_validation_flags extension has been deprecated by VK_EXT_layer_settings.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTValidationFlagsSpecVersion = VK_EXT_VALIDATION_FLAGS_SPEC_VERSION;\n\n#if defined( VK_USE_PLATFORM_VI_NN )\n  //=== VK_NN_vi_surface ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NNViSurfaceExtensionName = VK_NN_VI_SURFACE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NNViSurfaceSpecVersion   = VK_NN_VI_SURFACE_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_VI_NN*/\n\n  //=== VK_KHR_shader_draw_parameters ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderDrawParametersExtensionName = VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderDrawParametersSpecVersion   = VK_KHR_SHADER_DRAW_PARAMETERS_SPEC_VERSION;\n\n  //=== VK_EXT_shader_subgroup_ballot ===\n  VULKAN_HPP_DEPRECATED( \"The VK_EXT_shader_subgroup_ballot extension has been deprecated by VK_VERSION_1_2.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderSubgroupBallotExtensionName = VK_EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME;\n  VULKAN_HPP_DEPRECATED( \"The VK_EXT_shader_subgroup_ballot extension has been deprecated by VK_VERSION_1_2.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderSubgroupBallotSpecVersion = VK_EXT_SHADER_SUBGROUP_BALLOT_SPEC_VERSION;\n\n  //=== VK_EXT_shader_subgroup_vote ===\n  VULKAN_HPP_DEPRECATED( \"The VK_EXT_shader_subgroup_vote extension has been deprecated by VK_VERSION_1_1.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderSubgroupVoteExtensionName = VK_EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME;\n  VULKAN_HPP_DEPRECATED( \"The VK_EXT_shader_subgroup_vote extension has been deprecated by VK_VERSION_1_1.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderSubgroupVoteSpecVersion = VK_EXT_SHADER_SUBGROUP_VOTE_SPEC_VERSION;\n\n  //=== VK_EXT_texture_compression_astc_hdr ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTTextureCompressionAstcHdrExtensionName = VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTTextureCompressionAstcHdrSpecVersion   = VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_SPEC_VERSION;\n\n  //=== VK_EXT_astc_decode_mode ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTAstcDecodeModeExtensionName = VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTAstcDecodeModeSpecVersion   = VK_EXT_ASTC_DECODE_MODE_SPEC_VERSION;\n\n  //=== VK_EXT_pipeline_robustness ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPipelineRobustnessExtensionName = VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPipelineRobustnessSpecVersion   = VK_EXT_PIPELINE_ROBUSTNESS_SPEC_VERSION;\n\n  //=== VK_KHR_maintenance1 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRMaintenance1ExtensionName = VK_KHR_MAINTENANCE_1_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRMaintenance1SpecVersion   = VK_KHR_MAINTENANCE_1_SPEC_VERSION;\n\n  //=== VK_KHR_device_group_creation ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDeviceGroupCreationExtensionName = VK_KHR_DEVICE_GROUP_CREATION_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDeviceGroupCreationSpecVersion   = VK_KHR_DEVICE_GROUP_CREATION_SPEC_VERSION;\n\n  //=== VK_KHR_external_memory_capabilities ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalMemoryCapabilitiesExtensionName = VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalMemoryCapabilitiesSpecVersion   = VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_SPEC_VERSION;\n\n  //=== VK_KHR_external_memory ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalMemoryExtensionName = VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalMemorySpecVersion   = VK_KHR_EXTERNAL_MEMORY_SPEC_VERSION;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_KHR_external_memory_win32 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalMemoryWin32ExtensionName = VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalMemoryWin32SpecVersion   = VK_KHR_EXTERNAL_MEMORY_WIN32_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_KHR_external_memory_fd ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalMemoryFdExtensionName = VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalMemoryFdSpecVersion   = VK_KHR_EXTERNAL_MEMORY_FD_SPEC_VERSION;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_KHR_win32_keyed_mutex ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRWin32KeyedMutexExtensionName = VK_KHR_WIN32_KEYED_MUTEX_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRWin32KeyedMutexSpecVersion   = VK_KHR_WIN32_KEYED_MUTEX_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_KHR_external_semaphore_capabilities ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalSemaphoreCapabilitiesExtensionName = VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalSemaphoreCapabilitiesSpecVersion   = VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_SPEC_VERSION;\n\n  //=== VK_KHR_external_semaphore ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalSemaphoreExtensionName = VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalSemaphoreSpecVersion   = VK_KHR_EXTERNAL_SEMAPHORE_SPEC_VERSION;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_KHR_external_semaphore_win32 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalSemaphoreWin32ExtensionName = VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalSemaphoreWin32SpecVersion   = VK_KHR_EXTERNAL_SEMAPHORE_WIN32_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_KHR_external_semaphore_fd ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalSemaphoreFdExtensionName = VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalSemaphoreFdSpecVersion   = VK_KHR_EXTERNAL_SEMAPHORE_FD_SPEC_VERSION;\n\n  //=== VK_KHR_push_descriptor ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRPushDescriptorExtensionName = VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRPushDescriptorSpecVersion   = VK_KHR_PUSH_DESCRIPTOR_SPEC_VERSION;\n\n  //=== VK_EXT_conditional_rendering ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTConditionalRenderingExtensionName = VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTConditionalRenderingSpecVersion   = VK_EXT_CONDITIONAL_RENDERING_SPEC_VERSION;\n\n  //=== VK_KHR_shader_float16_int8 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderFloat16Int8ExtensionName = VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderFloat16Int8SpecVersion   = VK_KHR_SHADER_FLOAT16_INT8_SPEC_VERSION;\n\n  //=== VK_KHR_16bit_storage ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHR16BitStorageExtensionName = VK_KHR_16BIT_STORAGE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHR16BitStorageSpecVersion   = VK_KHR_16BIT_STORAGE_SPEC_VERSION;\n\n  //=== VK_KHR_incremental_present ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRIncrementalPresentExtensionName = VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRIncrementalPresentSpecVersion   = VK_KHR_INCREMENTAL_PRESENT_SPEC_VERSION;\n\n  //=== VK_KHR_descriptor_update_template ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDescriptorUpdateTemplateExtensionName = VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDescriptorUpdateTemplateSpecVersion   = VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_SPEC_VERSION;\n\n  //=== VK_NV_clip_space_w_scaling ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVClipSpaceWScalingExtensionName = VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVClipSpaceWScalingSpecVersion   = VK_NV_CLIP_SPACE_W_SCALING_SPEC_VERSION;\n\n  //=== VK_EXT_direct_mode_display ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDirectModeDisplayExtensionName = VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDirectModeDisplaySpecVersion   = VK_EXT_DIRECT_MODE_DISPLAY_SPEC_VERSION;\n\n#if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )\n  //=== VK_EXT_acquire_xlib_display ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTAcquireXlibDisplayExtensionName = VK_EXT_ACQUIRE_XLIB_DISPLAY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTAcquireXlibDisplaySpecVersion   = VK_EXT_ACQUIRE_XLIB_DISPLAY_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/\n\n  //=== VK_EXT_display_surface_counter ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDisplaySurfaceCounterExtensionName = VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDisplaySurfaceCounterSpecVersion   = VK_EXT_DISPLAY_SURFACE_COUNTER_SPEC_VERSION;\n\n  //=== VK_EXT_display_control ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDisplayControlExtensionName = VK_EXT_DISPLAY_CONTROL_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDisplayControlSpecVersion   = VK_EXT_DISPLAY_CONTROL_SPEC_VERSION;\n\n  //=== VK_GOOGLE_display_timing ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto GOOGLEDisplayTimingExtensionName = VK_GOOGLE_DISPLAY_TIMING_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto GOOGLEDisplayTimingSpecVersion   = VK_GOOGLE_DISPLAY_TIMING_SPEC_VERSION;\n\n  //=== VK_NV_sample_mask_override_coverage ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVSampleMaskOverrideCoverageExtensionName = VK_NV_SAMPLE_MASK_OVERRIDE_COVERAGE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVSampleMaskOverrideCoverageSpecVersion   = VK_NV_SAMPLE_MASK_OVERRIDE_COVERAGE_SPEC_VERSION;\n\n  //=== VK_NV_geometry_shader_passthrough ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVGeometryShaderPassthroughExtensionName = VK_NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVGeometryShaderPassthroughSpecVersion   = VK_NV_GEOMETRY_SHADER_PASSTHROUGH_SPEC_VERSION;\n\n  //=== VK_NV_viewport_array2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVViewportArray2ExtensionName = VK_NV_VIEWPORT_ARRAY_2_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVViewportArray2SpecVersion   = VK_NV_VIEWPORT_ARRAY_2_SPEC_VERSION;\n\n  //=== VK_NVX_multiview_per_view_attributes ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVXMultiviewPerViewAttributesExtensionName = VK_NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVXMultiviewPerViewAttributesSpecVersion   = VK_NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_SPEC_VERSION;\n\n  //=== VK_NV_viewport_swizzle ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVViewportSwizzleExtensionName = VK_NV_VIEWPORT_SWIZZLE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVViewportSwizzleSpecVersion   = VK_NV_VIEWPORT_SWIZZLE_SPEC_VERSION;\n\n  //=== VK_EXT_discard_rectangles ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDiscardRectanglesExtensionName = VK_EXT_DISCARD_RECTANGLES_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDiscardRectanglesSpecVersion   = VK_EXT_DISCARD_RECTANGLES_SPEC_VERSION;\n\n  //=== VK_EXT_conservative_rasterization ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTConservativeRasterizationExtensionName = VK_EXT_CONSERVATIVE_RASTERIZATION_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTConservativeRasterizationSpecVersion   = VK_EXT_CONSERVATIVE_RASTERIZATION_SPEC_VERSION;\n\n  //=== VK_EXT_depth_clip_enable ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDepthClipEnableExtensionName = VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDepthClipEnableSpecVersion   = VK_EXT_DEPTH_CLIP_ENABLE_SPEC_VERSION;\n\n  //=== VK_EXT_swapchain_colorspace ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTSwapchainColorSpaceExtensionName = VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTSwapchainColorSpaceSpecVersion   = VK_EXT_SWAPCHAIN_COLOR_SPACE_SPEC_VERSION;\n\n  //=== VK_EXT_hdr_metadata ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTHdrMetadataExtensionName = VK_EXT_HDR_METADATA_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTHdrMetadataSpecVersion   = VK_EXT_HDR_METADATA_SPEC_VERSION;\n\n  //=== VK_KHR_imageless_framebuffer ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRImagelessFramebufferExtensionName = VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRImagelessFramebufferSpecVersion   = VK_KHR_IMAGELESS_FRAMEBUFFER_SPEC_VERSION;\n\n  //=== VK_KHR_create_renderpass2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRCreateRenderpass2ExtensionName = VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRCreateRenderpass2SpecVersion   = VK_KHR_CREATE_RENDERPASS_2_SPEC_VERSION;\n\n  //=== VK_IMG_relaxed_line_rasterization ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto IMGRelaxedLineRasterizationExtensionName = VK_IMG_RELAXED_LINE_RASTERIZATION_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto IMGRelaxedLineRasterizationSpecVersion   = VK_IMG_RELAXED_LINE_RASTERIZATION_SPEC_VERSION;\n\n  //=== VK_KHR_shared_presentable_image ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRSharedPresentableImageExtensionName = VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRSharedPresentableImageSpecVersion   = VK_KHR_SHARED_PRESENTABLE_IMAGE_SPEC_VERSION;\n\n  //=== VK_KHR_external_fence_capabilities ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalFenceCapabilitiesExtensionName = VK_KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalFenceCapabilitiesSpecVersion   = VK_KHR_EXTERNAL_FENCE_CAPABILITIES_SPEC_VERSION;\n\n  //=== VK_KHR_external_fence ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalFenceExtensionName = VK_KHR_EXTERNAL_FENCE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalFenceSpecVersion   = VK_KHR_EXTERNAL_FENCE_SPEC_VERSION;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_KHR_external_fence_win32 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalFenceWin32ExtensionName = VK_KHR_EXTERNAL_FENCE_WIN32_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalFenceWin32SpecVersion   = VK_KHR_EXTERNAL_FENCE_WIN32_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_KHR_external_fence_fd ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalFenceFdExtensionName = VK_KHR_EXTERNAL_FENCE_FD_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRExternalFenceFdSpecVersion   = VK_KHR_EXTERNAL_FENCE_FD_SPEC_VERSION;\n\n  //=== VK_KHR_performance_query ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRPerformanceQueryExtensionName = VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRPerformanceQuerySpecVersion   = VK_KHR_PERFORMANCE_QUERY_SPEC_VERSION;\n\n  //=== VK_KHR_maintenance2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRMaintenance2ExtensionName = VK_KHR_MAINTENANCE_2_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRMaintenance2SpecVersion   = VK_KHR_MAINTENANCE_2_SPEC_VERSION;\n\n  //=== VK_KHR_get_surface_capabilities2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRGetSurfaceCapabilities2ExtensionName = VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRGetSurfaceCapabilities2SpecVersion   = VK_KHR_GET_SURFACE_CAPABILITIES_2_SPEC_VERSION;\n\n  //=== VK_KHR_variable_pointers ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVariablePointersExtensionName = VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVariablePointersSpecVersion   = VK_KHR_VARIABLE_POINTERS_SPEC_VERSION;\n\n  //=== VK_KHR_get_display_properties2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRGetDisplayProperties2ExtensionName = VK_KHR_GET_DISPLAY_PROPERTIES_2_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRGetDisplayProperties2SpecVersion   = VK_KHR_GET_DISPLAY_PROPERTIES_2_SPEC_VERSION;\n\n#if defined( VK_USE_PLATFORM_IOS_MVK )\n  //=== VK_MVK_ios_surface ===\n  VULKAN_HPP_DEPRECATED( \"The VK_MVK_ios_surface extension has been deprecated by VK_EXT_metal_surface.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto MVKIosSurfaceExtensionName = VK_MVK_IOS_SURFACE_EXTENSION_NAME;\n  VULKAN_HPP_DEPRECATED( \"The VK_MVK_ios_surface extension has been deprecated by VK_EXT_metal_surface.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto MVKIosSurfaceSpecVersion = VK_MVK_IOS_SURFACE_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_IOS_MVK*/\n\n#if defined( VK_USE_PLATFORM_MACOS_MVK )\n  //=== VK_MVK_macos_surface ===\n  VULKAN_HPP_DEPRECATED( \"The VK_MVK_macos_surface extension has been deprecated by VK_EXT_metal_surface.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto MVKMacosSurfaceExtensionName = VK_MVK_MACOS_SURFACE_EXTENSION_NAME;\n  VULKAN_HPP_DEPRECATED( \"The VK_MVK_macos_surface extension has been deprecated by VK_EXT_metal_surface.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto MVKMacosSurfaceSpecVersion = VK_MVK_MACOS_SURFACE_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_MACOS_MVK*/\n\n  //=== VK_EXT_external_memory_dma_buf ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTExternalMemoryDmaBufExtensionName = VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTExternalMemoryDmaBufSpecVersion   = VK_EXT_EXTERNAL_MEMORY_DMA_BUF_SPEC_VERSION;\n\n  //=== VK_EXT_queue_family_foreign ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTQueueFamilyForeignExtensionName = VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTQueueFamilyForeignSpecVersion   = VK_EXT_QUEUE_FAMILY_FOREIGN_SPEC_VERSION;\n\n  //=== VK_KHR_dedicated_allocation ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDedicatedAllocationExtensionName = VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDedicatedAllocationSpecVersion   = VK_KHR_DEDICATED_ALLOCATION_SPEC_VERSION;\n\n  //=== VK_EXT_debug_utils ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDebugUtilsExtensionName = VK_EXT_DEBUG_UTILS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDebugUtilsSpecVersion   = VK_EXT_DEBUG_UTILS_SPEC_VERSION;\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  //=== VK_ANDROID_external_memory_android_hardware_buffer ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto ANDROIDExternalMemoryAndroidHardwareBufferExtensionName = VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto ANDROIDExternalMemoryAndroidHardwareBufferSpecVersion   = VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n  //=== VK_EXT_sampler_filter_minmax ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTSamplerFilterMinmaxExtensionName = VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTSamplerFilterMinmaxSpecVersion   = VK_EXT_SAMPLER_FILTER_MINMAX_SPEC_VERSION;\n\n  //=== VK_KHR_storage_buffer_storage_class ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRStorageBufferStorageClassExtensionName = VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRStorageBufferStorageClassSpecVersion   = VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_SPEC_VERSION;\n\n  //=== VK_AMD_gpu_shader_int16 ===\n  VULKAN_HPP_DEPRECATED( \"The VK_AMD_gpu_shader_int16 extension has been deprecated by VK_KHR_shader_float16_int8.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDGpuShaderInt16ExtensionName = VK_AMD_GPU_SHADER_INT16_EXTENSION_NAME;\n  VULKAN_HPP_DEPRECATED( \"The VK_AMD_gpu_shader_int16 extension has been deprecated by VK_KHR_shader_float16_int8.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDGpuShaderInt16SpecVersion = VK_AMD_GPU_SHADER_INT16_SPEC_VERSION;\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  //=== VK_AMDX_shader_enqueue ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDXShaderEnqueueExtensionName = VK_AMDX_SHADER_ENQUEUE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDXShaderEnqueueSpecVersion   = VK_AMDX_SHADER_ENQUEUE_SPEC_VERSION;\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  //=== VK_AMD_mixed_attachment_samples ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDMixedAttachmentSamplesExtensionName = VK_AMD_MIXED_ATTACHMENT_SAMPLES_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDMixedAttachmentSamplesSpecVersion   = VK_AMD_MIXED_ATTACHMENT_SAMPLES_SPEC_VERSION;\n\n  //=== VK_AMD_shader_fragment_mask ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDShaderFragmentMaskExtensionName = VK_AMD_SHADER_FRAGMENT_MASK_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDShaderFragmentMaskSpecVersion   = VK_AMD_SHADER_FRAGMENT_MASK_SPEC_VERSION;\n\n  //=== VK_EXT_inline_uniform_block ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTInlineUniformBlockExtensionName = VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTInlineUniformBlockSpecVersion   = VK_EXT_INLINE_UNIFORM_BLOCK_SPEC_VERSION;\n\n  //=== VK_EXT_shader_stencil_export ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderStencilExportExtensionName = VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderStencilExportSpecVersion   = VK_EXT_SHADER_STENCIL_EXPORT_SPEC_VERSION;\n\n  //=== VK_EXT_sample_locations ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTSampleLocationsExtensionName = VK_EXT_SAMPLE_LOCATIONS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTSampleLocationsSpecVersion   = VK_EXT_SAMPLE_LOCATIONS_SPEC_VERSION;\n\n  //=== VK_KHR_relaxed_block_layout ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRRelaxedBlockLayoutExtensionName = VK_KHR_RELAXED_BLOCK_LAYOUT_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRRelaxedBlockLayoutSpecVersion   = VK_KHR_RELAXED_BLOCK_LAYOUT_SPEC_VERSION;\n\n  //=== VK_KHR_get_memory_requirements2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRGetMemoryRequirements2ExtensionName = VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRGetMemoryRequirements2SpecVersion   = VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION;\n\n  //=== VK_KHR_image_format_list ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRImageFormatListExtensionName = VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRImageFormatListSpecVersion   = VK_KHR_IMAGE_FORMAT_LIST_SPEC_VERSION;\n\n  //=== VK_EXT_blend_operation_advanced ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTBlendOperationAdvancedExtensionName = VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTBlendOperationAdvancedSpecVersion   = VK_EXT_BLEND_OPERATION_ADVANCED_SPEC_VERSION;\n\n  //=== VK_NV_fragment_coverage_to_color ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVFragmentCoverageToColorExtensionName = VK_NV_FRAGMENT_COVERAGE_TO_COLOR_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVFragmentCoverageToColorSpecVersion   = VK_NV_FRAGMENT_COVERAGE_TO_COLOR_SPEC_VERSION;\n\n  //=== VK_KHR_acceleration_structure ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRAccelerationStructureExtensionName = VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRAccelerationStructureSpecVersion   = VK_KHR_ACCELERATION_STRUCTURE_SPEC_VERSION;\n\n  //=== VK_KHR_ray_tracing_pipeline ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRRayTracingPipelineExtensionName = VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRRayTracingPipelineSpecVersion   = VK_KHR_RAY_TRACING_PIPELINE_SPEC_VERSION;\n\n  //=== VK_KHR_ray_query ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRRayQueryExtensionName = VK_KHR_RAY_QUERY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRRayQuerySpecVersion   = VK_KHR_RAY_QUERY_SPEC_VERSION;\n\n  //=== VK_NV_framebuffer_mixed_samples ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVFramebufferMixedSamplesExtensionName = VK_NV_FRAMEBUFFER_MIXED_SAMPLES_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVFramebufferMixedSamplesSpecVersion   = VK_NV_FRAMEBUFFER_MIXED_SAMPLES_SPEC_VERSION;\n\n  //=== VK_NV_fill_rectangle ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVFillRectangleExtensionName = VK_NV_FILL_RECTANGLE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVFillRectangleSpecVersion   = VK_NV_FILL_RECTANGLE_SPEC_VERSION;\n\n  //=== VK_NV_shader_sm_builtins ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVShaderSmBuiltinsExtensionName = VK_NV_SHADER_SM_BUILTINS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVShaderSmBuiltinsSpecVersion   = VK_NV_SHADER_SM_BUILTINS_SPEC_VERSION;\n\n  //=== VK_EXT_post_depth_coverage ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPostDepthCoverageExtensionName = VK_EXT_POST_DEPTH_COVERAGE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPostDepthCoverageSpecVersion   = VK_EXT_POST_DEPTH_COVERAGE_SPEC_VERSION;\n\n  //=== VK_KHR_sampler_ycbcr_conversion ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRSamplerYcbcrConversionExtensionName = VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRSamplerYcbcrConversionSpecVersion   = VK_KHR_SAMPLER_YCBCR_CONVERSION_SPEC_VERSION;\n\n  //=== VK_KHR_bind_memory2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRBindMemory2ExtensionName = VK_KHR_BIND_MEMORY_2_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRBindMemory2SpecVersion   = VK_KHR_BIND_MEMORY_2_SPEC_VERSION;\n\n  //=== VK_EXT_image_drm_format_modifier ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTImageDrmFormatModifierExtensionName = VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTImageDrmFormatModifierSpecVersion   = VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_SPEC_VERSION;\n\n  //=== VK_EXT_validation_cache ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTValidationCacheExtensionName = VK_EXT_VALIDATION_CACHE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTValidationCacheSpecVersion   = VK_EXT_VALIDATION_CACHE_SPEC_VERSION;\n\n  //=== VK_EXT_descriptor_indexing ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDescriptorIndexingExtensionName = VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDescriptorIndexingSpecVersion   = VK_EXT_DESCRIPTOR_INDEXING_SPEC_VERSION;\n\n  //=== VK_EXT_shader_viewport_index_layer ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderViewportIndexLayerExtensionName = VK_EXT_SHADER_VIEWPORT_INDEX_LAYER_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderViewportIndexLayerSpecVersion   = VK_EXT_SHADER_VIEWPORT_INDEX_LAYER_SPEC_VERSION;\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  //=== VK_KHR_portability_subset ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRPortabilitySubsetExtensionName = VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRPortabilitySubsetSpecVersion   = VK_KHR_PORTABILITY_SUBSET_SPEC_VERSION;\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  //=== VK_NV_shading_rate_image ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVShadingRateImageExtensionName = VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVShadingRateImageSpecVersion   = VK_NV_SHADING_RATE_IMAGE_SPEC_VERSION;\n\n  //=== VK_NV_ray_tracing ===\n  VULKAN_HPP_DEPRECATED( \"The VK_NV_ray_tracing extension has been deprecated by VK_KHR_ray_tracing_pipeline.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVRayTracingExtensionName = VK_NV_RAY_TRACING_EXTENSION_NAME;\n  VULKAN_HPP_DEPRECATED( \"The VK_NV_ray_tracing extension has been deprecated by VK_KHR_ray_tracing_pipeline.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVRayTracingSpecVersion = VK_NV_RAY_TRACING_SPEC_VERSION;\n\n  //=== VK_NV_representative_fragment_test ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVRepresentativeFragmentTestExtensionName = VK_NV_REPRESENTATIVE_FRAGMENT_TEST_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVRepresentativeFragmentTestSpecVersion   = VK_NV_REPRESENTATIVE_FRAGMENT_TEST_SPEC_VERSION;\n\n  //=== VK_KHR_maintenance3 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRMaintenance3ExtensionName = VK_KHR_MAINTENANCE_3_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRMaintenance3SpecVersion   = VK_KHR_MAINTENANCE_3_SPEC_VERSION;\n\n  //=== VK_KHR_draw_indirect_count ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDrawIndirectCountExtensionName = VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDrawIndirectCountSpecVersion   = VK_KHR_DRAW_INDIRECT_COUNT_SPEC_VERSION;\n\n  //=== VK_EXT_filter_cubic ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTFilterCubicExtensionName = VK_EXT_FILTER_CUBIC_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTFilterCubicSpecVersion   = VK_EXT_FILTER_CUBIC_SPEC_VERSION;\n\n  //=== VK_QCOM_render_pass_shader_resolve ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMRenderPassShaderResolveExtensionName = VK_QCOM_RENDER_PASS_SHADER_RESOLVE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMRenderPassShaderResolveSpecVersion   = VK_QCOM_RENDER_PASS_SHADER_RESOLVE_SPEC_VERSION;\n\n  //=== VK_EXT_global_priority ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTGlobalPriorityExtensionName = VK_EXT_GLOBAL_PRIORITY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTGlobalPrioritySpecVersion   = VK_EXT_GLOBAL_PRIORITY_SPEC_VERSION;\n\n  //=== VK_KHR_shader_subgroup_extended_types ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderSubgroupExtendedTypesExtensionName = VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderSubgroupExtendedTypesSpecVersion   = VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_SPEC_VERSION;\n\n  //=== VK_KHR_8bit_storage ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHR8BitStorageExtensionName = VK_KHR_8BIT_STORAGE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHR8BitStorageSpecVersion   = VK_KHR_8BIT_STORAGE_SPEC_VERSION;\n\n  //=== VK_EXT_external_memory_host ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTExternalMemoryHostExtensionName = VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTExternalMemoryHostSpecVersion   = VK_EXT_EXTERNAL_MEMORY_HOST_SPEC_VERSION;\n\n  //=== VK_AMD_buffer_marker ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDBufferMarkerExtensionName = VK_AMD_BUFFER_MARKER_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDBufferMarkerSpecVersion   = VK_AMD_BUFFER_MARKER_SPEC_VERSION;\n\n  //=== VK_KHR_shader_atomic_int64 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderAtomicInt64ExtensionName = VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderAtomicInt64SpecVersion   = VK_KHR_SHADER_ATOMIC_INT64_SPEC_VERSION;\n\n  //=== VK_KHR_shader_clock ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderClockExtensionName = VK_KHR_SHADER_CLOCK_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderClockSpecVersion   = VK_KHR_SHADER_CLOCK_SPEC_VERSION;\n\n  //=== VK_AMD_pipeline_compiler_control ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDPipelineCompilerControlExtensionName = VK_AMD_PIPELINE_COMPILER_CONTROL_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDPipelineCompilerControlSpecVersion   = VK_AMD_PIPELINE_COMPILER_CONTROL_SPEC_VERSION;\n\n  //=== VK_EXT_calibrated_timestamps ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTCalibratedTimestampsExtensionName = VK_EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTCalibratedTimestampsSpecVersion   = VK_EXT_CALIBRATED_TIMESTAMPS_SPEC_VERSION;\n\n  //=== VK_AMD_shader_core_properties ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDShaderCorePropertiesExtensionName = VK_AMD_SHADER_CORE_PROPERTIES_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDShaderCorePropertiesSpecVersion   = VK_AMD_SHADER_CORE_PROPERTIES_SPEC_VERSION;\n\n  //=== VK_KHR_video_decode_h265 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoDecodeH265ExtensionName = VK_KHR_VIDEO_DECODE_H265_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoDecodeH265SpecVersion   = VK_KHR_VIDEO_DECODE_H265_SPEC_VERSION;\n\n  //=== VK_KHR_global_priority ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRGlobalPriorityExtensionName = VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRGlobalPrioritySpecVersion   = VK_KHR_GLOBAL_PRIORITY_SPEC_VERSION;\n\n  //=== VK_AMD_memory_overallocation_behavior ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDMemoryOverallocationBehaviorExtensionName = VK_AMD_MEMORY_OVERALLOCATION_BEHAVIOR_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDMemoryOverallocationBehaviorSpecVersion   = VK_AMD_MEMORY_OVERALLOCATION_BEHAVIOR_SPEC_VERSION;\n\n  //=== VK_EXT_vertex_attribute_divisor ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTVertexAttributeDivisorExtensionName = VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTVertexAttributeDivisorSpecVersion   = VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION;\n\n#if defined( VK_USE_PLATFORM_GGP )\n  //=== VK_GGP_frame_token ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto GGPFrameTokenExtensionName = VK_GGP_FRAME_TOKEN_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto GGPFrameTokenSpecVersion   = VK_GGP_FRAME_TOKEN_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_GGP*/\n\n  //=== VK_EXT_pipeline_creation_feedback ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPipelineCreationFeedbackExtensionName = VK_EXT_PIPELINE_CREATION_FEEDBACK_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPipelineCreationFeedbackSpecVersion   = VK_EXT_PIPELINE_CREATION_FEEDBACK_SPEC_VERSION;\n\n  //=== VK_KHR_driver_properties ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDriverPropertiesExtensionName = VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDriverPropertiesSpecVersion   = VK_KHR_DRIVER_PROPERTIES_SPEC_VERSION;\n\n  //=== VK_KHR_shader_float_controls ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderFloatControlsExtensionName = VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderFloatControlsSpecVersion   = VK_KHR_SHADER_FLOAT_CONTROLS_SPEC_VERSION;\n\n  //=== VK_NV_shader_subgroup_partitioned ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVShaderSubgroupPartitionedExtensionName = VK_NV_SHADER_SUBGROUP_PARTITIONED_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVShaderSubgroupPartitionedSpecVersion   = VK_NV_SHADER_SUBGROUP_PARTITIONED_SPEC_VERSION;\n\n  //=== VK_KHR_depth_stencil_resolve ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDepthStencilResolveExtensionName = VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDepthStencilResolveSpecVersion   = VK_KHR_DEPTH_STENCIL_RESOLVE_SPEC_VERSION;\n\n  //=== VK_KHR_swapchain_mutable_format ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRSwapchainMutableFormatExtensionName = VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRSwapchainMutableFormatSpecVersion   = VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_SPEC_VERSION;\n\n  //=== VK_NV_compute_shader_derivatives ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVComputeShaderDerivativesExtensionName = VK_NV_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVComputeShaderDerivativesSpecVersion   = VK_NV_COMPUTE_SHADER_DERIVATIVES_SPEC_VERSION;\n\n  //=== VK_NV_mesh_shader ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVMeshShaderExtensionName = VK_NV_MESH_SHADER_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVMeshShaderSpecVersion   = VK_NV_MESH_SHADER_SPEC_VERSION;\n\n  //=== VK_NV_fragment_shader_barycentric ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVFragmentShaderBarycentricExtensionName = VK_NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVFragmentShaderBarycentricSpecVersion   = VK_NV_FRAGMENT_SHADER_BARYCENTRIC_SPEC_VERSION;\n\n  //=== VK_NV_shader_image_footprint ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVShaderImageFootprintExtensionName = VK_NV_SHADER_IMAGE_FOOTPRINT_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVShaderImageFootprintSpecVersion   = VK_NV_SHADER_IMAGE_FOOTPRINT_SPEC_VERSION;\n\n  //=== VK_NV_scissor_exclusive ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVScissorExclusiveExtensionName = VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVScissorExclusiveSpecVersion   = VK_NV_SCISSOR_EXCLUSIVE_SPEC_VERSION;\n\n  //=== VK_NV_device_diagnostic_checkpoints ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVDeviceDiagnosticCheckpointsExtensionName = VK_NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVDeviceDiagnosticCheckpointsSpecVersion   = VK_NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_SPEC_VERSION;\n\n  //=== VK_KHR_timeline_semaphore ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRTimelineSemaphoreExtensionName = VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRTimelineSemaphoreSpecVersion   = VK_KHR_TIMELINE_SEMAPHORE_SPEC_VERSION;\n\n  //=== VK_INTEL_shader_integer_functions2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto INTELShaderIntegerFunctions2ExtensionName = VK_INTEL_SHADER_INTEGER_FUNCTIONS_2_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto INTELShaderIntegerFunctions2SpecVersion   = VK_INTEL_SHADER_INTEGER_FUNCTIONS_2_SPEC_VERSION;\n\n  //=== VK_INTEL_performance_query ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto INTELPerformanceQueryExtensionName = VK_INTEL_PERFORMANCE_QUERY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto INTELPerformanceQuerySpecVersion   = VK_INTEL_PERFORMANCE_QUERY_SPEC_VERSION;\n\n  //=== VK_KHR_vulkan_memory_model ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVulkanMemoryModelExtensionName = VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVulkanMemoryModelSpecVersion   = VK_KHR_VULKAN_MEMORY_MODEL_SPEC_VERSION;\n\n  //=== VK_EXT_pci_bus_info ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPciBusInfoExtensionName = VK_EXT_PCI_BUS_INFO_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPciBusInfoSpecVersion   = VK_EXT_PCI_BUS_INFO_SPEC_VERSION;\n\n  //=== VK_AMD_display_native_hdr ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDDisplayNativeHdrExtensionName = VK_AMD_DISPLAY_NATIVE_HDR_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDDisplayNativeHdrSpecVersion   = VK_AMD_DISPLAY_NATIVE_HDR_SPEC_VERSION;\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_imagepipe_surface ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto FUCHSIAImagepipeSurfaceExtensionName = VK_FUCHSIA_IMAGEPIPE_SURFACE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto FUCHSIAImagepipeSurfaceSpecVersion   = VK_FUCHSIA_IMAGEPIPE_SURFACE_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  //=== VK_KHR_shader_terminate_invocation ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderTerminateInvocationExtensionName = VK_KHR_SHADER_TERMINATE_INVOCATION_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderTerminateInvocationSpecVersion   = VK_KHR_SHADER_TERMINATE_INVOCATION_SPEC_VERSION;\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  //=== VK_EXT_metal_surface ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTMetalSurfaceExtensionName = VK_EXT_METAL_SURFACE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTMetalSurfaceSpecVersion   = VK_EXT_METAL_SURFACE_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n  //=== VK_EXT_fragment_density_map ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTFragmentDensityMapExtensionName = VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTFragmentDensityMapSpecVersion   = VK_EXT_FRAGMENT_DENSITY_MAP_SPEC_VERSION;\n\n  //=== VK_EXT_scalar_block_layout ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTScalarBlockLayoutExtensionName = VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTScalarBlockLayoutSpecVersion   = VK_EXT_SCALAR_BLOCK_LAYOUT_SPEC_VERSION;\n\n  //=== VK_GOOGLE_hlsl_functionality1 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto GOOGLEHlslFunctionality1ExtensionName = VK_GOOGLE_HLSL_FUNCTIONALITY_1_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto GOOGLEHlslFunctionality1SpecVersion   = VK_GOOGLE_HLSL_FUNCTIONALITY_1_SPEC_VERSION;\n\n  //=== VK_GOOGLE_decorate_string ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto GOOGLEDecorateStringExtensionName = VK_GOOGLE_DECORATE_STRING_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto GOOGLEDecorateStringSpecVersion   = VK_GOOGLE_DECORATE_STRING_SPEC_VERSION;\n\n  //=== VK_EXT_subgroup_size_control ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTSubgroupSizeControlExtensionName = VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTSubgroupSizeControlSpecVersion   = VK_EXT_SUBGROUP_SIZE_CONTROL_SPEC_VERSION;\n\n  //=== VK_KHR_fragment_shading_rate ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRFragmentShadingRateExtensionName = VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRFragmentShadingRateSpecVersion   = VK_KHR_FRAGMENT_SHADING_RATE_SPEC_VERSION;\n\n  //=== VK_AMD_shader_core_properties2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDShaderCoreProperties2ExtensionName = VK_AMD_SHADER_CORE_PROPERTIES_2_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDShaderCoreProperties2SpecVersion   = VK_AMD_SHADER_CORE_PROPERTIES_2_SPEC_VERSION;\n\n  //=== VK_AMD_device_coherent_memory ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDDeviceCoherentMemoryExtensionName = VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDDeviceCoherentMemorySpecVersion   = VK_AMD_DEVICE_COHERENT_MEMORY_SPEC_VERSION;\n\n  //=== VK_KHR_dynamic_rendering_local_read ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDynamicRenderingLocalReadExtensionName = VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDynamicRenderingLocalReadSpecVersion   = VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_SPEC_VERSION;\n\n  //=== VK_EXT_shader_image_atomic_int64 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderImageAtomicInt64ExtensionName = VK_EXT_SHADER_IMAGE_ATOMIC_INT64_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderImageAtomicInt64SpecVersion   = VK_EXT_SHADER_IMAGE_ATOMIC_INT64_SPEC_VERSION;\n\n  //=== VK_KHR_shader_quad_control ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderQuadControlExtensionName = VK_KHR_SHADER_QUAD_CONTROL_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderQuadControlSpecVersion   = VK_KHR_SHADER_QUAD_CONTROL_SPEC_VERSION;\n\n  //=== VK_KHR_spirv_1_4 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRSpirv14ExtensionName = VK_KHR_SPIRV_1_4_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRSpirv14SpecVersion   = VK_KHR_SPIRV_1_4_SPEC_VERSION;\n\n  //=== VK_EXT_memory_budget ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTMemoryBudgetExtensionName = VK_EXT_MEMORY_BUDGET_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTMemoryBudgetSpecVersion   = VK_EXT_MEMORY_BUDGET_SPEC_VERSION;\n\n  //=== VK_EXT_memory_priority ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTMemoryPriorityExtensionName = VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTMemoryPrioritySpecVersion   = VK_EXT_MEMORY_PRIORITY_SPEC_VERSION;\n\n  //=== VK_KHR_surface_protected_capabilities ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRSurfaceProtectedCapabilitiesExtensionName = VK_KHR_SURFACE_PROTECTED_CAPABILITIES_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRSurfaceProtectedCapabilitiesSpecVersion   = VK_KHR_SURFACE_PROTECTED_CAPABILITIES_SPEC_VERSION;\n\n  //=== VK_NV_dedicated_allocation_image_aliasing ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVDedicatedAllocationImageAliasingExtensionName = VK_NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVDedicatedAllocationImageAliasingSpecVersion   = VK_NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_SPEC_VERSION;\n\n  //=== VK_KHR_separate_depth_stencil_layouts ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRSeparateDepthStencilLayoutsExtensionName = VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRSeparateDepthStencilLayoutsSpecVersion   = VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_SPEC_VERSION;\n\n  //=== VK_EXT_buffer_device_address ===\n  VULKAN_HPP_DEPRECATED( \"The VK_EXT_buffer_device_address extension has been deprecated by VK_KHR_buffer_device_address.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTBufferDeviceAddressExtensionName = VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME;\n  VULKAN_HPP_DEPRECATED( \"The VK_EXT_buffer_device_address extension has been deprecated by VK_KHR_buffer_device_address.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTBufferDeviceAddressSpecVersion = VK_EXT_BUFFER_DEVICE_ADDRESS_SPEC_VERSION;\n\n  //=== VK_EXT_tooling_info ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTToolingInfoExtensionName = VK_EXT_TOOLING_INFO_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTToolingInfoSpecVersion   = VK_EXT_TOOLING_INFO_SPEC_VERSION;\n\n  //=== VK_EXT_separate_stencil_usage ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTSeparateStencilUsageExtensionName = VK_EXT_SEPARATE_STENCIL_USAGE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTSeparateStencilUsageSpecVersion   = VK_EXT_SEPARATE_STENCIL_USAGE_SPEC_VERSION;\n\n  //=== VK_EXT_validation_features ===\n  VULKAN_HPP_DEPRECATED( \"The VK_EXT_validation_features extension has been deprecated by VK_EXT_layer_settings.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTValidationFeaturesExtensionName = VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME;\n  VULKAN_HPP_DEPRECATED( \"The VK_EXT_validation_features extension has been deprecated by VK_EXT_layer_settings.\" )\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTValidationFeaturesSpecVersion = VK_EXT_VALIDATION_FEATURES_SPEC_VERSION;\n\n  //=== VK_KHR_present_wait ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRPresentWaitExtensionName = VK_KHR_PRESENT_WAIT_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRPresentWaitSpecVersion   = VK_KHR_PRESENT_WAIT_SPEC_VERSION;\n\n  //=== VK_NV_cooperative_matrix ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVCooperativeMatrixExtensionName = VK_NV_COOPERATIVE_MATRIX_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVCooperativeMatrixSpecVersion   = VK_NV_COOPERATIVE_MATRIX_SPEC_VERSION;\n\n  //=== VK_NV_coverage_reduction_mode ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVCoverageReductionModeExtensionName = VK_NV_COVERAGE_REDUCTION_MODE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVCoverageReductionModeSpecVersion   = VK_NV_COVERAGE_REDUCTION_MODE_SPEC_VERSION;\n\n  //=== VK_EXT_fragment_shader_interlock ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTFragmentShaderInterlockExtensionName = VK_EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTFragmentShaderInterlockSpecVersion   = VK_EXT_FRAGMENT_SHADER_INTERLOCK_SPEC_VERSION;\n\n  //=== VK_EXT_ycbcr_image_arrays ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTYcbcrImageArraysExtensionName = VK_EXT_YCBCR_IMAGE_ARRAYS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTYcbcrImageArraysSpecVersion   = VK_EXT_YCBCR_IMAGE_ARRAYS_SPEC_VERSION;\n\n  //=== VK_KHR_uniform_buffer_standard_layout ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRUniformBufferStandardLayoutExtensionName = VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRUniformBufferStandardLayoutSpecVersion   = VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_SPEC_VERSION;\n\n  //=== VK_EXT_provoking_vertex ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTProvokingVertexExtensionName = VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTProvokingVertexSpecVersion   = VK_EXT_PROVOKING_VERTEX_SPEC_VERSION;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_EXT_full_screen_exclusive ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTFullScreenExclusiveExtensionName = VK_EXT_FULL_SCREEN_EXCLUSIVE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTFullScreenExclusiveSpecVersion   = VK_EXT_FULL_SCREEN_EXCLUSIVE_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_EXT_headless_surface ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTHeadlessSurfaceExtensionName = VK_EXT_HEADLESS_SURFACE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTHeadlessSurfaceSpecVersion   = VK_EXT_HEADLESS_SURFACE_SPEC_VERSION;\n\n  //=== VK_KHR_buffer_device_address ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRBufferDeviceAddressExtensionName = VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRBufferDeviceAddressSpecVersion   = VK_KHR_BUFFER_DEVICE_ADDRESS_SPEC_VERSION;\n\n  //=== VK_EXT_line_rasterization ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTLineRasterizationExtensionName = VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTLineRasterizationSpecVersion   = VK_EXT_LINE_RASTERIZATION_SPEC_VERSION;\n\n  //=== VK_EXT_shader_atomic_float ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderAtomicFloatExtensionName = VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderAtomicFloatSpecVersion   = VK_EXT_SHADER_ATOMIC_FLOAT_SPEC_VERSION;\n\n  //=== VK_EXT_host_query_reset ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTHostQueryResetExtensionName = VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTHostQueryResetSpecVersion   = VK_EXT_HOST_QUERY_RESET_SPEC_VERSION;\n\n  //=== VK_EXT_index_type_uint8 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTIndexTypeUint8ExtensionName = VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTIndexTypeUint8SpecVersion   = VK_EXT_INDEX_TYPE_UINT8_SPEC_VERSION;\n\n  //=== VK_EXT_extended_dynamic_state ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTExtendedDynamicStateExtensionName = VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTExtendedDynamicStateSpecVersion   = VK_EXT_EXTENDED_DYNAMIC_STATE_SPEC_VERSION;\n\n  //=== VK_KHR_deferred_host_operations ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDeferredHostOperationsExtensionName = VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDeferredHostOperationsSpecVersion   = VK_KHR_DEFERRED_HOST_OPERATIONS_SPEC_VERSION;\n\n  //=== VK_KHR_pipeline_executable_properties ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRPipelineExecutablePropertiesExtensionName = VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRPipelineExecutablePropertiesSpecVersion   = VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_SPEC_VERSION;\n\n  //=== VK_EXT_host_image_copy ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTHostImageCopyExtensionName = VK_EXT_HOST_IMAGE_COPY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTHostImageCopySpecVersion   = VK_EXT_HOST_IMAGE_COPY_SPEC_VERSION;\n\n  //=== VK_KHR_map_memory2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRMapMemory2ExtensionName = VK_KHR_MAP_MEMORY_2_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRMapMemory2SpecVersion   = VK_KHR_MAP_MEMORY_2_SPEC_VERSION;\n\n  //=== VK_EXT_map_memory_placed ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTMapMemoryPlacedExtensionName = VK_EXT_MAP_MEMORY_PLACED_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTMapMemoryPlacedSpecVersion   = VK_EXT_MAP_MEMORY_PLACED_SPEC_VERSION;\n\n  //=== VK_EXT_shader_atomic_float2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderAtomicFloat2ExtensionName = VK_EXT_SHADER_ATOMIC_FLOAT_2_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderAtomicFloat2SpecVersion   = VK_EXT_SHADER_ATOMIC_FLOAT_2_SPEC_VERSION;\n\n  //=== VK_EXT_surface_maintenance1 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTSurfaceMaintenance1ExtensionName = VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTSurfaceMaintenance1SpecVersion   = VK_EXT_SURFACE_MAINTENANCE_1_SPEC_VERSION;\n\n  //=== VK_EXT_swapchain_maintenance1 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTSwapchainMaintenance1ExtensionName = VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTSwapchainMaintenance1SpecVersion   = VK_EXT_SWAPCHAIN_MAINTENANCE_1_SPEC_VERSION;\n\n  //=== VK_EXT_shader_demote_to_helper_invocation ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderDemoteToHelperInvocationExtensionName = VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderDemoteToHelperInvocationSpecVersion   = VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_SPEC_VERSION;\n\n  //=== VK_NV_device_generated_commands ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVDeviceGeneratedCommandsExtensionName = VK_NV_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVDeviceGeneratedCommandsSpecVersion   = VK_NV_DEVICE_GENERATED_COMMANDS_SPEC_VERSION;\n\n  //=== VK_NV_inherited_viewport_scissor ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVInheritedViewportScissorExtensionName = VK_NV_INHERITED_VIEWPORT_SCISSOR_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVInheritedViewportScissorSpecVersion   = VK_NV_INHERITED_VIEWPORT_SCISSOR_SPEC_VERSION;\n\n  //=== VK_KHR_shader_integer_dot_product ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderIntegerDotProductExtensionName = VK_KHR_SHADER_INTEGER_DOT_PRODUCT_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderIntegerDotProductSpecVersion   = VK_KHR_SHADER_INTEGER_DOT_PRODUCT_SPEC_VERSION;\n\n  //=== VK_EXT_texel_buffer_alignment ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTTexelBufferAlignmentExtensionName = VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTTexelBufferAlignmentSpecVersion   = VK_EXT_TEXEL_BUFFER_ALIGNMENT_SPEC_VERSION;\n\n  //=== VK_QCOM_render_pass_transform ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMRenderPassTransformExtensionName = VK_QCOM_RENDER_PASS_TRANSFORM_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMRenderPassTransformSpecVersion   = VK_QCOM_RENDER_PASS_TRANSFORM_SPEC_VERSION;\n\n  //=== VK_EXT_depth_bias_control ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDepthBiasControlExtensionName = VK_EXT_DEPTH_BIAS_CONTROL_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDepthBiasControlSpecVersion   = VK_EXT_DEPTH_BIAS_CONTROL_SPEC_VERSION;\n\n  //=== VK_EXT_device_memory_report ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDeviceMemoryReportExtensionName = VK_EXT_DEVICE_MEMORY_REPORT_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDeviceMemoryReportSpecVersion   = VK_EXT_DEVICE_MEMORY_REPORT_SPEC_VERSION;\n\n  //=== VK_EXT_acquire_drm_display ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTAcquireDrmDisplayExtensionName = VK_EXT_ACQUIRE_DRM_DISPLAY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTAcquireDrmDisplaySpecVersion   = VK_EXT_ACQUIRE_DRM_DISPLAY_SPEC_VERSION;\n\n  //=== VK_EXT_robustness2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTRobustness2ExtensionName = VK_EXT_ROBUSTNESS_2_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTRobustness2SpecVersion   = VK_EXT_ROBUSTNESS_2_SPEC_VERSION;\n\n  //=== VK_EXT_custom_border_color ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTCustomBorderColorExtensionName = VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTCustomBorderColorSpecVersion   = VK_EXT_CUSTOM_BORDER_COLOR_SPEC_VERSION;\n\n  //=== VK_GOOGLE_user_type ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto GOOGLEUserTypeExtensionName = VK_GOOGLE_USER_TYPE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto GOOGLEUserTypeSpecVersion   = VK_GOOGLE_USER_TYPE_SPEC_VERSION;\n\n  //=== VK_KHR_pipeline_library ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRPipelineLibraryExtensionName = VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRPipelineLibrarySpecVersion   = VK_KHR_PIPELINE_LIBRARY_SPEC_VERSION;\n\n  //=== VK_NV_present_barrier ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVPresentBarrierExtensionName = VK_NV_PRESENT_BARRIER_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVPresentBarrierSpecVersion   = VK_NV_PRESENT_BARRIER_SPEC_VERSION;\n\n  //=== VK_KHR_shader_non_semantic_info ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderNonSemanticInfoExtensionName = VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderNonSemanticInfoSpecVersion   = VK_KHR_SHADER_NON_SEMANTIC_INFO_SPEC_VERSION;\n\n  //=== VK_KHR_present_id ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRPresentIdExtensionName = VK_KHR_PRESENT_ID_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRPresentIdSpecVersion   = VK_KHR_PRESENT_ID_SPEC_VERSION;\n\n  //=== VK_EXT_private_data ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPrivateDataExtensionName = VK_EXT_PRIVATE_DATA_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPrivateDataSpecVersion   = VK_EXT_PRIVATE_DATA_SPEC_VERSION;\n\n  //=== VK_EXT_pipeline_creation_cache_control ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPipelineCreationCacheControlExtensionName = VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPipelineCreationCacheControlSpecVersion   = VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_SPEC_VERSION;\n\n  //=== VK_KHR_video_encode_queue ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoEncodeQueueExtensionName = VK_KHR_VIDEO_ENCODE_QUEUE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoEncodeQueueSpecVersion   = VK_KHR_VIDEO_ENCODE_QUEUE_SPEC_VERSION;\n\n  //=== VK_NV_device_diagnostics_config ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVDeviceDiagnosticsConfigExtensionName = VK_NV_DEVICE_DIAGNOSTICS_CONFIG_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVDeviceDiagnosticsConfigSpecVersion   = VK_NV_DEVICE_DIAGNOSTICS_CONFIG_SPEC_VERSION;\n\n  //=== VK_QCOM_render_pass_store_ops ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMRenderPassStoreOpsExtensionName = VK_QCOM_RENDER_PASS_STORE_OPS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMRenderPassStoreOpsSpecVersion   = VK_QCOM_RENDER_PASS_STORE_OPS_SPEC_VERSION;\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  //=== VK_NV_cuda_kernel_launch ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVCudaKernelLaunchExtensionName = VK_NV_CUDA_KERNEL_LAUNCH_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVCudaKernelLaunchSpecVersion   = VK_NV_CUDA_KERNEL_LAUNCH_SPEC_VERSION;\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  //=== VK_NV_low_latency ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVLowLatencyExtensionName = VK_NV_LOW_LATENCY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVLowLatencySpecVersion   = VK_NV_LOW_LATENCY_SPEC_VERSION;\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  //=== VK_EXT_metal_objects ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTMetalObjectsExtensionName = VK_EXT_METAL_OBJECTS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTMetalObjectsSpecVersion   = VK_EXT_METAL_OBJECTS_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n  //=== VK_KHR_synchronization2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRSynchronization2ExtensionName = VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRSynchronization2SpecVersion   = VK_KHR_SYNCHRONIZATION_2_SPEC_VERSION;\n\n  //=== VK_EXT_descriptor_buffer ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDescriptorBufferExtensionName = VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDescriptorBufferSpecVersion   = VK_EXT_DESCRIPTOR_BUFFER_SPEC_VERSION;\n\n  //=== VK_EXT_graphics_pipeline_library ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTGraphicsPipelineLibraryExtensionName = VK_EXT_GRAPHICS_PIPELINE_LIBRARY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTGraphicsPipelineLibrarySpecVersion   = VK_EXT_GRAPHICS_PIPELINE_LIBRARY_SPEC_VERSION;\n\n  //=== VK_AMD_shader_early_and_late_fragment_tests ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDShaderEarlyAndLateFragmentTestsExtensionName = VK_AMD_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDShaderEarlyAndLateFragmentTestsSpecVersion   = VK_AMD_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_SPEC_VERSION;\n\n  //=== VK_KHR_fragment_shader_barycentric ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRFragmentShaderBarycentricExtensionName = VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRFragmentShaderBarycentricSpecVersion   = VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_SPEC_VERSION;\n\n  //=== VK_KHR_shader_subgroup_uniform_control_flow ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderSubgroupUniformControlFlowExtensionName = VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderSubgroupUniformControlFlowSpecVersion   = VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_SPEC_VERSION;\n\n  //=== VK_KHR_zero_initialize_workgroup_memory ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRZeroInitializeWorkgroupMemoryExtensionName = VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRZeroInitializeWorkgroupMemorySpecVersion   = VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_SPEC_VERSION;\n\n  //=== VK_NV_fragment_shading_rate_enums ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVFragmentShadingRateEnumsExtensionName = VK_NV_FRAGMENT_SHADING_RATE_ENUMS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVFragmentShadingRateEnumsSpecVersion   = VK_NV_FRAGMENT_SHADING_RATE_ENUMS_SPEC_VERSION;\n\n  //=== VK_NV_ray_tracing_motion_blur ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVRayTracingMotionBlurExtensionName = VK_NV_RAY_TRACING_MOTION_BLUR_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVRayTracingMotionBlurSpecVersion   = VK_NV_RAY_TRACING_MOTION_BLUR_SPEC_VERSION;\n\n  //=== VK_EXT_mesh_shader ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTMeshShaderExtensionName = VK_EXT_MESH_SHADER_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTMeshShaderSpecVersion   = VK_EXT_MESH_SHADER_SPEC_VERSION;\n\n  //=== VK_EXT_ycbcr_2plane_444_formats ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTYcbcr2Plane444FormatsExtensionName = VK_EXT_YCBCR_2PLANE_444_FORMATS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTYcbcr2Plane444FormatsSpecVersion   = VK_EXT_YCBCR_2PLANE_444_FORMATS_SPEC_VERSION;\n\n  //=== VK_EXT_fragment_density_map2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTFragmentDensityMap2ExtensionName = VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTFragmentDensityMap2SpecVersion   = VK_EXT_FRAGMENT_DENSITY_MAP_2_SPEC_VERSION;\n\n  //=== VK_QCOM_rotated_copy_commands ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMRotatedCopyCommandsExtensionName = VK_QCOM_ROTATED_COPY_COMMANDS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMRotatedCopyCommandsSpecVersion   = VK_QCOM_ROTATED_COPY_COMMANDS_SPEC_VERSION;\n\n  //=== VK_EXT_image_robustness ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTImageRobustnessExtensionName = VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTImageRobustnessSpecVersion   = VK_EXT_IMAGE_ROBUSTNESS_SPEC_VERSION;\n\n  //=== VK_KHR_workgroup_memory_explicit_layout ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRWorkgroupMemoryExplicitLayoutExtensionName = VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRWorkgroupMemoryExplicitLayoutSpecVersion   = VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_SPEC_VERSION;\n\n  //=== VK_KHR_copy_commands2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRCopyCommands2ExtensionName = VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRCopyCommands2SpecVersion   = VK_KHR_COPY_COMMANDS_2_SPEC_VERSION;\n\n  //=== VK_EXT_image_compression_control ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTImageCompressionControlExtensionName = VK_EXT_IMAGE_COMPRESSION_CONTROL_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTImageCompressionControlSpecVersion   = VK_EXT_IMAGE_COMPRESSION_CONTROL_SPEC_VERSION;\n\n  //=== VK_EXT_attachment_feedback_loop_layout ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTAttachmentFeedbackLoopLayoutExtensionName = VK_EXT_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTAttachmentFeedbackLoopLayoutSpecVersion   = VK_EXT_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_SPEC_VERSION;\n\n  //=== VK_EXT_4444_formats ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXT4444FormatsExtensionName = VK_EXT_4444_FORMATS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXT4444FormatsSpecVersion   = VK_EXT_4444_FORMATS_SPEC_VERSION;\n\n  //=== VK_EXT_device_fault ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDeviceFaultExtensionName = VK_EXT_DEVICE_FAULT_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDeviceFaultSpecVersion   = VK_EXT_DEVICE_FAULT_SPEC_VERSION;\n\n  //=== VK_ARM_rasterization_order_attachment_access ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto ARMRasterizationOrderAttachmentAccessExtensionName = VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto ARMRasterizationOrderAttachmentAccessSpecVersion   = VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_SPEC_VERSION;\n\n  //=== VK_EXT_rgba10x6_formats ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTRgba10X6FormatsExtensionName = VK_EXT_RGBA10X6_FORMATS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTRgba10X6FormatsSpecVersion   = VK_EXT_RGBA10X6_FORMATS_SPEC_VERSION;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_NV_acquire_winrt_display ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVAcquireWinrtDisplayExtensionName = VK_NV_ACQUIRE_WINRT_DISPLAY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVAcquireWinrtDisplaySpecVersion   = VK_NV_ACQUIRE_WINRT_DISPLAY_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n  //=== VK_EXT_directfb_surface ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDirectfbSurfaceExtensionName = VK_EXT_DIRECTFB_SURFACE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDirectfbSurfaceSpecVersion   = VK_EXT_DIRECTFB_SURFACE_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n\n  //=== VK_VALVE_mutable_descriptor_type ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto VALVEMutableDescriptorTypeExtensionName = VK_VALVE_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto VALVEMutableDescriptorTypeSpecVersion   = VK_VALVE_MUTABLE_DESCRIPTOR_TYPE_SPEC_VERSION;\n\n  //=== VK_EXT_vertex_input_dynamic_state ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTVertexInputDynamicStateExtensionName = VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTVertexInputDynamicStateSpecVersion   = VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_SPEC_VERSION;\n\n  //=== VK_EXT_physical_device_drm ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPhysicalDeviceDrmExtensionName = VK_EXT_PHYSICAL_DEVICE_DRM_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPhysicalDeviceDrmSpecVersion   = VK_EXT_PHYSICAL_DEVICE_DRM_SPEC_VERSION;\n\n  //=== VK_EXT_device_address_binding_report ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDeviceAddressBindingReportExtensionName = VK_EXT_DEVICE_ADDRESS_BINDING_REPORT_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDeviceAddressBindingReportSpecVersion   = VK_EXT_DEVICE_ADDRESS_BINDING_REPORT_SPEC_VERSION;\n\n  //=== VK_EXT_depth_clip_control ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDepthClipControlExtensionName = VK_EXT_DEPTH_CLIP_CONTROL_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDepthClipControlSpecVersion   = VK_EXT_DEPTH_CLIP_CONTROL_SPEC_VERSION;\n\n  //=== VK_EXT_primitive_topology_list_restart ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPrimitiveTopologyListRestartExtensionName = VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPrimitiveTopologyListRestartSpecVersion   = VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_SPEC_VERSION;\n\n  //=== VK_KHR_format_feature_flags2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRFormatFeatureFlags2ExtensionName = VK_KHR_FORMAT_FEATURE_FLAGS_2_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRFormatFeatureFlags2SpecVersion   = VK_KHR_FORMAT_FEATURE_FLAGS_2_SPEC_VERSION;\n\n  //=== VK_EXT_present_mode_fifo_latest_ready ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPresentModeFifoLatestReadyExtensionName = VK_EXT_PRESENT_MODE_FIFO_LATEST_READY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPresentModeFifoLatestReadySpecVersion   = VK_EXT_PRESENT_MODE_FIFO_LATEST_READY_SPEC_VERSION;\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_external_memory ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto FUCHSIAExternalMemoryExtensionName = VK_FUCHSIA_EXTERNAL_MEMORY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto FUCHSIAExternalMemorySpecVersion   = VK_FUCHSIA_EXTERNAL_MEMORY_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_external_semaphore ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto FUCHSIAExternalSemaphoreExtensionName = VK_FUCHSIA_EXTERNAL_SEMAPHORE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto FUCHSIAExternalSemaphoreSpecVersion   = VK_FUCHSIA_EXTERNAL_SEMAPHORE_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_buffer_collection ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto FUCHSIABufferCollectionExtensionName = VK_FUCHSIA_BUFFER_COLLECTION_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto FUCHSIABufferCollectionSpecVersion   = VK_FUCHSIA_BUFFER_COLLECTION_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  //=== VK_HUAWEI_subpass_shading ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto HUAWEISubpassShadingExtensionName = VK_HUAWEI_SUBPASS_SHADING_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto HUAWEISubpassShadingSpecVersion   = VK_HUAWEI_SUBPASS_SHADING_SPEC_VERSION;\n\n  //=== VK_HUAWEI_invocation_mask ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto HUAWEIInvocationMaskExtensionName = VK_HUAWEI_INVOCATION_MASK_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto HUAWEIInvocationMaskSpecVersion   = VK_HUAWEI_INVOCATION_MASK_SPEC_VERSION;\n\n  //=== VK_NV_external_memory_rdma ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVExternalMemoryRdmaExtensionName = VK_NV_EXTERNAL_MEMORY_RDMA_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVExternalMemoryRdmaSpecVersion   = VK_NV_EXTERNAL_MEMORY_RDMA_SPEC_VERSION;\n\n  //=== VK_EXT_pipeline_properties ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPipelinePropertiesExtensionName = VK_EXT_PIPELINE_PROPERTIES_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPipelinePropertiesSpecVersion   = VK_EXT_PIPELINE_PROPERTIES_SPEC_VERSION;\n\n  //=== VK_EXT_frame_boundary ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTFrameBoundaryExtensionName = VK_EXT_FRAME_BOUNDARY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTFrameBoundarySpecVersion   = VK_EXT_FRAME_BOUNDARY_SPEC_VERSION;\n\n  //=== VK_EXT_multisampled_render_to_single_sampled ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTMultisampledRenderToSingleSampledExtensionName = VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTMultisampledRenderToSingleSampledSpecVersion   = VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_SPEC_VERSION;\n\n  //=== VK_EXT_extended_dynamic_state2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTExtendedDynamicState2ExtensionName = VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTExtendedDynamicState2SpecVersion   = VK_EXT_EXTENDED_DYNAMIC_STATE_2_SPEC_VERSION;\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n  //=== VK_QNX_screen_surface ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto QNXScreenSurfaceExtensionName = VK_QNX_SCREEN_SURFACE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto QNXScreenSurfaceSpecVersion   = VK_QNX_SCREEN_SURFACE_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n  //=== VK_EXT_color_write_enable ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTColorWriteEnableExtensionName = VK_EXT_COLOR_WRITE_ENABLE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTColorWriteEnableSpecVersion   = VK_EXT_COLOR_WRITE_ENABLE_SPEC_VERSION;\n\n  //=== VK_EXT_primitives_generated_query ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPrimitivesGeneratedQueryExtensionName = VK_EXT_PRIMITIVES_GENERATED_QUERY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPrimitivesGeneratedQuerySpecVersion   = VK_EXT_PRIMITIVES_GENERATED_QUERY_SPEC_VERSION;\n\n  //=== VK_KHR_ray_tracing_maintenance1 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRRayTracingMaintenance1ExtensionName = VK_KHR_RAY_TRACING_MAINTENANCE_1_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRRayTracingMaintenance1SpecVersion   = VK_KHR_RAY_TRACING_MAINTENANCE_1_SPEC_VERSION;\n\n  //=== VK_EXT_global_priority_query ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTGlobalPriorityQueryExtensionName = VK_EXT_GLOBAL_PRIORITY_QUERY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTGlobalPriorityQuerySpecVersion   = VK_EXT_GLOBAL_PRIORITY_QUERY_SPEC_VERSION;\n\n  //=== VK_EXT_image_view_min_lod ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTImageViewMinLodExtensionName = VK_EXT_IMAGE_VIEW_MIN_LOD_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTImageViewMinLodSpecVersion   = VK_EXT_IMAGE_VIEW_MIN_LOD_SPEC_VERSION;\n\n  //=== VK_EXT_multi_draw ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTMultiDrawExtensionName = VK_EXT_MULTI_DRAW_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTMultiDrawSpecVersion   = VK_EXT_MULTI_DRAW_SPEC_VERSION;\n\n  //=== VK_EXT_image_2d_view_of_3d ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTImage2DViewOf3DExtensionName = VK_EXT_IMAGE_2D_VIEW_OF_3D_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTImage2DViewOf3DSpecVersion   = VK_EXT_IMAGE_2D_VIEW_OF_3D_SPEC_VERSION;\n\n  //=== VK_KHR_portability_enumeration ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRPortabilityEnumerationExtensionName = VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRPortabilityEnumerationSpecVersion   = VK_KHR_PORTABILITY_ENUMERATION_SPEC_VERSION;\n\n  //=== VK_EXT_shader_tile_image ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderTileImageExtensionName = VK_EXT_SHADER_TILE_IMAGE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderTileImageSpecVersion   = VK_EXT_SHADER_TILE_IMAGE_SPEC_VERSION;\n\n  //=== VK_EXT_opacity_micromap ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTOpacityMicromapExtensionName = VK_EXT_OPACITY_MICROMAP_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTOpacityMicromapSpecVersion   = VK_EXT_OPACITY_MICROMAP_SPEC_VERSION;\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  //=== VK_NV_displacement_micromap ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVDisplacementMicromapExtensionName = VK_NV_DISPLACEMENT_MICROMAP_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVDisplacementMicromapSpecVersion   = VK_NV_DISPLACEMENT_MICROMAP_SPEC_VERSION;\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  //=== VK_EXT_load_store_op_none ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTLoadStoreOpNoneExtensionName = VK_EXT_LOAD_STORE_OP_NONE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTLoadStoreOpNoneSpecVersion   = VK_EXT_LOAD_STORE_OP_NONE_SPEC_VERSION;\n\n  //=== VK_HUAWEI_cluster_culling_shader ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto HUAWEIClusterCullingShaderExtensionName = VK_HUAWEI_CLUSTER_CULLING_SHADER_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto HUAWEIClusterCullingShaderSpecVersion   = VK_HUAWEI_CLUSTER_CULLING_SHADER_SPEC_VERSION;\n\n  //=== VK_EXT_border_color_swizzle ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTBorderColorSwizzleExtensionName = VK_EXT_BORDER_COLOR_SWIZZLE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTBorderColorSwizzleSpecVersion   = VK_EXT_BORDER_COLOR_SWIZZLE_SPEC_VERSION;\n\n  //=== VK_EXT_pageable_device_local_memory ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPageableDeviceLocalMemoryExtensionName = VK_EXT_PAGEABLE_DEVICE_LOCAL_MEMORY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPageableDeviceLocalMemorySpecVersion   = VK_EXT_PAGEABLE_DEVICE_LOCAL_MEMORY_SPEC_VERSION;\n\n  //=== VK_KHR_maintenance4 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRMaintenance4ExtensionName = VK_KHR_MAINTENANCE_4_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRMaintenance4SpecVersion   = VK_KHR_MAINTENANCE_4_SPEC_VERSION;\n\n  //=== VK_ARM_shader_core_properties ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto ARMShaderCorePropertiesExtensionName = VK_ARM_SHADER_CORE_PROPERTIES_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto ARMShaderCorePropertiesSpecVersion   = VK_ARM_SHADER_CORE_PROPERTIES_SPEC_VERSION;\n\n  //=== VK_KHR_shader_subgroup_rotate ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderSubgroupRotateExtensionName = VK_KHR_SHADER_SUBGROUP_ROTATE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderSubgroupRotateSpecVersion   = VK_KHR_SHADER_SUBGROUP_ROTATE_SPEC_VERSION;\n\n  //=== VK_ARM_scheduling_controls ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto ARMSchedulingControlsExtensionName = VK_ARM_SCHEDULING_CONTROLS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto ARMSchedulingControlsSpecVersion   = VK_ARM_SCHEDULING_CONTROLS_SPEC_VERSION;\n\n  //=== VK_EXT_image_sliced_view_of_3d ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTImageSlicedViewOf3DExtensionName = VK_EXT_IMAGE_SLICED_VIEW_OF_3D_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTImageSlicedViewOf3DSpecVersion   = VK_EXT_IMAGE_SLICED_VIEW_OF_3D_SPEC_VERSION;\n\n  //=== VK_VALVE_descriptor_set_host_mapping ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto VALVEDescriptorSetHostMappingExtensionName = VK_VALVE_DESCRIPTOR_SET_HOST_MAPPING_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto VALVEDescriptorSetHostMappingSpecVersion   = VK_VALVE_DESCRIPTOR_SET_HOST_MAPPING_SPEC_VERSION;\n\n  //=== VK_EXT_depth_clamp_zero_one ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDepthClampZeroOneExtensionName = VK_EXT_DEPTH_CLAMP_ZERO_ONE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDepthClampZeroOneSpecVersion   = VK_EXT_DEPTH_CLAMP_ZERO_ONE_SPEC_VERSION;\n\n  //=== VK_EXT_non_seamless_cube_map ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTNonSeamlessCubeMapExtensionName = VK_EXT_NON_SEAMLESS_CUBE_MAP_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTNonSeamlessCubeMapSpecVersion   = VK_EXT_NON_SEAMLESS_CUBE_MAP_SPEC_VERSION;\n\n  //=== VK_ARM_render_pass_striped ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto ARMRenderPassStripedExtensionName = VK_ARM_RENDER_PASS_STRIPED_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto ARMRenderPassStripedSpecVersion   = VK_ARM_RENDER_PASS_STRIPED_SPEC_VERSION;\n\n  //=== VK_QCOM_fragment_density_map_offset ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMFragmentDensityMapOffsetExtensionName = VK_QCOM_FRAGMENT_DENSITY_MAP_OFFSET_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMFragmentDensityMapOffsetSpecVersion   = VK_QCOM_FRAGMENT_DENSITY_MAP_OFFSET_SPEC_VERSION;\n\n  //=== VK_NV_copy_memory_indirect ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVCopyMemoryIndirectExtensionName = VK_NV_COPY_MEMORY_INDIRECT_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVCopyMemoryIndirectSpecVersion   = VK_NV_COPY_MEMORY_INDIRECT_SPEC_VERSION;\n\n  //=== VK_NV_memory_decompression ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVMemoryDecompressionExtensionName = VK_NV_MEMORY_DECOMPRESSION_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVMemoryDecompressionSpecVersion   = VK_NV_MEMORY_DECOMPRESSION_SPEC_VERSION;\n\n  //=== VK_NV_device_generated_commands_compute ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVDeviceGeneratedCommandsComputeExtensionName = VK_NV_DEVICE_GENERATED_COMMANDS_COMPUTE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVDeviceGeneratedCommandsComputeSpecVersion   = VK_NV_DEVICE_GENERATED_COMMANDS_COMPUTE_SPEC_VERSION;\n\n  //=== VK_NV_ray_tracing_linear_swept_spheres ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVRayTracingLinearSweptSpheresExtensionName = VK_NV_RAY_TRACING_LINEAR_SWEPT_SPHERES_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVRayTracingLinearSweptSpheresSpecVersion   = VK_NV_RAY_TRACING_LINEAR_SWEPT_SPHERES_SPEC_VERSION;\n\n  //=== VK_NV_linear_color_attachment ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVLinearColorAttachmentExtensionName = VK_NV_LINEAR_COLOR_ATTACHMENT_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVLinearColorAttachmentSpecVersion   = VK_NV_LINEAR_COLOR_ATTACHMENT_SPEC_VERSION;\n\n  //=== VK_GOOGLE_surfaceless_query ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto GOOGLESurfacelessQueryExtensionName = VK_GOOGLE_SURFACELESS_QUERY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto GOOGLESurfacelessQuerySpecVersion   = VK_GOOGLE_SURFACELESS_QUERY_SPEC_VERSION;\n\n  //=== VK_KHR_shader_maximal_reconvergence ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderMaximalReconvergenceExtensionName = VK_KHR_SHADER_MAXIMAL_RECONVERGENCE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderMaximalReconvergenceSpecVersion   = VK_KHR_SHADER_MAXIMAL_RECONVERGENCE_SPEC_VERSION;\n\n  //=== VK_EXT_image_compression_control_swapchain ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTImageCompressionControlSwapchainExtensionName = VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTImageCompressionControlSwapchainSpecVersion   = VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_SPEC_VERSION;\n\n  //=== VK_QCOM_image_processing ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMImageProcessingExtensionName = VK_QCOM_IMAGE_PROCESSING_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMImageProcessingSpecVersion   = VK_QCOM_IMAGE_PROCESSING_SPEC_VERSION;\n\n  //=== VK_EXT_nested_command_buffer ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTNestedCommandBufferExtensionName = VK_EXT_NESTED_COMMAND_BUFFER_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTNestedCommandBufferSpecVersion   = VK_EXT_NESTED_COMMAND_BUFFER_SPEC_VERSION;\n\n  //=== VK_EXT_external_memory_acquire_unmodified ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTExternalMemoryAcquireUnmodifiedExtensionName = VK_EXT_EXTERNAL_MEMORY_ACQUIRE_UNMODIFIED_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTExternalMemoryAcquireUnmodifiedSpecVersion   = VK_EXT_EXTERNAL_MEMORY_ACQUIRE_UNMODIFIED_SPEC_VERSION;\n\n  //=== VK_EXT_extended_dynamic_state3 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTExtendedDynamicState3ExtensionName = VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTExtendedDynamicState3SpecVersion   = VK_EXT_EXTENDED_DYNAMIC_STATE_3_SPEC_VERSION;\n\n  //=== VK_EXT_subpass_merge_feedback ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTSubpassMergeFeedbackExtensionName = VK_EXT_SUBPASS_MERGE_FEEDBACK_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTSubpassMergeFeedbackSpecVersion   = VK_EXT_SUBPASS_MERGE_FEEDBACK_SPEC_VERSION;\n\n  //=== VK_LUNARG_direct_driver_loading ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto LUNARGDirectDriverLoadingExtensionName = VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto LUNARGDirectDriverLoadingSpecVersion   = VK_LUNARG_DIRECT_DRIVER_LOADING_SPEC_VERSION;\n\n  //=== VK_EXT_shader_module_identifier ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderModuleIdentifierExtensionName = VK_EXT_SHADER_MODULE_IDENTIFIER_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderModuleIdentifierSpecVersion   = VK_EXT_SHADER_MODULE_IDENTIFIER_SPEC_VERSION;\n\n  //=== VK_EXT_rasterization_order_attachment_access ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTRasterizationOrderAttachmentAccessExtensionName = VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTRasterizationOrderAttachmentAccessSpecVersion   = VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_SPEC_VERSION;\n\n  //=== VK_NV_optical_flow ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVOpticalFlowExtensionName = VK_NV_OPTICAL_FLOW_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVOpticalFlowSpecVersion   = VK_NV_OPTICAL_FLOW_SPEC_VERSION;\n\n  //=== VK_EXT_legacy_dithering ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTLegacyDitheringExtensionName = VK_EXT_LEGACY_DITHERING_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTLegacyDitheringSpecVersion   = VK_EXT_LEGACY_DITHERING_SPEC_VERSION;\n\n  //=== VK_EXT_pipeline_protected_access ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPipelineProtectedAccessExtensionName = VK_EXT_PIPELINE_PROTECTED_ACCESS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPipelineProtectedAccessSpecVersion   = VK_EXT_PIPELINE_PROTECTED_ACCESS_SPEC_VERSION;\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  //=== VK_ANDROID_external_format_resolve ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto ANDROIDExternalFormatResolveExtensionName = VK_ANDROID_EXTERNAL_FORMAT_RESOLVE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto ANDROIDExternalFormatResolveSpecVersion   = VK_ANDROID_EXTERNAL_FORMAT_RESOLVE_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n  //=== VK_KHR_maintenance5 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRMaintenance5ExtensionName = VK_KHR_MAINTENANCE_5_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRMaintenance5SpecVersion   = VK_KHR_MAINTENANCE_5_SPEC_VERSION;\n\n  //=== VK_AMD_anti_lag ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDAntiLagExtensionName = VK_AMD_ANTI_LAG_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto AMDAntiLagSpecVersion   = VK_AMD_ANTI_LAG_SPEC_VERSION;\n\n  //=== VK_KHR_ray_tracing_position_fetch ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRRayTracingPositionFetchExtensionName = VK_KHR_RAY_TRACING_POSITION_FETCH_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRRayTracingPositionFetchSpecVersion   = VK_KHR_RAY_TRACING_POSITION_FETCH_SPEC_VERSION;\n\n  //=== VK_EXT_shader_object ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderObjectExtensionName = VK_EXT_SHADER_OBJECT_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderObjectSpecVersion   = VK_EXT_SHADER_OBJECT_SPEC_VERSION;\n\n  //=== VK_KHR_pipeline_binary ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRPipelineBinaryExtensionName = VK_KHR_PIPELINE_BINARY_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRPipelineBinarySpecVersion   = VK_KHR_PIPELINE_BINARY_SPEC_VERSION;\n\n  //=== VK_QCOM_tile_properties ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMTilePropertiesExtensionName = VK_QCOM_TILE_PROPERTIES_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMTilePropertiesSpecVersion   = VK_QCOM_TILE_PROPERTIES_SPEC_VERSION;\n\n  //=== VK_SEC_amigo_profiling ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto SECAmigoProfilingExtensionName = VK_SEC_AMIGO_PROFILING_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto SECAmigoProfilingSpecVersion   = VK_SEC_AMIGO_PROFILING_SPEC_VERSION;\n\n  //=== VK_QCOM_multiview_per_view_viewports ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMMultiviewPerViewViewportsExtensionName = VK_QCOM_MULTIVIEW_PER_VIEW_VIEWPORTS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMMultiviewPerViewViewportsSpecVersion   = VK_QCOM_MULTIVIEW_PER_VIEW_VIEWPORTS_SPEC_VERSION;\n\n  //=== VK_NV_ray_tracing_invocation_reorder ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVRayTracingInvocationReorderExtensionName = VK_NV_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVRayTracingInvocationReorderSpecVersion   = VK_NV_RAY_TRACING_INVOCATION_REORDER_SPEC_VERSION;\n\n  //=== VK_NV_cooperative_vector ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVCooperativeVectorExtensionName = VK_NV_COOPERATIVE_VECTOR_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVCooperativeVectorSpecVersion   = VK_NV_COOPERATIVE_VECTOR_SPEC_VERSION;\n\n  //=== VK_NV_extended_sparse_address_space ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVExtendedSparseAddressSpaceExtensionName = VK_NV_EXTENDED_SPARSE_ADDRESS_SPACE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVExtendedSparseAddressSpaceSpecVersion   = VK_NV_EXTENDED_SPARSE_ADDRESS_SPACE_SPEC_VERSION;\n\n  //=== VK_EXT_mutable_descriptor_type ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTMutableDescriptorTypeExtensionName = VK_EXT_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTMutableDescriptorTypeSpecVersion   = VK_EXT_MUTABLE_DESCRIPTOR_TYPE_SPEC_VERSION;\n\n  //=== VK_EXT_legacy_vertex_attributes ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTLegacyVertexAttributesExtensionName = VK_EXT_LEGACY_VERTEX_ATTRIBUTES_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTLegacyVertexAttributesSpecVersion   = VK_EXT_LEGACY_VERTEX_ATTRIBUTES_SPEC_VERSION;\n\n  //=== VK_EXT_layer_settings ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTLayerSettingsExtensionName = VK_EXT_LAYER_SETTINGS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTLayerSettingsSpecVersion   = VK_EXT_LAYER_SETTINGS_SPEC_VERSION;\n\n  //=== VK_ARM_shader_core_builtins ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto ARMShaderCoreBuiltinsExtensionName = VK_ARM_SHADER_CORE_BUILTINS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto ARMShaderCoreBuiltinsSpecVersion   = VK_ARM_SHADER_CORE_BUILTINS_SPEC_VERSION;\n\n  //=== VK_EXT_pipeline_library_group_handles ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPipelineLibraryGroupHandlesExtensionName = VK_EXT_PIPELINE_LIBRARY_GROUP_HANDLES_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTPipelineLibraryGroupHandlesSpecVersion   = VK_EXT_PIPELINE_LIBRARY_GROUP_HANDLES_SPEC_VERSION;\n\n  //=== VK_EXT_dynamic_rendering_unused_attachments ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDynamicRenderingUnusedAttachmentsExtensionName = VK_EXT_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDynamicRenderingUnusedAttachmentsSpecVersion   = VK_EXT_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_SPEC_VERSION;\n\n  //=== VK_NV_low_latency2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVLowLatency2ExtensionName = VK_NV_LOW_LATENCY_2_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVLowLatency2SpecVersion   = VK_NV_LOW_LATENCY_2_SPEC_VERSION;\n\n  //=== VK_KHR_cooperative_matrix ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRCooperativeMatrixExtensionName = VK_KHR_COOPERATIVE_MATRIX_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRCooperativeMatrixSpecVersion   = VK_KHR_COOPERATIVE_MATRIX_SPEC_VERSION;\n\n  //=== VK_QCOM_multiview_per_view_render_areas ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMMultiviewPerViewRenderAreasExtensionName = VK_QCOM_MULTIVIEW_PER_VIEW_RENDER_AREAS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMMultiviewPerViewRenderAreasSpecVersion   = VK_QCOM_MULTIVIEW_PER_VIEW_RENDER_AREAS_SPEC_VERSION;\n\n  //=== VK_KHR_compute_shader_derivatives ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRComputeShaderDerivativesExtensionName = VK_KHR_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRComputeShaderDerivativesSpecVersion   = VK_KHR_COMPUTE_SHADER_DERIVATIVES_SPEC_VERSION;\n\n  //=== VK_KHR_video_decode_av1 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoDecodeAv1ExtensionName = VK_KHR_VIDEO_DECODE_AV1_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoDecodeAv1SpecVersion   = VK_KHR_VIDEO_DECODE_AV1_SPEC_VERSION;\n\n  //=== VK_KHR_video_encode_av1 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoEncodeAv1ExtensionName = VK_KHR_VIDEO_ENCODE_AV1_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoEncodeAv1SpecVersion   = VK_KHR_VIDEO_ENCODE_AV1_SPEC_VERSION;\n\n  //=== VK_KHR_video_maintenance1 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoMaintenance1ExtensionName = VK_KHR_VIDEO_MAINTENANCE_1_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoMaintenance1SpecVersion   = VK_KHR_VIDEO_MAINTENANCE_1_SPEC_VERSION;\n\n  //=== VK_NV_per_stage_descriptor_set ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVPerStageDescriptorSetExtensionName = VK_NV_PER_STAGE_DESCRIPTOR_SET_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVPerStageDescriptorSetSpecVersion   = VK_NV_PER_STAGE_DESCRIPTOR_SET_SPEC_VERSION;\n\n  //=== VK_QCOM_image_processing2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMImageProcessing2ExtensionName = VK_QCOM_IMAGE_PROCESSING_2_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMImageProcessing2SpecVersion   = VK_QCOM_IMAGE_PROCESSING_2_SPEC_VERSION;\n\n  //=== VK_QCOM_filter_cubic_weights ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMFilterCubicWeightsExtensionName = VK_QCOM_FILTER_CUBIC_WEIGHTS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMFilterCubicWeightsSpecVersion   = VK_QCOM_FILTER_CUBIC_WEIGHTS_SPEC_VERSION;\n\n  //=== VK_QCOM_ycbcr_degamma ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMYcbcrDegammaExtensionName = VK_QCOM_YCBCR_DEGAMMA_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMYcbcrDegammaSpecVersion   = VK_QCOM_YCBCR_DEGAMMA_SPEC_VERSION;\n\n  //=== VK_QCOM_filter_cubic_clamp ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMFilterCubicClampExtensionName = VK_QCOM_FILTER_CUBIC_CLAMP_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto QCOMFilterCubicClampSpecVersion   = VK_QCOM_FILTER_CUBIC_CLAMP_SPEC_VERSION;\n\n  //=== VK_EXT_attachment_feedback_loop_dynamic_state ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTAttachmentFeedbackLoopDynamicStateExtensionName = VK_EXT_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTAttachmentFeedbackLoopDynamicStateSpecVersion   = VK_EXT_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_SPEC_VERSION;\n\n  //=== VK_KHR_vertex_attribute_divisor ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVertexAttributeDivisorExtensionName = VK_KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVertexAttributeDivisorSpecVersion   = VK_KHR_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION;\n\n  //=== VK_KHR_load_store_op_none ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRLoadStoreOpNoneExtensionName = VK_KHR_LOAD_STORE_OP_NONE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRLoadStoreOpNoneSpecVersion   = VK_KHR_LOAD_STORE_OP_NONE_SPEC_VERSION;\n\n  //=== VK_KHR_shader_float_controls2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderFloatControls2ExtensionName = VK_KHR_SHADER_FLOAT_CONTROLS_2_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderFloatControls2SpecVersion   = VK_KHR_SHADER_FLOAT_CONTROLS_2_SPEC_VERSION;\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n  //=== VK_QNX_external_memory_screen_buffer ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto QNXExternalMemoryScreenBufferExtensionName = VK_QNX_EXTERNAL_MEMORY_SCREEN_BUFFER_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto QNXExternalMemoryScreenBufferSpecVersion   = VK_QNX_EXTERNAL_MEMORY_SCREEN_BUFFER_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n  //=== VK_MSFT_layered_driver ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto MSFTLayeredDriverExtensionName = VK_MSFT_LAYERED_DRIVER_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto MSFTLayeredDriverSpecVersion   = VK_MSFT_LAYERED_DRIVER_SPEC_VERSION;\n\n  //=== VK_KHR_index_type_uint8 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRIndexTypeUint8ExtensionName = VK_KHR_INDEX_TYPE_UINT8_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRIndexTypeUint8SpecVersion   = VK_KHR_INDEX_TYPE_UINT8_SPEC_VERSION;\n\n  //=== VK_KHR_line_rasterization ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRLineRasterizationExtensionName = VK_KHR_LINE_RASTERIZATION_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRLineRasterizationSpecVersion   = VK_KHR_LINE_RASTERIZATION_SPEC_VERSION;\n\n  //=== VK_KHR_calibrated_timestamps ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRCalibratedTimestampsExtensionName = VK_KHR_CALIBRATED_TIMESTAMPS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRCalibratedTimestampsSpecVersion   = VK_KHR_CALIBRATED_TIMESTAMPS_SPEC_VERSION;\n\n  //=== VK_KHR_shader_expect_assume ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderExpectAssumeExtensionName = VK_KHR_SHADER_EXPECT_ASSUME_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderExpectAssumeSpecVersion   = VK_KHR_SHADER_EXPECT_ASSUME_SPEC_VERSION;\n\n  //=== VK_KHR_maintenance6 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRMaintenance6ExtensionName = VK_KHR_MAINTENANCE_6_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRMaintenance6SpecVersion   = VK_KHR_MAINTENANCE_6_SPEC_VERSION;\n\n  //=== VK_NV_descriptor_pool_overallocation ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVDescriptorPoolOverallocationExtensionName = VK_NV_DESCRIPTOR_POOL_OVERALLOCATION_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVDescriptorPoolOverallocationSpecVersion   = VK_NV_DESCRIPTOR_POOL_OVERALLOCATION_SPEC_VERSION;\n\n  //=== VK_NV_display_stereo ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVDisplayStereoExtensionName = VK_NV_DISPLAY_STEREO_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVDisplayStereoSpecVersion   = VK_NV_DISPLAY_STEREO_SPEC_VERSION;\n\n  //=== VK_KHR_video_encode_quantization_map ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoEncodeQuantizationMapExtensionName = VK_KHR_VIDEO_ENCODE_QUANTIZATION_MAP_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoEncodeQuantizationMapSpecVersion   = VK_KHR_VIDEO_ENCODE_QUANTIZATION_MAP_SPEC_VERSION;\n\n  //=== VK_NV_raw_access_chains ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVRawAccessChainsExtensionName = VK_NV_RAW_ACCESS_CHAINS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVRawAccessChainsSpecVersion   = VK_NV_RAW_ACCESS_CHAINS_SPEC_VERSION;\n\n  //=== VK_KHR_shader_relaxed_extended_instruction ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderRelaxedExtendedInstructionExtensionName = VK_KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRShaderRelaxedExtendedInstructionSpecVersion   = VK_KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_SPEC_VERSION;\n\n  //=== VK_NV_command_buffer_inheritance ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVCommandBufferInheritanceExtensionName = VK_NV_COMMAND_BUFFER_INHERITANCE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVCommandBufferInheritanceSpecVersion   = VK_NV_COMMAND_BUFFER_INHERITANCE_SPEC_VERSION;\n\n  //=== VK_KHR_maintenance7 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRMaintenance7ExtensionName = VK_KHR_MAINTENANCE_7_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRMaintenance7SpecVersion   = VK_KHR_MAINTENANCE_7_SPEC_VERSION;\n\n  //=== VK_NV_shader_atomic_float16_vector ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVShaderAtomicFloat16VectorExtensionName = VK_NV_SHADER_ATOMIC_FLOAT16_VECTOR_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVShaderAtomicFloat16VectorSpecVersion   = VK_NV_SHADER_ATOMIC_FLOAT16_VECTOR_SPEC_VERSION;\n\n  //=== VK_EXT_shader_replicated_composites ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderReplicatedCompositesExtensionName = VK_EXT_SHADER_REPLICATED_COMPOSITES_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTShaderReplicatedCompositesSpecVersion   = VK_EXT_SHADER_REPLICATED_COMPOSITES_SPEC_VERSION;\n\n  //=== VK_NV_ray_tracing_validation ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVRayTracingValidationExtensionName = VK_NV_RAY_TRACING_VALIDATION_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVRayTracingValidationSpecVersion   = VK_NV_RAY_TRACING_VALIDATION_SPEC_VERSION;\n\n  //=== VK_NV_cluster_acceleration_structure ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVClusterAccelerationStructureExtensionName = VK_NV_CLUSTER_ACCELERATION_STRUCTURE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVClusterAccelerationStructureSpecVersion   = VK_NV_CLUSTER_ACCELERATION_STRUCTURE_SPEC_VERSION;\n\n  //=== VK_NV_partitioned_acceleration_structure ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVPartitionedAccelerationStructureExtensionName = VK_NV_PARTITIONED_ACCELERATION_STRUCTURE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVPartitionedAccelerationStructureSpecVersion   = VK_NV_PARTITIONED_ACCELERATION_STRUCTURE_SPEC_VERSION;\n\n  //=== VK_EXT_device_generated_commands ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDeviceGeneratedCommandsExtensionName = VK_EXT_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDeviceGeneratedCommandsSpecVersion   = VK_EXT_DEVICE_GENERATED_COMMANDS_SPEC_VERSION;\n\n  //=== VK_KHR_maintenance8 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRMaintenance8ExtensionName = VK_KHR_MAINTENANCE_8_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRMaintenance8SpecVersion   = VK_KHR_MAINTENANCE_8_SPEC_VERSION;\n\n  //=== VK_MESA_image_alignment_control ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto MESAImageAlignmentControlExtensionName = VK_MESA_IMAGE_ALIGNMENT_CONTROL_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto MESAImageAlignmentControlSpecVersion   = VK_MESA_IMAGE_ALIGNMENT_CONTROL_SPEC_VERSION;\n\n  //=== VK_EXT_depth_clamp_control ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDepthClampControlExtensionName = VK_EXT_DEPTH_CLAMP_CONTROL_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTDepthClampControlSpecVersion   = VK_EXT_DEPTH_CLAMP_CONTROL_SPEC_VERSION;\n\n  //=== VK_KHR_video_maintenance2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoMaintenance2ExtensionName = VK_KHR_VIDEO_MAINTENANCE_2_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRVideoMaintenance2SpecVersion   = VK_KHR_VIDEO_MAINTENANCE_2_SPEC_VERSION;\n\n  //=== VK_HUAWEI_hdr_vivid ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto HUAWEIHdrVividExtensionName = VK_HUAWEI_HDR_VIVID_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto HUAWEIHdrVividSpecVersion   = VK_HUAWEI_HDR_VIVID_SPEC_VERSION;\n\n  //=== VK_NV_cooperative_matrix2 ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVCooperativeMatrix2ExtensionName = VK_NV_COOPERATIVE_MATRIX_2_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto NVCooperativeMatrix2SpecVersion   = VK_NV_COOPERATIVE_MATRIX_2_SPEC_VERSION;\n\n  //=== VK_ARM_pipeline_opacity_micromap ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto ARMPipelineOpacityMicromapExtensionName = VK_ARM_PIPELINE_OPACITY_MICROMAP_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto ARMPipelineOpacityMicromapSpecVersion   = VK_ARM_PIPELINE_OPACITY_MICROMAP_SPEC_VERSION;\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  //=== VK_EXT_external_memory_metal ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTExternalMemoryMetalExtensionName = VK_EXT_EXTERNAL_MEMORY_METAL_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTExternalMemoryMetalSpecVersion   = VK_EXT_EXTERNAL_MEMORY_METAL_SPEC_VERSION;\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n  //=== VK_KHR_depth_clamp_zero_one ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDepthClampZeroOneExtensionName = VK_KHR_DEPTH_CLAMP_ZERO_ONE_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto KHRDepthClampZeroOneSpecVersion   = VK_KHR_DEPTH_CLAMP_ZERO_ONE_SPEC_VERSION;\n\n  //=== VK_EXT_vertex_attribute_robustness ===\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTVertexAttributeRobustnessExtensionName = VK_EXT_VERTEX_ATTRIBUTE_ROBUSTNESS_EXTENSION_NAME;\n  VULKAN_HPP_CONSTEXPR_INLINE auto EXTVertexAttributeRobustnessSpecVersion   = VK_EXT_VERTEX_ATTRIBUTE_ROBUSTNESS_SPEC_VERSION;\n\n}  // namespace VULKAN_HPP_NAMESPACE\n\n// clang-format off\n#include <vulkan/vulkan_handles.hpp>\n#include <vulkan/vulkan_structs.hpp>\n#include <vulkan/vulkan_funcs.hpp>\n\n// clang-format on\n\nnamespace VULKAN_HPP_NAMESPACE\n{\n#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n\n  //=======================\n  //=== STRUCTS EXTENDS ===\n  //=======================\n\n  //=== VK_VERSION_1_0 ===\n  template <>\n  struct StructExtends<ShaderModuleCreateInfo, PipelineShaderStageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineLayoutCreateInfo, BindDescriptorSetsInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineLayoutCreateInfo, PushConstantsInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineLayoutCreateInfo, PushDescriptorSetInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineLayoutCreateInfo, PushDescriptorSetWithTemplateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineLayoutCreateInfo, SetDescriptorBufferOffsetsInfoEXT>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineLayoutCreateInfo, BindDescriptorBufferEmbeddedSamplersInfoEXT>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineLayoutCreateInfo, IndirectCommandsLayoutCreateInfoEXT>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_VERSION_1_1 ===\n  template <>\n  struct StructExtends<PhysicalDeviceSubgroupProperties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevice16BitStorageFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevice16BitStorageFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<MemoryDedicatedRequirements, MemoryRequirements2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<MemoryDedicatedAllocateInfo, MemoryAllocateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<MemoryAllocateFlagsInfo, MemoryAllocateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DeviceGroupRenderPassBeginInfo, RenderPassBeginInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DeviceGroupRenderPassBeginInfo, RenderingInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DeviceGroupCommandBufferBeginInfo, CommandBufferBeginInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DeviceGroupSubmitInfo, SubmitInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DeviceGroupBindSparseInfo, BindSparseInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<BindBufferMemoryDeviceGroupInfo, BindBufferMemoryInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<BindImageMemoryDeviceGroupInfo, BindImageMemoryInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DeviceGroupDeviceCreateInfo, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceFeatures2, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePointClippingProperties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<RenderPassInputAttachmentAspectCreateInfo, RenderPassCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImageViewUsageCreateInfo, ImageViewCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineTessellationDomainOriginStateCreateInfo, PipelineTessellationStateCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<RenderPassMultiviewCreateInfo, RenderPassCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMultiviewFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMultiviewFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMultiviewProperties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceVariablePointersFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceVariablePointersFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceProtectedMemoryFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceProtectedMemoryFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceProtectedMemoryProperties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ProtectedSubmitInfo, SubmitInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SamplerYcbcrConversionInfo, SamplerCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SamplerYcbcrConversionInfo, ImageViewCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<BindImagePlaneMemoryInfo, BindImageMemoryInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImagePlaneMemoryRequirementsInfo, ImageMemoryRequirementsInfo2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceSamplerYcbcrConversionFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceSamplerYcbcrConversionFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SamplerYcbcrConversionImageFormatProperties, ImageFormatProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceExternalImageFormatInfo, PhysicalDeviceImageFormatInfo2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExternalImageFormatProperties, ImageFormatProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceIDProperties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExternalMemoryImageCreateInfo, ImageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExternalMemoryBufferCreateInfo, BufferCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExportMemoryAllocateInfo, MemoryAllocateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExportFenceCreateInfo, FenceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExportSemaphoreCreateInfo, SemaphoreCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMaintenance3Properties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderDrawParametersFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderDrawParametersFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_VERSION_1_2 ===\n  template <>\n  struct StructExtends<PhysicalDeviceVulkan11Features, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceVulkan11Features, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceVulkan11Properties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceVulkan12Features, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceVulkan12Features, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceVulkan12Properties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImageFormatListCreateInfo, ImageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImageFormatListCreateInfo, SwapchainCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImageFormatListCreateInfo, PhysicalDeviceImageFormatInfo2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevice8BitStorageFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevice8BitStorageFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDriverProperties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderAtomicInt64Features, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderAtomicInt64Features, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderFloat16Int8Features, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderFloat16Int8Features, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceFloatControlsProperties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DescriptorSetLayoutBindingFlagsCreateInfo, DescriptorSetLayoutCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDescriptorIndexingFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDescriptorIndexingFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDescriptorIndexingProperties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DescriptorSetVariableDescriptorCountAllocateInfo, DescriptorSetAllocateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DescriptorSetVariableDescriptorCountLayoutSupport, DescriptorSetLayoutSupport>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SubpassDescriptionDepthStencilResolve, SubpassDescription2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDepthStencilResolveProperties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceScalarBlockLayoutFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceScalarBlockLayoutFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImageStencilUsageCreateInfo, ImageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImageStencilUsageCreateInfo, PhysicalDeviceImageFormatInfo2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SamplerReductionModeCreateInfo, SamplerCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceSamplerFilterMinmaxProperties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceVulkanMemoryModelFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceVulkanMemoryModelFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceImagelessFramebufferFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceImagelessFramebufferFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<FramebufferAttachmentsCreateInfo, FramebufferCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<RenderPassAttachmentBeginInfo, RenderPassBeginInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceUniformBufferStandardLayoutFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceUniformBufferStandardLayoutFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderSubgroupExtendedTypesFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderSubgroupExtendedTypesFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceSeparateDepthStencilLayoutsFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceSeparateDepthStencilLayoutsFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<AttachmentReferenceStencilLayout, AttachmentReference2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<AttachmentDescriptionStencilLayout, AttachmentDescription2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceHostQueryResetFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceHostQueryResetFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceTimelineSemaphoreFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceTimelineSemaphoreFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceTimelineSemaphoreProperties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SemaphoreTypeCreateInfo, SemaphoreCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SemaphoreTypeCreateInfo, PhysicalDeviceExternalSemaphoreInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<TimelineSemaphoreSubmitInfo, SubmitInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<TimelineSemaphoreSubmitInfo, BindSparseInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceBufferDeviceAddressFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceBufferDeviceAddressFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<BufferOpaqueCaptureAddressCreateInfo, BufferCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<MemoryOpaqueCaptureAddressAllocateInfo, MemoryAllocateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_VERSION_1_3 ===\n  template <>\n  struct StructExtends<PhysicalDeviceVulkan13Features, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceVulkan13Features, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceVulkan13Properties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineCreationFeedbackCreateInfo, GraphicsPipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineCreationFeedbackCreateInfo, ComputePipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineCreationFeedbackCreateInfo, RayTracingPipelineCreateInfoNV>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineCreationFeedbackCreateInfo, RayTracingPipelineCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n  template <>\n  struct StructExtends<PipelineCreationFeedbackCreateInfo, ExecutionGraphPipelineCreateInfoAMDX>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n  template <>\n  struct StructExtends<PhysicalDeviceShaderTerminateInvocationFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderTerminateInvocationFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderDemoteToHelperInvocationFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderDemoteToHelperInvocationFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePrivateDataFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePrivateDataFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DevicePrivateDataCreateInfo, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePipelineCreationCacheControlFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePipelineCreationCacheControlFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<MemoryBarrier2, SubpassDependency2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceSynchronization2Features, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceSynchronization2Features, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceImageRobustnessFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceImageRobustnessFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceSubgroupSizeControlFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceSubgroupSizeControlFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceSubgroupSizeControlProperties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineShaderStageRequiredSubgroupSizeCreateInfo, PipelineShaderStageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineShaderStageRequiredSubgroupSizeCreateInfo, ShaderCreateInfoEXT>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceInlineUniformBlockFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceInlineUniformBlockFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceInlineUniformBlockProperties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<WriteDescriptorSetInlineUniformBlock, WriteDescriptorSet>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DescriptorPoolInlineUniformBlockCreateInfo, DescriptorPoolCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceTextureCompressionASTCHDRFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceTextureCompressionASTCHDRFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineRenderingCreateInfo, GraphicsPipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDynamicRenderingFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDynamicRenderingFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<CommandBufferInheritanceRenderingInfo, CommandBufferInheritanceInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderIntegerDotProductFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderIntegerDotProductFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderIntegerDotProductProperties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceTexelBufferAlignmentProperties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<FormatProperties3, FormatProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMaintenance4Features, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMaintenance4Features, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMaintenance4Properties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_VERSION_1_4 ===\n  template <>\n  struct StructExtends<PhysicalDeviceVulkan14Features, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceVulkan14Features, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceVulkan14Properties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DeviceQueueGlobalPriorityCreateInfo, DeviceQueueCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceGlobalPriorityQueryFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceGlobalPriorityQueryFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<QueueFamilyGlobalPriorityProperties, QueueFamilyProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderSubgroupRotateFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderSubgroupRotateFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderFloatControls2Features, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderFloatControls2Features, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderExpectAssumeFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderExpectAssumeFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceLineRasterizationFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceLineRasterizationFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceLineRasterizationProperties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineRasterizationLineStateCreateInfo, PipelineRasterizationStateCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceVertexAttributeDivisorProperties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineVertexInputDivisorStateCreateInfo, PipelineVertexInputStateCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceVertexAttributeDivisorFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceVertexAttributeDivisorFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceIndexTypeUint8Features, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceIndexTypeUint8Features, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMaintenance5Features, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMaintenance5Features, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMaintenance5Properties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineCreateFlags2CreateInfo, ComputePipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineCreateFlags2CreateInfo, GraphicsPipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineCreateFlags2CreateInfo, RayTracingPipelineCreateInfoNV>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineCreateFlags2CreateInfo, RayTracingPipelineCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<BufferUsageFlags2CreateInfo, BufferViewCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<BufferUsageFlags2CreateInfo, BufferCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<BufferUsageFlags2CreateInfo, PhysicalDeviceExternalBufferInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<BufferUsageFlags2CreateInfo, DescriptorBufferBindingInfoEXT>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePushDescriptorProperties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDynamicRenderingLocalReadFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDynamicRenderingLocalReadFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<RenderingAttachmentLocationInfo, GraphicsPipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<RenderingAttachmentLocationInfo, CommandBufferInheritanceInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<RenderingInputAttachmentIndexInfo, GraphicsPipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<RenderingInputAttachmentIndexInfo, CommandBufferInheritanceInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMaintenance6Features, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMaintenance6Features, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMaintenance6Properties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<BindMemoryStatus, BindBufferMemoryInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<BindMemoryStatus, BindImageMemoryInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePipelineProtectedAccessFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePipelineProtectedAccessFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePipelineRobustnessFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePipelineRobustnessFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePipelineRobustnessProperties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineRobustnessCreateInfo, GraphicsPipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineRobustnessCreateInfo, ComputePipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineRobustnessCreateInfo, PipelineShaderStageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineRobustnessCreateInfo, RayTracingPipelineCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceHostImageCopyFeatures, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceHostImageCopyFeatures, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceHostImageCopyProperties, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SubresourceHostMemcpySize, SubresourceLayout2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<HostImageCopyDevicePerformanceQuery, ImageFormatProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_swapchain ===\n  template <>\n  struct StructExtends<ImageSwapchainCreateInfoKHR, ImageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<BindImageMemorySwapchainInfoKHR, BindImageMemoryInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DeviceGroupPresentInfoKHR, PresentInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DeviceGroupSwapchainCreateInfoKHR, SwapchainCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_display_swapchain ===\n  template <>\n  struct StructExtends<DisplayPresentInfoKHR, PresentInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_debug_report ===\n  template <>\n  struct StructExtends<DebugReportCallbackCreateInfoEXT, InstanceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_AMD_rasterization_order ===\n  template <>\n  struct StructExtends<PipelineRasterizationStateRasterizationOrderAMD, PipelineRasterizationStateCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_video_queue ===\n  template <>\n  struct StructExtends<QueueFamilyQueryResultStatusPropertiesKHR, QueueFamilyProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<QueueFamilyVideoPropertiesKHR, QueueFamilyProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoProfileInfoKHR, QueryPoolCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoProfileListInfoKHR, PhysicalDeviceImageFormatInfo2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoProfileListInfoKHR, PhysicalDeviceVideoFormatInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoProfileListInfoKHR, ImageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoProfileListInfoKHR, BufferCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_video_decode_queue ===\n  template <>\n  struct StructExtends<VideoDecodeCapabilitiesKHR, VideoCapabilitiesKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoDecodeUsageInfoKHR, VideoProfileInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoDecodeUsageInfoKHR, QueryPoolCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_dedicated_allocation ===\n  template <>\n  struct StructExtends<DedicatedAllocationImageCreateInfoNV, ImageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DedicatedAllocationBufferCreateInfoNV, BufferCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DedicatedAllocationMemoryAllocateInfoNV, MemoryAllocateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_transform_feedback ===\n  template <>\n  struct StructExtends<PhysicalDeviceTransformFeedbackFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceTransformFeedbackFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceTransformFeedbackPropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineRasterizationStateStreamCreateInfoEXT, PipelineRasterizationStateCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NVX_binary_import ===\n  template <>\n  struct StructExtends<CuModuleTexturingModeCreateInfoNVX, CuModuleCreateInfoNVX>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_video_encode_h264 ===\n  template <>\n  struct StructExtends<VideoEncodeH264CapabilitiesKHR, VideoCapabilitiesKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH264QualityLevelPropertiesKHR, VideoEncodeQualityLevelPropertiesKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH264SessionCreateInfoKHR, VideoSessionCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH264SessionParametersCreateInfoKHR, VideoSessionParametersCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH264SessionParametersAddInfoKHR, VideoSessionParametersUpdateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH264SessionParametersGetInfoKHR, VideoEncodeSessionParametersGetInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH264SessionParametersFeedbackInfoKHR, VideoEncodeSessionParametersFeedbackInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH264PictureInfoKHR, VideoEncodeInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH264DpbSlotInfoKHR, VideoReferenceSlotInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH264ProfileInfoKHR, VideoProfileInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH264ProfileInfoKHR, QueryPoolCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH264RateControlInfoKHR, VideoCodingControlInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH264RateControlInfoKHR, VideoBeginCodingInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH264RateControlLayerInfoKHR, VideoEncodeRateControlLayerInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH264GopRemainingFrameInfoKHR, VideoBeginCodingInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_video_encode_h265 ===\n  template <>\n  struct StructExtends<VideoEncodeH265CapabilitiesKHR, VideoCapabilitiesKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH265SessionCreateInfoKHR, VideoSessionCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH265QualityLevelPropertiesKHR, VideoEncodeQualityLevelPropertiesKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH265SessionParametersCreateInfoKHR, VideoSessionParametersCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH265SessionParametersAddInfoKHR, VideoSessionParametersUpdateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH265SessionParametersGetInfoKHR, VideoEncodeSessionParametersGetInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH265SessionParametersFeedbackInfoKHR, VideoEncodeSessionParametersFeedbackInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH265PictureInfoKHR, VideoEncodeInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH265DpbSlotInfoKHR, VideoReferenceSlotInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH265ProfileInfoKHR, VideoProfileInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH265ProfileInfoKHR, QueryPoolCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH265RateControlInfoKHR, VideoCodingControlInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH265RateControlInfoKHR, VideoBeginCodingInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH265RateControlLayerInfoKHR, VideoEncodeRateControlLayerInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH265GopRemainingFrameInfoKHR, VideoBeginCodingInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_video_decode_h264 ===\n  template <>\n  struct StructExtends<VideoDecodeH264ProfileInfoKHR, VideoProfileInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoDecodeH264ProfileInfoKHR, QueryPoolCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoDecodeH264CapabilitiesKHR, VideoCapabilitiesKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoDecodeH264SessionParametersCreateInfoKHR, VideoSessionParametersCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoDecodeH264SessionParametersAddInfoKHR, VideoSessionParametersUpdateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoDecodeH264PictureInfoKHR, VideoDecodeInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoDecodeH264DpbSlotInfoKHR, VideoReferenceSlotInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_AMD_texture_gather_bias_lod ===\n  template <>\n  struct StructExtends<TextureLODGatherFormatPropertiesAMD, ImageFormatProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_corner_sampled_image ===\n  template <>\n  struct StructExtends<PhysicalDeviceCornerSampledImageFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceCornerSampledImageFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_external_memory ===\n  template <>\n  struct StructExtends<ExternalMemoryImageCreateInfoNV, ImageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExportMemoryAllocateInfoNV, MemoryAllocateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_NV_external_memory_win32 ===\n  template <>\n  struct StructExtends<ImportMemoryWin32HandleInfoNV, MemoryAllocateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExportMemoryWin32HandleInfoNV, MemoryAllocateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_NV_win32_keyed_mutex ===\n  template <>\n  struct StructExtends<Win32KeyedMutexAcquireReleaseInfoNV, SubmitInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<Win32KeyedMutexAcquireReleaseInfoNV, SubmitInfo2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_EXT_validation_flags ===\n  template <>\n  struct StructExtends<ValidationFlagsEXT, InstanceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_astc_decode_mode ===\n  template <>\n  struct StructExtends<ImageViewASTCDecodeModeEXT, ImageViewCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceASTCDecodeFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceASTCDecodeFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_KHR_external_memory_win32 ===\n  template <>\n  struct StructExtends<ImportMemoryWin32HandleInfoKHR, MemoryAllocateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExportMemoryWin32HandleInfoKHR, MemoryAllocateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_KHR_external_memory_fd ===\n  template <>\n  struct StructExtends<ImportMemoryFdInfoKHR, MemoryAllocateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_KHR_win32_keyed_mutex ===\n  template <>\n  struct StructExtends<Win32KeyedMutexAcquireReleaseInfoKHR, SubmitInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<Win32KeyedMutexAcquireReleaseInfoKHR, SubmitInfo2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_KHR_external_semaphore_win32 ===\n  template <>\n  struct StructExtends<ExportSemaphoreWin32HandleInfoKHR, SemaphoreCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<D3D12FenceSubmitInfoKHR, SubmitInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_EXT_conditional_rendering ===\n  template <>\n  struct StructExtends<PhysicalDeviceConditionalRenderingFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceConditionalRenderingFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<CommandBufferInheritanceConditionalRenderingInfoEXT, CommandBufferInheritanceInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_incremental_present ===\n  template <>\n  struct StructExtends<PresentRegionsKHR, PresentInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_clip_space_w_scaling ===\n  template <>\n  struct StructExtends<PipelineViewportWScalingStateCreateInfoNV, PipelineViewportStateCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_display_control ===\n  template <>\n  struct StructExtends<SwapchainCounterCreateInfoEXT, SwapchainCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_GOOGLE_display_timing ===\n  template <>\n  struct StructExtends<PresentTimesInfoGOOGLE, PresentInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NVX_multiview_per_view_attributes ===\n  template <>\n  struct StructExtends<PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<MultiviewPerViewAttributesInfoNVX, CommandBufferInheritanceInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<MultiviewPerViewAttributesInfoNVX, GraphicsPipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<MultiviewPerViewAttributesInfoNVX, RenderingInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_viewport_swizzle ===\n  template <>\n  struct StructExtends<PipelineViewportSwizzleStateCreateInfoNV, PipelineViewportStateCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_discard_rectangles ===\n  template <>\n  struct StructExtends<PhysicalDeviceDiscardRectanglePropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineDiscardRectangleStateCreateInfoEXT, GraphicsPipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_conservative_rasterization ===\n  template <>\n  struct StructExtends<PhysicalDeviceConservativeRasterizationPropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineRasterizationConservativeStateCreateInfoEXT, PipelineRasterizationStateCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_depth_clip_enable ===\n  template <>\n  struct StructExtends<PhysicalDeviceDepthClipEnableFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDepthClipEnableFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineRasterizationDepthClipStateCreateInfoEXT, PipelineRasterizationStateCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_IMG_relaxed_line_rasterization ===\n  template <>\n  struct StructExtends<PhysicalDeviceRelaxedLineRasterizationFeaturesIMG, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceRelaxedLineRasterizationFeaturesIMG, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_shared_presentable_image ===\n  template <>\n  struct StructExtends<SharedPresentSurfaceCapabilitiesKHR, SurfaceCapabilities2KHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_KHR_external_fence_win32 ===\n  template <>\n  struct StructExtends<ExportFenceWin32HandleInfoKHR, FenceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_KHR_performance_query ===\n  template <>\n  struct StructExtends<PhysicalDevicePerformanceQueryFeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePerformanceQueryFeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePerformanceQueryPropertiesKHR, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<QueryPoolPerformanceCreateInfoKHR, QueryPoolCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PerformanceQuerySubmitInfoKHR, SubmitInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PerformanceQuerySubmitInfoKHR, SubmitInfo2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_debug_utils ===\n  template <>\n  struct StructExtends<DebugUtilsMessengerCreateInfoEXT, InstanceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DebugUtilsObjectNameInfoEXT, PipelineShaderStageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n#  if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  //=== VK_ANDROID_external_memory_android_hardware_buffer ===\n  template <>\n  struct StructExtends<AndroidHardwareBufferUsageANDROID, ImageFormatProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<AndroidHardwareBufferFormatPropertiesANDROID, AndroidHardwareBufferPropertiesANDROID>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImportAndroidHardwareBufferInfoANDROID, MemoryAllocateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExternalFormatANDROID, ImageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExternalFormatANDROID, SamplerYcbcrConversionCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExternalFormatANDROID, AttachmentDescription2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExternalFormatANDROID, GraphicsPipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExternalFormatANDROID, CommandBufferInheritanceInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<AndroidHardwareBufferFormatProperties2ANDROID, AndroidHardwareBufferPropertiesANDROID>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n  //=== VK_AMDX_shader_enqueue ===\n  template <>\n  struct StructExtends<PhysicalDeviceShaderEnqueueFeaturesAMDX, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderEnqueueFeaturesAMDX, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderEnqueuePropertiesAMDX, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineShaderStageNodeCreateInfoAMDX, PipelineShaderStageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  //=== VK_AMD_mixed_attachment_samples ===\n  template <>\n  struct StructExtends<AttachmentSampleCountInfoAMD, CommandBufferInheritanceInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<AttachmentSampleCountInfoAMD, GraphicsPipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_sample_locations ===\n  template <>\n  struct StructExtends<SampleLocationsInfoEXT, ImageMemoryBarrier>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SampleLocationsInfoEXT, ImageMemoryBarrier2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<RenderPassSampleLocationsBeginInfoEXT, RenderPassBeginInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineSampleLocationsStateCreateInfoEXT, PipelineMultisampleStateCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceSampleLocationsPropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_blend_operation_advanced ===\n  template <>\n  struct StructExtends<PhysicalDeviceBlendOperationAdvancedFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceBlendOperationAdvancedFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceBlendOperationAdvancedPropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineColorBlendAdvancedStateCreateInfoEXT, PipelineColorBlendStateCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_fragment_coverage_to_color ===\n  template <>\n  struct StructExtends<PipelineCoverageToColorStateCreateInfoNV, PipelineMultisampleStateCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_acceleration_structure ===\n  template <>\n  struct StructExtends<WriteDescriptorSetAccelerationStructureKHR, WriteDescriptorSet>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceAccelerationStructureFeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceAccelerationStructureFeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceAccelerationStructurePropertiesKHR, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_ray_tracing_pipeline ===\n  template <>\n  struct StructExtends<PhysicalDeviceRayTracingPipelineFeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceRayTracingPipelineFeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceRayTracingPipelinePropertiesKHR, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_ray_query ===\n  template <>\n  struct StructExtends<PhysicalDeviceRayQueryFeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceRayQueryFeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_framebuffer_mixed_samples ===\n  template <>\n  struct StructExtends<PipelineCoverageModulationStateCreateInfoNV, PipelineMultisampleStateCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_shader_sm_builtins ===\n  template <>\n  struct StructExtends<PhysicalDeviceShaderSMBuiltinsPropertiesNV, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderSMBuiltinsFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderSMBuiltinsFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_image_drm_format_modifier ===\n  template <>\n  struct StructExtends<DrmFormatModifierPropertiesListEXT, FormatProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceImageDrmFormatModifierInfoEXT, PhysicalDeviceImageFormatInfo2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImageDrmFormatModifierListCreateInfoEXT, ImageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImageDrmFormatModifierExplicitCreateInfoEXT, ImageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DrmFormatModifierPropertiesList2EXT, FormatProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_validation_cache ===\n  template <>\n  struct StructExtends<ShaderModuleValidationCacheCreateInfoEXT, ShaderModuleCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ShaderModuleValidationCacheCreateInfoEXT, PipelineShaderStageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n  //=== VK_KHR_portability_subset ===\n  template <>\n  struct StructExtends<PhysicalDevicePortabilitySubsetFeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePortabilitySubsetFeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePortabilitySubsetPropertiesKHR, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  //=== VK_NV_shading_rate_image ===\n  template <>\n  struct StructExtends<PipelineViewportShadingRateImageStateCreateInfoNV, PipelineViewportStateCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShadingRateImageFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShadingRateImageFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShadingRateImagePropertiesNV, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineViewportCoarseSampleOrderStateCreateInfoNV, PipelineViewportStateCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_ray_tracing ===\n  template <>\n  struct StructExtends<WriteDescriptorSetAccelerationStructureNV, WriteDescriptorSet>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceRayTracingPropertiesNV, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_representative_fragment_test ===\n  template <>\n  struct StructExtends<PhysicalDeviceRepresentativeFragmentTestFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceRepresentativeFragmentTestFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineRepresentativeFragmentTestStateCreateInfoNV, GraphicsPipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_filter_cubic ===\n  template <>\n  struct StructExtends<PhysicalDeviceImageViewImageFormatInfoEXT, PhysicalDeviceImageFormatInfo2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<FilterCubicImageViewImageFormatPropertiesEXT, ImageFormatProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_external_memory_host ===\n  template <>\n  struct StructExtends<ImportMemoryHostPointerInfoEXT, MemoryAllocateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceExternalMemoryHostPropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_shader_clock ===\n  template <>\n  struct StructExtends<PhysicalDeviceShaderClockFeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderClockFeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_AMD_pipeline_compiler_control ===\n  template <>\n  struct StructExtends<PipelineCompilerControlCreateInfoAMD, GraphicsPipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineCompilerControlCreateInfoAMD, ComputePipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n  template <>\n  struct StructExtends<PipelineCompilerControlCreateInfoAMD, ExecutionGraphPipelineCreateInfoAMDX>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  //=== VK_AMD_shader_core_properties ===\n  template <>\n  struct StructExtends<PhysicalDeviceShaderCorePropertiesAMD, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_video_decode_h265 ===\n  template <>\n  struct StructExtends<VideoDecodeH265ProfileInfoKHR, VideoProfileInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoDecodeH265ProfileInfoKHR, QueryPoolCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoDecodeH265CapabilitiesKHR, VideoCapabilitiesKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoDecodeH265SessionParametersCreateInfoKHR, VideoSessionParametersCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoDecodeH265SessionParametersAddInfoKHR, VideoSessionParametersUpdateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoDecodeH265PictureInfoKHR, VideoDecodeInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoDecodeH265DpbSlotInfoKHR, VideoReferenceSlotInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_AMD_memory_overallocation_behavior ===\n  template <>\n  struct StructExtends<DeviceMemoryOverallocationCreateInfoAMD, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_vertex_attribute_divisor ===\n  template <>\n  struct StructExtends<PhysicalDeviceVertexAttributeDivisorPropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n#  if defined( VK_USE_PLATFORM_GGP )\n  //=== VK_GGP_frame_token ===\n  template <>\n  struct StructExtends<PresentFrameTokenGGP, PresentInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n#  endif /*VK_USE_PLATFORM_GGP*/\n\n  //=== VK_NV_mesh_shader ===\n  template <>\n  struct StructExtends<PhysicalDeviceMeshShaderFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMeshShaderFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMeshShaderPropertiesNV, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_shader_image_footprint ===\n  template <>\n  struct StructExtends<PhysicalDeviceShaderImageFootprintFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderImageFootprintFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_scissor_exclusive ===\n  template <>\n  struct StructExtends<PipelineViewportExclusiveScissorStateCreateInfoNV, PipelineViewportStateCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceExclusiveScissorFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceExclusiveScissorFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_device_diagnostic_checkpoints ===\n  template <>\n  struct StructExtends<QueueFamilyCheckpointPropertiesNV, QueueFamilyProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<QueueFamilyCheckpointProperties2NV, QueueFamilyProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_INTEL_shader_integer_functions2 ===\n  template <>\n  struct StructExtends<PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_INTEL_performance_query ===\n  template <>\n  struct StructExtends<QueryPoolPerformanceQueryCreateInfoINTEL, QueryPoolCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_pci_bus_info ===\n  template <>\n  struct StructExtends<PhysicalDevicePCIBusInfoPropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_AMD_display_native_hdr ===\n  template <>\n  struct StructExtends<DisplayNativeHdrSurfaceCapabilitiesAMD, SurfaceCapabilities2KHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SwapchainDisplayNativeHdrCreateInfoAMD, SwapchainCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_fragment_density_map ===\n  template <>\n  struct StructExtends<PhysicalDeviceFragmentDensityMapFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceFragmentDensityMapFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceFragmentDensityMapPropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<RenderPassFragmentDensityMapCreateInfoEXT, RenderPassCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<RenderPassFragmentDensityMapCreateInfoEXT, RenderPassCreateInfo2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<RenderingFragmentDensityMapAttachmentInfoEXT, RenderingInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_fragment_shading_rate ===\n  template <>\n  struct StructExtends<FragmentShadingRateAttachmentInfoKHR, SubpassDescription2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineFragmentShadingRateStateCreateInfoKHR, GraphicsPipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceFragmentShadingRateFeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceFragmentShadingRateFeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceFragmentShadingRatePropertiesKHR, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<RenderingFragmentShadingRateAttachmentInfoKHR, RenderingInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_AMD_shader_core_properties2 ===\n  template <>\n  struct StructExtends<PhysicalDeviceShaderCoreProperties2AMD, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_AMD_device_coherent_memory ===\n  template <>\n  struct StructExtends<PhysicalDeviceCoherentMemoryFeaturesAMD, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceCoherentMemoryFeaturesAMD, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_shader_image_atomic_int64 ===\n  template <>\n  struct StructExtends<PhysicalDeviceShaderImageAtomicInt64FeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderImageAtomicInt64FeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_shader_quad_control ===\n  template <>\n  struct StructExtends<PhysicalDeviceShaderQuadControlFeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderQuadControlFeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_memory_budget ===\n  template <>\n  struct StructExtends<PhysicalDeviceMemoryBudgetPropertiesEXT, PhysicalDeviceMemoryProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_memory_priority ===\n  template <>\n  struct StructExtends<PhysicalDeviceMemoryPriorityFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMemoryPriorityFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<MemoryPriorityAllocateInfoEXT, MemoryAllocateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_surface_protected_capabilities ===\n  template <>\n  struct StructExtends<SurfaceProtectedCapabilitiesKHR, SurfaceCapabilities2KHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_dedicated_allocation_image_aliasing ===\n  template <>\n  struct StructExtends<PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_buffer_device_address ===\n  template <>\n  struct StructExtends<PhysicalDeviceBufferDeviceAddressFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceBufferDeviceAddressFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<BufferDeviceAddressCreateInfoEXT, BufferCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_validation_features ===\n  template <>\n  struct StructExtends<ValidationFeaturesEXT, InstanceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ValidationFeaturesEXT, ShaderModuleCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ValidationFeaturesEXT, ShaderCreateInfoEXT>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_present_wait ===\n  template <>\n  struct StructExtends<PhysicalDevicePresentWaitFeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePresentWaitFeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_cooperative_matrix ===\n  template <>\n  struct StructExtends<PhysicalDeviceCooperativeMatrixFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceCooperativeMatrixFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceCooperativeMatrixPropertiesNV, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_coverage_reduction_mode ===\n  template <>\n  struct StructExtends<PhysicalDeviceCoverageReductionModeFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceCoverageReductionModeFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineCoverageReductionStateCreateInfoNV, PipelineMultisampleStateCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_fragment_shader_interlock ===\n  template <>\n  struct StructExtends<PhysicalDeviceFragmentShaderInterlockFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceFragmentShaderInterlockFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_ycbcr_image_arrays ===\n  template <>\n  struct StructExtends<PhysicalDeviceYcbcrImageArraysFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceYcbcrImageArraysFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_provoking_vertex ===\n  template <>\n  struct StructExtends<PhysicalDeviceProvokingVertexFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceProvokingVertexFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceProvokingVertexPropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineRasterizationProvokingVertexStateCreateInfoEXT, PipelineRasterizationStateCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_EXT_full_screen_exclusive ===\n  template <>\n  struct StructExtends<SurfaceFullScreenExclusiveInfoEXT, PhysicalDeviceSurfaceInfo2KHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SurfaceFullScreenExclusiveInfoEXT, SwapchainCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SurfaceCapabilitiesFullScreenExclusiveEXT, SurfaceCapabilities2KHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SurfaceFullScreenExclusiveWin32InfoEXT, PhysicalDeviceSurfaceInfo2KHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SurfaceFullScreenExclusiveWin32InfoEXT, SwapchainCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_EXT_shader_atomic_float ===\n  template <>\n  struct StructExtends<PhysicalDeviceShaderAtomicFloatFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderAtomicFloatFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_extended_dynamic_state ===\n  template <>\n  struct StructExtends<PhysicalDeviceExtendedDynamicStateFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceExtendedDynamicStateFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_pipeline_executable_properties ===\n  template <>\n  struct StructExtends<PhysicalDevicePipelineExecutablePropertiesFeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePipelineExecutablePropertiesFeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_map_memory_placed ===\n  template <>\n  struct StructExtends<PhysicalDeviceMapMemoryPlacedFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMapMemoryPlacedFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMapMemoryPlacedPropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<MemoryMapPlacedInfoEXT, MemoryMapInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_shader_atomic_float2 ===\n  template <>\n  struct StructExtends<PhysicalDeviceShaderAtomicFloat2FeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderAtomicFloat2FeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_surface_maintenance1 ===\n  template <>\n  struct StructExtends<SurfacePresentModeEXT, PhysicalDeviceSurfaceInfo2KHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SurfacePresentScalingCapabilitiesEXT, SurfaceCapabilities2KHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SurfacePresentModeCompatibilityEXT, SurfaceCapabilities2KHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_swapchain_maintenance1 ===\n  template <>\n  struct StructExtends<PhysicalDeviceSwapchainMaintenance1FeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceSwapchainMaintenance1FeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SwapchainPresentFenceInfoEXT, PresentInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SwapchainPresentModesCreateInfoEXT, SwapchainCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SwapchainPresentModeInfoEXT, PresentInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SwapchainPresentScalingCreateInfoEXT, SwapchainCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_device_generated_commands ===\n  template <>\n  struct StructExtends<PhysicalDeviceDeviceGeneratedCommandsPropertiesNV, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDeviceGeneratedCommandsFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDeviceGeneratedCommandsFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<GraphicsPipelineShaderGroupsCreateInfoNV, GraphicsPipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_inherited_viewport_scissor ===\n  template <>\n  struct StructExtends<PhysicalDeviceInheritedViewportScissorFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceInheritedViewportScissorFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<CommandBufferInheritanceViewportScissorInfoNV, CommandBufferInheritanceInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_texel_buffer_alignment ===\n  template <>\n  struct StructExtends<PhysicalDeviceTexelBufferAlignmentFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceTexelBufferAlignmentFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_QCOM_render_pass_transform ===\n  template <>\n  struct StructExtends<RenderPassTransformBeginInfoQCOM, RenderPassBeginInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<CommandBufferInheritanceRenderPassTransformInfoQCOM, CommandBufferInheritanceInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_depth_bias_control ===\n  template <>\n  struct StructExtends<PhysicalDeviceDepthBiasControlFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDepthBiasControlFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DepthBiasRepresentationInfoEXT, DepthBiasInfoEXT>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DepthBiasRepresentationInfoEXT, PipelineRasterizationStateCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_device_memory_report ===\n  template <>\n  struct StructExtends<PhysicalDeviceDeviceMemoryReportFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDeviceMemoryReportFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DeviceDeviceMemoryReportCreateInfoEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_robustness2 ===\n  template <>\n  struct StructExtends<PhysicalDeviceRobustness2FeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceRobustness2FeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceRobustness2PropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_custom_border_color ===\n  template <>\n  struct StructExtends<SamplerCustomBorderColorCreateInfoEXT, SamplerCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceCustomBorderColorPropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceCustomBorderColorFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceCustomBorderColorFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_pipeline_library ===\n  template <>\n  struct StructExtends<PipelineLibraryCreateInfoKHR, GraphicsPipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_present_barrier ===\n  template <>\n  struct StructExtends<PhysicalDevicePresentBarrierFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePresentBarrierFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SurfaceCapabilitiesPresentBarrierNV, SurfaceCapabilities2KHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SwapchainPresentBarrierCreateInfoNV, SwapchainCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_present_id ===\n  template <>\n  struct StructExtends<PresentIdKHR, PresentInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePresentIdFeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePresentIdFeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_video_encode_queue ===\n  template <>\n  struct StructExtends<VideoEncodeCapabilitiesKHR, VideoCapabilitiesKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<QueryPoolVideoEncodeFeedbackCreateInfoKHR, QueryPoolCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeUsageInfoKHR, VideoProfileInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeUsageInfoKHR, QueryPoolCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeRateControlInfoKHR, VideoCodingControlInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeRateControlInfoKHR, VideoBeginCodingInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeQualityLevelInfoKHR, VideoCodingControlInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeQualityLevelInfoKHR, VideoSessionParametersCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_device_diagnostics_config ===\n  template <>\n  struct StructExtends<PhysicalDeviceDiagnosticsConfigFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDiagnosticsConfigFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DeviceDiagnosticsConfigCreateInfoNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n  //=== VK_NV_cuda_kernel_launch ===\n  template <>\n  struct StructExtends<PhysicalDeviceCudaKernelLaunchFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceCudaKernelLaunchFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceCudaKernelLaunchPropertiesNV, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  //=== VK_NV_low_latency ===\n  template <>\n  struct StructExtends<QueryLowLatencySupportNV, SemaphoreCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n  //=== VK_EXT_metal_objects ===\n  template <>\n  struct StructExtends<ExportMetalObjectCreateInfoEXT, InstanceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExportMetalObjectCreateInfoEXT, MemoryAllocateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExportMetalObjectCreateInfoEXT, ImageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExportMetalObjectCreateInfoEXT, ImageViewCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExportMetalObjectCreateInfoEXT, BufferViewCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExportMetalObjectCreateInfoEXT, SemaphoreCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExportMetalObjectCreateInfoEXT, EventCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExportMetalDeviceInfoEXT, ExportMetalObjectsInfoEXT>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExportMetalCommandQueueInfoEXT, ExportMetalObjectsInfoEXT>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExportMetalBufferInfoEXT, ExportMetalObjectsInfoEXT>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImportMetalBufferInfoEXT, MemoryAllocateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExportMetalTextureInfoEXT, ExportMetalObjectsInfoEXT>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImportMetalTextureInfoEXT, ImageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExportMetalIOSurfaceInfoEXT, ExportMetalObjectsInfoEXT>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImportMetalIOSurfaceInfoEXT, ImageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExportMetalSharedEventInfoEXT, ExportMetalObjectsInfoEXT>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImportMetalSharedEventInfoEXT, SemaphoreCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImportMetalSharedEventInfoEXT, EventCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n  //=== VK_EXT_descriptor_buffer ===\n  template <>\n  struct StructExtends<PhysicalDeviceDescriptorBufferPropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDescriptorBufferFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDescriptorBufferFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DescriptorBufferBindingPushDescriptorBufferHandleEXT, DescriptorBufferBindingInfoEXT>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<OpaqueCaptureDescriptorDataCreateInfoEXT, BufferCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<OpaqueCaptureDescriptorDataCreateInfoEXT, ImageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<OpaqueCaptureDescriptorDataCreateInfoEXT, ImageViewCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<OpaqueCaptureDescriptorDataCreateInfoEXT, SamplerCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<OpaqueCaptureDescriptorDataCreateInfoEXT, AccelerationStructureCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<OpaqueCaptureDescriptorDataCreateInfoEXT, AccelerationStructureCreateInfoNV>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_graphics_pipeline_library ===\n  template <>\n  struct StructExtends<PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<GraphicsPipelineLibraryCreateInfoEXT, GraphicsPipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_AMD_shader_early_and_late_fragment_tests ===\n  template <>\n  struct StructExtends<PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_fragment_shader_barycentric ===\n  template <>\n  struct StructExtends<PhysicalDeviceFragmentShaderBarycentricFeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceFragmentShaderBarycentricFeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceFragmentShaderBarycentricPropertiesKHR, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_shader_subgroup_uniform_control_flow ===\n  template <>\n  struct StructExtends<PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_fragment_shading_rate_enums ===\n  template <>\n  struct StructExtends<PhysicalDeviceFragmentShadingRateEnumsFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceFragmentShadingRateEnumsFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceFragmentShadingRateEnumsPropertiesNV, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineFragmentShadingRateEnumStateCreateInfoNV, GraphicsPipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_ray_tracing_motion_blur ===\n  template <>\n  struct StructExtends<AccelerationStructureGeometryMotionTrianglesDataNV, AccelerationStructureGeometryTrianglesDataKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<AccelerationStructureMotionInfoNV, AccelerationStructureCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceRayTracingMotionBlurFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceRayTracingMotionBlurFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_mesh_shader ===\n  template <>\n  struct StructExtends<PhysicalDeviceMeshShaderFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMeshShaderFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMeshShaderPropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_ycbcr_2plane_444_formats ===\n  template <>\n  struct StructExtends<PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_fragment_density_map2 ===\n  template <>\n  struct StructExtends<PhysicalDeviceFragmentDensityMap2FeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceFragmentDensityMap2FeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceFragmentDensityMap2PropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_QCOM_rotated_copy_commands ===\n  template <>\n  struct StructExtends<CopyCommandTransformInfoQCOM, BufferImageCopy2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<CopyCommandTransformInfoQCOM, ImageBlit2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_workgroup_memory_explicit_layout ===\n  template <>\n  struct StructExtends<PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_image_compression_control ===\n  template <>\n  struct StructExtends<PhysicalDeviceImageCompressionControlFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceImageCompressionControlFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImageCompressionControlEXT, ImageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImageCompressionControlEXT, SwapchainCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImageCompressionControlEXT, PhysicalDeviceImageFormatInfo2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImageCompressionPropertiesEXT, ImageFormatProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImageCompressionPropertiesEXT, SurfaceFormat2KHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImageCompressionPropertiesEXT, SubresourceLayout2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_attachment_feedback_loop_layout ===\n  template <>\n  struct StructExtends<PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_4444_formats ===\n  template <>\n  struct StructExtends<PhysicalDevice4444FormatsFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevice4444FormatsFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_device_fault ===\n  template <>\n  struct StructExtends<PhysicalDeviceFaultFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceFaultFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_rgba10x6_formats ===\n  template <>\n  struct StructExtends<PhysicalDeviceRGBA10X6FormatsFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceRGBA10X6FormatsFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_vertex_input_dynamic_state ===\n  template <>\n  struct StructExtends<PhysicalDeviceVertexInputDynamicStateFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceVertexInputDynamicStateFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_physical_device_drm ===\n  template <>\n  struct StructExtends<PhysicalDeviceDrmPropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_device_address_binding_report ===\n  template <>\n  struct StructExtends<PhysicalDeviceAddressBindingReportFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceAddressBindingReportFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DeviceAddressBindingCallbackDataEXT, DebugUtilsMessengerCallbackDataEXT>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_depth_clip_control ===\n  template <>\n  struct StructExtends<PhysicalDeviceDepthClipControlFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDepthClipControlFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineViewportDepthClipControlCreateInfoEXT, PipelineViewportStateCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_primitive_topology_list_restart ===\n  template <>\n  struct StructExtends<PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_present_mode_fifo_latest_ready ===\n  template <>\n  struct StructExtends<PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_external_memory ===\n  template <>\n  struct StructExtends<ImportMemoryZirconHandleInfoFUCHSIA, MemoryAllocateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_buffer_collection ===\n  template <>\n  struct StructExtends<ImportMemoryBufferCollectionFUCHSIA, MemoryAllocateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<BufferCollectionImageCreateInfoFUCHSIA, ImageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<BufferCollectionBufferCreateInfoFUCHSIA, BufferCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  //=== VK_HUAWEI_subpass_shading ===\n  template <>\n  struct StructExtends<SubpassShadingPipelineCreateInfoHUAWEI, ComputePipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceSubpassShadingFeaturesHUAWEI, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceSubpassShadingFeaturesHUAWEI, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceSubpassShadingPropertiesHUAWEI, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_HUAWEI_invocation_mask ===\n  template <>\n  struct StructExtends<PhysicalDeviceInvocationMaskFeaturesHUAWEI, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceInvocationMaskFeaturesHUAWEI, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_external_memory_rdma ===\n  template <>\n  struct StructExtends<PhysicalDeviceExternalMemoryRDMAFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceExternalMemoryRDMAFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_pipeline_properties ===\n  template <>\n  struct StructExtends<PhysicalDevicePipelinePropertiesFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePipelinePropertiesFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_frame_boundary ===\n  template <>\n  struct StructExtends<PhysicalDeviceFrameBoundaryFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceFrameBoundaryFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<FrameBoundaryEXT, SubmitInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<FrameBoundaryEXT, SubmitInfo2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<FrameBoundaryEXT, PresentInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<FrameBoundaryEXT, BindSparseInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_multisampled_render_to_single_sampled ===\n  template <>\n  struct StructExtends<PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SubpassResolvePerformanceQueryEXT, FormatProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<MultisampledRenderToSingleSampledInfoEXT, SubpassDescription2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<MultisampledRenderToSingleSampledInfoEXT, RenderingInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_extended_dynamic_state2 ===\n  template <>\n  struct StructExtends<PhysicalDeviceExtendedDynamicState2FeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceExtendedDynamicState2FeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_color_write_enable ===\n  template <>\n  struct StructExtends<PhysicalDeviceColorWriteEnableFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceColorWriteEnableFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineColorWriteCreateInfoEXT, PipelineColorBlendStateCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_primitives_generated_query ===\n  template <>\n  struct StructExtends<PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_ray_tracing_maintenance1 ===\n  template <>\n  struct StructExtends<PhysicalDeviceRayTracingMaintenance1FeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceRayTracingMaintenance1FeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_image_view_min_lod ===\n  template <>\n  struct StructExtends<PhysicalDeviceImageViewMinLodFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceImageViewMinLodFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImageViewMinLodCreateInfoEXT, ImageViewCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_multi_draw ===\n  template <>\n  struct StructExtends<PhysicalDeviceMultiDrawFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMultiDrawFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMultiDrawPropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_image_2d_view_of_3d ===\n  template <>\n  struct StructExtends<PhysicalDeviceImage2DViewOf3DFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceImage2DViewOf3DFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_shader_tile_image ===\n  template <>\n  struct StructExtends<PhysicalDeviceShaderTileImageFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderTileImageFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderTileImagePropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_opacity_micromap ===\n  template <>\n  struct StructExtends<PhysicalDeviceOpacityMicromapFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceOpacityMicromapFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceOpacityMicromapPropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<AccelerationStructureTrianglesOpacityMicromapEXT, AccelerationStructureGeometryTrianglesDataKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n  //=== VK_NV_displacement_micromap ===\n  template <>\n  struct StructExtends<PhysicalDeviceDisplacementMicromapFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDisplacementMicromapFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDisplacementMicromapPropertiesNV, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<AccelerationStructureTrianglesDisplacementMicromapNV, AccelerationStructureGeometryTrianglesDataKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  //=== VK_HUAWEI_cluster_culling_shader ===\n  template <>\n  struct StructExtends<PhysicalDeviceClusterCullingShaderFeaturesHUAWEI, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceClusterCullingShaderFeaturesHUAWEI, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceClusterCullingShaderPropertiesHUAWEI, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI, PhysicalDeviceClusterCullingShaderFeaturesHUAWEI>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_border_color_swizzle ===\n  template <>\n  struct StructExtends<PhysicalDeviceBorderColorSwizzleFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceBorderColorSwizzleFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SamplerBorderColorComponentMappingCreateInfoEXT, SamplerCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_pageable_device_local_memory ===\n  template <>\n  struct StructExtends<PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_ARM_shader_core_properties ===\n  template <>\n  struct StructExtends<PhysicalDeviceShaderCorePropertiesARM, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_ARM_scheduling_controls ===\n  template <>\n  struct StructExtends<DeviceQueueShaderCoreControlCreateInfoARM, DeviceQueueCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DeviceQueueShaderCoreControlCreateInfoARM, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceSchedulingControlsFeaturesARM, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceSchedulingControlsFeaturesARM, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceSchedulingControlsPropertiesARM, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_image_sliced_view_of_3d ===\n  template <>\n  struct StructExtends<PhysicalDeviceImageSlicedViewOf3DFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceImageSlicedViewOf3DFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImageViewSlicedCreateInfoEXT, ImageViewCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_VALVE_descriptor_set_host_mapping ===\n  template <>\n  struct StructExtends<PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_non_seamless_cube_map ===\n  template <>\n  struct StructExtends<PhysicalDeviceNonSeamlessCubeMapFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceNonSeamlessCubeMapFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_ARM_render_pass_striped ===\n  template <>\n  struct StructExtends<PhysicalDeviceRenderPassStripedFeaturesARM, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceRenderPassStripedFeaturesARM, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceRenderPassStripedPropertiesARM, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<RenderPassStripeBeginInfoARM, RenderingInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<RenderPassStripeBeginInfoARM, RenderPassBeginInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<RenderPassStripeSubmitInfoARM, CommandBufferSubmitInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_QCOM_fragment_density_map_offset ===\n  template <>\n  struct StructExtends<PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SubpassFragmentDensityMapOffsetEndInfoQCOM, SubpassEndInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_copy_memory_indirect ===\n  template <>\n  struct StructExtends<PhysicalDeviceCopyMemoryIndirectFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceCopyMemoryIndirectFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceCopyMemoryIndirectPropertiesNV, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_memory_decompression ===\n  template <>\n  struct StructExtends<PhysicalDeviceMemoryDecompressionFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMemoryDecompressionFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMemoryDecompressionPropertiesNV, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_device_generated_commands_compute ===\n  template <>\n  struct StructExtends<PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ComputePipelineIndirectBufferInfoNV, ComputePipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_ray_tracing_linear_swept_spheres ===\n  template <>\n  struct StructExtends<PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_linear_color_attachment ===\n  template <>\n  struct StructExtends<PhysicalDeviceLinearColorAttachmentFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceLinearColorAttachmentFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_shader_maximal_reconvergence ===\n  template <>\n  struct StructExtends<PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_image_compression_control_swapchain ===\n  template <>\n  struct StructExtends<PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_QCOM_image_processing ===\n  template <>\n  struct StructExtends<ImageViewSampleWeightCreateInfoQCOM, ImageViewCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceImageProcessingFeaturesQCOM, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceImageProcessingFeaturesQCOM, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceImageProcessingPropertiesQCOM, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_nested_command_buffer ===\n  template <>\n  struct StructExtends<PhysicalDeviceNestedCommandBufferFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceNestedCommandBufferFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceNestedCommandBufferPropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_external_memory_acquire_unmodified ===\n  template <>\n  struct StructExtends<ExternalMemoryAcquireUnmodifiedEXT, BufferMemoryBarrier>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExternalMemoryAcquireUnmodifiedEXT, BufferMemoryBarrier2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExternalMemoryAcquireUnmodifiedEXT, ImageMemoryBarrier>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExternalMemoryAcquireUnmodifiedEXT, ImageMemoryBarrier2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_extended_dynamic_state3 ===\n  template <>\n  struct StructExtends<PhysicalDeviceExtendedDynamicState3FeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceExtendedDynamicState3FeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceExtendedDynamicState3PropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_subpass_merge_feedback ===\n  template <>\n  struct StructExtends<PhysicalDeviceSubpassMergeFeedbackFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceSubpassMergeFeedbackFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<RenderPassCreationControlEXT, RenderPassCreateInfo2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<RenderPassCreationControlEXT, SubpassDescription2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<RenderPassCreationFeedbackCreateInfoEXT, RenderPassCreateInfo2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<RenderPassSubpassFeedbackCreateInfoEXT, SubpassDescription2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_LUNARG_direct_driver_loading ===\n  template <>\n  struct StructExtends<DirectDriverLoadingListLUNARG, InstanceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_shader_module_identifier ===\n  template <>\n  struct StructExtends<PhysicalDeviceShaderModuleIdentifierFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderModuleIdentifierFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderModuleIdentifierPropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineShaderStageModuleIdentifierCreateInfoEXT, PipelineShaderStageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_rasterization_order_attachment_access ===\n  template <>\n  struct StructExtends<PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_optical_flow ===\n  template <>\n  struct StructExtends<PhysicalDeviceOpticalFlowFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceOpticalFlowFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceOpticalFlowPropertiesNV, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<OpticalFlowImageFormatInfoNV, PhysicalDeviceImageFormatInfo2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<OpticalFlowImageFormatInfoNV, ImageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<OpticalFlowSessionCreatePrivateDataInfoNV, OpticalFlowSessionCreateInfoNV>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_legacy_dithering ===\n  template <>\n  struct StructExtends<PhysicalDeviceLegacyDitheringFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceLegacyDitheringFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n#  if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  //=== VK_ANDROID_external_format_resolve ===\n  template <>\n  struct StructExtends<PhysicalDeviceExternalFormatResolveFeaturesANDROID, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceExternalFormatResolveFeaturesANDROID, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceExternalFormatResolvePropertiesANDROID, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<AndroidHardwareBufferFormatResolvePropertiesANDROID, AndroidHardwareBufferPropertiesANDROID>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n  //=== VK_AMD_anti_lag ===\n  template <>\n  struct StructExtends<PhysicalDeviceAntiLagFeaturesAMD, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceAntiLagFeaturesAMD, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_ray_tracing_position_fetch ===\n  template <>\n  struct StructExtends<PhysicalDeviceRayTracingPositionFetchFeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceRayTracingPositionFetchFeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_shader_object ===\n  template <>\n  struct StructExtends<PhysicalDeviceShaderObjectFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderObjectFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderObjectPropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_pipeline_binary ===\n  template <>\n  struct StructExtends<PhysicalDevicePipelineBinaryFeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePipelineBinaryFeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePipelineBinaryPropertiesKHR, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DevicePipelineBinaryInternalCacheControlKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineBinaryInfoKHR, GraphicsPipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineBinaryInfoKHR, ComputePipelineCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineBinaryInfoKHR, RayTracingPipelineCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_QCOM_tile_properties ===\n  template <>\n  struct StructExtends<PhysicalDeviceTilePropertiesFeaturesQCOM, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceTilePropertiesFeaturesQCOM, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_SEC_amigo_profiling ===\n  template <>\n  struct StructExtends<PhysicalDeviceAmigoProfilingFeaturesSEC, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceAmigoProfilingFeaturesSEC, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<AmigoProfilingSubmitInfoSEC, SubmitInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_QCOM_multiview_per_view_viewports ===\n  template <>\n  struct StructExtends<PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_ray_tracing_invocation_reorder ===\n  template <>\n  struct StructExtends<PhysicalDeviceRayTracingInvocationReorderPropertiesNV, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceRayTracingInvocationReorderFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceRayTracingInvocationReorderFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_cooperative_vector ===\n  template <>\n  struct StructExtends<PhysicalDeviceCooperativeVectorPropertiesNV, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceCooperativeVectorFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceCooperativeVectorFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_extended_sparse_address_space ===\n  template <>\n  struct StructExtends<PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceExtendedSparseAddressSpacePropertiesNV, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_mutable_descriptor_type ===\n  template <>\n  struct StructExtends<PhysicalDeviceMutableDescriptorTypeFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMutableDescriptorTypeFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<MutableDescriptorTypeCreateInfoEXT, DescriptorSetLayoutCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<MutableDescriptorTypeCreateInfoEXT, DescriptorPoolCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_legacy_vertex_attributes ===\n  template <>\n  struct StructExtends<PhysicalDeviceLegacyVertexAttributesFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceLegacyVertexAttributesFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceLegacyVertexAttributesPropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_layer_settings ===\n  template <>\n  struct StructExtends<LayerSettingsCreateInfoEXT, InstanceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_ARM_shader_core_builtins ===\n  template <>\n  struct StructExtends<PhysicalDeviceShaderCoreBuiltinsFeaturesARM, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderCoreBuiltinsFeaturesARM, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderCoreBuiltinsPropertiesARM, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_pipeline_library_group_handles ===\n  template <>\n  struct StructExtends<PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_dynamic_rendering_unused_attachments ===\n  template <>\n  struct StructExtends<PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_low_latency2 ===\n  template <>\n  struct StructExtends<LatencySubmissionPresentIdNV, SubmitInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<LatencySubmissionPresentIdNV, SubmitInfo2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SwapchainLatencyCreateInfoNV, SwapchainCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<LatencySurfaceCapabilitiesNV, SurfaceCapabilities2KHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_cooperative_matrix ===\n  template <>\n  struct StructExtends<PhysicalDeviceCooperativeMatrixFeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceCooperativeMatrixFeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceCooperativeMatrixPropertiesKHR, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_QCOM_multiview_per_view_render_areas ===\n  template <>\n  struct StructExtends<PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM, RenderPassBeginInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM, RenderingInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_compute_shader_derivatives ===\n  template <>\n  struct StructExtends<PhysicalDeviceComputeShaderDerivativesFeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceComputeShaderDerivativesFeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceComputeShaderDerivativesPropertiesKHR, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_video_decode_av1 ===\n  template <>\n  struct StructExtends<VideoDecodeAV1ProfileInfoKHR, VideoProfileInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoDecodeAV1ProfileInfoKHR, QueryPoolCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoDecodeAV1CapabilitiesKHR, VideoCapabilitiesKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoDecodeAV1SessionParametersCreateInfoKHR, VideoSessionParametersCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoDecodeAV1PictureInfoKHR, VideoDecodeInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoDecodeAV1DpbSlotInfoKHR, VideoReferenceSlotInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_video_encode_av1 ===\n  template <>\n  struct StructExtends<PhysicalDeviceVideoEncodeAV1FeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceVideoEncodeAV1FeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeAV1CapabilitiesKHR, VideoCapabilitiesKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeAV1QualityLevelPropertiesKHR, VideoEncodeQualityLevelPropertiesKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeAV1SessionCreateInfoKHR, VideoSessionCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeAV1SessionParametersCreateInfoKHR, VideoSessionParametersCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeAV1PictureInfoKHR, VideoEncodeInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeAV1DpbSlotInfoKHR, VideoReferenceSlotInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeAV1ProfileInfoKHR, VideoProfileInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeAV1ProfileInfoKHR, QueryPoolCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeAV1GopRemainingFrameInfoKHR, VideoBeginCodingInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeAV1RateControlInfoKHR, VideoCodingControlInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeAV1RateControlInfoKHR, VideoBeginCodingInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeAV1RateControlLayerInfoKHR, VideoEncodeRateControlLayerInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_video_maintenance1 ===\n  template <>\n  struct StructExtends<PhysicalDeviceVideoMaintenance1FeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceVideoMaintenance1FeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoInlineQueryInfoKHR, VideoDecodeInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoInlineQueryInfoKHR, VideoEncodeInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_per_stage_descriptor_set ===\n  template <>\n  struct StructExtends<PhysicalDevicePerStageDescriptorSetFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePerStageDescriptorSetFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_QCOM_image_processing2 ===\n  template <>\n  struct StructExtends<PhysicalDeviceImageProcessing2FeaturesQCOM, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceImageProcessing2FeaturesQCOM, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceImageProcessing2PropertiesQCOM, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SamplerBlockMatchWindowCreateInfoQCOM, SamplerCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_QCOM_filter_cubic_weights ===\n  template <>\n  struct StructExtends<PhysicalDeviceCubicWeightsFeaturesQCOM, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceCubicWeightsFeaturesQCOM, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SamplerCubicWeightsCreateInfoQCOM, SamplerCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<BlitImageCubicWeightsInfoQCOM, BlitImageInfo2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_QCOM_ycbcr_degamma ===\n  template <>\n  struct StructExtends<PhysicalDeviceYcbcrDegammaFeaturesQCOM, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceYcbcrDegammaFeaturesQCOM, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM, SamplerYcbcrConversionCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_QCOM_filter_cubic_clamp ===\n  template <>\n  struct StructExtends<PhysicalDeviceCubicClampFeaturesQCOM, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceCubicClampFeaturesQCOM, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_attachment_feedback_loop_dynamic_state ===\n  template <>\n  struct StructExtends<PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n#  if defined( VK_USE_PLATFORM_SCREEN_QNX )\n  //=== VK_QNX_external_memory_screen_buffer ===\n  template <>\n  struct StructExtends<ScreenBufferFormatPropertiesQNX, ScreenBufferPropertiesQNX>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImportScreenBufferInfoQNX, MemoryAllocateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExternalFormatQNX, ImageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ExternalFormatQNX, SamplerYcbcrConversionCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n  //=== VK_MSFT_layered_driver ===\n  template <>\n  struct StructExtends<PhysicalDeviceLayeredDriverPropertiesMSFT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_descriptor_pool_overallocation ===\n  template <>\n  struct StructExtends<PhysicalDeviceDescriptorPoolOverallocationFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDescriptorPoolOverallocationFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_display_stereo ===\n  template <>\n  struct StructExtends<DisplaySurfaceStereoCreateInfoNV, DisplaySurfaceCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<DisplayModeStereoPropertiesNV, DisplayModeProperties2KHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_video_encode_quantization_map ===\n  template <>\n  struct StructExtends<VideoEncodeQuantizationMapCapabilitiesKHR, VideoCapabilitiesKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoFormatQuantizationMapPropertiesKHR, VideoFormatPropertiesKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeQuantizationMapInfoKHR, VideoEncodeInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeQuantizationMapSessionParametersCreateInfoKHR, VideoSessionParametersCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH264QuantizationMapCapabilitiesKHR, VideoCapabilitiesKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeH265QuantizationMapCapabilitiesKHR, VideoCapabilitiesKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoFormatH265QuantizationMapPropertiesKHR, VideoFormatPropertiesKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoEncodeAV1QuantizationMapCapabilitiesKHR, VideoCapabilitiesKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoFormatAV1QuantizationMapPropertiesKHR, VideoFormatPropertiesKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_raw_access_chains ===\n  template <>\n  struct StructExtends<PhysicalDeviceRawAccessChainsFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceRawAccessChainsFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_shader_relaxed_extended_instruction ===\n  template <>\n  struct StructExtends<PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_command_buffer_inheritance ===\n  template <>\n  struct StructExtends<PhysicalDeviceCommandBufferInheritanceFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceCommandBufferInheritanceFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_maintenance7 ===\n  template <>\n  struct StructExtends<PhysicalDeviceMaintenance7FeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMaintenance7FeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMaintenance7PropertiesKHR, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceLayeredApiPropertiesListKHR, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceLayeredApiVulkanPropertiesKHR, PhysicalDeviceLayeredApiPropertiesKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_shader_atomic_float16_vector ===\n  template <>\n  struct StructExtends<PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_shader_replicated_composites ===\n  template <>\n  struct StructExtends<PhysicalDeviceShaderReplicatedCompositesFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceShaderReplicatedCompositesFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_ray_tracing_validation ===\n  template <>\n  struct StructExtends<PhysicalDeviceRayTracingValidationFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceRayTracingValidationFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_cluster_acceleration_structure ===\n  template <>\n  struct StructExtends<PhysicalDeviceClusterAccelerationStructureFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceClusterAccelerationStructureFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceClusterAccelerationStructurePropertiesNV, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<RayTracingPipelineClusterAccelerationStructureCreateInfoNV, RayTracingPipelineCreateInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_partitioned_acceleration_structure ===\n  template <>\n  struct StructExtends<PhysicalDevicePartitionedAccelerationStructureFeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePartitionedAccelerationStructureFeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePartitionedAccelerationStructurePropertiesNV, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PartitionedAccelerationStructureFlagsNV, PartitionedAccelerationStructureInstancesInputNV>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<WriteDescriptorSetPartitionedAccelerationStructureNV, WriteDescriptorSet>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_device_generated_commands ===\n  template <>\n  struct StructExtends<PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<GeneratedCommandsPipelineInfoEXT, GeneratedCommandsInfoEXT>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<GeneratedCommandsPipelineInfoEXT, GeneratedCommandsMemoryRequirementsInfoEXT>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<GeneratedCommandsShaderInfoEXT, GeneratedCommandsInfoEXT>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<GeneratedCommandsShaderInfoEXT, GeneratedCommandsMemoryRequirementsInfoEXT>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_maintenance8 ===\n  template <>\n  struct StructExtends<PhysicalDeviceMaintenance8FeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceMaintenance8FeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<MemoryBarrierAccessFlags3KHR, MemoryBarrier2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<MemoryBarrierAccessFlags3KHR, BufferMemoryBarrier2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<MemoryBarrierAccessFlags3KHR, ImageMemoryBarrier2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_MESA_image_alignment_control ===\n  template <>\n  struct StructExtends<PhysicalDeviceImageAlignmentControlFeaturesMESA, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceImageAlignmentControlFeaturesMESA, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceImageAlignmentControlPropertiesMESA, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<ImageAlignmentControlCreateInfoMESA, ImageCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_depth_clamp_control ===\n  template <>\n  struct StructExtends<PhysicalDeviceDepthClampControlFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDepthClampControlFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PipelineViewportDepthClampControlCreateInfoEXT, PipelineViewportStateCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_KHR_video_maintenance2 ===\n  template <>\n  struct StructExtends<PhysicalDeviceVideoMaintenance2FeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceVideoMaintenance2FeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoDecodeH264InlineSessionParametersInfoKHR, VideoDecodeInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoDecodeH265InlineSessionParametersInfoKHR, VideoDecodeInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<VideoDecodeAV1InlineSessionParametersInfoKHR, VideoDecodeInfoKHR>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_HUAWEI_hdr_vivid ===\n  template <>\n  struct StructExtends<PhysicalDeviceHdrVividFeaturesHUAWEI, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceHdrVividFeaturesHUAWEI, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<HdrVividDynamicMetadataHUAWEI, HdrMetadataEXT>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_NV_cooperative_matrix2 ===\n  template <>\n  struct StructExtends<PhysicalDeviceCooperativeMatrix2FeaturesNV, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceCooperativeMatrix2FeaturesNV, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceCooperativeMatrix2PropertiesNV, PhysicalDeviceProperties2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_ARM_pipeline_opacity_micromap ===\n  template <>\n  struct StructExtends<PhysicalDevicePipelineOpacityMicromapFeaturesARM, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDevicePipelineOpacityMicromapFeaturesARM, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n  //=== VK_EXT_external_memory_metal ===\n  template <>\n  struct StructExtends<ImportMemoryMetalHandleInfoEXT, MemoryAllocateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n  //=== VK_KHR_depth_clamp_zero_one ===\n  template <>\n  struct StructExtends<PhysicalDeviceDepthClampZeroOneFeaturesKHR, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceDepthClampZeroOneFeaturesKHR, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  //=== VK_EXT_vertex_attribute_robustness ===\n  template <>\n  struct StructExtends<PhysicalDeviceVertexAttributeRobustnessFeaturesEXT, PhysicalDeviceFeatures2>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n  template <>\n  struct StructExtends<PhysicalDeviceVertexAttributeRobustnessFeaturesEXT, DeviceCreateInfo>\n  {\n    enum\n    {\n      value = true\n    };\n  };\n\n#endif  // VULKAN_HPP_DISABLE_ENHANCED_MODE\n\n  namespace detail\n  {\n#if VULKAN_HPP_ENABLE_DYNAMIC_LOADER_TOOL\n    class DynamicLoader\n    {\n    public:\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n      DynamicLoader( std::string const & vulkanLibraryName = {} ) VULKAN_HPP_NOEXCEPT\n#  else\n      DynamicLoader( std::string const & vulkanLibraryName = {} )\n#  endif\n      {\n        if ( !vulkanLibraryName.empty() )\n        {\n#  if defined( _WIN32 )\n          m_library = ::LoadLibraryA( vulkanLibraryName.c_str() );\n#  elif defined( __unix__ ) || defined( __APPLE__ ) || defined( __QNX__ ) || defined( __Fuchsia__ )\n          m_library = dlopen( vulkanLibraryName.c_str(), RTLD_NOW | RTLD_LOCAL );\n#  else\n#    error unsupported platform\n#  endif\n        }\n        else\n        {\n#  if defined( _WIN32 )\n          m_library = ::LoadLibraryA( \"vulkan-1.dll\" );\n#  elif defined( __APPLE__ )\n          m_library = dlopen( \"libvulkan.dylib\", RTLD_NOW | RTLD_LOCAL );\n          if ( !m_library )\n          {\n            m_library = dlopen( \"libvulkan.1.dylib\", RTLD_NOW | RTLD_LOCAL );\n          }\n          if ( !m_library )\n          {\n            m_library = dlopen( \"libMoltenVK.dylib\", RTLD_NOW | RTLD_LOCAL );\n          }\n          // Add support for using Vulkan and MoltenVK in a Framework. App store rules for iOS\n          // strictly enforce no .dylib's. If they aren't found it just falls through\n          if ( !m_library )\n          {\n            m_library = dlopen( \"vulkan.framework/vulkan\", RTLD_NOW | RTLD_LOCAL );\n          }\n          if ( !m_library )\n          {\n            m_library = dlopen( \"MoltenVK.framework/MoltenVK\", RTLD_NOW | RTLD_LOCAL );\n          }\n          // modern versions of macOS don't search /usr/local/lib automatically contrary to what man dlopen says\n          // Vulkan SDK uses this as the system-wide installation location, so we're going to fallback to this if all else fails\n          if ( !m_library && ( getenv( \"DYLD_FALLBACK_LIBRARY_PATH\" ) == NULL ) )\n          {\n            m_library = dlopen( \"/usr/local/lib/libvulkan.dylib\", RTLD_NOW | RTLD_LOCAL );\n          }\n#  elif defined( __unix__ ) || defined( __QNX__ ) || defined( __Fuchsia__ )\n          m_library = dlopen( \"libvulkan.so\", RTLD_NOW | RTLD_LOCAL );\n          if ( !m_library )\n          {\n            m_library = dlopen( \"libvulkan.so.1\", RTLD_NOW | RTLD_LOCAL );\n          }\n#  else\n#    error unsupported platform\n#  endif\n        }\n\n#  ifndef VULKAN_HPP_NO_EXCEPTIONS\n        if ( !m_library )\n        {\n          // NOTE there should be an InitializationFailedError, but msvc insists on the symbol does not exist within the scope of this function.\n          throw std::runtime_error( \"Failed to load vulkan library!\" );\n        }\n#  endif\n      }\n\n      DynamicLoader( DynamicLoader const & ) = delete;\n\n      DynamicLoader( DynamicLoader && other ) VULKAN_HPP_NOEXCEPT : m_library( other.m_library )\n      {\n        other.m_library = nullptr;\n      }\n\n      DynamicLoader & operator=( DynamicLoader const & ) = delete;\n\n      DynamicLoader & operator=( DynamicLoader && other ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_library, other.m_library );\n        return *this;\n      }\n\n      ~DynamicLoader() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_library )\n        {\n#  if defined( __unix__ ) || defined( __APPLE__ ) || defined( __QNX__ ) || defined( __Fuchsia__ )\n          dlclose( m_library );\n#  elif defined( _WIN32 )\n          ::FreeLibrary( m_library );\n#  else\n#    error unsupported platform\n#  endif\n        }\n      }\n\n      template <typename T>\n      T getProcAddress( const char * function ) const VULKAN_HPP_NOEXCEPT\n      {\n#  if defined( __unix__ ) || defined( __APPLE__ ) || defined( __QNX__ ) || defined( __Fuchsia__ )\n        return (T)dlsym( m_library, function );\n#  elif defined( _WIN32 )\n        return ( T )::GetProcAddress( m_library, function );\n#  else\n#    error unsupported platform\n#  endif\n      }\n\n      bool success() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_library != nullptr;\n      }\n\n    private:\n#  if defined( __unix__ ) || defined( __APPLE__ ) || defined( __QNX__ ) || defined( __Fuchsia__ )\n      void * m_library;\n#  elif defined( _WIN32 )\n      ::HINSTANCE m_library;\n#  else\n#    error unsupported platform\n#  endif\n    };\n#endif\n\n    using PFN_dummy = void ( * )();\n\n    class DispatchLoaderDynamic : public DispatchLoaderBase\n    {\n    public:\n      //=== VK_VERSION_1_0 ===\n      PFN_vkCreateInstance                               vkCreateInstance                               = 0;\n      PFN_vkDestroyInstance                              vkDestroyInstance                              = 0;\n      PFN_vkEnumeratePhysicalDevices                     vkEnumeratePhysicalDevices                     = 0;\n      PFN_vkGetPhysicalDeviceFeatures                    vkGetPhysicalDeviceFeatures                    = 0;\n      PFN_vkGetPhysicalDeviceFormatProperties            vkGetPhysicalDeviceFormatProperties            = 0;\n      PFN_vkGetPhysicalDeviceImageFormatProperties       vkGetPhysicalDeviceImageFormatProperties       = 0;\n      PFN_vkGetPhysicalDeviceProperties                  vkGetPhysicalDeviceProperties                  = 0;\n      PFN_vkGetPhysicalDeviceQueueFamilyProperties       vkGetPhysicalDeviceQueueFamilyProperties       = 0;\n      PFN_vkGetPhysicalDeviceMemoryProperties            vkGetPhysicalDeviceMemoryProperties            = 0;\n      PFN_vkGetInstanceProcAddr                          vkGetInstanceProcAddr                          = 0;\n      PFN_vkGetDeviceProcAddr                            vkGetDeviceProcAddr                            = 0;\n      PFN_vkCreateDevice                                 vkCreateDevice                                 = 0;\n      PFN_vkDestroyDevice                                vkDestroyDevice                                = 0;\n      PFN_vkEnumerateInstanceExtensionProperties         vkEnumerateInstanceExtensionProperties         = 0;\n      PFN_vkEnumerateDeviceExtensionProperties           vkEnumerateDeviceExtensionProperties           = 0;\n      PFN_vkEnumerateInstanceLayerProperties             vkEnumerateInstanceLayerProperties             = 0;\n      PFN_vkEnumerateDeviceLayerProperties               vkEnumerateDeviceLayerProperties               = 0;\n      PFN_vkGetDeviceQueue                               vkGetDeviceQueue                               = 0;\n      PFN_vkQueueSubmit                                  vkQueueSubmit                                  = 0;\n      PFN_vkQueueWaitIdle                                vkQueueWaitIdle                                = 0;\n      PFN_vkDeviceWaitIdle                               vkDeviceWaitIdle                               = 0;\n      PFN_vkAllocateMemory                               vkAllocateMemory                               = 0;\n      PFN_vkFreeMemory                                   vkFreeMemory                                   = 0;\n      PFN_vkMapMemory                                    vkMapMemory                                    = 0;\n      PFN_vkUnmapMemory                                  vkUnmapMemory                                  = 0;\n      PFN_vkFlushMappedMemoryRanges                      vkFlushMappedMemoryRanges                      = 0;\n      PFN_vkInvalidateMappedMemoryRanges                 vkInvalidateMappedMemoryRanges                 = 0;\n      PFN_vkGetDeviceMemoryCommitment                    vkGetDeviceMemoryCommitment                    = 0;\n      PFN_vkBindBufferMemory                             vkBindBufferMemory                             = 0;\n      PFN_vkBindImageMemory                              vkBindImageMemory                              = 0;\n      PFN_vkGetBufferMemoryRequirements                  vkGetBufferMemoryRequirements                  = 0;\n      PFN_vkGetImageMemoryRequirements                   vkGetImageMemoryRequirements                   = 0;\n      PFN_vkGetImageSparseMemoryRequirements             vkGetImageSparseMemoryRequirements             = 0;\n      PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties = 0;\n      PFN_vkQueueBindSparse                              vkQueueBindSparse                              = 0;\n      PFN_vkCreateFence                                  vkCreateFence                                  = 0;\n      PFN_vkDestroyFence                                 vkDestroyFence                                 = 0;\n      PFN_vkResetFences                                  vkResetFences                                  = 0;\n      PFN_vkGetFenceStatus                               vkGetFenceStatus                               = 0;\n      PFN_vkWaitForFences                                vkWaitForFences                                = 0;\n      PFN_vkCreateSemaphore                              vkCreateSemaphore                              = 0;\n      PFN_vkDestroySemaphore                             vkDestroySemaphore                             = 0;\n      PFN_vkCreateEvent                                  vkCreateEvent                                  = 0;\n      PFN_vkDestroyEvent                                 vkDestroyEvent                                 = 0;\n      PFN_vkGetEventStatus                               vkGetEventStatus                               = 0;\n      PFN_vkSetEvent                                     vkSetEvent                                     = 0;\n      PFN_vkResetEvent                                   vkResetEvent                                   = 0;\n      PFN_vkCreateQueryPool                              vkCreateQueryPool                              = 0;\n      PFN_vkDestroyQueryPool                             vkDestroyQueryPool                             = 0;\n      PFN_vkGetQueryPoolResults                          vkGetQueryPoolResults                          = 0;\n      PFN_vkCreateBuffer                                 vkCreateBuffer                                 = 0;\n      PFN_vkDestroyBuffer                                vkDestroyBuffer                                = 0;\n      PFN_vkCreateBufferView                             vkCreateBufferView                             = 0;\n      PFN_vkDestroyBufferView                            vkDestroyBufferView                            = 0;\n      PFN_vkCreateImage                                  vkCreateImage                                  = 0;\n      PFN_vkDestroyImage                                 vkDestroyImage                                 = 0;\n      PFN_vkGetImageSubresourceLayout                    vkGetImageSubresourceLayout                    = 0;\n      PFN_vkCreateImageView                              vkCreateImageView                              = 0;\n      PFN_vkDestroyImageView                             vkDestroyImageView                             = 0;\n      PFN_vkCreateShaderModule                           vkCreateShaderModule                           = 0;\n      PFN_vkDestroyShaderModule                          vkDestroyShaderModule                          = 0;\n      PFN_vkCreatePipelineCache                          vkCreatePipelineCache                          = 0;\n      PFN_vkDestroyPipelineCache                         vkDestroyPipelineCache                         = 0;\n      PFN_vkGetPipelineCacheData                         vkGetPipelineCacheData                         = 0;\n      PFN_vkMergePipelineCaches                          vkMergePipelineCaches                          = 0;\n      PFN_vkCreateGraphicsPipelines                      vkCreateGraphicsPipelines                      = 0;\n      PFN_vkCreateComputePipelines                       vkCreateComputePipelines                       = 0;\n      PFN_vkDestroyPipeline                              vkDestroyPipeline                              = 0;\n      PFN_vkCreatePipelineLayout                         vkCreatePipelineLayout                         = 0;\n      PFN_vkDestroyPipelineLayout                        vkDestroyPipelineLayout                        = 0;\n      PFN_vkCreateSampler                                vkCreateSampler                                = 0;\n      PFN_vkDestroySampler                               vkDestroySampler                               = 0;\n      PFN_vkCreateDescriptorSetLayout                    vkCreateDescriptorSetLayout                    = 0;\n      PFN_vkDestroyDescriptorSetLayout                   vkDestroyDescriptorSetLayout                   = 0;\n      PFN_vkCreateDescriptorPool                         vkCreateDescriptorPool                         = 0;\n      PFN_vkDestroyDescriptorPool                        vkDestroyDescriptorPool                        = 0;\n      PFN_vkResetDescriptorPool                          vkResetDescriptorPool                          = 0;\n      PFN_vkAllocateDescriptorSets                       vkAllocateDescriptorSets                       = 0;\n      PFN_vkFreeDescriptorSets                           vkFreeDescriptorSets                           = 0;\n      PFN_vkUpdateDescriptorSets                         vkUpdateDescriptorSets                         = 0;\n      PFN_vkCreateFramebuffer                            vkCreateFramebuffer                            = 0;\n      PFN_vkDestroyFramebuffer                           vkDestroyFramebuffer                           = 0;\n      PFN_vkCreateRenderPass                             vkCreateRenderPass                             = 0;\n      PFN_vkDestroyRenderPass                            vkDestroyRenderPass                            = 0;\n      PFN_vkGetRenderAreaGranularity                     vkGetRenderAreaGranularity                     = 0;\n      PFN_vkCreateCommandPool                            vkCreateCommandPool                            = 0;\n      PFN_vkDestroyCommandPool                           vkDestroyCommandPool                           = 0;\n      PFN_vkResetCommandPool                             vkResetCommandPool                             = 0;\n      PFN_vkAllocateCommandBuffers                       vkAllocateCommandBuffers                       = 0;\n      PFN_vkFreeCommandBuffers                           vkFreeCommandBuffers                           = 0;\n      PFN_vkBeginCommandBuffer                           vkBeginCommandBuffer                           = 0;\n      PFN_vkEndCommandBuffer                             vkEndCommandBuffer                             = 0;\n      PFN_vkResetCommandBuffer                           vkResetCommandBuffer                           = 0;\n      PFN_vkCmdBindPipeline                              vkCmdBindPipeline                              = 0;\n      PFN_vkCmdSetViewport                               vkCmdSetViewport                               = 0;\n      PFN_vkCmdSetScissor                                vkCmdSetScissor                                = 0;\n      PFN_vkCmdSetLineWidth                              vkCmdSetLineWidth                              = 0;\n      PFN_vkCmdSetDepthBias                              vkCmdSetDepthBias                              = 0;\n      PFN_vkCmdSetBlendConstants                         vkCmdSetBlendConstants                         = 0;\n      PFN_vkCmdSetDepthBounds                            vkCmdSetDepthBounds                            = 0;\n      PFN_vkCmdSetStencilCompareMask                     vkCmdSetStencilCompareMask                     = 0;\n      PFN_vkCmdSetStencilWriteMask                       vkCmdSetStencilWriteMask                       = 0;\n      PFN_vkCmdSetStencilReference                       vkCmdSetStencilReference                       = 0;\n      PFN_vkCmdBindDescriptorSets                        vkCmdBindDescriptorSets                        = 0;\n      PFN_vkCmdBindIndexBuffer                           vkCmdBindIndexBuffer                           = 0;\n      PFN_vkCmdBindVertexBuffers                         vkCmdBindVertexBuffers                         = 0;\n      PFN_vkCmdDraw                                      vkCmdDraw                                      = 0;\n      PFN_vkCmdDrawIndexed                               vkCmdDrawIndexed                               = 0;\n      PFN_vkCmdDrawIndirect                              vkCmdDrawIndirect                              = 0;\n      PFN_vkCmdDrawIndexedIndirect                       vkCmdDrawIndexedIndirect                       = 0;\n      PFN_vkCmdDispatch                                  vkCmdDispatch                                  = 0;\n      PFN_vkCmdDispatchIndirect                          vkCmdDispatchIndirect                          = 0;\n      PFN_vkCmdCopyBuffer                                vkCmdCopyBuffer                                = 0;\n      PFN_vkCmdCopyImage                                 vkCmdCopyImage                                 = 0;\n      PFN_vkCmdBlitImage                                 vkCmdBlitImage                                 = 0;\n      PFN_vkCmdCopyBufferToImage                         vkCmdCopyBufferToImage                         = 0;\n      PFN_vkCmdCopyImageToBuffer                         vkCmdCopyImageToBuffer                         = 0;\n      PFN_vkCmdUpdateBuffer                              vkCmdUpdateBuffer                              = 0;\n      PFN_vkCmdFillBuffer                                vkCmdFillBuffer                                = 0;\n      PFN_vkCmdClearColorImage                           vkCmdClearColorImage                           = 0;\n      PFN_vkCmdClearDepthStencilImage                    vkCmdClearDepthStencilImage                    = 0;\n      PFN_vkCmdClearAttachments                          vkCmdClearAttachments                          = 0;\n      PFN_vkCmdResolveImage                              vkCmdResolveImage                              = 0;\n      PFN_vkCmdSetEvent                                  vkCmdSetEvent                                  = 0;\n      PFN_vkCmdResetEvent                                vkCmdResetEvent                                = 0;\n      PFN_vkCmdWaitEvents                                vkCmdWaitEvents                                = 0;\n      PFN_vkCmdPipelineBarrier                           vkCmdPipelineBarrier                           = 0;\n      PFN_vkCmdBeginQuery                                vkCmdBeginQuery                                = 0;\n      PFN_vkCmdEndQuery                                  vkCmdEndQuery                                  = 0;\n      PFN_vkCmdResetQueryPool                            vkCmdResetQueryPool                            = 0;\n      PFN_vkCmdWriteTimestamp                            vkCmdWriteTimestamp                            = 0;\n      PFN_vkCmdCopyQueryPoolResults                      vkCmdCopyQueryPoolResults                      = 0;\n      PFN_vkCmdPushConstants                             vkCmdPushConstants                             = 0;\n      PFN_vkCmdBeginRenderPass                           vkCmdBeginRenderPass                           = 0;\n      PFN_vkCmdNextSubpass                               vkCmdNextSubpass                               = 0;\n      PFN_vkCmdEndRenderPass                             vkCmdEndRenderPass                             = 0;\n      PFN_vkCmdExecuteCommands                           vkCmdExecuteCommands                           = 0;\n\n      //=== VK_VERSION_1_1 ===\n      PFN_vkEnumerateInstanceVersion                      vkEnumerateInstanceVersion                      = 0;\n      PFN_vkBindBufferMemory2                             vkBindBufferMemory2                             = 0;\n      PFN_vkBindImageMemory2                              vkBindImageMemory2                              = 0;\n      PFN_vkGetDeviceGroupPeerMemoryFeatures              vkGetDeviceGroupPeerMemoryFeatures              = 0;\n      PFN_vkCmdSetDeviceMask                              vkCmdSetDeviceMask                              = 0;\n      PFN_vkCmdDispatchBase                               vkCmdDispatchBase                               = 0;\n      PFN_vkEnumeratePhysicalDeviceGroups                 vkEnumeratePhysicalDeviceGroups                 = 0;\n      PFN_vkGetImageMemoryRequirements2                   vkGetImageMemoryRequirements2                   = 0;\n      PFN_vkGetBufferMemoryRequirements2                  vkGetBufferMemoryRequirements2                  = 0;\n      PFN_vkGetImageSparseMemoryRequirements2             vkGetImageSparseMemoryRequirements2             = 0;\n      PFN_vkGetPhysicalDeviceFeatures2                    vkGetPhysicalDeviceFeatures2                    = 0;\n      PFN_vkGetPhysicalDeviceProperties2                  vkGetPhysicalDeviceProperties2                  = 0;\n      PFN_vkGetPhysicalDeviceFormatProperties2            vkGetPhysicalDeviceFormatProperties2            = 0;\n      PFN_vkGetPhysicalDeviceImageFormatProperties2       vkGetPhysicalDeviceImageFormatProperties2       = 0;\n      PFN_vkGetPhysicalDeviceQueueFamilyProperties2       vkGetPhysicalDeviceQueueFamilyProperties2       = 0;\n      PFN_vkGetPhysicalDeviceMemoryProperties2            vkGetPhysicalDeviceMemoryProperties2            = 0;\n      PFN_vkGetPhysicalDeviceSparseImageFormatProperties2 vkGetPhysicalDeviceSparseImageFormatProperties2 = 0;\n      PFN_vkTrimCommandPool                               vkTrimCommandPool                               = 0;\n      PFN_vkGetDeviceQueue2                               vkGetDeviceQueue2                               = 0;\n      PFN_vkCreateSamplerYcbcrConversion                  vkCreateSamplerYcbcrConversion                  = 0;\n      PFN_vkDestroySamplerYcbcrConversion                 vkDestroySamplerYcbcrConversion                 = 0;\n      PFN_vkCreateDescriptorUpdateTemplate                vkCreateDescriptorUpdateTemplate                = 0;\n      PFN_vkDestroyDescriptorUpdateTemplate               vkDestroyDescriptorUpdateTemplate               = 0;\n      PFN_vkUpdateDescriptorSetWithTemplate               vkUpdateDescriptorSetWithTemplate               = 0;\n      PFN_vkGetPhysicalDeviceExternalBufferProperties     vkGetPhysicalDeviceExternalBufferProperties     = 0;\n      PFN_vkGetPhysicalDeviceExternalFenceProperties      vkGetPhysicalDeviceExternalFenceProperties      = 0;\n      PFN_vkGetPhysicalDeviceExternalSemaphoreProperties  vkGetPhysicalDeviceExternalSemaphoreProperties  = 0;\n      PFN_vkGetDescriptorSetLayoutSupport                 vkGetDescriptorSetLayoutSupport                 = 0;\n\n      //=== VK_VERSION_1_2 ===\n      PFN_vkCmdDrawIndirectCount                vkCmdDrawIndirectCount                = 0;\n      PFN_vkCmdDrawIndexedIndirectCount         vkCmdDrawIndexedIndirectCount         = 0;\n      PFN_vkCreateRenderPass2                   vkCreateRenderPass2                   = 0;\n      PFN_vkCmdBeginRenderPass2                 vkCmdBeginRenderPass2                 = 0;\n      PFN_vkCmdNextSubpass2                     vkCmdNextSubpass2                     = 0;\n      PFN_vkCmdEndRenderPass2                   vkCmdEndRenderPass2                   = 0;\n      PFN_vkResetQueryPool                      vkResetQueryPool                      = 0;\n      PFN_vkGetSemaphoreCounterValue            vkGetSemaphoreCounterValue            = 0;\n      PFN_vkWaitSemaphores                      vkWaitSemaphores                      = 0;\n      PFN_vkSignalSemaphore                     vkSignalSemaphore                     = 0;\n      PFN_vkGetBufferDeviceAddress              vkGetBufferDeviceAddress              = 0;\n      PFN_vkGetBufferOpaqueCaptureAddress       vkGetBufferOpaqueCaptureAddress       = 0;\n      PFN_vkGetDeviceMemoryOpaqueCaptureAddress vkGetDeviceMemoryOpaqueCaptureAddress = 0;\n\n      //=== VK_VERSION_1_3 ===\n      PFN_vkGetPhysicalDeviceToolProperties        vkGetPhysicalDeviceToolProperties        = 0;\n      PFN_vkCreatePrivateDataSlot                  vkCreatePrivateDataSlot                  = 0;\n      PFN_vkDestroyPrivateDataSlot                 vkDestroyPrivateDataSlot                 = 0;\n      PFN_vkSetPrivateData                         vkSetPrivateData                         = 0;\n      PFN_vkGetPrivateData                         vkGetPrivateData                         = 0;\n      PFN_vkCmdSetEvent2                           vkCmdSetEvent2                           = 0;\n      PFN_vkCmdResetEvent2                         vkCmdResetEvent2                         = 0;\n      PFN_vkCmdWaitEvents2                         vkCmdWaitEvents2                         = 0;\n      PFN_vkCmdPipelineBarrier2                    vkCmdPipelineBarrier2                    = 0;\n      PFN_vkCmdWriteTimestamp2                     vkCmdWriteTimestamp2                     = 0;\n      PFN_vkQueueSubmit2                           vkQueueSubmit2                           = 0;\n      PFN_vkCmdCopyBuffer2                         vkCmdCopyBuffer2                         = 0;\n      PFN_vkCmdCopyImage2                          vkCmdCopyImage2                          = 0;\n      PFN_vkCmdCopyBufferToImage2                  vkCmdCopyBufferToImage2                  = 0;\n      PFN_vkCmdCopyImageToBuffer2                  vkCmdCopyImageToBuffer2                  = 0;\n      PFN_vkCmdBlitImage2                          vkCmdBlitImage2                          = 0;\n      PFN_vkCmdResolveImage2                       vkCmdResolveImage2                       = 0;\n      PFN_vkCmdBeginRendering                      vkCmdBeginRendering                      = 0;\n      PFN_vkCmdEndRendering                        vkCmdEndRendering                        = 0;\n      PFN_vkCmdSetCullMode                         vkCmdSetCullMode                         = 0;\n      PFN_vkCmdSetFrontFace                        vkCmdSetFrontFace                        = 0;\n      PFN_vkCmdSetPrimitiveTopology                vkCmdSetPrimitiveTopology                = 0;\n      PFN_vkCmdSetViewportWithCount                vkCmdSetViewportWithCount                = 0;\n      PFN_vkCmdSetScissorWithCount                 vkCmdSetScissorWithCount                 = 0;\n      PFN_vkCmdBindVertexBuffers2                  vkCmdBindVertexBuffers2                  = 0;\n      PFN_vkCmdSetDepthTestEnable                  vkCmdSetDepthTestEnable                  = 0;\n      PFN_vkCmdSetDepthWriteEnable                 vkCmdSetDepthWriteEnable                 = 0;\n      PFN_vkCmdSetDepthCompareOp                   vkCmdSetDepthCompareOp                   = 0;\n      PFN_vkCmdSetDepthBoundsTestEnable            vkCmdSetDepthBoundsTestEnable            = 0;\n      PFN_vkCmdSetStencilTestEnable                vkCmdSetStencilTestEnable                = 0;\n      PFN_vkCmdSetStencilOp                        vkCmdSetStencilOp                        = 0;\n      PFN_vkCmdSetRasterizerDiscardEnable          vkCmdSetRasterizerDiscardEnable          = 0;\n      PFN_vkCmdSetDepthBiasEnable                  vkCmdSetDepthBiasEnable                  = 0;\n      PFN_vkCmdSetPrimitiveRestartEnable           vkCmdSetPrimitiveRestartEnable           = 0;\n      PFN_vkGetDeviceBufferMemoryRequirements      vkGetDeviceBufferMemoryRequirements      = 0;\n      PFN_vkGetDeviceImageMemoryRequirements       vkGetDeviceImageMemoryRequirements       = 0;\n      PFN_vkGetDeviceImageSparseMemoryRequirements vkGetDeviceImageSparseMemoryRequirements = 0;\n\n      //=== VK_VERSION_1_4 ===\n      PFN_vkCmdSetLineStipple                     vkCmdSetLineStipple                     = 0;\n      PFN_vkMapMemory2                            vkMapMemory2                            = 0;\n      PFN_vkUnmapMemory2                          vkUnmapMemory2                          = 0;\n      PFN_vkCmdBindIndexBuffer2                   vkCmdBindIndexBuffer2                   = 0;\n      PFN_vkGetRenderingAreaGranularity           vkGetRenderingAreaGranularity           = 0;\n      PFN_vkGetDeviceImageSubresourceLayout       vkGetDeviceImageSubresourceLayout       = 0;\n      PFN_vkGetImageSubresourceLayout2            vkGetImageSubresourceLayout2            = 0;\n      PFN_vkCmdPushDescriptorSet                  vkCmdPushDescriptorSet                  = 0;\n      PFN_vkCmdPushDescriptorSetWithTemplate      vkCmdPushDescriptorSetWithTemplate      = 0;\n      PFN_vkCmdSetRenderingAttachmentLocations    vkCmdSetRenderingAttachmentLocations    = 0;\n      PFN_vkCmdSetRenderingInputAttachmentIndices vkCmdSetRenderingInputAttachmentIndices = 0;\n      PFN_vkCmdBindDescriptorSets2                vkCmdBindDescriptorSets2                = 0;\n      PFN_vkCmdPushConstants2                     vkCmdPushConstants2                     = 0;\n      PFN_vkCmdPushDescriptorSet2                 vkCmdPushDescriptorSet2                 = 0;\n      PFN_vkCmdPushDescriptorSetWithTemplate2     vkCmdPushDescriptorSetWithTemplate2     = 0;\n      PFN_vkCopyMemoryToImage                     vkCopyMemoryToImage                     = 0;\n      PFN_vkCopyImageToMemory                     vkCopyImageToMemory                     = 0;\n      PFN_vkCopyImageToImage                      vkCopyImageToImage                      = 0;\n      PFN_vkTransitionImageLayout                 vkTransitionImageLayout                 = 0;\n\n      //=== VK_KHR_surface ===\n      PFN_vkDestroySurfaceKHR                       vkDestroySurfaceKHR                       = 0;\n      PFN_vkGetPhysicalDeviceSurfaceSupportKHR      vkGetPhysicalDeviceSurfaceSupportKHR      = 0;\n      PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR = 0;\n      PFN_vkGetPhysicalDeviceSurfaceFormatsKHR      vkGetPhysicalDeviceSurfaceFormatsKHR      = 0;\n      PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR = 0;\n\n      //=== VK_KHR_swapchain ===\n      PFN_vkCreateSwapchainKHR                    vkCreateSwapchainKHR                    = 0;\n      PFN_vkDestroySwapchainKHR                   vkDestroySwapchainKHR                   = 0;\n      PFN_vkGetSwapchainImagesKHR                 vkGetSwapchainImagesKHR                 = 0;\n      PFN_vkAcquireNextImageKHR                   vkAcquireNextImageKHR                   = 0;\n      PFN_vkQueuePresentKHR                       vkQueuePresentKHR                       = 0;\n      PFN_vkGetDeviceGroupPresentCapabilitiesKHR  vkGetDeviceGroupPresentCapabilitiesKHR  = 0;\n      PFN_vkGetDeviceGroupSurfacePresentModesKHR  vkGetDeviceGroupSurfacePresentModesKHR  = 0;\n      PFN_vkGetPhysicalDevicePresentRectanglesKHR vkGetPhysicalDevicePresentRectanglesKHR = 0;\n      PFN_vkAcquireNextImage2KHR                  vkAcquireNextImage2KHR                  = 0;\n\n      //=== VK_KHR_display ===\n      PFN_vkGetPhysicalDeviceDisplayPropertiesKHR      vkGetPhysicalDeviceDisplayPropertiesKHR      = 0;\n      PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR vkGetPhysicalDeviceDisplayPlanePropertiesKHR = 0;\n      PFN_vkGetDisplayPlaneSupportedDisplaysKHR        vkGetDisplayPlaneSupportedDisplaysKHR        = 0;\n      PFN_vkGetDisplayModePropertiesKHR                vkGetDisplayModePropertiesKHR                = 0;\n      PFN_vkCreateDisplayModeKHR                       vkCreateDisplayModeKHR                       = 0;\n      PFN_vkGetDisplayPlaneCapabilitiesKHR             vkGetDisplayPlaneCapabilitiesKHR             = 0;\n      PFN_vkCreateDisplayPlaneSurfaceKHR               vkCreateDisplayPlaneSurfaceKHR               = 0;\n\n      //=== VK_KHR_display_swapchain ===\n      PFN_vkCreateSharedSwapchainsKHR vkCreateSharedSwapchainsKHR = 0;\n\n#if defined( VK_USE_PLATFORM_XLIB_KHR )\n      //=== VK_KHR_xlib_surface ===\n      PFN_vkCreateXlibSurfaceKHR                        vkCreateXlibSurfaceKHR                        = 0;\n      PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR vkGetPhysicalDeviceXlibPresentationSupportKHR = 0;\n#else\n      PFN_dummy vkCreateXlibSurfaceKHR_placeholder                            = 0;\n      PFN_dummy vkGetPhysicalDeviceXlibPresentationSupportKHR_placeholder     = 0;\n#endif /*VK_USE_PLATFORM_XLIB_KHR*/\n\n#if defined( VK_USE_PLATFORM_XCB_KHR )\n      //=== VK_KHR_xcb_surface ===\n      PFN_vkCreateXcbSurfaceKHR                        vkCreateXcbSurfaceKHR                        = 0;\n      PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR vkGetPhysicalDeviceXcbPresentationSupportKHR = 0;\n#else\n      PFN_dummy vkCreateXcbSurfaceKHR_placeholder                             = 0;\n      PFN_dummy vkGetPhysicalDeviceXcbPresentationSupportKHR_placeholder      = 0;\n#endif /*VK_USE_PLATFORM_XCB_KHR*/\n\n#if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n      //=== VK_KHR_wayland_surface ===\n      PFN_vkCreateWaylandSurfaceKHR                        vkCreateWaylandSurfaceKHR                        = 0;\n      PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR vkGetPhysicalDeviceWaylandPresentationSupportKHR = 0;\n#else\n      PFN_dummy vkCreateWaylandSurfaceKHR_placeholder                         = 0;\n      PFN_dummy vkGetPhysicalDeviceWaylandPresentationSupportKHR_placeholder  = 0;\n#endif /*VK_USE_PLATFORM_WAYLAND_KHR*/\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n      //=== VK_KHR_android_surface ===\n      PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR = 0;\n#else\n      PFN_dummy vkCreateAndroidSurfaceKHR_placeholder                         = 0;\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_KHR_win32_surface ===\n      PFN_vkCreateWin32SurfaceKHR                        vkCreateWin32SurfaceKHR                        = 0;\n      PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR vkGetPhysicalDeviceWin32PresentationSupportKHR = 0;\n#else\n      PFN_dummy vkCreateWin32SurfaceKHR_placeholder                           = 0;\n      PFN_dummy vkGetPhysicalDeviceWin32PresentationSupportKHR_placeholder    = 0;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n      //=== VK_EXT_debug_report ===\n      PFN_vkCreateDebugReportCallbackEXT  vkCreateDebugReportCallbackEXT  = 0;\n      PFN_vkDestroyDebugReportCallbackEXT vkDestroyDebugReportCallbackEXT = 0;\n      PFN_vkDebugReportMessageEXT         vkDebugReportMessageEXT         = 0;\n\n      //=== VK_EXT_debug_marker ===\n      PFN_vkDebugMarkerSetObjectTagEXT  vkDebugMarkerSetObjectTagEXT  = 0;\n      PFN_vkDebugMarkerSetObjectNameEXT vkDebugMarkerSetObjectNameEXT = 0;\n      PFN_vkCmdDebugMarkerBeginEXT      vkCmdDebugMarkerBeginEXT      = 0;\n      PFN_vkCmdDebugMarkerEndEXT        vkCmdDebugMarkerEndEXT        = 0;\n      PFN_vkCmdDebugMarkerInsertEXT     vkCmdDebugMarkerInsertEXT     = 0;\n\n      //=== VK_KHR_video_queue ===\n      PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR     vkGetPhysicalDeviceVideoCapabilitiesKHR     = 0;\n      PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR vkGetPhysicalDeviceVideoFormatPropertiesKHR = 0;\n      PFN_vkCreateVideoSessionKHR                     vkCreateVideoSessionKHR                     = 0;\n      PFN_vkDestroyVideoSessionKHR                    vkDestroyVideoSessionKHR                    = 0;\n      PFN_vkGetVideoSessionMemoryRequirementsKHR      vkGetVideoSessionMemoryRequirementsKHR      = 0;\n      PFN_vkBindVideoSessionMemoryKHR                 vkBindVideoSessionMemoryKHR                 = 0;\n      PFN_vkCreateVideoSessionParametersKHR           vkCreateVideoSessionParametersKHR           = 0;\n      PFN_vkUpdateVideoSessionParametersKHR           vkUpdateVideoSessionParametersKHR           = 0;\n      PFN_vkDestroyVideoSessionParametersKHR          vkDestroyVideoSessionParametersKHR          = 0;\n      PFN_vkCmdBeginVideoCodingKHR                    vkCmdBeginVideoCodingKHR                    = 0;\n      PFN_vkCmdEndVideoCodingKHR                      vkCmdEndVideoCodingKHR                      = 0;\n      PFN_vkCmdControlVideoCodingKHR                  vkCmdControlVideoCodingKHR                  = 0;\n\n      //=== VK_KHR_video_decode_queue ===\n      PFN_vkCmdDecodeVideoKHR vkCmdDecodeVideoKHR = 0;\n\n      //=== VK_EXT_transform_feedback ===\n      PFN_vkCmdBindTransformFeedbackBuffersEXT vkCmdBindTransformFeedbackBuffersEXT = 0;\n      PFN_vkCmdBeginTransformFeedbackEXT       vkCmdBeginTransformFeedbackEXT       = 0;\n      PFN_vkCmdEndTransformFeedbackEXT         vkCmdEndTransformFeedbackEXT         = 0;\n      PFN_vkCmdBeginQueryIndexedEXT            vkCmdBeginQueryIndexedEXT            = 0;\n      PFN_vkCmdEndQueryIndexedEXT              vkCmdEndQueryIndexedEXT              = 0;\n      PFN_vkCmdDrawIndirectByteCountEXT        vkCmdDrawIndirectByteCountEXT        = 0;\n\n      //=== VK_NVX_binary_import ===\n      PFN_vkCreateCuModuleNVX    vkCreateCuModuleNVX    = 0;\n      PFN_vkCreateCuFunctionNVX  vkCreateCuFunctionNVX  = 0;\n      PFN_vkDestroyCuModuleNVX   vkDestroyCuModuleNVX   = 0;\n      PFN_vkDestroyCuFunctionNVX vkDestroyCuFunctionNVX = 0;\n      PFN_vkCmdCuLaunchKernelNVX vkCmdCuLaunchKernelNVX = 0;\n\n      //=== VK_NVX_image_view_handle ===\n      PFN_vkGetImageViewHandleNVX   vkGetImageViewHandleNVX   = 0;\n      PFN_vkGetImageViewHandle64NVX vkGetImageViewHandle64NVX = 0;\n      PFN_vkGetImageViewAddressNVX  vkGetImageViewAddressNVX  = 0;\n\n      //=== VK_AMD_draw_indirect_count ===\n      PFN_vkCmdDrawIndirectCountAMD        vkCmdDrawIndirectCountAMD        = 0;\n      PFN_vkCmdDrawIndexedIndirectCountAMD vkCmdDrawIndexedIndirectCountAMD = 0;\n\n      //=== VK_AMD_shader_info ===\n      PFN_vkGetShaderInfoAMD vkGetShaderInfoAMD = 0;\n\n      //=== VK_KHR_dynamic_rendering ===\n      PFN_vkCmdBeginRenderingKHR vkCmdBeginRenderingKHR = 0;\n      PFN_vkCmdEndRenderingKHR   vkCmdEndRenderingKHR   = 0;\n\n#if defined( VK_USE_PLATFORM_GGP )\n      //=== VK_GGP_stream_descriptor_surface ===\n      PFN_vkCreateStreamDescriptorSurfaceGGP vkCreateStreamDescriptorSurfaceGGP = 0;\n#else\n      PFN_dummy vkCreateStreamDescriptorSurfaceGGP_placeholder                = 0;\n#endif /*VK_USE_PLATFORM_GGP*/\n\n      //=== VK_NV_external_memory_capabilities ===\n      PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV vkGetPhysicalDeviceExternalImageFormatPropertiesNV = 0;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_NV_external_memory_win32 ===\n      PFN_vkGetMemoryWin32HandleNV vkGetMemoryWin32HandleNV = 0;\n#else\n      PFN_dummy vkGetMemoryWin32HandleNV_placeholder                          = 0;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n      //=== VK_KHR_get_physical_device_properties2 ===\n      PFN_vkGetPhysicalDeviceFeatures2KHR                    vkGetPhysicalDeviceFeatures2KHR                    = 0;\n      PFN_vkGetPhysicalDeviceProperties2KHR                  vkGetPhysicalDeviceProperties2KHR                  = 0;\n      PFN_vkGetPhysicalDeviceFormatProperties2KHR            vkGetPhysicalDeviceFormatProperties2KHR            = 0;\n      PFN_vkGetPhysicalDeviceImageFormatProperties2KHR       vkGetPhysicalDeviceImageFormatProperties2KHR       = 0;\n      PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR       vkGetPhysicalDeviceQueueFamilyProperties2KHR       = 0;\n      PFN_vkGetPhysicalDeviceMemoryProperties2KHR            vkGetPhysicalDeviceMemoryProperties2KHR            = 0;\n      PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR vkGetPhysicalDeviceSparseImageFormatProperties2KHR = 0;\n\n      //=== VK_KHR_device_group ===\n      PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR vkGetDeviceGroupPeerMemoryFeaturesKHR = 0;\n      PFN_vkCmdSetDeviceMaskKHR                 vkCmdSetDeviceMaskKHR                 = 0;\n      PFN_vkCmdDispatchBaseKHR                  vkCmdDispatchBaseKHR                  = 0;\n\n#if defined( VK_USE_PLATFORM_VI_NN )\n      //=== VK_NN_vi_surface ===\n      PFN_vkCreateViSurfaceNN vkCreateViSurfaceNN = 0;\n#else\n      PFN_dummy vkCreateViSurfaceNN_placeholder                               = 0;\n#endif /*VK_USE_PLATFORM_VI_NN*/\n\n      //=== VK_KHR_maintenance1 ===\n      PFN_vkTrimCommandPoolKHR vkTrimCommandPoolKHR = 0;\n\n      //=== VK_KHR_device_group_creation ===\n      PFN_vkEnumeratePhysicalDeviceGroupsKHR vkEnumeratePhysicalDeviceGroupsKHR = 0;\n\n      //=== VK_KHR_external_memory_capabilities ===\n      PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR vkGetPhysicalDeviceExternalBufferPropertiesKHR = 0;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_KHR_external_memory_win32 ===\n      PFN_vkGetMemoryWin32HandleKHR           vkGetMemoryWin32HandleKHR           = 0;\n      PFN_vkGetMemoryWin32HandlePropertiesKHR vkGetMemoryWin32HandlePropertiesKHR = 0;\n#else\n      PFN_dummy vkGetMemoryWin32HandleKHR_placeholder                         = 0;\n      PFN_dummy vkGetMemoryWin32HandlePropertiesKHR_placeholder               = 0;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n      //=== VK_KHR_external_memory_fd ===\n      PFN_vkGetMemoryFdKHR           vkGetMemoryFdKHR           = 0;\n      PFN_vkGetMemoryFdPropertiesKHR vkGetMemoryFdPropertiesKHR = 0;\n\n      //=== VK_KHR_external_semaphore_capabilities ===\n      PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR vkGetPhysicalDeviceExternalSemaphorePropertiesKHR = 0;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_KHR_external_semaphore_win32 ===\n      PFN_vkImportSemaphoreWin32HandleKHR vkImportSemaphoreWin32HandleKHR = 0;\n      PFN_vkGetSemaphoreWin32HandleKHR    vkGetSemaphoreWin32HandleKHR    = 0;\n#else\n      PFN_dummy vkImportSemaphoreWin32HandleKHR_placeholder                   = 0;\n      PFN_dummy vkGetSemaphoreWin32HandleKHR_placeholder                      = 0;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n      //=== VK_KHR_external_semaphore_fd ===\n      PFN_vkImportSemaphoreFdKHR vkImportSemaphoreFdKHR = 0;\n      PFN_vkGetSemaphoreFdKHR    vkGetSemaphoreFdKHR    = 0;\n\n      //=== VK_KHR_push_descriptor ===\n      PFN_vkCmdPushDescriptorSetKHR             vkCmdPushDescriptorSetKHR             = 0;\n      PFN_vkCmdPushDescriptorSetWithTemplateKHR vkCmdPushDescriptorSetWithTemplateKHR = 0;\n\n      //=== VK_EXT_conditional_rendering ===\n      PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT = 0;\n      PFN_vkCmdEndConditionalRenderingEXT   vkCmdEndConditionalRenderingEXT   = 0;\n\n      //=== VK_KHR_descriptor_update_template ===\n      PFN_vkCreateDescriptorUpdateTemplateKHR  vkCreateDescriptorUpdateTemplateKHR  = 0;\n      PFN_vkDestroyDescriptorUpdateTemplateKHR vkDestroyDescriptorUpdateTemplateKHR = 0;\n      PFN_vkUpdateDescriptorSetWithTemplateKHR vkUpdateDescriptorSetWithTemplateKHR = 0;\n\n      //=== VK_NV_clip_space_w_scaling ===\n      PFN_vkCmdSetViewportWScalingNV vkCmdSetViewportWScalingNV = 0;\n\n      //=== VK_EXT_direct_mode_display ===\n      PFN_vkReleaseDisplayEXT vkReleaseDisplayEXT = 0;\n\n#if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )\n      //=== VK_EXT_acquire_xlib_display ===\n      PFN_vkAcquireXlibDisplayEXT    vkAcquireXlibDisplayEXT    = 0;\n      PFN_vkGetRandROutputDisplayEXT vkGetRandROutputDisplayEXT = 0;\n#else\n      PFN_dummy vkAcquireXlibDisplayEXT_placeholder                           = 0;\n      PFN_dummy vkGetRandROutputDisplayEXT_placeholder                        = 0;\n#endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/\n\n      //=== VK_EXT_display_surface_counter ===\n      PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT vkGetPhysicalDeviceSurfaceCapabilities2EXT = 0;\n\n      //=== VK_EXT_display_control ===\n      PFN_vkDisplayPowerControlEXT  vkDisplayPowerControlEXT  = 0;\n      PFN_vkRegisterDeviceEventEXT  vkRegisterDeviceEventEXT  = 0;\n      PFN_vkRegisterDisplayEventEXT vkRegisterDisplayEventEXT = 0;\n      PFN_vkGetSwapchainCounterEXT  vkGetSwapchainCounterEXT  = 0;\n\n      //=== VK_GOOGLE_display_timing ===\n      PFN_vkGetRefreshCycleDurationGOOGLE   vkGetRefreshCycleDurationGOOGLE   = 0;\n      PFN_vkGetPastPresentationTimingGOOGLE vkGetPastPresentationTimingGOOGLE = 0;\n\n      //=== VK_EXT_discard_rectangles ===\n      PFN_vkCmdSetDiscardRectangleEXT       vkCmdSetDiscardRectangleEXT       = 0;\n      PFN_vkCmdSetDiscardRectangleEnableEXT vkCmdSetDiscardRectangleEnableEXT = 0;\n      PFN_vkCmdSetDiscardRectangleModeEXT   vkCmdSetDiscardRectangleModeEXT   = 0;\n\n      //=== VK_EXT_hdr_metadata ===\n      PFN_vkSetHdrMetadataEXT vkSetHdrMetadataEXT = 0;\n\n      //=== VK_KHR_create_renderpass2 ===\n      PFN_vkCreateRenderPass2KHR   vkCreateRenderPass2KHR   = 0;\n      PFN_vkCmdBeginRenderPass2KHR vkCmdBeginRenderPass2KHR = 0;\n      PFN_vkCmdNextSubpass2KHR     vkCmdNextSubpass2KHR     = 0;\n      PFN_vkCmdEndRenderPass2KHR   vkCmdEndRenderPass2KHR   = 0;\n\n      //=== VK_KHR_shared_presentable_image ===\n      PFN_vkGetSwapchainStatusKHR vkGetSwapchainStatusKHR = 0;\n\n      //=== VK_KHR_external_fence_capabilities ===\n      PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR vkGetPhysicalDeviceExternalFencePropertiesKHR = 0;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_KHR_external_fence_win32 ===\n      PFN_vkImportFenceWin32HandleKHR vkImportFenceWin32HandleKHR = 0;\n      PFN_vkGetFenceWin32HandleKHR    vkGetFenceWin32HandleKHR    = 0;\n#else\n      PFN_dummy vkImportFenceWin32HandleKHR_placeholder                       = 0;\n      PFN_dummy vkGetFenceWin32HandleKHR_placeholder                          = 0;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n      //=== VK_KHR_external_fence_fd ===\n      PFN_vkImportFenceFdKHR vkImportFenceFdKHR = 0;\n      PFN_vkGetFenceFdKHR    vkGetFenceFdKHR    = 0;\n\n      //=== VK_KHR_performance_query ===\n      PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR = 0;\n      PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR         vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR         = 0;\n      PFN_vkAcquireProfilingLockKHR                                       vkAcquireProfilingLockKHR                                       = 0;\n      PFN_vkReleaseProfilingLockKHR                                       vkReleaseProfilingLockKHR                                       = 0;\n\n      //=== VK_KHR_get_surface_capabilities2 ===\n      PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR vkGetPhysicalDeviceSurfaceCapabilities2KHR = 0;\n      PFN_vkGetPhysicalDeviceSurfaceFormats2KHR      vkGetPhysicalDeviceSurfaceFormats2KHR      = 0;\n\n      //=== VK_KHR_get_display_properties2 ===\n      PFN_vkGetPhysicalDeviceDisplayProperties2KHR      vkGetPhysicalDeviceDisplayProperties2KHR      = 0;\n      PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR vkGetPhysicalDeviceDisplayPlaneProperties2KHR = 0;\n      PFN_vkGetDisplayModeProperties2KHR                vkGetDisplayModeProperties2KHR                = 0;\n      PFN_vkGetDisplayPlaneCapabilities2KHR             vkGetDisplayPlaneCapabilities2KHR             = 0;\n\n#if defined( VK_USE_PLATFORM_IOS_MVK )\n      //=== VK_MVK_ios_surface ===\n      PFN_vkCreateIOSSurfaceMVK vkCreateIOSSurfaceMVK = 0;\n#else\n      PFN_dummy vkCreateIOSSurfaceMVK_placeholder                             = 0;\n#endif /*VK_USE_PLATFORM_IOS_MVK*/\n\n#if defined( VK_USE_PLATFORM_MACOS_MVK )\n      //=== VK_MVK_macos_surface ===\n      PFN_vkCreateMacOSSurfaceMVK vkCreateMacOSSurfaceMVK = 0;\n#else\n      PFN_dummy vkCreateMacOSSurfaceMVK_placeholder                           = 0;\n#endif /*VK_USE_PLATFORM_MACOS_MVK*/\n\n      //=== VK_EXT_debug_utils ===\n      PFN_vkSetDebugUtilsObjectNameEXT    vkSetDebugUtilsObjectNameEXT    = 0;\n      PFN_vkSetDebugUtilsObjectTagEXT     vkSetDebugUtilsObjectTagEXT     = 0;\n      PFN_vkQueueBeginDebugUtilsLabelEXT  vkQueueBeginDebugUtilsLabelEXT  = 0;\n      PFN_vkQueueEndDebugUtilsLabelEXT    vkQueueEndDebugUtilsLabelEXT    = 0;\n      PFN_vkQueueInsertDebugUtilsLabelEXT vkQueueInsertDebugUtilsLabelEXT = 0;\n      PFN_vkCmdBeginDebugUtilsLabelEXT    vkCmdBeginDebugUtilsLabelEXT    = 0;\n      PFN_vkCmdEndDebugUtilsLabelEXT      vkCmdEndDebugUtilsLabelEXT      = 0;\n      PFN_vkCmdInsertDebugUtilsLabelEXT   vkCmdInsertDebugUtilsLabelEXT   = 0;\n      PFN_vkCreateDebugUtilsMessengerEXT  vkCreateDebugUtilsMessengerEXT  = 0;\n      PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT = 0;\n      PFN_vkSubmitDebugUtilsMessageEXT    vkSubmitDebugUtilsMessageEXT    = 0;\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n      //=== VK_ANDROID_external_memory_android_hardware_buffer ===\n      PFN_vkGetAndroidHardwareBufferPropertiesANDROID vkGetAndroidHardwareBufferPropertiesANDROID = 0;\n      PFN_vkGetMemoryAndroidHardwareBufferANDROID     vkGetMemoryAndroidHardwareBufferANDROID     = 0;\n#else\n      PFN_dummy vkGetAndroidHardwareBufferPropertiesANDROID_placeholder       = 0;\n      PFN_dummy vkGetMemoryAndroidHardwareBufferANDROID_placeholder           = 0;\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      //=== VK_AMDX_shader_enqueue ===\n      PFN_vkCreateExecutionGraphPipelinesAMDX        vkCreateExecutionGraphPipelinesAMDX        = 0;\n      PFN_vkGetExecutionGraphPipelineScratchSizeAMDX vkGetExecutionGraphPipelineScratchSizeAMDX = 0;\n      PFN_vkGetExecutionGraphPipelineNodeIndexAMDX   vkGetExecutionGraphPipelineNodeIndexAMDX   = 0;\n      PFN_vkCmdInitializeGraphScratchMemoryAMDX      vkCmdInitializeGraphScratchMemoryAMDX      = 0;\n      PFN_vkCmdDispatchGraphAMDX                     vkCmdDispatchGraphAMDX                     = 0;\n      PFN_vkCmdDispatchGraphIndirectAMDX             vkCmdDispatchGraphIndirectAMDX             = 0;\n      PFN_vkCmdDispatchGraphIndirectCountAMDX        vkCmdDispatchGraphIndirectCountAMDX        = 0;\n#else\n      PFN_dummy vkCreateExecutionGraphPipelinesAMDX_placeholder               = 0;\n      PFN_dummy vkGetExecutionGraphPipelineScratchSizeAMDX_placeholder        = 0;\n      PFN_dummy vkGetExecutionGraphPipelineNodeIndexAMDX_placeholder          = 0;\n      PFN_dummy vkCmdInitializeGraphScratchMemoryAMDX_placeholder             = 0;\n      PFN_dummy vkCmdDispatchGraphAMDX_placeholder                            = 0;\n      PFN_dummy vkCmdDispatchGraphIndirectAMDX_placeholder                    = 0;\n      PFN_dummy vkCmdDispatchGraphIndirectCountAMDX_placeholder               = 0;\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n      //=== VK_EXT_sample_locations ===\n      PFN_vkCmdSetSampleLocationsEXT                  vkCmdSetSampleLocationsEXT                  = 0;\n      PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT vkGetPhysicalDeviceMultisamplePropertiesEXT = 0;\n\n      //=== VK_KHR_get_memory_requirements2 ===\n      PFN_vkGetImageMemoryRequirements2KHR       vkGetImageMemoryRequirements2KHR       = 0;\n      PFN_vkGetBufferMemoryRequirements2KHR      vkGetBufferMemoryRequirements2KHR      = 0;\n      PFN_vkGetImageSparseMemoryRequirements2KHR vkGetImageSparseMemoryRequirements2KHR = 0;\n\n      //=== VK_KHR_acceleration_structure ===\n      PFN_vkCreateAccelerationStructureKHR                 vkCreateAccelerationStructureKHR                 = 0;\n      PFN_vkDestroyAccelerationStructureKHR                vkDestroyAccelerationStructureKHR                = 0;\n      PFN_vkCmdBuildAccelerationStructuresKHR              vkCmdBuildAccelerationStructuresKHR              = 0;\n      PFN_vkCmdBuildAccelerationStructuresIndirectKHR      vkCmdBuildAccelerationStructuresIndirectKHR      = 0;\n      PFN_vkBuildAccelerationStructuresKHR                 vkBuildAccelerationStructuresKHR                 = 0;\n      PFN_vkCopyAccelerationStructureKHR                   vkCopyAccelerationStructureKHR                   = 0;\n      PFN_vkCopyAccelerationStructureToMemoryKHR           vkCopyAccelerationStructureToMemoryKHR           = 0;\n      PFN_vkCopyMemoryToAccelerationStructureKHR           vkCopyMemoryToAccelerationStructureKHR           = 0;\n      PFN_vkWriteAccelerationStructuresPropertiesKHR       vkWriteAccelerationStructuresPropertiesKHR       = 0;\n      PFN_vkCmdCopyAccelerationStructureKHR                vkCmdCopyAccelerationStructureKHR                = 0;\n      PFN_vkCmdCopyAccelerationStructureToMemoryKHR        vkCmdCopyAccelerationStructureToMemoryKHR        = 0;\n      PFN_vkCmdCopyMemoryToAccelerationStructureKHR        vkCmdCopyMemoryToAccelerationStructureKHR        = 0;\n      PFN_vkGetAccelerationStructureDeviceAddressKHR       vkGetAccelerationStructureDeviceAddressKHR       = 0;\n      PFN_vkCmdWriteAccelerationStructuresPropertiesKHR    vkCmdWriteAccelerationStructuresPropertiesKHR    = 0;\n      PFN_vkGetDeviceAccelerationStructureCompatibilityKHR vkGetDeviceAccelerationStructureCompatibilityKHR = 0;\n      PFN_vkGetAccelerationStructureBuildSizesKHR          vkGetAccelerationStructureBuildSizesKHR          = 0;\n\n      //=== VK_KHR_ray_tracing_pipeline ===\n      PFN_vkCmdTraceRaysKHR                                 vkCmdTraceRaysKHR                                 = 0;\n      PFN_vkCreateRayTracingPipelinesKHR                    vkCreateRayTracingPipelinesKHR                    = 0;\n      PFN_vkGetRayTracingShaderGroupHandlesKHR              vkGetRayTracingShaderGroupHandlesKHR              = 0;\n      PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR vkGetRayTracingCaptureReplayShaderGroupHandlesKHR = 0;\n      PFN_vkCmdTraceRaysIndirectKHR                         vkCmdTraceRaysIndirectKHR                         = 0;\n      PFN_vkGetRayTracingShaderGroupStackSizeKHR            vkGetRayTracingShaderGroupStackSizeKHR            = 0;\n      PFN_vkCmdSetRayTracingPipelineStackSizeKHR            vkCmdSetRayTracingPipelineStackSizeKHR            = 0;\n\n      //=== VK_KHR_sampler_ycbcr_conversion ===\n      PFN_vkCreateSamplerYcbcrConversionKHR  vkCreateSamplerYcbcrConversionKHR  = 0;\n      PFN_vkDestroySamplerYcbcrConversionKHR vkDestroySamplerYcbcrConversionKHR = 0;\n\n      //=== VK_KHR_bind_memory2 ===\n      PFN_vkBindBufferMemory2KHR vkBindBufferMemory2KHR = 0;\n      PFN_vkBindImageMemory2KHR  vkBindImageMemory2KHR  = 0;\n\n      //=== VK_EXT_image_drm_format_modifier ===\n      PFN_vkGetImageDrmFormatModifierPropertiesEXT vkGetImageDrmFormatModifierPropertiesEXT = 0;\n\n      //=== VK_EXT_validation_cache ===\n      PFN_vkCreateValidationCacheEXT  vkCreateValidationCacheEXT  = 0;\n      PFN_vkDestroyValidationCacheEXT vkDestroyValidationCacheEXT = 0;\n      PFN_vkMergeValidationCachesEXT  vkMergeValidationCachesEXT  = 0;\n      PFN_vkGetValidationCacheDataEXT vkGetValidationCacheDataEXT = 0;\n\n      //=== VK_NV_shading_rate_image ===\n      PFN_vkCmdBindShadingRateImageNV          vkCmdBindShadingRateImageNV          = 0;\n      PFN_vkCmdSetViewportShadingRatePaletteNV vkCmdSetViewportShadingRatePaletteNV = 0;\n      PFN_vkCmdSetCoarseSampleOrderNV          vkCmdSetCoarseSampleOrderNV          = 0;\n\n      //=== VK_NV_ray_tracing ===\n      PFN_vkCreateAccelerationStructureNV                vkCreateAccelerationStructureNV                = 0;\n      PFN_vkDestroyAccelerationStructureNV               vkDestroyAccelerationStructureNV               = 0;\n      PFN_vkGetAccelerationStructureMemoryRequirementsNV vkGetAccelerationStructureMemoryRequirementsNV = 0;\n      PFN_vkBindAccelerationStructureMemoryNV            vkBindAccelerationStructureMemoryNV            = 0;\n      PFN_vkCmdBuildAccelerationStructureNV              vkCmdBuildAccelerationStructureNV              = 0;\n      PFN_vkCmdCopyAccelerationStructureNV               vkCmdCopyAccelerationStructureNV               = 0;\n      PFN_vkCmdTraceRaysNV                               vkCmdTraceRaysNV                               = 0;\n      PFN_vkCreateRayTracingPipelinesNV                  vkCreateRayTracingPipelinesNV                  = 0;\n      PFN_vkGetRayTracingShaderGroupHandlesNV            vkGetRayTracingShaderGroupHandlesNV            = 0;\n      PFN_vkGetAccelerationStructureHandleNV             vkGetAccelerationStructureHandleNV             = 0;\n      PFN_vkCmdWriteAccelerationStructuresPropertiesNV   vkCmdWriteAccelerationStructuresPropertiesNV   = 0;\n      PFN_vkCompileDeferredNV                            vkCompileDeferredNV                            = 0;\n\n      //=== VK_KHR_maintenance3 ===\n      PFN_vkGetDescriptorSetLayoutSupportKHR vkGetDescriptorSetLayoutSupportKHR = 0;\n\n      //=== VK_KHR_draw_indirect_count ===\n      PFN_vkCmdDrawIndirectCountKHR        vkCmdDrawIndirectCountKHR        = 0;\n      PFN_vkCmdDrawIndexedIndirectCountKHR vkCmdDrawIndexedIndirectCountKHR = 0;\n\n      //=== VK_EXT_external_memory_host ===\n      PFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT = 0;\n\n      //=== VK_AMD_buffer_marker ===\n      PFN_vkCmdWriteBufferMarkerAMD  vkCmdWriteBufferMarkerAMD  = 0;\n      PFN_vkCmdWriteBufferMarker2AMD vkCmdWriteBufferMarker2AMD = 0;\n\n      //=== VK_EXT_calibrated_timestamps ===\n      PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT vkGetPhysicalDeviceCalibrateableTimeDomainsEXT = 0;\n      PFN_vkGetCalibratedTimestampsEXT                   vkGetCalibratedTimestampsEXT                   = 0;\n\n      //=== VK_NV_mesh_shader ===\n      PFN_vkCmdDrawMeshTasksNV              vkCmdDrawMeshTasksNV              = 0;\n      PFN_vkCmdDrawMeshTasksIndirectNV      vkCmdDrawMeshTasksIndirectNV      = 0;\n      PFN_vkCmdDrawMeshTasksIndirectCountNV vkCmdDrawMeshTasksIndirectCountNV = 0;\n\n      //=== VK_NV_scissor_exclusive ===\n      PFN_vkCmdSetExclusiveScissorEnableNV vkCmdSetExclusiveScissorEnableNV = 0;\n      PFN_vkCmdSetExclusiveScissorNV       vkCmdSetExclusiveScissorNV       = 0;\n\n      //=== VK_NV_device_diagnostic_checkpoints ===\n      PFN_vkCmdSetCheckpointNV        vkCmdSetCheckpointNV        = 0;\n      PFN_vkGetQueueCheckpointDataNV  vkGetQueueCheckpointDataNV  = 0;\n      PFN_vkGetQueueCheckpointData2NV vkGetQueueCheckpointData2NV = 0;\n\n      //=== VK_KHR_timeline_semaphore ===\n      PFN_vkGetSemaphoreCounterValueKHR vkGetSemaphoreCounterValueKHR = 0;\n      PFN_vkWaitSemaphoresKHR           vkWaitSemaphoresKHR           = 0;\n      PFN_vkSignalSemaphoreKHR          vkSignalSemaphoreKHR          = 0;\n\n      //=== VK_INTEL_performance_query ===\n      PFN_vkInitializePerformanceApiINTEL         vkInitializePerformanceApiINTEL         = 0;\n      PFN_vkUninitializePerformanceApiINTEL       vkUninitializePerformanceApiINTEL       = 0;\n      PFN_vkCmdSetPerformanceMarkerINTEL          vkCmdSetPerformanceMarkerINTEL          = 0;\n      PFN_vkCmdSetPerformanceStreamMarkerINTEL    vkCmdSetPerformanceStreamMarkerINTEL    = 0;\n      PFN_vkCmdSetPerformanceOverrideINTEL        vkCmdSetPerformanceOverrideINTEL        = 0;\n      PFN_vkAcquirePerformanceConfigurationINTEL  vkAcquirePerformanceConfigurationINTEL  = 0;\n      PFN_vkReleasePerformanceConfigurationINTEL  vkReleasePerformanceConfigurationINTEL  = 0;\n      PFN_vkQueueSetPerformanceConfigurationINTEL vkQueueSetPerformanceConfigurationINTEL = 0;\n      PFN_vkGetPerformanceParameterINTEL          vkGetPerformanceParameterINTEL          = 0;\n\n      //=== VK_AMD_display_native_hdr ===\n      PFN_vkSetLocalDimmingAMD vkSetLocalDimmingAMD = 0;\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n      //=== VK_FUCHSIA_imagepipe_surface ===\n      PFN_vkCreateImagePipeSurfaceFUCHSIA vkCreateImagePipeSurfaceFUCHSIA = 0;\n#else\n      PFN_dummy vkCreateImagePipeSurfaceFUCHSIA_placeholder                   = 0;\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n      //=== VK_EXT_metal_surface ===\n      PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT = 0;\n#else\n      PFN_dummy vkCreateMetalSurfaceEXT_placeholder                           = 0;\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n      //=== VK_KHR_fragment_shading_rate ===\n      PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR vkGetPhysicalDeviceFragmentShadingRatesKHR = 0;\n      PFN_vkCmdSetFragmentShadingRateKHR             vkCmdSetFragmentShadingRateKHR             = 0;\n\n      //=== VK_KHR_dynamic_rendering_local_read ===\n      PFN_vkCmdSetRenderingAttachmentLocationsKHR    vkCmdSetRenderingAttachmentLocationsKHR    = 0;\n      PFN_vkCmdSetRenderingInputAttachmentIndicesKHR vkCmdSetRenderingInputAttachmentIndicesKHR = 0;\n\n      //=== VK_EXT_buffer_device_address ===\n      PFN_vkGetBufferDeviceAddressEXT vkGetBufferDeviceAddressEXT = 0;\n\n      //=== VK_EXT_tooling_info ===\n      PFN_vkGetPhysicalDeviceToolPropertiesEXT vkGetPhysicalDeviceToolPropertiesEXT = 0;\n\n      //=== VK_KHR_present_wait ===\n      PFN_vkWaitForPresentKHR vkWaitForPresentKHR = 0;\n\n      //=== VK_NV_cooperative_matrix ===\n      PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV vkGetPhysicalDeviceCooperativeMatrixPropertiesNV = 0;\n\n      //=== VK_NV_coverage_reduction_mode ===\n      PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV = 0;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_EXT_full_screen_exclusive ===\n      PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT vkGetPhysicalDeviceSurfacePresentModes2EXT = 0;\n      PFN_vkAcquireFullScreenExclusiveModeEXT        vkAcquireFullScreenExclusiveModeEXT        = 0;\n      PFN_vkReleaseFullScreenExclusiveModeEXT        vkReleaseFullScreenExclusiveModeEXT        = 0;\n      PFN_vkGetDeviceGroupSurfacePresentModes2EXT    vkGetDeviceGroupSurfacePresentModes2EXT    = 0;\n#else\n      PFN_dummy vkGetPhysicalDeviceSurfacePresentModes2EXT_placeholder        = 0;\n      PFN_dummy vkAcquireFullScreenExclusiveModeEXT_placeholder               = 0;\n      PFN_dummy vkReleaseFullScreenExclusiveModeEXT_placeholder               = 0;\n      PFN_dummy vkGetDeviceGroupSurfacePresentModes2EXT_placeholder           = 0;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n      //=== VK_EXT_headless_surface ===\n      PFN_vkCreateHeadlessSurfaceEXT vkCreateHeadlessSurfaceEXT = 0;\n\n      //=== VK_KHR_buffer_device_address ===\n      PFN_vkGetBufferDeviceAddressKHR              vkGetBufferDeviceAddressKHR              = 0;\n      PFN_vkGetBufferOpaqueCaptureAddressKHR       vkGetBufferOpaqueCaptureAddressKHR       = 0;\n      PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR vkGetDeviceMemoryOpaqueCaptureAddressKHR = 0;\n\n      //=== VK_EXT_line_rasterization ===\n      PFN_vkCmdSetLineStippleEXT vkCmdSetLineStippleEXT = 0;\n\n      //=== VK_EXT_host_query_reset ===\n      PFN_vkResetQueryPoolEXT vkResetQueryPoolEXT = 0;\n\n      //=== VK_EXT_extended_dynamic_state ===\n      PFN_vkCmdSetCullModeEXT              vkCmdSetCullModeEXT              = 0;\n      PFN_vkCmdSetFrontFaceEXT             vkCmdSetFrontFaceEXT             = 0;\n      PFN_vkCmdSetPrimitiveTopologyEXT     vkCmdSetPrimitiveTopologyEXT     = 0;\n      PFN_vkCmdSetViewportWithCountEXT     vkCmdSetViewportWithCountEXT     = 0;\n      PFN_vkCmdSetScissorWithCountEXT      vkCmdSetScissorWithCountEXT      = 0;\n      PFN_vkCmdBindVertexBuffers2EXT       vkCmdBindVertexBuffers2EXT       = 0;\n      PFN_vkCmdSetDepthTestEnableEXT       vkCmdSetDepthTestEnableEXT       = 0;\n      PFN_vkCmdSetDepthWriteEnableEXT      vkCmdSetDepthWriteEnableEXT      = 0;\n      PFN_vkCmdSetDepthCompareOpEXT        vkCmdSetDepthCompareOpEXT        = 0;\n      PFN_vkCmdSetDepthBoundsTestEnableEXT vkCmdSetDepthBoundsTestEnableEXT = 0;\n      PFN_vkCmdSetStencilTestEnableEXT     vkCmdSetStencilTestEnableEXT     = 0;\n      PFN_vkCmdSetStencilOpEXT             vkCmdSetStencilOpEXT             = 0;\n\n      //=== VK_KHR_deferred_host_operations ===\n      PFN_vkCreateDeferredOperationKHR            vkCreateDeferredOperationKHR            = 0;\n      PFN_vkDestroyDeferredOperationKHR           vkDestroyDeferredOperationKHR           = 0;\n      PFN_vkGetDeferredOperationMaxConcurrencyKHR vkGetDeferredOperationMaxConcurrencyKHR = 0;\n      PFN_vkGetDeferredOperationResultKHR         vkGetDeferredOperationResultKHR         = 0;\n      PFN_vkDeferredOperationJoinKHR              vkDeferredOperationJoinKHR              = 0;\n\n      //=== VK_KHR_pipeline_executable_properties ===\n      PFN_vkGetPipelineExecutablePropertiesKHR              vkGetPipelineExecutablePropertiesKHR              = 0;\n      PFN_vkGetPipelineExecutableStatisticsKHR              vkGetPipelineExecutableStatisticsKHR              = 0;\n      PFN_vkGetPipelineExecutableInternalRepresentationsKHR vkGetPipelineExecutableInternalRepresentationsKHR = 0;\n\n      //=== VK_EXT_host_image_copy ===\n      PFN_vkCopyMemoryToImageEXT          vkCopyMemoryToImageEXT          = 0;\n      PFN_vkCopyImageToMemoryEXT          vkCopyImageToMemoryEXT          = 0;\n      PFN_vkCopyImageToImageEXT           vkCopyImageToImageEXT           = 0;\n      PFN_vkTransitionImageLayoutEXT      vkTransitionImageLayoutEXT      = 0;\n      PFN_vkGetImageSubresourceLayout2EXT vkGetImageSubresourceLayout2EXT = 0;\n\n      //=== VK_KHR_map_memory2 ===\n      PFN_vkMapMemory2KHR   vkMapMemory2KHR   = 0;\n      PFN_vkUnmapMemory2KHR vkUnmapMemory2KHR = 0;\n\n      //=== VK_EXT_swapchain_maintenance1 ===\n      PFN_vkReleaseSwapchainImagesEXT vkReleaseSwapchainImagesEXT = 0;\n\n      //=== VK_NV_device_generated_commands ===\n      PFN_vkGetGeneratedCommandsMemoryRequirementsNV vkGetGeneratedCommandsMemoryRequirementsNV = 0;\n      PFN_vkCmdPreprocessGeneratedCommandsNV         vkCmdPreprocessGeneratedCommandsNV         = 0;\n      PFN_vkCmdExecuteGeneratedCommandsNV            vkCmdExecuteGeneratedCommandsNV            = 0;\n      PFN_vkCmdBindPipelineShaderGroupNV             vkCmdBindPipelineShaderGroupNV             = 0;\n      PFN_vkCreateIndirectCommandsLayoutNV           vkCreateIndirectCommandsLayoutNV           = 0;\n      PFN_vkDestroyIndirectCommandsLayoutNV          vkDestroyIndirectCommandsLayoutNV          = 0;\n\n      //=== VK_EXT_depth_bias_control ===\n      PFN_vkCmdSetDepthBias2EXT vkCmdSetDepthBias2EXT = 0;\n\n      //=== VK_EXT_acquire_drm_display ===\n      PFN_vkAcquireDrmDisplayEXT vkAcquireDrmDisplayEXT = 0;\n      PFN_vkGetDrmDisplayEXT     vkGetDrmDisplayEXT     = 0;\n\n      //=== VK_EXT_private_data ===\n      PFN_vkCreatePrivateDataSlotEXT  vkCreatePrivateDataSlotEXT  = 0;\n      PFN_vkDestroyPrivateDataSlotEXT vkDestroyPrivateDataSlotEXT = 0;\n      PFN_vkSetPrivateDataEXT         vkSetPrivateDataEXT         = 0;\n      PFN_vkGetPrivateDataEXT         vkGetPrivateDataEXT         = 0;\n\n      //=== VK_KHR_video_encode_queue ===\n      PFN_vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR = 0;\n      PFN_vkGetEncodedVideoSessionParametersKHR                   vkGetEncodedVideoSessionParametersKHR                   = 0;\n      PFN_vkCmdEncodeVideoKHR                                     vkCmdEncodeVideoKHR                                     = 0;\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      //=== VK_NV_cuda_kernel_launch ===\n      PFN_vkCreateCudaModuleNV    vkCreateCudaModuleNV    = 0;\n      PFN_vkGetCudaModuleCacheNV  vkGetCudaModuleCacheNV  = 0;\n      PFN_vkCreateCudaFunctionNV  vkCreateCudaFunctionNV  = 0;\n      PFN_vkDestroyCudaModuleNV   vkDestroyCudaModuleNV   = 0;\n      PFN_vkDestroyCudaFunctionNV vkDestroyCudaFunctionNV = 0;\n      PFN_vkCmdCudaLaunchKernelNV vkCmdCudaLaunchKernelNV = 0;\n#else\n      PFN_dummy vkCreateCudaModuleNV_placeholder                              = 0;\n      PFN_dummy vkGetCudaModuleCacheNV_placeholder                            = 0;\n      PFN_dummy vkCreateCudaFunctionNV_placeholder                            = 0;\n      PFN_dummy vkDestroyCudaModuleNV_placeholder                             = 0;\n      PFN_dummy vkDestroyCudaFunctionNV_placeholder                           = 0;\n      PFN_dummy vkCmdCudaLaunchKernelNV_placeholder                           = 0;\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n      //=== VK_EXT_metal_objects ===\n      PFN_vkExportMetalObjectsEXT vkExportMetalObjectsEXT = 0;\n#else\n      PFN_dummy vkExportMetalObjectsEXT_placeholder                           = 0;\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n      //=== VK_KHR_synchronization2 ===\n      PFN_vkCmdSetEvent2KHR        vkCmdSetEvent2KHR        = 0;\n      PFN_vkCmdResetEvent2KHR      vkCmdResetEvent2KHR      = 0;\n      PFN_vkCmdWaitEvents2KHR      vkCmdWaitEvents2KHR      = 0;\n      PFN_vkCmdPipelineBarrier2KHR vkCmdPipelineBarrier2KHR = 0;\n      PFN_vkCmdWriteTimestamp2KHR  vkCmdWriteTimestamp2KHR  = 0;\n      PFN_vkQueueSubmit2KHR        vkQueueSubmit2KHR        = 0;\n\n      //=== VK_EXT_descriptor_buffer ===\n      PFN_vkGetDescriptorSetLayoutSizeEXT                          vkGetDescriptorSetLayoutSizeEXT                          = 0;\n      PFN_vkGetDescriptorSetLayoutBindingOffsetEXT                 vkGetDescriptorSetLayoutBindingOffsetEXT                 = 0;\n      PFN_vkGetDescriptorEXT                                       vkGetDescriptorEXT                                       = 0;\n      PFN_vkCmdBindDescriptorBuffersEXT                            vkCmdBindDescriptorBuffersEXT                            = 0;\n      PFN_vkCmdSetDescriptorBufferOffsetsEXT                       vkCmdSetDescriptorBufferOffsetsEXT                       = 0;\n      PFN_vkCmdBindDescriptorBufferEmbeddedSamplersEXT             vkCmdBindDescriptorBufferEmbeddedSamplersEXT             = 0;\n      PFN_vkGetBufferOpaqueCaptureDescriptorDataEXT                vkGetBufferOpaqueCaptureDescriptorDataEXT                = 0;\n      PFN_vkGetImageOpaqueCaptureDescriptorDataEXT                 vkGetImageOpaqueCaptureDescriptorDataEXT                 = 0;\n      PFN_vkGetImageViewOpaqueCaptureDescriptorDataEXT             vkGetImageViewOpaqueCaptureDescriptorDataEXT             = 0;\n      PFN_vkGetSamplerOpaqueCaptureDescriptorDataEXT               vkGetSamplerOpaqueCaptureDescriptorDataEXT               = 0;\n      PFN_vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT = 0;\n\n      //=== VK_NV_fragment_shading_rate_enums ===\n      PFN_vkCmdSetFragmentShadingRateEnumNV vkCmdSetFragmentShadingRateEnumNV = 0;\n\n      //=== VK_EXT_mesh_shader ===\n      PFN_vkCmdDrawMeshTasksEXT              vkCmdDrawMeshTasksEXT              = 0;\n      PFN_vkCmdDrawMeshTasksIndirectEXT      vkCmdDrawMeshTasksIndirectEXT      = 0;\n      PFN_vkCmdDrawMeshTasksIndirectCountEXT vkCmdDrawMeshTasksIndirectCountEXT = 0;\n\n      //=== VK_KHR_copy_commands2 ===\n      PFN_vkCmdCopyBuffer2KHR        vkCmdCopyBuffer2KHR        = 0;\n      PFN_vkCmdCopyImage2KHR         vkCmdCopyImage2KHR         = 0;\n      PFN_vkCmdCopyBufferToImage2KHR vkCmdCopyBufferToImage2KHR = 0;\n      PFN_vkCmdCopyImageToBuffer2KHR vkCmdCopyImageToBuffer2KHR = 0;\n      PFN_vkCmdBlitImage2KHR         vkCmdBlitImage2KHR         = 0;\n      PFN_vkCmdResolveImage2KHR      vkCmdResolveImage2KHR      = 0;\n\n      //=== VK_EXT_device_fault ===\n      PFN_vkGetDeviceFaultInfoEXT vkGetDeviceFaultInfoEXT = 0;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_NV_acquire_winrt_display ===\n      PFN_vkAcquireWinrtDisplayNV vkAcquireWinrtDisplayNV = 0;\n      PFN_vkGetWinrtDisplayNV     vkGetWinrtDisplayNV     = 0;\n#else\n      PFN_dummy vkAcquireWinrtDisplayNV_placeholder                           = 0;\n      PFN_dummy vkGetWinrtDisplayNV_placeholder                               = 0;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n      //=== VK_EXT_directfb_surface ===\n      PFN_vkCreateDirectFBSurfaceEXT                        vkCreateDirectFBSurfaceEXT                        = 0;\n      PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT vkGetPhysicalDeviceDirectFBPresentationSupportEXT = 0;\n#else\n      PFN_dummy vkCreateDirectFBSurfaceEXT_placeholder                        = 0;\n      PFN_dummy vkGetPhysicalDeviceDirectFBPresentationSupportEXT_placeholder = 0;\n#endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n\n      //=== VK_EXT_vertex_input_dynamic_state ===\n      PFN_vkCmdSetVertexInputEXT vkCmdSetVertexInputEXT = 0;\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n      //=== VK_FUCHSIA_external_memory ===\n      PFN_vkGetMemoryZirconHandleFUCHSIA           vkGetMemoryZirconHandleFUCHSIA           = 0;\n      PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA vkGetMemoryZirconHandlePropertiesFUCHSIA = 0;\n#else\n      PFN_dummy vkGetMemoryZirconHandleFUCHSIA_placeholder                    = 0;\n      PFN_dummy vkGetMemoryZirconHandlePropertiesFUCHSIA_placeholder          = 0;\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n      //=== VK_FUCHSIA_external_semaphore ===\n      PFN_vkImportSemaphoreZirconHandleFUCHSIA vkImportSemaphoreZirconHandleFUCHSIA = 0;\n      PFN_vkGetSemaphoreZirconHandleFUCHSIA    vkGetSemaphoreZirconHandleFUCHSIA    = 0;\n#else\n      PFN_dummy vkImportSemaphoreZirconHandleFUCHSIA_placeholder              = 0;\n      PFN_dummy vkGetSemaphoreZirconHandleFUCHSIA_placeholder                 = 0;\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n      //=== VK_FUCHSIA_buffer_collection ===\n      PFN_vkCreateBufferCollectionFUCHSIA               vkCreateBufferCollectionFUCHSIA               = 0;\n      PFN_vkSetBufferCollectionImageConstraintsFUCHSIA  vkSetBufferCollectionImageConstraintsFUCHSIA  = 0;\n      PFN_vkSetBufferCollectionBufferConstraintsFUCHSIA vkSetBufferCollectionBufferConstraintsFUCHSIA = 0;\n      PFN_vkDestroyBufferCollectionFUCHSIA              vkDestroyBufferCollectionFUCHSIA              = 0;\n      PFN_vkGetBufferCollectionPropertiesFUCHSIA        vkGetBufferCollectionPropertiesFUCHSIA        = 0;\n#else\n      PFN_dummy vkCreateBufferCollectionFUCHSIA_placeholder                   = 0;\n      PFN_dummy vkSetBufferCollectionImageConstraintsFUCHSIA_placeholder      = 0;\n      PFN_dummy vkSetBufferCollectionBufferConstraintsFUCHSIA_placeholder     = 0;\n      PFN_dummy vkDestroyBufferCollectionFUCHSIA_placeholder                  = 0;\n      PFN_dummy vkGetBufferCollectionPropertiesFUCHSIA_placeholder            = 0;\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n      //=== VK_HUAWEI_subpass_shading ===\n      PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = 0;\n      PFN_vkCmdSubpassShadingHUAWEI                       vkCmdSubpassShadingHUAWEI                       = 0;\n\n      //=== VK_HUAWEI_invocation_mask ===\n      PFN_vkCmdBindInvocationMaskHUAWEI vkCmdBindInvocationMaskHUAWEI = 0;\n\n      //=== VK_NV_external_memory_rdma ===\n      PFN_vkGetMemoryRemoteAddressNV vkGetMemoryRemoteAddressNV = 0;\n\n      //=== VK_EXT_pipeline_properties ===\n      PFN_vkGetPipelinePropertiesEXT vkGetPipelinePropertiesEXT = 0;\n\n      //=== VK_EXT_extended_dynamic_state2 ===\n      PFN_vkCmdSetPatchControlPointsEXT      vkCmdSetPatchControlPointsEXT      = 0;\n      PFN_vkCmdSetRasterizerDiscardEnableEXT vkCmdSetRasterizerDiscardEnableEXT = 0;\n      PFN_vkCmdSetDepthBiasEnableEXT         vkCmdSetDepthBiasEnableEXT         = 0;\n      PFN_vkCmdSetLogicOpEXT                 vkCmdSetLogicOpEXT                 = 0;\n      PFN_vkCmdSetPrimitiveRestartEnableEXT  vkCmdSetPrimitiveRestartEnableEXT  = 0;\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n      //=== VK_QNX_screen_surface ===\n      PFN_vkCreateScreenSurfaceQNX                        vkCreateScreenSurfaceQNX                        = 0;\n      PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX vkGetPhysicalDeviceScreenPresentationSupportQNX = 0;\n#else\n      PFN_dummy vkCreateScreenSurfaceQNX_placeholder                          = 0;\n      PFN_dummy vkGetPhysicalDeviceScreenPresentationSupportQNX_placeholder   = 0;\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n      //=== VK_EXT_color_write_enable ===\n      PFN_vkCmdSetColorWriteEnableEXT vkCmdSetColorWriteEnableEXT = 0;\n\n      //=== VK_KHR_ray_tracing_maintenance1 ===\n      PFN_vkCmdTraceRaysIndirect2KHR vkCmdTraceRaysIndirect2KHR = 0;\n\n      //=== VK_EXT_multi_draw ===\n      PFN_vkCmdDrawMultiEXT        vkCmdDrawMultiEXT        = 0;\n      PFN_vkCmdDrawMultiIndexedEXT vkCmdDrawMultiIndexedEXT = 0;\n\n      //=== VK_EXT_opacity_micromap ===\n      PFN_vkCreateMicromapEXT                 vkCreateMicromapEXT                 = 0;\n      PFN_vkDestroyMicromapEXT                vkDestroyMicromapEXT                = 0;\n      PFN_vkCmdBuildMicromapsEXT              vkCmdBuildMicromapsEXT              = 0;\n      PFN_vkBuildMicromapsEXT                 vkBuildMicromapsEXT                 = 0;\n      PFN_vkCopyMicromapEXT                   vkCopyMicromapEXT                   = 0;\n      PFN_vkCopyMicromapToMemoryEXT           vkCopyMicromapToMemoryEXT           = 0;\n      PFN_vkCopyMemoryToMicromapEXT           vkCopyMemoryToMicromapEXT           = 0;\n      PFN_vkWriteMicromapsPropertiesEXT       vkWriteMicromapsPropertiesEXT       = 0;\n      PFN_vkCmdCopyMicromapEXT                vkCmdCopyMicromapEXT                = 0;\n      PFN_vkCmdCopyMicromapToMemoryEXT        vkCmdCopyMicromapToMemoryEXT        = 0;\n      PFN_vkCmdCopyMemoryToMicromapEXT        vkCmdCopyMemoryToMicromapEXT        = 0;\n      PFN_vkCmdWriteMicromapsPropertiesEXT    vkCmdWriteMicromapsPropertiesEXT    = 0;\n      PFN_vkGetDeviceMicromapCompatibilityEXT vkGetDeviceMicromapCompatibilityEXT = 0;\n      PFN_vkGetMicromapBuildSizesEXT          vkGetMicromapBuildSizesEXT          = 0;\n\n      //=== VK_HUAWEI_cluster_culling_shader ===\n      PFN_vkCmdDrawClusterHUAWEI         vkCmdDrawClusterHUAWEI         = 0;\n      PFN_vkCmdDrawClusterIndirectHUAWEI vkCmdDrawClusterIndirectHUAWEI = 0;\n\n      //=== VK_EXT_pageable_device_local_memory ===\n      PFN_vkSetDeviceMemoryPriorityEXT vkSetDeviceMemoryPriorityEXT = 0;\n\n      //=== VK_KHR_maintenance4 ===\n      PFN_vkGetDeviceBufferMemoryRequirementsKHR      vkGetDeviceBufferMemoryRequirementsKHR      = 0;\n      PFN_vkGetDeviceImageMemoryRequirementsKHR       vkGetDeviceImageMemoryRequirementsKHR       = 0;\n      PFN_vkGetDeviceImageSparseMemoryRequirementsKHR vkGetDeviceImageSparseMemoryRequirementsKHR = 0;\n\n      //=== VK_VALVE_descriptor_set_host_mapping ===\n      PFN_vkGetDescriptorSetLayoutHostMappingInfoVALVE vkGetDescriptorSetLayoutHostMappingInfoVALVE = 0;\n      PFN_vkGetDescriptorSetHostMappingVALVE           vkGetDescriptorSetHostMappingVALVE           = 0;\n\n      //=== VK_NV_copy_memory_indirect ===\n      PFN_vkCmdCopyMemoryIndirectNV        vkCmdCopyMemoryIndirectNV        = 0;\n      PFN_vkCmdCopyMemoryToImageIndirectNV vkCmdCopyMemoryToImageIndirectNV = 0;\n\n      //=== VK_NV_memory_decompression ===\n      PFN_vkCmdDecompressMemoryNV              vkCmdDecompressMemoryNV              = 0;\n      PFN_vkCmdDecompressMemoryIndirectCountNV vkCmdDecompressMemoryIndirectCountNV = 0;\n\n      //=== VK_NV_device_generated_commands_compute ===\n      PFN_vkGetPipelineIndirectMemoryRequirementsNV vkGetPipelineIndirectMemoryRequirementsNV = 0;\n      PFN_vkCmdUpdatePipelineIndirectBufferNV       vkCmdUpdatePipelineIndirectBufferNV       = 0;\n      PFN_vkGetPipelineIndirectDeviceAddressNV      vkGetPipelineIndirectDeviceAddressNV      = 0;\n\n      //=== VK_EXT_extended_dynamic_state3 ===\n      PFN_vkCmdSetDepthClampEnableEXT                 vkCmdSetDepthClampEnableEXT                 = 0;\n      PFN_vkCmdSetPolygonModeEXT                      vkCmdSetPolygonModeEXT                      = 0;\n      PFN_vkCmdSetRasterizationSamplesEXT             vkCmdSetRasterizationSamplesEXT             = 0;\n      PFN_vkCmdSetSampleMaskEXT                       vkCmdSetSampleMaskEXT                       = 0;\n      PFN_vkCmdSetAlphaToCoverageEnableEXT            vkCmdSetAlphaToCoverageEnableEXT            = 0;\n      PFN_vkCmdSetAlphaToOneEnableEXT                 vkCmdSetAlphaToOneEnableEXT                 = 0;\n      PFN_vkCmdSetLogicOpEnableEXT                    vkCmdSetLogicOpEnableEXT                    = 0;\n      PFN_vkCmdSetColorBlendEnableEXT                 vkCmdSetColorBlendEnableEXT                 = 0;\n      PFN_vkCmdSetColorBlendEquationEXT               vkCmdSetColorBlendEquationEXT               = 0;\n      PFN_vkCmdSetColorWriteMaskEXT                   vkCmdSetColorWriteMaskEXT                   = 0;\n      PFN_vkCmdSetTessellationDomainOriginEXT         vkCmdSetTessellationDomainOriginEXT         = 0;\n      PFN_vkCmdSetRasterizationStreamEXT              vkCmdSetRasterizationStreamEXT              = 0;\n      PFN_vkCmdSetConservativeRasterizationModeEXT    vkCmdSetConservativeRasterizationModeEXT    = 0;\n      PFN_vkCmdSetExtraPrimitiveOverestimationSizeEXT vkCmdSetExtraPrimitiveOverestimationSizeEXT = 0;\n      PFN_vkCmdSetDepthClipEnableEXT                  vkCmdSetDepthClipEnableEXT                  = 0;\n      PFN_vkCmdSetSampleLocationsEnableEXT            vkCmdSetSampleLocationsEnableEXT            = 0;\n      PFN_vkCmdSetColorBlendAdvancedEXT               vkCmdSetColorBlendAdvancedEXT               = 0;\n      PFN_vkCmdSetProvokingVertexModeEXT              vkCmdSetProvokingVertexModeEXT              = 0;\n      PFN_vkCmdSetLineRasterizationModeEXT            vkCmdSetLineRasterizationModeEXT            = 0;\n      PFN_vkCmdSetLineStippleEnableEXT                vkCmdSetLineStippleEnableEXT                = 0;\n      PFN_vkCmdSetDepthClipNegativeOneToOneEXT        vkCmdSetDepthClipNegativeOneToOneEXT        = 0;\n      PFN_vkCmdSetViewportWScalingEnableNV            vkCmdSetViewportWScalingEnableNV            = 0;\n      PFN_vkCmdSetViewportSwizzleNV                   vkCmdSetViewportSwizzleNV                   = 0;\n      PFN_vkCmdSetCoverageToColorEnableNV             vkCmdSetCoverageToColorEnableNV             = 0;\n      PFN_vkCmdSetCoverageToColorLocationNV           vkCmdSetCoverageToColorLocationNV           = 0;\n      PFN_vkCmdSetCoverageModulationModeNV            vkCmdSetCoverageModulationModeNV            = 0;\n      PFN_vkCmdSetCoverageModulationTableEnableNV     vkCmdSetCoverageModulationTableEnableNV     = 0;\n      PFN_vkCmdSetCoverageModulationTableNV           vkCmdSetCoverageModulationTableNV           = 0;\n      PFN_vkCmdSetShadingRateImageEnableNV            vkCmdSetShadingRateImageEnableNV            = 0;\n      PFN_vkCmdSetRepresentativeFragmentTestEnableNV  vkCmdSetRepresentativeFragmentTestEnableNV  = 0;\n      PFN_vkCmdSetCoverageReductionModeNV             vkCmdSetCoverageReductionModeNV             = 0;\n\n      //=== VK_EXT_shader_module_identifier ===\n      PFN_vkGetShaderModuleIdentifierEXT           vkGetShaderModuleIdentifierEXT           = 0;\n      PFN_vkGetShaderModuleCreateInfoIdentifierEXT vkGetShaderModuleCreateInfoIdentifierEXT = 0;\n\n      //=== VK_NV_optical_flow ===\n      PFN_vkGetPhysicalDeviceOpticalFlowImageFormatsNV vkGetPhysicalDeviceOpticalFlowImageFormatsNV = 0;\n      PFN_vkCreateOpticalFlowSessionNV                 vkCreateOpticalFlowSessionNV                 = 0;\n      PFN_vkDestroyOpticalFlowSessionNV                vkDestroyOpticalFlowSessionNV                = 0;\n      PFN_vkBindOpticalFlowSessionImageNV              vkBindOpticalFlowSessionImageNV              = 0;\n      PFN_vkCmdOpticalFlowExecuteNV                    vkCmdOpticalFlowExecuteNV                    = 0;\n\n      //=== VK_KHR_maintenance5 ===\n      PFN_vkCmdBindIndexBuffer2KHR             vkCmdBindIndexBuffer2KHR             = 0;\n      PFN_vkGetRenderingAreaGranularityKHR     vkGetRenderingAreaGranularityKHR     = 0;\n      PFN_vkGetDeviceImageSubresourceLayoutKHR vkGetDeviceImageSubresourceLayoutKHR = 0;\n      PFN_vkGetImageSubresourceLayout2KHR      vkGetImageSubresourceLayout2KHR      = 0;\n\n      //=== VK_AMD_anti_lag ===\n      PFN_vkAntiLagUpdateAMD vkAntiLagUpdateAMD = 0;\n\n      //=== VK_EXT_shader_object ===\n      PFN_vkCreateShadersEXT         vkCreateShadersEXT         = 0;\n      PFN_vkDestroyShaderEXT         vkDestroyShaderEXT         = 0;\n      PFN_vkGetShaderBinaryDataEXT   vkGetShaderBinaryDataEXT   = 0;\n      PFN_vkCmdBindShadersEXT        vkCmdBindShadersEXT        = 0;\n      PFN_vkCmdSetDepthClampRangeEXT vkCmdSetDepthClampRangeEXT = 0;\n\n      //=== VK_KHR_pipeline_binary ===\n      PFN_vkCreatePipelineBinariesKHR      vkCreatePipelineBinariesKHR      = 0;\n      PFN_vkDestroyPipelineBinaryKHR       vkDestroyPipelineBinaryKHR       = 0;\n      PFN_vkGetPipelineKeyKHR              vkGetPipelineKeyKHR              = 0;\n      PFN_vkGetPipelineBinaryDataKHR       vkGetPipelineBinaryDataKHR       = 0;\n      PFN_vkReleaseCapturedPipelineDataKHR vkReleaseCapturedPipelineDataKHR = 0;\n\n      //=== VK_QCOM_tile_properties ===\n      PFN_vkGetFramebufferTilePropertiesQCOM      vkGetFramebufferTilePropertiesQCOM      = 0;\n      PFN_vkGetDynamicRenderingTilePropertiesQCOM vkGetDynamicRenderingTilePropertiesQCOM = 0;\n\n      //=== VK_NV_cooperative_vector ===\n      PFN_vkGetPhysicalDeviceCooperativeVectorPropertiesNV vkGetPhysicalDeviceCooperativeVectorPropertiesNV = 0;\n      PFN_vkConvertCooperativeVectorMatrixNV               vkConvertCooperativeVectorMatrixNV               = 0;\n      PFN_vkCmdConvertCooperativeVectorMatrixNV            vkCmdConvertCooperativeVectorMatrixNV            = 0;\n\n      //=== VK_NV_low_latency2 ===\n      PFN_vkSetLatencySleepModeNV  vkSetLatencySleepModeNV  = 0;\n      PFN_vkLatencySleepNV         vkLatencySleepNV         = 0;\n      PFN_vkSetLatencyMarkerNV     vkSetLatencyMarkerNV     = 0;\n      PFN_vkGetLatencyTimingsNV    vkGetLatencyTimingsNV    = 0;\n      PFN_vkQueueNotifyOutOfBandNV vkQueueNotifyOutOfBandNV = 0;\n\n      //=== VK_KHR_cooperative_matrix ===\n      PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR = 0;\n\n      //=== VK_EXT_attachment_feedback_loop_dynamic_state ===\n      PFN_vkCmdSetAttachmentFeedbackLoopEnableEXT vkCmdSetAttachmentFeedbackLoopEnableEXT = 0;\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n      //=== VK_QNX_external_memory_screen_buffer ===\n      PFN_vkGetScreenBufferPropertiesQNX vkGetScreenBufferPropertiesQNX = 0;\n#else\n      PFN_dummy vkGetScreenBufferPropertiesQNX_placeholder                    = 0;\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n      //=== VK_KHR_line_rasterization ===\n      PFN_vkCmdSetLineStippleKHR vkCmdSetLineStippleKHR = 0;\n\n      //=== VK_KHR_calibrated_timestamps ===\n      PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsKHR vkGetPhysicalDeviceCalibrateableTimeDomainsKHR = 0;\n      PFN_vkGetCalibratedTimestampsKHR                   vkGetCalibratedTimestampsKHR                   = 0;\n\n      //=== VK_KHR_maintenance6 ===\n      PFN_vkCmdBindDescriptorSets2KHR                   vkCmdBindDescriptorSets2KHR                   = 0;\n      PFN_vkCmdPushConstants2KHR                        vkCmdPushConstants2KHR                        = 0;\n      PFN_vkCmdPushDescriptorSet2KHR                    vkCmdPushDescriptorSet2KHR                    = 0;\n      PFN_vkCmdPushDescriptorSetWithTemplate2KHR        vkCmdPushDescriptorSetWithTemplate2KHR        = 0;\n      PFN_vkCmdSetDescriptorBufferOffsets2EXT           vkCmdSetDescriptorBufferOffsets2EXT           = 0;\n      PFN_vkCmdBindDescriptorBufferEmbeddedSamplers2EXT vkCmdBindDescriptorBufferEmbeddedSamplers2EXT = 0;\n\n      //=== VK_NV_cluster_acceleration_structure ===\n      PFN_vkGetClusterAccelerationStructureBuildSizesNV    vkGetClusterAccelerationStructureBuildSizesNV    = 0;\n      PFN_vkCmdBuildClusterAccelerationStructureIndirectNV vkCmdBuildClusterAccelerationStructureIndirectNV = 0;\n\n      //=== VK_NV_partitioned_acceleration_structure ===\n      PFN_vkGetPartitionedAccelerationStructuresBuildSizesNV vkGetPartitionedAccelerationStructuresBuildSizesNV = 0;\n      PFN_vkCmdBuildPartitionedAccelerationStructuresNV      vkCmdBuildPartitionedAccelerationStructuresNV      = 0;\n\n      //=== VK_EXT_device_generated_commands ===\n      PFN_vkGetGeneratedCommandsMemoryRequirementsEXT vkGetGeneratedCommandsMemoryRequirementsEXT = 0;\n      PFN_vkCmdPreprocessGeneratedCommandsEXT         vkCmdPreprocessGeneratedCommandsEXT         = 0;\n      PFN_vkCmdExecuteGeneratedCommandsEXT            vkCmdExecuteGeneratedCommandsEXT            = 0;\n      PFN_vkCreateIndirectCommandsLayoutEXT           vkCreateIndirectCommandsLayoutEXT           = 0;\n      PFN_vkDestroyIndirectCommandsLayoutEXT          vkDestroyIndirectCommandsLayoutEXT          = 0;\n      PFN_vkCreateIndirectExecutionSetEXT             vkCreateIndirectExecutionSetEXT             = 0;\n      PFN_vkDestroyIndirectExecutionSetEXT            vkDestroyIndirectExecutionSetEXT            = 0;\n      PFN_vkUpdateIndirectExecutionSetPipelineEXT     vkUpdateIndirectExecutionSetPipelineEXT     = 0;\n      PFN_vkUpdateIndirectExecutionSetShaderEXT       vkUpdateIndirectExecutionSetShaderEXT       = 0;\n\n      //=== VK_NV_cooperative_matrix2 ===\n      PFN_vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV = 0;\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n      //=== VK_EXT_external_memory_metal ===\n      PFN_vkGetMemoryMetalHandleEXT           vkGetMemoryMetalHandleEXT           = 0;\n      PFN_vkGetMemoryMetalHandlePropertiesEXT vkGetMemoryMetalHandlePropertiesEXT = 0;\n#else\n      PFN_dummy vkGetMemoryMetalHandleEXT_placeholder                         = 0;\n      PFN_dummy vkGetMemoryMetalHandlePropertiesEXT_placeholder               = 0;\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n    public:\n      DispatchLoaderDynamic() VULKAN_HPP_NOEXCEPT                                    = default;\n      DispatchLoaderDynamic( DispatchLoaderDynamic const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n      DispatchLoaderDynamic( PFN_vkGetInstanceProcAddr getInstanceProcAddr ) VULKAN_HPP_NOEXCEPT\n      {\n        init( getInstanceProcAddr );\n      }\n\n      // This interface does not require a linked vulkan library.\n      DispatchLoaderDynamic( VkInstance                instance,\n                             PFN_vkGetInstanceProcAddr getInstanceProcAddr,\n                             VkDevice                  device            = {},\n                             PFN_vkGetDeviceProcAddr   getDeviceProcAddr = nullptr ) VULKAN_HPP_NOEXCEPT\n      {\n        init( instance, getInstanceProcAddr, device, getDeviceProcAddr );\n      }\n\n      template <typename DynamicLoader\n#if VULKAN_HPP_ENABLE_DYNAMIC_LOADER_TOOL\n                = VULKAN_HPP_NAMESPACE::detail::DynamicLoader\n#endif\n                >\n      void init()\n      {\n        static DynamicLoader dl;\n        init( dl );\n      }\n\n      template <typename DynamicLoader>\n      void init( DynamicLoader const & dl ) VULKAN_HPP_NOEXCEPT\n      {\n        PFN_vkGetInstanceProcAddr getInstanceProcAddr = dl.template getProcAddress<PFN_vkGetInstanceProcAddr>( \"vkGetInstanceProcAddr\" );\n        init( getInstanceProcAddr );\n      }\n\n      void init( PFN_vkGetInstanceProcAddr getInstanceProcAddr ) VULKAN_HPP_NOEXCEPT\n      {\n        VULKAN_HPP_ASSERT( getInstanceProcAddr );\n\n        vkGetInstanceProcAddr = getInstanceProcAddr;\n\n        //=== VK_VERSION_1_0 ===\n        vkCreateInstance = PFN_vkCreateInstance( vkGetInstanceProcAddr( NULL, \"vkCreateInstance\" ) );\n        vkEnumerateInstanceExtensionProperties =\n          PFN_vkEnumerateInstanceExtensionProperties( vkGetInstanceProcAddr( NULL, \"vkEnumerateInstanceExtensionProperties\" ) );\n        vkEnumerateInstanceLayerProperties = PFN_vkEnumerateInstanceLayerProperties( vkGetInstanceProcAddr( NULL, \"vkEnumerateInstanceLayerProperties\" ) );\n\n        //=== VK_VERSION_1_1 ===\n        vkEnumerateInstanceVersion = PFN_vkEnumerateInstanceVersion( vkGetInstanceProcAddr( NULL, \"vkEnumerateInstanceVersion\" ) );\n      }\n\n      // This interface does not require a linked vulkan library.\n      void init( VkInstance                instance,\n                 PFN_vkGetInstanceProcAddr getInstanceProcAddr,\n                 VkDevice                  device              = {},\n                 PFN_vkGetDeviceProcAddr /*getDeviceProcAddr*/ = nullptr ) VULKAN_HPP_NOEXCEPT\n      {\n        VULKAN_HPP_ASSERT( instance && getInstanceProcAddr );\n        vkGetInstanceProcAddr = getInstanceProcAddr;\n        init( VULKAN_HPP_NAMESPACE::Instance( instance ) );\n        if ( device )\n        {\n          init( VULKAN_HPP_NAMESPACE::Device( device ) );\n        }\n      }\n\n      void init( VULKAN_HPP_NAMESPACE::Instance instanceCpp ) VULKAN_HPP_NOEXCEPT\n      {\n        VkInstance instance = static_cast<VkInstance>( instanceCpp );\n\n        //=== VK_VERSION_1_0 ===\n        vkDestroyInstance           = PFN_vkDestroyInstance( vkGetInstanceProcAddr( instance, \"vkDestroyInstance\" ) );\n        vkEnumeratePhysicalDevices  = PFN_vkEnumeratePhysicalDevices( vkGetInstanceProcAddr( instance, \"vkEnumeratePhysicalDevices\" ) );\n        vkGetPhysicalDeviceFeatures = PFN_vkGetPhysicalDeviceFeatures( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceFeatures\" ) );\n        vkGetPhysicalDeviceFormatProperties =\n          PFN_vkGetPhysicalDeviceFormatProperties( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceFormatProperties\" ) );\n        vkGetPhysicalDeviceImageFormatProperties =\n          PFN_vkGetPhysicalDeviceImageFormatProperties( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceImageFormatProperties\" ) );\n        vkGetPhysicalDeviceProperties = PFN_vkGetPhysicalDeviceProperties( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceProperties\" ) );\n        vkGetPhysicalDeviceQueueFamilyProperties =\n          PFN_vkGetPhysicalDeviceQueueFamilyProperties( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceQueueFamilyProperties\" ) );\n        vkGetPhysicalDeviceMemoryProperties =\n          PFN_vkGetPhysicalDeviceMemoryProperties( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceMemoryProperties\" ) );\n        vkGetDeviceProcAddr = PFN_vkGetDeviceProcAddr( vkGetInstanceProcAddr( instance, \"vkGetDeviceProcAddr\" ) );\n        vkCreateDevice      = PFN_vkCreateDevice( vkGetInstanceProcAddr( instance, \"vkCreateDevice\" ) );\n        vkDestroyDevice     = PFN_vkDestroyDevice( vkGetInstanceProcAddr( instance, \"vkDestroyDevice\" ) );\n        vkEnumerateDeviceExtensionProperties =\n          PFN_vkEnumerateDeviceExtensionProperties( vkGetInstanceProcAddr( instance, \"vkEnumerateDeviceExtensionProperties\" ) );\n        vkEnumerateDeviceLayerProperties   = PFN_vkEnumerateDeviceLayerProperties( vkGetInstanceProcAddr( instance, \"vkEnumerateDeviceLayerProperties\" ) );\n        vkGetDeviceQueue                   = PFN_vkGetDeviceQueue( vkGetInstanceProcAddr( instance, \"vkGetDeviceQueue\" ) );\n        vkQueueSubmit                      = PFN_vkQueueSubmit( vkGetInstanceProcAddr( instance, \"vkQueueSubmit\" ) );\n        vkQueueWaitIdle                    = PFN_vkQueueWaitIdle( vkGetInstanceProcAddr( instance, \"vkQueueWaitIdle\" ) );\n        vkDeviceWaitIdle                   = PFN_vkDeviceWaitIdle( vkGetInstanceProcAddr( instance, \"vkDeviceWaitIdle\" ) );\n        vkAllocateMemory                   = PFN_vkAllocateMemory( vkGetInstanceProcAddr( instance, \"vkAllocateMemory\" ) );\n        vkFreeMemory                       = PFN_vkFreeMemory( vkGetInstanceProcAddr( instance, \"vkFreeMemory\" ) );\n        vkMapMemory                        = PFN_vkMapMemory( vkGetInstanceProcAddr( instance, \"vkMapMemory\" ) );\n        vkUnmapMemory                      = PFN_vkUnmapMemory( vkGetInstanceProcAddr( instance, \"vkUnmapMemory\" ) );\n        vkFlushMappedMemoryRanges          = PFN_vkFlushMappedMemoryRanges( vkGetInstanceProcAddr( instance, \"vkFlushMappedMemoryRanges\" ) );\n        vkInvalidateMappedMemoryRanges     = PFN_vkInvalidateMappedMemoryRanges( vkGetInstanceProcAddr( instance, \"vkInvalidateMappedMemoryRanges\" ) );\n        vkGetDeviceMemoryCommitment        = PFN_vkGetDeviceMemoryCommitment( vkGetInstanceProcAddr( instance, \"vkGetDeviceMemoryCommitment\" ) );\n        vkBindBufferMemory                 = PFN_vkBindBufferMemory( vkGetInstanceProcAddr( instance, \"vkBindBufferMemory\" ) );\n        vkBindImageMemory                  = PFN_vkBindImageMemory( vkGetInstanceProcAddr( instance, \"vkBindImageMemory\" ) );\n        vkGetBufferMemoryRequirements      = PFN_vkGetBufferMemoryRequirements( vkGetInstanceProcAddr( instance, \"vkGetBufferMemoryRequirements\" ) );\n        vkGetImageMemoryRequirements       = PFN_vkGetImageMemoryRequirements( vkGetInstanceProcAddr( instance, \"vkGetImageMemoryRequirements\" ) );\n        vkGetImageSparseMemoryRequirements = PFN_vkGetImageSparseMemoryRequirements( vkGetInstanceProcAddr( instance, \"vkGetImageSparseMemoryRequirements\" ) );\n        vkGetPhysicalDeviceSparseImageFormatProperties =\n          PFN_vkGetPhysicalDeviceSparseImageFormatProperties( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSparseImageFormatProperties\" ) );\n        vkQueueBindSparse            = PFN_vkQueueBindSparse( vkGetInstanceProcAddr( instance, \"vkQueueBindSparse\" ) );\n        vkCreateFence                = PFN_vkCreateFence( vkGetInstanceProcAddr( instance, \"vkCreateFence\" ) );\n        vkDestroyFence               = PFN_vkDestroyFence( vkGetInstanceProcAddr( instance, \"vkDestroyFence\" ) );\n        vkResetFences                = PFN_vkResetFences( vkGetInstanceProcAddr( instance, \"vkResetFences\" ) );\n        vkGetFenceStatus             = PFN_vkGetFenceStatus( vkGetInstanceProcAddr( instance, \"vkGetFenceStatus\" ) );\n        vkWaitForFences              = PFN_vkWaitForFences( vkGetInstanceProcAddr( instance, \"vkWaitForFences\" ) );\n        vkCreateSemaphore            = PFN_vkCreateSemaphore( vkGetInstanceProcAddr( instance, \"vkCreateSemaphore\" ) );\n        vkDestroySemaphore           = PFN_vkDestroySemaphore( vkGetInstanceProcAddr( instance, \"vkDestroySemaphore\" ) );\n        vkCreateEvent                = PFN_vkCreateEvent( vkGetInstanceProcAddr( instance, \"vkCreateEvent\" ) );\n        vkDestroyEvent               = PFN_vkDestroyEvent( vkGetInstanceProcAddr( instance, \"vkDestroyEvent\" ) );\n        vkGetEventStatus             = PFN_vkGetEventStatus( vkGetInstanceProcAddr( instance, \"vkGetEventStatus\" ) );\n        vkSetEvent                   = PFN_vkSetEvent( vkGetInstanceProcAddr( instance, \"vkSetEvent\" ) );\n        vkResetEvent                 = PFN_vkResetEvent( vkGetInstanceProcAddr( instance, \"vkResetEvent\" ) );\n        vkCreateQueryPool            = PFN_vkCreateQueryPool( vkGetInstanceProcAddr( instance, \"vkCreateQueryPool\" ) );\n        vkDestroyQueryPool           = PFN_vkDestroyQueryPool( vkGetInstanceProcAddr( instance, \"vkDestroyQueryPool\" ) );\n        vkGetQueryPoolResults        = PFN_vkGetQueryPoolResults( vkGetInstanceProcAddr( instance, \"vkGetQueryPoolResults\" ) );\n        vkCreateBuffer               = PFN_vkCreateBuffer( vkGetInstanceProcAddr( instance, \"vkCreateBuffer\" ) );\n        vkDestroyBuffer              = PFN_vkDestroyBuffer( vkGetInstanceProcAddr( instance, \"vkDestroyBuffer\" ) );\n        vkCreateBufferView           = PFN_vkCreateBufferView( vkGetInstanceProcAddr( instance, \"vkCreateBufferView\" ) );\n        vkDestroyBufferView          = PFN_vkDestroyBufferView( vkGetInstanceProcAddr( instance, \"vkDestroyBufferView\" ) );\n        vkCreateImage                = PFN_vkCreateImage( vkGetInstanceProcAddr( instance, \"vkCreateImage\" ) );\n        vkDestroyImage               = PFN_vkDestroyImage( vkGetInstanceProcAddr( instance, \"vkDestroyImage\" ) );\n        vkGetImageSubresourceLayout  = PFN_vkGetImageSubresourceLayout( vkGetInstanceProcAddr( instance, \"vkGetImageSubresourceLayout\" ) );\n        vkCreateImageView            = PFN_vkCreateImageView( vkGetInstanceProcAddr( instance, \"vkCreateImageView\" ) );\n        vkDestroyImageView           = PFN_vkDestroyImageView( vkGetInstanceProcAddr( instance, \"vkDestroyImageView\" ) );\n        vkCreateShaderModule         = PFN_vkCreateShaderModule( vkGetInstanceProcAddr( instance, \"vkCreateShaderModule\" ) );\n        vkDestroyShaderModule        = PFN_vkDestroyShaderModule( vkGetInstanceProcAddr( instance, \"vkDestroyShaderModule\" ) );\n        vkCreatePipelineCache        = PFN_vkCreatePipelineCache( vkGetInstanceProcAddr( instance, \"vkCreatePipelineCache\" ) );\n        vkDestroyPipelineCache       = PFN_vkDestroyPipelineCache( vkGetInstanceProcAddr( instance, \"vkDestroyPipelineCache\" ) );\n        vkGetPipelineCacheData       = PFN_vkGetPipelineCacheData( vkGetInstanceProcAddr( instance, \"vkGetPipelineCacheData\" ) );\n        vkMergePipelineCaches        = PFN_vkMergePipelineCaches( vkGetInstanceProcAddr( instance, \"vkMergePipelineCaches\" ) );\n        vkCreateGraphicsPipelines    = PFN_vkCreateGraphicsPipelines( vkGetInstanceProcAddr( instance, \"vkCreateGraphicsPipelines\" ) );\n        vkCreateComputePipelines     = PFN_vkCreateComputePipelines( vkGetInstanceProcAddr( instance, \"vkCreateComputePipelines\" ) );\n        vkDestroyPipeline            = PFN_vkDestroyPipeline( vkGetInstanceProcAddr( instance, \"vkDestroyPipeline\" ) );\n        vkCreatePipelineLayout       = PFN_vkCreatePipelineLayout( vkGetInstanceProcAddr( instance, \"vkCreatePipelineLayout\" ) );\n        vkDestroyPipelineLayout      = PFN_vkDestroyPipelineLayout( vkGetInstanceProcAddr( instance, \"vkDestroyPipelineLayout\" ) );\n        vkCreateSampler              = PFN_vkCreateSampler( vkGetInstanceProcAddr( instance, \"vkCreateSampler\" ) );\n        vkDestroySampler             = PFN_vkDestroySampler( vkGetInstanceProcAddr( instance, \"vkDestroySampler\" ) );\n        vkCreateDescriptorSetLayout  = PFN_vkCreateDescriptorSetLayout( vkGetInstanceProcAddr( instance, \"vkCreateDescriptorSetLayout\" ) );\n        vkDestroyDescriptorSetLayout = PFN_vkDestroyDescriptorSetLayout( vkGetInstanceProcAddr( instance, \"vkDestroyDescriptorSetLayout\" ) );\n        vkCreateDescriptorPool       = PFN_vkCreateDescriptorPool( vkGetInstanceProcAddr( instance, \"vkCreateDescriptorPool\" ) );\n        vkDestroyDescriptorPool      = PFN_vkDestroyDescriptorPool( vkGetInstanceProcAddr( instance, \"vkDestroyDescriptorPool\" ) );\n        vkResetDescriptorPool        = PFN_vkResetDescriptorPool( vkGetInstanceProcAddr( instance, \"vkResetDescriptorPool\" ) );\n        vkAllocateDescriptorSets     = PFN_vkAllocateDescriptorSets( vkGetInstanceProcAddr( instance, \"vkAllocateDescriptorSets\" ) );\n        vkFreeDescriptorSets         = PFN_vkFreeDescriptorSets( vkGetInstanceProcAddr( instance, \"vkFreeDescriptorSets\" ) );\n        vkUpdateDescriptorSets       = PFN_vkUpdateDescriptorSets( vkGetInstanceProcAddr( instance, \"vkUpdateDescriptorSets\" ) );\n        vkCreateFramebuffer          = PFN_vkCreateFramebuffer( vkGetInstanceProcAddr( instance, \"vkCreateFramebuffer\" ) );\n        vkDestroyFramebuffer         = PFN_vkDestroyFramebuffer( vkGetInstanceProcAddr( instance, \"vkDestroyFramebuffer\" ) );\n        vkCreateRenderPass           = PFN_vkCreateRenderPass( vkGetInstanceProcAddr( instance, \"vkCreateRenderPass\" ) );\n        vkDestroyRenderPass          = PFN_vkDestroyRenderPass( vkGetInstanceProcAddr( instance, \"vkDestroyRenderPass\" ) );\n        vkGetRenderAreaGranularity   = PFN_vkGetRenderAreaGranularity( vkGetInstanceProcAddr( instance, \"vkGetRenderAreaGranularity\" ) );\n        vkCreateCommandPool          = PFN_vkCreateCommandPool( vkGetInstanceProcAddr( instance, \"vkCreateCommandPool\" ) );\n        vkDestroyCommandPool         = PFN_vkDestroyCommandPool( vkGetInstanceProcAddr( instance, \"vkDestroyCommandPool\" ) );\n        vkResetCommandPool           = PFN_vkResetCommandPool( vkGetInstanceProcAddr( instance, \"vkResetCommandPool\" ) );\n        vkAllocateCommandBuffers     = PFN_vkAllocateCommandBuffers( vkGetInstanceProcAddr( instance, \"vkAllocateCommandBuffers\" ) );\n        vkFreeCommandBuffers         = PFN_vkFreeCommandBuffers( vkGetInstanceProcAddr( instance, \"vkFreeCommandBuffers\" ) );\n        vkBeginCommandBuffer         = PFN_vkBeginCommandBuffer( vkGetInstanceProcAddr( instance, \"vkBeginCommandBuffer\" ) );\n        vkEndCommandBuffer           = PFN_vkEndCommandBuffer( vkGetInstanceProcAddr( instance, \"vkEndCommandBuffer\" ) );\n        vkResetCommandBuffer         = PFN_vkResetCommandBuffer( vkGetInstanceProcAddr( instance, \"vkResetCommandBuffer\" ) );\n        vkCmdBindPipeline            = PFN_vkCmdBindPipeline( vkGetInstanceProcAddr( instance, \"vkCmdBindPipeline\" ) );\n        vkCmdSetViewport             = PFN_vkCmdSetViewport( vkGetInstanceProcAddr( instance, \"vkCmdSetViewport\" ) );\n        vkCmdSetScissor              = PFN_vkCmdSetScissor( vkGetInstanceProcAddr( instance, \"vkCmdSetScissor\" ) );\n        vkCmdSetLineWidth            = PFN_vkCmdSetLineWidth( vkGetInstanceProcAddr( instance, \"vkCmdSetLineWidth\" ) );\n        vkCmdSetDepthBias            = PFN_vkCmdSetDepthBias( vkGetInstanceProcAddr( instance, \"vkCmdSetDepthBias\" ) );\n        vkCmdSetBlendConstants       = PFN_vkCmdSetBlendConstants( vkGetInstanceProcAddr( instance, \"vkCmdSetBlendConstants\" ) );\n        vkCmdSetDepthBounds          = PFN_vkCmdSetDepthBounds( vkGetInstanceProcAddr( instance, \"vkCmdSetDepthBounds\" ) );\n        vkCmdSetStencilCompareMask   = PFN_vkCmdSetStencilCompareMask( vkGetInstanceProcAddr( instance, \"vkCmdSetStencilCompareMask\" ) );\n        vkCmdSetStencilWriteMask     = PFN_vkCmdSetStencilWriteMask( vkGetInstanceProcAddr( instance, \"vkCmdSetStencilWriteMask\" ) );\n        vkCmdSetStencilReference     = PFN_vkCmdSetStencilReference( vkGetInstanceProcAddr( instance, \"vkCmdSetStencilReference\" ) );\n        vkCmdBindDescriptorSets      = PFN_vkCmdBindDescriptorSets( vkGetInstanceProcAddr( instance, \"vkCmdBindDescriptorSets\" ) );\n        vkCmdBindIndexBuffer         = PFN_vkCmdBindIndexBuffer( vkGetInstanceProcAddr( instance, \"vkCmdBindIndexBuffer\" ) );\n        vkCmdBindVertexBuffers       = PFN_vkCmdBindVertexBuffers( vkGetInstanceProcAddr( instance, \"vkCmdBindVertexBuffers\" ) );\n        vkCmdDraw                    = PFN_vkCmdDraw( vkGetInstanceProcAddr( instance, \"vkCmdDraw\" ) );\n        vkCmdDrawIndexed             = PFN_vkCmdDrawIndexed( vkGetInstanceProcAddr( instance, \"vkCmdDrawIndexed\" ) );\n        vkCmdDrawIndirect            = PFN_vkCmdDrawIndirect( vkGetInstanceProcAddr( instance, \"vkCmdDrawIndirect\" ) );\n        vkCmdDrawIndexedIndirect     = PFN_vkCmdDrawIndexedIndirect( vkGetInstanceProcAddr( instance, \"vkCmdDrawIndexedIndirect\" ) );\n        vkCmdDispatch                = PFN_vkCmdDispatch( vkGetInstanceProcAddr( instance, \"vkCmdDispatch\" ) );\n        vkCmdDispatchIndirect        = PFN_vkCmdDispatchIndirect( vkGetInstanceProcAddr( instance, \"vkCmdDispatchIndirect\" ) );\n        vkCmdCopyBuffer              = PFN_vkCmdCopyBuffer( vkGetInstanceProcAddr( instance, \"vkCmdCopyBuffer\" ) );\n        vkCmdCopyImage               = PFN_vkCmdCopyImage( vkGetInstanceProcAddr( instance, \"vkCmdCopyImage\" ) );\n        vkCmdBlitImage               = PFN_vkCmdBlitImage( vkGetInstanceProcAddr( instance, \"vkCmdBlitImage\" ) );\n        vkCmdCopyBufferToImage       = PFN_vkCmdCopyBufferToImage( vkGetInstanceProcAddr( instance, \"vkCmdCopyBufferToImage\" ) );\n        vkCmdCopyImageToBuffer       = PFN_vkCmdCopyImageToBuffer( vkGetInstanceProcAddr( instance, \"vkCmdCopyImageToBuffer\" ) );\n        vkCmdUpdateBuffer            = PFN_vkCmdUpdateBuffer( vkGetInstanceProcAddr( instance, \"vkCmdUpdateBuffer\" ) );\n        vkCmdFillBuffer              = PFN_vkCmdFillBuffer( vkGetInstanceProcAddr( instance, \"vkCmdFillBuffer\" ) );\n        vkCmdClearColorImage         = PFN_vkCmdClearColorImage( vkGetInstanceProcAddr( instance, \"vkCmdClearColorImage\" ) );\n        vkCmdClearDepthStencilImage  = PFN_vkCmdClearDepthStencilImage( vkGetInstanceProcAddr( instance, \"vkCmdClearDepthStencilImage\" ) );\n        vkCmdClearAttachments        = PFN_vkCmdClearAttachments( vkGetInstanceProcAddr( instance, \"vkCmdClearAttachments\" ) );\n        vkCmdResolveImage            = PFN_vkCmdResolveImage( vkGetInstanceProcAddr( instance, \"vkCmdResolveImage\" ) );\n        vkCmdSetEvent                = PFN_vkCmdSetEvent( vkGetInstanceProcAddr( instance, \"vkCmdSetEvent\" ) );\n        vkCmdResetEvent              = PFN_vkCmdResetEvent( vkGetInstanceProcAddr( instance, \"vkCmdResetEvent\" ) );\n        vkCmdWaitEvents              = PFN_vkCmdWaitEvents( vkGetInstanceProcAddr( instance, \"vkCmdWaitEvents\" ) );\n        vkCmdPipelineBarrier         = PFN_vkCmdPipelineBarrier( vkGetInstanceProcAddr( instance, \"vkCmdPipelineBarrier\" ) );\n        vkCmdBeginQuery              = PFN_vkCmdBeginQuery( vkGetInstanceProcAddr( instance, \"vkCmdBeginQuery\" ) );\n        vkCmdEndQuery                = PFN_vkCmdEndQuery( vkGetInstanceProcAddr( instance, \"vkCmdEndQuery\" ) );\n        vkCmdResetQueryPool          = PFN_vkCmdResetQueryPool( vkGetInstanceProcAddr( instance, \"vkCmdResetQueryPool\" ) );\n        vkCmdWriteTimestamp          = PFN_vkCmdWriteTimestamp( vkGetInstanceProcAddr( instance, \"vkCmdWriteTimestamp\" ) );\n        vkCmdCopyQueryPoolResults    = PFN_vkCmdCopyQueryPoolResults( vkGetInstanceProcAddr( instance, \"vkCmdCopyQueryPoolResults\" ) );\n        vkCmdPushConstants           = PFN_vkCmdPushConstants( vkGetInstanceProcAddr( instance, \"vkCmdPushConstants\" ) );\n        vkCmdBeginRenderPass         = PFN_vkCmdBeginRenderPass( vkGetInstanceProcAddr( instance, \"vkCmdBeginRenderPass\" ) );\n        vkCmdNextSubpass             = PFN_vkCmdNextSubpass( vkGetInstanceProcAddr( instance, \"vkCmdNextSubpass\" ) );\n        vkCmdEndRenderPass           = PFN_vkCmdEndRenderPass( vkGetInstanceProcAddr( instance, \"vkCmdEndRenderPass\" ) );\n        vkCmdExecuteCommands         = PFN_vkCmdExecuteCommands( vkGetInstanceProcAddr( instance, \"vkCmdExecuteCommands\" ) );\n\n        //=== VK_VERSION_1_1 ===\n        vkBindBufferMemory2                = PFN_vkBindBufferMemory2( vkGetInstanceProcAddr( instance, \"vkBindBufferMemory2\" ) );\n        vkBindImageMemory2                 = PFN_vkBindImageMemory2( vkGetInstanceProcAddr( instance, \"vkBindImageMemory2\" ) );\n        vkGetDeviceGroupPeerMemoryFeatures = PFN_vkGetDeviceGroupPeerMemoryFeatures( vkGetInstanceProcAddr( instance, \"vkGetDeviceGroupPeerMemoryFeatures\" ) );\n        vkCmdSetDeviceMask                 = PFN_vkCmdSetDeviceMask( vkGetInstanceProcAddr( instance, \"vkCmdSetDeviceMask\" ) );\n        vkCmdDispatchBase                  = PFN_vkCmdDispatchBase( vkGetInstanceProcAddr( instance, \"vkCmdDispatchBase\" ) );\n        vkEnumeratePhysicalDeviceGroups    = PFN_vkEnumeratePhysicalDeviceGroups( vkGetInstanceProcAddr( instance, \"vkEnumeratePhysicalDeviceGroups\" ) );\n        vkGetImageMemoryRequirements2      = PFN_vkGetImageMemoryRequirements2( vkGetInstanceProcAddr( instance, \"vkGetImageMemoryRequirements2\" ) );\n        vkGetBufferMemoryRequirements2     = PFN_vkGetBufferMemoryRequirements2( vkGetInstanceProcAddr( instance, \"vkGetBufferMemoryRequirements2\" ) );\n        vkGetImageSparseMemoryRequirements2 =\n          PFN_vkGetImageSparseMemoryRequirements2( vkGetInstanceProcAddr( instance, \"vkGetImageSparseMemoryRequirements2\" ) );\n        vkGetPhysicalDeviceFeatures2   = PFN_vkGetPhysicalDeviceFeatures2( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceFeatures2\" ) );\n        vkGetPhysicalDeviceProperties2 = PFN_vkGetPhysicalDeviceProperties2( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceProperties2\" ) );\n        vkGetPhysicalDeviceFormatProperties2 =\n          PFN_vkGetPhysicalDeviceFormatProperties2( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceFormatProperties2\" ) );\n        vkGetPhysicalDeviceImageFormatProperties2 =\n          PFN_vkGetPhysicalDeviceImageFormatProperties2( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceImageFormatProperties2\" ) );\n        vkGetPhysicalDeviceQueueFamilyProperties2 =\n          PFN_vkGetPhysicalDeviceQueueFamilyProperties2( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceQueueFamilyProperties2\" ) );\n        vkGetPhysicalDeviceMemoryProperties2 =\n          PFN_vkGetPhysicalDeviceMemoryProperties2( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceMemoryProperties2\" ) );\n        vkGetPhysicalDeviceSparseImageFormatProperties2 =\n          PFN_vkGetPhysicalDeviceSparseImageFormatProperties2( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSparseImageFormatProperties2\" ) );\n        vkTrimCommandPool                 = PFN_vkTrimCommandPool( vkGetInstanceProcAddr( instance, \"vkTrimCommandPool\" ) );\n        vkGetDeviceQueue2                 = PFN_vkGetDeviceQueue2( vkGetInstanceProcAddr( instance, \"vkGetDeviceQueue2\" ) );\n        vkCreateSamplerYcbcrConversion    = PFN_vkCreateSamplerYcbcrConversion( vkGetInstanceProcAddr( instance, \"vkCreateSamplerYcbcrConversion\" ) );\n        vkDestroySamplerYcbcrConversion   = PFN_vkDestroySamplerYcbcrConversion( vkGetInstanceProcAddr( instance, \"vkDestroySamplerYcbcrConversion\" ) );\n        vkCreateDescriptorUpdateTemplate  = PFN_vkCreateDescriptorUpdateTemplate( vkGetInstanceProcAddr( instance, \"vkCreateDescriptorUpdateTemplate\" ) );\n        vkDestroyDescriptorUpdateTemplate = PFN_vkDestroyDescriptorUpdateTemplate( vkGetInstanceProcAddr( instance, \"vkDestroyDescriptorUpdateTemplate\" ) );\n        vkUpdateDescriptorSetWithTemplate = PFN_vkUpdateDescriptorSetWithTemplate( vkGetInstanceProcAddr( instance, \"vkUpdateDescriptorSetWithTemplate\" ) );\n        vkGetPhysicalDeviceExternalBufferProperties =\n          PFN_vkGetPhysicalDeviceExternalBufferProperties( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceExternalBufferProperties\" ) );\n        vkGetPhysicalDeviceExternalFenceProperties =\n          PFN_vkGetPhysicalDeviceExternalFenceProperties( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceExternalFenceProperties\" ) );\n        vkGetPhysicalDeviceExternalSemaphoreProperties =\n          PFN_vkGetPhysicalDeviceExternalSemaphoreProperties( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceExternalSemaphoreProperties\" ) );\n        vkGetDescriptorSetLayoutSupport = PFN_vkGetDescriptorSetLayoutSupport( vkGetInstanceProcAddr( instance, \"vkGetDescriptorSetLayoutSupport\" ) );\n\n        //=== VK_VERSION_1_2 ===\n        vkCmdDrawIndirectCount          = PFN_vkCmdDrawIndirectCount( vkGetInstanceProcAddr( instance, \"vkCmdDrawIndirectCount\" ) );\n        vkCmdDrawIndexedIndirectCount   = PFN_vkCmdDrawIndexedIndirectCount( vkGetInstanceProcAddr( instance, \"vkCmdDrawIndexedIndirectCount\" ) );\n        vkCreateRenderPass2             = PFN_vkCreateRenderPass2( vkGetInstanceProcAddr( instance, \"vkCreateRenderPass2\" ) );\n        vkCmdBeginRenderPass2           = PFN_vkCmdBeginRenderPass2( vkGetInstanceProcAddr( instance, \"vkCmdBeginRenderPass2\" ) );\n        vkCmdNextSubpass2               = PFN_vkCmdNextSubpass2( vkGetInstanceProcAddr( instance, \"vkCmdNextSubpass2\" ) );\n        vkCmdEndRenderPass2             = PFN_vkCmdEndRenderPass2( vkGetInstanceProcAddr( instance, \"vkCmdEndRenderPass2\" ) );\n        vkResetQueryPool                = PFN_vkResetQueryPool( vkGetInstanceProcAddr( instance, \"vkResetQueryPool\" ) );\n        vkGetSemaphoreCounterValue      = PFN_vkGetSemaphoreCounterValue( vkGetInstanceProcAddr( instance, \"vkGetSemaphoreCounterValue\" ) );\n        vkWaitSemaphores                = PFN_vkWaitSemaphores( vkGetInstanceProcAddr( instance, \"vkWaitSemaphores\" ) );\n        vkSignalSemaphore               = PFN_vkSignalSemaphore( vkGetInstanceProcAddr( instance, \"vkSignalSemaphore\" ) );\n        vkGetBufferDeviceAddress        = PFN_vkGetBufferDeviceAddress( vkGetInstanceProcAddr( instance, \"vkGetBufferDeviceAddress\" ) );\n        vkGetBufferOpaqueCaptureAddress = PFN_vkGetBufferOpaqueCaptureAddress( vkGetInstanceProcAddr( instance, \"vkGetBufferOpaqueCaptureAddress\" ) );\n        vkGetDeviceMemoryOpaqueCaptureAddress =\n          PFN_vkGetDeviceMemoryOpaqueCaptureAddress( vkGetInstanceProcAddr( instance, \"vkGetDeviceMemoryOpaqueCaptureAddress\" ) );\n\n        //=== VK_VERSION_1_3 ===\n        vkGetPhysicalDeviceToolProperties = PFN_vkGetPhysicalDeviceToolProperties( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceToolProperties\" ) );\n        vkCreatePrivateDataSlot           = PFN_vkCreatePrivateDataSlot( vkGetInstanceProcAddr( instance, \"vkCreatePrivateDataSlot\" ) );\n        vkDestroyPrivateDataSlot          = PFN_vkDestroyPrivateDataSlot( vkGetInstanceProcAddr( instance, \"vkDestroyPrivateDataSlot\" ) );\n        vkSetPrivateData                  = PFN_vkSetPrivateData( vkGetInstanceProcAddr( instance, \"vkSetPrivateData\" ) );\n        vkGetPrivateData                  = PFN_vkGetPrivateData( vkGetInstanceProcAddr( instance, \"vkGetPrivateData\" ) );\n        vkCmdSetEvent2                    = PFN_vkCmdSetEvent2( vkGetInstanceProcAddr( instance, \"vkCmdSetEvent2\" ) );\n        vkCmdResetEvent2                  = PFN_vkCmdResetEvent2( vkGetInstanceProcAddr( instance, \"vkCmdResetEvent2\" ) );\n        vkCmdWaitEvents2                  = PFN_vkCmdWaitEvents2( vkGetInstanceProcAddr( instance, \"vkCmdWaitEvents2\" ) );\n        vkCmdPipelineBarrier2             = PFN_vkCmdPipelineBarrier2( vkGetInstanceProcAddr( instance, \"vkCmdPipelineBarrier2\" ) );\n        vkCmdWriteTimestamp2              = PFN_vkCmdWriteTimestamp2( vkGetInstanceProcAddr( instance, \"vkCmdWriteTimestamp2\" ) );\n        vkQueueSubmit2                    = PFN_vkQueueSubmit2( vkGetInstanceProcAddr( instance, \"vkQueueSubmit2\" ) );\n        vkCmdCopyBuffer2                  = PFN_vkCmdCopyBuffer2( vkGetInstanceProcAddr( instance, \"vkCmdCopyBuffer2\" ) );\n        vkCmdCopyImage2                   = PFN_vkCmdCopyImage2( vkGetInstanceProcAddr( instance, \"vkCmdCopyImage2\" ) );\n        vkCmdCopyBufferToImage2           = PFN_vkCmdCopyBufferToImage2( vkGetInstanceProcAddr( instance, \"vkCmdCopyBufferToImage2\" ) );\n        vkCmdCopyImageToBuffer2           = PFN_vkCmdCopyImageToBuffer2( vkGetInstanceProcAddr( instance, \"vkCmdCopyImageToBuffer2\" ) );\n        vkCmdBlitImage2                   = PFN_vkCmdBlitImage2( vkGetInstanceProcAddr( instance, \"vkCmdBlitImage2\" ) );\n        vkCmdResolveImage2                = PFN_vkCmdResolveImage2( vkGetInstanceProcAddr( instance, \"vkCmdResolveImage2\" ) );\n        vkCmdBeginRendering               = PFN_vkCmdBeginRendering( vkGetInstanceProcAddr( instance, \"vkCmdBeginRendering\" ) );\n        vkCmdEndRendering                 = PFN_vkCmdEndRendering( vkGetInstanceProcAddr( instance, \"vkCmdEndRendering\" ) );\n        vkCmdSetCullMode                  = PFN_vkCmdSetCullMode( vkGetInstanceProcAddr( instance, \"vkCmdSetCullMode\" ) );\n        vkCmdSetFrontFace                 = PFN_vkCmdSetFrontFace( vkGetInstanceProcAddr( instance, \"vkCmdSetFrontFace\" ) );\n        vkCmdSetPrimitiveTopology         = PFN_vkCmdSetPrimitiveTopology( vkGetInstanceProcAddr( instance, \"vkCmdSetPrimitiveTopology\" ) );\n        vkCmdSetViewportWithCount         = PFN_vkCmdSetViewportWithCount( vkGetInstanceProcAddr( instance, \"vkCmdSetViewportWithCount\" ) );\n        vkCmdSetScissorWithCount          = PFN_vkCmdSetScissorWithCount( vkGetInstanceProcAddr( instance, \"vkCmdSetScissorWithCount\" ) );\n        vkCmdBindVertexBuffers2           = PFN_vkCmdBindVertexBuffers2( vkGetInstanceProcAddr( instance, \"vkCmdBindVertexBuffers2\" ) );\n        vkCmdSetDepthTestEnable           = PFN_vkCmdSetDepthTestEnable( vkGetInstanceProcAddr( instance, \"vkCmdSetDepthTestEnable\" ) );\n        vkCmdSetDepthWriteEnable          = PFN_vkCmdSetDepthWriteEnable( vkGetInstanceProcAddr( instance, \"vkCmdSetDepthWriteEnable\" ) );\n        vkCmdSetDepthCompareOp            = PFN_vkCmdSetDepthCompareOp( vkGetInstanceProcAddr( instance, \"vkCmdSetDepthCompareOp\" ) );\n        vkCmdSetDepthBoundsTestEnable     = PFN_vkCmdSetDepthBoundsTestEnable( vkGetInstanceProcAddr( instance, \"vkCmdSetDepthBoundsTestEnable\" ) );\n        vkCmdSetStencilTestEnable         = PFN_vkCmdSetStencilTestEnable( vkGetInstanceProcAddr( instance, \"vkCmdSetStencilTestEnable\" ) );\n        vkCmdSetStencilOp                 = PFN_vkCmdSetStencilOp( vkGetInstanceProcAddr( instance, \"vkCmdSetStencilOp\" ) );\n        vkCmdSetRasterizerDiscardEnable   = PFN_vkCmdSetRasterizerDiscardEnable( vkGetInstanceProcAddr( instance, \"vkCmdSetRasterizerDiscardEnable\" ) );\n        vkCmdSetDepthBiasEnable           = PFN_vkCmdSetDepthBiasEnable( vkGetInstanceProcAddr( instance, \"vkCmdSetDepthBiasEnable\" ) );\n        vkCmdSetPrimitiveRestartEnable    = PFN_vkCmdSetPrimitiveRestartEnable( vkGetInstanceProcAddr( instance, \"vkCmdSetPrimitiveRestartEnable\" ) );\n        vkGetDeviceBufferMemoryRequirements =\n          PFN_vkGetDeviceBufferMemoryRequirements( vkGetInstanceProcAddr( instance, \"vkGetDeviceBufferMemoryRequirements\" ) );\n        vkGetDeviceImageMemoryRequirements = PFN_vkGetDeviceImageMemoryRequirements( vkGetInstanceProcAddr( instance, \"vkGetDeviceImageMemoryRequirements\" ) );\n        vkGetDeviceImageSparseMemoryRequirements =\n          PFN_vkGetDeviceImageSparseMemoryRequirements( vkGetInstanceProcAddr( instance, \"vkGetDeviceImageSparseMemoryRequirements\" ) );\n\n        //=== VK_VERSION_1_4 ===\n        vkCmdSetLineStipple                = PFN_vkCmdSetLineStipple( vkGetInstanceProcAddr( instance, \"vkCmdSetLineStipple\" ) );\n        vkMapMemory2                       = PFN_vkMapMemory2( vkGetInstanceProcAddr( instance, \"vkMapMemory2\" ) );\n        vkUnmapMemory2                     = PFN_vkUnmapMemory2( vkGetInstanceProcAddr( instance, \"vkUnmapMemory2\" ) );\n        vkCmdBindIndexBuffer2              = PFN_vkCmdBindIndexBuffer2( vkGetInstanceProcAddr( instance, \"vkCmdBindIndexBuffer2\" ) );\n        vkGetRenderingAreaGranularity      = PFN_vkGetRenderingAreaGranularity( vkGetInstanceProcAddr( instance, \"vkGetRenderingAreaGranularity\" ) );\n        vkGetDeviceImageSubresourceLayout  = PFN_vkGetDeviceImageSubresourceLayout( vkGetInstanceProcAddr( instance, \"vkGetDeviceImageSubresourceLayout\" ) );\n        vkGetImageSubresourceLayout2       = PFN_vkGetImageSubresourceLayout2( vkGetInstanceProcAddr( instance, \"vkGetImageSubresourceLayout2\" ) );\n        vkCmdPushDescriptorSet             = PFN_vkCmdPushDescriptorSet( vkGetInstanceProcAddr( instance, \"vkCmdPushDescriptorSet\" ) );\n        vkCmdPushDescriptorSetWithTemplate = PFN_vkCmdPushDescriptorSetWithTemplate( vkGetInstanceProcAddr( instance, \"vkCmdPushDescriptorSetWithTemplate\" ) );\n        vkCmdSetRenderingAttachmentLocations =\n          PFN_vkCmdSetRenderingAttachmentLocations( vkGetInstanceProcAddr( instance, \"vkCmdSetRenderingAttachmentLocations\" ) );\n        vkCmdSetRenderingInputAttachmentIndices =\n          PFN_vkCmdSetRenderingInputAttachmentIndices( vkGetInstanceProcAddr( instance, \"vkCmdSetRenderingInputAttachmentIndices\" ) );\n        vkCmdBindDescriptorSets2 = PFN_vkCmdBindDescriptorSets2( vkGetInstanceProcAddr( instance, \"vkCmdBindDescriptorSets2\" ) );\n        vkCmdPushConstants2      = PFN_vkCmdPushConstants2( vkGetInstanceProcAddr( instance, \"vkCmdPushConstants2\" ) );\n        vkCmdPushDescriptorSet2  = PFN_vkCmdPushDescriptorSet2( vkGetInstanceProcAddr( instance, \"vkCmdPushDescriptorSet2\" ) );\n        vkCmdPushDescriptorSetWithTemplate2 =\n          PFN_vkCmdPushDescriptorSetWithTemplate2( vkGetInstanceProcAddr( instance, \"vkCmdPushDescriptorSetWithTemplate2\" ) );\n        vkCopyMemoryToImage     = PFN_vkCopyMemoryToImage( vkGetInstanceProcAddr( instance, \"vkCopyMemoryToImage\" ) );\n        vkCopyImageToMemory     = PFN_vkCopyImageToMemory( vkGetInstanceProcAddr( instance, \"vkCopyImageToMemory\" ) );\n        vkCopyImageToImage      = PFN_vkCopyImageToImage( vkGetInstanceProcAddr( instance, \"vkCopyImageToImage\" ) );\n        vkTransitionImageLayout = PFN_vkTransitionImageLayout( vkGetInstanceProcAddr( instance, \"vkTransitionImageLayout\" ) );\n\n        //=== VK_KHR_surface ===\n        vkDestroySurfaceKHR = PFN_vkDestroySurfaceKHR( vkGetInstanceProcAddr( instance, \"vkDestroySurfaceKHR\" ) );\n        vkGetPhysicalDeviceSurfaceSupportKHR =\n          PFN_vkGetPhysicalDeviceSurfaceSupportKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSurfaceSupportKHR\" ) );\n        vkGetPhysicalDeviceSurfaceCapabilitiesKHR =\n          PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSurfaceCapabilitiesKHR\" ) );\n        vkGetPhysicalDeviceSurfaceFormatsKHR =\n          PFN_vkGetPhysicalDeviceSurfaceFormatsKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSurfaceFormatsKHR\" ) );\n        vkGetPhysicalDeviceSurfacePresentModesKHR =\n          PFN_vkGetPhysicalDeviceSurfacePresentModesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSurfacePresentModesKHR\" ) );\n\n        //=== VK_KHR_swapchain ===\n        vkCreateSwapchainKHR    = PFN_vkCreateSwapchainKHR( vkGetInstanceProcAddr( instance, \"vkCreateSwapchainKHR\" ) );\n        vkDestroySwapchainKHR   = PFN_vkDestroySwapchainKHR( vkGetInstanceProcAddr( instance, \"vkDestroySwapchainKHR\" ) );\n        vkGetSwapchainImagesKHR = PFN_vkGetSwapchainImagesKHR( vkGetInstanceProcAddr( instance, \"vkGetSwapchainImagesKHR\" ) );\n        vkAcquireNextImageKHR   = PFN_vkAcquireNextImageKHR( vkGetInstanceProcAddr( instance, \"vkAcquireNextImageKHR\" ) );\n        vkQueuePresentKHR       = PFN_vkQueuePresentKHR( vkGetInstanceProcAddr( instance, \"vkQueuePresentKHR\" ) );\n        vkGetDeviceGroupPresentCapabilitiesKHR =\n          PFN_vkGetDeviceGroupPresentCapabilitiesKHR( vkGetInstanceProcAddr( instance, \"vkGetDeviceGroupPresentCapabilitiesKHR\" ) );\n        vkGetDeviceGroupSurfacePresentModesKHR =\n          PFN_vkGetDeviceGroupSurfacePresentModesKHR( vkGetInstanceProcAddr( instance, \"vkGetDeviceGroupSurfacePresentModesKHR\" ) );\n        vkGetPhysicalDevicePresentRectanglesKHR =\n          PFN_vkGetPhysicalDevicePresentRectanglesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDevicePresentRectanglesKHR\" ) );\n        vkAcquireNextImage2KHR = PFN_vkAcquireNextImage2KHR( vkGetInstanceProcAddr( instance, \"vkAcquireNextImage2KHR\" ) );\n\n        //=== VK_KHR_display ===\n        vkGetPhysicalDeviceDisplayPropertiesKHR =\n          PFN_vkGetPhysicalDeviceDisplayPropertiesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceDisplayPropertiesKHR\" ) );\n        vkGetPhysicalDeviceDisplayPlanePropertiesKHR =\n          PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceDisplayPlanePropertiesKHR\" ) );\n        vkGetDisplayPlaneSupportedDisplaysKHR =\n          PFN_vkGetDisplayPlaneSupportedDisplaysKHR( vkGetInstanceProcAddr( instance, \"vkGetDisplayPlaneSupportedDisplaysKHR\" ) );\n        vkGetDisplayModePropertiesKHR    = PFN_vkGetDisplayModePropertiesKHR( vkGetInstanceProcAddr( instance, \"vkGetDisplayModePropertiesKHR\" ) );\n        vkCreateDisplayModeKHR           = PFN_vkCreateDisplayModeKHR( vkGetInstanceProcAddr( instance, \"vkCreateDisplayModeKHR\" ) );\n        vkGetDisplayPlaneCapabilitiesKHR = PFN_vkGetDisplayPlaneCapabilitiesKHR( vkGetInstanceProcAddr( instance, \"vkGetDisplayPlaneCapabilitiesKHR\" ) );\n        vkCreateDisplayPlaneSurfaceKHR   = PFN_vkCreateDisplayPlaneSurfaceKHR( vkGetInstanceProcAddr( instance, \"vkCreateDisplayPlaneSurfaceKHR\" ) );\n\n        //=== VK_KHR_display_swapchain ===\n        vkCreateSharedSwapchainsKHR = PFN_vkCreateSharedSwapchainsKHR( vkGetInstanceProcAddr( instance, \"vkCreateSharedSwapchainsKHR\" ) );\n\n#if defined( VK_USE_PLATFORM_XLIB_KHR )\n        //=== VK_KHR_xlib_surface ===\n        vkCreateXlibSurfaceKHR = PFN_vkCreateXlibSurfaceKHR( vkGetInstanceProcAddr( instance, \"vkCreateXlibSurfaceKHR\" ) );\n        vkGetPhysicalDeviceXlibPresentationSupportKHR =\n          PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceXlibPresentationSupportKHR\" ) );\n#endif /*VK_USE_PLATFORM_XLIB_KHR*/\n\n#if defined( VK_USE_PLATFORM_XCB_KHR )\n        //=== VK_KHR_xcb_surface ===\n        vkCreateXcbSurfaceKHR = PFN_vkCreateXcbSurfaceKHR( vkGetInstanceProcAddr( instance, \"vkCreateXcbSurfaceKHR\" ) );\n        vkGetPhysicalDeviceXcbPresentationSupportKHR =\n          PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceXcbPresentationSupportKHR\" ) );\n#endif /*VK_USE_PLATFORM_XCB_KHR*/\n\n#if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n        //=== VK_KHR_wayland_surface ===\n        vkCreateWaylandSurfaceKHR = PFN_vkCreateWaylandSurfaceKHR( vkGetInstanceProcAddr( instance, \"vkCreateWaylandSurfaceKHR\" ) );\n        vkGetPhysicalDeviceWaylandPresentationSupportKHR =\n          PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceWaylandPresentationSupportKHR\" ) );\n#endif /*VK_USE_PLATFORM_WAYLAND_KHR*/\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n        //=== VK_KHR_android_surface ===\n        vkCreateAndroidSurfaceKHR = PFN_vkCreateAndroidSurfaceKHR( vkGetInstanceProcAddr( instance, \"vkCreateAndroidSurfaceKHR\" ) );\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n        //=== VK_KHR_win32_surface ===\n        vkCreateWin32SurfaceKHR = PFN_vkCreateWin32SurfaceKHR( vkGetInstanceProcAddr( instance, \"vkCreateWin32SurfaceKHR\" ) );\n        vkGetPhysicalDeviceWin32PresentationSupportKHR =\n          PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceWin32PresentationSupportKHR\" ) );\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n        //=== VK_EXT_debug_report ===\n        vkCreateDebugReportCallbackEXT  = PFN_vkCreateDebugReportCallbackEXT( vkGetInstanceProcAddr( instance, \"vkCreateDebugReportCallbackEXT\" ) );\n        vkDestroyDebugReportCallbackEXT = PFN_vkDestroyDebugReportCallbackEXT( vkGetInstanceProcAddr( instance, \"vkDestroyDebugReportCallbackEXT\" ) );\n        vkDebugReportMessageEXT         = PFN_vkDebugReportMessageEXT( vkGetInstanceProcAddr( instance, \"vkDebugReportMessageEXT\" ) );\n\n        //=== VK_EXT_debug_marker ===\n        vkDebugMarkerSetObjectTagEXT  = PFN_vkDebugMarkerSetObjectTagEXT( vkGetInstanceProcAddr( instance, \"vkDebugMarkerSetObjectTagEXT\" ) );\n        vkDebugMarkerSetObjectNameEXT = PFN_vkDebugMarkerSetObjectNameEXT( vkGetInstanceProcAddr( instance, \"vkDebugMarkerSetObjectNameEXT\" ) );\n        vkCmdDebugMarkerBeginEXT      = PFN_vkCmdDebugMarkerBeginEXT( vkGetInstanceProcAddr( instance, \"vkCmdDebugMarkerBeginEXT\" ) );\n        vkCmdDebugMarkerEndEXT        = PFN_vkCmdDebugMarkerEndEXT( vkGetInstanceProcAddr( instance, \"vkCmdDebugMarkerEndEXT\" ) );\n        vkCmdDebugMarkerInsertEXT     = PFN_vkCmdDebugMarkerInsertEXT( vkGetInstanceProcAddr( instance, \"vkCmdDebugMarkerInsertEXT\" ) );\n\n        //=== VK_KHR_video_queue ===\n        vkGetPhysicalDeviceVideoCapabilitiesKHR =\n          PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceVideoCapabilitiesKHR\" ) );\n        vkGetPhysicalDeviceVideoFormatPropertiesKHR =\n          PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceVideoFormatPropertiesKHR\" ) );\n        vkCreateVideoSessionKHR  = PFN_vkCreateVideoSessionKHR( vkGetInstanceProcAddr( instance, \"vkCreateVideoSessionKHR\" ) );\n        vkDestroyVideoSessionKHR = PFN_vkDestroyVideoSessionKHR( vkGetInstanceProcAddr( instance, \"vkDestroyVideoSessionKHR\" ) );\n        vkGetVideoSessionMemoryRequirementsKHR =\n          PFN_vkGetVideoSessionMemoryRequirementsKHR( vkGetInstanceProcAddr( instance, \"vkGetVideoSessionMemoryRequirementsKHR\" ) );\n        vkBindVideoSessionMemoryKHR        = PFN_vkBindVideoSessionMemoryKHR( vkGetInstanceProcAddr( instance, \"vkBindVideoSessionMemoryKHR\" ) );\n        vkCreateVideoSessionParametersKHR  = PFN_vkCreateVideoSessionParametersKHR( vkGetInstanceProcAddr( instance, \"vkCreateVideoSessionParametersKHR\" ) );\n        vkUpdateVideoSessionParametersKHR  = PFN_vkUpdateVideoSessionParametersKHR( vkGetInstanceProcAddr( instance, \"vkUpdateVideoSessionParametersKHR\" ) );\n        vkDestroyVideoSessionParametersKHR = PFN_vkDestroyVideoSessionParametersKHR( vkGetInstanceProcAddr( instance, \"vkDestroyVideoSessionParametersKHR\" ) );\n        vkCmdBeginVideoCodingKHR           = PFN_vkCmdBeginVideoCodingKHR( vkGetInstanceProcAddr( instance, \"vkCmdBeginVideoCodingKHR\" ) );\n        vkCmdEndVideoCodingKHR             = PFN_vkCmdEndVideoCodingKHR( vkGetInstanceProcAddr( instance, \"vkCmdEndVideoCodingKHR\" ) );\n        vkCmdControlVideoCodingKHR         = PFN_vkCmdControlVideoCodingKHR( vkGetInstanceProcAddr( instance, \"vkCmdControlVideoCodingKHR\" ) );\n\n        //=== VK_KHR_video_decode_queue ===\n        vkCmdDecodeVideoKHR = PFN_vkCmdDecodeVideoKHR( vkGetInstanceProcAddr( instance, \"vkCmdDecodeVideoKHR\" ) );\n\n        //=== VK_EXT_transform_feedback ===\n        vkCmdBindTransformFeedbackBuffersEXT =\n          PFN_vkCmdBindTransformFeedbackBuffersEXT( vkGetInstanceProcAddr( instance, \"vkCmdBindTransformFeedbackBuffersEXT\" ) );\n        vkCmdBeginTransformFeedbackEXT = PFN_vkCmdBeginTransformFeedbackEXT( vkGetInstanceProcAddr( instance, \"vkCmdBeginTransformFeedbackEXT\" ) );\n        vkCmdEndTransformFeedbackEXT   = PFN_vkCmdEndTransformFeedbackEXT( vkGetInstanceProcAddr( instance, \"vkCmdEndTransformFeedbackEXT\" ) );\n        vkCmdBeginQueryIndexedEXT      = PFN_vkCmdBeginQueryIndexedEXT( vkGetInstanceProcAddr( instance, \"vkCmdBeginQueryIndexedEXT\" ) );\n        vkCmdEndQueryIndexedEXT        = PFN_vkCmdEndQueryIndexedEXT( vkGetInstanceProcAddr( instance, \"vkCmdEndQueryIndexedEXT\" ) );\n        vkCmdDrawIndirectByteCountEXT  = PFN_vkCmdDrawIndirectByteCountEXT( vkGetInstanceProcAddr( instance, \"vkCmdDrawIndirectByteCountEXT\" ) );\n\n        //=== VK_NVX_binary_import ===\n        vkCreateCuModuleNVX    = PFN_vkCreateCuModuleNVX( vkGetInstanceProcAddr( instance, \"vkCreateCuModuleNVX\" ) );\n        vkCreateCuFunctionNVX  = PFN_vkCreateCuFunctionNVX( vkGetInstanceProcAddr( instance, \"vkCreateCuFunctionNVX\" ) );\n        vkDestroyCuModuleNVX   = PFN_vkDestroyCuModuleNVX( vkGetInstanceProcAddr( instance, \"vkDestroyCuModuleNVX\" ) );\n        vkDestroyCuFunctionNVX = PFN_vkDestroyCuFunctionNVX( vkGetInstanceProcAddr( instance, \"vkDestroyCuFunctionNVX\" ) );\n        vkCmdCuLaunchKernelNVX = PFN_vkCmdCuLaunchKernelNVX( vkGetInstanceProcAddr( instance, \"vkCmdCuLaunchKernelNVX\" ) );\n\n        //=== VK_NVX_image_view_handle ===\n        vkGetImageViewHandleNVX   = PFN_vkGetImageViewHandleNVX( vkGetInstanceProcAddr( instance, \"vkGetImageViewHandleNVX\" ) );\n        vkGetImageViewHandle64NVX = PFN_vkGetImageViewHandle64NVX( vkGetInstanceProcAddr( instance, \"vkGetImageViewHandle64NVX\" ) );\n        vkGetImageViewAddressNVX  = PFN_vkGetImageViewAddressNVX( vkGetInstanceProcAddr( instance, \"vkGetImageViewAddressNVX\" ) );\n\n        //=== VK_AMD_draw_indirect_count ===\n        vkCmdDrawIndirectCountAMD = PFN_vkCmdDrawIndirectCountAMD( vkGetInstanceProcAddr( instance, \"vkCmdDrawIndirectCountAMD\" ) );\n        if ( !vkCmdDrawIndirectCount )\n          vkCmdDrawIndirectCount = vkCmdDrawIndirectCountAMD;\n        vkCmdDrawIndexedIndirectCountAMD = PFN_vkCmdDrawIndexedIndirectCountAMD( vkGetInstanceProcAddr( instance, \"vkCmdDrawIndexedIndirectCountAMD\" ) );\n        if ( !vkCmdDrawIndexedIndirectCount )\n          vkCmdDrawIndexedIndirectCount = vkCmdDrawIndexedIndirectCountAMD;\n\n        //=== VK_AMD_shader_info ===\n        vkGetShaderInfoAMD = PFN_vkGetShaderInfoAMD( vkGetInstanceProcAddr( instance, \"vkGetShaderInfoAMD\" ) );\n\n        //=== VK_KHR_dynamic_rendering ===\n        vkCmdBeginRenderingKHR = PFN_vkCmdBeginRenderingKHR( vkGetInstanceProcAddr( instance, \"vkCmdBeginRenderingKHR\" ) );\n        if ( !vkCmdBeginRendering )\n          vkCmdBeginRendering = vkCmdBeginRenderingKHR;\n        vkCmdEndRenderingKHR = PFN_vkCmdEndRenderingKHR( vkGetInstanceProcAddr( instance, \"vkCmdEndRenderingKHR\" ) );\n        if ( !vkCmdEndRendering )\n          vkCmdEndRendering = vkCmdEndRenderingKHR;\n\n#if defined( VK_USE_PLATFORM_GGP )\n        //=== VK_GGP_stream_descriptor_surface ===\n        vkCreateStreamDescriptorSurfaceGGP = PFN_vkCreateStreamDescriptorSurfaceGGP( vkGetInstanceProcAddr( instance, \"vkCreateStreamDescriptorSurfaceGGP\" ) );\n#endif /*VK_USE_PLATFORM_GGP*/\n\n        //=== VK_NV_external_memory_capabilities ===\n        vkGetPhysicalDeviceExternalImageFormatPropertiesNV =\n          PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceExternalImageFormatPropertiesNV\" ) );\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n        //=== VK_NV_external_memory_win32 ===\n        vkGetMemoryWin32HandleNV = PFN_vkGetMemoryWin32HandleNV( vkGetInstanceProcAddr( instance, \"vkGetMemoryWin32HandleNV\" ) );\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n        //=== VK_KHR_get_physical_device_properties2 ===\n        vkGetPhysicalDeviceFeatures2KHR = PFN_vkGetPhysicalDeviceFeatures2KHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceFeatures2KHR\" ) );\n        if ( !vkGetPhysicalDeviceFeatures2 )\n          vkGetPhysicalDeviceFeatures2 = vkGetPhysicalDeviceFeatures2KHR;\n        vkGetPhysicalDeviceProperties2KHR = PFN_vkGetPhysicalDeviceProperties2KHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceProperties2KHR\" ) );\n        if ( !vkGetPhysicalDeviceProperties2 )\n          vkGetPhysicalDeviceProperties2 = vkGetPhysicalDeviceProperties2KHR;\n        vkGetPhysicalDeviceFormatProperties2KHR =\n          PFN_vkGetPhysicalDeviceFormatProperties2KHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceFormatProperties2KHR\" ) );\n        if ( !vkGetPhysicalDeviceFormatProperties2 )\n          vkGetPhysicalDeviceFormatProperties2 = vkGetPhysicalDeviceFormatProperties2KHR;\n        vkGetPhysicalDeviceImageFormatProperties2KHR =\n          PFN_vkGetPhysicalDeviceImageFormatProperties2KHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceImageFormatProperties2KHR\" ) );\n        if ( !vkGetPhysicalDeviceImageFormatProperties2 )\n          vkGetPhysicalDeviceImageFormatProperties2 = vkGetPhysicalDeviceImageFormatProperties2KHR;\n        vkGetPhysicalDeviceQueueFamilyProperties2KHR =\n          PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceQueueFamilyProperties2KHR\" ) );\n        if ( !vkGetPhysicalDeviceQueueFamilyProperties2 )\n          vkGetPhysicalDeviceQueueFamilyProperties2 = vkGetPhysicalDeviceQueueFamilyProperties2KHR;\n        vkGetPhysicalDeviceMemoryProperties2KHR =\n          PFN_vkGetPhysicalDeviceMemoryProperties2KHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceMemoryProperties2KHR\" ) );\n        if ( !vkGetPhysicalDeviceMemoryProperties2 )\n          vkGetPhysicalDeviceMemoryProperties2 = vkGetPhysicalDeviceMemoryProperties2KHR;\n        vkGetPhysicalDeviceSparseImageFormatProperties2KHR =\n          PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSparseImageFormatProperties2KHR\" ) );\n        if ( !vkGetPhysicalDeviceSparseImageFormatProperties2 )\n          vkGetPhysicalDeviceSparseImageFormatProperties2 = vkGetPhysicalDeviceSparseImageFormatProperties2KHR;\n\n        //=== VK_KHR_device_group ===\n        vkGetDeviceGroupPeerMemoryFeaturesKHR =\n          PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR( vkGetInstanceProcAddr( instance, \"vkGetDeviceGroupPeerMemoryFeaturesKHR\" ) );\n        if ( !vkGetDeviceGroupPeerMemoryFeatures )\n          vkGetDeviceGroupPeerMemoryFeatures = vkGetDeviceGroupPeerMemoryFeaturesKHR;\n        vkCmdSetDeviceMaskKHR = PFN_vkCmdSetDeviceMaskKHR( vkGetInstanceProcAddr( instance, \"vkCmdSetDeviceMaskKHR\" ) );\n        if ( !vkCmdSetDeviceMask )\n          vkCmdSetDeviceMask = vkCmdSetDeviceMaskKHR;\n        vkCmdDispatchBaseKHR = PFN_vkCmdDispatchBaseKHR( vkGetInstanceProcAddr( instance, \"vkCmdDispatchBaseKHR\" ) );\n        if ( !vkCmdDispatchBase )\n          vkCmdDispatchBase = vkCmdDispatchBaseKHR;\n\n#if defined( VK_USE_PLATFORM_VI_NN )\n        //=== VK_NN_vi_surface ===\n        vkCreateViSurfaceNN = PFN_vkCreateViSurfaceNN( vkGetInstanceProcAddr( instance, \"vkCreateViSurfaceNN\" ) );\n#endif /*VK_USE_PLATFORM_VI_NN*/\n\n        //=== VK_KHR_maintenance1 ===\n        vkTrimCommandPoolKHR = PFN_vkTrimCommandPoolKHR( vkGetInstanceProcAddr( instance, \"vkTrimCommandPoolKHR\" ) );\n        if ( !vkTrimCommandPool )\n          vkTrimCommandPool = vkTrimCommandPoolKHR;\n\n        //=== VK_KHR_device_group_creation ===\n        vkEnumeratePhysicalDeviceGroupsKHR = PFN_vkEnumeratePhysicalDeviceGroupsKHR( vkGetInstanceProcAddr( instance, \"vkEnumeratePhysicalDeviceGroupsKHR\" ) );\n        if ( !vkEnumeratePhysicalDeviceGroups )\n          vkEnumeratePhysicalDeviceGroups = vkEnumeratePhysicalDeviceGroupsKHR;\n\n        //=== VK_KHR_external_memory_capabilities ===\n        vkGetPhysicalDeviceExternalBufferPropertiesKHR =\n          PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceExternalBufferPropertiesKHR\" ) );\n        if ( !vkGetPhysicalDeviceExternalBufferProperties )\n          vkGetPhysicalDeviceExternalBufferProperties = vkGetPhysicalDeviceExternalBufferPropertiesKHR;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n        //=== VK_KHR_external_memory_win32 ===\n        vkGetMemoryWin32HandleKHR = PFN_vkGetMemoryWin32HandleKHR( vkGetInstanceProcAddr( instance, \"vkGetMemoryWin32HandleKHR\" ) );\n        vkGetMemoryWin32HandlePropertiesKHR =\n          PFN_vkGetMemoryWin32HandlePropertiesKHR( vkGetInstanceProcAddr( instance, \"vkGetMemoryWin32HandlePropertiesKHR\" ) );\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n        //=== VK_KHR_external_memory_fd ===\n        vkGetMemoryFdKHR           = PFN_vkGetMemoryFdKHR( vkGetInstanceProcAddr( instance, \"vkGetMemoryFdKHR\" ) );\n        vkGetMemoryFdPropertiesKHR = PFN_vkGetMemoryFdPropertiesKHR( vkGetInstanceProcAddr( instance, \"vkGetMemoryFdPropertiesKHR\" ) );\n\n        //=== VK_KHR_external_semaphore_capabilities ===\n        vkGetPhysicalDeviceExternalSemaphorePropertiesKHR =\n          PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceExternalSemaphorePropertiesKHR\" ) );\n        if ( !vkGetPhysicalDeviceExternalSemaphoreProperties )\n          vkGetPhysicalDeviceExternalSemaphoreProperties = vkGetPhysicalDeviceExternalSemaphorePropertiesKHR;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n        //=== VK_KHR_external_semaphore_win32 ===\n        vkImportSemaphoreWin32HandleKHR = PFN_vkImportSemaphoreWin32HandleKHR( vkGetInstanceProcAddr( instance, \"vkImportSemaphoreWin32HandleKHR\" ) );\n        vkGetSemaphoreWin32HandleKHR    = PFN_vkGetSemaphoreWin32HandleKHR( vkGetInstanceProcAddr( instance, \"vkGetSemaphoreWin32HandleKHR\" ) );\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n        //=== VK_KHR_external_semaphore_fd ===\n        vkImportSemaphoreFdKHR = PFN_vkImportSemaphoreFdKHR( vkGetInstanceProcAddr( instance, \"vkImportSemaphoreFdKHR\" ) );\n        vkGetSemaphoreFdKHR    = PFN_vkGetSemaphoreFdKHR( vkGetInstanceProcAddr( instance, \"vkGetSemaphoreFdKHR\" ) );\n\n        //=== VK_KHR_push_descriptor ===\n        vkCmdPushDescriptorSetKHR = PFN_vkCmdPushDescriptorSetKHR( vkGetInstanceProcAddr( instance, \"vkCmdPushDescriptorSetKHR\" ) );\n        if ( !vkCmdPushDescriptorSet )\n          vkCmdPushDescriptorSet = vkCmdPushDescriptorSetKHR;\n        vkCmdPushDescriptorSetWithTemplateKHR =\n          PFN_vkCmdPushDescriptorSetWithTemplateKHR( vkGetInstanceProcAddr( instance, \"vkCmdPushDescriptorSetWithTemplateKHR\" ) );\n        if ( !vkCmdPushDescriptorSetWithTemplate )\n          vkCmdPushDescriptorSetWithTemplate = vkCmdPushDescriptorSetWithTemplateKHR;\n\n        //=== VK_EXT_conditional_rendering ===\n        vkCmdBeginConditionalRenderingEXT = PFN_vkCmdBeginConditionalRenderingEXT( vkGetInstanceProcAddr( instance, \"vkCmdBeginConditionalRenderingEXT\" ) );\n        vkCmdEndConditionalRenderingEXT   = PFN_vkCmdEndConditionalRenderingEXT( vkGetInstanceProcAddr( instance, \"vkCmdEndConditionalRenderingEXT\" ) );\n\n        //=== VK_KHR_descriptor_update_template ===\n        vkCreateDescriptorUpdateTemplateKHR =\n          PFN_vkCreateDescriptorUpdateTemplateKHR( vkGetInstanceProcAddr( instance, \"vkCreateDescriptorUpdateTemplateKHR\" ) );\n        if ( !vkCreateDescriptorUpdateTemplate )\n          vkCreateDescriptorUpdateTemplate = vkCreateDescriptorUpdateTemplateKHR;\n        vkDestroyDescriptorUpdateTemplateKHR =\n          PFN_vkDestroyDescriptorUpdateTemplateKHR( vkGetInstanceProcAddr( instance, \"vkDestroyDescriptorUpdateTemplateKHR\" ) );\n        if ( !vkDestroyDescriptorUpdateTemplate )\n          vkDestroyDescriptorUpdateTemplate = vkDestroyDescriptorUpdateTemplateKHR;\n        vkUpdateDescriptorSetWithTemplateKHR =\n          PFN_vkUpdateDescriptorSetWithTemplateKHR( vkGetInstanceProcAddr( instance, \"vkUpdateDescriptorSetWithTemplateKHR\" ) );\n        if ( !vkUpdateDescriptorSetWithTemplate )\n          vkUpdateDescriptorSetWithTemplate = vkUpdateDescriptorSetWithTemplateKHR;\n\n        //=== VK_NV_clip_space_w_scaling ===\n        vkCmdSetViewportWScalingNV = PFN_vkCmdSetViewportWScalingNV( vkGetInstanceProcAddr( instance, \"vkCmdSetViewportWScalingNV\" ) );\n\n        //=== VK_EXT_direct_mode_display ===\n        vkReleaseDisplayEXT = PFN_vkReleaseDisplayEXT( vkGetInstanceProcAddr( instance, \"vkReleaseDisplayEXT\" ) );\n\n#if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )\n        //=== VK_EXT_acquire_xlib_display ===\n        vkAcquireXlibDisplayEXT    = PFN_vkAcquireXlibDisplayEXT( vkGetInstanceProcAddr( instance, \"vkAcquireXlibDisplayEXT\" ) );\n        vkGetRandROutputDisplayEXT = PFN_vkGetRandROutputDisplayEXT( vkGetInstanceProcAddr( instance, \"vkGetRandROutputDisplayEXT\" ) );\n#endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/\n\n        //=== VK_EXT_display_surface_counter ===\n        vkGetPhysicalDeviceSurfaceCapabilities2EXT =\n          PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSurfaceCapabilities2EXT\" ) );\n\n        //=== VK_EXT_display_control ===\n        vkDisplayPowerControlEXT  = PFN_vkDisplayPowerControlEXT( vkGetInstanceProcAddr( instance, \"vkDisplayPowerControlEXT\" ) );\n        vkRegisterDeviceEventEXT  = PFN_vkRegisterDeviceEventEXT( vkGetInstanceProcAddr( instance, \"vkRegisterDeviceEventEXT\" ) );\n        vkRegisterDisplayEventEXT = PFN_vkRegisterDisplayEventEXT( vkGetInstanceProcAddr( instance, \"vkRegisterDisplayEventEXT\" ) );\n        vkGetSwapchainCounterEXT  = PFN_vkGetSwapchainCounterEXT( vkGetInstanceProcAddr( instance, \"vkGetSwapchainCounterEXT\" ) );\n\n        //=== VK_GOOGLE_display_timing ===\n        vkGetRefreshCycleDurationGOOGLE   = PFN_vkGetRefreshCycleDurationGOOGLE( vkGetInstanceProcAddr( instance, \"vkGetRefreshCycleDurationGOOGLE\" ) );\n        vkGetPastPresentationTimingGOOGLE = PFN_vkGetPastPresentationTimingGOOGLE( vkGetInstanceProcAddr( instance, \"vkGetPastPresentationTimingGOOGLE\" ) );\n\n        //=== VK_EXT_discard_rectangles ===\n        vkCmdSetDiscardRectangleEXT       = PFN_vkCmdSetDiscardRectangleEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetDiscardRectangleEXT\" ) );\n        vkCmdSetDiscardRectangleEnableEXT = PFN_vkCmdSetDiscardRectangleEnableEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetDiscardRectangleEnableEXT\" ) );\n        vkCmdSetDiscardRectangleModeEXT   = PFN_vkCmdSetDiscardRectangleModeEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetDiscardRectangleModeEXT\" ) );\n\n        //=== VK_EXT_hdr_metadata ===\n        vkSetHdrMetadataEXT = PFN_vkSetHdrMetadataEXT( vkGetInstanceProcAddr( instance, \"vkSetHdrMetadataEXT\" ) );\n\n        //=== VK_KHR_create_renderpass2 ===\n        vkCreateRenderPass2KHR = PFN_vkCreateRenderPass2KHR( vkGetInstanceProcAddr( instance, \"vkCreateRenderPass2KHR\" ) );\n        if ( !vkCreateRenderPass2 )\n          vkCreateRenderPass2 = vkCreateRenderPass2KHR;\n        vkCmdBeginRenderPass2KHR = PFN_vkCmdBeginRenderPass2KHR( vkGetInstanceProcAddr( instance, \"vkCmdBeginRenderPass2KHR\" ) );\n        if ( !vkCmdBeginRenderPass2 )\n          vkCmdBeginRenderPass2 = vkCmdBeginRenderPass2KHR;\n        vkCmdNextSubpass2KHR = PFN_vkCmdNextSubpass2KHR( vkGetInstanceProcAddr( instance, \"vkCmdNextSubpass2KHR\" ) );\n        if ( !vkCmdNextSubpass2 )\n          vkCmdNextSubpass2 = vkCmdNextSubpass2KHR;\n        vkCmdEndRenderPass2KHR = PFN_vkCmdEndRenderPass2KHR( vkGetInstanceProcAddr( instance, \"vkCmdEndRenderPass2KHR\" ) );\n        if ( !vkCmdEndRenderPass2 )\n          vkCmdEndRenderPass2 = vkCmdEndRenderPass2KHR;\n\n        //=== VK_KHR_shared_presentable_image ===\n        vkGetSwapchainStatusKHR = PFN_vkGetSwapchainStatusKHR( vkGetInstanceProcAddr( instance, \"vkGetSwapchainStatusKHR\" ) );\n\n        //=== VK_KHR_external_fence_capabilities ===\n        vkGetPhysicalDeviceExternalFencePropertiesKHR =\n          PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceExternalFencePropertiesKHR\" ) );\n        if ( !vkGetPhysicalDeviceExternalFenceProperties )\n          vkGetPhysicalDeviceExternalFenceProperties = vkGetPhysicalDeviceExternalFencePropertiesKHR;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n        //=== VK_KHR_external_fence_win32 ===\n        vkImportFenceWin32HandleKHR = PFN_vkImportFenceWin32HandleKHR( vkGetInstanceProcAddr( instance, \"vkImportFenceWin32HandleKHR\" ) );\n        vkGetFenceWin32HandleKHR    = PFN_vkGetFenceWin32HandleKHR( vkGetInstanceProcAddr( instance, \"vkGetFenceWin32HandleKHR\" ) );\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n        //=== VK_KHR_external_fence_fd ===\n        vkImportFenceFdKHR = PFN_vkImportFenceFdKHR( vkGetInstanceProcAddr( instance, \"vkImportFenceFdKHR\" ) );\n        vkGetFenceFdKHR    = PFN_vkGetFenceFdKHR( vkGetInstanceProcAddr( instance, \"vkGetFenceFdKHR\" ) );\n\n        //=== VK_KHR_performance_query ===\n        vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR = PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(\n          vkGetInstanceProcAddr( instance, \"vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR\" ) );\n        vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR = PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(\n          vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR\" ) );\n        vkAcquireProfilingLockKHR = PFN_vkAcquireProfilingLockKHR( vkGetInstanceProcAddr( instance, \"vkAcquireProfilingLockKHR\" ) );\n        vkReleaseProfilingLockKHR = PFN_vkReleaseProfilingLockKHR( vkGetInstanceProcAddr( instance, \"vkReleaseProfilingLockKHR\" ) );\n\n        //=== VK_KHR_get_surface_capabilities2 ===\n        vkGetPhysicalDeviceSurfaceCapabilities2KHR =\n          PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSurfaceCapabilities2KHR\" ) );\n        vkGetPhysicalDeviceSurfaceFormats2KHR =\n          PFN_vkGetPhysicalDeviceSurfaceFormats2KHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSurfaceFormats2KHR\" ) );\n\n        //=== VK_KHR_get_display_properties2 ===\n        vkGetPhysicalDeviceDisplayProperties2KHR =\n          PFN_vkGetPhysicalDeviceDisplayProperties2KHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceDisplayProperties2KHR\" ) );\n        vkGetPhysicalDeviceDisplayPlaneProperties2KHR =\n          PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceDisplayPlaneProperties2KHR\" ) );\n        vkGetDisplayModeProperties2KHR    = PFN_vkGetDisplayModeProperties2KHR( vkGetInstanceProcAddr( instance, \"vkGetDisplayModeProperties2KHR\" ) );\n        vkGetDisplayPlaneCapabilities2KHR = PFN_vkGetDisplayPlaneCapabilities2KHR( vkGetInstanceProcAddr( instance, \"vkGetDisplayPlaneCapabilities2KHR\" ) );\n\n#if defined( VK_USE_PLATFORM_IOS_MVK )\n        //=== VK_MVK_ios_surface ===\n        vkCreateIOSSurfaceMVK = PFN_vkCreateIOSSurfaceMVK( vkGetInstanceProcAddr( instance, \"vkCreateIOSSurfaceMVK\" ) );\n#endif /*VK_USE_PLATFORM_IOS_MVK*/\n\n#if defined( VK_USE_PLATFORM_MACOS_MVK )\n        //=== VK_MVK_macos_surface ===\n        vkCreateMacOSSurfaceMVK = PFN_vkCreateMacOSSurfaceMVK( vkGetInstanceProcAddr( instance, \"vkCreateMacOSSurfaceMVK\" ) );\n#endif /*VK_USE_PLATFORM_MACOS_MVK*/\n\n        //=== VK_EXT_debug_utils ===\n        vkSetDebugUtilsObjectNameEXT    = PFN_vkSetDebugUtilsObjectNameEXT( vkGetInstanceProcAddr( instance, \"vkSetDebugUtilsObjectNameEXT\" ) );\n        vkSetDebugUtilsObjectTagEXT     = PFN_vkSetDebugUtilsObjectTagEXT( vkGetInstanceProcAddr( instance, \"vkSetDebugUtilsObjectTagEXT\" ) );\n        vkQueueBeginDebugUtilsLabelEXT  = PFN_vkQueueBeginDebugUtilsLabelEXT( vkGetInstanceProcAddr( instance, \"vkQueueBeginDebugUtilsLabelEXT\" ) );\n        vkQueueEndDebugUtilsLabelEXT    = PFN_vkQueueEndDebugUtilsLabelEXT( vkGetInstanceProcAddr( instance, \"vkQueueEndDebugUtilsLabelEXT\" ) );\n        vkQueueInsertDebugUtilsLabelEXT = PFN_vkQueueInsertDebugUtilsLabelEXT( vkGetInstanceProcAddr( instance, \"vkQueueInsertDebugUtilsLabelEXT\" ) );\n        vkCmdBeginDebugUtilsLabelEXT    = PFN_vkCmdBeginDebugUtilsLabelEXT( vkGetInstanceProcAddr( instance, \"vkCmdBeginDebugUtilsLabelEXT\" ) );\n        vkCmdEndDebugUtilsLabelEXT      = PFN_vkCmdEndDebugUtilsLabelEXT( vkGetInstanceProcAddr( instance, \"vkCmdEndDebugUtilsLabelEXT\" ) );\n        vkCmdInsertDebugUtilsLabelEXT   = PFN_vkCmdInsertDebugUtilsLabelEXT( vkGetInstanceProcAddr( instance, \"vkCmdInsertDebugUtilsLabelEXT\" ) );\n        vkCreateDebugUtilsMessengerEXT  = PFN_vkCreateDebugUtilsMessengerEXT( vkGetInstanceProcAddr( instance, \"vkCreateDebugUtilsMessengerEXT\" ) );\n        vkDestroyDebugUtilsMessengerEXT = PFN_vkDestroyDebugUtilsMessengerEXT( vkGetInstanceProcAddr( instance, \"vkDestroyDebugUtilsMessengerEXT\" ) );\n        vkSubmitDebugUtilsMessageEXT    = PFN_vkSubmitDebugUtilsMessageEXT( vkGetInstanceProcAddr( instance, \"vkSubmitDebugUtilsMessageEXT\" ) );\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n        //=== VK_ANDROID_external_memory_android_hardware_buffer ===\n        vkGetAndroidHardwareBufferPropertiesANDROID =\n          PFN_vkGetAndroidHardwareBufferPropertiesANDROID( vkGetInstanceProcAddr( instance, \"vkGetAndroidHardwareBufferPropertiesANDROID\" ) );\n        vkGetMemoryAndroidHardwareBufferANDROID =\n          PFN_vkGetMemoryAndroidHardwareBufferANDROID( vkGetInstanceProcAddr( instance, \"vkGetMemoryAndroidHardwareBufferANDROID\" ) );\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n        //=== VK_AMDX_shader_enqueue ===\n        vkCreateExecutionGraphPipelinesAMDX =\n          PFN_vkCreateExecutionGraphPipelinesAMDX( vkGetInstanceProcAddr( instance, \"vkCreateExecutionGraphPipelinesAMDX\" ) );\n        vkGetExecutionGraphPipelineScratchSizeAMDX =\n          PFN_vkGetExecutionGraphPipelineScratchSizeAMDX( vkGetInstanceProcAddr( instance, \"vkGetExecutionGraphPipelineScratchSizeAMDX\" ) );\n        vkGetExecutionGraphPipelineNodeIndexAMDX =\n          PFN_vkGetExecutionGraphPipelineNodeIndexAMDX( vkGetInstanceProcAddr( instance, \"vkGetExecutionGraphPipelineNodeIndexAMDX\" ) );\n        vkCmdInitializeGraphScratchMemoryAMDX =\n          PFN_vkCmdInitializeGraphScratchMemoryAMDX( vkGetInstanceProcAddr( instance, \"vkCmdInitializeGraphScratchMemoryAMDX\" ) );\n        vkCmdDispatchGraphAMDX         = PFN_vkCmdDispatchGraphAMDX( vkGetInstanceProcAddr( instance, \"vkCmdDispatchGraphAMDX\" ) );\n        vkCmdDispatchGraphIndirectAMDX = PFN_vkCmdDispatchGraphIndirectAMDX( vkGetInstanceProcAddr( instance, \"vkCmdDispatchGraphIndirectAMDX\" ) );\n        vkCmdDispatchGraphIndirectCountAMDX =\n          PFN_vkCmdDispatchGraphIndirectCountAMDX( vkGetInstanceProcAddr( instance, \"vkCmdDispatchGraphIndirectCountAMDX\" ) );\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n        //=== VK_EXT_sample_locations ===\n        vkCmdSetSampleLocationsEXT = PFN_vkCmdSetSampleLocationsEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetSampleLocationsEXT\" ) );\n        vkGetPhysicalDeviceMultisamplePropertiesEXT =\n          PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceMultisamplePropertiesEXT\" ) );\n\n        //=== VK_KHR_get_memory_requirements2 ===\n        vkGetImageMemoryRequirements2KHR = PFN_vkGetImageMemoryRequirements2KHR( vkGetInstanceProcAddr( instance, \"vkGetImageMemoryRequirements2KHR\" ) );\n        if ( !vkGetImageMemoryRequirements2 )\n          vkGetImageMemoryRequirements2 = vkGetImageMemoryRequirements2KHR;\n        vkGetBufferMemoryRequirements2KHR = PFN_vkGetBufferMemoryRequirements2KHR( vkGetInstanceProcAddr( instance, \"vkGetBufferMemoryRequirements2KHR\" ) );\n        if ( !vkGetBufferMemoryRequirements2 )\n          vkGetBufferMemoryRequirements2 = vkGetBufferMemoryRequirements2KHR;\n        vkGetImageSparseMemoryRequirements2KHR =\n          PFN_vkGetImageSparseMemoryRequirements2KHR( vkGetInstanceProcAddr( instance, \"vkGetImageSparseMemoryRequirements2KHR\" ) );\n        if ( !vkGetImageSparseMemoryRequirements2 )\n          vkGetImageSparseMemoryRequirements2 = vkGetImageSparseMemoryRequirements2KHR;\n\n        //=== VK_KHR_acceleration_structure ===\n        vkCreateAccelerationStructureKHR  = PFN_vkCreateAccelerationStructureKHR( vkGetInstanceProcAddr( instance, \"vkCreateAccelerationStructureKHR\" ) );\n        vkDestroyAccelerationStructureKHR = PFN_vkDestroyAccelerationStructureKHR( vkGetInstanceProcAddr( instance, \"vkDestroyAccelerationStructureKHR\" ) );\n        vkCmdBuildAccelerationStructuresKHR =\n          PFN_vkCmdBuildAccelerationStructuresKHR( vkGetInstanceProcAddr( instance, \"vkCmdBuildAccelerationStructuresKHR\" ) );\n        vkCmdBuildAccelerationStructuresIndirectKHR =\n          PFN_vkCmdBuildAccelerationStructuresIndirectKHR( vkGetInstanceProcAddr( instance, \"vkCmdBuildAccelerationStructuresIndirectKHR\" ) );\n        vkBuildAccelerationStructuresKHR = PFN_vkBuildAccelerationStructuresKHR( vkGetInstanceProcAddr( instance, \"vkBuildAccelerationStructuresKHR\" ) );\n        vkCopyAccelerationStructureKHR   = PFN_vkCopyAccelerationStructureKHR( vkGetInstanceProcAddr( instance, \"vkCopyAccelerationStructureKHR\" ) );\n        vkCopyAccelerationStructureToMemoryKHR =\n          PFN_vkCopyAccelerationStructureToMemoryKHR( vkGetInstanceProcAddr( instance, \"vkCopyAccelerationStructureToMemoryKHR\" ) );\n        vkCopyMemoryToAccelerationStructureKHR =\n          PFN_vkCopyMemoryToAccelerationStructureKHR( vkGetInstanceProcAddr( instance, \"vkCopyMemoryToAccelerationStructureKHR\" ) );\n        vkWriteAccelerationStructuresPropertiesKHR =\n          PFN_vkWriteAccelerationStructuresPropertiesKHR( vkGetInstanceProcAddr( instance, \"vkWriteAccelerationStructuresPropertiesKHR\" ) );\n        vkCmdCopyAccelerationStructureKHR = PFN_vkCmdCopyAccelerationStructureKHR( vkGetInstanceProcAddr( instance, \"vkCmdCopyAccelerationStructureKHR\" ) );\n        vkCmdCopyAccelerationStructureToMemoryKHR =\n          PFN_vkCmdCopyAccelerationStructureToMemoryKHR( vkGetInstanceProcAddr( instance, \"vkCmdCopyAccelerationStructureToMemoryKHR\" ) );\n        vkCmdCopyMemoryToAccelerationStructureKHR =\n          PFN_vkCmdCopyMemoryToAccelerationStructureKHR( vkGetInstanceProcAddr( instance, \"vkCmdCopyMemoryToAccelerationStructureKHR\" ) );\n        vkGetAccelerationStructureDeviceAddressKHR =\n          PFN_vkGetAccelerationStructureDeviceAddressKHR( vkGetInstanceProcAddr( instance, \"vkGetAccelerationStructureDeviceAddressKHR\" ) );\n        vkCmdWriteAccelerationStructuresPropertiesKHR =\n          PFN_vkCmdWriteAccelerationStructuresPropertiesKHR( vkGetInstanceProcAddr( instance, \"vkCmdWriteAccelerationStructuresPropertiesKHR\" ) );\n        vkGetDeviceAccelerationStructureCompatibilityKHR =\n          PFN_vkGetDeviceAccelerationStructureCompatibilityKHR( vkGetInstanceProcAddr( instance, \"vkGetDeviceAccelerationStructureCompatibilityKHR\" ) );\n        vkGetAccelerationStructureBuildSizesKHR =\n          PFN_vkGetAccelerationStructureBuildSizesKHR( vkGetInstanceProcAddr( instance, \"vkGetAccelerationStructureBuildSizesKHR\" ) );\n\n        //=== VK_KHR_ray_tracing_pipeline ===\n        vkCmdTraceRaysKHR              = PFN_vkCmdTraceRaysKHR( vkGetInstanceProcAddr( instance, \"vkCmdTraceRaysKHR\" ) );\n        vkCreateRayTracingPipelinesKHR = PFN_vkCreateRayTracingPipelinesKHR( vkGetInstanceProcAddr( instance, \"vkCreateRayTracingPipelinesKHR\" ) );\n        vkGetRayTracingShaderGroupHandlesKHR =\n          PFN_vkGetRayTracingShaderGroupHandlesKHR( vkGetInstanceProcAddr( instance, \"vkGetRayTracingShaderGroupHandlesKHR\" ) );\n        vkGetRayTracingCaptureReplayShaderGroupHandlesKHR =\n          PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR( vkGetInstanceProcAddr( instance, \"vkGetRayTracingCaptureReplayShaderGroupHandlesKHR\" ) );\n        vkCmdTraceRaysIndirectKHR = PFN_vkCmdTraceRaysIndirectKHR( vkGetInstanceProcAddr( instance, \"vkCmdTraceRaysIndirectKHR\" ) );\n        vkGetRayTracingShaderGroupStackSizeKHR =\n          PFN_vkGetRayTracingShaderGroupStackSizeKHR( vkGetInstanceProcAddr( instance, \"vkGetRayTracingShaderGroupStackSizeKHR\" ) );\n        vkCmdSetRayTracingPipelineStackSizeKHR =\n          PFN_vkCmdSetRayTracingPipelineStackSizeKHR( vkGetInstanceProcAddr( instance, \"vkCmdSetRayTracingPipelineStackSizeKHR\" ) );\n\n        //=== VK_KHR_sampler_ycbcr_conversion ===\n        vkCreateSamplerYcbcrConversionKHR = PFN_vkCreateSamplerYcbcrConversionKHR( vkGetInstanceProcAddr( instance, \"vkCreateSamplerYcbcrConversionKHR\" ) );\n        if ( !vkCreateSamplerYcbcrConversion )\n          vkCreateSamplerYcbcrConversion = vkCreateSamplerYcbcrConversionKHR;\n        vkDestroySamplerYcbcrConversionKHR = PFN_vkDestroySamplerYcbcrConversionKHR( vkGetInstanceProcAddr( instance, \"vkDestroySamplerYcbcrConversionKHR\" ) );\n        if ( !vkDestroySamplerYcbcrConversion )\n          vkDestroySamplerYcbcrConversion = vkDestroySamplerYcbcrConversionKHR;\n\n        //=== VK_KHR_bind_memory2 ===\n        vkBindBufferMemory2KHR = PFN_vkBindBufferMemory2KHR( vkGetInstanceProcAddr( instance, \"vkBindBufferMemory2KHR\" ) );\n        if ( !vkBindBufferMemory2 )\n          vkBindBufferMemory2 = vkBindBufferMemory2KHR;\n        vkBindImageMemory2KHR = PFN_vkBindImageMemory2KHR( vkGetInstanceProcAddr( instance, \"vkBindImageMemory2KHR\" ) );\n        if ( !vkBindImageMemory2 )\n          vkBindImageMemory2 = vkBindImageMemory2KHR;\n\n        //=== VK_EXT_image_drm_format_modifier ===\n        vkGetImageDrmFormatModifierPropertiesEXT =\n          PFN_vkGetImageDrmFormatModifierPropertiesEXT( vkGetInstanceProcAddr( instance, \"vkGetImageDrmFormatModifierPropertiesEXT\" ) );\n\n        //=== VK_EXT_validation_cache ===\n        vkCreateValidationCacheEXT  = PFN_vkCreateValidationCacheEXT( vkGetInstanceProcAddr( instance, \"vkCreateValidationCacheEXT\" ) );\n        vkDestroyValidationCacheEXT = PFN_vkDestroyValidationCacheEXT( vkGetInstanceProcAddr( instance, \"vkDestroyValidationCacheEXT\" ) );\n        vkMergeValidationCachesEXT  = PFN_vkMergeValidationCachesEXT( vkGetInstanceProcAddr( instance, \"vkMergeValidationCachesEXT\" ) );\n        vkGetValidationCacheDataEXT = PFN_vkGetValidationCacheDataEXT( vkGetInstanceProcAddr( instance, \"vkGetValidationCacheDataEXT\" ) );\n\n        //=== VK_NV_shading_rate_image ===\n        vkCmdBindShadingRateImageNV = PFN_vkCmdBindShadingRateImageNV( vkGetInstanceProcAddr( instance, \"vkCmdBindShadingRateImageNV\" ) );\n        vkCmdSetViewportShadingRatePaletteNV =\n          PFN_vkCmdSetViewportShadingRatePaletteNV( vkGetInstanceProcAddr( instance, \"vkCmdSetViewportShadingRatePaletteNV\" ) );\n        vkCmdSetCoarseSampleOrderNV = PFN_vkCmdSetCoarseSampleOrderNV( vkGetInstanceProcAddr( instance, \"vkCmdSetCoarseSampleOrderNV\" ) );\n\n        //=== VK_NV_ray_tracing ===\n        vkCreateAccelerationStructureNV  = PFN_vkCreateAccelerationStructureNV( vkGetInstanceProcAddr( instance, \"vkCreateAccelerationStructureNV\" ) );\n        vkDestroyAccelerationStructureNV = PFN_vkDestroyAccelerationStructureNV( vkGetInstanceProcAddr( instance, \"vkDestroyAccelerationStructureNV\" ) );\n        vkGetAccelerationStructureMemoryRequirementsNV =\n          PFN_vkGetAccelerationStructureMemoryRequirementsNV( vkGetInstanceProcAddr( instance, \"vkGetAccelerationStructureMemoryRequirementsNV\" ) );\n        vkBindAccelerationStructureMemoryNV =\n          PFN_vkBindAccelerationStructureMemoryNV( vkGetInstanceProcAddr( instance, \"vkBindAccelerationStructureMemoryNV\" ) );\n        vkCmdBuildAccelerationStructureNV = PFN_vkCmdBuildAccelerationStructureNV( vkGetInstanceProcAddr( instance, \"vkCmdBuildAccelerationStructureNV\" ) );\n        vkCmdCopyAccelerationStructureNV  = PFN_vkCmdCopyAccelerationStructureNV( vkGetInstanceProcAddr( instance, \"vkCmdCopyAccelerationStructureNV\" ) );\n        vkCmdTraceRaysNV                  = PFN_vkCmdTraceRaysNV( vkGetInstanceProcAddr( instance, \"vkCmdTraceRaysNV\" ) );\n        vkCreateRayTracingPipelinesNV     = PFN_vkCreateRayTracingPipelinesNV( vkGetInstanceProcAddr( instance, \"vkCreateRayTracingPipelinesNV\" ) );\n        vkGetRayTracingShaderGroupHandlesNV =\n          PFN_vkGetRayTracingShaderGroupHandlesNV( vkGetInstanceProcAddr( instance, \"vkGetRayTracingShaderGroupHandlesNV\" ) );\n        if ( !vkGetRayTracingShaderGroupHandlesKHR )\n          vkGetRayTracingShaderGroupHandlesKHR = vkGetRayTracingShaderGroupHandlesNV;\n        vkGetAccelerationStructureHandleNV = PFN_vkGetAccelerationStructureHandleNV( vkGetInstanceProcAddr( instance, \"vkGetAccelerationStructureHandleNV\" ) );\n        vkCmdWriteAccelerationStructuresPropertiesNV =\n          PFN_vkCmdWriteAccelerationStructuresPropertiesNV( vkGetInstanceProcAddr( instance, \"vkCmdWriteAccelerationStructuresPropertiesNV\" ) );\n        vkCompileDeferredNV = PFN_vkCompileDeferredNV( vkGetInstanceProcAddr( instance, \"vkCompileDeferredNV\" ) );\n\n        //=== VK_KHR_maintenance3 ===\n        vkGetDescriptorSetLayoutSupportKHR = PFN_vkGetDescriptorSetLayoutSupportKHR( vkGetInstanceProcAddr( instance, \"vkGetDescriptorSetLayoutSupportKHR\" ) );\n        if ( !vkGetDescriptorSetLayoutSupport )\n          vkGetDescriptorSetLayoutSupport = vkGetDescriptorSetLayoutSupportKHR;\n\n        //=== VK_KHR_draw_indirect_count ===\n        vkCmdDrawIndirectCountKHR = PFN_vkCmdDrawIndirectCountKHR( vkGetInstanceProcAddr( instance, \"vkCmdDrawIndirectCountKHR\" ) );\n        if ( !vkCmdDrawIndirectCount )\n          vkCmdDrawIndirectCount = vkCmdDrawIndirectCountKHR;\n        vkCmdDrawIndexedIndirectCountKHR = PFN_vkCmdDrawIndexedIndirectCountKHR( vkGetInstanceProcAddr( instance, \"vkCmdDrawIndexedIndirectCountKHR\" ) );\n        if ( !vkCmdDrawIndexedIndirectCount )\n          vkCmdDrawIndexedIndirectCount = vkCmdDrawIndexedIndirectCountKHR;\n\n        //=== VK_EXT_external_memory_host ===\n        vkGetMemoryHostPointerPropertiesEXT =\n          PFN_vkGetMemoryHostPointerPropertiesEXT( vkGetInstanceProcAddr( instance, \"vkGetMemoryHostPointerPropertiesEXT\" ) );\n\n        //=== VK_AMD_buffer_marker ===\n        vkCmdWriteBufferMarkerAMD  = PFN_vkCmdWriteBufferMarkerAMD( vkGetInstanceProcAddr( instance, \"vkCmdWriteBufferMarkerAMD\" ) );\n        vkCmdWriteBufferMarker2AMD = PFN_vkCmdWriteBufferMarker2AMD( vkGetInstanceProcAddr( instance, \"vkCmdWriteBufferMarker2AMD\" ) );\n\n        //=== VK_EXT_calibrated_timestamps ===\n        vkGetPhysicalDeviceCalibrateableTimeDomainsEXT =\n          PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceCalibrateableTimeDomainsEXT\" ) );\n        if ( !vkGetPhysicalDeviceCalibrateableTimeDomainsKHR )\n          vkGetPhysicalDeviceCalibrateableTimeDomainsKHR = vkGetPhysicalDeviceCalibrateableTimeDomainsEXT;\n        vkGetCalibratedTimestampsEXT = PFN_vkGetCalibratedTimestampsEXT( vkGetInstanceProcAddr( instance, \"vkGetCalibratedTimestampsEXT\" ) );\n        if ( !vkGetCalibratedTimestampsKHR )\n          vkGetCalibratedTimestampsKHR = vkGetCalibratedTimestampsEXT;\n\n        //=== VK_NV_mesh_shader ===\n        vkCmdDrawMeshTasksNV              = PFN_vkCmdDrawMeshTasksNV( vkGetInstanceProcAddr( instance, \"vkCmdDrawMeshTasksNV\" ) );\n        vkCmdDrawMeshTasksIndirectNV      = PFN_vkCmdDrawMeshTasksIndirectNV( vkGetInstanceProcAddr( instance, \"vkCmdDrawMeshTasksIndirectNV\" ) );\n        vkCmdDrawMeshTasksIndirectCountNV = PFN_vkCmdDrawMeshTasksIndirectCountNV( vkGetInstanceProcAddr( instance, \"vkCmdDrawMeshTasksIndirectCountNV\" ) );\n\n        //=== VK_NV_scissor_exclusive ===\n        vkCmdSetExclusiveScissorEnableNV = PFN_vkCmdSetExclusiveScissorEnableNV( vkGetInstanceProcAddr( instance, \"vkCmdSetExclusiveScissorEnableNV\" ) );\n        vkCmdSetExclusiveScissorNV       = PFN_vkCmdSetExclusiveScissorNV( vkGetInstanceProcAddr( instance, \"vkCmdSetExclusiveScissorNV\" ) );\n\n        //=== VK_NV_device_diagnostic_checkpoints ===\n        vkCmdSetCheckpointNV        = PFN_vkCmdSetCheckpointNV( vkGetInstanceProcAddr( instance, \"vkCmdSetCheckpointNV\" ) );\n        vkGetQueueCheckpointDataNV  = PFN_vkGetQueueCheckpointDataNV( vkGetInstanceProcAddr( instance, \"vkGetQueueCheckpointDataNV\" ) );\n        vkGetQueueCheckpointData2NV = PFN_vkGetQueueCheckpointData2NV( vkGetInstanceProcAddr( instance, \"vkGetQueueCheckpointData2NV\" ) );\n\n        //=== VK_KHR_timeline_semaphore ===\n        vkGetSemaphoreCounterValueKHR = PFN_vkGetSemaphoreCounterValueKHR( vkGetInstanceProcAddr( instance, \"vkGetSemaphoreCounterValueKHR\" ) );\n        if ( !vkGetSemaphoreCounterValue )\n          vkGetSemaphoreCounterValue = vkGetSemaphoreCounterValueKHR;\n        vkWaitSemaphoresKHR = PFN_vkWaitSemaphoresKHR( vkGetInstanceProcAddr( instance, \"vkWaitSemaphoresKHR\" ) );\n        if ( !vkWaitSemaphores )\n          vkWaitSemaphores = vkWaitSemaphoresKHR;\n        vkSignalSemaphoreKHR = PFN_vkSignalSemaphoreKHR( vkGetInstanceProcAddr( instance, \"vkSignalSemaphoreKHR\" ) );\n        if ( !vkSignalSemaphore )\n          vkSignalSemaphore = vkSignalSemaphoreKHR;\n\n        //=== VK_INTEL_performance_query ===\n        vkInitializePerformanceApiINTEL   = PFN_vkInitializePerformanceApiINTEL( vkGetInstanceProcAddr( instance, \"vkInitializePerformanceApiINTEL\" ) );\n        vkUninitializePerformanceApiINTEL = PFN_vkUninitializePerformanceApiINTEL( vkGetInstanceProcAddr( instance, \"vkUninitializePerformanceApiINTEL\" ) );\n        vkCmdSetPerformanceMarkerINTEL    = PFN_vkCmdSetPerformanceMarkerINTEL( vkGetInstanceProcAddr( instance, \"vkCmdSetPerformanceMarkerINTEL\" ) );\n        vkCmdSetPerformanceStreamMarkerINTEL =\n          PFN_vkCmdSetPerformanceStreamMarkerINTEL( vkGetInstanceProcAddr( instance, \"vkCmdSetPerformanceStreamMarkerINTEL\" ) );\n        vkCmdSetPerformanceOverrideINTEL = PFN_vkCmdSetPerformanceOverrideINTEL( vkGetInstanceProcAddr( instance, \"vkCmdSetPerformanceOverrideINTEL\" ) );\n        vkAcquirePerformanceConfigurationINTEL =\n          PFN_vkAcquirePerformanceConfigurationINTEL( vkGetInstanceProcAddr( instance, \"vkAcquirePerformanceConfigurationINTEL\" ) );\n        vkReleasePerformanceConfigurationINTEL =\n          PFN_vkReleasePerformanceConfigurationINTEL( vkGetInstanceProcAddr( instance, \"vkReleasePerformanceConfigurationINTEL\" ) );\n        vkQueueSetPerformanceConfigurationINTEL =\n          PFN_vkQueueSetPerformanceConfigurationINTEL( vkGetInstanceProcAddr( instance, \"vkQueueSetPerformanceConfigurationINTEL\" ) );\n        vkGetPerformanceParameterINTEL = PFN_vkGetPerformanceParameterINTEL( vkGetInstanceProcAddr( instance, \"vkGetPerformanceParameterINTEL\" ) );\n\n        //=== VK_AMD_display_native_hdr ===\n        vkSetLocalDimmingAMD = PFN_vkSetLocalDimmingAMD( vkGetInstanceProcAddr( instance, \"vkSetLocalDimmingAMD\" ) );\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n        //=== VK_FUCHSIA_imagepipe_surface ===\n        vkCreateImagePipeSurfaceFUCHSIA = PFN_vkCreateImagePipeSurfaceFUCHSIA( vkGetInstanceProcAddr( instance, \"vkCreateImagePipeSurfaceFUCHSIA\" ) );\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n        //=== VK_EXT_metal_surface ===\n        vkCreateMetalSurfaceEXT = PFN_vkCreateMetalSurfaceEXT( vkGetInstanceProcAddr( instance, \"vkCreateMetalSurfaceEXT\" ) );\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n        //=== VK_KHR_fragment_shading_rate ===\n        vkGetPhysicalDeviceFragmentShadingRatesKHR =\n          PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceFragmentShadingRatesKHR\" ) );\n        vkCmdSetFragmentShadingRateKHR = PFN_vkCmdSetFragmentShadingRateKHR( vkGetInstanceProcAddr( instance, \"vkCmdSetFragmentShadingRateKHR\" ) );\n\n        //=== VK_KHR_dynamic_rendering_local_read ===\n        vkCmdSetRenderingAttachmentLocationsKHR =\n          PFN_vkCmdSetRenderingAttachmentLocationsKHR( vkGetInstanceProcAddr( instance, \"vkCmdSetRenderingAttachmentLocationsKHR\" ) );\n        if ( !vkCmdSetRenderingAttachmentLocations )\n          vkCmdSetRenderingAttachmentLocations = vkCmdSetRenderingAttachmentLocationsKHR;\n        vkCmdSetRenderingInputAttachmentIndicesKHR =\n          PFN_vkCmdSetRenderingInputAttachmentIndicesKHR( vkGetInstanceProcAddr( instance, \"vkCmdSetRenderingInputAttachmentIndicesKHR\" ) );\n        if ( !vkCmdSetRenderingInputAttachmentIndices )\n          vkCmdSetRenderingInputAttachmentIndices = vkCmdSetRenderingInputAttachmentIndicesKHR;\n\n        //=== VK_EXT_buffer_device_address ===\n        vkGetBufferDeviceAddressEXT = PFN_vkGetBufferDeviceAddressEXT( vkGetInstanceProcAddr( instance, \"vkGetBufferDeviceAddressEXT\" ) );\n        if ( !vkGetBufferDeviceAddress )\n          vkGetBufferDeviceAddress = vkGetBufferDeviceAddressEXT;\n\n        //=== VK_EXT_tooling_info ===\n        vkGetPhysicalDeviceToolPropertiesEXT =\n          PFN_vkGetPhysicalDeviceToolPropertiesEXT( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceToolPropertiesEXT\" ) );\n        if ( !vkGetPhysicalDeviceToolProperties )\n          vkGetPhysicalDeviceToolProperties = vkGetPhysicalDeviceToolPropertiesEXT;\n\n        //=== VK_KHR_present_wait ===\n        vkWaitForPresentKHR = PFN_vkWaitForPresentKHR( vkGetInstanceProcAddr( instance, \"vkWaitForPresentKHR\" ) );\n\n        //=== VK_NV_cooperative_matrix ===\n        vkGetPhysicalDeviceCooperativeMatrixPropertiesNV =\n          PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceCooperativeMatrixPropertiesNV\" ) );\n\n        //=== VK_NV_coverage_reduction_mode ===\n        vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV = PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(\n          vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV\" ) );\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n        //=== VK_EXT_full_screen_exclusive ===\n        vkGetPhysicalDeviceSurfacePresentModes2EXT =\n          PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSurfacePresentModes2EXT\" ) );\n        vkAcquireFullScreenExclusiveModeEXT =\n          PFN_vkAcquireFullScreenExclusiveModeEXT( vkGetInstanceProcAddr( instance, \"vkAcquireFullScreenExclusiveModeEXT\" ) );\n        vkReleaseFullScreenExclusiveModeEXT =\n          PFN_vkReleaseFullScreenExclusiveModeEXT( vkGetInstanceProcAddr( instance, \"vkReleaseFullScreenExclusiveModeEXT\" ) );\n        vkGetDeviceGroupSurfacePresentModes2EXT =\n          PFN_vkGetDeviceGroupSurfacePresentModes2EXT( vkGetInstanceProcAddr( instance, \"vkGetDeviceGroupSurfacePresentModes2EXT\" ) );\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n        //=== VK_EXT_headless_surface ===\n        vkCreateHeadlessSurfaceEXT = PFN_vkCreateHeadlessSurfaceEXT( vkGetInstanceProcAddr( instance, \"vkCreateHeadlessSurfaceEXT\" ) );\n\n        //=== VK_KHR_buffer_device_address ===\n        vkGetBufferDeviceAddressKHR = PFN_vkGetBufferDeviceAddressKHR( vkGetInstanceProcAddr( instance, \"vkGetBufferDeviceAddressKHR\" ) );\n        if ( !vkGetBufferDeviceAddress )\n          vkGetBufferDeviceAddress = vkGetBufferDeviceAddressKHR;\n        vkGetBufferOpaqueCaptureAddressKHR = PFN_vkGetBufferOpaqueCaptureAddressKHR( vkGetInstanceProcAddr( instance, \"vkGetBufferOpaqueCaptureAddressKHR\" ) );\n        if ( !vkGetBufferOpaqueCaptureAddress )\n          vkGetBufferOpaqueCaptureAddress = vkGetBufferOpaqueCaptureAddressKHR;\n        vkGetDeviceMemoryOpaqueCaptureAddressKHR =\n          PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR( vkGetInstanceProcAddr( instance, \"vkGetDeviceMemoryOpaqueCaptureAddressKHR\" ) );\n        if ( !vkGetDeviceMemoryOpaqueCaptureAddress )\n          vkGetDeviceMemoryOpaqueCaptureAddress = vkGetDeviceMemoryOpaqueCaptureAddressKHR;\n\n        //=== VK_EXT_line_rasterization ===\n        vkCmdSetLineStippleEXT = PFN_vkCmdSetLineStippleEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetLineStippleEXT\" ) );\n        if ( !vkCmdSetLineStipple )\n          vkCmdSetLineStipple = vkCmdSetLineStippleEXT;\n\n        //=== VK_EXT_host_query_reset ===\n        vkResetQueryPoolEXT = PFN_vkResetQueryPoolEXT( vkGetInstanceProcAddr( instance, \"vkResetQueryPoolEXT\" ) );\n        if ( !vkResetQueryPool )\n          vkResetQueryPool = vkResetQueryPoolEXT;\n\n        //=== VK_EXT_extended_dynamic_state ===\n        vkCmdSetCullModeEXT = PFN_vkCmdSetCullModeEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetCullModeEXT\" ) );\n        if ( !vkCmdSetCullMode )\n          vkCmdSetCullMode = vkCmdSetCullModeEXT;\n        vkCmdSetFrontFaceEXT = PFN_vkCmdSetFrontFaceEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetFrontFaceEXT\" ) );\n        if ( !vkCmdSetFrontFace )\n          vkCmdSetFrontFace = vkCmdSetFrontFaceEXT;\n        vkCmdSetPrimitiveTopologyEXT = PFN_vkCmdSetPrimitiveTopologyEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetPrimitiveTopologyEXT\" ) );\n        if ( !vkCmdSetPrimitiveTopology )\n          vkCmdSetPrimitiveTopology = vkCmdSetPrimitiveTopologyEXT;\n        vkCmdSetViewportWithCountEXT = PFN_vkCmdSetViewportWithCountEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetViewportWithCountEXT\" ) );\n        if ( !vkCmdSetViewportWithCount )\n          vkCmdSetViewportWithCount = vkCmdSetViewportWithCountEXT;\n        vkCmdSetScissorWithCountEXT = PFN_vkCmdSetScissorWithCountEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetScissorWithCountEXT\" ) );\n        if ( !vkCmdSetScissorWithCount )\n          vkCmdSetScissorWithCount = vkCmdSetScissorWithCountEXT;\n        vkCmdBindVertexBuffers2EXT = PFN_vkCmdBindVertexBuffers2EXT( vkGetInstanceProcAddr( instance, \"vkCmdBindVertexBuffers2EXT\" ) );\n        if ( !vkCmdBindVertexBuffers2 )\n          vkCmdBindVertexBuffers2 = vkCmdBindVertexBuffers2EXT;\n        vkCmdSetDepthTestEnableEXT = PFN_vkCmdSetDepthTestEnableEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetDepthTestEnableEXT\" ) );\n        if ( !vkCmdSetDepthTestEnable )\n          vkCmdSetDepthTestEnable = vkCmdSetDepthTestEnableEXT;\n        vkCmdSetDepthWriteEnableEXT = PFN_vkCmdSetDepthWriteEnableEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetDepthWriteEnableEXT\" ) );\n        if ( !vkCmdSetDepthWriteEnable )\n          vkCmdSetDepthWriteEnable = vkCmdSetDepthWriteEnableEXT;\n        vkCmdSetDepthCompareOpEXT = PFN_vkCmdSetDepthCompareOpEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetDepthCompareOpEXT\" ) );\n        if ( !vkCmdSetDepthCompareOp )\n          vkCmdSetDepthCompareOp = vkCmdSetDepthCompareOpEXT;\n        vkCmdSetDepthBoundsTestEnableEXT = PFN_vkCmdSetDepthBoundsTestEnableEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetDepthBoundsTestEnableEXT\" ) );\n        if ( !vkCmdSetDepthBoundsTestEnable )\n          vkCmdSetDepthBoundsTestEnable = vkCmdSetDepthBoundsTestEnableEXT;\n        vkCmdSetStencilTestEnableEXT = PFN_vkCmdSetStencilTestEnableEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetStencilTestEnableEXT\" ) );\n        if ( !vkCmdSetStencilTestEnable )\n          vkCmdSetStencilTestEnable = vkCmdSetStencilTestEnableEXT;\n        vkCmdSetStencilOpEXT = PFN_vkCmdSetStencilOpEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetStencilOpEXT\" ) );\n        if ( !vkCmdSetStencilOp )\n          vkCmdSetStencilOp = vkCmdSetStencilOpEXT;\n\n        //=== VK_KHR_deferred_host_operations ===\n        vkCreateDeferredOperationKHR  = PFN_vkCreateDeferredOperationKHR( vkGetInstanceProcAddr( instance, \"vkCreateDeferredOperationKHR\" ) );\n        vkDestroyDeferredOperationKHR = PFN_vkDestroyDeferredOperationKHR( vkGetInstanceProcAddr( instance, \"vkDestroyDeferredOperationKHR\" ) );\n        vkGetDeferredOperationMaxConcurrencyKHR =\n          PFN_vkGetDeferredOperationMaxConcurrencyKHR( vkGetInstanceProcAddr( instance, \"vkGetDeferredOperationMaxConcurrencyKHR\" ) );\n        vkGetDeferredOperationResultKHR = PFN_vkGetDeferredOperationResultKHR( vkGetInstanceProcAddr( instance, \"vkGetDeferredOperationResultKHR\" ) );\n        vkDeferredOperationJoinKHR      = PFN_vkDeferredOperationJoinKHR( vkGetInstanceProcAddr( instance, \"vkDeferredOperationJoinKHR\" ) );\n\n        //=== VK_KHR_pipeline_executable_properties ===\n        vkGetPipelineExecutablePropertiesKHR =\n          PFN_vkGetPipelineExecutablePropertiesKHR( vkGetInstanceProcAddr( instance, \"vkGetPipelineExecutablePropertiesKHR\" ) );\n        vkGetPipelineExecutableStatisticsKHR =\n          PFN_vkGetPipelineExecutableStatisticsKHR( vkGetInstanceProcAddr( instance, \"vkGetPipelineExecutableStatisticsKHR\" ) );\n        vkGetPipelineExecutableInternalRepresentationsKHR =\n          PFN_vkGetPipelineExecutableInternalRepresentationsKHR( vkGetInstanceProcAddr( instance, \"vkGetPipelineExecutableInternalRepresentationsKHR\" ) );\n\n        //=== VK_EXT_host_image_copy ===\n        vkCopyMemoryToImageEXT = PFN_vkCopyMemoryToImageEXT( vkGetInstanceProcAddr( instance, \"vkCopyMemoryToImageEXT\" ) );\n        if ( !vkCopyMemoryToImage )\n          vkCopyMemoryToImage = vkCopyMemoryToImageEXT;\n        vkCopyImageToMemoryEXT = PFN_vkCopyImageToMemoryEXT( vkGetInstanceProcAddr( instance, \"vkCopyImageToMemoryEXT\" ) );\n        if ( !vkCopyImageToMemory )\n          vkCopyImageToMemory = vkCopyImageToMemoryEXT;\n        vkCopyImageToImageEXT = PFN_vkCopyImageToImageEXT( vkGetInstanceProcAddr( instance, \"vkCopyImageToImageEXT\" ) );\n        if ( !vkCopyImageToImage )\n          vkCopyImageToImage = vkCopyImageToImageEXT;\n        vkTransitionImageLayoutEXT = PFN_vkTransitionImageLayoutEXT( vkGetInstanceProcAddr( instance, \"vkTransitionImageLayoutEXT\" ) );\n        if ( !vkTransitionImageLayout )\n          vkTransitionImageLayout = vkTransitionImageLayoutEXT;\n        vkGetImageSubresourceLayout2EXT = PFN_vkGetImageSubresourceLayout2EXT( vkGetInstanceProcAddr( instance, \"vkGetImageSubresourceLayout2EXT\" ) );\n        if ( !vkGetImageSubresourceLayout2 )\n          vkGetImageSubresourceLayout2 = vkGetImageSubresourceLayout2EXT;\n\n        //=== VK_KHR_map_memory2 ===\n        vkMapMemory2KHR = PFN_vkMapMemory2KHR( vkGetInstanceProcAddr( instance, \"vkMapMemory2KHR\" ) );\n        if ( !vkMapMemory2 )\n          vkMapMemory2 = vkMapMemory2KHR;\n        vkUnmapMemory2KHR = PFN_vkUnmapMemory2KHR( vkGetInstanceProcAddr( instance, \"vkUnmapMemory2KHR\" ) );\n        if ( !vkUnmapMemory2 )\n          vkUnmapMemory2 = vkUnmapMemory2KHR;\n\n        //=== VK_EXT_swapchain_maintenance1 ===\n        vkReleaseSwapchainImagesEXT = PFN_vkReleaseSwapchainImagesEXT( vkGetInstanceProcAddr( instance, \"vkReleaseSwapchainImagesEXT\" ) );\n\n        //=== VK_NV_device_generated_commands ===\n        vkGetGeneratedCommandsMemoryRequirementsNV =\n          PFN_vkGetGeneratedCommandsMemoryRequirementsNV( vkGetInstanceProcAddr( instance, \"vkGetGeneratedCommandsMemoryRequirementsNV\" ) );\n        vkCmdPreprocessGeneratedCommandsNV = PFN_vkCmdPreprocessGeneratedCommandsNV( vkGetInstanceProcAddr( instance, \"vkCmdPreprocessGeneratedCommandsNV\" ) );\n        vkCmdExecuteGeneratedCommandsNV    = PFN_vkCmdExecuteGeneratedCommandsNV( vkGetInstanceProcAddr( instance, \"vkCmdExecuteGeneratedCommandsNV\" ) );\n        vkCmdBindPipelineShaderGroupNV     = PFN_vkCmdBindPipelineShaderGroupNV( vkGetInstanceProcAddr( instance, \"vkCmdBindPipelineShaderGroupNV\" ) );\n        vkCreateIndirectCommandsLayoutNV   = PFN_vkCreateIndirectCommandsLayoutNV( vkGetInstanceProcAddr( instance, \"vkCreateIndirectCommandsLayoutNV\" ) );\n        vkDestroyIndirectCommandsLayoutNV  = PFN_vkDestroyIndirectCommandsLayoutNV( vkGetInstanceProcAddr( instance, \"vkDestroyIndirectCommandsLayoutNV\" ) );\n\n        //=== VK_EXT_depth_bias_control ===\n        vkCmdSetDepthBias2EXT = PFN_vkCmdSetDepthBias2EXT( vkGetInstanceProcAddr( instance, \"vkCmdSetDepthBias2EXT\" ) );\n\n        //=== VK_EXT_acquire_drm_display ===\n        vkAcquireDrmDisplayEXT = PFN_vkAcquireDrmDisplayEXT( vkGetInstanceProcAddr( instance, \"vkAcquireDrmDisplayEXT\" ) );\n        vkGetDrmDisplayEXT     = PFN_vkGetDrmDisplayEXT( vkGetInstanceProcAddr( instance, \"vkGetDrmDisplayEXT\" ) );\n\n        //=== VK_EXT_private_data ===\n        vkCreatePrivateDataSlotEXT = PFN_vkCreatePrivateDataSlotEXT( vkGetInstanceProcAddr( instance, \"vkCreatePrivateDataSlotEXT\" ) );\n        if ( !vkCreatePrivateDataSlot )\n          vkCreatePrivateDataSlot = vkCreatePrivateDataSlotEXT;\n        vkDestroyPrivateDataSlotEXT = PFN_vkDestroyPrivateDataSlotEXT( vkGetInstanceProcAddr( instance, \"vkDestroyPrivateDataSlotEXT\" ) );\n        if ( !vkDestroyPrivateDataSlot )\n          vkDestroyPrivateDataSlot = vkDestroyPrivateDataSlotEXT;\n        vkSetPrivateDataEXT = PFN_vkSetPrivateDataEXT( vkGetInstanceProcAddr( instance, \"vkSetPrivateDataEXT\" ) );\n        if ( !vkSetPrivateData )\n          vkSetPrivateData = vkSetPrivateDataEXT;\n        vkGetPrivateDataEXT = PFN_vkGetPrivateDataEXT( vkGetInstanceProcAddr( instance, \"vkGetPrivateDataEXT\" ) );\n        if ( !vkGetPrivateData )\n          vkGetPrivateData = vkGetPrivateDataEXT;\n\n        //=== VK_KHR_video_encode_queue ===\n        vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR = PFN_vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR(\n          vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR\" ) );\n        vkGetEncodedVideoSessionParametersKHR =\n          PFN_vkGetEncodedVideoSessionParametersKHR( vkGetInstanceProcAddr( instance, \"vkGetEncodedVideoSessionParametersKHR\" ) );\n        vkCmdEncodeVideoKHR = PFN_vkCmdEncodeVideoKHR( vkGetInstanceProcAddr( instance, \"vkCmdEncodeVideoKHR\" ) );\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n        //=== VK_NV_cuda_kernel_launch ===\n        vkCreateCudaModuleNV    = PFN_vkCreateCudaModuleNV( vkGetInstanceProcAddr( instance, \"vkCreateCudaModuleNV\" ) );\n        vkGetCudaModuleCacheNV  = PFN_vkGetCudaModuleCacheNV( vkGetInstanceProcAddr( instance, \"vkGetCudaModuleCacheNV\" ) );\n        vkCreateCudaFunctionNV  = PFN_vkCreateCudaFunctionNV( vkGetInstanceProcAddr( instance, \"vkCreateCudaFunctionNV\" ) );\n        vkDestroyCudaModuleNV   = PFN_vkDestroyCudaModuleNV( vkGetInstanceProcAddr( instance, \"vkDestroyCudaModuleNV\" ) );\n        vkDestroyCudaFunctionNV = PFN_vkDestroyCudaFunctionNV( vkGetInstanceProcAddr( instance, \"vkDestroyCudaFunctionNV\" ) );\n        vkCmdCudaLaunchKernelNV = PFN_vkCmdCudaLaunchKernelNV( vkGetInstanceProcAddr( instance, \"vkCmdCudaLaunchKernelNV\" ) );\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n        //=== VK_EXT_metal_objects ===\n        vkExportMetalObjectsEXT = PFN_vkExportMetalObjectsEXT( vkGetInstanceProcAddr( instance, \"vkExportMetalObjectsEXT\" ) );\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n        //=== VK_KHR_synchronization2 ===\n        vkCmdSetEvent2KHR = PFN_vkCmdSetEvent2KHR( vkGetInstanceProcAddr( instance, \"vkCmdSetEvent2KHR\" ) );\n        if ( !vkCmdSetEvent2 )\n          vkCmdSetEvent2 = vkCmdSetEvent2KHR;\n        vkCmdResetEvent2KHR = PFN_vkCmdResetEvent2KHR( vkGetInstanceProcAddr( instance, \"vkCmdResetEvent2KHR\" ) );\n        if ( !vkCmdResetEvent2 )\n          vkCmdResetEvent2 = vkCmdResetEvent2KHR;\n        vkCmdWaitEvents2KHR = PFN_vkCmdWaitEvents2KHR( vkGetInstanceProcAddr( instance, \"vkCmdWaitEvents2KHR\" ) );\n        if ( !vkCmdWaitEvents2 )\n          vkCmdWaitEvents2 = vkCmdWaitEvents2KHR;\n        vkCmdPipelineBarrier2KHR = PFN_vkCmdPipelineBarrier2KHR( vkGetInstanceProcAddr( instance, \"vkCmdPipelineBarrier2KHR\" ) );\n        if ( !vkCmdPipelineBarrier2 )\n          vkCmdPipelineBarrier2 = vkCmdPipelineBarrier2KHR;\n        vkCmdWriteTimestamp2KHR = PFN_vkCmdWriteTimestamp2KHR( vkGetInstanceProcAddr( instance, \"vkCmdWriteTimestamp2KHR\" ) );\n        if ( !vkCmdWriteTimestamp2 )\n          vkCmdWriteTimestamp2 = vkCmdWriteTimestamp2KHR;\n        vkQueueSubmit2KHR = PFN_vkQueueSubmit2KHR( vkGetInstanceProcAddr( instance, \"vkQueueSubmit2KHR\" ) );\n        if ( !vkQueueSubmit2 )\n          vkQueueSubmit2 = vkQueueSubmit2KHR;\n\n        //=== VK_EXT_descriptor_buffer ===\n        vkGetDescriptorSetLayoutSizeEXT = PFN_vkGetDescriptorSetLayoutSizeEXT( vkGetInstanceProcAddr( instance, \"vkGetDescriptorSetLayoutSizeEXT\" ) );\n        vkGetDescriptorSetLayoutBindingOffsetEXT =\n          PFN_vkGetDescriptorSetLayoutBindingOffsetEXT( vkGetInstanceProcAddr( instance, \"vkGetDescriptorSetLayoutBindingOffsetEXT\" ) );\n        vkGetDescriptorEXT                 = PFN_vkGetDescriptorEXT( vkGetInstanceProcAddr( instance, \"vkGetDescriptorEXT\" ) );\n        vkCmdBindDescriptorBuffersEXT      = PFN_vkCmdBindDescriptorBuffersEXT( vkGetInstanceProcAddr( instance, \"vkCmdBindDescriptorBuffersEXT\" ) );\n        vkCmdSetDescriptorBufferOffsetsEXT = PFN_vkCmdSetDescriptorBufferOffsetsEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetDescriptorBufferOffsetsEXT\" ) );\n        vkCmdBindDescriptorBufferEmbeddedSamplersEXT =\n          PFN_vkCmdBindDescriptorBufferEmbeddedSamplersEXT( vkGetInstanceProcAddr( instance, \"vkCmdBindDescriptorBufferEmbeddedSamplersEXT\" ) );\n        vkGetBufferOpaqueCaptureDescriptorDataEXT =\n          PFN_vkGetBufferOpaqueCaptureDescriptorDataEXT( vkGetInstanceProcAddr( instance, \"vkGetBufferOpaqueCaptureDescriptorDataEXT\" ) );\n        vkGetImageOpaqueCaptureDescriptorDataEXT =\n          PFN_vkGetImageOpaqueCaptureDescriptorDataEXT( vkGetInstanceProcAddr( instance, \"vkGetImageOpaqueCaptureDescriptorDataEXT\" ) );\n        vkGetImageViewOpaqueCaptureDescriptorDataEXT =\n          PFN_vkGetImageViewOpaqueCaptureDescriptorDataEXT( vkGetInstanceProcAddr( instance, \"vkGetImageViewOpaqueCaptureDescriptorDataEXT\" ) );\n        vkGetSamplerOpaqueCaptureDescriptorDataEXT =\n          PFN_vkGetSamplerOpaqueCaptureDescriptorDataEXT( vkGetInstanceProcAddr( instance, \"vkGetSamplerOpaqueCaptureDescriptorDataEXT\" ) );\n        vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT = PFN_vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT(\n          vkGetInstanceProcAddr( instance, \"vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT\" ) );\n\n        //=== VK_NV_fragment_shading_rate_enums ===\n        vkCmdSetFragmentShadingRateEnumNV = PFN_vkCmdSetFragmentShadingRateEnumNV( vkGetInstanceProcAddr( instance, \"vkCmdSetFragmentShadingRateEnumNV\" ) );\n\n        //=== VK_EXT_mesh_shader ===\n        vkCmdDrawMeshTasksEXT              = PFN_vkCmdDrawMeshTasksEXT( vkGetInstanceProcAddr( instance, \"vkCmdDrawMeshTasksEXT\" ) );\n        vkCmdDrawMeshTasksIndirectEXT      = PFN_vkCmdDrawMeshTasksIndirectEXT( vkGetInstanceProcAddr( instance, \"vkCmdDrawMeshTasksIndirectEXT\" ) );\n        vkCmdDrawMeshTasksIndirectCountEXT = PFN_vkCmdDrawMeshTasksIndirectCountEXT( vkGetInstanceProcAddr( instance, \"vkCmdDrawMeshTasksIndirectCountEXT\" ) );\n\n        //=== VK_KHR_copy_commands2 ===\n        vkCmdCopyBuffer2KHR = PFN_vkCmdCopyBuffer2KHR( vkGetInstanceProcAddr( instance, \"vkCmdCopyBuffer2KHR\" ) );\n        if ( !vkCmdCopyBuffer2 )\n          vkCmdCopyBuffer2 = vkCmdCopyBuffer2KHR;\n        vkCmdCopyImage2KHR = PFN_vkCmdCopyImage2KHR( vkGetInstanceProcAddr( instance, \"vkCmdCopyImage2KHR\" ) );\n        if ( !vkCmdCopyImage2 )\n          vkCmdCopyImage2 = vkCmdCopyImage2KHR;\n        vkCmdCopyBufferToImage2KHR = PFN_vkCmdCopyBufferToImage2KHR( vkGetInstanceProcAddr( instance, \"vkCmdCopyBufferToImage2KHR\" ) );\n        if ( !vkCmdCopyBufferToImage2 )\n          vkCmdCopyBufferToImage2 = vkCmdCopyBufferToImage2KHR;\n        vkCmdCopyImageToBuffer2KHR = PFN_vkCmdCopyImageToBuffer2KHR( vkGetInstanceProcAddr( instance, \"vkCmdCopyImageToBuffer2KHR\" ) );\n        if ( !vkCmdCopyImageToBuffer2 )\n          vkCmdCopyImageToBuffer2 = vkCmdCopyImageToBuffer2KHR;\n        vkCmdBlitImage2KHR = PFN_vkCmdBlitImage2KHR( vkGetInstanceProcAddr( instance, \"vkCmdBlitImage2KHR\" ) );\n        if ( !vkCmdBlitImage2 )\n          vkCmdBlitImage2 = vkCmdBlitImage2KHR;\n        vkCmdResolveImage2KHR = PFN_vkCmdResolveImage2KHR( vkGetInstanceProcAddr( instance, \"vkCmdResolveImage2KHR\" ) );\n        if ( !vkCmdResolveImage2 )\n          vkCmdResolveImage2 = vkCmdResolveImage2KHR;\n\n        //=== VK_EXT_device_fault ===\n        vkGetDeviceFaultInfoEXT = PFN_vkGetDeviceFaultInfoEXT( vkGetInstanceProcAddr( instance, \"vkGetDeviceFaultInfoEXT\" ) );\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n        //=== VK_NV_acquire_winrt_display ===\n        vkAcquireWinrtDisplayNV = PFN_vkAcquireWinrtDisplayNV( vkGetInstanceProcAddr( instance, \"vkAcquireWinrtDisplayNV\" ) );\n        vkGetWinrtDisplayNV     = PFN_vkGetWinrtDisplayNV( vkGetInstanceProcAddr( instance, \"vkGetWinrtDisplayNV\" ) );\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n        //=== VK_EXT_directfb_surface ===\n        vkCreateDirectFBSurfaceEXT = PFN_vkCreateDirectFBSurfaceEXT( vkGetInstanceProcAddr( instance, \"vkCreateDirectFBSurfaceEXT\" ) );\n        vkGetPhysicalDeviceDirectFBPresentationSupportEXT =\n          PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceDirectFBPresentationSupportEXT\" ) );\n#endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n\n        //=== VK_EXT_vertex_input_dynamic_state ===\n        vkCmdSetVertexInputEXT = PFN_vkCmdSetVertexInputEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetVertexInputEXT\" ) );\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n        //=== VK_FUCHSIA_external_memory ===\n        vkGetMemoryZirconHandleFUCHSIA = PFN_vkGetMemoryZirconHandleFUCHSIA( vkGetInstanceProcAddr( instance, \"vkGetMemoryZirconHandleFUCHSIA\" ) );\n        vkGetMemoryZirconHandlePropertiesFUCHSIA =\n          PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA( vkGetInstanceProcAddr( instance, \"vkGetMemoryZirconHandlePropertiesFUCHSIA\" ) );\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n        //=== VK_FUCHSIA_external_semaphore ===\n        vkImportSemaphoreZirconHandleFUCHSIA =\n          PFN_vkImportSemaphoreZirconHandleFUCHSIA( vkGetInstanceProcAddr( instance, \"vkImportSemaphoreZirconHandleFUCHSIA\" ) );\n        vkGetSemaphoreZirconHandleFUCHSIA = PFN_vkGetSemaphoreZirconHandleFUCHSIA( vkGetInstanceProcAddr( instance, \"vkGetSemaphoreZirconHandleFUCHSIA\" ) );\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n        //=== VK_FUCHSIA_buffer_collection ===\n        vkCreateBufferCollectionFUCHSIA = PFN_vkCreateBufferCollectionFUCHSIA( vkGetInstanceProcAddr( instance, \"vkCreateBufferCollectionFUCHSIA\" ) );\n        vkSetBufferCollectionImageConstraintsFUCHSIA =\n          PFN_vkSetBufferCollectionImageConstraintsFUCHSIA( vkGetInstanceProcAddr( instance, \"vkSetBufferCollectionImageConstraintsFUCHSIA\" ) );\n        vkSetBufferCollectionBufferConstraintsFUCHSIA =\n          PFN_vkSetBufferCollectionBufferConstraintsFUCHSIA( vkGetInstanceProcAddr( instance, \"vkSetBufferCollectionBufferConstraintsFUCHSIA\" ) );\n        vkDestroyBufferCollectionFUCHSIA = PFN_vkDestroyBufferCollectionFUCHSIA( vkGetInstanceProcAddr( instance, \"vkDestroyBufferCollectionFUCHSIA\" ) );\n        vkGetBufferCollectionPropertiesFUCHSIA =\n          PFN_vkGetBufferCollectionPropertiesFUCHSIA( vkGetInstanceProcAddr( instance, \"vkGetBufferCollectionPropertiesFUCHSIA\" ) );\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n        //=== VK_HUAWEI_subpass_shading ===\n        vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI =\n          PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI( vkGetInstanceProcAddr( instance, \"vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI\" ) );\n        vkCmdSubpassShadingHUAWEI = PFN_vkCmdSubpassShadingHUAWEI( vkGetInstanceProcAddr( instance, \"vkCmdSubpassShadingHUAWEI\" ) );\n\n        //=== VK_HUAWEI_invocation_mask ===\n        vkCmdBindInvocationMaskHUAWEI = PFN_vkCmdBindInvocationMaskHUAWEI( vkGetInstanceProcAddr( instance, \"vkCmdBindInvocationMaskHUAWEI\" ) );\n\n        //=== VK_NV_external_memory_rdma ===\n        vkGetMemoryRemoteAddressNV = PFN_vkGetMemoryRemoteAddressNV( vkGetInstanceProcAddr( instance, \"vkGetMemoryRemoteAddressNV\" ) );\n\n        //=== VK_EXT_pipeline_properties ===\n        vkGetPipelinePropertiesEXT = PFN_vkGetPipelinePropertiesEXT( vkGetInstanceProcAddr( instance, \"vkGetPipelinePropertiesEXT\" ) );\n\n        //=== VK_EXT_extended_dynamic_state2 ===\n        vkCmdSetPatchControlPointsEXT      = PFN_vkCmdSetPatchControlPointsEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetPatchControlPointsEXT\" ) );\n        vkCmdSetRasterizerDiscardEnableEXT = PFN_vkCmdSetRasterizerDiscardEnableEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetRasterizerDiscardEnableEXT\" ) );\n        if ( !vkCmdSetRasterizerDiscardEnable )\n          vkCmdSetRasterizerDiscardEnable = vkCmdSetRasterizerDiscardEnableEXT;\n        vkCmdSetDepthBiasEnableEXT = PFN_vkCmdSetDepthBiasEnableEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetDepthBiasEnableEXT\" ) );\n        if ( !vkCmdSetDepthBiasEnable )\n          vkCmdSetDepthBiasEnable = vkCmdSetDepthBiasEnableEXT;\n        vkCmdSetLogicOpEXT                = PFN_vkCmdSetLogicOpEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetLogicOpEXT\" ) );\n        vkCmdSetPrimitiveRestartEnableEXT = PFN_vkCmdSetPrimitiveRestartEnableEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetPrimitiveRestartEnableEXT\" ) );\n        if ( !vkCmdSetPrimitiveRestartEnable )\n          vkCmdSetPrimitiveRestartEnable = vkCmdSetPrimitiveRestartEnableEXT;\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n        //=== VK_QNX_screen_surface ===\n        vkCreateScreenSurfaceQNX = PFN_vkCreateScreenSurfaceQNX( vkGetInstanceProcAddr( instance, \"vkCreateScreenSurfaceQNX\" ) );\n        vkGetPhysicalDeviceScreenPresentationSupportQNX =\n          PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceScreenPresentationSupportQNX\" ) );\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n        //=== VK_EXT_color_write_enable ===\n        vkCmdSetColorWriteEnableEXT = PFN_vkCmdSetColorWriteEnableEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetColorWriteEnableEXT\" ) );\n\n        //=== VK_KHR_ray_tracing_maintenance1 ===\n        vkCmdTraceRaysIndirect2KHR = PFN_vkCmdTraceRaysIndirect2KHR( vkGetInstanceProcAddr( instance, \"vkCmdTraceRaysIndirect2KHR\" ) );\n\n        //=== VK_EXT_multi_draw ===\n        vkCmdDrawMultiEXT        = PFN_vkCmdDrawMultiEXT( vkGetInstanceProcAddr( instance, \"vkCmdDrawMultiEXT\" ) );\n        vkCmdDrawMultiIndexedEXT = PFN_vkCmdDrawMultiIndexedEXT( vkGetInstanceProcAddr( instance, \"vkCmdDrawMultiIndexedEXT\" ) );\n\n        //=== VK_EXT_opacity_micromap ===\n        vkCreateMicromapEXT              = PFN_vkCreateMicromapEXT( vkGetInstanceProcAddr( instance, \"vkCreateMicromapEXT\" ) );\n        vkDestroyMicromapEXT             = PFN_vkDestroyMicromapEXT( vkGetInstanceProcAddr( instance, \"vkDestroyMicromapEXT\" ) );\n        vkCmdBuildMicromapsEXT           = PFN_vkCmdBuildMicromapsEXT( vkGetInstanceProcAddr( instance, \"vkCmdBuildMicromapsEXT\" ) );\n        vkBuildMicromapsEXT              = PFN_vkBuildMicromapsEXT( vkGetInstanceProcAddr( instance, \"vkBuildMicromapsEXT\" ) );\n        vkCopyMicromapEXT                = PFN_vkCopyMicromapEXT( vkGetInstanceProcAddr( instance, \"vkCopyMicromapEXT\" ) );\n        vkCopyMicromapToMemoryEXT        = PFN_vkCopyMicromapToMemoryEXT( vkGetInstanceProcAddr( instance, \"vkCopyMicromapToMemoryEXT\" ) );\n        vkCopyMemoryToMicromapEXT        = PFN_vkCopyMemoryToMicromapEXT( vkGetInstanceProcAddr( instance, \"vkCopyMemoryToMicromapEXT\" ) );\n        vkWriteMicromapsPropertiesEXT    = PFN_vkWriteMicromapsPropertiesEXT( vkGetInstanceProcAddr( instance, \"vkWriteMicromapsPropertiesEXT\" ) );\n        vkCmdCopyMicromapEXT             = PFN_vkCmdCopyMicromapEXT( vkGetInstanceProcAddr( instance, \"vkCmdCopyMicromapEXT\" ) );\n        vkCmdCopyMicromapToMemoryEXT     = PFN_vkCmdCopyMicromapToMemoryEXT( vkGetInstanceProcAddr( instance, \"vkCmdCopyMicromapToMemoryEXT\" ) );\n        vkCmdCopyMemoryToMicromapEXT     = PFN_vkCmdCopyMemoryToMicromapEXT( vkGetInstanceProcAddr( instance, \"vkCmdCopyMemoryToMicromapEXT\" ) );\n        vkCmdWriteMicromapsPropertiesEXT = PFN_vkCmdWriteMicromapsPropertiesEXT( vkGetInstanceProcAddr( instance, \"vkCmdWriteMicromapsPropertiesEXT\" ) );\n        vkGetDeviceMicromapCompatibilityEXT =\n          PFN_vkGetDeviceMicromapCompatibilityEXT( vkGetInstanceProcAddr( instance, \"vkGetDeviceMicromapCompatibilityEXT\" ) );\n        vkGetMicromapBuildSizesEXT = PFN_vkGetMicromapBuildSizesEXT( vkGetInstanceProcAddr( instance, \"vkGetMicromapBuildSizesEXT\" ) );\n\n        //=== VK_HUAWEI_cluster_culling_shader ===\n        vkCmdDrawClusterHUAWEI         = PFN_vkCmdDrawClusterHUAWEI( vkGetInstanceProcAddr( instance, \"vkCmdDrawClusterHUAWEI\" ) );\n        vkCmdDrawClusterIndirectHUAWEI = PFN_vkCmdDrawClusterIndirectHUAWEI( vkGetInstanceProcAddr( instance, \"vkCmdDrawClusterIndirectHUAWEI\" ) );\n\n        //=== VK_EXT_pageable_device_local_memory ===\n        vkSetDeviceMemoryPriorityEXT = PFN_vkSetDeviceMemoryPriorityEXT( vkGetInstanceProcAddr( instance, \"vkSetDeviceMemoryPriorityEXT\" ) );\n\n        //=== VK_KHR_maintenance4 ===\n        vkGetDeviceBufferMemoryRequirementsKHR =\n          PFN_vkGetDeviceBufferMemoryRequirementsKHR( vkGetInstanceProcAddr( instance, \"vkGetDeviceBufferMemoryRequirementsKHR\" ) );\n        if ( !vkGetDeviceBufferMemoryRequirements )\n          vkGetDeviceBufferMemoryRequirements = vkGetDeviceBufferMemoryRequirementsKHR;\n        vkGetDeviceImageMemoryRequirementsKHR =\n          PFN_vkGetDeviceImageMemoryRequirementsKHR( vkGetInstanceProcAddr( instance, \"vkGetDeviceImageMemoryRequirementsKHR\" ) );\n        if ( !vkGetDeviceImageMemoryRequirements )\n          vkGetDeviceImageMemoryRequirements = vkGetDeviceImageMemoryRequirementsKHR;\n        vkGetDeviceImageSparseMemoryRequirementsKHR =\n          PFN_vkGetDeviceImageSparseMemoryRequirementsKHR( vkGetInstanceProcAddr( instance, \"vkGetDeviceImageSparseMemoryRequirementsKHR\" ) );\n        if ( !vkGetDeviceImageSparseMemoryRequirements )\n          vkGetDeviceImageSparseMemoryRequirements = vkGetDeviceImageSparseMemoryRequirementsKHR;\n\n        //=== VK_VALVE_descriptor_set_host_mapping ===\n        vkGetDescriptorSetLayoutHostMappingInfoVALVE =\n          PFN_vkGetDescriptorSetLayoutHostMappingInfoVALVE( vkGetInstanceProcAddr( instance, \"vkGetDescriptorSetLayoutHostMappingInfoVALVE\" ) );\n        vkGetDescriptorSetHostMappingVALVE = PFN_vkGetDescriptorSetHostMappingVALVE( vkGetInstanceProcAddr( instance, \"vkGetDescriptorSetHostMappingVALVE\" ) );\n\n        //=== VK_NV_copy_memory_indirect ===\n        vkCmdCopyMemoryIndirectNV        = PFN_vkCmdCopyMemoryIndirectNV( vkGetInstanceProcAddr( instance, \"vkCmdCopyMemoryIndirectNV\" ) );\n        vkCmdCopyMemoryToImageIndirectNV = PFN_vkCmdCopyMemoryToImageIndirectNV( vkGetInstanceProcAddr( instance, \"vkCmdCopyMemoryToImageIndirectNV\" ) );\n\n        //=== VK_NV_memory_decompression ===\n        vkCmdDecompressMemoryNV = PFN_vkCmdDecompressMemoryNV( vkGetInstanceProcAddr( instance, \"vkCmdDecompressMemoryNV\" ) );\n        vkCmdDecompressMemoryIndirectCountNV =\n          PFN_vkCmdDecompressMemoryIndirectCountNV( vkGetInstanceProcAddr( instance, \"vkCmdDecompressMemoryIndirectCountNV\" ) );\n\n        //=== VK_NV_device_generated_commands_compute ===\n        vkGetPipelineIndirectMemoryRequirementsNV =\n          PFN_vkGetPipelineIndirectMemoryRequirementsNV( vkGetInstanceProcAddr( instance, \"vkGetPipelineIndirectMemoryRequirementsNV\" ) );\n        vkCmdUpdatePipelineIndirectBufferNV =\n          PFN_vkCmdUpdatePipelineIndirectBufferNV( vkGetInstanceProcAddr( instance, \"vkCmdUpdatePipelineIndirectBufferNV\" ) );\n        vkGetPipelineIndirectDeviceAddressNV =\n          PFN_vkGetPipelineIndirectDeviceAddressNV( vkGetInstanceProcAddr( instance, \"vkGetPipelineIndirectDeviceAddressNV\" ) );\n\n        //=== VK_EXT_extended_dynamic_state3 ===\n        vkCmdSetDepthClampEnableEXT      = PFN_vkCmdSetDepthClampEnableEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetDepthClampEnableEXT\" ) );\n        vkCmdSetPolygonModeEXT           = PFN_vkCmdSetPolygonModeEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetPolygonModeEXT\" ) );\n        vkCmdSetRasterizationSamplesEXT  = PFN_vkCmdSetRasterizationSamplesEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetRasterizationSamplesEXT\" ) );\n        vkCmdSetSampleMaskEXT            = PFN_vkCmdSetSampleMaskEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetSampleMaskEXT\" ) );\n        vkCmdSetAlphaToCoverageEnableEXT = PFN_vkCmdSetAlphaToCoverageEnableEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetAlphaToCoverageEnableEXT\" ) );\n        vkCmdSetAlphaToOneEnableEXT      = PFN_vkCmdSetAlphaToOneEnableEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetAlphaToOneEnableEXT\" ) );\n        vkCmdSetLogicOpEnableEXT         = PFN_vkCmdSetLogicOpEnableEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetLogicOpEnableEXT\" ) );\n        vkCmdSetColorBlendEnableEXT      = PFN_vkCmdSetColorBlendEnableEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetColorBlendEnableEXT\" ) );\n        vkCmdSetColorBlendEquationEXT    = PFN_vkCmdSetColorBlendEquationEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetColorBlendEquationEXT\" ) );\n        vkCmdSetColorWriteMaskEXT        = PFN_vkCmdSetColorWriteMaskEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetColorWriteMaskEXT\" ) );\n        vkCmdSetTessellationDomainOriginEXT =\n          PFN_vkCmdSetTessellationDomainOriginEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetTessellationDomainOriginEXT\" ) );\n        vkCmdSetRasterizationStreamEXT = PFN_vkCmdSetRasterizationStreamEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetRasterizationStreamEXT\" ) );\n        vkCmdSetConservativeRasterizationModeEXT =\n          PFN_vkCmdSetConservativeRasterizationModeEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetConservativeRasterizationModeEXT\" ) );\n        vkCmdSetExtraPrimitiveOverestimationSizeEXT =\n          PFN_vkCmdSetExtraPrimitiveOverestimationSizeEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetExtraPrimitiveOverestimationSizeEXT\" ) );\n        vkCmdSetDepthClipEnableEXT       = PFN_vkCmdSetDepthClipEnableEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetDepthClipEnableEXT\" ) );\n        vkCmdSetSampleLocationsEnableEXT = PFN_vkCmdSetSampleLocationsEnableEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetSampleLocationsEnableEXT\" ) );\n        vkCmdSetColorBlendAdvancedEXT    = PFN_vkCmdSetColorBlendAdvancedEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetColorBlendAdvancedEXT\" ) );\n        vkCmdSetProvokingVertexModeEXT   = PFN_vkCmdSetProvokingVertexModeEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetProvokingVertexModeEXT\" ) );\n        vkCmdSetLineRasterizationModeEXT = PFN_vkCmdSetLineRasterizationModeEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetLineRasterizationModeEXT\" ) );\n        vkCmdSetLineStippleEnableEXT     = PFN_vkCmdSetLineStippleEnableEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetLineStippleEnableEXT\" ) );\n        vkCmdSetDepthClipNegativeOneToOneEXT =\n          PFN_vkCmdSetDepthClipNegativeOneToOneEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetDepthClipNegativeOneToOneEXT\" ) );\n        vkCmdSetViewportWScalingEnableNV  = PFN_vkCmdSetViewportWScalingEnableNV( vkGetInstanceProcAddr( instance, \"vkCmdSetViewportWScalingEnableNV\" ) );\n        vkCmdSetViewportSwizzleNV         = PFN_vkCmdSetViewportSwizzleNV( vkGetInstanceProcAddr( instance, \"vkCmdSetViewportSwizzleNV\" ) );\n        vkCmdSetCoverageToColorEnableNV   = PFN_vkCmdSetCoverageToColorEnableNV( vkGetInstanceProcAddr( instance, \"vkCmdSetCoverageToColorEnableNV\" ) );\n        vkCmdSetCoverageToColorLocationNV = PFN_vkCmdSetCoverageToColorLocationNV( vkGetInstanceProcAddr( instance, \"vkCmdSetCoverageToColorLocationNV\" ) );\n        vkCmdSetCoverageModulationModeNV  = PFN_vkCmdSetCoverageModulationModeNV( vkGetInstanceProcAddr( instance, \"vkCmdSetCoverageModulationModeNV\" ) );\n        vkCmdSetCoverageModulationTableEnableNV =\n          PFN_vkCmdSetCoverageModulationTableEnableNV( vkGetInstanceProcAddr( instance, \"vkCmdSetCoverageModulationTableEnableNV\" ) );\n        vkCmdSetCoverageModulationTableNV = PFN_vkCmdSetCoverageModulationTableNV( vkGetInstanceProcAddr( instance, \"vkCmdSetCoverageModulationTableNV\" ) );\n        vkCmdSetShadingRateImageEnableNV  = PFN_vkCmdSetShadingRateImageEnableNV( vkGetInstanceProcAddr( instance, \"vkCmdSetShadingRateImageEnableNV\" ) );\n        vkCmdSetRepresentativeFragmentTestEnableNV =\n          PFN_vkCmdSetRepresentativeFragmentTestEnableNV( vkGetInstanceProcAddr( instance, \"vkCmdSetRepresentativeFragmentTestEnableNV\" ) );\n        vkCmdSetCoverageReductionModeNV = PFN_vkCmdSetCoverageReductionModeNV( vkGetInstanceProcAddr( instance, \"vkCmdSetCoverageReductionModeNV\" ) );\n\n        //=== VK_EXT_shader_module_identifier ===\n        vkGetShaderModuleIdentifierEXT = PFN_vkGetShaderModuleIdentifierEXT( vkGetInstanceProcAddr( instance, \"vkGetShaderModuleIdentifierEXT\" ) );\n        vkGetShaderModuleCreateInfoIdentifierEXT =\n          PFN_vkGetShaderModuleCreateInfoIdentifierEXT( vkGetInstanceProcAddr( instance, \"vkGetShaderModuleCreateInfoIdentifierEXT\" ) );\n\n        //=== VK_NV_optical_flow ===\n        vkGetPhysicalDeviceOpticalFlowImageFormatsNV =\n          PFN_vkGetPhysicalDeviceOpticalFlowImageFormatsNV( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceOpticalFlowImageFormatsNV\" ) );\n        vkCreateOpticalFlowSessionNV    = PFN_vkCreateOpticalFlowSessionNV( vkGetInstanceProcAddr( instance, \"vkCreateOpticalFlowSessionNV\" ) );\n        vkDestroyOpticalFlowSessionNV   = PFN_vkDestroyOpticalFlowSessionNV( vkGetInstanceProcAddr( instance, \"vkDestroyOpticalFlowSessionNV\" ) );\n        vkBindOpticalFlowSessionImageNV = PFN_vkBindOpticalFlowSessionImageNV( vkGetInstanceProcAddr( instance, \"vkBindOpticalFlowSessionImageNV\" ) );\n        vkCmdOpticalFlowExecuteNV       = PFN_vkCmdOpticalFlowExecuteNV( vkGetInstanceProcAddr( instance, \"vkCmdOpticalFlowExecuteNV\" ) );\n\n        //=== VK_KHR_maintenance5 ===\n        vkCmdBindIndexBuffer2KHR = PFN_vkCmdBindIndexBuffer2KHR( vkGetInstanceProcAddr( instance, \"vkCmdBindIndexBuffer2KHR\" ) );\n        if ( !vkCmdBindIndexBuffer2 )\n          vkCmdBindIndexBuffer2 = vkCmdBindIndexBuffer2KHR;\n        vkGetRenderingAreaGranularityKHR = PFN_vkGetRenderingAreaGranularityKHR( vkGetInstanceProcAddr( instance, \"vkGetRenderingAreaGranularityKHR\" ) );\n        if ( !vkGetRenderingAreaGranularity )\n          vkGetRenderingAreaGranularity = vkGetRenderingAreaGranularityKHR;\n        vkGetDeviceImageSubresourceLayoutKHR =\n          PFN_vkGetDeviceImageSubresourceLayoutKHR( vkGetInstanceProcAddr( instance, \"vkGetDeviceImageSubresourceLayoutKHR\" ) );\n        if ( !vkGetDeviceImageSubresourceLayout )\n          vkGetDeviceImageSubresourceLayout = vkGetDeviceImageSubresourceLayoutKHR;\n        vkGetImageSubresourceLayout2KHR = PFN_vkGetImageSubresourceLayout2KHR( vkGetInstanceProcAddr( instance, \"vkGetImageSubresourceLayout2KHR\" ) );\n        if ( !vkGetImageSubresourceLayout2 )\n          vkGetImageSubresourceLayout2 = vkGetImageSubresourceLayout2KHR;\n\n        //=== VK_AMD_anti_lag ===\n        vkAntiLagUpdateAMD = PFN_vkAntiLagUpdateAMD( vkGetInstanceProcAddr( instance, \"vkAntiLagUpdateAMD\" ) );\n\n        //=== VK_EXT_shader_object ===\n        vkCreateShadersEXT         = PFN_vkCreateShadersEXT( vkGetInstanceProcAddr( instance, \"vkCreateShadersEXT\" ) );\n        vkDestroyShaderEXT         = PFN_vkDestroyShaderEXT( vkGetInstanceProcAddr( instance, \"vkDestroyShaderEXT\" ) );\n        vkGetShaderBinaryDataEXT   = PFN_vkGetShaderBinaryDataEXT( vkGetInstanceProcAddr( instance, \"vkGetShaderBinaryDataEXT\" ) );\n        vkCmdBindShadersEXT        = PFN_vkCmdBindShadersEXT( vkGetInstanceProcAddr( instance, \"vkCmdBindShadersEXT\" ) );\n        vkCmdSetDepthClampRangeEXT = PFN_vkCmdSetDepthClampRangeEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetDepthClampRangeEXT\" ) );\n\n        //=== VK_KHR_pipeline_binary ===\n        vkCreatePipelineBinariesKHR      = PFN_vkCreatePipelineBinariesKHR( vkGetInstanceProcAddr( instance, \"vkCreatePipelineBinariesKHR\" ) );\n        vkDestroyPipelineBinaryKHR       = PFN_vkDestroyPipelineBinaryKHR( vkGetInstanceProcAddr( instance, \"vkDestroyPipelineBinaryKHR\" ) );\n        vkGetPipelineKeyKHR              = PFN_vkGetPipelineKeyKHR( vkGetInstanceProcAddr( instance, \"vkGetPipelineKeyKHR\" ) );\n        vkGetPipelineBinaryDataKHR       = PFN_vkGetPipelineBinaryDataKHR( vkGetInstanceProcAddr( instance, \"vkGetPipelineBinaryDataKHR\" ) );\n        vkReleaseCapturedPipelineDataKHR = PFN_vkReleaseCapturedPipelineDataKHR( vkGetInstanceProcAddr( instance, \"vkReleaseCapturedPipelineDataKHR\" ) );\n\n        //=== VK_QCOM_tile_properties ===\n        vkGetFramebufferTilePropertiesQCOM = PFN_vkGetFramebufferTilePropertiesQCOM( vkGetInstanceProcAddr( instance, \"vkGetFramebufferTilePropertiesQCOM\" ) );\n        vkGetDynamicRenderingTilePropertiesQCOM =\n          PFN_vkGetDynamicRenderingTilePropertiesQCOM( vkGetInstanceProcAddr( instance, \"vkGetDynamicRenderingTilePropertiesQCOM\" ) );\n\n        //=== VK_NV_cooperative_vector ===\n        vkGetPhysicalDeviceCooperativeVectorPropertiesNV =\n          PFN_vkGetPhysicalDeviceCooperativeVectorPropertiesNV( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceCooperativeVectorPropertiesNV\" ) );\n        vkConvertCooperativeVectorMatrixNV = PFN_vkConvertCooperativeVectorMatrixNV( vkGetInstanceProcAddr( instance, \"vkConvertCooperativeVectorMatrixNV\" ) );\n        vkCmdConvertCooperativeVectorMatrixNV =\n          PFN_vkCmdConvertCooperativeVectorMatrixNV( vkGetInstanceProcAddr( instance, \"vkCmdConvertCooperativeVectorMatrixNV\" ) );\n\n        //=== VK_NV_low_latency2 ===\n        vkSetLatencySleepModeNV  = PFN_vkSetLatencySleepModeNV( vkGetInstanceProcAddr( instance, \"vkSetLatencySleepModeNV\" ) );\n        vkLatencySleepNV         = PFN_vkLatencySleepNV( vkGetInstanceProcAddr( instance, \"vkLatencySleepNV\" ) );\n        vkSetLatencyMarkerNV     = PFN_vkSetLatencyMarkerNV( vkGetInstanceProcAddr( instance, \"vkSetLatencyMarkerNV\" ) );\n        vkGetLatencyTimingsNV    = PFN_vkGetLatencyTimingsNV( vkGetInstanceProcAddr( instance, \"vkGetLatencyTimingsNV\" ) );\n        vkQueueNotifyOutOfBandNV = PFN_vkQueueNotifyOutOfBandNV( vkGetInstanceProcAddr( instance, \"vkQueueNotifyOutOfBandNV\" ) );\n\n        //=== VK_KHR_cooperative_matrix ===\n        vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR =\n          PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR\" ) );\n\n        //=== VK_EXT_attachment_feedback_loop_dynamic_state ===\n        vkCmdSetAttachmentFeedbackLoopEnableEXT =\n          PFN_vkCmdSetAttachmentFeedbackLoopEnableEXT( vkGetInstanceProcAddr( instance, \"vkCmdSetAttachmentFeedbackLoopEnableEXT\" ) );\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n        //=== VK_QNX_external_memory_screen_buffer ===\n        vkGetScreenBufferPropertiesQNX = PFN_vkGetScreenBufferPropertiesQNX( vkGetInstanceProcAddr( instance, \"vkGetScreenBufferPropertiesQNX\" ) );\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n        //=== VK_KHR_line_rasterization ===\n        vkCmdSetLineStippleKHR = PFN_vkCmdSetLineStippleKHR( vkGetInstanceProcAddr( instance, \"vkCmdSetLineStippleKHR\" ) );\n        if ( !vkCmdSetLineStipple )\n          vkCmdSetLineStipple = vkCmdSetLineStippleKHR;\n\n        //=== VK_KHR_calibrated_timestamps ===\n        vkGetPhysicalDeviceCalibrateableTimeDomainsKHR =\n          PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceCalibrateableTimeDomainsKHR\" ) );\n        vkGetCalibratedTimestampsKHR = PFN_vkGetCalibratedTimestampsKHR( vkGetInstanceProcAddr( instance, \"vkGetCalibratedTimestampsKHR\" ) );\n\n        //=== VK_KHR_maintenance6 ===\n        vkCmdBindDescriptorSets2KHR = PFN_vkCmdBindDescriptorSets2KHR( vkGetInstanceProcAddr( instance, \"vkCmdBindDescriptorSets2KHR\" ) );\n        if ( !vkCmdBindDescriptorSets2 )\n          vkCmdBindDescriptorSets2 = vkCmdBindDescriptorSets2KHR;\n        vkCmdPushConstants2KHR = PFN_vkCmdPushConstants2KHR( vkGetInstanceProcAddr( instance, \"vkCmdPushConstants2KHR\" ) );\n        if ( !vkCmdPushConstants2 )\n          vkCmdPushConstants2 = vkCmdPushConstants2KHR;\n        vkCmdPushDescriptorSet2KHR = PFN_vkCmdPushDescriptorSet2KHR( vkGetInstanceProcAddr( instance, \"vkCmdPushDescriptorSet2KHR\" ) );\n        if ( !vkCmdPushDescriptorSet2 )\n          vkCmdPushDescriptorSet2 = vkCmdPushDescriptorSet2KHR;\n        vkCmdPushDescriptorSetWithTemplate2KHR =\n          PFN_vkCmdPushDescriptorSetWithTemplate2KHR( vkGetInstanceProcAddr( instance, \"vkCmdPushDescriptorSetWithTemplate2KHR\" ) );\n        if ( !vkCmdPushDescriptorSetWithTemplate2 )\n          vkCmdPushDescriptorSetWithTemplate2 = vkCmdPushDescriptorSetWithTemplate2KHR;\n        vkCmdSetDescriptorBufferOffsets2EXT =\n          PFN_vkCmdSetDescriptorBufferOffsets2EXT( vkGetInstanceProcAddr( instance, \"vkCmdSetDescriptorBufferOffsets2EXT\" ) );\n        vkCmdBindDescriptorBufferEmbeddedSamplers2EXT =\n          PFN_vkCmdBindDescriptorBufferEmbeddedSamplers2EXT( vkGetInstanceProcAddr( instance, \"vkCmdBindDescriptorBufferEmbeddedSamplers2EXT\" ) );\n\n        //=== VK_NV_cluster_acceleration_structure ===\n        vkGetClusterAccelerationStructureBuildSizesNV =\n          PFN_vkGetClusterAccelerationStructureBuildSizesNV( vkGetInstanceProcAddr( instance, \"vkGetClusterAccelerationStructureBuildSizesNV\" ) );\n        vkCmdBuildClusterAccelerationStructureIndirectNV =\n          PFN_vkCmdBuildClusterAccelerationStructureIndirectNV( vkGetInstanceProcAddr( instance, \"vkCmdBuildClusterAccelerationStructureIndirectNV\" ) );\n\n        //=== VK_NV_partitioned_acceleration_structure ===\n        vkGetPartitionedAccelerationStructuresBuildSizesNV =\n          PFN_vkGetPartitionedAccelerationStructuresBuildSizesNV( vkGetInstanceProcAddr( instance, \"vkGetPartitionedAccelerationStructuresBuildSizesNV\" ) );\n        vkCmdBuildPartitionedAccelerationStructuresNV =\n          PFN_vkCmdBuildPartitionedAccelerationStructuresNV( vkGetInstanceProcAddr( instance, \"vkCmdBuildPartitionedAccelerationStructuresNV\" ) );\n\n        //=== VK_EXT_device_generated_commands ===\n        vkGetGeneratedCommandsMemoryRequirementsEXT =\n          PFN_vkGetGeneratedCommandsMemoryRequirementsEXT( vkGetInstanceProcAddr( instance, \"vkGetGeneratedCommandsMemoryRequirementsEXT\" ) );\n        vkCmdPreprocessGeneratedCommandsEXT =\n          PFN_vkCmdPreprocessGeneratedCommandsEXT( vkGetInstanceProcAddr( instance, \"vkCmdPreprocessGeneratedCommandsEXT\" ) );\n        vkCmdExecuteGeneratedCommandsEXT   = PFN_vkCmdExecuteGeneratedCommandsEXT( vkGetInstanceProcAddr( instance, \"vkCmdExecuteGeneratedCommandsEXT\" ) );\n        vkCreateIndirectCommandsLayoutEXT  = PFN_vkCreateIndirectCommandsLayoutEXT( vkGetInstanceProcAddr( instance, \"vkCreateIndirectCommandsLayoutEXT\" ) );\n        vkDestroyIndirectCommandsLayoutEXT = PFN_vkDestroyIndirectCommandsLayoutEXT( vkGetInstanceProcAddr( instance, \"vkDestroyIndirectCommandsLayoutEXT\" ) );\n        vkCreateIndirectExecutionSetEXT    = PFN_vkCreateIndirectExecutionSetEXT( vkGetInstanceProcAddr( instance, \"vkCreateIndirectExecutionSetEXT\" ) );\n        vkDestroyIndirectExecutionSetEXT   = PFN_vkDestroyIndirectExecutionSetEXT( vkGetInstanceProcAddr( instance, \"vkDestroyIndirectExecutionSetEXT\" ) );\n        vkUpdateIndirectExecutionSetPipelineEXT =\n          PFN_vkUpdateIndirectExecutionSetPipelineEXT( vkGetInstanceProcAddr( instance, \"vkUpdateIndirectExecutionSetPipelineEXT\" ) );\n        vkUpdateIndirectExecutionSetShaderEXT =\n          PFN_vkUpdateIndirectExecutionSetShaderEXT( vkGetInstanceProcAddr( instance, \"vkUpdateIndirectExecutionSetShaderEXT\" ) );\n\n        //=== VK_NV_cooperative_matrix2 ===\n        vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV = PFN_vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV(\n          vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV\" ) );\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n        //=== VK_EXT_external_memory_metal ===\n        vkGetMemoryMetalHandleEXT = PFN_vkGetMemoryMetalHandleEXT( vkGetInstanceProcAddr( instance, \"vkGetMemoryMetalHandleEXT\" ) );\n        vkGetMemoryMetalHandlePropertiesEXT =\n          PFN_vkGetMemoryMetalHandlePropertiesEXT( vkGetInstanceProcAddr( instance, \"vkGetMemoryMetalHandlePropertiesEXT\" ) );\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n      }\n\n      void init( VULKAN_HPP_NAMESPACE::Device deviceCpp ) VULKAN_HPP_NOEXCEPT\n      {\n        VkDevice device = static_cast<VkDevice>( deviceCpp );\n\n        //=== VK_VERSION_1_0 ===\n        vkGetDeviceProcAddr                = PFN_vkGetDeviceProcAddr( vkGetDeviceProcAddr( device, \"vkGetDeviceProcAddr\" ) );\n        vkDestroyDevice                    = PFN_vkDestroyDevice( vkGetDeviceProcAddr( device, \"vkDestroyDevice\" ) );\n        vkGetDeviceQueue                   = PFN_vkGetDeviceQueue( vkGetDeviceProcAddr( device, \"vkGetDeviceQueue\" ) );\n        vkQueueSubmit                      = PFN_vkQueueSubmit( vkGetDeviceProcAddr( device, \"vkQueueSubmit\" ) );\n        vkQueueWaitIdle                    = PFN_vkQueueWaitIdle( vkGetDeviceProcAddr( device, \"vkQueueWaitIdle\" ) );\n        vkDeviceWaitIdle                   = PFN_vkDeviceWaitIdle( vkGetDeviceProcAddr( device, \"vkDeviceWaitIdle\" ) );\n        vkAllocateMemory                   = PFN_vkAllocateMemory( vkGetDeviceProcAddr( device, \"vkAllocateMemory\" ) );\n        vkFreeMemory                       = PFN_vkFreeMemory( vkGetDeviceProcAddr( device, \"vkFreeMemory\" ) );\n        vkMapMemory                        = PFN_vkMapMemory( vkGetDeviceProcAddr( device, \"vkMapMemory\" ) );\n        vkUnmapMemory                      = PFN_vkUnmapMemory( vkGetDeviceProcAddr( device, \"vkUnmapMemory\" ) );\n        vkFlushMappedMemoryRanges          = PFN_vkFlushMappedMemoryRanges( vkGetDeviceProcAddr( device, \"vkFlushMappedMemoryRanges\" ) );\n        vkInvalidateMappedMemoryRanges     = PFN_vkInvalidateMappedMemoryRanges( vkGetDeviceProcAddr( device, \"vkInvalidateMappedMemoryRanges\" ) );\n        vkGetDeviceMemoryCommitment        = PFN_vkGetDeviceMemoryCommitment( vkGetDeviceProcAddr( device, \"vkGetDeviceMemoryCommitment\" ) );\n        vkBindBufferMemory                 = PFN_vkBindBufferMemory( vkGetDeviceProcAddr( device, \"vkBindBufferMemory\" ) );\n        vkBindImageMemory                  = PFN_vkBindImageMemory( vkGetDeviceProcAddr( device, \"vkBindImageMemory\" ) );\n        vkGetBufferMemoryRequirements      = PFN_vkGetBufferMemoryRequirements( vkGetDeviceProcAddr( device, \"vkGetBufferMemoryRequirements\" ) );\n        vkGetImageMemoryRequirements       = PFN_vkGetImageMemoryRequirements( vkGetDeviceProcAddr( device, \"vkGetImageMemoryRequirements\" ) );\n        vkGetImageSparseMemoryRequirements = PFN_vkGetImageSparseMemoryRequirements( vkGetDeviceProcAddr( device, \"vkGetImageSparseMemoryRequirements\" ) );\n        vkQueueBindSparse                  = PFN_vkQueueBindSparse( vkGetDeviceProcAddr( device, \"vkQueueBindSparse\" ) );\n        vkCreateFence                      = PFN_vkCreateFence( vkGetDeviceProcAddr( device, \"vkCreateFence\" ) );\n        vkDestroyFence                     = PFN_vkDestroyFence( vkGetDeviceProcAddr( device, \"vkDestroyFence\" ) );\n        vkResetFences                      = PFN_vkResetFences( vkGetDeviceProcAddr( device, \"vkResetFences\" ) );\n        vkGetFenceStatus                   = PFN_vkGetFenceStatus( vkGetDeviceProcAddr( device, \"vkGetFenceStatus\" ) );\n        vkWaitForFences                    = PFN_vkWaitForFences( vkGetDeviceProcAddr( device, \"vkWaitForFences\" ) );\n        vkCreateSemaphore                  = PFN_vkCreateSemaphore( vkGetDeviceProcAddr( device, \"vkCreateSemaphore\" ) );\n        vkDestroySemaphore                 = PFN_vkDestroySemaphore( vkGetDeviceProcAddr( device, \"vkDestroySemaphore\" ) );\n        vkCreateEvent                      = PFN_vkCreateEvent( vkGetDeviceProcAddr( device, \"vkCreateEvent\" ) );\n        vkDestroyEvent                     = PFN_vkDestroyEvent( vkGetDeviceProcAddr( device, \"vkDestroyEvent\" ) );\n        vkGetEventStatus                   = PFN_vkGetEventStatus( vkGetDeviceProcAddr( device, \"vkGetEventStatus\" ) );\n        vkSetEvent                         = PFN_vkSetEvent( vkGetDeviceProcAddr( device, \"vkSetEvent\" ) );\n        vkResetEvent                       = PFN_vkResetEvent( vkGetDeviceProcAddr( device, \"vkResetEvent\" ) );\n        vkCreateQueryPool                  = PFN_vkCreateQueryPool( vkGetDeviceProcAddr( device, \"vkCreateQueryPool\" ) );\n        vkDestroyQueryPool                 = PFN_vkDestroyQueryPool( vkGetDeviceProcAddr( device, \"vkDestroyQueryPool\" ) );\n        vkGetQueryPoolResults              = PFN_vkGetQueryPoolResults( vkGetDeviceProcAddr( device, \"vkGetQueryPoolResults\" ) );\n        vkCreateBuffer                     = PFN_vkCreateBuffer( vkGetDeviceProcAddr( device, \"vkCreateBuffer\" ) );\n        vkDestroyBuffer                    = PFN_vkDestroyBuffer( vkGetDeviceProcAddr( device, \"vkDestroyBuffer\" ) );\n        vkCreateBufferView                 = PFN_vkCreateBufferView( vkGetDeviceProcAddr( device, \"vkCreateBufferView\" ) );\n        vkDestroyBufferView                = PFN_vkDestroyBufferView( vkGetDeviceProcAddr( device, \"vkDestroyBufferView\" ) );\n        vkCreateImage                      = PFN_vkCreateImage( vkGetDeviceProcAddr( device, \"vkCreateImage\" ) );\n        vkDestroyImage                     = PFN_vkDestroyImage( vkGetDeviceProcAddr( device, \"vkDestroyImage\" ) );\n        vkGetImageSubresourceLayout        = PFN_vkGetImageSubresourceLayout( vkGetDeviceProcAddr( device, \"vkGetImageSubresourceLayout\" ) );\n        vkCreateImageView                  = PFN_vkCreateImageView( vkGetDeviceProcAddr( device, \"vkCreateImageView\" ) );\n        vkDestroyImageView                 = PFN_vkDestroyImageView( vkGetDeviceProcAddr( device, \"vkDestroyImageView\" ) );\n        vkCreateShaderModule               = PFN_vkCreateShaderModule( vkGetDeviceProcAddr( device, \"vkCreateShaderModule\" ) );\n        vkDestroyShaderModule              = PFN_vkDestroyShaderModule( vkGetDeviceProcAddr( device, \"vkDestroyShaderModule\" ) );\n        vkCreatePipelineCache              = PFN_vkCreatePipelineCache( vkGetDeviceProcAddr( device, \"vkCreatePipelineCache\" ) );\n        vkDestroyPipelineCache             = PFN_vkDestroyPipelineCache( vkGetDeviceProcAddr( device, \"vkDestroyPipelineCache\" ) );\n        vkGetPipelineCacheData             = PFN_vkGetPipelineCacheData( vkGetDeviceProcAddr( device, \"vkGetPipelineCacheData\" ) );\n        vkMergePipelineCaches              = PFN_vkMergePipelineCaches( vkGetDeviceProcAddr( device, \"vkMergePipelineCaches\" ) );\n        vkCreateGraphicsPipelines          = PFN_vkCreateGraphicsPipelines( vkGetDeviceProcAddr( device, \"vkCreateGraphicsPipelines\" ) );\n        vkCreateComputePipelines           = PFN_vkCreateComputePipelines( vkGetDeviceProcAddr( device, \"vkCreateComputePipelines\" ) );\n        vkDestroyPipeline                  = PFN_vkDestroyPipeline( vkGetDeviceProcAddr( device, \"vkDestroyPipeline\" ) );\n        vkCreatePipelineLayout             = PFN_vkCreatePipelineLayout( vkGetDeviceProcAddr( device, \"vkCreatePipelineLayout\" ) );\n        vkDestroyPipelineLayout            = PFN_vkDestroyPipelineLayout( vkGetDeviceProcAddr( device, \"vkDestroyPipelineLayout\" ) );\n        vkCreateSampler                    = PFN_vkCreateSampler( vkGetDeviceProcAddr( device, \"vkCreateSampler\" ) );\n        vkDestroySampler                   = PFN_vkDestroySampler( vkGetDeviceProcAddr( device, \"vkDestroySampler\" ) );\n        vkCreateDescriptorSetLayout        = PFN_vkCreateDescriptorSetLayout( vkGetDeviceProcAddr( device, \"vkCreateDescriptorSetLayout\" ) );\n        vkDestroyDescriptorSetLayout       = PFN_vkDestroyDescriptorSetLayout( vkGetDeviceProcAddr( device, \"vkDestroyDescriptorSetLayout\" ) );\n        vkCreateDescriptorPool             = PFN_vkCreateDescriptorPool( vkGetDeviceProcAddr( device, \"vkCreateDescriptorPool\" ) );\n        vkDestroyDescriptorPool            = PFN_vkDestroyDescriptorPool( vkGetDeviceProcAddr( device, \"vkDestroyDescriptorPool\" ) );\n        vkResetDescriptorPool              = PFN_vkResetDescriptorPool( vkGetDeviceProcAddr( device, \"vkResetDescriptorPool\" ) );\n        vkAllocateDescriptorSets           = PFN_vkAllocateDescriptorSets( vkGetDeviceProcAddr( device, \"vkAllocateDescriptorSets\" ) );\n        vkFreeDescriptorSets               = PFN_vkFreeDescriptorSets( vkGetDeviceProcAddr( device, \"vkFreeDescriptorSets\" ) );\n        vkUpdateDescriptorSets             = PFN_vkUpdateDescriptorSets( vkGetDeviceProcAddr( device, \"vkUpdateDescriptorSets\" ) );\n        vkCreateFramebuffer                = PFN_vkCreateFramebuffer( vkGetDeviceProcAddr( device, \"vkCreateFramebuffer\" ) );\n        vkDestroyFramebuffer               = PFN_vkDestroyFramebuffer( vkGetDeviceProcAddr( device, \"vkDestroyFramebuffer\" ) );\n        vkCreateRenderPass                 = PFN_vkCreateRenderPass( vkGetDeviceProcAddr( device, \"vkCreateRenderPass\" ) );\n        vkDestroyRenderPass                = PFN_vkDestroyRenderPass( vkGetDeviceProcAddr( device, \"vkDestroyRenderPass\" ) );\n        vkGetRenderAreaGranularity         = PFN_vkGetRenderAreaGranularity( vkGetDeviceProcAddr( device, \"vkGetRenderAreaGranularity\" ) );\n        vkCreateCommandPool                = PFN_vkCreateCommandPool( vkGetDeviceProcAddr( device, \"vkCreateCommandPool\" ) );\n        vkDestroyCommandPool               = PFN_vkDestroyCommandPool( vkGetDeviceProcAddr( device, \"vkDestroyCommandPool\" ) );\n        vkResetCommandPool                 = PFN_vkResetCommandPool( vkGetDeviceProcAddr( device, \"vkResetCommandPool\" ) );\n        vkAllocateCommandBuffers           = PFN_vkAllocateCommandBuffers( vkGetDeviceProcAddr( device, \"vkAllocateCommandBuffers\" ) );\n        vkFreeCommandBuffers               = PFN_vkFreeCommandBuffers( vkGetDeviceProcAddr( device, \"vkFreeCommandBuffers\" ) );\n        vkBeginCommandBuffer               = PFN_vkBeginCommandBuffer( vkGetDeviceProcAddr( device, \"vkBeginCommandBuffer\" ) );\n        vkEndCommandBuffer                 = PFN_vkEndCommandBuffer( vkGetDeviceProcAddr( device, \"vkEndCommandBuffer\" ) );\n        vkResetCommandBuffer               = PFN_vkResetCommandBuffer( vkGetDeviceProcAddr( device, \"vkResetCommandBuffer\" ) );\n        vkCmdBindPipeline                  = PFN_vkCmdBindPipeline( vkGetDeviceProcAddr( device, \"vkCmdBindPipeline\" ) );\n        vkCmdSetViewport                   = PFN_vkCmdSetViewport( vkGetDeviceProcAddr( device, \"vkCmdSetViewport\" ) );\n        vkCmdSetScissor                    = PFN_vkCmdSetScissor( vkGetDeviceProcAddr( device, \"vkCmdSetScissor\" ) );\n        vkCmdSetLineWidth                  = PFN_vkCmdSetLineWidth( vkGetDeviceProcAddr( device, \"vkCmdSetLineWidth\" ) );\n        vkCmdSetDepthBias                  = PFN_vkCmdSetDepthBias( vkGetDeviceProcAddr( device, \"vkCmdSetDepthBias\" ) );\n        vkCmdSetBlendConstants             = PFN_vkCmdSetBlendConstants( vkGetDeviceProcAddr( device, \"vkCmdSetBlendConstants\" ) );\n        vkCmdSetDepthBounds                = PFN_vkCmdSetDepthBounds( vkGetDeviceProcAddr( device, \"vkCmdSetDepthBounds\" ) );\n        vkCmdSetStencilCompareMask         = PFN_vkCmdSetStencilCompareMask( vkGetDeviceProcAddr( device, \"vkCmdSetStencilCompareMask\" ) );\n        vkCmdSetStencilWriteMask           = PFN_vkCmdSetStencilWriteMask( vkGetDeviceProcAddr( device, \"vkCmdSetStencilWriteMask\" ) );\n        vkCmdSetStencilReference           = PFN_vkCmdSetStencilReference( vkGetDeviceProcAddr( device, \"vkCmdSetStencilReference\" ) );\n        vkCmdBindDescriptorSets            = PFN_vkCmdBindDescriptorSets( vkGetDeviceProcAddr( device, \"vkCmdBindDescriptorSets\" ) );\n        vkCmdBindIndexBuffer               = PFN_vkCmdBindIndexBuffer( vkGetDeviceProcAddr( device, \"vkCmdBindIndexBuffer\" ) );\n        vkCmdBindVertexBuffers             = PFN_vkCmdBindVertexBuffers( vkGetDeviceProcAddr( device, \"vkCmdBindVertexBuffers\" ) );\n        vkCmdDraw                          = PFN_vkCmdDraw( vkGetDeviceProcAddr( device, \"vkCmdDraw\" ) );\n        vkCmdDrawIndexed                   = PFN_vkCmdDrawIndexed( vkGetDeviceProcAddr( device, \"vkCmdDrawIndexed\" ) );\n        vkCmdDrawIndirect                  = PFN_vkCmdDrawIndirect( vkGetDeviceProcAddr( device, \"vkCmdDrawIndirect\" ) );\n        vkCmdDrawIndexedIndirect           = PFN_vkCmdDrawIndexedIndirect( vkGetDeviceProcAddr( device, \"vkCmdDrawIndexedIndirect\" ) );\n        vkCmdDispatch                      = PFN_vkCmdDispatch( vkGetDeviceProcAddr( device, \"vkCmdDispatch\" ) );\n        vkCmdDispatchIndirect              = PFN_vkCmdDispatchIndirect( vkGetDeviceProcAddr( device, \"vkCmdDispatchIndirect\" ) );\n        vkCmdCopyBuffer                    = PFN_vkCmdCopyBuffer( vkGetDeviceProcAddr( device, \"vkCmdCopyBuffer\" ) );\n        vkCmdCopyImage                     = PFN_vkCmdCopyImage( vkGetDeviceProcAddr( device, \"vkCmdCopyImage\" ) );\n        vkCmdBlitImage                     = PFN_vkCmdBlitImage( vkGetDeviceProcAddr( device, \"vkCmdBlitImage\" ) );\n        vkCmdCopyBufferToImage             = PFN_vkCmdCopyBufferToImage( vkGetDeviceProcAddr( device, \"vkCmdCopyBufferToImage\" ) );\n        vkCmdCopyImageToBuffer             = PFN_vkCmdCopyImageToBuffer( vkGetDeviceProcAddr( device, \"vkCmdCopyImageToBuffer\" ) );\n        vkCmdUpdateBuffer                  = PFN_vkCmdUpdateBuffer( vkGetDeviceProcAddr( device, \"vkCmdUpdateBuffer\" ) );\n        vkCmdFillBuffer                    = PFN_vkCmdFillBuffer( vkGetDeviceProcAddr( device, \"vkCmdFillBuffer\" ) );\n        vkCmdClearColorImage               = PFN_vkCmdClearColorImage( vkGetDeviceProcAddr( device, \"vkCmdClearColorImage\" ) );\n        vkCmdClearDepthStencilImage        = PFN_vkCmdClearDepthStencilImage( vkGetDeviceProcAddr( device, \"vkCmdClearDepthStencilImage\" ) );\n        vkCmdClearAttachments              = PFN_vkCmdClearAttachments( vkGetDeviceProcAddr( device, \"vkCmdClearAttachments\" ) );\n        vkCmdResolveImage                  = PFN_vkCmdResolveImage( vkGetDeviceProcAddr( device, \"vkCmdResolveImage\" ) );\n        vkCmdSetEvent                      = PFN_vkCmdSetEvent( vkGetDeviceProcAddr( device, \"vkCmdSetEvent\" ) );\n        vkCmdResetEvent                    = PFN_vkCmdResetEvent( vkGetDeviceProcAddr( device, \"vkCmdResetEvent\" ) );\n        vkCmdWaitEvents                    = PFN_vkCmdWaitEvents( vkGetDeviceProcAddr( device, \"vkCmdWaitEvents\" ) );\n        vkCmdPipelineBarrier               = PFN_vkCmdPipelineBarrier( vkGetDeviceProcAddr( device, \"vkCmdPipelineBarrier\" ) );\n        vkCmdBeginQuery                    = PFN_vkCmdBeginQuery( vkGetDeviceProcAddr( device, \"vkCmdBeginQuery\" ) );\n        vkCmdEndQuery                      = PFN_vkCmdEndQuery( vkGetDeviceProcAddr( device, \"vkCmdEndQuery\" ) );\n        vkCmdResetQueryPool                = PFN_vkCmdResetQueryPool( vkGetDeviceProcAddr( device, \"vkCmdResetQueryPool\" ) );\n        vkCmdWriteTimestamp                = PFN_vkCmdWriteTimestamp( vkGetDeviceProcAddr( device, \"vkCmdWriteTimestamp\" ) );\n        vkCmdCopyQueryPoolResults          = PFN_vkCmdCopyQueryPoolResults( vkGetDeviceProcAddr( device, \"vkCmdCopyQueryPoolResults\" ) );\n        vkCmdPushConstants                 = PFN_vkCmdPushConstants( vkGetDeviceProcAddr( device, \"vkCmdPushConstants\" ) );\n        vkCmdBeginRenderPass               = PFN_vkCmdBeginRenderPass( vkGetDeviceProcAddr( device, \"vkCmdBeginRenderPass\" ) );\n        vkCmdNextSubpass                   = PFN_vkCmdNextSubpass( vkGetDeviceProcAddr( device, \"vkCmdNextSubpass\" ) );\n        vkCmdEndRenderPass                 = PFN_vkCmdEndRenderPass( vkGetDeviceProcAddr( device, \"vkCmdEndRenderPass\" ) );\n        vkCmdExecuteCommands               = PFN_vkCmdExecuteCommands( vkGetDeviceProcAddr( device, \"vkCmdExecuteCommands\" ) );\n\n        //=== VK_VERSION_1_1 ===\n        vkBindBufferMemory2                 = PFN_vkBindBufferMemory2( vkGetDeviceProcAddr( device, \"vkBindBufferMemory2\" ) );\n        vkBindImageMemory2                  = PFN_vkBindImageMemory2( vkGetDeviceProcAddr( device, \"vkBindImageMemory2\" ) );\n        vkGetDeviceGroupPeerMemoryFeatures  = PFN_vkGetDeviceGroupPeerMemoryFeatures( vkGetDeviceProcAddr( device, \"vkGetDeviceGroupPeerMemoryFeatures\" ) );\n        vkCmdSetDeviceMask                  = PFN_vkCmdSetDeviceMask( vkGetDeviceProcAddr( device, \"vkCmdSetDeviceMask\" ) );\n        vkCmdDispatchBase                   = PFN_vkCmdDispatchBase( vkGetDeviceProcAddr( device, \"vkCmdDispatchBase\" ) );\n        vkGetImageMemoryRequirements2       = PFN_vkGetImageMemoryRequirements2( vkGetDeviceProcAddr( device, \"vkGetImageMemoryRequirements2\" ) );\n        vkGetBufferMemoryRequirements2      = PFN_vkGetBufferMemoryRequirements2( vkGetDeviceProcAddr( device, \"vkGetBufferMemoryRequirements2\" ) );\n        vkGetImageSparseMemoryRequirements2 = PFN_vkGetImageSparseMemoryRequirements2( vkGetDeviceProcAddr( device, \"vkGetImageSparseMemoryRequirements2\" ) );\n        vkTrimCommandPool                   = PFN_vkTrimCommandPool( vkGetDeviceProcAddr( device, \"vkTrimCommandPool\" ) );\n        vkGetDeviceQueue2                   = PFN_vkGetDeviceQueue2( vkGetDeviceProcAddr( device, \"vkGetDeviceQueue2\" ) );\n        vkCreateSamplerYcbcrConversion      = PFN_vkCreateSamplerYcbcrConversion( vkGetDeviceProcAddr( device, \"vkCreateSamplerYcbcrConversion\" ) );\n        vkDestroySamplerYcbcrConversion     = PFN_vkDestroySamplerYcbcrConversion( vkGetDeviceProcAddr( device, \"vkDestroySamplerYcbcrConversion\" ) );\n        vkCreateDescriptorUpdateTemplate    = PFN_vkCreateDescriptorUpdateTemplate( vkGetDeviceProcAddr( device, \"vkCreateDescriptorUpdateTemplate\" ) );\n        vkDestroyDescriptorUpdateTemplate   = PFN_vkDestroyDescriptorUpdateTemplate( vkGetDeviceProcAddr( device, \"vkDestroyDescriptorUpdateTemplate\" ) );\n        vkUpdateDescriptorSetWithTemplate   = PFN_vkUpdateDescriptorSetWithTemplate( vkGetDeviceProcAddr( device, \"vkUpdateDescriptorSetWithTemplate\" ) );\n        vkGetDescriptorSetLayoutSupport     = PFN_vkGetDescriptorSetLayoutSupport( vkGetDeviceProcAddr( device, \"vkGetDescriptorSetLayoutSupport\" ) );\n\n        //=== VK_VERSION_1_2 ===\n        vkCmdDrawIndirectCount          = PFN_vkCmdDrawIndirectCount( vkGetDeviceProcAddr( device, \"vkCmdDrawIndirectCount\" ) );\n        vkCmdDrawIndexedIndirectCount   = PFN_vkCmdDrawIndexedIndirectCount( vkGetDeviceProcAddr( device, \"vkCmdDrawIndexedIndirectCount\" ) );\n        vkCreateRenderPass2             = PFN_vkCreateRenderPass2( vkGetDeviceProcAddr( device, \"vkCreateRenderPass2\" ) );\n        vkCmdBeginRenderPass2           = PFN_vkCmdBeginRenderPass2( vkGetDeviceProcAddr( device, \"vkCmdBeginRenderPass2\" ) );\n        vkCmdNextSubpass2               = PFN_vkCmdNextSubpass2( vkGetDeviceProcAddr( device, \"vkCmdNextSubpass2\" ) );\n        vkCmdEndRenderPass2             = PFN_vkCmdEndRenderPass2( vkGetDeviceProcAddr( device, \"vkCmdEndRenderPass2\" ) );\n        vkResetQueryPool                = PFN_vkResetQueryPool( vkGetDeviceProcAddr( device, \"vkResetQueryPool\" ) );\n        vkGetSemaphoreCounterValue      = PFN_vkGetSemaphoreCounterValue( vkGetDeviceProcAddr( device, \"vkGetSemaphoreCounterValue\" ) );\n        vkWaitSemaphores                = PFN_vkWaitSemaphores( vkGetDeviceProcAddr( device, \"vkWaitSemaphores\" ) );\n        vkSignalSemaphore               = PFN_vkSignalSemaphore( vkGetDeviceProcAddr( device, \"vkSignalSemaphore\" ) );\n        vkGetBufferDeviceAddress        = PFN_vkGetBufferDeviceAddress( vkGetDeviceProcAddr( device, \"vkGetBufferDeviceAddress\" ) );\n        vkGetBufferOpaqueCaptureAddress = PFN_vkGetBufferOpaqueCaptureAddress( vkGetDeviceProcAddr( device, \"vkGetBufferOpaqueCaptureAddress\" ) );\n        vkGetDeviceMemoryOpaqueCaptureAddress =\n          PFN_vkGetDeviceMemoryOpaqueCaptureAddress( vkGetDeviceProcAddr( device, \"vkGetDeviceMemoryOpaqueCaptureAddress\" ) );\n\n        //=== VK_VERSION_1_3 ===\n        vkCreatePrivateDataSlot             = PFN_vkCreatePrivateDataSlot( vkGetDeviceProcAddr( device, \"vkCreatePrivateDataSlot\" ) );\n        vkDestroyPrivateDataSlot            = PFN_vkDestroyPrivateDataSlot( vkGetDeviceProcAddr( device, \"vkDestroyPrivateDataSlot\" ) );\n        vkSetPrivateData                    = PFN_vkSetPrivateData( vkGetDeviceProcAddr( device, \"vkSetPrivateData\" ) );\n        vkGetPrivateData                    = PFN_vkGetPrivateData( vkGetDeviceProcAddr( device, \"vkGetPrivateData\" ) );\n        vkCmdSetEvent2                      = PFN_vkCmdSetEvent2( vkGetDeviceProcAddr( device, \"vkCmdSetEvent2\" ) );\n        vkCmdResetEvent2                    = PFN_vkCmdResetEvent2( vkGetDeviceProcAddr( device, \"vkCmdResetEvent2\" ) );\n        vkCmdWaitEvents2                    = PFN_vkCmdWaitEvents2( vkGetDeviceProcAddr( device, \"vkCmdWaitEvents2\" ) );\n        vkCmdPipelineBarrier2               = PFN_vkCmdPipelineBarrier2( vkGetDeviceProcAddr( device, \"vkCmdPipelineBarrier2\" ) );\n        vkCmdWriteTimestamp2                = PFN_vkCmdWriteTimestamp2( vkGetDeviceProcAddr( device, \"vkCmdWriteTimestamp2\" ) );\n        vkQueueSubmit2                      = PFN_vkQueueSubmit2( vkGetDeviceProcAddr( device, \"vkQueueSubmit2\" ) );\n        vkCmdCopyBuffer2                    = PFN_vkCmdCopyBuffer2( vkGetDeviceProcAddr( device, \"vkCmdCopyBuffer2\" ) );\n        vkCmdCopyImage2                     = PFN_vkCmdCopyImage2( vkGetDeviceProcAddr( device, \"vkCmdCopyImage2\" ) );\n        vkCmdCopyBufferToImage2             = PFN_vkCmdCopyBufferToImage2( vkGetDeviceProcAddr( device, \"vkCmdCopyBufferToImage2\" ) );\n        vkCmdCopyImageToBuffer2             = PFN_vkCmdCopyImageToBuffer2( vkGetDeviceProcAddr( device, \"vkCmdCopyImageToBuffer2\" ) );\n        vkCmdBlitImage2                     = PFN_vkCmdBlitImage2( vkGetDeviceProcAddr( device, \"vkCmdBlitImage2\" ) );\n        vkCmdResolveImage2                  = PFN_vkCmdResolveImage2( vkGetDeviceProcAddr( device, \"vkCmdResolveImage2\" ) );\n        vkCmdBeginRendering                 = PFN_vkCmdBeginRendering( vkGetDeviceProcAddr( device, \"vkCmdBeginRendering\" ) );\n        vkCmdEndRendering                   = PFN_vkCmdEndRendering( vkGetDeviceProcAddr( device, \"vkCmdEndRendering\" ) );\n        vkCmdSetCullMode                    = PFN_vkCmdSetCullMode( vkGetDeviceProcAddr( device, \"vkCmdSetCullMode\" ) );\n        vkCmdSetFrontFace                   = PFN_vkCmdSetFrontFace( vkGetDeviceProcAddr( device, \"vkCmdSetFrontFace\" ) );\n        vkCmdSetPrimitiveTopology           = PFN_vkCmdSetPrimitiveTopology( vkGetDeviceProcAddr( device, \"vkCmdSetPrimitiveTopology\" ) );\n        vkCmdSetViewportWithCount           = PFN_vkCmdSetViewportWithCount( vkGetDeviceProcAddr( device, \"vkCmdSetViewportWithCount\" ) );\n        vkCmdSetScissorWithCount            = PFN_vkCmdSetScissorWithCount( vkGetDeviceProcAddr( device, \"vkCmdSetScissorWithCount\" ) );\n        vkCmdBindVertexBuffers2             = PFN_vkCmdBindVertexBuffers2( vkGetDeviceProcAddr( device, \"vkCmdBindVertexBuffers2\" ) );\n        vkCmdSetDepthTestEnable             = PFN_vkCmdSetDepthTestEnable( vkGetDeviceProcAddr( device, \"vkCmdSetDepthTestEnable\" ) );\n        vkCmdSetDepthWriteEnable            = PFN_vkCmdSetDepthWriteEnable( vkGetDeviceProcAddr( device, \"vkCmdSetDepthWriteEnable\" ) );\n        vkCmdSetDepthCompareOp              = PFN_vkCmdSetDepthCompareOp( vkGetDeviceProcAddr( device, \"vkCmdSetDepthCompareOp\" ) );\n        vkCmdSetDepthBoundsTestEnable       = PFN_vkCmdSetDepthBoundsTestEnable( vkGetDeviceProcAddr( device, \"vkCmdSetDepthBoundsTestEnable\" ) );\n        vkCmdSetStencilTestEnable           = PFN_vkCmdSetStencilTestEnable( vkGetDeviceProcAddr( device, \"vkCmdSetStencilTestEnable\" ) );\n        vkCmdSetStencilOp                   = PFN_vkCmdSetStencilOp( vkGetDeviceProcAddr( device, \"vkCmdSetStencilOp\" ) );\n        vkCmdSetRasterizerDiscardEnable     = PFN_vkCmdSetRasterizerDiscardEnable( vkGetDeviceProcAddr( device, \"vkCmdSetRasterizerDiscardEnable\" ) );\n        vkCmdSetDepthBiasEnable             = PFN_vkCmdSetDepthBiasEnable( vkGetDeviceProcAddr( device, \"vkCmdSetDepthBiasEnable\" ) );\n        vkCmdSetPrimitiveRestartEnable      = PFN_vkCmdSetPrimitiveRestartEnable( vkGetDeviceProcAddr( device, \"vkCmdSetPrimitiveRestartEnable\" ) );\n        vkGetDeviceBufferMemoryRequirements = PFN_vkGetDeviceBufferMemoryRequirements( vkGetDeviceProcAddr( device, \"vkGetDeviceBufferMemoryRequirements\" ) );\n        vkGetDeviceImageMemoryRequirements  = PFN_vkGetDeviceImageMemoryRequirements( vkGetDeviceProcAddr( device, \"vkGetDeviceImageMemoryRequirements\" ) );\n        vkGetDeviceImageSparseMemoryRequirements =\n          PFN_vkGetDeviceImageSparseMemoryRequirements( vkGetDeviceProcAddr( device, \"vkGetDeviceImageSparseMemoryRequirements\" ) );\n\n        //=== VK_VERSION_1_4 ===\n        vkCmdSetLineStipple                = PFN_vkCmdSetLineStipple( vkGetDeviceProcAddr( device, \"vkCmdSetLineStipple\" ) );\n        vkMapMemory2                       = PFN_vkMapMemory2( vkGetDeviceProcAddr( device, \"vkMapMemory2\" ) );\n        vkUnmapMemory2                     = PFN_vkUnmapMemory2( vkGetDeviceProcAddr( device, \"vkUnmapMemory2\" ) );\n        vkCmdBindIndexBuffer2              = PFN_vkCmdBindIndexBuffer2( vkGetDeviceProcAddr( device, \"vkCmdBindIndexBuffer2\" ) );\n        vkGetRenderingAreaGranularity      = PFN_vkGetRenderingAreaGranularity( vkGetDeviceProcAddr( device, \"vkGetRenderingAreaGranularity\" ) );\n        vkGetDeviceImageSubresourceLayout  = PFN_vkGetDeviceImageSubresourceLayout( vkGetDeviceProcAddr( device, \"vkGetDeviceImageSubresourceLayout\" ) );\n        vkGetImageSubresourceLayout2       = PFN_vkGetImageSubresourceLayout2( vkGetDeviceProcAddr( device, \"vkGetImageSubresourceLayout2\" ) );\n        vkCmdPushDescriptorSet             = PFN_vkCmdPushDescriptorSet( vkGetDeviceProcAddr( device, \"vkCmdPushDescriptorSet\" ) );\n        vkCmdPushDescriptorSetWithTemplate = PFN_vkCmdPushDescriptorSetWithTemplate( vkGetDeviceProcAddr( device, \"vkCmdPushDescriptorSetWithTemplate\" ) );\n        vkCmdSetRenderingAttachmentLocations =\n          PFN_vkCmdSetRenderingAttachmentLocations( vkGetDeviceProcAddr( device, \"vkCmdSetRenderingAttachmentLocations\" ) );\n        vkCmdSetRenderingInputAttachmentIndices =\n          PFN_vkCmdSetRenderingInputAttachmentIndices( vkGetDeviceProcAddr( device, \"vkCmdSetRenderingInputAttachmentIndices\" ) );\n        vkCmdBindDescriptorSets2            = PFN_vkCmdBindDescriptorSets2( vkGetDeviceProcAddr( device, \"vkCmdBindDescriptorSets2\" ) );\n        vkCmdPushConstants2                 = PFN_vkCmdPushConstants2( vkGetDeviceProcAddr( device, \"vkCmdPushConstants2\" ) );\n        vkCmdPushDescriptorSet2             = PFN_vkCmdPushDescriptorSet2( vkGetDeviceProcAddr( device, \"vkCmdPushDescriptorSet2\" ) );\n        vkCmdPushDescriptorSetWithTemplate2 = PFN_vkCmdPushDescriptorSetWithTemplate2( vkGetDeviceProcAddr( device, \"vkCmdPushDescriptorSetWithTemplate2\" ) );\n        vkCopyMemoryToImage                 = PFN_vkCopyMemoryToImage( vkGetDeviceProcAddr( device, \"vkCopyMemoryToImage\" ) );\n        vkCopyImageToMemory                 = PFN_vkCopyImageToMemory( vkGetDeviceProcAddr( device, \"vkCopyImageToMemory\" ) );\n        vkCopyImageToImage                  = PFN_vkCopyImageToImage( vkGetDeviceProcAddr( device, \"vkCopyImageToImage\" ) );\n        vkTransitionImageLayout             = PFN_vkTransitionImageLayout( vkGetDeviceProcAddr( device, \"vkTransitionImageLayout\" ) );\n\n        //=== VK_KHR_swapchain ===\n        vkCreateSwapchainKHR    = PFN_vkCreateSwapchainKHR( vkGetDeviceProcAddr( device, \"vkCreateSwapchainKHR\" ) );\n        vkDestroySwapchainKHR   = PFN_vkDestroySwapchainKHR( vkGetDeviceProcAddr( device, \"vkDestroySwapchainKHR\" ) );\n        vkGetSwapchainImagesKHR = PFN_vkGetSwapchainImagesKHR( vkGetDeviceProcAddr( device, \"vkGetSwapchainImagesKHR\" ) );\n        vkAcquireNextImageKHR   = PFN_vkAcquireNextImageKHR( vkGetDeviceProcAddr( device, \"vkAcquireNextImageKHR\" ) );\n        vkQueuePresentKHR       = PFN_vkQueuePresentKHR( vkGetDeviceProcAddr( device, \"vkQueuePresentKHR\" ) );\n        vkGetDeviceGroupPresentCapabilitiesKHR =\n          PFN_vkGetDeviceGroupPresentCapabilitiesKHR( vkGetDeviceProcAddr( device, \"vkGetDeviceGroupPresentCapabilitiesKHR\" ) );\n        vkGetDeviceGroupSurfacePresentModesKHR =\n          PFN_vkGetDeviceGroupSurfacePresentModesKHR( vkGetDeviceProcAddr( device, \"vkGetDeviceGroupSurfacePresentModesKHR\" ) );\n        vkAcquireNextImage2KHR = PFN_vkAcquireNextImage2KHR( vkGetDeviceProcAddr( device, \"vkAcquireNextImage2KHR\" ) );\n\n        //=== VK_KHR_display_swapchain ===\n        vkCreateSharedSwapchainsKHR = PFN_vkCreateSharedSwapchainsKHR( vkGetDeviceProcAddr( device, \"vkCreateSharedSwapchainsKHR\" ) );\n\n        //=== VK_EXT_debug_marker ===\n        vkDebugMarkerSetObjectTagEXT  = PFN_vkDebugMarkerSetObjectTagEXT( vkGetDeviceProcAddr( device, \"vkDebugMarkerSetObjectTagEXT\" ) );\n        vkDebugMarkerSetObjectNameEXT = PFN_vkDebugMarkerSetObjectNameEXT( vkGetDeviceProcAddr( device, \"vkDebugMarkerSetObjectNameEXT\" ) );\n        vkCmdDebugMarkerBeginEXT      = PFN_vkCmdDebugMarkerBeginEXT( vkGetDeviceProcAddr( device, \"vkCmdDebugMarkerBeginEXT\" ) );\n        vkCmdDebugMarkerEndEXT        = PFN_vkCmdDebugMarkerEndEXT( vkGetDeviceProcAddr( device, \"vkCmdDebugMarkerEndEXT\" ) );\n        vkCmdDebugMarkerInsertEXT     = PFN_vkCmdDebugMarkerInsertEXT( vkGetDeviceProcAddr( device, \"vkCmdDebugMarkerInsertEXT\" ) );\n\n        //=== VK_KHR_video_queue ===\n        vkCreateVideoSessionKHR  = PFN_vkCreateVideoSessionKHR( vkGetDeviceProcAddr( device, \"vkCreateVideoSessionKHR\" ) );\n        vkDestroyVideoSessionKHR = PFN_vkDestroyVideoSessionKHR( vkGetDeviceProcAddr( device, \"vkDestroyVideoSessionKHR\" ) );\n        vkGetVideoSessionMemoryRequirementsKHR =\n          PFN_vkGetVideoSessionMemoryRequirementsKHR( vkGetDeviceProcAddr( device, \"vkGetVideoSessionMemoryRequirementsKHR\" ) );\n        vkBindVideoSessionMemoryKHR        = PFN_vkBindVideoSessionMemoryKHR( vkGetDeviceProcAddr( device, \"vkBindVideoSessionMemoryKHR\" ) );\n        vkCreateVideoSessionParametersKHR  = PFN_vkCreateVideoSessionParametersKHR( vkGetDeviceProcAddr( device, \"vkCreateVideoSessionParametersKHR\" ) );\n        vkUpdateVideoSessionParametersKHR  = PFN_vkUpdateVideoSessionParametersKHR( vkGetDeviceProcAddr( device, \"vkUpdateVideoSessionParametersKHR\" ) );\n        vkDestroyVideoSessionParametersKHR = PFN_vkDestroyVideoSessionParametersKHR( vkGetDeviceProcAddr( device, \"vkDestroyVideoSessionParametersKHR\" ) );\n        vkCmdBeginVideoCodingKHR           = PFN_vkCmdBeginVideoCodingKHR( vkGetDeviceProcAddr( device, \"vkCmdBeginVideoCodingKHR\" ) );\n        vkCmdEndVideoCodingKHR             = PFN_vkCmdEndVideoCodingKHR( vkGetDeviceProcAddr( device, \"vkCmdEndVideoCodingKHR\" ) );\n        vkCmdControlVideoCodingKHR         = PFN_vkCmdControlVideoCodingKHR( vkGetDeviceProcAddr( device, \"vkCmdControlVideoCodingKHR\" ) );\n\n        //=== VK_KHR_video_decode_queue ===\n        vkCmdDecodeVideoKHR = PFN_vkCmdDecodeVideoKHR( vkGetDeviceProcAddr( device, \"vkCmdDecodeVideoKHR\" ) );\n\n        //=== VK_EXT_transform_feedback ===\n        vkCmdBindTransformFeedbackBuffersEXT =\n          PFN_vkCmdBindTransformFeedbackBuffersEXT( vkGetDeviceProcAddr( device, \"vkCmdBindTransformFeedbackBuffersEXT\" ) );\n        vkCmdBeginTransformFeedbackEXT = PFN_vkCmdBeginTransformFeedbackEXT( vkGetDeviceProcAddr( device, \"vkCmdBeginTransformFeedbackEXT\" ) );\n        vkCmdEndTransformFeedbackEXT   = PFN_vkCmdEndTransformFeedbackEXT( vkGetDeviceProcAddr( device, \"vkCmdEndTransformFeedbackEXT\" ) );\n        vkCmdBeginQueryIndexedEXT      = PFN_vkCmdBeginQueryIndexedEXT( vkGetDeviceProcAddr( device, \"vkCmdBeginQueryIndexedEXT\" ) );\n        vkCmdEndQueryIndexedEXT        = PFN_vkCmdEndQueryIndexedEXT( vkGetDeviceProcAddr( device, \"vkCmdEndQueryIndexedEXT\" ) );\n        vkCmdDrawIndirectByteCountEXT  = PFN_vkCmdDrawIndirectByteCountEXT( vkGetDeviceProcAddr( device, \"vkCmdDrawIndirectByteCountEXT\" ) );\n\n        //=== VK_NVX_binary_import ===\n        vkCreateCuModuleNVX    = PFN_vkCreateCuModuleNVX( vkGetDeviceProcAddr( device, \"vkCreateCuModuleNVX\" ) );\n        vkCreateCuFunctionNVX  = PFN_vkCreateCuFunctionNVX( vkGetDeviceProcAddr( device, \"vkCreateCuFunctionNVX\" ) );\n        vkDestroyCuModuleNVX   = PFN_vkDestroyCuModuleNVX( vkGetDeviceProcAddr( device, \"vkDestroyCuModuleNVX\" ) );\n        vkDestroyCuFunctionNVX = PFN_vkDestroyCuFunctionNVX( vkGetDeviceProcAddr( device, \"vkDestroyCuFunctionNVX\" ) );\n        vkCmdCuLaunchKernelNVX = PFN_vkCmdCuLaunchKernelNVX( vkGetDeviceProcAddr( device, \"vkCmdCuLaunchKernelNVX\" ) );\n\n        //=== VK_NVX_image_view_handle ===\n        vkGetImageViewHandleNVX   = PFN_vkGetImageViewHandleNVX( vkGetDeviceProcAddr( device, \"vkGetImageViewHandleNVX\" ) );\n        vkGetImageViewHandle64NVX = PFN_vkGetImageViewHandle64NVX( vkGetDeviceProcAddr( device, \"vkGetImageViewHandle64NVX\" ) );\n        vkGetImageViewAddressNVX  = PFN_vkGetImageViewAddressNVX( vkGetDeviceProcAddr( device, \"vkGetImageViewAddressNVX\" ) );\n\n        //=== VK_AMD_draw_indirect_count ===\n        vkCmdDrawIndirectCountAMD = PFN_vkCmdDrawIndirectCountAMD( vkGetDeviceProcAddr( device, \"vkCmdDrawIndirectCountAMD\" ) );\n        if ( !vkCmdDrawIndirectCount )\n          vkCmdDrawIndirectCount = vkCmdDrawIndirectCountAMD;\n        vkCmdDrawIndexedIndirectCountAMD = PFN_vkCmdDrawIndexedIndirectCountAMD( vkGetDeviceProcAddr( device, \"vkCmdDrawIndexedIndirectCountAMD\" ) );\n        if ( !vkCmdDrawIndexedIndirectCount )\n          vkCmdDrawIndexedIndirectCount = vkCmdDrawIndexedIndirectCountAMD;\n\n        //=== VK_AMD_shader_info ===\n        vkGetShaderInfoAMD = PFN_vkGetShaderInfoAMD( vkGetDeviceProcAddr( device, \"vkGetShaderInfoAMD\" ) );\n\n        //=== VK_KHR_dynamic_rendering ===\n        vkCmdBeginRenderingKHR = PFN_vkCmdBeginRenderingKHR( vkGetDeviceProcAddr( device, \"vkCmdBeginRenderingKHR\" ) );\n        if ( !vkCmdBeginRendering )\n          vkCmdBeginRendering = vkCmdBeginRenderingKHR;\n        vkCmdEndRenderingKHR = PFN_vkCmdEndRenderingKHR( vkGetDeviceProcAddr( device, \"vkCmdEndRenderingKHR\" ) );\n        if ( !vkCmdEndRendering )\n          vkCmdEndRendering = vkCmdEndRenderingKHR;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n        //=== VK_NV_external_memory_win32 ===\n        vkGetMemoryWin32HandleNV = PFN_vkGetMemoryWin32HandleNV( vkGetDeviceProcAddr( device, \"vkGetMemoryWin32HandleNV\" ) );\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n        //=== VK_KHR_device_group ===\n        vkGetDeviceGroupPeerMemoryFeaturesKHR =\n          PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR( vkGetDeviceProcAddr( device, \"vkGetDeviceGroupPeerMemoryFeaturesKHR\" ) );\n        if ( !vkGetDeviceGroupPeerMemoryFeatures )\n          vkGetDeviceGroupPeerMemoryFeatures = vkGetDeviceGroupPeerMemoryFeaturesKHR;\n        vkCmdSetDeviceMaskKHR = PFN_vkCmdSetDeviceMaskKHR( vkGetDeviceProcAddr( device, \"vkCmdSetDeviceMaskKHR\" ) );\n        if ( !vkCmdSetDeviceMask )\n          vkCmdSetDeviceMask = vkCmdSetDeviceMaskKHR;\n        vkCmdDispatchBaseKHR = PFN_vkCmdDispatchBaseKHR( vkGetDeviceProcAddr( device, \"vkCmdDispatchBaseKHR\" ) );\n        if ( !vkCmdDispatchBase )\n          vkCmdDispatchBase = vkCmdDispatchBaseKHR;\n\n        //=== VK_KHR_maintenance1 ===\n        vkTrimCommandPoolKHR = PFN_vkTrimCommandPoolKHR( vkGetDeviceProcAddr( device, \"vkTrimCommandPoolKHR\" ) );\n        if ( !vkTrimCommandPool )\n          vkTrimCommandPool = vkTrimCommandPoolKHR;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n        //=== VK_KHR_external_memory_win32 ===\n        vkGetMemoryWin32HandleKHR           = PFN_vkGetMemoryWin32HandleKHR( vkGetDeviceProcAddr( device, \"vkGetMemoryWin32HandleKHR\" ) );\n        vkGetMemoryWin32HandlePropertiesKHR = PFN_vkGetMemoryWin32HandlePropertiesKHR( vkGetDeviceProcAddr( device, \"vkGetMemoryWin32HandlePropertiesKHR\" ) );\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n        //=== VK_KHR_external_memory_fd ===\n        vkGetMemoryFdKHR           = PFN_vkGetMemoryFdKHR( vkGetDeviceProcAddr( device, \"vkGetMemoryFdKHR\" ) );\n        vkGetMemoryFdPropertiesKHR = PFN_vkGetMemoryFdPropertiesKHR( vkGetDeviceProcAddr( device, \"vkGetMemoryFdPropertiesKHR\" ) );\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n        //=== VK_KHR_external_semaphore_win32 ===\n        vkImportSemaphoreWin32HandleKHR = PFN_vkImportSemaphoreWin32HandleKHR( vkGetDeviceProcAddr( device, \"vkImportSemaphoreWin32HandleKHR\" ) );\n        vkGetSemaphoreWin32HandleKHR    = PFN_vkGetSemaphoreWin32HandleKHR( vkGetDeviceProcAddr( device, \"vkGetSemaphoreWin32HandleKHR\" ) );\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n        //=== VK_KHR_external_semaphore_fd ===\n        vkImportSemaphoreFdKHR = PFN_vkImportSemaphoreFdKHR( vkGetDeviceProcAddr( device, \"vkImportSemaphoreFdKHR\" ) );\n        vkGetSemaphoreFdKHR    = PFN_vkGetSemaphoreFdKHR( vkGetDeviceProcAddr( device, \"vkGetSemaphoreFdKHR\" ) );\n\n        //=== VK_KHR_push_descriptor ===\n        vkCmdPushDescriptorSetKHR = PFN_vkCmdPushDescriptorSetKHR( vkGetDeviceProcAddr( device, \"vkCmdPushDescriptorSetKHR\" ) );\n        if ( !vkCmdPushDescriptorSet )\n          vkCmdPushDescriptorSet = vkCmdPushDescriptorSetKHR;\n        vkCmdPushDescriptorSetWithTemplateKHR =\n          PFN_vkCmdPushDescriptorSetWithTemplateKHR( vkGetDeviceProcAddr( device, \"vkCmdPushDescriptorSetWithTemplateKHR\" ) );\n        if ( !vkCmdPushDescriptorSetWithTemplate )\n          vkCmdPushDescriptorSetWithTemplate = vkCmdPushDescriptorSetWithTemplateKHR;\n\n        //=== VK_EXT_conditional_rendering ===\n        vkCmdBeginConditionalRenderingEXT = PFN_vkCmdBeginConditionalRenderingEXT( vkGetDeviceProcAddr( device, \"vkCmdBeginConditionalRenderingEXT\" ) );\n        vkCmdEndConditionalRenderingEXT   = PFN_vkCmdEndConditionalRenderingEXT( vkGetDeviceProcAddr( device, \"vkCmdEndConditionalRenderingEXT\" ) );\n\n        //=== VK_KHR_descriptor_update_template ===\n        vkCreateDescriptorUpdateTemplateKHR = PFN_vkCreateDescriptorUpdateTemplateKHR( vkGetDeviceProcAddr( device, \"vkCreateDescriptorUpdateTemplateKHR\" ) );\n        if ( !vkCreateDescriptorUpdateTemplate )\n          vkCreateDescriptorUpdateTemplate = vkCreateDescriptorUpdateTemplateKHR;\n        vkDestroyDescriptorUpdateTemplateKHR =\n          PFN_vkDestroyDescriptorUpdateTemplateKHR( vkGetDeviceProcAddr( device, \"vkDestroyDescriptorUpdateTemplateKHR\" ) );\n        if ( !vkDestroyDescriptorUpdateTemplate )\n          vkDestroyDescriptorUpdateTemplate = vkDestroyDescriptorUpdateTemplateKHR;\n        vkUpdateDescriptorSetWithTemplateKHR =\n          PFN_vkUpdateDescriptorSetWithTemplateKHR( vkGetDeviceProcAddr( device, \"vkUpdateDescriptorSetWithTemplateKHR\" ) );\n        if ( !vkUpdateDescriptorSetWithTemplate )\n          vkUpdateDescriptorSetWithTemplate = vkUpdateDescriptorSetWithTemplateKHR;\n\n        //=== VK_NV_clip_space_w_scaling ===\n        vkCmdSetViewportWScalingNV = PFN_vkCmdSetViewportWScalingNV( vkGetDeviceProcAddr( device, \"vkCmdSetViewportWScalingNV\" ) );\n\n        //=== VK_EXT_display_control ===\n        vkDisplayPowerControlEXT  = PFN_vkDisplayPowerControlEXT( vkGetDeviceProcAddr( device, \"vkDisplayPowerControlEXT\" ) );\n        vkRegisterDeviceEventEXT  = PFN_vkRegisterDeviceEventEXT( vkGetDeviceProcAddr( device, \"vkRegisterDeviceEventEXT\" ) );\n        vkRegisterDisplayEventEXT = PFN_vkRegisterDisplayEventEXT( vkGetDeviceProcAddr( device, \"vkRegisterDisplayEventEXT\" ) );\n        vkGetSwapchainCounterEXT  = PFN_vkGetSwapchainCounterEXT( vkGetDeviceProcAddr( device, \"vkGetSwapchainCounterEXT\" ) );\n\n        //=== VK_GOOGLE_display_timing ===\n        vkGetRefreshCycleDurationGOOGLE   = PFN_vkGetRefreshCycleDurationGOOGLE( vkGetDeviceProcAddr( device, \"vkGetRefreshCycleDurationGOOGLE\" ) );\n        vkGetPastPresentationTimingGOOGLE = PFN_vkGetPastPresentationTimingGOOGLE( vkGetDeviceProcAddr( device, \"vkGetPastPresentationTimingGOOGLE\" ) );\n\n        //=== VK_EXT_discard_rectangles ===\n        vkCmdSetDiscardRectangleEXT       = PFN_vkCmdSetDiscardRectangleEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDiscardRectangleEXT\" ) );\n        vkCmdSetDiscardRectangleEnableEXT = PFN_vkCmdSetDiscardRectangleEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDiscardRectangleEnableEXT\" ) );\n        vkCmdSetDiscardRectangleModeEXT   = PFN_vkCmdSetDiscardRectangleModeEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDiscardRectangleModeEXT\" ) );\n\n        //=== VK_EXT_hdr_metadata ===\n        vkSetHdrMetadataEXT = PFN_vkSetHdrMetadataEXT( vkGetDeviceProcAddr( device, \"vkSetHdrMetadataEXT\" ) );\n\n        //=== VK_KHR_create_renderpass2 ===\n        vkCreateRenderPass2KHR = PFN_vkCreateRenderPass2KHR( vkGetDeviceProcAddr( device, \"vkCreateRenderPass2KHR\" ) );\n        if ( !vkCreateRenderPass2 )\n          vkCreateRenderPass2 = vkCreateRenderPass2KHR;\n        vkCmdBeginRenderPass2KHR = PFN_vkCmdBeginRenderPass2KHR( vkGetDeviceProcAddr( device, \"vkCmdBeginRenderPass2KHR\" ) );\n        if ( !vkCmdBeginRenderPass2 )\n          vkCmdBeginRenderPass2 = vkCmdBeginRenderPass2KHR;\n        vkCmdNextSubpass2KHR = PFN_vkCmdNextSubpass2KHR( vkGetDeviceProcAddr( device, \"vkCmdNextSubpass2KHR\" ) );\n        if ( !vkCmdNextSubpass2 )\n          vkCmdNextSubpass2 = vkCmdNextSubpass2KHR;\n        vkCmdEndRenderPass2KHR = PFN_vkCmdEndRenderPass2KHR( vkGetDeviceProcAddr( device, \"vkCmdEndRenderPass2KHR\" ) );\n        if ( !vkCmdEndRenderPass2 )\n          vkCmdEndRenderPass2 = vkCmdEndRenderPass2KHR;\n\n        //=== VK_KHR_shared_presentable_image ===\n        vkGetSwapchainStatusKHR = PFN_vkGetSwapchainStatusKHR( vkGetDeviceProcAddr( device, \"vkGetSwapchainStatusKHR\" ) );\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n        //=== VK_KHR_external_fence_win32 ===\n        vkImportFenceWin32HandleKHR = PFN_vkImportFenceWin32HandleKHR( vkGetDeviceProcAddr( device, \"vkImportFenceWin32HandleKHR\" ) );\n        vkGetFenceWin32HandleKHR    = PFN_vkGetFenceWin32HandleKHR( vkGetDeviceProcAddr( device, \"vkGetFenceWin32HandleKHR\" ) );\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n        //=== VK_KHR_external_fence_fd ===\n        vkImportFenceFdKHR = PFN_vkImportFenceFdKHR( vkGetDeviceProcAddr( device, \"vkImportFenceFdKHR\" ) );\n        vkGetFenceFdKHR    = PFN_vkGetFenceFdKHR( vkGetDeviceProcAddr( device, \"vkGetFenceFdKHR\" ) );\n\n        //=== VK_KHR_performance_query ===\n        vkAcquireProfilingLockKHR = PFN_vkAcquireProfilingLockKHR( vkGetDeviceProcAddr( device, \"vkAcquireProfilingLockKHR\" ) );\n        vkReleaseProfilingLockKHR = PFN_vkReleaseProfilingLockKHR( vkGetDeviceProcAddr( device, \"vkReleaseProfilingLockKHR\" ) );\n\n        //=== VK_EXT_debug_utils ===\n        vkSetDebugUtilsObjectNameEXT    = PFN_vkSetDebugUtilsObjectNameEXT( vkGetDeviceProcAddr( device, \"vkSetDebugUtilsObjectNameEXT\" ) );\n        vkSetDebugUtilsObjectTagEXT     = PFN_vkSetDebugUtilsObjectTagEXT( vkGetDeviceProcAddr( device, \"vkSetDebugUtilsObjectTagEXT\" ) );\n        vkQueueBeginDebugUtilsLabelEXT  = PFN_vkQueueBeginDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, \"vkQueueBeginDebugUtilsLabelEXT\" ) );\n        vkQueueEndDebugUtilsLabelEXT    = PFN_vkQueueEndDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, \"vkQueueEndDebugUtilsLabelEXT\" ) );\n        vkQueueInsertDebugUtilsLabelEXT = PFN_vkQueueInsertDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, \"vkQueueInsertDebugUtilsLabelEXT\" ) );\n        vkCmdBeginDebugUtilsLabelEXT    = PFN_vkCmdBeginDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, \"vkCmdBeginDebugUtilsLabelEXT\" ) );\n        vkCmdEndDebugUtilsLabelEXT      = PFN_vkCmdEndDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, \"vkCmdEndDebugUtilsLabelEXT\" ) );\n        vkCmdInsertDebugUtilsLabelEXT   = PFN_vkCmdInsertDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, \"vkCmdInsertDebugUtilsLabelEXT\" ) );\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n        //=== VK_ANDROID_external_memory_android_hardware_buffer ===\n        vkGetAndroidHardwareBufferPropertiesANDROID =\n          PFN_vkGetAndroidHardwareBufferPropertiesANDROID( vkGetDeviceProcAddr( device, \"vkGetAndroidHardwareBufferPropertiesANDROID\" ) );\n        vkGetMemoryAndroidHardwareBufferANDROID =\n          PFN_vkGetMemoryAndroidHardwareBufferANDROID( vkGetDeviceProcAddr( device, \"vkGetMemoryAndroidHardwareBufferANDROID\" ) );\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n        //=== VK_AMDX_shader_enqueue ===\n        vkCreateExecutionGraphPipelinesAMDX = PFN_vkCreateExecutionGraphPipelinesAMDX( vkGetDeviceProcAddr( device, \"vkCreateExecutionGraphPipelinesAMDX\" ) );\n        vkGetExecutionGraphPipelineScratchSizeAMDX =\n          PFN_vkGetExecutionGraphPipelineScratchSizeAMDX( vkGetDeviceProcAddr( device, \"vkGetExecutionGraphPipelineScratchSizeAMDX\" ) );\n        vkGetExecutionGraphPipelineNodeIndexAMDX =\n          PFN_vkGetExecutionGraphPipelineNodeIndexAMDX( vkGetDeviceProcAddr( device, \"vkGetExecutionGraphPipelineNodeIndexAMDX\" ) );\n        vkCmdInitializeGraphScratchMemoryAMDX =\n          PFN_vkCmdInitializeGraphScratchMemoryAMDX( vkGetDeviceProcAddr( device, \"vkCmdInitializeGraphScratchMemoryAMDX\" ) );\n        vkCmdDispatchGraphAMDX              = PFN_vkCmdDispatchGraphAMDX( vkGetDeviceProcAddr( device, \"vkCmdDispatchGraphAMDX\" ) );\n        vkCmdDispatchGraphIndirectAMDX      = PFN_vkCmdDispatchGraphIndirectAMDX( vkGetDeviceProcAddr( device, \"vkCmdDispatchGraphIndirectAMDX\" ) );\n        vkCmdDispatchGraphIndirectCountAMDX = PFN_vkCmdDispatchGraphIndirectCountAMDX( vkGetDeviceProcAddr( device, \"vkCmdDispatchGraphIndirectCountAMDX\" ) );\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n        //=== VK_EXT_sample_locations ===\n        vkCmdSetSampleLocationsEXT = PFN_vkCmdSetSampleLocationsEXT( vkGetDeviceProcAddr( device, \"vkCmdSetSampleLocationsEXT\" ) );\n\n        //=== VK_KHR_get_memory_requirements2 ===\n        vkGetImageMemoryRequirements2KHR = PFN_vkGetImageMemoryRequirements2KHR( vkGetDeviceProcAddr( device, \"vkGetImageMemoryRequirements2KHR\" ) );\n        if ( !vkGetImageMemoryRequirements2 )\n          vkGetImageMemoryRequirements2 = vkGetImageMemoryRequirements2KHR;\n        vkGetBufferMemoryRequirements2KHR = PFN_vkGetBufferMemoryRequirements2KHR( vkGetDeviceProcAddr( device, \"vkGetBufferMemoryRequirements2KHR\" ) );\n        if ( !vkGetBufferMemoryRequirements2 )\n          vkGetBufferMemoryRequirements2 = vkGetBufferMemoryRequirements2KHR;\n        vkGetImageSparseMemoryRequirements2KHR =\n          PFN_vkGetImageSparseMemoryRequirements2KHR( vkGetDeviceProcAddr( device, \"vkGetImageSparseMemoryRequirements2KHR\" ) );\n        if ( !vkGetImageSparseMemoryRequirements2 )\n          vkGetImageSparseMemoryRequirements2 = vkGetImageSparseMemoryRequirements2KHR;\n\n        //=== VK_KHR_acceleration_structure ===\n        vkCreateAccelerationStructureKHR    = PFN_vkCreateAccelerationStructureKHR( vkGetDeviceProcAddr( device, \"vkCreateAccelerationStructureKHR\" ) );\n        vkDestroyAccelerationStructureKHR   = PFN_vkDestroyAccelerationStructureKHR( vkGetDeviceProcAddr( device, \"vkDestroyAccelerationStructureKHR\" ) );\n        vkCmdBuildAccelerationStructuresKHR = PFN_vkCmdBuildAccelerationStructuresKHR( vkGetDeviceProcAddr( device, \"vkCmdBuildAccelerationStructuresKHR\" ) );\n        vkCmdBuildAccelerationStructuresIndirectKHR =\n          PFN_vkCmdBuildAccelerationStructuresIndirectKHR( vkGetDeviceProcAddr( device, \"vkCmdBuildAccelerationStructuresIndirectKHR\" ) );\n        vkBuildAccelerationStructuresKHR = PFN_vkBuildAccelerationStructuresKHR( vkGetDeviceProcAddr( device, \"vkBuildAccelerationStructuresKHR\" ) );\n        vkCopyAccelerationStructureKHR   = PFN_vkCopyAccelerationStructureKHR( vkGetDeviceProcAddr( device, \"vkCopyAccelerationStructureKHR\" ) );\n        vkCopyAccelerationStructureToMemoryKHR =\n          PFN_vkCopyAccelerationStructureToMemoryKHR( vkGetDeviceProcAddr( device, \"vkCopyAccelerationStructureToMemoryKHR\" ) );\n        vkCopyMemoryToAccelerationStructureKHR =\n          PFN_vkCopyMemoryToAccelerationStructureKHR( vkGetDeviceProcAddr( device, \"vkCopyMemoryToAccelerationStructureKHR\" ) );\n        vkWriteAccelerationStructuresPropertiesKHR =\n          PFN_vkWriteAccelerationStructuresPropertiesKHR( vkGetDeviceProcAddr( device, \"vkWriteAccelerationStructuresPropertiesKHR\" ) );\n        vkCmdCopyAccelerationStructureKHR = PFN_vkCmdCopyAccelerationStructureKHR( vkGetDeviceProcAddr( device, \"vkCmdCopyAccelerationStructureKHR\" ) );\n        vkCmdCopyAccelerationStructureToMemoryKHR =\n          PFN_vkCmdCopyAccelerationStructureToMemoryKHR( vkGetDeviceProcAddr( device, \"vkCmdCopyAccelerationStructureToMemoryKHR\" ) );\n        vkCmdCopyMemoryToAccelerationStructureKHR =\n          PFN_vkCmdCopyMemoryToAccelerationStructureKHR( vkGetDeviceProcAddr( device, \"vkCmdCopyMemoryToAccelerationStructureKHR\" ) );\n        vkGetAccelerationStructureDeviceAddressKHR =\n          PFN_vkGetAccelerationStructureDeviceAddressKHR( vkGetDeviceProcAddr( device, \"vkGetAccelerationStructureDeviceAddressKHR\" ) );\n        vkCmdWriteAccelerationStructuresPropertiesKHR =\n          PFN_vkCmdWriteAccelerationStructuresPropertiesKHR( vkGetDeviceProcAddr( device, \"vkCmdWriteAccelerationStructuresPropertiesKHR\" ) );\n        vkGetDeviceAccelerationStructureCompatibilityKHR =\n          PFN_vkGetDeviceAccelerationStructureCompatibilityKHR( vkGetDeviceProcAddr( device, \"vkGetDeviceAccelerationStructureCompatibilityKHR\" ) );\n        vkGetAccelerationStructureBuildSizesKHR =\n          PFN_vkGetAccelerationStructureBuildSizesKHR( vkGetDeviceProcAddr( device, \"vkGetAccelerationStructureBuildSizesKHR\" ) );\n\n        //=== VK_KHR_ray_tracing_pipeline ===\n        vkCmdTraceRaysKHR              = PFN_vkCmdTraceRaysKHR( vkGetDeviceProcAddr( device, \"vkCmdTraceRaysKHR\" ) );\n        vkCreateRayTracingPipelinesKHR = PFN_vkCreateRayTracingPipelinesKHR( vkGetDeviceProcAddr( device, \"vkCreateRayTracingPipelinesKHR\" ) );\n        vkGetRayTracingShaderGroupHandlesKHR =\n          PFN_vkGetRayTracingShaderGroupHandlesKHR( vkGetDeviceProcAddr( device, \"vkGetRayTracingShaderGroupHandlesKHR\" ) );\n        vkGetRayTracingCaptureReplayShaderGroupHandlesKHR =\n          PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR( vkGetDeviceProcAddr( device, \"vkGetRayTracingCaptureReplayShaderGroupHandlesKHR\" ) );\n        vkCmdTraceRaysIndirectKHR = PFN_vkCmdTraceRaysIndirectKHR( vkGetDeviceProcAddr( device, \"vkCmdTraceRaysIndirectKHR\" ) );\n        vkGetRayTracingShaderGroupStackSizeKHR =\n          PFN_vkGetRayTracingShaderGroupStackSizeKHR( vkGetDeviceProcAddr( device, \"vkGetRayTracingShaderGroupStackSizeKHR\" ) );\n        vkCmdSetRayTracingPipelineStackSizeKHR =\n          PFN_vkCmdSetRayTracingPipelineStackSizeKHR( vkGetDeviceProcAddr( device, \"vkCmdSetRayTracingPipelineStackSizeKHR\" ) );\n\n        //=== VK_KHR_sampler_ycbcr_conversion ===\n        vkCreateSamplerYcbcrConversionKHR = PFN_vkCreateSamplerYcbcrConversionKHR( vkGetDeviceProcAddr( device, \"vkCreateSamplerYcbcrConversionKHR\" ) );\n        if ( !vkCreateSamplerYcbcrConversion )\n          vkCreateSamplerYcbcrConversion = vkCreateSamplerYcbcrConversionKHR;\n        vkDestroySamplerYcbcrConversionKHR = PFN_vkDestroySamplerYcbcrConversionKHR( vkGetDeviceProcAddr( device, \"vkDestroySamplerYcbcrConversionKHR\" ) );\n        if ( !vkDestroySamplerYcbcrConversion )\n          vkDestroySamplerYcbcrConversion = vkDestroySamplerYcbcrConversionKHR;\n\n        //=== VK_KHR_bind_memory2 ===\n        vkBindBufferMemory2KHR = PFN_vkBindBufferMemory2KHR( vkGetDeviceProcAddr( device, \"vkBindBufferMemory2KHR\" ) );\n        if ( !vkBindBufferMemory2 )\n          vkBindBufferMemory2 = vkBindBufferMemory2KHR;\n        vkBindImageMemory2KHR = PFN_vkBindImageMemory2KHR( vkGetDeviceProcAddr( device, \"vkBindImageMemory2KHR\" ) );\n        if ( !vkBindImageMemory2 )\n          vkBindImageMemory2 = vkBindImageMemory2KHR;\n\n        //=== VK_EXT_image_drm_format_modifier ===\n        vkGetImageDrmFormatModifierPropertiesEXT =\n          PFN_vkGetImageDrmFormatModifierPropertiesEXT( vkGetDeviceProcAddr( device, \"vkGetImageDrmFormatModifierPropertiesEXT\" ) );\n\n        //=== VK_EXT_validation_cache ===\n        vkCreateValidationCacheEXT  = PFN_vkCreateValidationCacheEXT( vkGetDeviceProcAddr( device, \"vkCreateValidationCacheEXT\" ) );\n        vkDestroyValidationCacheEXT = PFN_vkDestroyValidationCacheEXT( vkGetDeviceProcAddr( device, \"vkDestroyValidationCacheEXT\" ) );\n        vkMergeValidationCachesEXT  = PFN_vkMergeValidationCachesEXT( vkGetDeviceProcAddr( device, \"vkMergeValidationCachesEXT\" ) );\n        vkGetValidationCacheDataEXT = PFN_vkGetValidationCacheDataEXT( vkGetDeviceProcAddr( device, \"vkGetValidationCacheDataEXT\" ) );\n\n        //=== VK_NV_shading_rate_image ===\n        vkCmdBindShadingRateImageNV = PFN_vkCmdBindShadingRateImageNV( vkGetDeviceProcAddr( device, \"vkCmdBindShadingRateImageNV\" ) );\n        vkCmdSetViewportShadingRatePaletteNV =\n          PFN_vkCmdSetViewportShadingRatePaletteNV( vkGetDeviceProcAddr( device, \"vkCmdSetViewportShadingRatePaletteNV\" ) );\n        vkCmdSetCoarseSampleOrderNV = PFN_vkCmdSetCoarseSampleOrderNV( vkGetDeviceProcAddr( device, \"vkCmdSetCoarseSampleOrderNV\" ) );\n\n        //=== VK_NV_ray_tracing ===\n        vkCreateAccelerationStructureNV  = PFN_vkCreateAccelerationStructureNV( vkGetDeviceProcAddr( device, \"vkCreateAccelerationStructureNV\" ) );\n        vkDestroyAccelerationStructureNV = PFN_vkDestroyAccelerationStructureNV( vkGetDeviceProcAddr( device, \"vkDestroyAccelerationStructureNV\" ) );\n        vkGetAccelerationStructureMemoryRequirementsNV =\n          PFN_vkGetAccelerationStructureMemoryRequirementsNV( vkGetDeviceProcAddr( device, \"vkGetAccelerationStructureMemoryRequirementsNV\" ) );\n        vkBindAccelerationStructureMemoryNV = PFN_vkBindAccelerationStructureMemoryNV( vkGetDeviceProcAddr( device, \"vkBindAccelerationStructureMemoryNV\" ) );\n        vkCmdBuildAccelerationStructureNV   = PFN_vkCmdBuildAccelerationStructureNV( vkGetDeviceProcAddr( device, \"vkCmdBuildAccelerationStructureNV\" ) );\n        vkCmdCopyAccelerationStructureNV    = PFN_vkCmdCopyAccelerationStructureNV( vkGetDeviceProcAddr( device, \"vkCmdCopyAccelerationStructureNV\" ) );\n        vkCmdTraceRaysNV                    = PFN_vkCmdTraceRaysNV( vkGetDeviceProcAddr( device, \"vkCmdTraceRaysNV\" ) );\n        vkCreateRayTracingPipelinesNV       = PFN_vkCreateRayTracingPipelinesNV( vkGetDeviceProcAddr( device, \"vkCreateRayTracingPipelinesNV\" ) );\n        vkGetRayTracingShaderGroupHandlesNV = PFN_vkGetRayTracingShaderGroupHandlesNV( vkGetDeviceProcAddr( device, \"vkGetRayTracingShaderGroupHandlesNV\" ) );\n        if ( !vkGetRayTracingShaderGroupHandlesKHR )\n          vkGetRayTracingShaderGroupHandlesKHR = vkGetRayTracingShaderGroupHandlesNV;\n        vkGetAccelerationStructureHandleNV = PFN_vkGetAccelerationStructureHandleNV( vkGetDeviceProcAddr( device, \"vkGetAccelerationStructureHandleNV\" ) );\n        vkCmdWriteAccelerationStructuresPropertiesNV =\n          PFN_vkCmdWriteAccelerationStructuresPropertiesNV( vkGetDeviceProcAddr( device, \"vkCmdWriteAccelerationStructuresPropertiesNV\" ) );\n        vkCompileDeferredNV = PFN_vkCompileDeferredNV( vkGetDeviceProcAddr( device, \"vkCompileDeferredNV\" ) );\n\n        //=== VK_KHR_maintenance3 ===\n        vkGetDescriptorSetLayoutSupportKHR = PFN_vkGetDescriptorSetLayoutSupportKHR( vkGetDeviceProcAddr( device, \"vkGetDescriptorSetLayoutSupportKHR\" ) );\n        if ( !vkGetDescriptorSetLayoutSupport )\n          vkGetDescriptorSetLayoutSupport = vkGetDescriptorSetLayoutSupportKHR;\n\n        //=== VK_KHR_draw_indirect_count ===\n        vkCmdDrawIndirectCountKHR = PFN_vkCmdDrawIndirectCountKHR( vkGetDeviceProcAddr( device, \"vkCmdDrawIndirectCountKHR\" ) );\n        if ( !vkCmdDrawIndirectCount )\n          vkCmdDrawIndirectCount = vkCmdDrawIndirectCountKHR;\n        vkCmdDrawIndexedIndirectCountKHR = PFN_vkCmdDrawIndexedIndirectCountKHR( vkGetDeviceProcAddr( device, \"vkCmdDrawIndexedIndirectCountKHR\" ) );\n        if ( !vkCmdDrawIndexedIndirectCount )\n          vkCmdDrawIndexedIndirectCount = vkCmdDrawIndexedIndirectCountKHR;\n\n        //=== VK_EXT_external_memory_host ===\n        vkGetMemoryHostPointerPropertiesEXT = PFN_vkGetMemoryHostPointerPropertiesEXT( vkGetDeviceProcAddr( device, \"vkGetMemoryHostPointerPropertiesEXT\" ) );\n\n        //=== VK_AMD_buffer_marker ===\n        vkCmdWriteBufferMarkerAMD  = PFN_vkCmdWriteBufferMarkerAMD( vkGetDeviceProcAddr( device, \"vkCmdWriteBufferMarkerAMD\" ) );\n        vkCmdWriteBufferMarker2AMD = PFN_vkCmdWriteBufferMarker2AMD( vkGetDeviceProcAddr( device, \"vkCmdWriteBufferMarker2AMD\" ) );\n\n        //=== VK_EXT_calibrated_timestamps ===\n        vkGetCalibratedTimestampsEXT = PFN_vkGetCalibratedTimestampsEXT( vkGetDeviceProcAddr( device, \"vkGetCalibratedTimestampsEXT\" ) );\n        if ( !vkGetCalibratedTimestampsKHR )\n          vkGetCalibratedTimestampsKHR = vkGetCalibratedTimestampsEXT;\n\n        //=== VK_NV_mesh_shader ===\n        vkCmdDrawMeshTasksNV              = PFN_vkCmdDrawMeshTasksNV( vkGetDeviceProcAddr( device, \"vkCmdDrawMeshTasksNV\" ) );\n        vkCmdDrawMeshTasksIndirectNV      = PFN_vkCmdDrawMeshTasksIndirectNV( vkGetDeviceProcAddr( device, \"vkCmdDrawMeshTasksIndirectNV\" ) );\n        vkCmdDrawMeshTasksIndirectCountNV = PFN_vkCmdDrawMeshTasksIndirectCountNV( vkGetDeviceProcAddr( device, \"vkCmdDrawMeshTasksIndirectCountNV\" ) );\n\n        //=== VK_NV_scissor_exclusive ===\n        vkCmdSetExclusiveScissorEnableNV = PFN_vkCmdSetExclusiveScissorEnableNV( vkGetDeviceProcAddr( device, \"vkCmdSetExclusiveScissorEnableNV\" ) );\n        vkCmdSetExclusiveScissorNV       = PFN_vkCmdSetExclusiveScissorNV( vkGetDeviceProcAddr( device, \"vkCmdSetExclusiveScissorNV\" ) );\n\n        //=== VK_NV_device_diagnostic_checkpoints ===\n        vkCmdSetCheckpointNV        = PFN_vkCmdSetCheckpointNV( vkGetDeviceProcAddr( device, \"vkCmdSetCheckpointNV\" ) );\n        vkGetQueueCheckpointDataNV  = PFN_vkGetQueueCheckpointDataNV( vkGetDeviceProcAddr( device, \"vkGetQueueCheckpointDataNV\" ) );\n        vkGetQueueCheckpointData2NV = PFN_vkGetQueueCheckpointData2NV( vkGetDeviceProcAddr( device, \"vkGetQueueCheckpointData2NV\" ) );\n\n        //=== VK_KHR_timeline_semaphore ===\n        vkGetSemaphoreCounterValueKHR = PFN_vkGetSemaphoreCounterValueKHR( vkGetDeviceProcAddr( device, \"vkGetSemaphoreCounterValueKHR\" ) );\n        if ( !vkGetSemaphoreCounterValue )\n          vkGetSemaphoreCounterValue = vkGetSemaphoreCounterValueKHR;\n        vkWaitSemaphoresKHR = PFN_vkWaitSemaphoresKHR( vkGetDeviceProcAddr( device, \"vkWaitSemaphoresKHR\" ) );\n        if ( !vkWaitSemaphores )\n          vkWaitSemaphores = vkWaitSemaphoresKHR;\n        vkSignalSemaphoreKHR = PFN_vkSignalSemaphoreKHR( vkGetDeviceProcAddr( device, \"vkSignalSemaphoreKHR\" ) );\n        if ( !vkSignalSemaphore )\n          vkSignalSemaphore = vkSignalSemaphoreKHR;\n\n        //=== VK_INTEL_performance_query ===\n        vkInitializePerformanceApiINTEL   = PFN_vkInitializePerformanceApiINTEL( vkGetDeviceProcAddr( device, \"vkInitializePerformanceApiINTEL\" ) );\n        vkUninitializePerformanceApiINTEL = PFN_vkUninitializePerformanceApiINTEL( vkGetDeviceProcAddr( device, \"vkUninitializePerformanceApiINTEL\" ) );\n        vkCmdSetPerformanceMarkerINTEL    = PFN_vkCmdSetPerformanceMarkerINTEL( vkGetDeviceProcAddr( device, \"vkCmdSetPerformanceMarkerINTEL\" ) );\n        vkCmdSetPerformanceStreamMarkerINTEL =\n          PFN_vkCmdSetPerformanceStreamMarkerINTEL( vkGetDeviceProcAddr( device, \"vkCmdSetPerformanceStreamMarkerINTEL\" ) );\n        vkCmdSetPerformanceOverrideINTEL = PFN_vkCmdSetPerformanceOverrideINTEL( vkGetDeviceProcAddr( device, \"vkCmdSetPerformanceOverrideINTEL\" ) );\n        vkAcquirePerformanceConfigurationINTEL =\n          PFN_vkAcquirePerformanceConfigurationINTEL( vkGetDeviceProcAddr( device, \"vkAcquirePerformanceConfigurationINTEL\" ) );\n        vkReleasePerformanceConfigurationINTEL =\n          PFN_vkReleasePerformanceConfigurationINTEL( vkGetDeviceProcAddr( device, \"vkReleasePerformanceConfigurationINTEL\" ) );\n        vkQueueSetPerformanceConfigurationINTEL =\n          PFN_vkQueueSetPerformanceConfigurationINTEL( vkGetDeviceProcAddr( device, \"vkQueueSetPerformanceConfigurationINTEL\" ) );\n        vkGetPerformanceParameterINTEL = PFN_vkGetPerformanceParameterINTEL( vkGetDeviceProcAddr( device, \"vkGetPerformanceParameterINTEL\" ) );\n\n        //=== VK_AMD_display_native_hdr ===\n        vkSetLocalDimmingAMD = PFN_vkSetLocalDimmingAMD( vkGetDeviceProcAddr( device, \"vkSetLocalDimmingAMD\" ) );\n\n        //=== VK_KHR_fragment_shading_rate ===\n        vkCmdSetFragmentShadingRateKHR = PFN_vkCmdSetFragmentShadingRateKHR( vkGetDeviceProcAddr( device, \"vkCmdSetFragmentShadingRateKHR\" ) );\n\n        //=== VK_KHR_dynamic_rendering_local_read ===\n        vkCmdSetRenderingAttachmentLocationsKHR =\n          PFN_vkCmdSetRenderingAttachmentLocationsKHR( vkGetDeviceProcAddr( device, \"vkCmdSetRenderingAttachmentLocationsKHR\" ) );\n        if ( !vkCmdSetRenderingAttachmentLocations )\n          vkCmdSetRenderingAttachmentLocations = vkCmdSetRenderingAttachmentLocationsKHR;\n        vkCmdSetRenderingInputAttachmentIndicesKHR =\n          PFN_vkCmdSetRenderingInputAttachmentIndicesKHR( vkGetDeviceProcAddr( device, \"vkCmdSetRenderingInputAttachmentIndicesKHR\" ) );\n        if ( !vkCmdSetRenderingInputAttachmentIndices )\n          vkCmdSetRenderingInputAttachmentIndices = vkCmdSetRenderingInputAttachmentIndicesKHR;\n\n        //=== VK_EXT_buffer_device_address ===\n        vkGetBufferDeviceAddressEXT = PFN_vkGetBufferDeviceAddressEXT( vkGetDeviceProcAddr( device, \"vkGetBufferDeviceAddressEXT\" ) );\n        if ( !vkGetBufferDeviceAddress )\n          vkGetBufferDeviceAddress = vkGetBufferDeviceAddressEXT;\n\n        //=== VK_KHR_present_wait ===\n        vkWaitForPresentKHR = PFN_vkWaitForPresentKHR( vkGetDeviceProcAddr( device, \"vkWaitForPresentKHR\" ) );\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n        //=== VK_EXT_full_screen_exclusive ===\n        vkAcquireFullScreenExclusiveModeEXT = PFN_vkAcquireFullScreenExclusiveModeEXT( vkGetDeviceProcAddr( device, \"vkAcquireFullScreenExclusiveModeEXT\" ) );\n        vkReleaseFullScreenExclusiveModeEXT = PFN_vkReleaseFullScreenExclusiveModeEXT( vkGetDeviceProcAddr( device, \"vkReleaseFullScreenExclusiveModeEXT\" ) );\n        vkGetDeviceGroupSurfacePresentModes2EXT =\n          PFN_vkGetDeviceGroupSurfacePresentModes2EXT( vkGetDeviceProcAddr( device, \"vkGetDeviceGroupSurfacePresentModes2EXT\" ) );\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n        //=== VK_KHR_buffer_device_address ===\n        vkGetBufferDeviceAddressKHR = PFN_vkGetBufferDeviceAddressKHR( vkGetDeviceProcAddr( device, \"vkGetBufferDeviceAddressKHR\" ) );\n        if ( !vkGetBufferDeviceAddress )\n          vkGetBufferDeviceAddress = vkGetBufferDeviceAddressKHR;\n        vkGetBufferOpaqueCaptureAddressKHR = PFN_vkGetBufferOpaqueCaptureAddressKHR( vkGetDeviceProcAddr( device, \"vkGetBufferOpaqueCaptureAddressKHR\" ) );\n        if ( !vkGetBufferOpaqueCaptureAddress )\n          vkGetBufferOpaqueCaptureAddress = vkGetBufferOpaqueCaptureAddressKHR;\n        vkGetDeviceMemoryOpaqueCaptureAddressKHR =\n          PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR( vkGetDeviceProcAddr( device, \"vkGetDeviceMemoryOpaqueCaptureAddressKHR\" ) );\n        if ( !vkGetDeviceMemoryOpaqueCaptureAddress )\n          vkGetDeviceMemoryOpaqueCaptureAddress = vkGetDeviceMemoryOpaqueCaptureAddressKHR;\n\n        //=== VK_EXT_line_rasterization ===\n        vkCmdSetLineStippleEXT = PFN_vkCmdSetLineStippleEXT( vkGetDeviceProcAddr( device, \"vkCmdSetLineStippleEXT\" ) );\n        if ( !vkCmdSetLineStipple )\n          vkCmdSetLineStipple = vkCmdSetLineStippleEXT;\n\n        //=== VK_EXT_host_query_reset ===\n        vkResetQueryPoolEXT = PFN_vkResetQueryPoolEXT( vkGetDeviceProcAddr( device, \"vkResetQueryPoolEXT\" ) );\n        if ( !vkResetQueryPool )\n          vkResetQueryPool = vkResetQueryPoolEXT;\n\n        //=== VK_EXT_extended_dynamic_state ===\n        vkCmdSetCullModeEXT = PFN_vkCmdSetCullModeEXT( vkGetDeviceProcAddr( device, \"vkCmdSetCullModeEXT\" ) );\n        if ( !vkCmdSetCullMode )\n          vkCmdSetCullMode = vkCmdSetCullModeEXT;\n        vkCmdSetFrontFaceEXT = PFN_vkCmdSetFrontFaceEXT( vkGetDeviceProcAddr( device, \"vkCmdSetFrontFaceEXT\" ) );\n        if ( !vkCmdSetFrontFace )\n          vkCmdSetFrontFace = vkCmdSetFrontFaceEXT;\n        vkCmdSetPrimitiveTopologyEXT = PFN_vkCmdSetPrimitiveTopologyEXT( vkGetDeviceProcAddr( device, \"vkCmdSetPrimitiveTopologyEXT\" ) );\n        if ( !vkCmdSetPrimitiveTopology )\n          vkCmdSetPrimitiveTopology = vkCmdSetPrimitiveTopologyEXT;\n        vkCmdSetViewportWithCountEXT = PFN_vkCmdSetViewportWithCountEXT( vkGetDeviceProcAddr( device, \"vkCmdSetViewportWithCountEXT\" ) );\n        if ( !vkCmdSetViewportWithCount )\n          vkCmdSetViewportWithCount = vkCmdSetViewportWithCountEXT;\n        vkCmdSetScissorWithCountEXT = PFN_vkCmdSetScissorWithCountEXT( vkGetDeviceProcAddr( device, \"vkCmdSetScissorWithCountEXT\" ) );\n        if ( !vkCmdSetScissorWithCount )\n          vkCmdSetScissorWithCount = vkCmdSetScissorWithCountEXT;\n        vkCmdBindVertexBuffers2EXT = PFN_vkCmdBindVertexBuffers2EXT( vkGetDeviceProcAddr( device, \"vkCmdBindVertexBuffers2EXT\" ) );\n        if ( !vkCmdBindVertexBuffers2 )\n          vkCmdBindVertexBuffers2 = vkCmdBindVertexBuffers2EXT;\n        vkCmdSetDepthTestEnableEXT = PFN_vkCmdSetDepthTestEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDepthTestEnableEXT\" ) );\n        if ( !vkCmdSetDepthTestEnable )\n          vkCmdSetDepthTestEnable = vkCmdSetDepthTestEnableEXT;\n        vkCmdSetDepthWriteEnableEXT = PFN_vkCmdSetDepthWriteEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDepthWriteEnableEXT\" ) );\n        if ( !vkCmdSetDepthWriteEnable )\n          vkCmdSetDepthWriteEnable = vkCmdSetDepthWriteEnableEXT;\n        vkCmdSetDepthCompareOpEXT = PFN_vkCmdSetDepthCompareOpEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDepthCompareOpEXT\" ) );\n        if ( !vkCmdSetDepthCompareOp )\n          vkCmdSetDepthCompareOp = vkCmdSetDepthCompareOpEXT;\n        vkCmdSetDepthBoundsTestEnableEXT = PFN_vkCmdSetDepthBoundsTestEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDepthBoundsTestEnableEXT\" ) );\n        if ( !vkCmdSetDepthBoundsTestEnable )\n          vkCmdSetDepthBoundsTestEnable = vkCmdSetDepthBoundsTestEnableEXT;\n        vkCmdSetStencilTestEnableEXT = PFN_vkCmdSetStencilTestEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetStencilTestEnableEXT\" ) );\n        if ( !vkCmdSetStencilTestEnable )\n          vkCmdSetStencilTestEnable = vkCmdSetStencilTestEnableEXT;\n        vkCmdSetStencilOpEXT = PFN_vkCmdSetStencilOpEXT( vkGetDeviceProcAddr( device, \"vkCmdSetStencilOpEXT\" ) );\n        if ( !vkCmdSetStencilOp )\n          vkCmdSetStencilOp = vkCmdSetStencilOpEXT;\n\n        //=== VK_KHR_deferred_host_operations ===\n        vkCreateDeferredOperationKHR  = PFN_vkCreateDeferredOperationKHR( vkGetDeviceProcAddr( device, \"vkCreateDeferredOperationKHR\" ) );\n        vkDestroyDeferredOperationKHR = PFN_vkDestroyDeferredOperationKHR( vkGetDeviceProcAddr( device, \"vkDestroyDeferredOperationKHR\" ) );\n        vkGetDeferredOperationMaxConcurrencyKHR =\n          PFN_vkGetDeferredOperationMaxConcurrencyKHR( vkGetDeviceProcAddr( device, \"vkGetDeferredOperationMaxConcurrencyKHR\" ) );\n        vkGetDeferredOperationResultKHR = PFN_vkGetDeferredOperationResultKHR( vkGetDeviceProcAddr( device, \"vkGetDeferredOperationResultKHR\" ) );\n        vkDeferredOperationJoinKHR      = PFN_vkDeferredOperationJoinKHR( vkGetDeviceProcAddr( device, \"vkDeferredOperationJoinKHR\" ) );\n\n        //=== VK_KHR_pipeline_executable_properties ===\n        vkGetPipelineExecutablePropertiesKHR =\n          PFN_vkGetPipelineExecutablePropertiesKHR( vkGetDeviceProcAddr( device, \"vkGetPipelineExecutablePropertiesKHR\" ) );\n        vkGetPipelineExecutableStatisticsKHR =\n          PFN_vkGetPipelineExecutableStatisticsKHR( vkGetDeviceProcAddr( device, \"vkGetPipelineExecutableStatisticsKHR\" ) );\n        vkGetPipelineExecutableInternalRepresentationsKHR =\n          PFN_vkGetPipelineExecutableInternalRepresentationsKHR( vkGetDeviceProcAddr( device, \"vkGetPipelineExecutableInternalRepresentationsKHR\" ) );\n\n        //=== VK_EXT_host_image_copy ===\n        vkCopyMemoryToImageEXT = PFN_vkCopyMemoryToImageEXT( vkGetDeviceProcAddr( device, \"vkCopyMemoryToImageEXT\" ) );\n        if ( !vkCopyMemoryToImage )\n          vkCopyMemoryToImage = vkCopyMemoryToImageEXT;\n        vkCopyImageToMemoryEXT = PFN_vkCopyImageToMemoryEXT( vkGetDeviceProcAddr( device, \"vkCopyImageToMemoryEXT\" ) );\n        if ( !vkCopyImageToMemory )\n          vkCopyImageToMemory = vkCopyImageToMemoryEXT;\n        vkCopyImageToImageEXT = PFN_vkCopyImageToImageEXT( vkGetDeviceProcAddr( device, \"vkCopyImageToImageEXT\" ) );\n        if ( !vkCopyImageToImage )\n          vkCopyImageToImage = vkCopyImageToImageEXT;\n        vkTransitionImageLayoutEXT = PFN_vkTransitionImageLayoutEXT( vkGetDeviceProcAddr( device, \"vkTransitionImageLayoutEXT\" ) );\n        if ( !vkTransitionImageLayout )\n          vkTransitionImageLayout = vkTransitionImageLayoutEXT;\n        vkGetImageSubresourceLayout2EXT = PFN_vkGetImageSubresourceLayout2EXT( vkGetDeviceProcAddr( device, \"vkGetImageSubresourceLayout2EXT\" ) );\n        if ( !vkGetImageSubresourceLayout2 )\n          vkGetImageSubresourceLayout2 = vkGetImageSubresourceLayout2EXT;\n\n        //=== VK_KHR_map_memory2 ===\n        vkMapMemory2KHR = PFN_vkMapMemory2KHR( vkGetDeviceProcAddr( device, \"vkMapMemory2KHR\" ) );\n        if ( !vkMapMemory2 )\n          vkMapMemory2 = vkMapMemory2KHR;\n        vkUnmapMemory2KHR = PFN_vkUnmapMemory2KHR( vkGetDeviceProcAddr( device, \"vkUnmapMemory2KHR\" ) );\n        if ( !vkUnmapMemory2 )\n          vkUnmapMemory2 = vkUnmapMemory2KHR;\n\n        //=== VK_EXT_swapchain_maintenance1 ===\n        vkReleaseSwapchainImagesEXT = PFN_vkReleaseSwapchainImagesEXT( vkGetDeviceProcAddr( device, \"vkReleaseSwapchainImagesEXT\" ) );\n\n        //=== VK_NV_device_generated_commands ===\n        vkGetGeneratedCommandsMemoryRequirementsNV =\n          PFN_vkGetGeneratedCommandsMemoryRequirementsNV( vkGetDeviceProcAddr( device, \"vkGetGeneratedCommandsMemoryRequirementsNV\" ) );\n        vkCmdPreprocessGeneratedCommandsNV = PFN_vkCmdPreprocessGeneratedCommandsNV( vkGetDeviceProcAddr( device, \"vkCmdPreprocessGeneratedCommandsNV\" ) );\n        vkCmdExecuteGeneratedCommandsNV    = PFN_vkCmdExecuteGeneratedCommandsNV( vkGetDeviceProcAddr( device, \"vkCmdExecuteGeneratedCommandsNV\" ) );\n        vkCmdBindPipelineShaderGroupNV     = PFN_vkCmdBindPipelineShaderGroupNV( vkGetDeviceProcAddr( device, \"vkCmdBindPipelineShaderGroupNV\" ) );\n        vkCreateIndirectCommandsLayoutNV   = PFN_vkCreateIndirectCommandsLayoutNV( vkGetDeviceProcAddr( device, \"vkCreateIndirectCommandsLayoutNV\" ) );\n        vkDestroyIndirectCommandsLayoutNV  = PFN_vkDestroyIndirectCommandsLayoutNV( vkGetDeviceProcAddr( device, \"vkDestroyIndirectCommandsLayoutNV\" ) );\n\n        //=== VK_EXT_depth_bias_control ===\n        vkCmdSetDepthBias2EXT = PFN_vkCmdSetDepthBias2EXT( vkGetDeviceProcAddr( device, \"vkCmdSetDepthBias2EXT\" ) );\n\n        //=== VK_EXT_private_data ===\n        vkCreatePrivateDataSlotEXT = PFN_vkCreatePrivateDataSlotEXT( vkGetDeviceProcAddr( device, \"vkCreatePrivateDataSlotEXT\" ) );\n        if ( !vkCreatePrivateDataSlot )\n          vkCreatePrivateDataSlot = vkCreatePrivateDataSlotEXT;\n        vkDestroyPrivateDataSlotEXT = PFN_vkDestroyPrivateDataSlotEXT( vkGetDeviceProcAddr( device, \"vkDestroyPrivateDataSlotEXT\" ) );\n        if ( !vkDestroyPrivateDataSlot )\n          vkDestroyPrivateDataSlot = vkDestroyPrivateDataSlotEXT;\n        vkSetPrivateDataEXT = PFN_vkSetPrivateDataEXT( vkGetDeviceProcAddr( device, \"vkSetPrivateDataEXT\" ) );\n        if ( !vkSetPrivateData )\n          vkSetPrivateData = vkSetPrivateDataEXT;\n        vkGetPrivateDataEXT = PFN_vkGetPrivateDataEXT( vkGetDeviceProcAddr( device, \"vkGetPrivateDataEXT\" ) );\n        if ( !vkGetPrivateData )\n          vkGetPrivateData = vkGetPrivateDataEXT;\n\n        //=== VK_KHR_video_encode_queue ===\n        vkGetEncodedVideoSessionParametersKHR =\n          PFN_vkGetEncodedVideoSessionParametersKHR( vkGetDeviceProcAddr( device, \"vkGetEncodedVideoSessionParametersKHR\" ) );\n        vkCmdEncodeVideoKHR = PFN_vkCmdEncodeVideoKHR( vkGetDeviceProcAddr( device, \"vkCmdEncodeVideoKHR\" ) );\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n        //=== VK_NV_cuda_kernel_launch ===\n        vkCreateCudaModuleNV    = PFN_vkCreateCudaModuleNV( vkGetDeviceProcAddr( device, \"vkCreateCudaModuleNV\" ) );\n        vkGetCudaModuleCacheNV  = PFN_vkGetCudaModuleCacheNV( vkGetDeviceProcAddr( device, \"vkGetCudaModuleCacheNV\" ) );\n        vkCreateCudaFunctionNV  = PFN_vkCreateCudaFunctionNV( vkGetDeviceProcAddr( device, \"vkCreateCudaFunctionNV\" ) );\n        vkDestroyCudaModuleNV   = PFN_vkDestroyCudaModuleNV( vkGetDeviceProcAddr( device, \"vkDestroyCudaModuleNV\" ) );\n        vkDestroyCudaFunctionNV = PFN_vkDestroyCudaFunctionNV( vkGetDeviceProcAddr( device, \"vkDestroyCudaFunctionNV\" ) );\n        vkCmdCudaLaunchKernelNV = PFN_vkCmdCudaLaunchKernelNV( vkGetDeviceProcAddr( device, \"vkCmdCudaLaunchKernelNV\" ) );\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n        //=== VK_EXT_metal_objects ===\n        vkExportMetalObjectsEXT = PFN_vkExportMetalObjectsEXT( vkGetDeviceProcAddr( device, \"vkExportMetalObjectsEXT\" ) );\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n        //=== VK_KHR_synchronization2 ===\n        vkCmdSetEvent2KHR = PFN_vkCmdSetEvent2KHR( vkGetDeviceProcAddr( device, \"vkCmdSetEvent2KHR\" ) );\n        if ( !vkCmdSetEvent2 )\n          vkCmdSetEvent2 = vkCmdSetEvent2KHR;\n        vkCmdResetEvent2KHR = PFN_vkCmdResetEvent2KHR( vkGetDeviceProcAddr( device, \"vkCmdResetEvent2KHR\" ) );\n        if ( !vkCmdResetEvent2 )\n          vkCmdResetEvent2 = vkCmdResetEvent2KHR;\n        vkCmdWaitEvents2KHR = PFN_vkCmdWaitEvents2KHR( vkGetDeviceProcAddr( device, \"vkCmdWaitEvents2KHR\" ) );\n        if ( !vkCmdWaitEvents2 )\n          vkCmdWaitEvents2 = vkCmdWaitEvents2KHR;\n        vkCmdPipelineBarrier2KHR = PFN_vkCmdPipelineBarrier2KHR( vkGetDeviceProcAddr( device, \"vkCmdPipelineBarrier2KHR\" ) );\n        if ( !vkCmdPipelineBarrier2 )\n          vkCmdPipelineBarrier2 = vkCmdPipelineBarrier2KHR;\n        vkCmdWriteTimestamp2KHR = PFN_vkCmdWriteTimestamp2KHR( vkGetDeviceProcAddr( device, \"vkCmdWriteTimestamp2KHR\" ) );\n        if ( !vkCmdWriteTimestamp2 )\n          vkCmdWriteTimestamp2 = vkCmdWriteTimestamp2KHR;\n        vkQueueSubmit2KHR = PFN_vkQueueSubmit2KHR( vkGetDeviceProcAddr( device, \"vkQueueSubmit2KHR\" ) );\n        if ( !vkQueueSubmit2 )\n          vkQueueSubmit2 = vkQueueSubmit2KHR;\n\n        //=== VK_EXT_descriptor_buffer ===\n        vkGetDescriptorSetLayoutSizeEXT = PFN_vkGetDescriptorSetLayoutSizeEXT( vkGetDeviceProcAddr( device, \"vkGetDescriptorSetLayoutSizeEXT\" ) );\n        vkGetDescriptorSetLayoutBindingOffsetEXT =\n          PFN_vkGetDescriptorSetLayoutBindingOffsetEXT( vkGetDeviceProcAddr( device, \"vkGetDescriptorSetLayoutBindingOffsetEXT\" ) );\n        vkGetDescriptorEXT                 = PFN_vkGetDescriptorEXT( vkGetDeviceProcAddr( device, \"vkGetDescriptorEXT\" ) );\n        vkCmdBindDescriptorBuffersEXT      = PFN_vkCmdBindDescriptorBuffersEXT( vkGetDeviceProcAddr( device, \"vkCmdBindDescriptorBuffersEXT\" ) );\n        vkCmdSetDescriptorBufferOffsetsEXT = PFN_vkCmdSetDescriptorBufferOffsetsEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDescriptorBufferOffsetsEXT\" ) );\n        vkCmdBindDescriptorBufferEmbeddedSamplersEXT =\n          PFN_vkCmdBindDescriptorBufferEmbeddedSamplersEXT( vkGetDeviceProcAddr( device, \"vkCmdBindDescriptorBufferEmbeddedSamplersEXT\" ) );\n        vkGetBufferOpaqueCaptureDescriptorDataEXT =\n          PFN_vkGetBufferOpaqueCaptureDescriptorDataEXT( vkGetDeviceProcAddr( device, \"vkGetBufferOpaqueCaptureDescriptorDataEXT\" ) );\n        vkGetImageOpaqueCaptureDescriptorDataEXT =\n          PFN_vkGetImageOpaqueCaptureDescriptorDataEXT( vkGetDeviceProcAddr( device, \"vkGetImageOpaqueCaptureDescriptorDataEXT\" ) );\n        vkGetImageViewOpaqueCaptureDescriptorDataEXT =\n          PFN_vkGetImageViewOpaqueCaptureDescriptorDataEXT( vkGetDeviceProcAddr( device, \"vkGetImageViewOpaqueCaptureDescriptorDataEXT\" ) );\n        vkGetSamplerOpaqueCaptureDescriptorDataEXT =\n          PFN_vkGetSamplerOpaqueCaptureDescriptorDataEXT( vkGetDeviceProcAddr( device, \"vkGetSamplerOpaqueCaptureDescriptorDataEXT\" ) );\n        vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT = PFN_vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT(\n          vkGetDeviceProcAddr( device, \"vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT\" ) );\n\n        //=== VK_NV_fragment_shading_rate_enums ===\n        vkCmdSetFragmentShadingRateEnumNV = PFN_vkCmdSetFragmentShadingRateEnumNV( vkGetDeviceProcAddr( device, \"vkCmdSetFragmentShadingRateEnumNV\" ) );\n\n        //=== VK_EXT_mesh_shader ===\n        vkCmdDrawMeshTasksEXT              = PFN_vkCmdDrawMeshTasksEXT( vkGetDeviceProcAddr( device, \"vkCmdDrawMeshTasksEXT\" ) );\n        vkCmdDrawMeshTasksIndirectEXT      = PFN_vkCmdDrawMeshTasksIndirectEXT( vkGetDeviceProcAddr( device, \"vkCmdDrawMeshTasksIndirectEXT\" ) );\n        vkCmdDrawMeshTasksIndirectCountEXT = PFN_vkCmdDrawMeshTasksIndirectCountEXT( vkGetDeviceProcAddr( device, \"vkCmdDrawMeshTasksIndirectCountEXT\" ) );\n\n        //=== VK_KHR_copy_commands2 ===\n        vkCmdCopyBuffer2KHR = PFN_vkCmdCopyBuffer2KHR( vkGetDeviceProcAddr( device, \"vkCmdCopyBuffer2KHR\" ) );\n        if ( !vkCmdCopyBuffer2 )\n          vkCmdCopyBuffer2 = vkCmdCopyBuffer2KHR;\n        vkCmdCopyImage2KHR = PFN_vkCmdCopyImage2KHR( vkGetDeviceProcAddr( device, \"vkCmdCopyImage2KHR\" ) );\n        if ( !vkCmdCopyImage2 )\n          vkCmdCopyImage2 = vkCmdCopyImage2KHR;\n        vkCmdCopyBufferToImage2KHR = PFN_vkCmdCopyBufferToImage2KHR( vkGetDeviceProcAddr( device, \"vkCmdCopyBufferToImage2KHR\" ) );\n        if ( !vkCmdCopyBufferToImage2 )\n          vkCmdCopyBufferToImage2 = vkCmdCopyBufferToImage2KHR;\n        vkCmdCopyImageToBuffer2KHR = PFN_vkCmdCopyImageToBuffer2KHR( vkGetDeviceProcAddr( device, \"vkCmdCopyImageToBuffer2KHR\" ) );\n        if ( !vkCmdCopyImageToBuffer2 )\n          vkCmdCopyImageToBuffer2 = vkCmdCopyImageToBuffer2KHR;\n        vkCmdBlitImage2KHR = PFN_vkCmdBlitImage2KHR( vkGetDeviceProcAddr( device, \"vkCmdBlitImage2KHR\" ) );\n        if ( !vkCmdBlitImage2 )\n          vkCmdBlitImage2 = vkCmdBlitImage2KHR;\n        vkCmdResolveImage2KHR = PFN_vkCmdResolveImage2KHR( vkGetDeviceProcAddr( device, \"vkCmdResolveImage2KHR\" ) );\n        if ( !vkCmdResolveImage2 )\n          vkCmdResolveImage2 = vkCmdResolveImage2KHR;\n\n        //=== VK_EXT_device_fault ===\n        vkGetDeviceFaultInfoEXT = PFN_vkGetDeviceFaultInfoEXT( vkGetDeviceProcAddr( device, \"vkGetDeviceFaultInfoEXT\" ) );\n\n        //=== VK_EXT_vertex_input_dynamic_state ===\n        vkCmdSetVertexInputEXT = PFN_vkCmdSetVertexInputEXT( vkGetDeviceProcAddr( device, \"vkCmdSetVertexInputEXT\" ) );\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n        //=== VK_FUCHSIA_external_memory ===\n        vkGetMemoryZirconHandleFUCHSIA = PFN_vkGetMemoryZirconHandleFUCHSIA( vkGetDeviceProcAddr( device, \"vkGetMemoryZirconHandleFUCHSIA\" ) );\n        vkGetMemoryZirconHandlePropertiesFUCHSIA =\n          PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA( vkGetDeviceProcAddr( device, \"vkGetMemoryZirconHandlePropertiesFUCHSIA\" ) );\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n        //=== VK_FUCHSIA_external_semaphore ===\n        vkImportSemaphoreZirconHandleFUCHSIA =\n          PFN_vkImportSemaphoreZirconHandleFUCHSIA( vkGetDeviceProcAddr( device, \"vkImportSemaphoreZirconHandleFUCHSIA\" ) );\n        vkGetSemaphoreZirconHandleFUCHSIA = PFN_vkGetSemaphoreZirconHandleFUCHSIA( vkGetDeviceProcAddr( device, \"vkGetSemaphoreZirconHandleFUCHSIA\" ) );\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n        //=== VK_FUCHSIA_buffer_collection ===\n        vkCreateBufferCollectionFUCHSIA = PFN_vkCreateBufferCollectionFUCHSIA( vkGetDeviceProcAddr( device, \"vkCreateBufferCollectionFUCHSIA\" ) );\n        vkSetBufferCollectionImageConstraintsFUCHSIA =\n          PFN_vkSetBufferCollectionImageConstraintsFUCHSIA( vkGetDeviceProcAddr( device, \"vkSetBufferCollectionImageConstraintsFUCHSIA\" ) );\n        vkSetBufferCollectionBufferConstraintsFUCHSIA =\n          PFN_vkSetBufferCollectionBufferConstraintsFUCHSIA( vkGetDeviceProcAddr( device, \"vkSetBufferCollectionBufferConstraintsFUCHSIA\" ) );\n        vkDestroyBufferCollectionFUCHSIA = PFN_vkDestroyBufferCollectionFUCHSIA( vkGetDeviceProcAddr( device, \"vkDestroyBufferCollectionFUCHSIA\" ) );\n        vkGetBufferCollectionPropertiesFUCHSIA =\n          PFN_vkGetBufferCollectionPropertiesFUCHSIA( vkGetDeviceProcAddr( device, \"vkGetBufferCollectionPropertiesFUCHSIA\" ) );\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n        //=== VK_HUAWEI_subpass_shading ===\n        vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI =\n          PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI( vkGetDeviceProcAddr( device, \"vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI\" ) );\n        vkCmdSubpassShadingHUAWEI = PFN_vkCmdSubpassShadingHUAWEI( vkGetDeviceProcAddr( device, \"vkCmdSubpassShadingHUAWEI\" ) );\n\n        //=== VK_HUAWEI_invocation_mask ===\n        vkCmdBindInvocationMaskHUAWEI = PFN_vkCmdBindInvocationMaskHUAWEI( vkGetDeviceProcAddr( device, \"vkCmdBindInvocationMaskHUAWEI\" ) );\n\n        //=== VK_NV_external_memory_rdma ===\n        vkGetMemoryRemoteAddressNV = PFN_vkGetMemoryRemoteAddressNV( vkGetDeviceProcAddr( device, \"vkGetMemoryRemoteAddressNV\" ) );\n\n        //=== VK_EXT_pipeline_properties ===\n        vkGetPipelinePropertiesEXT = PFN_vkGetPipelinePropertiesEXT( vkGetDeviceProcAddr( device, \"vkGetPipelinePropertiesEXT\" ) );\n\n        //=== VK_EXT_extended_dynamic_state2 ===\n        vkCmdSetPatchControlPointsEXT      = PFN_vkCmdSetPatchControlPointsEXT( vkGetDeviceProcAddr( device, \"vkCmdSetPatchControlPointsEXT\" ) );\n        vkCmdSetRasterizerDiscardEnableEXT = PFN_vkCmdSetRasterizerDiscardEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetRasterizerDiscardEnableEXT\" ) );\n        if ( !vkCmdSetRasterizerDiscardEnable )\n          vkCmdSetRasterizerDiscardEnable = vkCmdSetRasterizerDiscardEnableEXT;\n        vkCmdSetDepthBiasEnableEXT = PFN_vkCmdSetDepthBiasEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDepthBiasEnableEXT\" ) );\n        if ( !vkCmdSetDepthBiasEnable )\n          vkCmdSetDepthBiasEnable = vkCmdSetDepthBiasEnableEXT;\n        vkCmdSetLogicOpEXT                = PFN_vkCmdSetLogicOpEXT( vkGetDeviceProcAddr( device, \"vkCmdSetLogicOpEXT\" ) );\n        vkCmdSetPrimitiveRestartEnableEXT = PFN_vkCmdSetPrimitiveRestartEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetPrimitiveRestartEnableEXT\" ) );\n        if ( !vkCmdSetPrimitiveRestartEnable )\n          vkCmdSetPrimitiveRestartEnable = vkCmdSetPrimitiveRestartEnableEXT;\n\n        //=== VK_EXT_color_write_enable ===\n        vkCmdSetColorWriteEnableEXT = PFN_vkCmdSetColorWriteEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetColorWriteEnableEXT\" ) );\n\n        //=== VK_KHR_ray_tracing_maintenance1 ===\n        vkCmdTraceRaysIndirect2KHR = PFN_vkCmdTraceRaysIndirect2KHR( vkGetDeviceProcAddr( device, \"vkCmdTraceRaysIndirect2KHR\" ) );\n\n        //=== VK_EXT_multi_draw ===\n        vkCmdDrawMultiEXT        = PFN_vkCmdDrawMultiEXT( vkGetDeviceProcAddr( device, \"vkCmdDrawMultiEXT\" ) );\n        vkCmdDrawMultiIndexedEXT = PFN_vkCmdDrawMultiIndexedEXT( vkGetDeviceProcAddr( device, \"vkCmdDrawMultiIndexedEXT\" ) );\n\n        //=== VK_EXT_opacity_micromap ===\n        vkCreateMicromapEXT                 = PFN_vkCreateMicromapEXT( vkGetDeviceProcAddr( device, \"vkCreateMicromapEXT\" ) );\n        vkDestroyMicromapEXT                = PFN_vkDestroyMicromapEXT( vkGetDeviceProcAddr( device, \"vkDestroyMicromapEXT\" ) );\n        vkCmdBuildMicromapsEXT              = PFN_vkCmdBuildMicromapsEXT( vkGetDeviceProcAddr( device, \"vkCmdBuildMicromapsEXT\" ) );\n        vkBuildMicromapsEXT                 = PFN_vkBuildMicromapsEXT( vkGetDeviceProcAddr( device, \"vkBuildMicromapsEXT\" ) );\n        vkCopyMicromapEXT                   = PFN_vkCopyMicromapEXT( vkGetDeviceProcAddr( device, \"vkCopyMicromapEXT\" ) );\n        vkCopyMicromapToMemoryEXT           = PFN_vkCopyMicromapToMemoryEXT( vkGetDeviceProcAddr( device, \"vkCopyMicromapToMemoryEXT\" ) );\n        vkCopyMemoryToMicromapEXT           = PFN_vkCopyMemoryToMicromapEXT( vkGetDeviceProcAddr( device, \"vkCopyMemoryToMicromapEXT\" ) );\n        vkWriteMicromapsPropertiesEXT       = PFN_vkWriteMicromapsPropertiesEXT( vkGetDeviceProcAddr( device, \"vkWriteMicromapsPropertiesEXT\" ) );\n        vkCmdCopyMicromapEXT                = PFN_vkCmdCopyMicromapEXT( vkGetDeviceProcAddr( device, \"vkCmdCopyMicromapEXT\" ) );\n        vkCmdCopyMicromapToMemoryEXT        = PFN_vkCmdCopyMicromapToMemoryEXT( vkGetDeviceProcAddr( device, \"vkCmdCopyMicromapToMemoryEXT\" ) );\n        vkCmdCopyMemoryToMicromapEXT        = PFN_vkCmdCopyMemoryToMicromapEXT( vkGetDeviceProcAddr( device, \"vkCmdCopyMemoryToMicromapEXT\" ) );\n        vkCmdWriteMicromapsPropertiesEXT    = PFN_vkCmdWriteMicromapsPropertiesEXT( vkGetDeviceProcAddr( device, \"vkCmdWriteMicromapsPropertiesEXT\" ) );\n        vkGetDeviceMicromapCompatibilityEXT = PFN_vkGetDeviceMicromapCompatibilityEXT( vkGetDeviceProcAddr( device, \"vkGetDeviceMicromapCompatibilityEXT\" ) );\n        vkGetMicromapBuildSizesEXT          = PFN_vkGetMicromapBuildSizesEXT( vkGetDeviceProcAddr( device, \"vkGetMicromapBuildSizesEXT\" ) );\n\n        //=== VK_HUAWEI_cluster_culling_shader ===\n        vkCmdDrawClusterHUAWEI         = PFN_vkCmdDrawClusterHUAWEI( vkGetDeviceProcAddr( device, \"vkCmdDrawClusterHUAWEI\" ) );\n        vkCmdDrawClusterIndirectHUAWEI = PFN_vkCmdDrawClusterIndirectHUAWEI( vkGetDeviceProcAddr( device, \"vkCmdDrawClusterIndirectHUAWEI\" ) );\n\n        //=== VK_EXT_pageable_device_local_memory ===\n        vkSetDeviceMemoryPriorityEXT = PFN_vkSetDeviceMemoryPriorityEXT( vkGetDeviceProcAddr( device, \"vkSetDeviceMemoryPriorityEXT\" ) );\n\n        //=== VK_KHR_maintenance4 ===\n        vkGetDeviceBufferMemoryRequirementsKHR =\n          PFN_vkGetDeviceBufferMemoryRequirementsKHR( vkGetDeviceProcAddr( device, \"vkGetDeviceBufferMemoryRequirementsKHR\" ) );\n        if ( !vkGetDeviceBufferMemoryRequirements )\n          vkGetDeviceBufferMemoryRequirements = vkGetDeviceBufferMemoryRequirementsKHR;\n        vkGetDeviceImageMemoryRequirementsKHR =\n          PFN_vkGetDeviceImageMemoryRequirementsKHR( vkGetDeviceProcAddr( device, \"vkGetDeviceImageMemoryRequirementsKHR\" ) );\n        if ( !vkGetDeviceImageMemoryRequirements )\n          vkGetDeviceImageMemoryRequirements = vkGetDeviceImageMemoryRequirementsKHR;\n        vkGetDeviceImageSparseMemoryRequirementsKHR =\n          PFN_vkGetDeviceImageSparseMemoryRequirementsKHR( vkGetDeviceProcAddr( device, \"vkGetDeviceImageSparseMemoryRequirementsKHR\" ) );\n        if ( !vkGetDeviceImageSparseMemoryRequirements )\n          vkGetDeviceImageSparseMemoryRequirements = vkGetDeviceImageSparseMemoryRequirementsKHR;\n\n        //=== VK_VALVE_descriptor_set_host_mapping ===\n        vkGetDescriptorSetLayoutHostMappingInfoVALVE =\n          PFN_vkGetDescriptorSetLayoutHostMappingInfoVALVE( vkGetDeviceProcAddr( device, \"vkGetDescriptorSetLayoutHostMappingInfoVALVE\" ) );\n        vkGetDescriptorSetHostMappingVALVE = PFN_vkGetDescriptorSetHostMappingVALVE( vkGetDeviceProcAddr( device, \"vkGetDescriptorSetHostMappingVALVE\" ) );\n\n        //=== VK_NV_copy_memory_indirect ===\n        vkCmdCopyMemoryIndirectNV        = PFN_vkCmdCopyMemoryIndirectNV( vkGetDeviceProcAddr( device, \"vkCmdCopyMemoryIndirectNV\" ) );\n        vkCmdCopyMemoryToImageIndirectNV = PFN_vkCmdCopyMemoryToImageIndirectNV( vkGetDeviceProcAddr( device, \"vkCmdCopyMemoryToImageIndirectNV\" ) );\n\n        //=== VK_NV_memory_decompression ===\n        vkCmdDecompressMemoryNV = PFN_vkCmdDecompressMemoryNV( vkGetDeviceProcAddr( device, \"vkCmdDecompressMemoryNV\" ) );\n        vkCmdDecompressMemoryIndirectCountNV =\n          PFN_vkCmdDecompressMemoryIndirectCountNV( vkGetDeviceProcAddr( device, \"vkCmdDecompressMemoryIndirectCountNV\" ) );\n\n        //=== VK_NV_device_generated_commands_compute ===\n        vkGetPipelineIndirectMemoryRequirementsNV =\n          PFN_vkGetPipelineIndirectMemoryRequirementsNV( vkGetDeviceProcAddr( device, \"vkGetPipelineIndirectMemoryRequirementsNV\" ) );\n        vkCmdUpdatePipelineIndirectBufferNV = PFN_vkCmdUpdatePipelineIndirectBufferNV( vkGetDeviceProcAddr( device, \"vkCmdUpdatePipelineIndirectBufferNV\" ) );\n        vkGetPipelineIndirectDeviceAddressNV =\n          PFN_vkGetPipelineIndirectDeviceAddressNV( vkGetDeviceProcAddr( device, \"vkGetPipelineIndirectDeviceAddressNV\" ) );\n\n        //=== VK_EXT_extended_dynamic_state3 ===\n        vkCmdSetDepthClampEnableEXT         = PFN_vkCmdSetDepthClampEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDepthClampEnableEXT\" ) );\n        vkCmdSetPolygonModeEXT              = PFN_vkCmdSetPolygonModeEXT( vkGetDeviceProcAddr( device, \"vkCmdSetPolygonModeEXT\" ) );\n        vkCmdSetRasterizationSamplesEXT     = PFN_vkCmdSetRasterizationSamplesEXT( vkGetDeviceProcAddr( device, \"vkCmdSetRasterizationSamplesEXT\" ) );\n        vkCmdSetSampleMaskEXT               = PFN_vkCmdSetSampleMaskEXT( vkGetDeviceProcAddr( device, \"vkCmdSetSampleMaskEXT\" ) );\n        vkCmdSetAlphaToCoverageEnableEXT    = PFN_vkCmdSetAlphaToCoverageEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetAlphaToCoverageEnableEXT\" ) );\n        vkCmdSetAlphaToOneEnableEXT         = PFN_vkCmdSetAlphaToOneEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetAlphaToOneEnableEXT\" ) );\n        vkCmdSetLogicOpEnableEXT            = PFN_vkCmdSetLogicOpEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetLogicOpEnableEXT\" ) );\n        vkCmdSetColorBlendEnableEXT         = PFN_vkCmdSetColorBlendEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetColorBlendEnableEXT\" ) );\n        vkCmdSetColorBlendEquationEXT       = PFN_vkCmdSetColorBlendEquationEXT( vkGetDeviceProcAddr( device, \"vkCmdSetColorBlendEquationEXT\" ) );\n        vkCmdSetColorWriteMaskEXT           = PFN_vkCmdSetColorWriteMaskEXT( vkGetDeviceProcAddr( device, \"vkCmdSetColorWriteMaskEXT\" ) );\n        vkCmdSetTessellationDomainOriginEXT = PFN_vkCmdSetTessellationDomainOriginEXT( vkGetDeviceProcAddr( device, \"vkCmdSetTessellationDomainOriginEXT\" ) );\n        vkCmdSetRasterizationStreamEXT      = PFN_vkCmdSetRasterizationStreamEXT( vkGetDeviceProcAddr( device, \"vkCmdSetRasterizationStreamEXT\" ) );\n        vkCmdSetConservativeRasterizationModeEXT =\n          PFN_vkCmdSetConservativeRasterizationModeEXT( vkGetDeviceProcAddr( device, \"vkCmdSetConservativeRasterizationModeEXT\" ) );\n        vkCmdSetExtraPrimitiveOverestimationSizeEXT =\n          PFN_vkCmdSetExtraPrimitiveOverestimationSizeEXT( vkGetDeviceProcAddr( device, \"vkCmdSetExtraPrimitiveOverestimationSizeEXT\" ) );\n        vkCmdSetDepthClipEnableEXT       = PFN_vkCmdSetDepthClipEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDepthClipEnableEXT\" ) );\n        vkCmdSetSampleLocationsEnableEXT = PFN_vkCmdSetSampleLocationsEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetSampleLocationsEnableEXT\" ) );\n        vkCmdSetColorBlendAdvancedEXT    = PFN_vkCmdSetColorBlendAdvancedEXT( vkGetDeviceProcAddr( device, \"vkCmdSetColorBlendAdvancedEXT\" ) );\n        vkCmdSetProvokingVertexModeEXT   = PFN_vkCmdSetProvokingVertexModeEXT( vkGetDeviceProcAddr( device, \"vkCmdSetProvokingVertexModeEXT\" ) );\n        vkCmdSetLineRasterizationModeEXT = PFN_vkCmdSetLineRasterizationModeEXT( vkGetDeviceProcAddr( device, \"vkCmdSetLineRasterizationModeEXT\" ) );\n        vkCmdSetLineStippleEnableEXT     = PFN_vkCmdSetLineStippleEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetLineStippleEnableEXT\" ) );\n        vkCmdSetDepthClipNegativeOneToOneEXT =\n          PFN_vkCmdSetDepthClipNegativeOneToOneEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDepthClipNegativeOneToOneEXT\" ) );\n        vkCmdSetViewportWScalingEnableNV  = PFN_vkCmdSetViewportWScalingEnableNV( vkGetDeviceProcAddr( device, \"vkCmdSetViewportWScalingEnableNV\" ) );\n        vkCmdSetViewportSwizzleNV         = PFN_vkCmdSetViewportSwizzleNV( vkGetDeviceProcAddr( device, \"vkCmdSetViewportSwizzleNV\" ) );\n        vkCmdSetCoverageToColorEnableNV   = PFN_vkCmdSetCoverageToColorEnableNV( vkGetDeviceProcAddr( device, \"vkCmdSetCoverageToColorEnableNV\" ) );\n        vkCmdSetCoverageToColorLocationNV = PFN_vkCmdSetCoverageToColorLocationNV( vkGetDeviceProcAddr( device, \"vkCmdSetCoverageToColorLocationNV\" ) );\n        vkCmdSetCoverageModulationModeNV  = PFN_vkCmdSetCoverageModulationModeNV( vkGetDeviceProcAddr( device, \"vkCmdSetCoverageModulationModeNV\" ) );\n        vkCmdSetCoverageModulationTableEnableNV =\n          PFN_vkCmdSetCoverageModulationTableEnableNV( vkGetDeviceProcAddr( device, \"vkCmdSetCoverageModulationTableEnableNV\" ) );\n        vkCmdSetCoverageModulationTableNV = PFN_vkCmdSetCoverageModulationTableNV( vkGetDeviceProcAddr( device, \"vkCmdSetCoverageModulationTableNV\" ) );\n        vkCmdSetShadingRateImageEnableNV  = PFN_vkCmdSetShadingRateImageEnableNV( vkGetDeviceProcAddr( device, \"vkCmdSetShadingRateImageEnableNV\" ) );\n        vkCmdSetRepresentativeFragmentTestEnableNV =\n          PFN_vkCmdSetRepresentativeFragmentTestEnableNV( vkGetDeviceProcAddr( device, \"vkCmdSetRepresentativeFragmentTestEnableNV\" ) );\n        vkCmdSetCoverageReductionModeNV = PFN_vkCmdSetCoverageReductionModeNV( vkGetDeviceProcAddr( device, \"vkCmdSetCoverageReductionModeNV\" ) );\n\n        //=== VK_EXT_shader_module_identifier ===\n        vkGetShaderModuleIdentifierEXT = PFN_vkGetShaderModuleIdentifierEXT( vkGetDeviceProcAddr( device, \"vkGetShaderModuleIdentifierEXT\" ) );\n        vkGetShaderModuleCreateInfoIdentifierEXT =\n          PFN_vkGetShaderModuleCreateInfoIdentifierEXT( vkGetDeviceProcAddr( device, \"vkGetShaderModuleCreateInfoIdentifierEXT\" ) );\n\n        //=== VK_NV_optical_flow ===\n        vkCreateOpticalFlowSessionNV    = PFN_vkCreateOpticalFlowSessionNV( vkGetDeviceProcAddr( device, \"vkCreateOpticalFlowSessionNV\" ) );\n        vkDestroyOpticalFlowSessionNV   = PFN_vkDestroyOpticalFlowSessionNV( vkGetDeviceProcAddr( device, \"vkDestroyOpticalFlowSessionNV\" ) );\n        vkBindOpticalFlowSessionImageNV = PFN_vkBindOpticalFlowSessionImageNV( vkGetDeviceProcAddr( device, \"vkBindOpticalFlowSessionImageNV\" ) );\n        vkCmdOpticalFlowExecuteNV       = PFN_vkCmdOpticalFlowExecuteNV( vkGetDeviceProcAddr( device, \"vkCmdOpticalFlowExecuteNV\" ) );\n\n        //=== VK_KHR_maintenance5 ===\n        vkCmdBindIndexBuffer2KHR = PFN_vkCmdBindIndexBuffer2KHR( vkGetDeviceProcAddr( device, \"vkCmdBindIndexBuffer2KHR\" ) );\n        if ( !vkCmdBindIndexBuffer2 )\n          vkCmdBindIndexBuffer2 = vkCmdBindIndexBuffer2KHR;\n        vkGetRenderingAreaGranularityKHR = PFN_vkGetRenderingAreaGranularityKHR( vkGetDeviceProcAddr( device, \"vkGetRenderingAreaGranularityKHR\" ) );\n        if ( !vkGetRenderingAreaGranularity )\n          vkGetRenderingAreaGranularity = vkGetRenderingAreaGranularityKHR;\n        vkGetDeviceImageSubresourceLayoutKHR =\n          PFN_vkGetDeviceImageSubresourceLayoutKHR( vkGetDeviceProcAddr( device, \"vkGetDeviceImageSubresourceLayoutKHR\" ) );\n        if ( !vkGetDeviceImageSubresourceLayout )\n          vkGetDeviceImageSubresourceLayout = vkGetDeviceImageSubresourceLayoutKHR;\n        vkGetImageSubresourceLayout2KHR = PFN_vkGetImageSubresourceLayout2KHR( vkGetDeviceProcAddr( device, \"vkGetImageSubresourceLayout2KHR\" ) );\n        if ( !vkGetImageSubresourceLayout2 )\n          vkGetImageSubresourceLayout2 = vkGetImageSubresourceLayout2KHR;\n\n        //=== VK_AMD_anti_lag ===\n        vkAntiLagUpdateAMD = PFN_vkAntiLagUpdateAMD( vkGetDeviceProcAddr( device, \"vkAntiLagUpdateAMD\" ) );\n\n        //=== VK_EXT_shader_object ===\n        vkCreateShadersEXT         = PFN_vkCreateShadersEXT( vkGetDeviceProcAddr( device, \"vkCreateShadersEXT\" ) );\n        vkDestroyShaderEXT         = PFN_vkDestroyShaderEXT( vkGetDeviceProcAddr( device, \"vkDestroyShaderEXT\" ) );\n        vkGetShaderBinaryDataEXT   = PFN_vkGetShaderBinaryDataEXT( vkGetDeviceProcAddr( device, \"vkGetShaderBinaryDataEXT\" ) );\n        vkCmdBindShadersEXT        = PFN_vkCmdBindShadersEXT( vkGetDeviceProcAddr( device, \"vkCmdBindShadersEXT\" ) );\n        vkCmdSetDepthClampRangeEXT = PFN_vkCmdSetDepthClampRangeEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDepthClampRangeEXT\" ) );\n\n        //=== VK_KHR_pipeline_binary ===\n        vkCreatePipelineBinariesKHR      = PFN_vkCreatePipelineBinariesKHR( vkGetDeviceProcAddr( device, \"vkCreatePipelineBinariesKHR\" ) );\n        vkDestroyPipelineBinaryKHR       = PFN_vkDestroyPipelineBinaryKHR( vkGetDeviceProcAddr( device, \"vkDestroyPipelineBinaryKHR\" ) );\n        vkGetPipelineKeyKHR              = PFN_vkGetPipelineKeyKHR( vkGetDeviceProcAddr( device, \"vkGetPipelineKeyKHR\" ) );\n        vkGetPipelineBinaryDataKHR       = PFN_vkGetPipelineBinaryDataKHR( vkGetDeviceProcAddr( device, \"vkGetPipelineBinaryDataKHR\" ) );\n        vkReleaseCapturedPipelineDataKHR = PFN_vkReleaseCapturedPipelineDataKHR( vkGetDeviceProcAddr( device, \"vkReleaseCapturedPipelineDataKHR\" ) );\n\n        //=== VK_QCOM_tile_properties ===\n        vkGetFramebufferTilePropertiesQCOM = PFN_vkGetFramebufferTilePropertiesQCOM( vkGetDeviceProcAddr( device, \"vkGetFramebufferTilePropertiesQCOM\" ) );\n        vkGetDynamicRenderingTilePropertiesQCOM =\n          PFN_vkGetDynamicRenderingTilePropertiesQCOM( vkGetDeviceProcAddr( device, \"vkGetDynamicRenderingTilePropertiesQCOM\" ) );\n\n        //=== VK_NV_cooperative_vector ===\n        vkConvertCooperativeVectorMatrixNV = PFN_vkConvertCooperativeVectorMatrixNV( vkGetDeviceProcAddr( device, \"vkConvertCooperativeVectorMatrixNV\" ) );\n        vkCmdConvertCooperativeVectorMatrixNV =\n          PFN_vkCmdConvertCooperativeVectorMatrixNV( vkGetDeviceProcAddr( device, \"vkCmdConvertCooperativeVectorMatrixNV\" ) );\n\n        //=== VK_NV_low_latency2 ===\n        vkSetLatencySleepModeNV  = PFN_vkSetLatencySleepModeNV( vkGetDeviceProcAddr( device, \"vkSetLatencySleepModeNV\" ) );\n        vkLatencySleepNV         = PFN_vkLatencySleepNV( vkGetDeviceProcAddr( device, \"vkLatencySleepNV\" ) );\n        vkSetLatencyMarkerNV     = PFN_vkSetLatencyMarkerNV( vkGetDeviceProcAddr( device, \"vkSetLatencyMarkerNV\" ) );\n        vkGetLatencyTimingsNV    = PFN_vkGetLatencyTimingsNV( vkGetDeviceProcAddr( device, \"vkGetLatencyTimingsNV\" ) );\n        vkQueueNotifyOutOfBandNV = PFN_vkQueueNotifyOutOfBandNV( vkGetDeviceProcAddr( device, \"vkQueueNotifyOutOfBandNV\" ) );\n\n        //=== VK_EXT_attachment_feedback_loop_dynamic_state ===\n        vkCmdSetAttachmentFeedbackLoopEnableEXT =\n          PFN_vkCmdSetAttachmentFeedbackLoopEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetAttachmentFeedbackLoopEnableEXT\" ) );\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n        //=== VK_QNX_external_memory_screen_buffer ===\n        vkGetScreenBufferPropertiesQNX = PFN_vkGetScreenBufferPropertiesQNX( vkGetDeviceProcAddr( device, \"vkGetScreenBufferPropertiesQNX\" ) );\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n        //=== VK_KHR_line_rasterization ===\n        vkCmdSetLineStippleKHR = PFN_vkCmdSetLineStippleKHR( vkGetDeviceProcAddr( device, \"vkCmdSetLineStippleKHR\" ) );\n        if ( !vkCmdSetLineStipple )\n          vkCmdSetLineStipple = vkCmdSetLineStippleKHR;\n\n        //=== VK_KHR_calibrated_timestamps ===\n        vkGetCalibratedTimestampsKHR = PFN_vkGetCalibratedTimestampsKHR( vkGetDeviceProcAddr( device, \"vkGetCalibratedTimestampsKHR\" ) );\n\n        //=== VK_KHR_maintenance6 ===\n        vkCmdBindDescriptorSets2KHR = PFN_vkCmdBindDescriptorSets2KHR( vkGetDeviceProcAddr( device, \"vkCmdBindDescriptorSets2KHR\" ) );\n        if ( !vkCmdBindDescriptorSets2 )\n          vkCmdBindDescriptorSets2 = vkCmdBindDescriptorSets2KHR;\n        vkCmdPushConstants2KHR = PFN_vkCmdPushConstants2KHR( vkGetDeviceProcAddr( device, \"vkCmdPushConstants2KHR\" ) );\n        if ( !vkCmdPushConstants2 )\n          vkCmdPushConstants2 = vkCmdPushConstants2KHR;\n        vkCmdPushDescriptorSet2KHR = PFN_vkCmdPushDescriptorSet2KHR( vkGetDeviceProcAddr( device, \"vkCmdPushDescriptorSet2KHR\" ) );\n        if ( !vkCmdPushDescriptorSet2 )\n          vkCmdPushDescriptorSet2 = vkCmdPushDescriptorSet2KHR;\n        vkCmdPushDescriptorSetWithTemplate2KHR =\n          PFN_vkCmdPushDescriptorSetWithTemplate2KHR( vkGetDeviceProcAddr( device, \"vkCmdPushDescriptorSetWithTemplate2KHR\" ) );\n        if ( !vkCmdPushDescriptorSetWithTemplate2 )\n          vkCmdPushDescriptorSetWithTemplate2 = vkCmdPushDescriptorSetWithTemplate2KHR;\n        vkCmdSetDescriptorBufferOffsets2EXT = PFN_vkCmdSetDescriptorBufferOffsets2EXT( vkGetDeviceProcAddr( device, \"vkCmdSetDescriptorBufferOffsets2EXT\" ) );\n        vkCmdBindDescriptorBufferEmbeddedSamplers2EXT =\n          PFN_vkCmdBindDescriptorBufferEmbeddedSamplers2EXT( vkGetDeviceProcAddr( device, \"vkCmdBindDescriptorBufferEmbeddedSamplers2EXT\" ) );\n\n        //=== VK_NV_cluster_acceleration_structure ===\n        vkGetClusterAccelerationStructureBuildSizesNV =\n          PFN_vkGetClusterAccelerationStructureBuildSizesNV( vkGetDeviceProcAddr( device, \"vkGetClusterAccelerationStructureBuildSizesNV\" ) );\n        vkCmdBuildClusterAccelerationStructureIndirectNV =\n          PFN_vkCmdBuildClusterAccelerationStructureIndirectNV( vkGetDeviceProcAddr( device, \"vkCmdBuildClusterAccelerationStructureIndirectNV\" ) );\n\n        //=== VK_NV_partitioned_acceleration_structure ===\n        vkGetPartitionedAccelerationStructuresBuildSizesNV =\n          PFN_vkGetPartitionedAccelerationStructuresBuildSizesNV( vkGetDeviceProcAddr( device, \"vkGetPartitionedAccelerationStructuresBuildSizesNV\" ) );\n        vkCmdBuildPartitionedAccelerationStructuresNV =\n          PFN_vkCmdBuildPartitionedAccelerationStructuresNV( vkGetDeviceProcAddr( device, \"vkCmdBuildPartitionedAccelerationStructuresNV\" ) );\n\n        //=== VK_EXT_device_generated_commands ===\n        vkGetGeneratedCommandsMemoryRequirementsEXT =\n          PFN_vkGetGeneratedCommandsMemoryRequirementsEXT( vkGetDeviceProcAddr( device, \"vkGetGeneratedCommandsMemoryRequirementsEXT\" ) );\n        vkCmdPreprocessGeneratedCommandsEXT = PFN_vkCmdPreprocessGeneratedCommandsEXT( vkGetDeviceProcAddr( device, \"vkCmdPreprocessGeneratedCommandsEXT\" ) );\n        vkCmdExecuteGeneratedCommandsEXT    = PFN_vkCmdExecuteGeneratedCommandsEXT( vkGetDeviceProcAddr( device, \"vkCmdExecuteGeneratedCommandsEXT\" ) );\n        vkCreateIndirectCommandsLayoutEXT   = PFN_vkCreateIndirectCommandsLayoutEXT( vkGetDeviceProcAddr( device, \"vkCreateIndirectCommandsLayoutEXT\" ) );\n        vkDestroyIndirectCommandsLayoutEXT  = PFN_vkDestroyIndirectCommandsLayoutEXT( vkGetDeviceProcAddr( device, \"vkDestroyIndirectCommandsLayoutEXT\" ) );\n        vkCreateIndirectExecutionSetEXT     = PFN_vkCreateIndirectExecutionSetEXT( vkGetDeviceProcAddr( device, \"vkCreateIndirectExecutionSetEXT\" ) );\n        vkDestroyIndirectExecutionSetEXT    = PFN_vkDestroyIndirectExecutionSetEXT( vkGetDeviceProcAddr( device, \"vkDestroyIndirectExecutionSetEXT\" ) );\n        vkUpdateIndirectExecutionSetPipelineEXT =\n          PFN_vkUpdateIndirectExecutionSetPipelineEXT( vkGetDeviceProcAddr( device, \"vkUpdateIndirectExecutionSetPipelineEXT\" ) );\n        vkUpdateIndirectExecutionSetShaderEXT =\n          PFN_vkUpdateIndirectExecutionSetShaderEXT( vkGetDeviceProcAddr( device, \"vkUpdateIndirectExecutionSetShaderEXT\" ) );\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n        //=== VK_EXT_external_memory_metal ===\n        vkGetMemoryMetalHandleEXT           = PFN_vkGetMemoryMetalHandleEXT( vkGetDeviceProcAddr( device, \"vkGetMemoryMetalHandleEXT\" ) );\n        vkGetMemoryMetalHandlePropertiesEXT = PFN_vkGetMemoryMetalHandlePropertiesEXT( vkGetDeviceProcAddr( device, \"vkGetMemoryMetalHandlePropertiesEXT\" ) );\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n      }\n\n      template <typename DynamicLoader>\n      void init( VULKAN_HPP_NAMESPACE::Instance const & instance, VULKAN_HPP_NAMESPACE::Device const & device, DynamicLoader const & dl ) VULKAN_HPP_NOEXCEPT\n      {\n        PFN_vkGetInstanceProcAddr getInstanceProcAddr = dl.template getProcAddress<PFN_vkGetInstanceProcAddr>( \"vkGetInstanceProcAddr\" );\n        PFN_vkGetDeviceProcAddr   getDeviceProcAddr   = dl.template getProcAddress<PFN_vkGetDeviceProcAddr>( \"vkGetDeviceProcAddr\" );\n        init( static_cast<VkInstance>( instance ), getInstanceProcAddr, static_cast<VkDevice>( device ), device ? getDeviceProcAddr : nullptr );\n      }\n\n      template <typename DynamicLoader\n#if VULKAN_HPP_ENABLE_DYNAMIC_LOADER_TOOL\n                = VULKAN_HPP_NAMESPACE::detail::DynamicLoader\n#endif\n                >\n      void init( VULKAN_HPP_NAMESPACE::Instance const & instance, VULKAN_HPP_NAMESPACE::Device const & device ) VULKAN_HPP_NOEXCEPT\n      {\n        static DynamicLoader dl;\n        init( instance, device, dl );\n      }\n    };\n  }  // namespace detail\n}  // namespace VULKAN_HPP_NAMESPACE\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_android.h",
    "content": "#ifndef VULKAN_ANDROID_H_\n#define VULKAN_ANDROID_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// VK_KHR_android_surface is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_android_surface 1\nstruct ANativeWindow;\n#define VK_KHR_ANDROID_SURFACE_SPEC_VERSION 6\n#define VK_KHR_ANDROID_SURFACE_EXTENSION_NAME \"VK_KHR_android_surface\"\ntypedef VkFlags VkAndroidSurfaceCreateFlagsKHR;\ntypedef struct VkAndroidSurfaceCreateInfoKHR {\n    VkStructureType                   sType;\n    const void*                       pNext;\n    VkAndroidSurfaceCreateFlagsKHR    flags;\n    struct ANativeWindow*             window;\n} VkAndroidSurfaceCreateInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateAndroidSurfaceKHR)(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateAndroidSurfaceKHR(\n    VkInstance                                  instance,\n    const VkAndroidSurfaceCreateInfoKHR*        pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSurfaceKHR*                               pSurface);\n#endif\n\n\n// VK_ANDROID_external_memory_android_hardware_buffer is a preprocessor guard. Do not pass it to API calls.\n#define VK_ANDROID_external_memory_android_hardware_buffer 1\nstruct AHardwareBuffer;\n#define VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_SPEC_VERSION 5\n#define VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME \"VK_ANDROID_external_memory_android_hardware_buffer\"\ntypedef struct VkAndroidHardwareBufferUsageANDROID {\n    VkStructureType    sType;\n    void*              pNext;\n    uint64_t           androidHardwareBufferUsage;\n} VkAndroidHardwareBufferUsageANDROID;\n\ntypedef struct VkAndroidHardwareBufferPropertiesANDROID {\n    VkStructureType    sType;\n    void*              pNext;\n    VkDeviceSize       allocationSize;\n    uint32_t           memoryTypeBits;\n} VkAndroidHardwareBufferPropertiesANDROID;\n\ntypedef struct VkAndroidHardwareBufferFormatPropertiesANDROID {\n    VkStructureType                  sType;\n    void*                            pNext;\n    VkFormat                         format;\n    uint64_t                         externalFormat;\n    VkFormatFeatureFlags             formatFeatures;\n    VkComponentMapping               samplerYcbcrConversionComponents;\n    VkSamplerYcbcrModelConversion    suggestedYcbcrModel;\n    VkSamplerYcbcrRange              suggestedYcbcrRange;\n    VkChromaLocation                 suggestedXChromaOffset;\n    VkChromaLocation                 suggestedYChromaOffset;\n} VkAndroidHardwareBufferFormatPropertiesANDROID;\n\ntypedef struct VkImportAndroidHardwareBufferInfoANDROID {\n    VkStructureType            sType;\n    const void*                pNext;\n    struct AHardwareBuffer*    buffer;\n} VkImportAndroidHardwareBufferInfoANDROID;\n\ntypedef struct VkMemoryGetAndroidHardwareBufferInfoANDROID {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkDeviceMemory     memory;\n} VkMemoryGetAndroidHardwareBufferInfoANDROID;\n\ntypedef struct VkExternalFormatANDROID {\n    VkStructureType    sType;\n    void*              pNext;\n    uint64_t           externalFormat;\n} VkExternalFormatANDROID;\n\ntypedef struct VkAndroidHardwareBufferFormatProperties2ANDROID {\n    VkStructureType                  sType;\n    void*                            pNext;\n    VkFormat                         format;\n    uint64_t                         externalFormat;\n    VkFormatFeatureFlags2            formatFeatures;\n    VkComponentMapping               samplerYcbcrConversionComponents;\n    VkSamplerYcbcrModelConversion    suggestedYcbcrModel;\n    VkSamplerYcbcrRange              suggestedYcbcrRange;\n    VkChromaLocation                 suggestedXChromaOffset;\n    VkChromaLocation                 suggestedYChromaOffset;\n} VkAndroidHardwareBufferFormatProperties2ANDROID;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetAndroidHardwareBufferPropertiesANDROID)(VkDevice device, const struct AHardwareBuffer* buffer, VkAndroidHardwareBufferPropertiesANDROID* pProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetMemoryAndroidHardwareBufferANDROID)(VkDevice device, const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, struct AHardwareBuffer** pBuffer);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetAndroidHardwareBufferPropertiesANDROID(\n    VkDevice                                    device,\n    const struct AHardwareBuffer*               buffer,\n    VkAndroidHardwareBufferPropertiesANDROID*   pProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryAndroidHardwareBufferANDROID(\n    VkDevice                                    device,\n    const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo,\n    struct AHardwareBuffer**                    pBuffer);\n#endif\n\n\n// VK_ANDROID_external_format_resolve is a preprocessor guard. Do not pass it to API calls.\n#define VK_ANDROID_external_format_resolve 1\n#define VK_ANDROID_EXTERNAL_FORMAT_RESOLVE_SPEC_VERSION 1\n#define VK_ANDROID_EXTERNAL_FORMAT_RESOLVE_EXTENSION_NAME \"VK_ANDROID_external_format_resolve\"\ntypedef struct VkPhysicalDeviceExternalFormatResolveFeaturesANDROID {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           externalFormatResolve;\n} VkPhysicalDeviceExternalFormatResolveFeaturesANDROID;\n\ntypedef struct VkPhysicalDeviceExternalFormatResolvePropertiesANDROID {\n    VkStructureType     sType;\n    void*               pNext;\n    VkBool32            nullColorAttachmentWithExternalFormatResolve;\n    VkChromaLocation    externalFormatResolveChromaOffsetX;\n    VkChromaLocation    externalFormatResolveChromaOffsetY;\n} VkPhysicalDeviceExternalFormatResolvePropertiesANDROID;\n\ntypedef struct VkAndroidHardwareBufferFormatResolvePropertiesANDROID {\n    VkStructureType    sType;\n    void*              pNext;\n    VkFormat           colorAttachmentFormat;\n} VkAndroidHardwareBufferFormatResolvePropertiesANDROID;\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_beta.h",
    "content": "#ifndef VULKAN_BETA_H_\n#define VULKAN_BETA_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// VK_KHR_portability_subset is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_portability_subset 1\n#define VK_KHR_PORTABILITY_SUBSET_SPEC_VERSION 1\n#define VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME \"VK_KHR_portability_subset\"\ntypedef struct VkPhysicalDevicePortabilitySubsetFeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           constantAlphaColorBlendFactors;\n    VkBool32           events;\n    VkBool32           imageViewFormatReinterpretation;\n    VkBool32           imageViewFormatSwizzle;\n    VkBool32           imageView2DOn3DImage;\n    VkBool32           multisampleArrayImage;\n    VkBool32           mutableComparisonSamplers;\n    VkBool32           pointPolygons;\n    VkBool32           samplerMipLodBias;\n    VkBool32           separateStencilMaskRef;\n    VkBool32           shaderSampleRateInterpolationFunctions;\n    VkBool32           tessellationIsolines;\n    VkBool32           tessellationPointMode;\n    VkBool32           triangleFans;\n    VkBool32           vertexAttributeAccessBeyondStride;\n} VkPhysicalDevicePortabilitySubsetFeaturesKHR;\n\ntypedef struct VkPhysicalDevicePortabilitySubsetPropertiesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           minVertexInputBindingStrideAlignment;\n} VkPhysicalDevicePortabilitySubsetPropertiesKHR;\n\n\n\n// VK_AMDX_shader_enqueue is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMDX_shader_enqueue 1\n#define VK_AMDX_SHADER_ENQUEUE_SPEC_VERSION 2\n#define VK_AMDX_SHADER_ENQUEUE_EXTENSION_NAME \"VK_AMDX_shader_enqueue\"\n#define VK_SHADER_INDEX_UNUSED_AMDX       (~0U)\ntypedef struct VkPhysicalDeviceShaderEnqueueFeaturesAMDX {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderEnqueue;\n    VkBool32           shaderMeshEnqueue;\n} VkPhysicalDeviceShaderEnqueueFeaturesAMDX;\n\ntypedef struct VkPhysicalDeviceShaderEnqueuePropertiesAMDX {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxExecutionGraphDepth;\n    uint32_t           maxExecutionGraphShaderOutputNodes;\n    uint32_t           maxExecutionGraphShaderPayloadSize;\n    uint32_t           maxExecutionGraphShaderPayloadCount;\n    uint32_t           executionGraphDispatchAddressAlignment;\n    uint32_t           maxExecutionGraphWorkgroupCount[3];\n    uint32_t           maxExecutionGraphWorkgroups;\n} VkPhysicalDeviceShaderEnqueuePropertiesAMDX;\n\ntypedef struct VkExecutionGraphPipelineScratchSizeAMDX {\n    VkStructureType    sType;\n    void*              pNext;\n    VkDeviceSize       minSize;\n    VkDeviceSize       maxSize;\n    VkDeviceSize       sizeGranularity;\n} VkExecutionGraphPipelineScratchSizeAMDX;\n\ntypedef struct VkExecutionGraphPipelineCreateInfoAMDX {\n    VkStructureType                           sType;\n    const void*                               pNext;\n    VkPipelineCreateFlags                     flags;\n    uint32_t                                  stageCount;\n    const VkPipelineShaderStageCreateInfo*    pStages;\n    const VkPipelineLibraryCreateInfoKHR*     pLibraryInfo;\n    VkPipelineLayout                          layout;\n    VkPipeline                                basePipelineHandle;\n    int32_t                                   basePipelineIndex;\n} VkExecutionGraphPipelineCreateInfoAMDX;\n\ntypedef union VkDeviceOrHostAddressConstAMDX {\n    VkDeviceAddress    deviceAddress;\n    const void*        hostAddress;\n} VkDeviceOrHostAddressConstAMDX;\n\ntypedef struct VkDispatchGraphInfoAMDX {\n    uint32_t                          nodeIndex;\n    uint32_t                          payloadCount;\n    VkDeviceOrHostAddressConstAMDX    payloads;\n    uint64_t                          payloadStride;\n} VkDispatchGraphInfoAMDX;\n\ntypedef struct VkDispatchGraphCountInfoAMDX {\n    uint32_t                          count;\n    VkDeviceOrHostAddressConstAMDX    infos;\n    uint64_t                          stride;\n} VkDispatchGraphCountInfoAMDX;\n\ntypedef struct VkPipelineShaderStageNodeCreateInfoAMDX {\n      VkStructureType    sType;\n    const void*          pNext;\n    const char*          pName;\n    uint32_t             index;\n} VkPipelineShaderStageNodeCreateInfoAMDX;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateExecutionGraphPipelinesAMDX)(VkDevice                                        device, VkPipelineCache                 pipelineCache, uint32_t                                        createInfoCount, const VkExecutionGraphPipelineCreateInfoAMDX* pCreateInfos, const VkAllocationCallbacks*    pAllocator, VkPipeline*               pPipelines);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetExecutionGraphPipelineScratchSizeAMDX)(VkDevice                                        device, VkPipeline                                      executionGraph, VkExecutionGraphPipelineScratchSizeAMDX*        pSizeInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetExecutionGraphPipelineNodeIndexAMDX)(VkDevice                                        device, VkPipeline                                      executionGraph, const VkPipelineShaderStageNodeCreateInfoAMDX*  pNodeInfo, uint32_t*                                       pNodeIndex);\ntypedef void (VKAPI_PTR *PFN_vkCmdInitializeGraphScratchMemoryAMDX)(VkCommandBuffer                                 commandBuffer, VkPipeline                                      executionGraph, VkDeviceAddress                                 scratch, VkDeviceSize                                    scratchSize);\ntypedef void (VKAPI_PTR *PFN_vkCmdDispatchGraphAMDX)(VkCommandBuffer                                 commandBuffer, VkDeviceAddress                                 scratch, VkDeviceSize                                    scratchSize, const VkDispatchGraphCountInfoAMDX*             pCountInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdDispatchGraphIndirectAMDX)(VkCommandBuffer                                 commandBuffer, VkDeviceAddress                                 scratch, VkDeviceSize                                    scratchSize, const VkDispatchGraphCountInfoAMDX*             pCountInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdDispatchGraphIndirectCountAMDX)(VkCommandBuffer                                 commandBuffer, VkDeviceAddress                                 scratch, VkDeviceSize                                    scratchSize, VkDeviceAddress                                 countInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateExecutionGraphPipelinesAMDX(\n    VkDevice                                    device,\n    VkPipelineCache                             pipelineCache,\n    uint32_t                                    createInfoCount,\n    const VkExecutionGraphPipelineCreateInfoAMDX* pCreateInfos,\n    const VkAllocationCallbacks*                pAllocator,\n    VkPipeline*                                 pPipelines);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetExecutionGraphPipelineScratchSizeAMDX(\n    VkDevice                                    device,\n    VkPipeline                                  executionGraph,\n    VkExecutionGraphPipelineScratchSizeAMDX*    pSizeInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetExecutionGraphPipelineNodeIndexAMDX(\n    VkDevice                                    device,\n    VkPipeline                                  executionGraph,\n    const VkPipelineShaderStageNodeCreateInfoAMDX* pNodeInfo,\n    uint32_t*                                   pNodeIndex);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdInitializeGraphScratchMemoryAMDX(\n    VkCommandBuffer                             commandBuffer,\n    VkPipeline                                  executionGraph,\n    VkDeviceAddress                             scratch,\n    VkDeviceSize                                scratchSize);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDispatchGraphAMDX(\n    VkCommandBuffer                             commandBuffer,\n    VkDeviceAddress                             scratch,\n    VkDeviceSize                                scratchSize,\n    const VkDispatchGraphCountInfoAMDX*         pCountInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDispatchGraphIndirectAMDX(\n    VkCommandBuffer                             commandBuffer,\n    VkDeviceAddress                             scratch,\n    VkDeviceSize                                scratchSize,\n    const VkDispatchGraphCountInfoAMDX*         pCountInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDispatchGraphIndirectCountAMDX(\n    VkCommandBuffer                             commandBuffer,\n    VkDeviceAddress                             scratch,\n    VkDeviceSize                                scratchSize,\n    VkDeviceAddress                             countInfo);\n#endif\n\n\n// VK_NV_displacement_micromap is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_displacement_micromap 1\n#define VK_NV_DISPLACEMENT_MICROMAP_SPEC_VERSION 2\n#define VK_NV_DISPLACEMENT_MICROMAP_EXTENSION_NAME \"VK_NV_displacement_micromap\"\n\ntypedef enum VkDisplacementMicromapFormatNV {\n    VK_DISPLACEMENT_MICROMAP_FORMAT_64_TRIANGLES_64_BYTES_NV = 1,\n    VK_DISPLACEMENT_MICROMAP_FORMAT_256_TRIANGLES_128_BYTES_NV = 2,\n    VK_DISPLACEMENT_MICROMAP_FORMAT_1024_TRIANGLES_128_BYTES_NV = 3,\n    VK_DISPLACEMENT_MICROMAP_FORMAT_MAX_ENUM_NV = 0x7FFFFFFF\n} VkDisplacementMicromapFormatNV;\ntypedef struct VkPhysicalDeviceDisplacementMicromapFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           displacementMicromap;\n} VkPhysicalDeviceDisplacementMicromapFeaturesNV;\n\ntypedef struct VkPhysicalDeviceDisplacementMicromapPropertiesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxDisplacementMicromapSubdivisionLevel;\n} VkPhysicalDeviceDisplacementMicromapPropertiesNV;\n\ntypedef struct VkAccelerationStructureTrianglesDisplacementMicromapNV {\n    VkStructureType                     sType;\n    void*                               pNext;\n    VkFormat                            displacementBiasAndScaleFormat;\n    VkFormat                            displacementVectorFormat;\n    VkDeviceOrHostAddressConstKHR       displacementBiasAndScaleBuffer;\n    VkDeviceSize                        displacementBiasAndScaleStride;\n    VkDeviceOrHostAddressConstKHR       displacementVectorBuffer;\n    VkDeviceSize                        displacementVectorStride;\n    VkDeviceOrHostAddressConstKHR       displacedMicromapPrimitiveFlags;\n    VkDeviceSize                        displacedMicromapPrimitiveFlagsStride;\n    VkIndexType                         indexType;\n    VkDeviceOrHostAddressConstKHR       indexBuffer;\n    VkDeviceSize                        indexStride;\n    uint32_t                            baseTriangle;\n    uint32_t                            usageCountsCount;\n    const VkMicromapUsageEXT*           pUsageCounts;\n    const VkMicromapUsageEXT* const*    ppUsageCounts;\n    VkMicromapEXT                       micromap;\n} VkAccelerationStructureTrianglesDisplacementMicromapNV;\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_core.h",
    "content": "#ifndef VULKAN_CORE_H_\n#define VULKAN_CORE_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// VK_VERSION_1_0 is a preprocessor guard. Do not pass it to API calls.\n#define VK_VERSION_1_0 1\n#include \"vk_platform.h\"\n\n#define VK_DEFINE_HANDLE(object) typedef struct object##_T* object;\n\n\n#ifndef VK_USE_64_BIT_PTR_DEFINES\n    #if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__) || (defined(__riscv) && __riscv_xlen == 64)\n        #define VK_USE_64_BIT_PTR_DEFINES 1\n    #else\n        #define VK_USE_64_BIT_PTR_DEFINES 0\n    #endif\n#endif\n\n\n#ifndef VK_DEFINE_NON_DISPATCHABLE_HANDLE\n    #if (VK_USE_64_BIT_PTR_DEFINES==1)\n        #if (defined(__cplusplus) && (__cplusplus >= 201103L)) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201103L))\n            #define VK_NULL_HANDLE nullptr\n        #else\n            #define VK_NULL_HANDLE ((void*)0)\n        #endif\n    #else\n        #define VK_NULL_HANDLE 0ULL\n    #endif\n#endif\n#ifndef VK_NULL_HANDLE\n    #define VK_NULL_HANDLE 0\n#endif\n\n\n#ifndef VK_DEFINE_NON_DISPATCHABLE_HANDLE\n    #if (VK_USE_64_BIT_PTR_DEFINES==1)\n        #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef struct object##_T *object;\n    #else\n        #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef uint64_t object;\n    #endif\n#endif\n\n#define VK_MAKE_API_VERSION(variant, major, minor, patch) \\\n    ((((uint32_t)(variant)) << 29U) | (((uint32_t)(major)) << 22U) | (((uint32_t)(minor)) << 12U) | ((uint32_t)(patch)))\n\n// DEPRECATED: This define has been removed. Specific version defines (e.g. VK_API_VERSION_1_0), or the VK_MAKE_VERSION macro, should be used instead.\n//#define VK_API_VERSION VK_MAKE_API_VERSION(0, 1, 0, 0) // Patch version should always be set to 0\n\n// Vulkan 1.0 version number\n#define VK_API_VERSION_1_0 VK_MAKE_API_VERSION(0, 1, 0, 0)// Patch version should always be set to 0\n\n// Version of this file\n#define VK_HEADER_VERSION 307\n\n// Complete version of this file\n#define VK_HEADER_VERSION_COMPLETE VK_MAKE_API_VERSION(0, 1, 4, VK_HEADER_VERSION)\n\n// VK_MAKE_VERSION is deprecated, but no reason was given in the API XML\n// DEPRECATED: This define is deprecated. VK_MAKE_API_VERSION should be used instead.\n#define VK_MAKE_VERSION(major, minor, patch) \\\n    ((((uint32_t)(major)) << 22U) | (((uint32_t)(minor)) << 12U) | ((uint32_t)(patch)))\n\n// VK_VERSION_MAJOR is deprecated, but no reason was given in the API XML\n// DEPRECATED: This define is deprecated. VK_API_VERSION_MAJOR should be used instead.\n#define VK_VERSION_MAJOR(version) ((uint32_t)(version) >> 22U)\n\n// VK_VERSION_MINOR is deprecated, but no reason was given in the API XML\n// DEPRECATED: This define is deprecated. VK_API_VERSION_MINOR should be used instead.\n#define VK_VERSION_MINOR(version) (((uint32_t)(version) >> 12U) & 0x3FFU)\n\n// VK_VERSION_PATCH is deprecated, but no reason was given in the API XML\n// DEPRECATED: This define is deprecated. VK_API_VERSION_PATCH should be used instead.\n#define VK_VERSION_PATCH(version) ((uint32_t)(version) & 0xFFFU)\n\n#define VK_API_VERSION_VARIANT(version) ((uint32_t)(version) >> 29U)\n#define VK_API_VERSION_MAJOR(version) (((uint32_t)(version) >> 22U) & 0x7FU)\n#define VK_API_VERSION_MINOR(version) (((uint32_t)(version) >> 12U) & 0x3FFU)\n#define VK_API_VERSION_PATCH(version) ((uint32_t)(version) & 0xFFFU)\ntypedef uint32_t VkBool32;\ntypedef uint64_t VkDeviceAddress;\ntypedef uint64_t VkDeviceSize;\ntypedef uint32_t VkFlags;\ntypedef uint32_t VkSampleMask;\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBuffer)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkImage)\nVK_DEFINE_HANDLE(VkInstance)\nVK_DEFINE_HANDLE(VkPhysicalDevice)\nVK_DEFINE_HANDLE(VkDevice)\nVK_DEFINE_HANDLE(VkQueue)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSemaphore)\nVK_DEFINE_HANDLE(VkCommandBuffer)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkFence)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDeviceMemory)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkEvent)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkQueryPool)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBufferView)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkImageView)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkShaderModule)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipelineCache)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipelineLayout)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipeline)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkRenderPass)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorSetLayout)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSampler)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorSet)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorPool)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkFramebuffer)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkCommandPool)\n#define VK_ATTACHMENT_UNUSED              (~0U)\n#define VK_FALSE                          0U\n#define VK_LOD_CLAMP_NONE                 1000.0F\n#define VK_QUEUE_FAMILY_IGNORED           (~0U)\n#define VK_REMAINING_ARRAY_LAYERS         (~0U)\n#define VK_REMAINING_MIP_LEVELS           (~0U)\n#define VK_SUBPASS_EXTERNAL               (~0U)\n#define VK_TRUE                           1U\n#define VK_WHOLE_SIZE                     (~0ULL)\n#define VK_MAX_MEMORY_TYPES               32U\n#define VK_MAX_PHYSICAL_DEVICE_NAME_SIZE  256U\n#define VK_UUID_SIZE                      16U\n#define VK_MAX_EXTENSION_NAME_SIZE        256U\n#define VK_MAX_DESCRIPTION_SIZE           256U\n#define VK_MAX_MEMORY_HEAPS               16U\n\ntypedef enum VkResult {\n    VK_SUCCESS = 0,\n    VK_NOT_READY = 1,\n    VK_TIMEOUT = 2,\n    VK_EVENT_SET = 3,\n    VK_EVENT_RESET = 4,\n    VK_INCOMPLETE = 5,\n    VK_ERROR_OUT_OF_HOST_MEMORY = -1,\n    VK_ERROR_OUT_OF_DEVICE_MEMORY = -2,\n    VK_ERROR_INITIALIZATION_FAILED = -3,\n    VK_ERROR_DEVICE_LOST = -4,\n    VK_ERROR_MEMORY_MAP_FAILED = -5,\n    VK_ERROR_LAYER_NOT_PRESENT = -6,\n    VK_ERROR_EXTENSION_NOT_PRESENT = -7,\n    VK_ERROR_FEATURE_NOT_PRESENT = -8,\n    VK_ERROR_INCOMPATIBLE_DRIVER = -9,\n    VK_ERROR_TOO_MANY_OBJECTS = -10,\n    VK_ERROR_FORMAT_NOT_SUPPORTED = -11,\n    VK_ERROR_FRAGMENTED_POOL = -12,\n    VK_ERROR_UNKNOWN = -13,\n    VK_ERROR_OUT_OF_POOL_MEMORY = -1000069000,\n    VK_ERROR_INVALID_EXTERNAL_HANDLE = -1000072003,\n    VK_ERROR_FRAGMENTATION = -1000161000,\n    VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS = -1000257000,\n    VK_PIPELINE_COMPILE_REQUIRED = 1000297000,\n    VK_ERROR_NOT_PERMITTED = -1000174001,\n    VK_ERROR_SURFACE_LOST_KHR = -1000000000,\n    VK_ERROR_NATIVE_WINDOW_IN_USE_KHR = -1000000001,\n    VK_SUBOPTIMAL_KHR = 1000001003,\n    VK_ERROR_OUT_OF_DATE_KHR = -1000001004,\n    VK_ERROR_INCOMPATIBLE_DISPLAY_KHR = -1000003001,\n    VK_ERROR_VALIDATION_FAILED_EXT = -1000011001,\n    VK_ERROR_INVALID_SHADER_NV = -1000012000,\n    VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR = -1000023000,\n    VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR = -1000023001,\n    VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR = -1000023002,\n    VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR = -1000023003,\n    VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR = -1000023004,\n    VK_ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR = -1000023005,\n    VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT = -1000158000,\n    VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT = -1000255000,\n    VK_THREAD_IDLE_KHR = 1000268000,\n    VK_THREAD_DONE_KHR = 1000268001,\n    VK_OPERATION_DEFERRED_KHR = 1000268002,\n    VK_OPERATION_NOT_DEFERRED_KHR = 1000268003,\n    VK_ERROR_INVALID_VIDEO_STD_PARAMETERS_KHR = -1000299000,\n    VK_ERROR_COMPRESSION_EXHAUSTED_EXT = -1000338000,\n    VK_INCOMPATIBLE_SHADER_BINARY_EXT = 1000482000,\n    VK_PIPELINE_BINARY_MISSING_KHR = 1000483000,\n    VK_ERROR_NOT_ENOUGH_SPACE_KHR = -1000483000,\n    VK_ERROR_OUT_OF_POOL_MEMORY_KHR = VK_ERROR_OUT_OF_POOL_MEMORY,\n    VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR = VK_ERROR_INVALID_EXTERNAL_HANDLE,\n    VK_ERROR_FRAGMENTATION_EXT = VK_ERROR_FRAGMENTATION,\n    VK_ERROR_NOT_PERMITTED_EXT = VK_ERROR_NOT_PERMITTED,\n    VK_ERROR_NOT_PERMITTED_KHR = VK_ERROR_NOT_PERMITTED,\n    VK_ERROR_INVALID_DEVICE_ADDRESS_EXT = VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS,\n    VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR = VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS,\n    VK_PIPELINE_COMPILE_REQUIRED_EXT = VK_PIPELINE_COMPILE_REQUIRED,\n    VK_ERROR_PIPELINE_COMPILE_REQUIRED_EXT = VK_PIPELINE_COMPILE_REQUIRED,\n  // VK_ERROR_INCOMPATIBLE_SHADER_BINARY_EXT is a deprecated alias\n    VK_ERROR_INCOMPATIBLE_SHADER_BINARY_EXT = VK_INCOMPATIBLE_SHADER_BINARY_EXT,\n    VK_RESULT_MAX_ENUM = 0x7FFFFFFF\n} VkResult;\n\ntypedef enum VkStructureType {\n    VK_STRUCTURE_TYPE_APPLICATION_INFO = 0,\n    VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO = 1,\n    VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO = 2,\n    VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO = 3,\n    VK_STRUCTURE_TYPE_SUBMIT_INFO = 4,\n    VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO = 5,\n    VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE = 6,\n    VK_STRUCTURE_TYPE_BIND_SPARSE_INFO = 7,\n    VK_STRUCTURE_TYPE_FENCE_CREATE_INFO = 8,\n    VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO = 9,\n    VK_STRUCTURE_TYPE_EVENT_CREATE_INFO = 10,\n    VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO = 11,\n    VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO = 12,\n    VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO = 13,\n    VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO = 14,\n    VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO = 15,\n    VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO = 16,\n    VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO = 17,\n    VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO = 18,\n    VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO = 19,\n    VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO = 20,\n    VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO = 21,\n    VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO = 22,\n    VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO = 23,\n    VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO = 24,\n    VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO = 25,\n    VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO = 26,\n    VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO = 27,\n    VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO = 28,\n    VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO = 29,\n    VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO = 30,\n    VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO = 31,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO = 32,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO = 33,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO = 34,\n    VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET = 35,\n    VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET = 36,\n    VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO = 37,\n    VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO = 38,\n    VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO = 39,\n    VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO = 40,\n    VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO = 41,\n    VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO = 42,\n    VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO = 43,\n    VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER = 44,\n    VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER = 45,\n    VK_STRUCTURE_TYPE_MEMORY_BARRIER = 46,\n    VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO = 47,\n    VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO = 48,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES = 1000094000,\n    VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO = 1000157000,\n    VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO = 1000157001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES = 1000083000,\n    VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS = 1000127000,\n    VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO = 1000127001,\n    VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO = 1000060000,\n    VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO = 1000060003,\n    VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO = 1000060004,\n    VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO = 1000060005,\n    VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO = 1000060006,\n    VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO = 1000060013,\n    VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO = 1000060014,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES = 1000070000,\n    VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO = 1000070001,\n    VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2 = 1000146000,\n    VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2 = 1000146001,\n    VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2 = 1000146002,\n    VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2 = 1000146003,\n    VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2 = 1000146004,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2 = 1000059000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2 = 1000059001,\n    VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2 = 1000059002,\n    VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2 = 1000059003,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2 = 1000059004,\n    VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2 = 1000059005,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2 = 1000059006,\n    VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2 = 1000059007,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2 = 1000059008,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES = 1000117000,\n    VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO = 1000117001,\n    VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO = 1000117002,\n    VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO = 1000117003,\n    VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO = 1000053000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES = 1000053001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES = 1000053002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES = 1000120000,\n    VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO = 1000145000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES = 1000145001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES = 1000145002,\n    VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2 = 1000145003,\n    VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO = 1000156000,\n    VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO = 1000156001,\n    VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO = 1000156002,\n    VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO = 1000156003,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES = 1000156004,\n    VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES = 1000156005,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO = 1000085000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO = 1000071000,\n    VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES = 1000071001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO = 1000071002,\n    VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES = 1000071003,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES = 1000071004,\n    VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO = 1000072000,\n    VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO = 1000072001,\n    VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO = 1000072002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO = 1000112000,\n    VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES = 1000112001,\n    VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO = 1000113000,\n    VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO = 1000077000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO = 1000076000,\n    VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES = 1000076001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES = 1000168000,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT = 1000168001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES = 1000063000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES = 49,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES = 50,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES = 51,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES = 52,\n    VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO = 1000147000,\n    VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2 = 1000109000,\n    VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2 = 1000109001,\n    VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2 = 1000109002,\n    VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2 = 1000109003,\n    VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2 = 1000109004,\n    VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO = 1000109005,\n    VK_STRUCTURE_TYPE_SUBPASS_END_INFO = 1000109006,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES = 1000177000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES = 1000196000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES = 1000180000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES = 1000082000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES = 1000197000,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO = 1000161000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES = 1000161001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES = 1000161002,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO = 1000161003,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT = 1000161004,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES = 1000199000,\n    VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE = 1000199001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES = 1000221000,\n    VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO = 1000246000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES = 1000130000,\n    VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO = 1000130001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES = 1000211000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES = 1000108000,\n    VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO = 1000108001,\n    VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO = 1000108002,\n    VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO = 1000108003,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES = 1000253000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES = 1000175000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES = 1000241000,\n    VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT = 1000241001,\n    VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT = 1000241002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES = 1000261000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES = 1000207000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES = 1000207001,\n    VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO = 1000207002,\n    VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO = 1000207003,\n    VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO = 1000207004,\n    VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO = 1000207005,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES = 1000257000,\n    VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO = 1000244001,\n    VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO = 1000257002,\n    VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO = 1000257003,\n    VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO = 1000257004,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES = 53,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES = 54,\n    VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO = 1000192000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES = 1000215000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES = 1000245000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES = 1000276000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES = 1000295000,\n    VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO = 1000295001,\n    VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO = 1000295002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES = 1000297000,\n    VK_STRUCTURE_TYPE_MEMORY_BARRIER_2 = 1000314000,\n    VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2 = 1000314001,\n    VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2 = 1000314002,\n    VK_STRUCTURE_TYPE_DEPENDENCY_INFO = 1000314003,\n    VK_STRUCTURE_TYPE_SUBMIT_INFO_2 = 1000314004,\n    VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO = 1000314005,\n    VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO = 1000314006,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES = 1000314007,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES = 1000325000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES = 1000335000,\n    VK_STRUCTURE_TYPE_COPY_BUFFER_INFO_2 = 1000337000,\n    VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2 = 1000337001,\n    VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2 = 1000337002,\n    VK_STRUCTURE_TYPE_COPY_IMAGE_TO_BUFFER_INFO_2 = 1000337003,\n    VK_STRUCTURE_TYPE_BLIT_IMAGE_INFO_2 = 1000337004,\n    VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2 = 1000337005,\n    VK_STRUCTURE_TYPE_BUFFER_COPY_2 = 1000337006,\n    VK_STRUCTURE_TYPE_IMAGE_COPY_2 = 1000337007,\n    VK_STRUCTURE_TYPE_IMAGE_BLIT_2 = 1000337008,\n    VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2 = 1000337009,\n    VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2 = 1000337010,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES = 1000225000,\n    VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO = 1000225001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES = 1000225002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES = 1000138000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES = 1000138001,\n    VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK = 1000138002,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO = 1000138003,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES = 1000066000,\n    VK_STRUCTURE_TYPE_RENDERING_INFO = 1000044000,\n    VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO = 1000044001,\n    VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO = 1000044002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES = 1000044003,\n    VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO = 1000044004,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES = 1000280000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES = 1000280001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES = 1000281001,\n    VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3 = 1000360000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES = 1000413000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES = 1000413001,\n    VK_STRUCTURE_TYPE_DEVICE_BUFFER_MEMORY_REQUIREMENTS = 1000413002,\n    VK_STRUCTURE_TYPE_DEVICE_IMAGE_MEMORY_REQUIREMENTS = 1000413003,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_4_FEATURES = 55,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_4_PROPERTIES = 56,\n    VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO = 1000174000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES = 1000388000,\n    VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES = 1000388001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES = 1000416000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES = 1000528000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES = 1000544000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES = 1000259000,\n    VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO = 1000259001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES = 1000259002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES = 1000525000,\n    VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO = 1000190001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES = 1000190002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES = 1000265000,\n    VK_STRUCTURE_TYPE_MEMORY_MAP_INFO = 1000271000,\n    VK_STRUCTURE_TYPE_MEMORY_UNMAP_INFO = 1000271001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES = 1000470000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES = 1000470001,\n    VK_STRUCTURE_TYPE_RENDERING_AREA_INFO = 1000470003,\n    VK_STRUCTURE_TYPE_DEVICE_IMAGE_SUBRESOURCE_INFO = 1000470004,\n    VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2 = 1000338002,\n    VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2 = 1000338003,\n    VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO = 1000470005,\n    VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO = 1000470006,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES = 1000080000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES = 1000232000,\n    VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_LOCATION_INFO = 1000232001,\n    VK_STRUCTURE_TYPE_RENDERING_INPUT_ATTACHMENT_INDEX_INFO = 1000232002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES = 1000545000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_PROPERTIES = 1000545001,\n    VK_STRUCTURE_TYPE_BIND_MEMORY_STATUS = 1000545002,\n    VK_STRUCTURE_TYPE_BIND_DESCRIPTOR_SETS_INFO = 1000545003,\n    VK_STRUCTURE_TYPE_PUSH_CONSTANTS_INFO = 1000545004,\n    VK_STRUCTURE_TYPE_PUSH_DESCRIPTOR_SET_INFO = 1000545005,\n    VK_STRUCTURE_TYPE_PUSH_DESCRIPTOR_SET_WITH_TEMPLATE_INFO = 1000545006,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES = 1000466000,\n    VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO = 1000068000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES = 1000068001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES = 1000068002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES = 1000270000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES = 1000270001,\n    VK_STRUCTURE_TYPE_MEMORY_TO_IMAGE_COPY = 1000270002,\n    VK_STRUCTURE_TYPE_IMAGE_TO_MEMORY_COPY = 1000270003,\n    VK_STRUCTURE_TYPE_COPY_IMAGE_TO_MEMORY_INFO = 1000270004,\n    VK_STRUCTURE_TYPE_COPY_MEMORY_TO_IMAGE_INFO = 1000270005,\n    VK_STRUCTURE_TYPE_HOST_IMAGE_LAYOUT_TRANSITION_INFO = 1000270006,\n    VK_STRUCTURE_TYPE_COPY_IMAGE_TO_IMAGE_INFO = 1000270007,\n    VK_STRUCTURE_TYPE_SUBRESOURCE_HOST_MEMCPY_SIZE = 1000270008,\n    VK_STRUCTURE_TYPE_HOST_IMAGE_COPY_DEVICE_PERFORMANCE_QUERY = 1000270009,\n    VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR = 1000001000,\n    VK_STRUCTURE_TYPE_PRESENT_INFO_KHR = 1000001001,\n    VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR = 1000060007,\n    VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR = 1000060008,\n    VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR = 1000060009,\n    VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHR = 1000060010,\n    VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR = 1000060011,\n    VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR = 1000060012,\n    VK_STRUCTURE_TYPE_DISPLAY_MODE_CREATE_INFO_KHR = 1000002000,\n    VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR = 1000002001,\n    VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR = 1000003000,\n    VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR = 1000004000,\n    VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR = 1000005000,\n    VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR = 1000006000,\n    VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR = 1000008000,\n    VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR = 1000009000,\n    VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT = 1000011000,\n    VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD = 1000018000,\n    VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT = 1000022000,\n    VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT = 1000022001,\n    VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT = 1000022002,\n    VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR = 1000023000,\n    VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR = 1000023001,\n    VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR = 1000023002,\n    VK_STRUCTURE_TYPE_VIDEO_SESSION_MEMORY_REQUIREMENTS_KHR = 1000023003,\n    VK_STRUCTURE_TYPE_BIND_VIDEO_SESSION_MEMORY_INFO_KHR = 1000023004,\n    VK_STRUCTURE_TYPE_VIDEO_SESSION_CREATE_INFO_KHR = 1000023005,\n    VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000023006,\n    VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_UPDATE_INFO_KHR = 1000023007,\n    VK_STRUCTURE_TYPE_VIDEO_BEGIN_CODING_INFO_KHR = 1000023008,\n    VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR = 1000023009,\n    VK_STRUCTURE_TYPE_VIDEO_CODING_CONTROL_INFO_KHR = 1000023010,\n    VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_INFO_KHR = 1000023011,\n    VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR = 1000023012,\n    VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR = 1000023013,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR = 1000023014,\n    VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR = 1000023015,\n    VK_STRUCTURE_TYPE_QUEUE_FAMILY_QUERY_RESULT_STATUS_PROPERTIES_KHR = 1000023016,\n    VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR = 1000024000,\n    VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR = 1000024001,\n    VK_STRUCTURE_TYPE_VIDEO_DECODE_USAGE_INFO_KHR = 1000024002,\n    VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV = 1000026000,\n    VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV = 1000026001,\n    VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV = 1000026002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT = 1000028000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT = 1000028001,\n    VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT = 1000028002,\n    VK_STRUCTURE_TYPE_CU_MODULE_CREATE_INFO_NVX = 1000029000,\n    VK_STRUCTURE_TYPE_CU_FUNCTION_CREATE_INFO_NVX = 1000029001,\n    VK_STRUCTURE_TYPE_CU_LAUNCH_INFO_NVX = 1000029002,\n    VK_STRUCTURE_TYPE_CU_MODULE_TEXTURING_MODE_CREATE_INFO_NVX = 1000029004,\n    VK_STRUCTURE_TYPE_IMAGE_VIEW_HANDLE_INFO_NVX = 1000030000,\n    VK_STRUCTURE_TYPE_IMAGE_VIEW_ADDRESS_PROPERTIES_NVX = 1000030001,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_KHR = 1000038000,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000038001,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR = 1000038002,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PICTURE_INFO_KHR = 1000038003,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_DPB_SLOT_INFO_KHR = 1000038004,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_NALU_SLICE_INFO_KHR = 1000038005,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_GOP_REMAINING_FRAME_INFO_KHR = 1000038006,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_INFO_KHR = 1000038007,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_RATE_CONTROL_INFO_KHR = 1000038008,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_RATE_CONTROL_LAYER_INFO_KHR = 1000038009,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_KHR = 1000038010,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_QUALITY_LEVEL_PROPERTIES_KHR = 1000038011,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_GET_INFO_KHR = 1000038012,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_FEEDBACK_INFO_KHR = 1000038013,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_KHR = 1000039000,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000039001,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR = 1000039002,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PICTURE_INFO_KHR = 1000039003,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_DPB_SLOT_INFO_KHR = 1000039004,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_NALU_SLICE_SEGMENT_INFO_KHR = 1000039005,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_GOP_REMAINING_FRAME_INFO_KHR = 1000039006,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_INFO_KHR = 1000039007,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_INFO_KHR = 1000039009,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_LAYER_INFO_KHR = 1000039010,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_KHR = 1000039011,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_QUALITY_LEVEL_PROPERTIES_KHR = 1000039012,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_GET_INFO_KHR = 1000039013,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_FEEDBACK_INFO_KHR = 1000039014,\n    VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR = 1000040000,\n    VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_KHR = 1000040001,\n    VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR = 1000040003,\n    VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000040004,\n    VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR = 1000040005,\n    VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR = 1000040006,\n    VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD = 1000041000,\n    VK_STRUCTURE_TYPE_STREAM_DESCRIPTOR_SURFACE_CREATE_INFO_GGP = 1000049000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV = 1000050000,\n    VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV = 1000056000,\n    VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV = 1000056001,\n    VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV = 1000057000,\n    VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV = 1000057001,\n    VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV = 1000058000,\n    VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT = 1000061000,\n    VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN = 1000062000,\n    VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT = 1000067000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT = 1000067001,\n    VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073000,\n    VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073001,\n    VK_STRUCTURE_TYPE_MEMORY_WIN32_HANDLE_PROPERTIES_KHR = 1000073002,\n    VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR = 1000073003,\n    VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR = 1000074000,\n    VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR = 1000074001,\n    VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR = 1000074002,\n    VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR = 1000075000,\n    VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR = 1000078000,\n    VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR = 1000078001,\n    VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR = 1000078002,\n    VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR = 1000078003,\n    VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR = 1000079000,\n    VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR = 1000079001,\n    VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT = 1000081000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT = 1000081001,\n    VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT = 1000081002,\n    VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR = 1000084000,\n    VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV = 1000087000,\n    VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT = 1000090000,\n    VK_STRUCTURE_TYPE_DISPLAY_POWER_INFO_EXT = 1000091000,\n    VK_STRUCTURE_TYPE_DEVICE_EVENT_INFO_EXT = 1000091001,\n    VK_STRUCTURE_TYPE_DISPLAY_EVENT_INFO_EXT = 1000091002,\n    VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT = 1000091003,\n    VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE = 1000092000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX = 1000097000,\n    VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX = 1000044009,\n    VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV = 1000098000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT = 1000099000,\n    VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT = 1000099001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT = 1000101000,\n    VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT = 1000101001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT = 1000102000,\n    VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT = 1000102001,\n    VK_STRUCTURE_TYPE_HDR_METADATA_EXT = 1000105000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG = 1000110000,\n    VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR = 1000111000,\n    VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114000,\n    VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114001,\n    VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR = 1000114002,\n    VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR = 1000115000,\n    VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR = 1000115001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR = 1000116000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR = 1000116001,\n    VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR = 1000116002,\n    VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR = 1000116003,\n    VK_STRUCTURE_TYPE_ACQUIRE_PROFILING_LOCK_INFO_KHR = 1000116004,\n    VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_KHR = 1000116005,\n    VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_DESCRIPTION_KHR = 1000116006,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR = 1000119000,\n    VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR = 1000119001,\n    VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR = 1000119002,\n    VK_STRUCTURE_TYPE_DISPLAY_PROPERTIES_2_KHR = 1000121000,\n    VK_STRUCTURE_TYPE_DISPLAY_PLANE_PROPERTIES_2_KHR = 1000121001,\n    VK_STRUCTURE_TYPE_DISPLAY_MODE_PROPERTIES_2_KHR = 1000121002,\n    VK_STRUCTURE_TYPE_DISPLAY_PLANE_INFO_2_KHR = 1000121003,\n    VK_STRUCTURE_TYPE_DISPLAY_PLANE_CAPABILITIES_2_KHR = 1000121004,\n    VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK = 1000122000,\n    VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK = 1000123000,\n    VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT = 1000128000,\n    VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT = 1000128001,\n    VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT = 1000128002,\n    VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT = 1000128003,\n    VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT = 1000128004,\n    VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID = 1000129000,\n    VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID = 1000129001,\n    VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID = 1000129002,\n    VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129003,\n    VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129004,\n    VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID = 1000129005,\n    VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID = 1000129006,\n#ifdef VK_ENABLE_BETA_EXTENSIONS\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ENQUEUE_FEATURES_AMDX = 1000134000,\n#endif\n#ifdef VK_ENABLE_BETA_EXTENSIONS\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ENQUEUE_PROPERTIES_AMDX = 1000134001,\n#endif\n#ifdef VK_ENABLE_BETA_EXTENSIONS\n    VK_STRUCTURE_TYPE_EXECUTION_GRAPH_PIPELINE_SCRATCH_SIZE_AMDX = 1000134002,\n#endif\n#ifdef VK_ENABLE_BETA_EXTENSIONS\n    VK_STRUCTURE_TYPE_EXECUTION_GRAPH_PIPELINE_CREATE_INFO_AMDX = 1000134003,\n#endif\n#ifdef VK_ENABLE_BETA_EXTENSIONS\n    VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_NODE_CREATE_INFO_AMDX = 1000134004,\n#endif\n    VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD = 1000044008,\n    VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT = 1000143000,\n    VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT = 1000143001,\n    VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT = 1000143002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT = 1000143003,\n    VK_STRUCTURE_TYPE_MULTISAMPLE_PROPERTIES_EXT = 1000143004,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT = 1000148000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT = 1000148001,\n    VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT = 1000148002,\n    VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV = 1000149000,\n    VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR = 1000150007,\n    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR = 1000150000,\n    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR = 1000150002,\n    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_AABBS_DATA_KHR = 1000150003,\n    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR = 1000150004,\n    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR = 1000150005,\n    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR = 1000150006,\n    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_VERSION_INFO_KHR = 1000150009,\n    VK_STRUCTURE_TYPE_COPY_ACCELERATION_STRUCTURE_INFO_KHR = 1000150010,\n    VK_STRUCTURE_TYPE_COPY_ACCELERATION_STRUCTURE_TO_MEMORY_INFO_KHR = 1000150011,\n    VK_STRUCTURE_TYPE_COPY_MEMORY_TO_ACCELERATION_STRUCTURE_INFO_KHR = 1000150012,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR = 1000150013,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR = 1000150014,\n    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR = 1000150017,\n    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR = 1000150020,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR = 1000347000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR = 1000347001,\n    VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR = 1000150015,\n    VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR = 1000150016,\n    VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_INTERFACE_CREATE_INFO_KHR = 1000150018,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR = 1000348013,\n    VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV = 1000152000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV = 1000154000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV = 1000154001,\n    VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT = 1000158000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT = 1000158002,\n    VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT = 1000158003,\n    VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT = 1000158004,\n    VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT = 1000158005,\n    VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT = 1000158006,\n    VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT = 1000160000,\n    VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT = 1000160001,\n#ifdef VK_ENABLE_BETA_EXTENSIONS\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR = 1000163000,\n#endif\n#ifdef VK_ENABLE_BETA_EXTENSIONS\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR = 1000163001,\n#endif\n    VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV = 1000164000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV = 1000164001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV = 1000164002,\n    VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV = 1000164005,\n    VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV = 1000165000,\n    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV = 1000165001,\n    VK_STRUCTURE_TYPE_GEOMETRY_NV = 1000165003,\n    VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV = 1000165004,\n    VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV = 1000165005,\n    VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_NV = 1000165006,\n    VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV = 1000165007,\n    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NV = 1000165008,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV = 1000165009,\n    VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV = 1000165011,\n    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV = 1000165012,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV = 1000166000,\n    VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV = 1000166001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT = 1000170000,\n    VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT = 1000170001,\n    VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT = 1000178000,\n    VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT = 1000178001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT = 1000178002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR = 1000181000,\n    VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD = 1000183000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD = 1000185000,\n    VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR = 1000187000,\n    VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000187001,\n    VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR = 1000187002,\n    VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR = 1000187003,\n    VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_KHR = 1000187004,\n    VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR = 1000187005,\n    VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD = 1000189000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT = 1000190000,\n    VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP = 1000191000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV = 1000202000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV = 1000202001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV = 1000204000,\n    VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV = 1000205000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV = 1000205002,\n    VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV = 1000206000,\n    VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV = 1000206001,\n    VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV = 1000314008,\n    VK_STRUCTURE_TYPE_CHECKPOINT_DATA_2_NV = 1000314009,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL = 1000209000,\n    VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL = 1000210000,\n    VK_STRUCTURE_TYPE_INITIALIZE_PERFORMANCE_API_INFO_INTEL = 1000210001,\n    VK_STRUCTURE_TYPE_PERFORMANCE_MARKER_INFO_INTEL = 1000210002,\n    VK_STRUCTURE_TYPE_PERFORMANCE_STREAM_MARKER_INFO_INTEL = 1000210003,\n    VK_STRUCTURE_TYPE_PERFORMANCE_OVERRIDE_INFO_INTEL = 1000210004,\n    VK_STRUCTURE_TYPE_PERFORMANCE_CONFIGURATION_ACQUIRE_INFO_INTEL = 1000210005,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT = 1000212000,\n    VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD = 1000213000,\n    VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD = 1000213001,\n    VK_STRUCTURE_TYPE_IMAGEPIPE_SURFACE_CREATE_INFO_FUCHSIA = 1000214000,\n    VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT = 1000217000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT = 1000218000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT = 1000218001,\n    VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT = 1000218002,\n    VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT = 1000044007,\n    VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR = 1000226000,\n    VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR = 1000226001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR = 1000226002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR = 1000226003,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_KHR = 1000226004,\n    VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR = 1000044006,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD = 1000227000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD = 1000229000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT = 1000234000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_QUAD_CONTROL_FEATURES_KHR = 1000235000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT = 1000237000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT = 1000238000,\n    VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT = 1000238001,\n    VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR = 1000239000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV = 1000240000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT = 1000244000,\n    VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT = 1000244002,\n    VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT = 1000247000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR = 1000248000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV = 1000249000,\n    VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_NV = 1000249001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV = 1000249002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV = 1000250000,\n    VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV = 1000250001,\n    VK_STRUCTURE_TYPE_FRAMEBUFFER_MIXED_SAMPLES_COMBINATION_NV = 1000250002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT = 1000251000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT = 1000252000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT = 1000254000,\n    VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT = 1000254001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT = 1000254002,\n    VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT = 1000255000,\n    VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT = 1000255002,\n    VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT = 1000255001,\n    VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT = 1000256000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT = 1000260000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT = 1000267000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR = 1000269000,\n    VK_STRUCTURE_TYPE_PIPELINE_INFO_KHR = 1000269001,\n    VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_PROPERTIES_KHR = 1000269002,\n    VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR = 1000269003,\n    VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR = 1000269004,\n    VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR = 1000269005,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_FEATURES_EXT = 1000272000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_PROPERTIES_EXT = 1000272001,\n    VK_STRUCTURE_TYPE_MEMORY_MAP_PLACED_INFO_EXT = 1000272002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT = 1000273000,\n    VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT = 1000274000,\n    VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_EXT = 1000274001,\n    VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_EXT = 1000274002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT = 1000275000,\n    VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT = 1000275001,\n    VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT = 1000275002,\n    VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT = 1000275003,\n    VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT = 1000275004,\n    VK_STRUCTURE_TYPE_RELEASE_SWAPCHAIN_IMAGES_INFO_EXT = 1000275005,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV = 1000277000,\n    VK_STRUCTURE_TYPE_GRAPHICS_SHADER_GROUP_CREATE_INFO_NV = 1000277001,\n    VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV = 1000277002,\n    VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_TOKEN_NV = 1000277003,\n    VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NV = 1000277004,\n    VK_STRUCTURE_TYPE_GENERATED_COMMANDS_INFO_NV = 1000277005,\n    VK_STRUCTURE_TYPE_GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_NV = 1000277006,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV = 1000277007,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV = 1000278000,\n    VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV = 1000278001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT = 1000281000,\n    VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM = 1000282000,\n    VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM = 1000282001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_BIAS_CONTROL_FEATURES_EXT = 1000283000,\n    VK_STRUCTURE_TYPE_DEPTH_BIAS_INFO_EXT = 1000283001,\n    VK_STRUCTURE_TYPE_DEPTH_BIAS_REPRESENTATION_INFO_EXT = 1000283002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT = 1000284000,\n    VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT = 1000284001,\n    VK_STRUCTURE_TYPE_DEVICE_MEMORY_REPORT_CALLBACK_DATA_EXT = 1000284002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT = 1000286000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT = 1000286001,\n    VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT = 1000287000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT = 1000287001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT = 1000287002,\n    VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR = 1000290000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_BARRIER_FEATURES_NV = 1000292000,\n    VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_PRESENT_BARRIER_NV = 1000292001,\n    VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_BARRIER_CREATE_INFO_NV = 1000292002,\n    VK_STRUCTURE_TYPE_PRESENT_ID_KHR = 1000294000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR = 1000294001,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_INFO_KHR = 1000299000,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR = 1000299001,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_LAYER_INFO_KHR = 1000299002,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR = 1000299003,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_USAGE_INFO_KHR = 1000299004,\n    VK_STRUCTURE_TYPE_QUERY_POOL_VIDEO_ENCODE_FEEDBACK_CREATE_INFO_KHR = 1000299005,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_QUALITY_LEVEL_INFO_KHR = 1000299006,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUALITY_LEVEL_PROPERTIES_KHR = 1000299007,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUALITY_LEVEL_INFO_KHR = 1000299008,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_PARAMETERS_GET_INFO_KHR = 1000299009,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_PARAMETERS_FEEDBACK_INFO_KHR = 1000299010,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV = 1000300000,\n    VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV = 1000300001,\n    VK_STRUCTURE_TYPE_CUDA_MODULE_CREATE_INFO_NV = 1000307000,\n    VK_STRUCTURE_TYPE_CUDA_FUNCTION_CREATE_INFO_NV = 1000307001,\n    VK_STRUCTURE_TYPE_CUDA_LAUNCH_INFO_NV = 1000307002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUDA_KERNEL_LAUNCH_FEATURES_NV = 1000307003,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUDA_KERNEL_LAUNCH_PROPERTIES_NV = 1000307004,\n    VK_STRUCTURE_TYPE_QUERY_LOW_LATENCY_SUPPORT_NV = 1000310000,\n    VK_STRUCTURE_TYPE_EXPORT_METAL_OBJECT_CREATE_INFO_EXT = 1000311000,\n    VK_STRUCTURE_TYPE_EXPORT_METAL_OBJECTS_INFO_EXT = 1000311001,\n    VK_STRUCTURE_TYPE_EXPORT_METAL_DEVICE_INFO_EXT = 1000311002,\n    VK_STRUCTURE_TYPE_EXPORT_METAL_COMMAND_QUEUE_INFO_EXT = 1000311003,\n    VK_STRUCTURE_TYPE_EXPORT_METAL_BUFFER_INFO_EXT = 1000311004,\n    VK_STRUCTURE_TYPE_IMPORT_METAL_BUFFER_INFO_EXT = 1000311005,\n    VK_STRUCTURE_TYPE_EXPORT_METAL_TEXTURE_INFO_EXT = 1000311006,\n    VK_STRUCTURE_TYPE_IMPORT_METAL_TEXTURE_INFO_EXT = 1000311007,\n    VK_STRUCTURE_TYPE_EXPORT_METAL_IO_SURFACE_INFO_EXT = 1000311008,\n    VK_STRUCTURE_TYPE_IMPORT_METAL_IO_SURFACE_INFO_EXT = 1000311009,\n    VK_STRUCTURE_TYPE_EXPORT_METAL_SHARED_EVENT_INFO_EXT = 1000311010,\n    VK_STRUCTURE_TYPE_IMPORT_METAL_SHARED_EVENT_INFO_EXT = 1000311011,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT = 1000316000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_DENSITY_MAP_PROPERTIES_EXT = 1000316001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT = 1000316002,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT = 1000316003,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT = 1000316004,\n    VK_STRUCTURE_TYPE_BUFFER_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316005,\n    VK_STRUCTURE_TYPE_IMAGE_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316006,\n    VK_STRUCTURE_TYPE_IMAGE_VIEW_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316007,\n    VK_STRUCTURE_TYPE_SAMPLER_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316008,\n    VK_STRUCTURE_TYPE_OPAQUE_CAPTURE_DESCRIPTOR_DATA_CREATE_INFO_EXT = 1000316010,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_BUFFER_BINDING_INFO_EXT = 1000316011,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_BUFFER_BINDING_PUSH_DESCRIPTOR_BUFFER_HANDLE_EXT = 1000316012,\n    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316009,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT = 1000320000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_PROPERTIES_EXT = 1000320001,\n    VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_LIBRARY_CREATE_INFO_EXT = 1000320002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_FEATURES_AMD = 1000321000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR = 1000203000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_PROPERTIES_KHR = 1000322000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR = 1000323000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV = 1000326000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV = 1000326001,\n    VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV = 1000326002,\n    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV = 1000327000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV = 1000327001,\n    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV = 1000327002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT = 1000328000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_EXT = 1000328001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT = 1000330000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT = 1000332000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT = 1000332001,\n    VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM = 1000333000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR = 1000336000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT = 1000338000,\n    VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_CONTROL_EXT = 1000338001,\n    VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_PROPERTIES_EXT = 1000338004,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT = 1000339000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT = 1000340000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_FEATURES_EXT = 1000341000,\n    VK_STRUCTURE_TYPE_DEVICE_FAULT_COUNTS_EXT = 1000341001,\n    VK_STRUCTURE_TYPE_DEVICE_FAULT_INFO_EXT = 1000341002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT = 1000344000,\n    VK_STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT = 1000346000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT = 1000352000,\n    VK_STRUCTURE_TYPE_VERTEX_INPUT_BINDING_DESCRIPTION_2_EXT = 1000352001,\n    VK_STRUCTURE_TYPE_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT = 1000352002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT = 1000353000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ADDRESS_BINDING_REPORT_FEATURES_EXT = 1000354000,\n    VK_STRUCTURE_TYPE_DEVICE_ADDRESS_BINDING_CALLBACK_DATA_EXT = 1000354001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT = 1000355000,\n    VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_DEPTH_CLIP_CONTROL_CREATE_INFO_EXT = 1000355001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT = 1000356000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_MODE_FIFO_LATEST_READY_FEATURES_EXT = 1000361000,\n    VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA = 1000364000,\n    VK_STRUCTURE_TYPE_MEMORY_ZIRCON_HANDLE_PROPERTIES_FUCHSIA = 1000364001,\n    VK_STRUCTURE_TYPE_MEMORY_GET_ZIRCON_HANDLE_INFO_FUCHSIA = 1000364002,\n    VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_ZIRCON_HANDLE_INFO_FUCHSIA = 1000365000,\n    VK_STRUCTURE_TYPE_SEMAPHORE_GET_ZIRCON_HANDLE_INFO_FUCHSIA = 1000365001,\n    VK_STRUCTURE_TYPE_BUFFER_COLLECTION_CREATE_INFO_FUCHSIA = 1000366000,\n    VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA = 1000366001,\n    VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA = 1000366002,\n    VK_STRUCTURE_TYPE_BUFFER_COLLECTION_PROPERTIES_FUCHSIA = 1000366003,\n    VK_STRUCTURE_TYPE_BUFFER_CONSTRAINTS_INFO_FUCHSIA = 1000366004,\n    VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA = 1000366005,\n    VK_STRUCTURE_TYPE_IMAGE_CONSTRAINTS_INFO_FUCHSIA = 1000366006,\n    VK_STRUCTURE_TYPE_IMAGE_FORMAT_CONSTRAINTS_INFO_FUCHSIA = 1000366007,\n    VK_STRUCTURE_TYPE_SYSMEM_COLOR_SPACE_FUCHSIA = 1000366008,\n    VK_STRUCTURE_TYPE_BUFFER_COLLECTION_CONSTRAINTS_INFO_FUCHSIA = 1000366009,\n    VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI = 1000369000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI = 1000369001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI = 1000369002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI = 1000370000,\n    VK_STRUCTURE_TYPE_MEMORY_GET_REMOTE_ADDRESS_INFO_NV = 1000371000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV = 1000371001,\n    VK_STRUCTURE_TYPE_PIPELINE_PROPERTIES_IDENTIFIER_EXT = 1000372000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROPERTIES_FEATURES_EXT = 1000372001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAME_BOUNDARY_FEATURES_EXT = 1000375000,\n    VK_STRUCTURE_TYPE_FRAME_BOUNDARY_EXT = 1000375001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT = 1000376000,\n    VK_STRUCTURE_TYPE_SUBPASS_RESOLVE_PERFORMANCE_QUERY_EXT = 1000376001,\n    VK_STRUCTURE_TYPE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_INFO_EXT = 1000376002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT = 1000377000,\n    VK_STRUCTURE_TYPE_SCREEN_SURFACE_CREATE_INFO_QNX = 1000378000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT = 1000381000,\n    VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT = 1000381001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT = 1000382000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR = 1000386000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT = 1000391000,\n    VK_STRUCTURE_TYPE_IMAGE_VIEW_MIN_LOD_CREATE_INFO_EXT = 1000391001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT = 1000392000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT = 1000392001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT = 1000393000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TILE_IMAGE_FEATURES_EXT = 1000395000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TILE_IMAGE_PROPERTIES_EXT = 1000395001,\n    VK_STRUCTURE_TYPE_MICROMAP_BUILD_INFO_EXT = 1000396000,\n    VK_STRUCTURE_TYPE_MICROMAP_VERSION_INFO_EXT = 1000396001,\n    VK_STRUCTURE_TYPE_COPY_MICROMAP_INFO_EXT = 1000396002,\n    VK_STRUCTURE_TYPE_COPY_MICROMAP_TO_MEMORY_INFO_EXT = 1000396003,\n    VK_STRUCTURE_TYPE_COPY_MEMORY_TO_MICROMAP_INFO_EXT = 1000396004,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_EXT = 1000396005,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_PROPERTIES_EXT = 1000396006,\n    VK_STRUCTURE_TYPE_MICROMAP_CREATE_INFO_EXT = 1000396007,\n    VK_STRUCTURE_TYPE_MICROMAP_BUILD_SIZES_INFO_EXT = 1000396008,\n    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_TRIANGLES_OPACITY_MICROMAP_EXT = 1000396009,\n#ifdef VK_ENABLE_BETA_EXTENSIONS\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISPLACEMENT_MICROMAP_FEATURES_NV = 1000397000,\n#endif\n#ifdef VK_ENABLE_BETA_EXTENSIONS\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISPLACEMENT_MICROMAP_PROPERTIES_NV = 1000397001,\n#endif\n#ifdef VK_ENABLE_BETA_EXTENSIONS\n    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_TRIANGLES_DISPLACEMENT_MICROMAP_NV = 1000397002,\n#endif\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_FEATURES_HUAWEI = 1000404000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_PROPERTIES_HUAWEI = 1000404001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_VRS_FEATURES_HUAWEI = 1000404002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT = 1000411000,\n    VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT = 1000411001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT = 1000412000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_ARM = 1000415000,\n    VK_STRUCTURE_TYPE_DEVICE_QUEUE_SHADER_CORE_CONTROL_CREATE_INFO_ARM = 1000417000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_FEATURES_ARM = 1000417001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_PROPERTIES_ARM = 1000417002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_SLICED_VIEW_OF_3D_FEATURES_EXT = 1000418000,\n    VK_STRUCTURE_TYPE_IMAGE_VIEW_SLICED_CREATE_INFO_EXT = 1000418001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_SET_HOST_MAPPING_FEATURES_VALVE = 1000420000,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_BINDING_REFERENCE_VALVE = 1000420001,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_HOST_MAPPING_INFO_VALVE = 1000420002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT = 1000422000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RENDER_PASS_STRIPED_FEATURES_ARM = 1000424000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RENDER_PASS_STRIPED_PROPERTIES_ARM = 1000424001,\n    VK_STRUCTURE_TYPE_RENDER_PASS_STRIPE_BEGIN_INFO_ARM = 1000424002,\n    VK_STRUCTURE_TYPE_RENDER_PASS_STRIPE_INFO_ARM = 1000424003,\n    VK_STRUCTURE_TYPE_RENDER_PASS_STRIPE_SUBMIT_INFO_ARM = 1000424004,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_QCOM = 1000425000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_PROPERTIES_QCOM = 1000425001,\n    VK_STRUCTURE_TYPE_SUBPASS_FRAGMENT_DENSITY_MAP_OFFSET_END_INFO_QCOM = 1000425002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_FEATURES_NV = 1000426000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_PROPERTIES_NV = 1000426001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_NV = 1000427000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_PROPERTIES_NV = 1000427001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_COMPUTE_FEATURES_NV = 1000428000,\n    VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_INDIRECT_BUFFER_INFO_NV = 1000428001,\n    VK_STRUCTURE_TYPE_PIPELINE_INDIRECT_DEVICE_ADDRESS_INFO_NV = 1000428002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_LINEAR_SWEPT_SPHERES_FEATURES_NV = 1000429008,\n    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_LINEAR_SWEPT_SPHERES_DATA_NV = 1000429009,\n    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_SPHERES_DATA_NV = 1000429010,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINEAR_COLOR_ATTACHMENT_FEATURES_NV = 1000430000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MAXIMAL_RECONVERGENCE_FEATURES_KHR = 1000434000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT = 1000437000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_FEATURES_QCOM = 1000440000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_PROPERTIES_QCOM = 1000440001,\n    VK_STRUCTURE_TYPE_IMAGE_VIEW_SAMPLE_WEIGHT_CREATE_INFO_QCOM = 1000440002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_FEATURES_EXT = 1000451000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_PROPERTIES_EXT = 1000451001,\n    VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_ACQUIRE_UNMODIFIED_EXT = 1000453000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT = 1000455000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_PROPERTIES_EXT = 1000455001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT = 1000458000,\n    VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_CONTROL_EXT = 1000458001,\n    VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_FEEDBACK_CREATE_INFO_EXT = 1000458002,\n    VK_STRUCTURE_TYPE_RENDER_PASS_SUBPASS_FEEDBACK_CREATE_INFO_EXT = 1000458003,\n    VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_INFO_LUNARG = 1000459000,\n    VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_LIST_LUNARG = 1000459001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT = 1000462000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_PROPERTIES_EXT = 1000462001,\n    VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_MODULE_IDENTIFIER_CREATE_INFO_EXT = 1000462002,\n    VK_STRUCTURE_TYPE_SHADER_MODULE_IDENTIFIER_EXT = 1000462003,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT = 1000342000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_FEATURES_NV = 1000464000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_PROPERTIES_NV = 1000464001,\n    VK_STRUCTURE_TYPE_OPTICAL_FLOW_IMAGE_FORMAT_INFO_NV = 1000464002,\n    VK_STRUCTURE_TYPE_OPTICAL_FLOW_IMAGE_FORMAT_PROPERTIES_NV = 1000464003,\n    VK_STRUCTURE_TYPE_OPTICAL_FLOW_SESSION_CREATE_INFO_NV = 1000464004,\n    VK_STRUCTURE_TYPE_OPTICAL_FLOW_EXECUTE_INFO_NV = 1000464005,\n    VK_STRUCTURE_TYPE_OPTICAL_FLOW_SESSION_CREATE_PRIVATE_DATA_INFO_NV = 1000464010,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_DITHERING_FEATURES_EXT = 1000465000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FORMAT_RESOLVE_FEATURES_ANDROID = 1000468000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FORMAT_RESOLVE_PROPERTIES_ANDROID = 1000468001,\n    VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_RESOLVE_PROPERTIES_ANDROID = 1000468002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ANTI_LAG_FEATURES_AMD = 1000476000,\n    VK_STRUCTURE_TYPE_ANTI_LAG_DATA_AMD = 1000476001,\n    VK_STRUCTURE_TYPE_ANTI_LAG_PRESENTATION_INFO_AMD = 1000476002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_POSITION_FETCH_FEATURES_KHR = 1000481000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT = 1000482000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_PROPERTIES_EXT = 1000482001,\n    VK_STRUCTURE_TYPE_SHADER_CREATE_INFO_EXT = 1000482002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_BINARY_FEATURES_KHR = 1000483000,\n    VK_STRUCTURE_TYPE_PIPELINE_BINARY_CREATE_INFO_KHR = 1000483001,\n    VK_STRUCTURE_TYPE_PIPELINE_BINARY_INFO_KHR = 1000483002,\n    VK_STRUCTURE_TYPE_PIPELINE_BINARY_KEY_KHR = 1000483003,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_BINARY_PROPERTIES_KHR = 1000483004,\n    VK_STRUCTURE_TYPE_RELEASE_CAPTURED_PIPELINE_DATA_INFO_KHR = 1000483005,\n    VK_STRUCTURE_TYPE_PIPELINE_BINARY_DATA_INFO_KHR = 1000483006,\n    VK_STRUCTURE_TYPE_PIPELINE_CREATE_INFO_KHR = 1000483007,\n    VK_STRUCTURE_TYPE_DEVICE_PIPELINE_BINARY_INTERNAL_CACHE_CONTROL_KHR = 1000483008,\n    VK_STRUCTURE_TYPE_PIPELINE_BINARY_HANDLES_INFO_KHR = 1000483009,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_PROPERTIES_FEATURES_QCOM = 1000484000,\n    VK_STRUCTURE_TYPE_TILE_PROPERTIES_QCOM = 1000484001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC = 1000485000,\n    VK_STRUCTURE_TYPE_AMIGO_PROFILING_SUBMIT_INFO_SEC = 1000485001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_VIEWPORTS_FEATURES_QCOM = 1000488000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV = 1000490000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV = 1000490001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_VECTOR_FEATURES_NV = 1000491000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_VECTOR_PROPERTIES_NV = 1000491001,\n    VK_STRUCTURE_TYPE_COOPERATIVE_VECTOR_PROPERTIES_NV = 1000491002,\n    VK_STRUCTURE_TYPE_CONVERT_COOPERATIVE_VECTOR_MATRIX_INFO_NV = 1000491004,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_SPARSE_ADDRESS_SPACE_FEATURES_NV = 1000492000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_SPARSE_ADDRESS_SPACE_PROPERTIES_NV = 1000492001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT = 1000351000,\n    VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT = 1000351002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_VERTEX_ATTRIBUTES_FEATURES_EXT = 1000495000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_VERTEX_ATTRIBUTES_PROPERTIES_EXT = 1000495001,\n    VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT = 1000496000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_FEATURES_ARM = 1000497000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_PROPERTIES_ARM = 1000497001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_LIBRARY_GROUP_HANDLES_FEATURES_EXT = 1000498000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_FEATURES_EXT = 1000499000,\n    VK_STRUCTURE_TYPE_LATENCY_SLEEP_MODE_INFO_NV = 1000505000,\n    VK_STRUCTURE_TYPE_LATENCY_SLEEP_INFO_NV = 1000505001,\n    VK_STRUCTURE_TYPE_SET_LATENCY_MARKER_INFO_NV = 1000505002,\n    VK_STRUCTURE_TYPE_GET_LATENCY_MARKER_INFO_NV = 1000505003,\n    VK_STRUCTURE_TYPE_LATENCY_TIMINGS_FRAME_REPORT_NV = 1000505004,\n    VK_STRUCTURE_TYPE_LATENCY_SUBMISSION_PRESENT_ID_NV = 1000505005,\n    VK_STRUCTURE_TYPE_OUT_OF_BAND_QUEUE_TYPE_INFO_NV = 1000505006,\n    VK_STRUCTURE_TYPE_SWAPCHAIN_LATENCY_CREATE_INFO_NV = 1000505007,\n    VK_STRUCTURE_TYPE_LATENCY_SURFACE_CAPABILITIES_NV = 1000505008,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR = 1000506000,\n    VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_KHR = 1000506001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_KHR = 1000506002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_RENDER_AREAS_FEATURES_QCOM = 1000510000,\n    VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_RENDER_AREAS_RENDER_PASS_BEGIN_INFO_QCOM = 1000510001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_KHR = 1000201000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_PROPERTIES_KHR = 1000511000,\n    VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_CAPABILITIES_KHR = 1000512000,\n    VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PICTURE_INFO_KHR = 1000512001,\n    VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PROFILE_INFO_KHR = 1000512003,\n    VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000512004,\n    VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_DPB_SLOT_INFO_KHR = 1000512005,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_CAPABILITIES_KHR = 1000513000,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000513001,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PICTURE_INFO_KHR = 1000513002,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_DPB_SLOT_INFO_KHR = 1000513003,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_AV1_FEATURES_KHR = 1000513004,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PROFILE_INFO_KHR = 1000513005,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_RATE_CONTROL_INFO_KHR = 1000513006,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_RATE_CONTROL_LAYER_INFO_KHR = 1000513007,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_QUALITY_LEVEL_PROPERTIES_KHR = 1000513008,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_SESSION_CREATE_INFO_KHR = 1000513009,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_GOP_REMAINING_FRAME_INFO_KHR = 1000513010,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR = 1000515000,\n    VK_STRUCTURE_TYPE_VIDEO_INLINE_QUERY_INFO_KHR = 1000515001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PER_STAGE_DESCRIPTOR_SET_FEATURES_NV = 1000516000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_2_FEATURES_QCOM = 1000518000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_2_PROPERTIES_QCOM = 1000518001,\n    VK_STRUCTURE_TYPE_SAMPLER_BLOCK_MATCH_WINDOW_CREATE_INFO_QCOM = 1000518002,\n    VK_STRUCTURE_TYPE_SAMPLER_CUBIC_WEIGHTS_CREATE_INFO_QCOM = 1000519000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUBIC_WEIGHTS_FEATURES_QCOM = 1000519001,\n    VK_STRUCTURE_TYPE_BLIT_IMAGE_CUBIC_WEIGHTS_INFO_QCOM = 1000519002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_DEGAMMA_FEATURES_QCOM = 1000520000,\n    VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_YCBCR_DEGAMMA_CREATE_INFO_QCOM = 1000520001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUBIC_CLAMP_FEATURES_QCOM = 1000521000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_FEATURES_EXT = 1000524000,\n    VK_STRUCTURE_TYPE_SCREEN_BUFFER_PROPERTIES_QNX = 1000529000,\n    VK_STRUCTURE_TYPE_SCREEN_BUFFER_FORMAT_PROPERTIES_QNX = 1000529001,\n    VK_STRUCTURE_TYPE_IMPORT_SCREEN_BUFFER_INFO_QNX = 1000529002,\n    VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_QNX = 1000529003,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_SCREEN_BUFFER_FEATURES_QNX = 1000529004,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LAYERED_DRIVER_PROPERTIES_MSFT = 1000530000,\n    VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_KHR = 1000184000,\n    VK_STRUCTURE_TYPE_SET_DESCRIPTOR_BUFFER_OFFSETS_INFO_EXT = 1000545007,\n    VK_STRUCTURE_TYPE_BIND_DESCRIPTOR_BUFFER_EMBEDDED_SAMPLERS_INFO_EXT = 1000545008,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_POOL_OVERALLOCATION_FEATURES_NV = 1000546000,\n    VK_STRUCTURE_TYPE_DISPLAY_SURFACE_STEREO_CREATE_INFO_NV = 1000551000,\n    VK_STRUCTURE_TYPE_DISPLAY_MODE_STEREO_PROPERTIES_NV = 1000551001,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUANTIZATION_MAP_CAPABILITIES_KHR = 1000553000,\n    VK_STRUCTURE_TYPE_VIDEO_FORMAT_QUANTIZATION_MAP_PROPERTIES_KHR = 1000553001,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUANTIZATION_MAP_INFO_KHR = 1000553002,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUANTIZATION_MAP_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000553005,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_QUANTIZATION_MAP_FEATURES_KHR = 1000553009,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_QUANTIZATION_MAP_CAPABILITIES_KHR = 1000553003,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_QUANTIZATION_MAP_CAPABILITIES_KHR = 1000553004,\n    VK_STRUCTURE_TYPE_VIDEO_FORMAT_H265_QUANTIZATION_MAP_PROPERTIES_KHR = 1000553006,\n    VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_QUANTIZATION_MAP_CAPABILITIES_KHR = 1000553007,\n    VK_STRUCTURE_TYPE_VIDEO_FORMAT_AV1_QUANTIZATION_MAP_PROPERTIES_KHR = 1000553008,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAW_ACCESS_CHAINS_FEATURES_NV = 1000555000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR = 1000558000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMMAND_BUFFER_INHERITANCE_FEATURES_NV = 1000559000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_7_FEATURES_KHR = 1000562000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_7_PROPERTIES_KHR = 1000562001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LAYERED_API_PROPERTIES_LIST_KHR = 1000562002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LAYERED_API_PROPERTIES_KHR = 1000562003,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LAYERED_API_VULKAN_PROPERTIES_KHR = 1000562004,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT16_VECTOR_FEATURES_NV = 1000563000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_REPLICATED_COMPOSITES_FEATURES_EXT = 1000564000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_VALIDATION_FEATURES_NV = 1000568000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_ACCELERATION_STRUCTURE_FEATURES_NV = 1000569000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_ACCELERATION_STRUCTURE_PROPERTIES_NV = 1000569001,\n    VK_STRUCTURE_TYPE_CLUSTER_ACCELERATION_STRUCTURE_CLUSTERS_BOTTOM_LEVEL_INPUT_NV = 1000569002,\n    VK_STRUCTURE_TYPE_CLUSTER_ACCELERATION_STRUCTURE_TRIANGLE_CLUSTER_INPUT_NV = 1000569003,\n    VK_STRUCTURE_TYPE_CLUSTER_ACCELERATION_STRUCTURE_MOVE_OBJECTS_INPUT_NV = 1000569004,\n    VK_STRUCTURE_TYPE_CLUSTER_ACCELERATION_STRUCTURE_INPUT_INFO_NV = 1000569005,\n    VK_STRUCTURE_TYPE_CLUSTER_ACCELERATION_STRUCTURE_COMMANDS_INFO_NV = 1000569006,\n    VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CLUSTER_ACCELERATION_STRUCTURE_CREATE_INFO_NV = 1000569007,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PARTITIONED_ACCELERATION_STRUCTURE_FEATURES_NV = 1000570000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PARTITIONED_ACCELERATION_STRUCTURE_PROPERTIES_NV = 1000570001,\n    VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_PARTITIONED_ACCELERATION_STRUCTURE_NV = 1000570002,\n    VK_STRUCTURE_TYPE_PARTITIONED_ACCELERATION_STRUCTURE_INSTANCES_INPUT_NV = 1000570003,\n    VK_STRUCTURE_TYPE_BUILD_PARTITIONED_ACCELERATION_STRUCTURE_INFO_NV = 1000570004,\n    VK_STRUCTURE_TYPE_PARTITIONED_ACCELERATION_STRUCTURE_FLAGS_NV = 1000570005,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_EXT = 1000572000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_EXT = 1000572001,\n    VK_STRUCTURE_TYPE_GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_EXT = 1000572002,\n    VK_STRUCTURE_TYPE_INDIRECT_EXECUTION_SET_CREATE_INFO_EXT = 1000572003,\n    VK_STRUCTURE_TYPE_GENERATED_COMMANDS_INFO_EXT = 1000572004,\n    VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_EXT = 1000572006,\n    VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_TOKEN_EXT = 1000572007,\n    VK_STRUCTURE_TYPE_WRITE_INDIRECT_EXECUTION_SET_PIPELINE_EXT = 1000572008,\n    VK_STRUCTURE_TYPE_WRITE_INDIRECT_EXECUTION_SET_SHADER_EXT = 1000572009,\n    VK_STRUCTURE_TYPE_INDIRECT_EXECUTION_SET_PIPELINE_INFO_EXT = 1000572010,\n    VK_STRUCTURE_TYPE_INDIRECT_EXECUTION_SET_SHADER_INFO_EXT = 1000572011,\n    VK_STRUCTURE_TYPE_INDIRECT_EXECUTION_SET_SHADER_LAYOUT_INFO_EXT = 1000572012,\n    VK_STRUCTURE_TYPE_GENERATED_COMMANDS_PIPELINE_INFO_EXT = 1000572013,\n    VK_STRUCTURE_TYPE_GENERATED_COMMANDS_SHADER_INFO_EXT = 1000572014,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_8_FEATURES_KHR = 1000574000,\n    VK_STRUCTURE_TYPE_MEMORY_BARRIER_ACCESS_FLAGS_3_KHR = 1000574002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ALIGNMENT_CONTROL_FEATURES_MESA = 1000575000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ALIGNMENT_CONTROL_PROPERTIES_MESA = 1000575001,\n    VK_STRUCTURE_TYPE_IMAGE_ALIGNMENT_CONTROL_CREATE_INFO_MESA = 1000575002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_CONTROL_FEATURES_EXT = 1000582000,\n    VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_DEPTH_CLAMP_CONTROL_CREATE_INFO_EXT = 1000582001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_2_FEATURES_KHR = 1000586000,\n    VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_INLINE_SESSION_PARAMETERS_INFO_KHR = 1000586001,\n    VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_INLINE_SESSION_PARAMETERS_INFO_KHR = 1000586002,\n    VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_INLINE_SESSION_PARAMETERS_INFO_KHR = 1000586003,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HDR_VIVID_FEATURES_HUAWEI = 1000590000,\n    VK_STRUCTURE_TYPE_HDR_VIVID_DYNAMIC_METADATA_HUAWEI = 1000590001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_2_FEATURES_NV = 1000593000,\n    VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_FLEXIBLE_DIMENSIONS_PROPERTIES_NV = 1000593001,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_2_PROPERTIES_NV = 1000593002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_OPACITY_MICROMAP_FEATURES_ARM = 1000596000,\n    VK_STRUCTURE_TYPE_IMPORT_MEMORY_METAL_HANDLE_INFO_EXT = 1000602000,\n    VK_STRUCTURE_TYPE_MEMORY_METAL_HANDLE_PROPERTIES_EXT = 1000602001,\n    VK_STRUCTURE_TYPE_MEMORY_GET_METAL_HANDLE_INFO_EXT = 1000602002,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_KHR = 1000421000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_ROBUSTNESS_FEATURES_EXT = 1000608000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES,\n  // VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT is a deprecated alias\n    VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT,\n    VK_STRUCTURE_TYPE_RENDERING_INFO_KHR = VK_STRUCTURE_TYPE_RENDERING_INFO,\n    VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO,\n    VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES,\n    VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO,\n    VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2,\n    VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2,\n    VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2_KHR = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2,\n    VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2_KHR = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2,\n    VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2_KHR = VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2,\n    VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHR = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO,\n    VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO,\n    VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO,\n    VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO,\n    VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO,\n    VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO_KHR = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO,\n    VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO_KHR = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES,\n    VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES,\n    VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO,\n    VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES_KHR = VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO,\n    VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES_KHR = VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES,\n    VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO,\n    VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO,\n    VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO,\n    VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES,\n    VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO,\n  // VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES2_EXT is a deprecated alias\n    VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES2_EXT = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES,\n    VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO,\n    VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO,\n    VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO_KHR = VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO,\n    VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2,\n    VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,\n    VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2,\n    VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2,\n    VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2,\n    VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO_KHR = VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO,\n    VK_STRUCTURE_TYPE_SUBPASS_END_INFO_KHR = VK_STRUCTURE_TYPE_SUBPASS_END_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO,\n    VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES,\n    VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES,\n    VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO,\n    VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO,\n    VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES_KHR,\n    VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS,\n    VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES,\n    VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES,\n    VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO,\n    VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR = VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2,\n    VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2,\n    VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2_KHR = VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2,\n    VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2,\n    VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2_KHR = VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2,\n    VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO,\n    VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_NV = VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD,\n    VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,\n    VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO_KHR = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO,\n    VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO_KHR = VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO,\n    VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO_KHR = VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES,\n    VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES_KHR = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES,\n    VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO,\n    VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT_KHR = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT,\n    VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES,\n    VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT = VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_KHR,\n    VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES,\n    VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_KHR = VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES,\n    VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES,\n    VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES,\n    VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE_KHR = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_KHR,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES,\n    VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO,\n    VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO,\n    VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO_KHR = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO,\n    VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO_KHR = VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO,\n  // VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL is a deprecated alias\n    VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL = VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES,\n    VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES,\n    VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_LOCATION_INFO_KHR = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_LOCATION_INFO,\n    VK_STRUCTURE_TYPE_RENDERING_INPUT_ATTACHMENT_INDEX_INFO_KHR = VK_STRUCTURE_TYPE_RENDERING_INPUT_ATTACHMENT_INDEX_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES,\n    VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT_KHR = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT,\n    VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT_KHR = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT,\n    VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES,\n    VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES,\n    VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_KHR = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,\n    VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO,\n    VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO_KHR = VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO,\n    VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES,\n    VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES,\n    VK_STRUCTURE_TYPE_MEMORY_TO_IMAGE_COPY_EXT = VK_STRUCTURE_TYPE_MEMORY_TO_IMAGE_COPY,\n    VK_STRUCTURE_TYPE_IMAGE_TO_MEMORY_COPY_EXT = VK_STRUCTURE_TYPE_IMAGE_TO_MEMORY_COPY,\n    VK_STRUCTURE_TYPE_COPY_IMAGE_TO_MEMORY_INFO_EXT = VK_STRUCTURE_TYPE_COPY_IMAGE_TO_MEMORY_INFO,\n    VK_STRUCTURE_TYPE_COPY_MEMORY_TO_IMAGE_INFO_EXT = VK_STRUCTURE_TYPE_COPY_MEMORY_TO_IMAGE_INFO,\n    VK_STRUCTURE_TYPE_HOST_IMAGE_LAYOUT_TRANSITION_INFO_EXT = VK_STRUCTURE_TYPE_HOST_IMAGE_LAYOUT_TRANSITION_INFO,\n    VK_STRUCTURE_TYPE_COPY_IMAGE_TO_IMAGE_INFO_EXT = VK_STRUCTURE_TYPE_COPY_IMAGE_TO_IMAGE_INFO,\n    VK_STRUCTURE_TYPE_SUBRESOURCE_HOST_MEMCPY_SIZE_EXT = VK_STRUCTURE_TYPE_SUBRESOURCE_HOST_MEMCPY_SIZE,\n    VK_STRUCTURE_TYPE_HOST_IMAGE_COPY_DEVICE_PERFORMANCE_QUERY_EXT = VK_STRUCTURE_TYPE_HOST_IMAGE_COPY_DEVICE_PERFORMANCE_QUERY,\n    VK_STRUCTURE_TYPE_MEMORY_MAP_INFO_KHR = VK_STRUCTURE_TYPE_MEMORY_MAP_INFO,\n    VK_STRUCTURE_TYPE_MEMORY_UNMAP_INFO_KHR = VK_STRUCTURE_TYPE_MEMORY_UNMAP_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES,\n    VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO,\n    VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES,\n    VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2,\n    VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2_KHR = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,\n    VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2_KHR = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2,\n    VK_STRUCTURE_TYPE_DEPENDENCY_INFO_KHR = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,\n    VK_STRUCTURE_TYPE_SUBMIT_INFO_2_KHR = VK_STRUCTURE_TYPE_SUBMIT_INFO_2,\n    VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO_KHR = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,\n    VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO_KHR = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES,\n    VK_STRUCTURE_TYPE_COPY_BUFFER_INFO_2_KHR = VK_STRUCTURE_TYPE_COPY_BUFFER_INFO_2,\n    VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR = VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2,\n    VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2_KHR = VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2,\n    VK_STRUCTURE_TYPE_COPY_IMAGE_TO_BUFFER_INFO_2_KHR = VK_STRUCTURE_TYPE_COPY_IMAGE_TO_BUFFER_INFO_2,\n    VK_STRUCTURE_TYPE_BLIT_IMAGE_INFO_2_KHR = VK_STRUCTURE_TYPE_BLIT_IMAGE_INFO_2,\n    VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR = VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2,\n    VK_STRUCTURE_TYPE_BUFFER_COPY_2_KHR = VK_STRUCTURE_TYPE_BUFFER_COPY_2,\n    VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR = VK_STRUCTURE_TYPE_IMAGE_COPY_2,\n    VK_STRUCTURE_TYPE_IMAGE_BLIT_2_KHR = VK_STRUCTURE_TYPE_IMAGE_BLIT_2,\n    VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR = VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2,\n    VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR = VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2,\n    VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2_EXT = VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2,\n    VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2_EXT = VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_ARM = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT,\n    VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE = VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT,\n    VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3,\n    VK_STRUCTURE_TYPE_PIPELINE_INFO_EXT = VK_STRUCTURE_TYPE_PIPELINE_INFO_KHR,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES,\n    VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT = VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES,\n    VK_STRUCTURE_TYPE_DEVICE_BUFFER_MEMORY_REQUIREMENTS_KHR = VK_STRUCTURE_TYPE_DEVICE_BUFFER_MEMORY_REQUIREMENTS,\n    VK_STRUCTURE_TYPE_DEVICE_IMAGE_MEMORY_REQUIREMENTS_KHR = VK_STRUCTURE_TYPE_DEVICE_IMAGE_MEMORY_REQUIREMENTS,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_KHR,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES,\n    VK_STRUCTURE_TYPE_RENDERING_AREA_INFO_KHR = VK_STRUCTURE_TYPE_RENDERING_AREA_INFO,\n    VK_STRUCTURE_TYPE_DEVICE_IMAGE_SUBRESOURCE_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_IMAGE_SUBRESOURCE_INFO,\n    VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2_KHR = VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2,\n    VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2_KHR = VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2,\n    VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO,\n    VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO,\n    VK_STRUCTURE_TYPE_SHADER_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES,\n    VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES,\n    VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_PROPERTIES,\n    VK_STRUCTURE_TYPE_BIND_MEMORY_STATUS_KHR = VK_STRUCTURE_TYPE_BIND_MEMORY_STATUS,\n    VK_STRUCTURE_TYPE_BIND_DESCRIPTOR_SETS_INFO_KHR = VK_STRUCTURE_TYPE_BIND_DESCRIPTOR_SETS_INFO,\n    VK_STRUCTURE_TYPE_PUSH_CONSTANTS_INFO_KHR = VK_STRUCTURE_TYPE_PUSH_CONSTANTS_INFO,\n    VK_STRUCTURE_TYPE_PUSH_DESCRIPTOR_SET_INFO_KHR = VK_STRUCTURE_TYPE_PUSH_DESCRIPTOR_SET_INFO,\n    VK_STRUCTURE_TYPE_PUSH_DESCRIPTOR_SET_WITH_TEMPLATE_INFO_KHR = VK_STRUCTURE_TYPE_PUSH_DESCRIPTOR_SET_WITH_TEMPLATE_INFO,\n    VK_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF\n} VkStructureType;\n\ntypedef enum VkPipelineCacheHeaderVersion {\n    VK_PIPELINE_CACHE_HEADER_VERSION_ONE = 1,\n    VK_PIPELINE_CACHE_HEADER_VERSION_MAX_ENUM = 0x7FFFFFFF\n} VkPipelineCacheHeaderVersion;\n\ntypedef enum VkImageLayout {\n    VK_IMAGE_LAYOUT_UNDEFINED = 0,\n    VK_IMAGE_LAYOUT_GENERAL = 1,\n    VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL = 2,\n    VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL = 3,\n    VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL = 4,\n    VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL = 5,\n    VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL = 6,\n    VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL = 7,\n    VK_IMAGE_LAYOUT_PREINITIALIZED = 8,\n    VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL = 1000117000,\n    VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL = 1000117001,\n    VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL = 1000241000,\n    VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL = 1000241001,\n    VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL = 1000241002,\n    VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL = 1000241003,\n    VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL = 1000314000,\n    VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL = 1000314001,\n    VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ = 1000232000,\n    VK_IMAGE_LAYOUT_PRESENT_SRC_KHR = 1000001002,\n    VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR = 1000024000,\n    VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR = 1000024001,\n    VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR = 1000024002,\n    VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR = 1000111000,\n    VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT = 1000218000,\n    VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR = 1000164003,\n    VK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR = 1000299000,\n    VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR = 1000299001,\n    VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR = 1000299002,\n    VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT = 1000339000,\n    VK_IMAGE_LAYOUT_VIDEO_ENCODE_QUANTIZATION_MAP_KHR = 1000553000,\n    VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL,\n    VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL,\n    VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV = VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR,\n    VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR = VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ,\n    VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,\n    VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,\n    VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL,\n    VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,\n    VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL,\n    VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL,\n    VK_IMAGE_LAYOUT_MAX_ENUM = 0x7FFFFFFF\n} VkImageLayout;\n\ntypedef enum VkObjectType {\n    VK_OBJECT_TYPE_UNKNOWN = 0,\n    VK_OBJECT_TYPE_INSTANCE = 1,\n    VK_OBJECT_TYPE_PHYSICAL_DEVICE = 2,\n    VK_OBJECT_TYPE_DEVICE = 3,\n    VK_OBJECT_TYPE_QUEUE = 4,\n    VK_OBJECT_TYPE_SEMAPHORE = 5,\n    VK_OBJECT_TYPE_COMMAND_BUFFER = 6,\n    VK_OBJECT_TYPE_FENCE = 7,\n    VK_OBJECT_TYPE_DEVICE_MEMORY = 8,\n    VK_OBJECT_TYPE_BUFFER = 9,\n    VK_OBJECT_TYPE_IMAGE = 10,\n    VK_OBJECT_TYPE_EVENT = 11,\n    VK_OBJECT_TYPE_QUERY_POOL = 12,\n    VK_OBJECT_TYPE_BUFFER_VIEW = 13,\n    VK_OBJECT_TYPE_IMAGE_VIEW = 14,\n    VK_OBJECT_TYPE_SHADER_MODULE = 15,\n    VK_OBJECT_TYPE_PIPELINE_CACHE = 16,\n    VK_OBJECT_TYPE_PIPELINE_LAYOUT = 17,\n    VK_OBJECT_TYPE_RENDER_PASS = 18,\n    VK_OBJECT_TYPE_PIPELINE = 19,\n    VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT = 20,\n    VK_OBJECT_TYPE_SAMPLER = 21,\n    VK_OBJECT_TYPE_DESCRIPTOR_POOL = 22,\n    VK_OBJECT_TYPE_DESCRIPTOR_SET = 23,\n    VK_OBJECT_TYPE_FRAMEBUFFER = 24,\n    VK_OBJECT_TYPE_COMMAND_POOL = 25,\n    VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION = 1000156000,\n    VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE = 1000085000,\n    VK_OBJECT_TYPE_PRIVATE_DATA_SLOT = 1000295000,\n    VK_OBJECT_TYPE_SURFACE_KHR = 1000000000,\n    VK_OBJECT_TYPE_SWAPCHAIN_KHR = 1000001000,\n    VK_OBJECT_TYPE_DISPLAY_KHR = 1000002000,\n    VK_OBJECT_TYPE_DISPLAY_MODE_KHR = 1000002001,\n    VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT = 1000011000,\n    VK_OBJECT_TYPE_VIDEO_SESSION_KHR = 1000023000,\n    VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR = 1000023001,\n    VK_OBJECT_TYPE_CU_MODULE_NVX = 1000029000,\n    VK_OBJECT_TYPE_CU_FUNCTION_NVX = 1000029001,\n    VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT = 1000128000,\n    VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR = 1000150000,\n    VK_OBJECT_TYPE_VALIDATION_CACHE_EXT = 1000160000,\n    VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV = 1000165000,\n    VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL = 1000210000,\n    VK_OBJECT_TYPE_DEFERRED_OPERATION_KHR = 1000268000,\n    VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NV = 1000277000,\n    VK_OBJECT_TYPE_CUDA_MODULE_NV = 1000307000,\n    VK_OBJECT_TYPE_CUDA_FUNCTION_NV = 1000307001,\n    VK_OBJECT_TYPE_BUFFER_COLLECTION_FUCHSIA = 1000366000,\n    VK_OBJECT_TYPE_MICROMAP_EXT = 1000396000,\n    VK_OBJECT_TYPE_OPTICAL_FLOW_SESSION_NV = 1000464000,\n    VK_OBJECT_TYPE_SHADER_EXT = 1000482000,\n    VK_OBJECT_TYPE_PIPELINE_BINARY_KHR = 1000483000,\n    VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_EXT = 1000572000,\n    VK_OBJECT_TYPE_INDIRECT_EXECUTION_SET_EXT = 1000572001,\n    VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR = VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE,\n    VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_KHR = VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION,\n    VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT = VK_OBJECT_TYPE_PRIVATE_DATA_SLOT,\n    VK_OBJECT_TYPE_MAX_ENUM = 0x7FFFFFFF\n} VkObjectType;\n\ntypedef enum VkVendorId {\n    VK_VENDOR_ID_KHRONOS = 0x10000,\n    VK_VENDOR_ID_VIV = 0x10001,\n    VK_VENDOR_ID_VSI = 0x10002,\n    VK_VENDOR_ID_KAZAN = 0x10003,\n    VK_VENDOR_ID_CODEPLAY = 0x10004,\n    VK_VENDOR_ID_MESA = 0x10005,\n    VK_VENDOR_ID_POCL = 0x10006,\n    VK_VENDOR_ID_MOBILEYE = 0x10007,\n    VK_VENDOR_ID_MAX_ENUM = 0x7FFFFFFF\n} VkVendorId;\n\ntypedef enum VkSystemAllocationScope {\n    VK_SYSTEM_ALLOCATION_SCOPE_COMMAND = 0,\n    VK_SYSTEM_ALLOCATION_SCOPE_OBJECT = 1,\n    VK_SYSTEM_ALLOCATION_SCOPE_CACHE = 2,\n    VK_SYSTEM_ALLOCATION_SCOPE_DEVICE = 3,\n    VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE = 4,\n    VK_SYSTEM_ALLOCATION_SCOPE_MAX_ENUM = 0x7FFFFFFF\n} VkSystemAllocationScope;\n\ntypedef enum VkInternalAllocationType {\n    VK_INTERNAL_ALLOCATION_TYPE_EXECUTABLE = 0,\n    VK_INTERNAL_ALLOCATION_TYPE_MAX_ENUM = 0x7FFFFFFF\n} VkInternalAllocationType;\n\ntypedef enum VkFormat {\n    VK_FORMAT_UNDEFINED = 0,\n    VK_FORMAT_R4G4_UNORM_PACK8 = 1,\n    VK_FORMAT_R4G4B4A4_UNORM_PACK16 = 2,\n    VK_FORMAT_B4G4R4A4_UNORM_PACK16 = 3,\n    VK_FORMAT_R5G6B5_UNORM_PACK16 = 4,\n    VK_FORMAT_B5G6R5_UNORM_PACK16 = 5,\n    VK_FORMAT_R5G5B5A1_UNORM_PACK16 = 6,\n    VK_FORMAT_B5G5R5A1_UNORM_PACK16 = 7,\n    VK_FORMAT_A1R5G5B5_UNORM_PACK16 = 8,\n    VK_FORMAT_R8_UNORM = 9,\n    VK_FORMAT_R8_SNORM = 10,\n    VK_FORMAT_R8_USCALED = 11,\n    VK_FORMAT_R8_SSCALED = 12,\n    VK_FORMAT_R8_UINT = 13,\n    VK_FORMAT_R8_SINT = 14,\n    VK_FORMAT_R8_SRGB = 15,\n    VK_FORMAT_R8G8_UNORM = 16,\n    VK_FORMAT_R8G8_SNORM = 17,\n    VK_FORMAT_R8G8_USCALED = 18,\n    VK_FORMAT_R8G8_SSCALED = 19,\n    VK_FORMAT_R8G8_UINT = 20,\n    VK_FORMAT_R8G8_SINT = 21,\n    VK_FORMAT_R8G8_SRGB = 22,\n    VK_FORMAT_R8G8B8_UNORM = 23,\n    VK_FORMAT_R8G8B8_SNORM = 24,\n    VK_FORMAT_R8G8B8_USCALED = 25,\n    VK_FORMAT_R8G8B8_SSCALED = 26,\n    VK_FORMAT_R8G8B8_UINT = 27,\n    VK_FORMAT_R8G8B8_SINT = 28,\n    VK_FORMAT_R8G8B8_SRGB = 29,\n    VK_FORMAT_B8G8R8_UNORM = 30,\n    VK_FORMAT_B8G8R8_SNORM = 31,\n    VK_FORMAT_B8G8R8_USCALED = 32,\n    VK_FORMAT_B8G8R8_SSCALED = 33,\n    VK_FORMAT_B8G8R8_UINT = 34,\n    VK_FORMAT_B8G8R8_SINT = 35,\n    VK_FORMAT_B8G8R8_SRGB = 36,\n    VK_FORMAT_R8G8B8A8_UNORM = 37,\n    VK_FORMAT_R8G8B8A8_SNORM = 38,\n    VK_FORMAT_R8G8B8A8_USCALED = 39,\n    VK_FORMAT_R8G8B8A8_SSCALED = 40,\n    VK_FORMAT_R8G8B8A8_UINT = 41,\n    VK_FORMAT_R8G8B8A8_SINT = 42,\n    VK_FORMAT_R8G8B8A8_SRGB = 43,\n    VK_FORMAT_B8G8R8A8_UNORM = 44,\n    VK_FORMAT_B8G8R8A8_SNORM = 45,\n    VK_FORMAT_B8G8R8A8_USCALED = 46,\n    VK_FORMAT_B8G8R8A8_SSCALED = 47,\n    VK_FORMAT_B8G8R8A8_UINT = 48,\n    VK_FORMAT_B8G8R8A8_SINT = 49,\n    VK_FORMAT_B8G8R8A8_SRGB = 50,\n    VK_FORMAT_A8B8G8R8_UNORM_PACK32 = 51,\n    VK_FORMAT_A8B8G8R8_SNORM_PACK32 = 52,\n    VK_FORMAT_A8B8G8R8_USCALED_PACK32 = 53,\n    VK_FORMAT_A8B8G8R8_SSCALED_PACK32 = 54,\n    VK_FORMAT_A8B8G8R8_UINT_PACK32 = 55,\n    VK_FORMAT_A8B8G8R8_SINT_PACK32 = 56,\n    VK_FORMAT_A8B8G8R8_SRGB_PACK32 = 57,\n    VK_FORMAT_A2R10G10B10_UNORM_PACK32 = 58,\n    VK_FORMAT_A2R10G10B10_SNORM_PACK32 = 59,\n    VK_FORMAT_A2R10G10B10_USCALED_PACK32 = 60,\n    VK_FORMAT_A2R10G10B10_SSCALED_PACK32 = 61,\n    VK_FORMAT_A2R10G10B10_UINT_PACK32 = 62,\n    VK_FORMAT_A2R10G10B10_SINT_PACK32 = 63,\n    VK_FORMAT_A2B10G10R10_UNORM_PACK32 = 64,\n    VK_FORMAT_A2B10G10R10_SNORM_PACK32 = 65,\n    VK_FORMAT_A2B10G10R10_USCALED_PACK32 = 66,\n    VK_FORMAT_A2B10G10R10_SSCALED_PACK32 = 67,\n    VK_FORMAT_A2B10G10R10_UINT_PACK32 = 68,\n    VK_FORMAT_A2B10G10R10_SINT_PACK32 = 69,\n    VK_FORMAT_R16_UNORM = 70,\n    VK_FORMAT_R16_SNORM = 71,\n    VK_FORMAT_R16_USCALED = 72,\n    VK_FORMAT_R16_SSCALED = 73,\n    VK_FORMAT_R16_UINT = 74,\n    VK_FORMAT_R16_SINT = 75,\n    VK_FORMAT_R16_SFLOAT = 76,\n    VK_FORMAT_R16G16_UNORM = 77,\n    VK_FORMAT_R16G16_SNORM = 78,\n    VK_FORMAT_R16G16_USCALED = 79,\n    VK_FORMAT_R16G16_SSCALED = 80,\n    VK_FORMAT_R16G16_UINT = 81,\n    VK_FORMAT_R16G16_SINT = 82,\n    VK_FORMAT_R16G16_SFLOAT = 83,\n    VK_FORMAT_R16G16B16_UNORM = 84,\n    VK_FORMAT_R16G16B16_SNORM = 85,\n    VK_FORMAT_R16G16B16_USCALED = 86,\n    VK_FORMAT_R16G16B16_SSCALED = 87,\n    VK_FORMAT_R16G16B16_UINT = 88,\n    VK_FORMAT_R16G16B16_SINT = 89,\n    VK_FORMAT_R16G16B16_SFLOAT = 90,\n    VK_FORMAT_R16G16B16A16_UNORM = 91,\n    VK_FORMAT_R16G16B16A16_SNORM = 92,\n    VK_FORMAT_R16G16B16A16_USCALED = 93,\n    VK_FORMAT_R16G16B16A16_SSCALED = 94,\n    VK_FORMAT_R16G16B16A16_UINT = 95,\n    VK_FORMAT_R16G16B16A16_SINT = 96,\n    VK_FORMAT_R16G16B16A16_SFLOAT = 97,\n    VK_FORMAT_R32_UINT = 98,\n    VK_FORMAT_R32_SINT = 99,\n    VK_FORMAT_R32_SFLOAT = 100,\n    VK_FORMAT_R32G32_UINT = 101,\n    VK_FORMAT_R32G32_SINT = 102,\n    VK_FORMAT_R32G32_SFLOAT = 103,\n    VK_FORMAT_R32G32B32_UINT = 104,\n    VK_FORMAT_R32G32B32_SINT = 105,\n    VK_FORMAT_R32G32B32_SFLOAT = 106,\n    VK_FORMAT_R32G32B32A32_UINT = 107,\n    VK_FORMAT_R32G32B32A32_SINT = 108,\n    VK_FORMAT_R32G32B32A32_SFLOAT = 109,\n    VK_FORMAT_R64_UINT = 110,\n    VK_FORMAT_R64_SINT = 111,\n    VK_FORMAT_R64_SFLOAT = 112,\n    VK_FORMAT_R64G64_UINT = 113,\n    VK_FORMAT_R64G64_SINT = 114,\n    VK_FORMAT_R64G64_SFLOAT = 115,\n    VK_FORMAT_R64G64B64_UINT = 116,\n    VK_FORMAT_R64G64B64_SINT = 117,\n    VK_FORMAT_R64G64B64_SFLOAT = 118,\n    VK_FORMAT_R64G64B64A64_UINT = 119,\n    VK_FORMAT_R64G64B64A64_SINT = 120,\n    VK_FORMAT_R64G64B64A64_SFLOAT = 121,\n    VK_FORMAT_B10G11R11_UFLOAT_PACK32 = 122,\n    VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 = 123,\n    VK_FORMAT_D16_UNORM = 124,\n    VK_FORMAT_X8_D24_UNORM_PACK32 = 125,\n    VK_FORMAT_D32_SFLOAT = 126,\n    VK_FORMAT_S8_UINT = 127,\n    VK_FORMAT_D16_UNORM_S8_UINT = 128,\n    VK_FORMAT_D24_UNORM_S8_UINT = 129,\n    VK_FORMAT_D32_SFLOAT_S8_UINT = 130,\n    VK_FORMAT_BC1_RGB_UNORM_BLOCK = 131,\n    VK_FORMAT_BC1_RGB_SRGB_BLOCK = 132,\n    VK_FORMAT_BC1_RGBA_UNORM_BLOCK = 133,\n    VK_FORMAT_BC1_RGBA_SRGB_BLOCK = 134,\n    VK_FORMAT_BC2_UNORM_BLOCK = 135,\n    VK_FORMAT_BC2_SRGB_BLOCK = 136,\n    VK_FORMAT_BC3_UNORM_BLOCK = 137,\n    VK_FORMAT_BC3_SRGB_BLOCK = 138,\n    VK_FORMAT_BC4_UNORM_BLOCK = 139,\n    VK_FORMAT_BC4_SNORM_BLOCK = 140,\n    VK_FORMAT_BC5_UNORM_BLOCK = 141,\n    VK_FORMAT_BC5_SNORM_BLOCK = 142,\n    VK_FORMAT_BC6H_UFLOAT_BLOCK = 143,\n    VK_FORMAT_BC6H_SFLOAT_BLOCK = 144,\n    VK_FORMAT_BC7_UNORM_BLOCK = 145,\n    VK_FORMAT_BC7_SRGB_BLOCK = 146,\n    VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK = 147,\n    VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK = 148,\n    VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK = 149,\n    VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK = 150,\n    VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK = 151,\n    VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK = 152,\n    VK_FORMAT_EAC_R11_UNORM_BLOCK = 153,\n    VK_FORMAT_EAC_R11_SNORM_BLOCK = 154,\n    VK_FORMAT_EAC_R11G11_UNORM_BLOCK = 155,\n    VK_FORMAT_EAC_R11G11_SNORM_BLOCK = 156,\n    VK_FORMAT_ASTC_4x4_UNORM_BLOCK = 157,\n    VK_FORMAT_ASTC_4x4_SRGB_BLOCK = 158,\n    VK_FORMAT_ASTC_5x4_UNORM_BLOCK = 159,\n    VK_FORMAT_ASTC_5x4_SRGB_BLOCK = 160,\n    VK_FORMAT_ASTC_5x5_UNORM_BLOCK = 161,\n    VK_FORMAT_ASTC_5x5_SRGB_BLOCK = 162,\n    VK_FORMAT_ASTC_6x5_UNORM_BLOCK = 163,\n    VK_FORMAT_ASTC_6x5_SRGB_BLOCK = 164,\n    VK_FORMAT_ASTC_6x6_UNORM_BLOCK = 165,\n    VK_FORMAT_ASTC_6x6_SRGB_BLOCK = 166,\n    VK_FORMAT_ASTC_8x5_UNORM_BLOCK = 167,\n    VK_FORMAT_ASTC_8x5_SRGB_BLOCK = 168,\n    VK_FORMAT_ASTC_8x6_UNORM_BLOCK = 169,\n    VK_FORMAT_ASTC_8x6_SRGB_BLOCK = 170,\n    VK_FORMAT_ASTC_8x8_UNORM_BLOCK = 171,\n    VK_FORMAT_ASTC_8x8_SRGB_BLOCK = 172,\n    VK_FORMAT_ASTC_10x5_UNORM_BLOCK = 173,\n    VK_FORMAT_ASTC_10x5_SRGB_BLOCK = 174,\n    VK_FORMAT_ASTC_10x6_UNORM_BLOCK = 175,\n    VK_FORMAT_ASTC_10x6_SRGB_BLOCK = 176,\n    VK_FORMAT_ASTC_10x8_UNORM_BLOCK = 177,\n    VK_FORMAT_ASTC_10x8_SRGB_BLOCK = 178,\n    VK_FORMAT_ASTC_10x10_UNORM_BLOCK = 179,\n    VK_FORMAT_ASTC_10x10_SRGB_BLOCK = 180,\n    VK_FORMAT_ASTC_12x10_UNORM_BLOCK = 181,\n    VK_FORMAT_ASTC_12x10_SRGB_BLOCK = 182,\n    VK_FORMAT_ASTC_12x12_UNORM_BLOCK = 183,\n    VK_FORMAT_ASTC_12x12_SRGB_BLOCK = 184,\n    VK_FORMAT_G8B8G8R8_422_UNORM = 1000156000,\n    VK_FORMAT_B8G8R8G8_422_UNORM = 1000156001,\n    VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM = 1000156002,\n    VK_FORMAT_G8_B8R8_2PLANE_420_UNORM = 1000156003,\n    VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM = 1000156004,\n    VK_FORMAT_G8_B8R8_2PLANE_422_UNORM = 1000156005,\n    VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM = 1000156006,\n    VK_FORMAT_R10X6_UNORM_PACK16 = 1000156007,\n    VK_FORMAT_R10X6G10X6_UNORM_2PACK16 = 1000156008,\n    VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16 = 1000156009,\n    VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16 = 1000156010,\n    VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16 = 1000156011,\n    VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16 = 1000156012,\n    VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16 = 1000156013,\n    VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16 = 1000156014,\n    VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16 = 1000156015,\n    VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16 = 1000156016,\n    VK_FORMAT_R12X4_UNORM_PACK16 = 1000156017,\n    VK_FORMAT_R12X4G12X4_UNORM_2PACK16 = 1000156018,\n    VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16 = 1000156019,\n    VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16 = 1000156020,\n    VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16 = 1000156021,\n    VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16 = 1000156022,\n    VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16 = 1000156023,\n    VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16 = 1000156024,\n    VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16 = 1000156025,\n    VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16 = 1000156026,\n    VK_FORMAT_G16B16G16R16_422_UNORM = 1000156027,\n    VK_FORMAT_B16G16R16G16_422_UNORM = 1000156028,\n    VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM = 1000156029,\n    VK_FORMAT_G16_B16R16_2PLANE_420_UNORM = 1000156030,\n    VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM = 1000156031,\n    VK_FORMAT_G16_B16R16_2PLANE_422_UNORM = 1000156032,\n    VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM = 1000156033,\n    VK_FORMAT_G8_B8R8_2PLANE_444_UNORM = 1000330000,\n    VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16 = 1000330001,\n    VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16 = 1000330002,\n    VK_FORMAT_G16_B16R16_2PLANE_444_UNORM = 1000330003,\n    VK_FORMAT_A4R4G4B4_UNORM_PACK16 = 1000340000,\n    VK_FORMAT_A4B4G4R4_UNORM_PACK16 = 1000340001,\n    VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK = 1000066000,\n    VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK = 1000066001,\n    VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK = 1000066002,\n    VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK = 1000066003,\n    VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK = 1000066004,\n    VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK = 1000066005,\n    VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK = 1000066006,\n    VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK = 1000066007,\n    VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK = 1000066008,\n    VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK = 1000066009,\n    VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK = 1000066010,\n    VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK = 1000066011,\n    VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK = 1000066012,\n    VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK = 1000066013,\n    VK_FORMAT_A1B5G5R5_UNORM_PACK16 = 1000470000,\n    VK_FORMAT_A8_UNORM = 1000470001,\n    VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG = 1000054000,\n    VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG = 1000054001,\n    VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG = 1000054002,\n    VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG = 1000054003,\n    VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG = 1000054004,\n    VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG = 1000054005,\n    VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG = 1000054006,\n    VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG = 1000054007,\n    VK_FORMAT_R16G16_SFIXED5_NV = 1000464000,\n    VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK,\n    VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK,\n    VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK,\n    VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK,\n    VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK,\n    VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK,\n    VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK,\n    VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK,\n    VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK,\n    VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK,\n    VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK,\n    VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK,\n    VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK,\n    VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK,\n    VK_FORMAT_G8B8G8R8_422_UNORM_KHR = VK_FORMAT_G8B8G8R8_422_UNORM,\n    VK_FORMAT_B8G8R8G8_422_UNORM_KHR = VK_FORMAT_B8G8R8G8_422_UNORM,\n    VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR = VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM,\n    VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM,\n    VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR = VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM,\n    VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR = VK_FORMAT_G8_B8R8_2PLANE_422_UNORM,\n    VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR = VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM,\n    VK_FORMAT_R10X6_UNORM_PACK16_KHR = VK_FORMAT_R10X6_UNORM_PACK16,\n    VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR = VK_FORMAT_R10X6G10X6_UNORM_2PACK16,\n    VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR = VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16,\n    VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR = VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16,\n    VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR = VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16,\n    VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR = VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16,\n    VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16,\n    VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR = VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16,\n    VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16,\n    VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR = VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16,\n    VK_FORMAT_R12X4_UNORM_PACK16_KHR = VK_FORMAT_R12X4_UNORM_PACK16,\n    VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR = VK_FORMAT_R12X4G12X4_UNORM_2PACK16,\n    VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR = VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16,\n    VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR = VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16,\n    VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR = VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16,\n    VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR = VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16,\n    VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR = VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16,\n    VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR = VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16,\n    VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR = VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16,\n    VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR = VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16,\n    VK_FORMAT_G16B16G16R16_422_UNORM_KHR = VK_FORMAT_G16B16G16R16_422_UNORM,\n    VK_FORMAT_B16G16R16G16_422_UNORM_KHR = VK_FORMAT_B16G16R16G16_422_UNORM,\n    VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR = VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM,\n    VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR = VK_FORMAT_G16_B16R16_2PLANE_420_UNORM,\n    VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR = VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM,\n    VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR = VK_FORMAT_G16_B16R16_2PLANE_422_UNORM,\n    VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR = VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM,\n    VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT = VK_FORMAT_G8_B8R8_2PLANE_444_UNORM,\n    VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16,\n    VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT = VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16,\n    VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT = VK_FORMAT_G16_B16R16_2PLANE_444_UNORM,\n    VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT = VK_FORMAT_A4R4G4B4_UNORM_PACK16,\n    VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT = VK_FORMAT_A4B4G4R4_UNORM_PACK16,\n  // VK_FORMAT_R16G16_S10_5_NV is a deprecated alias\n    VK_FORMAT_R16G16_S10_5_NV = VK_FORMAT_R16G16_SFIXED5_NV,\n    VK_FORMAT_A1B5G5R5_UNORM_PACK16_KHR = VK_FORMAT_A1B5G5R5_UNORM_PACK16,\n    VK_FORMAT_A8_UNORM_KHR = VK_FORMAT_A8_UNORM,\n    VK_FORMAT_MAX_ENUM = 0x7FFFFFFF\n} VkFormat;\n\ntypedef enum VkImageTiling {\n    VK_IMAGE_TILING_OPTIMAL = 0,\n    VK_IMAGE_TILING_LINEAR = 1,\n    VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT = 1000158000,\n    VK_IMAGE_TILING_MAX_ENUM = 0x7FFFFFFF\n} VkImageTiling;\n\ntypedef enum VkImageType {\n    VK_IMAGE_TYPE_1D = 0,\n    VK_IMAGE_TYPE_2D = 1,\n    VK_IMAGE_TYPE_3D = 2,\n    VK_IMAGE_TYPE_MAX_ENUM = 0x7FFFFFFF\n} VkImageType;\n\ntypedef enum VkPhysicalDeviceType {\n    VK_PHYSICAL_DEVICE_TYPE_OTHER = 0,\n    VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU = 1,\n    VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU = 2,\n    VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU = 3,\n    VK_PHYSICAL_DEVICE_TYPE_CPU = 4,\n    VK_PHYSICAL_DEVICE_TYPE_MAX_ENUM = 0x7FFFFFFF\n} VkPhysicalDeviceType;\n\ntypedef enum VkQueryType {\n    VK_QUERY_TYPE_OCCLUSION = 0,\n    VK_QUERY_TYPE_PIPELINE_STATISTICS = 1,\n    VK_QUERY_TYPE_TIMESTAMP = 2,\n    VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR = 1000023000,\n    VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT = 1000028004,\n    VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR = 1000116000,\n    VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR = 1000150000,\n    VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR = 1000150001,\n    VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV = 1000165000,\n    VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL = 1000210000,\n    VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR = 1000299000,\n    VK_QUERY_TYPE_MESH_PRIMITIVES_GENERATED_EXT = 1000328000,\n    VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT = 1000382000,\n    VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR = 1000386000,\n    VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR = 1000386001,\n    VK_QUERY_TYPE_MICROMAP_SERIALIZATION_SIZE_EXT = 1000396000,\n    VK_QUERY_TYPE_MICROMAP_COMPACTED_SIZE_EXT = 1000396001,\n    VK_QUERY_TYPE_MAX_ENUM = 0x7FFFFFFF\n} VkQueryType;\n\ntypedef enum VkSharingMode {\n    VK_SHARING_MODE_EXCLUSIVE = 0,\n    VK_SHARING_MODE_CONCURRENT = 1,\n    VK_SHARING_MODE_MAX_ENUM = 0x7FFFFFFF\n} VkSharingMode;\n\ntypedef enum VkComponentSwizzle {\n    VK_COMPONENT_SWIZZLE_IDENTITY = 0,\n    VK_COMPONENT_SWIZZLE_ZERO = 1,\n    VK_COMPONENT_SWIZZLE_ONE = 2,\n    VK_COMPONENT_SWIZZLE_R = 3,\n    VK_COMPONENT_SWIZZLE_G = 4,\n    VK_COMPONENT_SWIZZLE_B = 5,\n    VK_COMPONENT_SWIZZLE_A = 6,\n    VK_COMPONENT_SWIZZLE_MAX_ENUM = 0x7FFFFFFF\n} VkComponentSwizzle;\n\ntypedef enum VkImageViewType {\n    VK_IMAGE_VIEW_TYPE_1D = 0,\n    VK_IMAGE_VIEW_TYPE_2D = 1,\n    VK_IMAGE_VIEW_TYPE_3D = 2,\n    VK_IMAGE_VIEW_TYPE_CUBE = 3,\n    VK_IMAGE_VIEW_TYPE_1D_ARRAY = 4,\n    VK_IMAGE_VIEW_TYPE_2D_ARRAY = 5,\n    VK_IMAGE_VIEW_TYPE_CUBE_ARRAY = 6,\n    VK_IMAGE_VIEW_TYPE_MAX_ENUM = 0x7FFFFFFF\n} VkImageViewType;\n\ntypedef enum VkBlendFactor {\n    VK_BLEND_FACTOR_ZERO = 0,\n    VK_BLEND_FACTOR_ONE = 1,\n    VK_BLEND_FACTOR_SRC_COLOR = 2,\n    VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR = 3,\n    VK_BLEND_FACTOR_DST_COLOR = 4,\n    VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR = 5,\n    VK_BLEND_FACTOR_SRC_ALPHA = 6,\n    VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA = 7,\n    VK_BLEND_FACTOR_DST_ALPHA = 8,\n    VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA = 9,\n    VK_BLEND_FACTOR_CONSTANT_COLOR = 10,\n    VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR = 11,\n    VK_BLEND_FACTOR_CONSTANT_ALPHA = 12,\n    VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA = 13,\n    VK_BLEND_FACTOR_SRC_ALPHA_SATURATE = 14,\n    VK_BLEND_FACTOR_SRC1_COLOR = 15,\n    VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR = 16,\n    VK_BLEND_FACTOR_SRC1_ALPHA = 17,\n    VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA = 18,\n    VK_BLEND_FACTOR_MAX_ENUM = 0x7FFFFFFF\n} VkBlendFactor;\n\ntypedef enum VkBlendOp {\n    VK_BLEND_OP_ADD = 0,\n    VK_BLEND_OP_SUBTRACT = 1,\n    VK_BLEND_OP_REVERSE_SUBTRACT = 2,\n    VK_BLEND_OP_MIN = 3,\n    VK_BLEND_OP_MAX = 4,\n    VK_BLEND_OP_ZERO_EXT = 1000148000,\n    VK_BLEND_OP_SRC_EXT = 1000148001,\n    VK_BLEND_OP_DST_EXT = 1000148002,\n    VK_BLEND_OP_SRC_OVER_EXT = 1000148003,\n    VK_BLEND_OP_DST_OVER_EXT = 1000148004,\n    VK_BLEND_OP_SRC_IN_EXT = 1000148005,\n    VK_BLEND_OP_DST_IN_EXT = 1000148006,\n    VK_BLEND_OP_SRC_OUT_EXT = 1000148007,\n    VK_BLEND_OP_DST_OUT_EXT = 1000148008,\n    VK_BLEND_OP_SRC_ATOP_EXT = 1000148009,\n    VK_BLEND_OP_DST_ATOP_EXT = 1000148010,\n    VK_BLEND_OP_XOR_EXT = 1000148011,\n    VK_BLEND_OP_MULTIPLY_EXT = 1000148012,\n    VK_BLEND_OP_SCREEN_EXT = 1000148013,\n    VK_BLEND_OP_OVERLAY_EXT = 1000148014,\n    VK_BLEND_OP_DARKEN_EXT = 1000148015,\n    VK_BLEND_OP_LIGHTEN_EXT = 1000148016,\n    VK_BLEND_OP_COLORDODGE_EXT = 1000148017,\n    VK_BLEND_OP_COLORBURN_EXT = 1000148018,\n    VK_BLEND_OP_HARDLIGHT_EXT = 1000148019,\n    VK_BLEND_OP_SOFTLIGHT_EXT = 1000148020,\n    VK_BLEND_OP_DIFFERENCE_EXT = 1000148021,\n    VK_BLEND_OP_EXCLUSION_EXT = 1000148022,\n    VK_BLEND_OP_INVERT_EXT = 1000148023,\n    VK_BLEND_OP_INVERT_RGB_EXT = 1000148024,\n    VK_BLEND_OP_LINEARDODGE_EXT = 1000148025,\n    VK_BLEND_OP_LINEARBURN_EXT = 1000148026,\n    VK_BLEND_OP_VIVIDLIGHT_EXT = 1000148027,\n    VK_BLEND_OP_LINEARLIGHT_EXT = 1000148028,\n    VK_BLEND_OP_PINLIGHT_EXT = 1000148029,\n    VK_BLEND_OP_HARDMIX_EXT = 1000148030,\n    VK_BLEND_OP_HSL_HUE_EXT = 1000148031,\n    VK_BLEND_OP_HSL_SATURATION_EXT = 1000148032,\n    VK_BLEND_OP_HSL_COLOR_EXT = 1000148033,\n    VK_BLEND_OP_HSL_LUMINOSITY_EXT = 1000148034,\n    VK_BLEND_OP_PLUS_EXT = 1000148035,\n    VK_BLEND_OP_PLUS_CLAMPED_EXT = 1000148036,\n    VK_BLEND_OP_PLUS_CLAMPED_ALPHA_EXT = 1000148037,\n    VK_BLEND_OP_PLUS_DARKER_EXT = 1000148038,\n    VK_BLEND_OP_MINUS_EXT = 1000148039,\n    VK_BLEND_OP_MINUS_CLAMPED_EXT = 1000148040,\n    VK_BLEND_OP_CONTRAST_EXT = 1000148041,\n    VK_BLEND_OP_INVERT_OVG_EXT = 1000148042,\n    VK_BLEND_OP_RED_EXT = 1000148043,\n    VK_BLEND_OP_GREEN_EXT = 1000148044,\n    VK_BLEND_OP_BLUE_EXT = 1000148045,\n    VK_BLEND_OP_MAX_ENUM = 0x7FFFFFFF\n} VkBlendOp;\n\ntypedef enum VkCompareOp {\n    VK_COMPARE_OP_NEVER = 0,\n    VK_COMPARE_OP_LESS = 1,\n    VK_COMPARE_OP_EQUAL = 2,\n    VK_COMPARE_OP_LESS_OR_EQUAL = 3,\n    VK_COMPARE_OP_GREATER = 4,\n    VK_COMPARE_OP_NOT_EQUAL = 5,\n    VK_COMPARE_OP_GREATER_OR_EQUAL = 6,\n    VK_COMPARE_OP_ALWAYS = 7,\n    VK_COMPARE_OP_MAX_ENUM = 0x7FFFFFFF\n} VkCompareOp;\n\ntypedef enum VkDynamicState {\n    VK_DYNAMIC_STATE_VIEWPORT = 0,\n    VK_DYNAMIC_STATE_SCISSOR = 1,\n    VK_DYNAMIC_STATE_LINE_WIDTH = 2,\n    VK_DYNAMIC_STATE_DEPTH_BIAS = 3,\n    VK_DYNAMIC_STATE_BLEND_CONSTANTS = 4,\n    VK_DYNAMIC_STATE_DEPTH_BOUNDS = 5,\n    VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK = 6,\n    VK_DYNAMIC_STATE_STENCIL_WRITE_MASK = 7,\n    VK_DYNAMIC_STATE_STENCIL_REFERENCE = 8,\n    VK_DYNAMIC_STATE_CULL_MODE = 1000267000,\n    VK_DYNAMIC_STATE_FRONT_FACE = 1000267001,\n    VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY = 1000267002,\n    VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT = 1000267003,\n    VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT = 1000267004,\n    VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE = 1000267005,\n    VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE = 1000267006,\n    VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE = 1000267007,\n    VK_DYNAMIC_STATE_DEPTH_COMPARE_OP = 1000267008,\n    VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE = 1000267009,\n    VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE = 1000267010,\n    VK_DYNAMIC_STATE_STENCIL_OP = 1000267011,\n    VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE = 1000377001,\n    VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE = 1000377002,\n    VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE = 1000377004,\n    VK_DYNAMIC_STATE_LINE_STIPPLE = 1000259000,\n    VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV = 1000087000,\n    VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT = 1000099000,\n    VK_DYNAMIC_STATE_DISCARD_RECTANGLE_ENABLE_EXT = 1000099001,\n    VK_DYNAMIC_STATE_DISCARD_RECTANGLE_MODE_EXT = 1000099002,\n    VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT = 1000143000,\n    VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR = 1000347000,\n    VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV = 1000164004,\n    VK_DYNAMIC_STATE_VIEWPORT_COARSE_SAMPLE_ORDER_NV = 1000164006,\n    VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_ENABLE_NV = 1000205000,\n    VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV = 1000205001,\n    VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR = 1000226000,\n    VK_DYNAMIC_STATE_VERTEX_INPUT_EXT = 1000352000,\n    VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT = 1000377000,\n    VK_DYNAMIC_STATE_LOGIC_OP_EXT = 1000377003,\n    VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT = 1000381000,\n    VK_DYNAMIC_STATE_DEPTH_CLAMP_ENABLE_EXT = 1000455003,\n    VK_DYNAMIC_STATE_POLYGON_MODE_EXT = 1000455004,\n    VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT = 1000455005,\n    VK_DYNAMIC_STATE_SAMPLE_MASK_EXT = 1000455006,\n    VK_DYNAMIC_STATE_ALPHA_TO_COVERAGE_ENABLE_EXT = 1000455007,\n    VK_DYNAMIC_STATE_ALPHA_TO_ONE_ENABLE_EXT = 1000455008,\n    VK_DYNAMIC_STATE_LOGIC_OP_ENABLE_EXT = 1000455009,\n    VK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT = 1000455010,\n    VK_DYNAMIC_STATE_COLOR_BLEND_EQUATION_EXT = 1000455011,\n    VK_DYNAMIC_STATE_COLOR_WRITE_MASK_EXT = 1000455012,\n    VK_DYNAMIC_STATE_TESSELLATION_DOMAIN_ORIGIN_EXT = 1000455002,\n    VK_DYNAMIC_STATE_RASTERIZATION_STREAM_EXT = 1000455013,\n    VK_DYNAMIC_STATE_CONSERVATIVE_RASTERIZATION_MODE_EXT = 1000455014,\n    VK_DYNAMIC_STATE_EXTRA_PRIMITIVE_OVERESTIMATION_SIZE_EXT = 1000455015,\n    VK_DYNAMIC_STATE_DEPTH_CLIP_ENABLE_EXT = 1000455016,\n    VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT = 1000455017,\n    VK_DYNAMIC_STATE_COLOR_BLEND_ADVANCED_EXT = 1000455018,\n    VK_DYNAMIC_STATE_PROVOKING_VERTEX_MODE_EXT = 1000455019,\n    VK_DYNAMIC_STATE_LINE_RASTERIZATION_MODE_EXT = 1000455020,\n    VK_DYNAMIC_STATE_LINE_STIPPLE_ENABLE_EXT = 1000455021,\n    VK_DYNAMIC_STATE_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE_EXT = 1000455022,\n    VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_ENABLE_NV = 1000455023,\n    VK_DYNAMIC_STATE_VIEWPORT_SWIZZLE_NV = 1000455024,\n    VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_ENABLE_NV = 1000455025,\n    VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_LOCATION_NV = 1000455026,\n    VK_DYNAMIC_STATE_COVERAGE_MODULATION_MODE_NV = 1000455027,\n    VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_ENABLE_NV = 1000455028,\n    VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_NV = 1000455029,\n    VK_DYNAMIC_STATE_SHADING_RATE_IMAGE_ENABLE_NV = 1000455030,\n    VK_DYNAMIC_STATE_REPRESENTATIVE_FRAGMENT_TEST_ENABLE_NV = 1000455031,\n    VK_DYNAMIC_STATE_COVERAGE_REDUCTION_MODE_NV = 1000455032,\n    VK_DYNAMIC_STATE_ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT = 1000524000,\n    VK_DYNAMIC_STATE_DEPTH_CLAMP_RANGE_EXT = 1000582000,\n    VK_DYNAMIC_STATE_LINE_STIPPLE_EXT = VK_DYNAMIC_STATE_LINE_STIPPLE,\n    VK_DYNAMIC_STATE_CULL_MODE_EXT = VK_DYNAMIC_STATE_CULL_MODE,\n    VK_DYNAMIC_STATE_FRONT_FACE_EXT = VK_DYNAMIC_STATE_FRONT_FACE,\n    VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT = VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY,\n    VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT = VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT,\n    VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT = VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT,\n    VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT = VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE,\n    VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT = VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE,\n    VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT = VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE,\n    VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT = VK_DYNAMIC_STATE_DEPTH_COMPARE_OP,\n    VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT = VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE,\n    VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT = VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE,\n    VK_DYNAMIC_STATE_STENCIL_OP_EXT = VK_DYNAMIC_STATE_STENCIL_OP,\n    VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT = VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE,\n    VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT = VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE,\n    VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT = VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE,\n    VK_DYNAMIC_STATE_LINE_STIPPLE_KHR = VK_DYNAMIC_STATE_LINE_STIPPLE,\n    VK_DYNAMIC_STATE_MAX_ENUM = 0x7FFFFFFF\n} VkDynamicState;\n\ntypedef enum VkFrontFace {\n    VK_FRONT_FACE_COUNTER_CLOCKWISE = 0,\n    VK_FRONT_FACE_CLOCKWISE = 1,\n    VK_FRONT_FACE_MAX_ENUM = 0x7FFFFFFF\n} VkFrontFace;\n\ntypedef enum VkVertexInputRate {\n    VK_VERTEX_INPUT_RATE_VERTEX = 0,\n    VK_VERTEX_INPUT_RATE_INSTANCE = 1,\n    VK_VERTEX_INPUT_RATE_MAX_ENUM = 0x7FFFFFFF\n} VkVertexInputRate;\n\ntypedef enum VkPrimitiveTopology {\n    VK_PRIMITIVE_TOPOLOGY_POINT_LIST = 0,\n    VK_PRIMITIVE_TOPOLOGY_LINE_LIST = 1,\n    VK_PRIMITIVE_TOPOLOGY_LINE_STRIP = 2,\n    VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST = 3,\n    VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP = 4,\n    VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN = 5,\n    VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY = 6,\n    VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY = 7,\n    VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY = 8,\n    VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY = 9,\n    VK_PRIMITIVE_TOPOLOGY_PATCH_LIST = 10,\n    VK_PRIMITIVE_TOPOLOGY_MAX_ENUM = 0x7FFFFFFF\n} VkPrimitiveTopology;\n\ntypedef enum VkPolygonMode {\n    VK_POLYGON_MODE_FILL = 0,\n    VK_POLYGON_MODE_LINE = 1,\n    VK_POLYGON_MODE_POINT = 2,\n    VK_POLYGON_MODE_FILL_RECTANGLE_NV = 1000153000,\n    VK_POLYGON_MODE_MAX_ENUM = 0x7FFFFFFF\n} VkPolygonMode;\n\ntypedef enum VkStencilOp {\n    VK_STENCIL_OP_KEEP = 0,\n    VK_STENCIL_OP_ZERO = 1,\n    VK_STENCIL_OP_REPLACE = 2,\n    VK_STENCIL_OP_INCREMENT_AND_CLAMP = 3,\n    VK_STENCIL_OP_DECREMENT_AND_CLAMP = 4,\n    VK_STENCIL_OP_INVERT = 5,\n    VK_STENCIL_OP_INCREMENT_AND_WRAP = 6,\n    VK_STENCIL_OP_DECREMENT_AND_WRAP = 7,\n    VK_STENCIL_OP_MAX_ENUM = 0x7FFFFFFF\n} VkStencilOp;\n\ntypedef enum VkLogicOp {\n    VK_LOGIC_OP_CLEAR = 0,\n    VK_LOGIC_OP_AND = 1,\n    VK_LOGIC_OP_AND_REVERSE = 2,\n    VK_LOGIC_OP_COPY = 3,\n    VK_LOGIC_OP_AND_INVERTED = 4,\n    VK_LOGIC_OP_NO_OP = 5,\n    VK_LOGIC_OP_XOR = 6,\n    VK_LOGIC_OP_OR = 7,\n    VK_LOGIC_OP_NOR = 8,\n    VK_LOGIC_OP_EQUIVALENT = 9,\n    VK_LOGIC_OP_INVERT = 10,\n    VK_LOGIC_OP_OR_REVERSE = 11,\n    VK_LOGIC_OP_COPY_INVERTED = 12,\n    VK_LOGIC_OP_OR_INVERTED = 13,\n    VK_LOGIC_OP_NAND = 14,\n    VK_LOGIC_OP_SET = 15,\n    VK_LOGIC_OP_MAX_ENUM = 0x7FFFFFFF\n} VkLogicOp;\n\ntypedef enum VkBorderColor {\n    VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK = 0,\n    VK_BORDER_COLOR_INT_TRANSPARENT_BLACK = 1,\n    VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK = 2,\n    VK_BORDER_COLOR_INT_OPAQUE_BLACK = 3,\n    VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE = 4,\n    VK_BORDER_COLOR_INT_OPAQUE_WHITE = 5,\n    VK_BORDER_COLOR_FLOAT_CUSTOM_EXT = 1000287003,\n    VK_BORDER_COLOR_INT_CUSTOM_EXT = 1000287004,\n    VK_BORDER_COLOR_MAX_ENUM = 0x7FFFFFFF\n} VkBorderColor;\n\ntypedef enum VkFilter {\n    VK_FILTER_NEAREST = 0,\n    VK_FILTER_LINEAR = 1,\n    VK_FILTER_CUBIC_EXT = 1000015000,\n    VK_FILTER_CUBIC_IMG = VK_FILTER_CUBIC_EXT,\n    VK_FILTER_MAX_ENUM = 0x7FFFFFFF\n} VkFilter;\n\ntypedef enum VkSamplerAddressMode {\n    VK_SAMPLER_ADDRESS_MODE_REPEAT = 0,\n    VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT = 1,\n    VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE = 2,\n    VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER = 3,\n    VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE = 4,\n  // VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE_KHR is a deprecated alias\n    VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE_KHR = VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,\n    VK_SAMPLER_ADDRESS_MODE_MAX_ENUM = 0x7FFFFFFF\n} VkSamplerAddressMode;\n\ntypedef enum VkSamplerMipmapMode {\n    VK_SAMPLER_MIPMAP_MODE_NEAREST = 0,\n    VK_SAMPLER_MIPMAP_MODE_LINEAR = 1,\n    VK_SAMPLER_MIPMAP_MODE_MAX_ENUM = 0x7FFFFFFF\n} VkSamplerMipmapMode;\n\ntypedef enum VkDescriptorType {\n    VK_DESCRIPTOR_TYPE_SAMPLER = 0,\n    VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER = 1,\n    VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE = 2,\n    VK_DESCRIPTOR_TYPE_STORAGE_IMAGE = 3,\n    VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER = 4,\n    VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER = 5,\n    VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER = 6,\n    VK_DESCRIPTOR_TYPE_STORAGE_BUFFER = 7,\n    VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC = 8,\n    VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC = 9,\n    VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT = 10,\n    VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK = 1000138000,\n    VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR = 1000150000,\n    VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV = 1000165000,\n    VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOM = 1000440000,\n    VK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOM = 1000440001,\n    VK_DESCRIPTOR_TYPE_MUTABLE_EXT = 1000351000,\n    VK_DESCRIPTOR_TYPE_PARTITIONED_ACCELERATION_STRUCTURE_NV = 1000570000,\n    VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT = VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK,\n    VK_DESCRIPTOR_TYPE_MUTABLE_VALVE = VK_DESCRIPTOR_TYPE_MUTABLE_EXT,\n    VK_DESCRIPTOR_TYPE_MAX_ENUM = 0x7FFFFFFF\n} VkDescriptorType;\n\ntypedef enum VkAttachmentLoadOp {\n    VK_ATTACHMENT_LOAD_OP_LOAD = 0,\n    VK_ATTACHMENT_LOAD_OP_CLEAR = 1,\n    VK_ATTACHMENT_LOAD_OP_DONT_CARE = 2,\n    VK_ATTACHMENT_LOAD_OP_NONE = 1000400000,\n    VK_ATTACHMENT_LOAD_OP_NONE_EXT = VK_ATTACHMENT_LOAD_OP_NONE,\n    VK_ATTACHMENT_LOAD_OP_NONE_KHR = VK_ATTACHMENT_LOAD_OP_NONE,\n    VK_ATTACHMENT_LOAD_OP_MAX_ENUM = 0x7FFFFFFF\n} VkAttachmentLoadOp;\n\ntypedef enum VkAttachmentStoreOp {\n    VK_ATTACHMENT_STORE_OP_STORE = 0,\n    VK_ATTACHMENT_STORE_OP_DONT_CARE = 1,\n    VK_ATTACHMENT_STORE_OP_NONE = 1000301000,\n    VK_ATTACHMENT_STORE_OP_NONE_KHR = VK_ATTACHMENT_STORE_OP_NONE,\n    VK_ATTACHMENT_STORE_OP_NONE_QCOM = VK_ATTACHMENT_STORE_OP_NONE,\n    VK_ATTACHMENT_STORE_OP_NONE_EXT = VK_ATTACHMENT_STORE_OP_NONE,\n    VK_ATTACHMENT_STORE_OP_MAX_ENUM = 0x7FFFFFFF\n} VkAttachmentStoreOp;\n\ntypedef enum VkPipelineBindPoint {\n    VK_PIPELINE_BIND_POINT_GRAPHICS = 0,\n    VK_PIPELINE_BIND_POINT_COMPUTE = 1,\n#ifdef VK_ENABLE_BETA_EXTENSIONS\n    VK_PIPELINE_BIND_POINT_EXECUTION_GRAPH_AMDX = 1000134000,\n#endif\n    VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR = 1000165000,\n    VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI = 1000369003,\n    VK_PIPELINE_BIND_POINT_RAY_TRACING_NV = VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR,\n    VK_PIPELINE_BIND_POINT_MAX_ENUM = 0x7FFFFFFF\n} VkPipelineBindPoint;\n\ntypedef enum VkCommandBufferLevel {\n    VK_COMMAND_BUFFER_LEVEL_PRIMARY = 0,\n    VK_COMMAND_BUFFER_LEVEL_SECONDARY = 1,\n    VK_COMMAND_BUFFER_LEVEL_MAX_ENUM = 0x7FFFFFFF\n} VkCommandBufferLevel;\n\ntypedef enum VkIndexType {\n    VK_INDEX_TYPE_UINT16 = 0,\n    VK_INDEX_TYPE_UINT32 = 1,\n    VK_INDEX_TYPE_UINT8 = 1000265000,\n    VK_INDEX_TYPE_NONE_KHR = 1000165000,\n    VK_INDEX_TYPE_NONE_NV = VK_INDEX_TYPE_NONE_KHR,\n    VK_INDEX_TYPE_UINT8_EXT = VK_INDEX_TYPE_UINT8,\n    VK_INDEX_TYPE_UINT8_KHR = VK_INDEX_TYPE_UINT8,\n    VK_INDEX_TYPE_MAX_ENUM = 0x7FFFFFFF\n} VkIndexType;\n\ntypedef enum VkSubpassContents {\n    VK_SUBPASS_CONTENTS_INLINE = 0,\n    VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS = 1,\n    VK_SUBPASS_CONTENTS_INLINE_AND_SECONDARY_COMMAND_BUFFERS_KHR = 1000451000,\n    VK_SUBPASS_CONTENTS_INLINE_AND_SECONDARY_COMMAND_BUFFERS_EXT = VK_SUBPASS_CONTENTS_INLINE_AND_SECONDARY_COMMAND_BUFFERS_KHR,\n    VK_SUBPASS_CONTENTS_MAX_ENUM = 0x7FFFFFFF\n} VkSubpassContents;\n\ntypedef enum VkAccessFlagBits {\n    VK_ACCESS_INDIRECT_COMMAND_READ_BIT = 0x00000001,\n    VK_ACCESS_INDEX_READ_BIT = 0x00000002,\n    VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT = 0x00000004,\n    VK_ACCESS_UNIFORM_READ_BIT = 0x00000008,\n    VK_ACCESS_INPUT_ATTACHMENT_READ_BIT = 0x00000010,\n    VK_ACCESS_SHADER_READ_BIT = 0x00000020,\n    VK_ACCESS_SHADER_WRITE_BIT = 0x00000040,\n    VK_ACCESS_COLOR_ATTACHMENT_READ_BIT = 0x00000080,\n    VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT = 0x00000100,\n    VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT = 0x00000200,\n    VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT = 0x00000400,\n    VK_ACCESS_TRANSFER_READ_BIT = 0x00000800,\n    VK_ACCESS_TRANSFER_WRITE_BIT = 0x00001000,\n    VK_ACCESS_HOST_READ_BIT = 0x00002000,\n    VK_ACCESS_HOST_WRITE_BIT = 0x00004000,\n    VK_ACCESS_MEMORY_READ_BIT = 0x00008000,\n    VK_ACCESS_MEMORY_WRITE_BIT = 0x00010000,\n    VK_ACCESS_NONE = 0,\n    VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT = 0x02000000,\n    VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT = 0x04000000,\n    VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT = 0x08000000,\n    VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT = 0x00100000,\n    VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT = 0x00080000,\n    VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR = 0x00200000,\n    VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR = 0x00400000,\n    VK_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT = 0x01000000,\n    VK_ACCESS_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR = 0x00800000,\n    VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV = 0x00020000,\n    VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV = 0x00040000,\n    VK_ACCESS_SHADING_RATE_IMAGE_READ_BIT_NV = VK_ACCESS_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR,\n    VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_NV = VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR,\n    VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_NV = VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR,\n    VK_ACCESS_NONE_KHR = VK_ACCESS_NONE,\n    VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_EXT = VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV,\n    VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_EXT = VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV,\n    VK_ACCESS_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkAccessFlagBits;\ntypedef VkFlags VkAccessFlags;\n\ntypedef enum VkImageAspectFlagBits {\n    VK_IMAGE_ASPECT_COLOR_BIT = 0x00000001,\n    VK_IMAGE_ASPECT_DEPTH_BIT = 0x00000002,\n    VK_IMAGE_ASPECT_STENCIL_BIT = 0x00000004,\n    VK_IMAGE_ASPECT_METADATA_BIT = 0x00000008,\n    VK_IMAGE_ASPECT_PLANE_0_BIT = 0x00000010,\n    VK_IMAGE_ASPECT_PLANE_1_BIT = 0x00000020,\n    VK_IMAGE_ASPECT_PLANE_2_BIT = 0x00000040,\n    VK_IMAGE_ASPECT_NONE = 0,\n    VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT = 0x00000080,\n    VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT = 0x00000100,\n    VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT = 0x00000200,\n    VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT = 0x00000400,\n    VK_IMAGE_ASPECT_PLANE_0_BIT_KHR = VK_IMAGE_ASPECT_PLANE_0_BIT,\n    VK_IMAGE_ASPECT_PLANE_1_BIT_KHR = VK_IMAGE_ASPECT_PLANE_1_BIT,\n    VK_IMAGE_ASPECT_PLANE_2_BIT_KHR = VK_IMAGE_ASPECT_PLANE_2_BIT,\n    VK_IMAGE_ASPECT_NONE_KHR = VK_IMAGE_ASPECT_NONE,\n    VK_IMAGE_ASPECT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkImageAspectFlagBits;\ntypedef VkFlags VkImageAspectFlags;\n\ntypedef enum VkFormatFeatureFlagBits {\n    VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT = 0x00000001,\n    VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT = 0x00000002,\n    VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT = 0x00000004,\n    VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT = 0x00000008,\n    VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT = 0x00000010,\n    VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT = 0x00000020,\n    VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT = 0x00000040,\n    VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT = 0x00000080,\n    VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT = 0x00000100,\n    VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000200,\n    VK_FORMAT_FEATURE_BLIT_SRC_BIT = 0x00000400,\n    VK_FORMAT_FEATURE_BLIT_DST_BIT = 0x00000800,\n    VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT = 0x00001000,\n    VK_FORMAT_FEATURE_TRANSFER_SRC_BIT = 0x00004000,\n    VK_FORMAT_FEATURE_TRANSFER_DST_BIT = 0x00008000,\n    VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT = 0x00020000,\n    VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT = 0x00040000,\n    VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT = 0x00080000,\n    VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT = 0x00100000,\n    VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT = 0x00200000,\n    VK_FORMAT_FEATURE_DISJOINT_BIT = 0x00400000,\n    VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT = 0x00800000,\n    VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT = 0x00010000,\n    VK_FORMAT_FEATURE_VIDEO_DECODE_OUTPUT_BIT_KHR = 0x02000000,\n    VK_FORMAT_FEATURE_VIDEO_DECODE_DPB_BIT_KHR = 0x04000000,\n    VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR = 0x20000000,\n    VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT = 0x00002000,\n    VK_FORMAT_FEATURE_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x01000000,\n    VK_FORMAT_FEATURE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x40000000,\n    VK_FORMAT_FEATURE_VIDEO_ENCODE_INPUT_BIT_KHR = 0x08000000,\n    VK_FORMAT_FEATURE_VIDEO_ENCODE_DPB_BIT_KHR = 0x10000000,\n    VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG = VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT,\n    VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT,\n    VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR = VK_FORMAT_FEATURE_TRANSFER_DST_BIT,\n    VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT_EXT = VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT,\n    VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT_KHR = VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT,\n    VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT_KHR = VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT,\n    VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT_KHR = VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT,\n    VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT_KHR = VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT,\n    VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT_KHR = VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT,\n    VK_FORMAT_FEATURE_DISJOINT_BIT_KHR = VK_FORMAT_FEATURE_DISJOINT_BIT,\n    VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT_KHR = VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT,\n    VK_FORMAT_FEATURE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkFormatFeatureFlagBits;\ntypedef VkFlags VkFormatFeatureFlags;\n\ntypedef enum VkImageCreateFlagBits {\n    VK_IMAGE_CREATE_SPARSE_BINDING_BIT = 0x00000001,\n    VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT = 0x00000002,\n    VK_IMAGE_CREATE_SPARSE_ALIASED_BIT = 0x00000004,\n    VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT = 0x00000008,\n    VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT = 0x00000010,\n    VK_IMAGE_CREATE_ALIAS_BIT = 0x00000400,\n    VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT = 0x00000040,\n    VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT = 0x00000020,\n    VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT = 0x00000080,\n    VK_IMAGE_CREATE_EXTENDED_USAGE_BIT = 0x00000100,\n    VK_IMAGE_CREATE_PROTECTED_BIT = 0x00000800,\n    VK_IMAGE_CREATE_DISJOINT_BIT = 0x00000200,\n    VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV = 0x00002000,\n    VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT = 0x00001000,\n    VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT = 0x00004000,\n    VK_IMAGE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = 0x00010000,\n    VK_IMAGE_CREATE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_BIT_EXT = 0x00040000,\n    VK_IMAGE_CREATE_2D_VIEW_COMPATIBLE_BIT_EXT = 0x00020000,\n    VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM = 0x00008000,\n    VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR = 0x00100000,\n    VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR = VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT,\n    VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR = VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT,\n    VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_KHR = VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT,\n    VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR = VK_IMAGE_CREATE_EXTENDED_USAGE_BIT,\n    VK_IMAGE_CREATE_DISJOINT_BIT_KHR = VK_IMAGE_CREATE_DISJOINT_BIT,\n    VK_IMAGE_CREATE_ALIAS_BIT_KHR = VK_IMAGE_CREATE_ALIAS_BIT,\n    VK_IMAGE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkImageCreateFlagBits;\ntypedef VkFlags VkImageCreateFlags;\n\ntypedef enum VkSampleCountFlagBits {\n    VK_SAMPLE_COUNT_1_BIT = 0x00000001,\n    VK_SAMPLE_COUNT_2_BIT = 0x00000002,\n    VK_SAMPLE_COUNT_4_BIT = 0x00000004,\n    VK_SAMPLE_COUNT_8_BIT = 0x00000008,\n    VK_SAMPLE_COUNT_16_BIT = 0x00000010,\n    VK_SAMPLE_COUNT_32_BIT = 0x00000020,\n    VK_SAMPLE_COUNT_64_BIT = 0x00000040,\n    VK_SAMPLE_COUNT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkSampleCountFlagBits;\ntypedef VkFlags VkSampleCountFlags;\n\ntypedef enum VkImageUsageFlagBits {\n    VK_IMAGE_USAGE_TRANSFER_SRC_BIT = 0x00000001,\n    VK_IMAGE_USAGE_TRANSFER_DST_BIT = 0x00000002,\n    VK_IMAGE_USAGE_SAMPLED_BIT = 0x00000004,\n    VK_IMAGE_USAGE_STORAGE_BIT = 0x00000008,\n    VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT = 0x00000010,\n    VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000020,\n    VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT = 0x00000040,\n    VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT = 0x00000080,\n    VK_IMAGE_USAGE_HOST_TRANSFER_BIT = 0x00400000,\n    VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR = 0x00000400,\n    VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR = 0x00000800,\n    VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR = 0x00001000,\n    VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x00000200,\n    VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00000100,\n    VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR = 0x00002000,\n    VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR = 0x00004000,\n    VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR = 0x00008000,\n    VK_IMAGE_USAGE_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0x00080000,\n    VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI = 0x00040000,\n    VK_IMAGE_USAGE_SAMPLE_WEIGHT_BIT_QCOM = 0x00100000,\n    VK_IMAGE_USAGE_SAMPLE_BLOCK_MATCH_BIT_QCOM = 0x00200000,\n    VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR = 0x02000000,\n    VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR = 0x04000000,\n    VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV = VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,\n    VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT = VK_IMAGE_USAGE_HOST_TRANSFER_BIT,\n    VK_IMAGE_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkImageUsageFlagBits;\ntypedef VkFlags VkImageUsageFlags;\n\ntypedef enum VkInstanceCreateFlagBits {\n    VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR = 0x00000001,\n    VK_INSTANCE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkInstanceCreateFlagBits;\ntypedef VkFlags VkInstanceCreateFlags;\n\ntypedef enum VkMemoryHeapFlagBits {\n    VK_MEMORY_HEAP_DEVICE_LOCAL_BIT = 0x00000001,\n    VK_MEMORY_HEAP_MULTI_INSTANCE_BIT = 0x00000002,\n    VK_MEMORY_HEAP_MULTI_INSTANCE_BIT_KHR = VK_MEMORY_HEAP_MULTI_INSTANCE_BIT,\n    VK_MEMORY_HEAP_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkMemoryHeapFlagBits;\ntypedef VkFlags VkMemoryHeapFlags;\n\ntypedef enum VkMemoryPropertyFlagBits {\n    VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT = 0x00000001,\n    VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT = 0x00000002,\n    VK_MEMORY_PROPERTY_HOST_COHERENT_BIT = 0x00000004,\n    VK_MEMORY_PROPERTY_HOST_CACHED_BIT = 0x00000008,\n    VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT = 0x00000010,\n    VK_MEMORY_PROPERTY_PROTECTED_BIT = 0x00000020,\n    VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD = 0x00000040,\n    VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD = 0x00000080,\n    VK_MEMORY_PROPERTY_RDMA_CAPABLE_BIT_NV = 0x00000100,\n    VK_MEMORY_PROPERTY_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkMemoryPropertyFlagBits;\ntypedef VkFlags VkMemoryPropertyFlags;\n\ntypedef enum VkQueueFlagBits {\n    VK_QUEUE_GRAPHICS_BIT = 0x00000001,\n    VK_QUEUE_COMPUTE_BIT = 0x00000002,\n    VK_QUEUE_TRANSFER_BIT = 0x00000004,\n    VK_QUEUE_SPARSE_BINDING_BIT = 0x00000008,\n    VK_QUEUE_PROTECTED_BIT = 0x00000010,\n    VK_QUEUE_VIDEO_DECODE_BIT_KHR = 0x00000020,\n    VK_QUEUE_VIDEO_ENCODE_BIT_KHR = 0x00000040,\n    VK_QUEUE_OPTICAL_FLOW_BIT_NV = 0x00000100,\n    VK_QUEUE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkQueueFlagBits;\ntypedef VkFlags VkQueueFlags;\ntypedef VkFlags VkDeviceCreateFlags;\n\ntypedef enum VkDeviceQueueCreateFlagBits {\n    VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT = 0x00000001,\n    VK_DEVICE_QUEUE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkDeviceQueueCreateFlagBits;\ntypedef VkFlags VkDeviceQueueCreateFlags;\n\ntypedef enum VkPipelineStageFlagBits {\n    VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT = 0x00000001,\n    VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT = 0x00000002,\n    VK_PIPELINE_STAGE_VERTEX_INPUT_BIT = 0x00000004,\n    VK_PIPELINE_STAGE_VERTEX_SHADER_BIT = 0x00000008,\n    VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT = 0x00000010,\n    VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT = 0x00000020,\n    VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT = 0x00000040,\n    VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT = 0x00000080,\n    VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT = 0x00000100,\n    VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT = 0x00000200,\n    VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT = 0x00000400,\n    VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT = 0x00000800,\n    VK_PIPELINE_STAGE_TRANSFER_BIT = 0x00001000,\n    VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT = 0x00002000,\n    VK_PIPELINE_STAGE_HOST_BIT = 0x00004000,\n    VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT = 0x00008000,\n    VK_PIPELINE_STAGE_ALL_COMMANDS_BIT = 0x00010000,\n    VK_PIPELINE_STAGE_NONE = 0,\n    VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT = 0x01000000,\n    VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT = 0x00040000,\n    VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR = 0x02000000,\n    VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR = 0x00200000,\n    VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT = 0x00800000,\n    VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00400000,\n    VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV = 0x00020000,\n    VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT = 0x00080000,\n    VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT = 0x00100000,\n    VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV = VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,\n    VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_NV = VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR,\n    VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_NV = VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR,\n    VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV = VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT,\n    VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV = VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT,\n    VK_PIPELINE_STAGE_NONE_KHR = VK_PIPELINE_STAGE_NONE,\n    VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_EXT = VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV,\n    VK_PIPELINE_STAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkPipelineStageFlagBits;\ntypedef VkFlags VkPipelineStageFlags;\n\ntypedef enum VkMemoryMapFlagBits {\n    VK_MEMORY_MAP_PLACED_BIT_EXT = 0x00000001,\n    VK_MEMORY_MAP_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkMemoryMapFlagBits;\ntypedef VkFlags VkMemoryMapFlags;\n\ntypedef enum VkSparseMemoryBindFlagBits {\n    VK_SPARSE_MEMORY_BIND_METADATA_BIT = 0x00000001,\n    VK_SPARSE_MEMORY_BIND_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkSparseMemoryBindFlagBits;\ntypedef VkFlags VkSparseMemoryBindFlags;\n\ntypedef enum VkSparseImageFormatFlagBits {\n    VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT = 0x00000001,\n    VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT = 0x00000002,\n    VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT = 0x00000004,\n    VK_SPARSE_IMAGE_FORMAT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkSparseImageFormatFlagBits;\ntypedef VkFlags VkSparseImageFormatFlags;\n\ntypedef enum VkFenceCreateFlagBits {\n    VK_FENCE_CREATE_SIGNALED_BIT = 0x00000001,\n    VK_FENCE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkFenceCreateFlagBits;\ntypedef VkFlags VkFenceCreateFlags;\ntypedef VkFlags VkSemaphoreCreateFlags;\n\ntypedef enum VkEventCreateFlagBits {\n    VK_EVENT_CREATE_DEVICE_ONLY_BIT = 0x00000001,\n    VK_EVENT_CREATE_DEVICE_ONLY_BIT_KHR = VK_EVENT_CREATE_DEVICE_ONLY_BIT,\n    VK_EVENT_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkEventCreateFlagBits;\ntypedef VkFlags VkEventCreateFlags;\n\ntypedef enum VkQueryPipelineStatisticFlagBits {\n    VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT = 0x00000001,\n    VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT = 0x00000002,\n    VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT = 0x00000004,\n    VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT = 0x00000008,\n    VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT = 0x00000010,\n    VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT = 0x00000020,\n    VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT = 0x00000040,\n    VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT = 0x00000080,\n    VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT = 0x00000100,\n    VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT = 0x00000200,\n    VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT = 0x00000400,\n    VK_QUERY_PIPELINE_STATISTIC_TASK_SHADER_INVOCATIONS_BIT_EXT = 0x00000800,\n    VK_QUERY_PIPELINE_STATISTIC_MESH_SHADER_INVOCATIONS_BIT_EXT = 0x00001000,\n    VK_QUERY_PIPELINE_STATISTIC_CLUSTER_CULLING_SHADER_INVOCATIONS_BIT_HUAWEI = 0x00002000,\n    VK_QUERY_PIPELINE_STATISTIC_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkQueryPipelineStatisticFlagBits;\ntypedef VkFlags VkQueryPipelineStatisticFlags;\ntypedef VkFlags VkQueryPoolCreateFlags;\n\ntypedef enum VkQueryResultFlagBits {\n    VK_QUERY_RESULT_64_BIT = 0x00000001,\n    VK_QUERY_RESULT_WAIT_BIT = 0x00000002,\n    VK_QUERY_RESULT_WITH_AVAILABILITY_BIT = 0x00000004,\n    VK_QUERY_RESULT_PARTIAL_BIT = 0x00000008,\n    VK_QUERY_RESULT_WITH_STATUS_BIT_KHR = 0x00000010,\n    VK_QUERY_RESULT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkQueryResultFlagBits;\ntypedef VkFlags VkQueryResultFlags;\n\ntypedef enum VkBufferCreateFlagBits {\n    VK_BUFFER_CREATE_SPARSE_BINDING_BIT = 0x00000001,\n    VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT = 0x00000002,\n    VK_BUFFER_CREATE_SPARSE_ALIASED_BIT = 0x00000004,\n    VK_BUFFER_CREATE_PROTECTED_BIT = 0x00000008,\n    VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT = 0x00000010,\n    VK_BUFFER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = 0x00000020,\n    VK_BUFFER_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR = 0x00000040,\n    VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT = VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT,\n    VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR = VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT,\n    VK_BUFFER_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkBufferCreateFlagBits;\ntypedef VkFlags VkBufferCreateFlags;\n\ntypedef enum VkBufferUsageFlagBits {\n    VK_BUFFER_USAGE_TRANSFER_SRC_BIT = 0x00000001,\n    VK_BUFFER_USAGE_TRANSFER_DST_BIT = 0x00000002,\n    VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT = 0x00000004,\n    VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT = 0x00000008,\n    VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT = 0x00000010,\n    VK_BUFFER_USAGE_STORAGE_BUFFER_BIT = 0x00000020,\n    VK_BUFFER_USAGE_INDEX_BUFFER_BIT = 0x00000040,\n    VK_BUFFER_USAGE_VERTEX_BUFFER_BIT = 0x00000080,\n    VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT = 0x00000100,\n    VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT = 0x00020000,\n    VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR = 0x00002000,\n    VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR = 0x00004000,\n    VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT = 0x00000800,\n    VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT = 0x00001000,\n    VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT = 0x00000200,\n#ifdef VK_ENABLE_BETA_EXTENSIONS\n    VK_BUFFER_USAGE_EXECUTION_GRAPH_SCRATCH_BIT_AMDX = 0x02000000,\n#endif\n    VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR = 0x00080000,\n    VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR = 0x00100000,\n    VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR = 0x00000400,\n    VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR = 0x00008000,\n    VK_BUFFER_USAGE_VIDEO_ENCODE_SRC_BIT_KHR = 0x00010000,\n    VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT = 0x00200000,\n    VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT = 0x00400000,\n    VK_BUFFER_USAGE_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT = 0x04000000,\n    VK_BUFFER_USAGE_MICROMAP_BUILD_INPUT_READ_ONLY_BIT_EXT = 0x00800000,\n    VK_BUFFER_USAGE_MICROMAP_STORAGE_BIT_EXT = 0x01000000,\n    VK_BUFFER_USAGE_RAY_TRACING_BIT_NV = VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR,\n    VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,\n    VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,\n    VK_BUFFER_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkBufferUsageFlagBits;\ntypedef VkFlags VkBufferUsageFlags;\ntypedef VkFlags VkBufferViewCreateFlags;\n\ntypedef enum VkImageViewCreateFlagBits {\n    VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT = 0x00000001,\n    VK_IMAGE_VIEW_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = 0x00000004,\n    VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT = 0x00000002,\n    VK_IMAGE_VIEW_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkImageViewCreateFlagBits;\ntypedef VkFlags VkImageViewCreateFlags;\ntypedef VkFlags VkShaderModuleCreateFlags;\n\ntypedef enum VkPipelineCacheCreateFlagBits {\n    VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT = 0x00000001,\n    VK_PIPELINE_CACHE_CREATE_INTERNALLY_SYNCHRONIZED_MERGE_BIT_KHR = 0x00000008,\n    VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT = VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT,\n    VK_PIPELINE_CACHE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkPipelineCacheCreateFlagBits;\ntypedef VkFlags VkPipelineCacheCreateFlags;\n\ntypedef enum VkColorComponentFlagBits {\n    VK_COLOR_COMPONENT_R_BIT = 0x00000001,\n    VK_COLOR_COMPONENT_G_BIT = 0x00000002,\n    VK_COLOR_COMPONENT_B_BIT = 0x00000004,\n    VK_COLOR_COMPONENT_A_BIT = 0x00000008,\n    VK_COLOR_COMPONENT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkColorComponentFlagBits;\ntypedef VkFlags VkColorComponentFlags;\n\ntypedef enum VkPipelineCreateFlagBits {\n    VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT = 0x00000001,\n    VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT = 0x00000002,\n    VK_PIPELINE_CREATE_DERIVATIVE_BIT = 0x00000004,\n    VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT = 0x00000008,\n    VK_PIPELINE_CREATE_DISPATCH_BASE_BIT = 0x00000010,\n    VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT = 0x00000100,\n    VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT = 0x00000200,\n    VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT = 0x08000000,\n    VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT = 0x40000000,\n    VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR = 0x00004000,\n    VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR = 0x00008000,\n    VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR = 0x00010000,\n    VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR = 0x00020000,\n    VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR = 0x00001000,\n    VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR = 0x00002000,\n    VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR = 0x00080000,\n    VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV = 0x00000020,\n    VK_PIPELINE_CREATE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT = 0x00400000,\n    VK_PIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00200000,\n    VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR = 0x00000040,\n    VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR = 0x00000080,\n    VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV = 0x00040000,\n    VK_PIPELINE_CREATE_LIBRARY_BIT_KHR = 0x00000800,\n    VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT = 0x20000000,\n    VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT = 0x00800000,\n    VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT = 0x00000400,\n    VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV = 0x00100000,\n    VK_PIPELINE_CREATE_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0x02000000,\n    VK_PIPELINE_CREATE_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0x04000000,\n    VK_PIPELINE_CREATE_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT = 0x01000000,\n#ifdef VK_ENABLE_BETA_EXTENSIONS\n    VK_PIPELINE_CREATE_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV = 0x10000000,\n#endif\n    VK_PIPELINE_CREATE_DISPATCH_BASE = VK_PIPELINE_CREATE_DISPATCH_BASE_BIT,\n    VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT_KHR = VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT,\n    VK_PIPELINE_CREATE_DISPATCH_BASE_KHR = VK_PIPELINE_CREATE_DISPATCH_BASE,\n  // VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT is a deprecated alias\n    VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT = VK_PIPELINE_CREATE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT,\n  // VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR is a deprecated alias\n    VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = VK_PIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,\n    VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT = VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT,\n    VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT = VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT,\n    VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT_EXT = VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT,\n    VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT_EXT = VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT,\n    VK_PIPELINE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkPipelineCreateFlagBits;\ntypedef VkFlags VkPipelineCreateFlags;\n\ntypedef enum VkPipelineShaderStageCreateFlagBits {\n    VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT = 0x00000001,\n    VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT = 0x00000002,\n    VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT = VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT,\n    VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT = VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT,\n    VK_PIPELINE_SHADER_STAGE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkPipelineShaderStageCreateFlagBits;\ntypedef VkFlags VkPipelineShaderStageCreateFlags;\n\ntypedef enum VkShaderStageFlagBits {\n    VK_SHADER_STAGE_VERTEX_BIT = 0x00000001,\n    VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT = 0x00000002,\n    VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT = 0x00000004,\n    VK_SHADER_STAGE_GEOMETRY_BIT = 0x00000008,\n    VK_SHADER_STAGE_FRAGMENT_BIT = 0x00000010,\n    VK_SHADER_STAGE_COMPUTE_BIT = 0x00000020,\n    VK_SHADER_STAGE_ALL_GRAPHICS = 0x0000001F,\n    VK_SHADER_STAGE_ALL = 0x7FFFFFFF,\n    VK_SHADER_STAGE_RAYGEN_BIT_KHR = 0x00000100,\n    VK_SHADER_STAGE_ANY_HIT_BIT_KHR = 0x00000200,\n    VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR = 0x00000400,\n    VK_SHADER_STAGE_MISS_BIT_KHR = 0x00000800,\n    VK_SHADER_STAGE_INTERSECTION_BIT_KHR = 0x00001000,\n    VK_SHADER_STAGE_CALLABLE_BIT_KHR = 0x00002000,\n    VK_SHADER_STAGE_TASK_BIT_EXT = 0x00000040,\n    VK_SHADER_STAGE_MESH_BIT_EXT = 0x00000080,\n    VK_SHADER_STAGE_SUBPASS_SHADING_BIT_HUAWEI = 0x00004000,\n    VK_SHADER_STAGE_CLUSTER_CULLING_BIT_HUAWEI = 0x00080000,\n    VK_SHADER_STAGE_RAYGEN_BIT_NV = VK_SHADER_STAGE_RAYGEN_BIT_KHR,\n    VK_SHADER_STAGE_ANY_HIT_BIT_NV = VK_SHADER_STAGE_ANY_HIT_BIT_KHR,\n    VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV = VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR,\n    VK_SHADER_STAGE_MISS_BIT_NV = VK_SHADER_STAGE_MISS_BIT_KHR,\n    VK_SHADER_STAGE_INTERSECTION_BIT_NV = VK_SHADER_STAGE_INTERSECTION_BIT_KHR,\n    VK_SHADER_STAGE_CALLABLE_BIT_NV = VK_SHADER_STAGE_CALLABLE_BIT_KHR,\n    VK_SHADER_STAGE_TASK_BIT_NV = VK_SHADER_STAGE_TASK_BIT_EXT,\n    VK_SHADER_STAGE_MESH_BIT_NV = VK_SHADER_STAGE_MESH_BIT_EXT,\n    VK_SHADER_STAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkShaderStageFlagBits;\n\ntypedef enum VkCullModeFlagBits {\n    VK_CULL_MODE_NONE = 0,\n    VK_CULL_MODE_FRONT_BIT = 0x00000001,\n    VK_CULL_MODE_BACK_BIT = 0x00000002,\n    VK_CULL_MODE_FRONT_AND_BACK = 0x00000003,\n    VK_CULL_MODE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkCullModeFlagBits;\ntypedef VkFlags VkCullModeFlags;\ntypedef VkFlags VkPipelineVertexInputStateCreateFlags;\ntypedef VkFlags VkPipelineInputAssemblyStateCreateFlags;\ntypedef VkFlags VkPipelineTessellationStateCreateFlags;\ntypedef VkFlags VkPipelineViewportStateCreateFlags;\ntypedef VkFlags VkPipelineRasterizationStateCreateFlags;\ntypedef VkFlags VkPipelineMultisampleStateCreateFlags;\n\ntypedef enum VkPipelineDepthStencilStateCreateFlagBits {\n    VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT = 0x00000001,\n    VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT = 0x00000002,\n    VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_ARM = VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT,\n    VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_ARM = VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT,\n    VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkPipelineDepthStencilStateCreateFlagBits;\ntypedef VkFlags VkPipelineDepthStencilStateCreateFlags;\n\ntypedef enum VkPipelineColorBlendStateCreateFlagBits {\n    VK_PIPELINE_COLOR_BLEND_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_BIT_EXT = 0x00000001,\n    VK_PIPELINE_COLOR_BLEND_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_BIT_ARM = VK_PIPELINE_COLOR_BLEND_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_BIT_EXT,\n    VK_PIPELINE_COLOR_BLEND_STATE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkPipelineColorBlendStateCreateFlagBits;\ntypedef VkFlags VkPipelineColorBlendStateCreateFlags;\ntypedef VkFlags VkPipelineDynamicStateCreateFlags;\n\ntypedef enum VkPipelineLayoutCreateFlagBits {\n    VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT = 0x00000002,\n    VK_PIPELINE_LAYOUT_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkPipelineLayoutCreateFlagBits;\ntypedef VkFlags VkPipelineLayoutCreateFlags;\ntypedef VkFlags VkShaderStageFlags;\n\ntypedef enum VkSamplerCreateFlagBits {\n    VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT = 0x00000001,\n    VK_SAMPLER_CREATE_SUBSAMPLED_COARSE_RECONSTRUCTION_BIT_EXT = 0x00000002,\n    VK_SAMPLER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = 0x00000008,\n    VK_SAMPLER_CREATE_NON_SEAMLESS_CUBE_MAP_BIT_EXT = 0x00000004,\n    VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM = 0x00000010,\n    VK_SAMPLER_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkSamplerCreateFlagBits;\ntypedef VkFlags VkSamplerCreateFlags;\n\ntypedef enum VkDescriptorPoolCreateFlagBits {\n    VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT = 0x00000001,\n    VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT = 0x00000002,\n    VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_EXT = 0x00000004,\n    VK_DESCRIPTOR_POOL_CREATE_ALLOW_OVERALLOCATION_SETS_BIT_NV = 0x00000008,\n    VK_DESCRIPTOR_POOL_CREATE_ALLOW_OVERALLOCATION_POOLS_BIT_NV = 0x00000010,\n    VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT = VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT,\n    VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE = VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_EXT,\n    VK_DESCRIPTOR_POOL_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkDescriptorPoolCreateFlagBits;\ntypedef VkFlags VkDescriptorPoolCreateFlags;\ntypedef VkFlags VkDescriptorPoolResetFlags;\n\ntypedef enum VkDescriptorSetLayoutCreateFlagBits {\n    VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT = 0x00000002,\n    VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT = 0x00000001,\n    VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT = 0x00000010,\n    VK_DESCRIPTOR_SET_LAYOUT_CREATE_EMBEDDED_IMMUTABLE_SAMPLERS_BIT_EXT = 0x00000020,\n    VK_DESCRIPTOR_SET_LAYOUT_CREATE_INDIRECT_BINDABLE_BIT_NV = 0x00000080,\n    VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_EXT = 0x00000004,\n    VK_DESCRIPTOR_SET_LAYOUT_CREATE_PER_STAGE_BIT_NV = 0x00000040,\n    VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT,\n    VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT,\n    VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE = VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_EXT,\n    VK_DESCRIPTOR_SET_LAYOUT_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkDescriptorSetLayoutCreateFlagBits;\ntypedef VkFlags VkDescriptorSetLayoutCreateFlags;\n\ntypedef enum VkAttachmentDescriptionFlagBits {\n    VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT = 0x00000001,\n    VK_ATTACHMENT_DESCRIPTION_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkAttachmentDescriptionFlagBits;\ntypedef VkFlags VkAttachmentDescriptionFlags;\n\ntypedef enum VkDependencyFlagBits {\n    VK_DEPENDENCY_BY_REGION_BIT = 0x00000001,\n    VK_DEPENDENCY_DEVICE_GROUP_BIT = 0x00000004,\n    VK_DEPENDENCY_VIEW_LOCAL_BIT = 0x00000002,\n    VK_DEPENDENCY_FEEDBACK_LOOP_BIT_EXT = 0x00000008,\n    VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR = 0x00000020,\n    VK_DEPENDENCY_VIEW_LOCAL_BIT_KHR = VK_DEPENDENCY_VIEW_LOCAL_BIT,\n    VK_DEPENDENCY_DEVICE_GROUP_BIT_KHR = VK_DEPENDENCY_DEVICE_GROUP_BIT,\n    VK_DEPENDENCY_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkDependencyFlagBits;\ntypedef VkFlags VkDependencyFlags;\n\ntypedef enum VkFramebufferCreateFlagBits {\n    VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT = 0x00000001,\n    VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR = VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,\n    VK_FRAMEBUFFER_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkFramebufferCreateFlagBits;\ntypedef VkFlags VkFramebufferCreateFlags;\n\ntypedef enum VkRenderPassCreateFlagBits {\n    VK_RENDER_PASS_CREATE_TRANSFORM_BIT_QCOM = 0x00000002,\n    VK_RENDER_PASS_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkRenderPassCreateFlagBits;\ntypedef VkFlags VkRenderPassCreateFlags;\n\ntypedef enum VkSubpassDescriptionFlagBits {\n    VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX = 0x00000001,\n    VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX = 0x00000002,\n    VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM = 0x00000004,\n    VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM = 0x00000008,\n    VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_BIT_EXT = 0x00000010,\n    VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT = 0x00000020,\n    VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT = 0x00000040,\n    VK_SUBPASS_DESCRIPTION_ENABLE_LEGACY_DITHERING_BIT_EXT = 0x00000080,\n    VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_BIT_ARM = VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_BIT_EXT,\n    VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_ARM = VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT,\n    VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_ARM = VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT,\n    VK_SUBPASS_DESCRIPTION_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkSubpassDescriptionFlagBits;\ntypedef VkFlags VkSubpassDescriptionFlags;\n\ntypedef enum VkCommandPoolCreateFlagBits {\n    VK_COMMAND_POOL_CREATE_TRANSIENT_BIT = 0x00000001,\n    VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT = 0x00000002,\n    VK_COMMAND_POOL_CREATE_PROTECTED_BIT = 0x00000004,\n    VK_COMMAND_POOL_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkCommandPoolCreateFlagBits;\ntypedef VkFlags VkCommandPoolCreateFlags;\n\ntypedef enum VkCommandPoolResetFlagBits {\n    VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT = 0x00000001,\n    VK_COMMAND_POOL_RESET_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkCommandPoolResetFlagBits;\ntypedef VkFlags VkCommandPoolResetFlags;\n\ntypedef enum VkCommandBufferUsageFlagBits {\n    VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT = 0x00000001,\n    VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT = 0x00000002,\n    VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT = 0x00000004,\n    VK_COMMAND_BUFFER_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkCommandBufferUsageFlagBits;\ntypedef VkFlags VkCommandBufferUsageFlags;\n\ntypedef enum VkQueryControlFlagBits {\n    VK_QUERY_CONTROL_PRECISE_BIT = 0x00000001,\n    VK_QUERY_CONTROL_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkQueryControlFlagBits;\ntypedef VkFlags VkQueryControlFlags;\n\ntypedef enum VkCommandBufferResetFlagBits {\n    VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT = 0x00000001,\n    VK_COMMAND_BUFFER_RESET_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkCommandBufferResetFlagBits;\ntypedef VkFlags VkCommandBufferResetFlags;\n\ntypedef enum VkStencilFaceFlagBits {\n    VK_STENCIL_FACE_FRONT_BIT = 0x00000001,\n    VK_STENCIL_FACE_BACK_BIT = 0x00000002,\n    VK_STENCIL_FACE_FRONT_AND_BACK = 0x00000003,\n  // VK_STENCIL_FRONT_AND_BACK is a deprecated alias\n    VK_STENCIL_FRONT_AND_BACK = VK_STENCIL_FACE_FRONT_AND_BACK,\n    VK_STENCIL_FACE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkStencilFaceFlagBits;\ntypedef VkFlags VkStencilFaceFlags;\ntypedef struct VkExtent2D {\n    uint32_t    width;\n    uint32_t    height;\n} VkExtent2D;\n\ntypedef struct VkExtent3D {\n    uint32_t    width;\n    uint32_t    height;\n    uint32_t    depth;\n} VkExtent3D;\n\ntypedef struct VkOffset2D {\n    int32_t    x;\n    int32_t    y;\n} VkOffset2D;\n\ntypedef struct VkOffset3D {\n    int32_t    x;\n    int32_t    y;\n    int32_t    z;\n} VkOffset3D;\n\ntypedef struct VkRect2D {\n    VkOffset2D    offset;\n    VkExtent2D    extent;\n} VkRect2D;\n\ntypedef struct VkBaseInStructure {\n    VkStructureType                    sType;\n    const struct VkBaseInStructure*    pNext;\n} VkBaseInStructure;\n\ntypedef struct VkBaseOutStructure {\n    VkStructureType               sType;\n    struct VkBaseOutStructure*    pNext;\n} VkBaseOutStructure;\n\ntypedef struct VkBufferMemoryBarrier {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkAccessFlags      srcAccessMask;\n    VkAccessFlags      dstAccessMask;\n    uint32_t           srcQueueFamilyIndex;\n    uint32_t           dstQueueFamilyIndex;\n    VkBuffer           buffer;\n    VkDeviceSize       offset;\n    VkDeviceSize       size;\n} VkBufferMemoryBarrier;\n\ntypedef struct VkDispatchIndirectCommand {\n    uint32_t    x;\n    uint32_t    y;\n    uint32_t    z;\n} VkDispatchIndirectCommand;\n\ntypedef struct VkDrawIndexedIndirectCommand {\n    uint32_t    indexCount;\n    uint32_t    instanceCount;\n    uint32_t    firstIndex;\n    int32_t     vertexOffset;\n    uint32_t    firstInstance;\n} VkDrawIndexedIndirectCommand;\n\ntypedef struct VkDrawIndirectCommand {\n    uint32_t    vertexCount;\n    uint32_t    instanceCount;\n    uint32_t    firstVertex;\n    uint32_t    firstInstance;\n} VkDrawIndirectCommand;\n\ntypedef struct VkImageSubresourceRange {\n    VkImageAspectFlags    aspectMask;\n    uint32_t              baseMipLevel;\n    uint32_t              levelCount;\n    uint32_t              baseArrayLayer;\n    uint32_t              layerCount;\n} VkImageSubresourceRange;\n\ntypedef struct VkImageMemoryBarrier {\n    VkStructureType            sType;\n    const void*                pNext;\n    VkAccessFlags              srcAccessMask;\n    VkAccessFlags              dstAccessMask;\n    VkImageLayout              oldLayout;\n    VkImageLayout              newLayout;\n    uint32_t                   srcQueueFamilyIndex;\n    uint32_t                   dstQueueFamilyIndex;\n    VkImage                    image;\n    VkImageSubresourceRange    subresourceRange;\n} VkImageMemoryBarrier;\n\ntypedef struct VkMemoryBarrier {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkAccessFlags      srcAccessMask;\n    VkAccessFlags      dstAccessMask;\n} VkMemoryBarrier;\n\ntypedef struct VkPipelineCacheHeaderVersionOne {\n    uint32_t                        headerSize;\n    VkPipelineCacheHeaderVersion    headerVersion;\n    uint32_t                        vendorID;\n    uint32_t                        deviceID;\n    uint8_t                         pipelineCacheUUID[VK_UUID_SIZE];\n} VkPipelineCacheHeaderVersionOne;\n\ntypedef void* (VKAPI_PTR *PFN_vkAllocationFunction)(\n    void*                                       pUserData,\n    size_t                                      size,\n    size_t                                      alignment,\n    VkSystemAllocationScope                     allocationScope);\n\ntypedef void (VKAPI_PTR *PFN_vkFreeFunction)(\n    void*                                       pUserData,\n    void*                                       pMemory);\n\ntypedef void (VKAPI_PTR *PFN_vkInternalAllocationNotification)(\n    void*                                       pUserData,\n    size_t                                      size,\n    VkInternalAllocationType                    allocationType,\n    VkSystemAllocationScope                     allocationScope);\n\ntypedef void (VKAPI_PTR *PFN_vkInternalFreeNotification)(\n    void*                                       pUserData,\n    size_t                                      size,\n    VkInternalAllocationType                    allocationType,\n    VkSystemAllocationScope                     allocationScope);\n\ntypedef void* (VKAPI_PTR *PFN_vkReallocationFunction)(\n    void*                                       pUserData,\n    void*                                       pOriginal,\n    size_t                                      size,\n    size_t                                      alignment,\n    VkSystemAllocationScope                     allocationScope);\n\ntypedef void (VKAPI_PTR *PFN_vkVoidFunction)(void);\ntypedef struct VkAllocationCallbacks {\n    void*                                   pUserData;\n    PFN_vkAllocationFunction                pfnAllocation;\n    PFN_vkReallocationFunction              pfnReallocation;\n    PFN_vkFreeFunction                      pfnFree;\n    PFN_vkInternalAllocationNotification    pfnInternalAllocation;\n    PFN_vkInternalFreeNotification          pfnInternalFree;\n} VkAllocationCallbacks;\n\ntypedef struct VkApplicationInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    const char*        pApplicationName;\n    uint32_t           applicationVersion;\n    const char*        pEngineName;\n    uint32_t           engineVersion;\n    uint32_t           apiVersion;\n} VkApplicationInfo;\n\ntypedef struct VkFormatProperties {\n    VkFormatFeatureFlags    linearTilingFeatures;\n    VkFormatFeatureFlags    optimalTilingFeatures;\n    VkFormatFeatureFlags    bufferFeatures;\n} VkFormatProperties;\n\ntypedef struct VkImageFormatProperties {\n    VkExtent3D            maxExtent;\n    uint32_t              maxMipLevels;\n    uint32_t              maxArrayLayers;\n    VkSampleCountFlags    sampleCounts;\n    VkDeviceSize          maxResourceSize;\n} VkImageFormatProperties;\n\ntypedef struct VkInstanceCreateInfo {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkInstanceCreateFlags       flags;\n    const VkApplicationInfo*    pApplicationInfo;\n    uint32_t                    enabledLayerCount;\n    const char* const*          ppEnabledLayerNames;\n    uint32_t                    enabledExtensionCount;\n    const char* const*          ppEnabledExtensionNames;\n} VkInstanceCreateInfo;\n\ntypedef struct VkMemoryHeap {\n    VkDeviceSize         size;\n    VkMemoryHeapFlags    flags;\n} VkMemoryHeap;\n\ntypedef struct VkMemoryType {\n    VkMemoryPropertyFlags    propertyFlags;\n    uint32_t                 heapIndex;\n} VkMemoryType;\n\ntypedef struct VkPhysicalDeviceFeatures {\n    VkBool32    robustBufferAccess;\n    VkBool32    fullDrawIndexUint32;\n    VkBool32    imageCubeArray;\n    VkBool32    independentBlend;\n    VkBool32    geometryShader;\n    VkBool32    tessellationShader;\n    VkBool32    sampleRateShading;\n    VkBool32    dualSrcBlend;\n    VkBool32    logicOp;\n    VkBool32    multiDrawIndirect;\n    VkBool32    drawIndirectFirstInstance;\n    VkBool32    depthClamp;\n    VkBool32    depthBiasClamp;\n    VkBool32    fillModeNonSolid;\n    VkBool32    depthBounds;\n    VkBool32    wideLines;\n    VkBool32    largePoints;\n    VkBool32    alphaToOne;\n    VkBool32    multiViewport;\n    VkBool32    samplerAnisotropy;\n    VkBool32    textureCompressionETC2;\n    VkBool32    textureCompressionASTC_LDR;\n    VkBool32    textureCompressionBC;\n    VkBool32    occlusionQueryPrecise;\n    VkBool32    pipelineStatisticsQuery;\n    VkBool32    vertexPipelineStoresAndAtomics;\n    VkBool32    fragmentStoresAndAtomics;\n    VkBool32    shaderTessellationAndGeometryPointSize;\n    VkBool32    shaderImageGatherExtended;\n    VkBool32    shaderStorageImageExtendedFormats;\n    VkBool32    shaderStorageImageMultisample;\n    VkBool32    shaderStorageImageReadWithoutFormat;\n    VkBool32    shaderStorageImageWriteWithoutFormat;\n    VkBool32    shaderUniformBufferArrayDynamicIndexing;\n    VkBool32    shaderSampledImageArrayDynamicIndexing;\n    VkBool32    shaderStorageBufferArrayDynamicIndexing;\n    VkBool32    shaderStorageImageArrayDynamicIndexing;\n    VkBool32    shaderClipDistance;\n    VkBool32    shaderCullDistance;\n    VkBool32    shaderFloat64;\n    VkBool32    shaderInt64;\n    VkBool32    shaderInt16;\n    VkBool32    shaderResourceResidency;\n    VkBool32    shaderResourceMinLod;\n    VkBool32    sparseBinding;\n    VkBool32    sparseResidencyBuffer;\n    VkBool32    sparseResidencyImage2D;\n    VkBool32    sparseResidencyImage3D;\n    VkBool32    sparseResidency2Samples;\n    VkBool32    sparseResidency4Samples;\n    VkBool32    sparseResidency8Samples;\n    VkBool32    sparseResidency16Samples;\n    VkBool32    sparseResidencyAliased;\n    VkBool32    variableMultisampleRate;\n    VkBool32    inheritedQueries;\n} VkPhysicalDeviceFeatures;\n\ntypedef struct VkPhysicalDeviceLimits {\n    uint32_t              maxImageDimension1D;\n    uint32_t              maxImageDimension2D;\n    uint32_t              maxImageDimension3D;\n    uint32_t              maxImageDimensionCube;\n    uint32_t              maxImageArrayLayers;\n    uint32_t              maxTexelBufferElements;\n    uint32_t              maxUniformBufferRange;\n    uint32_t              maxStorageBufferRange;\n    uint32_t              maxPushConstantsSize;\n    uint32_t              maxMemoryAllocationCount;\n    uint32_t              maxSamplerAllocationCount;\n    VkDeviceSize          bufferImageGranularity;\n    VkDeviceSize          sparseAddressSpaceSize;\n    uint32_t              maxBoundDescriptorSets;\n    uint32_t              maxPerStageDescriptorSamplers;\n    uint32_t              maxPerStageDescriptorUniformBuffers;\n    uint32_t              maxPerStageDescriptorStorageBuffers;\n    uint32_t              maxPerStageDescriptorSampledImages;\n    uint32_t              maxPerStageDescriptorStorageImages;\n    uint32_t              maxPerStageDescriptorInputAttachments;\n    uint32_t              maxPerStageResources;\n    uint32_t              maxDescriptorSetSamplers;\n    uint32_t              maxDescriptorSetUniformBuffers;\n    uint32_t              maxDescriptorSetUniformBuffersDynamic;\n    uint32_t              maxDescriptorSetStorageBuffers;\n    uint32_t              maxDescriptorSetStorageBuffersDynamic;\n    uint32_t              maxDescriptorSetSampledImages;\n    uint32_t              maxDescriptorSetStorageImages;\n    uint32_t              maxDescriptorSetInputAttachments;\n    uint32_t              maxVertexInputAttributes;\n    uint32_t              maxVertexInputBindings;\n    uint32_t              maxVertexInputAttributeOffset;\n    uint32_t              maxVertexInputBindingStride;\n    uint32_t              maxVertexOutputComponents;\n    uint32_t              maxTessellationGenerationLevel;\n    uint32_t              maxTessellationPatchSize;\n    uint32_t              maxTessellationControlPerVertexInputComponents;\n    uint32_t              maxTessellationControlPerVertexOutputComponents;\n    uint32_t              maxTessellationControlPerPatchOutputComponents;\n    uint32_t              maxTessellationControlTotalOutputComponents;\n    uint32_t              maxTessellationEvaluationInputComponents;\n    uint32_t              maxTessellationEvaluationOutputComponents;\n    uint32_t              maxGeometryShaderInvocations;\n    uint32_t              maxGeometryInputComponents;\n    uint32_t              maxGeometryOutputComponents;\n    uint32_t              maxGeometryOutputVertices;\n    uint32_t              maxGeometryTotalOutputComponents;\n    uint32_t              maxFragmentInputComponents;\n    uint32_t              maxFragmentOutputAttachments;\n    uint32_t              maxFragmentDualSrcAttachments;\n    uint32_t              maxFragmentCombinedOutputResources;\n    uint32_t              maxComputeSharedMemorySize;\n    uint32_t              maxComputeWorkGroupCount[3];\n    uint32_t              maxComputeWorkGroupInvocations;\n    uint32_t              maxComputeWorkGroupSize[3];\n    uint32_t              subPixelPrecisionBits;\n    uint32_t              subTexelPrecisionBits;\n    uint32_t              mipmapPrecisionBits;\n    uint32_t              maxDrawIndexedIndexValue;\n    uint32_t              maxDrawIndirectCount;\n    float                 maxSamplerLodBias;\n    float                 maxSamplerAnisotropy;\n    uint32_t              maxViewports;\n    uint32_t              maxViewportDimensions[2];\n    float                 viewportBoundsRange[2];\n    uint32_t              viewportSubPixelBits;\n    size_t                minMemoryMapAlignment;\n    VkDeviceSize          minTexelBufferOffsetAlignment;\n    VkDeviceSize          minUniformBufferOffsetAlignment;\n    VkDeviceSize          minStorageBufferOffsetAlignment;\n    int32_t               minTexelOffset;\n    uint32_t              maxTexelOffset;\n    int32_t               minTexelGatherOffset;\n    uint32_t              maxTexelGatherOffset;\n    float                 minInterpolationOffset;\n    float                 maxInterpolationOffset;\n    uint32_t              subPixelInterpolationOffsetBits;\n    uint32_t              maxFramebufferWidth;\n    uint32_t              maxFramebufferHeight;\n    uint32_t              maxFramebufferLayers;\n    VkSampleCountFlags    framebufferColorSampleCounts;\n    VkSampleCountFlags    framebufferDepthSampleCounts;\n    VkSampleCountFlags    framebufferStencilSampleCounts;\n    VkSampleCountFlags    framebufferNoAttachmentsSampleCounts;\n    uint32_t              maxColorAttachments;\n    VkSampleCountFlags    sampledImageColorSampleCounts;\n    VkSampleCountFlags    sampledImageIntegerSampleCounts;\n    VkSampleCountFlags    sampledImageDepthSampleCounts;\n    VkSampleCountFlags    sampledImageStencilSampleCounts;\n    VkSampleCountFlags    storageImageSampleCounts;\n    uint32_t              maxSampleMaskWords;\n    VkBool32              timestampComputeAndGraphics;\n    float                 timestampPeriod;\n    uint32_t              maxClipDistances;\n    uint32_t              maxCullDistances;\n    uint32_t              maxCombinedClipAndCullDistances;\n    uint32_t              discreteQueuePriorities;\n    float                 pointSizeRange[2];\n    float                 lineWidthRange[2];\n    float                 pointSizeGranularity;\n    float                 lineWidthGranularity;\n    VkBool32              strictLines;\n    VkBool32              standardSampleLocations;\n    VkDeviceSize          optimalBufferCopyOffsetAlignment;\n    VkDeviceSize          optimalBufferCopyRowPitchAlignment;\n    VkDeviceSize          nonCoherentAtomSize;\n} VkPhysicalDeviceLimits;\n\ntypedef struct VkPhysicalDeviceMemoryProperties {\n    uint32_t        memoryTypeCount;\n    VkMemoryType    memoryTypes[VK_MAX_MEMORY_TYPES];\n    uint32_t        memoryHeapCount;\n    VkMemoryHeap    memoryHeaps[VK_MAX_MEMORY_HEAPS];\n} VkPhysicalDeviceMemoryProperties;\n\ntypedef struct VkPhysicalDeviceSparseProperties {\n    VkBool32    residencyStandard2DBlockShape;\n    VkBool32    residencyStandard2DMultisampleBlockShape;\n    VkBool32    residencyStandard3DBlockShape;\n    VkBool32    residencyAlignedMipSize;\n    VkBool32    residencyNonResidentStrict;\n} VkPhysicalDeviceSparseProperties;\n\ntypedef struct VkPhysicalDeviceProperties {\n    uint32_t                            apiVersion;\n    uint32_t                            driverVersion;\n    uint32_t                            vendorID;\n    uint32_t                            deviceID;\n    VkPhysicalDeviceType                deviceType;\n    char                                deviceName[VK_MAX_PHYSICAL_DEVICE_NAME_SIZE];\n    uint8_t                             pipelineCacheUUID[VK_UUID_SIZE];\n    VkPhysicalDeviceLimits              limits;\n    VkPhysicalDeviceSparseProperties    sparseProperties;\n} VkPhysicalDeviceProperties;\n\ntypedef struct VkQueueFamilyProperties {\n    VkQueueFlags    queueFlags;\n    uint32_t        queueCount;\n    uint32_t        timestampValidBits;\n    VkExtent3D      minImageTransferGranularity;\n} VkQueueFamilyProperties;\n\ntypedef struct VkDeviceQueueCreateInfo {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkDeviceQueueCreateFlags    flags;\n    uint32_t                    queueFamilyIndex;\n    uint32_t                    queueCount;\n    const float*                pQueuePriorities;\n} VkDeviceQueueCreateInfo;\n\ntypedef struct VkDeviceCreateInfo {\n    VkStructureType                    sType;\n    const void*                        pNext;\n    VkDeviceCreateFlags                flags;\n    uint32_t                           queueCreateInfoCount;\n    const VkDeviceQueueCreateInfo*     pQueueCreateInfos;\n    // enabledLayerCount is deprecated and should not be used\n    uint32_t                           enabledLayerCount;\n    // ppEnabledLayerNames is deprecated and should not be used\n    const char* const*                 ppEnabledLayerNames;\n    uint32_t                           enabledExtensionCount;\n    const char* const*                 ppEnabledExtensionNames;\n    const VkPhysicalDeviceFeatures*    pEnabledFeatures;\n} VkDeviceCreateInfo;\n\ntypedef struct VkExtensionProperties {\n    char        extensionName[VK_MAX_EXTENSION_NAME_SIZE];\n    uint32_t    specVersion;\n} VkExtensionProperties;\n\ntypedef struct VkLayerProperties {\n    char        layerName[VK_MAX_EXTENSION_NAME_SIZE];\n    uint32_t    specVersion;\n    uint32_t    implementationVersion;\n    char        description[VK_MAX_DESCRIPTION_SIZE];\n} VkLayerProperties;\n\ntypedef struct VkSubmitInfo {\n    VkStructureType                sType;\n    const void*                    pNext;\n    uint32_t                       waitSemaphoreCount;\n    const VkSemaphore*             pWaitSemaphores;\n    const VkPipelineStageFlags*    pWaitDstStageMask;\n    uint32_t                       commandBufferCount;\n    const VkCommandBuffer*         pCommandBuffers;\n    uint32_t                       signalSemaphoreCount;\n    const VkSemaphore*             pSignalSemaphores;\n} VkSubmitInfo;\n\ntypedef struct VkMappedMemoryRange {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkDeviceMemory     memory;\n    VkDeviceSize       offset;\n    VkDeviceSize       size;\n} VkMappedMemoryRange;\n\ntypedef struct VkMemoryAllocateInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkDeviceSize       allocationSize;\n    uint32_t           memoryTypeIndex;\n} VkMemoryAllocateInfo;\n\ntypedef struct VkMemoryRequirements {\n    VkDeviceSize    size;\n    VkDeviceSize    alignment;\n    uint32_t        memoryTypeBits;\n} VkMemoryRequirements;\n\ntypedef struct VkSparseMemoryBind {\n    VkDeviceSize               resourceOffset;\n    VkDeviceSize               size;\n    VkDeviceMemory             memory;\n    VkDeviceSize               memoryOffset;\n    VkSparseMemoryBindFlags    flags;\n} VkSparseMemoryBind;\n\ntypedef struct VkSparseBufferMemoryBindInfo {\n    VkBuffer                     buffer;\n    uint32_t                     bindCount;\n    const VkSparseMemoryBind*    pBinds;\n} VkSparseBufferMemoryBindInfo;\n\ntypedef struct VkSparseImageOpaqueMemoryBindInfo {\n    VkImage                      image;\n    uint32_t                     bindCount;\n    const VkSparseMemoryBind*    pBinds;\n} VkSparseImageOpaqueMemoryBindInfo;\n\ntypedef struct VkImageSubresource {\n    VkImageAspectFlags    aspectMask;\n    uint32_t              mipLevel;\n    uint32_t              arrayLayer;\n} VkImageSubresource;\n\ntypedef struct VkSparseImageMemoryBind {\n    VkImageSubresource         subresource;\n    VkOffset3D                 offset;\n    VkExtent3D                 extent;\n    VkDeviceMemory             memory;\n    VkDeviceSize               memoryOffset;\n    VkSparseMemoryBindFlags    flags;\n} VkSparseImageMemoryBind;\n\ntypedef struct VkSparseImageMemoryBindInfo {\n    VkImage                           image;\n    uint32_t                          bindCount;\n    const VkSparseImageMemoryBind*    pBinds;\n} VkSparseImageMemoryBindInfo;\n\ntypedef struct VkBindSparseInfo {\n    VkStructureType                             sType;\n    const void*                                 pNext;\n    uint32_t                                    waitSemaphoreCount;\n    const VkSemaphore*                          pWaitSemaphores;\n    uint32_t                                    bufferBindCount;\n    const VkSparseBufferMemoryBindInfo*         pBufferBinds;\n    uint32_t                                    imageOpaqueBindCount;\n    const VkSparseImageOpaqueMemoryBindInfo*    pImageOpaqueBinds;\n    uint32_t                                    imageBindCount;\n    const VkSparseImageMemoryBindInfo*          pImageBinds;\n    uint32_t                                    signalSemaphoreCount;\n    const VkSemaphore*                          pSignalSemaphores;\n} VkBindSparseInfo;\n\ntypedef struct VkSparseImageFormatProperties {\n    VkImageAspectFlags          aspectMask;\n    VkExtent3D                  imageGranularity;\n    VkSparseImageFormatFlags    flags;\n} VkSparseImageFormatProperties;\n\ntypedef struct VkSparseImageMemoryRequirements {\n    VkSparseImageFormatProperties    formatProperties;\n    uint32_t                         imageMipTailFirstLod;\n    VkDeviceSize                     imageMipTailSize;\n    VkDeviceSize                     imageMipTailOffset;\n    VkDeviceSize                     imageMipTailStride;\n} VkSparseImageMemoryRequirements;\n\ntypedef struct VkFenceCreateInfo {\n    VkStructureType       sType;\n    const void*           pNext;\n    VkFenceCreateFlags    flags;\n} VkFenceCreateInfo;\n\ntypedef struct VkSemaphoreCreateInfo {\n    VkStructureType           sType;\n    const void*               pNext;\n    VkSemaphoreCreateFlags    flags;\n} VkSemaphoreCreateInfo;\n\ntypedef struct VkEventCreateInfo {\n    VkStructureType       sType;\n    const void*           pNext;\n    VkEventCreateFlags    flags;\n} VkEventCreateInfo;\n\ntypedef struct VkQueryPoolCreateInfo {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkQueryPoolCreateFlags           flags;\n    VkQueryType                      queryType;\n    uint32_t                         queryCount;\n    VkQueryPipelineStatisticFlags    pipelineStatistics;\n} VkQueryPoolCreateInfo;\n\ntypedef struct VkBufferCreateInfo {\n    VkStructureType        sType;\n    const void*            pNext;\n    VkBufferCreateFlags    flags;\n    VkDeviceSize           size;\n    VkBufferUsageFlags     usage;\n    VkSharingMode          sharingMode;\n    uint32_t               queueFamilyIndexCount;\n    const uint32_t*        pQueueFamilyIndices;\n} VkBufferCreateInfo;\n\ntypedef struct VkBufferViewCreateInfo {\n    VkStructureType            sType;\n    const void*                pNext;\n    VkBufferViewCreateFlags    flags;\n    VkBuffer                   buffer;\n    VkFormat                   format;\n    VkDeviceSize               offset;\n    VkDeviceSize               range;\n} VkBufferViewCreateInfo;\n\ntypedef struct VkImageCreateInfo {\n    VkStructureType          sType;\n    const void*              pNext;\n    VkImageCreateFlags       flags;\n    VkImageType              imageType;\n    VkFormat                 format;\n    VkExtent3D               extent;\n    uint32_t                 mipLevels;\n    uint32_t                 arrayLayers;\n    VkSampleCountFlagBits    samples;\n    VkImageTiling            tiling;\n    VkImageUsageFlags        usage;\n    VkSharingMode            sharingMode;\n    uint32_t                 queueFamilyIndexCount;\n    const uint32_t*          pQueueFamilyIndices;\n    VkImageLayout            initialLayout;\n} VkImageCreateInfo;\n\ntypedef struct VkSubresourceLayout {\n    VkDeviceSize    offset;\n    VkDeviceSize    size;\n    VkDeviceSize    rowPitch;\n    VkDeviceSize    arrayPitch;\n    VkDeviceSize    depthPitch;\n} VkSubresourceLayout;\n\ntypedef struct VkComponentMapping {\n    VkComponentSwizzle    r;\n    VkComponentSwizzle    g;\n    VkComponentSwizzle    b;\n    VkComponentSwizzle    a;\n} VkComponentMapping;\n\ntypedef struct VkImageViewCreateInfo {\n    VkStructureType            sType;\n    const void*                pNext;\n    VkImageViewCreateFlags     flags;\n    VkImage                    image;\n    VkImageViewType            viewType;\n    VkFormat                   format;\n    VkComponentMapping         components;\n    VkImageSubresourceRange    subresourceRange;\n} VkImageViewCreateInfo;\n\ntypedef struct VkShaderModuleCreateInfo {\n    VkStructureType              sType;\n    const void*                  pNext;\n    VkShaderModuleCreateFlags    flags;\n    size_t                       codeSize;\n    const uint32_t*              pCode;\n} VkShaderModuleCreateInfo;\n\ntypedef struct VkPipelineCacheCreateInfo {\n    VkStructureType               sType;\n    const void*                   pNext;\n    VkPipelineCacheCreateFlags    flags;\n    size_t                        initialDataSize;\n    const void*                   pInitialData;\n} VkPipelineCacheCreateInfo;\n\ntypedef struct VkSpecializationMapEntry {\n    uint32_t    constantID;\n    uint32_t    offset;\n    size_t      size;\n} VkSpecializationMapEntry;\n\ntypedef struct VkSpecializationInfo {\n    uint32_t                           mapEntryCount;\n    const VkSpecializationMapEntry*    pMapEntries;\n    size_t                             dataSize;\n    const void*                        pData;\n} VkSpecializationInfo;\n\ntypedef struct VkPipelineShaderStageCreateInfo {\n    VkStructureType                     sType;\n    const void*                         pNext;\n    VkPipelineShaderStageCreateFlags    flags;\n    VkShaderStageFlagBits               stage;\n    VkShaderModule                      module;\n    const char*                         pName;\n    const VkSpecializationInfo*         pSpecializationInfo;\n} VkPipelineShaderStageCreateInfo;\n\ntypedef struct VkComputePipelineCreateInfo {\n    VkStructureType                    sType;\n    const void*                        pNext;\n    VkPipelineCreateFlags              flags;\n    VkPipelineShaderStageCreateInfo    stage;\n    VkPipelineLayout                   layout;\n    VkPipeline                         basePipelineHandle;\n    int32_t                            basePipelineIndex;\n} VkComputePipelineCreateInfo;\n\ntypedef struct VkVertexInputBindingDescription {\n    uint32_t             binding;\n    uint32_t             stride;\n    VkVertexInputRate    inputRate;\n} VkVertexInputBindingDescription;\n\ntypedef struct VkVertexInputAttributeDescription {\n    uint32_t    location;\n    uint32_t    binding;\n    VkFormat    format;\n    uint32_t    offset;\n} VkVertexInputAttributeDescription;\n\ntypedef struct VkPipelineVertexInputStateCreateInfo {\n    VkStructureType                             sType;\n    const void*                                 pNext;\n    VkPipelineVertexInputStateCreateFlags       flags;\n    uint32_t                                    vertexBindingDescriptionCount;\n    const VkVertexInputBindingDescription*      pVertexBindingDescriptions;\n    uint32_t                                    vertexAttributeDescriptionCount;\n    const VkVertexInputAttributeDescription*    pVertexAttributeDescriptions;\n} VkPipelineVertexInputStateCreateInfo;\n\ntypedef struct VkPipelineInputAssemblyStateCreateInfo {\n    VkStructureType                            sType;\n    const void*                                pNext;\n    VkPipelineInputAssemblyStateCreateFlags    flags;\n    VkPrimitiveTopology                        topology;\n    VkBool32                                   primitiveRestartEnable;\n} VkPipelineInputAssemblyStateCreateInfo;\n\ntypedef struct VkPipelineTessellationStateCreateInfo {\n    VkStructureType                           sType;\n    const void*                               pNext;\n    VkPipelineTessellationStateCreateFlags    flags;\n    uint32_t                                  patchControlPoints;\n} VkPipelineTessellationStateCreateInfo;\n\ntypedef struct VkViewport {\n    float    x;\n    float    y;\n    float    width;\n    float    height;\n    float    minDepth;\n    float    maxDepth;\n} VkViewport;\n\ntypedef struct VkPipelineViewportStateCreateInfo {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkPipelineViewportStateCreateFlags    flags;\n    uint32_t                              viewportCount;\n    const VkViewport*                     pViewports;\n    uint32_t                              scissorCount;\n    const VkRect2D*                       pScissors;\n} VkPipelineViewportStateCreateInfo;\n\ntypedef struct VkPipelineRasterizationStateCreateInfo {\n    VkStructureType                            sType;\n    const void*                                pNext;\n    VkPipelineRasterizationStateCreateFlags    flags;\n    VkBool32                                   depthClampEnable;\n    VkBool32                                   rasterizerDiscardEnable;\n    VkPolygonMode                              polygonMode;\n    VkCullModeFlags                            cullMode;\n    VkFrontFace                                frontFace;\n    VkBool32                                   depthBiasEnable;\n    float                                      depthBiasConstantFactor;\n    float                                      depthBiasClamp;\n    float                                      depthBiasSlopeFactor;\n    float                                      lineWidth;\n} VkPipelineRasterizationStateCreateInfo;\n\ntypedef struct VkPipelineMultisampleStateCreateInfo {\n    VkStructureType                          sType;\n    const void*                              pNext;\n    VkPipelineMultisampleStateCreateFlags    flags;\n    VkSampleCountFlagBits                    rasterizationSamples;\n    VkBool32                                 sampleShadingEnable;\n    float                                    minSampleShading;\n    const VkSampleMask*                      pSampleMask;\n    VkBool32                                 alphaToCoverageEnable;\n    VkBool32                                 alphaToOneEnable;\n} VkPipelineMultisampleStateCreateInfo;\n\ntypedef struct VkStencilOpState {\n    VkStencilOp    failOp;\n    VkStencilOp    passOp;\n    VkStencilOp    depthFailOp;\n    VkCompareOp    compareOp;\n    uint32_t       compareMask;\n    uint32_t       writeMask;\n    uint32_t       reference;\n} VkStencilOpState;\n\ntypedef struct VkPipelineDepthStencilStateCreateInfo {\n    VkStructureType                           sType;\n    const void*                               pNext;\n    VkPipelineDepthStencilStateCreateFlags    flags;\n    VkBool32                                  depthTestEnable;\n    VkBool32                                  depthWriteEnable;\n    VkCompareOp                               depthCompareOp;\n    VkBool32                                  depthBoundsTestEnable;\n    VkBool32                                  stencilTestEnable;\n    VkStencilOpState                          front;\n    VkStencilOpState                          back;\n    float                                     minDepthBounds;\n    float                                     maxDepthBounds;\n} VkPipelineDepthStencilStateCreateInfo;\n\ntypedef struct VkPipelineColorBlendAttachmentState {\n    VkBool32                 blendEnable;\n    VkBlendFactor            srcColorBlendFactor;\n    VkBlendFactor            dstColorBlendFactor;\n    VkBlendOp                colorBlendOp;\n    VkBlendFactor            srcAlphaBlendFactor;\n    VkBlendFactor            dstAlphaBlendFactor;\n    VkBlendOp                alphaBlendOp;\n    VkColorComponentFlags    colorWriteMask;\n} VkPipelineColorBlendAttachmentState;\n\ntypedef struct VkPipelineColorBlendStateCreateInfo {\n    VkStructureType                               sType;\n    const void*                                   pNext;\n    VkPipelineColorBlendStateCreateFlags          flags;\n    VkBool32                                      logicOpEnable;\n    VkLogicOp                                     logicOp;\n    uint32_t                                      attachmentCount;\n    const VkPipelineColorBlendAttachmentState*    pAttachments;\n    float                                         blendConstants[4];\n} VkPipelineColorBlendStateCreateInfo;\n\ntypedef struct VkPipelineDynamicStateCreateInfo {\n    VkStructureType                      sType;\n    const void*                          pNext;\n    VkPipelineDynamicStateCreateFlags    flags;\n    uint32_t                             dynamicStateCount;\n    const VkDynamicState*                pDynamicStates;\n} VkPipelineDynamicStateCreateInfo;\n\ntypedef struct VkGraphicsPipelineCreateInfo {\n    VkStructureType                                  sType;\n    const void*                                      pNext;\n    VkPipelineCreateFlags                            flags;\n    uint32_t                                         stageCount;\n    const VkPipelineShaderStageCreateInfo*           pStages;\n    const VkPipelineVertexInputStateCreateInfo*      pVertexInputState;\n    const VkPipelineInputAssemblyStateCreateInfo*    pInputAssemblyState;\n    const VkPipelineTessellationStateCreateInfo*     pTessellationState;\n    const VkPipelineViewportStateCreateInfo*         pViewportState;\n    const VkPipelineRasterizationStateCreateInfo*    pRasterizationState;\n    const VkPipelineMultisampleStateCreateInfo*      pMultisampleState;\n    const VkPipelineDepthStencilStateCreateInfo*     pDepthStencilState;\n    const VkPipelineColorBlendStateCreateInfo*       pColorBlendState;\n    const VkPipelineDynamicStateCreateInfo*          pDynamicState;\n    VkPipelineLayout                                 layout;\n    VkRenderPass                                     renderPass;\n    uint32_t                                         subpass;\n    VkPipeline                                       basePipelineHandle;\n    int32_t                                          basePipelineIndex;\n} VkGraphicsPipelineCreateInfo;\n\ntypedef struct VkPushConstantRange {\n    VkShaderStageFlags    stageFlags;\n    uint32_t              offset;\n    uint32_t              size;\n} VkPushConstantRange;\n\ntypedef struct VkPipelineLayoutCreateInfo {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    VkPipelineLayoutCreateFlags     flags;\n    uint32_t                        setLayoutCount;\n    const VkDescriptorSetLayout*    pSetLayouts;\n    uint32_t                        pushConstantRangeCount;\n    const VkPushConstantRange*      pPushConstantRanges;\n} VkPipelineLayoutCreateInfo;\n\ntypedef struct VkSamplerCreateInfo {\n    VkStructureType         sType;\n    const void*             pNext;\n    VkSamplerCreateFlags    flags;\n    VkFilter                magFilter;\n    VkFilter                minFilter;\n    VkSamplerMipmapMode     mipmapMode;\n    VkSamplerAddressMode    addressModeU;\n    VkSamplerAddressMode    addressModeV;\n    VkSamplerAddressMode    addressModeW;\n    float                   mipLodBias;\n    VkBool32                anisotropyEnable;\n    float                   maxAnisotropy;\n    VkBool32                compareEnable;\n    VkCompareOp             compareOp;\n    float                   minLod;\n    float                   maxLod;\n    VkBorderColor           borderColor;\n    VkBool32                unnormalizedCoordinates;\n} VkSamplerCreateInfo;\n\ntypedef struct VkCopyDescriptorSet {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkDescriptorSet    srcSet;\n    uint32_t           srcBinding;\n    uint32_t           srcArrayElement;\n    VkDescriptorSet    dstSet;\n    uint32_t           dstBinding;\n    uint32_t           dstArrayElement;\n    uint32_t           descriptorCount;\n} VkCopyDescriptorSet;\n\ntypedef struct VkDescriptorBufferInfo {\n    VkBuffer        buffer;\n    VkDeviceSize    offset;\n    VkDeviceSize    range;\n} VkDescriptorBufferInfo;\n\ntypedef struct VkDescriptorImageInfo {\n    VkSampler        sampler;\n    VkImageView      imageView;\n    VkImageLayout    imageLayout;\n} VkDescriptorImageInfo;\n\ntypedef struct VkDescriptorPoolSize {\n    VkDescriptorType    type;\n    uint32_t            descriptorCount;\n} VkDescriptorPoolSize;\n\ntypedef struct VkDescriptorPoolCreateInfo {\n    VkStructureType                sType;\n    const void*                    pNext;\n    VkDescriptorPoolCreateFlags    flags;\n    uint32_t                       maxSets;\n    uint32_t                       poolSizeCount;\n    const VkDescriptorPoolSize*    pPoolSizes;\n} VkDescriptorPoolCreateInfo;\n\ntypedef struct VkDescriptorSetAllocateInfo {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    VkDescriptorPool                descriptorPool;\n    uint32_t                        descriptorSetCount;\n    const VkDescriptorSetLayout*    pSetLayouts;\n} VkDescriptorSetAllocateInfo;\n\ntypedef struct VkDescriptorSetLayoutBinding {\n    uint32_t              binding;\n    VkDescriptorType      descriptorType;\n    uint32_t              descriptorCount;\n    VkShaderStageFlags    stageFlags;\n    const VkSampler*      pImmutableSamplers;\n} VkDescriptorSetLayoutBinding;\n\ntypedef struct VkDescriptorSetLayoutCreateInfo {\n    VkStructureType                        sType;\n    const void*                            pNext;\n    VkDescriptorSetLayoutCreateFlags       flags;\n    uint32_t                               bindingCount;\n    const VkDescriptorSetLayoutBinding*    pBindings;\n} VkDescriptorSetLayoutCreateInfo;\n\ntypedef struct VkWriteDescriptorSet {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkDescriptorSet                  dstSet;\n    uint32_t                         dstBinding;\n    uint32_t                         dstArrayElement;\n    uint32_t                         descriptorCount;\n    VkDescriptorType                 descriptorType;\n    const VkDescriptorImageInfo*     pImageInfo;\n    const VkDescriptorBufferInfo*    pBufferInfo;\n    const VkBufferView*              pTexelBufferView;\n} VkWriteDescriptorSet;\n\ntypedef struct VkAttachmentDescription {\n    VkAttachmentDescriptionFlags    flags;\n    VkFormat                        format;\n    VkSampleCountFlagBits           samples;\n    VkAttachmentLoadOp              loadOp;\n    VkAttachmentStoreOp             storeOp;\n    VkAttachmentLoadOp              stencilLoadOp;\n    VkAttachmentStoreOp             stencilStoreOp;\n    VkImageLayout                   initialLayout;\n    VkImageLayout                   finalLayout;\n} VkAttachmentDescription;\n\ntypedef struct VkAttachmentReference {\n    uint32_t         attachment;\n    VkImageLayout    layout;\n} VkAttachmentReference;\n\ntypedef struct VkFramebufferCreateInfo {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkFramebufferCreateFlags    flags;\n    VkRenderPass                renderPass;\n    uint32_t                    attachmentCount;\n    const VkImageView*          pAttachments;\n    uint32_t                    width;\n    uint32_t                    height;\n    uint32_t                    layers;\n} VkFramebufferCreateInfo;\n\ntypedef struct VkSubpassDescription {\n    VkSubpassDescriptionFlags       flags;\n    VkPipelineBindPoint             pipelineBindPoint;\n    uint32_t                        inputAttachmentCount;\n    const VkAttachmentReference*    pInputAttachments;\n    uint32_t                        colorAttachmentCount;\n    const VkAttachmentReference*    pColorAttachments;\n    const VkAttachmentReference*    pResolveAttachments;\n    const VkAttachmentReference*    pDepthStencilAttachment;\n    uint32_t                        preserveAttachmentCount;\n    const uint32_t*                 pPreserveAttachments;\n} VkSubpassDescription;\n\ntypedef struct VkSubpassDependency {\n    uint32_t                srcSubpass;\n    uint32_t                dstSubpass;\n    VkPipelineStageFlags    srcStageMask;\n    VkPipelineStageFlags    dstStageMask;\n    VkAccessFlags           srcAccessMask;\n    VkAccessFlags           dstAccessMask;\n    VkDependencyFlags       dependencyFlags;\n} VkSubpassDependency;\n\ntypedef struct VkRenderPassCreateInfo {\n    VkStructureType                   sType;\n    const void*                       pNext;\n    VkRenderPassCreateFlags           flags;\n    uint32_t                          attachmentCount;\n    const VkAttachmentDescription*    pAttachments;\n    uint32_t                          subpassCount;\n    const VkSubpassDescription*       pSubpasses;\n    uint32_t                          dependencyCount;\n    const VkSubpassDependency*        pDependencies;\n} VkRenderPassCreateInfo;\n\ntypedef struct VkCommandPoolCreateInfo {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkCommandPoolCreateFlags    flags;\n    uint32_t                    queueFamilyIndex;\n} VkCommandPoolCreateInfo;\n\ntypedef struct VkCommandBufferAllocateInfo {\n    VkStructureType         sType;\n    const void*             pNext;\n    VkCommandPool           commandPool;\n    VkCommandBufferLevel    level;\n    uint32_t                commandBufferCount;\n} VkCommandBufferAllocateInfo;\n\ntypedef struct VkCommandBufferInheritanceInfo {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkRenderPass                     renderPass;\n    uint32_t                         subpass;\n    VkFramebuffer                    framebuffer;\n    VkBool32                         occlusionQueryEnable;\n    VkQueryControlFlags              queryFlags;\n    VkQueryPipelineStatisticFlags    pipelineStatistics;\n} VkCommandBufferInheritanceInfo;\n\ntypedef struct VkCommandBufferBeginInfo {\n    VkStructureType                          sType;\n    const void*                              pNext;\n    VkCommandBufferUsageFlags                flags;\n    const VkCommandBufferInheritanceInfo*    pInheritanceInfo;\n} VkCommandBufferBeginInfo;\n\ntypedef struct VkBufferCopy {\n    VkDeviceSize    srcOffset;\n    VkDeviceSize    dstOffset;\n    VkDeviceSize    size;\n} VkBufferCopy;\n\ntypedef struct VkImageSubresourceLayers {\n    VkImageAspectFlags    aspectMask;\n    uint32_t              mipLevel;\n    uint32_t              baseArrayLayer;\n    uint32_t              layerCount;\n} VkImageSubresourceLayers;\n\ntypedef struct VkBufferImageCopy {\n    VkDeviceSize                bufferOffset;\n    uint32_t                    bufferRowLength;\n    uint32_t                    bufferImageHeight;\n    VkImageSubresourceLayers    imageSubresource;\n    VkOffset3D                  imageOffset;\n    VkExtent3D                  imageExtent;\n} VkBufferImageCopy;\n\ntypedef union VkClearColorValue {\n    float       float32[4];\n    int32_t     int32[4];\n    uint32_t    uint32[4];\n} VkClearColorValue;\n\ntypedef struct VkClearDepthStencilValue {\n    float       depth;\n    uint32_t    stencil;\n} VkClearDepthStencilValue;\n\ntypedef union VkClearValue {\n    VkClearColorValue           color;\n    VkClearDepthStencilValue    depthStencil;\n} VkClearValue;\n\ntypedef struct VkClearAttachment {\n    VkImageAspectFlags    aspectMask;\n    uint32_t              colorAttachment;\n    VkClearValue          clearValue;\n} VkClearAttachment;\n\ntypedef struct VkClearRect {\n    VkRect2D    rect;\n    uint32_t    baseArrayLayer;\n    uint32_t    layerCount;\n} VkClearRect;\n\ntypedef struct VkImageBlit {\n    VkImageSubresourceLayers    srcSubresource;\n    VkOffset3D                  srcOffsets[2];\n    VkImageSubresourceLayers    dstSubresource;\n    VkOffset3D                  dstOffsets[2];\n} VkImageBlit;\n\ntypedef struct VkImageCopy {\n    VkImageSubresourceLayers    srcSubresource;\n    VkOffset3D                  srcOffset;\n    VkImageSubresourceLayers    dstSubresource;\n    VkOffset3D                  dstOffset;\n    VkExtent3D                  extent;\n} VkImageCopy;\n\ntypedef struct VkImageResolve {\n    VkImageSubresourceLayers    srcSubresource;\n    VkOffset3D                  srcOffset;\n    VkImageSubresourceLayers    dstSubresource;\n    VkOffset3D                  dstOffset;\n    VkExtent3D                  extent;\n} VkImageResolve;\n\ntypedef struct VkRenderPassBeginInfo {\n    VkStructureType        sType;\n    const void*            pNext;\n    VkRenderPass           renderPass;\n    VkFramebuffer          framebuffer;\n    VkRect2D               renderArea;\n    uint32_t               clearValueCount;\n    const VkClearValue*    pClearValues;\n} VkRenderPassBeginInfo;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateInstance)(const VkInstanceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkInstance* pInstance);\ntypedef void (VKAPI_PTR *PFN_vkDestroyInstance)(VkInstance instance, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkEnumeratePhysicalDevices)(VkInstance instance, uint32_t* pPhysicalDeviceCount, VkPhysicalDevice* pPhysicalDevices);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceFeatures)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures* pFeatures);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceFormatProperties)(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties* pFormatProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceImageFormatProperties)(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceProperties)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties* pProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceQueueFamilyProperties)(VkPhysicalDevice physicalDevice, uint32_t* pQueueFamilyPropertyCount, VkQueueFamilyProperties* pQueueFamilyProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceMemoryProperties)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties* pMemoryProperties);\ntypedef PFN_vkVoidFunction (VKAPI_PTR *PFN_vkGetInstanceProcAddr)(VkInstance instance, const char* pName);\ntypedef PFN_vkVoidFunction (VKAPI_PTR *PFN_vkGetDeviceProcAddr)(VkDevice device, const char* pName);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateDevice)(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDevice* pDevice);\ntypedef void (VKAPI_PTR *PFN_vkDestroyDevice)(VkDevice device, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkEnumerateInstanceExtensionProperties)(const char* pLayerName, uint32_t* pPropertyCount, VkExtensionProperties* pProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkEnumerateDeviceExtensionProperties)(VkPhysicalDevice physicalDevice, const char* pLayerName, uint32_t* pPropertyCount, VkExtensionProperties* pProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkEnumerateInstanceLayerProperties)(uint32_t* pPropertyCount, VkLayerProperties* pProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkEnumerateDeviceLayerProperties)(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkLayerProperties* pProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetDeviceQueue)(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue* pQueue);\ntypedef VkResult (VKAPI_PTR *PFN_vkQueueSubmit)(VkQueue queue, uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence);\ntypedef VkResult (VKAPI_PTR *PFN_vkQueueWaitIdle)(VkQueue queue);\ntypedef VkResult (VKAPI_PTR *PFN_vkDeviceWaitIdle)(VkDevice device);\ntypedef VkResult (VKAPI_PTR *PFN_vkAllocateMemory)(VkDevice device, const VkMemoryAllocateInfo* pAllocateInfo, const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMemory);\ntypedef void (VKAPI_PTR *PFN_vkFreeMemory)(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkMapMemory)(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void** ppData);\ntypedef void (VKAPI_PTR *PFN_vkUnmapMemory)(VkDevice device, VkDeviceMemory memory);\ntypedef VkResult (VKAPI_PTR *PFN_vkFlushMappedMemoryRanges)(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange* pMemoryRanges);\ntypedef VkResult (VKAPI_PTR *PFN_vkInvalidateMappedMemoryRanges)(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange* pMemoryRanges);\ntypedef void (VKAPI_PTR *PFN_vkGetDeviceMemoryCommitment)(VkDevice device, VkDeviceMemory memory, VkDeviceSize* pCommittedMemoryInBytes);\ntypedef VkResult (VKAPI_PTR *PFN_vkBindBufferMemory)(VkDevice device, VkBuffer buffer, VkDeviceMemory memory, VkDeviceSize memoryOffset);\ntypedef VkResult (VKAPI_PTR *PFN_vkBindImageMemory)(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset);\ntypedef void (VKAPI_PTR *PFN_vkGetBufferMemoryRequirements)(VkDevice device, VkBuffer buffer, VkMemoryRequirements* pMemoryRequirements);\ntypedef void (VKAPI_PTR *PFN_vkGetImageMemoryRequirements)(VkDevice device, VkImage image, VkMemoryRequirements* pMemoryRequirements);\ntypedef void (VKAPI_PTR *PFN_vkGetImageSparseMemoryRequirements)(VkDevice device, VkImage image, uint32_t* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements* pSparseMemoryRequirements);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceSparseImageFormatProperties)(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling, uint32_t* pPropertyCount, VkSparseImageFormatProperties* pProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkQueueBindSparse)(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo* pBindInfo, VkFence fence);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateFence)(VkDevice device, const VkFenceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkFence* pFence);\ntypedef void (VKAPI_PTR *PFN_vkDestroyFence)(VkDevice device, VkFence fence, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkResetFences)(VkDevice device, uint32_t fenceCount, const VkFence* pFences);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetFenceStatus)(VkDevice device, VkFence fence);\ntypedef VkResult (VKAPI_PTR *PFN_vkWaitForFences)(VkDevice device, uint32_t fenceCount, const VkFence* pFences, VkBool32 waitAll, uint64_t timeout);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateSemaphore)(VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSemaphore* pSemaphore);\ntypedef void (VKAPI_PTR *PFN_vkDestroySemaphore)(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateEvent)(VkDevice device, const VkEventCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkEvent* pEvent);\ntypedef void (VKAPI_PTR *PFN_vkDestroyEvent)(VkDevice device, VkEvent event, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetEventStatus)(VkDevice device, VkEvent event);\ntypedef VkResult (VKAPI_PTR *PFN_vkSetEvent)(VkDevice device, VkEvent event);\ntypedef VkResult (VKAPI_PTR *PFN_vkResetEvent)(VkDevice device, VkEvent event);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateQueryPool)(VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkQueryPool* pQueryPool);\ntypedef void (VKAPI_PTR *PFN_vkDestroyQueryPool)(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetQueryPoolResults)(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, size_t dataSize, void* pData, VkDeviceSize stride, VkQueryResultFlags flags);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateBuffer)(VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBuffer* pBuffer);\ntypedef void (VKAPI_PTR *PFN_vkDestroyBuffer)(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateBufferView)(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBufferView* pView);\ntypedef void (VKAPI_PTR *PFN_vkDestroyBufferView)(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateImage)(VkDevice device, const VkImageCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImage* pImage);\ntypedef void (VKAPI_PTR *PFN_vkDestroyImage)(VkDevice device, VkImage image, const VkAllocationCallbacks* pAllocator);\ntypedef void (VKAPI_PTR *PFN_vkGetImageSubresourceLayout)(VkDevice device, VkImage image, const VkImageSubresource* pSubresource, VkSubresourceLayout* pLayout);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateImageView)(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImageView* pView);\ntypedef void (VKAPI_PTR *PFN_vkDestroyImageView)(VkDevice device, VkImageView imageView, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateShaderModule)(VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkShaderModule* pShaderModule);\ntypedef void (VKAPI_PTR *PFN_vkDestroyShaderModule)(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreatePipelineCache)(VkDevice device, const VkPipelineCacheCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineCache* pPipelineCache);\ntypedef void (VKAPI_PTR *PFN_vkDestroyPipelineCache)(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPipelineCacheData)(VkDevice device, VkPipelineCache pipelineCache, size_t* pDataSize, void* pData);\ntypedef VkResult (VKAPI_PTR *PFN_vkMergePipelineCaches)(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache* pSrcCaches);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateGraphicsPipelines)(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkGraphicsPipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateComputePipelines)(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkComputePipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines);\ntypedef void (VKAPI_PTR *PFN_vkDestroyPipeline)(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreatePipelineLayout)(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineLayout* pPipelineLayout);\ntypedef void (VKAPI_PTR *PFN_vkDestroyPipelineLayout)(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateSampler)(VkDevice device, const VkSamplerCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSampler* pSampler);\ntypedef void (VKAPI_PTR *PFN_vkDestroySampler)(VkDevice device, VkSampler sampler, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateDescriptorSetLayout)(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorSetLayout* pSetLayout);\ntypedef void (VKAPI_PTR *PFN_vkDestroyDescriptorSetLayout)(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateDescriptorPool)(VkDevice device, const VkDescriptorPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorPool* pDescriptorPool);\ntypedef void (VKAPI_PTR *PFN_vkDestroyDescriptorPool)(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkResetDescriptorPool)(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags);\ntypedef VkResult (VKAPI_PTR *PFN_vkAllocateDescriptorSets)(VkDevice device, const VkDescriptorSetAllocateInfo* pAllocateInfo, VkDescriptorSet* pDescriptorSets);\ntypedef VkResult (VKAPI_PTR *PFN_vkFreeDescriptorSets)(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount, const VkDescriptorSet* pDescriptorSets);\ntypedef void (VKAPI_PTR *PFN_vkUpdateDescriptorSets)(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites, uint32_t descriptorCopyCount, const VkCopyDescriptorSet* pDescriptorCopies);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateFramebuffer)(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkFramebuffer* pFramebuffer);\ntypedef void (VKAPI_PTR *PFN_vkDestroyFramebuffer)(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateRenderPass)(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass);\ntypedef void (VKAPI_PTR *PFN_vkDestroyRenderPass)(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks* pAllocator);\ntypedef void (VKAPI_PTR *PFN_vkGetRenderAreaGranularity)(VkDevice device, VkRenderPass renderPass, VkExtent2D* pGranularity);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateCommandPool)(VkDevice device, const VkCommandPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkCommandPool* pCommandPool);\ntypedef void (VKAPI_PTR *PFN_vkDestroyCommandPool)(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkResetCommandPool)(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags);\ntypedef VkResult (VKAPI_PTR *PFN_vkAllocateCommandBuffers)(VkDevice device, const VkCommandBufferAllocateInfo* pAllocateInfo, VkCommandBuffer* pCommandBuffers);\ntypedef void (VKAPI_PTR *PFN_vkFreeCommandBuffers)(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount, const VkCommandBuffer* pCommandBuffers);\ntypedef VkResult (VKAPI_PTR *PFN_vkBeginCommandBuffer)(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo* pBeginInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkEndCommandBuffer)(VkCommandBuffer commandBuffer);\ntypedef VkResult (VKAPI_PTR *PFN_vkResetCommandBuffer)(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags);\ntypedef void (VKAPI_PTR *PFN_vkCmdBindPipeline)(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetViewport)(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport* pViewports);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetScissor)(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D* pScissors);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetLineWidth)(VkCommandBuffer commandBuffer, float lineWidth);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDepthBias)(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetBlendConstants)(VkCommandBuffer commandBuffer, const float blendConstants[4]);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDepthBounds)(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetStencilCompareMask)(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetStencilWriteMask)(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetStencilReference)(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference);\ntypedef void (VKAPI_PTR *PFN_vkCmdBindDescriptorSets)(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet* pDescriptorSets, uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets);\ntypedef void (VKAPI_PTR *PFN_vkCmdBindIndexBuffer)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType);\ntypedef void (VKAPI_PTR *PFN_vkCmdBindVertexBuffers)(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets);\ntypedef void (VKAPI_PTR *PFN_vkCmdDraw)(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance);\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawIndexed)(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance);\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawIndirect)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride);\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawIndexedIndirect)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride);\ntypedef void (VKAPI_PTR *PFN_vkCmdDispatch)(VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ);\ntypedef void (VKAPI_PTR *PFN_vkCmdDispatchIndirect)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyBuffer)(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferCopy* pRegions);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyImage)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy* pRegions);\ntypedef void (VKAPI_PTR *PFN_vkCmdBlitImage)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit* pRegions, VkFilter filter);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyBufferToImage)(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy* pRegions);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyImageToBuffer)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy* pRegions);\ntypedef void (VKAPI_PTR *PFN_vkCmdUpdateBuffer)(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const void* pData);\ntypedef void (VKAPI_PTR *PFN_vkCmdFillBuffer)(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data);\ntypedef void (VKAPI_PTR *PFN_vkCmdClearColorImage)(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges);\ntypedef void (VKAPI_PTR *PFN_vkCmdClearDepthStencilImage)(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue* pDepthStencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges);\ntypedef void (VKAPI_PTR *PFN_vkCmdClearAttachments)(VkCommandBuffer commandBuffer, uint32_t attachmentCount, const VkClearAttachment* pAttachments, uint32_t rectCount, const VkClearRect* pRects);\ntypedef void (VKAPI_PTR *PFN_vkCmdResolveImage)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve* pRegions);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetEvent)(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask);\ntypedef void (VKAPI_PTR *PFN_vkCmdResetEvent)(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask);\ntypedef void (VKAPI_PTR *PFN_vkCmdWaitEvents)(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent* pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers, uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers);\ntypedef void (VKAPI_PTR *PFN_vkCmdPipelineBarrier)(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers, uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers);\ntypedef void (VKAPI_PTR *PFN_vkCmdBeginQuery)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags);\ntypedef void (VKAPI_PTR *PFN_vkCmdEndQuery)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query);\ntypedef void (VKAPI_PTR *PFN_vkCmdResetQueryPool)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount);\ntypedef void (VKAPI_PTR *PFN_vkCmdWriteTimestamp)(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool, uint32_t query);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyQueryPoolResults)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags);\ntypedef void (VKAPI_PTR *PFN_vkCmdPushConstants)(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size, const void* pValues);\ntypedef void (VKAPI_PTR *PFN_vkCmdBeginRenderPass)(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, VkSubpassContents contents);\ntypedef void (VKAPI_PTR *PFN_vkCmdNextSubpass)(VkCommandBuffer commandBuffer, VkSubpassContents contents);\ntypedef void (VKAPI_PTR *PFN_vkCmdEndRenderPass)(VkCommandBuffer commandBuffer);\ntypedef void (VKAPI_PTR *PFN_vkCmdExecuteCommands)(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer* pCommandBuffers);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(\n    const VkInstanceCreateInfo*                 pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkInstance*                                 pInstance);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyInstance(\n    VkInstance                                  instance,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDevices(\n    VkInstance                                  instance,\n    uint32_t*                                   pPhysicalDeviceCount,\n    VkPhysicalDevice*                           pPhysicalDevices);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFeatures(\n    VkPhysicalDevice                            physicalDevice,\n    VkPhysicalDeviceFeatures*                   pFeatures);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFormatProperties(\n    VkPhysicalDevice                            physicalDevice,\n    VkFormat                                    format,\n    VkFormatProperties*                         pFormatProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceImageFormatProperties(\n    VkPhysicalDevice                            physicalDevice,\n    VkFormat                                    format,\n    VkImageType                                 type,\n    VkImageTiling                               tiling,\n    VkImageUsageFlags                           usage,\n    VkImageCreateFlags                          flags,\n    VkImageFormatProperties*                    pImageFormatProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceProperties(\n    VkPhysicalDevice                            physicalDevice,\n    VkPhysicalDeviceProperties*                 pProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyProperties(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t*                                   pQueueFamilyPropertyCount,\n    VkQueueFamilyProperties*                    pQueueFamilyProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceMemoryProperties(\n    VkPhysicalDevice                            physicalDevice,\n    VkPhysicalDeviceMemoryProperties*           pMemoryProperties);\n\nVKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(\n    VkInstance                                  instance,\n    const char*                                 pName);\n\nVKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(\n    VkDevice                                    device,\n    const char*                                 pName);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(\n    VkPhysicalDevice                            physicalDevice,\n    const VkDeviceCreateInfo*                   pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkDevice*                                   pDevice);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyDevice(\n    VkDevice                                    device,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(\n    const char*                                 pLayerName,\n    uint32_t*                                   pPropertyCount,\n    VkExtensionProperties*                      pProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(\n    VkPhysicalDevice                            physicalDevice,\n    const char*                                 pLayerName,\n    uint32_t*                                   pPropertyCount,\n    VkExtensionProperties*                      pProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(\n    uint32_t*                                   pPropertyCount,\n    VkLayerProperties*                          pProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t*                                   pPropertyCount,\n    VkLayerProperties*                          pProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetDeviceQueue(\n    VkDevice                                    device,\n    uint32_t                                    queueFamilyIndex,\n    uint32_t                                    queueIndex,\n    VkQueue*                                    pQueue);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkQueueSubmit(\n    VkQueue                                     queue,\n    uint32_t                                    submitCount,\n    const VkSubmitInfo*                         pSubmits,\n    VkFence                                     fence);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkQueueWaitIdle(\n    VkQueue                                     queue);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkDeviceWaitIdle(\n    VkDevice                                    device);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkAllocateMemory(\n    VkDevice                                    device,\n    const VkMemoryAllocateInfo*                 pAllocateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkDeviceMemory*                             pMemory);\n\nVKAPI_ATTR void VKAPI_CALL vkFreeMemory(\n    VkDevice                                    device,\n    VkDeviceMemory                              memory,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkMapMemory(\n    VkDevice                                    device,\n    VkDeviceMemory                              memory,\n    VkDeviceSize                                offset,\n    VkDeviceSize                                size,\n    VkMemoryMapFlags                            flags,\n    void**                                      ppData);\n\nVKAPI_ATTR void VKAPI_CALL vkUnmapMemory(\n    VkDevice                                    device,\n    VkDeviceMemory                              memory);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkFlushMappedMemoryRanges(\n    VkDevice                                    device,\n    uint32_t                                    memoryRangeCount,\n    const VkMappedMemoryRange*                  pMemoryRanges);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkInvalidateMappedMemoryRanges(\n    VkDevice                                    device,\n    uint32_t                                    memoryRangeCount,\n    const VkMappedMemoryRange*                  pMemoryRanges);\n\nVKAPI_ATTR void VKAPI_CALL vkGetDeviceMemoryCommitment(\n    VkDevice                                    device,\n    VkDeviceMemory                              memory,\n    VkDeviceSize*                               pCommittedMemoryInBytes);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkBindBufferMemory(\n    VkDevice                                    device,\n    VkBuffer                                    buffer,\n    VkDeviceMemory                              memory,\n    VkDeviceSize                                memoryOffset);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory(\n    VkDevice                                    device,\n    VkImage                                     image,\n    VkDeviceMemory                              memory,\n    VkDeviceSize                                memoryOffset);\n\nVKAPI_ATTR void VKAPI_CALL vkGetBufferMemoryRequirements(\n    VkDevice                                    device,\n    VkBuffer                                    buffer,\n    VkMemoryRequirements*                       pMemoryRequirements);\n\nVKAPI_ATTR void VKAPI_CALL vkGetImageMemoryRequirements(\n    VkDevice                                    device,\n    VkImage                                     image,\n    VkMemoryRequirements*                       pMemoryRequirements);\n\nVKAPI_ATTR void VKAPI_CALL vkGetImageSparseMemoryRequirements(\n    VkDevice                                    device,\n    VkImage                                     image,\n    uint32_t*                                   pSparseMemoryRequirementCount,\n    VkSparseImageMemoryRequirements*            pSparseMemoryRequirements);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceSparseImageFormatProperties(\n    VkPhysicalDevice                            physicalDevice,\n    VkFormat                                    format,\n    VkImageType                                 type,\n    VkSampleCountFlagBits                       samples,\n    VkImageUsageFlags                           usage,\n    VkImageTiling                               tiling,\n    uint32_t*                                   pPropertyCount,\n    VkSparseImageFormatProperties*              pProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkQueueBindSparse(\n    VkQueue                                     queue,\n    uint32_t                                    bindInfoCount,\n    const VkBindSparseInfo*                     pBindInfo,\n    VkFence                                     fence);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateFence(\n    VkDevice                                    device,\n    const VkFenceCreateInfo*                    pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkFence*                                    pFence);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyFence(\n    VkDevice                                    device,\n    VkFence                                     fence,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkResetFences(\n    VkDevice                                    device,\n    uint32_t                                    fenceCount,\n    const VkFence*                              pFences);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetFenceStatus(\n    VkDevice                                    device,\n    VkFence                                     fence);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkWaitForFences(\n    VkDevice                                    device,\n    uint32_t                                    fenceCount,\n    const VkFence*                              pFences,\n    VkBool32                                    waitAll,\n    uint64_t                                    timeout);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateSemaphore(\n    VkDevice                                    device,\n    const VkSemaphoreCreateInfo*                pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSemaphore*                                pSemaphore);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroySemaphore(\n    VkDevice                                    device,\n    VkSemaphore                                 semaphore,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateEvent(\n    VkDevice                                    device,\n    const VkEventCreateInfo*                    pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkEvent*                                    pEvent);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyEvent(\n    VkDevice                                    device,\n    VkEvent                                     event,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetEventStatus(\n    VkDevice                                    device,\n    VkEvent                                     event);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkSetEvent(\n    VkDevice                                    device,\n    VkEvent                                     event);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkResetEvent(\n    VkDevice                                    device,\n    VkEvent                                     event);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateQueryPool(\n    VkDevice                                    device,\n    const VkQueryPoolCreateInfo*                pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkQueryPool*                                pQueryPool);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyQueryPool(\n    VkDevice                                    device,\n    VkQueryPool                                 queryPool,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetQueryPoolResults(\n    VkDevice                                    device,\n    VkQueryPool                                 queryPool,\n    uint32_t                                    firstQuery,\n    uint32_t                                    queryCount,\n    size_t                                      dataSize,\n    void*                                       pData,\n    VkDeviceSize                                stride,\n    VkQueryResultFlags                          flags);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateBuffer(\n    VkDevice                                    device,\n    const VkBufferCreateInfo*                   pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkBuffer*                                   pBuffer);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyBuffer(\n    VkDevice                                    device,\n    VkBuffer                                    buffer,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferView(\n    VkDevice                                    device,\n    const VkBufferViewCreateInfo*               pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkBufferView*                               pView);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyBufferView(\n    VkDevice                                    device,\n    VkBufferView                                bufferView,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateImage(\n    VkDevice                                    device,\n    const VkImageCreateInfo*                    pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkImage*                                    pImage);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyImage(\n    VkDevice                                    device,\n    VkImage                                     image,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR void VKAPI_CALL vkGetImageSubresourceLayout(\n    VkDevice                                    device,\n    VkImage                                     image,\n    const VkImageSubresource*                   pSubresource,\n    VkSubresourceLayout*                        pLayout);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateImageView(\n    VkDevice                                    device,\n    const VkImageViewCreateInfo*                pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkImageView*                                pView);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyImageView(\n    VkDevice                                    device,\n    VkImageView                                 imageView,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateShaderModule(\n    VkDevice                                    device,\n    const VkShaderModuleCreateInfo*             pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkShaderModule*                             pShaderModule);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyShaderModule(\n    VkDevice                                    device,\n    VkShaderModule                              shaderModule,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineCache(\n    VkDevice                                    device,\n    const VkPipelineCacheCreateInfo*            pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkPipelineCache*                            pPipelineCache);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyPipelineCache(\n    VkDevice                                    device,\n    VkPipelineCache                             pipelineCache,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPipelineCacheData(\n    VkDevice                                    device,\n    VkPipelineCache                             pipelineCache,\n    size_t*                                     pDataSize,\n    void*                                       pData);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkMergePipelineCaches(\n    VkDevice                                    device,\n    VkPipelineCache                             dstCache,\n    uint32_t                                    srcCacheCount,\n    const VkPipelineCache*                      pSrcCaches);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateGraphicsPipelines(\n    VkDevice                                    device,\n    VkPipelineCache                             pipelineCache,\n    uint32_t                                    createInfoCount,\n    const VkGraphicsPipelineCreateInfo*         pCreateInfos,\n    const VkAllocationCallbacks*                pAllocator,\n    VkPipeline*                                 pPipelines);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateComputePipelines(\n    VkDevice                                    device,\n    VkPipelineCache                             pipelineCache,\n    uint32_t                                    createInfoCount,\n    const VkComputePipelineCreateInfo*          pCreateInfos,\n    const VkAllocationCallbacks*                pAllocator,\n    VkPipeline*                                 pPipelines);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyPipeline(\n    VkDevice                                    device,\n    VkPipeline                                  pipeline,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineLayout(\n    VkDevice                                    device,\n    const VkPipelineLayoutCreateInfo*           pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkPipelineLayout*                           pPipelineLayout);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyPipelineLayout(\n    VkDevice                                    device,\n    VkPipelineLayout                            pipelineLayout,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateSampler(\n    VkDevice                                    device,\n    const VkSamplerCreateInfo*                  pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSampler*                                  pSampler);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroySampler(\n    VkDevice                                    device,\n    VkSampler                                   sampler,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorSetLayout(\n    VkDevice                                    device,\n    const VkDescriptorSetLayoutCreateInfo*      pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkDescriptorSetLayout*                      pSetLayout);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyDescriptorSetLayout(\n    VkDevice                                    device,\n    VkDescriptorSetLayout                       descriptorSetLayout,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorPool(\n    VkDevice                                    device,\n    const VkDescriptorPoolCreateInfo*           pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkDescriptorPool*                           pDescriptorPool);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyDescriptorPool(\n    VkDevice                                    device,\n    VkDescriptorPool                            descriptorPool,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkResetDescriptorPool(\n    VkDevice                                    device,\n    VkDescriptorPool                            descriptorPool,\n    VkDescriptorPoolResetFlags                  flags);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkAllocateDescriptorSets(\n    VkDevice                                    device,\n    const VkDescriptorSetAllocateInfo*          pAllocateInfo,\n    VkDescriptorSet*                            pDescriptorSets);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkFreeDescriptorSets(\n    VkDevice                                    device,\n    VkDescriptorPool                            descriptorPool,\n    uint32_t                                    descriptorSetCount,\n    const VkDescriptorSet*                      pDescriptorSets);\n\nVKAPI_ATTR void VKAPI_CALL vkUpdateDescriptorSets(\n    VkDevice                                    device,\n    uint32_t                                    descriptorWriteCount,\n    const VkWriteDescriptorSet*                 pDescriptorWrites,\n    uint32_t                                    descriptorCopyCount,\n    const VkCopyDescriptorSet*                  pDescriptorCopies);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateFramebuffer(\n    VkDevice                                    device,\n    const VkFramebufferCreateInfo*              pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkFramebuffer*                              pFramebuffer);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyFramebuffer(\n    VkDevice                                    device,\n    VkFramebuffer                               framebuffer,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(\n    VkDevice                                    device,\n    const VkRenderPassCreateInfo*               pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkRenderPass*                               pRenderPass);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyRenderPass(\n    VkDevice                                    device,\n    VkRenderPass                                renderPass,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR void VKAPI_CALL vkGetRenderAreaGranularity(\n    VkDevice                                    device,\n    VkRenderPass                                renderPass,\n    VkExtent2D*                                 pGranularity);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool(\n    VkDevice                                    device,\n    const VkCommandPoolCreateInfo*              pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkCommandPool*                              pCommandPool);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyCommandPool(\n    VkDevice                                    device,\n    VkCommandPool                               commandPool,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkResetCommandPool(\n    VkDevice                                    device,\n    VkCommandPool                               commandPool,\n    VkCommandPoolResetFlags                     flags);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkAllocateCommandBuffers(\n    VkDevice                                    device,\n    const VkCommandBufferAllocateInfo*          pAllocateInfo,\n    VkCommandBuffer*                            pCommandBuffers);\n\nVKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(\n    VkDevice                                    device,\n    VkCommandPool                               commandPool,\n    uint32_t                                    commandBufferCount,\n    const VkCommandBuffer*                      pCommandBuffers);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkBeginCommandBuffer(\n    VkCommandBuffer                             commandBuffer,\n    const VkCommandBufferBeginInfo*             pBeginInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer(\n    VkCommandBuffer                             commandBuffer);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkResetCommandBuffer(\n    VkCommandBuffer                             commandBuffer,\n    VkCommandBufferResetFlags                   flags);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBindPipeline(\n    VkCommandBuffer                             commandBuffer,\n    VkPipelineBindPoint                         pipelineBindPoint,\n    VkPipeline                                  pipeline);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetViewport(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    firstViewport,\n    uint32_t                                    viewportCount,\n    const VkViewport*                           pViewports);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetScissor(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    firstScissor,\n    uint32_t                                    scissorCount,\n    const VkRect2D*                             pScissors);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetLineWidth(\n    VkCommandBuffer                             commandBuffer,\n    float                                       lineWidth);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBias(\n    VkCommandBuffer                             commandBuffer,\n    float                                       depthBiasConstantFactor,\n    float                                       depthBiasClamp,\n    float                                       depthBiasSlopeFactor);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetBlendConstants(\n    VkCommandBuffer                             commandBuffer,\n    const float                                 blendConstants[4]);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBounds(\n    VkCommandBuffer                             commandBuffer,\n    float                                       minDepthBounds,\n    float                                       maxDepthBounds);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetStencilCompareMask(\n    VkCommandBuffer                             commandBuffer,\n    VkStencilFaceFlags                          faceMask,\n    uint32_t                                    compareMask);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetStencilWriteMask(\n    VkCommandBuffer                             commandBuffer,\n    VkStencilFaceFlags                          faceMask,\n    uint32_t                                    writeMask);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetStencilReference(\n    VkCommandBuffer                             commandBuffer,\n    VkStencilFaceFlags                          faceMask,\n    uint32_t                                    reference);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorSets(\n    VkCommandBuffer                             commandBuffer,\n    VkPipelineBindPoint                         pipelineBindPoint,\n    VkPipelineLayout                            layout,\n    uint32_t                                    firstSet,\n    uint32_t                                    descriptorSetCount,\n    const VkDescriptorSet*                      pDescriptorSets,\n    uint32_t                                    dynamicOffsetCount,\n    const uint32_t*                             pDynamicOffsets);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBindIndexBuffer(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    buffer,\n    VkDeviceSize                                offset,\n    VkIndexType                                 indexType);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    firstBinding,\n    uint32_t                                    bindingCount,\n    const VkBuffer*                             pBuffers,\n    const VkDeviceSize*                         pOffsets);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDraw(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    vertexCount,\n    uint32_t                                    instanceCount,\n    uint32_t                                    firstVertex,\n    uint32_t                                    firstInstance);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexed(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    indexCount,\n    uint32_t                                    instanceCount,\n    uint32_t                                    firstIndex,\n    int32_t                                     vertexOffset,\n    uint32_t                                    firstInstance);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirect(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    buffer,\n    VkDeviceSize                                offset,\n    uint32_t                                    drawCount,\n    uint32_t                                    stride);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirect(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    buffer,\n    VkDeviceSize                                offset,\n    uint32_t                                    drawCount,\n    uint32_t                                    stride);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDispatch(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    groupCountX,\n    uint32_t                                    groupCountY,\n    uint32_t                                    groupCountZ);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDispatchIndirect(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    buffer,\n    VkDeviceSize                                offset);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    srcBuffer,\n    VkBuffer                                    dstBuffer,\n    uint32_t                                    regionCount,\n    const VkBufferCopy*                         pRegions);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyImage(\n    VkCommandBuffer                             commandBuffer,\n    VkImage                                     srcImage,\n    VkImageLayout                               srcImageLayout,\n    VkImage                                     dstImage,\n    VkImageLayout                               dstImageLayout,\n    uint32_t                                    regionCount,\n    const VkImageCopy*                          pRegions);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBlitImage(\n    VkCommandBuffer                             commandBuffer,\n    VkImage                                     srcImage,\n    VkImageLayout                               srcImageLayout,\n    VkImage                                     dstImage,\n    VkImageLayout                               dstImageLayout,\n    uint32_t                                    regionCount,\n    const VkImageBlit*                          pRegions,\n    VkFilter                                    filter);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    srcBuffer,\n    VkImage                                     dstImage,\n    VkImageLayout                               dstImageLayout,\n    uint32_t                                    regionCount,\n    const VkBufferImageCopy*                    pRegions);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer(\n    VkCommandBuffer                             commandBuffer,\n    VkImage                                     srcImage,\n    VkImageLayout                               srcImageLayout,\n    VkBuffer                                    dstBuffer,\n    uint32_t                                    regionCount,\n    const VkBufferImageCopy*                    pRegions);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    dstBuffer,\n    VkDeviceSize                                dstOffset,\n    VkDeviceSize                                dataSize,\n    const void*                                 pData);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdFillBuffer(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    dstBuffer,\n    VkDeviceSize                                dstOffset,\n    VkDeviceSize                                size,\n    uint32_t                                    data);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(\n    VkCommandBuffer                             commandBuffer,\n    VkImage                                     image,\n    VkImageLayout                               imageLayout,\n    const VkClearColorValue*                    pColor,\n    uint32_t                                    rangeCount,\n    const VkImageSubresourceRange*              pRanges);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdClearDepthStencilImage(\n    VkCommandBuffer                             commandBuffer,\n    VkImage                                     image,\n    VkImageLayout                               imageLayout,\n    const VkClearDepthStencilValue*             pDepthStencil,\n    uint32_t                                    rangeCount,\n    const VkImageSubresourceRange*              pRanges);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    attachmentCount,\n    const VkClearAttachment*                    pAttachments,\n    uint32_t                                    rectCount,\n    const VkClearRect*                          pRects);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdResolveImage(\n    VkCommandBuffer                             commandBuffer,\n    VkImage                                     srcImage,\n    VkImageLayout                               srcImageLayout,\n    VkImage                                     dstImage,\n    VkImageLayout                               dstImageLayout,\n    uint32_t                                    regionCount,\n    const VkImageResolve*                       pRegions);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetEvent(\n    VkCommandBuffer                             commandBuffer,\n    VkEvent                                     event,\n    VkPipelineStageFlags                        stageMask);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdResetEvent(\n    VkCommandBuffer                             commandBuffer,\n    VkEvent                                     event,\n    VkPipelineStageFlags                        stageMask);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdWaitEvents(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    eventCount,\n    const VkEvent*                              pEvents,\n    VkPipelineStageFlags                        srcStageMask,\n    VkPipelineStageFlags                        dstStageMask,\n    uint32_t                                    memoryBarrierCount,\n    const VkMemoryBarrier*                      pMemoryBarriers,\n    uint32_t                                    bufferMemoryBarrierCount,\n    const VkBufferMemoryBarrier*                pBufferMemoryBarriers,\n    uint32_t                                    imageMemoryBarrierCount,\n    const VkImageMemoryBarrier*                 pImageMemoryBarriers);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdPipelineBarrier(\n    VkCommandBuffer                             commandBuffer,\n    VkPipelineStageFlags                        srcStageMask,\n    VkPipelineStageFlags                        dstStageMask,\n    VkDependencyFlags                           dependencyFlags,\n    uint32_t                                    memoryBarrierCount,\n    const VkMemoryBarrier*                      pMemoryBarriers,\n    uint32_t                                    bufferMemoryBarrierCount,\n    const VkBufferMemoryBarrier*                pBufferMemoryBarriers,\n    uint32_t                                    imageMemoryBarrierCount,\n    const VkImageMemoryBarrier*                 pImageMemoryBarriers);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBeginQuery(\n    VkCommandBuffer                             commandBuffer,\n    VkQueryPool                                 queryPool,\n    uint32_t                                    query,\n    VkQueryControlFlags                         flags);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdEndQuery(\n    VkCommandBuffer                             commandBuffer,\n    VkQueryPool                                 queryPool,\n    uint32_t                                    query);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdResetQueryPool(\n    VkCommandBuffer                             commandBuffer,\n    VkQueryPool                                 queryPool,\n    uint32_t                                    firstQuery,\n    uint32_t                                    queryCount);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp(\n    VkCommandBuffer                             commandBuffer,\n    VkPipelineStageFlagBits                     pipelineStage,\n    VkQueryPool                                 queryPool,\n    uint32_t                                    query);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyQueryPoolResults(\n    VkCommandBuffer                             commandBuffer,\n    VkQueryPool                                 queryPool,\n    uint32_t                                    firstQuery,\n    uint32_t                                    queryCount,\n    VkBuffer                                    dstBuffer,\n    VkDeviceSize                                dstOffset,\n    VkDeviceSize                                stride,\n    VkQueryResultFlags                          flags);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdPushConstants(\n    VkCommandBuffer                             commandBuffer,\n    VkPipelineLayout                            layout,\n    VkShaderStageFlags                          stageFlags,\n    uint32_t                                    offset,\n    uint32_t                                    size,\n    const void*                                 pValues);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBeginRenderPass(\n    VkCommandBuffer                             commandBuffer,\n    const VkRenderPassBeginInfo*                pRenderPassBegin,\n    VkSubpassContents                           contents);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass(\n    VkCommandBuffer                             commandBuffer,\n    VkSubpassContents                           contents);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass(\n    VkCommandBuffer                             commandBuffer);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdExecuteCommands(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    commandBufferCount,\n    const VkCommandBuffer*                      pCommandBuffers);\n#endif\n\n\n// VK_VERSION_1_1 is a preprocessor guard. Do not pass it to API calls.\n#define VK_VERSION_1_1 1\n// Vulkan 1.1 version number\n#define VK_API_VERSION_1_1 VK_MAKE_API_VERSION(0, 1, 1, 0)// Patch version should always be set to 0\n\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSamplerYcbcrConversion)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorUpdateTemplate)\n#define VK_MAX_DEVICE_GROUP_SIZE          32U\n#define VK_LUID_SIZE                      8U\n#define VK_QUEUE_FAMILY_EXTERNAL          (~1U)\n\ntypedef enum VkPointClippingBehavior {\n    VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES = 0,\n    VK_POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY = 1,\n    VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES_KHR = VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES,\n    VK_POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY_KHR = VK_POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY,\n    VK_POINT_CLIPPING_BEHAVIOR_MAX_ENUM = 0x7FFFFFFF\n} VkPointClippingBehavior;\n\ntypedef enum VkTessellationDomainOrigin {\n    VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT = 0,\n    VK_TESSELLATION_DOMAIN_ORIGIN_LOWER_LEFT = 1,\n    VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT_KHR = VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT,\n    VK_TESSELLATION_DOMAIN_ORIGIN_LOWER_LEFT_KHR = VK_TESSELLATION_DOMAIN_ORIGIN_LOWER_LEFT,\n    VK_TESSELLATION_DOMAIN_ORIGIN_MAX_ENUM = 0x7FFFFFFF\n} VkTessellationDomainOrigin;\n\ntypedef enum VkSamplerYcbcrModelConversion {\n    VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY = 0,\n    VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY = 1,\n    VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709 = 2,\n    VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601 = 3,\n    VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020 = 4,\n    VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY_KHR = VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,\n    VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY_KHR = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY,\n    VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709_KHR = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709,\n    VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601_KHR = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601,\n    VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020_KHR = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020,\n    VK_SAMPLER_YCBCR_MODEL_CONVERSION_MAX_ENUM = 0x7FFFFFFF\n} VkSamplerYcbcrModelConversion;\n\ntypedef enum VkSamplerYcbcrRange {\n    VK_SAMPLER_YCBCR_RANGE_ITU_FULL = 0,\n    VK_SAMPLER_YCBCR_RANGE_ITU_NARROW = 1,\n    VK_SAMPLER_YCBCR_RANGE_ITU_FULL_KHR = VK_SAMPLER_YCBCR_RANGE_ITU_FULL,\n    VK_SAMPLER_YCBCR_RANGE_ITU_NARROW_KHR = VK_SAMPLER_YCBCR_RANGE_ITU_NARROW,\n    VK_SAMPLER_YCBCR_RANGE_MAX_ENUM = 0x7FFFFFFF\n} VkSamplerYcbcrRange;\n\ntypedef enum VkChromaLocation {\n    VK_CHROMA_LOCATION_COSITED_EVEN = 0,\n    VK_CHROMA_LOCATION_MIDPOINT = 1,\n    VK_CHROMA_LOCATION_COSITED_EVEN_KHR = VK_CHROMA_LOCATION_COSITED_EVEN,\n    VK_CHROMA_LOCATION_MIDPOINT_KHR = VK_CHROMA_LOCATION_MIDPOINT,\n    VK_CHROMA_LOCATION_MAX_ENUM = 0x7FFFFFFF\n} VkChromaLocation;\n\ntypedef enum VkDescriptorUpdateTemplateType {\n    VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET = 0,\n    VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS = 1,\n    VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS,\n    VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET_KHR = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET,\n    VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_MAX_ENUM = 0x7FFFFFFF\n} VkDescriptorUpdateTemplateType;\n\ntypedef enum VkSubgroupFeatureFlagBits {\n    VK_SUBGROUP_FEATURE_BASIC_BIT = 0x00000001,\n    VK_SUBGROUP_FEATURE_VOTE_BIT = 0x00000002,\n    VK_SUBGROUP_FEATURE_ARITHMETIC_BIT = 0x00000004,\n    VK_SUBGROUP_FEATURE_BALLOT_BIT = 0x00000008,\n    VK_SUBGROUP_FEATURE_SHUFFLE_BIT = 0x00000010,\n    VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT = 0x00000020,\n    VK_SUBGROUP_FEATURE_CLUSTERED_BIT = 0x00000040,\n    VK_SUBGROUP_FEATURE_QUAD_BIT = 0x00000080,\n    VK_SUBGROUP_FEATURE_ROTATE_BIT = 0x00000200,\n    VK_SUBGROUP_FEATURE_ROTATE_CLUSTERED_BIT = 0x00000400,\n    VK_SUBGROUP_FEATURE_PARTITIONED_BIT_NV = 0x00000100,\n    VK_SUBGROUP_FEATURE_ROTATE_BIT_KHR = VK_SUBGROUP_FEATURE_ROTATE_BIT,\n    VK_SUBGROUP_FEATURE_ROTATE_CLUSTERED_BIT_KHR = VK_SUBGROUP_FEATURE_ROTATE_CLUSTERED_BIT,\n    VK_SUBGROUP_FEATURE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkSubgroupFeatureFlagBits;\ntypedef VkFlags VkSubgroupFeatureFlags;\n\ntypedef enum VkPeerMemoryFeatureFlagBits {\n    VK_PEER_MEMORY_FEATURE_COPY_SRC_BIT = 0x00000001,\n    VK_PEER_MEMORY_FEATURE_COPY_DST_BIT = 0x00000002,\n    VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT = 0x00000004,\n    VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT = 0x00000008,\n    VK_PEER_MEMORY_FEATURE_COPY_SRC_BIT_KHR = VK_PEER_MEMORY_FEATURE_COPY_SRC_BIT,\n    VK_PEER_MEMORY_FEATURE_COPY_DST_BIT_KHR = VK_PEER_MEMORY_FEATURE_COPY_DST_BIT,\n    VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT_KHR = VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT,\n    VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT_KHR = VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT,\n    VK_PEER_MEMORY_FEATURE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkPeerMemoryFeatureFlagBits;\ntypedef VkFlags VkPeerMemoryFeatureFlags;\n\ntypedef enum VkMemoryAllocateFlagBits {\n    VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT = 0x00000001,\n    VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT = 0x00000002,\n    VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT = 0x00000004,\n    VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT_KHR = VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT,\n    VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT,\n    VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT,\n    VK_MEMORY_ALLOCATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkMemoryAllocateFlagBits;\ntypedef VkFlags VkMemoryAllocateFlags;\ntypedef VkFlags VkCommandPoolTrimFlags;\ntypedef VkFlags VkDescriptorUpdateTemplateCreateFlags;\n\ntypedef enum VkExternalMemoryHandleTypeFlagBits {\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT = 0x00000001,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT = 0x00000002,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT = 0x00000004,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT = 0x00000008,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT = 0x00000010,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT = 0x00000020,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT = 0x00000040,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT = 0x00000200,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID = 0x00000400,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT = 0x00000080,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT = 0x00000100,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA = 0x00000800,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NV = 0x00001000,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_SCREEN_BUFFER_BIT_QNX = 0x00004000,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_MTLBUFFER_BIT_EXT = 0x00010000,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_MTLTEXTURE_BIT_EXT = 0x00020000,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_MTLHEAP_BIT_EXT = 0x00040000,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkExternalMemoryHandleTypeFlagBits;\ntypedef VkFlags VkExternalMemoryHandleTypeFlags;\n\ntypedef enum VkExternalMemoryFeatureFlagBits {\n    VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT = 0x00000001,\n    VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT = 0x00000002,\n    VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT = 0x00000004,\n    VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_KHR = VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT,\n    VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_KHR = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT,\n    VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_KHR = VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT,\n    VK_EXTERNAL_MEMORY_FEATURE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkExternalMemoryFeatureFlagBits;\ntypedef VkFlags VkExternalMemoryFeatureFlags;\n\ntypedef enum VkExternalFenceHandleTypeFlagBits {\n    VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT = 0x00000001,\n    VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT = 0x00000002,\n    VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT = 0x00000004,\n    VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT = 0x00000008,\n    VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR = VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT,\n    VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR = VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT,\n    VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR = VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT,\n    VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR = VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT,\n    VK_EXTERNAL_FENCE_HANDLE_TYPE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkExternalFenceHandleTypeFlagBits;\ntypedef VkFlags VkExternalFenceHandleTypeFlags;\n\ntypedef enum VkExternalFenceFeatureFlagBits {\n    VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT = 0x00000001,\n    VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT = 0x00000002,\n    VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT_KHR = VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT,\n    VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT_KHR = VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT,\n    VK_EXTERNAL_FENCE_FEATURE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkExternalFenceFeatureFlagBits;\ntypedef VkFlags VkExternalFenceFeatureFlags;\n\ntypedef enum VkFenceImportFlagBits {\n    VK_FENCE_IMPORT_TEMPORARY_BIT = 0x00000001,\n    VK_FENCE_IMPORT_TEMPORARY_BIT_KHR = VK_FENCE_IMPORT_TEMPORARY_BIT,\n    VK_FENCE_IMPORT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkFenceImportFlagBits;\ntypedef VkFlags VkFenceImportFlags;\n\ntypedef enum VkSemaphoreImportFlagBits {\n    VK_SEMAPHORE_IMPORT_TEMPORARY_BIT = 0x00000001,\n    VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR = VK_SEMAPHORE_IMPORT_TEMPORARY_BIT,\n    VK_SEMAPHORE_IMPORT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkSemaphoreImportFlagBits;\ntypedef VkFlags VkSemaphoreImportFlags;\n\ntypedef enum VkExternalSemaphoreHandleTypeFlagBits {\n    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT = 0x00000001,\n    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT = 0x00000002,\n    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT = 0x00000004,\n    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT = 0x00000008,\n    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT = 0x00000010,\n    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA = 0x00000080,\n    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE_BIT = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT,\n    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT,\n    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT,\n    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT,\n    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT_KHR = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT,\n    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT_KHR = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT,\n    VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkExternalSemaphoreHandleTypeFlagBits;\ntypedef VkFlags VkExternalSemaphoreHandleTypeFlags;\n\ntypedef enum VkExternalSemaphoreFeatureFlagBits {\n    VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT = 0x00000001,\n    VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT = 0x00000002,\n    VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT_KHR = VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT,\n    VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT_KHR = VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT,\n    VK_EXTERNAL_SEMAPHORE_FEATURE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkExternalSemaphoreFeatureFlagBits;\ntypedef VkFlags VkExternalSemaphoreFeatureFlags;\ntypedef struct VkPhysicalDeviceSubgroupProperties {\n    VkStructureType           sType;\n    void*                     pNext;\n    uint32_t                  subgroupSize;\n    VkShaderStageFlags        supportedStages;\n    VkSubgroupFeatureFlags    supportedOperations;\n    VkBool32                  quadOperationsInAllStages;\n} VkPhysicalDeviceSubgroupProperties;\n\ntypedef struct VkBindBufferMemoryInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBuffer           buffer;\n    VkDeviceMemory     memory;\n    VkDeviceSize       memoryOffset;\n} VkBindBufferMemoryInfo;\n\ntypedef struct VkBindImageMemoryInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkImage            image;\n    VkDeviceMemory     memory;\n    VkDeviceSize       memoryOffset;\n} VkBindImageMemoryInfo;\n\ntypedef struct VkPhysicalDevice16BitStorageFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           storageBuffer16BitAccess;\n    VkBool32           uniformAndStorageBuffer16BitAccess;\n    VkBool32           storagePushConstant16;\n    VkBool32           storageInputOutput16;\n} VkPhysicalDevice16BitStorageFeatures;\n\ntypedef struct VkMemoryDedicatedRequirements {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           prefersDedicatedAllocation;\n    VkBool32           requiresDedicatedAllocation;\n} VkMemoryDedicatedRequirements;\n\ntypedef struct VkMemoryDedicatedAllocateInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkImage            image;\n    VkBuffer           buffer;\n} VkMemoryDedicatedAllocateInfo;\n\ntypedef struct VkMemoryAllocateFlagsInfo {\n    VkStructureType          sType;\n    const void*              pNext;\n    VkMemoryAllocateFlags    flags;\n    uint32_t                 deviceMask;\n} VkMemoryAllocateFlagsInfo;\n\ntypedef struct VkDeviceGroupRenderPassBeginInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           deviceMask;\n    uint32_t           deviceRenderAreaCount;\n    const VkRect2D*    pDeviceRenderAreas;\n} VkDeviceGroupRenderPassBeginInfo;\n\ntypedef struct VkDeviceGroupCommandBufferBeginInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           deviceMask;\n} VkDeviceGroupCommandBufferBeginInfo;\n\ntypedef struct VkDeviceGroupSubmitInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           waitSemaphoreCount;\n    const uint32_t*    pWaitSemaphoreDeviceIndices;\n    uint32_t           commandBufferCount;\n    const uint32_t*    pCommandBufferDeviceMasks;\n    uint32_t           signalSemaphoreCount;\n    const uint32_t*    pSignalSemaphoreDeviceIndices;\n} VkDeviceGroupSubmitInfo;\n\ntypedef struct VkDeviceGroupBindSparseInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           resourceDeviceIndex;\n    uint32_t           memoryDeviceIndex;\n} VkDeviceGroupBindSparseInfo;\n\ntypedef struct VkBindBufferMemoryDeviceGroupInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           deviceIndexCount;\n    const uint32_t*    pDeviceIndices;\n} VkBindBufferMemoryDeviceGroupInfo;\n\ntypedef struct VkBindImageMemoryDeviceGroupInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           deviceIndexCount;\n    const uint32_t*    pDeviceIndices;\n    uint32_t           splitInstanceBindRegionCount;\n    const VkRect2D*    pSplitInstanceBindRegions;\n} VkBindImageMemoryDeviceGroupInfo;\n\ntypedef struct VkPhysicalDeviceGroupProperties {\n    VkStructureType     sType;\n    void*               pNext;\n    uint32_t            physicalDeviceCount;\n    VkPhysicalDevice    physicalDevices[VK_MAX_DEVICE_GROUP_SIZE];\n    VkBool32            subsetAllocation;\n} VkPhysicalDeviceGroupProperties;\n\ntypedef struct VkDeviceGroupDeviceCreateInfo {\n    VkStructureType            sType;\n    const void*                pNext;\n    uint32_t                   physicalDeviceCount;\n    const VkPhysicalDevice*    pPhysicalDevices;\n} VkDeviceGroupDeviceCreateInfo;\n\ntypedef struct VkBufferMemoryRequirementsInfo2 {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBuffer           buffer;\n} VkBufferMemoryRequirementsInfo2;\n\ntypedef struct VkImageMemoryRequirementsInfo2 {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkImage            image;\n} VkImageMemoryRequirementsInfo2;\n\ntypedef struct VkImageSparseMemoryRequirementsInfo2 {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkImage            image;\n} VkImageSparseMemoryRequirementsInfo2;\n\ntypedef struct VkMemoryRequirements2 {\n    VkStructureType         sType;\n    void*                   pNext;\n    VkMemoryRequirements    memoryRequirements;\n} VkMemoryRequirements2;\n\ntypedef struct VkSparseImageMemoryRequirements2 {\n    VkStructureType                    sType;\n    void*                              pNext;\n    VkSparseImageMemoryRequirements    memoryRequirements;\n} VkSparseImageMemoryRequirements2;\n\ntypedef struct VkPhysicalDeviceFeatures2 {\n    VkStructureType             sType;\n    void*                       pNext;\n    VkPhysicalDeviceFeatures    features;\n} VkPhysicalDeviceFeatures2;\n\ntypedef struct VkPhysicalDeviceProperties2 {\n    VkStructureType               sType;\n    void*                         pNext;\n    VkPhysicalDeviceProperties    properties;\n} VkPhysicalDeviceProperties2;\n\ntypedef struct VkFormatProperties2 {\n    VkStructureType       sType;\n    void*                 pNext;\n    VkFormatProperties    formatProperties;\n} VkFormatProperties2;\n\ntypedef struct VkImageFormatProperties2 {\n    VkStructureType            sType;\n    void*                      pNext;\n    VkImageFormatProperties    imageFormatProperties;\n} VkImageFormatProperties2;\n\ntypedef struct VkPhysicalDeviceImageFormatInfo2 {\n    VkStructureType       sType;\n    const void*           pNext;\n    VkFormat              format;\n    VkImageType           type;\n    VkImageTiling         tiling;\n    VkImageUsageFlags     usage;\n    VkImageCreateFlags    flags;\n} VkPhysicalDeviceImageFormatInfo2;\n\ntypedef struct VkQueueFamilyProperties2 {\n    VkStructureType            sType;\n    void*                      pNext;\n    VkQueueFamilyProperties    queueFamilyProperties;\n} VkQueueFamilyProperties2;\n\ntypedef struct VkPhysicalDeviceMemoryProperties2 {\n    VkStructureType                     sType;\n    void*                               pNext;\n    VkPhysicalDeviceMemoryProperties    memoryProperties;\n} VkPhysicalDeviceMemoryProperties2;\n\ntypedef struct VkSparseImageFormatProperties2 {\n    VkStructureType                  sType;\n    void*                            pNext;\n    VkSparseImageFormatProperties    properties;\n} VkSparseImageFormatProperties2;\n\ntypedef struct VkPhysicalDeviceSparseImageFormatInfo2 {\n    VkStructureType          sType;\n    const void*              pNext;\n    VkFormat                 format;\n    VkImageType              type;\n    VkSampleCountFlagBits    samples;\n    VkImageUsageFlags        usage;\n    VkImageTiling            tiling;\n} VkPhysicalDeviceSparseImageFormatInfo2;\n\ntypedef struct VkPhysicalDevicePointClippingProperties {\n    VkStructureType            sType;\n    void*                      pNext;\n    VkPointClippingBehavior    pointClippingBehavior;\n} VkPhysicalDevicePointClippingProperties;\n\ntypedef struct VkInputAttachmentAspectReference {\n    uint32_t              subpass;\n    uint32_t              inputAttachmentIndex;\n    VkImageAspectFlags    aspectMask;\n} VkInputAttachmentAspectReference;\n\ntypedef struct VkRenderPassInputAttachmentAspectCreateInfo {\n    VkStructureType                            sType;\n    const void*                                pNext;\n    uint32_t                                   aspectReferenceCount;\n    const VkInputAttachmentAspectReference*    pAspectReferences;\n} VkRenderPassInputAttachmentAspectCreateInfo;\n\ntypedef struct VkImageViewUsageCreateInfo {\n    VkStructureType      sType;\n    const void*          pNext;\n    VkImageUsageFlags    usage;\n} VkImageViewUsageCreateInfo;\n\ntypedef struct VkPipelineTessellationDomainOriginStateCreateInfo {\n    VkStructureType               sType;\n    const void*                   pNext;\n    VkTessellationDomainOrigin    domainOrigin;\n} VkPipelineTessellationDomainOriginStateCreateInfo;\n\ntypedef struct VkRenderPassMultiviewCreateInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           subpassCount;\n    const uint32_t*    pViewMasks;\n    uint32_t           dependencyCount;\n    const int32_t*     pViewOffsets;\n    uint32_t           correlationMaskCount;\n    const uint32_t*    pCorrelationMasks;\n} VkRenderPassMultiviewCreateInfo;\n\ntypedef struct VkPhysicalDeviceMultiviewFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           multiview;\n    VkBool32           multiviewGeometryShader;\n    VkBool32           multiviewTessellationShader;\n} VkPhysicalDeviceMultiviewFeatures;\n\ntypedef struct VkPhysicalDeviceMultiviewProperties {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxMultiviewViewCount;\n    uint32_t           maxMultiviewInstanceIndex;\n} VkPhysicalDeviceMultiviewProperties;\n\ntypedef struct VkPhysicalDeviceVariablePointersFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           variablePointersStorageBuffer;\n    VkBool32           variablePointers;\n} VkPhysicalDeviceVariablePointersFeatures;\n\ntypedef VkPhysicalDeviceVariablePointersFeatures VkPhysicalDeviceVariablePointerFeatures;\n\ntypedef struct VkPhysicalDeviceProtectedMemoryFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           protectedMemory;\n} VkPhysicalDeviceProtectedMemoryFeatures;\n\ntypedef struct VkPhysicalDeviceProtectedMemoryProperties {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           protectedNoFault;\n} VkPhysicalDeviceProtectedMemoryProperties;\n\ntypedef struct VkDeviceQueueInfo2 {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkDeviceQueueCreateFlags    flags;\n    uint32_t                    queueFamilyIndex;\n    uint32_t                    queueIndex;\n} VkDeviceQueueInfo2;\n\ntypedef struct VkProtectedSubmitInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           protectedSubmit;\n} VkProtectedSubmitInfo;\n\ntypedef struct VkSamplerYcbcrConversionCreateInfo {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkFormat                         format;\n    VkSamplerYcbcrModelConversion    ycbcrModel;\n    VkSamplerYcbcrRange              ycbcrRange;\n    VkComponentMapping               components;\n    VkChromaLocation                 xChromaOffset;\n    VkChromaLocation                 yChromaOffset;\n    VkFilter                         chromaFilter;\n    VkBool32                         forceExplicitReconstruction;\n} VkSamplerYcbcrConversionCreateInfo;\n\ntypedef struct VkSamplerYcbcrConversionInfo {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkSamplerYcbcrConversion    conversion;\n} VkSamplerYcbcrConversionInfo;\n\ntypedef struct VkBindImagePlaneMemoryInfo {\n    VkStructureType          sType;\n    const void*              pNext;\n    VkImageAspectFlagBits    planeAspect;\n} VkBindImagePlaneMemoryInfo;\n\ntypedef struct VkImagePlaneMemoryRequirementsInfo {\n    VkStructureType          sType;\n    const void*              pNext;\n    VkImageAspectFlagBits    planeAspect;\n} VkImagePlaneMemoryRequirementsInfo;\n\ntypedef struct VkPhysicalDeviceSamplerYcbcrConversionFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           samplerYcbcrConversion;\n} VkPhysicalDeviceSamplerYcbcrConversionFeatures;\n\ntypedef struct VkSamplerYcbcrConversionImageFormatProperties {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           combinedImageSamplerDescriptorCount;\n} VkSamplerYcbcrConversionImageFormatProperties;\n\ntypedef struct VkDescriptorUpdateTemplateEntry {\n    uint32_t            dstBinding;\n    uint32_t            dstArrayElement;\n    uint32_t            descriptorCount;\n    VkDescriptorType    descriptorType;\n    size_t              offset;\n    size_t              stride;\n} VkDescriptorUpdateTemplateEntry;\n\ntypedef struct VkDescriptorUpdateTemplateCreateInfo {\n    VkStructureType                           sType;\n    const void*                               pNext;\n    VkDescriptorUpdateTemplateCreateFlags     flags;\n    uint32_t                                  descriptorUpdateEntryCount;\n    const VkDescriptorUpdateTemplateEntry*    pDescriptorUpdateEntries;\n    VkDescriptorUpdateTemplateType            templateType;\n    VkDescriptorSetLayout                     descriptorSetLayout;\n    VkPipelineBindPoint                       pipelineBindPoint;\n    VkPipelineLayout                          pipelineLayout;\n    uint32_t                                  set;\n} VkDescriptorUpdateTemplateCreateInfo;\n\ntypedef struct VkExternalMemoryProperties {\n    VkExternalMemoryFeatureFlags       externalMemoryFeatures;\n    VkExternalMemoryHandleTypeFlags    exportFromImportedHandleTypes;\n    VkExternalMemoryHandleTypeFlags    compatibleHandleTypes;\n} VkExternalMemoryProperties;\n\ntypedef struct VkPhysicalDeviceExternalImageFormatInfo {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkExternalMemoryHandleTypeFlagBits    handleType;\n} VkPhysicalDeviceExternalImageFormatInfo;\n\ntypedef struct VkExternalImageFormatProperties {\n    VkStructureType               sType;\n    void*                         pNext;\n    VkExternalMemoryProperties    externalMemoryProperties;\n} VkExternalImageFormatProperties;\n\ntypedef struct VkPhysicalDeviceExternalBufferInfo {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkBufferCreateFlags                   flags;\n    VkBufferUsageFlags                    usage;\n    VkExternalMemoryHandleTypeFlagBits    handleType;\n} VkPhysicalDeviceExternalBufferInfo;\n\ntypedef struct VkExternalBufferProperties {\n    VkStructureType               sType;\n    void*                         pNext;\n    VkExternalMemoryProperties    externalMemoryProperties;\n} VkExternalBufferProperties;\n\ntypedef struct VkPhysicalDeviceIDProperties {\n    VkStructureType    sType;\n    void*              pNext;\n    uint8_t            deviceUUID[VK_UUID_SIZE];\n    uint8_t            driverUUID[VK_UUID_SIZE];\n    uint8_t            deviceLUID[VK_LUID_SIZE];\n    uint32_t           deviceNodeMask;\n    VkBool32           deviceLUIDValid;\n} VkPhysicalDeviceIDProperties;\n\ntypedef struct VkExternalMemoryImageCreateInfo {\n    VkStructureType                    sType;\n    const void*                        pNext;\n    VkExternalMemoryHandleTypeFlags    handleTypes;\n} VkExternalMemoryImageCreateInfo;\n\ntypedef struct VkExternalMemoryBufferCreateInfo {\n    VkStructureType                    sType;\n    const void*                        pNext;\n    VkExternalMemoryHandleTypeFlags    handleTypes;\n} VkExternalMemoryBufferCreateInfo;\n\ntypedef struct VkExportMemoryAllocateInfo {\n    VkStructureType                    sType;\n    const void*                        pNext;\n    VkExternalMemoryHandleTypeFlags    handleTypes;\n} VkExportMemoryAllocateInfo;\n\ntypedef struct VkPhysicalDeviceExternalFenceInfo {\n    VkStructureType                      sType;\n    const void*                          pNext;\n    VkExternalFenceHandleTypeFlagBits    handleType;\n} VkPhysicalDeviceExternalFenceInfo;\n\ntypedef struct VkExternalFenceProperties {\n    VkStructureType                   sType;\n    void*                             pNext;\n    VkExternalFenceHandleTypeFlags    exportFromImportedHandleTypes;\n    VkExternalFenceHandleTypeFlags    compatibleHandleTypes;\n    VkExternalFenceFeatureFlags       externalFenceFeatures;\n} VkExternalFenceProperties;\n\ntypedef struct VkExportFenceCreateInfo {\n    VkStructureType                   sType;\n    const void*                       pNext;\n    VkExternalFenceHandleTypeFlags    handleTypes;\n} VkExportFenceCreateInfo;\n\ntypedef struct VkExportSemaphoreCreateInfo {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkExternalSemaphoreHandleTypeFlags    handleTypes;\n} VkExportSemaphoreCreateInfo;\n\ntypedef struct VkPhysicalDeviceExternalSemaphoreInfo {\n    VkStructureType                          sType;\n    const void*                              pNext;\n    VkExternalSemaphoreHandleTypeFlagBits    handleType;\n} VkPhysicalDeviceExternalSemaphoreInfo;\n\ntypedef struct VkExternalSemaphoreProperties {\n    VkStructureType                       sType;\n    void*                                 pNext;\n    VkExternalSemaphoreHandleTypeFlags    exportFromImportedHandleTypes;\n    VkExternalSemaphoreHandleTypeFlags    compatibleHandleTypes;\n    VkExternalSemaphoreFeatureFlags       externalSemaphoreFeatures;\n} VkExternalSemaphoreProperties;\n\ntypedef struct VkPhysicalDeviceMaintenance3Properties {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxPerSetDescriptors;\n    VkDeviceSize       maxMemoryAllocationSize;\n} VkPhysicalDeviceMaintenance3Properties;\n\ntypedef struct VkDescriptorSetLayoutSupport {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           supported;\n} VkDescriptorSetLayoutSupport;\n\ntypedef struct VkPhysicalDeviceShaderDrawParametersFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderDrawParameters;\n} VkPhysicalDeviceShaderDrawParametersFeatures;\n\ntypedef VkPhysicalDeviceShaderDrawParametersFeatures VkPhysicalDeviceShaderDrawParameterFeatures;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkEnumerateInstanceVersion)(uint32_t* pApiVersion);\ntypedef VkResult (VKAPI_PTR *PFN_vkBindBufferMemory2)(VkDevice device, uint32_t bindInfoCount, const VkBindBufferMemoryInfo* pBindInfos);\ntypedef VkResult (VKAPI_PTR *PFN_vkBindImageMemory2)(VkDevice device, uint32_t bindInfoCount, const VkBindImageMemoryInfo* pBindInfos);\ntypedef void (VKAPI_PTR *PFN_vkGetDeviceGroupPeerMemoryFeatures)(VkDevice device, uint32_t heapIndex, uint32_t localDeviceIndex, uint32_t remoteDeviceIndex, VkPeerMemoryFeatureFlags* pPeerMemoryFeatures);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDeviceMask)(VkCommandBuffer commandBuffer, uint32_t deviceMask);\ntypedef void (VKAPI_PTR *PFN_vkCmdDispatchBase)(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ);\ntypedef VkResult (VKAPI_PTR *PFN_vkEnumeratePhysicalDeviceGroups)(VkInstance instance, uint32_t* pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetImageMemoryRequirements2)(VkDevice device, const VkImageMemoryRequirementsInfo2* pInfo, VkMemoryRequirements2* pMemoryRequirements);\ntypedef void (VKAPI_PTR *PFN_vkGetBufferMemoryRequirements2)(VkDevice device, const VkBufferMemoryRequirementsInfo2* pInfo, VkMemoryRequirements2* pMemoryRequirements);\ntypedef void (VKAPI_PTR *PFN_vkGetImageSparseMemoryRequirements2)(VkDevice device, const VkImageSparseMemoryRequirementsInfo2* pInfo, uint32_t* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements2* pSparseMemoryRequirements);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceFeatures2)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2* pFeatures);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceProperties2)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties2* pProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceFormatProperties2)(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties2* pFormatProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceImageFormatProperties2)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo, VkImageFormatProperties2* pImageFormatProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceQueueFamilyProperties2)(VkPhysicalDevice physicalDevice, uint32_t* pQueueFamilyPropertyCount, VkQueueFamilyProperties2* pQueueFamilyProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceMemoryProperties2)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties2* pMemoryProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceSparseImageFormatProperties2)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo, uint32_t* pPropertyCount, VkSparseImageFormatProperties2* pProperties);\ntypedef void (VKAPI_PTR *PFN_vkTrimCommandPool)(VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlags flags);\ntypedef void (VKAPI_PTR *PFN_vkGetDeviceQueue2)(VkDevice device, const VkDeviceQueueInfo2* pQueueInfo, VkQueue* pQueue);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateSamplerYcbcrConversion)(VkDevice device, const VkSamplerYcbcrConversionCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSamplerYcbcrConversion* pYcbcrConversion);\ntypedef void (VKAPI_PTR *PFN_vkDestroySamplerYcbcrConversion)(VkDevice device, VkSamplerYcbcrConversion ycbcrConversion, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateDescriptorUpdateTemplate)(VkDevice device, const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate);\ntypedef void (VKAPI_PTR *PFN_vkDestroyDescriptorUpdateTemplate)(VkDevice device, VkDescriptorUpdateTemplate descriptorUpdateTemplate, const VkAllocationCallbacks* pAllocator);\ntypedef void (VKAPI_PTR *PFN_vkUpdateDescriptorSetWithTemplate)(VkDevice device, VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplate descriptorUpdateTemplate, const void* pData);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalBufferProperties)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo, VkExternalBufferProperties* pExternalBufferProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalFenceProperties)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo, VkExternalFenceProperties* pExternalFenceProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalSemaphoreProperties)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo, VkExternalSemaphoreProperties* pExternalSemaphoreProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetDescriptorSetLayoutSupport)(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayoutSupport* pSupport);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceVersion(\n    uint32_t*                                   pApiVersion);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkBindBufferMemory2(\n    VkDevice                                    device,\n    uint32_t                                    bindInfoCount,\n    const VkBindBufferMemoryInfo*               pBindInfos);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory2(\n    VkDevice                                    device,\n    uint32_t                                    bindInfoCount,\n    const VkBindImageMemoryInfo*                pBindInfos);\n\nVKAPI_ATTR void VKAPI_CALL vkGetDeviceGroupPeerMemoryFeatures(\n    VkDevice                                    device,\n    uint32_t                                    heapIndex,\n    uint32_t                                    localDeviceIndex,\n    uint32_t                                    remoteDeviceIndex,\n    VkPeerMemoryFeatureFlags*                   pPeerMemoryFeatures);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDeviceMask(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    deviceMask);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDispatchBase(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    baseGroupX,\n    uint32_t                                    baseGroupY,\n    uint32_t                                    baseGroupZ,\n    uint32_t                                    groupCountX,\n    uint32_t                                    groupCountY,\n    uint32_t                                    groupCountZ);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDeviceGroups(\n    VkInstance                                  instance,\n    uint32_t*                                   pPhysicalDeviceGroupCount,\n    VkPhysicalDeviceGroupProperties*            pPhysicalDeviceGroupProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetImageMemoryRequirements2(\n    VkDevice                                    device,\n    const VkImageMemoryRequirementsInfo2*       pInfo,\n    VkMemoryRequirements2*                      pMemoryRequirements);\n\nVKAPI_ATTR void VKAPI_CALL vkGetBufferMemoryRequirements2(\n    VkDevice                                    device,\n    const VkBufferMemoryRequirementsInfo2*      pInfo,\n    VkMemoryRequirements2*                      pMemoryRequirements);\n\nVKAPI_ATTR void VKAPI_CALL vkGetImageSparseMemoryRequirements2(\n    VkDevice                                    device,\n    const VkImageSparseMemoryRequirementsInfo2* pInfo,\n    uint32_t*                                   pSparseMemoryRequirementCount,\n    VkSparseImageMemoryRequirements2*           pSparseMemoryRequirements);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFeatures2(\n    VkPhysicalDevice                            physicalDevice,\n    VkPhysicalDeviceFeatures2*                  pFeatures);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceProperties2(\n    VkPhysicalDevice                            physicalDevice,\n    VkPhysicalDeviceProperties2*                pProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFormatProperties2(\n    VkPhysicalDevice                            physicalDevice,\n    VkFormat                                    format,\n    VkFormatProperties2*                        pFormatProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceImageFormatProperties2(\n    VkPhysicalDevice                            physicalDevice,\n    const VkPhysicalDeviceImageFormatInfo2*     pImageFormatInfo,\n    VkImageFormatProperties2*                   pImageFormatProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyProperties2(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t*                                   pQueueFamilyPropertyCount,\n    VkQueueFamilyProperties2*                   pQueueFamilyProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceMemoryProperties2(\n    VkPhysicalDevice                            physicalDevice,\n    VkPhysicalDeviceMemoryProperties2*          pMemoryProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceSparseImageFormatProperties2(\n    VkPhysicalDevice                            physicalDevice,\n    const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo,\n    uint32_t*                                   pPropertyCount,\n    VkSparseImageFormatProperties2*             pProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkTrimCommandPool(\n    VkDevice                                    device,\n    VkCommandPool                               commandPool,\n    VkCommandPoolTrimFlags                      flags);\n\nVKAPI_ATTR void VKAPI_CALL vkGetDeviceQueue2(\n    VkDevice                                    device,\n    const VkDeviceQueueInfo2*                   pQueueInfo,\n    VkQueue*                                    pQueue);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateSamplerYcbcrConversion(\n    VkDevice                                    device,\n    const VkSamplerYcbcrConversionCreateInfo*   pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSamplerYcbcrConversion*                   pYcbcrConversion);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroySamplerYcbcrConversion(\n    VkDevice                                    device,\n    VkSamplerYcbcrConversion                    ycbcrConversion,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorUpdateTemplate(\n    VkDevice                                    device,\n    const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkDescriptorUpdateTemplate*                 pDescriptorUpdateTemplate);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyDescriptorUpdateTemplate(\n    VkDevice                                    device,\n    VkDescriptorUpdateTemplate                  descriptorUpdateTemplate,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR void VKAPI_CALL vkUpdateDescriptorSetWithTemplate(\n    VkDevice                                    device,\n    VkDescriptorSet                             descriptorSet,\n    VkDescriptorUpdateTemplate                  descriptorUpdateTemplate,\n    const void*                                 pData);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalBufferProperties(\n    VkPhysicalDevice                            physicalDevice,\n    const VkPhysicalDeviceExternalBufferInfo*   pExternalBufferInfo,\n    VkExternalBufferProperties*                 pExternalBufferProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalFenceProperties(\n    VkPhysicalDevice                            physicalDevice,\n    const VkPhysicalDeviceExternalFenceInfo*    pExternalFenceInfo,\n    VkExternalFenceProperties*                  pExternalFenceProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalSemaphoreProperties(\n    VkPhysicalDevice                            physicalDevice,\n    const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,\n    VkExternalSemaphoreProperties*              pExternalSemaphoreProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetDescriptorSetLayoutSupport(\n    VkDevice                                    device,\n    const VkDescriptorSetLayoutCreateInfo*      pCreateInfo,\n    VkDescriptorSetLayoutSupport*               pSupport);\n#endif\n\n\n// VK_VERSION_1_2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_VERSION_1_2 1\n// Vulkan 1.2 version number\n#define VK_API_VERSION_1_2 VK_MAKE_API_VERSION(0, 1, 2, 0)// Patch version should always be set to 0\n\n#define VK_MAX_DRIVER_NAME_SIZE           256U\n#define VK_MAX_DRIVER_INFO_SIZE           256U\n\ntypedef enum VkDriverId {\n    VK_DRIVER_ID_AMD_PROPRIETARY = 1,\n    VK_DRIVER_ID_AMD_OPEN_SOURCE = 2,\n    VK_DRIVER_ID_MESA_RADV = 3,\n    VK_DRIVER_ID_NVIDIA_PROPRIETARY = 4,\n    VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS = 5,\n    VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA = 6,\n    VK_DRIVER_ID_IMAGINATION_PROPRIETARY = 7,\n    VK_DRIVER_ID_QUALCOMM_PROPRIETARY = 8,\n    VK_DRIVER_ID_ARM_PROPRIETARY = 9,\n    VK_DRIVER_ID_GOOGLE_SWIFTSHADER = 10,\n    VK_DRIVER_ID_GGP_PROPRIETARY = 11,\n    VK_DRIVER_ID_BROADCOM_PROPRIETARY = 12,\n    VK_DRIVER_ID_MESA_LLVMPIPE = 13,\n    VK_DRIVER_ID_MOLTENVK = 14,\n    VK_DRIVER_ID_COREAVI_PROPRIETARY = 15,\n    VK_DRIVER_ID_JUICE_PROPRIETARY = 16,\n    VK_DRIVER_ID_VERISILICON_PROPRIETARY = 17,\n    VK_DRIVER_ID_MESA_TURNIP = 18,\n    VK_DRIVER_ID_MESA_V3DV = 19,\n    VK_DRIVER_ID_MESA_PANVK = 20,\n    VK_DRIVER_ID_SAMSUNG_PROPRIETARY = 21,\n    VK_DRIVER_ID_MESA_VENUS = 22,\n    VK_DRIVER_ID_MESA_DOZEN = 23,\n    VK_DRIVER_ID_MESA_NVK = 24,\n    VK_DRIVER_ID_IMAGINATION_OPEN_SOURCE_MESA = 25,\n    VK_DRIVER_ID_MESA_HONEYKRISP = 26,\n    VK_DRIVER_ID_VULKAN_SC_EMULATION_ON_VULKAN = 27,\n    VK_DRIVER_ID_AMD_PROPRIETARY_KHR = VK_DRIVER_ID_AMD_PROPRIETARY,\n    VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR = VK_DRIVER_ID_AMD_OPEN_SOURCE,\n    VK_DRIVER_ID_MESA_RADV_KHR = VK_DRIVER_ID_MESA_RADV,\n    VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR = VK_DRIVER_ID_NVIDIA_PROPRIETARY,\n    VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS_KHR = VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS,\n    VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA_KHR = VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA,\n    VK_DRIVER_ID_IMAGINATION_PROPRIETARY_KHR = VK_DRIVER_ID_IMAGINATION_PROPRIETARY,\n    VK_DRIVER_ID_QUALCOMM_PROPRIETARY_KHR = VK_DRIVER_ID_QUALCOMM_PROPRIETARY,\n    VK_DRIVER_ID_ARM_PROPRIETARY_KHR = VK_DRIVER_ID_ARM_PROPRIETARY,\n    VK_DRIVER_ID_GOOGLE_SWIFTSHADER_KHR = VK_DRIVER_ID_GOOGLE_SWIFTSHADER,\n    VK_DRIVER_ID_GGP_PROPRIETARY_KHR = VK_DRIVER_ID_GGP_PROPRIETARY,\n    VK_DRIVER_ID_BROADCOM_PROPRIETARY_KHR = VK_DRIVER_ID_BROADCOM_PROPRIETARY,\n    VK_DRIVER_ID_MAX_ENUM = 0x7FFFFFFF\n} VkDriverId;\n\ntypedef enum VkShaderFloatControlsIndependence {\n    VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY = 0,\n    VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL = 1,\n    VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE = 2,\n    VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY_KHR = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY,\n    VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL_KHR = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL,\n    VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE_KHR = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE,\n    VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_MAX_ENUM = 0x7FFFFFFF\n} VkShaderFloatControlsIndependence;\n\ntypedef enum VkSamplerReductionMode {\n    VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE = 0,\n    VK_SAMPLER_REDUCTION_MODE_MIN = 1,\n    VK_SAMPLER_REDUCTION_MODE_MAX = 2,\n    VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOM = 1000521000,\n    VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT = VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE,\n    VK_SAMPLER_REDUCTION_MODE_MIN_EXT = VK_SAMPLER_REDUCTION_MODE_MIN,\n    VK_SAMPLER_REDUCTION_MODE_MAX_EXT = VK_SAMPLER_REDUCTION_MODE_MAX,\n    VK_SAMPLER_REDUCTION_MODE_MAX_ENUM = 0x7FFFFFFF\n} VkSamplerReductionMode;\n\ntypedef enum VkSemaphoreType {\n    VK_SEMAPHORE_TYPE_BINARY = 0,\n    VK_SEMAPHORE_TYPE_TIMELINE = 1,\n    VK_SEMAPHORE_TYPE_BINARY_KHR = VK_SEMAPHORE_TYPE_BINARY,\n    VK_SEMAPHORE_TYPE_TIMELINE_KHR = VK_SEMAPHORE_TYPE_TIMELINE,\n    VK_SEMAPHORE_TYPE_MAX_ENUM = 0x7FFFFFFF\n} VkSemaphoreType;\n\ntypedef enum VkResolveModeFlagBits {\n    VK_RESOLVE_MODE_NONE = 0,\n    VK_RESOLVE_MODE_SAMPLE_ZERO_BIT = 0x00000001,\n    VK_RESOLVE_MODE_AVERAGE_BIT = 0x00000002,\n    VK_RESOLVE_MODE_MIN_BIT = 0x00000004,\n    VK_RESOLVE_MODE_MAX_BIT = 0x00000008,\n    VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID = 0x00000010,\n    VK_RESOLVE_MODE_NONE_KHR = VK_RESOLVE_MODE_NONE,\n    VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT,\n    VK_RESOLVE_MODE_AVERAGE_BIT_KHR = VK_RESOLVE_MODE_AVERAGE_BIT,\n    VK_RESOLVE_MODE_MIN_BIT_KHR = VK_RESOLVE_MODE_MIN_BIT,\n    VK_RESOLVE_MODE_MAX_BIT_KHR = VK_RESOLVE_MODE_MAX_BIT,\n    VK_RESOLVE_MODE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkResolveModeFlagBits;\ntypedef VkFlags VkResolveModeFlags;\n\ntypedef enum VkDescriptorBindingFlagBits {\n    VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT = 0x00000001,\n    VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT = 0x00000002,\n    VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT = 0x00000004,\n    VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT = 0x00000008,\n    VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT = VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT,\n    VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT = VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT,\n    VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT = VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT,\n    VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT = VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT,\n    VK_DESCRIPTOR_BINDING_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkDescriptorBindingFlagBits;\ntypedef VkFlags VkDescriptorBindingFlags;\n\ntypedef enum VkSemaphoreWaitFlagBits {\n    VK_SEMAPHORE_WAIT_ANY_BIT = 0x00000001,\n    VK_SEMAPHORE_WAIT_ANY_BIT_KHR = VK_SEMAPHORE_WAIT_ANY_BIT,\n    VK_SEMAPHORE_WAIT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkSemaphoreWaitFlagBits;\ntypedef VkFlags VkSemaphoreWaitFlags;\ntypedef struct VkPhysicalDeviceVulkan11Features {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           storageBuffer16BitAccess;\n    VkBool32           uniformAndStorageBuffer16BitAccess;\n    VkBool32           storagePushConstant16;\n    VkBool32           storageInputOutput16;\n    VkBool32           multiview;\n    VkBool32           multiviewGeometryShader;\n    VkBool32           multiviewTessellationShader;\n    VkBool32           variablePointersStorageBuffer;\n    VkBool32           variablePointers;\n    VkBool32           protectedMemory;\n    VkBool32           samplerYcbcrConversion;\n    VkBool32           shaderDrawParameters;\n} VkPhysicalDeviceVulkan11Features;\n\ntypedef struct VkPhysicalDeviceVulkan11Properties {\n    VkStructureType            sType;\n    void*                      pNext;\n    uint8_t                    deviceUUID[VK_UUID_SIZE];\n    uint8_t                    driverUUID[VK_UUID_SIZE];\n    uint8_t                    deviceLUID[VK_LUID_SIZE];\n    uint32_t                   deviceNodeMask;\n    VkBool32                   deviceLUIDValid;\n    uint32_t                   subgroupSize;\n    VkShaderStageFlags         subgroupSupportedStages;\n    VkSubgroupFeatureFlags     subgroupSupportedOperations;\n    VkBool32                   subgroupQuadOperationsInAllStages;\n    VkPointClippingBehavior    pointClippingBehavior;\n    uint32_t                   maxMultiviewViewCount;\n    uint32_t                   maxMultiviewInstanceIndex;\n    VkBool32                   protectedNoFault;\n    uint32_t                   maxPerSetDescriptors;\n    VkDeviceSize               maxMemoryAllocationSize;\n} VkPhysicalDeviceVulkan11Properties;\n\ntypedef struct VkPhysicalDeviceVulkan12Features {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           samplerMirrorClampToEdge;\n    VkBool32           drawIndirectCount;\n    VkBool32           storageBuffer8BitAccess;\n    VkBool32           uniformAndStorageBuffer8BitAccess;\n    VkBool32           storagePushConstant8;\n    VkBool32           shaderBufferInt64Atomics;\n    VkBool32           shaderSharedInt64Atomics;\n    VkBool32           shaderFloat16;\n    VkBool32           shaderInt8;\n    VkBool32           descriptorIndexing;\n    VkBool32           shaderInputAttachmentArrayDynamicIndexing;\n    VkBool32           shaderUniformTexelBufferArrayDynamicIndexing;\n    VkBool32           shaderStorageTexelBufferArrayDynamicIndexing;\n    VkBool32           shaderUniformBufferArrayNonUniformIndexing;\n    VkBool32           shaderSampledImageArrayNonUniformIndexing;\n    VkBool32           shaderStorageBufferArrayNonUniformIndexing;\n    VkBool32           shaderStorageImageArrayNonUniformIndexing;\n    VkBool32           shaderInputAttachmentArrayNonUniformIndexing;\n    VkBool32           shaderUniformTexelBufferArrayNonUniformIndexing;\n    VkBool32           shaderStorageTexelBufferArrayNonUniformIndexing;\n    VkBool32           descriptorBindingUniformBufferUpdateAfterBind;\n    VkBool32           descriptorBindingSampledImageUpdateAfterBind;\n    VkBool32           descriptorBindingStorageImageUpdateAfterBind;\n    VkBool32           descriptorBindingStorageBufferUpdateAfterBind;\n    VkBool32           descriptorBindingUniformTexelBufferUpdateAfterBind;\n    VkBool32           descriptorBindingStorageTexelBufferUpdateAfterBind;\n    VkBool32           descriptorBindingUpdateUnusedWhilePending;\n    VkBool32           descriptorBindingPartiallyBound;\n    VkBool32           descriptorBindingVariableDescriptorCount;\n    VkBool32           runtimeDescriptorArray;\n    VkBool32           samplerFilterMinmax;\n    VkBool32           scalarBlockLayout;\n    VkBool32           imagelessFramebuffer;\n    VkBool32           uniformBufferStandardLayout;\n    VkBool32           shaderSubgroupExtendedTypes;\n    VkBool32           separateDepthStencilLayouts;\n    VkBool32           hostQueryReset;\n    VkBool32           timelineSemaphore;\n    VkBool32           bufferDeviceAddress;\n    VkBool32           bufferDeviceAddressCaptureReplay;\n    VkBool32           bufferDeviceAddressMultiDevice;\n    VkBool32           vulkanMemoryModel;\n    VkBool32           vulkanMemoryModelDeviceScope;\n    VkBool32           vulkanMemoryModelAvailabilityVisibilityChains;\n    VkBool32           shaderOutputViewportIndex;\n    VkBool32           shaderOutputLayer;\n    VkBool32           subgroupBroadcastDynamicId;\n} VkPhysicalDeviceVulkan12Features;\n\ntypedef struct VkConformanceVersion {\n    uint8_t    major;\n    uint8_t    minor;\n    uint8_t    subminor;\n    uint8_t    patch;\n} VkConformanceVersion;\n\ntypedef struct VkPhysicalDeviceVulkan12Properties {\n    VkStructureType                      sType;\n    void*                                pNext;\n    VkDriverId                           driverID;\n    char                                 driverName[VK_MAX_DRIVER_NAME_SIZE];\n    char                                 driverInfo[VK_MAX_DRIVER_INFO_SIZE];\n    VkConformanceVersion                 conformanceVersion;\n    VkShaderFloatControlsIndependence    denormBehaviorIndependence;\n    VkShaderFloatControlsIndependence    roundingModeIndependence;\n    VkBool32                             shaderSignedZeroInfNanPreserveFloat16;\n    VkBool32                             shaderSignedZeroInfNanPreserveFloat32;\n    VkBool32                             shaderSignedZeroInfNanPreserveFloat64;\n    VkBool32                             shaderDenormPreserveFloat16;\n    VkBool32                             shaderDenormPreserveFloat32;\n    VkBool32                             shaderDenormPreserveFloat64;\n    VkBool32                             shaderDenormFlushToZeroFloat16;\n    VkBool32                             shaderDenormFlushToZeroFloat32;\n    VkBool32                             shaderDenormFlushToZeroFloat64;\n    VkBool32                             shaderRoundingModeRTEFloat16;\n    VkBool32                             shaderRoundingModeRTEFloat32;\n    VkBool32                             shaderRoundingModeRTEFloat64;\n    VkBool32                             shaderRoundingModeRTZFloat16;\n    VkBool32                             shaderRoundingModeRTZFloat32;\n    VkBool32                             shaderRoundingModeRTZFloat64;\n    uint32_t                             maxUpdateAfterBindDescriptorsInAllPools;\n    VkBool32                             shaderUniformBufferArrayNonUniformIndexingNative;\n    VkBool32                             shaderSampledImageArrayNonUniformIndexingNative;\n    VkBool32                             shaderStorageBufferArrayNonUniformIndexingNative;\n    VkBool32                             shaderStorageImageArrayNonUniformIndexingNative;\n    VkBool32                             shaderInputAttachmentArrayNonUniformIndexingNative;\n    VkBool32                             robustBufferAccessUpdateAfterBind;\n    VkBool32                             quadDivergentImplicitLod;\n    uint32_t                             maxPerStageDescriptorUpdateAfterBindSamplers;\n    uint32_t                             maxPerStageDescriptorUpdateAfterBindUniformBuffers;\n    uint32_t                             maxPerStageDescriptorUpdateAfterBindStorageBuffers;\n    uint32_t                             maxPerStageDescriptorUpdateAfterBindSampledImages;\n    uint32_t                             maxPerStageDescriptorUpdateAfterBindStorageImages;\n    uint32_t                             maxPerStageDescriptorUpdateAfterBindInputAttachments;\n    uint32_t                             maxPerStageUpdateAfterBindResources;\n    uint32_t                             maxDescriptorSetUpdateAfterBindSamplers;\n    uint32_t                             maxDescriptorSetUpdateAfterBindUniformBuffers;\n    uint32_t                             maxDescriptorSetUpdateAfterBindUniformBuffersDynamic;\n    uint32_t                             maxDescriptorSetUpdateAfterBindStorageBuffers;\n    uint32_t                             maxDescriptorSetUpdateAfterBindStorageBuffersDynamic;\n    uint32_t                             maxDescriptorSetUpdateAfterBindSampledImages;\n    uint32_t                             maxDescriptorSetUpdateAfterBindStorageImages;\n    uint32_t                             maxDescriptorSetUpdateAfterBindInputAttachments;\n    VkResolveModeFlags                   supportedDepthResolveModes;\n    VkResolveModeFlags                   supportedStencilResolveModes;\n    VkBool32                             independentResolveNone;\n    VkBool32                             independentResolve;\n    VkBool32                             filterMinmaxSingleComponentFormats;\n    VkBool32                             filterMinmaxImageComponentMapping;\n    uint64_t                             maxTimelineSemaphoreValueDifference;\n    VkSampleCountFlags                   framebufferIntegerColorSampleCounts;\n} VkPhysicalDeviceVulkan12Properties;\n\ntypedef struct VkImageFormatListCreateInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           viewFormatCount;\n    const VkFormat*    pViewFormats;\n} VkImageFormatListCreateInfo;\n\ntypedef struct VkAttachmentDescription2 {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    VkAttachmentDescriptionFlags    flags;\n    VkFormat                        format;\n    VkSampleCountFlagBits           samples;\n    VkAttachmentLoadOp              loadOp;\n    VkAttachmentStoreOp             storeOp;\n    VkAttachmentLoadOp              stencilLoadOp;\n    VkAttachmentStoreOp             stencilStoreOp;\n    VkImageLayout                   initialLayout;\n    VkImageLayout                   finalLayout;\n} VkAttachmentDescription2;\n\ntypedef struct VkAttachmentReference2 {\n    VkStructureType       sType;\n    const void*           pNext;\n    uint32_t              attachment;\n    VkImageLayout         layout;\n    VkImageAspectFlags    aspectMask;\n} VkAttachmentReference2;\n\ntypedef struct VkSubpassDescription2 {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkSubpassDescriptionFlags        flags;\n    VkPipelineBindPoint              pipelineBindPoint;\n    uint32_t                         viewMask;\n    uint32_t                         inputAttachmentCount;\n    const VkAttachmentReference2*    pInputAttachments;\n    uint32_t                         colorAttachmentCount;\n    const VkAttachmentReference2*    pColorAttachments;\n    const VkAttachmentReference2*    pResolveAttachments;\n    const VkAttachmentReference2*    pDepthStencilAttachment;\n    uint32_t                         preserveAttachmentCount;\n    const uint32_t*                  pPreserveAttachments;\n} VkSubpassDescription2;\n\ntypedef struct VkSubpassDependency2 {\n    VkStructureType         sType;\n    const void*             pNext;\n    uint32_t                srcSubpass;\n    uint32_t                dstSubpass;\n    VkPipelineStageFlags    srcStageMask;\n    VkPipelineStageFlags    dstStageMask;\n    VkAccessFlags           srcAccessMask;\n    VkAccessFlags           dstAccessMask;\n    VkDependencyFlags       dependencyFlags;\n    int32_t                 viewOffset;\n} VkSubpassDependency2;\n\ntypedef struct VkRenderPassCreateInfo2 {\n    VkStructureType                    sType;\n    const void*                        pNext;\n    VkRenderPassCreateFlags            flags;\n    uint32_t                           attachmentCount;\n    const VkAttachmentDescription2*    pAttachments;\n    uint32_t                           subpassCount;\n    const VkSubpassDescription2*       pSubpasses;\n    uint32_t                           dependencyCount;\n    const VkSubpassDependency2*        pDependencies;\n    uint32_t                           correlatedViewMaskCount;\n    const uint32_t*                    pCorrelatedViewMasks;\n} VkRenderPassCreateInfo2;\n\ntypedef struct VkSubpassBeginInfo {\n    VkStructureType      sType;\n    const void*          pNext;\n    VkSubpassContents    contents;\n} VkSubpassBeginInfo;\n\ntypedef struct VkSubpassEndInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n} VkSubpassEndInfo;\n\ntypedef struct VkPhysicalDevice8BitStorageFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           storageBuffer8BitAccess;\n    VkBool32           uniformAndStorageBuffer8BitAccess;\n    VkBool32           storagePushConstant8;\n} VkPhysicalDevice8BitStorageFeatures;\n\ntypedef struct VkPhysicalDeviceDriverProperties {\n    VkStructureType         sType;\n    void*                   pNext;\n    VkDriverId              driverID;\n    char                    driverName[VK_MAX_DRIVER_NAME_SIZE];\n    char                    driverInfo[VK_MAX_DRIVER_INFO_SIZE];\n    VkConformanceVersion    conformanceVersion;\n} VkPhysicalDeviceDriverProperties;\n\ntypedef struct VkPhysicalDeviceShaderAtomicInt64Features {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderBufferInt64Atomics;\n    VkBool32           shaderSharedInt64Atomics;\n} VkPhysicalDeviceShaderAtomicInt64Features;\n\ntypedef struct VkPhysicalDeviceShaderFloat16Int8Features {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderFloat16;\n    VkBool32           shaderInt8;\n} VkPhysicalDeviceShaderFloat16Int8Features;\n\ntypedef struct VkPhysicalDeviceFloatControlsProperties {\n    VkStructureType                      sType;\n    void*                                pNext;\n    VkShaderFloatControlsIndependence    denormBehaviorIndependence;\n    VkShaderFloatControlsIndependence    roundingModeIndependence;\n    VkBool32                             shaderSignedZeroInfNanPreserveFloat16;\n    VkBool32                             shaderSignedZeroInfNanPreserveFloat32;\n    VkBool32                             shaderSignedZeroInfNanPreserveFloat64;\n    VkBool32                             shaderDenormPreserveFloat16;\n    VkBool32                             shaderDenormPreserveFloat32;\n    VkBool32                             shaderDenormPreserveFloat64;\n    VkBool32                             shaderDenormFlushToZeroFloat16;\n    VkBool32                             shaderDenormFlushToZeroFloat32;\n    VkBool32                             shaderDenormFlushToZeroFloat64;\n    VkBool32                             shaderRoundingModeRTEFloat16;\n    VkBool32                             shaderRoundingModeRTEFloat32;\n    VkBool32                             shaderRoundingModeRTEFloat64;\n    VkBool32                             shaderRoundingModeRTZFloat16;\n    VkBool32                             shaderRoundingModeRTZFloat32;\n    VkBool32                             shaderRoundingModeRTZFloat64;\n} VkPhysicalDeviceFloatControlsProperties;\n\ntypedef struct VkDescriptorSetLayoutBindingFlagsCreateInfo {\n    VkStructureType                    sType;\n    const void*                        pNext;\n    uint32_t                           bindingCount;\n    const VkDescriptorBindingFlags*    pBindingFlags;\n} VkDescriptorSetLayoutBindingFlagsCreateInfo;\n\ntypedef struct VkPhysicalDeviceDescriptorIndexingFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderInputAttachmentArrayDynamicIndexing;\n    VkBool32           shaderUniformTexelBufferArrayDynamicIndexing;\n    VkBool32           shaderStorageTexelBufferArrayDynamicIndexing;\n    VkBool32           shaderUniformBufferArrayNonUniformIndexing;\n    VkBool32           shaderSampledImageArrayNonUniformIndexing;\n    VkBool32           shaderStorageBufferArrayNonUniformIndexing;\n    VkBool32           shaderStorageImageArrayNonUniformIndexing;\n    VkBool32           shaderInputAttachmentArrayNonUniformIndexing;\n    VkBool32           shaderUniformTexelBufferArrayNonUniformIndexing;\n    VkBool32           shaderStorageTexelBufferArrayNonUniformIndexing;\n    VkBool32           descriptorBindingUniformBufferUpdateAfterBind;\n    VkBool32           descriptorBindingSampledImageUpdateAfterBind;\n    VkBool32           descriptorBindingStorageImageUpdateAfterBind;\n    VkBool32           descriptorBindingStorageBufferUpdateAfterBind;\n    VkBool32           descriptorBindingUniformTexelBufferUpdateAfterBind;\n    VkBool32           descriptorBindingStorageTexelBufferUpdateAfterBind;\n    VkBool32           descriptorBindingUpdateUnusedWhilePending;\n    VkBool32           descriptorBindingPartiallyBound;\n    VkBool32           descriptorBindingVariableDescriptorCount;\n    VkBool32           runtimeDescriptorArray;\n} VkPhysicalDeviceDescriptorIndexingFeatures;\n\ntypedef struct VkPhysicalDeviceDescriptorIndexingProperties {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxUpdateAfterBindDescriptorsInAllPools;\n    VkBool32           shaderUniformBufferArrayNonUniformIndexingNative;\n    VkBool32           shaderSampledImageArrayNonUniformIndexingNative;\n    VkBool32           shaderStorageBufferArrayNonUniformIndexingNative;\n    VkBool32           shaderStorageImageArrayNonUniformIndexingNative;\n    VkBool32           shaderInputAttachmentArrayNonUniformIndexingNative;\n    VkBool32           robustBufferAccessUpdateAfterBind;\n    VkBool32           quadDivergentImplicitLod;\n    uint32_t           maxPerStageDescriptorUpdateAfterBindSamplers;\n    uint32_t           maxPerStageDescriptorUpdateAfterBindUniformBuffers;\n    uint32_t           maxPerStageDescriptorUpdateAfterBindStorageBuffers;\n    uint32_t           maxPerStageDescriptorUpdateAfterBindSampledImages;\n    uint32_t           maxPerStageDescriptorUpdateAfterBindStorageImages;\n    uint32_t           maxPerStageDescriptorUpdateAfterBindInputAttachments;\n    uint32_t           maxPerStageUpdateAfterBindResources;\n    uint32_t           maxDescriptorSetUpdateAfterBindSamplers;\n    uint32_t           maxDescriptorSetUpdateAfterBindUniformBuffers;\n    uint32_t           maxDescriptorSetUpdateAfterBindUniformBuffersDynamic;\n    uint32_t           maxDescriptorSetUpdateAfterBindStorageBuffers;\n    uint32_t           maxDescriptorSetUpdateAfterBindStorageBuffersDynamic;\n    uint32_t           maxDescriptorSetUpdateAfterBindSampledImages;\n    uint32_t           maxDescriptorSetUpdateAfterBindStorageImages;\n    uint32_t           maxDescriptorSetUpdateAfterBindInputAttachments;\n} VkPhysicalDeviceDescriptorIndexingProperties;\n\ntypedef struct VkDescriptorSetVariableDescriptorCountAllocateInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           descriptorSetCount;\n    const uint32_t*    pDescriptorCounts;\n} VkDescriptorSetVariableDescriptorCountAllocateInfo;\n\ntypedef struct VkDescriptorSetVariableDescriptorCountLayoutSupport {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxVariableDescriptorCount;\n} VkDescriptorSetVariableDescriptorCountLayoutSupport;\n\ntypedef struct VkSubpassDescriptionDepthStencilResolve {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkResolveModeFlagBits            depthResolveMode;\n    VkResolveModeFlagBits            stencilResolveMode;\n    const VkAttachmentReference2*    pDepthStencilResolveAttachment;\n} VkSubpassDescriptionDepthStencilResolve;\n\ntypedef struct VkPhysicalDeviceDepthStencilResolveProperties {\n    VkStructureType       sType;\n    void*                 pNext;\n    VkResolveModeFlags    supportedDepthResolveModes;\n    VkResolveModeFlags    supportedStencilResolveModes;\n    VkBool32              independentResolveNone;\n    VkBool32              independentResolve;\n} VkPhysicalDeviceDepthStencilResolveProperties;\n\ntypedef struct VkPhysicalDeviceScalarBlockLayoutFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           scalarBlockLayout;\n} VkPhysicalDeviceScalarBlockLayoutFeatures;\n\ntypedef struct VkImageStencilUsageCreateInfo {\n    VkStructureType      sType;\n    const void*          pNext;\n    VkImageUsageFlags    stencilUsage;\n} VkImageStencilUsageCreateInfo;\n\ntypedef struct VkSamplerReductionModeCreateInfo {\n    VkStructureType           sType;\n    const void*               pNext;\n    VkSamplerReductionMode    reductionMode;\n} VkSamplerReductionModeCreateInfo;\n\ntypedef struct VkPhysicalDeviceSamplerFilterMinmaxProperties {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           filterMinmaxSingleComponentFormats;\n    VkBool32           filterMinmaxImageComponentMapping;\n} VkPhysicalDeviceSamplerFilterMinmaxProperties;\n\ntypedef struct VkPhysicalDeviceVulkanMemoryModelFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           vulkanMemoryModel;\n    VkBool32           vulkanMemoryModelDeviceScope;\n    VkBool32           vulkanMemoryModelAvailabilityVisibilityChains;\n} VkPhysicalDeviceVulkanMemoryModelFeatures;\n\ntypedef struct VkPhysicalDeviceImagelessFramebufferFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           imagelessFramebuffer;\n} VkPhysicalDeviceImagelessFramebufferFeatures;\n\ntypedef struct VkFramebufferAttachmentImageInfo {\n    VkStructureType       sType;\n    const void*           pNext;\n    VkImageCreateFlags    flags;\n    VkImageUsageFlags     usage;\n    uint32_t              width;\n    uint32_t              height;\n    uint32_t              layerCount;\n    uint32_t              viewFormatCount;\n    const VkFormat*       pViewFormats;\n} VkFramebufferAttachmentImageInfo;\n\ntypedef struct VkFramebufferAttachmentsCreateInfo {\n    VkStructureType                            sType;\n    const void*                                pNext;\n    uint32_t                                   attachmentImageInfoCount;\n    const VkFramebufferAttachmentImageInfo*    pAttachmentImageInfos;\n} VkFramebufferAttachmentsCreateInfo;\n\ntypedef struct VkRenderPassAttachmentBeginInfo {\n    VkStructureType       sType;\n    const void*           pNext;\n    uint32_t              attachmentCount;\n    const VkImageView*    pAttachments;\n} VkRenderPassAttachmentBeginInfo;\n\ntypedef struct VkPhysicalDeviceUniformBufferStandardLayoutFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           uniformBufferStandardLayout;\n} VkPhysicalDeviceUniformBufferStandardLayoutFeatures;\n\ntypedef struct VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderSubgroupExtendedTypes;\n} VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures;\n\ntypedef struct VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           separateDepthStencilLayouts;\n} VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures;\n\ntypedef struct VkAttachmentReferenceStencilLayout {\n    VkStructureType    sType;\n    void*              pNext;\n    VkImageLayout      stencilLayout;\n} VkAttachmentReferenceStencilLayout;\n\ntypedef struct VkAttachmentDescriptionStencilLayout {\n    VkStructureType    sType;\n    void*              pNext;\n    VkImageLayout      stencilInitialLayout;\n    VkImageLayout      stencilFinalLayout;\n} VkAttachmentDescriptionStencilLayout;\n\ntypedef struct VkPhysicalDeviceHostQueryResetFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           hostQueryReset;\n} VkPhysicalDeviceHostQueryResetFeatures;\n\ntypedef struct VkPhysicalDeviceTimelineSemaphoreFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           timelineSemaphore;\n} VkPhysicalDeviceTimelineSemaphoreFeatures;\n\ntypedef struct VkPhysicalDeviceTimelineSemaphoreProperties {\n    VkStructureType    sType;\n    void*              pNext;\n    uint64_t           maxTimelineSemaphoreValueDifference;\n} VkPhysicalDeviceTimelineSemaphoreProperties;\n\ntypedef struct VkSemaphoreTypeCreateInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkSemaphoreType    semaphoreType;\n    uint64_t           initialValue;\n} VkSemaphoreTypeCreateInfo;\n\ntypedef struct VkTimelineSemaphoreSubmitInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           waitSemaphoreValueCount;\n    const uint64_t*    pWaitSemaphoreValues;\n    uint32_t           signalSemaphoreValueCount;\n    const uint64_t*    pSignalSemaphoreValues;\n} VkTimelineSemaphoreSubmitInfo;\n\ntypedef struct VkSemaphoreWaitInfo {\n    VkStructureType         sType;\n    const void*             pNext;\n    VkSemaphoreWaitFlags    flags;\n    uint32_t                semaphoreCount;\n    const VkSemaphore*      pSemaphores;\n    const uint64_t*         pValues;\n} VkSemaphoreWaitInfo;\n\ntypedef struct VkSemaphoreSignalInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkSemaphore        semaphore;\n    uint64_t           value;\n} VkSemaphoreSignalInfo;\n\ntypedef struct VkPhysicalDeviceBufferDeviceAddressFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           bufferDeviceAddress;\n    VkBool32           bufferDeviceAddressCaptureReplay;\n    VkBool32           bufferDeviceAddressMultiDevice;\n} VkPhysicalDeviceBufferDeviceAddressFeatures;\n\ntypedef struct VkBufferDeviceAddressInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBuffer           buffer;\n} VkBufferDeviceAddressInfo;\n\ntypedef struct VkBufferOpaqueCaptureAddressCreateInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint64_t           opaqueCaptureAddress;\n} VkBufferOpaqueCaptureAddressCreateInfo;\n\ntypedef struct VkMemoryOpaqueCaptureAddressAllocateInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint64_t           opaqueCaptureAddress;\n} VkMemoryOpaqueCaptureAddressAllocateInfo;\n\ntypedef struct VkDeviceMemoryOpaqueCaptureAddressInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkDeviceMemory     memory;\n} VkDeviceMemoryOpaqueCaptureAddressInfo;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawIndirectCount)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride);\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawIndexedIndirectCount)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateRenderPass2)(VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass);\ntypedef void (VKAPI_PTR *PFN_vkCmdBeginRenderPass2)(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo*      pRenderPassBegin, const VkSubpassBeginInfo*      pSubpassBeginInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdNextSubpass2)(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo*      pSubpassBeginInfo, const VkSubpassEndInfo*        pSubpassEndInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdEndRenderPass2)(VkCommandBuffer commandBuffer, const VkSubpassEndInfo*        pSubpassEndInfo);\ntypedef void (VKAPI_PTR *PFN_vkResetQueryPool)(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetSemaphoreCounterValue)(VkDevice device, VkSemaphore semaphore, uint64_t* pValue);\ntypedef VkResult (VKAPI_PTR *PFN_vkWaitSemaphores)(VkDevice device, const VkSemaphoreWaitInfo* pWaitInfo, uint64_t timeout);\ntypedef VkResult (VKAPI_PTR *PFN_vkSignalSemaphore)(VkDevice device, const VkSemaphoreSignalInfo* pSignalInfo);\ntypedef VkDeviceAddress (VKAPI_PTR *PFN_vkGetBufferDeviceAddress)(VkDevice device, const VkBufferDeviceAddressInfo* pInfo);\ntypedef uint64_t (VKAPI_PTR *PFN_vkGetBufferOpaqueCaptureAddress)(VkDevice device, const VkBufferDeviceAddressInfo* pInfo);\ntypedef uint64_t (VKAPI_PTR *PFN_vkGetDeviceMemoryOpaqueCaptureAddress)(VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectCount(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    buffer,\n    VkDeviceSize                                offset,\n    VkBuffer                                    countBuffer,\n    VkDeviceSize                                countBufferOffset,\n    uint32_t                                    maxDrawCount,\n    uint32_t                                    stride);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirectCount(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    buffer,\n    VkDeviceSize                                offset,\n    VkBuffer                                    countBuffer,\n    VkDeviceSize                                countBufferOffset,\n    uint32_t                                    maxDrawCount,\n    uint32_t                                    stride);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass2(\n    VkDevice                                    device,\n    const VkRenderPassCreateInfo2*              pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkRenderPass*                               pRenderPass);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBeginRenderPass2(\n    VkCommandBuffer                             commandBuffer,\n    const VkRenderPassBeginInfo*                pRenderPassBegin,\n    const VkSubpassBeginInfo*                   pSubpassBeginInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass2(\n    VkCommandBuffer                             commandBuffer,\n    const VkSubpassBeginInfo*                   pSubpassBeginInfo,\n    const VkSubpassEndInfo*                     pSubpassEndInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass2(\n    VkCommandBuffer                             commandBuffer,\n    const VkSubpassEndInfo*                     pSubpassEndInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkResetQueryPool(\n    VkDevice                                    device,\n    VkQueryPool                                 queryPool,\n    uint32_t                                    firstQuery,\n    uint32_t                                    queryCount);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreCounterValue(\n    VkDevice                                    device,\n    VkSemaphore                                 semaphore,\n    uint64_t*                                   pValue);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkWaitSemaphores(\n    VkDevice                                    device,\n    const VkSemaphoreWaitInfo*                  pWaitInfo,\n    uint64_t                                    timeout);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkSignalSemaphore(\n    VkDevice                                    device,\n    const VkSemaphoreSignalInfo*                pSignalInfo);\n\nVKAPI_ATTR VkDeviceAddress VKAPI_CALL vkGetBufferDeviceAddress(\n    VkDevice                                    device,\n    const VkBufferDeviceAddressInfo*            pInfo);\n\nVKAPI_ATTR uint64_t VKAPI_CALL vkGetBufferOpaqueCaptureAddress(\n    VkDevice                                    device,\n    const VkBufferDeviceAddressInfo*            pInfo);\n\nVKAPI_ATTR uint64_t VKAPI_CALL vkGetDeviceMemoryOpaqueCaptureAddress(\n    VkDevice                                    device,\n    const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo);\n#endif\n\n\n// VK_VERSION_1_3 is a preprocessor guard. Do not pass it to API calls.\n#define VK_VERSION_1_3 1\n// Vulkan 1.3 version number\n#define VK_API_VERSION_1_3 VK_MAKE_API_VERSION(0, 1, 3, 0)// Patch version should always be set to 0\n\ntypedef uint64_t VkFlags64;\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPrivateDataSlot)\n\ntypedef enum VkPipelineCreationFeedbackFlagBits {\n    VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT = 0x00000001,\n    VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT = 0x00000002,\n    VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT = 0x00000004,\n    VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT_EXT = VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT,\n    VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT_EXT = VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT,\n    VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT_EXT = VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT,\n    VK_PIPELINE_CREATION_FEEDBACK_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkPipelineCreationFeedbackFlagBits;\ntypedef VkFlags VkPipelineCreationFeedbackFlags;\n\ntypedef enum VkToolPurposeFlagBits {\n    VK_TOOL_PURPOSE_VALIDATION_BIT = 0x00000001,\n    VK_TOOL_PURPOSE_PROFILING_BIT = 0x00000002,\n    VK_TOOL_PURPOSE_TRACING_BIT = 0x00000004,\n    VK_TOOL_PURPOSE_ADDITIONAL_FEATURES_BIT = 0x00000008,\n    VK_TOOL_PURPOSE_MODIFYING_FEATURES_BIT = 0x00000010,\n    VK_TOOL_PURPOSE_DEBUG_REPORTING_BIT_EXT = 0x00000020,\n    VK_TOOL_PURPOSE_DEBUG_MARKERS_BIT_EXT = 0x00000040,\n    VK_TOOL_PURPOSE_VALIDATION_BIT_EXT = VK_TOOL_PURPOSE_VALIDATION_BIT,\n    VK_TOOL_PURPOSE_PROFILING_BIT_EXT = VK_TOOL_PURPOSE_PROFILING_BIT,\n    VK_TOOL_PURPOSE_TRACING_BIT_EXT = VK_TOOL_PURPOSE_TRACING_BIT,\n    VK_TOOL_PURPOSE_ADDITIONAL_FEATURES_BIT_EXT = VK_TOOL_PURPOSE_ADDITIONAL_FEATURES_BIT,\n    VK_TOOL_PURPOSE_MODIFYING_FEATURES_BIT_EXT = VK_TOOL_PURPOSE_MODIFYING_FEATURES_BIT,\n    VK_TOOL_PURPOSE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkToolPurposeFlagBits;\ntypedef VkFlags VkToolPurposeFlags;\ntypedef VkFlags VkPrivateDataSlotCreateFlags;\ntypedef VkFlags64 VkPipelineStageFlags2;\n\n// Flag bits for VkPipelineStageFlagBits2\ntypedef VkFlags64 VkPipelineStageFlagBits2;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_NONE = 0ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT = 0x00000001ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT = 0x00000002ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT = 0x00000004ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT = 0x00000008ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT = 0x00000010ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT = 0x00000020ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT = 0x00000040ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT = 0x00000080ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT = 0x00000100ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT = 0x00000200ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT = 0x00000400ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT = 0x00000800ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT = 0x00001000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TRANSFER_BIT = 0x00001000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT = 0x00002000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_HOST_BIT = 0x00004000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT = 0x00008000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT = 0x00010000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COPY_BIT = 0x100000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_RESOLVE_BIT = 0x200000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_BLIT_BIT = 0x400000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_CLEAR_BIT = 0x800000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT = 0x1000000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT = 0x2000000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT = 0x4000000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR = 0x04000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR = 0x08000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_NONE_KHR = 0ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT_KHR = 0x00000001ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT_KHR = 0x00000002ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT_KHR = 0x00000004ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT_KHR = 0x00000008ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT_KHR = 0x00000010ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT_KHR = 0x00000020ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT_KHR = 0x00000040ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT_KHR = 0x00000080ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT_KHR = 0x00000100ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT_KHR = 0x00000200ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR = 0x00000400ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT_KHR = 0x00000800ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT_KHR = 0x00001000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR = 0x00001000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT_KHR = 0x00002000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_HOST_BIT_KHR = 0x00004000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR = 0x00008000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR = 0x00010000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COPY_BIT_KHR = 0x100000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_RESOLVE_BIT_KHR = 0x200000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_BLIT_BIT_KHR = 0x400000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_CLEAR_BIT_KHR = 0x800000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT_KHR = 0x1000000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT_KHR = 0x2000000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT_KHR = 0x4000000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT = 0x01000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT = 0x00040000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV = 0x00020000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_EXT = 0x00020000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00400000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NV = 0x00400000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR = 0x02000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR = 0x00200000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_NV = 0x00200000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_NV = 0x02000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT = 0x00800000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_NV = 0x00080000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_NV = 0x00100000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT = 0x00080000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT = 0x00100000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI = 0x8000000000ULL;\n// VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI is a deprecated alias\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI = 0x8000000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI = 0x10000000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR = 0x10000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT = 0x40000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI = 0x20000000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV = 0x20000000ULL;\nstatic const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_CONVERT_COOPERATIVE_VECTOR_MATRIX_BIT_NV = 0x100000000000ULL;\n\ntypedef VkFlags64 VkAccessFlags2;\n\n// Flag bits for VkAccessFlagBits2\ntypedef VkFlags64 VkAccessFlagBits2;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_NONE = 0ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT = 0x00000001ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_INDEX_READ_BIT = 0x00000002ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT = 0x00000004ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_UNIFORM_READ_BIT = 0x00000008ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT = 0x00000010ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_SHADER_READ_BIT = 0x00000020ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_SHADER_WRITE_BIT = 0x00000040ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT = 0x00000080ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT = 0x00000100ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT = 0x00000200ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT = 0x00000400ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_TRANSFER_READ_BIT = 0x00000800ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_TRANSFER_WRITE_BIT = 0x00001000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_HOST_READ_BIT = 0x00002000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_HOST_WRITE_BIT = 0x00004000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_MEMORY_READ_BIT = 0x00008000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_MEMORY_WRITE_BIT = 0x00010000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_SHADER_SAMPLED_READ_BIT = 0x100000000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_READ_BIT = 0x200000000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT = 0x400000000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR = 0x800000000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR = 0x1000000000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR = 0x2000000000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_VIDEO_ENCODE_WRITE_BIT_KHR = 0x4000000000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_NONE_KHR = 0ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT_KHR = 0x00000001ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_INDEX_READ_BIT_KHR = 0x00000002ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT_KHR = 0x00000004ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_UNIFORM_READ_BIT_KHR = 0x00000008ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT_KHR = 0x00000010ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_SHADER_READ_BIT_KHR = 0x00000020ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_SHADER_WRITE_BIT_KHR = 0x00000040ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT_KHR = 0x00000080ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT_KHR = 0x00000100ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT_KHR = 0x00000200ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT_KHR = 0x00000400ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_TRANSFER_READ_BIT_KHR = 0x00000800ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_TRANSFER_WRITE_BIT_KHR = 0x00001000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_HOST_READ_BIT_KHR = 0x00002000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_HOST_WRITE_BIT_KHR = 0x00004000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_MEMORY_READ_BIT_KHR = 0x00008000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_MEMORY_WRITE_BIT_KHR = 0x00010000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_SHADER_SAMPLED_READ_BIT_KHR = 0x100000000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_READ_BIT_KHR = 0x200000000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT_KHR = 0x400000000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_TRANSFORM_FEEDBACK_WRITE_BIT_EXT = 0x02000000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT = 0x04000000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT = 0x08000000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_CONDITIONAL_RENDERING_READ_BIT_EXT = 0x00100000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_NV = 0x00020000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_NV = 0x00040000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_EXT = 0x00020000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_EXT = 0x00040000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR = 0x00800000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_SHADING_RATE_IMAGE_READ_BIT_NV = 0x00800000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR = 0x00200000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR = 0x00400000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_NV = 0x00200000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_NV = 0x00400000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_FRAGMENT_DENSITY_MAP_READ_BIT_EXT = 0x01000000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT = 0x00080000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_DESCRIPTOR_BUFFER_READ_BIT_EXT = 0x20000000000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI = 0x8000000000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_SHADER_BINDING_TABLE_READ_BIT_KHR = 0x10000000000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_MICROMAP_READ_BIT_EXT = 0x100000000000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_MICROMAP_WRITE_BIT_EXT = 0x200000000000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_OPTICAL_FLOW_READ_BIT_NV = 0x40000000000ULL;\nstatic const VkAccessFlagBits2 VK_ACCESS_2_OPTICAL_FLOW_WRITE_BIT_NV = 0x80000000000ULL;\n\n\ntypedef enum VkSubmitFlagBits {\n    VK_SUBMIT_PROTECTED_BIT = 0x00000001,\n    VK_SUBMIT_PROTECTED_BIT_KHR = VK_SUBMIT_PROTECTED_BIT,\n    VK_SUBMIT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkSubmitFlagBits;\ntypedef VkFlags VkSubmitFlags;\n\ntypedef enum VkRenderingFlagBits {\n    VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT = 0x00000001,\n    VK_RENDERING_SUSPENDING_BIT = 0x00000002,\n    VK_RENDERING_RESUMING_BIT = 0x00000004,\n    VK_RENDERING_ENABLE_LEGACY_DITHERING_BIT_EXT = 0x00000008,\n    VK_RENDERING_CONTENTS_INLINE_BIT_KHR = 0x00000010,\n    VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT,\n    VK_RENDERING_SUSPENDING_BIT_KHR = VK_RENDERING_SUSPENDING_BIT,\n    VK_RENDERING_RESUMING_BIT_KHR = VK_RENDERING_RESUMING_BIT,\n    VK_RENDERING_CONTENTS_INLINE_BIT_EXT = VK_RENDERING_CONTENTS_INLINE_BIT_KHR,\n    VK_RENDERING_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkRenderingFlagBits;\ntypedef VkFlags VkRenderingFlags;\ntypedef VkFlags64 VkFormatFeatureFlags2;\n\n// Flag bits for VkFormatFeatureFlagBits2\ntypedef VkFlags64 VkFormatFeatureFlagBits2;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT = 0x00000001ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT = 0x00000002ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_IMAGE_ATOMIC_BIT = 0x00000004ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_UNIFORM_TEXEL_BUFFER_BIT = 0x00000008ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_BIT = 0x00000010ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_ATOMIC_BIT = 0x00000020ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VERTEX_BUFFER_BIT = 0x00000040ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT = 0x00000080ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BLEND_BIT = 0x00000100ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000200ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_BLIT_SRC_BIT = 0x00000400ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_BLIT_DST_BIT = 0x00000800ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT = 0x00001000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT = 0x00004000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT = 0x00008000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT = 0x00010000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_MIDPOINT_CHROMA_SAMPLES_BIT = 0x00020000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT = 0x00040000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT = 0x00080000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT = 0x00100000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT = 0x00200000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_DISJOINT_BIT = 0x00400000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_COSITED_CHROMA_SAMPLES_BIT = 0x00800000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT = 0x80000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT = 0x100000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT = 0x200000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_CUBIC_BIT = 0x00002000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT = 0x400000000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VIDEO_DECODE_OUTPUT_BIT_KHR = 0x02000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VIDEO_DECODE_DPB_BIT_KHR = 0x04000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR = 0x20000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x01000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x40000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT_EXT = 0x400000000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VIDEO_ENCODE_INPUT_BIT_KHR = 0x08000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VIDEO_ENCODE_DPB_BIT_KHR = 0x10000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR = 0x00000001ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT_KHR = 0x00000002ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_IMAGE_ATOMIC_BIT_KHR = 0x00000004ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_UNIFORM_TEXEL_BUFFER_BIT_KHR = 0x00000008ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_BIT_KHR = 0x00000010ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_ATOMIC_BIT_KHR = 0x00000020ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VERTEX_BUFFER_BIT_KHR = 0x00000040ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT_KHR = 0x00000080ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BLEND_BIT_KHR = 0x00000100ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT_KHR = 0x00000200ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_BLIT_SRC_BIT_KHR = 0x00000400ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_BLIT_DST_BIT_KHR = 0x00000800ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT_KHR = 0x00001000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT_KHR = 0x00004000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT_KHR = 0x00008000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_MIDPOINT_CHROMA_SAMPLES_BIT_KHR = 0x00020000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT_KHR = 0x00040000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT_KHR = 0x00080000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT_KHR = 0x00100000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT_KHR = 0x00200000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_DISJOINT_BIT_KHR = 0x00400000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_COSITED_CHROMA_SAMPLES_BIT_KHR = 0x00800000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT_KHR = 0x80000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT_KHR = 0x100000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT_KHR = 0x200000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT_KHR = 0x00010000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT = 0x00002000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_ACCELERATION_STRUCTURE_RADIUS_BUFFER_BIT_NV = 0x8000000000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_LINEAR_COLOR_ATTACHMENT_BIT_NV = 0x4000000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_WEIGHT_IMAGE_BIT_QCOM = 0x400000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_WEIGHT_SAMPLED_IMAGE_BIT_QCOM = 0x800000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM = 0x1000000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_BOX_FILTER_SAMPLED_BIT_QCOM = 0x2000000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_OPTICAL_FLOW_IMAGE_BIT_NV = 0x10000000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_OPTICAL_FLOW_VECTOR_BIT_NV = 0x20000000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_OPTICAL_FLOW_COST_BIT_NV = 0x40000000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR = 0x2000000000000ULL;\nstatic const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR = 0x4000000000000ULL;\n\ntypedef struct VkPhysicalDeviceVulkan13Features {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           robustImageAccess;\n    VkBool32           inlineUniformBlock;\n    VkBool32           descriptorBindingInlineUniformBlockUpdateAfterBind;\n    VkBool32           pipelineCreationCacheControl;\n    VkBool32           privateData;\n    VkBool32           shaderDemoteToHelperInvocation;\n    VkBool32           shaderTerminateInvocation;\n    VkBool32           subgroupSizeControl;\n    VkBool32           computeFullSubgroups;\n    VkBool32           synchronization2;\n    VkBool32           textureCompressionASTC_HDR;\n    VkBool32           shaderZeroInitializeWorkgroupMemory;\n    VkBool32           dynamicRendering;\n    VkBool32           shaderIntegerDotProduct;\n    VkBool32           maintenance4;\n} VkPhysicalDeviceVulkan13Features;\n\ntypedef struct VkPhysicalDeviceVulkan13Properties {\n    VkStructureType       sType;\n    void*                 pNext;\n    uint32_t              minSubgroupSize;\n    uint32_t              maxSubgroupSize;\n    uint32_t              maxComputeWorkgroupSubgroups;\n    VkShaderStageFlags    requiredSubgroupSizeStages;\n    uint32_t              maxInlineUniformBlockSize;\n    uint32_t              maxPerStageDescriptorInlineUniformBlocks;\n    uint32_t              maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks;\n    uint32_t              maxDescriptorSetInlineUniformBlocks;\n    uint32_t              maxDescriptorSetUpdateAfterBindInlineUniformBlocks;\n    uint32_t              maxInlineUniformTotalSize;\n    VkBool32              integerDotProduct8BitUnsignedAccelerated;\n    VkBool32              integerDotProduct8BitSignedAccelerated;\n    VkBool32              integerDotProduct8BitMixedSignednessAccelerated;\n    VkBool32              integerDotProduct4x8BitPackedUnsignedAccelerated;\n    VkBool32              integerDotProduct4x8BitPackedSignedAccelerated;\n    VkBool32              integerDotProduct4x8BitPackedMixedSignednessAccelerated;\n    VkBool32              integerDotProduct16BitUnsignedAccelerated;\n    VkBool32              integerDotProduct16BitSignedAccelerated;\n    VkBool32              integerDotProduct16BitMixedSignednessAccelerated;\n    VkBool32              integerDotProduct32BitUnsignedAccelerated;\n    VkBool32              integerDotProduct32BitSignedAccelerated;\n    VkBool32              integerDotProduct32BitMixedSignednessAccelerated;\n    VkBool32              integerDotProduct64BitUnsignedAccelerated;\n    VkBool32              integerDotProduct64BitSignedAccelerated;\n    VkBool32              integerDotProduct64BitMixedSignednessAccelerated;\n    VkBool32              integerDotProductAccumulatingSaturating8BitUnsignedAccelerated;\n    VkBool32              integerDotProductAccumulatingSaturating8BitSignedAccelerated;\n    VkBool32              integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated;\n    VkBool32              integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated;\n    VkBool32              integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated;\n    VkBool32              integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated;\n    VkBool32              integerDotProductAccumulatingSaturating16BitUnsignedAccelerated;\n    VkBool32              integerDotProductAccumulatingSaturating16BitSignedAccelerated;\n    VkBool32              integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated;\n    VkBool32              integerDotProductAccumulatingSaturating32BitUnsignedAccelerated;\n    VkBool32              integerDotProductAccumulatingSaturating32BitSignedAccelerated;\n    VkBool32              integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated;\n    VkBool32              integerDotProductAccumulatingSaturating64BitUnsignedAccelerated;\n    VkBool32              integerDotProductAccumulatingSaturating64BitSignedAccelerated;\n    VkBool32              integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated;\n    VkDeviceSize          storageTexelBufferOffsetAlignmentBytes;\n    VkBool32              storageTexelBufferOffsetSingleTexelAlignment;\n    VkDeviceSize          uniformTexelBufferOffsetAlignmentBytes;\n    VkBool32              uniformTexelBufferOffsetSingleTexelAlignment;\n    VkDeviceSize          maxBufferSize;\n} VkPhysicalDeviceVulkan13Properties;\n\ntypedef struct VkPipelineCreationFeedback {\n    VkPipelineCreationFeedbackFlags    flags;\n    uint64_t                           duration;\n} VkPipelineCreationFeedback;\n\ntypedef struct VkPipelineCreationFeedbackCreateInfo {\n    VkStructureType                sType;\n    const void*                    pNext;\n    VkPipelineCreationFeedback*    pPipelineCreationFeedback;\n    uint32_t                       pipelineStageCreationFeedbackCount;\n    VkPipelineCreationFeedback*    pPipelineStageCreationFeedbacks;\n} VkPipelineCreationFeedbackCreateInfo;\n\ntypedef struct VkPhysicalDeviceShaderTerminateInvocationFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderTerminateInvocation;\n} VkPhysicalDeviceShaderTerminateInvocationFeatures;\n\ntypedef struct VkPhysicalDeviceToolProperties {\n    VkStructureType       sType;\n    void*                 pNext;\n    char                  name[VK_MAX_EXTENSION_NAME_SIZE];\n    char                  version[VK_MAX_EXTENSION_NAME_SIZE];\n    VkToolPurposeFlags    purposes;\n    char                  description[VK_MAX_DESCRIPTION_SIZE];\n    char                  layer[VK_MAX_EXTENSION_NAME_SIZE];\n} VkPhysicalDeviceToolProperties;\n\ntypedef struct VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderDemoteToHelperInvocation;\n} VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures;\n\ntypedef struct VkPhysicalDevicePrivateDataFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           privateData;\n} VkPhysicalDevicePrivateDataFeatures;\n\ntypedef struct VkDevicePrivateDataCreateInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           privateDataSlotRequestCount;\n} VkDevicePrivateDataCreateInfo;\n\ntypedef struct VkPrivateDataSlotCreateInfo {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    VkPrivateDataSlotCreateFlags    flags;\n} VkPrivateDataSlotCreateInfo;\n\ntypedef struct VkPhysicalDevicePipelineCreationCacheControlFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           pipelineCreationCacheControl;\n} VkPhysicalDevicePipelineCreationCacheControlFeatures;\n\ntypedef struct VkMemoryBarrier2 {\n    VkStructureType          sType;\n    const void*              pNext;\n    VkPipelineStageFlags2    srcStageMask;\n    VkAccessFlags2           srcAccessMask;\n    VkPipelineStageFlags2    dstStageMask;\n    VkAccessFlags2           dstAccessMask;\n} VkMemoryBarrier2;\n\ntypedef struct VkBufferMemoryBarrier2 {\n    VkStructureType          sType;\n    const void*              pNext;\n    VkPipelineStageFlags2    srcStageMask;\n    VkAccessFlags2           srcAccessMask;\n    VkPipelineStageFlags2    dstStageMask;\n    VkAccessFlags2           dstAccessMask;\n    uint32_t                 srcQueueFamilyIndex;\n    uint32_t                 dstQueueFamilyIndex;\n    VkBuffer                 buffer;\n    VkDeviceSize             offset;\n    VkDeviceSize             size;\n} VkBufferMemoryBarrier2;\n\ntypedef struct VkImageMemoryBarrier2 {\n    VkStructureType            sType;\n    const void*                pNext;\n    VkPipelineStageFlags2      srcStageMask;\n    VkAccessFlags2             srcAccessMask;\n    VkPipelineStageFlags2      dstStageMask;\n    VkAccessFlags2             dstAccessMask;\n    VkImageLayout              oldLayout;\n    VkImageLayout              newLayout;\n    uint32_t                   srcQueueFamilyIndex;\n    uint32_t                   dstQueueFamilyIndex;\n    VkImage                    image;\n    VkImageSubresourceRange    subresourceRange;\n} VkImageMemoryBarrier2;\n\ntypedef struct VkDependencyInfo {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkDependencyFlags                dependencyFlags;\n    uint32_t                         memoryBarrierCount;\n    const VkMemoryBarrier2*          pMemoryBarriers;\n    uint32_t                         bufferMemoryBarrierCount;\n    const VkBufferMemoryBarrier2*    pBufferMemoryBarriers;\n    uint32_t                         imageMemoryBarrierCount;\n    const VkImageMemoryBarrier2*     pImageMemoryBarriers;\n} VkDependencyInfo;\n\ntypedef struct VkSemaphoreSubmitInfo {\n    VkStructureType          sType;\n    const void*              pNext;\n    VkSemaphore              semaphore;\n    uint64_t                 value;\n    VkPipelineStageFlags2    stageMask;\n    uint32_t                 deviceIndex;\n} VkSemaphoreSubmitInfo;\n\ntypedef struct VkCommandBufferSubmitInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkCommandBuffer    commandBuffer;\n    uint32_t           deviceMask;\n} VkCommandBufferSubmitInfo;\n\ntypedef struct VkSubmitInfo2 {\n    VkStructureType                     sType;\n    const void*                         pNext;\n    VkSubmitFlags                       flags;\n    uint32_t                            waitSemaphoreInfoCount;\n    const VkSemaphoreSubmitInfo*        pWaitSemaphoreInfos;\n    uint32_t                            commandBufferInfoCount;\n    const VkCommandBufferSubmitInfo*    pCommandBufferInfos;\n    uint32_t                            signalSemaphoreInfoCount;\n    const VkSemaphoreSubmitInfo*        pSignalSemaphoreInfos;\n} VkSubmitInfo2;\n\ntypedef struct VkPhysicalDeviceSynchronization2Features {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           synchronization2;\n} VkPhysicalDeviceSynchronization2Features;\n\ntypedef struct VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderZeroInitializeWorkgroupMemory;\n} VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures;\n\ntypedef struct VkPhysicalDeviceImageRobustnessFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           robustImageAccess;\n} VkPhysicalDeviceImageRobustnessFeatures;\n\ntypedef struct VkBufferCopy2 {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkDeviceSize       srcOffset;\n    VkDeviceSize       dstOffset;\n    VkDeviceSize       size;\n} VkBufferCopy2;\n\ntypedef struct VkCopyBufferInfo2 {\n    VkStructureType         sType;\n    const void*             pNext;\n    VkBuffer                srcBuffer;\n    VkBuffer                dstBuffer;\n    uint32_t                regionCount;\n    const VkBufferCopy2*    pRegions;\n} VkCopyBufferInfo2;\n\ntypedef struct VkImageCopy2 {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkImageSubresourceLayers    srcSubresource;\n    VkOffset3D                  srcOffset;\n    VkImageSubresourceLayers    dstSubresource;\n    VkOffset3D                  dstOffset;\n    VkExtent3D                  extent;\n} VkImageCopy2;\n\ntypedef struct VkCopyImageInfo2 {\n    VkStructureType        sType;\n    const void*            pNext;\n    VkImage                srcImage;\n    VkImageLayout          srcImageLayout;\n    VkImage                dstImage;\n    VkImageLayout          dstImageLayout;\n    uint32_t               regionCount;\n    const VkImageCopy2*    pRegions;\n} VkCopyImageInfo2;\n\ntypedef struct VkBufferImageCopy2 {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkDeviceSize                bufferOffset;\n    uint32_t                    bufferRowLength;\n    uint32_t                    bufferImageHeight;\n    VkImageSubresourceLayers    imageSubresource;\n    VkOffset3D                  imageOffset;\n    VkExtent3D                  imageExtent;\n} VkBufferImageCopy2;\n\ntypedef struct VkCopyBufferToImageInfo2 {\n    VkStructureType              sType;\n    const void*                  pNext;\n    VkBuffer                     srcBuffer;\n    VkImage                      dstImage;\n    VkImageLayout                dstImageLayout;\n    uint32_t                     regionCount;\n    const VkBufferImageCopy2*    pRegions;\n} VkCopyBufferToImageInfo2;\n\ntypedef struct VkCopyImageToBufferInfo2 {\n    VkStructureType              sType;\n    const void*                  pNext;\n    VkImage                      srcImage;\n    VkImageLayout                srcImageLayout;\n    VkBuffer                     dstBuffer;\n    uint32_t                     regionCount;\n    const VkBufferImageCopy2*    pRegions;\n} VkCopyImageToBufferInfo2;\n\ntypedef struct VkImageBlit2 {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkImageSubresourceLayers    srcSubresource;\n    VkOffset3D                  srcOffsets[2];\n    VkImageSubresourceLayers    dstSubresource;\n    VkOffset3D                  dstOffsets[2];\n} VkImageBlit2;\n\ntypedef struct VkBlitImageInfo2 {\n    VkStructureType        sType;\n    const void*            pNext;\n    VkImage                srcImage;\n    VkImageLayout          srcImageLayout;\n    VkImage                dstImage;\n    VkImageLayout          dstImageLayout;\n    uint32_t               regionCount;\n    const VkImageBlit2*    pRegions;\n    VkFilter               filter;\n} VkBlitImageInfo2;\n\ntypedef struct VkImageResolve2 {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkImageSubresourceLayers    srcSubresource;\n    VkOffset3D                  srcOffset;\n    VkImageSubresourceLayers    dstSubresource;\n    VkOffset3D                  dstOffset;\n    VkExtent3D                  extent;\n} VkImageResolve2;\n\ntypedef struct VkResolveImageInfo2 {\n    VkStructureType           sType;\n    const void*               pNext;\n    VkImage                   srcImage;\n    VkImageLayout             srcImageLayout;\n    VkImage                   dstImage;\n    VkImageLayout             dstImageLayout;\n    uint32_t                  regionCount;\n    const VkImageResolve2*    pRegions;\n} VkResolveImageInfo2;\n\ntypedef struct VkPhysicalDeviceSubgroupSizeControlFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           subgroupSizeControl;\n    VkBool32           computeFullSubgroups;\n} VkPhysicalDeviceSubgroupSizeControlFeatures;\n\ntypedef struct VkPhysicalDeviceSubgroupSizeControlProperties {\n    VkStructureType       sType;\n    void*                 pNext;\n    uint32_t              minSubgroupSize;\n    uint32_t              maxSubgroupSize;\n    uint32_t              maxComputeWorkgroupSubgroups;\n    VkShaderStageFlags    requiredSubgroupSizeStages;\n} VkPhysicalDeviceSubgroupSizeControlProperties;\n\ntypedef struct VkPipelineShaderStageRequiredSubgroupSizeCreateInfo {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           requiredSubgroupSize;\n} VkPipelineShaderStageRequiredSubgroupSizeCreateInfo;\n\ntypedef struct VkPhysicalDeviceInlineUniformBlockFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           inlineUniformBlock;\n    VkBool32           descriptorBindingInlineUniformBlockUpdateAfterBind;\n} VkPhysicalDeviceInlineUniformBlockFeatures;\n\ntypedef struct VkPhysicalDeviceInlineUniformBlockProperties {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxInlineUniformBlockSize;\n    uint32_t           maxPerStageDescriptorInlineUniformBlocks;\n    uint32_t           maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks;\n    uint32_t           maxDescriptorSetInlineUniformBlocks;\n    uint32_t           maxDescriptorSetUpdateAfterBindInlineUniformBlocks;\n} VkPhysicalDeviceInlineUniformBlockProperties;\n\ntypedef struct VkWriteDescriptorSetInlineUniformBlock {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           dataSize;\n    const void*        pData;\n} VkWriteDescriptorSetInlineUniformBlock;\n\ntypedef struct VkDescriptorPoolInlineUniformBlockCreateInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           maxInlineUniformBlockBindings;\n} VkDescriptorPoolInlineUniformBlockCreateInfo;\n\ntypedef struct VkPhysicalDeviceTextureCompressionASTCHDRFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           textureCompressionASTC_HDR;\n} VkPhysicalDeviceTextureCompressionASTCHDRFeatures;\n\ntypedef struct VkRenderingAttachmentInfo {\n    VkStructureType          sType;\n    const void*              pNext;\n    VkImageView              imageView;\n    VkImageLayout            imageLayout;\n    VkResolveModeFlagBits    resolveMode;\n    VkImageView              resolveImageView;\n    VkImageLayout            resolveImageLayout;\n    VkAttachmentLoadOp       loadOp;\n    VkAttachmentStoreOp      storeOp;\n    VkClearValue             clearValue;\n} VkRenderingAttachmentInfo;\n\ntypedef struct VkRenderingInfo {\n    VkStructureType                     sType;\n    const void*                         pNext;\n    VkRenderingFlags                    flags;\n    VkRect2D                            renderArea;\n    uint32_t                            layerCount;\n    uint32_t                            viewMask;\n    uint32_t                            colorAttachmentCount;\n    const VkRenderingAttachmentInfo*    pColorAttachments;\n    const VkRenderingAttachmentInfo*    pDepthAttachment;\n    const VkRenderingAttachmentInfo*    pStencilAttachment;\n} VkRenderingInfo;\n\ntypedef struct VkPipelineRenderingCreateInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           viewMask;\n    uint32_t           colorAttachmentCount;\n    const VkFormat*    pColorAttachmentFormats;\n    VkFormat           depthAttachmentFormat;\n    VkFormat           stencilAttachmentFormat;\n} VkPipelineRenderingCreateInfo;\n\ntypedef struct VkPhysicalDeviceDynamicRenderingFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           dynamicRendering;\n} VkPhysicalDeviceDynamicRenderingFeatures;\n\ntypedef struct VkCommandBufferInheritanceRenderingInfo {\n    VkStructureType          sType;\n    const void*              pNext;\n    VkRenderingFlags         flags;\n    uint32_t                 viewMask;\n    uint32_t                 colorAttachmentCount;\n    const VkFormat*          pColorAttachmentFormats;\n    VkFormat                 depthAttachmentFormat;\n    VkFormat                 stencilAttachmentFormat;\n    VkSampleCountFlagBits    rasterizationSamples;\n} VkCommandBufferInheritanceRenderingInfo;\n\ntypedef struct VkPhysicalDeviceShaderIntegerDotProductFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderIntegerDotProduct;\n} VkPhysicalDeviceShaderIntegerDotProductFeatures;\n\ntypedef struct VkPhysicalDeviceShaderIntegerDotProductProperties {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           integerDotProduct8BitUnsignedAccelerated;\n    VkBool32           integerDotProduct8BitSignedAccelerated;\n    VkBool32           integerDotProduct8BitMixedSignednessAccelerated;\n    VkBool32           integerDotProduct4x8BitPackedUnsignedAccelerated;\n    VkBool32           integerDotProduct4x8BitPackedSignedAccelerated;\n    VkBool32           integerDotProduct4x8BitPackedMixedSignednessAccelerated;\n    VkBool32           integerDotProduct16BitUnsignedAccelerated;\n    VkBool32           integerDotProduct16BitSignedAccelerated;\n    VkBool32           integerDotProduct16BitMixedSignednessAccelerated;\n    VkBool32           integerDotProduct32BitUnsignedAccelerated;\n    VkBool32           integerDotProduct32BitSignedAccelerated;\n    VkBool32           integerDotProduct32BitMixedSignednessAccelerated;\n    VkBool32           integerDotProduct64BitUnsignedAccelerated;\n    VkBool32           integerDotProduct64BitSignedAccelerated;\n    VkBool32           integerDotProduct64BitMixedSignednessAccelerated;\n    VkBool32           integerDotProductAccumulatingSaturating8BitUnsignedAccelerated;\n    VkBool32           integerDotProductAccumulatingSaturating8BitSignedAccelerated;\n    VkBool32           integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated;\n    VkBool32           integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated;\n    VkBool32           integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated;\n    VkBool32           integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated;\n    VkBool32           integerDotProductAccumulatingSaturating16BitUnsignedAccelerated;\n    VkBool32           integerDotProductAccumulatingSaturating16BitSignedAccelerated;\n    VkBool32           integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated;\n    VkBool32           integerDotProductAccumulatingSaturating32BitUnsignedAccelerated;\n    VkBool32           integerDotProductAccumulatingSaturating32BitSignedAccelerated;\n    VkBool32           integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated;\n    VkBool32           integerDotProductAccumulatingSaturating64BitUnsignedAccelerated;\n    VkBool32           integerDotProductAccumulatingSaturating64BitSignedAccelerated;\n    VkBool32           integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated;\n} VkPhysicalDeviceShaderIntegerDotProductProperties;\n\ntypedef struct VkPhysicalDeviceTexelBufferAlignmentProperties {\n    VkStructureType    sType;\n    void*              pNext;\n    VkDeviceSize       storageTexelBufferOffsetAlignmentBytes;\n    VkBool32           storageTexelBufferOffsetSingleTexelAlignment;\n    VkDeviceSize       uniformTexelBufferOffsetAlignmentBytes;\n    VkBool32           uniformTexelBufferOffsetSingleTexelAlignment;\n} VkPhysicalDeviceTexelBufferAlignmentProperties;\n\ntypedef struct VkFormatProperties3 {\n    VkStructureType          sType;\n    void*                    pNext;\n    VkFormatFeatureFlags2    linearTilingFeatures;\n    VkFormatFeatureFlags2    optimalTilingFeatures;\n    VkFormatFeatureFlags2    bufferFeatures;\n} VkFormatProperties3;\n\ntypedef struct VkPhysicalDeviceMaintenance4Features {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           maintenance4;\n} VkPhysicalDeviceMaintenance4Features;\n\ntypedef struct VkPhysicalDeviceMaintenance4Properties {\n    VkStructureType    sType;\n    void*              pNext;\n    VkDeviceSize       maxBufferSize;\n} VkPhysicalDeviceMaintenance4Properties;\n\ntypedef struct VkDeviceBufferMemoryRequirements {\n    VkStructureType              sType;\n    const void*                  pNext;\n    const VkBufferCreateInfo*    pCreateInfo;\n} VkDeviceBufferMemoryRequirements;\n\ntypedef struct VkDeviceImageMemoryRequirements {\n    VkStructureType             sType;\n    const void*                 pNext;\n    const VkImageCreateInfo*    pCreateInfo;\n    VkImageAspectFlagBits       planeAspect;\n} VkDeviceImageMemoryRequirements;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceToolProperties)(VkPhysicalDevice physicalDevice, uint32_t* pToolCount, VkPhysicalDeviceToolProperties* pToolProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreatePrivateDataSlot)(VkDevice device, const VkPrivateDataSlotCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPrivateDataSlot* pPrivateDataSlot);\ntypedef void (VKAPI_PTR *PFN_vkDestroyPrivateDataSlot)(VkDevice device, VkPrivateDataSlot privateDataSlot, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkSetPrivateData)(VkDevice device, VkObjectType objectType, uint64_t objectHandle, VkPrivateDataSlot privateDataSlot, uint64_t data);\ntypedef void (VKAPI_PTR *PFN_vkGetPrivateData)(VkDevice device, VkObjectType objectType, uint64_t objectHandle, VkPrivateDataSlot privateDataSlot, uint64_t* pData);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetEvent2)(VkCommandBuffer                   commandBuffer, VkEvent                                             event, const VkDependencyInfo*                             pDependencyInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdResetEvent2)(VkCommandBuffer                   commandBuffer, VkEvent                                             event, VkPipelineStageFlags2               stageMask);\ntypedef void (VKAPI_PTR *PFN_vkCmdWaitEvents2)(VkCommandBuffer                   commandBuffer, uint32_t                                            eventCount, const VkEvent*                     pEvents, const VkDependencyInfo*            pDependencyInfos);\ntypedef void (VKAPI_PTR *PFN_vkCmdPipelineBarrier2)(VkCommandBuffer                   commandBuffer, const VkDependencyInfo*                             pDependencyInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdWriteTimestamp2)(VkCommandBuffer                   commandBuffer, VkPipelineStageFlags2               stage, VkQueryPool                                         queryPool, uint32_t                                            query);\ntypedef VkResult (VKAPI_PTR *PFN_vkQueueSubmit2)(VkQueue                           queue, uint32_t                            submitCount, const VkSubmitInfo2*              pSubmits, VkFence           fence);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyBuffer2)(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2* pCopyBufferInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyImage2)(VkCommandBuffer commandBuffer, const VkCopyImageInfo2* pCopyImageInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyBufferToImage2)(VkCommandBuffer commandBuffer, const VkCopyBufferToImageInfo2* pCopyBufferToImageInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyImageToBuffer2)(VkCommandBuffer commandBuffer, const VkCopyImageToBufferInfo2* pCopyImageToBufferInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdBlitImage2)(VkCommandBuffer commandBuffer, const VkBlitImageInfo2* pBlitImageInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdResolveImage2)(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdBeginRendering)(VkCommandBuffer                   commandBuffer, const VkRenderingInfo*                              pRenderingInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdEndRendering)(VkCommandBuffer                   commandBuffer);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetCullMode)(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetFrontFace)(VkCommandBuffer commandBuffer, VkFrontFace frontFace);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetPrimitiveTopology)(VkCommandBuffer commandBuffer, VkPrimitiveTopology primitiveTopology);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetViewportWithCount)(VkCommandBuffer commandBuffer, uint32_t viewportCount, const VkViewport* pViewports);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetScissorWithCount)(VkCommandBuffer commandBuffer, uint32_t scissorCount, const VkRect2D* pScissors);\ntypedef void (VKAPI_PTR *PFN_vkCmdBindVertexBuffers2)(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets, const VkDeviceSize* pSizes, const VkDeviceSize* pStrides);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDepthTestEnable)(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDepthWriteEnable)(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDepthCompareOp)(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDepthBoundsTestEnable)(VkCommandBuffer commandBuffer, VkBool32 depthBoundsTestEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetStencilTestEnable)(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetStencilOp)(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp, VkCompareOp compareOp);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetRasterizerDiscardEnable)(VkCommandBuffer commandBuffer, VkBool32 rasterizerDiscardEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDepthBiasEnable)(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetPrimitiveRestartEnable)(VkCommandBuffer commandBuffer, VkBool32 primitiveRestartEnable);\ntypedef void (VKAPI_PTR *PFN_vkGetDeviceBufferMemoryRequirements)(VkDevice device, const VkDeviceBufferMemoryRequirements* pInfo, VkMemoryRequirements2* pMemoryRequirements);\ntypedef void (VKAPI_PTR *PFN_vkGetDeviceImageMemoryRequirements)(VkDevice device, const VkDeviceImageMemoryRequirements* pInfo, VkMemoryRequirements2* pMemoryRequirements);\ntypedef void (VKAPI_PTR *PFN_vkGetDeviceImageSparseMemoryRequirements)(VkDevice device, const VkDeviceImageMemoryRequirements* pInfo, uint32_t* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements2* pSparseMemoryRequirements);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceToolProperties(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t*                                   pToolCount,\n    VkPhysicalDeviceToolProperties*             pToolProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreatePrivateDataSlot(\n    VkDevice                                    device,\n    const VkPrivateDataSlotCreateInfo*          pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkPrivateDataSlot*                          pPrivateDataSlot);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyPrivateDataSlot(\n    VkDevice                                    device,\n    VkPrivateDataSlot                           privateDataSlot,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkSetPrivateData(\n    VkDevice                                    device,\n    VkObjectType                                objectType,\n    uint64_t                                    objectHandle,\n    VkPrivateDataSlot                           privateDataSlot,\n    uint64_t                                    data);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPrivateData(\n    VkDevice                                    device,\n    VkObjectType                                objectType,\n    uint64_t                                    objectHandle,\n    VkPrivateDataSlot                           privateDataSlot,\n    uint64_t*                                   pData);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetEvent2(\n    VkCommandBuffer                             commandBuffer,\n    VkEvent                                     event,\n    const VkDependencyInfo*                     pDependencyInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdResetEvent2(\n    VkCommandBuffer                             commandBuffer,\n    VkEvent                                     event,\n    VkPipelineStageFlags2                       stageMask);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdWaitEvents2(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    eventCount,\n    const VkEvent*                              pEvents,\n    const VkDependencyInfo*                     pDependencyInfos);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdPipelineBarrier2(\n    VkCommandBuffer                             commandBuffer,\n    const VkDependencyInfo*                     pDependencyInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp2(\n    VkCommandBuffer                             commandBuffer,\n    VkPipelineStageFlags2                       stage,\n    VkQueryPool                                 queryPool,\n    uint32_t                                    query);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkQueueSubmit2(\n    VkQueue                                     queue,\n    uint32_t                                    submitCount,\n    const VkSubmitInfo2*                        pSubmits,\n    VkFence                                     fence);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer2(\n    VkCommandBuffer                             commandBuffer,\n    const VkCopyBufferInfo2*                    pCopyBufferInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyImage2(\n    VkCommandBuffer                             commandBuffer,\n    const VkCopyImageInfo2*                     pCopyImageInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage2(\n    VkCommandBuffer                             commandBuffer,\n    const VkCopyBufferToImageInfo2*             pCopyBufferToImageInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer2(\n    VkCommandBuffer                             commandBuffer,\n    const VkCopyImageToBufferInfo2*             pCopyImageToBufferInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBlitImage2(\n    VkCommandBuffer                             commandBuffer,\n    const VkBlitImageInfo2*                     pBlitImageInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdResolveImage2(\n    VkCommandBuffer                             commandBuffer,\n    const VkResolveImageInfo2*                  pResolveImageInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBeginRendering(\n    VkCommandBuffer                             commandBuffer,\n    const VkRenderingInfo*                      pRenderingInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdEndRendering(\n    VkCommandBuffer                             commandBuffer);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetCullMode(\n    VkCommandBuffer                             commandBuffer,\n    VkCullModeFlags                             cullMode);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetFrontFace(\n    VkCommandBuffer                             commandBuffer,\n    VkFrontFace                                 frontFace);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetPrimitiveTopology(\n    VkCommandBuffer                             commandBuffer,\n    VkPrimitiveTopology                         primitiveTopology);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetViewportWithCount(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    viewportCount,\n    const VkViewport*                           pViewports);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetScissorWithCount(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    scissorCount,\n    const VkRect2D*                             pScissors);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers2(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    firstBinding,\n    uint32_t                                    bindingCount,\n    const VkBuffer*                             pBuffers,\n    const VkDeviceSize*                         pOffsets,\n    const VkDeviceSize*                         pSizes,\n    const VkDeviceSize*                         pStrides);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDepthTestEnable(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    depthTestEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDepthWriteEnable(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    depthWriteEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDepthCompareOp(\n    VkCommandBuffer                             commandBuffer,\n    VkCompareOp                                 depthCompareOp);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBoundsTestEnable(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    depthBoundsTestEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetStencilTestEnable(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    stencilTestEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetStencilOp(\n    VkCommandBuffer                             commandBuffer,\n    VkStencilFaceFlags                          faceMask,\n    VkStencilOp                                 failOp,\n    VkStencilOp                                 passOp,\n    VkStencilOp                                 depthFailOp,\n    VkCompareOp                                 compareOp);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetRasterizerDiscardEnable(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    rasterizerDiscardEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBiasEnable(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    depthBiasEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetPrimitiveRestartEnable(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    primitiveRestartEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkGetDeviceBufferMemoryRequirements(\n    VkDevice                                    device,\n    const VkDeviceBufferMemoryRequirements*     pInfo,\n    VkMemoryRequirements2*                      pMemoryRequirements);\n\nVKAPI_ATTR void VKAPI_CALL vkGetDeviceImageMemoryRequirements(\n    VkDevice                                    device,\n    const VkDeviceImageMemoryRequirements*      pInfo,\n    VkMemoryRequirements2*                      pMemoryRequirements);\n\nVKAPI_ATTR void VKAPI_CALL vkGetDeviceImageSparseMemoryRequirements(\n    VkDevice                                    device,\n    const VkDeviceImageMemoryRequirements*      pInfo,\n    uint32_t*                                   pSparseMemoryRequirementCount,\n    VkSparseImageMemoryRequirements2*           pSparseMemoryRequirements);\n#endif\n\n\n// VK_VERSION_1_4 is a preprocessor guard. Do not pass it to API calls.\n#define VK_VERSION_1_4 1\n// Vulkan 1.4 version number\n#define VK_API_VERSION_1_4 VK_MAKE_API_VERSION(0, 1, 4, 0)// Patch version should always be set to 0\n\n#define VK_MAX_GLOBAL_PRIORITY_SIZE       16U\n\ntypedef enum VkPipelineRobustnessBufferBehavior {\n    VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT = 0,\n    VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED = 1,\n    VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS = 2,\n    VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2 = 3,\n    VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT_EXT = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT,\n    VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED_EXT = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED,\n    VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_EXT = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS,\n    VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2,\n    VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_MAX_ENUM = 0x7FFFFFFF\n} VkPipelineRobustnessBufferBehavior;\n\ntypedef enum VkPipelineRobustnessImageBehavior {\n    VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT = 0,\n    VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DISABLED = 1,\n    VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS = 2,\n    VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2 = 3,\n    VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT_EXT = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT,\n    VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DISABLED_EXT = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DISABLED,\n    VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_EXT = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS,\n    VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2_EXT = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2,\n    VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_MAX_ENUM = 0x7FFFFFFF\n} VkPipelineRobustnessImageBehavior;\n\ntypedef enum VkQueueGlobalPriority {\n    VK_QUEUE_GLOBAL_PRIORITY_LOW = 128,\n    VK_QUEUE_GLOBAL_PRIORITY_MEDIUM = 256,\n    VK_QUEUE_GLOBAL_PRIORITY_HIGH = 512,\n    VK_QUEUE_GLOBAL_PRIORITY_REALTIME = 1024,\n    VK_QUEUE_GLOBAL_PRIORITY_LOW_EXT = VK_QUEUE_GLOBAL_PRIORITY_LOW,\n    VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT = VK_QUEUE_GLOBAL_PRIORITY_MEDIUM,\n    VK_QUEUE_GLOBAL_PRIORITY_HIGH_EXT = VK_QUEUE_GLOBAL_PRIORITY_HIGH,\n    VK_QUEUE_GLOBAL_PRIORITY_REALTIME_EXT = VK_QUEUE_GLOBAL_PRIORITY_REALTIME,\n    VK_QUEUE_GLOBAL_PRIORITY_LOW_KHR = VK_QUEUE_GLOBAL_PRIORITY_LOW,\n    VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR = VK_QUEUE_GLOBAL_PRIORITY_MEDIUM,\n    VK_QUEUE_GLOBAL_PRIORITY_HIGH_KHR = VK_QUEUE_GLOBAL_PRIORITY_HIGH,\n    VK_QUEUE_GLOBAL_PRIORITY_REALTIME_KHR = VK_QUEUE_GLOBAL_PRIORITY_REALTIME,\n    VK_QUEUE_GLOBAL_PRIORITY_MAX_ENUM = 0x7FFFFFFF\n} VkQueueGlobalPriority;\n\ntypedef enum VkLineRasterizationMode {\n    VK_LINE_RASTERIZATION_MODE_DEFAULT = 0,\n    VK_LINE_RASTERIZATION_MODE_RECTANGULAR = 1,\n    VK_LINE_RASTERIZATION_MODE_BRESENHAM = 2,\n    VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH = 3,\n    VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT = VK_LINE_RASTERIZATION_MODE_DEFAULT,\n    VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT = VK_LINE_RASTERIZATION_MODE_RECTANGULAR,\n    VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT = VK_LINE_RASTERIZATION_MODE_BRESENHAM,\n    VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT = VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH,\n    VK_LINE_RASTERIZATION_MODE_DEFAULT_KHR = VK_LINE_RASTERIZATION_MODE_DEFAULT,\n    VK_LINE_RASTERIZATION_MODE_RECTANGULAR_KHR = VK_LINE_RASTERIZATION_MODE_RECTANGULAR,\n    VK_LINE_RASTERIZATION_MODE_BRESENHAM_KHR = VK_LINE_RASTERIZATION_MODE_BRESENHAM,\n    VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_KHR = VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH,\n    VK_LINE_RASTERIZATION_MODE_MAX_ENUM = 0x7FFFFFFF\n} VkLineRasterizationMode;\n\ntypedef enum VkMemoryUnmapFlagBits {\n    VK_MEMORY_UNMAP_RESERVE_BIT_EXT = 0x00000001,\n    VK_MEMORY_UNMAP_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkMemoryUnmapFlagBits;\ntypedef VkFlags VkMemoryUnmapFlags;\ntypedef VkFlags64 VkPipelineCreateFlags2;\n\n// Flag bits for VkPipelineCreateFlagBits2\ntypedef VkFlags64 VkPipelineCreateFlagBits2;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DISABLE_OPTIMIZATION_BIT = 0x00000001ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_ALLOW_DERIVATIVES_BIT = 0x00000002ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DERIVATIVE_BIT = 0x00000004ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_VIEW_INDEX_FROM_DEVICE_INDEX_BIT = 0x00000008ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DISPATCH_BASE_BIT = 0x00000010ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT = 0x00000100ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_EARLY_RETURN_ON_FAILURE_BIT = 0x00000200ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_NO_PROTECTED_ACCESS_BIT = 0x08000000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_PROTECTED_ACCESS_ONLY_BIT = 0x40000000ULL;\n#ifdef VK_ENABLE_BETA_EXTENSIONS\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_EXECUTION_GRAPH_BIT_AMDX = 0x100000000ULL;\n#endif\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_SKIP_BUILT_IN_PRIMITIVES_BIT_KHR = 0x00001000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_ALLOW_SPHERES_AND_LINEAR_SWEPT_SPHERES_BIT_NV = 0x200000000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_ENABLE_LEGACY_DITHERING_BIT_EXT = 0x400000000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DISABLE_OPTIMIZATION_BIT_KHR = 0x00000001ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_ALLOW_DERIVATIVES_BIT_KHR = 0x00000002ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DERIVATIVE_BIT_KHR = 0x00000004ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_VIEW_INDEX_FROM_DEVICE_INDEX_BIT_KHR = 0x00000008ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DISPATCH_BASE_BIT_KHR = 0x00000010ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DEFER_COMPILE_BIT_NV = 0x00000020ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_CAPTURE_STATISTICS_BIT_KHR = 0x00000040ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR = 0x00000080ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_KHR = 0x00000100ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_EARLY_RETURN_ON_FAILURE_BIT_KHR = 0x00000200ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_LINK_TIME_OPTIMIZATION_BIT_EXT = 0x00000400ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT = 0x00800000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_LIBRARY_BIT_KHR = 0x00000800ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR = 0x00001000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_SKIP_AABBS_BIT_KHR = 0x00002000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR = 0x00004000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR = 0x00008000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR = 0x00010000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR = 0x00020000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR = 0x00080000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_INDIRECT_BINDABLE_BIT_NV = 0x00040000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_ALLOW_MOTION_BIT_NV = 0x00100000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00200000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT = 0x00400000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT = 0x01000000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0x02000000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0x04000000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_NO_PROTECTED_ACCESS_BIT_EXT = 0x08000000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_PROTECTED_ACCESS_ONLY_BIT_EXT = 0x40000000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV = 0x10000000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DESCRIPTOR_BUFFER_BIT_EXT = 0x20000000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DISALLOW_OPACITY_MICROMAP_BIT_ARM = 0x2000000000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR = 0x80000000ULL;\nstatic const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_INDIRECT_BINDABLE_BIT_EXT = 0x4000000000ULL;\n\ntypedef VkFlags64 VkBufferUsageFlags2;\n\n// Flag bits for VkBufferUsageFlagBits2\ntypedef VkFlags64 VkBufferUsageFlagBits2;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFER_SRC_BIT = 0x00000001ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFER_DST_BIT = 0x00000002ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_UNIFORM_TEXEL_BUFFER_BIT = 0x00000004ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT = 0x00000008ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_UNIFORM_BUFFER_BIT = 0x00000010ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_STORAGE_BUFFER_BIT = 0x00000020ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_INDEX_BUFFER_BIT = 0x00000040ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VERTEX_BUFFER_BIT = 0x00000080ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_INDIRECT_BUFFER_BIT = 0x00000100ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_SHADER_DEVICE_ADDRESS_BIT = 0x00020000ULL;\n#ifdef VK_ENABLE_BETA_EXTENSIONS\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_EXECUTION_GRAPH_SCRATCH_BIT_AMDX = 0x02000000ULL;\n#endif\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFER_SRC_BIT_KHR = 0x00000001ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFER_DST_BIT_KHR = 0x00000002ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_UNIFORM_TEXEL_BUFFER_BIT_KHR = 0x00000004ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT_KHR = 0x00000008ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_UNIFORM_BUFFER_BIT_KHR = 0x00000010ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_STORAGE_BUFFER_BIT_KHR = 0x00000020ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_INDEX_BUFFER_BIT_KHR = 0x00000040ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VERTEX_BUFFER_BIT_KHR = 0x00000080ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_INDIRECT_BUFFER_BIT_KHR = 0x00000100ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_CONDITIONAL_RENDERING_BIT_EXT = 0x00000200ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_SHADER_BINDING_TABLE_BIT_KHR = 0x00000400ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_RAY_TRACING_BIT_NV = 0x00000400ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT = 0x00000800ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT = 0x00001000ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VIDEO_DECODE_SRC_BIT_KHR = 0x00002000ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VIDEO_DECODE_DST_BIT_KHR = 0x00004000ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VIDEO_ENCODE_DST_BIT_KHR = 0x00008000ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VIDEO_ENCODE_SRC_BIT_KHR = 0x00010000ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_SHADER_DEVICE_ADDRESS_BIT_KHR = 0x00020000ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR = 0x00080000ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR = 0x00100000ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT = 0x00200000ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT = 0x00400000ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT = 0x04000000ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_MICROMAP_BUILD_INPUT_READ_ONLY_BIT_EXT = 0x00800000ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_MICROMAP_STORAGE_BIT_EXT = 0x01000000ULL;\nstatic const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_PREPROCESS_BUFFER_BIT_EXT = 0x80000000ULL;\n\n\ntypedef enum VkHostImageCopyFlagBits {\n    VK_HOST_IMAGE_COPY_MEMCPY = 0x00000001,\n    VK_HOST_IMAGE_COPY_MEMCPY_EXT = VK_HOST_IMAGE_COPY_MEMCPY,\n    VK_HOST_IMAGE_COPY_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkHostImageCopyFlagBits;\ntypedef VkFlags VkHostImageCopyFlags;\ntypedef struct VkPhysicalDeviceVulkan14Features {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           globalPriorityQuery;\n    VkBool32           shaderSubgroupRotate;\n    VkBool32           shaderSubgroupRotateClustered;\n    VkBool32           shaderFloatControls2;\n    VkBool32           shaderExpectAssume;\n    VkBool32           rectangularLines;\n    VkBool32           bresenhamLines;\n    VkBool32           smoothLines;\n    VkBool32           stippledRectangularLines;\n    VkBool32           stippledBresenhamLines;\n    VkBool32           stippledSmoothLines;\n    VkBool32           vertexAttributeInstanceRateDivisor;\n    VkBool32           vertexAttributeInstanceRateZeroDivisor;\n    VkBool32           indexTypeUint8;\n    VkBool32           dynamicRenderingLocalRead;\n    VkBool32           maintenance5;\n    VkBool32           maintenance6;\n    VkBool32           pipelineProtectedAccess;\n    VkBool32           pipelineRobustness;\n    VkBool32           hostImageCopy;\n    VkBool32           pushDescriptor;\n} VkPhysicalDeviceVulkan14Features;\n\ntypedef struct VkPhysicalDeviceVulkan14Properties {\n    VkStructureType                       sType;\n    void*                                 pNext;\n    uint32_t                              lineSubPixelPrecisionBits;\n    uint32_t                              maxVertexAttribDivisor;\n    VkBool32                              supportsNonZeroFirstInstance;\n    uint32_t                              maxPushDescriptors;\n    VkBool32                              dynamicRenderingLocalReadDepthStencilAttachments;\n    VkBool32                              dynamicRenderingLocalReadMultisampledAttachments;\n    VkBool32                              earlyFragmentMultisampleCoverageAfterSampleCounting;\n    VkBool32                              earlyFragmentSampleMaskTestBeforeSampleCounting;\n    VkBool32                              depthStencilSwizzleOneSupport;\n    VkBool32                              polygonModePointSize;\n    VkBool32                              nonStrictSinglePixelWideLinesUseParallelogram;\n    VkBool32                              nonStrictWideLinesUseParallelogram;\n    VkBool32                              blockTexelViewCompatibleMultipleLayers;\n    uint32_t                              maxCombinedImageSamplerDescriptorCount;\n    VkBool32                              fragmentShadingRateClampCombinerInputs;\n    VkPipelineRobustnessBufferBehavior    defaultRobustnessStorageBuffers;\n    VkPipelineRobustnessBufferBehavior    defaultRobustnessUniformBuffers;\n    VkPipelineRobustnessBufferBehavior    defaultRobustnessVertexInputs;\n    VkPipelineRobustnessImageBehavior     defaultRobustnessImages;\n    uint32_t                              copySrcLayoutCount;\n    VkImageLayout*                        pCopySrcLayouts;\n    uint32_t                              copyDstLayoutCount;\n    VkImageLayout*                        pCopyDstLayouts;\n    uint8_t                               optimalTilingLayoutUUID[VK_UUID_SIZE];\n    VkBool32                              identicalMemoryTypeRequirements;\n} VkPhysicalDeviceVulkan14Properties;\n\ntypedef struct VkDeviceQueueGlobalPriorityCreateInfo {\n    VkStructureType          sType;\n    const void*              pNext;\n    VkQueueGlobalPriority    globalPriority;\n} VkDeviceQueueGlobalPriorityCreateInfo;\n\ntypedef struct VkPhysicalDeviceGlobalPriorityQueryFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           globalPriorityQuery;\n} VkPhysicalDeviceGlobalPriorityQueryFeatures;\n\ntypedef struct VkQueueFamilyGlobalPriorityProperties {\n    VkStructureType          sType;\n    void*                    pNext;\n    uint32_t                 priorityCount;\n    VkQueueGlobalPriority    priorities[VK_MAX_GLOBAL_PRIORITY_SIZE];\n} VkQueueFamilyGlobalPriorityProperties;\n\ntypedef struct VkPhysicalDeviceShaderSubgroupRotateFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderSubgroupRotate;\n    VkBool32           shaderSubgroupRotateClustered;\n} VkPhysicalDeviceShaderSubgroupRotateFeatures;\n\ntypedef struct VkPhysicalDeviceShaderFloatControls2Features {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderFloatControls2;\n} VkPhysicalDeviceShaderFloatControls2Features;\n\ntypedef struct VkPhysicalDeviceShaderExpectAssumeFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderExpectAssume;\n} VkPhysicalDeviceShaderExpectAssumeFeatures;\n\ntypedef struct VkPhysicalDeviceLineRasterizationFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           rectangularLines;\n    VkBool32           bresenhamLines;\n    VkBool32           smoothLines;\n    VkBool32           stippledRectangularLines;\n    VkBool32           stippledBresenhamLines;\n    VkBool32           stippledSmoothLines;\n} VkPhysicalDeviceLineRasterizationFeatures;\n\ntypedef struct VkPhysicalDeviceLineRasterizationProperties {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           lineSubPixelPrecisionBits;\n} VkPhysicalDeviceLineRasterizationProperties;\n\ntypedef struct VkPipelineRasterizationLineStateCreateInfo {\n    VkStructureType            sType;\n    const void*                pNext;\n    VkLineRasterizationMode    lineRasterizationMode;\n    VkBool32                   stippledLineEnable;\n    uint32_t                   lineStippleFactor;\n    uint16_t                   lineStipplePattern;\n} VkPipelineRasterizationLineStateCreateInfo;\n\ntypedef struct VkPhysicalDeviceVertexAttributeDivisorProperties {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxVertexAttribDivisor;\n    VkBool32           supportsNonZeroFirstInstance;\n} VkPhysicalDeviceVertexAttributeDivisorProperties;\n\ntypedef struct VkVertexInputBindingDivisorDescription {\n    uint32_t    binding;\n    uint32_t    divisor;\n} VkVertexInputBindingDivisorDescription;\n\ntypedef struct VkPipelineVertexInputDivisorStateCreateInfo {\n    VkStructureType                                  sType;\n    const void*                                      pNext;\n    uint32_t                                         vertexBindingDivisorCount;\n    const VkVertexInputBindingDivisorDescription*    pVertexBindingDivisors;\n} VkPipelineVertexInputDivisorStateCreateInfo;\n\ntypedef struct VkPhysicalDeviceVertexAttributeDivisorFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           vertexAttributeInstanceRateDivisor;\n    VkBool32           vertexAttributeInstanceRateZeroDivisor;\n} VkPhysicalDeviceVertexAttributeDivisorFeatures;\n\ntypedef struct VkPhysicalDeviceIndexTypeUint8Features {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           indexTypeUint8;\n} VkPhysicalDeviceIndexTypeUint8Features;\n\ntypedef struct VkMemoryMapInfo {\n    VkStructureType     sType;\n    const void*         pNext;\n    VkMemoryMapFlags    flags;\n    VkDeviceMemory      memory;\n    VkDeviceSize        offset;\n    VkDeviceSize        size;\n} VkMemoryMapInfo;\n\ntypedef struct VkMemoryUnmapInfo {\n    VkStructureType       sType;\n    const void*           pNext;\n    VkMemoryUnmapFlags    flags;\n    VkDeviceMemory        memory;\n} VkMemoryUnmapInfo;\n\ntypedef struct VkPhysicalDeviceMaintenance5Features {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           maintenance5;\n} VkPhysicalDeviceMaintenance5Features;\n\ntypedef struct VkPhysicalDeviceMaintenance5Properties {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           earlyFragmentMultisampleCoverageAfterSampleCounting;\n    VkBool32           earlyFragmentSampleMaskTestBeforeSampleCounting;\n    VkBool32           depthStencilSwizzleOneSupport;\n    VkBool32           polygonModePointSize;\n    VkBool32           nonStrictSinglePixelWideLinesUseParallelogram;\n    VkBool32           nonStrictWideLinesUseParallelogram;\n} VkPhysicalDeviceMaintenance5Properties;\n\ntypedef struct VkRenderingAreaInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           viewMask;\n    uint32_t           colorAttachmentCount;\n    const VkFormat*    pColorAttachmentFormats;\n    VkFormat           depthAttachmentFormat;\n    VkFormat           stencilAttachmentFormat;\n} VkRenderingAreaInfo;\n\ntypedef struct VkImageSubresource2 {\n    VkStructureType       sType;\n    void*                 pNext;\n    VkImageSubresource    imageSubresource;\n} VkImageSubresource2;\n\ntypedef struct VkDeviceImageSubresourceInfo {\n    VkStructureType               sType;\n    const void*                   pNext;\n    const VkImageCreateInfo*      pCreateInfo;\n    const VkImageSubresource2*    pSubresource;\n} VkDeviceImageSubresourceInfo;\n\ntypedef struct VkSubresourceLayout2 {\n    VkStructureType        sType;\n    void*                  pNext;\n    VkSubresourceLayout    subresourceLayout;\n} VkSubresourceLayout2;\n\ntypedef struct VkPipelineCreateFlags2CreateInfo {\n    VkStructureType           sType;\n    const void*               pNext;\n    VkPipelineCreateFlags2    flags;\n} VkPipelineCreateFlags2CreateInfo;\n\ntypedef struct VkBufferUsageFlags2CreateInfo {\n    VkStructureType        sType;\n    const void*            pNext;\n    VkBufferUsageFlags2    usage;\n} VkBufferUsageFlags2CreateInfo;\n\ntypedef struct VkPhysicalDevicePushDescriptorProperties {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxPushDescriptors;\n} VkPhysicalDevicePushDescriptorProperties;\n\ntypedef struct VkPhysicalDeviceDynamicRenderingLocalReadFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           dynamicRenderingLocalRead;\n} VkPhysicalDeviceDynamicRenderingLocalReadFeatures;\n\ntypedef struct VkRenderingAttachmentLocationInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           colorAttachmentCount;\n    const uint32_t*    pColorAttachmentLocations;\n} VkRenderingAttachmentLocationInfo;\n\ntypedef struct VkRenderingInputAttachmentIndexInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           colorAttachmentCount;\n    const uint32_t*    pColorAttachmentInputIndices;\n    const uint32_t*    pDepthInputAttachmentIndex;\n    const uint32_t*    pStencilInputAttachmentIndex;\n} VkRenderingInputAttachmentIndexInfo;\n\ntypedef struct VkPhysicalDeviceMaintenance6Features {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           maintenance6;\n} VkPhysicalDeviceMaintenance6Features;\n\ntypedef struct VkPhysicalDeviceMaintenance6Properties {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           blockTexelViewCompatibleMultipleLayers;\n    uint32_t           maxCombinedImageSamplerDescriptorCount;\n    VkBool32           fragmentShadingRateClampCombinerInputs;\n} VkPhysicalDeviceMaintenance6Properties;\n\ntypedef struct VkBindMemoryStatus {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkResult*          pResult;\n} VkBindMemoryStatus;\n\ntypedef struct VkBindDescriptorSetsInfo {\n    VkStructureType           sType;\n    const void*               pNext;\n    VkShaderStageFlags        stageFlags;\n    VkPipelineLayout          layout;\n    uint32_t                  firstSet;\n    uint32_t                  descriptorSetCount;\n    const VkDescriptorSet*    pDescriptorSets;\n    uint32_t                  dynamicOffsetCount;\n    const uint32_t*           pDynamicOffsets;\n} VkBindDescriptorSetsInfo;\n\ntypedef struct VkPushConstantsInfo {\n    VkStructureType       sType;\n    const void*           pNext;\n    VkPipelineLayout      layout;\n    VkShaderStageFlags    stageFlags;\n    uint32_t              offset;\n    uint32_t              size;\n    const void*           pValues;\n} VkPushConstantsInfo;\n\ntypedef struct VkPushDescriptorSetInfo {\n    VkStructureType                sType;\n    const void*                    pNext;\n    VkShaderStageFlags             stageFlags;\n    VkPipelineLayout               layout;\n    uint32_t                       set;\n    uint32_t                       descriptorWriteCount;\n    const VkWriteDescriptorSet*    pDescriptorWrites;\n} VkPushDescriptorSetInfo;\n\ntypedef struct VkPushDescriptorSetWithTemplateInfo {\n    VkStructureType               sType;\n    const void*                   pNext;\n    VkDescriptorUpdateTemplate    descriptorUpdateTemplate;\n    VkPipelineLayout              layout;\n    uint32_t                      set;\n    const void*                   pData;\n} VkPushDescriptorSetWithTemplateInfo;\n\ntypedef struct VkPhysicalDevicePipelineProtectedAccessFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           pipelineProtectedAccess;\n} VkPhysicalDevicePipelineProtectedAccessFeatures;\n\ntypedef struct VkPhysicalDevicePipelineRobustnessFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           pipelineRobustness;\n} VkPhysicalDevicePipelineRobustnessFeatures;\n\ntypedef struct VkPhysicalDevicePipelineRobustnessProperties {\n    VkStructureType                       sType;\n    void*                                 pNext;\n    VkPipelineRobustnessBufferBehavior    defaultRobustnessStorageBuffers;\n    VkPipelineRobustnessBufferBehavior    defaultRobustnessUniformBuffers;\n    VkPipelineRobustnessBufferBehavior    defaultRobustnessVertexInputs;\n    VkPipelineRobustnessImageBehavior     defaultRobustnessImages;\n} VkPhysicalDevicePipelineRobustnessProperties;\n\ntypedef struct VkPipelineRobustnessCreateInfo {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkPipelineRobustnessBufferBehavior    storageBuffers;\n    VkPipelineRobustnessBufferBehavior    uniformBuffers;\n    VkPipelineRobustnessBufferBehavior    vertexInputs;\n    VkPipelineRobustnessImageBehavior     images;\n} VkPipelineRobustnessCreateInfo;\n\ntypedef struct VkPhysicalDeviceHostImageCopyFeatures {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           hostImageCopy;\n} VkPhysicalDeviceHostImageCopyFeatures;\n\ntypedef struct VkPhysicalDeviceHostImageCopyProperties {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           copySrcLayoutCount;\n    VkImageLayout*     pCopySrcLayouts;\n    uint32_t           copyDstLayoutCount;\n    VkImageLayout*     pCopyDstLayouts;\n    uint8_t            optimalTilingLayoutUUID[VK_UUID_SIZE];\n    VkBool32           identicalMemoryTypeRequirements;\n} VkPhysicalDeviceHostImageCopyProperties;\n\ntypedef struct VkMemoryToImageCopy {\n    VkStructureType             sType;\n    const void*                 pNext;\n    const void*                 pHostPointer;\n    uint32_t                    memoryRowLength;\n    uint32_t                    memoryImageHeight;\n    VkImageSubresourceLayers    imageSubresource;\n    VkOffset3D                  imageOffset;\n    VkExtent3D                  imageExtent;\n} VkMemoryToImageCopy;\n\ntypedef struct VkImageToMemoryCopy {\n    VkStructureType             sType;\n    const void*                 pNext;\n    void*                       pHostPointer;\n    uint32_t                    memoryRowLength;\n    uint32_t                    memoryImageHeight;\n    VkImageSubresourceLayers    imageSubresource;\n    VkOffset3D                  imageOffset;\n    VkExtent3D                  imageExtent;\n} VkImageToMemoryCopy;\n\ntypedef struct VkCopyMemoryToImageInfo {\n    VkStructureType               sType;\n    const void*                   pNext;\n    VkHostImageCopyFlags          flags;\n    VkImage                       dstImage;\n    VkImageLayout                 dstImageLayout;\n    uint32_t                      regionCount;\n    const VkMemoryToImageCopy*    pRegions;\n} VkCopyMemoryToImageInfo;\n\ntypedef struct VkCopyImageToMemoryInfo {\n    VkStructureType               sType;\n    const void*                   pNext;\n    VkHostImageCopyFlags          flags;\n    VkImage                       srcImage;\n    VkImageLayout                 srcImageLayout;\n    uint32_t                      regionCount;\n    const VkImageToMemoryCopy*    pRegions;\n} VkCopyImageToMemoryInfo;\n\ntypedef struct VkCopyImageToImageInfo {\n    VkStructureType         sType;\n    const void*             pNext;\n    VkHostImageCopyFlags    flags;\n    VkImage                 srcImage;\n    VkImageLayout           srcImageLayout;\n    VkImage                 dstImage;\n    VkImageLayout           dstImageLayout;\n    uint32_t                regionCount;\n    const VkImageCopy2*     pRegions;\n} VkCopyImageToImageInfo;\n\ntypedef struct VkHostImageLayoutTransitionInfo {\n    VkStructureType            sType;\n    const void*                pNext;\n    VkImage                    image;\n    VkImageLayout              oldLayout;\n    VkImageLayout              newLayout;\n    VkImageSubresourceRange    subresourceRange;\n} VkHostImageLayoutTransitionInfo;\n\ntypedef struct VkSubresourceHostMemcpySize {\n    VkStructureType    sType;\n    void*              pNext;\n    VkDeviceSize       size;\n} VkSubresourceHostMemcpySize;\n\ntypedef struct VkHostImageCopyDevicePerformanceQuery {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           optimalDeviceAccess;\n    VkBool32           identicalMemoryLayout;\n} VkHostImageCopyDevicePerformanceQuery;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdSetLineStipple)(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, uint16_t lineStipplePattern);\ntypedef VkResult (VKAPI_PTR *PFN_vkMapMemory2)(VkDevice device, const VkMemoryMapInfo* pMemoryMapInfo, void** ppData);\ntypedef VkResult (VKAPI_PTR *PFN_vkUnmapMemory2)(VkDevice device, const VkMemoryUnmapInfo* pMemoryUnmapInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdBindIndexBuffer2)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkDeviceSize size, VkIndexType indexType);\ntypedef void (VKAPI_PTR *PFN_vkGetRenderingAreaGranularity)(VkDevice device, const VkRenderingAreaInfo* pRenderingAreaInfo, VkExtent2D* pGranularity);\ntypedef void (VKAPI_PTR *PFN_vkGetDeviceImageSubresourceLayout)(VkDevice device, const VkDeviceImageSubresourceInfo* pInfo, VkSubresourceLayout2* pLayout);\ntypedef void (VKAPI_PTR *PFN_vkGetImageSubresourceLayout2)(VkDevice device, VkImage image, const VkImageSubresource2* pSubresource, VkSubresourceLayout2* pLayout);\ntypedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSet)(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t set, uint32_t descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites);\ntypedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSetWithTemplate)(VkCommandBuffer commandBuffer, VkDescriptorUpdateTemplate descriptorUpdateTemplate, VkPipelineLayout layout, uint32_t set, const void* pData);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetRenderingAttachmentLocations)(VkCommandBuffer commandBuffer, const VkRenderingAttachmentLocationInfo* pLocationInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetRenderingInputAttachmentIndices)(VkCommandBuffer commandBuffer, const VkRenderingInputAttachmentIndexInfo* pInputAttachmentIndexInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdBindDescriptorSets2)(VkCommandBuffer commandBuffer, const VkBindDescriptorSetsInfo*   pBindDescriptorSetsInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdPushConstants2)(VkCommandBuffer commandBuffer, const VkPushConstantsInfo*        pPushConstantsInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSet2)(VkCommandBuffer commandBuffer, const VkPushDescriptorSetInfo*    pPushDescriptorSetInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSetWithTemplate2)(VkCommandBuffer commandBuffer, const VkPushDescriptorSetWithTemplateInfo* pPushDescriptorSetWithTemplateInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkCopyMemoryToImage)(VkDevice device, const VkCopyMemoryToImageInfo*    pCopyMemoryToImageInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkCopyImageToMemory)(VkDevice device, const VkCopyImageToMemoryInfo*    pCopyImageToMemoryInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkCopyImageToImage)(VkDevice device, const VkCopyImageToImageInfo*    pCopyImageToImageInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkTransitionImageLayout)(VkDevice device, uint32_t transitionCount, const VkHostImageLayoutTransitionInfo*    pTransitions);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdSetLineStipple(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    lineStippleFactor,\n    uint16_t                                    lineStipplePattern);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkMapMemory2(\n    VkDevice                                    device,\n    const VkMemoryMapInfo*                      pMemoryMapInfo,\n    void**                                      ppData);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkUnmapMemory2(\n    VkDevice                                    device,\n    const VkMemoryUnmapInfo*                    pMemoryUnmapInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBindIndexBuffer2(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    buffer,\n    VkDeviceSize                                offset,\n    VkDeviceSize                                size,\n    VkIndexType                                 indexType);\n\nVKAPI_ATTR void VKAPI_CALL vkGetRenderingAreaGranularity(\n    VkDevice                                    device,\n    const VkRenderingAreaInfo*                  pRenderingAreaInfo,\n    VkExtent2D*                                 pGranularity);\n\nVKAPI_ATTR void VKAPI_CALL vkGetDeviceImageSubresourceLayout(\n    VkDevice                                    device,\n    const VkDeviceImageSubresourceInfo*         pInfo,\n    VkSubresourceLayout2*                       pLayout);\n\nVKAPI_ATTR void VKAPI_CALL vkGetImageSubresourceLayout2(\n    VkDevice                                    device,\n    VkImage                                     image,\n    const VkImageSubresource2*                  pSubresource,\n    VkSubresourceLayout2*                       pLayout);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSet(\n    VkCommandBuffer                             commandBuffer,\n    VkPipelineBindPoint                         pipelineBindPoint,\n    VkPipelineLayout                            layout,\n    uint32_t                                    set,\n    uint32_t                                    descriptorWriteCount,\n    const VkWriteDescriptorSet*                 pDescriptorWrites);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSetWithTemplate(\n    VkCommandBuffer                             commandBuffer,\n    VkDescriptorUpdateTemplate                  descriptorUpdateTemplate,\n    VkPipelineLayout                            layout,\n    uint32_t                                    set,\n    const void*                                 pData);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetRenderingAttachmentLocations(\n    VkCommandBuffer                             commandBuffer,\n    const VkRenderingAttachmentLocationInfo*    pLocationInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetRenderingInputAttachmentIndices(\n    VkCommandBuffer                             commandBuffer,\n    const VkRenderingInputAttachmentIndexInfo*  pInputAttachmentIndexInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorSets2(\n    VkCommandBuffer                             commandBuffer,\n    const VkBindDescriptorSetsInfo*             pBindDescriptorSetsInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdPushConstants2(\n    VkCommandBuffer                             commandBuffer,\n    const VkPushConstantsInfo*                  pPushConstantsInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSet2(\n    VkCommandBuffer                             commandBuffer,\n    const VkPushDescriptorSetInfo*              pPushDescriptorSetInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSetWithTemplate2(\n    VkCommandBuffer                             commandBuffer,\n    const VkPushDescriptorSetWithTemplateInfo*  pPushDescriptorSetWithTemplateInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCopyMemoryToImage(\n    VkDevice                                    device,\n    const VkCopyMemoryToImageInfo*              pCopyMemoryToImageInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCopyImageToMemory(\n    VkDevice                                    device,\n    const VkCopyImageToMemoryInfo*              pCopyImageToMemoryInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCopyImageToImage(\n    VkDevice                                    device,\n    const VkCopyImageToImageInfo*               pCopyImageToImageInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkTransitionImageLayout(\n    VkDevice                                    device,\n    uint32_t                                    transitionCount,\n    const VkHostImageLayoutTransitionInfo*      pTransitions);\n#endif\n\n\n// VK_KHR_surface is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_surface 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSurfaceKHR)\n#define VK_KHR_SURFACE_SPEC_VERSION       25\n#define VK_KHR_SURFACE_EXTENSION_NAME     \"VK_KHR_surface\"\n\ntypedef enum VkPresentModeKHR {\n    VK_PRESENT_MODE_IMMEDIATE_KHR = 0,\n    VK_PRESENT_MODE_MAILBOX_KHR = 1,\n    VK_PRESENT_MODE_FIFO_KHR = 2,\n    VK_PRESENT_MODE_FIFO_RELAXED_KHR = 3,\n    VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR = 1000111000,\n    VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR = 1000111001,\n    VK_PRESENT_MODE_FIFO_LATEST_READY_EXT = 1000361000,\n    VK_PRESENT_MODE_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkPresentModeKHR;\n\ntypedef enum VkColorSpaceKHR {\n    VK_COLOR_SPACE_SRGB_NONLINEAR_KHR = 0,\n    VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT = 1000104001,\n    VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT = 1000104002,\n    VK_COLOR_SPACE_DISPLAY_P3_LINEAR_EXT = 1000104003,\n    VK_COLOR_SPACE_DCI_P3_NONLINEAR_EXT = 1000104004,\n    VK_COLOR_SPACE_BT709_LINEAR_EXT = 1000104005,\n    VK_COLOR_SPACE_BT709_NONLINEAR_EXT = 1000104006,\n    VK_COLOR_SPACE_BT2020_LINEAR_EXT = 1000104007,\n    VK_COLOR_SPACE_HDR10_ST2084_EXT = 1000104008,\n  // VK_COLOR_SPACE_DOLBYVISION_EXT is deprecated, but no reason was given in the API XML\n    VK_COLOR_SPACE_DOLBYVISION_EXT = 1000104009,\n    VK_COLOR_SPACE_HDR10_HLG_EXT = 1000104010,\n    VK_COLOR_SPACE_ADOBERGB_LINEAR_EXT = 1000104011,\n    VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT = 1000104012,\n    VK_COLOR_SPACE_PASS_THROUGH_EXT = 1000104013,\n    VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT = 1000104014,\n    VK_COLOR_SPACE_DISPLAY_NATIVE_AMD = 1000213000,\n  // VK_COLORSPACE_SRGB_NONLINEAR_KHR is a deprecated alias\n    VK_COLORSPACE_SRGB_NONLINEAR_KHR = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR,\n  // VK_COLOR_SPACE_DCI_P3_LINEAR_EXT is a deprecated alias\n    VK_COLOR_SPACE_DCI_P3_LINEAR_EXT = VK_COLOR_SPACE_DISPLAY_P3_LINEAR_EXT,\n    VK_COLOR_SPACE_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkColorSpaceKHR;\n\ntypedef enum VkSurfaceTransformFlagBitsKHR {\n    VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR = 0x00000001,\n    VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR = 0x00000002,\n    VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR = 0x00000004,\n    VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR = 0x00000008,\n    VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR = 0x00000010,\n    VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR = 0x00000020,\n    VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR = 0x00000040,\n    VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR = 0x00000080,\n    VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR = 0x00000100,\n    VK_SURFACE_TRANSFORM_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkSurfaceTransformFlagBitsKHR;\n\ntypedef enum VkCompositeAlphaFlagBitsKHR {\n    VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR = 0x00000001,\n    VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR = 0x00000002,\n    VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR = 0x00000004,\n    VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR = 0x00000008,\n    VK_COMPOSITE_ALPHA_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkCompositeAlphaFlagBitsKHR;\ntypedef VkFlags VkCompositeAlphaFlagsKHR;\ntypedef VkFlags VkSurfaceTransformFlagsKHR;\ntypedef struct VkSurfaceCapabilitiesKHR {\n    uint32_t                         minImageCount;\n    uint32_t                         maxImageCount;\n    VkExtent2D                       currentExtent;\n    VkExtent2D                       minImageExtent;\n    VkExtent2D                       maxImageExtent;\n    uint32_t                         maxImageArrayLayers;\n    VkSurfaceTransformFlagsKHR       supportedTransforms;\n    VkSurfaceTransformFlagBitsKHR    currentTransform;\n    VkCompositeAlphaFlagsKHR         supportedCompositeAlpha;\n    VkImageUsageFlags                supportedUsageFlags;\n} VkSurfaceCapabilitiesKHR;\n\ntypedef struct VkSurfaceFormatKHR {\n    VkFormat           format;\n    VkColorSpaceKHR    colorSpace;\n} VkSurfaceFormatKHR;\n\ntypedef void (VKAPI_PTR *PFN_vkDestroySurfaceKHR)(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfaceSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, VkSurfaceKHR surface, VkBool32* pSupported);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR* pSurfaceCapabilities);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t* pSurfaceFormatCount, VkSurfaceFormatKHR* pSurfaceFormats);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t* pPresentModeCount, VkPresentModeKHR* pPresentModes);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkDestroySurfaceKHR(\n    VkInstance                                  instance,\n    VkSurfaceKHR                                surface,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceSupportKHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t                                    queueFamilyIndex,\n    VkSurfaceKHR                                surface,\n    VkBool32*                                   pSupported);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceCapabilitiesKHR(\n    VkPhysicalDevice                            physicalDevice,\n    VkSurfaceKHR                                surface,\n    VkSurfaceCapabilitiesKHR*                   pSurfaceCapabilities);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceFormatsKHR(\n    VkPhysicalDevice                            physicalDevice,\n    VkSurfaceKHR                                surface,\n    uint32_t*                                   pSurfaceFormatCount,\n    VkSurfaceFormatKHR*                         pSurfaceFormats);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfacePresentModesKHR(\n    VkPhysicalDevice                            physicalDevice,\n    VkSurfaceKHR                                surface,\n    uint32_t*                                   pPresentModeCount,\n    VkPresentModeKHR*                           pPresentModes);\n#endif\n\n\n// VK_KHR_swapchain is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_swapchain 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSwapchainKHR)\n#define VK_KHR_SWAPCHAIN_SPEC_VERSION     70\n#define VK_KHR_SWAPCHAIN_EXTENSION_NAME   \"VK_KHR_swapchain\"\n\ntypedef enum VkSwapchainCreateFlagBitsKHR {\n    VK_SWAPCHAIN_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR = 0x00000001,\n    VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR = 0x00000002,\n    VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR = 0x00000004,\n    VK_SWAPCHAIN_CREATE_DEFERRED_MEMORY_ALLOCATION_BIT_EXT = 0x00000008,\n    VK_SWAPCHAIN_CREATE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkSwapchainCreateFlagBitsKHR;\ntypedef VkFlags VkSwapchainCreateFlagsKHR;\n\ntypedef enum VkDeviceGroupPresentModeFlagBitsKHR {\n    VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR = 0x00000001,\n    VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHR = 0x00000002,\n    VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHR = 0x00000004,\n    VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHR = 0x00000008,\n    VK_DEVICE_GROUP_PRESENT_MODE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkDeviceGroupPresentModeFlagBitsKHR;\ntypedef VkFlags VkDeviceGroupPresentModeFlagsKHR;\ntypedef struct VkSwapchainCreateInfoKHR {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkSwapchainCreateFlagsKHR        flags;\n    VkSurfaceKHR                     surface;\n    uint32_t                         minImageCount;\n    VkFormat                         imageFormat;\n    VkColorSpaceKHR                  imageColorSpace;\n    VkExtent2D                       imageExtent;\n    uint32_t                         imageArrayLayers;\n    VkImageUsageFlags                imageUsage;\n    VkSharingMode                    imageSharingMode;\n    uint32_t                         queueFamilyIndexCount;\n    const uint32_t*                  pQueueFamilyIndices;\n    VkSurfaceTransformFlagBitsKHR    preTransform;\n    VkCompositeAlphaFlagBitsKHR      compositeAlpha;\n    VkPresentModeKHR                 presentMode;\n    VkBool32                         clipped;\n    VkSwapchainKHR                   oldSwapchain;\n} VkSwapchainCreateInfoKHR;\n\ntypedef struct VkPresentInfoKHR {\n    VkStructureType          sType;\n    const void*              pNext;\n    uint32_t                 waitSemaphoreCount;\n    const VkSemaphore*       pWaitSemaphores;\n    uint32_t                 swapchainCount;\n    const VkSwapchainKHR*    pSwapchains;\n    const uint32_t*          pImageIndices;\n    VkResult*                pResults;\n} VkPresentInfoKHR;\n\ntypedef struct VkImageSwapchainCreateInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkSwapchainKHR     swapchain;\n} VkImageSwapchainCreateInfoKHR;\n\ntypedef struct VkBindImageMemorySwapchainInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkSwapchainKHR     swapchain;\n    uint32_t           imageIndex;\n} VkBindImageMemorySwapchainInfoKHR;\n\ntypedef struct VkAcquireNextImageInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkSwapchainKHR     swapchain;\n    uint64_t           timeout;\n    VkSemaphore        semaphore;\n    VkFence            fence;\n    uint32_t           deviceMask;\n} VkAcquireNextImageInfoKHR;\n\ntypedef struct VkDeviceGroupPresentCapabilitiesKHR {\n    VkStructureType                     sType;\n    void*                               pNext;\n    uint32_t                            presentMask[VK_MAX_DEVICE_GROUP_SIZE];\n    VkDeviceGroupPresentModeFlagsKHR    modes;\n} VkDeviceGroupPresentCapabilitiesKHR;\n\ntypedef struct VkDeviceGroupPresentInfoKHR {\n    VkStructureType                        sType;\n    const void*                            pNext;\n    uint32_t                               swapchainCount;\n    const uint32_t*                        pDeviceMasks;\n    VkDeviceGroupPresentModeFlagBitsKHR    mode;\n} VkDeviceGroupPresentInfoKHR;\n\ntypedef struct VkDeviceGroupSwapchainCreateInfoKHR {\n    VkStructureType                     sType;\n    const void*                         pNext;\n    VkDeviceGroupPresentModeFlagsKHR    modes;\n} VkDeviceGroupSwapchainCreateInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateSwapchainKHR)(VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain);\ntypedef void (VKAPI_PTR *PFN_vkDestroySwapchainKHR)(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetSwapchainImagesKHR)(VkDevice device, VkSwapchainKHR swapchain, uint32_t* pSwapchainImageCount, VkImage* pSwapchainImages);\ntypedef VkResult (VKAPI_PTR *PFN_vkAcquireNextImageKHR)(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout, VkSemaphore semaphore, VkFence fence, uint32_t* pImageIndex);\ntypedef VkResult (VKAPI_PTR *PFN_vkQueuePresentKHR)(VkQueue queue, const VkPresentInfoKHR* pPresentInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetDeviceGroupPresentCapabilitiesKHR)(VkDevice device, VkDeviceGroupPresentCapabilitiesKHR* pDeviceGroupPresentCapabilities);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetDeviceGroupSurfacePresentModesKHR)(VkDevice device, VkSurfaceKHR surface, VkDeviceGroupPresentModeFlagsKHR* pModes);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDevicePresentRectanglesKHR)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t* pRectCount, VkRect2D* pRects);\ntypedef VkResult (VKAPI_PTR *PFN_vkAcquireNextImage2KHR)(VkDevice device, const VkAcquireNextImageInfoKHR* pAcquireInfo, uint32_t* pImageIndex);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateSwapchainKHR(\n    VkDevice                                    device,\n    const VkSwapchainCreateInfoKHR*             pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSwapchainKHR*                             pSwapchain);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroySwapchainKHR(\n    VkDevice                                    device,\n    VkSwapchainKHR                              swapchain,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainImagesKHR(\n    VkDevice                                    device,\n    VkSwapchainKHR                              swapchain,\n    uint32_t*                                   pSwapchainImageCount,\n    VkImage*                                    pSwapchainImages);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkAcquireNextImageKHR(\n    VkDevice                                    device,\n    VkSwapchainKHR                              swapchain,\n    uint64_t                                    timeout,\n    VkSemaphore                                 semaphore,\n    VkFence                                     fence,\n    uint32_t*                                   pImageIndex);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkQueuePresentKHR(\n    VkQueue                                     queue,\n    const VkPresentInfoKHR*                     pPresentInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceGroupPresentCapabilitiesKHR(\n    VkDevice                                    device,\n    VkDeviceGroupPresentCapabilitiesKHR*        pDeviceGroupPresentCapabilities);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceGroupSurfacePresentModesKHR(\n    VkDevice                                    device,\n    VkSurfaceKHR                                surface,\n    VkDeviceGroupPresentModeFlagsKHR*           pModes);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDevicePresentRectanglesKHR(\n    VkPhysicalDevice                            physicalDevice,\n    VkSurfaceKHR                                surface,\n    uint32_t*                                   pRectCount,\n    VkRect2D*                                   pRects);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkAcquireNextImage2KHR(\n    VkDevice                                    device,\n    const VkAcquireNextImageInfoKHR*            pAcquireInfo,\n    uint32_t*                                   pImageIndex);\n#endif\n\n\n// VK_KHR_display is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_display 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDisplayKHR)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDisplayModeKHR)\n#define VK_KHR_DISPLAY_SPEC_VERSION       23\n#define VK_KHR_DISPLAY_EXTENSION_NAME     \"VK_KHR_display\"\ntypedef VkFlags VkDisplayModeCreateFlagsKHR;\n\ntypedef enum VkDisplayPlaneAlphaFlagBitsKHR {\n    VK_DISPLAY_PLANE_ALPHA_OPAQUE_BIT_KHR = 0x00000001,\n    VK_DISPLAY_PLANE_ALPHA_GLOBAL_BIT_KHR = 0x00000002,\n    VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_BIT_KHR = 0x00000004,\n    VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_PREMULTIPLIED_BIT_KHR = 0x00000008,\n    VK_DISPLAY_PLANE_ALPHA_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkDisplayPlaneAlphaFlagBitsKHR;\ntypedef VkFlags VkDisplayPlaneAlphaFlagsKHR;\ntypedef VkFlags VkDisplaySurfaceCreateFlagsKHR;\ntypedef struct VkDisplayModeParametersKHR {\n    VkExtent2D    visibleRegion;\n    uint32_t      refreshRate;\n} VkDisplayModeParametersKHR;\n\ntypedef struct VkDisplayModeCreateInfoKHR {\n    VkStructureType                sType;\n    const void*                    pNext;\n    VkDisplayModeCreateFlagsKHR    flags;\n    VkDisplayModeParametersKHR     parameters;\n} VkDisplayModeCreateInfoKHR;\n\ntypedef struct VkDisplayModePropertiesKHR {\n    VkDisplayModeKHR              displayMode;\n    VkDisplayModeParametersKHR    parameters;\n} VkDisplayModePropertiesKHR;\n\ntypedef struct VkDisplayPlaneCapabilitiesKHR {\n    VkDisplayPlaneAlphaFlagsKHR    supportedAlpha;\n    VkOffset2D                     minSrcPosition;\n    VkOffset2D                     maxSrcPosition;\n    VkExtent2D                     minSrcExtent;\n    VkExtent2D                     maxSrcExtent;\n    VkOffset2D                     minDstPosition;\n    VkOffset2D                     maxDstPosition;\n    VkExtent2D                     minDstExtent;\n    VkExtent2D                     maxDstExtent;\n} VkDisplayPlaneCapabilitiesKHR;\n\ntypedef struct VkDisplayPlanePropertiesKHR {\n    VkDisplayKHR    currentDisplay;\n    uint32_t        currentStackIndex;\n} VkDisplayPlanePropertiesKHR;\n\ntypedef struct VkDisplayPropertiesKHR {\n    VkDisplayKHR                  display;\n    const char*                   displayName;\n    VkExtent2D                    physicalDimensions;\n    VkExtent2D                    physicalResolution;\n    VkSurfaceTransformFlagsKHR    supportedTransforms;\n    VkBool32                      planeReorderPossible;\n    VkBool32                      persistentContent;\n} VkDisplayPropertiesKHR;\n\ntypedef struct VkDisplaySurfaceCreateInfoKHR {\n    VkStructureType                   sType;\n    const void*                       pNext;\n    VkDisplaySurfaceCreateFlagsKHR    flags;\n    VkDisplayModeKHR                  displayMode;\n    uint32_t                          planeIndex;\n    uint32_t                          planeStackIndex;\n    VkSurfaceTransformFlagBitsKHR     transform;\n    float                             globalAlpha;\n    VkDisplayPlaneAlphaFlagBitsKHR    alphaMode;\n    VkExtent2D                        imageExtent;\n} VkDisplaySurfaceCreateInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceDisplayPropertiesKHR)(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkDisplayPropertiesKHR* pProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR)(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkDisplayPlanePropertiesKHR* pProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetDisplayPlaneSupportedDisplaysKHR)(VkPhysicalDevice physicalDevice, uint32_t planeIndex, uint32_t* pDisplayCount, VkDisplayKHR* pDisplays);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetDisplayModePropertiesKHR)(VkPhysicalDevice physicalDevice, VkDisplayKHR display, uint32_t* pPropertyCount, VkDisplayModePropertiesKHR* pProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateDisplayModeKHR)(VkPhysicalDevice physicalDevice, VkDisplayKHR display, const VkDisplayModeCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDisplayModeKHR* pMode);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetDisplayPlaneCapabilitiesKHR)(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode, uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR* pCapabilities);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateDisplayPlaneSurfaceKHR)(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPropertiesKHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t*                                   pPropertyCount,\n    VkDisplayPropertiesKHR*                     pProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPlanePropertiesKHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t*                                   pPropertyCount,\n    VkDisplayPlanePropertiesKHR*                pProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayPlaneSupportedDisplaysKHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t                                    planeIndex,\n    uint32_t*                                   pDisplayCount,\n    VkDisplayKHR*                               pDisplays);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayModePropertiesKHR(\n    VkPhysicalDevice                            physicalDevice,\n    VkDisplayKHR                                display,\n    uint32_t*                                   pPropertyCount,\n    VkDisplayModePropertiesKHR*                 pProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateDisplayModeKHR(\n    VkPhysicalDevice                            physicalDevice,\n    VkDisplayKHR                                display,\n    const VkDisplayModeCreateInfoKHR*           pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkDisplayModeKHR*                           pMode);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayPlaneCapabilitiesKHR(\n    VkPhysicalDevice                            physicalDevice,\n    VkDisplayModeKHR                            mode,\n    uint32_t                                    planeIndex,\n    VkDisplayPlaneCapabilitiesKHR*              pCapabilities);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateDisplayPlaneSurfaceKHR(\n    VkInstance                                  instance,\n    const VkDisplaySurfaceCreateInfoKHR*        pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSurfaceKHR*                               pSurface);\n#endif\n\n\n// VK_KHR_display_swapchain is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_display_swapchain 1\n#define VK_KHR_DISPLAY_SWAPCHAIN_SPEC_VERSION 10\n#define VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME \"VK_KHR_display_swapchain\"\ntypedef struct VkDisplayPresentInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkRect2D           srcRect;\n    VkRect2D           dstRect;\n    VkBool32           persistent;\n} VkDisplayPresentInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateSharedSwapchainsKHR)(VkDevice device, uint32_t swapchainCount, const VkSwapchainCreateInfoKHR* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchains);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateSharedSwapchainsKHR(\n    VkDevice                                    device,\n    uint32_t                                    swapchainCount,\n    const VkSwapchainCreateInfoKHR*             pCreateInfos,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSwapchainKHR*                             pSwapchains);\n#endif\n\n\n// VK_KHR_sampler_mirror_clamp_to_edge is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_sampler_mirror_clamp_to_edge 1\n#define VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_SPEC_VERSION 3\n#define VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME \"VK_KHR_sampler_mirror_clamp_to_edge\"\n\n\n// VK_KHR_video_queue is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_video_queue 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkVideoSessionKHR)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkVideoSessionParametersKHR)\n#define VK_KHR_VIDEO_QUEUE_SPEC_VERSION   8\n#define VK_KHR_VIDEO_QUEUE_EXTENSION_NAME \"VK_KHR_video_queue\"\n\ntypedef enum VkQueryResultStatusKHR {\n    VK_QUERY_RESULT_STATUS_ERROR_KHR = -1,\n    VK_QUERY_RESULT_STATUS_NOT_READY_KHR = 0,\n    VK_QUERY_RESULT_STATUS_COMPLETE_KHR = 1,\n    VK_QUERY_RESULT_STATUS_INSUFFICIENT_BITSTREAM_BUFFER_RANGE_KHR = -1000299000,\n    VK_QUERY_RESULT_STATUS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkQueryResultStatusKHR;\n\ntypedef enum VkVideoCodecOperationFlagBitsKHR {\n    VK_VIDEO_CODEC_OPERATION_NONE_KHR = 0,\n    VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR = 0x00010000,\n    VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR = 0x00020000,\n    VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR = 0x00000001,\n    VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR = 0x00000002,\n    VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR = 0x00000004,\n    VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR = 0x00040000,\n    VK_VIDEO_CODEC_OPERATION_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoCodecOperationFlagBitsKHR;\ntypedef VkFlags VkVideoCodecOperationFlagsKHR;\n\ntypedef enum VkVideoChromaSubsamplingFlagBitsKHR {\n    VK_VIDEO_CHROMA_SUBSAMPLING_INVALID_KHR = 0,\n    VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR = 0x00000001,\n    VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR = 0x00000002,\n    VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR = 0x00000004,\n    VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR = 0x00000008,\n    VK_VIDEO_CHROMA_SUBSAMPLING_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoChromaSubsamplingFlagBitsKHR;\ntypedef VkFlags VkVideoChromaSubsamplingFlagsKHR;\n\ntypedef enum VkVideoComponentBitDepthFlagBitsKHR {\n    VK_VIDEO_COMPONENT_BIT_DEPTH_INVALID_KHR = 0,\n    VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR = 0x00000001,\n    VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR = 0x00000004,\n    VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR = 0x00000010,\n    VK_VIDEO_COMPONENT_BIT_DEPTH_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoComponentBitDepthFlagBitsKHR;\ntypedef VkFlags VkVideoComponentBitDepthFlagsKHR;\n\ntypedef enum VkVideoCapabilityFlagBitsKHR {\n    VK_VIDEO_CAPABILITY_PROTECTED_CONTENT_BIT_KHR = 0x00000001,\n    VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR = 0x00000002,\n    VK_VIDEO_CAPABILITY_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoCapabilityFlagBitsKHR;\ntypedef VkFlags VkVideoCapabilityFlagsKHR;\n\ntypedef enum VkVideoSessionCreateFlagBitsKHR {\n    VK_VIDEO_SESSION_CREATE_PROTECTED_CONTENT_BIT_KHR = 0x00000001,\n    VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_PARAMETER_OPTIMIZATIONS_BIT_KHR = 0x00000002,\n    VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR = 0x00000004,\n    VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR = 0x00000008,\n    VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_EMPHASIS_MAP_BIT_KHR = 0x00000010,\n    VK_VIDEO_SESSION_CREATE_INLINE_SESSION_PARAMETERS_BIT_KHR = 0x00000020,\n    VK_VIDEO_SESSION_CREATE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoSessionCreateFlagBitsKHR;\ntypedef VkFlags VkVideoSessionCreateFlagsKHR;\n\ntypedef enum VkVideoSessionParametersCreateFlagBitsKHR {\n    VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR = 0x00000001,\n    VK_VIDEO_SESSION_PARAMETERS_CREATE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoSessionParametersCreateFlagBitsKHR;\ntypedef VkFlags VkVideoSessionParametersCreateFlagsKHR;\ntypedef VkFlags VkVideoBeginCodingFlagsKHR;\ntypedef VkFlags VkVideoEndCodingFlagsKHR;\n\ntypedef enum VkVideoCodingControlFlagBitsKHR {\n    VK_VIDEO_CODING_CONTROL_RESET_BIT_KHR = 0x00000001,\n    VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_BIT_KHR = 0x00000002,\n    VK_VIDEO_CODING_CONTROL_ENCODE_QUALITY_LEVEL_BIT_KHR = 0x00000004,\n    VK_VIDEO_CODING_CONTROL_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoCodingControlFlagBitsKHR;\ntypedef VkFlags VkVideoCodingControlFlagsKHR;\ntypedef struct VkQueueFamilyQueryResultStatusPropertiesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           queryResultStatusSupport;\n} VkQueueFamilyQueryResultStatusPropertiesKHR;\n\ntypedef struct VkQueueFamilyVideoPropertiesKHR {\n    VkStructureType                  sType;\n    void*                            pNext;\n    VkVideoCodecOperationFlagsKHR    videoCodecOperations;\n} VkQueueFamilyVideoPropertiesKHR;\n\ntypedef struct VkVideoProfileInfoKHR {\n    VkStructureType                     sType;\n    const void*                         pNext;\n    VkVideoCodecOperationFlagBitsKHR    videoCodecOperation;\n    VkVideoChromaSubsamplingFlagsKHR    chromaSubsampling;\n    VkVideoComponentBitDepthFlagsKHR    lumaBitDepth;\n    VkVideoComponentBitDepthFlagsKHR    chromaBitDepth;\n} VkVideoProfileInfoKHR;\n\ntypedef struct VkVideoProfileListInfoKHR {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    uint32_t                        profileCount;\n    const VkVideoProfileInfoKHR*    pProfiles;\n} VkVideoProfileListInfoKHR;\n\ntypedef struct VkVideoCapabilitiesKHR {\n    VkStructureType              sType;\n    void*                        pNext;\n    VkVideoCapabilityFlagsKHR    flags;\n    VkDeviceSize                 minBitstreamBufferOffsetAlignment;\n    VkDeviceSize                 minBitstreamBufferSizeAlignment;\n    VkExtent2D                   pictureAccessGranularity;\n    VkExtent2D                   minCodedExtent;\n    VkExtent2D                   maxCodedExtent;\n    uint32_t                     maxDpbSlots;\n    uint32_t                     maxActiveReferencePictures;\n    VkExtensionProperties        stdHeaderVersion;\n} VkVideoCapabilitiesKHR;\n\ntypedef struct VkPhysicalDeviceVideoFormatInfoKHR {\n    VkStructureType      sType;\n    const void*          pNext;\n    VkImageUsageFlags    imageUsage;\n} VkPhysicalDeviceVideoFormatInfoKHR;\n\ntypedef struct VkVideoFormatPropertiesKHR {\n    VkStructureType       sType;\n    void*                 pNext;\n    VkFormat              format;\n    VkComponentMapping    componentMapping;\n    VkImageCreateFlags    imageCreateFlags;\n    VkImageType           imageType;\n    VkImageTiling         imageTiling;\n    VkImageUsageFlags     imageUsageFlags;\n} VkVideoFormatPropertiesKHR;\n\ntypedef struct VkVideoPictureResourceInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkOffset2D         codedOffset;\n    VkExtent2D         codedExtent;\n    uint32_t           baseArrayLayer;\n    VkImageView        imageViewBinding;\n} VkVideoPictureResourceInfoKHR;\n\ntypedef struct VkVideoReferenceSlotInfoKHR {\n    VkStructureType                         sType;\n    const void*                             pNext;\n    int32_t                                 slotIndex;\n    const VkVideoPictureResourceInfoKHR*    pPictureResource;\n} VkVideoReferenceSlotInfoKHR;\n\ntypedef struct VkVideoSessionMemoryRequirementsKHR {\n    VkStructureType         sType;\n    void*                   pNext;\n    uint32_t                memoryBindIndex;\n    VkMemoryRequirements    memoryRequirements;\n} VkVideoSessionMemoryRequirementsKHR;\n\ntypedef struct VkBindVideoSessionMemoryInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           memoryBindIndex;\n    VkDeviceMemory     memory;\n    VkDeviceSize       memoryOffset;\n    VkDeviceSize       memorySize;\n} VkBindVideoSessionMemoryInfoKHR;\n\ntypedef struct VkVideoSessionCreateInfoKHR {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    uint32_t                        queueFamilyIndex;\n    VkVideoSessionCreateFlagsKHR    flags;\n    const VkVideoProfileInfoKHR*    pVideoProfile;\n    VkFormat                        pictureFormat;\n    VkExtent2D                      maxCodedExtent;\n    VkFormat                        referencePictureFormat;\n    uint32_t                        maxDpbSlots;\n    uint32_t                        maxActiveReferencePictures;\n    const VkExtensionProperties*    pStdHeaderVersion;\n} VkVideoSessionCreateInfoKHR;\n\ntypedef struct VkVideoSessionParametersCreateInfoKHR {\n    VkStructureType                           sType;\n    const void*                               pNext;\n    VkVideoSessionParametersCreateFlagsKHR    flags;\n    VkVideoSessionParametersKHR               videoSessionParametersTemplate;\n    VkVideoSessionKHR                         videoSession;\n} VkVideoSessionParametersCreateInfoKHR;\n\ntypedef struct VkVideoSessionParametersUpdateInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           updateSequenceCount;\n} VkVideoSessionParametersUpdateInfoKHR;\n\ntypedef struct VkVideoBeginCodingInfoKHR {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkVideoBeginCodingFlagsKHR            flags;\n    VkVideoSessionKHR                     videoSession;\n    VkVideoSessionParametersKHR           videoSessionParameters;\n    uint32_t                              referenceSlotCount;\n    const VkVideoReferenceSlotInfoKHR*    pReferenceSlots;\n} VkVideoBeginCodingInfoKHR;\n\ntypedef struct VkVideoEndCodingInfoKHR {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkVideoEndCodingFlagsKHR    flags;\n} VkVideoEndCodingInfoKHR;\n\ntypedef struct VkVideoCodingControlInfoKHR {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    VkVideoCodingControlFlagsKHR    flags;\n} VkVideoCodingControlInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR)(VkPhysicalDevice physicalDevice, const VkVideoProfileInfoKHR* pVideoProfile, VkVideoCapabilitiesKHR* pCapabilities);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceVideoFormatInfoKHR* pVideoFormatInfo, uint32_t* pVideoFormatPropertyCount, VkVideoFormatPropertiesKHR* pVideoFormatProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateVideoSessionKHR)(VkDevice device, const VkVideoSessionCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkVideoSessionKHR* pVideoSession);\ntypedef void (VKAPI_PTR *PFN_vkDestroyVideoSessionKHR)(VkDevice device, VkVideoSessionKHR videoSession, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetVideoSessionMemoryRequirementsKHR)(VkDevice device, VkVideoSessionKHR videoSession, uint32_t* pMemoryRequirementsCount, VkVideoSessionMemoryRequirementsKHR* pMemoryRequirements);\ntypedef VkResult (VKAPI_PTR *PFN_vkBindVideoSessionMemoryKHR)(VkDevice device, VkVideoSessionKHR videoSession, uint32_t bindSessionMemoryInfoCount, const VkBindVideoSessionMemoryInfoKHR* pBindSessionMemoryInfos);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateVideoSessionParametersKHR)(VkDevice device, const VkVideoSessionParametersCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkVideoSessionParametersKHR* pVideoSessionParameters);\ntypedef VkResult (VKAPI_PTR *PFN_vkUpdateVideoSessionParametersKHR)(VkDevice device, VkVideoSessionParametersKHR videoSessionParameters, const VkVideoSessionParametersUpdateInfoKHR* pUpdateInfo);\ntypedef void (VKAPI_PTR *PFN_vkDestroyVideoSessionParametersKHR)(VkDevice device, VkVideoSessionParametersKHR videoSessionParameters, const VkAllocationCallbacks* pAllocator);\ntypedef void (VKAPI_PTR *PFN_vkCmdBeginVideoCodingKHR)(VkCommandBuffer commandBuffer, const VkVideoBeginCodingInfoKHR* pBeginInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdEndVideoCodingKHR)(VkCommandBuffer commandBuffer, const VkVideoEndCodingInfoKHR* pEndCodingInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdControlVideoCodingKHR)(VkCommandBuffer commandBuffer, const VkVideoCodingControlInfoKHR* pCodingControlInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceVideoCapabilitiesKHR(\n    VkPhysicalDevice                            physicalDevice,\n    const VkVideoProfileInfoKHR*                pVideoProfile,\n    VkVideoCapabilitiesKHR*                     pCapabilities);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceVideoFormatPropertiesKHR(\n    VkPhysicalDevice                            physicalDevice,\n    const VkPhysicalDeviceVideoFormatInfoKHR*   pVideoFormatInfo,\n    uint32_t*                                   pVideoFormatPropertyCount,\n    VkVideoFormatPropertiesKHR*                 pVideoFormatProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateVideoSessionKHR(\n    VkDevice                                    device,\n    const VkVideoSessionCreateInfoKHR*          pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkVideoSessionKHR*                          pVideoSession);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyVideoSessionKHR(\n    VkDevice                                    device,\n    VkVideoSessionKHR                           videoSession,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetVideoSessionMemoryRequirementsKHR(\n    VkDevice                                    device,\n    VkVideoSessionKHR                           videoSession,\n    uint32_t*                                   pMemoryRequirementsCount,\n    VkVideoSessionMemoryRequirementsKHR*        pMemoryRequirements);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkBindVideoSessionMemoryKHR(\n    VkDevice                                    device,\n    VkVideoSessionKHR                           videoSession,\n    uint32_t                                    bindSessionMemoryInfoCount,\n    const VkBindVideoSessionMemoryInfoKHR*      pBindSessionMemoryInfos);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateVideoSessionParametersKHR(\n    VkDevice                                    device,\n    const VkVideoSessionParametersCreateInfoKHR* pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkVideoSessionParametersKHR*                pVideoSessionParameters);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkUpdateVideoSessionParametersKHR(\n    VkDevice                                    device,\n    VkVideoSessionParametersKHR                 videoSessionParameters,\n    const VkVideoSessionParametersUpdateInfoKHR* pUpdateInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyVideoSessionParametersKHR(\n    VkDevice                                    device,\n    VkVideoSessionParametersKHR                 videoSessionParameters,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBeginVideoCodingKHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkVideoBeginCodingInfoKHR*            pBeginInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdEndVideoCodingKHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkVideoEndCodingInfoKHR*              pEndCodingInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdControlVideoCodingKHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkVideoCodingControlInfoKHR*          pCodingControlInfo);\n#endif\n\n\n// VK_KHR_video_decode_queue is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_video_decode_queue 1\n#define VK_KHR_VIDEO_DECODE_QUEUE_SPEC_VERSION 8\n#define VK_KHR_VIDEO_DECODE_QUEUE_EXTENSION_NAME \"VK_KHR_video_decode_queue\"\n\ntypedef enum VkVideoDecodeCapabilityFlagBitsKHR {\n    VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR = 0x00000001,\n    VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR = 0x00000002,\n    VK_VIDEO_DECODE_CAPABILITY_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoDecodeCapabilityFlagBitsKHR;\ntypedef VkFlags VkVideoDecodeCapabilityFlagsKHR;\n\ntypedef enum VkVideoDecodeUsageFlagBitsKHR {\n    VK_VIDEO_DECODE_USAGE_DEFAULT_KHR = 0,\n    VK_VIDEO_DECODE_USAGE_TRANSCODING_BIT_KHR = 0x00000001,\n    VK_VIDEO_DECODE_USAGE_OFFLINE_BIT_KHR = 0x00000002,\n    VK_VIDEO_DECODE_USAGE_STREAMING_BIT_KHR = 0x00000004,\n    VK_VIDEO_DECODE_USAGE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoDecodeUsageFlagBitsKHR;\ntypedef VkFlags VkVideoDecodeUsageFlagsKHR;\ntypedef VkFlags VkVideoDecodeFlagsKHR;\ntypedef struct VkVideoDecodeCapabilitiesKHR {\n    VkStructureType                    sType;\n    void*                              pNext;\n    VkVideoDecodeCapabilityFlagsKHR    flags;\n} VkVideoDecodeCapabilitiesKHR;\n\ntypedef struct VkVideoDecodeUsageInfoKHR {\n    VkStructureType               sType;\n    const void*                   pNext;\n    VkVideoDecodeUsageFlagsKHR    videoUsageHints;\n} VkVideoDecodeUsageInfoKHR;\n\ntypedef struct VkVideoDecodeInfoKHR {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkVideoDecodeFlagsKHR                 flags;\n    VkBuffer                              srcBuffer;\n    VkDeviceSize                          srcBufferOffset;\n    VkDeviceSize                          srcBufferRange;\n    VkVideoPictureResourceInfoKHR         dstPictureResource;\n    const VkVideoReferenceSlotInfoKHR*    pSetupReferenceSlot;\n    uint32_t                              referenceSlotCount;\n    const VkVideoReferenceSlotInfoKHR*    pReferenceSlots;\n} VkVideoDecodeInfoKHR;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdDecodeVideoKHR)(VkCommandBuffer commandBuffer, const VkVideoDecodeInfoKHR* pDecodeInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdDecodeVideoKHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkVideoDecodeInfoKHR*                 pDecodeInfo);\n#endif\n\n\n// VK_KHR_video_encode_h264 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_video_encode_h264 1\n#include \"vk_video/vulkan_video_codec_h264std.h\"\n#include \"vk_video/vulkan_video_codec_h264std_encode.h\"\n#define VK_KHR_VIDEO_ENCODE_H264_SPEC_VERSION 14\n#define VK_KHR_VIDEO_ENCODE_H264_EXTENSION_NAME \"VK_KHR_video_encode_h264\"\n\ntypedef enum VkVideoEncodeH264CapabilityFlagBitsKHR {\n    VK_VIDEO_ENCODE_H264_CAPABILITY_HRD_COMPLIANCE_BIT_KHR = 0x00000001,\n    VK_VIDEO_ENCODE_H264_CAPABILITY_PREDICTION_WEIGHT_TABLE_GENERATED_BIT_KHR = 0x00000002,\n    VK_VIDEO_ENCODE_H264_CAPABILITY_ROW_UNALIGNED_SLICE_BIT_KHR = 0x00000004,\n    VK_VIDEO_ENCODE_H264_CAPABILITY_DIFFERENT_SLICE_TYPE_BIT_KHR = 0x00000008,\n    VK_VIDEO_ENCODE_H264_CAPABILITY_B_FRAME_IN_L0_LIST_BIT_KHR = 0x00000010,\n    VK_VIDEO_ENCODE_H264_CAPABILITY_B_FRAME_IN_L1_LIST_BIT_KHR = 0x00000020,\n    VK_VIDEO_ENCODE_H264_CAPABILITY_PER_PICTURE_TYPE_MIN_MAX_QP_BIT_KHR = 0x00000040,\n    VK_VIDEO_ENCODE_H264_CAPABILITY_PER_SLICE_CONSTANT_QP_BIT_KHR = 0x00000080,\n    VK_VIDEO_ENCODE_H264_CAPABILITY_GENERATE_PREFIX_NALU_BIT_KHR = 0x00000100,\n    VK_VIDEO_ENCODE_H264_CAPABILITY_MB_QP_DIFF_WRAPAROUND_BIT_KHR = 0x00000200,\n    VK_VIDEO_ENCODE_H264_CAPABILITY_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoEncodeH264CapabilityFlagBitsKHR;\ntypedef VkFlags VkVideoEncodeH264CapabilityFlagsKHR;\n\ntypedef enum VkVideoEncodeH264StdFlagBitsKHR {\n    VK_VIDEO_ENCODE_H264_STD_SEPARATE_COLOR_PLANE_FLAG_SET_BIT_KHR = 0x00000001,\n    VK_VIDEO_ENCODE_H264_STD_QPPRIME_Y_ZERO_TRANSFORM_BYPASS_FLAG_SET_BIT_KHR = 0x00000002,\n    VK_VIDEO_ENCODE_H264_STD_SCALING_MATRIX_PRESENT_FLAG_SET_BIT_KHR = 0x00000004,\n    VK_VIDEO_ENCODE_H264_STD_CHROMA_QP_INDEX_OFFSET_BIT_KHR = 0x00000008,\n    VK_VIDEO_ENCODE_H264_STD_SECOND_CHROMA_QP_INDEX_OFFSET_BIT_KHR = 0x00000010,\n    VK_VIDEO_ENCODE_H264_STD_PIC_INIT_QP_MINUS26_BIT_KHR = 0x00000020,\n    VK_VIDEO_ENCODE_H264_STD_WEIGHTED_PRED_FLAG_SET_BIT_KHR = 0x00000040,\n    VK_VIDEO_ENCODE_H264_STD_WEIGHTED_BIPRED_IDC_EXPLICIT_BIT_KHR = 0x00000080,\n    VK_VIDEO_ENCODE_H264_STD_WEIGHTED_BIPRED_IDC_IMPLICIT_BIT_KHR = 0x00000100,\n    VK_VIDEO_ENCODE_H264_STD_TRANSFORM_8X8_MODE_FLAG_SET_BIT_KHR = 0x00000200,\n    VK_VIDEO_ENCODE_H264_STD_DIRECT_SPATIAL_MV_PRED_FLAG_UNSET_BIT_KHR = 0x00000400,\n    VK_VIDEO_ENCODE_H264_STD_ENTROPY_CODING_MODE_FLAG_UNSET_BIT_KHR = 0x00000800,\n    VK_VIDEO_ENCODE_H264_STD_ENTROPY_CODING_MODE_FLAG_SET_BIT_KHR = 0x00001000,\n    VK_VIDEO_ENCODE_H264_STD_DIRECT_8X8_INFERENCE_FLAG_UNSET_BIT_KHR = 0x00002000,\n    VK_VIDEO_ENCODE_H264_STD_CONSTRAINED_INTRA_PRED_FLAG_SET_BIT_KHR = 0x00004000,\n    VK_VIDEO_ENCODE_H264_STD_DEBLOCKING_FILTER_DISABLED_BIT_KHR = 0x00008000,\n    VK_VIDEO_ENCODE_H264_STD_DEBLOCKING_FILTER_ENABLED_BIT_KHR = 0x00010000,\n    VK_VIDEO_ENCODE_H264_STD_DEBLOCKING_FILTER_PARTIAL_BIT_KHR = 0x00020000,\n    VK_VIDEO_ENCODE_H264_STD_SLICE_QP_DELTA_BIT_KHR = 0x00080000,\n    VK_VIDEO_ENCODE_H264_STD_DIFFERENT_SLICE_QP_DELTA_BIT_KHR = 0x00100000,\n    VK_VIDEO_ENCODE_H264_STD_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoEncodeH264StdFlagBitsKHR;\ntypedef VkFlags VkVideoEncodeH264StdFlagsKHR;\n\ntypedef enum VkVideoEncodeH264RateControlFlagBitsKHR {\n    VK_VIDEO_ENCODE_H264_RATE_CONTROL_ATTEMPT_HRD_COMPLIANCE_BIT_KHR = 0x00000001,\n    VK_VIDEO_ENCODE_H264_RATE_CONTROL_REGULAR_GOP_BIT_KHR = 0x00000002,\n    VK_VIDEO_ENCODE_H264_RATE_CONTROL_REFERENCE_PATTERN_FLAT_BIT_KHR = 0x00000004,\n    VK_VIDEO_ENCODE_H264_RATE_CONTROL_REFERENCE_PATTERN_DYADIC_BIT_KHR = 0x00000008,\n    VK_VIDEO_ENCODE_H264_RATE_CONTROL_TEMPORAL_LAYER_PATTERN_DYADIC_BIT_KHR = 0x00000010,\n    VK_VIDEO_ENCODE_H264_RATE_CONTROL_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoEncodeH264RateControlFlagBitsKHR;\ntypedef VkFlags VkVideoEncodeH264RateControlFlagsKHR;\ntypedef struct VkVideoEncodeH264CapabilitiesKHR {\n    VkStructureType                        sType;\n    void*                                  pNext;\n    VkVideoEncodeH264CapabilityFlagsKHR    flags;\n    StdVideoH264LevelIdc                   maxLevelIdc;\n    uint32_t                               maxSliceCount;\n    uint32_t                               maxPPictureL0ReferenceCount;\n    uint32_t                               maxBPictureL0ReferenceCount;\n    uint32_t                               maxL1ReferenceCount;\n    uint32_t                               maxTemporalLayerCount;\n    VkBool32                               expectDyadicTemporalLayerPattern;\n    int32_t                                minQp;\n    int32_t                                maxQp;\n    VkBool32                               prefersGopRemainingFrames;\n    VkBool32                               requiresGopRemainingFrames;\n    VkVideoEncodeH264StdFlagsKHR           stdSyntaxFlags;\n} VkVideoEncodeH264CapabilitiesKHR;\n\ntypedef struct VkVideoEncodeH264QpKHR {\n    int32_t    qpI;\n    int32_t    qpP;\n    int32_t    qpB;\n} VkVideoEncodeH264QpKHR;\n\ntypedef struct VkVideoEncodeH264QualityLevelPropertiesKHR {\n    VkStructureType                         sType;\n    void*                                   pNext;\n    VkVideoEncodeH264RateControlFlagsKHR    preferredRateControlFlags;\n    uint32_t                                preferredGopFrameCount;\n    uint32_t                                preferredIdrPeriod;\n    uint32_t                                preferredConsecutiveBFrameCount;\n    uint32_t                                preferredTemporalLayerCount;\n    VkVideoEncodeH264QpKHR                  preferredConstantQp;\n    uint32_t                                preferredMaxL0ReferenceCount;\n    uint32_t                                preferredMaxL1ReferenceCount;\n    VkBool32                                preferredStdEntropyCodingModeFlag;\n} VkVideoEncodeH264QualityLevelPropertiesKHR;\n\ntypedef struct VkVideoEncodeH264SessionCreateInfoKHR {\n    VkStructureType         sType;\n    const void*             pNext;\n    VkBool32                useMaxLevelIdc;\n    StdVideoH264LevelIdc    maxLevelIdc;\n} VkVideoEncodeH264SessionCreateInfoKHR;\n\ntypedef struct VkVideoEncodeH264SessionParametersAddInfoKHR {\n    VkStructureType                            sType;\n    const void*                                pNext;\n    uint32_t                                   stdSPSCount;\n    const StdVideoH264SequenceParameterSet*    pStdSPSs;\n    uint32_t                                   stdPPSCount;\n    const StdVideoH264PictureParameterSet*     pStdPPSs;\n} VkVideoEncodeH264SessionParametersAddInfoKHR;\n\ntypedef struct VkVideoEncodeH264SessionParametersCreateInfoKHR {\n    VkStructureType                                        sType;\n    const void*                                            pNext;\n    uint32_t                                               maxStdSPSCount;\n    uint32_t                                               maxStdPPSCount;\n    const VkVideoEncodeH264SessionParametersAddInfoKHR*    pParametersAddInfo;\n} VkVideoEncodeH264SessionParametersCreateInfoKHR;\n\ntypedef struct VkVideoEncodeH264SessionParametersGetInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           writeStdSPS;\n    VkBool32           writeStdPPS;\n    uint32_t           stdSPSId;\n    uint32_t           stdPPSId;\n} VkVideoEncodeH264SessionParametersGetInfoKHR;\n\ntypedef struct VkVideoEncodeH264SessionParametersFeedbackInfoKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           hasStdSPSOverrides;\n    VkBool32           hasStdPPSOverrides;\n} VkVideoEncodeH264SessionParametersFeedbackInfoKHR;\n\ntypedef struct VkVideoEncodeH264NaluSliceInfoKHR {\n    VkStructureType                         sType;\n    const void*                             pNext;\n    int32_t                                 constantQp;\n    const StdVideoEncodeH264SliceHeader*    pStdSliceHeader;\n} VkVideoEncodeH264NaluSliceInfoKHR;\n\ntypedef struct VkVideoEncodeH264PictureInfoKHR {\n    VkStructureType                             sType;\n    const void*                                 pNext;\n    uint32_t                                    naluSliceEntryCount;\n    const VkVideoEncodeH264NaluSliceInfoKHR*    pNaluSliceEntries;\n    const StdVideoEncodeH264PictureInfo*        pStdPictureInfo;\n    VkBool32                                    generatePrefixNalu;\n} VkVideoEncodeH264PictureInfoKHR;\n\ntypedef struct VkVideoEncodeH264DpbSlotInfoKHR {\n    VkStructureType                           sType;\n    const void*                               pNext;\n    const StdVideoEncodeH264ReferenceInfo*    pStdReferenceInfo;\n} VkVideoEncodeH264DpbSlotInfoKHR;\n\ntypedef struct VkVideoEncodeH264ProfileInfoKHR {\n    VkStructureType           sType;\n    const void*               pNext;\n    StdVideoH264ProfileIdc    stdProfileIdc;\n} VkVideoEncodeH264ProfileInfoKHR;\n\ntypedef struct VkVideoEncodeH264RateControlInfoKHR {\n    VkStructureType                         sType;\n    const void*                             pNext;\n    VkVideoEncodeH264RateControlFlagsKHR    flags;\n    uint32_t                                gopFrameCount;\n    uint32_t                                idrPeriod;\n    uint32_t                                consecutiveBFrameCount;\n    uint32_t                                temporalLayerCount;\n} VkVideoEncodeH264RateControlInfoKHR;\n\ntypedef struct VkVideoEncodeH264FrameSizeKHR {\n    uint32_t    frameISize;\n    uint32_t    framePSize;\n    uint32_t    frameBSize;\n} VkVideoEncodeH264FrameSizeKHR;\n\ntypedef struct VkVideoEncodeH264RateControlLayerInfoKHR {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkBool32                         useMinQp;\n    VkVideoEncodeH264QpKHR           minQp;\n    VkBool32                         useMaxQp;\n    VkVideoEncodeH264QpKHR           maxQp;\n    VkBool32                         useMaxFrameSize;\n    VkVideoEncodeH264FrameSizeKHR    maxFrameSize;\n} VkVideoEncodeH264RateControlLayerInfoKHR;\n\ntypedef struct VkVideoEncodeH264GopRemainingFrameInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           useGopRemainingFrames;\n    uint32_t           gopRemainingI;\n    uint32_t           gopRemainingP;\n    uint32_t           gopRemainingB;\n} VkVideoEncodeH264GopRemainingFrameInfoKHR;\n\n\n\n// VK_KHR_video_encode_h265 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_video_encode_h265 1\n#include \"vk_video/vulkan_video_codec_h265std.h\"\n#include \"vk_video/vulkan_video_codec_h265std_encode.h\"\n#define VK_KHR_VIDEO_ENCODE_H265_SPEC_VERSION 14\n#define VK_KHR_VIDEO_ENCODE_H265_EXTENSION_NAME \"VK_KHR_video_encode_h265\"\n\ntypedef enum VkVideoEncodeH265CapabilityFlagBitsKHR {\n    VK_VIDEO_ENCODE_H265_CAPABILITY_HRD_COMPLIANCE_BIT_KHR = 0x00000001,\n    VK_VIDEO_ENCODE_H265_CAPABILITY_PREDICTION_WEIGHT_TABLE_GENERATED_BIT_KHR = 0x00000002,\n    VK_VIDEO_ENCODE_H265_CAPABILITY_ROW_UNALIGNED_SLICE_SEGMENT_BIT_KHR = 0x00000004,\n    VK_VIDEO_ENCODE_H265_CAPABILITY_DIFFERENT_SLICE_SEGMENT_TYPE_BIT_KHR = 0x00000008,\n    VK_VIDEO_ENCODE_H265_CAPABILITY_B_FRAME_IN_L0_LIST_BIT_KHR = 0x00000010,\n    VK_VIDEO_ENCODE_H265_CAPABILITY_B_FRAME_IN_L1_LIST_BIT_KHR = 0x00000020,\n    VK_VIDEO_ENCODE_H265_CAPABILITY_PER_PICTURE_TYPE_MIN_MAX_QP_BIT_KHR = 0x00000040,\n    VK_VIDEO_ENCODE_H265_CAPABILITY_PER_SLICE_SEGMENT_CONSTANT_QP_BIT_KHR = 0x00000080,\n    VK_VIDEO_ENCODE_H265_CAPABILITY_MULTIPLE_TILES_PER_SLICE_SEGMENT_BIT_KHR = 0x00000100,\n    VK_VIDEO_ENCODE_H265_CAPABILITY_MULTIPLE_SLICE_SEGMENTS_PER_TILE_BIT_KHR = 0x00000200,\n    VK_VIDEO_ENCODE_H265_CAPABILITY_CU_QP_DIFF_WRAPAROUND_BIT_KHR = 0x00000400,\n    VK_VIDEO_ENCODE_H265_CAPABILITY_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoEncodeH265CapabilityFlagBitsKHR;\ntypedef VkFlags VkVideoEncodeH265CapabilityFlagsKHR;\n\ntypedef enum VkVideoEncodeH265StdFlagBitsKHR {\n    VK_VIDEO_ENCODE_H265_STD_SEPARATE_COLOR_PLANE_FLAG_SET_BIT_KHR = 0x00000001,\n    VK_VIDEO_ENCODE_H265_STD_SAMPLE_ADAPTIVE_OFFSET_ENABLED_FLAG_SET_BIT_KHR = 0x00000002,\n    VK_VIDEO_ENCODE_H265_STD_SCALING_LIST_DATA_PRESENT_FLAG_SET_BIT_KHR = 0x00000004,\n    VK_VIDEO_ENCODE_H265_STD_PCM_ENABLED_FLAG_SET_BIT_KHR = 0x00000008,\n    VK_VIDEO_ENCODE_H265_STD_SPS_TEMPORAL_MVP_ENABLED_FLAG_SET_BIT_KHR = 0x00000010,\n    VK_VIDEO_ENCODE_H265_STD_INIT_QP_MINUS26_BIT_KHR = 0x00000020,\n    VK_VIDEO_ENCODE_H265_STD_WEIGHTED_PRED_FLAG_SET_BIT_KHR = 0x00000040,\n    VK_VIDEO_ENCODE_H265_STD_WEIGHTED_BIPRED_FLAG_SET_BIT_KHR = 0x00000080,\n    VK_VIDEO_ENCODE_H265_STD_LOG2_PARALLEL_MERGE_LEVEL_MINUS2_BIT_KHR = 0x00000100,\n    VK_VIDEO_ENCODE_H265_STD_SIGN_DATA_HIDING_ENABLED_FLAG_SET_BIT_KHR = 0x00000200,\n    VK_VIDEO_ENCODE_H265_STD_TRANSFORM_SKIP_ENABLED_FLAG_SET_BIT_KHR = 0x00000400,\n    VK_VIDEO_ENCODE_H265_STD_TRANSFORM_SKIP_ENABLED_FLAG_UNSET_BIT_KHR = 0x00000800,\n    VK_VIDEO_ENCODE_H265_STD_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT_FLAG_SET_BIT_KHR = 0x00001000,\n    VK_VIDEO_ENCODE_H265_STD_TRANSQUANT_BYPASS_ENABLED_FLAG_SET_BIT_KHR = 0x00002000,\n    VK_VIDEO_ENCODE_H265_STD_CONSTRAINED_INTRA_PRED_FLAG_SET_BIT_KHR = 0x00004000,\n    VK_VIDEO_ENCODE_H265_STD_ENTROPY_CODING_SYNC_ENABLED_FLAG_SET_BIT_KHR = 0x00008000,\n    VK_VIDEO_ENCODE_H265_STD_DEBLOCKING_FILTER_OVERRIDE_ENABLED_FLAG_SET_BIT_KHR = 0x00010000,\n    VK_VIDEO_ENCODE_H265_STD_DEPENDENT_SLICE_SEGMENTS_ENABLED_FLAG_SET_BIT_KHR = 0x00020000,\n    VK_VIDEO_ENCODE_H265_STD_DEPENDENT_SLICE_SEGMENT_FLAG_SET_BIT_KHR = 0x00040000,\n    VK_VIDEO_ENCODE_H265_STD_SLICE_QP_DELTA_BIT_KHR = 0x00080000,\n    VK_VIDEO_ENCODE_H265_STD_DIFFERENT_SLICE_QP_DELTA_BIT_KHR = 0x00100000,\n    VK_VIDEO_ENCODE_H265_STD_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoEncodeH265StdFlagBitsKHR;\ntypedef VkFlags VkVideoEncodeH265StdFlagsKHR;\n\ntypedef enum VkVideoEncodeH265CtbSizeFlagBitsKHR {\n    VK_VIDEO_ENCODE_H265_CTB_SIZE_16_BIT_KHR = 0x00000001,\n    VK_VIDEO_ENCODE_H265_CTB_SIZE_32_BIT_KHR = 0x00000002,\n    VK_VIDEO_ENCODE_H265_CTB_SIZE_64_BIT_KHR = 0x00000004,\n    VK_VIDEO_ENCODE_H265_CTB_SIZE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoEncodeH265CtbSizeFlagBitsKHR;\ntypedef VkFlags VkVideoEncodeH265CtbSizeFlagsKHR;\n\ntypedef enum VkVideoEncodeH265TransformBlockSizeFlagBitsKHR {\n    VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_4_BIT_KHR = 0x00000001,\n    VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_8_BIT_KHR = 0x00000002,\n    VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_16_BIT_KHR = 0x00000004,\n    VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_32_BIT_KHR = 0x00000008,\n    VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoEncodeH265TransformBlockSizeFlagBitsKHR;\ntypedef VkFlags VkVideoEncodeH265TransformBlockSizeFlagsKHR;\n\ntypedef enum VkVideoEncodeH265RateControlFlagBitsKHR {\n    VK_VIDEO_ENCODE_H265_RATE_CONTROL_ATTEMPT_HRD_COMPLIANCE_BIT_KHR = 0x00000001,\n    VK_VIDEO_ENCODE_H265_RATE_CONTROL_REGULAR_GOP_BIT_KHR = 0x00000002,\n    VK_VIDEO_ENCODE_H265_RATE_CONTROL_REFERENCE_PATTERN_FLAT_BIT_KHR = 0x00000004,\n    VK_VIDEO_ENCODE_H265_RATE_CONTROL_REFERENCE_PATTERN_DYADIC_BIT_KHR = 0x00000008,\n    VK_VIDEO_ENCODE_H265_RATE_CONTROL_TEMPORAL_SUB_LAYER_PATTERN_DYADIC_BIT_KHR = 0x00000010,\n    VK_VIDEO_ENCODE_H265_RATE_CONTROL_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoEncodeH265RateControlFlagBitsKHR;\ntypedef VkFlags VkVideoEncodeH265RateControlFlagsKHR;\ntypedef struct VkVideoEncodeH265CapabilitiesKHR {\n    VkStructureType                                sType;\n    void*                                          pNext;\n    VkVideoEncodeH265CapabilityFlagsKHR            flags;\n    StdVideoH265LevelIdc                           maxLevelIdc;\n    uint32_t                                       maxSliceSegmentCount;\n    VkExtent2D                                     maxTiles;\n    VkVideoEncodeH265CtbSizeFlagsKHR               ctbSizes;\n    VkVideoEncodeH265TransformBlockSizeFlagsKHR    transformBlockSizes;\n    uint32_t                                       maxPPictureL0ReferenceCount;\n    uint32_t                                       maxBPictureL0ReferenceCount;\n    uint32_t                                       maxL1ReferenceCount;\n    uint32_t                                       maxSubLayerCount;\n    VkBool32                                       expectDyadicTemporalSubLayerPattern;\n    int32_t                                        minQp;\n    int32_t                                        maxQp;\n    VkBool32                                       prefersGopRemainingFrames;\n    VkBool32                                       requiresGopRemainingFrames;\n    VkVideoEncodeH265StdFlagsKHR                   stdSyntaxFlags;\n} VkVideoEncodeH265CapabilitiesKHR;\n\ntypedef struct VkVideoEncodeH265SessionCreateInfoKHR {\n    VkStructureType         sType;\n    const void*             pNext;\n    VkBool32                useMaxLevelIdc;\n    StdVideoH265LevelIdc    maxLevelIdc;\n} VkVideoEncodeH265SessionCreateInfoKHR;\n\ntypedef struct VkVideoEncodeH265QpKHR {\n    int32_t    qpI;\n    int32_t    qpP;\n    int32_t    qpB;\n} VkVideoEncodeH265QpKHR;\n\ntypedef struct VkVideoEncodeH265QualityLevelPropertiesKHR {\n    VkStructureType                         sType;\n    void*                                   pNext;\n    VkVideoEncodeH265RateControlFlagsKHR    preferredRateControlFlags;\n    uint32_t                                preferredGopFrameCount;\n    uint32_t                                preferredIdrPeriod;\n    uint32_t                                preferredConsecutiveBFrameCount;\n    uint32_t                                preferredSubLayerCount;\n    VkVideoEncodeH265QpKHR                  preferredConstantQp;\n    uint32_t                                preferredMaxL0ReferenceCount;\n    uint32_t                                preferredMaxL1ReferenceCount;\n} VkVideoEncodeH265QualityLevelPropertiesKHR;\n\ntypedef struct VkVideoEncodeH265SessionParametersAddInfoKHR {\n    VkStructureType                            sType;\n    const void*                                pNext;\n    uint32_t                                   stdVPSCount;\n    const StdVideoH265VideoParameterSet*       pStdVPSs;\n    uint32_t                                   stdSPSCount;\n    const StdVideoH265SequenceParameterSet*    pStdSPSs;\n    uint32_t                                   stdPPSCount;\n    const StdVideoH265PictureParameterSet*     pStdPPSs;\n} VkVideoEncodeH265SessionParametersAddInfoKHR;\n\ntypedef struct VkVideoEncodeH265SessionParametersCreateInfoKHR {\n    VkStructureType                                        sType;\n    const void*                                            pNext;\n    uint32_t                                               maxStdVPSCount;\n    uint32_t                                               maxStdSPSCount;\n    uint32_t                                               maxStdPPSCount;\n    const VkVideoEncodeH265SessionParametersAddInfoKHR*    pParametersAddInfo;\n} VkVideoEncodeH265SessionParametersCreateInfoKHR;\n\ntypedef struct VkVideoEncodeH265SessionParametersGetInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           writeStdVPS;\n    VkBool32           writeStdSPS;\n    VkBool32           writeStdPPS;\n    uint32_t           stdVPSId;\n    uint32_t           stdSPSId;\n    uint32_t           stdPPSId;\n} VkVideoEncodeH265SessionParametersGetInfoKHR;\n\ntypedef struct VkVideoEncodeH265SessionParametersFeedbackInfoKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           hasStdVPSOverrides;\n    VkBool32           hasStdSPSOverrides;\n    VkBool32           hasStdPPSOverrides;\n} VkVideoEncodeH265SessionParametersFeedbackInfoKHR;\n\ntypedef struct VkVideoEncodeH265NaluSliceSegmentInfoKHR {\n    VkStructureType                                sType;\n    const void*                                    pNext;\n    int32_t                                        constantQp;\n    const StdVideoEncodeH265SliceSegmentHeader*    pStdSliceSegmentHeader;\n} VkVideoEncodeH265NaluSliceSegmentInfoKHR;\n\ntypedef struct VkVideoEncodeH265PictureInfoKHR {\n    VkStructureType                                    sType;\n    const void*                                        pNext;\n    uint32_t                                           naluSliceSegmentEntryCount;\n    const VkVideoEncodeH265NaluSliceSegmentInfoKHR*    pNaluSliceSegmentEntries;\n    const StdVideoEncodeH265PictureInfo*               pStdPictureInfo;\n} VkVideoEncodeH265PictureInfoKHR;\n\ntypedef struct VkVideoEncodeH265DpbSlotInfoKHR {\n    VkStructureType                           sType;\n    const void*                               pNext;\n    const StdVideoEncodeH265ReferenceInfo*    pStdReferenceInfo;\n} VkVideoEncodeH265DpbSlotInfoKHR;\n\ntypedef struct VkVideoEncodeH265ProfileInfoKHR {\n    VkStructureType           sType;\n    const void*               pNext;\n    StdVideoH265ProfileIdc    stdProfileIdc;\n} VkVideoEncodeH265ProfileInfoKHR;\n\ntypedef struct VkVideoEncodeH265RateControlInfoKHR {\n    VkStructureType                         sType;\n    const void*                             pNext;\n    VkVideoEncodeH265RateControlFlagsKHR    flags;\n    uint32_t                                gopFrameCount;\n    uint32_t                                idrPeriod;\n    uint32_t                                consecutiveBFrameCount;\n    uint32_t                                subLayerCount;\n} VkVideoEncodeH265RateControlInfoKHR;\n\ntypedef struct VkVideoEncodeH265FrameSizeKHR {\n    uint32_t    frameISize;\n    uint32_t    framePSize;\n    uint32_t    frameBSize;\n} VkVideoEncodeH265FrameSizeKHR;\n\ntypedef struct VkVideoEncodeH265RateControlLayerInfoKHR {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkBool32                         useMinQp;\n    VkVideoEncodeH265QpKHR           minQp;\n    VkBool32                         useMaxQp;\n    VkVideoEncodeH265QpKHR           maxQp;\n    VkBool32                         useMaxFrameSize;\n    VkVideoEncodeH265FrameSizeKHR    maxFrameSize;\n} VkVideoEncodeH265RateControlLayerInfoKHR;\n\ntypedef struct VkVideoEncodeH265GopRemainingFrameInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           useGopRemainingFrames;\n    uint32_t           gopRemainingI;\n    uint32_t           gopRemainingP;\n    uint32_t           gopRemainingB;\n} VkVideoEncodeH265GopRemainingFrameInfoKHR;\n\n\n\n// VK_KHR_video_decode_h264 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_video_decode_h264 1\n#include \"vk_video/vulkan_video_codec_h264std_decode.h\"\n#define VK_KHR_VIDEO_DECODE_H264_SPEC_VERSION 9\n#define VK_KHR_VIDEO_DECODE_H264_EXTENSION_NAME \"VK_KHR_video_decode_h264\"\n\ntypedef enum VkVideoDecodeH264PictureLayoutFlagBitsKHR {\n    VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR = 0,\n    VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR = 0x00000001,\n    VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR = 0x00000002,\n    VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoDecodeH264PictureLayoutFlagBitsKHR;\ntypedef VkFlags VkVideoDecodeH264PictureLayoutFlagsKHR;\ntypedef struct VkVideoDecodeH264ProfileInfoKHR {\n    VkStructureType                              sType;\n    const void*                                  pNext;\n    StdVideoH264ProfileIdc                       stdProfileIdc;\n    VkVideoDecodeH264PictureLayoutFlagBitsKHR    pictureLayout;\n} VkVideoDecodeH264ProfileInfoKHR;\n\ntypedef struct VkVideoDecodeH264CapabilitiesKHR {\n    VkStructureType         sType;\n    void*                   pNext;\n    StdVideoH264LevelIdc    maxLevelIdc;\n    VkOffset2D              fieldOffsetGranularity;\n} VkVideoDecodeH264CapabilitiesKHR;\n\ntypedef struct VkVideoDecodeH264SessionParametersAddInfoKHR {\n    VkStructureType                            sType;\n    const void*                                pNext;\n    uint32_t                                   stdSPSCount;\n    const StdVideoH264SequenceParameterSet*    pStdSPSs;\n    uint32_t                                   stdPPSCount;\n    const StdVideoH264PictureParameterSet*     pStdPPSs;\n} VkVideoDecodeH264SessionParametersAddInfoKHR;\n\ntypedef struct VkVideoDecodeH264SessionParametersCreateInfoKHR {\n    VkStructureType                                        sType;\n    const void*                                            pNext;\n    uint32_t                                               maxStdSPSCount;\n    uint32_t                                               maxStdPPSCount;\n    const VkVideoDecodeH264SessionParametersAddInfoKHR*    pParametersAddInfo;\n} VkVideoDecodeH264SessionParametersCreateInfoKHR;\n\ntypedef struct VkVideoDecodeH264PictureInfoKHR {\n    VkStructureType                         sType;\n    const void*                             pNext;\n    const StdVideoDecodeH264PictureInfo*    pStdPictureInfo;\n    uint32_t                                sliceCount;\n    const uint32_t*                         pSliceOffsets;\n} VkVideoDecodeH264PictureInfoKHR;\n\ntypedef struct VkVideoDecodeH264DpbSlotInfoKHR {\n    VkStructureType                           sType;\n    const void*                               pNext;\n    const StdVideoDecodeH264ReferenceInfo*    pStdReferenceInfo;\n} VkVideoDecodeH264DpbSlotInfoKHR;\n\n\n\n// VK_KHR_dynamic_rendering is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_dynamic_rendering 1\n#define VK_KHR_DYNAMIC_RENDERING_SPEC_VERSION 1\n#define VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME \"VK_KHR_dynamic_rendering\"\ntypedef VkRenderingFlags VkRenderingFlagsKHR;\n\ntypedef VkRenderingFlagBits VkRenderingFlagBitsKHR;\n\ntypedef VkRenderingInfo VkRenderingInfoKHR;\n\ntypedef VkRenderingAttachmentInfo VkRenderingAttachmentInfoKHR;\n\ntypedef VkPipelineRenderingCreateInfo VkPipelineRenderingCreateInfoKHR;\n\ntypedef VkPhysicalDeviceDynamicRenderingFeatures VkPhysicalDeviceDynamicRenderingFeaturesKHR;\n\ntypedef VkCommandBufferInheritanceRenderingInfo VkCommandBufferInheritanceRenderingInfoKHR;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdBeginRenderingKHR)(VkCommandBuffer                   commandBuffer, const VkRenderingInfo*                              pRenderingInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdEndRenderingKHR)(VkCommandBuffer                   commandBuffer);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdBeginRenderingKHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkRenderingInfo*                      pRenderingInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdEndRenderingKHR(\n    VkCommandBuffer                             commandBuffer);\n#endif\n\n\n// VK_KHR_multiview is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_multiview 1\n#define VK_KHR_MULTIVIEW_SPEC_VERSION     1\n#define VK_KHR_MULTIVIEW_EXTENSION_NAME   \"VK_KHR_multiview\"\ntypedef VkRenderPassMultiviewCreateInfo VkRenderPassMultiviewCreateInfoKHR;\n\ntypedef VkPhysicalDeviceMultiviewFeatures VkPhysicalDeviceMultiviewFeaturesKHR;\n\ntypedef VkPhysicalDeviceMultiviewProperties VkPhysicalDeviceMultiviewPropertiesKHR;\n\n\n\n// VK_KHR_get_physical_device_properties2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_get_physical_device_properties2 1\n#define VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION 2\n#define VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME \"VK_KHR_get_physical_device_properties2\"\ntypedef VkPhysicalDeviceFeatures2 VkPhysicalDeviceFeatures2KHR;\n\ntypedef VkPhysicalDeviceProperties2 VkPhysicalDeviceProperties2KHR;\n\ntypedef VkFormatProperties2 VkFormatProperties2KHR;\n\ntypedef VkImageFormatProperties2 VkImageFormatProperties2KHR;\n\ntypedef VkPhysicalDeviceImageFormatInfo2 VkPhysicalDeviceImageFormatInfo2KHR;\n\ntypedef VkQueueFamilyProperties2 VkQueueFamilyProperties2KHR;\n\ntypedef VkPhysicalDeviceMemoryProperties2 VkPhysicalDeviceMemoryProperties2KHR;\n\ntypedef VkSparseImageFormatProperties2 VkSparseImageFormatProperties2KHR;\n\ntypedef VkPhysicalDeviceSparseImageFormatInfo2 VkPhysicalDeviceSparseImageFormatInfo2KHR;\n\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceFeatures2KHR)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2* pFeatures);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceProperties2KHR)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties2* pProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceFormatProperties2KHR)(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties2* pFormatProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceImageFormatProperties2KHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo, VkImageFormatProperties2* pImageFormatProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR)(VkPhysicalDevice physicalDevice, uint32_t* pQueueFamilyPropertyCount, VkQueueFamilyProperties2* pQueueFamilyProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceMemoryProperties2KHR)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties2* pMemoryProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo, uint32_t* pPropertyCount, VkSparseImageFormatProperties2* pProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFeatures2KHR(\n    VkPhysicalDevice                            physicalDevice,\n    VkPhysicalDeviceFeatures2*                  pFeatures);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceProperties2KHR(\n    VkPhysicalDevice                            physicalDevice,\n    VkPhysicalDeviceProperties2*                pProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFormatProperties2KHR(\n    VkPhysicalDevice                            physicalDevice,\n    VkFormat                                    format,\n    VkFormatProperties2*                        pFormatProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceImageFormatProperties2KHR(\n    VkPhysicalDevice                            physicalDevice,\n    const VkPhysicalDeviceImageFormatInfo2*     pImageFormatInfo,\n    VkImageFormatProperties2*                   pImageFormatProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyProperties2KHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t*                                   pQueueFamilyPropertyCount,\n    VkQueueFamilyProperties2*                   pQueueFamilyProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceMemoryProperties2KHR(\n    VkPhysicalDevice                            physicalDevice,\n    VkPhysicalDeviceMemoryProperties2*          pMemoryProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceSparseImageFormatProperties2KHR(\n    VkPhysicalDevice                            physicalDevice,\n    const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo,\n    uint32_t*                                   pPropertyCount,\n    VkSparseImageFormatProperties2*             pProperties);\n#endif\n\n\n// VK_KHR_device_group is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_device_group 1\n#define VK_KHR_DEVICE_GROUP_SPEC_VERSION  4\n#define VK_KHR_DEVICE_GROUP_EXTENSION_NAME \"VK_KHR_device_group\"\ntypedef VkPeerMemoryFeatureFlags VkPeerMemoryFeatureFlagsKHR;\n\ntypedef VkPeerMemoryFeatureFlagBits VkPeerMemoryFeatureFlagBitsKHR;\n\ntypedef VkMemoryAllocateFlags VkMemoryAllocateFlagsKHR;\n\ntypedef VkMemoryAllocateFlagBits VkMemoryAllocateFlagBitsKHR;\n\ntypedef VkMemoryAllocateFlagsInfo VkMemoryAllocateFlagsInfoKHR;\n\ntypedef VkDeviceGroupRenderPassBeginInfo VkDeviceGroupRenderPassBeginInfoKHR;\n\ntypedef VkDeviceGroupCommandBufferBeginInfo VkDeviceGroupCommandBufferBeginInfoKHR;\n\ntypedef VkDeviceGroupSubmitInfo VkDeviceGroupSubmitInfoKHR;\n\ntypedef VkDeviceGroupBindSparseInfo VkDeviceGroupBindSparseInfoKHR;\n\ntypedef VkBindBufferMemoryDeviceGroupInfo VkBindBufferMemoryDeviceGroupInfoKHR;\n\ntypedef VkBindImageMemoryDeviceGroupInfo VkBindImageMemoryDeviceGroupInfoKHR;\n\ntypedef void (VKAPI_PTR *PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR)(VkDevice device, uint32_t heapIndex, uint32_t localDeviceIndex, uint32_t remoteDeviceIndex, VkPeerMemoryFeatureFlags* pPeerMemoryFeatures);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDeviceMaskKHR)(VkCommandBuffer commandBuffer, uint32_t deviceMask);\ntypedef void (VKAPI_PTR *PFN_vkCmdDispatchBaseKHR)(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkGetDeviceGroupPeerMemoryFeaturesKHR(\n    VkDevice                                    device,\n    uint32_t                                    heapIndex,\n    uint32_t                                    localDeviceIndex,\n    uint32_t                                    remoteDeviceIndex,\n    VkPeerMemoryFeatureFlags*                   pPeerMemoryFeatures);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDeviceMaskKHR(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    deviceMask);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDispatchBaseKHR(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    baseGroupX,\n    uint32_t                                    baseGroupY,\n    uint32_t                                    baseGroupZ,\n    uint32_t                                    groupCountX,\n    uint32_t                                    groupCountY,\n    uint32_t                                    groupCountZ);\n#endif\n\n\n// VK_KHR_shader_draw_parameters is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_shader_draw_parameters 1\n#define VK_KHR_SHADER_DRAW_PARAMETERS_SPEC_VERSION 1\n#define VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME \"VK_KHR_shader_draw_parameters\"\n\n\n// VK_KHR_maintenance1 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_maintenance1 1\n#define VK_KHR_MAINTENANCE_1_SPEC_VERSION 2\n#define VK_KHR_MAINTENANCE_1_EXTENSION_NAME \"VK_KHR_maintenance1\"\n// VK_KHR_MAINTENANCE1_SPEC_VERSION is a deprecated alias\n#define VK_KHR_MAINTENANCE1_SPEC_VERSION  VK_KHR_MAINTENANCE_1_SPEC_VERSION\n// VK_KHR_MAINTENANCE1_EXTENSION_NAME is a deprecated alias\n#define VK_KHR_MAINTENANCE1_EXTENSION_NAME VK_KHR_MAINTENANCE_1_EXTENSION_NAME\ntypedef VkCommandPoolTrimFlags VkCommandPoolTrimFlagsKHR;\n\ntypedef void (VKAPI_PTR *PFN_vkTrimCommandPoolKHR)(VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlags flags);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkTrimCommandPoolKHR(\n    VkDevice                                    device,\n    VkCommandPool                               commandPool,\n    VkCommandPoolTrimFlags                      flags);\n#endif\n\n\n// VK_KHR_device_group_creation is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_device_group_creation 1\n#define VK_KHR_DEVICE_GROUP_CREATION_SPEC_VERSION 1\n#define VK_KHR_DEVICE_GROUP_CREATION_EXTENSION_NAME \"VK_KHR_device_group_creation\"\n#define VK_MAX_DEVICE_GROUP_SIZE_KHR      VK_MAX_DEVICE_GROUP_SIZE\ntypedef VkPhysicalDeviceGroupProperties VkPhysicalDeviceGroupPropertiesKHR;\n\ntypedef VkDeviceGroupDeviceCreateInfo VkDeviceGroupDeviceCreateInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkEnumeratePhysicalDeviceGroupsKHR)(VkInstance instance, uint32_t* pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDeviceGroupsKHR(\n    VkInstance                                  instance,\n    uint32_t*                                   pPhysicalDeviceGroupCount,\n    VkPhysicalDeviceGroupProperties*            pPhysicalDeviceGroupProperties);\n#endif\n\n\n// VK_KHR_external_memory_capabilities is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_external_memory_capabilities 1\n#define VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_SPEC_VERSION 1\n#define VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME \"VK_KHR_external_memory_capabilities\"\n#define VK_LUID_SIZE_KHR                  VK_LUID_SIZE\ntypedef VkExternalMemoryHandleTypeFlags VkExternalMemoryHandleTypeFlagsKHR;\n\ntypedef VkExternalMemoryHandleTypeFlagBits VkExternalMemoryHandleTypeFlagBitsKHR;\n\ntypedef VkExternalMemoryFeatureFlags VkExternalMemoryFeatureFlagsKHR;\n\ntypedef VkExternalMemoryFeatureFlagBits VkExternalMemoryFeatureFlagBitsKHR;\n\ntypedef VkExternalMemoryProperties VkExternalMemoryPropertiesKHR;\n\ntypedef VkPhysicalDeviceExternalImageFormatInfo VkPhysicalDeviceExternalImageFormatInfoKHR;\n\ntypedef VkExternalImageFormatProperties VkExternalImageFormatPropertiesKHR;\n\ntypedef VkPhysicalDeviceExternalBufferInfo VkPhysicalDeviceExternalBufferInfoKHR;\n\ntypedef VkExternalBufferProperties VkExternalBufferPropertiesKHR;\n\ntypedef VkPhysicalDeviceIDProperties VkPhysicalDeviceIDPropertiesKHR;\n\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo, VkExternalBufferProperties* pExternalBufferProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalBufferPropertiesKHR(\n    VkPhysicalDevice                            physicalDevice,\n    const VkPhysicalDeviceExternalBufferInfo*   pExternalBufferInfo,\n    VkExternalBufferProperties*                 pExternalBufferProperties);\n#endif\n\n\n// VK_KHR_external_memory is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_external_memory 1\n#define VK_KHR_EXTERNAL_MEMORY_SPEC_VERSION 1\n#define VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME \"VK_KHR_external_memory\"\n#define VK_QUEUE_FAMILY_EXTERNAL_KHR      VK_QUEUE_FAMILY_EXTERNAL\ntypedef VkExternalMemoryImageCreateInfo VkExternalMemoryImageCreateInfoKHR;\n\ntypedef VkExternalMemoryBufferCreateInfo VkExternalMemoryBufferCreateInfoKHR;\n\ntypedef VkExportMemoryAllocateInfo VkExportMemoryAllocateInfoKHR;\n\n\n\n// VK_KHR_external_memory_fd is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_external_memory_fd 1\n#define VK_KHR_EXTERNAL_MEMORY_FD_SPEC_VERSION 1\n#define VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME \"VK_KHR_external_memory_fd\"\ntypedef struct VkImportMemoryFdInfoKHR {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkExternalMemoryHandleTypeFlagBits    handleType;\n    int                                   fd;\n} VkImportMemoryFdInfoKHR;\n\ntypedef struct VkMemoryFdPropertiesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           memoryTypeBits;\n} VkMemoryFdPropertiesKHR;\n\ntypedef struct VkMemoryGetFdInfoKHR {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkDeviceMemory                        memory;\n    VkExternalMemoryHandleTypeFlagBits    handleType;\n} VkMemoryGetFdInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetMemoryFdKHR)(VkDevice device, const VkMemoryGetFdInfoKHR* pGetFdInfo, int* pFd);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetMemoryFdPropertiesKHR)(VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, int fd, VkMemoryFdPropertiesKHR* pMemoryFdProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryFdKHR(\n    VkDevice                                    device,\n    const VkMemoryGetFdInfoKHR*                 pGetFdInfo,\n    int*                                        pFd);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryFdPropertiesKHR(\n    VkDevice                                    device,\n    VkExternalMemoryHandleTypeFlagBits          handleType,\n    int                                         fd,\n    VkMemoryFdPropertiesKHR*                    pMemoryFdProperties);\n#endif\n\n\n// VK_KHR_external_semaphore_capabilities is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_external_semaphore_capabilities 1\n#define VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_SPEC_VERSION 1\n#define VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME \"VK_KHR_external_semaphore_capabilities\"\ntypedef VkExternalSemaphoreHandleTypeFlags VkExternalSemaphoreHandleTypeFlagsKHR;\n\ntypedef VkExternalSemaphoreHandleTypeFlagBits VkExternalSemaphoreHandleTypeFlagBitsKHR;\n\ntypedef VkExternalSemaphoreFeatureFlags VkExternalSemaphoreFeatureFlagsKHR;\n\ntypedef VkExternalSemaphoreFeatureFlagBits VkExternalSemaphoreFeatureFlagBitsKHR;\n\ntypedef VkPhysicalDeviceExternalSemaphoreInfo VkPhysicalDeviceExternalSemaphoreInfoKHR;\n\ntypedef VkExternalSemaphoreProperties VkExternalSemaphorePropertiesKHR;\n\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo, VkExternalSemaphoreProperties* pExternalSemaphoreProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(\n    VkPhysicalDevice                            physicalDevice,\n    const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,\n    VkExternalSemaphoreProperties*              pExternalSemaphoreProperties);\n#endif\n\n\n// VK_KHR_external_semaphore is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_external_semaphore 1\n#define VK_KHR_EXTERNAL_SEMAPHORE_SPEC_VERSION 1\n#define VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME \"VK_KHR_external_semaphore\"\ntypedef VkSemaphoreImportFlags VkSemaphoreImportFlagsKHR;\n\ntypedef VkSemaphoreImportFlagBits VkSemaphoreImportFlagBitsKHR;\n\ntypedef VkExportSemaphoreCreateInfo VkExportSemaphoreCreateInfoKHR;\n\n\n\n// VK_KHR_external_semaphore_fd is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_external_semaphore_fd 1\n#define VK_KHR_EXTERNAL_SEMAPHORE_FD_SPEC_VERSION 1\n#define VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME \"VK_KHR_external_semaphore_fd\"\ntypedef struct VkImportSemaphoreFdInfoKHR {\n    VkStructureType                          sType;\n    const void*                              pNext;\n    VkSemaphore                              semaphore;\n    VkSemaphoreImportFlags                   flags;\n    VkExternalSemaphoreHandleTypeFlagBits    handleType;\n    int                                      fd;\n} VkImportSemaphoreFdInfoKHR;\n\ntypedef struct VkSemaphoreGetFdInfoKHR {\n    VkStructureType                          sType;\n    const void*                              pNext;\n    VkSemaphore                              semaphore;\n    VkExternalSemaphoreHandleTypeFlagBits    handleType;\n} VkSemaphoreGetFdInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkImportSemaphoreFdKHR)(VkDevice device, const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetSemaphoreFdKHR)(VkDevice device, const VkSemaphoreGetFdInfoKHR* pGetFdInfo, int* pFd);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkImportSemaphoreFdKHR(\n    VkDevice                                    device,\n    const VkImportSemaphoreFdInfoKHR*           pImportSemaphoreFdInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreFdKHR(\n    VkDevice                                    device,\n    const VkSemaphoreGetFdInfoKHR*              pGetFdInfo,\n    int*                                        pFd);\n#endif\n\n\n// VK_KHR_push_descriptor is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_push_descriptor 1\n#define VK_KHR_PUSH_DESCRIPTOR_SPEC_VERSION 2\n#define VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME \"VK_KHR_push_descriptor\"\ntypedef VkPhysicalDevicePushDescriptorProperties VkPhysicalDevicePushDescriptorPropertiesKHR;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSetKHR)(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t set, uint32_t descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites);\ntypedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSetWithTemplateKHR)(VkCommandBuffer commandBuffer, VkDescriptorUpdateTemplate descriptorUpdateTemplate, VkPipelineLayout layout, uint32_t set, const void* pData);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSetKHR(\n    VkCommandBuffer                             commandBuffer,\n    VkPipelineBindPoint                         pipelineBindPoint,\n    VkPipelineLayout                            layout,\n    uint32_t                                    set,\n    uint32_t                                    descriptorWriteCount,\n    const VkWriteDescriptorSet*                 pDescriptorWrites);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSetWithTemplateKHR(\n    VkCommandBuffer                             commandBuffer,\n    VkDescriptorUpdateTemplate                  descriptorUpdateTemplate,\n    VkPipelineLayout                            layout,\n    uint32_t                                    set,\n    const void*                                 pData);\n#endif\n\n\n// VK_KHR_shader_float16_int8 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_shader_float16_int8 1\n#define VK_KHR_SHADER_FLOAT16_INT8_SPEC_VERSION 1\n#define VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME \"VK_KHR_shader_float16_int8\"\ntypedef VkPhysicalDeviceShaderFloat16Int8Features VkPhysicalDeviceShaderFloat16Int8FeaturesKHR;\n\ntypedef VkPhysicalDeviceShaderFloat16Int8Features VkPhysicalDeviceFloat16Int8FeaturesKHR;\n\n\n\n// VK_KHR_16bit_storage is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_16bit_storage 1\n#define VK_KHR_16BIT_STORAGE_SPEC_VERSION 1\n#define VK_KHR_16BIT_STORAGE_EXTENSION_NAME \"VK_KHR_16bit_storage\"\ntypedef VkPhysicalDevice16BitStorageFeatures VkPhysicalDevice16BitStorageFeaturesKHR;\n\n\n\n// VK_KHR_incremental_present is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_incremental_present 1\n#define VK_KHR_INCREMENTAL_PRESENT_SPEC_VERSION 2\n#define VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME \"VK_KHR_incremental_present\"\ntypedef struct VkRectLayerKHR {\n    VkOffset2D    offset;\n    VkExtent2D    extent;\n    uint32_t      layer;\n} VkRectLayerKHR;\n\ntypedef struct VkPresentRegionKHR {\n    uint32_t                 rectangleCount;\n    const VkRectLayerKHR*    pRectangles;\n} VkPresentRegionKHR;\n\ntypedef struct VkPresentRegionsKHR {\n    VkStructureType              sType;\n    const void*                  pNext;\n    uint32_t                     swapchainCount;\n    const VkPresentRegionKHR*    pRegions;\n} VkPresentRegionsKHR;\n\n\n\n// VK_KHR_descriptor_update_template is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_descriptor_update_template 1\ntypedef VkDescriptorUpdateTemplate VkDescriptorUpdateTemplateKHR;\n\n#define VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_SPEC_VERSION 1\n#define VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME \"VK_KHR_descriptor_update_template\"\ntypedef VkDescriptorUpdateTemplateType VkDescriptorUpdateTemplateTypeKHR;\n\ntypedef VkDescriptorUpdateTemplateCreateFlags VkDescriptorUpdateTemplateCreateFlagsKHR;\n\ntypedef VkDescriptorUpdateTemplateEntry VkDescriptorUpdateTemplateEntryKHR;\n\ntypedef VkDescriptorUpdateTemplateCreateInfo VkDescriptorUpdateTemplateCreateInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateDescriptorUpdateTemplateKHR)(VkDevice device, const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate);\ntypedef void (VKAPI_PTR *PFN_vkDestroyDescriptorUpdateTemplateKHR)(VkDevice device, VkDescriptorUpdateTemplate descriptorUpdateTemplate, const VkAllocationCallbacks* pAllocator);\ntypedef void (VKAPI_PTR *PFN_vkUpdateDescriptorSetWithTemplateKHR)(VkDevice device, VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplate descriptorUpdateTemplate, const void* pData);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorUpdateTemplateKHR(\n    VkDevice                                    device,\n    const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkDescriptorUpdateTemplate*                 pDescriptorUpdateTemplate);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyDescriptorUpdateTemplateKHR(\n    VkDevice                                    device,\n    VkDescriptorUpdateTemplate                  descriptorUpdateTemplate,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR void VKAPI_CALL vkUpdateDescriptorSetWithTemplateKHR(\n    VkDevice                                    device,\n    VkDescriptorSet                             descriptorSet,\n    VkDescriptorUpdateTemplate                  descriptorUpdateTemplate,\n    const void*                                 pData);\n#endif\n\n\n// VK_KHR_imageless_framebuffer is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_imageless_framebuffer 1\n#define VK_KHR_IMAGELESS_FRAMEBUFFER_SPEC_VERSION 1\n#define VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME \"VK_KHR_imageless_framebuffer\"\ntypedef VkPhysicalDeviceImagelessFramebufferFeatures VkPhysicalDeviceImagelessFramebufferFeaturesKHR;\n\ntypedef VkFramebufferAttachmentsCreateInfo VkFramebufferAttachmentsCreateInfoKHR;\n\ntypedef VkFramebufferAttachmentImageInfo VkFramebufferAttachmentImageInfoKHR;\n\ntypedef VkRenderPassAttachmentBeginInfo VkRenderPassAttachmentBeginInfoKHR;\n\n\n\n// VK_KHR_create_renderpass2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_create_renderpass2 1\n#define VK_KHR_CREATE_RENDERPASS_2_SPEC_VERSION 1\n#define VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME \"VK_KHR_create_renderpass2\"\ntypedef VkRenderPassCreateInfo2 VkRenderPassCreateInfo2KHR;\n\ntypedef VkAttachmentDescription2 VkAttachmentDescription2KHR;\n\ntypedef VkAttachmentReference2 VkAttachmentReference2KHR;\n\ntypedef VkSubpassDescription2 VkSubpassDescription2KHR;\n\ntypedef VkSubpassDependency2 VkSubpassDependency2KHR;\n\ntypedef VkSubpassBeginInfo VkSubpassBeginInfoKHR;\n\ntypedef VkSubpassEndInfo VkSubpassEndInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateRenderPass2KHR)(VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass);\ntypedef void (VKAPI_PTR *PFN_vkCmdBeginRenderPass2KHR)(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo*      pRenderPassBegin, const VkSubpassBeginInfo*      pSubpassBeginInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdNextSubpass2KHR)(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo*      pSubpassBeginInfo, const VkSubpassEndInfo*        pSubpassEndInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdEndRenderPass2KHR)(VkCommandBuffer commandBuffer, const VkSubpassEndInfo*        pSubpassEndInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass2KHR(\n    VkDevice                                    device,\n    const VkRenderPassCreateInfo2*              pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkRenderPass*                               pRenderPass);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBeginRenderPass2KHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkRenderPassBeginInfo*                pRenderPassBegin,\n    const VkSubpassBeginInfo*                   pSubpassBeginInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass2KHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkSubpassBeginInfo*                   pSubpassBeginInfo,\n    const VkSubpassEndInfo*                     pSubpassEndInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass2KHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkSubpassEndInfo*                     pSubpassEndInfo);\n#endif\n\n\n// VK_KHR_shared_presentable_image is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_shared_presentable_image 1\n#define VK_KHR_SHARED_PRESENTABLE_IMAGE_SPEC_VERSION 1\n#define VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME \"VK_KHR_shared_presentable_image\"\ntypedef struct VkSharedPresentSurfaceCapabilitiesKHR {\n    VkStructureType      sType;\n    void*                pNext;\n    VkImageUsageFlags    sharedPresentSupportedUsageFlags;\n} VkSharedPresentSurfaceCapabilitiesKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetSwapchainStatusKHR)(VkDevice device, VkSwapchainKHR swapchain);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainStatusKHR(\n    VkDevice                                    device,\n    VkSwapchainKHR                              swapchain);\n#endif\n\n\n// VK_KHR_external_fence_capabilities is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_external_fence_capabilities 1\n#define VK_KHR_EXTERNAL_FENCE_CAPABILITIES_SPEC_VERSION 1\n#define VK_KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME \"VK_KHR_external_fence_capabilities\"\ntypedef VkExternalFenceHandleTypeFlags VkExternalFenceHandleTypeFlagsKHR;\n\ntypedef VkExternalFenceHandleTypeFlagBits VkExternalFenceHandleTypeFlagBitsKHR;\n\ntypedef VkExternalFenceFeatureFlags VkExternalFenceFeatureFlagsKHR;\n\ntypedef VkExternalFenceFeatureFlagBits VkExternalFenceFeatureFlagBitsKHR;\n\ntypedef VkPhysicalDeviceExternalFenceInfo VkPhysicalDeviceExternalFenceInfoKHR;\n\ntypedef VkExternalFenceProperties VkExternalFencePropertiesKHR;\n\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo, VkExternalFenceProperties* pExternalFenceProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalFencePropertiesKHR(\n    VkPhysicalDevice                            physicalDevice,\n    const VkPhysicalDeviceExternalFenceInfo*    pExternalFenceInfo,\n    VkExternalFenceProperties*                  pExternalFenceProperties);\n#endif\n\n\n// VK_KHR_external_fence is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_external_fence 1\n#define VK_KHR_EXTERNAL_FENCE_SPEC_VERSION 1\n#define VK_KHR_EXTERNAL_FENCE_EXTENSION_NAME \"VK_KHR_external_fence\"\ntypedef VkFenceImportFlags VkFenceImportFlagsKHR;\n\ntypedef VkFenceImportFlagBits VkFenceImportFlagBitsKHR;\n\ntypedef VkExportFenceCreateInfo VkExportFenceCreateInfoKHR;\n\n\n\n// VK_KHR_external_fence_fd is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_external_fence_fd 1\n#define VK_KHR_EXTERNAL_FENCE_FD_SPEC_VERSION 1\n#define VK_KHR_EXTERNAL_FENCE_FD_EXTENSION_NAME \"VK_KHR_external_fence_fd\"\ntypedef struct VkImportFenceFdInfoKHR {\n    VkStructureType                      sType;\n    const void*                          pNext;\n    VkFence                              fence;\n    VkFenceImportFlags                   flags;\n    VkExternalFenceHandleTypeFlagBits    handleType;\n    int                                  fd;\n} VkImportFenceFdInfoKHR;\n\ntypedef struct VkFenceGetFdInfoKHR {\n    VkStructureType                      sType;\n    const void*                          pNext;\n    VkFence                              fence;\n    VkExternalFenceHandleTypeFlagBits    handleType;\n} VkFenceGetFdInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkImportFenceFdKHR)(VkDevice device, const VkImportFenceFdInfoKHR* pImportFenceFdInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetFenceFdKHR)(VkDevice device, const VkFenceGetFdInfoKHR* pGetFdInfo, int* pFd);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkImportFenceFdKHR(\n    VkDevice                                    device,\n    const VkImportFenceFdInfoKHR*               pImportFenceFdInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetFenceFdKHR(\n    VkDevice                                    device,\n    const VkFenceGetFdInfoKHR*                  pGetFdInfo,\n    int*                                        pFd);\n#endif\n\n\n// VK_KHR_performance_query is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_performance_query 1\n#define VK_KHR_PERFORMANCE_QUERY_SPEC_VERSION 1\n#define VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME \"VK_KHR_performance_query\"\n\ntypedef enum VkPerformanceCounterUnitKHR {\n    VK_PERFORMANCE_COUNTER_UNIT_GENERIC_KHR = 0,\n    VK_PERFORMANCE_COUNTER_UNIT_PERCENTAGE_KHR = 1,\n    VK_PERFORMANCE_COUNTER_UNIT_NANOSECONDS_KHR = 2,\n    VK_PERFORMANCE_COUNTER_UNIT_BYTES_KHR = 3,\n    VK_PERFORMANCE_COUNTER_UNIT_BYTES_PER_SECOND_KHR = 4,\n    VK_PERFORMANCE_COUNTER_UNIT_KELVIN_KHR = 5,\n    VK_PERFORMANCE_COUNTER_UNIT_WATTS_KHR = 6,\n    VK_PERFORMANCE_COUNTER_UNIT_VOLTS_KHR = 7,\n    VK_PERFORMANCE_COUNTER_UNIT_AMPS_KHR = 8,\n    VK_PERFORMANCE_COUNTER_UNIT_HERTZ_KHR = 9,\n    VK_PERFORMANCE_COUNTER_UNIT_CYCLES_KHR = 10,\n    VK_PERFORMANCE_COUNTER_UNIT_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkPerformanceCounterUnitKHR;\n\ntypedef enum VkPerformanceCounterScopeKHR {\n    VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR = 0,\n    VK_PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR = 1,\n    VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_KHR = 2,\n  // VK_QUERY_SCOPE_COMMAND_BUFFER_KHR is a deprecated alias\n    VK_QUERY_SCOPE_COMMAND_BUFFER_KHR = VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR,\n  // VK_QUERY_SCOPE_RENDER_PASS_KHR is a deprecated alias\n    VK_QUERY_SCOPE_RENDER_PASS_KHR = VK_PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR,\n  // VK_QUERY_SCOPE_COMMAND_KHR is a deprecated alias\n    VK_QUERY_SCOPE_COMMAND_KHR = VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_KHR,\n    VK_PERFORMANCE_COUNTER_SCOPE_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkPerformanceCounterScopeKHR;\n\ntypedef enum VkPerformanceCounterStorageKHR {\n    VK_PERFORMANCE_COUNTER_STORAGE_INT32_KHR = 0,\n    VK_PERFORMANCE_COUNTER_STORAGE_INT64_KHR = 1,\n    VK_PERFORMANCE_COUNTER_STORAGE_UINT32_KHR = 2,\n    VK_PERFORMANCE_COUNTER_STORAGE_UINT64_KHR = 3,\n    VK_PERFORMANCE_COUNTER_STORAGE_FLOAT32_KHR = 4,\n    VK_PERFORMANCE_COUNTER_STORAGE_FLOAT64_KHR = 5,\n    VK_PERFORMANCE_COUNTER_STORAGE_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkPerformanceCounterStorageKHR;\n\ntypedef enum VkPerformanceCounterDescriptionFlagBitsKHR {\n    VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_BIT_KHR = 0x00000001,\n    VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_BIT_KHR = 0x00000002,\n  // VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR is a deprecated alias\n    VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR = VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_BIT_KHR,\n  // VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR is a deprecated alias\n    VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR = VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_BIT_KHR,\n    VK_PERFORMANCE_COUNTER_DESCRIPTION_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkPerformanceCounterDescriptionFlagBitsKHR;\ntypedef VkFlags VkPerformanceCounterDescriptionFlagsKHR;\n\ntypedef enum VkAcquireProfilingLockFlagBitsKHR {\n    VK_ACQUIRE_PROFILING_LOCK_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkAcquireProfilingLockFlagBitsKHR;\ntypedef VkFlags VkAcquireProfilingLockFlagsKHR;\ntypedef struct VkPhysicalDevicePerformanceQueryFeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           performanceCounterQueryPools;\n    VkBool32           performanceCounterMultipleQueryPools;\n} VkPhysicalDevicePerformanceQueryFeaturesKHR;\n\ntypedef struct VkPhysicalDevicePerformanceQueryPropertiesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           allowCommandBufferQueryCopies;\n} VkPhysicalDevicePerformanceQueryPropertiesKHR;\n\ntypedef struct VkPerformanceCounterKHR {\n    VkStructureType                   sType;\n    void*                             pNext;\n    VkPerformanceCounterUnitKHR       unit;\n    VkPerformanceCounterScopeKHR      scope;\n    VkPerformanceCounterStorageKHR    storage;\n    uint8_t                           uuid[VK_UUID_SIZE];\n} VkPerformanceCounterKHR;\n\ntypedef struct VkPerformanceCounterDescriptionKHR {\n    VkStructureType                            sType;\n    void*                                      pNext;\n    VkPerformanceCounterDescriptionFlagsKHR    flags;\n    char                                       name[VK_MAX_DESCRIPTION_SIZE];\n    char                                       category[VK_MAX_DESCRIPTION_SIZE];\n    char                                       description[VK_MAX_DESCRIPTION_SIZE];\n} VkPerformanceCounterDescriptionKHR;\n\ntypedef struct VkQueryPoolPerformanceCreateInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           queueFamilyIndex;\n    uint32_t           counterIndexCount;\n    const uint32_t*    pCounterIndices;\n} VkQueryPoolPerformanceCreateInfoKHR;\n\ntypedef union VkPerformanceCounterResultKHR {\n    int32_t     int32;\n    int64_t     int64;\n    uint32_t    uint32;\n    uint64_t    uint64;\n    float       float32;\n    double      float64;\n} VkPerformanceCounterResultKHR;\n\ntypedef struct VkAcquireProfilingLockInfoKHR {\n    VkStructureType                   sType;\n    const void*                       pNext;\n    VkAcquireProfilingLockFlagsKHR    flags;\n    uint64_t                          timeout;\n} VkAcquireProfilingLockInfoKHR;\n\ntypedef struct VkPerformanceQuerySubmitInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           counterPassIndex;\n} VkPerformanceQuerySubmitInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, uint32_t* pCounterCount, VkPerformanceCounterKHR* pCounters, VkPerformanceCounterDescriptionKHR* pCounterDescriptions);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR)(VkPhysicalDevice physicalDevice, const VkQueryPoolPerformanceCreateInfoKHR* pPerformanceQueryCreateInfo, uint32_t* pNumPasses);\ntypedef VkResult (VKAPI_PTR *PFN_vkAcquireProfilingLockKHR)(VkDevice device, const VkAcquireProfilingLockInfoKHR* pInfo);\ntypedef void (VKAPI_PTR *PFN_vkReleaseProfilingLockKHR)(VkDevice device);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t                                    queueFamilyIndex,\n    uint32_t*                                   pCounterCount,\n    VkPerformanceCounterKHR*                    pCounters,\n    VkPerformanceCounterDescriptionKHR*         pCounterDescriptions);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(\n    VkPhysicalDevice                            physicalDevice,\n    const VkQueryPoolPerformanceCreateInfoKHR*  pPerformanceQueryCreateInfo,\n    uint32_t*                                   pNumPasses);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkAcquireProfilingLockKHR(\n    VkDevice                                    device,\n    const VkAcquireProfilingLockInfoKHR*        pInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkReleaseProfilingLockKHR(\n    VkDevice                                    device);\n#endif\n\n\n// VK_KHR_maintenance2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_maintenance2 1\n#define VK_KHR_MAINTENANCE_2_SPEC_VERSION 1\n#define VK_KHR_MAINTENANCE_2_EXTENSION_NAME \"VK_KHR_maintenance2\"\n// VK_KHR_MAINTENANCE2_SPEC_VERSION is a deprecated alias\n#define VK_KHR_MAINTENANCE2_SPEC_VERSION  VK_KHR_MAINTENANCE_2_SPEC_VERSION\n// VK_KHR_MAINTENANCE2_EXTENSION_NAME is a deprecated alias\n#define VK_KHR_MAINTENANCE2_EXTENSION_NAME VK_KHR_MAINTENANCE_2_EXTENSION_NAME\ntypedef VkPointClippingBehavior VkPointClippingBehaviorKHR;\n\ntypedef VkTessellationDomainOrigin VkTessellationDomainOriginKHR;\n\ntypedef VkPhysicalDevicePointClippingProperties VkPhysicalDevicePointClippingPropertiesKHR;\n\ntypedef VkRenderPassInputAttachmentAspectCreateInfo VkRenderPassInputAttachmentAspectCreateInfoKHR;\n\ntypedef VkInputAttachmentAspectReference VkInputAttachmentAspectReferenceKHR;\n\ntypedef VkImageViewUsageCreateInfo VkImageViewUsageCreateInfoKHR;\n\ntypedef VkPipelineTessellationDomainOriginStateCreateInfo VkPipelineTessellationDomainOriginStateCreateInfoKHR;\n\n\n\n// VK_KHR_get_surface_capabilities2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_get_surface_capabilities2 1\n#define VK_KHR_GET_SURFACE_CAPABILITIES_2_SPEC_VERSION 1\n#define VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME \"VK_KHR_get_surface_capabilities2\"\ntypedef struct VkPhysicalDeviceSurfaceInfo2KHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkSurfaceKHR       surface;\n} VkPhysicalDeviceSurfaceInfo2KHR;\n\ntypedef struct VkSurfaceCapabilities2KHR {\n    VkStructureType             sType;\n    void*                       pNext;\n    VkSurfaceCapabilitiesKHR    surfaceCapabilities;\n} VkSurfaceCapabilities2KHR;\n\ntypedef struct VkSurfaceFormat2KHR {\n    VkStructureType       sType;\n    void*                 pNext;\n    VkSurfaceFormatKHR    surfaceFormat;\n} VkSurfaceFormat2KHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, VkSurfaceCapabilities2KHR* pSurfaceCapabilities);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfaceFormats2KHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, uint32_t* pSurfaceFormatCount, VkSurfaceFormat2KHR* pSurfaceFormats);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceCapabilities2KHR(\n    VkPhysicalDevice                            physicalDevice,\n    const VkPhysicalDeviceSurfaceInfo2KHR*      pSurfaceInfo,\n    VkSurfaceCapabilities2KHR*                  pSurfaceCapabilities);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceFormats2KHR(\n    VkPhysicalDevice                            physicalDevice,\n    const VkPhysicalDeviceSurfaceInfo2KHR*      pSurfaceInfo,\n    uint32_t*                                   pSurfaceFormatCount,\n    VkSurfaceFormat2KHR*                        pSurfaceFormats);\n#endif\n\n\n// VK_KHR_variable_pointers is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_variable_pointers 1\n#define VK_KHR_VARIABLE_POINTERS_SPEC_VERSION 1\n#define VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME \"VK_KHR_variable_pointers\"\ntypedef VkPhysicalDeviceVariablePointersFeatures VkPhysicalDeviceVariablePointerFeaturesKHR;\n\ntypedef VkPhysicalDeviceVariablePointersFeatures VkPhysicalDeviceVariablePointersFeaturesKHR;\n\n\n\n// VK_KHR_get_display_properties2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_get_display_properties2 1\n#define VK_KHR_GET_DISPLAY_PROPERTIES_2_SPEC_VERSION 1\n#define VK_KHR_GET_DISPLAY_PROPERTIES_2_EXTENSION_NAME \"VK_KHR_get_display_properties2\"\ntypedef struct VkDisplayProperties2KHR {\n    VkStructureType           sType;\n    void*                     pNext;\n    VkDisplayPropertiesKHR    displayProperties;\n} VkDisplayProperties2KHR;\n\ntypedef struct VkDisplayPlaneProperties2KHR {\n    VkStructureType                sType;\n    void*                          pNext;\n    VkDisplayPlanePropertiesKHR    displayPlaneProperties;\n} VkDisplayPlaneProperties2KHR;\n\ntypedef struct VkDisplayModeProperties2KHR {\n    VkStructureType               sType;\n    void*                         pNext;\n    VkDisplayModePropertiesKHR    displayModeProperties;\n} VkDisplayModeProperties2KHR;\n\ntypedef struct VkDisplayPlaneInfo2KHR {\n    VkStructureType     sType;\n    const void*         pNext;\n    VkDisplayModeKHR    mode;\n    uint32_t            planeIndex;\n} VkDisplayPlaneInfo2KHR;\n\ntypedef struct VkDisplayPlaneCapabilities2KHR {\n    VkStructureType                  sType;\n    void*                            pNext;\n    VkDisplayPlaneCapabilitiesKHR    capabilities;\n} VkDisplayPlaneCapabilities2KHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceDisplayProperties2KHR)(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkDisplayProperties2KHR* pProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR)(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkDisplayPlaneProperties2KHR* pProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetDisplayModeProperties2KHR)(VkPhysicalDevice physicalDevice, VkDisplayKHR display, uint32_t* pPropertyCount, VkDisplayModeProperties2KHR* pProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetDisplayPlaneCapabilities2KHR)(VkPhysicalDevice physicalDevice, const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo, VkDisplayPlaneCapabilities2KHR* pCapabilities);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayProperties2KHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t*                                   pPropertyCount,\n    VkDisplayProperties2KHR*                    pProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPlaneProperties2KHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t*                                   pPropertyCount,\n    VkDisplayPlaneProperties2KHR*               pProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayModeProperties2KHR(\n    VkPhysicalDevice                            physicalDevice,\n    VkDisplayKHR                                display,\n    uint32_t*                                   pPropertyCount,\n    VkDisplayModeProperties2KHR*                pProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayPlaneCapabilities2KHR(\n    VkPhysicalDevice                            physicalDevice,\n    const VkDisplayPlaneInfo2KHR*               pDisplayPlaneInfo,\n    VkDisplayPlaneCapabilities2KHR*             pCapabilities);\n#endif\n\n\n// VK_KHR_dedicated_allocation is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_dedicated_allocation 1\n#define VK_KHR_DEDICATED_ALLOCATION_SPEC_VERSION 3\n#define VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME \"VK_KHR_dedicated_allocation\"\ntypedef VkMemoryDedicatedRequirements VkMemoryDedicatedRequirementsKHR;\n\ntypedef VkMemoryDedicatedAllocateInfo VkMemoryDedicatedAllocateInfoKHR;\n\n\n\n// VK_KHR_storage_buffer_storage_class is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_storage_buffer_storage_class 1\n#define VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_SPEC_VERSION 1\n#define VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME \"VK_KHR_storage_buffer_storage_class\"\n\n\n// VK_KHR_relaxed_block_layout is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_relaxed_block_layout 1\n#define VK_KHR_RELAXED_BLOCK_LAYOUT_SPEC_VERSION 1\n#define VK_KHR_RELAXED_BLOCK_LAYOUT_EXTENSION_NAME \"VK_KHR_relaxed_block_layout\"\n\n\n// VK_KHR_get_memory_requirements2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_get_memory_requirements2 1\n#define VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION 1\n#define VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME \"VK_KHR_get_memory_requirements2\"\ntypedef VkBufferMemoryRequirementsInfo2 VkBufferMemoryRequirementsInfo2KHR;\n\ntypedef VkImageMemoryRequirementsInfo2 VkImageMemoryRequirementsInfo2KHR;\n\ntypedef VkImageSparseMemoryRequirementsInfo2 VkImageSparseMemoryRequirementsInfo2KHR;\n\ntypedef VkMemoryRequirements2 VkMemoryRequirements2KHR;\n\ntypedef VkSparseImageMemoryRequirements2 VkSparseImageMemoryRequirements2KHR;\n\ntypedef void (VKAPI_PTR *PFN_vkGetImageMemoryRequirements2KHR)(VkDevice device, const VkImageMemoryRequirementsInfo2* pInfo, VkMemoryRequirements2* pMemoryRequirements);\ntypedef void (VKAPI_PTR *PFN_vkGetBufferMemoryRequirements2KHR)(VkDevice device, const VkBufferMemoryRequirementsInfo2* pInfo, VkMemoryRequirements2* pMemoryRequirements);\ntypedef void (VKAPI_PTR *PFN_vkGetImageSparseMemoryRequirements2KHR)(VkDevice device, const VkImageSparseMemoryRequirementsInfo2* pInfo, uint32_t* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements2* pSparseMemoryRequirements);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkGetImageMemoryRequirements2KHR(\n    VkDevice                                    device,\n    const VkImageMemoryRequirementsInfo2*       pInfo,\n    VkMemoryRequirements2*                      pMemoryRequirements);\n\nVKAPI_ATTR void VKAPI_CALL vkGetBufferMemoryRequirements2KHR(\n    VkDevice                                    device,\n    const VkBufferMemoryRequirementsInfo2*      pInfo,\n    VkMemoryRequirements2*                      pMemoryRequirements);\n\nVKAPI_ATTR void VKAPI_CALL vkGetImageSparseMemoryRequirements2KHR(\n    VkDevice                                    device,\n    const VkImageSparseMemoryRequirementsInfo2* pInfo,\n    uint32_t*                                   pSparseMemoryRequirementCount,\n    VkSparseImageMemoryRequirements2*           pSparseMemoryRequirements);\n#endif\n\n\n// VK_KHR_image_format_list is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_image_format_list 1\n#define VK_KHR_IMAGE_FORMAT_LIST_SPEC_VERSION 1\n#define VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME \"VK_KHR_image_format_list\"\ntypedef VkImageFormatListCreateInfo VkImageFormatListCreateInfoKHR;\n\n\n\n// VK_KHR_sampler_ycbcr_conversion is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_sampler_ycbcr_conversion 1\ntypedef VkSamplerYcbcrConversion VkSamplerYcbcrConversionKHR;\n\n#define VK_KHR_SAMPLER_YCBCR_CONVERSION_SPEC_VERSION 14\n#define VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME \"VK_KHR_sampler_ycbcr_conversion\"\ntypedef VkSamplerYcbcrModelConversion VkSamplerYcbcrModelConversionKHR;\n\ntypedef VkSamplerYcbcrRange VkSamplerYcbcrRangeKHR;\n\ntypedef VkChromaLocation VkChromaLocationKHR;\n\ntypedef VkSamplerYcbcrConversionCreateInfo VkSamplerYcbcrConversionCreateInfoKHR;\n\ntypedef VkSamplerYcbcrConversionInfo VkSamplerYcbcrConversionInfoKHR;\n\ntypedef VkBindImagePlaneMemoryInfo VkBindImagePlaneMemoryInfoKHR;\n\ntypedef VkImagePlaneMemoryRequirementsInfo VkImagePlaneMemoryRequirementsInfoKHR;\n\ntypedef VkPhysicalDeviceSamplerYcbcrConversionFeatures VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR;\n\ntypedef VkSamplerYcbcrConversionImageFormatProperties VkSamplerYcbcrConversionImageFormatPropertiesKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateSamplerYcbcrConversionKHR)(VkDevice device, const VkSamplerYcbcrConversionCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSamplerYcbcrConversion* pYcbcrConversion);\ntypedef void (VKAPI_PTR *PFN_vkDestroySamplerYcbcrConversionKHR)(VkDevice device, VkSamplerYcbcrConversion ycbcrConversion, const VkAllocationCallbacks* pAllocator);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateSamplerYcbcrConversionKHR(\n    VkDevice                                    device,\n    const VkSamplerYcbcrConversionCreateInfo*   pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSamplerYcbcrConversion*                   pYcbcrConversion);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroySamplerYcbcrConversionKHR(\n    VkDevice                                    device,\n    VkSamplerYcbcrConversion                    ycbcrConversion,\n    const VkAllocationCallbacks*                pAllocator);\n#endif\n\n\n// VK_KHR_bind_memory2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_bind_memory2 1\n#define VK_KHR_BIND_MEMORY_2_SPEC_VERSION 1\n#define VK_KHR_BIND_MEMORY_2_EXTENSION_NAME \"VK_KHR_bind_memory2\"\ntypedef VkBindBufferMemoryInfo VkBindBufferMemoryInfoKHR;\n\ntypedef VkBindImageMemoryInfo VkBindImageMemoryInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkBindBufferMemory2KHR)(VkDevice device, uint32_t bindInfoCount, const VkBindBufferMemoryInfo* pBindInfos);\ntypedef VkResult (VKAPI_PTR *PFN_vkBindImageMemory2KHR)(VkDevice device, uint32_t bindInfoCount, const VkBindImageMemoryInfo* pBindInfos);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkBindBufferMemory2KHR(\n    VkDevice                                    device,\n    uint32_t                                    bindInfoCount,\n    const VkBindBufferMemoryInfo*               pBindInfos);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory2KHR(\n    VkDevice                                    device,\n    uint32_t                                    bindInfoCount,\n    const VkBindImageMemoryInfo*                pBindInfos);\n#endif\n\n\n// VK_KHR_maintenance3 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_maintenance3 1\n#define VK_KHR_MAINTENANCE_3_SPEC_VERSION 1\n#define VK_KHR_MAINTENANCE_3_EXTENSION_NAME \"VK_KHR_maintenance3\"\n// VK_KHR_MAINTENANCE3_SPEC_VERSION is a deprecated alias\n#define VK_KHR_MAINTENANCE3_SPEC_VERSION  VK_KHR_MAINTENANCE_3_SPEC_VERSION\n// VK_KHR_MAINTENANCE3_EXTENSION_NAME is a deprecated alias\n#define VK_KHR_MAINTENANCE3_EXTENSION_NAME VK_KHR_MAINTENANCE_3_EXTENSION_NAME\ntypedef VkPhysicalDeviceMaintenance3Properties VkPhysicalDeviceMaintenance3PropertiesKHR;\n\ntypedef VkDescriptorSetLayoutSupport VkDescriptorSetLayoutSupportKHR;\n\ntypedef void (VKAPI_PTR *PFN_vkGetDescriptorSetLayoutSupportKHR)(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayoutSupport* pSupport);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkGetDescriptorSetLayoutSupportKHR(\n    VkDevice                                    device,\n    const VkDescriptorSetLayoutCreateInfo*      pCreateInfo,\n    VkDescriptorSetLayoutSupport*               pSupport);\n#endif\n\n\n// VK_KHR_draw_indirect_count is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_draw_indirect_count 1\n#define VK_KHR_DRAW_INDIRECT_COUNT_SPEC_VERSION 1\n#define VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME \"VK_KHR_draw_indirect_count\"\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawIndirectCountKHR)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride);\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawIndexedIndirectCountKHR)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectCountKHR(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    buffer,\n    VkDeviceSize                                offset,\n    VkBuffer                                    countBuffer,\n    VkDeviceSize                                countBufferOffset,\n    uint32_t                                    maxDrawCount,\n    uint32_t                                    stride);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirectCountKHR(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    buffer,\n    VkDeviceSize                                offset,\n    VkBuffer                                    countBuffer,\n    VkDeviceSize                                countBufferOffset,\n    uint32_t                                    maxDrawCount,\n    uint32_t                                    stride);\n#endif\n\n\n// VK_KHR_shader_subgroup_extended_types is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_shader_subgroup_extended_types 1\n#define VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_SPEC_VERSION 1\n#define VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME \"VK_KHR_shader_subgroup_extended_types\"\ntypedef VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR;\n\n\n\n// VK_KHR_8bit_storage is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_8bit_storage 1\n#define VK_KHR_8BIT_STORAGE_SPEC_VERSION  1\n#define VK_KHR_8BIT_STORAGE_EXTENSION_NAME \"VK_KHR_8bit_storage\"\ntypedef VkPhysicalDevice8BitStorageFeatures VkPhysicalDevice8BitStorageFeaturesKHR;\n\n\n\n// VK_KHR_shader_atomic_int64 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_shader_atomic_int64 1\n#define VK_KHR_SHADER_ATOMIC_INT64_SPEC_VERSION 1\n#define VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME \"VK_KHR_shader_atomic_int64\"\ntypedef VkPhysicalDeviceShaderAtomicInt64Features VkPhysicalDeviceShaderAtomicInt64FeaturesKHR;\n\n\n\n// VK_KHR_shader_clock is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_shader_clock 1\n#define VK_KHR_SHADER_CLOCK_SPEC_VERSION  1\n#define VK_KHR_SHADER_CLOCK_EXTENSION_NAME \"VK_KHR_shader_clock\"\ntypedef struct VkPhysicalDeviceShaderClockFeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderSubgroupClock;\n    VkBool32           shaderDeviceClock;\n} VkPhysicalDeviceShaderClockFeaturesKHR;\n\n\n\n// VK_KHR_video_decode_h265 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_video_decode_h265 1\n#include \"vk_video/vulkan_video_codec_h265std_decode.h\"\n#define VK_KHR_VIDEO_DECODE_H265_SPEC_VERSION 8\n#define VK_KHR_VIDEO_DECODE_H265_EXTENSION_NAME \"VK_KHR_video_decode_h265\"\ntypedef struct VkVideoDecodeH265ProfileInfoKHR {\n    VkStructureType           sType;\n    const void*               pNext;\n    StdVideoH265ProfileIdc    stdProfileIdc;\n} VkVideoDecodeH265ProfileInfoKHR;\n\ntypedef struct VkVideoDecodeH265CapabilitiesKHR {\n    VkStructureType         sType;\n    void*                   pNext;\n    StdVideoH265LevelIdc    maxLevelIdc;\n} VkVideoDecodeH265CapabilitiesKHR;\n\ntypedef struct VkVideoDecodeH265SessionParametersAddInfoKHR {\n    VkStructureType                            sType;\n    const void*                                pNext;\n    uint32_t                                   stdVPSCount;\n    const StdVideoH265VideoParameterSet*       pStdVPSs;\n    uint32_t                                   stdSPSCount;\n    const StdVideoH265SequenceParameterSet*    pStdSPSs;\n    uint32_t                                   stdPPSCount;\n    const StdVideoH265PictureParameterSet*     pStdPPSs;\n} VkVideoDecodeH265SessionParametersAddInfoKHR;\n\ntypedef struct VkVideoDecodeH265SessionParametersCreateInfoKHR {\n    VkStructureType                                        sType;\n    const void*                                            pNext;\n    uint32_t                                               maxStdVPSCount;\n    uint32_t                                               maxStdSPSCount;\n    uint32_t                                               maxStdPPSCount;\n    const VkVideoDecodeH265SessionParametersAddInfoKHR*    pParametersAddInfo;\n} VkVideoDecodeH265SessionParametersCreateInfoKHR;\n\ntypedef struct VkVideoDecodeH265PictureInfoKHR {\n    VkStructureType                         sType;\n    const void*                             pNext;\n    const StdVideoDecodeH265PictureInfo*    pStdPictureInfo;\n    uint32_t                                sliceSegmentCount;\n    const uint32_t*                         pSliceSegmentOffsets;\n} VkVideoDecodeH265PictureInfoKHR;\n\ntypedef struct VkVideoDecodeH265DpbSlotInfoKHR {\n    VkStructureType                           sType;\n    const void*                               pNext;\n    const StdVideoDecodeH265ReferenceInfo*    pStdReferenceInfo;\n} VkVideoDecodeH265DpbSlotInfoKHR;\n\n\n\n// VK_KHR_global_priority is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_global_priority 1\n#define VK_KHR_GLOBAL_PRIORITY_SPEC_VERSION 1\n#define VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME \"VK_KHR_global_priority\"\n#define VK_MAX_GLOBAL_PRIORITY_SIZE_KHR   VK_MAX_GLOBAL_PRIORITY_SIZE\ntypedef VkQueueGlobalPriority VkQueueGlobalPriorityKHR;\n\ntypedef VkDeviceQueueGlobalPriorityCreateInfo VkDeviceQueueGlobalPriorityCreateInfoKHR;\n\ntypedef VkPhysicalDeviceGlobalPriorityQueryFeatures VkPhysicalDeviceGlobalPriorityQueryFeaturesKHR;\n\ntypedef VkQueueFamilyGlobalPriorityProperties VkQueueFamilyGlobalPriorityPropertiesKHR;\n\n\n\n// VK_KHR_driver_properties is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_driver_properties 1\n#define VK_KHR_DRIVER_PROPERTIES_SPEC_VERSION 1\n#define VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME \"VK_KHR_driver_properties\"\n#define VK_MAX_DRIVER_NAME_SIZE_KHR       VK_MAX_DRIVER_NAME_SIZE\n#define VK_MAX_DRIVER_INFO_SIZE_KHR       VK_MAX_DRIVER_INFO_SIZE\ntypedef VkDriverId VkDriverIdKHR;\n\ntypedef VkConformanceVersion VkConformanceVersionKHR;\n\ntypedef VkPhysicalDeviceDriverProperties VkPhysicalDeviceDriverPropertiesKHR;\n\n\n\n// VK_KHR_shader_float_controls is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_shader_float_controls 1\n#define VK_KHR_SHADER_FLOAT_CONTROLS_SPEC_VERSION 4\n#define VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME \"VK_KHR_shader_float_controls\"\ntypedef VkShaderFloatControlsIndependence VkShaderFloatControlsIndependenceKHR;\n\ntypedef VkPhysicalDeviceFloatControlsProperties VkPhysicalDeviceFloatControlsPropertiesKHR;\n\n\n\n// VK_KHR_depth_stencil_resolve is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_depth_stencil_resolve 1\n#define VK_KHR_DEPTH_STENCIL_RESOLVE_SPEC_VERSION 1\n#define VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME \"VK_KHR_depth_stencil_resolve\"\ntypedef VkResolveModeFlagBits VkResolveModeFlagBitsKHR;\n\ntypedef VkResolveModeFlags VkResolveModeFlagsKHR;\n\ntypedef VkSubpassDescriptionDepthStencilResolve VkSubpassDescriptionDepthStencilResolveKHR;\n\ntypedef VkPhysicalDeviceDepthStencilResolveProperties VkPhysicalDeviceDepthStencilResolvePropertiesKHR;\n\n\n\n// VK_KHR_swapchain_mutable_format is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_swapchain_mutable_format 1\n#define VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_SPEC_VERSION 1\n#define VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_EXTENSION_NAME \"VK_KHR_swapchain_mutable_format\"\n\n\n// VK_KHR_timeline_semaphore is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_timeline_semaphore 1\n#define VK_KHR_TIMELINE_SEMAPHORE_SPEC_VERSION 2\n#define VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME \"VK_KHR_timeline_semaphore\"\ntypedef VkSemaphoreType VkSemaphoreTypeKHR;\n\ntypedef VkSemaphoreWaitFlagBits VkSemaphoreWaitFlagBitsKHR;\n\ntypedef VkSemaphoreWaitFlags VkSemaphoreWaitFlagsKHR;\n\ntypedef VkPhysicalDeviceTimelineSemaphoreFeatures VkPhysicalDeviceTimelineSemaphoreFeaturesKHR;\n\ntypedef VkPhysicalDeviceTimelineSemaphoreProperties VkPhysicalDeviceTimelineSemaphorePropertiesKHR;\n\ntypedef VkSemaphoreTypeCreateInfo VkSemaphoreTypeCreateInfoKHR;\n\ntypedef VkTimelineSemaphoreSubmitInfo VkTimelineSemaphoreSubmitInfoKHR;\n\ntypedef VkSemaphoreWaitInfo VkSemaphoreWaitInfoKHR;\n\ntypedef VkSemaphoreSignalInfo VkSemaphoreSignalInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetSemaphoreCounterValueKHR)(VkDevice device, VkSemaphore semaphore, uint64_t* pValue);\ntypedef VkResult (VKAPI_PTR *PFN_vkWaitSemaphoresKHR)(VkDevice device, const VkSemaphoreWaitInfo* pWaitInfo, uint64_t timeout);\ntypedef VkResult (VKAPI_PTR *PFN_vkSignalSemaphoreKHR)(VkDevice device, const VkSemaphoreSignalInfo* pSignalInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreCounterValueKHR(\n    VkDevice                                    device,\n    VkSemaphore                                 semaphore,\n    uint64_t*                                   pValue);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkWaitSemaphoresKHR(\n    VkDevice                                    device,\n    const VkSemaphoreWaitInfo*                  pWaitInfo,\n    uint64_t                                    timeout);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkSignalSemaphoreKHR(\n    VkDevice                                    device,\n    const VkSemaphoreSignalInfo*                pSignalInfo);\n#endif\n\n\n// VK_KHR_vulkan_memory_model is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_vulkan_memory_model 1\n#define VK_KHR_VULKAN_MEMORY_MODEL_SPEC_VERSION 3\n#define VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME \"VK_KHR_vulkan_memory_model\"\ntypedef VkPhysicalDeviceVulkanMemoryModelFeatures VkPhysicalDeviceVulkanMemoryModelFeaturesKHR;\n\n\n\n// VK_KHR_shader_terminate_invocation is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_shader_terminate_invocation 1\n#define VK_KHR_SHADER_TERMINATE_INVOCATION_SPEC_VERSION 1\n#define VK_KHR_SHADER_TERMINATE_INVOCATION_EXTENSION_NAME \"VK_KHR_shader_terminate_invocation\"\ntypedef VkPhysicalDeviceShaderTerminateInvocationFeatures VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR;\n\n\n\n// VK_KHR_fragment_shading_rate is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_fragment_shading_rate 1\n#define VK_KHR_FRAGMENT_SHADING_RATE_SPEC_VERSION 2\n#define VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME \"VK_KHR_fragment_shading_rate\"\n\ntypedef enum VkFragmentShadingRateCombinerOpKHR {\n    VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR = 0,\n    VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR = 1,\n    VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MIN_KHR = 2,\n    VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MAX_KHR = 3,\n    VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR = 4,\n    VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkFragmentShadingRateCombinerOpKHR;\ntypedef struct VkFragmentShadingRateAttachmentInfoKHR {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    const VkAttachmentReference2*    pFragmentShadingRateAttachment;\n    VkExtent2D                       shadingRateAttachmentTexelSize;\n} VkFragmentShadingRateAttachmentInfoKHR;\n\ntypedef struct VkPipelineFragmentShadingRateStateCreateInfoKHR {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkExtent2D                            fragmentSize;\n    VkFragmentShadingRateCombinerOpKHR    combinerOps[2];\n} VkPipelineFragmentShadingRateStateCreateInfoKHR;\n\ntypedef struct VkPhysicalDeviceFragmentShadingRateFeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           pipelineFragmentShadingRate;\n    VkBool32           primitiveFragmentShadingRate;\n    VkBool32           attachmentFragmentShadingRate;\n} VkPhysicalDeviceFragmentShadingRateFeaturesKHR;\n\ntypedef struct VkPhysicalDeviceFragmentShadingRatePropertiesKHR {\n    VkStructureType          sType;\n    void*                    pNext;\n    VkExtent2D               minFragmentShadingRateAttachmentTexelSize;\n    VkExtent2D               maxFragmentShadingRateAttachmentTexelSize;\n    uint32_t                 maxFragmentShadingRateAttachmentTexelSizeAspectRatio;\n    VkBool32                 primitiveFragmentShadingRateWithMultipleViewports;\n    VkBool32                 layeredShadingRateAttachments;\n    VkBool32                 fragmentShadingRateNonTrivialCombinerOps;\n    VkExtent2D               maxFragmentSize;\n    uint32_t                 maxFragmentSizeAspectRatio;\n    uint32_t                 maxFragmentShadingRateCoverageSamples;\n    VkSampleCountFlagBits    maxFragmentShadingRateRasterizationSamples;\n    VkBool32                 fragmentShadingRateWithShaderDepthStencilWrites;\n    VkBool32                 fragmentShadingRateWithSampleMask;\n    VkBool32                 fragmentShadingRateWithShaderSampleMask;\n    VkBool32                 fragmentShadingRateWithConservativeRasterization;\n    VkBool32                 fragmentShadingRateWithFragmentShaderInterlock;\n    VkBool32                 fragmentShadingRateWithCustomSampleLocations;\n    VkBool32                 fragmentShadingRateStrictMultiplyCombiner;\n} VkPhysicalDeviceFragmentShadingRatePropertiesKHR;\n\ntypedef struct VkPhysicalDeviceFragmentShadingRateKHR {\n    VkStructureType       sType;\n    void*                 pNext;\n    VkSampleCountFlags    sampleCounts;\n    VkExtent2D            fragmentSize;\n} VkPhysicalDeviceFragmentShadingRateKHR;\n\ntypedef struct VkRenderingFragmentShadingRateAttachmentInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkImageView        imageView;\n    VkImageLayout      imageLayout;\n    VkExtent2D         shadingRateAttachmentTexelSize;\n} VkRenderingFragmentShadingRateAttachmentInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR)(VkPhysicalDevice physicalDevice, uint32_t* pFragmentShadingRateCount, VkPhysicalDeviceFragmentShadingRateKHR* pFragmentShadingRates);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetFragmentShadingRateKHR)(VkCommandBuffer           commandBuffer, const VkExtent2D*                           pFragmentSize, const VkFragmentShadingRateCombinerOpKHR    combinerOps[2]);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceFragmentShadingRatesKHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t*                                   pFragmentShadingRateCount,\n    VkPhysicalDeviceFragmentShadingRateKHR*     pFragmentShadingRates);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetFragmentShadingRateKHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkExtent2D*                           pFragmentSize,\n    const VkFragmentShadingRateCombinerOpKHR    combinerOps[2]);\n#endif\n\n\n// VK_KHR_dynamic_rendering_local_read is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_dynamic_rendering_local_read 1\n#define VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_SPEC_VERSION 1\n#define VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_EXTENSION_NAME \"VK_KHR_dynamic_rendering_local_read\"\ntypedef VkPhysicalDeviceDynamicRenderingLocalReadFeatures VkPhysicalDeviceDynamicRenderingLocalReadFeaturesKHR;\n\ntypedef VkRenderingAttachmentLocationInfo VkRenderingAttachmentLocationInfoKHR;\n\ntypedef VkRenderingInputAttachmentIndexInfo VkRenderingInputAttachmentIndexInfoKHR;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdSetRenderingAttachmentLocationsKHR)(VkCommandBuffer commandBuffer, const VkRenderingAttachmentLocationInfo* pLocationInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetRenderingInputAttachmentIndicesKHR)(VkCommandBuffer commandBuffer, const VkRenderingInputAttachmentIndexInfo* pInputAttachmentIndexInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdSetRenderingAttachmentLocationsKHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkRenderingAttachmentLocationInfo*    pLocationInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetRenderingInputAttachmentIndicesKHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkRenderingInputAttachmentIndexInfo*  pInputAttachmentIndexInfo);\n#endif\n\n\n// VK_KHR_shader_quad_control is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_shader_quad_control 1\n#define VK_KHR_SHADER_QUAD_CONTROL_SPEC_VERSION 1\n#define VK_KHR_SHADER_QUAD_CONTROL_EXTENSION_NAME \"VK_KHR_shader_quad_control\"\ntypedef struct VkPhysicalDeviceShaderQuadControlFeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderQuadControl;\n} VkPhysicalDeviceShaderQuadControlFeaturesKHR;\n\n\n\n// VK_KHR_spirv_1_4 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_spirv_1_4 1\n#define VK_KHR_SPIRV_1_4_SPEC_VERSION     1\n#define VK_KHR_SPIRV_1_4_EXTENSION_NAME   \"VK_KHR_spirv_1_4\"\n\n\n// VK_KHR_surface_protected_capabilities is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_surface_protected_capabilities 1\n#define VK_KHR_SURFACE_PROTECTED_CAPABILITIES_SPEC_VERSION 1\n#define VK_KHR_SURFACE_PROTECTED_CAPABILITIES_EXTENSION_NAME \"VK_KHR_surface_protected_capabilities\"\ntypedef struct VkSurfaceProtectedCapabilitiesKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           supportsProtected;\n} VkSurfaceProtectedCapabilitiesKHR;\n\n\n\n// VK_KHR_separate_depth_stencil_layouts is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_separate_depth_stencil_layouts 1\n#define VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_SPEC_VERSION 1\n#define VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME \"VK_KHR_separate_depth_stencil_layouts\"\ntypedef VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR;\n\ntypedef VkAttachmentReferenceStencilLayout VkAttachmentReferenceStencilLayoutKHR;\n\ntypedef VkAttachmentDescriptionStencilLayout VkAttachmentDescriptionStencilLayoutKHR;\n\n\n\n// VK_KHR_present_wait is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_present_wait 1\n#define VK_KHR_PRESENT_WAIT_SPEC_VERSION  1\n#define VK_KHR_PRESENT_WAIT_EXTENSION_NAME \"VK_KHR_present_wait\"\ntypedef struct VkPhysicalDevicePresentWaitFeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           presentWait;\n} VkPhysicalDevicePresentWaitFeaturesKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkWaitForPresentKHR)(VkDevice device, VkSwapchainKHR swapchain, uint64_t presentId, uint64_t timeout);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkWaitForPresentKHR(\n    VkDevice                                    device,\n    VkSwapchainKHR                              swapchain,\n    uint64_t                                    presentId,\n    uint64_t                                    timeout);\n#endif\n\n\n// VK_KHR_uniform_buffer_standard_layout is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_uniform_buffer_standard_layout 1\n#define VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_SPEC_VERSION 1\n#define VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME \"VK_KHR_uniform_buffer_standard_layout\"\ntypedef VkPhysicalDeviceUniformBufferStandardLayoutFeatures VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR;\n\n\n\n// VK_KHR_buffer_device_address is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_buffer_device_address 1\n#define VK_KHR_BUFFER_DEVICE_ADDRESS_SPEC_VERSION 1\n#define VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME \"VK_KHR_buffer_device_address\"\ntypedef VkPhysicalDeviceBufferDeviceAddressFeatures VkPhysicalDeviceBufferDeviceAddressFeaturesKHR;\n\ntypedef VkBufferDeviceAddressInfo VkBufferDeviceAddressInfoKHR;\n\ntypedef VkBufferOpaqueCaptureAddressCreateInfo VkBufferOpaqueCaptureAddressCreateInfoKHR;\n\ntypedef VkMemoryOpaqueCaptureAddressAllocateInfo VkMemoryOpaqueCaptureAddressAllocateInfoKHR;\n\ntypedef VkDeviceMemoryOpaqueCaptureAddressInfo VkDeviceMemoryOpaqueCaptureAddressInfoKHR;\n\ntypedef VkDeviceAddress (VKAPI_PTR *PFN_vkGetBufferDeviceAddressKHR)(VkDevice device, const VkBufferDeviceAddressInfo* pInfo);\ntypedef uint64_t (VKAPI_PTR *PFN_vkGetBufferOpaqueCaptureAddressKHR)(VkDevice device, const VkBufferDeviceAddressInfo* pInfo);\ntypedef uint64_t (VKAPI_PTR *PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR)(VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkDeviceAddress VKAPI_CALL vkGetBufferDeviceAddressKHR(\n    VkDevice                                    device,\n    const VkBufferDeviceAddressInfo*            pInfo);\n\nVKAPI_ATTR uint64_t VKAPI_CALL vkGetBufferOpaqueCaptureAddressKHR(\n    VkDevice                                    device,\n    const VkBufferDeviceAddressInfo*            pInfo);\n\nVKAPI_ATTR uint64_t VKAPI_CALL vkGetDeviceMemoryOpaqueCaptureAddressKHR(\n    VkDevice                                    device,\n    const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo);\n#endif\n\n\n// VK_KHR_deferred_host_operations is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_deferred_host_operations 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDeferredOperationKHR)\n#define VK_KHR_DEFERRED_HOST_OPERATIONS_SPEC_VERSION 4\n#define VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME \"VK_KHR_deferred_host_operations\"\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateDeferredOperationKHR)(VkDevice device, const VkAllocationCallbacks* pAllocator, VkDeferredOperationKHR* pDeferredOperation);\ntypedef void (VKAPI_PTR *PFN_vkDestroyDeferredOperationKHR)(VkDevice device, VkDeferredOperationKHR operation, const VkAllocationCallbacks* pAllocator);\ntypedef uint32_t (VKAPI_PTR *PFN_vkGetDeferredOperationMaxConcurrencyKHR)(VkDevice device, VkDeferredOperationKHR operation);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetDeferredOperationResultKHR)(VkDevice device, VkDeferredOperationKHR operation);\ntypedef VkResult (VKAPI_PTR *PFN_vkDeferredOperationJoinKHR)(VkDevice device, VkDeferredOperationKHR operation);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateDeferredOperationKHR(\n    VkDevice                                    device,\n    const VkAllocationCallbacks*                pAllocator,\n    VkDeferredOperationKHR*                     pDeferredOperation);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyDeferredOperationKHR(\n    VkDevice                                    device,\n    VkDeferredOperationKHR                      operation,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR uint32_t VKAPI_CALL vkGetDeferredOperationMaxConcurrencyKHR(\n    VkDevice                                    device,\n    VkDeferredOperationKHR                      operation);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetDeferredOperationResultKHR(\n    VkDevice                                    device,\n    VkDeferredOperationKHR                      operation);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkDeferredOperationJoinKHR(\n    VkDevice                                    device,\n    VkDeferredOperationKHR                      operation);\n#endif\n\n\n// VK_KHR_pipeline_executable_properties is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_pipeline_executable_properties 1\n#define VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_SPEC_VERSION 1\n#define VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME \"VK_KHR_pipeline_executable_properties\"\n\ntypedef enum VkPipelineExecutableStatisticFormatKHR {\n    VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_BOOL32_KHR = 0,\n    VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_INT64_KHR = 1,\n    VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_UINT64_KHR = 2,\n    VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_FLOAT64_KHR = 3,\n    VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkPipelineExecutableStatisticFormatKHR;\ntypedef struct VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           pipelineExecutableInfo;\n} VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR;\n\ntypedef struct VkPipelineInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkPipeline         pipeline;\n} VkPipelineInfoKHR;\n\ntypedef struct VkPipelineExecutablePropertiesKHR {\n    VkStructureType       sType;\n    void*                 pNext;\n    VkShaderStageFlags    stages;\n    char                  name[VK_MAX_DESCRIPTION_SIZE];\n    char                  description[VK_MAX_DESCRIPTION_SIZE];\n    uint32_t              subgroupSize;\n} VkPipelineExecutablePropertiesKHR;\n\ntypedef struct VkPipelineExecutableInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkPipeline         pipeline;\n    uint32_t           executableIndex;\n} VkPipelineExecutableInfoKHR;\n\ntypedef union VkPipelineExecutableStatisticValueKHR {\n    VkBool32    b32;\n    int64_t     i64;\n    uint64_t    u64;\n    double      f64;\n} VkPipelineExecutableStatisticValueKHR;\n\ntypedef struct VkPipelineExecutableStatisticKHR {\n    VkStructureType                           sType;\n    void*                                     pNext;\n    char                                      name[VK_MAX_DESCRIPTION_SIZE];\n    char                                      description[VK_MAX_DESCRIPTION_SIZE];\n    VkPipelineExecutableStatisticFormatKHR    format;\n    VkPipelineExecutableStatisticValueKHR     value;\n} VkPipelineExecutableStatisticKHR;\n\ntypedef struct VkPipelineExecutableInternalRepresentationKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    char               name[VK_MAX_DESCRIPTION_SIZE];\n    char               description[VK_MAX_DESCRIPTION_SIZE];\n    VkBool32           isText;\n    size_t             dataSize;\n    void*              pData;\n} VkPipelineExecutableInternalRepresentationKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPipelineExecutablePropertiesKHR)(VkDevice                        device, const VkPipelineInfoKHR*        pPipelineInfo, uint32_t* pExecutableCount, VkPipelineExecutablePropertiesKHR* pProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPipelineExecutableStatisticsKHR)(VkDevice                        device, const VkPipelineExecutableInfoKHR*  pExecutableInfo, uint32_t* pStatisticCount, VkPipelineExecutableStatisticKHR* pStatistics);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPipelineExecutableInternalRepresentationsKHR)(VkDevice                        device, const VkPipelineExecutableInfoKHR*  pExecutableInfo, uint32_t* pInternalRepresentationCount, VkPipelineExecutableInternalRepresentationKHR* pInternalRepresentations);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPipelineExecutablePropertiesKHR(\n    VkDevice                                    device,\n    const VkPipelineInfoKHR*                    pPipelineInfo,\n    uint32_t*                                   pExecutableCount,\n    VkPipelineExecutablePropertiesKHR*          pProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPipelineExecutableStatisticsKHR(\n    VkDevice                                    device,\n    const VkPipelineExecutableInfoKHR*          pExecutableInfo,\n    uint32_t*                                   pStatisticCount,\n    VkPipelineExecutableStatisticKHR*           pStatistics);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPipelineExecutableInternalRepresentationsKHR(\n    VkDevice                                    device,\n    const VkPipelineExecutableInfoKHR*          pExecutableInfo,\n    uint32_t*                                   pInternalRepresentationCount,\n    VkPipelineExecutableInternalRepresentationKHR* pInternalRepresentations);\n#endif\n\n\n// VK_KHR_map_memory2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_map_memory2 1\n#define VK_KHR_MAP_MEMORY_2_SPEC_VERSION  1\n#define VK_KHR_MAP_MEMORY_2_EXTENSION_NAME \"VK_KHR_map_memory2\"\ntypedef VkMemoryUnmapFlagBits VkMemoryUnmapFlagBitsKHR;\n\ntypedef VkMemoryUnmapFlags VkMemoryUnmapFlagsKHR;\n\ntypedef VkMemoryMapInfo VkMemoryMapInfoKHR;\n\ntypedef VkMemoryUnmapInfo VkMemoryUnmapInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkMapMemory2KHR)(VkDevice device, const VkMemoryMapInfo* pMemoryMapInfo, void** ppData);\ntypedef VkResult (VKAPI_PTR *PFN_vkUnmapMemory2KHR)(VkDevice device, const VkMemoryUnmapInfo* pMemoryUnmapInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkMapMemory2KHR(\n    VkDevice                                    device,\n    const VkMemoryMapInfo*                      pMemoryMapInfo,\n    void**                                      ppData);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkUnmapMemory2KHR(\n    VkDevice                                    device,\n    const VkMemoryUnmapInfo*                    pMemoryUnmapInfo);\n#endif\n\n\n// VK_KHR_shader_integer_dot_product is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_shader_integer_dot_product 1\n#define VK_KHR_SHADER_INTEGER_DOT_PRODUCT_SPEC_VERSION 1\n#define VK_KHR_SHADER_INTEGER_DOT_PRODUCT_EXTENSION_NAME \"VK_KHR_shader_integer_dot_product\"\ntypedef VkPhysicalDeviceShaderIntegerDotProductFeatures VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR;\n\ntypedef VkPhysicalDeviceShaderIntegerDotProductProperties VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR;\n\n\n\n// VK_KHR_pipeline_library is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_pipeline_library 1\n#define VK_KHR_PIPELINE_LIBRARY_SPEC_VERSION 1\n#define VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME \"VK_KHR_pipeline_library\"\ntypedef struct VkPipelineLibraryCreateInfoKHR {\n    VkStructureType      sType;\n    const void*          pNext;\n    uint32_t             libraryCount;\n    const VkPipeline*    pLibraries;\n} VkPipelineLibraryCreateInfoKHR;\n\n\n\n// VK_KHR_shader_non_semantic_info is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_shader_non_semantic_info 1\n#define VK_KHR_SHADER_NON_SEMANTIC_INFO_SPEC_VERSION 1\n#define VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME \"VK_KHR_shader_non_semantic_info\"\n\n\n// VK_KHR_present_id is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_present_id 1\n#define VK_KHR_PRESENT_ID_SPEC_VERSION    1\n#define VK_KHR_PRESENT_ID_EXTENSION_NAME  \"VK_KHR_present_id\"\ntypedef struct VkPresentIdKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           swapchainCount;\n    const uint64_t*    pPresentIds;\n} VkPresentIdKHR;\n\ntypedef struct VkPhysicalDevicePresentIdFeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           presentId;\n} VkPhysicalDevicePresentIdFeaturesKHR;\n\n\n\n// VK_KHR_video_encode_queue is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_video_encode_queue 1\n#define VK_KHR_VIDEO_ENCODE_QUEUE_SPEC_VERSION 12\n#define VK_KHR_VIDEO_ENCODE_QUEUE_EXTENSION_NAME \"VK_KHR_video_encode_queue\"\n\ntypedef enum VkVideoEncodeTuningModeKHR {\n    VK_VIDEO_ENCODE_TUNING_MODE_DEFAULT_KHR = 0,\n    VK_VIDEO_ENCODE_TUNING_MODE_HIGH_QUALITY_KHR = 1,\n    VK_VIDEO_ENCODE_TUNING_MODE_LOW_LATENCY_KHR = 2,\n    VK_VIDEO_ENCODE_TUNING_MODE_ULTRA_LOW_LATENCY_KHR = 3,\n    VK_VIDEO_ENCODE_TUNING_MODE_LOSSLESS_KHR = 4,\n    VK_VIDEO_ENCODE_TUNING_MODE_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoEncodeTuningModeKHR;\n\ntypedef enum VkVideoEncodeFlagBitsKHR {\n    VK_VIDEO_ENCODE_WITH_QUANTIZATION_DELTA_MAP_BIT_KHR = 0x00000001,\n    VK_VIDEO_ENCODE_WITH_EMPHASIS_MAP_BIT_KHR = 0x00000002,\n    VK_VIDEO_ENCODE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoEncodeFlagBitsKHR;\ntypedef VkFlags VkVideoEncodeFlagsKHR;\n\ntypedef enum VkVideoEncodeCapabilityFlagBitsKHR {\n    VK_VIDEO_ENCODE_CAPABILITY_PRECEDING_EXTERNALLY_ENCODED_BYTES_BIT_KHR = 0x00000001,\n    VK_VIDEO_ENCODE_CAPABILITY_INSUFFICIENT_BITSTREAM_BUFFER_RANGE_DETECTION_BIT_KHR = 0x00000002,\n    VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR = 0x00000004,\n    VK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR = 0x00000008,\n    VK_VIDEO_ENCODE_CAPABILITY_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoEncodeCapabilityFlagBitsKHR;\ntypedef VkFlags VkVideoEncodeCapabilityFlagsKHR;\n\ntypedef enum VkVideoEncodeRateControlModeFlagBitsKHR {\n    VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR = 0,\n    VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR = 0x00000001,\n    VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR = 0x00000002,\n    VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR = 0x00000004,\n    VK_VIDEO_ENCODE_RATE_CONTROL_MODE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoEncodeRateControlModeFlagBitsKHR;\ntypedef VkFlags VkVideoEncodeRateControlModeFlagsKHR;\n\ntypedef enum VkVideoEncodeFeedbackFlagBitsKHR {\n    VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR = 0x00000001,\n    VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR = 0x00000002,\n    VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_HAS_OVERRIDES_BIT_KHR = 0x00000004,\n    VK_VIDEO_ENCODE_FEEDBACK_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoEncodeFeedbackFlagBitsKHR;\ntypedef VkFlags VkVideoEncodeFeedbackFlagsKHR;\n\ntypedef enum VkVideoEncodeUsageFlagBitsKHR {\n    VK_VIDEO_ENCODE_USAGE_DEFAULT_KHR = 0,\n    VK_VIDEO_ENCODE_USAGE_TRANSCODING_BIT_KHR = 0x00000001,\n    VK_VIDEO_ENCODE_USAGE_STREAMING_BIT_KHR = 0x00000002,\n    VK_VIDEO_ENCODE_USAGE_RECORDING_BIT_KHR = 0x00000004,\n    VK_VIDEO_ENCODE_USAGE_CONFERENCING_BIT_KHR = 0x00000008,\n    VK_VIDEO_ENCODE_USAGE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoEncodeUsageFlagBitsKHR;\ntypedef VkFlags VkVideoEncodeUsageFlagsKHR;\n\ntypedef enum VkVideoEncodeContentFlagBitsKHR {\n    VK_VIDEO_ENCODE_CONTENT_DEFAULT_KHR = 0,\n    VK_VIDEO_ENCODE_CONTENT_CAMERA_BIT_KHR = 0x00000001,\n    VK_VIDEO_ENCODE_CONTENT_DESKTOP_BIT_KHR = 0x00000002,\n    VK_VIDEO_ENCODE_CONTENT_RENDERED_BIT_KHR = 0x00000004,\n    VK_VIDEO_ENCODE_CONTENT_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoEncodeContentFlagBitsKHR;\ntypedef VkFlags VkVideoEncodeContentFlagsKHR;\ntypedef VkFlags VkVideoEncodeRateControlFlagsKHR;\ntypedef struct VkVideoEncodeInfoKHR {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkVideoEncodeFlagsKHR                 flags;\n    VkBuffer                              dstBuffer;\n    VkDeviceSize                          dstBufferOffset;\n    VkDeviceSize                          dstBufferRange;\n    VkVideoPictureResourceInfoKHR         srcPictureResource;\n    const VkVideoReferenceSlotInfoKHR*    pSetupReferenceSlot;\n    uint32_t                              referenceSlotCount;\n    const VkVideoReferenceSlotInfoKHR*    pReferenceSlots;\n    uint32_t                              precedingExternallyEncodedBytes;\n} VkVideoEncodeInfoKHR;\n\ntypedef struct VkVideoEncodeCapabilitiesKHR {\n    VkStructureType                         sType;\n    void*                                   pNext;\n    VkVideoEncodeCapabilityFlagsKHR         flags;\n    VkVideoEncodeRateControlModeFlagsKHR    rateControlModes;\n    uint32_t                                maxRateControlLayers;\n    uint64_t                                maxBitrate;\n    uint32_t                                maxQualityLevels;\n    VkExtent2D                              encodeInputPictureGranularity;\n    VkVideoEncodeFeedbackFlagsKHR           supportedEncodeFeedbackFlags;\n} VkVideoEncodeCapabilitiesKHR;\n\ntypedef struct VkQueryPoolVideoEncodeFeedbackCreateInfoKHR {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkVideoEncodeFeedbackFlagsKHR    encodeFeedbackFlags;\n} VkQueryPoolVideoEncodeFeedbackCreateInfoKHR;\n\ntypedef struct VkVideoEncodeUsageInfoKHR {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    VkVideoEncodeUsageFlagsKHR      videoUsageHints;\n    VkVideoEncodeContentFlagsKHR    videoContentHints;\n    VkVideoEncodeTuningModeKHR      tuningMode;\n} VkVideoEncodeUsageInfoKHR;\n\ntypedef struct VkVideoEncodeRateControlLayerInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint64_t           averageBitrate;\n    uint64_t           maxBitrate;\n    uint32_t           frameRateNumerator;\n    uint32_t           frameRateDenominator;\n} VkVideoEncodeRateControlLayerInfoKHR;\n\ntypedef struct VkVideoEncodeRateControlInfoKHR {\n    VkStructureType                                sType;\n    const void*                                    pNext;\n    VkVideoEncodeRateControlFlagsKHR               flags;\n    VkVideoEncodeRateControlModeFlagBitsKHR        rateControlMode;\n    uint32_t                                       layerCount;\n    const VkVideoEncodeRateControlLayerInfoKHR*    pLayers;\n    uint32_t                                       virtualBufferSizeInMs;\n    uint32_t                                       initialVirtualBufferSizeInMs;\n} VkVideoEncodeRateControlInfoKHR;\n\ntypedef struct VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    const VkVideoProfileInfoKHR*    pVideoProfile;\n    uint32_t                        qualityLevel;\n} VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR;\n\ntypedef struct VkVideoEncodeQualityLevelPropertiesKHR {\n    VkStructureType                            sType;\n    void*                                      pNext;\n    VkVideoEncodeRateControlModeFlagBitsKHR    preferredRateControlMode;\n    uint32_t                                   preferredRateControlLayerCount;\n} VkVideoEncodeQualityLevelPropertiesKHR;\n\ntypedef struct VkVideoEncodeQualityLevelInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           qualityLevel;\n} VkVideoEncodeQualityLevelInfoKHR;\n\ntypedef struct VkVideoEncodeSessionParametersGetInfoKHR {\n    VkStructureType                sType;\n    const void*                    pNext;\n    VkVideoSessionParametersKHR    videoSessionParameters;\n} VkVideoEncodeSessionParametersGetInfoKHR;\n\ntypedef struct VkVideoEncodeSessionParametersFeedbackInfoKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           hasOverrides;\n} VkVideoEncodeSessionParametersFeedbackInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR* pQualityLevelInfo, VkVideoEncodeQualityLevelPropertiesKHR* pQualityLevelProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetEncodedVideoSessionParametersKHR)(VkDevice device, const VkVideoEncodeSessionParametersGetInfoKHR* pVideoSessionParametersInfo, VkVideoEncodeSessionParametersFeedbackInfoKHR* pFeedbackInfo, size_t* pDataSize, void* pData);\ntypedef void (VKAPI_PTR *PFN_vkCmdEncodeVideoKHR)(VkCommandBuffer commandBuffer, const VkVideoEncodeInfoKHR* pEncodeInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR(\n    VkPhysicalDevice                            physicalDevice,\n    const VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR* pQualityLevelInfo,\n    VkVideoEncodeQualityLevelPropertiesKHR*     pQualityLevelProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetEncodedVideoSessionParametersKHR(\n    VkDevice                                    device,\n    const VkVideoEncodeSessionParametersGetInfoKHR* pVideoSessionParametersInfo,\n    VkVideoEncodeSessionParametersFeedbackInfoKHR* pFeedbackInfo,\n    size_t*                                     pDataSize,\n    void*                                       pData);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdEncodeVideoKHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkVideoEncodeInfoKHR*                 pEncodeInfo);\n#endif\n\n\n// VK_KHR_synchronization2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_synchronization2 1\n#define VK_KHR_SYNCHRONIZATION_2_SPEC_VERSION 1\n#define VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME \"VK_KHR_synchronization2\"\ntypedef VkPipelineStageFlags2 VkPipelineStageFlags2KHR;\n\ntypedef VkPipelineStageFlagBits2 VkPipelineStageFlagBits2KHR;\n\ntypedef VkAccessFlags2 VkAccessFlags2KHR;\n\ntypedef VkAccessFlagBits2 VkAccessFlagBits2KHR;\n\ntypedef VkSubmitFlagBits VkSubmitFlagBitsKHR;\n\ntypedef VkSubmitFlags VkSubmitFlagsKHR;\n\ntypedef VkMemoryBarrier2 VkMemoryBarrier2KHR;\n\ntypedef VkBufferMemoryBarrier2 VkBufferMemoryBarrier2KHR;\n\ntypedef VkImageMemoryBarrier2 VkImageMemoryBarrier2KHR;\n\ntypedef VkDependencyInfo VkDependencyInfoKHR;\n\ntypedef VkSubmitInfo2 VkSubmitInfo2KHR;\n\ntypedef VkSemaphoreSubmitInfo VkSemaphoreSubmitInfoKHR;\n\ntypedef VkCommandBufferSubmitInfo VkCommandBufferSubmitInfoKHR;\n\ntypedef VkPhysicalDeviceSynchronization2Features VkPhysicalDeviceSynchronization2FeaturesKHR;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdSetEvent2KHR)(VkCommandBuffer                   commandBuffer, VkEvent                                             event, const VkDependencyInfo*                             pDependencyInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdResetEvent2KHR)(VkCommandBuffer                   commandBuffer, VkEvent                                             event, VkPipelineStageFlags2               stageMask);\ntypedef void (VKAPI_PTR *PFN_vkCmdWaitEvents2KHR)(VkCommandBuffer                   commandBuffer, uint32_t                                            eventCount, const VkEvent*                     pEvents, const VkDependencyInfo*            pDependencyInfos);\ntypedef void (VKAPI_PTR *PFN_vkCmdPipelineBarrier2KHR)(VkCommandBuffer                   commandBuffer, const VkDependencyInfo*                             pDependencyInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdWriteTimestamp2KHR)(VkCommandBuffer                   commandBuffer, VkPipelineStageFlags2               stage, VkQueryPool                                         queryPool, uint32_t                                            query);\ntypedef VkResult (VKAPI_PTR *PFN_vkQueueSubmit2KHR)(VkQueue                           queue, uint32_t                            submitCount, const VkSubmitInfo2*              pSubmits, VkFence           fence);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdSetEvent2KHR(\n    VkCommandBuffer                             commandBuffer,\n    VkEvent                                     event,\n    const VkDependencyInfo*                     pDependencyInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdResetEvent2KHR(\n    VkCommandBuffer                             commandBuffer,\n    VkEvent                                     event,\n    VkPipelineStageFlags2                       stageMask);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdWaitEvents2KHR(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    eventCount,\n    const VkEvent*                              pEvents,\n    const VkDependencyInfo*                     pDependencyInfos);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdPipelineBarrier2KHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkDependencyInfo*                     pDependencyInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp2KHR(\n    VkCommandBuffer                             commandBuffer,\n    VkPipelineStageFlags2                       stage,\n    VkQueryPool                                 queryPool,\n    uint32_t                                    query);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkQueueSubmit2KHR(\n    VkQueue                                     queue,\n    uint32_t                                    submitCount,\n    const VkSubmitInfo2*                        pSubmits,\n    VkFence                                     fence);\n#endif\n\n\n// VK_KHR_fragment_shader_barycentric is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_fragment_shader_barycentric 1\n#define VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_SPEC_VERSION 1\n#define VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME \"VK_KHR_fragment_shader_barycentric\"\ntypedef struct VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           fragmentShaderBarycentric;\n} VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR;\n\ntypedef struct VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           triStripVertexOrderIndependentOfProvokingVertex;\n} VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR;\n\n\n\n// VK_KHR_shader_subgroup_uniform_control_flow is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_shader_subgroup_uniform_control_flow 1\n#define VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_SPEC_VERSION 1\n#define VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_EXTENSION_NAME \"VK_KHR_shader_subgroup_uniform_control_flow\"\ntypedef struct VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderSubgroupUniformControlFlow;\n} VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR;\n\n\n\n// VK_KHR_zero_initialize_workgroup_memory is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_zero_initialize_workgroup_memory 1\n#define VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_SPEC_VERSION 1\n#define VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_EXTENSION_NAME \"VK_KHR_zero_initialize_workgroup_memory\"\ntypedef VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR;\n\n\n\n// VK_KHR_workgroup_memory_explicit_layout is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_workgroup_memory_explicit_layout 1\n#define VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_SPEC_VERSION 1\n#define VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_EXTENSION_NAME \"VK_KHR_workgroup_memory_explicit_layout\"\ntypedef struct VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           workgroupMemoryExplicitLayout;\n    VkBool32           workgroupMemoryExplicitLayoutScalarBlockLayout;\n    VkBool32           workgroupMemoryExplicitLayout8BitAccess;\n    VkBool32           workgroupMemoryExplicitLayout16BitAccess;\n} VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR;\n\n\n\n// VK_KHR_copy_commands2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_copy_commands2 1\n#define VK_KHR_COPY_COMMANDS_2_SPEC_VERSION 1\n#define VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME \"VK_KHR_copy_commands2\"\ntypedef VkCopyBufferInfo2 VkCopyBufferInfo2KHR;\n\ntypedef VkCopyImageInfo2 VkCopyImageInfo2KHR;\n\ntypedef VkCopyBufferToImageInfo2 VkCopyBufferToImageInfo2KHR;\n\ntypedef VkCopyImageToBufferInfo2 VkCopyImageToBufferInfo2KHR;\n\ntypedef VkBlitImageInfo2 VkBlitImageInfo2KHR;\n\ntypedef VkResolveImageInfo2 VkResolveImageInfo2KHR;\n\ntypedef VkBufferCopy2 VkBufferCopy2KHR;\n\ntypedef VkImageCopy2 VkImageCopy2KHR;\n\ntypedef VkImageBlit2 VkImageBlit2KHR;\n\ntypedef VkBufferImageCopy2 VkBufferImageCopy2KHR;\n\ntypedef VkImageResolve2 VkImageResolve2KHR;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyBuffer2KHR)(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2* pCopyBufferInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyImage2KHR)(VkCommandBuffer commandBuffer, const VkCopyImageInfo2* pCopyImageInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyBufferToImage2KHR)(VkCommandBuffer commandBuffer, const VkCopyBufferToImageInfo2* pCopyBufferToImageInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyImageToBuffer2KHR)(VkCommandBuffer commandBuffer, const VkCopyImageToBufferInfo2* pCopyImageToBufferInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdBlitImage2KHR)(VkCommandBuffer commandBuffer, const VkBlitImageInfo2* pBlitImageInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdResolveImage2KHR)(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer2KHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkCopyBufferInfo2*                    pCopyBufferInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyImage2KHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkCopyImageInfo2*                     pCopyImageInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage2KHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkCopyBufferToImageInfo2*             pCopyBufferToImageInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer2KHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkCopyImageToBufferInfo2*             pCopyImageToBufferInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBlitImage2KHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkBlitImageInfo2*                     pBlitImageInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdResolveImage2KHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkResolveImageInfo2*                  pResolveImageInfo);\n#endif\n\n\n// VK_KHR_format_feature_flags2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_format_feature_flags2 1\n#define VK_KHR_FORMAT_FEATURE_FLAGS_2_SPEC_VERSION 2\n#define VK_KHR_FORMAT_FEATURE_FLAGS_2_EXTENSION_NAME \"VK_KHR_format_feature_flags2\"\ntypedef VkFormatFeatureFlags2 VkFormatFeatureFlags2KHR;\n\ntypedef VkFormatFeatureFlagBits2 VkFormatFeatureFlagBits2KHR;\n\ntypedef VkFormatProperties3 VkFormatProperties3KHR;\n\n\n\n// VK_KHR_ray_tracing_maintenance1 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_ray_tracing_maintenance1 1\n#define VK_KHR_RAY_TRACING_MAINTENANCE_1_SPEC_VERSION 1\n#define VK_KHR_RAY_TRACING_MAINTENANCE_1_EXTENSION_NAME \"VK_KHR_ray_tracing_maintenance1\"\ntypedef struct VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           rayTracingMaintenance1;\n    VkBool32           rayTracingPipelineTraceRaysIndirect2;\n} VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR;\n\ntypedef struct VkTraceRaysIndirectCommand2KHR {\n    VkDeviceAddress    raygenShaderRecordAddress;\n    VkDeviceSize       raygenShaderRecordSize;\n    VkDeviceAddress    missShaderBindingTableAddress;\n    VkDeviceSize       missShaderBindingTableSize;\n    VkDeviceSize       missShaderBindingTableStride;\n    VkDeviceAddress    hitShaderBindingTableAddress;\n    VkDeviceSize       hitShaderBindingTableSize;\n    VkDeviceSize       hitShaderBindingTableStride;\n    VkDeviceAddress    callableShaderBindingTableAddress;\n    VkDeviceSize       callableShaderBindingTableSize;\n    VkDeviceSize       callableShaderBindingTableStride;\n    uint32_t           width;\n    uint32_t           height;\n    uint32_t           depth;\n} VkTraceRaysIndirectCommand2KHR;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdTraceRaysIndirect2KHR)(VkCommandBuffer commandBuffer, VkDeviceAddress indirectDeviceAddress);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdTraceRaysIndirect2KHR(\n    VkCommandBuffer                             commandBuffer,\n    VkDeviceAddress                             indirectDeviceAddress);\n#endif\n\n\n// VK_KHR_portability_enumeration is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_portability_enumeration 1\n#define VK_KHR_PORTABILITY_ENUMERATION_SPEC_VERSION 1\n#define VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME \"VK_KHR_portability_enumeration\"\n\n\n// VK_KHR_maintenance4 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_maintenance4 1\n#define VK_KHR_MAINTENANCE_4_SPEC_VERSION 2\n#define VK_KHR_MAINTENANCE_4_EXTENSION_NAME \"VK_KHR_maintenance4\"\ntypedef VkPhysicalDeviceMaintenance4Features VkPhysicalDeviceMaintenance4FeaturesKHR;\n\ntypedef VkPhysicalDeviceMaintenance4Properties VkPhysicalDeviceMaintenance4PropertiesKHR;\n\ntypedef VkDeviceBufferMemoryRequirements VkDeviceBufferMemoryRequirementsKHR;\n\ntypedef VkDeviceImageMemoryRequirements VkDeviceImageMemoryRequirementsKHR;\n\ntypedef void (VKAPI_PTR *PFN_vkGetDeviceBufferMemoryRequirementsKHR)(VkDevice device, const VkDeviceBufferMemoryRequirements* pInfo, VkMemoryRequirements2* pMemoryRequirements);\ntypedef void (VKAPI_PTR *PFN_vkGetDeviceImageMemoryRequirementsKHR)(VkDevice device, const VkDeviceImageMemoryRequirements* pInfo, VkMemoryRequirements2* pMemoryRequirements);\ntypedef void (VKAPI_PTR *PFN_vkGetDeviceImageSparseMemoryRequirementsKHR)(VkDevice device, const VkDeviceImageMemoryRequirements* pInfo, uint32_t* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements2* pSparseMemoryRequirements);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkGetDeviceBufferMemoryRequirementsKHR(\n    VkDevice                                    device,\n    const VkDeviceBufferMemoryRequirements*     pInfo,\n    VkMemoryRequirements2*                      pMemoryRequirements);\n\nVKAPI_ATTR void VKAPI_CALL vkGetDeviceImageMemoryRequirementsKHR(\n    VkDevice                                    device,\n    const VkDeviceImageMemoryRequirements*      pInfo,\n    VkMemoryRequirements2*                      pMemoryRequirements);\n\nVKAPI_ATTR void VKAPI_CALL vkGetDeviceImageSparseMemoryRequirementsKHR(\n    VkDevice                                    device,\n    const VkDeviceImageMemoryRequirements*      pInfo,\n    uint32_t*                                   pSparseMemoryRequirementCount,\n    VkSparseImageMemoryRequirements2*           pSparseMemoryRequirements);\n#endif\n\n\n// VK_KHR_shader_subgroup_rotate is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_shader_subgroup_rotate 1\n#define VK_KHR_SHADER_SUBGROUP_ROTATE_SPEC_VERSION 2\n#define VK_KHR_SHADER_SUBGROUP_ROTATE_EXTENSION_NAME \"VK_KHR_shader_subgroup_rotate\"\ntypedef VkPhysicalDeviceShaderSubgroupRotateFeatures VkPhysicalDeviceShaderSubgroupRotateFeaturesKHR;\n\n\n\n// VK_KHR_shader_maximal_reconvergence is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_shader_maximal_reconvergence 1\n#define VK_KHR_SHADER_MAXIMAL_RECONVERGENCE_SPEC_VERSION 1\n#define VK_KHR_SHADER_MAXIMAL_RECONVERGENCE_EXTENSION_NAME \"VK_KHR_shader_maximal_reconvergence\"\ntypedef struct VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderMaximalReconvergence;\n} VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR;\n\n\n\n// VK_KHR_maintenance5 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_maintenance5 1\n#define VK_KHR_MAINTENANCE_5_SPEC_VERSION 1\n#define VK_KHR_MAINTENANCE_5_EXTENSION_NAME \"VK_KHR_maintenance5\"\ntypedef VkPipelineCreateFlags2 VkPipelineCreateFlags2KHR;\n\ntypedef VkPipelineCreateFlagBits2 VkPipelineCreateFlagBits2KHR;\n\ntypedef VkBufferUsageFlags2 VkBufferUsageFlags2KHR;\n\ntypedef VkBufferUsageFlagBits2 VkBufferUsageFlagBits2KHR;\n\ntypedef VkPhysicalDeviceMaintenance5Features VkPhysicalDeviceMaintenance5FeaturesKHR;\n\ntypedef VkPhysicalDeviceMaintenance5Properties VkPhysicalDeviceMaintenance5PropertiesKHR;\n\ntypedef VkRenderingAreaInfo VkRenderingAreaInfoKHR;\n\ntypedef VkDeviceImageSubresourceInfo VkDeviceImageSubresourceInfoKHR;\n\ntypedef VkImageSubresource2 VkImageSubresource2KHR;\n\ntypedef VkSubresourceLayout2 VkSubresourceLayout2KHR;\n\ntypedef VkPipelineCreateFlags2CreateInfo VkPipelineCreateFlags2CreateInfoKHR;\n\ntypedef VkBufferUsageFlags2CreateInfo VkBufferUsageFlags2CreateInfoKHR;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdBindIndexBuffer2KHR)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkDeviceSize size, VkIndexType indexType);\ntypedef void (VKAPI_PTR *PFN_vkGetRenderingAreaGranularityKHR)(VkDevice device, const VkRenderingAreaInfo* pRenderingAreaInfo, VkExtent2D* pGranularity);\ntypedef void (VKAPI_PTR *PFN_vkGetDeviceImageSubresourceLayoutKHR)(VkDevice device, const VkDeviceImageSubresourceInfo* pInfo, VkSubresourceLayout2* pLayout);\ntypedef void (VKAPI_PTR *PFN_vkGetImageSubresourceLayout2KHR)(VkDevice device, VkImage image, const VkImageSubresource2* pSubresource, VkSubresourceLayout2* pLayout);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdBindIndexBuffer2KHR(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    buffer,\n    VkDeviceSize                                offset,\n    VkDeviceSize                                size,\n    VkIndexType                                 indexType);\n\nVKAPI_ATTR void VKAPI_CALL vkGetRenderingAreaGranularityKHR(\n    VkDevice                                    device,\n    const VkRenderingAreaInfo*                  pRenderingAreaInfo,\n    VkExtent2D*                                 pGranularity);\n\nVKAPI_ATTR void VKAPI_CALL vkGetDeviceImageSubresourceLayoutKHR(\n    VkDevice                                    device,\n    const VkDeviceImageSubresourceInfo*         pInfo,\n    VkSubresourceLayout2*                       pLayout);\n\nVKAPI_ATTR void VKAPI_CALL vkGetImageSubresourceLayout2KHR(\n    VkDevice                                    device,\n    VkImage                                     image,\n    const VkImageSubresource2*                  pSubresource,\n    VkSubresourceLayout2*                       pLayout);\n#endif\n\n\n// VK_KHR_ray_tracing_position_fetch is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_ray_tracing_position_fetch 1\n#define VK_KHR_RAY_TRACING_POSITION_FETCH_SPEC_VERSION 1\n#define VK_KHR_RAY_TRACING_POSITION_FETCH_EXTENSION_NAME \"VK_KHR_ray_tracing_position_fetch\"\ntypedef struct VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           rayTracingPositionFetch;\n} VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR;\n\n\n\n// VK_KHR_pipeline_binary is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_pipeline_binary 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipelineBinaryKHR)\n#define VK_MAX_PIPELINE_BINARY_KEY_SIZE_KHR 32U\n#define VK_KHR_PIPELINE_BINARY_SPEC_VERSION 1\n#define VK_KHR_PIPELINE_BINARY_EXTENSION_NAME \"VK_KHR_pipeline_binary\"\ntypedef struct VkPhysicalDevicePipelineBinaryFeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           pipelineBinaries;\n} VkPhysicalDevicePipelineBinaryFeaturesKHR;\n\ntypedef struct VkPhysicalDevicePipelineBinaryPropertiesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           pipelineBinaryInternalCache;\n    VkBool32           pipelineBinaryInternalCacheControl;\n    VkBool32           pipelineBinaryPrefersInternalCache;\n    VkBool32           pipelineBinaryPrecompiledInternalCache;\n    VkBool32           pipelineBinaryCompressedData;\n} VkPhysicalDevicePipelineBinaryPropertiesKHR;\n\ntypedef struct VkDevicePipelineBinaryInternalCacheControlKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           disableInternalCache;\n} VkDevicePipelineBinaryInternalCacheControlKHR;\n\ntypedef struct VkPipelineBinaryKeyKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           keySize;\n    uint8_t            key[VK_MAX_PIPELINE_BINARY_KEY_SIZE_KHR];\n} VkPipelineBinaryKeyKHR;\n\ntypedef struct VkPipelineBinaryDataKHR {\n    size_t    dataSize;\n    void*     pData;\n} VkPipelineBinaryDataKHR;\n\ntypedef struct VkPipelineBinaryKeysAndDataKHR {\n    uint32_t                          binaryCount;\n    const VkPipelineBinaryKeyKHR*     pPipelineBinaryKeys;\n    const VkPipelineBinaryDataKHR*    pPipelineBinaryData;\n} VkPipelineBinaryKeysAndDataKHR;\n\ntypedef struct VkPipelineCreateInfoKHR {\n    VkStructureType    sType;\n    void*              pNext;\n} VkPipelineCreateInfoKHR;\n\ntypedef struct VkPipelineBinaryCreateInfoKHR {\n    VkStructureType                          sType;\n    const void*                              pNext;\n    const VkPipelineBinaryKeysAndDataKHR*    pKeysAndDataInfo;\n    VkPipeline                               pipeline;\n    const VkPipelineCreateInfoKHR*           pPipelineCreateInfo;\n} VkPipelineBinaryCreateInfoKHR;\n\ntypedef struct VkPipelineBinaryInfoKHR {\n    VkStructureType               sType;\n    const void*                   pNext;\n    uint32_t                      binaryCount;\n    const VkPipelineBinaryKHR*    pPipelineBinaries;\n} VkPipelineBinaryInfoKHR;\n\ntypedef struct VkReleaseCapturedPipelineDataInfoKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkPipeline         pipeline;\n} VkReleaseCapturedPipelineDataInfoKHR;\n\ntypedef struct VkPipelineBinaryDataInfoKHR {\n    VkStructureType        sType;\n    void*                  pNext;\n    VkPipelineBinaryKHR    pipelineBinary;\n} VkPipelineBinaryDataInfoKHR;\n\ntypedef struct VkPipelineBinaryHandlesInfoKHR {\n    VkStructureType         sType;\n    const void*             pNext;\n    uint32_t                pipelineBinaryCount;\n    VkPipelineBinaryKHR*    pPipelineBinaries;\n} VkPipelineBinaryHandlesInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreatePipelineBinariesKHR)(VkDevice device, const VkPipelineBinaryCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineBinaryHandlesInfoKHR* pBinaries);\ntypedef void (VKAPI_PTR *PFN_vkDestroyPipelineBinaryKHR)(VkDevice device, VkPipelineBinaryKHR pipelineBinary, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPipelineKeyKHR)(VkDevice device, const VkPipelineCreateInfoKHR* pPipelineCreateInfo, VkPipelineBinaryKeyKHR* pPipelineKey);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPipelineBinaryDataKHR)(VkDevice device, const VkPipelineBinaryDataInfoKHR* pInfo, VkPipelineBinaryKeyKHR* pPipelineBinaryKey, size_t* pPipelineBinaryDataSize, void* pPipelineBinaryData);\ntypedef VkResult (VKAPI_PTR *PFN_vkReleaseCapturedPipelineDataKHR)(VkDevice device, const VkReleaseCapturedPipelineDataInfoKHR* pInfo, const VkAllocationCallbacks* pAllocator);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineBinariesKHR(\n    VkDevice                                    device,\n    const VkPipelineBinaryCreateInfoKHR*        pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkPipelineBinaryHandlesInfoKHR*             pBinaries);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyPipelineBinaryKHR(\n    VkDevice                                    device,\n    VkPipelineBinaryKHR                         pipelineBinary,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPipelineKeyKHR(\n    VkDevice                                    device,\n    const VkPipelineCreateInfoKHR*              pPipelineCreateInfo,\n    VkPipelineBinaryKeyKHR*                     pPipelineKey);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPipelineBinaryDataKHR(\n    VkDevice                                    device,\n    const VkPipelineBinaryDataInfoKHR*          pInfo,\n    VkPipelineBinaryKeyKHR*                     pPipelineBinaryKey,\n    size_t*                                     pPipelineBinaryDataSize,\n    void*                                       pPipelineBinaryData);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkReleaseCapturedPipelineDataKHR(\n    VkDevice                                    device,\n    const VkReleaseCapturedPipelineDataInfoKHR* pInfo,\n    const VkAllocationCallbacks*                pAllocator);\n#endif\n\n\n// VK_KHR_cooperative_matrix is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_cooperative_matrix 1\n#define VK_KHR_COOPERATIVE_MATRIX_SPEC_VERSION 2\n#define VK_KHR_COOPERATIVE_MATRIX_EXTENSION_NAME \"VK_KHR_cooperative_matrix\"\n\ntypedef enum VkComponentTypeKHR {\n    VK_COMPONENT_TYPE_FLOAT16_KHR = 0,\n    VK_COMPONENT_TYPE_FLOAT32_KHR = 1,\n    VK_COMPONENT_TYPE_FLOAT64_KHR = 2,\n    VK_COMPONENT_TYPE_SINT8_KHR = 3,\n    VK_COMPONENT_TYPE_SINT16_KHR = 4,\n    VK_COMPONENT_TYPE_SINT32_KHR = 5,\n    VK_COMPONENT_TYPE_SINT64_KHR = 6,\n    VK_COMPONENT_TYPE_UINT8_KHR = 7,\n    VK_COMPONENT_TYPE_UINT16_KHR = 8,\n    VK_COMPONENT_TYPE_UINT32_KHR = 9,\n    VK_COMPONENT_TYPE_UINT64_KHR = 10,\n    VK_COMPONENT_TYPE_SINT8_PACKED_NV = 1000491000,\n    VK_COMPONENT_TYPE_UINT8_PACKED_NV = 1000491001,\n    VK_COMPONENT_TYPE_FLOAT_E4M3_NV = 1000491002,\n    VK_COMPONENT_TYPE_FLOAT_E5M2_NV = 1000491003,\n    VK_COMPONENT_TYPE_FLOAT16_NV = VK_COMPONENT_TYPE_FLOAT16_KHR,\n    VK_COMPONENT_TYPE_FLOAT32_NV = VK_COMPONENT_TYPE_FLOAT32_KHR,\n    VK_COMPONENT_TYPE_FLOAT64_NV = VK_COMPONENT_TYPE_FLOAT64_KHR,\n    VK_COMPONENT_TYPE_SINT8_NV = VK_COMPONENT_TYPE_SINT8_KHR,\n    VK_COMPONENT_TYPE_SINT16_NV = VK_COMPONENT_TYPE_SINT16_KHR,\n    VK_COMPONENT_TYPE_SINT32_NV = VK_COMPONENT_TYPE_SINT32_KHR,\n    VK_COMPONENT_TYPE_SINT64_NV = VK_COMPONENT_TYPE_SINT64_KHR,\n    VK_COMPONENT_TYPE_UINT8_NV = VK_COMPONENT_TYPE_UINT8_KHR,\n    VK_COMPONENT_TYPE_UINT16_NV = VK_COMPONENT_TYPE_UINT16_KHR,\n    VK_COMPONENT_TYPE_UINT32_NV = VK_COMPONENT_TYPE_UINT32_KHR,\n    VK_COMPONENT_TYPE_UINT64_NV = VK_COMPONENT_TYPE_UINT64_KHR,\n    VK_COMPONENT_TYPE_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkComponentTypeKHR;\n\ntypedef enum VkScopeKHR {\n    VK_SCOPE_DEVICE_KHR = 1,\n    VK_SCOPE_WORKGROUP_KHR = 2,\n    VK_SCOPE_SUBGROUP_KHR = 3,\n    VK_SCOPE_QUEUE_FAMILY_KHR = 5,\n    VK_SCOPE_DEVICE_NV = VK_SCOPE_DEVICE_KHR,\n    VK_SCOPE_WORKGROUP_NV = VK_SCOPE_WORKGROUP_KHR,\n    VK_SCOPE_SUBGROUP_NV = VK_SCOPE_SUBGROUP_KHR,\n    VK_SCOPE_QUEUE_FAMILY_NV = VK_SCOPE_QUEUE_FAMILY_KHR,\n    VK_SCOPE_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkScopeKHR;\ntypedef struct VkCooperativeMatrixPropertiesKHR {\n    VkStructureType       sType;\n    void*                 pNext;\n    uint32_t              MSize;\n    uint32_t              NSize;\n    uint32_t              KSize;\n    VkComponentTypeKHR    AType;\n    VkComponentTypeKHR    BType;\n    VkComponentTypeKHR    CType;\n    VkComponentTypeKHR    ResultType;\n    VkBool32              saturatingAccumulation;\n    VkScopeKHR            scope;\n} VkCooperativeMatrixPropertiesKHR;\n\ntypedef struct VkPhysicalDeviceCooperativeMatrixFeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           cooperativeMatrix;\n    VkBool32           cooperativeMatrixRobustBufferAccess;\n} VkPhysicalDeviceCooperativeMatrixFeaturesKHR;\n\ntypedef struct VkPhysicalDeviceCooperativeMatrixPropertiesKHR {\n    VkStructureType       sType;\n    void*                 pNext;\n    VkShaderStageFlags    cooperativeMatrixSupportedStages;\n} VkPhysicalDeviceCooperativeMatrixPropertiesKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR)(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkCooperativeMatrixPropertiesKHR* pProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t*                                   pPropertyCount,\n    VkCooperativeMatrixPropertiesKHR*           pProperties);\n#endif\n\n\n// VK_KHR_compute_shader_derivatives is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_compute_shader_derivatives 1\n#define VK_KHR_COMPUTE_SHADER_DERIVATIVES_SPEC_VERSION 1\n#define VK_KHR_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME \"VK_KHR_compute_shader_derivatives\"\ntypedef struct VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           computeDerivativeGroupQuads;\n    VkBool32           computeDerivativeGroupLinear;\n} VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR;\n\ntypedef struct VkPhysicalDeviceComputeShaderDerivativesPropertiesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           meshAndTaskShaderDerivatives;\n} VkPhysicalDeviceComputeShaderDerivativesPropertiesKHR;\n\n\n\n// VK_KHR_video_decode_av1 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_video_decode_av1 1\n#include \"vk_video/vulkan_video_codec_av1std.h\"\n#include \"vk_video/vulkan_video_codec_av1std_decode.h\"\n#define VK_MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR 7U\n#define VK_KHR_VIDEO_DECODE_AV1_SPEC_VERSION 1\n#define VK_KHR_VIDEO_DECODE_AV1_EXTENSION_NAME \"VK_KHR_video_decode_av1\"\ntypedef struct VkVideoDecodeAV1ProfileInfoKHR {\n    VkStructureType       sType;\n    const void*           pNext;\n    StdVideoAV1Profile    stdProfile;\n    VkBool32              filmGrainSupport;\n} VkVideoDecodeAV1ProfileInfoKHR;\n\ntypedef struct VkVideoDecodeAV1CapabilitiesKHR {\n    VkStructureType     sType;\n    void*               pNext;\n    StdVideoAV1Level    maxLevel;\n} VkVideoDecodeAV1CapabilitiesKHR;\n\ntypedef struct VkVideoDecodeAV1SessionParametersCreateInfoKHR {\n    VkStructureType                     sType;\n    const void*                         pNext;\n    const StdVideoAV1SequenceHeader*    pStdSequenceHeader;\n} VkVideoDecodeAV1SessionParametersCreateInfoKHR;\n\ntypedef struct VkVideoDecodeAV1PictureInfoKHR {\n    VkStructureType                        sType;\n    const void*                            pNext;\n    const StdVideoDecodeAV1PictureInfo*    pStdPictureInfo;\n    int32_t                                referenceNameSlotIndices[VK_MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR];\n    uint32_t                               frameHeaderOffset;\n    uint32_t                               tileCount;\n    const uint32_t*                        pTileOffsets;\n    const uint32_t*                        pTileSizes;\n} VkVideoDecodeAV1PictureInfoKHR;\n\ntypedef struct VkVideoDecodeAV1DpbSlotInfoKHR {\n    VkStructureType                          sType;\n    const void*                              pNext;\n    const StdVideoDecodeAV1ReferenceInfo*    pStdReferenceInfo;\n} VkVideoDecodeAV1DpbSlotInfoKHR;\n\n\n\n// VK_KHR_video_encode_av1 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_video_encode_av1 1\n#include \"vk_video/vulkan_video_codec_av1std_encode.h\"\n#define VK_KHR_VIDEO_ENCODE_AV1_SPEC_VERSION 1\n#define VK_KHR_VIDEO_ENCODE_AV1_EXTENSION_NAME \"VK_KHR_video_encode_av1\"\n\ntypedef enum VkVideoEncodeAV1PredictionModeKHR {\n    VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_INTRA_ONLY_KHR = 0,\n    VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_SINGLE_REFERENCE_KHR = 1,\n    VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_UNIDIRECTIONAL_COMPOUND_KHR = 2,\n    VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_BIDIRECTIONAL_COMPOUND_KHR = 3,\n    VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoEncodeAV1PredictionModeKHR;\n\ntypedef enum VkVideoEncodeAV1RateControlGroupKHR {\n    VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_INTRA_KHR = 0,\n    VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_PREDICTIVE_KHR = 1,\n    VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_BIPREDICTIVE_KHR = 2,\n    VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoEncodeAV1RateControlGroupKHR;\n\ntypedef enum VkVideoEncodeAV1CapabilityFlagBitsKHR {\n    VK_VIDEO_ENCODE_AV1_CAPABILITY_PER_RATE_CONTROL_GROUP_MIN_MAX_Q_INDEX_BIT_KHR = 0x00000001,\n    VK_VIDEO_ENCODE_AV1_CAPABILITY_GENERATE_OBU_EXTENSION_HEADER_BIT_KHR = 0x00000002,\n    VK_VIDEO_ENCODE_AV1_CAPABILITY_PRIMARY_REFERENCE_CDF_ONLY_BIT_KHR = 0x00000004,\n    VK_VIDEO_ENCODE_AV1_CAPABILITY_FRAME_SIZE_OVERRIDE_BIT_KHR = 0x00000008,\n    VK_VIDEO_ENCODE_AV1_CAPABILITY_MOTION_VECTOR_SCALING_BIT_KHR = 0x00000010,\n    VK_VIDEO_ENCODE_AV1_CAPABILITY_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoEncodeAV1CapabilityFlagBitsKHR;\ntypedef VkFlags VkVideoEncodeAV1CapabilityFlagsKHR;\n\ntypedef enum VkVideoEncodeAV1StdFlagBitsKHR {\n    VK_VIDEO_ENCODE_AV1_STD_UNIFORM_TILE_SPACING_FLAG_SET_BIT_KHR = 0x00000001,\n    VK_VIDEO_ENCODE_AV1_STD_SKIP_MODE_PRESENT_UNSET_BIT_KHR = 0x00000002,\n    VK_VIDEO_ENCODE_AV1_STD_PRIMARY_REF_FRAME_BIT_KHR = 0x00000004,\n    VK_VIDEO_ENCODE_AV1_STD_DELTA_Q_BIT_KHR = 0x00000008,\n    VK_VIDEO_ENCODE_AV1_STD_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoEncodeAV1StdFlagBitsKHR;\ntypedef VkFlags VkVideoEncodeAV1StdFlagsKHR;\n\ntypedef enum VkVideoEncodeAV1SuperblockSizeFlagBitsKHR {\n    VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_64_BIT_KHR = 0x00000001,\n    VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_128_BIT_KHR = 0x00000002,\n    VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoEncodeAV1SuperblockSizeFlagBitsKHR;\ntypedef VkFlags VkVideoEncodeAV1SuperblockSizeFlagsKHR;\n\ntypedef enum VkVideoEncodeAV1RateControlFlagBitsKHR {\n    VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REGULAR_GOP_BIT_KHR = 0x00000001,\n    VK_VIDEO_ENCODE_AV1_RATE_CONTROL_TEMPORAL_LAYER_PATTERN_DYADIC_BIT_KHR = 0x00000002,\n    VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REFERENCE_PATTERN_FLAT_BIT_KHR = 0x00000004,\n    VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REFERENCE_PATTERN_DYADIC_BIT_KHR = 0x00000008,\n    VK_VIDEO_ENCODE_AV1_RATE_CONTROL_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkVideoEncodeAV1RateControlFlagBitsKHR;\ntypedef VkFlags VkVideoEncodeAV1RateControlFlagsKHR;\ntypedef struct VkPhysicalDeviceVideoEncodeAV1FeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           videoEncodeAV1;\n} VkPhysicalDeviceVideoEncodeAV1FeaturesKHR;\n\ntypedef struct VkVideoEncodeAV1CapabilitiesKHR {\n    VkStructureType                           sType;\n    void*                                     pNext;\n    VkVideoEncodeAV1CapabilityFlagsKHR        flags;\n    StdVideoAV1Level                          maxLevel;\n    VkExtent2D                                codedPictureAlignment;\n    VkExtent2D                                maxTiles;\n    VkExtent2D                                minTileSize;\n    VkExtent2D                                maxTileSize;\n    VkVideoEncodeAV1SuperblockSizeFlagsKHR    superblockSizes;\n    uint32_t                                  maxSingleReferenceCount;\n    uint32_t                                  singleReferenceNameMask;\n    uint32_t                                  maxUnidirectionalCompoundReferenceCount;\n    uint32_t                                  maxUnidirectionalCompoundGroup1ReferenceCount;\n    uint32_t                                  unidirectionalCompoundReferenceNameMask;\n    uint32_t                                  maxBidirectionalCompoundReferenceCount;\n    uint32_t                                  maxBidirectionalCompoundGroup1ReferenceCount;\n    uint32_t                                  maxBidirectionalCompoundGroup2ReferenceCount;\n    uint32_t                                  bidirectionalCompoundReferenceNameMask;\n    uint32_t                                  maxTemporalLayerCount;\n    uint32_t                                  maxSpatialLayerCount;\n    uint32_t                                  maxOperatingPoints;\n    uint32_t                                  minQIndex;\n    uint32_t                                  maxQIndex;\n    VkBool32                                  prefersGopRemainingFrames;\n    VkBool32                                  requiresGopRemainingFrames;\n    VkVideoEncodeAV1StdFlagsKHR               stdSyntaxFlags;\n} VkVideoEncodeAV1CapabilitiesKHR;\n\ntypedef struct VkVideoEncodeAV1QIndexKHR {\n    uint32_t    intraQIndex;\n    uint32_t    predictiveQIndex;\n    uint32_t    bipredictiveQIndex;\n} VkVideoEncodeAV1QIndexKHR;\n\ntypedef struct VkVideoEncodeAV1QualityLevelPropertiesKHR {\n    VkStructureType                        sType;\n    void*                                  pNext;\n    VkVideoEncodeAV1RateControlFlagsKHR    preferredRateControlFlags;\n    uint32_t                               preferredGopFrameCount;\n    uint32_t                               preferredKeyFramePeriod;\n    uint32_t                               preferredConsecutiveBipredictiveFrameCount;\n    uint32_t                               preferredTemporalLayerCount;\n    VkVideoEncodeAV1QIndexKHR              preferredConstantQIndex;\n    uint32_t                               preferredMaxSingleReferenceCount;\n    uint32_t                               preferredSingleReferenceNameMask;\n    uint32_t                               preferredMaxUnidirectionalCompoundReferenceCount;\n    uint32_t                               preferredMaxUnidirectionalCompoundGroup1ReferenceCount;\n    uint32_t                               preferredUnidirectionalCompoundReferenceNameMask;\n    uint32_t                               preferredMaxBidirectionalCompoundReferenceCount;\n    uint32_t                               preferredMaxBidirectionalCompoundGroup1ReferenceCount;\n    uint32_t                               preferredMaxBidirectionalCompoundGroup2ReferenceCount;\n    uint32_t                               preferredBidirectionalCompoundReferenceNameMask;\n} VkVideoEncodeAV1QualityLevelPropertiesKHR;\n\ntypedef struct VkVideoEncodeAV1SessionCreateInfoKHR {\n    VkStructureType     sType;\n    const void*         pNext;\n    VkBool32            useMaxLevel;\n    StdVideoAV1Level    maxLevel;\n} VkVideoEncodeAV1SessionCreateInfoKHR;\n\ntypedef struct VkVideoEncodeAV1SessionParametersCreateInfoKHR {\n    VkStructureType                               sType;\n    const void*                                   pNext;\n    const StdVideoAV1SequenceHeader*              pStdSequenceHeader;\n    const StdVideoEncodeAV1DecoderModelInfo*      pStdDecoderModelInfo;\n    uint32_t                                      stdOperatingPointCount;\n    const StdVideoEncodeAV1OperatingPointInfo*    pStdOperatingPoints;\n} VkVideoEncodeAV1SessionParametersCreateInfoKHR;\n\ntypedef struct VkVideoEncodeAV1PictureInfoKHR {\n    VkStructureType                        sType;\n    const void*                            pNext;\n    VkVideoEncodeAV1PredictionModeKHR      predictionMode;\n    VkVideoEncodeAV1RateControlGroupKHR    rateControlGroup;\n    uint32_t                               constantQIndex;\n    const StdVideoEncodeAV1PictureInfo*    pStdPictureInfo;\n    int32_t                                referenceNameSlotIndices[VK_MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR];\n    VkBool32                               primaryReferenceCdfOnly;\n    VkBool32                               generateObuExtensionHeader;\n} VkVideoEncodeAV1PictureInfoKHR;\n\ntypedef struct VkVideoEncodeAV1DpbSlotInfoKHR {\n    VkStructureType                          sType;\n    const void*                              pNext;\n    const StdVideoEncodeAV1ReferenceInfo*    pStdReferenceInfo;\n} VkVideoEncodeAV1DpbSlotInfoKHR;\n\ntypedef struct VkVideoEncodeAV1ProfileInfoKHR {\n    VkStructureType       sType;\n    const void*           pNext;\n    StdVideoAV1Profile    stdProfile;\n} VkVideoEncodeAV1ProfileInfoKHR;\n\ntypedef struct VkVideoEncodeAV1FrameSizeKHR {\n    uint32_t    intraFrameSize;\n    uint32_t    predictiveFrameSize;\n    uint32_t    bipredictiveFrameSize;\n} VkVideoEncodeAV1FrameSizeKHR;\n\ntypedef struct VkVideoEncodeAV1GopRemainingFrameInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           useGopRemainingFrames;\n    uint32_t           gopRemainingIntra;\n    uint32_t           gopRemainingPredictive;\n    uint32_t           gopRemainingBipredictive;\n} VkVideoEncodeAV1GopRemainingFrameInfoKHR;\n\ntypedef struct VkVideoEncodeAV1RateControlInfoKHR {\n    VkStructureType                        sType;\n    const void*                            pNext;\n    VkVideoEncodeAV1RateControlFlagsKHR    flags;\n    uint32_t                               gopFrameCount;\n    uint32_t                               keyFramePeriod;\n    uint32_t                               consecutiveBipredictiveFrameCount;\n    uint32_t                               temporalLayerCount;\n} VkVideoEncodeAV1RateControlInfoKHR;\n\ntypedef struct VkVideoEncodeAV1RateControlLayerInfoKHR {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    VkBool32                        useMinQIndex;\n    VkVideoEncodeAV1QIndexKHR       minQIndex;\n    VkBool32                        useMaxQIndex;\n    VkVideoEncodeAV1QIndexKHR       maxQIndex;\n    VkBool32                        useMaxFrameSize;\n    VkVideoEncodeAV1FrameSizeKHR    maxFrameSize;\n} VkVideoEncodeAV1RateControlLayerInfoKHR;\n\n\n\n// VK_KHR_video_maintenance1 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_video_maintenance1 1\n#define VK_KHR_VIDEO_MAINTENANCE_1_SPEC_VERSION 1\n#define VK_KHR_VIDEO_MAINTENANCE_1_EXTENSION_NAME \"VK_KHR_video_maintenance1\"\ntypedef struct VkPhysicalDeviceVideoMaintenance1FeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           videoMaintenance1;\n} VkPhysicalDeviceVideoMaintenance1FeaturesKHR;\n\ntypedef struct VkVideoInlineQueryInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkQueryPool        queryPool;\n    uint32_t           firstQuery;\n    uint32_t           queryCount;\n} VkVideoInlineQueryInfoKHR;\n\n\n\n// VK_KHR_vertex_attribute_divisor is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_vertex_attribute_divisor 1\n#define VK_KHR_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION 1\n#define VK_KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME \"VK_KHR_vertex_attribute_divisor\"\ntypedef VkPhysicalDeviceVertexAttributeDivisorProperties VkPhysicalDeviceVertexAttributeDivisorPropertiesKHR;\n\ntypedef VkVertexInputBindingDivisorDescription VkVertexInputBindingDivisorDescriptionKHR;\n\ntypedef VkPipelineVertexInputDivisorStateCreateInfo VkPipelineVertexInputDivisorStateCreateInfoKHR;\n\ntypedef VkPhysicalDeviceVertexAttributeDivisorFeatures VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR;\n\n\n\n// VK_KHR_load_store_op_none is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_load_store_op_none 1\n#define VK_KHR_LOAD_STORE_OP_NONE_SPEC_VERSION 1\n#define VK_KHR_LOAD_STORE_OP_NONE_EXTENSION_NAME \"VK_KHR_load_store_op_none\"\n\n\n// VK_KHR_shader_float_controls2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_shader_float_controls2 1\n#define VK_KHR_SHADER_FLOAT_CONTROLS_2_SPEC_VERSION 1\n#define VK_KHR_SHADER_FLOAT_CONTROLS_2_EXTENSION_NAME \"VK_KHR_shader_float_controls2\"\ntypedef VkPhysicalDeviceShaderFloatControls2Features VkPhysicalDeviceShaderFloatControls2FeaturesKHR;\n\n\n\n// VK_KHR_index_type_uint8 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_index_type_uint8 1\n#define VK_KHR_INDEX_TYPE_UINT8_SPEC_VERSION 1\n#define VK_KHR_INDEX_TYPE_UINT8_EXTENSION_NAME \"VK_KHR_index_type_uint8\"\ntypedef VkPhysicalDeviceIndexTypeUint8Features VkPhysicalDeviceIndexTypeUint8FeaturesKHR;\n\n\n\n// VK_KHR_line_rasterization is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_line_rasterization 1\n#define VK_KHR_LINE_RASTERIZATION_SPEC_VERSION 1\n#define VK_KHR_LINE_RASTERIZATION_EXTENSION_NAME \"VK_KHR_line_rasterization\"\ntypedef VkLineRasterizationMode VkLineRasterizationModeKHR;\n\ntypedef VkPhysicalDeviceLineRasterizationFeatures VkPhysicalDeviceLineRasterizationFeaturesKHR;\n\ntypedef VkPhysicalDeviceLineRasterizationProperties VkPhysicalDeviceLineRasterizationPropertiesKHR;\n\ntypedef VkPipelineRasterizationLineStateCreateInfo VkPipelineRasterizationLineStateCreateInfoKHR;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdSetLineStippleKHR)(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, uint16_t lineStipplePattern);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdSetLineStippleKHR(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    lineStippleFactor,\n    uint16_t                                    lineStipplePattern);\n#endif\n\n\n// VK_KHR_calibrated_timestamps is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_calibrated_timestamps 1\n#define VK_KHR_CALIBRATED_TIMESTAMPS_SPEC_VERSION 1\n#define VK_KHR_CALIBRATED_TIMESTAMPS_EXTENSION_NAME \"VK_KHR_calibrated_timestamps\"\n\ntypedef enum VkTimeDomainKHR {\n    VK_TIME_DOMAIN_DEVICE_KHR = 0,\n    VK_TIME_DOMAIN_CLOCK_MONOTONIC_KHR = 1,\n    VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_KHR = 2,\n    VK_TIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_KHR = 3,\n    VK_TIME_DOMAIN_DEVICE_EXT = VK_TIME_DOMAIN_DEVICE_KHR,\n    VK_TIME_DOMAIN_CLOCK_MONOTONIC_EXT = VK_TIME_DOMAIN_CLOCK_MONOTONIC_KHR,\n    VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT = VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_KHR,\n    VK_TIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_EXT = VK_TIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_KHR,\n    VK_TIME_DOMAIN_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkTimeDomainKHR;\ntypedef struct VkCalibratedTimestampInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkTimeDomainKHR    timeDomain;\n} VkCalibratedTimestampInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsKHR)(VkPhysicalDevice physicalDevice, uint32_t* pTimeDomainCount, VkTimeDomainKHR* pTimeDomains);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetCalibratedTimestampsKHR)(VkDevice device, uint32_t timestampCount, const VkCalibratedTimestampInfoKHR* pTimestampInfos, uint64_t* pTimestamps, uint64_t* pMaxDeviation);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceCalibrateableTimeDomainsKHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t*                                   pTimeDomainCount,\n    VkTimeDomainKHR*                            pTimeDomains);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetCalibratedTimestampsKHR(\n    VkDevice                                    device,\n    uint32_t                                    timestampCount,\n    const VkCalibratedTimestampInfoKHR*         pTimestampInfos,\n    uint64_t*                                   pTimestamps,\n    uint64_t*                                   pMaxDeviation);\n#endif\n\n\n// VK_KHR_shader_expect_assume is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_shader_expect_assume 1\n#define VK_KHR_SHADER_EXPECT_ASSUME_SPEC_VERSION 1\n#define VK_KHR_SHADER_EXPECT_ASSUME_EXTENSION_NAME \"VK_KHR_shader_expect_assume\"\ntypedef VkPhysicalDeviceShaderExpectAssumeFeatures VkPhysicalDeviceShaderExpectAssumeFeaturesKHR;\n\n\n\n// VK_KHR_maintenance6 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_maintenance6 1\n#define VK_KHR_MAINTENANCE_6_SPEC_VERSION 1\n#define VK_KHR_MAINTENANCE_6_EXTENSION_NAME \"VK_KHR_maintenance6\"\ntypedef VkPhysicalDeviceMaintenance6Features VkPhysicalDeviceMaintenance6FeaturesKHR;\n\ntypedef VkPhysicalDeviceMaintenance6Properties VkPhysicalDeviceMaintenance6PropertiesKHR;\n\ntypedef VkBindMemoryStatus VkBindMemoryStatusKHR;\n\ntypedef VkBindDescriptorSetsInfo VkBindDescriptorSetsInfoKHR;\n\ntypedef VkPushConstantsInfo VkPushConstantsInfoKHR;\n\ntypedef VkPushDescriptorSetInfo VkPushDescriptorSetInfoKHR;\n\ntypedef VkPushDescriptorSetWithTemplateInfo VkPushDescriptorSetWithTemplateInfoKHR;\n\ntypedef struct VkSetDescriptorBufferOffsetsInfoEXT {\n    VkStructureType        sType;\n    const void*            pNext;\n    VkShaderStageFlags     stageFlags;\n    VkPipelineLayout       layout;\n    uint32_t               firstSet;\n    uint32_t               setCount;\n    const uint32_t*        pBufferIndices;\n    const VkDeviceSize*    pOffsets;\n} VkSetDescriptorBufferOffsetsInfoEXT;\n\ntypedef struct VkBindDescriptorBufferEmbeddedSamplersInfoEXT {\n    VkStructureType       sType;\n    const void*           pNext;\n    VkShaderStageFlags    stageFlags;\n    VkPipelineLayout      layout;\n    uint32_t              set;\n} VkBindDescriptorBufferEmbeddedSamplersInfoEXT;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdBindDescriptorSets2KHR)(VkCommandBuffer commandBuffer, const VkBindDescriptorSetsInfo*   pBindDescriptorSetsInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdPushConstants2KHR)(VkCommandBuffer commandBuffer, const VkPushConstantsInfo*        pPushConstantsInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSet2KHR)(VkCommandBuffer commandBuffer, const VkPushDescriptorSetInfo*    pPushDescriptorSetInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSetWithTemplate2KHR)(VkCommandBuffer commandBuffer, const VkPushDescriptorSetWithTemplateInfo* pPushDescriptorSetWithTemplateInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDescriptorBufferOffsets2EXT)(VkCommandBuffer commandBuffer, const VkSetDescriptorBufferOffsetsInfoEXT* pSetDescriptorBufferOffsetsInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdBindDescriptorBufferEmbeddedSamplers2EXT)(VkCommandBuffer commandBuffer, const VkBindDescriptorBufferEmbeddedSamplersInfoEXT* pBindDescriptorBufferEmbeddedSamplersInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorSets2KHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkBindDescriptorSetsInfo*             pBindDescriptorSetsInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdPushConstants2KHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkPushConstantsInfo*                  pPushConstantsInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSet2KHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkPushDescriptorSetInfo*              pPushDescriptorSetInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSetWithTemplate2KHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkPushDescriptorSetWithTemplateInfo*  pPushDescriptorSetWithTemplateInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDescriptorBufferOffsets2EXT(\n    VkCommandBuffer                             commandBuffer,\n    const VkSetDescriptorBufferOffsetsInfoEXT*  pSetDescriptorBufferOffsetsInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorBufferEmbeddedSamplers2EXT(\n    VkCommandBuffer                             commandBuffer,\n    const VkBindDescriptorBufferEmbeddedSamplersInfoEXT* pBindDescriptorBufferEmbeddedSamplersInfo);\n#endif\n\n\n// VK_KHR_video_encode_quantization_map is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_video_encode_quantization_map 1\n#define VK_KHR_VIDEO_ENCODE_QUANTIZATION_MAP_SPEC_VERSION 2\n#define VK_KHR_VIDEO_ENCODE_QUANTIZATION_MAP_EXTENSION_NAME \"VK_KHR_video_encode_quantization_map\"\ntypedef struct VkVideoEncodeQuantizationMapCapabilitiesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkExtent2D         maxQuantizationMapExtent;\n} VkVideoEncodeQuantizationMapCapabilitiesKHR;\n\ntypedef struct VkVideoFormatQuantizationMapPropertiesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkExtent2D         quantizationMapTexelSize;\n} VkVideoFormatQuantizationMapPropertiesKHR;\n\ntypedef struct VkVideoEncodeQuantizationMapInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkImageView        quantizationMap;\n    VkExtent2D         quantizationMapExtent;\n} VkVideoEncodeQuantizationMapInfoKHR;\n\ntypedef struct VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkExtent2D         quantizationMapTexelSize;\n} VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR;\n\ntypedef struct VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           videoEncodeQuantizationMap;\n} VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR;\n\ntypedef struct VkVideoEncodeH264QuantizationMapCapabilitiesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    int32_t            minQpDelta;\n    int32_t            maxQpDelta;\n} VkVideoEncodeH264QuantizationMapCapabilitiesKHR;\n\ntypedef struct VkVideoEncodeH265QuantizationMapCapabilitiesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    int32_t            minQpDelta;\n    int32_t            maxQpDelta;\n} VkVideoEncodeH265QuantizationMapCapabilitiesKHR;\n\ntypedef struct VkVideoFormatH265QuantizationMapPropertiesKHR {\n    VkStructureType                     sType;\n    void*                               pNext;\n    VkVideoEncodeH265CtbSizeFlagsKHR    compatibleCtbSizes;\n} VkVideoFormatH265QuantizationMapPropertiesKHR;\n\ntypedef struct VkVideoEncodeAV1QuantizationMapCapabilitiesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    int32_t            minQIndexDelta;\n    int32_t            maxQIndexDelta;\n} VkVideoEncodeAV1QuantizationMapCapabilitiesKHR;\n\ntypedef struct VkVideoFormatAV1QuantizationMapPropertiesKHR {\n    VkStructureType                           sType;\n    void*                                     pNext;\n    VkVideoEncodeAV1SuperblockSizeFlagsKHR    compatibleSuperblockSizes;\n} VkVideoFormatAV1QuantizationMapPropertiesKHR;\n\n\n\n// VK_KHR_shader_relaxed_extended_instruction is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_shader_relaxed_extended_instruction 1\n#define VK_KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_SPEC_VERSION 1\n#define VK_KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_EXTENSION_NAME \"VK_KHR_shader_relaxed_extended_instruction\"\ntypedef struct VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderRelaxedExtendedInstruction;\n} VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR;\n\n\n\n// VK_KHR_maintenance7 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_maintenance7 1\n#define VK_KHR_MAINTENANCE_7_SPEC_VERSION 1\n#define VK_KHR_MAINTENANCE_7_EXTENSION_NAME \"VK_KHR_maintenance7\"\n\ntypedef enum VkPhysicalDeviceLayeredApiKHR {\n    VK_PHYSICAL_DEVICE_LAYERED_API_VULKAN_KHR = 0,\n    VK_PHYSICAL_DEVICE_LAYERED_API_D3D12_KHR = 1,\n    VK_PHYSICAL_DEVICE_LAYERED_API_METAL_KHR = 2,\n    VK_PHYSICAL_DEVICE_LAYERED_API_OPENGL_KHR = 3,\n    VK_PHYSICAL_DEVICE_LAYERED_API_OPENGLES_KHR = 4,\n    VK_PHYSICAL_DEVICE_LAYERED_API_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkPhysicalDeviceLayeredApiKHR;\ntypedef struct VkPhysicalDeviceMaintenance7FeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           maintenance7;\n} VkPhysicalDeviceMaintenance7FeaturesKHR;\n\ntypedef struct VkPhysicalDeviceMaintenance7PropertiesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           robustFragmentShadingRateAttachmentAccess;\n    VkBool32           separateDepthStencilAttachmentAccess;\n    uint32_t           maxDescriptorSetTotalUniformBuffersDynamic;\n    uint32_t           maxDescriptorSetTotalStorageBuffersDynamic;\n    uint32_t           maxDescriptorSetTotalBuffersDynamic;\n    uint32_t           maxDescriptorSetUpdateAfterBindTotalUniformBuffersDynamic;\n    uint32_t           maxDescriptorSetUpdateAfterBindTotalStorageBuffersDynamic;\n    uint32_t           maxDescriptorSetUpdateAfterBindTotalBuffersDynamic;\n} VkPhysicalDeviceMaintenance7PropertiesKHR;\n\ntypedef struct VkPhysicalDeviceLayeredApiPropertiesKHR {\n    VkStructureType                  sType;\n    void*                            pNext;\n    uint32_t                         vendorID;\n    uint32_t                         deviceID;\n    VkPhysicalDeviceLayeredApiKHR    layeredAPI;\n    char                             deviceName[VK_MAX_PHYSICAL_DEVICE_NAME_SIZE];\n} VkPhysicalDeviceLayeredApiPropertiesKHR;\n\ntypedef struct VkPhysicalDeviceLayeredApiPropertiesListKHR {\n    VkStructureType                             sType;\n    void*                                       pNext;\n    uint32_t                                    layeredApiCount;\n    VkPhysicalDeviceLayeredApiPropertiesKHR*    pLayeredApis;\n} VkPhysicalDeviceLayeredApiPropertiesListKHR;\n\ntypedef struct VkPhysicalDeviceLayeredApiVulkanPropertiesKHR {\n    VkStructureType                sType;\n    void*                          pNext;\n    VkPhysicalDeviceProperties2    properties;\n} VkPhysicalDeviceLayeredApiVulkanPropertiesKHR;\n\n\n\n// VK_KHR_maintenance8 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_maintenance8 1\n#define VK_KHR_MAINTENANCE_8_SPEC_VERSION 1\n#define VK_KHR_MAINTENANCE_8_EXTENSION_NAME \"VK_KHR_maintenance8\"\ntypedef VkFlags64 VkAccessFlags3KHR;\n\n// Flag bits for VkAccessFlagBits3KHR\ntypedef VkFlags64 VkAccessFlagBits3KHR;\nstatic const VkAccessFlagBits3KHR VK_ACCESS_3_NONE_KHR = 0ULL;\n\ntypedef struct VkPhysicalDeviceMaintenance8FeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           maintenance8;\n} VkPhysicalDeviceMaintenance8FeaturesKHR;\n\ntypedef struct VkMemoryBarrierAccessFlags3KHR {\n    VkStructureType      sType;\n    const void*          pNext;\n    VkAccessFlags3KHR    srcAccessMask3;\n    VkAccessFlags3KHR    dstAccessMask3;\n} VkMemoryBarrierAccessFlags3KHR;\n\n\n\n// VK_KHR_video_maintenance2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_video_maintenance2 1\n#define VK_KHR_VIDEO_MAINTENANCE_2_SPEC_VERSION 1\n#define VK_KHR_VIDEO_MAINTENANCE_2_EXTENSION_NAME \"VK_KHR_video_maintenance2\"\ntypedef struct VkPhysicalDeviceVideoMaintenance2FeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           videoMaintenance2;\n} VkPhysicalDeviceVideoMaintenance2FeaturesKHR;\n\ntypedef struct VkVideoDecodeH264InlineSessionParametersInfoKHR {\n    VkStructureType                            sType;\n    const void*                                pNext;\n    const StdVideoH264SequenceParameterSet*    pStdSPS;\n    const StdVideoH264PictureParameterSet*     pStdPPS;\n} VkVideoDecodeH264InlineSessionParametersInfoKHR;\n\ntypedef struct VkVideoDecodeH265InlineSessionParametersInfoKHR {\n    VkStructureType                            sType;\n    const void*                                pNext;\n    const StdVideoH265VideoParameterSet*       pStdVPS;\n    const StdVideoH265SequenceParameterSet*    pStdSPS;\n    const StdVideoH265PictureParameterSet*     pStdPPS;\n} VkVideoDecodeH265InlineSessionParametersInfoKHR;\n\ntypedef struct VkVideoDecodeAV1InlineSessionParametersInfoKHR {\n    VkStructureType                     sType;\n    const void*                         pNext;\n    const StdVideoAV1SequenceHeader*    pStdSequenceHeader;\n} VkVideoDecodeAV1InlineSessionParametersInfoKHR;\n\n\n\n// VK_KHR_depth_clamp_zero_one is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_depth_clamp_zero_one 1\n#define VK_KHR_DEPTH_CLAMP_ZERO_ONE_SPEC_VERSION 1\n#define VK_KHR_DEPTH_CLAMP_ZERO_ONE_EXTENSION_NAME \"VK_KHR_depth_clamp_zero_one\"\ntypedef struct VkPhysicalDeviceDepthClampZeroOneFeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           depthClampZeroOne;\n} VkPhysicalDeviceDepthClampZeroOneFeaturesKHR;\n\n\n\n// VK_EXT_debug_report is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_debug_report 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDebugReportCallbackEXT)\n#define VK_EXT_DEBUG_REPORT_SPEC_VERSION  10\n#define VK_EXT_DEBUG_REPORT_EXTENSION_NAME \"VK_EXT_debug_report\"\n\ntypedef enum VkDebugReportObjectTypeEXT {\n    VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT = 0,\n    VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT = 1,\n    VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT = 2,\n    VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT = 3,\n    VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT = 4,\n    VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT = 5,\n    VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT = 6,\n    VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT = 7,\n    VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT = 8,\n    VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT = 9,\n    VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT = 10,\n    VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT = 11,\n    VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT = 12,\n    VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT = 13,\n    VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT = 14,\n    VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT = 15,\n    VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT = 16,\n    VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT = 17,\n    VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT = 18,\n    VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT = 19,\n    VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT = 20,\n    VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT = 21,\n    VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT = 22,\n    VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT = 23,\n    VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT = 24,\n    VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT = 25,\n    VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT = 26,\n    VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT = 27,\n    VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT_EXT = 28,\n    VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT = 29,\n    VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_MODE_KHR_EXT = 30,\n    VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT = 33,\n    VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_EXT = 1000156000,\n    VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_EXT = 1000085000,\n    VK_DEBUG_REPORT_OBJECT_TYPE_CU_MODULE_NVX_EXT = 1000029000,\n    VK_DEBUG_REPORT_OBJECT_TYPE_CU_FUNCTION_NVX_EXT = 1000029001,\n    VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR_EXT = 1000150000,\n    VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV_EXT = 1000165000,\n    VK_DEBUG_REPORT_OBJECT_TYPE_CUDA_MODULE_NV_EXT = 1000307000,\n    VK_DEBUG_REPORT_OBJECT_TYPE_CUDA_FUNCTION_NV_EXT = 1000307001,\n    VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_COLLECTION_FUCHSIA_EXT = 1000366000,\n  // VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT is a deprecated alias\n    VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT_EXT,\n  // VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT is a deprecated alias\n    VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT,\n    VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_EXT,\n    VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_KHR_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_EXT,\n    VK_DEBUG_REPORT_OBJECT_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkDebugReportObjectTypeEXT;\n\ntypedef enum VkDebugReportFlagBitsEXT {\n    VK_DEBUG_REPORT_INFORMATION_BIT_EXT = 0x00000001,\n    VK_DEBUG_REPORT_WARNING_BIT_EXT = 0x00000002,\n    VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT = 0x00000004,\n    VK_DEBUG_REPORT_ERROR_BIT_EXT = 0x00000008,\n    VK_DEBUG_REPORT_DEBUG_BIT_EXT = 0x00000010,\n    VK_DEBUG_REPORT_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkDebugReportFlagBitsEXT;\ntypedef VkFlags VkDebugReportFlagsEXT;\ntypedef VkBool32 (VKAPI_PTR *PFN_vkDebugReportCallbackEXT)(\n    VkDebugReportFlagsEXT                       flags,\n    VkDebugReportObjectTypeEXT                  objectType,\n    uint64_t                                    object,\n    size_t                                      location,\n    int32_t                                     messageCode,\n    const char*                                 pLayerPrefix,\n    const char*                                 pMessage,\n    void*                                       pUserData);\n\ntypedef struct VkDebugReportCallbackCreateInfoEXT {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    VkDebugReportFlagsEXT           flags;\n    PFN_vkDebugReportCallbackEXT    pfnCallback;\n    void*                           pUserData;\n} VkDebugReportCallbackCreateInfoEXT;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateDebugReportCallbackEXT)(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugReportCallbackEXT* pCallback);\ntypedef void (VKAPI_PTR *PFN_vkDestroyDebugReportCallbackEXT)(VkInstance instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks* pAllocator);\ntypedef void (VKAPI_PTR *PFN_vkDebugReportMessageEXT)(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, int32_t messageCode, const char* pLayerPrefix, const char* pMessage);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(\n    VkInstance                                  instance,\n    const VkDebugReportCallbackCreateInfoEXT*   pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkDebugReportCallbackEXT*                   pCallback);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(\n    VkInstance                                  instance,\n    VkDebugReportCallbackEXT                    callback,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(\n    VkInstance                                  instance,\n    VkDebugReportFlagsEXT                       flags,\n    VkDebugReportObjectTypeEXT                  objectType,\n    uint64_t                                    object,\n    size_t                                      location,\n    int32_t                                     messageCode,\n    const char*                                 pLayerPrefix,\n    const char*                                 pMessage);\n#endif\n\n\n// VK_NV_glsl_shader is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_glsl_shader 1\n#define VK_NV_GLSL_SHADER_SPEC_VERSION    1\n#define VK_NV_GLSL_SHADER_EXTENSION_NAME  \"VK_NV_glsl_shader\"\n\n\n// VK_EXT_depth_range_unrestricted is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_depth_range_unrestricted 1\n#define VK_EXT_DEPTH_RANGE_UNRESTRICTED_SPEC_VERSION 1\n#define VK_EXT_DEPTH_RANGE_UNRESTRICTED_EXTENSION_NAME \"VK_EXT_depth_range_unrestricted\"\n\n\n// VK_IMG_filter_cubic is a preprocessor guard. Do not pass it to API calls.\n#define VK_IMG_filter_cubic 1\n#define VK_IMG_FILTER_CUBIC_SPEC_VERSION  1\n#define VK_IMG_FILTER_CUBIC_EXTENSION_NAME \"VK_IMG_filter_cubic\"\n\n\n// VK_AMD_rasterization_order is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMD_rasterization_order 1\n#define VK_AMD_RASTERIZATION_ORDER_SPEC_VERSION 1\n#define VK_AMD_RASTERIZATION_ORDER_EXTENSION_NAME \"VK_AMD_rasterization_order\"\n\ntypedef enum VkRasterizationOrderAMD {\n    VK_RASTERIZATION_ORDER_STRICT_AMD = 0,\n    VK_RASTERIZATION_ORDER_RELAXED_AMD = 1,\n    VK_RASTERIZATION_ORDER_MAX_ENUM_AMD = 0x7FFFFFFF\n} VkRasterizationOrderAMD;\ntypedef struct VkPipelineRasterizationStateRasterizationOrderAMD {\n    VkStructureType            sType;\n    const void*                pNext;\n    VkRasterizationOrderAMD    rasterizationOrder;\n} VkPipelineRasterizationStateRasterizationOrderAMD;\n\n\n\n// VK_AMD_shader_trinary_minmax is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMD_shader_trinary_minmax 1\n#define VK_AMD_SHADER_TRINARY_MINMAX_SPEC_VERSION 1\n#define VK_AMD_SHADER_TRINARY_MINMAX_EXTENSION_NAME \"VK_AMD_shader_trinary_minmax\"\n\n\n// VK_AMD_shader_explicit_vertex_parameter is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMD_shader_explicit_vertex_parameter 1\n#define VK_AMD_SHADER_EXPLICIT_VERTEX_PARAMETER_SPEC_VERSION 1\n#define VK_AMD_SHADER_EXPLICIT_VERTEX_PARAMETER_EXTENSION_NAME \"VK_AMD_shader_explicit_vertex_parameter\"\n\n\n// VK_EXT_debug_marker is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_debug_marker 1\n#define VK_EXT_DEBUG_MARKER_SPEC_VERSION  4\n#define VK_EXT_DEBUG_MARKER_EXTENSION_NAME \"VK_EXT_debug_marker\"\ntypedef struct VkDebugMarkerObjectNameInfoEXT {\n    VkStructureType               sType;\n    const void*                   pNext;\n    VkDebugReportObjectTypeEXT    objectType;\n    uint64_t                      object;\n    const char*                   pObjectName;\n} VkDebugMarkerObjectNameInfoEXT;\n\ntypedef struct VkDebugMarkerObjectTagInfoEXT {\n    VkStructureType               sType;\n    const void*                   pNext;\n    VkDebugReportObjectTypeEXT    objectType;\n    uint64_t                      object;\n    uint64_t                      tagName;\n    size_t                        tagSize;\n    const void*                   pTag;\n} VkDebugMarkerObjectTagInfoEXT;\n\ntypedef struct VkDebugMarkerMarkerInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    const char*        pMarkerName;\n    float              color[4];\n} VkDebugMarkerMarkerInfoEXT;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkDebugMarkerSetObjectTagEXT)(VkDevice device, const VkDebugMarkerObjectTagInfoEXT* pTagInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkDebugMarkerSetObjectNameEXT)(VkDevice device, const VkDebugMarkerObjectNameInfoEXT* pNameInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdDebugMarkerBeginEXT)(VkCommandBuffer commandBuffer, const VkDebugMarkerMarkerInfoEXT* pMarkerInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdDebugMarkerEndEXT)(VkCommandBuffer commandBuffer);\ntypedef void (VKAPI_PTR *PFN_vkCmdDebugMarkerInsertEXT)(VkCommandBuffer commandBuffer, const VkDebugMarkerMarkerInfoEXT* pMarkerInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkDebugMarkerSetObjectTagEXT(\n    VkDevice                                    device,\n    const VkDebugMarkerObjectTagInfoEXT*        pTagInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkDebugMarkerSetObjectNameEXT(\n    VkDevice                                    device,\n    const VkDebugMarkerObjectNameInfoEXT*       pNameInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDebugMarkerBeginEXT(\n    VkCommandBuffer                             commandBuffer,\n    const VkDebugMarkerMarkerInfoEXT*           pMarkerInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDebugMarkerEndEXT(\n    VkCommandBuffer                             commandBuffer);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDebugMarkerInsertEXT(\n    VkCommandBuffer                             commandBuffer,\n    const VkDebugMarkerMarkerInfoEXT*           pMarkerInfo);\n#endif\n\n\n// VK_AMD_gcn_shader is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMD_gcn_shader 1\n#define VK_AMD_GCN_SHADER_SPEC_VERSION    1\n#define VK_AMD_GCN_SHADER_EXTENSION_NAME  \"VK_AMD_gcn_shader\"\n\n\n// VK_NV_dedicated_allocation is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_dedicated_allocation 1\n#define VK_NV_DEDICATED_ALLOCATION_SPEC_VERSION 1\n#define VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME \"VK_NV_dedicated_allocation\"\ntypedef struct VkDedicatedAllocationImageCreateInfoNV {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           dedicatedAllocation;\n} VkDedicatedAllocationImageCreateInfoNV;\n\ntypedef struct VkDedicatedAllocationBufferCreateInfoNV {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           dedicatedAllocation;\n} VkDedicatedAllocationBufferCreateInfoNV;\n\ntypedef struct VkDedicatedAllocationMemoryAllocateInfoNV {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkImage            image;\n    VkBuffer           buffer;\n} VkDedicatedAllocationMemoryAllocateInfoNV;\n\n\n\n// VK_EXT_transform_feedback is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_transform_feedback 1\n#define VK_EXT_TRANSFORM_FEEDBACK_SPEC_VERSION 1\n#define VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME \"VK_EXT_transform_feedback\"\ntypedef VkFlags VkPipelineRasterizationStateStreamCreateFlagsEXT;\ntypedef struct VkPhysicalDeviceTransformFeedbackFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           transformFeedback;\n    VkBool32           geometryStreams;\n} VkPhysicalDeviceTransformFeedbackFeaturesEXT;\n\ntypedef struct VkPhysicalDeviceTransformFeedbackPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxTransformFeedbackStreams;\n    uint32_t           maxTransformFeedbackBuffers;\n    VkDeviceSize       maxTransformFeedbackBufferSize;\n    uint32_t           maxTransformFeedbackStreamDataSize;\n    uint32_t           maxTransformFeedbackBufferDataSize;\n    uint32_t           maxTransformFeedbackBufferDataStride;\n    VkBool32           transformFeedbackQueries;\n    VkBool32           transformFeedbackStreamsLinesTriangles;\n    VkBool32           transformFeedbackRasterizationStreamSelect;\n    VkBool32           transformFeedbackDraw;\n} VkPhysicalDeviceTransformFeedbackPropertiesEXT;\n\ntypedef struct VkPipelineRasterizationStateStreamCreateInfoEXT {\n    VkStructureType                                     sType;\n    const void*                                         pNext;\n    VkPipelineRasterizationStateStreamCreateFlagsEXT    flags;\n    uint32_t                                            rasterizationStream;\n} VkPipelineRasterizationStateStreamCreateInfoEXT;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdBindTransformFeedbackBuffersEXT)(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets, const VkDeviceSize* pSizes);\ntypedef void (VKAPI_PTR *PFN_vkCmdBeginTransformFeedbackEXT)(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer, uint32_t counterBufferCount, const VkBuffer* pCounterBuffers, const VkDeviceSize* pCounterBufferOffsets);\ntypedef void (VKAPI_PTR *PFN_vkCmdEndTransformFeedbackEXT)(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer, uint32_t counterBufferCount, const VkBuffer* pCounterBuffers, const VkDeviceSize* pCounterBufferOffsets);\ntypedef void (VKAPI_PTR *PFN_vkCmdBeginQueryIndexedEXT)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags, uint32_t index);\ntypedef void (VKAPI_PTR *PFN_vkCmdEndQueryIndexedEXT)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query, uint32_t index);\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawIndirectByteCountEXT)(VkCommandBuffer commandBuffer, uint32_t instanceCount, uint32_t firstInstance, VkBuffer counterBuffer, VkDeviceSize counterBufferOffset, uint32_t counterOffset, uint32_t vertexStride);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdBindTransformFeedbackBuffersEXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    firstBinding,\n    uint32_t                                    bindingCount,\n    const VkBuffer*                             pBuffers,\n    const VkDeviceSize*                         pOffsets,\n    const VkDeviceSize*                         pSizes);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBeginTransformFeedbackEXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    firstCounterBuffer,\n    uint32_t                                    counterBufferCount,\n    const VkBuffer*                             pCounterBuffers,\n    const VkDeviceSize*                         pCounterBufferOffsets);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdEndTransformFeedbackEXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    firstCounterBuffer,\n    uint32_t                                    counterBufferCount,\n    const VkBuffer*                             pCounterBuffers,\n    const VkDeviceSize*                         pCounterBufferOffsets);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBeginQueryIndexedEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkQueryPool                                 queryPool,\n    uint32_t                                    query,\n    VkQueryControlFlags                         flags,\n    uint32_t                                    index);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdEndQueryIndexedEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkQueryPool                                 queryPool,\n    uint32_t                                    query,\n    uint32_t                                    index);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectByteCountEXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    instanceCount,\n    uint32_t                                    firstInstance,\n    VkBuffer                                    counterBuffer,\n    VkDeviceSize                                counterBufferOffset,\n    uint32_t                                    counterOffset,\n    uint32_t                                    vertexStride);\n#endif\n\n\n// VK_NVX_binary_import is a preprocessor guard. Do not pass it to API calls.\n#define VK_NVX_binary_import 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkCuModuleNVX)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkCuFunctionNVX)\n#define VK_NVX_BINARY_IMPORT_SPEC_VERSION 2\n#define VK_NVX_BINARY_IMPORT_EXTENSION_NAME \"VK_NVX_binary_import\"\ntypedef struct VkCuModuleCreateInfoNVX {\n    VkStructureType    sType;\n    const void*        pNext;\n    size_t             dataSize;\n    const void*        pData;\n} VkCuModuleCreateInfoNVX;\n\ntypedef struct VkCuModuleTexturingModeCreateInfoNVX {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           use64bitTexturing;\n} VkCuModuleTexturingModeCreateInfoNVX;\n\ntypedef struct VkCuFunctionCreateInfoNVX {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkCuModuleNVX      module;\n    const char*        pName;\n} VkCuFunctionCreateInfoNVX;\n\ntypedef struct VkCuLaunchInfoNVX {\n    VkStructureType        sType;\n    const void*            pNext;\n    VkCuFunctionNVX        function;\n    uint32_t               gridDimX;\n    uint32_t               gridDimY;\n    uint32_t               gridDimZ;\n    uint32_t               blockDimX;\n    uint32_t               blockDimY;\n    uint32_t               blockDimZ;\n    uint32_t               sharedMemBytes;\n    size_t                 paramCount;\n    const void* const *    pParams;\n    size_t                 extraCount;\n    const void* const *    pExtras;\n} VkCuLaunchInfoNVX;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateCuModuleNVX)(VkDevice device, const VkCuModuleCreateInfoNVX* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkCuModuleNVX* pModule);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateCuFunctionNVX)(VkDevice device, const VkCuFunctionCreateInfoNVX* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkCuFunctionNVX* pFunction);\ntypedef void (VKAPI_PTR *PFN_vkDestroyCuModuleNVX)(VkDevice device, VkCuModuleNVX module, const VkAllocationCallbacks* pAllocator);\ntypedef void (VKAPI_PTR *PFN_vkDestroyCuFunctionNVX)(VkDevice device, VkCuFunctionNVX function, const VkAllocationCallbacks* pAllocator);\ntypedef void (VKAPI_PTR *PFN_vkCmdCuLaunchKernelNVX)(VkCommandBuffer commandBuffer, const VkCuLaunchInfoNVX* pLaunchInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateCuModuleNVX(\n    VkDevice                                    device,\n    const VkCuModuleCreateInfoNVX*              pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkCuModuleNVX*                              pModule);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateCuFunctionNVX(\n    VkDevice                                    device,\n    const VkCuFunctionCreateInfoNVX*            pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkCuFunctionNVX*                            pFunction);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyCuModuleNVX(\n    VkDevice                                    device,\n    VkCuModuleNVX                               module,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyCuFunctionNVX(\n    VkDevice                                    device,\n    VkCuFunctionNVX                             function,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCuLaunchKernelNVX(\n    VkCommandBuffer                             commandBuffer,\n    const VkCuLaunchInfoNVX*                    pLaunchInfo);\n#endif\n\n\n// VK_NVX_image_view_handle is a preprocessor guard. Do not pass it to API calls.\n#define VK_NVX_image_view_handle 1\n#define VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION 3\n#define VK_NVX_IMAGE_VIEW_HANDLE_EXTENSION_NAME \"VK_NVX_image_view_handle\"\ntypedef struct VkImageViewHandleInfoNVX {\n    VkStructureType     sType;\n    const void*         pNext;\n    VkImageView         imageView;\n    VkDescriptorType    descriptorType;\n    VkSampler           sampler;\n} VkImageViewHandleInfoNVX;\n\ntypedef struct VkImageViewAddressPropertiesNVX {\n    VkStructureType    sType;\n    void*              pNext;\n    VkDeviceAddress    deviceAddress;\n    VkDeviceSize       size;\n} VkImageViewAddressPropertiesNVX;\n\ntypedef uint32_t (VKAPI_PTR *PFN_vkGetImageViewHandleNVX)(VkDevice device, const VkImageViewHandleInfoNVX* pInfo);\ntypedef uint64_t (VKAPI_PTR *PFN_vkGetImageViewHandle64NVX)(VkDevice device, const VkImageViewHandleInfoNVX* pInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetImageViewAddressNVX)(VkDevice device, VkImageView imageView, VkImageViewAddressPropertiesNVX* pProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR uint32_t VKAPI_CALL vkGetImageViewHandleNVX(\n    VkDevice                                    device,\n    const VkImageViewHandleInfoNVX*             pInfo);\n\nVKAPI_ATTR uint64_t VKAPI_CALL vkGetImageViewHandle64NVX(\n    VkDevice                                    device,\n    const VkImageViewHandleInfoNVX*             pInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetImageViewAddressNVX(\n    VkDevice                                    device,\n    VkImageView                                 imageView,\n    VkImageViewAddressPropertiesNVX*            pProperties);\n#endif\n\n\n// VK_AMD_draw_indirect_count is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMD_draw_indirect_count 1\n#define VK_AMD_DRAW_INDIRECT_COUNT_SPEC_VERSION 2\n#define VK_AMD_DRAW_INDIRECT_COUNT_EXTENSION_NAME \"VK_AMD_draw_indirect_count\"\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawIndirectCountAMD)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride);\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawIndexedIndirectCountAMD)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectCountAMD(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    buffer,\n    VkDeviceSize                                offset,\n    VkBuffer                                    countBuffer,\n    VkDeviceSize                                countBufferOffset,\n    uint32_t                                    maxDrawCount,\n    uint32_t                                    stride);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirectCountAMD(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    buffer,\n    VkDeviceSize                                offset,\n    VkBuffer                                    countBuffer,\n    VkDeviceSize                                countBufferOffset,\n    uint32_t                                    maxDrawCount,\n    uint32_t                                    stride);\n#endif\n\n\n// VK_AMD_negative_viewport_height is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMD_negative_viewport_height 1\n#define VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_SPEC_VERSION 1\n#define VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_EXTENSION_NAME \"VK_AMD_negative_viewport_height\"\n\n\n// VK_AMD_gpu_shader_half_float is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMD_gpu_shader_half_float 1\n#define VK_AMD_GPU_SHADER_HALF_FLOAT_SPEC_VERSION 2\n#define VK_AMD_GPU_SHADER_HALF_FLOAT_EXTENSION_NAME \"VK_AMD_gpu_shader_half_float\"\n\n\n// VK_AMD_shader_ballot is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMD_shader_ballot 1\n#define VK_AMD_SHADER_BALLOT_SPEC_VERSION 1\n#define VK_AMD_SHADER_BALLOT_EXTENSION_NAME \"VK_AMD_shader_ballot\"\n\n\n// VK_AMD_texture_gather_bias_lod is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMD_texture_gather_bias_lod 1\n#define VK_AMD_TEXTURE_GATHER_BIAS_LOD_SPEC_VERSION 1\n#define VK_AMD_TEXTURE_GATHER_BIAS_LOD_EXTENSION_NAME \"VK_AMD_texture_gather_bias_lod\"\ntypedef struct VkTextureLODGatherFormatPropertiesAMD {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           supportsTextureGatherLODBiasAMD;\n} VkTextureLODGatherFormatPropertiesAMD;\n\n\n\n// VK_AMD_shader_info is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMD_shader_info 1\n#define VK_AMD_SHADER_INFO_SPEC_VERSION   1\n#define VK_AMD_SHADER_INFO_EXTENSION_NAME \"VK_AMD_shader_info\"\n\ntypedef enum VkShaderInfoTypeAMD {\n    VK_SHADER_INFO_TYPE_STATISTICS_AMD = 0,\n    VK_SHADER_INFO_TYPE_BINARY_AMD = 1,\n    VK_SHADER_INFO_TYPE_DISASSEMBLY_AMD = 2,\n    VK_SHADER_INFO_TYPE_MAX_ENUM_AMD = 0x7FFFFFFF\n} VkShaderInfoTypeAMD;\ntypedef struct VkShaderResourceUsageAMD {\n    uint32_t    numUsedVgprs;\n    uint32_t    numUsedSgprs;\n    uint32_t    ldsSizePerLocalWorkGroup;\n    size_t      ldsUsageSizeInBytes;\n    size_t      scratchMemUsageInBytes;\n} VkShaderResourceUsageAMD;\n\ntypedef struct VkShaderStatisticsInfoAMD {\n    VkShaderStageFlags          shaderStageMask;\n    VkShaderResourceUsageAMD    resourceUsage;\n    uint32_t                    numPhysicalVgprs;\n    uint32_t                    numPhysicalSgprs;\n    uint32_t                    numAvailableVgprs;\n    uint32_t                    numAvailableSgprs;\n    uint32_t                    computeWorkGroupSize[3];\n} VkShaderStatisticsInfoAMD;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetShaderInfoAMD)(VkDevice device, VkPipeline pipeline, VkShaderStageFlagBits shaderStage, VkShaderInfoTypeAMD infoType, size_t* pInfoSize, void* pInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetShaderInfoAMD(\n    VkDevice                                    device,\n    VkPipeline                                  pipeline,\n    VkShaderStageFlagBits                       shaderStage,\n    VkShaderInfoTypeAMD                         infoType,\n    size_t*                                     pInfoSize,\n    void*                                       pInfo);\n#endif\n\n\n// VK_AMD_shader_image_load_store_lod is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMD_shader_image_load_store_lod 1\n#define VK_AMD_SHADER_IMAGE_LOAD_STORE_LOD_SPEC_VERSION 1\n#define VK_AMD_SHADER_IMAGE_LOAD_STORE_LOD_EXTENSION_NAME \"VK_AMD_shader_image_load_store_lod\"\n\n\n// VK_NV_corner_sampled_image is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_corner_sampled_image 1\n#define VK_NV_CORNER_SAMPLED_IMAGE_SPEC_VERSION 2\n#define VK_NV_CORNER_SAMPLED_IMAGE_EXTENSION_NAME \"VK_NV_corner_sampled_image\"\ntypedef struct VkPhysicalDeviceCornerSampledImageFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           cornerSampledImage;\n} VkPhysicalDeviceCornerSampledImageFeaturesNV;\n\n\n\n// VK_IMG_format_pvrtc is a preprocessor guard. Do not pass it to API calls.\n#define VK_IMG_format_pvrtc 1\n#define VK_IMG_FORMAT_PVRTC_SPEC_VERSION  1\n#define VK_IMG_FORMAT_PVRTC_EXTENSION_NAME \"VK_IMG_format_pvrtc\"\n\n\n// VK_NV_external_memory_capabilities is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_external_memory_capabilities 1\n#define VK_NV_EXTERNAL_MEMORY_CAPABILITIES_SPEC_VERSION 1\n#define VK_NV_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME \"VK_NV_external_memory_capabilities\"\n\ntypedef enum VkExternalMemoryHandleTypeFlagBitsNV {\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_NV = 0x00000001,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_NV = 0x00000002,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_IMAGE_BIT_NV = 0x00000004,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_IMAGE_KMT_BIT_NV = 0x00000008,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_FLAG_BITS_MAX_ENUM_NV = 0x7FFFFFFF\n} VkExternalMemoryHandleTypeFlagBitsNV;\ntypedef VkFlags VkExternalMemoryHandleTypeFlagsNV;\n\ntypedef enum VkExternalMemoryFeatureFlagBitsNV {\n    VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_NV = 0x00000001,\n    VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_NV = 0x00000002,\n    VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_NV = 0x00000004,\n    VK_EXTERNAL_MEMORY_FEATURE_FLAG_BITS_MAX_ENUM_NV = 0x7FFFFFFF\n} VkExternalMemoryFeatureFlagBitsNV;\ntypedef VkFlags VkExternalMemoryFeatureFlagsNV;\ntypedef struct VkExternalImageFormatPropertiesNV {\n    VkImageFormatProperties              imageFormatProperties;\n    VkExternalMemoryFeatureFlagsNV       externalMemoryFeatures;\n    VkExternalMemoryHandleTypeFlagsNV    exportFromImportedHandleTypes;\n    VkExternalMemoryHandleTypeFlagsNV    compatibleHandleTypes;\n} VkExternalImageFormatPropertiesNV;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV)(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType, VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceExternalImageFormatPropertiesNV(\n    VkPhysicalDevice                            physicalDevice,\n    VkFormat                                    format,\n    VkImageType                                 type,\n    VkImageTiling                               tiling,\n    VkImageUsageFlags                           usage,\n    VkImageCreateFlags                          flags,\n    VkExternalMemoryHandleTypeFlagsNV           externalHandleType,\n    VkExternalImageFormatPropertiesNV*          pExternalImageFormatProperties);\n#endif\n\n\n// VK_NV_external_memory is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_external_memory 1\n#define VK_NV_EXTERNAL_MEMORY_SPEC_VERSION 1\n#define VK_NV_EXTERNAL_MEMORY_EXTENSION_NAME \"VK_NV_external_memory\"\ntypedef struct VkExternalMemoryImageCreateInfoNV {\n    VkStructureType                      sType;\n    const void*                          pNext;\n    VkExternalMemoryHandleTypeFlagsNV    handleTypes;\n} VkExternalMemoryImageCreateInfoNV;\n\ntypedef struct VkExportMemoryAllocateInfoNV {\n    VkStructureType                      sType;\n    const void*                          pNext;\n    VkExternalMemoryHandleTypeFlagsNV    handleTypes;\n} VkExportMemoryAllocateInfoNV;\n\n\n\n// VK_EXT_validation_flags is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_validation_flags 1\n#define VK_EXT_VALIDATION_FLAGS_SPEC_VERSION 3\n#define VK_EXT_VALIDATION_FLAGS_EXTENSION_NAME \"VK_EXT_validation_flags\"\n\ntypedef enum VkValidationCheckEXT {\n    VK_VALIDATION_CHECK_ALL_EXT = 0,\n    VK_VALIDATION_CHECK_SHADERS_EXT = 1,\n    VK_VALIDATION_CHECK_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkValidationCheckEXT;\ntypedef struct VkValidationFlagsEXT {\n    VkStructureType                sType;\n    const void*                    pNext;\n    uint32_t                       disabledValidationCheckCount;\n    const VkValidationCheckEXT*    pDisabledValidationChecks;\n} VkValidationFlagsEXT;\n\n\n\n// VK_EXT_shader_subgroup_ballot is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_shader_subgroup_ballot 1\n#define VK_EXT_SHADER_SUBGROUP_BALLOT_SPEC_VERSION 1\n#define VK_EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME \"VK_EXT_shader_subgroup_ballot\"\n\n\n// VK_EXT_shader_subgroup_vote is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_shader_subgroup_vote 1\n#define VK_EXT_SHADER_SUBGROUP_VOTE_SPEC_VERSION 1\n#define VK_EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME \"VK_EXT_shader_subgroup_vote\"\n\n\n// VK_EXT_texture_compression_astc_hdr is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_texture_compression_astc_hdr 1\n#define VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_SPEC_VERSION 1\n#define VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_EXTENSION_NAME \"VK_EXT_texture_compression_astc_hdr\"\ntypedef VkPhysicalDeviceTextureCompressionASTCHDRFeatures VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT;\n\n\n\n// VK_EXT_astc_decode_mode is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_astc_decode_mode 1\n#define VK_EXT_ASTC_DECODE_MODE_SPEC_VERSION 1\n#define VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME \"VK_EXT_astc_decode_mode\"\ntypedef struct VkImageViewASTCDecodeModeEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkFormat           decodeMode;\n} VkImageViewASTCDecodeModeEXT;\n\ntypedef struct VkPhysicalDeviceASTCDecodeFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           decodeModeSharedExponent;\n} VkPhysicalDeviceASTCDecodeFeaturesEXT;\n\n\n\n// VK_EXT_pipeline_robustness is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_pipeline_robustness 1\n#define VK_EXT_PIPELINE_ROBUSTNESS_SPEC_VERSION 1\n#define VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME \"VK_EXT_pipeline_robustness\"\ntypedef VkPipelineRobustnessBufferBehavior VkPipelineRobustnessBufferBehaviorEXT;\n\ntypedef VkPipelineRobustnessImageBehavior VkPipelineRobustnessImageBehaviorEXT;\n\ntypedef VkPhysicalDevicePipelineRobustnessFeatures VkPhysicalDevicePipelineRobustnessFeaturesEXT;\n\ntypedef VkPhysicalDevicePipelineRobustnessProperties VkPhysicalDevicePipelineRobustnessPropertiesEXT;\n\ntypedef VkPipelineRobustnessCreateInfo VkPipelineRobustnessCreateInfoEXT;\n\n\n\n// VK_EXT_conditional_rendering is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_conditional_rendering 1\n#define VK_EXT_CONDITIONAL_RENDERING_SPEC_VERSION 2\n#define VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME \"VK_EXT_conditional_rendering\"\n\ntypedef enum VkConditionalRenderingFlagBitsEXT {\n    VK_CONDITIONAL_RENDERING_INVERTED_BIT_EXT = 0x00000001,\n    VK_CONDITIONAL_RENDERING_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkConditionalRenderingFlagBitsEXT;\ntypedef VkFlags VkConditionalRenderingFlagsEXT;\ntypedef struct VkConditionalRenderingBeginInfoEXT {\n    VkStructureType                   sType;\n    const void*                       pNext;\n    VkBuffer                          buffer;\n    VkDeviceSize                      offset;\n    VkConditionalRenderingFlagsEXT    flags;\n} VkConditionalRenderingBeginInfoEXT;\n\ntypedef struct VkPhysicalDeviceConditionalRenderingFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           conditionalRendering;\n    VkBool32           inheritedConditionalRendering;\n} VkPhysicalDeviceConditionalRenderingFeaturesEXT;\n\ntypedef struct VkCommandBufferInheritanceConditionalRenderingInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           conditionalRenderingEnable;\n} VkCommandBufferInheritanceConditionalRenderingInfoEXT;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdBeginConditionalRenderingEXT)(VkCommandBuffer commandBuffer, const VkConditionalRenderingBeginInfoEXT* pConditionalRenderingBegin);\ntypedef void (VKAPI_PTR *PFN_vkCmdEndConditionalRenderingEXT)(VkCommandBuffer commandBuffer);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdBeginConditionalRenderingEXT(\n    VkCommandBuffer                             commandBuffer,\n    const VkConditionalRenderingBeginInfoEXT*   pConditionalRenderingBegin);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdEndConditionalRenderingEXT(\n    VkCommandBuffer                             commandBuffer);\n#endif\n\n\n// VK_NV_clip_space_w_scaling is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_clip_space_w_scaling 1\n#define VK_NV_CLIP_SPACE_W_SCALING_SPEC_VERSION 1\n#define VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME \"VK_NV_clip_space_w_scaling\"\ntypedef struct VkViewportWScalingNV {\n    float    xcoeff;\n    float    ycoeff;\n} VkViewportWScalingNV;\n\ntypedef struct VkPipelineViewportWScalingStateCreateInfoNV {\n    VkStructureType                sType;\n    const void*                    pNext;\n    VkBool32                       viewportWScalingEnable;\n    uint32_t                       viewportCount;\n    const VkViewportWScalingNV*    pViewportWScalings;\n} VkPipelineViewportWScalingStateCreateInfoNV;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdSetViewportWScalingNV)(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewportWScalingNV* pViewportWScalings);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdSetViewportWScalingNV(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    firstViewport,\n    uint32_t                                    viewportCount,\n    const VkViewportWScalingNV*                 pViewportWScalings);\n#endif\n\n\n// VK_EXT_direct_mode_display is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_direct_mode_display 1\n#define VK_EXT_DIRECT_MODE_DISPLAY_SPEC_VERSION 1\n#define VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME \"VK_EXT_direct_mode_display\"\ntypedef VkResult (VKAPI_PTR *PFN_vkReleaseDisplayEXT)(VkPhysicalDevice physicalDevice, VkDisplayKHR display);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkReleaseDisplayEXT(\n    VkPhysicalDevice                            physicalDevice,\n    VkDisplayKHR                                display);\n#endif\n\n\n// VK_EXT_display_surface_counter is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_display_surface_counter 1\n#define VK_EXT_DISPLAY_SURFACE_COUNTER_SPEC_VERSION 1\n#define VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME \"VK_EXT_display_surface_counter\"\n\ntypedef enum VkSurfaceCounterFlagBitsEXT {\n    VK_SURFACE_COUNTER_VBLANK_BIT_EXT = 0x00000001,\n  // VK_SURFACE_COUNTER_VBLANK_EXT is a deprecated alias\n    VK_SURFACE_COUNTER_VBLANK_EXT = VK_SURFACE_COUNTER_VBLANK_BIT_EXT,\n    VK_SURFACE_COUNTER_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkSurfaceCounterFlagBitsEXT;\ntypedef VkFlags VkSurfaceCounterFlagsEXT;\ntypedef struct VkSurfaceCapabilities2EXT {\n    VkStructureType                  sType;\n    void*                            pNext;\n    uint32_t                         minImageCount;\n    uint32_t                         maxImageCount;\n    VkExtent2D                       currentExtent;\n    VkExtent2D                       minImageExtent;\n    VkExtent2D                       maxImageExtent;\n    uint32_t                         maxImageArrayLayers;\n    VkSurfaceTransformFlagsKHR       supportedTransforms;\n    VkSurfaceTransformFlagBitsKHR    currentTransform;\n    VkCompositeAlphaFlagsKHR         supportedCompositeAlpha;\n    VkImageUsageFlags                supportedUsageFlags;\n    VkSurfaceCounterFlagsEXT         supportedSurfaceCounters;\n} VkSurfaceCapabilities2EXT;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilities2EXT* pSurfaceCapabilities);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceCapabilities2EXT(\n    VkPhysicalDevice                            physicalDevice,\n    VkSurfaceKHR                                surface,\n    VkSurfaceCapabilities2EXT*                  pSurfaceCapabilities);\n#endif\n\n\n// VK_EXT_display_control is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_display_control 1\n#define VK_EXT_DISPLAY_CONTROL_SPEC_VERSION 1\n#define VK_EXT_DISPLAY_CONTROL_EXTENSION_NAME \"VK_EXT_display_control\"\n\ntypedef enum VkDisplayPowerStateEXT {\n    VK_DISPLAY_POWER_STATE_OFF_EXT = 0,\n    VK_DISPLAY_POWER_STATE_SUSPEND_EXT = 1,\n    VK_DISPLAY_POWER_STATE_ON_EXT = 2,\n    VK_DISPLAY_POWER_STATE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkDisplayPowerStateEXT;\n\ntypedef enum VkDeviceEventTypeEXT {\n    VK_DEVICE_EVENT_TYPE_DISPLAY_HOTPLUG_EXT = 0,\n    VK_DEVICE_EVENT_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkDeviceEventTypeEXT;\n\ntypedef enum VkDisplayEventTypeEXT {\n    VK_DISPLAY_EVENT_TYPE_FIRST_PIXEL_OUT_EXT = 0,\n    VK_DISPLAY_EVENT_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkDisplayEventTypeEXT;\ntypedef struct VkDisplayPowerInfoEXT {\n    VkStructureType           sType;\n    const void*               pNext;\n    VkDisplayPowerStateEXT    powerState;\n} VkDisplayPowerInfoEXT;\n\ntypedef struct VkDeviceEventInfoEXT {\n    VkStructureType         sType;\n    const void*             pNext;\n    VkDeviceEventTypeEXT    deviceEvent;\n} VkDeviceEventInfoEXT;\n\ntypedef struct VkDisplayEventInfoEXT {\n    VkStructureType          sType;\n    const void*              pNext;\n    VkDisplayEventTypeEXT    displayEvent;\n} VkDisplayEventInfoEXT;\n\ntypedef struct VkSwapchainCounterCreateInfoEXT {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkSurfaceCounterFlagsEXT    surfaceCounters;\n} VkSwapchainCounterCreateInfoEXT;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkDisplayPowerControlEXT)(VkDevice device, VkDisplayKHR display, const VkDisplayPowerInfoEXT* pDisplayPowerInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkRegisterDeviceEventEXT)(VkDevice device, const VkDeviceEventInfoEXT* pDeviceEventInfo, const VkAllocationCallbacks* pAllocator, VkFence* pFence);\ntypedef VkResult (VKAPI_PTR *PFN_vkRegisterDisplayEventEXT)(VkDevice device, VkDisplayKHR display, const VkDisplayEventInfoEXT* pDisplayEventInfo, const VkAllocationCallbacks* pAllocator, VkFence* pFence);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetSwapchainCounterEXT)(VkDevice device, VkSwapchainKHR swapchain, VkSurfaceCounterFlagBitsEXT counter, uint64_t* pCounterValue);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkDisplayPowerControlEXT(\n    VkDevice                                    device,\n    VkDisplayKHR                                display,\n    const VkDisplayPowerInfoEXT*                pDisplayPowerInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkRegisterDeviceEventEXT(\n    VkDevice                                    device,\n    const VkDeviceEventInfoEXT*                 pDeviceEventInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkFence*                                    pFence);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkRegisterDisplayEventEXT(\n    VkDevice                                    device,\n    VkDisplayKHR                                display,\n    const VkDisplayEventInfoEXT*                pDisplayEventInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkFence*                                    pFence);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainCounterEXT(\n    VkDevice                                    device,\n    VkSwapchainKHR                              swapchain,\n    VkSurfaceCounterFlagBitsEXT                 counter,\n    uint64_t*                                   pCounterValue);\n#endif\n\n\n// VK_GOOGLE_display_timing is a preprocessor guard. Do not pass it to API calls.\n#define VK_GOOGLE_display_timing 1\n#define VK_GOOGLE_DISPLAY_TIMING_SPEC_VERSION 1\n#define VK_GOOGLE_DISPLAY_TIMING_EXTENSION_NAME \"VK_GOOGLE_display_timing\"\ntypedef struct VkRefreshCycleDurationGOOGLE {\n    uint64_t    refreshDuration;\n} VkRefreshCycleDurationGOOGLE;\n\ntypedef struct VkPastPresentationTimingGOOGLE {\n    uint32_t    presentID;\n    uint64_t    desiredPresentTime;\n    uint64_t    actualPresentTime;\n    uint64_t    earliestPresentTime;\n    uint64_t    presentMargin;\n} VkPastPresentationTimingGOOGLE;\n\ntypedef struct VkPresentTimeGOOGLE {\n    uint32_t    presentID;\n    uint64_t    desiredPresentTime;\n} VkPresentTimeGOOGLE;\n\ntypedef struct VkPresentTimesInfoGOOGLE {\n    VkStructureType               sType;\n    const void*                   pNext;\n    uint32_t                      swapchainCount;\n    const VkPresentTimeGOOGLE*    pTimes;\n} VkPresentTimesInfoGOOGLE;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetRefreshCycleDurationGOOGLE)(VkDevice device, VkSwapchainKHR swapchain, VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPastPresentationTimingGOOGLE)(VkDevice device, VkSwapchainKHR swapchain, uint32_t* pPresentationTimingCount, VkPastPresentationTimingGOOGLE* pPresentationTimings);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetRefreshCycleDurationGOOGLE(\n    VkDevice                                    device,\n    VkSwapchainKHR                              swapchain,\n    VkRefreshCycleDurationGOOGLE*               pDisplayTimingProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPastPresentationTimingGOOGLE(\n    VkDevice                                    device,\n    VkSwapchainKHR                              swapchain,\n    uint32_t*                                   pPresentationTimingCount,\n    VkPastPresentationTimingGOOGLE*             pPresentationTimings);\n#endif\n\n\n// VK_NV_sample_mask_override_coverage is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_sample_mask_override_coverage 1\n#define VK_NV_SAMPLE_MASK_OVERRIDE_COVERAGE_SPEC_VERSION 1\n#define VK_NV_SAMPLE_MASK_OVERRIDE_COVERAGE_EXTENSION_NAME \"VK_NV_sample_mask_override_coverage\"\n\n\n// VK_NV_geometry_shader_passthrough is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_geometry_shader_passthrough 1\n#define VK_NV_GEOMETRY_SHADER_PASSTHROUGH_SPEC_VERSION 1\n#define VK_NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAME \"VK_NV_geometry_shader_passthrough\"\n\n\n// VK_NV_viewport_array2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_viewport_array2 1\n#define VK_NV_VIEWPORT_ARRAY_2_SPEC_VERSION 1\n#define VK_NV_VIEWPORT_ARRAY_2_EXTENSION_NAME \"VK_NV_viewport_array2\"\n// VK_NV_VIEWPORT_ARRAY2_SPEC_VERSION is a deprecated alias\n#define VK_NV_VIEWPORT_ARRAY2_SPEC_VERSION VK_NV_VIEWPORT_ARRAY_2_SPEC_VERSION\n// VK_NV_VIEWPORT_ARRAY2_EXTENSION_NAME is a deprecated alias\n#define VK_NV_VIEWPORT_ARRAY2_EXTENSION_NAME VK_NV_VIEWPORT_ARRAY_2_EXTENSION_NAME\n\n\n// VK_NVX_multiview_per_view_attributes is a preprocessor guard. Do not pass it to API calls.\n#define VK_NVX_multiview_per_view_attributes 1\n#define VK_NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_SPEC_VERSION 1\n#define VK_NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_EXTENSION_NAME \"VK_NVX_multiview_per_view_attributes\"\ntypedef struct VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           perViewPositionAllComponents;\n} VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX;\n\ntypedef struct VkMultiviewPerViewAttributesInfoNVX {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           perViewAttributes;\n    VkBool32           perViewAttributesPositionXOnly;\n} VkMultiviewPerViewAttributesInfoNVX;\n\n\n\n// VK_NV_viewport_swizzle is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_viewport_swizzle 1\n#define VK_NV_VIEWPORT_SWIZZLE_SPEC_VERSION 1\n#define VK_NV_VIEWPORT_SWIZZLE_EXTENSION_NAME \"VK_NV_viewport_swizzle\"\n\ntypedef enum VkViewportCoordinateSwizzleNV {\n    VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_X_NV = 0,\n    VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_X_NV = 1,\n    VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_Y_NV = 2,\n    VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_Y_NV = 3,\n    VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_Z_NV = 4,\n    VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_Z_NV = 5,\n    VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_W_NV = 6,\n    VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_W_NV = 7,\n    VK_VIEWPORT_COORDINATE_SWIZZLE_MAX_ENUM_NV = 0x7FFFFFFF\n} VkViewportCoordinateSwizzleNV;\ntypedef VkFlags VkPipelineViewportSwizzleStateCreateFlagsNV;\ntypedef struct VkViewportSwizzleNV {\n    VkViewportCoordinateSwizzleNV    x;\n    VkViewportCoordinateSwizzleNV    y;\n    VkViewportCoordinateSwizzleNV    z;\n    VkViewportCoordinateSwizzleNV    w;\n} VkViewportSwizzleNV;\n\ntypedef struct VkPipelineViewportSwizzleStateCreateInfoNV {\n    VkStructureType                                sType;\n    const void*                                    pNext;\n    VkPipelineViewportSwizzleStateCreateFlagsNV    flags;\n    uint32_t                                       viewportCount;\n    const VkViewportSwizzleNV*                     pViewportSwizzles;\n} VkPipelineViewportSwizzleStateCreateInfoNV;\n\n\n\n// VK_EXT_discard_rectangles is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_discard_rectangles 1\n#define VK_EXT_DISCARD_RECTANGLES_SPEC_VERSION 2\n#define VK_EXT_DISCARD_RECTANGLES_EXTENSION_NAME \"VK_EXT_discard_rectangles\"\n\ntypedef enum VkDiscardRectangleModeEXT {\n    VK_DISCARD_RECTANGLE_MODE_INCLUSIVE_EXT = 0,\n    VK_DISCARD_RECTANGLE_MODE_EXCLUSIVE_EXT = 1,\n    VK_DISCARD_RECTANGLE_MODE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkDiscardRectangleModeEXT;\ntypedef VkFlags VkPipelineDiscardRectangleStateCreateFlagsEXT;\ntypedef struct VkPhysicalDeviceDiscardRectanglePropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxDiscardRectangles;\n} VkPhysicalDeviceDiscardRectanglePropertiesEXT;\n\ntypedef struct VkPipelineDiscardRectangleStateCreateInfoEXT {\n    VkStructureType                                  sType;\n    const void*                                      pNext;\n    VkPipelineDiscardRectangleStateCreateFlagsEXT    flags;\n    VkDiscardRectangleModeEXT                        discardRectangleMode;\n    uint32_t                                         discardRectangleCount;\n    const VkRect2D*                                  pDiscardRectangles;\n} VkPipelineDiscardRectangleStateCreateInfoEXT;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDiscardRectangleEXT)(VkCommandBuffer commandBuffer, uint32_t firstDiscardRectangle, uint32_t discardRectangleCount, const VkRect2D* pDiscardRectangles);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDiscardRectangleEnableEXT)(VkCommandBuffer commandBuffer, VkBool32 discardRectangleEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDiscardRectangleModeEXT)(VkCommandBuffer commandBuffer, VkDiscardRectangleModeEXT discardRectangleMode);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDiscardRectangleEXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    firstDiscardRectangle,\n    uint32_t                                    discardRectangleCount,\n    const VkRect2D*                             pDiscardRectangles);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDiscardRectangleEnableEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    discardRectangleEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDiscardRectangleModeEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkDiscardRectangleModeEXT                   discardRectangleMode);\n#endif\n\n\n// VK_EXT_conservative_rasterization is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_conservative_rasterization 1\n#define VK_EXT_CONSERVATIVE_RASTERIZATION_SPEC_VERSION 1\n#define VK_EXT_CONSERVATIVE_RASTERIZATION_EXTENSION_NAME \"VK_EXT_conservative_rasterization\"\n\ntypedef enum VkConservativeRasterizationModeEXT {\n    VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT = 0,\n    VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT = 1,\n    VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT = 2,\n    VK_CONSERVATIVE_RASTERIZATION_MODE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkConservativeRasterizationModeEXT;\ntypedef VkFlags VkPipelineRasterizationConservativeStateCreateFlagsEXT;\ntypedef struct VkPhysicalDeviceConservativeRasterizationPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    float              primitiveOverestimationSize;\n    float              maxExtraPrimitiveOverestimationSize;\n    float              extraPrimitiveOverestimationSizeGranularity;\n    VkBool32           primitiveUnderestimation;\n    VkBool32           conservativePointAndLineRasterization;\n    VkBool32           degenerateTrianglesRasterized;\n    VkBool32           degenerateLinesRasterized;\n    VkBool32           fullyCoveredFragmentShaderInputVariable;\n    VkBool32           conservativeRasterizationPostDepthCoverage;\n} VkPhysicalDeviceConservativeRasterizationPropertiesEXT;\n\ntypedef struct VkPipelineRasterizationConservativeStateCreateInfoEXT {\n    VkStructureType                                           sType;\n    const void*                                               pNext;\n    VkPipelineRasterizationConservativeStateCreateFlagsEXT    flags;\n    VkConservativeRasterizationModeEXT                        conservativeRasterizationMode;\n    float                                                     extraPrimitiveOverestimationSize;\n} VkPipelineRasterizationConservativeStateCreateInfoEXT;\n\n\n\n// VK_EXT_depth_clip_enable is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_depth_clip_enable 1\n#define VK_EXT_DEPTH_CLIP_ENABLE_SPEC_VERSION 1\n#define VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME \"VK_EXT_depth_clip_enable\"\ntypedef VkFlags VkPipelineRasterizationDepthClipStateCreateFlagsEXT;\ntypedef struct VkPhysicalDeviceDepthClipEnableFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           depthClipEnable;\n} VkPhysicalDeviceDepthClipEnableFeaturesEXT;\n\ntypedef struct VkPipelineRasterizationDepthClipStateCreateInfoEXT {\n    VkStructureType                                        sType;\n    const void*                                            pNext;\n    VkPipelineRasterizationDepthClipStateCreateFlagsEXT    flags;\n    VkBool32                                               depthClipEnable;\n} VkPipelineRasterizationDepthClipStateCreateInfoEXT;\n\n\n\n// VK_EXT_swapchain_colorspace is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_swapchain_colorspace 1\n#define VK_EXT_SWAPCHAIN_COLOR_SPACE_SPEC_VERSION 5\n#define VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME \"VK_EXT_swapchain_colorspace\"\n\n\n// VK_EXT_hdr_metadata is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_hdr_metadata 1\n#define VK_EXT_HDR_METADATA_SPEC_VERSION  3\n#define VK_EXT_HDR_METADATA_EXTENSION_NAME \"VK_EXT_hdr_metadata\"\ntypedef struct VkXYColorEXT {\n    float    x;\n    float    y;\n} VkXYColorEXT;\n\ntypedef struct VkHdrMetadataEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkXYColorEXT       displayPrimaryRed;\n    VkXYColorEXT       displayPrimaryGreen;\n    VkXYColorEXT       displayPrimaryBlue;\n    VkXYColorEXT       whitePoint;\n    float              maxLuminance;\n    float              minLuminance;\n    float              maxContentLightLevel;\n    float              maxFrameAverageLightLevel;\n} VkHdrMetadataEXT;\n\ntypedef void (VKAPI_PTR *PFN_vkSetHdrMetadataEXT)(VkDevice device, uint32_t swapchainCount, const VkSwapchainKHR* pSwapchains, const VkHdrMetadataEXT* pMetadata);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkSetHdrMetadataEXT(\n    VkDevice                                    device,\n    uint32_t                                    swapchainCount,\n    const VkSwapchainKHR*                       pSwapchains,\n    const VkHdrMetadataEXT*                     pMetadata);\n#endif\n\n\n// VK_IMG_relaxed_line_rasterization is a preprocessor guard. Do not pass it to API calls.\n#define VK_IMG_relaxed_line_rasterization 1\n#define VK_IMG_RELAXED_LINE_RASTERIZATION_SPEC_VERSION 1\n#define VK_IMG_RELAXED_LINE_RASTERIZATION_EXTENSION_NAME \"VK_IMG_relaxed_line_rasterization\"\ntypedef struct VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           relaxedLineRasterization;\n} VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG;\n\n\n\n// VK_EXT_external_memory_dma_buf is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_external_memory_dma_buf 1\n#define VK_EXT_EXTERNAL_MEMORY_DMA_BUF_SPEC_VERSION 1\n#define VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME \"VK_EXT_external_memory_dma_buf\"\n\n\n// VK_EXT_queue_family_foreign is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_queue_family_foreign 1\n#define VK_EXT_QUEUE_FAMILY_FOREIGN_SPEC_VERSION 1\n#define VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME \"VK_EXT_queue_family_foreign\"\n#define VK_QUEUE_FAMILY_FOREIGN_EXT       (~2U)\n\n\n// VK_EXT_debug_utils is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_debug_utils 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDebugUtilsMessengerEXT)\n#define VK_EXT_DEBUG_UTILS_SPEC_VERSION   2\n#define VK_EXT_DEBUG_UTILS_EXTENSION_NAME \"VK_EXT_debug_utils\"\ntypedef VkFlags VkDebugUtilsMessengerCallbackDataFlagsEXT;\n\ntypedef enum VkDebugUtilsMessageSeverityFlagBitsEXT {\n    VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT = 0x00000001,\n    VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT = 0x00000010,\n    VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT = 0x00000100,\n    VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT = 0x00001000,\n    VK_DEBUG_UTILS_MESSAGE_SEVERITY_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkDebugUtilsMessageSeverityFlagBitsEXT;\n\ntypedef enum VkDebugUtilsMessageTypeFlagBitsEXT {\n    VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT = 0x00000001,\n    VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT = 0x00000002,\n    VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT = 0x00000004,\n    VK_DEBUG_UTILS_MESSAGE_TYPE_DEVICE_ADDRESS_BINDING_BIT_EXT = 0x00000008,\n    VK_DEBUG_UTILS_MESSAGE_TYPE_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkDebugUtilsMessageTypeFlagBitsEXT;\ntypedef VkFlags VkDebugUtilsMessageTypeFlagsEXT;\ntypedef VkFlags VkDebugUtilsMessageSeverityFlagsEXT;\ntypedef VkFlags VkDebugUtilsMessengerCreateFlagsEXT;\ntypedef struct VkDebugUtilsLabelEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    const char*        pLabelName;\n    float              color[4];\n} VkDebugUtilsLabelEXT;\n\ntypedef struct VkDebugUtilsObjectNameInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkObjectType       objectType;\n    uint64_t           objectHandle;\n    const char*        pObjectName;\n} VkDebugUtilsObjectNameInfoEXT;\n\ntypedef struct VkDebugUtilsMessengerCallbackDataEXT {\n    VkStructureType                              sType;\n    const void*                                  pNext;\n    VkDebugUtilsMessengerCallbackDataFlagsEXT    flags;\n    const char*                                  pMessageIdName;\n    int32_t                                      messageIdNumber;\n    const char*                                  pMessage;\n    uint32_t                                     queueLabelCount;\n    const VkDebugUtilsLabelEXT*                  pQueueLabels;\n    uint32_t                                     cmdBufLabelCount;\n    const VkDebugUtilsLabelEXT*                  pCmdBufLabels;\n    uint32_t                                     objectCount;\n    const VkDebugUtilsObjectNameInfoEXT*         pObjects;\n} VkDebugUtilsMessengerCallbackDataEXT;\n\ntypedef VkBool32 (VKAPI_PTR *PFN_vkDebugUtilsMessengerCallbackEXT)(\n    VkDebugUtilsMessageSeverityFlagBitsEXT           messageSeverity,\n    VkDebugUtilsMessageTypeFlagsEXT                  messageTypes,\n    const VkDebugUtilsMessengerCallbackDataEXT*      pCallbackData,\n    void*                                            pUserData);\n\ntypedef struct VkDebugUtilsMessengerCreateInfoEXT {\n    VkStructureType                         sType;\n    const void*                             pNext;\n    VkDebugUtilsMessengerCreateFlagsEXT     flags;\n    VkDebugUtilsMessageSeverityFlagsEXT     messageSeverity;\n    VkDebugUtilsMessageTypeFlagsEXT         messageType;\n    PFN_vkDebugUtilsMessengerCallbackEXT    pfnUserCallback;\n    void*                                   pUserData;\n} VkDebugUtilsMessengerCreateInfoEXT;\n\ntypedef struct VkDebugUtilsObjectTagInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkObjectType       objectType;\n    uint64_t           objectHandle;\n    uint64_t           tagName;\n    size_t             tagSize;\n    const void*        pTag;\n} VkDebugUtilsObjectTagInfoEXT;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkSetDebugUtilsObjectNameEXT)(VkDevice device, const VkDebugUtilsObjectNameInfoEXT* pNameInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkSetDebugUtilsObjectTagEXT)(VkDevice device, const VkDebugUtilsObjectTagInfoEXT* pTagInfo);\ntypedef void (VKAPI_PTR *PFN_vkQueueBeginDebugUtilsLabelEXT)(VkQueue queue, const VkDebugUtilsLabelEXT* pLabelInfo);\ntypedef void (VKAPI_PTR *PFN_vkQueueEndDebugUtilsLabelEXT)(VkQueue queue);\ntypedef void (VKAPI_PTR *PFN_vkQueueInsertDebugUtilsLabelEXT)(VkQueue queue, const VkDebugUtilsLabelEXT* pLabelInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdBeginDebugUtilsLabelEXT)(VkCommandBuffer commandBuffer, const VkDebugUtilsLabelEXT* pLabelInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdEndDebugUtilsLabelEXT)(VkCommandBuffer commandBuffer);\ntypedef void (VKAPI_PTR *PFN_vkCmdInsertDebugUtilsLabelEXT)(VkCommandBuffer commandBuffer, const VkDebugUtilsLabelEXT* pLabelInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateDebugUtilsMessengerEXT)(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugUtilsMessengerEXT* pMessenger);\ntypedef void (VKAPI_PTR *PFN_vkDestroyDebugUtilsMessengerEXT)(VkInstance instance, VkDebugUtilsMessengerEXT messenger, const VkAllocationCallbacks* pAllocator);\ntypedef void (VKAPI_PTR *PFN_vkSubmitDebugUtilsMessageEXT)(VkInstance instance, VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageTypes, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkSetDebugUtilsObjectNameEXT(\n    VkDevice                                    device,\n    const VkDebugUtilsObjectNameInfoEXT*        pNameInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkSetDebugUtilsObjectTagEXT(\n    VkDevice                                    device,\n    const VkDebugUtilsObjectTagInfoEXT*         pTagInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkQueueBeginDebugUtilsLabelEXT(\n    VkQueue                                     queue,\n    const VkDebugUtilsLabelEXT*                 pLabelInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkQueueEndDebugUtilsLabelEXT(\n    VkQueue                                     queue);\n\nVKAPI_ATTR void VKAPI_CALL vkQueueInsertDebugUtilsLabelEXT(\n    VkQueue                                     queue,\n    const VkDebugUtilsLabelEXT*                 pLabelInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBeginDebugUtilsLabelEXT(\n    VkCommandBuffer                             commandBuffer,\n    const VkDebugUtilsLabelEXT*                 pLabelInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdEndDebugUtilsLabelEXT(\n    VkCommandBuffer                             commandBuffer);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdInsertDebugUtilsLabelEXT(\n    VkCommandBuffer                             commandBuffer,\n    const VkDebugUtilsLabelEXT*                 pLabelInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugUtilsMessengerEXT(\n    VkInstance                                  instance,\n    const VkDebugUtilsMessengerCreateInfoEXT*   pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkDebugUtilsMessengerEXT*                   pMessenger);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyDebugUtilsMessengerEXT(\n    VkInstance                                  instance,\n    VkDebugUtilsMessengerEXT                    messenger,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR void VKAPI_CALL vkSubmitDebugUtilsMessageEXT(\n    VkInstance                                  instance,\n    VkDebugUtilsMessageSeverityFlagBitsEXT      messageSeverity,\n    VkDebugUtilsMessageTypeFlagsEXT             messageTypes,\n    const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData);\n#endif\n\n\n// VK_EXT_sampler_filter_minmax is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_sampler_filter_minmax 1\n#define VK_EXT_SAMPLER_FILTER_MINMAX_SPEC_VERSION 2\n#define VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME \"VK_EXT_sampler_filter_minmax\"\ntypedef VkSamplerReductionMode VkSamplerReductionModeEXT;\n\ntypedef VkSamplerReductionModeCreateInfo VkSamplerReductionModeCreateInfoEXT;\n\ntypedef VkPhysicalDeviceSamplerFilterMinmaxProperties VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT;\n\n\n\n// VK_AMD_gpu_shader_int16 is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMD_gpu_shader_int16 1\n#define VK_AMD_GPU_SHADER_INT16_SPEC_VERSION 2\n#define VK_AMD_GPU_SHADER_INT16_EXTENSION_NAME \"VK_AMD_gpu_shader_int16\"\n\n\n// VK_AMD_mixed_attachment_samples is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMD_mixed_attachment_samples 1\n#define VK_AMD_MIXED_ATTACHMENT_SAMPLES_SPEC_VERSION 1\n#define VK_AMD_MIXED_ATTACHMENT_SAMPLES_EXTENSION_NAME \"VK_AMD_mixed_attachment_samples\"\ntypedef struct VkAttachmentSampleCountInfoAMD {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    uint32_t                        colorAttachmentCount;\n    const VkSampleCountFlagBits*    pColorAttachmentSamples;\n    VkSampleCountFlagBits           depthStencilAttachmentSamples;\n} VkAttachmentSampleCountInfoAMD;\n\n\n\n// VK_AMD_shader_fragment_mask is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMD_shader_fragment_mask 1\n#define VK_AMD_SHADER_FRAGMENT_MASK_SPEC_VERSION 1\n#define VK_AMD_SHADER_FRAGMENT_MASK_EXTENSION_NAME \"VK_AMD_shader_fragment_mask\"\n\n\n// VK_EXT_inline_uniform_block is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_inline_uniform_block 1\n#define VK_EXT_INLINE_UNIFORM_BLOCK_SPEC_VERSION 1\n#define VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME \"VK_EXT_inline_uniform_block\"\ntypedef VkPhysicalDeviceInlineUniformBlockFeatures VkPhysicalDeviceInlineUniformBlockFeaturesEXT;\n\ntypedef VkPhysicalDeviceInlineUniformBlockProperties VkPhysicalDeviceInlineUniformBlockPropertiesEXT;\n\ntypedef VkWriteDescriptorSetInlineUniformBlock VkWriteDescriptorSetInlineUniformBlockEXT;\n\ntypedef VkDescriptorPoolInlineUniformBlockCreateInfo VkDescriptorPoolInlineUniformBlockCreateInfoEXT;\n\n\n\n// VK_EXT_shader_stencil_export is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_shader_stencil_export 1\n#define VK_EXT_SHADER_STENCIL_EXPORT_SPEC_VERSION 1\n#define VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME \"VK_EXT_shader_stencil_export\"\n\n\n// VK_EXT_sample_locations is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_sample_locations 1\n#define VK_EXT_SAMPLE_LOCATIONS_SPEC_VERSION 1\n#define VK_EXT_SAMPLE_LOCATIONS_EXTENSION_NAME \"VK_EXT_sample_locations\"\ntypedef struct VkSampleLocationEXT {\n    float    x;\n    float    y;\n} VkSampleLocationEXT;\n\ntypedef struct VkSampleLocationsInfoEXT {\n    VkStructureType               sType;\n    const void*                   pNext;\n    VkSampleCountFlagBits         sampleLocationsPerPixel;\n    VkExtent2D                    sampleLocationGridSize;\n    uint32_t                      sampleLocationsCount;\n    const VkSampleLocationEXT*    pSampleLocations;\n} VkSampleLocationsInfoEXT;\n\ntypedef struct VkAttachmentSampleLocationsEXT {\n    uint32_t                    attachmentIndex;\n    VkSampleLocationsInfoEXT    sampleLocationsInfo;\n} VkAttachmentSampleLocationsEXT;\n\ntypedef struct VkSubpassSampleLocationsEXT {\n    uint32_t                    subpassIndex;\n    VkSampleLocationsInfoEXT    sampleLocationsInfo;\n} VkSubpassSampleLocationsEXT;\n\ntypedef struct VkRenderPassSampleLocationsBeginInfoEXT {\n    VkStructureType                          sType;\n    const void*                              pNext;\n    uint32_t                                 attachmentInitialSampleLocationsCount;\n    const VkAttachmentSampleLocationsEXT*    pAttachmentInitialSampleLocations;\n    uint32_t                                 postSubpassSampleLocationsCount;\n    const VkSubpassSampleLocationsEXT*       pPostSubpassSampleLocations;\n} VkRenderPassSampleLocationsBeginInfoEXT;\n\ntypedef struct VkPipelineSampleLocationsStateCreateInfoEXT {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkBool32                    sampleLocationsEnable;\n    VkSampleLocationsInfoEXT    sampleLocationsInfo;\n} VkPipelineSampleLocationsStateCreateInfoEXT;\n\ntypedef struct VkPhysicalDeviceSampleLocationsPropertiesEXT {\n    VkStructureType       sType;\n    void*                 pNext;\n    VkSampleCountFlags    sampleLocationSampleCounts;\n    VkExtent2D            maxSampleLocationGridSize;\n    float                 sampleLocationCoordinateRange[2];\n    uint32_t              sampleLocationSubPixelBits;\n    VkBool32              variableSampleLocations;\n} VkPhysicalDeviceSampleLocationsPropertiesEXT;\n\ntypedef struct VkMultisamplePropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkExtent2D         maxSampleLocationGridSize;\n} VkMultisamplePropertiesEXT;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdSetSampleLocationsEXT)(VkCommandBuffer commandBuffer, const VkSampleLocationsInfoEXT* pSampleLocationsInfo);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT)(VkPhysicalDevice physicalDevice, VkSampleCountFlagBits samples, VkMultisamplePropertiesEXT* pMultisampleProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdSetSampleLocationsEXT(\n    VkCommandBuffer                             commandBuffer,\n    const VkSampleLocationsInfoEXT*             pSampleLocationsInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceMultisamplePropertiesEXT(\n    VkPhysicalDevice                            physicalDevice,\n    VkSampleCountFlagBits                       samples,\n    VkMultisamplePropertiesEXT*                 pMultisampleProperties);\n#endif\n\n\n// VK_EXT_blend_operation_advanced is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_blend_operation_advanced 1\n#define VK_EXT_BLEND_OPERATION_ADVANCED_SPEC_VERSION 2\n#define VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME \"VK_EXT_blend_operation_advanced\"\n\ntypedef enum VkBlendOverlapEXT {\n    VK_BLEND_OVERLAP_UNCORRELATED_EXT = 0,\n    VK_BLEND_OVERLAP_DISJOINT_EXT = 1,\n    VK_BLEND_OVERLAP_CONJOINT_EXT = 2,\n    VK_BLEND_OVERLAP_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkBlendOverlapEXT;\ntypedef struct VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           advancedBlendCoherentOperations;\n} VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT;\n\ntypedef struct VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           advancedBlendMaxColorAttachments;\n    VkBool32           advancedBlendIndependentBlend;\n    VkBool32           advancedBlendNonPremultipliedSrcColor;\n    VkBool32           advancedBlendNonPremultipliedDstColor;\n    VkBool32           advancedBlendCorrelatedOverlap;\n    VkBool32           advancedBlendAllOperations;\n} VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT;\n\ntypedef struct VkPipelineColorBlendAdvancedStateCreateInfoEXT {\n    VkStructureType      sType;\n    const void*          pNext;\n    VkBool32             srcPremultiplied;\n    VkBool32             dstPremultiplied;\n    VkBlendOverlapEXT    blendOverlap;\n} VkPipelineColorBlendAdvancedStateCreateInfoEXT;\n\n\n\n// VK_NV_fragment_coverage_to_color is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_fragment_coverage_to_color 1\n#define VK_NV_FRAGMENT_COVERAGE_TO_COLOR_SPEC_VERSION 1\n#define VK_NV_FRAGMENT_COVERAGE_TO_COLOR_EXTENSION_NAME \"VK_NV_fragment_coverage_to_color\"\ntypedef VkFlags VkPipelineCoverageToColorStateCreateFlagsNV;\ntypedef struct VkPipelineCoverageToColorStateCreateInfoNV {\n    VkStructureType                                sType;\n    const void*                                    pNext;\n    VkPipelineCoverageToColorStateCreateFlagsNV    flags;\n    VkBool32                                       coverageToColorEnable;\n    uint32_t                                       coverageToColorLocation;\n} VkPipelineCoverageToColorStateCreateInfoNV;\n\n\n\n// VK_NV_framebuffer_mixed_samples is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_framebuffer_mixed_samples 1\n#define VK_NV_FRAMEBUFFER_MIXED_SAMPLES_SPEC_VERSION 1\n#define VK_NV_FRAMEBUFFER_MIXED_SAMPLES_EXTENSION_NAME \"VK_NV_framebuffer_mixed_samples\"\n\ntypedef enum VkCoverageModulationModeNV {\n    VK_COVERAGE_MODULATION_MODE_NONE_NV = 0,\n    VK_COVERAGE_MODULATION_MODE_RGB_NV = 1,\n    VK_COVERAGE_MODULATION_MODE_ALPHA_NV = 2,\n    VK_COVERAGE_MODULATION_MODE_RGBA_NV = 3,\n    VK_COVERAGE_MODULATION_MODE_MAX_ENUM_NV = 0x7FFFFFFF\n} VkCoverageModulationModeNV;\ntypedef VkFlags VkPipelineCoverageModulationStateCreateFlagsNV;\ntypedef struct VkPipelineCoverageModulationStateCreateInfoNV {\n    VkStructureType                                   sType;\n    const void*                                       pNext;\n    VkPipelineCoverageModulationStateCreateFlagsNV    flags;\n    VkCoverageModulationModeNV                        coverageModulationMode;\n    VkBool32                                          coverageModulationTableEnable;\n    uint32_t                                          coverageModulationTableCount;\n    const float*                                      pCoverageModulationTable;\n} VkPipelineCoverageModulationStateCreateInfoNV;\n\ntypedef VkAttachmentSampleCountInfoAMD VkAttachmentSampleCountInfoNV;\n\n\n\n// VK_NV_fill_rectangle is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_fill_rectangle 1\n#define VK_NV_FILL_RECTANGLE_SPEC_VERSION 1\n#define VK_NV_FILL_RECTANGLE_EXTENSION_NAME \"VK_NV_fill_rectangle\"\n\n\n// VK_NV_shader_sm_builtins is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_shader_sm_builtins 1\n#define VK_NV_SHADER_SM_BUILTINS_SPEC_VERSION 1\n#define VK_NV_SHADER_SM_BUILTINS_EXTENSION_NAME \"VK_NV_shader_sm_builtins\"\ntypedef struct VkPhysicalDeviceShaderSMBuiltinsPropertiesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           shaderSMCount;\n    uint32_t           shaderWarpsPerSM;\n} VkPhysicalDeviceShaderSMBuiltinsPropertiesNV;\n\ntypedef struct VkPhysicalDeviceShaderSMBuiltinsFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderSMBuiltins;\n} VkPhysicalDeviceShaderSMBuiltinsFeaturesNV;\n\n\n\n// VK_EXT_post_depth_coverage is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_post_depth_coverage 1\n#define VK_EXT_POST_DEPTH_COVERAGE_SPEC_VERSION 1\n#define VK_EXT_POST_DEPTH_COVERAGE_EXTENSION_NAME \"VK_EXT_post_depth_coverage\"\n\n\n// VK_EXT_image_drm_format_modifier is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_image_drm_format_modifier 1\n#define VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_SPEC_VERSION 2\n#define VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME \"VK_EXT_image_drm_format_modifier\"\ntypedef struct VkDrmFormatModifierPropertiesEXT {\n    uint64_t                drmFormatModifier;\n    uint32_t                drmFormatModifierPlaneCount;\n    VkFormatFeatureFlags    drmFormatModifierTilingFeatures;\n} VkDrmFormatModifierPropertiesEXT;\n\ntypedef struct VkDrmFormatModifierPropertiesListEXT {\n    VkStructureType                      sType;\n    void*                                pNext;\n    uint32_t                             drmFormatModifierCount;\n    VkDrmFormatModifierPropertiesEXT*    pDrmFormatModifierProperties;\n} VkDrmFormatModifierPropertiesListEXT;\n\ntypedef struct VkPhysicalDeviceImageDrmFormatModifierInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint64_t           drmFormatModifier;\n    VkSharingMode      sharingMode;\n    uint32_t           queueFamilyIndexCount;\n    const uint32_t*    pQueueFamilyIndices;\n} VkPhysicalDeviceImageDrmFormatModifierInfoEXT;\n\ntypedef struct VkImageDrmFormatModifierListCreateInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           drmFormatModifierCount;\n    const uint64_t*    pDrmFormatModifiers;\n} VkImageDrmFormatModifierListCreateInfoEXT;\n\ntypedef struct VkImageDrmFormatModifierExplicitCreateInfoEXT {\n    VkStructureType               sType;\n    const void*                   pNext;\n    uint64_t                      drmFormatModifier;\n    uint32_t                      drmFormatModifierPlaneCount;\n    const VkSubresourceLayout*    pPlaneLayouts;\n} VkImageDrmFormatModifierExplicitCreateInfoEXT;\n\ntypedef struct VkImageDrmFormatModifierPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    uint64_t           drmFormatModifier;\n} VkImageDrmFormatModifierPropertiesEXT;\n\ntypedef struct VkDrmFormatModifierProperties2EXT {\n    uint64_t                 drmFormatModifier;\n    uint32_t                 drmFormatModifierPlaneCount;\n    VkFormatFeatureFlags2    drmFormatModifierTilingFeatures;\n} VkDrmFormatModifierProperties2EXT;\n\ntypedef struct VkDrmFormatModifierPropertiesList2EXT {\n    VkStructureType                       sType;\n    void*                                 pNext;\n    uint32_t                              drmFormatModifierCount;\n    VkDrmFormatModifierProperties2EXT*    pDrmFormatModifierProperties;\n} VkDrmFormatModifierPropertiesList2EXT;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetImageDrmFormatModifierPropertiesEXT)(VkDevice device, VkImage image, VkImageDrmFormatModifierPropertiesEXT* pProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetImageDrmFormatModifierPropertiesEXT(\n    VkDevice                                    device,\n    VkImage                                     image,\n    VkImageDrmFormatModifierPropertiesEXT*      pProperties);\n#endif\n\n\n// VK_EXT_validation_cache is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_validation_cache 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkValidationCacheEXT)\n#define VK_EXT_VALIDATION_CACHE_SPEC_VERSION 1\n#define VK_EXT_VALIDATION_CACHE_EXTENSION_NAME \"VK_EXT_validation_cache\"\n\ntypedef enum VkValidationCacheHeaderVersionEXT {\n    VK_VALIDATION_CACHE_HEADER_VERSION_ONE_EXT = 1,\n    VK_VALIDATION_CACHE_HEADER_VERSION_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkValidationCacheHeaderVersionEXT;\ntypedef VkFlags VkValidationCacheCreateFlagsEXT;\ntypedef struct VkValidationCacheCreateInfoEXT {\n    VkStructureType                    sType;\n    const void*                        pNext;\n    VkValidationCacheCreateFlagsEXT    flags;\n    size_t                             initialDataSize;\n    const void*                        pInitialData;\n} VkValidationCacheCreateInfoEXT;\n\ntypedef struct VkShaderModuleValidationCacheCreateInfoEXT {\n    VkStructureType         sType;\n    const void*             pNext;\n    VkValidationCacheEXT    validationCache;\n} VkShaderModuleValidationCacheCreateInfoEXT;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateValidationCacheEXT)(VkDevice device, const VkValidationCacheCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkValidationCacheEXT* pValidationCache);\ntypedef void (VKAPI_PTR *PFN_vkDestroyValidationCacheEXT)(VkDevice device, VkValidationCacheEXT validationCache, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkMergeValidationCachesEXT)(VkDevice device, VkValidationCacheEXT dstCache, uint32_t srcCacheCount, const VkValidationCacheEXT* pSrcCaches);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetValidationCacheDataEXT)(VkDevice device, VkValidationCacheEXT validationCache, size_t* pDataSize, void* pData);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateValidationCacheEXT(\n    VkDevice                                    device,\n    const VkValidationCacheCreateInfoEXT*       pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkValidationCacheEXT*                       pValidationCache);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyValidationCacheEXT(\n    VkDevice                                    device,\n    VkValidationCacheEXT                        validationCache,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkMergeValidationCachesEXT(\n    VkDevice                                    device,\n    VkValidationCacheEXT                        dstCache,\n    uint32_t                                    srcCacheCount,\n    const VkValidationCacheEXT*                 pSrcCaches);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetValidationCacheDataEXT(\n    VkDevice                                    device,\n    VkValidationCacheEXT                        validationCache,\n    size_t*                                     pDataSize,\n    void*                                       pData);\n#endif\n\n\n// VK_EXT_descriptor_indexing is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_descriptor_indexing 1\n#define VK_EXT_DESCRIPTOR_INDEXING_SPEC_VERSION 2\n#define VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME \"VK_EXT_descriptor_indexing\"\ntypedef VkDescriptorBindingFlagBits VkDescriptorBindingFlagBitsEXT;\n\ntypedef VkDescriptorBindingFlags VkDescriptorBindingFlagsEXT;\n\ntypedef VkDescriptorSetLayoutBindingFlagsCreateInfo VkDescriptorSetLayoutBindingFlagsCreateInfoEXT;\n\ntypedef VkPhysicalDeviceDescriptorIndexingFeatures VkPhysicalDeviceDescriptorIndexingFeaturesEXT;\n\ntypedef VkPhysicalDeviceDescriptorIndexingProperties VkPhysicalDeviceDescriptorIndexingPropertiesEXT;\n\ntypedef VkDescriptorSetVariableDescriptorCountAllocateInfo VkDescriptorSetVariableDescriptorCountAllocateInfoEXT;\n\ntypedef VkDescriptorSetVariableDescriptorCountLayoutSupport VkDescriptorSetVariableDescriptorCountLayoutSupportEXT;\n\n\n\n// VK_EXT_shader_viewport_index_layer is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_shader_viewport_index_layer 1\n#define VK_EXT_SHADER_VIEWPORT_INDEX_LAYER_SPEC_VERSION 1\n#define VK_EXT_SHADER_VIEWPORT_INDEX_LAYER_EXTENSION_NAME \"VK_EXT_shader_viewport_index_layer\"\n\n\n// VK_NV_shading_rate_image is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_shading_rate_image 1\n#define VK_NV_SHADING_RATE_IMAGE_SPEC_VERSION 3\n#define VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME \"VK_NV_shading_rate_image\"\n\ntypedef enum VkShadingRatePaletteEntryNV {\n    VK_SHADING_RATE_PALETTE_ENTRY_NO_INVOCATIONS_NV = 0,\n    VK_SHADING_RATE_PALETTE_ENTRY_16_INVOCATIONS_PER_PIXEL_NV = 1,\n    VK_SHADING_RATE_PALETTE_ENTRY_8_INVOCATIONS_PER_PIXEL_NV = 2,\n    VK_SHADING_RATE_PALETTE_ENTRY_4_INVOCATIONS_PER_PIXEL_NV = 3,\n    VK_SHADING_RATE_PALETTE_ENTRY_2_INVOCATIONS_PER_PIXEL_NV = 4,\n    VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_PIXEL_NV = 5,\n    VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_2X1_PIXELS_NV = 6,\n    VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_1X2_PIXELS_NV = 7,\n    VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_2X2_PIXELS_NV = 8,\n    VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_4X2_PIXELS_NV = 9,\n    VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_2X4_PIXELS_NV = 10,\n    VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_4X4_PIXELS_NV = 11,\n    VK_SHADING_RATE_PALETTE_ENTRY_MAX_ENUM_NV = 0x7FFFFFFF\n} VkShadingRatePaletteEntryNV;\n\ntypedef enum VkCoarseSampleOrderTypeNV {\n    VK_COARSE_SAMPLE_ORDER_TYPE_DEFAULT_NV = 0,\n    VK_COARSE_SAMPLE_ORDER_TYPE_CUSTOM_NV = 1,\n    VK_COARSE_SAMPLE_ORDER_TYPE_PIXEL_MAJOR_NV = 2,\n    VK_COARSE_SAMPLE_ORDER_TYPE_SAMPLE_MAJOR_NV = 3,\n    VK_COARSE_SAMPLE_ORDER_TYPE_MAX_ENUM_NV = 0x7FFFFFFF\n} VkCoarseSampleOrderTypeNV;\ntypedef struct VkShadingRatePaletteNV {\n    uint32_t                              shadingRatePaletteEntryCount;\n    const VkShadingRatePaletteEntryNV*    pShadingRatePaletteEntries;\n} VkShadingRatePaletteNV;\n\ntypedef struct VkPipelineViewportShadingRateImageStateCreateInfoNV {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkBool32                         shadingRateImageEnable;\n    uint32_t                         viewportCount;\n    const VkShadingRatePaletteNV*    pShadingRatePalettes;\n} VkPipelineViewportShadingRateImageStateCreateInfoNV;\n\ntypedef struct VkPhysicalDeviceShadingRateImageFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shadingRateImage;\n    VkBool32           shadingRateCoarseSampleOrder;\n} VkPhysicalDeviceShadingRateImageFeaturesNV;\n\ntypedef struct VkPhysicalDeviceShadingRateImagePropertiesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkExtent2D         shadingRateTexelSize;\n    uint32_t           shadingRatePaletteSize;\n    uint32_t           shadingRateMaxCoarseSamples;\n} VkPhysicalDeviceShadingRateImagePropertiesNV;\n\ntypedef struct VkCoarseSampleLocationNV {\n    uint32_t    pixelX;\n    uint32_t    pixelY;\n    uint32_t    sample;\n} VkCoarseSampleLocationNV;\n\ntypedef struct VkCoarseSampleOrderCustomNV {\n    VkShadingRatePaletteEntryNV        shadingRate;\n    uint32_t                           sampleCount;\n    uint32_t                           sampleLocationCount;\n    const VkCoarseSampleLocationNV*    pSampleLocations;\n} VkCoarseSampleOrderCustomNV;\n\ntypedef struct VkPipelineViewportCoarseSampleOrderStateCreateInfoNV {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkCoarseSampleOrderTypeNV             sampleOrderType;\n    uint32_t                              customSampleOrderCount;\n    const VkCoarseSampleOrderCustomNV*    pCustomSampleOrders;\n} VkPipelineViewportCoarseSampleOrderStateCreateInfoNV;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdBindShadingRateImageNV)(VkCommandBuffer commandBuffer, VkImageView imageView, VkImageLayout imageLayout);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetViewportShadingRatePaletteNV)(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkShadingRatePaletteNV* pShadingRatePalettes);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetCoarseSampleOrderNV)(VkCommandBuffer commandBuffer, VkCoarseSampleOrderTypeNV sampleOrderType, uint32_t customSampleOrderCount, const VkCoarseSampleOrderCustomNV* pCustomSampleOrders);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdBindShadingRateImageNV(\n    VkCommandBuffer                             commandBuffer,\n    VkImageView                                 imageView,\n    VkImageLayout                               imageLayout);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetViewportShadingRatePaletteNV(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    firstViewport,\n    uint32_t                                    viewportCount,\n    const VkShadingRatePaletteNV*               pShadingRatePalettes);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetCoarseSampleOrderNV(\n    VkCommandBuffer                             commandBuffer,\n    VkCoarseSampleOrderTypeNV                   sampleOrderType,\n    uint32_t                                    customSampleOrderCount,\n    const VkCoarseSampleOrderCustomNV*          pCustomSampleOrders);\n#endif\n\n\n// VK_NV_ray_tracing is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_ray_tracing 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkAccelerationStructureNV)\n#define VK_NV_RAY_TRACING_SPEC_VERSION    3\n#define VK_NV_RAY_TRACING_EXTENSION_NAME  \"VK_NV_ray_tracing\"\n#define VK_SHADER_UNUSED_KHR              (~0U)\n#define VK_SHADER_UNUSED_NV               VK_SHADER_UNUSED_KHR\n\ntypedef enum VkRayTracingShaderGroupTypeKHR {\n    VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR = 0,\n    VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR = 1,\n    VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR = 2,\n    VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR,\n    VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_NV = VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR,\n    VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_NV = VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR,\n    VK_RAY_TRACING_SHADER_GROUP_TYPE_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkRayTracingShaderGroupTypeKHR;\ntypedef VkRayTracingShaderGroupTypeKHR VkRayTracingShaderGroupTypeNV;\n\n\ntypedef enum VkGeometryTypeKHR {\n    VK_GEOMETRY_TYPE_TRIANGLES_KHR = 0,\n    VK_GEOMETRY_TYPE_AABBS_KHR = 1,\n    VK_GEOMETRY_TYPE_INSTANCES_KHR = 2,\n    VK_GEOMETRY_TYPE_SPHERES_NV = 1000429004,\n    VK_GEOMETRY_TYPE_LINEAR_SWEPT_SPHERES_NV = 1000429005,\n    VK_GEOMETRY_TYPE_TRIANGLES_NV = VK_GEOMETRY_TYPE_TRIANGLES_KHR,\n    VK_GEOMETRY_TYPE_AABBS_NV = VK_GEOMETRY_TYPE_AABBS_KHR,\n    VK_GEOMETRY_TYPE_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkGeometryTypeKHR;\ntypedef VkGeometryTypeKHR VkGeometryTypeNV;\n\n\ntypedef enum VkAccelerationStructureTypeKHR {\n    VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR = 0,\n    VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR = 1,\n    VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR = 2,\n    VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR,\n    VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR,\n    VK_ACCELERATION_STRUCTURE_TYPE_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkAccelerationStructureTypeKHR;\ntypedef VkAccelerationStructureTypeKHR VkAccelerationStructureTypeNV;\n\n\ntypedef enum VkCopyAccelerationStructureModeKHR {\n    VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR = 0,\n    VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR = 1,\n    VK_COPY_ACCELERATION_STRUCTURE_MODE_SERIALIZE_KHR = 2,\n    VK_COPY_ACCELERATION_STRUCTURE_MODE_DESERIALIZE_KHR = 3,\n    VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_NV = VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR,\n    VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_NV = VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR,\n    VK_COPY_ACCELERATION_STRUCTURE_MODE_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkCopyAccelerationStructureModeKHR;\ntypedef VkCopyAccelerationStructureModeKHR VkCopyAccelerationStructureModeNV;\n\n\ntypedef enum VkAccelerationStructureMemoryRequirementsTypeNV {\n    VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV = 0,\n    VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV = 1,\n    VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV = 2,\n    VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_MAX_ENUM_NV = 0x7FFFFFFF\n} VkAccelerationStructureMemoryRequirementsTypeNV;\n\ntypedef enum VkGeometryFlagBitsKHR {\n    VK_GEOMETRY_OPAQUE_BIT_KHR = 0x00000001,\n    VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR = 0x00000002,\n    VK_GEOMETRY_OPAQUE_BIT_NV = VK_GEOMETRY_OPAQUE_BIT_KHR,\n    VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_NV = VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR,\n    VK_GEOMETRY_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkGeometryFlagBitsKHR;\ntypedef VkFlags VkGeometryFlagsKHR;\ntypedef VkGeometryFlagsKHR VkGeometryFlagsNV;\n\ntypedef VkGeometryFlagBitsKHR VkGeometryFlagBitsNV;\n\n\ntypedef enum VkGeometryInstanceFlagBitsKHR {\n    VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR = 0x00000001,\n    VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR = 0x00000002,\n    VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR = 0x00000004,\n    VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_KHR = 0x00000008,\n    VK_GEOMETRY_INSTANCE_FORCE_OPACITY_MICROMAP_2_STATE_EXT = 0x00000010,\n    VK_GEOMETRY_INSTANCE_DISABLE_OPACITY_MICROMAPS_EXT = 0x00000020,\n    VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_KHR = VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR,\n    VK_GEOMETRY_INSTANCE_TRIANGLE_CULL_DISABLE_BIT_NV = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR,\n    VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_NV = VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_KHR,\n    VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_NV = VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR,\n    VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_NV = VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_KHR,\n    VK_GEOMETRY_INSTANCE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkGeometryInstanceFlagBitsKHR;\ntypedef VkFlags VkGeometryInstanceFlagsKHR;\ntypedef VkGeometryInstanceFlagsKHR VkGeometryInstanceFlagsNV;\n\ntypedef VkGeometryInstanceFlagBitsKHR VkGeometryInstanceFlagBitsNV;\n\n\ntypedef enum VkBuildAccelerationStructureFlagBitsKHR {\n    VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR = 0x00000001,\n    VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR = 0x00000002,\n    VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR = 0x00000004,\n    VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR = 0x00000008,\n    VK_BUILD_ACCELERATION_STRUCTURE_LOW_MEMORY_BIT_KHR = 0x00000010,\n    VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV = 0x00000020,\n    VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_UPDATE_EXT = 0x00000040,\n    VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISABLE_OPACITY_MICROMAPS_EXT = 0x00000080,\n    VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_DATA_UPDATE_EXT = 0x00000100,\n#ifdef VK_ENABLE_BETA_EXTENSIONS\n    VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISPLACEMENT_MICROMAP_UPDATE_NV = 0x00000200,\n#endif\n    VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DATA_ACCESS_KHR = 0x00000800,\n    VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_NV = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR,\n    VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_NV = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR,\n    VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_NV = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR,\n    VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_NV = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR,\n    VK_BUILD_ACCELERATION_STRUCTURE_LOW_MEMORY_BIT_NV = VK_BUILD_ACCELERATION_STRUCTURE_LOW_MEMORY_BIT_KHR,\n    VK_BUILD_ACCELERATION_STRUCTURE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkBuildAccelerationStructureFlagBitsKHR;\ntypedef VkFlags VkBuildAccelerationStructureFlagsKHR;\ntypedef VkBuildAccelerationStructureFlagsKHR VkBuildAccelerationStructureFlagsNV;\n\ntypedef VkBuildAccelerationStructureFlagBitsKHR VkBuildAccelerationStructureFlagBitsNV;\n\ntypedef struct VkRayTracingShaderGroupCreateInfoNV {\n    VkStructureType                   sType;\n    const void*                       pNext;\n    VkRayTracingShaderGroupTypeKHR    type;\n    uint32_t                          generalShader;\n    uint32_t                          closestHitShader;\n    uint32_t                          anyHitShader;\n    uint32_t                          intersectionShader;\n} VkRayTracingShaderGroupCreateInfoNV;\n\ntypedef struct VkRayTracingPipelineCreateInfoNV {\n    VkStructureType                               sType;\n    const void*                                   pNext;\n    VkPipelineCreateFlags                         flags;\n    uint32_t                                      stageCount;\n    const VkPipelineShaderStageCreateInfo*        pStages;\n    uint32_t                                      groupCount;\n    const VkRayTracingShaderGroupCreateInfoNV*    pGroups;\n    uint32_t                                      maxRecursionDepth;\n    VkPipelineLayout                              layout;\n    VkPipeline                                    basePipelineHandle;\n    int32_t                                       basePipelineIndex;\n} VkRayTracingPipelineCreateInfoNV;\n\ntypedef struct VkGeometryTrianglesNV {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBuffer           vertexData;\n    VkDeviceSize       vertexOffset;\n    uint32_t           vertexCount;\n    VkDeviceSize       vertexStride;\n    VkFormat           vertexFormat;\n    VkBuffer           indexData;\n    VkDeviceSize       indexOffset;\n    uint32_t           indexCount;\n    VkIndexType        indexType;\n    VkBuffer           transformData;\n    VkDeviceSize       transformOffset;\n} VkGeometryTrianglesNV;\n\ntypedef struct VkGeometryAABBNV {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBuffer           aabbData;\n    uint32_t           numAABBs;\n    uint32_t           stride;\n    VkDeviceSize       offset;\n} VkGeometryAABBNV;\n\ntypedef struct VkGeometryDataNV {\n    VkGeometryTrianglesNV    triangles;\n    VkGeometryAABBNV         aabbs;\n} VkGeometryDataNV;\n\ntypedef struct VkGeometryNV {\n    VkStructureType       sType;\n    const void*           pNext;\n    VkGeometryTypeKHR     geometryType;\n    VkGeometryDataNV      geometry;\n    VkGeometryFlagsKHR    flags;\n} VkGeometryNV;\n\ntypedef struct VkAccelerationStructureInfoNV {\n    VkStructureType                        sType;\n    const void*                            pNext;\n    VkAccelerationStructureTypeNV          type;\n    VkBuildAccelerationStructureFlagsNV    flags;\n    uint32_t                               instanceCount;\n    uint32_t                               geometryCount;\n    const VkGeometryNV*                    pGeometries;\n} VkAccelerationStructureInfoNV;\n\ntypedef struct VkAccelerationStructureCreateInfoNV {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkDeviceSize                     compactedSize;\n    VkAccelerationStructureInfoNV    info;\n} VkAccelerationStructureCreateInfoNV;\n\ntypedef struct VkBindAccelerationStructureMemoryInfoNV {\n    VkStructureType              sType;\n    const void*                  pNext;\n    VkAccelerationStructureNV    accelerationStructure;\n    VkDeviceMemory               memory;\n    VkDeviceSize                 memoryOffset;\n    uint32_t                     deviceIndexCount;\n    const uint32_t*              pDeviceIndices;\n} VkBindAccelerationStructureMemoryInfoNV;\n\ntypedef struct VkWriteDescriptorSetAccelerationStructureNV {\n    VkStructureType                     sType;\n    const void*                         pNext;\n    uint32_t                            accelerationStructureCount;\n    const VkAccelerationStructureNV*    pAccelerationStructures;\n} VkWriteDescriptorSetAccelerationStructureNV;\n\ntypedef struct VkAccelerationStructureMemoryRequirementsInfoNV {\n    VkStructureType                                    sType;\n    const void*                                        pNext;\n    VkAccelerationStructureMemoryRequirementsTypeNV    type;\n    VkAccelerationStructureNV                          accelerationStructure;\n} VkAccelerationStructureMemoryRequirementsInfoNV;\n\ntypedef struct VkPhysicalDeviceRayTracingPropertiesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           shaderGroupHandleSize;\n    uint32_t           maxRecursionDepth;\n    uint32_t           maxShaderGroupStride;\n    uint32_t           shaderGroupBaseAlignment;\n    uint64_t           maxGeometryCount;\n    uint64_t           maxInstanceCount;\n    uint64_t           maxTriangleCount;\n    uint32_t           maxDescriptorSetAccelerationStructures;\n} VkPhysicalDeviceRayTracingPropertiesNV;\n\ntypedef struct VkTransformMatrixKHR {\n    float    matrix[3][4];\n} VkTransformMatrixKHR;\n\ntypedef VkTransformMatrixKHR VkTransformMatrixNV;\n\ntypedef struct VkAabbPositionsKHR {\n    float    minX;\n    float    minY;\n    float    minZ;\n    float    maxX;\n    float    maxY;\n    float    maxZ;\n} VkAabbPositionsKHR;\n\ntypedef VkAabbPositionsKHR VkAabbPositionsNV;\n\ntypedef struct VkAccelerationStructureInstanceKHR {\n    VkTransformMatrixKHR          transform;\n    uint32_t                      instanceCustomIndex:24;\n    uint32_t                      mask:8;\n    uint32_t                      instanceShaderBindingTableRecordOffset:24;\n    VkGeometryInstanceFlagsKHR    flags:8;\n    uint64_t                      accelerationStructureReference;\n} VkAccelerationStructureInstanceKHR;\n\ntypedef VkAccelerationStructureInstanceKHR VkAccelerationStructureInstanceNV;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateAccelerationStructureNV)(VkDevice device, const VkAccelerationStructureCreateInfoNV* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkAccelerationStructureNV* pAccelerationStructure);\ntypedef void (VKAPI_PTR *PFN_vkDestroyAccelerationStructureNV)(VkDevice device, VkAccelerationStructureNV accelerationStructure, const VkAllocationCallbacks* pAllocator);\ntypedef void (VKAPI_PTR *PFN_vkGetAccelerationStructureMemoryRequirementsNV)(VkDevice device, const VkAccelerationStructureMemoryRequirementsInfoNV* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements);\ntypedef VkResult (VKAPI_PTR *PFN_vkBindAccelerationStructureMemoryNV)(VkDevice device, uint32_t bindInfoCount, const VkBindAccelerationStructureMemoryInfoNV* pBindInfos);\ntypedef void (VKAPI_PTR *PFN_vkCmdBuildAccelerationStructureNV)(VkCommandBuffer commandBuffer, const VkAccelerationStructureInfoNV* pInfo, VkBuffer instanceData, VkDeviceSize instanceOffset, VkBool32 update, VkAccelerationStructureNV dst, VkAccelerationStructureNV src, VkBuffer scratch, VkDeviceSize scratchOffset);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyAccelerationStructureNV)(VkCommandBuffer commandBuffer, VkAccelerationStructureNV dst, VkAccelerationStructureNV src, VkCopyAccelerationStructureModeKHR mode);\ntypedef void (VKAPI_PTR *PFN_vkCmdTraceRaysNV)(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer, VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer, VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride, VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset, VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer, VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride, uint32_t width, uint32_t height, uint32_t depth);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateRayTracingPipelinesNV)(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkRayTracingPipelineCreateInfoNV* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetRayTracingShaderGroupHandlesKHR)(VkDevice device, VkPipeline pipeline, uint32_t firstGroup, uint32_t groupCount, size_t dataSize, void* pData);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetRayTracingShaderGroupHandlesNV)(VkDevice device, VkPipeline pipeline, uint32_t firstGroup, uint32_t groupCount, size_t dataSize, void* pData);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetAccelerationStructureHandleNV)(VkDevice device, VkAccelerationStructureNV accelerationStructure, size_t dataSize, void* pData);\ntypedef void (VKAPI_PTR *PFN_vkCmdWriteAccelerationStructuresPropertiesNV)(VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, const VkAccelerationStructureNV* pAccelerationStructures, VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery);\ntypedef VkResult (VKAPI_PTR *PFN_vkCompileDeferredNV)(VkDevice device, VkPipeline pipeline, uint32_t shader);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateAccelerationStructureNV(\n    VkDevice                                    device,\n    const VkAccelerationStructureCreateInfoNV*  pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkAccelerationStructureNV*                  pAccelerationStructure);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyAccelerationStructureNV(\n    VkDevice                                    device,\n    VkAccelerationStructureNV                   accelerationStructure,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR void VKAPI_CALL vkGetAccelerationStructureMemoryRequirementsNV(\n    VkDevice                                    device,\n    const VkAccelerationStructureMemoryRequirementsInfoNV* pInfo,\n    VkMemoryRequirements2KHR*                   pMemoryRequirements);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkBindAccelerationStructureMemoryNV(\n    VkDevice                                    device,\n    uint32_t                                    bindInfoCount,\n    const VkBindAccelerationStructureMemoryInfoNV* pBindInfos);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBuildAccelerationStructureNV(\n    VkCommandBuffer                             commandBuffer,\n    const VkAccelerationStructureInfoNV*        pInfo,\n    VkBuffer                                    instanceData,\n    VkDeviceSize                                instanceOffset,\n    VkBool32                                    update,\n    VkAccelerationStructureNV                   dst,\n    VkAccelerationStructureNV                   src,\n    VkBuffer                                    scratch,\n    VkDeviceSize                                scratchOffset);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyAccelerationStructureNV(\n    VkCommandBuffer                             commandBuffer,\n    VkAccelerationStructureNV                   dst,\n    VkAccelerationStructureNV                   src,\n    VkCopyAccelerationStructureModeKHR          mode);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdTraceRaysNV(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    raygenShaderBindingTableBuffer,\n    VkDeviceSize                                raygenShaderBindingOffset,\n    VkBuffer                                    missShaderBindingTableBuffer,\n    VkDeviceSize                                missShaderBindingOffset,\n    VkDeviceSize                                missShaderBindingStride,\n    VkBuffer                                    hitShaderBindingTableBuffer,\n    VkDeviceSize                                hitShaderBindingOffset,\n    VkDeviceSize                                hitShaderBindingStride,\n    VkBuffer                                    callableShaderBindingTableBuffer,\n    VkDeviceSize                                callableShaderBindingOffset,\n    VkDeviceSize                                callableShaderBindingStride,\n    uint32_t                                    width,\n    uint32_t                                    height,\n    uint32_t                                    depth);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateRayTracingPipelinesNV(\n    VkDevice                                    device,\n    VkPipelineCache                             pipelineCache,\n    uint32_t                                    createInfoCount,\n    const VkRayTracingPipelineCreateInfoNV*     pCreateInfos,\n    const VkAllocationCallbacks*                pAllocator,\n    VkPipeline*                                 pPipelines);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetRayTracingShaderGroupHandlesKHR(\n    VkDevice                                    device,\n    VkPipeline                                  pipeline,\n    uint32_t                                    firstGroup,\n    uint32_t                                    groupCount,\n    size_t                                      dataSize,\n    void*                                       pData);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetRayTracingShaderGroupHandlesNV(\n    VkDevice                                    device,\n    VkPipeline                                  pipeline,\n    uint32_t                                    firstGroup,\n    uint32_t                                    groupCount,\n    size_t                                      dataSize,\n    void*                                       pData);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetAccelerationStructureHandleNV(\n    VkDevice                                    device,\n    VkAccelerationStructureNV                   accelerationStructure,\n    size_t                                      dataSize,\n    void*                                       pData);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdWriteAccelerationStructuresPropertiesNV(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    accelerationStructureCount,\n    const VkAccelerationStructureNV*            pAccelerationStructures,\n    VkQueryType                                 queryType,\n    VkQueryPool                                 queryPool,\n    uint32_t                                    firstQuery);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCompileDeferredNV(\n    VkDevice                                    device,\n    VkPipeline                                  pipeline,\n    uint32_t                                    shader);\n#endif\n\n\n// VK_NV_representative_fragment_test is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_representative_fragment_test 1\n#define VK_NV_REPRESENTATIVE_FRAGMENT_TEST_SPEC_VERSION 2\n#define VK_NV_REPRESENTATIVE_FRAGMENT_TEST_EXTENSION_NAME \"VK_NV_representative_fragment_test\"\ntypedef struct VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           representativeFragmentTest;\n} VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV;\n\ntypedef struct VkPipelineRepresentativeFragmentTestStateCreateInfoNV {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           representativeFragmentTestEnable;\n} VkPipelineRepresentativeFragmentTestStateCreateInfoNV;\n\n\n\n// VK_EXT_filter_cubic is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_filter_cubic 1\n#define VK_EXT_FILTER_CUBIC_SPEC_VERSION  3\n#define VK_EXT_FILTER_CUBIC_EXTENSION_NAME \"VK_EXT_filter_cubic\"\ntypedef struct VkPhysicalDeviceImageViewImageFormatInfoEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkImageViewType    imageViewType;\n} VkPhysicalDeviceImageViewImageFormatInfoEXT;\n\ntypedef struct VkFilterCubicImageViewImageFormatPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           filterCubic;\n    VkBool32           filterCubicMinmax;\n} VkFilterCubicImageViewImageFormatPropertiesEXT;\n\n\n\n// VK_QCOM_render_pass_shader_resolve is a preprocessor guard. Do not pass it to API calls.\n#define VK_QCOM_render_pass_shader_resolve 1\n#define VK_QCOM_RENDER_PASS_SHADER_RESOLVE_SPEC_VERSION 4\n#define VK_QCOM_RENDER_PASS_SHADER_RESOLVE_EXTENSION_NAME \"VK_QCOM_render_pass_shader_resolve\"\n\n\n// VK_EXT_global_priority is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_global_priority 1\n#define VK_EXT_GLOBAL_PRIORITY_SPEC_VERSION 2\n#define VK_EXT_GLOBAL_PRIORITY_EXTENSION_NAME \"VK_EXT_global_priority\"\ntypedef VkQueueGlobalPriority VkQueueGlobalPriorityEXT;\n\ntypedef VkDeviceQueueGlobalPriorityCreateInfo VkDeviceQueueGlobalPriorityCreateInfoEXT;\n\n\n\n// VK_EXT_external_memory_host is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_external_memory_host 1\n#define VK_EXT_EXTERNAL_MEMORY_HOST_SPEC_VERSION 1\n#define VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME \"VK_EXT_external_memory_host\"\ntypedef struct VkImportMemoryHostPointerInfoEXT {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkExternalMemoryHandleTypeFlagBits    handleType;\n    void*                                 pHostPointer;\n} VkImportMemoryHostPointerInfoEXT;\n\ntypedef struct VkMemoryHostPointerPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           memoryTypeBits;\n} VkMemoryHostPointerPropertiesEXT;\n\ntypedef struct VkPhysicalDeviceExternalMemoryHostPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkDeviceSize       minImportedHostPointerAlignment;\n} VkPhysicalDeviceExternalMemoryHostPropertiesEXT;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetMemoryHostPointerPropertiesEXT)(VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, const void* pHostPointer, VkMemoryHostPointerPropertiesEXT* pMemoryHostPointerProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryHostPointerPropertiesEXT(\n    VkDevice                                    device,\n    VkExternalMemoryHandleTypeFlagBits          handleType,\n    const void*                                 pHostPointer,\n    VkMemoryHostPointerPropertiesEXT*           pMemoryHostPointerProperties);\n#endif\n\n\n// VK_AMD_buffer_marker is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMD_buffer_marker 1\n#define VK_AMD_BUFFER_MARKER_SPEC_VERSION 1\n#define VK_AMD_BUFFER_MARKER_EXTENSION_NAME \"VK_AMD_buffer_marker\"\ntypedef void (VKAPI_PTR *PFN_vkCmdWriteBufferMarkerAMD)(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker);\ntypedef void (VKAPI_PTR *PFN_vkCmdWriteBufferMarker2AMD)(VkCommandBuffer                   commandBuffer, VkPipelineStageFlags2               stage, VkBuffer                                            dstBuffer, VkDeviceSize                                        dstOffset, uint32_t                                            marker);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdWriteBufferMarkerAMD(\n    VkCommandBuffer                             commandBuffer,\n    VkPipelineStageFlagBits                     pipelineStage,\n    VkBuffer                                    dstBuffer,\n    VkDeviceSize                                dstOffset,\n    uint32_t                                    marker);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdWriteBufferMarker2AMD(\n    VkCommandBuffer                             commandBuffer,\n    VkPipelineStageFlags2                       stage,\n    VkBuffer                                    dstBuffer,\n    VkDeviceSize                                dstOffset,\n    uint32_t                                    marker);\n#endif\n\n\n// VK_AMD_pipeline_compiler_control is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMD_pipeline_compiler_control 1\n#define VK_AMD_PIPELINE_COMPILER_CONTROL_SPEC_VERSION 1\n#define VK_AMD_PIPELINE_COMPILER_CONTROL_EXTENSION_NAME \"VK_AMD_pipeline_compiler_control\"\n\ntypedef enum VkPipelineCompilerControlFlagBitsAMD {\n    VK_PIPELINE_COMPILER_CONTROL_FLAG_BITS_MAX_ENUM_AMD = 0x7FFFFFFF\n} VkPipelineCompilerControlFlagBitsAMD;\ntypedef VkFlags VkPipelineCompilerControlFlagsAMD;\ntypedef struct VkPipelineCompilerControlCreateInfoAMD {\n    VkStructureType                      sType;\n    const void*                          pNext;\n    VkPipelineCompilerControlFlagsAMD    compilerControlFlags;\n} VkPipelineCompilerControlCreateInfoAMD;\n\n\n\n// VK_EXT_calibrated_timestamps is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_calibrated_timestamps 1\n#define VK_EXT_CALIBRATED_TIMESTAMPS_SPEC_VERSION 2\n#define VK_EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME \"VK_EXT_calibrated_timestamps\"\ntypedef VkTimeDomainKHR VkTimeDomainEXT;\n\ntypedef VkCalibratedTimestampInfoKHR VkCalibratedTimestampInfoEXT;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT)(VkPhysicalDevice physicalDevice, uint32_t* pTimeDomainCount, VkTimeDomainKHR* pTimeDomains);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetCalibratedTimestampsEXT)(VkDevice device, uint32_t timestampCount, const VkCalibratedTimestampInfoKHR* pTimestampInfos, uint64_t* pTimestamps, uint64_t* pMaxDeviation);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t*                                   pTimeDomainCount,\n    VkTimeDomainKHR*                            pTimeDomains);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetCalibratedTimestampsEXT(\n    VkDevice                                    device,\n    uint32_t                                    timestampCount,\n    const VkCalibratedTimestampInfoKHR*         pTimestampInfos,\n    uint64_t*                                   pTimestamps,\n    uint64_t*                                   pMaxDeviation);\n#endif\n\n\n// VK_AMD_shader_core_properties is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMD_shader_core_properties 1\n#define VK_AMD_SHADER_CORE_PROPERTIES_SPEC_VERSION 2\n#define VK_AMD_SHADER_CORE_PROPERTIES_EXTENSION_NAME \"VK_AMD_shader_core_properties\"\ntypedef struct VkPhysicalDeviceShaderCorePropertiesAMD {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           shaderEngineCount;\n    uint32_t           shaderArraysPerEngineCount;\n    uint32_t           computeUnitsPerShaderArray;\n    uint32_t           simdPerComputeUnit;\n    uint32_t           wavefrontsPerSimd;\n    uint32_t           wavefrontSize;\n    uint32_t           sgprsPerSimd;\n    uint32_t           minSgprAllocation;\n    uint32_t           maxSgprAllocation;\n    uint32_t           sgprAllocationGranularity;\n    uint32_t           vgprsPerSimd;\n    uint32_t           minVgprAllocation;\n    uint32_t           maxVgprAllocation;\n    uint32_t           vgprAllocationGranularity;\n} VkPhysicalDeviceShaderCorePropertiesAMD;\n\n\n\n// VK_AMD_memory_overallocation_behavior is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMD_memory_overallocation_behavior 1\n#define VK_AMD_MEMORY_OVERALLOCATION_BEHAVIOR_SPEC_VERSION 1\n#define VK_AMD_MEMORY_OVERALLOCATION_BEHAVIOR_EXTENSION_NAME \"VK_AMD_memory_overallocation_behavior\"\n\ntypedef enum VkMemoryOverallocationBehaviorAMD {\n    VK_MEMORY_OVERALLOCATION_BEHAVIOR_DEFAULT_AMD = 0,\n    VK_MEMORY_OVERALLOCATION_BEHAVIOR_ALLOWED_AMD = 1,\n    VK_MEMORY_OVERALLOCATION_BEHAVIOR_DISALLOWED_AMD = 2,\n    VK_MEMORY_OVERALLOCATION_BEHAVIOR_MAX_ENUM_AMD = 0x7FFFFFFF\n} VkMemoryOverallocationBehaviorAMD;\ntypedef struct VkDeviceMemoryOverallocationCreateInfoAMD {\n    VkStructureType                      sType;\n    const void*                          pNext;\n    VkMemoryOverallocationBehaviorAMD    overallocationBehavior;\n} VkDeviceMemoryOverallocationCreateInfoAMD;\n\n\n\n// VK_EXT_vertex_attribute_divisor is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_vertex_attribute_divisor 1\n#define VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION 3\n#define VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME \"VK_EXT_vertex_attribute_divisor\"\ntypedef struct VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxVertexAttribDivisor;\n} VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT;\n\ntypedef VkVertexInputBindingDivisorDescription VkVertexInputBindingDivisorDescriptionEXT;\n\ntypedef VkPipelineVertexInputDivisorStateCreateInfo VkPipelineVertexInputDivisorStateCreateInfoEXT;\n\ntypedef VkPhysicalDeviceVertexAttributeDivisorFeatures VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT;\n\n\n\n// VK_EXT_pipeline_creation_feedback is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_pipeline_creation_feedback 1\n#define VK_EXT_PIPELINE_CREATION_FEEDBACK_SPEC_VERSION 1\n#define VK_EXT_PIPELINE_CREATION_FEEDBACK_EXTENSION_NAME \"VK_EXT_pipeline_creation_feedback\"\ntypedef VkPipelineCreationFeedbackFlagBits VkPipelineCreationFeedbackFlagBitsEXT;\n\ntypedef VkPipelineCreationFeedbackFlags VkPipelineCreationFeedbackFlagsEXT;\n\ntypedef VkPipelineCreationFeedbackCreateInfo VkPipelineCreationFeedbackCreateInfoEXT;\n\ntypedef VkPipelineCreationFeedback VkPipelineCreationFeedbackEXT;\n\n\n\n// VK_NV_shader_subgroup_partitioned is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_shader_subgroup_partitioned 1\n#define VK_NV_SHADER_SUBGROUP_PARTITIONED_SPEC_VERSION 1\n#define VK_NV_SHADER_SUBGROUP_PARTITIONED_EXTENSION_NAME \"VK_NV_shader_subgroup_partitioned\"\n\n\n// VK_NV_compute_shader_derivatives is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_compute_shader_derivatives 1\n#define VK_NV_COMPUTE_SHADER_DERIVATIVES_SPEC_VERSION 1\n#define VK_NV_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME \"VK_NV_compute_shader_derivatives\"\ntypedef VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR VkPhysicalDeviceComputeShaderDerivativesFeaturesNV;\n\n\n\n// VK_NV_mesh_shader is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_mesh_shader 1\n#define VK_NV_MESH_SHADER_SPEC_VERSION    1\n#define VK_NV_MESH_SHADER_EXTENSION_NAME  \"VK_NV_mesh_shader\"\ntypedef struct VkPhysicalDeviceMeshShaderFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           taskShader;\n    VkBool32           meshShader;\n} VkPhysicalDeviceMeshShaderFeaturesNV;\n\ntypedef struct VkPhysicalDeviceMeshShaderPropertiesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxDrawMeshTasksCount;\n    uint32_t           maxTaskWorkGroupInvocations;\n    uint32_t           maxTaskWorkGroupSize[3];\n    uint32_t           maxTaskTotalMemorySize;\n    uint32_t           maxTaskOutputCount;\n    uint32_t           maxMeshWorkGroupInvocations;\n    uint32_t           maxMeshWorkGroupSize[3];\n    uint32_t           maxMeshTotalMemorySize;\n    uint32_t           maxMeshOutputVertices;\n    uint32_t           maxMeshOutputPrimitives;\n    uint32_t           maxMeshMultiviewViewCount;\n    uint32_t           meshOutputPerVertexGranularity;\n    uint32_t           meshOutputPerPrimitiveGranularity;\n} VkPhysicalDeviceMeshShaderPropertiesNV;\n\ntypedef struct VkDrawMeshTasksIndirectCommandNV {\n    uint32_t    taskCount;\n    uint32_t    firstTask;\n} VkDrawMeshTasksIndirectCommandNV;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawMeshTasksNV)(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask);\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawMeshTasksIndirectNV)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride);\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawMeshTasksIndirectCountNV)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawMeshTasksNV(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    taskCount,\n    uint32_t                                    firstTask);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawMeshTasksIndirectNV(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    buffer,\n    VkDeviceSize                                offset,\n    uint32_t                                    drawCount,\n    uint32_t                                    stride);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawMeshTasksIndirectCountNV(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    buffer,\n    VkDeviceSize                                offset,\n    VkBuffer                                    countBuffer,\n    VkDeviceSize                                countBufferOffset,\n    uint32_t                                    maxDrawCount,\n    uint32_t                                    stride);\n#endif\n\n\n// VK_NV_fragment_shader_barycentric is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_fragment_shader_barycentric 1\n#define VK_NV_FRAGMENT_SHADER_BARYCENTRIC_SPEC_VERSION 1\n#define VK_NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME \"VK_NV_fragment_shader_barycentric\"\ntypedef VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV;\n\n\n\n// VK_NV_shader_image_footprint is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_shader_image_footprint 1\n#define VK_NV_SHADER_IMAGE_FOOTPRINT_SPEC_VERSION 2\n#define VK_NV_SHADER_IMAGE_FOOTPRINT_EXTENSION_NAME \"VK_NV_shader_image_footprint\"\ntypedef struct VkPhysicalDeviceShaderImageFootprintFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           imageFootprint;\n} VkPhysicalDeviceShaderImageFootprintFeaturesNV;\n\n\n\n// VK_NV_scissor_exclusive is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_scissor_exclusive 1\n#define VK_NV_SCISSOR_EXCLUSIVE_SPEC_VERSION 2\n#define VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME \"VK_NV_scissor_exclusive\"\ntypedef struct VkPipelineViewportExclusiveScissorStateCreateInfoNV {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           exclusiveScissorCount;\n    const VkRect2D*    pExclusiveScissors;\n} VkPipelineViewportExclusiveScissorStateCreateInfoNV;\n\ntypedef struct VkPhysicalDeviceExclusiveScissorFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           exclusiveScissor;\n} VkPhysicalDeviceExclusiveScissorFeaturesNV;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdSetExclusiveScissorEnableNV)(VkCommandBuffer commandBuffer, uint32_t firstExclusiveScissor, uint32_t exclusiveScissorCount, const VkBool32* pExclusiveScissorEnables);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetExclusiveScissorNV)(VkCommandBuffer commandBuffer, uint32_t firstExclusiveScissor, uint32_t exclusiveScissorCount, const VkRect2D* pExclusiveScissors);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdSetExclusiveScissorEnableNV(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    firstExclusiveScissor,\n    uint32_t                                    exclusiveScissorCount,\n    const VkBool32*                             pExclusiveScissorEnables);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetExclusiveScissorNV(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    firstExclusiveScissor,\n    uint32_t                                    exclusiveScissorCount,\n    const VkRect2D*                             pExclusiveScissors);\n#endif\n\n\n// VK_NV_device_diagnostic_checkpoints is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_device_diagnostic_checkpoints 1\n#define VK_NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_SPEC_VERSION 2\n#define VK_NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_EXTENSION_NAME \"VK_NV_device_diagnostic_checkpoints\"\ntypedef struct VkQueueFamilyCheckpointPropertiesNV {\n    VkStructureType         sType;\n    void*                   pNext;\n    VkPipelineStageFlags    checkpointExecutionStageMask;\n} VkQueueFamilyCheckpointPropertiesNV;\n\ntypedef struct VkCheckpointDataNV {\n    VkStructureType            sType;\n    void*                      pNext;\n    VkPipelineStageFlagBits    stage;\n    void*                      pCheckpointMarker;\n} VkCheckpointDataNV;\n\ntypedef struct VkQueueFamilyCheckpointProperties2NV {\n    VkStructureType          sType;\n    void*                    pNext;\n    VkPipelineStageFlags2    checkpointExecutionStageMask;\n} VkQueueFamilyCheckpointProperties2NV;\n\ntypedef struct VkCheckpointData2NV {\n    VkStructureType          sType;\n    void*                    pNext;\n    VkPipelineStageFlags2    stage;\n    void*                    pCheckpointMarker;\n} VkCheckpointData2NV;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdSetCheckpointNV)(VkCommandBuffer commandBuffer, const void* pCheckpointMarker);\ntypedef void (VKAPI_PTR *PFN_vkGetQueueCheckpointDataNV)(VkQueue queue, uint32_t* pCheckpointDataCount, VkCheckpointDataNV* pCheckpointData);\ntypedef void (VKAPI_PTR *PFN_vkGetQueueCheckpointData2NV)(VkQueue queue, uint32_t* pCheckpointDataCount, VkCheckpointData2NV* pCheckpointData);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdSetCheckpointNV(\n    VkCommandBuffer                             commandBuffer,\n    const void*                                 pCheckpointMarker);\n\nVKAPI_ATTR void VKAPI_CALL vkGetQueueCheckpointDataNV(\n    VkQueue                                     queue,\n    uint32_t*                                   pCheckpointDataCount,\n    VkCheckpointDataNV*                         pCheckpointData);\n\nVKAPI_ATTR void VKAPI_CALL vkGetQueueCheckpointData2NV(\n    VkQueue                                     queue,\n    uint32_t*                                   pCheckpointDataCount,\n    VkCheckpointData2NV*                        pCheckpointData);\n#endif\n\n\n// VK_INTEL_shader_integer_functions2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_INTEL_shader_integer_functions2 1\n#define VK_INTEL_SHADER_INTEGER_FUNCTIONS_2_SPEC_VERSION 1\n#define VK_INTEL_SHADER_INTEGER_FUNCTIONS_2_EXTENSION_NAME \"VK_INTEL_shader_integer_functions2\"\ntypedef struct VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderIntegerFunctions2;\n} VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL;\n\n\n\n// VK_INTEL_performance_query is a preprocessor guard. Do not pass it to API calls.\n#define VK_INTEL_performance_query 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPerformanceConfigurationINTEL)\n#define VK_INTEL_PERFORMANCE_QUERY_SPEC_VERSION 2\n#define VK_INTEL_PERFORMANCE_QUERY_EXTENSION_NAME \"VK_INTEL_performance_query\"\n\ntypedef enum VkPerformanceConfigurationTypeINTEL {\n    VK_PERFORMANCE_CONFIGURATION_TYPE_COMMAND_QUEUE_METRICS_DISCOVERY_ACTIVATED_INTEL = 0,\n    VK_PERFORMANCE_CONFIGURATION_TYPE_MAX_ENUM_INTEL = 0x7FFFFFFF\n} VkPerformanceConfigurationTypeINTEL;\n\ntypedef enum VkQueryPoolSamplingModeINTEL {\n    VK_QUERY_POOL_SAMPLING_MODE_MANUAL_INTEL = 0,\n    VK_QUERY_POOL_SAMPLING_MODE_MAX_ENUM_INTEL = 0x7FFFFFFF\n} VkQueryPoolSamplingModeINTEL;\n\ntypedef enum VkPerformanceOverrideTypeINTEL {\n    VK_PERFORMANCE_OVERRIDE_TYPE_NULL_HARDWARE_INTEL = 0,\n    VK_PERFORMANCE_OVERRIDE_TYPE_FLUSH_GPU_CACHES_INTEL = 1,\n    VK_PERFORMANCE_OVERRIDE_TYPE_MAX_ENUM_INTEL = 0x7FFFFFFF\n} VkPerformanceOverrideTypeINTEL;\n\ntypedef enum VkPerformanceParameterTypeINTEL {\n    VK_PERFORMANCE_PARAMETER_TYPE_HW_COUNTERS_SUPPORTED_INTEL = 0,\n    VK_PERFORMANCE_PARAMETER_TYPE_STREAM_MARKER_VALID_BITS_INTEL = 1,\n    VK_PERFORMANCE_PARAMETER_TYPE_MAX_ENUM_INTEL = 0x7FFFFFFF\n} VkPerformanceParameterTypeINTEL;\n\ntypedef enum VkPerformanceValueTypeINTEL {\n    VK_PERFORMANCE_VALUE_TYPE_UINT32_INTEL = 0,\n    VK_PERFORMANCE_VALUE_TYPE_UINT64_INTEL = 1,\n    VK_PERFORMANCE_VALUE_TYPE_FLOAT_INTEL = 2,\n    VK_PERFORMANCE_VALUE_TYPE_BOOL_INTEL = 3,\n    VK_PERFORMANCE_VALUE_TYPE_STRING_INTEL = 4,\n    VK_PERFORMANCE_VALUE_TYPE_MAX_ENUM_INTEL = 0x7FFFFFFF\n} VkPerformanceValueTypeINTEL;\ntypedef union VkPerformanceValueDataINTEL {\n    uint32_t       value32;\n    uint64_t       value64;\n    float          valueFloat;\n    VkBool32       valueBool;\n    const char*    valueString;\n} VkPerformanceValueDataINTEL;\n\ntypedef struct VkPerformanceValueINTEL {\n    VkPerformanceValueTypeINTEL    type;\n    VkPerformanceValueDataINTEL    data;\n} VkPerformanceValueINTEL;\n\ntypedef struct VkInitializePerformanceApiInfoINTEL {\n    VkStructureType    sType;\n    const void*        pNext;\n    void*              pUserData;\n} VkInitializePerformanceApiInfoINTEL;\n\ntypedef struct VkQueryPoolPerformanceQueryCreateInfoINTEL {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    VkQueryPoolSamplingModeINTEL    performanceCountersSampling;\n} VkQueryPoolPerformanceQueryCreateInfoINTEL;\n\ntypedef VkQueryPoolPerformanceQueryCreateInfoINTEL VkQueryPoolCreateInfoINTEL;\n\ntypedef struct VkPerformanceMarkerInfoINTEL {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint64_t           marker;\n} VkPerformanceMarkerInfoINTEL;\n\ntypedef struct VkPerformanceStreamMarkerInfoINTEL {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           marker;\n} VkPerformanceStreamMarkerInfoINTEL;\n\ntypedef struct VkPerformanceOverrideInfoINTEL {\n    VkStructureType                   sType;\n    const void*                       pNext;\n    VkPerformanceOverrideTypeINTEL    type;\n    VkBool32                          enable;\n    uint64_t                          parameter;\n} VkPerformanceOverrideInfoINTEL;\n\ntypedef struct VkPerformanceConfigurationAcquireInfoINTEL {\n    VkStructureType                        sType;\n    const void*                            pNext;\n    VkPerformanceConfigurationTypeINTEL    type;\n} VkPerformanceConfigurationAcquireInfoINTEL;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkInitializePerformanceApiINTEL)(VkDevice device, const VkInitializePerformanceApiInfoINTEL* pInitializeInfo);\ntypedef void (VKAPI_PTR *PFN_vkUninitializePerformanceApiINTEL)(VkDevice device);\ntypedef VkResult (VKAPI_PTR *PFN_vkCmdSetPerformanceMarkerINTEL)(VkCommandBuffer commandBuffer, const VkPerformanceMarkerInfoINTEL* pMarkerInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkCmdSetPerformanceStreamMarkerINTEL)(VkCommandBuffer commandBuffer, const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkCmdSetPerformanceOverrideINTEL)(VkCommandBuffer commandBuffer, const VkPerformanceOverrideInfoINTEL* pOverrideInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkAcquirePerformanceConfigurationINTEL)(VkDevice device, const VkPerformanceConfigurationAcquireInfoINTEL* pAcquireInfo, VkPerformanceConfigurationINTEL* pConfiguration);\ntypedef VkResult (VKAPI_PTR *PFN_vkReleasePerformanceConfigurationINTEL)(VkDevice device, VkPerformanceConfigurationINTEL configuration);\ntypedef VkResult (VKAPI_PTR *PFN_vkQueueSetPerformanceConfigurationINTEL)(VkQueue queue, VkPerformanceConfigurationINTEL configuration);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPerformanceParameterINTEL)(VkDevice device, VkPerformanceParameterTypeINTEL parameter, VkPerformanceValueINTEL* pValue);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkInitializePerformanceApiINTEL(\n    VkDevice                                    device,\n    const VkInitializePerformanceApiInfoINTEL*  pInitializeInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkUninitializePerformanceApiINTEL(\n    VkDevice                                    device);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCmdSetPerformanceMarkerINTEL(\n    VkCommandBuffer                             commandBuffer,\n    const VkPerformanceMarkerInfoINTEL*         pMarkerInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCmdSetPerformanceStreamMarkerINTEL(\n    VkCommandBuffer                             commandBuffer,\n    const VkPerformanceStreamMarkerInfoINTEL*   pMarkerInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCmdSetPerformanceOverrideINTEL(\n    VkCommandBuffer                             commandBuffer,\n    const VkPerformanceOverrideInfoINTEL*       pOverrideInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkAcquirePerformanceConfigurationINTEL(\n    VkDevice                                    device,\n    const VkPerformanceConfigurationAcquireInfoINTEL* pAcquireInfo,\n    VkPerformanceConfigurationINTEL*            pConfiguration);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkReleasePerformanceConfigurationINTEL(\n    VkDevice                                    device,\n    VkPerformanceConfigurationINTEL             configuration);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkQueueSetPerformanceConfigurationINTEL(\n    VkQueue                                     queue,\n    VkPerformanceConfigurationINTEL             configuration);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPerformanceParameterINTEL(\n    VkDevice                                    device,\n    VkPerformanceParameterTypeINTEL             parameter,\n    VkPerformanceValueINTEL*                    pValue);\n#endif\n\n\n// VK_EXT_pci_bus_info is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_pci_bus_info 1\n#define VK_EXT_PCI_BUS_INFO_SPEC_VERSION  2\n#define VK_EXT_PCI_BUS_INFO_EXTENSION_NAME \"VK_EXT_pci_bus_info\"\ntypedef struct VkPhysicalDevicePCIBusInfoPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           pciDomain;\n    uint32_t           pciBus;\n    uint32_t           pciDevice;\n    uint32_t           pciFunction;\n} VkPhysicalDevicePCIBusInfoPropertiesEXT;\n\n\n\n// VK_AMD_display_native_hdr is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMD_display_native_hdr 1\n#define VK_AMD_DISPLAY_NATIVE_HDR_SPEC_VERSION 1\n#define VK_AMD_DISPLAY_NATIVE_HDR_EXTENSION_NAME \"VK_AMD_display_native_hdr\"\ntypedef struct VkDisplayNativeHdrSurfaceCapabilitiesAMD {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           localDimmingSupport;\n} VkDisplayNativeHdrSurfaceCapabilitiesAMD;\n\ntypedef struct VkSwapchainDisplayNativeHdrCreateInfoAMD {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           localDimmingEnable;\n} VkSwapchainDisplayNativeHdrCreateInfoAMD;\n\ntypedef void (VKAPI_PTR *PFN_vkSetLocalDimmingAMD)(VkDevice device, VkSwapchainKHR swapChain, VkBool32 localDimmingEnable);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkSetLocalDimmingAMD(\n    VkDevice                                    device,\n    VkSwapchainKHR                              swapChain,\n    VkBool32                                    localDimmingEnable);\n#endif\n\n\n// VK_EXT_fragment_density_map is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_fragment_density_map 1\n#define VK_EXT_FRAGMENT_DENSITY_MAP_SPEC_VERSION 2\n#define VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME \"VK_EXT_fragment_density_map\"\ntypedef struct VkPhysicalDeviceFragmentDensityMapFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           fragmentDensityMap;\n    VkBool32           fragmentDensityMapDynamic;\n    VkBool32           fragmentDensityMapNonSubsampledImages;\n} VkPhysicalDeviceFragmentDensityMapFeaturesEXT;\n\ntypedef struct VkPhysicalDeviceFragmentDensityMapPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkExtent2D         minFragmentDensityTexelSize;\n    VkExtent2D         maxFragmentDensityTexelSize;\n    VkBool32           fragmentDensityInvocations;\n} VkPhysicalDeviceFragmentDensityMapPropertiesEXT;\n\ntypedef struct VkRenderPassFragmentDensityMapCreateInfoEXT {\n    VkStructureType          sType;\n    const void*              pNext;\n    VkAttachmentReference    fragmentDensityMapAttachment;\n} VkRenderPassFragmentDensityMapCreateInfoEXT;\n\ntypedef struct VkRenderingFragmentDensityMapAttachmentInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkImageView        imageView;\n    VkImageLayout      imageLayout;\n} VkRenderingFragmentDensityMapAttachmentInfoEXT;\n\n\n\n// VK_EXT_scalar_block_layout is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_scalar_block_layout 1\n#define VK_EXT_SCALAR_BLOCK_LAYOUT_SPEC_VERSION 1\n#define VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME \"VK_EXT_scalar_block_layout\"\ntypedef VkPhysicalDeviceScalarBlockLayoutFeatures VkPhysicalDeviceScalarBlockLayoutFeaturesEXT;\n\n\n\n// VK_GOOGLE_hlsl_functionality1 is a preprocessor guard. Do not pass it to API calls.\n#define VK_GOOGLE_hlsl_functionality1 1\n#define VK_GOOGLE_HLSL_FUNCTIONALITY_1_SPEC_VERSION 1\n#define VK_GOOGLE_HLSL_FUNCTIONALITY_1_EXTENSION_NAME \"VK_GOOGLE_hlsl_functionality1\"\n// VK_GOOGLE_HLSL_FUNCTIONALITY1_SPEC_VERSION is a deprecated alias\n#define VK_GOOGLE_HLSL_FUNCTIONALITY1_SPEC_VERSION VK_GOOGLE_HLSL_FUNCTIONALITY_1_SPEC_VERSION\n// VK_GOOGLE_HLSL_FUNCTIONALITY1_EXTENSION_NAME is a deprecated alias\n#define VK_GOOGLE_HLSL_FUNCTIONALITY1_EXTENSION_NAME VK_GOOGLE_HLSL_FUNCTIONALITY_1_EXTENSION_NAME\n\n\n// VK_GOOGLE_decorate_string is a preprocessor guard. Do not pass it to API calls.\n#define VK_GOOGLE_decorate_string 1\n#define VK_GOOGLE_DECORATE_STRING_SPEC_VERSION 1\n#define VK_GOOGLE_DECORATE_STRING_EXTENSION_NAME \"VK_GOOGLE_decorate_string\"\n\n\n// VK_EXT_subgroup_size_control is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_subgroup_size_control 1\n#define VK_EXT_SUBGROUP_SIZE_CONTROL_SPEC_VERSION 2\n#define VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME \"VK_EXT_subgroup_size_control\"\ntypedef VkPhysicalDeviceSubgroupSizeControlFeatures VkPhysicalDeviceSubgroupSizeControlFeaturesEXT;\n\ntypedef VkPhysicalDeviceSubgroupSizeControlProperties VkPhysicalDeviceSubgroupSizeControlPropertiesEXT;\n\ntypedef VkPipelineShaderStageRequiredSubgroupSizeCreateInfo VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT;\n\n\n\n// VK_AMD_shader_core_properties2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMD_shader_core_properties2 1\n#define VK_AMD_SHADER_CORE_PROPERTIES_2_SPEC_VERSION 1\n#define VK_AMD_SHADER_CORE_PROPERTIES_2_EXTENSION_NAME \"VK_AMD_shader_core_properties2\"\n\ntypedef enum VkShaderCorePropertiesFlagBitsAMD {\n    VK_SHADER_CORE_PROPERTIES_FLAG_BITS_MAX_ENUM_AMD = 0x7FFFFFFF\n} VkShaderCorePropertiesFlagBitsAMD;\ntypedef VkFlags VkShaderCorePropertiesFlagsAMD;\ntypedef struct VkPhysicalDeviceShaderCoreProperties2AMD {\n    VkStructureType                   sType;\n    void*                             pNext;\n    VkShaderCorePropertiesFlagsAMD    shaderCoreFeatures;\n    uint32_t                          activeComputeUnitCount;\n} VkPhysicalDeviceShaderCoreProperties2AMD;\n\n\n\n// VK_AMD_device_coherent_memory is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMD_device_coherent_memory 1\n#define VK_AMD_DEVICE_COHERENT_MEMORY_SPEC_VERSION 1\n#define VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME \"VK_AMD_device_coherent_memory\"\ntypedef struct VkPhysicalDeviceCoherentMemoryFeaturesAMD {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           deviceCoherentMemory;\n} VkPhysicalDeviceCoherentMemoryFeaturesAMD;\n\n\n\n// VK_EXT_shader_image_atomic_int64 is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_shader_image_atomic_int64 1\n#define VK_EXT_SHADER_IMAGE_ATOMIC_INT64_SPEC_VERSION 1\n#define VK_EXT_SHADER_IMAGE_ATOMIC_INT64_EXTENSION_NAME \"VK_EXT_shader_image_atomic_int64\"\ntypedef struct VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderImageInt64Atomics;\n    VkBool32           sparseImageInt64Atomics;\n} VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT;\n\n\n\n// VK_EXT_memory_budget is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_memory_budget 1\n#define VK_EXT_MEMORY_BUDGET_SPEC_VERSION 1\n#define VK_EXT_MEMORY_BUDGET_EXTENSION_NAME \"VK_EXT_memory_budget\"\ntypedef struct VkPhysicalDeviceMemoryBudgetPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkDeviceSize       heapBudget[VK_MAX_MEMORY_HEAPS];\n    VkDeviceSize       heapUsage[VK_MAX_MEMORY_HEAPS];\n} VkPhysicalDeviceMemoryBudgetPropertiesEXT;\n\n\n\n// VK_EXT_memory_priority is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_memory_priority 1\n#define VK_EXT_MEMORY_PRIORITY_SPEC_VERSION 1\n#define VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME \"VK_EXT_memory_priority\"\ntypedef struct VkPhysicalDeviceMemoryPriorityFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           memoryPriority;\n} VkPhysicalDeviceMemoryPriorityFeaturesEXT;\n\ntypedef struct VkMemoryPriorityAllocateInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    float              priority;\n} VkMemoryPriorityAllocateInfoEXT;\n\n\n\n// VK_NV_dedicated_allocation_image_aliasing is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_dedicated_allocation_image_aliasing 1\n#define VK_NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_SPEC_VERSION 1\n#define VK_NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_EXTENSION_NAME \"VK_NV_dedicated_allocation_image_aliasing\"\ntypedef struct VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           dedicatedAllocationImageAliasing;\n} VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV;\n\n\n\n// VK_EXT_buffer_device_address is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_buffer_device_address 1\n#define VK_EXT_BUFFER_DEVICE_ADDRESS_SPEC_VERSION 2\n#define VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME \"VK_EXT_buffer_device_address\"\ntypedef struct VkPhysicalDeviceBufferDeviceAddressFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           bufferDeviceAddress;\n    VkBool32           bufferDeviceAddressCaptureReplay;\n    VkBool32           bufferDeviceAddressMultiDevice;\n} VkPhysicalDeviceBufferDeviceAddressFeaturesEXT;\n\ntypedef VkPhysicalDeviceBufferDeviceAddressFeaturesEXT VkPhysicalDeviceBufferAddressFeaturesEXT;\n\ntypedef VkBufferDeviceAddressInfo VkBufferDeviceAddressInfoEXT;\n\ntypedef struct VkBufferDeviceAddressCreateInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkDeviceAddress    deviceAddress;\n} VkBufferDeviceAddressCreateInfoEXT;\n\ntypedef VkDeviceAddress (VKAPI_PTR *PFN_vkGetBufferDeviceAddressEXT)(VkDevice device, const VkBufferDeviceAddressInfo* pInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkDeviceAddress VKAPI_CALL vkGetBufferDeviceAddressEXT(\n    VkDevice                                    device,\n    const VkBufferDeviceAddressInfo*            pInfo);\n#endif\n\n\n// VK_EXT_tooling_info is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_tooling_info 1\n#define VK_EXT_TOOLING_INFO_SPEC_VERSION  1\n#define VK_EXT_TOOLING_INFO_EXTENSION_NAME \"VK_EXT_tooling_info\"\ntypedef VkToolPurposeFlagBits VkToolPurposeFlagBitsEXT;\n\ntypedef VkToolPurposeFlags VkToolPurposeFlagsEXT;\n\ntypedef VkPhysicalDeviceToolProperties VkPhysicalDeviceToolPropertiesEXT;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceToolPropertiesEXT)(VkPhysicalDevice physicalDevice, uint32_t* pToolCount, VkPhysicalDeviceToolProperties* pToolProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceToolPropertiesEXT(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t*                                   pToolCount,\n    VkPhysicalDeviceToolProperties*             pToolProperties);\n#endif\n\n\n// VK_EXT_separate_stencil_usage is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_separate_stencil_usage 1\n#define VK_EXT_SEPARATE_STENCIL_USAGE_SPEC_VERSION 1\n#define VK_EXT_SEPARATE_STENCIL_USAGE_EXTENSION_NAME \"VK_EXT_separate_stencil_usage\"\ntypedef VkImageStencilUsageCreateInfo VkImageStencilUsageCreateInfoEXT;\n\n\n\n// VK_EXT_validation_features is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_validation_features 1\n#define VK_EXT_VALIDATION_FEATURES_SPEC_VERSION 6\n#define VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME \"VK_EXT_validation_features\"\n\ntypedef enum VkValidationFeatureEnableEXT {\n    VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT = 0,\n    VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT = 1,\n    VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT = 2,\n    VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT = 3,\n    VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT = 4,\n    VK_VALIDATION_FEATURE_ENABLE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkValidationFeatureEnableEXT;\n\ntypedef enum VkValidationFeatureDisableEXT {\n    VK_VALIDATION_FEATURE_DISABLE_ALL_EXT = 0,\n    VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT = 1,\n    VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT = 2,\n    VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT = 3,\n    VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT = 4,\n    VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT = 5,\n    VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT = 6,\n    VK_VALIDATION_FEATURE_DISABLE_SHADER_VALIDATION_CACHE_EXT = 7,\n    VK_VALIDATION_FEATURE_DISABLE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkValidationFeatureDisableEXT;\ntypedef struct VkValidationFeaturesEXT {\n    VkStructureType                         sType;\n    const void*                             pNext;\n    uint32_t                                enabledValidationFeatureCount;\n    const VkValidationFeatureEnableEXT*     pEnabledValidationFeatures;\n    uint32_t                                disabledValidationFeatureCount;\n    const VkValidationFeatureDisableEXT*    pDisabledValidationFeatures;\n} VkValidationFeaturesEXT;\n\n\n\n// VK_NV_cooperative_matrix is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_cooperative_matrix 1\n#define VK_NV_COOPERATIVE_MATRIX_SPEC_VERSION 1\n#define VK_NV_COOPERATIVE_MATRIX_EXTENSION_NAME \"VK_NV_cooperative_matrix\"\ntypedef VkComponentTypeKHR VkComponentTypeNV;\n\ntypedef VkScopeKHR VkScopeNV;\n\ntypedef struct VkCooperativeMatrixPropertiesNV {\n    VkStructureType      sType;\n    void*                pNext;\n    uint32_t             MSize;\n    uint32_t             NSize;\n    uint32_t             KSize;\n    VkComponentTypeNV    AType;\n    VkComponentTypeNV    BType;\n    VkComponentTypeNV    CType;\n    VkComponentTypeNV    DType;\n    VkScopeNV            scope;\n} VkCooperativeMatrixPropertiesNV;\n\ntypedef struct VkPhysicalDeviceCooperativeMatrixFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           cooperativeMatrix;\n    VkBool32           cooperativeMatrixRobustBufferAccess;\n} VkPhysicalDeviceCooperativeMatrixFeaturesNV;\n\ntypedef struct VkPhysicalDeviceCooperativeMatrixPropertiesNV {\n    VkStructureType       sType;\n    void*                 pNext;\n    VkShaderStageFlags    cooperativeMatrixSupportedStages;\n} VkPhysicalDeviceCooperativeMatrixPropertiesNV;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV)(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkCooperativeMatrixPropertiesNV* pProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t*                                   pPropertyCount,\n    VkCooperativeMatrixPropertiesNV*            pProperties);\n#endif\n\n\n// VK_NV_coverage_reduction_mode is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_coverage_reduction_mode 1\n#define VK_NV_COVERAGE_REDUCTION_MODE_SPEC_VERSION 1\n#define VK_NV_COVERAGE_REDUCTION_MODE_EXTENSION_NAME \"VK_NV_coverage_reduction_mode\"\n\ntypedef enum VkCoverageReductionModeNV {\n    VK_COVERAGE_REDUCTION_MODE_MERGE_NV = 0,\n    VK_COVERAGE_REDUCTION_MODE_TRUNCATE_NV = 1,\n    VK_COVERAGE_REDUCTION_MODE_MAX_ENUM_NV = 0x7FFFFFFF\n} VkCoverageReductionModeNV;\ntypedef VkFlags VkPipelineCoverageReductionStateCreateFlagsNV;\ntypedef struct VkPhysicalDeviceCoverageReductionModeFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           coverageReductionMode;\n} VkPhysicalDeviceCoverageReductionModeFeaturesNV;\n\ntypedef struct VkPipelineCoverageReductionStateCreateInfoNV {\n    VkStructureType                                  sType;\n    const void*                                      pNext;\n    VkPipelineCoverageReductionStateCreateFlagsNV    flags;\n    VkCoverageReductionModeNV                        coverageReductionMode;\n} VkPipelineCoverageReductionStateCreateInfoNV;\n\ntypedef struct VkFramebufferMixedSamplesCombinationNV {\n    VkStructureType              sType;\n    void*                        pNext;\n    VkCoverageReductionModeNV    coverageReductionMode;\n    VkSampleCountFlagBits        rasterizationSamples;\n    VkSampleCountFlags           depthStencilSamples;\n    VkSampleCountFlags           colorSamples;\n} VkFramebufferMixedSamplesCombinationNV;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV)(VkPhysicalDevice physicalDevice, uint32_t* pCombinationCount, VkFramebufferMixedSamplesCombinationNV* pCombinations);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t*                                   pCombinationCount,\n    VkFramebufferMixedSamplesCombinationNV*     pCombinations);\n#endif\n\n\n// VK_EXT_fragment_shader_interlock is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_fragment_shader_interlock 1\n#define VK_EXT_FRAGMENT_SHADER_INTERLOCK_SPEC_VERSION 1\n#define VK_EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME \"VK_EXT_fragment_shader_interlock\"\ntypedef struct VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           fragmentShaderSampleInterlock;\n    VkBool32           fragmentShaderPixelInterlock;\n    VkBool32           fragmentShaderShadingRateInterlock;\n} VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT;\n\n\n\n// VK_EXT_ycbcr_image_arrays is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_ycbcr_image_arrays 1\n#define VK_EXT_YCBCR_IMAGE_ARRAYS_SPEC_VERSION 1\n#define VK_EXT_YCBCR_IMAGE_ARRAYS_EXTENSION_NAME \"VK_EXT_ycbcr_image_arrays\"\ntypedef struct VkPhysicalDeviceYcbcrImageArraysFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           ycbcrImageArrays;\n} VkPhysicalDeviceYcbcrImageArraysFeaturesEXT;\n\n\n\n// VK_EXT_provoking_vertex is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_provoking_vertex 1\n#define VK_EXT_PROVOKING_VERTEX_SPEC_VERSION 1\n#define VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME \"VK_EXT_provoking_vertex\"\n\ntypedef enum VkProvokingVertexModeEXT {\n    VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT = 0,\n    VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT = 1,\n    VK_PROVOKING_VERTEX_MODE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkProvokingVertexModeEXT;\ntypedef struct VkPhysicalDeviceProvokingVertexFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           provokingVertexLast;\n    VkBool32           transformFeedbackPreservesProvokingVertex;\n} VkPhysicalDeviceProvokingVertexFeaturesEXT;\n\ntypedef struct VkPhysicalDeviceProvokingVertexPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           provokingVertexModePerPipeline;\n    VkBool32           transformFeedbackPreservesTriangleFanProvokingVertex;\n} VkPhysicalDeviceProvokingVertexPropertiesEXT;\n\ntypedef struct VkPipelineRasterizationProvokingVertexStateCreateInfoEXT {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkProvokingVertexModeEXT    provokingVertexMode;\n} VkPipelineRasterizationProvokingVertexStateCreateInfoEXT;\n\n\n\n// VK_EXT_headless_surface is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_headless_surface 1\n#define VK_EXT_HEADLESS_SURFACE_SPEC_VERSION 1\n#define VK_EXT_HEADLESS_SURFACE_EXTENSION_NAME \"VK_EXT_headless_surface\"\ntypedef VkFlags VkHeadlessSurfaceCreateFlagsEXT;\ntypedef struct VkHeadlessSurfaceCreateInfoEXT {\n    VkStructureType                    sType;\n    const void*                        pNext;\n    VkHeadlessSurfaceCreateFlagsEXT    flags;\n} VkHeadlessSurfaceCreateInfoEXT;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateHeadlessSurfaceEXT)(VkInstance instance, const VkHeadlessSurfaceCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateHeadlessSurfaceEXT(\n    VkInstance                                  instance,\n    const VkHeadlessSurfaceCreateInfoEXT*       pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSurfaceKHR*                               pSurface);\n#endif\n\n\n// VK_EXT_line_rasterization is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_line_rasterization 1\n#define VK_EXT_LINE_RASTERIZATION_SPEC_VERSION 1\n#define VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME \"VK_EXT_line_rasterization\"\ntypedef VkLineRasterizationMode VkLineRasterizationModeEXT;\n\ntypedef VkPhysicalDeviceLineRasterizationFeatures VkPhysicalDeviceLineRasterizationFeaturesEXT;\n\ntypedef VkPhysicalDeviceLineRasterizationProperties VkPhysicalDeviceLineRasterizationPropertiesEXT;\n\ntypedef VkPipelineRasterizationLineStateCreateInfo VkPipelineRasterizationLineStateCreateInfoEXT;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdSetLineStippleEXT)(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, uint16_t lineStipplePattern);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdSetLineStippleEXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    lineStippleFactor,\n    uint16_t                                    lineStipplePattern);\n#endif\n\n\n// VK_EXT_shader_atomic_float is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_shader_atomic_float 1\n#define VK_EXT_SHADER_ATOMIC_FLOAT_SPEC_VERSION 1\n#define VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME \"VK_EXT_shader_atomic_float\"\ntypedef struct VkPhysicalDeviceShaderAtomicFloatFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderBufferFloat32Atomics;\n    VkBool32           shaderBufferFloat32AtomicAdd;\n    VkBool32           shaderBufferFloat64Atomics;\n    VkBool32           shaderBufferFloat64AtomicAdd;\n    VkBool32           shaderSharedFloat32Atomics;\n    VkBool32           shaderSharedFloat32AtomicAdd;\n    VkBool32           shaderSharedFloat64Atomics;\n    VkBool32           shaderSharedFloat64AtomicAdd;\n    VkBool32           shaderImageFloat32Atomics;\n    VkBool32           shaderImageFloat32AtomicAdd;\n    VkBool32           sparseImageFloat32Atomics;\n    VkBool32           sparseImageFloat32AtomicAdd;\n} VkPhysicalDeviceShaderAtomicFloatFeaturesEXT;\n\n\n\n// VK_EXT_host_query_reset is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_host_query_reset 1\n#define VK_EXT_HOST_QUERY_RESET_SPEC_VERSION 1\n#define VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME \"VK_EXT_host_query_reset\"\ntypedef VkPhysicalDeviceHostQueryResetFeatures VkPhysicalDeviceHostQueryResetFeaturesEXT;\n\ntypedef void (VKAPI_PTR *PFN_vkResetQueryPoolEXT)(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkResetQueryPoolEXT(\n    VkDevice                                    device,\n    VkQueryPool                                 queryPool,\n    uint32_t                                    firstQuery,\n    uint32_t                                    queryCount);\n#endif\n\n\n// VK_EXT_index_type_uint8 is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_index_type_uint8 1\n#define VK_EXT_INDEX_TYPE_UINT8_SPEC_VERSION 1\n#define VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME \"VK_EXT_index_type_uint8\"\ntypedef VkPhysicalDeviceIndexTypeUint8Features VkPhysicalDeviceIndexTypeUint8FeaturesEXT;\n\n\n\n// VK_EXT_extended_dynamic_state is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_extended_dynamic_state 1\n#define VK_EXT_EXTENDED_DYNAMIC_STATE_SPEC_VERSION 1\n#define VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME \"VK_EXT_extended_dynamic_state\"\ntypedef struct VkPhysicalDeviceExtendedDynamicStateFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           extendedDynamicState;\n} VkPhysicalDeviceExtendedDynamicStateFeaturesEXT;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdSetCullModeEXT)(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetFrontFaceEXT)(VkCommandBuffer commandBuffer, VkFrontFace frontFace);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetPrimitiveTopologyEXT)(VkCommandBuffer commandBuffer, VkPrimitiveTopology primitiveTopology);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetViewportWithCountEXT)(VkCommandBuffer commandBuffer, uint32_t viewportCount, const VkViewport* pViewports);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetScissorWithCountEXT)(VkCommandBuffer commandBuffer, uint32_t scissorCount, const VkRect2D* pScissors);\ntypedef void (VKAPI_PTR *PFN_vkCmdBindVertexBuffers2EXT)(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets, const VkDeviceSize* pSizes, const VkDeviceSize* pStrides);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDepthTestEnableEXT)(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDepthWriteEnableEXT)(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDepthCompareOpEXT)(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDepthBoundsTestEnableEXT)(VkCommandBuffer commandBuffer, VkBool32 depthBoundsTestEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetStencilTestEnableEXT)(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetStencilOpEXT)(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp, VkCompareOp compareOp);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdSetCullModeEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkCullModeFlags                             cullMode);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetFrontFaceEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkFrontFace                                 frontFace);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetPrimitiveTopologyEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkPrimitiveTopology                         primitiveTopology);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetViewportWithCountEXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    viewportCount,\n    const VkViewport*                           pViewports);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetScissorWithCountEXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    scissorCount,\n    const VkRect2D*                             pScissors);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers2EXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    firstBinding,\n    uint32_t                                    bindingCount,\n    const VkBuffer*                             pBuffers,\n    const VkDeviceSize*                         pOffsets,\n    const VkDeviceSize*                         pSizes,\n    const VkDeviceSize*                         pStrides);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDepthTestEnableEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    depthTestEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDepthWriteEnableEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    depthWriteEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDepthCompareOpEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkCompareOp                                 depthCompareOp);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBoundsTestEnableEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    depthBoundsTestEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetStencilTestEnableEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    stencilTestEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetStencilOpEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkStencilFaceFlags                          faceMask,\n    VkStencilOp                                 failOp,\n    VkStencilOp                                 passOp,\n    VkStencilOp                                 depthFailOp,\n    VkCompareOp                                 compareOp);\n#endif\n\n\n// VK_EXT_host_image_copy is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_host_image_copy 1\n#define VK_EXT_HOST_IMAGE_COPY_SPEC_VERSION 1\n#define VK_EXT_HOST_IMAGE_COPY_EXTENSION_NAME \"VK_EXT_host_image_copy\"\ntypedef VkHostImageCopyFlagBits VkHostImageCopyFlagBitsEXT;\n\ntypedef VkHostImageCopyFlags VkHostImageCopyFlagsEXT;\n\ntypedef VkPhysicalDeviceHostImageCopyFeatures VkPhysicalDeviceHostImageCopyFeaturesEXT;\n\ntypedef VkPhysicalDeviceHostImageCopyProperties VkPhysicalDeviceHostImageCopyPropertiesEXT;\n\ntypedef VkMemoryToImageCopy VkMemoryToImageCopyEXT;\n\ntypedef VkImageToMemoryCopy VkImageToMemoryCopyEXT;\n\ntypedef VkCopyMemoryToImageInfo VkCopyMemoryToImageInfoEXT;\n\ntypedef VkCopyImageToMemoryInfo VkCopyImageToMemoryInfoEXT;\n\ntypedef VkCopyImageToImageInfo VkCopyImageToImageInfoEXT;\n\ntypedef VkHostImageLayoutTransitionInfo VkHostImageLayoutTransitionInfoEXT;\n\ntypedef VkSubresourceHostMemcpySize VkSubresourceHostMemcpySizeEXT;\n\ntypedef VkHostImageCopyDevicePerformanceQuery VkHostImageCopyDevicePerformanceQueryEXT;\n\ntypedef VkSubresourceLayout2 VkSubresourceLayout2EXT;\n\ntypedef VkImageSubresource2 VkImageSubresource2EXT;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCopyMemoryToImageEXT)(VkDevice device, const VkCopyMemoryToImageInfo*    pCopyMemoryToImageInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkCopyImageToMemoryEXT)(VkDevice device, const VkCopyImageToMemoryInfo*    pCopyImageToMemoryInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkCopyImageToImageEXT)(VkDevice device, const VkCopyImageToImageInfo*    pCopyImageToImageInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkTransitionImageLayoutEXT)(VkDevice device, uint32_t transitionCount, const VkHostImageLayoutTransitionInfo*    pTransitions);\ntypedef void (VKAPI_PTR *PFN_vkGetImageSubresourceLayout2EXT)(VkDevice device, VkImage image, const VkImageSubresource2* pSubresource, VkSubresourceLayout2* pLayout);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCopyMemoryToImageEXT(\n    VkDevice                                    device,\n    const VkCopyMemoryToImageInfo*              pCopyMemoryToImageInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCopyImageToMemoryEXT(\n    VkDevice                                    device,\n    const VkCopyImageToMemoryInfo*              pCopyImageToMemoryInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCopyImageToImageEXT(\n    VkDevice                                    device,\n    const VkCopyImageToImageInfo*               pCopyImageToImageInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkTransitionImageLayoutEXT(\n    VkDevice                                    device,\n    uint32_t                                    transitionCount,\n    const VkHostImageLayoutTransitionInfo*      pTransitions);\n\nVKAPI_ATTR void VKAPI_CALL vkGetImageSubresourceLayout2EXT(\n    VkDevice                                    device,\n    VkImage                                     image,\n    const VkImageSubresource2*                  pSubresource,\n    VkSubresourceLayout2*                       pLayout);\n#endif\n\n\n// VK_EXT_map_memory_placed is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_map_memory_placed 1\n#define VK_EXT_MAP_MEMORY_PLACED_SPEC_VERSION 1\n#define VK_EXT_MAP_MEMORY_PLACED_EXTENSION_NAME \"VK_EXT_map_memory_placed\"\ntypedef struct VkPhysicalDeviceMapMemoryPlacedFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           memoryMapPlaced;\n    VkBool32           memoryMapRangePlaced;\n    VkBool32           memoryUnmapReserve;\n} VkPhysicalDeviceMapMemoryPlacedFeaturesEXT;\n\ntypedef struct VkPhysicalDeviceMapMemoryPlacedPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkDeviceSize       minPlacedMemoryMapAlignment;\n} VkPhysicalDeviceMapMemoryPlacedPropertiesEXT;\n\ntypedef struct VkMemoryMapPlacedInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    void*              pPlacedAddress;\n} VkMemoryMapPlacedInfoEXT;\n\n\n\n// VK_EXT_shader_atomic_float2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_shader_atomic_float2 1\n#define VK_EXT_SHADER_ATOMIC_FLOAT_2_SPEC_VERSION 1\n#define VK_EXT_SHADER_ATOMIC_FLOAT_2_EXTENSION_NAME \"VK_EXT_shader_atomic_float2\"\ntypedef struct VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderBufferFloat16Atomics;\n    VkBool32           shaderBufferFloat16AtomicAdd;\n    VkBool32           shaderBufferFloat16AtomicMinMax;\n    VkBool32           shaderBufferFloat32AtomicMinMax;\n    VkBool32           shaderBufferFloat64AtomicMinMax;\n    VkBool32           shaderSharedFloat16Atomics;\n    VkBool32           shaderSharedFloat16AtomicAdd;\n    VkBool32           shaderSharedFloat16AtomicMinMax;\n    VkBool32           shaderSharedFloat32AtomicMinMax;\n    VkBool32           shaderSharedFloat64AtomicMinMax;\n    VkBool32           shaderImageFloat32AtomicMinMax;\n    VkBool32           sparseImageFloat32AtomicMinMax;\n} VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT;\n\n\n\n// VK_EXT_surface_maintenance1 is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_surface_maintenance1 1\n#define VK_EXT_SURFACE_MAINTENANCE_1_SPEC_VERSION 1\n#define VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME \"VK_EXT_surface_maintenance1\"\n\ntypedef enum VkPresentScalingFlagBitsEXT {\n    VK_PRESENT_SCALING_ONE_TO_ONE_BIT_EXT = 0x00000001,\n    VK_PRESENT_SCALING_ASPECT_RATIO_STRETCH_BIT_EXT = 0x00000002,\n    VK_PRESENT_SCALING_STRETCH_BIT_EXT = 0x00000004,\n    VK_PRESENT_SCALING_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkPresentScalingFlagBitsEXT;\ntypedef VkFlags VkPresentScalingFlagsEXT;\n\ntypedef enum VkPresentGravityFlagBitsEXT {\n    VK_PRESENT_GRAVITY_MIN_BIT_EXT = 0x00000001,\n    VK_PRESENT_GRAVITY_MAX_BIT_EXT = 0x00000002,\n    VK_PRESENT_GRAVITY_CENTERED_BIT_EXT = 0x00000004,\n    VK_PRESENT_GRAVITY_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkPresentGravityFlagBitsEXT;\ntypedef VkFlags VkPresentGravityFlagsEXT;\ntypedef struct VkSurfacePresentModeEXT {\n    VkStructureType     sType;\n    void*               pNext;\n    VkPresentModeKHR    presentMode;\n} VkSurfacePresentModeEXT;\n\ntypedef struct VkSurfacePresentScalingCapabilitiesEXT {\n    VkStructureType             sType;\n    void*                       pNext;\n    VkPresentScalingFlagsEXT    supportedPresentScaling;\n    VkPresentGravityFlagsEXT    supportedPresentGravityX;\n    VkPresentGravityFlagsEXT    supportedPresentGravityY;\n    VkExtent2D                  minScaledImageExtent;\n    VkExtent2D                  maxScaledImageExtent;\n} VkSurfacePresentScalingCapabilitiesEXT;\n\ntypedef struct VkSurfacePresentModeCompatibilityEXT {\n    VkStructureType      sType;\n    void*                pNext;\n    uint32_t             presentModeCount;\n    VkPresentModeKHR*    pPresentModes;\n} VkSurfacePresentModeCompatibilityEXT;\n\n\n\n// VK_EXT_swapchain_maintenance1 is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_swapchain_maintenance1 1\n#define VK_EXT_SWAPCHAIN_MAINTENANCE_1_SPEC_VERSION 1\n#define VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME \"VK_EXT_swapchain_maintenance1\"\ntypedef struct VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           swapchainMaintenance1;\n} VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT;\n\ntypedef struct VkSwapchainPresentFenceInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           swapchainCount;\n    const VkFence*     pFences;\n} VkSwapchainPresentFenceInfoEXT;\n\ntypedef struct VkSwapchainPresentModesCreateInfoEXT {\n    VkStructureType            sType;\n    const void*                pNext;\n    uint32_t                   presentModeCount;\n    const VkPresentModeKHR*    pPresentModes;\n} VkSwapchainPresentModesCreateInfoEXT;\n\ntypedef struct VkSwapchainPresentModeInfoEXT {\n    VkStructureType            sType;\n    const void*                pNext;\n    uint32_t                   swapchainCount;\n    const VkPresentModeKHR*    pPresentModes;\n} VkSwapchainPresentModeInfoEXT;\n\ntypedef struct VkSwapchainPresentScalingCreateInfoEXT {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkPresentScalingFlagsEXT    scalingBehavior;\n    VkPresentGravityFlagsEXT    presentGravityX;\n    VkPresentGravityFlagsEXT    presentGravityY;\n} VkSwapchainPresentScalingCreateInfoEXT;\n\ntypedef struct VkReleaseSwapchainImagesInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkSwapchainKHR     swapchain;\n    uint32_t           imageIndexCount;\n    const uint32_t*    pImageIndices;\n} VkReleaseSwapchainImagesInfoEXT;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkReleaseSwapchainImagesEXT)(VkDevice device, const VkReleaseSwapchainImagesInfoEXT* pReleaseInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkReleaseSwapchainImagesEXT(\n    VkDevice                                    device,\n    const VkReleaseSwapchainImagesInfoEXT*      pReleaseInfo);\n#endif\n\n\n// VK_EXT_shader_demote_to_helper_invocation is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_shader_demote_to_helper_invocation 1\n#define VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_SPEC_VERSION 1\n#define VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME \"VK_EXT_shader_demote_to_helper_invocation\"\ntypedef VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT;\n\n\n\n// VK_NV_device_generated_commands is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_device_generated_commands 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkIndirectCommandsLayoutNV)\n#define VK_NV_DEVICE_GENERATED_COMMANDS_SPEC_VERSION 3\n#define VK_NV_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME \"VK_NV_device_generated_commands\"\n\ntypedef enum VkIndirectCommandsTokenTypeNV {\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV = 0,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV = 1,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NV = 2,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV = 3,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV = 4,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV = 5,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NV = 6,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV = 7,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NV = 1000328000,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_PIPELINE_NV = 1000428003,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_NV = 1000428004,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_MAX_ENUM_NV = 0x7FFFFFFF\n} VkIndirectCommandsTokenTypeNV;\n\ntypedef enum VkIndirectStateFlagBitsNV {\n    VK_INDIRECT_STATE_FLAG_FRONTFACE_BIT_NV = 0x00000001,\n    VK_INDIRECT_STATE_FLAG_BITS_MAX_ENUM_NV = 0x7FFFFFFF\n} VkIndirectStateFlagBitsNV;\ntypedef VkFlags VkIndirectStateFlagsNV;\n\ntypedef enum VkIndirectCommandsLayoutUsageFlagBitsNV {\n    VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_NV = 0x00000001,\n    VK_INDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT_NV = 0x00000002,\n    VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_NV = 0x00000004,\n    VK_INDIRECT_COMMANDS_LAYOUT_USAGE_FLAG_BITS_MAX_ENUM_NV = 0x7FFFFFFF\n} VkIndirectCommandsLayoutUsageFlagBitsNV;\ntypedef VkFlags VkIndirectCommandsLayoutUsageFlagsNV;\ntypedef struct VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxGraphicsShaderGroupCount;\n    uint32_t           maxIndirectSequenceCount;\n    uint32_t           maxIndirectCommandsTokenCount;\n    uint32_t           maxIndirectCommandsStreamCount;\n    uint32_t           maxIndirectCommandsTokenOffset;\n    uint32_t           maxIndirectCommandsStreamStride;\n    uint32_t           minSequencesCountBufferOffsetAlignment;\n    uint32_t           minSequencesIndexBufferOffsetAlignment;\n    uint32_t           minIndirectCommandsBufferOffsetAlignment;\n} VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV;\n\ntypedef struct VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           deviceGeneratedCommands;\n} VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV;\n\ntypedef struct VkGraphicsShaderGroupCreateInfoNV {\n    VkStructureType                                 sType;\n    const void*                                     pNext;\n    uint32_t                                        stageCount;\n    const VkPipelineShaderStageCreateInfo*          pStages;\n    const VkPipelineVertexInputStateCreateInfo*     pVertexInputState;\n    const VkPipelineTessellationStateCreateInfo*    pTessellationState;\n} VkGraphicsShaderGroupCreateInfoNV;\n\ntypedef struct VkGraphicsPipelineShaderGroupsCreateInfoNV {\n    VkStructureType                             sType;\n    const void*                                 pNext;\n    uint32_t                                    groupCount;\n    const VkGraphicsShaderGroupCreateInfoNV*    pGroups;\n    uint32_t                                    pipelineCount;\n    const VkPipeline*                           pPipelines;\n} VkGraphicsPipelineShaderGroupsCreateInfoNV;\n\ntypedef struct VkBindShaderGroupIndirectCommandNV {\n    uint32_t    groupIndex;\n} VkBindShaderGroupIndirectCommandNV;\n\ntypedef struct VkBindIndexBufferIndirectCommandNV {\n    VkDeviceAddress    bufferAddress;\n    uint32_t           size;\n    VkIndexType        indexType;\n} VkBindIndexBufferIndirectCommandNV;\n\ntypedef struct VkBindVertexBufferIndirectCommandNV {\n    VkDeviceAddress    bufferAddress;\n    uint32_t           size;\n    uint32_t           stride;\n} VkBindVertexBufferIndirectCommandNV;\n\ntypedef struct VkSetStateFlagsIndirectCommandNV {\n    uint32_t    data;\n} VkSetStateFlagsIndirectCommandNV;\n\ntypedef struct VkIndirectCommandsStreamNV {\n    VkBuffer        buffer;\n    VkDeviceSize    offset;\n} VkIndirectCommandsStreamNV;\n\ntypedef struct VkIndirectCommandsLayoutTokenNV {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkIndirectCommandsTokenTypeNV    tokenType;\n    uint32_t                         stream;\n    uint32_t                         offset;\n    uint32_t                         vertexBindingUnit;\n    VkBool32                         vertexDynamicStride;\n    VkPipelineLayout                 pushconstantPipelineLayout;\n    VkShaderStageFlags               pushconstantShaderStageFlags;\n    uint32_t                         pushconstantOffset;\n    uint32_t                         pushconstantSize;\n    VkIndirectStateFlagsNV           indirectStateFlags;\n    uint32_t                         indexTypeCount;\n    const VkIndexType*               pIndexTypes;\n    const uint32_t*                  pIndexTypeValues;\n} VkIndirectCommandsLayoutTokenNV;\n\ntypedef struct VkIndirectCommandsLayoutCreateInfoNV {\n    VkStructureType                           sType;\n    const void*                               pNext;\n    VkIndirectCommandsLayoutUsageFlagsNV      flags;\n    VkPipelineBindPoint                       pipelineBindPoint;\n    uint32_t                                  tokenCount;\n    const VkIndirectCommandsLayoutTokenNV*    pTokens;\n    uint32_t                                  streamCount;\n    const uint32_t*                           pStreamStrides;\n} VkIndirectCommandsLayoutCreateInfoNV;\n\ntypedef struct VkGeneratedCommandsInfoNV {\n    VkStructureType                      sType;\n    const void*                          pNext;\n    VkPipelineBindPoint                  pipelineBindPoint;\n    VkPipeline                           pipeline;\n    VkIndirectCommandsLayoutNV           indirectCommandsLayout;\n    uint32_t                             streamCount;\n    const VkIndirectCommandsStreamNV*    pStreams;\n    uint32_t                             sequencesCount;\n    VkBuffer                             preprocessBuffer;\n    VkDeviceSize                         preprocessOffset;\n    VkDeviceSize                         preprocessSize;\n    VkBuffer                             sequencesCountBuffer;\n    VkDeviceSize                         sequencesCountOffset;\n    VkBuffer                             sequencesIndexBuffer;\n    VkDeviceSize                         sequencesIndexOffset;\n} VkGeneratedCommandsInfoNV;\n\ntypedef struct VkGeneratedCommandsMemoryRequirementsInfoNV {\n    VkStructureType               sType;\n    const void*                   pNext;\n    VkPipelineBindPoint           pipelineBindPoint;\n    VkPipeline                    pipeline;\n    VkIndirectCommandsLayoutNV    indirectCommandsLayout;\n    uint32_t                      maxSequencesCount;\n} VkGeneratedCommandsMemoryRequirementsInfoNV;\n\ntypedef void (VKAPI_PTR *PFN_vkGetGeneratedCommandsMemoryRequirementsNV)(VkDevice device, const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo, VkMemoryRequirements2* pMemoryRequirements);\ntypedef void (VKAPI_PTR *PFN_vkCmdPreprocessGeneratedCommandsNV)(VkCommandBuffer commandBuffer, const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdExecuteGeneratedCommandsNV)(VkCommandBuffer commandBuffer, VkBool32 isPreprocessed, const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdBindPipelineShaderGroupNV)(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline, uint32_t groupIndex);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateIndirectCommandsLayoutNV)(VkDevice device, const VkIndirectCommandsLayoutCreateInfoNV* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkIndirectCommandsLayoutNV* pIndirectCommandsLayout);\ntypedef void (VKAPI_PTR *PFN_vkDestroyIndirectCommandsLayoutNV)(VkDevice device, VkIndirectCommandsLayoutNV indirectCommandsLayout, const VkAllocationCallbacks* pAllocator);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkGetGeneratedCommandsMemoryRequirementsNV(\n    VkDevice                                    device,\n    const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo,\n    VkMemoryRequirements2*                      pMemoryRequirements);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdPreprocessGeneratedCommandsNV(\n    VkCommandBuffer                             commandBuffer,\n    const VkGeneratedCommandsInfoNV*            pGeneratedCommandsInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdExecuteGeneratedCommandsNV(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    isPreprocessed,\n    const VkGeneratedCommandsInfoNV*            pGeneratedCommandsInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBindPipelineShaderGroupNV(\n    VkCommandBuffer                             commandBuffer,\n    VkPipelineBindPoint                         pipelineBindPoint,\n    VkPipeline                                  pipeline,\n    uint32_t                                    groupIndex);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateIndirectCommandsLayoutNV(\n    VkDevice                                    device,\n    const VkIndirectCommandsLayoutCreateInfoNV* pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkIndirectCommandsLayoutNV*                 pIndirectCommandsLayout);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyIndirectCommandsLayoutNV(\n    VkDevice                                    device,\n    VkIndirectCommandsLayoutNV                  indirectCommandsLayout,\n    const VkAllocationCallbacks*                pAllocator);\n#endif\n\n\n// VK_NV_inherited_viewport_scissor is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_inherited_viewport_scissor 1\n#define VK_NV_INHERITED_VIEWPORT_SCISSOR_SPEC_VERSION 1\n#define VK_NV_INHERITED_VIEWPORT_SCISSOR_EXTENSION_NAME \"VK_NV_inherited_viewport_scissor\"\ntypedef struct VkPhysicalDeviceInheritedViewportScissorFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           inheritedViewportScissor2D;\n} VkPhysicalDeviceInheritedViewportScissorFeaturesNV;\n\ntypedef struct VkCommandBufferInheritanceViewportScissorInfoNV {\n    VkStructureType      sType;\n    const void*          pNext;\n    VkBool32             viewportScissor2D;\n    uint32_t             viewportDepthCount;\n    const VkViewport*    pViewportDepths;\n} VkCommandBufferInheritanceViewportScissorInfoNV;\n\n\n\n// VK_EXT_texel_buffer_alignment is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_texel_buffer_alignment 1\n#define VK_EXT_TEXEL_BUFFER_ALIGNMENT_SPEC_VERSION 1\n#define VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME \"VK_EXT_texel_buffer_alignment\"\ntypedef struct VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           texelBufferAlignment;\n} VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT;\n\ntypedef VkPhysicalDeviceTexelBufferAlignmentProperties VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT;\n\n\n\n// VK_QCOM_render_pass_transform is a preprocessor guard. Do not pass it to API calls.\n#define VK_QCOM_render_pass_transform 1\n#define VK_QCOM_RENDER_PASS_TRANSFORM_SPEC_VERSION 4\n#define VK_QCOM_RENDER_PASS_TRANSFORM_EXTENSION_NAME \"VK_QCOM_render_pass_transform\"\ntypedef struct VkRenderPassTransformBeginInfoQCOM {\n    VkStructureType                  sType;\n    void*                            pNext;\n    VkSurfaceTransformFlagBitsKHR    transform;\n} VkRenderPassTransformBeginInfoQCOM;\n\ntypedef struct VkCommandBufferInheritanceRenderPassTransformInfoQCOM {\n    VkStructureType                  sType;\n    void*                            pNext;\n    VkSurfaceTransformFlagBitsKHR    transform;\n    VkRect2D                         renderArea;\n} VkCommandBufferInheritanceRenderPassTransformInfoQCOM;\n\n\n\n// VK_EXT_depth_bias_control is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_depth_bias_control 1\n#define VK_EXT_DEPTH_BIAS_CONTROL_SPEC_VERSION 1\n#define VK_EXT_DEPTH_BIAS_CONTROL_EXTENSION_NAME \"VK_EXT_depth_bias_control\"\n\ntypedef enum VkDepthBiasRepresentationEXT {\n    VK_DEPTH_BIAS_REPRESENTATION_LEAST_REPRESENTABLE_VALUE_FORMAT_EXT = 0,\n    VK_DEPTH_BIAS_REPRESENTATION_LEAST_REPRESENTABLE_VALUE_FORCE_UNORM_EXT = 1,\n    VK_DEPTH_BIAS_REPRESENTATION_FLOAT_EXT = 2,\n    VK_DEPTH_BIAS_REPRESENTATION_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkDepthBiasRepresentationEXT;\ntypedef struct VkPhysicalDeviceDepthBiasControlFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           depthBiasControl;\n    VkBool32           leastRepresentableValueForceUnormRepresentation;\n    VkBool32           floatRepresentation;\n    VkBool32           depthBiasExact;\n} VkPhysicalDeviceDepthBiasControlFeaturesEXT;\n\ntypedef struct VkDepthBiasInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    float              depthBiasConstantFactor;\n    float              depthBiasClamp;\n    float              depthBiasSlopeFactor;\n} VkDepthBiasInfoEXT;\n\ntypedef struct VkDepthBiasRepresentationInfoEXT {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    VkDepthBiasRepresentationEXT    depthBiasRepresentation;\n    VkBool32                        depthBiasExact;\n} VkDepthBiasRepresentationInfoEXT;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDepthBias2EXT)(VkCommandBuffer commandBuffer, const VkDepthBiasInfoEXT*         pDepthBiasInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBias2EXT(\n    VkCommandBuffer                             commandBuffer,\n    const VkDepthBiasInfoEXT*                   pDepthBiasInfo);\n#endif\n\n\n// VK_EXT_device_memory_report is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_device_memory_report 1\n#define VK_EXT_DEVICE_MEMORY_REPORT_SPEC_VERSION 2\n#define VK_EXT_DEVICE_MEMORY_REPORT_EXTENSION_NAME \"VK_EXT_device_memory_report\"\n\ntypedef enum VkDeviceMemoryReportEventTypeEXT {\n    VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATE_EXT = 0,\n    VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_FREE_EXT = 1,\n    VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_IMPORT_EXT = 2,\n    VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_UNIMPORT_EXT = 3,\n    VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATION_FAILED_EXT = 4,\n    VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkDeviceMemoryReportEventTypeEXT;\ntypedef VkFlags VkDeviceMemoryReportFlagsEXT;\ntypedef struct VkPhysicalDeviceDeviceMemoryReportFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           deviceMemoryReport;\n} VkPhysicalDeviceDeviceMemoryReportFeaturesEXT;\n\ntypedef struct VkDeviceMemoryReportCallbackDataEXT {\n    VkStructureType                     sType;\n    void*                               pNext;\n    VkDeviceMemoryReportFlagsEXT        flags;\n    VkDeviceMemoryReportEventTypeEXT    type;\n    uint64_t                            memoryObjectId;\n    VkDeviceSize                        size;\n    VkObjectType                        objectType;\n    uint64_t                            objectHandle;\n    uint32_t                            heapIndex;\n} VkDeviceMemoryReportCallbackDataEXT;\n\ntypedef void (VKAPI_PTR *PFN_vkDeviceMemoryReportCallbackEXT)(\n    const VkDeviceMemoryReportCallbackDataEXT*  pCallbackData,\n    void*                                       pUserData);\n\ntypedef struct VkDeviceDeviceMemoryReportCreateInfoEXT {\n    VkStructureType                        sType;\n    const void*                            pNext;\n    VkDeviceMemoryReportFlagsEXT           flags;\n    PFN_vkDeviceMemoryReportCallbackEXT    pfnUserCallback;\n    void*                                  pUserData;\n} VkDeviceDeviceMemoryReportCreateInfoEXT;\n\n\n\n// VK_EXT_acquire_drm_display is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_acquire_drm_display 1\n#define VK_EXT_ACQUIRE_DRM_DISPLAY_SPEC_VERSION 1\n#define VK_EXT_ACQUIRE_DRM_DISPLAY_EXTENSION_NAME \"VK_EXT_acquire_drm_display\"\ntypedef VkResult (VKAPI_PTR *PFN_vkAcquireDrmDisplayEXT)(VkPhysicalDevice physicalDevice, int32_t drmFd, VkDisplayKHR display);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetDrmDisplayEXT)(VkPhysicalDevice physicalDevice, int32_t drmFd, uint32_t connectorId, VkDisplayKHR* display);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkAcquireDrmDisplayEXT(\n    VkPhysicalDevice                            physicalDevice,\n    int32_t                                     drmFd,\n    VkDisplayKHR                                display);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetDrmDisplayEXT(\n    VkPhysicalDevice                            physicalDevice,\n    int32_t                                     drmFd,\n    uint32_t                                    connectorId,\n    VkDisplayKHR*                               display);\n#endif\n\n\n// VK_EXT_robustness2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_robustness2 1\n#define VK_EXT_ROBUSTNESS_2_SPEC_VERSION  1\n#define VK_EXT_ROBUSTNESS_2_EXTENSION_NAME \"VK_EXT_robustness2\"\ntypedef struct VkPhysicalDeviceRobustness2FeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           robustBufferAccess2;\n    VkBool32           robustImageAccess2;\n    VkBool32           nullDescriptor;\n} VkPhysicalDeviceRobustness2FeaturesEXT;\n\ntypedef struct VkPhysicalDeviceRobustness2PropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkDeviceSize       robustStorageBufferAccessSizeAlignment;\n    VkDeviceSize       robustUniformBufferAccessSizeAlignment;\n} VkPhysicalDeviceRobustness2PropertiesEXT;\n\n\n\n// VK_EXT_custom_border_color is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_custom_border_color 1\n#define VK_EXT_CUSTOM_BORDER_COLOR_SPEC_VERSION 12\n#define VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME \"VK_EXT_custom_border_color\"\ntypedef struct VkSamplerCustomBorderColorCreateInfoEXT {\n    VkStructureType      sType;\n    const void*          pNext;\n    VkClearColorValue    customBorderColor;\n    VkFormat             format;\n} VkSamplerCustomBorderColorCreateInfoEXT;\n\ntypedef struct VkPhysicalDeviceCustomBorderColorPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxCustomBorderColorSamplers;\n} VkPhysicalDeviceCustomBorderColorPropertiesEXT;\n\ntypedef struct VkPhysicalDeviceCustomBorderColorFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           customBorderColors;\n    VkBool32           customBorderColorWithoutFormat;\n} VkPhysicalDeviceCustomBorderColorFeaturesEXT;\n\n\n\n// VK_GOOGLE_user_type is a preprocessor guard. Do not pass it to API calls.\n#define VK_GOOGLE_user_type 1\n#define VK_GOOGLE_USER_TYPE_SPEC_VERSION  1\n#define VK_GOOGLE_USER_TYPE_EXTENSION_NAME \"VK_GOOGLE_user_type\"\n\n\n// VK_NV_present_barrier is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_present_barrier 1\n#define VK_NV_PRESENT_BARRIER_SPEC_VERSION 1\n#define VK_NV_PRESENT_BARRIER_EXTENSION_NAME \"VK_NV_present_barrier\"\ntypedef struct VkPhysicalDevicePresentBarrierFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           presentBarrier;\n} VkPhysicalDevicePresentBarrierFeaturesNV;\n\ntypedef struct VkSurfaceCapabilitiesPresentBarrierNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           presentBarrierSupported;\n} VkSurfaceCapabilitiesPresentBarrierNV;\n\ntypedef struct VkSwapchainPresentBarrierCreateInfoNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           presentBarrierEnable;\n} VkSwapchainPresentBarrierCreateInfoNV;\n\n\n\n// VK_EXT_private_data is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_private_data 1\ntypedef VkPrivateDataSlot VkPrivateDataSlotEXT;\n\n#define VK_EXT_PRIVATE_DATA_SPEC_VERSION  1\n#define VK_EXT_PRIVATE_DATA_EXTENSION_NAME \"VK_EXT_private_data\"\ntypedef VkPrivateDataSlotCreateFlags VkPrivateDataSlotCreateFlagsEXT;\n\ntypedef VkPhysicalDevicePrivateDataFeatures VkPhysicalDevicePrivateDataFeaturesEXT;\n\ntypedef VkDevicePrivateDataCreateInfo VkDevicePrivateDataCreateInfoEXT;\n\ntypedef VkPrivateDataSlotCreateInfo VkPrivateDataSlotCreateInfoEXT;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreatePrivateDataSlotEXT)(VkDevice device, const VkPrivateDataSlotCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPrivateDataSlot* pPrivateDataSlot);\ntypedef void (VKAPI_PTR *PFN_vkDestroyPrivateDataSlotEXT)(VkDevice device, VkPrivateDataSlot privateDataSlot, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkSetPrivateDataEXT)(VkDevice device, VkObjectType objectType, uint64_t objectHandle, VkPrivateDataSlot privateDataSlot, uint64_t data);\ntypedef void (VKAPI_PTR *PFN_vkGetPrivateDataEXT)(VkDevice device, VkObjectType objectType, uint64_t objectHandle, VkPrivateDataSlot privateDataSlot, uint64_t* pData);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreatePrivateDataSlotEXT(\n    VkDevice                                    device,\n    const VkPrivateDataSlotCreateInfo*          pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkPrivateDataSlot*                          pPrivateDataSlot);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyPrivateDataSlotEXT(\n    VkDevice                                    device,\n    VkPrivateDataSlot                           privateDataSlot,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkSetPrivateDataEXT(\n    VkDevice                                    device,\n    VkObjectType                                objectType,\n    uint64_t                                    objectHandle,\n    VkPrivateDataSlot                           privateDataSlot,\n    uint64_t                                    data);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPrivateDataEXT(\n    VkDevice                                    device,\n    VkObjectType                                objectType,\n    uint64_t                                    objectHandle,\n    VkPrivateDataSlot                           privateDataSlot,\n    uint64_t*                                   pData);\n#endif\n\n\n// VK_EXT_pipeline_creation_cache_control is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_pipeline_creation_cache_control 1\n#define VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_SPEC_VERSION 3\n#define VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME \"VK_EXT_pipeline_creation_cache_control\"\ntypedef VkPhysicalDevicePipelineCreationCacheControlFeatures VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT;\n\n\n\n// VK_NV_device_diagnostics_config is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_device_diagnostics_config 1\n#define VK_NV_DEVICE_DIAGNOSTICS_CONFIG_SPEC_VERSION 2\n#define VK_NV_DEVICE_DIAGNOSTICS_CONFIG_EXTENSION_NAME \"VK_NV_device_diagnostics_config\"\n\ntypedef enum VkDeviceDiagnosticsConfigFlagBitsNV {\n    VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_SHADER_DEBUG_INFO_BIT_NV = 0x00000001,\n    VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_RESOURCE_TRACKING_BIT_NV = 0x00000002,\n    VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_AUTOMATIC_CHECKPOINTS_BIT_NV = 0x00000004,\n    VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_SHADER_ERROR_REPORTING_BIT_NV = 0x00000008,\n    VK_DEVICE_DIAGNOSTICS_CONFIG_FLAG_BITS_MAX_ENUM_NV = 0x7FFFFFFF\n} VkDeviceDiagnosticsConfigFlagBitsNV;\ntypedef VkFlags VkDeviceDiagnosticsConfigFlagsNV;\ntypedef struct VkPhysicalDeviceDiagnosticsConfigFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           diagnosticsConfig;\n} VkPhysicalDeviceDiagnosticsConfigFeaturesNV;\n\ntypedef struct VkDeviceDiagnosticsConfigCreateInfoNV {\n    VkStructureType                     sType;\n    const void*                         pNext;\n    VkDeviceDiagnosticsConfigFlagsNV    flags;\n} VkDeviceDiagnosticsConfigCreateInfoNV;\n\n\n\n// VK_QCOM_render_pass_store_ops is a preprocessor guard. Do not pass it to API calls.\n#define VK_QCOM_render_pass_store_ops 1\n#define VK_QCOM_RENDER_PASS_STORE_OPS_SPEC_VERSION 2\n#define VK_QCOM_RENDER_PASS_STORE_OPS_EXTENSION_NAME \"VK_QCOM_render_pass_store_ops\"\n\n\n// VK_NV_cuda_kernel_launch is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_cuda_kernel_launch 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkCudaModuleNV)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkCudaFunctionNV)\n#define VK_NV_CUDA_KERNEL_LAUNCH_SPEC_VERSION 2\n#define VK_NV_CUDA_KERNEL_LAUNCH_EXTENSION_NAME \"VK_NV_cuda_kernel_launch\"\ntypedef struct VkCudaModuleCreateInfoNV {\n    VkStructureType    sType;\n    const void*        pNext;\n    size_t             dataSize;\n    const void*        pData;\n} VkCudaModuleCreateInfoNV;\n\ntypedef struct VkCudaFunctionCreateInfoNV {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkCudaModuleNV     module;\n    const char*        pName;\n} VkCudaFunctionCreateInfoNV;\n\ntypedef struct VkCudaLaunchInfoNV {\n    VkStructureType        sType;\n    const void*            pNext;\n    VkCudaFunctionNV       function;\n    uint32_t               gridDimX;\n    uint32_t               gridDimY;\n    uint32_t               gridDimZ;\n    uint32_t               blockDimX;\n    uint32_t               blockDimY;\n    uint32_t               blockDimZ;\n    uint32_t               sharedMemBytes;\n    size_t                 paramCount;\n    const void* const *    pParams;\n    size_t                 extraCount;\n    const void* const *    pExtras;\n} VkCudaLaunchInfoNV;\n\ntypedef struct VkPhysicalDeviceCudaKernelLaunchFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           cudaKernelLaunchFeatures;\n} VkPhysicalDeviceCudaKernelLaunchFeaturesNV;\n\ntypedef struct VkPhysicalDeviceCudaKernelLaunchPropertiesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           computeCapabilityMinor;\n    uint32_t           computeCapabilityMajor;\n} VkPhysicalDeviceCudaKernelLaunchPropertiesNV;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateCudaModuleNV)(VkDevice device, const VkCudaModuleCreateInfoNV* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkCudaModuleNV* pModule);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetCudaModuleCacheNV)(VkDevice device, VkCudaModuleNV module, size_t* pCacheSize, void* pCacheData);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateCudaFunctionNV)(VkDevice device, const VkCudaFunctionCreateInfoNV* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkCudaFunctionNV* pFunction);\ntypedef void (VKAPI_PTR *PFN_vkDestroyCudaModuleNV)(VkDevice device, VkCudaModuleNV module, const VkAllocationCallbacks* pAllocator);\ntypedef void (VKAPI_PTR *PFN_vkDestroyCudaFunctionNV)(VkDevice device, VkCudaFunctionNV function, const VkAllocationCallbacks* pAllocator);\ntypedef void (VKAPI_PTR *PFN_vkCmdCudaLaunchKernelNV)(VkCommandBuffer commandBuffer, const VkCudaLaunchInfoNV* pLaunchInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateCudaModuleNV(\n    VkDevice                                    device,\n    const VkCudaModuleCreateInfoNV*             pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkCudaModuleNV*                             pModule);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetCudaModuleCacheNV(\n    VkDevice                                    device,\n    VkCudaModuleNV                              module,\n    size_t*                                     pCacheSize,\n    void*                                       pCacheData);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateCudaFunctionNV(\n    VkDevice                                    device,\n    const VkCudaFunctionCreateInfoNV*           pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkCudaFunctionNV*                           pFunction);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyCudaModuleNV(\n    VkDevice                                    device,\n    VkCudaModuleNV                              module,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyCudaFunctionNV(\n    VkDevice                                    device,\n    VkCudaFunctionNV                            function,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCudaLaunchKernelNV(\n    VkCommandBuffer                             commandBuffer,\n    const VkCudaLaunchInfoNV*                   pLaunchInfo);\n#endif\n\n\n// VK_NV_low_latency is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_low_latency 1\n#define VK_NV_LOW_LATENCY_SPEC_VERSION    1\n#define VK_NV_LOW_LATENCY_EXTENSION_NAME  \"VK_NV_low_latency\"\ntypedef struct VkQueryLowLatencySupportNV {\n    VkStructureType    sType;\n    const void*        pNext;\n    void*              pQueriedLowLatencyData;\n} VkQueryLowLatencySupportNV;\n\n\n\n// VK_EXT_descriptor_buffer is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_descriptor_buffer 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkAccelerationStructureKHR)\n#define VK_EXT_DESCRIPTOR_BUFFER_SPEC_VERSION 1\n#define VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME \"VK_EXT_descriptor_buffer\"\ntypedef struct VkPhysicalDeviceDescriptorBufferPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           combinedImageSamplerDescriptorSingleArray;\n    VkBool32           bufferlessPushDescriptors;\n    VkBool32           allowSamplerImageViewPostSubmitCreation;\n    VkDeviceSize       descriptorBufferOffsetAlignment;\n    uint32_t           maxDescriptorBufferBindings;\n    uint32_t           maxResourceDescriptorBufferBindings;\n    uint32_t           maxSamplerDescriptorBufferBindings;\n    uint32_t           maxEmbeddedImmutableSamplerBindings;\n    uint32_t           maxEmbeddedImmutableSamplers;\n    size_t             bufferCaptureReplayDescriptorDataSize;\n    size_t             imageCaptureReplayDescriptorDataSize;\n    size_t             imageViewCaptureReplayDescriptorDataSize;\n    size_t             samplerCaptureReplayDescriptorDataSize;\n    size_t             accelerationStructureCaptureReplayDescriptorDataSize;\n    size_t             samplerDescriptorSize;\n    size_t             combinedImageSamplerDescriptorSize;\n    size_t             sampledImageDescriptorSize;\n    size_t             storageImageDescriptorSize;\n    size_t             uniformTexelBufferDescriptorSize;\n    size_t             robustUniformTexelBufferDescriptorSize;\n    size_t             storageTexelBufferDescriptorSize;\n    size_t             robustStorageTexelBufferDescriptorSize;\n    size_t             uniformBufferDescriptorSize;\n    size_t             robustUniformBufferDescriptorSize;\n    size_t             storageBufferDescriptorSize;\n    size_t             robustStorageBufferDescriptorSize;\n    size_t             inputAttachmentDescriptorSize;\n    size_t             accelerationStructureDescriptorSize;\n    VkDeviceSize       maxSamplerDescriptorBufferRange;\n    VkDeviceSize       maxResourceDescriptorBufferRange;\n    VkDeviceSize       samplerDescriptorBufferAddressSpaceSize;\n    VkDeviceSize       resourceDescriptorBufferAddressSpaceSize;\n    VkDeviceSize       descriptorBufferAddressSpaceSize;\n} VkPhysicalDeviceDescriptorBufferPropertiesEXT;\n\ntypedef struct VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    size_t             combinedImageSamplerDensityMapDescriptorSize;\n} VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT;\n\ntypedef struct VkPhysicalDeviceDescriptorBufferFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           descriptorBuffer;\n    VkBool32           descriptorBufferCaptureReplay;\n    VkBool32           descriptorBufferImageLayoutIgnored;\n    VkBool32           descriptorBufferPushDescriptors;\n} VkPhysicalDeviceDescriptorBufferFeaturesEXT;\n\ntypedef struct VkDescriptorAddressInfoEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkDeviceAddress    address;\n    VkDeviceSize       range;\n    VkFormat           format;\n} VkDescriptorAddressInfoEXT;\n\ntypedef struct VkDescriptorBufferBindingInfoEXT {\n    VkStructureType       sType;\n    const void*           pNext;\n    VkDeviceAddress       address;\n    VkBufferUsageFlags    usage;\n} VkDescriptorBufferBindingInfoEXT;\n\ntypedef struct VkDescriptorBufferBindingPushDescriptorBufferHandleEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBuffer           buffer;\n} VkDescriptorBufferBindingPushDescriptorBufferHandleEXT;\n\ntypedef union VkDescriptorDataEXT {\n    const VkSampler*                     pSampler;\n    const VkDescriptorImageInfo*         pCombinedImageSampler;\n    const VkDescriptorImageInfo*         pInputAttachmentImage;\n    const VkDescriptorImageInfo*         pSampledImage;\n    const VkDescriptorImageInfo*         pStorageImage;\n    const VkDescriptorAddressInfoEXT*    pUniformTexelBuffer;\n    const VkDescriptorAddressInfoEXT*    pStorageTexelBuffer;\n    const VkDescriptorAddressInfoEXT*    pUniformBuffer;\n    const VkDescriptorAddressInfoEXT*    pStorageBuffer;\n    VkDeviceAddress                      accelerationStructure;\n} VkDescriptorDataEXT;\n\ntypedef struct VkDescriptorGetInfoEXT {\n    VkStructureType        sType;\n    const void*            pNext;\n    VkDescriptorType       type;\n    VkDescriptorDataEXT    data;\n} VkDescriptorGetInfoEXT;\n\ntypedef struct VkBufferCaptureDescriptorDataInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBuffer           buffer;\n} VkBufferCaptureDescriptorDataInfoEXT;\n\ntypedef struct VkImageCaptureDescriptorDataInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkImage            image;\n} VkImageCaptureDescriptorDataInfoEXT;\n\ntypedef struct VkImageViewCaptureDescriptorDataInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkImageView        imageView;\n} VkImageViewCaptureDescriptorDataInfoEXT;\n\ntypedef struct VkSamplerCaptureDescriptorDataInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkSampler          sampler;\n} VkSamplerCaptureDescriptorDataInfoEXT;\n\ntypedef struct VkOpaqueCaptureDescriptorDataCreateInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    const void*        opaqueCaptureDescriptorData;\n} VkOpaqueCaptureDescriptorDataCreateInfoEXT;\n\ntypedef struct VkAccelerationStructureCaptureDescriptorDataInfoEXT {\n    VkStructureType               sType;\n    const void*                   pNext;\n    VkAccelerationStructureKHR    accelerationStructure;\n    VkAccelerationStructureNV     accelerationStructureNV;\n} VkAccelerationStructureCaptureDescriptorDataInfoEXT;\n\ntypedef void (VKAPI_PTR *PFN_vkGetDescriptorSetLayoutSizeEXT)(VkDevice device, VkDescriptorSetLayout layout, VkDeviceSize* pLayoutSizeInBytes);\ntypedef void (VKAPI_PTR *PFN_vkGetDescriptorSetLayoutBindingOffsetEXT)(VkDevice device, VkDescriptorSetLayout layout, uint32_t binding, VkDeviceSize* pOffset);\ntypedef void (VKAPI_PTR *PFN_vkGetDescriptorEXT)(VkDevice device, const VkDescriptorGetInfoEXT* pDescriptorInfo, size_t dataSize, void* pDescriptor);\ntypedef void (VKAPI_PTR *PFN_vkCmdBindDescriptorBuffersEXT)(VkCommandBuffer commandBuffer, uint32_t bufferCount, const VkDescriptorBufferBindingInfoEXT* pBindingInfos);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDescriptorBufferOffsetsEXT)(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t firstSet, uint32_t setCount, const uint32_t* pBufferIndices, const VkDeviceSize* pOffsets);\ntypedef void (VKAPI_PTR *PFN_vkCmdBindDescriptorBufferEmbeddedSamplersEXT)(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t set);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetBufferOpaqueCaptureDescriptorDataEXT)(VkDevice device, const VkBufferCaptureDescriptorDataInfoEXT* pInfo, void* pData);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetImageOpaqueCaptureDescriptorDataEXT)(VkDevice device, const VkImageCaptureDescriptorDataInfoEXT* pInfo, void* pData);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetImageViewOpaqueCaptureDescriptorDataEXT)(VkDevice device, const VkImageViewCaptureDescriptorDataInfoEXT* pInfo, void* pData);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetSamplerOpaqueCaptureDescriptorDataEXT)(VkDevice device, const VkSamplerCaptureDescriptorDataInfoEXT* pInfo, void* pData);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT)(VkDevice device, const VkAccelerationStructureCaptureDescriptorDataInfoEXT* pInfo, void* pData);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkGetDescriptorSetLayoutSizeEXT(\n    VkDevice                                    device,\n    VkDescriptorSetLayout                       layout,\n    VkDeviceSize*                               pLayoutSizeInBytes);\n\nVKAPI_ATTR void VKAPI_CALL vkGetDescriptorSetLayoutBindingOffsetEXT(\n    VkDevice                                    device,\n    VkDescriptorSetLayout                       layout,\n    uint32_t                                    binding,\n    VkDeviceSize*                               pOffset);\n\nVKAPI_ATTR void VKAPI_CALL vkGetDescriptorEXT(\n    VkDevice                                    device,\n    const VkDescriptorGetInfoEXT*               pDescriptorInfo,\n    size_t                                      dataSize,\n    void*                                       pDescriptor);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorBuffersEXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    bufferCount,\n    const VkDescriptorBufferBindingInfoEXT*     pBindingInfos);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDescriptorBufferOffsetsEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkPipelineBindPoint                         pipelineBindPoint,\n    VkPipelineLayout                            layout,\n    uint32_t                                    firstSet,\n    uint32_t                                    setCount,\n    const uint32_t*                             pBufferIndices,\n    const VkDeviceSize*                         pOffsets);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorBufferEmbeddedSamplersEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkPipelineBindPoint                         pipelineBindPoint,\n    VkPipelineLayout                            layout,\n    uint32_t                                    set);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetBufferOpaqueCaptureDescriptorDataEXT(\n    VkDevice                                    device,\n    const VkBufferCaptureDescriptorDataInfoEXT* pInfo,\n    void*                                       pData);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetImageOpaqueCaptureDescriptorDataEXT(\n    VkDevice                                    device,\n    const VkImageCaptureDescriptorDataInfoEXT*  pInfo,\n    void*                                       pData);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetImageViewOpaqueCaptureDescriptorDataEXT(\n    VkDevice                                    device,\n    const VkImageViewCaptureDescriptorDataInfoEXT* pInfo,\n    void*                                       pData);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetSamplerOpaqueCaptureDescriptorDataEXT(\n    VkDevice                                    device,\n    const VkSamplerCaptureDescriptorDataInfoEXT* pInfo,\n    void*                                       pData);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT(\n    VkDevice                                    device,\n    const VkAccelerationStructureCaptureDescriptorDataInfoEXT* pInfo,\n    void*                                       pData);\n#endif\n\n\n// VK_EXT_graphics_pipeline_library is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_graphics_pipeline_library 1\n#define VK_EXT_GRAPHICS_PIPELINE_LIBRARY_SPEC_VERSION 1\n#define VK_EXT_GRAPHICS_PIPELINE_LIBRARY_EXTENSION_NAME \"VK_EXT_graphics_pipeline_library\"\n\ntypedef enum VkGraphicsPipelineLibraryFlagBitsEXT {\n    VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_EXT = 0x00000001,\n    VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT = 0x00000002,\n    VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT = 0x00000004,\n    VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT = 0x00000008,\n    VK_GRAPHICS_PIPELINE_LIBRARY_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkGraphicsPipelineLibraryFlagBitsEXT;\ntypedef VkFlags VkGraphicsPipelineLibraryFlagsEXT;\ntypedef struct VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           graphicsPipelineLibrary;\n} VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT;\n\ntypedef struct VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           graphicsPipelineLibraryFastLinking;\n    VkBool32           graphicsPipelineLibraryIndependentInterpolationDecoration;\n} VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT;\n\ntypedef struct VkGraphicsPipelineLibraryCreateInfoEXT {\n    VkStructureType                      sType;\n    const void*                          pNext;\n    VkGraphicsPipelineLibraryFlagsEXT    flags;\n} VkGraphicsPipelineLibraryCreateInfoEXT;\n\n\n\n// VK_AMD_shader_early_and_late_fragment_tests is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMD_shader_early_and_late_fragment_tests 1\n#define VK_AMD_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_SPEC_VERSION 1\n#define VK_AMD_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_EXTENSION_NAME \"VK_AMD_shader_early_and_late_fragment_tests\"\ntypedef struct VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderEarlyAndLateFragmentTests;\n} VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD;\n\n\n\n// VK_NV_fragment_shading_rate_enums is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_fragment_shading_rate_enums 1\n#define VK_NV_FRAGMENT_SHADING_RATE_ENUMS_SPEC_VERSION 1\n#define VK_NV_FRAGMENT_SHADING_RATE_ENUMS_EXTENSION_NAME \"VK_NV_fragment_shading_rate_enums\"\n\ntypedef enum VkFragmentShadingRateTypeNV {\n    VK_FRAGMENT_SHADING_RATE_TYPE_FRAGMENT_SIZE_NV = 0,\n    VK_FRAGMENT_SHADING_RATE_TYPE_ENUMS_NV = 1,\n    VK_FRAGMENT_SHADING_RATE_TYPE_MAX_ENUM_NV = 0x7FFFFFFF\n} VkFragmentShadingRateTypeNV;\n\ntypedef enum VkFragmentShadingRateNV {\n    VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV = 0,\n    VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_1X2_PIXELS_NV = 1,\n    VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_2X1_PIXELS_NV = 4,\n    VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_2X2_PIXELS_NV = 5,\n    VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_2X4_PIXELS_NV = 6,\n    VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_4X2_PIXELS_NV = 9,\n    VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_4X4_PIXELS_NV = 10,\n    VK_FRAGMENT_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NV = 11,\n    VK_FRAGMENT_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NV = 12,\n    VK_FRAGMENT_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NV = 13,\n    VK_FRAGMENT_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV = 14,\n    VK_FRAGMENT_SHADING_RATE_NO_INVOCATIONS_NV = 15,\n    VK_FRAGMENT_SHADING_RATE_MAX_ENUM_NV = 0x7FFFFFFF\n} VkFragmentShadingRateNV;\ntypedef struct VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           fragmentShadingRateEnums;\n    VkBool32           supersampleFragmentShadingRates;\n    VkBool32           noInvocationFragmentShadingRates;\n} VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV;\n\ntypedef struct VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV {\n    VkStructureType          sType;\n    void*                    pNext;\n    VkSampleCountFlagBits    maxFragmentShadingRateInvocationCount;\n} VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV;\n\ntypedef struct VkPipelineFragmentShadingRateEnumStateCreateInfoNV {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkFragmentShadingRateTypeNV           shadingRateType;\n    VkFragmentShadingRateNV               shadingRate;\n    VkFragmentShadingRateCombinerOpKHR    combinerOps[2];\n} VkPipelineFragmentShadingRateEnumStateCreateInfoNV;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdSetFragmentShadingRateEnumNV)(VkCommandBuffer           commandBuffer, VkFragmentShadingRateNV                     shadingRate, const VkFragmentShadingRateCombinerOpKHR    combinerOps[2]);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdSetFragmentShadingRateEnumNV(\n    VkCommandBuffer                             commandBuffer,\n    VkFragmentShadingRateNV                     shadingRate,\n    const VkFragmentShadingRateCombinerOpKHR    combinerOps[2]);\n#endif\n\n\n// VK_NV_ray_tracing_motion_blur is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_ray_tracing_motion_blur 1\n#define VK_NV_RAY_TRACING_MOTION_BLUR_SPEC_VERSION 1\n#define VK_NV_RAY_TRACING_MOTION_BLUR_EXTENSION_NAME \"VK_NV_ray_tracing_motion_blur\"\n\ntypedef enum VkAccelerationStructureMotionInstanceTypeNV {\n    VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_STATIC_NV = 0,\n    VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_MATRIX_MOTION_NV = 1,\n    VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_SRT_MOTION_NV = 2,\n    VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_MAX_ENUM_NV = 0x7FFFFFFF\n} VkAccelerationStructureMotionInstanceTypeNV;\ntypedef VkFlags VkAccelerationStructureMotionInfoFlagsNV;\ntypedef VkFlags VkAccelerationStructureMotionInstanceFlagsNV;\ntypedef union VkDeviceOrHostAddressConstKHR {\n    VkDeviceAddress    deviceAddress;\n    const void*        hostAddress;\n} VkDeviceOrHostAddressConstKHR;\n\ntypedef struct VkAccelerationStructureGeometryMotionTrianglesDataNV {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkDeviceOrHostAddressConstKHR    vertexData;\n} VkAccelerationStructureGeometryMotionTrianglesDataNV;\n\ntypedef struct VkAccelerationStructureMotionInfoNV {\n    VkStructureType                             sType;\n    const void*                                 pNext;\n    uint32_t                                    maxInstances;\n    VkAccelerationStructureMotionInfoFlagsNV    flags;\n} VkAccelerationStructureMotionInfoNV;\n\ntypedef struct VkAccelerationStructureMatrixMotionInstanceNV {\n    VkTransformMatrixKHR          transformT0;\n    VkTransformMatrixKHR          transformT1;\n    uint32_t                      instanceCustomIndex:24;\n    uint32_t                      mask:8;\n    uint32_t                      instanceShaderBindingTableRecordOffset:24;\n    VkGeometryInstanceFlagsKHR    flags:8;\n    uint64_t                      accelerationStructureReference;\n} VkAccelerationStructureMatrixMotionInstanceNV;\n\ntypedef struct VkSRTDataNV {\n    float    sx;\n    float    a;\n    float    b;\n    float    pvx;\n    float    sy;\n    float    c;\n    float    pvy;\n    float    sz;\n    float    pvz;\n    float    qx;\n    float    qy;\n    float    qz;\n    float    qw;\n    float    tx;\n    float    ty;\n    float    tz;\n} VkSRTDataNV;\n\ntypedef struct VkAccelerationStructureSRTMotionInstanceNV {\n    VkSRTDataNV                   transformT0;\n    VkSRTDataNV                   transformT1;\n    uint32_t                      instanceCustomIndex:24;\n    uint32_t                      mask:8;\n    uint32_t                      instanceShaderBindingTableRecordOffset:24;\n    VkGeometryInstanceFlagsKHR    flags:8;\n    uint64_t                      accelerationStructureReference;\n} VkAccelerationStructureSRTMotionInstanceNV;\n\ntypedef union VkAccelerationStructureMotionInstanceDataNV {\n    VkAccelerationStructureInstanceKHR               staticInstance;\n    VkAccelerationStructureMatrixMotionInstanceNV    matrixMotionInstance;\n    VkAccelerationStructureSRTMotionInstanceNV       srtMotionInstance;\n} VkAccelerationStructureMotionInstanceDataNV;\n\ntypedef struct VkAccelerationStructureMotionInstanceNV {\n    VkAccelerationStructureMotionInstanceTypeNV     type;\n    VkAccelerationStructureMotionInstanceFlagsNV    flags;\n    VkAccelerationStructureMotionInstanceDataNV     data;\n} VkAccelerationStructureMotionInstanceNV;\n\ntypedef struct VkPhysicalDeviceRayTracingMotionBlurFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           rayTracingMotionBlur;\n    VkBool32           rayTracingMotionBlurPipelineTraceRaysIndirect;\n} VkPhysicalDeviceRayTracingMotionBlurFeaturesNV;\n\n\n\n// VK_EXT_ycbcr_2plane_444_formats is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_ycbcr_2plane_444_formats 1\n#define VK_EXT_YCBCR_2PLANE_444_FORMATS_SPEC_VERSION 1\n#define VK_EXT_YCBCR_2PLANE_444_FORMATS_EXTENSION_NAME \"VK_EXT_ycbcr_2plane_444_formats\"\ntypedef struct VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           ycbcr2plane444Formats;\n} VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT;\n\n\n\n// VK_EXT_fragment_density_map2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_fragment_density_map2 1\n#define VK_EXT_FRAGMENT_DENSITY_MAP_2_SPEC_VERSION 1\n#define VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME \"VK_EXT_fragment_density_map2\"\ntypedef struct VkPhysicalDeviceFragmentDensityMap2FeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           fragmentDensityMapDeferred;\n} VkPhysicalDeviceFragmentDensityMap2FeaturesEXT;\n\ntypedef struct VkPhysicalDeviceFragmentDensityMap2PropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           subsampledLoads;\n    VkBool32           subsampledCoarseReconstructionEarlyAccess;\n    uint32_t           maxSubsampledArrayLayers;\n    uint32_t           maxDescriptorSetSubsampledSamplers;\n} VkPhysicalDeviceFragmentDensityMap2PropertiesEXT;\n\n\n\n// VK_QCOM_rotated_copy_commands is a preprocessor guard. Do not pass it to API calls.\n#define VK_QCOM_rotated_copy_commands 1\n#define VK_QCOM_ROTATED_COPY_COMMANDS_SPEC_VERSION 2\n#define VK_QCOM_ROTATED_COPY_COMMANDS_EXTENSION_NAME \"VK_QCOM_rotated_copy_commands\"\ntypedef struct VkCopyCommandTransformInfoQCOM {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkSurfaceTransformFlagBitsKHR    transform;\n} VkCopyCommandTransformInfoQCOM;\n\n\n\n// VK_EXT_image_robustness is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_image_robustness 1\n#define VK_EXT_IMAGE_ROBUSTNESS_SPEC_VERSION 1\n#define VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME \"VK_EXT_image_robustness\"\ntypedef VkPhysicalDeviceImageRobustnessFeatures VkPhysicalDeviceImageRobustnessFeaturesEXT;\n\n\n\n// VK_EXT_image_compression_control is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_image_compression_control 1\n#define VK_EXT_IMAGE_COMPRESSION_CONTROL_SPEC_VERSION 1\n#define VK_EXT_IMAGE_COMPRESSION_CONTROL_EXTENSION_NAME \"VK_EXT_image_compression_control\"\n\ntypedef enum VkImageCompressionFlagBitsEXT {\n    VK_IMAGE_COMPRESSION_DEFAULT_EXT = 0,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_DEFAULT_EXT = 0x00000001,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT = 0x00000002,\n    VK_IMAGE_COMPRESSION_DISABLED_EXT = 0x00000004,\n    VK_IMAGE_COMPRESSION_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkImageCompressionFlagBitsEXT;\ntypedef VkFlags VkImageCompressionFlagsEXT;\n\ntypedef enum VkImageCompressionFixedRateFlagBitsEXT {\n    VK_IMAGE_COMPRESSION_FIXED_RATE_NONE_EXT = 0,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_1BPC_BIT_EXT = 0x00000001,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_2BPC_BIT_EXT = 0x00000002,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_3BPC_BIT_EXT = 0x00000004,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_4BPC_BIT_EXT = 0x00000008,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_5BPC_BIT_EXT = 0x00000010,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_6BPC_BIT_EXT = 0x00000020,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_7BPC_BIT_EXT = 0x00000040,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_8BPC_BIT_EXT = 0x00000080,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_9BPC_BIT_EXT = 0x00000100,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_10BPC_BIT_EXT = 0x00000200,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_11BPC_BIT_EXT = 0x00000400,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_12BPC_BIT_EXT = 0x00000800,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_13BPC_BIT_EXT = 0x00001000,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_14BPC_BIT_EXT = 0x00002000,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_15BPC_BIT_EXT = 0x00004000,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_16BPC_BIT_EXT = 0x00008000,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_17BPC_BIT_EXT = 0x00010000,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_18BPC_BIT_EXT = 0x00020000,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_19BPC_BIT_EXT = 0x00040000,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_20BPC_BIT_EXT = 0x00080000,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_21BPC_BIT_EXT = 0x00100000,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_22BPC_BIT_EXT = 0x00200000,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_23BPC_BIT_EXT = 0x00400000,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_24BPC_BIT_EXT = 0x00800000,\n    VK_IMAGE_COMPRESSION_FIXED_RATE_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkImageCompressionFixedRateFlagBitsEXT;\ntypedef VkFlags VkImageCompressionFixedRateFlagsEXT;\ntypedef struct VkPhysicalDeviceImageCompressionControlFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           imageCompressionControl;\n} VkPhysicalDeviceImageCompressionControlFeaturesEXT;\n\ntypedef struct VkImageCompressionControlEXT {\n    VkStructureType                         sType;\n    const void*                             pNext;\n    VkImageCompressionFlagsEXT              flags;\n    uint32_t                                compressionControlPlaneCount;\n    VkImageCompressionFixedRateFlagsEXT*    pFixedRateFlags;\n} VkImageCompressionControlEXT;\n\ntypedef struct VkImageCompressionPropertiesEXT {\n    VkStructureType                        sType;\n    void*                                  pNext;\n    VkImageCompressionFlagsEXT             imageCompressionFlags;\n    VkImageCompressionFixedRateFlagsEXT    imageCompressionFixedRateFlags;\n} VkImageCompressionPropertiesEXT;\n\n\n\n// VK_EXT_attachment_feedback_loop_layout is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_attachment_feedback_loop_layout 1\n#define VK_EXT_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_SPEC_VERSION 2\n#define VK_EXT_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_EXTENSION_NAME \"VK_EXT_attachment_feedback_loop_layout\"\ntypedef struct VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           attachmentFeedbackLoopLayout;\n} VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT;\n\n\n\n// VK_EXT_4444_formats is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_4444_formats 1\n#define VK_EXT_4444_FORMATS_SPEC_VERSION  1\n#define VK_EXT_4444_FORMATS_EXTENSION_NAME \"VK_EXT_4444_formats\"\ntypedef struct VkPhysicalDevice4444FormatsFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           formatA4R4G4B4;\n    VkBool32           formatA4B4G4R4;\n} VkPhysicalDevice4444FormatsFeaturesEXT;\n\n\n\n// VK_EXT_device_fault is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_device_fault 1\n#define VK_EXT_DEVICE_FAULT_SPEC_VERSION  2\n#define VK_EXT_DEVICE_FAULT_EXTENSION_NAME \"VK_EXT_device_fault\"\n\ntypedef enum VkDeviceFaultAddressTypeEXT {\n    VK_DEVICE_FAULT_ADDRESS_TYPE_NONE_EXT = 0,\n    VK_DEVICE_FAULT_ADDRESS_TYPE_READ_INVALID_EXT = 1,\n    VK_DEVICE_FAULT_ADDRESS_TYPE_WRITE_INVALID_EXT = 2,\n    VK_DEVICE_FAULT_ADDRESS_TYPE_EXECUTE_INVALID_EXT = 3,\n    VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_UNKNOWN_EXT = 4,\n    VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_INVALID_EXT = 5,\n    VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_FAULT_EXT = 6,\n    VK_DEVICE_FAULT_ADDRESS_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkDeviceFaultAddressTypeEXT;\n\ntypedef enum VkDeviceFaultVendorBinaryHeaderVersionEXT {\n    VK_DEVICE_FAULT_VENDOR_BINARY_HEADER_VERSION_ONE_EXT = 1,\n    VK_DEVICE_FAULT_VENDOR_BINARY_HEADER_VERSION_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkDeviceFaultVendorBinaryHeaderVersionEXT;\ntypedef struct VkPhysicalDeviceFaultFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           deviceFault;\n    VkBool32           deviceFaultVendorBinary;\n} VkPhysicalDeviceFaultFeaturesEXT;\n\ntypedef struct VkDeviceFaultCountsEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           addressInfoCount;\n    uint32_t           vendorInfoCount;\n    VkDeviceSize       vendorBinarySize;\n} VkDeviceFaultCountsEXT;\n\ntypedef struct VkDeviceFaultAddressInfoEXT {\n    VkDeviceFaultAddressTypeEXT    addressType;\n    VkDeviceAddress                reportedAddress;\n    VkDeviceSize                   addressPrecision;\n} VkDeviceFaultAddressInfoEXT;\n\ntypedef struct VkDeviceFaultVendorInfoEXT {\n    char        description[VK_MAX_DESCRIPTION_SIZE];\n    uint64_t    vendorFaultCode;\n    uint64_t    vendorFaultData;\n} VkDeviceFaultVendorInfoEXT;\n\ntypedef struct VkDeviceFaultInfoEXT {\n    VkStructureType                 sType;\n    void*                           pNext;\n    char                            description[VK_MAX_DESCRIPTION_SIZE];\n    VkDeviceFaultAddressInfoEXT*    pAddressInfos;\n    VkDeviceFaultVendorInfoEXT*     pVendorInfos;\n    void*                           pVendorBinaryData;\n} VkDeviceFaultInfoEXT;\n\ntypedef struct VkDeviceFaultVendorBinaryHeaderVersionOneEXT {\n    uint32_t                                     headerSize;\n    VkDeviceFaultVendorBinaryHeaderVersionEXT    headerVersion;\n    uint32_t                                     vendorID;\n    uint32_t                                     deviceID;\n    uint32_t                                     driverVersion;\n    uint8_t                                      pipelineCacheUUID[VK_UUID_SIZE];\n    uint32_t                                     applicationNameOffset;\n    uint32_t                                     applicationVersion;\n    uint32_t                                     engineNameOffset;\n    uint32_t                                     engineVersion;\n    uint32_t                                     apiVersion;\n} VkDeviceFaultVendorBinaryHeaderVersionOneEXT;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetDeviceFaultInfoEXT)(VkDevice device, VkDeviceFaultCountsEXT* pFaultCounts, VkDeviceFaultInfoEXT* pFaultInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceFaultInfoEXT(\n    VkDevice                                    device,\n    VkDeviceFaultCountsEXT*                     pFaultCounts,\n    VkDeviceFaultInfoEXT*                       pFaultInfo);\n#endif\n\n\n// VK_ARM_rasterization_order_attachment_access is a preprocessor guard. Do not pass it to API calls.\n#define VK_ARM_rasterization_order_attachment_access 1\n#define VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_SPEC_VERSION 1\n#define VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME \"VK_ARM_rasterization_order_attachment_access\"\ntypedef struct VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           rasterizationOrderColorAttachmentAccess;\n    VkBool32           rasterizationOrderDepthAttachmentAccess;\n    VkBool32           rasterizationOrderStencilAttachmentAccess;\n} VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT;\n\ntypedef VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM;\n\n\n\n// VK_EXT_rgba10x6_formats is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_rgba10x6_formats 1\n#define VK_EXT_RGBA10X6_FORMATS_SPEC_VERSION 1\n#define VK_EXT_RGBA10X6_FORMATS_EXTENSION_NAME \"VK_EXT_rgba10x6_formats\"\ntypedef struct VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           formatRgba10x6WithoutYCbCrSampler;\n} VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT;\n\n\n\n// VK_VALVE_mutable_descriptor_type is a preprocessor guard. Do not pass it to API calls.\n#define VK_VALVE_mutable_descriptor_type 1\n#define VK_VALVE_MUTABLE_DESCRIPTOR_TYPE_SPEC_VERSION 1\n#define VK_VALVE_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME \"VK_VALVE_mutable_descriptor_type\"\ntypedef struct VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           mutableDescriptorType;\n} VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT;\n\ntypedef VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE;\n\ntypedef struct VkMutableDescriptorTypeListEXT {\n    uint32_t                   descriptorTypeCount;\n    const VkDescriptorType*    pDescriptorTypes;\n} VkMutableDescriptorTypeListEXT;\n\ntypedef VkMutableDescriptorTypeListEXT VkMutableDescriptorTypeListVALVE;\n\ntypedef struct VkMutableDescriptorTypeCreateInfoEXT {\n    VkStructureType                          sType;\n    const void*                              pNext;\n    uint32_t                                 mutableDescriptorTypeListCount;\n    const VkMutableDescriptorTypeListEXT*    pMutableDescriptorTypeLists;\n} VkMutableDescriptorTypeCreateInfoEXT;\n\ntypedef VkMutableDescriptorTypeCreateInfoEXT VkMutableDescriptorTypeCreateInfoVALVE;\n\n\n\n// VK_EXT_vertex_input_dynamic_state is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_vertex_input_dynamic_state 1\n#define VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_SPEC_VERSION 2\n#define VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME \"VK_EXT_vertex_input_dynamic_state\"\ntypedef struct VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           vertexInputDynamicState;\n} VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT;\n\ntypedef struct VkVertexInputBindingDescription2EXT {\n    VkStructureType      sType;\n    void*                pNext;\n    uint32_t             binding;\n    uint32_t             stride;\n    VkVertexInputRate    inputRate;\n    uint32_t             divisor;\n} VkVertexInputBindingDescription2EXT;\n\ntypedef struct VkVertexInputAttributeDescription2EXT {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           location;\n    uint32_t           binding;\n    VkFormat           format;\n    uint32_t           offset;\n} VkVertexInputAttributeDescription2EXT;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdSetVertexInputEXT)(VkCommandBuffer commandBuffer, uint32_t vertexBindingDescriptionCount, const VkVertexInputBindingDescription2EXT* pVertexBindingDescriptions, uint32_t vertexAttributeDescriptionCount, const VkVertexInputAttributeDescription2EXT* pVertexAttributeDescriptions);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdSetVertexInputEXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    vertexBindingDescriptionCount,\n    const VkVertexInputBindingDescription2EXT*  pVertexBindingDescriptions,\n    uint32_t                                    vertexAttributeDescriptionCount,\n    const VkVertexInputAttributeDescription2EXT* pVertexAttributeDescriptions);\n#endif\n\n\n// VK_EXT_physical_device_drm is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_physical_device_drm 1\n#define VK_EXT_PHYSICAL_DEVICE_DRM_SPEC_VERSION 1\n#define VK_EXT_PHYSICAL_DEVICE_DRM_EXTENSION_NAME \"VK_EXT_physical_device_drm\"\ntypedef struct VkPhysicalDeviceDrmPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           hasPrimary;\n    VkBool32           hasRender;\n    int64_t            primaryMajor;\n    int64_t            primaryMinor;\n    int64_t            renderMajor;\n    int64_t            renderMinor;\n} VkPhysicalDeviceDrmPropertiesEXT;\n\n\n\n// VK_EXT_device_address_binding_report is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_device_address_binding_report 1\n#define VK_EXT_DEVICE_ADDRESS_BINDING_REPORT_SPEC_VERSION 1\n#define VK_EXT_DEVICE_ADDRESS_BINDING_REPORT_EXTENSION_NAME \"VK_EXT_device_address_binding_report\"\n\ntypedef enum VkDeviceAddressBindingTypeEXT {\n    VK_DEVICE_ADDRESS_BINDING_TYPE_BIND_EXT = 0,\n    VK_DEVICE_ADDRESS_BINDING_TYPE_UNBIND_EXT = 1,\n    VK_DEVICE_ADDRESS_BINDING_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkDeviceAddressBindingTypeEXT;\n\ntypedef enum VkDeviceAddressBindingFlagBitsEXT {\n    VK_DEVICE_ADDRESS_BINDING_INTERNAL_OBJECT_BIT_EXT = 0x00000001,\n    VK_DEVICE_ADDRESS_BINDING_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkDeviceAddressBindingFlagBitsEXT;\ntypedef VkFlags VkDeviceAddressBindingFlagsEXT;\ntypedef struct VkPhysicalDeviceAddressBindingReportFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           reportAddressBinding;\n} VkPhysicalDeviceAddressBindingReportFeaturesEXT;\n\ntypedef struct VkDeviceAddressBindingCallbackDataEXT {\n    VkStructureType                   sType;\n    void*                             pNext;\n    VkDeviceAddressBindingFlagsEXT    flags;\n    VkDeviceAddress                   baseAddress;\n    VkDeviceSize                      size;\n    VkDeviceAddressBindingTypeEXT     bindingType;\n} VkDeviceAddressBindingCallbackDataEXT;\n\n\n\n// VK_EXT_depth_clip_control is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_depth_clip_control 1\n#define VK_EXT_DEPTH_CLIP_CONTROL_SPEC_VERSION 1\n#define VK_EXT_DEPTH_CLIP_CONTROL_EXTENSION_NAME \"VK_EXT_depth_clip_control\"\ntypedef struct VkPhysicalDeviceDepthClipControlFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           depthClipControl;\n} VkPhysicalDeviceDepthClipControlFeaturesEXT;\n\ntypedef struct VkPipelineViewportDepthClipControlCreateInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           negativeOneToOne;\n} VkPipelineViewportDepthClipControlCreateInfoEXT;\n\n\n\n// VK_EXT_primitive_topology_list_restart is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_primitive_topology_list_restart 1\n#define VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_SPEC_VERSION 1\n#define VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_EXTENSION_NAME \"VK_EXT_primitive_topology_list_restart\"\ntypedef struct VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           primitiveTopologyListRestart;\n    VkBool32           primitiveTopologyPatchListRestart;\n} VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT;\n\n\n\n// VK_EXT_present_mode_fifo_latest_ready is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_present_mode_fifo_latest_ready 1\n#define VK_EXT_PRESENT_MODE_FIFO_LATEST_READY_SPEC_VERSION 1\n#define VK_EXT_PRESENT_MODE_FIFO_LATEST_READY_EXTENSION_NAME \"VK_EXT_present_mode_fifo_latest_ready\"\ntypedef struct VkPhysicalDevicePresentModeFifoLatestReadyFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           presentModeFifoLatestReady;\n} VkPhysicalDevicePresentModeFifoLatestReadyFeaturesEXT;\n\n\n\n// VK_HUAWEI_subpass_shading is a preprocessor guard. Do not pass it to API calls.\n#define VK_HUAWEI_subpass_shading 1\n#define VK_HUAWEI_SUBPASS_SHADING_SPEC_VERSION 3\n#define VK_HUAWEI_SUBPASS_SHADING_EXTENSION_NAME \"VK_HUAWEI_subpass_shading\"\ntypedef struct VkSubpassShadingPipelineCreateInfoHUAWEI {\n    VkStructureType    sType;\n    void*              pNext;\n    VkRenderPass       renderPass;\n    uint32_t           subpass;\n} VkSubpassShadingPipelineCreateInfoHUAWEI;\n\ntypedef struct VkPhysicalDeviceSubpassShadingFeaturesHUAWEI {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           subpassShading;\n} VkPhysicalDeviceSubpassShadingFeaturesHUAWEI;\n\ntypedef struct VkPhysicalDeviceSubpassShadingPropertiesHUAWEI {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxSubpassShadingWorkgroupSizeAspectRatio;\n} VkPhysicalDeviceSubpassShadingPropertiesHUAWEI;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI)(VkDevice device, VkRenderPass renderpass, VkExtent2D* pMaxWorkgroupSize);\ntypedef void (VKAPI_PTR *PFN_vkCmdSubpassShadingHUAWEI)(VkCommandBuffer commandBuffer);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(\n    VkDevice                                    device,\n    VkRenderPass                                renderpass,\n    VkExtent2D*                                 pMaxWorkgroupSize);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSubpassShadingHUAWEI(\n    VkCommandBuffer                             commandBuffer);\n#endif\n\n\n// VK_HUAWEI_invocation_mask is a preprocessor guard. Do not pass it to API calls.\n#define VK_HUAWEI_invocation_mask 1\n#define VK_HUAWEI_INVOCATION_MASK_SPEC_VERSION 1\n#define VK_HUAWEI_INVOCATION_MASK_EXTENSION_NAME \"VK_HUAWEI_invocation_mask\"\ntypedef struct VkPhysicalDeviceInvocationMaskFeaturesHUAWEI {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           invocationMask;\n} VkPhysicalDeviceInvocationMaskFeaturesHUAWEI;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdBindInvocationMaskHUAWEI)(VkCommandBuffer commandBuffer, VkImageView imageView, VkImageLayout imageLayout);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdBindInvocationMaskHUAWEI(\n    VkCommandBuffer                             commandBuffer,\n    VkImageView                                 imageView,\n    VkImageLayout                               imageLayout);\n#endif\n\n\n// VK_NV_external_memory_rdma is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_external_memory_rdma 1\ntypedef void* VkRemoteAddressNV;\n#define VK_NV_EXTERNAL_MEMORY_RDMA_SPEC_VERSION 1\n#define VK_NV_EXTERNAL_MEMORY_RDMA_EXTENSION_NAME \"VK_NV_external_memory_rdma\"\ntypedef struct VkMemoryGetRemoteAddressInfoNV {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkDeviceMemory                        memory;\n    VkExternalMemoryHandleTypeFlagBits    handleType;\n} VkMemoryGetRemoteAddressInfoNV;\n\ntypedef struct VkPhysicalDeviceExternalMemoryRDMAFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           externalMemoryRDMA;\n} VkPhysicalDeviceExternalMemoryRDMAFeaturesNV;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetMemoryRemoteAddressNV)(VkDevice device, const VkMemoryGetRemoteAddressInfoNV* pMemoryGetRemoteAddressInfo, VkRemoteAddressNV* pAddress);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryRemoteAddressNV(\n    VkDevice                                    device,\n    const VkMemoryGetRemoteAddressInfoNV*       pMemoryGetRemoteAddressInfo,\n    VkRemoteAddressNV*                          pAddress);\n#endif\n\n\n// VK_EXT_pipeline_properties is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_pipeline_properties 1\n#define VK_EXT_PIPELINE_PROPERTIES_SPEC_VERSION 1\n#define VK_EXT_PIPELINE_PROPERTIES_EXTENSION_NAME \"VK_EXT_pipeline_properties\"\ntypedef VkPipelineInfoKHR VkPipelineInfoEXT;\n\ntypedef struct VkPipelinePropertiesIdentifierEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    uint8_t            pipelineIdentifier[VK_UUID_SIZE];\n} VkPipelinePropertiesIdentifierEXT;\n\ntypedef struct VkPhysicalDevicePipelinePropertiesFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           pipelinePropertiesIdentifier;\n} VkPhysicalDevicePipelinePropertiesFeaturesEXT;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPipelinePropertiesEXT)(VkDevice device, const VkPipelineInfoEXT* pPipelineInfo, VkBaseOutStructure* pPipelineProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPipelinePropertiesEXT(\n    VkDevice                                    device,\n    const VkPipelineInfoEXT*                    pPipelineInfo,\n    VkBaseOutStructure*                         pPipelineProperties);\n#endif\n\n\n// VK_EXT_frame_boundary is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_frame_boundary 1\n#define VK_EXT_FRAME_BOUNDARY_SPEC_VERSION 1\n#define VK_EXT_FRAME_BOUNDARY_EXTENSION_NAME \"VK_EXT_frame_boundary\"\n\ntypedef enum VkFrameBoundaryFlagBitsEXT {\n    VK_FRAME_BOUNDARY_FRAME_END_BIT_EXT = 0x00000001,\n    VK_FRAME_BOUNDARY_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkFrameBoundaryFlagBitsEXT;\ntypedef VkFlags VkFrameBoundaryFlagsEXT;\ntypedef struct VkPhysicalDeviceFrameBoundaryFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           frameBoundary;\n} VkPhysicalDeviceFrameBoundaryFeaturesEXT;\n\ntypedef struct VkFrameBoundaryEXT {\n    VkStructureType            sType;\n    const void*                pNext;\n    VkFrameBoundaryFlagsEXT    flags;\n    uint64_t                   frameID;\n    uint32_t                   imageCount;\n    const VkImage*             pImages;\n    uint32_t                   bufferCount;\n    const VkBuffer*            pBuffers;\n    uint64_t                   tagName;\n    size_t                     tagSize;\n    const void*                pTag;\n} VkFrameBoundaryEXT;\n\n\n\n// VK_EXT_multisampled_render_to_single_sampled is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_multisampled_render_to_single_sampled 1\n#define VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_SPEC_VERSION 1\n#define VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_EXTENSION_NAME \"VK_EXT_multisampled_render_to_single_sampled\"\ntypedef struct VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           multisampledRenderToSingleSampled;\n} VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT;\n\ntypedef struct VkSubpassResolvePerformanceQueryEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           optimal;\n} VkSubpassResolvePerformanceQueryEXT;\n\ntypedef struct VkMultisampledRenderToSingleSampledInfoEXT {\n    VkStructureType          sType;\n    const void*              pNext;\n    VkBool32                 multisampledRenderToSingleSampledEnable;\n    VkSampleCountFlagBits    rasterizationSamples;\n} VkMultisampledRenderToSingleSampledInfoEXT;\n\n\n\n// VK_EXT_extended_dynamic_state2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_extended_dynamic_state2 1\n#define VK_EXT_EXTENDED_DYNAMIC_STATE_2_SPEC_VERSION 1\n#define VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME \"VK_EXT_extended_dynamic_state2\"\ntypedef struct VkPhysicalDeviceExtendedDynamicState2FeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           extendedDynamicState2;\n    VkBool32           extendedDynamicState2LogicOp;\n    VkBool32           extendedDynamicState2PatchControlPoints;\n} VkPhysicalDeviceExtendedDynamicState2FeaturesEXT;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdSetPatchControlPointsEXT)(VkCommandBuffer commandBuffer, uint32_t patchControlPoints);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetRasterizerDiscardEnableEXT)(VkCommandBuffer commandBuffer, VkBool32 rasterizerDiscardEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDepthBiasEnableEXT)(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetLogicOpEXT)(VkCommandBuffer commandBuffer, VkLogicOp logicOp);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetPrimitiveRestartEnableEXT)(VkCommandBuffer commandBuffer, VkBool32 primitiveRestartEnable);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdSetPatchControlPointsEXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    patchControlPoints);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetRasterizerDiscardEnableEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    rasterizerDiscardEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBiasEnableEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    depthBiasEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetLogicOpEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkLogicOp                                   logicOp);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetPrimitiveRestartEnableEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    primitiveRestartEnable);\n#endif\n\n\n// VK_EXT_color_write_enable is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_color_write_enable 1\n#define VK_EXT_COLOR_WRITE_ENABLE_SPEC_VERSION 1\n#define VK_EXT_COLOR_WRITE_ENABLE_EXTENSION_NAME \"VK_EXT_color_write_enable\"\ntypedef struct VkPhysicalDeviceColorWriteEnableFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           colorWriteEnable;\n} VkPhysicalDeviceColorWriteEnableFeaturesEXT;\n\ntypedef struct VkPipelineColorWriteCreateInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           attachmentCount;\n    const VkBool32*    pColorWriteEnables;\n} VkPipelineColorWriteCreateInfoEXT;\n\ntypedef void                                    (VKAPI_PTR *PFN_vkCmdSetColorWriteEnableEXT)(VkCommandBuffer       commandBuffer, uint32_t                                attachmentCount, const VkBool32*   pColorWriteEnables);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void                                    VKAPI_CALL vkCmdSetColorWriteEnableEXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    attachmentCount,\n    const VkBool32*                             pColorWriteEnables);\n#endif\n\n\n// VK_EXT_primitives_generated_query is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_primitives_generated_query 1\n#define VK_EXT_PRIMITIVES_GENERATED_QUERY_SPEC_VERSION 1\n#define VK_EXT_PRIMITIVES_GENERATED_QUERY_EXTENSION_NAME \"VK_EXT_primitives_generated_query\"\ntypedef struct VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           primitivesGeneratedQuery;\n    VkBool32           primitivesGeneratedQueryWithRasterizerDiscard;\n    VkBool32           primitivesGeneratedQueryWithNonZeroStreams;\n} VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT;\n\n\n\n// VK_EXT_global_priority_query is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_global_priority_query 1\n#define VK_EXT_GLOBAL_PRIORITY_QUERY_SPEC_VERSION 1\n#define VK_EXT_GLOBAL_PRIORITY_QUERY_EXTENSION_NAME \"VK_EXT_global_priority_query\"\n#define VK_MAX_GLOBAL_PRIORITY_SIZE_EXT   VK_MAX_GLOBAL_PRIORITY_SIZE\ntypedef VkPhysicalDeviceGlobalPriorityQueryFeatures VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT;\n\ntypedef VkQueueFamilyGlobalPriorityProperties VkQueueFamilyGlobalPriorityPropertiesEXT;\n\n\n\n// VK_EXT_image_view_min_lod is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_image_view_min_lod 1\n#define VK_EXT_IMAGE_VIEW_MIN_LOD_SPEC_VERSION 1\n#define VK_EXT_IMAGE_VIEW_MIN_LOD_EXTENSION_NAME \"VK_EXT_image_view_min_lod\"\ntypedef struct VkPhysicalDeviceImageViewMinLodFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           minLod;\n} VkPhysicalDeviceImageViewMinLodFeaturesEXT;\n\ntypedef struct VkImageViewMinLodCreateInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    float              minLod;\n} VkImageViewMinLodCreateInfoEXT;\n\n\n\n// VK_EXT_multi_draw is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_multi_draw 1\n#define VK_EXT_MULTI_DRAW_SPEC_VERSION    1\n#define VK_EXT_MULTI_DRAW_EXTENSION_NAME  \"VK_EXT_multi_draw\"\ntypedef struct VkPhysicalDeviceMultiDrawFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           multiDraw;\n} VkPhysicalDeviceMultiDrawFeaturesEXT;\n\ntypedef struct VkPhysicalDeviceMultiDrawPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxMultiDrawCount;\n} VkPhysicalDeviceMultiDrawPropertiesEXT;\n\ntypedef struct VkMultiDrawInfoEXT {\n    uint32_t    firstVertex;\n    uint32_t    vertexCount;\n} VkMultiDrawInfoEXT;\n\ntypedef struct VkMultiDrawIndexedInfoEXT {\n    uint32_t    firstIndex;\n    uint32_t    indexCount;\n    int32_t     vertexOffset;\n} VkMultiDrawIndexedInfoEXT;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawMultiEXT)(VkCommandBuffer commandBuffer, uint32_t drawCount, const VkMultiDrawInfoEXT* pVertexInfo, uint32_t instanceCount, uint32_t firstInstance, uint32_t stride);\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawMultiIndexedEXT)(VkCommandBuffer commandBuffer, uint32_t drawCount, const VkMultiDrawIndexedInfoEXT* pIndexInfo, uint32_t instanceCount, uint32_t firstInstance, uint32_t stride, const int32_t* pVertexOffset);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawMultiEXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    drawCount,\n    const VkMultiDrawInfoEXT*                   pVertexInfo,\n    uint32_t                                    instanceCount,\n    uint32_t                                    firstInstance,\n    uint32_t                                    stride);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawMultiIndexedEXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    drawCount,\n    const VkMultiDrawIndexedInfoEXT*            pIndexInfo,\n    uint32_t                                    instanceCount,\n    uint32_t                                    firstInstance,\n    uint32_t                                    stride,\n    const int32_t*                              pVertexOffset);\n#endif\n\n\n// VK_EXT_image_2d_view_of_3d is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_image_2d_view_of_3d 1\n#define VK_EXT_IMAGE_2D_VIEW_OF_3D_SPEC_VERSION 1\n#define VK_EXT_IMAGE_2D_VIEW_OF_3D_EXTENSION_NAME \"VK_EXT_image_2d_view_of_3d\"\ntypedef struct VkPhysicalDeviceImage2DViewOf3DFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           image2DViewOf3D;\n    VkBool32           sampler2DViewOf3D;\n} VkPhysicalDeviceImage2DViewOf3DFeaturesEXT;\n\n\n\n// VK_EXT_shader_tile_image is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_shader_tile_image 1\n#define VK_EXT_SHADER_TILE_IMAGE_SPEC_VERSION 1\n#define VK_EXT_SHADER_TILE_IMAGE_EXTENSION_NAME \"VK_EXT_shader_tile_image\"\ntypedef struct VkPhysicalDeviceShaderTileImageFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderTileImageColorReadAccess;\n    VkBool32           shaderTileImageDepthReadAccess;\n    VkBool32           shaderTileImageStencilReadAccess;\n} VkPhysicalDeviceShaderTileImageFeaturesEXT;\n\ntypedef struct VkPhysicalDeviceShaderTileImagePropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderTileImageCoherentReadAccelerated;\n    VkBool32           shaderTileImageReadSampleFromPixelRateInvocation;\n    VkBool32           shaderTileImageReadFromHelperInvocation;\n} VkPhysicalDeviceShaderTileImagePropertiesEXT;\n\n\n\n// VK_EXT_opacity_micromap is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_opacity_micromap 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkMicromapEXT)\n#define VK_EXT_OPACITY_MICROMAP_SPEC_VERSION 2\n#define VK_EXT_OPACITY_MICROMAP_EXTENSION_NAME \"VK_EXT_opacity_micromap\"\n\ntypedef enum VkMicromapTypeEXT {\n    VK_MICROMAP_TYPE_OPACITY_MICROMAP_EXT = 0,\n#ifdef VK_ENABLE_BETA_EXTENSIONS\n    VK_MICROMAP_TYPE_DISPLACEMENT_MICROMAP_NV = 1000397000,\n#endif\n    VK_MICROMAP_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkMicromapTypeEXT;\n\ntypedef enum VkBuildMicromapModeEXT {\n    VK_BUILD_MICROMAP_MODE_BUILD_EXT = 0,\n    VK_BUILD_MICROMAP_MODE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkBuildMicromapModeEXT;\n\ntypedef enum VkCopyMicromapModeEXT {\n    VK_COPY_MICROMAP_MODE_CLONE_EXT = 0,\n    VK_COPY_MICROMAP_MODE_SERIALIZE_EXT = 1,\n    VK_COPY_MICROMAP_MODE_DESERIALIZE_EXT = 2,\n    VK_COPY_MICROMAP_MODE_COMPACT_EXT = 3,\n    VK_COPY_MICROMAP_MODE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkCopyMicromapModeEXT;\n\ntypedef enum VkOpacityMicromapFormatEXT {\n    VK_OPACITY_MICROMAP_FORMAT_2_STATE_EXT = 1,\n    VK_OPACITY_MICROMAP_FORMAT_4_STATE_EXT = 2,\n    VK_OPACITY_MICROMAP_FORMAT_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkOpacityMicromapFormatEXT;\n\ntypedef enum VkOpacityMicromapSpecialIndexEXT {\n    VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_TRANSPARENT_EXT = -1,\n    VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_OPAQUE_EXT = -2,\n    VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_UNKNOWN_TRANSPARENT_EXT = -3,\n    VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_UNKNOWN_OPAQUE_EXT = -4,\n    VK_OPACITY_MICROMAP_SPECIAL_INDEX_CLUSTER_GEOMETRY_DISABLE_OPACITY_MICROMAP_NV = -5,\n    VK_OPACITY_MICROMAP_SPECIAL_INDEX_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkOpacityMicromapSpecialIndexEXT;\n\ntypedef enum VkAccelerationStructureCompatibilityKHR {\n    VK_ACCELERATION_STRUCTURE_COMPATIBILITY_COMPATIBLE_KHR = 0,\n    VK_ACCELERATION_STRUCTURE_COMPATIBILITY_INCOMPATIBLE_KHR = 1,\n    VK_ACCELERATION_STRUCTURE_COMPATIBILITY_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkAccelerationStructureCompatibilityKHR;\n\ntypedef enum VkAccelerationStructureBuildTypeKHR {\n    VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_KHR = 0,\n    VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR = 1,\n    VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_OR_DEVICE_KHR = 2,\n    VK_ACCELERATION_STRUCTURE_BUILD_TYPE_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkAccelerationStructureBuildTypeKHR;\n\ntypedef enum VkBuildMicromapFlagBitsEXT {\n    VK_BUILD_MICROMAP_PREFER_FAST_TRACE_BIT_EXT = 0x00000001,\n    VK_BUILD_MICROMAP_PREFER_FAST_BUILD_BIT_EXT = 0x00000002,\n    VK_BUILD_MICROMAP_ALLOW_COMPACTION_BIT_EXT = 0x00000004,\n    VK_BUILD_MICROMAP_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkBuildMicromapFlagBitsEXT;\ntypedef VkFlags VkBuildMicromapFlagsEXT;\n\ntypedef enum VkMicromapCreateFlagBitsEXT {\n    VK_MICROMAP_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT = 0x00000001,\n    VK_MICROMAP_CREATE_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkMicromapCreateFlagBitsEXT;\ntypedef VkFlags VkMicromapCreateFlagsEXT;\ntypedef struct VkMicromapUsageEXT {\n    uint32_t    count;\n    uint32_t    subdivisionLevel;\n    uint32_t    format;\n} VkMicromapUsageEXT;\n\ntypedef union VkDeviceOrHostAddressKHR {\n    VkDeviceAddress    deviceAddress;\n    void*              hostAddress;\n} VkDeviceOrHostAddressKHR;\n\ntypedef struct VkMicromapBuildInfoEXT {\n    VkStructureType                     sType;\n    const void*                         pNext;\n    VkMicromapTypeEXT                   type;\n    VkBuildMicromapFlagsEXT             flags;\n    VkBuildMicromapModeEXT              mode;\n    VkMicromapEXT                       dstMicromap;\n    uint32_t                            usageCountsCount;\n    const VkMicromapUsageEXT*           pUsageCounts;\n    const VkMicromapUsageEXT* const*    ppUsageCounts;\n    VkDeviceOrHostAddressConstKHR       data;\n    VkDeviceOrHostAddressKHR            scratchData;\n    VkDeviceOrHostAddressConstKHR       triangleArray;\n    VkDeviceSize                        triangleArrayStride;\n} VkMicromapBuildInfoEXT;\n\ntypedef struct VkMicromapCreateInfoEXT {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkMicromapCreateFlagsEXT    createFlags;\n    VkBuffer                    buffer;\n    VkDeviceSize                offset;\n    VkDeviceSize                size;\n    VkMicromapTypeEXT           type;\n    VkDeviceAddress             deviceAddress;\n} VkMicromapCreateInfoEXT;\n\ntypedef struct VkPhysicalDeviceOpacityMicromapFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           micromap;\n    VkBool32           micromapCaptureReplay;\n    VkBool32           micromapHostCommands;\n} VkPhysicalDeviceOpacityMicromapFeaturesEXT;\n\ntypedef struct VkPhysicalDeviceOpacityMicromapPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxOpacity2StateSubdivisionLevel;\n    uint32_t           maxOpacity4StateSubdivisionLevel;\n} VkPhysicalDeviceOpacityMicromapPropertiesEXT;\n\ntypedef struct VkMicromapVersionInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    const uint8_t*     pVersionData;\n} VkMicromapVersionInfoEXT;\n\ntypedef struct VkCopyMicromapToMemoryInfoEXT {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkMicromapEXT               src;\n    VkDeviceOrHostAddressKHR    dst;\n    VkCopyMicromapModeEXT       mode;\n} VkCopyMicromapToMemoryInfoEXT;\n\ntypedef struct VkCopyMemoryToMicromapInfoEXT {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkDeviceOrHostAddressConstKHR    src;\n    VkMicromapEXT                    dst;\n    VkCopyMicromapModeEXT            mode;\n} VkCopyMemoryToMicromapInfoEXT;\n\ntypedef struct VkCopyMicromapInfoEXT {\n    VkStructureType          sType;\n    const void*              pNext;\n    VkMicromapEXT            src;\n    VkMicromapEXT            dst;\n    VkCopyMicromapModeEXT    mode;\n} VkCopyMicromapInfoEXT;\n\ntypedef struct VkMicromapBuildSizesInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkDeviceSize       micromapSize;\n    VkDeviceSize       buildScratchSize;\n    VkBool32           discardable;\n} VkMicromapBuildSizesInfoEXT;\n\ntypedef struct VkAccelerationStructureTrianglesOpacityMicromapEXT {\n    VkStructureType                     sType;\n    void*                               pNext;\n    VkIndexType                         indexType;\n    VkDeviceOrHostAddressConstKHR       indexBuffer;\n    VkDeviceSize                        indexStride;\n    uint32_t                            baseTriangle;\n    uint32_t                            usageCountsCount;\n    const VkMicromapUsageEXT*           pUsageCounts;\n    const VkMicromapUsageEXT* const*    ppUsageCounts;\n    VkMicromapEXT                       micromap;\n} VkAccelerationStructureTrianglesOpacityMicromapEXT;\n\ntypedef struct VkMicromapTriangleEXT {\n    uint32_t    dataOffset;\n    uint16_t    subdivisionLevel;\n    uint16_t    format;\n} VkMicromapTriangleEXT;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateMicromapEXT)(VkDevice                                           device, const VkMicromapCreateInfoEXT*        pCreateInfo, const VkAllocationCallbacks*       pAllocator, VkMicromapEXT*                        pMicromap);\ntypedef void (VKAPI_PTR *PFN_vkDestroyMicromapEXT)(VkDevice device, VkMicromapEXT micromap, const VkAllocationCallbacks* pAllocator);\ntypedef void (VKAPI_PTR *PFN_vkCmdBuildMicromapsEXT)(VkCommandBuffer                                    commandBuffer, uint32_t infoCount, const VkMicromapBuildInfoEXT* pInfos);\ntypedef VkResult (VKAPI_PTR *PFN_vkBuildMicromapsEXT)(VkDevice                                           device, VkDeferredOperationKHR deferredOperation, uint32_t infoCount, const VkMicromapBuildInfoEXT* pInfos);\ntypedef VkResult (VKAPI_PTR *PFN_vkCopyMicromapEXT)(VkDevice device, VkDeferredOperationKHR deferredOperation, const VkCopyMicromapInfoEXT* pInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkCopyMicromapToMemoryEXT)(VkDevice device, VkDeferredOperationKHR deferredOperation, const VkCopyMicromapToMemoryInfoEXT* pInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkCopyMemoryToMicromapEXT)(VkDevice device, VkDeferredOperationKHR deferredOperation, const VkCopyMemoryToMicromapInfoEXT* pInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkWriteMicromapsPropertiesEXT)(VkDevice device, uint32_t micromapCount, const VkMicromapEXT* pMicromaps, VkQueryType  queryType, size_t       dataSize, void* pData, size_t stride);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyMicromapEXT)(VkCommandBuffer commandBuffer, const VkCopyMicromapInfoEXT* pInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyMicromapToMemoryEXT)(VkCommandBuffer commandBuffer, const VkCopyMicromapToMemoryInfoEXT* pInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyMemoryToMicromapEXT)(VkCommandBuffer commandBuffer, const VkCopyMemoryToMicromapInfoEXT* pInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdWriteMicromapsPropertiesEXT)(VkCommandBuffer commandBuffer, uint32_t micromapCount, const VkMicromapEXT* pMicromaps, VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery);\ntypedef void (VKAPI_PTR *PFN_vkGetDeviceMicromapCompatibilityEXT)(VkDevice device, const VkMicromapVersionInfoEXT* pVersionInfo, VkAccelerationStructureCompatibilityKHR* pCompatibility);\ntypedef void (VKAPI_PTR *PFN_vkGetMicromapBuildSizesEXT)(VkDevice                                            device, VkAccelerationStructureBuildTypeKHR                 buildType, const VkMicromapBuildInfoEXT*  pBuildInfo, VkMicromapBuildSizesInfoEXT*           pSizeInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateMicromapEXT(\n    VkDevice                                    device,\n    const VkMicromapCreateInfoEXT*              pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkMicromapEXT*                              pMicromap);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyMicromapEXT(\n    VkDevice                                    device,\n    VkMicromapEXT                               micromap,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBuildMicromapsEXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    infoCount,\n    const VkMicromapBuildInfoEXT*               pInfos);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkBuildMicromapsEXT(\n    VkDevice                                    device,\n    VkDeferredOperationKHR                      deferredOperation,\n    uint32_t                                    infoCount,\n    const VkMicromapBuildInfoEXT*               pInfos);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCopyMicromapEXT(\n    VkDevice                                    device,\n    VkDeferredOperationKHR                      deferredOperation,\n    const VkCopyMicromapInfoEXT*                pInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCopyMicromapToMemoryEXT(\n    VkDevice                                    device,\n    VkDeferredOperationKHR                      deferredOperation,\n    const VkCopyMicromapToMemoryInfoEXT*        pInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCopyMemoryToMicromapEXT(\n    VkDevice                                    device,\n    VkDeferredOperationKHR                      deferredOperation,\n    const VkCopyMemoryToMicromapInfoEXT*        pInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkWriteMicromapsPropertiesEXT(\n    VkDevice                                    device,\n    uint32_t                                    micromapCount,\n    const VkMicromapEXT*                        pMicromaps,\n    VkQueryType                                 queryType,\n    size_t                                      dataSize,\n    void*                                       pData,\n    size_t                                      stride);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyMicromapEXT(\n    VkCommandBuffer                             commandBuffer,\n    const VkCopyMicromapInfoEXT*                pInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyMicromapToMemoryEXT(\n    VkCommandBuffer                             commandBuffer,\n    const VkCopyMicromapToMemoryInfoEXT*        pInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyMemoryToMicromapEXT(\n    VkCommandBuffer                             commandBuffer,\n    const VkCopyMemoryToMicromapInfoEXT*        pInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdWriteMicromapsPropertiesEXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    micromapCount,\n    const VkMicromapEXT*                        pMicromaps,\n    VkQueryType                                 queryType,\n    VkQueryPool                                 queryPool,\n    uint32_t                                    firstQuery);\n\nVKAPI_ATTR void VKAPI_CALL vkGetDeviceMicromapCompatibilityEXT(\n    VkDevice                                    device,\n    const VkMicromapVersionInfoEXT*             pVersionInfo,\n    VkAccelerationStructureCompatibilityKHR*    pCompatibility);\n\nVKAPI_ATTR void VKAPI_CALL vkGetMicromapBuildSizesEXT(\n    VkDevice                                    device,\n    VkAccelerationStructureBuildTypeKHR         buildType,\n    const VkMicromapBuildInfoEXT*               pBuildInfo,\n    VkMicromapBuildSizesInfoEXT*                pSizeInfo);\n#endif\n\n\n// VK_EXT_load_store_op_none is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_load_store_op_none 1\n#define VK_EXT_LOAD_STORE_OP_NONE_SPEC_VERSION 1\n#define VK_EXT_LOAD_STORE_OP_NONE_EXTENSION_NAME \"VK_EXT_load_store_op_none\"\n\n\n// VK_HUAWEI_cluster_culling_shader is a preprocessor guard. Do not pass it to API calls.\n#define VK_HUAWEI_cluster_culling_shader 1\n#define VK_HUAWEI_CLUSTER_CULLING_SHADER_SPEC_VERSION 3\n#define VK_HUAWEI_CLUSTER_CULLING_SHADER_EXTENSION_NAME \"VK_HUAWEI_cluster_culling_shader\"\ntypedef struct VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           clustercullingShader;\n    VkBool32           multiviewClusterCullingShader;\n} VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI;\n\ntypedef struct VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxWorkGroupCount[3];\n    uint32_t           maxWorkGroupSize[3];\n    uint32_t           maxOutputClusterCount;\n    VkDeviceSize       indirectBufferOffsetAlignment;\n} VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI;\n\ntypedef struct VkPhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           clusterShadingRate;\n} VkPhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawClusterHUAWEI)(VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ);\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawClusterIndirectHUAWEI)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawClusterHUAWEI(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    groupCountX,\n    uint32_t                                    groupCountY,\n    uint32_t                                    groupCountZ);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawClusterIndirectHUAWEI(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    buffer,\n    VkDeviceSize                                offset);\n#endif\n\n\n// VK_EXT_border_color_swizzle is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_border_color_swizzle 1\n#define VK_EXT_BORDER_COLOR_SWIZZLE_SPEC_VERSION 1\n#define VK_EXT_BORDER_COLOR_SWIZZLE_EXTENSION_NAME \"VK_EXT_border_color_swizzle\"\ntypedef struct VkPhysicalDeviceBorderColorSwizzleFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           borderColorSwizzle;\n    VkBool32           borderColorSwizzleFromImage;\n} VkPhysicalDeviceBorderColorSwizzleFeaturesEXT;\n\ntypedef struct VkSamplerBorderColorComponentMappingCreateInfoEXT {\n    VkStructureType       sType;\n    const void*           pNext;\n    VkComponentMapping    components;\n    VkBool32              srgb;\n} VkSamplerBorderColorComponentMappingCreateInfoEXT;\n\n\n\n// VK_EXT_pageable_device_local_memory is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_pageable_device_local_memory 1\n#define VK_EXT_PAGEABLE_DEVICE_LOCAL_MEMORY_SPEC_VERSION 1\n#define VK_EXT_PAGEABLE_DEVICE_LOCAL_MEMORY_EXTENSION_NAME \"VK_EXT_pageable_device_local_memory\"\ntypedef struct VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           pageableDeviceLocalMemory;\n} VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT;\n\ntypedef void (VKAPI_PTR *PFN_vkSetDeviceMemoryPriorityEXT)(VkDevice       device, VkDeviceMemory memory, float          priority);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkSetDeviceMemoryPriorityEXT(\n    VkDevice                                    device,\n    VkDeviceMemory                              memory,\n    float                                       priority);\n#endif\n\n\n// VK_ARM_shader_core_properties is a preprocessor guard. Do not pass it to API calls.\n#define VK_ARM_shader_core_properties 1\n#define VK_ARM_SHADER_CORE_PROPERTIES_SPEC_VERSION 1\n#define VK_ARM_SHADER_CORE_PROPERTIES_EXTENSION_NAME \"VK_ARM_shader_core_properties\"\ntypedef struct VkPhysicalDeviceShaderCorePropertiesARM {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           pixelRate;\n    uint32_t           texelRate;\n    uint32_t           fmaRate;\n} VkPhysicalDeviceShaderCorePropertiesARM;\n\n\n\n// VK_ARM_scheduling_controls is a preprocessor guard. Do not pass it to API calls.\n#define VK_ARM_scheduling_controls 1\n#define VK_ARM_SCHEDULING_CONTROLS_SPEC_VERSION 1\n#define VK_ARM_SCHEDULING_CONTROLS_EXTENSION_NAME \"VK_ARM_scheduling_controls\"\ntypedef VkFlags64 VkPhysicalDeviceSchedulingControlsFlagsARM;\n\n// Flag bits for VkPhysicalDeviceSchedulingControlsFlagBitsARM\ntypedef VkFlags64 VkPhysicalDeviceSchedulingControlsFlagBitsARM;\nstatic const VkPhysicalDeviceSchedulingControlsFlagBitsARM VK_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_SHADER_CORE_COUNT_ARM = 0x00000001ULL;\n\ntypedef struct VkDeviceQueueShaderCoreControlCreateInfoARM {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           shaderCoreCount;\n} VkDeviceQueueShaderCoreControlCreateInfoARM;\n\ntypedef struct VkPhysicalDeviceSchedulingControlsFeaturesARM {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           schedulingControls;\n} VkPhysicalDeviceSchedulingControlsFeaturesARM;\n\ntypedef struct VkPhysicalDeviceSchedulingControlsPropertiesARM {\n    VkStructureType                               sType;\n    void*                                         pNext;\n    VkPhysicalDeviceSchedulingControlsFlagsARM    schedulingControlsFlags;\n} VkPhysicalDeviceSchedulingControlsPropertiesARM;\n\n\n\n// VK_EXT_image_sliced_view_of_3d is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_image_sliced_view_of_3d 1\n#define VK_EXT_IMAGE_SLICED_VIEW_OF_3D_SPEC_VERSION 1\n#define VK_EXT_IMAGE_SLICED_VIEW_OF_3D_EXTENSION_NAME \"VK_EXT_image_sliced_view_of_3d\"\n#define VK_REMAINING_3D_SLICES_EXT        (~0U)\ntypedef struct VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           imageSlicedViewOf3D;\n} VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT;\n\ntypedef struct VkImageViewSlicedCreateInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           sliceOffset;\n    uint32_t           sliceCount;\n} VkImageViewSlicedCreateInfoEXT;\n\n\n\n// VK_VALVE_descriptor_set_host_mapping is a preprocessor guard. Do not pass it to API calls.\n#define VK_VALVE_descriptor_set_host_mapping 1\n#define VK_VALVE_DESCRIPTOR_SET_HOST_MAPPING_SPEC_VERSION 1\n#define VK_VALVE_DESCRIPTOR_SET_HOST_MAPPING_EXTENSION_NAME \"VK_VALVE_descriptor_set_host_mapping\"\ntypedef struct VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           descriptorSetHostMapping;\n} VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE;\n\ntypedef struct VkDescriptorSetBindingReferenceVALVE {\n    VkStructureType          sType;\n    const void*              pNext;\n    VkDescriptorSetLayout    descriptorSetLayout;\n    uint32_t                 binding;\n} VkDescriptorSetBindingReferenceVALVE;\n\ntypedef struct VkDescriptorSetLayoutHostMappingInfoVALVE {\n    VkStructureType    sType;\n    void*              pNext;\n    size_t             descriptorOffset;\n    uint32_t           descriptorSize;\n} VkDescriptorSetLayoutHostMappingInfoVALVE;\n\ntypedef void (VKAPI_PTR *PFN_vkGetDescriptorSetLayoutHostMappingInfoVALVE)(VkDevice device, const VkDescriptorSetBindingReferenceVALVE* pBindingReference, VkDescriptorSetLayoutHostMappingInfoVALVE* pHostMapping);\ntypedef void (VKAPI_PTR *PFN_vkGetDescriptorSetHostMappingVALVE)(VkDevice device, VkDescriptorSet descriptorSet, void** ppData);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkGetDescriptorSetLayoutHostMappingInfoVALVE(\n    VkDevice                                    device,\n    const VkDescriptorSetBindingReferenceVALVE* pBindingReference,\n    VkDescriptorSetLayoutHostMappingInfoVALVE*  pHostMapping);\n\nVKAPI_ATTR void VKAPI_CALL vkGetDescriptorSetHostMappingVALVE(\n    VkDevice                                    device,\n    VkDescriptorSet                             descriptorSet,\n    void**                                      ppData);\n#endif\n\n\n// VK_EXT_depth_clamp_zero_one is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_depth_clamp_zero_one 1\n#define VK_EXT_DEPTH_CLAMP_ZERO_ONE_SPEC_VERSION 1\n#define VK_EXT_DEPTH_CLAMP_ZERO_ONE_EXTENSION_NAME \"VK_EXT_depth_clamp_zero_one\"\ntypedef VkPhysicalDeviceDepthClampZeroOneFeaturesKHR VkPhysicalDeviceDepthClampZeroOneFeaturesEXT;\n\n\n\n// VK_EXT_non_seamless_cube_map is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_non_seamless_cube_map 1\n#define VK_EXT_NON_SEAMLESS_CUBE_MAP_SPEC_VERSION 1\n#define VK_EXT_NON_SEAMLESS_CUBE_MAP_EXTENSION_NAME \"VK_EXT_non_seamless_cube_map\"\ntypedef struct VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           nonSeamlessCubeMap;\n} VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT;\n\n\n\n// VK_ARM_render_pass_striped is a preprocessor guard. Do not pass it to API calls.\n#define VK_ARM_render_pass_striped 1\n#define VK_ARM_RENDER_PASS_STRIPED_SPEC_VERSION 1\n#define VK_ARM_RENDER_PASS_STRIPED_EXTENSION_NAME \"VK_ARM_render_pass_striped\"\ntypedef struct VkPhysicalDeviceRenderPassStripedFeaturesARM {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           renderPassStriped;\n} VkPhysicalDeviceRenderPassStripedFeaturesARM;\n\ntypedef struct VkPhysicalDeviceRenderPassStripedPropertiesARM {\n    VkStructureType    sType;\n    void*              pNext;\n    VkExtent2D         renderPassStripeGranularity;\n    uint32_t           maxRenderPassStripes;\n} VkPhysicalDeviceRenderPassStripedPropertiesARM;\n\ntypedef struct VkRenderPassStripeInfoARM {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkRect2D           stripeArea;\n} VkRenderPassStripeInfoARM;\n\ntypedef struct VkRenderPassStripeBeginInfoARM {\n    VkStructureType                     sType;\n    const void*                         pNext;\n    uint32_t                            stripeInfoCount;\n    const VkRenderPassStripeInfoARM*    pStripeInfos;\n} VkRenderPassStripeBeginInfoARM;\n\ntypedef struct VkRenderPassStripeSubmitInfoARM {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    uint32_t                        stripeSemaphoreInfoCount;\n    const VkSemaphoreSubmitInfo*    pStripeSemaphoreInfos;\n} VkRenderPassStripeSubmitInfoARM;\n\n\n\n// VK_QCOM_fragment_density_map_offset is a preprocessor guard. Do not pass it to API calls.\n#define VK_QCOM_fragment_density_map_offset 1\n#define VK_QCOM_FRAGMENT_DENSITY_MAP_OFFSET_SPEC_VERSION 2\n#define VK_QCOM_FRAGMENT_DENSITY_MAP_OFFSET_EXTENSION_NAME \"VK_QCOM_fragment_density_map_offset\"\ntypedef struct VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           fragmentDensityMapOffset;\n} VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM;\n\ntypedef struct VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM {\n    VkStructureType    sType;\n    void*              pNext;\n    VkExtent2D         fragmentDensityOffsetGranularity;\n} VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM;\n\ntypedef struct VkSubpassFragmentDensityMapOffsetEndInfoQCOM {\n    VkStructureType      sType;\n    const void*          pNext;\n    uint32_t             fragmentDensityOffsetCount;\n    const VkOffset2D*    pFragmentDensityOffsets;\n} VkSubpassFragmentDensityMapOffsetEndInfoQCOM;\n\n\n\n// VK_NV_copy_memory_indirect is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_copy_memory_indirect 1\n#define VK_NV_COPY_MEMORY_INDIRECT_SPEC_VERSION 1\n#define VK_NV_COPY_MEMORY_INDIRECT_EXTENSION_NAME \"VK_NV_copy_memory_indirect\"\ntypedef struct VkCopyMemoryIndirectCommandNV {\n    VkDeviceAddress    srcAddress;\n    VkDeviceAddress    dstAddress;\n    VkDeviceSize       size;\n} VkCopyMemoryIndirectCommandNV;\n\ntypedef struct VkCopyMemoryToImageIndirectCommandNV {\n    VkDeviceAddress             srcAddress;\n    uint32_t                    bufferRowLength;\n    uint32_t                    bufferImageHeight;\n    VkImageSubresourceLayers    imageSubresource;\n    VkOffset3D                  imageOffset;\n    VkExtent3D                  imageExtent;\n} VkCopyMemoryToImageIndirectCommandNV;\n\ntypedef struct VkPhysicalDeviceCopyMemoryIndirectFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           indirectCopy;\n} VkPhysicalDeviceCopyMemoryIndirectFeaturesNV;\n\ntypedef struct VkPhysicalDeviceCopyMemoryIndirectPropertiesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkQueueFlags       supportedQueues;\n} VkPhysicalDeviceCopyMemoryIndirectPropertiesNV;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyMemoryIndirectNV)(VkCommandBuffer commandBuffer, VkDeviceAddress copyBufferAddress, uint32_t copyCount, uint32_t stride);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyMemoryToImageIndirectNV)(VkCommandBuffer commandBuffer, VkDeviceAddress copyBufferAddress, uint32_t copyCount, uint32_t stride, VkImage dstImage, VkImageLayout dstImageLayout, const VkImageSubresourceLayers* pImageSubresources);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyMemoryIndirectNV(\n    VkCommandBuffer                             commandBuffer,\n    VkDeviceAddress                             copyBufferAddress,\n    uint32_t                                    copyCount,\n    uint32_t                                    stride);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyMemoryToImageIndirectNV(\n    VkCommandBuffer                             commandBuffer,\n    VkDeviceAddress                             copyBufferAddress,\n    uint32_t                                    copyCount,\n    uint32_t                                    stride,\n    VkImage                                     dstImage,\n    VkImageLayout                               dstImageLayout,\n    const VkImageSubresourceLayers*             pImageSubresources);\n#endif\n\n\n// VK_NV_memory_decompression is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_memory_decompression 1\n#define VK_NV_MEMORY_DECOMPRESSION_SPEC_VERSION 1\n#define VK_NV_MEMORY_DECOMPRESSION_EXTENSION_NAME \"VK_NV_memory_decompression\"\n\n// Flag bits for VkMemoryDecompressionMethodFlagBitsNV\ntypedef VkFlags64 VkMemoryDecompressionMethodFlagBitsNV;\nstatic const VkMemoryDecompressionMethodFlagBitsNV VK_MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_NV = 0x00000001ULL;\n\ntypedef VkFlags64 VkMemoryDecompressionMethodFlagsNV;\ntypedef struct VkDecompressMemoryRegionNV {\n    VkDeviceAddress                       srcAddress;\n    VkDeviceAddress                       dstAddress;\n    VkDeviceSize                          compressedSize;\n    VkDeviceSize                          decompressedSize;\n    VkMemoryDecompressionMethodFlagsNV    decompressionMethod;\n} VkDecompressMemoryRegionNV;\n\ntypedef struct VkPhysicalDeviceMemoryDecompressionFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           memoryDecompression;\n} VkPhysicalDeviceMemoryDecompressionFeaturesNV;\n\ntypedef struct VkPhysicalDeviceMemoryDecompressionPropertiesNV {\n    VkStructureType                       sType;\n    void*                                 pNext;\n    VkMemoryDecompressionMethodFlagsNV    decompressionMethods;\n    uint64_t                              maxDecompressionIndirectCount;\n} VkPhysicalDeviceMemoryDecompressionPropertiesNV;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdDecompressMemoryNV)(VkCommandBuffer commandBuffer, uint32_t decompressRegionCount, const VkDecompressMemoryRegionNV* pDecompressMemoryRegions);\ntypedef void (VKAPI_PTR *PFN_vkCmdDecompressMemoryIndirectCountNV)(VkCommandBuffer commandBuffer, VkDeviceAddress indirectCommandsAddress, VkDeviceAddress indirectCommandsCountAddress, uint32_t stride);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdDecompressMemoryNV(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    decompressRegionCount,\n    const VkDecompressMemoryRegionNV*           pDecompressMemoryRegions);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDecompressMemoryIndirectCountNV(\n    VkCommandBuffer                             commandBuffer,\n    VkDeviceAddress                             indirectCommandsAddress,\n    VkDeviceAddress                             indirectCommandsCountAddress,\n    uint32_t                                    stride);\n#endif\n\n\n// VK_NV_device_generated_commands_compute is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_device_generated_commands_compute 1\n#define VK_NV_DEVICE_GENERATED_COMMANDS_COMPUTE_SPEC_VERSION 2\n#define VK_NV_DEVICE_GENERATED_COMMANDS_COMPUTE_EXTENSION_NAME \"VK_NV_device_generated_commands_compute\"\ntypedef struct VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           deviceGeneratedCompute;\n    VkBool32           deviceGeneratedComputePipelines;\n    VkBool32           deviceGeneratedComputeCaptureReplay;\n} VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV;\n\ntypedef struct VkComputePipelineIndirectBufferInfoNV {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkDeviceAddress    deviceAddress;\n    VkDeviceSize       size;\n    VkDeviceAddress    pipelineDeviceAddressCaptureReplay;\n} VkComputePipelineIndirectBufferInfoNV;\n\ntypedef struct VkPipelineIndirectDeviceAddressInfoNV {\n    VkStructureType        sType;\n    const void*            pNext;\n    VkPipelineBindPoint    pipelineBindPoint;\n    VkPipeline             pipeline;\n} VkPipelineIndirectDeviceAddressInfoNV;\n\ntypedef struct VkBindPipelineIndirectCommandNV {\n    VkDeviceAddress    pipelineAddress;\n} VkBindPipelineIndirectCommandNV;\n\ntypedef void (VKAPI_PTR *PFN_vkGetPipelineIndirectMemoryRequirementsNV)(VkDevice device, const VkComputePipelineCreateInfo* pCreateInfo, VkMemoryRequirements2* pMemoryRequirements);\ntypedef void (VKAPI_PTR *PFN_vkCmdUpdatePipelineIndirectBufferNV)(VkCommandBuffer commandBuffer, VkPipelineBindPoint           pipelineBindPoint, VkPipeline                    pipeline);\ntypedef VkDeviceAddress (VKAPI_PTR *PFN_vkGetPipelineIndirectDeviceAddressNV)(VkDevice device, const VkPipelineIndirectDeviceAddressInfoNV* pInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkGetPipelineIndirectMemoryRequirementsNV(\n    VkDevice                                    device,\n    const VkComputePipelineCreateInfo*          pCreateInfo,\n    VkMemoryRequirements2*                      pMemoryRequirements);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdUpdatePipelineIndirectBufferNV(\n    VkCommandBuffer                             commandBuffer,\n    VkPipelineBindPoint                         pipelineBindPoint,\n    VkPipeline                                  pipeline);\n\nVKAPI_ATTR VkDeviceAddress VKAPI_CALL vkGetPipelineIndirectDeviceAddressNV(\n    VkDevice                                    device,\n    const VkPipelineIndirectDeviceAddressInfoNV* pInfo);\n#endif\n\n\n// VK_NV_ray_tracing_linear_swept_spheres is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_ray_tracing_linear_swept_spheres 1\n#define VK_NV_RAY_TRACING_LINEAR_SWEPT_SPHERES_SPEC_VERSION 1\n#define VK_NV_RAY_TRACING_LINEAR_SWEPT_SPHERES_EXTENSION_NAME \"VK_NV_ray_tracing_linear_swept_spheres\"\n\ntypedef enum VkRayTracingLssIndexingModeNV {\n    VK_RAY_TRACING_LSS_INDEXING_MODE_LIST_NV = 0,\n    VK_RAY_TRACING_LSS_INDEXING_MODE_SUCCESSIVE_NV = 1,\n    VK_RAY_TRACING_LSS_INDEXING_MODE_MAX_ENUM_NV = 0x7FFFFFFF\n} VkRayTracingLssIndexingModeNV;\n\ntypedef enum VkRayTracingLssPrimitiveEndCapsModeNV {\n    VK_RAY_TRACING_LSS_PRIMITIVE_END_CAPS_MODE_NONE_NV = 0,\n    VK_RAY_TRACING_LSS_PRIMITIVE_END_CAPS_MODE_CHAINED_NV = 1,\n    VK_RAY_TRACING_LSS_PRIMITIVE_END_CAPS_MODE_MAX_ENUM_NV = 0x7FFFFFFF\n} VkRayTracingLssPrimitiveEndCapsModeNV;\ntypedef struct VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           spheres;\n    VkBool32           linearSweptSpheres;\n} VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV;\n\ntypedef struct VkAccelerationStructureGeometryLinearSweptSpheresDataNV {\n    VkStructureType                          sType;\n    const void*                              pNext;\n    VkFormat                                 vertexFormat;\n    VkDeviceOrHostAddressConstKHR            vertexData;\n    VkDeviceSize                             vertexStride;\n    VkFormat                                 radiusFormat;\n    VkDeviceOrHostAddressConstKHR            radiusData;\n    VkDeviceSize                             radiusStride;\n    VkIndexType                              indexType;\n    VkDeviceOrHostAddressConstKHR            indexData;\n    VkDeviceSize                             indexStride;\n    VkRayTracingLssIndexingModeNV            indexingMode;\n    VkRayTracingLssPrimitiveEndCapsModeNV    endCapsMode;\n} VkAccelerationStructureGeometryLinearSweptSpheresDataNV;\n\ntypedef struct VkAccelerationStructureGeometrySpheresDataNV {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkFormat                         vertexFormat;\n    VkDeviceOrHostAddressConstKHR    vertexData;\n    VkDeviceSize                     vertexStride;\n    VkFormat                         radiusFormat;\n    VkDeviceOrHostAddressConstKHR    radiusData;\n    VkDeviceSize                     radiusStride;\n    VkIndexType                      indexType;\n    VkDeviceOrHostAddressConstKHR    indexData;\n    VkDeviceSize                     indexStride;\n} VkAccelerationStructureGeometrySpheresDataNV;\n\n\n\n// VK_NV_linear_color_attachment is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_linear_color_attachment 1\n#define VK_NV_LINEAR_COLOR_ATTACHMENT_SPEC_VERSION 1\n#define VK_NV_LINEAR_COLOR_ATTACHMENT_EXTENSION_NAME \"VK_NV_linear_color_attachment\"\ntypedef struct VkPhysicalDeviceLinearColorAttachmentFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           linearColorAttachment;\n} VkPhysicalDeviceLinearColorAttachmentFeaturesNV;\n\n\n\n// VK_GOOGLE_surfaceless_query is a preprocessor guard. Do not pass it to API calls.\n#define VK_GOOGLE_surfaceless_query 1\n#define VK_GOOGLE_SURFACELESS_QUERY_SPEC_VERSION 2\n#define VK_GOOGLE_SURFACELESS_QUERY_EXTENSION_NAME \"VK_GOOGLE_surfaceless_query\"\n\n\n// VK_EXT_image_compression_control_swapchain is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_image_compression_control_swapchain 1\n#define VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_SPEC_VERSION 1\n#define VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_EXTENSION_NAME \"VK_EXT_image_compression_control_swapchain\"\ntypedef struct VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           imageCompressionControlSwapchain;\n} VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT;\n\n\n\n// VK_QCOM_image_processing is a preprocessor guard. Do not pass it to API calls.\n#define VK_QCOM_image_processing 1\n#define VK_QCOM_IMAGE_PROCESSING_SPEC_VERSION 1\n#define VK_QCOM_IMAGE_PROCESSING_EXTENSION_NAME \"VK_QCOM_image_processing\"\ntypedef struct VkImageViewSampleWeightCreateInfoQCOM {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkOffset2D         filterCenter;\n    VkExtent2D         filterSize;\n    uint32_t           numPhases;\n} VkImageViewSampleWeightCreateInfoQCOM;\n\ntypedef struct VkPhysicalDeviceImageProcessingFeaturesQCOM {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           textureSampleWeighted;\n    VkBool32           textureBoxFilter;\n    VkBool32           textureBlockMatch;\n} VkPhysicalDeviceImageProcessingFeaturesQCOM;\n\ntypedef struct VkPhysicalDeviceImageProcessingPropertiesQCOM {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxWeightFilterPhases;\n    VkExtent2D         maxWeightFilterDimension;\n    VkExtent2D         maxBlockMatchRegion;\n    VkExtent2D         maxBoxFilterBlockSize;\n} VkPhysicalDeviceImageProcessingPropertiesQCOM;\n\n\n\n// VK_EXT_nested_command_buffer is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_nested_command_buffer 1\n#define VK_EXT_NESTED_COMMAND_BUFFER_SPEC_VERSION 1\n#define VK_EXT_NESTED_COMMAND_BUFFER_EXTENSION_NAME \"VK_EXT_nested_command_buffer\"\ntypedef struct VkPhysicalDeviceNestedCommandBufferFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           nestedCommandBuffer;\n    VkBool32           nestedCommandBufferRendering;\n    VkBool32           nestedCommandBufferSimultaneousUse;\n} VkPhysicalDeviceNestedCommandBufferFeaturesEXT;\n\ntypedef struct VkPhysicalDeviceNestedCommandBufferPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxCommandBufferNestingLevel;\n} VkPhysicalDeviceNestedCommandBufferPropertiesEXT;\n\n\n\n// VK_EXT_external_memory_acquire_unmodified is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_external_memory_acquire_unmodified 1\n#define VK_EXT_EXTERNAL_MEMORY_ACQUIRE_UNMODIFIED_SPEC_VERSION 1\n#define VK_EXT_EXTERNAL_MEMORY_ACQUIRE_UNMODIFIED_EXTENSION_NAME \"VK_EXT_external_memory_acquire_unmodified\"\ntypedef struct VkExternalMemoryAcquireUnmodifiedEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           acquireUnmodifiedMemory;\n} VkExternalMemoryAcquireUnmodifiedEXT;\n\n\n\n// VK_EXT_extended_dynamic_state3 is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_extended_dynamic_state3 1\n#define VK_EXT_EXTENDED_DYNAMIC_STATE_3_SPEC_VERSION 2\n#define VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME \"VK_EXT_extended_dynamic_state3\"\ntypedef struct VkPhysicalDeviceExtendedDynamicState3FeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           extendedDynamicState3TessellationDomainOrigin;\n    VkBool32           extendedDynamicState3DepthClampEnable;\n    VkBool32           extendedDynamicState3PolygonMode;\n    VkBool32           extendedDynamicState3RasterizationSamples;\n    VkBool32           extendedDynamicState3SampleMask;\n    VkBool32           extendedDynamicState3AlphaToCoverageEnable;\n    VkBool32           extendedDynamicState3AlphaToOneEnable;\n    VkBool32           extendedDynamicState3LogicOpEnable;\n    VkBool32           extendedDynamicState3ColorBlendEnable;\n    VkBool32           extendedDynamicState3ColorBlendEquation;\n    VkBool32           extendedDynamicState3ColorWriteMask;\n    VkBool32           extendedDynamicState3RasterizationStream;\n    VkBool32           extendedDynamicState3ConservativeRasterizationMode;\n    VkBool32           extendedDynamicState3ExtraPrimitiveOverestimationSize;\n    VkBool32           extendedDynamicState3DepthClipEnable;\n    VkBool32           extendedDynamicState3SampleLocationsEnable;\n    VkBool32           extendedDynamicState3ColorBlendAdvanced;\n    VkBool32           extendedDynamicState3ProvokingVertexMode;\n    VkBool32           extendedDynamicState3LineRasterizationMode;\n    VkBool32           extendedDynamicState3LineStippleEnable;\n    VkBool32           extendedDynamicState3DepthClipNegativeOneToOne;\n    VkBool32           extendedDynamicState3ViewportWScalingEnable;\n    VkBool32           extendedDynamicState3ViewportSwizzle;\n    VkBool32           extendedDynamicState3CoverageToColorEnable;\n    VkBool32           extendedDynamicState3CoverageToColorLocation;\n    VkBool32           extendedDynamicState3CoverageModulationMode;\n    VkBool32           extendedDynamicState3CoverageModulationTableEnable;\n    VkBool32           extendedDynamicState3CoverageModulationTable;\n    VkBool32           extendedDynamicState3CoverageReductionMode;\n    VkBool32           extendedDynamicState3RepresentativeFragmentTestEnable;\n    VkBool32           extendedDynamicState3ShadingRateImageEnable;\n} VkPhysicalDeviceExtendedDynamicState3FeaturesEXT;\n\ntypedef struct VkPhysicalDeviceExtendedDynamicState3PropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           dynamicPrimitiveTopologyUnrestricted;\n} VkPhysicalDeviceExtendedDynamicState3PropertiesEXT;\n\ntypedef struct VkColorBlendEquationEXT {\n    VkBlendFactor    srcColorBlendFactor;\n    VkBlendFactor    dstColorBlendFactor;\n    VkBlendOp        colorBlendOp;\n    VkBlendFactor    srcAlphaBlendFactor;\n    VkBlendFactor    dstAlphaBlendFactor;\n    VkBlendOp        alphaBlendOp;\n} VkColorBlendEquationEXT;\n\ntypedef struct VkColorBlendAdvancedEXT {\n    VkBlendOp            advancedBlendOp;\n    VkBool32             srcPremultiplied;\n    VkBool32             dstPremultiplied;\n    VkBlendOverlapEXT    blendOverlap;\n    VkBool32             clampResults;\n} VkColorBlendAdvancedEXT;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDepthClampEnableEXT)(VkCommandBuffer commandBuffer, VkBool32 depthClampEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetPolygonModeEXT)(VkCommandBuffer commandBuffer, VkPolygonMode polygonMode);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetRasterizationSamplesEXT)(VkCommandBuffer commandBuffer, VkSampleCountFlagBits  rasterizationSamples);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetSampleMaskEXT)(VkCommandBuffer commandBuffer, VkSampleCountFlagBits  samples, const VkSampleMask*    pSampleMask);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetAlphaToCoverageEnableEXT)(VkCommandBuffer commandBuffer, VkBool32 alphaToCoverageEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetAlphaToOneEnableEXT)(VkCommandBuffer commandBuffer, VkBool32 alphaToOneEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetLogicOpEnableEXT)(VkCommandBuffer commandBuffer, VkBool32 logicOpEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetColorBlendEnableEXT)(VkCommandBuffer commandBuffer, uint32_t firstAttachment, uint32_t attachmentCount, const VkBool32* pColorBlendEnables);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetColorBlendEquationEXT)(VkCommandBuffer commandBuffer, uint32_t firstAttachment, uint32_t attachmentCount, const VkColorBlendEquationEXT* pColorBlendEquations);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetColorWriteMaskEXT)(VkCommandBuffer commandBuffer, uint32_t firstAttachment, uint32_t attachmentCount, const VkColorComponentFlags* pColorWriteMasks);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetTessellationDomainOriginEXT)(VkCommandBuffer commandBuffer, VkTessellationDomainOrigin domainOrigin);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetRasterizationStreamEXT)(VkCommandBuffer commandBuffer, uint32_t rasterizationStream);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetConservativeRasterizationModeEXT)(VkCommandBuffer commandBuffer, VkConservativeRasterizationModeEXT conservativeRasterizationMode);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetExtraPrimitiveOverestimationSizeEXT)(VkCommandBuffer commandBuffer, float extraPrimitiveOverestimationSize);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDepthClipEnableEXT)(VkCommandBuffer commandBuffer, VkBool32 depthClipEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetSampleLocationsEnableEXT)(VkCommandBuffer commandBuffer, VkBool32 sampleLocationsEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetColorBlendAdvancedEXT)(VkCommandBuffer commandBuffer, uint32_t firstAttachment, uint32_t attachmentCount, const VkColorBlendAdvancedEXT* pColorBlendAdvanced);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetProvokingVertexModeEXT)(VkCommandBuffer commandBuffer, VkProvokingVertexModeEXT provokingVertexMode);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetLineRasterizationModeEXT)(VkCommandBuffer commandBuffer, VkLineRasterizationModeEXT lineRasterizationMode);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetLineStippleEnableEXT)(VkCommandBuffer commandBuffer, VkBool32 stippledLineEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDepthClipNegativeOneToOneEXT)(VkCommandBuffer commandBuffer, VkBool32 negativeOneToOne);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetViewportWScalingEnableNV)(VkCommandBuffer commandBuffer, VkBool32 viewportWScalingEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetViewportSwizzleNV)(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewportSwizzleNV* pViewportSwizzles);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetCoverageToColorEnableNV)(VkCommandBuffer commandBuffer, VkBool32 coverageToColorEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetCoverageToColorLocationNV)(VkCommandBuffer commandBuffer, uint32_t coverageToColorLocation);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetCoverageModulationModeNV)(VkCommandBuffer commandBuffer, VkCoverageModulationModeNV coverageModulationMode);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetCoverageModulationTableEnableNV)(VkCommandBuffer commandBuffer, VkBool32 coverageModulationTableEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetCoverageModulationTableNV)(VkCommandBuffer commandBuffer, uint32_t coverageModulationTableCount, const float* pCoverageModulationTable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetShadingRateImageEnableNV)(VkCommandBuffer commandBuffer, VkBool32 shadingRateImageEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetRepresentativeFragmentTestEnableNV)(VkCommandBuffer commandBuffer, VkBool32 representativeFragmentTestEnable);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetCoverageReductionModeNV)(VkCommandBuffer commandBuffer, VkCoverageReductionModeNV coverageReductionMode);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDepthClampEnableEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    depthClampEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetPolygonModeEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkPolygonMode                               polygonMode);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetRasterizationSamplesEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkSampleCountFlagBits                       rasterizationSamples);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetSampleMaskEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkSampleCountFlagBits                       samples,\n    const VkSampleMask*                         pSampleMask);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetAlphaToCoverageEnableEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    alphaToCoverageEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetAlphaToOneEnableEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    alphaToOneEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetLogicOpEnableEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    logicOpEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetColorBlendEnableEXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    firstAttachment,\n    uint32_t                                    attachmentCount,\n    const VkBool32*                             pColorBlendEnables);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetColorBlendEquationEXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    firstAttachment,\n    uint32_t                                    attachmentCount,\n    const VkColorBlendEquationEXT*              pColorBlendEquations);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetColorWriteMaskEXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    firstAttachment,\n    uint32_t                                    attachmentCount,\n    const VkColorComponentFlags*                pColorWriteMasks);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetTessellationDomainOriginEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkTessellationDomainOrigin                  domainOrigin);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetRasterizationStreamEXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    rasterizationStream);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetConservativeRasterizationModeEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkConservativeRasterizationModeEXT          conservativeRasterizationMode);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetExtraPrimitiveOverestimationSizeEXT(\n    VkCommandBuffer                             commandBuffer,\n    float                                       extraPrimitiveOverestimationSize);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDepthClipEnableEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    depthClipEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetSampleLocationsEnableEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    sampleLocationsEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetColorBlendAdvancedEXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    firstAttachment,\n    uint32_t                                    attachmentCount,\n    const VkColorBlendAdvancedEXT*              pColorBlendAdvanced);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetProvokingVertexModeEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkProvokingVertexModeEXT                    provokingVertexMode);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetLineRasterizationModeEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkLineRasterizationModeEXT                  lineRasterizationMode);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetLineStippleEnableEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    stippledLineEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDepthClipNegativeOneToOneEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    negativeOneToOne);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetViewportWScalingEnableNV(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    viewportWScalingEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetViewportSwizzleNV(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    firstViewport,\n    uint32_t                                    viewportCount,\n    const VkViewportSwizzleNV*                  pViewportSwizzles);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetCoverageToColorEnableNV(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    coverageToColorEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetCoverageToColorLocationNV(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    coverageToColorLocation);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetCoverageModulationModeNV(\n    VkCommandBuffer                             commandBuffer,\n    VkCoverageModulationModeNV                  coverageModulationMode);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetCoverageModulationTableEnableNV(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    coverageModulationTableEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetCoverageModulationTableNV(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    coverageModulationTableCount,\n    const float*                                pCoverageModulationTable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetShadingRateImageEnableNV(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    shadingRateImageEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetRepresentativeFragmentTestEnableNV(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    representativeFragmentTestEnable);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetCoverageReductionModeNV(\n    VkCommandBuffer                             commandBuffer,\n    VkCoverageReductionModeNV                   coverageReductionMode);\n#endif\n\n\n// VK_EXT_subpass_merge_feedback is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_subpass_merge_feedback 1\n#define VK_EXT_SUBPASS_MERGE_FEEDBACK_SPEC_VERSION 2\n#define VK_EXT_SUBPASS_MERGE_FEEDBACK_EXTENSION_NAME \"VK_EXT_subpass_merge_feedback\"\n\ntypedef enum VkSubpassMergeStatusEXT {\n    VK_SUBPASS_MERGE_STATUS_MERGED_EXT = 0,\n    VK_SUBPASS_MERGE_STATUS_DISALLOWED_EXT = 1,\n    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_SIDE_EFFECTS_EXT = 2,\n    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_SAMPLES_MISMATCH_EXT = 3,\n    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_VIEWS_MISMATCH_EXT = 4,\n    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_ALIASING_EXT = 5,\n    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_DEPENDENCIES_EXT = 6,\n    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_INCOMPATIBLE_INPUT_ATTACHMENT_EXT = 7,\n    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_TOO_MANY_ATTACHMENTS_EXT = 8,\n    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_INSUFFICIENT_STORAGE_EXT = 9,\n    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_DEPTH_STENCIL_COUNT_EXT = 10,\n    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_RESOLVE_ATTACHMENT_REUSE_EXT = 11,\n    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_SINGLE_SUBPASS_EXT = 12,\n    VK_SUBPASS_MERGE_STATUS_NOT_MERGED_UNSPECIFIED_EXT = 13,\n    VK_SUBPASS_MERGE_STATUS_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkSubpassMergeStatusEXT;\ntypedef struct VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           subpassMergeFeedback;\n} VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT;\n\ntypedef struct VkRenderPassCreationControlEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           disallowMerging;\n} VkRenderPassCreationControlEXT;\n\ntypedef struct VkRenderPassCreationFeedbackInfoEXT {\n    uint32_t    postMergeSubpassCount;\n} VkRenderPassCreationFeedbackInfoEXT;\n\ntypedef struct VkRenderPassCreationFeedbackCreateInfoEXT {\n    VkStructureType                         sType;\n    const void*                             pNext;\n    VkRenderPassCreationFeedbackInfoEXT*    pRenderPassFeedback;\n} VkRenderPassCreationFeedbackCreateInfoEXT;\n\ntypedef struct VkRenderPassSubpassFeedbackInfoEXT {\n    VkSubpassMergeStatusEXT    subpassMergeStatus;\n    char                       description[VK_MAX_DESCRIPTION_SIZE];\n    uint32_t                   postMergeIndex;\n} VkRenderPassSubpassFeedbackInfoEXT;\n\ntypedef struct VkRenderPassSubpassFeedbackCreateInfoEXT {\n    VkStructureType                        sType;\n    const void*                            pNext;\n    VkRenderPassSubpassFeedbackInfoEXT*    pSubpassFeedback;\n} VkRenderPassSubpassFeedbackCreateInfoEXT;\n\n\n\n// VK_LUNARG_direct_driver_loading is a preprocessor guard. Do not pass it to API calls.\n#define VK_LUNARG_direct_driver_loading 1\n#define VK_LUNARG_DIRECT_DRIVER_LOADING_SPEC_VERSION 1\n#define VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME \"VK_LUNARG_direct_driver_loading\"\n\ntypedef enum VkDirectDriverLoadingModeLUNARG {\n    VK_DIRECT_DRIVER_LOADING_MODE_EXCLUSIVE_LUNARG = 0,\n    VK_DIRECT_DRIVER_LOADING_MODE_INCLUSIVE_LUNARG = 1,\n    VK_DIRECT_DRIVER_LOADING_MODE_MAX_ENUM_LUNARG = 0x7FFFFFFF\n} VkDirectDriverLoadingModeLUNARG;\ntypedef VkFlags VkDirectDriverLoadingFlagsLUNARG;\ntypedef PFN_vkVoidFunction (VKAPI_PTR *PFN_vkGetInstanceProcAddrLUNARG)(\n    VkInstance instance, const char* pName);\n\ntypedef struct VkDirectDriverLoadingInfoLUNARG {\n    VkStructureType                     sType;\n    void*                               pNext;\n    VkDirectDriverLoadingFlagsLUNARG    flags;\n    PFN_vkGetInstanceProcAddrLUNARG     pfnGetInstanceProcAddr;\n} VkDirectDriverLoadingInfoLUNARG;\n\ntypedef struct VkDirectDriverLoadingListLUNARG {\n    VkStructureType                           sType;\n    const void*                               pNext;\n    VkDirectDriverLoadingModeLUNARG           mode;\n    uint32_t                                  driverCount;\n    const VkDirectDriverLoadingInfoLUNARG*    pDrivers;\n} VkDirectDriverLoadingListLUNARG;\n\n\n\n// VK_EXT_shader_module_identifier is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_shader_module_identifier 1\n#define VK_MAX_SHADER_MODULE_IDENTIFIER_SIZE_EXT 32U\n#define VK_EXT_SHADER_MODULE_IDENTIFIER_SPEC_VERSION 1\n#define VK_EXT_SHADER_MODULE_IDENTIFIER_EXTENSION_NAME \"VK_EXT_shader_module_identifier\"\ntypedef struct VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderModuleIdentifier;\n} VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT;\n\ntypedef struct VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    uint8_t            shaderModuleIdentifierAlgorithmUUID[VK_UUID_SIZE];\n} VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT;\n\ntypedef struct VkPipelineShaderStageModuleIdentifierCreateInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           identifierSize;\n    const uint8_t*     pIdentifier;\n} VkPipelineShaderStageModuleIdentifierCreateInfoEXT;\n\ntypedef struct VkShaderModuleIdentifierEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           identifierSize;\n    uint8_t            identifier[VK_MAX_SHADER_MODULE_IDENTIFIER_SIZE_EXT];\n} VkShaderModuleIdentifierEXT;\n\ntypedef void (VKAPI_PTR *PFN_vkGetShaderModuleIdentifierEXT)(VkDevice device, VkShaderModule shaderModule, VkShaderModuleIdentifierEXT* pIdentifier);\ntypedef void (VKAPI_PTR *PFN_vkGetShaderModuleCreateInfoIdentifierEXT)(VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo, VkShaderModuleIdentifierEXT* pIdentifier);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkGetShaderModuleIdentifierEXT(\n    VkDevice                                    device,\n    VkShaderModule                              shaderModule,\n    VkShaderModuleIdentifierEXT*                pIdentifier);\n\nVKAPI_ATTR void VKAPI_CALL vkGetShaderModuleCreateInfoIdentifierEXT(\n    VkDevice                                    device,\n    const VkShaderModuleCreateInfo*             pCreateInfo,\n    VkShaderModuleIdentifierEXT*                pIdentifier);\n#endif\n\n\n// VK_EXT_rasterization_order_attachment_access is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_rasterization_order_attachment_access 1\n#define VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_SPEC_VERSION 1\n#define VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME \"VK_EXT_rasterization_order_attachment_access\"\n\n\n// VK_NV_optical_flow is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_optical_flow 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkOpticalFlowSessionNV)\n#define VK_NV_OPTICAL_FLOW_SPEC_VERSION   1\n#define VK_NV_OPTICAL_FLOW_EXTENSION_NAME \"VK_NV_optical_flow\"\n\ntypedef enum VkOpticalFlowPerformanceLevelNV {\n    VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_UNKNOWN_NV = 0,\n    VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_SLOW_NV = 1,\n    VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_MEDIUM_NV = 2,\n    VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_FAST_NV = 3,\n    VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_MAX_ENUM_NV = 0x7FFFFFFF\n} VkOpticalFlowPerformanceLevelNV;\n\ntypedef enum VkOpticalFlowSessionBindingPointNV {\n    VK_OPTICAL_FLOW_SESSION_BINDING_POINT_UNKNOWN_NV = 0,\n    VK_OPTICAL_FLOW_SESSION_BINDING_POINT_INPUT_NV = 1,\n    VK_OPTICAL_FLOW_SESSION_BINDING_POINT_REFERENCE_NV = 2,\n    VK_OPTICAL_FLOW_SESSION_BINDING_POINT_HINT_NV = 3,\n    VK_OPTICAL_FLOW_SESSION_BINDING_POINT_FLOW_VECTOR_NV = 4,\n    VK_OPTICAL_FLOW_SESSION_BINDING_POINT_BACKWARD_FLOW_VECTOR_NV = 5,\n    VK_OPTICAL_FLOW_SESSION_BINDING_POINT_COST_NV = 6,\n    VK_OPTICAL_FLOW_SESSION_BINDING_POINT_BACKWARD_COST_NV = 7,\n    VK_OPTICAL_FLOW_SESSION_BINDING_POINT_GLOBAL_FLOW_NV = 8,\n    VK_OPTICAL_FLOW_SESSION_BINDING_POINT_MAX_ENUM_NV = 0x7FFFFFFF\n} VkOpticalFlowSessionBindingPointNV;\n\ntypedef enum VkOpticalFlowGridSizeFlagBitsNV {\n    VK_OPTICAL_FLOW_GRID_SIZE_UNKNOWN_NV = 0,\n    VK_OPTICAL_FLOW_GRID_SIZE_1X1_BIT_NV = 0x00000001,\n    VK_OPTICAL_FLOW_GRID_SIZE_2X2_BIT_NV = 0x00000002,\n    VK_OPTICAL_FLOW_GRID_SIZE_4X4_BIT_NV = 0x00000004,\n    VK_OPTICAL_FLOW_GRID_SIZE_8X8_BIT_NV = 0x00000008,\n    VK_OPTICAL_FLOW_GRID_SIZE_FLAG_BITS_MAX_ENUM_NV = 0x7FFFFFFF\n} VkOpticalFlowGridSizeFlagBitsNV;\ntypedef VkFlags   VkOpticalFlowGridSizeFlagsNV;\n\ntypedef enum VkOpticalFlowUsageFlagBitsNV {\n    VK_OPTICAL_FLOW_USAGE_UNKNOWN_NV = 0,\n    VK_OPTICAL_FLOW_USAGE_INPUT_BIT_NV = 0x00000001,\n    VK_OPTICAL_FLOW_USAGE_OUTPUT_BIT_NV = 0x00000002,\n    VK_OPTICAL_FLOW_USAGE_HINT_BIT_NV = 0x00000004,\n    VK_OPTICAL_FLOW_USAGE_COST_BIT_NV = 0x00000008,\n    VK_OPTICAL_FLOW_USAGE_GLOBAL_FLOW_BIT_NV = 0x00000010,\n    VK_OPTICAL_FLOW_USAGE_FLAG_BITS_MAX_ENUM_NV = 0x7FFFFFFF\n} VkOpticalFlowUsageFlagBitsNV;\ntypedef VkFlags   VkOpticalFlowUsageFlagsNV;\n\ntypedef enum VkOpticalFlowSessionCreateFlagBitsNV {\n    VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_HINT_BIT_NV = 0x00000001,\n    VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_COST_BIT_NV = 0x00000002,\n    VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_GLOBAL_FLOW_BIT_NV = 0x00000004,\n    VK_OPTICAL_FLOW_SESSION_CREATE_ALLOW_REGIONS_BIT_NV = 0x00000008,\n    VK_OPTICAL_FLOW_SESSION_CREATE_BOTH_DIRECTIONS_BIT_NV = 0x00000010,\n    VK_OPTICAL_FLOW_SESSION_CREATE_FLAG_BITS_MAX_ENUM_NV = 0x7FFFFFFF\n} VkOpticalFlowSessionCreateFlagBitsNV;\ntypedef VkFlags   VkOpticalFlowSessionCreateFlagsNV;\n\ntypedef enum VkOpticalFlowExecuteFlagBitsNV {\n    VK_OPTICAL_FLOW_EXECUTE_DISABLE_TEMPORAL_HINTS_BIT_NV = 0x00000001,\n    VK_OPTICAL_FLOW_EXECUTE_FLAG_BITS_MAX_ENUM_NV = 0x7FFFFFFF\n} VkOpticalFlowExecuteFlagBitsNV;\ntypedef VkFlags   VkOpticalFlowExecuteFlagsNV;\ntypedef struct VkPhysicalDeviceOpticalFlowFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           opticalFlow;\n} VkPhysicalDeviceOpticalFlowFeaturesNV;\n\ntypedef struct VkPhysicalDeviceOpticalFlowPropertiesNV {\n    VkStructureType                 sType;\n    void*                           pNext;\n    VkOpticalFlowGridSizeFlagsNV    supportedOutputGridSizes;\n    VkOpticalFlowGridSizeFlagsNV    supportedHintGridSizes;\n    VkBool32                        hintSupported;\n    VkBool32                        costSupported;\n    VkBool32                        bidirectionalFlowSupported;\n    VkBool32                        globalFlowSupported;\n    uint32_t                        minWidth;\n    uint32_t                        minHeight;\n    uint32_t                        maxWidth;\n    uint32_t                        maxHeight;\n    uint32_t                        maxNumRegionsOfInterest;\n} VkPhysicalDeviceOpticalFlowPropertiesNV;\n\ntypedef struct VkOpticalFlowImageFormatInfoNV {\n    VkStructureType              sType;\n    const void*                  pNext;\n    VkOpticalFlowUsageFlagsNV    usage;\n} VkOpticalFlowImageFormatInfoNV;\n\ntypedef struct VkOpticalFlowImageFormatPropertiesNV {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkFormat           format;\n} VkOpticalFlowImageFormatPropertiesNV;\n\ntypedef struct VkOpticalFlowSessionCreateInfoNV {\n    VkStructureType                      sType;\n    void*                                pNext;\n    uint32_t                             width;\n    uint32_t                             height;\n    VkFormat                             imageFormat;\n    VkFormat                             flowVectorFormat;\n    VkFormat                             costFormat;\n    VkOpticalFlowGridSizeFlagsNV         outputGridSize;\n    VkOpticalFlowGridSizeFlagsNV         hintGridSize;\n    VkOpticalFlowPerformanceLevelNV      performanceLevel;\n    VkOpticalFlowSessionCreateFlagsNV    flags;\n} VkOpticalFlowSessionCreateInfoNV;\n\ntypedef struct VkOpticalFlowSessionCreatePrivateDataInfoNV {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           id;\n    uint32_t           size;\n    const void*        pPrivateData;\n} VkOpticalFlowSessionCreatePrivateDataInfoNV;\n\ntypedef struct VkOpticalFlowExecuteInfoNV {\n    VkStructureType                sType;\n    void*                          pNext;\n    VkOpticalFlowExecuteFlagsNV    flags;\n    uint32_t                       regionCount;\n    const VkRect2D*                pRegions;\n} VkOpticalFlowExecuteInfoNV;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceOpticalFlowImageFormatsNV)(VkPhysicalDevice physicalDevice, const VkOpticalFlowImageFormatInfoNV* pOpticalFlowImageFormatInfo, uint32_t* pFormatCount, VkOpticalFlowImageFormatPropertiesNV* pImageFormatProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateOpticalFlowSessionNV)(VkDevice device, const VkOpticalFlowSessionCreateInfoNV* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkOpticalFlowSessionNV* pSession);\ntypedef void (VKAPI_PTR *PFN_vkDestroyOpticalFlowSessionNV)(VkDevice device, VkOpticalFlowSessionNV session, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkBindOpticalFlowSessionImageNV)(VkDevice device, VkOpticalFlowSessionNV session, VkOpticalFlowSessionBindingPointNV bindingPoint, VkImageView view, VkImageLayout layout);\ntypedef void (VKAPI_PTR *PFN_vkCmdOpticalFlowExecuteNV)(VkCommandBuffer commandBuffer, VkOpticalFlowSessionNV session, const VkOpticalFlowExecuteInfoNV* pExecuteInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceOpticalFlowImageFormatsNV(\n    VkPhysicalDevice                            physicalDevice,\n    const VkOpticalFlowImageFormatInfoNV*       pOpticalFlowImageFormatInfo,\n    uint32_t*                                   pFormatCount,\n    VkOpticalFlowImageFormatPropertiesNV*       pImageFormatProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateOpticalFlowSessionNV(\n    VkDevice                                    device,\n    const VkOpticalFlowSessionCreateInfoNV*     pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkOpticalFlowSessionNV*                     pSession);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyOpticalFlowSessionNV(\n    VkDevice                                    device,\n    VkOpticalFlowSessionNV                      session,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkBindOpticalFlowSessionImageNV(\n    VkDevice                                    device,\n    VkOpticalFlowSessionNV                      session,\n    VkOpticalFlowSessionBindingPointNV          bindingPoint,\n    VkImageView                                 view,\n    VkImageLayout                               layout);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdOpticalFlowExecuteNV(\n    VkCommandBuffer                             commandBuffer,\n    VkOpticalFlowSessionNV                      session,\n    const VkOpticalFlowExecuteInfoNV*           pExecuteInfo);\n#endif\n\n\n// VK_EXT_legacy_dithering is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_legacy_dithering 1\n#define VK_EXT_LEGACY_DITHERING_SPEC_VERSION 2\n#define VK_EXT_LEGACY_DITHERING_EXTENSION_NAME \"VK_EXT_legacy_dithering\"\ntypedef struct VkPhysicalDeviceLegacyDitheringFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           legacyDithering;\n} VkPhysicalDeviceLegacyDitheringFeaturesEXT;\n\n\n\n// VK_EXT_pipeline_protected_access is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_pipeline_protected_access 1\n#define VK_EXT_PIPELINE_PROTECTED_ACCESS_SPEC_VERSION 1\n#define VK_EXT_PIPELINE_PROTECTED_ACCESS_EXTENSION_NAME \"VK_EXT_pipeline_protected_access\"\ntypedef VkPhysicalDevicePipelineProtectedAccessFeatures VkPhysicalDevicePipelineProtectedAccessFeaturesEXT;\n\n\n\n// VK_AMD_anti_lag is a preprocessor guard. Do not pass it to API calls.\n#define VK_AMD_anti_lag 1\n#define VK_AMD_ANTI_LAG_SPEC_VERSION      1\n#define VK_AMD_ANTI_LAG_EXTENSION_NAME    \"VK_AMD_anti_lag\"\n\ntypedef enum VkAntiLagModeAMD {\n    VK_ANTI_LAG_MODE_DRIVER_CONTROL_AMD = 0,\n    VK_ANTI_LAG_MODE_ON_AMD = 1,\n    VK_ANTI_LAG_MODE_OFF_AMD = 2,\n    VK_ANTI_LAG_MODE_MAX_ENUM_AMD = 0x7FFFFFFF\n} VkAntiLagModeAMD;\n\ntypedef enum VkAntiLagStageAMD {\n    VK_ANTI_LAG_STAGE_INPUT_AMD = 0,\n    VK_ANTI_LAG_STAGE_PRESENT_AMD = 1,\n    VK_ANTI_LAG_STAGE_MAX_ENUM_AMD = 0x7FFFFFFF\n} VkAntiLagStageAMD;\ntypedef struct VkPhysicalDeviceAntiLagFeaturesAMD {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           antiLag;\n} VkPhysicalDeviceAntiLagFeaturesAMD;\n\ntypedef struct VkAntiLagPresentationInfoAMD {\n    VkStructureType      sType;\n    void*                pNext;\n    VkAntiLagStageAMD    stage;\n    uint64_t             frameIndex;\n} VkAntiLagPresentationInfoAMD;\n\ntypedef struct VkAntiLagDataAMD {\n    VkStructureType                        sType;\n    const void*                            pNext;\n    VkAntiLagModeAMD                       mode;\n    uint32_t                               maxFPS;\n    const VkAntiLagPresentationInfoAMD*    pPresentationInfo;\n} VkAntiLagDataAMD;\n\ntypedef void (VKAPI_PTR *PFN_vkAntiLagUpdateAMD)(VkDevice device, const VkAntiLagDataAMD* pData);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkAntiLagUpdateAMD(\n    VkDevice                                    device,\n    const VkAntiLagDataAMD*                     pData);\n#endif\n\n\n// VK_EXT_shader_object is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_shader_object 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkShaderEXT)\n#define VK_EXT_SHADER_OBJECT_SPEC_VERSION 1\n#define VK_EXT_SHADER_OBJECT_EXTENSION_NAME \"VK_EXT_shader_object\"\n\ntypedef enum VkShaderCodeTypeEXT {\n    VK_SHADER_CODE_TYPE_BINARY_EXT = 0,\n    VK_SHADER_CODE_TYPE_SPIRV_EXT = 1,\n    VK_SHADER_CODE_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkShaderCodeTypeEXT;\n\ntypedef enum VkDepthClampModeEXT {\n    VK_DEPTH_CLAMP_MODE_VIEWPORT_RANGE_EXT = 0,\n    VK_DEPTH_CLAMP_MODE_USER_DEFINED_RANGE_EXT = 1,\n    VK_DEPTH_CLAMP_MODE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkDepthClampModeEXT;\n\ntypedef enum VkShaderCreateFlagBitsEXT {\n    VK_SHADER_CREATE_LINK_STAGE_BIT_EXT = 0x00000001,\n    VK_SHADER_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT = 0x00000002,\n    VK_SHADER_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT = 0x00000004,\n    VK_SHADER_CREATE_NO_TASK_SHADER_BIT_EXT = 0x00000008,\n    VK_SHADER_CREATE_DISPATCH_BASE_BIT_EXT = 0x00000010,\n    VK_SHADER_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_EXT = 0x00000020,\n    VK_SHADER_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT = 0x00000040,\n    VK_SHADER_CREATE_INDIRECT_BINDABLE_BIT_EXT = 0x00000080,\n    VK_SHADER_CREATE_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkShaderCreateFlagBitsEXT;\ntypedef VkFlags VkShaderCreateFlagsEXT;\ntypedef struct VkPhysicalDeviceShaderObjectFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderObject;\n} VkPhysicalDeviceShaderObjectFeaturesEXT;\n\ntypedef struct VkPhysicalDeviceShaderObjectPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    uint8_t            shaderBinaryUUID[VK_UUID_SIZE];\n    uint32_t           shaderBinaryVersion;\n} VkPhysicalDeviceShaderObjectPropertiesEXT;\n\ntypedef struct VkShaderCreateInfoEXT {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    VkShaderCreateFlagsEXT          flags;\n    VkShaderStageFlagBits           stage;\n    VkShaderStageFlags              nextStage;\n    VkShaderCodeTypeEXT             codeType;\n    size_t                          codeSize;\n    const void*                     pCode;\n    const char*                     pName;\n    uint32_t                        setLayoutCount;\n    const VkDescriptorSetLayout*    pSetLayouts;\n    uint32_t                        pushConstantRangeCount;\n    const VkPushConstantRange*      pPushConstantRanges;\n    const VkSpecializationInfo*     pSpecializationInfo;\n} VkShaderCreateInfoEXT;\n\ntypedef VkPipelineShaderStageRequiredSubgroupSizeCreateInfo VkShaderRequiredSubgroupSizeCreateInfoEXT;\n\ntypedef struct VkDepthClampRangeEXT {\n    float    minDepthClamp;\n    float    maxDepthClamp;\n} VkDepthClampRangeEXT;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateShadersEXT)(VkDevice device, uint32_t createInfoCount, const VkShaderCreateInfoEXT* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkShaderEXT* pShaders);\ntypedef void (VKAPI_PTR *PFN_vkDestroyShaderEXT)(VkDevice device, VkShaderEXT shader, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetShaderBinaryDataEXT)(VkDevice device, VkShaderEXT shader, size_t* pDataSize, void* pData);\ntypedef void (VKAPI_PTR *PFN_vkCmdBindShadersEXT)(VkCommandBuffer commandBuffer, uint32_t stageCount, const VkShaderStageFlagBits* pStages, const VkShaderEXT* pShaders);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDepthClampRangeEXT)(VkCommandBuffer commandBuffer, VkDepthClampModeEXT depthClampMode, const VkDepthClampRangeEXT* pDepthClampRange);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateShadersEXT(\n    VkDevice                                    device,\n    uint32_t                                    createInfoCount,\n    const VkShaderCreateInfoEXT*                pCreateInfos,\n    const VkAllocationCallbacks*                pAllocator,\n    VkShaderEXT*                                pShaders);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyShaderEXT(\n    VkDevice                                    device,\n    VkShaderEXT                                 shader,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetShaderBinaryDataEXT(\n    VkDevice                                    device,\n    VkShaderEXT                                 shader,\n    size_t*                                     pDataSize,\n    void*                                       pData);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBindShadersEXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    stageCount,\n    const VkShaderStageFlagBits*                pStages,\n    const VkShaderEXT*                          pShaders);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDepthClampRangeEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkDepthClampModeEXT                         depthClampMode,\n    const VkDepthClampRangeEXT*                 pDepthClampRange);\n#endif\n\n\n// VK_QCOM_tile_properties is a preprocessor guard. Do not pass it to API calls.\n#define VK_QCOM_tile_properties 1\n#define VK_QCOM_TILE_PROPERTIES_SPEC_VERSION 1\n#define VK_QCOM_TILE_PROPERTIES_EXTENSION_NAME \"VK_QCOM_tile_properties\"\ntypedef struct VkPhysicalDeviceTilePropertiesFeaturesQCOM {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           tileProperties;\n} VkPhysicalDeviceTilePropertiesFeaturesQCOM;\n\ntypedef struct VkTilePropertiesQCOM {\n    VkStructureType    sType;\n    void*              pNext;\n    VkExtent3D         tileSize;\n    VkExtent2D         apronSize;\n    VkOffset2D         origin;\n} VkTilePropertiesQCOM;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetFramebufferTilePropertiesQCOM)(VkDevice device, VkFramebuffer framebuffer, uint32_t* pPropertiesCount, VkTilePropertiesQCOM* pProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetDynamicRenderingTilePropertiesQCOM)(VkDevice device, const VkRenderingInfo* pRenderingInfo, VkTilePropertiesQCOM* pProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetFramebufferTilePropertiesQCOM(\n    VkDevice                                    device,\n    VkFramebuffer                               framebuffer,\n    uint32_t*                                   pPropertiesCount,\n    VkTilePropertiesQCOM*                       pProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetDynamicRenderingTilePropertiesQCOM(\n    VkDevice                                    device,\n    const VkRenderingInfo*                      pRenderingInfo,\n    VkTilePropertiesQCOM*                       pProperties);\n#endif\n\n\n// VK_SEC_amigo_profiling is a preprocessor guard. Do not pass it to API calls.\n#define VK_SEC_amigo_profiling 1\n#define VK_SEC_AMIGO_PROFILING_SPEC_VERSION 1\n#define VK_SEC_AMIGO_PROFILING_EXTENSION_NAME \"VK_SEC_amigo_profiling\"\ntypedef struct VkPhysicalDeviceAmigoProfilingFeaturesSEC {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           amigoProfiling;\n} VkPhysicalDeviceAmigoProfilingFeaturesSEC;\n\ntypedef struct VkAmigoProfilingSubmitInfoSEC {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint64_t           firstDrawTimestamp;\n    uint64_t           swapBufferTimestamp;\n} VkAmigoProfilingSubmitInfoSEC;\n\n\n\n// VK_QCOM_multiview_per_view_viewports is a preprocessor guard. Do not pass it to API calls.\n#define VK_QCOM_multiview_per_view_viewports 1\n#define VK_QCOM_MULTIVIEW_PER_VIEW_VIEWPORTS_SPEC_VERSION 1\n#define VK_QCOM_MULTIVIEW_PER_VIEW_VIEWPORTS_EXTENSION_NAME \"VK_QCOM_multiview_per_view_viewports\"\ntypedef struct VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           multiviewPerViewViewports;\n} VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM;\n\n\n\n// VK_NV_ray_tracing_invocation_reorder is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_ray_tracing_invocation_reorder 1\n#define VK_NV_RAY_TRACING_INVOCATION_REORDER_SPEC_VERSION 1\n#define VK_NV_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME \"VK_NV_ray_tracing_invocation_reorder\"\n\ntypedef enum VkRayTracingInvocationReorderModeNV {\n    VK_RAY_TRACING_INVOCATION_REORDER_MODE_NONE_NV = 0,\n    VK_RAY_TRACING_INVOCATION_REORDER_MODE_REORDER_NV = 1,\n    VK_RAY_TRACING_INVOCATION_REORDER_MODE_MAX_ENUM_NV = 0x7FFFFFFF\n} VkRayTracingInvocationReorderModeNV;\ntypedef struct VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV {\n    VkStructureType                        sType;\n    void*                                  pNext;\n    VkRayTracingInvocationReorderModeNV    rayTracingInvocationReorderReorderingHint;\n} VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV;\n\ntypedef struct VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           rayTracingInvocationReorder;\n} VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV;\n\n\n\n// VK_NV_cooperative_vector is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_cooperative_vector 1\n#define VK_NV_COOPERATIVE_VECTOR_SPEC_VERSION 4\n#define VK_NV_COOPERATIVE_VECTOR_EXTENSION_NAME \"VK_NV_cooperative_vector\"\n\ntypedef enum VkCooperativeVectorMatrixLayoutNV {\n    VK_COOPERATIVE_VECTOR_MATRIX_LAYOUT_ROW_MAJOR_NV = 0,\n    VK_COOPERATIVE_VECTOR_MATRIX_LAYOUT_COLUMN_MAJOR_NV = 1,\n    VK_COOPERATIVE_VECTOR_MATRIX_LAYOUT_INFERENCING_OPTIMAL_NV = 2,\n    VK_COOPERATIVE_VECTOR_MATRIX_LAYOUT_TRAINING_OPTIMAL_NV = 3,\n    VK_COOPERATIVE_VECTOR_MATRIX_LAYOUT_MAX_ENUM_NV = 0x7FFFFFFF\n} VkCooperativeVectorMatrixLayoutNV;\ntypedef struct VkPhysicalDeviceCooperativeVectorPropertiesNV {\n    VkStructureType       sType;\n    void*                 pNext;\n    VkShaderStageFlags    cooperativeVectorSupportedStages;\n    VkBool32              cooperativeVectorTrainingFloat16Accumulation;\n    VkBool32              cooperativeVectorTrainingFloat32Accumulation;\n    uint32_t              maxCooperativeVectorComponents;\n} VkPhysicalDeviceCooperativeVectorPropertiesNV;\n\ntypedef struct VkPhysicalDeviceCooperativeVectorFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           cooperativeVector;\n    VkBool32           cooperativeVectorTraining;\n} VkPhysicalDeviceCooperativeVectorFeaturesNV;\n\ntypedef struct VkCooperativeVectorPropertiesNV {\n    VkStructureType       sType;\n    void*                 pNext;\n    VkComponentTypeKHR    inputType;\n    VkComponentTypeKHR    inputInterpretation;\n    VkComponentTypeKHR    matrixInterpretation;\n    VkComponentTypeKHR    biasInterpretation;\n    VkComponentTypeKHR    resultType;\n    VkBool32              transpose;\n} VkCooperativeVectorPropertiesNV;\n\ntypedef struct VkConvertCooperativeVectorMatrixInfoNV {\n    VkStructureType                      sType;\n    const void*                          pNext;\n    size_t                               srcSize;\n    VkDeviceOrHostAddressConstKHR        srcData;\n    size_t*                              pDstSize;\n    VkDeviceOrHostAddressKHR             dstData;\n    VkComponentTypeKHR                   srcComponentType;\n    VkComponentTypeKHR                   dstComponentType;\n    uint32_t                             numRows;\n    uint32_t                             numColumns;\n    VkCooperativeVectorMatrixLayoutNV    srcLayout;\n    size_t                               srcStride;\n    VkCooperativeVectorMatrixLayoutNV    dstLayout;\n    size_t                               dstStride;\n} VkConvertCooperativeVectorMatrixInfoNV;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceCooperativeVectorPropertiesNV)(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkCooperativeVectorPropertiesNV* pProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkConvertCooperativeVectorMatrixNV)(VkDevice device, const VkConvertCooperativeVectorMatrixInfoNV* pInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdConvertCooperativeVectorMatrixNV)(VkCommandBuffer commandBuffer, uint32_t infoCount, const VkConvertCooperativeVectorMatrixInfoNV* pInfos);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceCooperativeVectorPropertiesNV(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t*                                   pPropertyCount,\n    VkCooperativeVectorPropertiesNV*            pProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkConvertCooperativeVectorMatrixNV(\n    VkDevice                                    device,\n    const VkConvertCooperativeVectorMatrixInfoNV* pInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdConvertCooperativeVectorMatrixNV(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    infoCount,\n    const VkConvertCooperativeVectorMatrixInfoNV* pInfos);\n#endif\n\n\n// VK_NV_extended_sparse_address_space is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_extended_sparse_address_space 1\n#define VK_NV_EXTENDED_SPARSE_ADDRESS_SPACE_SPEC_VERSION 1\n#define VK_NV_EXTENDED_SPARSE_ADDRESS_SPACE_EXTENSION_NAME \"VK_NV_extended_sparse_address_space\"\ntypedef struct VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           extendedSparseAddressSpace;\n} VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV;\n\ntypedef struct VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV {\n    VkStructureType       sType;\n    void*                 pNext;\n    VkDeviceSize          extendedSparseAddressSpaceSize;\n    VkImageUsageFlags     extendedSparseImageUsageFlags;\n    VkBufferUsageFlags    extendedSparseBufferUsageFlags;\n} VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV;\n\n\n\n// VK_EXT_mutable_descriptor_type is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_mutable_descriptor_type 1\n#define VK_EXT_MUTABLE_DESCRIPTOR_TYPE_SPEC_VERSION 1\n#define VK_EXT_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME \"VK_EXT_mutable_descriptor_type\"\n\n\n// VK_EXT_legacy_vertex_attributes is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_legacy_vertex_attributes 1\n#define VK_EXT_LEGACY_VERTEX_ATTRIBUTES_SPEC_VERSION 1\n#define VK_EXT_LEGACY_VERTEX_ATTRIBUTES_EXTENSION_NAME \"VK_EXT_legacy_vertex_attributes\"\ntypedef struct VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           legacyVertexAttributes;\n} VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT;\n\ntypedef struct VkPhysicalDeviceLegacyVertexAttributesPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           nativeUnalignedPerformance;\n} VkPhysicalDeviceLegacyVertexAttributesPropertiesEXT;\n\n\n\n// VK_EXT_layer_settings is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_layer_settings 1\n#define VK_EXT_LAYER_SETTINGS_SPEC_VERSION 2\n#define VK_EXT_LAYER_SETTINGS_EXTENSION_NAME \"VK_EXT_layer_settings\"\n\ntypedef enum VkLayerSettingTypeEXT {\n    VK_LAYER_SETTING_TYPE_BOOL32_EXT = 0,\n    VK_LAYER_SETTING_TYPE_INT32_EXT = 1,\n    VK_LAYER_SETTING_TYPE_INT64_EXT = 2,\n    VK_LAYER_SETTING_TYPE_UINT32_EXT = 3,\n    VK_LAYER_SETTING_TYPE_UINT64_EXT = 4,\n    VK_LAYER_SETTING_TYPE_FLOAT32_EXT = 5,\n    VK_LAYER_SETTING_TYPE_FLOAT64_EXT = 6,\n    VK_LAYER_SETTING_TYPE_STRING_EXT = 7,\n    VK_LAYER_SETTING_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkLayerSettingTypeEXT;\ntypedef struct VkLayerSettingEXT {\n    const char*              pLayerName;\n    const char*              pSettingName;\n    VkLayerSettingTypeEXT    type;\n    uint32_t                 valueCount;\n    const void*              pValues;\n} VkLayerSettingEXT;\n\ntypedef struct VkLayerSettingsCreateInfoEXT {\n    VkStructureType             sType;\n    const void*                 pNext;\n    uint32_t                    settingCount;\n    const VkLayerSettingEXT*    pSettings;\n} VkLayerSettingsCreateInfoEXT;\n\n\n\n// VK_ARM_shader_core_builtins is a preprocessor guard. Do not pass it to API calls.\n#define VK_ARM_shader_core_builtins 1\n#define VK_ARM_SHADER_CORE_BUILTINS_SPEC_VERSION 2\n#define VK_ARM_SHADER_CORE_BUILTINS_EXTENSION_NAME \"VK_ARM_shader_core_builtins\"\ntypedef struct VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderCoreBuiltins;\n} VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM;\n\ntypedef struct VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM {\n    VkStructureType    sType;\n    void*              pNext;\n    uint64_t           shaderCoreMask;\n    uint32_t           shaderCoreCount;\n    uint32_t           shaderWarpsPerCore;\n} VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM;\n\n\n\n// VK_EXT_pipeline_library_group_handles is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_pipeline_library_group_handles 1\n#define VK_EXT_PIPELINE_LIBRARY_GROUP_HANDLES_SPEC_VERSION 1\n#define VK_EXT_PIPELINE_LIBRARY_GROUP_HANDLES_EXTENSION_NAME \"VK_EXT_pipeline_library_group_handles\"\ntypedef struct VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           pipelineLibraryGroupHandles;\n} VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT;\n\n\n\n// VK_EXT_dynamic_rendering_unused_attachments is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_dynamic_rendering_unused_attachments 1\n#define VK_EXT_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_SPEC_VERSION 1\n#define VK_EXT_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_EXTENSION_NAME \"VK_EXT_dynamic_rendering_unused_attachments\"\ntypedef struct VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           dynamicRenderingUnusedAttachments;\n} VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT;\n\n\n\n// VK_NV_low_latency2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_low_latency2 1\n#define VK_NV_LOW_LATENCY_2_SPEC_VERSION  2\n#define VK_NV_LOW_LATENCY_2_EXTENSION_NAME \"VK_NV_low_latency2\"\n\ntypedef enum VkLatencyMarkerNV {\n    VK_LATENCY_MARKER_SIMULATION_START_NV = 0,\n    VK_LATENCY_MARKER_SIMULATION_END_NV = 1,\n    VK_LATENCY_MARKER_RENDERSUBMIT_START_NV = 2,\n    VK_LATENCY_MARKER_RENDERSUBMIT_END_NV = 3,\n    VK_LATENCY_MARKER_PRESENT_START_NV = 4,\n    VK_LATENCY_MARKER_PRESENT_END_NV = 5,\n    VK_LATENCY_MARKER_INPUT_SAMPLE_NV = 6,\n    VK_LATENCY_MARKER_TRIGGER_FLASH_NV = 7,\n    VK_LATENCY_MARKER_OUT_OF_BAND_RENDERSUBMIT_START_NV = 8,\n    VK_LATENCY_MARKER_OUT_OF_BAND_RENDERSUBMIT_END_NV = 9,\n    VK_LATENCY_MARKER_OUT_OF_BAND_PRESENT_START_NV = 10,\n    VK_LATENCY_MARKER_OUT_OF_BAND_PRESENT_END_NV = 11,\n    VK_LATENCY_MARKER_MAX_ENUM_NV = 0x7FFFFFFF\n} VkLatencyMarkerNV;\n\ntypedef enum VkOutOfBandQueueTypeNV {\n    VK_OUT_OF_BAND_QUEUE_TYPE_RENDER_NV = 0,\n    VK_OUT_OF_BAND_QUEUE_TYPE_PRESENT_NV = 1,\n    VK_OUT_OF_BAND_QUEUE_TYPE_MAX_ENUM_NV = 0x7FFFFFFF\n} VkOutOfBandQueueTypeNV;\ntypedef struct VkLatencySleepModeInfoNV {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           lowLatencyMode;\n    VkBool32           lowLatencyBoost;\n    uint32_t           minimumIntervalUs;\n} VkLatencySleepModeInfoNV;\n\ntypedef struct VkLatencySleepInfoNV {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkSemaphore        signalSemaphore;\n    uint64_t           value;\n} VkLatencySleepInfoNV;\n\ntypedef struct VkSetLatencyMarkerInfoNV {\n    VkStructureType      sType;\n    const void*          pNext;\n    uint64_t             presentID;\n    VkLatencyMarkerNV    marker;\n} VkSetLatencyMarkerInfoNV;\n\ntypedef struct VkLatencyTimingsFrameReportNV {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint64_t           presentID;\n    uint64_t           inputSampleTimeUs;\n    uint64_t           simStartTimeUs;\n    uint64_t           simEndTimeUs;\n    uint64_t           renderSubmitStartTimeUs;\n    uint64_t           renderSubmitEndTimeUs;\n    uint64_t           presentStartTimeUs;\n    uint64_t           presentEndTimeUs;\n    uint64_t           driverStartTimeUs;\n    uint64_t           driverEndTimeUs;\n    uint64_t           osRenderQueueStartTimeUs;\n    uint64_t           osRenderQueueEndTimeUs;\n    uint64_t           gpuRenderStartTimeUs;\n    uint64_t           gpuRenderEndTimeUs;\n} VkLatencyTimingsFrameReportNV;\n\ntypedef struct VkGetLatencyMarkerInfoNV {\n    VkStructureType                   sType;\n    const void*                       pNext;\n    uint32_t                          timingCount;\n    VkLatencyTimingsFrameReportNV*    pTimings;\n} VkGetLatencyMarkerInfoNV;\n\ntypedef struct VkLatencySubmissionPresentIdNV {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint64_t           presentID;\n} VkLatencySubmissionPresentIdNV;\n\ntypedef struct VkSwapchainLatencyCreateInfoNV {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           latencyModeEnable;\n} VkSwapchainLatencyCreateInfoNV;\n\ntypedef struct VkOutOfBandQueueTypeInfoNV {\n    VkStructureType           sType;\n    const void*               pNext;\n    VkOutOfBandQueueTypeNV    queueType;\n} VkOutOfBandQueueTypeInfoNV;\n\ntypedef struct VkLatencySurfaceCapabilitiesNV {\n    VkStructureType      sType;\n    const void*          pNext;\n    uint32_t             presentModeCount;\n    VkPresentModeKHR*    pPresentModes;\n} VkLatencySurfaceCapabilitiesNV;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkSetLatencySleepModeNV)(VkDevice device, VkSwapchainKHR swapchain, const VkLatencySleepModeInfoNV* pSleepModeInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkLatencySleepNV)(VkDevice device, VkSwapchainKHR swapchain, const VkLatencySleepInfoNV* pSleepInfo);\ntypedef void (VKAPI_PTR *PFN_vkSetLatencyMarkerNV)(VkDevice device, VkSwapchainKHR swapchain, const VkSetLatencyMarkerInfoNV* pLatencyMarkerInfo);\ntypedef void (VKAPI_PTR *PFN_vkGetLatencyTimingsNV)(VkDevice device, VkSwapchainKHR swapchain, VkGetLatencyMarkerInfoNV* pLatencyMarkerInfo);\ntypedef void (VKAPI_PTR *PFN_vkQueueNotifyOutOfBandNV)(VkQueue queue, const VkOutOfBandQueueTypeInfoNV* pQueueTypeInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkSetLatencySleepModeNV(\n    VkDevice                                    device,\n    VkSwapchainKHR                              swapchain,\n    const VkLatencySleepModeInfoNV*             pSleepModeInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkLatencySleepNV(\n    VkDevice                                    device,\n    VkSwapchainKHR                              swapchain,\n    const VkLatencySleepInfoNV*                 pSleepInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkSetLatencyMarkerNV(\n    VkDevice                                    device,\n    VkSwapchainKHR                              swapchain,\n    const VkSetLatencyMarkerInfoNV*             pLatencyMarkerInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkGetLatencyTimingsNV(\n    VkDevice                                    device,\n    VkSwapchainKHR                              swapchain,\n    VkGetLatencyMarkerInfoNV*                   pLatencyMarkerInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkQueueNotifyOutOfBandNV(\n    VkQueue                                     queue,\n    const VkOutOfBandQueueTypeInfoNV*           pQueueTypeInfo);\n#endif\n\n\n// VK_QCOM_multiview_per_view_render_areas is a preprocessor guard. Do not pass it to API calls.\n#define VK_QCOM_multiview_per_view_render_areas 1\n#define VK_QCOM_MULTIVIEW_PER_VIEW_RENDER_AREAS_SPEC_VERSION 1\n#define VK_QCOM_MULTIVIEW_PER_VIEW_RENDER_AREAS_EXTENSION_NAME \"VK_QCOM_multiview_per_view_render_areas\"\ntypedef struct VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           multiviewPerViewRenderAreas;\n} VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM;\n\ntypedef struct VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           perViewRenderAreaCount;\n    const VkRect2D*    pPerViewRenderAreas;\n} VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM;\n\n\n\n// VK_NV_per_stage_descriptor_set is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_per_stage_descriptor_set 1\n#define VK_NV_PER_STAGE_DESCRIPTOR_SET_SPEC_VERSION 1\n#define VK_NV_PER_STAGE_DESCRIPTOR_SET_EXTENSION_NAME \"VK_NV_per_stage_descriptor_set\"\ntypedef struct VkPhysicalDevicePerStageDescriptorSetFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           perStageDescriptorSet;\n    VkBool32           dynamicPipelineLayout;\n} VkPhysicalDevicePerStageDescriptorSetFeaturesNV;\n\n\n\n// VK_QCOM_image_processing2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_QCOM_image_processing2 1\n#define VK_QCOM_IMAGE_PROCESSING_2_SPEC_VERSION 1\n#define VK_QCOM_IMAGE_PROCESSING_2_EXTENSION_NAME \"VK_QCOM_image_processing2\"\n\ntypedef enum VkBlockMatchWindowCompareModeQCOM {\n    VK_BLOCK_MATCH_WINDOW_COMPARE_MODE_MIN_QCOM = 0,\n    VK_BLOCK_MATCH_WINDOW_COMPARE_MODE_MAX_QCOM = 1,\n    VK_BLOCK_MATCH_WINDOW_COMPARE_MODE_MAX_ENUM_QCOM = 0x7FFFFFFF\n} VkBlockMatchWindowCompareModeQCOM;\ntypedef struct VkPhysicalDeviceImageProcessing2FeaturesQCOM {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           textureBlockMatch2;\n} VkPhysicalDeviceImageProcessing2FeaturesQCOM;\n\ntypedef struct VkPhysicalDeviceImageProcessing2PropertiesQCOM {\n    VkStructureType    sType;\n    void*              pNext;\n    VkExtent2D         maxBlockMatchWindow;\n} VkPhysicalDeviceImageProcessing2PropertiesQCOM;\n\ntypedef struct VkSamplerBlockMatchWindowCreateInfoQCOM {\n    VkStructureType                      sType;\n    const void*                          pNext;\n    VkExtent2D                           windowExtent;\n    VkBlockMatchWindowCompareModeQCOM    windowCompareMode;\n} VkSamplerBlockMatchWindowCreateInfoQCOM;\n\n\n\n// VK_QCOM_filter_cubic_weights is a preprocessor guard. Do not pass it to API calls.\n#define VK_QCOM_filter_cubic_weights 1\n#define VK_QCOM_FILTER_CUBIC_WEIGHTS_SPEC_VERSION 1\n#define VK_QCOM_FILTER_CUBIC_WEIGHTS_EXTENSION_NAME \"VK_QCOM_filter_cubic_weights\"\n\ntypedef enum VkCubicFilterWeightsQCOM {\n    VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM = 0,\n    VK_CUBIC_FILTER_WEIGHTS_ZERO_TANGENT_CARDINAL_QCOM = 1,\n    VK_CUBIC_FILTER_WEIGHTS_B_SPLINE_QCOM = 2,\n    VK_CUBIC_FILTER_WEIGHTS_MITCHELL_NETRAVALI_QCOM = 3,\n    VK_CUBIC_FILTER_WEIGHTS_MAX_ENUM_QCOM = 0x7FFFFFFF\n} VkCubicFilterWeightsQCOM;\ntypedef struct VkPhysicalDeviceCubicWeightsFeaturesQCOM {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           selectableCubicWeights;\n} VkPhysicalDeviceCubicWeightsFeaturesQCOM;\n\ntypedef struct VkSamplerCubicWeightsCreateInfoQCOM {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkCubicFilterWeightsQCOM    cubicWeights;\n} VkSamplerCubicWeightsCreateInfoQCOM;\n\ntypedef struct VkBlitImageCubicWeightsInfoQCOM {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkCubicFilterWeightsQCOM    cubicWeights;\n} VkBlitImageCubicWeightsInfoQCOM;\n\n\n\n// VK_QCOM_ycbcr_degamma is a preprocessor guard. Do not pass it to API calls.\n#define VK_QCOM_ycbcr_degamma 1\n#define VK_QCOM_YCBCR_DEGAMMA_SPEC_VERSION 1\n#define VK_QCOM_YCBCR_DEGAMMA_EXTENSION_NAME \"VK_QCOM_ycbcr_degamma\"\ntypedef struct VkPhysicalDeviceYcbcrDegammaFeaturesQCOM {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           ycbcrDegamma;\n} VkPhysicalDeviceYcbcrDegammaFeaturesQCOM;\n\ntypedef struct VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           enableYDegamma;\n    VkBool32           enableCbCrDegamma;\n} VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM;\n\n\n\n// VK_QCOM_filter_cubic_clamp is a preprocessor guard. Do not pass it to API calls.\n#define VK_QCOM_filter_cubic_clamp 1\n#define VK_QCOM_FILTER_CUBIC_CLAMP_SPEC_VERSION 1\n#define VK_QCOM_FILTER_CUBIC_CLAMP_EXTENSION_NAME \"VK_QCOM_filter_cubic_clamp\"\ntypedef struct VkPhysicalDeviceCubicClampFeaturesQCOM {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           cubicRangeClamp;\n} VkPhysicalDeviceCubicClampFeaturesQCOM;\n\n\n\n// VK_EXT_attachment_feedback_loop_dynamic_state is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_attachment_feedback_loop_dynamic_state 1\n#define VK_EXT_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_SPEC_VERSION 1\n#define VK_EXT_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_EXTENSION_NAME \"VK_EXT_attachment_feedback_loop_dynamic_state\"\ntypedef struct VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           attachmentFeedbackLoopDynamicState;\n} VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdSetAttachmentFeedbackLoopEnableEXT)(VkCommandBuffer commandBuffer, VkImageAspectFlags aspectMask);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdSetAttachmentFeedbackLoopEnableEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkImageAspectFlags                          aspectMask);\n#endif\n\n\n// VK_MSFT_layered_driver is a preprocessor guard. Do not pass it to API calls.\n#define VK_MSFT_layered_driver 1\n#define VK_MSFT_LAYERED_DRIVER_SPEC_VERSION 1\n#define VK_MSFT_LAYERED_DRIVER_EXTENSION_NAME \"VK_MSFT_layered_driver\"\n\ntypedef enum VkLayeredDriverUnderlyingApiMSFT {\n    VK_LAYERED_DRIVER_UNDERLYING_API_NONE_MSFT = 0,\n    VK_LAYERED_DRIVER_UNDERLYING_API_D3D12_MSFT = 1,\n    VK_LAYERED_DRIVER_UNDERLYING_API_MAX_ENUM_MSFT = 0x7FFFFFFF\n} VkLayeredDriverUnderlyingApiMSFT;\ntypedef struct VkPhysicalDeviceLayeredDriverPropertiesMSFT {\n    VkStructureType                     sType;\n    void*                               pNext;\n    VkLayeredDriverUnderlyingApiMSFT    underlyingAPI;\n} VkPhysicalDeviceLayeredDriverPropertiesMSFT;\n\n\n\n// VK_NV_descriptor_pool_overallocation is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_descriptor_pool_overallocation 1\n#define VK_NV_DESCRIPTOR_POOL_OVERALLOCATION_SPEC_VERSION 1\n#define VK_NV_DESCRIPTOR_POOL_OVERALLOCATION_EXTENSION_NAME \"VK_NV_descriptor_pool_overallocation\"\ntypedef struct VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           descriptorPoolOverallocation;\n} VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV;\n\n\n\n// VK_NV_display_stereo is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_display_stereo 1\n#define VK_NV_DISPLAY_STEREO_SPEC_VERSION 1\n#define VK_NV_DISPLAY_STEREO_EXTENSION_NAME \"VK_NV_display_stereo\"\n\ntypedef enum VkDisplaySurfaceStereoTypeNV {\n    VK_DISPLAY_SURFACE_STEREO_TYPE_NONE_NV = 0,\n    VK_DISPLAY_SURFACE_STEREO_TYPE_ONBOARD_DIN_NV = 1,\n    VK_DISPLAY_SURFACE_STEREO_TYPE_HDMI_3D_NV = 2,\n    VK_DISPLAY_SURFACE_STEREO_TYPE_INBAND_DISPLAYPORT_NV = 3,\n    VK_DISPLAY_SURFACE_STEREO_TYPE_MAX_ENUM_NV = 0x7FFFFFFF\n} VkDisplaySurfaceStereoTypeNV;\ntypedef struct VkDisplaySurfaceStereoCreateInfoNV {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    VkDisplaySurfaceStereoTypeNV    stereoType;\n} VkDisplaySurfaceStereoCreateInfoNV;\n\ntypedef struct VkDisplayModeStereoPropertiesNV {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           hdmi3DSupported;\n} VkDisplayModeStereoPropertiesNV;\n\n\n\n// VK_NV_raw_access_chains is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_raw_access_chains 1\n#define VK_NV_RAW_ACCESS_CHAINS_SPEC_VERSION 1\n#define VK_NV_RAW_ACCESS_CHAINS_EXTENSION_NAME \"VK_NV_raw_access_chains\"\ntypedef struct VkPhysicalDeviceRawAccessChainsFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderRawAccessChains;\n} VkPhysicalDeviceRawAccessChainsFeaturesNV;\n\n\n\n// VK_NV_command_buffer_inheritance is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_command_buffer_inheritance 1\n#define VK_NV_COMMAND_BUFFER_INHERITANCE_SPEC_VERSION 1\n#define VK_NV_COMMAND_BUFFER_INHERITANCE_EXTENSION_NAME \"VK_NV_command_buffer_inheritance\"\ntypedef struct VkPhysicalDeviceCommandBufferInheritanceFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           commandBufferInheritance;\n} VkPhysicalDeviceCommandBufferInheritanceFeaturesNV;\n\n\n\n// VK_NV_shader_atomic_float16_vector is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_shader_atomic_float16_vector 1\n#define VK_NV_SHADER_ATOMIC_FLOAT16_VECTOR_SPEC_VERSION 1\n#define VK_NV_SHADER_ATOMIC_FLOAT16_VECTOR_EXTENSION_NAME \"VK_NV_shader_atomic_float16_vector\"\ntypedef struct VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderFloat16VectorAtomics;\n} VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV;\n\n\n\n// VK_EXT_shader_replicated_composites is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_shader_replicated_composites 1\n#define VK_EXT_SHADER_REPLICATED_COMPOSITES_SPEC_VERSION 1\n#define VK_EXT_SHADER_REPLICATED_COMPOSITES_EXTENSION_NAME \"VK_EXT_shader_replicated_composites\"\ntypedef struct VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           shaderReplicatedComposites;\n} VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT;\n\n\n\n// VK_NV_ray_tracing_validation is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_ray_tracing_validation 1\n#define VK_NV_RAY_TRACING_VALIDATION_SPEC_VERSION 1\n#define VK_NV_RAY_TRACING_VALIDATION_EXTENSION_NAME \"VK_NV_ray_tracing_validation\"\ntypedef struct VkPhysicalDeviceRayTracingValidationFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           rayTracingValidation;\n} VkPhysicalDeviceRayTracingValidationFeaturesNV;\n\n\n\n// VK_NV_cluster_acceleration_structure is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_cluster_acceleration_structure 1\n#define VK_NV_CLUSTER_ACCELERATION_STRUCTURE_SPEC_VERSION 2\n#define VK_NV_CLUSTER_ACCELERATION_STRUCTURE_EXTENSION_NAME \"VK_NV_cluster_acceleration_structure\"\n\ntypedef enum VkClusterAccelerationStructureTypeNV {\n    VK_CLUSTER_ACCELERATION_STRUCTURE_TYPE_CLUSTERS_BOTTOM_LEVEL_NV = 0,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_TYPE_TRIANGLE_CLUSTER_NV = 1,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_TYPE_TRIANGLE_CLUSTER_TEMPLATE_NV = 2,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_TYPE_MAX_ENUM_NV = 0x7FFFFFFF\n} VkClusterAccelerationStructureTypeNV;\n\ntypedef enum VkClusterAccelerationStructureOpTypeNV {\n    VK_CLUSTER_ACCELERATION_STRUCTURE_OP_TYPE_MOVE_OBJECTS_NV = 0,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_OP_TYPE_BUILD_CLUSTERS_BOTTOM_LEVEL_NV = 1,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_OP_TYPE_BUILD_TRIANGLE_CLUSTER_NV = 2,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_OP_TYPE_BUILD_TRIANGLE_CLUSTER_TEMPLATE_NV = 3,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_OP_TYPE_INSTANTIATE_TRIANGLE_CLUSTER_NV = 4,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_OP_TYPE_MAX_ENUM_NV = 0x7FFFFFFF\n} VkClusterAccelerationStructureOpTypeNV;\n\ntypedef enum VkClusterAccelerationStructureOpModeNV {\n    VK_CLUSTER_ACCELERATION_STRUCTURE_OP_MODE_IMPLICIT_DESTINATIONS_NV = 0,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_OP_MODE_EXPLICIT_DESTINATIONS_NV = 1,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_OP_MODE_COMPUTE_SIZES_NV = 2,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_OP_MODE_MAX_ENUM_NV = 0x7FFFFFFF\n} VkClusterAccelerationStructureOpModeNV;\n\ntypedef enum VkClusterAccelerationStructureAddressResolutionFlagBitsNV {\n    VK_CLUSTER_ACCELERATION_STRUCTURE_ADDRESS_RESOLUTION_INDIRECTED_DST_IMPLICIT_DATA_BIT_NV = 0x00000001,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_ADDRESS_RESOLUTION_INDIRECTED_SCRATCH_DATA_BIT_NV = 0x00000002,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_ADDRESS_RESOLUTION_INDIRECTED_DST_ADDRESS_ARRAY_BIT_NV = 0x00000004,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_ADDRESS_RESOLUTION_INDIRECTED_DST_SIZES_ARRAY_BIT_NV = 0x00000008,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_ADDRESS_RESOLUTION_INDIRECTED_SRC_INFOS_ARRAY_BIT_NV = 0x00000010,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_ADDRESS_RESOLUTION_INDIRECTED_SRC_INFOS_COUNT_BIT_NV = 0x00000020,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_ADDRESS_RESOLUTION_FLAG_BITS_MAX_ENUM_NV = 0x7FFFFFFF\n} VkClusterAccelerationStructureAddressResolutionFlagBitsNV;\ntypedef VkFlags VkClusterAccelerationStructureAddressResolutionFlagsNV;\n\ntypedef enum VkClusterAccelerationStructureClusterFlagBitsNV {\n    VK_CLUSTER_ACCELERATION_STRUCTURE_CLUSTER_ALLOW_DISABLE_OPACITY_MICROMAPS_NV = 0x00000001,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_CLUSTER_FLAG_BITS_MAX_ENUM_NV = 0x7FFFFFFF\n} VkClusterAccelerationStructureClusterFlagBitsNV;\ntypedef VkFlags VkClusterAccelerationStructureClusterFlagsNV;\n\ntypedef enum VkClusterAccelerationStructureGeometryFlagBitsNV {\n    VK_CLUSTER_ACCELERATION_STRUCTURE_GEOMETRY_CULL_DISABLE_BIT_NV = 0x00000001,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_GEOMETRY_NO_DUPLICATE_ANYHIT_INVOCATION_BIT_NV = 0x00000002,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_GEOMETRY_OPAQUE_BIT_NV = 0x00000004,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_GEOMETRY_FLAG_BITS_MAX_ENUM_NV = 0x7FFFFFFF\n} VkClusterAccelerationStructureGeometryFlagBitsNV;\ntypedef VkFlags VkClusterAccelerationStructureGeometryFlagsNV;\n\ntypedef enum VkClusterAccelerationStructureIndexFormatFlagBitsNV {\n    VK_CLUSTER_ACCELERATION_STRUCTURE_INDEX_FORMAT_8BIT_NV = 0x00000001,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_INDEX_FORMAT_16BIT_NV = 0x00000002,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_INDEX_FORMAT_32BIT_NV = 0x00000004,\n    VK_CLUSTER_ACCELERATION_STRUCTURE_INDEX_FORMAT_FLAG_BITS_MAX_ENUM_NV = 0x7FFFFFFF\n} VkClusterAccelerationStructureIndexFormatFlagBitsNV;\ntypedef VkFlags VkClusterAccelerationStructureIndexFormatFlagsNV;\ntypedef struct VkPhysicalDeviceClusterAccelerationStructureFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           clusterAccelerationStructure;\n} VkPhysicalDeviceClusterAccelerationStructureFeaturesNV;\n\ntypedef struct VkPhysicalDeviceClusterAccelerationStructurePropertiesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxVerticesPerCluster;\n    uint32_t           maxTrianglesPerCluster;\n    uint32_t           clusterScratchByteAlignment;\n    uint32_t           clusterByteAlignment;\n    uint32_t           clusterTemplateByteAlignment;\n    uint32_t           clusterBottomLevelByteAlignment;\n    uint32_t           clusterTemplateBoundsByteAlignment;\n    uint32_t           maxClusterGeometryIndex;\n} VkPhysicalDeviceClusterAccelerationStructurePropertiesNV;\n\ntypedef struct VkClusterAccelerationStructureClustersBottomLevelInputNV {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxTotalClusterCount;\n    uint32_t           maxClusterCountPerAccelerationStructure;\n} VkClusterAccelerationStructureClustersBottomLevelInputNV;\n\ntypedef struct VkClusterAccelerationStructureTriangleClusterInputNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkFormat           vertexFormat;\n    uint32_t           maxGeometryIndexValue;\n    uint32_t           maxClusterUniqueGeometryCount;\n    uint32_t           maxClusterTriangleCount;\n    uint32_t           maxClusterVertexCount;\n    uint32_t           maxTotalTriangleCount;\n    uint32_t           maxTotalVertexCount;\n    uint32_t           minPositionTruncateBitCount;\n} VkClusterAccelerationStructureTriangleClusterInputNV;\n\ntypedef struct VkClusterAccelerationStructureMoveObjectsInputNV {\n    VkStructureType                         sType;\n    void*                                   pNext;\n    VkClusterAccelerationStructureTypeNV    type;\n    VkBool32                                noMoveOverlap;\n    VkDeviceSize                            maxMovedBytes;\n} VkClusterAccelerationStructureMoveObjectsInputNV;\n\ntypedef union VkClusterAccelerationStructureOpInputNV {\n    VkClusterAccelerationStructureClustersBottomLevelInputNV*    pClustersBottomLevel;\n    VkClusterAccelerationStructureTriangleClusterInputNV*        pTriangleClusters;\n    VkClusterAccelerationStructureMoveObjectsInputNV*            pMoveObjects;\n} VkClusterAccelerationStructureOpInputNV;\n\ntypedef struct VkClusterAccelerationStructureInputInfoNV {\n    VkStructureType                            sType;\n    void*                                      pNext;\n    uint32_t                                   maxAccelerationStructureCount;\n    VkBuildAccelerationStructureFlagsKHR       flags;\n    VkClusterAccelerationStructureOpTypeNV     opType;\n    VkClusterAccelerationStructureOpModeNV     opMode;\n    VkClusterAccelerationStructureOpInputNV    opInput;\n} VkClusterAccelerationStructureInputInfoNV;\n\ntypedef struct VkStridedDeviceAddressRegionKHR {\n    VkDeviceAddress    deviceAddress;\n    VkDeviceSize       stride;\n    VkDeviceSize       size;\n} VkStridedDeviceAddressRegionKHR;\n\ntypedef struct VkClusterAccelerationStructureCommandsInfoNV {\n    VkStructureType                                           sType;\n    void*                                                     pNext;\n    VkClusterAccelerationStructureInputInfoNV                 input;\n    VkDeviceAddress                                           dstImplicitData;\n    VkDeviceAddress                                           scratchData;\n    VkStridedDeviceAddressRegionKHR                           dstAddressesArray;\n    VkStridedDeviceAddressRegionKHR                           dstSizesArray;\n    VkStridedDeviceAddressRegionKHR                           srcInfosArray;\n    VkDeviceAddress                                           srcInfosCount;\n    VkClusterAccelerationStructureAddressResolutionFlagsNV    addressResolutionFlags;\n} VkClusterAccelerationStructureCommandsInfoNV;\n\ntypedef struct VkStridedDeviceAddressNV {\n    VkDeviceAddress    startAddress;\n    VkDeviceSize       strideInBytes;\n} VkStridedDeviceAddressNV;\n\ntypedef struct VkClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV {\n    uint32_t    geometryIndex:24;\n    uint32_t    reserved:5;\n    uint32_t    geometryFlags:3;\n} VkClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV;\n\ntypedef struct VkClusterAccelerationStructureMoveObjectsInfoNV {\n    VkDeviceAddress    srcAccelerationStructure;\n} VkClusterAccelerationStructureMoveObjectsInfoNV;\n\ntypedef struct VkClusterAccelerationStructureBuildClustersBottomLevelInfoNV {\n    uint32_t           clusterReferencesCount;\n    uint32_t           clusterReferencesStride;\n    VkDeviceAddress    clusterReferences;\n} VkClusterAccelerationStructureBuildClustersBottomLevelInfoNV;\n\ntypedef struct VkClusterAccelerationStructureBuildTriangleClusterInfoNV {\n    uint32_t                                                         clusterID;\n    VkClusterAccelerationStructureClusterFlagsNV                     clusterFlags;\n    uint32_t                                                         triangleCount:9;\n    uint32_t                                                         vertexCount:9;\n    uint32_t                                                         positionTruncateBitCount:6;\n    uint32_t                                                         indexType:4;\n    uint32_t                                                         opacityMicromapIndexType:4;\n    VkClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV    baseGeometryIndexAndGeometryFlags;\n    uint16_t                                                         indexBufferStride;\n    uint16_t                                                         vertexBufferStride;\n    uint16_t                                                         geometryIndexAndFlagsBufferStride;\n    uint16_t                                                         opacityMicromapIndexBufferStride;\n    VkDeviceAddress                                                  indexBuffer;\n    VkDeviceAddress                                                  vertexBuffer;\n    VkDeviceAddress                                                  geometryIndexAndFlagsBuffer;\n    VkDeviceAddress                                                  opacityMicromapArray;\n    VkDeviceAddress                                                  opacityMicromapIndexBuffer;\n} VkClusterAccelerationStructureBuildTriangleClusterInfoNV;\n\ntypedef struct VkClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV {\n    uint32_t                                                         clusterID;\n    VkClusterAccelerationStructureClusterFlagsNV                     clusterFlags;\n    uint32_t                                                         triangleCount:9;\n    uint32_t                                                         vertexCount:9;\n    uint32_t                                                         positionTruncateBitCount:6;\n    uint32_t                                                         indexType:4;\n    uint32_t                                                         opacityMicromapIndexType:4;\n    VkClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV    baseGeometryIndexAndGeometryFlags;\n    uint16_t                                                         indexBufferStride;\n    uint16_t                                                         vertexBufferStride;\n    uint16_t                                                         geometryIndexAndFlagsBufferStride;\n    uint16_t                                                         opacityMicromapIndexBufferStride;\n    VkDeviceAddress                                                  indexBuffer;\n    VkDeviceAddress                                                  vertexBuffer;\n    VkDeviceAddress                                                  geometryIndexAndFlagsBuffer;\n    VkDeviceAddress                                                  opacityMicromapArray;\n    VkDeviceAddress                                                  opacityMicromapIndexBuffer;\n    VkDeviceAddress                                                  instantiationBoundingBoxLimit;\n} VkClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV;\n\ntypedef struct VkClusterAccelerationStructureInstantiateClusterInfoNV {\n    uint32_t                    clusterIdOffset;\n    uint32_t                    geometryIndexOffset:24;\n    uint32_t                    reserved:8;\n    VkDeviceAddress             clusterTemplateAddress;\n    VkStridedDeviceAddressNV    vertexBuffer;\n} VkClusterAccelerationStructureInstantiateClusterInfoNV;\n\ntypedef struct VkAccelerationStructureBuildSizesInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkDeviceSize       accelerationStructureSize;\n    VkDeviceSize       updateScratchSize;\n    VkDeviceSize       buildScratchSize;\n} VkAccelerationStructureBuildSizesInfoKHR;\n\ntypedef struct VkRayTracingPipelineClusterAccelerationStructureCreateInfoNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           allowClusterAccelerationStructure;\n} VkRayTracingPipelineClusterAccelerationStructureCreateInfoNV;\n\ntypedef void (VKAPI_PTR *PFN_vkGetClusterAccelerationStructureBuildSizesNV)(VkDevice device, const VkClusterAccelerationStructureInputInfoNV* pInfo, VkAccelerationStructureBuildSizesInfoKHR* pSizeInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdBuildClusterAccelerationStructureIndirectNV)(VkCommandBuffer                     commandBuffer, const VkClusterAccelerationStructureCommandsInfoNV*  pCommandInfos);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkGetClusterAccelerationStructureBuildSizesNV(\n    VkDevice                                    device,\n    const VkClusterAccelerationStructureInputInfoNV* pInfo,\n    VkAccelerationStructureBuildSizesInfoKHR*   pSizeInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBuildClusterAccelerationStructureIndirectNV(\n    VkCommandBuffer                             commandBuffer,\n    const VkClusterAccelerationStructureCommandsInfoNV* pCommandInfos);\n#endif\n\n\n// VK_NV_partitioned_acceleration_structure is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_partitioned_acceleration_structure 1\n#define VK_NV_PARTITIONED_ACCELERATION_STRUCTURE_SPEC_VERSION 1\n#define VK_NV_PARTITIONED_ACCELERATION_STRUCTURE_EXTENSION_NAME \"VK_NV_partitioned_acceleration_structure\"\n#define VK_PARTITIONED_ACCELERATION_STRUCTURE_PARTITION_INDEX_GLOBAL_NV (~0U)\n\ntypedef enum VkPartitionedAccelerationStructureOpTypeNV {\n    VK_PARTITIONED_ACCELERATION_STRUCTURE_OP_TYPE_WRITE_INSTANCE_NV = 0,\n    VK_PARTITIONED_ACCELERATION_STRUCTURE_OP_TYPE_UPDATE_INSTANCE_NV = 1,\n    VK_PARTITIONED_ACCELERATION_STRUCTURE_OP_TYPE_WRITE_PARTITION_TRANSLATION_NV = 2,\n    VK_PARTITIONED_ACCELERATION_STRUCTURE_OP_TYPE_MAX_ENUM_NV = 0x7FFFFFFF\n} VkPartitionedAccelerationStructureOpTypeNV;\n\ntypedef enum VkPartitionedAccelerationStructureInstanceFlagBitsNV {\n    VK_PARTITIONED_ACCELERATION_STRUCTURE_INSTANCE_FLAG_TRIANGLE_FACING_CULL_DISABLE_BIT_NV = 0x00000001,\n    VK_PARTITIONED_ACCELERATION_STRUCTURE_INSTANCE_FLAG_TRIANGLE_FLIP_FACING_BIT_NV = 0x00000002,\n    VK_PARTITIONED_ACCELERATION_STRUCTURE_INSTANCE_FLAG_FORCE_OPAQUE_BIT_NV = 0x00000004,\n    VK_PARTITIONED_ACCELERATION_STRUCTURE_INSTANCE_FLAG_FORCE_NO_OPAQUE_BIT_NV = 0x00000008,\n    VK_PARTITIONED_ACCELERATION_STRUCTURE_INSTANCE_FLAG_ENABLE_EXPLICIT_BOUNDING_BOX_NV = 0x00000010,\n    VK_PARTITIONED_ACCELERATION_STRUCTURE_INSTANCE_FLAG_BITS_MAX_ENUM_NV = 0x7FFFFFFF\n} VkPartitionedAccelerationStructureInstanceFlagBitsNV;\ntypedef VkFlags VkPartitionedAccelerationStructureInstanceFlagsNV;\ntypedef struct VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           partitionedAccelerationStructure;\n} VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV;\n\ntypedef struct VkPhysicalDevicePartitionedAccelerationStructurePropertiesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxPartitionCount;\n} VkPhysicalDevicePartitionedAccelerationStructurePropertiesNV;\n\ntypedef struct VkPartitionedAccelerationStructureFlagsNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           enablePartitionTranslation;\n} VkPartitionedAccelerationStructureFlagsNV;\n\ntypedef struct VkBuildPartitionedAccelerationStructureIndirectCommandNV {\n    VkPartitionedAccelerationStructureOpTypeNV    opType;\n    uint32_t                                      argCount;\n    VkStridedDeviceAddressNV                      argData;\n} VkBuildPartitionedAccelerationStructureIndirectCommandNV;\n\ntypedef struct VkPartitionedAccelerationStructureWriteInstanceDataNV {\n    VkTransformMatrixKHR                                 transform;\n    float                                                explicitAABB[6];\n    uint32_t                                             instanceID;\n    uint32_t                                             instanceMask;\n    uint32_t                                             instanceContributionToHitGroupIndex;\n    VkPartitionedAccelerationStructureInstanceFlagsNV    instanceFlags;\n    uint32_t                                             instanceIndex;\n    uint32_t                                             partitionIndex;\n    VkDeviceAddress                                      accelerationStructure;\n} VkPartitionedAccelerationStructureWriteInstanceDataNV;\n\ntypedef struct VkPartitionedAccelerationStructureUpdateInstanceDataNV {\n    uint32_t           instanceIndex;\n    uint32_t           instanceContributionToHitGroupIndex;\n    VkDeviceAddress    accelerationStructure;\n} VkPartitionedAccelerationStructureUpdateInstanceDataNV;\n\ntypedef struct VkPartitionedAccelerationStructureWritePartitionTranslationDataNV {\n    uint32_t    partitionIndex;\n    float       partitionTranslation[3];\n} VkPartitionedAccelerationStructureWritePartitionTranslationDataNV;\n\ntypedef struct VkWriteDescriptorSetPartitionedAccelerationStructureNV {\n    VkStructureType           sType;\n    void*                     pNext;\n    uint32_t                  accelerationStructureCount;\n    const VkDeviceAddress*    pAccelerationStructures;\n} VkWriteDescriptorSetPartitionedAccelerationStructureNV;\n\ntypedef struct VkPartitionedAccelerationStructureInstancesInputNV {\n    VkStructureType                         sType;\n    void*                                   pNext;\n    VkBuildAccelerationStructureFlagsKHR    flags;\n    uint32_t                                instanceCount;\n    uint32_t                                maxInstancePerPartitionCount;\n    uint32_t                                partitionCount;\n    uint32_t                                maxInstanceInGlobalPartitionCount;\n} VkPartitionedAccelerationStructureInstancesInputNV;\n\ntypedef struct VkBuildPartitionedAccelerationStructureInfoNV {\n    VkStructureType                                       sType;\n    void*                                                 pNext;\n    VkPartitionedAccelerationStructureInstancesInputNV    input;\n    VkDeviceAddress                                       srcAccelerationStructureData;\n    VkDeviceAddress                                       dstAccelerationStructureData;\n    VkDeviceAddress                                       scratchData;\n    VkDeviceAddress                                       srcInfos;\n    VkDeviceAddress                                       srcInfosCount;\n} VkBuildPartitionedAccelerationStructureInfoNV;\n\ntypedef void (VKAPI_PTR *PFN_vkGetPartitionedAccelerationStructuresBuildSizesNV)(VkDevice device, const VkPartitionedAccelerationStructureInstancesInputNV* pInfo, VkAccelerationStructureBuildSizesInfoKHR*                  pSizeInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdBuildPartitionedAccelerationStructuresNV)(VkCommandBuffer                     commandBuffer, const VkBuildPartitionedAccelerationStructureInfoNV*  pBuildInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkGetPartitionedAccelerationStructuresBuildSizesNV(\n    VkDevice                                    device,\n    const VkPartitionedAccelerationStructureInstancesInputNV* pInfo,\n    VkAccelerationStructureBuildSizesInfoKHR*   pSizeInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBuildPartitionedAccelerationStructuresNV(\n    VkCommandBuffer                             commandBuffer,\n    const VkBuildPartitionedAccelerationStructureInfoNV* pBuildInfo);\n#endif\n\n\n// VK_EXT_device_generated_commands is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_device_generated_commands 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkIndirectExecutionSetEXT)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkIndirectCommandsLayoutEXT)\n#define VK_EXT_DEVICE_GENERATED_COMMANDS_SPEC_VERSION 1\n#define VK_EXT_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME \"VK_EXT_device_generated_commands\"\n\ntypedef enum VkIndirectExecutionSetInfoTypeEXT {\n    VK_INDIRECT_EXECUTION_SET_INFO_TYPE_PIPELINES_EXT = 0,\n    VK_INDIRECT_EXECUTION_SET_INFO_TYPE_SHADER_OBJECTS_EXT = 1,\n    VK_INDIRECT_EXECUTION_SET_INFO_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkIndirectExecutionSetInfoTypeEXT;\n\ntypedef enum VkIndirectCommandsTokenTypeEXT {\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXT = 0,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_EXT = 1,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_SEQUENCE_INDEX_EXT = 2,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_EXT = 3,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_EXT = 4,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_EXT = 5,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_EXT = 6,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_COUNT_EXT = 7,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_COUNT_EXT = 8,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_EXT = 9,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NV_EXT = 1000202002,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_COUNT_NV_EXT = 1000202003,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_EXT = 1000328000,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_COUNT_EXT = 1000328001,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_TRACE_RAYS2_EXT = 1000386004,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkIndirectCommandsTokenTypeEXT;\n\ntypedef enum VkIndirectCommandsInputModeFlagBitsEXT {\n    VK_INDIRECT_COMMANDS_INPUT_MODE_VULKAN_INDEX_BUFFER_EXT = 0x00000001,\n    VK_INDIRECT_COMMANDS_INPUT_MODE_DXGI_INDEX_BUFFER_EXT = 0x00000002,\n    VK_INDIRECT_COMMANDS_INPUT_MODE_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkIndirectCommandsInputModeFlagBitsEXT;\ntypedef VkFlags VkIndirectCommandsInputModeFlagsEXT;\n\ntypedef enum VkIndirectCommandsLayoutUsageFlagBitsEXT {\n    VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_EXT = 0x00000001,\n    VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_EXT = 0x00000002,\n    VK_INDIRECT_COMMANDS_LAYOUT_USAGE_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkIndirectCommandsLayoutUsageFlagBitsEXT;\ntypedef VkFlags VkIndirectCommandsLayoutUsageFlagsEXT;\ntypedef struct VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           deviceGeneratedCommands;\n    VkBool32           dynamicGeneratedPipelineLayout;\n} VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT;\n\ntypedef struct VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT {\n    VkStructureType                        sType;\n    void*                                  pNext;\n    uint32_t                               maxIndirectPipelineCount;\n    uint32_t                               maxIndirectShaderObjectCount;\n    uint32_t                               maxIndirectSequenceCount;\n    uint32_t                               maxIndirectCommandsTokenCount;\n    uint32_t                               maxIndirectCommandsTokenOffset;\n    uint32_t                               maxIndirectCommandsIndirectStride;\n    VkIndirectCommandsInputModeFlagsEXT    supportedIndirectCommandsInputModes;\n    VkShaderStageFlags                     supportedIndirectCommandsShaderStages;\n    VkShaderStageFlags                     supportedIndirectCommandsShaderStagesPipelineBinding;\n    VkShaderStageFlags                     supportedIndirectCommandsShaderStagesShaderBinding;\n    VkBool32                               deviceGeneratedCommandsTransformFeedback;\n    VkBool32                               deviceGeneratedCommandsMultiDrawIndirectCount;\n} VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT;\n\ntypedef struct VkGeneratedCommandsMemoryRequirementsInfoEXT {\n    VkStructureType                sType;\n    const void*                    pNext;\n    VkIndirectExecutionSetEXT      indirectExecutionSet;\n    VkIndirectCommandsLayoutEXT    indirectCommandsLayout;\n    uint32_t                       maxSequenceCount;\n    uint32_t                       maxDrawCount;\n} VkGeneratedCommandsMemoryRequirementsInfoEXT;\n\ntypedef struct VkIndirectExecutionSetPipelineInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkPipeline         initialPipeline;\n    uint32_t           maxPipelineCount;\n} VkIndirectExecutionSetPipelineInfoEXT;\n\ntypedef struct VkIndirectExecutionSetShaderLayoutInfoEXT {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    uint32_t                        setLayoutCount;\n    const VkDescriptorSetLayout*    pSetLayouts;\n} VkIndirectExecutionSetShaderLayoutInfoEXT;\n\ntypedef struct VkIndirectExecutionSetShaderInfoEXT {\n    VkStructureType                                     sType;\n    const void*                                         pNext;\n    uint32_t                                            shaderCount;\n    const VkShaderEXT*                                  pInitialShaders;\n    const VkIndirectExecutionSetShaderLayoutInfoEXT*    pSetLayoutInfos;\n    uint32_t                                            maxShaderCount;\n    uint32_t                                            pushConstantRangeCount;\n    const VkPushConstantRange*                          pPushConstantRanges;\n} VkIndirectExecutionSetShaderInfoEXT;\n\ntypedef union VkIndirectExecutionSetInfoEXT {\n    const VkIndirectExecutionSetPipelineInfoEXT*    pPipelineInfo;\n    const VkIndirectExecutionSetShaderInfoEXT*      pShaderInfo;\n} VkIndirectExecutionSetInfoEXT;\n\ntypedef struct VkIndirectExecutionSetCreateInfoEXT {\n    VkStructureType                      sType;\n    const void*                          pNext;\n    VkIndirectExecutionSetInfoTypeEXT    type;\n    VkIndirectExecutionSetInfoEXT        info;\n} VkIndirectExecutionSetCreateInfoEXT;\n\ntypedef struct VkGeneratedCommandsInfoEXT {\n    VkStructureType                sType;\n    const void*                    pNext;\n    VkShaderStageFlags             shaderStages;\n    VkIndirectExecutionSetEXT      indirectExecutionSet;\n    VkIndirectCommandsLayoutEXT    indirectCommandsLayout;\n    VkDeviceAddress                indirectAddress;\n    VkDeviceSize                   indirectAddressSize;\n    VkDeviceAddress                preprocessAddress;\n    VkDeviceSize                   preprocessSize;\n    uint32_t                       maxSequenceCount;\n    VkDeviceAddress                sequenceCountAddress;\n    uint32_t                       maxDrawCount;\n} VkGeneratedCommandsInfoEXT;\n\ntypedef struct VkWriteIndirectExecutionSetPipelineEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           index;\n    VkPipeline         pipeline;\n} VkWriteIndirectExecutionSetPipelineEXT;\n\ntypedef struct VkIndirectCommandsPushConstantTokenEXT {\n    VkPushConstantRange    updateRange;\n} VkIndirectCommandsPushConstantTokenEXT;\n\ntypedef struct VkIndirectCommandsVertexBufferTokenEXT {\n    uint32_t    vertexBindingUnit;\n} VkIndirectCommandsVertexBufferTokenEXT;\n\ntypedef struct VkIndirectCommandsIndexBufferTokenEXT {\n    VkIndirectCommandsInputModeFlagBitsEXT    mode;\n} VkIndirectCommandsIndexBufferTokenEXT;\n\ntypedef struct VkIndirectCommandsExecutionSetTokenEXT {\n    VkIndirectExecutionSetInfoTypeEXT    type;\n    VkShaderStageFlags                   shaderStages;\n} VkIndirectCommandsExecutionSetTokenEXT;\n\ntypedef union VkIndirectCommandsTokenDataEXT {\n    const VkIndirectCommandsPushConstantTokenEXT*    pPushConstant;\n    const VkIndirectCommandsVertexBufferTokenEXT*    pVertexBuffer;\n    const VkIndirectCommandsIndexBufferTokenEXT*     pIndexBuffer;\n    const VkIndirectCommandsExecutionSetTokenEXT*    pExecutionSet;\n} VkIndirectCommandsTokenDataEXT;\n\ntypedef struct VkIndirectCommandsLayoutTokenEXT {\n    VkStructureType                   sType;\n    const void*                       pNext;\n    VkIndirectCommandsTokenTypeEXT    type;\n    VkIndirectCommandsTokenDataEXT    data;\n    uint32_t                          offset;\n} VkIndirectCommandsLayoutTokenEXT;\n\ntypedef struct VkIndirectCommandsLayoutCreateInfoEXT {\n    VkStructureType                            sType;\n    const void*                                pNext;\n    VkIndirectCommandsLayoutUsageFlagsEXT      flags;\n    VkShaderStageFlags                         shaderStages;\n    uint32_t                                   indirectStride;\n    VkPipelineLayout                           pipelineLayout;\n    uint32_t                                   tokenCount;\n    const VkIndirectCommandsLayoutTokenEXT*    pTokens;\n} VkIndirectCommandsLayoutCreateInfoEXT;\n\ntypedef struct VkDrawIndirectCountIndirectCommandEXT {\n    VkDeviceAddress    bufferAddress;\n    uint32_t           stride;\n    uint32_t           commandCount;\n} VkDrawIndirectCountIndirectCommandEXT;\n\ntypedef struct VkBindVertexBufferIndirectCommandEXT {\n    VkDeviceAddress    bufferAddress;\n    uint32_t           size;\n    uint32_t           stride;\n} VkBindVertexBufferIndirectCommandEXT;\n\ntypedef struct VkBindIndexBufferIndirectCommandEXT {\n    VkDeviceAddress    bufferAddress;\n    uint32_t           size;\n    VkIndexType        indexType;\n} VkBindIndexBufferIndirectCommandEXT;\n\ntypedef struct VkGeneratedCommandsPipelineInfoEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkPipeline         pipeline;\n} VkGeneratedCommandsPipelineInfoEXT;\n\ntypedef struct VkGeneratedCommandsShaderInfoEXT {\n    VkStructureType       sType;\n    void*                 pNext;\n    uint32_t              shaderCount;\n    const VkShaderEXT*    pShaders;\n} VkGeneratedCommandsShaderInfoEXT;\n\ntypedef struct VkWriteIndirectExecutionSetShaderEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           index;\n    VkShaderEXT        shader;\n} VkWriteIndirectExecutionSetShaderEXT;\n\ntypedef void (VKAPI_PTR *PFN_vkGetGeneratedCommandsMemoryRequirementsEXT)(VkDevice device, const VkGeneratedCommandsMemoryRequirementsInfoEXT* pInfo, VkMemoryRequirements2* pMemoryRequirements);\ntypedef void (VKAPI_PTR *PFN_vkCmdPreprocessGeneratedCommandsEXT)(VkCommandBuffer commandBuffer, const VkGeneratedCommandsInfoEXT* pGeneratedCommandsInfo, VkCommandBuffer stateCommandBuffer);\ntypedef void (VKAPI_PTR *PFN_vkCmdExecuteGeneratedCommandsEXT)(VkCommandBuffer commandBuffer, VkBool32 isPreprocessed, const VkGeneratedCommandsInfoEXT* pGeneratedCommandsInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateIndirectCommandsLayoutEXT)(VkDevice device, const VkIndirectCommandsLayoutCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkIndirectCommandsLayoutEXT* pIndirectCommandsLayout);\ntypedef void (VKAPI_PTR *PFN_vkDestroyIndirectCommandsLayoutEXT)(VkDevice device, VkIndirectCommandsLayoutEXT indirectCommandsLayout, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateIndirectExecutionSetEXT)(VkDevice device, const VkIndirectExecutionSetCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkIndirectExecutionSetEXT* pIndirectExecutionSet);\ntypedef void (VKAPI_PTR *PFN_vkDestroyIndirectExecutionSetEXT)(VkDevice device, VkIndirectExecutionSetEXT indirectExecutionSet, const VkAllocationCallbacks* pAllocator);\ntypedef void (VKAPI_PTR *PFN_vkUpdateIndirectExecutionSetPipelineEXT)(VkDevice device, VkIndirectExecutionSetEXT indirectExecutionSet, uint32_t executionSetWriteCount, const VkWriteIndirectExecutionSetPipelineEXT* pExecutionSetWrites);\ntypedef void (VKAPI_PTR *PFN_vkUpdateIndirectExecutionSetShaderEXT)(VkDevice device, VkIndirectExecutionSetEXT indirectExecutionSet, uint32_t executionSetWriteCount, const VkWriteIndirectExecutionSetShaderEXT* pExecutionSetWrites);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkGetGeneratedCommandsMemoryRequirementsEXT(\n    VkDevice                                    device,\n    const VkGeneratedCommandsMemoryRequirementsInfoEXT* pInfo,\n    VkMemoryRequirements2*                      pMemoryRequirements);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdPreprocessGeneratedCommandsEXT(\n    VkCommandBuffer                             commandBuffer,\n    const VkGeneratedCommandsInfoEXT*           pGeneratedCommandsInfo,\n    VkCommandBuffer                             stateCommandBuffer);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdExecuteGeneratedCommandsEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkBool32                                    isPreprocessed,\n    const VkGeneratedCommandsInfoEXT*           pGeneratedCommandsInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateIndirectCommandsLayoutEXT(\n    VkDevice                                    device,\n    const VkIndirectCommandsLayoutCreateInfoEXT* pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkIndirectCommandsLayoutEXT*                pIndirectCommandsLayout);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyIndirectCommandsLayoutEXT(\n    VkDevice                                    device,\n    VkIndirectCommandsLayoutEXT                 indirectCommandsLayout,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateIndirectExecutionSetEXT(\n    VkDevice                                    device,\n    const VkIndirectExecutionSetCreateInfoEXT*  pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkIndirectExecutionSetEXT*                  pIndirectExecutionSet);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyIndirectExecutionSetEXT(\n    VkDevice                                    device,\n    VkIndirectExecutionSetEXT                   indirectExecutionSet,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR void VKAPI_CALL vkUpdateIndirectExecutionSetPipelineEXT(\n    VkDevice                                    device,\n    VkIndirectExecutionSetEXT                   indirectExecutionSet,\n    uint32_t                                    executionSetWriteCount,\n    const VkWriteIndirectExecutionSetPipelineEXT* pExecutionSetWrites);\n\nVKAPI_ATTR void VKAPI_CALL vkUpdateIndirectExecutionSetShaderEXT(\n    VkDevice                                    device,\n    VkIndirectExecutionSetEXT                   indirectExecutionSet,\n    uint32_t                                    executionSetWriteCount,\n    const VkWriteIndirectExecutionSetShaderEXT* pExecutionSetWrites);\n#endif\n\n\n// VK_MESA_image_alignment_control is a preprocessor guard. Do not pass it to API calls.\n#define VK_MESA_image_alignment_control 1\n#define VK_MESA_IMAGE_ALIGNMENT_CONTROL_SPEC_VERSION 1\n#define VK_MESA_IMAGE_ALIGNMENT_CONTROL_EXTENSION_NAME \"VK_MESA_image_alignment_control\"\ntypedef struct VkPhysicalDeviceImageAlignmentControlFeaturesMESA {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           imageAlignmentControl;\n} VkPhysicalDeviceImageAlignmentControlFeaturesMESA;\n\ntypedef struct VkPhysicalDeviceImageAlignmentControlPropertiesMESA {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           supportedImageAlignmentMask;\n} VkPhysicalDeviceImageAlignmentControlPropertiesMESA;\n\ntypedef struct VkImageAlignmentControlCreateInfoMESA {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           maximumRequestedAlignment;\n} VkImageAlignmentControlCreateInfoMESA;\n\n\n\n// VK_EXT_depth_clamp_control is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_depth_clamp_control 1\n#define VK_EXT_DEPTH_CLAMP_CONTROL_SPEC_VERSION 1\n#define VK_EXT_DEPTH_CLAMP_CONTROL_EXTENSION_NAME \"VK_EXT_depth_clamp_control\"\ntypedef struct VkPhysicalDeviceDepthClampControlFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           depthClampControl;\n} VkPhysicalDeviceDepthClampControlFeaturesEXT;\n\ntypedef struct VkPipelineViewportDepthClampControlCreateInfoEXT {\n    VkStructureType                sType;\n    const void*                    pNext;\n    VkDepthClampModeEXT            depthClampMode;\n    const VkDepthClampRangeEXT*    pDepthClampRange;\n} VkPipelineViewportDepthClampControlCreateInfoEXT;\n\n\n\n// VK_HUAWEI_hdr_vivid is a preprocessor guard. Do not pass it to API calls.\n#define VK_HUAWEI_hdr_vivid 1\n#define VK_HUAWEI_HDR_VIVID_SPEC_VERSION  1\n#define VK_HUAWEI_HDR_VIVID_EXTENSION_NAME \"VK_HUAWEI_hdr_vivid\"\ntypedef struct VkPhysicalDeviceHdrVividFeaturesHUAWEI {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           hdrVivid;\n} VkPhysicalDeviceHdrVividFeaturesHUAWEI;\n\ntypedef struct VkHdrVividDynamicMetadataHUAWEI {\n    VkStructureType    sType;\n    const void*        pNext;\n    size_t             dynamicMetadataSize;\n    const void*        pDynamicMetadata;\n} VkHdrVividDynamicMetadataHUAWEI;\n\n\n\n// VK_NV_cooperative_matrix2 is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_cooperative_matrix2 1\n#define VK_NV_COOPERATIVE_MATRIX_2_SPEC_VERSION 1\n#define VK_NV_COOPERATIVE_MATRIX_2_EXTENSION_NAME \"VK_NV_cooperative_matrix2\"\ntypedef struct VkCooperativeMatrixFlexibleDimensionsPropertiesNV {\n    VkStructureType       sType;\n    void*                 pNext;\n    uint32_t              MGranularity;\n    uint32_t              NGranularity;\n    uint32_t              KGranularity;\n    VkComponentTypeKHR    AType;\n    VkComponentTypeKHR    BType;\n    VkComponentTypeKHR    CType;\n    VkComponentTypeKHR    ResultType;\n    VkBool32              saturatingAccumulation;\n    VkScopeKHR            scope;\n    uint32_t              workgroupInvocations;\n} VkCooperativeMatrixFlexibleDimensionsPropertiesNV;\n\ntypedef struct VkPhysicalDeviceCooperativeMatrix2FeaturesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           cooperativeMatrixWorkgroupScope;\n    VkBool32           cooperativeMatrixFlexibleDimensions;\n    VkBool32           cooperativeMatrixReductions;\n    VkBool32           cooperativeMatrixConversions;\n    VkBool32           cooperativeMatrixPerElementOperations;\n    VkBool32           cooperativeMatrixTensorAddressing;\n    VkBool32           cooperativeMatrixBlockLoads;\n} VkPhysicalDeviceCooperativeMatrix2FeaturesNV;\n\ntypedef struct VkPhysicalDeviceCooperativeMatrix2PropertiesNV {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           cooperativeMatrixWorkgroupScopeMaxWorkgroupSize;\n    uint32_t           cooperativeMatrixFlexibleDimensionsMaxDimension;\n    uint32_t           cooperativeMatrixWorkgroupScopeReservedSharedMemory;\n} VkPhysicalDeviceCooperativeMatrix2PropertiesNV;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV)(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkCooperativeMatrixFlexibleDimensionsPropertiesNV* pProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t*                                   pPropertyCount,\n    VkCooperativeMatrixFlexibleDimensionsPropertiesNV* pProperties);\n#endif\n\n\n// VK_ARM_pipeline_opacity_micromap is a preprocessor guard. Do not pass it to API calls.\n#define VK_ARM_pipeline_opacity_micromap 1\n#define VK_ARM_PIPELINE_OPACITY_MICROMAP_SPEC_VERSION 1\n#define VK_ARM_PIPELINE_OPACITY_MICROMAP_EXTENSION_NAME \"VK_ARM_pipeline_opacity_micromap\"\ntypedef struct VkPhysicalDevicePipelineOpacityMicromapFeaturesARM {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           pipelineOpacityMicromap;\n} VkPhysicalDevicePipelineOpacityMicromapFeaturesARM;\n\n\n\n// VK_EXT_vertex_attribute_robustness is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_vertex_attribute_robustness 1\n#define VK_EXT_VERTEX_ATTRIBUTE_ROBUSTNESS_SPEC_VERSION 1\n#define VK_EXT_VERTEX_ATTRIBUTE_ROBUSTNESS_EXTENSION_NAME \"VK_EXT_vertex_attribute_robustness\"\ntypedef struct VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           vertexAttributeRobustness;\n} VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT;\n\n\n\n// VK_KHR_acceleration_structure is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_acceleration_structure 1\n#define VK_KHR_ACCELERATION_STRUCTURE_SPEC_VERSION 13\n#define VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME \"VK_KHR_acceleration_structure\"\n\ntypedef enum VkBuildAccelerationStructureModeKHR {\n    VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR = 0,\n    VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR = 1,\n    VK_BUILD_ACCELERATION_STRUCTURE_MODE_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkBuildAccelerationStructureModeKHR;\n\ntypedef enum VkAccelerationStructureCreateFlagBitsKHR {\n    VK_ACCELERATION_STRUCTURE_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR = 0x00000001,\n    VK_ACCELERATION_STRUCTURE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = 0x00000008,\n    VK_ACCELERATION_STRUCTURE_CREATE_MOTION_BIT_NV = 0x00000004,\n    VK_ACCELERATION_STRUCTURE_CREATE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkAccelerationStructureCreateFlagBitsKHR;\ntypedef VkFlags VkAccelerationStructureCreateFlagsKHR;\ntypedef struct VkAccelerationStructureBuildRangeInfoKHR {\n    uint32_t    primitiveCount;\n    uint32_t    primitiveOffset;\n    uint32_t    firstVertex;\n    uint32_t    transformOffset;\n} VkAccelerationStructureBuildRangeInfoKHR;\n\ntypedef struct VkAccelerationStructureGeometryTrianglesDataKHR {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkFormat                         vertexFormat;\n    VkDeviceOrHostAddressConstKHR    vertexData;\n    VkDeviceSize                     vertexStride;\n    uint32_t                         maxVertex;\n    VkIndexType                      indexType;\n    VkDeviceOrHostAddressConstKHR    indexData;\n    VkDeviceOrHostAddressConstKHR    transformData;\n} VkAccelerationStructureGeometryTrianglesDataKHR;\n\ntypedef struct VkAccelerationStructureGeometryAabbsDataKHR {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkDeviceOrHostAddressConstKHR    data;\n    VkDeviceSize                     stride;\n} VkAccelerationStructureGeometryAabbsDataKHR;\n\ntypedef struct VkAccelerationStructureGeometryInstancesDataKHR {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkBool32                         arrayOfPointers;\n    VkDeviceOrHostAddressConstKHR    data;\n} VkAccelerationStructureGeometryInstancesDataKHR;\n\ntypedef union VkAccelerationStructureGeometryDataKHR {\n    VkAccelerationStructureGeometryTrianglesDataKHR    triangles;\n    VkAccelerationStructureGeometryAabbsDataKHR        aabbs;\n    VkAccelerationStructureGeometryInstancesDataKHR    instances;\n} VkAccelerationStructureGeometryDataKHR;\n\ntypedef struct VkAccelerationStructureGeometryKHR {\n    VkStructureType                           sType;\n    const void*                               pNext;\n    VkGeometryTypeKHR                         geometryType;\n    VkAccelerationStructureGeometryDataKHR    geometry;\n    VkGeometryFlagsKHR                        flags;\n} VkAccelerationStructureGeometryKHR;\n\ntypedef struct VkAccelerationStructureBuildGeometryInfoKHR {\n    VkStructureType                                     sType;\n    const void*                                         pNext;\n    VkAccelerationStructureTypeKHR                      type;\n    VkBuildAccelerationStructureFlagsKHR                flags;\n    VkBuildAccelerationStructureModeKHR                 mode;\n    VkAccelerationStructureKHR                          srcAccelerationStructure;\n    VkAccelerationStructureKHR                          dstAccelerationStructure;\n    uint32_t                                            geometryCount;\n    const VkAccelerationStructureGeometryKHR*           pGeometries;\n    const VkAccelerationStructureGeometryKHR* const*    ppGeometries;\n    VkDeviceOrHostAddressKHR                            scratchData;\n} VkAccelerationStructureBuildGeometryInfoKHR;\n\ntypedef struct VkAccelerationStructureCreateInfoKHR {\n    VkStructureType                          sType;\n    const void*                              pNext;\n    VkAccelerationStructureCreateFlagsKHR    createFlags;\n    VkBuffer                                 buffer;\n    VkDeviceSize                             offset;\n    VkDeviceSize                             size;\n    VkAccelerationStructureTypeKHR           type;\n    VkDeviceAddress                          deviceAddress;\n} VkAccelerationStructureCreateInfoKHR;\n\ntypedef struct VkWriteDescriptorSetAccelerationStructureKHR {\n    VkStructureType                      sType;\n    const void*                          pNext;\n    uint32_t                             accelerationStructureCount;\n    const VkAccelerationStructureKHR*    pAccelerationStructures;\n} VkWriteDescriptorSetAccelerationStructureKHR;\n\ntypedef struct VkPhysicalDeviceAccelerationStructureFeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           accelerationStructure;\n    VkBool32           accelerationStructureCaptureReplay;\n    VkBool32           accelerationStructureIndirectBuild;\n    VkBool32           accelerationStructureHostCommands;\n    VkBool32           descriptorBindingAccelerationStructureUpdateAfterBind;\n} VkPhysicalDeviceAccelerationStructureFeaturesKHR;\n\ntypedef struct VkPhysicalDeviceAccelerationStructurePropertiesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    uint64_t           maxGeometryCount;\n    uint64_t           maxInstanceCount;\n    uint64_t           maxPrimitiveCount;\n    uint32_t           maxPerStageDescriptorAccelerationStructures;\n    uint32_t           maxPerStageDescriptorUpdateAfterBindAccelerationStructures;\n    uint32_t           maxDescriptorSetAccelerationStructures;\n    uint32_t           maxDescriptorSetUpdateAfterBindAccelerationStructures;\n    uint32_t           minAccelerationStructureScratchOffsetAlignment;\n} VkPhysicalDeviceAccelerationStructurePropertiesKHR;\n\ntypedef struct VkAccelerationStructureDeviceAddressInfoKHR {\n    VkStructureType               sType;\n    const void*                   pNext;\n    VkAccelerationStructureKHR    accelerationStructure;\n} VkAccelerationStructureDeviceAddressInfoKHR;\n\ntypedef struct VkAccelerationStructureVersionInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    const uint8_t*     pVersionData;\n} VkAccelerationStructureVersionInfoKHR;\n\ntypedef struct VkCopyAccelerationStructureToMemoryInfoKHR {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkAccelerationStructureKHR            src;\n    VkDeviceOrHostAddressKHR              dst;\n    VkCopyAccelerationStructureModeKHR    mode;\n} VkCopyAccelerationStructureToMemoryInfoKHR;\n\ntypedef struct VkCopyMemoryToAccelerationStructureInfoKHR {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkDeviceOrHostAddressConstKHR         src;\n    VkAccelerationStructureKHR            dst;\n    VkCopyAccelerationStructureModeKHR    mode;\n} VkCopyMemoryToAccelerationStructureInfoKHR;\n\ntypedef struct VkCopyAccelerationStructureInfoKHR {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkAccelerationStructureKHR            src;\n    VkAccelerationStructureKHR            dst;\n    VkCopyAccelerationStructureModeKHR    mode;\n} VkCopyAccelerationStructureInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateAccelerationStructureKHR)(VkDevice                                           device, const VkAccelerationStructureCreateInfoKHR*        pCreateInfo, const VkAllocationCallbacks*       pAllocator, VkAccelerationStructureKHR*                        pAccelerationStructure);\ntypedef void (VKAPI_PTR *PFN_vkDestroyAccelerationStructureKHR)(VkDevice device, VkAccelerationStructureKHR accelerationStructure, const VkAllocationCallbacks* pAllocator);\ntypedef void (VKAPI_PTR *PFN_vkCmdBuildAccelerationStructuresKHR)(VkCommandBuffer                                    commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR* pInfos, const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos);\ntypedef void (VKAPI_PTR *PFN_vkCmdBuildAccelerationStructuresIndirectKHR)(VkCommandBuffer                  commandBuffer, uint32_t                                           infoCount, const VkAccelerationStructureBuildGeometryInfoKHR* pInfos, const VkDeviceAddress*             pIndirectDeviceAddresses, const uint32_t*                    pIndirectStrides, const uint32_t* const*             ppMaxPrimitiveCounts);\ntypedef VkResult (VKAPI_PTR *PFN_vkBuildAccelerationStructuresKHR)(VkDevice                                           device, VkDeferredOperationKHR deferredOperation, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR* pInfos, const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos);\ntypedef VkResult (VKAPI_PTR *PFN_vkCopyAccelerationStructureKHR)(VkDevice device, VkDeferredOperationKHR deferredOperation, const VkCopyAccelerationStructureInfoKHR* pInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkCopyAccelerationStructureToMemoryKHR)(VkDevice device, VkDeferredOperationKHR deferredOperation, const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkCopyMemoryToAccelerationStructureKHR)(VkDevice device, VkDeferredOperationKHR deferredOperation, const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkWriteAccelerationStructuresPropertiesKHR)(VkDevice device, uint32_t accelerationStructureCount, const VkAccelerationStructureKHR* pAccelerationStructures, VkQueryType  queryType, size_t       dataSize, void* pData, size_t stride);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyAccelerationStructureKHR)(VkCommandBuffer commandBuffer, const VkCopyAccelerationStructureInfoKHR* pInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyAccelerationStructureToMemoryKHR)(VkCommandBuffer commandBuffer, const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyMemoryToAccelerationStructureKHR)(VkCommandBuffer commandBuffer, const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo);\ntypedef VkDeviceAddress (VKAPI_PTR *PFN_vkGetAccelerationStructureDeviceAddressKHR)(VkDevice device, const VkAccelerationStructureDeviceAddressInfoKHR* pInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdWriteAccelerationStructuresPropertiesKHR)(VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, const VkAccelerationStructureKHR* pAccelerationStructures, VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery);\ntypedef void (VKAPI_PTR *PFN_vkGetDeviceAccelerationStructureCompatibilityKHR)(VkDevice device, const VkAccelerationStructureVersionInfoKHR* pVersionInfo, VkAccelerationStructureCompatibilityKHR* pCompatibility);\ntypedef void (VKAPI_PTR *PFN_vkGetAccelerationStructureBuildSizesKHR)(VkDevice                                            device, VkAccelerationStructureBuildTypeKHR                 buildType, const VkAccelerationStructureBuildGeometryInfoKHR*  pBuildInfo, const uint32_t*  pMaxPrimitiveCounts, VkAccelerationStructureBuildSizesInfoKHR*           pSizeInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateAccelerationStructureKHR(\n    VkDevice                                    device,\n    const VkAccelerationStructureCreateInfoKHR* pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkAccelerationStructureKHR*                 pAccelerationStructure);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyAccelerationStructureKHR(\n    VkDevice                                    device,\n    VkAccelerationStructureKHR                  accelerationStructure,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBuildAccelerationStructuresKHR(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    infoCount,\n    const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,\n    const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBuildAccelerationStructuresIndirectKHR(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    infoCount,\n    const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,\n    const VkDeviceAddress*                      pIndirectDeviceAddresses,\n    const uint32_t*                             pIndirectStrides,\n    const uint32_t* const*                      ppMaxPrimitiveCounts);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkBuildAccelerationStructuresKHR(\n    VkDevice                                    device,\n    VkDeferredOperationKHR                      deferredOperation,\n    uint32_t                                    infoCount,\n    const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,\n    const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCopyAccelerationStructureKHR(\n    VkDevice                                    device,\n    VkDeferredOperationKHR                      deferredOperation,\n    const VkCopyAccelerationStructureInfoKHR*   pInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCopyAccelerationStructureToMemoryKHR(\n    VkDevice                                    device,\n    VkDeferredOperationKHR                      deferredOperation,\n    const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCopyMemoryToAccelerationStructureKHR(\n    VkDevice                                    device,\n    VkDeferredOperationKHR                      deferredOperation,\n    const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkWriteAccelerationStructuresPropertiesKHR(\n    VkDevice                                    device,\n    uint32_t                                    accelerationStructureCount,\n    const VkAccelerationStructureKHR*           pAccelerationStructures,\n    VkQueryType                                 queryType,\n    size_t                                      dataSize,\n    void*                                       pData,\n    size_t                                      stride);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyAccelerationStructureKHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkCopyAccelerationStructureInfoKHR*   pInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyAccelerationStructureToMemoryKHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyMemoryToAccelerationStructureKHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo);\n\nVKAPI_ATTR VkDeviceAddress VKAPI_CALL vkGetAccelerationStructureDeviceAddressKHR(\n    VkDevice                                    device,\n    const VkAccelerationStructureDeviceAddressInfoKHR* pInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdWriteAccelerationStructuresPropertiesKHR(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    accelerationStructureCount,\n    const VkAccelerationStructureKHR*           pAccelerationStructures,\n    VkQueryType                                 queryType,\n    VkQueryPool                                 queryPool,\n    uint32_t                                    firstQuery);\n\nVKAPI_ATTR void VKAPI_CALL vkGetDeviceAccelerationStructureCompatibilityKHR(\n    VkDevice                                    device,\n    const VkAccelerationStructureVersionInfoKHR* pVersionInfo,\n    VkAccelerationStructureCompatibilityKHR*    pCompatibility);\n\nVKAPI_ATTR void VKAPI_CALL vkGetAccelerationStructureBuildSizesKHR(\n    VkDevice                                    device,\n    VkAccelerationStructureBuildTypeKHR         buildType,\n    const VkAccelerationStructureBuildGeometryInfoKHR* pBuildInfo,\n    const uint32_t*                             pMaxPrimitiveCounts,\n    VkAccelerationStructureBuildSizesInfoKHR*   pSizeInfo);\n#endif\n\n\n// VK_KHR_ray_tracing_pipeline is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_ray_tracing_pipeline 1\n#define VK_KHR_RAY_TRACING_PIPELINE_SPEC_VERSION 1\n#define VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME \"VK_KHR_ray_tracing_pipeline\"\n\ntypedef enum VkShaderGroupShaderKHR {\n    VK_SHADER_GROUP_SHADER_GENERAL_KHR = 0,\n    VK_SHADER_GROUP_SHADER_CLOSEST_HIT_KHR = 1,\n    VK_SHADER_GROUP_SHADER_ANY_HIT_KHR = 2,\n    VK_SHADER_GROUP_SHADER_INTERSECTION_KHR = 3,\n    VK_SHADER_GROUP_SHADER_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkShaderGroupShaderKHR;\ntypedef struct VkRayTracingShaderGroupCreateInfoKHR {\n    VkStructureType                   sType;\n    const void*                       pNext;\n    VkRayTracingShaderGroupTypeKHR    type;\n    uint32_t                          generalShader;\n    uint32_t                          closestHitShader;\n    uint32_t                          anyHitShader;\n    uint32_t                          intersectionShader;\n    const void*                       pShaderGroupCaptureReplayHandle;\n} VkRayTracingShaderGroupCreateInfoKHR;\n\ntypedef struct VkRayTracingPipelineInterfaceCreateInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           maxPipelineRayPayloadSize;\n    uint32_t           maxPipelineRayHitAttributeSize;\n} VkRayTracingPipelineInterfaceCreateInfoKHR;\n\ntypedef struct VkRayTracingPipelineCreateInfoKHR {\n    VkStructureType                                      sType;\n    const void*                                          pNext;\n    VkPipelineCreateFlags                                flags;\n    uint32_t                                             stageCount;\n    const VkPipelineShaderStageCreateInfo*               pStages;\n    uint32_t                                             groupCount;\n    const VkRayTracingShaderGroupCreateInfoKHR*          pGroups;\n    uint32_t                                             maxPipelineRayRecursionDepth;\n    const VkPipelineLibraryCreateInfoKHR*                pLibraryInfo;\n    const VkRayTracingPipelineInterfaceCreateInfoKHR*    pLibraryInterface;\n    const VkPipelineDynamicStateCreateInfo*              pDynamicState;\n    VkPipelineLayout                                     layout;\n    VkPipeline                                           basePipelineHandle;\n    int32_t                                              basePipelineIndex;\n} VkRayTracingPipelineCreateInfoKHR;\n\ntypedef struct VkPhysicalDeviceRayTracingPipelineFeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           rayTracingPipeline;\n    VkBool32           rayTracingPipelineShaderGroupHandleCaptureReplay;\n    VkBool32           rayTracingPipelineShaderGroupHandleCaptureReplayMixed;\n    VkBool32           rayTracingPipelineTraceRaysIndirect;\n    VkBool32           rayTraversalPrimitiveCulling;\n} VkPhysicalDeviceRayTracingPipelineFeaturesKHR;\n\ntypedef struct VkPhysicalDeviceRayTracingPipelinePropertiesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           shaderGroupHandleSize;\n    uint32_t           maxRayRecursionDepth;\n    uint32_t           maxShaderGroupStride;\n    uint32_t           shaderGroupBaseAlignment;\n    uint32_t           shaderGroupHandleCaptureReplaySize;\n    uint32_t           maxRayDispatchInvocationCount;\n    uint32_t           shaderGroupHandleAlignment;\n    uint32_t           maxRayHitAttributeSize;\n} VkPhysicalDeviceRayTracingPipelinePropertiesKHR;\n\ntypedef struct VkTraceRaysIndirectCommandKHR {\n    uint32_t    width;\n    uint32_t    height;\n    uint32_t    depth;\n} VkTraceRaysIndirectCommandKHR;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdTraceRaysKHR)(VkCommandBuffer commandBuffer, const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable, const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable, const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable, const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable, uint32_t width, uint32_t height, uint32_t depth);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateRayTracingPipelinesKHR)(VkDevice device, VkDeferredOperationKHR deferredOperation, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkRayTracingPipelineCreateInfoKHR* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR)(VkDevice device, VkPipeline pipeline, uint32_t firstGroup, uint32_t groupCount, size_t dataSize, void* pData);\ntypedef void (VKAPI_PTR *PFN_vkCmdTraceRaysIndirectKHR)(VkCommandBuffer commandBuffer, const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable, const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable, const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable, const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable, VkDeviceAddress indirectDeviceAddress);\ntypedef VkDeviceSize (VKAPI_PTR *PFN_vkGetRayTracingShaderGroupStackSizeKHR)(VkDevice device, VkPipeline pipeline, uint32_t group, VkShaderGroupShaderKHR groupShader);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetRayTracingPipelineStackSizeKHR)(VkCommandBuffer commandBuffer, uint32_t pipelineStackSize);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdTraceRaysKHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkStridedDeviceAddressRegionKHR*      pRaygenShaderBindingTable,\n    const VkStridedDeviceAddressRegionKHR*      pMissShaderBindingTable,\n    const VkStridedDeviceAddressRegionKHR*      pHitShaderBindingTable,\n    const VkStridedDeviceAddressRegionKHR*      pCallableShaderBindingTable,\n    uint32_t                                    width,\n    uint32_t                                    height,\n    uint32_t                                    depth);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateRayTracingPipelinesKHR(\n    VkDevice                                    device,\n    VkDeferredOperationKHR                      deferredOperation,\n    VkPipelineCache                             pipelineCache,\n    uint32_t                                    createInfoCount,\n    const VkRayTracingPipelineCreateInfoKHR*    pCreateInfos,\n    const VkAllocationCallbacks*                pAllocator,\n    VkPipeline*                                 pPipelines);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(\n    VkDevice                                    device,\n    VkPipeline                                  pipeline,\n    uint32_t                                    firstGroup,\n    uint32_t                                    groupCount,\n    size_t                                      dataSize,\n    void*                                       pData);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdTraceRaysIndirectKHR(\n    VkCommandBuffer                             commandBuffer,\n    const VkStridedDeviceAddressRegionKHR*      pRaygenShaderBindingTable,\n    const VkStridedDeviceAddressRegionKHR*      pMissShaderBindingTable,\n    const VkStridedDeviceAddressRegionKHR*      pHitShaderBindingTable,\n    const VkStridedDeviceAddressRegionKHR*      pCallableShaderBindingTable,\n    VkDeviceAddress                             indirectDeviceAddress);\n\nVKAPI_ATTR VkDeviceSize VKAPI_CALL vkGetRayTracingShaderGroupStackSizeKHR(\n    VkDevice                                    device,\n    VkPipeline                                  pipeline,\n    uint32_t                                    group,\n    VkShaderGroupShaderKHR                      groupShader);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetRayTracingPipelineStackSizeKHR(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    pipelineStackSize);\n#endif\n\n\n// VK_KHR_ray_query is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_ray_query 1\n#define VK_KHR_RAY_QUERY_SPEC_VERSION     1\n#define VK_KHR_RAY_QUERY_EXTENSION_NAME   \"VK_KHR_ray_query\"\ntypedef struct VkPhysicalDeviceRayQueryFeaturesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           rayQuery;\n} VkPhysicalDeviceRayQueryFeaturesKHR;\n\n\n\n// VK_EXT_mesh_shader is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_mesh_shader 1\n#define VK_EXT_MESH_SHADER_SPEC_VERSION   1\n#define VK_EXT_MESH_SHADER_EXTENSION_NAME \"VK_EXT_mesh_shader\"\ntypedef struct VkPhysicalDeviceMeshShaderFeaturesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           taskShader;\n    VkBool32           meshShader;\n    VkBool32           multiviewMeshShader;\n    VkBool32           primitiveFragmentShadingRateMeshShader;\n    VkBool32           meshShaderQueries;\n} VkPhysicalDeviceMeshShaderFeaturesEXT;\n\ntypedef struct VkPhysicalDeviceMeshShaderPropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           maxTaskWorkGroupTotalCount;\n    uint32_t           maxTaskWorkGroupCount[3];\n    uint32_t           maxTaskWorkGroupInvocations;\n    uint32_t           maxTaskWorkGroupSize[3];\n    uint32_t           maxTaskPayloadSize;\n    uint32_t           maxTaskSharedMemorySize;\n    uint32_t           maxTaskPayloadAndSharedMemorySize;\n    uint32_t           maxMeshWorkGroupTotalCount;\n    uint32_t           maxMeshWorkGroupCount[3];\n    uint32_t           maxMeshWorkGroupInvocations;\n    uint32_t           maxMeshWorkGroupSize[3];\n    uint32_t           maxMeshSharedMemorySize;\n    uint32_t           maxMeshPayloadAndSharedMemorySize;\n    uint32_t           maxMeshOutputMemorySize;\n    uint32_t           maxMeshPayloadAndOutputMemorySize;\n    uint32_t           maxMeshOutputComponents;\n    uint32_t           maxMeshOutputVertices;\n    uint32_t           maxMeshOutputPrimitives;\n    uint32_t           maxMeshOutputLayers;\n    uint32_t           maxMeshMultiviewViewCount;\n    uint32_t           meshOutputPerVertexGranularity;\n    uint32_t           meshOutputPerPrimitiveGranularity;\n    uint32_t           maxPreferredTaskWorkGroupInvocations;\n    uint32_t           maxPreferredMeshWorkGroupInvocations;\n    VkBool32           prefersLocalInvocationVertexOutput;\n    VkBool32           prefersLocalInvocationPrimitiveOutput;\n    VkBool32           prefersCompactVertexOutput;\n    VkBool32           prefersCompactPrimitiveOutput;\n} VkPhysicalDeviceMeshShaderPropertiesEXT;\n\ntypedef struct VkDrawMeshTasksIndirectCommandEXT {\n    uint32_t    groupCountX;\n    uint32_t    groupCountY;\n    uint32_t    groupCountZ;\n} VkDrawMeshTasksIndirectCommandEXT;\n\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawMeshTasksEXT)(VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ);\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawMeshTasksIndirectEXT)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride);\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawMeshTasksIndirectCountEXT)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawMeshTasksEXT(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    groupCountX,\n    uint32_t                                    groupCountY,\n    uint32_t                                    groupCountZ);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawMeshTasksIndirectEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    buffer,\n    VkDeviceSize                                offset,\n    uint32_t                                    drawCount,\n    uint32_t                                    stride);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawMeshTasksIndirectCountEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    buffer,\n    VkDeviceSize                                offset,\n    VkBuffer                                    countBuffer,\n    VkDeviceSize                                countBufferOffset,\n    uint32_t                                    maxDrawCount,\n    uint32_t                                    stride);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_directfb.h",
    "content": "#ifndef VULKAN_DIRECTFB_H_\n#define VULKAN_DIRECTFB_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// VK_EXT_directfb_surface is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_directfb_surface 1\n#define VK_EXT_DIRECTFB_SURFACE_SPEC_VERSION 1\n#define VK_EXT_DIRECTFB_SURFACE_EXTENSION_NAME \"VK_EXT_directfb_surface\"\ntypedef VkFlags VkDirectFBSurfaceCreateFlagsEXT;\ntypedef struct VkDirectFBSurfaceCreateInfoEXT {\n    VkStructureType                    sType;\n    const void*                        pNext;\n    VkDirectFBSurfaceCreateFlagsEXT    flags;\n    IDirectFB*                         dfb;\n    IDirectFBSurface*                  surface;\n} VkDirectFBSurfaceCreateInfoEXT;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateDirectFBSurfaceEXT)(VkInstance instance, const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);\ntypedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, IDirectFB* dfb);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateDirectFBSurfaceEXT(\n    VkInstance                                  instance,\n    const VkDirectFBSurfaceCreateInfoEXT*       pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSurfaceKHR*                               pSurface);\n\nVKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceDirectFBPresentationSupportEXT(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t                                    queueFamilyIndex,\n    IDirectFB*                                  dfb);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_enums.hpp",
    "content": "// Copyright 2015-2025 The Khronos Group Inc.\n//\n// SPDX-License-Identifier: Apache-2.0 OR MIT\n//\n\n// This header is generated from the Khronos Vulkan XML API Registry.\n\n#ifndef VULKAN_ENUMS_HPP\n#define VULKAN_ENUMS_HPP\n\n// include-what-you-use: make sure, vulkan.hpp is used by code-completers\n// IWYU pragma: private; include \"vulkan.hpp\"\n\nnamespace VULKAN_HPP_NAMESPACE\n{\n  template <typename FlagBitsType>\n  struct FlagTraits\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool isBitmask = false;\n  };\n\n  template <typename BitType>\n  class Flags\n  {\n  public:\n    using MaskType = typename std::underlying_type<BitType>::type;\n\n    // constructors\n    VULKAN_HPP_CONSTEXPR Flags() VULKAN_HPP_NOEXCEPT : m_mask( 0 ) {}\n\n    VULKAN_HPP_CONSTEXPR Flags( BitType bit ) VULKAN_HPP_NOEXCEPT : m_mask( static_cast<MaskType>( bit ) ) {}\n\n    VULKAN_HPP_CONSTEXPR Flags( Flags<BitType> const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VULKAN_HPP_CONSTEXPR explicit Flags( MaskType flags ) VULKAN_HPP_NOEXCEPT : m_mask( flags ) {}\n\n    // relational operators\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( Flags<BitType> const & ) const = default;\n#else\n    VULKAN_HPP_CONSTEXPR bool operator<( Flags<BitType> const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return m_mask < rhs.m_mask;\n    }\n\n    VULKAN_HPP_CONSTEXPR bool operator<=( Flags<BitType> const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return m_mask <= rhs.m_mask;\n    }\n\n    VULKAN_HPP_CONSTEXPR bool operator>( Flags<BitType> const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return m_mask > rhs.m_mask;\n    }\n\n    VULKAN_HPP_CONSTEXPR bool operator>=( Flags<BitType> const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return m_mask >= rhs.m_mask;\n    }\n\n    VULKAN_HPP_CONSTEXPR bool operator==( Flags<BitType> const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return m_mask == rhs.m_mask;\n    }\n\n    VULKAN_HPP_CONSTEXPR bool operator!=( Flags<BitType> const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return m_mask != rhs.m_mask;\n    }\n#endif\n\n    // logical operator\n    VULKAN_HPP_CONSTEXPR bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return !m_mask;\n    }\n\n    // bitwise operators\n    VULKAN_HPP_CONSTEXPR Flags<BitType> operator&( Flags<BitType> const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return Flags<BitType>( m_mask & rhs.m_mask );\n    }\n\n    VULKAN_HPP_CONSTEXPR Flags<BitType> operator|( Flags<BitType> const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return Flags<BitType>( m_mask | rhs.m_mask );\n    }\n\n    VULKAN_HPP_CONSTEXPR Flags<BitType> operator^( Flags<BitType> const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return Flags<BitType>( m_mask ^ rhs.m_mask );\n    }\n\n    VULKAN_HPP_CONSTEXPR Flags<BitType> operator~() const VULKAN_HPP_NOEXCEPT\n    {\n      return Flags<BitType>( m_mask ^ FlagTraits<BitType>::allFlags.m_mask );\n    }\n\n    // assignment operators\n    VULKAN_HPP_CONSTEXPR_14 Flags<BitType> & operator=( Flags<BitType> const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VULKAN_HPP_CONSTEXPR_14 Flags<BitType> & operator|=( Flags<BitType> const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_mask |= rhs.m_mask;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 Flags<BitType> & operator&=( Flags<BitType> const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_mask &= rhs.m_mask;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 Flags<BitType> & operator^=( Flags<BitType> const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_mask ^= rhs.m_mask;\n      return *this;\n    }\n\n    // cast operators\n    explicit VULKAN_HPP_CONSTEXPR operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return !!m_mask;\n    }\n\n    explicit VULKAN_HPP_CONSTEXPR operator MaskType() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_mask;\n    }\n\n#if defined( VULKAN_HPP_FLAGS_MASK_TYPE_AS_PUBLIC )\n  public:\n#else\n  private:\n#endif\n    MaskType m_mask;\n  };\n\n#if !defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n  // relational operators only needed for pre C++20\n  template <typename BitType>\n  VULKAN_HPP_CONSTEXPR bool operator<( BitType bit, Flags<BitType> const & flags ) VULKAN_HPP_NOEXCEPT\n  {\n    return flags.operator>( bit );\n  }\n\n  template <typename BitType>\n  VULKAN_HPP_CONSTEXPR bool operator<=( BitType bit, Flags<BitType> const & flags ) VULKAN_HPP_NOEXCEPT\n  {\n    return flags.operator>=( bit );\n  }\n\n  template <typename BitType>\n  VULKAN_HPP_CONSTEXPR bool operator>( BitType bit, Flags<BitType> const & flags ) VULKAN_HPP_NOEXCEPT\n  {\n    return flags.operator<( bit );\n  }\n\n  template <typename BitType>\n  VULKAN_HPP_CONSTEXPR bool operator>=( BitType bit, Flags<BitType> const & flags ) VULKAN_HPP_NOEXCEPT\n  {\n    return flags.operator<=( bit );\n  }\n\n  template <typename BitType>\n  VULKAN_HPP_CONSTEXPR bool operator==( BitType bit, Flags<BitType> const & flags ) VULKAN_HPP_NOEXCEPT\n  {\n    return flags.operator==( bit );\n  }\n\n  template <typename BitType>\n  VULKAN_HPP_CONSTEXPR bool operator!=( BitType bit, Flags<BitType> const & flags ) VULKAN_HPP_NOEXCEPT\n  {\n    return flags.operator!=( bit );\n  }\n#endif\n\n  // bitwise operators\n  template <typename BitType>\n  VULKAN_HPP_CONSTEXPR Flags<BitType> operator&( BitType bit, Flags<BitType> const & flags ) VULKAN_HPP_NOEXCEPT\n  {\n    return flags.operator&( bit );\n  }\n\n  template <typename BitType>\n  VULKAN_HPP_CONSTEXPR Flags<BitType> operator|( BitType bit, Flags<BitType> const & flags ) VULKAN_HPP_NOEXCEPT\n  {\n    return flags.operator|( bit );\n  }\n\n  template <typename BitType>\n  VULKAN_HPP_CONSTEXPR Flags<BitType> operator^( BitType bit, Flags<BitType> const & flags ) VULKAN_HPP_NOEXCEPT\n  {\n    return flags.operator^( bit );\n  }\n\n  // bitwise operators on BitType\n  template <typename BitType, typename std::enable_if<FlagTraits<BitType>::isBitmask, bool>::type = true>\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR Flags<BitType> operator&( BitType lhs, BitType rhs ) VULKAN_HPP_NOEXCEPT\n  {\n    return Flags<BitType>( lhs ) & rhs;\n  }\n\n  template <typename BitType, typename std::enable_if<FlagTraits<BitType>::isBitmask, bool>::type = true>\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR Flags<BitType> operator|( BitType lhs, BitType rhs ) VULKAN_HPP_NOEXCEPT\n  {\n    return Flags<BitType>( lhs ) | rhs;\n  }\n\n  template <typename BitType, typename std::enable_if<FlagTraits<BitType>::isBitmask, bool>::type = true>\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR Flags<BitType> operator^( BitType lhs, BitType rhs ) VULKAN_HPP_NOEXCEPT\n  {\n    return Flags<BitType>( lhs ) ^ rhs;\n  }\n\n  template <typename BitType, typename std::enable_if<FlagTraits<BitType>::isBitmask, bool>::type = true>\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR Flags<BitType> operator~( BitType bit ) VULKAN_HPP_NOEXCEPT\n  {\n    return ~( Flags<BitType>( bit ) );\n  }\n\n  //=============\n  //=== ENUMs ===\n  //=============\n\n  //=== VK_VERSION_1_0 ===\n\n  enum class Result\n  {\n    eSuccess                                     = VK_SUCCESS,\n    eNotReady                                    = VK_NOT_READY,\n    eTimeout                                     = VK_TIMEOUT,\n    eEventSet                                    = VK_EVENT_SET,\n    eEventReset                                  = VK_EVENT_RESET,\n    eIncomplete                                  = VK_INCOMPLETE,\n    eErrorOutOfHostMemory                        = VK_ERROR_OUT_OF_HOST_MEMORY,\n    eErrorOutOfDeviceMemory                      = VK_ERROR_OUT_OF_DEVICE_MEMORY,\n    eErrorInitializationFailed                   = VK_ERROR_INITIALIZATION_FAILED,\n    eErrorDeviceLost                             = VK_ERROR_DEVICE_LOST,\n    eErrorMemoryMapFailed                        = VK_ERROR_MEMORY_MAP_FAILED,\n    eErrorLayerNotPresent                        = VK_ERROR_LAYER_NOT_PRESENT,\n    eErrorExtensionNotPresent                    = VK_ERROR_EXTENSION_NOT_PRESENT,\n    eErrorFeatureNotPresent                      = VK_ERROR_FEATURE_NOT_PRESENT,\n    eErrorIncompatibleDriver                     = VK_ERROR_INCOMPATIBLE_DRIVER,\n    eErrorTooManyObjects                         = VK_ERROR_TOO_MANY_OBJECTS,\n    eErrorFormatNotSupported                     = VK_ERROR_FORMAT_NOT_SUPPORTED,\n    eErrorFragmentedPool                         = VK_ERROR_FRAGMENTED_POOL,\n    eErrorUnknown                                = VK_ERROR_UNKNOWN,\n    eErrorOutOfPoolMemory                        = VK_ERROR_OUT_OF_POOL_MEMORY,\n    eErrorOutOfPoolMemoryKHR                     = VK_ERROR_OUT_OF_POOL_MEMORY_KHR,\n    eErrorInvalidExternalHandle                  = VK_ERROR_INVALID_EXTERNAL_HANDLE,\n    eErrorInvalidExternalHandleKHR               = VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR,\n    eErrorFragmentation                          = VK_ERROR_FRAGMENTATION,\n    eErrorFragmentationEXT                       = VK_ERROR_FRAGMENTATION_EXT,\n    eErrorInvalidOpaqueCaptureAddress            = VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS,\n    eErrorInvalidDeviceAddressEXT                = VK_ERROR_INVALID_DEVICE_ADDRESS_EXT,\n    eErrorInvalidOpaqueCaptureAddressKHR         = VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR,\n    ePipelineCompileRequired                     = VK_PIPELINE_COMPILE_REQUIRED,\n    ePipelineCompileRequiredEXT                  = VK_PIPELINE_COMPILE_REQUIRED_EXT,\n    eErrorPipelineCompileRequiredEXT             = VK_ERROR_PIPELINE_COMPILE_REQUIRED_EXT,\n    eErrorNotPermitted                           = VK_ERROR_NOT_PERMITTED,\n    eErrorNotPermittedEXT                        = VK_ERROR_NOT_PERMITTED_EXT,\n    eErrorNotPermittedKHR                        = VK_ERROR_NOT_PERMITTED_KHR,\n    eErrorSurfaceLostKHR                         = VK_ERROR_SURFACE_LOST_KHR,\n    eErrorNativeWindowInUseKHR                   = VK_ERROR_NATIVE_WINDOW_IN_USE_KHR,\n    eSuboptimalKHR                               = VK_SUBOPTIMAL_KHR,\n    eErrorOutOfDateKHR                           = VK_ERROR_OUT_OF_DATE_KHR,\n    eErrorIncompatibleDisplayKHR                 = VK_ERROR_INCOMPATIBLE_DISPLAY_KHR,\n    eErrorValidationFailedEXT                    = VK_ERROR_VALIDATION_FAILED_EXT,\n    eErrorInvalidShaderNV                        = VK_ERROR_INVALID_SHADER_NV,\n    eErrorImageUsageNotSupportedKHR              = VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR,\n    eErrorVideoPictureLayoutNotSupportedKHR      = VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR,\n    eErrorVideoProfileOperationNotSupportedKHR   = VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR,\n    eErrorVideoProfileFormatNotSupportedKHR      = VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR,\n    eErrorVideoProfileCodecNotSupportedKHR       = VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR,\n    eErrorVideoStdVersionNotSupportedKHR         = VK_ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR,\n    eErrorInvalidDrmFormatModifierPlaneLayoutEXT = VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT,\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n    eErrorFullScreenExclusiveModeLostEXT = VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT,\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n    eThreadIdleKHR                     = VK_THREAD_IDLE_KHR,\n    eThreadDoneKHR                     = VK_THREAD_DONE_KHR,\n    eOperationDeferredKHR              = VK_OPERATION_DEFERRED_KHR,\n    eOperationNotDeferredKHR           = VK_OPERATION_NOT_DEFERRED_KHR,\n    eErrorInvalidVideoStdParametersKHR = VK_ERROR_INVALID_VIDEO_STD_PARAMETERS_KHR,\n    eErrorCompressionExhaustedEXT      = VK_ERROR_COMPRESSION_EXHAUSTED_EXT,\n    eIncompatibleShaderBinaryEXT       = VK_INCOMPATIBLE_SHADER_BINARY_EXT,\n    eErrorIncompatibleShaderBinaryEXT  = VK_ERROR_INCOMPATIBLE_SHADER_BINARY_EXT,\n    ePipelineBinaryMissingKHR          = VK_PIPELINE_BINARY_MISSING_KHR,\n    eErrorNotEnoughSpaceKHR            = VK_ERROR_NOT_ENOUGH_SPACE_KHR\n  };\n\n  enum class StructureType\n  {\n    eApplicationInfo                                         = VK_STRUCTURE_TYPE_APPLICATION_INFO,\n    eInstanceCreateInfo                                      = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,\n    eDeviceQueueCreateInfo                                   = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,\n    eDeviceCreateInfo                                        = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,\n    eSubmitInfo                                              = VK_STRUCTURE_TYPE_SUBMIT_INFO,\n    eMemoryAllocateInfo                                      = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,\n    eMappedMemoryRange                                       = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,\n    eBindSparseInfo                                          = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO,\n    eFenceCreateInfo                                         = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,\n    eSemaphoreCreateInfo                                     = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,\n    eEventCreateInfo                                         = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,\n    eQueryPoolCreateInfo                                     = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,\n    eBufferCreateInfo                                        = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,\n    eBufferViewCreateInfo                                    = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO,\n    eImageCreateInfo                                         = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,\n    eImageViewCreateInfo                                     = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,\n    eShaderModuleCreateInfo                                  = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,\n    ePipelineCacheCreateInfo                                 = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,\n    ePipelineShaderStageCreateInfo                           = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,\n    ePipelineVertexInputStateCreateInfo                      = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,\n    ePipelineInputAssemblyStateCreateInfo                    = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,\n    ePipelineTessellationStateCreateInfo                     = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,\n    ePipelineViewportStateCreateInfo                         = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,\n    ePipelineRasterizationStateCreateInfo                    = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,\n    ePipelineMultisampleStateCreateInfo                      = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,\n    ePipelineDepthStencilStateCreateInfo                     = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,\n    ePipelineColorBlendStateCreateInfo                       = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,\n    ePipelineDynamicStateCreateInfo                          = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,\n    eGraphicsPipelineCreateInfo                              = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,\n    eComputePipelineCreateInfo                               = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,\n    ePipelineLayoutCreateInfo                                = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,\n    eSamplerCreateInfo                                       = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,\n    eDescriptorSetLayoutCreateInfo                           = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,\n    eDescriptorPoolCreateInfo                                = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,\n    eDescriptorSetAllocateInfo                               = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,\n    eWriteDescriptorSet                                      = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,\n    eCopyDescriptorSet                                       = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET,\n    eFramebufferCreateInfo                                   = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,\n    eRenderPassCreateInfo                                    = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,\n    eCommandPoolCreateInfo                                   = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,\n    eCommandBufferAllocateInfo                               = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,\n    eCommandBufferInheritanceInfo                            = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,\n    eCommandBufferBeginInfo                                  = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,\n    eRenderPassBeginInfo                                     = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,\n    eBufferMemoryBarrier                                     = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,\n    eImageMemoryBarrier                                      = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,\n    eMemoryBarrier                                           = VK_STRUCTURE_TYPE_MEMORY_BARRIER,\n    eLoaderInstanceCreateInfo                                = VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO,\n    eLoaderDeviceCreateInfo                                  = VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO,\n    ePhysicalDeviceSubgroupProperties                        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES,\n    eBindBufferMemoryInfo                                    = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO,\n    eBindBufferMemoryInfoKHR                                 = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR,\n    eBindImageMemoryInfo                                     = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO,\n    eBindImageMemoryInfoKHR                                  = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR,\n    ePhysicalDevice16BitStorageFeatures                      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES,\n    ePhysicalDevice16BitStorageFeaturesKHR                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR,\n    eMemoryDedicatedRequirements                             = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS,\n    eMemoryDedicatedRequirementsKHR                          = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR,\n    eMemoryDedicatedAllocateInfo                             = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,\n    eMemoryDedicatedAllocateInfoKHR                          = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR,\n    eMemoryAllocateFlagsInfo                                 = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO,\n    eMemoryAllocateFlagsInfoKHR                              = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHR,\n    eDeviceGroupRenderPassBeginInfo                          = VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO,\n    eDeviceGroupRenderPassBeginInfoKHR                       = VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO_KHR,\n    eDeviceGroupCommandBufferBeginInfo                       = VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO,\n    eDeviceGroupCommandBufferBeginInfoKHR                    = VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO_KHR,\n    eDeviceGroupSubmitInfo                                   = VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO,\n    eDeviceGroupSubmitInfoKHR                                = VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO_KHR,\n    eDeviceGroupBindSparseInfo                               = VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO,\n    eDeviceGroupBindSparseInfoKHR                            = VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO_KHR,\n    eBindBufferMemoryDeviceGroupInfo                         = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO,\n    eBindBufferMemoryDeviceGroupInfoKHR                      = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO_KHR,\n    eBindImageMemoryDeviceGroupInfo                          = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO,\n    eBindImageMemoryDeviceGroupInfoKHR                       = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO_KHR,\n    ePhysicalDeviceGroupProperties                           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES,\n    ePhysicalDeviceGroupPropertiesKHR                        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES_KHR,\n    eDeviceGroupDeviceCreateInfo                             = VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO,\n    eDeviceGroupDeviceCreateInfoKHR                          = VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHR,\n    eBufferMemoryRequirementsInfo2                           = VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2,\n    eBufferMemoryRequirementsInfo2KHR                        = VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR,\n    eImageMemoryRequirementsInfo2                            = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2,\n    eImageMemoryRequirementsInfo2KHR                         = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR,\n    eImageSparseMemoryRequirementsInfo2                      = VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2,\n    eImageSparseMemoryRequirementsInfo2KHR                   = VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2_KHR,\n    eMemoryRequirements2                                     = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2,\n    eMemoryRequirements2KHR                                  = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR,\n    eSparseImageMemoryRequirements2                          = VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2,\n    eSparseImageMemoryRequirements2KHR                       = VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2_KHR,\n    ePhysicalDeviceFeatures2                                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,\n    ePhysicalDeviceFeatures2KHR                              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR,\n    ePhysicalDeviceProperties2                               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2,\n    ePhysicalDeviceProperties2KHR                            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR,\n    eFormatProperties2                                       = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2,\n    eFormatProperties2KHR                                    = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR,\n    eImageFormatProperties2                                  = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2,\n    eImageFormatProperties2KHR                               = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2_KHR,\n    ePhysicalDeviceImageFormatInfo2                          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2,\n    ePhysicalDeviceImageFormatInfo2KHR                       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2_KHR,\n    eQueueFamilyProperties2                                  = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2,\n    eQueueFamilyProperties2KHR                               = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2_KHR,\n    ePhysicalDeviceMemoryProperties2                         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2,\n    ePhysicalDeviceMemoryProperties2KHR                      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR,\n    eSparseImageFormatProperties2                            = VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2,\n    eSparseImageFormatProperties2KHR                         = VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2_KHR,\n    ePhysicalDeviceSparseImageFormatInfo2                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2,\n    ePhysicalDeviceSparseImageFormatInfo2KHR                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2_KHR,\n    ePhysicalDevicePointClippingProperties                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES,\n    ePhysicalDevicePointClippingPropertiesKHR                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES_KHR,\n    eRenderPassInputAttachmentAspectCreateInfo               = VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO,\n    eRenderPassInputAttachmentAspectCreateInfoKHR            = VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO_KHR,\n    eImageViewUsageCreateInfo                                = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO,\n    eImageViewUsageCreateInfoKHR                             = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO_KHR,\n    ePipelineTessellationDomainOriginStateCreateInfo         = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO,\n    ePipelineTessellationDomainOriginStateCreateInfoKHR      = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO_KHR,\n    eRenderPassMultiviewCreateInfo                           = VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO,\n    eRenderPassMultiviewCreateInfoKHR                        = VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO_KHR,\n    ePhysicalDeviceMultiviewFeatures                         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES,\n    ePhysicalDeviceMultiviewFeaturesKHR                      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR,\n    ePhysicalDeviceMultiviewProperties                       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES,\n    ePhysicalDeviceMultiviewPropertiesKHR                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHR,\n    ePhysicalDeviceVariablePointersFeatures                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES,\n    ePhysicalDeviceVariablePointerFeatures                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES,\n    ePhysicalDeviceVariablePointersFeaturesKHR               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES_KHR,\n    ePhysicalDeviceVariablePointerFeaturesKHR                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR,\n    eProtectedSubmitInfo                                     = VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO,\n    ePhysicalDeviceProtectedMemoryFeatures                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES,\n    ePhysicalDeviceProtectedMemoryProperties                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES,\n    eDeviceQueueInfo2                                        = VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2,\n    eSamplerYcbcrConversionCreateInfo                        = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,\n    eSamplerYcbcrConversionCreateInfoKHR                     = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO_KHR,\n    eSamplerYcbcrConversionInfo                              = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO,\n    eSamplerYcbcrConversionInfoKHR                           = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO_KHR,\n    eBindImagePlaneMemoryInfo                                = VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO,\n    eBindImagePlaneMemoryInfoKHR                             = VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO_KHR,\n    eImagePlaneMemoryRequirementsInfo                        = VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO,\n    eImagePlaneMemoryRequirementsInfoKHR                     = VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO_KHR,\n    ePhysicalDeviceSamplerYcbcrConversionFeatures            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES,\n    ePhysicalDeviceSamplerYcbcrConversionFeaturesKHR         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR,\n    eSamplerYcbcrConversionImageFormatProperties             = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES,\n    eSamplerYcbcrConversionImageFormatPropertiesKHR          = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES_KHR,\n    eDescriptorUpdateTemplateCreateInfo                      = VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO,\n    eDescriptorUpdateTemplateCreateInfoKHR                   = VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR,\n    ePhysicalDeviceExternalImageFormatInfo                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO,\n    ePhysicalDeviceExternalImageFormatInfoKHR                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO_KHR,\n    eExternalImageFormatProperties                           = VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES,\n    eExternalImageFormatPropertiesKHR                        = VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES_KHR,\n    ePhysicalDeviceExternalBufferInfo                        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO,\n    ePhysicalDeviceExternalBufferInfoKHR                     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO_KHR,\n    eExternalBufferProperties                                = VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES,\n    eExternalBufferPropertiesKHR                             = VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES_KHR,\n    ePhysicalDeviceIdProperties                              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES,\n    ePhysicalDeviceIdPropertiesKHR                           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES_KHR,\n    eExternalMemoryBufferCreateInfo                          = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO,\n    eExternalMemoryBufferCreateInfoKHR                       = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR,\n    eExternalMemoryImageCreateInfo                           = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO,\n    eExternalMemoryImageCreateInfoKHR                        = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_KHR,\n    eExportMemoryAllocateInfo                                = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO,\n    eExportMemoryAllocateInfoKHR                             = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR,\n    ePhysicalDeviceExternalFenceInfo                         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO,\n    ePhysicalDeviceExternalFenceInfoKHR                      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR,\n    eExternalFenceProperties                                 = VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES,\n    eExternalFencePropertiesKHR                              = VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR,\n    eExportFenceCreateInfo                                   = VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO,\n    eExportFenceCreateInfoKHR                                = VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO_KHR,\n    eExportSemaphoreCreateInfo                               = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO,\n    eExportSemaphoreCreateInfoKHR                            = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR,\n    ePhysicalDeviceExternalSemaphoreInfo                     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO,\n    ePhysicalDeviceExternalSemaphoreInfoKHR                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO_KHR,\n    eExternalSemaphoreProperties                             = VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES,\n    eExternalSemaphorePropertiesKHR                          = VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES_KHR,\n    ePhysicalDeviceMaintenance3Properties                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES,\n    ePhysicalDeviceMaintenance3PropertiesKHR                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES_KHR,\n    eDescriptorSetLayoutSupport                              = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT,\n    eDescriptorSetLayoutSupportKHR                           = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT_KHR,\n    ePhysicalDeviceShaderDrawParametersFeatures              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES,\n    ePhysicalDeviceShaderDrawParameterFeatures               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES,\n    ePhysicalDeviceVulkan11Features                          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES,\n    ePhysicalDeviceVulkan11Properties                        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES,\n    ePhysicalDeviceVulkan12Features                          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES,\n    ePhysicalDeviceVulkan12Properties                        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES,\n    eImageFormatListCreateInfo                               = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO,\n    eImageFormatListCreateInfoKHR                            = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR,\n    eAttachmentDescription2                                  = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2,\n    eAttachmentDescription2KHR                               = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR,\n    eAttachmentReference2                                    = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,\n    eAttachmentReference2KHR                                 = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR,\n    eSubpassDescription2                                     = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2,\n    eSubpassDescription2KHR                                  = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR,\n    eSubpassDependency2                                      = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2,\n    eSubpassDependency2KHR                                   = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR,\n    eRenderPassCreateInfo2                                   = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2,\n    eRenderPassCreateInfo2KHR                                = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR,\n    eSubpassBeginInfo                                        = VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO,\n    eSubpassBeginInfoKHR                                     = VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO_KHR,\n    eSubpassEndInfo                                          = VK_STRUCTURE_TYPE_SUBPASS_END_INFO,\n    eSubpassEndInfoKHR                                       = VK_STRUCTURE_TYPE_SUBPASS_END_INFO_KHR,\n    ePhysicalDevice8BitStorageFeatures                       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES,\n    ePhysicalDevice8BitStorageFeaturesKHR                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR,\n    ePhysicalDeviceDriverProperties                          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES,\n    ePhysicalDeviceDriverPropertiesKHR                       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR,\n    ePhysicalDeviceShaderAtomicInt64Features                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES,\n    ePhysicalDeviceShaderAtomicInt64FeaturesKHR              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR,\n    ePhysicalDeviceShaderFloat16Int8Features                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES,\n    ePhysicalDeviceShaderFloat16Int8FeaturesKHR              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES_KHR,\n    ePhysicalDeviceFloat16Int8FeaturesKHR                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR,\n    ePhysicalDeviceFloatControlsProperties                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES,\n    ePhysicalDeviceFloatControlsPropertiesKHR                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR,\n    eDescriptorSetLayoutBindingFlagsCreateInfo               = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO,\n    eDescriptorSetLayoutBindingFlagsCreateInfoEXT            = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT,\n    ePhysicalDeviceDescriptorIndexingFeatures                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES,\n    ePhysicalDeviceDescriptorIndexingFeaturesEXT             = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT,\n    ePhysicalDeviceDescriptorIndexingProperties              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES,\n    ePhysicalDeviceDescriptorIndexingPropertiesEXT           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT,\n    eDescriptorSetVariableDescriptorCountAllocateInfo        = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO,\n    eDescriptorSetVariableDescriptorCountAllocateInfoEXT     = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT,\n    eDescriptorSetVariableDescriptorCountLayoutSupport       = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT,\n    eDescriptorSetVariableDescriptorCountLayoutSupportEXT    = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT,\n    ePhysicalDeviceDepthStencilResolveProperties             = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES,\n    ePhysicalDeviceDepthStencilResolvePropertiesKHR          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR,\n    eSubpassDescriptionDepthStencilResolve                   = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE,\n    eSubpassDescriptionDepthStencilResolveKHR                = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE_KHR,\n    ePhysicalDeviceScalarBlockLayoutFeatures                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES,\n    ePhysicalDeviceScalarBlockLayoutFeaturesEXT              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT,\n    eImageStencilUsageCreateInfo                             = VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO,\n    eImageStencilUsageCreateInfoEXT                          = VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT,\n    ePhysicalDeviceSamplerFilterMinmaxProperties             = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES,\n    ePhysicalDeviceSamplerFilterMinmaxPropertiesEXT          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT,\n    eSamplerReductionModeCreateInfo                          = VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO,\n    eSamplerReductionModeCreateInfoEXT                       = VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT,\n    ePhysicalDeviceVulkanMemoryModelFeatures                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES,\n    ePhysicalDeviceVulkanMemoryModelFeaturesKHR              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR,\n    ePhysicalDeviceImagelessFramebufferFeatures              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES,\n    ePhysicalDeviceImagelessFramebufferFeaturesKHR           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR,\n    eFramebufferAttachmentsCreateInfo                        = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO,\n    eFramebufferAttachmentsCreateInfoKHR                     = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR,\n    eFramebufferAttachmentImageInfo                          = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO,\n    eFramebufferAttachmentImageInfoKHR                       = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR,\n    eRenderPassAttachmentBeginInfo                           = VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO,\n    eRenderPassAttachmentBeginInfoKHR                        = VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO_KHR,\n    ePhysicalDeviceUniformBufferStandardLayoutFeatures       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES,\n    ePhysicalDeviceUniformBufferStandardLayoutFeaturesKHR    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR,\n    ePhysicalDeviceShaderSubgroupExtendedTypesFeatures       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES,\n    ePhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES_KHR,\n    ePhysicalDeviceSeparateDepthStencilLayoutsFeatures       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES,\n    ePhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES_KHR,\n    eAttachmentReferenceStencilLayout                        = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT,\n    eAttachmentReferenceStencilLayoutKHR                     = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT_KHR,\n    eAttachmentDescriptionStencilLayout                      = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT,\n    eAttachmentDescriptionStencilLayoutKHR                   = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT_KHR,\n    ePhysicalDeviceHostQueryResetFeatures                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES,\n    ePhysicalDeviceHostQueryResetFeaturesEXT                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT,\n    ePhysicalDeviceTimelineSemaphoreFeatures                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES,\n    ePhysicalDeviceTimelineSemaphoreFeaturesKHR              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR,\n    ePhysicalDeviceTimelineSemaphoreProperties               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES,\n    ePhysicalDeviceTimelineSemaphorePropertiesKHR            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR,\n    eSemaphoreTypeCreateInfo                                 = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO,\n    eSemaphoreTypeCreateInfoKHR                              = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR,\n    eTimelineSemaphoreSubmitInfo                             = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO,\n    eTimelineSemaphoreSubmitInfoKHR                          = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR,\n    eSemaphoreWaitInfo                                       = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO,\n    eSemaphoreWaitInfoKHR                                    = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO_KHR,\n    eSemaphoreSignalInfo                                     = VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO,\n    eSemaphoreSignalInfoKHR                                  = VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO_KHR,\n    ePhysicalDeviceBufferDeviceAddressFeatures               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES,\n    ePhysicalDeviceBufferDeviceAddressFeaturesKHR            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR,\n    eBufferDeviceAddressInfo                                 = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,\n    eBufferDeviceAddressInfoEXT                              = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT,\n    eBufferDeviceAddressInfoKHR                              = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_KHR,\n    eBufferOpaqueCaptureAddressCreateInfo                    = VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO,\n    eBufferOpaqueCaptureAddressCreateInfoKHR                 = VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO_KHR,\n    eMemoryOpaqueCaptureAddressAllocateInfo                  = VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO,\n    eMemoryOpaqueCaptureAddressAllocateInfoKHR               = VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO_KHR,\n    eDeviceMemoryOpaqueCaptureAddressInfo                    = VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO,\n    eDeviceMemoryOpaqueCaptureAddressInfoKHR                 = VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO_KHR,\n    ePhysicalDeviceVulkan13Features                          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES,\n    ePhysicalDeviceVulkan13Properties                        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES,\n    ePipelineCreationFeedbackCreateInfo                      = VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO,\n    ePipelineCreationFeedbackCreateInfoEXT                   = VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT,\n    ePhysicalDeviceShaderTerminateInvocationFeatures         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES,\n    ePhysicalDeviceShaderTerminateInvocationFeaturesKHR      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR,\n    ePhysicalDeviceToolProperties                            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES,\n    ePhysicalDeviceToolPropertiesEXT                         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES_EXT,\n    ePhysicalDeviceShaderDemoteToHelperInvocationFeatures    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES,\n    ePhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT,\n    ePhysicalDevicePrivateDataFeatures                       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES,\n    ePhysicalDevicePrivateDataFeaturesEXT                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT,\n    eDevicePrivateDataCreateInfo                             = VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO,\n    eDevicePrivateDataCreateInfoEXT                          = VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT,\n    ePrivateDataSlotCreateInfo                               = VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO,\n    ePrivateDataSlotCreateInfoEXT                            = VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO_EXT,\n    ePhysicalDevicePipelineCreationCacheControlFeatures      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES,\n    ePhysicalDevicePipelineCreationCacheControlFeaturesEXT   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT,\n    eMemoryBarrier2                                          = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2,\n    eMemoryBarrier2KHR                                       = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR,\n    eBufferMemoryBarrier2                                    = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,\n    eBufferMemoryBarrier2KHR                                 = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2_KHR,\n    eImageMemoryBarrier2                                     = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2,\n    eImageMemoryBarrier2KHR                                  = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2_KHR,\n    eDependencyInfo                                          = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,\n    eDependencyInfoKHR                                       = VK_STRUCTURE_TYPE_DEPENDENCY_INFO_KHR,\n    eSubmitInfo2                                             = VK_STRUCTURE_TYPE_SUBMIT_INFO_2,\n    eSubmitInfo2KHR                                          = VK_STRUCTURE_TYPE_SUBMIT_INFO_2_KHR,\n    eSemaphoreSubmitInfo                                     = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,\n    eSemaphoreSubmitInfoKHR                                  = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO_KHR,\n    eCommandBufferSubmitInfo                                 = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO,\n    eCommandBufferSubmitInfoKHR                              = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO_KHR,\n    ePhysicalDeviceSynchronization2Features                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES,\n    ePhysicalDeviceSynchronization2FeaturesKHR               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR,\n    ePhysicalDeviceZeroInitializeWorkgroupMemoryFeatures     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES,\n    ePhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR,\n    ePhysicalDeviceImageRobustnessFeatures                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES,\n    ePhysicalDeviceImageRobustnessFeaturesEXT                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT,\n    eCopyBufferInfo2                                         = VK_STRUCTURE_TYPE_COPY_BUFFER_INFO_2,\n    eCopyBufferInfo2KHR                                      = VK_STRUCTURE_TYPE_COPY_BUFFER_INFO_2_KHR,\n    eCopyImageInfo2                                          = VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2,\n    eCopyImageInfo2KHR                                       = VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,\n    eCopyBufferToImageInfo2                                  = VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2,\n    eCopyBufferToImageInfo2KHR                               = VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2_KHR,\n    eCopyImageToBufferInfo2                                  = VK_STRUCTURE_TYPE_COPY_IMAGE_TO_BUFFER_INFO_2,\n    eCopyImageToBufferInfo2KHR                               = VK_STRUCTURE_TYPE_COPY_IMAGE_TO_BUFFER_INFO_2_KHR,\n    eBlitImageInfo2                                          = VK_STRUCTURE_TYPE_BLIT_IMAGE_INFO_2,\n    eBlitImageInfo2KHR                                       = VK_STRUCTURE_TYPE_BLIT_IMAGE_INFO_2_KHR,\n    eResolveImageInfo2                                       = VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2,\n    eResolveImageInfo2KHR                                    = VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,\n    eBufferCopy2                                             = VK_STRUCTURE_TYPE_BUFFER_COPY_2,\n    eBufferCopy2KHR                                          = VK_STRUCTURE_TYPE_BUFFER_COPY_2_KHR,\n    eImageCopy2                                              = VK_STRUCTURE_TYPE_IMAGE_COPY_2,\n    eImageCopy2KHR                                           = VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,\n    eImageBlit2                                              = VK_STRUCTURE_TYPE_IMAGE_BLIT_2,\n    eImageBlit2KHR                                           = VK_STRUCTURE_TYPE_IMAGE_BLIT_2_KHR,\n    eBufferImageCopy2                                        = VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2,\n    eBufferImageCopy2KHR                                     = VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR,\n    eImageResolve2                                           = VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2,\n    eImageResolve2KHR                                        = VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,\n    ePhysicalDeviceSubgroupSizeControlProperties             = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES,\n    ePhysicalDeviceSubgroupSizeControlPropertiesEXT          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT,\n    ePipelineShaderStageRequiredSubgroupSizeCreateInfo       = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO,\n    ePipelineShaderStageRequiredSubgroupSizeCreateInfoEXT    = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT,\n    eShaderRequiredSubgroupSizeCreateInfoEXT                 = VK_STRUCTURE_TYPE_SHADER_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT,\n    ePhysicalDeviceSubgroupSizeControlFeatures               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES,\n    ePhysicalDeviceSubgroupSizeControlFeaturesEXT            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT,\n    ePhysicalDeviceInlineUniformBlockFeatures                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES,\n    ePhysicalDeviceInlineUniformBlockFeaturesEXT             = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT,\n    ePhysicalDeviceInlineUniformBlockProperties              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES,\n    ePhysicalDeviceInlineUniformBlockPropertiesEXT           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT,\n    eWriteDescriptorSetInlineUniformBlock                    = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK,\n    eWriteDescriptorSetInlineUniformBlockEXT                 = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT,\n    eDescriptorPoolInlineUniformBlockCreateInfo              = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO,\n    eDescriptorPoolInlineUniformBlockCreateInfoEXT           = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT,\n    ePhysicalDeviceTextureCompressionAstcHdrFeatures         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES,\n    ePhysicalDeviceTextureCompressionAstcHdrFeaturesEXT      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT,\n    eRenderingInfo                                           = VK_STRUCTURE_TYPE_RENDERING_INFO,\n    eRenderingInfoKHR                                        = VK_STRUCTURE_TYPE_RENDERING_INFO_KHR,\n    eRenderingAttachmentInfo                                 = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO,\n    eRenderingAttachmentInfoKHR                              = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR,\n    ePipelineRenderingCreateInfo                             = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO,\n    ePipelineRenderingCreateInfoKHR                          = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR,\n    ePhysicalDeviceDynamicRenderingFeatures                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES,\n    ePhysicalDeviceDynamicRenderingFeaturesKHR               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR,\n    eCommandBufferInheritanceRenderingInfo                   = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO,\n    eCommandBufferInheritanceRenderingInfoKHR                = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR,\n    ePhysicalDeviceShaderIntegerDotProductFeatures           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES,\n    ePhysicalDeviceShaderIntegerDotProductFeaturesKHR        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR,\n    ePhysicalDeviceShaderIntegerDotProductProperties         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES,\n    ePhysicalDeviceShaderIntegerDotProductPropertiesKHR      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR,\n    ePhysicalDeviceTexelBufferAlignmentProperties            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES,\n    ePhysicalDeviceTexelBufferAlignmentPropertiesEXT         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT,\n    eFormatProperties3                                       = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3,\n    eFormatProperties3KHR                                    = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR,\n    ePhysicalDeviceMaintenance4Features                      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES,\n    ePhysicalDeviceMaintenance4FeaturesKHR                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR,\n    ePhysicalDeviceMaintenance4Properties                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES,\n    ePhysicalDeviceMaintenance4PropertiesKHR                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR,\n    eDeviceBufferMemoryRequirements                          = VK_STRUCTURE_TYPE_DEVICE_BUFFER_MEMORY_REQUIREMENTS,\n    eDeviceBufferMemoryRequirementsKHR                       = VK_STRUCTURE_TYPE_DEVICE_BUFFER_MEMORY_REQUIREMENTS_KHR,\n    eDeviceImageMemoryRequirements                           = VK_STRUCTURE_TYPE_DEVICE_IMAGE_MEMORY_REQUIREMENTS,\n    eDeviceImageMemoryRequirementsKHR                        = VK_STRUCTURE_TYPE_DEVICE_IMAGE_MEMORY_REQUIREMENTS_KHR,\n    ePhysicalDeviceVulkan14Features                          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_4_FEATURES,\n    ePhysicalDeviceVulkan14Properties                        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_4_PROPERTIES,\n    eDeviceQueueGlobalPriorityCreateInfo                     = VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO,\n    eDeviceQueueGlobalPriorityCreateInfoEXT                  = VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT,\n    eDeviceQueueGlobalPriorityCreateInfoKHR                  = VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_KHR,\n    ePhysicalDeviceGlobalPriorityQueryFeatures               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES,\n    ePhysicalDeviceGlobalPriorityQueryFeaturesKHR            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_KHR,\n    ePhysicalDeviceGlobalPriorityQueryFeaturesEXT            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT,\n    eQueueFamilyGlobalPriorityProperties                     = VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES,\n    eQueueFamilyGlobalPriorityPropertiesKHR                  = VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_KHR,\n    eQueueFamilyGlobalPriorityPropertiesEXT                  = VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT,\n    ePhysicalDeviceShaderSubgroupRotateFeatures              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES,\n    ePhysicalDeviceShaderSubgroupRotateFeaturesKHR           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES_KHR,\n    ePhysicalDeviceShaderFloatControls2Features              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES,\n    ePhysicalDeviceShaderFloatControls2FeaturesKHR           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES_KHR,\n    ePhysicalDeviceShaderExpectAssumeFeatures                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES,\n    ePhysicalDeviceShaderExpectAssumeFeaturesKHR             = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES_KHR,\n    ePhysicalDeviceLineRasterizationFeatures                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES,\n    ePhysicalDeviceLineRasterizationFeaturesEXT              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT,\n    ePhysicalDeviceLineRasterizationFeaturesKHR              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_KHR,\n    ePipelineRasterizationLineStateCreateInfo                = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO,\n    ePipelineRasterizationLineStateCreateInfoEXT             = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT,\n    ePipelineRasterizationLineStateCreateInfoKHR             = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_KHR,\n    ePhysicalDeviceLineRasterizationProperties               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES,\n    ePhysicalDeviceLineRasterizationPropertiesEXT            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT,\n    ePhysicalDeviceLineRasterizationPropertiesKHR            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_KHR,\n    ePhysicalDeviceVertexAttributeDivisorProperties          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES,\n    ePhysicalDeviceVertexAttributeDivisorPropertiesKHR       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_KHR,\n    ePipelineVertexInputDivisorStateCreateInfo               = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO,\n    ePipelineVertexInputDivisorStateCreateInfoEXT            = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT,\n    ePipelineVertexInputDivisorStateCreateInfoKHR            = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_KHR,\n    ePhysicalDeviceVertexAttributeDivisorFeatures            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES,\n    ePhysicalDeviceVertexAttributeDivisorFeaturesEXT         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT,\n    ePhysicalDeviceVertexAttributeDivisorFeaturesKHR         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR,\n    ePhysicalDeviceIndexTypeUint8Features                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES,\n    ePhysicalDeviceIndexTypeUint8FeaturesEXT                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT,\n    ePhysicalDeviceIndexTypeUint8FeaturesKHR                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_KHR,\n    eMemoryMapInfo                                           = VK_STRUCTURE_TYPE_MEMORY_MAP_INFO,\n    eMemoryMapInfoKHR                                        = VK_STRUCTURE_TYPE_MEMORY_MAP_INFO_KHR,\n    eMemoryUnmapInfo                                         = VK_STRUCTURE_TYPE_MEMORY_UNMAP_INFO,\n    eMemoryUnmapInfoKHR                                      = VK_STRUCTURE_TYPE_MEMORY_UNMAP_INFO_KHR,\n    ePhysicalDeviceMaintenance5Features                      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES,\n    ePhysicalDeviceMaintenance5FeaturesKHR                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES_KHR,\n    ePhysicalDeviceMaintenance5Properties                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES,\n    ePhysicalDeviceMaintenance5PropertiesKHR                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES_KHR,\n    eRenderingAreaInfo                                       = VK_STRUCTURE_TYPE_RENDERING_AREA_INFO,\n    eRenderingAreaInfoKHR                                    = VK_STRUCTURE_TYPE_RENDERING_AREA_INFO_KHR,\n    eDeviceImageSubresourceInfo                              = VK_STRUCTURE_TYPE_DEVICE_IMAGE_SUBRESOURCE_INFO,\n    eDeviceImageSubresourceInfoKHR                           = VK_STRUCTURE_TYPE_DEVICE_IMAGE_SUBRESOURCE_INFO_KHR,\n    eSubresourceLayout2                                      = VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2,\n    eSubresourceLayout2EXT                                   = VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2_EXT,\n    eSubresourceLayout2KHR                                   = VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2_KHR,\n    eImageSubresource2                                       = VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2,\n    eImageSubresource2EXT                                    = VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2_EXT,\n    eImageSubresource2KHR                                    = VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2_KHR,\n    ePipelineCreateFlags2CreateInfo                          = VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO,\n    ePipelineCreateFlags2CreateInfoKHR                       = VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR,\n    eBufferUsageFlags2CreateInfo                             = VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO,\n    eBufferUsageFlags2CreateInfoKHR                          = VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR,\n    ePhysicalDevicePushDescriptorProperties                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES,\n    ePhysicalDevicePushDescriptorPropertiesKHR               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR,\n    ePhysicalDeviceDynamicRenderingLocalReadFeatures         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES,\n    ePhysicalDeviceDynamicRenderingLocalReadFeaturesKHR      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES_KHR,\n    eRenderingAttachmentLocationInfo                         = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_LOCATION_INFO,\n    eRenderingAttachmentLocationInfoKHR                      = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_LOCATION_INFO_KHR,\n    eRenderingInputAttachmentIndexInfo                       = VK_STRUCTURE_TYPE_RENDERING_INPUT_ATTACHMENT_INDEX_INFO,\n    eRenderingInputAttachmentIndexInfoKHR                    = VK_STRUCTURE_TYPE_RENDERING_INPUT_ATTACHMENT_INDEX_INFO_KHR,\n    ePhysicalDeviceMaintenance6Features                      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES,\n    ePhysicalDeviceMaintenance6FeaturesKHR                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES_KHR,\n    ePhysicalDeviceMaintenance6Properties                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_PROPERTIES,\n    ePhysicalDeviceMaintenance6PropertiesKHR                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_PROPERTIES_KHR,\n    eBindMemoryStatus                                        = VK_STRUCTURE_TYPE_BIND_MEMORY_STATUS,\n    eBindMemoryStatusKHR                                     = VK_STRUCTURE_TYPE_BIND_MEMORY_STATUS_KHR,\n    eBindDescriptorSetsInfo                                  = VK_STRUCTURE_TYPE_BIND_DESCRIPTOR_SETS_INFO,\n    eBindDescriptorSetsInfoKHR                               = VK_STRUCTURE_TYPE_BIND_DESCRIPTOR_SETS_INFO_KHR,\n    ePushConstantsInfo                                       = VK_STRUCTURE_TYPE_PUSH_CONSTANTS_INFO,\n    ePushConstantsInfoKHR                                    = VK_STRUCTURE_TYPE_PUSH_CONSTANTS_INFO_KHR,\n    ePushDescriptorSetInfo                                   = VK_STRUCTURE_TYPE_PUSH_DESCRIPTOR_SET_INFO,\n    ePushDescriptorSetInfoKHR                                = VK_STRUCTURE_TYPE_PUSH_DESCRIPTOR_SET_INFO_KHR,\n    ePushDescriptorSetWithTemplateInfo                       = VK_STRUCTURE_TYPE_PUSH_DESCRIPTOR_SET_WITH_TEMPLATE_INFO,\n    ePushDescriptorSetWithTemplateInfoKHR                    = VK_STRUCTURE_TYPE_PUSH_DESCRIPTOR_SET_WITH_TEMPLATE_INFO_KHR,\n    ePhysicalDevicePipelineProtectedAccessFeatures           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES,\n    ePhysicalDevicePipelineProtectedAccessFeaturesEXT        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES_EXT,\n    ePipelineRobustnessCreateInfo                            = VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO,\n    ePipelineRobustnessCreateInfoEXT                         = VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO_EXT,\n    ePhysicalDevicePipelineRobustnessFeatures                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES,\n    ePhysicalDevicePipelineRobustnessFeaturesEXT             = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES_EXT,\n    ePhysicalDevicePipelineRobustnessProperties              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES,\n    ePhysicalDevicePipelineRobustnessPropertiesEXT           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES_EXT,\n    ePhysicalDeviceHostImageCopyFeatures                     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES,\n    ePhysicalDeviceHostImageCopyFeaturesEXT                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES_EXT,\n    ePhysicalDeviceHostImageCopyProperties                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES,\n    ePhysicalDeviceHostImageCopyPropertiesEXT                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES_EXT,\n    eMemoryToImageCopy                                       = VK_STRUCTURE_TYPE_MEMORY_TO_IMAGE_COPY,\n    eMemoryToImageCopyEXT                                    = VK_STRUCTURE_TYPE_MEMORY_TO_IMAGE_COPY_EXT,\n    eImageToMemoryCopy                                       = VK_STRUCTURE_TYPE_IMAGE_TO_MEMORY_COPY,\n    eImageToMemoryCopyEXT                                    = VK_STRUCTURE_TYPE_IMAGE_TO_MEMORY_COPY_EXT,\n    eCopyImageToMemoryInfo                                   = VK_STRUCTURE_TYPE_COPY_IMAGE_TO_MEMORY_INFO,\n    eCopyImageToMemoryInfoEXT                                = VK_STRUCTURE_TYPE_COPY_IMAGE_TO_MEMORY_INFO_EXT,\n    eCopyMemoryToImageInfo                                   = VK_STRUCTURE_TYPE_COPY_MEMORY_TO_IMAGE_INFO,\n    eCopyMemoryToImageInfoEXT                                = VK_STRUCTURE_TYPE_COPY_MEMORY_TO_IMAGE_INFO_EXT,\n    eHostImageLayoutTransitionInfo                           = VK_STRUCTURE_TYPE_HOST_IMAGE_LAYOUT_TRANSITION_INFO,\n    eHostImageLayoutTransitionInfoEXT                        = VK_STRUCTURE_TYPE_HOST_IMAGE_LAYOUT_TRANSITION_INFO_EXT,\n    eCopyImageToImageInfo                                    = VK_STRUCTURE_TYPE_COPY_IMAGE_TO_IMAGE_INFO,\n    eCopyImageToImageInfoEXT                                 = VK_STRUCTURE_TYPE_COPY_IMAGE_TO_IMAGE_INFO_EXT,\n    eSubresourceHostMemcpySize                               = VK_STRUCTURE_TYPE_SUBRESOURCE_HOST_MEMCPY_SIZE,\n    eSubresourceHostMemcpySizeEXT                            = VK_STRUCTURE_TYPE_SUBRESOURCE_HOST_MEMCPY_SIZE_EXT,\n    eHostImageCopyDevicePerformanceQuery                     = VK_STRUCTURE_TYPE_HOST_IMAGE_COPY_DEVICE_PERFORMANCE_QUERY,\n    eHostImageCopyDevicePerformanceQueryEXT                  = VK_STRUCTURE_TYPE_HOST_IMAGE_COPY_DEVICE_PERFORMANCE_QUERY_EXT,\n    eSwapchainCreateInfoKHR                                  = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR,\n    ePresentInfoKHR                                          = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR,\n    eDeviceGroupPresentCapabilitiesKHR                       = VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR,\n    eImageSwapchainCreateInfoKHR                             = VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR,\n    eBindImageMemorySwapchainInfoKHR                         = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR,\n    eAcquireNextImageInfoKHR                                 = VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHR,\n    eDeviceGroupPresentInfoKHR                               = VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR,\n    eDeviceGroupSwapchainCreateInfoKHR                       = VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR,\n    eDisplayModeCreateInfoKHR                                = VK_STRUCTURE_TYPE_DISPLAY_MODE_CREATE_INFO_KHR,\n    eDisplaySurfaceCreateInfoKHR                             = VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR,\n    eDisplayPresentInfoKHR                                   = VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR,\n#if defined( VK_USE_PLATFORM_XLIB_KHR )\n    eXlibSurfaceCreateInfoKHR = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR,\n#endif /*VK_USE_PLATFORM_XLIB_KHR*/\n#if defined( VK_USE_PLATFORM_XCB_KHR )\n    eXcbSurfaceCreateInfoKHR = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR,\n#endif /*VK_USE_PLATFORM_XCB_KHR*/\n#if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n    eWaylandSurfaceCreateInfoKHR = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR,\n#endif /*VK_USE_PLATFORM_WAYLAND_KHR*/\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n    eAndroidSurfaceCreateInfoKHR = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR,\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n    eWin32SurfaceCreateInfoKHR = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR,\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n    eDebugReportCallbackCreateInfoEXT                = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT,\n    eDebugReportCreateInfoEXT                        = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT,\n    ePipelineRasterizationStateRasterizationOrderAMD = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD,\n    eDebugMarkerObjectNameInfoEXT                    = VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT,\n    eDebugMarkerObjectTagInfoEXT                     = VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT,\n    eDebugMarkerMarkerInfoEXT                        = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT,\n    eVideoProfileInfoKHR                             = VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR,\n    eVideoCapabilitiesKHR                            = VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR,\n    eVideoPictureResourceInfoKHR                     = VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR,\n    eVideoSessionMemoryRequirementsKHR               = VK_STRUCTURE_TYPE_VIDEO_SESSION_MEMORY_REQUIREMENTS_KHR,\n    eBindVideoSessionMemoryInfoKHR                   = VK_STRUCTURE_TYPE_BIND_VIDEO_SESSION_MEMORY_INFO_KHR,\n    eVideoSessionCreateInfoKHR                       = VK_STRUCTURE_TYPE_VIDEO_SESSION_CREATE_INFO_KHR,\n    eVideoSessionParametersCreateInfoKHR             = VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR,\n    eVideoSessionParametersUpdateInfoKHR             = VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_UPDATE_INFO_KHR,\n    eVideoBeginCodingInfoKHR                         = VK_STRUCTURE_TYPE_VIDEO_BEGIN_CODING_INFO_KHR,\n    eVideoEndCodingInfoKHR                           = VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR,\n    eVideoCodingControlInfoKHR                       = VK_STRUCTURE_TYPE_VIDEO_CODING_CONTROL_INFO_KHR,\n    eVideoReferenceSlotInfoKHR                       = VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_INFO_KHR,\n    eQueueFamilyVideoPropertiesKHR                   = VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR,\n    eVideoProfileListInfoKHR                         = VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR,\n    ePhysicalDeviceVideoFormatInfoKHR                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR,\n    eVideoFormatPropertiesKHR                        = VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR,\n    eQueueFamilyQueryResultStatusPropertiesKHR       = VK_STRUCTURE_TYPE_QUEUE_FAMILY_QUERY_RESULT_STATUS_PROPERTIES_KHR,\n    eVideoDecodeInfoKHR                              = VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR,\n    eVideoDecodeCapabilitiesKHR                      = VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR,\n    eVideoDecodeUsageInfoKHR                         = VK_STRUCTURE_TYPE_VIDEO_DECODE_USAGE_INFO_KHR,\n    eDedicatedAllocationImageCreateInfoNV            = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV,\n    eDedicatedAllocationBufferCreateInfoNV           = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV,\n    eDedicatedAllocationMemoryAllocateInfoNV         = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV,\n    ePhysicalDeviceTransformFeedbackFeaturesEXT      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT,\n    ePhysicalDeviceTransformFeedbackPropertiesEXT    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT,\n    ePipelineRasterizationStateStreamCreateInfoEXT   = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT,\n    eCuModuleCreateInfoNVX                           = VK_STRUCTURE_TYPE_CU_MODULE_CREATE_INFO_NVX,\n    eCuFunctionCreateInfoNVX                         = VK_STRUCTURE_TYPE_CU_FUNCTION_CREATE_INFO_NVX,\n    eCuLaunchInfoNVX                                 = VK_STRUCTURE_TYPE_CU_LAUNCH_INFO_NVX,\n    eCuModuleTexturingModeCreateInfoNVX              = VK_STRUCTURE_TYPE_CU_MODULE_TEXTURING_MODE_CREATE_INFO_NVX,\n    eImageViewHandleInfoNVX                          = VK_STRUCTURE_TYPE_IMAGE_VIEW_HANDLE_INFO_NVX,\n    eImageViewAddressPropertiesNVX                   = VK_STRUCTURE_TYPE_IMAGE_VIEW_ADDRESS_PROPERTIES_NVX,\n    eVideoEncodeH264CapabilitiesKHR                  = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_KHR,\n    eVideoEncodeH264SessionParametersCreateInfoKHR   = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR,\n    eVideoEncodeH264SessionParametersAddInfoKHR      = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR,\n    eVideoEncodeH264PictureInfoKHR                   = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PICTURE_INFO_KHR,\n    eVideoEncodeH264DpbSlotInfoKHR                   = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_DPB_SLOT_INFO_KHR,\n    eVideoEncodeH264NaluSliceInfoKHR                 = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_NALU_SLICE_INFO_KHR,\n    eVideoEncodeH264GopRemainingFrameInfoKHR         = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_GOP_REMAINING_FRAME_INFO_KHR,\n    eVideoEncodeH264ProfileInfoKHR                   = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_INFO_KHR,\n    eVideoEncodeH264RateControlInfoKHR               = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_RATE_CONTROL_INFO_KHR,\n    eVideoEncodeH264RateControlLayerInfoKHR          = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_RATE_CONTROL_LAYER_INFO_KHR,\n    eVideoEncodeH264SessionCreateInfoKHR             = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_KHR,\n    eVideoEncodeH264QualityLevelPropertiesKHR        = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_QUALITY_LEVEL_PROPERTIES_KHR,\n    eVideoEncodeH264SessionParametersGetInfoKHR      = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_GET_INFO_KHR,\n    eVideoEncodeH264SessionParametersFeedbackInfoKHR = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_FEEDBACK_INFO_KHR,\n    eVideoEncodeH265CapabilitiesKHR                  = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_KHR,\n    eVideoEncodeH265SessionParametersCreateInfoKHR   = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR,\n    eVideoEncodeH265SessionParametersAddInfoKHR      = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR,\n    eVideoEncodeH265PictureInfoKHR                   = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PICTURE_INFO_KHR,\n    eVideoEncodeH265DpbSlotInfoKHR                   = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_DPB_SLOT_INFO_KHR,\n    eVideoEncodeH265NaluSliceSegmentInfoKHR          = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_NALU_SLICE_SEGMENT_INFO_KHR,\n    eVideoEncodeH265GopRemainingFrameInfoKHR         = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_GOP_REMAINING_FRAME_INFO_KHR,\n    eVideoEncodeH265ProfileInfoKHR                   = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_INFO_KHR,\n    eVideoEncodeH265RateControlInfoKHR               = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_INFO_KHR,\n    eVideoEncodeH265RateControlLayerInfoKHR          = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_LAYER_INFO_KHR,\n    eVideoEncodeH265SessionCreateInfoKHR             = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_KHR,\n    eVideoEncodeH265QualityLevelPropertiesKHR        = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_QUALITY_LEVEL_PROPERTIES_KHR,\n    eVideoEncodeH265SessionParametersGetInfoKHR      = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_GET_INFO_KHR,\n    eVideoEncodeH265SessionParametersFeedbackInfoKHR = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_FEEDBACK_INFO_KHR,\n    eVideoDecodeH264CapabilitiesKHR                  = VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR,\n    eVideoDecodeH264PictureInfoKHR                   = VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_KHR,\n    eVideoDecodeH264ProfileInfoKHR                   = VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR,\n    eVideoDecodeH264SessionParametersCreateInfoKHR   = VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR,\n    eVideoDecodeH264SessionParametersAddInfoKHR      = VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR,\n    eVideoDecodeH264DpbSlotInfoKHR                   = VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR,\n    eTextureLodGatherFormatPropertiesAMD             = VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD,\n#if defined( VK_USE_PLATFORM_GGP )\n    eStreamDescriptorSurfaceCreateInfoGGP = VK_STRUCTURE_TYPE_STREAM_DESCRIPTOR_SURFACE_CREATE_INFO_GGP,\n#endif /*VK_USE_PLATFORM_GGP*/\n    ePhysicalDeviceCornerSampledImageFeaturesNV = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV,\n    eExternalMemoryImageCreateInfoNV            = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV,\n    eExportMemoryAllocateInfoNV                 = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV,\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n    eImportMemoryWin32HandleInfoNV       = VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV,\n    eExportMemoryWin32HandleInfoNV       = VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV,\n    eWin32KeyedMutexAcquireReleaseInfoNV = VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV,\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n    eValidationFlagsEXT = VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT,\n#if defined( VK_USE_PLATFORM_VI_NN )\n    eViSurfaceCreateInfoNN = VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN,\n#endif /*VK_USE_PLATFORM_VI_NN*/\n    eImageViewAstcDecodeModeEXT          = VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT,\n    ePhysicalDeviceAstcDecodeFeaturesEXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT,\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n    eImportMemoryWin32HandleInfoKHR = VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR,\n    eExportMemoryWin32HandleInfoKHR = VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR,\n    eMemoryWin32HandlePropertiesKHR = VK_STRUCTURE_TYPE_MEMORY_WIN32_HANDLE_PROPERTIES_KHR,\n    eMemoryGetWin32HandleInfoKHR    = VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR,\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n    eImportMemoryFdInfoKHR = VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR,\n    eMemoryFdPropertiesKHR = VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR,\n    eMemoryGetFdInfoKHR    = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR,\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n    eWin32KeyedMutexAcquireReleaseInfoKHR = VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR,\n    eImportSemaphoreWin32HandleInfoKHR    = VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR,\n    eExportSemaphoreWin32HandleInfoKHR    = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR,\n    eD3D12FenceSubmitInfoKHR              = VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR,\n    eSemaphoreGetWin32HandleInfoKHR       = VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR,\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n    eImportSemaphoreFdInfoKHR                              = VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR,\n    eSemaphoreGetFdInfoKHR                                 = VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR,\n    eCommandBufferInheritanceConditionalRenderingInfoEXT   = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT,\n    ePhysicalDeviceConditionalRenderingFeaturesEXT         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT,\n    eConditionalRenderingBeginInfoEXT                      = VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT,\n    ePresentRegionsKHR                                     = VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR,\n    ePipelineViewportWScalingStateCreateInfoNV             = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV,\n    eSurfaceCapabilities2EXT                               = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT,\n    eDisplayPowerInfoEXT                                   = VK_STRUCTURE_TYPE_DISPLAY_POWER_INFO_EXT,\n    eDeviceEventInfoEXT                                    = VK_STRUCTURE_TYPE_DEVICE_EVENT_INFO_EXT,\n    eDisplayEventInfoEXT                                   = VK_STRUCTURE_TYPE_DISPLAY_EVENT_INFO_EXT,\n    eSwapchainCounterCreateInfoEXT                         = VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT,\n    ePresentTimesInfoGOOGLE                                = VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE,\n    ePhysicalDeviceMultiviewPerViewAttributesPropertiesNVX = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX,\n    eMultiviewPerViewAttributesInfoNVX                     = VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX,\n    ePipelineViewportSwizzleStateCreateInfoNV              = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV,\n    ePhysicalDeviceDiscardRectanglePropertiesEXT           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT,\n    ePipelineDiscardRectangleStateCreateInfoEXT            = VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT,\n    ePhysicalDeviceConservativeRasterizationPropertiesEXT  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT,\n    ePipelineRasterizationConservativeStateCreateInfoEXT   = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT,\n    ePhysicalDeviceDepthClipEnableFeaturesEXT              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT,\n    ePipelineRasterizationDepthClipStateCreateInfoEXT      = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT,\n    eHdrMetadataEXT                                        = VK_STRUCTURE_TYPE_HDR_METADATA_EXT,\n    ePhysicalDeviceRelaxedLineRasterizationFeaturesIMG     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG,\n    eSharedPresentSurfaceCapabilitiesKHR                   = VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR,\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n    eImportFenceWin32HandleInfoKHR = VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR,\n    eExportFenceWin32HandleInfoKHR = VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR,\n    eFenceGetWin32HandleInfoKHR    = VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR,\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n    eImportFenceFdInfoKHR                        = VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR,\n    eFenceGetFdInfoKHR                           = VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR,\n    ePhysicalDevicePerformanceQueryFeaturesKHR   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR,\n    ePhysicalDevicePerformanceQueryPropertiesKHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR,\n    eQueryPoolPerformanceCreateInfoKHR           = VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR,\n    ePerformanceQuerySubmitInfoKHR               = VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR,\n    eAcquireProfilingLockInfoKHR                 = VK_STRUCTURE_TYPE_ACQUIRE_PROFILING_LOCK_INFO_KHR,\n    ePerformanceCounterKHR                       = VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_KHR,\n    ePerformanceCounterDescriptionKHR            = VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_DESCRIPTION_KHR,\n    ePhysicalDeviceSurfaceInfo2KHR               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR,\n    eSurfaceCapabilities2KHR                     = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR,\n    eSurfaceFormat2KHR                           = VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR,\n    eDisplayProperties2KHR                       = VK_STRUCTURE_TYPE_DISPLAY_PROPERTIES_2_KHR,\n    eDisplayPlaneProperties2KHR                  = VK_STRUCTURE_TYPE_DISPLAY_PLANE_PROPERTIES_2_KHR,\n    eDisplayModeProperties2KHR                   = VK_STRUCTURE_TYPE_DISPLAY_MODE_PROPERTIES_2_KHR,\n    eDisplayPlaneInfo2KHR                        = VK_STRUCTURE_TYPE_DISPLAY_PLANE_INFO_2_KHR,\n    eDisplayPlaneCapabilities2KHR                = VK_STRUCTURE_TYPE_DISPLAY_PLANE_CAPABILITIES_2_KHR,\n#if defined( VK_USE_PLATFORM_IOS_MVK )\n    eIosSurfaceCreateInfoMVK = VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK,\n#endif /*VK_USE_PLATFORM_IOS_MVK*/\n#if defined( VK_USE_PLATFORM_MACOS_MVK )\n    eMacosSurfaceCreateInfoMVK = VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK,\n#endif /*VK_USE_PLATFORM_MACOS_MVK*/\n    eDebugUtilsObjectNameInfoEXT        = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT,\n    eDebugUtilsObjectTagInfoEXT         = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT,\n    eDebugUtilsLabelEXT                 = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT,\n    eDebugUtilsMessengerCallbackDataEXT = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT,\n    eDebugUtilsMessengerCreateInfoEXT   = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT,\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n    eAndroidHardwareBufferUsageANDROID             = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID,\n    eAndroidHardwareBufferPropertiesANDROID        = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID,\n    eAndroidHardwareBufferFormatPropertiesANDROID  = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID,\n    eImportAndroidHardwareBufferInfoANDROID        = VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID,\n    eMemoryGetAndroidHardwareBufferInfoANDROID     = VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID,\n    eExternalFormatANDROID                         = VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID,\n    eAndroidHardwareBufferFormatProperties2ANDROID = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID,\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n    ePhysicalDeviceShaderEnqueueFeaturesAMDX   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ENQUEUE_FEATURES_AMDX,\n    ePhysicalDeviceShaderEnqueuePropertiesAMDX = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ENQUEUE_PROPERTIES_AMDX,\n    eExecutionGraphPipelineScratchSizeAMDX     = VK_STRUCTURE_TYPE_EXECUTION_GRAPH_PIPELINE_SCRATCH_SIZE_AMDX,\n    eExecutionGraphPipelineCreateInfoAMDX      = VK_STRUCTURE_TYPE_EXECUTION_GRAPH_PIPELINE_CREATE_INFO_AMDX,\n    ePipelineShaderStageNodeCreateInfoAMDX     = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_NODE_CREATE_INFO_AMDX,\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n    eAttachmentSampleCountInfoAMD                      = VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD,\n    eAttachmentSampleCountInfoNV                       = VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_NV,\n    eSampleLocationsInfoEXT                            = VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT,\n    eRenderPassSampleLocationsBeginInfoEXT             = VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT,\n    ePipelineSampleLocationsStateCreateInfoEXT         = VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT,\n    ePhysicalDeviceSampleLocationsPropertiesEXT        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT,\n    eMultisamplePropertiesEXT                          = VK_STRUCTURE_TYPE_MULTISAMPLE_PROPERTIES_EXT,\n    ePhysicalDeviceBlendOperationAdvancedFeaturesEXT   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT,\n    ePhysicalDeviceBlendOperationAdvancedPropertiesEXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT,\n    ePipelineColorBlendAdvancedStateCreateInfoEXT      = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT,\n    ePipelineCoverageToColorStateCreateInfoNV          = VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV,\n    eWriteDescriptorSetAccelerationStructureKHR        = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR,\n    eAccelerationStructureBuildGeometryInfoKHR         = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR,\n    eAccelerationStructureDeviceAddressInfoKHR         = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR,\n    eAccelerationStructureGeometryAabbsDataKHR         = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_AABBS_DATA_KHR,\n    eAccelerationStructureGeometryInstancesDataKHR     = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR,\n    eAccelerationStructureGeometryTrianglesDataKHR     = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR,\n    eAccelerationStructureGeometryKHR                  = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR,\n    eAccelerationStructureVersionInfoKHR               = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_VERSION_INFO_KHR,\n    eCopyAccelerationStructureInfoKHR                  = VK_STRUCTURE_TYPE_COPY_ACCELERATION_STRUCTURE_INFO_KHR,\n    eCopyAccelerationStructureToMemoryInfoKHR          = VK_STRUCTURE_TYPE_COPY_ACCELERATION_STRUCTURE_TO_MEMORY_INFO_KHR,\n    eCopyMemoryToAccelerationStructureInfoKHR          = VK_STRUCTURE_TYPE_COPY_MEMORY_TO_ACCELERATION_STRUCTURE_INFO_KHR,\n    ePhysicalDeviceAccelerationStructureFeaturesKHR    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR,\n    ePhysicalDeviceAccelerationStructurePropertiesKHR  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR,\n    eAccelerationStructureCreateInfoKHR                = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR,\n    eAccelerationStructureBuildSizesInfoKHR            = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR,\n    ePhysicalDeviceRayTracingPipelineFeaturesKHR       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR,\n    ePhysicalDeviceRayTracingPipelinePropertiesKHR     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR,\n    eRayTracingPipelineCreateInfoKHR                   = VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR,\n    eRayTracingShaderGroupCreateInfoKHR                = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR,\n    eRayTracingPipelineInterfaceCreateInfoKHR          = VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_INTERFACE_CREATE_INFO_KHR,\n    ePhysicalDeviceRayQueryFeaturesKHR                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR,\n    ePipelineCoverageModulationStateCreateInfoNV       = VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV,\n    ePhysicalDeviceShaderSmBuiltinsFeaturesNV          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV,\n    ePhysicalDeviceShaderSmBuiltinsPropertiesNV        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV,\n    eDrmFormatModifierPropertiesListEXT                = VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT,\n    ePhysicalDeviceImageDrmFormatModifierInfoEXT       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT,\n    eImageDrmFormatModifierListCreateInfoEXT           = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT,\n    eImageDrmFormatModifierExplicitCreateInfoEXT       = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT,\n    eImageDrmFormatModifierPropertiesEXT               = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT,\n    eDrmFormatModifierPropertiesList2EXT               = VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT,\n    eValidationCacheCreateInfoEXT                      = VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT,\n    eShaderModuleValidationCacheCreateInfoEXT          = VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT,\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n    ePhysicalDevicePortabilitySubsetFeaturesKHR   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR,\n    ePhysicalDevicePortabilitySubsetPropertiesKHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR,\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n    ePipelineViewportShadingRateImageStateCreateInfoNV   = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV,\n    ePhysicalDeviceShadingRateImageFeaturesNV            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV,\n    ePhysicalDeviceShadingRateImagePropertiesNV          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV,\n    ePipelineViewportCoarseSampleOrderStateCreateInfoNV  = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV,\n    eRayTracingPipelineCreateInfoNV                      = VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV,\n    eAccelerationStructureCreateInfoNV                   = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV,\n    eGeometryNV                                          = VK_STRUCTURE_TYPE_GEOMETRY_NV,\n    eGeometryTrianglesNV                                 = VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV,\n    eGeometryAabbNV                                      = VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV,\n    eBindAccelerationStructureMemoryInfoNV               = VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_NV,\n    eWriteDescriptorSetAccelerationStructureNV           = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV,\n    eAccelerationStructureMemoryRequirementsInfoNV       = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NV,\n    ePhysicalDeviceRayTracingPropertiesNV                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV,\n    eRayTracingShaderGroupCreateInfoNV                   = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV,\n    eAccelerationStructureInfoNV                         = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV,\n    ePhysicalDeviceRepresentativeFragmentTestFeaturesNV  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV,\n    ePipelineRepresentativeFragmentTestStateCreateInfoNV = VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV,\n    ePhysicalDeviceImageViewImageFormatInfoEXT           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT,\n    eFilterCubicImageViewImageFormatPropertiesEXT        = VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT,\n    eImportMemoryHostPointerInfoEXT                      = VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT,\n    eMemoryHostPointerPropertiesEXT                      = VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT,\n    ePhysicalDeviceExternalMemoryHostPropertiesEXT       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT,\n    ePhysicalDeviceShaderClockFeaturesKHR                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR,\n    ePipelineCompilerControlCreateInfoAMD                = VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD,\n    ePhysicalDeviceShaderCorePropertiesAMD               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD,\n    eVideoDecodeH265CapabilitiesKHR                      = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR,\n    eVideoDecodeH265SessionParametersCreateInfoKHR       = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR,\n    eVideoDecodeH265SessionParametersAddInfoKHR          = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR,\n    eVideoDecodeH265ProfileInfoKHR                       = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR,\n    eVideoDecodeH265PictureInfoKHR                       = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_KHR,\n    eVideoDecodeH265DpbSlotInfoKHR                       = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR,\n    eDeviceMemoryOverallocationCreateInfoAMD             = VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD,\n    ePhysicalDeviceVertexAttributeDivisorPropertiesEXT   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT,\n#if defined( VK_USE_PLATFORM_GGP )\n    ePresentFrameTokenGGP = VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP,\n#endif /*VK_USE_PLATFORM_GGP*/\n    ePhysicalDeviceMeshShaderFeaturesNV                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV,\n    ePhysicalDeviceMeshShaderPropertiesNV               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV,\n    ePhysicalDeviceShaderImageFootprintFeaturesNV       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV,\n    ePipelineViewportExclusiveScissorStateCreateInfoNV  = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV,\n    ePhysicalDeviceExclusiveScissorFeaturesNV           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV,\n    eCheckpointDataNV                                   = VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV,\n    eQueueFamilyCheckpointPropertiesNV                  = VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV,\n    eQueueFamilyCheckpointProperties2NV                 = VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV,\n    eCheckpointData2NV                                  = VK_STRUCTURE_TYPE_CHECKPOINT_DATA_2_NV,\n    ePhysicalDeviceShaderIntegerFunctions2FeaturesINTEL = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL,\n    eQueryPoolPerformanceQueryCreateInfoINTEL           = VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL,\n    eQueryPoolCreateInfoINTEL                           = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL,\n    eInitializePerformanceApiInfoINTEL                  = VK_STRUCTURE_TYPE_INITIALIZE_PERFORMANCE_API_INFO_INTEL,\n    ePerformanceMarkerInfoINTEL                         = VK_STRUCTURE_TYPE_PERFORMANCE_MARKER_INFO_INTEL,\n    ePerformanceStreamMarkerInfoINTEL                   = VK_STRUCTURE_TYPE_PERFORMANCE_STREAM_MARKER_INFO_INTEL,\n    ePerformanceOverrideInfoINTEL                       = VK_STRUCTURE_TYPE_PERFORMANCE_OVERRIDE_INFO_INTEL,\n    ePerformanceConfigurationAcquireInfoINTEL           = VK_STRUCTURE_TYPE_PERFORMANCE_CONFIGURATION_ACQUIRE_INFO_INTEL,\n    ePhysicalDevicePciBusInfoPropertiesEXT              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT,\n    eDisplayNativeHdrSurfaceCapabilitiesAMD             = VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD,\n    eSwapchainDisplayNativeHdrCreateInfoAMD             = VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD,\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n    eImagepipeSurfaceCreateInfoFUCHSIA = VK_STRUCTURE_TYPE_IMAGEPIPE_SURFACE_CREATE_INFO_FUCHSIA,\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n    eMetalSurfaceCreateInfoEXT = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT,\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n    ePhysicalDeviceFragmentDensityMapFeaturesEXT              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT,\n    ePhysicalDeviceFragmentDensityMapPropertiesEXT            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT,\n    eRenderPassFragmentDensityMapCreateInfoEXT                = VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT,\n    eRenderingFragmentDensityMapAttachmentInfoEXT             = VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT,\n    eFragmentShadingRateAttachmentInfoKHR                     = VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR,\n    ePipelineFragmentShadingRateStateCreateInfoKHR            = VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR,\n    ePhysicalDeviceFragmentShadingRatePropertiesKHR           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR,\n    ePhysicalDeviceFragmentShadingRateFeaturesKHR             = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR,\n    ePhysicalDeviceFragmentShadingRateKHR                     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_KHR,\n    eRenderingFragmentShadingRateAttachmentInfoKHR            = VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR,\n    ePhysicalDeviceShaderCoreProperties2AMD                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD,\n    ePhysicalDeviceCoherentMemoryFeaturesAMD                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD,\n    ePhysicalDeviceShaderImageAtomicInt64FeaturesEXT          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT,\n    ePhysicalDeviceShaderQuadControlFeaturesKHR               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_QUAD_CONTROL_FEATURES_KHR,\n    ePhysicalDeviceMemoryBudgetPropertiesEXT                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT,\n    ePhysicalDeviceMemoryPriorityFeaturesEXT                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT,\n    eMemoryPriorityAllocateInfoEXT                            = VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT,\n    eSurfaceProtectedCapabilitiesKHR                          = VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR,\n    ePhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV,\n    ePhysicalDeviceBufferDeviceAddressFeaturesEXT             = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT,\n    ePhysicalDeviceBufferAddressFeaturesEXT                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT,\n    eBufferDeviceAddressCreateInfoEXT                         = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT,\n    eValidationFeaturesEXT                                    = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT,\n    ePhysicalDevicePresentWaitFeaturesKHR                     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR,\n    ePhysicalDeviceCooperativeMatrixFeaturesNV                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV,\n    eCooperativeMatrixPropertiesNV                            = VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_NV,\n    ePhysicalDeviceCooperativeMatrixPropertiesNV              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV,\n    ePhysicalDeviceCoverageReductionModeFeaturesNV            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV,\n    ePipelineCoverageReductionStateCreateInfoNV               = VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV,\n    eFramebufferMixedSamplesCombinationNV                     = VK_STRUCTURE_TYPE_FRAMEBUFFER_MIXED_SAMPLES_COMBINATION_NV,\n    ePhysicalDeviceFragmentShaderInterlockFeaturesEXT         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT,\n    ePhysicalDeviceYcbcrImageArraysFeaturesEXT                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT,\n    ePhysicalDeviceProvokingVertexFeaturesEXT                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT,\n    ePipelineRasterizationProvokingVertexStateCreateInfoEXT   = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT,\n    ePhysicalDeviceProvokingVertexPropertiesEXT               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT,\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n    eSurfaceFullScreenExclusiveInfoEXT         = VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT,\n    eSurfaceCapabilitiesFullScreenExclusiveEXT = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT,\n    eSurfaceFullScreenExclusiveWin32InfoEXT    = VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT,\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n    eHeadlessSurfaceCreateInfoEXT                          = VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT,\n    ePhysicalDeviceShaderAtomicFloatFeaturesEXT            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT,\n    ePhysicalDeviceExtendedDynamicStateFeaturesEXT         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT,\n    ePhysicalDevicePipelineExecutablePropertiesFeaturesKHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR,\n    ePipelineInfoKHR                                       = VK_STRUCTURE_TYPE_PIPELINE_INFO_KHR,\n    ePipelineInfoEXT                                       = VK_STRUCTURE_TYPE_PIPELINE_INFO_EXT,\n    ePipelineExecutablePropertiesKHR                       = VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_PROPERTIES_KHR,\n    ePipelineExecutableInfoKHR                             = VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR,\n    ePipelineExecutableStatisticKHR                        = VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR,\n    ePipelineExecutableInternalRepresentationKHR           = VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR,\n    ePhysicalDeviceMapMemoryPlacedFeaturesEXT              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_FEATURES_EXT,\n    ePhysicalDeviceMapMemoryPlacedPropertiesEXT            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_PROPERTIES_EXT,\n    eMemoryMapPlacedInfoEXT                                = VK_STRUCTURE_TYPE_MEMORY_MAP_PLACED_INFO_EXT,\n    ePhysicalDeviceShaderAtomicFloat2FeaturesEXT           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT,\n    eSurfacePresentModeEXT                                 = VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT,\n    eSurfacePresentScalingCapabilitiesEXT                  = VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_EXT,\n    eSurfacePresentModeCompatibilityEXT                    = VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_EXT,\n    ePhysicalDeviceSwapchainMaintenance1FeaturesEXT        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT,\n    eSwapchainPresentFenceInfoEXT                          = VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT,\n    eSwapchainPresentModesCreateInfoEXT                    = VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT,\n    eSwapchainPresentModeInfoEXT                           = VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT,\n    eSwapchainPresentScalingCreateInfoEXT                  = VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT,\n    eReleaseSwapchainImagesInfoEXT                         = VK_STRUCTURE_TYPE_RELEASE_SWAPCHAIN_IMAGES_INFO_EXT,\n    ePhysicalDeviceDeviceGeneratedCommandsPropertiesNV     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV,\n    eGraphicsShaderGroupCreateInfoNV                       = VK_STRUCTURE_TYPE_GRAPHICS_SHADER_GROUP_CREATE_INFO_NV,\n    eGraphicsPipelineShaderGroupsCreateInfoNV              = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV,\n    eIndirectCommandsLayoutTokenNV                         = VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_TOKEN_NV,\n    eIndirectCommandsLayoutCreateInfoNV                    = VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NV,\n    eGeneratedCommandsInfoNV                               = VK_STRUCTURE_TYPE_GENERATED_COMMANDS_INFO_NV,\n    eGeneratedCommandsMemoryRequirementsInfoNV             = VK_STRUCTURE_TYPE_GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_NV,\n    ePhysicalDeviceDeviceGeneratedCommandsFeaturesNV       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV,\n    ePhysicalDeviceInheritedViewportScissorFeaturesNV      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV,\n    eCommandBufferInheritanceViewportScissorInfoNV         = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV,\n    ePhysicalDeviceTexelBufferAlignmentFeaturesEXT         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT,\n    eCommandBufferInheritanceRenderPassTransformInfoQCOM   = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM,\n    eRenderPassTransformBeginInfoQCOM                      = VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM,\n    ePhysicalDeviceDepthBiasControlFeaturesEXT             = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_BIAS_CONTROL_FEATURES_EXT,\n    eDepthBiasInfoEXT                                      = VK_STRUCTURE_TYPE_DEPTH_BIAS_INFO_EXT,\n    eDepthBiasRepresentationInfoEXT                        = VK_STRUCTURE_TYPE_DEPTH_BIAS_REPRESENTATION_INFO_EXT,\n    ePhysicalDeviceDeviceMemoryReportFeaturesEXT           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT,\n    eDeviceDeviceMemoryReportCreateInfoEXT                 = VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT,\n    eDeviceMemoryReportCallbackDataEXT                     = VK_STRUCTURE_TYPE_DEVICE_MEMORY_REPORT_CALLBACK_DATA_EXT,\n    ePhysicalDeviceRobustness2FeaturesEXT                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT,\n    ePhysicalDeviceRobustness2PropertiesEXT                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT,\n    eSamplerCustomBorderColorCreateInfoEXT                 = VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT,\n    ePhysicalDeviceCustomBorderColorPropertiesEXT          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT,\n    ePhysicalDeviceCustomBorderColorFeaturesEXT            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT,\n    ePipelineLibraryCreateInfoKHR                          = VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR,\n    ePhysicalDevicePresentBarrierFeaturesNV                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_BARRIER_FEATURES_NV,\n    eSurfaceCapabilitiesPresentBarrierNV                   = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_PRESENT_BARRIER_NV,\n    eSwapchainPresentBarrierCreateInfoNV                   = VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_BARRIER_CREATE_INFO_NV,\n    ePresentIdKHR                                          = VK_STRUCTURE_TYPE_PRESENT_ID_KHR,\n    ePhysicalDevicePresentIdFeaturesKHR                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR,\n    eVideoEncodeInfoKHR                                    = VK_STRUCTURE_TYPE_VIDEO_ENCODE_INFO_KHR,\n    eVideoEncodeRateControlInfoKHR                         = VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR,\n    eVideoEncodeRateControlLayerInfoKHR                    = VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_LAYER_INFO_KHR,\n    eVideoEncodeCapabilitiesKHR                            = VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR,\n    eVideoEncodeUsageInfoKHR                               = VK_STRUCTURE_TYPE_VIDEO_ENCODE_USAGE_INFO_KHR,\n    eQueryPoolVideoEncodeFeedbackCreateInfoKHR             = VK_STRUCTURE_TYPE_QUERY_POOL_VIDEO_ENCODE_FEEDBACK_CREATE_INFO_KHR,\n    ePhysicalDeviceVideoEncodeQualityLevelInfoKHR          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_QUALITY_LEVEL_INFO_KHR,\n    eVideoEncodeQualityLevelPropertiesKHR                  = VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUALITY_LEVEL_PROPERTIES_KHR,\n    eVideoEncodeQualityLevelInfoKHR                        = VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUALITY_LEVEL_INFO_KHR,\n    eVideoEncodeSessionParametersGetInfoKHR                = VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_PARAMETERS_GET_INFO_KHR,\n    eVideoEncodeSessionParametersFeedbackInfoKHR           = VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_PARAMETERS_FEEDBACK_INFO_KHR,\n    ePhysicalDeviceDiagnosticsConfigFeaturesNV             = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV,\n    eDeviceDiagnosticsConfigCreateInfoNV                   = VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV,\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n    eCudaModuleCreateInfoNV                     = VK_STRUCTURE_TYPE_CUDA_MODULE_CREATE_INFO_NV,\n    eCudaFunctionCreateInfoNV                   = VK_STRUCTURE_TYPE_CUDA_FUNCTION_CREATE_INFO_NV,\n    eCudaLaunchInfoNV                           = VK_STRUCTURE_TYPE_CUDA_LAUNCH_INFO_NV,\n    ePhysicalDeviceCudaKernelLaunchFeaturesNV   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUDA_KERNEL_LAUNCH_FEATURES_NV,\n    ePhysicalDeviceCudaKernelLaunchPropertiesNV = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUDA_KERNEL_LAUNCH_PROPERTIES_NV,\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n    eQueryLowLatencySupportNV = VK_STRUCTURE_TYPE_QUERY_LOW_LATENCY_SUPPORT_NV,\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n    eExportMetalObjectCreateInfoEXT = VK_STRUCTURE_TYPE_EXPORT_METAL_OBJECT_CREATE_INFO_EXT,\n    eExportMetalObjectsInfoEXT      = VK_STRUCTURE_TYPE_EXPORT_METAL_OBJECTS_INFO_EXT,\n    eExportMetalDeviceInfoEXT       = VK_STRUCTURE_TYPE_EXPORT_METAL_DEVICE_INFO_EXT,\n    eExportMetalCommandQueueInfoEXT = VK_STRUCTURE_TYPE_EXPORT_METAL_COMMAND_QUEUE_INFO_EXT,\n    eExportMetalBufferInfoEXT       = VK_STRUCTURE_TYPE_EXPORT_METAL_BUFFER_INFO_EXT,\n    eImportMetalBufferInfoEXT       = VK_STRUCTURE_TYPE_IMPORT_METAL_BUFFER_INFO_EXT,\n    eExportMetalTextureInfoEXT      = VK_STRUCTURE_TYPE_EXPORT_METAL_TEXTURE_INFO_EXT,\n    eImportMetalTextureInfoEXT      = VK_STRUCTURE_TYPE_IMPORT_METAL_TEXTURE_INFO_EXT,\n    eExportMetalIoSurfaceInfoEXT    = VK_STRUCTURE_TYPE_EXPORT_METAL_IO_SURFACE_INFO_EXT,\n    eImportMetalIoSurfaceInfoEXT    = VK_STRUCTURE_TYPE_IMPORT_METAL_IO_SURFACE_INFO_EXT,\n    eExportMetalSharedEventInfoEXT  = VK_STRUCTURE_TYPE_EXPORT_METAL_SHARED_EVENT_INFO_EXT,\n    eImportMetalSharedEventInfoEXT  = VK_STRUCTURE_TYPE_IMPORT_METAL_SHARED_EVENT_INFO_EXT,\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n    ePhysicalDeviceDescriptorBufferPropertiesEXT               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT,\n    ePhysicalDeviceDescriptorBufferDensityMapPropertiesEXT     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_DENSITY_MAP_PROPERTIES_EXT,\n    ePhysicalDeviceDescriptorBufferFeaturesEXT                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT,\n    eDescriptorAddressInfoEXT                                  = VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT,\n    eDescriptorGetInfoEXT                                      = VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT,\n    eBufferCaptureDescriptorDataInfoEXT                        = VK_STRUCTURE_TYPE_BUFFER_CAPTURE_DESCRIPTOR_DATA_INFO_EXT,\n    eImageCaptureDescriptorDataInfoEXT                         = VK_STRUCTURE_TYPE_IMAGE_CAPTURE_DESCRIPTOR_DATA_INFO_EXT,\n    eImageViewCaptureDescriptorDataInfoEXT                     = VK_STRUCTURE_TYPE_IMAGE_VIEW_CAPTURE_DESCRIPTOR_DATA_INFO_EXT,\n    eSamplerCaptureDescriptorDataInfoEXT                       = VK_STRUCTURE_TYPE_SAMPLER_CAPTURE_DESCRIPTOR_DATA_INFO_EXT,\n    eOpaqueCaptureDescriptorDataCreateInfoEXT                  = VK_STRUCTURE_TYPE_OPAQUE_CAPTURE_DESCRIPTOR_DATA_CREATE_INFO_EXT,\n    eDescriptorBufferBindingInfoEXT                            = VK_STRUCTURE_TYPE_DESCRIPTOR_BUFFER_BINDING_INFO_EXT,\n    eDescriptorBufferBindingPushDescriptorBufferHandleEXT      = VK_STRUCTURE_TYPE_DESCRIPTOR_BUFFER_BINDING_PUSH_DESCRIPTOR_BUFFER_HANDLE_EXT,\n    eAccelerationStructureCaptureDescriptorDataInfoEXT         = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CAPTURE_DESCRIPTOR_DATA_INFO_EXT,\n    ePhysicalDeviceGraphicsPipelineLibraryFeaturesEXT          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT,\n    ePhysicalDeviceGraphicsPipelineLibraryPropertiesEXT        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_PROPERTIES_EXT,\n    eGraphicsPipelineLibraryCreateInfoEXT                      = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_LIBRARY_CREATE_INFO_EXT,\n    ePhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_FEATURES_AMD,\n    ePhysicalDeviceFragmentShaderBarycentricFeaturesKHR        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR,\n    ePhysicalDeviceFragmentShaderBarycentricFeaturesNV         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV,\n    ePhysicalDeviceFragmentShaderBarycentricPropertiesKHR      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_PROPERTIES_KHR,\n    ePhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR,\n    ePhysicalDeviceFragmentShadingRateEnumsPropertiesNV        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV,\n    ePhysicalDeviceFragmentShadingRateEnumsFeaturesNV          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV,\n    ePipelineFragmentShadingRateEnumStateCreateInfoNV          = VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV,\n    eAccelerationStructureGeometryMotionTrianglesDataNV        = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV,\n    ePhysicalDeviceRayTracingMotionBlurFeaturesNV              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV,\n    eAccelerationStructureMotionInfoNV                         = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV,\n    ePhysicalDeviceMeshShaderFeaturesEXT                       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT,\n    ePhysicalDeviceMeshShaderPropertiesEXT                     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_EXT,\n    ePhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT,\n    ePhysicalDeviceFragmentDensityMap2FeaturesEXT              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT,\n    ePhysicalDeviceFragmentDensityMap2PropertiesEXT            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT,\n    eCopyCommandTransformInfoQCOM                              = VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM,\n    ePhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR,\n    ePhysicalDeviceImageCompressionControlFeaturesEXT          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT,\n    eImageCompressionControlEXT                                = VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_CONTROL_EXT,\n    eImageCompressionPropertiesEXT                             = VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_PROPERTIES_EXT,\n    ePhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT,\n    ePhysicalDevice4444FormatsFeaturesEXT                      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT,\n    ePhysicalDeviceFaultFeaturesEXT                            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_FEATURES_EXT,\n    eDeviceFaultCountsEXT                                      = VK_STRUCTURE_TYPE_DEVICE_FAULT_COUNTS_EXT,\n    eDeviceFaultInfoEXT                                        = VK_STRUCTURE_TYPE_DEVICE_FAULT_INFO_EXT,\n    ePhysicalDeviceRgba10X6FormatsFeaturesEXT                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT,\n#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n    eDirectfbSurfaceCreateInfoEXT = VK_STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT,\n#endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n    ePhysicalDeviceVertexInputDynamicStateFeaturesEXT      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT,\n    eVertexInputBindingDescription2EXT                     = VK_STRUCTURE_TYPE_VERTEX_INPUT_BINDING_DESCRIPTION_2_EXT,\n    eVertexInputAttributeDescription2EXT                   = VK_STRUCTURE_TYPE_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT,\n    ePhysicalDeviceDrmPropertiesEXT                        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT,\n    ePhysicalDeviceAddressBindingReportFeaturesEXT         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ADDRESS_BINDING_REPORT_FEATURES_EXT,\n    eDeviceAddressBindingCallbackDataEXT                   = VK_STRUCTURE_TYPE_DEVICE_ADDRESS_BINDING_CALLBACK_DATA_EXT,\n    ePhysicalDeviceDepthClipControlFeaturesEXT             = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT,\n    ePipelineViewportDepthClipControlCreateInfoEXT         = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_DEPTH_CLIP_CONTROL_CREATE_INFO_EXT,\n    ePhysicalDevicePrimitiveTopologyListRestartFeaturesEXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT,\n    ePhysicalDevicePresentModeFifoLatestReadyFeaturesEXT   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_MODE_FIFO_LATEST_READY_FEATURES_EXT,\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n    eImportMemoryZirconHandleInfoFUCHSIA     = VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA,\n    eMemoryZirconHandlePropertiesFUCHSIA     = VK_STRUCTURE_TYPE_MEMORY_ZIRCON_HANDLE_PROPERTIES_FUCHSIA,\n    eMemoryGetZirconHandleInfoFUCHSIA        = VK_STRUCTURE_TYPE_MEMORY_GET_ZIRCON_HANDLE_INFO_FUCHSIA,\n    eImportSemaphoreZirconHandleInfoFUCHSIA  = VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_ZIRCON_HANDLE_INFO_FUCHSIA,\n    eSemaphoreGetZirconHandleInfoFUCHSIA     = VK_STRUCTURE_TYPE_SEMAPHORE_GET_ZIRCON_HANDLE_INFO_FUCHSIA,\n    eBufferCollectionCreateInfoFUCHSIA       = VK_STRUCTURE_TYPE_BUFFER_COLLECTION_CREATE_INFO_FUCHSIA,\n    eImportMemoryBufferCollectionFUCHSIA     = VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA,\n    eBufferCollectionImageCreateInfoFUCHSIA  = VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA,\n    eBufferCollectionPropertiesFUCHSIA       = VK_STRUCTURE_TYPE_BUFFER_COLLECTION_PROPERTIES_FUCHSIA,\n    eBufferConstraintsInfoFUCHSIA            = VK_STRUCTURE_TYPE_BUFFER_CONSTRAINTS_INFO_FUCHSIA,\n    eBufferCollectionBufferCreateInfoFUCHSIA = VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA,\n    eImageConstraintsInfoFUCHSIA             = VK_STRUCTURE_TYPE_IMAGE_CONSTRAINTS_INFO_FUCHSIA,\n    eImageFormatConstraintsInfoFUCHSIA       = VK_STRUCTURE_TYPE_IMAGE_FORMAT_CONSTRAINTS_INFO_FUCHSIA,\n    eSysmemColorSpaceFUCHSIA                 = VK_STRUCTURE_TYPE_SYSMEM_COLOR_SPACE_FUCHSIA,\n    eBufferCollectionConstraintsInfoFUCHSIA  = VK_STRUCTURE_TYPE_BUFFER_COLLECTION_CONSTRAINTS_INFO_FUCHSIA,\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n    eSubpassShadingPipelineCreateInfoHUAWEI                     = VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI,\n    ePhysicalDeviceSubpassShadingFeaturesHUAWEI                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI,\n    ePhysicalDeviceSubpassShadingPropertiesHUAWEI               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI,\n    ePhysicalDeviceInvocationMaskFeaturesHUAWEI                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI,\n    eMemoryGetRemoteAddressInfoNV                               = VK_STRUCTURE_TYPE_MEMORY_GET_REMOTE_ADDRESS_INFO_NV,\n    ePhysicalDeviceExternalMemoryRdmaFeaturesNV                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV,\n    ePipelinePropertiesIdentifierEXT                            = VK_STRUCTURE_TYPE_PIPELINE_PROPERTIES_IDENTIFIER_EXT,\n    ePhysicalDevicePipelinePropertiesFeaturesEXT                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROPERTIES_FEATURES_EXT,\n    ePhysicalDeviceFrameBoundaryFeaturesEXT                     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAME_BOUNDARY_FEATURES_EXT,\n    eFrameBoundaryEXT                                           = VK_STRUCTURE_TYPE_FRAME_BOUNDARY_EXT,\n    ePhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT,\n    eSubpassResolvePerformanceQueryEXT                          = VK_STRUCTURE_TYPE_SUBPASS_RESOLVE_PERFORMANCE_QUERY_EXT,\n    eMultisampledRenderToSingleSampledInfoEXT                   = VK_STRUCTURE_TYPE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_INFO_EXT,\n    ePhysicalDeviceExtendedDynamicState2FeaturesEXT             = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n    eScreenSurfaceCreateInfoQNX = VK_STRUCTURE_TYPE_SCREEN_SURFACE_CREATE_INFO_QNX,\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n    ePhysicalDeviceColorWriteEnableFeaturesEXT         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT,\n    ePipelineColorWriteCreateInfoEXT                   = VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT,\n    ePhysicalDevicePrimitivesGeneratedQueryFeaturesEXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT,\n    ePhysicalDeviceRayTracingMaintenance1FeaturesKHR   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR,\n    ePhysicalDeviceImageViewMinLodFeaturesEXT          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT,\n    eImageViewMinLodCreateInfoEXT                      = VK_STRUCTURE_TYPE_IMAGE_VIEW_MIN_LOD_CREATE_INFO_EXT,\n    ePhysicalDeviceMultiDrawFeaturesEXT                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT,\n    ePhysicalDeviceMultiDrawPropertiesEXT              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT,\n    ePhysicalDeviceImage2DViewOf3DFeaturesEXT          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT,\n    ePhysicalDeviceShaderTileImageFeaturesEXT          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TILE_IMAGE_FEATURES_EXT,\n    ePhysicalDeviceShaderTileImagePropertiesEXT        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TILE_IMAGE_PROPERTIES_EXT,\n    eMicromapBuildInfoEXT                              = VK_STRUCTURE_TYPE_MICROMAP_BUILD_INFO_EXT,\n    eMicromapVersionInfoEXT                            = VK_STRUCTURE_TYPE_MICROMAP_VERSION_INFO_EXT,\n    eCopyMicromapInfoEXT                               = VK_STRUCTURE_TYPE_COPY_MICROMAP_INFO_EXT,\n    eCopyMicromapToMemoryInfoEXT                       = VK_STRUCTURE_TYPE_COPY_MICROMAP_TO_MEMORY_INFO_EXT,\n    eCopyMemoryToMicromapInfoEXT                       = VK_STRUCTURE_TYPE_COPY_MEMORY_TO_MICROMAP_INFO_EXT,\n    ePhysicalDeviceOpacityMicromapFeaturesEXT          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_EXT,\n    ePhysicalDeviceOpacityMicromapPropertiesEXT        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_PROPERTIES_EXT,\n    eMicromapCreateInfoEXT                             = VK_STRUCTURE_TYPE_MICROMAP_CREATE_INFO_EXT,\n    eMicromapBuildSizesInfoEXT                         = VK_STRUCTURE_TYPE_MICROMAP_BUILD_SIZES_INFO_EXT,\n    eAccelerationStructureTrianglesOpacityMicromapEXT  = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_TRIANGLES_OPACITY_MICROMAP_EXT,\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n    ePhysicalDeviceDisplacementMicromapFeaturesNV         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISPLACEMENT_MICROMAP_FEATURES_NV,\n    ePhysicalDeviceDisplacementMicromapPropertiesNV       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISPLACEMENT_MICROMAP_PROPERTIES_NV,\n    eAccelerationStructureTrianglesDisplacementMicromapNV = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_TRIANGLES_DISPLACEMENT_MICROMAP_NV,\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n    ePhysicalDeviceClusterCullingShaderFeaturesHUAWEI            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_FEATURES_HUAWEI,\n    ePhysicalDeviceClusterCullingShaderPropertiesHUAWEI          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_PROPERTIES_HUAWEI,\n    ePhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_VRS_FEATURES_HUAWEI,\n    ePhysicalDeviceBorderColorSwizzleFeaturesEXT                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT,\n    eSamplerBorderColorComponentMappingCreateInfoEXT             = VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT,\n    ePhysicalDevicePageableDeviceLocalMemoryFeaturesEXT          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT,\n    ePhysicalDeviceShaderCorePropertiesARM                       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_ARM,\n    eDeviceQueueShaderCoreControlCreateInfoARM                   = VK_STRUCTURE_TYPE_DEVICE_QUEUE_SHADER_CORE_CONTROL_CREATE_INFO_ARM,\n    ePhysicalDeviceSchedulingControlsFeaturesARM                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_FEATURES_ARM,\n    ePhysicalDeviceSchedulingControlsPropertiesARM               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_PROPERTIES_ARM,\n    ePhysicalDeviceImageSlicedViewOf3DFeaturesEXT                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_SLICED_VIEW_OF_3D_FEATURES_EXT,\n    eImageViewSlicedCreateInfoEXT                                = VK_STRUCTURE_TYPE_IMAGE_VIEW_SLICED_CREATE_INFO_EXT,\n    ePhysicalDeviceDescriptorSetHostMappingFeaturesVALVE         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_SET_HOST_MAPPING_FEATURES_VALVE,\n    eDescriptorSetBindingReferenceVALVE                          = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_BINDING_REFERENCE_VALVE,\n    eDescriptorSetLayoutHostMappingInfoVALVE                     = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_HOST_MAPPING_INFO_VALVE,\n    ePhysicalDeviceNonSeamlessCubeMapFeaturesEXT                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT,\n    ePhysicalDeviceRenderPassStripedFeaturesARM                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RENDER_PASS_STRIPED_FEATURES_ARM,\n    ePhysicalDeviceRenderPassStripedPropertiesARM                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RENDER_PASS_STRIPED_PROPERTIES_ARM,\n    eRenderPassStripeBeginInfoARM                                = VK_STRUCTURE_TYPE_RENDER_PASS_STRIPE_BEGIN_INFO_ARM,\n    eRenderPassStripeInfoARM                                     = VK_STRUCTURE_TYPE_RENDER_PASS_STRIPE_INFO_ARM,\n    eRenderPassStripeSubmitInfoARM                               = VK_STRUCTURE_TYPE_RENDER_PASS_STRIPE_SUBMIT_INFO_ARM,\n    ePhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_QCOM,\n    ePhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_PROPERTIES_QCOM,\n    eSubpassFragmentDensityMapOffsetEndInfoQCOM                  = VK_STRUCTURE_TYPE_SUBPASS_FRAGMENT_DENSITY_MAP_OFFSET_END_INFO_QCOM,\n    ePhysicalDeviceCopyMemoryIndirectFeaturesNV                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_FEATURES_NV,\n    ePhysicalDeviceCopyMemoryIndirectPropertiesNV                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_PROPERTIES_NV,\n    ePhysicalDeviceMemoryDecompressionFeaturesNV                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_NV,\n    ePhysicalDeviceMemoryDecompressionPropertiesNV               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_PROPERTIES_NV,\n    ePhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_COMPUTE_FEATURES_NV,\n    eComputePipelineIndirectBufferInfoNV                         = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_INDIRECT_BUFFER_INFO_NV,\n    ePipelineIndirectDeviceAddressInfoNV                         = VK_STRUCTURE_TYPE_PIPELINE_INDIRECT_DEVICE_ADDRESS_INFO_NV,\n    ePhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_LINEAR_SWEPT_SPHERES_FEATURES_NV,\n    eAccelerationStructureGeometryLinearSweptSpheresDataNV       = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_LINEAR_SWEPT_SPHERES_DATA_NV,\n    eAccelerationStructureGeometrySpheresDataNV                  = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_SPHERES_DATA_NV,\n    ePhysicalDeviceLinearColorAttachmentFeaturesNV               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINEAR_COLOR_ATTACHMENT_FEATURES_NV,\n    ePhysicalDeviceShaderMaximalReconvergenceFeaturesKHR         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MAXIMAL_RECONVERGENCE_FEATURES_KHR,\n    ePhysicalDeviceImageCompressionControlSwapchainFeaturesEXT   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT,\n    ePhysicalDeviceImageProcessingFeaturesQCOM                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_FEATURES_QCOM,\n    ePhysicalDeviceImageProcessingPropertiesQCOM                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_PROPERTIES_QCOM,\n    eImageViewSampleWeightCreateInfoQCOM                         = VK_STRUCTURE_TYPE_IMAGE_VIEW_SAMPLE_WEIGHT_CREATE_INFO_QCOM,\n    ePhysicalDeviceNestedCommandBufferFeaturesEXT                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_FEATURES_EXT,\n    ePhysicalDeviceNestedCommandBufferPropertiesEXT              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_PROPERTIES_EXT,\n    eExternalMemoryAcquireUnmodifiedEXT                          = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_ACQUIRE_UNMODIFIED_EXT,\n    ePhysicalDeviceExtendedDynamicState3FeaturesEXT              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT,\n    ePhysicalDeviceExtendedDynamicState3PropertiesEXT            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_PROPERTIES_EXT,\n    ePhysicalDeviceSubpassMergeFeedbackFeaturesEXT               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT,\n    eRenderPassCreationControlEXT                                = VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_CONTROL_EXT,\n    eRenderPassCreationFeedbackCreateInfoEXT                     = VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_FEEDBACK_CREATE_INFO_EXT,\n    eRenderPassSubpassFeedbackCreateInfoEXT                      = VK_STRUCTURE_TYPE_RENDER_PASS_SUBPASS_FEEDBACK_CREATE_INFO_EXT,\n    eDirectDriverLoadingInfoLUNARG                               = VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_INFO_LUNARG,\n    eDirectDriverLoadingListLUNARG                               = VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_LIST_LUNARG,\n    ePhysicalDeviceShaderModuleIdentifierFeaturesEXT             = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT,\n    ePhysicalDeviceShaderModuleIdentifierPropertiesEXT           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_PROPERTIES_EXT,\n    ePipelineShaderStageModuleIdentifierCreateInfoEXT            = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_MODULE_IDENTIFIER_CREATE_INFO_EXT,\n    eShaderModuleIdentifierEXT                                   = VK_STRUCTURE_TYPE_SHADER_MODULE_IDENTIFIER_EXT,\n    ePhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,\n    ePhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_ARM,\n    ePhysicalDeviceOpticalFlowFeaturesNV                         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_FEATURES_NV,\n    ePhysicalDeviceOpticalFlowPropertiesNV                       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_PROPERTIES_NV,\n    eOpticalFlowImageFormatInfoNV                                = VK_STRUCTURE_TYPE_OPTICAL_FLOW_IMAGE_FORMAT_INFO_NV,\n    eOpticalFlowImageFormatPropertiesNV                          = VK_STRUCTURE_TYPE_OPTICAL_FLOW_IMAGE_FORMAT_PROPERTIES_NV,\n    eOpticalFlowSessionCreateInfoNV                              = VK_STRUCTURE_TYPE_OPTICAL_FLOW_SESSION_CREATE_INFO_NV,\n    eOpticalFlowExecuteInfoNV                                    = VK_STRUCTURE_TYPE_OPTICAL_FLOW_EXECUTE_INFO_NV,\n    eOpticalFlowSessionCreatePrivateDataInfoNV                   = VK_STRUCTURE_TYPE_OPTICAL_FLOW_SESSION_CREATE_PRIVATE_DATA_INFO_NV,\n    ePhysicalDeviceLegacyDitheringFeaturesEXT                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_DITHERING_FEATURES_EXT,\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n    ePhysicalDeviceExternalFormatResolveFeaturesANDROID   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FORMAT_RESOLVE_FEATURES_ANDROID,\n    ePhysicalDeviceExternalFormatResolvePropertiesANDROID = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FORMAT_RESOLVE_PROPERTIES_ANDROID,\n    eAndroidHardwareBufferFormatResolvePropertiesANDROID  = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_RESOLVE_PROPERTIES_ANDROID,\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n    ePhysicalDeviceAntiLagFeaturesAMD                            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ANTI_LAG_FEATURES_AMD,\n    eAntiLagDataAMD                                              = VK_STRUCTURE_TYPE_ANTI_LAG_DATA_AMD,\n    eAntiLagPresentationInfoAMD                                  = VK_STRUCTURE_TYPE_ANTI_LAG_PRESENTATION_INFO_AMD,\n    ePhysicalDeviceRayTracingPositionFetchFeaturesKHR            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_POSITION_FETCH_FEATURES_KHR,\n    ePhysicalDeviceShaderObjectFeaturesEXT                       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT,\n    ePhysicalDeviceShaderObjectPropertiesEXT                     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_PROPERTIES_EXT,\n    eShaderCreateInfoEXT                                         = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO_EXT,\n    ePhysicalDevicePipelineBinaryFeaturesKHR                     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_BINARY_FEATURES_KHR,\n    ePipelineBinaryCreateInfoKHR                                 = VK_STRUCTURE_TYPE_PIPELINE_BINARY_CREATE_INFO_KHR,\n    ePipelineBinaryInfoKHR                                       = VK_STRUCTURE_TYPE_PIPELINE_BINARY_INFO_KHR,\n    ePipelineBinaryKeyKHR                                        = VK_STRUCTURE_TYPE_PIPELINE_BINARY_KEY_KHR,\n    ePhysicalDevicePipelineBinaryPropertiesKHR                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_BINARY_PROPERTIES_KHR,\n    eReleaseCapturedPipelineDataInfoKHR                          = VK_STRUCTURE_TYPE_RELEASE_CAPTURED_PIPELINE_DATA_INFO_KHR,\n    ePipelineBinaryDataInfoKHR                                   = VK_STRUCTURE_TYPE_PIPELINE_BINARY_DATA_INFO_KHR,\n    ePipelineCreateInfoKHR                                       = VK_STRUCTURE_TYPE_PIPELINE_CREATE_INFO_KHR,\n    eDevicePipelineBinaryInternalCacheControlKHR                 = VK_STRUCTURE_TYPE_DEVICE_PIPELINE_BINARY_INTERNAL_CACHE_CONTROL_KHR,\n    ePipelineBinaryHandlesInfoKHR                                = VK_STRUCTURE_TYPE_PIPELINE_BINARY_HANDLES_INFO_KHR,\n    ePhysicalDeviceTilePropertiesFeaturesQCOM                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_PROPERTIES_FEATURES_QCOM,\n    eTilePropertiesQCOM                                          = VK_STRUCTURE_TYPE_TILE_PROPERTIES_QCOM,\n    ePhysicalDeviceAmigoProfilingFeaturesSEC                     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC,\n    eAmigoProfilingSubmitInfoSEC                                 = VK_STRUCTURE_TYPE_AMIGO_PROFILING_SUBMIT_INFO_SEC,\n    ePhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_VIEWPORTS_FEATURES_QCOM,\n    ePhysicalDeviceRayTracingInvocationReorderFeaturesNV         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV,\n    ePhysicalDeviceRayTracingInvocationReorderPropertiesNV       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV,\n    ePhysicalDeviceCooperativeVectorFeaturesNV                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_VECTOR_FEATURES_NV,\n    ePhysicalDeviceCooperativeVectorPropertiesNV                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_VECTOR_PROPERTIES_NV,\n    eCooperativeVectorPropertiesNV                               = VK_STRUCTURE_TYPE_COOPERATIVE_VECTOR_PROPERTIES_NV,\n    eConvertCooperativeVectorMatrixInfoNV                        = VK_STRUCTURE_TYPE_CONVERT_COOPERATIVE_VECTOR_MATRIX_INFO_NV,\n    ePhysicalDeviceExtendedSparseAddressSpaceFeaturesNV          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_SPARSE_ADDRESS_SPACE_FEATURES_NV,\n    ePhysicalDeviceExtendedSparseAddressSpacePropertiesNV        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_SPARSE_ADDRESS_SPACE_PROPERTIES_NV,\n    ePhysicalDeviceMutableDescriptorTypeFeaturesEXT              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT,\n    ePhysicalDeviceMutableDescriptorTypeFeaturesVALVE            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE,\n    eMutableDescriptorTypeCreateInfoEXT                          = VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT,\n    eMutableDescriptorTypeCreateInfoVALVE                        = VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE,\n    ePhysicalDeviceLegacyVertexAttributesFeaturesEXT             = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_VERTEX_ATTRIBUTES_FEATURES_EXT,\n    ePhysicalDeviceLegacyVertexAttributesPropertiesEXT           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_VERTEX_ATTRIBUTES_PROPERTIES_EXT,\n    eLayerSettingsCreateInfoEXT                                  = VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT,\n    ePhysicalDeviceShaderCoreBuiltinsFeaturesARM                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_FEATURES_ARM,\n    ePhysicalDeviceShaderCoreBuiltinsPropertiesARM               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_PROPERTIES_ARM,\n    ePhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_LIBRARY_GROUP_HANDLES_FEATURES_EXT,\n    ePhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_FEATURES_EXT,\n    eLatencySleepModeInfoNV                                      = VK_STRUCTURE_TYPE_LATENCY_SLEEP_MODE_INFO_NV,\n    eLatencySleepInfoNV                                          = VK_STRUCTURE_TYPE_LATENCY_SLEEP_INFO_NV,\n    eSetLatencyMarkerInfoNV                                      = VK_STRUCTURE_TYPE_SET_LATENCY_MARKER_INFO_NV,\n    eGetLatencyMarkerInfoNV                                      = VK_STRUCTURE_TYPE_GET_LATENCY_MARKER_INFO_NV,\n    eLatencyTimingsFrameReportNV                                 = VK_STRUCTURE_TYPE_LATENCY_TIMINGS_FRAME_REPORT_NV,\n    eLatencySubmissionPresentIdNV                                = VK_STRUCTURE_TYPE_LATENCY_SUBMISSION_PRESENT_ID_NV,\n    eOutOfBandQueueTypeInfoNV                                    = VK_STRUCTURE_TYPE_OUT_OF_BAND_QUEUE_TYPE_INFO_NV,\n    eSwapchainLatencyCreateInfoNV                                = VK_STRUCTURE_TYPE_SWAPCHAIN_LATENCY_CREATE_INFO_NV,\n    eLatencySurfaceCapabilitiesNV                                = VK_STRUCTURE_TYPE_LATENCY_SURFACE_CAPABILITIES_NV,\n    ePhysicalDeviceCooperativeMatrixFeaturesKHR                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR,\n    eCooperativeMatrixPropertiesKHR                              = VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_KHR,\n    ePhysicalDeviceCooperativeMatrixPropertiesKHR                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_KHR,\n    ePhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_RENDER_AREAS_FEATURES_QCOM,\n    eMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM          = VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_RENDER_AREAS_RENDER_PASS_BEGIN_INFO_QCOM,\n    ePhysicalDeviceComputeShaderDerivativesFeaturesKHR           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_KHR,\n    ePhysicalDeviceComputeShaderDerivativesFeaturesNV            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV,\n    ePhysicalDeviceComputeShaderDerivativesPropertiesKHR         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_PROPERTIES_KHR,\n    eVideoDecodeAv1CapabilitiesKHR                               = VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_CAPABILITIES_KHR,\n    eVideoDecodeAv1PictureInfoKHR                                = VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PICTURE_INFO_KHR,\n    eVideoDecodeAv1ProfileInfoKHR                                = VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PROFILE_INFO_KHR,\n    eVideoDecodeAv1SessionParametersCreateInfoKHR                = VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_SESSION_PARAMETERS_CREATE_INFO_KHR,\n    eVideoDecodeAv1DpbSlotInfoKHR                                = VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_DPB_SLOT_INFO_KHR,\n    eVideoEncodeAv1CapabilitiesKHR                               = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_CAPABILITIES_KHR,\n    eVideoEncodeAv1SessionParametersCreateInfoKHR                = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_SESSION_PARAMETERS_CREATE_INFO_KHR,\n    eVideoEncodeAv1PictureInfoKHR                                = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PICTURE_INFO_KHR,\n    eVideoEncodeAv1DpbSlotInfoKHR                                = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_DPB_SLOT_INFO_KHR,\n    ePhysicalDeviceVideoEncodeAv1FeaturesKHR                     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_AV1_FEATURES_KHR,\n    eVideoEncodeAv1ProfileInfoKHR                                = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PROFILE_INFO_KHR,\n    eVideoEncodeAv1RateControlInfoKHR                            = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_RATE_CONTROL_INFO_KHR,\n    eVideoEncodeAv1RateControlLayerInfoKHR                       = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_RATE_CONTROL_LAYER_INFO_KHR,\n    eVideoEncodeAv1QualityLevelPropertiesKHR                     = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_QUALITY_LEVEL_PROPERTIES_KHR,\n    eVideoEncodeAv1SessionCreateInfoKHR                          = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_SESSION_CREATE_INFO_KHR,\n    eVideoEncodeAv1GopRemainingFrameInfoKHR                      = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_GOP_REMAINING_FRAME_INFO_KHR,\n    ePhysicalDeviceVideoMaintenance1FeaturesKHR                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR,\n    eVideoInlineQueryInfoKHR                                     = VK_STRUCTURE_TYPE_VIDEO_INLINE_QUERY_INFO_KHR,\n    ePhysicalDevicePerStageDescriptorSetFeaturesNV               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PER_STAGE_DESCRIPTOR_SET_FEATURES_NV,\n    ePhysicalDeviceImageProcessing2FeaturesQCOM                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_2_FEATURES_QCOM,\n    ePhysicalDeviceImageProcessing2PropertiesQCOM                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_2_PROPERTIES_QCOM,\n    eSamplerBlockMatchWindowCreateInfoQCOM                       = VK_STRUCTURE_TYPE_SAMPLER_BLOCK_MATCH_WINDOW_CREATE_INFO_QCOM,\n    eSamplerCubicWeightsCreateInfoQCOM                           = VK_STRUCTURE_TYPE_SAMPLER_CUBIC_WEIGHTS_CREATE_INFO_QCOM,\n    ePhysicalDeviceCubicWeightsFeaturesQCOM                      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUBIC_WEIGHTS_FEATURES_QCOM,\n    eBlitImageCubicWeightsInfoQCOM                               = VK_STRUCTURE_TYPE_BLIT_IMAGE_CUBIC_WEIGHTS_INFO_QCOM,\n    ePhysicalDeviceYcbcrDegammaFeaturesQCOM                      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_DEGAMMA_FEATURES_QCOM,\n    eSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM            = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_YCBCR_DEGAMMA_CREATE_INFO_QCOM,\n    ePhysicalDeviceCubicClampFeaturesQCOM                        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUBIC_CLAMP_FEATURES_QCOM,\n    ePhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_FEATURES_EXT,\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n    eScreenBufferPropertiesQNX                           = VK_STRUCTURE_TYPE_SCREEN_BUFFER_PROPERTIES_QNX,\n    eScreenBufferFormatPropertiesQNX                     = VK_STRUCTURE_TYPE_SCREEN_BUFFER_FORMAT_PROPERTIES_QNX,\n    eImportScreenBufferInfoQNX                           = VK_STRUCTURE_TYPE_IMPORT_SCREEN_BUFFER_INFO_QNX,\n    eExternalFormatQNX                                   = VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_QNX,\n    ePhysicalDeviceExternalMemoryScreenBufferFeaturesQNX = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_SCREEN_BUFFER_FEATURES_QNX,\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n    ePhysicalDeviceLayeredDriverPropertiesMSFT                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LAYERED_DRIVER_PROPERTIES_MSFT,\n    eCalibratedTimestampInfoKHR                                 = VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_KHR,\n    eCalibratedTimestampInfoEXT                                 = VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT,\n    eSetDescriptorBufferOffsetsInfoEXT                          = VK_STRUCTURE_TYPE_SET_DESCRIPTOR_BUFFER_OFFSETS_INFO_EXT,\n    eBindDescriptorBufferEmbeddedSamplersInfoEXT                = VK_STRUCTURE_TYPE_BIND_DESCRIPTOR_BUFFER_EMBEDDED_SAMPLERS_INFO_EXT,\n    ePhysicalDeviceDescriptorPoolOverallocationFeaturesNV       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_POOL_OVERALLOCATION_FEATURES_NV,\n    eDisplaySurfaceStereoCreateInfoNV                           = VK_STRUCTURE_TYPE_DISPLAY_SURFACE_STEREO_CREATE_INFO_NV,\n    eDisplayModeStereoPropertiesNV                              = VK_STRUCTURE_TYPE_DISPLAY_MODE_STEREO_PROPERTIES_NV,\n    eVideoEncodeQuantizationMapCapabilitiesKHR                  = VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUANTIZATION_MAP_CAPABILITIES_KHR,\n    eVideoFormatQuantizationMapPropertiesKHR                    = VK_STRUCTURE_TYPE_VIDEO_FORMAT_QUANTIZATION_MAP_PROPERTIES_KHR,\n    eVideoEncodeQuantizationMapInfoKHR                          = VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUANTIZATION_MAP_INFO_KHR,\n    eVideoEncodeQuantizationMapSessionParametersCreateInfoKHR   = VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUANTIZATION_MAP_SESSION_PARAMETERS_CREATE_INFO_KHR,\n    ePhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_QUANTIZATION_MAP_FEATURES_KHR,\n    eVideoEncodeH264QuantizationMapCapabilitiesKHR              = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_QUANTIZATION_MAP_CAPABILITIES_KHR,\n    eVideoEncodeH265QuantizationMapCapabilitiesKHR              = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_QUANTIZATION_MAP_CAPABILITIES_KHR,\n    eVideoFormatH265QuantizationMapPropertiesKHR                = VK_STRUCTURE_TYPE_VIDEO_FORMAT_H265_QUANTIZATION_MAP_PROPERTIES_KHR,\n    eVideoEncodeAv1QuantizationMapCapabilitiesKHR               = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_QUANTIZATION_MAP_CAPABILITIES_KHR,\n    eVideoFormatAv1QuantizationMapPropertiesKHR                 = VK_STRUCTURE_TYPE_VIDEO_FORMAT_AV1_QUANTIZATION_MAP_PROPERTIES_KHR,\n    ePhysicalDeviceRawAccessChainsFeaturesNV                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAW_ACCESS_CHAINS_FEATURES_NV,\n    ePhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR,\n    ePhysicalDeviceCommandBufferInheritanceFeaturesNV           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMMAND_BUFFER_INHERITANCE_FEATURES_NV,\n    ePhysicalDeviceMaintenance7FeaturesKHR                      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_7_FEATURES_KHR,\n    ePhysicalDeviceMaintenance7PropertiesKHR                    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_7_PROPERTIES_KHR,\n    ePhysicalDeviceLayeredApiPropertiesListKHR                  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LAYERED_API_PROPERTIES_LIST_KHR,\n    ePhysicalDeviceLayeredApiPropertiesKHR                      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LAYERED_API_PROPERTIES_KHR,\n    ePhysicalDeviceLayeredApiVulkanPropertiesKHR                = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LAYERED_API_VULKAN_PROPERTIES_KHR,\n    ePhysicalDeviceShaderAtomicFloat16VectorFeaturesNV          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT16_VECTOR_FEATURES_NV,\n    ePhysicalDeviceShaderReplicatedCompositesFeaturesEXT        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_REPLICATED_COMPOSITES_FEATURES_EXT,\n    ePhysicalDeviceRayTracingValidationFeaturesNV               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_VALIDATION_FEATURES_NV,\n    ePhysicalDeviceClusterAccelerationStructureFeaturesNV       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_ACCELERATION_STRUCTURE_FEATURES_NV,\n    ePhysicalDeviceClusterAccelerationStructurePropertiesNV     = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_ACCELERATION_STRUCTURE_PROPERTIES_NV,\n    eClusterAccelerationStructureClustersBottomLevelInputNV     = VK_STRUCTURE_TYPE_CLUSTER_ACCELERATION_STRUCTURE_CLUSTERS_BOTTOM_LEVEL_INPUT_NV,\n    eClusterAccelerationStructureTriangleClusterInputNV         = VK_STRUCTURE_TYPE_CLUSTER_ACCELERATION_STRUCTURE_TRIANGLE_CLUSTER_INPUT_NV,\n    eClusterAccelerationStructureMoveObjectsInputNV             = VK_STRUCTURE_TYPE_CLUSTER_ACCELERATION_STRUCTURE_MOVE_OBJECTS_INPUT_NV,\n    eClusterAccelerationStructureInputInfoNV                    = VK_STRUCTURE_TYPE_CLUSTER_ACCELERATION_STRUCTURE_INPUT_INFO_NV,\n    eClusterAccelerationStructureCommandsInfoNV                 = VK_STRUCTURE_TYPE_CLUSTER_ACCELERATION_STRUCTURE_COMMANDS_INFO_NV,\n    eRayTracingPipelineClusterAccelerationStructureCreateInfoNV = VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CLUSTER_ACCELERATION_STRUCTURE_CREATE_INFO_NV,\n    ePhysicalDevicePartitionedAccelerationStructureFeaturesNV   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PARTITIONED_ACCELERATION_STRUCTURE_FEATURES_NV,\n    ePhysicalDevicePartitionedAccelerationStructurePropertiesNV = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PARTITIONED_ACCELERATION_STRUCTURE_PROPERTIES_NV,\n    eWriteDescriptorSetPartitionedAccelerationStructureNV       = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_PARTITIONED_ACCELERATION_STRUCTURE_NV,\n    ePartitionedAccelerationStructureInstancesInputNV           = VK_STRUCTURE_TYPE_PARTITIONED_ACCELERATION_STRUCTURE_INSTANCES_INPUT_NV,\n    eBuildPartitionedAccelerationStructureInfoNV                = VK_STRUCTURE_TYPE_BUILD_PARTITIONED_ACCELERATION_STRUCTURE_INFO_NV,\n    ePartitionedAccelerationStructureFlagsNV                    = VK_STRUCTURE_TYPE_PARTITIONED_ACCELERATION_STRUCTURE_FLAGS_NV,\n    ePhysicalDeviceDeviceGeneratedCommandsFeaturesEXT           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_EXT,\n    ePhysicalDeviceDeviceGeneratedCommandsPropertiesEXT         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_EXT,\n    eGeneratedCommandsMemoryRequirementsInfoEXT                 = VK_STRUCTURE_TYPE_GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_EXT,\n    eIndirectExecutionSetCreateInfoEXT                          = VK_STRUCTURE_TYPE_INDIRECT_EXECUTION_SET_CREATE_INFO_EXT,\n    eGeneratedCommandsInfoEXT                                   = VK_STRUCTURE_TYPE_GENERATED_COMMANDS_INFO_EXT,\n    eIndirectCommandsLayoutCreateInfoEXT                        = VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_EXT,\n    eIndirectCommandsLayoutTokenEXT                             = VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_TOKEN_EXT,\n    eWriteIndirectExecutionSetPipelineEXT                       = VK_STRUCTURE_TYPE_WRITE_INDIRECT_EXECUTION_SET_PIPELINE_EXT,\n    eWriteIndirectExecutionSetShaderEXT                         = VK_STRUCTURE_TYPE_WRITE_INDIRECT_EXECUTION_SET_SHADER_EXT,\n    eIndirectExecutionSetPipelineInfoEXT                        = VK_STRUCTURE_TYPE_INDIRECT_EXECUTION_SET_PIPELINE_INFO_EXT,\n    eIndirectExecutionSetShaderInfoEXT                          = VK_STRUCTURE_TYPE_INDIRECT_EXECUTION_SET_SHADER_INFO_EXT,\n    eIndirectExecutionSetShaderLayoutInfoEXT                    = VK_STRUCTURE_TYPE_INDIRECT_EXECUTION_SET_SHADER_LAYOUT_INFO_EXT,\n    eGeneratedCommandsPipelineInfoEXT                           = VK_STRUCTURE_TYPE_GENERATED_COMMANDS_PIPELINE_INFO_EXT,\n    eGeneratedCommandsShaderInfoEXT                             = VK_STRUCTURE_TYPE_GENERATED_COMMANDS_SHADER_INFO_EXT,\n    ePhysicalDeviceMaintenance8FeaturesKHR                      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_8_FEATURES_KHR,\n    eMemoryBarrierAccessFlags3KHR                               = VK_STRUCTURE_TYPE_MEMORY_BARRIER_ACCESS_FLAGS_3_KHR,\n    ePhysicalDeviceImageAlignmentControlFeaturesMESA            = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ALIGNMENT_CONTROL_FEATURES_MESA,\n    ePhysicalDeviceImageAlignmentControlPropertiesMESA          = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ALIGNMENT_CONTROL_PROPERTIES_MESA,\n    eImageAlignmentControlCreateInfoMESA                        = VK_STRUCTURE_TYPE_IMAGE_ALIGNMENT_CONTROL_CREATE_INFO_MESA,\n    ePhysicalDeviceDepthClampControlFeaturesEXT                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_CONTROL_FEATURES_EXT,\n    ePipelineViewportDepthClampControlCreateInfoEXT             = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_DEPTH_CLAMP_CONTROL_CREATE_INFO_EXT,\n    ePhysicalDeviceVideoMaintenance2FeaturesKHR                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_2_FEATURES_KHR,\n    eVideoDecodeH264InlineSessionParametersInfoKHR              = VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_INLINE_SESSION_PARAMETERS_INFO_KHR,\n    eVideoDecodeH265InlineSessionParametersInfoKHR              = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_INLINE_SESSION_PARAMETERS_INFO_KHR,\n    eVideoDecodeAv1InlineSessionParametersInfoKHR               = VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_INLINE_SESSION_PARAMETERS_INFO_KHR,\n    ePhysicalDeviceHdrVividFeaturesHUAWEI                       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HDR_VIVID_FEATURES_HUAWEI,\n    eHdrVividDynamicMetadataHUAWEI                              = VK_STRUCTURE_TYPE_HDR_VIVID_DYNAMIC_METADATA_HUAWEI,\n    ePhysicalDeviceCooperativeMatrix2FeaturesNV                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_2_FEATURES_NV,\n    eCooperativeMatrixFlexibleDimensionsPropertiesNV            = VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_FLEXIBLE_DIMENSIONS_PROPERTIES_NV,\n    ePhysicalDeviceCooperativeMatrix2PropertiesNV               = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_2_PROPERTIES_NV,\n    ePhysicalDevicePipelineOpacityMicromapFeaturesARM           = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_OPACITY_MICROMAP_FEATURES_ARM,\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n    eImportMemoryMetalHandleInfoEXT = VK_STRUCTURE_TYPE_IMPORT_MEMORY_METAL_HANDLE_INFO_EXT,\n    eMemoryMetalHandlePropertiesEXT = VK_STRUCTURE_TYPE_MEMORY_METAL_HANDLE_PROPERTIES_EXT,\n    eMemoryGetMetalHandleInfoEXT    = VK_STRUCTURE_TYPE_MEMORY_GET_METAL_HANDLE_INFO_EXT,\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n    ePhysicalDeviceDepthClampZeroOneFeaturesKHR         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_KHR,\n    ePhysicalDeviceDepthClampZeroOneFeaturesEXT         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_EXT,\n    ePhysicalDeviceVertexAttributeRobustnessFeaturesEXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_ROBUSTNESS_FEATURES_EXT\n  };\n\n  enum class PipelineCacheHeaderVersion\n  {\n    eOne = VK_PIPELINE_CACHE_HEADER_VERSION_ONE\n  };\n\n  enum class ObjectType\n  {\n    eUnknown                       = VK_OBJECT_TYPE_UNKNOWN,\n    eInstance                      = VK_OBJECT_TYPE_INSTANCE,\n    ePhysicalDevice                = VK_OBJECT_TYPE_PHYSICAL_DEVICE,\n    eDevice                        = VK_OBJECT_TYPE_DEVICE,\n    eQueue                         = VK_OBJECT_TYPE_QUEUE,\n    eSemaphore                     = VK_OBJECT_TYPE_SEMAPHORE,\n    eCommandBuffer                 = VK_OBJECT_TYPE_COMMAND_BUFFER,\n    eFence                         = VK_OBJECT_TYPE_FENCE,\n    eDeviceMemory                  = VK_OBJECT_TYPE_DEVICE_MEMORY,\n    eBuffer                        = VK_OBJECT_TYPE_BUFFER,\n    eImage                         = VK_OBJECT_TYPE_IMAGE,\n    eEvent                         = VK_OBJECT_TYPE_EVENT,\n    eQueryPool                     = VK_OBJECT_TYPE_QUERY_POOL,\n    eBufferView                    = VK_OBJECT_TYPE_BUFFER_VIEW,\n    eImageView                     = VK_OBJECT_TYPE_IMAGE_VIEW,\n    eShaderModule                  = VK_OBJECT_TYPE_SHADER_MODULE,\n    ePipelineCache                 = VK_OBJECT_TYPE_PIPELINE_CACHE,\n    ePipelineLayout                = VK_OBJECT_TYPE_PIPELINE_LAYOUT,\n    eRenderPass                    = VK_OBJECT_TYPE_RENDER_PASS,\n    ePipeline                      = VK_OBJECT_TYPE_PIPELINE,\n    eDescriptorSetLayout           = VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT,\n    eSampler                       = VK_OBJECT_TYPE_SAMPLER,\n    eDescriptorPool                = VK_OBJECT_TYPE_DESCRIPTOR_POOL,\n    eDescriptorSet                 = VK_OBJECT_TYPE_DESCRIPTOR_SET,\n    eFramebuffer                   = VK_OBJECT_TYPE_FRAMEBUFFER,\n    eCommandPool                   = VK_OBJECT_TYPE_COMMAND_POOL,\n    eSamplerYcbcrConversion        = VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION,\n    eSamplerYcbcrConversionKHR     = VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_KHR,\n    eDescriptorUpdateTemplate      = VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE,\n    eDescriptorUpdateTemplateKHR   = VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR,\n    ePrivateDataSlot               = VK_OBJECT_TYPE_PRIVATE_DATA_SLOT,\n    ePrivateDataSlotEXT            = VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT,\n    eSurfaceKHR                    = VK_OBJECT_TYPE_SURFACE_KHR,\n    eSwapchainKHR                  = VK_OBJECT_TYPE_SWAPCHAIN_KHR,\n    eDisplayKHR                    = VK_OBJECT_TYPE_DISPLAY_KHR,\n    eDisplayModeKHR                = VK_OBJECT_TYPE_DISPLAY_MODE_KHR,\n    eDebugReportCallbackEXT        = VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT,\n    eVideoSessionKHR               = VK_OBJECT_TYPE_VIDEO_SESSION_KHR,\n    eVideoSessionParametersKHR     = VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR,\n    eCuModuleNVX                   = VK_OBJECT_TYPE_CU_MODULE_NVX,\n    eCuFunctionNVX                 = VK_OBJECT_TYPE_CU_FUNCTION_NVX,\n    eDebugUtilsMessengerEXT        = VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT,\n    eAccelerationStructureKHR      = VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR,\n    eValidationCacheEXT            = VK_OBJECT_TYPE_VALIDATION_CACHE_EXT,\n    eAccelerationStructureNV       = VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV,\n    ePerformanceConfigurationINTEL = VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL,\n    eDeferredOperationKHR          = VK_OBJECT_TYPE_DEFERRED_OPERATION_KHR,\n    eIndirectCommandsLayoutNV      = VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NV,\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n    eCudaModuleNV   = VK_OBJECT_TYPE_CUDA_MODULE_NV,\n    eCudaFunctionNV = VK_OBJECT_TYPE_CUDA_FUNCTION_NV,\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n    eBufferCollectionFUCHSIA = VK_OBJECT_TYPE_BUFFER_COLLECTION_FUCHSIA,\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n    eMicromapEXT               = VK_OBJECT_TYPE_MICROMAP_EXT,\n    eOpticalFlowSessionNV      = VK_OBJECT_TYPE_OPTICAL_FLOW_SESSION_NV,\n    eShaderEXT                 = VK_OBJECT_TYPE_SHADER_EXT,\n    ePipelineBinaryKHR         = VK_OBJECT_TYPE_PIPELINE_BINARY_KHR,\n    eIndirectCommandsLayoutEXT = VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_EXT,\n    eIndirectExecutionSetEXT   = VK_OBJECT_TYPE_INDIRECT_EXECUTION_SET_EXT\n  };\n\n  enum class VendorId\n  {\n    eKhronos  = VK_VENDOR_ID_KHRONOS,\n    eVIV      = VK_VENDOR_ID_VIV,\n    eVSI      = VK_VENDOR_ID_VSI,\n    eKazan    = VK_VENDOR_ID_KAZAN,\n    eCodeplay = VK_VENDOR_ID_CODEPLAY,\n    eMESA     = VK_VENDOR_ID_MESA,\n    ePocl     = VK_VENDOR_ID_POCL,\n    eMobileye = VK_VENDOR_ID_MOBILEYE\n  };\n\n  enum class Format\n  {\n    eUndefined                               = VK_FORMAT_UNDEFINED,\n    eR4G4UnormPack8                          = VK_FORMAT_R4G4_UNORM_PACK8,\n    eR4G4B4A4UnormPack16                     = VK_FORMAT_R4G4B4A4_UNORM_PACK16,\n    eB4G4R4A4UnormPack16                     = VK_FORMAT_B4G4R4A4_UNORM_PACK16,\n    eR5G6B5UnormPack16                       = VK_FORMAT_R5G6B5_UNORM_PACK16,\n    eB5G6R5UnormPack16                       = VK_FORMAT_B5G6R5_UNORM_PACK16,\n    eR5G5B5A1UnormPack16                     = VK_FORMAT_R5G5B5A1_UNORM_PACK16,\n    eB5G5R5A1UnormPack16                     = VK_FORMAT_B5G5R5A1_UNORM_PACK16,\n    eA1R5G5B5UnormPack16                     = VK_FORMAT_A1R5G5B5_UNORM_PACK16,\n    eR8Unorm                                 = VK_FORMAT_R8_UNORM,\n    eR8Snorm                                 = VK_FORMAT_R8_SNORM,\n    eR8Uscaled                               = VK_FORMAT_R8_USCALED,\n    eR8Sscaled                               = VK_FORMAT_R8_SSCALED,\n    eR8Uint                                  = VK_FORMAT_R8_UINT,\n    eR8Sint                                  = VK_FORMAT_R8_SINT,\n    eR8Srgb                                  = VK_FORMAT_R8_SRGB,\n    eR8G8Unorm                               = VK_FORMAT_R8G8_UNORM,\n    eR8G8Snorm                               = VK_FORMAT_R8G8_SNORM,\n    eR8G8Uscaled                             = VK_FORMAT_R8G8_USCALED,\n    eR8G8Sscaled                             = VK_FORMAT_R8G8_SSCALED,\n    eR8G8Uint                                = VK_FORMAT_R8G8_UINT,\n    eR8G8Sint                                = VK_FORMAT_R8G8_SINT,\n    eR8G8Srgb                                = VK_FORMAT_R8G8_SRGB,\n    eR8G8B8Unorm                             = VK_FORMAT_R8G8B8_UNORM,\n    eR8G8B8Snorm                             = VK_FORMAT_R8G8B8_SNORM,\n    eR8G8B8Uscaled                           = VK_FORMAT_R8G8B8_USCALED,\n    eR8G8B8Sscaled                           = VK_FORMAT_R8G8B8_SSCALED,\n    eR8G8B8Uint                              = VK_FORMAT_R8G8B8_UINT,\n    eR8G8B8Sint                              = VK_FORMAT_R8G8B8_SINT,\n    eR8G8B8Srgb                              = VK_FORMAT_R8G8B8_SRGB,\n    eB8G8R8Unorm                             = VK_FORMAT_B8G8R8_UNORM,\n    eB8G8R8Snorm                             = VK_FORMAT_B8G8R8_SNORM,\n    eB8G8R8Uscaled                           = VK_FORMAT_B8G8R8_USCALED,\n    eB8G8R8Sscaled                           = VK_FORMAT_B8G8R8_SSCALED,\n    eB8G8R8Uint                              = VK_FORMAT_B8G8R8_UINT,\n    eB8G8R8Sint                              = VK_FORMAT_B8G8R8_SINT,\n    eB8G8R8Srgb                              = VK_FORMAT_B8G8R8_SRGB,\n    eR8G8B8A8Unorm                           = VK_FORMAT_R8G8B8A8_UNORM,\n    eR8G8B8A8Snorm                           = VK_FORMAT_R8G8B8A8_SNORM,\n    eR8G8B8A8Uscaled                         = VK_FORMAT_R8G8B8A8_USCALED,\n    eR8G8B8A8Sscaled                         = VK_FORMAT_R8G8B8A8_SSCALED,\n    eR8G8B8A8Uint                            = VK_FORMAT_R8G8B8A8_UINT,\n    eR8G8B8A8Sint                            = VK_FORMAT_R8G8B8A8_SINT,\n    eR8G8B8A8Srgb                            = VK_FORMAT_R8G8B8A8_SRGB,\n    eB8G8R8A8Unorm                           = VK_FORMAT_B8G8R8A8_UNORM,\n    eB8G8R8A8Snorm                           = VK_FORMAT_B8G8R8A8_SNORM,\n    eB8G8R8A8Uscaled                         = VK_FORMAT_B8G8R8A8_USCALED,\n    eB8G8R8A8Sscaled                         = VK_FORMAT_B8G8R8A8_SSCALED,\n    eB8G8R8A8Uint                            = VK_FORMAT_B8G8R8A8_UINT,\n    eB8G8R8A8Sint                            = VK_FORMAT_B8G8R8A8_SINT,\n    eB8G8R8A8Srgb                            = VK_FORMAT_B8G8R8A8_SRGB,\n    eA8B8G8R8UnormPack32                     = VK_FORMAT_A8B8G8R8_UNORM_PACK32,\n    eA8B8G8R8SnormPack32                     = VK_FORMAT_A8B8G8R8_SNORM_PACK32,\n    eA8B8G8R8UscaledPack32                   = VK_FORMAT_A8B8G8R8_USCALED_PACK32,\n    eA8B8G8R8SscaledPack32                   = VK_FORMAT_A8B8G8R8_SSCALED_PACK32,\n    eA8B8G8R8UintPack32                      = VK_FORMAT_A8B8G8R8_UINT_PACK32,\n    eA8B8G8R8SintPack32                      = VK_FORMAT_A8B8G8R8_SINT_PACK32,\n    eA8B8G8R8SrgbPack32                      = VK_FORMAT_A8B8G8R8_SRGB_PACK32,\n    eA2R10G10B10UnormPack32                  = VK_FORMAT_A2R10G10B10_UNORM_PACK32,\n    eA2R10G10B10SnormPack32                  = VK_FORMAT_A2R10G10B10_SNORM_PACK32,\n    eA2R10G10B10UscaledPack32                = VK_FORMAT_A2R10G10B10_USCALED_PACK32,\n    eA2R10G10B10SscaledPack32                = VK_FORMAT_A2R10G10B10_SSCALED_PACK32,\n    eA2R10G10B10UintPack32                   = VK_FORMAT_A2R10G10B10_UINT_PACK32,\n    eA2R10G10B10SintPack32                   = VK_FORMAT_A2R10G10B10_SINT_PACK32,\n    eA2B10G10R10UnormPack32                  = VK_FORMAT_A2B10G10R10_UNORM_PACK32,\n    eA2B10G10R10SnormPack32                  = VK_FORMAT_A2B10G10R10_SNORM_PACK32,\n    eA2B10G10R10UscaledPack32                = VK_FORMAT_A2B10G10R10_USCALED_PACK32,\n    eA2B10G10R10SscaledPack32                = VK_FORMAT_A2B10G10R10_SSCALED_PACK32,\n    eA2B10G10R10UintPack32                   = VK_FORMAT_A2B10G10R10_UINT_PACK32,\n    eA2B10G10R10SintPack32                   = VK_FORMAT_A2B10G10R10_SINT_PACK32,\n    eR16Unorm                                = VK_FORMAT_R16_UNORM,\n    eR16Snorm                                = VK_FORMAT_R16_SNORM,\n    eR16Uscaled                              = VK_FORMAT_R16_USCALED,\n    eR16Sscaled                              = VK_FORMAT_R16_SSCALED,\n    eR16Uint                                 = VK_FORMAT_R16_UINT,\n    eR16Sint                                 = VK_FORMAT_R16_SINT,\n    eR16Sfloat                               = VK_FORMAT_R16_SFLOAT,\n    eR16G16Unorm                             = VK_FORMAT_R16G16_UNORM,\n    eR16G16Snorm                             = VK_FORMAT_R16G16_SNORM,\n    eR16G16Uscaled                           = VK_FORMAT_R16G16_USCALED,\n    eR16G16Sscaled                           = VK_FORMAT_R16G16_SSCALED,\n    eR16G16Uint                              = VK_FORMAT_R16G16_UINT,\n    eR16G16Sint                              = VK_FORMAT_R16G16_SINT,\n    eR16G16Sfloat                            = VK_FORMAT_R16G16_SFLOAT,\n    eR16G16B16Unorm                          = VK_FORMAT_R16G16B16_UNORM,\n    eR16G16B16Snorm                          = VK_FORMAT_R16G16B16_SNORM,\n    eR16G16B16Uscaled                        = VK_FORMAT_R16G16B16_USCALED,\n    eR16G16B16Sscaled                        = VK_FORMAT_R16G16B16_SSCALED,\n    eR16G16B16Uint                           = VK_FORMAT_R16G16B16_UINT,\n    eR16G16B16Sint                           = VK_FORMAT_R16G16B16_SINT,\n    eR16G16B16Sfloat                         = VK_FORMAT_R16G16B16_SFLOAT,\n    eR16G16B16A16Unorm                       = VK_FORMAT_R16G16B16A16_UNORM,\n    eR16G16B16A16Snorm                       = VK_FORMAT_R16G16B16A16_SNORM,\n    eR16G16B16A16Uscaled                     = VK_FORMAT_R16G16B16A16_USCALED,\n    eR16G16B16A16Sscaled                     = VK_FORMAT_R16G16B16A16_SSCALED,\n    eR16G16B16A16Uint                        = VK_FORMAT_R16G16B16A16_UINT,\n    eR16G16B16A16Sint                        = VK_FORMAT_R16G16B16A16_SINT,\n    eR16G16B16A16Sfloat                      = VK_FORMAT_R16G16B16A16_SFLOAT,\n    eR32Uint                                 = VK_FORMAT_R32_UINT,\n    eR32Sint                                 = VK_FORMAT_R32_SINT,\n    eR32Sfloat                               = VK_FORMAT_R32_SFLOAT,\n    eR32G32Uint                              = VK_FORMAT_R32G32_UINT,\n    eR32G32Sint                              = VK_FORMAT_R32G32_SINT,\n    eR32G32Sfloat                            = VK_FORMAT_R32G32_SFLOAT,\n    eR32G32B32Uint                           = VK_FORMAT_R32G32B32_UINT,\n    eR32G32B32Sint                           = VK_FORMAT_R32G32B32_SINT,\n    eR32G32B32Sfloat                         = VK_FORMAT_R32G32B32_SFLOAT,\n    eR32G32B32A32Uint                        = VK_FORMAT_R32G32B32A32_UINT,\n    eR32G32B32A32Sint                        = VK_FORMAT_R32G32B32A32_SINT,\n    eR32G32B32A32Sfloat                      = VK_FORMAT_R32G32B32A32_SFLOAT,\n    eR64Uint                                 = VK_FORMAT_R64_UINT,\n    eR64Sint                                 = VK_FORMAT_R64_SINT,\n    eR64Sfloat                               = VK_FORMAT_R64_SFLOAT,\n    eR64G64Uint                              = VK_FORMAT_R64G64_UINT,\n    eR64G64Sint                              = VK_FORMAT_R64G64_SINT,\n    eR64G64Sfloat                            = VK_FORMAT_R64G64_SFLOAT,\n    eR64G64B64Uint                           = VK_FORMAT_R64G64B64_UINT,\n    eR64G64B64Sint                           = VK_FORMAT_R64G64B64_SINT,\n    eR64G64B64Sfloat                         = VK_FORMAT_R64G64B64_SFLOAT,\n    eR64G64B64A64Uint                        = VK_FORMAT_R64G64B64A64_UINT,\n    eR64G64B64A64Sint                        = VK_FORMAT_R64G64B64A64_SINT,\n    eR64G64B64A64Sfloat                      = VK_FORMAT_R64G64B64A64_SFLOAT,\n    eB10G11R11UfloatPack32                   = VK_FORMAT_B10G11R11_UFLOAT_PACK32,\n    eE5B9G9R9UfloatPack32                    = VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,\n    eD16Unorm                                = VK_FORMAT_D16_UNORM,\n    eX8D24UnormPack32                        = VK_FORMAT_X8_D24_UNORM_PACK32,\n    eD32Sfloat                               = VK_FORMAT_D32_SFLOAT,\n    eS8Uint                                  = VK_FORMAT_S8_UINT,\n    eD16UnormS8Uint                          = VK_FORMAT_D16_UNORM_S8_UINT,\n    eD24UnormS8Uint                          = VK_FORMAT_D24_UNORM_S8_UINT,\n    eD32SfloatS8Uint                         = VK_FORMAT_D32_SFLOAT_S8_UINT,\n    eBc1RgbUnormBlock                        = VK_FORMAT_BC1_RGB_UNORM_BLOCK,\n    eBc1RgbSrgbBlock                         = VK_FORMAT_BC1_RGB_SRGB_BLOCK,\n    eBc1RgbaUnormBlock                       = VK_FORMAT_BC1_RGBA_UNORM_BLOCK,\n    eBc1RgbaSrgbBlock                        = VK_FORMAT_BC1_RGBA_SRGB_BLOCK,\n    eBc2UnormBlock                           = VK_FORMAT_BC2_UNORM_BLOCK,\n    eBc2SrgbBlock                            = VK_FORMAT_BC2_SRGB_BLOCK,\n    eBc3UnormBlock                           = VK_FORMAT_BC3_UNORM_BLOCK,\n    eBc3SrgbBlock                            = VK_FORMAT_BC3_SRGB_BLOCK,\n    eBc4UnormBlock                           = VK_FORMAT_BC4_UNORM_BLOCK,\n    eBc4SnormBlock                           = VK_FORMAT_BC4_SNORM_BLOCK,\n    eBc5UnormBlock                           = VK_FORMAT_BC5_UNORM_BLOCK,\n    eBc5SnormBlock                           = VK_FORMAT_BC5_SNORM_BLOCK,\n    eBc6HUfloatBlock                         = VK_FORMAT_BC6H_UFLOAT_BLOCK,\n    eBc6HSfloatBlock                         = VK_FORMAT_BC6H_SFLOAT_BLOCK,\n    eBc7UnormBlock                           = VK_FORMAT_BC7_UNORM_BLOCK,\n    eBc7SrgbBlock                            = VK_FORMAT_BC7_SRGB_BLOCK,\n    eEtc2R8G8B8UnormBlock                    = VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,\n    eEtc2R8G8B8SrgbBlock                     = VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,\n    eEtc2R8G8B8A1UnormBlock                  = VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,\n    eEtc2R8G8B8A1SrgbBlock                   = VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK,\n    eEtc2R8G8B8A8UnormBlock                  = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,\n    eEtc2R8G8B8A8SrgbBlock                   = VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,\n    eEacR11UnormBlock                        = VK_FORMAT_EAC_R11_UNORM_BLOCK,\n    eEacR11SnormBlock                        = VK_FORMAT_EAC_R11_SNORM_BLOCK,\n    eEacR11G11UnormBlock                     = VK_FORMAT_EAC_R11G11_UNORM_BLOCK,\n    eEacR11G11SnormBlock                     = VK_FORMAT_EAC_R11G11_SNORM_BLOCK,\n    eAstc4x4UnormBlock                       = VK_FORMAT_ASTC_4x4_UNORM_BLOCK,\n    eAstc4x4SrgbBlock                        = VK_FORMAT_ASTC_4x4_SRGB_BLOCK,\n    eAstc5x4UnormBlock                       = VK_FORMAT_ASTC_5x4_UNORM_BLOCK,\n    eAstc5x4SrgbBlock                        = VK_FORMAT_ASTC_5x4_SRGB_BLOCK,\n    eAstc5x5UnormBlock                       = VK_FORMAT_ASTC_5x5_UNORM_BLOCK,\n    eAstc5x5SrgbBlock                        = VK_FORMAT_ASTC_5x5_SRGB_BLOCK,\n    eAstc6x5UnormBlock                       = VK_FORMAT_ASTC_6x5_UNORM_BLOCK,\n    eAstc6x5SrgbBlock                        = VK_FORMAT_ASTC_6x5_SRGB_BLOCK,\n    eAstc6x6UnormBlock                       = VK_FORMAT_ASTC_6x6_UNORM_BLOCK,\n    eAstc6x6SrgbBlock                        = VK_FORMAT_ASTC_6x6_SRGB_BLOCK,\n    eAstc8x5UnormBlock                       = VK_FORMAT_ASTC_8x5_UNORM_BLOCK,\n    eAstc8x5SrgbBlock                        = VK_FORMAT_ASTC_8x5_SRGB_BLOCK,\n    eAstc8x6UnormBlock                       = VK_FORMAT_ASTC_8x6_UNORM_BLOCK,\n    eAstc8x6SrgbBlock                        = VK_FORMAT_ASTC_8x6_SRGB_BLOCK,\n    eAstc8x8UnormBlock                       = VK_FORMAT_ASTC_8x8_UNORM_BLOCK,\n    eAstc8x8SrgbBlock                        = VK_FORMAT_ASTC_8x8_SRGB_BLOCK,\n    eAstc10x5UnormBlock                      = VK_FORMAT_ASTC_10x5_UNORM_BLOCK,\n    eAstc10x5SrgbBlock                       = VK_FORMAT_ASTC_10x5_SRGB_BLOCK,\n    eAstc10x6UnormBlock                      = VK_FORMAT_ASTC_10x6_UNORM_BLOCK,\n    eAstc10x6SrgbBlock                       = VK_FORMAT_ASTC_10x6_SRGB_BLOCK,\n    eAstc10x8UnormBlock                      = VK_FORMAT_ASTC_10x8_UNORM_BLOCK,\n    eAstc10x8SrgbBlock                       = VK_FORMAT_ASTC_10x8_SRGB_BLOCK,\n    eAstc10x10UnormBlock                     = VK_FORMAT_ASTC_10x10_UNORM_BLOCK,\n    eAstc10x10SrgbBlock                      = VK_FORMAT_ASTC_10x10_SRGB_BLOCK,\n    eAstc12x10UnormBlock                     = VK_FORMAT_ASTC_12x10_UNORM_BLOCK,\n    eAstc12x10SrgbBlock                      = VK_FORMAT_ASTC_12x10_SRGB_BLOCK,\n    eAstc12x12UnormBlock                     = VK_FORMAT_ASTC_12x12_UNORM_BLOCK,\n    eAstc12x12SrgbBlock                      = VK_FORMAT_ASTC_12x12_SRGB_BLOCK,\n    eG8B8G8R8422Unorm                        = VK_FORMAT_G8B8G8R8_422_UNORM,\n    eG8B8G8R8422UnormKHR                     = VK_FORMAT_G8B8G8R8_422_UNORM_KHR,\n    eB8G8R8G8422Unorm                        = VK_FORMAT_B8G8R8G8_422_UNORM,\n    eB8G8R8G8422UnormKHR                     = VK_FORMAT_B8G8R8G8_422_UNORM_KHR,\n    eG8B8R83Plane420Unorm                    = VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM,\n    eG8B8R83Plane420UnormKHR                 = VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR,\n    eG8B8R82Plane420Unorm                    = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM,\n    eG8B8R82Plane420UnormKHR                 = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR,\n    eG8B8R83Plane422Unorm                    = VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM,\n    eG8B8R83Plane422UnormKHR                 = VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR,\n    eG8B8R82Plane422Unorm                    = VK_FORMAT_G8_B8R8_2PLANE_422_UNORM,\n    eG8B8R82Plane422UnormKHR                 = VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR,\n    eG8B8R83Plane444Unorm                    = VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM,\n    eG8B8R83Plane444UnormKHR                 = VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR,\n    eR10X6UnormPack16                        = VK_FORMAT_R10X6_UNORM_PACK16,\n    eR10X6UnormPack16KHR                     = VK_FORMAT_R10X6_UNORM_PACK16_KHR,\n    eR10X6G10X6Unorm2Pack16                  = VK_FORMAT_R10X6G10X6_UNORM_2PACK16,\n    eR10X6G10X6Unorm2Pack16KHR               = VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR,\n    eR10X6G10X6B10X6A10X6Unorm4Pack16        = VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16,\n    eR10X6G10X6B10X6A10X6Unorm4Pack16KHR     = VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR,\n    eG10X6B10X6G10X6R10X6422Unorm4Pack16     = VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16,\n    eG10X6B10X6G10X6R10X6422Unorm4Pack16KHR  = VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR,\n    eB10X6G10X6R10X6G10X6422Unorm4Pack16     = VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16,\n    eB10X6G10X6R10X6G10X6422Unorm4Pack16KHR  = VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR,\n    eG10X6B10X6R10X63Plane420Unorm3Pack16    = VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16,\n    eG10X6B10X6R10X63Plane420Unorm3Pack16KHR = VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR,\n    eG10X6B10X6R10X62Plane420Unorm3Pack16    = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16,\n    eG10X6B10X6R10X62Plane420Unorm3Pack16KHR = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR,\n    eG10X6B10X6R10X63Plane422Unorm3Pack16    = VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16,\n    eG10X6B10X6R10X63Plane422Unorm3Pack16KHR = VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR,\n    eG10X6B10X6R10X62Plane422Unorm3Pack16    = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16,\n    eG10X6B10X6R10X62Plane422Unorm3Pack16KHR = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR,\n    eG10X6B10X6R10X63Plane444Unorm3Pack16    = VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16,\n    eG10X6B10X6R10X63Plane444Unorm3Pack16KHR = VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR,\n    eR12X4UnormPack16                        = VK_FORMAT_R12X4_UNORM_PACK16,\n    eR12X4UnormPack16KHR                     = VK_FORMAT_R12X4_UNORM_PACK16_KHR,\n    eR12X4G12X4Unorm2Pack16                  = VK_FORMAT_R12X4G12X4_UNORM_2PACK16,\n    eR12X4G12X4Unorm2Pack16KHR               = VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR,\n    eR12X4G12X4B12X4A12X4Unorm4Pack16        = VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16,\n    eR12X4G12X4B12X4A12X4Unorm4Pack16KHR     = VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR,\n    eG12X4B12X4G12X4R12X4422Unorm4Pack16     = VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16,\n    eG12X4B12X4G12X4R12X4422Unorm4Pack16KHR  = VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR,\n    eB12X4G12X4R12X4G12X4422Unorm4Pack16     = VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16,\n    eB12X4G12X4R12X4G12X4422Unorm4Pack16KHR  = VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR,\n    eG12X4B12X4R12X43Plane420Unorm3Pack16    = VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16,\n    eG12X4B12X4R12X43Plane420Unorm3Pack16KHR = VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR,\n    eG12X4B12X4R12X42Plane420Unorm3Pack16    = VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16,\n    eG12X4B12X4R12X42Plane420Unorm3Pack16KHR = VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR,\n    eG12X4B12X4R12X43Plane422Unorm3Pack16    = VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16,\n    eG12X4B12X4R12X43Plane422Unorm3Pack16KHR = VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR,\n    eG12X4B12X4R12X42Plane422Unorm3Pack16    = VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16,\n    eG12X4B12X4R12X42Plane422Unorm3Pack16KHR = VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR,\n    eG12X4B12X4R12X43Plane444Unorm3Pack16    = VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16,\n    eG12X4B12X4R12X43Plane444Unorm3Pack16KHR = VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR,\n    eG16B16G16R16422Unorm                    = VK_FORMAT_G16B16G16R16_422_UNORM,\n    eG16B16G16R16422UnormKHR                 = VK_FORMAT_G16B16G16R16_422_UNORM_KHR,\n    eB16G16R16G16422Unorm                    = VK_FORMAT_B16G16R16G16_422_UNORM,\n    eB16G16R16G16422UnormKHR                 = VK_FORMAT_B16G16R16G16_422_UNORM_KHR,\n    eG16B16R163Plane420Unorm                 = VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM,\n    eG16B16R163Plane420UnormKHR              = VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR,\n    eG16B16R162Plane420Unorm                 = VK_FORMAT_G16_B16R16_2PLANE_420_UNORM,\n    eG16B16R162Plane420UnormKHR              = VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR,\n    eG16B16R163Plane422Unorm                 = VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM,\n    eG16B16R163Plane422UnormKHR              = VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR,\n    eG16B16R162Plane422Unorm                 = VK_FORMAT_G16_B16R16_2PLANE_422_UNORM,\n    eG16B16R162Plane422UnormKHR              = VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR,\n    eG16B16R163Plane444Unorm                 = VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM,\n    eG16B16R163Plane444UnormKHR              = VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR,\n    eG8B8R82Plane444Unorm                    = VK_FORMAT_G8_B8R8_2PLANE_444_UNORM,\n    eG8B8R82Plane444UnormEXT                 = VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT,\n    eG10X6B10X6R10X62Plane444Unorm3Pack16    = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16,\n    eG10X6B10X6R10X62Plane444Unorm3Pack16EXT = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT,\n    eG12X4B12X4R12X42Plane444Unorm3Pack16    = VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16,\n    eG12X4B12X4R12X42Plane444Unorm3Pack16EXT = VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT,\n    eG16B16R162Plane444Unorm                 = VK_FORMAT_G16_B16R16_2PLANE_444_UNORM,\n    eG16B16R162Plane444UnormEXT              = VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT,\n    eA4R4G4B4UnormPack16                     = VK_FORMAT_A4R4G4B4_UNORM_PACK16,\n    eA4R4G4B4UnormPack16EXT                  = VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT,\n    eA4B4G4R4UnormPack16                     = VK_FORMAT_A4B4G4R4_UNORM_PACK16,\n    eA4B4G4R4UnormPack16EXT                  = VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT,\n    eAstc4x4SfloatBlock                      = VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK,\n    eAstc4x4SfloatBlockEXT                   = VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT,\n    eAstc5x4SfloatBlock                      = VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK,\n    eAstc5x4SfloatBlockEXT                   = VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT,\n    eAstc5x5SfloatBlock                      = VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK,\n    eAstc5x5SfloatBlockEXT                   = VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT,\n    eAstc6x5SfloatBlock                      = VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK,\n    eAstc6x5SfloatBlockEXT                   = VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT,\n    eAstc6x6SfloatBlock                      = VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK,\n    eAstc6x6SfloatBlockEXT                   = VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT,\n    eAstc8x5SfloatBlock                      = VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK,\n    eAstc8x5SfloatBlockEXT                   = VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT,\n    eAstc8x6SfloatBlock                      = VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK,\n    eAstc8x6SfloatBlockEXT                   = VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT,\n    eAstc8x8SfloatBlock                      = VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK,\n    eAstc8x8SfloatBlockEXT                   = VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT,\n    eAstc10x5SfloatBlock                     = VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK,\n    eAstc10x5SfloatBlockEXT                  = VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT,\n    eAstc10x6SfloatBlock                     = VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK,\n    eAstc10x6SfloatBlockEXT                  = VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT,\n    eAstc10x8SfloatBlock                     = VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK,\n    eAstc10x8SfloatBlockEXT                  = VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT,\n    eAstc10x10SfloatBlock                    = VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK,\n    eAstc10x10SfloatBlockEXT                 = VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT,\n    eAstc12x10SfloatBlock                    = VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK,\n    eAstc12x10SfloatBlockEXT                 = VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT,\n    eAstc12x12SfloatBlock                    = VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK,\n    eAstc12x12SfloatBlockEXT                 = VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT,\n    eA1B5G5R5UnormPack16                     = VK_FORMAT_A1B5G5R5_UNORM_PACK16,\n    eA1B5G5R5UnormPack16KHR                  = VK_FORMAT_A1B5G5R5_UNORM_PACK16_KHR,\n    eA8Unorm                                 = VK_FORMAT_A8_UNORM,\n    eA8UnormKHR                              = VK_FORMAT_A8_UNORM_KHR,\n    ePvrtc12BppUnormBlockIMG                 = VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG,\n    ePvrtc14BppUnormBlockIMG                 = VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG,\n    ePvrtc22BppUnormBlockIMG                 = VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG,\n    ePvrtc24BppUnormBlockIMG                 = VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG,\n    ePvrtc12BppSrgbBlockIMG                  = VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG,\n    ePvrtc14BppSrgbBlockIMG                  = VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG,\n    ePvrtc22BppSrgbBlockIMG                  = VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG,\n    ePvrtc24BppSrgbBlockIMG                  = VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG,\n    eR16G16Sfixed5NV                         = VK_FORMAT_R16G16_SFIXED5_NV,\n    eR16G16S105NV                            = VK_FORMAT_R16G16_S10_5_NV\n  };\n\n  enum class FormatFeatureFlagBits : VkFormatFeatureFlags\n  {\n    eSampledImage                                               = VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT,\n    eStorageImage                                               = VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT,\n    eStorageImageAtomic                                         = VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT,\n    eUniformTexelBuffer                                         = VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT,\n    eStorageTexelBuffer                                         = VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT,\n    eStorageTexelBufferAtomic                                   = VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT,\n    eVertexBuffer                                               = VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT,\n    eColorAttachment                                            = VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT,\n    eColorAttachmentBlend                                       = VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT,\n    eDepthStencilAttachment                                     = VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT,\n    eBlitSrc                                                    = VK_FORMAT_FEATURE_BLIT_SRC_BIT,\n    eBlitDst                                                    = VK_FORMAT_FEATURE_BLIT_DST_BIT,\n    eSampledImageFilterLinear                                   = VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT,\n    eTransferSrc                                                = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT,\n    eTransferSrcKHR                                             = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR,\n    eTransferDst                                                = VK_FORMAT_FEATURE_TRANSFER_DST_BIT,\n    eTransferDstKHR                                             = VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR,\n    eMidpointChromaSamples                                      = VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT,\n    eMidpointChromaSamplesKHR                                   = VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT_KHR,\n    eSampledImageYcbcrConversionLinearFilter                    = VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT,\n    eSampledImageYcbcrConversionLinearFilterKHR                 = VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT_KHR,\n    eSampledImageYcbcrConversionSeparateReconstructionFilter    = VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT,\n    eSampledImageYcbcrConversionSeparateReconstructionFilterKHR = VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT_KHR,\n    eSampledImageYcbcrConversionChromaReconstructionExplicit    = VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT,\n    eSampledImageYcbcrConversionChromaReconstructionExplicitKHR = VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT_KHR,\n    eSampledImageYcbcrConversionChromaReconstructionExplicitForceable =\n      VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT,\n    eSampledImageYcbcrConversionChromaReconstructionExplicitForceableKHR =\n      VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT_KHR,\n    eDisjoint                             = VK_FORMAT_FEATURE_DISJOINT_BIT,\n    eDisjointKHR                          = VK_FORMAT_FEATURE_DISJOINT_BIT_KHR,\n    eCositedChromaSamples                 = VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT,\n    eCositedChromaSamplesKHR              = VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT_KHR,\n    eSampledImageFilterMinmax             = VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT,\n    eSampledImageFilterMinmaxEXT          = VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT_EXT,\n    eVideoDecodeOutputKHR                 = VK_FORMAT_FEATURE_VIDEO_DECODE_OUTPUT_BIT_KHR,\n    eVideoDecodeDpbKHR                    = VK_FORMAT_FEATURE_VIDEO_DECODE_DPB_BIT_KHR,\n    eAccelerationStructureVertexBufferKHR = VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR,\n    eSampledImageFilterCubicEXT           = VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT,\n    eSampledImageFilterCubicIMG           = VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG,\n    eFragmentDensityMapEXT                = VK_FORMAT_FEATURE_FRAGMENT_DENSITY_MAP_BIT_EXT,\n    eFragmentShadingRateAttachmentKHR     = VK_FORMAT_FEATURE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,\n    eVideoEncodeInputKHR                  = VK_FORMAT_FEATURE_VIDEO_ENCODE_INPUT_BIT_KHR,\n    eVideoEncodeDpbKHR                    = VK_FORMAT_FEATURE_VIDEO_ENCODE_DPB_BIT_KHR\n  };\n\n  using FormatFeatureFlags = Flags<FormatFeatureFlagBits>;\n\n  template <>\n  struct FlagTraits<FormatFeatureFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool               isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR FormatFeatureFlags allFlags =\n      FormatFeatureFlagBits::eSampledImage | FormatFeatureFlagBits::eStorageImage | FormatFeatureFlagBits::eStorageImageAtomic |\n      FormatFeatureFlagBits::eUniformTexelBuffer | FormatFeatureFlagBits::eStorageTexelBuffer | FormatFeatureFlagBits::eStorageTexelBufferAtomic |\n      FormatFeatureFlagBits::eVertexBuffer | FormatFeatureFlagBits::eColorAttachment | FormatFeatureFlagBits::eColorAttachmentBlend |\n      FormatFeatureFlagBits::eDepthStencilAttachment | FormatFeatureFlagBits::eBlitSrc | FormatFeatureFlagBits::eBlitDst |\n      FormatFeatureFlagBits::eSampledImageFilterLinear | FormatFeatureFlagBits::eTransferSrc | FormatFeatureFlagBits::eTransferDst |\n      FormatFeatureFlagBits::eMidpointChromaSamples | FormatFeatureFlagBits::eSampledImageYcbcrConversionLinearFilter |\n      FormatFeatureFlagBits::eSampledImageYcbcrConversionSeparateReconstructionFilter |\n      FormatFeatureFlagBits::eSampledImageYcbcrConversionChromaReconstructionExplicit |\n      FormatFeatureFlagBits::eSampledImageYcbcrConversionChromaReconstructionExplicitForceable | FormatFeatureFlagBits::eDisjoint |\n      FormatFeatureFlagBits::eCositedChromaSamples | FormatFeatureFlagBits::eSampledImageFilterMinmax | FormatFeatureFlagBits::eVideoDecodeOutputKHR |\n      FormatFeatureFlagBits::eVideoDecodeDpbKHR | FormatFeatureFlagBits::eAccelerationStructureVertexBufferKHR |\n      FormatFeatureFlagBits::eSampledImageFilterCubicEXT | FormatFeatureFlagBits::eFragmentDensityMapEXT |\n      FormatFeatureFlagBits::eFragmentShadingRateAttachmentKHR | FormatFeatureFlagBits::eVideoEncodeInputKHR | FormatFeatureFlagBits::eVideoEncodeDpbKHR;\n  };\n\n  enum class ImageCreateFlagBits : VkImageCreateFlags\n  {\n    eSparseBinding                        = VK_IMAGE_CREATE_SPARSE_BINDING_BIT,\n    eSparseResidency                      = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT,\n    eSparseAliased                        = VK_IMAGE_CREATE_SPARSE_ALIASED_BIT,\n    eMutableFormat                        = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT,\n    eCubeCompatible                       = VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT,\n    eAlias                                = VK_IMAGE_CREATE_ALIAS_BIT,\n    eAliasKHR                             = VK_IMAGE_CREATE_ALIAS_BIT_KHR,\n    eSplitInstanceBindRegions             = VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT,\n    eSplitInstanceBindRegionsKHR          = VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR,\n    e2DArrayCompatible                    = VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT,\n    e2DArrayCompatibleKHR                 = VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR,\n    eBlockTexelViewCompatible             = VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT,\n    eBlockTexelViewCompatibleKHR          = VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_KHR,\n    eExtendedUsage                        = VK_IMAGE_CREATE_EXTENDED_USAGE_BIT,\n    eExtendedUsageKHR                     = VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR,\n    eProtected                            = VK_IMAGE_CREATE_PROTECTED_BIT,\n    eDisjoint                             = VK_IMAGE_CREATE_DISJOINT_BIT,\n    eDisjointKHR                          = VK_IMAGE_CREATE_DISJOINT_BIT_KHR,\n    eCornerSampledNV                      = VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV,\n    eSampleLocationsCompatibleDepthEXT    = VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT,\n    eSubsampledEXT                        = VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT,\n    eDescriptorBufferCaptureReplayEXT     = VK_IMAGE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT,\n    eMultisampledRenderToSingleSampledEXT = VK_IMAGE_CREATE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_BIT_EXT,\n    e2DViewCompatibleEXT                  = VK_IMAGE_CREATE_2D_VIEW_COMPATIBLE_BIT_EXT,\n    eFragmentDensityMapOffsetQCOM         = VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM,\n    eVideoProfileIndependentKHR           = VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR\n  };\n\n  using ImageCreateFlags = Flags<ImageCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<ImageCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool             isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ImageCreateFlags allFlags =\n      ImageCreateFlagBits::eSparseBinding | ImageCreateFlagBits::eSparseResidency | ImageCreateFlagBits::eSparseAliased | ImageCreateFlagBits::eMutableFormat |\n      ImageCreateFlagBits::eCubeCompatible | ImageCreateFlagBits::eAlias | ImageCreateFlagBits::eSplitInstanceBindRegions |\n      ImageCreateFlagBits::e2DArrayCompatible | ImageCreateFlagBits::eBlockTexelViewCompatible | ImageCreateFlagBits::eExtendedUsage |\n      ImageCreateFlagBits::eProtected | ImageCreateFlagBits::eDisjoint | ImageCreateFlagBits::eCornerSampledNV |\n      ImageCreateFlagBits::eSampleLocationsCompatibleDepthEXT | ImageCreateFlagBits::eSubsampledEXT | ImageCreateFlagBits::eDescriptorBufferCaptureReplayEXT |\n      ImageCreateFlagBits::eMultisampledRenderToSingleSampledEXT | ImageCreateFlagBits::e2DViewCompatibleEXT |\n      ImageCreateFlagBits::eFragmentDensityMapOffsetQCOM | ImageCreateFlagBits::eVideoProfileIndependentKHR;\n  };\n\n  enum class ImageTiling\n  {\n    eOptimal              = VK_IMAGE_TILING_OPTIMAL,\n    eLinear               = VK_IMAGE_TILING_LINEAR,\n    eDrmFormatModifierEXT = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT\n  };\n\n  enum class ImageType\n  {\n    e1D = VK_IMAGE_TYPE_1D,\n    e2D = VK_IMAGE_TYPE_2D,\n    e3D = VK_IMAGE_TYPE_3D\n  };\n\n  enum class ImageUsageFlagBits : VkImageUsageFlags\n  {\n    eTransferSrc                        = VK_IMAGE_USAGE_TRANSFER_SRC_BIT,\n    eTransferDst                        = VK_IMAGE_USAGE_TRANSFER_DST_BIT,\n    eSampled                            = VK_IMAGE_USAGE_SAMPLED_BIT,\n    eStorage                            = VK_IMAGE_USAGE_STORAGE_BIT,\n    eColorAttachment                    = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,\n    eDepthStencilAttachment             = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,\n    eTransientAttachment                = VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT,\n    eInputAttachment                    = VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT,\n    eHostTransfer                       = VK_IMAGE_USAGE_HOST_TRANSFER_BIT,\n    eHostTransferEXT                    = VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT,\n    eVideoDecodeDstKHR                  = VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR,\n    eVideoDecodeSrcKHR                  = VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR,\n    eVideoDecodeDpbKHR                  = VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR,\n    eFragmentDensityMapEXT              = VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT,\n    eFragmentShadingRateAttachmentKHR   = VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,\n    eShadingRateImageNV                 = VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV,\n    eVideoEncodeDstKHR                  = VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR,\n    eVideoEncodeSrcKHR                  = VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR,\n    eVideoEncodeDpbKHR                  = VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR,\n    eAttachmentFeedbackLoopEXT          = VK_IMAGE_USAGE_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT,\n    eInvocationMaskHUAWEI               = VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI,\n    eSampleWeightQCOM                   = VK_IMAGE_USAGE_SAMPLE_WEIGHT_BIT_QCOM,\n    eSampleBlockMatchQCOM               = VK_IMAGE_USAGE_SAMPLE_BLOCK_MATCH_BIT_QCOM,\n    eVideoEncodeQuantizationDeltaMapKHR = VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR,\n    eVideoEncodeEmphasisMapKHR          = VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR\n  };\n\n  using ImageUsageFlags = Flags<ImageUsageFlagBits>;\n\n  template <>\n  struct FlagTraits<ImageUsageFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool            isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ImageUsageFlags allFlags =\n      ImageUsageFlagBits::eTransferSrc | ImageUsageFlagBits::eTransferDst | ImageUsageFlagBits::eSampled | ImageUsageFlagBits::eStorage |\n      ImageUsageFlagBits::eColorAttachment | ImageUsageFlagBits::eDepthStencilAttachment | ImageUsageFlagBits::eTransientAttachment |\n      ImageUsageFlagBits::eInputAttachment | ImageUsageFlagBits::eHostTransfer | ImageUsageFlagBits::eVideoDecodeDstKHR |\n      ImageUsageFlagBits::eVideoDecodeSrcKHR | ImageUsageFlagBits::eVideoDecodeDpbKHR | ImageUsageFlagBits::eFragmentDensityMapEXT |\n      ImageUsageFlagBits::eFragmentShadingRateAttachmentKHR | ImageUsageFlagBits::eVideoEncodeDstKHR | ImageUsageFlagBits::eVideoEncodeSrcKHR |\n      ImageUsageFlagBits::eVideoEncodeDpbKHR | ImageUsageFlagBits::eAttachmentFeedbackLoopEXT | ImageUsageFlagBits::eInvocationMaskHUAWEI |\n      ImageUsageFlagBits::eSampleWeightQCOM | ImageUsageFlagBits::eSampleBlockMatchQCOM | ImageUsageFlagBits::eVideoEncodeQuantizationDeltaMapKHR |\n      ImageUsageFlagBits::eVideoEncodeEmphasisMapKHR;\n  };\n\n  enum class InstanceCreateFlagBits : VkInstanceCreateFlags\n  {\n    eEnumeratePortabilityKHR = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR\n  };\n\n  using InstanceCreateFlags = Flags<InstanceCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<InstanceCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR InstanceCreateFlags allFlags  = InstanceCreateFlagBits::eEnumeratePortabilityKHR;\n  };\n\n  enum class InternalAllocationType\n  {\n    eExecutable = VK_INTERNAL_ALLOCATION_TYPE_EXECUTABLE\n  };\n\n  enum class MemoryHeapFlagBits : VkMemoryHeapFlags\n  {\n    eDeviceLocal      = VK_MEMORY_HEAP_DEVICE_LOCAL_BIT,\n    eMultiInstance    = VK_MEMORY_HEAP_MULTI_INSTANCE_BIT,\n    eMultiInstanceKHR = VK_MEMORY_HEAP_MULTI_INSTANCE_BIT_KHR\n  };\n\n  using MemoryHeapFlags = Flags<MemoryHeapFlagBits>;\n\n  template <>\n  struct FlagTraits<MemoryHeapFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool            isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR MemoryHeapFlags allFlags  = MemoryHeapFlagBits::eDeviceLocal | MemoryHeapFlagBits::eMultiInstance;\n  };\n\n  enum class MemoryPropertyFlagBits : VkMemoryPropertyFlags\n  {\n    eDeviceLocal       = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,\n    eHostVisible       = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,\n    eHostCoherent      = VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,\n    eHostCached        = VK_MEMORY_PROPERTY_HOST_CACHED_BIT,\n    eLazilyAllocated   = VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT,\n    eProtected         = VK_MEMORY_PROPERTY_PROTECTED_BIT,\n    eDeviceCoherentAMD = VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD,\n    eDeviceUncachedAMD = VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD,\n    eRdmaCapableNV     = VK_MEMORY_PROPERTY_RDMA_CAPABLE_BIT_NV\n  };\n\n  using MemoryPropertyFlags = Flags<MemoryPropertyFlagBits>;\n\n  template <>\n  struct FlagTraits<MemoryPropertyFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR MemoryPropertyFlags allFlags =\n      MemoryPropertyFlagBits::eDeviceLocal | MemoryPropertyFlagBits::eHostVisible | MemoryPropertyFlagBits::eHostCoherent |\n      MemoryPropertyFlagBits::eHostCached | MemoryPropertyFlagBits::eLazilyAllocated | MemoryPropertyFlagBits::eProtected |\n      MemoryPropertyFlagBits::eDeviceCoherentAMD | MemoryPropertyFlagBits::eDeviceUncachedAMD | MemoryPropertyFlagBits::eRdmaCapableNV;\n  };\n\n  enum class PhysicalDeviceType\n  {\n    eOther         = VK_PHYSICAL_DEVICE_TYPE_OTHER,\n    eIntegratedGpu = VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU,\n    eDiscreteGpu   = VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU,\n    eVirtualGpu    = VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU,\n    eCpu           = VK_PHYSICAL_DEVICE_TYPE_CPU\n  };\n\n  enum class QueueFlagBits : VkQueueFlags\n  {\n    eGraphics       = VK_QUEUE_GRAPHICS_BIT,\n    eCompute        = VK_QUEUE_COMPUTE_BIT,\n    eTransfer       = VK_QUEUE_TRANSFER_BIT,\n    eSparseBinding  = VK_QUEUE_SPARSE_BINDING_BIT,\n    eProtected      = VK_QUEUE_PROTECTED_BIT,\n    eVideoDecodeKHR = VK_QUEUE_VIDEO_DECODE_BIT_KHR,\n    eVideoEncodeKHR = VK_QUEUE_VIDEO_ENCODE_BIT_KHR,\n    eOpticalFlowNV  = VK_QUEUE_OPTICAL_FLOW_BIT_NV\n  };\n\n  using QueueFlags = Flags<QueueFlagBits>;\n\n  template <>\n  struct FlagTraits<QueueFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool       isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR QueueFlags allFlags  = QueueFlagBits::eGraphics | QueueFlagBits::eCompute | QueueFlagBits::eTransfer |\n                                                               QueueFlagBits::eSparseBinding | QueueFlagBits::eProtected | QueueFlagBits::eVideoDecodeKHR |\n                                                               QueueFlagBits::eVideoEncodeKHR | QueueFlagBits::eOpticalFlowNV;\n  };\n\n  enum class SampleCountFlagBits : VkSampleCountFlags\n  {\n    e1  = VK_SAMPLE_COUNT_1_BIT,\n    e2  = VK_SAMPLE_COUNT_2_BIT,\n    e4  = VK_SAMPLE_COUNT_4_BIT,\n    e8  = VK_SAMPLE_COUNT_8_BIT,\n    e16 = VK_SAMPLE_COUNT_16_BIT,\n    e32 = VK_SAMPLE_COUNT_32_BIT,\n    e64 = VK_SAMPLE_COUNT_64_BIT\n  };\n\n  using SampleCountFlags = Flags<SampleCountFlagBits>;\n\n  template <>\n  struct FlagTraits<SampleCountFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool             isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR SampleCountFlags allFlags  = SampleCountFlagBits::e1 | SampleCountFlagBits::e2 | SampleCountFlagBits::e4 |\n                                                                     SampleCountFlagBits::e8 | SampleCountFlagBits::e16 | SampleCountFlagBits::e32 |\n                                                                     SampleCountFlagBits::e64;\n  };\n\n  enum class SystemAllocationScope\n  {\n    eCommand  = VK_SYSTEM_ALLOCATION_SCOPE_COMMAND,\n    eObject   = VK_SYSTEM_ALLOCATION_SCOPE_OBJECT,\n    eCache    = VK_SYSTEM_ALLOCATION_SCOPE_CACHE,\n    eDevice   = VK_SYSTEM_ALLOCATION_SCOPE_DEVICE,\n    eInstance = VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE\n  };\n\n  enum class DeviceCreateFlagBits : VkDeviceCreateFlags\n  {\n  };\n\n  using DeviceCreateFlags = Flags<DeviceCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<DeviceCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool              isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR DeviceCreateFlags allFlags  = {};\n  };\n\n  enum class DeviceQueueCreateFlagBits : VkDeviceQueueCreateFlags\n  {\n    eProtected = VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT\n  };\n\n  using DeviceQueueCreateFlags = Flags<DeviceQueueCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<DeviceQueueCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                   isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR DeviceQueueCreateFlags allFlags  = DeviceQueueCreateFlagBits::eProtected;\n  };\n\n  enum class PipelineStageFlagBits : VkPipelineStageFlags\n  {\n    eTopOfPipe                        = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,\n    eDrawIndirect                     = VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT,\n    eVertexInput                      = VK_PIPELINE_STAGE_VERTEX_INPUT_BIT,\n    eVertexShader                     = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,\n    eTessellationControlShader        = VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT,\n    eTessellationEvaluationShader     = VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT,\n    eGeometryShader                   = VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT,\n    eFragmentShader                   = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,\n    eEarlyFragmentTests               = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT,\n    eLateFragmentTests                = VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,\n    eColorAttachmentOutput            = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,\n    eComputeShader                    = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,\n    eTransfer                         = VK_PIPELINE_STAGE_TRANSFER_BIT,\n    eBottomOfPipe                     = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,\n    eHost                             = VK_PIPELINE_STAGE_HOST_BIT,\n    eAllGraphics                      = VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,\n    eAllCommands                      = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,\n    eNone                             = VK_PIPELINE_STAGE_NONE,\n    eNoneKHR                          = VK_PIPELINE_STAGE_NONE_KHR,\n    eTransformFeedbackEXT             = VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT,\n    eConditionalRenderingEXT          = VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT,\n    eAccelerationStructureBuildKHR    = VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR,\n    eAccelerationStructureBuildNV     = VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_NV,\n    eRayTracingShaderKHR              = VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR,\n    eRayTracingShaderNV               = VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_NV,\n    eFragmentDensityProcessEXT        = VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT,\n    eFragmentShadingRateAttachmentKHR = VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,\n    eShadingRateImageNV               = VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV,\n    eCommandPreprocessNV              = VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV,\n    eCommandPreprocessEXT             = VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_EXT,\n    eTaskShaderEXT                    = VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT,\n    eTaskShaderNV                     = VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV,\n    eMeshShaderEXT                    = VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT,\n    eMeshShaderNV                     = VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV\n  };\n\n  using PipelineStageFlags = Flags<PipelineStageFlagBits>;\n\n  template <>\n  struct FlagTraits<PipelineStageFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool               isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineStageFlags allFlags =\n      PipelineStageFlagBits::eTopOfPipe | PipelineStageFlagBits::eDrawIndirect | PipelineStageFlagBits::eVertexInput | PipelineStageFlagBits::eVertexShader |\n      PipelineStageFlagBits::eTessellationControlShader | PipelineStageFlagBits::eTessellationEvaluationShader | PipelineStageFlagBits::eGeometryShader |\n      PipelineStageFlagBits::eFragmentShader | PipelineStageFlagBits::eEarlyFragmentTests | PipelineStageFlagBits::eLateFragmentTests |\n      PipelineStageFlagBits::eColorAttachmentOutput | PipelineStageFlagBits::eComputeShader | PipelineStageFlagBits::eTransfer |\n      PipelineStageFlagBits::eBottomOfPipe | PipelineStageFlagBits::eHost | PipelineStageFlagBits::eAllGraphics | PipelineStageFlagBits::eAllCommands |\n      PipelineStageFlagBits::eNone | PipelineStageFlagBits::eTransformFeedbackEXT | PipelineStageFlagBits::eConditionalRenderingEXT |\n      PipelineStageFlagBits::eAccelerationStructureBuildKHR | PipelineStageFlagBits::eRayTracingShaderKHR | PipelineStageFlagBits::eFragmentDensityProcessEXT |\n      PipelineStageFlagBits::eFragmentShadingRateAttachmentKHR | PipelineStageFlagBits::eCommandPreprocessNV | PipelineStageFlagBits::eTaskShaderEXT |\n      PipelineStageFlagBits::eMeshShaderEXT;\n  };\n\n  enum class MemoryMapFlagBits : VkMemoryMapFlags\n  {\n    ePlacedEXT = VK_MEMORY_MAP_PLACED_BIT_EXT\n  };\n\n  using MemoryMapFlags = Flags<MemoryMapFlagBits>;\n\n  template <>\n  struct FlagTraits<MemoryMapFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool           isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR MemoryMapFlags allFlags  = MemoryMapFlagBits::ePlacedEXT;\n  };\n\n  enum class ImageAspectFlagBits : VkImageAspectFlags\n  {\n    eColor           = VK_IMAGE_ASPECT_COLOR_BIT,\n    eDepth           = VK_IMAGE_ASPECT_DEPTH_BIT,\n    eStencil         = VK_IMAGE_ASPECT_STENCIL_BIT,\n    eMetadata        = VK_IMAGE_ASPECT_METADATA_BIT,\n    ePlane0          = VK_IMAGE_ASPECT_PLANE_0_BIT,\n    ePlane0KHR       = VK_IMAGE_ASPECT_PLANE_0_BIT_KHR,\n    ePlane1          = VK_IMAGE_ASPECT_PLANE_1_BIT,\n    ePlane1KHR       = VK_IMAGE_ASPECT_PLANE_1_BIT_KHR,\n    ePlane2          = VK_IMAGE_ASPECT_PLANE_2_BIT,\n    ePlane2KHR       = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR,\n    eNone            = VK_IMAGE_ASPECT_NONE,\n    eNoneKHR         = VK_IMAGE_ASPECT_NONE_KHR,\n    eMemoryPlane0EXT = VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT,\n    eMemoryPlane1EXT = VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT,\n    eMemoryPlane2EXT = VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT,\n    eMemoryPlane3EXT = VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT\n  };\n\n  using ImageAspectFlags = Flags<ImageAspectFlagBits>;\n\n  template <>\n  struct FlagTraits<ImageAspectFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool             isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ImageAspectFlags allFlags = ImageAspectFlagBits::eColor | ImageAspectFlagBits::eDepth | ImageAspectFlagBits::eStencil |\n                                                                     ImageAspectFlagBits::eMetadata | ImageAspectFlagBits::ePlane0 |\n                                                                     ImageAspectFlagBits::ePlane1 | ImageAspectFlagBits::ePlane2 | ImageAspectFlagBits::eNone |\n                                                                     ImageAspectFlagBits::eMemoryPlane0EXT | ImageAspectFlagBits::eMemoryPlane1EXT |\n                                                                     ImageAspectFlagBits::eMemoryPlane2EXT | ImageAspectFlagBits::eMemoryPlane3EXT;\n  };\n\n  enum class SparseImageFormatFlagBits : VkSparseImageFormatFlags\n  {\n    eSingleMiptail        = VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT,\n    eAlignedMipSize       = VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT,\n    eNonstandardBlockSize = VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT\n  };\n\n  using SparseImageFormatFlags = Flags<SparseImageFormatFlagBits>;\n\n  template <>\n  struct FlagTraits<SparseImageFormatFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                   isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR SparseImageFormatFlags allFlags =\n      SparseImageFormatFlagBits::eSingleMiptail | SparseImageFormatFlagBits::eAlignedMipSize | SparseImageFormatFlagBits::eNonstandardBlockSize;\n  };\n\n  enum class SparseMemoryBindFlagBits : VkSparseMemoryBindFlags\n  {\n    eMetadata = VK_SPARSE_MEMORY_BIND_METADATA_BIT\n  };\n\n  using SparseMemoryBindFlags = Flags<SparseMemoryBindFlagBits>;\n\n  template <>\n  struct FlagTraits<SparseMemoryBindFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                  isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR SparseMemoryBindFlags allFlags  = SparseMemoryBindFlagBits::eMetadata;\n  };\n\n  enum class FenceCreateFlagBits : VkFenceCreateFlags\n  {\n    eSignaled = VK_FENCE_CREATE_SIGNALED_BIT\n  };\n\n  using FenceCreateFlags = Flags<FenceCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<FenceCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool             isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR FenceCreateFlags allFlags  = FenceCreateFlagBits::eSignaled;\n  };\n\n  enum class SemaphoreCreateFlagBits : VkSemaphoreCreateFlags\n  {\n  };\n\n  using SemaphoreCreateFlags = Flags<SemaphoreCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<SemaphoreCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                 isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR SemaphoreCreateFlags allFlags  = {};\n  };\n\n  enum class EventCreateFlagBits : VkEventCreateFlags\n  {\n    eDeviceOnly    = VK_EVENT_CREATE_DEVICE_ONLY_BIT,\n    eDeviceOnlyKHR = VK_EVENT_CREATE_DEVICE_ONLY_BIT_KHR\n  };\n\n  using EventCreateFlags = Flags<EventCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<EventCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool             isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR EventCreateFlags allFlags  = EventCreateFlagBits::eDeviceOnly;\n  };\n\n  enum class QueryPipelineStatisticFlagBits : VkQueryPipelineStatisticFlags\n  {\n    eInputAssemblyVertices                   = VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT,\n    eInputAssemblyPrimitives                 = VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT,\n    eVertexShaderInvocations                 = VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT,\n    eGeometryShaderInvocations               = VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT,\n    eGeometryShaderPrimitives                = VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT,\n    eClippingInvocations                     = VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT,\n    eClippingPrimitives                      = VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT,\n    eFragmentShaderInvocations               = VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT,\n    eTessellationControlShaderPatches        = VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT,\n    eTessellationEvaluationShaderInvocations = VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT,\n    eComputeShaderInvocations                = VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT,\n    eTaskShaderInvocationsEXT                = VK_QUERY_PIPELINE_STATISTIC_TASK_SHADER_INVOCATIONS_BIT_EXT,\n    eMeshShaderInvocationsEXT                = VK_QUERY_PIPELINE_STATISTIC_MESH_SHADER_INVOCATIONS_BIT_EXT,\n    eClusterCullingShaderInvocationsHUAWEI   = VK_QUERY_PIPELINE_STATISTIC_CLUSTER_CULLING_SHADER_INVOCATIONS_BIT_HUAWEI\n  };\n\n  using QueryPipelineStatisticFlags = Flags<QueryPipelineStatisticFlagBits>;\n\n  template <>\n  struct FlagTraits<QueryPipelineStatisticFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                        isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR QueryPipelineStatisticFlags allFlags =\n      QueryPipelineStatisticFlagBits::eInputAssemblyVertices | QueryPipelineStatisticFlagBits::eInputAssemblyPrimitives |\n      QueryPipelineStatisticFlagBits::eVertexShaderInvocations | QueryPipelineStatisticFlagBits::eGeometryShaderInvocations |\n      QueryPipelineStatisticFlagBits::eGeometryShaderPrimitives | QueryPipelineStatisticFlagBits::eClippingInvocations |\n      QueryPipelineStatisticFlagBits::eClippingPrimitives | QueryPipelineStatisticFlagBits::eFragmentShaderInvocations |\n      QueryPipelineStatisticFlagBits::eTessellationControlShaderPatches | QueryPipelineStatisticFlagBits::eTessellationEvaluationShaderInvocations |\n      QueryPipelineStatisticFlagBits::eComputeShaderInvocations | QueryPipelineStatisticFlagBits::eTaskShaderInvocationsEXT |\n      QueryPipelineStatisticFlagBits::eMeshShaderInvocationsEXT | QueryPipelineStatisticFlagBits::eClusterCullingShaderInvocationsHUAWEI;\n  };\n\n  enum class QueryResultFlagBits : VkQueryResultFlags\n  {\n    e64               = VK_QUERY_RESULT_64_BIT,\n    eWait             = VK_QUERY_RESULT_WAIT_BIT,\n    eWithAvailability = VK_QUERY_RESULT_WITH_AVAILABILITY_BIT,\n    ePartial          = VK_QUERY_RESULT_PARTIAL_BIT,\n    eWithStatusKHR    = VK_QUERY_RESULT_WITH_STATUS_BIT_KHR\n  };\n\n  using QueryResultFlags = Flags<QueryResultFlagBits>;\n\n  template <>\n  struct FlagTraits<QueryResultFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool             isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR QueryResultFlags allFlags  = QueryResultFlagBits::e64 | QueryResultFlagBits::eWait |\n                                                                     QueryResultFlagBits::eWithAvailability | QueryResultFlagBits::ePartial |\n                                                                     QueryResultFlagBits::eWithStatusKHR;\n  };\n\n  enum class QueryType\n  {\n    eOcclusion                                                = VK_QUERY_TYPE_OCCLUSION,\n    ePipelineStatistics                                       = VK_QUERY_TYPE_PIPELINE_STATISTICS,\n    eTimestamp                                                = VK_QUERY_TYPE_TIMESTAMP,\n    eResultStatusOnlyKHR                                      = VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR,\n    eTransformFeedbackStreamEXT                               = VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT,\n    ePerformanceQueryKHR                                      = VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR,\n    eAccelerationStructureCompactedSizeKHR                    = VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR,\n    eAccelerationStructureSerializationSizeKHR                = VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR,\n    eAccelerationStructureCompactedSizeNV                     = VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV,\n    ePerformanceQueryINTEL                                    = VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL,\n    eVideoEncodeFeedbackKHR                                   = VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR,\n    eMeshPrimitivesGeneratedEXT                               = VK_QUERY_TYPE_MESH_PRIMITIVES_GENERATED_EXT,\n    ePrimitivesGeneratedEXT                                   = VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT,\n    eAccelerationStructureSerializationBottomLevelPointersKHR = VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR,\n    eAccelerationStructureSizeKHR                             = VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR,\n    eMicromapSerializationSizeEXT                             = VK_QUERY_TYPE_MICROMAP_SERIALIZATION_SIZE_EXT,\n    eMicromapCompactedSizeEXT                                 = VK_QUERY_TYPE_MICROMAP_COMPACTED_SIZE_EXT\n  };\n\n  enum class QueryPoolCreateFlagBits : VkQueryPoolCreateFlags\n  {\n  };\n\n  using QueryPoolCreateFlags = Flags<QueryPoolCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<QueryPoolCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                 isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR QueryPoolCreateFlags allFlags  = {};\n  };\n\n  enum class BufferCreateFlagBits : VkBufferCreateFlags\n  {\n    eSparseBinding                    = VK_BUFFER_CREATE_SPARSE_BINDING_BIT,\n    eSparseResidency                  = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT,\n    eSparseAliased                    = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT,\n    eProtected                        = VK_BUFFER_CREATE_PROTECTED_BIT,\n    eDeviceAddressCaptureReplay       = VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT,\n    eDeviceAddressCaptureReplayEXT    = VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT,\n    eDeviceAddressCaptureReplayKHR    = VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR,\n    eDescriptorBufferCaptureReplayEXT = VK_BUFFER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT,\n    eVideoProfileIndependentKHR       = VK_BUFFER_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR\n  };\n\n  using BufferCreateFlags = Flags<BufferCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<BufferCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool              isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR BufferCreateFlags allFlags =\n      BufferCreateFlagBits::eSparseBinding | BufferCreateFlagBits::eSparseResidency | BufferCreateFlagBits::eSparseAliased | BufferCreateFlagBits::eProtected |\n      BufferCreateFlagBits::eDeviceAddressCaptureReplay | BufferCreateFlagBits::eDescriptorBufferCaptureReplayEXT |\n      BufferCreateFlagBits::eVideoProfileIndependentKHR;\n  };\n\n  enum class BufferUsageFlagBits : VkBufferUsageFlags\n  {\n    eTransferSrc                       = VK_BUFFER_USAGE_TRANSFER_SRC_BIT,\n    eTransferDst                       = VK_BUFFER_USAGE_TRANSFER_DST_BIT,\n    eUniformTexelBuffer                = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,\n    eStorageTexelBuffer                = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT,\n    eUniformBuffer                     = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,\n    eStorageBuffer                     = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,\n    eIndexBuffer                       = VK_BUFFER_USAGE_INDEX_BUFFER_BIT,\n    eVertexBuffer                      = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,\n    eIndirectBuffer                    = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT,\n    eShaderDeviceAddress               = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,\n    eShaderDeviceAddressEXT            = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT,\n    eShaderDeviceAddressKHR            = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR,\n    eVideoDecodeSrcKHR                 = VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR,\n    eVideoDecodeDstKHR                 = VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR,\n    eTransformFeedbackBufferEXT        = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT,\n    eTransformFeedbackCounterBufferEXT = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT,\n    eConditionalRenderingEXT           = VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT,\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n    eExecutionGraphScratchAMDX = VK_BUFFER_USAGE_EXECUTION_GRAPH_SCRATCH_BIT_AMDX,\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n    eAccelerationStructureBuildInputReadOnlyKHR = VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR,\n    eAccelerationStructureStorageKHR            = VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR,\n    eShaderBindingTableKHR                      = VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR,\n    eRayTracingNV                               = VK_BUFFER_USAGE_RAY_TRACING_BIT_NV,\n    eVideoEncodeDstKHR                          = VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR,\n    eVideoEncodeSrcKHR                          = VK_BUFFER_USAGE_VIDEO_ENCODE_SRC_BIT_KHR,\n    eSamplerDescriptorBufferEXT                 = VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT,\n    eResourceDescriptorBufferEXT                = VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT,\n    ePushDescriptorsDescriptorBufferEXT         = VK_BUFFER_USAGE_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT,\n    eMicromapBuildInputReadOnlyEXT              = VK_BUFFER_USAGE_MICROMAP_BUILD_INPUT_READ_ONLY_BIT_EXT,\n    eMicromapStorageEXT                         = VK_BUFFER_USAGE_MICROMAP_STORAGE_BIT_EXT\n  };\n\n  using BufferUsageFlags = Flags<BufferUsageFlagBits>;\n\n  template <>\n  struct FlagTraits<BufferUsageFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool             isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR BufferUsageFlags allFlags =\n      BufferUsageFlagBits::eTransferSrc | BufferUsageFlagBits::eTransferDst | BufferUsageFlagBits::eUniformTexelBuffer |\n      BufferUsageFlagBits::eStorageTexelBuffer | BufferUsageFlagBits::eUniformBuffer | BufferUsageFlagBits::eStorageBuffer | BufferUsageFlagBits::eIndexBuffer |\n      BufferUsageFlagBits::eVertexBuffer | BufferUsageFlagBits::eIndirectBuffer | BufferUsageFlagBits::eShaderDeviceAddress |\n      BufferUsageFlagBits::eVideoDecodeSrcKHR | BufferUsageFlagBits::eVideoDecodeDstKHR | BufferUsageFlagBits::eTransformFeedbackBufferEXT |\n      BufferUsageFlagBits::eTransformFeedbackCounterBufferEXT | BufferUsageFlagBits::eConditionalRenderingEXT\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      | BufferUsageFlagBits::eExecutionGraphScratchAMDX\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n      | BufferUsageFlagBits::eAccelerationStructureBuildInputReadOnlyKHR | BufferUsageFlagBits::eAccelerationStructureStorageKHR |\n      BufferUsageFlagBits::eShaderBindingTableKHR | BufferUsageFlagBits::eVideoEncodeDstKHR | BufferUsageFlagBits::eVideoEncodeSrcKHR |\n      BufferUsageFlagBits::eSamplerDescriptorBufferEXT | BufferUsageFlagBits::eResourceDescriptorBufferEXT |\n      BufferUsageFlagBits::ePushDescriptorsDescriptorBufferEXT | BufferUsageFlagBits::eMicromapBuildInputReadOnlyEXT | BufferUsageFlagBits::eMicromapStorageEXT;\n  };\n\n  enum class SharingMode\n  {\n    eExclusive  = VK_SHARING_MODE_EXCLUSIVE,\n    eConcurrent = VK_SHARING_MODE_CONCURRENT\n  };\n\n  enum class BufferViewCreateFlagBits : VkBufferViewCreateFlags\n  {\n  };\n\n  using BufferViewCreateFlags = Flags<BufferViewCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<BufferViewCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                  isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR BufferViewCreateFlags allFlags  = {};\n  };\n\n  enum class ImageLayout\n  {\n    eUndefined                                = VK_IMAGE_LAYOUT_UNDEFINED,\n    eGeneral                                  = VK_IMAGE_LAYOUT_GENERAL,\n    eColorAttachmentOptimal                   = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,\n    eDepthStencilAttachmentOptimal            = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,\n    eDepthStencilReadOnlyOptimal              = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,\n    eShaderReadOnlyOptimal                    = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,\n    eTransferSrcOptimal                       = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,\n    eTransferDstOptimal                       = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,\n    ePreinitialized                           = VK_IMAGE_LAYOUT_PREINITIALIZED,\n    eDepthReadOnlyStencilAttachmentOptimal    = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL,\n    eDepthReadOnlyStencilAttachmentOptimalKHR = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR,\n    eDepthAttachmentStencilReadOnlyOptimal    = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL,\n    eDepthAttachmentStencilReadOnlyOptimalKHR = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR,\n    eDepthAttachmentOptimal                   = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,\n    eDepthAttachmentOptimalKHR                = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR,\n    eDepthReadOnlyOptimal                     = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,\n    eDepthReadOnlyOptimalKHR                  = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR,\n    eStencilAttachmentOptimal                 = VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL,\n    eStencilAttachmentOptimalKHR              = VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR,\n    eStencilReadOnlyOptimal                   = VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,\n    eStencilReadOnlyOptimalKHR                = VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR,\n    eReadOnlyOptimal                          = VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL,\n    eReadOnlyOptimalKHR                       = VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR,\n    eAttachmentOptimal                        = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL,\n    eAttachmentOptimalKHR                     = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR,\n    eRenderingLocalRead                       = VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ,\n    eRenderingLocalReadKHR                    = VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR,\n    ePresentSrcKHR                            = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,\n    eVideoDecodeDstKHR                        = VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR,\n    eVideoDecodeSrcKHR                        = VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR,\n    eVideoDecodeDpbKHR                        = VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR,\n    eSharedPresentKHR                         = VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,\n    eFragmentDensityMapOptimalEXT             = VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT,\n    eFragmentShadingRateAttachmentOptimalKHR  = VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR,\n    eShadingRateOptimalNV                     = VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV,\n    eVideoEncodeDstKHR                        = VK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR,\n    eVideoEncodeSrcKHR                        = VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR,\n    eVideoEncodeDpbKHR                        = VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR,\n    eAttachmentFeedbackLoopOptimalEXT         = VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT,\n    eVideoEncodeQuantizationMapKHR            = VK_IMAGE_LAYOUT_VIDEO_ENCODE_QUANTIZATION_MAP_KHR\n  };\n\n  enum class ComponentSwizzle\n  {\n    eIdentity = VK_COMPONENT_SWIZZLE_IDENTITY,\n    eZero     = VK_COMPONENT_SWIZZLE_ZERO,\n    eOne      = VK_COMPONENT_SWIZZLE_ONE,\n    eR        = VK_COMPONENT_SWIZZLE_R,\n    eG        = VK_COMPONENT_SWIZZLE_G,\n    eB        = VK_COMPONENT_SWIZZLE_B,\n    eA        = VK_COMPONENT_SWIZZLE_A\n  };\n\n  enum class ImageViewCreateFlagBits : VkImageViewCreateFlags\n  {\n    eFragmentDensityMapDynamicEXT     = VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT,\n    eDescriptorBufferCaptureReplayEXT = VK_IMAGE_VIEW_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT,\n    eFragmentDensityMapDeferredEXT    = VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT\n  };\n\n  using ImageViewCreateFlags = Flags<ImageViewCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<ImageViewCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                 isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ImageViewCreateFlags allFlags  = ImageViewCreateFlagBits::eFragmentDensityMapDynamicEXT |\n                                                                         ImageViewCreateFlagBits::eDescriptorBufferCaptureReplayEXT |\n                                                                         ImageViewCreateFlagBits::eFragmentDensityMapDeferredEXT;\n  };\n\n  enum class ImageViewType\n  {\n    e1D        = VK_IMAGE_VIEW_TYPE_1D,\n    e2D        = VK_IMAGE_VIEW_TYPE_2D,\n    e3D        = VK_IMAGE_VIEW_TYPE_3D,\n    eCube      = VK_IMAGE_VIEW_TYPE_CUBE,\n    e1DArray   = VK_IMAGE_VIEW_TYPE_1D_ARRAY,\n    e2DArray   = VK_IMAGE_VIEW_TYPE_2D_ARRAY,\n    eCubeArray = VK_IMAGE_VIEW_TYPE_CUBE_ARRAY\n  };\n\n  enum class ShaderModuleCreateFlagBits : VkShaderModuleCreateFlags\n  {\n  };\n\n  using ShaderModuleCreateFlags = Flags<ShaderModuleCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<ShaderModuleCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                    isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ShaderModuleCreateFlags allFlags  = {};\n  };\n\n  enum class PipelineCacheCreateFlagBits : VkPipelineCacheCreateFlags\n  {\n    eExternallySynchronized         = VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT,\n    eExternallySynchronizedEXT      = VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT,\n    eInternallySynchronizedMergeKHR = VK_PIPELINE_CACHE_CREATE_INTERNALLY_SYNCHRONIZED_MERGE_BIT_KHR\n  };\n\n  using PipelineCacheCreateFlags = Flags<PipelineCacheCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<PipelineCacheCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                     isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineCacheCreateFlags allFlags =\n      PipelineCacheCreateFlagBits::eExternallySynchronized | PipelineCacheCreateFlagBits::eInternallySynchronizedMergeKHR;\n  };\n\n  enum class BlendFactor\n  {\n    eZero                  = VK_BLEND_FACTOR_ZERO,\n    eOne                   = VK_BLEND_FACTOR_ONE,\n    eSrcColor              = VK_BLEND_FACTOR_SRC_COLOR,\n    eOneMinusSrcColor      = VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR,\n    eDstColor              = VK_BLEND_FACTOR_DST_COLOR,\n    eOneMinusDstColor      = VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR,\n    eSrcAlpha              = VK_BLEND_FACTOR_SRC_ALPHA,\n    eOneMinusSrcAlpha      = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,\n    eDstAlpha              = VK_BLEND_FACTOR_DST_ALPHA,\n    eOneMinusDstAlpha      = VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA,\n    eConstantColor         = VK_BLEND_FACTOR_CONSTANT_COLOR,\n    eOneMinusConstantColor = VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR,\n    eConstantAlpha         = VK_BLEND_FACTOR_CONSTANT_ALPHA,\n    eOneMinusConstantAlpha = VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA,\n    eSrcAlphaSaturate      = VK_BLEND_FACTOR_SRC_ALPHA_SATURATE,\n    eSrc1Color             = VK_BLEND_FACTOR_SRC1_COLOR,\n    eOneMinusSrc1Color     = VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR,\n    eSrc1Alpha             = VK_BLEND_FACTOR_SRC1_ALPHA,\n    eOneMinusSrc1Alpha     = VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA\n  };\n\n  enum class BlendOp\n  {\n    eAdd                 = VK_BLEND_OP_ADD,\n    eSubtract            = VK_BLEND_OP_SUBTRACT,\n    eReverseSubtract     = VK_BLEND_OP_REVERSE_SUBTRACT,\n    eMin                 = VK_BLEND_OP_MIN,\n    eMax                 = VK_BLEND_OP_MAX,\n    eZeroEXT             = VK_BLEND_OP_ZERO_EXT,\n    eSrcEXT              = VK_BLEND_OP_SRC_EXT,\n    eDstEXT              = VK_BLEND_OP_DST_EXT,\n    eSrcOverEXT          = VK_BLEND_OP_SRC_OVER_EXT,\n    eDstOverEXT          = VK_BLEND_OP_DST_OVER_EXT,\n    eSrcInEXT            = VK_BLEND_OP_SRC_IN_EXT,\n    eDstInEXT            = VK_BLEND_OP_DST_IN_EXT,\n    eSrcOutEXT           = VK_BLEND_OP_SRC_OUT_EXT,\n    eDstOutEXT           = VK_BLEND_OP_DST_OUT_EXT,\n    eSrcAtopEXT          = VK_BLEND_OP_SRC_ATOP_EXT,\n    eDstAtopEXT          = VK_BLEND_OP_DST_ATOP_EXT,\n    eXorEXT              = VK_BLEND_OP_XOR_EXT,\n    eMultiplyEXT         = VK_BLEND_OP_MULTIPLY_EXT,\n    eScreenEXT           = VK_BLEND_OP_SCREEN_EXT,\n    eOverlayEXT          = VK_BLEND_OP_OVERLAY_EXT,\n    eDarkenEXT           = VK_BLEND_OP_DARKEN_EXT,\n    eLightenEXT          = VK_BLEND_OP_LIGHTEN_EXT,\n    eColordodgeEXT       = VK_BLEND_OP_COLORDODGE_EXT,\n    eColorburnEXT        = VK_BLEND_OP_COLORBURN_EXT,\n    eHardlightEXT        = VK_BLEND_OP_HARDLIGHT_EXT,\n    eSoftlightEXT        = VK_BLEND_OP_SOFTLIGHT_EXT,\n    eDifferenceEXT       = VK_BLEND_OP_DIFFERENCE_EXT,\n    eExclusionEXT        = VK_BLEND_OP_EXCLUSION_EXT,\n    eInvertEXT           = VK_BLEND_OP_INVERT_EXT,\n    eInvertRgbEXT        = VK_BLEND_OP_INVERT_RGB_EXT,\n    eLineardodgeEXT      = VK_BLEND_OP_LINEARDODGE_EXT,\n    eLinearburnEXT       = VK_BLEND_OP_LINEARBURN_EXT,\n    eVividlightEXT       = VK_BLEND_OP_VIVIDLIGHT_EXT,\n    eLinearlightEXT      = VK_BLEND_OP_LINEARLIGHT_EXT,\n    ePinlightEXT         = VK_BLEND_OP_PINLIGHT_EXT,\n    eHardmixEXT          = VK_BLEND_OP_HARDMIX_EXT,\n    eHslHueEXT           = VK_BLEND_OP_HSL_HUE_EXT,\n    eHslSaturationEXT    = VK_BLEND_OP_HSL_SATURATION_EXT,\n    eHslColorEXT         = VK_BLEND_OP_HSL_COLOR_EXT,\n    eHslLuminosityEXT    = VK_BLEND_OP_HSL_LUMINOSITY_EXT,\n    ePlusEXT             = VK_BLEND_OP_PLUS_EXT,\n    ePlusClampedEXT      = VK_BLEND_OP_PLUS_CLAMPED_EXT,\n    ePlusClampedAlphaEXT = VK_BLEND_OP_PLUS_CLAMPED_ALPHA_EXT,\n    ePlusDarkerEXT       = VK_BLEND_OP_PLUS_DARKER_EXT,\n    eMinusEXT            = VK_BLEND_OP_MINUS_EXT,\n    eMinusClampedEXT     = VK_BLEND_OP_MINUS_CLAMPED_EXT,\n    eContrastEXT         = VK_BLEND_OP_CONTRAST_EXT,\n    eInvertOvgEXT        = VK_BLEND_OP_INVERT_OVG_EXT,\n    eRedEXT              = VK_BLEND_OP_RED_EXT,\n    eGreenEXT            = VK_BLEND_OP_GREEN_EXT,\n    eBlueEXT             = VK_BLEND_OP_BLUE_EXT\n  };\n\n  enum class ColorComponentFlagBits : VkColorComponentFlags\n  {\n    eR = VK_COLOR_COMPONENT_R_BIT,\n    eG = VK_COLOR_COMPONENT_G_BIT,\n    eB = VK_COLOR_COMPONENT_B_BIT,\n    eA = VK_COLOR_COMPONENT_A_BIT\n  };\n\n  using ColorComponentFlags = Flags<ColorComponentFlagBits>;\n\n  template <>\n  struct FlagTraits<ColorComponentFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ColorComponentFlags allFlags =\n      ColorComponentFlagBits::eR | ColorComponentFlagBits::eG | ColorComponentFlagBits::eB | ColorComponentFlagBits::eA;\n  };\n\n  enum class CompareOp\n  {\n    eNever          = VK_COMPARE_OP_NEVER,\n    eLess           = VK_COMPARE_OP_LESS,\n    eEqual          = VK_COMPARE_OP_EQUAL,\n    eLessOrEqual    = VK_COMPARE_OP_LESS_OR_EQUAL,\n    eGreater        = VK_COMPARE_OP_GREATER,\n    eNotEqual       = VK_COMPARE_OP_NOT_EQUAL,\n    eGreaterOrEqual = VK_COMPARE_OP_GREATER_OR_EQUAL,\n    eAlways         = VK_COMPARE_OP_ALWAYS\n  };\n\n  enum class CullModeFlagBits : VkCullModeFlags\n  {\n    eNone         = VK_CULL_MODE_NONE,\n    eFront        = VK_CULL_MODE_FRONT_BIT,\n    eBack         = VK_CULL_MODE_BACK_BIT,\n    eFrontAndBack = VK_CULL_MODE_FRONT_AND_BACK\n  };\n\n  using CullModeFlags = Flags<CullModeFlagBits>;\n\n  template <>\n  struct FlagTraits<CullModeFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool          isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR CullModeFlags allFlags =\n      CullModeFlagBits::eNone | CullModeFlagBits::eFront | CullModeFlagBits::eBack | CullModeFlagBits::eFrontAndBack;\n  };\n\n  enum class DynamicState\n  {\n    eViewport                            = VK_DYNAMIC_STATE_VIEWPORT,\n    eScissor                             = VK_DYNAMIC_STATE_SCISSOR,\n    eLineWidth                           = VK_DYNAMIC_STATE_LINE_WIDTH,\n    eDepthBias                           = VK_DYNAMIC_STATE_DEPTH_BIAS,\n    eBlendConstants                      = VK_DYNAMIC_STATE_BLEND_CONSTANTS,\n    eDepthBounds                         = VK_DYNAMIC_STATE_DEPTH_BOUNDS,\n    eStencilCompareMask                  = VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK,\n    eStencilWriteMask                    = VK_DYNAMIC_STATE_STENCIL_WRITE_MASK,\n    eStencilReference                    = VK_DYNAMIC_STATE_STENCIL_REFERENCE,\n    eCullMode                            = VK_DYNAMIC_STATE_CULL_MODE,\n    eCullModeEXT                         = VK_DYNAMIC_STATE_CULL_MODE_EXT,\n    eFrontFace                           = VK_DYNAMIC_STATE_FRONT_FACE,\n    eFrontFaceEXT                        = VK_DYNAMIC_STATE_FRONT_FACE_EXT,\n    ePrimitiveTopology                   = VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY,\n    ePrimitiveTopologyEXT                = VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT,\n    eViewportWithCount                   = VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT,\n    eViewportWithCountEXT                = VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT,\n    eScissorWithCount                    = VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT,\n    eScissorWithCountEXT                 = VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT,\n    eVertexInputBindingStride            = VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE,\n    eVertexInputBindingStrideEXT         = VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT,\n    eDepthTestEnable                     = VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE,\n    eDepthTestEnableEXT                  = VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT,\n    eDepthWriteEnable                    = VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE,\n    eDepthWriteEnableEXT                 = VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT,\n    eDepthCompareOp                      = VK_DYNAMIC_STATE_DEPTH_COMPARE_OP,\n    eDepthCompareOpEXT                   = VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT,\n    eDepthBoundsTestEnable               = VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE,\n    eDepthBoundsTestEnableEXT            = VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT,\n    eStencilTestEnable                   = VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE,\n    eStencilTestEnableEXT                = VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT,\n    eStencilOp                           = VK_DYNAMIC_STATE_STENCIL_OP,\n    eStencilOpEXT                        = VK_DYNAMIC_STATE_STENCIL_OP_EXT,\n    eRasterizerDiscardEnable             = VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE,\n    eRasterizerDiscardEnableEXT          = VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT,\n    eDepthBiasEnable                     = VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE,\n    eDepthBiasEnableEXT                  = VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT,\n    ePrimitiveRestartEnable              = VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE,\n    ePrimitiveRestartEnableEXT           = VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT,\n    eLineStipple                         = VK_DYNAMIC_STATE_LINE_STIPPLE,\n    eLineStippleEXT                      = VK_DYNAMIC_STATE_LINE_STIPPLE_EXT,\n    eLineStippleKHR                      = VK_DYNAMIC_STATE_LINE_STIPPLE_KHR,\n    eViewportWScalingNV                  = VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV,\n    eDiscardRectangleEXT                 = VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT,\n    eDiscardRectangleEnableEXT           = VK_DYNAMIC_STATE_DISCARD_RECTANGLE_ENABLE_EXT,\n    eDiscardRectangleModeEXT             = VK_DYNAMIC_STATE_DISCARD_RECTANGLE_MODE_EXT,\n    eSampleLocationsEXT                  = VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT,\n    eRayTracingPipelineStackSizeKHR      = VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR,\n    eViewportShadingRatePaletteNV        = VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV,\n    eViewportCoarseSampleOrderNV         = VK_DYNAMIC_STATE_VIEWPORT_COARSE_SAMPLE_ORDER_NV,\n    eExclusiveScissorEnableNV            = VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_ENABLE_NV,\n    eExclusiveScissorNV                  = VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV,\n    eFragmentShadingRateKHR              = VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR,\n    eVertexInputEXT                      = VK_DYNAMIC_STATE_VERTEX_INPUT_EXT,\n    ePatchControlPointsEXT               = VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT,\n    eLogicOpEXT                          = VK_DYNAMIC_STATE_LOGIC_OP_EXT,\n    eColorWriteEnableEXT                 = VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT,\n    eDepthClampEnableEXT                 = VK_DYNAMIC_STATE_DEPTH_CLAMP_ENABLE_EXT,\n    ePolygonModeEXT                      = VK_DYNAMIC_STATE_POLYGON_MODE_EXT,\n    eRasterizationSamplesEXT             = VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT,\n    eSampleMaskEXT                       = VK_DYNAMIC_STATE_SAMPLE_MASK_EXT,\n    eAlphaToCoverageEnableEXT            = VK_DYNAMIC_STATE_ALPHA_TO_COVERAGE_ENABLE_EXT,\n    eAlphaToOneEnableEXT                 = VK_DYNAMIC_STATE_ALPHA_TO_ONE_ENABLE_EXT,\n    eLogicOpEnableEXT                    = VK_DYNAMIC_STATE_LOGIC_OP_ENABLE_EXT,\n    eColorBlendEnableEXT                 = VK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT,\n    eColorBlendEquationEXT               = VK_DYNAMIC_STATE_COLOR_BLEND_EQUATION_EXT,\n    eColorWriteMaskEXT                   = VK_DYNAMIC_STATE_COLOR_WRITE_MASK_EXT,\n    eTessellationDomainOriginEXT         = VK_DYNAMIC_STATE_TESSELLATION_DOMAIN_ORIGIN_EXT,\n    eRasterizationStreamEXT              = VK_DYNAMIC_STATE_RASTERIZATION_STREAM_EXT,\n    eConservativeRasterizationModeEXT    = VK_DYNAMIC_STATE_CONSERVATIVE_RASTERIZATION_MODE_EXT,\n    eExtraPrimitiveOverestimationSizeEXT = VK_DYNAMIC_STATE_EXTRA_PRIMITIVE_OVERESTIMATION_SIZE_EXT,\n    eDepthClipEnableEXT                  = VK_DYNAMIC_STATE_DEPTH_CLIP_ENABLE_EXT,\n    eSampleLocationsEnableEXT            = VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT,\n    eColorBlendAdvancedEXT               = VK_DYNAMIC_STATE_COLOR_BLEND_ADVANCED_EXT,\n    eProvokingVertexModeEXT              = VK_DYNAMIC_STATE_PROVOKING_VERTEX_MODE_EXT,\n    eLineRasterizationModeEXT            = VK_DYNAMIC_STATE_LINE_RASTERIZATION_MODE_EXT,\n    eLineStippleEnableEXT                = VK_DYNAMIC_STATE_LINE_STIPPLE_ENABLE_EXT,\n    eDepthClipNegativeOneToOneEXT        = VK_DYNAMIC_STATE_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE_EXT,\n    eViewportWScalingEnableNV            = VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_ENABLE_NV,\n    eViewportSwizzleNV                   = VK_DYNAMIC_STATE_VIEWPORT_SWIZZLE_NV,\n    eCoverageToColorEnableNV             = VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_ENABLE_NV,\n    eCoverageToColorLocationNV           = VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_LOCATION_NV,\n    eCoverageModulationModeNV            = VK_DYNAMIC_STATE_COVERAGE_MODULATION_MODE_NV,\n    eCoverageModulationTableEnableNV     = VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_ENABLE_NV,\n    eCoverageModulationTableNV           = VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_NV,\n    eShadingRateImageEnableNV            = VK_DYNAMIC_STATE_SHADING_RATE_IMAGE_ENABLE_NV,\n    eRepresentativeFragmentTestEnableNV  = VK_DYNAMIC_STATE_REPRESENTATIVE_FRAGMENT_TEST_ENABLE_NV,\n    eCoverageReductionModeNV             = VK_DYNAMIC_STATE_COVERAGE_REDUCTION_MODE_NV,\n    eAttachmentFeedbackLoopEnableEXT     = VK_DYNAMIC_STATE_ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT,\n    eDepthClampRangeEXT                  = VK_DYNAMIC_STATE_DEPTH_CLAMP_RANGE_EXT\n  };\n\n  enum class FrontFace\n  {\n    eCounterClockwise = VK_FRONT_FACE_COUNTER_CLOCKWISE,\n    eClockwise        = VK_FRONT_FACE_CLOCKWISE\n  };\n\n  enum class LogicOp\n  {\n    eClear        = VK_LOGIC_OP_CLEAR,\n    eAnd          = VK_LOGIC_OP_AND,\n    eAndReverse   = VK_LOGIC_OP_AND_REVERSE,\n    eCopy         = VK_LOGIC_OP_COPY,\n    eAndInverted  = VK_LOGIC_OP_AND_INVERTED,\n    eNoOp         = VK_LOGIC_OP_NO_OP,\n    eXor          = VK_LOGIC_OP_XOR,\n    eOr           = VK_LOGIC_OP_OR,\n    eNor          = VK_LOGIC_OP_NOR,\n    eEquivalent   = VK_LOGIC_OP_EQUIVALENT,\n    eInvert       = VK_LOGIC_OP_INVERT,\n    eOrReverse    = VK_LOGIC_OP_OR_REVERSE,\n    eCopyInverted = VK_LOGIC_OP_COPY_INVERTED,\n    eOrInverted   = VK_LOGIC_OP_OR_INVERTED,\n    eNand         = VK_LOGIC_OP_NAND,\n    eSet          = VK_LOGIC_OP_SET\n  };\n\n  enum class PipelineCreateFlagBits : VkPipelineCreateFlags\n  {\n    eDisableOptimization                                                = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT,\n    eAllowDerivatives                                                   = VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT,\n    eDerivative                                                         = VK_PIPELINE_CREATE_DERIVATIVE_BIT,\n    eViewIndexFromDeviceIndex                                           = VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT,\n    eViewIndexFromDeviceIndexKHR                                        = VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT_KHR,\n    eDispatchBase                                                       = VK_PIPELINE_CREATE_DISPATCH_BASE_BIT,\n    eDispatchBaseKHR                                                    = VK_PIPELINE_CREATE_DISPATCH_BASE_KHR,\n    eFailOnPipelineCompileRequired                                      = VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT,\n    eFailOnPipelineCompileRequiredEXT                                   = VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT,\n    eEarlyReturnOnFailure                                               = VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT,\n    eEarlyReturnOnFailureEXT                                            = VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT,\n    eNoProtectedAccess                                                  = VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT,\n    eNoProtectedAccessEXT                                               = VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT_EXT,\n    eProtectedAccessOnly                                                = VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT,\n    eProtectedAccessOnlyEXT                                             = VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT_EXT,\n    eRayTracingNoNullAnyHitShadersKHR                                   = VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR,\n    eRayTracingNoNullClosestHitShadersKHR                               = VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR,\n    eRayTracingNoNullMissShadersKHR                                     = VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR,\n    eRayTracingNoNullIntersectionShadersKHR                             = VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR,\n    eRayTracingSkipTrianglesKHR                                         = VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR,\n    eRayTracingSkipAabbsKHR                                             = VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR,\n    eRayTracingShaderGroupHandleCaptureReplayKHR                        = VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR,\n    eDeferCompileNV                                                     = VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV,\n    eRenderingFragmentDensityMapAttachmentEXT                           = VK_PIPELINE_CREATE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT,\n    eVkPipelineRasterizationStateCreateFragmentDensityMapAttachmentEXT  = VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT,\n    eRenderingFragmentShadingRateAttachmentKHR                          = VK_PIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,\n    eVkPipelineRasterizationStateCreateFragmentShadingRateAttachmentKHR = VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,\n    eCaptureStatisticsKHR                                               = VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR,\n    eCaptureInternalRepresentationsKHR                                  = VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR,\n    eIndirectBindableNV                                                 = VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV,\n    eLibraryKHR                                                         = VK_PIPELINE_CREATE_LIBRARY_BIT_KHR,\n    eDescriptorBufferEXT                                                = VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT,\n    eRetainLinkTimeOptimizationInfoEXT                                  = VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT,\n    eLinkTimeOptimizationEXT                                            = VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT,\n    eRayTracingAllowMotionNV                                            = VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV,\n    eColorAttachmentFeedbackLoopEXT                                     = VK_PIPELINE_CREATE_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT,\n    eDepthStencilAttachmentFeedbackLoopEXT                              = VK_PIPELINE_CREATE_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT,\n    eRayTracingOpacityMicromapEXT                                       = VK_PIPELINE_CREATE_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT,\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n    eRayTracingDisplacementMicromapNV = VK_PIPELINE_CREATE_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n  };\n\n  using PipelineCreateFlags = Flags<PipelineCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<PipelineCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineCreateFlags allFlags =\n      PipelineCreateFlagBits::eDisableOptimization | PipelineCreateFlagBits::eAllowDerivatives | PipelineCreateFlagBits::eDerivative |\n      PipelineCreateFlagBits::eViewIndexFromDeviceIndex | PipelineCreateFlagBits::eDispatchBase | PipelineCreateFlagBits::eFailOnPipelineCompileRequired |\n      PipelineCreateFlagBits::eEarlyReturnOnFailure | PipelineCreateFlagBits::eNoProtectedAccess | PipelineCreateFlagBits::eProtectedAccessOnly |\n      PipelineCreateFlagBits::eRayTracingNoNullAnyHitShadersKHR | PipelineCreateFlagBits::eRayTracingNoNullClosestHitShadersKHR |\n      PipelineCreateFlagBits::eRayTracingNoNullMissShadersKHR | PipelineCreateFlagBits::eRayTracingNoNullIntersectionShadersKHR |\n      PipelineCreateFlagBits::eRayTracingSkipTrianglesKHR | PipelineCreateFlagBits::eRayTracingSkipAabbsKHR |\n      PipelineCreateFlagBits::eRayTracingShaderGroupHandleCaptureReplayKHR | PipelineCreateFlagBits::eDeferCompileNV |\n      PipelineCreateFlagBits::eRenderingFragmentDensityMapAttachmentEXT | PipelineCreateFlagBits::eRenderingFragmentShadingRateAttachmentKHR |\n      PipelineCreateFlagBits::eCaptureStatisticsKHR | PipelineCreateFlagBits::eCaptureInternalRepresentationsKHR | PipelineCreateFlagBits::eIndirectBindableNV |\n      PipelineCreateFlagBits::eLibraryKHR | PipelineCreateFlagBits::eDescriptorBufferEXT | PipelineCreateFlagBits::eRetainLinkTimeOptimizationInfoEXT |\n      PipelineCreateFlagBits::eLinkTimeOptimizationEXT | PipelineCreateFlagBits::eRayTracingAllowMotionNV |\n      PipelineCreateFlagBits::eColorAttachmentFeedbackLoopEXT | PipelineCreateFlagBits::eDepthStencilAttachmentFeedbackLoopEXT |\n      PipelineCreateFlagBits::eRayTracingOpacityMicromapEXT\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      | PipelineCreateFlagBits::eRayTracingDisplacementMicromapNV\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n      ;\n  };\n\n  enum class PipelineShaderStageCreateFlagBits : VkPipelineShaderStageCreateFlags\n  {\n    eAllowVaryingSubgroupSize    = VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT,\n    eAllowVaryingSubgroupSizeEXT = VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT,\n    eRequireFullSubgroups        = VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT,\n    eRequireFullSubgroupsEXT     = VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT\n  };\n\n  using PipelineShaderStageCreateFlags = Flags<PipelineShaderStageCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<PipelineShaderStageCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                           isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineShaderStageCreateFlags allFlags =\n      PipelineShaderStageCreateFlagBits::eAllowVaryingSubgroupSize | PipelineShaderStageCreateFlagBits::eRequireFullSubgroups;\n  };\n\n  enum class PolygonMode\n  {\n    eFill            = VK_POLYGON_MODE_FILL,\n    eLine            = VK_POLYGON_MODE_LINE,\n    ePoint           = VK_POLYGON_MODE_POINT,\n    eFillRectangleNV = VK_POLYGON_MODE_FILL_RECTANGLE_NV\n  };\n\n  enum class PrimitiveTopology\n  {\n    ePointList                  = VK_PRIMITIVE_TOPOLOGY_POINT_LIST,\n    eLineList                   = VK_PRIMITIVE_TOPOLOGY_LINE_LIST,\n    eLineStrip                  = VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,\n    eTriangleList               = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,\n    eTriangleStrip              = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,\n    eTriangleFan                = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN,\n    eLineListWithAdjacency      = VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY,\n    eLineStripWithAdjacency     = VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY,\n    eTriangleListWithAdjacency  = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY,\n    eTriangleStripWithAdjacency = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY,\n    ePatchList                  = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST\n  };\n\n  enum class ShaderStageFlagBits : VkShaderStageFlags\n  {\n    eVertex                 = VK_SHADER_STAGE_VERTEX_BIT,\n    eTessellationControl    = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,\n    eTessellationEvaluation = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,\n    eGeometry               = VK_SHADER_STAGE_GEOMETRY_BIT,\n    eFragment               = VK_SHADER_STAGE_FRAGMENT_BIT,\n    eCompute                = VK_SHADER_STAGE_COMPUTE_BIT,\n    eAllGraphics            = VK_SHADER_STAGE_ALL_GRAPHICS,\n    eAll                    = VK_SHADER_STAGE_ALL,\n    eRaygenKHR              = VK_SHADER_STAGE_RAYGEN_BIT_KHR,\n    eRaygenNV               = VK_SHADER_STAGE_RAYGEN_BIT_NV,\n    eAnyHitKHR              = VK_SHADER_STAGE_ANY_HIT_BIT_KHR,\n    eAnyHitNV               = VK_SHADER_STAGE_ANY_HIT_BIT_NV,\n    eClosestHitKHR          = VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR,\n    eClosestHitNV           = VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV,\n    eMissKHR                = VK_SHADER_STAGE_MISS_BIT_KHR,\n    eMissNV                 = VK_SHADER_STAGE_MISS_BIT_NV,\n    eIntersectionKHR        = VK_SHADER_STAGE_INTERSECTION_BIT_KHR,\n    eIntersectionNV         = VK_SHADER_STAGE_INTERSECTION_BIT_NV,\n    eCallableKHR            = VK_SHADER_STAGE_CALLABLE_BIT_KHR,\n    eCallableNV             = VK_SHADER_STAGE_CALLABLE_BIT_NV,\n    eTaskEXT                = VK_SHADER_STAGE_TASK_BIT_EXT,\n    eTaskNV                 = VK_SHADER_STAGE_TASK_BIT_NV,\n    eMeshEXT                = VK_SHADER_STAGE_MESH_BIT_EXT,\n    eMeshNV                 = VK_SHADER_STAGE_MESH_BIT_NV,\n    eSubpassShadingHUAWEI   = VK_SHADER_STAGE_SUBPASS_SHADING_BIT_HUAWEI,\n    eClusterCullingHUAWEI   = VK_SHADER_STAGE_CLUSTER_CULLING_BIT_HUAWEI\n  };\n\n  using ShaderStageFlags = Flags<ShaderStageFlagBits>;\n\n  template <>\n  struct FlagTraits<ShaderStageFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool             isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ShaderStageFlags allFlags =\n      ShaderStageFlagBits::eVertex | ShaderStageFlagBits::eTessellationControl | ShaderStageFlagBits::eTessellationEvaluation | ShaderStageFlagBits::eGeometry |\n      ShaderStageFlagBits::eFragment | ShaderStageFlagBits::eCompute | ShaderStageFlagBits::eAllGraphics | ShaderStageFlagBits::eAll |\n      ShaderStageFlagBits::eRaygenKHR | ShaderStageFlagBits::eAnyHitKHR | ShaderStageFlagBits::eClosestHitKHR | ShaderStageFlagBits::eMissKHR |\n      ShaderStageFlagBits::eIntersectionKHR | ShaderStageFlagBits::eCallableKHR | ShaderStageFlagBits::eTaskEXT | ShaderStageFlagBits::eMeshEXT |\n      ShaderStageFlagBits::eSubpassShadingHUAWEI | ShaderStageFlagBits::eClusterCullingHUAWEI;\n  };\n\n  enum class StencilOp\n  {\n    eKeep              = VK_STENCIL_OP_KEEP,\n    eZero              = VK_STENCIL_OP_ZERO,\n    eReplace           = VK_STENCIL_OP_REPLACE,\n    eIncrementAndClamp = VK_STENCIL_OP_INCREMENT_AND_CLAMP,\n    eDecrementAndClamp = VK_STENCIL_OP_DECREMENT_AND_CLAMP,\n    eInvert            = VK_STENCIL_OP_INVERT,\n    eIncrementAndWrap  = VK_STENCIL_OP_INCREMENT_AND_WRAP,\n    eDecrementAndWrap  = VK_STENCIL_OP_DECREMENT_AND_WRAP\n  };\n\n  enum class VertexInputRate\n  {\n    eVertex   = VK_VERTEX_INPUT_RATE_VERTEX,\n    eInstance = VK_VERTEX_INPUT_RATE_INSTANCE\n  };\n\n  enum class PipelineColorBlendStateCreateFlagBits : VkPipelineColorBlendStateCreateFlags\n  {\n    eRasterizationOrderAttachmentAccessEXT = VK_PIPELINE_COLOR_BLEND_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_BIT_EXT,\n    eRasterizationOrderAttachmentAccessARM = VK_PIPELINE_COLOR_BLEND_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_BIT_ARM\n  };\n\n  using PipelineColorBlendStateCreateFlags = Flags<PipelineColorBlendStateCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<PipelineColorBlendStateCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                               isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineColorBlendStateCreateFlags allFlags =\n      PipelineColorBlendStateCreateFlagBits::eRasterizationOrderAttachmentAccessEXT;\n  };\n\n  enum class PipelineDepthStencilStateCreateFlagBits : VkPipelineDepthStencilStateCreateFlags\n  {\n    eRasterizationOrderAttachmentDepthAccessEXT   = VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT,\n    eRasterizationOrderAttachmentDepthAccessARM   = VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_ARM,\n    eRasterizationOrderAttachmentStencilAccessEXT = VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT,\n    eRasterizationOrderAttachmentStencilAccessARM = VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_ARM\n  };\n\n  using PipelineDepthStencilStateCreateFlags = Flags<PipelineDepthStencilStateCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<PipelineDepthStencilStateCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                 isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineDepthStencilStateCreateFlags allFlags =\n      PipelineDepthStencilStateCreateFlagBits::eRasterizationOrderAttachmentDepthAccessEXT |\n      PipelineDepthStencilStateCreateFlagBits::eRasterizationOrderAttachmentStencilAccessEXT;\n  };\n\n  enum class PipelineDynamicStateCreateFlagBits : VkPipelineDynamicStateCreateFlags\n  {\n  };\n\n  using PipelineDynamicStateCreateFlags = Flags<PipelineDynamicStateCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<PipelineDynamicStateCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                            isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineDynamicStateCreateFlags allFlags  = {};\n  };\n\n  enum class PipelineInputAssemblyStateCreateFlagBits : VkPipelineInputAssemblyStateCreateFlags\n  {\n  };\n\n  using PipelineInputAssemblyStateCreateFlags = Flags<PipelineInputAssemblyStateCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<PipelineInputAssemblyStateCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                  isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineInputAssemblyStateCreateFlags allFlags  = {};\n  };\n\n  enum class PipelineLayoutCreateFlagBits : VkPipelineLayoutCreateFlags\n  {\n    eIndependentSetsEXT = VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT\n  };\n\n  using PipelineLayoutCreateFlags = Flags<PipelineLayoutCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<PipelineLayoutCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                      isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineLayoutCreateFlags allFlags  = PipelineLayoutCreateFlagBits::eIndependentSetsEXT;\n  };\n\n  enum class PipelineMultisampleStateCreateFlagBits : VkPipelineMultisampleStateCreateFlags\n  {\n  };\n\n  using PipelineMultisampleStateCreateFlags = Flags<PipelineMultisampleStateCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<PipelineMultisampleStateCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineMultisampleStateCreateFlags allFlags  = {};\n  };\n\n  enum class PipelineRasterizationStateCreateFlagBits : VkPipelineRasterizationStateCreateFlags\n  {\n  };\n\n  using PipelineRasterizationStateCreateFlags = Flags<PipelineRasterizationStateCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<PipelineRasterizationStateCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                  isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineRasterizationStateCreateFlags allFlags  = {};\n  };\n\n  enum class PipelineTessellationStateCreateFlagBits : VkPipelineTessellationStateCreateFlags\n  {\n  };\n\n  using PipelineTessellationStateCreateFlags = Flags<PipelineTessellationStateCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<PipelineTessellationStateCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                 isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineTessellationStateCreateFlags allFlags  = {};\n  };\n\n  enum class PipelineVertexInputStateCreateFlagBits : VkPipelineVertexInputStateCreateFlags\n  {\n  };\n\n  using PipelineVertexInputStateCreateFlags = Flags<PipelineVertexInputStateCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<PipelineVertexInputStateCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineVertexInputStateCreateFlags allFlags  = {};\n  };\n\n  enum class PipelineViewportStateCreateFlagBits : VkPipelineViewportStateCreateFlags\n  {\n  };\n\n  using PipelineViewportStateCreateFlags = Flags<PipelineViewportStateCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<PipelineViewportStateCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                             isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineViewportStateCreateFlags allFlags  = {};\n  };\n\n  enum class BorderColor\n  {\n    eFloatTransparentBlack = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK,\n    eIntTransparentBlack   = VK_BORDER_COLOR_INT_TRANSPARENT_BLACK,\n    eFloatOpaqueBlack      = VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK,\n    eIntOpaqueBlack        = VK_BORDER_COLOR_INT_OPAQUE_BLACK,\n    eFloatOpaqueWhite      = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,\n    eIntOpaqueWhite        = VK_BORDER_COLOR_INT_OPAQUE_WHITE,\n    eFloatCustomEXT        = VK_BORDER_COLOR_FLOAT_CUSTOM_EXT,\n    eIntCustomEXT          = VK_BORDER_COLOR_INT_CUSTOM_EXT\n  };\n\n  enum class Filter\n  {\n    eNearest  = VK_FILTER_NEAREST,\n    eLinear   = VK_FILTER_LINEAR,\n    eCubicEXT = VK_FILTER_CUBIC_EXT,\n    eCubicIMG = VK_FILTER_CUBIC_IMG\n  };\n\n  enum class SamplerAddressMode\n  {\n    eRepeat               = VK_SAMPLER_ADDRESS_MODE_REPEAT,\n    eMirroredRepeat       = VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT,\n    eClampToEdge          = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,\n    eClampToBorder        = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,\n    eMirrorClampToEdge    = VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,\n    eMirrorClampToEdgeKHR = VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE_KHR\n  };\n\n  enum class SamplerCreateFlagBits : VkSamplerCreateFlags\n  {\n    eSubsampledEXT                     = VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT,\n    eSubsampledCoarseReconstructionEXT = VK_SAMPLER_CREATE_SUBSAMPLED_COARSE_RECONSTRUCTION_BIT_EXT,\n    eDescriptorBufferCaptureReplayEXT  = VK_SAMPLER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT,\n    eNonSeamlessCubeMapEXT             = VK_SAMPLER_CREATE_NON_SEAMLESS_CUBE_MAP_BIT_EXT,\n    eImageProcessingQCOM               = VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM\n  };\n\n  using SamplerCreateFlags = Flags<SamplerCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<SamplerCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool               isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR SamplerCreateFlags allFlags =\n      SamplerCreateFlagBits::eSubsampledEXT | SamplerCreateFlagBits::eSubsampledCoarseReconstructionEXT |\n      SamplerCreateFlagBits::eDescriptorBufferCaptureReplayEXT | SamplerCreateFlagBits::eNonSeamlessCubeMapEXT | SamplerCreateFlagBits::eImageProcessingQCOM;\n  };\n\n  enum class SamplerMipmapMode\n  {\n    eNearest = VK_SAMPLER_MIPMAP_MODE_NEAREST,\n    eLinear  = VK_SAMPLER_MIPMAP_MODE_LINEAR\n  };\n\n  enum class DescriptorPoolCreateFlagBits : VkDescriptorPoolCreateFlags\n  {\n    eFreeDescriptorSet          = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT,\n    eUpdateAfterBind            = VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT,\n    eUpdateAfterBindEXT         = VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT,\n    eHostOnlyEXT                = VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_EXT,\n    eHostOnlyVALVE              = VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE,\n    eAllowOverallocationSetsNV  = VK_DESCRIPTOR_POOL_CREATE_ALLOW_OVERALLOCATION_SETS_BIT_NV,\n    eAllowOverallocationPoolsNV = VK_DESCRIPTOR_POOL_CREATE_ALLOW_OVERALLOCATION_POOLS_BIT_NV\n  };\n\n  using DescriptorPoolCreateFlags = Flags<DescriptorPoolCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<DescriptorPoolCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                      isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR DescriptorPoolCreateFlags allFlags =\n      DescriptorPoolCreateFlagBits::eFreeDescriptorSet | DescriptorPoolCreateFlagBits::eUpdateAfterBind | DescriptorPoolCreateFlagBits::eHostOnlyEXT |\n      DescriptorPoolCreateFlagBits::eAllowOverallocationSetsNV | DescriptorPoolCreateFlagBits::eAllowOverallocationPoolsNV;\n  };\n\n  enum class DescriptorSetLayoutCreateFlagBits : VkDescriptorSetLayoutCreateFlags\n  {\n    eUpdateAfterBindPool          = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT,\n    eUpdateAfterBindPoolEXT       = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT,\n    ePushDescriptor               = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT,\n    ePushDescriptorKHR            = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR,\n    eDescriptorBufferEXT          = VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT,\n    eEmbeddedImmutableSamplersEXT = VK_DESCRIPTOR_SET_LAYOUT_CREATE_EMBEDDED_IMMUTABLE_SAMPLERS_BIT_EXT,\n    eIndirectBindableNV           = VK_DESCRIPTOR_SET_LAYOUT_CREATE_INDIRECT_BINDABLE_BIT_NV,\n    eHostOnlyPoolEXT              = VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_EXT,\n    eHostOnlyPoolVALVE            = VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE,\n    ePerStageNV                   = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PER_STAGE_BIT_NV\n  };\n\n  using DescriptorSetLayoutCreateFlags = Flags<DescriptorSetLayoutCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<DescriptorSetLayoutCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                           isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR DescriptorSetLayoutCreateFlags allFlags =\n      DescriptorSetLayoutCreateFlagBits::eUpdateAfterBindPool | DescriptorSetLayoutCreateFlagBits::ePushDescriptor |\n      DescriptorSetLayoutCreateFlagBits::eDescriptorBufferEXT | DescriptorSetLayoutCreateFlagBits::eEmbeddedImmutableSamplersEXT |\n      DescriptorSetLayoutCreateFlagBits::eIndirectBindableNV | DescriptorSetLayoutCreateFlagBits::eHostOnlyPoolEXT |\n      DescriptorSetLayoutCreateFlagBits::ePerStageNV;\n  };\n\n  enum class DescriptorType\n  {\n    eSampler                            = VK_DESCRIPTOR_TYPE_SAMPLER,\n    eCombinedImageSampler               = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,\n    eSampledImage                       = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,\n    eStorageImage                       = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,\n    eUniformTexelBuffer                 = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER,\n    eStorageTexelBuffer                 = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,\n    eUniformBuffer                      = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,\n    eStorageBuffer                      = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,\n    eUniformBufferDynamic               = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC,\n    eStorageBufferDynamic               = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC,\n    eInputAttachment                    = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,\n    eInlineUniformBlock                 = VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK,\n    eInlineUniformBlockEXT              = VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT,\n    eAccelerationStructureKHR           = VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR,\n    eAccelerationStructureNV            = VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV,\n    eSampleWeightImageQCOM              = VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOM,\n    eBlockMatchImageQCOM                = VK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOM,\n    eMutableEXT                         = VK_DESCRIPTOR_TYPE_MUTABLE_EXT,\n    eMutableVALVE                       = VK_DESCRIPTOR_TYPE_MUTABLE_VALVE,\n    ePartitionedAccelerationStructureNV = VK_DESCRIPTOR_TYPE_PARTITIONED_ACCELERATION_STRUCTURE_NV\n  };\n\n  enum class DescriptorPoolResetFlagBits : VkDescriptorPoolResetFlags\n  {\n  };\n\n  using DescriptorPoolResetFlags = Flags<DescriptorPoolResetFlagBits>;\n\n  template <>\n  struct FlagTraits<DescriptorPoolResetFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                     isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR DescriptorPoolResetFlags allFlags  = {};\n  };\n\n  enum class AccessFlagBits : VkAccessFlags\n  {\n    eIndirectCommandRead                  = VK_ACCESS_INDIRECT_COMMAND_READ_BIT,\n    eIndexRead                            = VK_ACCESS_INDEX_READ_BIT,\n    eVertexAttributeRead                  = VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT,\n    eUniformRead                          = VK_ACCESS_UNIFORM_READ_BIT,\n    eInputAttachmentRead                  = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,\n    eShaderRead                           = VK_ACCESS_SHADER_READ_BIT,\n    eShaderWrite                          = VK_ACCESS_SHADER_WRITE_BIT,\n    eColorAttachmentRead                  = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT,\n    eColorAttachmentWrite                 = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,\n    eDepthStencilAttachmentRead           = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT,\n    eDepthStencilAttachmentWrite          = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,\n    eTransferRead                         = VK_ACCESS_TRANSFER_READ_BIT,\n    eTransferWrite                        = VK_ACCESS_TRANSFER_WRITE_BIT,\n    eHostRead                             = VK_ACCESS_HOST_READ_BIT,\n    eHostWrite                            = VK_ACCESS_HOST_WRITE_BIT,\n    eMemoryRead                           = VK_ACCESS_MEMORY_READ_BIT,\n    eMemoryWrite                          = VK_ACCESS_MEMORY_WRITE_BIT,\n    eNone                                 = VK_ACCESS_NONE,\n    eNoneKHR                              = VK_ACCESS_NONE_KHR,\n    eTransformFeedbackWriteEXT            = VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT,\n    eTransformFeedbackCounterReadEXT      = VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT,\n    eTransformFeedbackCounterWriteEXT     = VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT,\n    eConditionalRenderingReadEXT          = VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT,\n    eColorAttachmentReadNoncoherentEXT    = VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT,\n    eAccelerationStructureReadKHR         = VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR,\n    eAccelerationStructureReadNV          = VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_NV,\n    eAccelerationStructureWriteKHR        = VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR,\n    eAccelerationStructureWriteNV         = VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_NV,\n    eFragmentDensityMapReadEXT            = VK_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT,\n    eFragmentShadingRateAttachmentReadKHR = VK_ACCESS_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR,\n    eShadingRateImageReadNV               = VK_ACCESS_SHADING_RATE_IMAGE_READ_BIT_NV,\n    eCommandPreprocessReadNV              = VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV,\n    eCommandPreprocessReadEXT             = VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_EXT,\n    eCommandPreprocessWriteNV             = VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV,\n    eCommandPreprocessWriteEXT            = VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_EXT\n  };\n\n  using AccessFlags = Flags<AccessFlagBits>;\n\n  template <>\n  struct FlagTraits<AccessFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool        isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR AccessFlags allFlags =\n      AccessFlagBits::eIndirectCommandRead | AccessFlagBits::eIndexRead | AccessFlagBits::eVertexAttributeRead | AccessFlagBits::eUniformRead |\n      AccessFlagBits::eInputAttachmentRead | AccessFlagBits::eShaderRead | AccessFlagBits::eShaderWrite | AccessFlagBits::eColorAttachmentRead |\n      AccessFlagBits::eColorAttachmentWrite | AccessFlagBits::eDepthStencilAttachmentRead | AccessFlagBits::eDepthStencilAttachmentWrite |\n      AccessFlagBits::eTransferRead | AccessFlagBits::eTransferWrite | AccessFlagBits::eHostRead | AccessFlagBits::eHostWrite | AccessFlagBits::eMemoryRead |\n      AccessFlagBits::eMemoryWrite | AccessFlagBits::eNone | AccessFlagBits::eTransformFeedbackWriteEXT | AccessFlagBits::eTransformFeedbackCounterReadEXT |\n      AccessFlagBits::eTransformFeedbackCounterWriteEXT | AccessFlagBits::eConditionalRenderingReadEXT | AccessFlagBits::eColorAttachmentReadNoncoherentEXT |\n      AccessFlagBits::eAccelerationStructureReadKHR | AccessFlagBits::eAccelerationStructureWriteKHR | AccessFlagBits::eFragmentDensityMapReadEXT |\n      AccessFlagBits::eFragmentShadingRateAttachmentReadKHR | AccessFlagBits::eCommandPreprocessReadNV | AccessFlagBits::eCommandPreprocessWriteNV;\n  };\n\n  enum class AttachmentDescriptionFlagBits : VkAttachmentDescriptionFlags\n  {\n    eMayAlias = VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT\n  };\n\n  using AttachmentDescriptionFlags = Flags<AttachmentDescriptionFlagBits>;\n\n  template <>\n  struct FlagTraits<AttachmentDescriptionFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                       isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR AttachmentDescriptionFlags allFlags  = AttachmentDescriptionFlagBits::eMayAlias;\n  };\n\n  enum class AttachmentLoadOp\n  {\n    eLoad     = VK_ATTACHMENT_LOAD_OP_LOAD,\n    eClear    = VK_ATTACHMENT_LOAD_OP_CLEAR,\n    eDontCare = VK_ATTACHMENT_LOAD_OP_DONT_CARE,\n    eNone     = VK_ATTACHMENT_LOAD_OP_NONE,\n    eNoneEXT  = VK_ATTACHMENT_LOAD_OP_NONE_EXT,\n    eNoneKHR  = VK_ATTACHMENT_LOAD_OP_NONE_KHR\n  };\n\n  enum class AttachmentStoreOp\n  {\n    eStore    = VK_ATTACHMENT_STORE_OP_STORE,\n    eDontCare = VK_ATTACHMENT_STORE_OP_DONT_CARE,\n    eNone     = VK_ATTACHMENT_STORE_OP_NONE,\n    eNoneKHR  = VK_ATTACHMENT_STORE_OP_NONE_KHR,\n    eNoneQCOM = VK_ATTACHMENT_STORE_OP_NONE_QCOM,\n    eNoneEXT  = VK_ATTACHMENT_STORE_OP_NONE_EXT\n  };\n\n  enum class DependencyFlagBits : VkDependencyFlags\n  {\n    eByRegion                                    = VK_DEPENDENCY_BY_REGION_BIT,\n    eDeviceGroup                                 = VK_DEPENDENCY_DEVICE_GROUP_BIT,\n    eDeviceGroupKHR                              = VK_DEPENDENCY_DEVICE_GROUP_BIT_KHR,\n    eViewLocal                                   = VK_DEPENDENCY_VIEW_LOCAL_BIT,\n    eViewLocalKHR                                = VK_DEPENDENCY_VIEW_LOCAL_BIT_KHR,\n    eFeedbackLoopEXT                             = VK_DEPENDENCY_FEEDBACK_LOOP_BIT_EXT,\n    eQueueFamilyOwnershipTransferUseAllStagesKHR = VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR\n  };\n\n  using DependencyFlags = Flags<DependencyFlagBits>;\n\n  template <>\n  struct FlagTraits<DependencyFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool            isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR DependencyFlags allFlags  = DependencyFlagBits::eByRegion | DependencyFlagBits::eDeviceGroup |\n                                                                    DependencyFlagBits::eViewLocal | DependencyFlagBits::eFeedbackLoopEXT |\n                                                                    DependencyFlagBits::eQueueFamilyOwnershipTransferUseAllStagesKHR;\n  };\n\n  enum class FramebufferCreateFlagBits : VkFramebufferCreateFlags\n  {\n    eImageless    = VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT,\n    eImagelessKHR = VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR\n  };\n\n  using FramebufferCreateFlags = Flags<FramebufferCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<FramebufferCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                   isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR FramebufferCreateFlags allFlags  = FramebufferCreateFlagBits::eImageless;\n  };\n\n  enum class PipelineBindPoint\n  {\n    eGraphics = VK_PIPELINE_BIND_POINT_GRAPHICS,\n    eCompute  = VK_PIPELINE_BIND_POINT_COMPUTE,\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n    eExecutionGraphAMDX = VK_PIPELINE_BIND_POINT_EXECUTION_GRAPH_AMDX,\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n    eRayTracingKHR        = VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR,\n    eRayTracingNV         = VK_PIPELINE_BIND_POINT_RAY_TRACING_NV,\n    eSubpassShadingHUAWEI = VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI\n  };\n\n  enum class RenderPassCreateFlagBits : VkRenderPassCreateFlags\n  {\n    eTransformQCOM = VK_RENDER_PASS_CREATE_TRANSFORM_BIT_QCOM\n  };\n\n  using RenderPassCreateFlags = Flags<RenderPassCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<RenderPassCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                  isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR RenderPassCreateFlags allFlags  = RenderPassCreateFlagBits::eTransformQCOM;\n  };\n\n  enum class SubpassDescriptionFlagBits : VkSubpassDescriptionFlags\n  {\n    ePerViewAttributesNVX                         = VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX,\n    ePerViewPositionXOnlyNVX                      = VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX,\n    eFragmentRegionQCOM                           = VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM,\n    eShaderResolveQCOM                            = VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM,\n    eRasterizationOrderAttachmentColorAccessEXT   = VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_BIT_EXT,\n    eRasterizationOrderAttachmentColorAccessARM   = VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_BIT_ARM,\n    eRasterizationOrderAttachmentDepthAccessEXT   = VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT,\n    eRasterizationOrderAttachmentDepthAccessARM   = VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_ARM,\n    eRasterizationOrderAttachmentStencilAccessEXT = VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT,\n    eRasterizationOrderAttachmentStencilAccessARM = VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_ARM,\n    eEnableLegacyDitheringEXT                     = VK_SUBPASS_DESCRIPTION_ENABLE_LEGACY_DITHERING_BIT_EXT\n  };\n\n  using SubpassDescriptionFlags = Flags<SubpassDescriptionFlagBits>;\n\n  template <>\n  struct FlagTraits<SubpassDescriptionFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                    isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR SubpassDescriptionFlags allFlags =\n      SubpassDescriptionFlagBits::ePerViewAttributesNVX | SubpassDescriptionFlagBits::ePerViewPositionXOnlyNVX |\n      SubpassDescriptionFlagBits::eFragmentRegionQCOM | SubpassDescriptionFlagBits::eShaderResolveQCOM |\n      SubpassDescriptionFlagBits::eRasterizationOrderAttachmentColorAccessEXT | SubpassDescriptionFlagBits::eRasterizationOrderAttachmentDepthAccessEXT |\n      SubpassDescriptionFlagBits::eRasterizationOrderAttachmentStencilAccessEXT | SubpassDescriptionFlagBits::eEnableLegacyDitheringEXT;\n  };\n\n  enum class CommandPoolCreateFlagBits : VkCommandPoolCreateFlags\n  {\n    eTransient          = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT,\n    eResetCommandBuffer = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,\n    eProtected          = VK_COMMAND_POOL_CREATE_PROTECTED_BIT\n  };\n\n  using CommandPoolCreateFlags = Flags<CommandPoolCreateFlagBits>;\n\n  template <>\n  struct FlagTraits<CommandPoolCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                   isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR CommandPoolCreateFlags allFlags =\n      CommandPoolCreateFlagBits::eTransient | CommandPoolCreateFlagBits::eResetCommandBuffer | CommandPoolCreateFlagBits::eProtected;\n  };\n\n  enum class CommandPoolResetFlagBits : VkCommandPoolResetFlags\n  {\n    eReleaseResources = VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT\n  };\n\n  using CommandPoolResetFlags = Flags<CommandPoolResetFlagBits>;\n\n  template <>\n  struct FlagTraits<CommandPoolResetFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                  isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR CommandPoolResetFlags allFlags  = CommandPoolResetFlagBits::eReleaseResources;\n  };\n\n  enum class CommandBufferLevel\n  {\n    ePrimary   = VK_COMMAND_BUFFER_LEVEL_PRIMARY,\n    eSecondary = VK_COMMAND_BUFFER_LEVEL_SECONDARY\n  };\n\n  enum class CommandBufferResetFlagBits : VkCommandBufferResetFlags\n  {\n    eReleaseResources = VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT\n  };\n\n  using CommandBufferResetFlags = Flags<CommandBufferResetFlagBits>;\n\n  template <>\n  struct FlagTraits<CommandBufferResetFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                    isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR CommandBufferResetFlags allFlags  = CommandBufferResetFlagBits::eReleaseResources;\n  };\n\n  enum class CommandBufferUsageFlagBits : VkCommandBufferUsageFlags\n  {\n    eOneTimeSubmit      = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,\n    eRenderPassContinue = VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT,\n    eSimultaneousUse    = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT\n  };\n\n  using CommandBufferUsageFlags = Flags<CommandBufferUsageFlagBits>;\n\n  template <>\n  struct FlagTraits<CommandBufferUsageFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                    isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR CommandBufferUsageFlags allFlags =\n      CommandBufferUsageFlagBits::eOneTimeSubmit | CommandBufferUsageFlagBits::eRenderPassContinue | CommandBufferUsageFlagBits::eSimultaneousUse;\n  };\n\n  enum class QueryControlFlagBits : VkQueryControlFlags\n  {\n    ePrecise = VK_QUERY_CONTROL_PRECISE_BIT\n  };\n\n  using QueryControlFlags = Flags<QueryControlFlagBits>;\n\n  template <>\n  struct FlagTraits<QueryControlFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool              isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR QueryControlFlags allFlags  = QueryControlFlagBits::ePrecise;\n  };\n\n  enum class IndexType\n  {\n    eUint16   = VK_INDEX_TYPE_UINT16,\n    eUint32   = VK_INDEX_TYPE_UINT32,\n    eUint8    = VK_INDEX_TYPE_UINT8,\n    eUint8EXT = VK_INDEX_TYPE_UINT8_EXT,\n    eUint8KHR = VK_INDEX_TYPE_UINT8_KHR,\n    eNoneKHR  = VK_INDEX_TYPE_NONE_KHR,\n    eNoneNV   = VK_INDEX_TYPE_NONE_NV\n  };\n\n  //=========================\n  //=== Index Type Traits ===\n  //=========================\n\n  template <typename T>\n  struct IndexTypeValue\n  {\n  };\n\n  template <>\n  struct IndexTypeValue<uint16_t>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR IndexType value = IndexType::eUint16;\n  };\n\n  template <>\n  struct CppType<IndexType, IndexType::eUint16>\n  {\n    using Type = uint16_t;\n  };\n\n  template <>\n  struct IndexTypeValue<uint32_t>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR IndexType value = IndexType::eUint32;\n  };\n\n  template <>\n  struct CppType<IndexType, IndexType::eUint32>\n  {\n    using Type = uint32_t;\n  };\n\n  template <>\n  struct IndexTypeValue<uint8_t>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR IndexType value = IndexType::eUint8;\n  };\n\n  template <>\n  struct CppType<IndexType, IndexType::eUint8>\n  {\n    using Type = uint8_t;\n  };\n\n  enum class StencilFaceFlagBits : VkStencilFaceFlags\n  {\n    eFront                 = VK_STENCIL_FACE_FRONT_BIT,\n    eBack                  = VK_STENCIL_FACE_BACK_BIT,\n    eFrontAndBack          = VK_STENCIL_FACE_FRONT_AND_BACK,\n    eVkStencilFrontAndBack = VK_STENCIL_FRONT_AND_BACK\n  };\n\n  using StencilFaceFlags = Flags<StencilFaceFlagBits>;\n\n  template <>\n  struct FlagTraits<StencilFaceFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool             isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StencilFaceFlags allFlags =\n      StencilFaceFlagBits::eFront | StencilFaceFlagBits::eBack | StencilFaceFlagBits::eFrontAndBack;\n  };\n\n  enum class SubpassContents\n  {\n    eInline                              = VK_SUBPASS_CONTENTS_INLINE,\n    eSecondaryCommandBuffers             = VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS,\n    eInlineAndSecondaryCommandBuffersKHR = VK_SUBPASS_CONTENTS_INLINE_AND_SECONDARY_COMMAND_BUFFERS_KHR,\n    eInlineAndSecondaryCommandBuffersEXT = VK_SUBPASS_CONTENTS_INLINE_AND_SECONDARY_COMMAND_BUFFERS_EXT\n  };\n\n  //=== VK_VERSION_1_1 ===\n\n  enum class SubgroupFeatureFlagBits : VkSubgroupFeatureFlags\n  {\n    eBasic              = VK_SUBGROUP_FEATURE_BASIC_BIT,\n    eVote               = VK_SUBGROUP_FEATURE_VOTE_BIT,\n    eArithmetic         = VK_SUBGROUP_FEATURE_ARITHMETIC_BIT,\n    eBallot             = VK_SUBGROUP_FEATURE_BALLOT_BIT,\n    eShuffle            = VK_SUBGROUP_FEATURE_SHUFFLE_BIT,\n    eShuffleRelative    = VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT,\n    eClustered          = VK_SUBGROUP_FEATURE_CLUSTERED_BIT,\n    eQuad               = VK_SUBGROUP_FEATURE_QUAD_BIT,\n    eRotate             = VK_SUBGROUP_FEATURE_ROTATE_BIT,\n    eRotateKHR          = VK_SUBGROUP_FEATURE_ROTATE_BIT_KHR,\n    eRotateClustered    = VK_SUBGROUP_FEATURE_ROTATE_CLUSTERED_BIT,\n    eRotateClusteredKHR = VK_SUBGROUP_FEATURE_ROTATE_CLUSTERED_BIT_KHR,\n    ePartitionedNV      = VK_SUBGROUP_FEATURE_PARTITIONED_BIT_NV\n  };\n\n  using SubgroupFeatureFlags = Flags<SubgroupFeatureFlagBits>;\n\n  template <>\n  struct FlagTraits<SubgroupFeatureFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                 isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR SubgroupFeatureFlags allFlags =\n      SubgroupFeatureFlagBits::eBasic | SubgroupFeatureFlagBits::eVote | SubgroupFeatureFlagBits::eArithmetic | SubgroupFeatureFlagBits::eBallot |\n      SubgroupFeatureFlagBits::eShuffle | SubgroupFeatureFlagBits::eShuffleRelative | SubgroupFeatureFlagBits::eClustered | SubgroupFeatureFlagBits::eQuad |\n      SubgroupFeatureFlagBits::eRotate | SubgroupFeatureFlagBits::eRotateClustered | SubgroupFeatureFlagBits::ePartitionedNV;\n  };\n\n  enum class PeerMemoryFeatureFlagBits : VkPeerMemoryFeatureFlags\n  {\n    eCopySrc    = VK_PEER_MEMORY_FEATURE_COPY_SRC_BIT,\n    eCopyDst    = VK_PEER_MEMORY_FEATURE_COPY_DST_BIT,\n    eGenericSrc = VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT,\n    eGenericDst = VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT\n  };\n  using PeerMemoryFeatureFlagBitsKHR = PeerMemoryFeatureFlagBits;\n\n  using PeerMemoryFeatureFlags    = Flags<PeerMemoryFeatureFlagBits>;\n  using PeerMemoryFeatureFlagsKHR = PeerMemoryFeatureFlags;\n\n  template <>\n  struct FlagTraits<PeerMemoryFeatureFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                   isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PeerMemoryFeatureFlags allFlags  = PeerMemoryFeatureFlagBits::eCopySrc | PeerMemoryFeatureFlagBits::eCopyDst |\n                                                                           PeerMemoryFeatureFlagBits::eGenericSrc | PeerMemoryFeatureFlagBits::eGenericDst;\n  };\n\n  enum class MemoryAllocateFlagBits : VkMemoryAllocateFlags\n  {\n    eDeviceMask                 = VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT,\n    eDeviceAddress              = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT,\n    eDeviceAddressCaptureReplay = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT\n  };\n  using MemoryAllocateFlagBitsKHR = MemoryAllocateFlagBits;\n\n  using MemoryAllocateFlags    = Flags<MemoryAllocateFlagBits>;\n  using MemoryAllocateFlagsKHR = MemoryAllocateFlags;\n\n  template <>\n  struct FlagTraits<MemoryAllocateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR MemoryAllocateFlags allFlags =\n      MemoryAllocateFlagBits::eDeviceMask | MemoryAllocateFlagBits::eDeviceAddress | MemoryAllocateFlagBits::eDeviceAddressCaptureReplay;\n  };\n\n  enum class CommandPoolTrimFlagBits : VkCommandPoolTrimFlags\n  {\n  };\n\n  using CommandPoolTrimFlags    = Flags<CommandPoolTrimFlagBits>;\n  using CommandPoolTrimFlagsKHR = CommandPoolTrimFlags;\n\n  template <>\n  struct FlagTraits<CommandPoolTrimFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                 isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR CommandPoolTrimFlags allFlags  = {};\n  };\n\n  enum class PointClippingBehavior\n  {\n    eAllClipPlanes      = VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES,\n    eUserClipPlanesOnly = VK_POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY\n  };\n  using PointClippingBehaviorKHR = PointClippingBehavior;\n\n  enum class TessellationDomainOrigin\n  {\n    eUpperLeft = VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT,\n    eLowerLeft = VK_TESSELLATION_DOMAIN_ORIGIN_LOWER_LEFT\n  };\n  using TessellationDomainOriginKHR = TessellationDomainOrigin;\n\n  enum class SamplerYcbcrModelConversion\n  {\n    eRgbIdentity   = VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,\n    eYcbcrIdentity = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY,\n    eYcbcr709      = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709,\n    eYcbcr601      = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601,\n    eYcbcr2020     = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020\n  };\n  using SamplerYcbcrModelConversionKHR = SamplerYcbcrModelConversion;\n\n  enum class SamplerYcbcrRange\n  {\n    eItuFull   = VK_SAMPLER_YCBCR_RANGE_ITU_FULL,\n    eItuNarrow = VK_SAMPLER_YCBCR_RANGE_ITU_NARROW\n  };\n  using SamplerYcbcrRangeKHR = SamplerYcbcrRange;\n\n  enum class ChromaLocation\n  {\n    eCositedEven = VK_CHROMA_LOCATION_COSITED_EVEN,\n    eMidpoint    = VK_CHROMA_LOCATION_MIDPOINT\n  };\n  using ChromaLocationKHR = ChromaLocation;\n\n  enum class DescriptorUpdateTemplateType\n  {\n    eDescriptorSet   = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET,\n    ePushDescriptors = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS\n  };\n  using DescriptorUpdateTemplateTypeKHR = DescriptorUpdateTemplateType;\n\n  enum class DescriptorUpdateTemplateCreateFlagBits : VkDescriptorUpdateTemplateCreateFlags\n  {\n  };\n\n  using DescriptorUpdateTemplateCreateFlags    = Flags<DescriptorUpdateTemplateCreateFlagBits>;\n  using DescriptorUpdateTemplateCreateFlagsKHR = DescriptorUpdateTemplateCreateFlags;\n\n  template <>\n  struct FlagTraits<DescriptorUpdateTemplateCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR DescriptorUpdateTemplateCreateFlags allFlags  = {};\n  };\n\n  enum class ExternalMemoryHandleTypeFlagBits : VkExternalMemoryHandleTypeFlags\n  {\n    eOpaqueFd        = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT,\n    eOpaqueWin32     = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT,\n    eOpaqueWin32Kmt  = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT,\n    eD3D11Texture    = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT,\n    eD3D11TextureKmt = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT,\n    eD3D12Heap       = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT,\n    eD3D12Resource   = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT,\n    eDmaBufEXT       = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT,\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n    eAndroidHardwareBufferANDROID = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID,\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n    eHostAllocationEXT          = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT,\n    eHostMappedForeignMemoryEXT = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT,\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n    eZirconVmoFUCHSIA = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA,\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n    eRdmaAddressNV = VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NV,\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n    eScreenBufferQNX = VK_EXTERNAL_MEMORY_HANDLE_TYPE_SCREEN_BUFFER_BIT_QNX,\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n    eMtlbufferEXT  = VK_EXTERNAL_MEMORY_HANDLE_TYPE_MTLBUFFER_BIT_EXT,\n    eMtltextureEXT = VK_EXTERNAL_MEMORY_HANDLE_TYPE_MTLTEXTURE_BIT_EXT,\n    eMtlheapEXT    = VK_EXTERNAL_MEMORY_HANDLE_TYPE_MTLHEAP_BIT_EXT\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n  };\n  using ExternalMemoryHandleTypeFlagBitsKHR = ExternalMemoryHandleTypeFlagBits;\n\n  using ExternalMemoryHandleTypeFlags    = Flags<ExternalMemoryHandleTypeFlagBits>;\n  using ExternalMemoryHandleTypeFlagsKHR = ExternalMemoryHandleTypeFlags;\n\n  template <>\n  struct FlagTraits<ExternalMemoryHandleTypeFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                          isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ExternalMemoryHandleTypeFlags allFlags =\n      ExternalMemoryHandleTypeFlagBits::eOpaqueFd | ExternalMemoryHandleTypeFlagBits::eOpaqueWin32 | ExternalMemoryHandleTypeFlagBits::eOpaqueWin32Kmt |\n      ExternalMemoryHandleTypeFlagBits::eD3D11Texture | ExternalMemoryHandleTypeFlagBits::eD3D11TextureKmt | ExternalMemoryHandleTypeFlagBits::eD3D12Heap |\n      ExternalMemoryHandleTypeFlagBits::eD3D12Resource | ExternalMemoryHandleTypeFlagBits::eDmaBufEXT\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n      | ExternalMemoryHandleTypeFlagBits::eAndroidHardwareBufferANDROID\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n      | ExternalMemoryHandleTypeFlagBits::eHostAllocationEXT | ExternalMemoryHandleTypeFlagBits::eHostMappedForeignMemoryEXT\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n      | ExternalMemoryHandleTypeFlagBits::eZirconVmoFUCHSIA\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n      | ExternalMemoryHandleTypeFlagBits::eRdmaAddressNV\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n      | ExternalMemoryHandleTypeFlagBits::eScreenBufferQNX\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n      | ExternalMemoryHandleTypeFlagBits::eMtlbufferEXT | ExternalMemoryHandleTypeFlagBits::eMtltextureEXT | ExternalMemoryHandleTypeFlagBits::eMtlheapEXT\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n      ;\n  };\n\n  enum class ExternalMemoryFeatureFlagBits : VkExternalMemoryFeatureFlags\n  {\n    eDedicatedOnly = VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT,\n    eExportable    = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT,\n    eImportable    = VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT\n  };\n  using ExternalMemoryFeatureFlagBitsKHR = ExternalMemoryFeatureFlagBits;\n\n  using ExternalMemoryFeatureFlags    = Flags<ExternalMemoryFeatureFlagBits>;\n  using ExternalMemoryFeatureFlagsKHR = ExternalMemoryFeatureFlags;\n\n  template <>\n  struct FlagTraits<ExternalMemoryFeatureFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                       isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ExternalMemoryFeatureFlags allFlags =\n      ExternalMemoryFeatureFlagBits::eDedicatedOnly | ExternalMemoryFeatureFlagBits::eExportable | ExternalMemoryFeatureFlagBits::eImportable;\n  };\n\n  enum class ExternalFenceHandleTypeFlagBits : VkExternalFenceHandleTypeFlags\n  {\n    eOpaqueFd       = VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT,\n    eOpaqueWin32    = VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT,\n    eOpaqueWin32Kmt = VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT,\n    eSyncFd         = VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT\n  };\n  using ExternalFenceHandleTypeFlagBitsKHR = ExternalFenceHandleTypeFlagBits;\n\n  using ExternalFenceHandleTypeFlags    = Flags<ExternalFenceHandleTypeFlagBits>;\n  using ExternalFenceHandleTypeFlagsKHR = ExternalFenceHandleTypeFlags;\n\n  template <>\n  struct FlagTraits<ExternalFenceHandleTypeFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                         isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ExternalFenceHandleTypeFlags allFlags =\n      ExternalFenceHandleTypeFlagBits::eOpaqueFd | ExternalFenceHandleTypeFlagBits::eOpaqueWin32 | ExternalFenceHandleTypeFlagBits::eOpaqueWin32Kmt |\n      ExternalFenceHandleTypeFlagBits::eSyncFd;\n  };\n\n  enum class ExternalFenceFeatureFlagBits : VkExternalFenceFeatureFlags\n  {\n    eExportable = VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT,\n    eImportable = VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT\n  };\n  using ExternalFenceFeatureFlagBitsKHR = ExternalFenceFeatureFlagBits;\n\n  using ExternalFenceFeatureFlags    = Flags<ExternalFenceFeatureFlagBits>;\n  using ExternalFenceFeatureFlagsKHR = ExternalFenceFeatureFlags;\n\n  template <>\n  struct FlagTraits<ExternalFenceFeatureFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                      isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ExternalFenceFeatureFlags allFlags =\n      ExternalFenceFeatureFlagBits::eExportable | ExternalFenceFeatureFlagBits::eImportable;\n  };\n\n  enum class FenceImportFlagBits : VkFenceImportFlags\n  {\n    eTemporary = VK_FENCE_IMPORT_TEMPORARY_BIT\n  };\n  using FenceImportFlagBitsKHR = FenceImportFlagBits;\n\n  using FenceImportFlags    = Flags<FenceImportFlagBits>;\n  using FenceImportFlagsKHR = FenceImportFlags;\n\n  template <>\n  struct FlagTraits<FenceImportFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool             isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR FenceImportFlags allFlags  = FenceImportFlagBits::eTemporary;\n  };\n\n  enum class SemaphoreImportFlagBits : VkSemaphoreImportFlags\n  {\n    eTemporary = VK_SEMAPHORE_IMPORT_TEMPORARY_BIT\n  };\n  using SemaphoreImportFlagBitsKHR = SemaphoreImportFlagBits;\n\n  using SemaphoreImportFlags    = Flags<SemaphoreImportFlagBits>;\n  using SemaphoreImportFlagsKHR = SemaphoreImportFlags;\n\n  template <>\n  struct FlagTraits<SemaphoreImportFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                 isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR SemaphoreImportFlags allFlags  = SemaphoreImportFlagBits::eTemporary;\n  };\n\n  enum class ExternalSemaphoreHandleTypeFlagBits : VkExternalSemaphoreHandleTypeFlags\n  {\n    eOpaqueFd       = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT,\n    eOpaqueWin32    = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT,\n    eOpaqueWin32Kmt = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT,\n    eD3D12Fence     = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT,\n    eD3D11Fence     = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE_BIT,\n    eSyncFd         = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT,\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n    eZirconEventFUCHSIA = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n  };\n  using ExternalSemaphoreHandleTypeFlagBitsKHR = ExternalSemaphoreHandleTypeFlagBits;\n\n  using ExternalSemaphoreHandleTypeFlags    = Flags<ExternalSemaphoreHandleTypeFlagBits>;\n  using ExternalSemaphoreHandleTypeFlagsKHR = ExternalSemaphoreHandleTypeFlags;\n\n  template <>\n  struct FlagTraits<ExternalSemaphoreHandleTypeFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                             isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ExternalSemaphoreHandleTypeFlags allFlags =\n      ExternalSemaphoreHandleTypeFlagBits::eOpaqueFd | ExternalSemaphoreHandleTypeFlagBits::eOpaqueWin32 |\n      ExternalSemaphoreHandleTypeFlagBits::eOpaqueWin32Kmt | ExternalSemaphoreHandleTypeFlagBits::eD3D12Fence | ExternalSemaphoreHandleTypeFlagBits::eSyncFd\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n      | ExternalSemaphoreHandleTypeFlagBits::eZirconEventFUCHSIA\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n      ;\n  };\n\n  enum class ExternalSemaphoreFeatureFlagBits : VkExternalSemaphoreFeatureFlags\n  {\n    eExportable = VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT,\n    eImportable = VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT\n  };\n  using ExternalSemaphoreFeatureFlagBitsKHR = ExternalSemaphoreFeatureFlagBits;\n\n  using ExternalSemaphoreFeatureFlags    = Flags<ExternalSemaphoreFeatureFlagBits>;\n  using ExternalSemaphoreFeatureFlagsKHR = ExternalSemaphoreFeatureFlags;\n\n  template <>\n  struct FlagTraits<ExternalSemaphoreFeatureFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                          isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ExternalSemaphoreFeatureFlags allFlags =\n      ExternalSemaphoreFeatureFlagBits::eExportable | ExternalSemaphoreFeatureFlagBits::eImportable;\n  };\n\n  //=== VK_VERSION_1_2 ===\n\n  enum class DriverId\n  {\n    eAmdProprietary            = VK_DRIVER_ID_AMD_PROPRIETARY,\n    eAmdOpenSource             = VK_DRIVER_ID_AMD_OPEN_SOURCE,\n    eMesaRadv                  = VK_DRIVER_ID_MESA_RADV,\n    eNvidiaProprietary         = VK_DRIVER_ID_NVIDIA_PROPRIETARY,\n    eIntelProprietaryWindows   = VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS,\n    eIntelOpenSourceMESA       = VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA,\n    eImaginationProprietary    = VK_DRIVER_ID_IMAGINATION_PROPRIETARY,\n    eQualcommProprietary       = VK_DRIVER_ID_QUALCOMM_PROPRIETARY,\n    eArmProprietary            = VK_DRIVER_ID_ARM_PROPRIETARY,\n    eGoogleSwiftshader         = VK_DRIVER_ID_GOOGLE_SWIFTSHADER,\n    eGgpProprietary            = VK_DRIVER_ID_GGP_PROPRIETARY,\n    eBroadcomProprietary       = VK_DRIVER_ID_BROADCOM_PROPRIETARY,\n    eMesaLlvmpipe              = VK_DRIVER_ID_MESA_LLVMPIPE,\n    eMoltenvk                  = VK_DRIVER_ID_MOLTENVK,\n    eCoreaviProprietary        = VK_DRIVER_ID_COREAVI_PROPRIETARY,\n    eJuiceProprietary          = VK_DRIVER_ID_JUICE_PROPRIETARY,\n    eVerisiliconProprietary    = VK_DRIVER_ID_VERISILICON_PROPRIETARY,\n    eMesaTurnip                = VK_DRIVER_ID_MESA_TURNIP,\n    eMesaV3Dv                  = VK_DRIVER_ID_MESA_V3DV,\n    eMesaPanvk                 = VK_DRIVER_ID_MESA_PANVK,\n    eSamsungProprietary        = VK_DRIVER_ID_SAMSUNG_PROPRIETARY,\n    eMesaVenus                 = VK_DRIVER_ID_MESA_VENUS,\n    eMesaDozen                 = VK_DRIVER_ID_MESA_DOZEN,\n    eMesaNvk                   = VK_DRIVER_ID_MESA_NVK,\n    eImaginationOpenSourceMESA = VK_DRIVER_ID_IMAGINATION_OPEN_SOURCE_MESA,\n    eMesaHoneykrisp            = VK_DRIVER_ID_MESA_HONEYKRISP,\n    eVulkanScEmulationOnVulkan = VK_DRIVER_ID_VULKAN_SC_EMULATION_ON_VULKAN\n  };\n  using DriverIdKHR = DriverId;\n\n  enum class ShaderFloatControlsIndependence\n  {\n    e32BitOnly = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY,\n    eAll       = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL,\n    eNone      = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE\n  };\n  using ShaderFloatControlsIndependenceKHR = ShaderFloatControlsIndependence;\n\n  enum class DescriptorBindingFlagBits : VkDescriptorBindingFlags\n  {\n    eUpdateAfterBind          = VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT,\n    eUpdateUnusedWhilePending = VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT,\n    ePartiallyBound           = VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT,\n    eVariableDescriptorCount  = VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT\n  };\n  using DescriptorBindingFlagBitsEXT = DescriptorBindingFlagBits;\n\n  using DescriptorBindingFlags    = Flags<DescriptorBindingFlagBits>;\n  using DescriptorBindingFlagsEXT = DescriptorBindingFlags;\n\n  template <>\n  struct FlagTraits<DescriptorBindingFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                   isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR DescriptorBindingFlags allFlags =\n      DescriptorBindingFlagBits::eUpdateAfterBind | DescriptorBindingFlagBits::eUpdateUnusedWhilePending | DescriptorBindingFlagBits::ePartiallyBound |\n      DescriptorBindingFlagBits::eVariableDescriptorCount;\n  };\n\n  enum class ResolveModeFlagBits : VkResolveModeFlags\n  {\n    eNone       = VK_RESOLVE_MODE_NONE,\n    eSampleZero = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT,\n    eAverage    = VK_RESOLVE_MODE_AVERAGE_BIT,\n    eMin        = VK_RESOLVE_MODE_MIN_BIT,\n    eMax        = VK_RESOLVE_MODE_MAX_BIT,\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n    eExternalFormatDownsampleANDROID = VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n  };\n  using ResolveModeFlagBitsKHR = ResolveModeFlagBits;\n\n  using ResolveModeFlags    = Flags<ResolveModeFlagBits>;\n  using ResolveModeFlagsKHR = ResolveModeFlags;\n\n  template <>\n  struct FlagTraits<ResolveModeFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool             isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ResolveModeFlags allFlags  = ResolveModeFlagBits::eNone | ResolveModeFlagBits::eSampleZero |\n                                                                     ResolveModeFlagBits::eAverage | ResolveModeFlagBits::eMin | ResolveModeFlagBits::eMax\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n                                                                   | ResolveModeFlagBits::eExternalFormatDownsampleANDROID\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n      ;\n  };\n\n  enum class SamplerReductionMode\n  {\n    eWeightedAverage               = VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE,\n    eMin                           = VK_SAMPLER_REDUCTION_MODE_MIN,\n    eMax                           = VK_SAMPLER_REDUCTION_MODE_MAX,\n    eWeightedAverageRangeclampQCOM = VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOM\n  };\n  using SamplerReductionModeEXT = SamplerReductionMode;\n\n  enum class SemaphoreType\n  {\n    eBinary   = VK_SEMAPHORE_TYPE_BINARY,\n    eTimeline = VK_SEMAPHORE_TYPE_TIMELINE\n  };\n  using SemaphoreTypeKHR = SemaphoreType;\n\n  enum class SemaphoreWaitFlagBits : VkSemaphoreWaitFlags\n  {\n    eAny = VK_SEMAPHORE_WAIT_ANY_BIT\n  };\n  using SemaphoreWaitFlagBitsKHR = SemaphoreWaitFlagBits;\n\n  using SemaphoreWaitFlags    = Flags<SemaphoreWaitFlagBits>;\n  using SemaphoreWaitFlagsKHR = SemaphoreWaitFlags;\n\n  template <>\n  struct FlagTraits<SemaphoreWaitFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool               isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR SemaphoreWaitFlags allFlags  = SemaphoreWaitFlagBits::eAny;\n  };\n\n  //=== VK_VERSION_1_3 ===\n\n  enum class PipelineCreationFeedbackFlagBits : VkPipelineCreationFeedbackFlags\n  {\n    eValid                       = VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT,\n    eApplicationPipelineCacheHit = VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT,\n    eBasePipelineAcceleration    = VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT\n  };\n  using PipelineCreationFeedbackFlagBitsEXT = PipelineCreationFeedbackFlagBits;\n\n  using PipelineCreationFeedbackFlags    = Flags<PipelineCreationFeedbackFlagBits>;\n  using PipelineCreationFeedbackFlagsEXT = PipelineCreationFeedbackFlags;\n\n  template <>\n  struct FlagTraits<PipelineCreationFeedbackFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                          isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineCreationFeedbackFlags allFlags  = PipelineCreationFeedbackFlagBits::eValid |\n                                                                                  PipelineCreationFeedbackFlagBits::eApplicationPipelineCacheHit |\n                                                                                  PipelineCreationFeedbackFlagBits::eBasePipelineAcceleration;\n  };\n\n  enum class ToolPurposeFlagBits : VkToolPurposeFlags\n  {\n    eValidation         = VK_TOOL_PURPOSE_VALIDATION_BIT,\n    eProfiling          = VK_TOOL_PURPOSE_PROFILING_BIT,\n    eTracing            = VK_TOOL_PURPOSE_TRACING_BIT,\n    eAdditionalFeatures = VK_TOOL_PURPOSE_ADDITIONAL_FEATURES_BIT,\n    eModifyingFeatures  = VK_TOOL_PURPOSE_MODIFYING_FEATURES_BIT,\n    eDebugReportingEXT  = VK_TOOL_PURPOSE_DEBUG_REPORTING_BIT_EXT,\n    eDebugMarkersEXT    = VK_TOOL_PURPOSE_DEBUG_MARKERS_BIT_EXT\n  };\n  using ToolPurposeFlagBitsEXT = ToolPurposeFlagBits;\n\n  using ToolPurposeFlags    = Flags<ToolPurposeFlagBits>;\n  using ToolPurposeFlagsEXT = ToolPurposeFlags;\n\n  template <>\n  struct FlagTraits<ToolPurposeFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool             isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ToolPurposeFlags allFlags =\n      ToolPurposeFlagBits::eValidation | ToolPurposeFlagBits::eProfiling | ToolPurposeFlagBits::eTracing | ToolPurposeFlagBits::eAdditionalFeatures |\n      ToolPurposeFlagBits::eModifyingFeatures | ToolPurposeFlagBits::eDebugReportingEXT | ToolPurposeFlagBits::eDebugMarkersEXT;\n  };\n\n  enum class PrivateDataSlotCreateFlagBits : VkPrivateDataSlotCreateFlags\n  {\n  };\n  using PrivateDataSlotCreateFlagBitsEXT = PrivateDataSlotCreateFlagBits;\n\n  using PrivateDataSlotCreateFlags    = Flags<PrivateDataSlotCreateFlagBits>;\n  using PrivateDataSlotCreateFlagsEXT = PrivateDataSlotCreateFlags;\n\n  template <>\n  struct FlagTraits<PrivateDataSlotCreateFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                       isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PrivateDataSlotCreateFlags allFlags  = {};\n  };\n\n  enum class PipelineStageFlagBits2 : VkPipelineStageFlags2\n  {\n    eNone                             = VK_PIPELINE_STAGE_2_NONE,\n    eTopOfPipe                        = VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT,\n    eDrawIndirect                     = VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT,\n    eVertexInput                      = VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT,\n    eVertexShader                     = VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT,\n    eTessellationControlShader        = VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT,\n    eTessellationEvaluationShader     = VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT,\n    eGeometryShader                   = VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT,\n    eFragmentShader                   = VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT,\n    eEarlyFragmentTests               = VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT,\n    eLateFragmentTests                = VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT,\n    eColorAttachmentOutput            = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT,\n    eComputeShader                    = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,\n    eAllTransfer                      = VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT,\n    eTransfer                         = VK_PIPELINE_STAGE_2_TRANSFER_BIT,\n    eBottomOfPipe                     = VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT,\n    eHost                             = VK_PIPELINE_STAGE_2_HOST_BIT,\n    eAllGraphics                      = VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT,\n    eAllCommands                      = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,\n    eCopy                             = VK_PIPELINE_STAGE_2_COPY_BIT,\n    eResolve                          = VK_PIPELINE_STAGE_2_RESOLVE_BIT,\n    eBlit                             = VK_PIPELINE_STAGE_2_BLIT_BIT,\n    eClear                            = VK_PIPELINE_STAGE_2_CLEAR_BIT,\n    eIndexInput                       = VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT,\n    eVertexAttributeInput             = VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT,\n    ePreRasterizationShaders          = VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT,\n    eVideoDecodeKHR                   = VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR,\n    eVideoEncodeKHR                   = VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR,\n    eTransformFeedbackEXT             = VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT,\n    eConditionalRenderingEXT          = VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT,\n    eCommandPreprocessNV              = VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV,\n    eCommandPreprocessEXT             = VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_EXT,\n    eFragmentShadingRateAttachmentKHR = VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,\n    eShadingRateImageNV               = VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NV,\n    eAccelerationStructureBuildKHR    = VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR,\n    eAccelerationStructureBuildNV     = VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_NV,\n    eRayTracingShaderKHR              = VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR,\n    eRayTracingShaderNV               = VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_NV,\n    eFragmentDensityProcessEXT        = VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT,\n    eTaskShaderEXT                    = VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT,\n    eTaskShaderNV                     = VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_NV,\n    eMeshShaderEXT                    = VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT,\n    eMeshShaderNV                     = VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_NV,\n    eSubpassShaderHUAWEI              = VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI,\n    eSubpassShadingHUAWEI             = VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI,\n    eInvocationMaskHUAWEI             = VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI,\n    eAccelerationStructureCopyKHR     = VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR,\n    eMicromapBuildEXT                 = VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT,\n    eClusterCullingShaderHUAWEI       = VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI,\n    eOpticalFlowNV                    = VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV,\n    eConvertCooperativeVectorMatrixNV = VK_PIPELINE_STAGE_2_CONVERT_COOPERATIVE_VECTOR_MATRIX_BIT_NV\n  };\n  using PipelineStageFlagBits2KHR = PipelineStageFlagBits2;\n\n  using PipelineStageFlags2    = Flags<PipelineStageFlagBits2>;\n  using PipelineStageFlags2KHR = PipelineStageFlags2;\n\n  template <>\n  struct FlagTraits<PipelineStageFlagBits2>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineStageFlags2 allFlags =\n      PipelineStageFlagBits2::eNone | PipelineStageFlagBits2::eTopOfPipe | PipelineStageFlagBits2::eDrawIndirect | PipelineStageFlagBits2::eVertexInput |\n      PipelineStageFlagBits2::eVertexShader | PipelineStageFlagBits2::eTessellationControlShader | PipelineStageFlagBits2::eTessellationEvaluationShader |\n      PipelineStageFlagBits2::eGeometryShader | PipelineStageFlagBits2::eFragmentShader | PipelineStageFlagBits2::eEarlyFragmentTests |\n      PipelineStageFlagBits2::eLateFragmentTests | PipelineStageFlagBits2::eColorAttachmentOutput | PipelineStageFlagBits2::eComputeShader |\n      PipelineStageFlagBits2::eAllTransfer | PipelineStageFlagBits2::eBottomOfPipe | PipelineStageFlagBits2::eHost | PipelineStageFlagBits2::eAllGraphics |\n      PipelineStageFlagBits2::eAllCommands | PipelineStageFlagBits2::eCopy | PipelineStageFlagBits2::eResolve | PipelineStageFlagBits2::eBlit |\n      PipelineStageFlagBits2::eClear | PipelineStageFlagBits2::eIndexInput | PipelineStageFlagBits2::eVertexAttributeInput |\n      PipelineStageFlagBits2::ePreRasterizationShaders | PipelineStageFlagBits2::eVideoDecodeKHR | PipelineStageFlagBits2::eVideoEncodeKHR |\n      PipelineStageFlagBits2::eTransformFeedbackEXT | PipelineStageFlagBits2::eConditionalRenderingEXT | PipelineStageFlagBits2::eCommandPreprocessNV |\n      PipelineStageFlagBits2::eFragmentShadingRateAttachmentKHR | PipelineStageFlagBits2::eAccelerationStructureBuildKHR |\n      PipelineStageFlagBits2::eRayTracingShaderKHR | PipelineStageFlagBits2::eFragmentDensityProcessEXT | PipelineStageFlagBits2::eTaskShaderEXT |\n      PipelineStageFlagBits2::eMeshShaderEXT | PipelineStageFlagBits2::eSubpassShaderHUAWEI | PipelineStageFlagBits2::eInvocationMaskHUAWEI |\n      PipelineStageFlagBits2::eAccelerationStructureCopyKHR | PipelineStageFlagBits2::eMicromapBuildEXT | PipelineStageFlagBits2::eClusterCullingShaderHUAWEI |\n      PipelineStageFlagBits2::eOpticalFlowNV | PipelineStageFlagBits2::eConvertCooperativeVectorMatrixNV;\n  };\n\n  enum class AccessFlagBits2 : VkAccessFlags2\n  {\n    eNone                                 = VK_ACCESS_2_NONE,\n    eIndirectCommandRead                  = VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT,\n    eIndexRead                            = VK_ACCESS_2_INDEX_READ_BIT,\n    eVertexAttributeRead                  = VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT,\n    eUniformRead                          = VK_ACCESS_2_UNIFORM_READ_BIT,\n    eInputAttachmentRead                  = VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT,\n    eShaderRead                           = VK_ACCESS_2_SHADER_READ_BIT,\n    eShaderWrite                          = VK_ACCESS_2_SHADER_WRITE_BIT,\n    eColorAttachmentRead                  = VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT,\n    eColorAttachmentWrite                 = VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT,\n    eDepthStencilAttachmentRead           = VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT,\n    eDepthStencilAttachmentWrite          = VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,\n    eTransferRead                         = VK_ACCESS_2_TRANSFER_READ_BIT,\n    eTransferWrite                        = VK_ACCESS_2_TRANSFER_WRITE_BIT,\n    eHostRead                             = VK_ACCESS_2_HOST_READ_BIT,\n    eHostWrite                            = VK_ACCESS_2_HOST_WRITE_BIT,\n    eMemoryRead                           = VK_ACCESS_2_MEMORY_READ_BIT,\n    eMemoryWrite                          = VK_ACCESS_2_MEMORY_WRITE_BIT,\n    eShaderSampledRead                    = VK_ACCESS_2_SHADER_SAMPLED_READ_BIT,\n    eShaderStorageRead                    = VK_ACCESS_2_SHADER_STORAGE_READ_BIT,\n    eShaderStorageWrite                   = VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,\n    eVideoDecodeReadKHR                   = VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR,\n    eVideoDecodeWriteKHR                  = VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR,\n    eVideoEncodeReadKHR                   = VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR,\n    eVideoEncodeWriteKHR                  = VK_ACCESS_2_VIDEO_ENCODE_WRITE_BIT_KHR,\n    eTransformFeedbackWriteEXT            = VK_ACCESS_2_TRANSFORM_FEEDBACK_WRITE_BIT_EXT,\n    eTransformFeedbackCounterReadEXT      = VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT,\n    eTransformFeedbackCounterWriteEXT     = VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT,\n    eConditionalRenderingReadEXT          = VK_ACCESS_2_CONDITIONAL_RENDERING_READ_BIT_EXT,\n    eCommandPreprocessReadNV              = VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_NV,\n    eCommandPreprocessReadEXT             = VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_EXT,\n    eCommandPreprocessWriteNV             = VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_NV,\n    eCommandPreprocessWriteEXT            = VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_EXT,\n    eFragmentShadingRateAttachmentReadKHR = VK_ACCESS_2_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR,\n    eShadingRateImageReadNV               = VK_ACCESS_2_SHADING_RATE_IMAGE_READ_BIT_NV,\n    eAccelerationStructureReadKHR         = VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR,\n    eAccelerationStructureReadNV          = VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_NV,\n    eAccelerationStructureWriteKHR        = VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR,\n    eAccelerationStructureWriteNV         = VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_NV,\n    eFragmentDensityMapReadEXT            = VK_ACCESS_2_FRAGMENT_DENSITY_MAP_READ_BIT_EXT,\n    eColorAttachmentReadNoncoherentEXT    = VK_ACCESS_2_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT,\n    eDescriptorBufferReadEXT              = VK_ACCESS_2_DESCRIPTOR_BUFFER_READ_BIT_EXT,\n    eInvocationMaskReadHUAWEI             = VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI,\n    eShaderBindingTableReadKHR            = VK_ACCESS_2_SHADER_BINDING_TABLE_READ_BIT_KHR,\n    eMicromapReadEXT                      = VK_ACCESS_2_MICROMAP_READ_BIT_EXT,\n    eMicromapWriteEXT                     = VK_ACCESS_2_MICROMAP_WRITE_BIT_EXT,\n    eOpticalFlowReadNV                    = VK_ACCESS_2_OPTICAL_FLOW_READ_BIT_NV,\n    eOpticalFlowWriteNV                   = VK_ACCESS_2_OPTICAL_FLOW_WRITE_BIT_NV\n  };\n  using AccessFlagBits2KHR = AccessFlagBits2;\n\n  using AccessFlags2    = Flags<AccessFlagBits2>;\n  using AccessFlags2KHR = AccessFlags2;\n\n  template <>\n  struct FlagTraits<AccessFlagBits2>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool         isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR AccessFlags2 allFlags =\n      AccessFlagBits2::eNone | AccessFlagBits2::eIndirectCommandRead | AccessFlagBits2::eIndexRead | AccessFlagBits2::eVertexAttributeRead |\n      AccessFlagBits2::eUniformRead | AccessFlagBits2::eInputAttachmentRead | AccessFlagBits2::eShaderRead | AccessFlagBits2::eShaderWrite |\n      AccessFlagBits2::eColorAttachmentRead | AccessFlagBits2::eColorAttachmentWrite | AccessFlagBits2::eDepthStencilAttachmentRead |\n      AccessFlagBits2::eDepthStencilAttachmentWrite | AccessFlagBits2::eTransferRead | AccessFlagBits2::eTransferWrite | AccessFlagBits2::eHostRead |\n      AccessFlagBits2::eHostWrite | AccessFlagBits2::eMemoryRead | AccessFlagBits2::eMemoryWrite | AccessFlagBits2::eShaderSampledRead |\n      AccessFlagBits2::eShaderStorageRead | AccessFlagBits2::eShaderStorageWrite | AccessFlagBits2::eVideoDecodeReadKHR |\n      AccessFlagBits2::eVideoDecodeWriteKHR | AccessFlagBits2::eVideoEncodeReadKHR | AccessFlagBits2::eVideoEncodeWriteKHR |\n      AccessFlagBits2::eTransformFeedbackWriteEXT | AccessFlagBits2::eTransformFeedbackCounterReadEXT | AccessFlagBits2::eTransformFeedbackCounterWriteEXT |\n      AccessFlagBits2::eConditionalRenderingReadEXT | AccessFlagBits2::eCommandPreprocessReadNV | AccessFlagBits2::eCommandPreprocessWriteNV |\n      AccessFlagBits2::eFragmentShadingRateAttachmentReadKHR | AccessFlagBits2::eAccelerationStructureReadKHR |\n      AccessFlagBits2::eAccelerationStructureWriteKHR | AccessFlagBits2::eFragmentDensityMapReadEXT | AccessFlagBits2::eColorAttachmentReadNoncoherentEXT |\n      AccessFlagBits2::eDescriptorBufferReadEXT | AccessFlagBits2::eInvocationMaskReadHUAWEI | AccessFlagBits2::eShaderBindingTableReadKHR |\n      AccessFlagBits2::eMicromapReadEXT | AccessFlagBits2::eMicromapWriteEXT | AccessFlagBits2::eOpticalFlowReadNV | AccessFlagBits2::eOpticalFlowWriteNV;\n  };\n\n  enum class SubmitFlagBits : VkSubmitFlags\n  {\n    eProtected = VK_SUBMIT_PROTECTED_BIT\n  };\n  using SubmitFlagBitsKHR = SubmitFlagBits;\n\n  using SubmitFlags    = Flags<SubmitFlagBits>;\n  using SubmitFlagsKHR = SubmitFlags;\n\n  template <>\n  struct FlagTraits<SubmitFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool        isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR SubmitFlags allFlags  = SubmitFlagBits::eProtected;\n  };\n\n  enum class RenderingFlagBits : VkRenderingFlags\n  {\n    eContentsSecondaryCommandBuffers = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT,\n    eSuspending                      = VK_RENDERING_SUSPENDING_BIT,\n    eResuming                        = VK_RENDERING_RESUMING_BIT,\n    eEnableLegacyDitheringEXT        = VK_RENDERING_ENABLE_LEGACY_DITHERING_BIT_EXT,\n    eContentsInlineKHR               = VK_RENDERING_CONTENTS_INLINE_BIT_KHR,\n    eContentsInlineEXT               = VK_RENDERING_CONTENTS_INLINE_BIT_EXT\n  };\n  using RenderingFlagBitsKHR = RenderingFlagBits;\n\n  using RenderingFlags    = Flags<RenderingFlagBits>;\n  using RenderingFlagsKHR = RenderingFlags;\n\n  template <>\n  struct FlagTraits<RenderingFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool           isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR RenderingFlags allFlags  = RenderingFlagBits::eContentsSecondaryCommandBuffers | RenderingFlagBits::eSuspending |\n                                                                   RenderingFlagBits::eResuming | RenderingFlagBits::eEnableLegacyDitheringEXT |\n                                                                   RenderingFlagBits::eContentsInlineKHR;\n  };\n\n  enum class FormatFeatureFlagBits2 : VkFormatFeatureFlags2\n  {\n    eSampledImage                                            = VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT,\n    eStorageImage                                            = VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT,\n    eStorageImageAtomic                                      = VK_FORMAT_FEATURE_2_STORAGE_IMAGE_ATOMIC_BIT,\n    eUniformTexelBuffer                                      = VK_FORMAT_FEATURE_2_UNIFORM_TEXEL_BUFFER_BIT,\n    eStorageTexelBuffer                                      = VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_BIT,\n    eStorageTexelBufferAtomic                                = VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_ATOMIC_BIT,\n    eVertexBuffer                                            = VK_FORMAT_FEATURE_2_VERTEX_BUFFER_BIT,\n    eColorAttachment                                         = VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT,\n    eColorAttachmentBlend                                    = VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BLEND_BIT,\n    eDepthStencilAttachment                                  = VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT,\n    eBlitSrc                                                 = VK_FORMAT_FEATURE_2_BLIT_SRC_BIT,\n    eBlitDst                                                 = VK_FORMAT_FEATURE_2_BLIT_DST_BIT,\n    eSampledImageFilterLinear                                = VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT,\n    eTransferSrc                                             = VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT,\n    eTransferDst                                             = VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT,\n    eSampledImageFilterMinmax                                = VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT,\n    eMidpointChromaSamples                                   = VK_FORMAT_FEATURE_2_MIDPOINT_CHROMA_SAMPLES_BIT,\n    eSampledImageYcbcrConversionLinearFilter                 = VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT,\n    eSampledImageYcbcrConversionSeparateReconstructionFilter = VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT,\n    eSampledImageYcbcrConversionChromaReconstructionExplicit = VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT,\n    eSampledImageYcbcrConversionChromaReconstructionExplicitForceable =\n      VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT,\n    eDisjoint                             = VK_FORMAT_FEATURE_2_DISJOINT_BIT,\n    eCositedChromaSamples                 = VK_FORMAT_FEATURE_2_COSITED_CHROMA_SAMPLES_BIT,\n    eStorageReadWithoutFormat             = VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT,\n    eStorageWriteWithoutFormat            = VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT,\n    eSampledImageDepthComparison          = VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT,\n    eSampledImageFilterCubic              = VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_CUBIC_BIT,\n    eSampledImageFilterCubicEXT           = VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT,\n    eHostImageTransfer                    = VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT,\n    eHostImageTransferEXT                 = VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT_EXT,\n    eVideoDecodeOutputKHR                 = VK_FORMAT_FEATURE_2_VIDEO_DECODE_OUTPUT_BIT_KHR,\n    eVideoDecodeDpbKHR                    = VK_FORMAT_FEATURE_2_VIDEO_DECODE_DPB_BIT_KHR,\n    eAccelerationStructureVertexBufferKHR = VK_FORMAT_FEATURE_2_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR,\n    eFragmentDensityMapEXT                = VK_FORMAT_FEATURE_2_FRAGMENT_DENSITY_MAP_BIT_EXT,\n    eFragmentShadingRateAttachmentKHR     = VK_FORMAT_FEATURE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,\n    eVideoEncodeInputKHR                  = VK_FORMAT_FEATURE_2_VIDEO_ENCODE_INPUT_BIT_KHR,\n    eVideoEncodeDpbKHR                    = VK_FORMAT_FEATURE_2_VIDEO_ENCODE_DPB_BIT_KHR,\n    eAccelerationStructureRadiusBufferNV  = VK_FORMAT_FEATURE_2_ACCELERATION_STRUCTURE_RADIUS_BUFFER_BIT_NV,\n    eLinearColorAttachmentNV              = VK_FORMAT_FEATURE_2_LINEAR_COLOR_ATTACHMENT_BIT_NV,\n    eWeightImageQCOM                      = VK_FORMAT_FEATURE_2_WEIGHT_IMAGE_BIT_QCOM,\n    eWeightSampledImageQCOM               = VK_FORMAT_FEATURE_2_WEIGHT_SAMPLED_IMAGE_BIT_QCOM,\n    eBlockMatchingQCOM                    = VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM,\n    eBoxFilterSampledQCOM                 = VK_FORMAT_FEATURE_2_BOX_FILTER_SAMPLED_BIT_QCOM,\n    eOpticalFlowImageNV                   = VK_FORMAT_FEATURE_2_OPTICAL_FLOW_IMAGE_BIT_NV,\n    eOpticalFlowVectorNV                  = VK_FORMAT_FEATURE_2_OPTICAL_FLOW_VECTOR_BIT_NV,\n    eOpticalFlowCostNV                    = VK_FORMAT_FEATURE_2_OPTICAL_FLOW_COST_BIT_NV,\n    eVideoEncodeQuantizationDeltaMapKHR   = VK_FORMAT_FEATURE_2_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR,\n    eVideoEncodeEmphasisMapKHR            = VK_FORMAT_FEATURE_2_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR\n  };\n  using FormatFeatureFlagBits2KHR = FormatFeatureFlagBits2;\n\n  using FormatFeatureFlags2    = Flags<FormatFeatureFlagBits2>;\n  using FormatFeatureFlags2KHR = FormatFeatureFlags2;\n\n  template <>\n  struct FlagTraits<FormatFeatureFlagBits2>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR FormatFeatureFlags2 allFlags =\n      FormatFeatureFlagBits2::eSampledImage | FormatFeatureFlagBits2::eStorageImage | FormatFeatureFlagBits2::eStorageImageAtomic |\n      FormatFeatureFlagBits2::eUniformTexelBuffer | FormatFeatureFlagBits2::eStorageTexelBuffer | FormatFeatureFlagBits2::eStorageTexelBufferAtomic |\n      FormatFeatureFlagBits2::eVertexBuffer | FormatFeatureFlagBits2::eColorAttachment | FormatFeatureFlagBits2::eColorAttachmentBlend |\n      FormatFeatureFlagBits2::eDepthStencilAttachment | FormatFeatureFlagBits2::eBlitSrc | FormatFeatureFlagBits2::eBlitDst |\n      FormatFeatureFlagBits2::eSampledImageFilterLinear | FormatFeatureFlagBits2::eTransferSrc | FormatFeatureFlagBits2::eTransferDst |\n      FormatFeatureFlagBits2::eSampledImageFilterMinmax | FormatFeatureFlagBits2::eMidpointChromaSamples |\n      FormatFeatureFlagBits2::eSampledImageYcbcrConversionLinearFilter | FormatFeatureFlagBits2::eSampledImageYcbcrConversionSeparateReconstructionFilter |\n      FormatFeatureFlagBits2::eSampledImageYcbcrConversionChromaReconstructionExplicit |\n      FormatFeatureFlagBits2::eSampledImageYcbcrConversionChromaReconstructionExplicitForceable | FormatFeatureFlagBits2::eDisjoint |\n      FormatFeatureFlagBits2::eCositedChromaSamples | FormatFeatureFlagBits2::eStorageReadWithoutFormat | FormatFeatureFlagBits2::eStorageWriteWithoutFormat |\n      FormatFeatureFlagBits2::eSampledImageDepthComparison | FormatFeatureFlagBits2::eSampledImageFilterCubic | FormatFeatureFlagBits2::eHostImageTransfer |\n      FormatFeatureFlagBits2::eVideoDecodeOutputKHR | FormatFeatureFlagBits2::eVideoDecodeDpbKHR |\n      FormatFeatureFlagBits2::eAccelerationStructureVertexBufferKHR | FormatFeatureFlagBits2::eFragmentDensityMapEXT |\n      FormatFeatureFlagBits2::eFragmentShadingRateAttachmentKHR | FormatFeatureFlagBits2::eVideoEncodeInputKHR | FormatFeatureFlagBits2::eVideoEncodeDpbKHR |\n      FormatFeatureFlagBits2::eAccelerationStructureRadiusBufferNV | FormatFeatureFlagBits2::eLinearColorAttachmentNV |\n      FormatFeatureFlagBits2::eWeightImageQCOM | FormatFeatureFlagBits2::eWeightSampledImageQCOM | FormatFeatureFlagBits2::eBlockMatchingQCOM |\n      FormatFeatureFlagBits2::eBoxFilterSampledQCOM | FormatFeatureFlagBits2::eOpticalFlowImageNV | FormatFeatureFlagBits2::eOpticalFlowVectorNV |\n      FormatFeatureFlagBits2::eOpticalFlowCostNV | FormatFeatureFlagBits2::eVideoEncodeQuantizationDeltaMapKHR |\n      FormatFeatureFlagBits2::eVideoEncodeEmphasisMapKHR;\n  };\n\n  //=== VK_VERSION_1_4 ===\n\n  enum class QueueGlobalPriority\n  {\n    eLow         = VK_QUEUE_GLOBAL_PRIORITY_LOW,\n    eLowKHR      = VK_QUEUE_GLOBAL_PRIORITY_LOW_KHR,\n    eMedium      = VK_QUEUE_GLOBAL_PRIORITY_MEDIUM,\n    eMediumKHR   = VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR,\n    eHigh        = VK_QUEUE_GLOBAL_PRIORITY_HIGH,\n    eHighKHR     = VK_QUEUE_GLOBAL_PRIORITY_HIGH_KHR,\n    eRealtime    = VK_QUEUE_GLOBAL_PRIORITY_REALTIME,\n    eRealtimeKHR = VK_QUEUE_GLOBAL_PRIORITY_REALTIME_KHR\n  };\n  using QueueGlobalPriorityEXT = QueueGlobalPriority;\n  using QueueGlobalPriorityKHR = QueueGlobalPriority;\n\n  enum class LineRasterizationMode\n  {\n    eDefault              = VK_LINE_RASTERIZATION_MODE_DEFAULT,\n    eDefaultKHR           = VK_LINE_RASTERIZATION_MODE_DEFAULT_KHR,\n    eRectangular          = VK_LINE_RASTERIZATION_MODE_RECTANGULAR,\n    eRectangularKHR       = VK_LINE_RASTERIZATION_MODE_RECTANGULAR_KHR,\n    eBresenham            = VK_LINE_RASTERIZATION_MODE_BRESENHAM,\n    eBresenhamKHR         = VK_LINE_RASTERIZATION_MODE_BRESENHAM_KHR,\n    eRectangularSmooth    = VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH,\n    eRectangularSmoothKHR = VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_KHR\n  };\n  using LineRasterizationModeEXT = LineRasterizationMode;\n  using LineRasterizationModeKHR = LineRasterizationMode;\n\n  enum class MemoryUnmapFlagBits : VkMemoryUnmapFlags\n  {\n    eReserveEXT = VK_MEMORY_UNMAP_RESERVE_BIT_EXT\n  };\n  using MemoryUnmapFlagBitsKHR = MemoryUnmapFlagBits;\n\n  using MemoryUnmapFlags    = Flags<MemoryUnmapFlagBits>;\n  using MemoryUnmapFlagsKHR = MemoryUnmapFlags;\n\n  template <>\n  struct FlagTraits<MemoryUnmapFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool             isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR MemoryUnmapFlags allFlags  = MemoryUnmapFlagBits::eReserveEXT;\n  };\n\n  enum class PipelineCreateFlagBits2 : VkPipelineCreateFlags2\n  {\n    eDisableOptimization           = VK_PIPELINE_CREATE_2_DISABLE_OPTIMIZATION_BIT,\n    eAllowDerivatives              = VK_PIPELINE_CREATE_2_ALLOW_DERIVATIVES_BIT,\n    eDerivative                    = VK_PIPELINE_CREATE_2_DERIVATIVE_BIT,\n    eViewIndexFromDeviceIndex      = VK_PIPELINE_CREATE_2_VIEW_INDEX_FROM_DEVICE_INDEX_BIT,\n    eDispatchBase                  = VK_PIPELINE_CREATE_2_DISPATCH_BASE_BIT,\n    eFailOnPipelineCompileRequired = VK_PIPELINE_CREATE_2_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT,\n    eEarlyReturnOnFailure          = VK_PIPELINE_CREATE_2_EARLY_RETURN_ON_FAILURE_BIT,\n    eNoProtectedAccess             = VK_PIPELINE_CREATE_2_NO_PROTECTED_ACCESS_BIT,\n    eNoProtectedAccessEXT          = VK_PIPELINE_CREATE_2_NO_PROTECTED_ACCESS_BIT_EXT,\n    eProtectedAccessOnly           = VK_PIPELINE_CREATE_2_PROTECTED_ACCESS_ONLY_BIT,\n    eProtectedAccessOnlyEXT        = VK_PIPELINE_CREATE_2_PROTECTED_ACCESS_ONLY_BIT_EXT,\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n    eExecutionGraphAMDX = VK_PIPELINE_CREATE_2_EXECUTION_GRAPH_BIT_AMDX,\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n    eRayTracingAllowSpheresAndLinearSweptSpheresNV = VK_PIPELINE_CREATE_2_RAY_TRACING_ALLOW_SPHERES_AND_LINEAR_SWEPT_SPHERES_BIT_NV,\n    eEnableLegacyDitheringEXT                      = VK_PIPELINE_CREATE_2_ENABLE_LEGACY_DITHERING_BIT_EXT,\n    eDeferCompileNV                                = VK_PIPELINE_CREATE_2_DEFER_COMPILE_BIT_NV,\n    eCaptureStatisticsKHR                          = VK_PIPELINE_CREATE_2_CAPTURE_STATISTICS_BIT_KHR,\n    eCaptureInternalRepresentationsKHR             = VK_PIPELINE_CREATE_2_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR,\n    eLinkTimeOptimizationEXT                       = VK_PIPELINE_CREATE_2_LINK_TIME_OPTIMIZATION_BIT_EXT,\n    eRetainLinkTimeOptimizationInfoEXT             = VK_PIPELINE_CREATE_2_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT,\n    eLibraryKHR                                    = VK_PIPELINE_CREATE_2_LIBRARY_BIT_KHR,\n    eRayTracingSkipTrianglesKHR                    = VK_PIPELINE_CREATE_2_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR,\n    eRayTracingSkipBuiltInPrimitives               = VK_PIPELINE_CREATE_2_RAY_TRACING_SKIP_BUILT_IN_PRIMITIVES_BIT_KHR,\n    eRayTracingSkipAabbsKHR                        = VK_PIPELINE_CREATE_2_RAY_TRACING_SKIP_AABBS_BIT_KHR,\n    eRayTracingNoNullAnyHitShadersKHR              = VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR,\n    eRayTracingNoNullClosestHitShadersKHR          = VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR,\n    eRayTracingNoNullMissShadersKHR                = VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR,\n    eRayTracingNoNullIntersectionShadersKHR        = VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR,\n    eRayTracingShaderGroupHandleCaptureReplayKHR   = VK_PIPELINE_CREATE_2_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR,\n    eIndirectBindableNV                            = VK_PIPELINE_CREATE_2_INDIRECT_BINDABLE_BIT_NV,\n    eRayTracingAllowMotionNV                       = VK_PIPELINE_CREATE_2_RAY_TRACING_ALLOW_MOTION_BIT_NV,\n    eRenderingFragmentShadingRateAttachmentKHR     = VK_PIPELINE_CREATE_2_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,\n    eRenderingFragmentDensityMapAttachmentEXT      = VK_PIPELINE_CREATE_2_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT,\n    eRayTracingOpacityMicromapEXT                  = VK_PIPELINE_CREATE_2_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT,\n    eColorAttachmentFeedbackLoopEXT                = VK_PIPELINE_CREATE_2_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT,\n    eDepthStencilAttachmentFeedbackLoopEXT         = VK_PIPELINE_CREATE_2_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT,\n    eRayTracingDisplacementMicromapNV              = VK_PIPELINE_CREATE_2_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV,\n    eDescriptorBufferEXT                           = VK_PIPELINE_CREATE_2_DESCRIPTOR_BUFFER_BIT_EXT,\n    eDisallowOpacityMicromapARM                    = VK_PIPELINE_CREATE_2_DISALLOW_OPACITY_MICROMAP_BIT_ARM,\n    eCaptureDataKHR                                = VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR,\n    eIndirectBindableEXT                           = VK_PIPELINE_CREATE_2_INDIRECT_BINDABLE_BIT_EXT\n  };\n  using PipelineCreateFlagBits2KHR = PipelineCreateFlagBits2;\n\n  using PipelineCreateFlags2    = Flags<PipelineCreateFlagBits2>;\n  using PipelineCreateFlags2KHR = PipelineCreateFlags2;\n\n  template <>\n  struct FlagTraits<PipelineCreateFlagBits2>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                 isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineCreateFlags2 allFlags =\n      PipelineCreateFlagBits2::eDisableOptimization | PipelineCreateFlagBits2::eAllowDerivatives | PipelineCreateFlagBits2::eDerivative |\n      PipelineCreateFlagBits2::eViewIndexFromDeviceIndex | PipelineCreateFlagBits2::eDispatchBase | PipelineCreateFlagBits2::eFailOnPipelineCompileRequired |\n      PipelineCreateFlagBits2::eEarlyReturnOnFailure | PipelineCreateFlagBits2::eNoProtectedAccess | PipelineCreateFlagBits2::eProtectedAccessOnly\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      | PipelineCreateFlagBits2::eExecutionGraphAMDX\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n      | PipelineCreateFlagBits2::eRayTracingAllowSpheresAndLinearSweptSpheresNV | PipelineCreateFlagBits2::eEnableLegacyDitheringEXT |\n      PipelineCreateFlagBits2::eDeferCompileNV | PipelineCreateFlagBits2::eCaptureStatisticsKHR | PipelineCreateFlagBits2::eCaptureInternalRepresentationsKHR |\n      PipelineCreateFlagBits2::eLinkTimeOptimizationEXT | PipelineCreateFlagBits2::eRetainLinkTimeOptimizationInfoEXT | PipelineCreateFlagBits2::eLibraryKHR |\n      PipelineCreateFlagBits2::eRayTracingSkipTrianglesKHR | PipelineCreateFlagBits2::eRayTracingSkipAabbsKHR |\n      PipelineCreateFlagBits2::eRayTracingNoNullAnyHitShadersKHR | PipelineCreateFlagBits2::eRayTracingNoNullClosestHitShadersKHR |\n      PipelineCreateFlagBits2::eRayTracingNoNullMissShadersKHR | PipelineCreateFlagBits2::eRayTracingNoNullIntersectionShadersKHR |\n      PipelineCreateFlagBits2::eRayTracingShaderGroupHandleCaptureReplayKHR | PipelineCreateFlagBits2::eIndirectBindableNV |\n      PipelineCreateFlagBits2::eRayTracingAllowMotionNV | PipelineCreateFlagBits2::eRenderingFragmentShadingRateAttachmentKHR |\n      PipelineCreateFlagBits2::eRenderingFragmentDensityMapAttachmentEXT | PipelineCreateFlagBits2::eRayTracingOpacityMicromapEXT |\n      PipelineCreateFlagBits2::eColorAttachmentFeedbackLoopEXT | PipelineCreateFlagBits2::eDepthStencilAttachmentFeedbackLoopEXT |\n      PipelineCreateFlagBits2::eRayTracingDisplacementMicromapNV | PipelineCreateFlagBits2::eDescriptorBufferEXT |\n      PipelineCreateFlagBits2::eDisallowOpacityMicromapARM | PipelineCreateFlagBits2::eCaptureDataKHR | PipelineCreateFlagBits2::eIndirectBindableEXT;\n  };\n\n  enum class BufferUsageFlagBits2 : VkBufferUsageFlags2\n  {\n    eTransferSrc         = VK_BUFFER_USAGE_2_TRANSFER_SRC_BIT,\n    eTransferDst         = VK_BUFFER_USAGE_2_TRANSFER_DST_BIT,\n    eUniformTexelBuffer  = VK_BUFFER_USAGE_2_UNIFORM_TEXEL_BUFFER_BIT,\n    eStorageTexelBuffer  = VK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT,\n    eUniformBuffer       = VK_BUFFER_USAGE_2_UNIFORM_BUFFER_BIT,\n    eStorageBuffer       = VK_BUFFER_USAGE_2_STORAGE_BUFFER_BIT,\n    eIndexBuffer         = VK_BUFFER_USAGE_2_INDEX_BUFFER_BIT,\n    eVertexBuffer        = VK_BUFFER_USAGE_2_VERTEX_BUFFER_BIT,\n    eIndirectBuffer      = VK_BUFFER_USAGE_2_INDIRECT_BUFFER_BIT,\n    eShaderDeviceAddress = VK_BUFFER_USAGE_2_SHADER_DEVICE_ADDRESS_BIT,\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n    eExecutionGraphScratchAMDX = VK_BUFFER_USAGE_2_EXECUTION_GRAPH_SCRATCH_BIT_AMDX,\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n    eConditionalRenderingEXT                    = VK_BUFFER_USAGE_2_CONDITIONAL_RENDERING_BIT_EXT,\n    eShaderBindingTableKHR                      = VK_BUFFER_USAGE_2_SHADER_BINDING_TABLE_BIT_KHR,\n    eRayTracingNV                               = VK_BUFFER_USAGE_2_RAY_TRACING_BIT_NV,\n    eTransformFeedbackBufferEXT                 = VK_BUFFER_USAGE_2_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT,\n    eTransformFeedbackCounterBufferEXT          = VK_BUFFER_USAGE_2_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT,\n    eVideoDecodeSrcKHR                          = VK_BUFFER_USAGE_2_VIDEO_DECODE_SRC_BIT_KHR,\n    eVideoDecodeDstKHR                          = VK_BUFFER_USAGE_2_VIDEO_DECODE_DST_BIT_KHR,\n    eVideoEncodeDstKHR                          = VK_BUFFER_USAGE_2_VIDEO_ENCODE_DST_BIT_KHR,\n    eVideoEncodeSrcKHR                          = VK_BUFFER_USAGE_2_VIDEO_ENCODE_SRC_BIT_KHR,\n    eAccelerationStructureBuildInputReadOnlyKHR = VK_BUFFER_USAGE_2_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR,\n    eAccelerationStructureStorageKHR            = VK_BUFFER_USAGE_2_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR,\n    eSamplerDescriptorBufferEXT                 = VK_BUFFER_USAGE_2_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT,\n    eResourceDescriptorBufferEXT                = VK_BUFFER_USAGE_2_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT,\n    ePushDescriptorsDescriptorBufferEXT         = VK_BUFFER_USAGE_2_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT,\n    eMicromapBuildInputReadOnlyEXT              = VK_BUFFER_USAGE_2_MICROMAP_BUILD_INPUT_READ_ONLY_BIT_EXT,\n    eMicromapStorageEXT                         = VK_BUFFER_USAGE_2_MICROMAP_STORAGE_BIT_EXT,\n    ePreprocessBufferEXT                        = VK_BUFFER_USAGE_2_PREPROCESS_BUFFER_BIT_EXT\n  };\n  using BufferUsageFlagBits2KHR = BufferUsageFlagBits2;\n\n  using BufferUsageFlags2    = Flags<BufferUsageFlagBits2>;\n  using BufferUsageFlags2KHR = BufferUsageFlags2;\n\n  template <>\n  struct FlagTraits<BufferUsageFlagBits2>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool              isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR BufferUsageFlags2 allFlags =\n      BufferUsageFlagBits2::eTransferSrc | BufferUsageFlagBits2::eTransferDst | BufferUsageFlagBits2::eUniformTexelBuffer |\n      BufferUsageFlagBits2::eStorageTexelBuffer | BufferUsageFlagBits2::eUniformBuffer | BufferUsageFlagBits2::eStorageBuffer |\n      BufferUsageFlagBits2::eIndexBuffer | BufferUsageFlagBits2::eVertexBuffer | BufferUsageFlagBits2::eIndirectBuffer |\n      BufferUsageFlagBits2::eShaderDeviceAddress\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      | BufferUsageFlagBits2::eExecutionGraphScratchAMDX\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n      | BufferUsageFlagBits2::eConditionalRenderingEXT | BufferUsageFlagBits2::eShaderBindingTableKHR | BufferUsageFlagBits2::eTransformFeedbackBufferEXT |\n      BufferUsageFlagBits2::eTransformFeedbackCounterBufferEXT | BufferUsageFlagBits2::eVideoDecodeSrcKHR | BufferUsageFlagBits2::eVideoDecodeDstKHR |\n      BufferUsageFlagBits2::eVideoEncodeDstKHR | BufferUsageFlagBits2::eVideoEncodeSrcKHR | BufferUsageFlagBits2::eAccelerationStructureBuildInputReadOnlyKHR |\n      BufferUsageFlagBits2::eAccelerationStructureStorageKHR | BufferUsageFlagBits2::eSamplerDescriptorBufferEXT |\n      BufferUsageFlagBits2::eResourceDescriptorBufferEXT | BufferUsageFlagBits2::ePushDescriptorsDescriptorBufferEXT |\n      BufferUsageFlagBits2::eMicromapBuildInputReadOnlyEXT | BufferUsageFlagBits2::eMicromapStorageEXT | BufferUsageFlagBits2::ePreprocessBufferEXT;\n  };\n\n  enum class PipelineRobustnessBufferBehavior\n  {\n    eDeviceDefault       = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT,\n    eDisabled            = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED,\n    eRobustBufferAccess  = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS,\n    eRobustBufferAccess2 = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2\n  };\n  using PipelineRobustnessBufferBehaviorEXT = PipelineRobustnessBufferBehavior;\n\n  enum class PipelineRobustnessImageBehavior\n  {\n    eDeviceDefault      = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT,\n    eDisabled           = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DISABLED,\n    eRobustImageAccess  = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS,\n    eRobustImageAccess2 = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2\n  };\n  using PipelineRobustnessImageBehaviorEXT = PipelineRobustnessImageBehavior;\n\n  enum class HostImageCopyFlagBits : VkHostImageCopyFlags\n  {\n    eMemcpy = VK_HOST_IMAGE_COPY_MEMCPY\n  };\n  using HostImageCopyFlagBitsEXT = HostImageCopyFlagBits;\n\n  using HostImageCopyFlags    = Flags<HostImageCopyFlagBits>;\n  using HostImageCopyFlagsEXT = HostImageCopyFlags;\n\n  template <>\n  struct FlagTraits<HostImageCopyFlagBits>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool               isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR HostImageCopyFlags allFlags  = HostImageCopyFlagBits::eMemcpy;\n  };\n\n  //=== VK_KHR_surface ===\n\n  enum class SurfaceTransformFlagBitsKHR : VkSurfaceTransformFlagsKHR\n  {\n    eIdentity                  = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,\n    eRotate90                  = VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,\n    eRotate180                 = VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR,\n    eRotate270                 = VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR,\n    eHorizontalMirror          = VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR,\n    eHorizontalMirrorRotate90  = VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR,\n    eHorizontalMirrorRotate180 = VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR,\n    eHorizontalMirrorRotate270 = VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR,\n    eInherit                   = VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR\n  };\n\n  using SurfaceTransformFlagsKHR = Flags<SurfaceTransformFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<SurfaceTransformFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                     isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR SurfaceTransformFlagsKHR allFlags =\n      SurfaceTransformFlagBitsKHR::eIdentity | SurfaceTransformFlagBitsKHR::eRotate90 | SurfaceTransformFlagBitsKHR::eRotate180 |\n      SurfaceTransformFlagBitsKHR::eRotate270 | SurfaceTransformFlagBitsKHR::eHorizontalMirror | SurfaceTransformFlagBitsKHR::eHorizontalMirrorRotate90 |\n      SurfaceTransformFlagBitsKHR::eHorizontalMirrorRotate180 | SurfaceTransformFlagBitsKHR::eHorizontalMirrorRotate270 | SurfaceTransformFlagBitsKHR::eInherit;\n  };\n\n  enum class PresentModeKHR\n  {\n    eImmediate               = VK_PRESENT_MODE_IMMEDIATE_KHR,\n    eMailbox                 = VK_PRESENT_MODE_MAILBOX_KHR,\n    eFifo                    = VK_PRESENT_MODE_FIFO_KHR,\n    eFifoRelaxed             = VK_PRESENT_MODE_FIFO_RELAXED_KHR,\n    eSharedDemandRefresh     = VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR,\n    eSharedContinuousRefresh = VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR,\n    eFifoLatestReadyEXT      = VK_PRESENT_MODE_FIFO_LATEST_READY_EXT\n  };\n\n  enum class ColorSpaceKHR\n  {\n    eSrgbNonlinear             = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR,\n    eVkColorspaceSrgbNonlinear = VK_COLORSPACE_SRGB_NONLINEAR_KHR,\n    eDisplayP3NonlinearEXT     = VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT,\n    eExtendedSrgbLinearEXT     = VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT,\n    eDisplayP3LinearEXT        = VK_COLOR_SPACE_DISPLAY_P3_LINEAR_EXT,\n    eDciP3LinearEXT            = VK_COLOR_SPACE_DCI_P3_LINEAR_EXT,\n    eDciP3NonlinearEXT         = VK_COLOR_SPACE_DCI_P3_NONLINEAR_EXT,\n    eBt709LinearEXT            = VK_COLOR_SPACE_BT709_LINEAR_EXT,\n    eBt709NonlinearEXT         = VK_COLOR_SPACE_BT709_NONLINEAR_EXT,\n    eBt2020LinearEXT           = VK_COLOR_SPACE_BT2020_LINEAR_EXT,\n    eHdr10St2084EXT            = VK_COLOR_SPACE_HDR10_ST2084_EXT,\n    eDolbyvisionEXT VULKAN_HPP_DEPRECATED_17( \"eDolbyvisionEXT is deprecated, but no reason was given in the API XML\" ) = VK_COLOR_SPACE_DOLBYVISION_EXT,\n    eHdr10HlgEXT                                                                                                        = VK_COLOR_SPACE_HDR10_HLG_EXT,\n    eAdobergbLinearEXT                                                                                                  = VK_COLOR_SPACE_ADOBERGB_LINEAR_EXT,\n    eAdobergbNonlinearEXT                                                                                               = VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT,\n    ePassThroughEXT                                                                                                     = VK_COLOR_SPACE_PASS_THROUGH_EXT,\n    eExtendedSrgbNonlinearEXT = VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT,\n    eDisplayNativeAMD         = VK_COLOR_SPACE_DISPLAY_NATIVE_AMD\n  };\n\n  enum class CompositeAlphaFlagBitsKHR : VkCompositeAlphaFlagsKHR\n  {\n    eOpaque         = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR,\n    ePreMultiplied  = VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR,\n    ePostMultiplied = VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR,\n    eInherit        = VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR\n  };\n\n  using CompositeAlphaFlagsKHR = Flags<CompositeAlphaFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<CompositeAlphaFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                   isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR CompositeAlphaFlagsKHR allFlags  = CompositeAlphaFlagBitsKHR::eOpaque | CompositeAlphaFlagBitsKHR::ePreMultiplied |\n                                                                           CompositeAlphaFlagBitsKHR::ePostMultiplied | CompositeAlphaFlagBitsKHR::eInherit;\n  };\n\n  //=== VK_KHR_swapchain ===\n\n  enum class SwapchainCreateFlagBitsKHR : VkSwapchainCreateFlagsKHR\n  {\n    eSplitInstanceBindRegions    = VK_SWAPCHAIN_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR,\n    eProtected                   = VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR,\n    eMutableFormat               = VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR,\n    eDeferredMemoryAllocationEXT = VK_SWAPCHAIN_CREATE_DEFERRED_MEMORY_ALLOCATION_BIT_EXT\n  };\n\n  using SwapchainCreateFlagsKHR = Flags<SwapchainCreateFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<SwapchainCreateFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                    isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR SwapchainCreateFlagsKHR allFlags =\n      SwapchainCreateFlagBitsKHR::eSplitInstanceBindRegions | SwapchainCreateFlagBitsKHR::eProtected | SwapchainCreateFlagBitsKHR::eMutableFormat |\n      SwapchainCreateFlagBitsKHR::eDeferredMemoryAllocationEXT;\n  };\n\n  enum class DeviceGroupPresentModeFlagBitsKHR : VkDeviceGroupPresentModeFlagsKHR\n  {\n    eLocal            = VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR,\n    eRemote           = VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHR,\n    eSum              = VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHR,\n    eLocalMultiDevice = VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHR\n  };\n\n  using DeviceGroupPresentModeFlagsKHR = Flags<DeviceGroupPresentModeFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<DeviceGroupPresentModeFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                           isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR DeviceGroupPresentModeFlagsKHR allFlags =\n      DeviceGroupPresentModeFlagBitsKHR::eLocal | DeviceGroupPresentModeFlagBitsKHR::eRemote | DeviceGroupPresentModeFlagBitsKHR::eSum |\n      DeviceGroupPresentModeFlagBitsKHR::eLocalMultiDevice;\n  };\n\n  //=== VK_KHR_display ===\n\n  enum class DisplayPlaneAlphaFlagBitsKHR : VkDisplayPlaneAlphaFlagsKHR\n  {\n    eOpaque                = VK_DISPLAY_PLANE_ALPHA_OPAQUE_BIT_KHR,\n    eGlobal                = VK_DISPLAY_PLANE_ALPHA_GLOBAL_BIT_KHR,\n    ePerPixel              = VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_BIT_KHR,\n    ePerPixelPremultiplied = VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_PREMULTIPLIED_BIT_KHR\n  };\n\n  using DisplayPlaneAlphaFlagsKHR = Flags<DisplayPlaneAlphaFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<DisplayPlaneAlphaFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                      isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR DisplayPlaneAlphaFlagsKHR allFlags  = DisplayPlaneAlphaFlagBitsKHR::eOpaque | DisplayPlaneAlphaFlagBitsKHR::eGlobal |\n                                                                              DisplayPlaneAlphaFlagBitsKHR::ePerPixel |\n                                                                              DisplayPlaneAlphaFlagBitsKHR::ePerPixelPremultiplied;\n  };\n\n  enum class DisplayModeCreateFlagBitsKHR : VkDisplayModeCreateFlagsKHR\n  {\n  };\n\n  using DisplayModeCreateFlagsKHR = Flags<DisplayModeCreateFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<DisplayModeCreateFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                      isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR DisplayModeCreateFlagsKHR allFlags  = {};\n  };\n\n  enum class DisplaySurfaceCreateFlagBitsKHR : VkDisplaySurfaceCreateFlagsKHR\n  {\n  };\n\n  using DisplaySurfaceCreateFlagsKHR = Flags<DisplaySurfaceCreateFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<DisplaySurfaceCreateFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                         isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR DisplaySurfaceCreateFlagsKHR allFlags  = {};\n  };\n\n#if defined( VK_USE_PLATFORM_XLIB_KHR )\n  //=== VK_KHR_xlib_surface ===\n\n  enum class XlibSurfaceCreateFlagBitsKHR : VkXlibSurfaceCreateFlagsKHR\n  {\n  };\n\n  using XlibSurfaceCreateFlagsKHR = Flags<XlibSurfaceCreateFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<XlibSurfaceCreateFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                      isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR XlibSurfaceCreateFlagsKHR allFlags  = {};\n  };\n#endif /*VK_USE_PLATFORM_XLIB_KHR*/\n\n#if defined( VK_USE_PLATFORM_XCB_KHR )\n  //=== VK_KHR_xcb_surface ===\n\n  enum class XcbSurfaceCreateFlagBitsKHR : VkXcbSurfaceCreateFlagsKHR\n  {\n  };\n\n  using XcbSurfaceCreateFlagsKHR = Flags<XcbSurfaceCreateFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<XcbSurfaceCreateFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                     isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR XcbSurfaceCreateFlagsKHR allFlags  = {};\n  };\n#endif /*VK_USE_PLATFORM_XCB_KHR*/\n\n#if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n  //=== VK_KHR_wayland_surface ===\n\n  enum class WaylandSurfaceCreateFlagBitsKHR : VkWaylandSurfaceCreateFlagsKHR\n  {\n  };\n\n  using WaylandSurfaceCreateFlagsKHR = Flags<WaylandSurfaceCreateFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<WaylandSurfaceCreateFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                         isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR WaylandSurfaceCreateFlagsKHR allFlags  = {};\n  };\n#endif /*VK_USE_PLATFORM_WAYLAND_KHR*/\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  //=== VK_KHR_android_surface ===\n\n  enum class AndroidSurfaceCreateFlagBitsKHR : VkAndroidSurfaceCreateFlagsKHR\n  {\n  };\n\n  using AndroidSurfaceCreateFlagsKHR = Flags<AndroidSurfaceCreateFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<AndroidSurfaceCreateFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                         isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR AndroidSurfaceCreateFlagsKHR allFlags  = {};\n  };\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_KHR_win32_surface ===\n\n  enum class Win32SurfaceCreateFlagBitsKHR : VkWin32SurfaceCreateFlagsKHR\n  {\n  };\n\n  using Win32SurfaceCreateFlagsKHR = Flags<Win32SurfaceCreateFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<Win32SurfaceCreateFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                       isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR Win32SurfaceCreateFlagsKHR allFlags  = {};\n  };\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_EXT_debug_report ===\n\n  enum class DebugReportFlagBitsEXT : VkDebugReportFlagsEXT\n  {\n    eInformation        = VK_DEBUG_REPORT_INFORMATION_BIT_EXT,\n    eWarning            = VK_DEBUG_REPORT_WARNING_BIT_EXT,\n    ePerformanceWarning = VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,\n    eError              = VK_DEBUG_REPORT_ERROR_BIT_EXT,\n    eDebug              = VK_DEBUG_REPORT_DEBUG_BIT_EXT\n  };\n\n  using DebugReportFlagsEXT = Flags<DebugReportFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<DebugReportFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR DebugReportFlagsEXT allFlags  = DebugReportFlagBitsEXT::eInformation | DebugReportFlagBitsEXT::eWarning |\n                                                                        DebugReportFlagBitsEXT::ePerformanceWarning | DebugReportFlagBitsEXT::eError |\n                                                                        DebugReportFlagBitsEXT::eDebug;\n  };\n\n  enum class DebugReportObjectTypeEXT\n  {\n    eUnknown                     = VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT,\n    eInstance                    = VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,\n    ePhysicalDevice              = VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT,\n    eDevice                      = VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT,\n    eQueue                       = VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT,\n    eSemaphore                   = VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT,\n    eCommandBuffer               = VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,\n    eFence                       = VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT,\n    eDeviceMemory                = VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT,\n    eBuffer                      = VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT,\n    eImage                       = VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,\n    eEvent                       = VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT,\n    eQueryPool                   = VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT,\n    eBufferView                  = VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT,\n    eImageView                   = VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT,\n    eShaderModule                = VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT,\n    ePipelineCache               = VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT,\n    ePipelineLayout              = VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT,\n    eRenderPass                  = VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT,\n    ePipeline                    = VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,\n    eDescriptorSetLayout         = VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT,\n    eSampler                     = VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT,\n    eDescriptorPool              = VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT,\n    eDescriptorSet               = VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT,\n    eFramebuffer                 = VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT,\n    eCommandPool                 = VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT,\n    eSurfaceKHR                  = VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT,\n    eSwapchainKHR                = VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT,\n    eDebugReportCallbackEXT      = VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT_EXT,\n    eDebugReport                 = VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT,\n    eDisplayKHR                  = VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT,\n    eDisplayModeKHR              = VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_MODE_KHR_EXT,\n    eValidationCacheEXT          = VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT,\n    eValidationCache             = VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT,\n    eSamplerYcbcrConversion      = VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_EXT,\n    eSamplerYcbcrConversionKHR   = VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_KHR_EXT,\n    eDescriptorUpdateTemplate    = VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_EXT,\n    eDescriptorUpdateTemplateKHR = VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR_EXT,\n    eCuModuleNVX                 = VK_DEBUG_REPORT_OBJECT_TYPE_CU_MODULE_NVX_EXT,\n    eCuFunctionNVX               = VK_DEBUG_REPORT_OBJECT_TYPE_CU_FUNCTION_NVX_EXT,\n    eAccelerationStructureKHR    = VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR_EXT,\n    eAccelerationStructureNV     = VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV_EXT,\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n    eCudaModuleNV   = VK_DEBUG_REPORT_OBJECT_TYPE_CUDA_MODULE_NV_EXT,\n    eCudaFunctionNV = VK_DEBUG_REPORT_OBJECT_TYPE_CUDA_FUNCTION_NV_EXT,\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n    eBufferCollectionFUCHSIA = VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_COLLECTION_FUCHSIA_EXT\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n  };\n\n  //=== VK_AMD_rasterization_order ===\n\n  enum class RasterizationOrderAMD\n  {\n    eStrict  = VK_RASTERIZATION_ORDER_STRICT_AMD,\n    eRelaxed = VK_RASTERIZATION_ORDER_RELAXED_AMD\n  };\n\n  //=== VK_KHR_video_queue ===\n\n  enum class VideoCodecOperationFlagBitsKHR : VkVideoCodecOperationFlagsKHR\n  {\n    eNone       = VK_VIDEO_CODEC_OPERATION_NONE_KHR,\n    eEncodeH264 = VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR,\n    eEncodeH265 = VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR,\n    eDecodeH264 = VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR,\n    eDecodeH265 = VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR,\n    eDecodeAv1  = VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR,\n    eEncodeAv1  = VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR\n  };\n\n  using VideoCodecOperationFlagsKHR = Flags<VideoCodecOperationFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoCodecOperationFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                        isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoCodecOperationFlagsKHR allFlags =\n      VideoCodecOperationFlagBitsKHR::eNone | VideoCodecOperationFlagBitsKHR::eEncodeH264 | VideoCodecOperationFlagBitsKHR::eEncodeH265 |\n      VideoCodecOperationFlagBitsKHR::eDecodeH264 | VideoCodecOperationFlagBitsKHR::eDecodeH265 | VideoCodecOperationFlagBitsKHR::eDecodeAv1 |\n      VideoCodecOperationFlagBitsKHR::eEncodeAv1;\n  };\n\n  enum class VideoChromaSubsamplingFlagBitsKHR : VkVideoChromaSubsamplingFlagsKHR\n  {\n    eInvalid    = VK_VIDEO_CHROMA_SUBSAMPLING_INVALID_KHR,\n    eMonochrome = VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR,\n    e420        = VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR,\n    e422        = VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR,\n    e444        = VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR\n  };\n\n  using VideoChromaSubsamplingFlagsKHR = Flags<VideoChromaSubsamplingFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoChromaSubsamplingFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                           isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoChromaSubsamplingFlagsKHR allFlags =\n      VideoChromaSubsamplingFlagBitsKHR::eInvalid | VideoChromaSubsamplingFlagBitsKHR::eMonochrome | VideoChromaSubsamplingFlagBitsKHR::e420 |\n      VideoChromaSubsamplingFlagBitsKHR::e422 | VideoChromaSubsamplingFlagBitsKHR::e444;\n  };\n\n  enum class VideoComponentBitDepthFlagBitsKHR : VkVideoComponentBitDepthFlagsKHR\n  {\n    eInvalid = VK_VIDEO_COMPONENT_BIT_DEPTH_INVALID_KHR,\n    e8       = VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR,\n    e10      = VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR,\n    e12      = VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR\n  };\n\n  using VideoComponentBitDepthFlagsKHR = Flags<VideoComponentBitDepthFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoComponentBitDepthFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                           isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoComponentBitDepthFlagsKHR allFlags =\n      VideoComponentBitDepthFlagBitsKHR::eInvalid | VideoComponentBitDepthFlagBitsKHR::e8 | VideoComponentBitDepthFlagBitsKHR::e10 |\n      VideoComponentBitDepthFlagBitsKHR::e12;\n  };\n\n  enum class VideoCapabilityFlagBitsKHR : VkVideoCapabilityFlagsKHR\n  {\n    eProtectedContent        = VK_VIDEO_CAPABILITY_PROTECTED_CONTENT_BIT_KHR,\n    eSeparateReferenceImages = VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR\n  };\n\n  using VideoCapabilityFlagsKHR = Flags<VideoCapabilityFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoCapabilityFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                    isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoCapabilityFlagsKHR allFlags =\n      VideoCapabilityFlagBitsKHR::eProtectedContent | VideoCapabilityFlagBitsKHR::eSeparateReferenceImages;\n  };\n\n  enum class VideoSessionCreateFlagBitsKHR : VkVideoSessionCreateFlagsKHR\n  {\n    eProtectedContent                  = VK_VIDEO_SESSION_CREATE_PROTECTED_CONTENT_BIT_KHR,\n    eAllowEncodeParameterOptimizations = VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_PARAMETER_OPTIMIZATIONS_BIT_KHR,\n    eInlineQueries                     = VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR,\n    eAllowEncodeQuantizationDeltaMap   = VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR,\n    eAllowEncodeEmphasisMap            = VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_EMPHASIS_MAP_BIT_KHR,\n    eInlineSessionParameters           = VK_VIDEO_SESSION_CREATE_INLINE_SESSION_PARAMETERS_BIT_KHR\n  };\n\n  using VideoSessionCreateFlagsKHR = Flags<VideoSessionCreateFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoSessionCreateFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                       isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoSessionCreateFlagsKHR allFlags =\n      VideoSessionCreateFlagBitsKHR::eProtectedContent | VideoSessionCreateFlagBitsKHR::eAllowEncodeParameterOptimizations |\n      VideoSessionCreateFlagBitsKHR::eInlineQueries | VideoSessionCreateFlagBitsKHR::eAllowEncodeQuantizationDeltaMap |\n      VideoSessionCreateFlagBitsKHR::eAllowEncodeEmphasisMap | VideoSessionCreateFlagBitsKHR::eInlineSessionParameters;\n  };\n\n  enum class VideoCodingControlFlagBitsKHR : VkVideoCodingControlFlagsKHR\n  {\n    eReset              = VK_VIDEO_CODING_CONTROL_RESET_BIT_KHR,\n    eEncodeRateControl  = VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_BIT_KHR,\n    eEncodeQualityLevel = VK_VIDEO_CODING_CONTROL_ENCODE_QUALITY_LEVEL_BIT_KHR\n  };\n\n  using VideoCodingControlFlagsKHR = Flags<VideoCodingControlFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoCodingControlFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                       isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoCodingControlFlagsKHR allFlags =\n      VideoCodingControlFlagBitsKHR::eReset | VideoCodingControlFlagBitsKHR::eEncodeRateControl | VideoCodingControlFlagBitsKHR::eEncodeQualityLevel;\n  };\n\n  enum class QueryResultStatusKHR\n  {\n    eError                            = VK_QUERY_RESULT_STATUS_ERROR_KHR,\n    eNotReady                         = VK_QUERY_RESULT_STATUS_NOT_READY_KHR,\n    eComplete                         = VK_QUERY_RESULT_STATUS_COMPLETE_KHR,\n    eInsufficientBitstreamBufferRange = VK_QUERY_RESULT_STATUS_INSUFFICIENT_BITSTREAM_BUFFER_RANGE_KHR\n  };\n\n  enum class VideoSessionParametersCreateFlagBitsKHR : VkVideoSessionParametersCreateFlagsKHR\n  {\n    eQuantizationMapCompatible = VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR\n  };\n\n  using VideoSessionParametersCreateFlagsKHR = Flags<VideoSessionParametersCreateFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoSessionParametersCreateFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                 isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoSessionParametersCreateFlagsKHR allFlags  = VideoSessionParametersCreateFlagBitsKHR::eQuantizationMapCompatible;\n  };\n\n  enum class VideoBeginCodingFlagBitsKHR : VkVideoBeginCodingFlagsKHR\n  {\n  };\n\n  using VideoBeginCodingFlagsKHR = Flags<VideoBeginCodingFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoBeginCodingFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                     isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoBeginCodingFlagsKHR allFlags  = {};\n  };\n\n  enum class VideoEndCodingFlagBitsKHR : VkVideoEndCodingFlagsKHR\n  {\n  };\n\n  using VideoEndCodingFlagsKHR = Flags<VideoEndCodingFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoEndCodingFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                   isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoEndCodingFlagsKHR allFlags  = {};\n  };\n\n  //=== VK_KHR_video_decode_queue ===\n\n  enum class VideoDecodeCapabilityFlagBitsKHR : VkVideoDecodeCapabilityFlagsKHR\n  {\n    eDpbAndOutputCoincide = VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR,\n    eDpbAndOutputDistinct = VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR\n  };\n\n  using VideoDecodeCapabilityFlagsKHR = Flags<VideoDecodeCapabilityFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoDecodeCapabilityFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                          isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoDecodeCapabilityFlagsKHR allFlags =\n      VideoDecodeCapabilityFlagBitsKHR::eDpbAndOutputCoincide | VideoDecodeCapabilityFlagBitsKHR::eDpbAndOutputDistinct;\n  };\n\n  enum class VideoDecodeUsageFlagBitsKHR : VkVideoDecodeUsageFlagsKHR\n  {\n    eDefault     = VK_VIDEO_DECODE_USAGE_DEFAULT_KHR,\n    eTranscoding = VK_VIDEO_DECODE_USAGE_TRANSCODING_BIT_KHR,\n    eOffline     = VK_VIDEO_DECODE_USAGE_OFFLINE_BIT_KHR,\n    eStreaming   = VK_VIDEO_DECODE_USAGE_STREAMING_BIT_KHR\n  };\n\n  using VideoDecodeUsageFlagsKHR = Flags<VideoDecodeUsageFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoDecodeUsageFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                     isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoDecodeUsageFlagsKHR allFlags = VideoDecodeUsageFlagBitsKHR::eDefault | VideoDecodeUsageFlagBitsKHR::eTranscoding |\n                                                                             VideoDecodeUsageFlagBitsKHR::eOffline | VideoDecodeUsageFlagBitsKHR::eStreaming;\n  };\n\n  enum class VideoDecodeFlagBitsKHR : VkVideoDecodeFlagsKHR\n  {\n  };\n\n  using VideoDecodeFlagsKHR = Flags<VideoDecodeFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoDecodeFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoDecodeFlagsKHR allFlags  = {};\n  };\n\n  //=== VK_EXT_transform_feedback ===\n\n  enum class PipelineRasterizationStateStreamCreateFlagBitsEXT : VkPipelineRasterizationStateStreamCreateFlagsEXT\n  {\n  };\n\n  using PipelineRasterizationStateStreamCreateFlagsEXT = Flags<PipelineRasterizationStateStreamCreateFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<PipelineRasterizationStateStreamCreateFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                           isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineRasterizationStateStreamCreateFlagsEXT allFlags  = {};\n  };\n\n  //=== VK_KHR_video_encode_h264 ===\n\n  enum class VideoEncodeH264CapabilityFlagBitsKHR : VkVideoEncodeH264CapabilityFlagsKHR\n  {\n    eHrdCompliance                  = VK_VIDEO_ENCODE_H264_CAPABILITY_HRD_COMPLIANCE_BIT_KHR,\n    ePredictionWeightTableGenerated = VK_VIDEO_ENCODE_H264_CAPABILITY_PREDICTION_WEIGHT_TABLE_GENERATED_BIT_KHR,\n    eRowUnalignedSlice              = VK_VIDEO_ENCODE_H264_CAPABILITY_ROW_UNALIGNED_SLICE_BIT_KHR,\n    eDifferentSliceType             = VK_VIDEO_ENCODE_H264_CAPABILITY_DIFFERENT_SLICE_TYPE_BIT_KHR,\n    eBFrameInL0List                 = VK_VIDEO_ENCODE_H264_CAPABILITY_B_FRAME_IN_L0_LIST_BIT_KHR,\n    eBFrameInL1List                 = VK_VIDEO_ENCODE_H264_CAPABILITY_B_FRAME_IN_L1_LIST_BIT_KHR,\n    ePerPictureTypeMinMaxQp         = VK_VIDEO_ENCODE_H264_CAPABILITY_PER_PICTURE_TYPE_MIN_MAX_QP_BIT_KHR,\n    ePerSliceConstantQp             = VK_VIDEO_ENCODE_H264_CAPABILITY_PER_SLICE_CONSTANT_QP_BIT_KHR,\n    eGeneratePrefixNalu             = VK_VIDEO_ENCODE_H264_CAPABILITY_GENERATE_PREFIX_NALU_BIT_KHR,\n    eMbQpDiffWraparound             = VK_VIDEO_ENCODE_H264_CAPABILITY_MB_QP_DIFF_WRAPAROUND_BIT_KHR\n  };\n\n  using VideoEncodeH264CapabilityFlagsKHR = Flags<VideoEncodeH264CapabilityFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoEncodeH264CapabilityFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                              isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoEncodeH264CapabilityFlagsKHR allFlags =\n      VideoEncodeH264CapabilityFlagBitsKHR::eHrdCompliance | VideoEncodeH264CapabilityFlagBitsKHR::ePredictionWeightTableGenerated |\n      VideoEncodeH264CapabilityFlagBitsKHR::eRowUnalignedSlice | VideoEncodeH264CapabilityFlagBitsKHR::eDifferentSliceType |\n      VideoEncodeH264CapabilityFlagBitsKHR::eBFrameInL0List | VideoEncodeH264CapabilityFlagBitsKHR::eBFrameInL1List |\n      VideoEncodeH264CapabilityFlagBitsKHR::ePerPictureTypeMinMaxQp | VideoEncodeH264CapabilityFlagBitsKHR::ePerSliceConstantQp |\n      VideoEncodeH264CapabilityFlagBitsKHR::eGeneratePrefixNalu | VideoEncodeH264CapabilityFlagBitsKHR::eMbQpDiffWraparound;\n  };\n\n  enum class VideoEncodeH264StdFlagBitsKHR : VkVideoEncodeH264StdFlagsKHR\n  {\n    eSeparateColorPlaneFlagSet          = VK_VIDEO_ENCODE_H264_STD_SEPARATE_COLOR_PLANE_FLAG_SET_BIT_KHR,\n    eQpprimeYZeroTransformBypassFlagSet = VK_VIDEO_ENCODE_H264_STD_QPPRIME_Y_ZERO_TRANSFORM_BYPASS_FLAG_SET_BIT_KHR,\n    eScalingMatrixPresentFlagSet        = VK_VIDEO_ENCODE_H264_STD_SCALING_MATRIX_PRESENT_FLAG_SET_BIT_KHR,\n    eChromaQpIndexOffset                = VK_VIDEO_ENCODE_H264_STD_CHROMA_QP_INDEX_OFFSET_BIT_KHR,\n    eSecondChromaQpIndexOffset          = VK_VIDEO_ENCODE_H264_STD_SECOND_CHROMA_QP_INDEX_OFFSET_BIT_KHR,\n    ePicInitQpMinus26                   = VK_VIDEO_ENCODE_H264_STD_PIC_INIT_QP_MINUS26_BIT_KHR,\n    eWeightedPredFlagSet                = VK_VIDEO_ENCODE_H264_STD_WEIGHTED_PRED_FLAG_SET_BIT_KHR,\n    eWeightedBipredIdcExplicit          = VK_VIDEO_ENCODE_H264_STD_WEIGHTED_BIPRED_IDC_EXPLICIT_BIT_KHR,\n    eWeightedBipredIdcImplicit          = VK_VIDEO_ENCODE_H264_STD_WEIGHTED_BIPRED_IDC_IMPLICIT_BIT_KHR,\n    eTransform8X8ModeFlagSet            = VK_VIDEO_ENCODE_H264_STD_TRANSFORM_8X8_MODE_FLAG_SET_BIT_KHR,\n    eDirectSpatialMvPredFlagUnset       = VK_VIDEO_ENCODE_H264_STD_DIRECT_SPATIAL_MV_PRED_FLAG_UNSET_BIT_KHR,\n    eEntropyCodingModeFlagUnset         = VK_VIDEO_ENCODE_H264_STD_ENTROPY_CODING_MODE_FLAG_UNSET_BIT_KHR,\n    eEntropyCodingModeFlagSet           = VK_VIDEO_ENCODE_H264_STD_ENTROPY_CODING_MODE_FLAG_SET_BIT_KHR,\n    eDirect8X8InferenceFlagUnset        = VK_VIDEO_ENCODE_H264_STD_DIRECT_8X8_INFERENCE_FLAG_UNSET_BIT_KHR,\n    eConstrainedIntraPredFlagSet        = VK_VIDEO_ENCODE_H264_STD_CONSTRAINED_INTRA_PRED_FLAG_SET_BIT_KHR,\n    eDeblockingFilterDisabled           = VK_VIDEO_ENCODE_H264_STD_DEBLOCKING_FILTER_DISABLED_BIT_KHR,\n    eDeblockingFilterEnabled            = VK_VIDEO_ENCODE_H264_STD_DEBLOCKING_FILTER_ENABLED_BIT_KHR,\n    eDeblockingFilterPartial            = VK_VIDEO_ENCODE_H264_STD_DEBLOCKING_FILTER_PARTIAL_BIT_KHR,\n    eSliceQpDelta                       = VK_VIDEO_ENCODE_H264_STD_SLICE_QP_DELTA_BIT_KHR,\n    eDifferentSliceQpDelta              = VK_VIDEO_ENCODE_H264_STD_DIFFERENT_SLICE_QP_DELTA_BIT_KHR\n  };\n\n  using VideoEncodeH264StdFlagsKHR = Flags<VideoEncodeH264StdFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoEncodeH264StdFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                       isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoEncodeH264StdFlagsKHR allFlags =\n      VideoEncodeH264StdFlagBitsKHR::eSeparateColorPlaneFlagSet | VideoEncodeH264StdFlagBitsKHR::eQpprimeYZeroTransformBypassFlagSet |\n      VideoEncodeH264StdFlagBitsKHR::eScalingMatrixPresentFlagSet | VideoEncodeH264StdFlagBitsKHR::eChromaQpIndexOffset |\n      VideoEncodeH264StdFlagBitsKHR::eSecondChromaQpIndexOffset | VideoEncodeH264StdFlagBitsKHR::ePicInitQpMinus26 |\n      VideoEncodeH264StdFlagBitsKHR::eWeightedPredFlagSet | VideoEncodeH264StdFlagBitsKHR::eWeightedBipredIdcExplicit |\n      VideoEncodeH264StdFlagBitsKHR::eWeightedBipredIdcImplicit | VideoEncodeH264StdFlagBitsKHR::eTransform8X8ModeFlagSet |\n      VideoEncodeH264StdFlagBitsKHR::eDirectSpatialMvPredFlagUnset | VideoEncodeH264StdFlagBitsKHR::eEntropyCodingModeFlagUnset |\n      VideoEncodeH264StdFlagBitsKHR::eEntropyCodingModeFlagSet | VideoEncodeH264StdFlagBitsKHR::eDirect8X8InferenceFlagUnset |\n      VideoEncodeH264StdFlagBitsKHR::eConstrainedIntraPredFlagSet | VideoEncodeH264StdFlagBitsKHR::eDeblockingFilterDisabled |\n      VideoEncodeH264StdFlagBitsKHR::eDeblockingFilterEnabled | VideoEncodeH264StdFlagBitsKHR::eDeblockingFilterPartial |\n      VideoEncodeH264StdFlagBitsKHR::eSliceQpDelta | VideoEncodeH264StdFlagBitsKHR::eDifferentSliceQpDelta;\n  };\n\n  enum class VideoEncodeH264RateControlFlagBitsKHR : VkVideoEncodeH264RateControlFlagsKHR\n  {\n    eAttemptHrdCompliance       = VK_VIDEO_ENCODE_H264_RATE_CONTROL_ATTEMPT_HRD_COMPLIANCE_BIT_KHR,\n    eRegularGop                 = VK_VIDEO_ENCODE_H264_RATE_CONTROL_REGULAR_GOP_BIT_KHR,\n    eReferencePatternFlat       = VK_VIDEO_ENCODE_H264_RATE_CONTROL_REFERENCE_PATTERN_FLAT_BIT_KHR,\n    eReferencePatternDyadic     = VK_VIDEO_ENCODE_H264_RATE_CONTROL_REFERENCE_PATTERN_DYADIC_BIT_KHR,\n    eTemporalLayerPatternDyadic = VK_VIDEO_ENCODE_H264_RATE_CONTROL_TEMPORAL_LAYER_PATTERN_DYADIC_BIT_KHR\n  };\n\n  using VideoEncodeH264RateControlFlagsKHR = Flags<VideoEncodeH264RateControlFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoEncodeH264RateControlFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                               isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoEncodeH264RateControlFlagsKHR allFlags =\n      VideoEncodeH264RateControlFlagBitsKHR::eAttemptHrdCompliance | VideoEncodeH264RateControlFlagBitsKHR::eRegularGop |\n      VideoEncodeH264RateControlFlagBitsKHR::eReferencePatternFlat | VideoEncodeH264RateControlFlagBitsKHR::eReferencePatternDyadic |\n      VideoEncodeH264RateControlFlagBitsKHR::eTemporalLayerPatternDyadic;\n  };\n\n  //=== VK_KHR_video_encode_h265 ===\n\n  enum class VideoEncodeH265CapabilityFlagBitsKHR : VkVideoEncodeH265CapabilityFlagsKHR\n  {\n    eHrdCompliance                  = VK_VIDEO_ENCODE_H265_CAPABILITY_HRD_COMPLIANCE_BIT_KHR,\n    ePredictionWeightTableGenerated = VK_VIDEO_ENCODE_H265_CAPABILITY_PREDICTION_WEIGHT_TABLE_GENERATED_BIT_KHR,\n    eRowUnalignedSliceSegment       = VK_VIDEO_ENCODE_H265_CAPABILITY_ROW_UNALIGNED_SLICE_SEGMENT_BIT_KHR,\n    eDifferentSliceSegmentType      = VK_VIDEO_ENCODE_H265_CAPABILITY_DIFFERENT_SLICE_SEGMENT_TYPE_BIT_KHR,\n    eBFrameInL0List                 = VK_VIDEO_ENCODE_H265_CAPABILITY_B_FRAME_IN_L0_LIST_BIT_KHR,\n    eBFrameInL1List                 = VK_VIDEO_ENCODE_H265_CAPABILITY_B_FRAME_IN_L1_LIST_BIT_KHR,\n    ePerPictureTypeMinMaxQp         = VK_VIDEO_ENCODE_H265_CAPABILITY_PER_PICTURE_TYPE_MIN_MAX_QP_BIT_KHR,\n    ePerSliceSegmentConstantQp      = VK_VIDEO_ENCODE_H265_CAPABILITY_PER_SLICE_SEGMENT_CONSTANT_QP_BIT_KHR,\n    eMultipleTilesPerSliceSegment   = VK_VIDEO_ENCODE_H265_CAPABILITY_MULTIPLE_TILES_PER_SLICE_SEGMENT_BIT_KHR,\n    eMultipleSliceSegmentsPerTile   = VK_VIDEO_ENCODE_H265_CAPABILITY_MULTIPLE_SLICE_SEGMENTS_PER_TILE_BIT_KHR,\n    eCuQpDiffWraparound             = VK_VIDEO_ENCODE_H265_CAPABILITY_CU_QP_DIFF_WRAPAROUND_BIT_KHR\n  };\n\n  using VideoEncodeH265CapabilityFlagsKHR = Flags<VideoEncodeH265CapabilityFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoEncodeH265CapabilityFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                              isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoEncodeH265CapabilityFlagsKHR allFlags =\n      VideoEncodeH265CapabilityFlagBitsKHR::eHrdCompliance | VideoEncodeH265CapabilityFlagBitsKHR::ePredictionWeightTableGenerated |\n      VideoEncodeH265CapabilityFlagBitsKHR::eRowUnalignedSliceSegment | VideoEncodeH265CapabilityFlagBitsKHR::eDifferentSliceSegmentType |\n      VideoEncodeH265CapabilityFlagBitsKHR::eBFrameInL0List | VideoEncodeH265CapabilityFlagBitsKHR::eBFrameInL1List |\n      VideoEncodeH265CapabilityFlagBitsKHR::ePerPictureTypeMinMaxQp | VideoEncodeH265CapabilityFlagBitsKHR::ePerSliceSegmentConstantQp |\n      VideoEncodeH265CapabilityFlagBitsKHR::eMultipleTilesPerSliceSegment | VideoEncodeH265CapabilityFlagBitsKHR::eMultipleSliceSegmentsPerTile |\n      VideoEncodeH265CapabilityFlagBitsKHR::eCuQpDiffWraparound;\n  };\n\n  enum class VideoEncodeH265StdFlagBitsKHR : VkVideoEncodeH265StdFlagsKHR\n  {\n    eSeparateColorPlaneFlagSet              = VK_VIDEO_ENCODE_H265_STD_SEPARATE_COLOR_PLANE_FLAG_SET_BIT_KHR,\n    eSampleAdaptiveOffsetEnabledFlagSet     = VK_VIDEO_ENCODE_H265_STD_SAMPLE_ADAPTIVE_OFFSET_ENABLED_FLAG_SET_BIT_KHR,\n    eScalingListDataPresentFlagSet          = VK_VIDEO_ENCODE_H265_STD_SCALING_LIST_DATA_PRESENT_FLAG_SET_BIT_KHR,\n    ePcmEnabledFlagSet                      = VK_VIDEO_ENCODE_H265_STD_PCM_ENABLED_FLAG_SET_BIT_KHR,\n    eSpsTemporalMvpEnabledFlagSet           = VK_VIDEO_ENCODE_H265_STD_SPS_TEMPORAL_MVP_ENABLED_FLAG_SET_BIT_KHR,\n    eInitQpMinus26                          = VK_VIDEO_ENCODE_H265_STD_INIT_QP_MINUS26_BIT_KHR,\n    eWeightedPredFlagSet                    = VK_VIDEO_ENCODE_H265_STD_WEIGHTED_PRED_FLAG_SET_BIT_KHR,\n    eWeightedBipredFlagSet                  = VK_VIDEO_ENCODE_H265_STD_WEIGHTED_BIPRED_FLAG_SET_BIT_KHR,\n    eLog2ParallelMergeLevelMinus2           = VK_VIDEO_ENCODE_H265_STD_LOG2_PARALLEL_MERGE_LEVEL_MINUS2_BIT_KHR,\n    eSignDataHidingEnabledFlagSet           = VK_VIDEO_ENCODE_H265_STD_SIGN_DATA_HIDING_ENABLED_FLAG_SET_BIT_KHR,\n    eTransformSkipEnabledFlagSet            = VK_VIDEO_ENCODE_H265_STD_TRANSFORM_SKIP_ENABLED_FLAG_SET_BIT_KHR,\n    eTransformSkipEnabledFlagUnset          = VK_VIDEO_ENCODE_H265_STD_TRANSFORM_SKIP_ENABLED_FLAG_UNSET_BIT_KHR,\n    ePpsSliceChromaQpOffsetsPresentFlagSet  = VK_VIDEO_ENCODE_H265_STD_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT_FLAG_SET_BIT_KHR,\n    eTransquantBypassEnabledFlagSet         = VK_VIDEO_ENCODE_H265_STD_TRANSQUANT_BYPASS_ENABLED_FLAG_SET_BIT_KHR,\n    eConstrainedIntraPredFlagSet            = VK_VIDEO_ENCODE_H265_STD_CONSTRAINED_INTRA_PRED_FLAG_SET_BIT_KHR,\n    eEntropyCodingSyncEnabledFlagSet        = VK_VIDEO_ENCODE_H265_STD_ENTROPY_CODING_SYNC_ENABLED_FLAG_SET_BIT_KHR,\n    eDeblockingFilterOverrideEnabledFlagSet = VK_VIDEO_ENCODE_H265_STD_DEBLOCKING_FILTER_OVERRIDE_ENABLED_FLAG_SET_BIT_KHR,\n    eDependentSliceSegmentsEnabledFlagSet   = VK_VIDEO_ENCODE_H265_STD_DEPENDENT_SLICE_SEGMENTS_ENABLED_FLAG_SET_BIT_KHR,\n    eDependentSliceSegmentFlagSet           = VK_VIDEO_ENCODE_H265_STD_DEPENDENT_SLICE_SEGMENT_FLAG_SET_BIT_KHR,\n    eSliceQpDelta                           = VK_VIDEO_ENCODE_H265_STD_SLICE_QP_DELTA_BIT_KHR,\n    eDifferentSliceQpDelta                  = VK_VIDEO_ENCODE_H265_STD_DIFFERENT_SLICE_QP_DELTA_BIT_KHR\n  };\n\n  using VideoEncodeH265StdFlagsKHR = Flags<VideoEncodeH265StdFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoEncodeH265StdFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                       isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoEncodeH265StdFlagsKHR allFlags =\n      VideoEncodeH265StdFlagBitsKHR::eSeparateColorPlaneFlagSet | VideoEncodeH265StdFlagBitsKHR::eSampleAdaptiveOffsetEnabledFlagSet |\n      VideoEncodeH265StdFlagBitsKHR::eScalingListDataPresentFlagSet | VideoEncodeH265StdFlagBitsKHR::ePcmEnabledFlagSet |\n      VideoEncodeH265StdFlagBitsKHR::eSpsTemporalMvpEnabledFlagSet | VideoEncodeH265StdFlagBitsKHR::eInitQpMinus26 |\n      VideoEncodeH265StdFlagBitsKHR::eWeightedPredFlagSet | VideoEncodeH265StdFlagBitsKHR::eWeightedBipredFlagSet |\n      VideoEncodeH265StdFlagBitsKHR::eLog2ParallelMergeLevelMinus2 | VideoEncodeH265StdFlagBitsKHR::eSignDataHidingEnabledFlagSet |\n      VideoEncodeH265StdFlagBitsKHR::eTransformSkipEnabledFlagSet | VideoEncodeH265StdFlagBitsKHR::eTransformSkipEnabledFlagUnset |\n      VideoEncodeH265StdFlagBitsKHR::ePpsSliceChromaQpOffsetsPresentFlagSet | VideoEncodeH265StdFlagBitsKHR::eTransquantBypassEnabledFlagSet |\n      VideoEncodeH265StdFlagBitsKHR::eConstrainedIntraPredFlagSet | VideoEncodeH265StdFlagBitsKHR::eEntropyCodingSyncEnabledFlagSet |\n      VideoEncodeH265StdFlagBitsKHR::eDeblockingFilterOverrideEnabledFlagSet | VideoEncodeH265StdFlagBitsKHR::eDependentSliceSegmentsEnabledFlagSet |\n      VideoEncodeH265StdFlagBitsKHR::eDependentSliceSegmentFlagSet | VideoEncodeH265StdFlagBitsKHR::eSliceQpDelta |\n      VideoEncodeH265StdFlagBitsKHR::eDifferentSliceQpDelta;\n  };\n\n  enum class VideoEncodeH265CtbSizeFlagBitsKHR : VkVideoEncodeH265CtbSizeFlagsKHR\n  {\n    e16 = VK_VIDEO_ENCODE_H265_CTB_SIZE_16_BIT_KHR,\n    e32 = VK_VIDEO_ENCODE_H265_CTB_SIZE_32_BIT_KHR,\n    e64 = VK_VIDEO_ENCODE_H265_CTB_SIZE_64_BIT_KHR\n  };\n\n  using VideoEncodeH265CtbSizeFlagsKHR = Flags<VideoEncodeH265CtbSizeFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoEncodeH265CtbSizeFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                           isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoEncodeH265CtbSizeFlagsKHR allFlags =\n      VideoEncodeH265CtbSizeFlagBitsKHR::e16 | VideoEncodeH265CtbSizeFlagBitsKHR::e32 | VideoEncodeH265CtbSizeFlagBitsKHR::e64;\n  };\n\n  enum class VideoEncodeH265TransformBlockSizeFlagBitsKHR : VkVideoEncodeH265TransformBlockSizeFlagsKHR\n  {\n    e4  = VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_4_BIT_KHR,\n    e8  = VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_8_BIT_KHR,\n    e16 = VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_16_BIT_KHR,\n    e32 = VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_32_BIT_KHR\n  };\n\n  using VideoEncodeH265TransformBlockSizeFlagsKHR = Flags<VideoEncodeH265TransformBlockSizeFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoEncodeH265TransformBlockSizeFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                      isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoEncodeH265TransformBlockSizeFlagsKHR allFlags =\n      VideoEncodeH265TransformBlockSizeFlagBitsKHR::e4 | VideoEncodeH265TransformBlockSizeFlagBitsKHR::e8 | VideoEncodeH265TransformBlockSizeFlagBitsKHR::e16 |\n      VideoEncodeH265TransformBlockSizeFlagBitsKHR::e32;\n  };\n\n  enum class VideoEncodeH265RateControlFlagBitsKHR : VkVideoEncodeH265RateControlFlagsKHR\n  {\n    eAttemptHrdCompliance          = VK_VIDEO_ENCODE_H265_RATE_CONTROL_ATTEMPT_HRD_COMPLIANCE_BIT_KHR,\n    eRegularGop                    = VK_VIDEO_ENCODE_H265_RATE_CONTROL_REGULAR_GOP_BIT_KHR,\n    eReferencePatternFlat          = VK_VIDEO_ENCODE_H265_RATE_CONTROL_REFERENCE_PATTERN_FLAT_BIT_KHR,\n    eReferencePatternDyadic        = VK_VIDEO_ENCODE_H265_RATE_CONTROL_REFERENCE_PATTERN_DYADIC_BIT_KHR,\n    eTemporalSubLayerPatternDyadic = VK_VIDEO_ENCODE_H265_RATE_CONTROL_TEMPORAL_SUB_LAYER_PATTERN_DYADIC_BIT_KHR\n  };\n\n  using VideoEncodeH265RateControlFlagsKHR = Flags<VideoEncodeH265RateControlFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoEncodeH265RateControlFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                               isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoEncodeH265RateControlFlagsKHR allFlags =\n      VideoEncodeH265RateControlFlagBitsKHR::eAttemptHrdCompliance | VideoEncodeH265RateControlFlagBitsKHR::eRegularGop |\n      VideoEncodeH265RateControlFlagBitsKHR::eReferencePatternFlat | VideoEncodeH265RateControlFlagBitsKHR::eReferencePatternDyadic |\n      VideoEncodeH265RateControlFlagBitsKHR::eTemporalSubLayerPatternDyadic;\n  };\n\n  //=== VK_KHR_video_decode_h264 ===\n\n  enum class VideoDecodeH264PictureLayoutFlagBitsKHR : VkVideoDecodeH264PictureLayoutFlagsKHR\n  {\n    eProgressive                = VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR,\n    eInterlacedInterleavedLines = VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR,\n    eInterlacedSeparatePlanes   = VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR\n  };\n\n  using VideoDecodeH264PictureLayoutFlagsKHR = Flags<VideoDecodeH264PictureLayoutFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoDecodeH264PictureLayoutFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                 isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoDecodeH264PictureLayoutFlagsKHR allFlags  = VideoDecodeH264PictureLayoutFlagBitsKHR::eProgressive |\n                                                                                         VideoDecodeH264PictureLayoutFlagBitsKHR::eInterlacedInterleavedLines |\n                                                                                         VideoDecodeH264PictureLayoutFlagBitsKHR::eInterlacedSeparatePlanes;\n  };\n\n  //=== VK_AMD_shader_info ===\n\n  enum class ShaderInfoTypeAMD\n  {\n    eStatistics  = VK_SHADER_INFO_TYPE_STATISTICS_AMD,\n    eBinary      = VK_SHADER_INFO_TYPE_BINARY_AMD,\n    eDisassembly = VK_SHADER_INFO_TYPE_DISASSEMBLY_AMD\n  };\n\n#if defined( VK_USE_PLATFORM_GGP )\n  //=== VK_GGP_stream_descriptor_surface ===\n\n  enum class StreamDescriptorSurfaceCreateFlagBitsGGP : VkStreamDescriptorSurfaceCreateFlagsGGP\n  {\n  };\n\n  using StreamDescriptorSurfaceCreateFlagsGGP = Flags<StreamDescriptorSurfaceCreateFlagBitsGGP>;\n\n  template <>\n  struct FlagTraits<StreamDescriptorSurfaceCreateFlagBitsGGP>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                  isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StreamDescriptorSurfaceCreateFlagsGGP allFlags  = {};\n  };\n#endif /*VK_USE_PLATFORM_GGP*/\n\n  //=== VK_NV_external_memory_capabilities ===\n\n  enum class ExternalMemoryHandleTypeFlagBitsNV : VkExternalMemoryHandleTypeFlagsNV\n  {\n    eOpaqueWin32    = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_NV,\n    eOpaqueWin32Kmt = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_NV,\n    eD3D11Image     = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_IMAGE_BIT_NV,\n    eD3D11ImageKmt  = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_IMAGE_KMT_BIT_NV\n  };\n\n  using ExternalMemoryHandleTypeFlagsNV = Flags<ExternalMemoryHandleTypeFlagBitsNV>;\n\n  template <>\n  struct FlagTraits<ExternalMemoryHandleTypeFlagBitsNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                            isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ExternalMemoryHandleTypeFlagsNV allFlags =\n      ExternalMemoryHandleTypeFlagBitsNV::eOpaqueWin32 | ExternalMemoryHandleTypeFlagBitsNV::eOpaqueWin32Kmt | ExternalMemoryHandleTypeFlagBitsNV::eD3D11Image |\n      ExternalMemoryHandleTypeFlagBitsNV::eD3D11ImageKmt;\n  };\n\n  enum class ExternalMemoryFeatureFlagBitsNV : VkExternalMemoryFeatureFlagsNV\n  {\n    eDedicatedOnly = VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_NV,\n    eExportable    = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_NV,\n    eImportable    = VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_NV\n  };\n\n  using ExternalMemoryFeatureFlagsNV = Flags<ExternalMemoryFeatureFlagBitsNV>;\n\n  template <>\n  struct FlagTraits<ExternalMemoryFeatureFlagBitsNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                         isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ExternalMemoryFeatureFlagsNV allFlags =\n      ExternalMemoryFeatureFlagBitsNV::eDedicatedOnly | ExternalMemoryFeatureFlagBitsNV::eExportable | ExternalMemoryFeatureFlagBitsNV::eImportable;\n  };\n\n  //=== VK_EXT_validation_flags ===\n\n  enum class ValidationCheckEXT\n  {\n    eAll     = VK_VALIDATION_CHECK_ALL_EXT,\n    eShaders = VK_VALIDATION_CHECK_SHADERS_EXT\n  };\n\n#if defined( VK_USE_PLATFORM_VI_NN )\n  //=== VK_NN_vi_surface ===\n\n  enum class ViSurfaceCreateFlagBitsNN : VkViSurfaceCreateFlagsNN\n  {\n  };\n\n  using ViSurfaceCreateFlagsNN = Flags<ViSurfaceCreateFlagBitsNN>;\n\n  template <>\n  struct FlagTraits<ViSurfaceCreateFlagBitsNN>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                   isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ViSurfaceCreateFlagsNN allFlags  = {};\n  };\n#endif /*VK_USE_PLATFORM_VI_NN*/\n\n  //=== VK_EXT_conditional_rendering ===\n\n  enum class ConditionalRenderingFlagBitsEXT : VkConditionalRenderingFlagsEXT\n  {\n    eInverted = VK_CONDITIONAL_RENDERING_INVERTED_BIT_EXT\n  };\n\n  using ConditionalRenderingFlagsEXT = Flags<ConditionalRenderingFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<ConditionalRenderingFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                         isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ConditionalRenderingFlagsEXT allFlags  = ConditionalRenderingFlagBitsEXT::eInverted;\n  };\n\n  //=== VK_EXT_display_surface_counter ===\n\n  enum class SurfaceCounterFlagBitsEXT : VkSurfaceCounterFlagsEXT\n  {\n    eVblank = VK_SURFACE_COUNTER_VBLANK_BIT_EXT\n  };\n\n  using SurfaceCounterFlagsEXT = Flags<SurfaceCounterFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<SurfaceCounterFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                   isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR SurfaceCounterFlagsEXT allFlags  = SurfaceCounterFlagBitsEXT::eVblank;\n  };\n\n  //=== VK_EXT_display_control ===\n\n  enum class DisplayPowerStateEXT\n  {\n    eOff     = VK_DISPLAY_POWER_STATE_OFF_EXT,\n    eSuspend = VK_DISPLAY_POWER_STATE_SUSPEND_EXT,\n    eOn      = VK_DISPLAY_POWER_STATE_ON_EXT\n  };\n\n  enum class DeviceEventTypeEXT\n  {\n    eDisplayHotplug = VK_DEVICE_EVENT_TYPE_DISPLAY_HOTPLUG_EXT\n  };\n\n  enum class DisplayEventTypeEXT\n  {\n    eFirstPixelOut = VK_DISPLAY_EVENT_TYPE_FIRST_PIXEL_OUT_EXT\n  };\n\n  //=== VK_NV_viewport_swizzle ===\n\n  enum class ViewportCoordinateSwizzleNV\n  {\n    ePositiveX = VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_X_NV,\n    eNegativeX = VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_X_NV,\n    ePositiveY = VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_Y_NV,\n    eNegativeY = VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_Y_NV,\n    ePositiveZ = VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_Z_NV,\n    eNegativeZ = VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_Z_NV,\n    ePositiveW = VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_W_NV,\n    eNegativeW = VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_W_NV\n  };\n\n  enum class PipelineViewportSwizzleStateCreateFlagBitsNV : VkPipelineViewportSwizzleStateCreateFlagsNV\n  {\n  };\n\n  using PipelineViewportSwizzleStateCreateFlagsNV = Flags<PipelineViewportSwizzleStateCreateFlagBitsNV>;\n\n  template <>\n  struct FlagTraits<PipelineViewportSwizzleStateCreateFlagBitsNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                      isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineViewportSwizzleStateCreateFlagsNV allFlags  = {};\n  };\n\n  //=== VK_EXT_discard_rectangles ===\n\n  enum class DiscardRectangleModeEXT\n  {\n    eInclusive = VK_DISCARD_RECTANGLE_MODE_INCLUSIVE_EXT,\n    eExclusive = VK_DISCARD_RECTANGLE_MODE_EXCLUSIVE_EXT\n  };\n\n  enum class PipelineDiscardRectangleStateCreateFlagBitsEXT : VkPipelineDiscardRectangleStateCreateFlagsEXT\n  {\n  };\n\n  using PipelineDiscardRectangleStateCreateFlagsEXT = Flags<PipelineDiscardRectangleStateCreateFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<PipelineDiscardRectangleStateCreateFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                        isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineDiscardRectangleStateCreateFlagsEXT allFlags  = {};\n  };\n\n  //=== VK_EXT_conservative_rasterization ===\n\n  enum class ConservativeRasterizationModeEXT\n  {\n    eDisabled      = VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT,\n    eOverestimate  = VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT,\n    eUnderestimate = VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT\n  };\n\n  enum class PipelineRasterizationConservativeStateCreateFlagBitsEXT : VkPipelineRasterizationConservativeStateCreateFlagsEXT\n  {\n  };\n\n  using PipelineRasterizationConservativeStateCreateFlagsEXT = Flags<PipelineRasterizationConservativeStateCreateFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<PipelineRasterizationConservativeStateCreateFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                                 isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineRasterizationConservativeStateCreateFlagsEXT allFlags  = {};\n  };\n\n  //=== VK_EXT_depth_clip_enable ===\n\n  enum class PipelineRasterizationDepthClipStateCreateFlagBitsEXT : VkPipelineRasterizationDepthClipStateCreateFlagsEXT\n  {\n  };\n\n  using PipelineRasterizationDepthClipStateCreateFlagsEXT = Flags<PipelineRasterizationDepthClipStateCreateFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<PipelineRasterizationDepthClipStateCreateFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                              isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineRasterizationDepthClipStateCreateFlagsEXT allFlags  = {};\n  };\n\n  //=== VK_KHR_performance_query ===\n\n  enum class PerformanceCounterDescriptionFlagBitsKHR : VkPerformanceCounterDescriptionFlagsKHR\n  {\n    ePerformanceImpacting = VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_BIT_KHR,\n    eConcurrentlyImpacted = VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_BIT_KHR\n  };\n\n  using PerformanceCounterDescriptionFlagsKHR = Flags<PerformanceCounterDescriptionFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<PerformanceCounterDescriptionFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                  isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PerformanceCounterDescriptionFlagsKHR allFlags =\n      PerformanceCounterDescriptionFlagBitsKHR::ePerformanceImpacting | PerformanceCounterDescriptionFlagBitsKHR::eConcurrentlyImpacted;\n  };\n\n  enum class PerformanceCounterScopeKHR\n  {\n    eCommandBuffer             = VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR,\n    eVkQueryScopeCommandBuffer = VK_QUERY_SCOPE_COMMAND_BUFFER_KHR,\n    eRenderPass                = VK_PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR,\n    eVkQueryScopeRenderPass    = VK_QUERY_SCOPE_RENDER_PASS_KHR,\n    eCommand                   = VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_KHR,\n    eVkQueryScopeCommand       = VK_QUERY_SCOPE_COMMAND_KHR\n  };\n\n  enum class PerformanceCounterStorageKHR\n  {\n    eInt32   = VK_PERFORMANCE_COUNTER_STORAGE_INT32_KHR,\n    eInt64   = VK_PERFORMANCE_COUNTER_STORAGE_INT64_KHR,\n    eUint32  = VK_PERFORMANCE_COUNTER_STORAGE_UINT32_KHR,\n    eUint64  = VK_PERFORMANCE_COUNTER_STORAGE_UINT64_KHR,\n    eFloat32 = VK_PERFORMANCE_COUNTER_STORAGE_FLOAT32_KHR,\n    eFloat64 = VK_PERFORMANCE_COUNTER_STORAGE_FLOAT64_KHR\n  };\n\n  enum class PerformanceCounterUnitKHR\n  {\n    eGeneric        = VK_PERFORMANCE_COUNTER_UNIT_GENERIC_KHR,\n    ePercentage     = VK_PERFORMANCE_COUNTER_UNIT_PERCENTAGE_KHR,\n    eNanoseconds    = VK_PERFORMANCE_COUNTER_UNIT_NANOSECONDS_KHR,\n    eBytes          = VK_PERFORMANCE_COUNTER_UNIT_BYTES_KHR,\n    eBytesPerSecond = VK_PERFORMANCE_COUNTER_UNIT_BYTES_PER_SECOND_KHR,\n    eKelvin         = VK_PERFORMANCE_COUNTER_UNIT_KELVIN_KHR,\n    eWatts          = VK_PERFORMANCE_COUNTER_UNIT_WATTS_KHR,\n    eVolts          = VK_PERFORMANCE_COUNTER_UNIT_VOLTS_KHR,\n    eAmps           = VK_PERFORMANCE_COUNTER_UNIT_AMPS_KHR,\n    eHertz          = VK_PERFORMANCE_COUNTER_UNIT_HERTZ_KHR,\n    eCycles         = VK_PERFORMANCE_COUNTER_UNIT_CYCLES_KHR\n  };\n\n  enum class AcquireProfilingLockFlagBitsKHR : VkAcquireProfilingLockFlagsKHR\n  {\n  };\n\n  using AcquireProfilingLockFlagsKHR = Flags<AcquireProfilingLockFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<AcquireProfilingLockFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                         isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR AcquireProfilingLockFlagsKHR allFlags  = {};\n  };\n\n#if defined( VK_USE_PLATFORM_IOS_MVK )\n  //=== VK_MVK_ios_surface ===\n\n  enum class IOSSurfaceCreateFlagBitsMVK : VkIOSSurfaceCreateFlagsMVK\n  {\n  };\n\n  using IOSSurfaceCreateFlagsMVK = Flags<IOSSurfaceCreateFlagBitsMVK>;\n\n  template <>\n  struct FlagTraits<IOSSurfaceCreateFlagBitsMVK>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                     isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR IOSSurfaceCreateFlagsMVK allFlags  = {};\n  };\n#endif /*VK_USE_PLATFORM_IOS_MVK*/\n\n#if defined( VK_USE_PLATFORM_MACOS_MVK )\n  //=== VK_MVK_macos_surface ===\n\n  enum class MacOSSurfaceCreateFlagBitsMVK : VkMacOSSurfaceCreateFlagsMVK\n  {\n  };\n\n  using MacOSSurfaceCreateFlagsMVK = Flags<MacOSSurfaceCreateFlagBitsMVK>;\n\n  template <>\n  struct FlagTraits<MacOSSurfaceCreateFlagBitsMVK>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                       isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR MacOSSurfaceCreateFlagsMVK allFlags  = {};\n  };\n#endif /*VK_USE_PLATFORM_MACOS_MVK*/\n\n  //=== VK_EXT_debug_utils ===\n\n  enum class DebugUtilsMessageSeverityFlagBitsEXT : VkDebugUtilsMessageSeverityFlagsEXT\n  {\n    eVerbose = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT,\n    eInfo    = VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT,\n    eWarning = VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT,\n    eError   = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT\n  };\n\n  using DebugUtilsMessageSeverityFlagsEXT = Flags<DebugUtilsMessageSeverityFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<DebugUtilsMessageSeverityFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                              isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR DebugUtilsMessageSeverityFlagsEXT allFlags =\n      DebugUtilsMessageSeverityFlagBitsEXT::eVerbose | DebugUtilsMessageSeverityFlagBitsEXT::eInfo | DebugUtilsMessageSeverityFlagBitsEXT::eWarning |\n      DebugUtilsMessageSeverityFlagBitsEXT::eError;\n  };\n\n  enum class DebugUtilsMessageTypeFlagBitsEXT : VkDebugUtilsMessageTypeFlagsEXT\n  {\n    eGeneral              = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT,\n    eValidation           = VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT,\n    ePerformance          = VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT,\n    eDeviceAddressBinding = VK_DEBUG_UTILS_MESSAGE_TYPE_DEVICE_ADDRESS_BINDING_BIT_EXT\n  };\n\n  using DebugUtilsMessageTypeFlagsEXT = Flags<DebugUtilsMessageTypeFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<DebugUtilsMessageTypeFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                          isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR DebugUtilsMessageTypeFlagsEXT allFlags =\n      DebugUtilsMessageTypeFlagBitsEXT::eGeneral | DebugUtilsMessageTypeFlagBitsEXT::eValidation | DebugUtilsMessageTypeFlagBitsEXT::ePerformance |\n      DebugUtilsMessageTypeFlagBitsEXT::eDeviceAddressBinding;\n  };\n\n  enum class DebugUtilsMessengerCallbackDataFlagBitsEXT : VkDebugUtilsMessengerCallbackDataFlagsEXT\n  {\n  };\n\n  using DebugUtilsMessengerCallbackDataFlagsEXT = Flags<DebugUtilsMessengerCallbackDataFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<DebugUtilsMessengerCallbackDataFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                    isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR DebugUtilsMessengerCallbackDataFlagsEXT allFlags  = {};\n  };\n\n  enum class DebugUtilsMessengerCreateFlagBitsEXT : VkDebugUtilsMessengerCreateFlagsEXT\n  {\n  };\n\n  using DebugUtilsMessengerCreateFlagsEXT = Flags<DebugUtilsMessengerCreateFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<DebugUtilsMessengerCreateFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                              isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR DebugUtilsMessengerCreateFlagsEXT allFlags  = {};\n  };\n\n  //=== VK_EXT_blend_operation_advanced ===\n\n  enum class BlendOverlapEXT\n  {\n    eUncorrelated = VK_BLEND_OVERLAP_UNCORRELATED_EXT,\n    eDisjoint     = VK_BLEND_OVERLAP_DISJOINT_EXT,\n    eConjoint     = VK_BLEND_OVERLAP_CONJOINT_EXT\n  };\n\n  //=== VK_NV_fragment_coverage_to_color ===\n\n  enum class PipelineCoverageToColorStateCreateFlagBitsNV : VkPipelineCoverageToColorStateCreateFlagsNV\n  {\n  };\n\n  using PipelineCoverageToColorStateCreateFlagsNV = Flags<PipelineCoverageToColorStateCreateFlagBitsNV>;\n\n  template <>\n  struct FlagTraits<PipelineCoverageToColorStateCreateFlagBitsNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                      isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineCoverageToColorStateCreateFlagsNV allFlags  = {};\n  };\n\n  //=== VK_KHR_acceleration_structure ===\n\n  enum class AccelerationStructureTypeKHR\n  {\n    eTopLevel    = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR,\n    eBottomLevel = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR,\n    eGeneric     = VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR\n  };\n  using AccelerationStructureTypeNV = AccelerationStructureTypeKHR;\n\n  enum class AccelerationStructureBuildTypeKHR\n  {\n    eHost         = VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_KHR,\n    eDevice       = VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR,\n    eHostOrDevice = VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_OR_DEVICE_KHR\n  };\n\n  enum class GeometryFlagBitsKHR : VkGeometryFlagsKHR\n  {\n    eOpaque                      = VK_GEOMETRY_OPAQUE_BIT_KHR,\n    eNoDuplicateAnyHitInvocation = VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR\n  };\n  using GeometryFlagBitsNV = GeometryFlagBitsKHR;\n\n  using GeometryFlagsKHR = Flags<GeometryFlagBitsKHR>;\n  using GeometryFlagsNV  = GeometryFlagsKHR;\n\n  template <>\n  struct FlagTraits<GeometryFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool             isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR GeometryFlagsKHR allFlags  = GeometryFlagBitsKHR::eOpaque | GeometryFlagBitsKHR::eNoDuplicateAnyHitInvocation;\n  };\n\n  enum class GeometryInstanceFlagBitsKHR : VkGeometryInstanceFlagsKHR\n  {\n    eTriangleFacingCullDisable     = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR,\n    eTriangleCullDisable           = VK_GEOMETRY_INSTANCE_TRIANGLE_CULL_DISABLE_BIT_NV,\n    eTriangleFlipFacing            = VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR,\n    eTriangleFrontCounterclockwise = VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_KHR,\n    eForceOpaque                   = VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR,\n    eForceNoOpaque                 = VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_KHR,\n    eForceOpacityMicromap2StateEXT = VK_GEOMETRY_INSTANCE_FORCE_OPACITY_MICROMAP_2_STATE_EXT,\n    eDisableOpacityMicromapsEXT    = VK_GEOMETRY_INSTANCE_DISABLE_OPACITY_MICROMAPS_EXT\n  };\n  using GeometryInstanceFlagBitsNV = GeometryInstanceFlagBitsKHR;\n\n  using GeometryInstanceFlagsKHR = Flags<GeometryInstanceFlagBitsKHR>;\n  using GeometryInstanceFlagsNV  = GeometryInstanceFlagsKHR;\n\n  template <>\n  struct FlagTraits<GeometryInstanceFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                     isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR GeometryInstanceFlagsKHR allFlags =\n      GeometryInstanceFlagBitsKHR::eTriangleFacingCullDisable | GeometryInstanceFlagBitsKHR::eTriangleFlipFacing | GeometryInstanceFlagBitsKHR::eForceOpaque |\n      GeometryInstanceFlagBitsKHR::eForceNoOpaque | GeometryInstanceFlagBitsKHR::eForceOpacityMicromap2StateEXT |\n      GeometryInstanceFlagBitsKHR::eDisableOpacityMicromapsEXT;\n  };\n\n  enum class BuildAccelerationStructureFlagBitsKHR : VkBuildAccelerationStructureFlagsKHR\n  {\n    eAllowUpdate                       = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR,\n    eAllowCompaction                   = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR,\n    ePreferFastTrace                   = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR,\n    ePreferFastBuild                   = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR,\n    eLowMemory                         = VK_BUILD_ACCELERATION_STRUCTURE_LOW_MEMORY_BIT_KHR,\n    eMotionNV                          = VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV,\n    eAllowOpacityMicromapUpdateEXT     = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_UPDATE_EXT,\n    eAllowDisableOpacityMicromapsEXT   = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISABLE_OPACITY_MICROMAPS_EXT,\n    eAllowOpacityMicromapDataUpdateEXT = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_DATA_UPDATE_EXT,\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n    eAllowDisplacementMicromapUpdateNV = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISPLACEMENT_MICROMAP_UPDATE_NV,\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n    eAllowDataAccess = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DATA_ACCESS_KHR\n  };\n  using BuildAccelerationStructureFlagBitsNV = BuildAccelerationStructureFlagBitsKHR;\n\n  using BuildAccelerationStructureFlagsKHR = Flags<BuildAccelerationStructureFlagBitsKHR>;\n  using BuildAccelerationStructureFlagsNV  = BuildAccelerationStructureFlagsKHR;\n\n  template <>\n  struct FlagTraits<BuildAccelerationStructureFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                               isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR BuildAccelerationStructureFlagsKHR allFlags =\n      BuildAccelerationStructureFlagBitsKHR::eAllowUpdate | BuildAccelerationStructureFlagBitsKHR::eAllowCompaction |\n      BuildAccelerationStructureFlagBitsKHR::ePreferFastTrace | BuildAccelerationStructureFlagBitsKHR::ePreferFastBuild |\n      BuildAccelerationStructureFlagBitsKHR::eLowMemory | BuildAccelerationStructureFlagBitsKHR::eMotionNV |\n      BuildAccelerationStructureFlagBitsKHR::eAllowOpacityMicromapUpdateEXT | BuildAccelerationStructureFlagBitsKHR::eAllowDisableOpacityMicromapsEXT |\n      BuildAccelerationStructureFlagBitsKHR::eAllowOpacityMicromapDataUpdateEXT\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      | BuildAccelerationStructureFlagBitsKHR::eAllowDisplacementMicromapUpdateNV\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n      | BuildAccelerationStructureFlagBitsKHR::eAllowDataAccess;\n  };\n\n  enum class CopyAccelerationStructureModeKHR\n  {\n    eClone       = VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR,\n    eCompact     = VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR,\n    eSerialize   = VK_COPY_ACCELERATION_STRUCTURE_MODE_SERIALIZE_KHR,\n    eDeserialize = VK_COPY_ACCELERATION_STRUCTURE_MODE_DESERIALIZE_KHR\n  };\n  using CopyAccelerationStructureModeNV = CopyAccelerationStructureModeKHR;\n\n  enum class GeometryTypeKHR\n  {\n    eTriangles            = VK_GEOMETRY_TYPE_TRIANGLES_KHR,\n    eAabbs                = VK_GEOMETRY_TYPE_AABBS_KHR,\n    eInstances            = VK_GEOMETRY_TYPE_INSTANCES_KHR,\n    eSpheresNV            = VK_GEOMETRY_TYPE_SPHERES_NV,\n    eLinearSweptSpheresNV = VK_GEOMETRY_TYPE_LINEAR_SWEPT_SPHERES_NV\n  };\n  using GeometryTypeNV = GeometryTypeKHR;\n\n  enum class AccelerationStructureCompatibilityKHR\n  {\n    eCompatible   = VK_ACCELERATION_STRUCTURE_COMPATIBILITY_COMPATIBLE_KHR,\n    eIncompatible = VK_ACCELERATION_STRUCTURE_COMPATIBILITY_INCOMPATIBLE_KHR\n  };\n\n  enum class AccelerationStructureCreateFlagBitsKHR : VkAccelerationStructureCreateFlagsKHR\n  {\n    eDeviceAddressCaptureReplay       = VK_ACCELERATION_STRUCTURE_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR,\n    eDescriptorBufferCaptureReplayEXT = VK_ACCELERATION_STRUCTURE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT,\n    eMotionNV                         = VK_ACCELERATION_STRUCTURE_CREATE_MOTION_BIT_NV\n  };\n\n  using AccelerationStructureCreateFlagsKHR = Flags<AccelerationStructureCreateFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<AccelerationStructureCreateFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR AccelerationStructureCreateFlagsKHR allFlags =\n      AccelerationStructureCreateFlagBitsKHR::eDeviceAddressCaptureReplay | AccelerationStructureCreateFlagBitsKHR::eDescriptorBufferCaptureReplayEXT |\n      AccelerationStructureCreateFlagBitsKHR::eMotionNV;\n  };\n\n  enum class BuildAccelerationStructureModeKHR\n  {\n    eBuild  = VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR,\n    eUpdate = VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR\n  };\n\n  //=== VK_KHR_ray_tracing_pipeline ===\n\n  enum class RayTracingShaderGroupTypeKHR\n  {\n    eGeneral            = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR,\n    eTrianglesHitGroup  = VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR,\n    eProceduralHitGroup = VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR\n  };\n  using RayTracingShaderGroupTypeNV = RayTracingShaderGroupTypeKHR;\n\n  enum class ShaderGroupShaderKHR\n  {\n    eGeneral      = VK_SHADER_GROUP_SHADER_GENERAL_KHR,\n    eClosestHit   = VK_SHADER_GROUP_SHADER_CLOSEST_HIT_KHR,\n    eAnyHit       = VK_SHADER_GROUP_SHADER_ANY_HIT_KHR,\n    eIntersection = VK_SHADER_GROUP_SHADER_INTERSECTION_KHR\n  };\n\n  //=== VK_NV_framebuffer_mixed_samples ===\n\n  enum class CoverageModulationModeNV\n  {\n    eNone  = VK_COVERAGE_MODULATION_MODE_NONE_NV,\n    eRgb   = VK_COVERAGE_MODULATION_MODE_RGB_NV,\n    eAlpha = VK_COVERAGE_MODULATION_MODE_ALPHA_NV,\n    eRgba  = VK_COVERAGE_MODULATION_MODE_RGBA_NV\n  };\n\n  enum class PipelineCoverageModulationStateCreateFlagBitsNV : VkPipelineCoverageModulationStateCreateFlagsNV\n  {\n  };\n\n  using PipelineCoverageModulationStateCreateFlagsNV = Flags<PipelineCoverageModulationStateCreateFlagBitsNV>;\n\n  template <>\n  struct FlagTraits<PipelineCoverageModulationStateCreateFlagBitsNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                         isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineCoverageModulationStateCreateFlagsNV allFlags  = {};\n  };\n\n  //=== VK_EXT_validation_cache ===\n\n  enum class ValidationCacheHeaderVersionEXT\n  {\n    eOne = VK_VALIDATION_CACHE_HEADER_VERSION_ONE_EXT\n  };\n\n  enum class ValidationCacheCreateFlagBitsEXT : VkValidationCacheCreateFlagsEXT\n  {\n  };\n\n  using ValidationCacheCreateFlagsEXT = Flags<ValidationCacheCreateFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<ValidationCacheCreateFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                          isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ValidationCacheCreateFlagsEXT allFlags  = {};\n  };\n\n  //=== VK_NV_shading_rate_image ===\n\n  enum class ShadingRatePaletteEntryNV\n  {\n    eNoInvocations           = VK_SHADING_RATE_PALETTE_ENTRY_NO_INVOCATIONS_NV,\n    e16InvocationsPerPixel   = VK_SHADING_RATE_PALETTE_ENTRY_16_INVOCATIONS_PER_PIXEL_NV,\n    e8InvocationsPerPixel    = VK_SHADING_RATE_PALETTE_ENTRY_8_INVOCATIONS_PER_PIXEL_NV,\n    e4InvocationsPerPixel    = VK_SHADING_RATE_PALETTE_ENTRY_4_INVOCATIONS_PER_PIXEL_NV,\n    e2InvocationsPerPixel    = VK_SHADING_RATE_PALETTE_ENTRY_2_INVOCATIONS_PER_PIXEL_NV,\n    e1InvocationPerPixel     = VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_PIXEL_NV,\n    e1InvocationPer2X1Pixels = VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_2X1_PIXELS_NV,\n    e1InvocationPer1X2Pixels = VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_1X2_PIXELS_NV,\n    e1InvocationPer2X2Pixels = VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_2X2_PIXELS_NV,\n    e1InvocationPer4X2Pixels = VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_4X2_PIXELS_NV,\n    e1InvocationPer2X4Pixels = VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_2X4_PIXELS_NV,\n    e1InvocationPer4X4Pixels = VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_4X4_PIXELS_NV\n  };\n\n  enum class CoarseSampleOrderTypeNV\n  {\n    eDefault     = VK_COARSE_SAMPLE_ORDER_TYPE_DEFAULT_NV,\n    eCustom      = VK_COARSE_SAMPLE_ORDER_TYPE_CUSTOM_NV,\n    ePixelMajor  = VK_COARSE_SAMPLE_ORDER_TYPE_PIXEL_MAJOR_NV,\n    eSampleMajor = VK_COARSE_SAMPLE_ORDER_TYPE_SAMPLE_MAJOR_NV\n  };\n\n  //=== VK_NV_ray_tracing ===\n\n  enum class AccelerationStructureMemoryRequirementsTypeNV\n  {\n    eObject        = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV,\n    eBuildScratch  = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV,\n    eUpdateScratch = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV\n  };\n\n  //=== VK_AMD_pipeline_compiler_control ===\n\n  enum class PipelineCompilerControlFlagBitsAMD : VkPipelineCompilerControlFlagsAMD\n  {\n  };\n\n  using PipelineCompilerControlFlagsAMD = Flags<PipelineCompilerControlFlagBitsAMD>;\n\n  template <>\n  struct FlagTraits<PipelineCompilerControlFlagBitsAMD>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                            isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineCompilerControlFlagsAMD allFlags  = {};\n  };\n\n  //=== VK_AMD_memory_overallocation_behavior ===\n\n  enum class MemoryOverallocationBehaviorAMD\n  {\n    eDefault    = VK_MEMORY_OVERALLOCATION_BEHAVIOR_DEFAULT_AMD,\n    eAllowed    = VK_MEMORY_OVERALLOCATION_BEHAVIOR_ALLOWED_AMD,\n    eDisallowed = VK_MEMORY_OVERALLOCATION_BEHAVIOR_DISALLOWED_AMD\n  };\n\n  //=== VK_INTEL_performance_query ===\n\n  enum class PerformanceConfigurationTypeINTEL\n  {\n    eCommandQueueMetricsDiscoveryActivated = VK_PERFORMANCE_CONFIGURATION_TYPE_COMMAND_QUEUE_METRICS_DISCOVERY_ACTIVATED_INTEL\n  };\n\n  enum class QueryPoolSamplingModeINTEL\n  {\n    eManual = VK_QUERY_POOL_SAMPLING_MODE_MANUAL_INTEL\n  };\n\n  enum class PerformanceOverrideTypeINTEL\n  {\n    eNullHardware   = VK_PERFORMANCE_OVERRIDE_TYPE_NULL_HARDWARE_INTEL,\n    eFlushGpuCaches = VK_PERFORMANCE_OVERRIDE_TYPE_FLUSH_GPU_CACHES_INTEL\n  };\n\n  enum class PerformanceParameterTypeINTEL\n  {\n    eHwCountersSupported   = VK_PERFORMANCE_PARAMETER_TYPE_HW_COUNTERS_SUPPORTED_INTEL,\n    eStreamMarkerValidBits = VK_PERFORMANCE_PARAMETER_TYPE_STREAM_MARKER_VALID_BITS_INTEL\n  };\n\n  enum class PerformanceValueTypeINTEL\n  {\n    eUint32 = VK_PERFORMANCE_VALUE_TYPE_UINT32_INTEL,\n    eUint64 = VK_PERFORMANCE_VALUE_TYPE_UINT64_INTEL,\n    eFloat  = VK_PERFORMANCE_VALUE_TYPE_FLOAT_INTEL,\n    eBool   = VK_PERFORMANCE_VALUE_TYPE_BOOL_INTEL,\n    eString = VK_PERFORMANCE_VALUE_TYPE_STRING_INTEL\n  };\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_imagepipe_surface ===\n\n  enum class ImagePipeSurfaceCreateFlagBitsFUCHSIA : VkImagePipeSurfaceCreateFlagsFUCHSIA\n  {\n  };\n\n  using ImagePipeSurfaceCreateFlagsFUCHSIA = Flags<ImagePipeSurfaceCreateFlagBitsFUCHSIA>;\n\n  template <>\n  struct FlagTraits<ImagePipeSurfaceCreateFlagBitsFUCHSIA>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                               isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ImagePipeSurfaceCreateFlagsFUCHSIA allFlags  = {};\n  };\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  //=== VK_EXT_metal_surface ===\n\n  enum class MetalSurfaceCreateFlagBitsEXT : VkMetalSurfaceCreateFlagsEXT\n  {\n  };\n\n  using MetalSurfaceCreateFlagsEXT = Flags<MetalSurfaceCreateFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<MetalSurfaceCreateFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                       isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR MetalSurfaceCreateFlagsEXT allFlags  = {};\n  };\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n  //=== VK_KHR_fragment_shading_rate ===\n\n  enum class FragmentShadingRateCombinerOpKHR\n  {\n    eKeep    = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,\n    eReplace = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR,\n    eMin     = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MIN_KHR,\n    eMax     = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MAX_KHR,\n    eMul     = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR\n  };\n\n  //=== VK_AMD_shader_core_properties2 ===\n\n  enum class ShaderCorePropertiesFlagBitsAMD : VkShaderCorePropertiesFlagsAMD\n  {\n  };\n\n  using ShaderCorePropertiesFlagsAMD = Flags<ShaderCorePropertiesFlagBitsAMD>;\n\n  template <>\n  struct FlagTraits<ShaderCorePropertiesFlagBitsAMD>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                         isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ShaderCorePropertiesFlagsAMD allFlags  = {};\n  };\n\n  //=== VK_EXT_validation_features ===\n\n  enum class ValidationFeatureEnableEXT\n  {\n    eGpuAssisted                   = VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT,\n    eGpuAssistedReserveBindingSlot = VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT,\n    eBestPractices                 = VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT,\n    eDebugPrintf                   = VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT,\n    eSynchronizationValidation     = VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT\n  };\n\n  enum class ValidationFeatureDisableEXT\n  {\n    eAll                   = VK_VALIDATION_FEATURE_DISABLE_ALL_EXT,\n    eShaders               = VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT,\n    eThreadSafety          = VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT,\n    eApiParameters         = VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT,\n    eObjectLifetimes       = VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT,\n    eCoreChecks            = VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT,\n    eUniqueHandles         = VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT,\n    eShaderValidationCache = VK_VALIDATION_FEATURE_DISABLE_SHADER_VALIDATION_CACHE_EXT\n  };\n\n  //=== VK_NV_coverage_reduction_mode ===\n\n  enum class CoverageReductionModeNV\n  {\n    eMerge    = VK_COVERAGE_REDUCTION_MODE_MERGE_NV,\n    eTruncate = VK_COVERAGE_REDUCTION_MODE_TRUNCATE_NV\n  };\n\n  enum class PipelineCoverageReductionStateCreateFlagBitsNV : VkPipelineCoverageReductionStateCreateFlagsNV\n  {\n  };\n\n  using PipelineCoverageReductionStateCreateFlagsNV = Flags<PipelineCoverageReductionStateCreateFlagBitsNV>;\n\n  template <>\n  struct FlagTraits<PipelineCoverageReductionStateCreateFlagBitsNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                        isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PipelineCoverageReductionStateCreateFlagsNV allFlags  = {};\n  };\n\n  //=== VK_EXT_provoking_vertex ===\n\n  enum class ProvokingVertexModeEXT\n  {\n    eFirstVertex = VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT,\n    eLastVertex  = VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT\n  };\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_EXT_full_screen_exclusive ===\n\n  enum class FullScreenExclusiveEXT\n  {\n    eDefault               = VK_FULL_SCREEN_EXCLUSIVE_DEFAULT_EXT,\n    eAllowed               = VK_FULL_SCREEN_EXCLUSIVE_ALLOWED_EXT,\n    eDisallowed            = VK_FULL_SCREEN_EXCLUSIVE_DISALLOWED_EXT,\n    eApplicationControlled = VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT\n  };\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_EXT_headless_surface ===\n\n  enum class HeadlessSurfaceCreateFlagBitsEXT : VkHeadlessSurfaceCreateFlagsEXT\n  {\n  };\n\n  using HeadlessSurfaceCreateFlagsEXT = Flags<HeadlessSurfaceCreateFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<HeadlessSurfaceCreateFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                          isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR HeadlessSurfaceCreateFlagsEXT allFlags  = {};\n  };\n\n  //=== VK_KHR_pipeline_executable_properties ===\n\n  enum class PipelineExecutableStatisticFormatKHR\n  {\n    eBool32  = VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_BOOL32_KHR,\n    eInt64   = VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_INT64_KHR,\n    eUint64  = VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_UINT64_KHR,\n    eFloat64 = VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_FLOAT64_KHR\n  };\n\n  //=== VK_EXT_surface_maintenance1 ===\n\n  enum class PresentScalingFlagBitsEXT : VkPresentScalingFlagsEXT\n  {\n    eOneToOne           = VK_PRESENT_SCALING_ONE_TO_ONE_BIT_EXT,\n    eAspectRatioStretch = VK_PRESENT_SCALING_ASPECT_RATIO_STRETCH_BIT_EXT,\n    eStretch            = VK_PRESENT_SCALING_STRETCH_BIT_EXT\n  };\n\n  using PresentScalingFlagsEXT = Flags<PresentScalingFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<PresentScalingFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                   isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PresentScalingFlagsEXT allFlags =\n      PresentScalingFlagBitsEXT::eOneToOne | PresentScalingFlagBitsEXT::eAspectRatioStretch | PresentScalingFlagBitsEXT::eStretch;\n  };\n\n  enum class PresentGravityFlagBitsEXT : VkPresentGravityFlagsEXT\n  {\n    eMin      = VK_PRESENT_GRAVITY_MIN_BIT_EXT,\n    eMax      = VK_PRESENT_GRAVITY_MAX_BIT_EXT,\n    eCentered = VK_PRESENT_GRAVITY_CENTERED_BIT_EXT\n  };\n\n  using PresentGravityFlagsEXT = Flags<PresentGravityFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<PresentGravityFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                   isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PresentGravityFlagsEXT allFlags =\n      PresentGravityFlagBitsEXT::eMin | PresentGravityFlagBitsEXT::eMax | PresentGravityFlagBitsEXT::eCentered;\n  };\n\n  //=== VK_NV_device_generated_commands ===\n\n  enum class IndirectStateFlagBitsNV : VkIndirectStateFlagsNV\n  {\n    eFlagFrontface = VK_INDIRECT_STATE_FLAG_FRONTFACE_BIT_NV\n  };\n\n  using IndirectStateFlagsNV = Flags<IndirectStateFlagBitsNV>;\n\n  template <>\n  struct FlagTraits<IndirectStateFlagBitsNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                 isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR IndirectStateFlagsNV allFlags  = IndirectStateFlagBitsNV::eFlagFrontface;\n  };\n\n  enum class IndirectCommandsTokenTypeNV\n  {\n    eShaderGroup   = VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV,\n    eStateFlags    = VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV,\n    eIndexBuffer   = VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NV,\n    eVertexBuffer  = VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV,\n    ePushConstant  = VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV,\n    eDrawIndexed   = VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV,\n    eDraw          = VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NV,\n    eDrawTasks     = VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV,\n    eDrawMeshTasks = VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NV,\n    ePipeline      = VK_INDIRECT_COMMANDS_TOKEN_TYPE_PIPELINE_NV,\n    eDispatch      = VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_NV\n  };\n\n  enum class IndirectCommandsLayoutUsageFlagBitsNV : VkIndirectCommandsLayoutUsageFlagsNV\n  {\n    eExplicitPreprocess = VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_NV,\n    eIndexedSequences   = VK_INDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT_NV,\n    eUnorderedSequences = VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_NV\n  };\n\n  using IndirectCommandsLayoutUsageFlagsNV = Flags<IndirectCommandsLayoutUsageFlagBitsNV>;\n\n  template <>\n  struct FlagTraits<IndirectCommandsLayoutUsageFlagBitsNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                               isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR IndirectCommandsLayoutUsageFlagsNV allFlags  = IndirectCommandsLayoutUsageFlagBitsNV::eExplicitPreprocess |\n                                                                                       IndirectCommandsLayoutUsageFlagBitsNV::eIndexedSequences |\n                                                                                       IndirectCommandsLayoutUsageFlagBitsNV::eUnorderedSequences;\n  };\n\n  //=== VK_EXT_depth_bias_control ===\n\n  enum class DepthBiasRepresentationEXT\n  {\n    eLeastRepresentableValueFormat     = VK_DEPTH_BIAS_REPRESENTATION_LEAST_REPRESENTABLE_VALUE_FORMAT_EXT,\n    eLeastRepresentableValueForceUnorm = VK_DEPTH_BIAS_REPRESENTATION_LEAST_REPRESENTABLE_VALUE_FORCE_UNORM_EXT,\n    eFloat                             = VK_DEPTH_BIAS_REPRESENTATION_FLOAT_EXT\n  };\n\n  //=== VK_EXT_device_memory_report ===\n\n  enum class DeviceMemoryReportEventTypeEXT\n  {\n    eAllocate         = VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATE_EXT,\n    eFree             = VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_FREE_EXT,\n    eImport           = VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_IMPORT_EXT,\n    eUnimport         = VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_UNIMPORT_EXT,\n    eAllocationFailed = VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATION_FAILED_EXT\n  };\n\n  enum class DeviceMemoryReportFlagBitsEXT : VkDeviceMemoryReportFlagsEXT\n  {\n  };\n\n  using DeviceMemoryReportFlagsEXT = Flags<DeviceMemoryReportFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<DeviceMemoryReportFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                       isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR DeviceMemoryReportFlagsEXT allFlags  = {};\n  };\n\n  //=== VK_KHR_video_encode_queue ===\n\n  enum class VideoEncodeCapabilityFlagBitsKHR : VkVideoEncodeCapabilityFlagsKHR\n  {\n    ePrecedingExternallyEncodedBytes           = VK_VIDEO_ENCODE_CAPABILITY_PRECEDING_EXTERNALLY_ENCODED_BYTES_BIT_KHR,\n    eInsufficientBitstreamBufferRangeDetection = VK_VIDEO_ENCODE_CAPABILITY_INSUFFICIENT_BITSTREAM_BUFFER_RANGE_DETECTION_BIT_KHR,\n    eQuantizationDeltaMap                      = VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR,\n    eEmphasisMap                               = VK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR\n  };\n\n  using VideoEncodeCapabilityFlagsKHR = Flags<VideoEncodeCapabilityFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoEncodeCapabilityFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                          isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoEncodeCapabilityFlagsKHR allFlags =\n      VideoEncodeCapabilityFlagBitsKHR::ePrecedingExternallyEncodedBytes | VideoEncodeCapabilityFlagBitsKHR::eInsufficientBitstreamBufferRangeDetection |\n      VideoEncodeCapabilityFlagBitsKHR::eQuantizationDeltaMap | VideoEncodeCapabilityFlagBitsKHR::eEmphasisMap;\n  };\n\n  enum class VideoEncodeFeedbackFlagBitsKHR : VkVideoEncodeFeedbackFlagsKHR\n  {\n    eBitstreamBufferOffset = VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR,\n    eBitstreamBytesWritten = VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR,\n    eBitstreamHasOverrides = VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_HAS_OVERRIDES_BIT_KHR\n  };\n\n  using VideoEncodeFeedbackFlagsKHR = Flags<VideoEncodeFeedbackFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoEncodeFeedbackFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                        isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoEncodeFeedbackFlagsKHR allFlags  = VideoEncodeFeedbackFlagBitsKHR::eBitstreamBufferOffset |\n                                                                                VideoEncodeFeedbackFlagBitsKHR::eBitstreamBytesWritten |\n                                                                                VideoEncodeFeedbackFlagBitsKHR::eBitstreamHasOverrides;\n  };\n\n  enum class VideoEncodeUsageFlagBitsKHR : VkVideoEncodeUsageFlagsKHR\n  {\n    eDefault      = VK_VIDEO_ENCODE_USAGE_DEFAULT_KHR,\n    eTranscoding  = VK_VIDEO_ENCODE_USAGE_TRANSCODING_BIT_KHR,\n    eStreaming    = VK_VIDEO_ENCODE_USAGE_STREAMING_BIT_KHR,\n    eRecording    = VK_VIDEO_ENCODE_USAGE_RECORDING_BIT_KHR,\n    eConferencing = VK_VIDEO_ENCODE_USAGE_CONFERENCING_BIT_KHR\n  };\n\n  using VideoEncodeUsageFlagsKHR = Flags<VideoEncodeUsageFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoEncodeUsageFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                     isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoEncodeUsageFlagsKHR allFlags = VideoEncodeUsageFlagBitsKHR::eDefault | VideoEncodeUsageFlagBitsKHR::eTranscoding |\n                                                                             VideoEncodeUsageFlagBitsKHR::eStreaming | VideoEncodeUsageFlagBitsKHR::eRecording |\n                                                                             VideoEncodeUsageFlagBitsKHR::eConferencing;\n  };\n\n  enum class VideoEncodeContentFlagBitsKHR : VkVideoEncodeContentFlagsKHR\n  {\n    eDefault  = VK_VIDEO_ENCODE_CONTENT_DEFAULT_KHR,\n    eCamera   = VK_VIDEO_ENCODE_CONTENT_CAMERA_BIT_KHR,\n    eDesktop  = VK_VIDEO_ENCODE_CONTENT_DESKTOP_BIT_KHR,\n    eRendered = VK_VIDEO_ENCODE_CONTENT_RENDERED_BIT_KHR\n  };\n\n  using VideoEncodeContentFlagsKHR = Flags<VideoEncodeContentFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoEncodeContentFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                       isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoEncodeContentFlagsKHR allFlags =\n      VideoEncodeContentFlagBitsKHR::eDefault | VideoEncodeContentFlagBitsKHR::eCamera | VideoEncodeContentFlagBitsKHR::eDesktop |\n      VideoEncodeContentFlagBitsKHR::eRendered;\n  };\n\n  enum class VideoEncodeTuningModeKHR\n  {\n    eDefault         = VK_VIDEO_ENCODE_TUNING_MODE_DEFAULT_KHR,\n    eHighQuality     = VK_VIDEO_ENCODE_TUNING_MODE_HIGH_QUALITY_KHR,\n    eLowLatency      = VK_VIDEO_ENCODE_TUNING_MODE_LOW_LATENCY_KHR,\n    eUltraLowLatency = VK_VIDEO_ENCODE_TUNING_MODE_ULTRA_LOW_LATENCY_KHR,\n    eLossless        = VK_VIDEO_ENCODE_TUNING_MODE_LOSSLESS_KHR\n  };\n\n  enum class VideoEncodeRateControlModeFlagBitsKHR : VkVideoEncodeRateControlModeFlagsKHR\n  {\n    eDefault  = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR,\n    eDisabled = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR,\n    eCbr      = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR,\n    eVbr      = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR\n  };\n\n  using VideoEncodeRateControlModeFlagsKHR = Flags<VideoEncodeRateControlModeFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoEncodeRateControlModeFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                               isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoEncodeRateControlModeFlagsKHR allFlags =\n      VideoEncodeRateControlModeFlagBitsKHR::eDefault | VideoEncodeRateControlModeFlagBitsKHR::eDisabled | VideoEncodeRateControlModeFlagBitsKHR::eCbr |\n      VideoEncodeRateControlModeFlagBitsKHR::eVbr;\n  };\n\n  enum class VideoEncodeFlagBitsKHR : VkVideoEncodeFlagsKHR\n  {\n    eWithQuantizationDeltaMap = VK_VIDEO_ENCODE_WITH_QUANTIZATION_DELTA_MAP_BIT_KHR,\n    eWithEmphasisMap          = VK_VIDEO_ENCODE_WITH_EMPHASIS_MAP_BIT_KHR\n  };\n\n  using VideoEncodeFlagsKHR = Flags<VideoEncodeFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoEncodeFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoEncodeFlagsKHR allFlags =\n      VideoEncodeFlagBitsKHR::eWithQuantizationDeltaMap | VideoEncodeFlagBitsKHR::eWithEmphasisMap;\n  };\n\n  enum class VideoEncodeRateControlFlagBitsKHR : VkVideoEncodeRateControlFlagsKHR\n  {\n  };\n\n  using VideoEncodeRateControlFlagsKHR = Flags<VideoEncodeRateControlFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoEncodeRateControlFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                           isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoEncodeRateControlFlagsKHR allFlags  = {};\n  };\n\n  //=== VK_NV_device_diagnostics_config ===\n\n  enum class DeviceDiagnosticsConfigFlagBitsNV : VkDeviceDiagnosticsConfigFlagsNV\n  {\n    eEnableShaderDebugInfo      = VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_SHADER_DEBUG_INFO_BIT_NV,\n    eEnableResourceTracking     = VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_RESOURCE_TRACKING_BIT_NV,\n    eEnableAutomaticCheckpoints = VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_AUTOMATIC_CHECKPOINTS_BIT_NV,\n    eEnableShaderErrorReporting = VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_SHADER_ERROR_REPORTING_BIT_NV\n  };\n\n  using DeviceDiagnosticsConfigFlagsNV = Flags<DeviceDiagnosticsConfigFlagBitsNV>;\n\n  template <>\n  struct FlagTraits<DeviceDiagnosticsConfigFlagBitsNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                           isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR DeviceDiagnosticsConfigFlagsNV allFlags =\n      DeviceDiagnosticsConfigFlagBitsNV::eEnableShaderDebugInfo | DeviceDiagnosticsConfigFlagBitsNV::eEnableResourceTracking |\n      DeviceDiagnosticsConfigFlagBitsNV::eEnableAutomaticCheckpoints | DeviceDiagnosticsConfigFlagBitsNV::eEnableShaderErrorReporting;\n  };\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  //=== VK_EXT_metal_objects ===\n\n  enum class ExportMetalObjectTypeFlagBitsEXT : VkExportMetalObjectTypeFlagsEXT\n  {\n    eMetalDevice       = VK_EXPORT_METAL_OBJECT_TYPE_METAL_DEVICE_BIT_EXT,\n    eMetalCommandQueue = VK_EXPORT_METAL_OBJECT_TYPE_METAL_COMMAND_QUEUE_BIT_EXT,\n    eMetalBuffer       = VK_EXPORT_METAL_OBJECT_TYPE_METAL_BUFFER_BIT_EXT,\n    eMetalTexture      = VK_EXPORT_METAL_OBJECT_TYPE_METAL_TEXTURE_BIT_EXT,\n    eMetalIosurface    = VK_EXPORT_METAL_OBJECT_TYPE_METAL_IOSURFACE_BIT_EXT,\n    eMetalSharedEvent  = VK_EXPORT_METAL_OBJECT_TYPE_METAL_SHARED_EVENT_BIT_EXT\n  };\n\n  using ExportMetalObjectTypeFlagsEXT = Flags<ExportMetalObjectTypeFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<ExportMetalObjectTypeFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                          isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ExportMetalObjectTypeFlagsEXT allFlags =\n      ExportMetalObjectTypeFlagBitsEXT::eMetalDevice | ExportMetalObjectTypeFlagBitsEXT::eMetalCommandQueue | ExportMetalObjectTypeFlagBitsEXT::eMetalBuffer |\n      ExportMetalObjectTypeFlagBitsEXT::eMetalTexture | ExportMetalObjectTypeFlagBitsEXT::eMetalIosurface | ExportMetalObjectTypeFlagBitsEXT::eMetalSharedEvent;\n  };\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n  //=== VK_EXT_graphics_pipeline_library ===\n\n  enum class GraphicsPipelineLibraryFlagBitsEXT : VkGraphicsPipelineLibraryFlagsEXT\n  {\n    eVertexInputInterface    = VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_EXT,\n    ePreRasterizationShaders = VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT,\n    eFragmentShader          = VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT,\n    eFragmentOutputInterface = VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT\n  };\n\n  using GraphicsPipelineLibraryFlagsEXT = Flags<GraphicsPipelineLibraryFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<GraphicsPipelineLibraryFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                            isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR GraphicsPipelineLibraryFlagsEXT allFlags =\n      GraphicsPipelineLibraryFlagBitsEXT::eVertexInputInterface | GraphicsPipelineLibraryFlagBitsEXT::ePreRasterizationShaders |\n      GraphicsPipelineLibraryFlagBitsEXT::eFragmentShader | GraphicsPipelineLibraryFlagBitsEXT::eFragmentOutputInterface;\n  };\n\n  //=== VK_NV_fragment_shading_rate_enums ===\n\n  enum class FragmentShadingRateNV\n  {\n    e1InvocationPerPixel     = VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV,\n    e1InvocationPer1X2Pixels = VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_1X2_PIXELS_NV,\n    e1InvocationPer2X1Pixels = VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_2X1_PIXELS_NV,\n    e1InvocationPer2X2Pixels = VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_2X2_PIXELS_NV,\n    e1InvocationPer2X4Pixels = VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_2X4_PIXELS_NV,\n    e1InvocationPer4X2Pixels = VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_4X2_PIXELS_NV,\n    e1InvocationPer4X4Pixels = VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_4X4_PIXELS_NV,\n    e2InvocationsPerPixel    = VK_FRAGMENT_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NV,\n    e4InvocationsPerPixel    = VK_FRAGMENT_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NV,\n    e8InvocationsPerPixel    = VK_FRAGMENT_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NV,\n    e16InvocationsPerPixel   = VK_FRAGMENT_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV,\n    eNoInvocations           = VK_FRAGMENT_SHADING_RATE_NO_INVOCATIONS_NV\n  };\n\n  enum class FragmentShadingRateTypeNV\n  {\n    eFragmentSize = VK_FRAGMENT_SHADING_RATE_TYPE_FRAGMENT_SIZE_NV,\n    eEnums        = VK_FRAGMENT_SHADING_RATE_TYPE_ENUMS_NV\n  };\n\n  //=== VK_NV_ray_tracing_motion_blur ===\n\n  enum class AccelerationStructureMotionInstanceTypeNV\n  {\n    eStatic       = VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_STATIC_NV,\n    eMatrixMotion = VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_MATRIX_MOTION_NV,\n    eSrtMotion    = VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_SRT_MOTION_NV\n  };\n\n  enum class AccelerationStructureMotionInfoFlagBitsNV : VkAccelerationStructureMotionInfoFlagsNV\n  {\n  };\n\n  using AccelerationStructureMotionInfoFlagsNV = Flags<AccelerationStructureMotionInfoFlagBitsNV>;\n\n  template <>\n  struct FlagTraits<AccelerationStructureMotionInfoFlagBitsNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                   isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR AccelerationStructureMotionInfoFlagsNV allFlags  = {};\n  };\n\n  enum class AccelerationStructureMotionInstanceFlagBitsNV : VkAccelerationStructureMotionInstanceFlagsNV\n  {\n  };\n\n  using AccelerationStructureMotionInstanceFlagsNV = Flags<AccelerationStructureMotionInstanceFlagBitsNV>;\n\n  template <>\n  struct FlagTraits<AccelerationStructureMotionInstanceFlagBitsNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                       isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR AccelerationStructureMotionInstanceFlagsNV allFlags  = {};\n  };\n\n  //=== VK_EXT_image_compression_control ===\n\n  enum class ImageCompressionFlagBitsEXT : VkImageCompressionFlagsEXT\n  {\n    eDefault           = VK_IMAGE_COMPRESSION_DEFAULT_EXT,\n    eFixedRateDefault  = VK_IMAGE_COMPRESSION_FIXED_RATE_DEFAULT_EXT,\n    eFixedRateExplicit = VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT,\n    eDisabled          = VK_IMAGE_COMPRESSION_DISABLED_EXT\n  };\n\n  using ImageCompressionFlagsEXT = Flags<ImageCompressionFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<ImageCompressionFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                     isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ImageCompressionFlagsEXT allFlags =\n      ImageCompressionFlagBitsEXT::eDefault | ImageCompressionFlagBitsEXT::eFixedRateDefault | ImageCompressionFlagBitsEXT::eFixedRateExplicit |\n      ImageCompressionFlagBitsEXT::eDisabled;\n  };\n\n  enum class ImageCompressionFixedRateFlagBitsEXT : VkImageCompressionFixedRateFlagsEXT\n  {\n    eNone  = VK_IMAGE_COMPRESSION_FIXED_RATE_NONE_EXT,\n    e1Bpc  = VK_IMAGE_COMPRESSION_FIXED_RATE_1BPC_BIT_EXT,\n    e2Bpc  = VK_IMAGE_COMPRESSION_FIXED_RATE_2BPC_BIT_EXT,\n    e3Bpc  = VK_IMAGE_COMPRESSION_FIXED_RATE_3BPC_BIT_EXT,\n    e4Bpc  = VK_IMAGE_COMPRESSION_FIXED_RATE_4BPC_BIT_EXT,\n    e5Bpc  = VK_IMAGE_COMPRESSION_FIXED_RATE_5BPC_BIT_EXT,\n    e6Bpc  = VK_IMAGE_COMPRESSION_FIXED_RATE_6BPC_BIT_EXT,\n    e7Bpc  = VK_IMAGE_COMPRESSION_FIXED_RATE_7BPC_BIT_EXT,\n    e8Bpc  = VK_IMAGE_COMPRESSION_FIXED_RATE_8BPC_BIT_EXT,\n    e9Bpc  = VK_IMAGE_COMPRESSION_FIXED_RATE_9BPC_BIT_EXT,\n    e10Bpc = VK_IMAGE_COMPRESSION_FIXED_RATE_10BPC_BIT_EXT,\n    e11Bpc = VK_IMAGE_COMPRESSION_FIXED_RATE_11BPC_BIT_EXT,\n    e12Bpc = VK_IMAGE_COMPRESSION_FIXED_RATE_12BPC_BIT_EXT,\n    e13Bpc = VK_IMAGE_COMPRESSION_FIXED_RATE_13BPC_BIT_EXT,\n    e14Bpc = VK_IMAGE_COMPRESSION_FIXED_RATE_14BPC_BIT_EXT,\n    e15Bpc = VK_IMAGE_COMPRESSION_FIXED_RATE_15BPC_BIT_EXT,\n    e16Bpc = VK_IMAGE_COMPRESSION_FIXED_RATE_16BPC_BIT_EXT,\n    e17Bpc = VK_IMAGE_COMPRESSION_FIXED_RATE_17BPC_BIT_EXT,\n    e18Bpc = VK_IMAGE_COMPRESSION_FIXED_RATE_18BPC_BIT_EXT,\n    e19Bpc = VK_IMAGE_COMPRESSION_FIXED_RATE_19BPC_BIT_EXT,\n    e20Bpc = VK_IMAGE_COMPRESSION_FIXED_RATE_20BPC_BIT_EXT,\n    e21Bpc = VK_IMAGE_COMPRESSION_FIXED_RATE_21BPC_BIT_EXT,\n    e22Bpc = VK_IMAGE_COMPRESSION_FIXED_RATE_22BPC_BIT_EXT,\n    e23Bpc = VK_IMAGE_COMPRESSION_FIXED_RATE_23BPC_BIT_EXT,\n    e24Bpc = VK_IMAGE_COMPRESSION_FIXED_RATE_24BPC_BIT_EXT\n  };\n\n  using ImageCompressionFixedRateFlagsEXT = Flags<ImageCompressionFixedRateFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<ImageCompressionFixedRateFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                              isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ImageCompressionFixedRateFlagsEXT allFlags =\n      ImageCompressionFixedRateFlagBitsEXT::eNone | ImageCompressionFixedRateFlagBitsEXT::e1Bpc | ImageCompressionFixedRateFlagBitsEXT::e2Bpc |\n      ImageCompressionFixedRateFlagBitsEXT::e3Bpc | ImageCompressionFixedRateFlagBitsEXT::e4Bpc | ImageCompressionFixedRateFlagBitsEXT::e5Bpc |\n      ImageCompressionFixedRateFlagBitsEXT::e6Bpc | ImageCompressionFixedRateFlagBitsEXT::e7Bpc | ImageCompressionFixedRateFlagBitsEXT::e8Bpc |\n      ImageCompressionFixedRateFlagBitsEXT::e9Bpc | ImageCompressionFixedRateFlagBitsEXT::e10Bpc | ImageCompressionFixedRateFlagBitsEXT::e11Bpc |\n      ImageCompressionFixedRateFlagBitsEXT::e12Bpc | ImageCompressionFixedRateFlagBitsEXT::e13Bpc | ImageCompressionFixedRateFlagBitsEXT::e14Bpc |\n      ImageCompressionFixedRateFlagBitsEXT::e15Bpc | ImageCompressionFixedRateFlagBitsEXT::e16Bpc | ImageCompressionFixedRateFlagBitsEXT::e17Bpc |\n      ImageCompressionFixedRateFlagBitsEXT::e18Bpc | ImageCompressionFixedRateFlagBitsEXT::e19Bpc | ImageCompressionFixedRateFlagBitsEXT::e20Bpc |\n      ImageCompressionFixedRateFlagBitsEXT::e21Bpc | ImageCompressionFixedRateFlagBitsEXT::e22Bpc | ImageCompressionFixedRateFlagBitsEXT::e23Bpc |\n      ImageCompressionFixedRateFlagBitsEXT::e24Bpc;\n  };\n\n  //=== VK_EXT_device_fault ===\n\n  enum class DeviceFaultAddressTypeEXT\n  {\n    eNone                      = VK_DEVICE_FAULT_ADDRESS_TYPE_NONE_EXT,\n    eReadInvalid               = VK_DEVICE_FAULT_ADDRESS_TYPE_READ_INVALID_EXT,\n    eWriteInvalid              = VK_DEVICE_FAULT_ADDRESS_TYPE_WRITE_INVALID_EXT,\n    eExecuteInvalid            = VK_DEVICE_FAULT_ADDRESS_TYPE_EXECUTE_INVALID_EXT,\n    eInstructionPointerUnknown = VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_UNKNOWN_EXT,\n    eInstructionPointerInvalid = VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_INVALID_EXT,\n    eInstructionPointerFault   = VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_FAULT_EXT\n  };\n\n  enum class DeviceFaultVendorBinaryHeaderVersionEXT\n  {\n    eOne = VK_DEVICE_FAULT_VENDOR_BINARY_HEADER_VERSION_ONE_EXT\n  };\n\n#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n  //=== VK_EXT_directfb_surface ===\n\n  enum class DirectFBSurfaceCreateFlagBitsEXT : VkDirectFBSurfaceCreateFlagsEXT\n  {\n  };\n\n  using DirectFBSurfaceCreateFlagsEXT = Flags<DirectFBSurfaceCreateFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<DirectFBSurfaceCreateFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                          isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR DirectFBSurfaceCreateFlagsEXT allFlags  = {};\n  };\n#endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n\n  //=== VK_EXT_device_address_binding_report ===\n\n  enum class DeviceAddressBindingFlagBitsEXT : VkDeviceAddressBindingFlagsEXT\n  {\n    eInternalObject = VK_DEVICE_ADDRESS_BINDING_INTERNAL_OBJECT_BIT_EXT\n  };\n\n  using DeviceAddressBindingFlagsEXT = Flags<DeviceAddressBindingFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<DeviceAddressBindingFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                         isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR DeviceAddressBindingFlagsEXT allFlags  = DeviceAddressBindingFlagBitsEXT::eInternalObject;\n  };\n\n  enum class DeviceAddressBindingTypeEXT\n  {\n    eBind   = VK_DEVICE_ADDRESS_BINDING_TYPE_BIND_EXT,\n    eUnbind = VK_DEVICE_ADDRESS_BINDING_TYPE_UNBIND_EXT\n  };\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_buffer_collection ===\n\n  enum class ImageConstraintsInfoFlagBitsFUCHSIA : VkImageConstraintsInfoFlagsFUCHSIA\n  {\n    eCpuReadRarely     = VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_RARELY_FUCHSIA,\n    eCpuReadOften      = VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_OFTEN_FUCHSIA,\n    eCpuWriteRarely    = VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_RARELY_FUCHSIA,\n    eCpuWriteOften     = VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_OFTEN_FUCHSIA,\n    eProtectedOptional = VK_IMAGE_CONSTRAINTS_INFO_PROTECTED_OPTIONAL_FUCHSIA\n  };\n\n  using ImageConstraintsInfoFlagsFUCHSIA = Flags<ImageConstraintsInfoFlagBitsFUCHSIA>;\n\n  template <>\n  struct FlagTraits<ImageConstraintsInfoFlagBitsFUCHSIA>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                             isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ImageConstraintsInfoFlagsFUCHSIA allFlags =\n      ImageConstraintsInfoFlagBitsFUCHSIA::eCpuReadRarely | ImageConstraintsInfoFlagBitsFUCHSIA::eCpuReadOften |\n      ImageConstraintsInfoFlagBitsFUCHSIA::eCpuWriteRarely | ImageConstraintsInfoFlagBitsFUCHSIA::eCpuWriteOften |\n      ImageConstraintsInfoFlagBitsFUCHSIA::eProtectedOptional;\n  };\n\n  enum class ImageFormatConstraintsFlagBitsFUCHSIA : VkImageFormatConstraintsFlagsFUCHSIA\n  {\n  };\n\n  using ImageFormatConstraintsFlagsFUCHSIA = Flags<ImageFormatConstraintsFlagBitsFUCHSIA>;\n\n  template <>\n  struct FlagTraits<ImageFormatConstraintsFlagBitsFUCHSIA>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                               isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ImageFormatConstraintsFlagsFUCHSIA allFlags  = {};\n  };\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  //=== VK_EXT_frame_boundary ===\n\n  enum class FrameBoundaryFlagBitsEXT : VkFrameBoundaryFlagsEXT\n  {\n    eFrameEnd = VK_FRAME_BOUNDARY_FRAME_END_BIT_EXT\n  };\n\n  using FrameBoundaryFlagsEXT = Flags<FrameBoundaryFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<FrameBoundaryFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                  isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR FrameBoundaryFlagsEXT allFlags  = FrameBoundaryFlagBitsEXT::eFrameEnd;\n  };\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n  //=== VK_QNX_screen_surface ===\n\n  enum class ScreenSurfaceCreateFlagBitsQNX : VkScreenSurfaceCreateFlagsQNX\n  {\n  };\n\n  using ScreenSurfaceCreateFlagsQNX = Flags<ScreenSurfaceCreateFlagBitsQNX>;\n\n  template <>\n  struct FlagTraits<ScreenSurfaceCreateFlagBitsQNX>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                        isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ScreenSurfaceCreateFlagsQNX allFlags  = {};\n  };\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n  //=== VK_EXT_opacity_micromap ===\n\n  enum class MicromapTypeEXT\n  {\n    eOpacityMicromap = VK_MICROMAP_TYPE_OPACITY_MICROMAP_EXT,\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n    eDisplacementMicromapNV = VK_MICROMAP_TYPE_DISPLACEMENT_MICROMAP_NV\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n  };\n\n  enum class BuildMicromapFlagBitsEXT : VkBuildMicromapFlagsEXT\n  {\n    ePreferFastTrace = VK_BUILD_MICROMAP_PREFER_FAST_TRACE_BIT_EXT,\n    ePreferFastBuild = VK_BUILD_MICROMAP_PREFER_FAST_BUILD_BIT_EXT,\n    eAllowCompaction = VK_BUILD_MICROMAP_ALLOW_COMPACTION_BIT_EXT\n  };\n\n  using BuildMicromapFlagsEXT = Flags<BuildMicromapFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<BuildMicromapFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                  isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR BuildMicromapFlagsEXT allFlags =\n      BuildMicromapFlagBitsEXT::ePreferFastTrace | BuildMicromapFlagBitsEXT::ePreferFastBuild | BuildMicromapFlagBitsEXT::eAllowCompaction;\n  };\n\n  enum class CopyMicromapModeEXT\n  {\n    eClone       = VK_COPY_MICROMAP_MODE_CLONE_EXT,\n    eSerialize   = VK_COPY_MICROMAP_MODE_SERIALIZE_EXT,\n    eDeserialize = VK_COPY_MICROMAP_MODE_DESERIALIZE_EXT,\n    eCompact     = VK_COPY_MICROMAP_MODE_COMPACT_EXT\n  };\n\n  enum class MicromapCreateFlagBitsEXT : VkMicromapCreateFlagsEXT\n  {\n    eDeviceAddressCaptureReplay = VK_MICROMAP_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT\n  };\n\n  using MicromapCreateFlagsEXT = Flags<MicromapCreateFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<MicromapCreateFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                   isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR MicromapCreateFlagsEXT allFlags  = MicromapCreateFlagBitsEXT::eDeviceAddressCaptureReplay;\n  };\n\n  enum class BuildMicromapModeEXT\n  {\n    eBuild = VK_BUILD_MICROMAP_MODE_BUILD_EXT\n  };\n\n  enum class OpacityMicromapFormatEXT\n  {\n    e2State = VK_OPACITY_MICROMAP_FORMAT_2_STATE_EXT,\n    e4State = VK_OPACITY_MICROMAP_FORMAT_4_STATE_EXT\n  };\n\n  enum class OpacityMicromapSpecialIndexEXT\n  {\n    eFullyTransparent                        = VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_TRANSPARENT_EXT,\n    eFullyOpaque                             = VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_OPAQUE_EXT,\n    eFullyUnknownTransparent                 = VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_UNKNOWN_TRANSPARENT_EXT,\n    eFullyUnknownOpaque                      = VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_UNKNOWN_OPAQUE_EXT,\n    eClusterGeometryDisableOpacityMicromapNV = VK_OPACITY_MICROMAP_SPECIAL_INDEX_CLUSTER_GEOMETRY_DISABLE_OPACITY_MICROMAP_NV\n  };\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  //=== VK_NV_displacement_micromap ===\n\n  enum class DisplacementMicromapFormatNV\n  {\n    e64Triangles64Bytes    = VK_DISPLACEMENT_MICROMAP_FORMAT_64_TRIANGLES_64_BYTES_NV,\n    e256Triangles128Bytes  = VK_DISPLACEMENT_MICROMAP_FORMAT_256_TRIANGLES_128_BYTES_NV,\n    e1024Triangles128Bytes = VK_DISPLACEMENT_MICROMAP_FORMAT_1024_TRIANGLES_128_BYTES_NV\n  };\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  //=== VK_ARM_scheduling_controls ===\n\n  enum class PhysicalDeviceSchedulingControlsFlagBitsARM : VkPhysicalDeviceSchedulingControlsFlagsARM\n  {\n    eShaderCoreCount = VK_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_SHADER_CORE_COUNT_ARM\n  };\n\n  using PhysicalDeviceSchedulingControlsFlagsARM = Flags<PhysicalDeviceSchedulingControlsFlagBitsARM>;\n\n  template <>\n  struct FlagTraits<PhysicalDeviceSchedulingControlsFlagBitsARM>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                     isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PhysicalDeviceSchedulingControlsFlagsARM allFlags  = PhysicalDeviceSchedulingControlsFlagBitsARM::eShaderCoreCount;\n  };\n\n  //=== VK_NV_memory_decompression ===\n\n  enum class MemoryDecompressionMethodFlagBitsNV : VkMemoryDecompressionMethodFlagsNV\n  {\n    eGdeflate10 = VK_MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_NV\n  };\n\n  using MemoryDecompressionMethodFlagsNV = Flags<MemoryDecompressionMethodFlagBitsNV>;\n\n  template <>\n  struct FlagTraits<MemoryDecompressionMethodFlagBitsNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                             isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR MemoryDecompressionMethodFlagsNV allFlags  = MemoryDecompressionMethodFlagBitsNV::eGdeflate10;\n  };\n\n  //=== VK_NV_ray_tracing_linear_swept_spheres ===\n\n  enum class RayTracingLssIndexingModeNV\n  {\n    eList       = VK_RAY_TRACING_LSS_INDEXING_MODE_LIST_NV,\n    eSuccessive = VK_RAY_TRACING_LSS_INDEXING_MODE_SUCCESSIVE_NV\n  };\n\n  enum class RayTracingLssPrimitiveEndCapsModeNV\n  {\n    eNone    = VK_RAY_TRACING_LSS_PRIMITIVE_END_CAPS_MODE_NONE_NV,\n    eChained = VK_RAY_TRACING_LSS_PRIMITIVE_END_CAPS_MODE_CHAINED_NV\n  };\n\n  //=== VK_EXT_subpass_merge_feedback ===\n\n  enum class SubpassMergeStatusEXT\n  {\n    eMerged                               = VK_SUBPASS_MERGE_STATUS_MERGED_EXT,\n    eDisallowed                           = VK_SUBPASS_MERGE_STATUS_DISALLOWED_EXT,\n    eNotMergedSideEffects                 = VK_SUBPASS_MERGE_STATUS_NOT_MERGED_SIDE_EFFECTS_EXT,\n    eNotMergedSamplesMismatch             = VK_SUBPASS_MERGE_STATUS_NOT_MERGED_SAMPLES_MISMATCH_EXT,\n    eNotMergedViewsMismatch               = VK_SUBPASS_MERGE_STATUS_NOT_MERGED_VIEWS_MISMATCH_EXT,\n    eNotMergedAliasing                    = VK_SUBPASS_MERGE_STATUS_NOT_MERGED_ALIASING_EXT,\n    eNotMergedDependencies                = VK_SUBPASS_MERGE_STATUS_NOT_MERGED_DEPENDENCIES_EXT,\n    eNotMergedIncompatibleInputAttachment = VK_SUBPASS_MERGE_STATUS_NOT_MERGED_INCOMPATIBLE_INPUT_ATTACHMENT_EXT,\n    eNotMergedTooManyAttachments          = VK_SUBPASS_MERGE_STATUS_NOT_MERGED_TOO_MANY_ATTACHMENTS_EXT,\n    eNotMergedInsufficientStorage         = VK_SUBPASS_MERGE_STATUS_NOT_MERGED_INSUFFICIENT_STORAGE_EXT,\n    eNotMergedDepthStencilCount           = VK_SUBPASS_MERGE_STATUS_NOT_MERGED_DEPTH_STENCIL_COUNT_EXT,\n    eNotMergedResolveAttachmentReuse      = VK_SUBPASS_MERGE_STATUS_NOT_MERGED_RESOLVE_ATTACHMENT_REUSE_EXT,\n    eNotMergedSingleSubpass               = VK_SUBPASS_MERGE_STATUS_NOT_MERGED_SINGLE_SUBPASS_EXT,\n    eNotMergedUnspecified                 = VK_SUBPASS_MERGE_STATUS_NOT_MERGED_UNSPECIFIED_EXT\n  };\n\n  //=== VK_LUNARG_direct_driver_loading ===\n\n  enum class DirectDriverLoadingModeLUNARG\n  {\n    eExclusive = VK_DIRECT_DRIVER_LOADING_MODE_EXCLUSIVE_LUNARG,\n    eInclusive = VK_DIRECT_DRIVER_LOADING_MODE_INCLUSIVE_LUNARG\n  };\n\n  enum class DirectDriverLoadingFlagBitsLUNARG : VkDirectDriverLoadingFlagsLUNARG\n  {\n  };\n\n  using DirectDriverLoadingFlagsLUNARG = Flags<DirectDriverLoadingFlagBitsLUNARG>;\n\n  template <>\n  struct FlagTraits<DirectDriverLoadingFlagBitsLUNARG>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                           isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR DirectDriverLoadingFlagsLUNARG allFlags  = {};\n  };\n\n  //=== VK_NV_optical_flow ===\n\n  enum class OpticalFlowUsageFlagBitsNV : VkOpticalFlowUsageFlagsNV\n  {\n    eUnknown    = VK_OPTICAL_FLOW_USAGE_UNKNOWN_NV,\n    eInput      = VK_OPTICAL_FLOW_USAGE_INPUT_BIT_NV,\n    eOutput     = VK_OPTICAL_FLOW_USAGE_OUTPUT_BIT_NV,\n    eHint       = VK_OPTICAL_FLOW_USAGE_HINT_BIT_NV,\n    eCost       = VK_OPTICAL_FLOW_USAGE_COST_BIT_NV,\n    eGlobalFlow = VK_OPTICAL_FLOW_USAGE_GLOBAL_FLOW_BIT_NV\n  };\n\n  using OpticalFlowUsageFlagsNV = Flags<OpticalFlowUsageFlagBitsNV>;\n\n  template <>\n  struct FlagTraits<OpticalFlowUsageFlagBitsNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                    isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR OpticalFlowUsageFlagsNV allFlags  = OpticalFlowUsageFlagBitsNV::eUnknown | OpticalFlowUsageFlagBitsNV::eInput |\n                                                                            OpticalFlowUsageFlagBitsNV::eOutput | OpticalFlowUsageFlagBitsNV::eHint |\n                                                                            OpticalFlowUsageFlagBitsNV::eCost | OpticalFlowUsageFlagBitsNV::eGlobalFlow;\n  };\n\n  enum class OpticalFlowGridSizeFlagBitsNV : VkOpticalFlowGridSizeFlagsNV\n  {\n    eUnknown = VK_OPTICAL_FLOW_GRID_SIZE_UNKNOWN_NV,\n    e1X1     = VK_OPTICAL_FLOW_GRID_SIZE_1X1_BIT_NV,\n    e2X2     = VK_OPTICAL_FLOW_GRID_SIZE_2X2_BIT_NV,\n    e4X4     = VK_OPTICAL_FLOW_GRID_SIZE_4X4_BIT_NV,\n    e8X8     = VK_OPTICAL_FLOW_GRID_SIZE_8X8_BIT_NV\n  };\n\n  using OpticalFlowGridSizeFlagsNV = Flags<OpticalFlowGridSizeFlagBitsNV>;\n\n  template <>\n  struct FlagTraits<OpticalFlowGridSizeFlagBitsNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                       isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR OpticalFlowGridSizeFlagsNV allFlags  = OpticalFlowGridSizeFlagBitsNV::eUnknown | OpticalFlowGridSizeFlagBitsNV::e1X1 |\n                                                                               OpticalFlowGridSizeFlagBitsNV::e2X2 | OpticalFlowGridSizeFlagBitsNV::e4X4 |\n                                                                               OpticalFlowGridSizeFlagBitsNV::e8X8;\n  };\n\n  enum class OpticalFlowPerformanceLevelNV\n  {\n    eUnknown = VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_UNKNOWN_NV,\n    eSlow    = VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_SLOW_NV,\n    eMedium  = VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_MEDIUM_NV,\n    eFast    = VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_FAST_NV\n  };\n\n  enum class OpticalFlowSessionBindingPointNV\n  {\n    eUnknown            = VK_OPTICAL_FLOW_SESSION_BINDING_POINT_UNKNOWN_NV,\n    eInput              = VK_OPTICAL_FLOW_SESSION_BINDING_POINT_INPUT_NV,\n    eReference          = VK_OPTICAL_FLOW_SESSION_BINDING_POINT_REFERENCE_NV,\n    eHint               = VK_OPTICAL_FLOW_SESSION_BINDING_POINT_HINT_NV,\n    eFlowVector         = VK_OPTICAL_FLOW_SESSION_BINDING_POINT_FLOW_VECTOR_NV,\n    eBackwardFlowVector = VK_OPTICAL_FLOW_SESSION_BINDING_POINT_BACKWARD_FLOW_VECTOR_NV,\n    eCost               = VK_OPTICAL_FLOW_SESSION_BINDING_POINT_COST_NV,\n    eBackwardCost       = VK_OPTICAL_FLOW_SESSION_BINDING_POINT_BACKWARD_COST_NV,\n    eGlobalFlow         = VK_OPTICAL_FLOW_SESSION_BINDING_POINT_GLOBAL_FLOW_NV\n  };\n\n  enum class OpticalFlowSessionCreateFlagBitsNV : VkOpticalFlowSessionCreateFlagsNV\n  {\n    eEnableHint       = VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_HINT_BIT_NV,\n    eEnableCost       = VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_COST_BIT_NV,\n    eEnableGlobalFlow = VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_GLOBAL_FLOW_BIT_NV,\n    eAllowRegions     = VK_OPTICAL_FLOW_SESSION_CREATE_ALLOW_REGIONS_BIT_NV,\n    eBothDirections   = VK_OPTICAL_FLOW_SESSION_CREATE_BOTH_DIRECTIONS_BIT_NV\n  };\n\n  using OpticalFlowSessionCreateFlagsNV = Flags<OpticalFlowSessionCreateFlagBitsNV>;\n\n  template <>\n  struct FlagTraits<OpticalFlowSessionCreateFlagBitsNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                            isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR OpticalFlowSessionCreateFlagsNV allFlags =\n      OpticalFlowSessionCreateFlagBitsNV::eEnableHint | OpticalFlowSessionCreateFlagBitsNV::eEnableCost |\n      OpticalFlowSessionCreateFlagBitsNV::eEnableGlobalFlow | OpticalFlowSessionCreateFlagBitsNV::eAllowRegions |\n      OpticalFlowSessionCreateFlagBitsNV::eBothDirections;\n  };\n\n  enum class OpticalFlowExecuteFlagBitsNV : VkOpticalFlowExecuteFlagsNV\n  {\n    eDisableTemporalHints = VK_OPTICAL_FLOW_EXECUTE_DISABLE_TEMPORAL_HINTS_BIT_NV\n  };\n\n  using OpticalFlowExecuteFlagsNV = Flags<OpticalFlowExecuteFlagBitsNV>;\n\n  template <>\n  struct FlagTraits<OpticalFlowExecuteFlagBitsNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                      isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR OpticalFlowExecuteFlagsNV allFlags  = OpticalFlowExecuteFlagBitsNV::eDisableTemporalHints;\n  };\n\n  //=== VK_AMD_anti_lag ===\n\n  enum class AntiLagModeAMD\n  {\n    eDriverControl = VK_ANTI_LAG_MODE_DRIVER_CONTROL_AMD,\n    eOn            = VK_ANTI_LAG_MODE_ON_AMD,\n    eOff           = VK_ANTI_LAG_MODE_OFF_AMD\n  };\n\n  enum class AntiLagStageAMD\n  {\n    eInput   = VK_ANTI_LAG_STAGE_INPUT_AMD,\n    ePresent = VK_ANTI_LAG_STAGE_PRESENT_AMD\n  };\n\n  //=== VK_EXT_shader_object ===\n\n  enum class ShaderCreateFlagBitsEXT : VkShaderCreateFlagsEXT\n  {\n    eLinkStage                     = VK_SHADER_CREATE_LINK_STAGE_BIT_EXT,\n    eAllowVaryingSubgroupSize      = VK_SHADER_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT,\n    eRequireFullSubgroups          = VK_SHADER_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT,\n    eNoTaskShader                  = VK_SHADER_CREATE_NO_TASK_SHADER_BIT_EXT,\n    eDispatchBase                  = VK_SHADER_CREATE_DISPATCH_BASE_BIT_EXT,\n    eFragmentShadingRateAttachment = VK_SHADER_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_EXT,\n    eFragmentDensityMapAttachment  = VK_SHADER_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT,\n    eIndirectBindable              = VK_SHADER_CREATE_INDIRECT_BINDABLE_BIT_EXT\n  };\n\n  using ShaderCreateFlagsEXT = Flags<ShaderCreateFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<ShaderCreateFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                 isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ShaderCreateFlagsEXT allFlags =\n      ShaderCreateFlagBitsEXT::eLinkStage | ShaderCreateFlagBitsEXT::eAllowVaryingSubgroupSize | ShaderCreateFlagBitsEXT::eRequireFullSubgroups |\n      ShaderCreateFlagBitsEXT::eNoTaskShader | ShaderCreateFlagBitsEXT::eDispatchBase | ShaderCreateFlagBitsEXT::eFragmentShadingRateAttachment |\n      ShaderCreateFlagBitsEXT::eFragmentDensityMapAttachment | ShaderCreateFlagBitsEXT::eIndirectBindable;\n  };\n\n  enum class ShaderCodeTypeEXT\n  {\n    eBinary = VK_SHADER_CODE_TYPE_BINARY_EXT,\n    eSpirv  = VK_SHADER_CODE_TYPE_SPIRV_EXT\n  };\n\n  //=== VK_NV_ray_tracing_invocation_reorder ===\n\n  enum class RayTracingInvocationReorderModeNV\n  {\n    eNone    = VK_RAY_TRACING_INVOCATION_REORDER_MODE_NONE_NV,\n    eReorder = VK_RAY_TRACING_INVOCATION_REORDER_MODE_REORDER_NV\n  };\n\n  //=== VK_NV_cooperative_vector ===\n\n  enum class CooperativeVectorMatrixLayoutNV\n  {\n    eRowMajor           = VK_COOPERATIVE_VECTOR_MATRIX_LAYOUT_ROW_MAJOR_NV,\n    eColumnMajor        = VK_COOPERATIVE_VECTOR_MATRIX_LAYOUT_COLUMN_MAJOR_NV,\n    eInferencingOptimal = VK_COOPERATIVE_VECTOR_MATRIX_LAYOUT_INFERENCING_OPTIMAL_NV,\n    eTrainingOptimal    = VK_COOPERATIVE_VECTOR_MATRIX_LAYOUT_TRAINING_OPTIMAL_NV\n  };\n\n  enum class ComponentTypeKHR\n  {\n    eFloat16       = VK_COMPONENT_TYPE_FLOAT16_KHR,\n    eFloat32       = VK_COMPONENT_TYPE_FLOAT32_KHR,\n    eFloat64       = VK_COMPONENT_TYPE_FLOAT64_KHR,\n    eSint8         = VK_COMPONENT_TYPE_SINT8_KHR,\n    eSint16        = VK_COMPONENT_TYPE_SINT16_KHR,\n    eSint32        = VK_COMPONENT_TYPE_SINT32_KHR,\n    eSint64        = VK_COMPONENT_TYPE_SINT64_KHR,\n    eUint8         = VK_COMPONENT_TYPE_UINT8_KHR,\n    eUint16        = VK_COMPONENT_TYPE_UINT16_KHR,\n    eUint32        = VK_COMPONENT_TYPE_UINT32_KHR,\n    eUint64        = VK_COMPONENT_TYPE_UINT64_KHR,\n    eSint8PackedNV = VK_COMPONENT_TYPE_SINT8_PACKED_NV,\n    eUint8PackedNV = VK_COMPONENT_TYPE_UINT8_PACKED_NV,\n    eFloatE4M3NV   = VK_COMPONENT_TYPE_FLOAT_E4M3_NV,\n    eFloatE5M2NV   = VK_COMPONENT_TYPE_FLOAT_E5M2_NV\n  };\n  using ComponentTypeNV = ComponentTypeKHR;\n\n  //=== VK_EXT_layer_settings ===\n\n  enum class LayerSettingTypeEXT\n  {\n    eBool32  = VK_LAYER_SETTING_TYPE_BOOL32_EXT,\n    eInt32   = VK_LAYER_SETTING_TYPE_INT32_EXT,\n    eInt64   = VK_LAYER_SETTING_TYPE_INT64_EXT,\n    eUint32  = VK_LAYER_SETTING_TYPE_UINT32_EXT,\n    eUint64  = VK_LAYER_SETTING_TYPE_UINT64_EXT,\n    eFloat32 = VK_LAYER_SETTING_TYPE_FLOAT32_EXT,\n    eFloat64 = VK_LAYER_SETTING_TYPE_FLOAT64_EXT,\n    eString  = VK_LAYER_SETTING_TYPE_STRING_EXT\n  };\n\n  //=================================\n  //=== Layer Setting Type Traits ===\n  //=================================\n\n  template <>\n  struct CppType<LayerSettingTypeEXT, LayerSettingTypeEXT::eBool32>\n  {\n    using Type = vk::Bool32;\n  };\n\n  template <>\n  struct CppType<LayerSettingTypeEXT, LayerSettingTypeEXT::eInt32>\n  {\n    using Type = int32_t;\n  };\n\n  template <>\n  struct CppType<LayerSettingTypeEXT, LayerSettingTypeEXT::eInt64>\n  {\n    using Type = int64_t;\n  };\n\n  template <>\n  struct CppType<LayerSettingTypeEXT, LayerSettingTypeEXT::eUint32>\n  {\n    using Type = uint32_t;\n  };\n\n  template <>\n  struct CppType<LayerSettingTypeEXT, LayerSettingTypeEXT::eUint64>\n  {\n    using Type = uint64_t;\n  };\n\n  template <>\n  struct CppType<LayerSettingTypeEXT, LayerSettingTypeEXT::eFloat32>\n  {\n    using Type = float;\n  };\n\n  template <>\n  struct CppType<LayerSettingTypeEXT, LayerSettingTypeEXT::eFloat64>\n  {\n    using Type = double;\n  };\n\n  template <>\n  struct CppType<LayerSettingTypeEXT, LayerSettingTypeEXT::eString>\n  {\n    using Type = char *;\n  };\n\n  template <typename T>\n  bool isSameType( LayerSettingTypeEXT layerSettingType )\n  {\n    switch ( layerSettingType )\n    {\n      case LayerSettingTypeEXT::eBool32: return std::is_same<T, VULKAN_HPP_NAMESPACE::Bool32>::value;\n      case LayerSettingTypeEXT::eInt32: return std::is_same<T, int32_t>::value;\n      case LayerSettingTypeEXT::eInt64: return std::is_same<T, int64_t>::value;\n      case LayerSettingTypeEXT::eUint32: return std::is_same<T, uint32_t>::value;\n      case LayerSettingTypeEXT::eUint64: return std::is_same<T, uint64_t>::value;\n      case LayerSettingTypeEXT::eFloat32: return std::is_same<T, float>::value;\n      case LayerSettingTypeEXT::eFloat64: return std::is_same<T, double>::value;\n      case LayerSettingTypeEXT::eString: return std::is_same<T, char *>::value;\n      default: return false;\n    }\n  }\n\n  //=== VK_NV_low_latency2 ===\n\n  enum class LatencyMarkerNV\n  {\n    eSimulationStart            = VK_LATENCY_MARKER_SIMULATION_START_NV,\n    eSimulationEnd              = VK_LATENCY_MARKER_SIMULATION_END_NV,\n    eRendersubmitStart          = VK_LATENCY_MARKER_RENDERSUBMIT_START_NV,\n    eRendersubmitEnd            = VK_LATENCY_MARKER_RENDERSUBMIT_END_NV,\n    ePresentStart               = VK_LATENCY_MARKER_PRESENT_START_NV,\n    ePresentEnd                 = VK_LATENCY_MARKER_PRESENT_END_NV,\n    eInputSample                = VK_LATENCY_MARKER_INPUT_SAMPLE_NV,\n    eTriggerFlash               = VK_LATENCY_MARKER_TRIGGER_FLASH_NV,\n    eOutOfBandRendersubmitStart = VK_LATENCY_MARKER_OUT_OF_BAND_RENDERSUBMIT_START_NV,\n    eOutOfBandRendersubmitEnd   = VK_LATENCY_MARKER_OUT_OF_BAND_RENDERSUBMIT_END_NV,\n    eOutOfBandPresentStart      = VK_LATENCY_MARKER_OUT_OF_BAND_PRESENT_START_NV,\n    eOutOfBandPresentEnd        = VK_LATENCY_MARKER_OUT_OF_BAND_PRESENT_END_NV\n  };\n\n  enum class OutOfBandQueueTypeNV\n  {\n    eRender  = VK_OUT_OF_BAND_QUEUE_TYPE_RENDER_NV,\n    ePresent = VK_OUT_OF_BAND_QUEUE_TYPE_PRESENT_NV\n  };\n\n  //=== VK_KHR_cooperative_matrix ===\n\n  enum class ScopeKHR\n  {\n    eDevice      = VK_SCOPE_DEVICE_KHR,\n    eWorkgroup   = VK_SCOPE_WORKGROUP_KHR,\n    eSubgroup    = VK_SCOPE_SUBGROUP_KHR,\n    eQueueFamily = VK_SCOPE_QUEUE_FAMILY_KHR\n  };\n  using ScopeNV = ScopeKHR;\n\n  //=== VK_KHR_video_encode_av1 ===\n\n  enum class VideoEncodeAV1PredictionModeKHR\n  {\n    eIntraOnly              = VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_INTRA_ONLY_KHR,\n    eSingleReference        = VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_SINGLE_REFERENCE_KHR,\n    eUnidirectionalCompound = VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_UNIDIRECTIONAL_COMPOUND_KHR,\n    eBidirectionalCompound  = VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_BIDIRECTIONAL_COMPOUND_KHR\n  };\n\n  enum class VideoEncodeAV1RateControlGroupKHR\n  {\n    eIntra        = VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_INTRA_KHR,\n    ePredictive   = VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_PREDICTIVE_KHR,\n    eBipredictive = VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_BIPREDICTIVE_KHR\n  };\n\n  enum class VideoEncodeAV1CapabilityFlagBitsKHR : VkVideoEncodeAV1CapabilityFlagsKHR\n  {\n    ePerRateControlGroupMinMaxQIndex = VK_VIDEO_ENCODE_AV1_CAPABILITY_PER_RATE_CONTROL_GROUP_MIN_MAX_Q_INDEX_BIT_KHR,\n    eGenerateObuExtensionHeader      = VK_VIDEO_ENCODE_AV1_CAPABILITY_GENERATE_OBU_EXTENSION_HEADER_BIT_KHR,\n    ePrimaryReferenceCdfOnly         = VK_VIDEO_ENCODE_AV1_CAPABILITY_PRIMARY_REFERENCE_CDF_ONLY_BIT_KHR,\n    eFrameSizeOverride               = VK_VIDEO_ENCODE_AV1_CAPABILITY_FRAME_SIZE_OVERRIDE_BIT_KHR,\n    eMotionVectorScaling             = VK_VIDEO_ENCODE_AV1_CAPABILITY_MOTION_VECTOR_SCALING_BIT_KHR\n  };\n\n  using VideoEncodeAV1CapabilityFlagsKHR = Flags<VideoEncodeAV1CapabilityFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoEncodeAV1CapabilityFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                             isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoEncodeAV1CapabilityFlagsKHR allFlags =\n      VideoEncodeAV1CapabilityFlagBitsKHR::ePerRateControlGroupMinMaxQIndex | VideoEncodeAV1CapabilityFlagBitsKHR::eGenerateObuExtensionHeader |\n      VideoEncodeAV1CapabilityFlagBitsKHR::ePrimaryReferenceCdfOnly | VideoEncodeAV1CapabilityFlagBitsKHR::eFrameSizeOverride |\n      VideoEncodeAV1CapabilityFlagBitsKHR::eMotionVectorScaling;\n  };\n\n  enum class VideoEncodeAV1StdFlagBitsKHR : VkVideoEncodeAV1StdFlagsKHR\n  {\n    eUniformTileSpacingFlagSet = VK_VIDEO_ENCODE_AV1_STD_UNIFORM_TILE_SPACING_FLAG_SET_BIT_KHR,\n    eSkipModePresentUnset      = VK_VIDEO_ENCODE_AV1_STD_SKIP_MODE_PRESENT_UNSET_BIT_KHR,\n    ePrimaryRefFrame           = VK_VIDEO_ENCODE_AV1_STD_PRIMARY_REF_FRAME_BIT_KHR,\n    eDeltaQ                    = VK_VIDEO_ENCODE_AV1_STD_DELTA_Q_BIT_KHR\n  };\n\n  using VideoEncodeAV1StdFlagsKHR = Flags<VideoEncodeAV1StdFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoEncodeAV1StdFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                      isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoEncodeAV1StdFlagsKHR allFlags =\n      VideoEncodeAV1StdFlagBitsKHR::eUniformTileSpacingFlagSet | VideoEncodeAV1StdFlagBitsKHR::eSkipModePresentUnset |\n      VideoEncodeAV1StdFlagBitsKHR::ePrimaryRefFrame | VideoEncodeAV1StdFlagBitsKHR::eDeltaQ;\n  };\n\n  enum class VideoEncodeAV1SuperblockSizeFlagBitsKHR : VkVideoEncodeAV1SuperblockSizeFlagsKHR\n  {\n    e64  = VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_64_BIT_KHR,\n    e128 = VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_128_BIT_KHR\n  };\n\n  using VideoEncodeAV1SuperblockSizeFlagsKHR = Flags<VideoEncodeAV1SuperblockSizeFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoEncodeAV1SuperblockSizeFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                 isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoEncodeAV1SuperblockSizeFlagsKHR allFlags =\n      VideoEncodeAV1SuperblockSizeFlagBitsKHR::e64 | VideoEncodeAV1SuperblockSizeFlagBitsKHR::e128;\n  };\n\n  enum class VideoEncodeAV1RateControlFlagBitsKHR : VkVideoEncodeAV1RateControlFlagsKHR\n  {\n    eRegularGop                 = VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REGULAR_GOP_BIT_KHR,\n    eTemporalLayerPatternDyadic = VK_VIDEO_ENCODE_AV1_RATE_CONTROL_TEMPORAL_LAYER_PATTERN_DYADIC_BIT_KHR,\n    eReferencePatternFlat       = VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REFERENCE_PATTERN_FLAT_BIT_KHR,\n    eReferencePatternDyadic     = VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REFERENCE_PATTERN_DYADIC_BIT_KHR\n  };\n\n  using VideoEncodeAV1RateControlFlagsKHR = Flags<VideoEncodeAV1RateControlFlagBitsKHR>;\n\n  template <>\n  struct FlagTraits<VideoEncodeAV1RateControlFlagBitsKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                              isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VideoEncodeAV1RateControlFlagsKHR allFlags =\n      VideoEncodeAV1RateControlFlagBitsKHR::eRegularGop | VideoEncodeAV1RateControlFlagBitsKHR::eTemporalLayerPatternDyadic |\n      VideoEncodeAV1RateControlFlagBitsKHR::eReferencePatternFlat | VideoEncodeAV1RateControlFlagBitsKHR::eReferencePatternDyadic;\n  };\n\n  //=== VK_QCOM_image_processing2 ===\n\n  enum class BlockMatchWindowCompareModeQCOM\n  {\n    eMin = VK_BLOCK_MATCH_WINDOW_COMPARE_MODE_MIN_QCOM,\n    eMax = VK_BLOCK_MATCH_WINDOW_COMPARE_MODE_MAX_QCOM\n  };\n\n  //=== VK_QCOM_filter_cubic_weights ===\n\n  enum class CubicFilterWeightsQCOM\n  {\n    eCatmullRom          = VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM,\n    eZeroTangentCardinal = VK_CUBIC_FILTER_WEIGHTS_ZERO_TANGENT_CARDINAL_QCOM,\n    eBSpline             = VK_CUBIC_FILTER_WEIGHTS_B_SPLINE_QCOM,\n    eMitchellNetravali   = VK_CUBIC_FILTER_WEIGHTS_MITCHELL_NETRAVALI_QCOM\n  };\n\n  //=== VK_MSFT_layered_driver ===\n\n  enum class LayeredDriverUnderlyingApiMSFT\n  {\n    eNone  = VK_LAYERED_DRIVER_UNDERLYING_API_NONE_MSFT,\n    eD3D12 = VK_LAYERED_DRIVER_UNDERLYING_API_D3D12_MSFT\n  };\n\n  //=== VK_KHR_calibrated_timestamps ===\n\n  enum class TimeDomainKHR\n  {\n    eDevice                  = VK_TIME_DOMAIN_DEVICE_KHR,\n    eClockMonotonic          = VK_TIME_DOMAIN_CLOCK_MONOTONIC_KHR,\n    eClockMonotonicRaw       = VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_KHR,\n    eQueryPerformanceCounter = VK_TIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_KHR\n  };\n  using TimeDomainEXT = TimeDomainKHR;\n\n  //=== VK_NV_display_stereo ===\n\n  enum class DisplaySurfaceStereoTypeNV\n  {\n    eNone              = VK_DISPLAY_SURFACE_STEREO_TYPE_NONE_NV,\n    eOnboardDin        = VK_DISPLAY_SURFACE_STEREO_TYPE_ONBOARD_DIN_NV,\n    eHdmi3D            = VK_DISPLAY_SURFACE_STEREO_TYPE_HDMI_3D_NV,\n    eInbandDisplayport = VK_DISPLAY_SURFACE_STEREO_TYPE_INBAND_DISPLAYPORT_NV\n  };\n\n  //=== VK_KHR_maintenance7 ===\n\n  enum class PhysicalDeviceLayeredApiKHR\n  {\n    eVulkan   = VK_PHYSICAL_DEVICE_LAYERED_API_VULKAN_KHR,\n    eD3D12    = VK_PHYSICAL_DEVICE_LAYERED_API_D3D12_KHR,\n    eMetal    = VK_PHYSICAL_DEVICE_LAYERED_API_METAL_KHR,\n    eOpengl   = VK_PHYSICAL_DEVICE_LAYERED_API_OPENGL_KHR,\n    eOpengles = VK_PHYSICAL_DEVICE_LAYERED_API_OPENGLES_KHR\n  };\n\n  //=== VK_NV_cluster_acceleration_structure ===\n\n  enum class ClusterAccelerationStructureClusterFlagBitsNV : VkClusterAccelerationStructureClusterFlagsNV\n  {\n    eAllowDisableOpacityMicromaps = VK_CLUSTER_ACCELERATION_STRUCTURE_CLUSTER_ALLOW_DISABLE_OPACITY_MICROMAPS_NV\n  };\n\n  using ClusterAccelerationStructureClusterFlagsNV = Flags<ClusterAccelerationStructureClusterFlagBitsNV>;\n\n  template <>\n  struct FlagTraits<ClusterAccelerationStructureClusterFlagBitsNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                       isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ClusterAccelerationStructureClusterFlagsNV allFlags =\n      ClusterAccelerationStructureClusterFlagBitsNV::eAllowDisableOpacityMicromaps;\n  };\n\n  enum class ClusterAccelerationStructureGeometryFlagBitsNV : VkClusterAccelerationStructureGeometryFlagsNV\n  {\n    eCullDisable                 = VK_CLUSTER_ACCELERATION_STRUCTURE_GEOMETRY_CULL_DISABLE_BIT_NV,\n    eNoDuplicateAnyhitInvocation = VK_CLUSTER_ACCELERATION_STRUCTURE_GEOMETRY_NO_DUPLICATE_ANYHIT_INVOCATION_BIT_NV,\n    eOpaque                      = VK_CLUSTER_ACCELERATION_STRUCTURE_GEOMETRY_OPAQUE_BIT_NV\n  };\n\n  using ClusterAccelerationStructureGeometryFlagsNV = Flags<ClusterAccelerationStructureGeometryFlagBitsNV>;\n\n  template <>\n  struct FlagTraits<ClusterAccelerationStructureGeometryFlagBitsNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                        isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ClusterAccelerationStructureGeometryFlagsNV allFlags =\n      ClusterAccelerationStructureGeometryFlagBitsNV::eCullDisable | ClusterAccelerationStructureGeometryFlagBitsNV::eNoDuplicateAnyhitInvocation |\n      ClusterAccelerationStructureGeometryFlagBitsNV::eOpaque;\n  };\n\n  enum class ClusterAccelerationStructureAddressResolutionFlagBitsNV : VkClusterAccelerationStructureAddressResolutionFlagsNV\n  {\n    eIndirectedDstImplicitData = VK_CLUSTER_ACCELERATION_STRUCTURE_ADDRESS_RESOLUTION_INDIRECTED_DST_IMPLICIT_DATA_BIT_NV,\n    eIndirectedScratchData     = VK_CLUSTER_ACCELERATION_STRUCTURE_ADDRESS_RESOLUTION_INDIRECTED_SCRATCH_DATA_BIT_NV,\n    eIndirectedDstAddressArray = VK_CLUSTER_ACCELERATION_STRUCTURE_ADDRESS_RESOLUTION_INDIRECTED_DST_ADDRESS_ARRAY_BIT_NV,\n    eIndirectedDstSizesArray   = VK_CLUSTER_ACCELERATION_STRUCTURE_ADDRESS_RESOLUTION_INDIRECTED_DST_SIZES_ARRAY_BIT_NV,\n    eIndirectedSrcInfosArray   = VK_CLUSTER_ACCELERATION_STRUCTURE_ADDRESS_RESOLUTION_INDIRECTED_SRC_INFOS_ARRAY_BIT_NV,\n    eIndirectedSrcInfosCount   = VK_CLUSTER_ACCELERATION_STRUCTURE_ADDRESS_RESOLUTION_INDIRECTED_SRC_INFOS_COUNT_BIT_NV\n  };\n\n  using ClusterAccelerationStructureAddressResolutionFlagsNV = Flags<ClusterAccelerationStructureAddressResolutionFlagBitsNV>;\n\n  template <>\n  struct FlagTraits<ClusterAccelerationStructureAddressResolutionFlagBitsNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                                 isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ClusterAccelerationStructureAddressResolutionFlagsNV allFlags =\n      ClusterAccelerationStructureAddressResolutionFlagBitsNV::eIndirectedDstImplicitData |\n      ClusterAccelerationStructureAddressResolutionFlagBitsNV::eIndirectedScratchData |\n      ClusterAccelerationStructureAddressResolutionFlagBitsNV::eIndirectedDstAddressArray |\n      ClusterAccelerationStructureAddressResolutionFlagBitsNV::eIndirectedDstSizesArray |\n      ClusterAccelerationStructureAddressResolutionFlagBitsNV::eIndirectedSrcInfosArray |\n      ClusterAccelerationStructureAddressResolutionFlagBitsNV::eIndirectedSrcInfosCount;\n  };\n\n  enum class ClusterAccelerationStructureIndexFormatFlagBitsNV : VkClusterAccelerationStructureIndexFormatFlagsNV\n  {\n    e8  = VK_CLUSTER_ACCELERATION_STRUCTURE_INDEX_FORMAT_8BIT_NV,\n    e16 = VK_CLUSTER_ACCELERATION_STRUCTURE_INDEX_FORMAT_16BIT_NV,\n    e32 = VK_CLUSTER_ACCELERATION_STRUCTURE_INDEX_FORMAT_32BIT_NV\n  };\n\n  using ClusterAccelerationStructureIndexFormatFlagsNV = Flags<ClusterAccelerationStructureIndexFormatFlagBitsNV>;\n\n  template <>\n  struct FlagTraits<ClusterAccelerationStructureIndexFormatFlagBitsNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                           isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR ClusterAccelerationStructureIndexFormatFlagsNV allFlags  = ClusterAccelerationStructureIndexFormatFlagBitsNV::e8 |\n                                                                                                   ClusterAccelerationStructureIndexFormatFlagBitsNV::e16 |\n                                                                                                   ClusterAccelerationStructureIndexFormatFlagBitsNV::e32;\n  };\n\n  enum class ClusterAccelerationStructureTypeNV\n  {\n    eClustersBottomLevel     = VK_CLUSTER_ACCELERATION_STRUCTURE_TYPE_CLUSTERS_BOTTOM_LEVEL_NV,\n    eTriangleCluster         = VK_CLUSTER_ACCELERATION_STRUCTURE_TYPE_TRIANGLE_CLUSTER_NV,\n    eTriangleClusterTemplate = VK_CLUSTER_ACCELERATION_STRUCTURE_TYPE_TRIANGLE_CLUSTER_TEMPLATE_NV\n  };\n\n  enum class ClusterAccelerationStructureOpTypeNV\n  {\n    eMoveObjects                  = VK_CLUSTER_ACCELERATION_STRUCTURE_OP_TYPE_MOVE_OBJECTS_NV,\n    eBuildClustersBottomLevel     = VK_CLUSTER_ACCELERATION_STRUCTURE_OP_TYPE_BUILD_CLUSTERS_BOTTOM_LEVEL_NV,\n    eBuildTriangleCluster         = VK_CLUSTER_ACCELERATION_STRUCTURE_OP_TYPE_BUILD_TRIANGLE_CLUSTER_NV,\n    eBuildTriangleClusterTemplate = VK_CLUSTER_ACCELERATION_STRUCTURE_OP_TYPE_BUILD_TRIANGLE_CLUSTER_TEMPLATE_NV,\n    eInstantiateTriangleCluster   = VK_CLUSTER_ACCELERATION_STRUCTURE_OP_TYPE_INSTANTIATE_TRIANGLE_CLUSTER_NV\n  };\n\n  enum class ClusterAccelerationStructureOpModeNV\n  {\n    eImplicitDestinations = VK_CLUSTER_ACCELERATION_STRUCTURE_OP_MODE_IMPLICIT_DESTINATIONS_NV,\n    eExplicitDestinations = VK_CLUSTER_ACCELERATION_STRUCTURE_OP_MODE_EXPLICIT_DESTINATIONS_NV,\n    eComputeSizes         = VK_CLUSTER_ACCELERATION_STRUCTURE_OP_MODE_COMPUTE_SIZES_NV\n  };\n\n  //=== VK_NV_partitioned_acceleration_structure ===\n\n  enum class PartitionedAccelerationStructureOpTypeNV\n  {\n    eWriteInstance             = VK_PARTITIONED_ACCELERATION_STRUCTURE_OP_TYPE_WRITE_INSTANCE_NV,\n    eUpdateInstance            = VK_PARTITIONED_ACCELERATION_STRUCTURE_OP_TYPE_UPDATE_INSTANCE_NV,\n    eWritePartitionTranslation = VK_PARTITIONED_ACCELERATION_STRUCTURE_OP_TYPE_WRITE_PARTITION_TRANSLATION_NV\n  };\n\n  enum class PartitionedAccelerationStructureInstanceFlagBitsNV : VkPartitionedAccelerationStructureInstanceFlagsNV\n  {\n    eFlagTriangleFacingCullDisable = VK_PARTITIONED_ACCELERATION_STRUCTURE_INSTANCE_FLAG_TRIANGLE_FACING_CULL_DISABLE_BIT_NV,\n    eFlagTriangleFlipFacing        = VK_PARTITIONED_ACCELERATION_STRUCTURE_INSTANCE_FLAG_TRIANGLE_FLIP_FACING_BIT_NV,\n    eFlagForceOpaque               = VK_PARTITIONED_ACCELERATION_STRUCTURE_INSTANCE_FLAG_FORCE_OPAQUE_BIT_NV,\n    eFlagForceNoOpaque             = VK_PARTITIONED_ACCELERATION_STRUCTURE_INSTANCE_FLAG_FORCE_NO_OPAQUE_BIT_NV,\n    eFlagEnableExplicitBoundingBox = VK_PARTITIONED_ACCELERATION_STRUCTURE_INSTANCE_FLAG_ENABLE_EXPLICIT_BOUNDING_BOX_NV\n  };\n\n  using PartitionedAccelerationStructureInstanceFlagsNV = Flags<PartitionedAccelerationStructureInstanceFlagBitsNV>;\n\n  template <>\n  struct FlagTraits<PartitionedAccelerationStructureInstanceFlagBitsNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                            isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR PartitionedAccelerationStructureInstanceFlagsNV allFlags =\n      PartitionedAccelerationStructureInstanceFlagBitsNV::eFlagTriangleFacingCullDisable |\n      PartitionedAccelerationStructureInstanceFlagBitsNV::eFlagTriangleFlipFacing | PartitionedAccelerationStructureInstanceFlagBitsNV::eFlagForceOpaque |\n      PartitionedAccelerationStructureInstanceFlagBitsNV::eFlagForceNoOpaque |\n      PartitionedAccelerationStructureInstanceFlagBitsNV::eFlagEnableExplicitBoundingBox;\n  };\n\n  //=== VK_EXT_device_generated_commands ===\n\n  enum class IndirectCommandsTokenTypeEXT\n  {\n    eExecutionSet         = VK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXT,\n    ePushConstant         = VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_EXT,\n    eSequenceIndex        = VK_INDIRECT_COMMANDS_TOKEN_TYPE_SEQUENCE_INDEX_EXT,\n    eIndexBuffer          = VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_EXT,\n    eVertexBuffer         = VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_EXT,\n    eDrawIndexed          = VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_EXT,\n    eDraw                 = VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_EXT,\n    eDrawIndexedCount     = VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_COUNT_EXT,\n    eDrawCount            = VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_COUNT_EXT,\n    eDispatch             = VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_EXT,\n    eDrawMeshTasksNV      = VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NV_EXT,\n    eDrawMeshTasksCountNV = VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_COUNT_NV_EXT,\n    eDrawMeshTasks        = VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_EXT,\n    eDrawMeshTasksCount   = VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_COUNT_EXT,\n    eTraceRays2           = VK_INDIRECT_COMMANDS_TOKEN_TYPE_TRACE_RAYS2_EXT\n  };\n\n  enum class IndirectExecutionSetInfoTypeEXT\n  {\n    ePipelines     = VK_INDIRECT_EXECUTION_SET_INFO_TYPE_PIPELINES_EXT,\n    eShaderObjects = VK_INDIRECT_EXECUTION_SET_INFO_TYPE_SHADER_OBJECTS_EXT\n  };\n\n  enum class IndirectCommandsLayoutUsageFlagBitsEXT : VkIndirectCommandsLayoutUsageFlagsEXT\n  {\n    eExplicitPreprocess = VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_EXT,\n    eUnorderedSequences = VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_EXT\n  };\n\n  using IndirectCommandsLayoutUsageFlagsEXT = Flags<IndirectCommandsLayoutUsageFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<IndirectCommandsLayoutUsageFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                                isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR IndirectCommandsLayoutUsageFlagsEXT allFlags =\n      IndirectCommandsLayoutUsageFlagBitsEXT::eExplicitPreprocess | IndirectCommandsLayoutUsageFlagBitsEXT::eUnorderedSequences;\n  };\n\n  enum class IndirectCommandsInputModeFlagBitsEXT : VkIndirectCommandsInputModeFlagsEXT\n  {\n    eVulkanIndexBuffer = VK_INDIRECT_COMMANDS_INPUT_MODE_VULKAN_INDEX_BUFFER_EXT,\n    eDxgiIndexBuffer   = VK_INDIRECT_COMMANDS_INPUT_MODE_DXGI_INDEX_BUFFER_EXT\n  };\n\n  using IndirectCommandsInputModeFlagsEXT = Flags<IndirectCommandsInputModeFlagBitsEXT>;\n\n  template <>\n  struct FlagTraits<IndirectCommandsInputModeFlagBitsEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool                              isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR IndirectCommandsInputModeFlagsEXT allFlags =\n      IndirectCommandsInputModeFlagBitsEXT::eVulkanIndexBuffer | IndirectCommandsInputModeFlagBitsEXT::eDxgiIndexBuffer;\n  };\n\n  //=== VK_KHR_maintenance8 ===\n\n  enum class AccessFlagBits3KHR : VkAccessFlags3KHR\n  {\n    eNone = VK_ACCESS_3_NONE_KHR\n  };\n\n  using AccessFlags3KHR = Flags<AccessFlagBits3KHR>;\n\n  template <>\n  struct FlagTraits<AccessFlagBits3KHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool            isBitmask = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR AccessFlags3KHR allFlags  = AccessFlagBits3KHR::eNone;\n  };\n\n  //=== VK_EXT_depth_clamp_control ===\n\n  enum class DepthClampModeEXT\n  {\n    eViewportRange    = VK_DEPTH_CLAMP_MODE_VIEWPORT_RANGE_EXT,\n    eUserDefinedRange = VK_DEPTH_CLAMP_MODE_USER_DEFINED_RANGE_EXT\n  };\n\n  //===========================================================\n  //=== Mapping from ObjectType to DebugReportObjectTypeEXT ===\n  //===========================================================\n\n  VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType( VULKAN_HPP_NAMESPACE::ObjectType objectType )\n  {\n    switch ( objectType )\n    {\n        //=== VK_VERSION_1_0 ===\n      case VULKAN_HPP_NAMESPACE::ObjectType::eInstance: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eInstance;\n      case VULKAN_HPP_NAMESPACE::ObjectType::ePhysicalDevice: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePhysicalDevice;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eDevice: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDevice;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eQueue: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eQueue;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eDeviceMemory: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDeviceMemory;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eFence: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eFence;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eSemaphore: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSemaphore;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eEvent: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eEvent;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eQueryPool: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eQueryPool;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eBuffer: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eBuffer;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eBufferView: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eBufferView;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eImage: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eImage;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eImageView: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eImageView;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eShaderModule: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eShaderModule;\n      case VULKAN_HPP_NAMESPACE::ObjectType::ePipelineCache: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePipelineCache;\n      case VULKAN_HPP_NAMESPACE::ObjectType::ePipeline: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePipeline;\n      case VULKAN_HPP_NAMESPACE::ObjectType::ePipelineLayout: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePipelineLayout;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eSampler: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSampler;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eDescriptorPool: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDescriptorPool;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eDescriptorSet: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDescriptorSet;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eDescriptorSetLayout: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDescriptorSetLayout;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eFramebuffer: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eFramebuffer;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eRenderPass: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eRenderPass;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eCommandPool: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCommandPool;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eCommandBuffer:\n        return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCommandBuffer;\n\n        //=== VK_VERSION_1_1 ===\n      case VULKAN_HPP_NAMESPACE::ObjectType::eSamplerYcbcrConversion: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSamplerYcbcrConversion;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eDescriptorUpdateTemplate:\n        return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDescriptorUpdateTemplate;\n\n        //=== VK_VERSION_1_3 ===\n      case VULKAN_HPP_NAMESPACE::ObjectType::ePrivateDataSlot:\n        return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n        //=== VK_KHR_surface ===\n      case VULKAN_HPP_NAMESPACE::ObjectType::eSurfaceKHR:\n        return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSurfaceKHR;\n\n        //=== VK_KHR_swapchain ===\n      case VULKAN_HPP_NAMESPACE::ObjectType::eSwapchainKHR:\n        return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSwapchainKHR;\n\n        //=== VK_KHR_display ===\n      case VULKAN_HPP_NAMESPACE::ObjectType::eDisplayKHR: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDisplayKHR;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eDisplayModeKHR:\n        return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDisplayModeKHR;\n\n        //=== VK_EXT_debug_report ===\n      case VULKAN_HPP_NAMESPACE::ObjectType::eDebugReportCallbackEXT:\n        return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDebugReportCallbackEXT;\n\n        //=== VK_KHR_video_queue ===\n      case VULKAN_HPP_NAMESPACE::ObjectType::eVideoSessionKHR: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eVideoSessionParametersKHR:\n        return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n        //=== VK_NVX_binary_import ===\n      case VULKAN_HPP_NAMESPACE::ObjectType::eCuModuleNVX: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCuModuleNVX;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eCuFunctionNVX:\n        return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCuFunctionNVX;\n\n        //=== VK_EXT_debug_utils ===\n      case VULKAN_HPP_NAMESPACE::ObjectType::eDebugUtilsMessengerEXT:\n        return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n        //=== VK_KHR_acceleration_structure ===\n      case VULKAN_HPP_NAMESPACE::ObjectType::eAccelerationStructureKHR:\n        return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eAccelerationStructureKHR;\n\n        //=== VK_EXT_validation_cache ===\n      case VULKAN_HPP_NAMESPACE::ObjectType::eValidationCacheEXT:\n        return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eValidationCacheEXT;\n\n        //=== VK_NV_ray_tracing ===\n      case VULKAN_HPP_NAMESPACE::ObjectType::eAccelerationStructureNV:\n        return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eAccelerationStructureNV;\n\n        //=== VK_INTEL_performance_query ===\n      case VULKAN_HPP_NAMESPACE::ObjectType::ePerformanceConfigurationINTEL:\n        return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n        //=== VK_KHR_deferred_host_operations ===\n      case VULKAN_HPP_NAMESPACE::ObjectType::eDeferredOperationKHR:\n        return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n        //=== VK_NV_device_generated_commands ===\n      case VULKAN_HPP_NAMESPACE::ObjectType::eIndirectCommandsLayoutNV: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n        //=== VK_NV_cuda_kernel_launch ===\n      case VULKAN_HPP_NAMESPACE::ObjectType::eCudaModuleNV: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCudaModuleNV;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eCudaFunctionNV: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCudaFunctionNV;\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n        //=== VK_FUCHSIA_buffer_collection ===\n      case VULKAN_HPP_NAMESPACE::ObjectType::eBufferCollectionFUCHSIA: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eBufferCollectionFUCHSIA;\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n        //=== VK_EXT_opacity_micromap ===\n      case VULKAN_HPP_NAMESPACE::ObjectType::eMicromapEXT:\n        return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n        //=== VK_NV_optical_flow ===\n      case VULKAN_HPP_NAMESPACE::ObjectType::eOpticalFlowSessionNV:\n        return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n        //=== VK_EXT_shader_object ===\n      case VULKAN_HPP_NAMESPACE::ObjectType::eShaderEXT:\n        return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n        //=== VK_KHR_pipeline_binary ===\n      case VULKAN_HPP_NAMESPACE::ObjectType::ePipelineBinaryKHR:\n        return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n        //=== VK_EXT_device_generated_commands ===\n      case VULKAN_HPP_NAMESPACE::ObjectType::eIndirectCommandsLayoutEXT: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n      case VULKAN_HPP_NAMESPACE::ObjectType::eIndirectExecutionSetEXT: return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n      default: VULKAN_HPP_ASSERT( false && \"unknown ObjectType\" ); return VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n    }\n  }\n\n}  // namespace VULKAN_HPP_NAMESPACE\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_extension_inspection.hpp",
    "content": "// Copyright 2015-2025 The Khronos Group Inc.\n//\n// SPDX-License-Identifier: Apache-2.0 OR MIT\n//\n\n// This header is generated from the Khronos Vulkan XML API Registry.\n\n#ifndef VULKAN_EXTENSION_INSPECTION_HPP\n#define VULKAN_EXTENSION_INSPECTION_HPP\n\n#if defined( VULKAN_HPP_ENABLE_STD_MODULE ) && defined( VULKAN_HPP_STD_MODULE )\nimport VULKAN_HPP_STD_MODULE;\n#else\n#  include <map>\n#  include <set>\n#  include <string>\n#  include <vector>\n#  include <vulkan/vulkan.hpp>\n#endif\n\nnamespace VULKAN_HPP_NAMESPACE\n{\n  //======================================\n  //=== Extension inspection functions ===\n  //======================================\n\n  std::set<std::string> const &                                        getDeviceExtensions();\n  std::set<std::string> const &                                        getInstanceExtensions();\n  std::map<std::string, std::string> const &                           getDeprecatedExtensions();\n  std::map<std::string, std::vector<std::vector<std::string>>> const & getExtensionDepends( std::string const & extension );\n  std::pair<bool, std::vector<std::vector<std::string>> const &>       getExtensionDepends( std::string const & version, std::string const & extension );\n  std::map<std::string, std::string> const &                           getObsoletedExtensions();\n  std::map<std::string, std::string> const &                           getPromotedExtensions();\n  VULKAN_HPP_CONSTEXPR_20 std::string getExtensionDeprecatedBy( std::string const & extension );\n  VULKAN_HPP_CONSTEXPR_20 std::string getExtensionObsoletedBy( std::string const & extension );\n  VULKAN_HPP_CONSTEXPR_20 std::string getExtensionPromotedTo( std::string const & extension );\n  VULKAN_HPP_CONSTEXPR_20 bool        isDeprecatedExtension( std::string const & extension );\n  VULKAN_HPP_CONSTEXPR_20 bool        isDeviceExtension( std::string const & extension );\n  VULKAN_HPP_CONSTEXPR_20 bool        isInstanceExtension( std::string const & extension );\n  VULKAN_HPP_CONSTEXPR_20 bool        isObsoletedExtension( std::string const & extension );\n  VULKAN_HPP_CONSTEXPR_20 bool        isPromotedExtension( std::string const & extension );\n\n  //=====================================================\n  //=== Extension inspection function implementations ===\n  //=====================================================\n\n  VULKAN_HPP_INLINE std::map<std::string, std::string> const & getDeprecatedExtensions()\n  {\n    static const std::map<std::string, std::string> deprecatedExtensions = {\n      { \"VK_EXT_debug_report\", \"VK_EXT_debug_utils\" },\n      { \"VK_NV_glsl_shader\", \"\" },\n      { \"VK_NV_dedicated_allocation\", \"VK_KHR_dedicated_allocation\" },\n      { \"VK_AMD_gpu_shader_half_float\", \"VK_KHR_shader_float16_int8\" },\n      { \"VK_IMG_format_pvrtc\", \"\" },\n      { \"VK_NV_external_memory_capabilities\", \"VK_KHR_external_memory_capabilities\" },\n      { \"VK_NV_external_memory\", \"VK_KHR_external_memory\" },\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      { \"VK_NV_external_memory_win32\", \"VK_KHR_external_memory_win32\" },\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      { \"VK_EXT_validation_flags\", \"VK_EXT_layer_settings\" },\n      { \"VK_EXT_shader_subgroup_ballot\", \"VK_VERSION_1_2\" },\n      { \"VK_EXT_shader_subgroup_vote\", \"VK_VERSION_1_1\" },\n#if defined( VK_USE_PLATFORM_IOS_MVK )\n      { \"VK_MVK_ios_surface\", \"VK_EXT_metal_surface\" },\n#endif /*VK_USE_PLATFORM_IOS_MVK*/\n#if defined( VK_USE_PLATFORM_MACOS_MVK )\n      { \"VK_MVK_macos_surface\", \"VK_EXT_metal_surface\" },\n#endif /*VK_USE_PLATFORM_MACOS_MVK*/\n      { \"VK_AMD_gpu_shader_int16\", \"VK_KHR_shader_float16_int8\" },\n      { \"VK_NV_ray_tracing\", \"VK_KHR_ray_tracing_pipeline\" },\n      { \"VK_EXT_buffer_device_address\", \"VK_KHR_buffer_device_address\" },\n      { \"VK_EXT_validation_features\", \"VK_EXT_layer_settings\" }\n    };\n    return deprecatedExtensions;\n  }\n\n  VULKAN_HPP_INLINE std::set<std::string> const & getDeviceExtensions()\n  {\n    static const std::set<std::string> deviceExtensions = {\n      \"VK_KHR_swapchain\",\n      \"VK_KHR_display_swapchain\",\n      \"VK_NV_glsl_shader\",\n      \"VK_EXT_depth_range_unrestricted\",\n      \"VK_KHR_sampler_mirror_clamp_to_edge\",\n      \"VK_IMG_filter_cubic\",\n      \"VK_AMD_rasterization_order\",\n      \"VK_AMD_shader_trinary_minmax\",\n      \"VK_AMD_shader_explicit_vertex_parameter\",\n      \"VK_EXT_debug_marker\",\n      \"VK_KHR_video_queue\",\n      \"VK_KHR_video_decode_queue\",\n      \"VK_AMD_gcn_shader\",\n      \"VK_NV_dedicated_allocation\",\n      \"VK_EXT_transform_feedback\",\n      \"VK_NVX_binary_import\",\n      \"VK_NVX_image_view_handle\",\n      \"VK_AMD_draw_indirect_count\",\n      \"VK_AMD_negative_viewport_height\",\n      \"VK_AMD_gpu_shader_half_float\",\n      \"VK_AMD_shader_ballot\",\n      \"VK_KHR_video_encode_h264\",\n      \"VK_KHR_video_encode_h265\",\n      \"VK_KHR_video_decode_h264\",\n      \"VK_AMD_texture_gather_bias_lod\",\n      \"VK_AMD_shader_info\",\n      \"VK_KHR_dynamic_rendering\",\n      \"VK_AMD_shader_image_load_store_lod\",\n      \"VK_NV_corner_sampled_image\",\n      \"VK_KHR_multiview\",\n      \"VK_IMG_format_pvrtc\",\n      \"VK_NV_external_memory\",\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      \"VK_NV_external_memory_win32\",\n      \"VK_NV_win32_keyed_mutex\",\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      \"VK_KHR_device_group\",\n      \"VK_KHR_shader_draw_parameters\",\n      \"VK_EXT_shader_subgroup_ballot\",\n      \"VK_EXT_shader_subgroup_vote\",\n      \"VK_EXT_texture_compression_astc_hdr\",\n      \"VK_EXT_astc_decode_mode\",\n      \"VK_EXT_pipeline_robustness\",\n      \"VK_KHR_maintenance1\",\n      \"VK_KHR_external_memory\",\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      \"VK_KHR_external_memory_win32\",\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      \"VK_KHR_external_memory_fd\",\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      \"VK_KHR_win32_keyed_mutex\",\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      \"VK_KHR_external_semaphore\",\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      \"VK_KHR_external_semaphore_win32\",\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      \"VK_KHR_external_semaphore_fd\",\n      \"VK_KHR_push_descriptor\",\n      \"VK_EXT_conditional_rendering\",\n      \"VK_KHR_shader_float16_int8\",\n      \"VK_KHR_16bit_storage\",\n      \"VK_KHR_incremental_present\",\n      \"VK_KHR_descriptor_update_template\",\n      \"VK_NV_clip_space_w_scaling\",\n      \"VK_EXT_display_control\",\n      \"VK_GOOGLE_display_timing\",\n      \"VK_NV_sample_mask_override_coverage\",\n      \"VK_NV_geometry_shader_passthrough\",\n      \"VK_NV_viewport_array2\",\n      \"VK_NVX_multiview_per_view_attributes\",\n      \"VK_NV_viewport_swizzle\",\n      \"VK_EXT_discard_rectangles\",\n      \"VK_EXT_conservative_rasterization\",\n      \"VK_EXT_depth_clip_enable\",\n      \"VK_EXT_hdr_metadata\",\n      \"VK_KHR_imageless_framebuffer\",\n      \"VK_KHR_create_renderpass2\",\n      \"VK_IMG_relaxed_line_rasterization\",\n      \"VK_KHR_shared_presentable_image\",\n      \"VK_KHR_external_fence\",\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      \"VK_KHR_external_fence_win32\",\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      \"VK_KHR_external_fence_fd\",\n      \"VK_KHR_performance_query\",\n      \"VK_KHR_maintenance2\",\n      \"VK_KHR_variable_pointers\",\n      \"VK_EXT_external_memory_dma_buf\",\n      \"VK_EXT_queue_family_foreign\",\n      \"VK_KHR_dedicated_allocation\",\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n      \"VK_ANDROID_external_memory_android_hardware_buffer\",\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n      \"VK_EXT_sampler_filter_minmax\",\n      \"VK_KHR_storage_buffer_storage_class\",\n      \"VK_AMD_gpu_shader_int16\",\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      \"VK_AMDX_shader_enqueue\",\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n      \"VK_AMD_mixed_attachment_samples\",\n      \"VK_AMD_shader_fragment_mask\",\n      \"VK_EXT_inline_uniform_block\",\n      \"VK_EXT_shader_stencil_export\",\n      \"VK_EXT_sample_locations\",\n      \"VK_KHR_relaxed_block_layout\",\n      \"VK_KHR_get_memory_requirements2\",\n      \"VK_KHR_image_format_list\",\n      \"VK_EXT_blend_operation_advanced\",\n      \"VK_NV_fragment_coverage_to_color\",\n      \"VK_KHR_acceleration_structure\",\n      \"VK_KHR_ray_tracing_pipeline\",\n      \"VK_KHR_ray_query\",\n      \"VK_NV_framebuffer_mixed_samples\",\n      \"VK_NV_fill_rectangle\",\n      \"VK_NV_shader_sm_builtins\",\n      \"VK_EXT_post_depth_coverage\",\n      \"VK_KHR_sampler_ycbcr_conversion\",\n      \"VK_KHR_bind_memory2\",\n      \"VK_EXT_image_drm_format_modifier\",\n      \"VK_EXT_validation_cache\",\n      \"VK_EXT_descriptor_indexing\",\n      \"VK_EXT_shader_viewport_index_layer\",\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      \"VK_KHR_portability_subset\",\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n      \"VK_NV_shading_rate_image\",\n      \"VK_NV_ray_tracing\",\n      \"VK_NV_representative_fragment_test\",\n      \"VK_KHR_maintenance3\",\n      \"VK_KHR_draw_indirect_count\",\n      \"VK_EXT_filter_cubic\",\n      \"VK_QCOM_render_pass_shader_resolve\",\n      \"VK_EXT_global_priority\",\n      \"VK_KHR_shader_subgroup_extended_types\",\n      \"VK_KHR_8bit_storage\",\n      \"VK_EXT_external_memory_host\",\n      \"VK_AMD_buffer_marker\",\n      \"VK_KHR_shader_atomic_int64\",\n      \"VK_KHR_shader_clock\",\n      \"VK_AMD_pipeline_compiler_control\",\n      \"VK_EXT_calibrated_timestamps\",\n      \"VK_AMD_shader_core_properties\",\n      \"VK_KHR_video_decode_h265\",\n      \"VK_KHR_global_priority\",\n      \"VK_AMD_memory_overallocation_behavior\",\n      \"VK_EXT_vertex_attribute_divisor\",\n#if defined( VK_USE_PLATFORM_GGP )\n      \"VK_GGP_frame_token\",\n#endif /*VK_USE_PLATFORM_GGP*/\n      \"VK_EXT_pipeline_creation_feedback\",\n      \"VK_KHR_driver_properties\",\n      \"VK_KHR_shader_float_controls\",\n      \"VK_NV_shader_subgroup_partitioned\",\n      \"VK_KHR_depth_stencil_resolve\",\n      \"VK_KHR_swapchain_mutable_format\",\n      \"VK_NV_compute_shader_derivatives\",\n      \"VK_NV_mesh_shader\",\n      \"VK_NV_fragment_shader_barycentric\",\n      \"VK_NV_shader_image_footprint\",\n      \"VK_NV_scissor_exclusive\",\n      \"VK_NV_device_diagnostic_checkpoints\",\n      \"VK_KHR_timeline_semaphore\",\n      \"VK_INTEL_shader_integer_functions2\",\n      \"VK_INTEL_performance_query\",\n      \"VK_KHR_vulkan_memory_model\",\n      \"VK_EXT_pci_bus_info\",\n      \"VK_AMD_display_native_hdr\",\n      \"VK_KHR_shader_terminate_invocation\",\n      \"VK_EXT_fragment_density_map\",\n      \"VK_EXT_scalar_block_layout\",\n      \"VK_GOOGLE_hlsl_functionality1\",\n      \"VK_GOOGLE_decorate_string\",\n      \"VK_EXT_subgroup_size_control\",\n      \"VK_KHR_fragment_shading_rate\",\n      \"VK_AMD_shader_core_properties2\",\n      \"VK_AMD_device_coherent_memory\",\n      \"VK_KHR_dynamic_rendering_local_read\",\n      \"VK_EXT_shader_image_atomic_int64\",\n      \"VK_KHR_shader_quad_control\",\n      \"VK_KHR_spirv_1_4\",\n      \"VK_EXT_memory_budget\",\n      \"VK_EXT_memory_priority\",\n      \"VK_NV_dedicated_allocation_image_aliasing\",\n      \"VK_KHR_separate_depth_stencil_layouts\",\n      \"VK_EXT_buffer_device_address\",\n      \"VK_EXT_tooling_info\",\n      \"VK_EXT_separate_stencil_usage\",\n      \"VK_KHR_present_wait\",\n      \"VK_NV_cooperative_matrix\",\n      \"VK_NV_coverage_reduction_mode\",\n      \"VK_EXT_fragment_shader_interlock\",\n      \"VK_EXT_ycbcr_image_arrays\",\n      \"VK_KHR_uniform_buffer_standard_layout\",\n      \"VK_EXT_provoking_vertex\",\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      \"VK_EXT_full_screen_exclusive\",\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      \"VK_KHR_buffer_device_address\",\n      \"VK_EXT_line_rasterization\",\n      \"VK_EXT_shader_atomic_float\",\n      \"VK_EXT_host_query_reset\",\n      \"VK_EXT_index_type_uint8\",\n      \"VK_EXT_extended_dynamic_state\",\n      \"VK_KHR_deferred_host_operations\",\n      \"VK_KHR_pipeline_executable_properties\",\n      \"VK_EXT_host_image_copy\",\n      \"VK_KHR_map_memory2\",\n      \"VK_EXT_map_memory_placed\",\n      \"VK_EXT_shader_atomic_float2\",\n      \"VK_EXT_swapchain_maintenance1\",\n      \"VK_EXT_shader_demote_to_helper_invocation\",\n      \"VK_NV_device_generated_commands\",\n      \"VK_NV_inherited_viewport_scissor\",\n      \"VK_KHR_shader_integer_dot_product\",\n      \"VK_EXT_texel_buffer_alignment\",\n      \"VK_QCOM_render_pass_transform\",\n      \"VK_EXT_depth_bias_control\",\n      \"VK_EXT_device_memory_report\",\n      \"VK_EXT_robustness2\",\n      \"VK_EXT_custom_border_color\",\n      \"VK_GOOGLE_user_type\",\n      \"VK_KHR_pipeline_library\",\n      \"VK_NV_present_barrier\",\n      \"VK_KHR_shader_non_semantic_info\",\n      \"VK_KHR_present_id\",\n      \"VK_EXT_private_data\",\n      \"VK_EXT_pipeline_creation_cache_control\",\n      \"VK_KHR_video_encode_queue\",\n      \"VK_NV_device_diagnostics_config\",\n      \"VK_QCOM_render_pass_store_ops\",\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      \"VK_NV_cuda_kernel_launch\",\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n      \"VK_NV_low_latency\",\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n      \"VK_EXT_metal_objects\",\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n      \"VK_KHR_synchronization2\",\n      \"VK_EXT_descriptor_buffer\",\n      \"VK_EXT_graphics_pipeline_library\",\n      \"VK_AMD_shader_early_and_late_fragment_tests\",\n      \"VK_KHR_fragment_shader_barycentric\",\n      \"VK_KHR_shader_subgroup_uniform_control_flow\",\n      \"VK_KHR_zero_initialize_workgroup_memory\",\n      \"VK_NV_fragment_shading_rate_enums\",\n      \"VK_NV_ray_tracing_motion_blur\",\n      \"VK_EXT_mesh_shader\",\n      \"VK_EXT_ycbcr_2plane_444_formats\",\n      \"VK_EXT_fragment_density_map2\",\n      \"VK_QCOM_rotated_copy_commands\",\n      \"VK_EXT_image_robustness\",\n      \"VK_KHR_workgroup_memory_explicit_layout\",\n      \"VK_KHR_copy_commands2\",\n      \"VK_EXT_image_compression_control\",\n      \"VK_EXT_attachment_feedback_loop_layout\",\n      \"VK_EXT_4444_formats\",\n      \"VK_EXT_device_fault\",\n      \"VK_ARM_rasterization_order_attachment_access\",\n      \"VK_EXT_rgba10x6_formats\",\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      \"VK_NV_acquire_winrt_display\",\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      \"VK_VALVE_mutable_descriptor_type\",\n      \"VK_EXT_vertex_input_dynamic_state\",\n      \"VK_EXT_physical_device_drm\",\n      \"VK_EXT_device_address_binding_report\",\n      \"VK_EXT_depth_clip_control\",\n      \"VK_EXT_primitive_topology_list_restart\",\n      \"VK_KHR_format_feature_flags2\",\n      \"VK_EXT_present_mode_fifo_latest_ready\",\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n      \"VK_FUCHSIA_external_memory\",\n      \"VK_FUCHSIA_external_semaphore\",\n      \"VK_FUCHSIA_buffer_collection\",\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n      \"VK_HUAWEI_subpass_shading\",\n      \"VK_HUAWEI_invocation_mask\",\n      \"VK_NV_external_memory_rdma\",\n      \"VK_EXT_pipeline_properties\",\n      \"VK_EXT_frame_boundary\",\n      \"VK_EXT_multisampled_render_to_single_sampled\",\n      \"VK_EXT_extended_dynamic_state2\",\n      \"VK_EXT_color_write_enable\",\n      \"VK_EXT_primitives_generated_query\",\n      \"VK_KHR_ray_tracing_maintenance1\",\n      \"VK_EXT_global_priority_query\",\n      \"VK_EXT_image_view_min_lod\",\n      \"VK_EXT_multi_draw\",\n      \"VK_EXT_image_2d_view_of_3d\",\n      \"VK_EXT_shader_tile_image\",\n      \"VK_EXT_opacity_micromap\",\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      \"VK_NV_displacement_micromap\",\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n      \"VK_EXT_load_store_op_none\",\n      \"VK_HUAWEI_cluster_culling_shader\",\n      \"VK_EXT_border_color_swizzle\",\n      \"VK_EXT_pageable_device_local_memory\",\n      \"VK_KHR_maintenance4\",\n      \"VK_ARM_shader_core_properties\",\n      \"VK_KHR_shader_subgroup_rotate\",\n      \"VK_ARM_scheduling_controls\",\n      \"VK_EXT_image_sliced_view_of_3d\",\n      \"VK_VALVE_descriptor_set_host_mapping\",\n      \"VK_EXT_depth_clamp_zero_one\",\n      \"VK_EXT_non_seamless_cube_map\",\n      \"VK_ARM_render_pass_striped\",\n      \"VK_QCOM_fragment_density_map_offset\",\n      \"VK_NV_copy_memory_indirect\",\n      \"VK_NV_memory_decompression\",\n      \"VK_NV_device_generated_commands_compute\",\n      \"VK_NV_ray_tracing_linear_swept_spheres\",\n      \"VK_NV_linear_color_attachment\",\n      \"VK_KHR_shader_maximal_reconvergence\",\n      \"VK_EXT_image_compression_control_swapchain\",\n      \"VK_QCOM_image_processing\",\n      \"VK_EXT_nested_command_buffer\",\n      \"VK_EXT_external_memory_acquire_unmodified\",\n      \"VK_EXT_extended_dynamic_state3\",\n      \"VK_EXT_subpass_merge_feedback\",\n      \"VK_EXT_shader_module_identifier\",\n      \"VK_EXT_rasterization_order_attachment_access\",\n      \"VK_NV_optical_flow\",\n      \"VK_EXT_legacy_dithering\",\n      \"VK_EXT_pipeline_protected_access\",\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n      \"VK_ANDROID_external_format_resolve\",\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n      \"VK_KHR_maintenance5\",\n      \"VK_AMD_anti_lag\",\n      \"VK_KHR_ray_tracing_position_fetch\",\n      \"VK_EXT_shader_object\",\n      \"VK_KHR_pipeline_binary\",\n      \"VK_QCOM_tile_properties\",\n      \"VK_SEC_amigo_profiling\",\n      \"VK_QCOM_multiview_per_view_viewports\",\n      \"VK_NV_ray_tracing_invocation_reorder\",\n      \"VK_NV_cooperative_vector\",\n      \"VK_NV_extended_sparse_address_space\",\n      \"VK_EXT_mutable_descriptor_type\",\n      \"VK_EXT_legacy_vertex_attributes\",\n      \"VK_ARM_shader_core_builtins\",\n      \"VK_EXT_pipeline_library_group_handles\",\n      \"VK_EXT_dynamic_rendering_unused_attachments\",\n      \"VK_NV_low_latency2\",\n      \"VK_KHR_cooperative_matrix\",\n      \"VK_QCOM_multiview_per_view_render_areas\",\n      \"VK_KHR_compute_shader_derivatives\",\n      \"VK_KHR_video_decode_av1\",\n      \"VK_KHR_video_encode_av1\",\n      \"VK_KHR_video_maintenance1\",\n      \"VK_NV_per_stage_descriptor_set\",\n      \"VK_QCOM_image_processing2\",\n      \"VK_QCOM_filter_cubic_weights\",\n      \"VK_QCOM_ycbcr_degamma\",\n      \"VK_QCOM_filter_cubic_clamp\",\n      \"VK_EXT_attachment_feedback_loop_dynamic_state\",\n      \"VK_KHR_vertex_attribute_divisor\",\n      \"VK_KHR_load_store_op_none\",\n      \"VK_KHR_shader_float_controls2\",\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n      \"VK_QNX_external_memory_screen_buffer\",\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n      \"VK_MSFT_layered_driver\",\n      \"VK_KHR_index_type_uint8\",\n      \"VK_KHR_line_rasterization\",\n      \"VK_KHR_calibrated_timestamps\",\n      \"VK_KHR_shader_expect_assume\",\n      \"VK_KHR_maintenance6\",\n      \"VK_NV_descriptor_pool_overallocation\",\n      \"VK_KHR_video_encode_quantization_map\",\n      \"VK_NV_raw_access_chains\",\n      \"VK_KHR_shader_relaxed_extended_instruction\",\n      \"VK_NV_command_buffer_inheritance\",\n      \"VK_KHR_maintenance7\",\n      \"VK_NV_shader_atomic_float16_vector\",\n      \"VK_EXT_shader_replicated_composites\",\n      \"VK_NV_ray_tracing_validation\",\n      \"VK_NV_cluster_acceleration_structure\",\n      \"VK_NV_partitioned_acceleration_structure\",\n      \"VK_EXT_device_generated_commands\",\n      \"VK_KHR_maintenance8\",\n      \"VK_MESA_image_alignment_control\",\n      \"VK_EXT_depth_clamp_control\",\n      \"VK_KHR_video_maintenance2\",\n      \"VK_HUAWEI_hdr_vivid\",\n      \"VK_NV_cooperative_matrix2\",\n      \"VK_ARM_pipeline_opacity_micromap\",\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n      \"VK_EXT_external_memory_metal\",\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n      \"VK_KHR_depth_clamp_zero_one\",\n      \"VK_EXT_vertex_attribute_robustness\"\n    };\n    return deviceExtensions;\n  }\n\n  VULKAN_HPP_INLINE std::set<std::string> const & getInstanceExtensions()\n  {\n    static const std::set<std::string> instanceExtensions = {\n      \"VK_KHR_surface\",\n      \"VK_KHR_display\",\n#if defined( VK_USE_PLATFORM_XLIB_KHR )\n      \"VK_KHR_xlib_surface\",\n#endif /*VK_USE_PLATFORM_XLIB_KHR*/\n#if defined( VK_USE_PLATFORM_XCB_KHR )\n      \"VK_KHR_xcb_surface\",\n#endif /*VK_USE_PLATFORM_XCB_KHR*/\n#if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n      \"VK_KHR_wayland_surface\",\n#endif /*VK_USE_PLATFORM_WAYLAND_KHR*/\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n      \"VK_KHR_android_surface\",\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      \"VK_KHR_win32_surface\",\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      \"VK_EXT_debug_report\",\n#if defined( VK_USE_PLATFORM_GGP )\n      \"VK_GGP_stream_descriptor_surface\",\n#endif /*VK_USE_PLATFORM_GGP*/\n      \"VK_NV_external_memory_capabilities\",\n      \"VK_KHR_get_physical_device_properties2\",\n      \"VK_EXT_validation_flags\",\n#if defined( VK_USE_PLATFORM_VI_NN )\n      \"VK_NN_vi_surface\",\n#endif /*VK_USE_PLATFORM_VI_NN*/\n      \"VK_KHR_device_group_creation\",\n      \"VK_KHR_external_memory_capabilities\",\n      \"VK_KHR_external_semaphore_capabilities\",\n      \"VK_EXT_direct_mode_display\",\n#if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )\n      \"VK_EXT_acquire_xlib_display\",\n#endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/\n      \"VK_EXT_display_surface_counter\",\n      \"VK_EXT_swapchain_colorspace\",\n      \"VK_KHR_external_fence_capabilities\",\n      \"VK_KHR_get_surface_capabilities2\",\n      \"VK_KHR_get_display_properties2\",\n#if defined( VK_USE_PLATFORM_IOS_MVK )\n      \"VK_MVK_ios_surface\",\n#endif /*VK_USE_PLATFORM_IOS_MVK*/\n#if defined( VK_USE_PLATFORM_MACOS_MVK )\n      \"VK_MVK_macos_surface\",\n#endif /*VK_USE_PLATFORM_MACOS_MVK*/\n      \"VK_EXT_debug_utils\",\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n      \"VK_FUCHSIA_imagepipe_surface\",\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n      \"VK_EXT_metal_surface\",\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n      \"VK_KHR_surface_protected_capabilities\",\n      \"VK_EXT_validation_features\",\n      \"VK_EXT_headless_surface\",\n      \"VK_EXT_surface_maintenance1\",\n      \"VK_EXT_acquire_drm_display\",\n#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n      \"VK_EXT_directfb_surface\",\n#endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n      \"VK_QNX_screen_surface\",\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n      \"VK_KHR_portability_enumeration\",\n      \"VK_GOOGLE_surfaceless_query\",\n      \"VK_LUNARG_direct_driver_loading\",\n      \"VK_EXT_layer_settings\",\n      \"VK_NV_display_stereo\"\n    };\n    return instanceExtensions;\n  }\n\n  VULKAN_HPP_INLINE std::map<std::string, std::vector<std::vector<std::string>>> const & getExtensionDepends( std::string const & extension )\n  {\n    static const std::map<std::string, std::vector<std::vector<std::string>>>                        noDependencies;\n    static const std::map<std::string, std::map<std::string, std::vector<std::vector<std::string>>>> dependencies = {\n      { \"VK_KHR_swapchain\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_surface\",\n            } } } } },\n      { \"VK_KHR_display\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_surface\",\n            } } } } },\n      { \"VK_KHR_display_swapchain\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_swapchain\",\n              \"VK_KHR_display\",\n            } } } } },\n#if defined( VK_USE_PLATFORM_XLIB_KHR )\n      { \"VK_KHR_xlib_surface\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_surface\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_XLIB_KHR*/\n#if defined( VK_USE_PLATFORM_XCB_KHR )\n      { \"VK_KHR_xcb_surface\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_surface\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_XCB_KHR*/\n#if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n      { \"VK_KHR_wayland_surface\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_surface\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_WAYLAND_KHR*/\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n      { \"VK_KHR_android_surface\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_surface\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      { \"VK_KHR_win32_surface\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_surface\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      { \"VK_EXT_debug_marker\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_EXT_debug_report\",\n            } } } } },\n      { \"VK_KHR_video_queue\",\n        { { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_synchronization2\",\n            } } },\n          { \"VK_VERSION_1_3\", { {} } } } },\n      { \"VK_KHR_video_decode_queue\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_video_queue\",\n              \"VK_KHR_synchronization2\",\n            } } },\n          { \"VK_VERSION_1_3\", { {} } } } },\n      { \"VK_EXT_transform_feedback\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_video_encode_h264\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_video_encode_queue\",\n            } } } } },\n      { \"VK_KHR_video_encode_h265\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_video_encode_queue\",\n            } } } } },\n      { \"VK_KHR_video_decode_h264\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_video_decode_queue\",\n            } } } } },\n      { \"VK_AMD_texture_gather_bias_lod\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_dynamic_rendering\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_depth_stencil_resolve\",\n            } } },\n          { \"VK_VERSION_1_2\", { {} } } } },\n#if defined( VK_USE_PLATFORM_GGP )\n      { \"VK_GGP_stream_descriptor_surface\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_surface\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_GGP*/\n      { \"VK_NV_corner_sampled_image\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_multiview\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_NV_external_memory\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_NV_external_memory_capabilities\",\n            } } } } },\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      { \"VK_NV_external_memory_win32\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_NV_external_memory\",\n            } } } } },\n      { \"VK_NV_win32_keyed_mutex\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_NV_external_memory_win32\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      { \"VK_KHR_device_group\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_device_group_creation\",\n            } } } } },\n#if defined( VK_USE_PLATFORM_VI_NN )\n      { \"VK_NN_vi_surface\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_surface\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_VI_NN*/\n      { \"VK_EXT_texture_compression_astc_hdr\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_astc_decode_mode\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_pipeline_robustness\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_external_memory_capabilities\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_external_memory\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_external_memory_capabilities\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      { \"VK_KHR_external_memory_win32\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_external_memory\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      { \"VK_KHR_external_memory_fd\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_external_memory\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      { \"VK_KHR_win32_keyed_mutex\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_external_memory_win32\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      { \"VK_KHR_external_semaphore_capabilities\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_external_semaphore\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_external_semaphore_capabilities\",\n            } } } } },\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      { \"VK_KHR_external_semaphore_win32\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_external_semaphore\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      { \"VK_KHR_external_semaphore_fd\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_external_semaphore\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_push_descriptor\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_conditional_rendering\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_shader_float16_int8\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_16bit_storage\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n              \"VK_KHR_storage_buffer_storage_class\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_incremental_present\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_swapchain\",\n            } } } } },\n      { \"VK_EXT_direct_mode_display\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_display\",\n            } } } } },\n#if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )\n      { \"VK_EXT_acquire_xlib_display\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_EXT_direct_mode_display\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/\n      { \"VK_EXT_display_surface_counter\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_display\",\n            } } } } },\n      { \"VK_EXT_display_control\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_EXT_display_surface_counter\",\n              \"VK_KHR_swapchain\",\n            } } } } },\n      { \"VK_GOOGLE_display_timing\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_swapchain\",\n            } } } } },\n      { \"VK_NVX_multiview_per_view_attributes\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_multiview\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_discard_rectangles\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_conservative_rasterization\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_depth_clip_enable\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_swapchain_colorspace\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_surface\",\n            } } } } },\n      { \"VK_EXT_hdr_metadata\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_swapchain\",\n            } } } } },\n      { \"VK_KHR_imageless_framebuffer\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n              \"VK_KHR_maintenance2\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_image_format_list\",\n            } } },\n          { \"VK_VERSION_1_2\", { {} } } } },\n      { \"VK_KHR_create_renderpass2\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_multiview\",\n              \"VK_KHR_maintenance2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_IMG_relaxed_line_rasterization\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_shared_presentable_image\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_swapchain\",\n              \"VK_KHR_get_surface_capabilities2\",\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_swapchain\",\n              \"VK_KHR_get_surface_capabilities2\",\n            } } } } },\n      { \"VK_KHR_external_fence_capabilities\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_external_fence\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_external_fence_capabilities\",\n            } } } } },\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      { \"VK_KHR_external_fence_win32\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_external_fence\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      { \"VK_KHR_external_fence_fd\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_external_fence\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_performance_query\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_get_surface_capabilities2\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_surface\",\n            } } } } },\n      { \"VK_KHR_variable_pointers\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n              \"VK_KHR_storage_buffer_storage_class\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_get_display_properties2\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_display\",\n            } } } } },\n#if defined( VK_USE_PLATFORM_IOS_MVK )\n      { \"VK_MVK_ios_surface\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_surface\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_IOS_MVK*/\n#if defined( VK_USE_PLATFORM_MACOS_MVK )\n      { \"VK_MVK_macos_surface\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_surface\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_MACOS_MVK*/\n      { \"VK_EXT_external_memory_dma_buf\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_external_memory_fd\",\n            } } } } },\n      { \"VK_EXT_queue_family_foreign\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_external_memory\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_dedicated_allocation\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_memory_requirements2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n      { \"VK_ANDROID_external_memory_android_hardware_buffer\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_sampler_ycbcr_conversion\",\n              \"VK_KHR_external_memory\",\n              \"VK_KHR_dedicated_allocation\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_EXT_queue_family_foreign\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n      { \"VK_EXT_sampler_filter_minmax\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      { \"VK_AMDX_shader_enqueue\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_synchronization2\",\n              \"VK_KHR_spirv_1_4\",\n              \"VK_EXT_extended_dynamic_state\",\n            } } },\n          { \"VK_VERSION_1_3\",\n            { {\n              \"VK_KHR_maintenance5\",\n              \"VK_KHR_pipeline_library\",\n            } } } } },\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n      { \"VK_EXT_inline_uniform_block\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n              \"VK_KHR_maintenance1\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_sample_locations\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_blend_operation_advanced\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_acceleration_structure\",\n        { { \"VK_VERSION_1_1\",\n            { {\n              \"VK_EXT_descriptor_indexing\",\n              \"VK_KHR_buffer_device_address\",\n            } } },\n          { \"VK_VERSION_1_2\",\n            { {\n              \"VK_KHR_deferred_host_operations\",\n            } } } } },\n      { \"VK_KHR_ray_tracing_pipeline\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_spirv_1_4\",\n              \"VK_KHR_acceleration_structure\",\n            } } } } },\n      { \"VK_KHR_ray_query\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_spirv_1_4\",\n              \"VK_KHR_acceleration_structure\",\n            } } } } },\n      { \"VK_NV_shader_sm_builtins\", { { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_sampler_ycbcr_conversion\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_maintenance1\",\n              \"VK_KHR_bind_memory2\",\n              \"VK_KHR_get_memory_requirements2\",\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_image_drm_format_modifier\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_bind_memory2\",\n              \"VK_KHR_get_physical_device_properties2\",\n              \"VK_KHR_sampler_ycbcr_conversion\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_image_format_list\",\n            } } },\n          { \"VK_VERSION_1_2\", { {} } } } },\n      { \"VK_EXT_descriptor_indexing\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n              \"VK_KHR_maintenance3\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      { \"VK_KHR_portability_subset\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n      { \"VK_NV_shading_rate_image\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_NV_ray_tracing\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n              \"VK_KHR_get_memory_requirements2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_NV_representative_fragment_test\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_maintenance3\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_shader_subgroup_extended_types\", { { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_8bit_storage\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n              \"VK_KHR_storage_buffer_storage_class\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_external_memory_host\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_external_memory\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_shader_atomic_int64\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_shader_clock\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_calibrated_timestamps\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_AMD_shader_core_properties\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_video_decode_h265\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_video_decode_queue\",\n            } } } } },\n      { \"VK_KHR_global_priority\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_vertex_attribute_divisor\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n#if defined( VK_USE_PLATFORM_GGP )\n      { \"VK_GGP_frame_token\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_swapchain\",\n              \"VK_GGP_stream_descriptor_surface\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_GGP*/\n      { \"VK_KHR_driver_properties\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_shader_float_controls\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_NV_shader_subgroup_partitioned\", { { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_depth_stencil_resolve\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_create_renderpass2\",\n            } } },\n          { \"VK_VERSION_1_2\", { {} } } } },\n      { \"VK_KHR_swapchain_mutable_format\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_swapchain\",\n              \"VK_KHR_maintenance2\",\n              \"VK_KHR_image_format_list\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_swapchain\",\n              \"VK_KHR_image_format_list\",\n            } } },\n          { \"VK_VERSION_1_2\",\n            { {\n              \"VK_KHR_swapchain\",\n            } } } } },\n      { \"VK_NV_compute_shader_derivatives\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_NV_mesh_shader\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_NV_fragment_shader_barycentric\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_NV_shader_image_footprint\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_NV_scissor_exclusive\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_NV_device_diagnostic_checkpoints\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_timeline_semaphore\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_INTEL_shader_integer_functions2\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_vulkan_memory_model\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_pci_bus_info\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_AMD_display_native_hdr\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_get_surface_capabilities2\",\n              \"VK_KHR_swapchain\",\n            } } } } },\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n      { \"VK_FUCHSIA_imagepipe_surface\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_surface\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n      { \"VK_KHR_shader_terminate_invocation\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n      { \"VK_EXT_metal_surface\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_surface\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n      { \"VK_EXT_fragment_density_map\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_scalar_block_layout\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_subgroup_size_control\", { { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_fragment_shading_rate\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_create_renderpass2\",\n            } } },\n          { \"VK_VERSION_1_2\", { {} } } } },\n      { \"VK_AMD_shader_core_properties2\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_AMD_shader_core_properties\",\n            } } } } },\n      { \"VK_AMD_device_coherent_memory\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_dynamic_rendering_local_read\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_dynamic_rendering\",\n            } } },\n          { \"VK_VERSION_1_3\", { {} } } } },\n      { \"VK_EXT_shader_image_atomic_int64\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_shader_quad_control\",\n        { { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_vulkan_memory_model\",\n              \"VK_KHR_shader_maximal_reconvergence\",\n            } } } } },\n      { \"VK_KHR_spirv_1_4\",\n        { { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_shader_float_controls\",\n            } } } } },\n      { \"VK_EXT_memory_budget\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_memory_priority\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_surface_protected_capabilities\",\n        { { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_get_surface_capabilities2\",\n            } } } } },\n      { \"VK_NV_dedicated_allocation_image_aliasing\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_dedicated_allocation\",\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_separate_depth_stencil_layouts\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_create_renderpass2\",\n            } } },\n          { \"VK_VERSION_1_2\", { {} } } } },\n      { \"VK_EXT_buffer_device_address\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_present_wait\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_swapchain\",\n              \"VK_KHR_present_id\",\n            } } } } },\n      { \"VK_NV_cooperative_matrix\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_NV_coverage_reduction_mode\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_NV_framebuffer_mixed_samples\",\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_fragment_shader_interlock\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_ycbcr_image_arrays\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_sampler_ycbcr_conversion\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_uniform_buffer_standard_layout\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_provoking_vertex\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      { \"VK_EXT_full_screen_exclusive\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_surface\",\n              \"VK_KHR_get_surface_capabilities2\",\n              \"VK_KHR_swapchain\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      { \"VK_EXT_headless_surface\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_surface\",\n            } } } } },\n      { \"VK_KHR_buffer_device_address\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n              \"VK_KHR_device_group\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_line_rasterization\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_shader_atomic_float\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_host_query_reset\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_index_type_uint8\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_extended_dynamic_state\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_pipeline_executable_properties\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_host_image_copy\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_copy_commands2\",\n              \"VK_KHR_format_feature_flags2\",\n            } } },\n          { \"VK_VERSION_1_3\", { {} } } } },\n      { \"VK_EXT_map_memory_placed\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_map_memory2\",\n            } } },\n          { \"VK_VERSION_1_4\", { {} } } } },\n      { \"VK_EXT_shader_atomic_float2\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_EXT_shader_atomic_float\",\n            } } } } },\n      { \"VK_EXT_surface_maintenance1\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_surface\",\n              \"VK_KHR_get_surface_capabilities2\",\n            } } } } },\n      { \"VK_EXT_swapchain_maintenance1\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_swapchain\",\n              \"VK_EXT_surface_maintenance1\",\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_shader_demote_to_helper_invocation\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_NV_device_generated_commands\",\n        { { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_buffer_device_address\",\n            } } },\n          { \"VK_VERSION_1_2\", { {} } } } },\n      { \"VK_NV_inherited_viewport_scissor\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_shader_integer_dot_product\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_texel_buffer_alignment\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_depth_bias_control\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_device_memory_report\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_acquire_drm_display\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_EXT_direct_mode_display\",\n            } } } } },\n      { \"VK_EXT_robustness2\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_custom_border_color\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_NV_present_barrier\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_surface\",\n              \"VK_KHR_get_surface_capabilities2\",\n              \"VK_KHR_swapchain\",\n            } } } } },\n      { \"VK_KHR_present_id\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_swapchain\",\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_private_data\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_pipeline_creation_cache_control\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_video_encode_queue\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_video_queue\",\n              \"VK_KHR_synchronization2\",\n            } } },\n          { \"VK_VERSION_1_3\", { {} } } } },\n      { \"VK_NV_device_diagnostics_config\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_synchronization2\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_descriptor_buffer\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_buffer_device_address\",\n              \"VK_EXT_descriptor_indexing\",\n            } } },\n          { \"VK_VERSION_1_2\",\n            { {\n              \"VK_KHR_synchronization2\",\n            } } },\n          { \"VK_VERSION_1_3\", { {} } } } },\n      { \"VK_EXT_graphics_pipeline_library\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_pipeline_library\",\n            } } } } },\n      { \"VK_AMD_shader_early_and_late_fragment_tests\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_fragment_shader_barycentric\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_shader_subgroup_uniform_control_flow\", { { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_zero_initialize_workgroup_memory\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_NV_fragment_shading_rate_enums\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_fragment_shading_rate\",\n            } } } } },\n      { \"VK_NV_ray_tracing_motion_blur\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_ray_tracing_pipeline\",\n            } } } } },\n      { \"VK_EXT_mesh_shader\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_spirv_1_4\",\n            } } } } },\n      { \"VK_EXT_ycbcr_2plane_444_formats\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_sampler_ycbcr_conversion\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_fragment_density_map2\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_EXT_fragment_density_map\",\n            } } } } },\n      { \"VK_QCOM_rotated_copy_commands\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_copy_commands2\",\n            } } },\n          { \"VK_VERSION_1_3\", { {} } } } },\n      { \"VK_EXT_image_robustness\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_workgroup_memory_explicit_layout\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_copy_commands2\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_image_compression_control\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_attachment_feedback_loop_layout\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_4444_formats\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_device_fault\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_ARM_rasterization_order_attachment_access\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_rgba10x6_formats\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_sampler_ycbcr_conversion\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      { \"VK_NV_acquire_winrt_display\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_EXT_direct_mode_display\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n      { \"VK_EXT_directfb_surface\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_surface\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n      { \"VK_VALVE_mutable_descriptor_type\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_maintenance3\",\n            } } } } },\n      { \"VK_EXT_vertex_input_dynamic_state\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_physical_device_drm\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_device_address_binding_report\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_EXT_debug_utils\",\n            } } } } },\n      { \"VK_EXT_depth_clip_control\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_primitive_topology_list_restart\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_format_feature_flags2\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_present_mode_fifo_latest_ready\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_swapchain\",\n            } } } } },\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n      { \"VK_FUCHSIA_external_memory\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_external_memory_capabilities\",\n              \"VK_KHR_external_memory\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_FUCHSIA_external_semaphore\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_external_semaphore_capabilities\",\n              \"VK_KHR_external_semaphore\",\n            } } } } },\n      { \"VK_FUCHSIA_buffer_collection\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_FUCHSIA_external_memory\",\n              \"VK_KHR_sampler_ycbcr_conversion\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n      { \"VK_HUAWEI_subpass_shading\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_create_renderpass2\",\n            } } },\n          { \"VK_VERSION_1_2\",\n            { {\n              \"VK_KHR_synchronization2\",\n            } } },\n          { \"VK_VERSION_1_3\", { {} } } } },\n      { \"VK_HUAWEI_invocation_mask\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_ray_tracing_pipeline\",\n              \"VK_KHR_synchronization2\",\n            } } },\n          { \"VK_VERSION_1_3\", { {} } } } },\n      { \"VK_NV_external_memory_rdma\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_external_memory\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_pipeline_properties\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_multisampled_render_to_single_sampled\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_create_renderpass2\",\n              \"VK_KHR_depth_stencil_resolve\",\n            } } },\n          { \"VK_VERSION_1_2\", { {} } } } },\n      { \"VK_EXT_extended_dynamic_state2\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n      { \"VK_QNX_screen_surface\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_surface\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n      { \"VK_EXT_color_write_enable\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_primitives_generated_query\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_EXT_transform_feedback\",\n            } } } } },\n      { \"VK_KHR_ray_tracing_maintenance1\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_acceleration_structure\",\n            } } } } },\n      { \"VK_EXT_global_priority_query\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_EXT_global_priority\",\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_image_view_min_lod\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_multi_draw\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_image_2d_view_of_3d\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_maintenance1\",\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_shader_tile_image\", { { \"VK_VERSION_1_3\", { {} } } } },\n      { \"VK_EXT_opacity_micromap\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_acceleration_structure\",\n              \"VK_KHR_synchronization2\",\n            } } },\n          { \"VK_VERSION_1_3\", { {} } } } },\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      { \"VK_NV_displacement_micromap\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_EXT_opacity_micromap\",\n            } } } } },\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n      { \"VK_HUAWEI_cluster_culling_shader\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_border_color_swizzle\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_EXT_custom_border_color\",\n            } } } } },\n      { \"VK_EXT_pageable_device_local_memory\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_EXT_memory_priority\",\n            } } } } },\n      { \"VK_KHR_maintenance4\", { { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_ARM_shader_core_properties\", { { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_ARM_scheduling_controls\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_ARM_shader_core_builtins\",\n            } } } } },\n      { \"VK_EXT_image_sliced_view_of_3d\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_maintenance1\",\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_VALVE_descriptor_set_host_mapping\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_depth_clamp_zero_one\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_non_seamless_cube_map\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_ARM_render_pass_striped\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_synchronization2\",\n            } } },\n          { \"VK_VERSION_1_3\", { {} } } } },\n      { \"VK_QCOM_fragment_density_map_offset\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_EXT_fragment_density_map\",\n            } } } } },\n      { \"VK_NV_copy_memory_indirect\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_buffer_device_address\",\n            } } },\n          { \"VK_VERSION_1_2\", { {} } } } },\n      { \"VK_NV_memory_decompression\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_buffer_device_address\",\n            } } },\n          { \"VK_VERSION_1_2\", { {} } } } },\n      { \"VK_NV_device_generated_commands_compute\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_NV_device_generated_commands\",\n            } } } } },\n      { \"VK_NV_ray_tracing_linear_swept_spheres\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_ray_tracing_pipeline\",\n            } } } } },\n      { \"VK_NV_linear_color_attachment\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_GOOGLE_surfaceless_query\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_surface\",\n            } } } } },\n      { \"VK_KHR_shader_maximal_reconvergence\", { { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_image_compression_control_swapchain\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_EXT_image_compression_control\",\n            } } } } },\n      { \"VK_QCOM_image_processing\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_format_feature_flags2\",\n            } } },\n          { \"VK_VERSION_1_3\", { {} } } } },\n      { \"VK_EXT_nested_command_buffer\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_external_memory_acquire_unmodified\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_external_memory\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_extended_dynamic_state3\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_subpass_merge_feedback\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_shader_module_identifier\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_EXT_pipeline_creation_cache_control\",\n            } } },\n          { \"VK_VERSION_1_3\", { {} } } } },\n      { \"VK_EXT_rasterization_order_attachment_access\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_NV_optical_flow\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_format_feature_flags2\",\n              \"VK_KHR_synchronization2\",\n            } } },\n          { \"VK_VERSION_1_3\", { {} } } } },\n      { \"VK_EXT_legacy_dithering\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_pipeline_protected_access\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n      { \"VK_ANDROID_external_format_resolve\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_ANDROID_external_memory_android_hardware_buffer\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n      { \"VK_KHR_maintenance5\",\n        { { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_dynamic_rendering\",\n            } } },\n          { \"VK_VERSION_1_3\", { {} } } } },\n      { \"VK_KHR_ray_tracing_position_fetch\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_acceleration_structure\",\n            } } } } },\n      { \"VK_EXT_shader_object\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_dynamic_rendering\",\n            } } },\n          { \"VK_VERSION_1_3\", { {} } } } },\n      { \"VK_KHR_pipeline_binary\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_maintenance5\",\n            } } } } },\n      { \"VK_QCOM_tile_properties\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_SEC_amigo_profiling\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_QCOM_multiview_per_view_viewports\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_NV_ray_tracing_invocation_reorder\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_ray_tracing_pipeline\",\n            } } } } },\n      { \"VK_EXT_mutable_descriptor_type\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_maintenance3\",\n            } } } } },\n      { \"VK_EXT_legacy_vertex_attributes\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_EXT_vertex_input_dynamic_state\",\n            } } } } },\n      { \"VK_ARM_shader_core_builtins\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_pipeline_library_group_handles\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_ray_tracing_pipeline\",\n              \"VK_KHR_pipeline_library\",\n            } } } } },\n      { \"VK_EXT_dynamic_rendering_unused_attachments\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_dynamic_rendering\",\n            } } },\n          { \"VK_VERSION_1_3\", { {} } } } },\n      { \"VK_NV_low_latency2\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_timeline_semaphore\",\n            } } },\n          { \"VK_VERSION_1_2\", { {} } } } },\n      { \"VK_KHR_cooperative_matrix\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_compute_shader_derivatives\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } } } },\n      { \"VK_KHR_video_decode_av1\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_video_decode_queue\",\n            } } } } },\n      { \"VK_KHR_video_encode_av1\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_video_encode_queue\",\n            } } } } },\n      { \"VK_KHR_video_maintenance1\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_video_queue\",\n            } } } } },\n      { \"VK_NV_per_stage_descriptor_set\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_maintenance6\",\n            } } },\n          { \"VK_VERSION_1_4\", { {} } } } },\n      { \"VK_QCOM_image_processing2\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_QCOM_image_processing\",\n            } } } } },\n      { \"VK_QCOM_filter_cubic_weights\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_EXT_filter_cubic\",\n            } } } } },\n      { \"VK_QCOM_filter_cubic_clamp\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_EXT_filter_cubic\",\n              \"VK_EXT_sampler_filter_minmax\",\n            } } },\n          { \"VK_VERSION_1_2\",\n            { {\n              \"VK_EXT_filter_cubic\",\n            } } } } },\n      { \"VK_EXT_attachment_feedback_loop_dynamic_state\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_EXT_attachment_feedback_loop_layout\",\n            } } } } },\n      { \"VK_KHR_vertex_attribute_divisor\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_shader_float_controls2\",\n        { { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_shader_float_controls\",\n            } } } } },\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n      { \"VK_QNX_external_memory_screen_buffer\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_sampler_ycbcr_conversion\",\n              \"VK_KHR_external_memory\",\n              \"VK_KHR_dedicated_allocation\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_EXT_queue_family_foreign\",\n            } } } } },\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n      { \"VK_MSFT_layered_driver\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_index_type_uint8\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_line_rasterization\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_calibrated_timestamps\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_shader_expect_assume\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_maintenance6\", { { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_NV_descriptor_pool_overallocation\", { { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_NV_display_stereo\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_display\",\n              \"VK_KHR_get_display_properties2\",\n            } } } } },\n      { \"VK_KHR_video_encode_quantization_map\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_video_encode_queue\",\n              \"VK_KHR_format_feature_flags2\",\n            } } } } },\n      { \"VK_KHR_maintenance7\", { { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_NV_cluster_acceleration_structure\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_acceleration_structure\",\n            } } } } },\n      { \"VK_NV_partitioned_acceleration_structure\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_acceleration_structure\",\n            } } } } },\n      { \"VK_EXT_device_generated_commands\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_buffer_device_address\",\n              \"VK_KHR_maintenance5\",\n            } } } } },\n      { \"VK_KHR_maintenance8\", { { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_MESA_image_alignment_control\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_depth_clamp_control\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_KHR_video_maintenance2\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_video_decode_queue\",\n              \"VK_KHR_video_encode_queue\",\n            } } } } },\n      { \"VK_HUAWEI_hdr_vivid\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\",\n            { {\n              \"VK_KHR_swapchain\",\n              \"VK_EXT_hdr_metadata\",\n            } } } } },\n      { \"VK_NV_cooperative_matrix2\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_cooperative_matrix\",\n            } } } } },\n      { \"VK_ARM_pipeline_opacity_micromap\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_EXT_opacity_micromap\",\n            } } } } },\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n      { \"VK_EXT_external_memory_metal\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_external_memory\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n      { \"VK_KHR_depth_clamp_zero_one\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } },\n      { \"VK_EXT_vertex_attribute_robustness\",\n        { { \"VK_VERSION_1_0\",\n            { {\n              \"VK_KHR_get_physical_device_properties2\",\n            } } },\n          { \"VK_VERSION_1_1\", { {} } } } }\n    };\n    auto depIt = dependencies.find( extension );\n    return ( depIt != dependencies.end() ) ? depIt->second : noDependencies;\n  }\n\n  VULKAN_HPP_INLINE std::pair<bool, std::vector<std::vector<std::string>> const &> getExtensionDepends( std::string const & version,\n                                                                                                        std::string const & extension )\n  {\n#if !defined( NDEBUG )\n    static std::set<std::string> versions = { \"VK_VERSION_1_0\", \"VK_VERSION_1_1\", \"VK_VERSION_1_2\", \"VK_VERSION_1_3\", \"VK_VERSION_1_4\" };\n    assert( versions.find( version ) != versions.end() );\n#endif\n    static std::vector<std::vector<std::string>> noDependencies;\n\n    std::map<std::string, std::vector<std::vector<std::string>>> const & dependencies = getExtensionDepends( extension );\n    if ( dependencies.empty() )\n    {\n      return { true, noDependencies };\n    }\n    auto depIt = dependencies.lower_bound( version );\n    if ( ( depIt == dependencies.end() ) || ( depIt->first != version ) )\n    {\n      depIt = std::prev( depIt );\n    }\n    if ( depIt == dependencies.end() )\n    {\n      return { false, noDependencies };\n    }\n    else\n    {\n      return { true, depIt->second };\n    }\n  }\n\n  VULKAN_HPP_INLINE std::map<std::string, std::string> const & getObsoletedExtensions()\n  {\n    static const std::map<std::string, std::string> obsoletedExtensions = { { \"VK_AMD_negative_viewport_height\", \"VK_KHR_maintenance1\" } };\n    return obsoletedExtensions;\n  }\n\n  VULKAN_HPP_INLINE std::map<std::string, std::string> const & getPromotedExtensions()\n  {\n    static const std::map<std::string, std::string> promotedExtensions = {\n      { \"VK_KHR_sampler_mirror_clamp_to_edge\", \"VK_VERSION_1_2\" },\n      { \"VK_EXT_debug_marker\", \"VK_EXT_debug_utils\" },\n      { \"VK_AMD_draw_indirect_count\", \"VK_KHR_draw_indirect_count\" },\n      { \"VK_KHR_dynamic_rendering\", \"VK_VERSION_1_3\" },\n      { \"VK_KHR_multiview\", \"VK_VERSION_1_1\" },\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      { \"VK_NV_win32_keyed_mutex\", \"VK_KHR_win32_keyed_mutex\" },\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      { \"VK_KHR_get_physical_device_properties2\", \"VK_VERSION_1_1\" },\n      { \"VK_KHR_device_group\", \"VK_VERSION_1_1\" },\n      { \"VK_KHR_shader_draw_parameters\", \"VK_VERSION_1_1\" },\n      { \"VK_EXT_texture_compression_astc_hdr\", \"VK_VERSION_1_3\" },\n      { \"VK_EXT_pipeline_robustness\", \"VK_VERSION_1_4\" },\n      { \"VK_KHR_maintenance1\", \"VK_VERSION_1_1\" },\n      { \"VK_KHR_device_group_creation\", \"VK_VERSION_1_1\" },\n      { \"VK_KHR_external_memory_capabilities\", \"VK_VERSION_1_1\" },\n      { \"VK_KHR_external_memory\", \"VK_VERSION_1_1\" },\n      { \"VK_KHR_external_semaphore_capabilities\", \"VK_VERSION_1_1\" },\n      { \"VK_KHR_external_semaphore\", \"VK_VERSION_1_1\" },\n      { \"VK_KHR_push_descriptor\", \"VK_VERSION_1_4\" },\n      { \"VK_KHR_shader_float16_int8\", \"VK_VERSION_1_2\" },\n      { \"VK_KHR_16bit_storage\", \"VK_VERSION_1_1\" },\n      { \"VK_KHR_descriptor_update_template\", \"VK_VERSION_1_1\" },\n      { \"VK_KHR_imageless_framebuffer\", \"VK_VERSION_1_2\" },\n      { \"VK_KHR_create_renderpass2\", \"VK_VERSION_1_2\" },\n      { \"VK_KHR_external_fence_capabilities\", \"VK_VERSION_1_1\" },\n      { \"VK_KHR_external_fence\", \"VK_VERSION_1_1\" },\n      { \"VK_KHR_maintenance2\", \"VK_VERSION_1_1\" },\n      { \"VK_KHR_variable_pointers\", \"VK_VERSION_1_1\" },\n      { \"VK_KHR_dedicated_allocation\", \"VK_VERSION_1_1\" },\n      { \"VK_EXT_sampler_filter_minmax\", \"VK_VERSION_1_2\" },\n      { \"VK_KHR_storage_buffer_storage_class\", \"VK_VERSION_1_1\" },\n      { \"VK_EXT_inline_uniform_block\", \"VK_VERSION_1_3\" },\n      { \"VK_KHR_relaxed_block_layout\", \"VK_VERSION_1_1\" },\n      { \"VK_KHR_get_memory_requirements2\", \"VK_VERSION_1_1\" },\n      { \"VK_KHR_image_format_list\", \"VK_VERSION_1_2\" },\n      { \"VK_KHR_sampler_ycbcr_conversion\", \"VK_VERSION_1_1\" },\n      { \"VK_KHR_bind_memory2\", \"VK_VERSION_1_1\" },\n      { \"VK_EXT_descriptor_indexing\", \"VK_VERSION_1_2\" },\n      { \"VK_EXT_shader_viewport_index_layer\", \"VK_VERSION_1_2\" },\n      { \"VK_KHR_maintenance3\", \"VK_VERSION_1_1\" },\n      { \"VK_KHR_draw_indirect_count\", \"VK_VERSION_1_2\" },\n      { \"VK_EXT_global_priority\", \"VK_KHR_global_priority\" },\n      { \"VK_KHR_shader_subgroup_extended_types\", \"VK_VERSION_1_2\" },\n      { \"VK_KHR_8bit_storage\", \"VK_VERSION_1_2\" },\n      { \"VK_KHR_shader_atomic_int64\", \"VK_VERSION_1_2\" },\n      { \"VK_EXT_calibrated_timestamps\", \"VK_KHR_calibrated_timestamps\" },\n      { \"VK_KHR_global_priority\", \"VK_VERSION_1_4\" },\n      { \"VK_EXT_vertex_attribute_divisor\", \"VK_KHR_vertex_attribute_divisor\" },\n      { \"VK_EXT_pipeline_creation_feedback\", \"VK_VERSION_1_3\" },\n      { \"VK_KHR_driver_properties\", \"VK_VERSION_1_2\" },\n      { \"VK_KHR_shader_float_controls\", \"VK_VERSION_1_2\" },\n      { \"VK_KHR_depth_stencil_resolve\", \"VK_VERSION_1_2\" },\n      { \"VK_NV_compute_shader_derivatives\", \"VK_KHR_compute_shader_derivatives\" },\n      { \"VK_NV_fragment_shader_barycentric\", \"VK_KHR_fragment_shader_barycentric\" },\n      { \"VK_KHR_timeline_semaphore\", \"VK_VERSION_1_2\" },\n      { \"VK_KHR_vulkan_memory_model\", \"VK_VERSION_1_2\" },\n      { \"VK_KHR_shader_terminate_invocation\", \"VK_VERSION_1_3\" },\n      { \"VK_EXT_scalar_block_layout\", \"VK_VERSION_1_2\" },\n      { \"VK_EXT_subgroup_size_control\", \"VK_VERSION_1_3\" },\n      { \"VK_KHR_dynamic_rendering_local_read\", \"VK_VERSION_1_4\" },\n      { \"VK_KHR_spirv_1_4\", \"VK_VERSION_1_2\" },\n      { \"VK_KHR_separate_depth_stencil_layouts\", \"VK_VERSION_1_2\" },\n      { \"VK_EXT_tooling_info\", \"VK_VERSION_1_3\" },\n      { \"VK_EXT_separate_stencil_usage\", \"VK_VERSION_1_2\" },\n      { \"VK_KHR_uniform_buffer_standard_layout\", \"VK_VERSION_1_2\" },\n      { \"VK_KHR_buffer_device_address\", \"VK_VERSION_1_2\" },\n      { \"VK_EXT_line_rasterization\", \"VK_KHR_line_rasterization\" },\n      { \"VK_EXT_host_query_reset\", \"VK_VERSION_1_2\" },\n      { \"VK_EXT_index_type_uint8\", \"VK_KHR_index_type_uint8\" },\n      { \"VK_EXT_extended_dynamic_state\", \"VK_VERSION_1_3\" },\n      { \"VK_EXT_host_image_copy\", \"VK_VERSION_1_4\" },\n      { \"VK_KHR_map_memory2\", \"VK_VERSION_1_4\" },\n      { \"VK_EXT_shader_demote_to_helper_invocation\", \"VK_VERSION_1_3\" },\n      { \"VK_KHR_shader_integer_dot_product\", \"VK_VERSION_1_3\" },\n      { \"VK_EXT_texel_buffer_alignment\", \"VK_VERSION_1_3\" },\n      { \"VK_KHR_shader_non_semantic_info\", \"VK_VERSION_1_3\" },\n      { \"VK_EXT_private_data\", \"VK_VERSION_1_3\" },\n      { \"VK_EXT_pipeline_creation_cache_control\", \"VK_VERSION_1_3\" },\n      { \"VK_KHR_synchronization2\", \"VK_VERSION_1_3\" },\n      { \"VK_KHR_zero_initialize_workgroup_memory\", \"VK_VERSION_1_3\" },\n      { \"VK_EXT_ycbcr_2plane_444_formats\", \"VK_VERSION_1_3\" },\n      { \"VK_EXT_image_robustness\", \"VK_VERSION_1_3\" },\n      { \"VK_KHR_copy_commands2\", \"VK_VERSION_1_3\" },\n      { \"VK_EXT_4444_formats\", \"VK_VERSION_1_3\" },\n      { \"VK_ARM_rasterization_order_attachment_access\", \"VK_EXT_rasterization_order_attachment_access\" },\n      { \"VK_VALVE_mutable_descriptor_type\", \"VK_EXT_mutable_descriptor_type\" },\n      { \"VK_KHR_format_feature_flags2\", \"VK_VERSION_1_3\" },\n      { \"VK_EXT_extended_dynamic_state2\", \"VK_VERSION_1_3\" },\n      { \"VK_EXT_global_priority_query\", \"VK_KHR_global_priority\" },\n      { \"VK_EXT_load_store_op_none\", \"VK_KHR_load_store_op_none\" },\n      { \"VK_KHR_maintenance4\", \"VK_VERSION_1_3\" },\n      { \"VK_KHR_shader_subgroup_rotate\", \"VK_VERSION_1_4\" },\n      { \"VK_EXT_depth_clamp_zero_one\", \"VK_KHR_depth_clamp_zero_one\" },\n      { \"VK_EXT_pipeline_protected_access\", \"VK_VERSION_1_4\" },\n      { \"VK_KHR_maintenance5\", \"VK_VERSION_1_4\" },\n      { \"VK_KHR_vertex_attribute_divisor\", \"VK_VERSION_1_4\" },\n      { \"VK_KHR_load_store_op_none\", \"VK_VERSION_1_4\" },\n      { \"VK_KHR_shader_float_controls2\", \"VK_VERSION_1_4\" },\n      { \"VK_KHR_index_type_uint8\", \"VK_VERSION_1_4\" },\n      { \"VK_KHR_line_rasterization\", \"VK_VERSION_1_4\" },\n      { \"VK_KHR_shader_expect_assume\", \"VK_VERSION_1_4\" },\n      { \"VK_KHR_maintenance6\", \"VK_VERSION_1_4\" }\n    };\n    return promotedExtensions;\n  }\n\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_20 std::string getExtensionDeprecatedBy( std::string const & extension )\n  {\n    if ( extension == \"VK_EXT_debug_report\" )\n    {\n      return \"VK_EXT_debug_utils\";\n    }\n    if ( extension == \"VK_NV_glsl_shader\" )\n    {\n      return \"\";\n    }\n    if ( extension == \"VK_NV_dedicated_allocation\" )\n    {\n      return \"VK_KHR_dedicated_allocation\";\n    }\n    if ( extension == \"VK_AMD_gpu_shader_half_float\" )\n    {\n      return \"VK_KHR_shader_float16_int8\";\n    }\n    if ( extension == \"VK_IMG_format_pvrtc\" )\n    {\n      return \"\";\n    }\n    if ( extension == \"VK_NV_external_memory_capabilities\" )\n    {\n      return \"VK_KHR_external_memory_capabilities\";\n    }\n    if ( extension == \"VK_NV_external_memory\" )\n    {\n      return \"VK_KHR_external_memory\";\n    }\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n    if ( extension == \"VK_NV_external_memory_win32\" )\n    {\n      return \"VK_KHR_external_memory_win32\";\n    }\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n    if ( extension == \"VK_EXT_validation_flags\" )\n    {\n      return \"VK_EXT_layer_settings\";\n    }\n    if ( extension == \"VK_EXT_shader_subgroup_ballot\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_EXT_shader_subgroup_vote\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n#if defined( VK_USE_PLATFORM_IOS_MVK )\n    if ( extension == \"VK_MVK_ios_surface\" )\n    {\n      return \"VK_EXT_metal_surface\";\n    }\n#endif /*VK_USE_PLATFORM_IOS_MVK*/\n#if defined( VK_USE_PLATFORM_MACOS_MVK )\n    if ( extension == \"VK_MVK_macos_surface\" )\n    {\n      return \"VK_EXT_metal_surface\";\n    }\n#endif /*VK_USE_PLATFORM_MACOS_MVK*/\n    if ( extension == \"VK_AMD_gpu_shader_int16\" )\n    {\n      return \"VK_KHR_shader_float16_int8\";\n    }\n    if ( extension == \"VK_NV_ray_tracing\" )\n    {\n      return \"VK_KHR_ray_tracing_pipeline\";\n    }\n    if ( extension == \"VK_EXT_buffer_device_address\" )\n    {\n      return \"VK_KHR_buffer_device_address\";\n    }\n    if ( extension == \"VK_EXT_validation_features\" )\n    {\n      return \"VK_EXT_layer_settings\";\n    }\n    return \"\";\n  }\n\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_20 std::string getExtensionObsoletedBy( std::string const & extension )\n  {\n    if ( extension == \"VK_AMD_negative_viewport_height\" )\n    {\n      return \"VK_KHR_maintenance1\";\n    }\n    return \"\";\n  }\n\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_20 std::string getExtensionPromotedTo( std::string const & extension )\n  {\n    if ( extension == \"VK_KHR_sampler_mirror_clamp_to_edge\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_EXT_debug_marker\" )\n    {\n      return \"VK_EXT_debug_utils\";\n    }\n    if ( extension == \"VK_AMD_draw_indirect_count\" )\n    {\n      return \"VK_KHR_draw_indirect_count\";\n    }\n    if ( extension == \"VK_KHR_dynamic_rendering\" )\n    {\n      return \"VK_VERSION_1_3\";\n    }\n    if ( extension == \"VK_KHR_multiview\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n    if ( extension == \"VK_NV_win32_keyed_mutex\" )\n    {\n      return \"VK_KHR_win32_keyed_mutex\";\n    }\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n    if ( extension == \"VK_KHR_get_physical_device_properties2\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n    if ( extension == \"VK_KHR_device_group\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n    if ( extension == \"VK_KHR_shader_draw_parameters\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n    if ( extension == \"VK_EXT_texture_compression_astc_hdr\" )\n    {\n      return \"VK_VERSION_1_3\";\n    }\n    if ( extension == \"VK_EXT_pipeline_robustness\" )\n    {\n      return \"VK_VERSION_1_4\";\n    }\n    if ( extension == \"VK_KHR_maintenance1\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n    if ( extension == \"VK_KHR_device_group_creation\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n    if ( extension == \"VK_KHR_external_memory_capabilities\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n    if ( extension == \"VK_KHR_external_memory\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n    if ( extension == \"VK_KHR_external_semaphore_capabilities\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n    if ( extension == \"VK_KHR_external_semaphore\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n    if ( extension == \"VK_KHR_push_descriptor\" )\n    {\n      return \"VK_VERSION_1_4\";\n    }\n    if ( extension == \"VK_KHR_shader_float16_int8\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_KHR_16bit_storage\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n    if ( extension == \"VK_KHR_descriptor_update_template\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n    if ( extension == \"VK_KHR_imageless_framebuffer\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_KHR_create_renderpass2\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_KHR_external_fence_capabilities\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n    if ( extension == \"VK_KHR_external_fence\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n    if ( extension == \"VK_KHR_maintenance2\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n    if ( extension == \"VK_KHR_variable_pointers\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n    if ( extension == \"VK_KHR_dedicated_allocation\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n    if ( extension == \"VK_EXT_sampler_filter_minmax\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_KHR_storage_buffer_storage_class\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n    if ( extension == \"VK_EXT_inline_uniform_block\" )\n    {\n      return \"VK_VERSION_1_3\";\n    }\n    if ( extension == \"VK_KHR_relaxed_block_layout\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n    if ( extension == \"VK_KHR_get_memory_requirements2\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n    if ( extension == \"VK_KHR_image_format_list\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_KHR_sampler_ycbcr_conversion\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n    if ( extension == \"VK_KHR_bind_memory2\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n    if ( extension == \"VK_EXT_descriptor_indexing\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_EXT_shader_viewport_index_layer\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_KHR_maintenance3\" )\n    {\n      return \"VK_VERSION_1_1\";\n    }\n    if ( extension == \"VK_KHR_draw_indirect_count\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_EXT_global_priority\" )\n    {\n      return \"VK_KHR_global_priority\";\n    }\n    if ( extension == \"VK_KHR_shader_subgroup_extended_types\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_KHR_8bit_storage\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_KHR_shader_atomic_int64\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_EXT_calibrated_timestamps\" )\n    {\n      return \"VK_KHR_calibrated_timestamps\";\n    }\n    if ( extension == \"VK_KHR_global_priority\" )\n    {\n      return \"VK_VERSION_1_4\";\n    }\n    if ( extension == \"VK_EXT_vertex_attribute_divisor\" )\n    {\n      return \"VK_KHR_vertex_attribute_divisor\";\n    }\n    if ( extension == \"VK_EXT_pipeline_creation_feedback\" )\n    {\n      return \"VK_VERSION_1_3\";\n    }\n    if ( extension == \"VK_KHR_driver_properties\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_KHR_shader_float_controls\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_KHR_depth_stencil_resolve\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_NV_compute_shader_derivatives\" )\n    {\n      return \"VK_KHR_compute_shader_derivatives\";\n    }\n    if ( extension == \"VK_NV_fragment_shader_barycentric\" )\n    {\n      return \"VK_KHR_fragment_shader_barycentric\";\n    }\n    if ( extension == \"VK_KHR_timeline_semaphore\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_KHR_vulkan_memory_model\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_KHR_shader_terminate_invocation\" )\n    {\n      return \"VK_VERSION_1_3\";\n    }\n    if ( extension == \"VK_EXT_scalar_block_layout\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_EXT_subgroup_size_control\" )\n    {\n      return \"VK_VERSION_1_3\";\n    }\n    if ( extension == \"VK_KHR_dynamic_rendering_local_read\" )\n    {\n      return \"VK_VERSION_1_4\";\n    }\n    if ( extension == \"VK_KHR_spirv_1_4\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_KHR_separate_depth_stencil_layouts\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_EXT_tooling_info\" )\n    {\n      return \"VK_VERSION_1_3\";\n    }\n    if ( extension == \"VK_EXT_separate_stencil_usage\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_KHR_uniform_buffer_standard_layout\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_KHR_buffer_device_address\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_EXT_line_rasterization\" )\n    {\n      return \"VK_KHR_line_rasterization\";\n    }\n    if ( extension == \"VK_EXT_host_query_reset\" )\n    {\n      return \"VK_VERSION_1_2\";\n    }\n    if ( extension == \"VK_EXT_index_type_uint8\" )\n    {\n      return \"VK_KHR_index_type_uint8\";\n    }\n    if ( extension == \"VK_EXT_extended_dynamic_state\" )\n    {\n      return \"VK_VERSION_1_3\";\n    }\n    if ( extension == \"VK_EXT_host_image_copy\" )\n    {\n      return \"VK_VERSION_1_4\";\n    }\n    if ( extension == \"VK_KHR_map_memory2\" )\n    {\n      return \"VK_VERSION_1_4\";\n    }\n    if ( extension == \"VK_EXT_shader_demote_to_helper_invocation\" )\n    {\n      return \"VK_VERSION_1_3\";\n    }\n    if ( extension == \"VK_KHR_shader_integer_dot_product\" )\n    {\n      return \"VK_VERSION_1_3\";\n    }\n    if ( extension == \"VK_EXT_texel_buffer_alignment\" )\n    {\n      return \"VK_VERSION_1_3\";\n    }\n    if ( extension == \"VK_KHR_shader_non_semantic_info\" )\n    {\n      return \"VK_VERSION_1_3\";\n    }\n    if ( extension == \"VK_EXT_private_data\" )\n    {\n      return \"VK_VERSION_1_3\";\n    }\n    if ( extension == \"VK_EXT_pipeline_creation_cache_control\" )\n    {\n      return \"VK_VERSION_1_3\";\n    }\n    if ( extension == \"VK_KHR_synchronization2\" )\n    {\n      return \"VK_VERSION_1_3\";\n    }\n    if ( extension == \"VK_KHR_zero_initialize_workgroup_memory\" )\n    {\n      return \"VK_VERSION_1_3\";\n    }\n    if ( extension == \"VK_EXT_ycbcr_2plane_444_formats\" )\n    {\n      return \"VK_VERSION_1_3\";\n    }\n    if ( extension == \"VK_EXT_image_robustness\" )\n    {\n      return \"VK_VERSION_1_3\";\n    }\n    if ( extension == \"VK_KHR_copy_commands2\" )\n    {\n      return \"VK_VERSION_1_3\";\n    }\n    if ( extension == \"VK_EXT_4444_formats\" )\n    {\n      return \"VK_VERSION_1_3\";\n    }\n    if ( extension == \"VK_ARM_rasterization_order_attachment_access\" )\n    {\n      return \"VK_EXT_rasterization_order_attachment_access\";\n    }\n    if ( extension == \"VK_VALVE_mutable_descriptor_type\" )\n    {\n      return \"VK_EXT_mutable_descriptor_type\";\n    }\n    if ( extension == \"VK_KHR_format_feature_flags2\" )\n    {\n      return \"VK_VERSION_1_3\";\n    }\n    if ( extension == \"VK_EXT_extended_dynamic_state2\" )\n    {\n      return \"VK_VERSION_1_3\";\n    }\n    if ( extension == \"VK_EXT_global_priority_query\" )\n    {\n      return \"VK_KHR_global_priority\";\n    }\n    if ( extension == \"VK_EXT_load_store_op_none\" )\n    {\n      return \"VK_KHR_load_store_op_none\";\n    }\n    if ( extension == \"VK_KHR_maintenance4\" )\n    {\n      return \"VK_VERSION_1_3\";\n    }\n    if ( extension == \"VK_KHR_shader_subgroup_rotate\" )\n    {\n      return \"VK_VERSION_1_4\";\n    }\n    if ( extension == \"VK_EXT_depth_clamp_zero_one\" )\n    {\n      return \"VK_KHR_depth_clamp_zero_one\";\n    }\n    if ( extension == \"VK_EXT_pipeline_protected_access\" )\n    {\n      return \"VK_VERSION_1_4\";\n    }\n    if ( extension == \"VK_KHR_maintenance5\" )\n    {\n      return \"VK_VERSION_1_4\";\n    }\n    if ( extension == \"VK_KHR_vertex_attribute_divisor\" )\n    {\n      return \"VK_VERSION_1_4\";\n    }\n    if ( extension == \"VK_KHR_load_store_op_none\" )\n    {\n      return \"VK_VERSION_1_4\";\n    }\n    if ( extension == \"VK_KHR_shader_float_controls2\" )\n    {\n      return \"VK_VERSION_1_4\";\n    }\n    if ( extension == \"VK_KHR_index_type_uint8\" )\n    {\n      return \"VK_VERSION_1_4\";\n    }\n    if ( extension == \"VK_KHR_line_rasterization\" )\n    {\n      return \"VK_VERSION_1_4\";\n    }\n    if ( extension == \"VK_KHR_shader_expect_assume\" )\n    {\n      return \"VK_VERSION_1_4\";\n    }\n    if ( extension == \"VK_KHR_maintenance6\" )\n    {\n      return \"VK_VERSION_1_4\";\n    }\n    return \"\";\n  }\n\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_20 bool isDeprecatedExtension( std::string const & extension )\n  {\n    return ( extension == \"VK_EXT_debug_report\" ) || ( extension == \"VK_NV_glsl_shader\" ) || ( extension == \"VK_NV_dedicated_allocation\" ) ||\n           ( extension == \"VK_AMD_gpu_shader_half_float\" ) || ( extension == \"VK_IMG_format_pvrtc\" ) || ( extension == \"VK_NV_external_memory_capabilities\" ) ||\n           ( extension == \"VK_NV_external_memory\" ) ||\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n           ( extension == \"VK_NV_external_memory_win32\" ) ||\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n           ( extension == \"VK_EXT_validation_flags\" ) || ( extension == \"VK_EXT_shader_subgroup_ballot\" ) || ( extension == \"VK_EXT_shader_subgroup_vote\" ) ||\n#if defined( VK_USE_PLATFORM_IOS_MVK )\n           ( extension == \"VK_MVK_ios_surface\" ) ||\n#endif /*VK_USE_PLATFORM_IOS_MVK*/\n#if defined( VK_USE_PLATFORM_MACOS_MVK )\n           ( extension == \"VK_MVK_macos_surface\" ) ||\n#endif /*VK_USE_PLATFORM_MACOS_MVK*/\n           ( extension == \"VK_AMD_gpu_shader_int16\" ) || ( extension == \"VK_NV_ray_tracing\" ) || ( extension == \"VK_EXT_buffer_device_address\" ) ||\n           ( extension == \"VK_EXT_validation_features\" );\n  }\n\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_20 bool isDeviceExtension( std::string const & extension )\n  {\n    return ( extension == \"VK_KHR_swapchain\" ) || ( extension == \"VK_KHR_display_swapchain\" ) || ( extension == \"VK_NV_glsl_shader\" ) ||\n           ( extension == \"VK_EXT_depth_range_unrestricted\" ) || ( extension == \"VK_KHR_sampler_mirror_clamp_to_edge\" ) ||\n           ( extension == \"VK_IMG_filter_cubic\" ) || ( extension == \"VK_AMD_rasterization_order\" ) || ( extension == \"VK_AMD_shader_trinary_minmax\" ) ||\n           ( extension == \"VK_AMD_shader_explicit_vertex_parameter\" ) || ( extension == \"VK_EXT_debug_marker\" ) || ( extension == \"VK_KHR_video_queue\" ) ||\n           ( extension == \"VK_KHR_video_decode_queue\" ) || ( extension == \"VK_AMD_gcn_shader\" ) || ( extension == \"VK_NV_dedicated_allocation\" ) ||\n           ( extension == \"VK_EXT_transform_feedback\" ) || ( extension == \"VK_NVX_binary_import\" ) || ( extension == \"VK_NVX_image_view_handle\" ) ||\n           ( extension == \"VK_AMD_draw_indirect_count\" ) || ( extension == \"VK_AMD_negative_viewport_height\" ) ||\n           ( extension == \"VK_AMD_gpu_shader_half_float\" ) || ( extension == \"VK_AMD_shader_ballot\" ) || ( extension == \"VK_KHR_video_encode_h264\" ) ||\n           ( extension == \"VK_KHR_video_encode_h265\" ) || ( extension == \"VK_KHR_video_decode_h264\" ) || ( extension == \"VK_AMD_texture_gather_bias_lod\" ) ||\n           ( extension == \"VK_AMD_shader_info\" ) || ( extension == \"VK_KHR_dynamic_rendering\" ) || ( extension == \"VK_AMD_shader_image_load_store_lod\" ) ||\n           ( extension == \"VK_NV_corner_sampled_image\" ) || ( extension == \"VK_KHR_multiview\" ) || ( extension == \"VK_IMG_format_pvrtc\" ) ||\n           ( extension == \"VK_NV_external_memory\" )\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n        || ( extension == \"VK_NV_external_memory_win32\" ) || ( extension == \"VK_NV_win32_keyed_mutex\" )\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n        || ( extension == \"VK_KHR_device_group\" ) || ( extension == \"VK_KHR_shader_draw_parameters\" ) || ( extension == \"VK_EXT_shader_subgroup_ballot\" ) ||\n           ( extension == \"VK_EXT_shader_subgroup_vote\" ) || ( extension == \"VK_EXT_texture_compression_astc_hdr\" ) ||\n           ( extension == \"VK_EXT_astc_decode_mode\" ) || ( extension == \"VK_EXT_pipeline_robustness\" ) || ( extension == \"VK_KHR_maintenance1\" ) ||\n           ( extension == \"VK_KHR_external_memory\" )\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n        || ( extension == \"VK_KHR_external_memory_win32\" )\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n        || ( extension == \"VK_KHR_external_memory_fd\" )\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n        || ( extension == \"VK_KHR_win32_keyed_mutex\" )\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n        || ( extension == \"VK_KHR_external_semaphore\" )\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n        || ( extension == \"VK_KHR_external_semaphore_win32\" )\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n        || ( extension == \"VK_KHR_external_semaphore_fd\" ) || ( extension == \"VK_KHR_push_descriptor\" ) || ( extension == \"VK_EXT_conditional_rendering\" ) ||\n           ( extension == \"VK_KHR_shader_float16_int8\" ) || ( extension == \"VK_KHR_16bit_storage\" ) || ( extension == \"VK_KHR_incremental_present\" ) ||\n           ( extension == \"VK_KHR_descriptor_update_template\" ) || ( extension == \"VK_NV_clip_space_w_scaling\" ) || ( extension == \"VK_EXT_display_control\" ) ||\n           ( extension == \"VK_GOOGLE_display_timing\" ) || ( extension == \"VK_NV_sample_mask_override_coverage\" ) ||\n           ( extension == \"VK_NV_geometry_shader_passthrough\" ) || ( extension == \"VK_NV_viewport_array2\" ) ||\n           ( extension == \"VK_NVX_multiview_per_view_attributes\" ) || ( extension == \"VK_NV_viewport_swizzle\" ) ||\n           ( extension == \"VK_EXT_discard_rectangles\" ) || ( extension == \"VK_EXT_conservative_rasterization\" ) ||\n           ( extension == \"VK_EXT_depth_clip_enable\" ) || ( extension == \"VK_EXT_hdr_metadata\" ) || ( extension == \"VK_KHR_imageless_framebuffer\" ) ||\n           ( extension == \"VK_KHR_create_renderpass2\" ) || ( extension == \"VK_IMG_relaxed_line_rasterization\" ) ||\n           ( extension == \"VK_KHR_shared_presentable_image\" ) || ( extension == \"VK_KHR_external_fence\" )\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n        || ( extension == \"VK_KHR_external_fence_win32\" )\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n        || ( extension == \"VK_KHR_external_fence_fd\" ) || ( extension == \"VK_KHR_performance_query\" ) || ( extension == \"VK_KHR_maintenance2\" ) ||\n           ( extension == \"VK_KHR_variable_pointers\" ) || ( extension == \"VK_EXT_external_memory_dma_buf\" ) || ( extension == \"VK_EXT_queue_family_foreign\" ) ||\n           ( extension == \"VK_KHR_dedicated_allocation\" )\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n        || ( extension == \"VK_ANDROID_external_memory_android_hardware_buffer\" )\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n        || ( extension == \"VK_EXT_sampler_filter_minmax\" ) || ( extension == \"VK_KHR_storage_buffer_storage_class\" ) ||\n           ( extension == \"VK_AMD_gpu_shader_int16\" )\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n        || ( extension == \"VK_AMDX_shader_enqueue\" )\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n        || ( extension == \"VK_AMD_mixed_attachment_samples\" ) || ( extension == \"VK_AMD_shader_fragment_mask\" ) ||\n           ( extension == \"VK_EXT_inline_uniform_block\" ) || ( extension == \"VK_EXT_shader_stencil_export\" ) || ( extension == \"VK_EXT_sample_locations\" ) ||\n           ( extension == \"VK_KHR_relaxed_block_layout\" ) || ( extension == \"VK_KHR_get_memory_requirements2\" ) ||\n           ( extension == \"VK_KHR_image_format_list\" ) || ( extension == \"VK_EXT_blend_operation_advanced\" ) ||\n           ( extension == \"VK_NV_fragment_coverage_to_color\" ) || ( extension == \"VK_KHR_acceleration_structure\" ) ||\n           ( extension == \"VK_KHR_ray_tracing_pipeline\" ) || ( extension == \"VK_KHR_ray_query\" ) || ( extension == \"VK_NV_framebuffer_mixed_samples\" ) ||\n           ( extension == \"VK_NV_fill_rectangle\" ) || ( extension == \"VK_NV_shader_sm_builtins\" ) || ( extension == \"VK_EXT_post_depth_coverage\" ) ||\n           ( extension == \"VK_KHR_sampler_ycbcr_conversion\" ) || ( extension == \"VK_KHR_bind_memory2\" ) ||\n           ( extension == \"VK_EXT_image_drm_format_modifier\" ) || ( extension == \"VK_EXT_validation_cache\" ) || ( extension == \"VK_EXT_descriptor_indexing\" ) ||\n           ( extension == \"VK_EXT_shader_viewport_index_layer\" )\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n        || ( extension == \"VK_KHR_portability_subset\" )\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n        || ( extension == \"VK_NV_shading_rate_image\" ) || ( extension == \"VK_NV_ray_tracing\" ) || ( extension == \"VK_NV_representative_fragment_test\" ) ||\n           ( extension == \"VK_KHR_maintenance3\" ) || ( extension == \"VK_KHR_draw_indirect_count\" ) || ( extension == \"VK_EXT_filter_cubic\" ) ||\n           ( extension == \"VK_QCOM_render_pass_shader_resolve\" ) || ( extension == \"VK_EXT_global_priority\" ) ||\n           ( extension == \"VK_KHR_shader_subgroup_extended_types\" ) || ( extension == \"VK_KHR_8bit_storage\" ) ||\n           ( extension == \"VK_EXT_external_memory_host\" ) || ( extension == \"VK_AMD_buffer_marker\" ) || ( extension == \"VK_KHR_shader_atomic_int64\" ) ||\n           ( extension == \"VK_KHR_shader_clock\" ) || ( extension == \"VK_AMD_pipeline_compiler_control\" ) || ( extension == \"VK_EXT_calibrated_timestamps\" ) ||\n           ( extension == \"VK_AMD_shader_core_properties\" ) || ( extension == \"VK_KHR_video_decode_h265\" ) || ( extension == \"VK_KHR_global_priority\" ) ||\n           ( extension == \"VK_AMD_memory_overallocation_behavior\" ) || ( extension == \"VK_EXT_vertex_attribute_divisor\" )\n#if defined( VK_USE_PLATFORM_GGP )\n        || ( extension == \"VK_GGP_frame_token\" )\n#endif /*VK_USE_PLATFORM_GGP*/\n        || ( extension == \"VK_EXT_pipeline_creation_feedback\" ) || ( extension == \"VK_KHR_driver_properties\" ) ||\n           ( extension == \"VK_KHR_shader_float_controls\" ) || ( extension == \"VK_NV_shader_subgroup_partitioned\" ) ||\n           ( extension == \"VK_KHR_depth_stencil_resolve\" ) || ( extension == \"VK_KHR_swapchain_mutable_format\" ) ||\n           ( extension == \"VK_NV_compute_shader_derivatives\" ) || ( extension == \"VK_NV_mesh_shader\" ) ||\n           ( extension == \"VK_NV_fragment_shader_barycentric\" ) || ( extension == \"VK_NV_shader_image_footprint\" ) ||\n           ( extension == \"VK_NV_scissor_exclusive\" ) || ( extension == \"VK_NV_device_diagnostic_checkpoints\" ) ||\n           ( extension == \"VK_KHR_timeline_semaphore\" ) || ( extension == \"VK_INTEL_shader_integer_functions2\" ) ||\n           ( extension == \"VK_INTEL_performance_query\" ) || ( extension == \"VK_KHR_vulkan_memory_model\" ) || ( extension == \"VK_EXT_pci_bus_info\" ) ||\n           ( extension == \"VK_AMD_display_native_hdr\" ) || ( extension == \"VK_KHR_shader_terminate_invocation\" ) ||\n           ( extension == \"VK_EXT_fragment_density_map\" ) || ( extension == \"VK_EXT_scalar_block_layout\" ) ||\n           ( extension == \"VK_GOOGLE_hlsl_functionality1\" ) || ( extension == \"VK_GOOGLE_decorate_string\" ) ||\n           ( extension == \"VK_EXT_subgroup_size_control\" ) || ( extension == \"VK_KHR_fragment_shading_rate\" ) ||\n           ( extension == \"VK_AMD_shader_core_properties2\" ) || ( extension == \"VK_AMD_device_coherent_memory\" ) ||\n           ( extension == \"VK_KHR_dynamic_rendering_local_read\" ) || ( extension == \"VK_EXT_shader_image_atomic_int64\" ) ||\n           ( extension == \"VK_KHR_shader_quad_control\" ) || ( extension == \"VK_KHR_spirv_1_4\" ) || ( extension == \"VK_EXT_memory_budget\" ) ||\n           ( extension == \"VK_EXT_memory_priority\" ) || ( extension == \"VK_NV_dedicated_allocation_image_aliasing\" ) ||\n           ( extension == \"VK_KHR_separate_depth_stencil_layouts\" ) || ( extension == \"VK_EXT_buffer_device_address\" ) ||\n           ( extension == \"VK_EXT_tooling_info\" ) || ( extension == \"VK_EXT_separate_stencil_usage\" ) || ( extension == \"VK_KHR_present_wait\" ) ||\n           ( extension == \"VK_NV_cooperative_matrix\" ) || ( extension == \"VK_NV_coverage_reduction_mode\" ) ||\n           ( extension == \"VK_EXT_fragment_shader_interlock\" ) || ( extension == \"VK_EXT_ycbcr_image_arrays\" ) ||\n           ( extension == \"VK_KHR_uniform_buffer_standard_layout\" ) || ( extension == \"VK_EXT_provoking_vertex\" )\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n        || ( extension == \"VK_EXT_full_screen_exclusive\" )\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n        || ( extension == \"VK_KHR_buffer_device_address\" ) || ( extension == \"VK_EXT_line_rasterization\" ) || ( extension == \"VK_EXT_shader_atomic_float\" ) ||\n           ( extension == \"VK_EXT_host_query_reset\" ) || ( extension == \"VK_EXT_index_type_uint8\" ) || ( extension == \"VK_EXT_extended_dynamic_state\" ) ||\n           ( extension == \"VK_KHR_deferred_host_operations\" ) || ( extension == \"VK_KHR_pipeline_executable_properties\" ) ||\n           ( extension == \"VK_EXT_host_image_copy\" ) || ( extension == \"VK_KHR_map_memory2\" ) || ( extension == \"VK_EXT_map_memory_placed\" ) ||\n           ( extension == \"VK_EXT_shader_atomic_float2\" ) || ( extension == \"VK_EXT_swapchain_maintenance1\" ) ||\n           ( extension == \"VK_EXT_shader_demote_to_helper_invocation\" ) || ( extension == \"VK_NV_device_generated_commands\" ) ||\n           ( extension == \"VK_NV_inherited_viewport_scissor\" ) || ( extension == \"VK_KHR_shader_integer_dot_product\" ) ||\n           ( extension == \"VK_EXT_texel_buffer_alignment\" ) || ( extension == \"VK_QCOM_render_pass_transform\" ) ||\n           ( extension == \"VK_EXT_depth_bias_control\" ) || ( extension == \"VK_EXT_device_memory_report\" ) || ( extension == \"VK_EXT_robustness2\" ) ||\n           ( extension == \"VK_EXT_custom_border_color\" ) || ( extension == \"VK_GOOGLE_user_type\" ) || ( extension == \"VK_KHR_pipeline_library\" ) ||\n           ( extension == \"VK_NV_present_barrier\" ) || ( extension == \"VK_KHR_shader_non_semantic_info\" ) || ( extension == \"VK_KHR_present_id\" ) ||\n           ( extension == \"VK_EXT_private_data\" ) || ( extension == \"VK_EXT_pipeline_creation_cache_control\" ) ||\n           ( extension == \"VK_KHR_video_encode_queue\" ) || ( extension == \"VK_NV_device_diagnostics_config\" ) ||\n           ( extension == \"VK_QCOM_render_pass_store_ops\" )\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n        || ( extension == \"VK_NV_cuda_kernel_launch\" )\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n        || ( extension == \"VK_NV_low_latency\" )\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n        || ( extension == \"VK_EXT_metal_objects\" )\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n        || ( extension == \"VK_KHR_synchronization2\" ) || ( extension == \"VK_EXT_descriptor_buffer\" ) || ( extension == \"VK_EXT_graphics_pipeline_library\" ) ||\n           ( extension == \"VK_AMD_shader_early_and_late_fragment_tests\" ) || ( extension == \"VK_KHR_fragment_shader_barycentric\" ) ||\n           ( extension == \"VK_KHR_shader_subgroup_uniform_control_flow\" ) || ( extension == \"VK_KHR_zero_initialize_workgroup_memory\" ) ||\n           ( extension == \"VK_NV_fragment_shading_rate_enums\" ) || ( extension == \"VK_NV_ray_tracing_motion_blur\" ) || ( extension == \"VK_EXT_mesh_shader\" ) ||\n           ( extension == \"VK_EXT_ycbcr_2plane_444_formats\" ) || ( extension == \"VK_EXT_fragment_density_map2\" ) ||\n           ( extension == \"VK_QCOM_rotated_copy_commands\" ) || ( extension == \"VK_EXT_image_robustness\" ) ||\n           ( extension == \"VK_KHR_workgroup_memory_explicit_layout\" ) || ( extension == \"VK_KHR_copy_commands2\" ) ||\n           ( extension == \"VK_EXT_image_compression_control\" ) || ( extension == \"VK_EXT_attachment_feedback_loop_layout\" ) ||\n           ( extension == \"VK_EXT_4444_formats\" ) || ( extension == \"VK_EXT_device_fault\" ) ||\n           ( extension == \"VK_ARM_rasterization_order_attachment_access\" ) || ( extension == \"VK_EXT_rgba10x6_formats\" )\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n        || ( extension == \"VK_NV_acquire_winrt_display\" )\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n        || ( extension == \"VK_VALVE_mutable_descriptor_type\" ) || ( extension == \"VK_EXT_vertex_input_dynamic_state\" ) ||\n           ( extension == \"VK_EXT_physical_device_drm\" ) || ( extension == \"VK_EXT_device_address_binding_report\" ) ||\n           ( extension == \"VK_EXT_depth_clip_control\" ) || ( extension == \"VK_EXT_primitive_topology_list_restart\" ) ||\n           ( extension == \"VK_KHR_format_feature_flags2\" ) || ( extension == \"VK_EXT_present_mode_fifo_latest_ready\" )\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n        || ( extension == \"VK_FUCHSIA_external_memory\" ) || ( extension == \"VK_FUCHSIA_external_semaphore\" ) || ( extension == \"VK_FUCHSIA_buffer_collection\" )\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n        || ( extension == \"VK_HUAWEI_subpass_shading\" ) || ( extension == \"VK_HUAWEI_invocation_mask\" ) || ( extension == \"VK_NV_external_memory_rdma\" ) ||\n           ( extension == \"VK_EXT_pipeline_properties\" ) || ( extension == \"VK_EXT_frame_boundary\" ) ||\n           ( extension == \"VK_EXT_multisampled_render_to_single_sampled\" ) || ( extension == \"VK_EXT_extended_dynamic_state2\" ) ||\n           ( extension == \"VK_EXT_color_write_enable\" ) || ( extension == \"VK_EXT_primitives_generated_query\" ) ||\n           ( extension == \"VK_KHR_ray_tracing_maintenance1\" ) || ( extension == \"VK_EXT_global_priority_query\" ) ||\n           ( extension == \"VK_EXT_image_view_min_lod\" ) || ( extension == \"VK_EXT_multi_draw\" ) || ( extension == \"VK_EXT_image_2d_view_of_3d\" ) ||\n           ( extension == \"VK_EXT_shader_tile_image\" ) || ( extension == \"VK_EXT_opacity_micromap\" )\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n        || ( extension == \"VK_NV_displacement_micromap\" )\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n        || ( extension == \"VK_EXT_load_store_op_none\" ) || ( extension == \"VK_HUAWEI_cluster_culling_shader\" ) ||\n           ( extension == \"VK_EXT_border_color_swizzle\" ) || ( extension == \"VK_EXT_pageable_device_local_memory\" ) || ( extension == \"VK_KHR_maintenance4\" ) ||\n           ( extension == \"VK_ARM_shader_core_properties\" ) || ( extension == \"VK_KHR_shader_subgroup_rotate\" ) ||\n           ( extension == \"VK_ARM_scheduling_controls\" ) || ( extension == \"VK_EXT_image_sliced_view_of_3d\" ) ||\n           ( extension == \"VK_VALVE_descriptor_set_host_mapping\" ) || ( extension == \"VK_EXT_depth_clamp_zero_one\" ) ||\n           ( extension == \"VK_EXT_non_seamless_cube_map\" ) || ( extension == \"VK_ARM_render_pass_striped\" ) ||\n           ( extension == \"VK_QCOM_fragment_density_map_offset\" ) || ( extension == \"VK_NV_copy_memory_indirect\" ) ||\n           ( extension == \"VK_NV_memory_decompression\" ) || ( extension == \"VK_NV_device_generated_commands_compute\" ) ||\n           ( extension == \"VK_NV_ray_tracing_linear_swept_spheres\" ) || ( extension == \"VK_NV_linear_color_attachment\" ) ||\n           ( extension == \"VK_KHR_shader_maximal_reconvergence\" ) || ( extension == \"VK_EXT_image_compression_control_swapchain\" ) ||\n           ( extension == \"VK_QCOM_image_processing\" ) || ( extension == \"VK_EXT_nested_command_buffer\" ) ||\n           ( extension == \"VK_EXT_external_memory_acquire_unmodified\" ) || ( extension == \"VK_EXT_extended_dynamic_state3\" ) ||\n           ( extension == \"VK_EXT_subpass_merge_feedback\" ) || ( extension == \"VK_EXT_shader_module_identifier\" ) ||\n           ( extension == \"VK_EXT_rasterization_order_attachment_access\" ) || ( extension == \"VK_NV_optical_flow\" ) ||\n           ( extension == \"VK_EXT_legacy_dithering\" ) || ( extension == \"VK_EXT_pipeline_protected_access\" )\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n        || ( extension == \"VK_ANDROID_external_format_resolve\" )\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n        || ( extension == \"VK_KHR_maintenance5\" ) || ( extension == \"VK_AMD_anti_lag\" ) || ( extension == \"VK_KHR_ray_tracing_position_fetch\" ) ||\n           ( extension == \"VK_EXT_shader_object\" ) || ( extension == \"VK_KHR_pipeline_binary\" ) || ( extension == \"VK_QCOM_tile_properties\" ) ||\n           ( extension == \"VK_SEC_amigo_profiling\" ) || ( extension == \"VK_QCOM_multiview_per_view_viewports\" ) ||\n           ( extension == \"VK_NV_ray_tracing_invocation_reorder\" ) || ( extension == \"VK_NV_cooperative_vector\" ) ||\n           ( extension == \"VK_NV_extended_sparse_address_space\" ) || ( extension == \"VK_EXT_mutable_descriptor_type\" ) ||\n           ( extension == \"VK_EXT_legacy_vertex_attributes\" ) || ( extension == \"VK_ARM_shader_core_builtins\" ) ||\n           ( extension == \"VK_EXT_pipeline_library_group_handles\" ) || ( extension == \"VK_EXT_dynamic_rendering_unused_attachments\" ) ||\n           ( extension == \"VK_NV_low_latency2\" ) || ( extension == \"VK_KHR_cooperative_matrix\" ) ||\n           ( extension == \"VK_QCOM_multiview_per_view_render_areas\" ) || ( extension == \"VK_KHR_compute_shader_derivatives\" ) ||\n           ( extension == \"VK_KHR_video_decode_av1\" ) || ( extension == \"VK_KHR_video_encode_av1\" ) || ( extension == \"VK_KHR_video_maintenance1\" ) ||\n           ( extension == \"VK_NV_per_stage_descriptor_set\" ) || ( extension == \"VK_QCOM_image_processing2\" ) ||\n           ( extension == \"VK_QCOM_filter_cubic_weights\" ) || ( extension == \"VK_QCOM_ycbcr_degamma\" ) || ( extension == \"VK_QCOM_filter_cubic_clamp\" ) ||\n           ( extension == \"VK_EXT_attachment_feedback_loop_dynamic_state\" ) || ( extension == \"VK_KHR_vertex_attribute_divisor\" ) ||\n           ( extension == \"VK_KHR_load_store_op_none\" ) || ( extension == \"VK_KHR_shader_float_controls2\" )\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n        || ( extension == \"VK_QNX_external_memory_screen_buffer\" )\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n        || ( extension == \"VK_MSFT_layered_driver\" ) || ( extension == \"VK_KHR_index_type_uint8\" ) || ( extension == \"VK_KHR_line_rasterization\" ) ||\n           ( extension == \"VK_KHR_calibrated_timestamps\" ) || ( extension == \"VK_KHR_shader_expect_assume\" ) || ( extension == \"VK_KHR_maintenance6\" ) ||\n           ( extension == \"VK_NV_descriptor_pool_overallocation\" ) || ( extension == \"VK_KHR_video_encode_quantization_map\" ) ||\n           ( extension == \"VK_NV_raw_access_chains\" ) || ( extension == \"VK_KHR_shader_relaxed_extended_instruction\" ) ||\n           ( extension == \"VK_NV_command_buffer_inheritance\" ) || ( extension == \"VK_KHR_maintenance7\" ) ||\n           ( extension == \"VK_NV_shader_atomic_float16_vector\" ) || ( extension == \"VK_EXT_shader_replicated_composites\" ) ||\n           ( extension == \"VK_NV_ray_tracing_validation\" ) || ( extension == \"VK_NV_cluster_acceleration_structure\" ) ||\n           ( extension == \"VK_NV_partitioned_acceleration_structure\" ) || ( extension == \"VK_EXT_device_generated_commands\" ) ||\n           ( extension == \"VK_KHR_maintenance8\" ) || ( extension == \"VK_MESA_image_alignment_control\" ) || ( extension == \"VK_EXT_depth_clamp_control\" ) ||\n           ( extension == \"VK_KHR_video_maintenance2\" ) || ( extension == \"VK_HUAWEI_hdr_vivid\" ) || ( extension == \"VK_NV_cooperative_matrix2\" ) ||\n           ( extension == \"VK_ARM_pipeline_opacity_micromap\" )\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n        || ( extension == \"VK_EXT_external_memory_metal\" )\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n        || ( extension == \"VK_KHR_depth_clamp_zero_one\" ) || ( extension == \"VK_EXT_vertex_attribute_robustness\" );\n  }\n\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_20 bool isInstanceExtension( std::string const & extension )\n  {\n    return ( extension == \"VK_KHR_surface\" ) || ( extension == \"VK_KHR_display\" )\n#if defined( VK_USE_PLATFORM_XLIB_KHR )\n        || ( extension == \"VK_KHR_xlib_surface\" )\n#endif /*VK_USE_PLATFORM_XLIB_KHR*/\n#if defined( VK_USE_PLATFORM_XCB_KHR )\n        || ( extension == \"VK_KHR_xcb_surface\" )\n#endif /*VK_USE_PLATFORM_XCB_KHR*/\n#if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n        || ( extension == \"VK_KHR_wayland_surface\" )\n#endif /*VK_USE_PLATFORM_WAYLAND_KHR*/\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n        || ( extension == \"VK_KHR_android_surface\" )\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n        || ( extension == \"VK_KHR_win32_surface\" )\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n        || ( extension == \"VK_EXT_debug_report\" )\n#if defined( VK_USE_PLATFORM_GGP )\n        || ( extension == \"VK_GGP_stream_descriptor_surface\" )\n#endif /*VK_USE_PLATFORM_GGP*/\n        || ( extension == \"VK_NV_external_memory_capabilities\" ) || ( extension == \"VK_KHR_get_physical_device_properties2\" ) ||\n           ( extension == \"VK_EXT_validation_flags\" )\n#if defined( VK_USE_PLATFORM_VI_NN )\n        || ( extension == \"VK_NN_vi_surface\" )\n#endif /*VK_USE_PLATFORM_VI_NN*/\n        || ( extension == \"VK_KHR_device_group_creation\" ) || ( extension == \"VK_KHR_external_memory_capabilities\" ) ||\n           ( extension == \"VK_KHR_external_semaphore_capabilities\" ) || ( extension == \"VK_EXT_direct_mode_display\" )\n#if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )\n        || ( extension == \"VK_EXT_acquire_xlib_display\" )\n#endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/\n        || ( extension == \"VK_EXT_display_surface_counter\" ) || ( extension == \"VK_EXT_swapchain_colorspace\" ) ||\n           ( extension == \"VK_KHR_external_fence_capabilities\" ) || ( extension == \"VK_KHR_get_surface_capabilities2\" ) ||\n           ( extension == \"VK_KHR_get_display_properties2\" )\n#if defined( VK_USE_PLATFORM_IOS_MVK )\n        || ( extension == \"VK_MVK_ios_surface\" )\n#endif /*VK_USE_PLATFORM_IOS_MVK*/\n#if defined( VK_USE_PLATFORM_MACOS_MVK )\n        || ( extension == \"VK_MVK_macos_surface\" )\n#endif /*VK_USE_PLATFORM_MACOS_MVK*/\n        || ( extension == \"VK_EXT_debug_utils\" )\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n        || ( extension == \"VK_FUCHSIA_imagepipe_surface\" )\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n        || ( extension == \"VK_EXT_metal_surface\" )\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n        || ( extension == \"VK_KHR_surface_protected_capabilities\" ) || ( extension == \"VK_EXT_validation_features\" ) ||\n           ( extension == \"VK_EXT_headless_surface\" ) || ( extension == \"VK_EXT_surface_maintenance1\" ) || ( extension == \"VK_EXT_acquire_drm_display\" )\n#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n        || ( extension == \"VK_EXT_directfb_surface\" )\n#endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n        || ( extension == \"VK_QNX_screen_surface\" )\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n        || ( extension == \"VK_KHR_portability_enumeration\" ) || ( extension == \"VK_GOOGLE_surfaceless_query\" ) ||\n           ( extension == \"VK_LUNARG_direct_driver_loading\" ) || ( extension == \"VK_EXT_layer_settings\" ) || ( extension == \"VK_NV_display_stereo\" );\n  }\n\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_20 bool isObsoletedExtension( std::string const & extension )\n  {\n    return ( extension == \"VK_AMD_negative_viewport_height\" );\n  }\n\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_20 bool isPromotedExtension( std::string const & extension )\n  {\n    return ( extension == \"VK_KHR_sampler_mirror_clamp_to_edge\" ) || ( extension == \"VK_EXT_debug_marker\" ) || ( extension == \"VK_AMD_draw_indirect_count\" ) ||\n           ( extension == \"VK_KHR_dynamic_rendering\" ) || ( extension == \"VK_KHR_multiview\" ) ||\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n           ( extension == \"VK_NV_win32_keyed_mutex\" ) ||\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n           ( extension == \"VK_KHR_get_physical_device_properties2\" ) || ( extension == \"VK_KHR_device_group\" ) ||\n           ( extension == \"VK_KHR_shader_draw_parameters\" ) || ( extension == \"VK_EXT_texture_compression_astc_hdr\" ) ||\n           ( extension == \"VK_EXT_pipeline_robustness\" ) || ( extension == \"VK_KHR_maintenance1\" ) || ( extension == \"VK_KHR_device_group_creation\" ) ||\n           ( extension == \"VK_KHR_external_memory_capabilities\" ) || ( extension == \"VK_KHR_external_memory\" ) ||\n           ( extension == \"VK_KHR_external_semaphore_capabilities\" ) || ( extension == \"VK_KHR_external_semaphore\" ) ||\n           ( extension == \"VK_KHR_push_descriptor\" ) || ( extension == \"VK_KHR_shader_float16_int8\" ) || ( extension == \"VK_KHR_16bit_storage\" ) ||\n           ( extension == \"VK_KHR_descriptor_update_template\" ) || ( extension == \"VK_KHR_imageless_framebuffer\" ) ||\n           ( extension == \"VK_KHR_create_renderpass2\" ) || ( extension == \"VK_KHR_external_fence_capabilities\" ) || ( extension == \"VK_KHR_external_fence\" ) ||\n           ( extension == \"VK_KHR_maintenance2\" ) || ( extension == \"VK_KHR_variable_pointers\" ) || ( extension == \"VK_KHR_dedicated_allocation\" ) ||\n           ( extension == \"VK_EXT_sampler_filter_minmax\" ) || ( extension == \"VK_KHR_storage_buffer_storage_class\" ) ||\n           ( extension == \"VK_EXT_inline_uniform_block\" ) || ( extension == \"VK_KHR_relaxed_block_layout\" ) ||\n           ( extension == \"VK_KHR_get_memory_requirements2\" ) || ( extension == \"VK_KHR_image_format_list\" ) ||\n           ( extension == \"VK_KHR_sampler_ycbcr_conversion\" ) || ( extension == \"VK_KHR_bind_memory2\" ) || ( extension == \"VK_EXT_descriptor_indexing\" ) ||\n           ( extension == \"VK_EXT_shader_viewport_index_layer\" ) || ( extension == \"VK_KHR_maintenance3\" ) || ( extension == \"VK_KHR_draw_indirect_count\" ) ||\n           ( extension == \"VK_EXT_global_priority\" ) || ( extension == \"VK_KHR_shader_subgroup_extended_types\" ) || ( extension == \"VK_KHR_8bit_storage\" ) ||\n           ( extension == \"VK_KHR_shader_atomic_int64\" ) || ( extension == \"VK_EXT_calibrated_timestamps\" ) || ( extension == \"VK_KHR_global_priority\" ) ||\n           ( extension == \"VK_EXT_vertex_attribute_divisor\" ) || ( extension == \"VK_EXT_pipeline_creation_feedback\" ) ||\n           ( extension == \"VK_KHR_driver_properties\" ) || ( extension == \"VK_KHR_shader_float_controls\" ) || ( extension == \"VK_KHR_depth_stencil_resolve\" ) ||\n           ( extension == \"VK_NV_compute_shader_derivatives\" ) || ( extension == \"VK_NV_fragment_shader_barycentric\" ) ||\n           ( extension == \"VK_KHR_timeline_semaphore\" ) || ( extension == \"VK_KHR_vulkan_memory_model\" ) ||\n           ( extension == \"VK_KHR_shader_terminate_invocation\" ) || ( extension == \"VK_EXT_scalar_block_layout\" ) ||\n           ( extension == \"VK_EXT_subgroup_size_control\" ) || ( extension == \"VK_KHR_dynamic_rendering_local_read\" ) || ( extension == \"VK_KHR_spirv_1_4\" ) ||\n           ( extension == \"VK_KHR_separate_depth_stencil_layouts\" ) || ( extension == \"VK_EXT_tooling_info\" ) ||\n           ( extension == \"VK_EXT_separate_stencil_usage\" ) || ( extension == \"VK_KHR_uniform_buffer_standard_layout\" ) ||\n           ( extension == \"VK_KHR_buffer_device_address\" ) || ( extension == \"VK_EXT_line_rasterization\" ) || ( extension == \"VK_EXT_host_query_reset\" ) ||\n           ( extension == \"VK_EXT_index_type_uint8\" ) || ( extension == \"VK_EXT_extended_dynamic_state\" ) || ( extension == \"VK_EXT_host_image_copy\" ) ||\n           ( extension == \"VK_KHR_map_memory2\" ) || ( extension == \"VK_EXT_shader_demote_to_helper_invocation\" ) ||\n           ( extension == \"VK_KHR_shader_integer_dot_product\" ) || ( extension == \"VK_EXT_texel_buffer_alignment\" ) ||\n           ( extension == \"VK_KHR_shader_non_semantic_info\" ) || ( extension == \"VK_EXT_private_data\" ) ||\n           ( extension == \"VK_EXT_pipeline_creation_cache_control\" ) || ( extension == \"VK_KHR_synchronization2\" ) ||\n           ( extension == \"VK_KHR_zero_initialize_workgroup_memory\" ) || ( extension == \"VK_EXT_ycbcr_2plane_444_formats\" ) ||\n           ( extension == \"VK_EXT_image_robustness\" ) || ( extension == \"VK_KHR_copy_commands2\" ) || ( extension == \"VK_EXT_4444_formats\" ) ||\n           ( extension == \"VK_ARM_rasterization_order_attachment_access\" ) || ( extension == \"VK_VALVE_mutable_descriptor_type\" ) ||\n           ( extension == \"VK_KHR_format_feature_flags2\" ) || ( extension == \"VK_EXT_extended_dynamic_state2\" ) ||\n           ( extension == \"VK_EXT_global_priority_query\" ) || ( extension == \"VK_EXT_load_store_op_none\" ) || ( extension == \"VK_KHR_maintenance4\" ) ||\n           ( extension == \"VK_KHR_shader_subgroup_rotate\" ) || ( extension == \"VK_EXT_depth_clamp_zero_one\" ) ||\n           ( extension == \"VK_EXT_pipeline_protected_access\" ) || ( extension == \"VK_KHR_maintenance5\" ) ||\n           ( extension == \"VK_KHR_vertex_attribute_divisor\" ) || ( extension == \"VK_KHR_load_store_op_none\" ) ||\n           ( extension == \"VK_KHR_shader_float_controls2\" ) || ( extension == \"VK_KHR_index_type_uint8\" ) || ( extension == \"VK_KHR_line_rasterization\" ) ||\n           ( extension == \"VK_KHR_shader_expect_assume\" ) || ( extension == \"VK_KHR_maintenance6\" );\n  }\n}  // namespace VULKAN_HPP_NAMESPACE\n\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_format_traits.hpp",
    "content": "// Copyright 2015-2025 The Khronos Group Inc.\n//\n// SPDX-License-Identifier: Apache-2.0 OR MIT\n//\n\n// This header is generated from the Khronos Vulkan XML API Registry.\n\n#ifndef VULKAN_FORMAT_TRAITS_HPP\n#define VULKAN_FORMAT_TRAITS_HPP\n\n#include <vulkan/vulkan.hpp>\n\nnamespace VULKAN_HPP_NAMESPACE\n{\n\n  //=====================\n  //=== Format Traits ===\n  //=====================\n\n  // The three-dimensional extent of a texel block.\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_14 std::array<uint8_t, 3> blockExtent( VULKAN_HPP_NAMESPACE::Format format )\n  {\n    switch ( format )\n    {\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbUnormBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbSrgbBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbaUnormBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbaSrgbBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eBc2UnormBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eBc2SrgbBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eBc3UnormBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eBc3SrgbBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eBc4UnormBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eBc4SnormBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eBc5UnormBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eBc5SnormBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eBc6HUfloatBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eBc6HSfloatBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eBc7UnormBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eBc7SrgbBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8UnormBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8SrgbBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A1UnormBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A1SrgbBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A8UnormBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A8SrgbBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11UnormBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11SnormBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11G11UnormBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11G11SnormBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4UnormBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4SrgbBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4UnormBlock: return { { 5, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4SrgbBlock: return { { 5, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5UnormBlock: return { { 5, 5, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5SrgbBlock: return { { 5, 5, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5UnormBlock: return { { 6, 5, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5SrgbBlock: return { { 6, 5, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6UnormBlock: return { { 6, 6, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6SrgbBlock: return { { 6, 6, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5UnormBlock: return { { 8, 5, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5SrgbBlock: return { { 8, 5, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6UnormBlock: return { { 8, 6, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6SrgbBlock: return { { 8, 6, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8UnormBlock: return { { 8, 8, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8SrgbBlock: return { { 8, 8, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5UnormBlock: return { { 10, 5, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5SrgbBlock: return { { 10, 5, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6UnormBlock: return { { 10, 6, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6SrgbBlock: return { { 10, 6, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8UnormBlock: return { { 10, 8, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8SrgbBlock: return { { 10, 8, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10UnormBlock: return { { 10, 10, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10SrgbBlock: return { { 10, 10, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10UnormBlock: return { { 12, 10, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10SrgbBlock: return { { 12, 10, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12UnormBlock: return { { 12, 12, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12SrgbBlock: return { { 12, 12, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8G8R8422Unorm: return { { 2, 1, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8G8422Unorm: return { { 2, 1, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6G10X6R10X6422Unorm4Pack16: return { { 2, 1, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eB10X6G10X6R10X6G10X6422Unorm4Pack16: return { { 2, 1, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4G12X4R12X4422Unorm4Pack16: return { { 2, 1, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eB12X4G12X4R12X4G12X4422Unorm4Pack16: return { { 2, 1, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16G16R16422Unorm: return { { 2, 1, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eB16G16R16G16422Unorm: return { { 2, 1, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4SfloatBlock: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4SfloatBlock: return { { 5, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5SfloatBlock: return { { 5, 5, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5SfloatBlock: return { { 6, 5, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6SfloatBlock: return { { 6, 6, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5SfloatBlock: return { { 8, 5, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6SfloatBlock: return { { 8, 6, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8SfloatBlock: return { { 8, 8, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5SfloatBlock: return { { 10, 5, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6SfloatBlock: return { { 10, 6, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8SfloatBlock: return { { 10, 8, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10SfloatBlock: return { { 10, 10, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10SfloatBlock: return { { 12, 10, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12SfloatBlock: return { { 12, 12, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc12BppUnormBlockIMG: return { { 8, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc14BppUnormBlockIMG: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc22BppUnormBlockIMG: return { { 8, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc24BppUnormBlockIMG: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc12BppSrgbBlockIMG: return { { 8, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc14BppSrgbBlockIMG: return { { 4, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc22BppSrgbBlockIMG: return { { 8, 4, 1 } };\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc24BppSrgbBlockIMG: return { { 4, 4, 1 } };\n\n      default: return { { 1, 1, 1 } };\n    }\n  }\n\n  // The texel block size in bytes.\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_14 uint8_t blockSize( VULKAN_HPP_NAMESPACE::Format format )\n  {\n    switch ( format )\n    {\n      case VULKAN_HPP_NAMESPACE::Format::eR4G4UnormPack8: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR4G4B4A4UnormPack16: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eB4G4R4A4UnormPack16: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR5G6B5UnormPack16: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eB5G6R5UnormPack16: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR5G5B5A1UnormPack16: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eB5G5R5A1UnormPack16: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eA1R5G5B5UnormPack16: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR8Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8Snorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8Uscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8Sscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8Sint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8Srgb: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Unorm: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Snorm: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Uscaled: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Sscaled: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Uint: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Sint: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Srgb: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Snorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Uscaled: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Sscaled: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Uint: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Sint: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Srgb: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Snorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Uscaled: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Sscaled: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Uint: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Sint: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Srgb: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Unorm: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Snorm: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Uscaled: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Sscaled: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Uint: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Sint: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Srgb: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Unorm: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Snorm: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Uscaled: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Sscaled: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Uint: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Sint: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Srgb: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UnormPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SnormPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UscaledPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SscaledPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UintPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SintPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SrgbPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UnormPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SnormPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UscaledPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SscaledPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UintPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SintPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UnormPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SnormPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UscaledPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SscaledPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UintPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SintPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR16Unorm: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR16Snorm: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR16Uscaled: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR16Sscaled: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR16Uint: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR16Sint: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR16Sfloat: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Unorm: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Snorm: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Uscaled: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sscaled: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Uint: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sint: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sfloat: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Unorm: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Snorm: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Uscaled: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Sscaled: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Uint: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Sint: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Sfloat: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Unorm: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Snorm: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Uscaled: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Sscaled: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Uint: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Sint: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Sfloat: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eR32Uint: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR32Sint: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR32Sfloat: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32Uint: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32Sint: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32Sfloat: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32Uint: return 12;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32Sint: return 12;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32Sfloat: return 12;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32A32Uint: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32A32Sint: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32A32Sfloat: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eR64Uint: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eR64Sint: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eR64Sfloat: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64Uint: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64Sint: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64Sfloat: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64Uint: return 24;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64Sint: return 24;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64Sfloat: return 24;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64A64Uint: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64A64Sint: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64A64Sfloat: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eB10G11R11UfloatPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eE5B9G9R9UfloatPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eD16Unorm: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eX8D24UnormPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eD32Sfloat: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eS8Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eD16UnormS8Uint: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eD24UnormS8Uint: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eD32SfloatS8Uint: return 5;\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbUnormBlock: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbSrgbBlock: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbaUnormBlock: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbaSrgbBlock: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eBc2UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc2SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc3UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc3SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc4UnormBlock: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eBc4SnormBlock: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eBc5UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc5SnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc6HUfloatBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc6HSfloatBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc7UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc7SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8UnormBlock: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8SrgbBlock: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A1UnormBlock: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A1SrgbBlock: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A8UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A8SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11UnormBlock: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11SnormBlock: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11G11UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11G11SnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8G8R8422Unorm: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8G8422Unorm: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane420Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane420Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane422Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane422Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane444Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6UnormPack16: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6G10X6Unorm2Pack16: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6G10X6B10X6A10X6Unorm4Pack16: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6G10X6R10X6422Unorm4Pack16: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eB10X6G10X6R10X6G10X6422Unorm4Pack16: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane420Unorm3Pack16: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane420Unorm3Pack16: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane422Unorm3Pack16: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane422Unorm3Pack16: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane444Unorm3Pack16: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4UnormPack16: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4G12X4Unorm2Pack16: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4G12X4B12X4A12X4Unorm4Pack16: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4G12X4R12X4422Unorm4Pack16: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eB12X4G12X4R12X4G12X4422Unorm4Pack16: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane420Unorm3Pack16: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane420Unorm3Pack16: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane422Unorm3Pack16: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane422Unorm3Pack16: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane444Unorm3Pack16: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16G16R16422Unorm: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eB16G16R16G16422Unorm: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane420Unorm: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane420Unorm: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane422Unorm: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane422Unorm: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane444Unorm: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane444Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane444Unorm3Pack16: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane444Unorm3Pack16: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane444Unorm: return 6;\n      case VULKAN_HPP_NAMESPACE::Format::eA4R4G4B4UnormPack16: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eA4B4G4R4UnormPack16: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4SfloatBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4SfloatBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5SfloatBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5SfloatBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6SfloatBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5SfloatBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6SfloatBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8SfloatBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5SfloatBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6SfloatBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8SfloatBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10SfloatBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10SfloatBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12SfloatBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eA1B5G5R5UnormPack16: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eA8Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc12BppUnormBlockIMG: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc14BppUnormBlockIMG: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc22BppUnormBlockIMG: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc24BppUnormBlockIMG: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc12BppSrgbBlockIMG: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc14BppSrgbBlockIMG: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc22BppSrgbBlockIMG: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc24BppSrgbBlockIMG: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sfixed5NV: return 4;\n\n      default: VULKAN_HPP_ASSERT( false ); return 0;\n    }\n  }\n\n  // The class of the format (can't be just named \"class\"!)\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_14 char const * compatibilityClass( VULKAN_HPP_NAMESPACE::Format format )\n  {\n    switch ( format )\n    {\n      case VULKAN_HPP_NAMESPACE::Format::eR4G4UnormPack8: return \"8-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR4G4B4A4UnormPack16: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eB4G4R4A4UnormPack16: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR5G6B5UnormPack16: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eB5G6R5UnormPack16: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR5G5B5A1UnormPack16: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eB5G5R5A1UnormPack16: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eA1R5G5B5UnormPack16: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8Unorm: return \"8-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8Snorm: return \"8-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8Uscaled: return \"8-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8Sscaled: return \"8-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8Uint: return \"8-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8Sint: return \"8-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8Srgb: return \"8-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Unorm: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Snorm: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Uscaled: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Sscaled: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Uint: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Sint: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Srgb: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Unorm: return \"24-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Snorm: return \"24-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Uscaled: return \"24-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Sscaled: return \"24-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Uint: return \"24-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Sint: return \"24-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Srgb: return \"24-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Unorm: return \"24-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Snorm: return \"24-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Uscaled: return \"24-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Sscaled: return \"24-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Uint: return \"24-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Sint: return \"24-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Srgb: return \"24-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Unorm: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Snorm: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Uscaled: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Sscaled: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Uint: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Sint: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Srgb: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Unorm: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Snorm: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Uscaled: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Sscaled: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Uint: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Sint: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Srgb: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UnormPack32: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SnormPack32: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UscaledPack32: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SscaledPack32: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UintPack32: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SintPack32: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SrgbPack32: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UnormPack32: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SnormPack32: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UscaledPack32: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SscaledPack32: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UintPack32: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SintPack32: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UnormPack32: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SnormPack32: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UscaledPack32: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SscaledPack32: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UintPack32: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SintPack32: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16Unorm: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16Snorm: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16Uscaled: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16Sscaled: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16Uint: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16Sint: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16Sfloat: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Unorm: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Snorm: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Uscaled: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sscaled: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Uint: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sint: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sfloat: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Unorm: return \"48-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Snorm: return \"48-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Uscaled: return \"48-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Sscaled: return \"48-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Uint: return \"48-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Sint: return \"48-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Sfloat: return \"48-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Unorm: return \"64-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Snorm: return \"64-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Uscaled: return \"64-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Sscaled: return \"64-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Uint: return \"64-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Sint: return \"64-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Sfloat: return \"64-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR32Uint: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR32Sint: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR32Sfloat: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32Uint: return \"64-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32Sint: return \"64-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32Sfloat: return \"64-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32Uint: return \"96-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32Sint: return \"96-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32Sfloat: return \"96-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32A32Uint: return \"128-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32A32Sint: return \"128-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32A32Sfloat: return \"128-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR64Uint: return \"64-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR64Sint: return \"64-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR64Sfloat: return \"64-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64Uint: return \"128-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64Sint: return \"128-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64Sfloat: return \"128-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64Uint: return \"192-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64Sint: return \"192-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64Sfloat: return \"192-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64A64Uint: return \"256-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64A64Sint: return \"256-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64A64Sfloat: return \"256-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eB10G11R11UfloatPack32: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eE5B9G9R9UfloatPack32: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eD16Unorm: return \"D16\";\n      case VULKAN_HPP_NAMESPACE::Format::eX8D24UnormPack32: return \"D24\";\n      case VULKAN_HPP_NAMESPACE::Format::eD32Sfloat: return \"D32\";\n      case VULKAN_HPP_NAMESPACE::Format::eS8Uint: return \"S8\";\n      case VULKAN_HPP_NAMESPACE::Format::eD16UnormS8Uint: return \"D16S8\";\n      case VULKAN_HPP_NAMESPACE::Format::eD24UnormS8Uint: return \"D24S8\";\n      case VULKAN_HPP_NAMESPACE::Format::eD32SfloatS8Uint: return \"D32S8\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbUnormBlock: return \"BC1_RGB\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbSrgbBlock: return \"BC1_RGB\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbaUnormBlock: return \"BC1_RGBA\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbaSrgbBlock: return \"BC1_RGBA\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc2UnormBlock: return \"BC2\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc2SrgbBlock: return \"BC2\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc3UnormBlock: return \"BC3\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc3SrgbBlock: return \"BC3\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc4UnormBlock: return \"BC4\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc4SnormBlock: return \"BC4\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc5UnormBlock: return \"BC5\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc5SnormBlock: return \"BC5\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc6HUfloatBlock: return \"BC6H\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc6HSfloatBlock: return \"BC6H\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc7UnormBlock: return \"BC7\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc7SrgbBlock: return \"BC7\";\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8UnormBlock: return \"ETC2_RGB\";\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8SrgbBlock: return \"ETC2_RGB\";\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A1UnormBlock: return \"ETC2_RGBA\";\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A1SrgbBlock: return \"ETC2_RGBA\";\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A8UnormBlock: return \"ETC2_EAC_RGBA\";\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A8SrgbBlock: return \"ETC2_EAC_RGBA\";\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11UnormBlock: return \"EAC_R\";\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11SnormBlock: return \"EAC_R\";\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11G11UnormBlock: return \"EAC_RG\";\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11G11SnormBlock: return \"EAC_RG\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4UnormBlock: return \"ASTC_4x4\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4SrgbBlock: return \"ASTC_4x4\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4UnormBlock: return \"ASTC_5x4\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4SrgbBlock: return \"ASTC_5x4\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5UnormBlock: return \"ASTC_5x5\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5SrgbBlock: return \"ASTC_5x5\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5UnormBlock: return \"ASTC_6x5\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5SrgbBlock: return \"ASTC_6x5\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6UnormBlock: return \"ASTC_6x6\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6SrgbBlock: return \"ASTC_6x6\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5UnormBlock: return \"ASTC_8x5\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5SrgbBlock: return \"ASTC_8x5\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6UnormBlock: return \"ASTC_8x6\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6SrgbBlock: return \"ASTC_8x6\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8UnormBlock: return \"ASTC_8x8\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8SrgbBlock: return \"ASTC_8x8\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5UnormBlock: return \"ASTC_10x5\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5SrgbBlock: return \"ASTC_10x5\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6UnormBlock: return \"ASTC_10x6\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6SrgbBlock: return \"ASTC_10x6\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8UnormBlock: return \"ASTC_10x8\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8SrgbBlock: return \"ASTC_10x8\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10UnormBlock: return \"ASTC_10x10\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10SrgbBlock: return \"ASTC_10x10\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10UnormBlock: return \"ASTC_12x10\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10SrgbBlock: return \"ASTC_12x10\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12UnormBlock: return \"ASTC_12x12\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12SrgbBlock: return \"ASTC_12x12\";\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8G8R8422Unorm: return \"32-bit G8B8G8R8\";\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8G8422Unorm: return \"32-bit B8G8R8G8\";\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane420Unorm: return \"8-bit 3-plane 420\";\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane420Unorm: return \"8-bit 2-plane 420\";\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane422Unorm: return \"8-bit 3-plane 422\";\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane422Unorm: return \"8-bit 2-plane 422\";\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane444Unorm: return \"8-bit 3-plane 444\";\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6UnormPack16: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6G10X6Unorm2Pack16: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6G10X6B10X6A10X6Unorm4Pack16: return \"64-bit R10G10B10A10\";\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6G10X6R10X6422Unorm4Pack16: return \"64-bit G10B10G10R10\";\n      case VULKAN_HPP_NAMESPACE::Format::eB10X6G10X6R10X6G10X6422Unorm4Pack16: return \"64-bit B10G10R10G10\";\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane420Unorm3Pack16: return \"10-bit 3-plane 420\";\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane420Unorm3Pack16: return \"10-bit 2-plane 420\";\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane422Unorm3Pack16: return \"10-bit 3-plane 422\";\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane422Unorm3Pack16: return \"10-bit 2-plane 422\";\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane444Unorm3Pack16: return \"10-bit 3-plane 444\";\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4UnormPack16: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4G12X4Unorm2Pack16: return \"32-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4G12X4B12X4A12X4Unorm4Pack16: return \"64-bit R12G12B12A12\";\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4G12X4R12X4422Unorm4Pack16: return \"64-bit G12B12G12R12\";\n      case VULKAN_HPP_NAMESPACE::Format::eB12X4G12X4R12X4G12X4422Unorm4Pack16: return \"64-bit B12G12R12G12\";\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane420Unorm3Pack16: return \"12-bit 3-plane 420\";\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane420Unorm3Pack16: return \"12-bit 2-plane 420\";\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane422Unorm3Pack16: return \"12-bit 3-plane 422\";\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane422Unorm3Pack16: return \"12-bit 2-plane 422\";\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane444Unorm3Pack16: return \"12-bit 3-plane 444\";\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16G16R16422Unorm: return \"64-bit G16B16G16R16\";\n      case VULKAN_HPP_NAMESPACE::Format::eB16G16R16G16422Unorm: return \"64-bit B16G16R16G16\";\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane420Unorm: return \"16-bit 3-plane 420\";\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane420Unorm: return \"16-bit 2-plane 420\";\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane422Unorm: return \"16-bit 3-plane 422\";\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane422Unorm: return \"16-bit 2-plane 422\";\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane444Unorm: return \"16-bit 3-plane 444\";\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane444Unorm: return \"8-bit 2-plane 444\";\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane444Unorm3Pack16: return \"10-bit 2-plane 444\";\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane444Unorm3Pack16: return \"12-bit 2-plane 444\";\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane444Unorm: return \"16-bit 2-plane 444\";\n      case VULKAN_HPP_NAMESPACE::Format::eA4R4G4B4UnormPack16: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eA4B4G4R4UnormPack16: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4SfloatBlock: return \"ASTC_4x4\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4SfloatBlock: return \"ASTC_5x4\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5SfloatBlock: return \"ASTC_5x5\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5SfloatBlock: return \"ASTC_6x5\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6SfloatBlock: return \"ASTC_6x6\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5SfloatBlock: return \"ASTC_8x5\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6SfloatBlock: return \"ASTC_8x6\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8SfloatBlock: return \"ASTC_8x8\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5SfloatBlock: return \"ASTC_10x5\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6SfloatBlock: return \"ASTC_10x6\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8SfloatBlock: return \"ASTC_10x8\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10SfloatBlock: return \"ASTC_10x10\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10SfloatBlock: return \"ASTC_12x10\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12SfloatBlock: return \"ASTC_12x12\";\n      case VULKAN_HPP_NAMESPACE::Format::eA1B5G5R5UnormPack16: return \"16-bit\";\n      case VULKAN_HPP_NAMESPACE::Format::eA8Unorm: return \"8-bit alpha\";\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc12BppUnormBlockIMG: return \"PVRTC1_2BPP\";\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc14BppUnormBlockIMG: return \"PVRTC1_4BPP\";\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc22BppUnormBlockIMG: return \"PVRTC2_2BPP\";\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc24BppUnormBlockIMG: return \"PVRTC2_4BPP\";\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc12BppSrgbBlockIMG: return \"PVRTC1_2BPP\";\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc14BppSrgbBlockIMG: return \"PVRTC1_4BPP\";\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc22BppSrgbBlockIMG: return \"PVRTC2_2BPP\";\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc24BppSrgbBlockIMG: return \"PVRTC2_4BPP\";\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sfixed5NV: return \"32-bit\";\n\n      default: VULKAN_HPP_ASSERT( false ); return \"\";\n    }\n  }\n\n  // The number of bits in this component, if not compressed, otherwise 0.\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_14 uint8_t componentBits( VULKAN_HPP_NAMESPACE::Format format, uint8_t component )\n  {\n    switch ( format )\n    {\n      case VULKAN_HPP_NAMESPACE::Format::eR4G4UnormPack8:\n        switch ( component )\n        {\n          case 0: return 4;\n          case 1: return 4;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR4G4B4A4UnormPack16:\n        switch ( component )\n        {\n          case 0: return 4;\n          case 1: return 4;\n          case 2: return 4;\n          case 3: return 4;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB4G4R4A4UnormPack16:\n        switch ( component )\n        {\n          case 0: return 4;\n          case 1: return 4;\n          case 2: return 4;\n          case 3: return 4;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR5G6B5UnormPack16:\n        switch ( component )\n        {\n          case 0: return 5;\n          case 1: return 6;\n          case 2: return 5;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB5G6R5UnormPack16:\n        switch ( component )\n        {\n          case 0: return 5;\n          case 1: return 6;\n          case 2: return 5;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR5G5B5A1UnormPack16:\n        switch ( component )\n        {\n          case 0: return 5;\n          case 1: return 5;\n          case 2: return 5;\n          case 3: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB5G5R5A1UnormPack16:\n        switch ( component )\n        {\n          case 0: return 5;\n          case 1: return 5;\n          case 2: return 5;\n          case 3: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA1R5G5B5UnormPack16:\n        switch ( component )\n        {\n          case 0: return 1;\n          case 1: return 5;\n          case 2: return 5;\n          case 3: return 5;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8Unorm:\n        switch ( component )\n        {\n          case 0: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8Snorm:\n        switch ( component )\n        {\n          case 0: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8Uscaled:\n        switch ( component )\n        {\n          case 0: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8Sscaled:\n        switch ( component )\n        {\n          case 0: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8Uint:\n        switch ( component )\n        {\n          case 0: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8Sint:\n        switch ( component )\n        {\n          case 0: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8Srgb:\n        switch ( component )\n        {\n          case 0: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Unorm:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Snorm:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Uscaled:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Sscaled:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Uint:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Sint:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Srgb:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Unorm:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Snorm:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Uscaled:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Sscaled:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Uint:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Sint:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Srgb:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Unorm:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Snorm:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Uscaled:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Sscaled:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Uint:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Sint:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Srgb:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Unorm:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          case 3: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Snorm:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          case 3: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Uscaled:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          case 3: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Sscaled:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          case 3: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Uint:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          case 3: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Sint:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          case 3: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Srgb:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          case 3: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Unorm:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          case 3: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Snorm:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          case 3: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Uscaled:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          case 3: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Sscaled:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          case 3: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Uint:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          case 3: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Sint:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          case 3: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Srgb:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          case 3: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UnormPack32:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          case 3: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SnormPack32:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          case 3: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UscaledPack32:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          case 3: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SscaledPack32:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          case 3: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UintPack32:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          case 3: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SintPack32:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          case 3: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SrgbPack32:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          case 3: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UnormPack32:\n        switch ( component )\n        {\n          case 0: return 2;\n          case 1: return 10;\n          case 2: return 10;\n          case 3: return 10;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SnormPack32:\n        switch ( component )\n        {\n          case 0: return 2;\n          case 1: return 10;\n          case 2: return 10;\n          case 3: return 10;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UscaledPack32:\n        switch ( component )\n        {\n          case 0: return 2;\n          case 1: return 10;\n          case 2: return 10;\n          case 3: return 10;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SscaledPack32:\n        switch ( component )\n        {\n          case 0: return 2;\n          case 1: return 10;\n          case 2: return 10;\n          case 3: return 10;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UintPack32:\n        switch ( component )\n        {\n          case 0: return 2;\n          case 1: return 10;\n          case 2: return 10;\n          case 3: return 10;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SintPack32:\n        switch ( component )\n        {\n          case 0: return 2;\n          case 1: return 10;\n          case 2: return 10;\n          case 3: return 10;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UnormPack32:\n        switch ( component )\n        {\n          case 0: return 2;\n          case 1: return 10;\n          case 2: return 10;\n          case 3: return 10;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SnormPack32:\n        switch ( component )\n        {\n          case 0: return 2;\n          case 1: return 10;\n          case 2: return 10;\n          case 3: return 10;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UscaledPack32:\n        switch ( component )\n        {\n          case 0: return 2;\n          case 1: return 10;\n          case 2: return 10;\n          case 3: return 10;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SscaledPack32:\n        switch ( component )\n        {\n          case 0: return 2;\n          case 1: return 10;\n          case 2: return 10;\n          case 3: return 10;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UintPack32:\n        switch ( component )\n        {\n          case 0: return 2;\n          case 1: return 10;\n          case 2: return 10;\n          case 3: return 10;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SintPack32:\n        switch ( component )\n        {\n          case 0: return 2;\n          case 1: return 10;\n          case 2: return 10;\n          case 3: return 10;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16Unorm:\n        switch ( component )\n        {\n          case 0: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16Snorm:\n        switch ( component )\n        {\n          case 0: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16Uscaled:\n        switch ( component )\n        {\n          case 0: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16Sscaled:\n        switch ( component )\n        {\n          case 0: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16Uint:\n        switch ( component )\n        {\n          case 0: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16Sint:\n        switch ( component )\n        {\n          case 0: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16Sfloat:\n        switch ( component )\n        {\n          case 0: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Unorm:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Snorm:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Uscaled:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sscaled:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Uint:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sint:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sfloat:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Unorm:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          case 2: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Snorm:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          case 2: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Uscaled:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          case 2: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Sscaled:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          case 2: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Uint:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          case 2: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Sint:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          case 2: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Sfloat:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          case 2: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Unorm:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          case 2: return 16;\n          case 3: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Snorm:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          case 2: return 16;\n          case 3: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Uscaled:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          case 2: return 16;\n          case 3: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Sscaled:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          case 2: return 16;\n          case 3: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Uint:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          case 2: return 16;\n          case 3: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Sint:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          case 2: return 16;\n          case 3: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Sfloat:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          case 2: return 16;\n          case 3: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32Uint:\n        switch ( component )\n        {\n          case 0: return 32;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32Sint:\n        switch ( component )\n        {\n          case 0: return 32;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32Sfloat:\n        switch ( component )\n        {\n          case 0: return 32;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32Uint:\n        switch ( component )\n        {\n          case 0: return 32;\n          case 1: return 32;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32Sint:\n        switch ( component )\n        {\n          case 0: return 32;\n          case 1: return 32;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32Sfloat:\n        switch ( component )\n        {\n          case 0: return 32;\n          case 1: return 32;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32Uint:\n        switch ( component )\n        {\n          case 0: return 32;\n          case 1: return 32;\n          case 2: return 32;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32Sint:\n        switch ( component )\n        {\n          case 0: return 32;\n          case 1: return 32;\n          case 2: return 32;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32Sfloat:\n        switch ( component )\n        {\n          case 0: return 32;\n          case 1: return 32;\n          case 2: return 32;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32A32Uint:\n        switch ( component )\n        {\n          case 0: return 32;\n          case 1: return 32;\n          case 2: return 32;\n          case 3: return 32;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32A32Sint:\n        switch ( component )\n        {\n          case 0: return 32;\n          case 1: return 32;\n          case 2: return 32;\n          case 3: return 32;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32A32Sfloat:\n        switch ( component )\n        {\n          case 0: return 32;\n          case 1: return 32;\n          case 2: return 32;\n          case 3: return 32;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64Uint:\n        switch ( component )\n        {\n          case 0: return 64;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64Sint:\n        switch ( component )\n        {\n          case 0: return 64;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64Sfloat:\n        switch ( component )\n        {\n          case 0: return 64;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64Uint:\n        switch ( component )\n        {\n          case 0: return 64;\n          case 1: return 64;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64Sint:\n        switch ( component )\n        {\n          case 0: return 64;\n          case 1: return 64;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64Sfloat:\n        switch ( component )\n        {\n          case 0: return 64;\n          case 1: return 64;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64Uint:\n        switch ( component )\n        {\n          case 0: return 64;\n          case 1: return 64;\n          case 2: return 64;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64Sint:\n        switch ( component )\n        {\n          case 0: return 64;\n          case 1: return 64;\n          case 2: return 64;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64Sfloat:\n        switch ( component )\n        {\n          case 0: return 64;\n          case 1: return 64;\n          case 2: return 64;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64A64Uint:\n        switch ( component )\n        {\n          case 0: return 64;\n          case 1: return 64;\n          case 2: return 64;\n          case 3: return 64;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64A64Sint:\n        switch ( component )\n        {\n          case 0: return 64;\n          case 1: return 64;\n          case 2: return 64;\n          case 3: return 64;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64A64Sfloat:\n        switch ( component )\n        {\n          case 0: return 64;\n          case 1: return 64;\n          case 2: return 64;\n          case 3: return 64;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB10G11R11UfloatPack32:\n        switch ( component )\n        {\n          case 0: return 10;\n          case 1: return 11;\n          case 2: return 11;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eE5B9G9R9UfloatPack32:\n        switch ( component )\n        {\n          case 0: return 9;\n          case 1: return 9;\n          case 2: return 9;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eD16Unorm:\n        switch ( component )\n        {\n          case 0: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eX8D24UnormPack32:\n        switch ( component )\n        {\n          case 0: return 24;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eD32Sfloat:\n        switch ( component )\n        {\n          case 0: return 32;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eS8Uint:\n        switch ( component )\n        {\n          case 0: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eD16UnormS8Uint:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eD24UnormS8Uint:\n        switch ( component )\n        {\n          case 0: return 24;\n          case 1: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eD32SfloatS8Uint:\n        switch ( component )\n        {\n          case 0: return 32;\n          case 1: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11UnormBlock:\n        switch ( component )\n        {\n          case 0: return 11;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11SnormBlock:\n        switch ( component )\n        {\n          case 0: return 11;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11G11UnormBlock:\n        switch ( component )\n        {\n          case 0: return 11;\n          case 1: return 11;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11G11SnormBlock:\n        switch ( component )\n        {\n          case 0: return 11;\n          case 1: return 11;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8G8R8422Unorm:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          case 3: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8G8422Unorm:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          case 3: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane420Unorm:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane420Unorm:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane422Unorm:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane422Unorm:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane444Unorm:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6UnormPack16:\n        switch ( component )\n        {\n          case 0: return 10;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6G10X6Unorm2Pack16:\n        switch ( component )\n        {\n          case 0: return 10;\n          case 1: return 10;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6G10X6B10X6A10X6Unorm4Pack16:\n        switch ( component )\n        {\n          case 0: return 10;\n          case 1: return 10;\n          case 2: return 10;\n          case 3: return 10;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6G10X6R10X6422Unorm4Pack16:\n        switch ( component )\n        {\n          case 0: return 10;\n          case 1: return 10;\n          case 2: return 10;\n          case 3: return 10;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB10X6G10X6R10X6G10X6422Unorm4Pack16:\n        switch ( component )\n        {\n          case 0: return 10;\n          case 1: return 10;\n          case 2: return 10;\n          case 3: return 10;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane420Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 10;\n          case 1: return 10;\n          case 2: return 10;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane420Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 10;\n          case 1: return 10;\n          case 2: return 10;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane422Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 10;\n          case 1: return 10;\n          case 2: return 10;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane422Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 10;\n          case 1: return 10;\n          case 2: return 10;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane444Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 10;\n          case 1: return 10;\n          case 2: return 10;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4UnormPack16:\n        switch ( component )\n        {\n          case 0: return 12;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4G12X4Unorm2Pack16:\n        switch ( component )\n        {\n          case 0: return 12;\n          case 1: return 12;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4G12X4B12X4A12X4Unorm4Pack16:\n        switch ( component )\n        {\n          case 0: return 12;\n          case 1: return 12;\n          case 2: return 12;\n          case 3: return 12;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4G12X4R12X4422Unorm4Pack16:\n        switch ( component )\n        {\n          case 0: return 12;\n          case 1: return 12;\n          case 2: return 12;\n          case 3: return 12;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB12X4G12X4R12X4G12X4422Unorm4Pack16:\n        switch ( component )\n        {\n          case 0: return 12;\n          case 1: return 12;\n          case 2: return 12;\n          case 3: return 12;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane420Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 12;\n          case 1: return 12;\n          case 2: return 12;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane420Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 12;\n          case 1: return 12;\n          case 2: return 12;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane422Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 12;\n          case 1: return 12;\n          case 2: return 12;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane422Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 12;\n          case 1: return 12;\n          case 2: return 12;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane444Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 12;\n          case 1: return 12;\n          case 2: return 12;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16G16R16422Unorm:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          case 2: return 16;\n          case 3: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB16G16R16G16422Unorm:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          case 2: return 16;\n          case 3: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane420Unorm:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          case 2: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane420Unorm:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          case 2: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane422Unorm:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          case 2: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane422Unorm:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          case 2: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane444Unorm:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          case 2: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane444Unorm:\n        switch ( component )\n        {\n          case 0: return 8;\n          case 1: return 8;\n          case 2: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane444Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 10;\n          case 1: return 10;\n          case 2: return 10;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane444Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 12;\n          case 1: return 12;\n          case 2: return 12;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane444Unorm:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          case 2: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA4R4G4B4UnormPack16:\n        switch ( component )\n        {\n          case 0: return 4;\n          case 1: return 4;\n          case 2: return 4;\n          case 3: return 4;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA4B4G4R4UnormPack16:\n        switch ( component )\n        {\n          case 0: return 4;\n          case 1: return 4;\n          case 2: return 4;\n          case 3: return 4;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA1B5G5R5UnormPack16:\n        switch ( component )\n        {\n          case 0: return 1;\n          case 1: return 5;\n          case 2: return 5;\n          case 3: return 5;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8Unorm:\n        switch ( component )\n        {\n          case 0: return 8;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sfixed5NV:\n        switch ( component )\n        {\n          case 0: return 16;\n          case 1: return 16;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n\n      default: return 0;\n    }\n  }\n\n  // The number of components of this format.\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_14 uint8_t componentCount( VULKAN_HPP_NAMESPACE::Format format )\n  {\n    switch ( format )\n    {\n      case VULKAN_HPP_NAMESPACE::Format::eR4G4UnormPack8: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR4G4B4A4UnormPack16: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eB4G4R4A4UnormPack16: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR5G6B5UnormPack16: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eB5G6R5UnormPack16: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR5G5B5A1UnormPack16: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eB5G5R5A1UnormPack16: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA1R5G5B5UnormPack16: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR8Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8Snorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8Uscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8Sscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8Sint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8Srgb: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Unorm: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Snorm: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Uscaled: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Sscaled: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Uint: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Sint: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Srgb: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Snorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Uscaled: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Sscaled: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Uint: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Sint: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Srgb: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Snorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Uscaled: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Sscaled: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Uint: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Sint: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Srgb: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Unorm: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Snorm: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Uscaled: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Sscaled: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Uint: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Sint: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Srgb: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Unorm: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Snorm: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Uscaled: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Sscaled: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Uint: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Sint: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Srgb: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UnormPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SnormPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UscaledPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SscaledPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UintPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SintPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SrgbPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UnormPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SnormPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UscaledPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SscaledPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UintPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SintPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UnormPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SnormPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UscaledPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SscaledPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UintPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SintPack32: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR16Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16Snorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16Uscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16Sscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16Sint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16Sfloat: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Unorm: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Snorm: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Uscaled: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sscaled: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Uint: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sint: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sfloat: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Snorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Uscaled: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Sscaled: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Uint: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Sint: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Sfloat: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Unorm: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Snorm: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Uscaled: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Sscaled: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Uint: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Sint: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Sfloat: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR32Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR32Sint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR32Sfloat: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32Uint: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32Sint: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32Sfloat: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32Uint: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32Sint: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32Sfloat: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32A32Uint: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32A32Sint: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32A32Sfloat: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR64Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR64Sint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR64Sfloat: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64Uint: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64Sint: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64Sfloat: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64Uint: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64Sint: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64Sfloat: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64A64Uint: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64A64Sint: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64A64Sfloat: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eB10G11R11UfloatPack32: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eE5B9G9R9UfloatPack32: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eD16Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eX8D24UnormPack32: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eD32Sfloat: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eS8Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eD16UnormS8Uint: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eD24UnormS8Uint: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eD32SfloatS8Uint: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbUnormBlock: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbSrgbBlock: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbaUnormBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbaSrgbBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eBc2UnormBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eBc2SrgbBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eBc3UnormBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eBc3SrgbBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eBc4UnormBlock: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eBc4SnormBlock: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eBc5UnormBlock: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eBc5SnormBlock: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eBc6HUfloatBlock: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eBc6HSfloatBlock: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eBc7UnormBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eBc7SrgbBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8UnormBlock: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8SrgbBlock: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A1UnormBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A1SrgbBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A8UnormBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A8SrgbBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11UnormBlock: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11SnormBlock: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11G11UnormBlock: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11G11SnormBlock: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4UnormBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4SrgbBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4UnormBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4SrgbBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5UnormBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5SrgbBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5UnormBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5SrgbBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6UnormBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6SrgbBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5UnormBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5SrgbBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6UnormBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6SrgbBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8UnormBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8SrgbBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5UnormBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5SrgbBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6UnormBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6SrgbBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8UnormBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8SrgbBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10UnormBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10SrgbBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10UnormBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10SrgbBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12UnormBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12SrgbBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8G8R8422Unorm: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8G8422Unorm: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane420Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane420Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane422Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane422Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane444Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6UnormPack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6G10X6Unorm2Pack16: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6G10X6B10X6A10X6Unorm4Pack16: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6G10X6R10X6422Unorm4Pack16: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eB10X6G10X6R10X6G10X6422Unorm4Pack16: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane420Unorm3Pack16: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane420Unorm3Pack16: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane422Unorm3Pack16: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane422Unorm3Pack16: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane444Unorm3Pack16: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4UnormPack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4G12X4Unorm2Pack16: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4G12X4B12X4A12X4Unorm4Pack16: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4G12X4R12X4422Unorm4Pack16: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eB12X4G12X4R12X4G12X4422Unorm4Pack16: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane420Unorm3Pack16: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane420Unorm3Pack16: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane422Unorm3Pack16: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane422Unorm3Pack16: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane444Unorm3Pack16: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16G16R16422Unorm: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eB16G16R16G16422Unorm: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane420Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane420Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane422Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane422Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane444Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane444Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane444Unorm3Pack16: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane444Unorm3Pack16: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane444Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eA4R4G4B4UnormPack16: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA4B4G4R4UnormPack16: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4SfloatBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4SfloatBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5SfloatBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5SfloatBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6SfloatBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5SfloatBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6SfloatBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8SfloatBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5SfloatBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6SfloatBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8SfloatBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10SfloatBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10SfloatBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12SfloatBlock: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA1B5G5R5UnormPack16: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eA8Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc12BppUnormBlockIMG: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc14BppUnormBlockIMG: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc22BppUnormBlockIMG: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc24BppUnormBlockIMG: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc12BppSrgbBlockIMG: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc14BppSrgbBlockIMG: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc22BppSrgbBlockIMG: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc24BppSrgbBlockIMG: return 4;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sfixed5NV: return 2;\n\n      default: return 0;\n    }\n  }\n\n  // The name of the component\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_14 char const * componentName( VULKAN_HPP_NAMESPACE::Format format, uint8_t component )\n  {\n    switch ( format )\n    {\n      case VULKAN_HPP_NAMESPACE::Format::eR4G4UnormPack8:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR4G4B4A4UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB4G4R4A4UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"B\";\n          case 1: return \"G\";\n          case 2: return \"R\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR5G6B5UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB5G6R5UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"B\";\n          case 1: return \"G\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR5G5B5A1UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB5G5R5A1UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"B\";\n          case 1: return \"G\";\n          case 2: return \"R\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA1R5G5B5UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          case 1: return \"R\";\n          case 2: return \"G\";\n          case 3: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8Unorm:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8Snorm:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8Uscaled:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8Sscaled:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8Uint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8Sint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8Srgb:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Unorm:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Snorm:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Uscaled:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Sscaled:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Uint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Sint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Srgb:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Unorm:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Snorm:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Uscaled:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Sscaled:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Uint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Sint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Srgb:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Unorm:\n        switch ( component )\n        {\n          case 0: return \"B\";\n          case 1: return \"G\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Snorm:\n        switch ( component )\n        {\n          case 0: return \"B\";\n          case 1: return \"G\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Uscaled:\n        switch ( component )\n        {\n          case 0: return \"B\";\n          case 1: return \"G\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Sscaled:\n        switch ( component )\n        {\n          case 0: return \"B\";\n          case 1: return \"G\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Uint:\n        switch ( component )\n        {\n          case 0: return \"B\";\n          case 1: return \"G\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Sint:\n        switch ( component )\n        {\n          case 0: return \"B\";\n          case 1: return \"G\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Srgb:\n        switch ( component )\n        {\n          case 0: return \"B\";\n          case 1: return \"G\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Unorm:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Snorm:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Uscaled:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Sscaled:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Uint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Sint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Srgb:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Unorm:\n        switch ( component )\n        {\n          case 0: return \"B\";\n          case 1: return \"G\";\n          case 2: return \"R\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Snorm:\n        switch ( component )\n        {\n          case 0: return \"B\";\n          case 1: return \"G\";\n          case 2: return \"R\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Uscaled:\n        switch ( component )\n        {\n          case 0: return \"B\";\n          case 1: return \"G\";\n          case 2: return \"R\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Sscaled:\n        switch ( component )\n        {\n          case 0: return \"B\";\n          case 1: return \"G\";\n          case 2: return \"R\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Uint:\n        switch ( component )\n        {\n          case 0: return \"B\";\n          case 1: return \"G\";\n          case 2: return \"R\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Sint:\n        switch ( component )\n        {\n          case 0: return \"B\";\n          case 1: return \"G\";\n          case 2: return \"R\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Srgb:\n        switch ( component )\n        {\n          case 0: return \"B\";\n          case 1: return \"G\";\n          case 2: return \"R\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UnormPack32:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          case 1: return \"B\";\n          case 2: return \"G\";\n          case 3: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SnormPack32:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          case 1: return \"B\";\n          case 2: return \"G\";\n          case 3: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UscaledPack32:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          case 1: return \"B\";\n          case 2: return \"G\";\n          case 3: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SscaledPack32:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          case 1: return \"B\";\n          case 2: return \"G\";\n          case 3: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UintPack32:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          case 1: return \"B\";\n          case 2: return \"G\";\n          case 3: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SintPack32:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          case 1: return \"B\";\n          case 2: return \"G\";\n          case 3: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SrgbPack32:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          case 1: return \"B\";\n          case 2: return \"G\";\n          case 3: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UnormPack32:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          case 1: return \"R\";\n          case 2: return \"G\";\n          case 3: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SnormPack32:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          case 1: return \"R\";\n          case 2: return \"G\";\n          case 3: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UscaledPack32:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          case 1: return \"R\";\n          case 2: return \"G\";\n          case 3: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SscaledPack32:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          case 1: return \"R\";\n          case 2: return \"G\";\n          case 3: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UintPack32:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          case 1: return \"R\";\n          case 2: return \"G\";\n          case 3: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SintPack32:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          case 1: return \"R\";\n          case 2: return \"G\";\n          case 3: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UnormPack32:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          case 1: return \"B\";\n          case 2: return \"G\";\n          case 3: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SnormPack32:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          case 1: return \"B\";\n          case 2: return \"G\";\n          case 3: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UscaledPack32:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          case 1: return \"B\";\n          case 2: return \"G\";\n          case 3: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SscaledPack32:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          case 1: return \"B\";\n          case 2: return \"G\";\n          case 3: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UintPack32:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          case 1: return \"B\";\n          case 2: return \"G\";\n          case 3: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SintPack32:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          case 1: return \"B\";\n          case 2: return \"G\";\n          case 3: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16Unorm:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16Snorm:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16Uscaled:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16Sscaled:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16Uint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16Sint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16Sfloat:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Unorm:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Snorm:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Uscaled:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sscaled:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Uint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sfloat:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Unorm:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Snorm:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Uscaled:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Sscaled:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Uint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Sint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Sfloat:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Unorm:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Snorm:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Uscaled:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Sscaled:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Uint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Sint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Sfloat:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32Uint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32Sint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32Sfloat:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32Uint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32Sint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32Sfloat:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32Uint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32Sint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32Sfloat:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32A32Uint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32A32Sint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32A32Sfloat:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64Uint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64Sint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64Sfloat:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64Uint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64Sint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64Sfloat:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64Uint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64Sint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64Sfloat:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64A64Uint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64A64Sint:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64A64Sfloat:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB10G11R11UfloatPack32:\n        switch ( component )\n        {\n          case 0: return \"B\";\n          case 1: return \"G\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eE5B9G9R9UfloatPack32:\n        switch ( component )\n        {\n          case 0: return \"B\";\n          case 1: return \"G\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eD16Unorm:\n        switch ( component )\n        {\n          case 0: return \"D\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eX8D24UnormPack32:\n        switch ( component )\n        {\n          case 0: return \"D\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eD32Sfloat:\n        switch ( component )\n        {\n          case 0: return \"D\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eS8Uint:\n        switch ( component )\n        {\n          case 0: return \"S\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eD16UnormS8Uint:\n        switch ( component )\n        {\n          case 0: return \"D\";\n          case 1: return \"S\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eD24UnormS8Uint:\n        switch ( component )\n        {\n          case 0: return \"D\";\n          case 1: return \"S\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eD32SfloatS8Uint:\n        switch ( component )\n        {\n          case 0: return \"D\";\n          case 1: return \"S\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbUnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbSrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbaUnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbaSrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc2UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc2SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc3UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc3SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc4UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc4SnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc5UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc5SnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc6HUfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc6HSfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc7UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc7SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A1UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A1SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A8UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A8SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11SnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11G11UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11G11SnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8G8R8422Unorm:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"G\";\n          case 3: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8G8422Unorm:\n        switch ( component )\n        {\n          case 0: return \"B\";\n          case 1: return \"G\";\n          case 2: return \"R\";\n          case 3: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane420Unorm:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane420Unorm:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane422Unorm:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane422Unorm:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane444Unorm:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6G10X6Unorm2Pack16:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6G10X6B10X6A10X6Unorm4Pack16:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6G10X6R10X6422Unorm4Pack16:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"G\";\n          case 3: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB10X6G10X6R10X6G10X6422Unorm4Pack16:\n        switch ( component )\n        {\n          case 0: return \"B\";\n          case 1: return \"G\";\n          case 2: return \"R\";\n          case 3: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane420Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane420Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane422Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane422Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane444Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4G12X4Unorm2Pack16:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4G12X4B12X4A12X4Unorm4Pack16:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4G12X4R12X4422Unorm4Pack16:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"G\";\n          case 3: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB12X4G12X4R12X4G12X4422Unorm4Pack16:\n        switch ( component )\n        {\n          case 0: return \"B\";\n          case 1: return \"G\";\n          case 2: return \"R\";\n          case 3: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane420Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane420Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane422Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane422Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane444Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16G16R16422Unorm:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"G\";\n          case 3: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB16G16R16G16422Unorm:\n        switch ( component )\n        {\n          case 0: return \"B\";\n          case 1: return \"G\";\n          case 2: return \"R\";\n          case 3: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane420Unorm:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane420Unorm:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane422Unorm:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane422Unorm:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane444Unorm:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane444Unorm:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane444Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane444Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane444Unorm:\n        switch ( component )\n        {\n          case 0: return \"G\";\n          case 1: return \"B\";\n          case 2: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA4R4G4B4UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          case 1: return \"R\";\n          case 2: return \"G\";\n          case 3: return \"B\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA4B4G4R4UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          case 1: return \"B\";\n          case 2: return \"G\";\n          case 3: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA1B5G5R5UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          case 1: return \"B\";\n          case 2: return \"G\";\n          case 3: return \"R\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8Unorm:\n        switch ( component )\n        {\n          case 0: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc12BppUnormBlockIMG:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc14BppUnormBlockIMG:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc22BppUnormBlockIMG:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc24BppUnormBlockIMG:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc12BppSrgbBlockIMG:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc14BppSrgbBlockIMG:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc22BppSrgbBlockIMG:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc24BppSrgbBlockIMG:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          case 2: return \"B\";\n          case 3: return \"A\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sfixed5NV:\n        switch ( component )\n        {\n          case 0: return \"R\";\n          case 1: return \"G\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n\n      default: return \"\";\n    }\n  }\n\n  // The numeric format of the component\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_14 char const * componentNumericFormat( VULKAN_HPP_NAMESPACE::Format format, uint8_t component )\n  {\n    switch ( format )\n    {\n      case VULKAN_HPP_NAMESPACE::Format::eR4G4UnormPack8:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR4G4B4A4UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB4G4R4A4UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR5G6B5UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB5G6R5UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR5G5B5A1UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB5G5R5A1UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA1R5G5B5UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8Snorm:\n        switch ( component )\n        {\n          case 0: return \"SNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8Uscaled:\n        switch ( component )\n        {\n          case 0: return \"USCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8Sscaled:\n        switch ( component )\n        {\n          case 0: return \"SSCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8Uint:\n        switch ( component )\n        {\n          case 0: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8Sint:\n        switch ( component )\n        {\n          case 0: return \"SINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8Srgb:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Snorm:\n        switch ( component )\n        {\n          case 0: return \"SNORM\";\n          case 1: return \"SNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Uscaled:\n        switch ( component )\n        {\n          case 0: return \"USCALED\";\n          case 1: return \"USCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Sscaled:\n        switch ( component )\n        {\n          case 0: return \"SSCALED\";\n          case 1: return \"SSCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Uint:\n        switch ( component )\n        {\n          case 0: return \"UINT\";\n          case 1: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Sint:\n        switch ( component )\n        {\n          case 0: return \"SINT\";\n          case 1: return \"SINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Srgb:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Snorm:\n        switch ( component )\n        {\n          case 0: return \"SNORM\";\n          case 1: return \"SNORM\";\n          case 2: return \"SNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Uscaled:\n        switch ( component )\n        {\n          case 0: return \"USCALED\";\n          case 1: return \"USCALED\";\n          case 2: return \"USCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Sscaled:\n        switch ( component )\n        {\n          case 0: return \"SSCALED\";\n          case 1: return \"SSCALED\";\n          case 2: return \"SSCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Uint:\n        switch ( component )\n        {\n          case 0: return \"UINT\";\n          case 1: return \"UINT\";\n          case 2: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Sint:\n        switch ( component )\n        {\n          case 0: return \"SINT\";\n          case 1: return \"SINT\";\n          case 2: return \"SINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Srgb:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Snorm:\n        switch ( component )\n        {\n          case 0: return \"SNORM\";\n          case 1: return \"SNORM\";\n          case 2: return \"SNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Uscaled:\n        switch ( component )\n        {\n          case 0: return \"USCALED\";\n          case 1: return \"USCALED\";\n          case 2: return \"USCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Sscaled:\n        switch ( component )\n        {\n          case 0: return \"SSCALED\";\n          case 1: return \"SSCALED\";\n          case 2: return \"SSCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Uint:\n        switch ( component )\n        {\n          case 0: return \"UINT\";\n          case 1: return \"UINT\";\n          case 2: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Sint:\n        switch ( component )\n        {\n          case 0: return \"SINT\";\n          case 1: return \"SINT\";\n          case 2: return \"SINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Srgb:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Snorm:\n        switch ( component )\n        {\n          case 0: return \"SNORM\";\n          case 1: return \"SNORM\";\n          case 2: return \"SNORM\";\n          case 3: return \"SNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Uscaled:\n        switch ( component )\n        {\n          case 0: return \"USCALED\";\n          case 1: return \"USCALED\";\n          case 2: return \"USCALED\";\n          case 3: return \"USCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Sscaled:\n        switch ( component )\n        {\n          case 0: return \"SSCALED\";\n          case 1: return \"SSCALED\";\n          case 2: return \"SSCALED\";\n          case 3: return \"SSCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Uint:\n        switch ( component )\n        {\n          case 0: return \"UINT\";\n          case 1: return \"UINT\";\n          case 2: return \"UINT\";\n          case 3: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Sint:\n        switch ( component )\n        {\n          case 0: return \"SINT\";\n          case 1: return \"SINT\";\n          case 2: return \"SINT\";\n          case 3: return \"SINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Srgb:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Snorm:\n        switch ( component )\n        {\n          case 0: return \"SNORM\";\n          case 1: return \"SNORM\";\n          case 2: return \"SNORM\";\n          case 3: return \"SNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Uscaled:\n        switch ( component )\n        {\n          case 0: return \"USCALED\";\n          case 1: return \"USCALED\";\n          case 2: return \"USCALED\";\n          case 3: return \"USCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Sscaled:\n        switch ( component )\n        {\n          case 0: return \"SSCALED\";\n          case 1: return \"SSCALED\";\n          case 2: return \"SSCALED\";\n          case 3: return \"SSCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Uint:\n        switch ( component )\n        {\n          case 0: return \"UINT\";\n          case 1: return \"UINT\";\n          case 2: return \"UINT\";\n          case 3: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Sint:\n        switch ( component )\n        {\n          case 0: return \"SINT\";\n          case 1: return \"SINT\";\n          case 2: return \"SINT\";\n          case 3: return \"SINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Srgb:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UnormPack32:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SnormPack32:\n        switch ( component )\n        {\n          case 0: return \"SNORM\";\n          case 1: return \"SNORM\";\n          case 2: return \"SNORM\";\n          case 3: return \"SNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UscaledPack32:\n        switch ( component )\n        {\n          case 0: return \"USCALED\";\n          case 1: return \"USCALED\";\n          case 2: return \"USCALED\";\n          case 3: return \"USCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SscaledPack32:\n        switch ( component )\n        {\n          case 0: return \"SSCALED\";\n          case 1: return \"SSCALED\";\n          case 2: return \"SSCALED\";\n          case 3: return \"SSCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UintPack32:\n        switch ( component )\n        {\n          case 0: return \"UINT\";\n          case 1: return \"UINT\";\n          case 2: return \"UINT\";\n          case 3: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SintPack32:\n        switch ( component )\n        {\n          case 0: return \"SINT\";\n          case 1: return \"SINT\";\n          case 2: return \"SINT\";\n          case 3: return \"SINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SrgbPack32:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UnormPack32:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SnormPack32:\n        switch ( component )\n        {\n          case 0: return \"SNORM\";\n          case 1: return \"SNORM\";\n          case 2: return \"SNORM\";\n          case 3: return \"SNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UscaledPack32:\n        switch ( component )\n        {\n          case 0: return \"USCALED\";\n          case 1: return \"USCALED\";\n          case 2: return \"USCALED\";\n          case 3: return \"USCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SscaledPack32:\n        switch ( component )\n        {\n          case 0: return \"SSCALED\";\n          case 1: return \"SSCALED\";\n          case 2: return \"SSCALED\";\n          case 3: return \"SSCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UintPack32:\n        switch ( component )\n        {\n          case 0: return \"UINT\";\n          case 1: return \"UINT\";\n          case 2: return \"UINT\";\n          case 3: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SintPack32:\n        switch ( component )\n        {\n          case 0: return \"SINT\";\n          case 1: return \"SINT\";\n          case 2: return \"SINT\";\n          case 3: return \"SINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UnormPack32:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SnormPack32:\n        switch ( component )\n        {\n          case 0: return \"SNORM\";\n          case 1: return \"SNORM\";\n          case 2: return \"SNORM\";\n          case 3: return \"SNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UscaledPack32:\n        switch ( component )\n        {\n          case 0: return \"USCALED\";\n          case 1: return \"USCALED\";\n          case 2: return \"USCALED\";\n          case 3: return \"USCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SscaledPack32:\n        switch ( component )\n        {\n          case 0: return \"SSCALED\";\n          case 1: return \"SSCALED\";\n          case 2: return \"SSCALED\";\n          case 3: return \"SSCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UintPack32:\n        switch ( component )\n        {\n          case 0: return \"UINT\";\n          case 1: return \"UINT\";\n          case 2: return \"UINT\";\n          case 3: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SintPack32:\n        switch ( component )\n        {\n          case 0: return \"SINT\";\n          case 1: return \"SINT\";\n          case 2: return \"SINT\";\n          case 3: return \"SINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16Snorm:\n        switch ( component )\n        {\n          case 0: return \"SNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16Uscaled:\n        switch ( component )\n        {\n          case 0: return \"USCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16Sscaled:\n        switch ( component )\n        {\n          case 0: return \"SSCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16Uint:\n        switch ( component )\n        {\n          case 0: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16Sint:\n        switch ( component )\n        {\n          case 0: return \"SINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16Sfloat:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Snorm:\n        switch ( component )\n        {\n          case 0: return \"SNORM\";\n          case 1: return \"SNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Uscaled:\n        switch ( component )\n        {\n          case 0: return \"USCALED\";\n          case 1: return \"USCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sscaled:\n        switch ( component )\n        {\n          case 0: return \"SSCALED\";\n          case 1: return \"SSCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Uint:\n        switch ( component )\n        {\n          case 0: return \"UINT\";\n          case 1: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sint:\n        switch ( component )\n        {\n          case 0: return \"SINT\";\n          case 1: return \"SINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sfloat:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Snorm:\n        switch ( component )\n        {\n          case 0: return \"SNORM\";\n          case 1: return \"SNORM\";\n          case 2: return \"SNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Uscaled:\n        switch ( component )\n        {\n          case 0: return \"USCALED\";\n          case 1: return \"USCALED\";\n          case 2: return \"USCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Sscaled:\n        switch ( component )\n        {\n          case 0: return \"SSCALED\";\n          case 1: return \"SSCALED\";\n          case 2: return \"SSCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Uint:\n        switch ( component )\n        {\n          case 0: return \"UINT\";\n          case 1: return \"UINT\";\n          case 2: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Sint:\n        switch ( component )\n        {\n          case 0: return \"SINT\";\n          case 1: return \"SINT\";\n          case 2: return \"SINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Sfloat:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          case 2: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Snorm:\n        switch ( component )\n        {\n          case 0: return \"SNORM\";\n          case 1: return \"SNORM\";\n          case 2: return \"SNORM\";\n          case 3: return \"SNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Uscaled:\n        switch ( component )\n        {\n          case 0: return \"USCALED\";\n          case 1: return \"USCALED\";\n          case 2: return \"USCALED\";\n          case 3: return \"USCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Sscaled:\n        switch ( component )\n        {\n          case 0: return \"SSCALED\";\n          case 1: return \"SSCALED\";\n          case 2: return \"SSCALED\";\n          case 3: return \"SSCALED\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Uint:\n        switch ( component )\n        {\n          case 0: return \"UINT\";\n          case 1: return \"UINT\";\n          case 2: return \"UINT\";\n          case 3: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Sint:\n        switch ( component )\n        {\n          case 0: return \"SINT\";\n          case 1: return \"SINT\";\n          case 2: return \"SINT\";\n          case 3: return \"SINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Sfloat:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          case 2: return \"SFLOAT\";\n          case 3: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32Uint:\n        switch ( component )\n        {\n          case 0: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32Sint:\n        switch ( component )\n        {\n          case 0: return \"SINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32Sfloat:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32Uint:\n        switch ( component )\n        {\n          case 0: return \"UINT\";\n          case 1: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32Sint:\n        switch ( component )\n        {\n          case 0: return \"SINT\";\n          case 1: return \"SINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32Sfloat:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32Uint:\n        switch ( component )\n        {\n          case 0: return \"UINT\";\n          case 1: return \"UINT\";\n          case 2: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32Sint:\n        switch ( component )\n        {\n          case 0: return \"SINT\";\n          case 1: return \"SINT\";\n          case 2: return \"SINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32Sfloat:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          case 2: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32A32Uint:\n        switch ( component )\n        {\n          case 0: return \"UINT\";\n          case 1: return \"UINT\";\n          case 2: return \"UINT\";\n          case 3: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32A32Sint:\n        switch ( component )\n        {\n          case 0: return \"SINT\";\n          case 1: return \"SINT\";\n          case 2: return \"SINT\";\n          case 3: return \"SINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32A32Sfloat:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          case 2: return \"SFLOAT\";\n          case 3: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64Uint:\n        switch ( component )\n        {\n          case 0: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64Sint:\n        switch ( component )\n        {\n          case 0: return \"SINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64Sfloat:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64Uint:\n        switch ( component )\n        {\n          case 0: return \"UINT\";\n          case 1: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64Sint:\n        switch ( component )\n        {\n          case 0: return \"SINT\";\n          case 1: return \"SINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64Sfloat:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64Uint:\n        switch ( component )\n        {\n          case 0: return \"UINT\";\n          case 1: return \"UINT\";\n          case 2: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64Sint:\n        switch ( component )\n        {\n          case 0: return \"SINT\";\n          case 1: return \"SINT\";\n          case 2: return \"SINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64Sfloat:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          case 2: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64A64Uint:\n        switch ( component )\n        {\n          case 0: return \"UINT\";\n          case 1: return \"UINT\";\n          case 2: return \"UINT\";\n          case 3: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64A64Sint:\n        switch ( component )\n        {\n          case 0: return \"SINT\";\n          case 1: return \"SINT\";\n          case 2: return \"SINT\";\n          case 3: return \"SINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64A64Sfloat:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          case 2: return \"SFLOAT\";\n          case 3: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB10G11R11UfloatPack32:\n        switch ( component )\n        {\n          case 0: return \"UFLOAT\";\n          case 1: return \"UFLOAT\";\n          case 2: return \"UFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eE5B9G9R9UfloatPack32:\n        switch ( component )\n        {\n          case 0: return \"UFLOAT\";\n          case 1: return \"UFLOAT\";\n          case 2: return \"UFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eD16Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eX8D24UnormPack32:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eD32Sfloat:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eS8Uint:\n        switch ( component )\n        {\n          case 0: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eD16UnormS8Uint:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eD24UnormS8Uint:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eD32SfloatS8Uint:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"UINT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbUnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbSrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbaUnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbaSrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc2UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc2SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc3UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc3SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc4UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc4SnormBlock:\n        switch ( component )\n        {\n          case 0: return \"SNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc5UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc5SnormBlock:\n        switch ( component )\n        {\n          case 0: return \"SNORM\";\n          case 1: return \"SNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc6HUfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"UFLOAT\";\n          case 1: return \"UFLOAT\";\n          case 2: return \"UFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc6HSfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          case 2: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc7UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eBc7SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A1UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A1SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A8UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A8SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11SnormBlock:\n        switch ( component )\n        {\n          case 0: return \"SNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11G11UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11G11SnormBlock:\n        switch ( component )\n        {\n          case 0: return \"SNORM\";\n          case 1: return \"SNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12UnormBlock:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12SrgbBlock:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8G8R8422Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8G8422Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane420Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane420Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane422Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane422Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane444Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6G10X6Unorm2Pack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6G10X6B10X6A10X6Unorm4Pack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6G10X6R10X6422Unorm4Pack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB10X6G10X6R10X6G10X6422Unorm4Pack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane420Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane420Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane422Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane422Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane444Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4G12X4Unorm2Pack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4G12X4B12X4A12X4Unorm4Pack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4G12X4R12X4422Unorm4Pack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB12X4G12X4R12X4G12X4422Unorm4Pack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane420Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane420Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane422Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane422Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane444Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16G16R16422Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eB16G16R16G16422Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane420Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane420Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane422Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane422Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane444Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane444Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane444Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane444Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane444Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA4R4G4B4UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA4B4G4R4UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          case 2: return \"SFLOAT\";\n          case 3: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          case 2: return \"SFLOAT\";\n          case 3: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          case 2: return \"SFLOAT\";\n          case 3: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          case 2: return \"SFLOAT\";\n          case 3: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          case 2: return \"SFLOAT\";\n          case 3: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          case 2: return \"SFLOAT\";\n          case 3: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          case 2: return \"SFLOAT\";\n          case 3: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          case 2: return \"SFLOAT\";\n          case 3: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          case 2: return \"SFLOAT\";\n          case 3: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          case 2: return \"SFLOAT\";\n          case 3: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          case 2: return \"SFLOAT\";\n          case 3: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          case 2: return \"SFLOAT\";\n          case 3: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          case 2: return \"SFLOAT\";\n          case 3: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12SfloatBlock:\n        switch ( component )\n        {\n          case 0: return \"SFLOAT\";\n          case 1: return \"SFLOAT\";\n          case 2: return \"SFLOAT\";\n          case 3: return \"SFLOAT\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA1B5G5R5UnormPack16:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eA8Unorm:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc12BppUnormBlockIMG:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc14BppUnormBlockIMG:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc22BppUnormBlockIMG:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc24BppUnormBlockIMG:\n        switch ( component )\n        {\n          case 0: return \"UNORM\";\n          case 1: return \"UNORM\";\n          case 2: return \"UNORM\";\n          case 3: return \"UNORM\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc12BppSrgbBlockIMG:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc14BppSrgbBlockIMG:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc22BppSrgbBlockIMG:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc24BppSrgbBlockIMG:\n        switch ( component )\n        {\n          case 0: return \"SRGB\";\n          case 1: return \"SRGB\";\n          case 2: return \"SRGB\";\n          case 3: return \"SRGB\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sfixed5NV:\n        switch ( component )\n        {\n          case 0: return \"SFIXED5\";\n          case 1: return \"SFIXED5\";\n          default: VULKAN_HPP_ASSERT( false ); return \"\";\n        }\n\n      default: return \"\";\n    }\n  }\n\n  // The plane this component lies in.\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_14 uint8_t componentPlaneIndex( VULKAN_HPP_NAMESPACE::Format format, uint8_t component )\n  {\n    switch ( format )\n    {\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane420Unorm:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane420Unorm:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane422Unorm:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane422Unorm:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane444Unorm:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane420Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane420Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane422Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane422Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane444Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane420Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane420Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane422Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane422Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane444Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane420Unorm:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane420Unorm:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane422Unorm:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane422Unorm:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane444Unorm:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane444Unorm:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane444Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane444Unorm3Pack16:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane444Unorm:\n        switch ( component )\n        {\n          case 0: return 0;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 0;\n        }\n\n      default: return 0;\n    }\n  }\n\n  // True, if the components of this format are compressed, otherwise false.\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_14 bool componentsAreCompressed( VULKAN_HPP_NAMESPACE::Format format )\n  {\n    switch ( format )\n    {\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbUnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbSrgbBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbaUnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbaSrgbBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eBc2UnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eBc2SrgbBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eBc3UnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eBc3SrgbBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eBc4UnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eBc4SnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eBc5UnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eBc5SnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eBc6HUfloatBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eBc6HSfloatBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eBc7UnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eBc7SrgbBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8UnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8SrgbBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A1UnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A1SrgbBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A8UnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A8SrgbBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4UnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4SrgbBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4UnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4SrgbBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5UnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5SrgbBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5UnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5SrgbBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6UnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6SrgbBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5UnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5SrgbBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6UnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6SrgbBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8UnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8SrgbBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5UnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5SrgbBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6UnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6SrgbBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8UnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8SrgbBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10UnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10SrgbBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10UnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10SrgbBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12UnormBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12SrgbBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4SfloatBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4SfloatBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5SfloatBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5SfloatBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6SfloatBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5SfloatBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6SfloatBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8SfloatBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5SfloatBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6SfloatBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8SfloatBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10SfloatBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10SfloatBlock:\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12SfloatBlock:\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc12BppUnormBlockIMG:\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc14BppUnormBlockIMG:\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc22BppUnormBlockIMG:\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc24BppUnormBlockIMG:\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc12BppSrgbBlockIMG:\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc14BppSrgbBlockIMG:\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc22BppSrgbBlockIMG:\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc24BppSrgbBlockIMG: return true;\n      default: return false;\n    }\n  }\n\n  // A textual description of the compression scheme, or an empty string if it is not compressed\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_14 char const * compressionScheme( VULKAN_HPP_NAMESPACE::Format format )\n  {\n    switch ( format )\n    {\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbUnormBlock: return \"BC\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbSrgbBlock: return \"BC\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbaUnormBlock: return \"BC\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbaSrgbBlock: return \"BC\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc2UnormBlock: return \"BC\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc2SrgbBlock: return \"BC\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc3UnormBlock: return \"BC\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc3SrgbBlock: return \"BC\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc4UnormBlock: return \"BC\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc4SnormBlock: return \"BC\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc5UnormBlock: return \"BC\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc5SnormBlock: return \"BC\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc6HUfloatBlock: return \"BC\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc6HSfloatBlock: return \"BC\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc7UnormBlock: return \"BC\";\n      case VULKAN_HPP_NAMESPACE::Format::eBc7SrgbBlock: return \"BC\";\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8UnormBlock: return \"ETC2\";\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8SrgbBlock: return \"ETC2\";\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A1UnormBlock: return \"ETC2\";\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A1SrgbBlock: return \"ETC2\";\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A8UnormBlock: return \"ETC2\";\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A8SrgbBlock: return \"ETC2\";\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11UnormBlock: return \"EAC\";\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11SnormBlock: return \"EAC\";\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11G11UnormBlock: return \"EAC\";\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11G11SnormBlock: return \"EAC\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4UnormBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4SrgbBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4UnormBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4SrgbBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5UnormBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5SrgbBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5UnormBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5SrgbBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6UnormBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6SrgbBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5UnormBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5SrgbBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6UnormBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6SrgbBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8UnormBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8SrgbBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5UnormBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5SrgbBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6UnormBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6SrgbBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8UnormBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8SrgbBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10UnormBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10SrgbBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10UnormBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10SrgbBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12UnormBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12SrgbBlock: return \"ASTC LDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4SfloatBlock: return \"ASTC HDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4SfloatBlock: return \"ASTC HDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5SfloatBlock: return \"ASTC HDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5SfloatBlock: return \"ASTC HDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6SfloatBlock: return \"ASTC HDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5SfloatBlock: return \"ASTC HDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6SfloatBlock: return \"ASTC HDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8SfloatBlock: return \"ASTC HDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5SfloatBlock: return \"ASTC HDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6SfloatBlock: return \"ASTC HDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8SfloatBlock: return \"ASTC HDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10SfloatBlock: return \"ASTC HDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10SfloatBlock: return \"ASTC HDR\";\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12SfloatBlock: return \"ASTC HDR\";\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc12BppUnormBlockIMG: return \"PVRTC\";\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc14BppUnormBlockIMG: return \"PVRTC\";\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc22BppUnormBlockIMG: return \"PVRTC\";\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc24BppUnormBlockIMG: return \"PVRTC\";\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc12BppSrgbBlockIMG: return \"PVRTC\";\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc14BppSrgbBlockIMG: return \"PVRTC\";\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc22BppSrgbBlockIMG: return \"PVRTC\";\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc24BppSrgbBlockIMG: return \"PVRTC\";\n\n      default: return \"\";\n    }\n  }\n\n  // True, if this format is a compressed one.\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_14 bool isCompressed( VULKAN_HPP_NAMESPACE::Format format )\n  {\n    return ( *VULKAN_HPP_NAMESPACE::compressionScheme( format ) != 0 );\n  }\n\n  // The number of bits into which the format is packed. A single image element in this format\n  // can be stored in the same space as a scalar type of this bit width.\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_14 uint8_t packed( VULKAN_HPP_NAMESPACE::Format format )\n  {\n    switch ( format )\n    {\n      case VULKAN_HPP_NAMESPACE::Format::eR4G4UnormPack8: return 8;\n      case VULKAN_HPP_NAMESPACE::Format::eR4G4B4A4UnormPack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eB4G4R4A4UnormPack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eR5G6B5UnormPack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eB5G6R5UnormPack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eR5G5B5A1UnormPack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eB5G5R5A1UnormPack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eA1R5G5B5UnormPack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UnormPack32: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SnormPack32: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UscaledPack32: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SscaledPack32: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UintPack32: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SintPack32: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SrgbPack32: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UnormPack32: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SnormPack32: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UscaledPack32: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SscaledPack32: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UintPack32: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SintPack32: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UnormPack32: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SnormPack32: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UscaledPack32: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SscaledPack32: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UintPack32: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SintPack32: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eB10G11R11UfloatPack32: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eE5B9G9R9UfloatPack32: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eX8D24UnormPack32: return 32;\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6UnormPack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6G10X6Unorm2Pack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6G10X6B10X6A10X6Unorm4Pack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6G10X6R10X6422Unorm4Pack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eB10X6G10X6R10X6G10X6422Unorm4Pack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane420Unorm3Pack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane420Unorm3Pack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane422Unorm3Pack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane422Unorm3Pack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane444Unorm3Pack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4UnormPack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4G12X4Unorm2Pack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4G12X4B12X4A12X4Unorm4Pack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4G12X4R12X4422Unorm4Pack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eB12X4G12X4R12X4G12X4422Unorm4Pack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane420Unorm3Pack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane420Unorm3Pack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane422Unorm3Pack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane422Unorm3Pack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane444Unorm3Pack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane444Unorm3Pack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane444Unorm3Pack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eA4R4G4B4UnormPack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eA4B4G4R4UnormPack16: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eA1B5G5R5UnormPack16: return 16;\n\n      default: return 0;\n    }\n  }\n\n  // The single-plane format that this plane is compatible with.\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_14 VULKAN_HPP_NAMESPACE::Format planeCompatibleFormat( VULKAN_HPP_NAMESPACE::Format format, uint8_t plane )\n  {\n    switch ( format )\n    {\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane420Unorm:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR8Unorm;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR8Unorm;\n          case 2: return VULKAN_HPP_NAMESPACE::Format::eR8Unorm;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane420Unorm:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR8Unorm;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR8G8Unorm;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane422Unorm:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR8Unorm;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR8Unorm;\n          case 2: return VULKAN_HPP_NAMESPACE::Format::eR8Unorm;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane422Unorm:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR8Unorm;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR8G8Unorm;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane444Unorm:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR8Unorm;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR8Unorm;\n          case 2: return VULKAN_HPP_NAMESPACE::Format::eR8Unorm;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane420Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR10X6UnormPack16;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR10X6UnormPack16;\n          case 2: return VULKAN_HPP_NAMESPACE::Format::eR10X6UnormPack16;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane420Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR10X6UnormPack16;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR10X6G10X6Unorm2Pack16;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane422Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR10X6UnormPack16;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR10X6UnormPack16;\n          case 2: return VULKAN_HPP_NAMESPACE::Format::eR10X6UnormPack16;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane422Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR10X6UnormPack16;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR10X6G10X6Unorm2Pack16;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane444Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR10X6UnormPack16;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR10X6UnormPack16;\n          case 2: return VULKAN_HPP_NAMESPACE::Format::eR10X6UnormPack16;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane420Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR12X4UnormPack16;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR12X4UnormPack16;\n          case 2: return VULKAN_HPP_NAMESPACE::Format::eR12X4UnormPack16;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane420Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR12X4UnormPack16;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR12X4G12X4Unorm2Pack16;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane422Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR12X4UnormPack16;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR12X4UnormPack16;\n          case 2: return VULKAN_HPP_NAMESPACE::Format::eR12X4UnormPack16;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane422Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR12X4UnormPack16;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR12X4G12X4Unorm2Pack16;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane444Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR12X4UnormPack16;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR12X4UnormPack16;\n          case 2: return VULKAN_HPP_NAMESPACE::Format::eR12X4UnormPack16;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane420Unorm:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR16Unorm;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR16Unorm;\n          case 2: return VULKAN_HPP_NAMESPACE::Format::eR16Unorm;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane420Unorm:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR16Unorm;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR16G16Unorm;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane422Unorm:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR16Unorm;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR16Unorm;\n          case 2: return VULKAN_HPP_NAMESPACE::Format::eR16Unorm;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane422Unorm:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR16Unorm;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR16G16Unorm;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane444Unorm:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR16Unorm;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR16Unorm;\n          case 2: return VULKAN_HPP_NAMESPACE::Format::eR16Unorm;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane444Unorm:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR8Unorm;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR8G8Unorm;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane444Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR10X6UnormPack16;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR10X6G10X6Unorm2Pack16;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane444Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR12X4UnormPack16;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR12X4G12X4Unorm2Pack16;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane444Unorm:\n        switch ( plane )\n        {\n          case 0: return VULKAN_HPP_NAMESPACE::Format::eR16Unorm;\n          case 1: return VULKAN_HPP_NAMESPACE::Format::eR16G16Unorm;\n          default: VULKAN_HPP_ASSERT( false ); return VULKAN_HPP_NAMESPACE::Format::eUndefined;\n        }\n\n      default: VULKAN_HPP_ASSERT( plane == 0 ); return format;\n    }\n  }\n\n  // The number of image planes of this format.\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_14 uint8_t planeCount( VULKAN_HPP_NAMESPACE::Format format )\n  {\n    switch ( format )\n    {\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane420Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane420Unorm: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane422Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane422Unorm: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane444Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane420Unorm3Pack16: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane420Unorm3Pack16: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane422Unorm3Pack16: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane422Unorm3Pack16: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane444Unorm3Pack16: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane420Unorm3Pack16: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane420Unorm3Pack16: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane422Unorm3Pack16: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane422Unorm3Pack16: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane444Unorm3Pack16: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane420Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane420Unorm: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane422Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane422Unorm: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane444Unorm: return 3;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane444Unorm: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane444Unorm3Pack16: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane444Unorm3Pack16: return 2;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane444Unorm: return 2;\n\n      default: return 1;\n    }\n  }\n\n  // The relative height of this plane. A value of k means that this plane is 1/k the height of the overall format.\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_14 uint8_t planeHeightDivisor( VULKAN_HPP_NAMESPACE::Format format, uint8_t plane )\n  {\n    switch ( format )\n    {\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane420Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane420Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane422Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane422Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane444Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane420Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane420Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane422Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane422Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane444Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane420Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane420Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane422Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane422Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane444Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane420Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane420Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane422Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane422Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane444Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane444Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane444Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane444Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane444Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n\n      default: VULKAN_HPP_ASSERT( plane == 0 ); return 1;\n    }\n  }\n\n  // The relative width of this plane. A value of k means that this plane is 1/k the width of the overall format.\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_14 uint8_t planeWidthDivisor( VULKAN_HPP_NAMESPACE::Format format, uint8_t plane )\n  {\n    switch ( format )\n    {\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane420Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane420Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane422Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane422Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane444Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane420Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane420Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane422Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane422Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane444Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane420Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane420Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane422Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane422Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane444Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane420Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane420Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane422Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          case 2: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane422Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 2;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane444Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          case 2: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane444Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane444Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane444Unorm3Pack16:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane444Unorm:\n        switch ( plane )\n        {\n          case 0: return 1;\n          case 1: return 1;\n          default: VULKAN_HPP_ASSERT( false ); return 1;\n        }\n\n      default: VULKAN_HPP_ASSERT( plane == 0 ); return 1;\n    }\n  }\n\n  // The number of texels in a texel block.\n  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR_14 uint8_t texelsPerBlock( VULKAN_HPP_NAMESPACE::Format format )\n  {\n    switch ( format )\n    {\n      case VULKAN_HPP_NAMESPACE::Format::eR4G4UnormPack8: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR4G4B4A4UnormPack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eB4G4R4A4UnormPack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR5G6B5UnormPack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eB5G6R5UnormPack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR5G5B5A1UnormPack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eB5G5R5A1UnormPack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eA1R5G5B5UnormPack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8Snorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8Uscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8Sscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8Sint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8Srgb: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Snorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Uscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Sscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Sint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8Srgb: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Snorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Uscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Sscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Sint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8Srgb: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Snorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Uscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Sscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Sint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8Srgb: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Snorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Uscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Sscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Sint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR8G8B8A8Srgb: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Snorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Uscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Sscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Sint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8A8Srgb: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UnormPack32: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SnormPack32: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UscaledPack32: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SscaledPack32: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8UintPack32: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SintPack32: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eA8B8G8R8SrgbPack32: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UnormPack32: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SnormPack32: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UscaledPack32: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SscaledPack32: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10UintPack32: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eA2R10G10B10SintPack32: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UnormPack32: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SnormPack32: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UscaledPack32: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SscaledPack32: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10UintPack32: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eA2B10G10R10SintPack32: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16Snorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16Uscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16Sscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16Sint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16Sfloat: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Snorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Uscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sfloat: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Snorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Uscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Sscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Sint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16Sfloat: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Snorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Uscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Sscaled: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Sint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16B16A16Sfloat: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR32Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR32Sint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR32Sfloat: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32Sint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32Sfloat: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32Sint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32Sfloat: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32A32Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32A32Sint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR32G32B32A32Sfloat: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR64Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR64Sint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR64Sfloat: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64Sint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64Sfloat: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64Sint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64Sfloat: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64A64Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64A64Sint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR64G64B64A64Sfloat: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eB10G11R11UfloatPack32: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eE5B9G9R9UfloatPack32: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eD16Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eX8D24UnormPack32: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eD32Sfloat: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eS8Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eD16UnormS8Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eD24UnormS8Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eD32SfloatS8Uint: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbUnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbSrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbaUnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc1RgbaSrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc2UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc2SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc3UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc3SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc4UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc4SnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc5UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc5SnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc6HUfloatBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc6HSfloatBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc7UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eBc7SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A1UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A1SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A8UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eEtc2R8G8B8A8SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11SnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11G11UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eEacR11G11SnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4UnormBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4SrgbBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4UnormBlock: return 20;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4SrgbBlock: return 20;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5UnormBlock: return 25;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5SrgbBlock: return 25;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5UnormBlock: return 30;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5SrgbBlock: return 30;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6UnormBlock: return 36;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6SrgbBlock: return 36;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5UnormBlock: return 40;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5SrgbBlock: return 40;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6UnormBlock: return 48;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6SrgbBlock: return 48;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8UnormBlock: return 64;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8SrgbBlock: return 64;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5UnormBlock: return 50;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5SrgbBlock: return 50;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6UnormBlock: return 60;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6SrgbBlock: return 60;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8UnormBlock: return 80;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8SrgbBlock: return 80;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10UnormBlock: return 100;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10SrgbBlock: return 100;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10UnormBlock: return 120;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10SrgbBlock: return 120;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12UnormBlock: return 144;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12SrgbBlock: return 144;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8G8R8422Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eB8G8R8G8422Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane420Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane420Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane422Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane422Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R83Plane444Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6UnormPack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6G10X6Unorm2Pack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR10X6G10X6B10X6A10X6Unorm4Pack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6G10X6R10X6422Unorm4Pack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eB10X6G10X6R10X6G10X6422Unorm4Pack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane420Unorm3Pack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane420Unorm3Pack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane422Unorm3Pack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane422Unorm3Pack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X63Plane444Unorm3Pack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4UnormPack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4G12X4Unorm2Pack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR12X4G12X4B12X4A12X4Unorm4Pack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4G12X4R12X4422Unorm4Pack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eB12X4G12X4R12X4G12X4422Unorm4Pack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane420Unorm3Pack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane420Unorm3Pack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane422Unorm3Pack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane422Unorm3Pack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X43Plane444Unorm3Pack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16G16R16422Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eB16G16R16G16422Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane420Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane420Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane422Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane422Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R163Plane444Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG8B8R82Plane444Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG10X6B10X6R10X62Plane444Unorm3Pack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG12X4B12X4R12X42Plane444Unorm3Pack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eG16B16R162Plane444Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eA4R4G4B4UnormPack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eA4B4G4R4UnormPack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc4x4SfloatBlock: return 16;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x4SfloatBlock: return 20;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc5x5SfloatBlock: return 25;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x5SfloatBlock: return 30;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc6x6SfloatBlock: return 36;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x5SfloatBlock: return 40;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x6SfloatBlock: return 48;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc8x8SfloatBlock: return 64;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x5SfloatBlock: return 50;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x6SfloatBlock: return 60;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x8SfloatBlock: return 80;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc10x10SfloatBlock: return 100;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x10SfloatBlock: return 120;\n      case VULKAN_HPP_NAMESPACE::Format::eAstc12x12SfloatBlock: return 144;\n      case VULKAN_HPP_NAMESPACE::Format::eA1B5G5R5UnormPack16: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eA8Unorm: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc12BppUnormBlockIMG: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc14BppUnormBlockIMG: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc22BppUnormBlockIMG: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc24BppUnormBlockIMG: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc12BppSrgbBlockIMG: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc14BppSrgbBlockIMG: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc22BppSrgbBlockIMG: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::ePvrtc24BppSrgbBlockIMG: return 1;\n      case VULKAN_HPP_NAMESPACE::Format::eR16G16Sfixed5NV: return 1;\n\n      default: VULKAN_HPP_ASSERT( false ); return 0;\n    }\n  }\n\n}  // namespace VULKAN_HPP_NAMESPACE\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_fuchsia.h",
    "content": "#ifndef VULKAN_FUCHSIA_H_\n#define VULKAN_FUCHSIA_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// VK_FUCHSIA_imagepipe_surface is a preprocessor guard. Do not pass it to API calls.\n#define VK_FUCHSIA_imagepipe_surface 1\n#define VK_FUCHSIA_IMAGEPIPE_SURFACE_SPEC_VERSION 1\n#define VK_FUCHSIA_IMAGEPIPE_SURFACE_EXTENSION_NAME \"VK_FUCHSIA_imagepipe_surface\"\ntypedef VkFlags VkImagePipeSurfaceCreateFlagsFUCHSIA;\ntypedef struct VkImagePipeSurfaceCreateInfoFUCHSIA {\n    VkStructureType                         sType;\n    const void*                             pNext;\n    VkImagePipeSurfaceCreateFlagsFUCHSIA    flags;\n    zx_handle_t                             imagePipeHandle;\n} VkImagePipeSurfaceCreateInfoFUCHSIA;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateImagePipeSurfaceFUCHSIA)(VkInstance instance, const VkImagePipeSurfaceCreateInfoFUCHSIA* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateImagePipeSurfaceFUCHSIA(\n    VkInstance                                  instance,\n    const VkImagePipeSurfaceCreateInfoFUCHSIA*  pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSurfaceKHR*                               pSurface);\n#endif\n\n\n// VK_FUCHSIA_external_memory is a preprocessor guard. Do not pass it to API calls.\n#define VK_FUCHSIA_external_memory 1\n#define VK_FUCHSIA_EXTERNAL_MEMORY_SPEC_VERSION 1\n#define VK_FUCHSIA_EXTERNAL_MEMORY_EXTENSION_NAME \"VK_FUCHSIA_external_memory\"\ntypedef struct VkImportMemoryZirconHandleInfoFUCHSIA {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkExternalMemoryHandleTypeFlagBits    handleType;\n    zx_handle_t                           handle;\n} VkImportMemoryZirconHandleInfoFUCHSIA;\n\ntypedef struct VkMemoryZirconHandlePropertiesFUCHSIA {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           memoryTypeBits;\n} VkMemoryZirconHandlePropertiesFUCHSIA;\n\ntypedef struct VkMemoryGetZirconHandleInfoFUCHSIA {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkDeviceMemory                        memory;\n    VkExternalMemoryHandleTypeFlagBits    handleType;\n} VkMemoryGetZirconHandleInfoFUCHSIA;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetMemoryZirconHandleFUCHSIA)(VkDevice device, const VkMemoryGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo, zx_handle_t* pZirconHandle);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA)(VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, zx_handle_t zirconHandle, VkMemoryZirconHandlePropertiesFUCHSIA* pMemoryZirconHandleProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryZirconHandleFUCHSIA(\n    VkDevice                                    device,\n    const VkMemoryGetZirconHandleInfoFUCHSIA*   pGetZirconHandleInfo,\n    zx_handle_t*                                pZirconHandle);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryZirconHandlePropertiesFUCHSIA(\n    VkDevice                                    device,\n    VkExternalMemoryHandleTypeFlagBits          handleType,\n    zx_handle_t                                 zirconHandle,\n    VkMemoryZirconHandlePropertiesFUCHSIA*      pMemoryZirconHandleProperties);\n#endif\n\n\n// VK_FUCHSIA_external_semaphore is a preprocessor guard. Do not pass it to API calls.\n#define VK_FUCHSIA_external_semaphore 1\n#define VK_FUCHSIA_EXTERNAL_SEMAPHORE_SPEC_VERSION 1\n#define VK_FUCHSIA_EXTERNAL_SEMAPHORE_EXTENSION_NAME \"VK_FUCHSIA_external_semaphore\"\ntypedef struct VkImportSemaphoreZirconHandleInfoFUCHSIA {\n    VkStructureType                          sType;\n    const void*                              pNext;\n    VkSemaphore                              semaphore;\n    VkSemaphoreImportFlags                   flags;\n    VkExternalSemaphoreHandleTypeFlagBits    handleType;\n    zx_handle_t                              zirconHandle;\n} VkImportSemaphoreZirconHandleInfoFUCHSIA;\n\ntypedef struct VkSemaphoreGetZirconHandleInfoFUCHSIA {\n    VkStructureType                          sType;\n    const void*                              pNext;\n    VkSemaphore                              semaphore;\n    VkExternalSemaphoreHandleTypeFlagBits    handleType;\n} VkSemaphoreGetZirconHandleInfoFUCHSIA;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkImportSemaphoreZirconHandleFUCHSIA)(VkDevice device, const VkImportSemaphoreZirconHandleInfoFUCHSIA* pImportSemaphoreZirconHandleInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetSemaphoreZirconHandleFUCHSIA)(VkDevice device, const VkSemaphoreGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo, zx_handle_t* pZirconHandle);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkImportSemaphoreZirconHandleFUCHSIA(\n    VkDevice                                    device,\n    const VkImportSemaphoreZirconHandleInfoFUCHSIA* pImportSemaphoreZirconHandleInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreZirconHandleFUCHSIA(\n    VkDevice                                    device,\n    const VkSemaphoreGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo,\n    zx_handle_t*                                pZirconHandle);\n#endif\n\n\n// VK_FUCHSIA_buffer_collection is a preprocessor guard. Do not pass it to API calls.\n#define VK_FUCHSIA_buffer_collection 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBufferCollectionFUCHSIA)\n#define VK_FUCHSIA_BUFFER_COLLECTION_SPEC_VERSION 2\n#define VK_FUCHSIA_BUFFER_COLLECTION_EXTENSION_NAME \"VK_FUCHSIA_buffer_collection\"\ntypedef VkFlags VkImageFormatConstraintsFlagsFUCHSIA;\n\ntypedef enum VkImageConstraintsInfoFlagBitsFUCHSIA {\n    VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_RARELY_FUCHSIA = 0x00000001,\n    VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_OFTEN_FUCHSIA = 0x00000002,\n    VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_RARELY_FUCHSIA = 0x00000004,\n    VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_OFTEN_FUCHSIA = 0x00000008,\n    VK_IMAGE_CONSTRAINTS_INFO_PROTECTED_OPTIONAL_FUCHSIA = 0x00000010,\n    VK_IMAGE_CONSTRAINTS_INFO_FLAG_BITS_MAX_ENUM_FUCHSIA = 0x7FFFFFFF\n} VkImageConstraintsInfoFlagBitsFUCHSIA;\ntypedef VkFlags VkImageConstraintsInfoFlagsFUCHSIA;\ntypedef struct VkBufferCollectionCreateInfoFUCHSIA {\n    VkStructureType    sType;\n    const void*        pNext;\n    zx_handle_t        collectionToken;\n} VkBufferCollectionCreateInfoFUCHSIA;\n\ntypedef struct VkImportMemoryBufferCollectionFUCHSIA {\n    VkStructureType              sType;\n    const void*                  pNext;\n    VkBufferCollectionFUCHSIA    collection;\n    uint32_t                     index;\n} VkImportMemoryBufferCollectionFUCHSIA;\n\ntypedef struct VkBufferCollectionImageCreateInfoFUCHSIA {\n    VkStructureType              sType;\n    const void*                  pNext;\n    VkBufferCollectionFUCHSIA    collection;\n    uint32_t                     index;\n} VkBufferCollectionImageCreateInfoFUCHSIA;\n\ntypedef struct VkBufferCollectionConstraintsInfoFUCHSIA {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           minBufferCount;\n    uint32_t           maxBufferCount;\n    uint32_t           minBufferCountForCamping;\n    uint32_t           minBufferCountForDedicatedSlack;\n    uint32_t           minBufferCountForSharedSlack;\n} VkBufferCollectionConstraintsInfoFUCHSIA;\n\ntypedef struct VkBufferConstraintsInfoFUCHSIA {\n    VkStructureType                             sType;\n    const void*                                 pNext;\n    VkBufferCreateInfo                          createInfo;\n    VkFormatFeatureFlags                        requiredFormatFeatures;\n    VkBufferCollectionConstraintsInfoFUCHSIA    bufferCollectionConstraints;\n} VkBufferConstraintsInfoFUCHSIA;\n\ntypedef struct VkBufferCollectionBufferCreateInfoFUCHSIA {\n    VkStructureType              sType;\n    const void*                  pNext;\n    VkBufferCollectionFUCHSIA    collection;\n    uint32_t                     index;\n} VkBufferCollectionBufferCreateInfoFUCHSIA;\n\ntypedef struct VkSysmemColorSpaceFUCHSIA {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           colorSpace;\n} VkSysmemColorSpaceFUCHSIA;\n\ntypedef struct VkBufferCollectionPropertiesFUCHSIA {\n    VkStructureType                  sType;\n    void*                            pNext;\n    uint32_t                         memoryTypeBits;\n    uint32_t                         bufferCount;\n    uint32_t                         createInfoIndex;\n    uint64_t                         sysmemPixelFormat;\n    VkFormatFeatureFlags             formatFeatures;\n    VkSysmemColorSpaceFUCHSIA        sysmemColorSpaceIndex;\n    VkComponentMapping               samplerYcbcrConversionComponents;\n    VkSamplerYcbcrModelConversion    suggestedYcbcrModel;\n    VkSamplerYcbcrRange              suggestedYcbcrRange;\n    VkChromaLocation                 suggestedXChromaOffset;\n    VkChromaLocation                 suggestedYChromaOffset;\n} VkBufferCollectionPropertiesFUCHSIA;\n\ntypedef struct VkImageFormatConstraintsInfoFUCHSIA {\n    VkStructureType                         sType;\n    const void*                             pNext;\n    VkImageCreateInfo                       imageCreateInfo;\n    VkFormatFeatureFlags                    requiredFormatFeatures;\n    VkImageFormatConstraintsFlagsFUCHSIA    flags;\n    uint64_t                                sysmemPixelFormat;\n    uint32_t                                colorSpaceCount;\n    const VkSysmemColorSpaceFUCHSIA*        pColorSpaces;\n} VkImageFormatConstraintsInfoFUCHSIA;\n\ntypedef struct VkImageConstraintsInfoFUCHSIA {\n    VkStructureType                               sType;\n    const void*                                   pNext;\n    uint32_t                                      formatConstraintsCount;\n    const VkImageFormatConstraintsInfoFUCHSIA*    pFormatConstraints;\n    VkBufferCollectionConstraintsInfoFUCHSIA      bufferCollectionConstraints;\n    VkImageConstraintsInfoFlagsFUCHSIA            flags;\n} VkImageConstraintsInfoFUCHSIA;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateBufferCollectionFUCHSIA)(VkDevice device, const VkBufferCollectionCreateInfoFUCHSIA* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBufferCollectionFUCHSIA* pCollection);\ntypedef VkResult (VKAPI_PTR *PFN_vkSetBufferCollectionImageConstraintsFUCHSIA)(VkDevice device, VkBufferCollectionFUCHSIA collection, const VkImageConstraintsInfoFUCHSIA* pImageConstraintsInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkSetBufferCollectionBufferConstraintsFUCHSIA)(VkDevice device, VkBufferCollectionFUCHSIA collection, const VkBufferConstraintsInfoFUCHSIA* pBufferConstraintsInfo);\ntypedef void (VKAPI_PTR *PFN_vkDestroyBufferCollectionFUCHSIA)(VkDevice device, VkBufferCollectionFUCHSIA collection, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetBufferCollectionPropertiesFUCHSIA)(VkDevice device, VkBufferCollectionFUCHSIA collection, VkBufferCollectionPropertiesFUCHSIA* pProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferCollectionFUCHSIA(\n    VkDevice                                    device,\n    const VkBufferCollectionCreateInfoFUCHSIA*  pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkBufferCollectionFUCHSIA*                  pCollection);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkSetBufferCollectionImageConstraintsFUCHSIA(\n    VkDevice                                    device,\n    VkBufferCollectionFUCHSIA                   collection,\n    const VkImageConstraintsInfoFUCHSIA*        pImageConstraintsInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkSetBufferCollectionBufferConstraintsFUCHSIA(\n    VkDevice                                    device,\n    VkBufferCollectionFUCHSIA                   collection,\n    const VkBufferConstraintsInfoFUCHSIA*       pBufferConstraintsInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyBufferCollectionFUCHSIA(\n    VkDevice                                    device,\n    VkBufferCollectionFUCHSIA                   collection,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetBufferCollectionPropertiesFUCHSIA(\n    VkDevice                                    device,\n    VkBufferCollectionFUCHSIA                   collection,\n    VkBufferCollectionPropertiesFUCHSIA*        pProperties);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_funcs.hpp",
    "content": "// Copyright 2015-2025 The Khronos Group Inc.\n//\n// SPDX-License-Identifier: Apache-2.0 OR MIT\n//\n\n// This header is generated from the Khronos Vulkan XML API Registry.\n\n#ifndef VULKAN_FUNCS_HPP\n#define VULKAN_FUNCS_HPP\n\n// include-what-you-use: make sure, vulkan.hpp is used by code-completers\n// IWYU pragma: private; include \"vulkan.hpp\"\n\nnamespace VULKAN_HPP_NAMESPACE\n{\n\n  //===========================\n  //=== COMMAND Definitions ===\n  //===========================\n\n  //=== VK_VERSION_1_0 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result createInstance( const VULKAN_HPP_NAMESPACE::InstanceCreateInfo *  pCreateInfo,\n                                                                const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                VULKAN_HPP_NAMESPACE::Instance *                  pInstance,\n                                                                Dispatch const &                                  d ) VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateInstance( reinterpret_cast<const VkInstanceCreateInfo *>( pCreateInfo ),\n                                                    reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                    reinterpret_cast<VkInstance *>( pInstance ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::Instance>::type createInstance(\n    const VULKAN_HPP_NAMESPACE::InstanceCreateInfo & createInfo, Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator, Dispatch const & d )\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateInstance && \"Function <vkCreateInstance> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Instance instance;\n    VULKAN_HPP_NAMESPACE::Result   result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateInstance( reinterpret_cast<const VkInstanceCreateInfo *>( &createInfo ),\n                          reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                          reinterpret_cast<VkInstance *>( &instance ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::createInstance\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( instance ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::Instance, Dispatch>>::type createInstanceUnique(\n    const VULKAN_HPP_NAMESPACE::InstanceCreateInfo & createInfo, Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator, Dispatch const & d )\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateInstance && \"Function <vkCreateInstance> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Instance instance;\n    VULKAN_HPP_NAMESPACE::Result   result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateInstance( reinterpret_cast<const VkInstanceCreateInfo *>( &createInfo ),\n                          reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                          reinterpret_cast<VkInstance *>( &instance ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::createInstanceUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::Instance, Dispatch>( instance, detail::ObjectDestroy<detail::NoParent, Dispatch>( allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Instance::destroy( const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyInstance( static_cast<VkInstance>( m_instance ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Instance::destroy( Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyInstance && \"Function <vkDestroyInstance> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyInstance( m_instance,\n                         reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Instance::enumeratePhysicalDevices( uint32_t *                             pPhysicalDeviceCount,\n                                                                                    VULKAN_HPP_NAMESPACE::PhysicalDevice * pPhysicalDevices,\n                                                                                    Dispatch const &                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkEnumeratePhysicalDevices( static_cast<VkInstance>( m_instance ), pPhysicalDeviceCount, reinterpret_cast<VkPhysicalDevice *>( pPhysicalDevices ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename PhysicalDeviceAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename PhysicalDeviceAllocator::value_type, VULKAN_HPP_NAMESPACE::PhysicalDevice>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDevice, PhysicalDeviceAllocator>>::type\n                       Instance::enumeratePhysicalDevices( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkEnumeratePhysicalDevices && \"Function <vkEnumeratePhysicalDevices> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PhysicalDevice, PhysicalDeviceAllocator> physicalDevices;\n    uint32_t                                                                   physicalDeviceCount;\n    VULKAN_HPP_NAMESPACE::Result                                               result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkEnumeratePhysicalDevices( m_instance, &physicalDeviceCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && physicalDeviceCount )\n      {\n        physicalDevices.resize( physicalDeviceCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkEnumeratePhysicalDevices( m_instance, &physicalDeviceCount, reinterpret_cast<VkPhysicalDevice *>( physicalDevices.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::enumeratePhysicalDevices\" );\n    VULKAN_HPP_ASSERT( physicalDeviceCount <= physicalDevices.size() );\n    if ( physicalDeviceCount < physicalDevices.size() )\n    {\n      physicalDevices.resize( physicalDeviceCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( physicalDevices ) );\n  }\n\n  template <typename PhysicalDeviceAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename PhysicalDeviceAllocator::value_type, VULKAN_HPP_NAMESPACE::PhysicalDevice>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDevice, PhysicalDeviceAllocator>>::type\n                       Instance::enumeratePhysicalDevices( PhysicalDeviceAllocator & physicalDeviceAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkEnumeratePhysicalDevices && \"Function <vkEnumeratePhysicalDevices> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PhysicalDevice, PhysicalDeviceAllocator> physicalDevices( physicalDeviceAllocator );\n    uint32_t                                                                   physicalDeviceCount;\n    VULKAN_HPP_NAMESPACE::Result                                               result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkEnumeratePhysicalDevices( m_instance, &physicalDeviceCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && physicalDeviceCount )\n      {\n        physicalDevices.resize( physicalDeviceCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkEnumeratePhysicalDevices( m_instance, &physicalDeviceCount, reinterpret_cast<VkPhysicalDevice *>( physicalDevices.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::enumeratePhysicalDevices\" );\n    VULKAN_HPP_ASSERT( physicalDeviceCount <= physicalDevices.size() );\n    if ( physicalDeviceCount < physicalDevices.size() )\n    {\n      physicalDevices.resize( physicalDeviceCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( physicalDevices ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::getFeatures( VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures * pFeatures, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceFeatures( static_cast<VkPhysicalDevice>( m_physicalDevice ), reinterpret_cast<VkPhysicalDeviceFeatures *>( pFeatures ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures\n                                         PhysicalDevice::getFeatures( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceFeatures && \"Function <vkGetPhysicalDeviceFeatures> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures features;\n    d.vkGetPhysicalDeviceFeatures( m_physicalDevice, reinterpret_cast<VkPhysicalDeviceFeatures *>( &features ) );\n\n    return features;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::getFormatProperties( VULKAN_HPP_NAMESPACE::Format             format,\n                                                              VULKAN_HPP_NAMESPACE::FormatProperties * pFormatProperties,\n                                                              Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceFormatProperties(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ), static_cast<VkFormat>( format ), reinterpret_cast<VkFormatProperties *>( pFormatProperties ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::FormatProperties\n    PhysicalDevice::getFormatProperties( VULKAN_HPP_NAMESPACE::Format format, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceFormatProperties && \"Function <vkGetPhysicalDeviceFormatProperties> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::FormatProperties formatProperties;\n    d.vkGetPhysicalDeviceFormatProperties( m_physicalDevice, static_cast<VkFormat>( format ), reinterpret_cast<VkFormatProperties *>( &formatProperties ) );\n\n    return formatProperties;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getImageFormatProperties( VULKAN_HPP_NAMESPACE::Format                  format,\n                                                                                          VULKAN_HPP_NAMESPACE::ImageType               type,\n                                                                                          VULKAN_HPP_NAMESPACE::ImageTiling             tiling,\n                                                                                          VULKAN_HPP_NAMESPACE::ImageUsageFlags         usage,\n                                                                                          VULKAN_HPP_NAMESPACE::ImageCreateFlags        flags,\n                                                                                          VULKAN_HPP_NAMESPACE::ImageFormatProperties * pImageFormatProperties,\n                                                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceImageFormatProperties( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                            static_cast<VkFormat>( format ),\n                                                                            static_cast<VkImageType>( type ),\n                                                                            static_cast<VkImageTiling>( tiling ),\n                                                                            static_cast<VkImageUsageFlags>( usage ),\n                                                                            static_cast<VkImageCreateFlags>( flags ),\n                                                                            reinterpret_cast<VkImageFormatProperties *>( pImageFormatProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::ImageFormatProperties>::type\n                       PhysicalDevice::getImageFormatProperties( VULKAN_HPP_NAMESPACE::Format           format,\n                                              VULKAN_HPP_NAMESPACE::ImageType        type,\n                                              VULKAN_HPP_NAMESPACE::ImageTiling      tiling,\n                                              VULKAN_HPP_NAMESPACE::ImageUsageFlags  usage,\n                                              VULKAN_HPP_NAMESPACE::ImageCreateFlags flags,\n                                              Dispatch const &                       d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceImageFormatProperties && \"Function <vkGetPhysicalDeviceImageFormatProperties> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::ImageFormatProperties imageFormatProperties;\n    VULKAN_HPP_NAMESPACE::Result                result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetPhysicalDeviceImageFormatProperties( m_physicalDevice,\n                                                  static_cast<VkFormat>( format ),\n                                                  static_cast<VkImageType>( type ),\n                                                  static_cast<VkImageTiling>( tiling ),\n                                                  static_cast<VkImageUsageFlags>( usage ),\n                                                  static_cast<VkImageCreateFlags>( flags ),\n                                                  reinterpret_cast<VkImageFormatProperties *>( &imageFormatProperties ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getImageFormatProperties\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( imageFormatProperties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::getProperties( VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties * pProperties,\n                                                        Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceProperties( static_cast<VkPhysicalDevice>( m_physicalDevice ), reinterpret_cast<VkPhysicalDeviceProperties *>( pProperties ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties\n                                         PhysicalDevice::getProperties( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceProperties && \"Function <vkGetPhysicalDeviceProperties> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties properties;\n    d.vkGetPhysicalDeviceProperties( m_physicalDevice, reinterpret_cast<VkPhysicalDeviceProperties *>( &properties ) );\n\n    return properties;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::getQueueFamilyProperties( uint32_t *                                    pQueueFamilyPropertyCount,\n                                                                   VULKAN_HPP_NAMESPACE::QueueFamilyProperties * pQueueFamilyProperties,\n                                                                   Dispatch const &                              d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceQueueFamilyProperties(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ), pQueueFamilyPropertyCount, reinterpret_cast<VkQueueFamilyProperties *>( pQueueFamilyProperties ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <\n    typename QueueFamilyPropertiesAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename QueueFamilyPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::QueueFamilyProperties>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties, QueueFamilyPropertiesAllocator>\n                                         PhysicalDevice::getQueueFamilyProperties( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceQueueFamilyProperties && \"Function <vkGetPhysicalDeviceQueueFamilyProperties> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties, QueueFamilyPropertiesAllocator> queueFamilyProperties;\n    uint32_t                                                                                 queueFamilyPropertyCount;\n    d.vkGetPhysicalDeviceQueueFamilyProperties( m_physicalDevice, &queueFamilyPropertyCount, nullptr );\n    queueFamilyProperties.resize( queueFamilyPropertyCount );\n    d.vkGetPhysicalDeviceQueueFamilyProperties(\n      m_physicalDevice, &queueFamilyPropertyCount, reinterpret_cast<VkQueueFamilyProperties *>( queueFamilyProperties.data() ) );\n\n    VULKAN_HPP_ASSERT( queueFamilyPropertyCount <= queueFamilyProperties.size() );\n    if ( queueFamilyPropertyCount < queueFamilyProperties.size() )\n    {\n      queueFamilyProperties.resize( queueFamilyPropertyCount );\n    }\n    return queueFamilyProperties;\n  }\n\n  template <\n    typename QueueFamilyPropertiesAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename QueueFamilyPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::QueueFamilyProperties>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties, QueueFamilyPropertiesAllocator>\n    PhysicalDevice::getQueueFamilyProperties( QueueFamilyPropertiesAllocator & queueFamilyPropertiesAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceQueueFamilyProperties && \"Function <vkGetPhysicalDeviceQueueFamilyProperties> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties, QueueFamilyPropertiesAllocator> queueFamilyProperties( queueFamilyPropertiesAllocator );\n    uint32_t                                                                                 queueFamilyPropertyCount;\n    d.vkGetPhysicalDeviceQueueFamilyProperties( m_physicalDevice, &queueFamilyPropertyCount, nullptr );\n    queueFamilyProperties.resize( queueFamilyPropertyCount );\n    d.vkGetPhysicalDeviceQueueFamilyProperties(\n      m_physicalDevice, &queueFamilyPropertyCount, reinterpret_cast<VkQueueFamilyProperties *>( queueFamilyProperties.data() ) );\n\n    VULKAN_HPP_ASSERT( queueFamilyPropertyCount <= queueFamilyProperties.size() );\n    if ( queueFamilyPropertyCount < queueFamilyProperties.size() )\n    {\n      queueFamilyProperties.resize( queueFamilyPropertyCount );\n    }\n    return queueFamilyProperties;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::getMemoryProperties( VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties * pMemoryProperties,\n                                                              Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceMemoryProperties( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                           reinterpret_cast<VkPhysicalDeviceMemoryProperties *>( pMemoryProperties ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties\n                                         PhysicalDevice::getMemoryProperties( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceMemoryProperties && \"Function <vkGetPhysicalDeviceMemoryProperties> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties memoryProperties;\n    d.vkGetPhysicalDeviceMemoryProperties( m_physicalDevice, reinterpret_cast<VkPhysicalDeviceMemoryProperties *>( &memoryProperties ) );\n\n    return memoryProperties;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE PFN_vkVoidFunction Instance::getProcAddr( const char * pName, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return d.vkGetInstanceProcAddr( static_cast<VkInstance>( m_instance ), pName );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PFN_VoidFunction Instance::getProcAddr( const std::string & name, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetInstanceProcAddr && \"Function <vkGetInstanceProcAddr> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    PFN_vkVoidFunction result = d.vkGetInstanceProcAddr( m_instance, name.c_str() );\n\n    return result;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE PFN_vkVoidFunction Device::getProcAddr( const char * pName, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return d.vkGetDeviceProcAddr( static_cast<VkDevice>( m_device ), pName );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PFN_VoidFunction Device::getProcAddr( const std::string & name, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceProcAddr && \"Function <vkGetDeviceProcAddr> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    PFN_vkVoidFunction result = d.vkGetDeviceProcAddr( m_device, name.c_str() );\n\n    return result;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::createDevice( const VULKAN_HPP_NAMESPACE::DeviceCreateInfo *    pCreateInfo,\n                                                                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                              VULKAN_HPP_NAMESPACE::Device *                    pDevice,\n                                                                              Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateDevice( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                  reinterpret_cast<const VkDeviceCreateInfo *>( pCreateInfo ),\n                                                  reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                  reinterpret_cast<VkDevice *>( pDevice ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::Device>::type PhysicalDevice::createDevice(\n    const VULKAN_HPP_NAMESPACE::DeviceCreateInfo & createInfo, Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateDevice && \"Function <vkCreateDevice> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Device device;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateDevice( m_physicalDevice,\n                        reinterpret_cast<const VkDeviceCreateInfo *>( &createInfo ),\n                        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                        reinterpret_cast<VkDevice *>( &device ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::createDevice\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( device ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::Device, Dispatch>>::type\n                       PhysicalDevice::createDeviceUnique( const VULKAN_HPP_NAMESPACE::DeviceCreateInfo &            createInfo,\n                                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                        Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateDevice && \"Function <vkCreateDevice> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Device device;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateDevice( m_physicalDevice,\n                        reinterpret_cast<const VkDeviceCreateInfo *>( &createInfo ),\n                        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                        reinterpret_cast<VkDevice *>( &device ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::createDeviceUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::Device, Dispatch>( device, detail::ObjectDestroy<detail::NoParent, Dispatch>( allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyDevice( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyDevice && \"Function <vkDestroyDevice> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyDevice( m_device,\n                       reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result enumerateInstanceExtensionProperties( const char *                                pLayerName,\n                                                                                      uint32_t *                                  pPropertyCount,\n                                                                                      VULKAN_HPP_NAMESPACE::ExtensionProperties * pProperties,\n                                                                                      Dispatch const &                            d ) VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkEnumerateInstanceExtensionProperties( pLayerName, pPropertyCount, reinterpret_cast<VkExtensionProperties *>( pProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <\n    typename ExtensionPropertiesAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename ExtensionPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::ExtensionProperties>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties, ExtensionPropertiesAllocator>>::type\n                       enumerateInstanceExtensionProperties( Optional<const std::string> layerName, Dispatch const & d )\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkEnumerateInstanceExtensionProperties && \"Function <vkEnumerateInstanceExtensionProperties> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties, ExtensionPropertiesAllocator> properties;\n    uint32_t                                                                             propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                         result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkEnumerateInstanceExtensionProperties( layerName ? layerName->c_str() : nullptr, &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkEnumerateInstanceExtensionProperties(\n          layerName ? layerName->c_str() : nullptr, &propertyCount, reinterpret_cast<VkExtensionProperties *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::enumerateInstanceExtensionProperties\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n\n  template <\n    typename ExtensionPropertiesAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename ExtensionPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::ExtensionProperties>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties, ExtensionPropertiesAllocator>>::type\n                       enumerateInstanceExtensionProperties( Optional<const std::string>    layerName,\n                                                             ExtensionPropertiesAllocator & extensionPropertiesAllocator,\n                                                             Dispatch const &               d )\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkEnumerateInstanceExtensionProperties && \"Function <vkEnumerateInstanceExtensionProperties> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties, ExtensionPropertiesAllocator> properties( extensionPropertiesAllocator );\n    uint32_t                                                                             propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                         result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkEnumerateInstanceExtensionProperties( layerName ? layerName->c_str() : nullptr, &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkEnumerateInstanceExtensionProperties(\n          layerName ? layerName->c_str() : nullptr, &propertyCount, reinterpret_cast<VkExtensionProperties *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::enumerateInstanceExtensionProperties\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::enumerateDeviceExtensionProperties( const char *                                pLayerName,\n                                                                                                    uint32_t *                                  pPropertyCount,\n                                                                                                    VULKAN_HPP_NAMESPACE::ExtensionProperties * pProperties,\n                                                                                                    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkEnumerateDeviceExtensionProperties(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ), pLayerName, pPropertyCount, reinterpret_cast<VkExtensionProperties *>( pProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <\n    typename ExtensionPropertiesAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename ExtensionPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::ExtensionProperties>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties, ExtensionPropertiesAllocator>>::type\n                       PhysicalDevice::enumerateDeviceExtensionProperties( Optional<const std::string> layerName, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkEnumerateDeviceExtensionProperties && \"Function <vkEnumerateDeviceExtensionProperties> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties, ExtensionPropertiesAllocator> properties;\n    uint32_t                                                                             propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                         result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkEnumerateDeviceExtensionProperties( m_physicalDevice, layerName ? layerName->c_str() : nullptr, &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkEnumerateDeviceExtensionProperties(\n          m_physicalDevice, layerName ? layerName->c_str() : nullptr, &propertyCount, reinterpret_cast<VkExtensionProperties *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::enumerateDeviceExtensionProperties\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n\n  template <\n    typename ExtensionPropertiesAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename ExtensionPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::ExtensionProperties>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties, ExtensionPropertiesAllocator>>::type\n                       PhysicalDevice::enumerateDeviceExtensionProperties( Optional<const std::string>    layerName,\n                                                        ExtensionPropertiesAllocator & extensionPropertiesAllocator,\n                                                        Dispatch const &               d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkEnumerateDeviceExtensionProperties && \"Function <vkEnumerateDeviceExtensionProperties> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties, ExtensionPropertiesAllocator> properties( extensionPropertiesAllocator );\n    uint32_t                                                                             propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                         result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkEnumerateDeviceExtensionProperties( m_physicalDevice, layerName ? layerName->c_str() : nullptr, &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkEnumerateDeviceExtensionProperties(\n          m_physicalDevice, layerName ? layerName->c_str() : nullptr, &propertyCount, reinterpret_cast<VkExtensionProperties *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::enumerateDeviceExtensionProperties\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result enumerateInstanceLayerProperties( uint32_t *                              pPropertyCount,\n                                                                                  VULKAN_HPP_NAMESPACE::LayerProperties * pProperties,\n                                                                                  Dispatch const &                        d ) VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkEnumerateInstanceLayerProperties( pPropertyCount, reinterpret_cast<VkLayerProperties *>( pProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename LayerPropertiesAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename LayerPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::LayerProperties>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::LayerProperties, LayerPropertiesAllocator>>::type\n                       enumerateInstanceLayerProperties( Dispatch const & d )\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkEnumerateInstanceLayerProperties && \"Function <vkEnumerateInstanceLayerProperties> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::LayerProperties, LayerPropertiesAllocator> properties;\n    uint32_t                                                                     propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                 result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkEnumerateInstanceLayerProperties( &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkEnumerateInstanceLayerProperties( &propertyCount, reinterpret_cast<VkLayerProperties *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::enumerateInstanceLayerProperties\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n\n  template <typename LayerPropertiesAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename LayerPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::LayerProperties>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::LayerProperties, LayerPropertiesAllocator>>::type\n                       enumerateInstanceLayerProperties( LayerPropertiesAllocator & layerPropertiesAllocator, Dispatch const & d )\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkEnumerateInstanceLayerProperties && \"Function <vkEnumerateInstanceLayerProperties> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::LayerProperties, LayerPropertiesAllocator> properties( layerPropertiesAllocator );\n    uint32_t                                                                     propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                 result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkEnumerateInstanceLayerProperties( &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkEnumerateInstanceLayerProperties( &propertyCount, reinterpret_cast<VkLayerProperties *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::enumerateInstanceLayerProperties\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::enumerateDeviceLayerProperties( uint32_t *                              pPropertyCount,\n                                                                                                VULKAN_HPP_NAMESPACE::LayerProperties * pProperties,\n                                                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkEnumerateDeviceLayerProperties(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ), pPropertyCount, reinterpret_cast<VkLayerProperties *>( pProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename LayerPropertiesAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename LayerPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::LayerProperties>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::LayerProperties, LayerPropertiesAllocator>>::type\n                       PhysicalDevice::enumerateDeviceLayerProperties( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkEnumerateDeviceLayerProperties && \"Function <vkEnumerateDeviceLayerProperties> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::LayerProperties, LayerPropertiesAllocator> properties;\n    uint32_t                                                                     propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                 result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkEnumerateDeviceLayerProperties( m_physicalDevice, &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkEnumerateDeviceLayerProperties( m_physicalDevice, &propertyCount, reinterpret_cast<VkLayerProperties *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::enumerateDeviceLayerProperties\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n\n  template <typename LayerPropertiesAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename LayerPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::LayerProperties>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::LayerProperties, LayerPropertiesAllocator>>::type\n                       PhysicalDevice::enumerateDeviceLayerProperties( LayerPropertiesAllocator & layerPropertiesAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkEnumerateDeviceLayerProperties && \"Function <vkEnumerateDeviceLayerProperties> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::LayerProperties, LayerPropertiesAllocator> properties( layerPropertiesAllocator );\n    uint32_t                                                                     propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                 result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkEnumerateDeviceLayerProperties( m_physicalDevice, &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkEnumerateDeviceLayerProperties( m_physicalDevice, &propertyCount, reinterpret_cast<VkLayerProperties *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::enumerateDeviceLayerProperties\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    Device::getQueue( uint32_t queueFamilyIndex, uint32_t queueIndex, VULKAN_HPP_NAMESPACE::Queue * pQueue, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetDeviceQueue( static_cast<VkDevice>( m_device ), queueFamilyIndex, queueIndex, reinterpret_cast<VkQueue *>( pQueue ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Queue\n                                         Device::getQueue( uint32_t queueFamilyIndex, uint32_t queueIndex, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceQueue && \"Function <vkGetDeviceQueue> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Queue queue;\n    d.vkGetDeviceQueue( m_device, queueFamilyIndex, queueIndex, reinterpret_cast<VkQueue *>( &queue ) );\n\n    return queue;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Queue::submit( uint32_t                                 submitCount,\n                                                               const VULKAN_HPP_NAMESPACE::SubmitInfo * pSubmits,\n                                                               VULKAN_HPP_NAMESPACE::Fence              fence,\n                                                               Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkQueueSubmit( static_cast<VkQueue>( m_queue ), submitCount, reinterpret_cast<const VkSubmitInfo *>( pSubmits ), static_cast<VkFence>( fence ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type Queue::submit(\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SubmitInfo> const & submits, VULKAN_HPP_NAMESPACE::Fence fence, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkQueueSubmit && \"Function <vkQueueSubmit> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkQueueSubmit( m_queue, submits.size(), reinterpret_cast<const VkSubmitInfo *>( submits.data() ), static_cast<VkFence>( fence ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Queue::submit\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Queue::waitIdle( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkQueueWaitIdle( static_cast<VkQueue>( m_queue ) ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type Queue::waitIdle( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkQueueWaitIdle && \"Function <vkQueueWaitIdle> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkQueueWaitIdle( m_queue ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Queue::waitIdle\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::waitIdle( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkDeviceWaitIdle( static_cast<VkDevice>( m_device ) ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type Device::waitIdle( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDeviceWaitIdle && \"Function <vkDeviceWaitIdle> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkDeviceWaitIdle( m_device ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::waitIdle\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::allocateMemory( const VULKAN_HPP_NAMESPACE::MemoryAllocateInfo *  pAllocateInfo,\n                                                                        const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                        VULKAN_HPP_NAMESPACE::DeviceMemory *              pMemory,\n                                                                        Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkAllocateMemory( static_cast<VkDevice>( m_device ),\n                                                    reinterpret_cast<const VkMemoryAllocateInfo *>( pAllocateInfo ),\n                                                    reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                    reinterpret_cast<VkDeviceMemory *>( pMemory ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::DeviceMemory>::type\n                       Device::allocateMemory( const VULKAN_HPP_NAMESPACE::MemoryAllocateInfo &          allocateInfo,\n                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                            Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkAllocateMemory && \"Function <vkAllocateMemory> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::DeviceMemory memory;\n    VULKAN_HPP_NAMESPACE::Result       result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkAllocateMemory( m_device,\n                          reinterpret_cast<const VkMemoryAllocateInfo *>( &allocateInfo ),\n                          reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                          reinterpret_cast<VkDeviceMemory *>( &memory ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::allocateMemory\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( memory ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DeviceMemory, Dispatch>>::type\n                       Device::allocateMemoryUnique( const VULKAN_HPP_NAMESPACE::MemoryAllocateInfo &          allocateInfo,\n                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                  Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkAllocateMemory && \"Function <vkAllocateMemory> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::DeviceMemory memory;\n    VULKAN_HPP_NAMESPACE::Result       result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkAllocateMemory( m_device,\n                          reinterpret_cast<const VkMemoryAllocateInfo *>( &allocateInfo ),\n                          reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                          reinterpret_cast<VkDeviceMemory *>( &memory ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::allocateMemoryUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::DeviceMemory, Dispatch>( memory, detail::ObjectFree<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::freeMemory( VULKAN_HPP_NAMESPACE::DeviceMemory                memory,\n                                             const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                             Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkFreeMemory( static_cast<VkDevice>( m_device ), static_cast<VkDeviceMemory>( memory ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::freeMemory( VULKAN_HPP_NAMESPACE::DeviceMemory                        memory,\n                                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                             Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkFreeMemory && \"Function <vkFreeMemory> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkFreeMemory( m_device,\n                    static_cast<VkDeviceMemory>( memory ),\n                    reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void( Device::free )( VULKAN_HPP_NAMESPACE::DeviceMemory                memory,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkFreeMemory( static_cast<VkDevice>( m_device ), static_cast<VkDeviceMemory>( memory ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void( Device::free )( VULKAN_HPP_NAMESPACE::DeviceMemory                        memory,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkFreeMemory && \"Function <vkFreeMemory> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkFreeMemory( m_device,\n                    static_cast<VkDeviceMemory>( memory ),\n                    reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::mapMemory( VULKAN_HPP_NAMESPACE::DeviceMemory   memory,\n                                                                   VULKAN_HPP_NAMESPACE::DeviceSize     offset,\n                                                                   VULKAN_HPP_NAMESPACE::DeviceSize     size,\n                                                                   VULKAN_HPP_NAMESPACE::MemoryMapFlags flags,\n                                                                   void **                              ppData,\n                                                                   Dispatch const &                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkMapMemory( static_cast<VkDevice>( m_device ),\n                                               static_cast<VkDeviceMemory>( memory ),\n                                               static_cast<VkDeviceSize>( offset ),\n                                               static_cast<VkDeviceSize>( size ),\n                                               static_cast<VkMemoryMapFlags>( flags ),\n                                               ppData ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<void *>::type Device::mapMemory( VULKAN_HPP_NAMESPACE::DeviceMemory   memory,\n                                                                                                   VULKAN_HPP_NAMESPACE::DeviceSize     offset,\n                                                                                                   VULKAN_HPP_NAMESPACE::DeviceSize     size,\n                                                                                                   VULKAN_HPP_NAMESPACE::MemoryMapFlags flags,\n                                                                                                   Dispatch const &                     d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkMapMemory && \"Function <vkMapMemory> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    void *                       pData;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkMapMemory( m_device,\n                                                                                                    static_cast<VkDeviceMemory>( memory ),\n                                                                                                    static_cast<VkDeviceSize>( offset ),\n                                                                                                    static_cast<VkDeviceSize>( size ),\n                                                                                                    static_cast<VkMemoryMapFlags>( flags ),\n                                                                                                    &pData ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::mapMemory\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( pData ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::unmapMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkUnmapMemory( static_cast<VkDevice>( m_device ), static_cast<VkDeviceMemory>( memory ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::flushMappedMemoryRanges( uint32_t                                        memoryRangeCount,\n                                                                                 const VULKAN_HPP_NAMESPACE::MappedMemoryRange * pMemoryRanges,\n                                                                                 Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkFlushMappedMemoryRanges( static_cast<VkDevice>( m_device ), memoryRangeCount, reinterpret_cast<const VkMappedMemoryRange *>( pMemoryRanges ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::flushMappedMemoryRanges( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MappedMemoryRange> const & memoryRanges,\n                                     Dispatch const &                                                                        d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkFlushMappedMemoryRanges && \"Function <vkFlushMappedMemoryRanges> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkFlushMappedMemoryRanges( m_device, memoryRanges.size(), reinterpret_cast<const VkMappedMemoryRange *>( memoryRanges.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::flushMappedMemoryRanges\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::invalidateMappedMemoryRanges( uint32_t                                        memoryRangeCount,\n                                                                                      const VULKAN_HPP_NAMESPACE::MappedMemoryRange * pMemoryRanges,\n                                                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkInvalidateMappedMemoryRanges( static_cast<VkDevice>( m_device ), memoryRangeCount, reinterpret_cast<const VkMappedMemoryRange *>( pMemoryRanges ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::invalidateMappedMemoryRanges( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MappedMemoryRange> const & memoryRanges,\n                                          Dispatch const &                                                                        d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkInvalidateMappedMemoryRanges && \"Function <vkInvalidateMappedMemoryRanges> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkInvalidateMappedMemoryRanges( m_device, memoryRanges.size(), reinterpret_cast<const VkMappedMemoryRange *>( memoryRanges.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::invalidateMappedMemoryRanges\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getMemoryCommitment( VULKAN_HPP_NAMESPACE::DeviceMemory memory,\n                                                      VULKAN_HPP_NAMESPACE::DeviceSize * pCommittedMemoryInBytes,\n                                                      Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetDeviceMemoryCommitment(\n      static_cast<VkDevice>( m_device ), static_cast<VkDeviceMemory>( memory ), reinterpret_cast<VkDeviceSize *>( pCommittedMemoryInBytes ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceSize Device::getMemoryCommitment( VULKAN_HPP_NAMESPACE::DeviceMemory memory,\n                                                                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceMemoryCommitment && \"Function <vkGetDeviceMemoryCommitment> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::DeviceSize committedMemoryInBytes;\n    d.vkGetDeviceMemoryCommitment( m_device, static_cast<VkDeviceMemory>( memory ), reinterpret_cast<VkDeviceSize *>( &committedMemoryInBytes ) );\n\n    return committedMemoryInBytes;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::bindBufferMemory( VULKAN_HPP_NAMESPACE::Buffer       buffer,\n                                                                          VULKAN_HPP_NAMESPACE::DeviceMemory memory,\n                                                                          VULKAN_HPP_NAMESPACE::DeviceSize   memoryOffset,\n                                                                          Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkBindBufferMemory(\n      static_cast<VkDevice>( m_device ), static_cast<VkBuffer>( buffer ), static_cast<VkDeviceMemory>( memory ), static_cast<VkDeviceSize>( memoryOffset ) ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type Device::bindBufferMemory(\n    VULKAN_HPP_NAMESPACE::Buffer buffer, VULKAN_HPP_NAMESPACE::DeviceMemory memory, VULKAN_HPP_NAMESPACE::DeviceSize memoryOffset, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkBindBufferMemory && \"Function <vkBindBufferMemory> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkBindBufferMemory( m_device, static_cast<VkBuffer>( buffer ), static_cast<VkDeviceMemory>( memory ), static_cast<VkDeviceSize>( memoryOffset ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::bindBufferMemory\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::bindImageMemory( VULKAN_HPP_NAMESPACE::Image        image,\n                                                                         VULKAN_HPP_NAMESPACE::DeviceMemory memory,\n                                                                         VULKAN_HPP_NAMESPACE::DeviceSize   memoryOffset,\n                                                                         Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkBindImageMemory(\n      static_cast<VkDevice>( m_device ), static_cast<VkImage>( image ), static_cast<VkDeviceMemory>( memory ), static_cast<VkDeviceSize>( memoryOffset ) ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type Device::bindImageMemory(\n    VULKAN_HPP_NAMESPACE::Image image, VULKAN_HPP_NAMESPACE::DeviceMemory memory, VULKAN_HPP_NAMESPACE::DeviceSize memoryOffset, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkBindImageMemory && \"Function <vkBindImageMemory> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkBindImageMemory( m_device, static_cast<VkImage>( image ), static_cast<VkDeviceMemory>( memory ), static_cast<VkDeviceSize>( memoryOffset ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::bindImageMemory\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getBufferMemoryRequirements( VULKAN_HPP_NAMESPACE::Buffer               buffer,\n                                                              VULKAN_HPP_NAMESPACE::MemoryRequirements * pMemoryRequirements,\n                                                              Dispatch const &                           d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetBufferMemoryRequirements(\n      static_cast<VkDevice>( m_device ), static_cast<VkBuffer>( buffer ), reinterpret_cast<VkMemoryRequirements *>( pMemoryRequirements ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements\n    Device::getBufferMemoryRequirements( VULKAN_HPP_NAMESPACE::Buffer buffer, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetBufferMemoryRequirements && \"Function <vkGetBufferMemoryRequirements> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::MemoryRequirements memoryRequirements;\n    d.vkGetBufferMemoryRequirements( m_device, static_cast<VkBuffer>( buffer ), reinterpret_cast<VkMemoryRequirements *>( &memoryRequirements ) );\n\n    return memoryRequirements;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getImageMemoryRequirements( VULKAN_HPP_NAMESPACE::Image                image,\n                                                             VULKAN_HPP_NAMESPACE::MemoryRequirements * pMemoryRequirements,\n                                                             Dispatch const &                           d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetImageMemoryRequirements(\n      static_cast<VkDevice>( m_device ), static_cast<VkImage>( image ), reinterpret_cast<VkMemoryRequirements *>( pMemoryRequirements ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements\n                                         Device::getImageMemoryRequirements( VULKAN_HPP_NAMESPACE::Image image, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetImageMemoryRequirements && \"Function <vkGetImageMemoryRequirements> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::MemoryRequirements memoryRequirements;\n    d.vkGetImageMemoryRequirements( m_device, static_cast<VkImage>( image ), reinterpret_cast<VkMemoryRequirements *>( &memoryRequirements ) );\n\n    return memoryRequirements;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getImageSparseMemoryRequirements( VULKAN_HPP_NAMESPACE::Image                           image,\n                                                                   uint32_t *                                            pSparseMemoryRequirementCount,\n                                                                   VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements * pSparseMemoryRequirements,\n                                                                   Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetImageSparseMemoryRequirements( static_cast<VkDevice>( m_device ),\n                                          static_cast<VkImage>( image ),\n                                          pSparseMemoryRequirementCount,\n                                          reinterpret_cast<VkSparseImageMemoryRequirements *>( pSparseMemoryRequirements ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename SparseImageMemoryRequirementsAllocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename SparseImageMemoryRequirementsAllocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements, SparseImageMemoryRequirementsAllocator>\n                                         Device::getImageSparseMemoryRequirements( VULKAN_HPP_NAMESPACE::Image image, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetImageSparseMemoryRequirements && \"Function <vkGetImageSparseMemoryRequirements> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements, SparseImageMemoryRequirementsAllocator> sparseMemoryRequirements;\n    uint32_t                                                                                                 sparseMemoryRequirementCount;\n    d.vkGetImageSparseMemoryRequirements( m_device, static_cast<VkImage>( image ), &sparseMemoryRequirementCount, nullptr );\n    sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n    d.vkGetImageSparseMemoryRequirements( m_device,\n                                          static_cast<VkImage>( image ),\n                                          &sparseMemoryRequirementCount,\n                                          reinterpret_cast<VkSparseImageMemoryRequirements *>( sparseMemoryRequirements.data() ) );\n\n    VULKAN_HPP_ASSERT( sparseMemoryRequirementCount <= sparseMemoryRequirements.size() );\n    if ( sparseMemoryRequirementCount < sparseMemoryRequirements.size() )\n    {\n      sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n    }\n    return sparseMemoryRequirements;\n  }\n\n  template <typename SparseImageMemoryRequirementsAllocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename SparseImageMemoryRequirementsAllocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements, SparseImageMemoryRequirementsAllocator>\n                                         Device::getImageSparseMemoryRequirements( VULKAN_HPP_NAMESPACE::Image              image,\n                                              SparseImageMemoryRequirementsAllocator & sparseImageMemoryRequirementsAllocator,\n                                              Dispatch const &                         d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetImageSparseMemoryRequirements && \"Function <vkGetImageSparseMemoryRequirements> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements, SparseImageMemoryRequirementsAllocator> sparseMemoryRequirements(\n      sparseImageMemoryRequirementsAllocator );\n    uint32_t sparseMemoryRequirementCount;\n    d.vkGetImageSparseMemoryRequirements( m_device, static_cast<VkImage>( image ), &sparseMemoryRequirementCount, nullptr );\n    sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n    d.vkGetImageSparseMemoryRequirements( m_device,\n                                          static_cast<VkImage>( image ),\n                                          &sparseMemoryRequirementCount,\n                                          reinterpret_cast<VkSparseImageMemoryRequirements *>( sparseMemoryRequirements.data() ) );\n\n    VULKAN_HPP_ASSERT( sparseMemoryRequirementCount <= sparseMemoryRequirements.size() );\n    if ( sparseMemoryRequirementCount < sparseMemoryRequirements.size() )\n    {\n      sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n    }\n    return sparseMemoryRequirements;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::getSparseImageFormatProperties( VULKAN_HPP_NAMESPACE::Format                        format,\n                                                                         VULKAN_HPP_NAMESPACE::ImageType                     type,\n                                                                         VULKAN_HPP_NAMESPACE::SampleCountFlagBits           samples,\n                                                                         VULKAN_HPP_NAMESPACE::ImageUsageFlags               usage,\n                                                                         VULKAN_HPP_NAMESPACE::ImageTiling                   tiling,\n                                                                         uint32_t *                                          pPropertyCount,\n                                                                         VULKAN_HPP_NAMESPACE::SparseImageFormatProperties * pProperties,\n                                                                         Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceSparseImageFormatProperties( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                      static_cast<VkFormat>( format ),\n                                                      static_cast<VkImageType>( type ),\n                                                      static_cast<VkSampleCountFlagBits>( samples ),\n                                                      static_cast<VkImageUsageFlags>( usage ),\n                                                      static_cast<VkImageTiling>( tiling ),\n                                                      pPropertyCount,\n                                                      reinterpret_cast<VkSparseImageFormatProperties *>( pProperties ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <\n    typename SparseImageFormatPropertiesAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename SparseImageFormatPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageFormatProperties>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties, SparseImageFormatPropertiesAllocator>\n                                         PhysicalDevice::getSparseImageFormatProperties( VULKAN_HPP_NAMESPACE::Format              format,\n                                                    VULKAN_HPP_NAMESPACE::ImageType           type,\n                                                    VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples,\n                                                    VULKAN_HPP_NAMESPACE::ImageUsageFlags     usage,\n                                                    VULKAN_HPP_NAMESPACE::ImageTiling         tiling,\n                                                    Dispatch const &                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceSparseImageFormatProperties &&\n                       \"Function <vkGetPhysicalDeviceSparseImageFormatProperties> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties, SparseImageFormatPropertiesAllocator> properties;\n    uint32_t                                                                                             propertyCount;\n    d.vkGetPhysicalDeviceSparseImageFormatProperties( m_physicalDevice,\n                                                      static_cast<VkFormat>( format ),\n                                                      static_cast<VkImageType>( type ),\n                                                      static_cast<VkSampleCountFlagBits>( samples ),\n                                                      static_cast<VkImageUsageFlags>( usage ),\n                                                      static_cast<VkImageTiling>( tiling ),\n                                                      &propertyCount,\n                                                      nullptr );\n    properties.resize( propertyCount );\n    d.vkGetPhysicalDeviceSparseImageFormatProperties( m_physicalDevice,\n                                                      static_cast<VkFormat>( format ),\n                                                      static_cast<VkImageType>( type ),\n                                                      static_cast<VkSampleCountFlagBits>( samples ),\n                                                      static_cast<VkImageUsageFlags>( usage ),\n                                                      static_cast<VkImageTiling>( tiling ),\n                                                      &propertyCount,\n                                                      reinterpret_cast<VkSparseImageFormatProperties *>( properties.data() ) );\n\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return properties;\n  }\n\n  template <\n    typename SparseImageFormatPropertiesAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename SparseImageFormatPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageFormatProperties>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties, SparseImageFormatPropertiesAllocator>\n                                         PhysicalDevice::getSparseImageFormatProperties( VULKAN_HPP_NAMESPACE::Format              format,\n                                                    VULKAN_HPP_NAMESPACE::ImageType           type,\n                                                    VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples,\n                                                    VULKAN_HPP_NAMESPACE::ImageUsageFlags     usage,\n                                                    VULKAN_HPP_NAMESPACE::ImageTiling         tiling,\n                                                    SparseImageFormatPropertiesAllocator &    sparseImageFormatPropertiesAllocator,\n                                                    Dispatch const &                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceSparseImageFormatProperties &&\n                       \"Function <vkGetPhysicalDeviceSparseImageFormatProperties> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties, SparseImageFormatPropertiesAllocator> properties( sparseImageFormatPropertiesAllocator );\n    uint32_t                                                                                             propertyCount;\n    d.vkGetPhysicalDeviceSparseImageFormatProperties( m_physicalDevice,\n                                                      static_cast<VkFormat>( format ),\n                                                      static_cast<VkImageType>( type ),\n                                                      static_cast<VkSampleCountFlagBits>( samples ),\n                                                      static_cast<VkImageUsageFlags>( usage ),\n                                                      static_cast<VkImageTiling>( tiling ),\n                                                      &propertyCount,\n                                                      nullptr );\n    properties.resize( propertyCount );\n    d.vkGetPhysicalDeviceSparseImageFormatProperties( m_physicalDevice,\n                                                      static_cast<VkFormat>( format ),\n                                                      static_cast<VkImageType>( type ),\n                                                      static_cast<VkSampleCountFlagBits>( samples ),\n                                                      static_cast<VkImageUsageFlags>( usage ),\n                                                      static_cast<VkImageTiling>( tiling ),\n                                                      &propertyCount,\n                                                      reinterpret_cast<VkSparseImageFormatProperties *>( properties.data() ) );\n\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return properties;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Queue::bindSparse( uint32_t                                     bindInfoCount,\n                                                                   const VULKAN_HPP_NAMESPACE::BindSparseInfo * pBindInfo,\n                                                                   VULKAN_HPP_NAMESPACE::Fence                  fence,\n                                                                   Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkQueueBindSparse(\n      static_cast<VkQueue>( m_queue ), bindInfoCount, reinterpret_cast<const VkBindSparseInfo *>( pBindInfo ), static_cast<VkFence>( fence ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type Queue::bindSparse(\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindSparseInfo> const & bindInfo, VULKAN_HPP_NAMESPACE::Fence fence, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkQueueBindSparse && \"Function <vkQueueBindSparse> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkQueueBindSparse( m_queue, bindInfo.size(), reinterpret_cast<const VkBindSparseInfo *>( bindInfo.data() ), static_cast<VkFence>( fence ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Queue::bindSparse\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createFence( const VULKAN_HPP_NAMESPACE::FenceCreateInfo *     pCreateInfo,\n                                                                     const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                     VULKAN_HPP_NAMESPACE::Fence *                     pFence,\n                                                                     Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateFence( static_cast<VkDevice>( m_device ),\n                                                 reinterpret_cast<const VkFenceCreateInfo *>( pCreateInfo ),\n                                                 reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                 reinterpret_cast<VkFence *>( pFence ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::Fence>::type Device::createFence(\n    const VULKAN_HPP_NAMESPACE::FenceCreateInfo & createInfo, Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateFence && \"Function <vkCreateFence> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Fence  fence;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateFence( m_device,\n                       reinterpret_cast<const VkFenceCreateInfo *>( &createInfo ),\n                       reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                       reinterpret_cast<VkFence *>( &fence ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createFence\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( fence ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::Fence, Dispatch>>::type Device::createFenceUnique(\n    const VULKAN_HPP_NAMESPACE::FenceCreateInfo & createInfo, Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateFence && \"Function <vkCreateFence> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Fence  fence;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateFence( m_device,\n                       reinterpret_cast<const VkFenceCreateInfo *>( &createInfo ),\n                       reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                       reinterpret_cast<VkFence *>( &fence ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createFenceUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::Fence, Dispatch>( fence, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyFence( VULKAN_HPP_NAMESPACE::Fence                       fence,\n                                               const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                               Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyFence( static_cast<VkDevice>( m_device ), static_cast<VkFence>( fence ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyFence( VULKAN_HPP_NAMESPACE::Fence                               fence,\n                                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                               Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyFence && \"Function <vkDestroyFence> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyFence( m_device,\n                      static_cast<VkFence>( fence ),\n                      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::Fence                       fence,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyFence( static_cast<VkDevice>( m_device ), static_cast<VkFence>( fence ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::Fence                               fence,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyFence && \"Function <vkDestroyFence> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyFence( m_device,\n                      static_cast<VkFence>( fence ),\n                      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::resetFences( uint32_t                            fenceCount,\n                                                                     const VULKAN_HPP_NAMESPACE::Fence * pFences,\n                                                                     Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkResetFences( static_cast<VkDevice>( m_device ), fenceCount, reinterpret_cast<const VkFence *>( pFences ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::resetFences( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Fence> const & fences, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkResetFences && \"Function <vkResetFences> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkResetFences( m_device, fences.size(), reinterpret_cast<const VkFence *>( fences.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::resetFences\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getFenceStatus( VULKAN_HPP_NAMESPACE::Fence fence, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetFenceStatus( static_cast<VkDevice>( m_device ), static_cast<VkFence>( fence ) ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result Device::getFenceStatus( VULKAN_HPP_NAMESPACE::Fence fence, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetFenceStatus && \"Function <vkGetFenceStatus> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetFenceStatus( m_device, static_cast<VkFence>( fence ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck(\n      result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getFenceStatus\", { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eNotReady } );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::waitForFences( uint32_t                            fenceCount,\n                                                                       const VULKAN_HPP_NAMESPACE::Fence * pFences,\n                                                                       VULKAN_HPP_NAMESPACE::Bool32        waitAll,\n                                                                       uint64_t                            timeout,\n                                                                       Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkWaitForFences(\n      static_cast<VkDevice>( m_device ), fenceCount, reinterpret_cast<const VkFence *>( pFences ), static_cast<VkBool32>( waitAll ), timeout ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result\n                                         Device::waitForFences( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Fence> const & fences,\n                           VULKAN_HPP_NAMESPACE::Bool32                                                waitAll,\n                           uint64_t                                                                    timeout,\n                           Dispatch const &                                                            d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkWaitForFences && \"Function <vkWaitForFences> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkWaitForFences( m_device, fences.size(), reinterpret_cast<const VkFence *>( fences.data() ), static_cast<VkBool32>( waitAll ), timeout ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck(\n      result, VULKAN_HPP_NAMESPACE_STRING \"::Device::waitForFences\", { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eTimeout } );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createSemaphore( const VULKAN_HPP_NAMESPACE::SemaphoreCreateInfo * pCreateInfo,\n                                                                         const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                         VULKAN_HPP_NAMESPACE::Semaphore *                 pSemaphore,\n                                                                         Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateSemaphore( static_cast<VkDevice>( m_device ),\n                                                     reinterpret_cast<const VkSemaphoreCreateInfo *>( pCreateInfo ),\n                                                     reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                     reinterpret_cast<VkSemaphore *>( pSemaphore ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::Semaphore>::type\n                       Device::createSemaphore( const VULKAN_HPP_NAMESPACE::SemaphoreCreateInfo &         createInfo,\n                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                             Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateSemaphore && \"Function <vkCreateSemaphore> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Semaphore semaphore;\n    VULKAN_HPP_NAMESPACE::Result    result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateSemaphore( m_device,\n                           reinterpret_cast<const VkSemaphoreCreateInfo *>( &createInfo ),\n                           reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                           reinterpret_cast<VkSemaphore *>( &semaphore ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createSemaphore\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( semaphore ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::Semaphore, Dispatch>>::type\n                       Device::createSemaphoreUnique( const VULKAN_HPP_NAMESPACE::SemaphoreCreateInfo &         createInfo,\n                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                   Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateSemaphore && \"Function <vkCreateSemaphore> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Semaphore semaphore;\n    VULKAN_HPP_NAMESPACE::Result    result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateSemaphore( m_device,\n                           reinterpret_cast<const VkSemaphoreCreateInfo *>( &createInfo ),\n                           reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                           reinterpret_cast<VkSemaphore *>( &semaphore ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createSemaphoreUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::Semaphore, Dispatch>( semaphore, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroySemaphore( VULKAN_HPP_NAMESPACE::Semaphore                   semaphore,\n                                                   const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                   Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroySemaphore(\n      static_cast<VkDevice>( m_device ), static_cast<VkSemaphore>( semaphore ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroySemaphore( VULKAN_HPP_NAMESPACE::Semaphore                           semaphore,\n                                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                   Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroySemaphore && \"Function <vkDestroySemaphore> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroySemaphore( m_device,\n                          static_cast<VkSemaphore>( semaphore ),\n                          reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::Semaphore                   semaphore,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroySemaphore(\n      static_cast<VkDevice>( m_device ), static_cast<VkSemaphore>( semaphore ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::Semaphore                           semaphore,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroySemaphore && \"Function <vkDestroySemaphore> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroySemaphore( m_device,\n                          static_cast<VkSemaphore>( semaphore ),\n                          reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createEvent( const VULKAN_HPP_NAMESPACE::EventCreateInfo *     pCreateInfo,\n                                                                     const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                     VULKAN_HPP_NAMESPACE::Event *                     pEvent,\n                                                                     Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateEvent( static_cast<VkDevice>( m_device ),\n                                                 reinterpret_cast<const VkEventCreateInfo *>( pCreateInfo ),\n                                                 reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                 reinterpret_cast<VkEvent *>( pEvent ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::Event>::type Device::createEvent(\n    const VULKAN_HPP_NAMESPACE::EventCreateInfo & createInfo, Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateEvent && \"Function <vkCreateEvent> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Event  event;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateEvent( m_device,\n                       reinterpret_cast<const VkEventCreateInfo *>( &createInfo ),\n                       reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                       reinterpret_cast<VkEvent *>( &event ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createEvent\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( event ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::Event, Dispatch>>::type Device::createEventUnique(\n    const VULKAN_HPP_NAMESPACE::EventCreateInfo & createInfo, Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateEvent && \"Function <vkCreateEvent> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Event  event;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateEvent( m_device,\n                       reinterpret_cast<const VkEventCreateInfo *>( &createInfo ),\n                       reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                       reinterpret_cast<VkEvent *>( &event ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createEventUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::Event, Dispatch>( event, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyEvent( VULKAN_HPP_NAMESPACE::Event                       event,\n                                               const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                               Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyEvent( static_cast<VkDevice>( m_device ), static_cast<VkEvent>( event ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyEvent( VULKAN_HPP_NAMESPACE::Event                               event,\n                                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                               Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyEvent && \"Function <vkDestroyEvent> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyEvent( m_device,\n                      static_cast<VkEvent>( event ),\n                      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::Event                       event,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyEvent( static_cast<VkDevice>( m_device ), static_cast<VkEvent>( event ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::Event                               event,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyEvent && \"Function <vkDestroyEvent> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyEvent( m_device,\n                      static_cast<VkEvent>( event ),\n                      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getEventStatus( VULKAN_HPP_NAMESPACE::Event event, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetEventStatus( static_cast<VkDevice>( m_device ), static_cast<VkEvent>( event ) ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result Device::getEventStatus( VULKAN_HPP_NAMESPACE::Event event, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetEventStatus && \"Function <vkGetEventStatus> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetEventStatus( m_device, static_cast<VkEvent>( event ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck(\n      result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getEventStatus\", { VULKAN_HPP_NAMESPACE::Result::eEventSet, VULKAN_HPP_NAMESPACE::Result::eEventReset } );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::setEvent( VULKAN_HPP_NAMESPACE::Event event, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkSetEvent( static_cast<VkDevice>( m_device ), static_cast<VkEvent>( event ) ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type Device::setEvent( VULKAN_HPP_NAMESPACE::Event event,\n                                                                                                                   Dispatch const &            d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkSetEvent && \"Function <vkSetEvent> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkSetEvent( m_device, static_cast<VkEvent>( event ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::setEvent\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::resetEvent( VULKAN_HPP_NAMESPACE::Event event, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkResetEvent( static_cast<VkDevice>( m_device ), static_cast<VkEvent>( event ) ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE typename ResultValueType<void>::type Device::resetEvent( VULKAN_HPP_NAMESPACE::Event event, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkResetEvent && \"Function <vkResetEvent> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkResetEvent( m_device, static_cast<VkEvent>( event ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::resetEvent\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createQueryPool( const VULKAN_HPP_NAMESPACE::QueryPoolCreateInfo * pCreateInfo,\n                                                                         const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                         VULKAN_HPP_NAMESPACE::QueryPool *                 pQueryPool,\n                                                                         Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateQueryPool( static_cast<VkDevice>( m_device ),\n                                                     reinterpret_cast<const VkQueryPoolCreateInfo *>( pCreateInfo ),\n                                                     reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                     reinterpret_cast<VkQueryPool *>( pQueryPool ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::QueryPool>::type\n                       Device::createQueryPool( const VULKAN_HPP_NAMESPACE::QueryPoolCreateInfo &         createInfo,\n                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                             Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateQueryPool && \"Function <vkCreateQueryPool> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::QueryPool queryPool;\n    VULKAN_HPP_NAMESPACE::Result    result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateQueryPool( m_device,\n                           reinterpret_cast<const VkQueryPoolCreateInfo *>( &createInfo ),\n                           reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                           reinterpret_cast<VkQueryPool *>( &queryPool ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createQueryPool\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( queryPool ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::QueryPool, Dispatch>>::type\n                       Device::createQueryPoolUnique( const VULKAN_HPP_NAMESPACE::QueryPoolCreateInfo &         createInfo,\n                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                   Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateQueryPool && \"Function <vkCreateQueryPool> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::QueryPool queryPool;\n    VULKAN_HPP_NAMESPACE::Result    result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateQueryPool( m_device,\n                           reinterpret_cast<const VkQueryPoolCreateInfo *>( &createInfo ),\n                           reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                           reinterpret_cast<VkQueryPool *>( &queryPool ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createQueryPoolUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::QueryPool, Dispatch>( queryPool, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyQueryPool( VULKAN_HPP_NAMESPACE::QueryPool                   queryPool,\n                                                   const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                   Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyQueryPool(\n      static_cast<VkDevice>( m_device ), static_cast<VkQueryPool>( queryPool ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyQueryPool( VULKAN_HPP_NAMESPACE::QueryPool                           queryPool,\n                                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                   Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyQueryPool && \"Function <vkDestroyQueryPool> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyQueryPool( m_device,\n                          static_cast<VkQueryPool>( queryPool ),\n                          reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::QueryPool                   queryPool,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyQueryPool(\n      static_cast<VkDevice>( m_device ), static_cast<VkQueryPool>( queryPool ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::QueryPool                           queryPool,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyQueryPool && \"Function <vkDestroyQueryPool> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyQueryPool( m_device,\n                          static_cast<VkQueryPool>( queryPool ),\n                          reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getQueryPoolResults( VULKAN_HPP_NAMESPACE::QueryPool        queryPool,\n                                                                             uint32_t                               firstQuery,\n                                                                             uint32_t                               queryCount,\n                                                                             size_t                                 dataSize,\n                                                                             void *                                 pData,\n                                                                             VULKAN_HPP_NAMESPACE::DeviceSize       stride,\n                                                                             VULKAN_HPP_NAMESPACE::QueryResultFlags flags,\n                                                                             Dispatch const &                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetQueryPoolResults( static_cast<VkDevice>( m_device ),\n                                                         static_cast<VkQueryPool>( queryPool ),\n                                                         firstQuery,\n                                                         queryCount,\n                                                         dataSize,\n                                                         pData,\n                                                         static_cast<VkDeviceSize>( stride ),\n                                                         static_cast<VkQueryResultFlags>( flags ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename DataType,\n            typename DataTypeAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename DataTypeAllocator::value_type, DataType>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<DataType, DataTypeAllocator>>\n                                         Device::getQueryPoolResults( VULKAN_HPP_NAMESPACE::QueryPool        queryPool,\n                                 uint32_t                               firstQuery,\n                                 uint32_t                               queryCount,\n                                 size_t                                 dataSize,\n                                 VULKAN_HPP_NAMESPACE::DeviceSize       stride,\n                                 VULKAN_HPP_NAMESPACE::QueryResultFlags flags,\n                                 Dispatch const &                       d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetQueryPoolResults && \"Function <vkGetQueryPoolResults> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_ASSERT( dataSize % sizeof( DataType ) == 0 );\n    std::vector<DataType, DataTypeAllocator> data( dataSize / sizeof( DataType ) );\n    VULKAN_HPP_NAMESPACE::Result             result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetQueryPoolResults( m_device,\n                                                                                                              static_cast<VkQueryPool>( queryPool ),\n                                                                                                              firstQuery,\n                                                                                                              queryCount,\n                                                                                                              data.size() * sizeof( DataType ),\n                                                                                                              reinterpret_cast<void *>( data.data() ),\n                                                                                                              static_cast<VkDeviceSize>( stride ),\n                                                                                                              static_cast<VkQueryResultFlags>( flags ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::getQueryPoolResults\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eNotReady } );\n\n    return ResultValue<std::vector<DataType, DataTypeAllocator>>( result, std::move( data ) );\n  }\n\n  template <typename DataType, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<DataType> Device::getQueryPoolResult( VULKAN_HPP_NAMESPACE::QueryPool        queryPool,\n                                                                                           uint32_t                               firstQuery,\n                                                                                           uint32_t                               queryCount,\n                                                                                           VULKAN_HPP_NAMESPACE::DeviceSize       stride,\n                                                                                           VULKAN_HPP_NAMESPACE::QueryResultFlags flags,\n                                                                                           Dispatch const &                       d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetQueryPoolResults && \"Function <vkGetQueryPoolResults> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    DataType                     data;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetQueryPoolResults( m_device,\n                                                                                                              static_cast<VkQueryPool>( queryPool ),\n                                                                                                              firstQuery,\n                                                                                                              queryCount,\n                                                                                                              sizeof( DataType ),\n                                                                                                              reinterpret_cast<void *>( &data ),\n                                                                                                              static_cast<VkDeviceSize>( stride ),\n                                                                                                              static_cast<VkQueryResultFlags>( flags ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck(\n      result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getQueryPoolResult\", { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eNotReady } );\n\n    return ResultValue<DataType>( result, std::move( data ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createBuffer( const VULKAN_HPP_NAMESPACE::BufferCreateInfo *    pCreateInfo,\n                                                                      const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                      VULKAN_HPP_NAMESPACE::Buffer *                    pBuffer,\n                                                                      Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateBuffer( static_cast<VkDevice>( m_device ),\n                                                  reinterpret_cast<const VkBufferCreateInfo *>( pCreateInfo ),\n                                                  reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                  reinterpret_cast<VkBuffer *>( pBuffer ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::Buffer>::type Device::createBuffer(\n    const VULKAN_HPP_NAMESPACE::BufferCreateInfo & createInfo, Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateBuffer && \"Function <vkCreateBuffer> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Buffer buffer;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateBuffer( m_device,\n                        reinterpret_cast<const VkBufferCreateInfo *>( &createInfo ),\n                        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                        reinterpret_cast<VkBuffer *>( &buffer ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createBuffer\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( buffer ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::Buffer, Dispatch>>::type Device::createBufferUnique(\n    const VULKAN_HPP_NAMESPACE::BufferCreateInfo & createInfo, Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateBuffer && \"Function <vkCreateBuffer> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Buffer buffer;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateBuffer( m_device,\n                        reinterpret_cast<const VkBufferCreateInfo *>( &createInfo ),\n                        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                        reinterpret_cast<VkBuffer *>( &buffer ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createBufferUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::Buffer, Dispatch>( buffer, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyBuffer( VULKAN_HPP_NAMESPACE::Buffer                      buffer,\n                                                const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyBuffer( static_cast<VkDevice>( m_device ), static_cast<VkBuffer>( buffer ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyBuffer( VULKAN_HPP_NAMESPACE::Buffer                              buffer,\n                                                Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyBuffer && \"Function <vkDestroyBuffer> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyBuffer( m_device,\n                       static_cast<VkBuffer>( buffer ),\n                       reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::Buffer                      buffer,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyBuffer( static_cast<VkDevice>( m_device ), static_cast<VkBuffer>( buffer ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::Buffer                              buffer,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyBuffer && \"Function <vkDestroyBuffer> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyBuffer( m_device,\n                       static_cast<VkBuffer>( buffer ),\n                       reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createBufferView( const VULKAN_HPP_NAMESPACE::BufferViewCreateInfo * pCreateInfo,\n                                                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks *  pAllocator,\n                                                                          VULKAN_HPP_NAMESPACE::BufferView *                 pView,\n                                                                          Dispatch const &                                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateBufferView( static_cast<VkDevice>( m_device ),\n                                                      reinterpret_cast<const VkBufferViewCreateInfo *>( pCreateInfo ),\n                                                      reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                      reinterpret_cast<VkBufferView *>( pView ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::BufferView>::type\n                       Device::createBufferView( const VULKAN_HPP_NAMESPACE::BufferViewCreateInfo &        createInfo,\n                              Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                              Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateBufferView && \"Function <vkCreateBufferView> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::BufferView view;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateBufferView( m_device,\n                            reinterpret_cast<const VkBufferViewCreateInfo *>( &createInfo ),\n                            reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                            reinterpret_cast<VkBufferView *>( &view ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createBufferView\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( view ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::BufferView, Dispatch>>::type\n                       Device::createBufferViewUnique( const VULKAN_HPP_NAMESPACE::BufferViewCreateInfo &        createInfo,\n                                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                    Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateBufferView && \"Function <vkCreateBufferView> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::BufferView view;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateBufferView( m_device,\n                            reinterpret_cast<const VkBufferViewCreateInfo *>( &createInfo ),\n                            reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                            reinterpret_cast<VkBufferView *>( &view ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createBufferViewUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::BufferView, Dispatch>( view, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyBufferView( VULKAN_HPP_NAMESPACE::BufferView                  bufferView,\n                                                    const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                    Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyBufferView(\n      static_cast<VkDevice>( m_device ), static_cast<VkBufferView>( bufferView ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyBufferView( VULKAN_HPP_NAMESPACE::BufferView                          bufferView,\n                                                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                    Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyBufferView && \"Function <vkDestroyBufferView> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyBufferView( m_device,\n                           static_cast<VkBufferView>( bufferView ),\n                           reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::BufferView                  bufferView,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyBufferView(\n      static_cast<VkDevice>( m_device ), static_cast<VkBufferView>( bufferView ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::BufferView                          bufferView,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyBufferView && \"Function <vkDestroyBufferView> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyBufferView( m_device,\n                           static_cast<VkBufferView>( bufferView ),\n                           reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createImage( const VULKAN_HPP_NAMESPACE::ImageCreateInfo *     pCreateInfo,\n                                                                     const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                     VULKAN_HPP_NAMESPACE::Image *                     pImage,\n                                                                     Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateImage( static_cast<VkDevice>( m_device ),\n                                                 reinterpret_cast<const VkImageCreateInfo *>( pCreateInfo ),\n                                                 reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                 reinterpret_cast<VkImage *>( pImage ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::Image>::type Device::createImage(\n    const VULKAN_HPP_NAMESPACE::ImageCreateInfo & createInfo, Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateImage && \"Function <vkCreateImage> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Image  image;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateImage( m_device,\n                       reinterpret_cast<const VkImageCreateInfo *>( &createInfo ),\n                       reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                       reinterpret_cast<VkImage *>( &image ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createImage\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( image ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::Image, Dispatch>>::type Device::createImageUnique(\n    const VULKAN_HPP_NAMESPACE::ImageCreateInfo & createInfo, Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateImage && \"Function <vkCreateImage> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Image  image;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateImage( m_device,\n                       reinterpret_cast<const VkImageCreateInfo *>( &createInfo ),\n                       reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                       reinterpret_cast<VkImage *>( &image ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createImageUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::Image, Dispatch>( image, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyImage( VULKAN_HPP_NAMESPACE::Image                       image,\n                                               const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                               Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyImage( static_cast<VkDevice>( m_device ), static_cast<VkImage>( image ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyImage( VULKAN_HPP_NAMESPACE::Image                               image,\n                                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                               Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyImage && \"Function <vkDestroyImage> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyImage( m_device,\n                      static_cast<VkImage>( image ),\n                      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::Image                       image,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyImage( static_cast<VkDevice>( m_device ), static_cast<VkImage>( image ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::Image                               image,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyImage && \"Function <vkDestroyImage> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyImage( m_device,\n                      static_cast<VkImage>( image ),\n                      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getImageSubresourceLayout( VULKAN_HPP_NAMESPACE::Image                    image,\n                                                            const VULKAN_HPP_NAMESPACE::ImageSubresource * pSubresource,\n                                                            VULKAN_HPP_NAMESPACE::SubresourceLayout *      pLayout,\n                                                            Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetImageSubresourceLayout( static_cast<VkDevice>( m_device ),\n                                   static_cast<VkImage>( image ),\n                                   reinterpret_cast<const VkImageSubresource *>( pSubresource ),\n                                   reinterpret_cast<VkSubresourceLayout *>( pLayout ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::SubresourceLayout Device::getImageSubresourceLayout(\n    VULKAN_HPP_NAMESPACE::Image image, const VULKAN_HPP_NAMESPACE::ImageSubresource & subresource, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetImageSubresourceLayout && \"Function <vkGetImageSubresourceLayout> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::SubresourceLayout layout;\n    d.vkGetImageSubresourceLayout( m_device,\n                                   static_cast<VkImage>( image ),\n                                   reinterpret_cast<const VkImageSubresource *>( &subresource ),\n                                   reinterpret_cast<VkSubresourceLayout *>( &layout ) );\n\n    return layout;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createImageView( const VULKAN_HPP_NAMESPACE::ImageViewCreateInfo * pCreateInfo,\n                                                                         const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                         VULKAN_HPP_NAMESPACE::ImageView *                 pView,\n                                                                         Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateImageView( static_cast<VkDevice>( m_device ),\n                                                     reinterpret_cast<const VkImageViewCreateInfo *>( pCreateInfo ),\n                                                     reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                     reinterpret_cast<VkImageView *>( pView ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::ImageView>::type\n                       Device::createImageView( const VULKAN_HPP_NAMESPACE::ImageViewCreateInfo &         createInfo,\n                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                             Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateImageView && \"Function <vkCreateImageView> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::ImageView view;\n    VULKAN_HPP_NAMESPACE::Result    result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateImageView( m_device,\n                           reinterpret_cast<const VkImageViewCreateInfo *>( &createInfo ),\n                           reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                           reinterpret_cast<VkImageView *>( &view ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createImageView\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( view ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::ImageView, Dispatch>>::type\n                       Device::createImageViewUnique( const VULKAN_HPP_NAMESPACE::ImageViewCreateInfo &         createInfo,\n                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                   Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateImageView && \"Function <vkCreateImageView> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::ImageView view;\n    VULKAN_HPP_NAMESPACE::Result    result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateImageView( m_device,\n                           reinterpret_cast<const VkImageViewCreateInfo *>( &createInfo ),\n                           reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                           reinterpret_cast<VkImageView *>( &view ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createImageViewUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::ImageView, Dispatch>( view, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyImageView( VULKAN_HPP_NAMESPACE::ImageView                   imageView,\n                                                   const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                   Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyImageView(\n      static_cast<VkDevice>( m_device ), static_cast<VkImageView>( imageView ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyImageView( VULKAN_HPP_NAMESPACE::ImageView                           imageView,\n                                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                   Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyImageView && \"Function <vkDestroyImageView> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyImageView( m_device,\n                          static_cast<VkImageView>( imageView ),\n                          reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::ImageView                   imageView,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyImageView(\n      static_cast<VkDevice>( m_device ), static_cast<VkImageView>( imageView ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::ImageView                           imageView,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyImageView && \"Function <vkDestroyImageView> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyImageView( m_device,\n                          static_cast<VkImageView>( imageView ),\n                          reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createShaderModule( const VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo * pCreateInfo,\n                                                                            const VULKAN_HPP_NAMESPACE::AllocationCallbacks *    pAllocator,\n                                                                            VULKAN_HPP_NAMESPACE::ShaderModule *                 pShaderModule,\n                                                                            Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateShaderModule( static_cast<VkDevice>( m_device ),\n                                                        reinterpret_cast<const VkShaderModuleCreateInfo *>( pCreateInfo ),\n                                                        reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                        reinterpret_cast<VkShaderModule *>( pShaderModule ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::ShaderModule>::type\n                       Device::createShaderModule( const VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo &      createInfo,\n                                Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateShaderModule && \"Function <vkCreateShaderModule> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::ShaderModule shaderModule;\n    VULKAN_HPP_NAMESPACE::Result       result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateShaderModule( m_device,\n                              reinterpret_cast<const VkShaderModuleCreateInfo *>( &createInfo ),\n                              reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                              reinterpret_cast<VkShaderModule *>( &shaderModule ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createShaderModule\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( shaderModule ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::ShaderModule, Dispatch>>::type\n                       Device::createShaderModuleUnique( const VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo &      createInfo,\n                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                      Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateShaderModule && \"Function <vkCreateShaderModule> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::ShaderModule shaderModule;\n    VULKAN_HPP_NAMESPACE::Result       result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateShaderModule( m_device,\n                              reinterpret_cast<const VkShaderModuleCreateInfo *>( &createInfo ),\n                              reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                              reinterpret_cast<VkShaderModule *>( &shaderModule ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createShaderModuleUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::ShaderModule, Dispatch>( shaderModule, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyShaderModule( VULKAN_HPP_NAMESPACE::ShaderModule                shaderModule,\n                                                      const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                      Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyShaderModule(\n      static_cast<VkDevice>( m_device ), static_cast<VkShaderModule>( shaderModule ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyShaderModule( VULKAN_HPP_NAMESPACE::ShaderModule                        shaderModule,\n                                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                      Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyShaderModule && \"Function <vkDestroyShaderModule> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyShaderModule( m_device,\n                             static_cast<VkShaderModule>( shaderModule ),\n                             reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::ShaderModule                shaderModule,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyShaderModule(\n      static_cast<VkDevice>( m_device ), static_cast<VkShaderModule>( shaderModule ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::ShaderModule                        shaderModule,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyShaderModule && \"Function <vkDestroyShaderModule> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyShaderModule( m_device,\n                             static_cast<VkShaderModule>( shaderModule ),\n                             reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createPipelineCache( const VULKAN_HPP_NAMESPACE::PipelineCacheCreateInfo * pCreateInfo,\n                                                                             const VULKAN_HPP_NAMESPACE::AllocationCallbacks *     pAllocator,\n                                                                             VULKAN_HPP_NAMESPACE::PipelineCache *                 pPipelineCache,\n                                                                             Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreatePipelineCache( static_cast<VkDevice>( m_device ),\n                                                         reinterpret_cast<const VkPipelineCacheCreateInfo *>( pCreateInfo ),\n                                                         reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                         reinterpret_cast<VkPipelineCache *>( pPipelineCache ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::PipelineCache>::type\n                       Device::createPipelineCache( const VULKAN_HPP_NAMESPACE::PipelineCacheCreateInfo &     createInfo,\n                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                 Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreatePipelineCache && \"Function <vkCreatePipelineCache> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::PipelineCache pipelineCache;\n    VULKAN_HPP_NAMESPACE::Result        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreatePipelineCache( m_device,\n                               reinterpret_cast<const VkPipelineCacheCreateInfo *>( &createInfo ),\n                               reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                               reinterpret_cast<VkPipelineCache *>( &pipelineCache ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createPipelineCache\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( pipelineCache ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::PipelineCache, Dispatch>>::type\n                       Device::createPipelineCacheUnique( const VULKAN_HPP_NAMESPACE::PipelineCacheCreateInfo &     createInfo,\n                                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                       Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreatePipelineCache && \"Function <vkCreatePipelineCache> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::PipelineCache pipelineCache;\n    VULKAN_HPP_NAMESPACE::Result        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreatePipelineCache( m_device,\n                               reinterpret_cast<const VkPipelineCacheCreateInfo *>( &createInfo ),\n                               reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                               reinterpret_cast<VkPipelineCache *>( &pipelineCache ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createPipelineCacheUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::PipelineCache, Dispatch>( pipelineCache, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyPipelineCache( VULKAN_HPP_NAMESPACE::PipelineCache               pipelineCache,\n                                                       const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                       Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyPipelineCache(\n      static_cast<VkDevice>( m_device ), static_cast<VkPipelineCache>( pipelineCache ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyPipelineCache( VULKAN_HPP_NAMESPACE::PipelineCache                       pipelineCache,\n                                                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                       Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyPipelineCache && \"Function <vkDestroyPipelineCache> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyPipelineCache( m_device,\n                              static_cast<VkPipelineCache>( pipelineCache ),\n                              reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::PipelineCache               pipelineCache,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyPipelineCache(\n      static_cast<VkDevice>( m_device ), static_cast<VkPipelineCache>( pipelineCache ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::PipelineCache                       pipelineCache,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyPipelineCache && \"Function <vkDestroyPipelineCache> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyPipelineCache( m_device,\n                              static_cast<VkPipelineCache>( pipelineCache ),\n                              reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getPipelineCacheData( VULKAN_HPP_NAMESPACE::PipelineCache pipelineCache,\n                                                                              size_t *                            pDataSize,\n                                                                              void *                              pData,\n                                                                              Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkGetPipelineCacheData( static_cast<VkDevice>( m_device ), static_cast<VkPipelineCache>( pipelineCache ), pDataSize, pData ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Uint8_tAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<uint8_t, Uint8_tAllocator>>::type\n                       Device::getPipelineCacheData( VULKAN_HPP_NAMESPACE::PipelineCache pipelineCache, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPipelineCacheData && \"Function <vkGetPipelineCacheData> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<uint8_t, Uint8_tAllocator> data;\n    size_t                                 dataSize;\n    VULKAN_HPP_NAMESPACE::Result           result;\n    do\n    {\n      result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPipelineCacheData( m_device, static_cast<VkPipelineCache>( pipelineCache ), &dataSize, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && dataSize )\n      {\n        data.resize( dataSize );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPipelineCacheData( m_device, static_cast<VkPipelineCache>( pipelineCache ), &dataSize, reinterpret_cast<void *>( data.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getPipelineCacheData\" );\n    VULKAN_HPP_ASSERT( dataSize <= data.size() );\n    if ( dataSize < data.size() )\n    {\n      data.resize( dataSize );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data ) );\n  }\n\n  template <typename Uint8_tAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<uint8_t, Uint8_tAllocator>>::type\n    Device::getPipelineCacheData( VULKAN_HPP_NAMESPACE::PipelineCache pipelineCache, Uint8_tAllocator & uint8_tAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPipelineCacheData && \"Function <vkGetPipelineCacheData> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<uint8_t, Uint8_tAllocator> data( uint8_tAllocator );\n    size_t                                 dataSize;\n    VULKAN_HPP_NAMESPACE::Result           result;\n    do\n    {\n      result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPipelineCacheData( m_device, static_cast<VkPipelineCache>( pipelineCache ), &dataSize, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && dataSize )\n      {\n        data.resize( dataSize );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPipelineCacheData( m_device, static_cast<VkPipelineCache>( pipelineCache ), &dataSize, reinterpret_cast<void *>( data.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getPipelineCacheData\" );\n    VULKAN_HPP_ASSERT( dataSize <= data.size() );\n    if ( dataSize < data.size() )\n    {\n      data.resize( dataSize );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::mergePipelineCaches( VULKAN_HPP_NAMESPACE::PipelineCache         dstCache,\n                                                                             uint32_t                                    srcCacheCount,\n                                                                             const VULKAN_HPP_NAMESPACE::PipelineCache * pSrcCaches,\n                                                                             Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkMergePipelineCaches(\n      static_cast<VkDevice>( m_device ), static_cast<VkPipelineCache>( dstCache ), srcCacheCount, reinterpret_cast<const VkPipelineCache *>( pSrcCaches ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n                                          Device::mergePipelineCaches( VULKAN_HPP_NAMESPACE::PipelineCache                                                 dstCache,\n                                 VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::PipelineCache> const & srcCaches,\n                                 Dispatch const &                                                                    d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkMergePipelineCaches && \"Function <vkMergePipelineCaches> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkMergePipelineCaches(\n      m_device, static_cast<VkPipelineCache>( dstCache ), srcCaches.size(), reinterpret_cast<const VkPipelineCache *>( srcCaches.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::mergePipelineCaches\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createGraphicsPipelines( VULKAN_HPP_NAMESPACE::PipelineCache                      pipelineCache,\n                                                                                 uint32_t                                                 createInfoCount,\n                                                                                 const VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo * pCreateInfos,\n                                                                                 const VULKAN_HPP_NAMESPACE::AllocationCallbacks *        pAllocator,\n                                                                                 VULKAN_HPP_NAMESPACE::Pipeline *                         pPipelines,\n                                                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateGraphicsPipelines( static_cast<VkDevice>( m_device ),\n                                                             static_cast<VkPipelineCache>( pipelineCache ),\n                                                             createInfoCount,\n                                                             reinterpret_cast<const VkGraphicsPipelineCreateInfo *>( pCreateInfos ),\n                                                             reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                             reinterpret_cast<VkPipeline *>( pPipelines ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename PipelineAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, VULKAN_HPP_NAMESPACE::Pipeline>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>\n                                         Device::createGraphicsPipelines( VULKAN_HPP_NAMESPACE::PipelineCache                                                              pipelineCache,\n                                     VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo> const & createInfos,\n                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                        allocator,\n                                     Dispatch const &                                                                                 d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateGraphicsPipelines && \"Function <vkCreateGraphicsPipelines> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator> pipelines( createInfos.size() );\n    VULKAN_HPP_NAMESPACE::Result                                   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateGraphicsPipelines(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      createInfos.size(),\n      reinterpret_cast<const VkGraphicsPipelineCreateInfo *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createGraphicsPipelines\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n\n    return ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>( result, std::move( pipelines ) );\n  }\n\n  template <typename PipelineAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, VULKAN_HPP_NAMESPACE::Pipeline>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>\n                                         Device::createGraphicsPipelines( VULKAN_HPP_NAMESPACE::PipelineCache                                                              pipelineCache,\n                                     VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo> const & createInfos,\n                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                        allocator,\n                                     PipelineAllocator &                                                                              pipelineAllocator,\n                                     Dispatch const &                                                                                 d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateGraphicsPipelines && \"Function <vkCreateGraphicsPipelines> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator> pipelines( createInfos.size(), pipelineAllocator );\n    VULKAN_HPP_NAMESPACE::Result                                   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateGraphicsPipelines(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      createInfos.size(),\n      reinterpret_cast<const VkGraphicsPipelineCreateInfo *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createGraphicsPipelines\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n\n    return ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>( result, std::move( pipelines ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<VULKAN_HPP_NAMESPACE::Pipeline>\n                                         Device::createGraphicsPipeline( VULKAN_HPP_NAMESPACE::PipelineCache                       pipelineCache,\n                                    const VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo &  createInfo,\n                                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                    Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateGraphicsPipelines && \"Function <vkCreateGraphicsPipelines> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Pipeline pipeline;\n    VULKAN_HPP_NAMESPACE::Result   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateGraphicsPipelines(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      1,\n      reinterpret_cast<const VkGraphicsPipelineCreateInfo *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( &pipeline ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createGraphicsPipeline\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n\n    return ResultValue<VULKAN_HPP_NAMESPACE::Pipeline>( result, std::move( pipeline ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <\n    typename Dispatch,\n    typename PipelineAllocator,\n    typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>\n                                         Device::createGraphicsPipelinesUnique( VULKAN_HPP_NAMESPACE::PipelineCache                                                              pipelineCache,\n                                           VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo> const & createInfos,\n                                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                        allocator,\n                                           Dispatch const &                                                                                 d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateGraphicsPipelines && \"Function <vkCreateGraphicsPipelines> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Pipeline> pipelines( createInfos.size() );\n    VULKAN_HPP_NAMESPACE::Result                result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateGraphicsPipelines(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      createInfos.size(),\n      reinterpret_cast<const VkGraphicsPipelineCreateInfo *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createGraphicsPipelinesUnique\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n    std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator> uniquePipelines;\n    uniquePipelines.reserve( createInfos.size() );\n    detail::ObjectDestroy<Device, Dispatch> deleter( *this, allocator, d );\n    for ( auto const & pipeline : pipelines )\n    {\n      uniquePipelines.push_back( UniqueHandle<Pipeline, Dispatch>( pipeline, deleter ) );\n    }\n    return ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>( result, std::move( uniquePipelines ) );\n  }\n\n  template <\n    typename Dispatch,\n    typename PipelineAllocator,\n    typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>\n                                         Device::createGraphicsPipelinesUnique( VULKAN_HPP_NAMESPACE::PipelineCache                                                              pipelineCache,\n                                           VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo> const & createInfos,\n                                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                        allocator,\n                                           PipelineAllocator &                                                                              pipelineAllocator,\n                                           Dispatch const &                                                                                 d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateGraphicsPipelines && \"Function <vkCreateGraphicsPipelines> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Pipeline> pipelines( createInfos.size() );\n    VULKAN_HPP_NAMESPACE::Result                result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateGraphicsPipelines(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      createInfos.size(),\n      reinterpret_cast<const VkGraphicsPipelineCreateInfo *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createGraphicsPipelinesUnique\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n    std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator> uniquePipelines( pipelineAllocator );\n    uniquePipelines.reserve( createInfos.size() );\n    detail::ObjectDestroy<Device, Dispatch> deleter( *this, allocator, d );\n    for ( auto const & pipeline : pipelines )\n    {\n      uniquePipelines.push_back( UniqueHandle<Pipeline, Dispatch>( pipeline, deleter ) );\n    }\n    return ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>( result, std::move( uniquePipelines ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>\n                                         Device::createGraphicsPipelineUnique( VULKAN_HPP_NAMESPACE::PipelineCache                       pipelineCache,\n                                          const VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo &  createInfo,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateGraphicsPipelines && \"Function <vkCreateGraphicsPipelines> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Pipeline pipeline;\n    VULKAN_HPP_NAMESPACE::Result   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateGraphicsPipelines(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      1,\n      reinterpret_cast<const VkGraphicsPipelineCreateInfo *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( &pipeline ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createGraphicsPipelineUnique\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n\n    return ResultValue<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>( pipeline, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createComputePipelines( VULKAN_HPP_NAMESPACE::PipelineCache                     pipelineCache,\n                                                                                uint32_t                                                createInfoCount,\n                                                                                const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo * pCreateInfos,\n                                                                                const VULKAN_HPP_NAMESPACE::AllocationCallbacks *       pAllocator,\n                                                                                VULKAN_HPP_NAMESPACE::Pipeline *                        pPipelines,\n                                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateComputePipelines( static_cast<VkDevice>( m_device ),\n                                                            static_cast<VkPipelineCache>( pipelineCache ),\n                                                            createInfoCount,\n                                                            reinterpret_cast<const VkComputePipelineCreateInfo *>( pCreateInfos ),\n                                                            reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                            reinterpret_cast<VkPipeline *>( pPipelines ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename PipelineAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, VULKAN_HPP_NAMESPACE::Pipeline>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>\n                                         Device::createComputePipelines( VULKAN_HPP_NAMESPACE::PipelineCache                                                             pipelineCache,\n                                    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo> const & createInfos,\n                                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                       allocator,\n                                    Dispatch const &                                                                                d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateComputePipelines && \"Function <vkCreateComputePipelines> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator> pipelines( createInfos.size() );\n    VULKAN_HPP_NAMESPACE::Result                                   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateComputePipelines(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      createInfos.size(),\n      reinterpret_cast<const VkComputePipelineCreateInfo *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createComputePipelines\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n\n    return ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>( result, std::move( pipelines ) );\n  }\n\n  template <typename PipelineAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, VULKAN_HPP_NAMESPACE::Pipeline>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>\n                                         Device::createComputePipelines( VULKAN_HPP_NAMESPACE::PipelineCache                                                             pipelineCache,\n                                    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo> const & createInfos,\n                                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                       allocator,\n                                    PipelineAllocator &                                                                             pipelineAllocator,\n                                    Dispatch const &                                                                                d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateComputePipelines && \"Function <vkCreateComputePipelines> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator> pipelines( createInfos.size(), pipelineAllocator );\n    VULKAN_HPP_NAMESPACE::Result                                   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateComputePipelines(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      createInfos.size(),\n      reinterpret_cast<const VkComputePipelineCreateInfo *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createComputePipelines\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n\n    return ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>( result, std::move( pipelines ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<VULKAN_HPP_NAMESPACE::Pipeline>\n                                         Device::createComputePipeline( VULKAN_HPP_NAMESPACE::PipelineCache                       pipelineCache,\n                                   const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo &   createInfo,\n                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                   Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateComputePipelines && \"Function <vkCreateComputePipelines> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Pipeline pipeline;\n    VULKAN_HPP_NAMESPACE::Result   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateComputePipelines(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      1,\n      reinterpret_cast<const VkComputePipelineCreateInfo *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( &pipeline ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createComputePipeline\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n\n    return ResultValue<VULKAN_HPP_NAMESPACE::Pipeline>( result, std::move( pipeline ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <\n    typename Dispatch,\n    typename PipelineAllocator,\n    typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>\n                                         Device::createComputePipelinesUnique( VULKAN_HPP_NAMESPACE::PipelineCache                                                             pipelineCache,\n                                          VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo> const & createInfos,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                       allocator,\n                                          Dispatch const &                                                                                d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateComputePipelines && \"Function <vkCreateComputePipelines> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Pipeline> pipelines( createInfos.size() );\n    VULKAN_HPP_NAMESPACE::Result                result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateComputePipelines(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      createInfos.size(),\n      reinterpret_cast<const VkComputePipelineCreateInfo *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createComputePipelinesUnique\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n    std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator> uniquePipelines;\n    uniquePipelines.reserve( createInfos.size() );\n    detail::ObjectDestroy<Device, Dispatch> deleter( *this, allocator, d );\n    for ( auto const & pipeline : pipelines )\n    {\n      uniquePipelines.push_back( UniqueHandle<Pipeline, Dispatch>( pipeline, deleter ) );\n    }\n    return ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>( result, std::move( uniquePipelines ) );\n  }\n\n  template <\n    typename Dispatch,\n    typename PipelineAllocator,\n    typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>\n                                         Device::createComputePipelinesUnique( VULKAN_HPP_NAMESPACE::PipelineCache                                                             pipelineCache,\n                                          VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo> const & createInfos,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                       allocator,\n                                          PipelineAllocator &                                                                             pipelineAllocator,\n                                          Dispatch const &                                                                                d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateComputePipelines && \"Function <vkCreateComputePipelines> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Pipeline> pipelines( createInfos.size() );\n    VULKAN_HPP_NAMESPACE::Result                result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateComputePipelines(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      createInfos.size(),\n      reinterpret_cast<const VkComputePipelineCreateInfo *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createComputePipelinesUnique\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n    std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator> uniquePipelines( pipelineAllocator );\n    uniquePipelines.reserve( createInfos.size() );\n    detail::ObjectDestroy<Device, Dispatch> deleter( *this, allocator, d );\n    for ( auto const & pipeline : pipelines )\n    {\n      uniquePipelines.push_back( UniqueHandle<Pipeline, Dispatch>( pipeline, deleter ) );\n    }\n    return ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>( result, std::move( uniquePipelines ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>\n                                         Device::createComputePipelineUnique( VULKAN_HPP_NAMESPACE::PipelineCache                       pipelineCache,\n                                         const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo &   createInfo,\n                                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                         Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateComputePipelines && \"Function <vkCreateComputePipelines> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Pipeline pipeline;\n    VULKAN_HPP_NAMESPACE::Result   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateComputePipelines(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      1,\n      reinterpret_cast<const VkComputePipelineCreateInfo *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( &pipeline ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createComputePipelineUnique\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n\n    return ResultValue<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>( pipeline, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyPipeline( VULKAN_HPP_NAMESPACE::Pipeline                    pipeline,\n                                                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                  Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyPipeline(\n      static_cast<VkDevice>( m_device ), static_cast<VkPipeline>( pipeline ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyPipeline( VULKAN_HPP_NAMESPACE::Pipeline                            pipeline,\n                                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                  Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyPipeline && \"Function <vkDestroyPipeline> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyPipeline( m_device,\n                         static_cast<VkPipeline>( pipeline ),\n                         reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::Pipeline                    pipeline,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyPipeline(\n      static_cast<VkDevice>( m_device ), static_cast<VkPipeline>( pipeline ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::Pipeline                            pipeline,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyPipeline && \"Function <vkDestroyPipeline> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyPipeline( m_device,\n                         static_cast<VkPipeline>( pipeline ),\n                         reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createPipelineLayout( const VULKAN_HPP_NAMESPACE::PipelineLayoutCreateInfo * pCreateInfo,\n                                                                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks *      pAllocator,\n                                                                              VULKAN_HPP_NAMESPACE::PipelineLayout *                 pPipelineLayout,\n                                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreatePipelineLayout( static_cast<VkDevice>( m_device ),\n                                                          reinterpret_cast<const VkPipelineLayoutCreateInfo *>( pCreateInfo ),\n                                                          reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                          reinterpret_cast<VkPipelineLayout *>( pPipelineLayout ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::PipelineLayout>::type\n                       Device::createPipelineLayout( const VULKAN_HPP_NAMESPACE::PipelineLayoutCreateInfo &    createInfo,\n                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                  Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreatePipelineLayout && \"Function <vkCreatePipelineLayout> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::PipelineLayout pipelineLayout;\n    VULKAN_HPP_NAMESPACE::Result         result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreatePipelineLayout( m_device,\n                                reinterpret_cast<const VkPipelineLayoutCreateInfo *>( &createInfo ),\n                                reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                                reinterpret_cast<VkPipelineLayout *>( &pipelineLayout ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createPipelineLayout\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( pipelineLayout ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::PipelineLayout, Dispatch>>::type\n                       Device::createPipelineLayoutUnique( const VULKAN_HPP_NAMESPACE::PipelineLayoutCreateInfo &    createInfo,\n                                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                        Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreatePipelineLayout && \"Function <vkCreatePipelineLayout> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::PipelineLayout pipelineLayout;\n    VULKAN_HPP_NAMESPACE::Result         result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreatePipelineLayout( m_device,\n                                reinterpret_cast<const VkPipelineLayoutCreateInfo *>( &createInfo ),\n                                reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                                reinterpret_cast<VkPipelineLayout *>( &pipelineLayout ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createPipelineLayoutUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::PipelineLayout, Dispatch>( pipelineLayout, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyPipelineLayout( VULKAN_HPP_NAMESPACE::PipelineLayout              pipelineLayout,\n                                                        const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                        Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyPipelineLayout(\n      static_cast<VkDevice>( m_device ), static_cast<VkPipelineLayout>( pipelineLayout ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyPipelineLayout( VULKAN_HPP_NAMESPACE::PipelineLayout                      pipelineLayout,\n                                                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                        Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyPipelineLayout && \"Function <vkDestroyPipelineLayout> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyPipelineLayout( m_device,\n                               static_cast<VkPipelineLayout>( pipelineLayout ),\n                               reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::PipelineLayout              pipelineLayout,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyPipelineLayout(\n      static_cast<VkDevice>( m_device ), static_cast<VkPipelineLayout>( pipelineLayout ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::PipelineLayout                      pipelineLayout,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyPipelineLayout && \"Function <vkDestroyPipelineLayout> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyPipelineLayout( m_device,\n                               static_cast<VkPipelineLayout>( pipelineLayout ),\n                               reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createSampler( const VULKAN_HPP_NAMESPACE::SamplerCreateInfo *   pCreateInfo,\n                                                                       const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                       VULKAN_HPP_NAMESPACE::Sampler *                   pSampler,\n                                                                       Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateSampler( static_cast<VkDevice>( m_device ),\n                                                   reinterpret_cast<const VkSamplerCreateInfo *>( pCreateInfo ),\n                                                   reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                   reinterpret_cast<VkSampler *>( pSampler ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::Sampler>::type Device::createSampler(\n    const VULKAN_HPP_NAMESPACE::SamplerCreateInfo & createInfo, Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateSampler && \"Function <vkCreateSampler> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Sampler sampler;\n    VULKAN_HPP_NAMESPACE::Result  result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateSampler( m_device,\n                         reinterpret_cast<const VkSamplerCreateInfo *>( &createInfo ),\n                         reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                         reinterpret_cast<VkSampler *>( &sampler ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createSampler\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( sampler ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::Sampler, Dispatch>>::type Device::createSamplerUnique(\n    const VULKAN_HPP_NAMESPACE::SamplerCreateInfo & createInfo, Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateSampler && \"Function <vkCreateSampler> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Sampler sampler;\n    VULKAN_HPP_NAMESPACE::Result  result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateSampler( m_device,\n                         reinterpret_cast<const VkSamplerCreateInfo *>( &createInfo ),\n                         reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                         reinterpret_cast<VkSampler *>( &sampler ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createSamplerUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::Sampler, Dispatch>( sampler, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroySampler( VULKAN_HPP_NAMESPACE::Sampler                     sampler,\n                                                 const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                 Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroySampler( static_cast<VkDevice>( m_device ), static_cast<VkSampler>( sampler ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroySampler( VULKAN_HPP_NAMESPACE::Sampler                             sampler,\n                                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                 Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroySampler && \"Function <vkDestroySampler> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroySampler( m_device,\n                        static_cast<VkSampler>( sampler ),\n                        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::Sampler                     sampler,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroySampler( static_cast<VkDevice>( m_device ), static_cast<VkSampler>( sampler ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::Sampler                             sampler,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroySampler && \"Function <vkDestroySampler> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroySampler( m_device,\n                        static_cast<VkSampler>( sampler ),\n                        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createDescriptorSetLayout( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo * pCreateInfo,\n                                                                                   const VULKAN_HPP_NAMESPACE::AllocationCallbacks *           pAllocator,\n                                                                                   VULKAN_HPP_NAMESPACE::DescriptorSetLayout *                 pSetLayout,\n                                                                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateDescriptorSetLayout( static_cast<VkDevice>( m_device ),\n                                                               reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>( pCreateInfo ),\n                                                               reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                               reinterpret_cast<VkDescriptorSetLayout *>( pSetLayout ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::DescriptorSetLayout>::type\n                       Device::createDescriptorSetLayout( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo & createInfo,\n                                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>   allocator,\n                                       Dispatch const &                                            d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateDescriptorSetLayout && \"Function <vkCreateDescriptorSetLayout> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::DescriptorSetLayout setLayout;\n    VULKAN_HPP_NAMESPACE::Result              result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateDescriptorSetLayout(\n      m_device,\n      reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkDescriptorSetLayout *>( &setLayout ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createDescriptorSetLayout\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( setLayout ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorSetLayout, Dispatch>>::type\n                       Device::createDescriptorSetLayoutUnique( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo & createInfo,\n                                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>   allocator,\n                                             Dispatch const &                                            d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateDescriptorSetLayout && \"Function <vkCreateDescriptorSetLayout> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::DescriptorSetLayout setLayout;\n    VULKAN_HPP_NAMESPACE::Result              result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateDescriptorSetLayout(\n      m_device,\n      reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkDescriptorSetLayout *>( &setLayout ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createDescriptorSetLayoutUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorSetLayout, Dispatch>( setLayout, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyDescriptorSetLayout( VULKAN_HPP_NAMESPACE::DescriptorSetLayout         descriptorSetLayout,\n                                                             const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                             Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyDescriptorSetLayout( static_cast<VkDevice>( m_device ),\n                                    static_cast<VkDescriptorSetLayout>( descriptorSetLayout ),\n                                    reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyDescriptorSetLayout( VULKAN_HPP_NAMESPACE::DescriptorSetLayout                 descriptorSetLayout,\n                                                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                             Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyDescriptorSetLayout && \"Function <vkDestroyDescriptorSetLayout> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyDescriptorSetLayout(\n      m_device,\n      static_cast<VkDescriptorSetLayout>( descriptorSetLayout ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::DescriptorSetLayout         descriptorSetLayout,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyDescriptorSetLayout( static_cast<VkDevice>( m_device ),\n                                    static_cast<VkDescriptorSetLayout>( descriptorSetLayout ),\n                                    reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::DescriptorSetLayout                 descriptorSetLayout,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyDescriptorSetLayout && \"Function <vkDestroyDescriptorSetLayout> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyDescriptorSetLayout(\n      m_device,\n      static_cast<VkDescriptorSetLayout>( descriptorSetLayout ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createDescriptorPool( const VULKAN_HPP_NAMESPACE::DescriptorPoolCreateInfo * pCreateInfo,\n                                                                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks *      pAllocator,\n                                                                              VULKAN_HPP_NAMESPACE::DescriptorPool *                 pDescriptorPool,\n                                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateDescriptorPool( static_cast<VkDevice>( m_device ),\n                                                          reinterpret_cast<const VkDescriptorPoolCreateInfo *>( pCreateInfo ),\n                                                          reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                          reinterpret_cast<VkDescriptorPool *>( pDescriptorPool ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::DescriptorPool>::type\n                       Device::createDescriptorPool( const VULKAN_HPP_NAMESPACE::DescriptorPoolCreateInfo &    createInfo,\n                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                  Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateDescriptorPool && \"Function <vkCreateDescriptorPool> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::DescriptorPool descriptorPool;\n    VULKAN_HPP_NAMESPACE::Result         result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateDescriptorPool( m_device,\n                                reinterpret_cast<const VkDescriptorPoolCreateInfo *>( &createInfo ),\n                                reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                                reinterpret_cast<VkDescriptorPool *>( &descriptorPool ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createDescriptorPool\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( descriptorPool ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorPool, Dispatch>>::type\n                       Device::createDescriptorPoolUnique( const VULKAN_HPP_NAMESPACE::DescriptorPoolCreateInfo &    createInfo,\n                                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                        Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateDescriptorPool && \"Function <vkCreateDescriptorPool> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::DescriptorPool descriptorPool;\n    VULKAN_HPP_NAMESPACE::Result         result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateDescriptorPool( m_device,\n                                reinterpret_cast<const VkDescriptorPoolCreateInfo *>( &createInfo ),\n                                reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                                reinterpret_cast<VkDescriptorPool *>( &descriptorPool ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createDescriptorPoolUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorPool, Dispatch>( descriptorPool, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyDescriptorPool( VULKAN_HPP_NAMESPACE::DescriptorPool              descriptorPool,\n                                                        const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                        Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyDescriptorPool(\n      static_cast<VkDevice>( m_device ), static_cast<VkDescriptorPool>( descriptorPool ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyDescriptorPool( VULKAN_HPP_NAMESPACE::DescriptorPool                      descriptorPool,\n                                                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                        Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyDescriptorPool && \"Function <vkDestroyDescriptorPool> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyDescriptorPool( m_device,\n                               static_cast<VkDescriptorPool>( descriptorPool ),\n                               reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::DescriptorPool              descriptorPool,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyDescriptorPool(\n      static_cast<VkDevice>( m_device ), static_cast<VkDescriptorPool>( descriptorPool ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::DescriptorPool                      descriptorPool,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyDescriptorPool && \"Function <vkDestroyDescriptorPool> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyDescriptorPool( m_device,\n                               static_cast<VkDescriptorPool>( descriptorPool ),\n                               reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE Result Device::resetDescriptorPool( VULKAN_HPP_NAMESPACE::DescriptorPool           descriptorPool,\n                                                        VULKAN_HPP_NAMESPACE::DescriptorPoolResetFlags flags,\n                                                        Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkResetDescriptorPool(\n      static_cast<VkDevice>( m_device ), static_cast<VkDescriptorPool>( descriptorPool ), static_cast<VkDescriptorPoolResetFlags>( flags ) ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::resetDescriptorPool( VULKAN_HPP_NAMESPACE::DescriptorPool           descriptorPool,\n                                                      VULKAN_HPP_NAMESPACE::DescriptorPoolResetFlags flags,\n                                                      Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkResetDescriptorPool && \"Function <vkResetDescriptorPool> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkResetDescriptorPool( m_device, static_cast<VkDescriptorPool>( descriptorPool ), static_cast<VkDescriptorPoolResetFlags>( flags ) );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::allocateDescriptorSets( const VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo * pAllocateInfo,\n                                                                                VULKAN_HPP_NAMESPACE::DescriptorSet *                   pDescriptorSets,\n                                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkAllocateDescriptorSets( static_cast<VkDevice>( m_device ),\n                                                            reinterpret_cast<const VkDescriptorSetAllocateInfo *>( pAllocateInfo ),\n                                                            reinterpret_cast<VkDescriptorSet *>( pDescriptorSets ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename DescriptorSetAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename DescriptorSetAllocator::value_type, VULKAN_HPP_NAMESPACE::DescriptorSet>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DescriptorSet, DescriptorSetAllocator>>::type\n                       Device::allocateDescriptorSets( const VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo & allocateInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkAllocateDescriptorSets && \"Function <vkAllocateDescriptorSets> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::DescriptorSet, DescriptorSetAllocator> descriptorSets( allocateInfo.descriptorSetCount );\n    VULKAN_HPP_NAMESPACE::Result                                             result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkAllocateDescriptorSets(\n      m_device, reinterpret_cast<const VkDescriptorSetAllocateInfo *>( &allocateInfo ), reinterpret_cast<VkDescriptorSet *>( descriptorSets.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::allocateDescriptorSets\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( descriptorSets ) );\n  }\n\n  template <typename DescriptorSetAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename DescriptorSetAllocator::value_type, VULKAN_HPP_NAMESPACE::DescriptorSet>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DescriptorSet, DescriptorSetAllocator>>::type\n                       Device::allocateDescriptorSets( const VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo & allocateInfo,\n                                    DescriptorSetAllocator &                                descriptorSetAllocator,\n                                    Dispatch const &                                        d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkAllocateDescriptorSets && \"Function <vkAllocateDescriptorSets> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::DescriptorSet, DescriptorSetAllocator> descriptorSets( allocateInfo.descriptorSetCount, descriptorSetAllocator );\n    VULKAN_HPP_NAMESPACE::Result                                             result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkAllocateDescriptorSets(\n      m_device, reinterpret_cast<const VkDescriptorSetAllocateInfo *>( &allocateInfo ), reinterpret_cast<VkDescriptorSet *>( descriptorSets.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::allocateDescriptorSets\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( descriptorSets ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <\n    typename Dispatch,\n    typename DescriptorSetAllocator,\n    typename std::enable_if<std::is_same<typename DescriptorSetAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorSet, Dispatch>>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorSet, Dispatch>, DescriptorSetAllocator>>::type\n    Device::allocateDescriptorSetsUnique( const VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo & allocateInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkAllocateDescriptorSets && \"Function <vkAllocateDescriptorSets> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::DescriptorSet> descriptorSets( allocateInfo.descriptorSetCount );\n    VULKAN_HPP_NAMESPACE::Result                     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkAllocateDescriptorSets(\n      m_device, reinterpret_cast<const VkDescriptorSetAllocateInfo *>( &allocateInfo ), reinterpret_cast<VkDescriptorSet *>( descriptorSets.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::allocateDescriptorSetsUnique\" );\n    std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorSet, Dispatch>, DescriptorSetAllocator> uniqueDescriptorSets;\n    uniqueDescriptorSets.reserve( allocateInfo.descriptorSetCount );\n    detail::PoolFree<Device, DescriptorPool, Dispatch> deleter( *this, allocateInfo.descriptorPool, d );\n    for ( auto const & descriptorSet : descriptorSets )\n    {\n      uniqueDescriptorSets.push_back( UniqueHandle<DescriptorSet, Dispatch>( descriptorSet, deleter ) );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( uniqueDescriptorSets ) );\n  }\n\n  template <\n    typename Dispatch,\n    typename DescriptorSetAllocator,\n    typename std::enable_if<std::is_same<typename DescriptorSetAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorSet, Dispatch>>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorSet, Dispatch>, DescriptorSetAllocator>>::type\n    Device::allocateDescriptorSetsUnique( const VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo & allocateInfo,\n                                          DescriptorSetAllocator &                                descriptorSetAllocator,\n                                          Dispatch const &                                        d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkAllocateDescriptorSets && \"Function <vkAllocateDescriptorSets> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::DescriptorSet> descriptorSets( allocateInfo.descriptorSetCount );\n    VULKAN_HPP_NAMESPACE::Result                     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkAllocateDescriptorSets(\n      m_device, reinterpret_cast<const VkDescriptorSetAllocateInfo *>( &allocateInfo ), reinterpret_cast<VkDescriptorSet *>( descriptorSets.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::allocateDescriptorSetsUnique\" );\n    std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorSet, Dispatch>, DescriptorSetAllocator> uniqueDescriptorSets( descriptorSetAllocator );\n    uniqueDescriptorSets.reserve( allocateInfo.descriptorSetCount );\n    detail::PoolFree<Device, DescriptorPool, Dispatch> deleter( *this, allocateInfo.descriptorPool, d );\n    for ( auto const & descriptorSet : descriptorSets )\n    {\n      uniqueDescriptorSets.push_back( UniqueHandle<DescriptorSet, Dispatch>( descriptorSet, deleter ) );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( uniqueDescriptorSets ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE Result Device::freeDescriptorSets( VULKAN_HPP_NAMESPACE::DescriptorPool        descriptorPool,\n                                                       uint32_t                                    descriptorSetCount,\n                                                       const VULKAN_HPP_NAMESPACE::DescriptorSet * pDescriptorSets,\n                                                       Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkFreeDescriptorSets( static_cast<VkDevice>( m_device ),\n                                                        static_cast<VkDescriptorPool>( descriptorPool ),\n                                                        descriptorSetCount,\n                                                        reinterpret_cast<const VkDescriptorSet *>( pDescriptorSets ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::freeDescriptorSets( VULKAN_HPP_NAMESPACE::DescriptorPool                                                descriptorPool,\n                                                     VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DescriptorSet> const & descriptorSets,\n                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkFreeDescriptorSets && \"Function <vkFreeDescriptorSets> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkFreeDescriptorSets(\n      m_device, static_cast<VkDescriptorPool>( descriptorPool ), descriptorSets.size(), reinterpret_cast<const VkDescriptorSet *>( descriptorSets.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE Result( Device::free )( VULKAN_HPP_NAMESPACE::DescriptorPool        descriptorPool,\n                                            uint32_t                                    descriptorSetCount,\n                                            const VULKAN_HPP_NAMESPACE::DescriptorSet * pDescriptorSets,\n                                            Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkFreeDescriptorSets( static_cast<VkDevice>( m_device ),\n                                                        static_cast<VkDescriptorPool>( descriptorPool ),\n                                                        descriptorSetCount,\n                                                        reinterpret_cast<const VkDescriptorSet *>( pDescriptorSets ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void( Device::free )( VULKAN_HPP_NAMESPACE::DescriptorPool                                                descriptorPool,\n                                          VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DescriptorSet> const & descriptorSets,\n                                          Dispatch const &                                                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkFreeDescriptorSets && \"Function <vkFreeDescriptorSets> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkFreeDescriptorSets(\n      m_device, static_cast<VkDescriptorPool>( descriptorPool ), descriptorSets.size(), reinterpret_cast<const VkDescriptorSet *>( descriptorSets.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::updateDescriptorSets( uint32_t                                         descriptorWriteCount,\n                                                       const VULKAN_HPP_NAMESPACE::WriteDescriptorSet * pDescriptorWrites,\n                                                       uint32_t                                         descriptorCopyCount,\n                                                       const VULKAN_HPP_NAMESPACE::CopyDescriptorSet *  pDescriptorCopies,\n                                                       Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkUpdateDescriptorSets( static_cast<VkDevice>( m_device ),\n                              descriptorWriteCount,\n                              reinterpret_cast<const VkWriteDescriptorSet *>( pDescriptorWrites ),\n                              descriptorCopyCount,\n                              reinterpret_cast<const VkCopyDescriptorSet *>( pDescriptorCopies ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    Device::updateDescriptorSets( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteDescriptorSet> const & descriptorWrites,\n                                  VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CopyDescriptorSet> const &  descriptorCopies,\n                                  Dispatch const &                                                                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkUpdateDescriptorSets && \"Function <vkUpdateDescriptorSets> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkUpdateDescriptorSets( m_device,\n                              descriptorWrites.size(),\n                              reinterpret_cast<const VkWriteDescriptorSet *>( descriptorWrites.data() ),\n                              descriptorCopies.size(),\n                              reinterpret_cast<const VkCopyDescriptorSet *>( descriptorCopies.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createFramebuffer( const VULKAN_HPP_NAMESPACE::FramebufferCreateInfo * pCreateInfo,\n                                                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks *   pAllocator,\n                                                                           VULKAN_HPP_NAMESPACE::Framebuffer *                 pFramebuffer,\n                                                                           Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateFramebuffer( static_cast<VkDevice>( m_device ),\n                                                       reinterpret_cast<const VkFramebufferCreateInfo *>( pCreateInfo ),\n                                                       reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                       reinterpret_cast<VkFramebuffer *>( pFramebuffer ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::Framebuffer>::type\n                       Device::createFramebuffer( const VULKAN_HPP_NAMESPACE::FramebufferCreateInfo &       createInfo,\n                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                               Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateFramebuffer && \"Function <vkCreateFramebuffer> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Framebuffer framebuffer;\n    VULKAN_HPP_NAMESPACE::Result      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateFramebuffer( m_device,\n                             reinterpret_cast<const VkFramebufferCreateInfo *>( &createInfo ),\n                             reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                             reinterpret_cast<VkFramebuffer *>( &framebuffer ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createFramebuffer\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( framebuffer ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::Framebuffer, Dispatch>>::type\n                       Device::createFramebufferUnique( const VULKAN_HPP_NAMESPACE::FramebufferCreateInfo &       createInfo,\n                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                     Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateFramebuffer && \"Function <vkCreateFramebuffer> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Framebuffer framebuffer;\n    VULKAN_HPP_NAMESPACE::Result      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateFramebuffer( m_device,\n                             reinterpret_cast<const VkFramebufferCreateInfo *>( &createInfo ),\n                             reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                             reinterpret_cast<VkFramebuffer *>( &framebuffer ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createFramebufferUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::Framebuffer, Dispatch>( framebuffer, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyFramebuffer( VULKAN_HPP_NAMESPACE::Framebuffer                 framebuffer,\n                                                     const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                     Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyFramebuffer(\n      static_cast<VkDevice>( m_device ), static_cast<VkFramebuffer>( framebuffer ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyFramebuffer( VULKAN_HPP_NAMESPACE::Framebuffer                         framebuffer,\n                                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                     Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyFramebuffer && \"Function <vkDestroyFramebuffer> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyFramebuffer( m_device,\n                            static_cast<VkFramebuffer>( framebuffer ),\n                            reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::Framebuffer                 framebuffer,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyFramebuffer(\n      static_cast<VkDevice>( m_device ), static_cast<VkFramebuffer>( framebuffer ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::Framebuffer                         framebuffer,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyFramebuffer && \"Function <vkDestroyFramebuffer> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyFramebuffer( m_device,\n                            static_cast<VkFramebuffer>( framebuffer ),\n                            reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createRenderPass( const VULKAN_HPP_NAMESPACE::RenderPassCreateInfo * pCreateInfo,\n                                                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks *  pAllocator,\n                                                                          VULKAN_HPP_NAMESPACE::RenderPass *                 pRenderPass,\n                                                                          Dispatch const &                                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateRenderPass( static_cast<VkDevice>( m_device ),\n                                                      reinterpret_cast<const VkRenderPassCreateInfo *>( pCreateInfo ),\n                                                      reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                      reinterpret_cast<VkRenderPass *>( pRenderPass ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::RenderPass>::type\n                       Device::createRenderPass( const VULKAN_HPP_NAMESPACE::RenderPassCreateInfo &        createInfo,\n                              Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                              Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateRenderPass && \"Function <vkCreateRenderPass> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::RenderPass renderPass;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateRenderPass( m_device,\n                            reinterpret_cast<const VkRenderPassCreateInfo *>( &createInfo ),\n                            reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                            reinterpret_cast<VkRenderPass *>( &renderPass ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createRenderPass\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( renderPass ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::RenderPass, Dispatch>>::type\n                       Device::createRenderPassUnique( const VULKAN_HPP_NAMESPACE::RenderPassCreateInfo &        createInfo,\n                                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                    Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateRenderPass && \"Function <vkCreateRenderPass> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::RenderPass renderPass;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateRenderPass( m_device,\n                            reinterpret_cast<const VkRenderPassCreateInfo *>( &createInfo ),\n                            reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                            reinterpret_cast<VkRenderPass *>( &renderPass ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createRenderPassUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::RenderPass, Dispatch>( renderPass, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyRenderPass( VULKAN_HPP_NAMESPACE::RenderPass                  renderPass,\n                                                    const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                    Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyRenderPass(\n      static_cast<VkDevice>( m_device ), static_cast<VkRenderPass>( renderPass ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyRenderPass( VULKAN_HPP_NAMESPACE::RenderPass                          renderPass,\n                                                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                    Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyRenderPass && \"Function <vkDestroyRenderPass> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyRenderPass( m_device,\n                           static_cast<VkRenderPass>( renderPass ),\n                           reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::RenderPass                  renderPass,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyRenderPass(\n      static_cast<VkDevice>( m_device ), static_cast<VkRenderPass>( renderPass ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::RenderPass                          renderPass,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyRenderPass && \"Function <vkDestroyRenderPass> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyRenderPass( m_device,\n                           static_cast<VkRenderPass>( renderPass ),\n                           reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getRenderAreaGranularity( VULKAN_HPP_NAMESPACE::RenderPass renderPass,\n                                                           VULKAN_HPP_NAMESPACE::Extent2D * pGranularity,\n                                                           Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetRenderAreaGranularity( static_cast<VkDevice>( m_device ), static_cast<VkRenderPass>( renderPass ), reinterpret_cast<VkExtent2D *>( pGranularity ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Extent2D Device::getRenderAreaGranularity( VULKAN_HPP_NAMESPACE::RenderPass renderPass,\n                                                                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetRenderAreaGranularity && \"Function <vkGetRenderAreaGranularity> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Extent2D granularity;\n    d.vkGetRenderAreaGranularity( m_device, static_cast<VkRenderPass>( renderPass ), reinterpret_cast<VkExtent2D *>( &granularity ) );\n\n    return granularity;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createCommandPool( const VULKAN_HPP_NAMESPACE::CommandPoolCreateInfo * pCreateInfo,\n                                                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks *   pAllocator,\n                                                                           VULKAN_HPP_NAMESPACE::CommandPool *                 pCommandPool,\n                                                                           Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateCommandPool( static_cast<VkDevice>( m_device ),\n                                                       reinterpret_cast<const VkCommandPoolCreateInfo *>( pCreateInfo ),\n                                                       reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                       reinterpret_cast<VkCommandPool *>( pCommandPool ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::CommandPool>::type\n                       Device::createCommandPool( const VULKAN_HPP_NAMESPACE::CommandPoolCreateInfo &       createInfo,\n                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                               Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateCommandPool && \"Function <vkCreateCommandPool> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::CommandPool commandPool;\n    VULKAN_HPP_NAMESPACE::Result      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateCommandPool( m_device,\n                             reinterpret_cast<const VkCommandPoolCreateInfo *>( &createInfo ),\n                             reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                             reinterpret_cast<VkCommandPool *>( &commandPool ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createCommandPool\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( commandPool ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::CommandPool, Dispatch>>::type\n                       Device::createCommandPoolUnique( const VULKAN_HPP_NAMESPACE::CommandPoolCreateInfo &       createInfo,\n                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                     Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateCommandPool && \"Function <vkCreateCommandPool> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::CommandPool commandPool;\n    VULKAN_HPP_NAMESPACE::Result      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateCommandPool( m_device,\n                             reinterpret_cast<const VkCommandPoolCreateInfo *>( &createInfo ),\n                             reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                             reinterpret_cast<VkCommandPool *>( &commandPool ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createCommandPoolUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::CommandPool, Dispatch>( commandPool, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyCommandPool( VULKAN_HPP_NAMESPACE::CommandPool                 commandPool,\n                                                     const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                     Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyCommandPool(\n      static_cast<VkDevice>( m_device ), static_cast<VkCommandPool>( commandPool ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyCommandPool( VULKAN_HPP_NAMESPACE::CommandPool                         commandPool,\n                                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                     Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyCommandPool && \"Function <vkDestroyCommandPool> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyCommandPool( m_device,\n                            static_cast<VkCommandPool>( commandPool ),\n                            reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::CommandPool                 commandPool,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyCommandPool(\n      static_cast<VkDevice>( m_device ), static_cast<VkCommandPool>( commandPool ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::CommandPool                         commandPool,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyCommandPool && \"Function <vkDestroyCommandPool> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkDestroyCommandPool( m_device,\n                            static_cast<VkCommandPool>( commandPool ),\n                            reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::resetCommandPool( VULKAN_HPP_NAMESPACE::CommandPool           commandPool,\n                                                                          VULKAN_HPP_NAMESPACE::CommandPoolResetFlags flags,\n                                                                          Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkResetCommandPool( static_cast<VkDevice>( m_device ), static_cast<VkCommandPool>( commandPool ), static_cast<VkCommandPoolResetFlags>( flags ) ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::resetCommandPool( VULKAN_HPP_NAMESPACE::CommandPool commandPool, VULKAN_HPP_NAMESPACE::CommandPoolResetFlags flags, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkResetCommandPool && \"Function <vkResetCommandPool> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkResetCommandPool( m_device, static_cast<VkCommandPool>( commandPool ), static_cast<VkCommandPoolResetFlags>( flags ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::resetCommandPool\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::allocateCommandBuffers( const VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo * pAllocateInfo,\n                                                                                VULKAN_HPP_NAMESPACE::CommandBuffer *                   pCommandBuffers,\n                                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkAllocateCommandBuffers( static_cast<VkDevice>( m_device ),\n                                                            reinterpret_cast<const VkCommandBufferAllocateInfo *>( pAllocateInfo ),\n                                                            reinterpret_cast<VkCommandBuffer *>( pCommandBuffers ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename CommandBufferAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename CommandBufferAllocator::value_type, VULKAN_HPP_NAMESPACE::CommandBuffer>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::CommandBuffer, CommandBufferAllocator>>::type\n                       Device::allocateCommandBuffers( const VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo & allocateInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkAllocateCommandBuffers && \"Function <vkAllocateCommandBuffers> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::CommandBuffer, CommandBufferAllocator> commandBuffers( allocateInfo.commandBufferCount );\n    VULKAN_HPP_NAMESPACE::Result                                             result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkAllocateCommandBuffers(\n      m_device, reinterpret_cast<const VkCommandBufferAllocateInfo *>( &allocateInfo ), reinterpret_cast<VkCommandBuffer *>( commandBuffers.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::allocateCommandBuffers\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( commandBuffers ) );\n  }\n\n  template <typename CommandBufferAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename CommandBufferAllocator::value_type, VULKAN_HPP_NAMESPACE::CommandBuffer>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::CommandBuffer, CommandBufferAllocator>>::type\n                       Device::allocateCommandBuffers( const VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo & allocateInfo,\n                                    CommandBufferAllocator &                                commandBufferAllocator,\n                                    Dispatch const &                                        d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkAllocateCommandBuffers && \"Function <vkAllocateCommandBuffers> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::CommandBuffer, CommandBufferAllocator> commandBuffers( allocateInfo.commandBufferCount, commandBufferAllocator );\n    VULKAN_HPP_NAMESPACE::Result                                             result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkAllocateCommandBuffers(\n      m_device, reinterpret_cast<const VkCommandBufferAllocateInfo *>( &allocateInfo ), reinterpret_cast<VkCommandBuffer *>( commandBuffers.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::allocateCommandBuffers\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( commandBuffers ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <\n    typename Dispatch,\n    typename CommandBufferAllocator,\n    typename std::enable_if<std::is_same<typename CommandBufferAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::CommandBuffer, Dispatch>>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::CommandBuffer, Dispatch>, CommandBufferAllocator>>::type\n    Device::allocateCommandBuffersUnique( const VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo & allocateInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkAllocateCommandBuffers && \"Function <vkAllocateCommandBuffers> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::CommandBuffer> commandBuffers( allocateInfo.commandBufferCount );\n    VULKAN_HPP_NAMESPACE::Result                     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkAllocateCommandBuffers(\n      m_device, reinterpret_cast<const VkCommandBufferAllocateInfo *>( &allocateInfo ), reinterpret_cast<VkCommandBuffer *>( commandBuffers.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::allocateCommandBuffersUnique\" );\n    std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::CommandBuffer, Dispatch>, CommandBufferAllocator> uniqueCommandBuffers;\n    uniqueCommandBuffers.reserve( allocateInfo.commandBufferCount );\n    detail::PoolFree<Device, CommandPool, Dispatch> deleter( *this, allocateInfo.commandPool, d );\n    for ( auto const & commandBuffer : commandBuffers )\n    {\n      uniqueCommandBuffers.push_back( UniqueHandle<CommandBuffer, Dispatch>( commandBuffer, deleter ) );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( uniqueCommandBuffers ) );\n  }\n\n  template <\n    typename Dispatch,\n    typename CommandBufferAllocator,\n    typename std::enable_if<std::is_same<typename CommandBufferAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::CommandBuffer, Dispatch>>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::CommandBuffer, Dispatch>, CommandBufferAllocator>>::type\n    Device::allocateCommandBuffersUnique( const VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo & allocateInfo,\n                                          CommandBufferAllocator &                                commandBufferAllocator,\n                                          Dispatch const &                                        d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkAllocateCommandBuffers && \"Function <vkAllocateCommandBuffers> requires <VK_VERSION_1_0>\" );\n#    endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::CommandBuffer> commandBuffers( allocateInfo.commandBufferCount );\n    VULKAN_HPP_NAMESPACE::Result                     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkAllocateCommandBuffers(\n      m_device, reinterpret_cast<const VkCommandBufferAllocateInfo *>( &allocateInfo ), reinterpret_cast<VkCommandBuffer *>( commandBuffers.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::allocateCommandBuffersUnique\" );\n    std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::CommandBuffer, Dispatch>, CommandBufferAllocator> uniqueCommandBuffers( commandBufferAllocator );\n    uniqueCommandBuffers.reserve( allocateInfo.commandBufferCount );\n    detail::PoolFree<Device, CommandPool, Dispatch> deleter( *this, allocateInfo.commandPool, d );\n    for ( auto const & commandBuffer : commandBuffers )\n    {\n      uniqueCommandBuffers.push_back( UniqueHandle<CommandBuffer, Dispatch>( commandBuffer, deleter ) );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( uniqueCommandBuffers ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::freeCommandBuffers( VULKAN_HPP_NAMESPACE::CommandPool           commandPool,\n                                                     uint32_t                                    commandBufferCount,\n                                                     const VULKAN_HPP_NAMESPACE::CommandBuffer * pCommandBuffers,\n                                                     Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkFreeCommandBuffers( static_cast<VkDevice>( m_device ),\n                            static_cast<VkCommandPool>( commandPool ),\n                            commandBufferCount,\n                            reinterpret_cast<const VkCommandBuffer *>( pCommandBuffers ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::freeCommandBuffers( VULKAN_HPP_NAMESPACE::CommandPool                                                   commandPool,\n                                                     VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CommandBuffer> const & commandBuffers,\n                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkFreeCommandBuffers && \"Function <vkFreeCommandBuffers> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkFreeCommandBuffers(\n      m_device, static_cast<VkCommandPool>( commandPool ), commandBuffers.size(), reinterpret_cast<const VkCommandBuffer *>( commandBuffers.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void( Device::free )( VULKAN_HPP_NAMESPACE::CommandPool           commandPool,\n                                          uint32_t                                    commandBufferCount,\n                                          const VULKAN_HPP_NAMESPACE::CommandBuffer * pCommandBuffers,\n                                          Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkFreeCommandBuffers( static_cast<VkDevice>( m_device ),\n                            static_cast<VkCommandPool>( commandPool ),\n                            commandBufferCount,\n                            reinterpret_cast<const VkCommandBuffer *>( pCommandBuffers ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void( Device::free )( VULKAN_HPP_NAMESPACE::CommandPool                                                   commandPool,\n                                          VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CommandBuffer> const & commandBuffers,\n                                          Dispatch const &                                                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkFreeCommandBuffers && \"Function <vkFreeCommandBuffers> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkFreeCommandBuffers(\n      m_device, static_cast<VkCommandPool>( commandPool ), commandBuffers.size(), reinterpret_cast<const VkCommandBuffer *>( commandBuffers.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result CommandBuffer::begin( const VULKAN_HPP_NAMESPACE::CommandBufferBeginInfo * pBeginInfo,\n                                                                      Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkBeginCommandBuffer( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkCommandBufferBeginInfo *>( pBeginInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n                                          CommandBuffer::begin( const VULKAN_HPP_NAMESPACE::CommandBufferBeginInfo & beginInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkBeginCommandBuffer && \"Function <vkBeginCommandBuffer> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkBeginCommandBuffer( m_commandBuffer, reinterpret_cast<const VkCommandBufferBeginInfo *>( &beginInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::begin\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result CommandBuffer::end( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkEndCommandBuffer( static_cast<VkCommandBuffer>( m_commandBuffer ) ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type CommandBuffer::end( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkEndCommandBuffer && \"Function <vkEndCommandBuffer> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkEndCommandBuffer( m_commandBuffer ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::end\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result CommandBuffer::reset( VULKAN_HPP_NAMESPACE::CommandBufferResetFlags flags,\n                                                                      Dispatch const &                              d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkResetCommandBuffer( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkCommandBufferResetFlags>( flags ) ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE typename ResultValueType<void>::type CommandBuffer::reset( VULKAN_HPP_NAMESPACE::CommandBufferResetFlags flags, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkResetCommandBuffer && \"Function <vkResetCommandBuffer> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkResetCommandBuffer( m_commandBuffer, static_cast<VkCommandBufferResetFlags>( flags ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::reset\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindPipeline( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint,\n                                                      VULKAN_HPP_NAMESPACE::Pipeline          pipeline,\n                                                      Dispatch const &                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBindPipeline(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkPipelineBindPoint>( pipelineBindPoint ), static_cast<VkPipeline>( pipeline ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setViewport( uint32_t                               firstViewport,\n                                                     uint32_t                               viewportCount,\n                                                     const VULKAN_HPP_NAMESPACE::Viewport * pViewports,\n                                                     Dispatch const &                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetViewport( static_cast<VkCommandBuffer>( m_commandBuffer ), firstViewport, viewportCount, reinterpret_cast<const VkViewport *>( pViewports ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setViewport( uint32_t                                                                       firstViewport,\n                                                     VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Viewport> const & viewports,\n                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetViewport && \"Function <vkCmdSetViewport> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkCmdSetViewport( m_commandBuffer, firstViewport, viewports.size(), reinterpret_cast<const VkViewport *>( viewports.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setScissor( uint32_t                             firstScissor,\n                                                    uint32_t                             scissorCount,\n                                                    const VULKAN_HPP_NAMESPACE::Rect2D * pScissors,\n                                                    Dispatch const &                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetScissor( static_cast<VkCommandBuffer>( m_commandBuffer ), firstScissor, scissorCount, reinterpret_cast<const VkRect2D *>( pScissors ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setScissor( uint32_t                                                                     firstScissor,\n                                                    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & scissors,\n                                                    Dispatch const &                                                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetScissor && \"Function <vkCmdSetScissor> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkCmdSetScissor( m_commandBuffer, firstScissor, scissors.size(), reinterpret_cast<const VkRect2D *>( scissors.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setLineWidth( float lineWidth, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetLineWidth( static_cast<VkCommandBuffer>( m_commandBuffer ), lineWidth );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::setDepthBias( float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDepthBias( static_cast<VkCommandBuffer>( m_commandBuffer ), depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setBlendConstants( const float blendConstants[4], Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetBlendConstants( static_cast<VkCommandBuffer>( m_commandBuffer ), blendConstants );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDepthBounds( float minDepthBounds, float maxDepthBounds, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDepthBounds( static_cast<VkCommandBuffer>( m_commandBuffer ), minDepthBounds, maxDepthBounds );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::setStencilCompareMask( VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask, uint32_t compareMask, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetStencilCompareMask( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkStencilFaceFlags>( faceMask ), compareMask );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::setStencilWriteMask( VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask, uint32_t writeMask, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetStencilWriteMask( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkStencilFaceFlags>( faceMask ), writeMask );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::setStencilReference( VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask, uint32_t reference, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetStencilReference( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkStencilFaceFlags>( faceMask ), reference );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindDescriptorSets( VULKAN_HPP_NAMESPACE::PipelineBindPoint     pipelineBindPoint,\n                                                            VULKAN_HPP_NAMESPACE::PipelineLayout        layout,\n                                                            uint32_t                                    firstSet,\n                                                            uint32_t                                    descriptorSetCount,\n                                                            const VULKAN_HPP_NAMESPACE::DescriptorSet * pDescriptorSets,\n                                                            uint32_t                                    dynamicOffsetCount,\n                                                            const uint32_t *                            pDynamicOffsets,\n                                                            Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBindDescriptorSets( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                               static_cast<VkPipelineBindPoint>( pipelineBindPoint ),\n                               static_cast<VkPipelineLayout>( layout ),\n                               firstSet,\n                               descriptorSetCount,\n                               reinterpret_cast<const VkDescriptorSet *>( pDescriptorSets ),\n                               dynamicOffsetCount,\n                               pDynamicOffsets );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindDescriptorSets( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint,\n                                                            VULKAN_HPP_NAMESPACE::PipelineLayout    layout,\n                                                            uint32_t                                firstSet,\n                                                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DescriptorSet> const & descriptorSets,\n                                                            VULKAN_HPP_NAMESPACE::ArrayProxy<const uint32_t> const &                            dynamicOffsets,\n                                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBindDescriptorSets && \"Function <vkCmdBindDescriptorSets> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkCmdBindDescriptorSets( m_commandBuffer,\n                               static_cast<VkPipelineBindPoint>( pipelineBindPoint ),\n                               static_cast<VkPipelineLayout>( layout ),\n                               firstSet,\n                               descriptorSets.size(),\n                               reinterpret_cast<const VkDescriptorSet *>( descriptorSets.data() ),\n                               dynamicOffsets.size(),\n                               dynamicOffsets.data() );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindIndexBuffer( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                         VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                         VULKAN_HPP_NAMESPACE::IndexType  indexType,\n                                                         Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBindIndexBuffer( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                            static_cast<VkBuffer>( buffer ),\n                            static_cast<VkDeviceSize>( offset ),\n                            static_cast<VkIndexType>( indexType ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindVertexBuffers( uint32_t                                 firstBinding,\n                                                           uint32_t                                 bindingCount,\n                                                           const VULKAN_HPP_NAMESPACE::Buffer *     pBuffers,\n                                                           const VULKAN_HPP_NAMESPACE::DeviceSize * pOffsets,\n                                                           Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBindVertexBuffers( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                              firstBinding,\n                              bindingCount,\n                              reinterpret_cast<const VkBuffer *>( pBuffers ),\n                              reinterpret_cast<const VkDeviceSize *>( pOffsets ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindVertexBuffers( uint32_t                                                                         firstBinding,\n                                                           VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &     buffers,\n                                                           VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & offsets,\n                                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBindVertexBuffers && \"Function <vkCmdBindVertexBuffers> requires <VK_VERSION_1_0>\" );\n#  endif\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n    VULKAN_HPP_ASSERT( buffers.size() == offsets.size() );\n#  else\n    if ( buffers.size() != offsets.size() )\n    {\n      throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::bindVertexBuffers: buffers.size() != offsets.size()\" );\n    }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n    d.vkCmdBindVertexBuffers( m_commandBuffer,\n                              firstBinding,\n                              buffers.size(),\n                              reinterpret_cast<const VkBuffer *>( buffers.data() ),\n                              reinterpret_cast<const VkDeviceSize *>( offsets.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::draw(\n    uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDraw( static_cast<VkCommandBuffer>( m_commandBuffer ), vertexCount, instanceCount, firstVertex, firstInstance );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::drawIndexed( uint32_t         indexCount,\n                                                     uint32_t         instanceCount,\n                                                     uint32_t         firstIndex,\n                                                     int32_t          vertexOffset,\n                                                     uint32_t         firstInstance,\n                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDrawIndexed( static_cast<VkCommandBuffer>( m_commandBuffer ), indexCount, instanceCount, firstIndex, vertexOffset, firstInstance );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::drawIndirect( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                      VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                      uint32_t                         drawCount,\n                                                      uint32_t                         stride,\n                                                      Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDrawIndirect(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBuffer>( buffer ), static_cast<VkDeviceSize>( offset ), drawCount, stride );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::drawIndexedIndirect( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                             VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                             uint32_t                         drawCount,\n                                                             uint32_t                         stride,\n                                                             Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDrawIndexedIndirect(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBuffer>( buffer ), static_cast<VkDeviceSize>( offset ), drawCount, stride );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::dispatch( uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDispatch( static_cast<VkCommandBuffer>( m_commandBuffer ), groupCountX, groupCountY, groupCountZ );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::dispatchIndirect( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                          VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                          Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDispatchIndirect( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBuffer>( buffer ), static_cast<VkDeviceSize>( offset ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyBuffer( VULKAN_HPP_NAMESPACE::Buffer             srcBuffer,\n                                                    VULKAN_HPP_NAMESPACE::Buffer             dstBuffer,\n                                                    uint32_t                                 regionCount,\n                                                    const VULKAN_HPP_NAMESPACE::BufferCopy * pRegions,\n                                                    Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCopyBuffer( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                       static_cast<VkBuffer>( srcBuffer ),\n                       static_cast<VkBuffer>( dstBuffer ),\n                       regionCount,\n                       reinterpret_cast<const VkBufferCopy *>( pRegions ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyBuffer( VULKAN_HPP_NAMESPACE::Buffer                                                     srcBuffer,\n                                                    VULKAN_HPP_NAMESPACE::Buffer                                                     dstBuffer,\n                                                    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferCopy> const & regions,\n                                                    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdCopyBuffer && \"Function <vkCmdCopyBuffer> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkCmdCopyBuffer( m_commandBuffer,\n                       static_cast<VkBuffer>( srcBuffer ),\n                       static_cast<VkBuffer>( dstBuffer ),\n                       regions.size(),\n                       reinterpret_cast<const VkBufferCopy *>( regions.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyImage( VULKAN_HPP_NAMESPACE::Image             srcImage,\n                                                   VULKAN_HPP_NAMESPACE::ImageLayout       srcImageLayout,\n                                                   VULKAN_HPP_NAMESPACE::Image             dstImage,\n                                                   VULKAN_HPP_NAMESPACE::ImageLayout       dstImageLayout,\n                                                   uint32_t                                regionCount,\n                                                   const VULKAN_HPP_NAMESPACE::ImageCopy * pRegions,\n                                                   Dispatch const &                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCopyImage( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                      static_cast<VkImage>( srcImage ),\n                      static_cast<VkImageLayout>( srcImageLayout ),\n                      static_cast<VkImage>( dstImage ),\n                      static_cast<VkImageLayout>( dstImageLayout ),\n                      regionCount,\n                      reinterpret_cast<const VkImageCopy *>( pRegions ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyImage( VULKAN_HPP_NAMESPACE::Image                                                     srcImage,\n                                                   VULKAN_HPP_NAMESPACE::ImageLayout                                               srcImageLayout,\n                                                   VULKAN_HPP_NAMESPACE::Image                                                     dstImage,\n                                                   VULKAN_HPP_NAMESPACE::ImageLayout                                               dstImageLayout,\n                                                   VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageCopy> const & regions,\n                                                   Dispatch const &                                                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdCopyImage && \"Function <vkCmdCopyImage> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkCmdCopyImage( m_commandBuffer,\n                      static_cast<VkImage>( srcImage ),\n                      static_cast<VkImageLayout>( srcImageLayout ),\n                      static_cast<VkImage>( dstImage ),\n                      static_cast<VkImageLayout>( dstImageLayout ),\n                      regions.size(),\n                      reinterpret_cast<const VkImageCopy *>( regions.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::blitImage( VULKAN_HPP_NAMESPACE::Image             srcImage,\n                                                   VULKAN_HPP_NAMESPACE::ImageLayout       srcImageLayout,\n                                                   VULKAN_HPP_NAMESPACE::Image             dstImage,\n                                                   VULKAN_HPP_NAMESPACE::ImageLayout       dstImageLayout,\n                                                   uint32_t                                regionCount,\n                                                   const VULKAN_HPP_NAMESPACE::ImageBlit * pRegions,\n                                                   VULKAN_HPP_NAMESPACE::Filter            filter,\n                                                   Dispatch const &                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBlitImage( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                      static_cast<VkImage>( srcImage ),\n                      static_cast<VkImageLayout>( srcImageLayout ),\n                      static_cast<VkImage>( dstImage ),\n                      static_cast<VkImageLayout>( dstImageLayout ),\n                      regionCount,\n                      reinterpret_cast<const VkImageBlit *>( pRegions ),\n                      static_cast<VkFilter>( filter ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::blitImage( VULKAN_HPP_NAMESPACE::Image                                                     srcImage,\n                                                   VULKAN_HPP_NAMESPACE::ImageLayout                                               srcImageLayout,\n                                                   VULKAN_HPP_NAMESPACE::Image                                                     dstImage,\n                                                   VULKAN_HPP_NAMESPACE::ImageLayout                                               dstImageLayout,\n                                                   VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageBlit> const & regions,\n                                                   VULKAN_HPP_NAMESPACE::Filter                                                    filter,\n                                                   Dispatch const &                                                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBlitImage && \"Function <vkCmdBlitImage> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkCmdBlitImage( m_commandBuffer,\n                      static_cast<VkImage>( srcImage ),\n                      static_cast<VkImageLayout>( srcImageLayout ),\n                      static_cast<VkImage>( dstImage ),\n                      static_cast<VkImageLayout>( dstImageLayout ),\n                      regions.size(),\n                      reinterpret_cast<const VkImageBlit *>( regions.data() ),\n                      static_cast<VkFilter>( filter ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyBufferToImage( VULKAN_HPP_NAMESPACE::Buffer                  srcBuffer,\n                                                           VULKAN_HPP_NAMESPACE::Image                   dstImage,\n                                                           VULKAN_HPP_NAMESPACE::ImageLayout             dstImageLayout,\n                                                           uint32_t                                      regionCount,\n                                                           const VULKAN_HPP_NAMESPACE::BufferImageCopy * pRegions,\n                                                           Dispatch const &                              d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCopyBufferToImage( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                              static_cast<VkBuffer>( srcBuffer ),\n                              static_cast<VkImage>( dstImage ),\n                              static_cast<VkImageLayout>( dstImageLayout ),\n                              regionCount,\n                              reinterpret_cast<const VkBufferImageCopy *>( pRegions ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyBufferToImage( VULKAN_HPP_NAMESPACE::Buffer                                                          srcBuffer,\n                                                           VULKAN_HPP_NAMESPACE::Image                                                           dstImage,\n                                                           VULKAN_HPP_NAMESPACE::ImageLayout                                                     dstImageLayout,\n                                                           VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferImageCopy> const & regions,\n                                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdCopyBufferToImage && \"Function <vkCmdCopyBufferToImage> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkCmdCopyBufferToImage( m_commandBuffer,\n                              static_cast<VkBuffer>( srcBuffer ),\n                              static_cast<VkImage>( dstImage ),\n                              static_cast<VkImageLayout>( dstImageLayout ),\n                              regions.size(),\n                              reinterpret_cast<const VkBufferImageCopy *>( regions.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyImageToBuffer( VULKAN_HPP_NAMESPACE::Image                   srcImage,\n                                                           VULKAN_HPP_NAMESPACE::ImageLayout             srcImageLayout,\n                                                           VULKAN_HPP_NAMESPACE::Buffer                  dstBuffer,\n                                                           uint32_t                                      regionCount,\n                                                           const VULKAN_HPP_NAMESPACE::BufferImageCopy * pRegions,\n                                                           Dispatch const &                              d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCopyImageToBuffer( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                              static_cast<VkImage>( srcImage ),\n                              static_cast<VkImageLayout>( srcImageLayout ),\n                              static_cast<VkBuffer>( dstBuffer ),\n                              regionCount,\n                              reinterpret_cast<const VkBufferImageCopy *>( pRegions ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyImageToBuffer( VULKAN_HPP_NAMESPACE::Image                                                           srcImage,\n                                                           VULKAN_HPP_NAMESPACE::ImageLayout                                                     srcImageLayout,\n                                                           VULKAN_HPP_NAMESPACE::Buffer                                                          dstBuffer,\n                                                           VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferImageCopy> const & regions,\n                                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdCopyImageToBuffer && \"Function <vkCmdCopyImageToBuffer> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkCmdCopyImageToBuffer( m_commandBuffer,\n                              static_cast<VkImage>( srcImage ),\n                              static_cast<VkImageLayout>( srcImageLayout ),\n                              static_cast<VkBuffer>( dstBuffer ),\n                              regions.size(),\n                              reinterpret_cast<const VkBufferImageCopy *>( regions.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::updateBuffer( VULKAN_HPP_NAMESPACE::Buffer     dstBuffer,\n                                                      VULKAN_HPP_NAMESPACE::DeviceSize dstOffset,\n                                                      VULKAN_HPP_NAMESPACE::DeviceSize dataSize,\n                                                      const void *                     pData,\n                                                      Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdUpdateBuffer( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                         static_cast<VkBuffer>( dstBuffer ),\n                         static_cast<VkDeviceSize>( dstOffset ),\n                         static_cast<VkDeviceSize>( dataSize ),\n                         pData );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename DataType, typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::updateBuffer( VULKAN_HPP_NAMESPACE::Buffer                             dstBuffer,\n                                                      VULKAN_HPP_NAMESPACE::DeviceSize                         dstOffset,\n                                                      VULKAN_HPP_NAMESPACE::ArrayProxy<const DataType> const & data,\n                                                      Dispatch const &                                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdUpdateBuffer && \"Function <vkCmdUpdateBuffer> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkCmdUpdateBuffer( m_commandBuffer,\n                         static_cast<VkBuffer>( dstBuffer ),\n                         static_cast<VkDeviceSize>( dstOffset ),\n                         data.size() * sizeof( DataType ),\n                         reinterpret_cast<const void *>( data.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::fillBuffer( VULKAN_HPP_NAMESPACE::Buffer     dstBuffer,\n                                                    VULKAN_HPP_NAMESPACE::DeviceSize dstOffset,\n                                                    VULKAN_HPP_NAMESPACE::DeviceSize size,\n                                                    uint32_t                         data,\n                                                    Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdFillBuffer( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                       static_cast<VkBuffer>( dstBuffer ),\n                       static_cast<VkDeviceSize>( dstOffset ),\n                       static_cast<VkDeviceSize>( size ),\n                       data );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::clearColorImage( VULKAN_HPP_NAMESPACE::Image                         image,\n                                                         VULKAN_HPP_NAMESPACE::ImageLayout                   imageLayout,\n                                                         const VULKAN_HPP_NAMESPACE::ClearColorValue *       pColor,\n                                                         uint32_t                                            rangeCount,\n                                                         const VULKAN_HPP_NAMESPACE::ImageSubresourceRange * pRanges,\n                                                         Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdClearColorImage( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                            static_cast<VkImage>( image ),\n                            static_cast<VkImageLayout>( imageLayout ),\n                            reinterpret_cast<const VkClearColorValue *>( pColor ),\n                            rangeCount,\n                            reinterpret_cast<const VkImageSubresourceRange *>( pRanges ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::clearColorImage( VULKAN_HPP_NAMESPACE::Image                   image,\n                                                         VULKAN_HPP_NAMESPACE::ImageLayout             imageLayout,\n                                                         const VULKAN_HPP_NAMESPACE::ClearColorValue & color,\n                                                         VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageSubresourceRange> const & ranges,\n                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdClearColorImage && \"Function <vkCmdClearColorImage> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkCmdClearColorImage( m_commandBuffer,\n                            static_cast<VkImage>( image ),\n                            static_cast<VkImageLayout>( imageLayout ),\n                            reinterpret_cast<const VkClearColorValue *>( &color ),\n                            ranges.size(),\n                            reinterpret_cast<const VkImageSubresourceRange *>( ranges.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::clearDepthStencilImage( VULKAN_HPP_NAMESPACE::Image                          image,\n                                                                VULKAN_HPP_NAMESPACE::ImageLayout                    imageLayout,\n                                                                const VULKAN_HPP_NAMESPACE::ClearDepthStencilValue * pDepthStencil,\n                                                                uint32_t                                             rangeCount,\n                                                                const VULKAN_HPP_NAMESPACE::ImageSubresourceRange *  pRanges,\n                                                                Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdClearDepthStencilImage( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                   static_cast<VkImage>( image ),\n                                   static_cast<VkImageLayout>( imageLayout ),\n                                   reinterpret_cast<const VkClearDepthStencilValue *>( pDepthStencil ),\n                                   rangeCount,\n                                   reinterpret_cast<const VkImageSubresourceRange *>( pRanges ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::clearDepthStencilImage( VULKAN_HPP_NAMESPACE::Image                                                                 image,\n                                           VULKAN_HPP_NAMESPACE::ImageLayout                                                           imageLayout,\n                                           const VULKAN_HPP_NAMESPACE::ClearDepthStencilValue &                                        depthStencil,\n                                           VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageSubresourceRange> const & ranges,\n                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdClearDepthStencilImage && \"Function <vkCmdClearDepthStencilImage> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkCmdClearDepthStencilImage( m_commandBuffer,\n                                   static_cast<VkImage>( image ),\n                                   static_cast<VkImageLayout>( imageLayout ),\n                                   reinterpret_cast<const VkClearDepthStencilValue *>( &depthStencil ),\n                                   ranges.size(),\n                                   reinterpret_cast<const VkImageSubresourceRange *>( ranges.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::clearAttachments( uint32_t                                      attachmentCount,\n                                                          const VULKAN_HPP_NAMESPACE::ClearAttachment * pAttachments,\n                                                          uint32_t                                      rectCount,\n                                                          const VULKAN_HPP_NAMESPACE::ClearRect *       pRects,\n                                                          Dispatch const &                              d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdClearAttachments( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                             attachmentCount,\n                             reinterpret_cast<const VkClearAttachment *>( pAttachments ),\n                             rectCount,\n                             reinterpret_cast<const VkClearRect *>( pRects ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::clearAttachments( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ClearAttachment> const & attachments,\n                                                          VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ClearRect> const &       rects,\n                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdClearAttachments && \"Function <vkCmdClearAttachments> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkCmdClearAttachments( m_commandBuffer,\n                             attachments.size(),\n                             reinterpret_cast<const VkClearAttachment *>( attachments.data() ),\n                             rects.size(),\n                             reinterpret_cast<const VkClearRect *>( rects.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::resolveImage( VULKAN_HPP_NAMESPACE::Image                srcImage,\n                                                      VULKAN_HPP_NAMESPACE::ImageLayout          srcImageLayout,\n                                                      VULKAN_HPP_NAMESPACE::Image                dstImage,\n                                                      VULKAN_HPP_NAMESPACE::ImageLayout          dstImageLayout,\n                                                      uint32_t                                   regionCount,\n                                                      const VULKAN_HPP_NAMESPACE::ImageResolve * pRegions,\n                                                      Dispatch const &                           d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdResolveImage( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                         static_cast<VkImage>( srcImage ),\n                         static_cast<VkImageLayout>( srcImageLayout ),\n                         static_cast<VkImage>( dstImage ),\n                         static_cast<VkImageLayout>( dstImageLayout ),\n                         regionCount,\n                         reinterpret_cast<const VkImageResolve *>( pRegions ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::resolveImage( VULKAN_HPP_NAMESPACE::Image                                                        srcImage,\n                                                      VULKAN_HPP_NAMESPACE::ImageLayout                                                  srcImageLayout,\n                                                      VULKAN_HPP_NAMESPACE::Image                                                        dstImage,\n                                                      VULKAN_HPP_NAMESPACE::ImageLayout                                                  dstImageLayout,\n                                                      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageResolve> const & regions,\n                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdResolveImage && \"Function <vkCmdResolveImage> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkCmdResolveImage( m_commandBuffer,\n                         static_cast<VkImage>( srcImage ),\n                         static_cast<VkImageLayout>( srcImageLayout ),\n                         static_cast<VkImage>( dstImage ),\n                         static_cast<VkImageLayout>( dstImageLayout ),\n                         regions.size(),\n                         reinterpret_cast<const VkImageResolve *>( regions.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setEvent( VULKAN_HPP_NAMESPACE::Event              event,\n                                                  VULKAN_HPP_NAMESPACE::PipelineStageFlags stageMask,\n                                                  Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetEvent( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkEvent>( event ), static_cast<VkPipelineStageFlags>( stageMask ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::resetEvent( VULKAN_HPP_NAMESPACE::Event              event,\n                                                    VULKAN_HPP_NAMESPACE::PipelineStageFlags stageMask,\n                                                    Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdResetEvent( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkEvent>( event ), static_cast<VkPipelineStageFlags>( stageMask ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::waitEvents( uint32_t                                          eventCount,\n                                                    const VULKAN_HPP_NAMESPACE::Event *               pEvents,\n                                                    VULKAN_HPP_NAMESPACE::PipelineStageFlags          srcStageMask,\n                                                    VULKAN_HPP_NAMESPACE::PipelineStageFlags          dstStageMask,\n                                                    uint32_t                                          memoryBarrierCount,\n                                                    const VULKAN_HPP_NAMESPACE::MemoryBarrier *       pMemoryBarriers,\n                                                    uint32_t                                          bufferMemoryBarrierCount,\n                                                    const VULKAN_HPP_NAMESPACE::BufferMemoryBarrier * pBufferMemoryBarriers,\n                                                    uint32_t                                          imageMemoryBarrierCount,\n                                                    const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier *  pImageMemoryBarriers,\n                                                    Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdWaitEvents( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                       eventCount,\n                       reinterpret_cast<const VkEvent *>( pEvents ),\n                       static_cast<VkPipelineStageFlags>( srcStageMask ),\n                       static_cast<VkPipelineStageFlags>( dstStageMask ),\n                       memoryBarrierCount,\n                       reinterpret_cast<const VkMemoryBarrier *>( pMemoryBarriers ),\n                       bufferMemoryBarrierCount,\n                       reinterpret_cast<const VkBufferMemoryBarrier *>( pBufferMemoryBarriers ),\n                       imageMemoryBarrierCount,\n                       reinterpret_cast<const VkImageMemoryBarrier *>( pImageMemoryBarriers ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::waitEvents( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Event> const &               events,\n                               VULKAN_HPP_NAMESPACE::PipelineStageFlags                                                  srcStageMask,\n                               VULKAN_HPP_NAMESPACE::PipelineStageFlags                                                  dstStageMask,\n                               VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MemoryBarrier> const &       memoryBarriers,\n                               VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferMemoryBarrier> const & bufferMemoryBarriers,\n                               VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier> const &  imageMemoryBarriers,\n                               Dispatch const &                                                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdWaitEvents && \"Function <vkCmdWaitEvents> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkCmdWaitEvents( m_commandBuffer,\n                       events.size(),\n                       reinterpret_cast<const VkEvent *>( events.data() ),\n                       static_cast<VkPipelineStageFlags>( srcStageMask ),\n                       static_cast<VkPipelineStageFlags>( dstStageMask ),\n                       memoryBarriers.size(),\n                       reinterpret_cast<const VkMemoryBarrier *>( memoryBarriers.data() ),\n                       bufferMemoryBarriers.size(),\n                       reinterpret_cast<const VkBufferMemoryBarrier *>( bufferMemoryBarriers.data() ),\n                       imageMemoryBarriers.size(),\n                       reinterpret_cast<const VkImageMemoryBarrier *>( imageMemoryBarriers.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::pipelineBarrier( VULKAN_HPP_NAMESPACE::PipelineStageFlags          srcStageMask,\n                                                         VULKAN_HPP_NAMESPACE::PipelineStageFlags          dstStageMask,\n                                                         VULKAN_HPP_NAMESPACE::DependencyFlags             dependencyFlags,\n                                                         uint32_t                                          memoryBarrierCount,\n                                                         const VULKAN_HPP_NAMESPACE::MemoryBarrier *       pMemoryBarriers,\n                                                         uint32_t                                          bufferMemoryBarrierCount,\n                                                         const VULKAN_HPP_NAMESPACE::BufferMemoryBarrier * pBufferMemoryBarriers,\n                                                         uint32_t                                          imageMemoryBarrierCount,\n                                                         const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier *  pImageMemoryBarriers,\n                                                         Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdPipelineBarrier( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                            static_cast<VkPipelineStageFlags>( srcStageMask ),\n                            static_cast<VkPipelineStageFlags>( dstStageMask ),\n                            static_cast<VkDependencyFlags>( dependencyFlags ),\n                            memoryBarrierCount,\n                            reinterpret_cast<const VkMemoryBarrier *>( pMemoryBarriers ),\n                            bufferMemoryBarrierCount,\n                            reinterpret_cast<const VkBufferMemoryBarrier *>( pBufferMemoryBarriers ),\n                            imageMemoryBarrierCount,\n                            reinterpret_cast<const VkImageMemoryBarrier *>( pImageMemoryBarriers ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::pipelineBarrier( VULKAN_HPP_NAMESPACE::PipelineStageFlags                                                  srcStageMask,\n                                    VULKAN_HPP_NAMESPACE::PipelineStageFlags                                                  dstStageMask,\n                                    VULKAN_HPP_NAMESPACE::DependencyFlags                                                     dependencyFlags,\n                                    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MemoryBarrier> const &       memoryBarriers,\n                                    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferMemoryBarrier> const & bufferMemoryBarriers,\n                                    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier> const &  imageMemoryBarriers,\n                                    Dispatch const &                                                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdPipelineBarrier && \"Function <vkCmdPipelineBarrier> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkCmdPipelineBarrier( m_commandBuffer,\n                            static_cast<VkPipelineStageFlags>( srcStageMask ),\n                            static_cast<VkPipelineStageFlags>( dstStageMask ),\n                            static_cast<VkDependencyFlags>( dependencyFlags ),\n                            memoryBarriers.size(),\n                            reinterpret_cast<const VkMemoryBarrier *>( memoryBarriers.data() ),\n                            bufferMemoryBarriers.size(),\n                            reinterpret_cast<const VkBufferMemoryBarrier *>( bufferMemoryBarriers.data() ),\n                            imageMemoryBarriers.size(),\n                            reinterpret_cast<const VkImageMemoryBarrier *>( imageMemoryBarriers.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::beginQuery( VULKAN_HPP_NAMESPACE::QueryPool         queryPool,\n                                                    uint32_t                                query,\n                                                    VULKAN_HPP_NAMESPACE::QueryControlFlags flags,\n                                                    Dispatch const &                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBeginQuery(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkQueryPool>( queryPool ), query, static_cast<VkQueryControlFlags>( flags ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::endQuery( VULKAN_HPP_NAMESPACE::QueryPool queryPool, uint32_t query, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdEndQuery( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkQueryPool>( queryPool ), query );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::resetQueryPool( VULKAN_HPP_NAMESPACE::QueryPool queryPool,\n                                                        uint32_t                        firstQuery,\n                                                        uint32_t                        queryCount,\n                                                        Dispatch const &                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdResetQueryPool( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkQueryPool>( queryPool ), firstQuery, queryCount );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::writeTimestamp( VULKAN_HPP_NAMESPACE::PipelineStageFlagBits pipelineStage,\n                                                        VULKAN_HPP_NAMESPACE::QueryPool             queryPool,\n                                                        uint32_t                                    query,\n                                                        Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdWriteTimestamp(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkPipelineStageFlagBits>( pipelineStage ), static_cast<VkQueryPool>( queryPool ), query );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyQueryPoolResults( VULKAN_HPP_NAMESPACE::QueryPool        queryPool,\n                                                              uint32_t                               firstQuery,\n                                                              uint32_t                               queryCount,\n                                                              VULKAN_HPP_NAMESPACE::Buffer           dstBuffer,\n                                                              VULKAN_HPP_NAMESPACE::DeviceSize       dstOffset,\n                                                              VULKAN_HPP_NAMESPACE::DeviceSize       stride,\n                                                              VULKAN_HPP_NAMESPACE::QueryResultFlags flags,\n                                                              Dispatch const &                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCopyQueryPoolResults( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                 static_cast<VkQueryPool>( queryPool ),\n                                 firstQuery,\n                                 queryCount,\n                                 static_cast<VkBuffer>( dstBuffer ),\n                                 static_cast<VkDeviceSize>( dstOffset ),\n                                 static_cast<VkDeviceSize>( stride ),\n                                 static_cast<VkQueryResultFlags>( flags ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::pushConstants( VULKAN_HPP_NAMESPACE::PipelineLayout   layout,\n                                                       VULKAN_HPP_NAMESPACE::ShaderStageFlags stageFlags,\n                                                       uint32_t                               offset,\n                                                       uint32_t                               size,\n                                                       const void *                           pValues,\n                                                       Dispatch const &                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdPushConstants( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                          static_cast<VkPipelineLayout>( layout ),\n                          static_cast<VkShaderStageFlags>( stageFlags ),\n                          offset,\n                          size,\n                          pValues );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename ValuesType, typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::pushConstants( VULKAN_HPP_NAMESPACE::PipelineLayout                       layout,\n                                                       VULKAN_HPP_NAMESPACE::ShaderStageFlags                     stageFlags,\n                                                       uint32_t                                                   offset,\n                                                       VULKAN_HPP_NAMESPACE::ArrayProxy<const ValuesType> const & values,\n                                                       Dispatch const &                                           d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdPushConstants && \"Function <vkCmdPushConstants> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkCmdPushConstants( m_commandBuffer,\n                          static_cast<VkPipelineLayout>( layout ),\n                          static_cast<VkShaderStageFlags>( stageFlags ),\n                          offset,\n                          values.size() * sizeof( ValuesType ),\n                          reinterpret_cast<const void *>( values.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::beginRenderPass( const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo * pRenderPassBegin,\n                                                         VULKAN_HPP_NAMESPACE::SubpassContents             contents,\n                                                         Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBeginRenderPass( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                            reinterpret_cast<const VkRenderPassBeginInfo *>( pRenderPassBegin ),\n                            static_cast<VkSubpassContents>( contents ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::beginRenderPass( const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo & renderPassBegin,\n                                                         VULKAN_HPP_NAMESPACE::SubpassContents             contents,\n                                                         Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBeginRenderPass && \"Function <vkCmdBeginRenderPass> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkCmdBeginRenderPass( m_commandBuffer, reinterpret_cast<const VkRenderPassBeginInfo *>( &renderPassBegin ), static_cast<VkSubpassContents>( contents ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::nextSubpass( VULKAN_HPP_NAMESPACE::SubpassContents contents, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdNextSubpass( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkSubpassContents>( contents ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::endRenderPass( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdEndRenderPass( static_cast<VkCommandBuffer>( m_commandBuffer ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::executeCommands( uint32_t                                    commandBufferCount,\n                                                         const VULKAN_HPP_NAMESPACE::CommandBuffer * pCommandBuffers,\n                                                         Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdExecuteCommands( static_cast<VkCommandBuffer>( m_commandBuffer ), commandBufferCount, reinterpret_cast<const VkCommandBuffer *>( pCommandBuffers ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::executeCommands( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CommandBuffer> const & commandBuffers,\n                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdExecuteCommands && \"Function <vkCmdExecuteCommands> requires <VK_VERSION_1_0>\" );\n#  endif\n\n    d.vkCmdExecuteCommands( m_commandBuffer, commandBuffers.size(), reinterpret_cast<const VkCommandBuffer *>( commandBuffers.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_VERSION_1_1 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result enumerateInstanceVersion( uint32_t * pApiVersion, Dispatch const & d ) VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkEnumerateInstanceVersion( pApiVersion ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<uint32_t>::type enumerateInstanceVersion( Dispatch const & d )\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkEnumerateInstanceVersion && \"Function <vkEnumerateInstanceVersion> requires <VK_VERSION_1_1>\" );\n#  endif\n\n    uint32_t                     apiVersion;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkEnumerateInstanceVersion( &apiVersion ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::enumerateInstanceVersion\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( apiVersion ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::bindBufferMemory2( uint32_t                                           bindInfoCount,\n                                                                           const VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo * pBindInfos,\n                                                                           Dispatch const &                                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkBindBufferMemory2( static_cast<VkDevice>( m_device ), bindInfoCount, reinterpret_cast<const VkBindBufferMemoryInfo *>( pBindInfos ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::bindBufferMemory2( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo> const & bindInfos, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkBindBufferMemory2 && \"Function <vkBindBufferMemory2> requires <VK_KHR_bind_memory2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkBindBufferMemory2( m_device, bindInfos.size(), reinterpret_cast<const VkBindBufferMemoryInfo *>( bindInfos.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::bindBufferMemory2\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::bindImageMemory2( uint32_t                                          bindInfoCount,\n                                                                          const VULKAN_HPP_NAMESPACE::BindImageMemoryInfo * pBindInfos,\n                                                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkBindImageMemory2( static_cast<VkDevice>( m_device ), bindInfoCount, reinterpret_cast<const VkBindImageMemoryInfo *>( pBindInfos ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::bindImageMemory2( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindImageMemoryInfo> const & bindInfos, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkBindImageMemory2 && \"Function <vkBindImageMemory2> requires <VK_KHR_bind_memory2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkBindImageMemory2( m_device, bindInfos.size(), reinterpret_cast<const VkBindImageMemoryInfo *>( bindInfos.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::bindImageMemory2\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getGroupPeerMemoryFeatures( uint32_t                                       heapIndex,\n                                                             uint32_t                                       localDeviceIndex,\n                                                             uint32_t                                       remoteDeviceIndex,\n                                                             VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags * pPeerMemoryFeatures,\n                                                             Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetDeviceGroupPeerMemoryFeatures(\n      static_cast<VkDevice>( m_device ), heapIndex, localDeviceIndex, remoteDeviceIndex, reinterpret_cast<VkPeerMemoryFeatureFlags *>( pPeerMemoryFeatures ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags Device::getGroupPeerMemoryFeatures(\n    uint32_t heapIndex, uint32_t localDeviceIndex, uint32_t remoteDeviceIndex, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceGroupPeerMemoryFeatures &&\n                       \"Function <vkGetDeviceGroupPeerMemoryFeatures> requires <VK_KHR_device_group> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags peerMemoryFeatures;\n    d.vkGetDeviceGroupPeerMemoryFeatures(\n      m_device, heapIndex, localDeviceIndex, remoteDeviceIndex, reinterpret_cast<VkPeerMemoryFeatureFlags *>( &peerMemoryFeatures ) );\n\n    return peerMemoryFeatures;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDeviceMask( uint32_t deviceMask, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDeviceMask( static_cast<VkCommandBuffer>( m_commandBuffer ), deviceMask );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::dispatchBase( uint32_t         baseGroupX,\n                                                      uint32_t         baseGroupY,\n                                                      uint32_t         baseGroupZ,\n                                                      uint32_t         groupCountX,\n                                                      uint32_t         groupCountY,\n                                                      uint32_t         groupCountZ,\n                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDispatchBase( static_cast<VkCommandBuffer>( m_commandBuffer ), baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Instance::enumeratePhysicalDeviceGroups( uint32_t *                                            pPhysicalDeviceGroupCount,\n                                             VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties * pPhysicalDeviceGroupProperties,\n                                             Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkEnumeratePhysicalDeviceGroups( static_cast<VkInstance>( m_instance ),\n                                                                   pPhysicalDeviceGroupCount,\n                                                                   reinterpret_cast<VkPhysicalDeviceGroupProperties *>( pPhysicalDeviceGroupProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename PhysicalDeviceGroupPropertiesAllocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename PhysicalDeviceGroupPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties, PhysicalDeviceGroupPropertiesAllocator>>::type\n    Instance::enumeratePhysicalDeviceGroups( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkEnumeratePhysicalDeviceGroups &&\n                       \"Function <vkEnumeratePhysicalDeviceGroups> requires <VK_KHR_device_group_creation> or <VK_VERSION_1_1>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties, PhysicalDeviceGroupPropertiesAllocator> physicalDeviceGroupProperties;\n    uint32_t                                                                                                 physicalDeviceGroupCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                             result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkEnumeratePhysicalDeviceGroups( m_instance, &physicalDeviceGroupCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && physicalDeviceGroupCount )\n      {\n        physicalDeviceGroupProperties.resize( physicalDeviceGroupCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkEnumeratePhysicalDeviceGroups(\n          m_instance, &physicalDeviceGroupCount, reinterpret_cast<VkPhysicalDeviceGroupProperties *>( physicalDeviceGroupProperties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::enumeratePhysicalDeviceGroups\" );\n    VULKAN_HPP_ASSERT( physicalDeviceGroupCount <= physicalDeviceGroupProperties.size() );\n    if ( physicalDeviceGroupCount < physicalDeviceGroupProperties.size() )\n    {\n      physicalDeviceGroupProperties.resize( physicalDeviceGroupCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( physicalDeviceGroupProperties ) );\n  }\n\n  template <typename PhysicalDeviceGroupPropertiesAllocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename PhysicalDeviceGroupPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties, PhysicalDeviceGroupPropertiesAllocator>>::type\n    Instance::enumeratePhysicalDeviceGroups( PhysicalDeviceGroupPropertiesAllocator & physicalDeviceGroupPropertiesAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkEnumeratePhysicalDeviceGroups &&\n                       \"Function <vkEnumeratePhysicalDeviceGroups> requires <VK_KHR_device_group_creation> or <VK_VERSION_1_1>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties, PhysicalDeviceGroupPropertiesAllocator> physicalDeviceGroupProperties(\n      physicalDeviceGroupPropertiesAllocator );\n    uint32_t                     physicalDeviceGroupCount;\n    VULKAN_HPP_NAMESPACE::Result result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkEnumeratePhysicalDeviceGroups( m_instance, &physicalDeviceGroupCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && physicalDeviceGroupCount )\n      {\n        physicalDeviceGroupProperties.resize( physicalDeviceGroupCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkEnumeratePhysicalDeviceGroups(\n          m_instance, &physicalDeviceGroupCount, reinterpret_cast<VkPhysicalDeviceGroupProperties *>( physicalDeviceGroupProperties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::enumeratePhysicalDeviceGroups\" );\n    VULKAN_HPP_ASSERT( physicalDeviceGroupCount <= physicalDeviceGroupProperties.size() );\n    if ( physicalDeviceGroupCount < physicalDeviceGroupProperties.size() )\n    {\n      physicalDeviceGroupProperties.resize( physicalDeviceGroupCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( physicalDeviceGroupProperties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getImageMemoryRequirements2( const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 * pInfo,\n                                                              VULKAN_HPP_NAMESPACE::MemoryRequirements2 *                pMemoryRequirements,\n                                                              Dispatch const &                                           d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetImageMemoryRequirements2( static_cast<VkDevice>( m_device ),\n                                     reinterpret_cast<const VkImageMemoryRequirementsInfo2 *>( pInfo ),\n                                     reinterpret_cast<VkMemoryRequirements2 *>( pMemoryRequirements ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2\n    Device::getImageMemoryRequirements2( const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetImageMemoryRequirements2 &&\n                       \"Function <vkGetImageMemoryRequirements2> requires <VK_KHR_get_memory_requirements2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;\n    d.vkGetImageMemoryRequirements2(\n      m_device, reinterpret_cast<const VkImageMemoryRequirementsInfo2 *>( &info ), reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n    return memoryRequirements;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n    Device::getImageMemoryRequirements2( const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetImageMemoryRequirements2 &&\n                       \"Function <vkGetImageMemoryRequirements2> requires <VK_KHR_get_memory_requirements2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2 &      memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();\n    d.vkGetImageMemoryRequirements2(\n      m_device, reinterpret_cast<const VkImageMemoryRequirementsInfo2 *>( &info ), reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getBufferMemoryRequirements2( const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 * pInfo,\n                                                               VULKAN_HPP_NAMESPACE::MemoryRequirements2 *                 pMemoryRequirements,\n                                                               Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetBufferMemoryRequirements2( static_cast<VkDevice>( m_device ),\n                                      reinterpret_cast<const VkBufferMemoryRequirementsInfo2 *>( pInfo ),\n                                      reinterpret_cast<VkMemoryRequirements2 *>( pMemoryRequirements ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2\n    Device::getBufferMemoryRequirements2( const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetBufferMemoryRequirements2 &&\n                       \"Function <vkGetBufferMemoryRequirements2> requires <VK_KHR_get_memory_requirements2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;\n    d.vkGetBufferMemoryRequirements2(\n      m_device, reinterpret_cast<const VkBufferMemoryRequirementsInfo2 *>( &info ), reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n    return memoryRequirements;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n    Device::getBufferMemoryRequirements2( const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetBufferMemoryRequirements2 &&\n                       \"Function <vkGetBufferMemoryRequirements2> requires <VK_KHR_get_memory_requirements2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2 &      memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();\n    d.vkGetBufferMemoryRequirements2(\n      m_device, reinterpret_cast<const VkBufferMemoryRequirementsInfo2 *>( &info ), reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getImageSparseMemoryRequirements2( const VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 * pInfo,\n                                                                    uint32_t *                                             pSparseMemoryRequirementCount,\n                                                                    VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2 * pSparseMemoryRequirements,\n                                                                    Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetImageSparseMemoryRequirements2( static_cast<VkDevice>( m_device ),\n                                           reinterpret_cast<const VkImageSparseMemoryRequirementsInfo2 *>( pInfo ),\n                                           pSparseMemoryRequirementCount,\n                                           reinterpret_cast<VkSparseImageMemoryRequirements2 *>( pSparseMemoryRequirements ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename SparseImageMemoryRequirements2Allocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename SparseImageMemoryRequirements2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator>\n    Device::getImageSparseMemoryRequirements2( const VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 & info, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetImageSparseMemoryRequirements2 &&\n                       \"Function <vkGetImageSparseMemoryRequirements2> requires <VK_KHR_get_memory_requirements2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator> sparseMemoryRequirements;\n    uint32_t                                                                                                   sparseMemoryRequirementCount;\n    d.vkGetImageSparseMemoryRequirements2(\n      m_device, reinterpret_cast<const VkImageSparseMemoryRequirementsInfo2 *>( &info ), &sparseMemoryRequirementCount, nullptr );\n    sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n    d.vkGetImageSparseMemoryRequirements2( m_device,\n                                           reinterpret_cast<const VkImageSparseMemoryRequirementsInfo2 *>( &info ),\n                                           &sparseMemoryRequirementCount,\n                                           reinterpret_cast<VkSparseImageMemoryRequirements2 *>( sparseMemoryRequirements.data() ) );\n\n    VULKAN_HPP_ASSERT( sparseMemoryRequirementCount <= sparseMemoryRequirements.size() );\n    if ( sparseMemoryRequirementCount < sparseMemoryRequirements.size() )\n    {\n      sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n    }\n    return sparseMemoryRequirements;\n  }\n\n  template <typename SparseImageMemoryRequirements2Allocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename SparseImageMemoryRequirements2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator>\n                                         Device::getImageSparseMemoryRequirements2( const VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 & info,\n                                               SparseImageMemoryRequirements2Allocator &                        sparseImageMemoryRequirements2Allocator,\n                                               Dispatch const &                                                 d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetImageSparseMemoryRequirements2 &&\n                       \"Function <vkGetImageSparseMemoryRequirements2> requires <VK_KHR_get_memory_requirements2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator> sparseMemoryRequirements(\n      sparseImageMemoryRequirements2Allocator );\n    uint32_t sparseMemoryRequirementCount;\n    d.vkGetImageSparseMemoryRequirements2(\n      m_device, reinterpret_cast<const VkImageSparseMemoryRequirementsInfo2 *>( &info ), &sparseMemoryRequirementCount, nullptr );\n    sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n    d.vkGetImageSparseMemoryRequirements2( m_device,\n                                           reinterpret_cast<const VkImageSparseMemoryRequirementsInfo2 *>( &info ),\n                                           &sparseMemoryRequirementCount,\n                                           reinterpret_cast<VkSparseImageMemoryRequirements2 *>( sparseMemoryRequirements.data() ) );\n\n    VULKAN_HPP_ASSERT( sparseMemoryRequirementCount <= sparseMemoryRequirements.size() );\n    if ( sparseMemoryRequirementCount < sparseMemoryRequirements.size() )\n    {\n      sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n    }\n    return sparseMemoryRequirements;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::getFeatures2( VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 * pFeatures, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceFeatures2( static_cast<VkPhysicalDevice>( m_physicalDevice ), reinterpret_cast<VkPhysicalDeviceFeatures2 *>( pFeatures ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2\n                                         PhysicalDevice::getFeatures2( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceFeatures2 &&\n                       \"Function <vkGetPhysicalDeviceFeatures2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 features;\n    d.vkGetPhysicalDeviceFeatures2( m_physicalDevice, reinterpret_cast<VkPhysicalDeviceFeatures2 *>( &features ) );\n\n    return features;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                                         PhysicalDevice::getFeatures2( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceFeatures2 &&\n                       \"Function <vkGetPhysicalDeviceFeatures2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 &  features = structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2>();\n    d.vkGetPhysicalDeviceFeatures2( m_physicalDevice, reinterpret_cast<VkPhysicalDeviceFeatures2 *>( &features ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::getProperties2( VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 * pProperties,\n                                                         Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceProperties2( static_cast<VkPhysicalDevice>( m_physicalDevice ), reinterpret_cast<VkPhysicalDeviceProperties2 *>( pProperties ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2\n                                         PhysicalDevice::getProperties2( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceProperties2 &&\n                       \"Function <vkGetPhysicalDeviceProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 properties;\n    d.vkGetPhysicalDeviceProperties2( m_physicalDevice, reinterpret_cast<VkPhysicalDeviceProperties2 *>( &properties ) );\n\n    return properties;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                                         PhysicalDevice::getProperties2( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceProperties2 &&\n                       \"Function <vkGetPhysicalDeviceProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>  structureChain;\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 & properties = structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2>();\n    d.vkGetPhysicalDeviceProperties2( m_physicalDevice, reinterpret_cast<VkPhysicalDeviceProperties2 *>( &properties ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::getFormatProperties2( VULKAN_HPP_NAMESPACE::Format              format,\n                                                               VULKAN_HPP_NAMESPACE::FormatProperties2 * pFormatProperties,\n                                                               Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceFormatProperties2(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ), static_cast<VkFormat>( format ), reinterpret_cast<VkFormatProperties2 *>( pFormatProperties ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::FormatProperties2\n    PhysicalDevice::getFormatProperties2( VULKAN_HPP_NAMESPACE::Format format, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceFormatProperties2 &&\n                       \"Function <vkGetPhysicalDeviceFormatProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::FormatProperties2 formatProperties;\n    d.vkGetPhysicalDeviceFormatProperties2( m_physicalDevice, static_cast<VkFormat>( format ), reinterpret_cast<VkFormatProperties2 *>( &formatProperties ) );\n\n    return formatProperties;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n    PhysicalDevice::getFormatProperties2( VULKAN_HPP_NAMESPACE::Format format, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceFormatProperties2 &&\n                       \"Function <vkGetPhysicalDeviceFormatProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n    VULKAN_HPP_NAMESPACE::FormatProperties2 &        formatProperties = structureChain.template get<VULKAN_HPP_NAMESPACE::FormatProperties2>();\n    d.vkGetPhysicalDeviceFormatProperties2( m_physicalDevice, static_cast<VkFormat>( format ), reinterpret_cast<VkFormatProperties2 *>( &formatProperties ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    PhysicalDevice::getImageFormatProperties2( const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 * pImageFormatInfo,\n                                               VULKAN_HPP_NAMESPACE::ImageFormatProperties2 *               pImageFormatProperties,\n                                               Dispatch const &                                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceImageFormatProperties2( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                             reinterpret_cast<const VkPhysicalDeviceImageFormatInfo2 *>( pImageFormatInfo ),\n                                                                             reinterpret_cast<VkImageFormatProperties2 *>( pImageFormatProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::ImageFormatProperties2>::type\n    PhysicalDevice::getImageFormatProperties2( const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 & imageFormatInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceImageFormatProperties2 &&\n                       \"Function <vkGetPhysicalDeviceImageFormatProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::ImageFormatProperties2 imageFormatProperties;\n    VULKAN_HPP_NAMESPACE::Result                 result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetPhysicalDeviceImageFormatProperties2( m_physicalDevice,\n                                                   reinterpret_cast<const VkPhysicalDeviceImageFormatInfo2 *>( &imageFormatInfo ),\n                                                   reinterpret_cast<VkImageFormatProperties2 *>( &imageFormatProperties ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getImageFormatProperties2\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( imageFormatProperties ) );\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>>::type\n    PhysicalDevice::getImageFormatProperties2( const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 & imageFormatInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceImageFormatProperties2 &&\n                       \"Function <vkGetPhysicalDeviceImageFormatProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    StructureChain<X, Y, Z...>                     structureChain;\n    VULKAN_HPP_NAMESPACE::ImageFormatProperties2 & imageFormatProperties = structureChain.template get<VULKAN_HPP_NAMESPACE::ImageFormatProperties2>();\n    VULKAN_HPP_NAMESPACE::Result                   result                = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetPhysicalDeviceImageFormatProperties2( m_physicalDevice,\n                                                   reinterpret_cast<const VkPhysicalDeviceImageFormatInfo2 *>( &imageFormatInfo ),\n                                                   reinterpret_cast<VkImageFormatProperties2 *>( &imageFormatProperties ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getImageFormatProperties2\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( structureChain ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::getQueueFamilyProperties2( uint32_t *                                     pQueueFamilyPropertyCount,\n                                                                    VULKAN_HPP_NAMESPACE::QueueFamilyProperties2 * pQueueFamilyProperties,\n                                                                    Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceQueueFamilyProperties2(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ), pQueueFamilyPropertyCount, reinterpret_cast<VkQueueFamilyProperties2 *>( pQueueFamilyProperties ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <\n    typename QueueFamilyProperties2Allocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename QueueFamilyProperties2Allocator::value_type, VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2, QueueFamilyProperties2Allocator>\n                                         PhysicalDevice::getQueueFamilyProperties2( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceQueueFamilyProperties2 &&\n                       \"Function <vkGetPhysicalDeviceQueueFamilyProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2, QueueFamilyProperties2Allocator> queueFamilyProperties;\n    uint32_t                                                                                   queueFamilyPropertyCount;\n    d.vkGetPhysicalDeviceQueueFamilyProperties2( m_physicalDevice, &queueFamilyPropertyCount, nullptr );\n    queueFamilyProperties.resize( queueFamilyPropertyCount );\n    d.vkGetPhysicalDeviceQueueFamilyProperties2(\n      m_physicalDevice, &queueFamilyPropertyCount, reinterpret_cast<VkQueueFamilyProperties2 *>( queueFamilyProperties.data() ) );\n\n    VULKAN_HPP_ASSERT( queueFamilyPropertyCount <= queueFamilyProperties.size() );\n    if ( queueFamilyPropertyCount < queueFamilyProperties.size() )\n    {\n      queueFamilyProperties.resize( queueFamilyPropertyCount );\n    }\n    return queueFamilyProperties;\n  }\n\n  template <\n    typename QueueFamilyProperties2Allocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename QueueFamilyProperties2Allocator::value_type, VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2, QueueFamilyProperties2Allocator>\n    PhysicalDevice::getQueueFamilyProperties2( QueueFamilyProperties2Allocator & queueFamilyProperties2Allocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceQueueFamilyProperties2 &&\n                       \"Function <vkGetPhysicalDeviceQueueFamilyProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2, QueueFamilyProperties2Allocator> queueFamilyProperties( queueFamilyProperties2Allocator );\n    uint32_t                                                                                   queueFamilyPropertyCount;\n    d.vkGetPhysicalDeviceQueueFamilyProperties2( m_physicalDevice, &queueFamilyPropertyCount, nullptr );\n    queueFamilyProperties.resize( queueFamilyPropertyCount );\n    d.vkGetPhysicalDeviceQueueFamilyProperties2(\n      m_physicalDevice, &queueFamilyPropertyCount, reinterpret_cast<VkQueueFamilyProperties2 *>( queueFamilyProperties.data() ) );\n\n    VULKAN_HPP_ASSERT( queueFamilyPropertyCount <= queueFamilyProperties.size() );\n    if ( queueFamilyPropertyCount < queueFamilyProperties.size() )\n    {\n      queueFamilyProperties.resize( queueFamilyPropertyCount );\n    }\n    return queueFamilyProperties;\n  }\n\n  template <typename StructureChain,\n            typename StructureChainAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename StructureChainAllocator::value_type, StructureChain>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<StructureChain, StructureChainAllocator>\n                                         PhysicalDevice::getQueueFamilyProperties2( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceQueueFamilyProperties2 &&\n                       \"Function <vkGetPhysicalDeviceQueueFamilyProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    std::vector<StructureChain, StructureChainAllocator>      structureChains;\n    std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2> queueFamilyProperties;\n    uint32_t                                                  queueFamilyPropertyCount;\n    d.vkGetPhysicalDeviceQueueFamilyProperties2( m_physicalDevice, &queueFamilyPropertyCount, nullptr );\n    structureChains.resize( queueFamilyPropertyCount );\n    queueFamilyProperties.resize( queueFamilyPropertyCount );\n    for ( uint32_t i = 0; i < queueFamilyPropertyCount; i++ )\n    {\n      queueFamilyProperties[i].pNext = structureChains[i].template get<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>().pNext;\n    }\n    d.vkGetPhysicalDeviceQueueFamilyProperties2(\n      m_physicalDevice, &queueFamilyPropertyCount, reinterpret_cast<VkQueueFamilyProperties2 *>( queueFamilyProperties.data() ) );\n\n    VULKAN_HPP_ASSERT( queueFamilyPropertyCount <= queueFamilyProperties.size() );\n    if ( queueFamilyPropertyCount < queueFamilyProperties.size() )\n    {\n      structureChains.resize( queueFamilyPropertyCount );\n    }\n    for ( uint32_t i = 0; i < queueFamilyPropertyCount; i++ )\n    {\n      structureChains[i].template get<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>() = queueFamilyProperties[i];\n    }\n    return structureChains;\n  }\n\n  template <typename StructureChain,\n            typename StructureChainAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename StructureChainAllocator::value_type, StructureChain>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<StructureChain, StructureChainAllocator>\n    PhysicalDevice::getQueueFamilyProperties2( StructureChainAllocator & structureChainAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceQueueFamilyProperties2 &&\n                       \"Function <vkGetPhysicalDeviceQueueFamilyProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    std::vector<StructureChain, StructureChainAllocator>      structureChains( structureChainAllocator );\n    std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2> queueFamilyProperties;\n    uint32_t                                                  queueFamilyPropertyCount;\n    d.vkGetPhysicalDeviceQueueFamilyProperties2( m_physicalDevice, &queueFamilyPropertyCount, nullptr );\n    structureChains.resize( queueFamilyPropertyCount );\n    queueFamilyProperties.resize( queueFamilyPropertyCount );\n    for ( uint32_t i = 0; i < queueFamilyPropertyCount; i++ )\n    {\n      queueFamilyProperties[i].pNext = structureChains[i].template get<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>().pNext;\n    }\n    d.vkGetPhysicalDeviceQueueFamilyProperties2(\n      m_physicalDevice, &queueFamilyPropertyCount, reinterpret_cast<VkQueueFamilyProperties2 *>( queueFamilyProperties.data() ) );\n\n    VULKAN_HPP_ASSERT( queueFamilyPropertyCount <= queueFamilyProperties.size() );\n    if ( queueFamilyPropertyCount < queueFamilyProperties.size() )\n    {\n      structureChains.resize( queueFamilyPropertyCount );\n    }\n    for ( uint32_t i = 0; i < queueFamilyPropertyCount; i++ )\n    {\n      structureChains[i].template get<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>() = queueFamilyProperties[i];\n    }\n    return structureChains;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::getMemoryProperties2( VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 * pMemoryProperties,\n                                                               Dispatch const &                                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceMemoryProperties2( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                            reinterpret_cast<VkPhysicalDeviceMemoryProperties2 *>( pMemoryProperties ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2\n                                         PhysicalDevice::getMemoryProperties2( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceMemoryProperties2 &&\n                       \"Function <vkGetPhysicalDeviceMemoryProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 memoryProperties;\n    d.vkGetPhysicalDeviceMemoryProperties2( m_physicalDevice, reinterpret_cast<VkPhysicalDeviceMemoryProperties2 *>( &memoryProperties ) );\n\n    return memoryProperties;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                                         PhysicalDevice::getMemoryProperties2( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceMemoryProperties2 &&\n                       \"Function <vkGetPhysicalDeviceMemoryProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>        structureChain;\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 & memoryProperties =\n      structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2>();\n    d.vkGetPhysicalDeviceMemoryProperties2( m_physicalDevice, reinterpret_cast<VkPhysicalDeviceMemoryProperties2 *>( &memoryProperties ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::getSparseImageFormatProperties2( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 * pFormatInfo,\n                                                                          uint32_t *                                                         pPropertyCount,\n                                                                          VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2 *               pProperties,\n                                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceSparseImageFormatProperties2( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                       reinterpret_cast<const VkPhysicalDeviceSparseImageFormatInfo2 *>( pFormatInfo ),\n                                                       pPropertyCount,\n                                                       reinterpret_cast<VkSparseImageFormatProperties2 *>( pProperties ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <\n    typename SparseImageFormatProperties2Allocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename SparseImageFormatProperties2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2, SparseImageFormatProperties2Allocator>\n    PhysicalDevice::getSparseImageFormatProperties2( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 & formatInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceSparseImageFormatProperties2 &&\n                       \"Function <vkGetPhysicalDeviceSparseImageFormatProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2, SparseImageFormatProperties2Allocator> properties;\n    uint32_t                                                                                               propertyCount;\n    d.vkGetPhysicalDeviceSparseImageFormatProperties2(\n      m_physicalDevice, reinterpret_cast<const VkPhysicalDeviceSparseImageFormatInfo2 *>( &formatInfo ), &propertyCount, nullptr );\n    properties.resize( propertyCount );\n    d.vkGetPhysicalDeviceSparseImageFormatProperties2( m_physicalDevice,\n                                                       reinterpret_cast<const VkPhysicalDeviceSparseImageFormatInfo2 *>( &formatInfo ),\n                                                       &propertyCount,\n                                                       reinterpret_cast<VkSparseImageFormatProperties2 *>( properties.data() ) );\n\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return properties;\n  }\n\n  template <\n    typename SparseImageFormatProperties2Allocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename SparseImageFormatProperties2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2, SparseImageFormatProperties2Allocator>\n    PhysicalDevice::getSparseImageFormatProperties2( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 & formatInfo,\n                                                     SparseImageFormatProperties2Allocator &                            sparseImageFormatProperties2Allocator,\n                                                     Dispatch const &                                                   d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceSparseImageFormatProperties2 &&\n                       \"Function <vkGetPhysicalDeviceSparseImageFormatProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2, SparseImageFormatProperties2Allocator> properties( sparseImageFormatProperties2Allocator );\n    uint32_t                                                                                               propertyCount;\n    d.vkGetPhysicalDeviceSparseImageFormatProperties2(\n      m_physicalDevice, reinterpret_cast<const VkPhysicalDeviceSparseImageFormatInfo2 *>( &formatInfo ), &propertyCount, nullptr );\n    properties.resize( propertyCount );\n    d.vkGetPhysicalDeviceSparseImageFormatProperties2( m_physicalDevice,\n                                                       reinterpret_cast<const VkPhysicalDeviceSparseImageFormatInfo2 *>( &formatInfo ),\n                                                       &propertyCount,\n                                                       reinterpret_cast<VkSparseImageFormatProperties2 *>( properties.data() ) );\n\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return properties;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::trimCommandPool( VULKAN_HPP_NAMESPACE::CommandPool          commandPool,\n                                                  VULKAN_HPP_NAMESPACE::CommandPoolTrimFlags flags,\n                                                  Dispatch const &                           d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkTrimCommandPool( static_cast<VkDevice>( m_device ), static_cast<VkCommandPool>( commandPool ), static_cast<VkCommandPoolTrimFlags>( flags ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getQueue2( const VULKAN_HPP_NAMESPACE::DeviceQueueInfo2 * pQueueInfo,\n                                            VULKAN_HPP_NAMESPACE::Queue *                  pQueue,\n                                            Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetDeviceQueue2( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkDeviceQueueInfo2 *>( pQueueInfo ), reinterpret_cast<VkQueue *>( pQueue ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Queue Device::getQueue2( const VULKAN_HPP_NAMESPACE::DeviceQueueInfo2 & queueInfo,\n                                                                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceQueue2 && \"Function <vkGetDeviceQueue2> requires <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Queue queue;\n    d.vkGetDeviceQueue2( m_device, reinterpret_cast<const VkDeviceQueueInfo2 *>( &queueInfo ), reinterpret_cast<VkQueue *>( &queue ) );\n\n    return queue;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::createSamplerYcbcrConversion( const VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo * pCreateInfo,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks *              pAllocator,\n                                          VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion *                 pYcbcrConversion,\n                                          Dispatch const &                                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateSamplerYcbcrConversion( static_cast<VkDevice>( m_device ),\n                                                                  reinterpret_cast<const VkSamplerYcbcrConversionCreateInfo *>( pCreateInfo ),\n                                                                  reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                                  reinterpret_cast<VkSamplerYcbcrConversion *>( pYcbcrConversion ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion>::type\n                       Device::createSamplerYcbcrConversion( const VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo & createInfo,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>      allocator,\n                                          Dispatch const &                                               d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateSamplerYcbcrConversion &&\n                       \"Function <vkCreateSamplerYcbcrConversion> requires <VK_KHR_sampler_ycbcr_conversion> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion ycbcrConversion;\n    VULKAN_HPP_NAMESPACE::Result                 result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateSamplerYcbcrConversion(\n      m_device,\n      reinterpret_cast<const VkSamplerYcbcrConversionCreateInfo *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSamplerYcbcrConversion *>( &ycbcrConversion ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createSamplerYcbcrConversion\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( ycbcrConversion ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion, Dispatch>>::type\n                       Device::createSamplerYcbcrConversionUnique( const VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo & createInfo,\n                                                Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>      allocator,\n                                                Dispatch const &                                               d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateSamplerYcbcrConversion &&\n                       \"Function <vkCreateSamplerYcbcrConversion> requires <VK_KHR_sampler_ycbcr_conversion> or <VK_VERSION_1_1>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion ycbcrConversion;\n    VULKAN_HPP_NAMESPACE::Result                 result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateSamplerYcbcrConversion(\n      m_device,\n      reinterpret_cast<const VkSamplerYcbcrConversionCreateInfo *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSamplerYcbcrConversion *>( &ycbcrConversion ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createSamplerYcbcrConversionUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result,\n      UniqueHandle<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion, Dispatch>( ycbcrConversion, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroySamplerYcbcrConversion( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion      ycbcrConversion,\n                                                                const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroySamplerYcbcrConversion( static_cast<VkDevice>( m_device ),\n                                       static_cast<VkSamplerYcbcrConversion>( ycbcrConversion ),\n                                       reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroySamplerYcbcrConversion( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion              ycbcrConversion,\n                                                                Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                                Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroySamplerYcbcrConversion &&\n                       \"Function <vkDestroySamplerYcbcrConversion> requires <VK_KHR_sampler_ycbcr_conversion> or <VK_VERSION_1_1>\" );\n#  endif\n\n    d.vkDestroySamplerYcbcrConversion(\n      m_device,\n      static_cast<VkSamplerYcbcrConversion>( ycbcrConversion ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion      ycbcrConversion,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroySamplerYcbcrConversion( static_cast<VkDevice>( m_device ),\n                                       static_cast<VkSamplerYcbcrConversion>( ycbcrConversion ),\n                                       reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion              ycbcrConversion,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroySamplerYcbcrConversion &&\n                       \"Function <vkDestroySamplerYcbcrConversion> requires <VK_KHR_sampler_ycbcr_conversion> or <VK_VERSION_1_1>\" );\n#  endif\n\n    d.vkDestroySamplerYcbcrConversion(\n      m_device,\n      static_cast<VkSamplerYcbcrConversion>( ycbcrConversion ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::createDescriptorUpdateTemplate( const VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo * pCreateInfo,\n                                            const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                pAllocator,\n                                            VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate *                 pDescriptorUpdateTemplate,\n                                            Dispatch const &                                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateDescriptorUpdateTemplate( static_cast<VkDevice>( m_device ),\n                                                                    reinterpret_cast<const VkDescriptorUpdateTemplateCreateInfo *>( pCreateInfo ),\n                                                                    reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                                    reinterpret_cast<VkDescriptorUpdateTemplate *>( pDescriptorUpdateTemplate ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate>::type\n                       Device::createDescriptorUpdateTemplate( const VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo & createInfo,\n                                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>        allocator,\n                                            Dispatch const &                                                 d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateDescriptorUpdateTemplate &&\n                       \"Function <vkCreateDescriptorUpdateTemplate> requires <VK_KHR_descriptor_update_template> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate;\n    VULKAN_HPP_NAMESPACE::Result                   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateDescriptorUpdateTemplate(\n      m_device,\n      reinterpret_cast<const VkDescriptorUpdateTemplateCreateInfo *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkDescriptorUpdateTemplate *>( &descriptorUpdateTemplate ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createDescriptorUpdateTemplate\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( descriptorUpdateTemplate ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate, Dispatch>>::type\n                       Device::createDescriptorUpdateTemplateUnique( const VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo & createInfo,\n                                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>        allocator,\n                                                  Dispatch const &                                                 d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateDescriptorUpdateTemplate &&\n                       \"Function <vkCreateDescriptorUpdateTemplate> requires <VK_KHR_descriptor_update_template> or <VK_VERSION_1_1>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate;\n    VULKAN_HPP_NAMESPACE::Result                   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateDescriptorUpdateTemplate(\n      m_device,\n      reinterpret_cast<const VkDescriptorUpdateTemplateCreateInfo *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkDescriptorUpdateTemplate *>( &descriptorUpdateTemplate ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createDescriptorUpdateTemplateUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result,\n                                                                UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate, Dispatch>(\n                                                                  descriptorUpdateTemplate, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyDescriptorUpdateTemplate( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate    descriptorUpdateTemplate,\n                                                                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                  Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyDescriptorUpdateTemplate( static_cast<VkDevice>( m_device ),\n                                         static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),\n                                         reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyDescriptorUpdateTemplate( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate            descriptorUpdateTemplate,\n                                                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                                  Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyDescriptorUpdateTemplate &&\n                       \"Function <vkDestroyDescriptorUpdateTemplate> requires <VK_KHR_descriptor_update_template> or <VK_VERSION_1_1>\" );\n#  endif\n\n    d.vkDestroyDescriptorUpdateTemplate(\n      m_device,\n      static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate    descriptorUpdateTemplate,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyDescriptorUpdateTemplate( static_cast<VkDevice>( m_device ),\n                                         static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),\n                                         reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate            descriptorUpdateTemplate,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyDescriptorUpdateTemplate &&\n                       \"Function <vkDestroyDescriptorUpdateTemplate> requires <VK_KHR_descriptor_update_template> or <VK_VERSION_1_1>\" );\n#  endif\n\n    d.vkDestroyDescriptorUpdateTemplate(\n      m_device,\n      static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::updateDescriptorSetWithTemplate( VULKAN_HPP_NAMESPACE::DescriptorSet            descriptorSet,\n                                                                  VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,\n                                                                  const void *                                   pData,\n                                                                  Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkUpdateDescriptorSetWithTemplate( static_cast<VkDevice>( m_device ),\n                                         static_cast<VkDescriptorSet>( descriptorSet ),\n                                         static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),\n                                         pData );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename DataType, typename Dispatch>\n  VULKAN_HPP_INLINE void Device::updateDescriptorSetWithTemplate( VULKAN_HPP_NAMESPACE::DescriptorSet            descriptorSet,\n                                                                  VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,\n                                                                  DataType const &                               data,\n                                                                  Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkUpdateDescriptorSetWithTemplate &&\n                       \"Function <vkUpdateDescriptorSetWithTemplate> requires <VK_KHR_descriptor_update_template> or <VK_VERSION_1_1>\" );\n#  endif\n\n    d.vkUpdateDescriptorSetWithTemplate( m_device,\n                                         static_cast<VkDescriptorSet>( descriptorSet ),\n                                         static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),\n                                         reinterpret_cast<const void *>( &data ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::getExternalBufferProperties( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo * pExternalBufferInfo,\n                                                                      VULKAN_HPP_NAMESPACE::ExternalBufferProperties *               pExternalBufferProperties,\n                                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceExternalBufferProperties( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                   reinterpret_cast<const VkPhysicalDeviceExternalBufferInfo *>( pExternalBufferInfo ),\n                                                   reinterpret_cast<VkExternalBufferProperties *>( pExternalBufferProperties ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ExternalBufferProperties\n    PhysicalDevice::getExternalBufferProperties( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo & externalBufferInfo,\n                                                 Dispatch const &                                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceExternalBufferProperties &&\n                       \"Function <vkGetPhysicalDeviceExternalBufferProperties> requires <VK_KHR_external_memory_capabilities> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::ExternalBufferProperties externalBufferProperties;\n    d.vkGetPhysicalDeviceExternalBufferProperties( m_physicalDevice,\n                                                   reinterpret_cast<const VkPhysicalDeviceExternalBufferInfo *>( &externalBufferInfo ),\n                                                   reinterpret_cast<VkExternalBufferProperties *>( &externalBufferProperties ) );\n\n    return externalBufferProperties;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::getExternalFenceProperties( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo * pExternalFenceInfo,\n                                                                     VULKAN_HPP_NAMESPACE::ExternalFenceProperties *               pExternalFenceProperties,\n                                                                     Dispatch const &                                              d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceExternalFenceProperties( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                  reinterpret_cast<const VkPhysicalDeviceExternalFenceInfo *>( pExternalFenceInfo ),\n                                                  reinterpret_cast<VkExternalFenceProperties *>( pExternalFenceProperties ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ExternalFenceProperties\n    PhysicalDevice::getExternalFenceProperties( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo & externalFenceInfo,\n                                                Dispatch const &                                              d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceExternalFenceProperties &&\n                       \"Function <vkGetPhysicalDeviceExternalFenceProperties> requires <VK_KHR_external_fence_capabilities> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::ExternalFenceProperties externalFenceProperties;\n    d.vkGetPhysicalDeviceExternalFenceProperties( m_physicalDevice,\n                                                  reinterpret_cast<const VkPhysicalDeviceExternalFenceInfo *>( &externalFenceInfo ),\n                                                  reinterpret_cast<VkExternalFenceProperties *>( &externalFenceProperties ) );\n\n    return externalFenceProperties;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    PhysicalDevice::getExternalSemaphoreProperties( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo * pExternalSemaphoreInfo,\n                                                    VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties *               pExternalSemaphoreProperties,\n                                                    Dispatch const &                                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceExternalSemaphoreProperties( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                      reinterpret_cast<const VkPhysicalDeviceExternalSemaphoreInfo *>( pExternalSemaphoreInfo ),\n                                                      reinterpret_cast<VkExternalSemaphoreProperties *>( pExternalSemaphoreProperties ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties\n    PhysicalDevice::getExternalSemaphoreProperties( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo & externalSemaphoreInfo,\n                                                    Dispatch const &                                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceExternalSemaphoreProperties &&\n                       \"Function <vkGetPhysicalDeviceExternalSemaphoreProperties> requires <VK_KHR_external_semaphore_capabilities> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties externalSemaphoreProperties;\n    d.vkGetPhysicalDeviceExternalSemaphoreProperties( m_physicalDevice,\n                                                      reinterpret_cast<const VkPhysicalDeviceExternalSemaphoreInfo *>( &externalSemaphoreInfo ),\n                                                      reinterpret_cast<VkExternalSemaphoreProperties *>( &externalSemaphoreProperties ) );\n\n    return externalSemaphoreProperties;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getDescriptorSetLayoutSupport( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo * pCreateInfo,\n                                                                VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport *          pSupport,\n                                                                Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetDescriptorSetLayoutSupport( static_cast<VkDevice>( m_device ),\n                                       reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>( pCreateInfo ),\n                                       reinterpret_cast<VkDescriptorSetLayoutSupport *>( pSupport ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport\n                                         Device::getDescriptorSetLayoutSupport( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo & createInfo,\n                                           Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDescriptorSetLayoutSupport && \"Function <vkGetDescriptorSetLayoutSupport> requires <VK_KHR_maintenance3> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport support;\n    d.vkGetDescriptorSetLayoutSupport(\n      m_device, reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>( &createInfo ), reinterpret_cast<VkDescriptorSetLayoutSupport *>( &support ) );\n\n    return support;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                                         Device::getDescriptorSetLayoutSupport( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo & createInfo,\n                                           Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDescriptorSetLayoutSupport && \"Function <vkGetDescriptorSetLayoutSupport> requires <VK_KHR_maintenance3> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>   structureChain;\n    VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport & support = structureChain.template get<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport>();\n    d.vkGetDescriptorSetLayoutSupport(\n      m_device, reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>( &createInfo ), reinterpret_cast<VkDescriptorSetLayoutSupport *>( &support ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_VERSION_1_2 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::drawIndirectCount( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                           VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                           VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                                           VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                                           uint32_t                         maxDrawCount,\n                                                           uint32_t                         stride,\n                                                           Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDrawIndirectCount( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                              static_cast<VkBuffer>( buffer ),\n                              static_cast<VkDeviceSize>( offset ),\n                              static_cast<VkBuffer>( countBuffer ),\n                              static_cast<VkDeviceSize>( countBufferOffset ),\n                              maxDrawCount,\n                              stride );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::drawIndexedIndirectCount( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                                  VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                                  VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                                                  VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                                                  uint32_t                         maxDrawCount,\n                                                                  uint32_t                         stride,\n                                                                  Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDrawIndexedIndirectCount( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                     static_cast<VkBuffer>( buffer ),\n                                     static_cast<VkDeviceSize>( offset ),\n                                     static_cast<VkBuffer>( countBuffer ),\n                                     static_cast<VkDeviceSize>( countBufferOffset ),\n                                     maxDrawCount,\n                                     stride );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createRenderPass2( const VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 * pCreateInfo,\n                                                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks *   pAllocator,\n                                                                           VULKAN_HPP_NAMESPACE::RenderPass *                  pRenderPass,\n                                                                           Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateRenderPass2( static_cast<VkDevice>( m_device ),\n                                                       reinterpret_cast<const VkRenderPassCreateInfo2 *>( pCreateInfo ),\n                                                       reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                       reinterpret_cast<VkRenderPass *>( pRenderPass ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::RenderPass>::type\n                       Device::createRenderPass2( const VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 &       createInfo,\n                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                               Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateRenderPass2 && \"Function <vkCreateRenderPass2> requires <VK_KHR_create_renderpass2> or <VK_VERSION_1_2>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::RenderPass renderPass;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateRenderPass2( m_device,\n                             reinterpret_cast<const VkRenderPassCreateInfo2 *>( &createInfo ),\n                             reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                             reinterpret_cast<VkRenderPass *>( &renderPass ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createRenderPass2\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( renderPass ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::RenderPass, Dispatch>>::type\n                       Device::createRenderPass2Unique( const VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 &       createInfo,\n                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                     Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateRenderPass2 && \"Function <vkCreateRenderPass2> requires <VK_KHR_create_renderpass2> or <VK_VERSION_1_2>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::RenderPass renderPass;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateRenderPass2( m_device,\n                             reinterpret_cast<const VkRenderPassCreateInfo2 *>( &createInfo ),\n                             reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                             reinterpret_cast<VkRenderPass *>( &renderPass ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createRenderPass2Unique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::RenderPass, Dispatch>( renderPass, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::beginRenderPass2( const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo * pRenderPassBegin,\n                                                          const VULKAN_HPP_NAMESPACE::SubpassBeginInfo *    pSubpassBeginInfo,\n                                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBeginRenderPass2( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                             reinterpret_cast<const VkRenderPassBeginInfo *>( pRenderPassBegin ),\n                             reinterpret_cast<const VkSubpassBeginInfo *>( pSubpassBeginInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::beginRenderPass2( const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo & renderPassBegin,\n                                                          const VULKAN_HPP_NAMESPACE::SubpassBeginInfo &    subpassBeginInfo,\n                                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBeginRenderPass2 && \"Function <vkCmdBeginRenderPass2> requires <VK_KHR_create_renderpass2> or <VK_VERSION_1_2>\" );\n#  endif\n\n    d.vkCmdBeginRenderPass2(\n      m_commandBuffer, reinterpret_cast<const VkRenderPassBeginInfo *>( &renderPassBegin ), reinterpret_cast<const VkSubpassBeginInfo *>( &subpassBeginInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::nextSubpass2( const VULKAN_HPP_NAMESPACE::SubpassBeginInfo * pSubpassBeginInfo,\n                                                      const VULKAN_HPP_NAMESPACE::SubpassEndInfo *   pSubpassEndInfo,\n                                                      Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdNextSubpass2( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                         reinterpret_cast<const VkSubpassBeginInfo *>( pSubpassBeginInfo ),\n                         reinterpret_cast<const VkSubpassEndInfo *>( pSubpassEndInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::nextSubpass2( const VULKAN_HPP_NAMESPACE::SubpassBeginInfo & subpassBeginInfo,\n                                                      const VULKAN_HPP_NAMESPACE::SubpassEndInfo &   subpassEndInfo,\n                                                      Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdNextSubpass2 && \"Function <vkCmdNextSubpass2> requires <VK_KHR_create_renderpass2> or <VK_VERSION_1_2>\" );\n#  endif\n\n    d.vkCmdNextSubpass2(\n      m_commandBuffer, reinterpret_cast<const VkSubpassBeginInfo *>( &subpassBeginInfo ), reinterpret_cast<const VkSubpassEndInfo *>( &subpassEndInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::endRenderPass2( const VULKAN_HPP_NAMESPACE::SubpassEndInfo * pSubpassEndInfo,\n                                                        Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdEndRenderPass2( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkSubpassEndInfo *>( pSubpassEndInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::endRenderPass2( const VULKAN_HPP_NAMESPACE::SubpassEndInfo & subpassEndInfo,\n                                                        Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdEndRenderPass2 && \"Function <vkCmdEndRenderPass2> requires <VK_KHR_create_renderpass2> or <VK_VERSION_1_2>\" );\n#  endif\n\n    d.vkCmdEndRenderPass2( m_commandBuffer, reinterpret_cast<const VkSubpassEndInfo *>( &subpassEndInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    Device::resetQueryPool( VULKAN_HPP_NAMESPACE::QueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkResetQueryPool( static_cast<VkDevice>( m_device ), static_cast<VkQueryPool>( queryPool ), firstQuery, queryCount );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getSemaphoreCounterValue( VULKAN_HPP_NAMESPACE::Semaphore semaphore,\n                                                                                  uint64_t *                      pValue,\n                                                                                  Dispatch const &                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetSemaphoreCounterValue( static_cast<VkDevice>( m_device ), static_cast<VkSemaphore>( semaphore ), pValue ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<uint64_t>::type Device::getSemaphoreCounterValue( VULKAN_HPP_NAMESPACE::Semaphore semaphore,\n                                                                                                                    Dispatch const &                d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetSemaphoreCounterValue && \"Function <vkGetSemaphoreCounterValue> requires <VK_KHR_timeline_semaphore> or <VK_VERSION_1_2>\" );\n#  endif\n\n    uint64_t                     value;\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetSemaphoreCounterValue( m_device, static_cast<VkSemaphore>( semaphore ), &value ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getSemaphoreCounterValue\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( value ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::waitSemaphores( const VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo * pWaitInfo,\n                                                                        uint64_t                                        timeout,\n                                                                        Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkWaitSemaphores( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkSemaphoreWaitInfo *>( pWaitInfo ), timeout ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result\n    Device::waitSemaphores( const VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo & waitInfo, uint64_t timeout, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkWaitSemaphores && \"Function <vkWaitSemaphores> requires <VK_KHR_timeline_semaphore> or <VK_VERSION_1_2>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkWaitSemaphores( m_device, reinterpret_cast<const VkSemaphoreWaitInfo *>( &waitInfo ), timeout ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck(\n      result, VULKAN_HPP_NAMESPACE_STRING \"::Device::waitSemaphores\", { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eTimeout } );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::signalSemaphore( const VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo * pSignalInfo,\n                                                                         Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkSignalSemaphore( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkSemaphoreSignalInfo *>( pSignalInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n                                          Device::signalSemaphore( const VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo & signalInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkSignalSemaphore && \"Function <vkSignalSemaphore> requires <VK_KHR_timeline_semaphore> or <VK_VERSION_1_2>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkSignalSemaphore( m_device, reinterpret_cast<const VkSemaphoreSignalInfo *>( &signalInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::signalSemaphore\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE DeviceAddress Device::getBufferAddress( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo * pInfo,\n                                                            Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<DeviceAddress>(\n      d.vkGetBufferDeviceAddress( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkBufferDeviceAddressInfo *>( pInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceAddress Device::getBufferAddress( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo & info,\n                                                                                  Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetBufferDeviceAddress &&\n                       \"Function <vkGetBufferDeviceAddress> requires <VK_EXT_buffer_device_address> or <VK_KHR_buffer_device_address> or <VK_VERSION_1_2>\" );\n#  endif\n\n    VkDeviceAddress result = d.vkGetBufferDeviceAddress( m_device, reinterpret_cast<const VkBufferDeviceAddressInfo *>( &info ) );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::DeviceAddress>( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE uint64_t Device::getBufferOpaqueCaptureAddress( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo * pInfo,\n                                                                    Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return d.vkGetBufferOpaqueCaptureAddress( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkBufferDeviceAddressInfo *>( pInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE uint64_t Device::getBufferOpaqueCaptureAddress( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo & info,\n                                                                    Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetBufferOpaqueCaptureAddress &&\n                       \"Function <vkGetBufferOpaqueCaptureAddress> requires <VK_KHR_buffer_device_address> or <VK_VERSION_1_2>\" );\n#  endif\n\n    uint64_t result = d.vkGetBufferOpaqueCaptureAddress( m_device, reinterpret_cast<const VkBufferDeviceAddressInfo *>( &info ) );\n\n    return result;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE uint64_t Device::getMemoryOpaqueCaptureAddress( const VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo * pInfo,\n                                                                    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return d.vkGetDeviceMemoryOpaqueCaptureAddress( static_cast<VkDevice>( m_device ),\n                                                    reinterpret_cast<const VkDeviceMemoryOpaqueCaptureAddressInfo *>( pInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE uint64_t Device::getMemoryOpaqueCaptureAddress( const VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo & info,\n                                                                    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceMemoryOpaqueCaptureAddress &&\n                       \"Function <vkGetDeviceMemoryOpaqueCaptureAddress> requires <VK_KHR_buffer_device_address> or <VK_VERSION_1_2>\" );\n#  endif\n\n    uint64_t result = d.vkGetDeviceMemoryOpaqueCaptureAddress( m_device, reinterpret_cast<const VkDeviceMemoryOpaqueCaptureAddressInfo *>( &info ) );\n\n    return result;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_VERSION_1_3 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getToolProperties( uint32_t *                                           pToolCount,\n                                                                                   VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties * pToolProperties,\n                                                                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceToolProperties(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ), pToolCount, reinterpret_cast<VkPhysicalDeviceToolProperties *>( pToolProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <\n    typename PhysicalDeviceToolPropertiesAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename PhysicalDeviceToolPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties, PhysicalDeviceToolPropertiesAllocator>>::type\n    PhysicalDevice::getToolProperties( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceToolProperties &&\n                       \"Function <vkGetPhysicalDeviceToolProperties> requires <VK_EXT_tooling_info> or <VK_VERSION_1_3>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties, PhysicalDeviceToolPropertiesAllocator> toolProperties;\n    uint32_t                                                                                               toolCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                           result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceToolProperties( m_physicalDevice, &toolCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && toolCount )\n      {\n        toolProperties.resize( toolCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceToolProperties( m_physicalDevice, &toolCount, reinterpret_cast<VkPhysicalDeviceToolProperties *>( toolProperties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getToolProperties\" );\n    VULKAN_HPP_ASSERT( toolCount <= toolProperties.size() );\n    if ( toolCount < toolProperties.size() )\n    {\n      toolProperties.resize( toolCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( toolProperties ) );\n  }\n\n  template <\n    typename PhysicalDeviceToolPropertiesAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename PhysicalDeviceToolPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties, PhysicalDeviceToolPropertiesAllocator>>::type\n    PhysicalDevice::getToolProperties( PhysicalDeviceToolPropertiesAllocator & physicalDeviceToolPropertiesAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceToolProperties &&\n                       \"Function <vkGetPhysicalDeviceToolProperties> requires <VK_EXT_tooling_info> or <VK_VERSION_1_3>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties, PhysicalDeviceToolPropertiesAllocator> toolProperties(\n      physicalDeviceToolPropertiesAllocator );\n    uint32_t                     toolCount;\n    VULKAN_HPP_NAMESPACE::Result result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceToolProperties( m_physicalDevice, &toolCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && toolCount )\n      {\n        toolProperties.resize( toolCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceToolProperties( m_physicalDevice, &toolCount, reinterpret_cast<VkPhysicalDeviceToolProperties *>( toolProperties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getToolProperties\" );\n    VULKAN_HPP_ASSERT( toolCount <= toolProperties.size() );\n    if ( toolCount < toolProperties.size() )\n    {\n      toolProperties.resize( toolCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( toolProperties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createPrivateDataSlot( const VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo * pCreateInfo,\n                                                                               const VULKAN_HPP_NAMESPACE::AllocationCallbacks *       pAllocator,\n                                                                               VULKAN_HPP_NAMESPACE::PrivateDataSlot *                 pPrivateDataSlot,\n                                                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreatePrivateDataSlot( static_cast<VkDevice>( m_device ),\n                                                           reinterpret_cast<const VkPrivateDataSlotCreateInfo *>( pCreateInfo ),\n                                                           reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                           reinterpret_cast<VkPrivateDataSlot *>( pPrivateDataSlot ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::PrivateDataSlot>::type\n                       Device::createPrivateDataSlot( const VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo &   createInfo,\n                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                   Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreatePrivateDataSlot && \"Function <vkCreatePrivateDataSlot> requires <VK_EXT_private_data> or <VK_VERSION_1_3>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot;\n    VULKAN_HPP_NAMESPACE::Result          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreatePrivateDataSlot( m_device,\n                                 reinterpret_cast<const VkPrivateDataSlotCreateInfo *>( &createInfo ),\n                                 reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                                 reinterpret_cast<VkPrivateDataSlot *>( &privateDataSlot ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createPrivateDataSlot\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( privateDataSlot ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::PrivateDataSlot, Dispatch>>::type\n                       Device::createPrivateDataSlotUnique( const VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo &   createInfo,\n                                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                         Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreatePrivateDataSlot && \"Function <vkCreatePrivateDataSlot> requires <VK_EXT_private_data> or <VK_VERSION_1_3>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot;\n    VULKAN_HPP_NAMESPACE::Result          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreatePrivateDataSlot( m_device,\n                                 reinterpret_cast<const VkPrivateDataSlotCreateInfo *>( &createInfo ),\n                                 reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                                 reinterpret_cast<VkPrivateDataSlot *>( &privateDataSlot ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createPrivateDataSlotUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result,\n      UniqueHandle<VULKAN_HPP_NAMESPACE::PrivateDataSlot, Dispatch>( privateDataSlot, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyPrivateDataSlot( VULKAN_HPP_NAMESPACE::PrivateDataSlot             privateDataSlot,\n                                                         const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                         Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyPrivateDataSlot(\n      static_cast<VkDevice>( m_device ), static_cast<VkPrivateDataSlot>( privateDataSlot ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyPrivateDataSlot( VULKAN_HPP_NAMESPACE::PrivateDataSlot                     privateDataSlot,\n                                                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                         Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyPrivateDataSlot && \"Function <vkDestroyPrivateDataSlot> requires <VK_EXT_private_data> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkDestroyPrivateDataSlot(\n      m_device,\n      static_cast<VkPrivateDataSlot>( privateDataSlot ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::PrivateDataSlot             privateDataSlot,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyPrivateDataSlot(\n      static_cast<VkDevice>( m_device ), static_cast<VkPrivateDataSlot>( privateDataSlot ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::PrivateDataSlot                     privateDataSlot,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyPrivateDataSlot && \"Function <vkDestroyPrivateDataSlot> requires <VK_EXT_private_data> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkDestroyPrivateDataSlot(\n      m_device,\n      static_cast<VkPrivateDataSlot>( privateDataSlot ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::setPrivateData( VULKAN_HPP_NAMESPACE::ObjectType      objectType_,\n                                                                        uint64_t                              objectHandle,\n                                                                        VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,\n                                                                        uint64_t                              data,\n                                                                        Dispatch const &                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkSetPrivateData(\n      static_cast<VkDevice>( m_device ), static_cast<VkObjectType>( objectType_ ), objectHandle, static_cast<VkPrivateDataSlot>( privateDataSlot ), data ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE typename ResultValueType<void>::type Device::setPrivateData( VULKAN_HPP_NAMESPACE::ObjectType      objectType_,\n                                                                                 uint64_t                              objectHandle,\n                                                                                 VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,\n                                                                                 uint64_t                              data,\n                                                                                 Dispatch const &                      d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkSetPrivateData && \"Function <vkSetPrivateData> requires <VK_EXT_private_data> or <VK_VERSION_1_3>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkSetPrivateData( m_device, static_cast<VkObjectType>( objectType_ ), objectHandle, static_cast<VkPrivateDataSlot>( privateDataSlot ), data ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::setPrivateData\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getPrivateData( VULKAN_HPP_NAMESPACE::ObjectType      objectType_,\n                                                 uint64_t                              objectHandle,\n                                                 VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,\n                                                 uint64_t *                            pData,\n                                                 Dispatch const &                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPrivateData(\n      static_cast<VkDevice>( m_device ), static_cast<VkObjectType>( objectType_ ), objectHandle, static_cast<VkPrivateDataSlot>( privateDataSlot ), pData );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint64_t Device::getPrivateData( VULKAN_HPP_NAMESPACE::ObjectType      objectType_,\n                                                                          uint64_t                              objectHandle,\n                                                                          VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,\n                                                                          Dispatch const &                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPrivateData && \"Function <vkGetPrivateData> requires <VK_EXT_private_data> or <VK_VERSION_1_3>\" );\n#  endif\n\n    uint64_t data;\n    d.vkGetPrivateData( m_device, static_cast<VkObjectType>( objectType_ ), objectHandle, static_cast<VkPrivateDataSlot>( privateDataSlot ), &data );\n\n    return data;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setEvent2( VULKAN_HPP_NAMESPACE::Event                  event,\n                                                   const VULKAN_HPP_NAMESPACE::DependencyInfo * pDependencyInfo,\n                                                   Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetEvent2(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkEvent>( event ), reinterpret_cast<const VkDependencyInfo *>( pDependencyInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setEvent2( VULKAN_HPP_NAMESPACE::Event                  event,\n                                                   const VULKAN_HPP_NAMESPACE::DependencyInfo & dependencyInfo,\n                                                   Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetEvent2 && \"Function <vkCmdSetEvent2> requires <VK_KHR_synchronization2> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkCmdSetEvent2( m_commandBuffer, static_cast<VkEvent>( event ), reinterpret_cast<const VkDependencyInfo *>( &dependencyInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::resetEvent2( VULKAN_HPP_NAMESPACE::Event               event,\n                                                     VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stageMask,\n                                                     Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdResetEvent2( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkEvent>( event ), static_cast<VkPipelineStageFlags2>( stageMask ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::waitEvents2( uint32_t                                     eventCount,\n                                                     const VULKAN_HPP_NAMESPACE::Event *          pEvents,\n                                                     const VULKAN_HPP_NAMESPACE::DependencyInfo * pDependencyInfos,\n                                                     Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdWaitEvents2( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                        eventCount,\n                        reinterpret_cast<const VkEvent *>( pEvents ),\n                        reinterpret_cast<const VkDependencyInfo *>( pDependencyInfos ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::waitEvents2( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Event> const &          events,\n                                                     VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DependencyInfo> const & dependencyInfos,\n                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdWaitEvents2 && \"Function <vkCmdWaitEvents2> requires <VK_KHR_synchronization2> or <VK_VERSION_1_3>\" );\n#  endif\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n    VULKAN_HPP_ASSERT( events.size() == dependencyInfos.size() );\n#  else\n    if ( events.size() != dependencyInfos.size() )\n    {\n      throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::waitEvents2: events.size() != dependencyInfos.size()\" );\n    }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n    d.vkCmdWaitEvents2( m_commandBuffer,\n                        events.size(),\n                        reinterpret_cast<const VkEvent *>( events.data() ),\n                        reinterpret_cast<const VkDependencyInfo *>( dependencyInfos.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::pipelineBarrier2( const VULKAN_HPP_NAMESPACE::DependencyInfo * pDependencyInfo,\n                                                          Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdPipelineBarrier2( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkDependencyInfo *>( pDependencyInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::pipelineBarrier2( const VULKAN_HPP_NAMESPACE::DependencyInfo & dependencyInfo,\n                                                          Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdPipelineBarrier2 && \"Function <vkCmdPipelineBarrier2> requires <VK_KHR_synchronization2> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkCmdPipelineBarrier2( m_commandBuffer, reinterpret_cast<const VkDependencyInfo *>( &dependencyInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::writeTimestamp2( VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stage,\n                                                         VULKAN_HPP_NAMESPACE::QueryPool           queryPool,\n                                                         uint32_t                                  query,\n                                                         Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdWriteTimestamp2(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkPipelineStageFlags2>( stage ), static_cast<VkQueryPool>( queryPool ), query );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Queue::submit2( uint32_t                                  submitCount,\n                                                                const VULKAN_HPP_NAMESPACE::SubmitInfo2 * pSubmits,\n                                                                VULKAN_HPP_NAMESPACE::Fence               fence,\n                                                                Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkQueueSubmit2( static_cast<VkQueue>( m_queue ), submitCount, reinterpret_cast<const VkSubmitInfo2 *>( pSubmits ), static_cast<VkFence>( fence ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type Queue::submit2(\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SubmitInfo2> const & submits, VULKAN_HPP_NAMESPACE::Fence fence, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkQueueSubmit2 && \"Function <vkQueueSubmit2> requires <VK_KHR_synchronization2> or <VK_VERSION_1_3>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkQueueSubmit2( m_queue, submits.size(), reinterpret_cast<const VkSubmitInfo2 *>( submits.data() ), static_cast<VkFence>( fence ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Queue::submit2\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyBuffer2( const VULKAN_HPP_NAMESPACE::CopyBufferInfo2 * pCopyBufferInfo,\n                                                     Dispatch const &                              d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCopyBuffer2( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkCopyBufferInfo2 *>( pCopyBufferInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyBuffer2( const VULKAN_HPP_NAMESPACE::CopyBufferInfo2 & copyBufferInfo,\n                                                     Dispatch const &                              d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdCopyBuffer2 && \"Function <vkCmdCopyBuffer2> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkCmdCopyBuffer2( m_commandBuffer, reinterpret_cast<const VkCopyBufferInfo2 *>( &copyBufferInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyImage2( const VULKAN_HPP_NAMESPACE::CopyImageInfo2 * pCopyImageInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCopyImage2( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkCopyImageInfo2 *>( pCopyImageInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyImage2( const VULKAN_HPP_NAMESPACE::CopyImageInfo2 & copyImageInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdCopyImage2 && \"Function <vkCmdCopyImage2> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkCmdCopyImage2( m_commandBuffer, reinterpret_cast<const VkCopyImageInfo2 *>( &copyImageInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyBufferToImage2( const VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2 * pCopyBufferToImageInfo,\n                                                            Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCopyBufferToImage2( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkCopyBufferToImageInfo2 *>( pCopyBufferToImageInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyBufferToImage2( const VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2 & copyBufferToImageInfo,\n                                                            Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdCopyBufferToImage2 && \"Function <vkCmdCopyBufferToImage2> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkCmdCopyBufferToImage2( m_commandBuffer, reinterpret_cast<const VkCopyBufferToImageInfo2 *>( &copyBufferToImageInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyImageToBuffer2( const VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2 * pCopyImageToBufferInfo,\n                                                            Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCopyImageToBuffer2( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkCopyImageToBufferInfo2 *>( pCopyImageToBufferInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyImageToBuffer2( const VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2 & copyImageToBufferInfo,\n                                                            Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdCopyImageToBuffer2 && \"Function <vkCmdCopyImageToBuffer2> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkCmdCopyImageToBuffer2( m_commandBuffer, reinterpret_cast<const VkCopyImageToBufferInfo2 *>( &copyImageToBufferInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::blitImage2( const VULKAN_HPP_NAMESPACE::BlitImageInfo2 * pBlitImageInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBlitImage2( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkBlitImageInfo2 *>( pBlitImageInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::blitImage2( const VULKAN_HPP_NAMESPACE::BlitImageInfo2 & blitImageInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBlitImage2 && \"Function <vkCmdBlitImage2> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkCmdBlitImage2( m_commandBuffer, reinterpret_cast<const VkBlitImageInfo2 *>( &blitImageInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::resolveImage2( const VULKAN_HPP_NAMESPACE::ResolveImageInfo2 * pResolveImageInfo,\n                                                       Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdResolveImage2( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkResolveImageInfo2 *>( pResolveImageInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::resolveImage2( const VULKAN_HPP_NAMESPACE::ResolveImageInfo2 & resolveImageInfo,\n                                                       Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdResolveImage2 && \"Function <vkCmdResolveImage2> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkCmdResolveImage2( m_commandBuffer, reinterpret_cast<const VkResolveImageInfo2 *>( &resolveImageInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::beginRendering( const VULKAN_HPP_NAMESPACE::RenderingInfo * pRenderingInfo,\n                                                        Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBeginRendering( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkRenderingInfo *>( pRenderingInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::beginRendering( const VULKAN_HPP_NAMESPACE::RenderingInfo & renderingInfo,\n                                                        Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBeginRendering && \"Function <vkCmdBeginRendering> requires <VK_KHR_dynamic_rendering> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkCmdBeginRendering( m_commandBuffer, reinterpret_cast<const VkRenderingInfo *>( &renderingInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::endRendering( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdEndRendering( static_cast<VkCommandBuffer>( m_commandBuffer ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setCullMode( VULKAN_HPP_NAMESPACE::CullModeFlags cullMode, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetCullMode( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkCullModeFlags>( cullMode ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setFrontFace( VULKAN_HPP_NAMESPACE::FrontFace frontFace, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetFrontFace( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkFrontFace>( frontFace ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setPrimitiveTopology( VULKAN_HPP_NAMESPACE::PrimitiveTopology primitiveTopology,\n                                                              Dispatch const &                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetPrimitiveTopology( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkPrimitiveTopology>( primitiveTopology ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setViewportWithCount( uint32_t                               viewportCount,\n                                                              const VULKAN_HPP_NAMESPACE::Viewport * pViewports,\n                                                              Dispatch const &                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetViewportWithCount( static_cast<VkCommandBuffer>( m_commandBuffer ), viewportCount, reinterpret_cast<const VkViewport *>( pViewports ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setViewportWithCount( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Viewport> const & viewports,\n                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetViewportWithCount &&\n                       \"Function <vkCmdSetViewportWithCount> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkCmdSetViewportWithCount( m_commandBuffer, viewports.size(), reinterpret_cast<const VkViewport *>( viewports.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::setScissorWithCount( uint32_t scissorCount, const VULKAN_HPP_NAMESPACE::Rect2D * pScissors, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetScissorWithCount( static_cast<VkCommandBuffer>( m_commandBuffer ), scissorCount, reinterpret_cast<const VkRect2D *>( pScissors ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setScissorWithCount( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & scissors,\n                                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetScissorWithCount &&\n                       \"Function <vkCmdSetScissorWithCount> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkCmdSetScissorWithCount( m_commandBuffer, scissors.size(), reinterpret_cast<const VkRect2D *>( scissors.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindVertexBuffers2( uint32_t                                 firstBinding,\n                                                            uint32_t                                 bindingCount,\n                                                            const VULKAN_HPP_NAMESPACE::Buffer *     pBuffers,\n                                                            const VULKAN_HPP_NAMESPACE::DeviceSize * pOffsets,\n                                                            const VULKAN_HPP_NAMESPACE::DeviceSize * pSizes,\n                                                            const VULKAN_HPP_NAMESPACE::DeviceSize * pStrides,\n                                                            Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBindVertexBuffers2( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                               firstBinding,\n                               bindingCount,\n                               reinterpret_cast<const VkBuffer *>( pBuffers ),\n                               reinterpret_cast<const VkDeviceSize *>( pOffsets ),\n                               reinterpret_cast<const VkDeviceSize *>( pSizes ),\n                               reinterpret_cast<const VkDeviceSize *>( pStrides ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindVertexBuffers2( uint32_t                                                                         firstBinding,\n                                                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &     buffers,\n                                                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & offsets,\n                                                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & sizes,\n                                                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & strides,\n                                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBindVertexBuffers2 &&\n                       \"Function <vkCmdBindVertexBuffers2> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n#  endif\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n    VULKAN_HPP_ASSERT( buffers.size() == offsets.size() );\n    VULKAN_HPP_ASSERT( sizes.empty() || buffers.size() == sizes.size() );\n    VULKAN_HPP_ASSERT( strides.empty() || buffers.size() == strides.size() );\n#  else\n    if ( buffers.size() != offsets.size() )\n    {\n      throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::bindVertexBuffers2: buffers.size() != offsets.size()\" );\n    }\n    if ( !sizes.empty() && buffers.size() != sizes.size() )\n    {\n      throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::bindVertexBuffers2: buffers.size() != sizes.size()\" );\n    }\n    if ( !strides.empty() && buffers.size() != strides.size() )\n    {\n      throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::bindVertexBuffers2: buffers.size() != strides.size()\" );\n    }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n    d.vkCmdBindVertexBuffers2( m_commandBuffer,\n                               firstBinding,\n                               buffers.size(),\n                               reinterpret_cast<const VkBuffer *>( buffers.data() ),\n                               reinterpret_cast<const VkDeviceSize *>( offsets.data() ),\n                               reinterpret_cast<const VkDeviceSize *>( sizes.data() ),\n                               reinterpret_cast<const VkDeviceSize *>( strides.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDepthTestEnable( VULKAN_HPP_NAMESPACE::Bool32 depthTestEnable, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDepthTestEnable( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( depthTestEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDepthWriteEnable( VULKAN_HPP_NAMESPACE::Bool32 depthWriteEnable, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDepthWriteEnable( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( depthWriteEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDepthCompareOp( VULKAN_HPP_NAMESPACE::CompareOp depthCompareOp, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDepthCompareOp( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkCompareOp>( depthCompareOp ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDepthBoundsTestEnable( VULKAN_HPP_NAMESPACE::Bool32 depthBoundsTestEnable,\n                                                                  Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDepthBoundsTestEnable( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( depthBoundsTestEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setStencilTestEnable( VULKAN_HPP_NAMESPACE::Bool32 stencilTestEnable, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetStencilTestEnable( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( stencilTestEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setStencilOp( VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask,\n                                                      VULKAN_HPP_NAMESPACE::StencilOp        failOp,\n                                                      VULKAN_HPP_NAMESPACE::StencilOp        passOp,\n                                                      VULKAN_HPP_NAMESPACE::StencilOp        depthFailOp,\n                                                      VULKAN_HPP_NAMESPACE::CompareOp        compareOp,\n                                                      Dispatch const &                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetStencilOp( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                         static_cast<VkStencilFaceFlags>( faceMask ),\n                         static_cast<VkStencilOp>( failOp ),\n                         static_cast<VkStencilOp>( passOp ),\n                         static_cast<VkStencilOp>( depthFailOp ),\n                         static_cast<VkCompareOp>( compareOp ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setRasterizerDiscardEnable( VULKAN_HPP_NAMESPACE::Bool32 rasterizerDiscardEnable,\n                                                                    Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetRasterizerDiscardEnable( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( rasterizerDiscardEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDepthBiasEnable( VULKAN_HPP_NAMESPACE::Bool32 depthBiasEnable, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDepthBiasEnable( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( depthBiasEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setPrimitiveRestartEnable( VULKAN_HPP_NAMESPACE::Bool32 primitiveRestartEnable,\n                                                                   Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetPrimitiveRestartEnable( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( primitiveRestartEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getBufferMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements * pInfo,\n                                                              VULKAN_HPP_NAMESPACE::MemoryRequirements2 *                  pMemoryRequirements,\n                                                              Dispatch const &                                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetDeviceBufferMemoryRequirements( static_cast<VkDevice>( m_device ),\n                                           reinterpret_cast<const VkDeviceBufferMemoryRequirements *>( pInfo ),\n                                           reinterpret_cast<VkMemoryRequirements2 *>( pMemoryRequirements ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2\n    Device::getBufferMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceBufferMemoryRequirements &&\n                       \"Function <vkGetDeviceBufferMemoryRequirements> requires <VK_KHR_maintenance4> or <VK_VERSION_1_3>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;\n    d.vkGetDeviceBufferMemoryRequirements(\n      m_device, reinterpret_cast<const VkDeviceBufferMemoryRequirements *>( &info ), reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n    return memoryRequirements;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n    Device::getBufferMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceBufferMemoryRequirements &&\n                       \"Function <vkGetDeviceBufferMemoryRequirements> requires <VK_KHR_maintenance4> or <VK_VERSION_1_3>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2 &      memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();\n    d.vkGetDeviceBufferMemoryRequirements(\n      m_device, reinterpret_cast<const VkDeviceBufferMemoryRequirements *>( &info ), reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getImageMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements * pInfo,\n                                                             VULKAN_HPP_NAMESPACE::MemoryRequirements2 *                 pMemoryRequirements,\n                                                             Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetDeviceImageMemoryRequirements( static_cast<VkDevice>( m_device ),\n                                          reinterpret_cast<const VkDeviceImageMemoryRequirements *>( pInfo ),\n                                          reinterpret_cast<VkMemoryRequirements2 *>( pMemoryRequirements ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2\n    Device::getImageMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceImageMemoryRequirements &&\n                       \"Function <vkGetDeviceImageMemoryRequirements> requires <VK_KHR_maintenance4> or <VK_VERSION_1_3>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;\n    d.vkGetDeviceImageMemoryRequirements(\n      m_device, reinterpret_cast<const VkDeviceImageMemoryRequirements *>( &info ), reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n    return memoryRequirements;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n    Device::getImageMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceImageMemoryRequirements &&\n                       \"Function <vkGetDeviceImageMemoryRequirements> requires <VK_KHR_maintenance4> or <VK_VERSION_1_3>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2 &      memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();\n    d.vkGetDeviceImageMemoryRequirements(\n      m_device, reinterpret_cast<const VkDeviceImageMemoryRequirements *>( &info ), reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getImageSparseMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements * pInfo,\n                                                                   uint32_t *                                                  pSparseMemoryRequirementCount,\n                                                                   VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2 *      pSparseMemoryRequirements,\n                                                                   Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetDeviceImageSparseMemoryRequirements( static_cast<VkDevice>( m_device ),\n                                                reinterpret_cast<const VkDeviceImageMemoryRequirements *>( pInfo ),\n                                                pSparseMemoryRequirementCount,\n                                                reinterpret_cast<VkSparseImageMemoryRequirements2 *>( pSparseMemoryRequirements ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename SparseImageMemoryRequirements2Allocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename SparseImageMemoryRequirements2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator>\n    Device::getImageSparseMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceImageSparseMemoryRequirements &&\n                       \"Function <vkGetDeviceImageSparseMemoryRequirements> requires <VK_KHR_maintenance4> or <VK_VERSION_1_3>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator> sparseMemoryRequirements;\n    uint32_t                                                                                                   sparseMemoryRequirementCount;\n    d.vkGetDeviceImageSparseMemoryRequirements(\n      m_device, reinterpret_cast<const VkDeviceImageMemoryRequirements *>( &info ), &sparseMemoryRequirementCount, nullptr );\n    sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n    d.vkGetDeviceImageSparseMemoryRequirements( m_device,\n                                                reinterpret_cast<const VkDeviceImageMemoryRequirements *>( &info ),\n                                                &sparseMemoryRequirementCount,\n                                                reinterpret_cast<VkSparseImageMemoryRequirements2 *>( sparseMemoryRequirements.data() ) );\n\n    VULKAN_HPP_ASSERT( sparseMemoryRequirementCount <= sparseMemoryRequirements.size() );\n    if ( sparseMemoryRequirementCount < sparseMemoryRequirements.size() )\n    {\n      sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n    }\n    return sparseMemoryRequirements;\n  }\n\n  template <typename SparseImageMemoryRequirements2Allocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename SparseImageMemoryRequirements2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator>\n                                         Device::getImageSparseMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info,\n                                              SparseImageMemoryRequirements2Allocator &                   sparseImageMemoryRequirements2Allocator,\n                                              Dispatch const &                                            d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceImageSparseMemoryRequirements &&\n                       \"Function <vkGetDeviceImageSparseMemoryRequirements> requires <VK_KHR_maintenance4> or <VK_VERSION_1_3>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator> sparseMemoryRequirements(\n      sparseImageMemoryRequirements2Allocator );\n    uint32_t sparseMemoryRequirementCount;\n    d.vkGetDeviceImageSparseMemoryRequirements(\n      m_device, reinterpret_cast<const VkDeviceImageMemoryRequirements *>( &info ), &sparseMemoryRequirementCount, nullptr );\n    sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n    d.vkGetDeviceImageSparseMemoryRequirements( m_device,\n                                                reinterpret_cast<const VkDeviceImageMemoryRequirements *>( &info ),\n                                                &sparseMemoryRequirementCount,\n                                                reinterpret_cast<VkSparseImageMemoryRequirements2 *>( sparseMemoryRequirements.data() ) );\n\n    VULKAN_HPP_ASSERT( sparseMemoryRequirementCount <= sparseMemoryRequirements.size() );\n    if ( sparseMemoryRequirementCount < sparseMemoryRequirements.size() )\n    {\n      sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n    }\n    return sparseMemoryRequirements;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_VERSION_1_4 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setLineStipple( uint32_t lineStippleFactor, uint16_t lineStipplePattern, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetLineStipple( static_cast<VkCommandBuffer>( m_commandBuffer ), lineStippleFactor, lineStipplePattern );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::mapMemory2( const VULKAN_HPP_NAMESPACE::MemoryMapInfo * pMemoryMapInfo,\n                                                                    void **                                     ppData,\n                                                                    Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkMapMemory2( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkMemoryMapInfo *>( pMemoryMapInfo ), ppData ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<void *>::type Device::mapMemory2( const VULKAN_HPP_NAMESPACE::MemoryMapInfo & memoryMapInfo,\n                                                                                                    Dispatch const &                            d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkMapMemory2 && \"Function <vkMapMemory2> requires <VK_KHR_map_memory2> or <VK_VERSION_1_4>\" );\n#  endif\n\n    void *                       pData;\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkMapMemory2( m_device, reinterpret_cast<const VkMemoryMapInfo *>( &memoryMapInfo ), &pData ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::mapMemory2\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( pData ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::unmapMemory2( const VULKAN_HPP_NAMESPACE::MemoryUnmapInfo * pMemoryUnmapInfo,\n                                                                      Dispatch const &                              d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkUnmapMemory2( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkMemoryUnmapInfo *>( pMemoryUnmapInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE typename ResultValueType<void>::type Device::unmapMemory2( const VULKAN_HPP_NAMESPACE::MemoryUnmapInfo & memoryUnmapInfo,\n                                                                               Dispatch const &                              d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkUnmapMemory2 && \"Function <vkUnmapMemory2> requires <VK_KHR_map_memory2> or <VK_VERSION_1_4>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkUnmapMemory2( m_device, reinterpret_cast<const VkMemoryUnmapInfo *>( &memoryUnmapInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::unmapMemory2\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindIndexBuffer2( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                          VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                          VULKAN_HPP_NAMESPACE::DeviceSize size,\n                                                          VULKAN_HPP_NAMESPACE::IndexType  indexType,\n                                                          Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBindIndexBuffer2( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                             static_cast<VkBuffer>( buffer ),\n                             static_cast<VkDeviceSize>( offset ),\n                             static_cast<VkDeviceSize>( size ),\n                             static_cast<VkIndexType>( indexType ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getRenderingAreaGranularity( const VULKAN_HPP_NAMESPACE::RenderingAreaInfo * pRenderingAreaInfo,\n                                                              VULKAN_HPP_NAMESPACE::Extent2D *                pGranularity,\n                                                              Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetRenderingAreaGranularity(\n      static_cast<VkDevice>( m_device ), reinterpret_cast<const VkRenderingAreaInfo *>( pRenderingAreaInfo ), reinterpret_cast<VkExtent2D *>( pGranularity ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Extent2D\n    Device::getRenderingAreaGranularity( const VULKAN_HPP_NAMESPACE::RenderingAreaInfo & renderingAreaInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetRenderingAreaGranularity && \"Function <vkGetRenderingAreaGranularity> requires <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Extent2D granularity;\n    d.vkGetRenderingAreaGranularity(\n      m_device, reinterpret_cast<const VkRenderingAreaInfo *>( &renderingAreaInfo ), reinterpret_cast<VkExtent2D *>( &granularity ) );\n\n    return granularity;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getImageSubresourceLayout( const VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo * pInfo,\n                                                            VULKAN_HPP_NAMESPACE::SubresourceLayout2 *               pLayout,\n                                                            Dispatch const &                                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetDeviceImageSubresourceLayout(\n      static_cast<VkDevice>( m_device ), reinterpret_cast<const VkDeviceImageSubresourceInfo *>( pInfo ), reinterpret_cast<VkSubresourceLayout2 *>( pLayout ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::SubresourceLayout2\n    Device::getImageSubresourceLayout( const VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceImageSubresourceLayout &&\n                       \"Function <vkGetDeviceImageSubresourceLayout> requires <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::SubresourceLayout2 layout;\n    d.vkGetDeviceImageSubresourceLayout(\n      m_device, reinterpret_cast<const VkDeviceImageSubresourceInfo *>( &info ), reinterpret_cast<VkSubresourceLayout2 *>( &layout ) );\n\n    return layout;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n    Device::getImageSubresourceLayout( const VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceImageSubresourceLayout &&\n                       \"Function <vkGetDeviceImageSubresourceLayout> requires <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n    VULKAN_HPP_NAMESPACE::SubresourceLayout2 &       layout = structureChain.template get<VULKAN_HPP_NAMESPACE::SubresourceLayout2>();\n    d.vkGetDeviceImageSubresourceLayout(\n      m_device, reinterpret_cast<const VkDeviceImageSubresourceInfo *>( &info ), reinterpret_cast<VkSubresourceLayout2 *>( &layout ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getImageSubresourceLayout2( VULKAN_HPP_NAMESPACE::Image                     image,\n                                                             const VULKAN_HPP_NAMESPACE::ImageSubresource2 * pSubresource,\n                                                             VULKAN_HPP_NAMESPACE::SubresourceLayout2 *      pLayout,\n                                                             Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetImageSubresourceLayout2( static_cast<VkDevice>( m_device ),\n                                    static_cast<VkImage>( image ),\n                                    reinterpret_cast<const VkImageSubresource2 *>( pSubresource ),\n                                    reinterpret_cast<VkSubresourceLayout2 *>( pLayout ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::SubresourceLayout2 Device::getImageSubresourceLayout2(\n    VULKAN_HPP_NAMESPACE::Image image, const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT(\n      d.vkGetImageSubresourceLayout2 &&\n      \"Function <vkGetImageSubresourceLayout2> requires <VK_EXT_host_image_copy> or <VK_EXT_image_compression_control> or <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::SubresourceLayout2 layout;\n    d.vkGetImageSubresourceLayout2( m_device,\n                                    static_cast<VkImage>( image ),\n                                    reinterpret_cast<const VkImageSubresource2 *>( &subresource ),\n                                    reinterpret_cast<VkSubresourceLayout2 *>( &layout ) );\n\n    return layout;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> Device::getImageSubresourceLayout2(\n    VULKAN_HPP_NAMESPACE::Image image, const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT(\n      d.vkGetImageSubresourceLayout2 &&\n      \"Function <vkGetImageSubresourceLayout2> requires <VK_EXT_host_image_copy> or <VK_EXT_image_compression_control> or <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n    VULKAN_HPP_NAMESPACE::SubresourceLayout2 &       layout = structureChain.template get<VULKAN_HPP_NAMESPACE::SubresourceLayout2>();\n    d.vkGetImageSubresourceLayout2( m_device,\n                                    static_cast<VkImage>( image ),\n                                    reinterpret_cast<const VkImageSubresource2 *>( &subresource ),\n                                    reinterpret_cast<VkSubresourceLayout2 *>( &layout ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::pushDescriptorSet( VULKAN_HPP_NAMESPACE::PipelineBindPoint          pipelineBindPoint,\n                                                           VULKAN_HPP_NAMESPACE::PipelineLayout             layout,\n                                                           uint32_t                                         set,\n                                                           uint32_t                                         descriptorWriteCount,\n                                                           const VULKAN_HPP_NAMESPACE::WriteDescriptorSet * pDescriptorWrites,\n                                                           Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdPushDescriptorSet( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                              static_cast<VkPipelineBindPoint>( pipelineBindPoint ),\n                              static_cast<VkPipelineLayout>( layout ),\n                              set,\n                              descriptorWriteCount,\n                              reinterpret_cast<const VkWriteDescriptorSet *>( pDescriptorWrites ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::pushDescriptorSet( VULKAN_HPP_NAMESPACE::PipelineBindPoint                                                  pipelineBindPoint,\n                                      VULKAN_HPP_NAMESPACE::PipelineLayout                                                     layout,\n                                      uint32_t                                                                                 set,\n                                      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteDescriptorSet> const & descriptorWrites,\n                                      Dispatch const &                                                                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdPushDescriptorSet && \"Function <vkCmdPushDescriptorSet> requires <VK_KHR_push_descriptor> or <VK_VERSION_1_4>\" );\n#  endif\n\n    d.vkCmdPushDescriptorSet( m_commandBuffer,\n                              static_cast<VkPipelineBindPoint>( pipelineBindPoint ),\n                              static_cast<VkPipelineLayout>( layout ),\n                              set,\n                              descriptorWrites.size(),\n                              reinterpret_cast<const VkWriteDescriptorSet *>( descriptorWrites.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::pushDescriptorSetWithTemplate( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,\n                                                                       VULKAN_HPP_NAMESPACE::PipelineLayout           layout,\n                                                                       uint32_t                                       set,\n                                                                       const void *                                   pData,\n                                                                       Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdPushDescriptorSetWithTemplate( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                          static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),\n                                          static_cast<VkPipelineLayout>( layout ),\n                                          set,\n                                          pData );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename DataType, typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::pushDescriptorSetWithTemplate( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,\n                                                                       VULKAN_HPP_NAMESPACE::PipelineLayout           layout,\n                                                                       uint32_t                                       set,\n                                                                       DataType const &                               data,\n                                                                       Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT(\n      d.vkCmdPushDescriptorSetWithTemplate &&\n      \"Function <vkCmdPushDescriptorSetWithTemplate> requires <VK_KHR_descriptor_update_template> or <VK_KHR_push_descriptor> or <VK_VERSION_1_4>\" );\n#  endif\n\n    d.vkCmdPushDescriptorSetWithTemplate( m_commandBuffer,\n                                          static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),\n                                          static_cast<VkPipelineLayout>( layout ),\n                                          set,\n                                          reinterpret_cast<const void *>( &data ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setRenderingAttachmentLocations( const VULKAN_HPP_NAMESPACE::RenderingAttachmentLocationInfo * pLocationInfo,\n                                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetRenderingAttachmentLocations( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                            reinterpret_cast<const VkRenderingAttachmentLocationInfo *>( pLocationInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setRenderingAttachmentLocations( const VULKAN_HPP_NAMESPACE::RenderingAttachmentLocationInfo & locationInfo,\n                                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetRenderingAttachmentLocations &&\n                       \"Function <vkCmdSetRenderingAttachmentLocations> requires <VK_KHR_dynamic_rendering_local_read> or <VK_VERSION_1_4>\" );\n#  endif\n\n    d.vkCmdSetRenderingAttachmentLocations( m_commandBuffer, reinterpret_cast<const VkRenderingAttachmentLocationInfo *>( &locationInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::setRenderingInputAttachmentIndices( const VULKAN_HPP_NAMESPACE::RenderingInputAttachmentIndexInfo * pInputAttachmentIndexInfo,\n                                                       Dispatch const &                                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetRenderingInputAttachmentIndices( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                               reinterpret_cast<const VkRenderingInputAttachmentIndexInfo *>( pInputAttachmentIndexInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::setRenderingInputAttachmentIndices( const VULKAN_HPP_NAMESPACE::RenderingInputAttachmentIndexInfo & inputAttachmentIndexInfo,\n                                                       Dispatch const &                                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetRenderingInputAttachmentIndices &&\n                       \"Function <vkCmdSetRenderingInputAttachmentIndices> requires <VK_KHR_dynamic_rendering_local_read> or <VK_VERSION_1_4>\" );\n#  endif\n\n    d.vkCmdSetRenderingInputAttachmentIndices( m_commandBuffer, reinterpret_cast<const VkRenderingInputAttachmentIndexInfo *>( &inputAttachmentIndexInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindDescriptorSets2( const VULKAN_HPP_NAMESPACE::BindDescriptorSetsInfo * pBindDescriptorSetsInfo,\n                                                             Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBindDescriptorSets2( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                reinterpret_cast<const VkBindDescriptorSetsInfo *>( pBindDescriptorSetsInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindDescriptorSets2( const VULKAN_HPP_NAMESPACE::BindDescriptorSetsInfo & bindDescriptorSetsInfo,\n                                                             Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBindDescriptorSets2 && \"Function <vkCmdBindDescriptorSets2> requires <VK_KHR_maintenance6> or <VK_VERSION_1_4>\" );\n#  endif\n\n    d.vkCmdBindDescriptorSets2( m_commandBuffer, reinterpret_cast<const VkBindDescriptorSetsInfo *>( &bindDescriptorSetsInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::pushConstants2( const VULKAN_HPP_NAMESPACE::PushConstantsInfo * pPushConstantsInfo,\n                                                        Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdPushConstants2( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkPushConstantsInfo *>( pPushConstantsInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::pushConstants2( const VULKAN_HPP_NAMESPACE::PushConstantsInfo & pushConstantsInfo,\n                                                        Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdPushConstants2 && \"Function <vkCmdPushConstants2> requires <VK_KHR_maintenance6> or <VK_VERSION_1_4>\" );\n#  endif\n\n    d.vkCmdPushConstants2( m_commandBuffer, reinterpret_cast<const VkPushConstantsInfo *>( &pushConstantsInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::pushDescriptorSet2( const VULKAN_HPP_NAMESPACE::PushDescriptorSetInfo * pPushDescriptorSetInfo,\n                                                            Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdPushDescriptorSet2( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkPushDescriptorSetInfo *>( pPushDescriptorSetInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::pushDescriptorSet2( const VULKAN_HPP_NAMESPACE::PushDescriptorSetInfo & pushDescriptorSetInfo,\n                                                            Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdPushDescriptorSet2 && \"Function <vkCmdPushDescriptorSet2> requires <VK_KHR_maintenance6> or <VK_VERSION_1_4>\" );\n#  endif\n\n    d.vkCmdPushDescriptorSet2( m_commandBuffer, reinterpret_cast<const VkPushDescriptorSetInfo *>( &pushDescriptorSetInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::pushDescriptorSetWithTemplate2( const VULKAN_HPP_NAMESPACE::PushDescriptorSetWithTemplateInfo * pPushDescriptorSetWithTemplateInfo,\n                                                   Dispatch const &                                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdPushDescriptorSetWithTemplate2( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                           reinterpret_cast<const VkPushDescriptorSetWithTemplateInfo *>( pPushDescriptorSetWithTemplateInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::pushDescriptorSetWithTemplate2( const VULKAN_HPP_NAMESPACE::PushDescriptorSetWithTemplateInfo & pushDescriptorSetWithTemplateInfo,\n                                                   Dispatch const &                                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdPushDescriptorSetWithTemplate2 &&\n                       \"Function <vkCmdPushDescriptorSetWithTemplate2> requires <VK_KHR_maintenance6> or <VK_VERSION_1_4>\" );\n#  endif\n\n    d.vkCmdPushDescriptorSetWithTemplate2( m_commandBuffer,\n                                           reinterpret_cast<const VkPushDescriptorSetWithTemplateInfo *>( &pushDescriptorSetWithTemplateInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::copyMemoryToImage( const VULKAN_HPP_NAMESPACE::CopyMemoryToImageInfo * pCopyMemoryToImageInfo,\n                                                                           Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkCopyMemoryToImage( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkCopyMemoryToImageInfo *>( pCopyMemoryToImageInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::copyMemoryToImage( const VULKAN_HPP_NAMESPACE::CopyMemoryToImageInfo & copyMemoryToImageInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCopyMemoryToImage && \"Function <vkCopyMemoryToImage> requires <VK_EXT_host_image_copy> or <VK_VERSION_1_4>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCopyMemoryToImage( m_device, reinterpret_cast<const VkCopyMemoryToImageInfo *>( &copyMemoryToImageInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::copyMemoryToImage\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::copyImageToMemory( const VULKAN_HPP_NAMESPACE::CopyImageToMemoryInfo * pCopyImageToMemoryInfo,\n                                                                           Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkCopyImageToMemory( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkCopyImageToMemoryInfo *>( pCopyImageToMemoryInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::copyImageToMemory( const VULKAN_HPP_NAMESPACE::CopyImageToMemoryInfo & copyImageToMemoryInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCopyImageToMemory && \"Function <vkCopyImageToMemory> requires <VK_EXT_host_image_copy> or <VK_VERSION_1_4>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCopyImageToMemory( m_device, reinterpret_cast<const VkCopyImageToMemoryInfo *>( &copyImageToMemoryInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::copyImageToMemory\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::copyImageToImage( const VULKAN_HPP_NAMESPACE::CopyImageToImageInfo * pCopyImageToImageInfo,\n                                                                          Dispatch const &                                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkCopyImageToImage( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkCopyImageToImageInfo *>( pCopyImageToImageInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::copyImageToImage( const VULKAN_HPP_NAMESPACE::CopyImageToImageInfo & copyImageToImageInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCopyImageToImage && \"Function <vkCopyImageToImage> requires <VK_EXT_host_image_copy> or <VK_VERSION_1_4>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCopyImageToImage( m_device, reinterpret_cast<const VkCopyImageToImageInfo *>( &copyImageToImageInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::copyImageToImage\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::transitionImageLayout( uint32_t                                                    transitionCount,\n                                                                               const VULKAN_HPP_NAMESPACE::HostImageLayoutTransitionInfo * pTransitions,\n                                                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkTransitionImageLayout(\n      static_cast<VkDevice>( m_device ), transitionCount, reinterpret_cast<const VkHostImageLayoutTransitionInfo *>( pTransitions ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::transitionImageLayout( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::HostImageLayoutTransitionInfo> const & transitions,\n                                   Dispatch const &                                                                                    d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkTransitionImageLayout && \"Function <vkTransitionImageLayout> requires <VK_EXT_host_image_copy> or <VK_VERSION_1_4>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkTransitionImageLayout( m_device, transitions.size(), reinterpret_cast<const VkHostImageLayoutTransitionInfo *>( transitions.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::transitionImageLayout\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_surface ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Instance::destroySurfaceKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR                  surface,\n                                                      const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                      Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroySurfaceKHR(\n      static_cast<VkInstance>( m_instance ), static_cast<VkSurfaceKHR>( surface ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Instance::destroySurfaceKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR                          surface,\n                                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                      Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroySurfaceKHR && \"Function <vkDestroySurfaceKHR> requires <VK_KHR_surface>\" );\n#  endif\n\n    d.vkDestroySurfaceKHR( m_instance,\n                           static_cast<VkSurfaceKHR>( surface ),\n                           reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Instance::destroy( VULKAN_HPP_NAMESPACE::SurfaceKHR                  surface,\n                                            const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                            Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroySurfaceKHR(\n      static_cast<VkInstance>( m_instance ), static_cast<VkSurfaceKHR>( surface ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Instance::destroy( VULKAN_HPP_NAMESPACE::SurfaceKHR                          surface,\n                                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                            Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroySurfaceKHR && \"Function <vkDestroySurfaceKHR> requires <VK_KHR_surface>\" );\n#  endif\n\n    d.vkDestroySurfaceKHR( m_instance,\n                           static_cast<VkSurfaceKHR>( surface ),\n                           reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getSurfaceSupportKHR( uint32_t                         queueFamilyIndex,\n                                                                                      VULKAN_HPP_NAMESPACE::SurfaceKHR surface,\n                                                                                      VULKAN_HPP_NAMESPACE::Bool32 *   pSupported,\n                                                                                      Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceSurfaceSupportKHR(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ), queueFamilyIndex, static_cast<VkSurfaceKHR>( surface ), reinterpret_cast<VkBool32 *>( pSupported ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::Bool32>::type\n                       PhysicalDevice::getSurfaceSupportKHR( uint32_t queueFamilyIndex, VULKAN_HPP_NAMESPACE::SurfaceKHR surface, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceSurfaceSupportKHR && \"Function <vkGetPhysicalDeviceSurfaceSupportKHR> requires <VK_KHR_surface>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Bool32 supported;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceSurfaceSupportKHR(\n      m_physicalDevice, queueFamilyIndex, static_cast<VkSurfaceKHR>( surface ), reinterpret_cast<VkBool32 *>( &supported ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfaceSupportKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( supported ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getSurfaceCapabilitiesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR               surface,\n                                                                                           VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR * pSurfaceCapabilities,\n                                                                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceSurfaceCapabilitiesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                             static_cast<VkSurfaceKHR>( surface ),\n                                                                             reinterpret_cast<VkSurfaceCapabilitiesKHR *>( pSurfaceCapabilities ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR>::type\n                       PhysicalDevice::getSurfaceCapabilitiesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceSurfaceCapabilitiesKHR && \"Function <vkGetPhysicalDeviceSurfaceCapabilitiesKHR> requires <VK_KHR_surface>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR surfaceCapabilities;\n    VULKAN_HPP_NAMESPACE::Result                 result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceSurfaceCapabilitiesKHR(\n      m_physicalDevice, static_cast<VkSurfaceKHR>( surface ), reinterpret_cast<VkSurfaceCapabilitiesKHR *>( &surfaceCapabilities ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfaceCapabilitiesKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( surfaceCapabilities ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getSurfaceFormatsKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR         surface,\n                                                                                      uint32_t *                               pSurfaceFormatCount,\n                                                                                      VULKAN_HPP_NAMESPACE::SurfaceFormatKHR * pSurfaceFormats,\n                                                                                      Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceSurfaceFormatsKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                        static_cast<VkSurfaceKHR>( surface ),\n                                                                        pSurfaceFormatCount,\n                                                                        reinterpret_cast<VkSurfaceFormatKHR *>( pSurfaceFormats ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename SurfaceFormatKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename SurfaceFormatKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::SurfaceFormatKHR>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormatKHR, SurfaceFormatKHRAllocator>>::type\n                       PhysicalDevice::getSurfaceFormatsKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceSurfaceFormatsKHR && \"Function <vkGetPhysicalDeviceSurfaceFormatsKHR> requires <VK_KHR_surface>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormatKHR, SurfaceFormatKHRAllocator> surfaceFormats;\n    uint32_t                                                                       surfaceFormatCount;\n    VULKAN_HPP_NAMESPACE::Result                                                   result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetPhysicalDeviceSurfaceFormatsKHR( m_physicalDevice, static_cast<VkSurfaceKHR>( surface ), &surfaceFormatCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && surfaceFormatCount )\n      {\n        surfaceFormats.resize( surfaceFormatCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceSurfaceFormatsKHR(\n          m_physicalDevice, static_cast<VkSurfaceKHR>( surface ), &surfaceFormatCount, reinterpret_cast<VkSurfaceFormatKHR *>( surfaceFormats.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfaceFormatsKHR\" );\n    VULKAN_HPP_ASSERT( surfaceFormatCount <= surfaceFormats.size() );\n    if ( surfaceFormatCount < surfaceFormats.size() )\n    {\n      surfaceFormats.resize( surfaceFormatCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( surfaceFormats ) );\n  }\n\n  template <typename SurfaceFormatKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename SurfaceFormatKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::SurfaceFormatKHR>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormatKHR, SurfaceFormatKHRAllocator>>::type\n                       PhysicalDevice::getSurfaceFormatsKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface,\n                                          SurfaceFormatKHRAllocator &      surfaceFormatKHRAllocator,\n                                          Dispatch const &                 d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceSurfaceFormatsKHR && \"Function <vkGetPhysicalDeviceSurfaceFormatsKHR> requires <VK_KHR_surface>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormatKHR, SurfaceFormatKHRAllocator> surfaceFormats( surfaceFormatKHRAllocator );\n    uint32_t                                                                       surfaceFormatCount;\n    VULKAN_HPP_NAMESPACE::Result                                                   result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetPhysicalDeviceSurfaceFormatsKHR( m_physicalDevice, static_cast<VkSurfaceKHR>( surface ), &surfaceFormatCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && surfaceFormatCount )\n      {\n        surfaceFormats.resize( surfaceFormatCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceSurfaceFormatsKHR(\n          m_physicalDevice, static_cast<VkSurfaceKHR>( surface ), &surfaceFormatCount, reinterpret_cast<VkSurfaceFormatKHR *>( surfaceFormats.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfaceFormatsKHR\" );\n    VULKAN_HPP_ASSERT( surfaceFormatCount <= surfaceFormats.size() );\n    if ( surfaceFormatCount < surfaceFormats.size() )\n    {\n      surfaceFormats.resize( surfaceFormatCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( surfaceFormats ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getSurfacePresentModesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR       surface,\n                                                                                           uint32_t *                             pPresentModeCount,\n                                                                                           VULKAN_HPP_NAMESPACE::PresentModeKHR * pPresentModes,\n                                                                                           Dispatch const &                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceSurfacePresentModesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                             static_cast<VkSurfaceKHR>( surface ),\n                                                                             pPresentModeCount,\n                                                                             reinterpret_cast<VkPresentModeKHR *>( pPresentModes ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename PresentModeKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename PresentModeKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PresentModeKHR>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR, PresentModeKHRAllocator>>::type\n                       PhysicalDevice::getSurfacePresentModesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceSurfacePresentModesKHR && \"Function <vkGetPhysicalDeviceSurfacePresentModesKHR> requires <VK_KHR_surface>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR, PresentModeKHRAllocator> presentModes;\n    uint32_t                                                                   presentModeCount;\n    VULKAN_HPP_NAMESPACE::Result                                               result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetPhysicalDeviceSurfacePresentModesKHR( m_physicalDevice, static_cast<VkSurfaceKHR>( surface ), &presentModeCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && presentModeCount )\n      {\n        presentModes.resize( presentModeCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceSurfacePresentModesKHR(\n          m_physicalDevice, static_cast<VkSurfaceKHR>( surface ), &presentModeCount, reinterpret_cast<VkPresentModeKHR *>( presentModes.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfacePresentModesKHR\" );\n    VULKAN_HPP_ASSERT( presentModeCount <= presentModes.size() );\n    if ( presentModeCount < presentModes.size() )\n    {\n      presentModes.resize( presentModeCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( presentModes ) );\n  }\n\n  template <typename PresentModeKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename PresentModeKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PresentModeKHR>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR, PresentModeKHRAllocator>>::type\n                       PhysicalDevice::getSurfacePresentModesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface,\n                                               PresentModeKHRAllocator &        presentModeKHRAllocator,\n                                               Dispatch const &                 d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceSurfacePresentModesKHR && \"Function <vkGetPhysicalDeviceSurfacePresentModesKHR> requires <VK_KHR_surface>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR, PresentModeKHRAllocator> presentModes( presentModeKHRAllocator );\n    uint32_t                                                                   presentModeCount;\n    VULKAN_HPP_NAMESPACE::Result                                               result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetPhysicalDeviceSurfacePresentModesKHR( m_physicalDevice, static_cast<VkSurfaceKHR>( surface ), &presentModeCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && presentModeCount )\n      {\n        presentModes.resize( presentModeCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceSurfacePresentModesKHR(\n          m_physicalDevice, static_cast<VkSurfaceKHR>( surface ), &presentModeCount, reinterpret_cast<VkPresentModeKHR *>( presentModes.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfacePresentModesKHR\" );\n    VULKAN_HPP_ASSERT( presentModeCount <= presentModes.size() );\n    if ( presentModeCount < presentModes.size() )\n    {\n      presentModes.resize( presentModeCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( presentModes ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_swapchain ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createSwapchainKHR( const VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR * pCreateInfo,\n                                                                            const VULKAN_HPP_NAMESPACE::AllocationCallbacks *    pAllocator,\n                                                                            VULKAN_HPP_NAMESPACE::SwapchainKHR *                 pSwapchain,\n                                                                            Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateSwapchainKHR( static_cast<VkDevice>( m_device ),\n                                                        reinterpret_cast<const VkSwapchainCreateInfoKHR *>( pCreateInfo ),\n                                                        reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                        reinterpret_cast<VkSwapchainKHR *>( pSwapchain ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::SwapchainKHR>::type\n                       Device::createSwapchainKHR( const VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR &      createInfo,\n                                Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateSwapchainKHR && \"Function <vkCreateSwapchainKHR> requires <VK_KHR_swapchain>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain;\n    VULKAN_HPP_NAMESPACE::Result       result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateSwapchainKHR( m_device,\n                              reinterpret_cast<const VkSwapchainCreateInfoKHR *>( &createInfo ),\n                              reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                              reinterpret_cast<VkSwapchainKHR *>( &swapchain ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createSwapchainKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( swapchain ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SwapchainKHR, Dispatch>>::type\n                       Device::createSwapchainKHRUnique( const VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR &      createInfo,\n                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                      Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateSwapchainKHR && \"Function <vkCreateSwapchainKHR> requires <VK_KHR_swapchain>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain;\n    VULKAN_HPP_NAMESPACE::Result       result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateSwapchainKHR( m_device,\n                              reinterpret_cast<const VkSwapchainCreateInfoKHR *>( &createInfo ),\n                              reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                              reinterpret_cast<VkSwapchainKHR *>( &swapchain ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createSwapchainKHRUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::SwapchainKHR, Dispatch>( swapchain, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroySwapchainKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR                swapchain,\n                                                      const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                      Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroySwapchainKHR(\n      static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( swapchain ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroySwapchainKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR                        swapchain,\n                                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                      Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroySwapchainKHR && \"Function <vkDestroySwapchainKHR> requires <VK_KHR_swapchain>\" );\n#  endif\n\n    d.vkDestroySwapchainKHR( m_device,\n                             static_cast<VkSwapchainKHR>( swapchain ),\n                             reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::SwapchainKHR                swapchain,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroySwapchainKHR(\n      static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( swapchain ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::SwapchainKHR                        swapchain,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroySwapchainKHR && \"Function <vkDestroySwapchainKHR> requires <VK_KHR_swapchain>\" );\n#  endif\n\n    d.vkDestroySwapchainKHR( m_device,\n                             static_cast<VkSwapchainKHR>( swapchain ),\n                             reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getSwapchainImagesKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain,\n                                                                               uint32_t *                         pSwapchainImageCount,\n                                                                               VULKAN_HPP_NAMESPACE::Image *      pSwapchainImages,\n                                                                               Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetSwapchainImagesKHR(\n      static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( swapchain ), pSwapchainImageCount, reinterpret_cast<VkImage *>( pSwapchainImages ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename ImageAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename ImageAllocator::value_type, VULKAN_HPP_NAMESPACE::Image>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::Image, ImageAllocator>>::type\n                       Device::getSwapchainImagesKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetSwapchainImagesKHR && \"Function <vkGetSwapchainImagesKHR> requires <VK_KHR_swapchain>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Image, ImageAllocator> swapchainImages;\n    uint32_t                                                 swapchainImageCount;\n    VULKAN_HPP_NAMESPACE::Result                             result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetSwapchainImagesKHR( m_device, static_cast<VkSwapchainKHR>( swapchain ), &swapchainImageCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && swapchainImageCount )\n      {\n        swapchainImages.resize( swapchainImageCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetSwapchainImagesKHR(\n          m_device, static_cast<VkSwapchainKHR>( swapchain ), &swapchainImageCount, reinterpret_cast<VkImage *>( swapchainImages.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getSwapchainImagesKHR\" );\n    VULKAN_HPP_ASSERT( swapchainImageCount <= swapchainImages.size() );\n    if ( swapchainImageCount < swapchainImages.size() )\n    {\n      swapchainImages.resize( swapchainImageCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( swapchainImages ) );\n  }\n\n  template <typename ImageAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename ImageAllocator::value_type, VULKAN_HPP_NAMESPACE::Image>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::Image, ImageAllocator>>::type\n                       Device::getSwapchainImagesKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, ImageAllocator & imageAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetSwapchainImagesKHR && \"Function <vkGetSwapchainImagesKHR> requires <VK_KHR_swapchain>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Image, ImageAllocator> swapchainImages( imageAllocator );\n    uint32_t                                                 swapchainImageCount;\n    VULKAN_HPP_NAMESPACE::Result                             result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetSwapchainImagesKHR( m_device, static_cast<VkSwapchainKHR>( swapchain ), &swapchainImageCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && swapchainImageCount )\n      {\n        swapchainImages.resize( swapchainImageCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetSwapchainImagesKHR(\n          m_device, static_cast<VkSwapchainKHR>( swapchain ), &swapchainImageCount, reinterpret_cast<VkImage *>( swapchainImages.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getSwapchainImagesKHR\" );\n    VULKAN_HPP_ASSERT( swapchainImageCount <= swapchainImages.size() );\n    if ( swapchainImageCount < swapchainImages.size() )\n    {\n      swapchainImages.resize( swapchainImageCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( swapchainImages ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::acquireNextImageKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain,\n                                                                             uint64_t                           timeout,\n                                                                             VULKAN_HPP_NAMESPACE::Semaphore    semaphore,\n                                                                             VULKAN_HPP_NAMESPACE::Fence        fence,\n                                                                             uint32_t *                         pImageIndex,\n                                                                             Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkAcquireNextImageKHR( static_cast<VkDevice>( m_device ),\n                                                         static_cast<VkSwapchainKHR>( swapchain ),\n                                                         timeout,\n                                                         static_cast<VkSemaphore>( semaphore ),\n                                                         static_cast<VkFence>( fence ),\n                                                         pImageIndex ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<uint32_t> Device::acquireNextImageKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain,\n                                                                                            uint64_t                           timeout,\n                                                                                            VULKAN_HPP_NAMESPACE::Semaphore    semaphore,\n                                                                                            VULKAN_HPP_NAMESPACE::Fence        fence,\n                                                                                            Dispatch const &                   d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkAcquireNextImageKHR && \"Function <vkAcquireNextImageKHR> requires <VK_KHR_swapchain>\" );\n#  endif\n\n    uint32_t                     imageIndex;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkAcquireNextImageKHR(\n      m_device, static_cast<VkSwapchainKHR>( swapchain ), timeout, static_cast<VkSemaphore>( semaphore ), static_cast<VkFence>( fence ), &imageIndex ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::acquireNextImageKHR\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess,\n                                                 VULKAN_HPP_NAMESPACE::Result::eTimeout,\n                                                 VULKAN_HPP_NAMESPACE::Result::eNotReady,\n                                                 VULKAN_HPP_NAMESPACE::Result::eSuboptimalKHR } );\n\n    return ResultValue<uint32_t>( result, std::move( imageIndex ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Queue::presentKHR( const VULKAN_HPP_NAMESPACE::PresentInfoKHR * pPresentInfo,\n                                                                   Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkQueuePresentKHR( static_cast<VkQueue>( m_queue ), reinterpret_cast<const VkPresentInfoKHR *>( pPresentInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result Queue::presentKHR( const VULKAN_HPP_NAMESPACE::PresentInfoKHR & presentInfo,\n                                                                                         Dispatch const &                             d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkQueuePresentKHR && \"Function <vkQueuePresentKHR> requires <VK_KHR_swapchain>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkQueuePresentKHR( m_queue, reinterpret_cast<const VkPresentInfoKHR *>( &presentInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck(\n      result, VULKAN_HPP_NAMESPACE_STRING \"::Queue::presentKHR\", { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eSuboptimalKHR } );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getGroupPresentCapabilitiesKHR(\n    VULKAN_HPP_NAMESPACE::DeviceGroupPresentCapabilitiesKHR * pDeviceGroupPresentCapabilities, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetDeviceGroupPresentCapabilitiesKHR(\n      static_cast<VkDevice>( m_device ), reinterpret_cast<VkDeviceGroupPresentCapabilitiesKHR *>( pDeviceGroupPresentCapabilities ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::DeviceGroupPresentCapabilitiesKHR>::type\n                       Device::getGroupPresentCapabilitiesKHR( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceGroupPresentCapabilitiesKHR &&\n                       \"Function <vkGetDeviceGroupPresentCapabilitiesKHR> requires <VK_KHR_device_group> or <VK_KHR_swapchain>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::DeviceGroupPresentCapabilitiesKHR deviceGroupPresentCapabilities;\n    VULKAN_HPP_NAMESPACE::Result                            result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetDeviceGroupPresentCapabilitiesKHR( m_device, reinterpret_cast<VkDeviceGroupPresentCapabilitiesKHR *>( &deviceGroupPresentCapabilities ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getGroupPresentCapabilitiesKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( deviceGroupPresentCapabilities ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getGroupSurfacePresentModesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR                       surface,\n                                                                                        VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR * pModes,\n                                                                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetDeviceGroupSurfacePresentModesKHR(\n      static_cast<VkDevice>( m_device ), static_cast<VkSurfaceKHR>( surface ), reinterpret_cast<VkDeviceGroupPresentModeFlagsKHR *>( pModes ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR>::type\n                       Device::getGroupSurfacePresentModesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceGroupSurfacePresentModesKHR &&\n                       \"Function <vkGetDeviceGroupSurfacePresentModesKHR> requires <VK_KHR_device_group> or <VK_KHR_swapchain>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR modes;\n    VULKAN_HPP_NAMESPACE::Result                         result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetDeviceGroupSurfacePresentModesKHR(\n      m_device, static_cast<VkSurfaceKHR>( surface ), reinterpret_cast<VkDeviceGroupPresentModeFlagsKHR *>( &modes ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getGroupSurfacePresentModesKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( modes ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getPresentRectanglesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface,\n                                                                                         uint32_t *                       pRectCount,\n                                                                                         VULKAN_HPP_NAMESPACE::Rect2D *   pRects,\n                                                                                         Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDevicePresentRectanglesKHR(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ), static_cast<VkSurfaceKHR>( surface ), pRectCount, reinterpret_cast<VkRect2D *>( pRects ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Rect2DAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename Rect2DAllocator::value_type, VULKAN_HPP_NAMESPACE::Rect2D>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::Rect2D, Rect2DAllocator>>::type\n                       PhysicalDevice::getPresentRectanglesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDevicePresentRectanglesKHR &&\n                       \"Function <vkGetPhysicalDevicePresentRectanglesKHR> requires <VK_KHR_device_group> or <VK_KHR_swapchain>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Rect2D, Rect2DAllocator> rects;\n    uint32_t                                                   rectCount;\n    VULKAN_HPP_NAMESPACE::Result                               result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetPhysicalDevicePresentRectanglesKHR( m_physicalDevice, static_cast<VkSurfaceKHR>( surface ), &rectCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && rectCount )\n      {\n        rects.resize( rectCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDevicePresentRectanglesKHR(\n          m_physicalDevice, static_cast<VkSurfaceKHR>( surface ), &rectCount, reinterpret_cast<VkRect2D *>( rects.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getPresentRectanglesKHR\" );\n    VULKAN_HPP_ASSERT( rectCount <= rects.size() );\n    if ( rectCount < rects.size() )\n    {\n      rects.resize( rectCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( rects ) );\n  }\n\n  template <typename Rect2DAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename Rect2DAllocator::value_type, VULKAN_HPP_NAMESPACE::Rect2D>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::Rect2D, Rect2DAllocator>>::type\n    PhysicalDevice::getPresentRectanglesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface, Rect2DAllocator & rect2DAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDevicePresentRectanglesKHR &&\n                       \"Function <vkGetPhysicalDevicePresentRectanglesKHR> requires <VK_KHR_device_group> or <VK_KHR_swapchain>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Rect2D, Rect2DAllocator> rects( rect2DAllocator );\n    uint32_t                                                   rectCount;\n    VULKAN_HPP_NAMESPACE::Result                               result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetPhysicalDevicePresentRectanglesKHR( m_physicalDevice, static_cast<VkSurfaceKHR>( surface ), &rectCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && rectCount )\n      {\n        rects.resize( rectCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDevicePresentRectanglesKHR(\n          m_physicalDevice, static_cast<VkSurfaceKHR>( surface ), &rectCount, reinterpret_cast<VkRect2D *>( rects.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getPresentRectanglesKHR\" );\n    VULKAN_HPP_ASSERT( rectCount <= rects.size() );\n    if ( rectCount < rects.size() )\n    {\n      rects.resize( rectCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( rects ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::acquireNextImage2KHR( const VULKAN_HPP_NAMESPACE::AcquireNextImageInfoKHR * pAcquireInfo,\n                                                                              uint32_t *                                            pImageIndex,\n                                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkAcquireNextImage2KHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkAcquireNextImageInfoKHR *>( pAcquireInfo ), pImageIndex ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<uint32_t> Device::acquireNextImage2KHR( const VULKAN_HPP_NAMESPACE::AcquireNextImageInfoKHR & acquireInfo,\n                                                                                             Dispatch const &                                      d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkAcquireNextImage2KHR && \"Function <vkAcquireNextImage2KHR> requires <VK_KHR_device_group> or <VK_KHR_swapchain>\" );\n#  endif\n\n    uint32_t                     imageIndex;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkAcquireNextImage2KHR( m_device, reinterpret_cast<const VkAcquireNextImageInfoKHR *>( &acquireInfo ), &imageIndex ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::acquireNextImage2KHR\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess,\n                                                 VULKAN_HPP_NAMESPACE::Result::eTimeout,\n                                                 VULKAN_HPP_NAMESPACE::Result::eNotReady,\n                                                 VULKAN_HPP_NAMESPACE::Result::eSuboptimalKHR } );\n\n    return ResultValue<uint32_t>( result, std::move( imageIndex ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_display ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getDisplayPropertiesKHR( uint32_t *                                   pPropertyCount,\n                                                                                         VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR * pProperties,\n                                                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceDisplayPropertiesKHR(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ), pPropertyCount, reinterpret_cast<VkDisplayPropertiesKHR *>( pProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <\n    typename DisplayPropertiesKHRAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename DisplayPropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR, DisplayPropertiesKHRAllocator>>::type\n                       PhysicalDevice::getDisplayPropertiesKHR( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceDisplayPropertiesKHR && \"Function <vkGetPhysicalDeviceDisplayPropertiesKHR> requires <VK_KHR_display>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR, DisplayPropertiesKHRAllocator> properties;\n    uint32_t                                                                               propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                           result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceDisplayPropertiesKHR( m_physicalDevice, &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceDisplayPropertiesKHR( m_physicalDevice, &propertyCount, reinterpret_cast<VkDisplayPropertiesKHR *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDisplayPropertiesKHR\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n\n  template <\n    typename DisplayPropertiesKHRAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename DisplayPropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR, DisplayPropertiesKHRAllocator>>::type\n                       PhysicalDevice::getDisplayPropertiesKHR( DisplayPropertiesKHRAllocator & displayPropertiesKHRAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceDisplayPropertiesKHR && \"Function <vkGetPhysicalDeviceDisplayPropertiesKHR> requires <VK_KHR_display>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR, DisplayPropertiesKHRAllocator> properties( displayPropertiesKHRAllocator );\n    uint32_t                                                                               propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                           result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceDisplayPropertiesKHR( m_physicalDevice, &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceDisplayPropertiesKHR( m_physicalDevice, &propertyCount, reinterpret_cast<VkDisplayPropertiesKHR *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDisplayPropertiesKHR\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getDisplayPlanePropertiesKHR( uint32_t *                                        pPropertyCount,\n                                                                                              VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR * pProperties,\n                                                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceDisplayPlanePropertiesKHR(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ), pPropertyCount, reinterpret_cast<VkDisplayPlanePropertiesKHR *>( pProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <\n    typename DisplayPlanePropertiesKHRAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename DisplayPlanePropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR, DisplayPlanePropertiesKHRAllocator>>::type\n    PhysicalDevice::getDisplayPlanePropertiesKHR( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceDisplayPlanePropertiesKHR && \"Function <vkGetPhysicalDeviceDisplayPlanePropertiesKHR> requires <VK_KHR_display>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR, DisplayPlanePropertiesKHRAllocator> properties;\n    uint32_t                                                                                         propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                     result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceDisplayPlanePropertiesKHR( m_physicalDevice, &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceDisplayPlanePropertiesKHR(\n          m_physicalDevice, &propertyCount, reinterpret_cast<VkDisplayPlanePropertiesKHR *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDisplayPlanePropertiesKHR\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n\n  template <\n    typename DisplayPlanePropertiesKHRAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename DisplayPlanePropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR, DisplayPlanePropertiesKHRAllocator>>::type\n    PhysicalDevice::getDisplayPlanePropertiesKHR( DisplayPlanePropertiesKHRAllocator & displayPlanePropertiesKHRAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceDisplayPlanePropertiesKHR && \"Function <vkGetPhysicalDeviceDisplayPlanePropertiesKHR> requires <VK_KHR_display>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR, DisplayPlanePropertiesKHRAllocator> properties( displayPlanePropertiesKHRAllocator );\n    uint32_t                                                                                         propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                     result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceDisplayPlanePropertiesKHR( m_physicalDevice, &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceDisplayPlanePropertiesKHR(\n          m_physicalDevice, &propertyCount, reinterpret_cast<VkDisplayPlanePropertiesKHR *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDisplayPlanePropertiesKHR\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getDisplayPlaneSupportedDisplaysKHR( uint32_t                           planeIndex,\n                                                                                                     uint32_t *                         pDisplayCount,\n                                                                                                     VULKAN_HPP_NAMESPACE::DisplayKHR * pDisplays,\n                                                                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetDisplayPlaneSupportedDisplaysKHR(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ), planeIndex, pDisplayCount, reinterpret_cast<VkDisplayKHR *>( pDisplays ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename DisplayKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename DisplayKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayKHR>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayKHR, DisplayKHRAllocator>>::type\n                       PhysicalDevice::getDisplayPlaneSupportedDisplaysKHR( uint32_t planeIndex, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDisplayPlaneSupportedDisplaysKHR && \"Function <vkGetDisplayPlaneSupportedDisplaysKHR> requires <VK_KHR_display>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::DisplayKHR, DisplayKHRAllocator> displays;\n    uint32_t                                                           displayCount;\n    VULKAN_HPP_NAMESPACE::Result                                       result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetDisplayPlaneSupportedDisplaysKHR( m_physicalDevice, planeIndex, &displayCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && displayCount )\n      {\n        displays.resize( displayCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetDisplayPlaneSupportedDisplaysKHR( m_physicalDevice, planeIndex, &displayCount, reinterpret_cast<VkDisplayKHR *>( displays.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDisplayPlaneSupportedDisplaysKHR\" );\n    VULKAN_HPP_ASSERT( displayCount <= displays.size() );\n    if ( displayCount < displays.size() )\n    {\n      displays.resize( displayCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( displays ) );\n  }\n\n  template <typename DisplayKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename DisplayKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayKHR>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayKHR, DisplayKHRAllocator>>::type\n    PhysicalDevice::getDisplayPlaneSupportedDisplaysKHR( uint32_t planeIndex, DisplayKHRAllocator & displayKHRAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDisplayPlaneSupportedDisplaysKHR && \"Function <vkGetDisplayPlaneSupportedDisplaysKHR> requires <VK_KHR_display>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::DisplayKHR, DisplayKHRAllocator> displays( displayKHRAllocator );\n    uint32_t                                                           displayCount;\n    VULKAN_HPP_NAMESPACE::Result                                       result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetDisplayPlaneSupportedDisplaysKHR( m_physicalDevice, planeIndex, &displayCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && displayCount )\n      {\n        displays.resize( displayCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetDisplayPlaneSupportedDisplaysKHR( m_physicalDevice, planeIndex, &displayCount, reinterpret_cast<VkDisplayKHR *>( displays.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDisplayPlaneSupportedDisplaysKHR\" );\n    VULKAN_HPP_ASSERT( displayCount <= displays.size() );\n    if ( displayCount < displays.size() )\n    {\n      displays.resize( displayCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( displays ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getDisplayModePropertiesKHR( VULKAN_HPP_NAMESPACE::DisplayKHR                 display,\n                                                                                             uint32_t *                                       pPropertyCount,\n                                                                                             VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR * pProperties,\n                                                                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetDisplayModePropertiesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                 static_cast<VkDisplayKHR>( display ),\n                                                                 pPropertyCount,\n                                                                 reinterpret_cast<VkDisplayModePropertiesKHR *>( pProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename DisplayModePropertiesKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename DisplayModePropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR>::value,\n                                    int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR, DisplayModePropertiesKHRAllocator>>::type\n    PhysicalDevice::getDisplayModePropertiesKHR( VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDisplayModePropertiesKHR && \"Function <vkGetDisplayModePropertiesKHR> requires <VK_KHR_display>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR, DisplayModePropertiesKHRAllocator> properties;\n    uint32_t                                                                                       propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                   result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetDisplayModePropertiesKHR( m_physicalDevice, static_cast<VkDisplayKHR>( display ), &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetDisplayModePropertiesKHR(\n          m_physicalDevice, static_cast<VkDisplayKHR>( display ), &propertyCount, reinterpret_cast<VkDisplayModePropertiesKHR *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDisplayModePropertiesKHR\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n\n  template <typename DisplayModePropertiesKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename DisplayModePropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR>::value,\n                                    int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR, DisplayModePropertiesKHRAllocator>>::type\n    PhysicalDevice::getDisplayModePropertiesKHR( VULKAN_HPP_NAMESPACE::DisplayKHR    display,\n                                                 DisplayModePropertiesKHRAllocator & displayModePropertiesKHRAllocator,\n                                                 Dispatch const &                    d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDisplayModePropertiesKHR && \"Function <vkGetDisplayModePropertiesKHR> requires <VK_KHR_display>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR, DisplayModePropertiesKHRAllocator> properties( displayModePropertiesKHRAllocator );\n    uint32_t                                                                                       propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                   result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetDisplayModePropertiesKHR( m_physicalDevice, static_cast<VkDisplayKHR>( display ), &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetDisplayModePropertiesKHR(\n          m_physicalDevice, static_cast<VkDisplayKHR>( display ), &propertyCount, reinterpret_cast<VkDisplayModePropertiesKHR *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDisplayModePropertiesKHR\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::createDisplayModeKHR( VULKAN_HPP_NAMESPACE::DisplayKHR                       display,\n                                                                                      const VULKAN_HPP_NAMESPACE::DisplayModeCreateInfoKHR * pCreateInfo,\n                                                                                      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *      pAllocator,\n                                                                                      VULKAN_HPP_NAMESPACE::DisplayModeKHR *                 pMode,\n                                                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateDisplayModeKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                          static_cast<VkDisplayKHR>( display ),\n                                                          reinterpret_cast<const VkDisplayModeCreateInfoKHR *>( pCreateInfo ),\n                                                          reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                          reinterpret_cast<VkDisplayModeKHR *>( pMode ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::DisplayModeKHR>::type\n                       PhysicalDevice::createDisplayModeKHR( VULKAN_HPP_NAMESPACE::DisplayKHR                          display,\n                                          const VULKAN_HPP_NAMESPACE::DisplayModeCreateInfoKHR &    createInfo,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateDisplayModeKHR && \"Function <vkCreateDisplayModeKHR> requires <VK_KHR_display>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::DisplayModeKHR mode;\n    VULKAN_HPP_NAMESPACE::Result         result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateDisplayModeKHR( m_physicalDevice,\n                                static_cast<VkDisplayKHR>( display ),\n                                reinterpret_cast<const VkDisplayModeCreateInfoKHR *>( &createInfo ),\n                                reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                                reinterpret_cast<VkDisplayModeKHR *>( &mode ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::createDisplayModeKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( mode ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DisplayModeKHR, Dispatch>>::type\n                       PhysicalDevice::createDisplayModeKHRUnique( VULKAN_HPP_NAMESPACE::DisplayKHR                          display,\n                                                const VULKAN_HPP_NAMESPACE::DisplayModeCreateInfoKHR &    createInfo,\n                                                Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateDisplayModeKHR && \"Function <vkCreateDisplayModeKHR> requires <VK_KHR_display>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::DisplayModeKHR mode;\n    VULKAN_HPP_NAMESPACE::Result         result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateDisplayModeKHR( m_physicalDevice,\n                                static_cast<VkDisplayKHR>( display ),\n                                reinterpret_cast<const VkDisplayModeCreateInfoKHR *>( &createInfo ),\n                                reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                                reinterpret_cast<VkDisplayModeKHR *>( &mode ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::createDisplayModeKHRUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::DisplayModeKHR, Dispatch>( mode, detail::ObjectDestroy<PhysicalDevice, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    PhysicalDevice::getDisplayPlaneCapabilitiesKHR( VULKAN_HPP_NAMESPACE::DisplayModeKHR                mode,\n                                                    uint32_t                                            planeIndex,\n                                                    VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR * pCapabilities,\n                                                    Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetDisplayPlaneCapabilitiesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                    static_cast<VkDisplayModeKHR>( mode ),\n                                                                    planeIndex,\n                                                                    reinterpret_cast<VkDisplayPlaneCapabilitiesKHR *>( pCapabilities ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR>::type\n    PhysicalDevice::getDisplayPlaneCapabilitiesKHR( VULKAN_HPP_NAMESPACE::DisplayModeKHR mode, uint32_t planeIndex, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDisplayPlaneCapabilitiesKHR && \"Function <vkGetDisplayPlaneCapabilitiesKHR> requires <VK_KHR_display>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR capabilities;\n    VULKAN_HPP_NAMESPACE::Result                      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetDisplayPlaneCapabilitiesKHR(\n      m_physicalDevice, static_cast<VkDisplayModeKHR>( mode ), planeIndex, reinterpret_cast<VkDisplayPlaneCapabilitiesKHR *>( &capabilities ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDisplayPlaneCapabilitiesKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( capabilities ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Instance::createDisplayPlaneSurfaceKHR( const VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateInfoKHR * pCreateInfo,\n                                                                                        const VULKAN_HPP_NAMESPACE::AllocationCallbacks *         pAllocator,\n                                                                                        VULKAN_HPP_NAMESPACE::SurfaceKHR *                        pSurface,\n                                                                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateDisplayPlaneSurfaceKHR( static_cast<VkInstance>( m_instance ),\n                                                                  reinterpret_cast<const VkDisplaySurfaceCreateInfoKHR *>( pCreateInfo ),\n                                                                  reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                                  reinterpret_cast<VkSurfaceKHR *>( pSurface ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n                       Instance::createDisplayPlaneSurfaceKHR( const VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateInfoKHR & createInfo,\n                                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                            Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateDisplayPlaneSurfaceKHR && \"Function <vkCreateDisplayPlaneSurfaceKHR> requires <VK_KHR_display>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateDisplayPlaneSurfaceKHR(\n      m_instance,\n      reinterpret_cast<const VkDisplaySurfaceCreateInfoKHR *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createDisplayPlaneSurfaceKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( surface ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n                       Instance::createDisplayPlaneSurfaceKHRUnique( const VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateInfoKHR & createInfo,\n                                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                  Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateDisplayPlaneSurfaceKHR && \"Function <vkCreateDisplayPlaneSurfaceKHR> requires <VK_KHR_display>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateDisplayPlaneSurfaceKHR(\n      m_instance,\n      reinterpret_cast<const VkDisplaySurfaceCreateInfoKHR *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createDisplayPlaneSurfaceKHRUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>( surface, detail::ObjectDestroy<Instance, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_display_swapchain ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createSharedSwapchainsKHR( uint32_t                                             swapchainCount,\n                                                                                   const VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR * pCreateInfos,\n                                                                                   const VULKAN_HPP_NAMESPACE::AllocationCallbacks *    pAllocator,\n                                                                                   VULKAN_HPP_NAMESPACE::SwapchainKHR *                 pSwapchains,\n                                                                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateSharedSwapchainsKHR( static_cast<VkDevice>( m_device ),\n                                                               swapchainCount,\n                                                               reinterpret_cast<const VkSwapchainCreateInfoKHR *>( pCreateInfos ),\n                                                               reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                               reinterpret_cast<VkSwapchainKHR *>( pSwapchains ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename SwapchainKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename SwapchainKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::SwapchainKHR>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::SwapchainKHR, SwapchainKHRAllocator>>::type\n    Device::createSharedSwapchainsKHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR> const & createInfos,\n                                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                    allocator,\n                                       Dispatch const &                                                                             d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateSharedSwapchainsKHR && \"Function <vkCreateSharedSwapchainsKHR> requires <VK_KHR_display_swapchain>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SwapchainKHR, SwapchainKHRAllocator> swapchains( createInfos.size() );\n    VULKAN_HPP_NAMESPACE::Result                                           result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateSharedSwapchainsKHR(\n      m_device,\n      createInfos.size(),\n      reinterpret_cast<const VkSwapchainCreateInfoKHR *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSwapchainKHR *>( swapchains.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createSharedSwapchainsKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( swapchains ) );\n  }\n\n  template <typename SwapchainKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename SwapchainKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::SwapchainKHR>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::SwapchainKHR, SwapchainKHRAllocator>>::type\n    Device::createSharedSwapchainsKHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR> const & createInfos,\n                                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                    allocator,\n                                       SwapchainKHRAllocator &                                                                      swapchainKHRAllocator,\n                                       Dispatch const &                                                                             d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateSharedSwapchainsKHR && \"Function <vkCreateSharedSwapchainsKHR> requires <VK_KHR_display_swapchain>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SwapchainKHR, SwapchainKHRAllocator> swapchains( createInfos.size(), swapchainKHRAllocator );\n    VULKAN_HPP_NAMESPACE::Result                                           result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateSharedSwapchainsKHR(\n      m_device,\n      createInfos.size(),\n      reinterpret_cast<const VkSwapchainCreateInfoKHR *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSwapchainKHR *>( swapchains.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createSharedSwapchainsKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( swapchains ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::SwapchainKHR>::type\n                       Device::createSharedSwapchainKHR( const VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR &      createInfo,\n                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                      Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateSharedSwapchainsKHR && \"Function <vkCreateSharedSwapchainsKHR> requires <VK_KHR_display_swapchain>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain;\n    VULKAN_HPP_NAMESPACE::Result       result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateSharedSwapchainsKHR(\n      m_device,\n      1,\n      reinterpret_cast<const VkSwapchainCreateInfoKHR *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSwapchainKHR *>( &swapchain ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createSharedSwapchainKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( swapchain ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch,\n            typename SwapchainKHRAllocator,\n            typename std::enable_if<std::is_same<typename SwapchainKHRAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::SwapchainKHR, Dispatch>>::value,\n                                    int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::SwapchainKHR, Dispatch>, SwapchainKHRAllocator>>::type\n    Device::createSharedSwapchainsKHRUnique( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR> const & createInfos,\n                                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                    allocator,\n                                             Dispatch const &                                                                             d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateSharedSwapchainsKHR && \"Function <vkCreateSharedSwapchainsKHR> requires <VK_KHR_display_swapchain>\" );\n#    endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SwapchainKHR> swapchains( createInfos.size() );\n    VULKAN_HPP_NAMESPACE::Result                    result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateSharedSwapchainsKHR(\n      m_device,\n      createInfos.size(),\n      reinterpret_cast<const VkSwapchainCreateInfoKHR *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSwapchainKHR *>( swapchains.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createSharedSwapchainsKHRUnique\" );\n    std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::SwapchainKHR, Dispatch>, SwapchainKHRAllocator> uniqueSwapchains;\n    uniqueSwapchains.reserve( createInfos.size() );\n    detail::ObjectDestroy<Device, Dispatch> deleter( *this, allocator, d );\n    for ( auto const & swapchain : swapchains )\n    {\n      uniqueSwapchains.push_back( UniqueHandle<SwapchainKHR, Dispatch>( swapchain, deleter ) );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( uniqueSwapchains ) );\n  }\n\n  template <typename Dispatch,\n            typename SwapchainKHRAllocator,\n            typename std::enable_if<std::is_same<typename SwapchainKHRAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::SwapchainKHR, Dispatch>>::value,\n                                    int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::SwapchainKHR, Dispatch>, SwapchainKHRAllocator>>::type\n    Device::createSharedSwapchainsKHRUnique( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR> const & createInfos,\n                                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                    allocator,\n                                             SwapchainKHRAllocator &                                                                      swapchainKHRAllocator,\n                                             Dispatch const &                                                                             d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateSharedSwapchainsKHR && \"Function <vkCreateSharedSwapchainsKHR> requires <VK_KHR_display_swapchain>\" );\n#    endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SwapchainKHR> swapchains( createInfos.size() );\n    VULKAN_HPP_NAMESPACE::Result                    result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateSharedSwapchainsKHR(\n      m_device,\n      createInfos.size(),\n      reinterpret_cast<const VkSwapchainCreateInfoKHR *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSwapchainKHR *>( swapchains.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createSharedSwapchainsKHRUnique\" );\n    std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::SwapchainKHR, Dispatch>, SwapchainKHRAllocator> uniqueSwapchains( swapchainKHRAllocator );\n    uniqueSwapchains.reserve( createInfos.size() );\n    detail::ObjectDestroy<Device, Dispatch> deleter( *this, allocator, d );\n    for ( auto const & swapchain : swapchains )\n    {\n      uniqueSwapchains.push_back( UniqueHandle<SwapchainKHR, Dispatch>( swapchain, deleter ) );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( uniqueSwapchains ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SwapchainKHR, Dispatch>>::type\n                       Device::createSharedSwapchainKHRUnique( const VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR &      createInfo,\n                                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                            Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateSharedSwapchainsKHR && \"Function <vkCreateSharedSwapchainsKHR> requires <VK_KHR_display_swapchain>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain;\n    VULKAN_HPP_NAMESPACE::Result       result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateSharedSwapchainsKHR(\n      m_device,\n      1,\n      reinterpret_cast<const VkSwapchainCreateInfoKHR *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSwapchainKHR *>( &swapchain ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createSharedSwapchainKHRUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::SwapchainKHR, Dispatch>( swapchain, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_USE_PLATFORM_XLIB_KHR )\n  //=== VK_KHR_xlib_surface ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Instance::createXlibSurfaceKHR( const VULKAN_HPP_NAMESPACE::XlibSurfaceCreateInfoKHR * pCreateInfo,\n                                                                                const VULKAN_HPP_NAMESPACE::AllocationCallbacks *      pAllocator,\n                                                                                VULKAN_HPP_NAMESPACE::SurfaceKHR *                     pSurface,\n                                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateXlibSurfaceKHR( static_cast<VkInstance>( m_instance ),\n                                                          reinterpret_cast<const VkXlibSurfaceCreateInfoKHR *>( pCreateInfo ),\n                                                          reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                          reinterpret_cast<VkSurfaceKHR *>( pSurface ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n                       Instance::createXlibSurfaceKHR( const VULKAN_HPP_NAMESPACE::XlibSurfaceCreateInfoKHR &    createInfo,\n                                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                    Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateXlibSurfaceKHR && \"Function <vkCreateXlibSurfaceKHR> requires <VK_KHR_xlib_surface>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateXlibSurfaceKHR( m_instance,\n                                reinterpret_cast<const VkXlibSurfaceCreateInfoKHR *>( &createInfo ),\n                                reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                                reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createXlibSurfaceKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( surface ) );\n  }\n\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n                       Instance::createXlibSurfaceKHRUnique( const VULKAN_HPP_NAMESPACE::XlibSurfaceCreateInfoKHR &    createInfo,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#      if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateXlibSurfaceKHR && \"Function <vkCreateXlibSurfaceKHR> requires <VK_KHR_xlib_surface>\" );\n#      endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateXlibSurfaceKHR( m_instance,\n                                reinterpret_cast<const VkXlibSurfaceCreateInfoKHR *>( &createInfo ),\n                                reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                                reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createXlibSurfaceKHRUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>( surface, detail::ObjectDestroy<Instance, Dispatch>( *this, allocator, d ) ) );\n  }\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE Bool32\n    PhysicalDevice::getXlibPresentationSupportKHR( uint32_t queueFamilyIndex, Display * dpy, VisualID visualID, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Bool32>(\n      d.vkGetPhysicalDeviceXlibPresentationSupportKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ), queueFamilyIndex, dpy, visualID ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Bool32\n    PhysicalDevice::getXlibPresentationSupportKHR( uint32_t queueFamilyIndex, Display & dpy, VisualID visualID, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceXlibPresentationSupportKHR &&\n                       \"Function <vkGetPhysicalDeviceXlibPresentationSupportKHR> requires <VK_KHR_xlib_surface>\" );\n#    endif\n\n    VkBool32 result = d.vkGetPhysicalDeviceXlibPresentationSupportKHR( m_physicalDevice, queueFamilyIndex, &dpy, visualID );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Bool32>( result );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_XLIB_KHR*/\n\n#if defined( VK_USE_PLATFORM_XCB_KHR )\n  //=== VK_KHR_xcb_surface ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Instance::createXcbSurfaceKHR( const VULKAN_HPP_NAMESPACE::XcbSurfaceCreateInfoKHR * pCreateInfo,\n                                                                               const VULKAN_HPP_NAMESPACE::AllocationCallbacks *     pAllocator,\n                                                                               VULKAN_HPP_NAMESPACE::SurfaceKHR *                    pSurface,\n                                                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateXcbSurfaceKHR( static_cast<VkInstance>( m_instance ),\n                                                         reinterpret_cast<const VkXcbSurfaceCreateInfoKHR *>( pCreateInfo ),\n                                                         reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                         reinterpret_cast<VkSurfaceKHR *>( pSurface ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n                       Instance::createXcbSurfaceKHR( const VULKAN_HPP_NAMESPACE::XcbSurfaceCreateInfoKHR &     createInfo,\n                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                   Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateXcbSurfaceKHR && \"Function <vkCreateXcbSurfaceKHR> requires <VK_KHR_xcb_surface>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateXcbSurfaceKHR( m_instance,\n                               reinterpret_cast<const VkXcbSurfaceCreateInfoKHR *>( &createInfo ),\n                               reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                               reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createXcbSurfaceKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( surface ) );\n  }\n\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n                       Instance::createXcbSurfaceKHRUnique( const VULKAN_HPP_NAMESPACE::XcbSurfaceCreateInfoKHR &     createInfo,\n                                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                         Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#      if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateXcbSurfaceKHR && \"Function <vkCreateXcbSurfaceKHR> requires <VK_KHR_xcb_surface>\" );\n#      endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateXcbSurfaceKHR( m_instance,\n                               reinterpret_cast<const VkXcbSurfaceCreateInfoKHR *>( &createInfo ),\n                               reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                               reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createXcbSurfaceKHRUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>( surface, detail::ObjectDestroy<Instance, Dispatch>( *this, allocator, d ) ) );\n  }\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE Bool32 PhysicalDevice::getXcbPresentationSupportKHR( uint32_t           queueFamilyIndex,\n                                                                         xcb_connection_t * connection,\n                                                                         xcb_visualid_t     visual_id,\n                                                                         Dispatch const &   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Bool32>(\n      d.vkGetPhysicalDeviceXcbPresentationSupportKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ), queueFamilyIndex, connection, visual_id ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Bool32 PhysicalDevice::getXcbPresentationSupportKHR( uint32_t           queueFamilyIndex,\n                                                                                               xcb_connection_t & connection,\n                                                                                               xcb_visualid_t     visual_id,\n                                                                                               Dispatch const &   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceXcbPresentationSupportKHR &&\n                       \"Function <vkGetPhysicalDeviceXcbPresentationSupportKHR> requires <VK_KHR_xcb_surface>\" );\n#    endif\n\n    VkBool32 result = d.vkGetPhysicalDeviceXcbPresentationSupportKHR( m_physicalDevice, queueFamilyIndex, &connection, visual_id );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Bool32>( result );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_XCB_KHR*/\n\n#if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n  //=== VK_KHR_wayland_surface ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Instance::createWaylandSurfaceKHR( const VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateInfoKHR * pCreateInfo,\n                                                                                   const VULKAN_HPP_NAMESPACE::AllocationCallbacks *         pAllocator,\n                                                                                   VULKAN_HPP_NAMESPACE::SurfaceKHR *                        pSurface,\n                                                                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateWaylandSurfaceKHR( static_cast<VkInstance>( m_instance ),\n                                                             reinterpret_cast<const VkWaylandSurfaceCreateInfoKHR *>( pCreateInfo ),\n                                                             reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                             reinterpret_cast<VkSurfaceKHR *>( pSurface ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n                       Instance::createWaylandSurfaceKHR( const VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateInfoKHR & createInfo,\n                                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                       Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateWaylandSurfaceKHR && \"Function <vkCreateWaylandSurfaceKHR> requires <VK_KHR_wayland_surface>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateWaylandSurfaceKHR(\n      m_instance,\n      reinterpret_cast<const VkWaylandSurfaceCreateInfoKHR *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createWaylandSurfaceKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( surface ) );\n  }\n\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n                       Instance::createWaylandSurfaceKHRUnique( const VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateInfoKHR & createInfo,\n                                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                             Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#      if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateWaylandSurfaceKHR && \"Function <vkCreateWaylandSurfaceKHR> requires <VK_KHR_wayland_surface>\" );\n#      endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateWaylandSurfaceKHR(\n      m_instance,\n      reinterpret_cast<const VkWaylandSurfaceCreateInfoKHR *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createWaylandSurfaceKHRUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>( surface, detail::ObjectDestroy<Instance, Dispatch>( *this, allocator, d ) ) );\n  }\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE Bool32 PhysicalDevice::getWaylandPresentationSupportKHR( uint32_t            queueFamilyIndex,\n                                                                             struct wl_display * display,\n                                                                             Dispatch const &    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Bool32>(\n      d.vkGetPhysicalDeviceWaylandPresentationSupportKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ), queueFamilyIndex, display ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Bool32\n    PhysicalDevice::getWaylandPresentationSupportKHR( uint32_t queueFamilyIndex, struct wl_display & display, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceWaylandPresentationSupportKHR &&\n                       \"Function <vkGetPhysicalDeviceWaylandPresentationSupportKHR> requires <VK_KHR_wayland_surface>\" );\n#    endif\n\n    VkBool32 result = d.vkGetPhysicalDeviceWaylandPresentationSupportKHR( m_physicalDevice, queueFamilyIndex, &display );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Bool32>( result );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_WAYLAND_KHR*/\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  //=== VK_KHR_android_surface ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Instance::createAndroidSurfaceKHR( const VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateInfoKHR * pCreateInfo,\n                                                                                   const VULKAN_HPP_NAMESPACE::AllocationCallbacks *         pAllocator,\n                                                                                   VULKAN_HPP_NAMESPACE::SurfaceKHR *                        pSurface,\n                                                                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateAndroidSurfaceKHR( static_cast<VkInstance>( m_instance ),\n                                                             reinterpret_cast<const VkAndroidSurfaceCreateInfoKHR *>( pCreateInfo ),\n                                                             reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                             reinterpret_cast<VkSurfaceKHR *>( pSurface ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n                       Instance::createAndroidSurfaceKHR( const VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateInfoKHR & createInfo,\n                                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                       Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateAndroidSurfaceKHR && \"Function <vkCreateAndroidSurfaceKHR> requires <VK_KHR_android_surface>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateAndroidSurfaceKHR(\n      m_instance,\n      reinterpret_cast<const VkAndroidSurfaceCreateInfoKHR *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createAndroidSurfaceKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( surface ) );\n  }\n\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n                       Instance::createAndroidSurfaceKHRUnique( const VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateInfoKHR & createInfo,\n                                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                             Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#      if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateAndroidSurfaceKHR && \"Function <vkCreateAndroidSurfaceKHR> requires <VK_KHR_android_surface>\" );\n#      endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateAndroidSurfaceKHR(\n      m_instance,\n      reinterpret_cast<const VkAndroidSurfaceCreateInfoKHR *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createAndroidSurfaceKHRUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>( surface, detail::ObjectDestroy<Instance, Dispatch>( *this, allocator, d ) ) );\n  }\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_KHR_win32_surface ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Instance::createWin32SurfaceKHR( const VULKAN_HPP_NAMESPACE::Win32SurfaceCreateInfoKHR * pCreateInfo,\n                                                                                 const VULKAN_HPP_NAMESPACE::AllocationCallbacks *       pAllocator,\n                                                                                 VULKAN_HPP_NAMESPACE::SurfaceKHR *                      pSurface,\n                                                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateWin32SurfaceKHR( static_cast<VkInstance>( m_instance ),\n                                                           reinterpret_cast<const VkWin32SurfaceCreateInfoKHR *>( pCreateInfo ),\n                                                           reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                           reinterpret_cast<VkSurfaceKHR *>( pSurface ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n                       Instance::createWin32SurfaceKHR( const VULKAN_HPP_NAMESPACE::Win32SurfaceCreateInfoKHR &   createInfo,\n                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                     Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateWin32SurfaceKHR && \"Function <vkCreateWin32SurfaceKHR> requires <VK_KHR_win32_surface>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateWin32SurfaceKHR( m_instance,\n                                 reinterpret_cast<const VkWin32SurfaceCreateInfoKHR *>( &createInfo ),\n                                 reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                                 reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createWin32SurfaceKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( surface ) );\n  }\n\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n                       Instance::createWin32SurfaceKHRUnique( const VULKAN_HPP_NAMESPACE::Win32SurfaceCreateInfoKHR &   createInfo,\n                                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                           Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#      if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateWin32SurfaceKHR && \"Function <vkCreateWin32SurfaceKHR> requires <VK_KHR_win32_surface>\" );\n#      endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateWin32SurfaceKHR( m_instance,\n                                 reinterpret_cast<const VkWin32SurfaceCreateInfoKHR *>( &createInfo ),\n                                 reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                                 reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createWin32SurfaceKHRUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>( surface, detail::ObjectDestroy<Instance, Dispatch>( *this, allocator, d ) ) );\n  }\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE Bool32 PhysicalDevice::getWin32PresentationSupportKHR( uint32_t queueFamilyIndex, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Bool32>( d.vkGetPhysicalDeviceWin32PresentationSupportKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ), queueFamilyIndex ) );\n  }\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_EXT_debug_report ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Instance::createDebugReportCallbackEXT( const VULKAN_HPP_NAMESPACE::DebugReportCallbackCreateInfoEXT * pCreateInfo,\n                                            const VULKAN_HPP_NAMESPACE::AllocationCallbacks *              pAllocator,\n                                            VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT *                 pCallback,\n                                            Dispatch const &                                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateDebugReportCallbackEXT( static_cast<VkInstance>( m_instance ),\n                                                                  reinterpret_cast<const VkDebugReportCallbackCreateInfoEXT *>( pCreateInfo ),\n                                                                  reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                                  reinterpret_cast<VkDebugReportCallbackEXT *>( pCallback ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT>::type\n                       Instance::createDebugReportCallbackEXT( const VULKAN_HPP_NAMESPACE::DebugReportCallbackCreateInfoEXT & createInfo,\n                                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>      allocator,\n                                            Dispatch const &                                               d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateDebugReportCallbackEXT && \"Function <vkCreateDebugReportCallbackEXT> requires <VK_EXT_debug_report>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT callback;\n    VULKAN_HPP_NAMESPACE::Result                 result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateDebugReportCallbackEXT(\n      m_instance,\n      reinterpret_cast<const VkDebugReportCallbackCreateInfoEXT *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkDebugReportCallbackEXT *>( &callback ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createDebugReportCallbackEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( callback ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT, Dispatch>>::type\n                       Instance::createDebugReportCallbackEXTUnique( const VULKAN_HPP_NAMESPACE::DebugReportCallbackCreateInfoEXT & createInfo,\n                                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>      allocator,\n                                                  Dispatch const &                                               d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateDebugReportCallbackEXT && \"Function <vkCreateDebugReportCallbackEXT> requires <VK_EXT_debug_report>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT callback;\n    VULKAN_HPP_NAMESPACE::Result                 result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateDebugReportCallbackEXT(\n      m_instance,\n      reinterpret_cast<const VkDebugReportCallbackCreateInfoEXT *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkDebugReportCallbackEXT *>( &callback ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createDebugReportCallbackEXTUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result,\n      UniqueHandle<VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT, Dispatch>( callback, detail::ObjectDestroy<Instance, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Instance::destroyDebugReportCallbackEXT( VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT      callback,\n                                                                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                  Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyDebugReportCallbackEXT(\n      static_cast<VkInstance>( m_instance ), static_cast<VkDebugReportCallbackEXT>( callback ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Instance::destroyDebugReportCallbackEXT( VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT              callback,\n                                                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                                  Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyDebugReportCallbackEXT && \"Function <vkDestroyDebugReportCallbackEXT> requires <VK_EXT_debug_report>\" );\n#  endif\n\n    d.vkDestroyDebugReportCallbackEXT(\n      m_instance,\n      static_cast<VkDebugReportCallbackEXT>( callback ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Instance::destroy( VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT      callback,\n                                            const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                            Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyDebugReportCallbackEXT(\n      static_cast<VkInstance>( m_instance ), static_cast<VkDebugReportCallbackEXT>( callback ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Instance::destroy( VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT              callback,\n                                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                            Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyDebugReportCallbackEXT && \"Function <vkDestroyDebugReportCallbackEXT> requires <VK_EXT_debug_report>\" );\n#  endif\n\n    d.vkDestroyDebugReportCallbackEXT(\n      m_instance,\n      static_cast<VkDebugReportCallbackEXT>( callback ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Instance::debugReportMessageEXT( VULKAN_HPP_NAMESPACE::DebugReportFlagsEXT      flags,\n                                                          VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT objectType_,\n                                                          uint64_t                                       object,\n                                                          size_t                                         location,\n                                                          int32_t                                        messageCode,\n                                                          const char *                                   pLayerPrefix,\n                                                          const char *                                   pMessage,\n                                                          Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDebugReportMessageEXT( static_cast<VkInstance>( m_instance ),\n                               static_cast<VkDebugReportFlagsEXT>( flags ),\n                               static_cast<VkDebugReportObjectTypeEXT>( objectType_ ),\n                               object,\n                               location,\n                               messageCode,\n                               pLayerPrefix,\n                               pMessage );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Instance::debugReportMessageEXT( VULKAN_HPP_NAMESPACE::DebugReportFlagsEXT      flags,\n                                                          VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT objectType_,\n                                                          uint64_t                                       object,\n                                                          size_t                                         location,\n                                                          int32_t                                        messageCode,\n                                                          const std::string &                            layerPrefix,\n                                                          const std::string &                            message,\n                                                          Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDebugReportMessageEXT && \"Function <vkDebugReportMessageEXT> requires <VK_EXT_debug_report>\" );\n#  endif\n\n    d.vkDebugReportMessageEXT( m_instance,\n                               static_cast<VkDebugReportFlagsEXT>( flags ),\n                               static_cast<VkDebugReportObjectTypeEXT>( objectType_ ),\n                               object,\n                               location,\n                               messageCode,\n                               layerPrefix.c_str(),\n                               message.c_str() );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_debug_marker ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::debugMarkerSetObjectTagEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerObjectTagInfoEXT * pTagInfo,\n                                                                                    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkDebugMarkerSetObjectTagEXT( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkDebugMarkerObjectTagInfoEXT *>( pTagInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::debugMarkerSetObjectTagEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerObjectTagInfoEXT & tagInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDebugMarkerSetObjectTagEXT && \"Function <vkDebugMarkerSetObjectTagEXT> requires <VK_EXT_debug_marker>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkDebugMarkerSetObjectTagEXT( m_device, reinterpret_cast<const VkDebugMarkerObjectTagInfoEXT *>( &tagInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::debugMarkerSetObjectTagEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::debugMarkerSetObjectNameEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerObjectNameInfoEXT * pNameInfo,\n                                                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkDebugMarkerSetObjectNameEXT( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkDebugMarkerObjectNameInfoEXT *>( pNameInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::debugMarkerSetObjectNameEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerObjectNameInfoEXT & nameInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDebugMarkerSetObjectNameEXT && \"Function <vkDebugMarkerSetObjectNameEXT> requires <VK_EXT_debug_marker>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkDebugMarkerSetObjectNameEXT( m_device, reinterpret_cast<const VkDebugMarkerObjectNameInfoEXT *>( &nameInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::debugMarkerSetObjectNameEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::debugMarkerBeginEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT * pMarkerInfo,\n                                                             Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDebugMarkerBeginEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkDebugMarkerMarkerInfoEXT *>( pMarkerInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::debugMarkerBeginEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT & markerInfo,\n                                                             Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdDebugMarkerBeginEXT && \"Function <vkCmdDebugMarkerBeginEXT> requires <VK_EXT_debug_marker>\" );\n#  endif\n\n    d.vkCmdDebugMarkerBeginEXT( m_commandBuffer, reinterpret_cast<const VkDebugMarkerMarkerInfoEXT *>( &markerInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::debugMarkerEndEXT( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDebugMarkerEndEXT( static_cast<VkCommandBuffer>( m_commandBuffer ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::debugMarkerInsertEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT * pMarkerInfo,\n                                                              Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDebugMarkerInsertEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkDebugMarkerMarkerInfoEXT *>( pMarkerInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::debugMarkerInsertEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT & markerInfo,\n                                                              Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdDebugMarkerInsertEXT && \"Function <vkCmdDebugMarkerInsertEXT> requires <VK_EXT_debug_marker>\" );\n#  endif\n\n    d.vkCmdDebugMarkerInsertEXT( m_commandBuffer, reinterpret_cast<const VkDebugMarkerMarkerInfoEXT *>( &markerInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_video_queue ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getVideoCapabilitiesKHR( const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR * pVideoProfile,\n                                                                                         VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR *      pCapabilities,\n                                                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceVideoCapabilitiesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                           reinterpret_cast<const VkVideoProfileInfoKHR *>( pVideoProfile ),\n                                                                           reinterpret_cast<VkVideoCapabilitiesKHR *>( pCapabilities ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR>::type\n                       PhysicalDevice::getVideoCapabilitiesKHR( const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR & videoProfile, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceVideoCapabilitiesKHR && \"Function <vkGetPhysicalDeviceVideoCapabilitiesKHR> requires <VK_KHR_video_queue>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR capabilities;\n    VULKAN_HPP_NAMESPACE::Result               result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceVideoCapabilitiesKHR(\n      m_physicalDevice, reinterpret_cast<const VkVideoProfileInfoKHR *>( &videoProfile ), reinterpret_cast<VkVideoCapabilitiesKHR *>( &capabilities ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getVideoCapabilitiesKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( capabilities ) );\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>>::type\n                       PhysicalDevice::getVideoCapabilitiesKHR( const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR & videoProfile, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceVideoCapabilitiesKHR && \"Function <vkGetPhysicalDeviceVideoCapabilitiesKHR> requires <VK_KHR_video_queue>\" );\n#  endif\n\n    StructureChain<X, Y, Z...>                   structureChain;\n    VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR & capabilities = structureChain.template get<VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR>();\n    VULKAN_HPP_NAMESPACE::Result                 result       = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceVideoCapabilitiesKHR(\n      m_physicalDevice, reinterpret_cast<const VkVideoProfileInfoKHR *>( &videoProfile ), reinterpret_cast<VkVideoCapabilitiesKHR *>( &capabilities ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getVideoCapabilitiesKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( structureChain ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    PhysicalDevice::getVideoFormatPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR * pVideoFormatInfo,\n                                                 uint32_t *                                                     pVideoFormatPropertyCount,\n                                                 VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR *               pVideoFormatProperties,\n                                                 Dispatch const &                                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceVideoFormatPropertiesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                               reinterpret_cast<const VkPhysicalDeviceVideoFormatInfoKHR *>( pVideoFormatInfo ),\n                                                                               pVideoFormatPropertyCount,\n                                                                               reinterpret_cast<VkVideoFormatPropertiesKHR *>( pVideoFormatProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename VideoFormatPropertiesKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename VideoFormatPropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR>::value,\n                                    int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR, VideoFormatPropertiesKHRAllocator>>::type\n    PhysicalDevice::getVideoFormatPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR & videoFormatInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceVideoFormatPropertiesKHR &&\n                       \"Function <vkGetPhysicalDeviceVideoFormatPropertiesKHR> requires <VK_KHR_video_queue>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR, VideoFormatPropertiesKHRAllocator> videoFormatProperties;\n    uint32_t                                                                                       videoFormatPropertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                   result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceVideoFormatPropertiesKHR(\n        m_physicalDevice, reinterpret_cast<const VkPhysicalDeviceVideoFormatInfoKHR *>( &videoFormatInfo ), &videoFormatPropertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && videoFormatPropertyCount )\n      {\n        videoFormatProperties.resize( videoFormatPropertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceVideoFormatPropertiesKHR( m_physicalDevice,\n                                                         reinterpret_cast<const VkPhysicalDeviceVideoFormatInfoKHR *>( &videoFormatInfo ),\n                                                         &videoFormatPropertyCount,\n                                                         reinterpret_cast<VkVideoFormatPropertiesKHR *>( videoFormatProperties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getVideoFormatPropertiesKHR\" );\n    VULKAN_HPP_ASSERT( videoFormatPropertyCount <= videoFormatProperties.size() );\n    if ( videoFormatPropertyCount < videoFormatProperties.size() )\n    {\n      videoFormatProperties.resize( videoFormatPropertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( videoFormatProperties ) );\n  }\n\n  template <typename VideoFormatPropertiesKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename VideoFormatPropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR>::value,\n                                    int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR, VideoFormatPropertiesKHRAllocator>>::type\n    PhysicalDevice::getVideoFormatPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR & videoFormatInfo,\n                                                 VideoFormatPropertiesKHRAllocator &                            videoFormatPropertiesKHRAllocator,\n                                                 Dispatch const &                                               d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceVideoFormatPropertiesKHR &&\n                       \"Function <vkGetPhysicalDeviceVideoFormatPropertiesKHR> requires <VK_KHR_video_queue>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR, VideoFormatPropertiesKHRAllocator> videoFormatProperties( videoFormatPropertiesKHRAllocator );\n    uint32_t                                                                                       videoFormatPropertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                   result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceVideoFormatPropertiesKHR(\n        m_physicalDevice, reinterpret_cast<const VkPhysicalDeviceVideoFormatInfoKHR *>( &videoFormatInfo ), &videoFormatPropertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && videoFormatPropertyCount )\n      {\n        videoFormatProperties.resize( videoFormatPropertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceVideoFormatPropertiesKHR( m_physicalDevice,\n                                                         reinterpret_cast<const VkPhysicalDeviceVideoFormatInfoKHR *>( &videoFormatInfo ),\n                                                         &videoFormatPropertyCount,\n                                                         reinterpret_cast<VkVideoFormatPropertiesKHR *>( videoFormatProperties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getVideoFormatPropertiesKHR\" );\n    VULKAN_HPP_ASSERT( videoFormatPropertyCount <= videoFormatProperties.size() );\n    if ( videoFormatPropertyCount < videoFormatProperties.size() )\n    {\n      videoFormatProperties.resize( videoFormatPropertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( videoFormatProperties ) );\n  }\n\n  template <typename StructureChain,\n            typename StructureChainAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename StructureChainAllocator::value_type, StructureChain>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<StructureChain, StructureChainAllocator>>::type\n    PhysicalDevice::getVideoFormatPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR & videoFormatInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceVideoFormatPropertiesKHR &&\n                       \"Function <vkGetPhysicalDeviceVideoFormatPropertiesKHR> requires <VK_KHR_video_queue>\" );\n#  endif\n\n    std::vector<StructureChain, StructureChainAllocator>        structureChains;\n    std::vector<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR> videoFormatProperties;\n    uint32_t                                                    videoFormatPropertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceVideoFormatPropertiesKHR(\n        m_physicalDevice, reinterpret_cast<const VkPhysicalDeviceVideoFormatInfoKHR *>( &videoFormatInfo ), &videoFormatPropertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && videoFormatPropertyCount )\n      {\n        structureChains.resize( videoFormatPropertyCount );\n        videoFormatProperties.resize( videoFormatPropertyCount );\n        for ( uint32_t i = 0; i < videoFormatPropertyCount; i++ )\n        {\n          videoFormatProperties[i].pNext = structureChains[i].template get<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR>().pNext;\n        }\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceVideoFormatPropertiesKHR( m_physicalDevice,\n                                                         reinterpret_cast<const VkPhysicalDeviceVideoFormatInfoKHR *>( &videoFormatInfo ),\n                                                         &videoFormatPropertyCount,\n                                                         reinterpret_cast<VkVideoFormatPropertiesKHR *>( videoFormatProperties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getVideoFormatPropertiesKHR\" );\n    VULKAN_HPP_ASSERT( videoFormatPropertyCount <= videoFormatProperties.size() );\n    if ( videoFormatPropertyCount < videoFormatProperties.size() )\n    {\n      structureChains.resize( videoFormatPropertyCount );\n    }\n    for ( uint32_t i = 0; i < videoFormatPropertyCount; i++ )\n    {\n      structureChains[i].template get<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR>() = videoFormatProperties[i];\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( structureChains ) );\n  }\n\n  template <typename StructureChain,\n            typename StructureChainAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename StructureChainAllocator::value_type, StructureChain>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<StructureChain, StructureChainAllocator>>::type\n                       PhysicalDevice::getVideoFormatPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR & videoFormatInfo,\n                                                 StructureChainAllocator &                                      structureChainAllocator,\n                                                 Dispatch const &                                               d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceVideoFormatPropertiesKHR &&\n                       \"Function <vkGetPhysicalDeviceVideoFormatPropertiesKHR> requires <VK_KHR_video_queue>\" );\n#  endif\n\n    std::vector<StructureChain, StructureChainAllocator>        structureChains( structureChainAllocator );\n    std::vector<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR> videoFormatProperties;\n    uint32_t                                                    videoFormatPropertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceVideoFormatPropertiesKHR(\n        m_physicalDevice, reinterpret_cast<const VkPhysicalDeviceVideoFormatInfoKHR *>( &videoFormatInfo ), &videoFormatPropertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && videoFormatPropertyCount )\n      {\n        structureChains.resize( videoFormatPropertyCount );\n        videoFormatProperties.resize( videoFormatPropertyCount );\n        for ( uint32_t i = 0; i < videoFormatPropertyCount; i++ )\n        {\n          videoFormatProperties[i].pNext = structureChains[i].template get<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR>().pNext;\n        }\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceVideoFormatPropertiesKHR( m_physicalDevice,\n                                                         reinterpret_cast<const VkPhysicalDeviceVideoFormatInfoKHR *>( &videoFormatInfo ),\n                                                         &videoFormatPropertyCount,\n                                                         reinterpret_cast<VkVideoFormatPropertiesKHR *>( videoFormatProperties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getVideoFormatPropertiesKHR\" );\n    VULKAN_HPP_ASSERT( videoFormatPropertyCount <= videoFormatProperties.size() );\n    if ( videoFormatPropertyCount < videoFormatProperties.size() )\n    {\n      structureChains.resize( videoFormatPropertyCount );\n    }\n    for ( uint32_t i = 0; i < videoFormatPropertyCount; i++ )\n    {\n      structureChains[i].template get<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR>() = videoFormatProperties[i];\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( structureChains ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createVideoSessionKHR( const VULKAN_HPP_NAMESPACE::VideoSessionCreateInfoKHR * pCreateInfo,\n                                                                               const VULKAN_HPP_NAMESPACE::AllocationCallbacks *       pAllocator,\n                                                                               VULKAN_HPP_NAMESPACE::VideoSessionKHR *                 pVideoSession,\n                                                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateVideoSessionKHR( static_cast<VkDevice>( m_device ),\n                                                           reinterpret_cast<const VkVideoSessionCreateInfoKHR *>( pCreateInfo ),\n                                                           reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                           reinterpret_cast<VkVideoSessionKHR *>( pVideoSession ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::VideoSessionKHR>::type\n                       Device::createVideoSessionKHR( const VULKAN_HPP_NAMESPACE::VideoSessionCreateInfoKHR &   createInfo,\n                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                   Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateVideoSessionKHR && \"Function <vkCreateVideoSessionKHR> requires <VK_KHR_video_queue>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::VideoSessionKHR videoSession;\n    VULKAN_HPP_NAMESPACE::Result          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateVideoSessionKHR( m_device,\n                                 reinterpret_cast<const VkVideoSessionCreateInfoKHR *>( &createInfo ),\n                                 reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                                 reinterpret_cast<VkVideoSessionKHR *>( &videoSession ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createVideoSessionKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( videoSession ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::VideoSessionKHR, Dispatch>>::type\n                       Device::createVideoSessionKHRUnique( const VULKAN_HPP_NAMESPACE::VideoSessionCreateInfoKHR &   createInfo,\n                                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                         Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateVideoSessionKHR && \"Function <vkCreateVideoSessionKHR> requires <VK_KHR_video_queue>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::VideoSessionKHR videoSession;\n    VULKAN_HPP_NAMESPACE::Result          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateVideoSessionKHR( m_device,\n                                 reinterpret_cast<const VkVideoSessionCreateInfoKHR *>( &createInfo ),\n                                 reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                                 reinterpret_cast<VkVideoSessionKHR *>( &videoSession ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createVideoSessionKHRUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::VideoSessionKHR, Dispatch>( videoSession, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyVideoSessionKHR( VULKAN_HPP_NAMESPACE::VideoSessionKHR             videoSession,\n                                                         const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                         Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyVideoSessionKHR(\n      static_cast<VkDevice>( m_device ), static_cast<VkVideoSessionKHR>( videoSession ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyVideoSessionKHR( VULKAN_HPP_NAMESPACE::VideoSessionKHR                     videoSession,\n                                                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                         Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyVideoSessionKHR && \"Function <vkDestroyVideoSessionKHR> requires <VK_KHR_video_queue>\" );\n#  endif\n\n    d.vkDestroyVideoSessionKHR(\n      m_device,\n      static_cast<VkVideoSessionKHR>( videoSession ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::VideoSessionKHR             videoSession,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyVideoSessionKHR(\n      static_cast<VkDevice>( m_device ), static_cast<VkVideoSessionKHR>( videoSession ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::VideoSessionKHR                     videoSession,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyVideoSessionKHR && \"Function <vkDestroyVideoSessionKHR> requires <VK_KHR_video_queue>\" );\n#  endif\n\n    d.vkDestroyVideoSessionKHR(\n      m_device,\n      static_cast<VkVideoSessionKHR>( videoSession ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::getVideoSessionMemoryRequirementsKHR( VULKAN_HPP_NAMESPACE::VideoSessionKHR                     videoSession,\n                                                  uint32_t *                                                pMemoryRequirementsCount,\n                                                  VULKAN_HPP_NAMESPACE::VideoSessionMemoryRequirementsKHR * pMemoryRequirements,\n                                                  Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetVideoSessionMemoryRequirementsKHR( static_cast<VkDevice>( m_device ),\n                                                                          static_cast<VkVideoSessionKHR>( videoSession ),\n                                                                          pMemoryRequirementsCount,\n                                                                          reinterpret_cast<VkVideoSessionMemoryRequirementsKHR *>( pMemoryRequirements ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename VideoSessionMemoryRequirementsKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename VideoSessionMemoryRequirementsKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::VideoSessionMemoryRequirementsKHR>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::VideoSessionMemoryRequirementsKHR, VideoSessionMemoryRequirementsKHRAllocator>>::type\n    Device::getVideoSessionMemoryRequirementsKHR( VULKAN_HPP_NAMESPACE::VideoSessionKHR videoSession, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetVideoSessionMemoryRequirementsKHR && \"Function <vkGetVideoSessionMemoryRequirementsKHR> requires <VK_KHR_video_queue>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::VideoSessionMemoryRequirementsKHR, VideoSessionMemoryRequirementsKHRAllocator> memoryRequirements;\n    uint32_t                                                                                                         memoryRequirementsCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                                     result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetVideoSessionMemoryRequirementsKHR( m_device, static_cast<VkVideoSessionKHR>( videoSession ), &memoryRequirementsCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && memoryRequirementsCount )\n      {\n        memoryRequirements.resize( memoryRequirementsCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetVideoSessionMemoryRequirementsKHR( m_device,\n                                                    static_cast<VkVideoSessionKHR>( videoSession ),\n                                                    &memoryRequirementsCount,\n                                                    reinterpret_cast<VkVideoSessionMemoryRequirementsKHR *>( memoryRequirements.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n\n    VULKAN_HPP_ASSERT( memoryRequirementsCount <= memoryRequirements.size() );\n    if ( memoryRequirementsCount < memoryRequirements.size() )\n    {\n      memoryRequirements.resize( memoryRequirementsCount );\n    }\n    return memoryRequirements;\n  }\n\n  template <typename VideoSessionMemoryRequirementsKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename VideoSessionMemoryRequirementsKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::VideoSessionMemoryRequirementsKHR>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::VideoSessionMemoryRequirementsKHR, VideoSessionMemoryRequirementsKHRAllocator>>::type\n    Device::getVideoSessionMemoryRequirementsKHR( VULKAN_HPP_NAMESPACE::VideoSessionKHR        videoSession,\n                                                  VideoSessionMemoryRequirementsKHRAllocator & videoSessionMemoryRequirementsKHRAllocator,\n                                                  Dispatch const &                             d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetVideoSessionMemoryRequirementsKHR && \"Function <vkGetVideoSessionMemoryRequirementsKHR> requires <VK_KHR_video_queue>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::VideoSessionMemoryRequirementsKHR, VideoSessionMemoryRequirementsKHRAllocator> memoryRequirements(\n      videoSessionMemoryRequirementsKHRAllocator );\n    uint32_t                     memoryRequirementsCount;\n    VULKAN_HPP_NAMESPACE::Result result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetVideoSessionMemoryRequirementsKHR( m_device, static_cast<VkVideoSessionKHR>( videoSession ), &memoryRequirementsCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && memoryRequirementsCount )\n      {\n        memoryRequirements.resize( memoryRequirementsCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetVideoSessionMemoryRequirementsKHR( m_device,\n                                                    static_cast<VkVideoSessionKHR>( videoSession ),\n                                                    &memoryRequirementsCount,\n                                                    reinterpret_cast<VkVideoSessionMemoryRequirementsKHR *>( memoryRequirements.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n\n    VULKAN_HPP_ASSERT( memoryRequirementsCount <= memoryRequirements.size() );\n    if ( memoryRequirementsCount < memoryRequirements.size() )\n    {\n      memoryRequirements.resize( memoryRequirementsCount );\n    }\n    return memoryRequirements;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::bindVideoSessionMemoryKHR( VULKAN_HPP_NAMESPACE::VideoSessionKHR                       videoSession,\n                                       uint32_t                                                    bindSessionMemoryInfoCount,\n                                       const VULKAN_HPP_NAMESPACE::BindVideoSessionMemoryInfoKHR * pBindSessionMemoryInfos,\n                                       Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkBindVideoSessionMemoryKHR( static_cast<VkDevice>( m_device ),\n                                                               static_cast<VkVideoSessionKHR>( videoSession ),\n                                                               bindSessionMemoryInfoCount,\n                                                               reinterpret_cast<const VkBindVideoSessionMemoryInfoKHR *>( pBindSessionMemoryInfos ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type Device::bindVideoSessionMemoryKHR(\n    VULKAN_HPP_NAMESPACE::VideoSessionKHR                                                               videoSession,\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindVideoSessionMemoryInfoKHR> const & bindSessionMemoryInfos,\n    Dispatch const &                                                                                    d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkBindVideoSessionMemoryKHR && \"Function <vkBindVideoSessionMemoryKHR> requires <VK_KHR_video_queue>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkBindVideoSessionMemoryKHR( m_device,\n                                     static_cast<VkVideoSessionKHR>( videoSession ),\n                                     bindSessionMemoryInfos.size(),\n                                     reinterpret_cast<const VkBindVideoSessionMemoryInfoKHR *>( bindSessionMemoryInfos.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::bindVideoSessionMemoryKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::createVideoSessionParametersKHR( const VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateInfoKHR * pCreateInfo,\n                                             const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                 pAllocator,\n                                             VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR *                 pVideoSessionParameters,\n                                             Dispatch const &                                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateVideoSessionParametersKHR( static_cast<VkDevice>( m_device ),\n                                                                     reinterpret_cast<const VkVideoSessionParametersCreateInfoKHR *>( pCreateInfo ),\n                                                                     reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                                     reinterpret_cast<VkVideoSessionParametersKHR *>( pVideoSessionParameters ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR>::type\n                       Device::createVideoSessionParametersKHR( const VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateInfoKHR & createInfo,\n                                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>         allocator,\n                                             Dispatch const &                                                  d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateVideoSessionParametersKHR && \"Function <vkCreateVideoSessionParametersKHR> requires <VK_KHR_video_queue>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR videoSessionParameters;\n    VULKAN_HPP_NAMESPACE::Result                    result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateVideoSessionParametersKHR(\n      m_device,\n      reinterpret_cast<const VkVideoSessionParametersCreateInfoKHR *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkVideoSessionParametersKHR *>( &videoSessionParameters ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createVideoSessionParametersKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( videoSessionParameters ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR, Dispatch>>::type\n                       Device::createVideoSessionParametersKHRUnique( const VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateInfoKHR & createInfo,\n                                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>         allocator,\n                                                   Dispatch const &                                                  d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateVideoSessionParametersKHR && \"Function <vkCreateVideoSessionParametersKHR> requires <VK_KHR_video_queue>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR videoSessionParameters;\n    VULKAN_HPP_NAMESPACE::Result                    result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateVideoSessionParametersKHR(\n      m_device,\n      reinterpret_cast<const VkVideoSessionParametersCreateInfoKHR *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkVideoSessionParametersKHR *>( &videoSessionParameters ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createVideoSessionParametersKHRUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result,\n                                                                UniqueHandle<VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR, Dispatch>(\n                                                                  videoSessionParameters, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::updateVideoSessionParametersKHR( VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR                   videoSessionParameters,\n                                             const VULKAN_HPP_NAMESPACE::VideoSessionParametersUpdateInfoKHR * pUpdateInfo,\n                                             Dispatch const &                                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkUpdateVideoSessionParametersKHR( static_cast<VkDevice>( m_device ),\n                                                                     static_cast<VkVideoSessionParametersKHR>( videoSessionParameters ),\n                                                                     reinterpret_cast<const VkVideoSessionParametersUpdateInfoKHR *>( pUpdateInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n                                          Device::updateVideoSessionParametersKHR( VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR                   videoSessionParameters,\n                                             const VULKAN_HPP_NAMESPACE::VideoSessionParametersUpdateInfoKHR & updateInfo,\n                                             Dispatch const &                                                  d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkUpdateVideoSessionParametersKHR && \"Function <vkUpdateVideoSessionParametersKHR> requires <VK_KHR_video_queue>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkUpdateVideoSessionParametersKHR( m_device,\n                                           static_cast<VkVideoSessionParametersKHR>( videoSessionParameters ),\n                                           reinterpret_cast<const VkVideoSessionParametersUpdateInfoKHR *>( &updateInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::updateVideoSessionParametersKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyVideoSessionParametersKHR( VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR   videoSessionParameters,\n                                                                   const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                   Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyVideoSessionParametersKHR( static_cast<VkDevice>( m_device ),\n                                          static_cast<VkVideoSessionParametersKHR>( videoSessionParameters ),\n                                          reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyVideoSessionParametersKHR( VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR           videoSessionParameters,\n                                                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                                   Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyVideoSessionParametersKHR && \"Function <vkDestroyVideoSessionParametersKHR> requires <VK_KHR_video_queue>\" );\n#  endif\n\n    d.vkDestroyVideoSessionParametersKHR(\n      m_device,\n      static_cast<VkVideoSessionParametersKHR>( videoSessionParameters ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR   videoSessionParameters,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyVideoSessionParametersKHR( static_cast<VkDevice>( m_device ),\n                                          static_cast<VkVideoSessionParametersKHR>( videoSessionParameters ),\n                                          reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR           videoSessionParameters,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyVideoSessionParametersKHR && \"Function <vkDestroyVideoSessionParametersKHR> requires <VK_KHR_video_queue>\" );\n#  endif\n\n    d.vkDestroyVideoSessionParametersKHR(\n      m_device,\n      static_cast<VkVideoSessionParametersKHR>( videoSessionParameters ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::beginVideoCodingKHR( const VULKAN_HPP_NAMESPACE::VideoBeginCodingInfoKHR * pBeginInfo,\n                                                             Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBeginVideoCodingKHR( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkVideoBeginCodingInfoKHR *>( pBeginInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::beginVideoCodingKHR( const VULKAN_HPP_NAMESPACE::VideoBeginCodingInfoKHR & beginInfo,\n                                                             Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBeginVideoCodingKHR && \"Function <vkCmdBeginVideoCodingKHR> requires <VK_KHR_video_queue>\" );\n#  endif\n\n    d.vkCmdBeginVideoCodingKHR( m_commandBuffer, reinterpret_cast<const VkVideoBeginCodingInfoKHR *>( &beginInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::endVideoCodingKHR( const VULKAN_HPP_NAMESPACE::VideoEndCodingInfoKHR * pEndCodingInfo,\n                                                           Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdEndVideoCodingKHR( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkVideoEndCodingInfoKHR *>( pEndCodingInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::endVideoCodingKHR( const VULKAN_HPP_NAMESPACE::VideoEndCodingInfoKHR & endCodingInfo,\n                                                           Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdEndVideoCodingKHR && \"Function <vkCmdEndVideoCodingKHR> requires <VK_KHR_video_queue>\" );\n#  endif\n\n    d.vkCmdEndVideoCodingKHR( m_commandBuffer, reinterpret_cast<const VkVideoEndCodingInfoKHR *>( &endCodingInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::controlVideoCodingKHR( const VULKAN_HPP_NAMESPACE::VideoCodingControlInfoKHR * pCodingControlInfo,\n                                                               Dispatch const &                                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdControlVideoCodingKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                  reinterpret_cast<const VkVideoCodingControlInfoKHR *>( pCodingControlInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::controlVideoCodingKHR( const VULKAN_HPP_NAMESPACE::VideoCodingControlInfoKHR & codingControlInfo,\n                                                               Dispatch const &                                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdControlVideoCodingKHR && \"Function <vkCmdControlVideoCodingKHR> requires <VK_KHR_video_queue>\" );\n#  endif\n\n    d.vkCmdControlVideoCodingKHR( m_commandBuffer, reinterpret_cast<const VkVideoCodingControlInfoKHR *>( &codingControlInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_video_decode_queue ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::decodeVideoKHR( const VULKAN_HPP_NAMESPACE::VideoDecodeInfoKHR * pDecodeInfo,\n                                                        Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDecodeVideoKHR( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkVideoDecodeInfoKHR *>( pDecodeInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::decodeVideoKHR( const VULKAN_HPP_NAMESPACE::VideoDecodeInfoKHR & decodeInfo,\n                                                        Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdDecodeVideoKHR && \"Function <vkCmdDecodeVideoKHR> requires <VK_KHR_video_decode_queue>\" );\n#  endif\n\n    d.vkCmdDecodeVideoKHR( m_commandBuffer, reinterpret_cast<const VkVideoDecodeInfoKHR *>( &decodeInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_transform_feedback ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindTransformFeedbackBuffersEXT( uint32_t                                 firstBinding,\n                                                                         uint32_t                                 bindingCount,\n                                                                         const VULKAN_HPP_NAMESPACE::Buffer *     pBuffers,\n                                                                         const VULKAN_HPP_NAMESPACE::DeviceSize * pOffsets,\n                                                                         const VULKAN_HPP_NAMESPACE::DeviceSize * pSizes,\n                                                                         Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBindTransformFeedbackBuffersEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                            firstBinding,\n                                            bindingCount,\n                                            reinterpret_cast<const VkBuffer *>( pBuffers ),\n                                            reinterpret_cast<const VkDeviceSize *>( pOffsets ),\n                                            reinterpret_cast<const VkDeviceSize *>( pSizes ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::bindTransformFeedbackBuffersEXT( uint32_t                                                                         firstBinding,\n                                                    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &     buffers,\n                                                    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & offsets,\n                                                    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & sizes,\n                                                    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBindTransformFeedbackBuffersEXT && \"Function <vkCmdBindTransformFeedbackBuffersEXT> requires <VK_EXT_transform_feedback>\" );\n#  endif\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n    VULKAN_HPP_ASSERT( buffers.size() == offsets.size() );\n    VULKAN_HPP_ASSERT( sizes.empty() || buffers.size() == sizes.size() );\n#  else\n    if ( buffers.size() != offsets.size() )\n    {\n      throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::bindTransformFeedbackBuffersEXT: buffers.size() != offsets.size()\" );\n    }\n    if ( !sizes.empty() && buffers.size() != sizes.size() )\n    {\n      throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::bindTransformFeedbackBuffersEXT: buffers.size() != sizes.size()\" );\n    }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n    d.vkCmdBindTransformFeedbackBuffersEXT( m_commandBuffer,\n                                            firstBinding,\n                                            buffers.size(),\n                                            reinterpret_cast<const VkBuffer *>( buffers.data() ),\n                                            reinterpret_cast<const VkDeviceSize *>( offsets.data() ),\n                                            reinterpret_cast<const VkDeviceSize *>( sizes.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::beginTransformFeedbackEXT( uint32_t                                 firstCounterBuffer,\n                                                                   uint32_t                                 counterBufferCount,\n                                                                   const VULKAN_HPP_NAMESPACE::Buffer *     pCounterBuffers,\n                                                                   const VULKAN_HPP_NAMESPACE::DeviceSize * pCounterBufferOffsets,\n                                                                   Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBeginTransformFeedbackEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                      firstCounterBuffer,\n                                      counterBufferCount,\n                                      reinterpret_cast<const VkBuffer *>( pCounterBuffers ),\n                                      reinterpret_cast<const VkDeviceSize *>( pCounterBufferOffsets ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::beginTransformFeedbackEXT( uint32_t                                                                         firstCounterBuffer,\n                                              VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &     counterBuffers,\n                                              VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & counterBufferOffsets,\n                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBeginTransformFeedbackEXT && \"Function <vkCmdBeginTransformFeedbackEXT> requires <VK_EXT_transform_feedback>\" );\n#  endif\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n    VULKAN_HPP_ASSERT( counterBufferOffsets.empty() || counterBuffers.size() == counterBufferOffsets.size() );\n#  else\n    if ( !counterBufferOffsets.empty() && counterBuffers.size() != counterBufferOffsets.size() )\n    {\n      throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::beginTransformFeedbackEXT: counterBuffers.size() != counterBufferOffsets.size()\" );\n    }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n    d.vkCmdBeginTransformFeedbackEXT( m_commandBuffer,\n                                      firstCounterBuffer,\n                                      counterBuffers.size(),\n                                      reinterpret_cast<const VkBuffer *>( counterBuffers.data() ),\n                                      reinterpret_cast<const VkDeviceSize *>( counterBufferOffsets.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::endTransformFeedbackEXT( uint32_t                                 firstCounterBuffer,\n                                                                 uint32_t                                 counterBufferCount,\n                                                                 const VULKAN_HPP_NAMESPACE::Buffer *     pCounterBuffers,\n                                                                 const VULKAN_HPP_NAMESPACE::DeviceSize * pCounterBufferOffsets,\n                                                                 Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdEndTransformFeedbackEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                    firstCounterBuffer,\n                                    counterBufferCount,\n                                    reinterpret_cast<const VkBuffer *>( pCounterBuffers ),\n                                    reinterpret_cast<const VkDeviceSize *>( pCounterBufferOffsets ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::endTransformFeedbackEXT( uint32_t                                                                         firstCounterBuffer,\n                                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &     counterBuffers,\n                                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & counterBufferOffsets,\n                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdEndTransformFeedbackEXT && \"Function <vkCmdEndTransformFeedbackEXT> requires <VK_EXT_transform_feedback>\" );\n#  endif\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n    VULKAN_HPP_ASSERT( counterBufferOffsets.empty() || counterBuffers.size() == counterBufferOffsets.size() );\n#  else\n    if ( !counterBufferOffsets.empty() && counterBuffers.size() != counterBufferOffsets.size() )\n    {\n      throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::endTransformFeedbackEXT: counterBuffers.size() != counterBufferOffsets.size()\" );\n    }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n    d.vkCmdEndTransformFeedbackEXT( m_commandBuffer,\n                                    firstCounterBuffer,\n                                    counterBuffers.size(),\n                                    reinterpret_cast<const VkBuffer *>( counterBuffers.data() ),\n                                    reinterpret_cast<const VkDeviceSize *>( counterBufferOffsets.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::beginQueryIndexedEXT( VULKAN_HPP_NAMESPACE::QueryPool         queryPool,\n                                                              uint32_t                                query,\n                                                              VULKAN_HPP_NAMESPACE::QueryControlFlags flags,\n                                                              uint32_t                                index,\n                                                              Dispatch const &                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBeginQueryIndexedEXT(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkQueryPool>( queryPool ), query, static_cast<VkQueryControlFlags>( flags ), index );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::endQueryIndexedEXT( VULKAN_HPP_NAMESPACE::QueryPool queryPool, uint32_t query, uint32_t index, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdEndQueryIndexedEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkQueryPool>( queryPool ), query, index );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::drawIndirectByteCountEXT( uint32_t                         instanceCount,\n                                                                  uint32_t                         firstInstance,\n                                                                  VULKAN_HPP_NAMESPACE::Buffer     counterBuffer,\n                                                                  VULKAN_HPP_NAMESPACE::DeviceSize counterBufferOffset,\n                                                                  uint32_t                         counterOffset,\n                                                                  uint32_t                         vertexStride,\n                                                                  Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDrawIndirectByteCountEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                     instanceCount,\n                                     firstInstance,\n                                     static_cast<VkBuffer>( counterBuffer ),\n                                     static_cast<VkDeviceSize>( counterBufferOffset ),\n                                     counterOffset,\n                                     vertexStride );\n  }\n\n  //=== VK_NVX_binary_import ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createCuModuleNVX( const VULKAN_HPP_NAMESPACE::CuModuleCreateInfoNVX * pCreateInfo,\n                                                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks *   pAllocator,\n                                                                           VULKAN_HPP_NAMESPACE::CuModuleNVX *                 pModule,\n                                                                           Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateCuModuleNVX( static_cast<VkDevice>( m_device ),\n                                                       reinterpret_cast<const VkCuModuleCreateInfoNVX *>( pCreateInfo ),\n                                                       reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                       reinterpret_cast<VkCuModuleNVX *>( pModule ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::CuModuleNVX>::type\n                       Device::createCuModuleNVX( const VULKAN_HPP_NAMESPACE::CuModuleCreateInfoNVX &       createInfo,\n                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                               Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateCuModuleNVX && \"Function <vkCreateCuModuleNVX> requires <VK_NVX_binary_import>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::CuModuleNVX module;\n    VULKAN_HPP_NAMESPACE::Result      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateCuModuleNVX( m_device,\n                             reinterpret_cast<const VkCuModuleCreateInfoNVX *>( &createInfo ),\n                             reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                             reinterpret_cast<VkCuModuleNVX *>( &module ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createCuModuleNVX\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( module ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::CuModuleNVX, Dispatch>>::type\n                       Device::createCuModuleNVXUnique( const VULKAN_HPP_NAMESPACE::CuModuleCreateInfoNVX &       createInfo,\n                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                     Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateCuModuleNVX && \"Function <vkCreateCuModuleNVX> requires <VK_NVX_binary_import>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::CuModuleNVX module;\n    VULKAN_HPP_NAMESPACE::Result      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateCuModuleNVX( m_device,\n                             reinterpret_cast<const VkCuModuleCreateInfoNVX *>( &createInfo ),\n                             reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                             reinterpret_cast<VkCuModuleNVX *>( &module ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createCuModuleNVXUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::CuModuleNVX, Dispatch>( module, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createCuFunctionNVX( const VULKAN_HPP_NAMESPACE::CuFunctionCreateInfoNVX * pCreateInfo,\n                                                                             const VULKAN_HPP_NAMESPACE::AllocationCallbacks *     pAllocator,\n                                                                             VULKAN_HPP_NAMESPACE::CuFunctionNVX *                 pFunction,\n                                                                             Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateCuFunctionNVX( static_cast<VkDevice>( m_device ),\n                                                         reinterpret_cast<const VkCuFunctionCreateInfoNVX *>( pCreateInfo ),\n                                                         reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                         reinterpret_cast<VkCuFunctionNVX *>( pFunction ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::CuFunctionNVX>::type\n                       Device::createCuFunctionNVX( const VULKAN_HPP_NAMESPACE::CuFunctionCreateInfoNVX &     createInfo,\n                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                 Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateCuFunctionNVX && \"Function <vkCreateCuFunctionNVX> requires <VK_NVX_binary_import>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::CuFunctionNVX function;\n    VULKAN_HPP_NAMESPACE::Result        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateCuFunctionNVX( m_device,\n                               reinterpret_cast<const VkCuFunctionCreateInfoNVX *>( &createInfo ),\n                               reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                               reinterpret_cast<VkCuFunctionNVX *>( &function ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createCuFunctionNVX\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( function ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::CuFunctionNVX, Dispatch>>::type\n                       Device::createCuFunctionNVXUnique( const VULKAN_HPP_NAMESPACE::CuFunctionCreateInfoNVX &     createInfo,\n                                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                       Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateCuFunctionNVX && \"Function <vkCreateCuFunctionNVX> requires <VK_NVX_binary_import>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::CuFunctionNVX function;\n    VULKAN_HPP_NAMESPACE::Result        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateCuFunctionNVX( m_device,\n                               reinterpret_cast<const VkCuFunctionCreateInfoNVX *>( &createInfo ),\n                               reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                               reinterpret_cast<VkCuFunctionNVX *>( &function ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createCuFunctionNVXUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::CuFunctionNVX, Dispatch>( function, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyCuModuleNVX( VULKAN_HPP_NAMESPACE::CuModuleNVX                 module,\n                                                     const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                     Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyCuModuleNVX(\n      static_cast<VkDevice>( m_device ), static_cast<VkCuModuleNVX>( module ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyCuModuleNVX( VULKAN_HPP_NAMESPACE::CuModuleNVX                         module,\n                                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                     Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyCuModuleNVX && \"Function <vkDestroyCuModuleNVX> requires <VK_NVX_binary_import>\" );\n#  endif\n\n    d.vkDestroyCuModuleNVX( m_device,\n                            static_cast<VkCuModuleNVX>( module ),\n                            reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::CuModuleNVX                 module,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyCuModuleNVX(\n      static_cast<VkDevice>( m_device ), static_cast<VkCuModuleNVX>( module ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::CuModuleNVX                         module,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyCuModuleNVX && \"Function <vkDestroyCuModuleNVX> requires <VK_NVX_binary_import>\" );\n#  endif\n\n    d.vkDestroyCuModuleNVX( m_device,\n                            static_cast<VkCuModuleNVX>( module ),\n                            reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyCuFunctionNVX( VULKAN_HPP_NAMESPACE::CuFunctionNVX               function,\n                                                       const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                       Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyCuFunctionNVX(\n      static_cast<VkDevice>( m_device ), static_cast<VkCuFunctionNVX>( function ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyCuFunctionNVX( VULKAN_HPP_NAMESPACE::CuFunctionNVX                       function,\n                                                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                       Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyCuFunctionNVX && \"Function <vkDestroyCuFunctionNVX> requires <VK_NVX_binary_import>\" );\n#  endif\n\n    d.vkDestroyCuFunctionNVX( m_device,\n                              static_cast<VkCuFunctionNVX>( function ),\n                              reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::CuFunctionNVX               function,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyCuFunctionNVX(\n      static_cast<VkDevice>( m_device ), static_cast<VkCuFunctionNVX>( function ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::CuFunctionNVX                       function,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyCuFunctionNVX && \"Function <vkDestroyCuFunctionNVX> requires <VK_NVX_binary_import>\" );\n#  endif\n\n    d.vkDestroyCuFunctionNVX( m_device,\n                              static_cast<VkCuFunctionNVX>( function ),\n                              reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::cuLaunchKernelNVX( const VULKAN_HPP_NAMESPACE::CuLaunchInfoNVX * pLaunchInfo,\n                                                           Dispatch const &                              d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCuLaunchKernelNVX( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkCuLaunchInfoNVX *>( pLaunchInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::cuLaunchKernelNVX( const VULKAN_HPP_NAMESPACE::CuLaunchInfoNVX & launchInfo,\n                                                           Dispatch const &                              d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdCuLaunchKernelNVX && \"Function <vkCmdCuLaunchKernelNVX> requires <VK_NVX_binary_import>\" );\n#  endif\n\n    d.vkCmdCuLaunchKernelNVX( m_commandBuffer, reinterpret_cast<const VkCuLaunchInfoNVX *>( &launchInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_NVX_image_view_handle ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE uint32_t Device::getImageViewHandleNVX( const VULKAN_HPP_NAMESPACE::ImageViewHandleInfoNVX * pInfo,\n                                                            Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return d.vkGetImageViewHandleNVX( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkImageViewHandleInfoNVX *>( pInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE uint32_t Device::getImageViewHandleNVX( const VULKAN_HPP_NAMESPACE::ImageViewHandleInfoNVX & info,\n                                                            Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetImageViewHandleNVX && \"Function <vkGetImageViewHandleNVX> requires <VK_NVX_image_view_handle>\" );\n#  endif\n\n    uint32_t result = d.vkGetImageViewHandleNVX( m_device, reinterpret_cast<const VkImageViewHandleInfoNVX *>( &info ) );\n\n    return result;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE uint64_t Device::getImageViewHandle64NVX( const VULKAN_HPP_NAMESPACE::ImageViewHandleInfoNVX * pInfo,\n                                                              Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return d.vkGetImageViewHandle64NVX( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkImageViewHandleInfoNVX *>( pInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE uint64_t Device::getImageViewHandle64NVX( const VULKAN_HPP_NAMESPACE::ImageViewHandleInfoNVX & info,\n                                                              Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetImageViewHandle64NVX && \"Function <vkGetImageViewHandle64NVX> requires <VK_NVX_image_view_handle>\" );\n#  endif\n\n    uint64_t result = d.vkGetImageViewHandle64NVX( m_device, reinterpret_cast<const VkImageViewHandleInfoNVX *>( &info ) );\n\n    return result;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getImageViewAddressNVX( VULKAN_HPP_NAMESPACE::ImageView                       imageView,\n                                                                                VULKAN_HPP_NAMESPACE::ImageViewAddressPropertiesNVX * pProperties,\n                                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetImageViewAddressNVX(\n      static_cast<VkDevice>( m_device ), static_cast<VkImageView>( imageView ), reinterpret_cast<VkImageViewAddressPropertiesNVX *>( pProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::ImageViewAddressPropertiesNVX>::type\n                       Device::getImageViewAddressNVX( VULKAN_HPP_NAMESPACE::ImageView imageView, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetImageViewAddressNVX && \"Function <vkGetImageViewAddressNVX> requires <VK_NVX_image_view_handle>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::ImageViewAddressPropertiesNVX properties;\n    VULKAN_HPP_NAMESPACE::Result                        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetImageViewAddressNVX( m_device, static_cast<VkImageView>( imageView ), reinterpret_cast<VkImageViewAddressPropertiesNVX *>( &properties ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getImageViewAddressNVX\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_AMD_draw_indirect_count ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::drawIndirectCountAMD( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                              VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                              VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                                              VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                                              uint32_t                         maxDrawCount,\n                                                              uint32_t                         stride,\n                                                              Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDrawIndirectCountAMD( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                 static_cast<VkBuffer>( buffer ),\n                                 static_cast<VkDeviceSize>( offset ),\n                                 static_cast<VkBuffer>( countBuffer ),\n                                 static_cast<VkDeviceSize>( countBufferOffset ),\n                                 maxDrawCount,\n                                 stride );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::drawIndexedIndirectCountAMD( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                                     VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                                     VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                                                     VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                                                     uint32_t                         maxDrawCount,\n                                                                     uint32_t                         stride,\n                                                                     Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDrawIndexedIndirectCountAMD( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                        static_cast<VkBuffer>( buffer ),\n                                        static_cast<VkDeviceSize>( offset ),\n                                        static_cast<VkBuffer>( countBuffer ),\n                                        static_cast<VkDeviceSize>( countBufferOffset ),\n                                        maxDrawCount,\n                                        stride );\n  }\n\n  //=== VK_AMD_shader_info ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getShaderInfoAMD( VULKAN_HPP_NAMESPACE::Pipeline            pipeline,\n                                                                          VULKAN_HPP_NAMESPACE::ShaderStageFlagBits shaderStage,\n                                                                          VULKAN_HPP_NAMESPACE::ShaderInfoTypeAMD   infoType,\n                                                                          size_t *                                  pInfoSize,\n                                                                          void *                                    pInfo,\n                                                                          Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetShaderInfoAMD( static_cast<VkDevice>( m_device ),\n                                                      static_cast<VkPipeline>( pipeline ),\n                                                      static_cast<VkShaderStageFlagBits>( shaderStage ),\n                                                      static_cast<VkShaderInfoTypeAMD>( infoType ),\n                                                      pInfoSize,\n                                                      pInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Uint8_tAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<uint8_t, Uint8_tAllocator>>::type\n                       Device::getShaderInfoAMD( VULKAN_HPP_NAMESPACE::Pipeline            pipeline,\n                              VULKAN_HPP_NAMESPACE::ShaderStageFlagBits shaderStage,\n                              VULKAN_HPP_NAMESPACE::ShaderInfoTypeAMD   infoType,\n                              Dispatch const &                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetShaderInfoAMD && \"Function <vkGetShaderInfoAMD> requires <VK_AMD_shader_info>\" );\n#  endif\n\n    std::vector<uint8_t, Uint8_tAllocator> info;\n    size_t                                 infoSize;\n    VULKAN_HPP_NAMESPACE::Result           result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetShaderInfoAMD( m_device,\n                                                                                static_cast<VkPipeline>( pipeline ),\n                                                                                static_cast<VkShaderStageFlagBits>( shaderStage ),\n                                                                                static_cast<VkShaderInfoTypeAMD>( infoType ),\n                                                                                &infoSize,\n                                                                                nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && infoSize )\n      {\n        info.resize( infoSize );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetShaderInfoAMD( m_device,\n                                                                                  static_cast<VkPipeline>( pipeline ),\n                                                                                  static_cast<VkShaderStageFlagBits>( shaderStage ),\n                                                                                  static_cast<VkShaderInfoTypeAMD>( infoType ),\n                                                                                  &infoSize,\n                                                                                  reinterpret_cast<void *>( info.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getShaderInfoAMD\" );\n    VULKAN_HPP_ASSERT( infoSize <= info.size() );\n    if ( infoSize < info.size() )\n    {\n      info.resize( infoSize );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( info ) );\n  }\n\n  template <typename Uint8_tAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<uint8_t, Uint8_tAllocator>>::type\n                       Device::getShaderInfoAMD( VULKAN_HPP_NAMESPACE::Pipeline            pipeline,\n                              VULKAN_HPP_NAMESPACE::ShaderStageFlagBits shaderStage,\n                              VULKAN_HPP_NAMESPACE::ShaderInfoTypeAMD   infoType,\n                              Uint8_tAllocator &                        uint8_tAllocator,\n                              Dispatch const &                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetShaderInfoAMD && \"Function <vkGetShaderInfoAMD> requires <VK_AMD_shader_info>\" );\n#  endif\n\n    std::vector<uint8_t, Uint8_tAllocator> info( uint8_tAllocator );\n    size_t                                 infoSize;\n    VULKAN_HPP_NAMESPACE::Result           result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetShaderInfoAMD( m_device,\n                                                                                static_cast<VkPipeline>( pipeline ),\n                                                                                static_cast<VkShaderStageFlagBits>( shaderStage ),\n                                                                                static_cast<VkShaderInfoTypeAMD>( infoType ),\n                                                                                &infoSize,\n                                                                                nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && infoSize )\n      {\n        info.resize( infoSize );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetShaderInfoAMD( m_device,\n                                                                                  static_cast<VkPipeline>( pipeline ),\n                                                                                  static_cast<VkShaderStageFlagBits>( shaderStage ),\n                                                                                  static_cast<VkShaderInfoTypeAMD>( infoType ),\n                                                                                  &infoSize,\n                                                                                  reinterpret_cast<void *>( info.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getShaderInfoAMD\" );\n    VULKAN_HPP_ASSERT( infoSize <= info.size() );\n    if ( infoSize < info.size() )\n    {\n      info.resize( infoSize );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( info ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_dynamic_rendering ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::beginRenderingKHR( const VULKAN_HPP_NAMESPACE::RenderingInfo * pRenderingInfo,\n                                                           Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBeginRenderingKHR( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkRenderingInfo *>( pRenderingInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::beginRenderingKHR( const VULKAN_HPP_NAMESPACE::RenderingInfo & renderingInfo,\n                                                           Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBeginRenderingKHR && \"Function <vkCmdBeginRenderingKHR> requires <VK_KHR_dynamic_rendering> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkCmdBeginRenderingKHR( m_commandBuffer, reinterpret_cast<const VkRenderingInfo *>( &renderingInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::endRenderingKHR( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdEndRenderingKHR( static_cast<VkCommandBuffer>( m_commandBuffer ) );\n  }\n\n#if defined( VK_USE_PLATFORM_GGP )\n  //=== VK_GGP_stream_descriptor_surface ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Instance::createStreamDescriptorSurfaceGGP( const VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateInfoGGP * pCreateInfo,\n                                                const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                  pAllocator,\n                                                VULKAN_HPP_NAMESPACE::SurfaceKHR *                                 pSurface,\n                                                Dispatch const &                                                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateStreamDescriptorSurfaceGGP( static_cast<VkInstance>( m_instance ),\n                                                                      reinterpret_cast<const VkStreamDescriptorSurfaceCreateInfoGGP *>( pCreateInfo ),\n                                                                      reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                                      reinterpret_cast<VkSurfaceKHR *>( pSurface ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n                       Instance::createStreamDescriptorSurfaceGGP( const VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateInfoGGP & createInfo,\n                                                Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>          allocator,\n                                                Dispatch const &                                                   d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateStreamDescriptorSurfaceGGP && \"Function <vkCreateStreamDescriptorSurfaceGGP> requires <VK_GGP_stream_descriptor_surface>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateStreamDescriptorSurfaceGGP(\n      m_instance,\n      reinterpret_cast<const VkStreamDescriptorSurfaceCreateInfoGGP *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createStreamDescriptorSurfaceGGP\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( surface ) );\n  }\n\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n                       Instance::createStreamDescriptorSurfaceGGPUnique( const VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateInfoGGP & createInfo,\n                                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>          allocator,\n                                                      Dispatch const &                                                   d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#      if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateStreamDescriptorSurfaceGGP && \"Function <vkCreateStreamDescriptorSurfaceGGP> requires <VK_GGP_stream_descriptor_surface>\" );\n#      endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateStreamDescriptorSurfaceGGP(\n      m_instance,\n      reinterpret_cast<const VkStreamDescriptorSurfaceCreateInfoGGP *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createStreamDescriptorSurfaceGGPUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>( surface, detail::ObjectDestroy<Instance, Dispatch>( *this, allocator, d ) ) );\n  }\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_GGP*/\n\n  //=== VK_NV_external_memory_capabilities ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    PhysicalDevice::getExternalImageFormatPropertiesNV( VULKAN_HPP_NAMESPACE::Format                            format,\n                                                        VULKAN_HPP_NAMESPACE::ImageType                         type,\n                                                        VULKAN_HPP_NAMESPACE::ImageTiling                       tiling,\n                                                        VULKAN_HPP_NAMESPACE::ImageUsageFlags                   usage,\n                                                        VULKAN_HPP_NAMESPACE::ImageCreateFlags                  flags,\n                                                        VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV   externalHandleType,\n                                                        VULKAN_HPP_NAMESPACE::ExternalImageFormatPropertiesNV * pExternalImageFormatProperties,\n                                                        Dispatch const &                                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkGetPhysicalDeviceExternalImageFormatPropertiesNV( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                            static_cast<VkFormat>( format ),\n                                                            static_cast<VkImageType>( type ),\n                                                            static_cast<VkImageTiling>( tiling ),\n                                                            static_cast<VkImageUsageFlags>( usage ),\n                                                            static_cast<VkImageCreateFlags>( flags ),\n                                                            static_cast<VkExternalMemoryHandleTypeFlagsNV>( externalHandleType ),\n                                                            reinterpret_cast<VkExternalImageFormatPropertiesNV *>( pExternalImageFormatProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::ExternalImageFormatPropertiesNV>::type\n                       PhysicalDevice::getExternalImageFormatPropertiesNV( VULKAN_HPP_NAMESPACE::Format                          format,\n                                                        VULKAN_HPP_NAMESPACE::ImageType                       type,\n                                                        VULKAN_HPP_NAMESPACE::ImageTiling                     tiling,\n                                                        VULKAN_HPP_NAMESPACE::ImageUsageFlags                 usage,\n                                                        VULKAN_HPP_NAMESPACE::ImageCreateFlags                flags,\n                                                        VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV externalHandleType,\n                                                        Dispatch const &                                      d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceExternalImageFormatPropertiesNV &&\n                       \"Function <vkGetPhysicalDeviceExternalImageFormatPropertiesNV> requires <VK_NV_external_memory_capabilities>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::ExternalImageFormatPropertiesNV externalImageFormatProperties;\n    VULKAN_HPP_NAMESPACE::Result                          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetPhysicalDeviceExternalImageFormatPropertiesNV( m_physicalDevice,\n                                                            static_cast<VkFormat>( format ),\n                                                            static_cast<VkImageType>( type ),\n                                                            static_cast<VkImageTiling>( tiling ),\n                                                            static_cast<VkImageUsageFlags>( usage ),\n                                                            static_cast<VkImageCreateFlags>( flags ),\n                                                            static_cast<VkExternalMemoryHandleTypeFlagsNV>( externalHandleType ),\n                                                            reinterpret_cast<VkExternalImageFormatPropertiesNV *>( &externalImageFormatProperties ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getExternalImageFormatPropertiesNV\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( externalImageFormatProperties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_NV_external_memory_win32 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getMemoryWin32HandleNV( VULKAN_HPP_NAMESPACE::DeviceMemory                    memory,\n                                                                                VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV handleType,\n                                                                                HANDLE *                                              pHandle,\n                                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetMemoryWin32HandleNV(\n      static_cast<VkDevice>( m_device ), static_cast<VkDeviceMemory>( memory ), static_cast<VkExternalMemoryHandleTypeFlagsNV>( handleType ), pHandle ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<HANDLE>::type Device::getMemoryWin32HandleNV(\n    VULKAN_HPP_NAMESPACE::DeviceMemory memory, VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV handleType, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetMemoryWin32HandleNV && \"Function <vkGetMemoryWin32HandleNV> requires <VK_NV_external_memory_win32>\" );\n#    endif\n\n    HANDLE                       handle;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetMemoryWin32HandleNV( m_device, static_cast<VkDeviceMemory>( memory ), static_cast<VkExternalMemoryHandleTypeFlagsNV>( handleType ), &handle ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getMemoryWin32HandleNV\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( handle ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_KHR_get_physical_device_properties2 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::getFeatures2KHR( VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 * pFeatures,\n                                                          Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceFeatures2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ), reinterpret_cast<VkPhysicalDeviceFeatures2 *>( pFeatures ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2\n                                         PhysicalDevice::getFeatures2KHR( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceFeatures2KHR &&\n                       \"Function <vkGetPhysicalDeviceFeatures2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 features;\n    d.vkGetPhysicalDeviceFeatures2KHR( m_physicalDevice, reinterpret_cast<VkPhysicalDeviceFeatures2 *>( &features ) );\n\n    return features;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                                         PhysicalDevice::getFeatures2KHR( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceFeatures2KHR &&\n                       \"Function <vkGetPhysicalDeviceFeatures2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 &  features = structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2>();\n    d.vkGetPhysicalDeviceFeatures2KHR( m_physicalDevice, reinterpret_cast<VkPhysicalDeviceFeatures2 *>( &features ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::getProperties2KHR( VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 * pProperties,\n                                                            Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceProperties2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ), reinterpret_cast<VkPhysicalDeviceProperties2 *>( pProperties ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2\n                                         PhysicalDevice::getProperties2KHR( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceProperties2KHR &&\n                       \"Function <vkGetPhysicalDeviceProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 properties;\n    d.vkGetPhysicalDeviceProperties2KHR( m_physicalDevice, reinterpret_cast<VkPhysicalDeviceProperties2 *>( &properties ) );\n\n    return properties;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                                         PhysicalDevice::getProperties2KHR( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceProperties2KHR &&\n                       \"Function <vkGetPhysicalDeviceProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>  structureChain;\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 & properties = structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2>();\n    d.vkGetPhysicalDeviceProperties2KHR( m_physicalDevice, reinterpret_cast<VkPhysicalDeviceProperties2 *>( &properties ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::getFormatProperties2KHR( VULKAN_HPP_NAMESPACE::Format              format,\n                                                                  VULKAN_HPP_NAMESPACE::FormatProperties2 * pFormatProperties,\n                                                                  Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceFormatProperties2KHR(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ), static_cast<VkFormat>( format ), reinterpret_cast<VkFormatProperties2 *>( pFormatProperties ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::FormatProperties2\n    PhysicalDevice::getFormatProperties2KHR( VULKAN_HPP_NAMESPACE::Format format, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceFormatProperties2KHR &&\n                       \"Function <vkGetPhysicalDeviceFormatProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::FormatProperties2 formatProperties;\n    d.vkGetPhysicalDeviceFormatProperties2KHR(\n      m_physicalDevice, static_cast<VkFormat>( format ), reinterpret_cast<VkFormatProperties2 *>( &formatProperties ) );\n\n    return formatProperties;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n    PhysicalDevice::getFormatProperties2KHR( VULKAN_HPP_NAMESPACE::Format format, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceFormatProperties2KHR &&\n                       \"Function <vkGetPhysicalDeviceFormatProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n    VULKAN_HPP_NAMESPACE::FormatProperties2 &        formatProperties = structureChain.template get<VULKAN_HPP_NAMESPACE::FormatProperties2>();\n    d.vkGetPhysicalDeviceFormatProperties2KHR(\n      m_physicalDevice, static_cast<VkFormat>( format ), reinterpret_cast<VkFormatProperties2 *>( &formatProperties ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    PhysicalDevice::getImageFormatProperties2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 * pImageFormatInfo,\n                                                  VULKAN_HPP_NAMESPACE::ImageFormatProperties2 *               pImageFormatProperties,\n                                                  Dispatch const &                                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceImageFormatProperties2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                                reinterpret_cast<const VkPhysicalDeviceImageFormatInfo2 *>( pImageFormatInfo ),\n                                                                                reinterpret_cast<VkImageFormatProperties2 *>( pImageFormatProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::ImageFormatProperties2>::type\n    PhysicalDevice::getImageFormatProperties2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 & imageFormatInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceImageFormatProperties2KHR &&\n                       \"Function <vkGetPhysicalDeviceImageFormatProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::ImageFormatProperties2 imageFormatProperties;\n    VULKAN_HPP_NAMESPACE::Result                 result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetPhysicalDeviceImageFormatProperties2KHR( m_physicalDevice,\n                                                      reinterpret_cast<const VkPhysicalDeviceImageFormatInfo2 *>( &imageFormatInfo ),\n                                                      reinterpret_cast<VkImageFormatProperties2 *>( &imageFormatProperties ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getImageFormatProperties2KHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( imageFormatProperties ) );\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>>::type\n    PhysicalDevice::getImageFormatProperties2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 & imageFormatInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceImageFormatProperties2KHR &&\n                       \"Function <vkGetPhysicalDeviceImageFormatProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    StructureChain<X, Y, Z...>                     structureChain;\n    VULKAN_HPP_NAMESPACE::ImageFormatProperties2 & imageFormatProperties = structureChain.template get<VULKAN_HPP_NAMESPACE::ImageFormatProperties2>();\n    VULKAN_HPP_NAMESPACE::Result                   result                = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetPhysicalDeviceImageFormatProperties2KHR( m_physicalDevice,\n                                                      reinterpret_cast<const VkPhysicalDeviceImageFormatInfo2 *>( &imageFormatInfo ),\n                                                      reinterpret_cast<VkImageFormatProperties2 *>( &imageFormatProperties ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getImageFormatProperties2KHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( structureChain ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::getQueueFamilyProperties2KHR( uint32_t *                                     pQueueFamilyPropertyCount,\n                                                                       VULKAN_HPP_NAMESPACE::QueueFamilyProperties2 * pQueueFamilyProperties,\n                                                                       Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceQueueFamilyProperties2KHR(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ), pQueueFamilyPropertyCount, reinterpret_cast<VkQueueFamilyProperties2 *>( pQueueFamilyProperties ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <\n    typename QueueFamilyProperties2Allocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename QueueFamilyProperties2Allocator::value_type, VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2, QueueFamilyProperties2Allocator>\n                                         PhysicalDevice::getQueueFamilyProperties2KHR( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceQueueFamilyProperties2KHR &&\n                       \"Function <vkGetPhysicalDeviceQueueFamilyProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2, QueueFamilyProperties2Allocator> queueFamilyProperties;\n    uint32_t                                                                                   queueFamilyPropertyCount;\n    d.vkGetPhysicalDeviceQueueFamilyProperties2KHR( m_physicalDevice, &queueFamilyPropertyCount, nullptr );\n    queueFamilyProperties.resize( queueFamilyPropertyCount );\n    d.vkGetPhysicalDeviceQueueFamilyProperties2KHR(\n      m_physicalDevice, &queueFamilyPropertyCount, reinterpret_cast<VkQueueFamilyProperties2 *>( queueFamilyProperties.data() ) );\n\n    VULKAN_HPP_ASSERT( queueFamilyPropertyCount <= queueFamilyProperties.size() );\n    if ( queueFamilyPropertyCount < queueFamilyProperties.size() )\n    {\n      queueFamilyProperties.resize( queueFamilyPropertyCount );\n    }\n    return queueFamilyProperties;\n  }\n\n  template <\n    typename QueueFamilyProperties2Allocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename QueueFamilyProperties2Allocator::value_type, VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2, QueueFamilyProperties2Allocator>\n    PhysicalDevice::getQueueFamilyProperties2KHR( QueueFamilyProperties2Allocator & queueFamilyProperties2Allocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceQueueFamilyProperties2KHR &&\n                       \"Function <vkGetPhysicalDeviceQueueFamilyProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2, QueueFamilyProperties2Allocator> queueFamilyProperties( queueFamilyProperties2Allocator );\n    uint32_t                                                                                   queueFamilyPropertyCount;\n    d.vkGetPhysicalDeviceQueueFamilyProperties2KHR( m_physicalDevice, &queueFamilyPropertyCount, nullptr );\n    queueFamilyProperties.resize( queueFamilyPropertyCount );\n    d.vkGetPhysicalDeviceQueueFamilyProperties2KHR(\n      m_physicalDevice, &queueFamilyPropertyCount, reinterpret_cast<VkQueueFamilyProperties2 *>( queueFamilyProperties.data() ) );\n\n    VULKAN_HPP_ASSERT( queueFamilyPropertyCount <= queueFamilyProperties.size() );\n    if ( queueFamilyPropertyCount < queueFamilyProperties.size() )\n    {\n      queueFamilyProperties.resize( queueFamilyPropertyCount );\n    }\n    return queueFamilyProperties;\n  }\n\n  template <typename StructureChain,\n            typename StructureChainAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename StructureChainAllocator::value_type, StructureChain>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<StructureChain, StructureChainAllocator>\n                                         PhysicalDevice::getQueueFamilyProperties2KHR( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceQueueFamilyProperties2KHR &&\n                       \"Function <vkGetPhysicalDeviceQueueFamilyProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    std::vector<StructureChain, StructureChainAllocator>      structureChains;\n    std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2> queueFamilyProperties;\n    uint32_t                                                  queueFamilyPropertyCount;\n    d.vkGetPhysicalDeviceQueueFamilyProperties2KHR( m_physicalDevice, &queueFamilyPropertyCount, nullptr );\n    structureChains.resize( queueFamilyPropertyCount );\n    queueFamilyProperties.resize( queueFamilyPropertyCount );\n    for ( uint32_t i = 0; i < queueFamilyPropertyCount; i++ )\n    {\n      queueFamilyProperties[i].pNext = structureChains[i].template get<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>().pNext;\n    }\n    d.vkGetPhysicalDeviceQueueFamilyProperties2KHR(\n      m_physicalDevice, &queueFamilyPropertyCount, reinterpret_cast<VkQueueFamilyProperties2 *>( queueFamilyProperties.data() ) );\n\n    VULKAN_HPP_ASSERT( queueFamilyPropertyCount <= queueFamilyProperties.size() );\n    if ( queueFamilyPropertyCount < queueFamilyProperties.size() )\n    {\n      structureChains.resize( queueFamilyPropertyCount );\n    }\n    for ( uint32_t i = 0; i < queueFamilyPropertyCount; i++ )\n    {\n      structureChains[i].template get<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>() = queueFamilyProperties[i];\n    }\n    return structureChains;\n  }\n\n  template <typename StructureChain,\n            typename StructureChainAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename StructureChainAllocator::value_type, StructureChain>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<StructureChain, StructureChainAllocator>\n    PhysicalDevice::getQueueFamilyProperties2KHR( StructureChainAllocator & structureChainAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceQueueFamilyProperties2KHR &&\n                       \"Function <vkGetPhysicalDeviceQueueFamilyProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    std::vector<StructureChain, StructureChainAllocator>      structureChains( structureChainAllocator );\n    std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2> queueFamilyProperties;\n    uint32_t                                                  queueFamilyPropertyCount;\n    d.vkGetPhysicalDeviceQueueFamilyProperties2KHR( m_physicalDevice, &queueFamilyPropertyCount, nullptr );\n    structureChains.resize( queueFamilyPropertyCount );\n    queueFamilyProperties.resize( queueFamilyPropertyCount );\n    for ( uint32_t i = 0; i < queueFamilyPropertyCount; i++ )\n    {\n      queueFamilyProperties[i].pNext = structureChains[i].template get<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>().pNext;\n    }\n    d.vkGetPhysicalDeviceQueueFamilyProperties2KHR(\n      m_physicalDevice, &queueFamilyPropertyCount, reinterpret_cast<VkQueueFamilyProperties2 *>( queueFamilyProperties.data() ) );\n\n    VULKAN_HPP_ASSERT( queueFamilyPropertyCount <= queueFamilyProperties.size() );\n    if ( queueFamilyPropertyCount < queueFamilyProperties.size() )\n    {\n      structureChains.resize( queueFamilyPropertyCount );\n    }\n    for ( uint32_t i = 0; i < queueFamilyPropertyCount; i++ )\n    {\n      structureChains[i].template get<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>() = queueFamilyProperties[i];\n    }\n    return structureChains;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::getMemoryProperties2KHR( VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 * pMemoryProperties,\n                                                                  Dispatch const &                                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceMemoryProperties2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                               reinterpret_cast<VkPhysicalDeviceMemoryProperties2 *>( pMemoryProperties ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2\n                                         PhysicalDevice::getMemoryProperties2KHR( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceMemoryProperties2KHR &&\n                       \"Function <vkGetPhysicalDeviceMemoryProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 memoryProperties;\n    d.vkGetPhysicalDeviceMemoryProperties2KHR( m_physicalDevice, reinterpret_cast<VkPhysicalDeviceMemoryProperties2 *>( &memoryProperties ) );\n\n    return memoryProperties;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                                         PhysicalDevice::getMemoryProperties2KHR( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceMemoryProperties2KHR &&\n                       \"Function <vkGetPhysicalDeviceMemoryProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>        structureChain;\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 & memoryProperties =\n      structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2>();\n    d.vkGetPhysicalDeviceMemoryProperties2KHR( m_physicalDevice, reinterpret_cast<VkPhysicalDeviceMemoryProperties2 *>( &memoryProperties ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::getSparseImageFormatProperties2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 * pFormatInfo,\n                                                                             uint32_t *                                                         pPropertyCount,\n                                                                             VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2 *               pProperties,\n                                                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceSparseImageFormatProperties2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                          reinterpret_cast<const VkPhysicalDeviceSparseImageFormatInfo2 *>( pFormatInfo ),\n                                                          pPropertyCount,\n                                                          reinterpret_cast<VkSparseImageFormatProperties2 *>( pProperties ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <\n    typename SparseImageFormatProperties2Allocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename SparseImageFormatProperties2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2, SparseImageFormatProperties2Allocator>\n    PhysicalDevice::getSparseImageFormatProperties2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 & formatInfo,\n                                                        Dispatch const &                                                   d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceSparseImageFormatProperties2KHR &&\n                       \"Function <vkGetPhysicalDeviceSparseImageFormatProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2, SparseImageFormatProperties2Allocator> properties;\n    uint32_t                                                                                               propertyCount;\n    d.vkGetPhysicalDeviceSparseImageFormatProperties2KHR(\n      m_physicalDevice, reinterpret_cast<const VkPhysicalDeviceSparseImageFormatInfo2 *>( &formatInfo ), &propertyCount, nullptr );\n    properties.resize( propertyCount );\n    d.vkGetPhysicalDeviceSparseImageFormatProperties2KHR( m_physicalDevice,\n                                                          reinterpret_cast<const VkPhysicalDeviceSparseImageFormatInfo2 *>( &formatInfo ),\n                                                          &propertyCount,\n                                                          reinterpret_cast<VkSparseImageFormatProperties2 *>( properties.data() ) );\n\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return properties;\n  }\n\n  template <\n    typename SparseImageFormatProperties2Allocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename SparseImageFormatProperties2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2, SparseImageFormatProperties2Allocator>\n    PhysicalDevice::getSparseImageFormatProperties2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 & formatInfo,\n                                                        SparseImageFormatProperties2Allocator & sparseImageFormatProperties2Allocator,\n                                                        Dispatch const &                        d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceSparseImageFormatProperties2KHR &&\n                       \"Function <vkGetPhysicalDeviceSparseImageFormatProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2, SparseImageFormatProperties2Allocator> properties( sparseImageFormatProperties2Allocator );\n    uint32_t                                                                                               propertyCount;\n    d.vkGetPhysicalDeviceSparseImageFormatProperties2KHR(\n      m_physicalDevice, reinterpret_cast<const VkPhysicalDeviceSparseImageFormatInfo2 *>( &formatInfo ), &propertyCount, nullptr );\n    properties.resize( propertyCount );\n    d.vkGetPhysicalDeviceSparseImageFormatProperties2KHR( m_physicalDevice,\n                                                          reinterpret_cast<const VkPhysicalDeviceSparseImageFormatInfo2 *>( &formatInfo ),\n                                                          &propertyCount,\n                                                          reinterpret_cast<VkSparseImageFormatProperties2 *>( properties.data() ) );\n\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return properties;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_device_group ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getGroupPeerMemoryFeaturesKHR( uint32_t                                       heapIndex,\n                                                                uint32_t                                       localDeviceIndex,\n                                                                uint32_t                                       remoteDeviceIndex,\n                                                                VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags * pPeerMemoryFeatures,\n                                                                Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetDeviceGroupPeerMemoryFeaturesKHR(\n      static_cast<VkDevice>( m_device ), heapIndex, localDeviceIndex, remoteDeviceIndex, reinterpret_cast<VkPeerMemoryFeatureFlags *>( pPeerMemoryFeatures ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags Device::getGroupPeerMemoryFeaturesKHR(\n    uint32_t heapIndex, uint32_t localDeviceIndex, uint32_t remoteDeviceIndex, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceGroupPeerMemoryFeaturesKHR &&\n                       \"Function <vkGetDeviceGroupPeerMemoryFeaturesKHR> requires <VK_KHR_device_group> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags peerMemoryFeatures;\n    d.vkGetDeviceGroupPeerMemoryFeaturesKHR(\n      m_device, heapIndex, localDeviceIndex, remoteDeviceIndex, reinterpret_cast<VkPeerMemoryFeatureFlags *>( &peerMemoryFeatures ) );\n\n    return peerMemoryFeatures;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDeviceMaskKHR( uint32_t deviceMask, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDeviceMaskKHR( static_cast<VkCommandBuffer>( m_commandBuffer ), deviceMask );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::dispatchBaseKHR( uint32_t         baseGroupX,\n                                                         uint32_t         baseGroupY,\n                                                         uint32_t         baseGroupZ,\n                                                         uint32_t         groupCountX,\n                                                         uint32_t         groupCountY,\n                                                         uint32_t         groupCountZ,\n                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDispatchBaseKHR( static_cast<VkCommandBuffer>( m_commandBuffer ), baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ );\n  }\n\n#if defined( VK_USE_PLATFORM_VI_NN )\n  //=== VK_NN_vi_surface ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Instance::createViSurfaceNN( const VULKAN_HPP_NAMESPACE::ViSurfaceCreateInfoNN * pCreateInfo,\n                                                                             const VULKAN_HPP_NAMESPACE::AllocationCallbacks *   pAllocator,\n                                                                             VULKAN_HPP_NAMESPACE::SurfaceKHR *                  pSurface,\n                                                                             Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateViSurfaceNN( static_cast<VkInstance>( m_instance ),\n                                                       reinterpret_cast<const VkViSurfaceCreateInfoNN *>( pCreateInfo ),\n                                                       reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                       reinterpret_cast<VkSurfaceKHR *>( pSurface ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n                       Instance::createViSurfaceNN( const VULKAN_HPP_NAMESPACE::ViSurfaceCreateInfoNN &       createInfo,\n                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                 Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateViSurfaceNN && \"Function <vkCreateViSurfaceNN> requires <VK_NN_vi_surface>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateViSurfaceNN( m_instance,\n                             reinterpret_cast<const VkViSurfaceCreateInfoNN *>( &createInfo ),\n                             reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                             reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createViSurfaceNN\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( surface ) );\n  }\n\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n                       Instance::createViSurfaceNNUnique( const VULKAN_HPP_NAMESPACE::ViSurfaceCreateInfoNN &       createInfo,\n                                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                       Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#      if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateViSurfaceNN && \"Function <vkCreateViSurfaceNN> requires <VK_NN_vi_surface>\" );\n#      endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateViSurfaceNN( m_instance,\n                             reinterpret_cast<const VkViSurfaceCreateInfoNN *>( &createInfo ),\n                             reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                             reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createViSurfaceNNUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>( surface, detail::ObjectDestroy<Instance, Dispatch>( *this, allocator, d ) ) );\n  }\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_VI_NN*/\n\n  //=== VK_KHR_maintenance1 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::trimCommandPoolKHR( VULKAN_HPP_NAMESPACE::CommandPool          commandPool,\n                                                     VULKAN_HPP_NAMESPACE::CommandPoolTrimFlags flags,\n                                                     Dispatch const &                           d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkTrimCommandPoolKHR( static_cast<VkDevice>( m_device ), static_cast<VkCommandPool>( commandPool ), static_cast<VkCommandPoolTrimFlags>( flags ) );\n  }\n\n  //=== VK_KHR_device_group_creation ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Instance::enumeratePhysicalDeviceGroupsKHR( uint32_t *                                            pPhysicalDeviceGroupCount,\n                                                VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties * pPhysicalDeviceGroupProperties,\n                                                Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkEnumeratePhysicalDeviceGroupsKHR( static_cast<VkInstance>( m_instance ),\n                                                                      pPhysicalDeviceGroupCount,\n                                                                      reinterpret_cast<VkPhysicalDeviceGroupProperties *>( pPhysicalDeviceGroupProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename PhysicalDeviceGroupPropertiesAllocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename PhysicalDeviceGroupPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties, PhysicalDeviceGroupPropertiesAllocator>>::type\n    Instance::enumeratePhysicalDeviceGroupsKHR( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkEnumeratePhysicalDeviceGroupsKHR &&\n                       \"Function <vkEnumeratePhysicalDeviceGroupsKHR> requires <VK_KHR_device_group_creation> or <VK_VERSION_1_1>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties, PhysicalDeviceGroupPropertiesAllocator> physicalDeviceGroupProperties;\n    uint32_t                                                                                                 physicalDeviceGroupCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                             result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkEnumeratePhysicalDeviceGroupsKHR( m_instance, &physicalDeviceGroupCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && physicalDeviceGroupCount )\n      {\n        physicalDeviceGroupProperties.resize( physicalDeviceGroupCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkEnumeratePhysicalDeviceGroupsKHR(\n          m_instance, &physicalDeviceGroupCount, reinterpret_cast<VkPhysicalDeviceGroupProperties *>( physicalDeviceGroupProperties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::enumeratePhysicalDeviceGroupsKHR\" );\n    VULKAN_HPP_ASSERT( physicalDeviceGroupCount <= physicalDeviceGroupProperties.size() );\n    if ( physicalDeviceGroupCount < physicalDeviceGroupProperties.size() )\n    {\n      physicalDeviceGroupProperties.resize( physicalDeviceGroupCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( physicalDeviceGroupProperties ) );\n  }\n\n  template <typename PhysicalDeviceGroupPropertiesAllocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename PhysicalDeviceGroupPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties, PhysicalDeviceGroupPropertiesAllocator>>::type\n    Instance::enumeratePhysicalDeviceGroupsKHR( PhysicalDeviceGroupPropertiesAllocator & physicalDeviceGroupPropertiesAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkEnumeratePhysicalDeviceGroupsKHR &&\n                       \"Function <vkEnumeratePhysicalDeviceGroupsKHR> requires <VK_KHR_device_group_creation> or <VK_VERSION_1_1>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties, PhysicalDeviceGroupPropertiesAllocator> physicalDeviceGroupProperties(\n      physicalDeviceGroupPropertiesAllocator );\n    uint32_t                     physicalDeviceGroupCount;\n    VULKAN_HPP_NAMESPACE::Result result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkEnumeratePhysicalDeviceGroupsKHR( m_instance, &physicalDeviceGroupCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && physicalDeviceGroupCount )\n      {\n        physicalDeviceGroupProperties.resize( physicalDeviceGroupCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkEnumeratePhysicalDeviceGroupsKHR(\n          m_instance, &physicalDeviceGroupCount, reinterpret_cast<VkPhysicalDeviceGroupProperties *>( physicalDeviceGroupProperties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::enumeratePhysicalDeviceGroupsKHR\" );\n    VULKAN_HPP_ASSERT( physicalDeviceGroupCount <= physicalDeviceGroupProperties.size() );\n    if ( physicalDeviceGroupCount < physicalDeviceGroupProperties.size() )\n    {\n      physicalDeviceGroupProperties.resize( physicalDeviceGroupCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( physicalDeviceGroupProperties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_external_memory_capabilities ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::getExternalBufferPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo * pExternalBufferInfo,\n                                                                         VULKAN_HPP_NAMESPACE::ExternalBufferProperties * pExternalBufferProperties,\n                                                                         Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceExternalBufferPropertiesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                      reinterpret_cast<const VkPhysicalDeviceExternalBufferInfo *>( pExternalBufferInfo ),\n                                                      reinterpret_cast<VkExternalBufferProperties *>( pExternalBufferProperties ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ExternalBufferProperties\n    PhysicalDevice::getExternalBufferPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo & externalBufferInfo,\n                                                    Dispatch const &                                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceExternalBufferPropertiesKHR &&\n                       \"Function <vkGetPhysicalDeviceExternalBufferPropertiesKHR> requires <VK_KHR_external_memory_capabilities> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::ExternalBufferProperties externalBufferProperties;\n    d.vkGetPhysicalDeviceExternalBufferPropertiesKHR( m_physicalDevice,\n                                                      reinterpret_cast<const VkPhysicalDeviceExternalBufferInfo *>( &externalBufferInfo ),\n                                                      reinterpret_cast<VkExternalBufferProperties *>( &externalBufferProperties ) );\n\n    return externalBufferProperties;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_KHR_external_memory_win32 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getMemoryWin32HandleKHR( const VULKAN_HPP_NAMESPACE::MemoryGetWin32HandleInfoKHR * pGetWin32HandleInfo,\n                                                                                 HANDLE *                                                  pHandle,\n                                                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetMemoryWin32HandleKHR(\n      static_cast<VkDevice>( m_device ), reinterpret_cast<const VkMemoryGetWin32HandleInfoKHR *>( pGetWin32HandleInfo ), pHandle ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<HANDLE>::type\n                       Device::getMemoryWin32HandleKHR( const VULKAN_HPP_NAMESPACE::MemoryGetWin32HandleInfoKHR & getWin32HandleInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetMemoryWin32HandleKHR && \"Function <vkGetMemoryWin32HandleKHR> requires <VK_KHR_external_memory_win32>\" );\n#    endif\n\n    HANDLE                       handle;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetMemoryWin32HandleKHR( m_device, reinterpret_cast<const VkMemoryGetWin32HandleInfoKHR *>( &getWin32HandleInfo ), &handle ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getMemoryWin32HandleKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( handle ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::getMemoryWin32HandlePropertiesKHR( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType,\n                                               HANDLE                                                 handle,\n                                               VULKAN_HPP_NAMESPACE::MemoryWin32HandlePropertiesKHR * pMemoryWin32HandleProperties,\n                                               Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetMemoryWin32HandlePropertiesKHR( static_cast<VkDevice>( m_device ),\n                                                                       static_cast<VkExternalMemoryHandleTypeFlagBits>( handleType ),\n                                                                       handle,\n                                                                       reinterpret_cast<VkMemoryWin32HandlePropertiesKHR *>( pMemoryWin32HandleProperties ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::MemoryWin32HandlePropertiesKHR>::type\n    Device::getMemoryWin32HandlePropertiesKHR( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType, HANDLE handle, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetMemoryWin32HandlePropertiesKHR && \"Function <vkGetMemoryWin32HandlePropertiesKHR> requires <VK_KHR_external_memory_win32>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::MemoryWin32HandlePropertiesKHR memoryWin32HandleProperties;\n    VULKAN_HPP_NAMESPACE::Result                         result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetMemoryWin32HandlePropertiesKHR( m_device,\n                                             static_cast<VkExternalMemoryHandleTypeFlagBits>( handleType ),\n                                             handle,\n                                             reinterpret_cast<VkMemoryWin32HandlePropertiesKHR *>( &memoryWin32HandleProperties ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getMemoryWin32HandlePropertiesKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( memoryWin32HandleProperties ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_KHR_external_memory_fd ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getMemoryFdKHR( const VULKAN_HPP_NAMESPACE::MemoryGetFdInfoKHR * pGetFdInfo,\n                                                                        int *                                            pFd,\n                                                                        Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetMemoryFdKHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkMemoryGetFdInfoKHR *>( pGetFdInfo ), pFd ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<int>::type Device::getMemoryFdKHR( const VULKAN_HPP_NAMESPACE::MemoryGetFdInfoKHR & getFdInfo,\n                                                                                                     Dispatch const &                                 d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetMemoryFdKHR && \"Function <vkGetMemoryFdKHR> requires <VK_KHR_external_memory_fd>\" );\n#  endif\n\n    int                          fd;\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetMemoryFdKHR( m_device, reinterpret_cast<const VkMemoryGetFdInfoKHR *>( &getFdInfo ), &fd ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getMemoryFdKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( fd ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getMemoryFdPropertiesKHR( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType,\n                                                                                  int                                                    fd,\n                                                                                  VULKAN_HPP_NAMESPACE::MemoryFdPropertiesKHR *          pMemoryFdProperties,\n                                                                                  Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetMemoryFdPropertiesKHR( static_cast<VkDevice>( m_device ),\n                                                              static_cast<VkExternalMemoryHandleTypeFlagBits>( handleType ),\n                                                              fd,\n                                                              reinterpret_cast<VkMemoryFdPropertiesKHR *>( pMemoryFdProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::MemoryFdPropertiesKHR>::type\n                       Device::getMemoryFdPropertiesKHR( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType, int fd, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetMemoryFdPropertiesKHR && \"Function <vkGetMemoryFdPropertiesKHR> requires <VK_KHR_external_memory_fd>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::MemoryFdPropertiesKHR memoryFdProperties;\n    VULKAN_HPP_NAMESPACE::Result                result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetMemoryFdPropertiesKHR(\n      m_device, static_cast<VkExternalMemoryHandleTypeFlagBits>( handleType ), fd, reinterpret_cast<VkMemoryFdPropertiesKHR *>( &memoryFdProperties ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getMemoryFdPropertiesKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( memoryFdProperties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_external_semaphore_capabilities ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    PhysicalDevice::getExternalSemaphorePropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo * pExternalSemaphoreInfo,\n                                                       VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties *               pExternalSemaphoreProperties,\n                                                       Dispatch const &                                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceExternalSemaphorePropertiesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                         reinterpret_cast<const VkPhysicalDeviceExternalSemaphoreInfo *>( pExternalSemaphoreInfo ),\n                                                         reinterpret_cast<VkExternalSemaphoreProperties *>( pExternalSemaphoreProperties ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties\n    PhysicalDevice::getExternalSemaphorePropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo & externalSemaphoreInfo,\n                                                       Dispatch const &                                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceExternalSemaphorePropertiesKHR &&\n                       \"Function <vkGetPhysicalDeviceExternalSemaphorePropertiesKHR> requires <VK_KHR_external_semaphore_capabilities> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties externalSemaphoreProperties;\n    d.vkGetPhysicalDeviceExternalSemaphorePropertiesKHR( m_physicalDevice,\n                                                         reinterpret_cast<const VkPhysicalDeviceExternalSemaphoreInfo *>( &externalSemaphoreInfo ),\n                                                         reinterpret_cast<VkExternalSemaphoreProperties *>( &externalSemaphoreProperties ) );\n\n    return externalSemaphoreProperties;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_KHR_external_semaphore_win32 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::importSemaphoreWin32HandleKHR(\n    const VULKAN_HPP_NAMESPACE::ImportSemaphoreWin32HandleInfoKHR * pImportSemaphoreWin32HandleInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkImportSemaphoreWin32HandleKHR(\n      static_cast<VkDevice>( m_device ), reinterpret_cast<const VkImportSemaphoreWin32HandleInfoKHR *>( pImportSemaphoreWin32HandleInfo ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::importSemaphoreWin32HandleKHR( const VULKAN_HPP_NAMESPACE::ImportSemaphoreWin32HandleInfoKHR & importSemaphoreWin32HandleInfo,\n                                           Dispatch const &                                                d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkImportSemaphoreWin32HandleKHR && \"Function <vkImportSemaphoreWin32HandleKHR> requires <VK_KHR_external_semaphore_win32>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkImportSemaphoreWin32HandleKHR( m_device, reinterpret_cast<const VkImportSemaphoreWin32HandleInfoKHR *>( &importSemaphoreWin32HandleInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::importSemaphoreWin32HandleKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getSemaphoreWin32HandleKHR(\n    const VULKAN_HPP_NAMESPACE::SemaphoreGetWin32HandleInfoKHR * pGetWin32HandleInfo, HANDLE * pHandle, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetSemaphoreWin32HandleKHR(\n      static_cast<VkDevice>( m_device ), reinterpret_cast<const VkSemaphoreGetWin32HandleInfoKHR *>( pGetWin32HandleInfo ), pHandle ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<HANDLE>::type\n    Device::getSemaphoreWin32HandleKHR( const VULKAN_HPP_NAMESPACE::SemaphoreGetWin32HandleInfoKHR & getWin32HandleInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetSemaphoreWin32HandleKHR && \"Function <vkGetSemaphoreWin32HandleKHR> requires <VK_KHR_external_semaphore_win32>\" );\n#    endif\n\n    HANDLE                       handle;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetSemaphoreWin32HandleKHR( m_device, reinterpret_cast<const VkSemaphoreGetWin32HandleInfoKHR *>( &getWin32HandleInfo ), &handle ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getSemaphoreWin32HandleKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( handle ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_KHR_external_semaphore_fd ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::importSemaphoreFdKHR( const VULKAN_HPP_NAMESPACE::ImportSemaphoreFdInfoKHR * pImportSemaphoreFdInfo,\n                                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkImportSemaphoreFdKHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkImportSemaphoreFdInfoKHR *>( pImportSemaphoreFdInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::importSemaphoreFdKHR( const VULKAN_HPP_NAMESPACE::ImportSemaphoreFdInfoKHR & importSemaphoreFdInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkImportSemaphoreFdKHR && \"Function <vkImportSemaphoreFdKHR> requires <VK_KHR_external_semaphore_fd>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkImportSemaphoreFdKHR( m_device, reinterpret_cast<const VkImportSemaphoreFdInfoKHR *>( &importSemaphoreFdInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::importSemaphoreFdKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getSemaphoreFdKHR( const VULKAN_HPP_NAMESPACE::SemaphoreGetFdInfoKHR * pGetFdInfo,\n                                                                           int *                                               pFd,\n                                                                           Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkGetSemaphoreFdKHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkSemaphoreGetFdInfoKHR *>( pGetFdInfo ), pFd ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<int>::type\n                       Device::getSemaphoreFdKHR( const VULKAN_HPP_NAMESPACE::SemaphoreGetFdInfoKHR & getFdInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetSemaphoreFdKHR && \"Function <vkGetSemaphoreFdKHR> requires <VK_KHR_external_semaphore_fd>\" );\n#  endif\n\n    int                          fd;\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetSemaphoreFdKHR( m_device, reinterpret_cast<const VkSemaphoreGetFdInfoKHR *>( &getFdInfo ), &fd ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getSemaphoreFdKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( fd ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_push_descriptor ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::pushDescriptorSetKHR( VULKAN_HPP_NAMESPACE::PipelineBindPoint          pipelineBindPoint,\n                                                              VULKAN_HPP_NAMESPACE::PipelineLayout             layout,\n                                                              uint32_t                                         set,\n                                                              uint32_t                                         descriptorWriteCount,\n                                                              const VULKAN_HPP_NAMESPACE::WriteDescriptorSet * pDescriptorWrites,\n                                                              Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdPushDescriptorSetKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                 static_cast<VkPipelineBindPoint>( pipelineBindPoint ),\n                                 static_cast<VkPipelineLayout>( layout ),\n                                 set,\n                                 descriptorWriteCount,\n                                 reinterpret_cast<const VkWriteDescriptorSet *>( pDescriptorWrites ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::pushDescriptorSetKHR( VULKAN_HPP_NAMESPACE::PipelineBindPoint                                                  pipelineBindPoint,\n                                         VULKAN_HPP_NAMESPACE::PipelineLayout                                                     layout,\n                                         uint32_t                                                                                 set,\n                                         VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteDescriptorSet> const & descriptorWrites,\n                                         Dispatch const &                                                                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdPushDescriptorSetKHR && \"Function <vkCmdPushDescriptorSetKHR> requires <VK_KHR_push_descriptor> or <VK_VERSION_1_4>\" );\n#  endif\n\n    d.vkCmdPushDescriptorSetKHR( m_commandBuffer,\n                                 static_cast<VkPipelineBindPoint>( pipelineBindPoint ),\n                                 static_cast<VkPipelineLayout>( layout ),\n                                 set,\n                                 descriptorWrites.size(),\n                                 reinterpret_cast<const VkWriteDescriptorSet *>( descriptorWrites.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::pushDescriptorSetWithTemplateKHR( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,\n                                                                          VULKAN_HPP_NAMESPACE::PipelineLayout           layout,\n                                                                          uint32_t                                       set,\n                                                                          const void *                                   pData,\n                                                                          Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdPushDescriptorSetWithTemplateKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                             static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),\n                                             static_cast<VkPipelineLayout>( layout ),\n                                             set,\n                                             pData );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename DataType, typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::pushDescriptorSetWithTemplateKHR( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,\n                                                                          VULKAN_HPP_NAMESPACE::PipelineLayout           layout,\n                                                                          uint32_t                                       set,\n                                                                          DataType const &                               data,\n                                                                          Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT(\n      d.vkCmdPushDescriptorSetWithTemplateKHR &&\n      \"Function <vkCmdPushDescriptorSetWithTemplateKHR> requires <VK_KHR_descriptor_update_template> or <VK_KHR_push_descriptor> or <VK_VERSION_1_4>\" );\n#  endif\n\n    d.vkCmdPushDescriptorSetWithTemplateKHR( m_commandBuffer,\n                                             static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),\n                                             static_cast<VkPipelineLayout>( layout ),\n                                             set,\n                                             reinterpret_cast<const void *>( &data ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_conditional_rendering ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::beginConditionalRenderingEXT( const VULKAN_HPP_NAMESPACE::ConditionalRenderingBeginInfoEXT * pConditionalRenderingBegin,\n                                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBeginConditionalRenderingEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                         reinterpret_cast<const VkConditionalRenderingBeginInfoEXT *>( pConditionalRenderingBegin ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::beginConditionalRenderingEXT( const VULKAN_HPP_NAMESPACE::ConditionalRenderingBeginInfoEXT & conditionalRenderingBegin,\n                                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBeginConditionalRenderingEXT && \"Function <vkCmdBeginConditionalRenderingEXT> requires <VK_EXT_conditional_rendering>\" );\n#  endif\n\n    d.vkCmdBeginConditionalRenderingEXT( m_commandBuffer, reinterpret_cast<const VkConditionalRenderingBeginInfoEXT *>( &conditionalRenderingBegin ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::endConditionalRenderingEXT( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdEndConditionalRenderingEXT( static_cast<VkCommandBuffer>( m_commandBuffer ) );\n  }\n\n  //=== VK_KHR_descriptor_update_template ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::createDescriptorUpdateTemplateKHR( const VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo * pCreateInfo,\n                                               const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                pAllocator,\n                                               VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate *                 pDescriptorUpdateTemplate,\n                                               Dispatch const &                                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateDescriptorUpdateTemplateKHR( static_cast<VkDevice>( m_device ),\n                                                                       reinterpret_cast<const VkDescriptorUpdateTemplateCreateInfo *>( pCreateInfo ),\n                                                                       reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                                       reinterpret_cast<VkDescriptorUpdateTemplate *>( pDescriptorUpdateTemplate ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate>::type\n                       Device::createDescriptorUpdateTemplateKHR( const VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo & createInfo,\n                                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>        allocator,\n                                               Dispatch const &                                                 d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateDescriptorUpdateTemplateKHR &&\n                       \"Function <vkCreateDescriptorUpdateTemplateKHR> requires <VK_KHR_descriptor_update_template> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate;\n    VULKAN_HPP_NAMESPACE::Result                   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateDescriptorUpdateTemplateKHR(\n      m_device,\n      reinterpret_cast<const VkDescriptorUpdateTemplateCreateInfo *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkDescriptorUpdateTemplate *>( &descriptorUpdateTemplate ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createDescriptorUpdateTemplateKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( descriptorUpdateTemplate ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate, Dispatch>>::type\n                       Device::createDescriptorUpdateTemplateKHRUnique( const VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo & createInfo,\n                                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>        allocator,\n                                                     Dispatch const &                                                 d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateDescriptorUpdateTemplateKHR &&\n                       \"Function <vkCreateDescriptorUpdateTemplateKHR> requires <VK_KHR_descriptor_update_template> or <VK_VERSION_1_1>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate;\n    VULKAN_HPP_NAMESPACE::Result                   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateDescriptorUpdateTemplateKHR(\n      m_device,\n      reinterpret_cast<const VkDescriptorUpdateTemplateCreateInfo *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkDescriptorUpdateTemplate *>( &descriptorUpdateTemplate ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createDescriptorUpdateTemplateKHRUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result,\n                                                                UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate, Dispatch>(\n                                                                  descriptorUpdateTemplate, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyDescriptorUpdateTemplateKHR( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate    descriptorUpdateTemplate,\n                                                                     const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                     Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyDescriptorUpdateTemplateKHR( static_cast<VkDevice>( m_device ),\n                                            static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),\n                                            reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyDescriptorUpdateTemplateKHR( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate            descriptorUpdateTemplate,\n                                                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                                     Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyDescriptorUpdateTemplateKHR &&\n                       \"Function <vkDestroyDescriptorUpdateTemplateKHR> requires <VK_KHR_descriptor_update_template> or <VK_VERSION_1_1>\" );\n#  endif\n\n    d.vkDestroyDescriptorUpdateTemplateKHR(\n      m_device,\n      static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::updateDescriptorSetWithTemplateKHR( VULKAN_HPP_NAMESPACE::DescriptorSet            descriptorSet,\n                                                                     VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,\n                                                                     const void *                                   pData,\n                                                                     Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkUpdateDescriptorSetWithTemplateKHR( static_cast<VkDevice>( m_device ),\n                                            static_cast<VkDescriptorSet>( descriptorSet ),\n                                            static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),\n                                            pData );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename DataType, typename Dispatch>\n  VULKAN_HPP_INLINE void Device::updateDescriptorSetWithTemplateKHR( VULKAN_HPP_NAMESPACE::DescriptorSet            descriptorSet,\n                                                                     VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,\n                                                                     DataType const &                               data,\n                                                                     Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkUpdateDescriptorSetWithTemplateKHR &&\n                       \"Function <vkUpdateDescriptorSetWithTemplateKHR> requires <VK_KHR_descriptor_update_template> or <VK_VERSION_1_1>\" );\n#  endif\n\n    d.vkUpdateDescriptorSetWithTemplateKHR( m_device,\n                                            static_cast<VkDescriptorSet>( descriptorSet ),\n                                            static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),\n                                            reinterpret_cast<const void *>( &data ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_NV_clip_space_w_scaling ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setViewportWScalingNV( uint32_t                                         firstViewport,\n                                                               uint32_t                                         viewportCount,\n                                                               const VULKAN_HPP_NAMESPACE::ViewportWScalingNV * pViewportWScalings,\n                                                               Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetViewportWScalingNV(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), firstViewport, viewportCount, reinterpret_cast<const VkViewportWScalingNV *>( pViewportWScalings ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::setViewportWScalingNV( uint32_t                                                                                 firstViewport,\n                                          VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ViewportWScalingNV> const & viewportWScalings,\n                                          Dispatch const &                                                                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetViewportWScalingNV && \"Function <vkCmdSetViewportWScalingNV> requires <VK_NV_clip_space_w_scaling>\" );\n#  endif\n\n    d.vkCmdSetViewportWScalingNV(\n      m_commandBuffer, firstViewport, viewportWScalings.size(), reinterpret_cast<const VkViewportWScalingNV *>( viewportWScalings.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_direct_mode_display ===\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE Result PhysicalDevice::releaseDisplayEXT( VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkReleaseDisplayEXT( static_cast<VkPhysicalDevice>( m_physicalDevice ), static_cast<VkDisplayKHR>( display ) ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::releaseDisplayEXT( VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkReleaseDisplayEXT && \"Function <vkReleaseDisplayEXT> requires <VK_EXT_direct_mode_display>\" );\n#  endif\n\n    d.vkReleaseDisplayEXT( m_physicalDevice, static_cast<VkDisplayKHR>( display ) );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n#if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )\n  //=== VK_EXT_acquire_xlib_display ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::acquireXlibDisplayEXT( Display *                        dpy,\n                                                                                       VULKAN_HPP_NAMESPACE::DisplayKHR display,\n                                                                                       Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkAcquireXlibDisplayEXT( static_cast<VkPhysicalDevice>( m_physicalDevice ), dpy, static_cast<VkDisplayKHR>( display ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    PhysicalDevice::acquireXlibDisplayEXT( Display & dpy, VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkAcquireXlibDisplayEXT && \"Function <vkAcquireXlibDisplayEXT> requires <VK_EXT_acquire_xlib_display>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkAcquireXlibDisplayEXT( m_physicalDevice, &dpy, static_cast<VkDisplayKHR>( display ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::acquireXlibDisplayEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getRandROutputDisplayEXT( Display *                          dpy,\n                                                                                          RROutput                           rrOutput,\n                                                                                          VULKAN_HPP_NAMESPACE::DisplayKHR * pDisplay,\n                                                                                          Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkGetRandROutputDisplayEXT( static_cast<VkPhysicalDevice>( m_physicalDevice ), dpy, rrOutput, reinterpret_cast<VkDisplayKHR *>( pDisplay ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::DisplayKHR>::type\n                       PhysicalDevice::getRandROutputDisplayEXT( Display & dpy, RROutput rrOutput, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetRandROutputDisplayEXT && \"Function <vkGetRandROutputDisplayEXT> requires <VK_EXT_acquire_xlib_display>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::DisplayKHR display;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetRandROutputDisplayEXT( m_physicalDevice, &dpy, rrOutput, reinterpret_cast<VkDisplayKHR *>( &display ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getRandROutputDisplayEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( display ) );\n  }\n\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DisplayKHR, Dispatch>>::type\n                       PhysicalDevice::getRandROutputDisplayEXTUnique( Display & dpy, RROutput rrOutput, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#      if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetRandROutputDisplayEXT && \"Function <vkGetRandROutputDisplayEXT> requires <VK_EXT_acquire_xlib_display>\" );\n#      endif\n\n    VULKAN_HPP_NAMESPACE::DisplayKHR display;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetRandROutputDisplayEXT( m_physicalDevice, &dpy, rrOutput, reinterpret_cast<VkDisplayKHR *>( &display ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getRandROutputDisplayEXTUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::DisplayKHR, Dispatch>( display, detail::ObjectRelease<PhysicalDevice, Dispatch>( *this, d ) ) );\n  }\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/\n\n  //=== VK_EXT_display_surface_counter ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    PhysicalDevice::getSurfaceCapabilities2EXT( VULKAN_HPP_NAMESPACE::SurfaceKHR                surface,\n                                                VULKAN_HPP_NAMESPACE::SurfaceCapabilities2EXT * pSurfaceCapabilities,\n                                                Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceSurfaceCapabilities2EXT( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                              static_cast<VkSurfaceKHR>( surface ),\n                                                                              reinterpret_cast<VkSurfaceCapabilities2EXT *>( pSurfaceCapabilities ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceCapabilities2EXT>::type\n                       PhysicalDevice::getSurfaceCapabilities2EXT( VULKAN_HPP_NAMESPACE::SurfaceKHR surface, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceSurfaceCapabilities2EXT &&\n                       \"Function <vkGetPhysicalDeviceSurfaceCapabilities2EXT> requires <VK_EXT_display_surface_counter>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceCapabilities2EXT surfaceCapabilities;\n    VULKAN_HPP_NAMESPACE::Result                  result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceSurfaceCapabilities2EXT(\n      m_physicalDevice, static_cast<VkSurfaceKHR>( surface ), reinterpret_cast<VkSurfaceCapabilities2EXT *>( &surfaceCapabilities ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfaceCapabilities2EXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( surfaceCapabilities ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_display_control ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::displayPowerControlEXT( VULKAN_HPP_NAMESPACE::DisplayKHR                  display,\n                                                                                const VULKAN_HPP_NAMESPACE::DisplayPowerInfoEXT * pDisplayPowerInfo,\n                                                                                Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkDisplayPowerControlEXT(\n      static_cast<VkDevice>( m_device ), static_cast<VkDisplayKHR>( display ), reinterpret_cast<const VkDisplayPowerInfoEXT *>( pDisplayPowerInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE typename ResultValueType<void>::type Device::displayPowerControlEXT( VULKAN_HPP_NAMESPACE::DisplayKHR                  display,\n                                                                                         const VULKAN_HPP_NAMESPACE::DisplayPowerInfoEXT & displayPowerInfo,\n                                                                                         Dispatch const &                                  d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDisplayPowerControlEXT && \"Function <vkDisplayPowerControlEXT> requires <VK_EXT_display_control>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkDisplayPowerControlEXT( m_device, static_cast<VkDisplayKHR>( display ), reinterpret_cast<const VkDisplayPowerInfoEXT *>( &displayPowerInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::displayPowerControlEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::registerEventEXT( const VULKAN_HPP_NAMESPACE::DeviceEventInfoEXT *  pDeviceEventInfo,\n                                                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                          VULKAN_HPP_NAMESPACE::Fence *                     pFence,\n                                                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkRegisterDeviceEventEXT( static_cast<VkDevice>( m_device ),\n                                                            reinterpret_cast<const VkDeviceEventInfoEXT *>( pDeviceEventInfo ),\n                                                            reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                            reinterpret_cast<VkFence *>( pFence ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::Fence>::type\n                       Device::registerEventEXT( const VULKAN_HPP_NAMESPACE::DeviceEventInfoEXT &          deviceEventInfo,\n                              Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                              Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkRegisterDeviceEventEXT && \"Function <vkRegisterDeviceEventEXT> requires <VK_EXT_display_control>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Fence  fence;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkRegisterDeviceEventEXT(\n      m_device,\n      reinterpret_cast<const VkDeviceEventInfoEXT *>( &deviceEventInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkFence *>( &fence ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::registerEventEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( fence ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::Fence, Dispatch>>::type\n                       Device::registerEventEXTUnique( const VULKAN_HPP_NAMESPACE::DeviceEventInfoEXT &          deviceEventInfo,\n                                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                    Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkRegisterDeviceEventEXT && \"Function <vkRegisterDeviceEventEXT> requires <VK_EXT_display_control>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Fence  fence;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkRegisterDeviceEventEXT(\n      m_device,\n      reinterpret_cast<const VkDeviceEventInfoEXT *>( &deviceEventInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkFence *>( &fence ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::registerEventEXTUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::Fence, Dispatch>( fence, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::registerDisplayEventEXT( VULKAN_HPP_NAMESPACE::DisplayKHR                  display,\n                                                                                 const VULKAN_HPP_NAMESPACE::DisplayEventInfoEXT * pDisplayEventInfo,\n                                                                                 const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                                 VULKAN_HPP_NAMESPACE::Fence *                     pFence,\n                                                                                 Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkRegisterDisplayEventEXT( static_cast<VkDevice>( m_device ),\n                                                             static_cast<VkDisplayKHR>( display ),\n                                                             reinterpret_cast<const VkDisplayEventInfoEXT *>( pDisplayEventInfo ),\n                                                             reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                             reinterpret_cast<VkFence *>( pFence ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::Fence>::type\n                       Device::registerDisplayEventEXT( VULKAN_HPP_NAMESPACE::DisplayKHR                          display,\n                                     const VULKAN_HPP_NAMESPACE::DisplayEventInfoEXT &         displayEventInfo,\n                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                     Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkRegisterDisplayEventEXT && \"Function <vkRegisterDisplayEventEXT> requires <VK_EXT_display_control>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Fence  fence;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkRegisterDisplayEventEXT(\n      m_device,\n      static_cast<VkDisplayKHR>( display ),\n      reinterpret_cast<const VkDisplayEventInfoEXT *>( &displayEventInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkFence *>( &fence ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::registerDisplayEventEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( fence ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::Fence, Dispatch>>::type\n                       Device::registerDisplayEventEXTUnique( VULKAN_HPP_NAMESPACE::DisplayKHR                          display,\n                                           const VULKAN_HPP_NAMESPACE::DisplayEventInfoEXT &         displayEventInfo,\n                                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                           Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkRegisterDisplayEventEXT && \"Function <vkRegisterDisplayEventEXT> requires <VK_EXT_display_control>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Fence  fence;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkRegisterDisplayEventEXT(\n      m_device,\n      static_cast<VkDisplayKHR>( display ),\n      reinterpret_cast<const VkDisplayEventInfoEXT *>( &displayEventInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkFence *>( &fence ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::registerDisplayEventEXTUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::Fence, Dispatch>( fence, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getSwapchainCounterEXT( VULKAN_HPP_NAMESPACE::SwapchainKHR              swapchain,\n                                                                                VULKAN_HPP_NAMESPACE::SurfaceCounterFlagBitsEXT counter,\n                                                                                uint64_t *                                      pCounterValue,\n                                                                                Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetSwapchainCounterEXT(\n      static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( swapchain ), static_cast<VkSurfaceCounterFlagBitsEXT>( counter ), pCounterValue ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<uint64_t>::type Device::getSwapchainCounterEXT(\n    VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, VULKAN_HPP_NAMESPACE::SurfaceCounterFlagBitsEXT counter, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetSwapchainCounterEXT && \"Function <vkGetSwapchainCounterEXT> requires <VK_EXT_display_control>\" );\n#  endif\n\n    uint64_t                     counterValue;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetSwapchainCounterEXT( m_device, static_cast<VkSwapchainKHR>( swapchain ), static_cast<VkSurfaceCounterFlagBitsEXT>( counter ), &counterValue ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getSwapchainCounterEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( counterValue ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_GOOGLE_display_timing ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::getRefreshCycleDurationGOOGLE( VULKAN_HPP_NAMESPACE::SwapchainKHR                 swapchain,\n                                           VULKAN_HPP_NAMESPACE::RefreshCycleDurationGOOGLE * pDisplayTimingProperties,\n                                           Dispatch const &                                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetRefreshCycleDurationGOOGLE( static_cast<VkDevice>( m_device ),\n                                                                   static_cast<VkSwapchainKHR>( swapchain ),\n                                                                   reinterpret_cast<VkRefreshCycleDurationGOOGLE *>( pDisplayTimingProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::RefreshCycleDurationGOOGLE>::type\n                       Device::getRefreshCycleDurationGOOGLE( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetRefreshCycleDurationGOOGLE && \"Function <vkGetRefreshCycleDurationGOOGLE> requires <VK_GOOGLE_display_timing>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::RefreshCycleDurationGOOGLE displayTimingProperties;\n    VULKAN_HPP_NAMESPACE::Result                     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetRefreshCycleDurationGOOGLE(\n      m_device, static_cast<VkSwapchainKHR>( swapchain ), reinterpret_cast<VkRefreshCycleDurationGOOGLE *>( &displayTimingProperties ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getRefreshCycleDurationGOOGLE\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( displayTimingProperties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::getPastPresentationTimingGOOGLE( VULKAN_HPP_NAMESPACE::SwapchainKHR                   swapchain,\n                                             uint32_t *                                           pPresentationTimingCount,\n                                             VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE * pPresentationTimings,\n                                             Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPastPresentationTimingGOOGLE( static_cast<VkDevice>( m_device ),\n                                                                     static_cast<VkSwapchainKHR>( swapchain ),\n                                                                     pPresentationTimingCount,\n                                                                     reinterpret_cast<VkPastPresentationTimingGOOGLE *>( pPresentationTimings ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <\n    typename PastPresentationTimingGOOGLEAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename PastPresentationTimingGOOGLEAllocator::value_type, VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE, PastPresentationTimingGOOGLEAllocator>>::type\n    Device::getPastPresentationTimingGOOGLE( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPastPresentationTimingGOOGLE && \"Function <vkGetPastPresentationTimingGOOGLE> requires <VK_GOOGLE_display_timing>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE, PastPresentationTimingGOOGLEAllocator> presentationTimings;\n    uint32_t                                                                                               presentationTimingCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                           result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetPastPresentationTimingGOOGLE( m_device, static_cast<VkSwapchainKHR>( swapchain ), &presentationTimingCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && presentationTimingCount )\n      {\n        presentationTimings.resize( presentationTimingCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPastPresentationTimingGOOGLE( m_device,\n                                               static_cast<VkSwapchainKHR>( swapchain ),\n                                               &presentationTimingCount,\n                                               reinterpret_cast<VkPastPresentationTimingGOOGLE *>( presentationTimings.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getPastPresentationTimingGOOGLE\" );\n    VULKAN_HPP_ASSERT( presentationTimingCount <= presentationTimings.size() );\n    if ( presentationTimingCount < presentationTimings.size() )\n    {\n      presentationTimings.resize( presentationTimingCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( presentationTimings ) );\n  }\n\n  template <\n    typename PastPresentationTimingGOOGLEAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename PastPresentationTimingGOOGLEAllocator::value_type, VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE, PastPresentationTimingGOOGLEAllocator>>::type\n    Device::getPastPresentationTimingGOOGLE( VULKAN_HPP_NAMESPACE::SwapchainKHR      swapchain,\n                                             PastPresentationTimingGOOGLEAllocator & pastPresentationTimingGOOGLEAllocator,\n                                             Dispatch const &                        d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPastPresentationTimingGOOGLE && \"Function <vkGetPastPresentationTimingGOOGLE> requires <VK_GOOGLE_display_timing>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE, PastPresentationTimingGOOGLEAllocator> presentationTimings(\n      pastPresentationTimingGOOGLEAllocator );\n    uint32_t                     presentationTimingCount;\n    VULKAN_HPP_NAMESPACE::Result result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetPastPresentationTimingGOOGLE( m_device, static_cast<VkSwapchainKHR>( swapchain ), &presentationTimingCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && presentationTimingCount )\n      {\n        presentationTimings.resize( presentationTimingCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPastPresentationTimingGOOGLE( m_device,\n                                               static_cast<VkSwapchainKHR>( swapchain ),\n                                               &presentationTimingCount,\n                                               reinterpret_cast<VkPastPresentationTimingGOOGLE *>( presentationTimings.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getPastPresentationTimingGOOGLE\" );\n    VULKAN_HPP_ASSERT( presentationTimingCount <= presentationTimings.size() );\n    if ( presentationTimingCount < presentationTimings.size() )\n    {\n      presentationTimings.resize( presentationTimingCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( presentationTimings ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_discard_rectangles ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDiscardRectangleEXT( uint32_t                             firstDiscardRectangle,\n                                                                uint32_t                             discardRectangleCount,\n                                                                const VULKAN_HPP_NAMESPACE::Rect2D * pDiscardRectangles,\n                                                                Dispatch const &                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDiscardRectangleEXT(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), firstDiscardRectangle, discardRectangleCount, reinterpret_cast<const VkRect2D *>( pDiscardRectangles ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDiscardRectangleEXT( uint32_t firstDiscardRectangle,\n                                                                VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & discardRectangles,\n                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetDiscardRectangleEXT && \"Function <vkCmdSetDiscardRectangleEXT> requires <VK_EXT_discard_rectangles>\" );\n#  endif\n\n    d.vkCmdSetDiscardRectangleEXT(\n      m_commandBuffer, firstDiscardRectangle, discardRectangles.size(), reinterpret_cast<const VkRect2D *>( discardRectangles.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDiscardRectangleEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 discardRectangleEnable,\n                                                                      Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDiscardRectangleEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( discardRectangleEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDiscardRectangleModeEXT( VULKAN_HPP_NAMESPACE::DiscardRectangleModeEXT discardRectangleMode,\n                                                                    Dispatch const &                              d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDiscardRectangleModeEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkDiscardRectangleModeEXT>( discardRectangleMode ) );\n  }\n\n  //=== VK_EXT_hdr_metadata ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::setHdrMetadataEXT( uint32_t                                     swapchainCount,\n                                                    const VULKAN_HPP_NAMESPACE::SwapchainKHR *   pSwapchains,\n                                                    const VULKAN_HPP_NAMESPACE::HdrMetadataEXT * pMetadata,\n                                                    Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkSetHdrMetadataEXT( static_cast<VkDevice>( m_device ),\n                           swapchainCount,\n                           reinterpret_cast<const VkSwapchainKHR *>( pSwapchains ),\n                           reinterpret_cast<const VkHdrMetadataEXT *>( pMetadata ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::setHdrMetadataEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SwapchainKHR> const &   swapchains,\n                                                    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::HdrMetadataEXT> const & metadata,\n                                                    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkSetHdrMetadataEXT && \"Function <vkSetHdrMetadataEXT> requires <VK_EXT_hdr_metadata>\" );\n#  endif\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n    VULKAN_HPP_ASSERT( swapchains.size() == metadata.size() );\n#  else\n    if ( swapchains.size() != metadata.size() )\n    {\n      throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::Device::setHdrMetadataEXT: swapchains.size() != metadata.size()\" );\n    }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n    d.vkSetHdrMetadataEXT( m_device,\n                           swapchains.size(),\n                           reinterpret_cast<const VkSwapchainKHR *>( swapchains.data() ),\n                           reinterpret_cast<const VkHdrMetadataEXT *>( metadata.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_create_renderpass2 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createRenderPass2KHR( const VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 * pCreateInfo,\n                                                                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks *   pAllocator,\n                                                                              VULKAN_HPP_NAMESPACE::RenderPass *                  pRenderPass,\n                                                                              Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateRenderPass2KHR( static_cast<VkDevice>( m_device ),\n                                                          reinterpret_cast<const VkRenderPassCreateInfo2 *>( pCreateInfo ),\n                                                          reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                          reinterpret_cast<VkRenderPass *>( pRenderPass ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::RenderPass>::type\n                       Device::createRenderPass2KHR( const VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 &       createInfo,\n                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                  Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateRenderPass2KHR && \"Function <vkCreateRenderPass2KHR> requires <VK_KHR_create_renderpass2> or <VK_VERSION_1_2>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::RenderPass renderPass;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateRenderPass2KHR( m_device,\n                                reinterpret_cast<const VkRenderPassCreateInfo2 *>( &createInfo ),\n                                reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                                reinterpret_cast<VkRenderPass *>( &renderPass ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createRenderPass2KHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( renderPass ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::RenderPass, Dispatch>>::type\n                       Device::createRenderPass2KHRUnique( const VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 &       createInfo,\n                                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                        Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateRenderPass2KHR && \"Function <vkCreateRenderPass2KHR> requires <VK_KHR_create_renderpass2> or <VK_VERSION_1_2>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::RenderPass renderPass;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateRenderPass2KHR( m_device,\n                                reinterpret_cast<const VkRenderPassCreateInfo2 *>( &createInfo ),\n                                reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                                reinterpret_cast<VkRenderPass *>( &renderPass ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createRenderPass2KHRUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::RenderPass, Dispatch>( renderPass, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::beginRenderPass2KHR( const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo * pRenderPassBegin,\n                                                             const VULKAN_HPP_NAMESPACE::SubpassBeginInfo *    pSubpassBeginInfo,\n                                                             Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBeginRenderPass2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                reinterpret_cast<const VkRenderPassBeginInfo *>( pRenderPassBegin ),\n                                reinterpret_cast<const VkSubpassBeginInfo *>( pSubpassBeginInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::beginRenderPass2KHR( const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo & renderPassBegin,\n                                                             const VULKAN_HPP_NAMESPACE::SubpassBeginInfo &    subpassBeginInfo,\n                                                             Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBeginRenderPass2KHR && \"Function <vkCmdBeginRenderPass2KHR> requires <VK_KHR_create_renderpass2> or <VK_VERSION_1_2>\" );\n#  endif\n\n    d.vkCmdBeginRenderPass2KHR(\n      m_commandBuffer, reinterpret_cast<const VkRenderPassBeginInfo *>( &renderPassBegin ), reinterpret_cast<const VkSubpassBeginInfo *>( &subpassBeginInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::nextSubpass2KHR( const VULKAN_HPP_NAMESPACE::SubpassBeginInfo * pSubpassBeginInfo,\n                                                         const VULKAN_HPP_NAMESPACE::SubpassEndInfo *   pSubpassEndInfo,\n                                                         Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdNextSubpass2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                            reinterpret_cast<const VkSubpassBeginInfo *>( pSubpassBeginInfo ),\n                            reinterpret_cast<const VkSubpassEndInfo *>( pSubpassEndInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::nextSubpass2KHR( const VULKAN_HPP_NAMESPACE::SubpassBeginInfo & subpassBeginInfo,\n                                                         const VULKAN_HPP_NAMESPACE::SubpassEndInfo &   subpassEndInfo,\n                                                         Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdNextSubpass2KHR && \"Function <vkCmdNextSubpass2KHR> requires <VK_KHR_create_renderpass2> or <VK_VERSION_1_2>\" );\n#  endif\n\n    d.vkCmdNextSubpass2KHR(\n      m_commandBuffer, reinterpret_cast<const VkSubpassBeginInfo *>( &subpassBeginInfo ), reinterpret_cast<const VkSubpassEndInfo *>( &subpassEndInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::endRenderPass2KHR( const VULKAN_HPP_NAMESPACE::SubpassEndInfo * pSubpassEndInfo,\n                                                           Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdEndRenderPass2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkSubpassEndInfo *>( pSubpassEndInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::endRenderPass2KHR( const VULKAN_HPP_NAMESPACE::SubpassEndInfo & subpassEndInfo,\n                                                           Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdEndRenderPass2KHR && \"Function <vkCmdEndRenderPass2KHR> requires <VK_KHR_create_renderpass2> or <VK_VERSION_1_2>\" );\n#  endif\n\n    d.vkCmdEndRenderPass2KHR( m_commandBuffer, reinterpret_cast<const VkSubpassEndInfo *>( &subpassEndInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_shared_presentable_image ===\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getSwapchainStatusKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain,\n                                                                               Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetSwapchainStatusKHR( static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( swapchain ) ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result Device::getSwapchainStatusKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain,\n                                                                                                     Dispatch const &                   d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetSwapchainStatusKHR && \"Function <vkGetSwapchainStatusKHR> requires <VK_KHR_shared_presentable_image>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetSwapchainStatusKHR( m_device, static_cast<VkSwapchainKHR>( swapchain ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::getSwapchainStatusKHR\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eSuboptimalKHR } );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n  //=== VK_KHR_external_fence_capabilities ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::getExternalFencePropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo * pExternalFenceInfo,\n                                                                        VULKAN_HPP_NAMESPACE::ExternalFenceProperties *               pExternalFenceProperties,\n                                                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceExternalFencePropertiesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                     reinterpret_cast<const VkPhysicalDeviceExternalFenceInfo *>( pExternalFenceInfo ),\n                                                     reinterpret_cast<VkExternalFenceProperties *>( pExternalFenceProperties ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ExternalFenceProperties\n    PhysicalDevice::getExternalFencePropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo & externalFenceInfo,\n                                                   Dispatch const &                                              d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceExternalFencePropertiesKHR &&\n                       \"Function <vkGetPhysicalDeviceExternalFencePropertiesKHR> requires <VK_KHR_external_fence_capabilities> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::ExternalFenceProperties externalFenceProperties;\n    d.vkGetPhysicalDeviceExternalFencePropertiesKHR( m_physicalDevice,\n                                                     reinterpret_cast<const VkPhysicalDeviceExternalFenceInfo *>( &externalFenceInfo ),\n                                                     reinterpret_cast<VkExternalFenceProperties *>( &externalFenceProperties ) );\n\n    return externalFenceProperties;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_KHR_external_fence_win32 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::importFenceWin32HandleKHR(\n    const VULKAN_HPP_NAMESPACE::ImportFenceWin32HandleInfoKHR * pImportFenceWin32HandleInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkImportFenceWin32HandleKHR( static_cast<VkDevice>( m_device ),\n                                                               reinterpret_cast<const VkImportFenceWin32HandleInfoKHR *>( pImportFenceWin32HandleInfo ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::importFenceWin32HandleKHR( const VULKAN_HPP_NAMESPACE::ImportFenceWin32HandleInfoKHR & importFenceWin32HandleInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkImportFenceWin32HandleKHR && \"Function <vkImportFenceWin32HandleKHR> requires <VK_KHR_external_fence_win32>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkImportFenceWin32HandleKHR( m_device, reinterpret_cast<const VkImportFenceWin32HandleInfoKHR *>( &importFenceWin32HandleInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::importFenceWin32HandleKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getFenceWin32HandleKHR( const VULKAN_HPP_NAMESPACE::FenceGetWin32HandleInfoKHR * pGetWin32HandleInfo,\n                                                                                HANDLE *                                                 pHandle,\n                                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkGetFenceWin32HandleKHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkFenceGetWin32HandleInfoKHR *>( pGetWin32HandleInfo ), pHandle ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<HANDLE>::type\n                       Device::getFenceWin32HandleKHR( const VULKAN_HPP_NAMESPACE::FenceGetWin32HandleInfoKHR & getWin32HandleInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetFenceWin32HandleKHR && \"Function <vkGetFenceWin32HandleKHR> requires <VK_KHR_external_fence_win32>\" );\n#    endif\n\n    HANDLE                       handle;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetFenceWin32HandleKHR( m_device, reinterpret_cast<const VkFenceGetWin32HandleInfoKHR *>( &getWin32HandleInfo ), &handle ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getFenceWin32HandleKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( handle ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_KHR_external_fence_fd ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::importFenceFdKHR( const VULKAN_HPP_NAMESPACE::ImportFenceFdInfoKHR * pImportFenceFdInfo,\n                                                                          Dispatch const &                                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkImportFenceFdKHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkImportFenceFdInfoKHR *>( pImportFenceFdInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::importFenceFdKHR( const VULKAN_HPP_NAMESPACE::ImportFenceFdInfoKHR & importFenceFdInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkImportFenceFdKHR && \"Function <vkImportFenceFdKHR> requires <VK_KHR_external_fence_fd>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkImportFenceFdKHR( m_device, reinterpret_cast<const VkImportFenceFdInfoKHR *>( &importFenceFdInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::importFenceFdKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getFenceFdKHR( const VULKAN_HPP_NAMESPACE::FenceGetFdInfoKHR * pGetFdInfo,\n                                                                       int *                                           pFd,\n                                                                       Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetFenceFdKHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkFenceGetFdInfoKHR *>( pGetFdInfo ), pFd ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<int>::type Device::getFenceFdKHR( const VULKAN_HPP_NAMESPACE::FenceGetFdInfoKHR & getFdInfo,\n                                                                                                    Dispatch const &                                d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetFenceFdKHR && \"Function <vkGetFenceFdKHR> requires <VK_KHR_external_fence_fd>\" );\n#  endif\n\n    int                          fd;\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetFenceFdKHR( m_device, reinterpret_cast<const VkFenceGetFdInfoKHR *>( &getFdInfo ), &fd ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getFenceFdKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( fd ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_performance_query ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    PhysicalDevice::enumerateQueueFamilyPerformanceQueryCountersKHR( uint32_t                                                 queueFamilyIndex,\n                                                                     uint32_t *                                               pCounterCount,\n                                                                     VULKAN_HPP_NAMESPACE::PerformanceCounterKHR *            pCounters,\n                                                                     VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR * pCounterDescriptions,\n                                                                     Dispatch const &                                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                         queueFamilyIndex,\n                                                                         pCounterCount,\n                                                                         reinterpret_cast<VkPerformanceCounterKHR *>( pCounters ),\n                                                                         reinterpret_cast<VkPerformanceCounterDescriptionKHR *>( pCounterDescriptions ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename PerformanceCounterKHRAllocator,\n            typename PerformanceCounterDescriptionKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename PerformanceCounterKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PerformanceCounterKHR>::value &&\n                std::is_same<typename PerformanceCounterDescriptionKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::pair<std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterKHR, PerformanceCounterKHRAllocator>,\n                                       std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR, PerformanceCounterDescriptionKHRAllocator>>>::type\n    PhysicalDevice::enumerateQueueFamilyPerformanceQueryCountersKHR( uint32_t queueFamilyIndex, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR &&\n                       \"Function <vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR> requires <VK_KHR_performance_query>\" );\n#  endif\n\n    std::pair<std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterKHR, PerformanceCounterKHRAllocator>,\n              std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR, PerformanceCounterDescriptionKHRAllocator>>\n                                                                                                                     data_;\n    std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterKHR, PerformanceCounterKHRAllocator> &                       counters            = data_.first;\n    std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR, PerformanceCounterDescriptionKHRAllocator> & counterDescriptions = data_.second;\n    uint32_t                                                                                                         counterCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                                     result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR( m_physicalDevice, queueFamilyIndex, &counterCount, nullptr, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && counterCount )\n      {\n        counters.resize( counterCount );\n        counterDescriptions.resize( counterCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(\n          m_physicalDevice,\n          queueFamilyIndex,\n          &counterCount,\n          reinterpret_cast<VkPerformanceCounterKHR *>( counters.data() ),\n          reinterpret_cast<VkPerformanceCounterDescriptionKHR *>( counterDescriptions.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::enumerateQueueFamilyPerformanceQueryCountersKHR\" );\n    VULKAN_HPP_ASSERT( counterCount <= counters.size() );\n    if ( counterCount < counters.size() )\n    {\n      counters.resize( counterCount );\n      counterDescriptions.resize( counterCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data_ ) );\n  }\n\n  template <typename PerformanceCounterKHRAllocator,\n            typename PerformanceCounterDescriptionKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename PerformanceCounterKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PerformanceCounterKHR>::value &&\n                std::is_same<typename PerformanceCounterDescriptionKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::pair<std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterKHR, PerformanceCounterKHRAllocator>,\n                                       std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR, PerformanceCounterDescriptionKHRAllocator>>>::type\n    PhysicalDevice::enumerateQueueFamilyPerformanceQueryCountersKHR( uint32_t                                    queueFamilyIndex,\n                                                                     PerformanceCounterKHRAllocator &            performanceCounterKHRAllocator,\n                                                                     PerformanceCounterDescriptionKHRAllocator & performanceCounterDescriptionKHRAllocator,\n                                                                     Dispatch const &                            d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR &&\n                       \"Function <vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR> requires <VK_KHR_performance_query>\" );\n#  endif\n\n    std::pair<std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterKHR, PerformanceCounterKHRAllocator>,\n              std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR, PerformanceCounterDescriptionKHRAllocator>>\n      data_(\n        std::piecewise_construct, std::forward_as_tuple( performanceCounterKHRAllocator ), std::forward_as_tuple( performanceCounterDescriptionKHRAllocator ) );\n    std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterKHR, PerformanceCounterKHRAllocator> &                       counters            = data_.first;\n    std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR, PerformanceCounterDescriptionKHRAllocator> & counterDescriptions = data_.second;\n    uint32_t                                                                                                         counterCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                                     result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR( m_physicalDevice, queueFamilyIndex, &counterCount, nullptr, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && counterCount )\n      {\n        counters.resize( counterCount );\n        counterDescriptions.resize( counterCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(\n          m_physicalDevice,\n          queueFamilyIndex,\n          &counterCount,\n          reinterpret_cast<VkPerformanceCounterKHR *>( counters.data() ),\n          reinterpret_cast<VkPerformanceCounterDescriptionKHR *>( counterDescriptions.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::enumerateQueueFamilyPerformanceQueryCountersKHR\" );\n    VULKAN_HPP_ASSERT( counterCount <= counters.size() );\n    if ( counterCount < counters.size() )\n    {\n      counters.resize( counterCount );\n      counterDescriptions.resize( counterCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data_ ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    PhysicalDevice::getQueueFamilyPerformanceQueryPassesKHR( const VULKAN_HPP_NAMESPACE::QueryPoolPerformanceCreateInfoKHR * pPerformanceQueryCreateInfo,\n                                                             uint32_t *                                                      pNumPasses,\n                                                             Dispatch const &                                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                               reinterpret_cast<const VkQueryPoolPerformanceCreateInfoKHR *>( pPerformanceQueryCreateInfo ),\n                                                               pNumPasses );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint32_t PhysicalDevice::getQueueFamilyPerformanceQueryPassesKHR(\n    const VULKAN_HPP_NAMESPACE::QueryPoolPerformanceCreateInfoKHR & performanceQueryCreateInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR &&\n                       \"Function <vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR> requires <VK_KHR_performance_query>\" );\n#  endif\n\n    uint32_t numPasses;\n    d.vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(\n      m_physicalDevice, reinterpret_cast<const VkQueryPoolPerformanceCreateInfoKHR *>( &performanceQueryCreateInfo ), &numPasses );\n\n    return numPasses;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::acquireProfilingLockKHR( const VULKAN_HPP_NAMESPACE::AcquireProfilingLockInfoKHR * pInfo,\n                                                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkAcquireProfilingLockKHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkAcquireProfilingLockInfoKHR *>( pInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::acquireProfilingLockKHR( const VULKAN_HPP_NAMESPACE::AcquireProfilingLockInfoKHR & info, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkAcquireProfilingLockKHR && \"Function <vkAcquireProfilingLockKHR> requires <VK_KHR_performance_query>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkAcquireProfilingLockKHR( m_device, reinterpret_cast<const VkAcquireProfilingLockInfoKHR *>( &info ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::acquireProfilingLockKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::releaseProfilingLockKHR( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkReleaseProfilingLockKHR( static_cast<VkDevice>( m_device ) );\n  }\n\n  //=== VK_KHR_get_surface_capabilities2 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    PhysicalDevice::getSurfaceCapabilities2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR * pSurfaceInfo,\n                                                VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR *             pSurfaceCapabilities,\n                                                Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceSurfaceCapabilities2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                              reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( pSurfaceInfo ),\n                                                                              reinterpret_cast<VkSurfaceCapabilities2KHR *>( pSurfaceCapabilities ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR>::type\n    PhysicalDevice::getSurfaceCapabilities2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceSurfaceCapabilities2KHR &&\n                       \"Function <vkGetPhysicalDeviceSurfaceCapabilities2KHR> requires <VK_KHR_get_surface_capabilities2>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR surfaceCapabilities;\n    VULKAN_HPP_NAMESPACE::Result                  result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetPhysicalDeviceSurfaceCapabilities2KHR( m_physicalDevice,\n                                                    reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ),\n                                                    reinterpret_cast<VkSurfaceCapabilities2KHR *>( &surfaceCapabilities ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfaceCapabilities2KHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( surfaceCapabilities ) );\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>>::type\n    PhysicalDevice::getSurfaceCapabilities2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceSurfaceCapabilities2KHR &&\n                       \"Function <vkGetPhysicalDeviceSurfaceCapabilities2KHR> requires <VK_KHR_get_surface_capabilities2>\" );\n#  endif\n\n    StructureChain<X, Y, Z...>                      structureChain;\n    VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR & surfaceCapabilities = structureChain.template get<VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR>();\n    VULKAN_HPP_NAMESPACE::Result                    result              = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetPhysicalDeviceSurfaceCapabilities2KHR( m_physicalDevice,\n                                                    reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ),\n                                                    reinterpret_cast<VkSurfaceCapabilities2KHR *>( &surfaceCapabilities ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfaceCapabilities2KHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( structureChain ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getSurfaceFormats2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR * pSurfaceInfo,\n                                                                                       uint32_t *                                pSurfaceFormatCount,\n                                                                                       VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR * pSurfaceFormats,\n                                                                                       Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceSurfaceFormats2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                         reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( pSurfaceInfo ),\n                                                                         pSurfaceFormatCount,\n                                                                         reinterpret_cast<VkSurfaceFormat2KHR *>( pSurfaceFormats ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename SurfaceFormat2KHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename SurfaceFormat2KHRAllocator::value_type, VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR, SurfaceFormat2KHRAllocator>>::type\n    PhysicalDevice::getSurfaceFormats2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceSurfaceFormats2KHR &&\n                       \"Function <vkGetPhysicalDeviceSurfaceFormats2KHR> requires <VK_KHR_get_surface_capabilities2>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR, SurfaceFormat2KHRAllocator> surfaceFormats;\n    uint32_t                                                                         surfaceFormatCount;\n    VULKAN_HPP_NAMESPACE::Result                                                     result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceSurfaceFormats2KHR(\n        m_physicalDevice, reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ), &surfaceFormatCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && surfaceFormatCount )\n      {\n        surfaceFormats.resize( surfaceFormatCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceSurfaceFormats2KHR( m_physicalDevice,\n                                                   reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ),\n                                                   &surfaceFormatCount,\n                                                   reinterpret_cast<VkSurfaceFormat2KHR *>( surfaceFormats.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfaceFormats2KHR\" );\n    VULKAN_HPP_ASSERT( surfaceFormatCount <= surfaceFormats.size() );\n    if ( surfaceFormatCount < surfaceFormats.size() )\n    {\n      surfaceFormats.resize( surfaceFormatCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( surfaceFormats ) );\n  }\n\n  template <typename SurfaceFormat2KHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename SurfaceFormat2KHRAllocator::value_type, VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR, SurfaceFormat2KHRAllocator>>::type\n                       PhysicalDevice::getSurfaceFormats2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo,\n                                           SurfaceFormat2KHRAllocator &                                surfaceFormat2KHRAllocator,\n                                           Dispatch const &                                            d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceSurfaceFormats2KHR &&\n                       \"Function <vkGetPhysicalDeviceSurfaceFormats2KHR> requires <VK_KHR_get_surface_capabilities2>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR, SurfaceFormat2KHRAllocator> surfaceFormats( surfaceFormat2KHRAllocator );\n    uint32_t                                                                         surfaceFormatCount;\n    VULKAN_HPP_NAMESPACE::Result                                                     result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceSurfaceFormats2KHR(\n        m_physicalDevice, reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ), &surfaceFormatCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && surfaceFormatCount )\n      {\n        surfaceFormats.resize( surfaceFormatCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceSurfaceFormats2KHR( m_physicalDevice,\n                                                   reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ),\n                                                   &surfaceFormatCount,\n                                                   reinterpret_cast<VkSurfaceFormat2KHR *>( surfaceFormats.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfaceFormats2KHR\" );\n    VULKAN_HPP_ASSERT( surfaceFormatCount <= surfaceFormats.size() );\n    if ( surfaceFormatCount < surfaceFormats.size() )\n    {\n      surfaceFormats.resize( surfaceFormatCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( surfaceFormats ) );\n  }\n\n  template <typename StructureChain,\n            typename StructureChainAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename StructureChainAllocator::value_type, StructureChain>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<StructureChain, StructureChainAllocator>>::type\n    PhysicalDevice::getSurfaceFormats2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceSurfaceFormats2KHR &&\n                       \"Function <vkGetPhysicalDeviceSurfaceFormats2KHR> requires <VK_KHR_get_surface_capabilities2>\" );\n#  endif\n\n    std::vector<StructureChain, StructureChainAllocator> structureChains;\n    std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR> surfaceFormats;\n    uint32_t                                             surfaceFormatCount;\n    VULKAN_HPP_NAMESPACE::Result                         result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceSurfaceFormats2KHR(\n        m_physicalDevice, reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ), &surfaceFormatCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && surfaceFormatCount )\n      {\n        structureChains.resize( surfaceFormatCount );\n        surfaceFormats.resize( surfaceFormatCount );\n        for ( uint32_t i = 0; i < surfaceFormatCount; i++ )\n        {\n          surfaceFormats[i].pNext = structureChains[i].template get<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR>().pNext;\n        }\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceSurfaceFormats2KHR( m_physicalDevice,\n                                                   reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ),\n                                                   &surfaceFormatCount,\n                                                   reinterpret_cast<VkSurfaceFormat2KHR *>( surfaceFormats.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfaceFormats2KHR\" );\n    VULKAN_HPP_ASSERT( surfaceFormatCount <= surfaceFormats.size() );\n    if ( surfaceFormatCount < surfaceFormats.size() )\n    {\n      structureChains.resize( surfaceFormatCount );\n    }\n    for ( uint32_t i = 0; i < surfaceFormatCount; i++ )\n    {\n      structureChains[i].template get<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR>() = surfaceFormats[i];\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( structureChains ) );\n  }\n\n  template <typename StructureChain,\n            typename StructureChainAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename StructureChainAllocator::value_type, StructureChain>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<StructureChain, StructureChainAllocator>>::type\n                       PhysicalDevice::getSurfaceFormats2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo,\n                                           StructureChainAllocator &                                   structureChainAllocator,\n                                           Dispatch const &                                            d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceSurfaceFormats2KHR &&\n                       \"Function <vkGetPhysicalDeviceSurfaceFormats2KHR> requires <VK_KHR_get_surface_capabilities2>\" );\n#  endif\n\n    std::vector<StructureChain, StructureChainAllocator> structureChains( structureChainAllocator );\n    std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR> surfaceFormats;\n    uint32_t                                             surfaceFormatCount;\n    VULKAN_HPP_NAMESPACE::Result                         result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceSurfaceFormats2KHR(\n        m_physicalDevice, reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ), &surfaceFormatCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && surfaceFormatCount )\n      {\n        structureChains.resize( surfaceFormatCount );\n        surfaceFormats.resize( surfaceFormatCount );\n        for ( uint32_t i = 0; i < surfaceFormatCount; i++ )\n        {\n          surfaceFormats[i].pNext = structureChains[i].template get<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR>().pNext;\n        }\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceSurfaceFormats2KHR( m_physicalDevice,\n                                                   reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ),\n                                                   &surfaceFormatCount,\n                                                   reinterpret_cast<VkSurfaceFormat2KHR *>( surfaceFormats.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfaceFormats2KHR\" );\n    VULKAN_HPP_ASSERT( surfaceFormatCount <= surfaceFormats.size() );\n    if ( surfaceFormatCount < surfaceFormats.size() )\n    {\n      structureChains.resize( surfaceFormatCount );\n    }\n    for ( uint32_t i = 0; i < surfaceFormatCount; i++ )\n    {\n      structureChains[i].template get<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR>() = surfaceFormats[i];\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( structureChains ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_get_display_properties2 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getDisplayProperties2KHR( uint32_t *                                    pPropertyCount,\n                                                                                          VULKAN_HPP_NAMESPACE::DisplayProperties2KHR * pProperties,\n                                                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceDisplayProperties2KHR(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ), pPropertyCount, reinterpret_cast<VkDisplayProperties2KHR *>( pProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <\n    typename DisplayProperties2KHRAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename DisplayProperties2KHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayProperties2KHR>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayProperties2KHR, DisplayProperties2KHRAllocator>>::type\n    PhysicalDevice::getDisplayProperties2KHR( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceDisplayProperties2KHR &&\n                       \"Function <vkGetPhysicalDeviceDisplayProperties2KHR> requires <VK_KHR_get_display_properties2>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::DisplayProperties2KHR, DisplayProperties2KHRAllocator> properties;\n    uint32_t                                                                                 propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                             result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceDisplayProperties2KHR( m_physicalDevice, &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceDisplayProperties2KHR( m_physicalDevice, &propertyCount, reinterpret_cast<VkDisplayProperties2KHR *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDisplayProperties2KHR\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n\n  template <\n    typename DisplayProperties2KHRAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename DisplayProperties2KHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayProperties2KHR>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayProperties2KHR, DisplayProperties2KHRAllocator>>::type\n    PhysicalDevice::getDisplayProperties2KHR( DisplayProperties2KHRAllocator & displayProperties2KHRAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceDisplayProperties2KHR &&\n                       \"Function <vkGetPhysicalDeviceDisplayProperties2KHR> requires <VK_KHR_get_display_properties2>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::DisplayProperties2KHR, DisplayProperties2KHRAllocator> properties( displayProperties2KHRAllocator );\n    uint32_t                                                                                 propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                             result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceDisplayProperties2KHR( m_physicalDevice, &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceDisplayProperties2KHR( m_physicalDevice, &propertyCount, reinterpret_cast<VkDisplayProperties2KHR *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDisplayProperties2KHR\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getDisplayPlaneProperties2KHR( uint32_t * pPropertyCount,\n                                                                                               VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR * pProperties,\n                                                                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceDisplayPlaneProperties2KHR(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ), pPropertyCount, reinterpret_cast<VkDisplayPlaneProperties2KHR *>( pProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <\n    typename DisplayPlaneProperties2KHRAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename DisplayPlaneProperties2KHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR, DisplayPlaneProperties2KHRAllocator>>::type\n    PhysicalDevice::getDisplayPlaneProperties2KHR( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceDisplayPlaneProperties2KHR &&\n                       \"Function <vkGetPhysicalDeviceDisplayPlaneProperties2KHR> requires <VK_KHR_get_display_properties2>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR, DisplayPlaneProperties2KHRAllocator> properties;\n    uint32_t                                                                                           propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                       result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceDisplayPlaneProperties2KHR( m_physicalDevice, &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceDisplayPlaneProperties2KHR(\n          m_physicalDevice, &propertyCount, reinterpret_cast<VkDisplayPlaneProperties2KHR *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDisplayPlaneProperties2KHR\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n\n  template <\n    typename DisplayPlaneProperties2KHRAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename DisplayPlaneProperties2KHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR, DisplayPlaneProperties2KHRAllocator>>::type\n    PhysicalDevice::getDisplayPlaneProperties2KHR( DisplayPlaneProperties2KHRAllocator & displayPlaneProperties2KHRAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceDisplayPlaneProperties2KHR &&\n                       \"Function <vkGetPhysicalDeviceDisplayPlaneProperties2KHR> requires <VK_KHR_get_display_properties2>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR, DisplayPlaneProperties2KHRAllocator> properties( displayPlaneProperties2KHRAllocator );\n    uint32_t                                                                                           propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                       result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceDisplayPlaneProperties2KHR( m_physicalDevice, &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceDisplayPlaneProperties2KHR(\n          m_physicalDevice, &propertyCount, reinterpret_cast<VkDisplayPlaneProperties2KHR *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDisplayPlaneProperties2KHR\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getDisplayModeProperties2KHR( VULKAN_HPP_NAMESPACE::DisplayKHR                  display,\n                                                                                              uint32_t *                                        pPropertyCount,\n                                                                                              VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR * pProperties,\n                                                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetDisplayModeProperties2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                  static_cast<VkDisplayKHR>( display ),\n                                                                  pPropertyCount,\n                                                                  reinterpret_cast<VkDisplayModeProperties2KHR *>( pProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <\n    typename DisplayModeProperties2KHRAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename DisplayModeProperties2KHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR, DisplayModeProperties2KHRAllocator>>::type\n    PhysicalDevice::getDisplayModeProperties2KHR( VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDisplayModeProperties2KHR && \"Function <vkGetDisplayModeProperties2KHR> requires <VK_KHR_get_display_properties2>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR, DisplayModeProperties2KHRAllocator> properties;\n    uint32_t                                                                                         propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                     result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetDisplayModeProperties2KHR( m_physicalDevice, static_cast<VkDisplayKHR>( display ), &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetDisplayModeProperties2KHR(\n          m_physicalDevice, static_cast<VkDisplayKHR>( display ), &propertyCount, reinterpret_cast<VkDisplayModeProperties2KHR *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDisplayModeProperties2KHR\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n\n  template <\n    typename DisplayModeProperties2KHRAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename DisplayModeProperties2KHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR, DisplayModeProperties2KHRAllocator>>::type\n    PhysicalDevice::getDisplayModeProperties2KHR( VULKAN_HPP_NAMESPACE::DisplayKHR     display,\n                                                  DisplayModeProperties2KHRAllocator & displayModeProperties2KHRAllocator,\n                                                  Dispatch const &                     d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDisplayModeProperties2KHR && \"Function <vkGetDisplayModeProperties2KHR> requires <VK_KHR_get_display_properties2>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR, DisplayModeProperties2KHRAllocator> properties( displayModeProperties2KHRAllocator );\n    uint32_t                                                                                         propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                     result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetDisplayModeProperties2KHR( m_physicalDevice, static_cast<VkDisplayKHR>( display ), &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetDisplayModeProperties2KHR(\n          m_physicalDevice, static_cast<VkDisplayKHR>( display ), &propertyCount, reinterpret_cast<VkDisplayModeProperties2KHR *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDisplayModeProperties2KHR\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n\n  template <typename StructureChain,\n            typename StructureChainAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename StructureChainAllocator::value_type, StructureChain>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<StructureChain, StructureChainAllocator>>::type\n                       PhysicalDevice::getDisplayModeProperties2KHR( VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDisplayModeProperties2KHR && \"Function <vkGetDisplayModeProperties2KHR> requires <VK_KHR_get_display_properties2>\" );\n#  endif\n\n    std::vector<StructureChain, StructureChainAllocator>         structureChains;\n    std::vector<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR> properties;\n    uint32_t                                                     propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                 result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetDisplayModeProperties2KHR( m_physicalDevice, static_cast<VkDisplayKHR>( display ), &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        structureChains.resize( propertyCount );\n        properties.resize( propertyCount );\n        for ( uint32_t i = 0; i < propertyCount; i++ )\n        {\n          properties[i].pNext = structureChains[i].template get<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR>().pNext;\n        }\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetDisplayModeProperties2KHR(\n          m_physicalDevice, static_cast<VkDisplayKHR>( display ), &propertyCount, reinterpret_cast<VkDisplayModeProperties2KHR *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDisplayModeProperties2KHR\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      structureChains.resize( propertyCount );\n    }\n    for ( uint32_t i = 0; i < propertyCount; i++ )\n    {\n      structureChains[i].template get<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR>() = properties[i];\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( structureChains ) );\n  }\n\n  template <typename StructureChain,\n            typename StructureChainAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename StructureChainAllocator::value_type, StructureChain>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<StructureChain, StructureChainAllocator>>::type\n                       PhysicalDevice::getDisplayModeProperties2KHR( VULKAN_HPP_NAMESPACE::DisplayKHR display,\n                                                  StructureChainAllocator &        structureChainAllocator,\n                                                  Dispatch const &                 d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDisplayModeProperties2KHR && \"Function <vkGetDisplayModeProperties2KHR> requires <VK_KHR_get_display_properties2>\" );\n#  endif\n\n    std::vector<StructureChain, StructureChainAllocator>         structureChains( structureChainAllocator );\n    std::vector<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR> properties;\n    uint32_t                                                     propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                 result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetDisplayModeProperties2KHR( m_physicalDevice, static_cast<VkDisplayKHR>( display ), &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        structureChains.resize( propertyCount );\n        properties.resize( propertyCount );\n        for ( uint32_t i = 0; i < propertyCount; i++ )\n        {\n          properties[i].pNext = structureChains[i].template get<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR>().pNext;\n        }\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetDisplayModeProperties2KHR(\n          m_physicalDevice, static_cast<VkDisplayKHR>( display ), &propertyCount, reinterpret_cast<VkDisplayModeProperties2KHR *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDisplayModeProperties2KHR\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      structureChains.resize( propertyCount );\n    }\n    for ( uint32_t i = 0; i < propertyCount; i++ )\n    {\n      structureChains[i].template get<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR>() = properties[i];\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( structureChains ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    PhysicalDevice::getDisplayPlaneCapabilities2KHR( const VULKAN_HPP_NAMESPACE::DisplayPlaneInfo2KHR *   pDisplayPlaneInfo,\n                                                     VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilities2KHR * pCapabilities,\n                                                     Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetDisplayPlaneCapabilities2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                     reinterpret_cast<const VkDisplayPlaneInfo2KHR *>( pDisplayPlaneInfo ),\n                                                                     reinterpret_cast<VkDisplayPlaneCapabilities2KHR *>( pCapabilities ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilities2KHR>::type\n    PhysicalDevice::getDisplayPlaneCapabilities2KHR( const VULKAN_HPP_NAMESPACE::DisplayPlaneInfo2KHR & displayPlaneInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDisplayPlaneCapabilities2KHR && \"Function <vkGetDisplayPlaneCapabilities2KHR> requires <VK_KHR_get_display_properties2>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilities2KHR capabilities;\n    VULKAN_HPP_NAMESPACE::Result                       result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetDisplayPlaneCapabilities2KHR( m_physicalDevice,\n                                                                                      reinterpret_cast<const VkDisplayPlaneInfo2KHR *>( &displayPlaneInfo ),\n                                                                                      reinterpret_cast<VkDisplayPlaneCapabilities2KHR *>( &capabilities ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDisplayPlaneCapabilities2KHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( capabilities ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_USE_PLATFORM_IOS_MVK )\n  //=== VK_MVK_ios_surface ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Instance::createIOSSurfaceMVK( const VULKAN_HPP_NAMESPACE::IOSSurfaceCreateInfoMVK * pCreateInfo,\n                                                                               const VULKAN_HPP_NAMESPACE::AllocationCallbacks *     pAllocator,\n                                                                               VULKAN_HPP_NAMESPACE::SurfaceKHR *                    pSurface,\n                                                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateIOSSurfaceMVK( static_cast<VkInstance>( m_instance ),\n                                                         reinterpret_cast<const VkIOSSurfaceCreateInfoMVK *>( pCreateInfo ),\n                                                         reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                         reinterpret_cast<VkSurfaceKHR *>( pSurface ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n                       Instance::createIOSSurfaceMVK( const VULKAN_HPP_NAMESPACE::IOSSurfaceCreateInfoMVK &     createInfo,\n                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                   Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateIOSSurfaceMVK && \"Function <vkCreateIOSSurfaceMVK> requires <VK_MVK_ios_surface>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateIOSSurfaceMVK( m_instance,\n                               reinterpret_cast<const VkIOSSurfaceCreateInfoMVK *>( &createInfo ),\n                               reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                               reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createIOSSurfaceMVK\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( surface ) );\n  }\n\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n                       Instance::createIOSSurfaceMVKUnique( const VULKAN_HPP_NAMESPACE::IOSSurfaceCreateInfoMVK &     createInfo,\n                                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                         Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#      if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateIOSSurfaceMVK && \"Function <vkCreateIOSSurfaceMVK> requires <VK_MVK_ios_surface>\" );\n#      endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateIOSSurfaceMVK( m_instance,\n                               reinterpret_cast<const VkIOSSurfaceCreateInfoMVK *>( &createInfo ),\n                               reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                               reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createIOSSurfaceMVKUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>( surface, detail::ObjectDestroy<Instance, Dispatch>( *this, allocator, d ) ) );\n  }\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_IOS_MVK*/\n\n#if defined( VK_USE_PLATFORM_MACOS_MVK )\n  //=== VK_MVK_macos_surface ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Instance::createMacOSSurfaceMVK( const VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateInfoMVK * pCreateInfo,\n                                                                                 const VULKAN_HPP_NAMESPACE::AllocationCallbacks *       pAllocator,\n                                                                                 VULKAN_HPP_NAMESPACE::SurfaceKHR *                      pSurface,\n                                                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateMacOSSurfaceMVK( static_cast<VkInstance>( m_instance ),\n                                                           reinterpret_cast<const VkMacOSSurfaceCreateInfoMVK *>( pCreateInfo ),\n                                                           reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                           reinterpret_cast<VkSurfaceKHR *>( pSurface ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n                       Instance::createMacOSSurfaceMVK( const VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateInfoMVK &   createInfo,\n                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                     Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateMacOSSurfaceMVK && \"Function <vkCreateMacOSSurfaceMVK> requires <VK_MVK_macos_surface>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateMacOSSurfaceMVK( m_instance,\n                                 reinterpret_cast<const VkMacOSSurfaceCreateInfoMVK *>( &createInfo ),\n                                 reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                                 reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createMacOSSurfaceMVK\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( surface ) );\n  }\n\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n                       Instance::createMacOSSurfaceMVKUnique( const VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateInfoMVK &   createInfo,\n                                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                           Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#      if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateMacOSSurfaceMVK && \"Function <vkCreateMacOSSurfaceMVK> requires <VK_MVK_macos_surface>\" );\n#      endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateMacOSSurfaceMVK( m_instance,\n                                 reinterpret_cast<const VkMacOSSurfaceCreateInfoMVK *>( &createInfo ),\n                                 reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                                 reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createMacOSSurfaceMVKUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>( surface, detail::ObjectDestroy<Instance, Dispatch>( *this, allocator, d ) ) );\n  }\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_MACOS_MVK*/\n\n  //=== VK_EXT_debug_utils ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::setDebugUtilsObjectNameEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT * pNameInfo,\n                                                                                    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkSetDebugUtilsObjectNameEXT( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkDebugUtilsObjectNameInfoEXT *>( pNameInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::setDebugUtilsObjectNameEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT & nameInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkSetDebugUtilsObjectNameEXT && \"Function <vkSetDebugUtilsObjectNameEXT> requires <VK_EXT_debug_utils>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkSetDebugUtilsObjectNameEXT( m_device, reinterpret_cast<const VkDebugUtilsObjectNameInfoEXT *>( &nameInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::setDebugUtilsObjectNameEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::setDebugUtilsObjectTagEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsObjectTagInfoEXT * pTagInfo,\n                                                                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkSetDebugUtilsObjectTagEXT( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkDebugUtilsObjectTagInfoEXT *>( pTagInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::setDebugUtilsObjectTagEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsObjectTagInfoEXT & tagInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkSetDebugUtilsObjectTagEXT && \"Function <vkSetDebugUtilsObjectTagEXT> requires <VK_EXT_debug_utils>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkSetDebugUtilsObjectTagEXT( m_device, reinterpret_cast<const VkDebugUtilsObjectTagInfoEXT *>( &tagInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::setDebugUtilsObjectTagEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Queue::beginDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT * pLabelInfo,\n                                                         Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkQueueBeginDebugUtilsLabelEXT( static_cast<VkQueue>( m_queue ), reinterpret_cast<const VkDebugUtilsLabelEXT *>( pLabelInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Queue::beginDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT & labelInfo,\n                                                         Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkQueueBeginDebugUtilsLabelEXT && \"Function <vkQueueBeginDebugUtilsLabelEXT> requires <VK_EXT_debug_utils>\" );\n#  endif\n\n    d.vkQueueBeginDebugUtilsLabelEXT( m_queue, reinterpret_cast<const VkDebugUtilsLabelEXT *>( &labelInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Queue::endDebugUtilsLabelEXT( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkQueueEndDebugUtilsLabelEXT( static_cast<VkQueue>( m_queue ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Queue::insertDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT * pLabelInfo,\n                                                          Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkQueueInsertDebugUtilsLabelEXT( static_cast<VkQueue>( m_queue ), reinterpret_cast<const VkDebugUtilsLabelEXT *>( pLabelInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Queue::insertDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT & labelInfo,\n                                                          Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkQueueInsertDebugUtilsLabelEXT && \"Function <vkQueueInsertDebugUtilsLabelEXT> requires <VK_EXT_debug_utils>\" );\n#  endif\n\n    d.vkQueueInsertDebugUtilsLabelEXT( m_queue, reinterpret_cast<const VkDebugUtilsLabelEXT *>( &labelInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::beginDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT * pLabelInfo,\n                                                                 Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBeginDebugUtilsLabelEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkDebugUtilsLabelEXT *>( pLabelInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::beginDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT & labelInfo,\n                                                                 Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBeginDebugUtilsLabelEXT && \"Function <vkCmdBeginDebugUtilsLabelEXT> requires <VK_EXT_debug_utils>\" );\n#  endif\n\n    d.vkCmdBeginDebugUtilsLabelEXT( m_commandBuffer, reinterpret_cast<const VkDebugUtilsLabelEXT *>( &labelInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::endDebugUtilsLabelEXT( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdEndDebugUtilsLabelEXT( static_cast<VkCommandBuffer>( m_commandBuffer ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::insertDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT * pLabelInfo,\n                                                                  Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdInsertDebugUtilsLabelEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkDebugUtilsLabelEXT *>( pLabelInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::insertDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT & labelInfo,\n                                                                  Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdInsertDebugUtilsLabelEXT && \"Function <vkCmdInsertDebugUtilsLabelEXT> requires <VK_EXT_debug_utils>\" );\n#  endif\n\n    d.vkCmdInsertDebugUtilsLabelEXT( m_commandBuffer, reinterpret_cast<const VkDebugUtilsLabelEXT *>( &labelInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Instance::createDebugUtilsMessengerEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateInfoEXT * pCreateInfo,\n                                            const VULKAN_HPP_NAMESPACE::AllocationCallbacks *              pAllocator,\n                                            VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT *                 pMessenger,\n                                            Dispatch const &                                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateDebugUtilsMessengerEXT( static_cast<VkInstance>( m_instance ),\n                                                                  reinterpret_cast<const VkDebugUtilsMessengerCreateInfoEXT *>( pCreateInfo ),\n                                                                  reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                                  reinterpret_cast<VkDebugUtilsMessengerEXT *>( pMessenger ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT>::type\n                       Instance::createDebugUtilsMessengerEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateInfoEXT & createInfo,\n                                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>      allocator,\n                                            Dispatch const &                                               d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateDebugUtilsMessengerEXT && \"Function <vkCreateDebugUtilsMessengerEXT> requires <VK_EXT_debug_utils>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT messenger;\n    VULKAN_HPP_NAMESPACE::Result                 result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateDebugUtilsMessengerEXT(\n      m_instance,\n      reinterpret_cast<const VkDebugUtilsMessengerCreateInfoEXT *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkDebugUtilsMessengerEXT *>( &messenger ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createDebugUtilsMessengerEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( messenger ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT, Dispatch>>::type\n                       Instance::createDebugUtilsMessengerEXTUnique( const VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateInfoEXT & createInfo,\n                                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>      allocator,\n                                                  Dispatch const &                                               d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateDebugUtilsMessengerEXT && \"Function <vkCreateDebugUtilsMessengerEXT> requires <VK_EXT_debug_utils>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT messenger;\n    VULKAN_HPP_NAMESPACE::Result                 result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateDebugUtilsMessengerEXT(\n      m_instance,\n      reinterpret_cast<const VkDebugUtilsMessengerCreateInfoEXT *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkDebugUtilsMessengerEXT *>( &messenger ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createDebugUtilsMessengerEXTUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result,\n      UniqueHandle<VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT, Dispatch>( messenger, detail::ObjectDestroy<Instance, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Instance::destroyDebugUtilsMessengerEXT( VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT      messenger,\n                                                                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                  Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyDebugUtilsMessengerEXT( static_cast<VkInstance>( m_instance ),\n                                       static_cast<VkDebugUtilsMessengerEXT>( messenger ),\n                                       reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Instance::destroyDebugUtilsMessengerEXT( VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT              messenger,\n                                                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                                  Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyDebugUtilsMessengerEXT && \"Function <vkDestroyDebugUtilsMessengerEXT> requires <VK_EXT_debug_utils>\" );\n#  endif\n\n    d.vkDestroyDebugUtilsMessengerEXT(\n      m_instance,\n      static_cast<VkDebugUtilsMessengerEXT>( messenger ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Instance::destroy( VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT      messenger,\n                                            const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                            Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyDebugUtilsMessengerEXT( static_cast<VkInstance>( m_instance ),\n                                       static_cast<VkDebugUtilsMessengerEXT>( messenger ),\n                                       reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Instance::destroy( VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT              messenger,\n                                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                            Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyDebugUtilsMessengerEXT && \"Function <vkDestroyDebugUtilsMessengerEXT> requires <VK_EXT_debug_utils>\" );\n#  endif\n\n    d.vkDestroyDebugUtilsMessengerEXT(\n      m_instance,\n      static_cast<VkDebugUtilsMessengerEXT>( messenger ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Instance::submitDebugUtilsMessageEXT( VULKAN_HPP_NAMESPACE::DebugUtilsMessageSeverityFlagBitsEXT       messageSeverity,\n                                                               VULKAN_HPP_NAMESPACE::DebugUtilsMessageTypeFlagsEXT              messageTypes,\n                                                               const VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCallbackDataEXT * pCallbackData,\n                                                               Dispatch const &                                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkSubmitDebugUtilsMessageEXT( static_cast<VkInstance>( m_instance ),\n                                    static_cast<VkDebugUtilsMessageSeverityFlagBitsEXT>( messageSeverity ),\n                                    static_cast<VkDebugUtilsMessageTypeFlagsEXT>( messageTypes ),\n                                    reinterpret_cast<const VkDebugUtilsMessengerCallbackDataEXT *>( pCallbackData ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Instance::submitDebugUtilsMessageEXT( VULKAN_HPP_NAMESPACE::DebugUtilsMessageSeverityFlagBitsEXT       messageSeverity,\n                                                               VULKAN_HPP_NAMESPACE::DebugUtilsMessageTypeFlagsEXT              messageTypes,\n                                                               const VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCallbackDataEXT & callbackData,\n                                                               Dispatch const &                                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkSubmitDebugUtilsMessageEXT && \"Function <vkSubmitDebugUtilsMessageEXT> requires <VK_EXT_debug_utils>\" );\n#  endif\n\n    d.vkSubmitDebugUtilsMessageEXT( m_instance,\n                                    static_cast<VkDebugUtilsMessageSeverityFlagBitsEXT>( messageSeverity ),\n                                    static_cast<VkDebugUtilsMessageTypeFlagsEXT>( messageTypes ),\n                                    reinterpret_cast<const VkDebugUtilsMessengerCallbackDataEXT *>( &callbackData ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  //=== VK_ANDROID_external_memory_android_hardware_buffer ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::getAndroidHardwareBufferPropertiesANDROID( const struct AHardwareBuffer *                                 buffer,\n                                                       VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID * pProperties,\n                                                       Dispatch const &                                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetAndroidHardwareBufferPropertiesANDROID(\n      static_cast<VkDevice>( m_device ), buffer, reinterpret_cast<VkAndroidHardwareBufferPropertiesANDROID *>( pProperties ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID>::type\n                       Device::getAndroidHardwareBufferPropertiesANDROID( const struct AHardwareBuffer & buffer, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetAndroidHardwareBufferPropertiesANDROID &&\n                       \"Function <vkGetAndroidHardwareBufferPropertiesANDROID> requires <VK_ANDROID_external_memory_android_hardware_buffer>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID properties;\n    VULKAN_HPP_NAMESPACE::Result                                 result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetAndroidHardwareBufferPropertiesANDROID( m_device, &buffer, reinterpret_cast<VkAndroidHardwareBufferPropertiesANDROID *>( &properties ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getAndroidHardwareBufferPropertiesANDROID\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>>::type\n                       Device::getAndroidHardwareBufferPropertiesANDROID( const struct AHardwareBuffer & buffer, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetAndroidHardwareBufferPropertiesANDROID &&\n                       \"Function <vkGetAndroidHardwareBufferPropertiesANDROID> requires <VK_ANDROID_external_memory_android_hardware_buffer>\" );\n#    endif\n\n    StructureChain<X, Y, Z...>                                     structureChain;\n    VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID & properties =\n      structureChain.template get<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID>();\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetAndroidHardwareBufferPropertiesANDROID( m_device, &buffer, reinterpret_cast<VkAndroidHardwareBufferPropertiesANDROID *>( &properties ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getAndroidHardwareBufferPropertiesANDROID\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( structureChain ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::getMemoryAndroidHardwareBufferANDROID( const VULKAN_HPP_NAMESPACE::MemoryGetAndroidHardwareBufferInfoANDROID * pInfo,\n                                                   struct AHardwareBuffer **                                               pBuffer,\n                                                   Dispatch const &                                                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetMemoryAndroidHardwareBufferANDROID(\n      static_cast<VkDevice>( m_device ), reinterpret_cast<const VkMemoryGetAndroidHardwareBufferInfoANDROID *>( pInfo ), pBuffer ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<struct AHardwareBuffer *>::type\n    Device::getMemoryAndroidHardwareBufferANDROID( const VULKAN_HPP_NAMESPACE::MemoryGetAndroidHardwareBufferInfoANDROID & info, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetMemoryAndroidHardwareBufferANDROID &&\n                       \"Function <vkGetMemoryAndroidHardwareBufferANDROID> requires <VK_ANDROID_external_memory_android_hardware_buffer>\" );\n#    endif\n\n    struct AHardwareBuffer *     buffer;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetMemoryAndroidHardwareBufferANDROID( m_device, reinterpret_cast<const VkMemoryGetAndroidHardwareBufferInfoANDROID *>( &info ), &buffer ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getMemoryAndroidHardwareBufferANDROID\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( buffer ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  //=== VK_AMDX_shader_enqueue ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::createExecutionGraphPipelinesAMDX( VULKAN_HPP_NAMESPACE::PipelineCache                                pipelineCache,\n                                               uint32_t                                                           createInfoCount,\n                                               const VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX * pCreateInfos,\n                                               const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                  pAllocator,\n                                               VULKAN_HPP_NAMESPACE::Pipeline *                                   pPipelines,\n                                               Dispatch const &                                                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateExecutionGraphPipelinesAMDX( static_cast<VkDevice>( m_device ),\n                                                                       static_cast<VkPipelineCache>( pipelineCache ),\n                                                                       createInfoCount,\n                                                                       reinterpret_cast<const VkExecutionGraphPipelineCreateInfoAMDX *>( pCreateInfos ),\n                                                                       reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                                       reinterpret_cast<VkPipeline *>( pPipelines ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename PipelineAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, VULKAN_HPP_NAMESPACE::Pipeline>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>> Device::createExecutionGraphPipelinesAMDX(\n    VULKAN_HPP_NAMESPACE::PipelineCache                                                                        pipelineCache,\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX> const & createInfos,\n    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                                  allocator,\n    Dispatch const &                                                                                           d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateExecutionGraphPipelinesAMDX && \"Function <vkCreateExecutionGraphPipelinesAMDX> requires <VK_AMDX_shader_enqueue>\" );\n#    endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator> pipelines( createInfos.size() );\n    VULKAN_HPP_NAMESPACE::Result                                   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateExecutionGraphPipelinesAMDX(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      createInfos.size(),\n      reinterpret_cast<const VkExecutionGraphPipelineCreateInfoAMDX *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createExecutionGraphPipelinesAMDX\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n\n    return ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>( result, std::move( pipelines ) );\n  }\n\n  template <typename PipelineAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, VULKAN_HPP_NAMESPACE::Pipeline>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>> Device::createExecutionGraphPipelinesAMDX(\n    VULKAN_HPP_NAMESPACE::PipelineCache                                                                        pipelineCache,\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX> const & createInfos,\n    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                                  allocator,\n    PipelineAllocator &                                                                                        pipelineAllocator,\n    Dispatch const &                                                                                           d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateExecutionGraphPipelinesAMDX && \"Function <vkCreateExecutionGraphPipelinesAMDX> requires <VK_AMDX_shader_enqueue>\" );\n#    endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator> pipelines( createInfos.size(), pipelineAllocator );\n    VULKAN_HPP_NAMESPACE::Result                                   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateExecutionGraphPipelinesAMDX(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      createInfos.size(),\n      reinterpret_cast<const VkExecutionGraphPipelineCreateInfoAMDX *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createExecutionGraphPipelinesAMDX\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n\n    return ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>( result, std::move( pipelines ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<VULKAN_HPP_NAMESPACE::Pipeline>\n                                         Device::createExecutionGraphPipelineAMDX( VULKAN_HPP_NAMESPACE::PipelineCache                                pipelineCache,\n                                              const VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX & createInfo,\n                                              Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>          allocator,\n                                              Dispatch const &                                                   d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateExecutionGraphPipelinesAMDX && \"Function <vkCreateExecutionGraphPipelinesAMDX> requires <VK_AMDX_shader_enqueue>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Pipeline pipeline;\n    VULKAN_HPP_NAMESPACE::Result   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateExecutionGraphPipelinesAMDX(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      1,\n      reinterpret_cast<const VkExecutionGraphPipelineCreateInfoAMDX *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( &pipeline ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createExecutionGraphPipelineAMDX\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n\n    return ResultValue<VULKAN_HPP_NAMESPACE::Pipeline>( result, std::move( pipeline ) );\n  }\n\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <\n    typename Dispatch,\n    typename PipelineAllocator,\n    typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>\n                                         Device::createExecutionGraphPipelinesAMDXUnique(\n      VULKAN_HPP_NAMESPACE::PipelineCache                                                                        pipelineCache,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX> const & createInfos,\n      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                                  allocator,\n      Dispatch const &                                                                                           d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#      if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateExecutionGraphPipelinesAMDX && \"Function <vkCreateExecutionGraphPipelinesAMDX> requires <VK_AMDX_shader_enqueue>\" );\n#      endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Pipeline> pipelines( createInfos.size() );\n    VULKAN_HPP_NAMESPACE::Result                result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateExecutionGraphPipelinesAMDX(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      createInfos.size(),\n      reinterpret_cast<const VkExecutionGraphPipelineCreateInfoAMDX *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createExecutionGraphPipelinesAMDXUnique\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n    std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator> uniquePipelines;\n    uniquePipelines.reserve( createInfos.size() );\n    detail::ObjectDestroy<Device, Dispatch> deleter( *this, allocator, d );\n    for ( auto const & pipeline : pipelines )\n    {\n      uniquePipelines.push_back( UniqueHandle<Pipeline, Dispatch>( pipeline, deleter ) );\n    }\n    return ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>( result, std::move( uniquePipelines ) );\n  }\n\n  template <\n    typename Dispatch,\n    typename PipelineAllocator,\n    typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>\n                                         Device::createExecutionGraphPipelinesAMDXUnique(\n      VULKAN_HPP_NAMESPACE::PipelineCache                                                                        pipelineCache,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX> const & createInfos,\n      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                                  allocator,\n      PipelineAllocator &                                                                                        pipelineAllocator,\n      Dispatch const &                                                                                           d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#      if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateExecutionGraphPipelinesAMDX && \"Function <vkCreateExecutionGraphPipelinesAMDX> requires <VK_AMDX_shader_enqueue>\" );\n#      endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Pipeline> pipelines( createInfos.size() );\n    VULKAN_HPP_NAMESPACE::Result                result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateExecutionGraphPipelinesAMDX(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      createInfos.size(),\n      reinterpret_cast<const VkExecutionGraphPipelineCreateInfoAMDX *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createExecutionGraphPipelinesAMDXUnique\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n    std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator> uniquePipelines( pipelineAllocator );\n    uniquePipelines.reserve( createInfos.size() );\n    detail::ObjectDestroy<Device, Dispatch> deleter( *this, allocator, d );\n    for ( auto const & pipeline : pipelines )\n    {\n      uniquePipelines.push_back( UniqueHandle<Pipeline, Dispatch>( pipeline, deleter ) );\n    }\n    return ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>( result, std::move( uniquePipelines ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>\n                                         Device::createExecutionGraphPipelineAMDXUnique( VULKAN_HPP_NAMESPACE::PipelineCache                                pipelineCache,\n                                                    const VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX & createInfo,\n                                                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>          allocator,\n                                                    Dispatch const &                                                   d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#      if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateExecutionGraphPipelinesAMDX && \"Function <vkCreateExecutionGraphPipelinesAMDX> requires <VK_AMDX_shader_enqueue>\" );\n#      endif\n\n    VULKAN_HPP_NAMESPACE::Pipeline pipeline;\n    VULKAN_HPP_NAMESPACE::Result   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateExecutionGraphPipelinesAMDX(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      1,\n      reinterpret_cast<const VkExecutionGraphPipelineCreateInfoAMDX *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( &pipeline ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createExecutionGraphPipelineAMDXUnique\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n\n    return ResultValue<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>( pipeline, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::getExecutionGraphPipelineScratchSizeAMDX( VULKAN_HPP_NAMESPACE::Pipeline                                executionGraph,\n                                                      VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineScratchSizeAMDX * pSizeInfo,\n                                                      Dispatch const &                                              d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetExecutionGraphPipelineScratchSizeAMDX( static_cast<VkDevice>( m_device ),\n                                                                              static_cast<VkPipeline>( executionGraph ),\n                                                                              reinterpret_cast<VkExecutionGraphPipelineScratchSizeAMDX *>( pSizeInfo ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineScratchSizeAMDX>::type\n                       Device::getExecutionGraphPipelineScratchSizeAMDX( VULKAN_HPP_NAMESPACE::Pipeline executionGraph, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetExecutionGraphPipelineScratchSizeAMDX &&\n                       \"Function <vkGetExecutionGraphPipelineScratchSizeAMDX> requires <VK_AMDX_shader_enqueue>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineScratchSizeAMDX sizeInfo;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetExecutionGraphPipelineScratchSizeAMDX(\n      m_device, static_cast<VkPipeline>( executionGraph ), reinterpret_cast<VkExecutionGraphPipelineScratchSizeAMDX *>( &sizeInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getExecutionGraphPipelineScratchSizeAMDX\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( sizeInfo ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::getExecutionGraphPipelineNodeIndexAMDX( VULKAN_HPP_NAMESPACE::Pipeline                                      executionGraph,\n                                                    const VULKAN_HPP_NAMESPACE::PipelineShaderStageNodeCreateInfoAMDX * pNodeInfo,\n                                                    uint32_t *                                                          pNodeIndex,\n                                                    Dispatch const &                                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetExecutionGraphPipelineNodeIndexAMDX( static_cast<VkDevice>( m_device ),\n                                                                            static_cast<VkPipeline>( executionGraph ),\n                                                                            reinterpret_cast<const VkPipelineShaderStageNodeCreateInfoAMDX *>( pNodeInfo ),\n                                                                            pNodeIndex ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<uint32_t>::type Device::getExecutionGraphPipelineNodeIndexAMDX(\n    VULKAN_HPP_NAMESPACE::Pipeline executionGraph, const VULKAN_HPP_NAMESPACE::PipelineShaderStageNodeCreateInfoAMDX & nodeInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetExecutionGraphPipelineNodeIndexAMDX && \"Function <vkGetExecutionGraphPipelineNodeIndexAMDX> requires <VK_AMDX_shader_enqueue>\" );\n#    endif\n\n    uint32_t                     nodeIndex;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetExecutionGraphPipelineNodeIndexAMDX(\n      m_device, static_cast<VkPipeline>( executionGraph ), reinterpret_cast<const VkPipelineShaderStageNodeCreateInfoAMDX *>( &nodeInfo ), &nodeIndex ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getExecutionGraphPipelineNodeIndexAMDX\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( nodeIndex ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::initializeGraphScratchMemoryAMDX( VULKAN_HPP_NAMESPACE::Pipeline      executionGraph,\n                                                                          VULKAN_HPP_NAMESPACE::DeviceAddress scratch,\n                                                                          VULKAN_HPP_NAMESPACE::DeviceSize    scratchSize,\n                                                                          Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdInitializeGraphScratchMemoryAMDX( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                             static_cast<VkPipeline>( executionGraph ),\n                                             static_cast<VkDeviceAddress>( scratch ),\n                                             static_cast<VkDeviceSize>( scratchSize ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::dispatchGraphAMDX( VULKAN_HPP_NAMESPACE::DeviceAddress                      scratch,\n                                                           VULKAN_HPP_NAMESPACE::DeviceSize                         scratchSize,\n                                                           const VULKAN_HPP_NAMESPACE::DispatchGraphCountInfoAMDX * pCountInfo,\n                                                           Dispatch const &                                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDispatchGraphAMDX( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                              static_cast<VkDeviceAddress>( scratch ),\n                              static_cast<VkDeviceSize>( scratchSize ),\n                              reinterpret_cast<const VkDispatchGraphCountInfoAMDX *>( pCountInfo ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::dispatchGraphAMDX( VULKAN_HPP_NAMESPACE::DeviceAddress                      scratch,\n                                                           VULKAN_HPP_NAMESPACE::DeviceSize                         scratchSize,\n                                                           const VULKAN_HPP_NAMESPACE::DispatchGraphCountInfoAMDX & countInfo,\n                                                           Dispatch const &                                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdDispatchGraphAMDX && \"Function <vkCmdDispatchGraphAMDX> requires <VK_AMDX_shader_enqueue>\" );\n#    endif\n\n    d.vkCmdDispatchGraphAMDX( m_commandBuffer,\n                              static_cast<VkDeviceAddress>( scratch ),\n                              static_cast<VkDeviceSize>( scratchSize ),\n                              reinterpret_cast<const VkDispatchGraphCountInfoAMDX *>( &countInfo ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::dispatchGraphIndirectAMDX( VULKAN_HPP_NAMESPACE::DeviceAddress                      scratch,\n                                                                   VULKAN_HPP_NAMESPACE::DeviceSize                         scratchSize,\n                                                                   const VULKAN_HPP_NAMESPACE::DispatchGraphCountInfoAMDX * pCountInfo,\n                                                                   Dispatch const &                                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDispatchGraphIndirectAMDX( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                      static_cast<VkDeviceAddress>( scratch ),\n                                      static_cast<VkDeviceSize>( scratchSize ),\n                                      reinterpret_cast<const VkDispatchGraphCountInfoAMDX *>( pCountInfo ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::dispatchGraphIndirectAMDX( VULKAN_HPP_NAMESPACE::DeviceAddress                      scratch,\n                                                                   VULKAN_HPP_NAMESPACE::DeviceSize                         scratchSize,\n                                                                   const VULKAN_HPP_NAMESPACE::DispatchGraphCountInfoAMDX & countInfo,\n                                                                   Dispatch const &                                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdDispatchGraphIndirectAMDX && \"Function <vkCmdDispatchGraphIndirectAMDX> requires <VK_AMDX_shader_enqueue>\" );\n#    endif\n\n    d.vkCmdDispatchGraphIndirectAMDX( m_commandBuffer,\n                                      static_cast<VkDeviceAddress>( scratch ),\n                                      static_cast<VkDeviceSize>( scratchSize ),\n                                      reinterpret_cast<const VkDispatchGraphCountInfoAMDX *>( &countInfo ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::dispatchGraphIndirectCountAMDX( VULKAN_HPP_NAMESPACE::DeviceAddress scratch,\n                                                                        VULKAN_HPP_NAMESPACE::DeviceSize    scratchSize,\n                                                                        VULKAN_HPP_NAMESPACE::DeviceAddress countInfo,\n                                                                        Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDispatchGraphIndirectCountAMDX( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                           static_cast<VkDeviceAddress>( scratch ),\n                                           static_cast<VkDeviceSize>( scratchSize ),\n                                           static_cast<VkDeviceAddress>( countInfo ) );\n  }\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  //=== VK_EXT_sample_locations ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setSampleLocationsEXT( const VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT * pSampleLocationsInfo,\n                                                               Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetSampleLocationsEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkSampleLocationsInfoEXT *>( pSampleLocationsInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setSampleLocationsEXT( const VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT & sampleLocationsInfo,\n                                                               Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetSampleLocationsEXT && \"Function <vkCmdSetSampleLocationsEXT> requires <VK_EXT_sample_locations>\" );\n#  endif\n\n    d.vkCmdSetSampleLocationsEXT( m_commandBuffer, reinterpret_cast<const VkSampleLocationsInfoEXT *>( &sampleLocationsInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void PhysicalDevice::getMultisamplePropertiesEXT( VULKAN_HPP_NAMESPACE::SampleCountFlagBits        samples,\n                                                                      VULKAN_HPP_NAMESPACE::MultisamplePropertiesEXT * pMultisampleProperties,\n                                                                      Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPhysicalDeviceMultisamplePropertiesEXT( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                   static_cast<VkSampleCountFlagBits>( samples ),\n                                                   reinterpret_cast<VkMultisamplePropertiesEXT *>( pMultisampleProperties ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MultisamplePropertiesEXT\n    PhysicalDevice::getMultisamplePropertiesEXT( VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceMultisamplePropertiesEXT &&\n                       \"Function <vkGetPhysicalDeviceMultisamplePropertiesEXT> requires <VK_EXT_sample_locations>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::MultisamplePropertiesEXT multisampleProperties;\n    d.vkGetPhysicalDeviceMultisamplePropertiesEXT(\n      m_physicalDevice, static_cast<VkSampleCountFlagBits>( samples ), reinterpret_cast<VkMultisamplePropertiesEXT *>( &multisampleProperties ) );\n\n    return multisampleProperties;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_get_memory_requirements2 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getImageMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 * pInfo,\n                                                                 VULKAN_HPP_NAMESPACE::MemoryRequirements2 *                pMemoryRequirements,\n                                                                 Dispatch const &                                           d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetImageMemoryRequirements2KHR( static_cast<VkDevice>( m_device ),\n                                        reinterpret_cast<const VkImageMemoryRequirementsInfo2 *>( pInfo ),\n                                        reinterpret_cast<VkMemoryRequirements2 *>( pMemoryRequirements ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2\n    Device::getImageMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetImageMemoryRequirements2KHR &&\n                       \"Function <vkGetImageMemoryRequirements2KHR> requires <VK_KHR_get_memory_requirements2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;\n    d.vkGetImageMemoryRequirements2KHR(\n      m_device, reinterpret_cast<const VkImageMemoryRequirementsInfo2 *>( &info ), reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n    return memoryRequirements;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n    Device::getImageMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetImageMemoryRequirements2KHR &&\n                       \"Function <vkGetImageMemoryRequirements2KHR> requires <VK_KHR_get_memory_requirements2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2 &      memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();\n    d.vkGetImageMemoryRequirements2KHR(\n      m_device, reinterpret_cast<const VkImageMemoryRequirementsInfo2 *>( &info ), reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getBufferMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 * pInfo,\n                                                                  VULKAN_HPP_NAMESPACE::MemoryRequirements2 *                 pMemoryRequirements,\n                                                                  Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetBufferMemoryRequirements2KHR( static_cast<VkDevice>( m_device ),\n                                         reinterpret_cast<const VkBufferMemoryRequirementsInfo2 *>( pInfo ),\n                                         reinterpret_cast<VkMemoryRequirements2 *>( pMemoryRequirements ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2\n    Device::getBufferMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetBufferMemoryRequirements2KHR &&\n                       \"Function <vkGetBufferMemoryRequirements2KHR> requires <VK_KHR_get_memory_requirements2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;\n    d.vkGetBufferMemoryRequirements2KHR(\n      m_device, reinterpret_cast<const VkBufferMemoryRequirementsInfo2 *>( &info ), reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n    return memoryRequirements;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n    Device::getBufferMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetBufferMemoryRequirements2KHR &&\n                       \"Function <vkGetBufferMemoryRequirements2KHR> requires <VK_KHR_get_memory_requirements2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2 &      memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();\n    d.vkGetBufferMemoryRequirements2KHR(\n      m_device, reinterpret_cast<const VkBufferMemoryRequirementsInfo2 *>( &info ), reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getImageSparseMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 * pInfo,\n                                                                       uint32_t *                                             pSparseMemoryRequirementCount,\n                                                                       VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2 * pSparseMemoryRequirements,\n                                                                       Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetImageSparseMemoryRequirements2KHR( static_cast<VkDevice>( m_device ),\n                                              reinterpret_cast<const VkImageSparseMemoryRequirementsInfo2 *>( pInfo ),\n                                              pSparseMemoryRequirementCount,\n                                              reinterpret_cast<VkSparseImageMemoryRequirements2 *>( pSparseMemoryRequirements ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename SparseImageMemoryRequirements2Allocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename SparseImageMemoryRequirements2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator>\n    Device::getImageSparseMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 & info, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetImageSparseMemoryRequirements2KHR &&\n                       \"Function <vkGetImageSparseMemoryRequirements2KHR> requires <VK_KHR_get_memory_requirements2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator> sparseMemoryRequirements;\n    uint32_t                                                                                                   sparseMemoryRequirementCount;\n    d.vkGetImageSparseMemoryRequirements2KHR(\n      m_device, reinterpret_cast<const VkImageSparseMemoryRequirementsInfo2 *>( &info ), &sparseMemoryRequirementCount, nullptr );\n    sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n    d.vkGetImageSparseMemoryRequirements2KHR( m_device,\n                                              reinterpret_cast<const VkImageSparseMemoryRequirementsInfo2 *>( &info ),\n                                              &sparseMemoryRequirementCount,\n                                              reinterpret_cast<VkSparseImageMemoryRequirements2 *>( sparseMemoryRequirements.data() ) );\n\n    VULKAN_HPP_ASSERT( sparseMemoryRequirementCount <= sparseMemoryRequirements.size() );\n    if ( sparseMemoryRequirementCount < sparseMemoryRequirements.size() )\n    {\n      sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n    }\n    return sparseMemoryRequirements;\n  }\n\n  template <typename SparseImageMemoryRequirements2Allocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename SparseImageMemoryRequirements2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator>\n                                         Device::getImageSparseMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 & info,\n                                                  SparseImageMemoryRequirements2Allocator &                        sparseImageMemoryRequirements2Allocator,\n                                                  Dispatch const &                                                 d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetImageSparseMemoryRequirements2KHR &&\n                       \"Function <vkGetImageSparseMemoryRequirements2KHR> requires <VK_KHR_get_memory_requirements2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator> sparseMemoryRequirements(\n      sparseImageMemoryRequirements2Allocator );\n    uint32_t sparseMemoryRequirementCount;\n    d.vkGetImageSparseMemoryRequirements2KHR(\n      m_device, reinterpret_cast<const VkImageSparseMemoryRequirementsInfo2 *>( &info ), &sparseMemoryRequirementCount, nullptr );\n    sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n    d.vkGetImageSparseMemoryRequirements2KHR( m_device,\n                                              reinterpret_cast<const VkImageSparseMemoryRequirementsInfo2 *>( &info ),\n                                              &sparseMemoryRequirementCount,\n                                              reinterpret_cast<VkSparseImageMemoryRequirements2 *>( sparseMemoryRequirements.data() ) );\n\n    VULKAN_HPP_ASSERT( sparseMemoryRequirementCount <= sparseMemoryRequirements.size() );\n    if ( sparseMemoryRequirementCount < sparseMemoryRequirements.size() )\n    {\n      sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n    }\n    return sparseMemoryRequirements;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_acceleration_structure ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::createAccelerationStructureKHR( const VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoKHR * pCreateInfo,\n                                            const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                pAllocator,\n                                            VULKAN_HPP_NAMESPACE::AccelerationStructureKHR *                 pAccelerationStructure,\n                                            Dispatch const &                                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateAccelerationStructureKHR( static_cast<VkDevice>( m_device ),\n                                                                    reinterpret_cast<const VkAccelerationStructureCreateInfoKHR *>( pCreateInfo ),\n                                                                    reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                                    reinterpret_cast<VkAccelerationStructureKHR *>( pAccelerationStructure ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::AccelerationStructureKHR>::type\n                       Device::createAccelerationStructureKHR( const VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoKHR & createInfo,\n                                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>        allocator,\n                                            Dispatch const &                                                 d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateAccelerationStructureKHR && \"Function <vkCreateAccelerationStructureKHR> requires <VK_KHR_acceleration_structure>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::AccelerationStructureKHR accelerationStructure;\n    VULKAN_HPP_NAMESPACE::Result                   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateAccelerationStructureKHR(\n      m_device,\n      reinterpret_cast<const VkAccelerationStructureCreateInfoKHR *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkAccelerationStructureKHR *>( &accelerationStructure ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createAccelerationStructureKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( accelerationStructure ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::AccelerationStructureKHR, Dispatch>>::type\n                       Device::createAccelerationStructureKHRUnique( const VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoKHR & createInfo,\n                                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>        allocator,\n                                                  Dispatch const &                                                 d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateAccelerationStructureKHR && \"Function <vkCreateAccelerationStructureKHR> requires <VK_KHR_acceleration_structure>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::AccelerationStructureKHR accelerationStructure;\n    VULKAN_HPP_NAMESPACE::Result                   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateAccelerationStructureKHR(\n      m_device,\n      reinterpret_cast<const VkAccelerationStructureCreateInfoKHR *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkAccelerationStructureKHR *>( &accelerationStructure ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createAccelerationStructureKHRUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result,\n                                                                UniqueHandle<VULKAN_HPP_NAMESPACE::AccelerationStructureKHR, Dispatch>(\n                                                                  accelerationStructure, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyAccelerationStructureKHR( VULKAN_HPP_NAMESPACE::AccelerationStructureKHR    accelerationStructure,\n                                                                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                  Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyAccelerationStructureKHR( static_cast<VkDevice>( m_device ),\n                                         static_cast<VkAccelerationStructureKHR>( accelerationStructure ),\n                                         reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyAccelerationStructureKHR( VULKAN_HPP_NAMESPACE::AccelerationStructureKHR            accelerationStructure,\n                                                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                                  Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyAccelerationStructureKHR && \"Function <vkDestroyAccelerationStructureKHR> requires <VK_KHR_acceleration_structure>\" );\n#  endif\n\n    d.vkDestroyAccelerationStructureKHR(\n      m_device,\n      static_cast<VkAccelerationStructureKHR>( accelerationStructure ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::AccelerationStructureKHR    accelerationStructure,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyAccelerationStructureKHR( static_cast<VkDevice>( m_device ),\n                                         static_cast<VkAccelerationStructureKHR>( accelerationStructure ),\n                                         reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::AccelerationStructureKHR            accelerationStructure,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyAccelerationStructureKHR && \"Function <vkDestroyAccelerationStructureKHR> requires <VK_KHR_acceleration_structure>\" );\n#  endif\n\n    d.vkDestroyAccelerationStructureKHR(\n      m_device,\n      static_cast<VkAccelerationStructureKHR>( accelerationStructure ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::buildAccelerationStructuresKHR( uint32_t                                                                     infoCount,\n                                                   const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR *      pInfos,\n                                                   const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR * const * ppBuildRangeInfos,\n                                                   Dispatch const &                                                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBuildAccelerationStructuresKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                           infoCount,\n                                           reinterpret_cast<const VkAccelerationStructureBuildGeometryInfoKHR *>( pInfos ),\n                                           reinterpret_cast<const VkAccelerationStructureBuildRangeInfoKHR * const *>( ppBuildRangeInfos ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::buildAccelerationStructuresKHR(\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR> const &      infos,\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR * const> const & pBuildRangeInfos,\n    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBuildAccelerationStructuresKHR && \"Function <vkCmdBuildAccelerationStructuresKHR> requires <VK_KHR_acceleration_structure>\" );\n#  endif\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n    VULKAN_HPP_ASSERT( infos.size() == pBuildRangeInfos.size() );\n#  else\n    if ( infos.size() != pBuildRangeInfos.size() )\n    {\n      throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::buildAccelerationStructuresKHR: infos.size() != pBuildRangeInfos.size()\" );\n    }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n    d.vkCmdBuildAccelerationStructuresKHR( m_commandBuffer,\n                                           infos.size(),\n                                           reinterpret_cast<const VkAccelerationStructureBuildGeometryInfoKHR *>( infos.data() ),\n                                           reinterpret_cast<const VkAccelerationStructureBuildRangeInfoKHR * const *>( pBuildRangeInfos.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::buildAccelerationStructuresIndirectKHR( uint32_t infoCount,\n                                                                                const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR * pInfos,\n                                                                                const VULKAN_HPP_NAMESPACE::DeviceAddress * pIndirectDeviceAddresses,\n                                                                                const uint32_t *                            pIndirectStrides,\n                                                                                const uint32_t * const *                    ppMaxPrimitiveCounts,\n                                                                                Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBuildAccelerationStructuresIndirectKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                   infoCount,\n                                                   reinterpret_cast<const VkAccelerationStructureBuildGeometryInfoKHR *>( pInfos ),\n                                                   reinterpret_cast<const VkDeviceAddress *>( pIndirectDeviceAddresses ),\n                                                   pIndirectStrides,\n                                                   ppMaxPrimitiveCounts );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::buildAccelerationStructuresIndirectKHR(\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR> const & infos,\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceAddress> const &                             indirectDeviceAddresses,\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const uint32_t> const &                                                        indirectStrides,\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const uint32_t * const> const &                                                pMaxPrimitiveCounts,\n    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBuildAccelerationStructuresIndirectKHR &&\n                       \"Function <vkCmdBuildAccelerationStructuresIndirectKHR> requires <VK_KHR_acceleration_structure>\" );\n#  endif\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n    VULKAN_HPP_ASSERT( infos.size() == indirectDeviceAddresses.size() );\n    VULKAN_HPP_ASSERT( infos.size() == indirectStrides.size() );\n    VULKAN_HPP_ASSERT( infos.size() == pMaxPrimitiveCounts.size() );\n#  else\n    if ( infos.size() != indirectDeviceAddresses.size() )\n    {\n      throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::buildAccelerationStructuresIndirectKHR: infos.size() != indirectDeviceAddresses.size()\" );\n    }\n    if ( infos.size() != indirectStrides.size() )\n    {\n      throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::buildAccelerationStructuresIndirectKHR: infos.size() != indirectStrides.size()\" );\n    }\n    if ( infos.size() != pMaxPrimitiveCounts.size() )\n    {\n      throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::buildAccelerationStructuresIndirectKHR: infos.size() != pMaxPrimitiveCounts.size()\" );\n    }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n    d.vkCmdBuildAccelerationStructuresIndirectKHR( m_commandBuffer,\n                                                   infos.size(),\n                                                   reinterpret_cast<const VkAccelerationStructureBuildGeometryInfoKHR *>( infos.data() ),\n                                                   reinterpret_cast<const VkDeviceAddress *>( indirectDeviceAddresses.data() ),\n                                                   indirectStrides.data(),\n                                                   pMaxPrimitiveCounts.data() );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::buildAccelerationStructuresKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                                   deferredOperation,\n                                            uint32_t                                                                     infoCount,\n                                            const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR *      pInfos,\n                                            const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR * const * ppBuildRangeInfos,\n                                            Dispatch const &                                                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkBuildAccelerationStructuresKHR( static_cast<VkDevice>( m_device ),\n                                          static_cast<VkDeferredOperationKHR>( deferredOperation ),\n                                          infoCount,\n                                          reinterpret_cast<const VkAccelerationStructureBuildGeometryInfoKHR *>( pInfos ),\n                                          reinterpret_cast<const VkAccelerationStructureBuildRangeInfoKHR * const *>( ppBuildRangeInfos ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result Device::buildAccelerationStructuresKHR(\n    VULKAN_HPP_NAMESPACE::DeferredOperationKHR                                                                           deferredOperation,\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR> const &      infos,\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR * const> const & pBuildRangeInfos,\n    Dispatch const &                                                                                                     d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkBuildAccelerationStructuresKHR && \"Function <vkBuildAccelerationStructuresKHR> requires <VK_KHR_acceleration_structure>\" );\n#  endif\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n    VULKAN_HPP_ASSERT( infos.size() == pBuildRangeInfos.size() );\n#  else\n    if ( infos.size() != pBuildRangeInfos.size() )\n    {\n      throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::Device::buildAccelerationStructuresKHR: infos.size() != pBuildRangeInfos.size()\" );\n    }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkBuildAccelerationStructuresKHR( m_device,\n                                          static_cast<VkDeferredOperationKHR>( deferredOperation ),\n                                          infos.size(),\n                                          reinterpret_cast<const VkAccelerationStructureBuildGeometryInfoKHR *>( infos.data() ),\n                                          reinterpret_cast<const VkAccelerationStructureBuildRangeInfoKHR * const *>( pBuildRangeInfos.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck(\n      result,\n      VULKAN_HPP_NAMESPACE_STRING \"::Device::buildAccelerationStructuresKHR\",\n      { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR, VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR } );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::copyAccelerationStructureKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR deferredOperation,\n                                                                                      const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR * pInfo,\n                                                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCopyAccelerationStructureKHR( static_cast<VkDevice>( m_device ),\n                                                                  static_cast<VkDeferredOperationKHR>( deferredOperation ),\n                                                                  reinterpret_cast<const VkCopyAccelerationStructureInfoKHR *>( pInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result\n                                         Device::copyAccelerationStructureKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                     deferredOperation,\n                                          const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR & info,\n                                          Dispatch const &                                               d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCopyAccelerationStructureKHR && \"Function <vkCopyAccelerationStructureKHR> requires <VK_KHR_acceleration_structure>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCopyAccelerationStructureKHR(\n      m_device, static_cast<VkDeferredOperationKHR>( deferredOperation ), reinterpret_cast<const VkCopyAccelerationStructureInfoKHR *>( &info ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck(\n      result,\n      VULKAN_HPP_NAMESPACE_STRING \"::Device::copyAccelerationStructureKHR\",\n      { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR, VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR } );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::copyAccelerationStructureToMemoryKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                             deferredOperation,\n                                                  const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureToMemoryInfoKHR * pInfo,\n                                                  Dispatch const &                                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCopyAccelerationStructureToMemoryKHR( static_cast<VkDevice>( m_device ),\n                                                                          static_cast<VkDeferredOperationKHR>( deferredOperation ),\n                                                                          reinterpret_cast<const VkCopyAccelerationStructureToMemoryInfoKHR *>( pInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result\n                                         Device::copyAccelerationStructureToMemoryKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                             deferredOperation,\n                                                  const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureToMemoryInfoKHR & info,\n                                                  Dispatch const &                                                       d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCopyAccelerationStructureToMemoryKHR &&\n                       \"Function <vkCopyAccelerationStructureToMemoryKHR> requires <VK_KHR_acceleration_structure>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCopyAccelerationStructureToMemoryKHR(\n      m_device, static_cast<VkDeferredOperationKHR>( deferredOperation ), reinterpret_cast<const VkCopyAccelerationStructureToMemoryInfoKHR *>( &info ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck(\n      result,\n      VULKAN_HPP_NAMESPACE_STRING \"::Device::copyAccelerationStructureToMemoryKHR\",\n      { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR, VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR } );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::copyMemoryToAccelerationStructureKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                             deferredOperation,\n                                                  const VULKAN_HPP_NAMESPACE::CopyMemoryToAccelerationStructureInfoKHR * pInfo,\n                                                  Dispatch const &                                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCopyMemoryToAccelerationStructureKHR( static_cast<VkDevice>( m_device ),\n                                                                          static_cast<VkDeferredOperationKHR>( deferredOperation ),\n                                                                          reinterpret_cast<const VkCopyMemoryToAccelerationStructureInfoKHR *>( pInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result\n                                         Device::copyMemoryToAccelerationStructureKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                             deferredOperation,\n                                                  const VULKAN_HPP_NAMESPACE::CopyMemoryToAccelerationStructureInfoKHR & info,\n                                                  Dispatch const &                                                       d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCopyMemoryToAccelerationStructureKHR &&\n                       \"Function <vkCopyMemoryToAccelerationStructureKHR> requires <VK_KHR_acceleration_structure>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCopyMemoryToAccelerationStructureKHR(\n      m_device, static_cast<VkDeferredOperationKHR>( deferredOperation ), reinterpret_cast<const VkCopyMemoryToAccelerationStructureInfoKHR *>( &info ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck(\n      result,\n      VULKAN_HPP_NAMESPACE_STRING \"::Device::copyMemoryToAccelerationStructureKHR\",\n      { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR, VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR } );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::writeAccelerationStructuresPropertiesKHR( uint32_t                                               accelerationStructureCount,\n                                                      const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR * pAccelerationStructures,\n                                                      VULKAN_HPP_NAMESPACE::QueryType                        queryType,\n                                                      size_t                                                 dataSize,\n                                                      void *                                                 pData,\n                                                      size_t                                                 stride,\n                                                      Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkWriteAccelerationStructuresPropertiesKHR( static_cast<VkDevice>( m_device ),\n                                                                              accelerationStructureCount,\n                                                                              reinterpret_cast<const VkAccelerationStructureKHR *>( pAccelerationStructures ),\n                                                                              static_cast<VkQueryType>( queryType ),\n                                                                              dataSize,\n                                                                              pData,\n                                                                              stride ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename DataType,\n            typename DataTypeAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename DataTypeAllocator::value_type, DataType>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<DataType, DataTypeAllocator>>::type\n                       Device::writeAccelerationStructuresPropertiesKHR(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR> const & accelerationStructures,\n      VULKAN_HPP_NAMESPACE::QueryType                                                                queryType,\n      size_t                                                                                         dataSize,\n      size_t                                                                                         stride,\n      Dispatch const &                                                                               d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkWriteAccelerationStructuresPropertiesKHR &&\n                       \"Function <vkWriteAccelerationStructuresPropertiesKHR> requires <VK_KHR_acceleration_structure>\" );\n#  endif\n\n    VULKAN_HPP_ASSERT( dataSize % sizeof( DataType ) == 0 );\n    std::vector<DataType, DataTypeAllocator> data( dataSize / sizeof( DataType ) );\n    VULKAN_HPP_NAMESPACE::Result             result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkWriteAccelerationStructuresPropertiesKHR( m_device,\n                                                    accelerationStructures.size(),\n                                                    reinterpret_cast<const VkAccelerationStructureKHR *>( accelerationStructures.data() ),\n                                                    static_cast<VkQueryType>( queryType ),\n                                                    data.size() * sizeof( DataType ),\n                                                    reinterpret_cast<void *>( data.data() ),\n                                                    stride ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::writeAccelerationStructuresPropertiesKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data ) );\n  }\n\n  template <typename DataType, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<DataType>::type Device::writeAccelerationStructuresPropertyKHR(\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR> const & accelerationStructures,\n    VULKAN_HPP_NAMESPACE::QueryType                                                                queryType,\n    size_t                                                                                         stride,\n    Dispatch const &                                                                               d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkWriteAccelerationStructuresPropertiesKHR &&\n                       \"Function <vkWriteAccelerationStructuresPropertiesKHR> requires <VK_KHR_acceleration_structure>\" );\n#  endif\n\n    DataType                     data;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkWriteAccelerationStructuresPropertiesKHR( m_device,\n                                                    accelerationStructures.size(),\n                                                    reinterpret_cast<const VkAccelerationStructureKHR *>( accelerationStructures.data() ),\n                                                    static_cast<VkQueryType>( queryType ),\n                                                    sizeof( DataType ),\n                                                    reinterpret_cast<void *>( &data ),\n                                                    stride ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::writeAccelerationStructuresPropertyKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyAccelerationStructureKHR( const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR * pInfo,\n                                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCopyAccelerationStructureKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                         reinterpret_cast<const VkCopyAccelerationStructureInfoKHR *>( pInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyAccelerationStructureKHR( const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR & info,\n                                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdCopyAccelerationStructureKHR && \"Function <vkCmdCopyAccelerationStructureKHR> requires <VK_KHR_acceleration_structure>\" );\n#  endif\n\n    d.vkCmdCopyAccelerationStructureKHR( m_commandBuffer, reinterpret_cast<const VkCopyAccelerationStructureInfoKHR *>( &info ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyAccelerationStructureToMemoryKHR( const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureToMemoryInfoKHR * pInfo,\n                                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCopyAccelerationStructureToMemoryKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                 reinterpret_cast<const VkCopyAccelerationStructureToMemoryInfoKHR *>( pInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyAccelerationStructureToMemoryKHR( const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureToMemoryInfoKHR & info,\n                                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdCopyAccelerationStructureToMemoryKHR &&\n                       \"Function <vkCmdCopyAccelerationStructureToMemoryKHR> requires <VK_KHR_acceleration_structure>\" );\n#  endif\n\n    d.vkCmdCopyAccelerationStructureToMemoryKHR( m_commandBuffer, reinterpret_cast<const VkCopyAccelerationStructureToMemoryInfoKHR *>( &info ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyMemoryToAccelerationStructureKHR( const VULKAN_HPP_NAMESPACE::CopyMemoryToAccelerationStructureInfoKHR * pInfo,\n                                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCopyMemoryToAccelerationStructureKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                 reinterpret_cast<const VkCopyMemoryToAccelerationStructureInfoKHR *>( pInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyMemoryToAccelerationStructureKHR( const VULKAN_HPP_NAMESPACE::CopyMemoryToAccelerationStructureInfoKHR & info,\n                                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdCopyMemoryToAccelerationStructureKHR &&\n                       \"Function <vkCmdCopyMemoryToAccelerationStructureKHR> requires <VK_KHR_acceleration_structure>\" );\n#  endif\n\n    d.vkCmdCopyMemoryToAccelerationStructureKHR( m_commandBuffer, reinterpret_cast<const VkCopyMemoryToAccelerationStructureInfoKHR *>( &info ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE DeviceAddress Device::getAccelerationStructureAddressKHR( const VULKAN_HPP_NAMESPACE::AccelerationStructureDeviceAddressInfoKHR * pInfo,\n                                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<DeviceAddress>( d.vkGetAccelerationStructureDeviceAddressKHR(\n      static_cast<VkDevice>( m_device ), reinterpret_cast<const VkAccelerationStructureDeviceAddressInfoKHR *>( pInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceAddress\n                    Device::getAccelerationStructureAddressKHR( const VULKAN_HPP_NAMESPACE::AccelerationStructureDeviceAddressInfoKHR & info,\n                                                Dispatch const &                                                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetAccelerationStructureDeviceAddressKHR &&\n                       \"Function <vkGetAccelerationStructureDeviceAddressKHR> requires <VK_KHR_acceleration_structure>\" );\n#  endif\n\n    VkDeviceAddress result =\n      d.vkGetAccelerationStructureDeviceAddressKHR( m_device, reinterpret_cast<const VkAccelerationStructureDeviceAddressInfoKHR *>( &info ) );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::DeviceAddress>( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::writeAccelerationStructuresPropertiesKHR( uint32_t                                               accelerationStructureCount,\n                                                             const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR * pAccelerationStructures,\n                                                             VULKAN_HPP_NAMESPACE::QueryType                        queryType,\n                                                             VULKAN_HPP_NAMESPACE::QueryPool                        queryPool,\n                                                             uint32_t                                               firstQuery,\n                                                             Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdWriteAccelerationStructuresPropertiesKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                     accelerationStructureCount,\n                                                     reinterpret_cast<const VkAccelerationStructureKHR *>( pAccelerationStructures ),\n                                                     static_cast<VkQueryType>( queryType ),\n                                                     static_cast<VkQueryPool>( queryPool ),\n                                                     firstQuery );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::writeAccelerationStructuresPropertiesKHR(\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR> const & accelerationStructures,\n    VULKAN_HPP_NAMESPACE::QueryType                                                                queryType,\n    VULKAN_HPP_NAMESPACE::QueryPool                                                                queryPool,\n    uint32_t                                                                                       firstQuery,\n    Dispatch const &                                                                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdWriteAccelerationStructuresPropertiesKHR &&\n                       \"Function <vkCmdWriteAccelerationStructuresPropertiesKHR> requires <VK_KHR_acceleration_structure>\" );\n#  endif\n\n    d.vkCmdWriteAccelerationStructuresPropertiesKHR( m_commandBuffer,\n                                                     accelerationStructures.size(),\n                                                     reinterpret_cast<const VkAccelerationStructureKHR *>( accelerationStructures.data() ),\n                                                     static_cast<VkQueryType>( queryType ),\n                                                     static_cast<VkQueryPool>( queryPool ),\n                                                     firstQuery );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getAccelerationStructureCompatibilityKHR( const VULKAN_HPP_NAMESPACE::AccelerationStructureVersionInfoKHR * pVersionInfo,\n                                                                           VULKAN_HPP_NAMESPACE::AccelerationStructureCompatibilityKHR *     pCompatibility,\n                                                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetDeviceAccelerationStructureCompatibilityKHR( static_cast<VkDevice>( m_device ),\n                                                        reinterpret_cast<const VkAccelerationStructureVersionInfoKHR *>( pVersionInfo ),\n                                                        reinterpret_cast<VkAccelerationStructureCompatibilityKHR *>( pCompatibility ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::AccelerationStructureCompatibilityKHR\n    Device::getAccelerationStructureCompatibilityKHR( const VULKAN_HPP_NAMESPACE::AccelerationStructureVersionInfoKHR & versionInfo,\n                                                      Dispatch const &                                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceAccelerationStructureCompatibilityKHR &&\n                       \"Function <vkGetDeviceAccelerationStructureCompatibilityKHR> requires <VK_KHR_acceleration_structure>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::AccelerationStructureCompatibilityKHR compatibility;\n    d.vkGetDeviceAccelerationStructureCompatibilityKHR( m_device,\n                                                        reinterpret_cast<const VkAccelerationStructureVersionInfoKHR *>( &versionInfo ),\n                                                        reinterpret_cast<VkAccelerationStructureCompatibilityKHR *>( &compatibility ) );\n\n    return compatibility;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getAccelerationStructureBuildSizesKHR( VULKAN_HPP_NAMESPACE::AccelerationStructureBuildTypeKHR                 buildType,\n                                                                        const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR * pBuildInfo,\n                                                                        const uint32_t *                                               pMaxPrimitiveCounts,\n                                                                        VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR * pSizeInfo,\n                                                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetAccelerationStructureBuildSizesKHR( static_cast<VkDevice>( m_device ),\n                                               static_cast<VkAccelerationStructureBuildTypeKHR>( buildType ),\n                                               reinterpret_cast<const VkAccelerationStructureBuildGeometryInfoKHR *>( pBuildInfo ),\n                                               pMaxPrimitiveCounts,\n                                               reinterpret_cast<VkAccelerationStructureBuildSizesInfoKHR *>( pSizeInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR\n                                         Device::getAccelerationStructureBuildSizesKHR( VULKAN_HPP_NAMESPACE::AccelerationStructureBuildTypeKHR                 buildType,\n                                                   const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR & buildInfo,\n                                                   VULKAN_HPP_NAMESPACE::ArrayProxy<const uint32_t> const &                maxPrimitiveCounts,\n                                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetAccelerationStructureBuildSizesKHR &&\n                       \"Function <vkGetAccelerationStructureBuildSizesKHR> requires <VK_KHR_acceleration_structure>\" );\n#  endif\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n    VULKAN_HPP_ASSERT( maxPrimitiveCounts.size() == buildInfo.geometryCount );\n#  else\n    if ( maxPrimitiveCounts.size() != buildInfo.geometryCount )\n    {\n      throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::Device::getAccelerationStructureBuildSizesKHR: maxPrimitiveCounts.size() != buildInfo.geometryCount\" );\n    }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n    VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR sizeInfo;\n    d.vkGetAccelerationStructureBuildSizesKHR( m_device,\n                                               static_cast<VkAccelerationStructureBuildTypeKHR>( buildType ),\n                                               reinterpret_cast<const VkAccelerationStructureBuildGeometryInfoKHR *>( &buildInfo ),\n                                               maxPrimitiveCounts.data(),\n                                               reinterpret_cast<VkAccelerationStructureBuildSizesInfoKHR *>( &sizeInfo ) );\n\n    return sizeInfo;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_ray_tracing_pipeline ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::traceRaysKHR( const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR * pRaygenShaderBindingTable,\n                                                      const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR * pMissShaderBindingTable,\n                                                      const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR * pHitShaderBindingTable,\n                                                      const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR * pCallableShaderBindingTable,\n                                                      uint32_t                                                    width,\n                                                      uint32_t                                                    height,\n                                                      uint32_t                                                    depth,\n                                                      Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdTraceRaysKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                         reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( pRaygenShaderBindingTable ),\n                         reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( pMissShaderBindingTable ),\n                         reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( pHitShaderBindingTable ),\n                         reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( pCallableShaderBindingTable ),\n                         width,\n                         height,\n                         depth );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::traceRaysKHR( const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & raygenShaderBindingTable,\n                                                      const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & missShaderBindingTable,\n                                                      const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & hitShaderBindingTable,\n                                                      const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & callableShaderBindingTable,\n                                                      uint32_t                                                    width,\n                                                      uint32_t                                                    height,\n                                                      uint32_t                                                    depth,\n                                                      Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdTraceRaysKHR && \"Function <vkCmdTraceRaysKHR> requires <VK_KHR_ray_tracing_pipeline>\" );\n#  endif\n\n    d.vkCmdTraceRaysKHR( m_commandBuffer,\n                         reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( &raygenShaderBindingTable ),\n                         reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( &missShaderBindingTable ),\n                         reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( &hitShaderBindingTable ),\n                         reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( &callableShaderBindingTable ),\n                         width,\n                         height,\n                         depth );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::createRayTracingPipelinesKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                    deferredOperation,\n                                          VULKAN_HPP_NAMESPACE::PipelineCache                           pipelineCache,\n                                          uint32_t                                                      createInfoCount,\n                                          const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR * pCreateInfos,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks *             pAllocator,\n                                          VULKAN_HPP_NAMESPACE::Pipeline *                              pPipelines,\n                                          Dispatch const &                                              d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateRayTracingPipelinesKHR( static_cast<VkDevice>( m_device ),\n                                                                  static_cast<VkDeferredOperationKHR>( deferredOperation ),\n                                                                  static_cast<VkPipelineCache>( pipelineCache ),\n                                                                  createInfoCount,\n                                                                  reinterpret_cast<const VkRayTracingPipelineCreateInfoKHR *>( pCreateInfos ),\n                                                                  reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                                  reinterpret_cast<VkPipeline *>( pPipelines ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename PipelineAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, VULKAN_HPP_NAMESPACE::Pipeline>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>\n                                         Device::createRayTracingPipelinesKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR deferredOperation,\n                                          VULKAN_HPP_NAMESPACE::PipelineCache        pipelineCache,\n                                          VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR> const & createInfos,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                             allocator,\n                                          Dispatch const &                                                                                      d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateRayTracingPipelinesKHR && \"Function <vkCreateRayTracingPipelinesKHR> requires <VK_KHR_ray_tracing_pipeline>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator> pipelines( createInfos.size() );\n    VULKAN_HPP_NAMESPACE::Result                                   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateRayTracingPipelinesKHR(\n      m_device,\n      static_cast<VkDeferredOperationKHR>( deferredOperation ),\n      static_cast<VkPipelineCache>( pipelineCache ),\n      createInfos.size(),\n      reinterpret_cast<const VkRayTracingPipelineCreateInfoKHR *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createRayTracingPipelinesKHR\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess,\n                                                 VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR,\n                                                 VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR,\n                                                 VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n\n    return ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>( result, std::move( pipelines ) );\n  }\n\n  template <typename PipelineAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, VULKAN_HPP_NAMESPACE::Pipeline>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>\n                                         Device::createRayTracingPipelinesKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR deferredOperation,\n                                          VULKAN_HPP_NAMESPACE::PipelineCache        pipelineCache,\n                                          VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR> const & createInfos,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                             allocator,\n                                          PipelineAllocator & pipelineAllocator,\n                                          Dispatch const &    d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateRayTracingPipelinesKHR && \"Function <vkCreateRayTracingPipelinesKHR> requires <VK_KHR_ray_tracing_pipeline>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator> pipelines( createInfos.size(), pipelineAllocator );\n    VULKAN_HPP_NAMESPACE::Result                                   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateRayTracingPipelinesKHR(\n      m_device,\n      static_cast<VkDeferredOperationKHR>( deferredOperation ),\n      static_cast<VkPipelineCache>( pipelineCache ),\n      createInfos.size(),\n      reinterpret_cast<const VkRayTracingPipelineCreateInfoKHR *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createRayTracingPipelinesKHR\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess,\n                                                 VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR,\n                                                 VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR,\n                                                 VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n\n    return ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>( result, std::move( pipelines ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<VULKAN_HPP_NAMESPACE::Pipeline>\n                                         Device::createRayTracingPipelineKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                    deferredOperation,\n                                         VULKAN_HPP_NAMESPACE::PipelineCache                           pipelineCache,\n                                         const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR & createInfo,\n                                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>     allocator,\n                                         Dispatch const &                                              d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateRayTracingPipelinesKHR && \"Function <vkCreateRayTracingPipelinesKHR> requires <VK_KHR_ray_tracing_pipeline>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Pipeline pipeline;\n    VULKAN_HPP_NAMESPACE::Result   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateRayTracingPipelinesKHR(\n      m_device,\n      static_cast<VkDeferredOperationKHR>( deferredOperation ),\n      static_cast<VkPipelineCache>( pipelineCache ),\n      1,\n      reinterpret_cast<const VkRayTracingPipelineCreateInfoKHR *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( &pipeline ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createRayTracingPipelineKHR\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess,\n                                                 VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR,\n                                                 VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR,\n                                                 VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n\n    return ResultValue<VULKAN_HPP_NAMESPACE::Pipeline>( result, std::move( pipeline ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <\n    typename Dispatch,\n    typename PipelineAllocator,\n    typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>\n                                         Device::createRayTracingPipelinesKHRUnique(\n      VULKAN_HPP_NAMESPACE::DeferredOperationKHR                                                            deferredOperation,\n      VULKAN_HPP_NAMESPACE::PipelineCache                                                                   pipelineCache,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR> const & createInfos,\n      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                             allocator,\n      Dispatch const &                                                                                      d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateRayTracingPipelinesKHR && \"Function <vkCreateRayTracingPipelinesKHR> requires <VK_KHR_ray_tracing_pipeline>\" );\n#    endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Pipeline> pipelines( createInfos.size() );\n    VULKAN_HPP_NAMESPACE::Result                result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateRayTracingPipelinesKHR(\n      m_device,\n      static_cast<VkDeferredOperationKHR>( deferredOperation ),\n      static_cast<VkPipelineCache>( pipelineCache ),\n      createInfos.size(),\n      reinterpret_cast<const VkRayTracingPipelineCreateInfoKHR *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createRayTracingPipelinesKHRUnique\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess,\n                                                 VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR,\n                                                 VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR,\n                                                 VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n    std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator> uniquePipelines;\n    uniquePipelines.reserve( createInfos.size() );\n    detail::ObjectDestroy<Device, Dispatch> deleter( *this, allocator, d );\n    for ( auto const & pipeline : pipelines )\n    {\n      uniquePipelines.push_back( UniqueHandle<Pipeline, Dispatch>( pipeline, deleter ) );\n    }\n    return ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>( result, std::move( uniquePipelines ) );\n  }\n\n  template <\n    typename Dispatch,\n    typename PipelineAllocator,\n    typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>\n                                         Device::createRayTracingPipelinesKHRUnique(\n      VULKAN_HPP_NAMESPACE::DeferredOperationKHR                                                            deferredOperation,\n      VULKAN_HPP_NAMESPACE::PipelineCache                                                                   pipelineCache,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR> const & createInfos,\n      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                             allocator,\n      PipelineAllocator &                                                                                   pipelineAllocator,\n      Dispatch const &                                                                                      d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateRayTracingPipelinesKHR && \"Function <vkCreateRayTracingPipelinesKHR> requires <VK_KHR_ray_tracing_pipeline>\" );\n#    endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Pipeline> pipelines( createInfos.size() );\n    VULKAN_HPP_NAMESPACE::Result                result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateRayTracingPipelinesKHR(\n      m_device,\n      static_cast<VkDeferredOperationKHR>( deferredOperation ),\n      static_cast<VkPipelineCache>( pipelineCache ),\n      createInfos.size(),\n      reinterpret_cast<const VkRayTracingPipelineCreateInfoKHR *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createRayTracingPipelinesKHRUnique\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess,\n                                                 VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR,\n                                                 VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR,\n                                                 VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n    std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator> uniquePipelines( pipelineAllocator );\n    uniquePipelines.reserve( createInfos.size() );\n    detail::ObjectDestroy<Device, Dispatch> deleter( *this, allocator, d );\n    for ( auto const & pipeline : pipelines )\n    {\n      uniquePipelines.push_back( UniqueHandle<Pipeline, Dispatch>( pipeline, deleter ) );\n    }\n    return ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>( result, std::move( uniquePipelines ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>\n                                         Device::createRayTracingPipelineKHRUnique( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                    deferredOperation,\n                                               VULKAN_HPP_NAMESPACE::PipelineCache                           pipelineCache,\n                                               const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR & createInfo,\n                                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>     allocator,\n                                               Dispatch const &                                              d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateRayTracingPipelinesKHR && \"Function <vkCreateRayTracingPipelinesKHR> requires <VK_KHR_ray_tracing_pipeline>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Pipeline pipeline;\n    VULKAN_HPP_NAMESPACE::Result   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateRayTracingPipelinesKHR(\n      m_device,\n      static_cast<VkDeferredOperationKHR>( deferredOperation ),\n      static_cast<VkPipelineCache>( pipelineCache ),\n      1,\n      reinterpret_cast<const VkRayTracingPipelineCreateInfoKHR *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( &pipeline ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createRayTracingPipelineKHRUnique\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess,\n                                                 VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR,\n                                                 VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR,\n                                                 VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n\n    return ResultValue<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>( pipeline, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getRayTracingShaderGroupHandlesKHR( VULKAN_HPP_NAMESPACE::Pipeline pipeline,\n                                                                                            uint32_t                       firstGroup,\n                                                                                            uint32_t                       groupCount,\n                                                                                            size_t                         dataSize,\n                                                                                            void *                         pData,\n                                                                                            Dispatch const &               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetRayTracingShaderGroupHandlesKHR(\n      static_cast<VkDevice>( m_device ), static_cast<VkPipeline>( pipeline ), firstGroup, groupCount, dataSize, pData ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename DataType,\n            typename DataTypeAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename DataTypeAllocator::value_type, DataType>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<DataType, DataTypeAllocator>>::type Device::getRayTracingShaderGroupHandlesKHR(\n    VULKAN_HPP_NAMESPACE::Pipeline pipeline, uint32_t firstGroup, uint32_t groupCount, size_t dataSize, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetRayTracingShaderGroupHandlesKHR &&\n                       \"Function <vkGetRayTracingShaderGroupHandlesKHR> requires <VK_KHR_ray_tracing_pipeline> or <VK_NV_ray_tracing>\" );\n#  endif\n\n    VULKAN_HPP_ASSERT( dataSize % sizeof( DataType ) == 0 );\n    std::vector<DataType, DataTypeAllocator> data( dataSize / sizeof( DataType ) );\n    VULKAN_HPP_NAMESPACE::Result             result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetRayTracingShaderGroupHandlesKHR(\n      m_device, static_cast<VkPipeline>( pipeline ), firstGroup, groupCount, data.size() * sizeof( DataType ), reinterpret_cast<void *>( data.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getRayTracingShaderGroupHandlesKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data ) );\n  }\n\n  template <typename DataType, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<DataType>::type\n    Device::getRayTracingShaderGroupHandleKHR( VULKAN_HPP_NAMESPACE::Pipeline pipeline, uint32_t firstGroup, uint32_t groupCount, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetRayTracingShaderGroupHandlesKHR &&\n                       \"Function <vkGetRayTracingShaderGroupHandlesKHR> requires <VK_KHR_ray_tracing_pipeline> or <VK_NV_ray_tracing>\" );\n#  endif\n\n    DataType                     data;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetRayTracingShaderGroupHandlesKHR(\n      m_device, static_cast<VkPipeline>( pipeline ), firstGroup, groupCount, sizeof( DataType ), reinterpret_cast<void *>( &data ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getRayTracingShaderGroupHandleKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getRayTracingCaptureReplayShaderGroupHandlesKHR( VULKAN_HPP_NAMESPACE::Pipeline pipeline,\n                                                                                                         uint32_t                       firstGroup,\n                                                                                                         uint32_t                       groupCount,\n                                                                                                         size_t                         dataSize,\n                                                                                                         void *                         pData,\n                                                                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(\n      static_cast<VkDevice>( m_device ), static_cast<VkPipeline>( pipeline ), firstGroup, groupCount, dataSize, pData ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename DataType,\n            typename DataTypeAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename DataTypeAllocator::value_type, DataType>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<DataType, DataTypeAllocator>>::type\n                       Device::getRayTracingCaptureReplayShaderGroupHandlesKHR(\n      VULKAN_HPP_NAMESPACE::Pipeline pipeline, uint32_t firstGroup, uint32_t groupCount, size_t dataSize, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetRayTracingCaptureReplayShaderGroupHandlesKHR &&\n                       \"Function <vkGetRayTracingCaptureReplayShaderGroupHandlesKHR> requires <VK_KHR_ray_tracing_pipeline>\" );\n#  endif\n\n    VULKAN_HPP_ASSERT( dataSize % sizeof( DataType ) == 0 );\n    std::vector<DataType, DataTypeAllocator> data( dataSize / sizeof( DataType ) );\n    VULKAN_HPP_NAMESPACE::Result             result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(\n      m_device, static_cast<VkPipeline>( pipeline ), firstGroup, groupCount, data.size() * sizeof( DataType ), reinterpret_cast<void *>( data.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getRayTracingCaptureReplayShaderGroupHandlesKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data ) );\n  }\n\n  template <typename DataType, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<DataType>::type Device::getRayTracingCaptureReplayShaderGroupHandleKHR(\n    VULKAN_HPP_NAMESPACE::Pipeline pipeline, uint32_t firstGroup, uint32_t groupCount, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetRayTracingCaptureReplayShaderGroupHandlesKHR &&\n                       \"Function <vkGetRayTracingCaptureReplayShaderGroupHandlesKHR> requires <VK_KHR_ray_tracing_pipeline>\" );\n#  endif\n\n    DataType                     data;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(\n      m_device, static_cast<VkPipeline>( pipeline ), firstGroup, groupCount, sizeof( DataType ), reinterpret_cast<void *>( &data ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getRayTracingCaptureReplayShaderGroupHandleKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::traceRaysIndirectKHR( const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR * pRaygenShaderBindingTable,\n                                                              const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR * pMissShaderBindingTable,\n                                                              const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR * pHitShaderBindingTable,\n                                                              const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR * pCallableShaderBindingTable,\n                                                              VULKAN_HPP_NAMESPACE::DeviceAddress                         indirectDeviceAddress,\n                                                              Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdTraceRaysIndirectKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                 reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( pRaygenShaderBindingTable ),\n                                 reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( pMissShaderBindingTable ),\n                                 reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( pHitShaderBindingTable ),\n                                 reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( pCallableShaderBindingTable ),\n                                 static_cast<VkDeviceAddress>( indirectDeviceAddress ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::traceRaysIndirectKHR( const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & raygenShaderBindingTable,\n                                                              const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & missShaderBindingTable,\n                                                              const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & hitShaderBindingTable,\n                                                              const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & callableShaderBindingTable,\n                                                              VULKAN_HPP_NAMESPACE::DeviceAddress                         indirectDeviceAddress,\n                                                              Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdTraceRaysIndirectKHR && \"Function <vkCmdTraceRaysIndirectKHR> requires <VK_KHR_ray_tracing_pipeline>\" );\n#  endif\n\n    d.vkCmdTraceRaysIndirectKHR( m_commandBuffer,\n                                 reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( &raygenShaderBindingTable ),\n                                 reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( &missShaderBindingTable ),\n                                 reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( &hitShaderBindingTable ),\n                                 reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( &callableShaderBindingTable ),\n                                 static_cast<VkDeviceAddress>( indirectDeviceAddress ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE DeviceSize Device::getRayTracingShaderGroupStackSizeKHR( VULKAN_HPP_NAMESPACE::Pipeline             pipeline,\n                                                                             uint32_t                                   group,\n                                                                             VULKAN_HPP_NAMESPACE::ShaderGroupShaderKHR groupShader,\n                                                                             Dispatch const &                           d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<DeviceSize>( d.vkGetRayTracingShaderGroupStackSizeKHR(\n      static_cast<VkDevice>( m_device ), static_cast<VkPipeline>( pipeline ), group, static_cast<VkShaderGroupShaderKHR>( groupShader ) ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setRayTracingPipelineStackSizeKHR( uint32_t pipelineStackSize, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetRayTracingPipelineStackSizeKHR( static_cast<VkCommandBuffer>( m_commandBuffer ), pipelineStackSize );\n  }\n\n  //=== VK_KHR_sampler_ycbcr_conversion ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::createSamplerYcbcrConversionKHR( const VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo * pCreateInfo,\n                                             const VULKAN_HPP_NAMESPACE::AllocationCallbacks *              pAllocator,\n                                             VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion *                 pYcbcrConversion,\n                                             Dispatch const &                                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateSamplerYcbcrConversionKHR( static_cast<VkDevice>( m_device ),\n                                                                     reinterpret_cast<const VkSamplerYcbcrConversionCreateInfo *>( pCreateInfo ),\n                                                                     reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                                     reinterpret_cast<VkSamplerYcbcrConversion *>( pYcbcrConversion ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion>::type\n                       Device::createSamplerYcbcrConversionKHR( const VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo & createInfo,\n                                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>      allocator,\n                                             Dispatch const &                                               d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateSamplerYcbcrConversionKHR &&\n                       \"Function <vkCreateSamplerYcbcrConversionKHR> requires <VK_KHR_sampler_ycbcr_conversion> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion ycbcrConversion;\n    VULKAN_HPP_NAMESPACE::Result                 result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateSamplerYcbcrConversionKHR(\n      m_device,\n      reinterpret_cast<const VkSamplerYcbcrConversionCreateInfo *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSamplerYcbcrConversion *>( &ycbcrConversion ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createSamplerYcbcrConversionKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( ycbcrConversion ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion, Dispatch>>::type\n                       Device::createSamplerYcbcrConversionKHRUnique( const VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo & createInfo,\n                                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>      allocator,\n                                                   Dispatch const &                                               d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateSamplerYcbcrConversionKHR &&\n                       \"Function <vkCreateSamplerYcbcrConversionKHR> requires <VK_KHR_sampler_ycbcr_conversion> or <VK_VERSION_1_1>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion ycbcrConversion;\n    VULKAN_HPP_NAMESPACE::Result                 result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateSamplerYcbcrConversionKHR(\n      m_device,\n      reinterpret_cast<const VkSamplerYcbcrConversionCreateInfo *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSamplerYcbcrConversion *>( &ycbcrConversion ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createSamplerYcbcrConversionKHRUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result,\n      UniqueHandle<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion, Dispatch>( ycbcrConversion, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroySamplerYcbcrConversionKHR( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion      ycbcrConversion,\n                                                                   const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                   Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroySamplerYcbcrConversionKHR( static_cast<VkDevice>( m_device ),\n                                          static_cast<VkSamplerYcbcrConversion>( ycbcrConversion ),\n                                          reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroySamplerYcbcrConversionKHR( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion              ycbcrConversion,\n                                                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                                   Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroySamplerYcbcrConversionKHR &&\n                       \"Function <vkDestroySamplerYcbcrConversionKHR> requires <VK_KHR_sampler_ycbcr_conversion> or <VK_VERSION_1_1>\" );\n#  endif\n\n    d.vkDestroySamplerYcbcrConversionKHR(\n      m_device,\n      static_cast<VkSamplerYcbcrConversion>( ycbcrConversion ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_bind_memory2 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::bindBufferMemory2KHR( uint32_t                                           bindInfoCount,\n                                                                              const VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo * pBindInfos,\n                                                                              Dispatch const &                                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkBindBufferMemory2KHR( static_cast<VkDevice>( m_device ), bindInfoCount, reinterpret_cast<const VkBindBufferMemoryInfo *>( pBindInfos ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::bindBufferMemory2KHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo> const & bindInfos,\n                                  Dispatch const &                                                                           d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkBindBufferMemory2KHR && \"Function <vkBindBufferMemory2KHR> requires <VK_KHR_bind_memory2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkBindBufferMemory2KHR( m_device, bindInfos.size(), reinterpret_cast<const VkBindBufferMemoryInfo *>( bindInfos.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::bindBufferMemory2KHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::bindImageMemory2KHR( uint32_t                                          bindInfoCount,\n                                                                             const VULKAN_HPP_NAMESPACE::BindImageMemoryInfo * pBindInfos,\n                                                                             Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkBindImageMemory2KHR( static_cast<VkDevice>( m_device ), bindInfoCount, reinterpret_cast<const VkBindImageMemoryInfo *>( pBindInfos ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::bindImageMemory2KHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindImageMemoryInfo> const & bindInfos, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkBindImageMemory2KHR && \"Function <vkBindImageMemory2KHR> requires <VK_KHR_bind_memory2> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkBindImageMemory2KHR( m_device, bindInfos.size(), reinterpret_cast<const VkBindImageMemoryInfo *>( bindInfos.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::bindImageMemory2KHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_image_drm_format_modifier ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getImageDrmFormatModifierPropertiesEXT(\n    VULKAN_HPP_NAMESPACE::Image image, VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierPropertiesEXT * pProperties, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetImageDrmFormatModifierPropertiesEXT(\n      static_cast<VkDevice>( m_device ), static_cast<VkImage>( image ), reinterpret_cast<VkImageDrmFormatModifierPropertiesEXT *>( pProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierPropertiesEXT>::type\n                       Device::getImageDrmFormatModifierPropertiesEXT( VULKAN_HPP_NAMESPACE::Image image, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetImageDrmFormatModifierPropertiesEXT &&\n                       \"Function <vkGetImageDrmFormatModifierPropertiesEXT> requires <VK_EXT_image_drm_format_modifier>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierPropertiesEXT properties;\n    VULKAN_HPP_NAMESPACE::Result                              result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetImageDrmFormatModifierPropertiesEXT(\n      m_device, static_cast<VkImage>( image ), reinterpret_cast<VkImageDrmFormatModifierPropertiesEXT *>( &properties ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getImageDrmFormatModifierPropertiesEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_validation_cache ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createValidationCacheEXT( const VULKAN_HPP_NAMESPACE::ValidationCacheCreateInfoEXT * pCreateInfo,\n                                                                                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks *          pAllocator,\n                                                                                  VULKAN_HPP_NAMESPACE::ValidationCacheEXT *                 pValidationCache,\n                                                                                  Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateValidationCacheEXT( static_cast<VkDevice>( m_device ),\n                                                              reinterpret_cast<const VkValidationCacheCreateInfoEXT *>( pCreateInfo ),\n                                                              reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                              reinterpret_cast<VkValidationCacheEXT *>( pValidationCache ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::ValidationCacheEXT>::type\n                       Device::createValidationCacheEXT( const VULKAN_HPP_NAMESPACE::ValidationCacheCreateInfoEXT & createInfo,\n                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>  allocator,\n                                      Dispatch const &                                           d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateValidationCacheEXT && \"Function <vkCreateValidationCacheEXT> requires <VK_EXT_validation_cache>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::ValidationCacheEXT validationCache;\n    VULKAN_HPP_NAMESPACE::Result             result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateValidationCacheEXT(\n      m_device,\n      reinterpret_cast<const VkValidationCacheCreateInfoEXT *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkValidationCacheEXT *>( &validationCache ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createValidationCacheEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( validationCache ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::ValidationCacheEXT, Dispatch>>::type\n                       Device::createValidationCacheEXTUnique( const VULKAN_HPP_NAMESPACE::ValidationCacheCreateInfoEXT & createInfo,\n                                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>  allocator,\n                                            Dispatch const &                                           d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateValidationCacheEXT && \"Function <vkCreateValidationCacheEXT> requires <VK_EXT_validation_cache>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::ValidationCacheEXT validationCache;\n    VULKAN_HPP_NAMESPACE::Result             result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateValidationCacheEXT(\n      m_device,\n      reinterpret_cast<const VkValidationCacheCreateInfoEXT *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkValidationCacheEXT *>( &validationCache ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createValidationCacheEXTUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result,\n      UniqueHandle<VULKAN_HPP_NAMESPACE::ValidationCacheEXT, Dispatch>( validationCache, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyValidationCacheEXT( VULKAN_HPP_NAMESPACE::ValidationCacheEXT          validationCache,\n                                                            const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                            Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyValidationCacheEXT(\n      static_cast<VkDevice>( m_device ), static_cast<VkValidationCacheEXT>( validationCache ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyValidationCacheEXT( VULKAN_HPP_NAMESPACE::ValidationCacheEXT                  validationCache,\n                                                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                            Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyValidationCacheEXT && \"Function <vkDestroyValidationCacheEXT> requires <VK_EXT_validation_cache>\" );\n#  endif\n\n    d.vkDestroyValidationCacheEXT(\n      m_device,\n      static_cast<VkValidationCacheEXT>( validationCache ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::ValidationCacheEXT          validationCache,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyValidationCacheEXT(\n      static_cast<VkDevice>( m_device ), static_cast<VkValidationCacheEXT>( validationCache ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::ValidationCacheEXT                  validationCache,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyValidationCacheEXT && \"Function <vkDestroyValidationCacheEXT> requires <VK_EXT_validation_cache>\" );\n#  endif\n\n    d.vkDestroyValidationCacheEXT(\n      m_device,\n      static_cast<VkValidationCacheEXT>( validationCache ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::mergeValidationCachesEXT( VULKAN_HPP_NAMESPACE::ValidationCacheEXT         dstCache,\n                                                                                  uint32_t                                         srcCacheCount,\n                                                                                  const VULKAN_HPP_NAMESPACE::ValidationCacheEXT * pSrcCaches,\n                                                                                  Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkMergeValidationCachesEXT( static_cast<VkDevice>( m_device ),\n                                                              static_cast<VkValidationCacheEXT>( dstCache ),\n                                                              srcCacheCount,\n                                                              reinterpret_cast<const VkValidationCacheEXT *>( pSrcCaches ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n                                          Device::mergeValidationCachesEXT( VULKAN_HPP_NAMESPACE::ValidationCacheEXT                                                 dstCache,\n                                      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ValidationCacheEXT> const & srcCaches,\n                                      Dispatch const &                                                                         d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkMergeValidationCachesEXT && \"Function <vkMergeValidationCachesEXT> requires <VK_EXT_validation_cache>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkMergeValidationCachesEXT(\n      m_device, static_cast<VkValidationCacheEXT>( dstCache ), srcCaches.size(), reinterpret_cast<const VkValidationCacheEXT *>( srcCaches.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::mergeValidationCachesEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getValidationCacheDataEXT( VULKAN_HPP_NAMESPACE::ValidationCacheEXT validationCache,\n                                                                                   size_t *                                 pDataSize,\n                                                                                   void *                                   pData,\n                                                                                   Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkGetValidationCacheDataEXT( static_cast<VkDevice>( m_device ), static_cast<VkValidationCacheEXT>( validationCache ), pDataSize, pData ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Uint8_tAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<uint8_t, Uint8_tAllocator>>::type\n                       Device::getValidationCacheDataEXT( VULKAN_HPP_NAMESPACE::ValidationCacheEXT validationCache, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetValidationCacheDataEXT && \"Function <vkGetValidationCacheDataEXT> requires <VK_EXT_validation_cache>\" );\n#  endif\n\n    std::vector<uint8_t, Uint8_tAllocator> data;\n    size_t                                 dataSize;\n    VULKAN_HPP_NAMESPACE::Result           result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetValidationCacheDataEXT( m_device, static_cast<VkValidationCacheEXT>( validationCache ), &dataSize, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && dataSize )\n      {\n        data.resize( dataSize );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetValidationCacheDataEXT( m_device, static_cast<VkValidationCacheEXT>( validationCache ), &dataSize, reinterpret_cast<void *>( data.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getValidationCacheDataEXT\" );\n    VULKAN_HPP_ASSERT( dataSize <= data.size() );\n    if ( dataSize < data.size() )\n    {\n      data.resize( dataSize );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data ) );\n  }\n\n  template <typename Uint8_tAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<uint8_t, Uint8_tAllocator>>::type\n    Device::getValidationCacheDataEXT( VULKAN_HPP_NAMESPACE::ValidationCacheEXT validationCache, Uint8_tAllocator & uint8_tAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetValidationCacheDataEXT && \"Function <vkGetValidationCacheDataEXT> requires <VK_EXT_validation_cache>\" );\n#  endif\n\n    std::vector<uint8_t, Uint8_tAllocator> data( uint8_tAllocator );\n    size_t                                 dataSize;\n    VULKAN_HPP_NAMESPACE::Result           result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetValidationCacheDataEXT( m_device, static_cast<VkValidationCacheEXT>( validationCache ), &dataSize, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && dataSize )\n      {\n        data.resize( dataSize );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetValidationCacheDataEXT( m_device, static_cast<VkValidationCacheEXT>( validationCache ), &dataSize, reinterpret_cast<void *>( data.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getValidationCacheDataEXT\" );\n    VULKAN_HPP_ASSERT( dataSize <= data.size() );\n    if ( dataSize < data.size() )\n    {\n      data.resize( dataSize );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_NV_shading_rate_image ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindShadingRateImageNV( VULKAN_HPP_NAMESPACE::ImageView   imageView,\n                                                                VULKAN_HPP_NAMESPACE::ImageLayout imageLayout,\n                                                                Dispatch const &                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBindShadingRateImageNV(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkImageView>( imageView ), static_cast<VkImageLayout>( imageLayout ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setViewportShadingRatePaletteNV( uint32_t                                           firstViewport,\n                                                                         uint32_t                                           viewportCount,\n                                                                         const VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV * pShadingRatePalettes,\n                                                                         Dispatch const &                                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetViewportShadingRatePaletteNV(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), firstViewport, viewportCount, reinterpret_cast<const VkShadingRatePaletteNV *>( pShadingRatePalettes ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setViewportShadingRatePaletteNV(\n    uint32_t                                                                                   firstViewport,\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV> const & shadingRatePalettes,\n    Dispatch const &                                                                           d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetViewportShadingRatePaletteNV && \"Function <vkCmdSetViewportShadingRatePaletteNV> requires <VK_NV_shading_rate_image>\" );\n#  endif\n\n    d.vkCmdSetViewportShadingRatePaletteNV(\n      m_commandBuffer, firstViewport, shadingRatePalettes.size(), reinterpret_cast<const VkShadingRatePaletteNV *>( shadingRatePalettes.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setCoarseSampleOrderNV( VULKAN_HPP_NAMESPACE::CoarseSampleOrderTypeNV           sampleOrderType,\n                                                                uint32_t                                                customSampleOrderCount,\n                                                                const VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV * pCustomSampleOrders,\n                                                                Dispatch const &                                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetCoarseSampleOrderNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                   static_cast<VkCoarseSampleOrderTypeNV>( sampleOrderType ),\n                                   customSampleOrderCount,\n                                   reinterpret_cast<const VkCoarseSampleOrderCustomNV *>( pCustomSampleOrders ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::setCoarseSampleOrderNV( VULKAN_HPP_NAMESPACE::CoarseSampleOrderTypeNV                                                   sampleOrderType,\n                                           VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV> const & customSampleOrders,\n                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetCoarseSampleOrderNV && \"Function <vkCmdSetCoarseSampleOrderNV> requires <VK_NV_shading_rate_image>\" );\n#  endif\n\n    d.vkCmdSetCoarseSampleOrderNV( m_commandBuffer,\n                                   static_cast<VkCoarseSampleOrderTypeNV>( sampleOrderType ),\n                                   customSampleOrders.size(),\n                                   reinterpret_cast<const VkCoarseSampleOrderCustomNV *>( customSampleOrders.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_NV_ray_tracing ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::createAccelerationStructureNV( const VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoNV * pCreateInfo,\n                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks *               pAllocator,\n                                           VULKAN_HPP_NAMESPACE::AccelerationStructureNV *                 pAccelerationStructure,\n                                           Dispatch const &                                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateAccelerationStructureNV( static_cast<VkDevice>( m_device ),\n                                                                   reinterpret_cast<const VkAccelerationStructureCreateInfoNV *>( pCreateInfo ),\n                                                                   reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                                   reinterpret_cast<VkAccelerationStructureNV *>( pAccelerationStructure ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::AccelerationStructureNV>::type\n                       Device::createAccelerationStructureNV( const VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoNV & createInfo,\n                                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>       allocator,\n                                           Dispatch const &                                                d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateAccelerationStructureNV && \"Function <vkCreateAccelerationStructureNV> requires <VK_NV_ray_tracing>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::AccelerationStructureNV accelerationStructure;\n    VULKAN_HPP_NAMESPACE::Result                  result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateAccelerationStructureNV(\n      m_device,\n      reinterpret_cast<const VkAccelerationStructureCreateInfoNV *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkAccelerationStructureNV *>( &accelerationStructure ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createAccelerationStructureNV\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( accelerationStructure ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::AccelerationStructureNV, Dispatch>>::type\n                       Device::createAccelerationStructureNVUnique( const VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoNV & createInfo,\n                                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>       allocator,\n                                                 Dispatch const &                                                d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateAccelerationStructureNV && \"Function <vkCreateAccelerationStructureNV> requires <VK_NV_ray_tracing>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::AccelerationStructureNV accelerationStructure;\n    VULKAN_HPP_NAMESPACE::Result                  result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateAccelerationStructureNV(\n      m_device,\n      reinterpret_cast<const VkAccelerationStructureCreateInfoNV *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkAccelerationStructureNV *>( &accelerationStructure ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createAccelerationStructureNVUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result,\n                                                                UniqueHandle<VULKAN_HPP_NAMESPACE::AccelerationStructureNV, Dispatch>(\n                                                                  accelerationStructure, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyAccelerationStructureNV( VULKAN_HPP_NAMESPACE::AccelerationStructureNV     accelerationStructure,\n                                                                 const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                 Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyAccelerationStructureNV( static_cast<VkDevice>( m_device ),\n                                        static_cast<VkAccelerationStructureNV>( accelerationStructure ),\n                                        reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyAccelerationStructureNV( VULKAN_HPP_NAMESPACE::AccelerationStructureNV             accelerationStructure,\n                                                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                                 Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyAccelerationStructureNV && \"Function <vkDestroyAccelerationStructureNV> requires <VK_NV_ray_tracing>\" );\n#  endif\n\n    d.vkDestroyAccelerationStructureNV(\n      m_device,\n      static_cast<VkAccelerationStructureNV>( accelerationStructure ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::AccelerationStructureNV     accelerationStructure,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyAccelerationStructureNV( static_cast<VkDevice>( m_device ),\n                                        static_cast<VkAccelerationStructureNV>( accelerationStructure ),\n                                        reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::AccelerationStructureNV             accelerationStructure,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyAccelerationStructureNV && \"Function <vkDestroyAccelerationStructureNV> requires <VK_NV_ray_tracing>\" );\n#  endif\n\n    d.vkDestroyAccelerationStructureNV(\n      m_device,\n      static_cast<VkAccelerationStructureNV>( accelerationStructure ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    Device::getAccelerationStructureMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsInfoNV * pInfo,\n                                                          VULKAN_HPP_NAMESPACE::MemoryRequirements2KHR *                              pMemoryRequirements,\n                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetAccelerationStructureMemoryRequirementsNV( static_cast<VkDevice>( m_device ),\n                                                      reinterpret_cast<const VkAccelerationStructureMemoryRequirementsInfoNV *>( pInfo ),\n                                                      reinterpret_cast<VkMemoryRequirements2KHR *>( pMemoryRequirements ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2KHR\n    Device::getAccelerationStructureMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsInfoNV & info,\n                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetAccelerationStructureMemoryRequirementsNV &&\n                       \"Function <vkGetAccelerationStructureMemoryRequirementsNV> requires <VK_NV_ray_tracing>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2KHR memoryRequirements;\n    d.vkGetAccelerationStructureMemoryRequirementsNV( m_device,\n                                                      reinterpret_cast<const VkAccelerationStructureMemoryRequirementsInfoNV *>( &info ),\n                                                      reinterpret_cast<VkMemoryRequirements2KHR *>( &memoryRequirements ) );\n\n    return memoryRequirements;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n    Device::getAccelerationStructureMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsInfoNV & info,\n                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetAccelerationStructureMemoryRequirementsNV &&\n                       \"Function <vkGetAccelerationStructureMemoryRequirementsNV> requires <VK_NV_ray_tracing>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2KHR &   memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2KHR>();\n    d.vkGetAccelerationStructureMemoryRequirementsNV( m_device,\n                                                      reinterpret_cast<const VkAccelerationStructureMemoryRequirementsInfoNV *>( &info ),\n                                                      reinterpret_cast<VkMemoryRequirements2KHR *>( &memoryRequirements ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::bindAccelerationStructureMemoryNV(\n    uint32_t bindInfoCount, const VULKAN_HPP_NAMESPACE::BindAccelerationStructureMemoryInfoNV * pBindInfos, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkBindAccelerationStructureMemoryNV(\n      static_cast<VkDevice>( m_device ), bindInfoCount, reinterpret_cast<const VkBindAccelerationStructureMemoryInfoNV *>( pBindInfos ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type Device::bindAccelerationStructureMemoryNV(\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindAccelerationStructureMemoryInfoNV> const & bindInfos, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkBindAccelerationStructureMemoryNV && \"Function <vkBindAccelerationStructureMemoryNV> requires <VK_NV_ray_tracing>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkBindAccelerationStructureMemoryNV(\n      m_device, bindInfos.size(), reinterpret_cast<const VkBindAccelerationStructureMemoryInfoNV *>( bindInfos.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::bindAccelerationStructureMemoryNV\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::buildAccelerationStructureNV( const VULKAN_HPP_NAMESPACE::AccelerationStructureInfoNV * pInfo,\n                                                                      VULKAN_HPP_NAMESPACE::Buffer                              instanceData,\n                                                                      VULKAN_HPP_NAMESPACE::DeviceSize                          instanceOffset,\n                                                                      VULKAN_HPP_NAMESPACE::Bool32                              update,\n                                                                      VULKAN_HPP_NAMESPACE::AccelerationStructureNV             dst,\n                                                                      VULKAN_HPP_NAMESPACE::AccelerationStructureNV             src,\n                                                                      VULKAN_HPP_NAMESPACE::Buffer                              scratch,\n                                                                      VULKAN_HPP_NAMESPACE::DeviceSize                          scratchOffset,\n                                                                      Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBuildAccelerationStructureNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                         reinterpret_cast<const VkAccelerationStructureInfoNV *>( pInfo ),\n                                         static_cast<VkBuffer>( instanceData ),\n                                         static_cast<VkDeviceSize>( instanceOffset ),\n                                         static_cast<VkBool32>( update ),\n                                         static_cast<VkAccelerationStructureNV>( dst ),\n                                         static_cast<VkAccelerationStructureNV>( src ),\n                                         static_cast<VkBuffer>( scratch ),\n                                         static_cast<VkDeviceSize>( scratchOffset ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::buildAccelerationStructureNV( const VULKAN_HPP_NAMESPACE::AccelerationStructureInfoNV & info,\n                                                                      VULKAN_HPP_NAMESPACE::Buffer                              instanceData,\n                                                                      VULKAN_HPP_NAMESPACE::DeviceSize                          instanceOffset,\n                                                                      VULKAN_HPP_NAMESPACE::Bool32                              update,\n                                                                      VULKAN_HPP_NAMESPACE::AccelerationStructureNV             dst,\n                                                                      VULKAN_HPP_NAMESPACE::AccelerationStructureNV             src,\n                                                                      VULKAN_HPP_NAMESPACE::Buffer                              scratch,\n                                                                      VULKAN_HPP_NAMESPACE::DeviceSize                          scratchOffset,\n                                                                      Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBuildAccelerationStructureNV && \"Function <vkCmdBuildAccelerationStructureNV> requires <VK_NV_ray_tracing>\" );\n#  endif\n\n    d.vkCmdBuildAccelerationStructureNV( m_commandBuffer,\n                                         reinterpret_cast<const VkAccelerationStructureInfoNV *>( &info ),\n                                         static_cast<VkBuffer>( instanceData ),\n                                         static_cast<VkDeviceSize>( instanceOffset ),\n                                         static_cast<VkBool32>( update ),\n                                         static_cast<VkAccelerationStructureNV>( dst ),\n                                         static_cast<VkAccelerationStructureNV>( src ),\n                                         static_cast<VkBuffer>( scratch ),\n                                         static_cast<VkDeviceSize>( scratchOffset ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyAccelerationStructureNV( VULKAN_HPP_NAMESPACE::AccelerationStructureNV          dst,\n                                                                     VULKAN_HPP_NAMESPACE::AccelerationStructureNV          src,\n                                                                     VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR mode,\n                                                                     Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCopyAccelerationStructureNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                        static_cast<VkAccelerationStructureNV>( dst ),\n                                        static_cast<VkAccelerationStructureNV>( src ),\n                                        static_cast<VkCopyAccelerationStructureModeKHR>( mode ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::traceRaysNV( VULKAN_HPP_NAMESPACE::Buffer     raygenShaderBindingTableBuffer,\n                                                     VULKAN_HPP_NAMESPACE::DeviceSize raygenShaderBindingOffset,\n                                                     VULKAN_HPP_NAMESPACE::Buffer     missShaderBindingTableBuffer,\n                                                     VULKAN_HPP_NAMESPACE::DeviceSize missShaderBindingOffset,\n                                                     VULKAN_HPP_NAMESPACE::DeviceSize missShaderBindingStride,\n                                                     VULKAN_HPP_NAMESPACE::Buffer     hitShaderBindingTableBuffer,\n                                                     VULKAN_HPP_NAMESPACE::DeviceSize hitShaderBindingOffset,\n                                                     VULKAN_HPP_NAMESPACE::DeviceSize hitShaderBindingStride,\n                                                     VULKAN_HPP_NAMESPACE::Buffer     callableShaderBindingTableBuffer,\n                                                     VULKAN_HPP_NAMESPACE::DeviceSize callableShaderBindingOffset,\n                                                     VULKAN_HPP_NAMESPACE::DeviceSize callableShaderBindingStride,\n                                                     uint32_t                         width,\n                                                     uint32_t                         height,\n                                                     uint32_t                         depth,\n                                                     Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdTraceRaysNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                        static_cast<VkBuffer>( raygenShaderBindingTableBuffer ),\n                        static_cast<VkDeviceSize>( raygenShaderBindingOffset ),\n                        static_cast<VkBuffer>( missShaderBindingTableBuffer ),\n                        static_cast<VkDeviceSize>( missShaderBindingOffset ),\n                        static_cast<VkDeviceSize>( missShaderBindingStride ),\n                        static_cast<VkBuffer>( hitShaderBindingTableBuffer ),\n                        static_cast<VkDeviceSize>( hitShaderBindingOffset ),\n                        static_cast<VkDeviceSize>( hitShaderBindingStride ),\n                        static_cast<VkBuffer>( callableShaderBindingTableBuffer ),\n                        static_cast<VkDeviceSize>( callableShaderBindingOffset ),\n                        static_cast<VkDeviceSize>( callableShaderBindingStride ),\n                        width,\n                        height,\n                        depth );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createRayTracingPipelinesNV( VULKAN_HPP_NAMESPACE::PipelineCache pipelineCache,\n                                                                                     uint32_t                            createInfoCount,\n                                                                                     const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV * pCreateInfos,\n                                                                                     const VULKAN_HPP_NAMESPACE::AllocationCallbacks *            pAllocator,\n                                                                                     VULKAN_HPP_NAMESPACE::Pipeline *                             pPipelines,\n                                                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateRayTracingPipelinesNV( static_cast<VkDevice>( m_device ),\n                                                                 static_cast<VkPipelineCache>( pipelineCache ),\n                                                                 createInfoCount,\n                                                                 reinterpret_cast<const VkRayTracingPipelineCreateInfoNV *>( pCreateInfos ),\n                                                                 reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                                 reinterpret_cast<VkPipeline *>( pPipelines ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename PipelineAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, VULKAN_HPP_NAMESPACE::Pipeline>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>\n                                         Device::createRayTracingPipelinesNV( VULKAN_HPP_NAMESPACE::PipelineCache                                                                  pipelineCache,\n                                         VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV> const & createInfos,\n                                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                            allocator,\n                                         Dispatch const &                                                                                     d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateRayTracingPipelinesNV && \"Function <vkCreateRayTracingPipelinesNV> requires <VK_NV_ray_tracing>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator> pipelines( createInfos.size() );\n    VULKAN_HPP_NAMESPACE::Result                                   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateRayTracingPipelinesNV(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      createInfos.size(),\n      reinterpret_cast<const VkRayTracingPipelineCreateInfoNV *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createRayTracingPipelinesNV\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n\n    return ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>( result, std::move( pipelines ) );\n  }\n\n  template <typename PipelineAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, VULKAN_HPP_NAMESPACE::Pipeline>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>\n                                         Device::createRayTracingPipelinesNV( VULKAN_HPP_NAMESPACE::PipelineCache                                                                  pipelineCache,\n                                         VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV> const & createInfos,\n                                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                            allocator,\n                                         PipelineAllocator &                                                                                  pipelineAllocator,\n                                         Dispatch const &                                                                                     d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateRayTracingPipelinesNV && \"Function <vkCreateRayTracingPipelinesNV> requires <VK_NV_ray_tracing>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator> pipelines( createInfos.size(), pipelineAllocator );\n    VULKAN_HPP_NAMESPACE::Result                                   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateRayTracingPipelinesNV(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      createInfos.size(),\n      reinterpret_cast<const VkRayTracingPipelineCreateInfoNV *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createRayTracingPipelinesNV\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n\n    return ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>( result, std::move( pipelines ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<VULKAN_HPP_NAMESPACE::Pipeline>\n                                         Device::createRayTracingPipelineNV( VULKAN_HPP_NAMESPACE::PipelineCache                          pipelineCache,\n                                        const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV & createInfo,\n                                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>    allocator,\n                                        Dispatch const &                                             d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateRayTracingPipelinesNV && \"Function <vkCreateRayTracingPipelinesNV> requires <VK_NV_ray_tracing>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Pipeline pipeline;\n    VULKAN_HPP_NAMESPACE::Result   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateRayTracingPipelinesNV(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      1,\n      reinterpret_cast<const VkRayTracingPipelineCreateInfoNV *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( &pipeline ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createRayTracingPipelineNV\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n\n    return ResultValue<VULKAN_HPP_NAMESPACE::Pipeline>( result, std::move( pipeline ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <\n    typename Dispatch,\n    typename PipelineAllocator,\n    typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>\n                                         Device::createRayTracingPipelinesNVUnique( VULKAN_HPP_NAMESPACE::PipelineCache pipelineCache,\n                                               VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV> const & createInfos,\n                                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                            allocator,\n                                               Dispatch const &                                                                                     d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateRayTracingPipelinesNV && \"Function <vkCreateRayTracingPipelinesNV> requires <VK_NV_ray_tracing>\" );\n#    endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Pipeline> pipelines( createInfos.size() );\n    VULKAN_HPP_NAMESPACE::Result                result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateRayTracingPipelinesNV(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      createInfos.size(),\n      reinterpret_cast<const VkRayTracingPipelineCreateInfoNV *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createRayTracingPipelinesNVUnique\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n    std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator> uniquePipelines;\n    uniquePipelines.reserve( createInfos.size() );\n    detail::ObjectDestroy<Device, Dispatch> deleter( *this, allocator, d );\n    for ( auto const & pipeline : pipelines )\n    {\n      uniquePipelines.push_back( UniqueHandle<Pipeline, Dispatch>( pipeline, deleter ) );\n    }\n    return ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>( result, std::move( uniquePipelines ) );\n  }\n\n  template <\n    typename Dispatch,\n    typename PipelineAllocator,\n    typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>\n                                         Device::createRayTracingPipelinesNVUnique( VULKAN_HPP_NAMESPACE::PipelineCache pipelineCache,\n                                               VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV> const & createInfos,\n                                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                            allocator,\n                                               PipelineAllocator & pipelineAllocator,\n                                               Dispatch const &    d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateRayTracingPipelinesNV && \"Function <vkCreateRayTracingPipelinesNV> requires <VK_NV_ray_tracing>\" );\n#    endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::Pipeline> pipelines( createInfos.size() );\n    VULKAN_HPP_NAMESPACE::Result                result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateRayTracingPipelinesNV(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      createInfos.size(),\n      reinterpret_cast<const VkRayTracingPipelineCreateInfoNV *>( createInfos.data() ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createRayTracingPipelinesNVUnique\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n    std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator> uniquePipelines( pipelineAllocator );\n    uniquePipelines.reserve( createInfos.size() );\n    detail::ObjectDestroy<Device, Dispatch> deleter( *this, allocator, d );\n    for ( auto const & pipeline : pipelines )\n    {\n      uniquePipelines.push_back( UniqueHandle<Pipeline, Dispatch>( pipeline, deleter ) );\n    }\n    return ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>( result, std::move( uniquePipelines ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>\n                                         Device::createRayTracingPipelineNVUnique( VULKAN_HPP_NAMESPACE::PipelineCache                          pipelineCache,\n                                              const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV & createInfo,\n                                              Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>    allocator,\n                                              Dispatch const &                                             d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateRayTracingPipelinesNV && \"Function <vkCreateRayTracingPipelinesNV> requires <VK_NV_ray_tracing>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Pipeline pipeline;\n    VULKAN_HPP_NAMESPACE::Result   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateRayTracingPipelinesNV(\n      m_device,\n      static_cast<VkPipelineCache>( pipelineCache ),\n      1,\n      reinterpret_cast<const VkRayTracingPipelineCreateInfoNV *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPipeline *>( &pipeline ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createRayTracingPipelineNVUnique\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT } );\n\n    return ResultValue<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>( pipeline, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getRayTracingShaderGroupHandlesNV( VULKAN_HPP_NAMESPACE::Pipeline pipeline,\n                                                                                           uint32_t                       firstGroup,\n                                                                                           uint32_t                       groupCount,\n                                                                                           size_t                         dataSize,\n                                                                                           void *                         pData,\n                                                                                           Dispatch const &               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetRayTracingShaderGroupHandlesNV(\n      static_cast<VkDevice>( m_device ), static_cast<VkPipeline>( pipeline ), firstGroup, groupCount, dataSize, pData ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename DataType,\n            typename DataTypeAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename DataTypeAllocator::value_type, DataType>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<DataType, DataTypeAllocator>>::type Device::getRayTracingShaderGroupHandlesNV(\n    VULKAN_HPP_NAMESPACE::Pipeline pipeline, uint32_t firstGroup, uint32_t groupCount, size_t dataSize, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetRayTracingShaderGroupHandlesNV &&\n                       \"Function <vkGetRayTracingShaderGroupHandlesNV> requires <VK_KHR_ray_tracing_pipeline> or <VK_NV_ray_tracing>\" );\n#  endif\n\n    VULKAN_HPP_ASSERT( dataSize % sizeof( DataType ) == 0 );\n    std::vector<DataType, DataTypeAllocator> data( dataSize / sizeof( DataType ) );\n    VULKAN_HPP_NAMESPACE::Result             result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetRayTracingShaderGroupHandlesNV(\n      m_device, static_cast<VkPipeline>( pipeline ), firstGroup, groupCount, data.size() * sizeof( DataType ), reinterpret_cast<void *>( data.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getRayTracingShaderGroupHandlesNV\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data ) );\n  }\n\n  template <typename DataType, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<DataType>::type\n    Device::getRayTracingShaderGroupHandleNV( VULKAN_HPP_NAMESPACE::Pipeline pipeline, uint32_t firstGroup, uint32_t groupCount, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetRayTracingShaderGroupHandlesNV &&\n                       \"Function <vkGetRayTracingShaderGroupHandlesNV> requires <VK_KHR_ray_tracing_pipeline> or <VK_NV_ray_tracing>\" );\n#  endif\n\n    DataType                     data;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetRayTracingShaderGroupHandlesNV(\n      m_device, static_cast<VkPipeline>( pipeline ), firstGroup, groupCount, sizeof( DataType ), reinterpret_cast<void *>( &data ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getRayTracingShaderGroupHandleNV\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getAccelerationStructureHandleNV( VULKAN_HPP_NAMESPACE::AccelerationStructureNV accelerationStructure,\n                                                                                          size_t                                        dataSize,\n                                                                                          void *                                        pData,\n                                                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetAccelerationStructureHandleNV(\n      static_cast<VkDevice>( m_device ), static_cast<VkAccelerationStructureNV>( accelerationStructure ), dataSize, pData ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename DataType,\n            typename DataTypeAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename DataTypeAllocator::value_type, DataType>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<DataType, DataTypeAllocator>>::type\n    Device::getAccelerationStructureHandleNV( VULKAN_HPP_NAMESPACE::AccelerationStructureNV accelerationStructure, size_t dataSize, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetAccelerationStructureHandleNV && \"Function <vkGetAccelerationStructureHandleNV> requires <VK_NV_ray_tracing>\" );\n#  endif\n\n    VULKAN_HPP_ASSERT( dataSize % sizeof( DataType ) == 0 );\n    std::vector<DataType, DataTypeAllocator> data( dataSize / sizeof( DataType ) );\n    VULKAN_HPP_NAMESPACE::Result             result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetAccelerationStructureHandleNV(\n      m_device, static_cast<VkAccelerationStructureNV>( accelerationStructure ), data.size() * sizeof( DataType ), reinterpret_cast<void *>( data.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getAccelerationStructureHandleNV\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data ) );\n  }\n\n  template <typename DataType, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<DataType>::type\n                       Device::getAccelerationStructureHandleNV( VULKAN_HPP_NAMESPACE::AccelerationStructureNV accelerationStructure, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetAccelerationStructureHandleNV && \"Function <vkGetAccelerationStructureHandleNV> requires <VK_NV_ray_tracing>\" );\n#  endif\n\n    DataType                     data;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetAccelerationStructureHandleNV(\n      m_device, static_cast<VkAccelerationStructureNV>( accelerationStructure ), sizeof( DataType ), reinterpret_cast<void *>( &data ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getAccelerationStructureHandleNV\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::writeAccelerationStructuresPropertiesNV( uint32_t accelerationStructureCount,\n                                                                                 const VULKAN_HPP_NAMESPACE::AccelerationStructureNV * pAccelerationStructures,\n                                                                                 VULKAN_HPP_NAMESPACE::QueryType                       queryType,\n                                                                                 VULKAN_HPP_NAMESPACE::QueryPool                       queryPool,\n                                                                                 uint32_t                                              firstQuery,\n                                                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdWriteAccelerationStructuresPropertiesNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                    accelerationStructureCount,\n                                                    reinterpret_cast<const VkAccelerationStructureNV *>( pAccelerationStructures ),\n                                                    static_cast<VkQueryType>( queryType ),\n                                                    static_cast<VkQueryPool>( queryPool ),\n                                                    firstQuery );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::writeAccelerationStructuresPropertiesNV(\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureNV> const & accelerationStructures,\n    VULKAN_HPP_NAMESPACE::QueryType                                                               queryType,\n    VULKAN_HPP_NAMESPACE::QueryPool                                                               queryPool,\n    uint32_t                                                                                      firstQuery,\n    Dispatch const &                                                                              d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdWriteAccelerationStructuresPropertiesNV &&\n                       \"Function <vkCmdWriteAccelerationStructuresPropertiesNV> requires <VK_NV_ray_tracing>\" );\n#  endif\n\n    d.vkCmdWriteAccelerationStructuresPropertiesNV( m_commandBuffer,\n                                                    accelerationStructures.size(),\n                                                    reinterpret_cast<const VkAccelerationStructureNV *>( accelerationStructures.data() ),\n                                                    static_cast<VkQueryType>( queryType ),\n                                                    static_cast<VkQueryPool>( queryPool ),\n                                                    firstQuery );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::compileDeferredNV( VULKAN_HPP_NAMESPACE::Pipeline pipeline,\n                                                                           uint32_t                       shader,\n                                                                           Dispatch const &               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCompileDeferredNV( static_cast<VkDevice>( m_device ), static_cast<VkPipeline>( pipeline ), shader ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n                                          Device::compileDeferredNV( VULKAN_HPP_NAMESPACE::Pipeline pipeline, uint32_t shader, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCompileDeferredNV && \"Function <vkCompileDeferredNV> requires <VK_NV_ray_tracing>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCompileDeferredNV( m_device, static_cast<VkPipeline>( pipeline ), shader ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::compileDeferredNV\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n  //=== VK_KHR_maintenance3 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getDescriptorSetLayoutSupportKHR( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo * pCreateInfo,\n                                                                   VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport *          pSupport,\n                                                                   Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetDescriptorSetLayoutSupportKHR( static_cast<VkDevice>( m_device ),\n                                          reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>( pCreateInfo ),\n                                          reinterpret_cast<VkDescriptorSetLayoutSupport *>( pSupport ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport\n                                         Device::getDescriptorSetLayoutSupportKHR( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo & createInfo,\n                                              Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDescriptorSetLayoutSupportKHR &&\n                       \"Function <vkGetDescriptorSetLayoutSupportKHR> requires <VK_KHR_maintenance3> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport support;\n    d.vkGetDescriptorSetLayoutSupportKHR(\n      m_device, reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>( &createInfo ), reinterpret_cast<VkDescriptorSetLayoutSupport *>( &support ) );\n\n    return support;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                                         Device::getDescriptorSetLayoutSupportKHR( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo & createInfo,\n                                              Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDescriptorSetLayoutSupportKHR &&\n                       \"Function <vkGetDescriptorSetLayoutSupportKHR> requires <VK_KHR_maintenance3> or <VK_VERSION_1_1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>   structureChain;\n    VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport & support = structureChain.template get<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport>();\n    d.vkGetDescriptorSetLayoutSupportKHR(\n      m_device, reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>( &createInfo ), reinterpret_cast<VkDescriptorSetLayoutSupport *>( &support ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_draw_indirect_count ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::drawIndirectCountKHR( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                              VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                              VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                                              VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                                              uint32_t                         maxDrawCount,\n                                                              uint32_t                         stride,\n                                                              Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDrawIndirectCountKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                 static_cast<VkBuffer>( buffer ),\n                                 static_cast<VkDeviceSize>( offset ),\n                                 static_cast<VkBuffer>( countBuffer ),\n                                 static_cast<VkDeviceSize>( countBufferOffset ),\n                                 maxDrawCount,\n                                 stride );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::drawIndexedIndirectCountKHR( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                                     VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                                     VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                                                     VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                                                     uint32_t                         maxDrawCount,\n                                                                     uint32_t                         stride,\n                                                                     Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDrawIndexedIndirectCountKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                        static_cast<VkBuffer>( buffer ),\n                                        static_cast<VkDeviceSize>( offset ),\n                                        static_cast<VkBuffer>( countBuffer ),\n                                        static_cast<VkDeviceSize>( countBufferOffset ),\n                                        maxDrawCount,\n                                        stride );\n  }\n\n  //=== VK_EXT_external_memory_host ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::getMemoryHostPointerPropertiesEXT( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType,\n                                               const void *                                           pHostPointer,\n                                               VULKAN_HPP_NAMESPACE::MemoryHostPointerPropertiesEXT * pMemoryHostPointerProperties,\n                                               Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetMemoryHostPointerPropertiesEXT( static_cast<VkDevice>( m_device ),\n                                                                       static_cast<VkExternalMemoryHandleTypeFlagBits>( handleType ),\n                                                                       pHostPointer,\n                                                                       reinterpret_cast<VkMemoryHostPointerPropertiesEXT *>( pMemoryHostPointerProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::MemoryHostPointerPropertiesEXT>::type\n                       Device::getMemoryHostPointerPropertiesEXT( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType,\n                                               const void *                                           pHostPointer,\n                                               Dispatch const &                                       d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetMemoryHostPointerPropertiesEXT && \"Function <vkGetMemoryHostPointerPropertiesEXT> requires <VK_EXT_external_memory_host>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::MemoryHostPointerPropertiesEXT memoryHostPointerProperties;\n    VULKAN_HPP_NAMESPACE::Result                         result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetMemoryHostPointerPropertiesEXT( m_device,\n                                             static_cast<VkExternalMemoryHandleTypeFlagBits>( handleType ),\n                                             pHostPointer,\n                                             reinterpret_cast<VkMemoryHostPointerPropertiesEXT *>( &memoryHostPointerProperties ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getMemoryHostPointerPropertiesEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( memoryHostPointerProperties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_AMD_buffer_marker ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::writeBufferMarkerAMD( VULKAN_HPP_NAMESPACE::PipelineStageFlagBits pipelineStage,\n                                                              VULKAN_HPP_NAMESPACE::Buffer                dstBuffer,\n                                                              VULKAN_HPP_NAMESPACE::DeviceSize            dstOffset,\n                                                              uint32_t                                    marker,\n                                                              Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdWriteBufferMarkerAMD( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                 static_cast<VkPipelineStageFlagBits>( pipelineStage ),\n                                 static_cast<VkBuffer>( dstBuffer ),\n                                 static_cast<VkDeviceSize>( dstOffset ),\n                                 marker );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::writeBufferMarker2AMD( VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stage,\n                                                               VULKAN_HPP_NAMESPACE::Buffer              dstBuffer,\n                                                               VULKAN_HPP_NAMESPACE::DeviceSize          dstOffset,\n                                                               uint32_t                                  marker,\n                                                               Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdWriteBufferMarker2AMD( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                  static_cast<VkPipelineStageFlags2>( stage ),\n                                  static_cast<VkBuffer>( dstBuffer ),\n                                  static_cast<VkDeviceSize>( dstOffset ),\n                                  marker );\n  }\n\n  //=== VK_EXT_calibrated_timestamps ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getCalibrateableTimeDomainsEXT( uint32_t *                            pTimeDomainCount,\n                                                                                                VULKAN_HPP_NAMESPACE::TimeDomainKHR * pTimeDomains,\n                                                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ), pTimeDomainCount, reinterpret_cast<VkTimeDomainKHR *>( pTimeDomains ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename TimeDomainKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename TimeDomainKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::TimeDomainKHR>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::TimeDomainKHR, TimeDomainKHRAllocator>>::type\n                       PhysicalDevice::getCalibrateableTimeDomainsEXT( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceCalibrateableTimeDomainsEXT &&\n                       \"Function <vkGetPhysicalDeviceCalibrateableTimeDomainsEXT> requires <VK_EXT_calibrated_timestamps> or <VK_KHR_calibrated_timestamps>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::TimeDomainKHR, TimeDomainKHRAllocator> timeDomains;\n    uint32_t                                                                 timeDomainCount;\n    VULKAN_HPP_NAMESPACE::Result                                             result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceCalibrateableTimeDomainsEXT( m_physicalDevice, &timeDomainCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && timeDomainCount )\n      {\n        timeDomains.resize( timeDomainCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceCalibrateableTimeDomainsEXT( m_physicalDevice, &timeDomainCount, reinterpret_cast<VkTimeDomainKHR *>( timeDomains.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getCalibrateableTimeDomainsEXT\" );\n    VULKAN_HPP_ASSERT( timeDomainCount <= timeDomains.size() );\n    if ( timeDomainCount < timeDomains.size() )\n    {\n      timeDomains.resize( timeDomainCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( timeDomains ) );\n  }\n\n  template <typename TimeDomainKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename TimeDomainKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::TimeDomainKHR>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::TimeDomainKHR, TimeDomainKHRAllocator>>::type\n                       PhysicalDevice::getCalibrateableTimeDomainsEXT( TimeDomainKHRAllocator & timeDomainKHRAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceCalibrateableTimeDomainsEXT &&\n                       \"Function <vkGetPhysicalDeviceCalibrateableTimeDomainsEXT> requires <VK_EXT_calibrated_timestamps> or <VK_KHR_calibrated_timestamps>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::TimeDomainKHR, TimeDomainKHRAllocator> timeDomains( timeDomainKHRAllocator );\n    uint32_t                                                                 timeDomainCount;\n    VULKAN_HPP_NAMESPACE::Result                                             result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceCalibrateableTimeDomainsEXT( m_physicalDevice, &timeDomainCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && timeDomainCount )\n      {\n        timeDomains.resize( timeDomainCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceCalibrateableTimeDomainsEXT( m_physicalDevice, &timeDomainCount, reinterpret_cast<VkTimeDomainKHR *>( timeDomains.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getCalibrateableTimeDomainsEXT\" );\n    VULKAN_HPP_ASSERT( timeDomainCount <= timeDomains.size() );\n    if ( timeDomainCount < timeDomains.size() )\n    {\n      timeDomains.resize( timeDomainCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( timeDomains ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getCalibratedTimestampsEXT( uint32_t                                                 timestampCount,\n                                                                                    const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR * pTimestampInfos,\n                                                                                    uint64_t *                                               pTimestamps,\n                                                                                    uint64_t *                                               pMaxDeviation,\n                                                                                    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetCalibratedTimestampsEXT( static_cast<VkDevice>( m_device ),\n                                                                timestampCount,\n                                                                reinterpret_cast<const VkCalibratedTimestampInfoKHR *>( pTimestampInfos ),\n                                                                pTimestamps,\n                                                                pMaxDeviation ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Uint64_tAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename Uint64_tAllocator::value_type, uint64_t>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::pair<std::vector<uint64_t, Uint64_tAllocator>, uint64_t>>::type\n    Device::getCalibratedTimestampsEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR> const & timestampInfos,\n                                        Dispatch const &                                                                                 d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetCalibratedTimestampsEXT &&\n                       \"Function <vkGetCalibratedTimestampsEXT> requires <VK_EXT_calibrated_timestamps> or <VK_KHR_calibrated_timestamps>\" );\n#  endif\n\n    std::pair<std::vector<uint64_t, Uint64_tAllocator>, uint64_t> data_(\n      std::piecewise_construct, std::forward_as_tuple( timestampInfos.size() ), std::forward_as_tuple( 0 ) );\n    std::vector<uint64_t, Uint64_tAllocator> & timestamps   = data_.first;\n    uint64_t &                                 maxDeviation = data_.second;\n    VULKAN_HPP_NAMESPACE::Result               result       = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetCalibratedTimestampsEXT(\n      m_device, timestampInfos.size(), reinterpret_cast<const VkCalibratedTimestampInfoKHR *>( timestampInfos.data() ), timestamps.data(), &maxDeviation ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getCalibratedTimestampsEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data_ ) );\n  }\n\n  template <typename Uint64_tAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename Uint64_tAllocator::value_type, uint64_t>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::pair<std::vector<uint64_t, Uint64_tAllocator>, uint64_t>>::type\n    Device::getCalibratedTimestampsEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR> const & timestampInfos,\n                                        Uint64_tAllocator &                                                                              uint64_tAllocator,\n                                        Dispatch const &                                                                                 d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetCalibratedTimestampsEXT &&\n                       \"Function <vkGetCalibratedTimestampsEXT> requires <VK_EXT_calibrated_timestamps> or <VK_KHR_calibrated_timestamps>\" );\n#  endif\n\n    std::pair<std::vector<uint64_t, Uint64_tAllocator>, uint64_t> data_(\n      std::piecewise_construct, std::forward_as_tuple( timestampInfos.size(), uint64_tAllocator ), std::forward_as_tuple( 0 ) );\n    std::vector<uint64_t, Uint64_tAllocator> & timestamps   = data_.first;\n    uint64_t &                                 maxDeviation = data_.second;\n    VULKAN_HPP_NAMESPACE::Result               result       = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetCalibratedTimestampsEXT(\n      m_device, timestampInfos.size(), reinterpret_cast<const VkCalibratedTimestampInfoKHR *>( timestampInfos.data() ), timestamps.data(), &maxDeviation ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getCalibratedTimestampsEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data_ ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::pair<uint64_t, uint64_t>>::type\n                       Device::getCalibratedTimestampEXT( const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR & timestampInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetCalibratedTimestampsEXT &&\n                       \"Function <vkGetCalibratedTimestampsEXT> requires <VK_EXT_calibrated_timestamps> or <VK_KHR_calibrated_timestamps>\" );\n#  endif\n\n    std::pair<uint64_t, uint64_t> data_;\n    uint64_t &                    timestamp    = data_.first;\n    uint64_t &                    maxDeviation = data_.second;\n    VULKAN_HPP_NAMESPACE::Result  result       = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetCalibratedTimestampsEXT( m_device, 1, reinterpret_cast<const VkCalibratedTimestampInfoKHR *>( &timestampInfo ), &timestamp, &maxDeviation ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getCalibratedTimestampEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data_ ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_NV_mesh_shader ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::drawMeshTasksNV( uint32_t taskCount, uint32_t firstTask, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDrawMeshTasksNV( static_cast<VkCommandBuffer>( m_commandBuffer ), taskCount, firstTask );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::drawMeshTasksIndirectNV( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                                 VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                                 uint32_t                         drawCount,\n                                                                 uint32_t                         stride,\n                                                                 Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDrawMeshTasksIndirectNV(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBuffer>( buffer ), static_cast<VkDeviceSize>( offset ), drawCount, stride );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::drawMeshTasksIndirectCountNV( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                                      VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                                      VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                                                      VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                                                      uint32_t                         maxDrawCount,\n                                                                      uint32_t                         stride,\n                                                                      Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDrawMeshTasksIndirectCountNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                         static_cast<VkBuffer>( buffer ),\n                                         static_cast<VkDeviceSize>( offset ),\n                                         static_cast<VkBuffer>( countBuffer ),\n                                         static_cast<VkDeviceSize>( countBufferOffset ),\n                                         maxDrawCount,\n                                         stride );\n  }\n\n  //=== VK_NV_scissor_exclusive ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setExclusiveScissorEnableNV( uint32_t                             firstExclusiveScissor,\n                                                                     uint32_t                             exclusiveScissorCount,\n                                                                     const VULKAN_HPP_NAMESPACE::Bool32 * pExclusiveScissorEnables,\n                                                                     Dispatch const &                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetExclusiveScissorEnableNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                        firstExclusiveScissor,\n                                        exclusiveScissorCount,\n                                        reinterpret_cast<const VkBool32 *>( pExclusiveScissorEnables ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::setExclusiveScissorEnableNV( uint32_t                                                                     firstExclusiveScissor,\n                                                VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Bool32> const & exclusiveScissorEnables,\n                                                Dispatch const &                                                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetExclusiveScissorEnableNV && \"Function <vkCmdSetExclusiveScissorEnableNV> requires <VK_NV_scissor_exclusive>\" );\n#  endif\n\n    d.vkCmdSetExclusiveScissorEnableNV(\n      m_commandBuffer, firstExclusiveScissor, exclusiveScissorEnables.size(), reinterpret_cast<const VkBool32 *>( exclusiveScissorEnables.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setExclusiveScissorNV( uint32_t                             firstExclusiveScissor,\n                                                               uint32_t                             exclusiveScissorCount,\n                                                               const VULKAN_HPP_NAMESPACE::Rect2D * pExclusiveScissors,\n                                                               Dispatch const &                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetExclusiveScissorNV(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), firstExclusiveScissor, exclusiveScissorCount, reinterpret_cast<const VkRect2D *>( pExclusiveScissors ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setExclusiveScissorNV( uint32_t firstExclusiveScissor,\n                                                               VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & exclusiveScissors,\n                                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetExclusiveScissorNV && \"Function <vkCmdSetExclusiveScissorNV> requires <VK_NV_scissor_exclusive>\" );\n#  endif\n\n    d.vkCmdSetExclusiveScissorNV(\n      m_commandBuffer, firstExclusiveScissor, exclusiveScissors.size(), reinterpret_cast<const VkRect2D *>( exclusiveScissors.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_NV_device_diagnostic_checkpoints ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setCheckpointNV( const void * pCheckpointMarker, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetCheckpointNV( static_cast<VkCommandBuffer>( m_commandBuffer ), pCheckpointMarker );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename CheckpointMarkerType, typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setCheckpointNV( CheckpointMarkerType const & checkpointMarker, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetCheckpointNV && \"Function <vkCmdSetCheckpointNV> requires <VK_NV_device_diagnostic_checkpoints>\" );\n#  endif\n\n    d.vkCmdSetCheckpointNV( m_commandBuffer, reinterpret_cast<const void *>( &checkpointMarker ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Queue::getCheckpointDataNV( uint32_t *                               pCheckpointDataCount,\n                                                     VULKAN_HPP_NAMESPACE::CheckpointDataNV * pCheckpointData,\n                                                     Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetQueueCheckpointDataNV( static_cast<VkQueue>( m_queue ), pCheckpointDataCount, reinterpret_cast<VkCheckpointDataNV *>( pCheckpointData ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename CheckpointDataNVAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename CheckpointDataNVAllocator::value_type, VULKAN_HPP_NAMESPACE::CheckpointDataNV>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::CheckpointDataNV, CheckpointDataNVAllocator>\n                                         Queue::getCheckpointDataNV( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetQueueCheckpointDataNV && \"Function <vkGetQueueCheckpointDataNV> requires <VK_NV_device_diagnostic_checkpoints>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::CheckpointDataNV, CheckpointDataNVAllocator> checkpointData;\n    uint32_t                                                                       checkpointDataCount;\n    d.vkGetQueueCheckpointDataNV( m_queue, &checkpointDataCount, nullptr );\n    checkpointData.resize( checkpointDataCount );\n    d.vkGetQueueCheckpointDataNV( m_queue, &checkpointDataCount, reinterpret_cast<VkCheckpointDataNV *>( checkpointData.data() ) );\n\n    VULKAN_HPP_ASSERT( checkpointDataCount <= checkpointData.size() );\n    if ( checkpointDataCount < checkpointData.size() )\n    {\n      checkpointData.resize( checkpointDataCount );\n    }\n    return checkpointData;\n  }\n\n  template <typename CheckpointDataNVAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename CheckpointDataNVAllocator::value_type, VULKAN_HPP_NAMESPACE::CheckpointDataNV>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::CheckpointDataNV, CheckpointDataNVAllocator>\n                                         Queue::getCheckpointDataNV( CheckpointDataNVAllocator & checkpointDataNVAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetQueueCheckpointDataNV && \"Function <vkGetQueueCheckpointDataNV> requires <VK_NV_device_diagnostic_checkpoints>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::CheckpointDataNV, CheckpointDataNVAllocator> checkpointData( checkpointDataNVAllocator );\n    uint32_t                                                                       checkpointDataCount;\n    d.vkGetQueueCheckpointDataNV( m_queue, &checkpointDataCount, nullptr );\n    checkpointData.resize( checkpointDataCount );\n    d.vkGetQueueCheckpointDataNV( m_queue, &checkpointDataCount, reinterpret_cast<VkCheckpointDataNV *>( checkpointData.data() ) );\n\n    VULKAN_HPP_ASSERT( checkpointDataCount <= checkpointData.size() );\n    if ( checkpointDataCount < checkpointData.size() )\n    {\n      checkpointData.resize( checkpointDataCount );\n    }\n    return checkpointData;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Queue::getCheckpointData2NV( uint32_t *                                pCheckpointDataCount,\n                                                      VULKAN_HPP_NAMESPACE::CheckpointData2NV * pCheckpointData,\n                                                      Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetQueueCheckpointData2NV( static_cast<VkQueue>( m_queue ), pCheckpointDataCount, reinterpret_cast<VkCheckpointData2NV *>( pCheckpointData ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename CheckpointData2NVAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename CheckpointData2NVAllocator::value_type, VULKAN_HPP_NAMESPACE::CheckpointData2NV>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::CheckpointData2NV, CheckpointData2NVAllocator>\n                                         Queue::getCheckpointData2NV( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetQueueCheckpointData2NV && \"Function <vkGetQueueCheckpointData2NV> requires <VK_NV_device_diagnostic_checkpoints>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::CheckpointData2NV, CheckpointData2NVAllocator> checkpointData;\n    uint32_t                                                                         checkpointDataCount;\n    d.vkGetQueueCheckpointData2NV( m_queue, &checkpointDataCount, nullptr );\n    checkpointData.resize( checkpointDataCount );\n    d.vkGetQueueCheckpointData2NV( m_queue, &checkpointDataCount, reinterpret_cast<VkCheckpointData2NV *>( checkpointData.data() ) );\n\n    VULKAN_HPP_ASSERT( checkpointDataCount <= checkpointData.size() );\n    if ( checkpointDataCount < checkpointData.size() )\n    {\n      checkpointData.resize( checkpointDataCount );\n    }\n    return checkpointData;\n  }\n\n  template <typename CheckpointData2NVAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename CheckpointData2NVAllocator::value_type, VULKAN_HPP_NAMESPACE::CheckpointData2NV>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::CheckpointData2NV, CheckpointData2NVAllocator>\n                                         Queue::getCheckpointData2NV( CheckpointData2NVAllocator & checkpointData2NVAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetQueueCheckpointData2NV && \"Function <vkGetQueueCheckpointData2NV> requires <VK_NV_device_diagnostic_checkpoints>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::CheckpointData2NV, CheckpointData2NVAllocator> checkpointData( checkpointData2NVAllocator );\n    uint32_t                                                                         checkpointDataCount;\n    d.vkGetQueueCheckpointData2NV( m_queue, &checkpointDataCount, nullptr );\n    checkpointData.resize( checkpointDataCount );\n    d.vkGetQueueCheckpointData2NV( m_queue, &checkpointDataCount, reinterpret_cast<VkCheckpointData2NV *>( checkpointData.data() ) );\n\n    VULKAN_HPP_ASSERT( checkpointDataCount <= checkpointData.size() );\n    if ( checkpointDataCount < checkpointData.size() )\n    {\n      checkpointData.resize( checkpointDataCount );\n    }\n    return checkpointData;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_timeline_semaphore ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getSemaphoreCounterValueKHR( VULKAN_HPP_NAMESPACE::Semaphore semaphore,\n                                                                                     uint64_t *                      pValue,\n                                                                                     Dispatch const &                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetSemaphoreCounterValueKHR( static_cast<VkDevice>( m_device ), static_cast<VkSemaphore>( semaphore ), pValue ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<uint64_t>::type\n                       Device::getSemaphoreCounterValueKHR( VULKAN_HPP_NAMESPACE::Semaphore semaphore, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetSemaphoreCounterValueKHR && \"Function <vkGetSemaphoreCounterValueKHR> requires <VK_KHR_timeline_semaphore> or <VK_VERSION_1_2>\" );\n#  endif\n\n    uint64_t                     value;\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetSemaphoreCounterValueKHR( m_device, static_cast<VkSemaphore>( semaphore ), &value ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getSemaphoreCounterValueKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( value ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::waitSemaphoresKHR( const VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo * pWaitInfo,\n                                                                           uint64_t                                        timeout,\n                                                                           Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkWaitSemaphoresKHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkSemaphoreWaitInfo *>( pWaitInfo ), timeout ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result\n    Device::waitSemaphoresKHR( const VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo & waitInfo, uint64_t timeout, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkWaitSemaphoresKHR && \"Function <vkWaitSemaphoresKHR> requires <VK_KHR_timeline_semaphore> or <VK_VERSION_1_2>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkWaitSemaphoresKHR( m_device, reinterpret_cast<const VkSemaphoreWaitInfo *>( &waitInfo ), timeout ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck(\n      result, VULKAN_HPP_NAMESPACE_STRING \"::Device::waitSemaphoresKHR\", { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eTimeout } );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::signalSemaphoreKHR( const VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo * pSignalInfo,\n                                                                            Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkSignalSemaphoreKHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkSemaphoreSignalInfo *>( pSignalInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n                                          Device::signalSemaphoreKHR( const VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo & signalInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkSignalSemaphoreKHR && \"Function <vkSignalSemaphoreKHR> requires <VK_KHR_timeline_semaphore> or <VK_VERSION_1_2>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkSignalSemaphoreKHR( m_device, reinterpret_cast<const VkSemaphoreSignalInfo *>( &signalInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::signalSemaphoreKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_INTEL_performance_query ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::initializePerformanceApiINTEL(\n    const VULKAN_HPP_NAMESPACE::InitializePerformanceApiInfoINTEL * pInitializeInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkInitializePerformanceApiINTEL( static_cast<VkDevice>( m_device ),\n                                                                   reinterpret_cast<const VkInitializePerformanceApiInfoINTEL *>( pInitializeInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::initializePerformanceApiINTEL( const VULKAN_HPP_NAMESPACE::InitializePerformanceApiInfoINTEL & initializeInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkInitializePerformanceApiINTEL && \"Function <vkInitializePerformanceApiINTEL> requires <VK_INTEL_performance_query>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkInitializePerformanceApiINTEL( m_device, reinterpret_cast<const VkInitializePerformanceApiInfoINTEL *>( &initializeInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::initializePerformanceApiINTEL\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::uninitializePerformanceApiINTEL( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkUninitializePerformanceApiINTEL( static_cast<VkDevice>( m_device ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result CommandBuffer::setPerformanceMarkerINTEL( const VULKAN_HPP_NAMESPACE::PerformanceMarkerInfoINTEL * pMarkerInfo,\n                                                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCmdSetPerformanceMarkerINTEL( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                                  reinterpret_cast<const VkPerformanceMarkerInfoINTEL *>( pMarkerInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    CommandBuffer::setPerformanceMarkerINTEL( const VULKAN_HPP_NAMESPACE::PerformanceMarkerInfoINTEL & markerInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetPerformanceMarkerINTEL && \"Function <vkCmdSetPerformanceMarkerINTEL> requires <VK_INTEL_performance_query>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCmdSetPerformanceMarkerINTEL( m_commandBuffer, reinterpret_cast<const VkPerformanceMarkerInfoINTEL *>( &markerInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::setPerformanceMarkerINTEL\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result CommandBuffer::setPerformanceStreamMarkerINTEL(\n    const VULKAN_HPP_NAMESPACE::PerformanceStreamMarkerInfoINTEL * pMarkerInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCmdSetPerformanceStreamMarkerINTEL( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                                        reinterpret_cast<const VkPerformanceStreamMarkerInfoINTEL *>( pMarkerInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    CommandBuffer::setPerformanceStreamMarkerINTEL( const VULKAN_HPP_NAMESPACE::PerformanceStreamMarkerInfoINTEL & markerInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetPerformanceStreamMarkerINTEL && \"Function <vkCmdSetPerformanceStreamMarkerINTEL> requires <VK_INTEL_performance_query>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCmdSetPerformanceStreamMarkerINTEL( m_commandBuffer, reinterpret_cast<const VkPerformanceStreamMarkerInfoINTEL *>( &markerInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::setPerformanceStreamMarkerINTEL\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result CommandBuffer::setPerformanceOverrideINTEL(\n    const VULKAN_HPP_NAMESPACE::PerformanceOverrideInfoINTEL * pOverrideInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCmdSetPerformanceOverrideINTEL( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                                    reinterpret_cast<const VkPerformanceOverrideInfoINTEL *>( pOverrideInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    CommandBuffer::setPerformanceOverrideINTEL( const VULKAN_HPP_NAMESPACE::PerformanceOverrideInfoINTEL & overrideInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetPerformanceOverrideINTEL && \"Function <vkCmdSetPerformanceOverrideINTEL> requires <VK_INTEL_performance_query>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCmdSetPerformanceOverrideINTEL( m_commandBuffer, reinterpret_cast<const VkPerformanceOverrideInfoINTEL *>( &overrideInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::setPerformanceOverrideINTEL\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::acquirePerformanceConfigurationINTEL( const VULKAN_HPP_NAMESPACE::PerformanceConfigurationAcquireInfoINTEL * pAcquireInfo,\n                                                  VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL *                  pConfiguration,\n                                                  Dispatch const &                                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkAcquirePerformanceConfigurationINTEL( static_cast<VkDevice>( m_device ),\n                                                                          reinterpret_cast<const VkPerformanceConfigurationAcquireInfoINTEL *>( pAcquireInfo ),\n                                                                          reinterpret_cast<VkPerformanceConfigurationINTEL *>( pConfiguration ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL>::type\n    Device::acquirePerformanceConfigurationINTEL( const VULKAN_HPP_NAMESPACE::PerformanceConfigurationAcquireInfoINTEL & acquireInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkAcquirePerformanceConfigurationINTEL && \"Function <vkAcquirePerformanceConfigurationINTEL> requires <VK_INTEL_performance_query>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration;\n    VULKAN_HPP_NAMESPACE::Result                        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkAcquirePerformanceConfigurationINTEL( m_device,\n                                                reinterpret_cast<const VkPerformanceConfigurationAcquireInfoINTEL *>( &acquireInfo ),\n                                                reinterpret_cast<VkPerformanceConfigurationINTEL *>( &configuration ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::acquirePerformanceConfigurationINTEL\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( configuration ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL, Dispatch>>::type\n                       Device::acquirePerformanceConfigurationINTELUnique( const VULKAN_HPP_NAMESPACE::PerformanceConfigurationAcquireInfoINTEL & acquireInfo,\n                                                        Dispatch const &                                                       d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkAcquirePerformanceConfigurationINTEL && \"Function <vkAcquirePerformanceConfigurationINTEL> requires <VK_INTEL_performance_query>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration;\n    VULKAN_HPP_NAMESPACE::Result                        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkAcquirePerformanceConfigurationINTEL( m_device,\n                                                reinterpret_cast<const VkPerformanceConfigurationAcquireInfoINTEL *>( &acquireInfo ),\n                                                reinterpret_cast<VkPerformanceConfigurationINTEL *>( &configuration ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::acquirePerformanceConfigurationINTELUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result,\n      UniqueHandle<VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL, Dispatch>( configuration, detail::ObjectRelease<Device, Dispatch>( *this, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::releasePerformanceConfigurationINTEL( VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration,\n                                                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkReleasePerformanceConfigurationINTEL( static_cast<VkDevice>( m_device ), static_cast<VkPerformanceConfigurationINTEL>( configuration ) ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::releasePerformanceConfigurationINTEL( VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkReleasePerformanceConfigurationINTEL && \"Function <vkReleasePerformanceConfigurationINTEL> requires <VK_INTEL_performance_query>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkReleasePerformanceConfigurationINTEL( m_device, static_cast<VkPerformanceConfigurationINTEL>( configuration ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::releasePerformanceConfigurationINTEL\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::release( VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration,\n                                                                 Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkReleasePerformanceConfigurationINTEL( static_cast<VkDevice>( m_device ), static_cast<VkPerformanceConfigurationINTEL>( configuration ) ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n                                          Device::release( VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkReleasePerformanceConfigurationINTEL && \"Function <vkReleasePerformanceConfigurationINTEL> requires <VK_INTEL_performance_query>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkReleasePerformanceConfigurationINTEL( m_device, static_cast<VkPerformanceConfigurationINTEL>( configuration ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::release\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Queue::setPerformanceConfigurationINTEL( VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration,\n                                                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkQueueSetPerformanceConfigurationINTEL( static_cast<VkQueue>( m_queue ), static_cast<VkPerformanceConfigurationINTEL>( configuration ) ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Queue::setPerformanceConfigurationINTEL( VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkQueueSetPerformanceConfigurationINTEL &&\n                       \"Function <vkQueueSetPerformanceConfigurationINTEL> requires <VK_INTEL_performance_query>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkQueueSetPerformanceConfigurationINTEL( m_queue, static_cast<VkPerformanceConfigurationINTEL>( configuration ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Queue::setPerformanceConfigurationINTEL\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getPerformanceParameterINTEL( VULKAN_HPP_NAMESPACE::PerformanceParameterTypeINTEL parameter,\n                                                                                      VULKAN_HPP_NAMESPACE::PerformanceValueINTEL *       pValue,\n                                                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPerformanceParameterINTEL(\n      static_cast<VkDevice>( m_device ), static_cast<VkPerformanceParameterTypeINTEL>( parameter ), reinterpret_cast<VkPerformanceValueINTEL *>( pValue ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::PerformanceValueINTEL>::type\n                       Device::getPerformanceParameterINTEL( VULKAN_HPP_NAMESPACE::PerformanceParameterTypeINTEL parameter, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPerformanceParameterINTEL && \"Function <vkGetPerformanceParameterINTEL> requires <VK_INTEL_performance_query>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::PerformanceValueINTEL value;\n    VULKAN_HPP_NAMESPACE::Result                result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPerformanceParameterINTEL(\n      m_device, static_cast<VkPerformanceParameterTypeINTEL>( parameter ), reinterpret_cast<VkPerformanceValueINTEL *>( &value ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getPerformanceParameterINTEL\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( value ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_AMD_display_native_hdr ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::setLocalDimmingAMD( VULKAN_HPP_NAMESPACE::SwapchainKHR swapChain,\n                                                     VULKAN_HPP_NAMESPACE::Bool32       localDimmingEnable,\n                                                     Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkSetLocalDimmingAMD( static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( swapChain ), static_cast<VkBool32>( localDimmingEnable ) );\n  }\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_imagepipe_surface ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Instance::createImagePipeSurfaceFUCHSIA( const VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateInfoFUCHSIA * pCreateInfo,\n                                             const VULKAN_HPP_NAMESPACE::AllocationCallbacks *               pAllocator,\n                                             VULKAN_HPP_NAMESPACE::SurfaceKHR *                              pSurface,\n                                             Dispatch const &                                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateImagePipeSurfaceFUCHSIA( static_cast<VkInstance>( m_instance ),\n                                                                   reinterpret_cast<const VkImagePipeSurfaceCreateInfoFUCHSIA *>( pCreateInfo ),\n                                                                   reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                                   reinterpret_cast<VkSurfaceKHR *>( pSurface ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n                       Instance::createImagePipeSurfaceFUCHSIA( const VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateInfoFUCHSIA & createInfo,\n                                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>       allocator,\n                                             Dispatch const &                                                d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateImagePipeSurfaceFUCHSIA && \"Function <vkCreateImagePipeSurfaceFUCHSIA> requires <VK_FUCHSIA_imagepipe_surface>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateImagePipeSurfaceFUCHSIA(\n      m_instance,\n      reinterpret_cast<const VkImagePipeSurfaceCreateInfoFUCHSIA *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createImagePipeSurfaceFUCHSIA\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( surface ) );\n  }\n\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n                       Instance::createImagePipeSurfaceFUCHSIAUnique( const VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateInfoFUCHSIA & createInfo,\n                                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>       allocator,\n                                                   Dispatch const &                                                d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#      if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateImagePipeSurfaceFUCHSIA && \"Function <vkCreateImagePipeSurfaceFUCHSIA> requires <VK_FUCHSIA_imagepipe_surface>\" );\n#      endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateImagePipeSurfaceFUCHSIA(\n      m_instance,\n      reinterpret_cast<const VkImagePipeSurfaceCreateInfoFUCHSIA *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createImagePipeSurfaceFUCHSIAUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>( surface, detail::ObjectDestroy<Instance, Dispatch>( *this, allocator, d ) ) );\n  }\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  //=== VK_EXT_metal_surface ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Instance::createMetalSurfaceEXT( const VULKAN_HPP_NAMESPACE::MetalSurfaceCreateInfoEXT * pCreateInfo,\n                                                                                 const VULKAN_HPP_NAMESPACE::AllocationCallbacks *       pAllocator,\n                                                                                 VULKAN_HPP_NAMESPACE::SurfaceKHR *                      pSurface,\n                                                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateMetalSurfaceEXT( static_cast<VkInstance>( m_instance ),\n                                                           reinterpret_cast<const VkMetalSurfaceCreateInfoEXT *>( pCreateInfo ),\n                                                           reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                           reinterpret_cast<VkSurfaceKHR *>( pSurface ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n                       Instance::createMetalSurfaceEXT( const VULKAN_HPP_NAMESPACE::MetalSurfaceCreateInfoEXT &   createInfo,\n                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                     Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateMetalSurfaceEXT && \"Function <vkCreateMetalSurfaceEXT> requires <VK_EXT_metal_surface>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateMetalSurfaceEXT( m_instance,\n                                 reinterpret_cast<const VkMetalSurfaceCreateInfoEXT *>( &createInfo ),\n                                 reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                                 reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createMetalSurfaceEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( surface ) );\n  }\n\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n                       Instance::createMetalSurfaceEXTUnique( const VULKAN_HPP_NAMESPACE::MetalSurfaceCreateInfoEXT &   createInfo,\n                                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                           Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#      if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateMetalSurfaceEXT && \"Function <vkCreateMetalSurfaceEXT> requires <VK_EXT_metal_surface>\" );\n#      endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateMetalSurfaceEXT( m_instance,\n                                 reinterpret_cast<const VkMetalSurfaceCreateInfoEXT *>( &createInfo ),\n                                 reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                                 reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createMetalSurfaceEXTUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>( surface, detail::ObjectDestroy<Instance, Dispatch>( *this, allocator, d ) ) );\n  }\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_METAL_EXT*/\n\n  //=== VK_KHR_fragment_shading_rate ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    PhysicalDevice::getFragmentShadingRatesKHR( uint32_t *                                                   pFragmentShadingRateCount,\n                                                VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR * pFragmentShadingRates,\n                                                Dispatch const &                                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkGetPhysicalDeviceFragmentShadingRatesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                    pFragmentShadingRateCount,\n                                                    reinterpret_cast<VkPhysicalDeviceFragmentShadingRateKHR *>( pFragmentShadingRates ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename PhysicalDeviceFragmentShadingRateKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename PhysicalDeviceFragmentShadingRateKHRAllocator::value_type,\n                                                 VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR>::value,\n                                    int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR, PhysicalDeviceFragmentShadingRateKHRAllocator>>::type\n    PhysicalDevice::getFragmentShadingRatesKHR( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceFragmentShadingRatesKHR &&\n                       \"Function <vkGetPhysicalDeviceFragmentShadingRatesKHR> requires <VK_KHR_fragment_shading_rate>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR, PhysicalDeviceFragmentShadingRateKHRAllocator> fragmentShadingRates;\n    uint32_t                                                                                                               fragmentShadingRateCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                                           result;\n    do\n    {\n      result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceFragmentShadingRatesKHR( m_physicalDevice, &fragmentShadingRateCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && fragmentShadingRateCount )\n      {\n        fragmentShadingRates.resize( fragmentShadingRateCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceFragmentShadingRatesKHR(\n          m_physicalDevice, &fragmentShadingRateCount, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateKHR *>( fragmentShadingRates.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getFragmentShadingRatesKHR\" );\n    VULKAN_HPP_ASSERT( fragmentShadingRateCount <= fragmentShadingRates.size() );\n    if ( fragmentShadingRateCount < fragmentShadingRates.size() )\n    {\n      fragmentShadingRates.resize( fragmentShadingRateCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( fragmentShadingRates ) );\n  }\n\n  template <typename PhysicalDeviceFragmentShadingRateKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename PhysicalDeviceFragmentShadingRateKHRAllocator::value_type,\n                                                 VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR>::value,\n                                    int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR, PhysicalDeviceFragmentShadingRateKHRAllocator>>::type\n    PhysicalDevice::getFragmentShadingRatesKHR( PhysicalDeviceFragmentShadingRateKHRAllocator & physicalDeviceFragmentShadingRateKHRAllocator,\n                                                Dispatch const &                                d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceFragmentShadingRatesKHR &&\n                       \"Function <vkGetPhysicalDeviceFragmentShadingRatesKHR> requires <VK_KHR_fragment_shading_rate>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR, PhysicalDeviceFragmentShadingRateKHRAllocator> fragmentShadingRates(\n      physicalDeviceFragmentShadingRateKHRAllocator );\n    uint32_t                     fragmentShadingRateCount;\n    VULKAN_HPP_NAMESPACE::Result result;\n    do\n    {\n      result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceFragmentShadingRatesKHR( m_physicalDevice, &fragmentShadingRateCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && fragmentShadingRateCount )\n      {\n        fragmentShadingRates.resize( fragmentShadingRateCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceFragmentShadingRatesKHR(\n          m_physicalDevice, &fragmentShadingRateCount, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateKHR *>( fragmentShadingRates.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getFragmentShadingRatesKHR\" );\n    VULKAN_HPP_ASSERT( fragmentShadingRateCount <= fragmentShadingRates.size() );\n    if ( fragmentShadingRateCount < fragmentShadingRates.size() )\n    {\n      fragmentShadingRates.resize( fragmentShadingRateCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( fragmentShadingRates ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setFragmentShadingRateKHR( const VULKAN_HPP_NAMESPACE::Extent2D *                       pFragmentSize,\n                                                                   const VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR combinerOps[2],\n                                                                   Dispatch const &                                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetFragmentShadingRateKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                      reinterpret_cast<const VkExtent2D *>( pFragmentSize ),\n                                      reinterpret_cast<const VkFragmentShadingRateCombinerOpKHR *>( combinerOps ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setFragmentShadingRateKHR( const VULKAN_HPP_NAMESPACE::Extent2D &                       fragmentSize,\n                                                                   const VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR combinerOps[2],\n                                                                   Dispatch const &                                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetFragmentShadingRateKHR && \"Function <vkCmdSetFragmentShadingRateKHR> requires <VK_KHR_fragment_shading_rate>\" );\n#  endif\n\n    d.vkCmdSetFragmentShadingRateKHR(\n      m_commandBuffer, reinterpret_cast<const VkExtent2D *>( &fragmentSize ), reinterpret_cast<const VkFragmentShadingRateCombinerOpKHR *>( combinerOps ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_dynamic_rendering_local_read ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setRenderingAttachmentLocationsKHR( const VULKAN_HPP_NAMESPACE::RenderingAttachmentLocationInfo * pLocationInfo,\n                                                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetRenderingAttachmentLocationsKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                               reinterpret_cast<const VkRenderingAttachmentLocationInfo *>( pLocationInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setRenderingAttachmentLocationsKHR( const VULKAN_HPP_NAMESPACE::RenderingAttachmentLocationInfo & locationInfo,\n                                                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetRenderingAttachmentLocationsKHR &&\n                       \"Function <vkCmdSetRenderingAttachmentLocationsKHR> requires <VK_KHR_dynamic_rendering_local_read> or <VK_VERSION_1_4>\" );\n#  endif\n\n    d.vkCmdSetRenderingAttachmentLocationsKHR( m_commandBuffer, reinterpret_cast<const VkRenderingAttachmentLocationInfo *>( &locationInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::setRenderingInputAttachmentIndicesKHR( const VULKAN_HPP_NAMESPACE::RenderingInputAttachmentIndexInfo * pInputAttachmentIndexInfo,\n                                                          Dispatch const &                                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetRenderingInputAttachmentIndicesKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                  reinterpret_cast<const VkRenderingInputAttachmentIndexInfo *>( pInputAttachmentIndexInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::setRenderingInputAttachmentIndicesKHR( const VULKAN_HPP_NAMESPACE::RenderingInputAttachmentIndexInfo & inputAttachmentIndexInfo,\n                                                          Dispatch const &                                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetRenderingInputAttachmentIndicesKHR &&\n                       \"Function <vkCmdSetRenderingInputAttachmentIndicesKHR> requires <VK_KHR_dynamic_rendering_local_read> or <VK_VERSION_1_4>\" );\n#  endif\n\n    d.vkCmdSetRenderingInputAttachmentIndicesKHR( m_commandBuffer, reinterpret_cast<const VkRenderingInputAttachmentIndexInfo *>( &inputAttachmentIndexInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_buffer_device_address ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE DeviceAddress Device::getBufferAddressEXT( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo * pInfo,\n                                                               Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<DeviceAddress>(\n      d.vkGetBufferDeviceAddressEXT( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkBufferDeviceAddressInfo *>( pInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceAddress Device::getBufferAddressEXT( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo & info,\n                                                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetBufferDeviceAddressEXT &&\n                       \"Function <vkGetBufferDeviceAddressEXT> requires <VK_EXT_buffer_device_address> or <VK_KHR_buffer_device_address> or <VK_VERSION_1_2>\" );\n#  endif\n\n    VkDeviceAddress result = d.vkGetBufferDeviceAddressEXT( m_device, reinterpret_cast<const VkBufferDeviceAddressInfo *>( &info ) );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::DeviceAddress>( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_tooling_info ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getToolPropertiesEXT( uint32_t *                                           pToolCount,\n                                                                                      VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties * pToolProperties,\n                                                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceToolPropertiesEXT(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ), pToolCount, reinterpret_cast<VkPhysicalDeviceToolProperties *>( pToolProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <\n    typename PhysicalDeviceToolPropertiesAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename PhysicalDeviceToolPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties, PhysicalDeviceToolPropertiesAllocator>>::type\n    PhysicalDevice::getToolPropertiesEXT( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceToolPropertiesEXT &&\n                       \"Function <vkGetPhysicalDeviceToolPropertiesEXT> requires <VK_EXT_tooling_info> or <VK_VERSION_1_3>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties, PhysicalDeviceToolPropertiesAllocator> toolProperties;\n    uint32_t                                                                                               toolCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                           result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceToolPropertiesEXT( m_physicalDevice, &toolCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && toolCount )\n      {\n        toolProperties.resize( toolCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceToolPropertiesEXT( m_physicalDevice, &toolCount, reinterpret_cast<VkPhysicalDeviceToolProperties *>( toolProperties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getToolPropertiesEXT\" );\n    VULKAN_HPP_ASSERT( toolCount <= toolProperties.size() );\n    if ( toolCount < toolProperties.size() )\n    {\n      toolProperties.resize( toolCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( toolProperties ) );\n  }\n\n  template <\n    typename PhysicalDeviceToolPropertiesAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename PhysicalDeviceToolPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties, PhysicalDeviceToolPropertiesAllocator>>::type\n    PhysicalDevice::getToolPropertiesEXT( PhysicalDeviceToolPropertiesAllocator & physicalDeviceToolPropertiesAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceToolPropertiesEXT &&\n                       \"Function <vkGetPhysicalDeviceToolPropertiesEXT> requires <VK_EXT_tooling_info> or <VK_VERSION_1_3>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties, PhysicalDeviceToolPropertiesAllocator> toolProperties(\n      physicalDeviceToolPropertiesAllocator );\n    uint32_t                     toolCount;\n    VULKAN_HPP_NAMESPACE::Result result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceToolPropertiesEXT( m_physicalDevice, &toolCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && toolCount )\n      {\n        toolProperties.resize( toolCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceToolPropertiesEXT( m_physicalDevice, &toolCount, reinterpret_cast<VkPhysicalDeviceToolProperties *>( toolProperties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getToolPropertiesEXT\" );\n    VULKAN_HPP_ASSERT( toolCount <= toolProperties.size() );\n    if ( toolCount < toolProperties.size() )\n    {\n      toolProperties.resize( toolCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( toolProperties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_present_wait ===\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::waitForPresentKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain,\n                                                                           uint64_t                           presentId,\n                                                                           uint64_t                           timeout,\n                                                                           Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkWaitForPresentKHR( static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( swapchain ), presentId, timeout ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result\n    Device::waitForPresentKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, uint64_t presentId, uint64_t timeout, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkWaitForPresentKHR && \"Function <vkWaitForPresentKHR> requires <VK_KHR_present_wait>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkWaitForPresentKHR( m_device, static_cast<VkSwapchainKHR>( swapchain ), presentId, timeout ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck(\n      result,\n      VULKAN_HPP_NAMESPACE_STRING \"::Device::waitForPresentKHR\",\n      { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eTimeout, VULKAN_HPP_NAMESPACE::Result::eSuboptimalKHR } );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n  //=== VK_NV_cooperative_matrix ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getCooperativeMatrixPropertiesNV(\n    uint32_t * pPropertyCount, VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV * pProperties, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ), pPropertyCount, reinterpret_cast<VkCooperativeMatrixPropertiesNV *>( pProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename CooperativeMatrixPropertiesNVAllocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename CooperativeMatrixPropertiesNVAllocator::value_type, VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV, CooperativeMatrixPropertiesNVAllocator>>::type\n    PhysicalDevice::getCooperativeMatrixPropertiesNV( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceCooperativeMatrixPropertiesNV &&\n                       \"Function <vkGetPhysicalDeviceCooperativeMatrixPropertiesNV> requires <VK_NV_cooperative_matrix>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV, CooperativeMatrixPropertiesNVAllocator> properties;\n    uint32_t                                                                                                 propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                             result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceCooperativeMatrixPropertiesNV( m_physicalDevice, &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(\n          m_physicalDevice, &propertyCount, reinterpret_cast<VkCooperativeMatrixPropertiesNV *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getCooperativeMatrixPropertiesNV\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n\n  template <typename CooperativeMatrixPropertiesNVAllocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename CooperativeMatrixPropertiesNVAllocator::value_type, VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV, CooperativeMatrixPropertiesNVAllocator>>::type\n    PhysicalDevice::getCooperativeMatrixPropertiesNV( CooperativeMatrixPropertiesNVAllocator & cooperativeMatrixPropertiesNVAllocator,\n                                                      Dispatch const &                         d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceCooperativeMatrixPropertiesNV &&\n                       \"Function <vkGetPhysicalDeviceCooperativeMatrixPropertiesNV> requires <VK_NV_cooperative_matrix>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV, CooperativeMatrixPropertiesNVAllocator> properties(\n      cooperativeMatrixPropertiesNVAllocator );\n    uint32_t                     propertyCount;\n    VULKAN_HPP_NAMESPACE::Result result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceCooperativeMatrixPropertiesNV( m_physicalDevice, &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(\n          m_physicalDevice, &propertyCount, reinterpret_cast<VkCooperativeMatrixPropertiesNV *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getCooperativeMatrixPropertiesNV\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_NV_coverage_reduction_mode ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getSupportedFramebufferMixedSamplesCombinationsNV(\n    uint32_t * pCombinationCount, VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV * pCombinations, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ), pCombinationCount, reinterpret_cast<VkFramebufferMixedSamplesCombinationNV *>( pCombinations ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename FramebufferMixedSamplesCombinationNVAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename FramebufferMixedSamplesCombinationNVAllocator::value_type,\n                                                 VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV>::value,\n                                    int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV, FramebufferMixedSamplesCombinationNVAllocator>>::type\n    PhysicalDevice::getSupportedFramebufferMixedSamplesCombinationsNV( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV &&\n                       \"Function <vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV> requires <VK_NV_coverage_reduction_mode>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV, FramebufferMixedSamplesCombinationNVAllocator> combinations;\n    uint32_t                                                                                                               combinationCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                                           result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV( m_physicalDevice, &combinationCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && combinationCount )\n      {\n        combinations.resize( combinationCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(\n          m_physicalDevice, &combinationCount, reinterpret_cast<VkFramebufferMixedSamplesCombinationNV *>( combinations.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSupportedFramebufferMixedSamplesCombinationsNV\" );\n    VULKAN_HPP_ASSERT( combinationCount <= combinations.size() );\n    if ( combinationCount < combinations.size() )\n    {\n      combinations.resize( combinationCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( combinations ) );\n  }\n\n  template <typename FramebufferMixedSamplesCombinationNVAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename FramebufferMixedSamplesCombinationNVAllocator::value_type,\n                                                 VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV>::value,\n                                    int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV, FramebufferMixedSamplesCombinationNVAllocator>>::type\n    PhysicalDevice::getSupportedFramebufferMixedSamplesCombinationsNV(\n      FramebufferMixedSamplesCombinationNVAllocator & framebufferMixedSamplesCombinationNVAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV &&\n                       \"Function <vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV> requires <VK_NV_coverage_reduction_mode>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV, FramebufferMixedSamplesCombinationNVAllocator> combinations(\n      framebufferMixedSamplesCombinationNVAllocator );\n    uint32_t                     combinationCount;\n    VULKAN_HPP_NAMESPACE::Result result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV( m_physicalDevice, &combinationCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && combinationCount )\n      {\n        combinations.resize( combinationCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(\n          m_physicalDevice, &combinationCount, reinterpret_cast<VkFramebufferMixedSamplesCombinationNV *>( combinations.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSupportedFramebufferMixedSamplesCombinationsNV\" );\n    VULKAN_HPP_ASSERT( combinationCount <= combinations.size() );\n    if ( combinationCount < combinations.size() )\n    {\n      combinations.resize( combinationCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( combinations ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_EXT_full_screen_exclusive ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    PhysicalDevice::getSurfacePresentModes2EXT( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR * pSurfaceInfo,\n                                                uint32_t *                                                  pPresentModeCount,\n                                                VULKAN_HPP_NAMESPACE::PresentModeKHR *                      pPresentModes,\n                                                Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceSurfacePresentModes2EXT( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                              reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( pSurfaceInfo ),\n                                                                              pPresentModeCount,\n                                                                              reinterpret_cast<VkPresentModeKHR *>( pPresentModes ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename PresentModeKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename PresentModeKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PresentModeKHR>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR, PresentModeKHRAllocator>>::type\n    PhysicalDevice::getSurfacePresentModes2EXT( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceSurfacePresentModes2EXT &&\n                       \"Function <vkGetPhysicalDeviceSurfacePresentModes2EXT> requires <VK_EXT_full_screen_exclusive>\" );\n#    endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR, PresentModeKHRAllocator> presentModes;\n    uint32_t                                                                   presentModeCount;\n    VULKAN_HPP_NAMESPACE::Result                                               result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceSurfacePresentModes2EXT(\n        m_physicalDevice, reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ), &presentModeCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && presentModeCount )\n      {\n        presentModes.resize( presentModeCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceSurfacePresentModes2EXT( m_physicalDevice,\n                                                        reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ),\n                                                        &presentModeCount,\n                                                        reinterpret_cast<VkPresentModeKHR *>( presentModes.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfacePresentModes2EXT\" );\n    VULKAN_HPP_ASSERT( presentModeCount <= presentModes.size() );\n    if ( presentModeCount < presentModes.size() )\n    {\n      presentModes.resize( presentModeCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( presentModes ) );\n  }\n\n  template <typename PresentModeKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename PresentModeKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PresentModeKHR>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR, PresentModeKHRAllocator>>::type\n                       PhysicalDevice::getSurfacePresentModes2EXT( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo,\n                                                PresentModeKHRAllocator &                                   presentModeKHRAllocator,\n                                                Dispatch const &                                            d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceSurfacePresentModes2EXT &&\n                       \"Function <vkGetPhysicalDeviceSurfacePresentModes2EXT> requires <VK_EXT_full_screen_exclusive>\" );\n#    endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR, PresentModeKHRAllocator> presentModes( presentModeKHRAllocator );\n    uint32_t                                                                   presentModeCount;\n    VULKAN_HPP_NAMESPACE::Result                                               result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceSurfacePresentModes2EXT(\n        m_physicalDevice, reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ), &presentModeCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && presentModeCount )\n      {\n        presentModes.resize( presentModeCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceSurfacePresentModes2EXT( m_physicalDevice,\n                                                        reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ),\n                                                        &presentModeCount,\n                                                        reinterpret_cast<VkPresentModeKHR *>( presentModes.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfacePresentModes2EXT\" );\n    VULKAN_HPP_ASSERT( presentModeCount <= presentModes.size() );\n    if ( presentModeCount < presentModes.size() )\n    {\n      presentModes.resize( presentModeCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( presentModes ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#  ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::acquireFullScreenExclusiveModeEXT( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain,\n                                                                                           Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkAcquireFullScreenExclusiveModeEXT( static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( swapchain ) ) );\n  }\n#  else\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::acquireFullScreenExclusiveModeEXT( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkAcquireFullScreenExclusiveModeEXT && \"Function <vkAcquireFullScreenExclusiveModeEXT> requires <VK_EXT_full_screen_exclusive>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkAcquireFullScreenExclusiveModeEXT( m_device, static_cast<VkSwapchainKHR>( swapchain ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::acquireFullScreenExclusiveModeEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n#  ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::releaseFullScreenExclusiveModeEXT( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain,\n                                                                                           Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkReleaseFullScreenExclusiveModeEXT( static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( swapchain ) ) );\n  }\n#  else\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::releaseFullScreenExclusiveModeEXT( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkReleaseFullScreenExclusiveModeEXT && \"Function <vkReleaseFullScreenExclusiveModeEXT> requires <VK_EXT_full_screen_exclusive>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkReleaseFullScreenExclusiveModeEXT( m_device, static_cast<VkSwapchainKHR>( swapchain ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::releaseFullScreenExclusiveModeEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::getGroupSurfacePresentModes2EXT( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR * pSurfaceInfo,\n                                             VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR *      pModes,\n                                             Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetDeviceGroupSurfacePresentModes2EXT( static_cast<VkDevice>( m_device ),\n                                                                           reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( pSurfaceInfo ),\n                                                                           reinterpret_cast<VkDeviceGroupPresentModeFlagsKHR *>( pModes ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR>::type\n    Device::getGroupSurfacePresentModes2EXT( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceGroupSurfacePresentModes2EXT &&\n                       \"Function <vkGetDeviceGroupSurfacePresentModes2EXT> requires <VK_EXT_full_screen_exclusive>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR modes;\n    VULKAN_HPP_NAMESPACE::Result                         result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetDeviceGroupSurfacePresentModes2EXT(\n      m_device, reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ), reinterpret_cast<VkDeviceGroupPresentModeFlagsKHR *>( &modes ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getGroupSurfacePresentModes2EXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( modes ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_EXT_headless_surface ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Instance::createHeadlessSurfaceEXT( const VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateInfoEXT * pCreateInfo,\n                                                                                    const VULKAN_HPP_NAMESPACE::AllocationCallbacks *          pAllocator,\n                                                                                    VULKAN_HPP_NAMESPACE::SurfaceKHR *                         pSurface,\n                                                                                    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateHeadlessSurfaceEXT( static_cast<VkInstance>( m_instance ),\n                                                              reinterpret_cast<const VkHeadlessSurfaceCreateInfoEXT *>( pCreateInfo ),\n                                                              reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                              reinterpret_cast<VkSurfaceKHR *>( pSurface ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n                       Instance::createHeadlessSurfaceEXT( const VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateInfoEXT & createInfo,\n                                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>  allocator,\n                                        Dispatch const &                                           d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateHeadlessSurfaceEXT && \"Function <vkCreateHeadlessSurfaceEXT> requires <VK_EXT_headless_surface>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateHeadlessSurfaceEXT(\n      m_instance,\n      reinterpret_cast<const VkHeadlessSurfaceCreateInfoEXT *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createHeadlessSurfaceEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( surface ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n                       Instance::createHeadlessSurfaceEXTUnique( const VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateInfoEXT & createInfo,\n                                              Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>  allocator,\n                                              Dispatch const &                                           d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateHeadlessSurfaceEXT && \"Function <vkCreateHeadlessSurfaceEXT> requires <VK_EXT_headless_surface>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateHeadlessSurfaceEXT(\n      m_instance,\n      reinterpret_cast<const VkHeadlessSurfaceCreateInfoEXT *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createHeadlessSurfaceEXTUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>( surface, detail::ObjectDestroy<Instance, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_buffer_device_address ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE DeviceAddress Device::getBufferAddressKHR( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo * pInfo,\n                                                               Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<DeviceAddress>(\n      d.vkGetBufferDeviceAddressKHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkBufferDeviceAddressInfo *>( pInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceAddress Device::getBufferAddressKHR( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo & info,\n                                                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetBufferDeviceAddressKHR &&\n                       \"Function <vkGetBufferDeviceAddressKHR> requires <VK_EXT_buffer_device_address> or <VK_KHR_buffer_device_address> or <VK_VERSION_1_2>\" );\n#  endif\n\n    VkDeviceAddress result = d.vkGetBufferDeviceAddressKHR( m_device, reinterpret_cast<const VkBufferDeviceAddressInfo *>( &info ) );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::DeviceAddress>( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE uint64_t Device::getBufferOpaqueCaptureAddressKHR( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo * pInfo,\n                                                                       Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return d.vkGetBufferOpaqueCaptureAddressKHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkBufferDeviceAddressInfo *>( pInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE uint64_t Device::getBufferOpaqueCaptureAddressKHR( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo & info,\n                                                                       Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetBufferOpaqueCaptureAddressKHR &&\n                       \"Function <vkGetBufferOpaqueCaptureAddressKHR> requires <VK_KHR_buffer_device_address> or <VK_VERSION_1_2>\" );\n#  endif\n\n    uint64_t result = d.vkGetBufferOpaqueCaptureAddressKHR( m_device, reinterpret_cast<const VkBufferDeviceAddressInfo *>( &info ) );\n\n    return result;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE uint64_t Device::getMemoryOpaqueCaptureAddressKHR( const VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo * pInfo,\n                                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return d.vkGetDeviceMemoryOpaqueCaptureAddressKHR( static_cast<VkDevice>( m_device ),\n                                                       reinterpret_cast<const VkDeviceMemoryOpaqueCaptureAddressInfo *>( pInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE uint64_t Device::getMemoryOpaqueCaptureAddressKHR( const VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo & info,\n                                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceMemoryOpaqueCaptureAddressKHR &&\n                       \"Function <vkGetDeviceMemoryOpaqueCaptureAddressKHR> requires <VK_KHR_buffer_device_address> or <VK_VERSION_1_2>\" );\n#  endif\n\n    uint64_t result = d.vkGetDeviceMemoryOpaqueCaptureAddressKHR( m_device, reinterpret_cast<const VkDeviceMemoryOpaqueCaptureAddressInfo *>( &info ) );\n\n    return result;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_line_rasterization ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::setLineStippleEXT( uint32_t lineStippleFactor, uint16_t lineStipplePattern, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetLineStippleEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), lineStippleFactor, lineStipplePattern );\n  }\n\n  //=== VK_EXT_host_query_reset ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::resetQueryPoolEXT( VULKAN_HPP_NAMESPACE::QueryPool queryPool,\n                                                    uint32_t                        firstQuery,\n                                                    uint32_t                        queryCount,\n                                                    Dispatch const &                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkResetQueryPoolEXT( static_cast<VkDevice>( m_device ), static_cast<VkQueryPool>( queryPool ), firstQuery, queryCount );\n  }\n\n  //=== VK_EXT_extended_dynamic_state ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setCullModeEXT( VULKAN_HPP_NAMESPACE::CullModeFlags cullMode, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetCullModeEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkCullModeFlags>( cullMode ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setFrontFaceEXT( VULKAN_HPP_NAMESPACE::FrontFace frontFace, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetFrontFaceEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkFrontFace>( frontFace ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setPrimitiveTopologyEXT( VULKAN_HPP_NAMESPACE::PrimitiveTopology primitiveTopology,\n                                                                 Dispatch const &                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetPrimitiveTopologyEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkPrimitiveTopology>( primitiveTopology ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setViewportWithCountEXT( uint32_t                               viewportCount,\n                                                                 const VULKAN_HPP_NAMESPACE::Viewport * pViewports,\n                                                                 Dispatch const &                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetViewportWithCountEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), viewportCount, reinterpret_cast<const VkViewport *>( pViewports ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setViewportWithCountEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Viewport> const & viewports,\n                                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetViewportWithCountEXT &&\n                       \"Function <vkCmdSetViewportWithCountEXT> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkCmdSetViewportWithCountEXT( m_commandBuffer, viewports.size(), reinterpret_cast<const VkViewport *>( viewports.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::setScissorWithCountEXT( uint32_t scissorCount, const VULKAN_HPP_NAMESPACE::Rect2D * pScissors, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetScissorWithCountEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), scissorCount, reinterpret_cast<const VkRect2D *>( pScissors ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setScissorWithCountEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & scissors,\n                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetScissorWithCountEXT &&\n                       \"Function <vkCmdSetScissorWithCountEXT> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkCmdSetScissorWithCountEXT( m_commandBuffer, scissors.size(), reinterpret_cast<const VkRect2D *>( scissors.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindVertexBuffers2EXT( uint32_t                                 firstBinding,\n                                                               uint32_t                                 bindingCount,\n                                                               const VULKAN_HPP_NAMESPACE::Buffer *     pBuffers,\n                                                               const VULKAN_HPP_NAMESPACE::DeviceSize * pOffsets,\n                                                               const VULKAN_HPP_NAMESPACE::DeviceSize * pSizes,\n                                                               const VULKAN_HPP_NAMESPACE::DeviceSize * pStrides,\n                                                               Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBindVertexBuffers2EXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                  firstBinding,\n                                  bindingCount,\n                                  reinterpret_cast<const VkBuffer *>( pBuffers ),\n                                  reinterpret_cast<const VkDeviceSize *>( pOffsets ),\n                                  reinterpret_cast<const VkDeviceSize *>( pSizes ),\n                                  reinterpret_cast<const VkDeviceSize *>( pStrides ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindVertexBuffers2EXT( uint32_t                                                                         firstBinding,\n                                                               VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &     buffers,\n                                                               VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & offsets,\n                                                               VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & sizes,\n                                                               VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & strides,\n                                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBindVertexBuffers2EXT &&\n                       \"Function <vkCmdBindVertexBuffers2EXT> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n#  endif\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n    VULKAN_HPP_ASSERT( buffers.size() == offsets.size() );\n    VULKAN_HPP_ASSERT( sizes.empty() || buffers.size() == sizes.size() );\n    VULKAN_HPP_ASSERT( strides.empty() || buffers.size() == strides.size() );\n#  else\n    if ( buffers.size() != offsets.size() )\n    {\n      throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::bindVertexBuffers2EXT: buffers.size() != offsets.size()\" );\n    }\n    if ( !sizes.empty() && buffers.size() != sizes.size() )\n    {\n      throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::bindVertexBuffers2EXT: buffers.size() != sizes.size()\" );\n    }\n    if ( !strides.empty() && buffers.size() != strides.size() )\n    {\n      throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::bindVertexBuffers2EXT: buffers.size() != strides.size()\" );\n    }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n    d.vkCmdBindVertexBuffers2EXT( m_commandBuffer,\n                                  firstBinding,\n                                  buffers.size(),\n                                  reinterpret_cast<const VkBuffer *>( buffers.data() ),\n                                  reinterpret_cast<const VkDeviceSize *>( offsets.data() ),\n                                  reinterpret_cast<const VkDeviceSize *>( sizes.data() ),\n                                  reinterpret_cast<const VkDeviceSize *>( strides.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDepthTestEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthTestEnable, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDepthTestEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( depthTestEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDepthWriteEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthWriteEnable, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDepthWriteEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( depthWriteEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDepthCompareOpEXT( VULKAN_HPP_NAMESPACE::CompareOp depthCompareOp, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDepthCompareOpEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkCompareOp>( depthCompareOp ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDepthBoundsTestEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthBoundsTestEnable,\n                                                                     Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDepthBoundsTestEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( depthBoundsTestEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setStencilTestEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 stencilTestEnable, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetStencilTestEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( stencilTestEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setStencilOpEXT( VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask,\n                                                         VULKAN_HPP_NAMESPACE::StencilOp        failOp,\n                                                         VULKAN_HPP_NAMESPACE::StencilOp        passOp,\n                                                         VULKAN_HPP_NAMESPACE::StencilOp        depthFailOp,\n                                                         VULKAN_HPP_NAMESPACE::CompareOp        compareOp,\n                                                         Dispatch const &                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetStencilOpEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                            static_cast<VkStencilFaceFlags>( faceMask ),\n                            static_cast<VkStencilOp>( failOp ),\n                            static_cast<VkStencilOp>( passOp ),\n                            static_cast<VkStencilOp>( depthFailOp ),\n                            static_cast<VkCompareOp>( compareOp ) );\n  }\n\n  //=== VK_KHR_deferred_host_operations ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createDeferredOperationKHR( const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                                    VULKAN_HPP_NAMESPACE::DeferredOperationKHR *      pDeferredOperation,\n                                                                                    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateDeferredOperationKHR( static_cast<VkDevice>( m_device ),\n                                                                reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                                reinterpret_cast<VkDeferredOperationKHR *>( pDeferredOperation ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::DeferredOperationKHR>::type\n                       Device::createDeferredOperationKHR( Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateDeferredOperationKHR && \"Function <vkCreateDeferredOperationKHR> requires <VK_KHR_deferred_host_operations>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::DeferredOperationKHR deferredOperation;\n    VULKAN_HPP_NAMESPACE::Result               result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateDeferredOperationKHR(\n      m_device,\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkDeferredOperationKHR *>( &deferredOperation ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createDeferredOperationKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( deferredOperation ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DeferredOperationKHR, Dispatch>>::type\n                       Device::createDeferredOperationKHRUnique( Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateDeferredOperationKHR && \"Function <vkCreateDeferredOperationKHR> requires <VK_KHR_deferred_host_operations>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::DeferredOperationKHR deferredOperation;\n    VULKAN_HPP_NAMESPACE::Result               result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateDeferredOperationKHR(\n      m_device,\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkDeferredOperationKHR *>( &deferredOperation ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createDeferredOperationKHRUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result,\n      UniqueHandle<VULKAN_HPP_NAMESPACE::DeferredOperationKHR, Dispatch>( deferredOperation, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyDeferredOperationKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR        operation,\n                                                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                              Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyDeferredOperationKHR(\n      static_cast<VkDevice>( m_device ), static_cast<VkDeferredOperationKHR>( operation ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyDeferredOperationKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                operation,\n                                                              Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                              Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyDeferredOperationKHR && \"Function <vkDestroyDeferredOperationKHR> requires <VK_KHR_deferred_host_operations>\" );\n#  endif\n\n    d.vkDestroyDeferredOperationKHR(\n      m_device,\n      static_cast<VkDeferredOperationKHR>( operation ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::DeferredOperationKHR        operation,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyDeferredOperationKHR(\n      static_cast<VkDevice>( m_device ), static_cast<VkDeferredOperationKHR>( operation ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                operation,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyDeferredOperationKHR && \"Function <vkDestroyDeferredOperationKHR> requires <VK_KHR_deferred_host_operations>\" );\n#  endif\n\n    d.vkDestroyDeferredOperationKHR(\n      m_device,\n      static_cast<VkDeferredOperationKHR>( operation ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE uint32_t Device::getDeferredOperationMaxConcurrencyKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR operation,\n                                                                            Dispatch const &                           d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return d.vkGetDeferredOperationMaxConcurrencyKHR( static_cast<VkDevice>( m_device ), static_cast<VkDeferredOperationKHR>( operation ) );\n  }\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getDeferredOperationResultKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR operation,\n                                                                                       Dispatch const &                           d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetDeferredOperationResultKHR( static_cast<VkDevice>( m_device ), static_cast<VkDeferredOperationKHR>( operation ) ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result\n    Device::getDeferredOperationResultKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR operation, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeferredOperationResultKHR && \"Function <vkGetDeferredOperationResultKHR> requires <VK_KHR_deferred_host_operations>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetDeferredOperationResultKHR( m_device, static_cast<VkDeferredOperationKHR>( operation ) ) );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::deferredOperationJoinKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR operation,\n                                                                                  Dispatch const &                           d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkDeferredOperationJoinKHR( static_cast<VkDevice>( m_device ), static_cast<VkDeferredOperationKHR>( operation ) ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result Device::deferredOperationJoinKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR operation,\n                                                                                                        Dispatch const &                           d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDeferredOperationJoinKHR && \"Function <vkDeferredOperationJoinKHR> requires <VK_KHR_deferred_host_operations>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkDeferredOperationJoinKHR( m_device, static_cast<VkDeferredOperationKHR>( operation ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck(\n      result,\n      VULKAN_HPP_NAMESPACE_STRING \"::Device::deferredOperationJoinKHR\",\n      { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eThreadDoneKHR, VULKAN_HPP_NAMESPACE::Result::eThreadIdleKHR } );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n  //=== VK_KHR_pipeline_executable_properties ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getPipelineExecutablePropertiesKHR( const VULKAN_HPP_NAMESPACE::PipelineInfoKHR * pPipelineInfo,\n                                                                                            uint32_t *                                    pExecutableCount,\n                                                                                            VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR * pProperties,\n                                                                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPipelineExecutablePropertiesKHR( static_cast<VkDevice>( m_device ),\n                                                                        reinterpret_cast<const VkPipelineInfoKHR *>( pPipelineInfo ),\n                                                                        pExecutableCount,\n                                                                        reinterpret_cast<VkPipelineExecutablePropertiesKHR *>( pProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename PipelineExecutablePropertiesKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename PipelineExecutablePropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR, PipelineExecutablePropertiesKHRAllocator>>::type\n    Device::getPipelineExecutablePropertiesKHR( const VULKAN_HPP_NAMESPACE::PipelineInfoKHR & pipelineInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPipelineExecutablePropertiesKHR &&\n                       \"Function <vkGetPipelineExecutablePropertiesKHR> requires <VK_KHR_pipeline_executable_properties>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR, PipelineExecutablePropertiesKHRAllocator> properties;\n    uint32_t                                                                                                     executableCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                                 result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetPipelineExecutablePropertiesKHR( m_device, reinterpret_cast<const VkPipelineInfoKHR *>( &pipelineInfo ), &executableCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && executableCount )\n      {\n        properties.resize( executableCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPipelineExecutablePropertiesKHR( m_device,\n                                                  reinterpret_cast<const VkPipelineInfoKHR *>( &pipelineInfo ),\n                                                  &executableCount,\n                                                  reinterpret_cast<VkPipelineExecutablePropertiesKHR *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getPipelineExecutablePropertiesKHR\" );\n    VULKAN_HPP_ASSERT( executableCount <= properties.size() );\n    if ( executableCount < properties.size() )\n    {\n      properties.resize( executableCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n\n  template <typename PipelineExecutablePropertiesKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename PipelineExecutablePropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR, PipelineExecutablePropertiesKHRAllocator>>::type\n    Device::getPipelineExecutablePropertiesKHR( const VULKAN_HPP_NAMESPACE::PipelineInfoKHR & pipelineInfo,\n                                                PipelineExecutablePropertiesKHRAllocator &    pipelineExecutablePropertiesKHRAllocator,\n                                                Dispatch const &                              d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPipelineExecutablePropertiesKHR &&\n                       \"Function <vkGetPipelineExecutablePropertiesKHR> requires <VK_KHR_pipeline_executable_properties>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR, PipelineExecutablePropertiesKHRAllocator> properties(\n      pipelineExecutablePropertiesKHRAllocator );\n    uint32_t                     executableCount;\n    VULKAN_HPP_NAMESPACE::Result result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetPipelineExecutablePropertiesKHR( m_device, reinterpret_cast<const VkPipelineInfoKHR *>( &pipelineInfo ), &executableCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && executableCount )\n      {\n        properties.resize( executableCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPipelineExecutablePropertiesKHR( m_device,\n                                                  reinterpret_cast<const VkPipelineInfoKHR *>( &pipelineInfo ),\n                                                  &executableCount,\n                                                  reinterpret_cast<VkPipelineExecutablePropertiesKHR *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getPipelineExecutablePropertiesKHR\" );\n    VULKAN_HPP_ASSERT( executableCount <= properties.size() );\n    if ( executableCount < properties.size() )\n    {\n      properties.resize( executableCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::getPipelineExecutableStatisticsKHR( const VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR * pExecutableInfo,\n                                                uint32_t *                                              pStatisticCount,\n                                                VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR *  pStatistics,\n                                                Dispatch const &                                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPipelineExecutableStatisticsKHR( static_cast<VkDevice>( m_device ),\n                                                                        reinterpret_cast<const VkPipelineExecutableInfoKHR *>( pExecutableInfo ),\n                                                                        pStatisticCount,\n                                                                        reinterpret_cast<VkPipelineExecutableStatisticKHR *>( pStatistics ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename PipelineExecutableStatisticKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename PipelineExecutableStatisticKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR, PipelineExecutableStatisticKHRAllocator>>::type\n    Device::getPipelineExecutableStatisticsKHR( const VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR & executableInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPipelineExecutableStatisticsKHR &&\n                       \"Function <vkGetPipelineExecutableStatisticsKHR> requires <VK_KHR_pipeline_executable_properties>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR, PipelineExecutableStatisticKHRAllocator> statistics;\n    uint32_t                                                                                                   statisticCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                               result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPipelineExecutableStatisticsKHR(\n        m_device, reinterpret_cast<const VkPipelineExecutableInfoKHR *>( &executableInfo ), &statisticCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && statisticCount )\n      {\n        statistics.resize( statisticCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPipelineExecutableStatisticsKHR( m_device,\n                                                  reinterpret_cast<const VkPipelineExecutableInfoKHR *>( &executableInfo ),\n                                                  &statisticCount,\n                                                  reinterpret_cast<VkPipelineExecutableStatisticKHR *>( statistics.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getPipelineExecutableStatisticsKHR\" );\n    VULKAN_HPP_ASSERT( statisticCount <= statistics.size() );\n    if ( statisticCount < statistics.size() )\n    {\n      statistics.resize( statisticCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( statistics ) );\n  }\n\n  template <typename PipelineExecutableStatisticKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename PipelineExecutableStatisticKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR, PipelineExecutableStatisticKHRAllocator>>::type\n    Device::getPipelineExecutableStatisticsKHR( const VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR & executableInfo,\n                                                PipelineExecutableStatisticKHRAllocator &               pipelineExecutableStatisticKHRAllocator,\n                                                Dispatch const &                                        d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPipelineExecutableStatisticsKHR &&\n                       \"Function <vkGetPipelineExecutableStatisticsKHR> requires <VK_KHR_pipeline_executable_properties>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR, PipelineExecutableStatisticKHRAllocator> statistics(\n      pipelineExecutableStatisticKHRAllocator );\n    uint32_t                     statisticCount;\n    VULKAN_HPP_NAMESPACE::Result result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPipelineExecutableStatisticsKHR(\n        m_device, reinterpret_cast<const VkPipelineExecutableInfoKHR *>( &executableInfo ), &statisticCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && statisticCount )\n      {\n        statistics.resize( statisticCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPipelineExecutableStatisticsKHR( m_device,\n                                                  reinterpret_cast<const VkPipelineExecutableInfoKHR *>( &executableInfo ),\n                                                  &statisticCount,\n                                                  reinterpret_cast<VkPipelineExecutableStatisticKHR *>( statistics.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getPipelineExecutableStatisticsKHR\" );\n    VULKAN_HPP_ASSERT( statisticCount <= statistics.size() );\n    if ( statisticCount < statistics.size() )\n    {\n      statistics.resize( statisticCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( statistics ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::getPipelineExecutableInternalRepresentationsKHR( const VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR *             pExecutableInfo,\n                                                             uint32_t *                                                          pInternalRepresentationCount,\n                                                             VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR * pInternalRepresentations,\n                                                             Dispatch const &                                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkGetPipelineExecutableInternalRepresentationsKHR( static_cast<VkDevice>( m_device ),\n                                                           reinterpret_cast<const VkPipelineExecutableInfoKHR *>( pExecutableInfo ),\n                                                           pInternalRepresentationCount,\n                                                           reinterpret_cast<VkPipelineExecutableInternalRepresentationKHR *>( pInternalRepresentations ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename PipelineExecutableInternalRepresentationKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename PipelineExecutableInternalRepresentationKHRAllocator::value_type,\n                                                 VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR>::value,\n                                    int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<\n    std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR, PipelineExecutableInternalRepresentationKHRAllocator>>::type\n    Device::getPipelineExecutableInternalRepresentationsKHR( const VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR & executableInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPipelineExecutableInternalRepresentationsKHR &&\n                       \"Function <vkGetPipelineExecutableInternalRepresentationsKHR> requires <VK_KHR_pipeline_executable_properties>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR, PipelineExecutableInternalRepresentationKHRAllocator>\n                                 internalRepresentations;\n    uint32_t                     internalRepresentationCount;\n    VULKAN_HPP_NAMESPACE::Result result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPipelineExecutableInternalRepresentationsKHR(\n        m_device, reinterpret_cast<const VkPipelineExecutableInfoKHR *>( &executableInfo ), &internalRepresentationCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && internalRepresentationCount )\n      {\n        internalRepresentations.resize( internalRepresentationCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPipelineExecutableInternalRepresentationsKHR(\n          m_device,\n          reinterpret_cast<const VkPipelineExecutableInfoKHR *>( &executableInfo ),\n          &internalRepresentationCount,\n          reinterpret_cast<VkPipelineExecutableInternalRepresentationKHR *>( internalRepresentations.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getPipelineExecutableInternalRepresentationsKHR\" );\n    VULKAN_HPP_ASSERT( internalRepresentationCount <= internalRepresentations.size() );\n    if ( internalRepresentationCount < internalRepresentations.size() )\n    {\n      internalRepresentations.resize( internalRepresentationCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( internalRepresentations ) );\n  }\n\n  template <typename PipelineExecutableInternalRepresentationKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename PipelineExecutableInternalRepresentationKHRAllocator::value_type,\n                                                 VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR>::value,\n                                    int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<\n    std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR, PipelineExecutableInternalRepresentationKHRAllocator>>::type\n    Device::getPipelineExecutableInternalRepresentationsKHR(\n      const VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR & executableInfo,\n      PipelineExecutableInternalRepresentationKHRAllocator &  pipelineExecutableInternalRepresentationKHRAllocator,\n      Dispatch const &                                        d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPipelineExecutableInternalRepresentationsKHR &&\n                       \"Function <vkGetPipelineExecutableInternalRepresentationsKHR> requires <VK_KHR_pipeline_executable_properties>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR, PipelineExecutableInternalRepresentationKHRAllocator>\n                                 internalRepresentations( pipelineExecutableInternalRepresentationKHRAllocator );\n    uint32_t                     internalRepresentationCount;\n    VULKAN_HPP_NAMESPACE::Result result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPipelineExecutableInternalRepresentationsKHR(\n        m_device, reinterpret_cast<const VkPipelineExecutableInfoKHR *>( &executableInfo ), &internalRepresentationCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && internalRepresentationCount )\n      {\n        internalRepresentations.resize( internalRepresentationCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPipelineExecutableInternalRepresentationsKHR(\n          m_device,\n          reinterpret_cast<const VkPipelineExecutableInfoKHR *>( &executableInfo ),\n          &internalRepresentationCount,\n          reinterpret_cast<VkPipelineExecutableInternalRepresentationKHR *>( internalRepresentations.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getPipelineExecutableInternalRepresentationsKHR\" );\n    VULKAN_HPP_ASSERT( internalRepresentationCount <= internalRepresentations.size() );\n    if ( internalRepresentationCount < internalRepresentations.size() )\n    {\n      internalRepresentations.resize( internalRepresentationCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( internalRepresentations ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_host_image_copy ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::copyMemoryToImageEXT( const VULKAN_HPP_NAMESPACE::CopyMemoryToImageInfo * pCopyMemoryToImageInfo,\n                                                                              Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkCopyMemoryToImageEXT( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkCopyMemoryToImageInfo *>( pCopyMemoryToImageInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::copyMemoryToImageEXT( const VULKAN_HPP_NAMESPACE::CopyMemoryToImageInfo & copyMemoryToImageInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCopyMemoryToImageEXT && \"Function <vkCopyMemoryToImageEXT> requires <VK_EXT_host_image_copy> or <VK_VERSION_1_4>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCopyMemoryToImageEXT( m_device, reinterpret_cast<const VkCopyMemoryToImageInfo *>( &copyMemoryToImageInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::copyMemoryToImageEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::copyImageToMemoryEXT( const VULKAN_HPP_NAMESPACE::CopyImageToMemoryInfo * pCopyImageToMemoryInfo,\n                                                                              Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkCopyImageToMemoryEXT( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkCopyImageToMemoryInfo *>( pCopyImageToMemoryInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::copyImageToMemoryEXT( const VULKAN_HPP_NAMESPACE::CopyImageToMemoryInfo & copyImageToMemoryInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCopyImageToMemoryEXT && \"Function <vkCopyImageToMemoryEXT> requires <VK_EXT_host_image_copy> or <VK_VERSION_1_4>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCopyImageToMemoryEXT( m_device, reinterpret_cast<const VkCopyImageToMemoryInfo *>( &copyImageToMemoryInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::copyImageToMemoryEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::copyImageToImageEXT( const VULKAN_HPP_NAMESPACE::CopyImageToImageInfo * pCopyImageToImageInfo,\n                                                                             Dispatch const &                                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkCopyImageToImageEXT( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkCopyImageToImageInfo *>( pCopyImageToImageInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::copyImageToImageEXT( const VULKAN_HPP_NAMESPACE::CopyImageToImageInfo & copyImageToImageInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCopyImageToImageEXT && \"Function <vkCopyImageToImageEXT> requires <VK_EXT_host_image_copy> or <VK_VERSION_1_4>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCopyImageToImageEXT( m_device, reinterpret_cast<const VkCopyImageToImageInfo *>( &copyImageToImageInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::copyImageToImageEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::transitionImageLayoutEXT( uint32_t                                                    transitionCount,\n                                                                                  const VULKAN_HPP_NAMESPACE::HostImageLayoutTransitionInfo * pTransitions,\n                                                                                  Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkTransitionImageLayoutEXT(\n      static_cast<VkDevice>( m_device ), transitionCount, reinterpret_cast<const VkHostImageLayoutTransitionInfo *>( pTransitions ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::transitionImageLayoutEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::HostImageLayoutTransitionInfo> const & transitions,\n                                      Dispatch const &                                                                                    d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkTransitionImageLayoutEXT && \"Function <vkTransitionImageLayoutEXT> requires <VK_EXT_host_image_copy> or <VK_VERSION_1_4>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkTransitionImageLayoutEXT( m_device, transitions.size(), reinterpret_cast<const VkHostImageLayoutTransitionInfo *>( transitions.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::transitionImageLayoutEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getImageSubresourceLayout2EXT( VULKAN_HPP_NAMESPACE::Image                     image,\n                                                                const VULKAN_HPP_NAMESPACE::ImageSubresource2 * pSubresource,\n                                                                VULKAN_HPP_NAMESPACE::SubresourceLayout2 *      pLayout,\n                                                                Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetImageSubresourceLayout2EXT( static_cast<VkDevice>( m_device ),\n                                       static_cast<VkImage>( image ),\n                                       reinterpret_cast<const VkImageSubresource2 *>( pSubresource ),\n                                       reinterpret_cast<VkSubresourceLayout2 *>( pLayout ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::SubresourceLayout2 Device::getImageSubresourceLayout2EXT(\n    VULKAN_HPP_NAMESPACE::Image image, const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT(\n      d.vkGetImageSubresourceLayout2EXT &&\n      \"Function <vkGetImageSubresourceLayout2EXT> requires <VK_EXT_host_image_copy> or <VK_EXT_image_compression_control> or <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::SubresourceLayout2 layout;\n    d.vkGetImageSubresourceLayout2EXT( m_device,\n                                       static_cast<VkImage>( image ),\n                                       reinterpret_cast<const VkImageSubresource2 *>( &subresource ),\n                                       reinterpret_cast<VkSubresourceLayout2 *>( &layout ) );\n\n    return layout;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> Device::getImageSubresourceLayout2EXT(\n    VULKAN_HPP_NAMESPACE::Image image, const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT(\n      d.vkGetImageSubresourceLayout2EXT &&\n      \"Function <vkGetImageSubresourceLayout2EXT> requires <VK_EXT_host_image_copy> or <VK_EXT_image_compression_control> or <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n    VULKAN_HPP_NAMESPACE::SubresourceLayout2 &       layout = structureChain.template get<VULKAN_HPP_NAMESPACE::SubresourceLayout2>();\n    d.vkGetImageSubresourceLayout2EXT( m_device,\n                                       static_cast<VkImage>( image ),\n                                       reinterpret_cast<const VkImageSubresource2 *>( &subresource ),\n                                       reinterpret_cast<VkSubresourceLayout2 *>( &layout ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_map_memory2 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::mapMemory2KHR( const VULKAN_HPP_NAMESPACE::MemoryMapInfo * pMemoryMapInfo,\n                                                                       void **                                     ppData,\n                                                                       Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkMapMemory2KHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkMemoryMapInfo *>( pMemoryMapInfo ), ppData ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<void *>::type\n                       Device::mapMemory2KHR( const VULKAN_HPP_NAMESPACE::MemoryMapInfo & memoryMapInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkMapMemory2KHR && \"Function <vkMapMemory2KHR> requires <VK_KHR_map_memory2> or <VK_VERSION_1_4>\" );\n#  endif\n\n    void *                       pData;\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkMapMemory2KHR( m_device, reinterpret_cast<const VkMemoryMapInfo *>( &memoryMapInfo ), &pData ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::mapMemory2KHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( pData ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::unmapMemory2KHR( const VULKAN_HPP_NAMESPACE::MemoryUnmapInfo * pMemoryUnmapInfo,\n                                                                         Dispatch const &                              d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkUnmapMemory2KHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkMemoryUnmapInfo *>( pMemoryUnmapInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE typename ResultValueType<void>::type Device::unmapMemory2KHR( const VULKAN_HPP_NAMESPACE::MemoryUnmapInfo & memoryUnmapInfo,\n                                                                                  Dispatch const &                              d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkUnmapMemory2KHR && \"Function <vkUnmapMemory2KHR> requires <VK_KHR_map_memory2> or <VK_VERSION_1_4>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkUnmapMemory2KHR( m_device, reinterpret_cast<const VkMemoryUnmapInfo *>( &memoryUnmapInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::unmapMemory2KHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_swapchain_maintenance1 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::releaseSwapchainImagesEXT( const VULKAN_HPP_NAMESPACE::ReleaseSwapchainImagesInfoEXT * pReleaseInfo,\n                                                                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkReleaseSwapchainImagesEXT( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkReleaseSwapchainImagesInfoEXT *>( pReleaseInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::releaseSwapchainImagesEXT( const VULKAN_HPP_NAMESPACE::ReleaseSwapchainImagesInfoEXT & releaseInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkReleaseSwapchainImagesEXT && \"Function <vkReleaseSwapchainImagesEXT> requires <VK_EXT_swapchain_maintenance1>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkReleaseSwapchainImagesEXT( m_device, reinterpret_cast<const VkReleaseSwapchainImagesInfoEXT *>( &releaseInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::releaseSwapchainImagesEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_NV_device_generated_commands ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getGeneratedCommandsMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoNV * pInfo,\n                                                                           VULKAN_HPP_NAMESPACE::MemoryRequirements2 * pMemoryRequirements,\n                                                                           Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetGeneratedCommandsMemoryRequirementsNV( static_cast<VkDevice>( m_device ),\n                                                  reinterpret_cast<const VkGeneratedCommandsMemoryRequirementsInfoNV *>( pInfo ),\n                                                  reinterpret_cast<VkMemoryRequirements2 *>( pMemoryRequirements ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2\n    Device::getGeneratedCommandsMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoNV & info,\n                                                      Dispatch const &                                                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetGeneratedCommandsMemoryRequirementsNV &&\n                       \"Function <vkGetGeneratedCommandsMemoryRequirementsNV> requires <VK_NV_device_generated_commands>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;\n    d.vkGetGeneratedCommandsMemoryRequirementsNV( m_device,\n                                                  reinterpret_cast<const VkGeneratedCommandsMemoryRequirementsInfoNV *>( &info ),\n                                                  reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n    return memoryRequirements;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n    Device::getGeneratedCommandsMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoNV & info,\n                                                      Dispatch const &                                                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetGeneratedCommandsMemoryRequirementsNV &&\n                       \"Function <vkGetGeneratedCommandsMemoryRequirementsNV> requires <VK_NV_device_generated_commands>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2 &      memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();\n    d.vkGetGeneratedCommandsMemoryRequirementsNV( m_device,\n                                                  reinterpret_cast<const VkGeneratedCommandsMemoryRequirementsInfoNV *>( &info ),\n                                                  reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::preprocessGeneratedCommandsNV( const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV * pGeneratedCommandsInfo,\n                                                                       Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdPreprocessGeneratedCommandsNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                          reinterpret_cast<const VkGeneratedCommandsInfoNV *>( pGeneratedCommandsInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::preprocessGeneratedCommandsNV( const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV & generatedCommandsInfo,\n                                                                       Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdPreprocessGeneratedCommandsNV && \"Function <vkCmdPreprocessGeneratedCommandsNV> requires <VK_NV_device_generated_commands>\" );\n#  endif\n\n    d.vkCmdPreprocessGeneratedCommandsNV( m_commandBuffer, reinterpret_cast<const VkGeneratedCommandsInfoNV *>( &generatedCommandsInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::executeGeneratedCommandsNV( VULKAN_HPP_NAMESPACE::Bool32                          isPreprocessed,\n                                                                    const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV * pGeneratedCommandsInfo,\n                                                                    Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdExecuteGeneratedCommandsNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                       static_cast<VkBool32>( isPreprocessed ),\n                                       reinterpret_cast<const VkGeneratedCommandsInfoNV *>( pGeneratedCommandsInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::executeGeneratedCommandsNV( VULKAN_HPP_NAMESPACE::Bool32                          isPreprocessed,\n                                                                    const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV & generatedCommandsInfo,\n                                                                    Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdExecuteGeneratedCommandsNV && \"Function <vkCmdExecuteGeneratedCommandsNV> requires <VK_NV_device_generated_commands>\" );\n#  endif\n\n    d.vkCmdExecuteGeneratedCommandsNV(\n      m_commandBuffer, static_cast<VkBool32>( isPreprocessed ), reinterpret_cast<const VkGeneratedCommandsInfoNV *>( &generatedCommandsInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindPipelineShaderGroupNV( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint,\n                                                                   VULKAN_HPP_NAMESPACE::Pipeline          pipeline,\n                                                                   uint32_t                                groupIndex,\n                                                                   Dispatch const &                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBindPipelineShaderGroupNV(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkPipelineBindPoint>( pipelineBindPoint ), static_cast<VkPipeline>( pipeline ), groupIndex );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::createIndirectCommandsLayoutNV( const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoNV * pCreateInfo,\n                                            const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                pAllocator,\n                                            VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV *                 pIndirectCommandsLayout,\n                                            Dispatch const &                                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateIndirectCommandsLayoutNV( static_cast<VkDevice>( m_device ),\n                                                                    reinterpret_cast<const VkIndirectCommandsLayoutCreateInfoNV *>( pCreateInfo ),\n                                                                    reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                                    reinterpret_cast<VkIndirectCommandsLayoutNV *>( pIndirectCommandsLayout ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV>::type\n                       Device::createIndirectCommandsLayoutNV( const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoNV & createInfo,\n                                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>        allocator,\n                                            Dispatch const &                                                 d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateIndirectCommandsLayoutNV && \"Function <vkCreateIndirectCommandsLayoutNV> requires <VK_NV_device_generated_commands>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV indirectCommandsLayout;\n    VULKAN_HPP_NAMESPACE::Result                   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateIndirectCommandsLayoutNV(\n      m_device,\n      reinterpret_cast<const VkIndirectCommandsLayoutCreateInfoNV *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkIndirectCommandsLayoutNV *>( &indirectCommandsLayout ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createIndirectCommandsLayoutNV\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( indirectCommandsLayout ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV, Dispatch>>::type\n                       Device::createIndirectCommandsLayoutNVUnique( const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoNV & createInfo,\n                                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>        allocator,\n                                                  Dispatch const &                                                 d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateIndirectCommandsLayoutNV && \"Function <vkCreateIndirectCommandsLayoutNV> requires <VK_NV_device_generated_commands>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV indirectCommandsLayout;\n    VULKAN_HPP_NAMESPACE::Result                   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateIndirectCommandsLayoutNV(\n      m_device,\n      reinterpret_cast<const VkIndirectCommandsLayoutCreateInfoNV *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkIndirectCommandsLayoutNV *>( &indirectCommandsLayout ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createIndirectCommandsLayoutNVUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result,\n                                                                UniqueHandle<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV, Dispatch>(\n                                                                  indirectCommandsLayout, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyIndirectCommandsLayoutNV( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV    indirectCommandsLayout,\n                                                                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                  Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyIndirectCommandsLayoutNV( static_cast<VkDevice>( m_device ),\n                                         static_cast<VkIndirectCommandsLayoutNV>( indirectCommandsLayout ),\n                                         reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyIndirectCommandsLayoutNV( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV            indirectCommandsLayout,\n                                                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                                  Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyIndirectCommandsLayoutNV && \"Function <vkDestroyIndirectCommandsLayoutNV> requires <VK_NV_device_generated_commands>\" );\n#  endif\n\n    d.vkDestroyIndirectCommandsLayoutNV(\n      m_device,\n      static_cast<VkIndirectCommandsLayoutNV>( indirectCommandsLayout ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV    indirectCommandsLayout,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyIndirectCommandsLayoutNV( static_cast<VkDevice>( m_device ),\n                                         static_cast<VkIndirectCommandsLayoutNV>( indirectCommandsLayout ),\n                                         reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV            indirectCommandsLayout,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyIndirectCommandsLayoutNV && \"Function <vkDestroyIndirectCommandsLayoutNV> requires <VK_NV_device_generated_commands>\" );\n#  endif\n\n    d.vkDestroyIndirectCommandsLayoutNV(\n      m_device,\n      static_cast<VkIndirectCommandsLayoutNV>( indirectCommandsLayout ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_depth_bias_control ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDepthBias2EXT( const VULKAN_HPP_NAMESPACE::DepthBiasInfoEXT * pDepthBiasInfo,\n                                                          Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDepthBias2EXT( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkDepthBiasInfoEXT *>( pDepthBiasInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDepthBias2EXT( const VULKAN_HPP_NAMESPACE::DepthBiasInfoEXT & depthBiasInfo,\n                                                          Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetDepthBias2EXT && \"Function <vkCmdSetDepthBias2EXT> requires <VK_EXT_depth_bias_control>\" );\n#  endif\n\n    d.vkCmdSetDepthBias2EXT( m_commandBuffer, reinterpret_cast<const VkDepthBiasInfoEXT *>( &depthBiasInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_acquire_drm_display ===\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::acquireDrmDisplayEXT( int32_t                          drmFd,\n                                                                                      VULKAN_HPP_NAMESPACE::DisplayKHR display,\n                                                                                      Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkAcquireDrmDisplayEXT( static_cast<VkPhysicalDevice>( m_physicalDevice ), drmFd, static_cast<VkDisplayKHR>( display ) ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    PhysicalDevice::acquireDrmDisplayEXT( int32_t drmFd, VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkAcquireDrmDisplayEXT && \"Function <vkAcquireDrmDisplayEXT> requires <VK_EXT_acquire_drm_display>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkAcquireDrmDisplayEXT( m_physicalDevice, drmFd, static_cast<VkDisplayKHR>( display ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::acquireDrmDisplayEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getDrmDisplayEXT( int32_t                            drmFd,\n                                                                                  uint32_t                           connectorId,\n                                                                                  VULKAN_HPP_NAMESPACE::DisplayKHR * display,\n                                                                                  Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkGetDrmDisplayEXT( static_cast<VkPhysicalDevice>( m_physicalDevice ), drmFd, connectorId, reinterpret_cast<VkDisplayKHR *>( display ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::DisplayKHR>::type\n                       PhysicalDevice::getDrmDisplayEXT( int32_t drmFd, uint32_t connectorId, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDrmDisplayEXT && \"Function <vkGetDrmDisplayEXT> requires <VK_EXT_acquire_drm_display>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::DisplayKHR display;\n    VULKAN_HPP_NAMESPACE::Result     result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetDrmDisplayEXT( m_physicalDevice, drmFd, connectorId, reinterpret_cast<VkDisplayKHR *>( &display ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDrmDisplayEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( display ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DisplayKHR, Dispatch>>::type\n                       PhysicalDevice::getDrmDisplayEXTUnique( int32_t drmFd, uint32_t connectorId, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDrmDisplayEXT && \"Function <vkGetDrmDisplayEXT> requires <VK_EXT_acquire_drm_display>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::DisplayKHR display;\n    VULKAN_HPP_NAMESPACE::Result     result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetDrmDisplayEXT( m_physicalDevice, drmFd, connectorId, reinterpret_cast<VkDisplayKHR *>( &display ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDrmDisplayEXTUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::DisplayKHR, Dispatch>( display, detail::ObjectRelease<PhysicalDevice, Dispatch>( *this, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_private_data ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createPrivateDataSlotEXT( const VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo * pCreateInfo,\n                                                                                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks *       pAllocator,\n                                                                                  VULKAN_HPP_NAMESPACE::PrivateDataSlot *                 pPrivateDataSlot,\n                                                                                  Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreatePrivateDataSlotEXT( static_cast<VkDevice>( m_device ),\n                                                              reinterpret_cast<const VkPrivateDataSlotCreateInfo *>( pCreateInfo ),\n                                                              reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                              reinterpret_cast<VkPrivateDataSlot *>( pPrivateDataSlot ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::PrivateDataSlot>::type\n                       Device::createPrivateDataSlotEXT( const VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo &   createInfo,\n                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                      Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreatePrivateDataSlotEXT && \"Function <vkCreatePrivateDataSlotEXT> requires <VK_EXT_private_data> or <VK_VERSION_1_3>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot;\n    VULKAN_HPP_NAMESPACE::Result          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreatePrivateDataSlotEXT(\n      m_device,\n      reinterpret_cast<const VkPrivateDataSlotCreateInfo *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPrivateDataSlot *>( &privateDataSlot ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createPrivateDataSlotEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( privateDataSlot ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::PrivateDataSlot, Dispatch>>::type\n                       Device::createPrivateDataSlotEXTUnique( const VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo &   createInfo,\n                                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                            Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreatePrivateDataSlotEXT && \"Function <vkCreatePrivateDataSlotEXT> requires <VK_EXT_private_data> or <VK_VERSION_1_3>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot;\n    VULKAN_HPP_NAMESPACE::Result          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreatePrivateDataSlotEXT(\n      m_device,\n      reinterpret_cast<const VkPrivateDataSlotCreateInfo *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkPrivateDataSlot *>( &privateDataSlot ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createPrivateDataSlotEXTUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result,\n      UniqueHandle<VULKAN_HPP_NAMESPACE::PrivateDataSlot, Dispatch>( privateDataSlot, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyPrivateDataSlotEXT( VULKAN_HPP_NAMESPACE::PrivateDataSlot             privateDataSlot,\n                                                            const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                            Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyPrivateDataSlotEXT(\n      static_cast<VkDevice>( m_device ), static_cast<VkPrivateDataSlot>( privateDataSlot ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyPrivateDataSlotEXT( VULKAN_HPP_NAMESPACE::PrivateDataSlot                     privateDataSlot,\n                                                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                            Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyPrivateDataSlotEXT && \"Function <vkDestroyPrivateDataSlotEXT> requires <VK_EXT_private_data> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkDestroyPrivateDataSlotEXT(\n      m_device,\n      static_cast<VkPrivateDataSlot>( privateDataSlot ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::setPrivateDataEXT( VULKAN_HPP_NAMESPACE::ObjectType      objectType_,\n                                                                           uint64_t                              objectHandle,\n                                                                           VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,\n                                                                           uint64_t                              data,\n                                                                           Dispatch const &                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkSetPrivateDataEXT(\n      static_cast<VkDevice>( m_device ), static_cast<VkObjectType>( objectType_ ), objectHandle, static_cast<VkPrivateDataSlot>( privateDataSlot ), data ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE typename ResultValueType<void>::type Device::setPrivateDataEXT( VULKAN_HPP_NAMESPACE::ObjectType      objectType_,\n                                                                                    uint64_t                              objectHandle,\n                                                                                    VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,\n                                                                                    uint64_t                              data,\n                                                                                    Dispatch const &                      d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkSetPrivateDataEXT && \"Function <vkSetPrivateDataEXT> requires <VK_EXT_private_data> or <VK_VERSION_1_3>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkSetPrivateDataEXT( m_device, static_cast<VkObjectType>( objectType_ ), objectHandle, static_cast<VkPrivateDataSlot>( privateDataSlot ), data ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::setPrivateDataEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getPrivateDataEXT( VULKAN_HPP_NAMESPACE::ObjectType      objectType_,\n                                                    uint64_t                              objectHandle,\n                                                    VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,\n                                                    uint64_t *                            pData,\n                                                    Dispatch const &                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPrivateDataEXT(\n      static_cast<VkDevice>( m_device ), static_cast<VkObjectType>( objectType_ ), objectHandle, static_cast<VkPrivateDataSlot>( privateDataSlot ), pData );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint64_t Device::getPrivateDataEXT( VULKAN_HPP_NAMESPACE::ObjectType      objectType_,\n                                                                             uint64_t                              objectHandle,\n                                                                             VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,\n                                                                             Dispatch const &                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPrivateDataEXT && \"Function <vkGetPrivateDataEXT> requires <VK_EXT_private_data> or <VK_VERSION_1_3>\" );\n#  endif\n\n    uint64_t data;\n    d.vkGetPrivateDataEXT( m_device, static_cast<VkObjectType>( objectType_ ), objectHandle, static_cast<VkPrivateDataSlot>( privateDataSlot ), &data );\n\n    return data;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_video_encode_queue ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    PhysicalDevice::getVideoEncodeQualityLevelPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeQualityLevelInfoKHR * pQualityLevelInfo,\n                                                             VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelPropertiesKHR *               pQualityLevelProperties,\n                                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                 reinterpret_cast<const VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR *>( pQualityLevelInfo ),\n                                                                 reinterpret_cast<VkVideoEncodeQualityLevelPropertiesKHR *>( pQualityLevelProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelPropertiesKHR>::type\n    PhysicalDevice::getVideoEncodeQualityLevelPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeQualityLevelInfoKHR & qualityLevelInfo,\n                                                             Dispatch const &                                                           d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR &&\n                       \"Function <vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR> requires <VK_KHR_video_encode_queue>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelPropertiesKHR qualityLevelProperties;\n    VULKAN_HPP_NAMESPACE::Result                               result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR( m_physicalDevice,\n                                                                 reinterpret_cast<const VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR *>( &qualityLevelInfo ),\n                                                                 reinterpret_cast<VkVideoEncodeQualityLevelPropertiesKHR *>( &qualityLevelProperties ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getVideoEncodeQualityLevelPropertiesKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( qualityLevelProperties ) );\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>>::type\n    PhysicalDevice::getVideoEncodeQualityLevelPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeQualityLevelInfoKHR & qualityLevelInfo,\n                                                             Dispatch const &                                                           d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR &&\n                       \"Function <vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR> requires <VK_KHR_video_encode_queue>\" );\n#  endif\n\n    StructureChain<X, Y, Z...>                                   structureChain;\n    VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelPropertiesKHR & qualityLevelProperties =\n      structureChain.template get<VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelPropertiesKHR>();\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR( m_physicalDevice,\n                                                                 reinterpret_cast<const VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR *>( &qualityLevelInfo ),\n                                                                 reinterpret_cast<VkVideoEncodeQualityLevelPropertiesKHR *>( &qualityLevelProperties ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getVideoEncodeQualityLevelPropertiesKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( structureChain ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::getEncodedVideoSessionParametersKHR( const VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersGetInfoKHR * pVideoSessionParametersInfo,\n                                                 VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR *  pFeedbackInfo,\n                                                 size_t *                                                             pDataSize,\n                                                 void *                                                               pData,\n                                                 Dispatch const &                                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkGetEncodedVideoSessionParametersKHR( static_cast<VkDevice>( m_device ),\n                                               reinterpret_cast<const VkVideoEncodeSessionParametersGetInfoKHR *>( pVideoSessionParametersInfo ),\n                                               reinterpret_cast<VkVideoEncodeSessionParametersFeedbackInfoKHR *>( pFeedbackInfo ),\n                                               pDataSize,\n                                               pData ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Uint8_tAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::pair<VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR, std::vector<uint8_t, Uint8_tAllocator>>>::type\n    Device::getEncodedVideoSessionParametersKHR( const VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersGetInfoKHR & videoSessionParametersInfo,\n                                                 Dispatch const &                                                     d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetEncodedVideoSessionParametersKHR && \"Function <vkGetEncodedVideoSessionParametersKHR> requires <VK_KHR_video_encode_queue>\" );\n#  endif\n\n    std::pair<VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR, std::vector<uint8_t, Uint8_tAllocator>> data_;\n    VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR &                                                  feedbackInfo = data_.first;\n    std::vector<uint8_t, Uint8_tAllocator> &                                                                             data         = data_.second;\n    size_t                                                                                                               dataSize;\n    VULKAN_HPP_NAMESPACE::Result                                                                                         result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetEncodedVideoSessionParametersKHR( m_device,\n                                                 reinterpret_cast<const VkVideoEncodeSessionParametersGetInfoKHR *>( &videoSessionParametersInfo ),\n                                                 reinterpret_cast<VkVideoEncodeSessionParametersFeedbackInfoKHR *>( &feedbackInfo ),\n                                                 &dataSize,\n                                                 nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && dataSize )\n      {\n        data.resize( dataSize );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetEncodedVideoSessionParametersKHR( m_device,\n                                                   reinterpret_cast<const VkVideoEncodeSessionParametersGetInfoKHR *>( &videoSessionParametersInfo ),\n                                                   reinterpret_cast<VkVideoEncodeSessionParametersFeedbackInfoKHR *>( &feedbackInfo ),\n                                                   &dataSize,\n                                                   reinterpret_cast<void *>( data.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getEncodedVideoSessionParametersKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data_ ) );\n  }\n\n  template <typename Uint8_tAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::pair<VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR, std::vector<uint8_t, Uint8_tAllocator>>>::type\n    Device::getEncodedVideoSessionParametersKHR( const VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersGetInfoKHR & videoSessionParametersInfo,\n                                                 Uint8_tAllocator &                                                   uint8_tAllocator,\n                                                 Dispatch const &                                                     d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetEncodedVideoSessionParametersKHR && \"Function <vkGetEncodedVideoSessionParametersKHR> requires <VK_KHR_video_encode_queue>\" );\n#  endif\n\n    std::pair<VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR, std::vector<uint8_t, Uint8_tAllocator>> data_(\n      std::piecewise_construct, std::forward_as_tuple(), std::forward_as_tuple( uint8_tAllocator ) );\n    VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR & feedbackInfo = data_.first;\n    std::vector<uint8_t, Uint8_tAllocator> &                            data         = data_.second;\n    size_t                                                              dataSize;\n    VULKAN_HPP_NAMESPACE::Result                                        result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetEncodedVideoSessionParametersKHR( m_device,\n                                                 reinterpret_cast<const VkVideoEncodeSessionParametersGetInfoKHR *>( &videoSessionParametersInfo ),\n                                                 reinterpret_cast<VkVideoEncodeSessionParametersFeedbackInfoKHR *>( &feedbackInfo ),\n                                                 &dataSize,\n                                                 nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && dataSize )\n      {\n        data.resize( dataSize );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetEncodedVideoSessionParametersKHR( m_device,\n                                                   reinterpret_cast<const VkVideoEncodeSessionParametersGetInfoKHR *>( &videoSessionParametersInfo ),\n                                                   reinterpret_cast<VkVideoEncodeSessionParametersFeedbackInfoKHR *>( &feedbackInfo ),\n                                                   &dataSize,\n                                                   reinterpret_cast<void *>( data.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getEncodedVideoSessionParametersKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data_ ) );\n  }\n\n  template <typename X,\n            typename Y,\n            typename... Z,\n            typename Uint8_tAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::pair<VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>, std::vector<uint8_t, Uint8_tAllocator>>>::type\n    Device::getEncodedVideoSessionParametersKHR( const VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersGetInfoKHR & videoSessionParametersInfo,\n                                                 Dispatch const &                                                     d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetEncodedVideoSessionParametersKHR && \"Function <vkGetEncodedVideoSessionParametersKHR> requires <VK_KHR_video_encode_queue>\" );\n#  endif\n\n    std::pair<VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>, std::vector<uint8_t, Uint8_tAllocator>> data_;\n    VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR &                                 feedbackInfo =\n      data_.first.template get<VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR>();\n    std::vector<uint8_t, Uint8_tAllocator> & data = data_.second;\n    size_t                                   dataSize;\n    VULKAN_HPP_NAMESPACE::Result             result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetEncodedVideoSessionParametersKHR( m_device,\n                                                 reinterpret_cast<const VkVideoEncodeSessionParametersGetInfoKHR *>( &videoSessionParametersInfo ),\n                                                 reinterpret_cast<VkVideoEncodeSessionParametersFeedbackInfoKHR *>( &feedbackInfo ),\n                                                 &dataSize,\n                                                 nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && dataSize )\n      {\n        data.resize( dataSize );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetEncodedVideoSessionParametersKHR( m_device,\n                                                   reinterpret_cast<const VkVideoEncodeSessionParametersGetInfoKHR *>( &videoSessionParametersInfo ),\n                                                   reinterpret_cast<VkVideoEncodeSessionParametersFeedbackInfoKHR *>( &feedbackInfo ),\n                                                   &dataSize,\n                                                   reinterpret_cast<void *>( data.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getEncodedVideoSessionParametersKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data_ ) );\n  }\n\n  template <typename X,\n            typename Y,\n            typename... Z,\n            typename Uint8_tAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::pair<VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>, std::vector<uint8_t, Uint8_tAllocator>>>::type\n    Device::getEncodedVideoSessionParametersKHR( const VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersGetInfoKHR & videoSessionParametersInfo,\n                                                 Uint8_tAllocator &                                                   uint8_tAllocator,\n                                                 Dispatch const &                                                     d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetEncodedVideoSessionParametersKHR && \"Function <vkGetEncodedVideoSessionParametersKHR> requires <VK_KHR_video_encode_queue>\" );\n#  endif\n\n    std::pair<VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>, std::vector<uint8_t, Uint8_tAllocator>> data_(\n      std::piecewise_construct, std::forward_as_tuple(), std::forward_as_tuple( uint8_tAllocator ) );\n    VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR & feedbackInfo =\n      data_.first.template get<VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR>();\n    std::vector<uint8_t, Uint8_tAllocator> & data = data_.second;\n    size_t                                   dataSize;\n    VULKAN_HPP_NAMESPACE::Result             result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetEncodedVideoSessionParametersKHR( m_device,\n                                                 reinterpret_cast<const VkVideoEncodeSessionParametersGetInfoKHR *>( &videoSessionParametersInfo ),\n                                                 reinterpret_cast<VkVideoEncodeSessionParametersFeedbackInfoKHR *>( &feedbackInfo ),\n                                                 &dataSize,\n                                                 nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && dataSize )\n      {\n        data.resize( dataSize );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetEncodedVideoSessionParametersKHR( m_device,\n                                                   reinterpret_cast<const VkVideoEncodeSessionParametersGetInfoKHR *>( &videoSessionParametersInfo ),\n                                                   reinterpret_cast<VkVideoEncodeSessionParametersFeedbackInfoKHR *>( &feedbackInfo ),\n                                                   &dataSize,\n                                                   reinterpret_cast<void *>( data.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getEncodedVideoSessionParametersKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data_ ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::encodeVideoKHR( const VULKAN_HPP_NAMESPACE::VideoEncodeInfoKHR * pEncodeInfo,\n                                                        Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdEncodeVideoKHR( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkVideoEncodeInfoKHR *>( pEncodeInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::encodeVideoKHR( const VULKAN_HPP_NAMESPACE::VideoEncodeInfoKHR & encodeInfo,\n                                                        Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdEncodeVideoKHR && \"Function <vkCmdEncodeVideoKHR> requires <VK_KHR_video_encode_queue>\" );\n#  endif\n\n    d.vkCmdEncodeVideoKHR( m_commandBuffer, reinterpret_cast<const VkVideoEncodeInfoKHR *>( &encodeInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  //=== VK_NV_cuda_kernel_launch ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createCudaModuleNV( const VULKAN_HPP_NAMESPACE::CudaModuleCreateInfoNV * pCreateInfo,\n                                                                            const VULKAN_HPP_NAMESPACE::AllocationCallbacks *    pAllocator,\n                                                                            VULKAN_HPP_NAMESPACE::CudaModuleNV *                 pModule,\n                                                                            Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateCudaModuleNV( static_cast<VkDevice>( m_device ),\n                                                        reinterpret_cast<const VkCudaModuleCreateInfoNV *>( pCreateInfo ),\n                                                        reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                        reinterpret_cast<VkCudaModuleNV *>( pModule ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::CudaModuleNV>::type\n                       Device::createCudaModuleNV( const VULKAN_HPP_NAMESPACE::CudaModuleCreateInfoNV &      createInfo,\n                                Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateCudaModuleNV && \"Function <vkCreateCudaModuleNV> requires <VK_NV_cuda_kernel_launch>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::CudaModuleNV module;\n    VULKAN_HPP_NAMESPACE::Result       result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateCudaModuleNV( m_device,\n                              reinterpret_cast<const VkCudaModuleCreateInfoNV *>( &createInfo ),\n                              reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                              reinterpret_cast<VkCudaModuleNV *>( &module ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createCudaModuleNV\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( module ) );\n  }\n\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::CudaModuleNV, Dispatch>>::type\n                       Device::createCudaModuleNVUnique( const VULKAN_HPP_NAMESPACE::CudaModuleCreateInfoNV &      createInfo,\n                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                      Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#      if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateCudaModuleNV && \"Function <vkCreateCudaModuleNV> requires <VK_NV_cuda_kernel_launch>\" );\n#      endif\n\n    VULKAN_HPP_NAMESPACE::CudaModuleNV module;\n    VULKAN_HPP_NAMESPACE::Result       result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateCudaModuleNV( m_device,\n                              reinterpret_cast<const VkCudaModuleCreateInfoNV *>( &createInfo ),\n                              reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                              reinterpret_cast<VkCudaModuleNV *>( &module ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createCudaModuleNVUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::CudaModuleNV, Dispatch>( module, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getCudaModuleCacheNV( VULKAN_HPP_NAMESPACE::CudaModuleNV module,\n                                                                              size_t *                           pCacheSize,\n                                                                              void *                             pCacheData,\n                                                                              Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetCudaModuleCacheNV( static_cast<VkDevice>( m_device ), static_cast<VkCudaModuleNV>( module ), pCacheSize, pCacheData ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Uint8_tAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<uint8_t, Uint8_tAllocator>>::type\n                       Device::getCudaModuleCacheNV( VULKAN_HPP_NAMESPACE::CudaModuleNV module, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetCudaModuleCacheNV && \"Function <vkGetCudaModuleCacheNV> requires <VK_NV_cuda_kernel_launch>\" );\n#    endif\n\n    std::vector<uint8_t, Uint8_tAllocator> cacheData;\n    size_t                                 cacheSize;\n    VULKAN_HPP_NAMESPACE::Result           result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetCudaModuleCacheNV( m_device, static_cast<VkCudaModuleNV>( module ), &cacheSize, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && cacheSize )\n      {\n        cacheData.resize( cacheSize );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetCudaModuleCacheNV( m_device, static_cast<VkCudaModuleNV>( module ), &cacheSize, reinterpret_cast<void *>( cacheData.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getCudaModuleCacheNV\" );\n    VULKAN_HPP_ASSERT( cacheSize <= cacheData.size() );\n    if ( cacheSize < cacheData.size() )\n    {\n      cacheData.resize( cacheSize );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( cacheData ) );\n  }\n\n  template <typename Uint8_tAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<uint8_t, Uint8_tAllocator>>::type\n                       Device::getCudaModuleCacheNV( VULKAN_HPP_NAMESPACE::CudaModuleNV module, Uint8_tAllocator & uint8_tAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetCudaModuleCacheNV && \"Function <vkGetCudaModuleCacheNV> requires <VK_NV_cuda_kernel_launch>\" );\n#    endif\n\n    std::vector<uint8_t, Uint8_tAllocator> cacheData( uint8_tAllocator );\n    size_t                                 cacheSize;\n    VULKAN_HPP_NAMESPACE::Result           result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetCudaModuleCacheNV( m_device, static_cast<VkCudaModuleNV>( module ), &cacheSize, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && cacheSize )\n      {\n        cacheData.resize( cacheSize );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetCudaModuleCacheNV( m_device, static_cast<VkCudaModuleNV>( module ), &cacheSize, reinterpret_cast<void *>( cacheData.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getCudaModuleCacheNV\" );\n    VULKAN_HPP_ASSERT( cacheSize <= cacheData.size() );\n    if ( cacheSize < cacheData.size() )\n    {\n      cacheData.resize( cacheSize );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( cacheData ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createCudaFunctionNV( const VULKAN_HPP_NAMESPACE::CudaFunctionCreateInfoNV * pCreateInfo,\n                                                                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks *      pAllocator,\n                                                                              VULKAN_HPP_NAMESPACE::CudaFunctionNV *                 pFunction,\n                                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateCudaFunctionNV( static_cast<VkDevice>( m_device ),\n                                                          reinterpret_cast<const VkCudaFunctionCreateInfoNV *>( pCreateInfo ),\n                                                          reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                          reinterpret_cast<VkCudaFunctionNV *>( pFunction ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::CudaFunctionNV>::type\n                       Device::createCudaFunctionNV( const VULKAN_HPP_NAMESPACE::CudaFunctionCreateInfoNV &    createInfo,\n                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                  Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateCudaFunctionNV && \"Function <vkCreateCudaFunctionNV> requires <VK_NV_cuda_kernel_launch>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::CudaFunctionNV function;\n    VULKAN_HPP_NAMESPACE::Result         result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateCudaFunctionNV( m_device,\n                                reinterpret_cast<const VkCudaFunctionCreateInfoNV *>( &createInfo ),\n                                reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                                reinterpret_cast<VkCudaFunctionNV *>( &function ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createCudaFunctionNV\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( function ) );\n  }\n\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::CudaFunctionNV, Dispatch>>::type\n                       Device::createCudaFunctionNVUnique( const VULKAN_HPP_NAMESPACE::CudaFunctionCreateInfoNV &    createInfo,\n                                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                        Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#      if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateCudaFunctionNV && \"Function <vkCreateCudaFunctionNV> requires <VK_NV_cuda_kernel_launch>\" );\n#      endif\n\n    VULKAN_HPP_NAMESPACE::CudaFunctionNV function;\n    VULKAN_HPP_NAMESPACE::Result         result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateCudaFunctionNV( m_device,\n                                reinterpret_cast<const VkCudaFunctionCreateInfoNV *>( &createInfo ),\n                                reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                                reinterpret_cast<VkCudaFunctionNV *>( &function ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createCudaFunctionNVUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::CudaFunctionNV, Dispatch>( function, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyCudaModuleNV( VULKAN_HPP_NAMESPACE::CudaModuleNV                module,\n                                                      const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                      Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyCudaModuleNV(\n      static_cast<VkDevice>( m_device ), static_cast<VkCudaModuleNV>( module ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyCudaModuleNV( VULKAN_HPP_NAMESPACE::CudaModuleNV                        module,\n                                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                      Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyCudaModuleNV && \"Function <vkDestroyCudaModuleNV> requires <VK_NV_cuda_kernel_launch>\" );\n#    endif\n\n    d.vkDestroyCudaModuleNV( m_device,\n                             static_cast<VkCudaModuleNV>( module ),\n                             reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::CudaModuleNV                module,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyCudaModuleNV(\n      static_cast<VkDevice>( m_device ), static_cast<VkCudaModuleNV>( module ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::CudaModuleNV                        module,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyCudaModuleNV && \"Function <vkDestroyCudaModuleNV> requires <VK_NV_cuda_kernel_launch>\" );\n#    endif\n\n    d.vkDestroyCudaModuleNV( m_device,\n                             static_cast<VkCudaModuleNV>( module ),\n                             reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyCudaFunctionNV( VULKAN_HPP_NAMESPACE::CudaFunctionNV              function,\n                                                        const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                        Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyCudaFunctionNV(\n      static_cast<VkDevice>( m_device ), static_cast<VkCudaFunctionNV>( function ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyCudaFunctionNV( VULKAN_HPP_NAMESPACE::CudaFunctionNV                      function,\n                                                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                        Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyCudaFunctionNV && \"Function <vkDestroyCudaFunctionNV> requires <VK_NV_cuda_kernel_launch>\" );\n#    endif\n\n    d.vkDestroyCudaFunctionNV( m_device,\n                               static_cast<VkCudaFunctionNV>( function ),\n                               reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::CudaFunctionNV              function,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyCudaFunctionNV(\n      static_cast<VkDevice>( m_device ), static_cast<VkCudaFunctionNV>( function ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::CudaFunctionNV                      function,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyCudaFunctionNV && \"Function <vkDestroyCudaFunctionNV> requires <VK_NV_cuda_kernel_launch>\" );\n#    endif\n\n    d.vkDestroyCudaFunctionNV( m_device,\n                               static_cast<VkCudaFunctionNV>( function ),\n                               reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::cudaLaunchKernelNV( const VULKAN_HPP_NAMESPACE::CudaLaunchInfoNV * pLaunchInfo,\n                                                            Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCudaLaunchKernelNV( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkCudaLaunchInfoNV *>( pLaunchInfo ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::cudaLaunchKernelNV( const VULKAN_HPP_NAMESPACE::CudaLaunchInfoNV & launchInfo,\n                                                            Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdCudaLaunchKernelNV && \"Function <vkCmdCudaLaunchKernelNV> requires <VK_NV_cuda_kernel_launch>\" );\n#    endif\n\n    d.vkCmdCudaLaunchKernelNV( m_commandBuffer, reinterpret_cast<const VkCudaLaunchInfoNV *>( &launchInfo ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  //=== VK_EXT_metal_objects ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::exportMetalObjectsEXT( VULKAN_HPP_NAMESPACE::ExportMetalObjectsInfoEXT * pMetalObjectsInfo,\n                                                        Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkExportMetalObjectsEXT( static_cast<VkDevice>( m_device ), reinterpret_cast<VkExportMetalObjectsInfoEXT *>( pMetalObjectsInfo ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ExportMetalObjectsInfoEXT\n                                         Device::exportMetalObjectsEXT( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkExportMetalObjectsEXT && \"Function <vkExportMetalObjectsEXT> requires <VK_EXT_metal_objects>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::ExportMetalObjectsInfoEXT metalObjectsInfo;\n    d.vkExportMetalObjectsEXT( m_device, reinterpret_cast<VkExportMetalObjectsInfoEXT *>( &metalObjectsInfo ) );\n\n    return metalObjectsInfo;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                                         Device::exportMetalObjectsEXT( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkExportMetalObjectsEXT && \"Function <vkExportMetalObjectsEXT> requires <VK_EXT_metal_objects>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>  structureChain;\n    VULKAN_HPP_NAMESPACE::ExportMetalObjectsInfoEXT & metalObjectsInfo = structureChain.template get<VULKAN_HPP_NAMESPACE::ExportMetalObjectsInfoEXT>();\n    d.vkExportMetalObjectsEXT( m_device, reinterpret_cast<VkExportMetalObjectsInfoEXT *>( &metalObjectsInfo ) );\n\n    return structureChain;\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_METAL_EXT*/\n\n  //=== VK_KHR_synchronization2 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setEvent2KHR( VULKAN_HPP_NAMESPACE::Event                  event,\n                                                      const VULKAN_HPP_NAMESPACE::DependencyInfo * pDependencyInfo,\n                                                      Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetEvent2KHR(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkEvent>( event ), reinterpret_cast<const VkDependencyInfo *>( pDependencyInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setEvent2KHR( VULKAN_HPP_NAMESPACE::Event                  event,\n                                                      const VULKAN_HPP_NAMESPACE::DependencyInfo & dependencyInfo,\n                                                      Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetEvent2KHR && \"Function <vkCmdSetEvent2KHR> requires <VK_KHR_synchronization2> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkCmdSetEvent2KHR( m_commandBuffer, static_cast<VkEvent>( event ), reinterpret_cast<const VkDependencyInfo *>( &dependencyInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::resetEvent2KHR( VULKAN_HPP_NAMESPACE::Event               event,\n                                                        VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stageMask,\n                                                        Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdResetEvent2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkEvent>( event ), static_cast<VkPipelineStageFlags2>( stageMask ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::waitEvents2KHR( uint32_t                                     eventCount,\n                                                        const VULKAN_HPP_NAMESPACE::Event *          pEvents,\n                                                        const VULKAN_HPP_NAMESPACE::DependencyInfo * pDependencyInfos,\n                                                        Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdWaitEvents2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                           eventCount,\n                           reinterpret_cast<const VkEvent *>( pEvents ),\n                           reinterpret_cast<const VkDependencyInfo *>( pDependencyInfos ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::waitEvents2KHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Event> const &          events,\n                                                        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DependencyInfo> const & dependencyInfos,\n                                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdWaitEvents2KHR && \"Function <vkCmdWaitEvents2KHR> requires <VK_KHR_synchronization2> or <VK_VERSION_1_3>\" );\n#  endif\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n    VULKAN_HPP_ASSERT( events.size() == dependencyInfos.size() );\n#  else\n    if ( events.size() != dependencyInfos.size() )\n    {\n      throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::waitEvents2KHR: events.size() != dependencyInfos.size()\" );\n    }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n    d.vkCmdWaitEvents2KHR( m_commandBuffer,\n                           events.size(),\n                           reinterpret_cast<const VkEvent *>( events.data() ),\n                           reinterpret_cast<const VkDependencyInfo *>( dependencyInfos.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::pipelineBarrier2KHR( const VULKAN_HPP_NAMESPACE::DependencyInfo * pDependencyInfo,\n                                                             Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdPipelineBarrier2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkDependencyInfo *>( pDependencyInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::pipelineBarrier2KHR( const VULKAN_HPP_NAMESPACE::DependencyInfo & dependencyInfo,\n                                                             Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdPipelineBarrier2KHR && \"Function <vkCmdPipelineBarrier2KHR> requires <VK_KHR_synchronization2> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkCmdPipelineBarrier2KHR( m_commandBuffer, reinterpret_cast<const VkDependencyInfo *>( &dependencyInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::writeTimestamp2KHR( VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stage,\n                                                            VULKAN_HPP_NAMESPACE::QueryPool           queryPool,\n                                                            uint32_t                                  query,\n                                                            Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdWriteTimestamp2KHR(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkPipelineStageFlags2>( stage ), static_cast<VkQueryPool>( queryPool ), query );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Queue::submit2KHR( uint32_t                                  submitCount,\n                                                                   const VULKAN_HPP_NAMESPACE::SubmitInfo2 * pSubmits,\n                                                                   VULKAN_HPP_NAMESPACE::Fence               fence,\n                                                                   Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkQueueSubmit2KHR( static_cast<VkQueue>( m_queue ), submitCount, reinterpret_cast<const VkSubmitInfo2 *>( pSubmits ), static_cast<VkFence>( fence ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type Queue::submit2KHR(\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SubmitInfo2> const & submits, VULKAN_HPP_NAMESPACE::Fence fence, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkQueueSubmit2KHR && \"Function <vkQueueSubmit2KHR> requires <VK_KHR_synchronization2> or <VK_VERSION_1_3>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkQueueSubmit2KHR( m_queue, submits.size(), reinterpret_cast<const VkSubmitInfo2 *>( submits.data() ), static_cast<VkFence>( fence ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Queue::submit2KHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_descriptor_buffer ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getDescriptorSetLayoutSizeEXT( VULKAN_HPP_NAMESPACE::DescriptorSetLayout layout,\n                                                                VULKAN_HPP_NAMESPACE::DeviceSize *        pLayoutSizeInBytes,\n                                                                Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetDescriptorSetLayoutSizeEXT(\n      static_cast<VkDevice>( m_device ), static_cast<VkDescriptorSetLayout>( layout ), reinterpret_cast<VkDeviceSize *>( pLayoutSizeInBytes ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceSize\n    Device::getDescriptorSetLayoutSizeEXT( VULKAN_HPP_NAMESPACE::DescriptorSetLayout layout, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDescriptorSetLayoutSizeEXT && \"Function <vkGetDescriptorSetLayoutSizeEXT> requires <VK_EXT_descriptor_buffer>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::DeviceSize layoutSizeInBytes;\n    d.vkGetDescriptorSetLayoutSizeEXT( m_device, static_cast<VkDescriptorSetLayout>( layout ), reinterpret_cast<VkDeviceSize *>( &layoutSizeInBytes ) );\n\n    return layoutSizeInBytes;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getDescriptorSetLayoutBindingOffsetEXT( VULKAN_HPP_NAMESPACE::DescriptorSetLayout layout,\n                                                                         uint32_t                                  binding,\n                                                                         VULKAN_HPP_NAMESPACE::DeviceSize *        pOffset,\n                                                                         Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetDescriptorSetLayoutBindingOffsetEXT(\n      static_cast<VkDevice>( m_device ), static_cast<VkDescriptorSetLayout>( layout ), binding, reinterpret_cast<VkDeviceSize *>( pOffset ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceSize Device::getDescriptorSetLayoutBindingOffsetEXT(\n    VULKAN_HPP_NAMESPACE::DescriptorSetLayout layout, uint32_t binding, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDescriptorSetLayoutBindingOffsetEXT &&\n                       \"Function <vkGetDescriptorSetLayoutBindingOffsetEXT> requires <VK_EXT_descriptor_buffer>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::DeviceSize offset;\n    d.vkGetDescriptorSetLayoutBindingOffsetEXT( m_device, static_cast<VkDescriptorSetLayout>( layout ), binding, reinterpret_cast<VkDeviceSize *>( &offset ) );\n\n    return offset;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getDescriptorEXT( const VULKAN_HPP_NAMESPACE::DescriptorGetInfoEXT * pDescriptorInfo,\n                                                   size_t                                             dataSize,\n                                                   void *                                             pDescriptor,\n                                                   Dispatch const &                                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetDescriptorEXT( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkDescriptorGetInfoEXT *>( pDescriptorInfo ), dataSize, pDescriptor );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getDescriptorEXT( const VULKAN_HPP_NAMESPACE::DescriptorGetInfoEXT & descriptorInfo,\n                                                   size_t                                             dataSize,\n                                                   void *                                             pDescriptor,\n                                                   Dispatch const &                                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDescriptorEXT && \"Function <vkGetDescriptorEXT> requires <VK_EXT_descriptor_buffer>\" );\n#  endif\n\n    d.vkGetDescriptorEXT( m_device, reinterpret_cast<const VkDescriptorGetInfoEXT *>( &descriptorInfo ), dataSize, pDescriptor );\n  }\n\n  template <typename DescriptorType, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE DescriptorType Device::getDescriptorEXT( const VULKAN_HPP_NAMESPACE::DescriptorGetInfoEXT & descriptorInfo,\n                                                                                  Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDescriptorEXT && \"Function <vkGetDescriptorEXT> requires <VK_EXT_descriptor_buffer>\" );\n#  endif\n\n    DescriptorType descriptor;\n    d.vkGetDescriptorEXT(\n      m_device, reinterpret_cast<const VkDescriptorGetInfoEXT *>( &descriptorInfo ), sizeof( DescriptorType ), reinterpret_cast<void *>( &descriptor ) );\n\n    return descriptor;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindDescriptorBuffersEXT( uint32_t                                                     bufferCount,\n                                                                  const VULKAN_HPP_NAMESPACE::DescriptorBufferBindingInfoEXT * pBindingInfos,\n                                                                  Dispatch const &                                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBindDescriptorBuffersEXT(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), bufferCount, reinterpret_cast<const VkDescriptorBufferBindingInfoEXT *>( pBindingInfos ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::bindDescriptorBuffersEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DescriptorBufferBindingInfoEXT> const & bindingInfos,\n                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBindDescriptorBuffersEXT && \"Function <vkCmdBindDescriptorBuffersEXT> requires <VK_EXT_descriptor_buffer>\" );\n#  endif\n\n    d.vkCmdBindDescriptorBuffersEXT( m_commandBuffer, bindingInfos.size(), reinterpret_cast<const VkDescriptorBufferBindingInfoEXT *>( bindingInfos.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDescriptorBufferOffsetsEXT( VULKAN_HPP_NAMESPACE::PipelineBindPoint  pipelineBindPoint,\n                                                                       VULKAN_HPP_NAMESPACE::PipelineLayout     layout,\n                                                                       uint32_t                                 firstSet,\n                                                                       uint32_t                                 setCount,\n                                                                       const uint32_t *                         pBufferIndices,\n                                                                       const VULKAN_HPP_NAMESPACE::DeviceSize * pOffsets,\n                                                                       Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDescriptorBufferOffsetsEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                          static_cast<VkPipelineBindPoint>( pipelineBindPoint ),\n                                          static_cast<VkPipelineLayout>( layout ),\n                                          firstSet,\n                                          setCount,\n                                          pBufferIndices,\n                                          reinterpret_cast<const VkDeviceSize *>( pOffsets ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDescriptorBufferOffsetsEXT( VULKAN_HPP_NAMESPACE::PipelineBindPoint                  pipelineBindPoint,\n                                                                       VULKAN_HPP_NAMESPACE::PipelineLayout                     layout,\n                                                                       uint32_t                                                 firstSet,\n                                                                       VULKAN_HPP_NAMESPACE::ArrayProxy<const uint32_t> const & bufferIndices,\n                                                                       VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & offsets,\n                                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetDescriptorBufferOffsetsEXT && \"Function <vkCmdSetDescriptorBufferOffsetsEXT> requires <VK_EXT_descriptor_buffer>\" );\n#  endif\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n    VULKAN_HPP_ASSERT( bufferIndices.size() == offsets.size() );\n#  else\n    if ( bufferIndices.size() != offsets.size() )\n    {\n      throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::setDescriptorBufferOffsetsEXT: bufferIndices.size() != offsets.size()\" );\n    }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n    d.vkCmdSetDescriptorBufferOffsetsEXT( m_commandBuffer,\n                                          static_cast<VkPipelineBindPoint>( pipelineBindPoint ),\n                                          static_cast<VkPipelineLayout>( layout ),\n                                          firstSet,\n                                          bufferIndices.size(),\n                                          bufferIndices.data(),\n                                          reinterpret_cast<const VkDeviceSize *>( offsets.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindDescriptorBufferEmbeddedSamplersEXT( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint,\n                                                                                 VULKAN_HPP_NAMESPACE::PipelineLayout    layout,\n                                                                                 uint32_t                                set,\n                                                                                 Dispatch const &                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBindDescriptorBufferEmbeddedSamplersEXT(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkPipelineBindPoint>( pipelineBindPoint ), static_cast<VkPipelineLayout>( layout ), set );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getBufferOpaqueCaptureDescriptorDataEXT(\n    const VULKAN_HPP_NAMESPACE::BufferCaptureDescriptorDataInfoEXT * pInfo, void * pData, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetBufferOpaqueCaptureDescriptorDataEXT(\n      static_cast<VkDevice>( m_device ), reinterpret_cast<const VkBufferCaptureDescriptorDataInfoEXT *>( pInfo ), pData ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename DataType, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<DataType>::type\n    Device::getBufferOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::BufferCaptureDescriptorDataInfoEXT & info, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetBufferOpaqueCaptureDescriptorDataEXT &&\n                       \"Function <vkGetBufferOpaqueCaptureDescriptorDataEXT> requires <VK_EXT_descriptor_buffer>\" );\n#  endif\n\n    DataType                     data;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetBufferOpaqueCaptureDescriptorDataEXT( m_device, reinterpret_cast<const VkBufferCaptureDescriptorDataInfoEXT *>( &info ), &data ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getBufferOpaqueCaptureDescriptorDataEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getImageOpaqueCaptureDescriptorDataEXT(\n    const VULKAN_HPP_NAMESPACE::ImageCaptureDescriptorDataInfoEXT * pInfo, void * pData, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetImageOpaqueCaptureDescriptorDataEXT(\n      static_cast<VkDevice>( m_device ), reinterpret_cast<const VkImageCaptureDescriptorDataInfoEXT *>( pInfo ), pData ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename DataType, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<DataType>::type\n    Device::getImageOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::ImageCaptureDescriptorDataInfoEXT & info, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetImageOpaqueCaptureDescriptorDataEXT &&\n                       \"Function <vkGetImageOpaqueCaptureDescriptorDataEXT> requires <VK_EXT_descriptor_buffer>\" );\n#  endif\n\n    DataType                     data;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetImageOpaqueCaptureDescriptorDataEXT( m_device, reinterpret_cast<const VkImageCaptureDescriptorDataInfoEXT *>( &info ), &data ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getImageOpaqueCaptureDescriptorDataEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getImageViewOpaqueCaptureDescriptorDataEXT(\n    const VULKAN_HPP_NAMESPACE::ImageViewCaptureDescriptorDataInfoEXT * pInfo, void * pData, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetImageViewOpaqueCaptureDescriptorDataEXT(\n      static_cast<VkDevice>( m_device ), reinterpret_cast<const VkImageViewCaptureDescriptorDataInfoEXT *>( pInfo ), pData ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename DataType, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<DataType>::type\n    Device::getImageViewOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::ImageViewCaptureDescriptorDataInfoEXT & info, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetImageViewOpaqueCaptureDescriptorDataEXT &&\n                       \"Function <vkGetImageViewOpaqueCaptureDescriptorDataEXT> requires <VK_EXT_descriptor_buffer>\" );\n#  endif\n\n    DataType                     data;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetImageViewOpaqueCaptureDescriptorDataEXT( m_device, reinterpret_cast<const VkImageViewCaptureDescriptorDataInfoEXT *>( &info ), &data ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getImageViewOpaqueCaptureDescriptorDataEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getSamplerOpaqueCaptureDescriptorDataEXT(\n    const VULKAN_HPP_NAMESPACE::SamplerCaptureDescriptorDataInfoEXT * pInfo, void * pData, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetSamplerOpaqueCaptureDescriptorDataEXT(\n      static_cast<VkDevice>( m_device ), reinterpret_cast<const VkSamplerCaptureDescriptorDataInfoEXT *>( pInfo ), pData ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename DataType, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<DataType>::type\n    Device::getSamplerOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::SamplerCaptureDescriptorDataInfoEXT & info, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetSamplerOpaqueCaptureDescriptorDataEXT &&\n                       \"Function <vkGetSamplerOpaqueCaptureDescriptorDataEXT> requires <VK_EXT_descriptor_buffer>\" );\n#  endif\n\n    DataType                     data;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetSamplerOpaqueCaptureDescriptorDataEXT( m_device, reinterpret_cast<const VkSamplerCaptureDescriptorDataInfoEXT *>( &info ), &data ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getSamplerOpaqueCaptureDescriptorDataEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getAccelerationStructureOpaqueCaptureDescriptorDataEXT(\n    const VULKAN_HPP_NAMESPACE::AccelerationStructureCaptureDescriptorDataInfoEXT * pInfo, void * pData, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT(\n      static_cast<VkDevice>( m_device ), reinterpret_cast<const VkAccelerationStructureCaptureDescriptorDataInfoEXT *>( pInfo ), pData ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename DataType, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<DataType>::type\n    Device::getAccelerationStructureOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::AccelerationStructureCaptureDescriptorDataInfoEXT & info,\n                                                                    Dispatch const &                                                                d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT &&\n                       \"Function <vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT> requires <VK_EXT_descriptor_buffer>\" );\n#  endif\n\n    DataType                     data;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT(\n      m_device, reinterpret_cast<const VkAccelerationStructureCaptureDescriptorDataInfoEXT *>( &info ), &data ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getAccelerationStructureOpaqueCaptureDescriptorDataEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_NV_fragment_shading_rate_enums ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setFragmentShadingRateEnumNV( VULKAN_HPP_NAMESPACE::FragmentShadingRateNV                  shadingRate,\n                                                                      const VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR combinerOps[2],\n                                                                      Dispatch const &                                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetFragmentShadingRateEnumNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                         static_cast<VkFragmentShadingRateNV>( shadingRate ),\n                                         reinterpret_cast<const VkFragmentShadingRateCombinerOpKHR *>( combinerOps ) );\n  }\n\n  //=== VK_EXT_mesh_shader ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::drawMeshTasksEXT( uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDrawMeshTasksEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), groupCountX, groupCountY, groupCountZ );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::drawMeshTasksIndirectEXT( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                                  VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                                  uint32_t                         drawCount,\n                                                                  uint32_t                         stride,\n                                                                  Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDrawMeshTasksIndirectEXT(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBuffer>( buffer ), static_cast<VkDeviceSize>( offset ), drawCount, stride );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::drawMeshTasksIndirectCountEXT( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                                       VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                                       VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                                                       VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                                                       uint32_t                         maxDrawCount,\n                                                                       uint32_t                         stride,\n                                                                       Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDrawMeshTasksIndirectCountEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                          static_cast<VkBuffer>( buffer ),\n                                          static_cast<VkDeviceSize>( offset ),\n                                          static_cast<VkBuffer>( countBuffer ),\n                                          static_cast<VkDeviceSize>( countBufferOffset ),\n                                          maxDrawCount,\n                                          stride );\n  }\n\n  //=== VK_KHR_copy_commands2 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyBuffer2KHR( const VULKAN_HPP_NAMESPACE::CopyBufferInfo2 * pCopyBufferInfo,\n                                                        Dispatch const &                              d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCopyBuffer2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkCopyBufferInfo2 *>( pCopyBufferInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyBuffer2KHR( const VULKAN_HPP_NAMESPACE::CopyBufferInfo2 & copyBufferInfo,\n                                                        Dispatch const &                              d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdCopyBuffer2KHR && \"Function <vkCmdCopyBuffer2KHR> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkCmdCopyBuffer2KHR( m_commandBuffer, reinterpret_cast<const VkCopyBufferInfo2 *>( &copyBufferInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyImage2KHR( const VULKAN_HPP_NAMESPACE::CopyImageInfo2 * pCopyImageInfo,\n                                                       Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCopyImage2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkCopyImageInfo2 *>( pCopyImageInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyImage2KHR( const VULKAN_HPP_NAMESPACE::CopyImageInfo2 & copyImageInfo,\n                                                       Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdCopyImage2KHR && \"Function <vkCmdCopyImage2KHR> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkCmdCopyImage2KHR( m_commandBuffer, reinterpret_cast<const VkCopyImageInfo2 *>( &copyImageInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyBufferToImage2KHR( const VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2 * pCopyBufferToImageInfo,\n                                                               Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCopyBufferToImage2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                  reinterpret_cast<const VkCopyBufferToImageInfo2 *>( pCopyBufferToImageInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyBufferToImage2KHR( const VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2 & copyBufferToImageInfo,\n                                                               Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdCopyBufferToImage2KHR && \"Function <vkCmdCopyBufferToImage2KHR> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkCmdCopyBufferToImage2KHR( m_commandBuffer, reinterpret_cast<const VkCopyBufferToImageInfo2 *>( &copyBufferToImageInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyImageToBuffer2KHR( const VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2 * pCopyImageToBufferInfo,\n                                                               Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCopyImageToBuffer2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                  reinterpret_cast<const VkCopyImageToBufferInfo2 *>( pCopyImageToBufferInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyImageToBuffer2KHR( const VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2 & copyImageToBufferInfo,\n                                                               Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdCopyImageToBuffer2KHR && \"Function <vkCmdCopyImageToBuffer2KHR> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkCmdCopyImageToBuffer2KHR( m_commandBuffer, reinterpret_cast<const VkCopyImageToBufferInfo2 *>( &copyImageToBufferInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::blitImage2KHR( const VULKAN_HPP_NAMESPACE::BlitImageInfo2 * pBlitImageInfo,\n                                                       Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBlitImage2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkBlitImageInfo2 *>( pBlitImageInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::blitImage2KHR( const VULKAN_HPP_NAMESPACE::BlitImageInfo2 & blitImageInfo,\n                                                       Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBlitImage2KHR && \"Function <vkCmdBlitImage2KHR> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkCmdBlitImage2KHR( m_commandBuffer, reinterpret_cast<const VkBlitImageInfo2 *>( &blitImageInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::resolveImage2KHR( const VULKAN_HPP_NAMESPACE::ResolveImageInfo2 * pResolveImageInfo,\n                                                          Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdResolveImage2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkResolveImageInfo2 *>( pResolveImageInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::resolveImage2KHR( const VULKAN_HPP_NAMESPACE::ResolveImageInfo2 & resolveImageInfo,\n                                                          Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdResolveImage2KHR && \"Function <vkCmdResolveImage2KHR> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n#  endif\n\n    d.vkCmdResolveImage2KHR( m_commandBuffer, reinterpret_cast<const VkResolveImageInfo2 *>( &resolveImageInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_device_fault ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getFaultInfoEXT( VULKAN_HPP_NAMESPACE::DeviceFaultCountsEXT * pFaultCounts,\n                                                                         VULKAN_HPP_NAMESPACE::DeviceFaultInfoEXT *   pFaultInfo,\n                                                                         Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetDeviceFaultInfoEXT(\n      static_cast<VkDevice>( m_device ), reinterpret_cast<VkDeviceFaultCountsEXT *>( pFaultCounts ), reinterpret_cast<VkDeviceFaultInfoEXT *>( pFaultInfo ) ) );\n  }\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_NV_acquire_winrt_display ===\n\n#  ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::acquireWinrtDisplayNV( VULKAN_HPP_NAMESPACE::DisplayKHR display,\n                                                                                       Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkAcquireWinrtDisplayNV( static_cast<VkPhysicalDevice>( m_physicalDevice ), static_cast<VkDisplayKHR>( display ) ) );\n  }\n#  else\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    PhysicalDevice::acquireWinrtDisplayNV( VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkAcquireWinrtDisplayNV && \"Function <vkAcquireWinrtDisplayNV> requires <VK_NV_acquire_winrt_display>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkAcquireWinrtDisplayNV( m_physicalDevice, static_cast<VkDisplayKHR>( display ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::acquireWinrtDisplayNV\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getWinrtDisplayNV( uint32_t                           deviceRelativeId,\n                                                                                   VULKAN_HPP_NAMESPACE::DisplayKHR * pDisplay,\n                                                                                   Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkGetWinrtDisplayNV( static_cast<VkPhysicalDevice>( m_physicalDevice ), deviceRelativeId, reinterpret_cast<VkDisplayKHR *>( pDisplay ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::DisplayKHR>::type\n                       PhysicalDevice::getWinrtDisplayNV( uint32_t deviceRelativeId, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetWinrtDisplayNV && \"Function <vkGetWinrtDisplayNV> requires <VK_NV_acquire_winrt_display>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::DisplayKHR display;\n    VULKAN_HPP_NAMESPACE::Result     result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetWinrtDisplayNV( m_physicalDevice, deviceRelativeId, reinterpret_cast<VkDisplayKHR *>( &display ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getWinrtDisplayNV\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( display ) );\n  }\n\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DisplayKHR, Dispatch>>::type\n                       PhysicalDevice::getWinrtDisplayNVUnique( uint32_t deviceRelativeId, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#      if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetWinrtDisplayNV && \"Function <vkGetWinrtDisplayNV> requires <VK_NV_acquire_winrt_display>\" );\n#      endif\n\n    VULKAN_HPP_NAMESPACE::DisplayKHR display;\n    VULKAN_HPP_NAMESPACE::Result     result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetWinrtDisplayNV( m_physicalDevice, deviceRelativeId, reinterpret_cast<VkDisplayKHR *>( &display ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getWinrtDisplayNVUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::DisplayKHR, Dispatch>( display, detail::ObjectRelease<PhysicalDevice, Dispatch>( *this, d ) ) );\n  }\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n  //=== VK_EXT_directfb_surface ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Instance::createDirectFBSurfaceEXT( const VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateInfoEXT * pCreateInfo,\n                                                                                    const VULKAN_HPP_NAMESPACE::AllocationCallbacks *          pAllocator,\n                                                                                    VULKAN_HPP_NAMESPACE::SurfaceKHR *                         pSurface,\n                                                                                    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateDirectFBSurfaceEXT( static_cast<VkInstance>( m_instance ),\n                                                              reinterpret_cast<const VkDirectFBSurfaceCreateInfoEXT *>( pCreateInfo ),\n                                                              reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                              reinterpret_cast<VkSurfaceKHR *>( pSurface ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n                       Instance::createDirectFBSurfaceEXT( const VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateInfoEXT & createInfo,\n                                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>  allocator,\n                                        Dispatch const &                                           d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateDirectFBSurfaceEXT && \"Function <vkCreateDirectFBSurfaceEXT> requires <VK_EXT_directfb_surface>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateDirectFBSurfaceEXT(\n      m_instance,\n      reinterpret_cast<const VkDirectFBSurfaceCreateInfoEXT *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createDirectFBSurfaceEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( surface ) );\n  }\n\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n                       Instance::createDirectFBSurfaceEXTUnique( const VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateInfoEXT & createInfo,\n                                              Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>  allocator,\n                                              Dispatch const &                                           d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#      if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateDirectFBSurfaceEXT && \"Function <vkCreateDirectFBSurfaceEXT> requires <VK_EXT_directfb_surface>\" );\n#      endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateDirectFBSurfaceEXT(\n      m_instance,\n      reinterpret_cast<const VkDirectFBSurfaceCreateInfoEXT *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createDirectFBSurfaceEXTUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>( surface, detail::ObjectDestroy<Instance, Dispatch>( *this, allocator, d ) ) );\n  }\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE Bool32 PhysicalDevice::getDirectFBPresentationSupportEXT( uint32_t         queueFamilyIndex,\n                                                                              IDirectFB *      dfb,\n                                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Bool32>(\n      d.vkGetPhysicalDeviceDirectFBPresentationSupportEXT( static_cast<VkPhysicalDevice>( m_physicalDevice ), queueFamilyIndex, dfb ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Bool32\n    PhysicalDevice::getDirectFBPresentationSupportEXT( uint32_t queueFamilyIndex, IDirectFB & dfb, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceDirectFBPresentationSupportEXT &&\n                       \"Function <vkGetPhysicalDeviceDirectFBPresentationSupportEXT> requires <VK_EXT_directfb_surface>\" );\n#    endif\n\n    VkBool32 result = d.vkGetPhysicalDeviceDirectFBPresentationSupportEXT( m_physicalDevice, queueFamilyIndex, &dfb );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Bool32>( result );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n\n  //=== VK_EXT_vertex_input_dynamic_state ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setVertexInputEXT( uint32_t                                                          vertexBindingDescriptionCount,\n                                                           const VULKAN_HPP_NAMESPACE::VertexInputBindingDescription2EXT *   pVertexBindingDescriptions,\n                                                           uint32_t                                                          vertexAttributeDescriptionCount,\n                                                           const VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription2EXT * pVertexAttributeDescriptions,\n                                                           Dispatch const &                                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetVertexInputEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                              vertexBindingDescriptionCount,\n                              reinterpret_cast<const VkVertexInputBindingDescription2EXT *>( pVertexBindingDescriptions ),\n                              vertexAttributeDescriptionCount,\n                              reinterpret_cast<const VkVertexInputAttributeDescription2EXT *>( pVertexAttributeDescriptions ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setVertexInputEXT(\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::VertexInputBindingDescription2EXT> const &   vertexBindingDescriptions,\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription2EXT> const & vertexAttributeDescriptions,\n    Dispatch const &                                                                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetVertexInputEXT && \"Function <vkCmdSetVertexInputEXT> requires <VK_EXT_shader_object> or <VK_EXT_vertex_input_dynamic_state>\" );\n#  endif\n\n    d.vkCmdSetVertexInputEXT( m_commandBuffer,\n                              vertexBindingDescriptions.size(),\n                              reinterpret_cast<const VkVertexInputBindingDescription2EXT *>( vertexBindingDescriptions.data() ),\n                              vertexAttributeDescriptions.size(),\n                              reinterpret_cast<const VkVertexInputAttributeDescription2EXT *>( vertexAttributeDescriptions.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_external_memory ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::getMemoryZirconHandleFUCHSIA( const VULKAN_HPP_NAMESPACE::MemoryGetZirconHandleInfoFUCHSIA * pGetZirconHandleInfo,\n                                          zx_handle_t *                                                  pZirconHandle,\n                                          Dispatch const &                                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetMemoryZirconHandleFUCHSIA(\n      static_cast<VkDevice>( m_device ), reinterpret_cast<const VkMemoryGetZirconHandleInfoFUCHSIA *>( pGetZirconHandleInfo ), pZirconHandle ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<zx_handle_t>::type\n    Device::getMemoryZirconHandleFUCHSIA( const VULKAN_HPP_NAMESPACE::MemoryGetZirconHandleInfoFUCHSIA & getZirconHandleInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetMemoryZirconHandleFUCHSIA && \"Function <vkGetMemoryZirconHandleFUCHSIA> requires <VK_FUCHSIA_external_memory>\" );\n#    endif\n\n    zx_handle_t                  zirconHandle;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetMemoryZirconHandleFUCHSIA( m_device, reinterpret_cast<const VkMemoryGetZirconHandleInfoFUCHSIA *>( &getZirconHandleInfo ), &zirconHandle ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getMemoryZirconHandleFUCHSIA\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( zirconHandle ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::getMemoryZirconHandlePropertiesFUCHSIA( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits      handleType,\n                                                    zx_handle_t                                                 zirconHandle,\n                                                    VULKAN_HPP_NAMESPACE::MemoryZirconHandlePropertiesFUCHSIA * pMemoryZirconHandleProperties,\n                                                    Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkGetMemoryZirconHandlePropertiesFUCHSIA( static_cast<VkDevice>( m_device ),\n                                                  static_cast<VkExternalMemoryHandleTypeFlagBits>( handleType ),\n                                                  zirconHandle,\n                                                  reinterpret_cast<VkMemoryZirconHandlePropertiesFUCHSIA *>( pMemoryZirconHandleProperties ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::MemoryZirconHandlePropertiesFUCHSIA>::type\n                       Device::getMemoryZirconHandlePropertiesFUCHSIA( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType,\n                                                    zx_handle_t                                            zirconHandle,\n                                                    Dispatch const &                                       d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetMemoryZirconHandlePropertiesFUCHSIA &&\n                       \"Function <vkGetMemoryZirconHandlePropertiesFUCHSIA> requires <VK_FUCHSIA_external_memory>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::MemoryZirconHandlePropertiesFUCHSIA memoryZirconHandleProperties;\n    VULKAN_HPP_NAMESPACE::Result                              result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetMemoryZirconHandlePropertiesFUCHSIA( m_device,\n                                                  static_cast<VkExternalMemoryHandleTypeFlagBits>( handleType ),\n                                                  zirconHandle,\n                                                  reinterpret_cast<VkMemoryZirconHandlePropertiesFUCHSIA *>( &memoryZirconHandleProperties ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getMemoryZirconHandlePropertiesFUCHSIA\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( memoryZirconHandleProperties ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_external_semaphore ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::importSemaphoreZirconHandleFUCHSIA(\n    const VULKAN_HPP_NAMESPACE::ImportSemaphoreZirconHandleInfoFUCHSIA * pImportSemaphoreZirconHandleInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkImportSemaphoreZirconHandleFUCHSIA(\n      static_cast<VkDevice>( m_device ), reinterpret_cast<const VkImportSemaphoreZirconHandleInfoFUCHSIA *>( pImportSemaphoreZirconHandleInfo ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n    Device::importSemaphoreZirconHandleFUCHSIA( const VULKAN_HPP_NAMESPACE::ImportSemaphoreZirconHandleInfoFUCHSIA & importSemaphoreZirconHandleInfo,\n                                                Dispatch const &                                                     d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkImportSemaphoreZirconHandleFUCHSIA && \"Function <vkImportSemaphoreZirconHandleFUCHSIA> requires <VK_FUCHSIA_external_semaphore>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkImportSemaphoreZirconHandleFUCHSIA(\n      m_device, reinterpret_cast<const VkImportSemaphoreZirconHandleInfoFUCHSIA *>( &importSemaphoreZirconHandleInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::importSemaphoreZirconHandleFUCHSIA\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::getSemaphoreZirconHandleFUCHSIA( const VULKAN_HPP_NAMESPACE::SemaphoreGetZirconHandleInfoFUCHSIA * pGetZirconHandleInfo,\n                                             zx_handle_t *                                                     pZirconHandle,\n                                             Dispatch const &                                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetSemaphoreZirconHandleFUCHSIA(\n      static_cast<VkDevice>( m_device ), reinterpret_cast<const VkSemaphoreGetZirconHandleInfoFUCHSIA *>( pGetZirconHandleInfo ), pZirconHandle ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<zx_handle_t>::type\n    Device::getSemaphoreZirconHandleFUCHSIA( const VULKAN_HPP_NAMESPACE::SemaphoreGetZirconHandleInfoFUCHSIA & getZirconHandleInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetSemaphoreZirconHandleFUCHSIA && \"Function <vkGetSemaphoreZirconHandleFUCHSIA> requires <VK_FUCHSIA_external_semaphore>\" );\n#    endif\n\n    zx_handle_t                  zirconHandle;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetSemaphoreZirconHandleFUCHSIA( m_device, reinterpret_cast<const VkSemaphoreGetZirconHandleInfoFUCHSIA *>( &getZirconHandleInfo ), &zirconHandle ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getSemaphoreZirconHandleFUCHSIA\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( zirconHandle ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_buffer_collection ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::createBufferCollectionFUCHSIA( const VULKAN_HPP_NAMESPACE::BufferCollectionCreateInfoFUCHSIA * pCreateInfo,\n                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks *               pAllocator,\n                                           VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA *                 pCollection,\n                                           Dispatch const &                                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateBufferCollectionFUCHSIA( static_cast<VkDevice>( m_device ),\n                                                                   reinterpret_cast<const VkBufferCollectionCreateInfoFUCHSIA *>( pCreateInfo ),\n                                                                   reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                                   reinterpret_cast<VkBufferCollectionFUCHSIA *>( pCollection ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA>::type\n                       Device::createBufferCollectionFUCHSIA( const VULKAN_HPP_NAMESPACE::BufferCollectionCreateInfoFUCHSIA & createInfo,\n                                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>       allocator,\n                                           Dispatch const &                                                d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateBufferCollectionFUCHSIA && \"Function <vkCreateBufferCollectionFUCHSIA> requires <VK_FUCHSIA_buffer_collection>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA collection;\n    VULKAN_HPP_NAMESPACE::Result                  result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateBufferCollectionFUCHSIA(\n      m_device,\n      reinterpret_cast<const VkBufferCollectionCreateInfoFUCHSIA *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkBufferCollectionFUCHSIA *>( &collection ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createBufferCollectionFUCHSIA\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( collection ) );\n  }\n\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA, Dispatch>>::type\n                       Device::createBufferCollectionFUCHSIAUnique( const VULKAN_HPP_NAMESPACE::BufferCollectionCreateInfoFUCHSIA & createInfo,\n                                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>       allocator,\n                                                 Dispatch const &                                                d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#      if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateBufferCollectionFUCHSIA && \"Function <vkCreateBufferCollectionFUCHSIA> requires <VK_FUCHSIA_buffer_collection>\" );\n#      endif\n\n    VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA collection;\n    VULKAN_HPP_NAMESPACE::Result                  result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateBufferCollectionFUCHSIA(\n      m_device,\n      reinterpret_cast<const VkBufferCollectionCreateInfoFUCHSIA *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkBufferCollectionFUCHSIA *>( &collection ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createBufferCollectionFUCHSIAUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result,\n      UniqueHandle<VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA, Dispatch>( collection, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::setBufferCollectionImageConstraintsFUCHSIA( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA             collection,\n                                                        const VULKAN_HPP_NAMESPACE::ImageConstraintsInfoFUCHSIA * pImageConstraintsInfo,\n                                                        Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkSetBufferCollectionImageConstraintsFUCHSIA( static_cast<VkDevice>( m_device ),\n                                                      static_cast<VkBufferCollectionFUCHSIA>( collection ),\n                                                      reinterpret_cast<const VkImageConstraintsInfoFUCHSIA *>( pImageConstraintsInfo ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n                                          Device::setBufferCollectionImageConstraintsFUCHSIA( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA             collection,\n                                                        const VULKAN_HPP_NAMESPACE::ImageConstraintsInfoFUCHSIA & imageConstraintsInfo,\n                                                        Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkSetBufferCollectionImageConstraintsFUCHSIA &&\n                       \"Function <vkSetBufferCollectionImageConstraintsFUCHSIA> requires <VK_FUCHSIA_buffer_collection>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkSetBufferCollectionImageConstraintsFUCHSIA(\n      m_device, static_cast<VkBufferCollectionFUCHSIA>( collection ), reinterpret_cast<const VkImageConstraintsInfoFUCHSIA *>( &imageConstraintsInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::setBufferCollectionImageConstraintsFUCHSIA\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::setBufferCollectionBufferConstraintsFUCHSIA( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA              collection,\n                                                         const VULKAN_HPP_NAMESPACE::BufferConstraintsInfoFUCHSIA * pBufferConstraintsInfo,\n                                                         Dispatch const &                                           d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkSetBufferCollectionBufferConstraintsFUCHSIA( static_cast<VkDevice>( m_device ),\n                                                       static_cast<VkBufferCollectionFUCHSIA>( collection ),\n                                                       reinterpret_cast<const VkBufferConstraintsInfoFUCHSIA *>( pBufferConstraintsInfo ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n                                          Device::setBufferCollectionBufferConstraintsFUCHSIA( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA              collection,\n                                                         const VULKAN_HPP_NAMESPACE::BufferConstraintsInfoFUCHSIA & bufferConstraintsInfo,\n                                                         Dispatch const &                                           d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkSetBufferCollectionBufferConstraintsFUCHSIA &&\n                       \"Function <vkSetBufferCollectionBufferConstraintsFUCHSIA> requires <VK_FUCHSIA_buffer_collection>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkSetBufferCollectionBufferConstraintsFUCHSIA(\n      m_device, static_cast<VkBufferCollectionFUCHSIA>( collection ), reinterpret_cast<const VkBufferConstraintsInfoFUCHSIA *>( &bufferConstraintsInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::setBufferCollectionBufferConstraintsFUCHSIA\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyBufferCollectionFUCHSIA( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA     collection,\n                                                                 const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                 Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyBufferCollectionFUCHSIA(\n      static_cast<VkDevice>( m_device ), static_cast<VkBufferCollectionFUCHSIA>( collection ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyBufferCollectionFUCHSIA( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA             collection,\n                                                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                                 Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyBufferCollectionFUCHSIA && \"Function <vkDestroyBufferCollectionFUCHSIA> requires <VK_FUCHSIA_buffer_collection>\" );\n#    endif\n\n    d.vkDestroyBufferCollectionFUCHSIA(\n      m_device,\n      static_cast<VkBufferCollectionFUCHSIA>( collection ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA     collection,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyBufferCollectionFUCHSIA(\n      static_cast<VkDevice>( m_device ), static_cast<VkBufferCollectionFUCHSIA>( collection ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA             collection,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyBufferCollectionFUCHSIA && \"Function <vkDestroyBufferCollectionFUCHSIA> requires <VK_FUCHSIA_buffer_collection>\" );\n#    endif\n\n    d.vkDestroyBufferCollectionFUCHSIA(\n      m_device,\n      static_cast<VkBufferCollectionFUCHSIA>( collection ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::getBufferCollectionPropertiesFUCHSIA( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA             collection,\n                                                  VULKAN_HPP_NAMESPACE::BufferCollectionPropertiesFUCHSIA * pProperties,\n                                                  Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetBufferCollectionPropertiesFUCHSIA( static_cast<VkDevice>( m_device ),\n                                                                          static_cast<VkBufferCollectionFUCHSIA>( collection ),\n                                                                          reinterpret_cast<VkBufferCollectionPropertiesFUCHSIA *>( pProperties ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::BufferCollectionPropertiesFUCHSIA>::type\n                       Device::getBufferCollectionPropertiesFUCHSIA( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA collection, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetBufferCollectionPropertiesFUCHSIA &&\n                       \"Function <vkGetBufferCollectionPropertiesFUCHSIA> requires <VK_FUCHSIA_buffer_collection>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::BufferCollectionPropertiesFUCHSIA properties;\n    VULKAN_HPP_NAMESPACE::Result                            result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetBufferCollectionPropertiesFUCHSIA(\n      m_device, static_cast<VkBufferCollectionFUCHSIA>( collection ), reinterpret_cast<VkBufferCollectionPropertiesFUCHSIA *>( &properties ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getBufferCollectionPropertiesFUCHSIA\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_FUCHSIA*/\n\n  //=== VK_HUAWEI_subpass_shading ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getSubpassShadingMaxWorkgroupSizeHUAWEI( VULKAN_HPP_NAMESPACE::RenderPass renderpass,\n                                                                                                 VULKAN_HPP_NAMESPACE::Extent2D * pMaxWorkgroupSize,\n                                                                                                 Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(\n      static_cast<VkDevice>( m_device ), static_cast<VkRenderPass>( renderpass ), reinterpret_cast<VkExtent2D *>( pMaxWorkgroupSize ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::Extent2D>::type\n                       Device::getSubpassShadingMaxWorkgroupSizeHUAWEI( VULKAN_HPP_NAMESPACE::RenderPass renderpass, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI &&\n                       \"Function <vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI> requires <VK_HUAWEI_subpass_shading>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Extent2D maxWorkgroupSize;\n    VULKAN_HPP_NAMESPACE::Result   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(\n      m_device, static_cast<VkRenderPass>( renderpass ), reinterpret_cast<VkExtent2D *>( &maxWorkgroupSize ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getSubpassShadingMaxWorkgroupSizeHUAWEI\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( maxWorkgroupSize ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::subpassShadingHUAWEI( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSubpassShadingHUAWEI( static_cast<VkCommandBuffer>( m_commandBuffer ) );\n  }\n\n  //=== VK_HUAWEI_invocation_mask ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindInvocationMaskHUAWEI( VULKAN_HPP_NAMESPACE::ImageView   imageView,\n                                                                  VULKAN_HPP_NAMESPACE::ImageLayout imageLayout,\n                                                                  Dispatch const &                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBindInvocationMaskHUAWEI(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkImageView>( imageView ), static_cast<VkImageLayout>( imageLayout ) );\n  }\n\n  //=== VK_NV_external_memory_rdma ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::getMemoryRemoteAddressNV( const VULKAN_HPP_NAMESPACE::MemoryGetRemoteAddressInfoNV * pMemoryGetRemoteAddressInfo,\n                                      VULKAN_HPP_NAMESPACE::RemoteAddressNV *                    pAddress,\n                                      Dispatch const &                                           d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetMemoryRemoteAddressNV( static_cast<VkDevice>( m_device ),\n                                                              reinterpret_cast<const VkMemoryGetRemoteAddressInfoNV *>( pMemoryGetRemoteAddressInfo ),\n                                                              reinterpret_cast<VkRemoteAddressNV *>( pAddress ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::RemoteAddressNV>::type\n    Device::getMemoryRemoteAddressNV( const VULKAN_HPP_NAMESPACE::MemoryGetRemoteAddressInfoNV & memoryGetRemoteAddressInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetMemoryRemoteAddressNV && \"Function <vkGetMemoryRemoteAddressNV> requires <VK_NV_external_memory_rdma>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::RemoteAddressNV address;\n    VULKAN_HPP_NAMESPACE::Result          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetMemoryRemoteAddressNV(\n      m_device, reinterpret_cast<const VkMemoryGetRemoteAddressInfoNV *>( &memoryGetRemoteAddressInfo ), reinterpret_cast<VkRemoteAddressNV *>( &address ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getMemoryRemoteAddressNV\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( address ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_pipeline_properties ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getPipelinePropertiesEXT( const VULKAN_HPP_NAMESPACE::PipelineInfoEXT * pPipelineInfo,\n                                                                                  VULKAN_HPP_NAMESPACE::BaseOutStructure *      pPipelineProperties,\n                                                                                  Dispatch const &                              d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPipelinePropertiesEXT( static_cast<VkDevice>( m_device ),\n                                                              reinterpret_cast<const VkPipelineInfoEXT *>( pPipelineInfo ),\n                                                              reinterpret_cast<VkBaseOutStructure *>( pPipelineProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::BaseOutStructure>::type\n                       Device::getPipelinePropertiesEXT( const VULKAN_HPP_NAMESPACE::PipelineInfoEXT & pipelineInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPipelinePropertiesEXT && \"Function <vkGetPipelinePropertiesEXT> requires <VK_EXT_pipeline_properties>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::BaseOutStructure pipelineProperties;\n    VULKAN_HPP_NAMESPACE::Result           result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPipelinePropertiesEXT(\n      m_device, reinterpret_cast<const VkPipelineInfoEXT *>( &pipelineInfo ), reinterpret_cast<VkBaseOutStructure *>( &pipelineProperties ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getPipelinePropertiesEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( pipelineProperties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_extended_dynamic_state2 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setPatchControlPointsEXT( uint32_t patchControlPoints, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetPatchControlPointsEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), patchControlPoints );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setRasterizerDiscardEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 rasterizerDiscardEnable,\n                                                                       Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetRasterizerDiscardEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( rasterizerDiscardEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDepthBiasEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthBiasEnable, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDepthBiasEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( depthBiasEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setLogicOpEXT( VULKAN_HPP_NAMESPACE::LogicOp logicOp, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetLogicOpEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkLogicOp>( logicOp ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setPrimitiveRestartEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 primitiveRestartEnable,\n                                                                      Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetPrimitiveRestartEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( primitiveRestartEnable ) );\n  }\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n  //=== VK_QNX_screen_surface ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Instance::createScreenSurfaceQNX( const VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateInfoQNX * pCreateInfo,\n                                                                                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks *        pAllocator,\n                                                                                  VULKAN_HPP_NAMESPACE::SurfaceKHR *                       pSurface,\n                                                                                  Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateScreenSurfaceQNX( static_cast<VkInstance>( m_instance ),\n                                                            reinterpret_cast<const VkScreenSurfaceCreateInfoQNX *>( pCreateInfo ),\n                                                            reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                            reinterpret_cast<VkSurfaceKHR *>( pSurface ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n                       Instance::createScreenSurfaceQNX( const VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateInfoQNX &  createInfo,\n                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                      Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateScreenSurfaceQNX && \"Function <vkCreateScreenSurfaceQNX> requires <VK_QNX_screen_surface>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateScreenSurfaceQNX(\n      m_instance,\n      reinterpret_cast<const VkScreenSurfaceCreateInfoQNX *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createScreenSurfaceQNX\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( surface ) );\n  }\n\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n                       Instance::createScreenSurfaceQNXUnique( const VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateInfoQNX &  createInfo,\n                                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                            Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#      if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateScreenSurfaceQNX && \"Function <vkCreateScreenSurfaceQNX> requires <VK_QNX_screen_surface>\" );\n#      endif\n\n    VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n    VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateScreenSurfaceQNX(\n      m_instance,\n      reinterpret_cast<const VkScreenSurfaceCreateInfoQNX *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::createScreenSurfaceQNXUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>( surface, detail::ObjectDestroy<Instance, Dispatch>( *this, allocator, d ) ) );\n  }\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE Bool32 PhysicalDevice::getScreenPresentationSupportQNX( uint32_t                queueFamilyIndex,\n                                                                            struct _screen_window * window,\n                                                                            Dispatch const &        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Bool32>(\n      d.vkGetPhysicalDeviceScreenPresentationSupportQNX( static_cast<VkPhysicalDevice>( m_physicalDevice ), queueFamilyIndex, window ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Bool32\n    PhysicalDevice::getScreenPresentationSupportQNX( uint32_t queueFamilyIndex, struct _screen_window & window, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceScreenPresentationSupportQNX &&\n                       \"Function <vkGetPhysicalDeviceScreenPresentationSupportQNX> requires <VK_QNX_screen_surface>\" );\n#    endif\n\n    VkBool32 result = d.vkGetPhysicalDeviceScreenPresentationSupportQNX( m_physicalDevice, queueFamilyIndex, &window );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Bool32>( result );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n  //=== VK_EXT_color_write_enable ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setColorWriteEnableEXT( uint32_t                             attachmentCount,\n                                                                const VULKAN_HPP_NAMESPACE::Bool32 * pColorWriteEnables,\n                                                                Dispatch const &                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetColorWriteEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), attachmentCount, reinterpret_cast<const VkBool32 *>( pColorWriteEnables ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setColorWriteEnableEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Bool32> const & colorWriteEnables,\n                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetColorWriteEnableEXT && \"Function <vkCmdSetColorWriteEnableEXT> requires <VK_EXT_color_write_enable>\" );\n#  endif\n\n    d.vkCmdSetColorWriteEnableEXT( m_commandBuffer, colorWriteEnables.size(), reinterpret_cast<const VkBool32 *>( colorWriteEnables.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_ray_tracing_maintenance1 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::traceRaysIndirect2KHR( VULKAN_HPP_NAMESPACE::DeviceAddress indirectDeviceAddress,\n                                                               Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdTraceRaysIndirect2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkDeviceAddress>( indirectDeviceAddress ) );\n  }\n\n  //=== VK_EXT_multi_draw ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::drawMultiEXT( uint32_t                                       drawCount,\n                                                      const VULKAN_HPP_NAMESPACE::MultiDrawInfoEXT * pVertexInfo,\n                                                      uint32_t                                       instanceCount,\n                                                      uint32_t                                       firstInstance,\n                                                      uint32_t                                       stride,\n                                                      Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDrawMultiEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                         drawCount,\n                         reinterpret_cast<const VkMultiDrawInfoEXT *>( pVertexInfo ),\n                         instanceCount,\n                         firstInstance,\n                         stride );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::drawMultiEXT( VULKAN_HPP_NAMESPACE::StridedArrayProxy<const VULKAN_HPP_NAMESPACE::MultiDrawInfoEXT> const & vertexInfo,\n                                                      uint32_t         instanceCount,\n                                                      uint32_t         firstInstance,\n                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdDrawMultiEXT && \"Function <vkCmdDrawMultiEXT> requires <VK_EXT_multi_draw>\" );\n#  endif\n\n    d.vkCmdDrawMultiEXT( m_commandBuffer,\n                         vertexInfo.size(),\n                         reinterpret_cast<const VkMultiDrawInfoEXT *>( vertexInfo.data() ),\n                         instanceCount,\n                         firstInstance,\n                         vertexInfo.stride() );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::drawMultiIndexedEXT( uint32_t                                              drawCount,\n                                                             const VULKAN_HPP_NAMESPACE::MultiDrawIndexedInfoEXT * pIndexInfo,\n                                                             uint32_t                                              instanceCount,\n                                                             uint32_t                                              firstInstance,\n                                                             uint32_t                                              stride,\n                                                             const int32_t *                                       pVertexOffset,\n                                                             Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDrawMultiIndexedEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                drawCount,\n                                reinterpret_cast<const VkMultiDrawIndexedInfoEXT *>( pIndexInfo ),\n                                instanceCount,\n                                firstInstance,\n                                stride,\n                                pVertexOffset );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::drawMultiIndexedEXT( VULKAN_HPP_NAMESPACE::StridedArrayProxy<const VULKAN_HPP_NAMESPACE::MultiDrawIndexedInfoEXT> const & indexInfo,\n                                        uint32_t                                                                                             instanceCount,\n                                        uint32_t                                                                                             firstInstance,\n                                        Optional<const int32_t>                                                                              vertexOffset,\n                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdDrawMultiIndexedEXT && \"Function <vkCmdDrawMultiIndexedEXT> requires <VK_EXT_multi_draw>\" );\n#  endif\n\n    d.vkCmdDrawMultiIndexedEXT( m_commandBuffer,\n                                indexInfo.size(),\n                                reinterpret_cast<const VkMultiDrawIndexedInfoEXT *>( indexInfo.data() ),\n                                instanceCount,\n                                firstInstance,\n                                indexInfo.stride(),\n                                static_cast<const int32_t *>( vertexOffset ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_opacity_micromap ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createMicromapEXT( const VULKAN_HPP_NAMESPACE::MicromapCreateInfoEXT * pCreateInfo,\n                                                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks *   pAllocator,\n                                                                           VULKAN_HPP_NAMESPACE::MicromapEXT *                 pMicromap,\n                                                                           Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateMicromapEXT( static_cast<VkDevice>( m_device ),\n                                                       reinterpret_cast<const VkMicromapCreateInfoEXT *>( pCreateInfo ),\n                                                       reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                       reinterpret_cast<VkMicromapEXT *>( pMicromap ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::MicromapEXT>::type\n                       Device::createMicromapEXT( const VULKAN_HPP_NAMESPACE::MicromapCreateInfoEXT &       createInfo,\n                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                               Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateMicromapEXT && \"Function <vkCreateMicromapEXT> requires <VK_EXT_opacity_micromap>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::MicromapEXT micromap;\n    VULKAN_HPP_NAMESPACE::Result      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateMicromapEXT( m_device,\n                             reinterpret_cast<const VkMicromapCreateInfoEXT *>( &createInfo ),\n                             reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                             reinterpret_cast<VkMicromapEXT *>( &micromap ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createMicromapEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( micromap ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::MicromapEXT, Dispatch>>::type\n                       Device::createMicromapEXTUnique( const VULKAN_HPP_NAMESPACE::MicromapCreateInfoEXT &       createInfo,\n                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                     Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateMicromapEXT && \"Function <vkCreateMicromapEXT> requires <VK_EXT_opacity_micromap>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::MicromapEXT micromap;\n    VULKAN_HPP_NAMESPACE::Result      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateMicromapEXT( m_device,\n                             reinterpret_cast<const VkMicromapCreateInfoEXT *>( &createInfo ),\n                             reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                             reinterpret_cast<VkMicromapEXT *>( &micromap ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createMicromapEXTUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::MicromapEXT, Dispatch>( micromap, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyMicromapEXT( VULKAN_HPP_NAMESPACE::MicromapEXT                 micromap,\n                                                     const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                     Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyMicromapEXT(\n      static_cast<VkDevice>( m_device ), static_cast<VkMicromapEXT>( micromap ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyMicromapEXT( VULKAN_HPP_NAMESPACE::MicromapEXT                         micromap,\n                                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                     Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyMicromapEXT && \"Function <vkDestroyMicromapEXT> requires <VK_EXT_opacity_micromap>\" );\n#  endif\n\n    d.vkDestroyMicromapEXT( m_device,\n                            static_cast<VkMicromapEXT>( micromap ),\n                            reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::MicromapEXT                 micromap,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyMicromapEXT(\n      static_cast<VkDevice>( m_device ), static_cast<VkMicromapEXT>( micromap ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::MicromapEXT                         micromap,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyMicromapEXT && \"Function <vkDestroyMicromapEXT> requires <VK_EXT_opacity_micromap>\" );\n#  endif\n\n    d.vkDestroyMicromapEXT( m_device,\n                            static_cast<VkMicromapEXT>( micromap ),\n                            reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::buildMicromapsEXT( uint32_t                                           infoCount,\n                                                           const VULKAN_HPP_NAMESPACE::MicromapBuildInfoEXT * pInfos,\n                                                           Dispatch const &                                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBuildMicromapsEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), infoCount, reinterpret_cast<const VkMicromapBuildInfoEXT *>( pInfos ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::buildMicromapsEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MicromapBuildInfoEXT> const & infos,\n                                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBuildMicromapsEXT && \"Function <vkCmdBuildMicromapsEXT> requires <VK_EXT_opacity_micromap>\" );\n#  endif\n\n    d.vkCmdBuildMicromapsEXT( m_commandBuffer, infos.size(), reinterpret_cast<const VkMicromapBuildInfoEXT *>( infos.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::buildMicromapsEXT( VULKAN_HPP_NAMESPACE::DeferredOperationKHR         deferredOperation,\n                                                                           uint32_t                                           infoCount,\n                                                                           const VULKAN_HPP_NAMESPACE::MicromapBuildInfoEXT * pInfos,\n                                                                           Dispatch const &                                   d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkBuildMicromapsEXT( static_cast<VkDevice>( m_device ),\n                                                       static_cast<VkDeferredOperationKHR>( deferredOperation ),\n                                                       infoCount,\n                                                       reinterpret_cast<const VkMicromapBuildInfoEXT *>( pInfos ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result\n                                         Device::buildMicromapsEXT( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                                                 deferredOperation,\n                               VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MicromapBuildInfoEXT> const & infos,\n                               Dispatch const &                                                                           d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkBuildMicromapsEXT && \"Function <vkBuildMicromapsEXT> requires <VK_EXT_opacity_micromap>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkBuildMicromapsEXT(\n      m_device, static_cast<VkDeferredOperationKHR>( deferredOperation ), infos.size(), reinterpret_cast<const VkMicromapBuildInfoEXT *>( infos.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck(\n      result,\n      VULKAN_HPP_NAMESPACE_STRING \"::Device::buildMicromapsEXT\",\n      { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR, VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR } );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::copyMicromapEXT( VULKAN_HPP_NAMESPACE::DeferredOperationKHR        deferredOperation,\n                                                                         const VULKAN_HPP_NAMESPACE::CopyMicromapInfoEXT * pInfo,\n                                                                         Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCopyMicromapEXT(\n      static_cast<VkDevice>( m_device ), static_cast<VkDeferredOperationKHR>( deferredOperation ), reinterpret_cast<const VkCopyMicromapInfoEXT *>( pInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result Device::copyMicromapEXT( VULKAN_HPP_NAMESPACE::DeferredOperationKHR deferredOperation,\n                                                                                               const VULKAN_HPP_NAMESPACE::CopyMicromapInfoEXT & info,\n                                                                                               Dispatch const &                                  d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCopyMicromapEXT && \"Function <vkCopyMicromapEXT> requires <VK_EXT_opacity_micromap>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCopyMicromapEXT( m_device, static_cast<VkDeferredOperationKHR>( deferredOperation ), reinterpret_cast<const VkCopyMicromapInfoEXT *>( &info ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck(\n      result,\n      VULKAN_HPP_NAMESPACE_STRING \"::Device::copyMicromapEXT\",\n      { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR, VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR } );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::copyMicromapToMemoryEXT( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                deferredOperation,\n                                                                                 const VULKAN_HPP_NAMESPACE::CopyMicromapToMemoryInfoEXT * pInfo,\n                                                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCopyMicromapToMemoryEXT( static_cast<VkDevice>( m_device ),\n                                                             static_cast<VkDeferredOperationKHR>( deferredOperation ),\n                                                             reinterpret_cast<const VkCopyMicromapToMemoryInfoEXT *>( pInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result Device::copyMicromapToMemoryEXT(\n    VULKAN_HPP_NAMESPACE::DeferredOperationKHR deferredOperation, const VULKAN_HPP_NAMESPACE::CopyMicromapToMemoryInfoEXT & info, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCopyMicromapToMemoryEXT && \"Function <vkCopyMicromapToMemoryEXT> requires <VK_EXT_opacity_micromap>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCopyMicromapToMemoryEXT(\n      m_device, static_cast<VkDeferredOperationKHR>( deferredOperation ), reinterpret_cast<const VkCopyMicromapToMemoryInfoEXT *>( &info ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck(\n      result,\n      VULKAN_HPP_NAMESPACE_STRING \"::Device::copyMicromapToMemoryEXT\",\n      { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR, VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR } );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::copyMemoryToMicromapEXT( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                deferredOperation,\n                                                                                 const VULKAN_HPP_NAMESPACE::CopyMemoryToMicromapInfoEXT * pInfo,\n                                                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCopyMemoryToMicromapEXT( static_cast<VkDevice>( m_device ),\n                                                             static_cast<VkDeferredOperationKHR>( deferredOperation ),\n                                                             reinterpret_cast<const VkCopyMemoryToMicromapInfoEXT *>( pInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result Device::copyMemoryToMicromapEXT(\n    VULKAN_HPP_NAMESPACE::DeferredOperationKHR deferredOperation, const VULKAN_HPP_NAMESPACE::CopyMemoryToMicromapInfoEXT & info, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCopyMemoryToMicromapEXT && \"Function <vkCopyMemoryToMicromapEXT> requires <VK_EXT_opacity_micromap>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCopyMemoryToMicromapEXT(\n      m_device, static_cast<VkDeferredOperationKHR>( deferredOperation ), reinterpret_cast<const VkCopyMemoryToMicromapInfoEXT *>( &info ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck(\n      result,\n      VULKAN_HPP_NAMESPACE_STRING \"::Device::copyMemoryToMicromapEXT\",\n      { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR, VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR } );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::writeMicromapsPropertiesEXT( uint32_t                                  micromapCount,\n                                                                                     const VULKAN_HPP_NAMESPACE::MicromapEXT * pMicromaps,\n                                                                                     VULKAN_HPP_NAMESPACE::QueryType           queryType,\n                                                                                     size_t                                    dataSize,\n                                                                                     void *                                    pData,\n                                                                                     size_t                                    stride,\n                                                                                     Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkWriteMicromapsPropertiesEXT( static_cast<VkDevice>( m_device ),\n                                                                 micromapCount,\n                                                                 reinterpret_cast<const VkMicromapEXT *>( pMicromaps ),\n                                                                 static_cast<VkQueryType>( queryType ),\n                                                                 dataSize,\n                                                                 pData,\n                                                                 stride ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename DataType,\n            typename DataTypeAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename DataTypeAllocator::value_type, DataType>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<DataType, DataTypeAllocator>>::type\n                       Device::writeMicromapsPropertiesEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MicromapEXT> const & micromaps,\n                                         VULKAN_HPP_NAMESPACE::QueryType                                                   queryType,\n                                         size_t                                                                            dataSize,\n                                         size_t                                                                            stride,\n                                         Dispatch const &                                                                  d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkWriteMicromapsPropertiesEXT && \"Function <vkWriteMicromapsPropertiesEXT> requires <VK_EXT_opacity_micromap>\" );\n#  endif\n\n    VULKAN_HPP_ASSERT( dataSize % sizeof( DataType ) == 0 );\n    std::vector<DataType, DataTypeAllocator> data( dataSize / sizeof( DataType ) );\n    VULKAN_HPP_NAMESPACE::Result             result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkWriteMicromapsPropertiesEXT( m_device,\n                                                                                  micromaps.size(),\n                                                                                  reinterpret_cast<const VkMicromapEXT *>( micromaps.data() ),\n                                                                                  static_cast<VkQueryType>( queryType ),\n                                                                                  data.size() * sizeof( DataType ),\n                                                                                  reinterpret_cast<void *>( data.data() ),\n                                                                                  stride ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::writeMicromapsPropertiesEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data ) );\n  }\n\n  template <typename DataType, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<DataType>::type\n                       Device::writeMicromapsPropertyEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MicromapEXT> const & micromaps,\n                                       VULKAN_HPP_NAMESPACE::QueryType                                                   queryType,\n                                       size_t                                                                            stride,\n                                       Dispatch const &                                                                  d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkWriteMicromapsPropertiesEXT && \"Function <vkWriteMicromapsPropertiesEXT> requires <VK_EXT_opacity_micromap>\" );\n#  endif\n\n    DataType                     data;\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkWriteMicromapsPropertiesEXT( m_device,\n                                                                                  micromaps.size(),\n                                                                                  reinterpret_cast<const VkMicromapEXT *>( micromaps.data() ),\n                                                                                  static_cast<VkQueryType>( queryType ),\n                                                                                  sizeof( DataType ),\n                                                                                  reinterpret_cast<void *>( &data ),\n                                                                                  stride ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::writeMicromapsPropertyEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyMicromapEXT( const VULKAN_HPP_NAMESPACE::CopyMicromapInfoEXT * pInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCopyMicromapEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkCopyMicromapInfoEXT *>( pInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyMicromapEXT( const VULKAN_HPP_NAMESPACE::CopyMicromapInfoEXT & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdCopyMicromapEXT && \"Function <vkCmdCopyMicromapEXT> requires <VK_EXT_opacity_micromap>\" );\n#  endif\n\n    d.vkCmdCopyMicromapEXT( m_commandBuffer, reinterpret_cast<const VkCopyMicromapInfoEXT *>( &info ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyMicromapToMemoryEXT( const VULKAN_HPP_NAMESPACE::CopyMicromapToMemoryInfoEXT * pInfo,\n                                                                 Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCopyMicromapToMemoryEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkCopyMicromapToMemoryInfoEXT *>( pInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyMicromapToMemoryEXT( const VULKAN_HPP_NAMESPACE::CopyMicromapToMemoryInfoEXT & info,\n                                                                 Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdCopyMicromapToMemoryEXT && \"Function <vkCmdCopyMicromapToMemoryEXT> requires <VK_EXT_opacity_micromap>\" );\n#  endif\n\n    d.vkCmdCopyMicromapToMemoryEXT( m_commandBuffer, reinterpret_cast<const VkCopyMicromapToMemoryInfoEXT *>( &info ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyMemoryToMicromapEXT( const VULKAN_HPP_NAMESPACE::CopyMemoryToMicromapInfoEXT * pInfo,\n                                                                 Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCopyMemoryToMicromapEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkCopyMemoryToMicromapInfoEXT *>( pInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyMemoryToMicromapEXT( const VULKAN_HPP_NAMESPACE::CopyMemoryToMicromapInfoEXT & info,\n                                                                 Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdCopyMemoryToMicromapEXT && \"Function <vkCmdCopyMemoryToMicromapEXT> requires <VK_EXT_opacity_micromap>\" );\n#  endif\n\n    d.vkCmdCopyMemoryToMicromapEXT( m_commandBuffer, reinterpret_cast<const VkCopyMemoryToMicromapInfoEXT *>( &info ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::writeMicromapsPropertiesEXT( uint32_t                                  micromapCount,\n                                                                     const VULKAN_HPP_NAMESPACE::MicromapEXT * pMicromaps,\n                                                                     VULKAN_HPP_NAMESPACE::QueryType           queryType,\n                                                                     VULKAN_HPP_NAMESPACE::QueryPool           queryPool,\n                                                                     uint32_t                                  firstQuery,\n                                                                     Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdWriteMicromapsPropertiesEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                        micromapCount,\n                                        reinterpret_cast<const VkMicromapEXT *>( pMicromaps ),\n                                        static_cast<VkQueryType>( queryType ),\n                                        static_cast<VkQueryPool>( queryPool ),\n                                        firstQuery );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::writeMicromapsPropertiesEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MicromapEXT> const & micromaps,\n                                                VULKAN_HPP_NAMESPACE::QueryType                                                   queryType,\n                                                VULKAN_HPP_NAMESPACE::QueryPool                                                   queryPool,\n                                                uint32_t                                                                          firstQuery,\n                                                Dispatch const &                                                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdWriteMicromapsPropertiesEXT && \"Function <vkCmdWriteMicromapsPropertiesEXT> requires <VK_EXT_opacity_micromap>\" );\n#  endif\n\n    d.vkCmdWriteMicromapsPropertiesEXT( m_commandBuffer,\n                                        micromaps.size(),\n                                        reinterpret_cast<const VkMicromapEXT *>( micromaps.data() ),\n                                        static_cast<VkQueryType>( queryType ),\n                                        static_cast<VkQueryPool>( queryPool ),\n                                        firstQuery );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getMicromapCompatibilityEXT( const VULKAN_HPP_NAMESPACE::MicromapVersionInfoEXT *          pVersionInfo,\n                                                              VULKAN_HPP_NAMESPACE::AccelerationStructureCompatibilityKHR * pCompatibility,\n                                                              Dispatch const &                                              d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetDeviceMicromapCompatibilityEXT( static_cast<VkDevice>( m_device ),\n                                           reinterpret_cast<const VkMicromapVersionInfoEXT *>( pVersionInfo ),\n                                           reinterpret_cast<VkAccelerationStructureCompatibilityKHR *>( pCompatibility ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::AccelerationStructureCompatibilityKHR\n    Device::getMicromapCompatibilityEXT( const VULKAN_HPP_NAMESPACE::MicromapVersionInfoEXT & versionInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceMicromapCompatibilityEXT && \"Function <vkGetDeviceMicromapCompatibilityEXT> requires <VK_EXT_opacity_micromap>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::AccelerationStructureCompatibilityKHR compatibility;\n    d.vkGetDeviceMicromapCompatibilityEXT( m_device,\n                                           reinterpret_cast<const VkMicromapVersionInfoEXT *>( &versionInfo ),\n                                           reinterpret_cast<VkAccelerationStructureCompatibilityKHR *>( &compatibility ) );\n\n    return compatibility;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getMicromapBuildSizesEXT( VULKAN_HPP_NAMESPACE::AccelerationStructureBuildTypeKHR buildType,\n                                                           const VULKAN_HPP_NAMESPACE::MicromapBuildInfoEXT *      pBuildInfo,\n                                                           VULKAN_HPP_NAMESPACE::MicromapBuildSizesInfoEXT *       pSizeInfo,\n                                                           Dispatch const &                                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetMicromapBuildSizesEXT( static_cast<VkDevice>( m_device ),\n                                  static_cast<VkAccelerationStructureBuildTypeKHR>( buildType ),\n                                  reinterpret_cast<const VkMicromapBuildInfoEXT *>( pBuildInfo ),\n                                  reinterpret_cast<VkMicromapBuildSizesInfoEXT *>( pSizeInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MicromapBuildSizesInfoEXT\n                                         Device::getMicromapBuildSizesEXT( VULKAN_HPP_NAMESPACE::AccelerationStructureBuildTypeKHR buildType,\n                                      const VULKAN_HPP_NAMESPACE::MicromapBuildInfoEXT &      buildInfo,\n                                      Dispatch const &                                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetMicromapBuildSizesEXT && \"Function <vkGetMicromapBuildSizesEXT> requires <VK_EXT_opacity_micromap>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::MicromapBuildSizesInfoEXT sizeInfo;\n    d.vkGetMicromapBuildSizesEXT( m_device,\n                                  static_cast<VkAccelerationStructureBuildTypeKHR>( buildType ),\n                                  reinterpret_cast<const VkMicromapBuildInfoEXT *>( &buildInfo ),\n                                  reinterpret_cast<VkMicromapBuildSizesInfoEXT *>( &sizeInfo ) );\n\n    return sizeInfo;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_HUAWEI_cluster_culling_shader ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::drawClusterHUAWEI( uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDrawClusterHUAWEI( static_cast<VkCommandBuffer>( m_commandBuffer ), groupCountX, groupCountY, groupCountZ );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::drawClusterIndirectHUAWEI( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                                   VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                                   Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDrawClusterIndirectHUAWEI( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBuffer>( buffer ), static_cast<VkDeviceSize>( offset ) );\n  }\n\n  //=== VK_EXT_pageable_device_local_memory ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::setMemoryPriorityEXT( VULKAN_HPP_NAMESPACE::DeviceMemory memory, float priority, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkSetDeviceMemoryPriorityEXT( static_cast<VkDevice>( m_device ), static_cast<VkDeviceMemory>( memory ), priority );\n  }\n\n  //=== VK_KHR_maintenance4 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getBufferMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements * pInfo,\n                                                                 VULKAN_HPP_NAMESPACE::MemoryRequirements2 *                  pMemoryRequirements,\n                                                                 Dispatch const &                                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetDeviceBufferMemoryRequirementsKHR( static_cast<VkDevice>( m_device ),\n                                              reinterpret_cast<const VkDeviceBufferMemoryRequirements *>( pInfo ),\n                                              reinterpret_cast<VkMemoryRequirements2 *>( pMemoryRequirements ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2\n    Device::getBufferMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceBufferMemoryRequirementsKHR &&\n                       \"Function <vkGetDeviceBufferMemoryRequirementsKHR> requires <VK_KHR_maintenance4> or <VK_VERSION_1_3>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;\n    d.vkGetDeviceBufferMemoryRequirementsKHR(\n      m_device, reinterpret_cast<const VkDeviceBufferMemoryRequirements *>( &info ), reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n    return memoryRequirements;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n    Device::getBufferMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceBufferMemoryRequirementsKHR &&\n                       \"Function <vkGetDeviceBufferMemoryRequirementsKHR> requires <VK_KHR_maintenance4> or <VK_VERSION_1_3>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2 &      memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();\n    d.vkGetDeviceBufferMemoryRequirementsKHR(\n      m_device, reinterpret_cast<const VkDeviceBufferMemoryRequirements *>( &info ), reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getImageMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements * pInfo,\n                                                                VULKAN_HPP_NAMESPACE::MemoryRequirements2 *                 pMemoryRequirements,\n                                                                Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetDeviceImageMemoryRequirementsKHR( static_cast<VkDevice>( m_device ),\n                                             reinterpret_cast<const VkDeviceImageMemoryRequirements *>( pInfo ),\n                                             reinterpret_cast<VkMemoryRequirements2 *>( pMemoryRequirements ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2\n    Device::getImageMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceImageMemoryRequirementsKHR &&\n                       \"Function <vkGetDeviceImageMemoryRequirementsKHR> requires <VK_KHR_maintenance4> or <VK_VERSION_1_3>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;\n    d.vkGetDeviceImageMemoryRequirementsKHR(\n      m_device, reinterpret_cast<const VkDeviceImageMemoryRequirements *>( &info ), reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n    return memoryRequirements;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n    Device::getImageMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceImageMemoryRequirementsKHR &&\n                       \"Function <vkGetDeviceImageMemoryRequirementsKHR> requires <VK_KHR_maintenance4> or <VK_VERSION_1_3>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2 &      memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();\n    d.vkGetDeviceImageMemoryRequirementsKHR(\n      m_device, reinterpret_cast<const VkDeviceImageMemoryRequirements *>( &info ), reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getImageSparseMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements * pInfo,\n                                                                      uint32_t *                                                  pSparseMemoryRequirementCount,\n                                                                      VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2 *      pSparseMemoryRequirements,\n                                                                      Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetDeviceImageSparseMemoryRequirementsKHR( static_cast<VkDevice>( m_device ),\n                                                   reinterpret_cast<const VkDeviceImageMemoryRequirements *>( pInfo ),\n                                                   pSparseMemoryRequirementCount,\n                                                   reinterpret_cast<VkSparseImageMemoryRequirements2 *>( pSparseMemoryRequirements ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename SparseImageMemoryRequirements2Allocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename SparseImageMemoryRequirements2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator>\n    Device::getImageSparseMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceImageSparseMemoryRequirementsKHR &&\n                       \"Function <vkGetDeviceImageSparseMemoryRequirementsKHR> requires <VK_KHR_maintenance4> or <VK_VERSION_1_3>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator> sparseMemoryRequirements;\n    uint32_t                                                                                                   sparseMemoryRequirementCount;\n    d.vkGetDeviceImageSparseMemoryRequirementsKHR(\n      m_device, reinterpret_cast<const VkDeviceImageMemoryRequirements *>( &info ), &sparseMemoryRequirementCount, nullptr );\n    sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n    d.vkGetDeviceImageSparseMemoryRequirementsKHR( m_device,\n                                                   reinterpret_cast<const VkDeviceImageMemoryRequirements *>( &info ),\n                                                   &sparseMemoryRequirementCount,\n                                                   reinterpret_cast<VkSparseImageMemoryRequirements2 *>( sparseMemoryRequirements.data() ) );\n\n    VULKAN_HPP_ASSERT( sparseMemoryRequirementCount <= sparseMemoryRequirements.size() );\n    if ( sparseMemoryRequirementCount < sparseMemoryRequirements.size() )\n    {\n      sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n    }\n    return sparseMemoryRequirements;\n  }\n\n  template <typename SparseImageMemoryRequirements2Allocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename SparseImageMemoryRequirements2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator>\n                                         Device::getImageSparseMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info,\n                                                 SparseImageMemoryRequirements2Allocator &                   sparseImageMemoryRequirements2Allocator,\n                                                 Dispatch const &                                            d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceImageSparseMemoryRequirementsKHR &&\n                       \"Function <vkGetDeviceImageSparseMemoryRequirementsKHR> requires <VK_KHR_maintenance4> or <VK_VERSION_1_3>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator> sparseMemoryRequirements(\n      sparseImageMemoryRequirements2Allocator );\n    uint32_t sparseMemoryRequirementCount;\n    d.vkGetDeviceImageSparseMemoryRequirementsKHR(\n      m_device, reinterpret_cast<const VkDeviceImageMemoryRequirements *>( &info ), &sparseMemoryRequirementCount, nullptr );\n    sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n    d.vkGetDeviceImageSparseMemoryRequirementsKHR( m_device,\n                                                   reinterpret_cast<const VkDeviceImageMemoryRequirements *>( &info ),\n                                                   &sparseMemoryRequirementCount,\n                                                   reinterpret_cast<VkSparseImageMemoryRequirements2 *>( sparseMemoryRequirements.data() ) );\n\n    VULKAN_HPP_ASSERT( sparseMemoryRequirementCount <= sparseMemoryRequirements.size() );\n    if ( sparseMemoryRequirementCount < sparseMemoryRequirements.size() )\n    {\n      sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n    }\n    return sparseMemoryRequirements;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_VALVE_descriptor_set_host_mapping ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getDescriptorSetLayoutHostMappingInfoVALVE( const VULKAN_HPP_NAMESPACE::DescriptorSetBindingReferenceVALVE * pBindingReference,\n                                                                             VULKAN_HPP_NAMESPACE::DescriptorSetLayoutHostMappingInfoVALVE *  pHostMapping,\n                                                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetDescriptorSetLayoutHostMappingInfoVALVE( static_cast<VkDevice>( m_device ),\n                                                    reinterpret_cast<const VkDescriptorSetBindingReferenceVALVE *>( pBindingReference ),\n                                                    reinterpret_cast<VkDescriptorSetLayoutHostMappingInfoVALVE *>( pHostMapping ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DescriptorSetLayoutHostMappingInfoVALVE\n    Device::getDescriptorSetLayoutHostMappingInfoVALVE( const VULKAN_HPP_NAMESPACE::DescriptorSetBindingReferenceVALVE & bindingReference,\n                                                        Dispatch const &                                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDescriptorSetLayoutHostMappingInfoVALVE &&\n                       \"Function <vkGetDescriptorSetLayoutHostMappingInfoVALVE> requires <VK_VALVE_descriptor_set_host_mapping>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::DescriptorSetLayoutHostMappingInfoVALVE hostMapping;\n    d.vkGetDescriptorSetLayoutHostMappingInfoVALVE( m_device,\n                                                    reinterpret_cast<const VkDescriptorSetBindingReferenceVALVE *>( &bindingReference ),\n                                                    reinterpret_cast<VkDescriptorSetLayoutHostMappingInfoVALVE *>( &hostMapping ) );\n\n    return hostMapping;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    Device::getDescriptorSetHostMappingVALVE( VULKAN_HPP_NAMESPACE::DescriptorSet descriptorSet, void ** ppData, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetDescriptorSetHostMappingVALVE( static_cast<VkDevice>( m_device ), static_cast<VkDescriptorSet>( descriptorSet ), ppData );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE void * Device::getDescriptorSetHostMappingVALVE( VULKAN_HPP_NAMESPACE::DescriptorSet descriptorSet,\n                                                                                          Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDescriptorSetHostMappingVALVE &&\n                       \"Function <vkGetDescriptorSetHostMappingVALVE> requires <VK_VALVE_descriptor_set_host_mapping>\" );\n#  endif\n\n    void * pData;\n    d.vkGetDescriptorSetHostMappingVALVE( m_device, static_cast<VkDescriptorSet>( descriptorSet ), &pData );\n\n    return pData;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_NV_copy_memory_indirect ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyMemoryIndirectNV( VULKAN_HPP_NAMESPACE::DeviceAddress copyBufferAddress,\n                                                              uint32_t                            copyCount,\n                                                              uint32_t                            stride,\n                                                              Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCopyMemoryIndirectNV( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkDeviceAddress>( copyBufferAddress ), copyCount, stride );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::copyMemoryToImageIndirectNV( VULKAN_HPP_NAMESPACE::DeviceAddress                  copyBufferAddress,\n                                                                     uint32_t                                             copyCount,\n                                                                     uint32_t                                             stride,\n                                                                     VULKAN_HPP_NAMESPACE::Image                          dstImage,\n                                                                     VULKAN_HPP_NAMESPACE::ImageLayout                    dstImageLayout,\n                                                                     const VULKAN_HPP_NAMESPACE::ImageSubresourceLayers * pImageSubresources,\n                                                                     Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdCopyMemoryToImageIndirectNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                        static_cast<VkDeviceAddress>( copyBufferAddress ),\n                                        copyCount,\n                                        stride,\n                                        static_cast<VkImage>( dstImage ),\n                                        static_cast<VkImageLayout>( dstImageLayout ),\n                                        reinterpret_cast<const VkImageSubresourceLayers *>( pImageSubresources ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::copyMemoryToImageIndirectNV( VULKAN_HPP_NAMESPACE::DeviceAddress                                                          copyBufferAddress,\n                                                uint32_t                                                                                     stride,\n                                                VULKAN_HPP_NAMESPACE::Image                                                                  dstImage,\n                                                VULKAN_HPP_NAMESPACE::ImageLayout                                                            dstImageLayout,\n                                                VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageSubresourceLayers> const & imageSubresources,\n                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdCopyMemoryToImageIndirectNV && \"Function <vkCmdCopyMemoryToImageIndirectNV> requires <VK_NV_copy_memory_indirect>\" );\n#  endif\n\n    d.vkCmdCopyMemoryToImageIndirectNV( m_commandBuffer,\n                                        static_cast<VkDeviceAddress>( copyBufferAddress ),\n                                        imageSubresources.size(),\n                                        stride,\n                                        static_cast<VkImage>( dstImage ),\n                                        static_cast<VkImageLayout>( dstImageLayout ),\n                                        reinterpret_cast<const VkImageSubresourceLayers *>( imageSubresources.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_NV_memory_decompression ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::decompressMemoryNV( uint32_t                                               decompressRegionCount,\n                                                            const VULKAN_HPP_NAMESPACE::DecompressMemoryRegionNV * pDecompressMemoryRegions,\n                                                            Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDecompressMemoryNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                               decompressRegionCount,\n                               reinterpret_cast<const VkDecompressMemoryRegionNV *>( pDecompressMemoryRegions ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::decompressMemoryNV( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DecompressMemoryRegionNV> const & decompressMemoryRegions,\n                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdDecompressMemoryNV && \"Function <vkCmdDecompressMemoryNV> requires <VK_NV_memory_decompression>\" );\n#  endif\n\n    d.vkCmdDecompressMemoryNV(\n      m_commandBuffer, decompressMemoryRegions.size(), reinterpret_cast<const VkDecompressMemoryRegionNV *>( decompressMemoryRegions.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::decompressMemoryIndirectCountNV( VULKAN_HPP_NAMESPACE::DeviceAddress indirectCommandsAddress,\n                                                                         VULKAN_HPP_NAMESPACE::DeviceAddress indirectCommandsCountAddress,\n                                                                         uint32_t                            stride,\n                                                                         Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdDecompressMemoryIndirectCountNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                            static_cast<VkDeviceAddress>( indirectCommandsAddress ),\n                                            static_cast<VkDeviceAddress>( indirectCommandsCountAddress ),\n                                            stride );\n  }\n\n  //=== VK_NV_device_generated_commands_compute ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getPipelineIndirectMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo * pCreateInfo,\n                                                                          VULKAN_HPP_NAMESPACE::MemoryRequirements2 *             pMemoryRequirements,\n                                                                          Dispatch const &                                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPipelineIndirectMemoryRequirementsNV( static_cast<VkDevice>( m_device ),\n                                                 reinterpret_cast<const VkComputePipelineCreateInfo *>( pCreateInfo ),\n                                                 reinterpret_cast<VkMemoryRequirements2 *>( pMemoryRequirements ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2\n                                         Device::getPipelineIndirectMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo & createInfo,\n                                                     Dispatch const &                                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPipelineIndirectMemoryRequirementsNV &&\n                       \"Function <vkGetPipelineIndirectMemoryRequirementsNV> requires <VK_NV_device_generated_commands_compute>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;\n    d.vkGetPipelineIndirectMemoryRequirementsNV(\n      m_device, reinterpret_cast<const VkComputePipelineCreateInfo *>( &createInfo ), reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n    return memoryRequirements;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                                         Device::getPipelineIndirectMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo & createInfo,\n                                                     Dispatch const &                                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPipelineIndirectMemoryRequirementsNV &&\n                       \"Function <vkGetPipelineIndirectMemoryRequirementsNV> requires <VK_NV_device_generated_commands_compute>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2 &      memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();\n    d.vkGetPipelineIndirectMemoryRequirementsNV(\n      m_device, reinterpret_cast<const VkComputePipelineCreateInfo *>( &createInfo ), reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::updatePipelineIndirectBufferNV( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint,\n                                                                        VULKAN_HPP_NAMESPACE::Pipeline          pipeline,\n                                                                        Dispatch const &                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdUpdatePipelineIndirectBufferNV(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkPipelineBindPoint>( pipelineBindPoint ), static_cast<VkPipeline>( pipeline ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE DeviceAddress Device::getPipelineIndirectAddressNV( const VULKAN_HPP_NAMESPACE::PipelineIndirectDeviceAddressInfoNV * pInfo,\n                                                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<DeviceAddress>(\n      d.vkGetPipelineIndirectDeviceAddressNV( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkPipelineIndirectDeviceAddressInfoNV *>( pInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceAddress\n    Device::getPipelineIndirectAddressNV( const VULKAN_HPP_NAMESPACE::PipelineIndirectDeviceAddressInfoNV & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPipelineIndirectDeviceAddressNV &&\n                       \"Function <vkGetPipelineIndirectDeviceAddressNV> requires <VK_NV_device_generated_commands_compute>\" );\n#  endif\n\n    VkDeviceAddress result = d.vkGetPipelineIndirectDeviceAddressNV( m_device, reinterpret_cast<const VkPipelineIndirectDeviceAddressInfoNV *>( &info ) );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::DeviceAddress>( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_extended_dynamic_state3 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDepthClampEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthClampEnable, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDepthClampEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( depthClampEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setPolygonModeEXT( VULKAN_HPP_NAMESPACE::PolygonMode polygonMode, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetPolygonModeEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkPolygonMode>( polygonMode ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setRasterizationSamplesEXT( VULKAN_HPP_NAMESPACE::SampleCountFlagBits rasterizationSamples,\n                                                                    Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetRasterizationSamplesEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkSampleCountFlagBits>( rasterizationSamples ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setSampleMaskEXT( VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples,\n                                                          const VULKAN_HPP_NAMESPACE::SampleMask *  pSampleMask,\n                                                          Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetSampleMaskEXT(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkSampleCountFlagBits>( samples ), reinterpret_cast<const VkSampleMask *>( pSampleMask ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setSampleMaskEXT( VULKAN_HPP_NAMESPACE::SampleCountFlagBits                                        samples,\n                                                          VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SampleMask> const & sampleMask,\n                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetSampleMaskEXT && \"Function <vkCmdSetSampleMaskEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n#  endif\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n    VULKAN_HPP_ASSERT( sampleMask.size() == ( static_cast<uint32_t>( samples ) + 31 ) / 32 );\n#  else\n    if ( sampleMask.size() != ( static_cast<uint32_t>( samples ) + 31 ) / 32 )\n    {\n      throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::setSampleMaskEXT: sampleMask.size() != ( static_cast<uint32_t>( samples ) + 31 ) / 32\" );\n    }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n    d.vkCmdSetSampleMaskEXT( m_commandBuffer, static_cast<VkSampleCountFlagBits>( samples ), reinterpret_cast<const VkSampleMask *>( sampleMask.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setAlphaToCoverageEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 alphaToCoverageEnable,\n                                                                     Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetAlphaToCoverageEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( alphaToCoverageEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setAlphaToOneEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 alphaToOneEnable, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetAlphaToOneEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( alphaToOneEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setLogicOpEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 logicOpEnable, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetLogicOpEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( logicOpEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setColorBlendEnableEXT( uint32_t                             firstAttachment,\n                                                                uint32_t                             attachmentCount,\n                                                                const VULKAN_HPP_NAMESPACE::Bool32 * pColorBlendEnables,\n                                                                Dispatch const &                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetColorBlendEnableEXT(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), firstAttachment, attachmentCount, reinterpret_cast<const VkBool32 *>( pColorBlendEnables ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setColorBlendEnableEXT( uint32_t                                                                     firstAttachment,\n                                                                VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Bool32> const & colorBlendEnables,\n                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetColorBlendEnableEXT &&\n                       \"Function <vkCmdSetColorBlendEnableEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n#  endif\n\n    d.vkCmdSetColorBlendEnableEXT( m_commandBuffer, firstAttachment, colorBlendEnables.size(), reinterpret_cast<const VkBool32 *>( colorBlendEnables.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setColorBlendEquationEXT( uint32_t                                            firstAttachment,\n                                                                  uint32_t                                            attachmentCount,\n                                                                  const VULKAN_HPP_NAMESPACE::ColorBlendEquationEXT * pColorBlendEquations,\n                                                                  Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetColorBlendEquationEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                     firstAttachment,\n                                     attachmentCount,\n                                     reinterpret_cast<const VkColorBlendEquationEXT *>( pColorBlendEquations ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::setColorBlendEquationEXT( uint32_t                                                                                    firstAttachment,\n                                             VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ColorBlendEquationEXT> const & colorBlendEquations,\n                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetColorBlendEquationEXT &&\n                       \"Function <vkCmdSetColorBlendEquationEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n#  endif\n\n    d.vkCmdSetColorBlendEquationEXT(\n      m_commandBuffer, firstAttachment, colorBlendEquations.size(), reinterpret_cast<const VkColorBlendEquationEXT *>( colorBlendEquations.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setColorWriteMaskEXT( uint32_t                                          firstAttachment,\n                                                              uint32_t                                          attachmentCount,\n                                                              const VULKAN_HPP_NAMESPACE::ColorComponentFlags * pColorWriteMasks,\n                                                              Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetColorWriteMaskEXT(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), firstAttachment, attachmentCount, reinterpret_cast<const VkColorComponentFlags *>( pColorWriteMasks ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::setColorWriteMaskEXT( uint32_t                                                                                  firstAttachment,\n                                         VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ColorComponentFlags> const & colorWriteMasks,\n                                         Dispatch const &                                                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetColorWriteMaskEXT &&\n                       \"Function <vkCmdSetColorWriteMaskEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n#  endif\n\n    d.vkCmdSetColorWriteMaskEXT(\n      m_commandBuffer, firstAttachment, colorWriteMasks.size(), reinterpret_cast<const VkColorComponentFlags *>( colorWriteMasks.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setTessellationDomainOriginEXT( VULKAN_HPP_NAMESPACE::TessellationDomainOrigin domainOrigin,\n                                                                        Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetTessellationDomainOriginEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkTessellationDomainOrigin>( domainOrigin ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setRasterizationStreamEXT( uint32_t rasterizationStream, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetRasterizationStreamEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), rasterizationStream );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::setConservativeRasterizationModeEXT( VULKAN_HPP_NAMESPACE::ConservativeRasterizationModeEXT conservativeRasterizationMode,\n                                                        Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetConservativeRasterizationModeEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                static_cast<VkConservativeRasterizationModeEXT>( conservativeRasterizationMode ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setExtraPrimitiveOverestimationSizeEXT( float            extraPrimitiveOverestimationSize,\n                                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetExtraPrimitiveOverestimationSizeEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), extraPrimitiveOverestimationSize );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDepthClipEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthClipEnable, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDepthClipEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( depthClipEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setSampleLocationsEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 sampleLocationsEnable,\n                                                                     Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetSampleLocationsEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( sampleLocationsEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setColorBlendAdvancedEXT( uint32_t                                            firstAttachment,\n                                                                  uint32_t                                            attachmentCount,\n                                                                  const VULKAN_HPP_NAMESPACE::ColorBlendAdvancedEXT * pColorBlendAdvanced,\n                                                                  Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetColorBlendAdvancedEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                     firstAttachment,\n                                     attachmentCount,\n                                     reinterpret_cast<const VkColorBlendAdvancedEXT *>( pColorBlendAdvanced ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::setColorBlendAdvancedEXT( uint32_t                                                                                    firstAttachment,\n                                             VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ColorBlendAdvancedEXT> const & colorBlendAdvanced,\n                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetColorBlendAdvancedEXT &&\n                       \"Function <vkCmdSetColorBlendAdvancedEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n#  endif\n\n    d.vkCmdSetColorBlendAdvancedEXT(\n      m_commandBuffer, firstAttachment, colorBlendAdvanced.size(), reinterpret_cast<const VkColorBlendAdvancedEXT *>( colorBlendAdvanced.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setProvokingVertexModeEXT( VULKAN_HPP_NAMESPACE::ProvokingVertexModeEXT provokingVertexMode,\n                                                                   Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetProvokingVertexModeEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkProvokingVertexModeEXT>( provokingVertexMode ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setLineRasterizationModeEXT( VULKAN_HPP_NAMESPACE::LineRasterizationModeEXT lineRasterizationMode,\n                                                                     Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetLineRasterizationModeEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkLineRasterizationModeEXT>( lineRasterizationMode ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setLineStippleEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 stippledLineEnable, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetLineStippleEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( stippledLineEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDepthClipNegativeOneToOneEXT( VULKAN_HPP_NAMESPACE::Bool32 negativeOneToOne,\n                                                                         Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDepthClipNegativeOneToOneEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( negativeOneToOne ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setViewportWScalingEnableNV( VULKAN_HPP_NAMESPACE::Bool32 viewportWScalingEnable,\n                                                                     Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetViewportWScalingEnableNV( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( viewportWScalingEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setViewportSwizzleNV( uint32_t                                        firstViewport,\n                                                              uint32_t                                        viewportCount,\n                                                              const VULKAN_HPP_NAMESPACE::ViewportSwizzleNV * pViewportSwizzles,\n                                                              Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetViewportSwizzleNV(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), firstViewport, viewportCount, reinterpret_cast<const VkViewportSwizzleNV *>( pViewportSwizzles ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::setViewportSwizzleNV( uint32_t                                                                                firstViewport,\n                                         VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ViewportSwizzleNV> const & viewportSwizzles,\n                                         Dispatch const &                                                                        d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetViewportSwizzleNV &&\n                       \"Function <vkCmdSetViewportSwizzleNV> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n#  endif\n\n    d.vkCmdSetViewportSwizzleNV(\n      m_commandBuffer, firstViewport, viewportSwizzles.size(), reinterpret_cast<const VkViewportSwizzleNV *>( viewportSwizzles.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setCoverageToColorEnableNV( VULKAN_HPP_NAMESPACE::Bool32 coverageToColorEnable,\n                                                                    Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetCoverageToColorEnableNV( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( coverageToColorEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setCoverageToColorLocationNV( uint32_t coverageToColorLocation, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetCoverageToColorLocationNV( static_cast<VkCommandBuffer>( m_commandBuffer ), coverageToColorLocation );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setCoverageModulationModeNV( VULKAN_HPP_NAMESPACE::CoverageModulationModeNV coverageModulationMode,\n                                                                     Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetCoverageModulationModeNV( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkCoverageModulationModeNV>( coverageModulationMode ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setCoverageModulationTableEnableNV( VULKAN_HPP_NAMESPACE::Bool32 coverageModulationTableEnable,\n                                                                            Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetCoverageModulationTableEnableNV( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( coverageModulationTableEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setCoverageModulationTableNV( uint32_t         coverageModulationTableCount,\n                                                                      const float *    pCoverageModulationTable,\n                                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetCoverageModulationTableNV( static_cast<VkCommandBuffer>( m_commandBuffer ), coverageModulationTableCount, pCoverageModulationTable );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setCoverageModulationTableNV( VULKAN_HPP_NAMESPACE::ArrayProxy<const float> const & coverageModulationTable,\n                                                                      Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetCoverageModulationTableNV &&\n                       \"Function <vkCmdSetCoverageModulationTableNV> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n#  endif\n\n    d.vkCmdSetCoverageModulationTableNV( m_commandBuffer, coverageModulationTable.size(), coverageModulationTable.data() );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setShadingRateImageEnableNV( VULKAN_HPP_NAMESPACE::Bool32 shadingRateImageEnable,\n                                                                     Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetShadingRateImageEnableNV( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( shadingRateImageEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setRepresentativeFragmentTestEnableNV( VULKAN_HPP_NAMESPACE::Bool32 representativeFragmentTestEnable,\n                                                                               Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetRepresentativeFragmentTestEnableNV( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( representativeFragmentTestEnable ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setCoverageReductionModeNV( VULKAN_HPP_NAMESPACE::CoverageReductionModeNV coverageReductionMode,\n                                                                    Dispatch const &                              d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetCoverageReductionModeNV( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkCoverageReductionModeNV>( coverageReductionMode ) );\n  }\n\n  //=== VK_EXT_shader_module_identifier ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getShaderModuleIdentifierEXT( VULKAN_HPP_NAMESPACE::ShaderModule                shaderModule,\n                                                               VULKAN_HPP_NAMESPACE::ShaderModuleIdentifierEXT * pIdentifier,\n                                                               Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetShaderModuleIdentifierEXT(\n      static_cast<VkDevice>( m_device ), static_cast<VkShaderModule>( shaderModule ), reinterpret_cast<VkShaderModuleIdentifierEXT *>( pIdentifier ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ShaderModuleIdentifierEXT\n    Device::getShaderModuleIdentifierEXT( VULKAN_HPP_NAMESPACE::ShaderModule shaderModule, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetShaderModuleIdentifierEXT && \"Function <vkGetShaderModuleIdentifierEXT> requires <VK_EXT_shader_module_identifier>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::ShaderModuleIdentifierEXT identifier;\n    d.vkGetShaderModuleIdentifierEXT( m_device, static_cast<VkShaderModule>( shaderModule ), reinterpret_cast<VkShaderModuleIdentifierEXT *>( &identifier ) );\n\n    return identifier;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getShaderModuleCreateInfoIdentifierEXT( const VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo * pCreateInfo,\n                                                                         VULKAN_HPP_NAMESPACE::ShaderModuleIdentifierEXT *    pIdentifier,\n                                                                         Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetShaderModuleCreateInfoIdentifierEXT( static_cast<VkDevice>( m_device ),\n                                                reinterpret_cast<const VkShaderModuleCreateInfo *>( pCreateInfo ),\n                                                reinterpret_cast<VkShaderModuleIdentifierEXT *>( pIdentifier ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ShaderModuleIdentifierEXT\n                                         Device::getShaderModuleCreateInfoIdentifierEXT( const VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo & createInfo,\n                                                    Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetShaderModuleCreateInfoIdentifierEXT &&\n                       \"Function <vkGetShaderModuleCreateInfoIdentifierEXT> requires <VK_EXT_shader_module_identifier>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::ShaderModuleIdentifierEXT identifier;\n    d.vkGetShaderModuleCreateInfoIdentifierEXT(\n      m_device, reinterpret_cast<const VkShaderModuleCreateInfo *>( &createInfo ), reinterpret_cast<VkShaderModuleIdentifierEXT *>( &identifier ) );\n\n    return identifier;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_NV_optical_flow ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    PhysicalDevice::getOpticalFlowImageFormatsNV( const VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatInfoNV * pOpticalFlowImageFormatInfo,\n                                                  uint32_t *                                                 pFormatCount,\n                                                  VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatPropertiesNV * pImageFormatProperties,\n                                                  Dispatch const &                                           d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkGetPhysicalDeviceOpticalFlowImageFormatsNV( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                      reinterpret_cast<const VkOpticalFlowImageFormatInfoNV *>( pOpticalFlowImageFormatInfo ),\n                                                      pFormatCount,\n                                                      reinterpret_cast<VkOpticalFlowImageFormatPropertiesNV *>( pImageFormatProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename OpticalFlowImageFormatPropertiesNVAllocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename OpticalFlowImageFormatPropertiesNVAllocator::value_type, VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatPropertiesNV>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatPropertiesNV, OpticalFlowImageFormatPropertiesNVAllocator>>::type\n    PhysicalDevice::getOpticalFlowImageFormatsNV( const VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatInfoNV & opticalFlowImageFormatInfo,\n                                                  Dispatch const &                                           d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceOpticalFlowImageFormatsNV &&\n                       \"Function <vkGetPhysicalDeviceOpticalFlowImageFormatsNV> requires <VK_NV_optical_flow>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatPropertiesNV, OpticalFlowImageFormatPropertiesNVAllocator> imageFormatProperties;\n    uint32_t                                                                                                           formatCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                                       result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceOpticalFlowImageFormatsNV(\n        m_physicalDevice, reinterpret_cast<const VkOpticalFlowImageFormatInfoNV *>( &opticalFlowImageFormatInfo ), &formatCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && formatCount )\n      {\n        imageFormatProperties.resize( formatCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceOpticalFlowImageFormatsNV( m_physicalDevice,\n                                                          reinterpret_cast<const VkOpticalFlowImageFormatInfoNV *>( &opticalFlowImageFormatInfo ),\n                                                          &formatCount,\n                                                          reinterpret_cast<VkOpticalFlowImageFormatPropertiesNV *>( imageFormatProperties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getOpticalFlowImageFormatsNV\" );\n    VULKAN_HPP_ASSERT( formatCount <= imageFormatProperties.size() );\n    if ( formatCount < imageFormatProperties.size() )\n    {\n      imageFormatProperties.resize( formatCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( imageFormatProperties ) );\n  }\n\n  template <typename OpticalFlowImageFormatPropertiesNVAllocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename OpticalFlowImageFormatPropertiesNVAllocator::value_type, VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatPropertiesNV>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatPropertiesNV, OpticalFlowImageFormatPropertiesNVAllocator>>::type\n    PhysicalDevice::getOpticalFlowImageFormatsNV( const VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatInfoNV & opticalFlowImageFormatInfo,\n                                                  OpticalFlowImageFormatPropertiesNVAllocator &              opticalFlowImageFormatPropertiesNVAllocator,\n                                                  Dispatch const &                                           d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceOpticalFlowImageFormatsNV &&\n                       \"Function <vkGetPhysicalDeviceOpticalFlowImageFormatsNV> requires <VK_NV_optical_flow>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatPropertiesNV, OpticalFlowImageFormatPropertiesNVAllocator> imageFormatProperties(\n      opticalFlowImageFormatPropertiesNVAllocator );\n    uint32_t                     formatCount;\n    VULKAN_HPP_NAMESPACE::Result result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceOpticalFlowImageFormatsNV(\n        m_physicalDevice, reinterpret_cast<const VkOpticalFlowImageFormatInfoNV *>( &opticalFlowImageFormatInfo ), &formatCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && formatCount )\n      {\n        imageFormatProperties.resize( formatCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceOpticalFlowImageFormatsNV( m_physicalDevice,\n                                                          reinterpret_cast<const VkOpticalFlowImageFormatInfoNV *>( &opticalFlowImageFormatInfo ),\n                                                          &formatCount,\n                                                          reinterpret_cast<VkOpticalFlowImageFormatPropertiesNV *>( imageFormatProperties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getOpticalFlowImageFormatsNV\" );\n    VULKAN_HPP_ASSERT( formatCount <= imageFormatProperties.size() );\n    if ( formatCount < imageFormatProperties.size() )\n    {\n      imageFormatProperties.resize( formatCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( imageFormatProperties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createOpticalFlowSessionNV( const VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreateInfoNV * pCreateInfo,\n                                                                                    const VULKAN_HPP_NAMESPACE::AllocationCallbacks *            pAllocator,\n                                                                                    VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV *                 pSession,\n                                                                                    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateOpticalFlowSessionNV( static_cast<VkDevice>( m_device ),\n                                                                reinterpret_cast<const VkOpticalFlowSessionCreateInfoNV *>( pCreateInfo ),\n                                                                reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                                reinterpret_cast<VkOpticalFlowSessionNV *>( pSession ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV>::type\n                       Device::createOpticalFlowSessionNV( const VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreateInfoNV & createInfo,\n                                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>    allocator,\n                                        Dispatch const &                                             d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateOpticalFlowSessionNV && \"Function <vkCreateOpticalFlowSessionNV> requires <VK_NV_optical_flow>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV session;\n    VULKAN_HPP_NAMESPACE::Result               result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateOpticalFlowSessionNV(\n      m_device,\n      reinterpret_cast<const VkOpticalFlowSessionCreateInfoNV *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkOpticalFlowSessionNV *>( &session ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createOpticalFlowSessionNV\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( session ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV, Dispatch>>::type\n                       Device::createOpticalFlowSessionNVUnique( const VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreateInfoNV & createInfo,\n                                              Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>    allocator,\n                                              Dispatch const &                                             d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateOpticalFlowSessionNV && \"Function <vkCreateOpticalFlowSessionNV> requires <VK_NV_optical_flow>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV session;\n    VULKAN_HPP_NAMESPACE::Result               result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateOpticalFlowSessionNV(\n      m_device,\n      reinterpret_cast<const VkOpticalFlowSessionCreateInfoNV *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkOpticalFlowSessionNV *>( &session ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createOpticalFlowSessionNVUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV, Dispatch>( session, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyOpticalFlowSessionNV( VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV        session,\n                                                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                              Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyOpticalFlowSessionNV(\n      static_cast<VkDevice>( m_device ), static_cast<VkOpticalFlowSessionNV>( session ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyOpticalFlowSessionNV( VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV                session,\n                                                              Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                              Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyOpticalFlowSessionNV && \"Function <vkDestroyOpticalFlowSessionNV> requires <VK_NV_optical_flow>\" );\n#  endif\n\n    d.vkDestroyOpticalFlowSessionNV(\n      m_device,\n      static_cast<VkOpticalFlowSessionNV>( session ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV        session,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyOpticalFlowSessionNV(\n      static_cast<VkDevice>( m_device ), static_cast<VkOpticalFlowSessionNV>( session ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV                session,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyOpticalFlowSessionNV && \"Function <vkDestroyOpticalFlowSessionNV> requires <VK_NV_optical_flow>\" );\n#  endif\n\n    d.vkDestroyOpticalFlowSessionNV(\n      m_device,\n      static_cast<VkOpticalFlowSessionNV>( session ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::bindOpticalFlowSessionImageNV( VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV             session,\n                                                                                       VULKAN_HPP_NAMESPACE::OpticalFlowSessionBindingPointNV bindingPoint,\n                                                                                       VULKAN_HPP_NAMESPACE::ImageView                        view,\n                                                                                       VULKAN_HPP_NAMESPACE::ImageLayout                      layout,\n                                                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkBindOpticalFlowSessionImageNV( static_cast<VkDevice>( m_device ),\n                                                                   static_cast<VkOpticalFlowSessionNV>( session ),\n                                                                   static_cast<VkOpticalFlowSessionBindingPointNV>( bindingPoint ),\n                                                                   static_cast<VkImageView>( view ),\n                                                                   static_cast<VkImageLayout>( layout ) ) );\n  }\n#else\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type\n                                          Device::bindOpticalFlowSessionImageNV( VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV             session,\n                                           VULKAN_HPP_NAMESPACE::OpticalFlowSessionBindingPointNV bindingPoint,\n                                           VULKAN_HPP_NAMESPACE::ImageView                        view,\n                                           VULKAN_HPP_NAMESPACE::ImageLayout                      layout,\n                                           Dispatch const &                                       d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkBindOpticalFlowSessionImageNV && \"Function <vkBindOpticalFlowSessionImageNV> requires <VK_NV_optical_flow>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkBindOpticalFlowSessionImageNV( m_device,\n                                                                                    static_cast<VkOpticalFlowSessionNV>( session ),\n                                                                                    static_cast<VkOpticalFlowSessionBindingPointNV>( bindingPoint ),\n                                                                                    static_cast<VkImageView>( view ),\n                                                                                    static_cast<VkImageLayout>( layout ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::bindOpticalFlowSessionImageNV\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::opticalFlowExecuteNV( VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV             session,\n                                                              const VULKAN_HPP_NAMESPACE::OpticalFlowExecuteInfoNV * pExecuteInfo,\n                                                              Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdOpticalFlowExecuteNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                 static_cast<VkOpticalFlowSessionNV>( session ),\n                                 reinterpret_cast<const VkOpticalFlowExecuteInfoNV *>( pExecuteInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::opticalFlowExecuteNV( VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV             session,\n                                                              const VULKAN_HPP_NAMESPACE::OpticalFlowExecuteInfoNV & executeInfo,\n                                                              Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdOpticalFlowExecuteNV && \"Function <vkCmdOpticalFlowExecuteNV> requires <VK_NV_optical_flow>\" );\n#  endif\n\n    d.vkCmdOpticalFlowExecuteNV(\n      m_commandBuffer, static_cast<VkOpticalFlowSessionNV>( session ), reinterpret_cast<const VkOpticalFlowExecuteInfoNV *>( &executeInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_maintenance5 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindIndexBuffer2KHR( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                             VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                             VULKAN_HPP_NAMESPACE::DeviceSize size,\n                                                             VULKAN_HPP_NAMESPACE::IndexType  indexType,\n                                                             Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBindIndexBuffer2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                static_cast<VkBuffer>( buffer ),\n                                static_cast<VkDeviceSize>( offset ),\n                                static_cast<VkDeviceSize>( size ),\n                                static_cast<VkIndexType>( indexType ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getRenderingAreaGranularityKHR( const VULKAN_HPP_NAMESPACE::RenderingAreaInfo * pRenderingAreaInfo,\n                                                                 VULKAN_HPP_NAMESPACE::Extent2D *                pGranularity,\n                                                                 Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetRenderingAreaGranularityKHR(\n      static_cast<VkDevice>( m_device ), reinterpret_cast<const VkRenderingAreaInfo *>( pRenderingAreaInfo ), reinterpret_cast<VkExtent2D *>( pGranularity ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Extent2D\n    Device::getRenderingAreaGranularityKHR( const VULKAN_HPP_NAMESPACE::RenderingAreaInfo & renderingAreaInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetRenderingAreaGranularityKHR && \"Function <vkGetRenderingAreaGranularityKHR> requires <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Extent2D granularity;\n    d.vkGetRenderingAreaGranularityKHR(\n      m_device, reinterpret_cast<const VkRenderingAreaInfo *>( &renderingAreaInfo ), reinterpret_cast<VkExtent2D *>( &granularity ) );\n\n    return granularity;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getImageSubresourceLayoutKHR( const VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo * pInfo,\n                                                               VULKAN_HPP_NAMESPACE::SubresourceLayout2 *               pLayout,\n                                                               Dispatch const &                                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetDeviceImageSubresourceLayoutKHR(\n      static_cast<VkDevice>( m_device ), reinterpret_cast<const VkDeviceImageSubresourceInfo *>( pInfo ), reinterpret_cast<VkSubresourceLayout2 *>( pLayout ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::SubresourceLayout2\n    Device::getImageSubresourceLayoutKHR( const VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceImageSubresourceLayoutKHR &&\n                       \"Function <vkGetDeviceImageSubresourceLayoutKHR> requires <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::SubresourceLayout2 layout;\n    d.vkGetDeviceImageSubresourceLayoutKHR(\n      m_device, reinterpret_cast<const VkDeviceImageSubresourceInfo *>( &info ), reinterpret_cast<VkSubresourceLayout2 *>( &layout ) );\n\n    return layout;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n    Device::getImageSubresourceLayoutKHR( const VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDeviceImageSubresourceLayoutKHR &&\n                       \"Function <vkGetDeviceImageSubresourceLayoutKHR> requires <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n    VULKAN_HPP_NAMESPACE::SubresourceLayout2 &       layout = structureChain.template get<VULKAN_HPP_NAMESPACE::SubresourceLayout2>();\n    d.vkGetDeviceImageSubresourceLayoutKHR(\n      m_device, reinterpret_cast<const VkDeviceImageSubresourceInfo *>( &info ), reinterpret_cast<VkSubresourceLayout2 *>( &layout ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getImageSubresourceLayout2KHR( VULKAN_HPP_NAMESPACE::Image                     image,\n                                                                const VULKAN_HPP_NAMESPACE::ImageSubresource2 * pSubresource,\n                                                                VULKAN_HPP_NAMESPACE::SubresourceLayout2 *      pLayout,\n                                                                Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetImageSubresourceLayout2KHR( static_cast<VkDevice>( m_device ),\n                                       static_cast<VkImage>( image ),\n                                       reinterpret_cast<const VkImageSubresource2 *>( pSubresource ),\n                                       reinterpret_cast<VkSubresourceLayout2 *>( pLayout ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::SubresourceLayout2 Device::getImageSubresourceLayout2KHR(\n    VULKAN_HPP_NAMESPACE::Image image, const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT(\n      d.vkGetImageSubresourceLayout2KHR &&\n      \"Function <vkGetImageSubresourceLayout2KHR> requires <VK_EXT_host_image_copy> or <VK_EXT_image_compression_control> or <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::SubresourceLayout2 layout;\n    d.vkGetImageSubresourceLayout2KHR( m_device,\n                                       static_cast<VkImage>( image ),\n                                       reinterpret_cast<const VkImageSubresource2 *>( &subresource ),\n                                       reinterpret_cast<VkSubresourceLayout2 *>( &layout ) );\n\n    return layout;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> Device::getImageSubresourceLayout2KHR(\n    VULKAN_HPP_NAMESPACE::Image image, const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT(\n      d.vkGetImageSubresourceLayout2KHR &&\n      \"Function <vkGetImageSubresourceLayout2KHR> requires <VK_EXT_host_image_copy> or <VK_EXT_image_compression_control> or <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n    VULKAN_HPP_NAMESPACE::SubresourceLayout2 &       layout = structureChain.template get<VULKAN_HPP_NAMESPACE::SubresourceLayout2>();\n    d.vkGetImageSubresourceLayout2KHR( m_device,\n                                       static_cast<VkImage>( image ),\n                                       reinterpret_cast<const VkImageSubresource2 *>( &subresource ),\n                                       reinterpret_cast<VkSubresourceLayout2 *>( &layout ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_AMD_anti_lag ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::antiLagUpdateAMD( const VULKAN_HPP_NAMESPACE::AntiLagDataAMD * pData, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkAntiLagUpdateAMD( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkAntiLagDataAMD *>( pData ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::antiLagUpdateAMD( const VULKAN_HPP_NAMESPACE::AntiLagDataAMD & data, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkAntiLagUpdateAMD && \"Function <vkAntiLagUpdateAMD> requires <VK_AMD_anti_lag>\" );\n#  endif\n\n    d.vkAntiLagUpdateAMD( m_device, reinterpret_cast<const VkAntiLagDataAMD *>( &data ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_shader_object ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createShadersEXT( uint32_t                                          createInfoCount,\n                                                                          const VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT * pCreateInfos,\n                                                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                          VULKAN_HPP_NAMESPACE::ShaderEXT *                 pShaders,\n                                                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateShadersEXT( static_cast<VkDevice>( m_device ),\n                                                      createInfoCount,\n                                                      reinterpret_cast<const VkShaderCreateInfoEXT *>( pCreateInfos ),\n                                                      reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                      reinterpret_cast<VkShaderEXT *>( pShaders ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename ShaderEXTAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename ShaderEXTAllocator::value_type, VULKAN_HPP_NAMESPACE::ShaderEXT>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<VULKAN_HPP_NAMESPACE::ShaderEXT, ShaderEXTAllocator>>\n    Device::createShadersEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT> const & createInfos,\n                              Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                 allocator,\n                              Dispatch const &                                                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateShadersEXT && \"Function <vkCreateShadersEXT> requires <VK_EXT_shader_object>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::ShaderEXT, ShaderEXTAllocator> shaders( createInfos.size() );\n    VULKAN_HPP_NAMESPACE::Result                                     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateShadersEXT( m_device,\n                            createInfos.size(),\n                            reinterpret_cast<const VkShaderCreateInfoEXT *>( createInfos.data() ),\n                            reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                            reinterpret_cast<VkShaderEXT *>( shaders.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createShadersEXT\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eIncompatibleShaderBinaryEXT } );\n\n    return ResultValue<std::vector<VULKAN_HPP_NAMESPACE::ShaderEXT, ShaderEXTAllocator>>( result, std::move( shaders ) );\n  }\n\n  template <typename ShaderEXTAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename ShaderEXTAllocator::value_type, VULKAN_HPP_NAMESPACE::ShaderEXT>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<VULKAN_HPP_NAMESPACE::ShaderEXT, ShaderEXTAllocator>>\n    Device::createShadersEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT> const & createInfos,\n                              Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                 allocator,\n                              ShaderEXTAllocator &                                                                      shaderEXTAllocator,\n                              Dispatch const &                                                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateShadersEXT && \"Function <vkCreateShadersEXT> requires <VK_EXT_shader_object>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::ShaderEXT, ShaderEXTAllocator> shaders( createInfos.size(), shaderEXTAllocator );\n    VULKAN_HPP_NAMESPACE::Result                                     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateShadersEXT( m_device,\n                            createInfos.size(),\n                            reinterpret_cast<const VkShaderCreateInfoEXT *>( createInfos.data() ),\n                            reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                            reinterpret_cast<VkShaderEXT *>( shaders.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createShadersEXT\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eIncompatibleShaderBinaryEXT } );\n\n    return ResultValue<std::vector<VULKAN_HPP_NAMESPACE::ShaderEXT, ShaderEXTAllocator>>( result, std::move( shaders ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<VULKAN_HPP_NAMESPACE::ShaderEXT>\n                                         Device::createShaderEXT( const VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT &         createInfo,\n                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                             Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateShadersEXT && \"Function <vkCreateShadersEXT> requires <VK_EXT_shader_object>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::ShaderEXT shader;\n    VULKAN_HPP_NAMESPACE::Result    result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateShadersEXT( m_device,\n                            1,\n                            reinterpret_cast<const VkShaderCreateInfoEXT *>( &createInfo ),\n                            reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                            reinterpret_cast<VkShaderEXT *>( &shader ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createShaderEXT\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eIncompatibleShaderBinaryEXT } );\n\n    return ResultValue<VULKAN_HPP_NAMESPACE::ShaderEXT>( result, std::move( shader ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <\n    typename Dispatch,\n    typename ShaderEXTAllocator,\n    typename std::enable_if<std::is_same<typename ShaderEXTAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::ShaderEXT, Dispatch>>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::ShaderEXT, Dispatch>, ShaderEXTAllocator>>\n    Device::createShadersEXTUnique( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT> const & createInfos,\n                                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                 allocator,\n                                    Dispatch const &                                                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateShadersEXT && \"Function <vkCreateShadersEXT> requires <VK_EXT_shader_object>\" );\n#    endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::ShaderEXT> shaders( createInfos.size() );\n    VULKAN_HPP_NAMESPACE::Result                 result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateShadersEXT( m_device,\n                            createInfos.size(),\n                            reinterpret_cast<const VkShaderCreateInfoEXT *>( createInfos.data() ),\n                            reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                            reinterpret_cast<VkShaderEXT *>( shaders.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createShadersEXTUnique\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eIncompatibleShaderBinaryEXT } );\n    std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::ShaderEXT, Dispatch>, ShaderEXTAllocator> uniqueShaders;\n    uniqueShaders.reserve( createInfos.size() );\n    detail::ObjectDestroy<Device, Dispatch> deleter( *this, allocator, d );\n    for ( auto const & shader : shaders )\n    {\n      uniqueShaders.push_back( UniqueHandle<ShaderEXT, Dispatch>( shader, deleter ) );\n    }\n    return ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::ShaderEXT, Dispatch>, ShaderEXTAllocator>>( result, std::move( uniqueShaders ) );\n  }\n\n  template <\n    typename Dispatch,\n    typename ShaderEXTAllocator,\n    typename std::enable_if<std::is_same<typename ShaderEXTAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::ShaderEXT, Dispatch>>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::ShaderEXT, Dispatch>, ShaderEXTAllocator>>\n    Device::createShadersEXTUnique( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT> const & createInfos,\n                                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                 allocator,\n                                    ShaderEXTAllocator &                                                                      shaderEXTAllocator,\n                                    Dispatch const &                                                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateShadersEXT && \"Function <vkCreateShadersEXT> requires <VK_EXT_shader_object>\" );\n#    endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::ShaderEXT> shaders( createInfos.size() );\n    VULKAN_HPP_NAMESPACE::Result                 result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateShadersEXT( m_device,\n                            createInfos.size(),\n                            reinterpret_cast<const VkShaderCreateInfoEXT *>( createInfos.data() ),\n                            reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                            reinterpret_cast<VkShaderEXT *>( shaders.data() ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createShadersEXTUnique\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eIncompatibleShaderBinaryEXT } );\n    std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::ShaderEXT, Dispatch>, ShaderEXTAllocator> uniqueShaders( shaderEXTAllocator );\n    uniqueShaders.reserve( createInfos.size() );\n    detail::ObjectDestroy<Device, Dispatch> deleter( *this, allocator, d );\n    for ( auto const & shader : shaders )\n    {\n      uniqueShaders.push_back( UniqueHandle<ShaderEXT, Dispatch>( shader, deleter ) );\n    }\n    return ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::ShaderEXT, Dispatch>, ShaderEXTAllocator>>( result, std::move( uniqueShaders ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<UniqueHandle<VULKAN_HPP_NAMESPACE::ShaderEXT, Dispatch>>\n                                         Device::createShaderEXTUnique( const VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT &         createInfo,\n                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                   Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateShadersEXT && \"Function <vkCreateShadersEXT> requires <VK_EXT_shader_object>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::ShaderEXT shader;\n    VULKAN_HPP_NAMESPACE::Result    result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkCreateShadersEXT( m_device,\n                            1,\n                            reinterpret_cast<const VkShaderCreateInfoEXT *>( &createInfo ),\n                            reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n                            reinterpret_cast<VkShaderEXT *>( &shader ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::createShaderEXTUnique\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eIncompatibleShaderBinaryEXT } );\n\n    return ResultValue<UniqueHandle<VULKAN_HPP_NAMESPACE::ShaderEXT, Dispatch>>(\n      result, UniqueHandle<VULKAN_HPP_NAMESPACE::ShaderEXT, Dispatch>( shader, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyShaderEXT( VULKAN_HPP_NAMESPACE::ShaderEXT                   shader,\n                                                   const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                   Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyShaderEXT(\n      static_cast<VkDevice>( m_device ), static_cast<VkShaderEXT>( shader ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyShaderEXT( VULKAN_HPP_NAMESPACE::ShaderEXT                           shader,\n                                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                   Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyShaderEXT && \"Function <vkDestroyShaderEXT> requires <VK_EXT_shader_object>\" );\n#  endif\n\n    d.vkDestroyShaderEXT( m_device,\n                          static_cast<VkShaderEXT>( shader ),\n                          reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::ShaderEXT                   shader,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyShaderEXT(\n      static_cast<VkDevice>( m_device ), static_cast<VkShaderEXT>( shader ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::ShaderEXT                           shader,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyShaderEXT && \"Function <vkDestroyShaderEXT> requires <VK_EXT_shader_object>\" );\n#  endif\n\n    d.vkDestroyShaderEXT( m_device,\n                          static_cast<VkShaderEXT>( shader ),\n                          reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::getShaderBinaryDataEXT( VULKAN_HPP_NAMESPACE::ShaderEXT shader, size_t * pDataSize, void * pData, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetShaderBinaryDataEXT( static_cast<VkDevice>( m_device ), static_cast<VkShaderEXT>( shader ), pDataSize, pData ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Uint8_tAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<uint8_t, Uint8_tAllocator>>::type\n                       Device::getShaderBinaryDataEXT( VULKAN_HPP_NAMESPACE::ShaderEXT shader, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetShaderBinaryDataEXT && \"Function <vkGetShaderBinaryDataEXT> requires <VK_EXT_shader_object>\" );\n#  endif\n\n    std::vector<uint8_t, Uint8_tAllocator> data;\n    size_t                                 dataSize;\n    VULKAN_HPP_NAMESPACE::Result           result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetShaderBinaryDataEXT( m_device, static_cast<VkShaderEXT>( shader ), &dataSize, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && dataSize )\n      {\n        data.resize( dataSize );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetShaderBinaryDataEXT( m_device, static_cast<VkShaderEXT>( shader ), &dataSize, reinterpret_cast<void *>( data.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getShaderBinaryDataEXT\" );\n    VULKAN_HPP_ASSERT( dataSize <= data.size() );\n    if ( dataSize < data.size() )\n    {\n      data.resize( dataSize );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data ) );\n  }\n\n  template <typename Uint8_tAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<uint8_t, Uint8_tAllocator>>::type\n                       Device::getShaderBinaryDataEXT( VULKAN_HPP_NAMESPACE::ShaderEXT shader, Uint8_tAllocator & uint8_tAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetShaderBinaryDataEXT && \"Function <vkGetShaderBinaryDataEXT> requires <VK_EXT_shader_object>\" );\n#  endif\n\n    std::vector<uint8_t, Uint8_tAllocator> data( uint8_tAllocator );\n    size_t                                 dataSize;\n    VULKAN_HPP_NAMESPACE::Result           result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetShaderBinaryDataEXT( m_device, static_cast<VkShaderEXT>( shader ), &dataSize, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && dataSize )\n      {\n        data.resize( dataSize );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetShaderBinaryDataEXT( m_device, static_cast<VkShaderEXT>( shader ), &dataSize, reinterpret_cast<void *>( data.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getShaderBinaryDataEXT\" );\n    VULKAN_HPP_ASSERT( dataSize <= data.size() );\n    if ( dataSize < data.size() )\n    {\n      data.resize( dataSize );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindShadersEXT( uint32_t                                          stageCount,\n                                                        const VULKAN_HPP_NAMESPACE::ShaderStageFlagBits * pStages,\n                                                        const VULKAN_HPP_NAMESPACE::ShaderEXT *           pShaders,\n                                                        Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBindShadersEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                           stageCount,\n                           reinterpret_cast<const VkShaderStageFlagBits *>( pStages ),\n                           reinterpret_cast<const VkShaderEXT *>( pShaders ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindShadersEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ShaderStageFlagBits> const & stages,\n                                                        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ShaderEXT> const &           shaders,\n                                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBindShadersEXT && \"Function <vkCmdBindShadersEXT> requires <VK_EXT_shader_object>\" );\n#  endif\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n    VULKAN_HPP_ASSERT( stages.size() == shaders.size() );\n#  else\n    if ( stages.size() != shaders.size() )\n    {\n      throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::bindShadersEXT: stages.size() != shaders.size()\" );\n    }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n    d.vkCmdBindShadersEXT( m_commandBuffer,\n                           stages.size(),\n                           reinterpret_cast<const VkShaderStageFlagBits *>( stages.data() ),\n                           reinterpret_cast<const VkShaderEXT *>( shaders.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDepthClampRangeEXT( VULKAN_HPP_NAMESPACE::DepthClampModeEXT          depthClampMode,\n                                                               const VULKAN_HPP_NAMESPACE::DepthClampRangeEXT * pDepthClampRange,\n                                                               Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDepthClampRangeEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                  static_cast<VkDepthClampModeEXT>( depthClampMode ),\n                                  reinterpret_cast<const VkDepthClampRangeEXT *>( pDepthClampRange ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setDepthClampRangeEXT( VULKAN_HPP_NAMESPACE::DepthClampModeEXT                  depthClampMode,\n                                                               Optional<const VULKAN_HPP_NAMESPACE::DepthClampRangeEXT> depthClampRange,\n                                                               Dispatch const &                                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetDepthClampRangeEXT &&\n                       \"Function <vkCmdSetDepthClampRangeEXT> requires <VK_EXT_depth_clamp_control> or <VK_EXT_shader_object>\" );\n#  endif\n\n    d.vkCmdSetDepthClampRangeEXT(\n      m_commandBuffer,\n      static_cast<VkDepthClampModeEXT>( depthClampMode ),\n      reinterpret_cast<const VkDepthClampRangeEXT *>( static_cast<const VULKAN_HPP_NAMESPACE::DepthClampRangeEXT *>( depthClampRange ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_pipeline_binary ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::createPipelineBinariesKHR( const VULKAN_HPP_NAMESPACE::PipelineBinaryCreateInfoKHR * pCreateInfo,\n                                                                                   const VULKAN_HPP_NAMESPACE::AllocationCallbacks *         pAllocator,\n                                                                                   VULKAN_HPP_NAMESPACE::PipelineBinaryHandlesInfoKHR *      pBinaries,\n                                                                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreatePipelineBinariesKHR( static_cast<VkDevice>( m_device ),\n                                                               reinterpret_cast<const VkPipelineBinaryCreateInfoKHR *>( pCreateInfo ),\n                                                               reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                               reinterpret_cast<VkPipelineBinaryHandlesInfoKHR *>( pBinaries ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename PipelineBinaryKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename PipelineBinaryKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PipelineBinaryKHR>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR, PipelineBinaryKHRAllocator>>\n                                         Device::createPipelineBinariesKHR( const VULKAN_HPP_NAMESPACE::PipelineBinaryCreateInfoKHR & createInfo,\n                                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                       Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreatePipelineBinariesKHR && \"Function <vkCreatePipelineBinariesKHR> requires <VK_KHR_pipeline_binary>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR, PipelineBinaryKHRAllocator> pipelineBinaries;\n    VULKAN_HPP_NAMESPACE::PipelineBinaryHandlesInfoKHR                               binaries;\n    VULKAN_HPP_NAMESPACE::Result                                                     result;\n    if ( createInfo.pKeysAndDataInfo )\n    {\n      VULKAN_HPP_ASSERT( !createInfo.pipeline && !createInfo.pPipelineCreateInfo );\n      pipelineBinaries.resize( createInfo.pKeysAndDataInfo->binaryCount );\n      binaries.pipelineBinaryCount = createInfo.pKeysAndDataInfo->binaryCount;\n      binaries.pPipelineBinaries   = pipelineBinaries.data();\n      result                       = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreatePipelineBinariesKHR(\n        m_device,\n        reinterpret_cast<const VkPipelineBinaryCreateInfoKHR *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkPipelineBinaryHandlesInfoKHR *>( &binaries ) ) );\n    }\n    else\n    {\n      VULKAN_HPP_ASSERT( !createInfo.pipeline ^ !createInfo.pPipelineCreateInfo );\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreatePipelineBinariesKHR(\n        m_device,\n        reinterpret_cast<const VkPipelineBinaryCreateInfoKHR *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkPipelineBinaryHandlesInfoKHR *>( &binaries ) ) );\n      if ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n        pipelineBinaries.resize( binaries.pipelineBinaryCount );\n        binaries.pPipelineBinaries = pipelineBinaries.data();\n        result                     = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreatePipelineBinariesKHR(\n          m_device,\n          reinterpret_cast<const VkPipelineBinaryCreateInfoKHR *>( &createInfo ),\n          reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n          reinterpret_cast<VkPipelineBinaryHandlesInfoKHR *>( &binaries ) ) );\n      }\n    }\n\n    VULKAN_HPP_NAMESPACE::detail::resultCheck(\n      result,\n      VULKAN_HPP_NAMESPACE_STRING \"::Device::createPipelineBinariesKHR\",\n      { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eIncomplete, VULKAN_HPP_NAMESPACE::Result::ePipelineBinaryMissingKHR } );\n\n    return ResultValue<std::vector<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR, PipelineBinaryKHRAllocator>>( result, std::move( pipelineBinaries ) );\n  }\n\n  template <typename PipelineBinaryKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename PipelineBinaryKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PipelineBinaryKHR>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR, PipelineBinaryKHRAllocator>>\n                                         Device::createPipelineBinariesKHR( const VULKAN_HPP_NAMESPACE::PipelineBinaryCreateInfoKHR & createInfo,\n                                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                       PipelineBinaryKHRAllocator &                              pipelineBinaryKHRAllocator,\n                                       Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreatePipelineBinariesKHR && \"Function <vkCreatePipelineBinariesKHR> requires <VK_KHR_pipeline_binary>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR, PipelineBinaryKHRAllocator> pipelineBinaries( pipelineBinaryKHRAllocator );\n    VULKAN_HPP_NAMESPACE::PipelineBinaryHandlesInfoKHR                               binaries;\n    VULKAN_HPP_NAMESPACE::Result                                                     result;\n    if ( createInfo.pKeysAndDataInfo )\n    {\n      VULKAN_HPP_ASSERT( !createInfo.pipeline && !createInfo.pPipelineCreateInfo );\n      pipelineBinaries.resize( createInfo.pKeysAndDataInfo->binaryCount );\n      binaries.pipelineBinaryCount = createInfo.pKeysAndDataInfo->binaryCount;\n      binaries.pPipelineBinaries   = pipelineBinaries.data();\n      result                       = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreatePipelineBinariesKHR(\n        m_device,\n        reinterpret_cast<const VkPipelineBinaryCreateInfoKHR *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkPipelineBinaryHandlesInfoKHR *>( &binaries ) ) );\n    }\n    else\n    {\n      VULKAN_HPP_ASSERT( !createInfo.pipeline ^ !createInfo.pPipelineCreateInfo );\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreatePipelineBinariesKHR(\n        m_device,\n        reinterpret_cast<const VkPipelineBinaryCreateInfoKHR *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkPipelineBinaryHandlesInfoKHR *>( &binaries ) ) );\n      if ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n        pipelineBinaries.resize( binaries.pipelineBinaryCount );\n        binaries.pPipelineBinaries = pipelineBinaries.data();\n        result                     = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreatePipelineBinariesKHR(\n          m_device,\n          reinterpret_cast<const VkPipelineBinaryCreateInfoKHR *>( &createInfo ),\n          reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n          reinterpret_cast<VkPipelineBinaryHandlesInfoKHR *>( &binaries ) ) );\n      }\n    }\n\n    VULKAN_HPP_NAMESPACE::detail::resultCheck(\n      result,\n      VULKAN_HPP_NAMESPACE_STRING \"::Device::createPipelineBinariesKHR\",\n      { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eIncomplete, VULKAN_HPP_NAMESPACE::Result::ePipelineBinaryMissingKHR } );\n\n    return ResultValue<std::vector<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR, PipelineBinaryKHRAllocator>>( result, std::move( pipelineBinaries ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch,\n            typename PipelineBinaryKHRAllocator,\n            typename std::enable_if<\n              std::is_same<typename PipelineBinaryKHRAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR, Dispatch>>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR, Dispatch>, PipelineBinaryKHRAllocator>>\n                                         Device::createPipelineBinariesKHRUnique( const VULKAN_HPP_NAMESPACE::PipelineBinaryCreateInfoKHR & createInfo,\n                                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                             Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreatePipelineBinariesKHR && \"Function <vkCreatePipelineBinariesKHR> requires <VK_KHR_pipeline_binary>\" );\n#    endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR> pipelineBinaries;\n    VULKAN_HPP_NAMESPACE::PipelineBinaryHandlesInfoKHR   binaries;\n    VULKAN_HPP_NAMESPACE::Result                         result;\n    if ( createInfo.pKeysAndDataInfo )\n    {\n      VULKAN_HPP_ASSERT( !createInfo.pipeline && !createInfo.pPipelineCreateInfo );\n      pipelineBinaries.resize( createInfo.pKeysAndDataInfo->binaryCount );\n      binaries.pipelineBinaryCount = createInfo.pKeysAndDataInfo->binaryCount;\n      binaries.pPipelineBinaries   = pipelineBinaries.data();\n      result                       = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreatePipelineBinariesKHR(\n        m_device,\n        reinterpret_cast<const VkPipelineBinaryCreateInfoKHR *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkPipelineBinaryHandlesInfoKHR *>( &binaries ) ) );\n    }\n    else\n    {\n      VULKAN_HPP_ASSERT( !createInfo.pipeline ^ !createInfo.pPipelineCreateInfo );\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreatePipelineBinariesKHR(\n        m_device,\n        reinterpret_cast<const VkPipelineBinaryCreateInfoKHR *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkPipelineBinaryHandlesInfoKHR *>( &binaries ) ) );\n      if ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n        pipelineBinaries.resize( binaries.pipelineBinaryCount );\n        binaries.pPipelineBinaries = pipelineBinaries.data();\n        result                     = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreatePipelineBinariesKHR(\n          m_device,\n          reinterpret_cast<const VkPipelineBinaryCreateInfoKHR *>( &createInfo ),\n          reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n          reinterpret_cast<VkPipelineBinaryHandlesInfoKHR *>( &binaries ) ) );\n      }\n    }\n\n    VULKAN_HPP_NAMESPACE::detail::resultCheck(\n      result,\n      VULKAN_HPP_NAMESPACE_STRING \"::Device::createPipelineBinariesKHRUnique\",\n      { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eIncomplete, VULKAN_HPP_NAMESPACE::Result::ePipelineBinaryMissingKHR } );\n    std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR, Dispatch>, PipelineBinaryKHRAllocator> uniquePipelineBinaries;\n    uniquePipelineBinaries.reserve( pipelineBinaries.size() );\n    detail::ObjectDestroy<Device, Dispatch> deleter( *this, allocator, d );\n    for ( auto const & pipelineBinary : pipelineBinaries )\n    {\n      uniquePipelineBinaries.push_back( UniqueHandle<PipelineBinaryKHR, Dispatch>( pipelineBinary, deleter ) );\n    }\n    return ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR, Dispatch>, PipelineBinaryKHRAllocator>>(\n      result, std::move( uniquePipelineBinaries ) );\n  }\n\n  template <typename Dispatch,\n            typename PipelineBinaryKHRAllocator,\n            typename std::enable_if<\n              std::is_same<typename PipelineBinaryKHRAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR, Dispatch>>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR, Dispatch>, PipelineBinaryKHRAllocator>>\n                                         Device::createPipelineBinariesKHRUnique( const VULKAN_HPP_NAMESPACE::PipelineBinaryCreateInfoKHR & createInfo,\n                                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                             PipelineBinaryKHRAllocator &                              pipelineBinaryKHRAllocator,\n                                             Dispatch const &                                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreatePipelineBinariesKHR && \"Function <vkCreatePipelineBinariesKHR> requires <VK_KHR_pipeline_binary>\" );\n#    endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR> pipelineBinaries;\n    VULKAN_HPP_NAMESPACE::PipelineBinaryHandlesInfoKHR   binaries;\n    VULKAN_HPP_NAMESPACE::Result                         result;\n    if ( createInfo.pKeysAndDataInfo )\n    {\n      VULKAN_HPP_ASSERT( !createInfo.pipeline && !createInfo.pPipelineCreateInfo );\n      pipelineBinaries.resize( createInfo.pKeysAndDataInfo->binaryCount );\n      binaries.pipelineBinaryCount = createInfo.pKeysAndDataInfo->binaryCount;\n      binaries.pPipelineBinaries   = pipelineBinaries.data();\n      result                       = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreatePipelineBinariesKHR(\n        m_device,\n        reinterpret_cast<const VkPipelineBinaryCreateInfoKHR *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkPipelineBinaryHandlesInfoKHR *>( &binaries ) ) );\n    }\n    else\n    {\n      VULKAN_HPP_ASSERT( !createInfo.pipeline ^ !createInfo.pPipelineCreateInfo );\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreatePipelineBinariesKHR(\n        m_device,\n        reinterpret_cast<const VkPipelineBinaryCreateInfoKHR *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkPipelineBinaryHandlesInfoKHR *>( &binaries ) ) );\n      if ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n        pipelineBinaries.resize( binaries.pipelineBinaryCount );\n        binaries.pPipelineBinaries = pipelineBinaries.data();\n        result                     = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreatePipelineBinariesKHR(\n          m_device,\n          reinterpret_cast<const VkPipelineBinaryCreateInfoKHR *>( &createInfo ),\n          reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n          reinterpret_cast<VkPipelineBinaryHandlesInfoKHR *>( &binaries ) ) );\n      }\n    }\n\n    VULKAN_HPP_NAMESPACE::detail::resultCheck(\n      result,\n      VULKAN_HPP_NAMESPACE_STRING \"::Device::createPipelineBinariesKHRUnique\",\n      { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eIncomplete, VULKAN_HPP_NAMESPACE::Result::ePipelineBinaryMissingKHR } );\n    std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR, Dispatch>, PipelineBinaryKHRAllocator> uniquePipelineBinaries(\n      pipelineBinaryKHRAllocator );\n    uniquePipelineBinaries.reserve( pipelineBinaries.size() );\n    detail::ObjectDestroy<Device, Dispatch> deleter( *this, allocator, d );\n    for ( auto const & pipelineBinary : pipelineBinaries )\n    {\n      uniquePipelineBinaries.push_back( UniqueHandle<PipelineBinaryKHR, Dispatch>( pipelineBinary, deleter ) );\n    }\n    return ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR, Dispatch>, PipelineBinaryKHRAllocator>>(\n      result, std::move( uniquePipelineBinaries ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyPipelineBinaryKHR( VULKAN_HPP_NAMESPACE::PipelineBinaryKHR           pipelineBinary,\n                                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                           Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyPipelineBinaryKHR(\n      static_cast<VkDevice>( m_device ), static_cast<VkPipelineBinaryKHR>( pipelineBinary ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyPipelineBinaryKHR( VULKAN_HPP_NAMESPACE::PipelineBinaryKHR                   pipelineBinary,\n                                                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                           Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyPipelineBinaryKHR && \"Function <vkDestroyPipelineBinaryKHR> requires <VK_KHR_pipeline_binary>\" );\n#  endif\n\n    d.vkDestroyPipelineBinaryKHR(\n      m_device,\n      static_cast<VkPipelineBinaryKHR>( pipelineBinary ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::PipelineBinaryKHR           pipelineBinary,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyPipelineBinaryKHR(\n      static_cast<VkDevice>( m_device ), static_cast<VkPipelineBinaryKHR>( pipelineBinary ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::PipelineBinaryKHR                   pipelineBinary,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyPipelineBinaryKHR && \"Function <vkDestroyPipelineBinaryKHR> requires <VK_KHR_pipeline_binary>\" );\n#  endif\n\n    d.vkDestroyPipelineBinaryKHR(\n      m_device,\n      static_cast<VkPipelineBinaryKHR>( pipelineBinary ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getPipelineKeyKHR( const VULKAN_HPP_NAMESPACE::PipelineCreateInfoKHR * pPipelineCreateInfo,\n                                                                           VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR *        pPipelineKey,\n                                                                           Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPipelineKeyKHR( static_cast<VkDevice>( m_device ),\n                                                       reinterpret_cast<const VkPipelineCreateInfoKHR *>( pPipelineCreateInfo ),\n                                                       reinterpret_cast<VkPipelineBinaryKeyKHR *>( pPipelineKey ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR>::type\n                       Device::getPipelineKeyKHR( Optional<const VULKAN_HPP_NAMESPACE::PipelineCreateInfoKHR> pipelineCreateInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPipelineKeyKHR && \"Function <vkGetPipelineKeyKHR> requires <VK_KHR_pipeline_binary>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR pipelineKey;\n    VULKAN_HPP_NAMESPACE::Result               result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPipelineKeyKHR(\n      m_device,\n      reinterpret_cast<const VkPipelineCreateInfoKHR *>( static_cast<const VULKAN_HPP_NAMESPACE::PipelineCreateInfoKHR *>( pipelineCreateInfo ) ),\n      reinterpret_cast<VkPipelineBinaryKeyKHR *>( &pipelineKey ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getPipelineKeyKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( pipelineKey ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getPipelineBinaryDataKHR( const VULKAN_HPP_NAMESPACE::PipelineBinaryDataInfoKHR * pInfo,\n                                                                                  VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR *            pPipelineBinaryKey,\n                                                                                  size_t *         pPipelineBinaryDataSize,\n                                                                                  void *           pPipelineBinaryData,\n                                                                                  Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPipelineBinaryDataKHR( static_cast<VkDevice>( m_device ),\n                                                              reinterpret_cast<const VkPipelineBinaryDataInfoKHR *>( pInfo ),\n                                                              reinterpret_cast<VkPipelineBinaryKeyKHR *>( pPipelineBinaryKey ),\n                                                              pPipelineBinaryDataSize,\n                                                              pPipelineBinaryData ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Uint8_tAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::pair<VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR, std::vector<uint8_t, Uint8_tAllocator>>>::type\n    Device::getPipelineBinaryDataKHR( const VULKAN_HPP_NAMESPACE::PipelineBinaryDataInfoKHR & info, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPipelineBinaryDataKHR && \"Function <vkGetPipelineBinaryDataKHR> requires <VK_KHR_pipeline_binary>\" );\n#  endif\n\n    std::pair<VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR, std::vector<uint8_t, Uint8_tAllocator>> data_;\n    VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR &                                                  pipelineBinaryKey  = data_.first;\n    std::vector<uint8_t, Uint8_tAllocator> &                                                      pipelineBinaryData = data_.second;\n    size_t                                                                                        pipelineBinaryDataSize;\n    VULKAN_HPP_NAMESPACE::Result                                                                  result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPipelineBinaryDataKHR( m_device,\n                                                                               reinterpret_cast<const VkPipelineBinaryDataInfoKHR *>( &info ),\n                                                                               reinterpret_cast<VkPipelineBinaryKeyKHR *>( &pipelineBinaryKey ),\n                                                                               &pipelineBinaryDataSize,\n                                                                               nullptr ) );\n    if ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess )\n    {\n      pipelineBinaryData.resize( pipelineBinaryDataSize );\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPipelineBinaryDataKHR( m_device,\n                                                                                        reinterpret_cast<const VkPipelineBinaryDataInfoKHR *>( &info ),\n                                                                                        reinterpret_cast<VkPipelineBinaryKeyKHR *>( &pipelineBinaryKey ),\n                                                                                        &pipelineBinaryDataSize,\n                                                                                        reinterpret_cast<void *>( pipelineBinaryData.data() ) ) );\n    }\n\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getPipelineBinaryDataKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data_ ) );\n  }\n\n  template <typename Uint8_tAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::pair<VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR, std::vector<uint8_t, Uint8_tAllocator>>>::type\n    Device::getPipelineBinaryDataKHR( const VULKAN_HPP_NAMESPACE::PipelineBinaryDataInfoKHR & info,\n                                      Uint8_tAllocator &                                      uint8_tAllocator,\n                                      Dispatch const &                                        d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPipelineBinaryDataKHR && \"Function <vkGetPipelineBinaryDataKHR> requires <VK_KHR_pipeline_binary>\" );\n#  endif\n\n    std::pair<VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR, std::vector<uint8_t, Uint8_tAllocator>> data_(\n      std::piecewise_construct, std::forward_as_tuple(), std::forward_as_tuple( uint8_tAllocator ) );\n    VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR & pipelineBinaryKey  = data_.first;\n    std::vector<uint8_t, Uint8_tAllocator> &     pipelineBinaryData = data_.second;\n    size_t                                       pipelineBinaryDataSize;\n    VULKAN_HPP_NAMESPACE::Result                 result =\n      static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPipelineBinaryDataKHR( m_device,\n                                                                               reinterpret_cast<const VkPipelineBinaryDataInfoKHR *>( &info ),\n                                                                               reinterpret_cast<VkPipelineBinaryKeyKHR *>( &pipelineBinaryKey ),\n                                                                               &pipelineBinaryDataSize,\n                                                                               nullptr ) );\n    if ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess )\n    {\n      pipelineBinaryData.resize( pipelineBinaryDataSize );\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPipelineBinaryDataKHR( m_device,\n                                                                                        reinterpret_cast<const VkPipelineBinaryDataInfoKHR *>( &info ),\n                                                                                        reinterpret_cast<VkPipelineBinaryKeyKHR *>( &pipelineBinaryKey ),\n                                                                                        &pipelineBinaryDataSize,\n                                                                                        reinterpret_cast<void *>( pipelineBinaryData.data() ) ) );\n    }\n\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getPipelineBinaryDataKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data_ ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE Result Device::releaseCapturedPipelineDataKHR( const VULKAN_HPP_NAMESPACE::ReleaseCapturedPipelineDataInfoKHR * pInfo,\n                                                                   const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                pAllocator,\n                                                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkReleaseCapturedPipelineDataKHR( static_cast<VkDevice>( m_device ),\n                                                                    reinterpret_cast<const VkReleaseCapturedPipelineDataInfoKHR *>( pInfo ),\n                                                                    reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::releaseCapturedPipelineDataKHR( const VULKAN_HPP_NAMESPACE::ReleaseCapturedPipelineDataInfoKHR & info,\n                                                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>        allocator,\n                                                                 Dispatch const &                                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkReleaseCapturedPipelineDataKHR && \"Function <vkReleaseCapturedPipelineDataKHR> requires <VK_KHR_pipeline_binary>\" );\n#  endif\n\n    d.vkReleaseCapturedPipelineDataKHR(\n      m_device,\n      reinterpret_cast<const VkReleaseCapturedPipelineDataInfoKHR *>( &info ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_QCOM_tile_properties ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getFramebufferTilePropertiesQCOM( VULKAN_HPP_NAMESPACE::Framebuffer          framebuffer,\n                                                                                          uint32_t *                                 pPropertiesCount,\n                                                                                          VULKAN_HPP_NAMESPACE::TilePropertiesQCOM * pProperties,\n                                                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetFramebufferTilePropertiesQCOM( static_cast<VkDevice>( m_device ),\n                                                                      static_cast<VkFramebuffer>( framebuffer ),\n                                                                      pPropertiesCount,\n                                                                      reinterpret_cast<VkTilePropertiesQCOM *>( pProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename TilePropertiesQCOMAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename TilePropertiesQCOMAllocator::value_type, VULKAN_HPP_NAMESPACE::TilePropertiesQCOM>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::TilePropertiesQCOM, TilePropertiesQCOMAllocator>>::type\n                       Device::getFramebufferTilePropertiesQCOM( VULKAN_HPP_NAMESPACE::Framebuffer framebuffer, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetFramebufferTilePropertiesQCOM && \"Function <vkGetFramebufferTilePropertiesQCOM> requires <VK_QCOM_tile_properties>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::TilePropertiesQCOM, TilePropertiesQCOMAllocator> properties;\n    uint32_t                                                                           propertiesCount;\n    VULKAN_HPP_NAMESPACE::Result                                                       result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetFramebufferTilePropertiesQCOM( m_device, static_cast<VkFramebuffer>( framebuffer ), &propertiesCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertiesCount )\n      {\n        properties.resize( propertiesCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetFramebufferTilePropertiesQCOM(\n          m_device, static_cast<VkFramebuffer>( framebuffer ), &propertiesCount, reinterpret_cast<VkTilePropertiesQCOM *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n\n    VULKAN_HPP_ASSERT( propertiesCount <= properties.size() );\n    if ( propertiesCount < properties.size() )\n    {\n      properties.resize( propertiesCount );\n    }\n    return properties;\n  }\n\n  template <typename TilePropertiesQCOMAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename TilePropertiesQCOMAllocator::value_type, VULKAN_HPP_NAMESPACE::TilePropertiesQCOM>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::TilePropertiesQCOM, TilePropertiesQCOMAllocator>>::type\n                       Device::getFramebufferTilePropertiesQCOM( VULKAN_HPP_NAMESPACE::Framebuffer framebuffer,\n                                              TilePropertiesQCOMAllocator &     tilePropertiesQCOMAllocator,\n                                              Dispatch const &                  d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetFramebufferTilePropertiesQCOM && \"Function <vkGetFramebufferTilePropertiesQCOM> requires <VK_QCOM_tile_properties>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::TilePropertiesQCOM, TilePropertiesQCOMAllocator> properties( tilePropertiesQCOMAllocator );\n    uint32_t                                                                           propertiesCount;\n    VULKAN_HPP_NAMESPACE::Result                                                       result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetFramebufferTilePropertiesQCOM( m_device, static_cast<VkFramebuffer>( framebuffer ), &propertiesCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertiesCount )\n      {\n        properties.resize( propertiesCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetFramebufferTilePropertiesQCOM(\n          m_device, static_cast<VkFramebuffer>( framebuffer ), &propertiesCount, reinterpret_cast<VkTilePropertiesQCOM *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n\n    VULKAN_HPP_ASSERT( propertiesCount <= properties.size() );\n    if ( propertiesCount < properties.size() )\n    {\n      properties.resize( propertiesCount );\n    }\n    return properties;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE Result Device::getDynamicRenderingTilePropertiesQCOM( const VULKAN_HPP_NAMESPACE::RenderingInfo * pRenderingInfo,\n                                                                          VULKAN_HPP_NAMESPACE::TilePropertiesQCOM *  pProperties,\n                                                                          Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetDynamicRenderingTilePropertiesQCOM( static_cast<VkDevice>( m_device ),\n                                                                           reinterpret_cast<const VkRenderingInfo *>( pRenderingInfo ),\n                                                                           reinterpret_cast<VkTilePropertiesQCOM *>( pProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::TilePropertiesQCOM\n    Device::getDynamicRenderingTilePropertiesQCOM( const VULKAN_HPP_NAMESPACE::RenderingInfo & renderingInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetDynamicRenderingTilePropertiesQCOM && \"Function <vkGetDynamicRenderingTilePropertiesQCOM> requires <VK_QCOM_tile_properties>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::TilePropertiesQCOM properties;\n    d.vkGetDynamicRenderingTilePropertiesQCOM(\n      m_device, reinterpret_cast<const VkRenderingInfo *>( &renderingInfo ), reinterpret_cast<VkTilePropertiesQCOM *>( &properties ) );\n\n    return properties;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_NV_cooperative_vector ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getCooperativeVectorPropertiesNV(\n    uint32_t * pPropertyCount, VULKAN_HPP_NAMESPACE::CooperativeVectorPropertiesNV * pProperties, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceCooperativeVectorPropertiesNV(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ), pPropertyCount, reinterpret_cast<VkCooperativeVectorPropertiesNV *>( pProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename CooperativeVectorPropertiesNVAllocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename CooperativeVectorPropertiesNVAllocator::value_type, VULKAN_HPP_NAMESPACE::CooperativeVectorPropertiesNV>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::CooperativeVectorPropertiesNV, CooperativeVectorPropertiesNVAllocator>>::type\n    PhysicalDevice::getCooperativeVectorPropertiesNV( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceCooperativeVectorPropertiesNV &&\n                       \"Function <vkGetPhysicalDeviceCooperativeVectorPropertiesNV> requires <VK_NV_cooperative_vector>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::CooperativeVectorPropertiesNV, CooperativeVectorPropertiesNVAllocator> properties;\n    uint32_t                                                                                                 propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                             result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceCooperativeVectorPropertiesNV( m_physicalDevice, &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceCooperativeVectorPropertiesNV(\n          m_physicalDevice, &propertyCount, reinterpret_cast<VkCooperativeVectorPropertiesNV *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getCooperativeVectorPropertiesNV\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n\n  template <typename CooperativeVectorPropertiesNVAllocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename CooperativeVectorPropertiesNVAllocator::value_type, VULKAN_HPP_NAMESPACE::CooperativeVectorPropertiesNV>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::CooperativeVectorPropertiesNV, CooperativeVectorPropertiesNVAllocator>>::type\n    PhysicalDevice::getCooperativeVectorPropertiesNV( CooperativeVectorPropertiesNVAllocator & cooperativeVectorPropertiesNVAllocator,\n                                                      Dispatch const &                         d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceCooperativeVectorPropertiesNV &&\n                       \"Function <vkGetPhysicalDeviceCooperativeVectorPropertiesNV> requires <VK_NV_cooperative_vector>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::CooperativeVectorPropertiesNV, CooperativeVectorPropertiesNVAllocator> properties(\n      cooperativeVectorPropertiesNVAllocator );\n    uint32_t                     propertyCount;\n    VULKAN_HPP_NAMESPACE::Result result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceCooperativeVectorPropertiesNV( m_physicalDevice, &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceCooperativeVectorPropertiesNV(\n          m_physicalDevice, &propertyCount, reinterpret_cast<VkCooperativeVectorPropertiesNV *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getCooperativeVectorPropertiesNV\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::convertCooperativeVectorMatrixNV(\n    const VULKAN_HPP_NAMESPACE::ConvertCooperativeVectorMatrixInfoNV * pInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkConvertCooperativeVectorMatrixNV( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkConvertCooperativeVectorMatrixInfoNV *>( pInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result\n    Device::convertCooperativeVectorMatrixNV( const VULKAN_HPP_NAMESPACE::ConvertCooperativeVectorMatrixInfoNV & info, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkConvertCooperativeVectorMatrixNV && \"Function <vkConvertCooperativeVectorMatrixNV> requires <VK_NV_cooperative_vector>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkConvertCooperativeVectorMatrixNV( m_device, reinterpret_cast<const VkConvertCooperativeVectorMatrixInfoNV *>( &info ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                               VULKAN_HPP_NAMESPACE_STRING \"::Device::convertCooperativeVectorMatrixNV\",\n                                               { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eIncomplete } );\n\n    return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::convertCooperativeVectorMatrixNV( uint32_t                                                           infoCount,\n                                                                          const VULKAN_HPP_NAMESPACE::ConvertCooperativeVectorMatrixInfoNV * pInfos,\n                                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdConvertCooperativeVectorMatrixNV(\n      static_cast<VkCommandBuffer>( m_commandBuffer ), infoCount, reinterpret_cast<const VkConvertCooperativeVectorMatrixInfoNV *>( pInfos ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::convertCooperativeVectorMatrixNV(\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ConvertCooperativeVectorMatrixInfoNV> const & infos,\n    Dispatch const &                                                                                           d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdConvertCooperativeVectorMatrixNV && \"Function <vkCmdConvertCooperativeVectorMatrixNV> requires <VK_NV_cooperative_vector>\" );\n#  endif\n\n    d.vkCmdConvertCooperativeVectorMatrixNV( m_commandBuffer, infos.size(), reinterpret_cast<const VkConvertCooperativeVectorMatrixInfoNV *>( infos.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_NV_low_latency2 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::setLatencySleepModeNV( VULKAN_HPP_NAMESPACE::SwapchainKHR                   swapchain,\n                                                                               const VULKAN_HPP_NAMESPACE::LatencySleepModeInfoNV * pSleepModeInfo,\n                                                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkSetLatencySleepModeNV(\n      static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( swapchain ), reinterpret_cast<const VkLatencySleepModeInfoNV *>( pSleepModeInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE typename ResultValueType<void>::type Device::setLatencySleepModeNV( VULKAN_HPP_NAMESPACE::SwapchainKHR                   swapchain,\n                                                                                        const VULKAN_HPP_NAMESPACE::LatencySleepModeInfoNV & sleepModeInfo,\n                                                                                        Dispatch const &                                     d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkSetLatencySleepModeNV && \"Function <vkSetLatencySleepModeNV> requires <VK_NV_low_latency2>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkSetLatencySleepModeNV( m_device, static_cast<VkSwapchainKHR>( swapchain ), reinterpret_cast<const VkLatencySleepModeInfoNV *>( &sleepModeInfo ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::setLatencySleepModeNV\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE Result Device::latencySleepNV( VULKAN_HPP_NAMESPACE::SwapchainKHR               swapchain,\n                                                   const VULKAN_HPP_NAMESPACE::LatencySleepInfoNV * pSleepInfo,\n                                                   Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkLatencySleepNV(\n      static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( swapchain ), reinterpret_cast<const VkLatencySleepInfoNV *>( pSleepInfo ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::latencySleepNV( VULKAN_HPP_NAMESPACE::SwapchainKHR               swapchain,\n                                                 const VULKAN_HPP_NAMESPACE::LatencySleepInfoNV & sleepInfo,\n                                                 Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkLatencySleepNV && \"Function <vkLatencySleepNV> requires <VK_NV_low_latency2>\" );\n#  endif\n\n    d.vkLatencySleepNV( m_device, static_cast<VkSwapchainKHR>( swapchain ), reinterpret_cast<const VkLatencySleepInfoNV *>( &sleepInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::setLatencyMarkerNV( VULKAN_HPP_NAMESPACE::SwapchainKHR                   swapchain,\n                                                     const VULKAN_HPP_NAMESPACE::SetLatencyMarkerInfoNV * pLatencyMarkerInfo,\n                                                     Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkSetLatencyMarkerNV(\n      static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( swapchain ), reinterpret_cast<const VkSetLatencyMarkerInfoNV *>( pLatencyMarkerInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::setLatencyMarkerNV( VULKAN_HPP_NAMESPACE::SwapchainKHR                   swapchain,\n                                                     const VULKAN_HPP_NAMESPACE::SetLatencyMarkerInfoNV & latencyMarkerInfo,\n                                                     Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkSetLatencyMarkerNV && \"Function <vkSetLatencyMarkerNV> requires <VK_NV_low_latency2>\" );\n#  endif\n\n    d.vkSetLatencyMarkerNV( m_device, static_cast<VkSwapchainKHR>( swapchain ), reinterpret_cast<const VkSetLatencyMarkerInfoNV *>( &latencyMarkerInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getLatencyTimingsNV( VULKAN_HPP_NAMESPACE::SwapchainKHR             swapchain,\n                                                      VULKAN_HPP_NAMESPACE::GetLatencyMarkerInfoNV * pLatencyMarkerInfo,\n                                                      Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetLatencyTimingsNV(\n      static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( swapchain ), reinterpret_cast<VkGetLatencyMarkerInfoNV *>( pLatencyMarkerInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <\n    typename LatencyTimingsFrameReportNVAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename LatencyTimingsFrameReportNVAllocator::value_type, VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV, LatencyTimingsFrameReportNVAllocator>\n                                         Device::getLatencyTimingsNV( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetLatencyTimingsNV && \"Function <vkGetLatencyTimingsNV> requires <VK_NV_low_latency2>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV, LatencyTimingsFrameReportNVAllocator> timings;\n    VULKAN_HPP_NAMESPACE::GetLatencyMarkerInfoNV                                                         latencyMarkerInfo;\n    d.vkGetLatencyTimingsNV( m_device, static_cast<VkSwapchainKHR>( swapchain ), reinterpret_cast<VkGetLatencyMarkerInfoNV *>( &latencyMarkerInfo ) );\n    timings.resize( latencyMarkerInfo.timingCount );\n    latencyMarkerInfo.pTimings = timings.data();\n    d.vkGetLatencyTimingsNV( m_device, static_cast<VkSwapchainKHR>( swapchain ), reinterpret_cast<VkGetLatencyMarkerInfoNV *>( &latencyMarkerInfo ) );\n\n    return timings;\n  }\n\n  template <\n    typename LatencyTimingsFrameReportNVAllocator,\n    typename Dispatch,\n    typename std::enable_if<std::is_same<typename LatencyTimingsFrameReportNVAllocator::value_type, VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV>::value,\n                            int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV, LatencyTimingsFrameReportNVAllocator>\n                                         Device::getLatencyTimingsNV( VULKAN_HPP_NAMESPACE::SwapchainKHR     swapchain,\n                                 LatencyTimingsFrameReportNVAllocator & latencyTimingsFrameReportNVAllocator,\n                                 Dispatch const &                       d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetLatencyTimingsNV && \"Function <vkGetLatencyTimingsNV> requires <VK_NV_low_latency2>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV, LatencyTimingsFrameReportNVAllocator> timings( latencyTimingsFrameReportNVAllocator );\n    VULKAN_HPP_NAMESPACE::GetLatencyMarkerInfoNV                                                         latencyMarkerInfo;\n    d.vkGetLatencyTimingsNV( m_device, static_cast<VkSwapchainKHR>( swapchain ), reinterpret_cast<VkGetLatencyMarkerInfoNV *>( &latencyMarkerInfo ) );\n    timings.resize( latencyMarkerInfo.timingCount );\n    latencyMarkerInfo.pTimings = timings.data();\n    d.vkGetLatencyTimingsNV( m_device, static_cast<VkSwapchainKHR>( swapchain ), reinterpret_cast<VkGetLatencyMarkerInfoNV *>( &latencyMarkerInfo ) );\n\n    return timings;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Queue::notifyOutOfBandNV( const VULKAN_HPP_NAMESPACE::OutOfBandQueueTypeInfoNV * pQueueTypeInfo,\n                                                   Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkQueueNotifyOutOfBandNV( static_cast<VkQueue>( m_queue ), reinterpret_cast<const VkOutOfBandQueueTypeInfoNV *>( pQueueTypeInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Queue::notifyOutOfBandNV( const VULKAN_HPP_NAMESPACE::OutOfBandQueueTypeInfoNV & queueTypeInfo,\n                                                   Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkQueueNotifyOutOfBandNV && \"Function <vkQueueNotifyOutOfBandNV> requires <VK_NV_low_latency2>\" );\n#  endif\n\n    d.vkQueueNotifyOutOfBandNV( m_queue, reinterpret_cast<const VkOutOfBandQueueTypeInfoNV *>( &queueTypeInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_cooperative_matrix ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getCooperativeMatrixPropertiesKHR(\n    uint32_t * pPropertyCount, VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesKHR * pProperties, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ), pPropertyCount, reinterpret_cast<VkCooperativeMatrixPropertiesKHR *>( pProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename CooperativeMatrixPropertiesKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename CooperativeMatrixPropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesKHR>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesKHR, CooperativeMatrixPropertiesKHRAllocator>>::type\n    PhysicalDevice::getCooperativeMatrixPropertiesKHR( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR &&\n                       \"Function <vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR> requires <VK_KHR_cooperative_matrix>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesKHR, CooperativeMatrixPropertiesKHRAllocator> properties;\n    uint32_t                                                                                                   propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                               result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR( m_physicalDevice, &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR(\n          m_physicalDevice, &propertyCount, reinterpret_cast<VkCooperativeMatrixPropertiesKHR *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getCooperativeMatrixPropertiesKHR\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n\n  template <typename CooperativeMatrixPropertiesKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<\n              std::is_same<typename CooperativeMatrixPropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesKHR>::value,\n              int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n    typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesKHR, CooperativeMatrixPropertiesKHRAllocator>>::type\n    PhysicalDevice::getCooperativeMatrixPropertiesKHR( CooperativeMatrixPropertiesKHRAllocator & cooperativeMatrixPropertiesKHRAllocator,\n                                                       Dispatch const &                          d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR &&\n                       \"Function <vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR> requires <VK_KHR_cooperative_matrix>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesKHR, CooperativeMatrixPropertiesKHRAllocator> properties(\n      cooperativeMatrixPropertiesKHRAllocator );\n    uint32_t                     propertyCount;\n    VULKAN_HPP_NAMESPACE::Result result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR( m_physicalDevice, &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR(\n          m_physicalDevice, &propertyCount, reinterpret_cast<VkCooperativeMatrixPropertiesKHR *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getCooperativeMatrixPropertiesKHR\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_attachment_feedback_loop_dynamic_state ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::setAttachmentFeedbackLoopEnableEXT( VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask,\n                                                                            Dispatch const &                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetAttachmentFeedbackLoopEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkImageAspectFlags>( aspectMask ) );\n  }\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n  //=== VK_QNX_external_memory_screen_buffer ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getScreenBufferPropertiesQNX( const struct _screen_buffer *                     buffer,\n                                                                                      VULKAN_HPP_NAMESPACE::ScreenBufferPropertiesQNX * pProperties,\n                                                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>(\n      d.vkGetScreenBufferPropertiesQNX( static_cast<VkDevice>( m_device ), buffer, reinterpret_cast<VkScreenBufferPropertiesQNX *>( pProperties ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::ScreenBufferPropertiesQNX>::type\n                       Device::getScreenBufferPropertiesQNX( const struct _screen_buffer & buffer, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetScreenBufferPropertiesQNX && \"Function <vkGetScreenBufferPropertiesQNX> requires <VK_QNX_external_memory_screen_buffer>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::ScreenBufferPropertiesQNX properties;\n    VULKAN_HPP_NAMESPACE::Result                    result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetScreenBufferPropertiesQNX( m_device, &buffer, reinterpret_cast<VkScreenBufferPropertiesQNX *>( &properties ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getScreenBufferPropertiesQNX\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>>::type\n                       Device::getScreenBufferPropertiesQNX( const struct _screen_buffer & buffer, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetScreenBufferPropertiesQNX && \"Function <vkGetScreenBufferPropertiesQNX> requires <VK_QNX_external_memory_screen_buffer>\" );\n#    endif\n\n    StructureChain<X, Y, Z...>                        structureChain;\n    VULKAN_HPP_NAMESPACE::ScreenBufferPropertiesQNX & properties = structureChain.template get<VULKAN_HPP_NAMESPACE::ScreenBufferPropertiesQNX>();\n    VULKAN_HPP_NAMESPACE::Result                      result     = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetScreenBufferPropertiesQNX( m_device, &buffer, reinterpret_cast<VkScreenBufferPropertiesQNX *>( &properties ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getScreenBufferPropertiesQNX\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( structureChain ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n  //=== VK_KHR_line_rasterization ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::setLineStippleKHR( uint32_t lineStippleFactor, uint16_t lineStipplePattern, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetLineStippleKHR( static_cast<VkCommandBuffer>( m_commandBuffer ), lineStippleFactor, lineStipplePattern );\n  }\n\n  //=== VK_KHR_calibrated_timestamps ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::getCalibrateableTimeDomainsKHR( uint32_t *                            pTimeDomainCount,\n                                                                                                VULKAN_HPP_NAMESPACE::TimeDomainKHR * pTimeDomains,\n                                                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceCalibrateableTimeDomainsKHR(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ), pTimeDomainCount, reinterpret_cast<VkTimeDomainKHR *>( pTimeDomains ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename TimeDomainKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename TimeDomainKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::TimeDomainKHR>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::TimeDomainKHR, TimeDomainKHRAllocator>>::type\n                       PhysicalDevice::getCalibrateableTimeDomainsKHR( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceCalibrateableTimeDomainsKHR &&\n                       \"Function <vkGetPhysicalDeviceCalibrateableTimeDomainsKHR> requires <VK_EXT_calibrated_timestamps> or <VK_KHR_calibrated_timestamps>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::TimeDomainKHR, TimeDomainKHRAllocator> timeDomains;\n    uint32_t                                                                 timeDomainCount;\n    VULKAN_HPP_NAMESPACE::Result                                             result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceCalibrateableTimeDomainsKHR( m_physicalDevice, &timeDomainCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && timeDomainCount )\n      {\n        timeDomains.resize( timeDomainCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceCalibrateableTimeDomainsKHR( m_physicalDevice, &timeDomainCount, reinterpret_cast<VkTimeDomainKHR *>( timeDomains.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getCalibrateableTimeDomainsKHR\" );\n    VULKAN_HPP_ASSERT( timeDomainCount <= timeDomains.size() );\n    if ( timeDomainCount < timeDomains.size() )\n    {\n      timeDomains.resize( timeDomainCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( timeDomains ) );\n  }\n\n  template <typename TimeDomainKHRAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename TimeDomainKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::TimeDomainKHR>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::TimeDomainKHR, TimeDomainKHRAllocator>>::type\n                       PhysicalDevice::getCalibrateableTimeDomainsKHR( TimeDomainKHRAllocator & timeDomainKHRAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceCalibrateableTimeDomainsKHR &&\n                       \"Function <vkGetPhysicalDeviceCalibrateableTimeDomainsKHR> requires <VK_EXT_calibrated_timestamps> or <VK_KHR_calibrated_timestamps>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::TimeDomainKHR, TimeDomainKHRAllocator> timeDomains( timeDomainKHRAllocator );\n    uint32_t                                                                 timeDomainCount;\n    VULKAN_HPP_NAMESPACE::Result                                             result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceCalibrateableTimeDomainsKHR( m_physicalDevice, &timeDomainCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && timeDomainCount )\n      {\n        timeDomains.resize( timeDomainCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          d.vkGetPhysicalDeviceCalibrateableTimeDomainsKHR( m_physicalDevice, &timeDomainCount, reinterpret_cast<VkTimeDomainKHR *>( timeDomains.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getCalibrateableTimeDomainsKHR\" );\n    VULKAN_HPP_ASSERT( timeDomainCount <= timeDomains.size() );\n    if ( timeDomainCount < timeDomains.size() )\n    {\n      timeDomains.resize( timeDomainCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( timeDomains ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getCalibratedTimestampsKHR( uint32_t                                                 timestampCount,\n                                                                                    const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR * pTimestampInfos,\n                                                                                    uint64_t *                                               pTimestamps,\n                                                                                    uint64_t *                                               pMaxDeviation,\n                                                                                    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetCalibratedTimestampsKHR( static_cast<VkDevice>( m_device ),\n                                                                timestampCount,\n                                                                reinterpret_cast<const VkCalibratedTimestampInfoKHR *>( pTimestampInfos ),\n                                                                pTimestamps,\n                                                                pMaxDeviation ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Uint64_tAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename Uint64_tAllocator::value_type, uint64_t>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::pair<std::vector<uint64_t, Uint64_tAllocator>, uint64_t>>::type\n    Device::getCalibratedTimestampsKHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR> const & timestampInfos,\n                                        Dispatch const &                                                                                 d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetCalibratedTimestampsKHR &&\n                       \"Function <vkGetCalibratedTimestampsKHR> requires <VK_EXT_calibrated_timestamps> or <VK_KHR_calibrated_timestamps>\" );\n#  endif\n\n    std::pair<std::vector<uint64_t, Uint64_tAllocator>, uint64_t> data_(\n      std::piecewise_construct, std::forward_as_tuple( timestampInfos.size() ), std::forward_as_tuple( 0 ) );\n    std::vector<uint64_t, Uint64_tAllocator> & timestamps   = data_.first;\n    uint64_t &                                 maxDeviation = data_.second;\n    VULKAN_HPP_NAMESPACE::Result               result       = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetCalibratedTimestampsKHR(\n      m_device, timestampInfos.size(), reinterpret_cast<const VkCalibratedTimestampInfoKHR *>( timestampInfos.data() ), timestamps.data(), &maxDeviation ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getCalibratedTimestampsKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data_ ) );\n  }\n\n  template <typename Uint64_tAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename Uint64_tAllocator::value_type, uint64_t>::value, int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::pair<std::vector<uint64_t, Uint64_tAllocator>, uint64_t>>::type\n    Device::getCalibratedTimestampsKHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR> const & timestampInfos,\n                                        Uint64_tAllocator &                                                                              uint64_tAllocator,\n                                        Dispatch const &                                                                                 d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetCalibratedTimestampsKHR &&\n                       \"Function <vkGetCalibratedTimestampsKHR> requires <VK_EXT_calibrated_timestamps> or <VK_KHR_calibrated_timestamps>\" );\n#  endif\n\n    std::pair<std::vector<uint64_t, Uint64_tAllocator>, uint64_t> data_(\n      std::piecewise_construct, std::forward_as_tuple( timestampInfos.size(), uint64_tAllocator ), std::forward_as_tuple( 0 ) );\n    std::vector<uint64_t, Uint64_tAllocator> & timestamps   = data_.first;\n    uint64_t &                                 maxDeviation = data_.second;\n    VULKAN_HPP_NAMESPACE::Result               result       = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetCalibratedTimestampsKHR(\n      m_device, timestampInfos.size(), reinterpret_cast<const VkCalibratedTimestampInfoKHR *>( timestampInfos.data() ), timestamps.data(), &maxDeviation ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getCalibratedTimestampsKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data_ ) );\n  }\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::pair<uint64_t, uint64_t>>::type\n                       Device::getCalibratedTimestampKHR( const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR & timestampInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetCalibratedTimestampsKHR &&\n                       \"Function <vkGetCalibratedTimestampsKHR> requires <VK_EXT_calibrated_timestamps> or <VK_KHR_calibrated_timestamps>\" );\n#  endif\n\n    std::pair<uint64_t, uint64_t> data_;\n    uint64_t &                    timestamp    = data_.first;\n    uint64_t &                    maxDeviation = data_.second;\n    VULKAN_HPP_NAMESPACE::Result  result       = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetCalibratedTimestampsKHR( m_device, 1, reinterpret_cast<const VkCalibratedTimestampInfoKHR *>( &timestampInfo ), &timestamp, &maxDeviation ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getCalibratedTimestampKHR\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( data_ ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_KHR_maintenance6 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindDescriptorSets2KHR( const VULKAN_HPP_NAMESPACE::BindDescriptorSetsInfo * pBindDescriptorSetsInfo,\n                                                                Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBindDescriptorSets2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                   reinterpret_cast<const VkBindDescriptorSetsInfo *>( pBindDescriptorSetsInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindDescriptorSets2KHR( const VULKAN_HPP_NAMESPACE::BindDescriptorSetsInfo & bindDescriptorSetsInfo,\n                                                                Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBindDescriptorSets2KHR && \"Function <vkCmdBindDescriptorSets2KHR> requires <VK_KHR_maintenance6> or <VK_VERSION_1_4>\" );\n#  endif\n\n    d.vkCmdBindDescriptorSets2KHR( m_commandBuffer, reinterpret_cast<const VkBindDescriptorSetsInfo *>( &bindDescriptorSetsInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::pushConstants2KHR( const VULKAN_HPP_NAMESPACE::PushConstantsInfo * pPushConstantsInfo,\n                                                           Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdPushConstants2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkPushConstantsInfo *>( pPushConstantsInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::pushConstants2KHR( const VULKAN_HPP_NAMESPACE::PushConstantsInfo & pushConstantsInfo,\n                                                           Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdPushConstants2KHR && \"Function <vkCmdPushConstants2KHR> requires <VK_KHR_maintenance6> or <VK_VERSION_1_4>\" );\n#  endif\n\n    d.vkCmdPushConstants2KHR( m_commandBuffer, reinterpret_cast<const VkPushConstantsInfo *>( &pushConstantsInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::pushDescriptorSet2KHR( const VULKAN_HPP_NAMESPACE::PushDescriptorSetInfo * pPushDescriptorSetInfo,\n                                                               Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdPushDescriptorSet2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                  reinterpret_cast<const VkPushDescriptorSetInfo *>( pPushDescriptorSetInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::pushDescriptorSet2KHR( const VULKAN_HPP_NAMESPACE::PushDescriptorSetInfo & pushDescriptorSetInfo,\n                                                               Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdPushDescriptorSet2KHR && \"Function <vkCmdPushDescriptorSet2KHR> requires <VK_KHR_maintenance6> or <VK_VERSION_1_4>\" );\n#  endif\n\n    d.vkCmdPushDescriptorSet2KHR( m_commandBuffer, reinterpret_cast<const VkPushDescriptorSetInfo *>( &pushDescriptorSetInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::pushDescriptorSetWithTemplate2KHR( const VULKAN_HPP_NAMESPACE::PushDescriptorSetWithTemplateInfo * pPushDescriptorSetWithTemplateInfo,\n                                                      Dispatch const &                                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdPushDescriptorSetWithTemplate2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                              reinterpret_cast<const VkPushDescriptorSetWithTemplateInfo *>( pPushDescriptorSetWithTemplateInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::pushDescriptorSetWithTemplate2KHR( const VULKAN_HPP_NAMESPACE::PushDescriptorSetWithTemplateInfo & pushDescriptorSetWithTemplateInfo,\n                                                      Dispatch const &                                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdPushDescriptorSetWithTemplate2KHR &&\n                       \"Function <vkCmdPushDescriptorSetWithTemplate2KHR> requires <VK_KHR_maintenance6> or <VK_VERSION_1_4>\" );\n#  endif\n\n    d.vkCmdPushDescriptorSetWithTemplate2KHR( m_commandBuffer,\n                                              reinterpret_cast<const VkPushDescriptorSetWithTemplateInfo *>( &pushDescriptorSetWithTemplateInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::setDescriptorBufferOffsets2EXT( const VULKAN_HPP_NAMESPACE::SetDescriptorBufferOffsetsInfoEXT * pSetDescriptorBufferOffsetsInfo,\n                                                   Dispatch const &                                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdSetDescriptorBufferOffsets2EXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                           reinterpret_cast<const VkSetDescriptorBufferOffsetsInfoEXT *>( pSetDescriptorBufferOffsetsInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::setDescriptorBufferOffsets2EXT( const VULKAN_HPP_NAMESPACE::SetDescriptorBufferOffsetsInfoEXT & setDescriptorBufferOffsetsInfo,\n                                                   Dispatch const &                                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdSetDescriptorBufferOffsets2EXT && \"Function <vkCmdSetDescriptorBufferOffsets2EXT> requires <VK_KHR_maintenance6>\" );\n#  endif\n\n    d.vkCmdSetDescriptorBufferOffsets2EXT( m_commandBuffer, reinterpret_cast<const VkSetDescriptorBufferOffsetsInfoEXT *>( &setDescriptorBufferOffsetsInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindDescriptorBufferEmbeddedSamplers2EXT(\n    const VULKAN_HPP_NAMESPACE::BindDescriptorBufferEmbeddedSamplersInfoEXT * pBindDescriptorBufferEmbeddedSamplersInfo,\n    Dispatch const &                                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBindDescriptorBufferEmbeddedSamplers2EXT(\n      static_cast<VkCommandBuffer>( m_commandBuffer ),\n      reinterpret_cast<const VkBindDescriptorBufferEmbeddedSamplersInfoEXT *>( pBindDescriptorBufferEmbeddedSamplersInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::bindDescriptorBufferEmbeddedSamplers2EXT(\n    const VULKAN_HPP_NAMESPACE::BindDescriptorBufferEmbeddedSamplersInfoEXT & bindDescriptorBufferEmbeddedSamplersInfo,\n    Dispatch const &                                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBindDescriptorBufferEmbeddedSamplers2EXT &&\n                       \"Function <vkCmdBindDescriptorBufferEmbeddedSamplers2EXT> requires <VK_KHR_maintenance6>\" );\n#  endif\n\n    d.vkCmdBindDescriptorBufferEmbeddedSamplers2EXT(\n      m_commandBuffer, reinterpret_cast<const VkBindDescriptorBufferEmbeddedSamplersInfoEXT *>( &bindDescriptorBufferEmbeddedSamplersInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_NV_cluster_acceleration_structure ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getClusterAccelerationStructureBuildSizesNV( const VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureInputInfoNV * pInfo,\n                                                                              VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR *        pSizeInfo,\n                                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetClusterAccelerationStructureBuildSizesNV( static_cast<VkDevice>( m_device ),\n                                                     reinterpret_cast<const VkClusterAccelerationStructureInputInfoNV *>( pInfo ),\n                                                     reinterpret_cast<VkAccelerationStructureBuildSizesInfoKHR *>( pSizeInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR\n    Device::getClusterAccelerationStructureBuildSizesNV( const VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureInputInfoNV & info,\n                                                         Dispatch const &                                                      d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetClusterAccelerationStructureBuildSizesNV &&\n                       \"Function <vkGetClusterAccelerationStructureBuildSizesNV> requires <VK_NV_cluster_acceleration_structure>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR sizeInfo;\n    d.vkGetClusterAccelerationStructureBuildSizesNV( m_device,\n                                                     reinterpret_cast<const VkClusterAccelerationStructureInputInfoNV *>( &info ),\n                                                     reinterpret_cast<VkAccelerationStructureBuildSizesInfoKHR *>( &sizeInfo ) );\n\n    return sizeInfo;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::buildClusterAccelerationStructureIndirectNV( const VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureCommandsInfoNV * pCommandInfos,\n                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBuildClusterAccelerationStructureIndirectNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                        reinterpret_cast<const VkClusterAccelerationStructureCommandsInfoNV *>( pCommandInfos ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::buildClusterAccelerationStructureIndirectNV( const VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureCommandsInfoNV & commandInfos,\n                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBuildClusterAccelerationStructureIndirectNV &&\n                       \"Function <vkCmdBuildClusterAccelerationStructureIndirectNV> requires <VK_NV_cluster_acceleration_structure>\" );\n#  endif\n\n    d.vkCmdBuildClusterAccelerationStructureIndirectNV( m_commandBuffer,\n                                                        reinterpret_cast<const VkClusterAccelerationStructureCommandsInfoNV *>( &commandInfos ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_NV_partitioned_acceleration_structure ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    Device::getPartitionedAccelerationStructuresBuildSizesNV( const VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureInstancesInputNV * pInfo,\n                                                              VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR *                 pSizeInfo,\n                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetPartitionedAccelerationStructuresBuildSizesNV( static_cast<VkDevice>( m_device ),\n                                                          reinterpret_cast<const VkPartitionedAccelerationStructureInstancesInputNV *>( pInfo ),\n                                                          reinterpret_cast<VkAccelerationStructureBuildSizesInfoKHR *>( pSizeInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR\n    Device::getPartitionedAccelerationStructuresBuildSizesNV( const VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureInstancesInputNV & info,\n                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPartitionedAccelerationStructuresBuildSizesNV &&\n                       \"Function <vkGetPartitionedAccelerationStructuresBuildSizesNV> requires <VK_NV_partitioned_acceleration_structure>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR sizeInfo;\n    d.vkGetPartitionedAccelerationStructuresBuildSizesNV( m_device,\n                                                          reinterpret_cast<const VkPartitionedAccelerationStructureInstancesInputNV *>( &info ),\n                                                          reinterpret_cast<VkAccelerationStructureBuildSizesInfoKHR *>( &sizeInfo ) );\n\n    return sizeInfo;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::buildPartitionedAccelerationStructuresNV( const VULKAN_HPP_NAMESPACE::BuildPartitionedAccelerationStructureInfoNV * pBuildInfo,\n                                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdBuildPartitionedAccelerationStructuresNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                     reinterpret_cast<const VkBuildPartitionedAccelerationStructureInfoNV *>( pBuildInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void\n    CommandBuffer::buildPartitionedAccelerationStructuresNV( const VULKAN_HPP_NAMESPACE::BuildPartitionedAccelerationStructureInfoNV & buildInfo,\n                                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdBuildPartitionedAccelerationStructuresNV &&\n                       \"Function <vkCmdBuildPartitionedAccelerationStructuresNV> requires <VK_NV_partitioned_acceleration_structure>\" );\n#  endif\n\n    d.vkCmdBuildPartitionedAccelerationStructuresNV( m_commandBuffer, reinterpret_cast<const VkBuildPartitionedAccelerationStructureInfoNV *>( &buildInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_EXT_device_generated_commands ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::getGeneratedCommandsMemoryRequirementsEXT( const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoEXT * pInfo,\n                                                                            VULKAN_HPP_NAMESPACE::MemoryRequirements2 * pMemoryRequirements,\n                                                                            Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkGetGeneratedCommandsMemoryRequirementsEXT( static_cast<VkDevice>( m_device ),\n                                                   reinterpret_cast<const VkGeneratedCommandsMemoryRequirementsInfoEXT *>( pInfo ),\n                                                   reinterpret_cast<VkMemoryRequirements2 *>( pMemoryRequirements ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2\n    Device::getGeneratedCommandsMemoryRequirementsEXT( const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoEXT & info,\n                                                       Dispatch const &                                                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetGeneratedCommandsMemoryRequirementsEXT &&\n                       \"Function <vkGetGeneratedCommandsMemoryRequirementsEXT> requires <VK_EXT_device_generated_commands>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;\n    d.vkGetGeneratedCommandsMemoryRequirementsEXT( m_device,\n                                                   reinterpret_cast<const VkGeneratedCommandsMemoryRequirementsInfoEXT *>( &info ),\n                                                   reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n    return memoryRequirements;\n  }\n\n  template <typename X, typename Y, typename... Z, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n    Device::getGeneratedCommandsMemoryRequirementsEXT( const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoEXT & info,\n                                                       Dispatch const &                                                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetGeneratedCommandsMemoryRequirementsEXT &&\n                       \"Function <vkGetGeneratedCommandsMemoryRequirementsEXT> requires <VK_EXT_device_generated_commands>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n    VULKAN_HPP_NAMESPACE::MemoryRequirements2 &      memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();\n    d.vkGetGeneratedCommandsMemoryRequirementsEXT( m_device,\n                                                   reinterpret_cast<const VkGeneratedCommandsMemoryRequirementsInfoEXT *>( &info ),\n                                                   reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n    return structureChain;\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::preprocessGeneratedCommandsEXT( const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoEXT * pGeneratedCommandsInfo,\n                                                                        VULKAN_HPP_NAMESPACE::CommandBuffer                    stateCommandBuffer,\n                                                                        Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdPreprocessGeneratedCommandsEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                           reinterpret_cast<const VkGeneratedCommandsInfoEXT *>( pGeneratedCommandsInfo ),\n                                           static_cast<VkCommandBuffer>( stateCommandBuffer ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::preprocessGeneratedCommandsEXT( const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoEXT & generatedCommandsInfo,\n                                                                        VULKAN_HPP_NAMESPACE::CommandBuffer                    stateCommandBuffer,\n                                                                        Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdPreprocessGeneratedCommandsEXT && \"Function <vkCmdPreprocessGeneratedCommandsEXT> requires <VK_EXT_device_generated_commands>\" );\n#  endif\n\n    d.vkCmdPreprocessGeneratedCommandsEXT(\n      m_commandBuffer, reinterpret_cast<const VkGeneratedCommandsInfoEXT *>( &generatedCommandsInfo ), static_cast<VkCommandBuffer>( stateCommandBuffer ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::executeGeneratedCommandsEXT( VULKAN_HPP_NAMESPACE::Bool32                           isPreprocessed,\n                                                                     const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoEXT * pGeneratedCommandsInfo,\n                                                                     Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkCmdExecuteGeneratedCommandsEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                        static_cast<VkBool32>( isPreprocessed ),\n                                        reinterpret_cast<const VkGeneratedCommandsInfoEXT *>( pGeneratedCommandsInfo ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void CommandBuffer::executeGeneratedCommandsEXT( VULKAN_HPP_NAMESPACE::Bool32                           isPreprocessed,\n                                                                     const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoEXT & generatedCommandsInfo,\n                                                                     Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCmdExecuteGeneratedCommandsEXT && \"Function <vkCmdExecuteGeneratedCommandsEXT> requires <VK_EXT_device_generated_commands>\" );\n#  endif\n\n    d.vkCmdExecuteGeneratedCommandsEXT(\n      m_commandBuffer, static_cast<VkBool32>( isPreprocessed ), reinterpret_cast<const VkGeneratedCommandsInfoEXT *>( &generatedCommandsInfo ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::createIndirectCommandsLayoutEXT( const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoEXT * pCreateInfo,\n                                             const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                 pAllocator,\n                                             VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT *                 pIndirectCommandsLayout,\n                                             Dispatch const &                                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateIndirectCommandsLayoutEXT( static_cast<VkDevice>( m_device ),\n                                                                     reinterpret_cast<const VkIndirectCommandsLayoutCreateInfoEXT *>( pCreateInfo ),\n                                                                     reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                                     reinterpret_cast<VkIndirectCommandsLayoutEXT *>( pIndirectCommandsLayout ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT>::type\n                       Device::createIndirectCommandsLayoutEXT( const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoEXT & createInfo,\n                                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>         allocator,\n                                             Dispatch const &                                                  d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateIndirectCommandsLayoutEXT && \"Function <vkCreateIndirectCommandsLayoutEXT> requires <VK_EXT_device_generated_commands>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT indirectCommandsLayout;\n    VULKAN_HPP_NAMESPACE::Result                    result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateIndirectCommandsLayoutEXT(\n      m_device,\n      reinterpret_cast<const VkIndirectCommandsLayoutCreateInfoEXT *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkIndirectCommandsLayoutEXT *>( &indirectCommandsLayout ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createIndirectCommandsLayoutEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( indirectCommandsLayout ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT, Dispatch>>::type\n                       Device::createIndirectCommandsLayoutEXTUnique( const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoEXT & createInfo,\n                                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>         allocator,\n                                                   Dispatch const &                                                  d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateIndirectCommandsLayoutEXT && \"Function <vkCreateIndirectCommandsLayoutEXT> requires <VK_EXT_device_generated_commands>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT indirectCommandsLayout;\n    VULKAN_HPP_NAMESPACE::Result                    result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateIndirectCommandsLayoutEXT(\n      m_device,\n      reinterpret_cast<const VkIndirectCommandsLayoutCreateInfoEXT *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkIndirectCommandsLayoutEXT *>( &indirectCommandsLayout ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createIndirectCommandsLayoutEXTUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result,\n                                                                UniqueHandle<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT, Dispatch>(\n                                                                  indirectCommandsLayout, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyIndirectCommandsLayoutEXT( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT   indirectCommandsLayout,\n                                                                   const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                   Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyIndirectCommandsLayoutEXT( static_cast<VkDevice>( m_device ),\n                                          static_cast<VkIndirectCommandsLayoutEXT>( indirectCommandsLayout ),\n                                          reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyIndirectCommandsLayoutEXT( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT           indirectCommandsLayout,\n                                                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                                   Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyIndirectCommandsLayoutEXT && \"Function <vkDestroyIndirectCommandsLayoutEXT> requires <VK_EXT_device_generated_commands>\" );\n#  endif\n\n    d.vkDestroyIndirectCommandsLayoutEXT(\n      m_device,\n      static_cast<VkIndirectCommandsLayoutEXT>( indirectCommandsLayout ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT   indirectCommandsLayout,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyIndirectCommandsLayoutEXT( static_cast<VkDevice>( m_device ),\n                                          static_cast<VkIndirectCommandsLayoutEXT>( indirectCommandsLayout ),\n                                          reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT           indirectCommandsLayout,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyIndirectCommandsLayoutEXT && \"Function <vkDestroyIndirectCommandsLayoutEXT> requires <VK_EXT_device_generated_commands>\" );\n#  endif\n\n    d.vkDestroyIndirectCommandsLayoutEXT(\n      m_device,\n      static_cast<VkIndirectCommandsLayoutEXT>( indirectCommandsLayout ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::createIndirectExecutionSetEXT( const VULKAN_HPP_NAMESPACE::IndirectExecutionSetCreateInfoEXT * pCreateInfo,\n                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks *               pAllocator,\n                                           VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT *                 pIndirectExecutionSet,\n                                           Dispatch const &                                                d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkCreateIndirectExecutionSetEXT( static_cast<VkDevice>( m_device ),\n                                                                   reinterpret_cast<const VkIndirectExecutionSetCreateInfoEXT *>( pCreateInfo ),\n                                                                   reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),\n                                                                   reinterpret_cast<VkIndirectExecutionSetEXT *>( pIndirectExecutionSet ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT>::type\n                       Device::createIndirectExecutionSetEXT( const VULKAN_HPP_NAMESPACE::IndirectExecutionSetCreateInfoEXT & createInfo,\n                                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>       allocator,\n                                           Dispatch const &                                                d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateIndirectExecutionSetEXT && \"Function <vkCreateIndirectExecutionSetEXT> requires <VK_EXT_device_generated_commands>\" );\n#  endif\n\n    VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT indirectExecutionSet;\n    VULKAN_HPP_NAMESPACE::Result                  result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateIndirectExecutionSetEXT(\n      m_device,\n      reinterpret_cast<const VkIndirectExecutionSetCreateInfoEXT *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkIndirectExecutionSetEXT *>( &indirectExecutionSet ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createIndirectExecutionSetEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( indirectExecutionSet ) );\n  }\n\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT, Dispatch>>::type\n                       Device::createIndirectExecutionSetEXTUnique( const VULKAN_HPP_NAMESPACE::IndirectExecutionSetCreateInfoEXT & createInfo,\n                                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>       allocator,\n                                                 Dispatch const &                                                d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkCreateIndirectExecutionSetEXT && \"Function <vkCreateIndirectExecutionSetEXT> requires <VK_EXT_device_generated_commands>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT indirectExecutionSet;\n    VULKAN_HPP_NAMESPACE::Result                  result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkCreateIndirectExecutionSetEXT(\n      m_device,\n      reinterpret_cast<const VkIndirectExecutionSetCreateInfoEXT *>( &createInfo ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n      reinterpret_cast<VkIndirectExecutionSetEXT *>( &indirectExecutionSet ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::createIndirectExecutionSetEXTUnique\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result,\n                                                                UniqueHandle<VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT, Dispatch>(\n                                                                  indirectExecutionSet, detail::ObjectDestroy<Device, Dispatch>( *this, allocator, d ) ) );\n  }\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyIndirectExecutionSetEXT( VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT     indirectExecutionSet,\n                                                                 const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                                 Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyIndirectExecutionSetEXT( static_cast<VkDevice>( m_device ),\n                                        static_cast<VkIndirectExecutionSetEXT>( indirectExecutionSet ),\n                                        reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroyIndirectExecutionSetEXT( VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT             indirectExecutionSet,\n                                                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                                 Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyIndirectExecutionSetEXT && \"Function <vkDestroyIndirectExecutionSetEXT> requires <VK_EXT_device_generated_commands>\" );\n#  endif\n\n    d.vkDestroyIndirectExecutionSetEXT(\n      m_device,\n      static_cast<VkIndirectExecutionSetEXT>( indirectExecutionSet ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT     indirectExecutionSet,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkDestroyIndirectExecutionSetEXT( static_cast<VkDevice>( m_device ),\n                                        static_cast<VkIndirectExecutionSetEXT>( indirectExecutionSet ),\n                                        reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::destroy( VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT             indirectExecutionSet,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                          Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkDestroyIndirectExecutionSetEXT && \"Function <vkDestroyIndirectExecutionSetEXT> requires <VK_EXT_device_generated_commands>\" );\n#  endif\n\n    d.vkDestroyIndirectExecutionSetEXT(\n      m_device,\n      static_cast<VkIndirectExecutionSetEXT>( indirectExecutionSet ),\n      reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::updateIndirectExecutionSetPipelineEXT( VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT indirectExecutionSet,\n                                                                        uint32_t                                      executionSetWriteCount,\n                                                                        const VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetPipelineEXT * pExecutionSetWrites,\n                                                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkUpdateIndirectExecutionSetPipelineEXT( static_cast<VkDevice>( m_device ),\n                                               static_cast<VkIndirectExecutionSetEXT>( indirectExecutionSet ),\n                                               executionSetWriteCount,\n                                               reinterpret_cast<const VkWriteIndirectExecutionSetPipelineEXT *>( pExecutionSetWrites ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::updateIndirectExecutionSetPipelineEXT(\n    VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT                                                              indirectExecutionSet,\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetPipelineEXT> const & executionSetWrites,\n    Dispatch const &                                                                                           d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkUpdateIndirectExecutionSetPipelineEXT &&\n                       \"Function <vkUpdateIndirectExecutionSetPipelineEXT> requires <VK_EXT_device_generated_commands>\" );\n#  endif\n\n    d.vkUpdateIndirectExecutionSetPipelineEXT( m_device,\n                                               static_cast<VkIndirectExecutionSetEXT>( indirectExecutionSet ),\n                                               executionSetWrites.size(),\n                                               reinterpret_cast<const VkWriteIndirectExecutionSetPipelineEXT *>( executionSetWrites.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::updateIndirectExecutionSetShaderEXT( VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT                    indirectExecutionSet,\n                                                                      uint32_t                                                         executionSetWriteCount,\n                                                                      const VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetShaderEXT * pExecutionSetWrites,\n                                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    d.vkUpdateIndirectExecutionSetShaderEXT( static_cast<VkDevice>( m_device ),\n                                             static_cast<VkIndirectExecutionSetEXT>( indirectExecutionSet ),\n                                             executionSetWriteCount,\n                                             reinterpret_cast<const VkWriteIndirectExecutionSetShaderEXT *>( pExecutionSetWrites ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_INLINE void Device::updateIndirectExecutionSetShaderEXT(\n    VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT                                                            indirectExecutionSet,\n    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetShaderEXT> const & executionSetWrites,\n    Dispatch const &                                                                                         d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkUpdateIndirectExecutionSetShaderEXT &&\n                       \"Function <vkUpdateIndirectExecutionSetShaderEXT> requires <VK_EXT_device_generated_commands>\" );\n#  endif\n\n    d.vkUpdateIndirectExecutionSetShaderEXT( m_device,\n                                             static_cast<VkIndirectExecutionSetEXT>( indirectExecutionSet ),\n                                             executionSetWrites.size(),\n                                             reinterpret_cast<const VkWriteIndirectExecutionSetShaderEXT *>( executionSetWrites.data() ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_NV_cooperative_matrix2 ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    PhysicalDevice::getCooperativeMatrixFlexibleDimensionsPropertiesNV( uint32_t *                                                              pPropertyCount,\n                                                                        VULKAN_HPP_NAMESPACE::CooperativeMatrixFlexibleDimensionsPropertiesNV * pProperties,\n                                                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV(\n      static_cast<VkPhysicalDevice>( m_physicalDevice ),\n      pPropertyCount,\n      reinterpret_cast<VkCooperativeMatrixFlexibleDimensionsPropertiesNV *>( pProperties ) ) );\n  }\n\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename CooperativeMatrixFlexibleDimensionsPropertiesNVAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename CooperativeMatrixFlexibleDimensionsPropertiesNVAllocator::value_type,\n                                                 VULKAN_HPP_NAMESPACE::CooperativeMatrixFlexibleDimensionsPropertiesNV>::value,\n                                    int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<\n    std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixFlexibleDimensionsPropertiesNV, CooperativeMatrixFlexibleDimensionsPropertiesNVAllocator>>::type\n    PhysicalDevice::getCooperativeMatrixFlexibleDimensionsPropertiesNV( Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV &&\n                       \"Function <vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV> requires <VK_NV_cooperative_matrix2>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixFlexibleDimensionsPropertiesNV, CooperativeMatrixFlexibleDimensionsPropertiesNVAllocator> properties;\n    uint32_t                                                                                                                                     propertyCount;\n    VULKAN_HPP_NAMESPACE::Result                                                                                                                 result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV( m_physicalDevice, &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV(\n          m_physicalDevice, &propertyCount, reinterpret_cast<VkCooperativeMatrixFlexibleDimensionsPropertiesNV *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getCooperativeMatrixFlexibleDimensionsPropertiesNV\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n\n  template <typename CooperativeMatrixFlexibleDimensionsPropertiesNVAllocator,\n            typename Dispatch,\n            typename std::enable_if<std::is_same<typename CooperativeMatrixFlexibleDimensionsPropertiesNVAllocator::value_type,\n                                                 VULKAN_HPP_NAMESPACE::CooperativeMatrixFlexibleDimensionsPropertiesNV>::value,\n                                    int>::type>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<\n    std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixFlexibleDimensionsPropertiesNV, CooperativeMatrixFlexibleDimensionsPropertiesNVAllocator>>::type\n    PhysicalDevice::getCooperativeMatrixFlexibleDimensionsPropertiesNV(\n      CooperativeMatrixFlexibleDimensionsPropertiesNVAllocator & cooperativeMatrixFlexibleDimensionsPropertiesNVAllocator, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#  if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV &&\n                       \"Function <vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV> requires <VK_NV_cooperative_matrix2>\" );\n#  endif\n\n    std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixFlexibleDimensionsPropertiesNV, CooperativeMatrixFlexibleDimensionsPropertiesNVAllocator> properties(\n      cooperativeMatrixFlexibleDimensionsPropertiesNVAllocator );\n    uint32_t                     propertyCount;\n    VULKAN_HPP_NAMESPACE::Result result;\n    do\n    {\n      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        d.vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV( m_physicalDevice, &propertyCount, nullptr ) );\n      if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n      {\n        properties.resize( propertyCount );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( d.vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV(\n          m_physicalDevice, &propertyCount, reinterpret_cast<VkCooperativeMatrixFlexibleDimensionsPropertiesNV *>( properties.data() ) ) );\n      }\n    } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getCooperativeMatrixFlexibleDimensionsPropertiesNV\" );\n    VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n    if ( propertyCount < properties.size() )\n    {\n      properties.resize( propertyCount );\n    }\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( properties ) );\n  }\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  //=== VK_EXT_external_memory_metal ===\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getMemoryMetalHandleEXT( const VULKAN_HPP_NAMESPACE::MemoryGetMetalHandleInfoEXT * pGetMetalHandleInfo,\n                                                                                 void **                                                   pHandle,\n                                                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetMemoryMetalHandleEXT(\n      static_cast<VkDevice>( m_device ), reinterpret_cast<const VkMemoryGetMetalHandleInfoEXT *>( pGetMetalHandleInfo ), pHandle ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<void *>::type\n                       Device::getMemoryMetalHandleEXT( const VULKAN_HPP_NAMESPACE::MemoryGetMetalHandleInfoEXT & getMetalHandleInfo, Dispatch const & d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetMemoryMetalHandleEXT && \"Function <vkGetMemoryMetalHandleEXT> requires <VK_EXT_external_memory_metal>\" );\n#    endif\n\n    void *                       handle;\n    VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetMemoryMetalHandleEXT( m_device, reinterpret_cast<const VkMemoryGetMetalHandleInfoEXT *>( &getMetalHandleInfo ), &handle ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getMemoryMetalHandleEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( handle ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result\n    Device::getMemoryMetalHandlePropertiesEXT( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType,\n                                               const void *                                           pHandle,\n                                               VULKAN_HPP_NAMESPACE::MemoryMetalHandlePropertiesEXT * pMemoryMetalHandleProperties,\n                                               Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n    return static_cast<Result>( d.vkGetMemoryMetalHandlePropertiesEXT( static_cast<VkDevice>( m_device ),\n                                                                       static_cast<VkExternalMemoryHandleTypeFlagBits>( handleType ),\n                                                                       pHandle,\n                                                                       reinterpret_cast<VkMemoryMetalHandlePropertiesEXT *>( pMemoryMetalHandleProperties ) ) );\n  }\n\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename HandleType, typename Dispatch>\n  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::MemoryMetalHandlePropertiesEXT>::type\n                       Device::getMemoryMetalHandlePropertiesEXT( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType,\n                                               HandleType const &                                     handle,\n                                               Dispatch const &                                       d ) const\n  {\n    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n#    if ( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 )\n    VULKAN_HPP_ASSERT( d.vkGetMemoryMetalHandlePropertiesEXT && \"Function <vkGetMemoryMetalHandlePropertiesEXT> requires <VK_EXT_external_memory_metal>\" );\n#    endif\n\n    VULKAN_HPP_NAMESPACE::MemoryMetalHandlePropertiesEXT memoryMetalHandleProperties;\n    VULKAN_HPP_NAMESPACE::Result                         result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n      d.vkGetMemoryMetalHandlePropertiesEXT( m_device,\n                                             static_cast<VkExternalMemoryHandleTypeFlagBits>( handleType ),\n                                             reinterpret_cast<const void *>( &handle ),\n                                             reinterpret_cast<VkMemoryMetalHandlePropertiesEXT *>( &memoryMetalHandleProperties ) ) );\n    VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getMemoryMetalHandlePropertiesEXT\" );\n\n    return VULKAN_HPP_NAMESPACE::detail::createResultValueType( result, std::move( memoryMetalHandleProperties ) );\n  }\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_METAL_EXT*/\n\n}  // namespace VULKAN_HPP_NAMESPACE\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_ggp.h",
    "content": "#ifndef VULKAN_GGP_H_\n#define VULKAN_GGP_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// VK_GGP_stream_descriptor_surface is a preprocessor guard. Do not pass it to API calls.\n#define VK_GGP_stream_descriptor_surface 1\n#define VK_GGP_STREAM_DESCRIPTOR_SURFACE_SPEC_VERSION 1\n#define VK_GGP_STREAM_DESCRIPTOR_SURFACE_EXTENSION_NAME \"VK_GGP_stream_descriptor_surface\"\ntypedef VkFlags VkStreamDescriptorSurfaceCreateFlagsGGP;\ntypedef struct VkStreamDescriptorSurfaceCreateInfoGGP {\n    VkStructureType                            sType;\n    const void*                                pNext;\n    VkStreamDescriptorSurfaceCreateFlagsGGP    flags;\n    GgpStreamDescriptor                        streamDescriptor;\n} VkStreamDescriptorSurfaceCreateInfoGGP;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateStreamDescriptorSurfaceGGP)(VkInstance instance, const VkStreamDescriptorSurfaceCreateInfoGGP* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateStreamDescriptorSurfaceGGP(\n    VkInstance                                  instance,\n    const VkStreamDescriptorSurfaceCreateInfoGGP* pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSurfaceKHR*                               pSurface);\n#endif\n\n\n// VK_GGP_frame_token is a preprocessor guard. Do not pass it to API calls.\n#define VK_GGP_frame_token 1\n#define VK_GGP_FRAME_TOKEN_SPEC_VERSION   1\n#define VK_GGP_FRAME_TOKEN_EXTENSION_NAME \"VK_GGP_frame_token\"\ntypedef struct VkPresentFrameTokenGGP {\n    VkStructureType    sType;\n    const void*        pNext;\n    GgpFrameToken      frameToken;\n} VkPresentFrameTokenGGP;\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_handles.hpp",
    "content": "// Copyright 2015-2025 The Khronos Group Inc.\n//\n// SPDX-License-Identifier: Apache-2.0 OR MIT\n//\n\n// This header is generated from the Khronos Vulkan XML API Registry.\n\n#ifndef VULKAN_HANDLES_HPP\n#define VULKAN_HANDLES_HPP\n\n// include-what-you-use: make sure, vulkan.hpp is used by code-completers\n// IWYU pragma: private; include \"vulkan.hpp\"\n\nnamespace VULKAN_HPP_NAMESPACE\n{\n\n  //===================================\n  //=== STRUCT forward declarations ===\n  //===================================\n\n  //=== VK_VERSION_1_0 ===\n  struct Extent2D;\n  struct Extent3D;\n  struct Offset2D;\n  struct Offset3D;\n  struct Rect2D;\n  struct BaseInStructure;\n  struct BaseOutStructure;\n  struct BufferMemoryBarrier;\n  struct DispatchIndirectCommand;\n  struct DrawIndexedIndirectCommand;\n  struct DrawIndirectCommand;\n  struct ImageMemoryBarrier;\n  struct MemoryBarrier;\n  struct PipelineCacheHeaderVersionOne;\n  struct AllocationCallbacks;\n  struct ApplicationInfo;\n  struct FormatProperties;\n  struct ImageFormatProperties;\n  struct InstanceCreateInfo;\n  struct MemoryHeap;\n  struct MemoryType;\n  struct PhysicalDeviceFeatures;\n  struct PhysicalDeviceLimits;\n  struct PhysicalDeviceMemoryProperties;\n  struct PhysicalDeviceProperties;\n  struct PhysicalDeviceSparseProperties;\n  struct QueueFamilyProperties;\n  struct DeviceCreateInfo;\n  struct DeviceQueueCreateInfo;\n  struct ExtensionProperties;\n  struct LayerProperties;\n  struct SubmitInfo;\n  struct MappedMemoryRange;\n  struct MemoryAllocateInfo;\n  struct MemoryRequirements;\n  struct BindSparseInfo;\n  struct ImageSubresource;\n  struct SparseBufferMemoryBindInfo;\n  struct SparseImageFormatProperties;\n  struct SparseImageMemoryBind;\n  struct SparseImageMemoryBindInfo;\n  struct SparseImageMemoryRequirements;\n  struct SparseImageOpaqueMemoryBindInfo;\n  struct SparseMemoryBind;\n  struct FenceCreateInfo;\n  struct SemaphoreCreateInfo;\n  struct EventCreateInfo;\n  struct QueryPoolCreateInfo;\n  struct BufferCreateInfo;\n  struct BufferViewCreateInfo;\n  struct ImageCreateInfo;\n  struct SubresourceLayout;\n  struct ComponentMapping;\n  struct ImageSubresourceRange;\n  struct ImageViewCreateInfo;\n  struct ShaderModuleCreateInfo;\n  struct PipelineCacheCreateInfo;\n  struct ComputePipelineCreateInfo;\n  struct GraphicsPipelineCreateInfo;\n  struct PipelineColorBlendAttachmentState;\n  struct PipelineColorBlendStateCreateInfo;\n  struct PipelineDepthStencilStateCreateInfo;\n  struct PipelineDynamicStateCreateInfo;\n  struct PipelineInputAssemblyStateCreateInfo;\n  struct PipelineMultisampleStateCreateInfo;\n  struct PipelineRasterizationStateCreateInfo;\n  struct PipelineShaderStageCreateInfo;\n  struct PipelineTessellationStateCreateInfo;\n  struct PipelineVertexInputStateCreateInfo;\n  struct PipelineViewportStateCreateInfo;\n  struct SpecializationInfo;\n  struct SpecializationMapEntry;\n  struct StencilOpState;\n  struct VertexInputAttributeDescription;\n  struct VertexInputBindingDescription;\n  struct Viewport;\n  struct PipelineLayoutCreateInfo;\n  struct PushConstantRange;\n  struct SamplerCreateInfo;\n  struct CopyDescriptorSet;\n  struct DescriptorBufferInfo;\n  struct DescriptorImageInfo;\n  struct DescriptorPoolCreateInfo;\n  struct DescriptorPoolSize;\n  struct DescriptorSetAllocateInfo;\n  struct DescriptorSetLayoutBinding;\n  struct DescriptorSetLayoutCreateInfo;\n  struct WriteDescriptorSet;\n  struct AttachmentDescription;\n  struct AttachmentReference;\n  struct FramebufferCreateInfo;\n  struct RenderPassCreateInfo;\n  struct SubpassDependency;\n  struct SubpassDescription;\n  struct CommandPoolCreateInfo;\n  struct CommandBufferAllocateInfo;\n  struct CommandBufferBeginInfo;\n  struct CommandBufferInheritanceInfo;\n  struct BufferCopy;\n  struct BufferImageCopy;\n  struct ClearAttachment;\n  union ClearColorValue;\n  struct ClearDepthStencilValue;\n  struct ClearRect;\n  union ClearValue;\n  struct ImageBlit;\n  struct ImageCopy;\n  struct ImageResolve;\n  struct ImageSubresourceLayers;\n  struct RenderPassBeginInfo;\n\n  //=== VK_VERSION_1_1 ===\n  struct PhysicalDeviceSubgroupProperties;\n  struct BindBufferMemoryInfo;\n  using BindBufferMemoryInfoKHR = BindBufferMemoryInfo;\n  struct BindImageMemoryInfo;\n  using BindImageMemoryInfoKHR = BindImageMemoryInfo;\n  struct PhysicalDevice16BitStorageFeatures;\n  using PhysicalDevice16BitStorageFeaturesKHR = PhysicalDevice16BitStorageFeatures;\n  struct MemoryDedicatedRequirements;\n  using MemoryDedicatedRequirementsKHR = MemoryDedicatedRequirements;\n  struct MemoryDedicatedAllocateInfo;\n  using MemoryDedicatedAllocateInfoKHR = MemoryDedicatedAllocateInfo;\n  struct MemoryAllocateFlagsInfo;\n  using MemoryAllocateFlagsInfoKHR = MemoryAllocateFlagsInfo;\n  struct DeviceGroupRenderPassBeginInfo;\n  using DeviceGroupRenderPassBeginInfoKHR = DeviceGroupRenderPassBeginInfo;\n  struct DeviceGroupCommandBufferBeginInfo;\n  using DeviceGroupCommandBufferBeginInfoKHR = DeviceGroupCommandBufferBeginInfo;\n  struct DeviceGroupSubmitInfo;\n  using DeviceGroupSubmitInfoKHR = DeviceGroupSubmitInfo;\n  struct DeviceGroupBindSparseInfo;\n  using DeviceGroupBindSparseInfoKHR = DeviceGroupBindSparseInfo;\n  struct BindBufferMemoryDeviceGroupInfo;\n  using BindBufferMemoryDeviceGroupInfoKHR = BindBufferMemoryDeviceGroupInfo;\n  struct BindImageMemoryDeviceGroupInfo;\n  using BindImageMemoryDeviceGroupInfoKHR = BindImageMemoryDeviceGroupInfo;\n  struct PhysicalDeviceGroupProperties;\n  using PhysicalDeviceGroupPropertiesKHR = PhysicalDeviceGroupProperties;\n  struct DeviceGroupDeviceCreateInfo;\n  using DeviceGroupDeviceCreateInfoKHR = DeviceGroupDeviceCreateInfo;\n  struct BufferMemoryRequirementsInfo2;\n  using BufferMemoryRequirementsInfo2KHR = BufferMemoryRequirementsInfo2;\n  struct ImageMemoryRequirementsInfo2;\n  using ImageMemoryRequirementsInfo2KHR = ImageMemoryRequirementsInfo2;\n  struct ImageSparseMemoryRequirementsInfo2;\n  using ImageSparseMemoryRequirementsInfo2KHR = ImageSparseMemoryRequirementsInfo2;\n  struct MemoryRequirements2;\n  using MemoryRequirements2KHR = MemoryRequirements2;\n  struct SparseImageMemoryRequirements2;\n  using SparseImageMemoryRequirements2KHR = SparseImageMemoryRequirements2;\n  struct PhysicalDeviceFeatures2;\n  using PhysicalDeviceFeatures2KHR = PhysicalDeviceFeatures2;\n  struct PhysicalDeviceProperties2;\n  using PhysicalDeviceProperties2KHR = PhysicalDeviceProperties2;\n  struct FormatProperties2;\n  using FormatProperties2KHR = FormatProperties2;\n  struct ImageFormatProperties2;\n  using ImageFormatProperties2KHR = ImageFormatProperties2;\n  struct PhysicalDeviceImageFormatInfo2;\n  using PhysicalDeviceImageFormatInfo2KHR = PhysicalDeviceImageFormatInfo2;\n  struct QueueFamilyProperties2;\n  using QueueFamilyProperties2KHR = QueueFamilyProperties2;\n  struct PhysicalDeviceMemoryProperties2;\n  using PhysicalDeviceMemoryProperties2KHR = PhysicalDeviceMemoryProperties2;\n  struct SparseImageFormatProperties2;\n  using SparseImageFormatProperties2KHR = SparseImageFormatProperties2;\n  struct PhysicalDeviceSparseImageFormatInfo2;\n  using PhysicalDeviceSparseImageFormatInfo2KHR = PhysicalDeviceSparseImageFormatInfo2;\n  struct PhysicalDevicePointClippingProperties;\n  using PhysicalDevicePointClippingPropertiesKHR = PhysicalDevicePointClippingProperties;\n  struct RenderPassInputAttachmentAspectCreateInfo;\n  using RenderPassInputAttachmentAspectCreateInfoKHR = RenderPassInputAttachmentAspectCreateInfo;\n  struct InputAttachmentAspectReference;\n  using InputAttachmentAspectReferenceKHR = InputAttachmentAspectReference;\n  struct ImageViewUsageCreateInfo;\n  using ImageViewUsageCreateInfoKHR = ImageViewUsageCreateInfo;\n  struct PipelineTessellationDomainOriginStateCreateInfo;\n  using PipelineTessellationDomainOriginStateCreateInfoKHR = PipelineTessellationDomainOriginStateCreateInfo;\n  struct RenderPassMultiviewCreateInfo;\n  using RenderPassMultiviewCreateInfoKHR = RenderPassMultiviewCreateInfo;\n  struct PhysicalDeviceMultiviewFeatures;\n  using PhysicalDeviceMultiviewFeaturesKHR = PhysicalDeviceMultiviewFeatures;\n  struct PhysicalDeviceMultiviewProperties;\n  using PhysicalDeviceMultiviewPropertiesKHR = PhysicalDeviceMultiviewProperties;\n  struct PhysicalDeviceVariablePointersFeatures;\n  using PhysicalDeviceVariablePointerFeatures     = PhysicalDeviceVariablePointersFeatures;\n  using PhysicalDeviceVariablePointerFeaturesKHR  = PhysicalDeviceVariablePointersFeatures;\n  using PhysicalDeviceVariablePointersFeaturesKHR = PhysicalDeviceVariablePointersFeatures;\n  struct PhysicalDeviceProtectedMemoryFeatures;\n  struct PhysicalDeviceProtectedMemoryProperties;\n  struct DeviceQueueInfo2;\n  struct ProtectedSubmitInfo;\n  struct SamplerYcbcrConversionCreateInfo;\n  using SamplerYcbcrConversionCreateInfoKHR = SamplerYcbcrConversionCreateInfo;\n  struct SamplerYcbcrConversionInfo;\n  using SamplerYcbcrConversionInfoKHR = SamplerYcbcrConversionInfo;\n  struct BindImagePlaneMemoryInfo;\n  using BindImagePlaneMemoryInfoKHR = BindImagePlaneMemoryInfo;\n  struct ImagePlaneMemoryRequirementsInfo;\n  using ImagePlaneMemoryRequirementsInfoKHR = ImagePlaneMemoryRequirementsInfo;\n  struct PhysicalDeviceSamplerYcbcrConversionFeatures;\n  using PhysicalDeviceSamplerYcbcrConversionFeaturesKHR = PhysicalDeviceSamplerYcbcrConversionFeatures;\n  struct SamplerYcbcrConversionImageFormatProperties;\n  using SamplerYcbcrConversionImageFormatPropertiesKHR = SamplerYcbcrConversionImageFormatProperties;\n  struct DescriptorUpdateTemplateEntry;\n  using DescriptorUpdateTemplateEntryKHR = DescriptorUpdateTemplateEntry;\n  struct DescriptorUpdateTemplateCreateInfo;\n  using DescriptorUpdateTemplateCreateInfoKHR = DescriptorUpdateTemplateCreateInfo;\n  struct ExternalMemoryProperties;\n  using ExternalMemoryPropertiesKHR = ExternalMemoryProperties;\n  struct PhysicalDeviceExternalImageFormatInfo;\n  using PhysicalDeviceExternalImageFormatInfoKHR = PhysicalDeviceExternalImageFormatInfo;\n  struct ExternalImageFormatProperties;\n  using ExternalImageFormatPropertiesKHR = ExternalImageFormatProperties;\n  struct PhysicalDeviceExternalBufferInfo;\n  using PhysicalDeviceExternalBufferInfoKHR = PhysicalDeviceExternalBufferInfo;\n  struct ExternalBufferProperties;\n  using ExternalBufferPropertiesKHR = ExternalBufferProperties;\n  struct PhysicalDeviceIDProperties;\n  using PhysicalDeviceIDPropertiesKHR = PhysicalDeviceIDProperties;\n  struct ExternalMemoryImageCreateInfo;\n  using ExternalMemoryImageCreateInfoKHR = ExternalMemoryImageCreateInfo;\n  struct ExternalMemoryBufferCreateInfo;\n  using ExternalMemoryBufferCreateInfoKHR = ExternalMemoryBufferCreateInfo;\n  struct ExportMemoryAllocateInfo;\n  using ExportMemoryAllocateInfoKHR = ExportMemoryAllocateInfo;\n  struct PhysicalDeviceExternalFenceInfo;\n  using PhysicalDeviceExternalFenceInfoKHR = PhysicalDeviceExternalFenceInfo;\n  struct ExternalFenceProperties;\n  using ExternalFencePropertiesKHR = ExternalFenceProperties;\n  struct ExportFenceCreateInfo;\n  using ExportFenceCreateInfoKHR = ExportFenceCreateInfo;\n  struct ExportSemaphoreCreateInfo;\n  using ExportSemaphoreCreateInfoKHR = ExportSemaphoreCreateInfo;\n  struct PhysicalDeviceExternalSemaphoreInfo;\n  using PhysicalDeviceExternalSemaphoreInfoKHR = PhysicalDeviceExternalSemaphoreInfo;\n  struct ExternalSemaphoreProperties;\n  using ExternalSemaphorePropertiesKHR = ExternalSemaphoreProperties;\n  struct PhysicalDeviceMaintenance3Properties;\n  using PhysicalDeviceMaintenance3PropertiesKHR = PhysicalDeviceMaintenance3Properties;\n  struct DescriptorSetLayoutSupport;\n  using DescriptorSetLayoutSupportKHR = DescriptorSetLayoutSupport;\n  struct PhysicalDeviceShaderDrawParametersFeatures;\n  using PhysicalDeviceShaderDrawParameterFeatures = PhysicalDeviceShaderDrawParametersFeatures;\n\n  //=== VK_VERSION_1_2 ===\n  struct PhysicalDeviceVulkan11Features;\n  struct PhysicalDeviceVulkan11Properties;\n  struct PhysicalDeviceVulkan12Features;\n  struct PhysicalDeviceVulkan12Properties;\n  struct ImageFormatListCreateInfo;\n  using ImageFormatListCreateInfoKHR = ImageFormatListCreateInfo;\n  struct RenderPassCreateInfo2;\n  using RenderPassCreateInfo2KHR = RenderPassCreateInfo2;\n  struct AttachmentDescription2;\n  using AttachmentDescription2KHR = AttachmentDescription2;\n  struct AttachmentReference2;\n  using AttachmentReference2KHR = AttachmentReference2;\n  struct SubpassDescription2;\n  using SubpassDescription2KHR = SubpassDescription2;\n  struct SubpassDependency2;\n  using SubpassDependency2KHR = SubpassDependency2;\n  struct SubpassBeginInfo;\n  using SubpassBeginInfoKHR = SubpassBeginInfo;\n  struct SubpassEndInfo;\n  using SubpassEndInfoKHR = SubpassEndInfo;\n  struct PhysicalDevice8BitStorageFeatures;\n  using PhysicalDevice8BitStorageFeaturesKHR = PhysicalDevice8BitStorageFeatures;\n  struct ConformanceVersion;\n  using ConformanceVersionKHR = ConformanceVersion;\n  struct PhysicalDeviceDriverProperties;\n  using PhysicalDeviceDriverPropertiesKHR = PhysicalDeviceDriverProperties;\n  struct PhysicalDeviceShaderAtomicInt64Features;\n  using PhysicalDeviceShaderAtomicInt64FeaturesKHR = PhysicalDeviceShaderAtomicInt64Features;\n  struct PhysicalDeviceShaderFloat16Int8Features;\n  using PhysicalDeviceFloat16Int8FeaturesKHR       = PhysicalDeviceShaderFloat16Int8Features;\n  using PhysicalDeviceShaderFloat16Int8FeaturesKHR = PhysicalDeviceShaderFloat16Int8Features;\n  struct PhysicalDeviceFloatControlsProperties;\n  using PhysicalDeviceFloatControlsPropertiesKHR = PhysicalDeviceFloatControlsProperties;\n  struct DescriptorSetLayoutBindingFlagsCreateInfo;\n  using DescriptorSetLayoutBindingFlagsCreateInfoEXT = DescriptorSetLayoutBindingFlagsCreateInfo;\n  struct PhysicalDeviceDescriptorIndexingFeatures;\n  using PhysicalDeviceDescriptorIndexingFeaturesEXT = PhysicalDeviceDescriptorIndexingFeatures;\n  struct PhysicalDeviceDescriptorIndexingProperties;\n  using PhysicalDeviceDescriptorIndexingPropertiesEXT = PhysicalDeviceDescriptorIndexingProperties;\n  struct DescriptorSetVariableDescriptorCountAllocateInfo;\n  using DescriptorSetVariableDescriptorCountAllocateInfoEXT = DescriptorSetVariableDescriptorCountAllocateInfo;\n  struct DescriptorSetVariableDescriptorCountLayoutSupport;\n  using DescriptorSetVariableDescriptorCountLayoutSupportEXT = DescriptorSetVariableDescriptorCountLayoutSupport;\n  struct SubpassDescriptionDepthStencilResolve;\n  using SubpassDescriptionDepthStencilResolveKHR = SubpassDescriptionDepthStencilResolve;\n  struct PhysicalDeviceDepthStencilResolveProperties;\n  using PhysicalDeviceDepthStencilResolvePropertiesKHR = PhysicalDeviceDepthStencilResolveProperties;\n  struct PhysicalDeviceScalarBlockLayoutFeatures;\n  using PhysicalDeviceScalarBlockLayoutFeaturesEXT = PhysicalDeviceScalarBlockLayoutFeatures;\n  struct ImageStencilUsageCreateInfo;\n  using ImageStencilUsageCreateInfoEXT = ImageStencilUsageCreateInfo;\n  struct SamplerReductionModeCreateInfo;\n  using SamplerReductionModeCreateInfoEXT = SamplerReductionModeCreateInfo;\n  struct PhysicalDeviceSamplerFilterMinmaxProperties;\n  using PhysicalDeviceSamplerFilterMinmaxPropertiesEXT = PhysicalDeviceSamplerFilterMinmaxProperties;\n  struct PhysicalDeviceVulkanMemoryModelFeatures;\n  using PhysicalDeviceVulkanMemoryModelFeaturesKHR = PhysicalDeviceVulkanMemoryModelFeatures;\n  struct PhysicalDeviceImagelessFramebufferFeatures;\n  using PhysicalDeviceImagelessFramebufferFeaturesKHR = PhysicalDeviceImagelessFramebufferFeatures;\n  struct FramebufferAttachmentsCreateInfo;\n  using FramebufferAttachmentsCreateInfoKHR = FramebufferAttachmentsCreateInfo;\n  struct FramebufferAttachmentImageInfo;\n  using FramebufferAttachmentImageInfoKHR = FramebufferAttachmentImageInfo;\n  struct RenderPassAttachmentBeginInfo;\n  using RenderPassAttachmentBeginInfoKHR = RenderPassAttachmentBeginInfo;\n  struct PhysicalDeviceUniformBufferStandardLayoutFeatures;\n  using PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR = PhysicalDeviceUniformBufferStandardLayoutFeatures;\n  struct PhysicalDeviceShaderSubgroupExtendedTypesFeatures;\n  using PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR = PhysicalDeviceShaderSubgroupExtendedTypesFeatures;\n  struct PhysicalDeviceSeparateDepthStencilLayoutsFeatures;\n  using PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR = PhysicalDeviceSeparateDepthStencilLayoutsFeatures;\n  struct AttachmentReferenceStencilLayout;\n  using AttachmentReferenceStencilLayoutKHR = AttachmentReferenceStencilLayout;\n  struct AttachmentDescriptionStencilLayout;\n  using AttachmentDescriptionStencilLayoutKHR = AttachmentDescriptionStencilLayout;\n  struct PhysicalDeviceHostQueryResetFeatures;\n  using PhysicalDeviceHostQueryResetFeaturesEXT = PhysicalDeviceHostQueryResetFeatures;\n  struct PhysicalDeviceTimelineSemaphoreFeatures;\n  using PhysicalDeviceTimelineSemaphoreFeaturesKHR = PhysicalDeviceTimelineSemaphoreFeatures;\n  struct PhysicalDeviceTimelineSemaphoreProperties;\n  using PhysicalDeviceTimelineSemaphorePropertiesKHR = PhysicalDeviceTimelineSemaphoreProperties;\n  struct SemaphoreTypeCreateInfo;\n  using SemaphoreTypeCreateInfoKHR = SemaphoreTypeCreateInfo;\n  struct TimelineSemaphoreSubmitInfo;\n  using TimelineSemaphoreSubmitInfoKHR = TimelineSemaphoreSubmitInfo;\n  struct SemaphoreWaitInfo;\n  using SemaphoreWaitInfoKHR = SemaphoreWaitInfo;\n  struct SemaphoreSignalInfo;\n  using SemaphoreSignalInfoKHR = SemaphoreSignalInfo;\n  struct PhysicalDeviceBufferDeviceAddressFeatures;\n  using PhysicalDeviceBufferDeviceAddressFeaturesKHR = PhysicalDeviceBufferDeviceAddressFeatures;\n  struct BufferDeviceAddressInfo;\n  using BufferDeviceAddressInfoEXT = BufferDeviceAddressInfo;\n  using BufferDeviceAddressInfoKHR = BufferDeviceAddressInfo;\n  struct BufferOpaqueCaptureAddressCreateInfo;\n  using BufferOpaqueCaptureAddressCreateInfoKHR = BufferOpaqueCaptureAddressCreateInfo;\n  struct MemoryOpaqueCaptureAddressAllocateInfo;\n  using MemoryOpaqueCaptureAddressAllocateInfoKHR = MemoryOpaqueCaptureAddressAllocateInfo;\n  struct DeviceMemoryOpaqueCaptureAddressInfo;\n  using DeviceMemoryOpaqueCaptureAddressInfoKHR = DeviceMemoryOpaqueCaptureAddressInfo;\n\n  //=== VK_VERSION_1_3 ===\n  struct PhysicalDeviceVulkan13Features;\n  struct PhysicalDeviceVulkan13Properties;\n  struct PipelineCreationFeedbackCreateInfo;\n  using PipelineCreationFeedbackCreateInfoEXT = PipelineCreationFeedbackCreateInfo;\n  struct PipelineCreationFeedback;\n  using PipelineCreationFeedbackEXT = PipelineCreationFeedback;\n  struct PhysicalDeviceShaderTerminateInvocationFeatures;\n  using PhysicalDeviceShaderTerminateInvocationFeaturesKHR = PhysicalDeviceShaderTerminateInvocationFeatures;\n  struct PhysicalDeviceToolProperties;\n  using PhysicalDeviceToolPropertiesEXT = PhysicalDeviceToolProperties;\n  struct PhysicalDeviceShaderDemoteToHelperInvocationFeatures;\n  using PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT = PhysicalDeviceShaderDemoteToHelperInvocationFeatures;\n  struct PhysicalDevicePrivateDataFeatures;\n  using PhysicalDevicePrivateDataFeaturesEXT = PhysicalDevicePrivateDataFeatures;\n  struct DevicePrivateDataCreateInfo;\n  using DevicePrivateDataCreateInfoEXT = DevicePrivateDataCreateInfo;\n  struct PrivateDataSlotCreateInfo;\n  using PrivateDataSlotCreateInfoEXT = PrivateDataSlotCreateInfo;\n  struct PhysicalDevicePipelineCreationCacheControlFeatures;\n  using PhysicalDevicePipelineCreationCacheControlFeaturesEXT = PhysicalDevicePipelineCreationCacheControlFeatures;\n  struct MemoryBarrier2;\n  using MemoryBarrier2KHR = MemoryBarrier2;\n  struct BufferMemoryBarrier2;\n  using BufferMemoryBarrier2KHR = BufferMemoryBarrier2;\n  struct ImageMemoryBarrier2;\n  using ImageMemoryBarrier2KHR = ImageMemoryBarrier2;\n  struct DependencyInfo;\n  using DependencyInfoKHR = DependencyInfo;\n  struct SubmitInfo2;\n  using SubmitInfo2KHR = SubmitInfo2;\n  struct SemaphoreSubmitInfo;\n  using SemaphoreSubmitInfoKHR = SemaphoreSubmitInfo;\n  struct CommandBufferSubmitInfo;\n  using CommandBufferSubmitInfoKHR = CommandBufferSubmitInfo;\n  struct PhysicalDeviceSynchronization2Features;\n  using PhysicalDeviceSynchronization2FeaturesKHR = PhysicalDeviceSynchronization2Features;\n  struct PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures;\n  using PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR = PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures;\n  struct PhysicalDeviceImageRobustnessFeatures;\n  using PhysicalDeviceImageRobustnessFeaturesEXT = PhysicalDeviceImageRobustnessFeatures;\n  struct CopyBufferInfo2;\n  using CopyBufferInfo2KHR = CopyBufferInfo2;\n  struct CopyImageInfo2;\n  using CopyImageInfo2KHR = CopyImageInfo2;\n  struct CopyBufferToImageInfo2;\n  using CopyBufferToImageInfo2KHR = CopyBufferToImageInfo2;\n  struct CopyImageToBufferInfo2;\n  using CopyImageToBufferInfo2KHR = CopyImageToBufferInfo2;\n  struct BlitImageInfo2;\n  using BlitImageInfo2KHR = BlitImageInfo2;\n  struct ResolveImageInfo2;\n  using ResolveImageInfo2KHR = ResolveImageInfo2;\n  struct BufferCopy2;\n  using BufferCopy2KHR = BufferCopy2;\n  struct ImageCopy2;\n  using ImageCopy2KHR = ImageCopy2;\n  struct ImageBlit2;\n  using ImageBlit2KHR = ImageBlit2;\n  struct BufferImageCopy2;\n  using BufferImageCopy2KHR = BufferImageCopy2;\n  struct ImageResolve2;\n  using ImageResolve2KHR = ImageResolve2;\n  struct PhysicalDeviceSubgroupSizeControlFeatures;\n  using PhysicalDeviceSubgroupSizeControlFeaturesEXT = PhysicalDeviceSubgroupSizeControlFeatures;\n  struct PhysicalDeviceSubgroupSizeControlProperties;\n  using PhysicalDeviceSubgroupSizeControlPropertiesEXT = PhysicalDeviceSubgroupSizeControlProperties;\n  struct PipelineShaderStageRequiredSubgroupSizeCreateInfo;\n  using PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT = PipelineShaderStageRequiredSubgroupSizeCreateInfo;\n  using ShaderRequiredSubgroupSizeCreateInfoEXT              = PipelineShaderStageRequiredSubgroupSizeCreateInfo;\n  struct PhysicalDeviceInlineUniformBlockFeatures;\n  using PhysicalDeviceInlineUniformBlockFeaturesEXT = PhysicalDeviceInlineUniformBlockFeatures;\n  struct PhysicalDeviceInlineUniformBlockProperties;\n  using PhysicalDeviceInlineUniformBlockPropertiesEXT = PhysicalDeviceInlineUniformBlockProperties;\n  struct WriteDescriptorSetInlineUniformBlock;\n  using WriteDescriptorSetInlineUniformBlockEXT = WriteDescriptorSetInlineUniformBlock;\n  struct DescriptorPoolInlineUniformBlockCreateInfo;\n  using DescriptorPoolInlineUniformBlockCreateInfoEXT = DescriptorPoolInlineUniformBlockCreateInfo;\n  struct PhysicalDeviceTextureCompressionASTCHDRFeatures;\n  using PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT = PhysicalDeviceTextureCompressionASTCHDRFeatures;\n  struct RenderingInfo;\n  using RenderingInfoKHR = RenderingInfo;\n  struct RenderingAttachmentInfo;\n  using RenderingAttachmentInfoKHR = RenderingAttachmentInfo;\n  struct PipelineRenderingCreateInfo;\n  using PipelineRenderingCreateInfoKHR = PipelineRenderingCreateInfo;\n  struct PhysicalDeviceDynamicRenderingFeatures;\n  using PhysicalDeviceDynamicRenderingFeaturesKHR = PhysicalDeviceDynamicRenderingFeatures;\n  struct CommandBufferInheritanceRenderingInfo;\n  using CommandBufferInheritanceRenderingInfoKHR = CommandBufferInheritanceRenderingInfo;\n  struct PhysicalDeviceShaderIntegerDotProductFeatures;\n  using PhysicalDeviceShaderIntegerDotProductFeaturesKHR = PhysicalDeviceShaderIntegerDotProductFeatures;\n  struct PhysicalDeviceShaderIntegerDotProductProperties;\n  using PhysicalDeviceShaderIntegerDotProductPropertiesKHR = PhysicalDeviceShaderIntegerDotProductProperties;\n  struct PhysicalDeviceTexelBufferAlignmentProperties;\n  using PhysicalDeviceTexelBufferAlignmentPropertiesEXT = PhysicalDeviceTexelBufferAlignmentProperties;\n  struct FormatProperties3;\n  using FormatProperties3KHR = FormatProperties3;\n  struct PhysicalDeviceMaintenance4Features;\n  using PhysicalDeviceMaintenance4FeaturesKHR = PhysicalDeviceMaintenance4Features;\n  struct PhysicalDeviceMaintenance4Properties;\n  using PhysicalDeviceMaintenance4PropertiesKHR = PhysicalDeviceMaintenance4Properties;\n  struct DeviceBufferMemoryRequirements;\n  using DeviceBufferMemoryRequirementsKHR = DeviceBufferMemoryRequirements;\n  struct DeviceImageMemoryRequirements;\n  using DeviceImageMemoryRequirementsKHR = DeviceImageMemoryRequirements;\n\n  //=== VK_VERSION_1_4 ===\n  struct PhysicalDeviceVulkan14Features;\n  struct PhysicalDeviceVulkan14Properties;\n  struct DeviceQueueGlobalPriorityCreateInfo;\n  using DeviceQueueGlobalPriorityCreateInfoEXT = DeviceQueueGlobalPriorityCreateInfo;\n  using DeviceQueueGlobalPriorityCreateInfoKHR = DeviceQueueGlobalPriorityCreateInfo;\n  struct PhysicalDeviceGlobalPriorityQueryFeatures;\n  using PhysicalDeviceGlobalPriorityQueryFeaturesEXT = PhysicalDeviceGlobalPriorityQueryFeatures;\n  using PhysicalDeviceGlobalPriorityQueryFeaturesKHR = PhysicalDeviceGlobalPriorityQueryFeatures;\n  struct QueueFamilyGlobalPriorityProperties;\n  using QueueFamilyGlobalPriorityPropertiesEXT = QueueFamilyGlobalPriorityProperties;\n  using QueueFamilyGlobalPriorityPropertiesKHR = QueueFamilyGlobalPriorityProperties;\n  struct PhysicalDeviceShaderSubgroupRotateFeatures;\n  using PhysicalDeviceShaderSubgroupRotateFeaturesKHR = PhysicalDeviceShaderSubgroupRotateFeatures;\n  struct PhysicalDeviceShaderFloatControls2Features;\n  using PhysicalDeviceShaderFloatControls2FeaturesKHR = PhysicalDeviceShaderFloatControls2Features;\n  struct PhysicalDeviceShaderExpectAssumeFeatures;\n  using PhysicalDeviceShaderExpectAssumeFeaturesKHR = PhysicalDeviceShaderExpectAssumeFeatures;\n  struct PhysicalDeviceLineRasterizationFeatures;\n  using PhysicalDeviceLineRasterizationFeaturesEXT = PhysicalDeviceLineRasterizationFeatures;\n  using PhysicalDeviceLineRasterizationFeaturesKHR = PhysicalDeviceLineRasterizationFeatures;\n  struct PhysicalDeviceLineRasterizationProperties;\n  using PhysicalDeviceLineRasterizationPropertiesEXT = PhysicalDeviceLineRasterizationProperties;\n  using PhysicalDeviceLineRasterizationPropertiesKHR = PhysicalDeviceLineRasterizationProperties;\n  struct PipelineRasterizationLineStateCreateInfo;\n  using PipelineRasterizationLineStateCreateInfoEXT = PipelineRasterizationLineStateCreateInfo;\n  using PipelineRasterizationLineStateCreateInfoKHR = PipelineRasterizationLineStateCreateInfo;\n  struct PhysicalDeviceVertexAttributeDivisorProperties;\n  using PhysicalDeviceVertexAttributeDivisorPropertiesKHR = PhysicalDeviceVertexAttributeDivisorProperties;\n  struct VertexInputBindingDivisorDescription;\n  using VertexInputBindingDivisorDescriptionEXT = VertexInputBindingDivisorDescription;\n  using VertexInputBindingDivisorDescriptionKHR = VertexInputBindingDivisorDescription;\n  struct PipelineVertexInputDivisorStateCreateInfo;\n  using PipelineVertexInputDivisorStateCreateInfoEXT = PipelineVertexInputDivisorStateCreateInfo;\n  using PipelineVertexInputDivisorStateCreateInfoKHR = PipelineVertexInputDivisorStateCreateInfo;\n  struct PhysicalDeviceVertexAttributeDivisorFeatures;\n  using PhysicalDeviceVertexAttributeDivisorFeaturesEXT = PhysicalDeviceVertexAttributeDivisorFeatures;\n  using PhysicalDeviceVertexAttributeDivisorFeaturesKHR = PhysicalDeviceVertexAttributeDivisorFeatures;\n  struct PhysicalDeviceIndexTypeUint8Features;\n  using PhysicalDeviceIndexTypeUint8FeaturesEXT = PhysicalDeviceIndexTypeUint8Features;\n  using PhysicalDeviceIndexTypeUint8FeaturesKHR = PhysicalDeviceIndexTypeUint8Features;\n  struct MemoryMapInfo;\n  using MemoryMapInfoKHR = MemoryMapInfo;\n  struct MemoryUnmapInfo;\n  using MemoryUnmapInfoKHR = MemoryUnmapInfo;\n  struct PhysicalDeviceMaintenance5Features;\n  using PhysicalDeviceMaintenance5FeaturesKHR = PhysicalDeviceMaintenance5Features;\n  struct PhysicalDeviceMaintenance5Properties;\n  using PhysicalDeviceMaintenance5PropertiesKHR = PhysicalDeviceMaintenance5Properties;\n  struct RenderingAreaInfo;\n  using RenderingAreaInfoKHR = RenderingAreaInfo;\n  struct DeviceImageSubresourceInfo;\n  using DeviceImageSubresourceInfoKHR = DeviceImageSubresourceInfo;\n  struct ImageSubresource2;\n  using ImageSubresource2EXT = ImageSubresource2;\n  using ImageSubresource2KHR = ImageSubresource2;\n  struct SubresourceLayout2;\n  using SubresourceLayout2EXT = SubresourceLayout2;\n  using SubresourceLayout2KHR = SubresourceLayout2;\n  struct PipelineCreateFlags2CreateInfo;\n  using PipelineCreateFlags2CreateInfoKHR = PipelineCreateFlags2CreateInfo;\n  struct BufferUsageFlags2CreateInfo;\n  using BufferUsageFlags2CreateInfoKHR = BufferUsageFlags2CreateInfo;\n  struct PhysicalDevicePushDescriptorProperties;\n  using PhysicalDevicePushDescriptorPropertiesKHR = PhysicalDevicePushDescriptorProperties;\n  struct PhysicalDeviceDynamicRenderingLocalReadFeatures;\n  using PhysicalDeviceDynamicRenderingLocalReadFeaturesKHR = PhysicalDeviceDynamicRenderingLocalReadFeatures;\n  struct RenderingAttachmentLocationInfo;\n  using RenderingAttachmentLocationInfoKHR = RenderingAttachmentLocationInfo;\n  struct RenderingInputAttachmentIndexInfo;\n  using RenderingInputAttachmentIndexInfoKHR = RenderingInputAttachmentIndexInfo;\n  struct PhysicalDeviceMaintenance6Features;\n  using PhysicalDeviceMaintenance6FeaturesKHR = PhysicalDeviceMaintenance6Features;\n  struct PhysicalDeviceMaintenance6Properties;\n  using PhysicalDeviceMaintenance6PropertiesKHR = PhysicalDeviceMaintenance6Properties;\n  struct BindMemoryStatus;\n  using BindMemoryStatusKHR = BindMemoryStatus;\n  struct BindDescriptorSetsInfo;\n  using BindDescriptorSetsInfoKHR = BindDescriptorSetsInfo;\n  struct PushConstantsInfo;\n  using PushConstantsInfoKHR = PushConstantsInfo;\n  struct PushDescriptorSetInfo;\n  using PushDescriptorSetInfoKHR = PushDescriptorSetInfo;\n  struct PushDescriptorSetWithTemplateInfo;\n  using PushDescriptorSetWithTemplateInfoKHR = PushDescriptorSetWithTemplateInfo;\n  struct PhysicalDevicePipelineProtectedAccessFeatures;\n  using PhysicalDevicePipelineProtectedAccessFeaturesEXT = PhysicalDevicePipelineProtectedAccessFeatures;\n  struct PhysicalDevicePipelineRobustnessFeatures;\n  using PhysicalDevicePipelineRobustnessFeaturesEXT = PhysicalDevicePipelineRobustnessFeatures;\n  struct PhysicalDevicePipelineRobustnessProperties;\n  using PhysicalDevicePipelineRobustnessPropertiesEXT = PhysicalDevicePipelineRobustnessProperties;\n  struct PipelineRobustnessCreateInfo;\n  using PipelineRobustnessCreateInfoEXT = PipelineRobustnessCreateInfo;\n  struct PhysicalDeviceHostImageCopyFeatures;\n  using PhysicalDeviceHostImageCopyFeaturesEXT = PhysicalDeviceHostImageCopyFeatures;\n  struct PhysicalDeviceHostImageCopyProperties;\n  using PhysicalDeviceHostImageCopyPropertiesEXT = PhysicalDeviceHostImageCopyProperties;\n  struct MemoryToImageCopy;\n  using MemoryToImageCopyEXT = MemoryToImageCopy;\n  struct ImageToMemoryCopy;\n  using ImageToMemoryCopyEXT = ImageToMemoryCopy;\n  struct CopyMemoryToImageInfo;\n  using CopyMemoryToImageInfoEXT = CopyMemoryToImageInfo;\n  struct CopyImageToMemoryInfo;\n  using CopyImageToMemoryInfoEXT = CopyImageToMemoryInfo;\n  struct CopyImageToImageInfo;\n  using CopyImageToImageInfoEXT = CopyImageToImageInfo;\n  struct HostImageLayoutTransitionInfo;\n  using HostImageLayoutTransitionInfoEXT = HostImageLayoutTransitionInfo;\n  struct SubresourceHostMemcpySize;\n  using SubresourceHostMemcpySizeEXT = SubresourceHostMemcpySize;\n  struct HostImageCopyDevicePerformanceQuery;\n  using HostImageCopyDevicePerformanceQueryEXT = HostImageCopyDevicePerformanceQuery;\n\n  //=== VK_KHR_surface ===\n  struct SurfaceCapabilitiesKHR;\n  struct SurfaceFormatKHR;\n\n  //=== VK_KHR_swapchain ===\n  struct SwapchainCreateInfoKHR;\n  struct PresentInfoKHR;\n  struct ImageSwapchainCreateInfoKHR;\n  struct BindImageMemorySwapchainInfoKHR;\n  struct AcquireNextImageInfoKHR;\n  struct DeviceGroupPresentCapabilitiesKHR;\n  struct DeviceGroupPresentInfoKHR;\n  struct DeviceGroupSwapchainCreateInfoKHR;\n\n  //=== VK_KHR_display ===\n  struct DisplayModeCreateInfoKHR;\n  struct DisplayModeParametersKHR;\n  struct DisplayModePropertiesKHR;\n  struct DisplayPlaneCapabilitiesKHR;\n  struct DisplayPlanePropertiesKHR;\n  struct DisplayPropertiesKHR;\n  struct DisplaySurfaceCreateInfoKHR;\n\n  //=== VK_KHR_display_swapchain ===\n  struct DisplayPresentInfoKHR;\n\n#if defined( VK_USE_PLATFORM_XLIB_KHR )\n  //=== VK_KHR_xlib_surface ===\n  struct XlibSurfaceCreateInfoKHR;\n#endif /*VK_USE_PLATFORM_XLIB_KHR*/\n\n#if defined( VK_USE_PLATFORM_XCB_KHR )\n  //=== VK_KHR_xcb_surface ===\n  struct XcbSurfaceCreateInfoKHR;\n#endif /*VK_USE_PLATFORM_XCB_KHR*/\n\n#if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n  //=== VK_KHR_wayland_surface ===\n  struct WaylandSurfaceCreateInfoKHR;\n#endif /*VK_USE_PLATFORM_WAYLAND_KHR*/\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  //=== VK_KHR_android_surface ===\n  struct AndroidSurfaceCreateInfoKHR;\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_KHR_win32_surface ===\n  struct Win32SurfaceCreateInfoKHR;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_EXT_debug_report ===\n  struct DebugReportCallbackCreateInfoEXT;\n\n  //=== VK_AMD_rasterization_order ===\n  struct PipelineRasterizationStateRasterizationOrderAMD;\n\n  //=== VK_EXT_debug_marker ===\n  struct DebugMarkerObjectNameInfoEXT;\n  struct DebugMarkerObjectTagInfoEXT;\n  struct DebugMarkerMarkerInfoEXT;\n\n  //=== VK_KHR_video_queue ===\n  struct QueueFamilyQueryResultStatusPropertiesKHR;\n  struct QueueFamilyVideoPropertiesKHR;\n  struct VideoProfileInfoKHR;\n  struct VideoProfileListInfoKHR;\n  struct VideoCapabilitiesKHR;\n  struct PhysicalDeviceVideoFormatInfoKHR;\n  struct VideoFormatPropertiesKHR;\n  struct VideoPictureResourceInfoKHR;\n  struct VideoReferenceSlotInfoKHR;\n  struct VideoSessionMemoryRequirementsKHR;\n  struct BindVideoSessionMemoryInfoKHR;\n  struct VideoSessionCreateInfoKHR;\n  struct VideoSessionParametersCreateInfoKHR;\n  struct VideoSessionParametersUpdateInfoKHR;\n  struct VideoBeginCodingInfoKHR;\n  struct VideoEndCodingInfoKHR;\n  struct VideoCodingControlInfoKHR;\n\n  //=== VK_KHR_video_decode_queue ===\n  struct VideoDecodeCapabilitiesKHR;\n  struct VideoDecodeUsageInfoKHR;\n  struct VideoDecodeInfoKHR;\n\n  //=== VK_NV_dedicated_allocation ===\n  struct DedicatedAllocationImageCreateInfoNV;\n  struct DedicatedAllocationBufferCreateInfoNV;\n  struct DedicatedAllocationMemoryAllocateInfoNV;\n\n  //=== VK_EXT_transform_feedback ===\n  struct PhysicalDeviceTransformFeedbackFeaturesEXT;\n  struct PhysicalDeviceTransformFeedbackPropertiesEXT;\n  struct PipelineRasterizationStateStreamCreateInfoEXT;\n\n  //=== VK_NVX_binary_import ===\n  struct CuModuleCreateInfoNVX;\n  struct CuModuleTexturingModeCreateInfoNVX;\n  struct CuFunctionCreateInfoNVX;\n  struct CuLaunchInfoNVX;\n\n  //=== VK_NVX_image_view_handle ===\n  struct ImageViewHandleInfoNVX;\n  struct ImageViewAddressPropertiesNVX;\n\n  //=== VK_KHR_video_encode_h264 ===\n  struct VideoEncodeH264CapabilitiesKHR;\n  struct VideoEncodeH264QualityLevelPropertiesKHR;\n  struct VideoEncodeH264SessionCreateInfoKHR;\n  struct VideoEncodeH264SessionParametersCreateInfoKHR;\n  struct VideoEncodeH264SessionParametersAddInfoKHR;\n  struct VideoEncodeH264SessionParametersGetInfoKHR;\n  struct VideoEncodeH264SessionParametersFeedbackInfoKHR;\n  struct VideoEncodeH264PictureInfoKHR;\n  struct VideoEncodeH264DpbSlotInfoKHR;\n  struct VideoEncodeH264NaluSliceInfoKHR;\n  struct VideoEncodeH264ProfileInfoKHR;\n  struct VideoEncodeH264RateControlInfoKHR;\n  struct VideoEncodeH264RateControlLayerInfoKHR;\n  struct VideoEncodeH264QpKHR;\n  struct VideoEncodeH264FrameSizeKHR;\n  struct VideoEncodeH264GopRemainingFrameInfoKHR;\n\n  //=== VK_KHR_video_encode_h265 ===\n  struct VideoEncodeH265CapabilitiesKHR;\n  struct VideoEncodeH265SessionCreateInfoKHR;\n  struct VideoEncodeH265QualityLevelPropertiesKHR;\n  struct VideoEncodeH265SessionParametersCreateInfoKHR;\n  struct VideoEncodeH265SessionParametersAddInfoKHR;\n  struct VideoEncodeH265SessionParametersGetInfoKHR;\n  struct VideoEncodeH265SessionParametersFeedbackInfoKHR;\n  struct VideoEncodeH265PictureInfoKHR;\n  struct VideoEncodeH265DpbSlotInfoKHR;\n  struct VideoEncodeH265NaluSliceSegmentInfoKHR;\n  struct VideoEncodeH265ProfileInfoKHR;\n  struct VideoEncodeH265RateControlInfoKHR;\n  struct VideoEncodeH265RateControlLayerInfoKHR;\n  struct VideoEncodeH265QpKHR;\n  struct VideoEncodeH265FrameSizeKHR;\n  struct VideoEncodeH265GopRemainingFrameInfoKHR;\n\n  //=== VK_KHR_video_decode_h264 ===\n  struct VideoDecodeH264ProfileInfoKHR;\n  struct VideoDecodeH264CapabilitiesKHR;\n  struct VideoDecodeH264SessionParametersCreateInfoKHR;\n  struct VideoDecodeH264SessionParametersAddInfoKHR;\n  struct VideoDecodeH264PictureInfoKHR;\n  struct VideoDecodeH264DpbSlotInfoKHR;\n\n  //=== VK_AMD_texture_gather_bias_lod ===\n  struct TextureLODGatherFormatPropertiesAMD;\n\n  //=== VK_AMD_shader_info ===\n  struct ShaderResourceUsageAMD;\n  struct ShaderStatisticsInfoAMD;\n\n#if defined( VK_USE_PLATFORM_GGP )\n  //=== VK_GGP_stream_descriptor_surface ===\n  struct StreamDescriptorSurfaceCreateInfoGGP;\n#endif /*VK_USE_PLATFORM_GGP*/\n\n  //=== VK_NV_corner_sampled_image ===\n  struct PhysicalDeviceCornerSampledImageFeaturesNV;\n\n  //=== VK_NV_external_memory_capabilities ===\n  struct ExternalImageFormatPropertiesNV;\n\n  //=== VK_NV_external_memory ===\n  struct ExternalMemoryImageCreateInfoNV;\n  struct ExportMemoryAllocateInfoNV;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_NV_external_memory_win32 ===\n  struct ImportMemoryWin32HandleInfoNV;\n  struct ExportMemoryWin32HandleInfoNV;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_NV_win32_keyed_mutex ===\n  struct Win32KeyedMutexAcquireReleaseInfoNV;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_EXT_validation_flags ===\n  struct ValidationFlagsEXT;\n\n#if defined( VK_USE_PLATFORM_VI_NN )\n  //=== VK_NN_vi_surface ===\n  struct ViSurfaceCreateInfoNN;\n#endif /*VK_USE_PLATFORM_VI_NN*/\n\n  //=== VK_EXT_astc_decode_mode ===\n  struct ImageViewASTCDecodeModeEXT;\n  struct PhysicalDeviceASTCDecodeFeaturesEXT;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_KHR_external_memory_win32 ===\n  struct ImportMemoryWin32HandleInfoKHR;\n  struct ExportMemoryWin32HandleInfoKHR;\n  struct MemoryWin32HandlePropertiesKHR;\n  struct MemoryGetWin32HandleInfoKHR;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_KHR_external_memory_fd ===\n  struct ImportMemoryFdInfoKHR;\n  struct MemoryFdPropertiesKHR;\n  struct MemoryGetFdInfoKHR;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_KHR_win32_keyed_mutex ===\n  struct Win32KeyedMutexAcquireReleaseInfoKHR;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_KHR_external_semaphore_win32 ===\n  struct ImportSemaphoreWin32HandleInfoKHR;\n  struct ExportSemaphoreWin32HandleInfoKHR;\n  struct D3D12FenceSubmitInfoKHR;\n  struct SemaphoreGetWin32HandleInfoKHR;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_KHR_external_semaphore_fd ===\n  struct ImportSemaphoreFdInfoKHR;\n  struct SemaphoreGetFdInfoKHR;\n\n  //=== VK_EXT_conditional_rendering ===\n  struct ConditionalRenderingBeginInfoEXT;\n  struct PhysicalDeviceConditionalRenderingFeaturesEXT;\n  struct CommandBufferInheritanceConditionalRenderingInfoEXT;\n\n  //=== VK_KHR_incremental_present ===\n  struct PresentRegionsKHR;\n  struct PresentRegionKHR;\n  struct RectLayerKHR;\n\n  //=== VK_NV_clip_space_w_scaling ===\n  struct ViewportWScalingNV;\n  struct PipelineViewportWScalingStateCreateInfoNV;\n\n  //=== VK_EXT_display_surface_counter ===\n  struct SurfaceCapabilities2EXT;\n\n  //=== VK_EXT_display_control ===\n  struct DisplayPowerInfoEXT;\n  struct DeviceEventInfoEXT;\n  struct DisplayEventInfoEXT;\n  struct SwapchainCounterCreateInfoEXT;\n\n  //=== VK_GOOGLE_display_timing ===\n  struct RefreshCycleDurationGOOGLE;\n  struct PastPresentationTimingGOOGLE;\n  struct PresentTimesInfoGOOGLE;\n  struct PresentTimeGOOGLE;\n\n  //=== VK_NVX_multiview_per_view_attributes ===\n  struct PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX;\n  struct MultiviewPerViewAttributesInfoNVX;\n\n  //=== VK_NV_viewport_swizzle ===\n  struct ViewportSwizzleNV;\n  struct PipelineViewportSwizzleStateCreateInfoNV;\n\n  //=== VK_EXT_discard_rectangles ===\n  struct PhysicalDeviceDiscardRectanglePropertiesEXT;\n  struct PipelineDiscardRectangleStateCreateInfoEXT;\n\n  //=== VK_EXT_conservative_rasterization ===\n  struct PhysicalDeviceConservativeRasterizationPropertiesEXT;\n  struct PipelineRasterizationConservativeStateCreateInfoEXT;\n\n  //=== VK_EXT_depth_clip_enable ===\n  struct PhysicalDeviceDepthClipEnableFeaturesEXT;\n  struct PipelineRasterizationDepthClipStateCreateInfoEXT;\n\n  //=== VK_EXT_hdr_metadata ===\n  struct HdrMetadataEXT;\n  struct XYColorEXT;\n\n  //=== VK_IMG_relaxed_line_rasterization ===\n  struct PhysicalDeviceRelaxedLineRasterizationFeaturesIMG;\n\n  //=== VK_KHR_shared_presentable_image ===\n  struct SharedPresentSurfaceCapabilitiesKHR;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_KHR_external_fence_win32 ===\n  struct ImportFenceWin32HandleInfoKHR;\n  struct ExportFenceWin32HandleInfoKHR;\n  struct FenceGetWin32HandleInfoKHR;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_KHR_external_fence_fd ===\n  struct ImportFenceFdInfoKHR;\n  struct FenceGetFdInfoKHR;\n\n  //=== VK_KHR_performance_query ===\n  struct PhysicalDevicePerformanceQueryFeaturesKHR;\n  struct PhysicalDevicePerformanceQueryPropertiesKHR;\n  struct PerformanceCounterKHR;\n  struct PerformanceCounterDescriptionKHR;\n  struct QueryPoolPerformanceCreateInfoKHR;\n  union PerformanceCounterResultKHR;\n  struct AcquireProfilingLockInfoKHR;\n  struct PerformanceQuerySubmitInfoKHR;\n\n  //=== VK_KHR_get_surface_capabilities2 ===\n  struct PhysicalDeviceSurfaceInfo2KHR;\n  struct SurfaceCapabilities2KHR;\n  struct SurfaceFormat2KHR;\n\n  //=== VK_KHR_get_display_properties2 ===\n  struct DisplayProperties2KHR;\n  struct DisplayPlaneProperties2KHR;\n  struct DisplayModeProperties2KHR;\n  struct DisplayPlaneInfo2KHR;\n  struct DisplayPlaneCapabilities2KHR;\n\n#if defined( VK_USE_PLATFORM_IOS_MVK )\n  //=== VK_MVK_ios_surface ===\n  struct IOSSurfaceCreateInfoMVK;\n#endif /*VK_USE_PLATFORM_IOS_MVK*/\n\n#if defined( VK_USE_PLATFORM_MACOS_MVK )\n  //=== VK_MVK_macos_surface ===\n  struct MacOSSurfaceCreateInfoMVK;\n#endif /*VK_USE_PLATFORM_MACOS_MVK*/\n\n  //=== VK_EXT_debug_utils ===\n  struct DebugUtilsLabelEXT;\n  struct DebugUtilsMessengerCallbackDataEXT;\n  struct DebugUtilsMessengerCreateInfoEXT;\n  struct DebugUtilsObjectNameInfoEXT;\n  struct DebugUtilsObjectTagInfoEXT;\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  //=== VK_ANDROID_external_memory_android_hardware_buffer ===\n  struct AndroidHardwareBufferUsageANDROID;\n  struct AndroidHardwareBufferPropertiesANDROID;\n  struct AndroidHardwareBufferFormatPropertiesANDROID;\n  struct ImportAndroidHardwareBufferInfoANDROID;\n  struct MemoryGetAndroidHardwareBufferInfoANDROID;\n  struct ExternalFormatANDROID;\n  struct AndroidHardwareBufferFormatProperties2ANDROID;\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  //=== VK_AMDX_shader_enqueue ===\n  struct PhysicalDeviceShaderEnqueueFeaturesAMDX;\n  struct PhysicalDeviceShaderEnqueuePropertiesAMDX;\n  struct ExecutionGraphPipelineScratchSizeAMDX;\n  struct ExecutionGraphPipelineCreateInfoAMDX;\n  struct DispatchGraphInfoAMDX;\n  struct DispatchGraphCountInfoAMDX;\n  struct PipelineShaderStageNodeCreateInfoAMDX;\n  union DeviceOrHostAddressConstAMDX;\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  //=== VK_AMD_mixed_attachment_samples ===\n  struct AttachmentSampleCountInfoAMD;\n  using AttachmentSampleCountInfoNV = AttachmentSampleCountInfoAMD;\n\n  //=== VK_EXT_sample_locations ===\n  struct SampleLocationEXT;\n  struct SampleLocationsInfoEXT;\n  struct AttachmentSampleLocationsEXT;\n  struct SubpassSampleLocationsEXT;\n  struct RenderPassSampleLocationsBeginInfoEXT;\n  struct PipelineSampleLocationsStateCreateInfoEXT;\n  struct PhysicalDeviceSampleLocationsPropertiesEXT;\n  struct MultisamplePropertiesEXT;\n\n  //=== VK_EXT_blend_operation_advanced ===\n  struct PhysicalDeviceBlendOperationAdvancedFeaturesEXT;\n  struct PhysicalDeviceBlendOperationAdvancedPropertiesEXT;\n  struct PipelineColorBlendAdvancedStateCreateInfoEXT;\n\n  //=== VK_NV_fragment_coverage_to_color ===\n  struct PipelineCoverageToColorStateCreateInfoNV;\n\n  //=== VK_KHR_acceleration_structure ===\n  union DeviceOrHostAddressKHR;\n  union DeviceOrHostAddressConstKHR;\n  struct AccelerationStructureBuildRangeInfoKHR;\n  struct AabbPositionsKHR;\n  using AabbPositionsNV = AabbPositionsKHR;\n  struct AccelerationStructureGeometryTrianglesDataKHR;\n  struct TransformMatrixKHR;\n  using TransformMatrixNV = TransformMatrixKHR;\n  struct AccelerationStructureBuildGeometryInfoKHR;\n  struct AccelerationStructureGeometryAabbsDataKHR;\n  struct AccelerationStructureInstanceKHR;\n  using AccelerationStructureInstanceNV = AccelerationStructureInstanceKHR;\n  struct AccelerationStructureGeometryInstancesDataKHR;\n  union AccelerationStructureGeometryDataKHR;\n  struct AccelerationStructureGeometryKHR;\n  struct AccelerationStructureCreateInfoKHR;\n  struct WriteDescriptorSetAccelerationStructureKHR;\n  struct PhysicalDeviceAccelerationStructureFeaturesKHR;\n  struct PhysicalDeviceAccelerationStructurePropertiesKHR;\n  struct AccelerationStructureDeviceAddressInfoKHR;\n  struct AccelerationStructureVersionInfoKHR;\n  struct CopyAccelerationStructureToMemoryInfoKHR;\n  struct CopyMemoryToAccelerationStructureInfoKHR;\n  struct CopyAccelerationStructureInfoKHR;\n  struct AccelerationStructureBuildSizesInfoKHR;\n\n  //=== VK_KHR_ray_tracing_pipeline ===\n  struct RayTracingShaderGroupCreateInfoKHR;\n  struct RayTracingPipelineCreateInfoKHR;\n  struct PhysicalDeviceRayTracingPipelineFeaturesKHR;\n  struct PhysicalDeviceRayTracingPipelinePropertiesKHR;\n  struct StridedDeviceAddressRegionKHR;\n  struct TraceRaysIndirectCommandKHR;\n  struct RayTracingPipelineInterfaceCreateInfoKHR;\n\n  //=== VK_KHR_ray_query ===\n  struct PhysicalDeviceRayQueryFeaturesKHR;\n\n  //=== VK_NV_framebuffer_mixed_samples ===\n  struct PipelineCoverageModulationStateCreateInfoNV;\n\n  //=== VK_NV_shader_sm_builtins ===\n  struct PhysicalDeviceShaderSMBuiltinsPropertiesNV;\n  struct PhysicalDeviceShaderSMBuiltinsFeaturesNV;\n\n  //=== VK_EXT_image_drm_format_modifier ===\n  struct DrmFormatModifierPropertiesListEXT;\n  struct DrmFormatModifierPropertiesEXT;\n  struct PhysicalDeviceImageDrmFormatModifierInfoEXT;\n  struct ImageDrmFormatModifierListCreateInfoEXT;\n  struct ImageDrmFormatModifierExplicitCreateInfoEXT;\n  struct ImageDrmFormatModifierPropertiesEXT;\n  struct DrmFormatModifierPropertiesList2EXT;\n  struct DrmFormatModifierProperties2EXT;\n\n  //=== VK_EXT_validation_cache ===\n  struct ValidationCacheCreateInfoEXT;\n  struct ShaderModuleValidationCacheCreateInfoEXT;\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  //=== VK_KHR_portability_subset ===\n  struct PhysicalDevicePortabilitySubsetFeaturesKHR;\n  struct PhysicalDevicePortabilitySubsetPropertiesKHR;\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  //=== VK_NV_shading_rate_image ===\n  struct ShadingRatePaletteNV;\n  struct PipelineViewportShadingRateImageStateCreateInfoNV;\n  struct PhysicalDeviceShadingRateImageFeaturesNV;\n  struct PhysicalDeviceShadingRateImagePropertiesNV;\n  struct CoarseSampleLocationNV;\n  struct CoarseSampleOrderCustomNV;\n  struct PipelineViewportCoarseSampleOrderStateCreateInfoNV;\n\n  //=== VK_NV_ray_tracing ===\n  struct RayTracingShaderGroupCreateInfoNV;\n  struct RayTracingPipelineCreateInfoNV;\n  struct GeometryTrianglesNV;\n  struct GeometryAABBNV;\n  struct GeometryDataNV;\n  struct GeometryNV;\n  struct AccelerationStructureInfoNV;\n  struct AccelerationStructureCreateInfoNV;\n  struct BindAccelerationStructureMemoryInfoNV;\n  struct WriteDescriptorSetAccelerationStructureNV;\n  struct AccelerationStructureMemoryRequirementsInfoNV;\n  struct PhysicalDeviceRayTracingPropertiesNV;\n\n  //=== VK_NV_representative_fragment_test ===\n  struct PhysicalDeviceRepresentativeFragmentTestFeaturesNV;\n  struct PipelineRepresentativeFragmentTestStateCreateInfoNV;\n\n  //=== VK_EXT_filter_cubic ===\n  struct PhysicalDeviceImageViewImageFormatInfoEXT;\n  struct FilterCubicImageViewImageFormatPropertiesEXT;\n\n  //=== VK_EXT_external_memory_host ===\n  struct ImportMemoryHostPointerInfoEXT;\n  struct MemoryHostPointerPropertiesEXT;\n  struct PhysicalDeviceExternalMemoryHostPropertiesEXT;\n\n  //=== VK_KHR_shader_clock ===\n  struct PhysicalDeviceShaderClockFeaturesKHR;\n\n  //=== VK_AMD_pipeline_compiler_control ===\n  struct PipelineCompilerControlCreateInfoAMD;\n\n  //=== VK_AMD_shader_core_properties ===\n  struct PhysicalDeviceShaderCorePropertiesAMD;\n\n  //=== VK_KHR_video_decode_h265 ===\n  struct VideoDecodeH265ProfileInfoKHR;\n  struct VideoDecodeH265CapabilitiesKHR;\n  struct VideoDecodeH265SessionParametersCreateInfoKHR;\n  struct VideoDecodeH265SessionParametersAddInfoKHR;\n  struct VideoDecodeH265PictureInfoKHR;\n  struct VideoDecodeH265DpbSlotInfoKHR;\n\n  //=== VK_AMD_memory_overallocation_behavior ===\n  struct DeviceMemoryOverallocationCreateInfoAMD;\n\n  //=== VK_EXT_vertex_attribute_divisor ===\n  struct PhysicalDeviceVertexAttributeDivisorPropertiesEXT;\n\n#if defined( VK_USE_PLATFORM_GGP )\n  //=== VK_GGP_frame_token ===\n  struct PresentFrameTokenGGP;\n#endif /*VK_USE_PLATFORM_GGP*/\n\n  //=== VK_NV_mesh_shader ===\n  struct PhysicalDeviceMeshShaderFeaturesNV;\n  struct PhysicalDeviceMeshShaderPropertiesNV;\n  struct DrawMeshTasksIndirectCommandNV;\n\n  //=== VK_NV_shader_image_footprint ===\n  struct PhysicalDeviceShaderImageFootprintFeaturesNV;\n\n  //=== VK_NV_scissor_exclusive ===\n  struct PipelineViewportExclusiveScissorStateCreateInfoNV;\n  struct PhysicalDeviceExclusiveScissorFeaturesNV;\n\n  //=== VK_NV_device_diagnostic_checkpoints ===\n  struct QueueFamilyCheckpointPropertiesNV;\n  struct CheckpointDataNV;\n  struct QueueFamilyCheckpointProperties2NV;\n  struct CheckpointData2NV;\n\n  //=== VK_INTEL_shader_integer_functions2 ===\n  struct PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL;\n\n  //=== VK_INTEL_performance_query ===\n  union PerformanceValueDataINTEL;\n  struct PerformanceValueINTEL;\n  struct InitializePerformanceApiInfoINTEL;\n  struct QueryPoolPerformanceQueryCreateInfoINTEL;\n  using QueryPoolCreateInfoINTEL = QueryPoolPerformanceQueryCreateInfoINTEL;\n  struct PerformanceMarkerInfoINTEL;\n  struct PerformanceStreamMarkerInfoINTEL;\n  struct PerformanceOverrideInfoINTEL;\n  struct PerformanceConfigurationAcquireInfoINTEL;\n\n  //=== VK_EXT_pci_bus_info ===\n  struct PhysicalDevicePCIBusInfoPropertiesEXT;\n\n  //=== VK_AMD_display_native_hdr ===\n  struct DisplayNativeHdrSurfaceCapabilitiesAMD;\n  struct SwapchainDisplayNativeHdrCreateInfoAMD;\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_imagepipe_surface ===\n  struct ImagePipeSurfaceCreateInfoFUCHSIA;\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  //=== VK_EXT_metal_surface ===\n  struct MetalSurfaceCreateInfoEXT;\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n  //=== VK_EXT_fragment_density_map ===\n  struct PhysicalDeviceFragmentDensityMapFeaturesEXT;\n  struct PhysicalDeviceFragmentDensityMapPropertiesEXT;\n  struct RenderPassFragmentDensityMapCreateInfoEXT;\n  struct RenderingFragmentDensityMapAttachmentInfoEXT;\n\n  //=== VK_KHR_fragment_shading_rate ===\n  struct FragmentShadingRateAttachmentInfoKHR;\n  struct PipelineFragmentShadingRateStateCreateInfoKHR;\n  struct PhysicalDeviceFragmentShadingRateFeaturesKHR;\n  struct PhysicalDeviceFragmentShadingRatePropertiesKHR;\n  struct PhysicalDeviceFragmentShadingRateKHR;\n  struct RenderingFragmentShadingRateAttachmentInfoKHR;\n\n  //=== VK_AMD_shader_core_properties2 ===\n  struct PhysicalDeviceShaderCoreProperties2AMD;\n\n  //=== VK_AMD_device_coherent_memory ===\n  struct PhysicalDeviceCoherentMemoryFeaturesAMD;\n\n  //=== VK_EXT_shader_image_atomic_int64 ===\n  struct PhysicalDeviceShaderImageAtomicInt64FeaturesEXT;\n\n  //=== VK_KHR_shader_quad_control ===\n  struct PhysicalDeviceShaderQuadControlFeaturesKHR;\n\n  //=== VK_EXT_memory_budget ===\n  struct PhysicalDeviceMemoryBudgetPropertiesEXT;\n\n  //=== VK_EXT_memory_priority ===\n  struct PhysicalDeviceMemoryPriorityFeaturesEXT;\n  struct MemoryPriorityAllocateInfoEXT;\n\n  //=== VK_KHR_surface_protected_capabilities ===\n  struct SurfaceProtectedCapabilitiesKHR;\n\n  //=== VK_NV_dedicated_allocation_image_aliasing ===\n  struct PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV;\n\n  //=== VK_EXT_buffer_device_address ===\n  struct PhysicalDeviceBufferDeviceAddressFeaturesEXT;\n  using PhysicalDeviceBufferAddressFeaturesEXT = PhysicalDeviceBufferDeviceAddressFeaturesEXT;\n  struct BufferDeviceAddressCreateInfoEXT;\n\n  //=== VK_EXT_validation_features ===\n  struct ValidationFeaturesEXT;\n\n  //=== VK_KHR_present_wait ===\n  struct PhysicalDevicePresentWaitFeaturesKHR;\n\n  //=== VK_NV_cooperative_matrix ===\n  struct CooperativeMatrixPropertiesNV;\n  struct PhysicalDeviceCooperativeMatrixFeaturesNV;\n  struct PhysicalDeviceCooperativeMatrixPropertiesNV;\n\n  //=== VK_NV_coverage_reduction_mode ===\n  struct PhysicalDeviceCoverageReductionModeFeaturesNV;\n  struct PipelineCoverageReductionStateCreateInfoNV;\n  struct FramebufferMixedSamplesCombinationNV;\n\n  //=== VK_EXT_fragment_shader_interlock ===\n  struct PhysicalDeviceFragmentShaderInterlockFeaturesEXT;\n\n  //=== VK_EXT_ycbcr_image_arrays ===\n  struct PhysicalDeviceYcbcrImageArraysFeaturesEXT;\n\n  //=== VK_EXT_provoking_vertex ===\n  struct PhysicalDeviceProvokingVertexFeaturesEXT;\n  struct PhysicalDeviceProvokingVertexPropertiesEXT;\n  struct PipelineRasterizationProvokingVertexStateCreateInfoEXT;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_EXT_full_screen_exclusive ===\n  struct SurfaceFullScreenExclusiveInfoEXT;\n  struct SurfaceCapabilitiesFullScreenExclusiveEXT;\n  struct SurfaceFullScreenExclusiveWin32InfoEXT;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_EXT_headless_surface ===\n  struct HeadlessSurfaceCreateInfoEXT;\n\n  //=== VK_EXT_shader_atomic_float ===\n  struct PhysicalDeviceShaderAtomicFloatFeaturesEXT;\n\n  //=== VK_EXT_extended_dynamic_state ===\n  struct PhysicalDeviceExtendedDynamicStateFeaturesEXT;\n\n  //=== VK_KHR_pipeline_executable_properties ===\n  struct PhysicalDevicePipelineExecutablePropertiesFeaturesKHR;\n  struct PipelineInfoKHR;\n  using PipelineInfoEXT = PipelineInfoKHR;\n  struct PipelineExecutablePropertiesKHR;\n  struct PipelineExecutableInfoKHR;\n  union PipelineExecutableStatisticValueKHR;\n  struct PipelineExecutableStatisticKHR;\n  struct PipelineExecutableInternalRepresentationKHR;\n\n  //=== VK_EXT_map_memory_placed ===\n  struct PhysicalDeviceMapMemoryPlacedFeaturesEXT;\n  struct PhysicalDeviceMapMemoryPlacedPropertiesEXT;\n  struct MemoryMapPlacedInfoEXT;\n\n  //=== VK_EXT_shader_atomic_float2 ===\n  struct PhysicalDeviceShaderAtomicFloat2FeaturesEXT;\n\n  //=== VK_EXT_surface_maintenance1 ===\n  struct SurfacePresentModeEXT;\n  struct SurfacePresentScalingCapabilitiesEXT;\n  struct SurfacePresentModeCompatibilityEXT;\n\n  //=== VK_EXT_swapchain_maintenance1 ===\n  struct PhysicalDeviceSwapchainMaintenance1FeaturesEXT;\n  struct SwapchainPresentFenceInfoEXT;\n  struct SwapchainPresentModesCreateInfoEXT;\n  struct SwapchainPresentModeInfoEXT;\n  struct SwapchainPresentScalingCreateInfoEXT;\n  struct ReleaseSwapchainImagesInfoEXT;\n\n  //=== VK_NV_device_generated_commands ===\n  struct PhysicalDeviceDeviceGeneratedCommandsPropertiesNV;\n  struct PhysicalDeviceDeviceGeneratedCommandsFeaturesNV;\n  struct GraphicsShaderGroupCreateInfoNV;\n  struct GraphicsPipelineShaderGroupsCreateInfoNV;\n  struct BindShaderGroupIndirectCommandNV;\n  struct BindIndexBufferIndirectCommandNV;\n  struct BindVertexBufferIndirectCommandNV;\n  struct SetStateFlagsIndirectCommandNV;\n  struct IndirectCommandsStreamNV;\n  struct IndirectCommandsLayoutTokenNV;\n  struct IndirectCommandsLayoutCreateInfoNV;\n  struct GeneratedCommandsInfoNV;\n  struct GeneratedCommandsMemoryRequirementsInfoNV;\n\n  //=== VK_NV_inherited_viewport_scissor ===\n  struct PhysicalDeviceInheritedViewportScissorFeaturesNV;\n  struct CommandBufferInheritanceViewportScissorInfoNV;\n\n  //=== VK_EXT_texel_buffer_alignment ===\n  struct PhysicalDeviceTexelBufferAlignmentFeaturesEXT;\n\n  //=== VK_QCOM_render_pass_transform ===\n  struct RenderPassTransformBeginInfoQCOM;\n  struct CommandBufferInheritanceRenderPassTransformInfoQCOM;\n\n  //=== VK_EXT_depth_bias_control ===\n  struct PhysicalDeviceDepthBiasControlFeaturesEXT;\n  struct DepthBiasInfoEXT;\n  struct DepthBiasRepresentationInfoEXT;\n\n  //=== VK_EXT_device_memory_report ===\n  struct PhysicalDeviceDeviceMemoryReportFeaturesEXT;\n  struct DeviceDeviceMemoryReportCreateInfoEXT;\n  struct DeviceMemoryReportCallbackDataEXT;\n\n  //=== VK_EXT_robustness2 ===\n  struct PhysicalDeviceRobustness2FeaturesEXT;\n  struct PhysicalDeviceRobustness2PropertiesEXT;\n\n  //=== VK_EXT_custom_border_color ===\n  struct SamplerCustomBorderColorCreateInfoEXT;\n  struct PhysicalDeviceCustomBorderColorPropertiesEXT;\n  struct PhysicalDeviceCustomBorderColorFeaturesEXT;\n\n  //=== VK_KHR_pipeline_library ===\n  struct PipelineLibraryCreateInfoKHR;\n\n  //=== VK_NV_present_barrier ===\n  struct PhysicalDevicePresentBarrierFeaturesNV;\n  struct SurfaceCapabilitiesPresentBarrierNV;\n  struct SwapchainPresentBarrierCreateInfoNV;\n\n  //=== VK_KHR_present_id ===\n  struct PresentIdKHR;\n  struct PhysicalDevicePresentIdFeaturesKHR;\n\n  //=== VK_KHR_video_encode_queue ===\n  struct VideoEncodeInfoKHR;\n  struct VideoEncodeCapabilitiesKHR;\n  struct QueryPoolVideoEncodeFeedbackCreateInfoKHR;\n  struct VideoEncodeUsageInfoKHR;\n  struct VideoEncodeRateControlInfoKHR;\n  struct VideoEncodeRateControlLayerInfoKHR;\n  struct PhysicalDeviceVideoEncodeQualityLevelInfoKHR;\n  struct VideoEncodeQualityLevelPropertiesKHR;\n  struct VideoEncodeQualityLevelInfoKHR;\n  struct VideoEncodeSessionParametersGetInfoKHR;\n  struct VideoEncodeSessionParametersFeedbackInfoKHR;\n\n  //=== VK_NV_device_diagnostics_config ===\n  struct PhysicalDeviceDiagnosticsConfigFeaturesNV;\n  struct DeviceDiagnosticsConfigCreateInfoNV;\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  //=== VK_NV_cuda_kernel_launch ===\n  struct CudaModuleCreateInfoNV;\n  struct CudaFunctionCreateInfoNV;\n  struct CudaLaunchInfoNV;\n  struct PhysicalDeviceCudaKernelLaunchFeaturesNV;\n  struct PhysicalDeviceCudaKernelLaunchPropertiesNV;\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  //=== VK_NV_low_latency ===\n  struct QueryLowLatencySupportNV;\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  //=== VK_EXT_metal_objects ===\n  struct ExportMetalObjectCreateInfoEXT;\n  struct ExportMetalObjectsInfoEXT;\n  struct ExportMetalDeviceInfoEXT;\n  struct ExportMetalCommandQueueInfoEXT;\n  struct ExportMetalBufferInfoEXT;\n  struct ImportMetalBufferInfoEXT;\n  struct ExportMetalTextureInfoEXT;\n  struct ImportMetalTextureInfoEXT;\n  struct ExportMetalIOSurfaceInfoEXT;\n  struct ImportMetalIOSurfaceInfoEXT;\n  struct ExportMetalSharedEventInfoEXT;\n  struct ImportMetalSharedEventInfoEXT;\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n  //=== VK_EXT_descriptor_buffer ===\n  struct PhysicalDeviceDescriptorBufferPropertiesEXT;\n  struct PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT;\n  struct PhysicalDeviceDescriptorBufferFeaturesEXT;\n  struct DescriptorAddressInfoEXT;\n  struct DescriptorBufferBindingInfoEXT;\n  struct DescriptorBufferBindingPushDescriptorBufferHandleEXT;\n  union DescriptorDataEXT;\n  struct DescriptorGetInfoEXT;\n  struct BufferCaptureDescriptorDataInfoEXT;\n  struct ImageCaptureDescriptorDataInfoEXT;\n  struct ImageViewCaptureDescriptorDataInfoEXT;\n  struct SamplerCaptureDescriptorDataInfoEXT;\n  struct OpaqueCaptureDescriptorDataCreateInfoEXT;\n  struct AccelerationStructureCaptureDescriptorDataInfoEXT;\n\n  //=== VK_EXT_graphics_pipeline_library ===\n  struct PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT;\n  struct PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT;\n  struct GraphicsPipelineLibraryCreateInfoEXT;\n\n  //=== VK_AMD_shader_early_and_late_fragment_tests ===\n  struct PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD;\n\n  //=== VK_KHR_fragment_shader_barycentric ===\n  struct PhysicalDeviceFragmentShaderBarycentricFeaturesKHR;\n  using PhysicalDeviceFragmentShaderBarycentricFeaturesNV = PhysicalDeviceFragmentShaderBarycentricFeaturesKHR;\n  struct PhysicalDeviceFragmentShaderBarycentricPropertiesKHR;\n\n  //=== VK_KHR_shader_subgroup_uniform_control_flow ===\n  struct PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR;\n\n  //=== VK_NV_fragment_shading_rate_enums ===\n  struct PhysicalDeviceFragmentShadingRateEnumsFeaturesNV;\n  struct PhysicalDeviceFragmentShadingRateEnumsPropertiesNV;\n  struct PipelineFragmentShadingRateEnumStateCreateInfoNV;\n\n  //=== VK_NV_ray_tracing_motion_blur ===\n  struct AccelerationStructureGeometryMotionTrianglesDataNV;\n  struct AccelerationStructureMotionInfoNV;\n  struct AccelerationStructureMotionInstanceNV;\n  union AccelerationStructureMotionInstanceDataNV;\n  struct AccelerationStructureMatrixMotionInstanceNV;\n  struct AccelerationStructureSRTMotionInstanceNV;\n  struct SRTDataNV;\n  struct PhysicalDeviceRayTracingMotionBlurFeaturesNV;\n\n  //=== VK_EXT_mesh_shader ===\n  struct PhysicalDeviceMeshShaderFeaturesEXT;\n  struct PhysicalDeviceMeshShaderPropertiesEXT;\n  struct DrawMeshTasksIndirectCommandEXT;\n\n  //=== VK_EXT_ycbcr_2plane_444_formats ===\n  struct PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT;\n\n  //=== VK_EXT_fragment_density_map2 ===\n  struct PhysicalDeviceFragmentDensityMap2FeaturesEXT;\n  struct PhysicalDeviceFragmentDensityMap2PropertiesEXT;\n\n  //=== VK_QCOM_rotated_copy_commands ===\n  struct CopyCommandTransformInfoQCOM;\n\n  //=== VK_KHR_workgroup_memory_explicit_layout ===\n  struct PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR;\n\n  //=== VK_EXT_image_compression_control ===\n  struct PhysicalDeviceImageCompressionControlFeaturesEXT;\n  struct ImageCompressionControlEXT;\n  struct ImageCompressionPropertiesEXT;\n\n  //=== VK_EXT_attachment_feedback_loop_layout ===\n  struct PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT;\n\n  //=== VK_EXT_4444_formats ===\n  struct PhysicalDevice4444FormatsFeaturesEXT;\n\n  //=== VK_EXT_device_fault ===\n  struct PhysicalDeviceFaultFeaturesEXT;\n  struct DeviceFaultCountsEXT;\n  struct DeviceFaultInfoEXT;\n  struct DeviceFaultAddressInfoEXT;\n  struct DeviceFaultVendorInfoEXT;\n  struct DeviceFaultVendorBinaryHeaderVersionOneEXT;\n\n  //=== VK_EXT_rgba10x6_formats ===\n  struct PhysicalDeviceRGBA10X6FormatsFeaturesEXT;\n\n#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n  //=== VK_EXT_directfb_surface ===\n  struct DirectFBSurfaceCreateInfoEXT;\n#endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n\n  //=== VK_EXT_vertex_input_dynamic_state ===\n  struct PhysicalDeviceVertexInputDynamicStateFeaturesEXT;\n  struct VertexInputBindingDescription2EXT;\n  struct VertexInputAttributeDescription2EXT;\n\n  //=== VK_EXT_physical_device_drm ===\n  struct PhysicalDeviceDrmPropertiesEXT;\n\n  //=== VK_EXT_device_address_binding_report ===\n  struct PhysicalDeviceAddressBindingReportFeaturesEXT;\n  struct DeviceAddressBindingCallbackDataEXT;\n\n  //=== VK_EXT_depth_clip_control ===\n  struct PhysicalDeviceDepthClipControlFeaturesEXT;\n  struct PipelineViewportDepthClipControlCreateInfoEXT;\n\n  //=== VK_EXT_primitive_topology_list_restart ===\n  struct PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT;\n\n  //=== VK_EXT_present_mode_fifo_latest_ready ===\n  struct PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT;\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_external_memory ===\n  struct ImportMemoryZirconHandleInfoFUCHSIA;\n  struct MemoryZirconHandlePropertiesFUCHSIA;\n  struct MemoryGetZirconHandleInfoFUCHSIA;\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_external_semaphore ===\n  struct ImportSemaphoreZirconHandleInfoFUCHSIA;\n  struct SemaphoreGetZirconHandleInfoFUCHSIA;\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_buffer_collection ===\n  struct BufferCollectionCreateInfoFUCHSIA;\n  struct ImportMemoryBufferCollectionFUCHSIA;\n  struct BufferCollectionImageCreateInfoFUCHSIA;\n  struct BufferConstraintsInfoFUCHSIA;\n  struct BufferCollectionBufferCreateInfoFUCHSIA;\n  struct BufferCollectionPropertiesFUCHSIA;\n  struct SysmemColorSpaceFUCHSIA;\n  struct ImageConstraintsInfoFUCHSIA;\n  struct ImageFormatConstraintsInfoFUCHSIA;\n  struct BufferCollectionConstraintsInfoFUCHSIA;\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  //=== VK_HUAWEI_subpass_shading ===\n  struct SubpassShadingPipelineCreateInfoHUAWEI;\n  struct PhysicalDeviceSubpassShadingFeaturesHUAWEI;\n  struct PhysicalDeviceSubpassShadingPropertiesHUAWEI;\n\n  //=== VK_HUAWEI_invocation_mask ===\n  struct PhysicalDeviceInvocationMaskFeaturesHUAWEI;\n\n  //=== VK_NV_external_memory_rdma ===\n  struct MemoryGetRemoteAddressInfoNV;\n  struct PhysicalDeviceExternalMemoryRDMAFeaturesNV;\n\n  //=== VK_EXT_pipeline_properties ===\n  struct PipelinePropertiesIdentifierEXT;\n  struct PhysicalDevicePipelinePropertiesFeaturesEXT;\n\n  //=== VK_EXT_frame_boundary ===\n  struct PhysicalDeviceFrameBoundaryFeaturesEXT;\n  struct FrameBoundaryEXT;\n\n  //=== VK_EXT_multisampled_render_to_single_sampled ===\n  struct PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT;\n  struct SubpassResolvePerformanceQueryEXT;\n  struct MultisampledRenderToSingleSampledInfoEXT;\n\n  //=== VK_EXT_extended_dynamic_state2 ===\n  struct PhysicalDeviceExtendedDynamicState2FeaturesEXT;\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n  //=== VK_QNX_screen_surface ===\n  struct ScreenSurfaceCreateInfoQNX;\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n  //=== VK_EXT_color_write_enable ===\n  struct PhysicalDeviceColorWriteEnableFeaturesEXT;\n  struct PipelineColorWriteCreateInfoEXT;\n\n  //=== VK_EXT_primitives_generated_query ===\n  struct PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT;\n\n  //=== VK_KHR_ray_tracing_maintenance1 ===\n  struct PhysicalDeviceRayTracingMaintenance1FeaturesKHR;\n  struct TraceRaysIndirectCommand2KHR;\n\n  //=== VK_EXT_image_view_min_lod ===\n  struct PhysicalDeviceImageViewMinLodFeaturesEXT;\n  struct ImageViewMinLodCreateInfoEXT;\n\n  //=== VK_EXT_multi_draw ===\n  struct PhysicalDeviceMultiDrawFeaturesEXT;\n  struct PhysicalDeviceMultiDrawPropertiesEXT;\n  struct MultiDrawInfoEXT;\n  struct MultiDrawIndexedInfoEXT;\n\n  //=== VK_EXT_image_2d_view_of_3d ===\n  struct PhysicalDeviceImage2DViewOf3DFeaturesEXT;\n\n  //=== VK_EXT_shader_tile_image ===\n  struct PhysicalDeviceShaderTileImageFeaturesEXT;\n  struct PhysicalDeviceShaderTileImagePropertiesEXT;\n\n  //=== VK_EXT_opacity_micromap ===\n  struct MicromapBuildInfoEXT;\n  struct MicromapUsageEXT;\n  struct MicromapCreateInfoEXT;\n  struct PhysicalDeviceOpacityMicromapFeaturesEXT;\n  struct PhysicalDeviceOpacityMicromapPropertiesEXT;\n  struct MicromapVersionInfoEXT;\n  struct CopyMicromapToMemoryInfoEXT;\n  struct CopyMemoryToMicromapInfoEXT;\n  struct CopyMicromapInfoEXT;\n  struct MicromapBuildSizesInfoEXT;\n  struct AccelerationStructureTrianglesOpacityMicromapEXT;\n  struct MicromapTriangleEXT;\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  //=== VK_NV_displacement_micromap ===\n  struct PhysicalDeviceDisplacementMicromapFeaturesNV;\n  struct PhysicalDeviceDisplacementMicromapPropertiesNV;\n  struct AccelerationStructureTrianglesDisplacementMicromapNV;\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  //=== VK_HUAWEI_cluster_culling_shader ===\n  struct PhysicalDeviceClusterCullingShaderFeaturesHUAWEI;\n  struct PhysicalDeviceClusterCullingShaderPropertiesHUAWEI;\n  struct PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI;\n\n  //=== VK_EXT_border_color_swizzle ===\n  struct PhysicalDeviceBorderColorSwizzleFeaturesEXT;\n  struct SamplerBorderColorComponentMappingCreateInfoEXT;\n\n  //=== VK_EXT_pageable_device_local_memory ===\n  struct PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT;\n\n  //=== VK_ARM_shader_core_properties ===\n  struct PhysicalDeviceShaderCorePropertiesARM;\n\n  //=== VK_ARM_scheduling_controls ===\n  struct DeviceQueueShaderCoreControlCreateInfoARM;\n  struct PhysicalDeviceSchedulingControlsFeaturesARM;\n  struct PhysicalDeviceSchedulingControlsPropertiesARM;\n\n  //=== VK_EXT_image_sliced_view_of_3d ===\n  struct PhysicalDeviceImageSlicedViewOf3DFeaturesEXT;\n  struct ImageViewSlicedCreateInfoEXT;\n\n  //=== VK_VALVE_descriptor_set_host_mapping ===\n  struct PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE;\n  struct DescriptorSetBindingReferenceVALVE;\n  struct DescriptorSetLayoutHostMappingInfoVALVE;\n\n  //=== VK_EXT_non_seamless_cube_map ===\n  struct PhysicalDeviceNonSeamlessCubeMapFeaturesEXT;\n\n  //=== VK_ARM_render_pass_striped ===\n  struct PhysicalDeviceRenderPassStripedFeaturesARM;\n  struct PhysicalDeviceRenderPassStripedPropertiesARM;\n  struct RenderPassStripeBeginInfoARM;\n  struct RenderPassStripeInfoARM;\n  struct RenderPassStripeSubmitInfoARM;\n\n  //=== VK_QCOM_fragment_density_map_offset ===\n  struct PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM;\n  struct PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM;\n  struct SubpassFragmentDensityMapOffsetEndInfoQCOM;\n\n  //=== VK_NV_copy_memory_indirect ===\n  struct CopyMemoryIndirectCommandNV;\n  struct CopyMemoryToImageIndirectCommandNV;\n  struct PhysicalDeviceCopyMemoryIndirectFeaturesNV;\n  struct PhysicalDeviceCopyMemoryIndirectPropertiesNV;\n\n  //=== VK_NV_memory_decompression ===\n  struct DecompressMemoryRegionNV;\n  struct PhysicalDeviceMemoryDecompressionFeaturesNV;\n  struct PhysicalDeviceMemoryDecompressionPropertiesNV;\n\n  //=== VK_NV_device_generated_commands_compute ===\n  struct PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV;\n  struct ComputePipelineIndirectBufferInfoNV;\n  struct PipelineIndirectDeviceAddressInfoNV;\n  struct BindPipelineIndirectCommandNV;\n\n  //=== VK_NV_ray_tracing_linear_swept_spheres ===\n  struct PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV;\n  struct AccelerationStructureGeometryLinearSweptSpheresDataNV;\n  struct AccelerationStructureGeometrySpheresDataNV;\n\n  //=== VK_NV_linear_color_attachment ===\n  struct PhysicalDeviceLinearColorAttachmentFeaturesNV;\n\n  //=== VK_KHR_shader_maximal_reconvergence ===\n  struct PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR;\n\n  //=== VK_EXT_image_compression_control_swapchain ===\n  struct PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT;\n\n  //=== VK_QCOM_image_processing ===\n  struct ImageViewSampleWeightCreateInfoQCOM;\n  struct PhysicalDeviceImageProcessingFeaturesQCOM;\n  struct PhysicalDeviceImageProcessingPropertiesQCOM;\n\n  //=== VK_EXT_nested_command_buffer ===\n  struct PhysicalDeviceNestedCommandBufferFeaturesEXT;\n  struct PhysicalDeviceNestedCommandBufferPropertiesEXT;\n\n  //=== VK_EXT_external_memory_acquire_unmodified ===\n  struct ExternalMemoryAcquireUnmodifiedEXT;\n\n  //=== VK_EXT_extended_dynamic_state3 ===\n  struct PhysicalDeviceExtendedDynamicState3FeaturesEXT;\n  struct PhysicalDeviceExtendedDynamicState3PropertiesEXT;\n  struct ColorBlendEquationEXT;\n  struct ColorBlendAdvancedEXT;\n\n  //=== VK_EXT_subpass_merge_feedback ===\n  struct PhysicalDeviceSubpassMergeFeedbackFeaturesEXT;\n  struct RenderPassCreationControlEXT;\n  struct RenderPassCreationFeedbackInfoEXT;\n  struct RenderPassCreationFeedbackCreateInfoEXT;\n  struct RenderPassSubpassFeedbackInfoEXT;\n  struct RenderPassSubpassFeedbackCreateInfoEXT;\n\n  //=== VK_LUNARG_direct_driver_loading ===\n  struct DirectDriverLoadingInfoLUNARG;\n  struct DirectDriverLoadingListLUNARG;\n\n  //=== VK_EXT_shader_module_identifier ===\n  struct PhysicalDeviceShaderModuleIdentifierFeaturesEXT;\n  struct PhysicalDeviceShaderModuleIdentifierPropertiesEXT;\n  struct PipelineShaderStageModuleIdentifierCreateInfoEXT;\n  struct ShaderModuleIdentifierEXT;\n\n  //=== VK_EXT_rasterization_order_attachment_access ===\n  struct PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT;\n  using PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM = PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT;\n\n  //=== VK_NV_optical_flow ===\n  struct PhysicalDeviceOpticalFlowFeaturesNV;\n  struct PhysicalDeviceOpticalFlowPropertiesNV;\n  struct OpticalFlowImageFormatInfoNV;\n  struct OpticalFlowImageFormatPropertiesNV;\n  struct OpticalFlowSessionCreateInfoNV;\n  struct OpticalFlowSessionCreatePrivateDataInfoNV;\n  struct OpticalFlowExecuteInfoNV;\n\n  //=== VK_EXT_legacy_dithering ===\n  struct PhysicalDeviceLegacyDitheringFeaturesEXT;\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  //=== VK_ANDROID_external_format_resolve ===\n  struct PhysicalDeviceExternalFormatResolveFeaturesANDROID;\n  struct PhysicalDeviceExternalFormatResolvePropertiesANDROID;\n  struct AndroidHardwareBufferFormatResolvePropertiesANDROID;\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n  //=== VK_AMD_anti_lag ===\n  struct PhysicalDeviceAntiLagFeaturesAMD;\n  struct AntiLagDataAMD;\n  struct AntiLagPresentationInfoAMD;\n\n  //=== VK_KHR_ray_tracing_position_fetch ===\n  struct PhysicalDeviceRayTracingPositionFetchFeaturesKHR;\n\n  //=== VK_EXT_shader_object ===\n  struct PhysicalDeviceShaderObjectFeaturesEXT;\n  struct PhysicalDeviceShaderObjectPropertiesEXT;\n  struct ShaderCreateInfoEXT;\n\n  //=== VK_KHR_pipeline_binary ===\n  struct PhysicalDevicePipelineBinaryFeaturesKHR;\n  struct PhysicalDevicePipelineBinaryPropertiesKHR;\n  struct DevicePipelineBinaryInternalCacheControlKHR;\n  struct PipelineBinaryKeyKHR;\n  struct PipelineBinaryDataKHR;\n  struct PipelineBinaryKeysAndDataKHR;\n  struct PipelineBinaryCreateInfoKHR;\n  struct PipelineBinaryInfoKHR;\n  struct ReleaseCapturedPipelineDataInfoKHR;\n  struct PipelineBinaryDataInfoKHR;\n  struct PipelineCreateInfoKHR;\n  struct PipelineBinaryHandlesInfoKHR;\n\n  //=== VK_QCOM_tile_properties ===\n  struct PhysicalDeviceTilePropertiesFeaturesQCOM;\n  struct TilePropertiesQCOM;\n\n  //=== VK_SEC_amigo_profiling ===\n  struct PhysicalDeviceAmigoProfilingFeaturesSEC;\n  struct AmigoProfilingSubmitInfoSEC;\n\n  //=== VK_QCOM_multiview_per_view_viewports ===\n  struct PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM;\n\n  //=== VK_NV_ray_tracing_invocation_reorder ===\n  struct PhysicalDeviceRayTracingInvocationReorderPropertiesNV;\n  struct PhysicalDeviceRayTracingInvocationReorderFeaturesNV;\n\n  //=== VK_NV_cooperative_vector ===\n  struct PhysicalDeviceCooperativeVectorPropertiesNV;\n  struct PhysicalDeviceCooperativeVectorFeaturesNV;\n  struct CooperativeVectorPropertiesNV;\n  struct ConvertCooperativeVectorMatrixInfoNV;\n\n  //=== VK_NV_extended_sparse_address_space ===\n  struct PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV;\n  struct PhysicalDeviceExtendedSparseAddressSpacePropertiesNV;\n\n  //=== VK_EXT_mutable_descriptor_type ===\n  struct PhysicalDeviceMutableDescriptorTypeFeaturesEXT;\n  using PhysicalDeviceMutableDescriptorTypeFeaturesVALVE = PhysicalDeviceMutableDescriptorTypeFeaturesEXT;\n  struct MutableDescriptorTypeListEXT;\n  using MutableDescriptorTypeListVALVE = MutableDescriptorTypeListEXT;\n  struct MutableDescriptorTypeCreateInfoEXT;\n  using MutableDescriptorTypeCreateInfoVALVE = MutableDescriptorTypeCreateInfoEXT;\n\n  //=== VK_EXT_legacy_vertex_attributes ===\n  struct PhysicalDeviceLegacyVertexAttributesFeaturesEXT;\n  struct PhysicalDeviceLegacyVertexAttributesPropertiesEXT;\n\n  //=== VK_EXT_layer_settings ===\n  struct LayerSettingsCreateInfoEXT;\n  struct LayerSettingEXT;\n\n  //=== VK_ARM_shader_core_builtins ===\n  struct PhysicalDeviceShaderCoreBuiltinsFeaturesARM;\n  struct PhysicalDeviceShaderCoreBuiltinsPropertiesARM;\n\n  //=== VK_EXT_pipeline_library_group_handles ===\n  struct PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT;\n\n  //=== VK_EXT_dynamic_rendering_unused_attachments ===\n  struct PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT;\n\n  //=== VK_NV_low_latency2 ===\n  struct LatencySleepModeInfoNV;\n  struct LatencySleepInfoNV;\n  struct SetLatencyMarkerInfoNV;\n  struct GetLatencyMarkerInfoNV;\n  struct LatencyTimingsFrameReportNV;\n  struct LatencySubmissionPresentIdNV;\n  struct SwapchainLatencyCreateInfoNV;\n  struct OutOfBandQueueTypeInfoNV;\n  struct LatencySurfaceCapabilitiesNV;\n\n  //=== VK_KHR_cooperative_matrix ===\n  struct CooperativeMatrixPropertiesKHR;\n  struct PhysicalDeviceCooperativeMatrixFeaturesKHR;\n  struct PhysicalDeviceCooperativeMatrixPropertiesKHR;\n\n  //=== VK_QCOM_multiview_per_view_render_areas ===\n  struct PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM;\n  struct MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM;\n\n  //=== VK_KHR_compute_shader_derivatives ===\n  struct PhysicalDeviceComputeShaderDerivativesFeaturesKHR;\n  using PhysicalDeviceComputeShaderDerivativesFeaturesNV = PhysicalDeviceComputeShaderDerivativesFeaturesKHR;\n  struct PhysicalDeviceComputeShaderDerivativesPropertiesKHR;\n\n  //=== VK_KHR_video_decode_av1 ===\n  struct VideoDecodeAV1ProfileInfoKHR;\n  struct VideoDecodeAV1CapabilitiesKHR;\n  struct VideoDecodeAV1SessionParametersCreateInfoKHR;\n  struct VideoDecodeAV1PictureInfoKHR;\n  struct VideoDecodeAV1DpbSlotInfoKHR;\n\n  //=== VK_KHR_video_encode_av1 ===\n  struct PhysicalDeviceVideoEncodeAV1FeaturesKHR;\n  struct VideoEncodeAV1CapabilitiesKHR;\n  struct VideoEncodeAV1QualityLevelPropertiesKHR;\n  struct VideoEncodeAV1SessionCreateInfoKHR;\n  struct VideoEncodeAV1SessionParametersCreateInfoKHR;\n  struct VideoEncodeAV1PictureInfoKHR;\n  struct VideoEncodeAV1DpbSlotInfoKHR;\n  struct VideoEncodeAV1ProfileInfoKHR;\n  struct VideoEncodeAV1QIndexKHR;\n  struct VideoEncodeAV1FrameSizeKHR;\n  struct VideoEncodeAV1GopRemainingFrameInfoKHR;\n  struct VideoEncodeAV1RateControlInfoKHR;\n  struct VideoEncodeAV1RateControlLayerInfoKHR;\n\n  //=== VK_KHR_video_maintenance1 ===\n  struct PhysicalDeviceVideoMaintenance1FeaturesKHR;\n  struct VideoInlineQueryInfoKHR;\n\n  //=== VK_NV_per_stage_descriptor_set ===\n  struct PhysicalDevicePerStageDescriptorSetFeaturesNV;\n\n  //=== VK_QCOM_image_processing2 ===\n  struct PhysicalDeviceImageProcessing2FeaturesQCOM;\n  struct PhysicalDeviceImageProcessing2PropertiesQCOM;\n  struct SamplerBlockMatchWindowCreateInfoQCOM;\n\n  //=== VK_QCOM_filter_cubic_weights ===\n  struct PhysicalDeviceCubicWeightsFeaturesQCOM;\n  struct SamplerCubicWeightsCreateInfoQCOM;\n  struct BlitImageCubicWeightsInfoQCOM;\n\n  //=== VK_QCOM_ycbcr_degamma ===\n  struct PhysicalDeviceYcbcrDegammaFeaturesQCOM;\n  struct SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM;\n\n  //=== VK_QCOM_filter_cubic_clamp ===\n  struct PhysicalDeviceCubicClampFeaturesQCOM;\n\n  //=== VK_EXT_attachment_feedback_loop_dynamic_state ===\n  struct PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT;\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n  //=== VK_QNX_external_memory_screen_buffer ===\n  struct ScreenBufferPropertiesQNX;\n  struct ScreenBufferFormatPropertiesQNX;\n  struct ImportScreenBufferInfoQNX;\n  struct ExternalFormatQNX;\n  struct PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX;\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n  //=== VK_MSFT_layered_driver ===\n  struct PhysicalDeviceLayeredDriverPropertiesMSFT;\n\n  //=== VK_KHR_calibrated_timestamps ===\n  struct CalibratedTimestampInfoKHR;\n  using CalibratedTimestampInfoEXT = CalibratedTimestampInfoKHR;\n\n  //=== VK_KHR_maintenance6 ===\n  struct SetDescriptorBufferOffsetsInfoEXT;\n  struct BindDescriptorBufferEmbeddedSamplersInfoEXT;\n\n  //=== VK_NV_descriptor_pool_overallocation ===\n  struct PhysicalDeviceDescriptorPoolOverallocationFeaturesNV;\n\n  //=== VK_NV_display_stereo ===\n  struct DisplaySurfaceStereoCreateInfoNV;\n  struct DisplayModeStereoPropertiesNV;\n\n  //=== VK_KHR_video_encode_quantization_map ===\n  struct VideoEncodeQuantizationMapCapabilitiesKHR;\n  struct VideoFormatQuantizationMapPropertiesKHR;\n  struct VideoEncodeQuantizationMapInfoKHR;\n  struct VideoEncodeQuantizationMapSessionParametersCreateInfoKHR;\n  struct PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR;\n  struct VideoEncodeH264QuantizationMapCapabilitiesKHR;\n  struct VideoEncodeH265QuantizationMapCapabilitiesKHR;\n  struct VideoFormatH265QuantizationMapPropertiesKHR;\n  struct VideoEncodeAV1QuantizationMapCapabilitiesKHR;\n  struct VideoFormatAV1QuantizationMapPropertiesKHR;\n\n  //=== VK_NV_raw_access_chains ===\n  struct PhysicalDeviceRawAccessChainsFeaturesNV;\n\n  //=== VK_KHR_shader_relaxed_extended_instruction ===\n  struct PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR;\n\n  //=== VK_NV_command_buffer_inheritance ===\n  struct PhysicalDeviceCommandBufferInheritanceFeaturesNV;\n\n  //=== VK_KHR_maintenance7 ===\n  struct PhysicalDeviceMaintenance7FeaturesKHR;\n  struct PhysicalDeviceMaintenance7PropertiesKHR;\n  struct PhysicalDeviceLayeredApiPropertiesListKHR;\n  struct PhysicalDeviceLayeredApiPropertiesKHR;\n  struct PhysicalDeviceLayeredApiVulkanPropertiesKHR;\n\n  //=== VK_NV_shader_atomic_float16_vector ===\n  struct PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV;\n\n  //=== VK_EXT_shader_replicated_composites ===\n  struct PhysicalDeviceShaderReplicatedCompositesFeaturesEXT;\n\n  //=== VK_NV_ray_tracing_validation ===\n  struct PhysicalDeviceRayTracingValidationFeaturesNV;\n\n  //=== VK_NV_cluster_acceleration_structure ===\n  struct PhysicalDeviceClusterAccelerationStructureFeaturesNV;\n  struct PhysicalDeviceClusterAccelerationStructurePropertiesNV;\n  struct ClusterAccelerationStructureClustersBottomLevelInputNV;\n  struct ClusterAccelerationStructureTriangleClusterInputNV;\n  struct ClusterAccelerationStructureMoveObjectsInputNV;\n  union ClusterAccelerationStructureOpInputNV;\n  struct ClusterAccelerationStructureInputInfoNV;\n  struct ClusterAccelerationStructureCommandsInfoNV;\n  struct StridedDeviceAddressNV;\n  struct ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV;\n  struct ClusterAccelerationStructureMoveObjectsInfoNV;\n  struct ClusterAccelerationStructureBuildClustersBottomLevelInfoNV;\n  struct ClusterAccelerationStructureBuildTriangleClusterInfoNV;\n  struct ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV;\n  struct ClusterAccelerationStructureInstantiateClusterInfoNV;\n  struct RayTracingPipelineClusterAccelerationStructureCreateInfoNV;\n\n  //=== VK_NV_partitioned_acceleration_structure ===\n  struct PhysicalDevicePartitionedAccelerationStructureFeaturesNV;\n  struct PhysicalDevicePartitionedAccelerationStructurePropertiesNV;\n  struct PartitionedAccelerationStructureFlagsNV;\n  struct BuildPartitionedAccelerationStructureIndirectCommandNV;\n  struct PartitionedAccelerationStructureWriteInstanceDataNV;\n  struct PartitionedAccelerationStructureUpdateInstanceDataNV;\n  struct PartitionedAccelerationStructureWritePartitionTranslationDataNV;\n  struct WriteDescriptorSetPartitionedAccelerationStructureNV;\n  struct PartitionedAccelerationStructureInstancesInputNV;\n  struct BuildPartitionedAccelerationStructureInfoNV;\n\n  //=== VK_EXT_device_generated_commands ===\n  struct PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT;\n  struct PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT;\n  struct GeneratedCommandsMemoryRequirementsInfoEXT;\n  struct IndirectExecutionSetCreateInfoEXT;\n  union IndirectExecutionSetInfoEXT;\n  struct IndirectExecutionSetPipelineInfoEXT;\n  struct IndirectExecutionSetShaderInfoEXT;\n  struct GeneratedCommandsInfoEXT;\n  struct WriteIndirectExecutionSetPipelineEXT;\n  struct IndirectCommandsLayoutCreateInfoEXT;\n  struct IndirectCommandsLayoutTokenEXT;\n  struct DrawIndirectCountIndirectCommandEXT;\n  struct IndirectCommandsVertexBufferTokenEXT;\n  struct BindVertexBufferIndirectCommandEXT;\n  struct IndirectCommandsIndexBufferTokenEXT;\n  struct BindIndexBufferIndirectCommandEXT;\n  struct IndirectCommandsPushConstantTokenEXT;\n  struct IndirectCommandsExecutionSetTokenEXT;\n  union IndirectCommandsTokenDataEXT;\n  struct IndirectExecutionSetShaderLayoutInfoEXT;\n  struct GeneratedCommandsPipelineInfoEXT;\n  struct GeneratedCommandsShaderInfoEXT;\n  struct WriteIndirectExecutionSetShaderEXT;\n\n  //=== VK_KHR_maintenance8 ===\n  struct PhysicalDeviceMaintenance8FeaturesKHR;\n  struct MemoryBarrierAccessFlags3KHR;\n\n  //=== VK_MESA_image_alignment_control ===\n  struct PhysicalDeviceImageAlignmentControlFeaturesMESA;\n  struct PhysicalDeviceImageAlignmentControlPropertiesMESA;\n  struct ImageAlignmentControlCreateInfoMESA;\n\n  //=== VK_EXT_depth_clamp_control ===\n  struct PhysicalDeviceDepthClampControlFeaturesEXT;\n  struct PipelineViewportDepthClampControlCreateInfoEXT;\n  struct DepthClampRangeEXT;\n\n  //=== VK_KHR_video_maintenance2 ===\n  struct PhysicalDeviceVideoMaintenance2FeaturesKHR;\n  struct VideoDecodeH264InlineSessionParametersInfoKHR;\n  struct VideoDecodeH265InlineSessionParametersInfoKHR;\n  struct VideoDecodeAV1InlineSessionParametersInfoKHR;\n\n  //=== VK_HUAWEI_hdr_vivid ===\n  struct PhysicalDeviceHdrVividFeaturesHUAWEI;\n  struct HdrVividDynamicMetadataHUAWEI;\n\n  //=== VK_NV_cooperative_matrix2 ===\n  struct CooperativeMatrixFlexibleDimensionsPropertiesNV;\n  struct PhysicalDeviceCooperativeMatrix2FeaturesNV;\n  struct PhysicalDeviceCooperativeMatrix2PropertiesNV;\n\n  //=== VK_ARM_pipeline_opacity_micromap ===\n  struct PhysicalDevicePipelineOpacityMicromapFeaturesARM;\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  //=== VK_EXT_external_memory_metal ===\n  struct ImportMemoryMetalHandleInfoEXT;\n  struct MemoryMetalHandlePropertiesEXT;\n  struct MemoryGetMetalHandleInfoEXT;\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n  //=== VK_KHR_depth_clamp_zero_one ===\n  struct PhysicalDeviceDepthClampZeroOneFeaturesKHR;\n  using PhysicalDeviceDepthClampZeroOneFeaturesEXT = PhysicalDeviceDepthClampZeroOneFeaturesKHR;\n\n  //=== VK_EXT_vertex_attribute_robustness ===\n  struct PhysicalDeviceVertexAttributeRobustnessFeaturesEXT;\n\n  //===================================\n  //=== HANDLE forward declarations ===\n  //===================================\n\n  //=== VK_VERSION_1_0 ===\n  class Instance;\n  class PhysicalDevice;\n  class Device;\n  class Queue;\n  class DeviceMemory;\n  class Fence;\n  class Semaphore;\n  class Event;\n  class QueryPool;\n  class Buffer;\n  class BufferView;\n  class Image;\n  class ImageView;\n  class ShaderModule;\n  class PipelineCache;\n  class Pipeline;\n  class PipelineLayout;\n  class Sampler;\n  class DescriptorPool;\n  class DescriptorSet;\n  class DescriptorSetLayout;\n  class Framebuffer;\n  class RenderPass;\n  class CommandPool;\n  class CommandBuffer;\n\n  //=== VK_VERSION_1_1 ===\n  class SamplerYcbcrConversion;\n  class DescriptorUpdateTemplate;\n\n  //=== VK_VERSION_1_3 ===\n  class PrivateDataSlot;\n\n  //=== VK_KHR_surface ===\n  class SurfaceKHR;\n\n  //=== VK_KHR_swapchain ===\n  class SwapchainKHR;\n\n  //=== VK_KHR_display ===\n  class DisplayKHR;\n  class DisplayModeKHR;\n\n  //=== VK_EXT_debug_report ===\n  class DebugReportCallbackEXT;\n\n  //=== VK_KHR_video_queue ===\n  class VideoSessionKHR;\n  class VideoSessionParametersKHR;\n\n  //=== VK_NVX_binary_import ===\n  class CuModuleNVX;\n  class CuFunctionNVX;\n\n  //=== VK_EXT_debug_utils ===\n  class DebugUtilsMessengerEXT;\n\n  //=== VK_KHR_acceleration_structure ===\n  class AccelerationStructureKHR;\n\n  //=== VK_EXT_validation_cache ===\n  class ValidationCacheEXT;\n\n  //=== VK_NV_ray_tracing ===\n  class AccelerationStructureNV;\n\n  //=== VK_INTEL_performance_query ===\n  class PerformanceConfigurationINTEL;\n\n  //=== VK_KHR_deferred_host_operations ===\n  class DeferredOperationKHR;\n\n  //=== VK_NV_device_generated_commands ===\n  class IndirectCommandsLayoutNV;\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  //=== VK_NV_cuda_kernel_launch ===\n  class CudaModuleNV;\n  class CudaFunctionNV;\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_buffer_collection ===\n  class BufferCollectionFUCHSIA;\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  //=== VK_EXT_opacity_micromap ===\n  class MicromapEXT;\n\n  //=== VK_NV_optical_flow ===\n  class OpticalFlowSessionNV;\n\n  //=== VK_EXT_shader_object ===\n  class ShaderEXT;\n\n  //=== VK_KHR_pipeline_binary ===\n  class PipelineBinaryKHR;\n\n  //=== VK_EXT_device_generated_commands ===\n  class IndirectCommandsLayoutEXT;\n  class IndirectExecutionSetEXT;\n\n  typedef void( VKAPI_PTR * PFN_VoidFunction )();\n\n#ifndef VULKAN_HPP_NO_SMART_HANDLE\n  //======================\n  //=== UNIQUE HANDLEs ===\n  //======================\n\n  //=== VK_VERSION_1_0 ===\n  template <typename Dispatch>\n  class UniqueHandleTraits<Instance, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<detail::NoParent, Dispatch>;\n  };\n\n  using UniqueInstance = UniqueHandle<Instance, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<Device, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<detail::NoParent, Dispatch>;\n  };\n\n  using UniqueDevice = UniqueHandle<Device, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<DeviceMemory, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectFree<Device, Dispatch>;\n  };\n\n  using UniqueDeviceMemory = UniqueHandle<DeviceMemory, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<Fence, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueFence = UniqueHandle<Fence, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<Semaphore, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueSemaphore = UniqueHandle<Semaphore, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<Event, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueEvent = UniqueHandle<Event, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<QueryPool, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueQueryPool = UniqueHandle<QueryPool, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<Buffer, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueBuffer = UniqueHandle<Buffer, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<BufferView, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueBufferView = UniqueHandle<BufferView, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<Image, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueImage = UniqueHandle<Image, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<ImageView, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueImageView = UniqueHandle<ImageView, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<ShaderModule, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueShaderModule = UniqueHandle<ShaderModule, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<PipelineCache, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniquePipelineCache = UniqueHandle<PipelineCache, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<Pipeline, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniquePipeline = UniqueHandle<Pipeline, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<PipelineLayout, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniquePipelineLayout = UniqueHandle<PipelineLayout, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<Sampler, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueSampler = UniqueHandle<Sampler, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<DescriptorPool, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueDescriptorPool = UniqueHandle<DescriptorPool, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<DescriptorSet, Dispatch>\n  {\n  public:\n    using deleter = detail::PoolFree<Device, DescriptorPool, Dispatch>;\n  };\n\n  using UniqueDescriptorSet = UniqueHandle<DescriptorSet, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<DescriptorSetLayout, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueDescriptorSetLayout = UniqueHandle<DescriptorSetLayout, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<Framebuffer, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueFramebuffer = UniqueHandle<Framebuffer, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<RenderPass, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueRenderPass = UniqueHandle<RenderPass, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<CommandPool, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueCommandPool = UniqueHandle<CommandPool, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<CommandBuffer, Dispatch>\n  {\n  public:\n    using deleter = detail::PoolFree<Device, CommandPool, Dispatch>;\n  };\n\n  using UniqueCommandBuffer = UniqueHandle<CommandBuffer, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  //=== VK_VERSION_1_1 ===\n  template <typename Dispatch>\n  class UniqueHandleTraits<SamplerYcbcrConversion, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueSamplerYcbcrConversion    = UniqueHandle<SamplerYcbcrConversion, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n  using UniqueSamplerYcbcrConversionKHR = UniqueHandle<SamplerYcbcrConversion, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<DescriptorUpdateTemplate, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueDescriptorUpdateTemplate    = UniqueHandle<DescriptorUpdateTemplate, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n  using UniqueDescriptorUpdateTemplateKHR = UniqueHandle<DescriptorUpdateTemplate, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  //=== VK_VERSION_1_3 ===\n  template <typename Dispatch>\n  class UniqueHandleTraits<PrivateDataSlot, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniquePrivateDataSlot    = UniqueHandle<PrivateDataSlot, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n  using UniquePrivateDataSlotEXT = UniqueHandle<PrivateDataSlot, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  //=== VK_KHR_surface ===\n  template <typename Dispatch>\n  class UniqueHandleTraits<SurfaceKHR, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Instance, Dispatch>;\n  };\n\n  using UniqueSurfaceKHR = UniqueHandle<SurfaceKHR, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  //=== VK_KHR_swapchain ===\n  template <typename Dispatch>\n  class UniqueHandleTraits<SwapchainKHR, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueSwapchainKHR = UniqueHandle<SwapchainKHR, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  //=== VK_KHR_display ===\n  template <typename Dispatch>\n  class UniqueHandleTraits<DisplayKHR, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<PhysicalDevice, Dispatch>;\n  };\n\n  using UniqueDisplayKHR = UniqueHandle<DisplayKHR, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  //=== VK_EXT_debug_report ===\n  template <typename Dispatch>\n  class UniqueHandleTraits<DebugReportCallbackEXT, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Instance, Dispatch>;\n  };\n\n  using UniqueDebugReportCallbackEXT = UniqueHandle<DebugReportCallbackEXT, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  //=== VK_KHR_video_queue ===\n  template <typename Dispatch>\n  class UniqueHandleTraits<VideoSessionKHR, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueVideoSessionKHR = UniqueHandle<VideoSessionKHR, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<VideoSessionParametersKHR, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueVideoSessionParametersKHR = UniqueHandle<VideoSessionParametersKHR, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  //=== VK_NVX_binary_import ===\n  template <typename Dispatch>\n  class UniqueHandleTraits<CuModuleNVX, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueCuModuleNVX = UniqueHandle<CuModuleNVX, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<CuFunctionNVX, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueCuFunctionNVX = UniqueHandle<CuFunctionNVX, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  //=== VK_EXT_debug_utils ===\n  template <typename Dispatch>\n  class UniqueHandleTraits<DebugUtilsMessengerEXT, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Instance, Dispatch>;\n  };\n\n  using UniqueDebugUtilsMessengerEXT = UniqueHandle<DebugUtilsMessengerEXT, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  //=== VK_KHR_acceleration_structure ===\n  template <typename Dispatch>\n  class UniqueHandleTraits<AccelerationStructureKHR, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueAccelerationStructureKHR = UniqueHandle<AccelerationStructureKHR, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  //=== VK_EXT_validation_cache ===\n  template <typename Dispatch>\n  class UniqueHandleTraits<ValidationCacheEXT, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueValidationCacheEXT = UniqueHandle<ValidationCacheEXT, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  //=== VK_NV_ray_tracing ===\n  template <typename Dispatch>\n  class UniqueHandleTraits<AccelerationStructureNV, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueAccelerationStructureNV = UniqueHandle<AccelerationStructureNV, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  //=== VK_INTEL_performance_query ===\n  template <typename Dispatch>\n  class UniqueHandleTraits<PerformanceConfigurationINTEL, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniquePerformanceConfigurationINTEL = UniqueHandle<PerformanceConfigurationINTEL, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  //=== VK_KHR_deferred_host_operations ===\n  template <typename Dispatch>\n  class UniqueHandleTraits<DeferredOperationKHR, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueDeferredOperationKHR = UniqueHandle<DeferredOperationKHR, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  //=== VK_NV_device_generated_commands ===\n  template <typename Dispatch>\n  class UniqueHandleTraits<IndirectCommandsLayoutNV, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueIndirectCommandsLayoutNV = UniqueHandle<IndirectCommandsLayoutNV, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n  //=== VK_NV_cuda_kernel_launch ===\n  template <typename Dispatch>\n  class UniqueHandleTraits<CudaModuleNV, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueCudaModuleNV = UniqueHandle<CudaModuleNV, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<CudaFunctionNV, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueCudaFunctionNV = UniqueHandle<CudaFunctionNV, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_buffer_collection ===\n  template <typename Dispatch>\n  class UniqueHandleTraits<BufferCollectionFUCHSIA, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueBufferCollectionFUCHSIA = UniqueHandle<BufferCollectionFUCHSIA, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  //=== VK_EXT_opacity_micromap ===\n  template <typename Dispatch>\n  class UniqueHandleTraits<MicromapEXT, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueMicromapEXT = UniqueHandle<MicromapEXT, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  //=== VK_NV_optical_flow ===\n  template <typename Dispatch>\n  class UniqueHandleTraits<OpticalFlowSessionNV, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueOpticalFlowSessionNV = UniqueHandle<OpticalFlowSessionNV, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  //=== VK_EXT_shader_object ===\n  template <typename Dispatch>\n  class UniqueHandleTraits<ShaderEXT, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueShaderEXT = UniqueHandle<ShaderEXT, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  //=== VK_KHR_pipeline_binary ===\n  template <typename Dispatch>\n  class UniqueHandleTraits<PipelineBinaryKHR, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniquePipelineBinaryKHR = UniqueHandle<PipelineBinaryKHR, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  //=== VK_EXT_device_generated_commands ===\n  template <typename Dispatch>\n  class UniqueHandleTraits<IndirectCommandsLayoutEXT, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueIndirectCommandsLayoutEXT = UniqueHandle<IndirectCommandsLayoutEXT, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n\n  template <typename Dispatch>\n  class UniqueHandleTraits<IndirectExecutionSetEXT, Dispatch>\n  {\n  public:\n    using deleter = detail::ObjectDestroy<Device, Dispatch>;\n  };\n\n  using UniqueIndirectExecutionSetEXT = UniqueHandle<IndirectExecutionSetEXT, VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>;\n#endif /*VULKAN_HPP_NO_SMART_HANDLE*/\n\n  //===============\n  //=== HANDLEs ===\n  //===============\n\n  template <typename Type>\n  struct isVulkanHandleType\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = false;\n  };\n\n  class SurfaceKHR\n  {\n  public:\n    using CType      = VkSurfaceKHR;\n    using NativeType = VkSurfaceKHR;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eSurfaceKHR;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSurfaceKHR;\n\n  public:\n    SurfaceKHR() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    SurfaceKHR( SurfaceKHR const & rhs )             = default;\n    SurfaceKHR & operator=( SurfaceKHR const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    SurfaceKHR( SurfaceKHR && rhs )             = default;\n    SurfaceKHR & operator=( SurfaceKHR && rhs ) = default;\n#else\n    SurfaceKHR( SurfaceKHR && rhs ) VULKAN_HPP_NOEXCEPT : m_surfaceKHR( VULKAN_HPP_NAMESPACE::exchange( rhs.m_surfaceKHR, {} ) ) {}\n\n    SurfaceKHR & operator=( SurfaceKHR && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_surfaceKHR = VULKAN_HPP_NAMESPACE::exchange( rhs.m_surfaceKHR, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR SurfaceKHR( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT SurfaceKHR( VkSurfaceKHR surfaceKHR ) VULKAN_HPP_NOEXCEPT : m_surfaceKHR( surfaceKHR ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    SurfaceKHR & operator=( VkSurfaceKHR surfaceKHR ) VULKAN_HPP_NOEXCEPT\n    {\n      m_surfaceKHR = surfaceKHR;\n      return *this;\n    }\n#endif\n\n    SurfaceKHR & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_surfaceKHR = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkSurfaceKHR() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_surfaceKHR;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_surfaceKHR != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_surfaceKHR == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkSurfaceKHR m_surfaceKHR = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eSurfaceKHR>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::SurfaceKHR;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSurfaceKHR>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::SurfaceKHR;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkSurfaceKHR, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::SurfaceKHR;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::SurfaceKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class DebugReportCallbackEXT\n  {\n  public:\n    using CType      = VkDebugReportCallbackEXT;\n    using NativeType = VkDebugReportCallbackEXT;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDebugReportCallbackEXT;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDebugReportCallbackEXT;\n\n  public:\n    DebugReportCallbackEXT() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    DebugReportCallbackEXT( DebugReportCallbackEXT const & rhs )             = default;\n    DebugReportCallbackEXT & operator=( DebugReportCallbackEXT const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    DebugReportCallbackEXT( DebugReportCallbackEXT && rhs )             = default;\n    DebugReportCallbackEXT & operator=( DebugReportCallbackEXT && rhs ) = default;\n#else\n    DebugReportCallbackEXT( DebugReportCallbackEXT && rhs ) VULKAN_HPP_NOEXCEPT\n      : m_debugReportCallbackEXT( VULKAN_HPP_NAMESPACE::exchange( rhs.m_debugReportCallbackEXT, {} ) )\n    {\n    }\n\n    DebugReportCallbackEXT & operator=( DebugReportCallbackEXT && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_debugReportCallbackEXT = VULKAN_HPP_NAMESPACE::exchange( rhs.m_debugReportCallbackEXT, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR DebugReportCallbackEXT( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT DebugReportCallbackEXT( VkDebugReportCallbackEXT debugReportCallbackEXT ) VULKAN_HPP_NOEXCEPT\n      : m_debugReportCallbackEXT( debugReportCallbackEXT )\n    {\n    }\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    DebugReportCallbackEXT & operator=( VkDebugReportCallbackEXT debugReportCallbackEXT ) VULKAN_HPP_NOEXCEPT\n    {\n      m_debugReportCallbackEXT = debugReportCallbackEXT;\n      return *this;\n    }\n#endif\n\n    DebugReportCallbackEXT & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_debugReportCallbackEXT = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkDebugReportCallbackEXT() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_debugReportCallbackEXT;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_debugReportCallbackEXT != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_debugReportCallbackEXT == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkDebugReportCallbackEXT m_debugReportCallbackEXT = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eDebugReportCallbackEXT>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDebugReportCallbackEXT>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkDebugReportCallbackEXT, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class DebugUtilsMessengerEXT\n  {\n  public:\n    using CType      = VkDebugUtilsMessengerEXT;\n    using NativeType = VkDebugUtilsMessengerEXT;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDebugUtilsMessengerEXT;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n  public:\n    DebugUtilsMessengerEXT() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    DebugUtilsMessengerEXT( DebugUtilsMessengerEXT const & rhs )             = default;\n    DebugUtilsMessengerEXT & operator=( DebugUtilsMessengerEXT const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    DebugUtilsMessengerEXT( DebugUtilsMessengerEXT && rhs )             = default;\n    DebugUtilsMessengerEXT & operator=( DebugUtilsMessengerEXT && rhs ) = default;\n#else\n    DebugUtilsMessengerEXT( DebugUtilsMessengerEXT && rhs ) VULKAN_HPP_NOEXCEPT\n      : m_debugUtilsMessengerEXT( VULKAN_HPP_NAMESPACE::exchange( rhs.m_debugUtilsMessengerEXT, {} ) )\n    {\n    }\n\n    DebugUtilsMessengerEXT & operator=( DebugUtilsMessengerEXT && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_debugUtilsMessengerEXT = VULKAN_HPP_NAMESPACE::exchange( rhs.m_debugUtilsMessengerEXT, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR DebugUtilsMessengerEXT( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT DebugUtilsMessengerEXT( VkDebugUtilsMessengerEXT debugUtilsMessengerEXT ) VULKAN_HPP_NOEXCEPT\n      : m_debugUtilsMessengerEXT( debugUtilsMessengerEXT )\n    {\n    }\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    DebugUtilsMessengerEXT & operator=( VkDebugUtilsMessengerEXT debugUtilsMessengerEXT ) VULKAN_HPP_NOEXCEPT\n    {\n      m_debugUtilsMessengerEXT = debugUtilsMessengerEXT;\n      return *this;\n    }\n#endif\n\n    DebugUtilsMessengerEXT & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_debugUtilsMessengerEXT = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkDebugUtilsMessengerEXT() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_debugUtilsMessengerEXT;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_debugUtilsMessengerEXT != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_debugUtilsMessengerEXT == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkDebugUtilsMessengerEXT m_debugUtilsMessengerEXT = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eDebugUtilsMessengerEXT>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkDebugUtilsMessengerEXT, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class DisplayKHR\n  {\n  public:\n    using CType      = VkDisplayKHR;\n    using NativeType = VkDisplayKHR;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDisplayKHR;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDisplayKHR;\n\n  public:\n    DisplayKHR() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    DisplayKHR( DisplayKHR const & rhs )             = default;\n    DisplayKHR & operator=( DisplayKHR const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    DisplayKHR( DisplayKHR && rhs )             = default;\n    DisplayKHR & operator=( DisplayKHR && rhs ) = default;\n#else\n    DisplayKHR( DisplayKHR && rhs ) VULKAN_HPP_NOEXCEPT : m_displayKHR( VULKAN_HPP_NAMESPACE::exchange( rhs.m_displayKHR, {} ) ) {}\n\n    DisplayKHR & operator=( DisplayKHR && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_displayKHR = VULKAN_HPP_NAMESPACE::exchange( rhs.m_displayKHR, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR DisplayKHR( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT DisplayKHR( VkDisplayKHR displayKHR ) VULKAN_HPP_NOEXCEPT : m_displayKHR( displayKHR ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    DisplayKHR & operator=( VkDisplayKHR displayKHR ) VULKAN_HPP_NOEXCEPT\n    {\n      m_displayKHR = displayKHR;\n      return *this;\n    }\n#endif\n\n    DisplayKHR & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_displayKHR = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkDisplayKHR() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_displayKHR;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_displayKHR != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_displayKHR == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkDisplayKHR m_displayKHR = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eDisplayKHR>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DisplayKHR;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDisplayKHR>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DisplayKHR;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkDisplayKHR, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DisplayKHR;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::DisplayKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class SwapchainKHR\n  {\n  public:\n    using CType      = VkSwapchainKHR;\n    using NativeType = VkSwapchainKHR;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eSwapchainKHR;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSwapchainKHR;\n\n  public:\n    SwapchainKHR() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    SwapchainKHR( SwapchainKHR const & rhs )             = default;\n    SwapchainKHR & operator=( SwapchainKHR const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    SwapchainKHR( SwapchainKHR && rhs )             = default;\n    SwapchainKHR & operator=( SwapchainKHR && rhs ) = default;\n#else\n    SwapchainKHR( SwapchainKHR && rhs ) VULKAN_HPP_NOEXCEPT : m_swapchainKHR( VULKAN_HPP_NAMESPACE::exchange( rhs.m_swapchainKHR, {} ) ) {}\n\n    SwapchainKHR & operator=( SwapchainKHR && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_swapchainKHR = VULKAN_HPP_NAMESPACE::exchange( rhs.m_swapchainKHR, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR SwapchainKHR( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT SwapchainKHR( VkSwapchainKHR swapchainKHR ) VULKAN_HPP_NOEXCEPT : m_swapchainKHR( swapchainKHR ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    SwapchainKHR & operator=( VkSwapchainKHR swapchainKHR ) VULKAN_HPP_NOEXCEPT\n    {\n      m_swapchainKHR = swapchainKHR;\n      return *this;\n    }\n#endif\n\n    SwapchainKHR & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_swapchainKHR = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkSwapchainKHR() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_swapchainKHR;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_swapchainKHR != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_swapchainKHR == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkSwapchainKHR m_swapchainKHR = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eSwapchainKHR>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::SwapchainKHR;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSwapchainKHR>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::SwapchainKHR;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkSwapchainKHR, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::SwapchainKHR;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::SwapchainKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class Semaphore\n  {\n  public:\n    using CType      = VkSemaphore;\n    using NativeType = VkSemaphore;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eSemaphore;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSemaphore;\n\n  public:\n    Semaphore() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    Semaphore( Semaphore const & rhs )             = default;\n    Semaphore & operator=( Semaphore const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    Semaphore( Semaphore && rhs )             = default;\n    Semaphore & operator=( Semaphore && rhs ) = default;\n#else\n    Semaphore( Semaphore && rhs ) VULKAN_HPP_NOEXCEPT : m_semaphore( VULKAN_HPP_NAMESPACE::exchange( rhs.m_semaphore, {} ) ) {}\n\n    Semaphore & operator=( Semaphore && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_semaphore = VULKAN_HPP_NAMESPACE::exchange( rhs.m_semaphore, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR Semaphore( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT Semaphore( VkSemaphore semaphore ) VULKAN_HPP_NOEXCEPT : m_semaphore( semaphore ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    Semaphore & operator=( VkSemaphore semaphore ) VULKAN_HPP_NOEXCEPT\n    {\n      m_semaphore = semaphore;\n      return *this;\n    }\n#endif\n\n    Semaphore & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_semaphore = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkSemaphore() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_semaphore;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_semaphore != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_semaphore == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkSemaphore m_semaphore = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eSemaphore>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Semaphore;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSemaphore>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Semaphore;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkSemaphore, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Semaphore;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::Semaphore>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class Fence\n  {\n  public:\n    using CType      = VkFence;\n    using NativeType = VkFence;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eFence;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eFence;\n\n  public:\n    Fence() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    Fence( Fence const & rhs )             = default;\n    Fence & operator=( Fence const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    Fence( Fence && rhs )             = default;\n    Fence & operator=( Fence && rhs ) = default;\n#else\n    Fence( Fence && rhs ) VULKAN_HPP_NOEXCEPT : m_fence( VULKAN_HPP_NAMESPACE::exchange( rhs.m_fence, {} ) ) {}\n\n    Fence & operator=( Fence && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_fence = VULKAN_HPP_NAMESPACE::exchange( rhs.m_fence, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR Fence( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT Fence( VkFence fence ) VULKAN_HPP_NOEXCEPT : m_fence( fence ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    Fence & operator=( VkFence fence ) VULKAN_HPP_NOEXCEPT\n    {\n      m_fence = fence;\n      return *this;\n    }\n#endif\n\n    Fence & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_fence = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkFence() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_fence;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_fence != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_fence == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkFence m_fence = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eFence>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Fence;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eFence>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Fence;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkFence, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Fence;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::Fence>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class PerformanceConfigurationINTEL\n  {\n  public:\n    using CType      = VkPerformanceConfigurationINTEL;\n    using NativeType = VkPerformanceConfigurationINTEL;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::ePerformanceConfigurationINTEL;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n  public:\n    PerformanceConfigurationINTEL() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    PerformanceConfigurationINTEL( PerformanceConfigurationINTEL const & rhs )             = default;\n    PerformanceConfigurationINTEL & operator=( PerformanceConfigurationINTEL const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    PerformanceConfigurationINTEL( PerformanceConfigurationINTEL && rhs )             = default;\n    PerformanceConfigurationINTEL & operator=( PerformanceConfigurationINTEL && rhs ) = default;\n#else\n    PerformanceConfigurationINTEL( PerformanceConfigurationINTEL && rhs ) VULKAN_HPP_NOEXCEPT\n      : m_performanceConfigurationINTEL( VULKAN_HPP_NAMESPACE::exchange( rhs.m_performanceConfigurationINTEL, {} ) )\n    {\n    }\n\n    PerformanceConfigurationINTEL & operator=( PerformanceConfigurationINTEL && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_performanceConfigurationINTEL = VULKAN_HPP_NAMESPACE::exchange( rhs.m_performanceConfigurationINTEL, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR PerformanceConfigurationINTEL( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT PerformanceConfigurationINTEL( VkPerformanceConfigurationINTEL performanceConfigurationINTEL ) VULKAN_HPP_NOEXCEPT\n      : m_performanceConfigurationINTEL( performanceConfigurationINTEL )\n    {\n    }\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    PerformanceConfigurationINTEL & operator=( VkPerformanceConfigurationINTEL performanceConfigurationINTEL ) VULKAN_HPP_NOEXCEPT\n    {\n      m_performanceConfigurationINTEL = performanceConfigurationINTEL;\n      return *this;\n    }\n#endif\n\n    PerformanceConfigurationINTEL & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_performanceConfigurationINTEL = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkPerformanceConfigurationINTEL() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_performanceConfigurationINTEL;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_performanceConfigurationINTEL != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_performanceConfigurationINTEL == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkPerformanceConfigurationINTEL m_performanceConfigurationINTEL = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::ePerformanceConfigurationINTEL>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkPerformanceConfigurationINTEL, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class QueryPool\n  {\n  public:\n    using CType      = VkQueryPool;\n    using NativeType = VkQueryPool;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eQueryPool;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eQueryPool;\n\n  public:\n    QueryPool() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    QueryPool( QueryPool const & rhs )             = default;\n    QueryPool & operator=( QueryPool const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    QueryPool( QueryPool && rhs )             = default;\n    QueryPool & operator=( QueryPool && rhs ) = default;\n#else\n    QueryPool( QueryPool && rhs ) VULKAN_HPP_NOEXCEPT : m_queryPool( VULKAN_HPP_NAMESPACE::exchange( rhs.m_queryPool, {} ) ) {}\n\n    QueryPool & operator=( QueryPool && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_queryPool = VULKAN_HPP_NAMESPACE::exchange( rhs.m_queryPool, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR QueryPool( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT QueryPool( VkQueryPool queryPool ) VULKAN_HPP_NOEXCEPT : m_queryPool( queryPool ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    QueryPool & operator=( VkQueryPool queryPool ) VULKAN_HPP_NOEXCEPT\n    {\n      m_queryPool = queryPool;\n      return *this;\n    }\n#endif\n\n    QueryPool & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_queryPool = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkQueryPool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_queryPool;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_queryPool != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_queryPool == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkQueryPool m_queryPool = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eQueryPool>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::QueryPool;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eQueryPool>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::QueryPool;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkQueryPool, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::QueryPool;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::QueryPool>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class Buffer\n  {\n  public:\n    using CType      = VkBuffer;\n    using NativeType = VkBuffer;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eBuffer;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eBuffer;\n\n  public:\n    Buffer() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    Buffer( Buffer const & rhs )             = default;\n    Buffer & operator=( Buffer const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    Buffer( Buffer && rhs )             = default;\n    Buffer & operator=( Buffer && rhs ) = default;\n#else\n    Buffer( Buffer && rhs ) VULKAN_HPP_NOEXCEPT : m_buffer( VULKAN_HPP_NAMESPACE::exchange( rhs.m_buffer, {} ) ) {}\n\n    Buffer & operator=( Buffer && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_buffer = VULKAN_HPP_NAMESPACE::exchange( rhs.m_buffer, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR Buffer( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT Buffer( VkBuffer buffer ) VULKAN_HPP_NOEXCEPT : m_buffer( buffer ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    Buffer & operator=( VkBuffer buffer ) VULKAN_HPP_NOEXCEPT\n    {\n      m_buffer = buffer;\n      return *this;\n    }\n#endif\n\n    Buffer & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_buffer = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkBuffer() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_buffer;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_buffer != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_buffer == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkBuffer m_buffer = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eBuffer>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Buffer;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eBuffer>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Buffer;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkBuffer, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Buffer;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::Buffer>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class PipelineLayout\n  {\n  public:\n    using CType      = VkPipelineLayout;\n    using NativeType = VkPipelineLayout;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::ePipelineLayout;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePipelineLayout;\n\n  public:\n    PipelineLayout() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    PipelineLayout( PipelineLayout const & rhs )             = default;\n    PipelineLayout & operator=( PipelineLayout const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    PipelineLayout( PipelineLayout && rhs )             = default;\n    PipelineLayout & operator=( PipelineLayout && rhs ) = default;\n#else\n    PipelineLayout( PipelineLayout && rhs ) VULKAN_HPP_NOEXCEPT : m_pipelineLayout( VULKAN_HPP_NAMESPACE::exchange( rhs.m_pipelineLayout, {} ) ) {}\n\n    PipelineLayout & operator=( PipelineLayout && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_pipelineLayout = VULKAN_HPP_NAMESPACE::exchange( rhs.m_pipelineLayout, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR PipelineLayout( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT PipelineLayout( VkPipelineLayout pipelineLayout ) VULKAN_HPP_NOEXCEPT : m_pipelineLayout( pipelineLayout ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    PipelineLayout & operator=( VkPipelineLayout pipelineLayout ) VULKAN_HPP_NOEXCEPT\n    {\n      m_pipelineLayout = pipelineLayout;\n      return *this;\n    }\n#endif\n\n    PipelineLayout & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_pipelineLayout = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkPipelineLayout() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_pipelineLayout;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_pipelineLayout != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_pipelineLayout == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkPipelineLayout m_pipelineLayout = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::ePipelineLayout>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::PipelineLayout;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePipelineLayout>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::PipelineLayout;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkPipelineLayout, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::PipelineLayout;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::PipelineLayout>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class DescriptorSet\n  {\n  public:\n    using CType      = VkDescriptorSet;\n    using NativeType = VkDescriptorSet;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDescriptorSet;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDescriptorSet;\n\n  public:\n    DescriptorSet() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    DescriptorSet( DescriptorSet const & rhs )             = default;\n    DescriptorSet & operator=( DescriptorSet const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    DescriptorSet( DescriptorSet && rhs )             = default;\n    DescriptorSet & operator=( DescriptorSet && rhs ) = default;\n#else\n    DescriptorSet( DescriptorSet && rhs ) VULKAN_HPP_NOEXCEPT : m_descriptorSet( VULKAN_HPP_NAMESPACE::exchange( rhs.m_descriptorSet, {} ) ) {}\n\n    DescriptorSet & operator=( DescriptorSet && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_descriptorSet = VULKAN_HPP_NAMESPACE::exchange( rhs.m_descriptorSet, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR DescriptorSet( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT DescriptorSet( VkDescriptorSet descriptorSet ) VULKAN_HPP_NOEXCEPT : m_descriptorSet( descriptorSet ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    DescriptorSet & operator=( VkDescriptorSet descriptorSet ) VULKAN_HPP_NOEXCEPT\n    {\n      m_descriptorSet = descriptorSet;\n      return *this;\n    }\n#endif\n\n    DescriptorSet & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_descriptorSet = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkDescriptorSet() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_descriptorSet;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_descriptorSet != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_descriptorSet == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkDescriptorSet m_descriptorSet = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eDescriptorSet>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DescriptorSet;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDescriptorSet>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DescriptorSet;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkDescriptorSet, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DescriptorSet;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::DescriptorSet>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class ImageView\n  {\n  public:\n    using CType      = VkImageView;\n    using NativeType = VkImageView;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eImageView;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eImageView;\n\n  public:\n    ImageView() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    ImageView( ImageView const & rhs )             = default;\n    ImageView & operator=( ImageView const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    ImageView( ImageView && rhs )             = default;\n    ImageView & operator=( ImageView && rhs ) = default;\n#else\n    ImageView( ImageView && rhs ) VULKAN_HPP_NOEXCEPT : m_imageView( VULKAN_HPP_NAMESPACE::exchange( rhs.m_imageView, {} ) ) {}\n\n    ImageView & operator=( ImageView && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_imageView = VULKAN_HPP_NAMESPACE::exchange( rhs.m_imageView, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR ImageView( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT ImageView( VkImageView imageView ) VULKAN_HPP_NOEXCEPT : m_imageView( imageView ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    ImageView & operator=( VkImageView imageView ) VULKAN_HPP_NOEXCEPT\n    {\n      m_imageView = imageView;\n      return *this;\n    }\n#endif\n\n    ImageView & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_imageView = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkImageView() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_imageView;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_imageView != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_imageView == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkImageView m_imageView = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eImageView>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::ImageView;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eImageView>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::ImageView;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkImageView, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::ImageView;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::ImageView>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class Pipeline\n  {\n  public:\n    using CType      = VkPipeline;\n    using NativeType = VkPipeline;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::ePipeline;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePipeline;\n\n  public:\n    Pipeline() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    Pipeline( Pipeline const & rhs )             = default;\n    Pipeline & operator=( Pipeline const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    Pipeline( Pipeline && rhs )             = default;\n    Pipeline & operator=( Pipeline && rhs ) = default;\n#else\n    Pipeline( Pipeline && rhs ) VULKAN_HPP_NOEXCEPT : m_pipeline( VULKAN_HPP_NAMESPACE::exchange( rhs.m_pipeline, {} ) ) {}\n\n    Pipeline & operator=( Pipeline && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_pipeline = VULKAN_HPP_NAMESPACE::exchange( rhs.m_pipeline, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR Pipeline( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT Pipeline( VkPipeline pipeline ) VULKAN_HPP_NOEXCEPT : m_pipeline( pipeline ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    Pipeline & operator=( VkPipeline pipeline ) VULKAN_HPP_NOEXCEPT\n    {\n      m_pipeline = pipeline;\n      return *this;\n    }\n#endif\n\n    Pipeline & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_pipeline = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkPipeline() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_pipeline;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_pipeline != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_pipeline == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkPipeline m_pipeline = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::ePipeline>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Pipeline;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePipeline>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Pipeline;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkPipeline, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Pipeline;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::Pipeline>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class ShaderEXT\n  {\n  public:\n    using CType      = VkShaderEXT;\n    using NativeType = VkShaderEXT;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eShaderEXT;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n  public:\n    ShaderEXT() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    ShaderEXT( ShaderEXT const & rhs )             = default;\n    ShaderEXT & operator=( ShaderEXT const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    ShaderEXT( ShaderEXT && rhs )             = default;\n    ShaderEXT & operator=( ShaderEXT && rhs ) = default;\n#else\n    ShaderEXT( ShaderEXT && rhs ) VULKAN_HPP_NOEXCEPT : m_shaderEXT( VULKAN_HPP_NAMESPACE::exchange( rhs.m_shaderEXT, {} ) ) {}\n\n    ShaderEXT & operator=( ShaderEXT && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_shaderEXT = VULKAN_HPP_NAMESPACE::exchange( rhs.m_shaderEXT, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR ShaderEXT( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT ShaderEXT( VkShaderEXT shaderEXT ) VULKAN_HPP_NOEXCEPT : m_shaderEXT( shaderEXT ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    ShaderEXT & operator=( VkShaderEXT shaderEXT ) VULKAN_HPP_NOEXCEPT\n    {\n      m_shaderEXT = shaderEXT;\n      return *this;\n    }\n#endif\n\n    ShaderEXT & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_shaderEXT = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkShaderEXT() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_shaderEXT;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_shaderEXT != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_shaderEXT == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkShaderEXT m_shaderEXT = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eShaderEXT>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::ShaderEXT;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkShaderEXT, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::ShaderEXT;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::ShaderEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class Image\n  {\n  public:\n    using CType      = VkImage;\n    using NativeType = VkImage;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eImage;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eImage;\n\n  public:\n    Image() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    Image( Image const & rhs )             = default;\n    Image & operator=( Image const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    Image( Image && rhs )             = default;\n    Image & operator=( Image && rhs ) = default;\n#else\n    Image( Image && rhs ) VULKAN_HPP_NOEXCEPT : m_image( VULKAN_HPP_NAMESPACE::exchange( rhs.m_image, {} ) ) {}\n\n    Image & operator=( Image && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_image = VULKAN_HPP_NAMESPACE::exchange( rhs.m_image, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR Image( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT Image( VkImage image ) VULKAN_HPP_NOEXCEPT : m_image( image ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    Image & operator=( VkImage image ) VULKAN_HPP_NOEXCEPT\n    {\n      m_image = image;\n      return *this;\n    }\n#endif\n\n    Image & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_image = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkImage() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_image;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_image != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_image == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkImage m_image = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eImage>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Image;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eImage>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Image;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkImage, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Image;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::Image>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class AccelerationStructureNV\n  {\n  public:\n    using CType      = VkAccelerationStructureNV;\n    using NativeType = VkAccelerationStructureNV;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eAccelerationStructureNV;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eAccelerationStructureNV;\n\n  public:\n    AccelerationStructureNV() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    AccelerationStructureNV( AccelerationStructureNV const & rhs )             = default;\n    AccelerationStructureNV & operator=( AccelerationStructureNV const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    AccelerationStructureNV( AccelerationStructureNV && rhs )             = default;\n    AccelerationStructureNV & operator=( AccelerationStructureNV && rhs ) = default;\n#else\n    AccelerationStructureNV( AccelerationStructureNV && rhs ) VULKAN_HPP_NOEXCEPT\n      : m_accelerationStructureNV( VULKAN_HPP_NAMESPACE::exchange( rhs.m_accelerationStructureNV, {} ) )\n    {\n    }\n\n    AccelerationStructureNV & operator=( AccelerationStructureNV && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_accelerationStructureNV = VULKAN_HPP_NAMESPACE::exchange( rhs.m_accelerationStructureNV, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR AccelerationStructureNV( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT AccelerationStructureNV( VkAccelerationStructureNV accelerationStructureNV ) VULKAN_HPP_NOEXCEPT\n      : m_accelerationStructureNV( accelerationStructureNV )\n    {\n    }\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    AccelerationStructureNV & operator=( VkAccelerationStructureNV accelerationStructureNV ) VULKAN_HPP_NOEXCEPT\n    {\n      m_accelerationStructureNV = accelerationStructureNV;\n      return *this;\n    }\n#endif\n\n    AccelerationStructureNV & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_accelerationStructureNV = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkAccelerationStructureNV() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_accelerationStructureNV;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_accelerationStructureNV != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_accelerationStructureNV == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkAccelerationStructureNV m_accelerationStructureNV = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eAccelerationStructureNV>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::AccelerationStructureNV;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eAccelerationStructureNV>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::AccelerationStructureNV;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkAccelerationStructureNV, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::AccelerationStructureNV;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::AccelerationStructureNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class OpticalFlowSessionNV\n  {\n  public:\n    using CType      = VkOpticalFlowSessionNV;\n    using NativeType = VkOpticalFlowSessionNV;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eOpticalFlowSessionNV;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n  public:\n    OpticalFlowSessionNV() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    OpticalFlowSessionNV( OpticalFlowSessionNV const & rhs )             = default;\n    OpticalFlowSessionNV & operator=( OpticalFlowSessionNV const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    OpticalFlowSessionNV( OpticalFlowSessionNV && rhs )             = default;\n    OpticalFlowSessionNV & operator=( OpticalFlowSessionNV && rhs ) = default;\n#else\n    OpticalFlowSessionNV( OpticalFlowSessionNV && rhs ) VULKAN_HPP_NOEXCEPT\n      : m_opticalFlowSessionNV( VULKAN_HPP_NAMESPACE::exchange( rhs.m_opticalFlowSessionNV, {} ) )\n    {\n    }\n\n    OpticalFlowSessionNV & operator=( OpticalFlowSessionNV && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_opticalFlowSessionNV = VULKAN_HPP_NAMESPACE::exchange( rhs.m_opticalFlowSessionNV, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR OpticalFlowSessionNV( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT OpticalFlowSessionNV( VkOpticalFlowSessionNV opticalFlowSessionNV ) VULKAN_HPP_NOEXCEPT\n      : m_opticalFlowSessionNV( opticalFlowSessionNV )\n    {\n    }\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    OpticalFlowSessionNV & operator=( VkOpticalFlowSessionNV opticalFlowSessionNV ) VULKAN_HPP_NOEXCEPT\n    {\n      m_opticalFlowSessionNV = opticalFlowSessionNV;\n      return *this;\n    }\n#endif\n\n    OpticalFlowSessionNV & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_opticalFlowSessionNV = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkOpticalFlowSessionNV() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_opticalFlowSessionNV;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_opticalFlowSessionNV != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_opticalFlowSessionNV == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkOpticalFlowSessionNV m_opticalFlowSessionNV = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eOpticalFlowSessionNV>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkOpticalFlowSessionNV, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class DescriptorUpdateTemplate\n  {\n  public:\n    using CType      = VkDescriptorUpdateTemplate;\n    using NativeType = VkDescriptorUpdateTemplate;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDescriptorUpdateTemplate;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDescriptorUpdateTemplate;\n\n  public:\n    DescriptorUpdateTemplate() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    DescriptorUpdateTemplate( DescriptorUpdateTemplate const & rhs )             = default;\n    DescriptorUpdateTemplate & operator=( DescriptorUpdateTemplate const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    DescriptorUpdateTemplate( DescriptorUpdateTemplate && rhs )             = default;\n    DescriptorUpdateTemplate & operator=( DescriptorUpdateTemplate && rhs ) = default;\n#else\n    DescriptorUpdateTemplate( DescriptorUpdateTemplate && rhs ) VULKAN_HPP_NOEXCEPT\n      : m_descriptorUpdateTemplate( VULKAN_HPP_NAMESPACE::exchange( rhs.m_descriptorUpdateTemplate, {} ) )\n    {\n    }\n\n    DescriptorUpdateTemplate & operator=( DescriptorUpdateTemplate && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_descriptorUpdateTemplate = VULKAN_HPP_NAMESPACE::exchange( rhs.m_descriptorUpdateTemplate, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR DescriptorUpdateTemplate( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT DescriptorUpdateTemplate( VkDescriptorUpdateTemplate descriptorUpdateTemplate ) VULKAN_HPP_NOEXCEPT\n      : m_descriptorUpdateTemplate( descriptorUpdateTemplate )\n    {\n    }\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    DescriptorUpdateTemplate & operator=( VkDescriptorUpdateTemplate descriptorUpdateTemplate ) VULKAN_HPP_NOEXCEPT\n    {\n      m_descriptorUpdateTemplate = descriptorUpdateTemplate;\n      return *this;\n    }\n#endif\n\n    DescriptorUpdateTemplate & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_descriptorUpdateTemplate = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkDescriptorUpdateTemplate() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_descriptorUpdateTemplate;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_descriptorUpdateTemplate != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_descriptorUpdateTemplate == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkDescriptorUpdateTemplate m_descriptorUpdateTemplate = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eDescriptorUpdateTemplate>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDescriptorUpdateTemplate>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkDescriptorUpdateTemplate, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  using DescriptorUpdateTemplateKHR = DescriptorUpdateTemplate;\n\n  class Event\n  {\n  public:\n    using CType      = VkEvent;\n    using NativeType = VkEvent;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eEvent;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eEvent;\n\n  public:\n    Event() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    Event( Event const & rhs )             = default;\n    Event & operator=( Event const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    Event( Event && rhs )             = default;\n    Event & operator=( Event && rhs ) = default;\n#else\n    Event( Event && rhs ) VULKAN_HPP_NOEXCEPT : m_event( VULKAN_HPP_NAMESPACE::exchange( rhs.m_event, {} ) ) {}\n\n    Event & operator=( Event && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_event = VULKAN_HPP_NAMESPACE::exchange( rhs.m_event, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR Event( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT Event( VkEvent event ) VULKAN_HPP_NOEXCEPT : m_event( event ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    Event & operator=( VkEvent event ) VULKAN_HPP_NOEXCEPT\n    {\n      m_event = event;\n      return *this;\n    }\n#endif\n\n    Event & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_event = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkEvent() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_event;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_event != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_event == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkEvent m_event = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eEvent>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Event;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eEvent>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Event;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkEvent, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Event;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::Event>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class AccelerationStructureKHR\n  {\n  public:\n    using CType      = VkAccelerationStructureKHR;\n    using NativeType = VkAccelerationStructureKHR;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eAccelerationStructureKHR;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eAccelerationStructureKHR;\n\n  public:\n    AccelerationStructureKHR() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    AccelerationStructureKHR( AccelerationStructureKHR const & rhs )             = default;\n    AccelerationStructureKHR & operator=( AccelerationStructureKHR const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    AccelerationStructureKHR( AccelerationStructureKHR && rhs )             = default;\n    AccelerationStructureKHR & operator=( AccelerationStructureKHR && rhs ) = default;\n#else\n    AccelerationStructureKHR( AccelerationStructureKHR && rhs ) VULKAN_HPP_NOEXCEPT\n      : m_accelerationStructureKHR( VULKAN_HPP_NAMESPACE::exchange( rhs.m_accelerationStructureKHR, {} ) )\n    {\n    }\n\n    AccelerationStructureKHR & operator=( AccelerationStructureKHR && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_accelerationStructureKHR = VULKAN_HPP_NAMESPACE::exchange( rhs.m_accelerationStructureKHR, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR AccelerationStructureKHR( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT AccelerationStructureKHR( VkAccelerationStructureKHR accelerationStructureKHR ) VULKAN_HPP_NOEXCEPT\n      : m_accelerationStructureKHR( accelerationStructureKHR )\n    {\n    }\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    AccelerationStructureKHR & operator=( VkAccelerationStructureKHR accelerationStructureKHR ) VULKAN_HPP_NOEXCEPT\n    {\n      m_accelerationStructureKHR = accelerationStructureKHR;\n      return *this;\n    }\n#endif\n\n    AccelerationStructureKHR & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_accelerationStructureKHR = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkAccelerationStructureKHR() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_accelerationStructureKHR;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_accelerationStructureKHR != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_accelerationStructureKHR == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkAccelerationStructureKHR m_accelerationStructureKHR = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eAccelerationStructureKHR>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::AccelerationStructureKHR;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eAccelerationStructureKHR>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::AccelerationStructureKHR;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkAccelerationStructureKHR, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::AccelerationStructureKHR;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::AccelerationStructureKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class MicromapEXT\n  {\n  public:\n    using CType      = VkMicromapEXT;\n    using NativeType = VkMicromapEXT;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eMicromapEXT;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n  public:\n    MicromapEXT() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    MicromapEXT( MicromapEXT const & rhs )             = default;\n    MicromapEXT & operator=( MicromapEXT const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    MicromapEXT( MicromapEXT && rhs )             = default;\n    MicromapEXT & operator=( MicromapEXT && rhs ) = default;\n#else\n    MicromapEXT( MicromapEXT && rhs ) VULKAN_HPP_NOEXCEPT : m_micromapEXT( VULKAN_HPP_NAMESPACE::exchange( rhs.m_micromapEXT, {} ) ) {}\n\n    MicromapEXT & operator=( MicromapEXT && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_micromapEXT = VULKAN_HPP_NAMESPACE::exchange( rhs.m_micromapEXT, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR MicromapEXT( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT MicromapEXT( VkMicromapEXT micromapEXT ) VULKAN_HPP_NOEXCEPT : m_micromapEXT( micromapEXT ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    MicromapEXT & operator=( VkMicromapEXT micromapEXT ) VULKAN_HPP_NOEXCEPT\n    {\n      m_micromapEXT = micromapEXT;\n      return *this;\n    }\n#endif\n\n    MicromapEXT & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_micromapEXT = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkMicromapEXT() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_micromapEXT;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_micromapEXT != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_micromapEXT == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkMicromapEXT m_micromapEXT = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eMicromapEXT>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::MicromapEXT;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkMicromapEXT, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::MicromapEXT;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::MicromapEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class CommandBuffer\n  {\n  public:\n    using CType      = VkCommandBuffer;\n    using NativeType = VkCommandBuffer;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eCommandBuffer;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCommandBuffer;\n\n  public:\n    CommandBuffer() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    CommandBuffer( CommandBuffer const & rhs )             = default;\n    CommandBuffer & operator=( CommandBuffer const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    CommandBuffer( CommandBuffer && rhs )             = default;\n    CommandBuffer & operator=( CommandBuffer && rhs ) = default;\n#else\n    CommandBuffer( CommandBuffer && rhs ) VULKAN_HPP_NOEXCEPT : m_commandBuffer( VULKAN_HPP_NAMESPACE::exchange( rhs.m_commandBuffer, {} ) ) {}\n\n    CommandBuffer & operator=( CommandBuffer && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_commandBuffer = VULKAN_HPP_NAMESPACE::exchange( rhs.m_commandBuffer, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR CommandBuffer( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    CommandBuffer( VkCommandBuffer commandBuffer ) VULKAN_HPP_NOEXCEPT : m_commandBuffer( commandBuffer ) {}\n\n    CommandBuffer & operator=( VkCommandBuffer commandBuffer ) VULKAN_HPP_NOEXCEPT\n    {\n      m_commandBuffer = commandBuffer;\n      return *this;\n    }\n\n    CommandBuffer & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_commandBuffer = {};\n      return *this;\n    }\n\n    //=== VK_VERSION_1_0 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result begin( const VULKAN_HPP_NAMESPACE::CommandBufferBeginInfo * pBeginInfo,\n                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type begin( const VULKAN_HPP_NAMESPACE::CommandBufferBeginInfo & beginInfo,\n                                                                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result end( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type end( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result reset( VULKAN_HPP_NAMESPACE::CommandBufferResetFlags flags,\n                                       Dispatch const & d                            VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    typename ResultValueType<void>::type reset( VULKAN_HPP_NAMESPACE::CommandBufferResetFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                                Dispatch const & d                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindPipeline( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint,\n                       VULKAN_HPP_NAMESPACE::Pipeline          pipeline,\n                       Dispatch const & d                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setViewport( uint32_t                               firstViewport,\n                      uint32_t                               viewportCount,\n                      const VULKAN_HPP_NAMESPACE::Viewport * pViewports,\n                      Dispatch const & d                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setViewport( uint32_t                                                                       firstViewport,\n                      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Viewport> const & viewports,\n                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setScissor( uint32_t                             firstScissor,\n                     uint32_t                             scissorCount,\n                     const VULKAN_HPP_NAMESPACE::Rect2D * pScissors,\n                     Dispatch const & d                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setScissor( uint32_t                                                                     firstScissor,\n                     VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & scissors,\n                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setLineWidth( float lineWidth, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDepthBias( float              depthBiasConstantFactor,\n                       float              depthBiasClamp,\n                       float              depthBiasSlopeFactor,\n                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setBlendConstants( const float blendConstants[4], Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDepthBounds( float minDepthBounds, float maxDepthBounds, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setStencilCompareMask( VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask,\n                                uint32_t                               compareMask,\n                                Dispatch const & d                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setStencilWriteMask( VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask,\n                              uint32_t                               writeMask,\n                              Dispatch const & d                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setStencilReference( VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask,\n                              uint32_t                               reference,\n                              Dispatch const & d                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindDescriptorSets( VULKAN_HPP_NAMESPACE::PipelineBindPoint     pipelineBindPoint,\n                             VULKAN_HPP_NAMESPACE::PipelineLayout        layout,\n                             uint32_t                                    firstSet,\n                             uint32_t                                    descriptorSetCount,\n                             const VULKAN_HPP_NAMESPACE::DescriptorSet * pDescriptorSets,\n                             uint32_t                                    dynamicOffsetCount,\n                             const uint32_t *                            pDynamicOffsets,\n                             Dispatch const & d                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindDescriptorSets( VULKAN_HPP_NAMESPACE::PipelineBindPoint                                             pipelineBindPoint,\n                             VULKAN_HPP_NAMESPACE::PipelineLayout                                                layout,\n                             uint32_t                                                                            firstSet,\n                             VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DescriptorSet> const & descriptorSets,\n                             VULKAN_HPP_NAMESPACE::ArrayProxy<const uint32_t> const &                            dynamicOffsets,\n                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindIndexBuffer( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                          VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                          VULKAN_HPP_NAMESPACE::IndexType  indexType,\n                          Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindVertexBuffers( uint32_t                                 firstBinding,\n                            uint32_t                                 bindingCount,\n                            const VULKAN_HPP_NAMESPACE::Buffer *     pBuffers,\n                            const VULKAN_HPP_NAMESPACE::DeviceSize * pOffsets,\n                            Dispatch const & d                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindVertexBuffers( uint32_t                                                                         firstBinding,\n                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &     buffers,\n                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & offsets,\n                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void draw( uint32_t           vertexCount,\n               uint32_t           instanceCount,\n               uint32_t           firstVertex,\n               uint32_t           firstInstance,\n               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void drawIndexed( uint32_t           indexCount,\n                      uint32_t           instanceCount,\n                      uint32_t           firstIndex,\n                      int32_t            vertexOffset,\n                      uint32_t           firstInstance,\n                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void drawIndirect( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                       VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                       uint32_t                         drawCount,\n                       uint32_t                         stride,\n                       Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void drawIndexedIndirect( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                              VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                              uint32_t                         drawCount,\n                              uint32_t                         stride,\n                              Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void dispatch( uint32_t           groupCountX,\n                   uint32_t           groupCountY,\n                   uint32_t           groupCountZ,\n                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void dispatchIndirect( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                           VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                           Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyBuffer( VULKAN_HPP_NAMESPACE::Buffer             srcBuffer,\n                     VULKAN_HPP_NAMESPACE::Buffer             dstBuffer,\n                     uint32_t                                 regionCount,\n                     const VULKAN_HPP_NAMESPACE::BufferCopy * pRegions,\n                     Dispatch const & d                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyBuffer( VULKAN_HPP_NAMESPACE::Buffer                                                     srcBuffer,\n                     VULKAN_HPP_NAMESPACE::Buffer                                                     dstBuffer,\n                     VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferCopy> const & regions,\n                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyImage( VULKAN_HPP_NAMESPACE::Image             srcImage,\n                    VULKAN_HPP_NAMESPACE::ImageLayout       srcImageLayout,\n                    VULKAN_HPP_NAMESPACE::Image             dstImage,\n                    VULKAN_HPP_NAMESPACE::ImageLayout       dstImageLayout,\n                    uint32_t                                regionCount,\n                    const VULKAN_HPP_NAMESPACE::ImageCopy * pRegions,\n                    Dispatch const & d                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyImage( VULKAN_HPP_NAMESPACE::Image                                                     srcImage,\n                    VULKAN_HPP_NAMESPACE::ImageLayout                                               srcImageLayout,\n                    VULKAN_HPP_NAMESPACE::Image                                                     dstImage,\n                    VULKAN_HPP_NAMESPACE::ImageLayout                                               dstImageLayout,\n                    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageCopy> const & regions,\n                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void blitImage( VULKAN_HPP_NAMESPACE::Image             srcImage,\n                    VULKAN_HPP_NAMESPACE::ImageLayout       srcImageLayout,\n                    VULKAN_HPP_NAMESPACE::Image             dstImage,\n                    VULKAN_HPP_NAMESPACE::ImageLayout       dstImageLayout,\n                    uint32_t                                regionCount,\n                    const VULKAN_HPP_NAMESPACE::ImageBlit * pRegions,\n                    VULKAN_HPP_NAMESPACE::Filter            filter,\n                    Dispatch const & d                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void blitImage( VULKAN_HPP_NAMESPACE::Image                                                     srcImage,\n                    VULKAN_HPP_NAMESPACE::ImageLayout                                               srcImageLayout,\n                    VULKAN_HPP_NAMESPACE::Image                                                     dstImage,\n                    VULKAN_HPP_NAMESPACE::ImageLayout                                               dstImageLayout,\n                    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageBlit> const & regions,\n                    VULKAN_HPP_NAMESPACE::Filter                                                    filter,\n                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyBufferToImage( VULKAN_HPP_NAMESPACE::Buffer                  srcBuffer,\n                            VULKAN_HPP_NAMESPACE::Image                   dstImage,\n                            VULKAN_HPP_NAMESPACE::ImageLayout             dstImageLayout,\n                            uint32_t                                      regionCount,\n                            const VULKAN_HPP_NAMESPACE::BufferImageCopy * pRegions,\n                            Dispatch const & d                            VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyBufferToImage( VULKAN_HPP_NAMESPACE::Buffer                                                          srcBuffer,\n                            VULKAN_HPP_NAMESPACE::Image                                                           dstImage,\n                            VULKAN_HPP_NAMESPACE::ImageLayout                                                     dstImageLayout,\n                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferImageCopy> const & regions,\n                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyImageToBuffer( VULKAN_HPP_NAMESPACE::Image                   srcImage,\n                            VULKAN_HPP_NAMESPACE::ImageLayout             srcImageLayout,\n                            VULKAN_HPP_NAMESPACE::Buffer                  dstBuffer,\n                            uint32_t                                      regionCount,\n                            const VULKAN_HPP_NAMESPACE::BufferImageCopy * pRegions,\n                            Dispatch const & d                            VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyImageToBuffer( VULKAN_HPP_NAMESPACE::Image                                                           srcImage,\n                            VULKAN_HPP_NAMESPACE::ImageLayout                                                     srcImageLayout,\n                            VULKAN_HPP_NAMESPACE::Buffer                                                          dstBuffer,\n                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferImageCopy> const & regions,\n                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void updateBuffer( VULKAN_HPP_NAMESPACE::Buffer     dstBuffer,\n                       VULKAN_HPP_NAMESPACE::DeviceSize dstOffset,\n                       VULKAN_HPP_NAMESPACE::DeviceSize dataSize,\n                       const void *                     pData,\n                       Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename DataType, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void updateBuffer( VULKAN_HPP_NAMESPACE::Buffer                             dstBuffer,\n                       VULKAN_HPP_NAMESPACE::DeviceSize                         dstOffset,\n                       VULKAN_HPP_NAMESPACE::ArrayProxy<const DataType> const & data,\n                       Dispatch const & d                                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void fillBuffer( VULKAN_HPP_NAMESPACE::Buffer     dstBuffer,\n                     VULKAN_HPP_NAMESPACE::DeviceSize dstOffset,\n                     VULKAN_HPP_NAMESPACE::DeviceSize size,\n                     uint32_t                         data,\n                     Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void clearColorImage( VULKAN_HPP_NAMESPACE::Image                         image,\n                          VULKAN_HPP_NAMESPACE::ImageLayout                   imageLayout,\n                          const VULKAN_HPP_NAMESPACE::ClearColorValue *       pColor,\n                          uint32_t                                            rangeCount,\n                          const VULKAN_HPP_NAMESPACE::ImageSubresourceRange * pRanges,\n                          Dispatch const & d                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void clearColorImage( VULKAN_HPP_NAMESPACE::Image                                                                 image,\n                          VULKAN_HPP_NAMESPACE::ImageLayout                                                           imageLayout,\n                          const VULKAN_HPP_NAMESPACE::ClearColorValue &                                               color,\n                          VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageSubresourceRange> const & ranges,\n                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void clearDepthStencilImage( VULKAN_HPP_NAMESPACE::Image                          image,\n                                 VULKAN_HPP_NAMESPACE::ImageLayout                    imageLayout,\n                                 const VULKAN_HPP_NAMESPACE::ClearDepthStencilValue * pDepthStencil,\n                                 uint32_t                                             rangeCount,\n                                 const VULKAN_HPP_NAMESPACE::ImageSubresourceRange *  pRanges,\n                                 Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void clearDepthStencilImage( VULKAN_HPP_NAMESPACE::Image                                                                 image,\n                                 VULKAN_HPP_NAMESPACE::ImageLayout                                                           imageLayout,\n                                 const VULKAN_HPP_NAMESPACE::ClearDepthStencilValue &                                        depthStencil,\n                                 VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageSubresourceRange> const & ranges,\n                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void clearAttachments( uint32_t                                      attachmentCount,\n                           const VULKAN_HPP_NAMESPACE::ClearAttachment * pAttachments,\n                           uint32_t                                      rectCount,\n                           const VULKAN_HPP_NAMESPACE::ClearRect *       pRects,\n                           Dispatch const & d                            VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void clearAttachments( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ClearAttachment> const & attachments,\n                           VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ClearRect> const &       rects,\n                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void resolveImage( VULKAN_HPP_NAMESPACE::Image                srcImage,\n                       VULKAN_HPP_NAMESPACE::ImageLayout          srcImageLayout,\n                       VULKAN_HPP_NAMESPACE::Image                dstImage,\n                       VULKAN_HPP_NAMESPACE::ImageLayout          dstImageLayout,\n                       uint32_t                                   regionCount,\n                       const VULKAN_HPP_NAMESPACE::ImageResolve * pRegions,\n                       Dispatch const & d                         VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void resolveImage( VULKAN_HPP_NAMESPACE::Image                                                        srcImage,\n                       VULKAN_HPP_NAMESPACE::ImageLayout                                                  srcImageLayout,\n                       VULKAN_HPP_NAMESPACE::Image                                                        dstImage,\n                       VULKAN_HPP_NAMESPACE::ImageLayout                                                  dstImageLayout,\n                       VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageResolve> const & regions,\n                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setEvent( VULKAN_HPP_NAMESPACE::Event              event,\n                   VULKAN_HPP_NAMESPACE::PipelineStageFlags stageMask,\n                   Dispatch const & d                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void resetEvent( VULKAN_HPP_NAMESPACE::Event              event,\n                     VULKAN_HPP_NAMESPACE::PipelineStageFlags stageMask,\n                     Dispatch const & d                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void waitEvents( uint32_t                                          eventCount,\n                     const VULKAN_HPP_NAMESPACE::Event *               pEvents,\n                     VULKAN_HPP_NAMESPACE::PipelineStageFlags          srcStageMask,\n                     VULKAN_HPP_NAMESPACE::PipelineStageFlags          dstStageMask,\n                     uint32_t                                          memoryBarrierCount,\n                     const VULKAN_HPP_NAMESPACE::MemoryBarrier *       pMemoryBarriers,\n                     uint32_t                                          bufferMemoryBarrierCount,\n                     const VULKAN_HPP_NAMESPACE::BufferMemoryBarrier * pBufferMemoryBarriers,\n                     uint32_t                                          imageMemoryBarrierCount,\n                     const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier *  pImageMemoryBarriers,\n                     Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void waitEvents( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Event> const &               events,\n                     VULKAN_HPP_NAMESPACE::PipelineStageFlags                                                  srcStageMask,\n                     VULKAN_HPP_NAMESPACE::PipelineStageFlags                                                  dstStageMask,\n                     VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MemoryBarrier> const &       memoryBarriers,\n                     VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferMemoryBarrier> const & bufferMemoryBarriers,\n                     VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier> const &  imageMemoryBarriers,\n                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pipelineBarrier( VULKAN_HPP_NAMESPACE::PipelineStageFlags          srcStageMask,\n                          VULKAN_HPP_NAMESPACE::PipelineStageFlags          dstStageMask,\n                          VULKAN_HPP_NAMESPACE::DependencyFlags             dependencyFlags,\n                          uint32_t                                          memoryBarrierCount,\n                          const VULKAN_HPP_NAMESPACE::MemoryBarrier *       pMemoryBarriers,\n                          uint32_t                                          bufferMemoryBarrierCount,\n                          const VULKAN_HPP_NAMESPACE::BufferMemoryBarrier * pBufferMemoryBarriers,\n                          uint32_t                                          imageMemoryBarrierCount,\n                          const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier *  pImageMemoryBarriers,\n                          Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pipelineBarrier( VULKAN_HPP_NAMESPACE::PipelineStageFlags                                                  srcStageMask,\n                          VULKAN_HPP_NAMESPACE::PipelineStageFlags                                                  dstStageMask,\n                          VULKAN_HPP_NAMESPACE::DependencyFlags                                                     dependencyFlags,\n                          VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MemoryBarrier> const &       memoryBarriers,\n                          VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferMemoryBarrier> const & bufferMemoryBarriers,\n                          VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier> const &  imageMemoryBarriers,\n                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void beginQuery( VULKAN_HPP_NAMESPACE::QueryPool         queryPool,\n                     uint32_t                                query,\n                     VULKAN_HPP_NAMESPACE::QueryControlFlags flags,\n                     Dispatch const & d                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void endQuery( VULKAN_HPP_NAMESPACE::QueryPool queryPool,\n                   uint32_t                        query,\n                   Dispatch const & d              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void resetQueryPool( VULKAN_HPP_NAMESPACE::QueryPool queryPool,\n                         uint32_t                        firstQuery,\n                         uint32_t                        queryCount,\n                         Dispatch const & d              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void writeTimestamp( VULKAN_HPP_NAMESPACE::PipelineStageFlagBits pipelineStage,\n                         VULKAN_HPP_NAMESPACE::QueryPool             queryPool,\n                         uint32_t                                    query,\n                         Dispatch const & d                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyQueryPoolResults( VULKAN_HPP_NAMESPACE::QueryPool        queryPool,\n                               uint32_t                               firstQuery,\n                               uint32_t                               queryCount,\n                               VULKAN_HPP_NAMESPACE::Buffer           dstBuffer,\n                               VULKAN_HPP_NAMESPACE::DeviceSize       dstOffset,\n                               VULKAN_HPP_NAMESPACE::DeviceSize       stride,\n                               VULKAN_HPP_NAMESPACE::QueryResultFlags flags,\n                               Dispatch const & d                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pushConstants( VULKAN_HPP_NAMESPACE::PipelineLayout   layout,\n                        VULKAN_HPP_NAMESPACE::ShaderStageFlags stageFlags,\n                        uint32_t                               offset,\n                        uint32_t                               size,\n                        const void *                           pValues,\n                        Dispatch const & d                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename ValuesType, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pushConstants( VULKAN_HPP_NAMESPACE::PipelineLayout                       layout,\n                        VULKAN_HPP_NAMESPACE::ShaderStageFlags                     stageFlags,\n                        uint32_t                                                   offset,\n                        VULKAN_HPP_NAMESPACE::ArrayProxy<const ValuesType> const & values,\n                        Dispatch const & d                                         VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void beginRenderPass( const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo * pRenderPassBegin,\n                          VULKAN_HPP_NAMESPACE::SubpassContents             contents,\n                          Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void beginRenderPass( const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo & renderPassBegin,\n                          VULKAN_HPP_NAMESPACE::SubpassContents             contents,\n                          Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void nextSubpass( VULKAN_HPP_NAMESPACE::SubpassContents contents, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void endRenderPass( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void executeCommands( uint32_t                                    commandBufferCount,\n                          const VULKAN_HPP_NAMESPACE::CommandBuffer * pCommandBuffers,\n                          Dispatch const & d                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void executeCommands( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CommandBuffer> const & commandBuffers,\n                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_VERSION_1_1 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDeviceMask( uint32_t deviceMask, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void dispatchBase( uint32_t           baseGroupX,\n                       uint32_t           baseGroupY,\n                       uint32_t           baseGroupZ,\n                       uint32_t           groupCountX,\n                       uint32_t           groupCountY,\n                       uint32_t           groupCountZ,\n                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_VERSION_1_2 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void drawIndirectCount( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                            VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                            VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                            VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                            uint32_t                         maxDrawCount,\n                            uint32_t                         stride,\n                            Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void drawIndexedIndirectCount( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                   VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                   VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                   VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                   uint32_t                         maxDrawCount,\n                                   uint32_t                         stride,\n                                   Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void beginRenderPass2( const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo * pRenderPassBegin,\n                           const VULKAN_HPP_NAMESPACE::SubpassBeginInfo *    pSubpassBeginInfo,\n                           Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void beginRenderPass2( const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo & renderPassBegin,\n                           const VULKAN_HPP_NAMESPACE::SubpassBeginInfo &    subpassBeginInfo,\n                           Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void nextSubpass2( const VULKAN_HPP_NAMESPACE::SubpassBeginInfo * pSubpassBeginInfo,\n                       const VULKAN_HPP_NAMESPACE::SubpassEndInfo *   pSubpassEndInfo,\n                       Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void nextSubpass2( const VULKAN_HPP_NAMESPACE::SubpassBeginInfo & subpassBeginInfo,\n                       const VULKAN_HPP_NAMESPACE::SubpassEndInfo &   subpassEndInfo,\n                       Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void endRenderPass2( const VULKAN_HPP_NAMESPACE::SubpassEndInfo * pSubpassEndInfo,\n                         Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void endRenderPass2( const VULKAN_HPP_NAMESPACE::SubpassEndInfo & subpassEndInfo,\n                         Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_VERSION_1_3 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setEvent2( VULKAN_HPP_NAMESPACE::Event                  event,\n                    const VULKAN_HPP_NAMESPACE::DependencyInfo * pDependencyInfo,\n                    Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setEvent2( VULKAN_HPP_NAMESPACE::Event                  event,\n                    const VULKAN_HPP_NAMESPACE::DependencyInfo & dependencyInfo,\n                    Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void resetEvent2( VULKAN_HPP_NAMESPACE::Event               event,\n                      VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stageMask,\n                      Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void waitEvents2( uint32_t                                     eventCount,\n                      const VULKAN_HPP_NAMESPACE::Event *          pEvents,\n                      const VULKAN_HPP_NAMESPACE::DependencyInfo * pDependencyInfos,\n                      Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void waitEvents2( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Event> const &          events,\n                      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DependencyInfo> const & dependencyInfos,\n                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pipelineBarrier2( const VULKAN_HPP_NAMESPACE::DependencyInfo * pDependencyInfo,\n                           Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pipelineBarrier2( const VULKAN_HPP_NAMESPACE::DependencyInfo & dependencyInfo,\n                           Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void writeTimestamp2( VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stage,\n                          VULKAN_HPP_NAMESPACE::QueryPool           queryPool,\n                          uint32_t                                  query,\n                          Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyBuffer2( const VULKAN_HPP_NAMESPACE::CopyBufferInfo2 * pCopyBufferInfo,\n                      Dispatch const & d                            VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyBuffer2( const VULKAN_HPP_NAMESPACE::CopyBufferInfo2 & copyBufferInfo,\n                      Dispatch const & d                            VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyImage2( const VULKAN_HPP_NAMESPACE::CopyImageInfo2 * pCopyImageInfo,\n                     Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyImage2( const VULKAN_HPP_NAMESPACE::CopyImageInfo2 & copyImageInfo,\n                     Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyBufferToImage2( const VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2 * pCopyBufferToImageInfo,\n                             Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyBufferToImage2( const VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2 & copyBufferToImageInfo,\n                             Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyImageToBuffer2( const VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2 * pCopyImageToBufferInfo,\n                             Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyImageToBuffer2( const VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2 & copyImageToBufferInfo,\n                             Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void blitImage2( const VULKAN_HPP_NAMESPACE::BlitImageInfo2 * pBlitImageInfo,\n                     Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void blitImage2( const VULKAN_HPP_NAMESPACE::BlitImageInfo2 & blitImageInfo,\n                     Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void resolveImage2( const VULKAN_HPP_NAMESPACE::ResolveImageInfo2 * pResolveImageInfo,\n                        Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void resolveImage2( const VULKAN_HPP_NAMESPACE::ResolveImageInfo2 & resolveImageInfo,\n                        Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void beginRendering( const VULKAN_HPP_NAMESPACE::RenderingInfo * pRenderingInfo,\n                         Dispatch const & d                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void beginRendering( const VULKAN_HPP_NAMESPACE::RenderingInfo & renderingInfo,\n                         Dispatch const & d                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void endRendering( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setCullMode( VULKAN_HPP_NAMESPACE::CullModeFlags cullMode, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setFrontFace( VULKAN_HPP_NAMESPACE::FrontFace frontFace, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setPrimitiveTopology( VULKAN_HPP_NAMESPACE::PrimitiveTopology primitiveTopology,\n                               Dispatch const & d                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setViewportWithCount( uint32_t                               viewportCount,\n                               const VULKAN_HPP_NAMESPACE::Viewport * pViewports,\n                               Dispatch const & d                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setViewportWithCount( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Viewport> const & viewports,\n                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setScissorWithCount( uint32_t                             scissorCount,\n                              const VULKAN_HPP_NAMESPACE::Rect2D * pScissors,\n                              Dispatch const & d                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setScissorWithCount( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & scissors,\n                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindVertexBuffers2( uint32_t                                 firstBinding,\n                             uint32_t                                 bindingCount,\n                             const VULKAN_HPP_NAMESPACE::Buffer *     pBuffers,\n                             const VULKAN_HPP_NAMESPACE::DeviceSize * pOffsets,\n                             const VULKAN_HPP_NAMESPACE::DeviceSize * pSizes,\n                             const VULKAN_HPP_NAMESPACE::DeviceSize * pStrides,\n                             Dispatch const & d                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindVertexBuffers2(\n      uint32_t                                                                                 firstBinding,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &             buffers,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &         offsets,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & sizes   VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & strides VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDepthTestEnable( VULKAN_HPP_NAMESPACE::Bool32 depthTestEnable,\n                             Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDepthWriteEnable( VULKAN_HPP_NAMESPACE::Bool32 depthWriteEnable,\n                              Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDepthCompareOp( VULKAN_HPP_NAMESPACE::CompareOp depthCompareOp,\n                            Dispatch const & d              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDepthBoundsTestEnable( VULKAN_HPP_NAMESPACE::Bool32 depthBoundsTestEnable,\n                                   Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setStencilTestEnable( VULKAN_HPP_NAMESPACE::Bool32 stencilTestEnable,\n                               Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setStencilOp( VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask,\n                       VULKAN_HPP_NAMESPACE::StencilOp        failOp,\n                       VULKAN_HPP_NAMESPACE::StencilOp        passOp,\n                       VULKAN_HPP_NAMESPACE::StencilOp        depthFailOp,\n                       VULKAN_HPP_NAMESPACE::CompareOp        compareOp,\n                       Dispatch const & d                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setRasterizerDiscardEnable( VULKAN_HPP_NAMESPACE::Bool32 rasterizerDiscardEnable,\n                                     Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDepthBiasEnable( VULKAN_HPP_NAMESPACE::Bool32 depthBiasEnable,\n                             Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setPrimitiveRestartEnable( VULKAN_HPP_NAMESPACE::Bool32 primitiveRestartEnable,\n                                    Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_VERSION_1_4 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setLineStipple( uint32_t           lineStippleFactor,\n                         uint16_t           lineStipplePattern,\n                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindIndexBuffer2( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                           VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                           VULKAN_HPP_NAMESPACE::DeviceSize size,\n                           VULKAN_HPP_NAMESPACE::IndexType  indexType,\n                           Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pushDescriptorSet( VULKAN_HPP_NAMESPACE::PipelineBindPoint          pipelineBindPoint,\n                            VULKAN_HPP_NAMESPACE::PipelineLayout             layout,\n                            uint32_t                                         set,\n                            uint32_t                                         descriptorWriteCount,\n                            const VULKAN_HPP_NAMESPACE::WriteDescriptorSet * pDescriptorWrites,\n                            Dispatch const & d                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pushDescriptorSet( VULKAN_HPP_NAMESPACE::PipelineBindPoint                                                  pipelineBindPoint,\n                            VULKAN_HPP_NAMESPACE::PipelineLayout                                                     layout,\n                            uint32_t                                                                                 set,\n                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteDescriptorSet> const & descriptorWrites,\n                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pushDescriptorSetWithTemplate( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,\n                                        VULKAN_HPP_NAMESPACE::PipelineLayout           layout,\n                                        uint32_t                                       set,\n                                        const void *                                   pData,\n                                        Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename DataType, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pushDescriptorSetWithTemplate( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,\n                                        VULKAN_HPP_NAMESPACE::PipelineLayout           layout,\n                                        uint32_t                                       set,\n                                        DataType const &                               data,\n                                        Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setRenderingAttachmentLocations( const VULKAN_HPP_NAMESPACE::RenderingAttachmentLocationInfo * pLocationInfo,\n                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setRenderingAttachmentLocations( const VULKAN_HPP_NAMESPACE::RenderingAttachmentLocationInfo & locationInfo,\n                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setRenderingInputAttachmentIndices( const VULKAN_HPP_NAMESPACE::RenderingInputAttachmentIndexInfo * pInputAttachmentIndexInfo,\n                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setRenderingInputAttachmentIndices( const VULKAN_HPP_NAMESPACE::RenderingInputAttachmentIndexInfo & inputAttachmentIndexInfo,\n                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindDescriptorSets2( const VULKAN_HPP_NAMESPACE::BindDescriptorSetsInfo * pBindDescriptorSetsInfo,\n                              Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindDescriptorSets2( const VULKAN_HPP_NAMESPACE::BindDescriptorSetsInfo & bindDescriptorSetsInfo,\n                              Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pushConstants2( const VULKAN_HPP_NAMESPACE::PushConstantsInfo * pPushConstantsInfo,\n                         Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pushConstants2( const VULKAN_HPP_NAMESPACE::PushConstantsInfo & pushConstantsInfo,\n                         Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pushDescriptorSet2( const VULKAN_HPP_NAMESPACE::PushDescriptorSetInfo * pPushDescriptorSetInfo,\n                             Dispatch const & d                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pushDescriptorSet2( const VULKAN_HPP_NAMESPACE::PushDescriptorSetInfo & pushDescriptorSetInfo,\n                             Dispatch const & d                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pushDescriptorSetWithTemplate2( const VULKAN_HPP_NAMESPACE::PushDescriptorSetWithTemplateInfo * pPushDescriptorSetWithTemplateInfo,\n                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pushDescriptorSetWithTemplate2( const VULKAN_HPP_NAMESPACE::PushDescriptorSetWithTemplateInfo & pushDescriptorSetWithTemplateInfo,\n                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_debug_marker ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void debugMarkerBeginEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT * pMarkerInfo,\n                              Dispatch const & d                                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void debugMarkerBeginEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT & markerInfo,\n                              Dispatch const & d                                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void debugMarkerEndEXT( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void debugMarkerInsertEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT * pMarkerInfo,\n                               Dispatch const & d                                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void debugMarkerInsertEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT & markerInfo,\n                               Dispatch const & d                                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_video_queue ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void beginVideoCodingKHR( const VULKAN_HPP_NAMESPACE::VideoBeginCodingInfoKHR * pBeginInfo,\n                              Dispatch const & d                                    VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void beginVideoCodingKHR( const VULKAN_HPP_NAMESPACE::VideoBeginCodingInfoKHR & beginInfo,\n                              Dispatch const & d                                    VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void endVideoCodingKHR( const VULKAN_HPP_NAMESPACE::VideoEndCodingInfoKHR * pEndCodingInfo,\n                            Dispatch const & d                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void endVideoCodingKHR( const VULKAN_HPP_NAMESPACE::VideoEndCodingInfoKHR & endCodingInfo,\n                            Dispatch const & d                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void controlVideoCodingKHR( const VULKAN_HPP_NAMESPACE::VideoCodingControlInfoKHR * pCodingControlInfo,\n                                Dispatch const & d                                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void controlVideoCodingKHR( const VULKAN_HPP_NAMESPACE::VideoCodingControlInfoKHR & codingControlInfo,\n                                Dispatch const & d                                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_video_decode_queue ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void decodeVideoKHR( const VULKAN_HPP_NAMESPACE::VideoDecodeInfoKHR * pDecodeInfo,\n                         Dispatch const & d                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void decodeVideoKHR( const VULKAN_HPP_NAMESPACE::VideoDecodeInfoKHR & decodeInfo,\n                         Dispatch const & d                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_transform_feedback ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindTransformFeedbackBuffersEXT( uint32_t                                 firstBinding,\n                                          uint32_t                                 bindingCount,\n                                          const VULKAN_HPP_NAMESPACE::Buffer *     pBuffers,\n                                          const VULKAN_HPP_NAMESPACE::DeviceSize * pOffsets,\n                                          const VULKAN_HPP_NAMESPACE::DeviceSize * pSizes,\n                                          Dispatch const & d                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindTransformFeedbackBuffersEXT( uint32_t                                                                         firstBinding,\n                                          VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &     buffers,\n                                          VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & offsets,\n                                          VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & sizes\n                                                             VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void beginTransformFeedbackEXT( uint32_t                                 firstCounterBuffer,\n                                    uint32_t                                 counterBufferCount,\n                                    const VULKAN_HPP_NAMESPACE::Buffer *     pCounterBuffers,\n                                    const VULKAN_HPP_NAMESPACE::DeviceSize * pCounterBufferOffsets,\n                                    Dispatch const & d                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void beginTransformFeedbackEXT( uint32_t                                                                     firstCounterBuffer,\n                                    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const & counterBuffers,\n                                    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & counterBufferOffsets\n                                                       VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void endTransformFeedbackEXT( uint32_t                                 firstCounterBuffer,\n                                  uint32_t                                 counterBufferCount,\n                                  const VULKAN_HPP_NAMESPACE::Buffer *     pCounterBuffers,\n                                  const VULKAN_HPP_NAMESPACE::DeviceSize * pCounterBufferOffsets,\n                                  Dispatch const & d                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void endTransformFeedbackEXT( uint32_t                                                                     firstCounterBuffer,\n                                  VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const & counterBuffers,\n                                  VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & counterBufferOffsets\n                                                     VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void beginQueryIndexedEXT( VULKAN_HPP_NAMESPACE::QueryPool         queryPool,\n                               uint32_t                                query,\n                               VULKAN_HPP_NAMESPACE::QueryControlFlags flags,\n                               uint32_t                                index,\n                               Dispatch const & d                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void endQueryIndexedEXT( VULKAN_HPP_NAMESPACE::QueryPool queryPool,\n                             uint32_t                        query,\n                             uint32_t                        index,\n                             Dispatch const & d              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void drawIndirectByteCountEXT( uint32_t                         instanceCount,\n                                   uint32_t                         firstInstance,\n                                   VULKAN_HPP_NAMESPACE::Buffer     counterBuffer,\n                                   VULKAN_HPP_NAMESPACE::DeviceSize counterBufferOffset,\n                                   uint32_t                         counterOffset,\n                                   uint32_t                         vertexStride,\n                                   Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_NVX_binary_import ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void cuLaunchKernelNVX( const VULKAN_HPP_NAMESPACE::CuLaunchInfoNVX * pLaunchInfo,\n                            Dispatch const & d                            VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void cuLaunchKernelNVX( const VULKAN_HPP_NAMESPACE::CuLaunchInfoNVX & launchInfo,\n                            Dispatch const & d                            VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_AMD_draw_indirect_count ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void drawIndirectCountAMD( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                               VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                               VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                               VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                               uint32_t                         maxDrawCount,\n                               uint32_t                         stride,\n                               Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void drawIndexedIndirectCountAMD( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                      VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                      VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                      VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                      uint32_t                         maxDrawCount,\n                                      uint32_t                         stride,\n                                      Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_KHR_dynamic_rendering ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void beginRenderingKHR( const VULKAN_HPP_NAMESPACE::RenderingInfo * pRenderingInfo,\n                            Dispatch const & d                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void beginRenderingKHR( const VULKAN_HPP_NAMESPACE::RenderingInfo & renderingInfo,\n                            Dispatch const & d                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void endRenderingKHR( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_KHR_device_group ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDeviceMaskKHR( uint32_t deviceMask, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void dispatchBaseKHR( uint32_t           baseGroupX,\n                          uint32_t           baseGroupY,\n                          uint32_t           baseGroupZ,\n                          uint32_t           groupCountX,\n                          uint32_t           groupCountY,\n                          uint32_t           groupCountZ,\n                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_KHR_push_descriptor ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pushDescriptorSetKHR( VULKAN_HPP_NAMESPACE::PipelineBindPoint          pipelineBindPoint,\n                               VULKAN_HPP_NAMESPACE::PipelineLayout             layout,\n                               uint32_t                                         set,\n                               uint32_t                                         descriptorWriteCount,\n                               const VULKAN_HPP_NAMESPACE::WriteDescriptorSet * pDescriptorWrites,\n                               Dispatch const & d                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pushDescriptorSetKHR( VULKAN_HPP_NAMESPACE::PipelineBindPoint                                                  pipelineBindPoint,\n                               VULKAN_HPP_NAMESPACE::PipelineLayout                                                     layout,\n                               uint32_t                                                                                 set,\n                               VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteDescriptorSet> const & descriptorWrites,\n                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pushDescriptorSetWithTemplateKHR( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,\n                                           VULKAN_HPP_NAMESPACE::PipelineLayout           layout,\n                                           uint32_t                                       set,\n                                           const void *                                   pData,\n                                           Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename DataType, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pushDescriptorSetWithTemplateKHR( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,\n                                           VULKAN_HPP_NAMESPACE::PipelineLayout           layout,\n                                           uint32_t                                       set,\n                                           DataType const &                               data,\n                                           Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_conditional_rendering ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void beginConditionalRenderingEXT( const VULKAN_HPP_NAMESPACE::ConditionalRenderingBeginInfoEXT * pConditionalRenderingBegin,\n                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void beginConditionalRenderingEXT( const VULKAN_HPP_NAMESPACE::ConditionalRenderingBeginInfoEXT & conditionalRenderingBegin,\n                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void endConditionalRenderingEXT( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_NV_clip_space_w_scaling ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setViewportWScalingNV( uint32_t                                         firstViewport,\n                                uint32_t                                         viewportCount,\n                                const VULKAN_HPP_NAMESPACE::ViewportWScalingNV * pViewportWScalings,\n                                Dispatch const & d                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setViewportWScalingNV( uint32_t                                                                                 firstViewport,\n                                VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ViewportWScalingNV> const & viewportWScalings,\n                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_discard_rectangles ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDiscardRectangleEXT( uint32_t                             firstDiscardRectangle,\n                                 uint32_t                             discardRectangleCount,\n                                 const VULKAN_HPP_NAMESPACE::Rect2D * pDiscardRectangles,\n                                 Dispatch const & d                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDiscardRectangleEXT( uint32_t                                                                     firstDiscardRectangle,\n                                 VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & discardRectangles,\n                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDiscardRectangleEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 discardRectangleEnable,\n                                       Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDiscardRectangleModeEXT( VULKAN_HPP_NAMESPACE::DiscardRectangleModeEXT discardRectangleMode,\n                                     Dispatch const & d                            VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_KHR_create_renderpass2 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void beginRenderPass2KHR( const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo * pRenderPassBegin,\n                              const VULKAN_HPP_NAMESPACE::SubpassBeginInfo *    pSubpassBeginInfo,\n                              Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void beginRenderPass2KHR( const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo & renderPassBegin,\n                              const VULKAN_HPP_NAMESPACE::SubpassBeginInfo &    subpassBeginInfo,\n                              Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void nextSubpass2KHR( const VULKAN_HPP_NAMESPACE::SubpassBeginInfo * pSubpassBeginInfo,\n                          const VULKAN_HPP_NAMESPACE::SubpassEndInfo *   pSubpassEndInfo,\n                          Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void nextSubpass2KHR( const VULKAN_HPP_NAMESPACE::SubpassBeginInfo & subpassBeginInfo,\n                          const VULKAN_HPP_NAMESPACE::SubpassEndInfo &   subpassEndInfo,\n                          Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void endRenderPass2KHR( const VULKAN_HPP_NAMESPACE::SubpassEndInfo * pSubpassEndInfo,\n                            Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void endRenderPass2KHR( const VULKAN_HPP_NAMESPACE::SubpassEndInfo & subpassEndInfo,\n                            Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_debug_utils ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void beginDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT * pLabelInfo,\n                                  Dispatch const & d                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void beginDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT & labelInfo,\n                                  Dispatch const & d                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void endDebugUtilsLabelEXT( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void insertDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT * pLabelInfo,\n                                   Dispatch const & d                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void insertDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT & labelInfo,\n                                   Dispatch const & d                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n    //=== VK_AMDX_shader_enqueue ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void initializeGraphScratchMemoryAMDX( VULKAN_HPP_NAMESPACE::Pipeline      executionGraph,\n                                           VULKAN_HPP_NAMESPACE::DeviceAddress scratch,\n                                           VULKAN_HPP_NAMESPACE::DeviceSize    scratchSize,\n                                           Dispatch const & d                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void dispatchGraphAMDX( VULKAN_HPP_NAMESPACE::DeviceAddress                      scratch,\n                            VULKAN_HPP_NAMESPACE::DeviceSize                         scratchSize,\n                            const VULKAN_HPP_NAMESPACE::DispatchGraphCountInfoAMDX * pCountInfo,\n                            Dispatch const & d                                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void dispatchGraphAMDX( VULKAN_HPP_NAMESPACE::DeviceAddress                      scratch,\n                            VULKAN_HPP_NAMESPACE::DeviceSize                         scratchSize,\n                            const VULKAN_HPP_NAMESPACE::DispatchGraphCountInfoAMDX & countInfo,\n                            Dispatch const & d                                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void dispatchGraphIndirectAMDX( VULKAN_HPP_NAMESPACE::DeviceAddress                      scratch,\n                                    VULKAN_HPP_NAMESPACE::DeviceSize                         scratchSize,\n                                    const VULKAN_HPP_NAMESPACE::DispatchGraphCountInfoAMDX * pCountInfo,\n                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void dispatchGraphIndirectAMDX( VULKAN_HPP_NAMESPACE::DeviceAddress                      scratch,\n                                    VULKAN_HPP_NAMESPACE::DeviceSize                         scratchSize,\n                                    const VULKAN_HPP_NAMESPACE::DispatchGraphCountInfoAMDX & countInfo,\n                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void dispatchGraphIndirectCountAMDX( VULKAN_HPP_NAMESPACE::DeviceAddress scratch,\n                                         VULKAN_HPP_NAMESPACE::DeviceSize    scratchSize,\n                                         VULKAN_HPP_NAMESPACE::DeviceAddress countInfo,\n                                         Dispatch const & d                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n    //=== VK_EXT_sample_locations ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setSampleLocationsEXT( const VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT * pSampleLocationsInfo,\n                                Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setSampleLocationsEXT( const VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT & sampleLocationsInfo,\n                                Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_acceleration_structure ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void buildAccelerationStructuresKHR( uint32_t                                                                     infoCount,\n                                         const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR *      pInfos,\n                                         const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR * const * ppBuildRangeInfos,\n                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void buildAccelerationStructuresKHR(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR> const &      infos,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR * const> const & pBuildRangeInfos,\n      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void buildAccelerationStructuresIndirectKHR( uint32_t                                                                infoCount,\n                                                 const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR * pInfos,\n                                                 const VULKAN_HPP_NAMESPACE::DeviceAddress *                             pIndirectDeviceAddresses,\n                                                 const uint32_t *                                                        pIndirectStrides,\n                                                 const uint32_t * const *                                                ppMaxPrimitiveCounts,\n                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void buildAccelerationStructuresIndirectKHR(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR> const & infos,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceAddress> const &                             indirectDeviceAddresses,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const uint32_t> const &                                                        indirectStrides,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const uint32_t * const> const &                                                pMaxPrimitiveCounts,\n      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyAccelerationStructureKHR( const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR * pInfo,\n                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyAccelerationStructureKHR( const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR & info,\n                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyAccelerationStructureToMemoryKHR( const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureToMemoryInfoKHR * pInfo,\n                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyAccelerationStructureToMemoryKHR( const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureToMemoryInfoKHR & info,\n                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyMemoryToAccelerationStructureKHR( const VULKAN_HPP_NAMESPACE::CopyMemoryToAccelerationStructureInfoKHR * pInfo,\n                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyMemoryToAccelerationStructureKHR( const VULKAN_HPP_NAMESPACE::CopyMemoryToAccelerationStructureInfoKHR & info,\n                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void writeAccelerationStructuresPropertiesKHR( uint32_t                                               accelerationStructureCount,\n                                                   const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR * pAccelerationStructures,\n                                                   VULKAN_HPP_NAMESPACE::QueryType                        queryType,\n                                                   VULKAN_HPP_NAMESPACE::QueryPool                        queryPool,\n                                                   uint32_t                                               firstQuery,\n                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void writeAccelerationStructuresPropertiesKHR(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR> const & accelerationStructures,\n      VULKAN_HPP_NAMESPACE::QueryType                                                                queryType,\n      VULKAN_HPP_NAMESPACE::QueryPool                                                                queryPool,\n      uint32_t                                                                                       firstQuery,\n      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_ray_tracing_pipeline ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void traceRaysKHR( const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR * pRaygenShaderBindingTable,\n                       const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR * pMissShaderBindingTable,\n                       const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR * pHitShaderBindingTable,\n                       const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR * pCallableShaderBindingTable,\n                       uint32_t                                                    width,\n                       uint32_t                                                    height,\n                       uint32_t                                                    depth,\n                       Dispatch const & d                                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void traceRaysKHR( const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & raygenShaderBindingTable,\n                       const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & missShaderBindingTable,\n                       const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & hitShaderBindingTable,\n                       const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & callableShaderBindingTable,\n                       uint32_t                                                    width,\n                       uint32_t                                                    height,\n                       uint32_t                                                    depth,\n                       Dispatch const & d                                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void traceRaysIndirectKHR( const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR * pRaygenShaderBindingTable,\n                               const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR * pMissShaderBindingTable,\n                               const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR * pHitShaderBindingTable,\n                               const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR * pCallableShaderBindingTable,\n                               VULKAN_HPP_NAMESPACE::DeviceAddress                         indirectDeviceAddress,\n                               Dispatch const & d                                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void traceRaysIndirectKHR( const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & raygenShaderBindingTable,\n                               const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & missShaderBindingTable,\n                               const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & hitShaderBindingTable,\n                               const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & callableShaderBindingTable,\n                               VULKAN_HPP_NAMESPACE::DeviceAddress                         indirectDeviceAddress,\n                               Dispatch const & d                                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setRayTracingPipelineStackSizeKHR( uint32_t pipelineStackSize, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_NV_shading_rate_image ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindShadingRateImageNV( VULKAN_HPP_NAMESPACE::ImageView   imageView,\n                                 VULKAN_HPP_NAMESPACE::ImageLayout imageLayout,\n                                 Dispatch const & d                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setViewportShadingRatePaletteNV( uint32_t                                           firstViewport,\n                                          uint32_t                                           viewportCount,\n                                          const VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV * pShadingRatePalettes,\n                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setViewportShadingRatePaletteNV( uint32_t                                                                                   firstViewport,\n                                          VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV> const & shadingRatePalettes,\n                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setCoarseSampleOrderNV( VULKAN_HPP_NAMESPACE::CoarseSampleOrderTypeNV           sampleOrderType,\n                                 uint32_t                                                customSampleOrderCount,\n                                 const VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV * pCustomSampleOrders,\n                                 Dispatch const & d                                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setCoarseSampleOrderNV( VULKAN_HPP_NAMESPACE::CoarseSampleOrderTypeNV                                                   sampleOrderType,\n                                 VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV> const & customSampleOrders,\n                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NV_ray_tracing ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void buildAccelerationStructureNV( const VULKAN_HPP_NAMESPACE::AccelerationStructureInfoNV * pInfo,\n                                       VULKAN_HPP_NAMESPACE::Buffer                              instanceData,\n                                       VULKAN_HPP_NAMESPACE::DeviceSize                          instanceOffset,\n                                       VULKAN_HPP_NAMESPACE::Bool32                              update,\n                                       VULKAN_HPP_NAMESPACE::AccelerationStructureNV             dst,\n                                       VULKAN_HPP_NAMESPACE::AccelerationStructureNV             src,\n                                       VULKAN_HPP_NAMESPACE::Buffer                              scratch,\n                                       VULKAN_HPP_NAMESPACE::DeviceSize                          scratchOffset,\n                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void buildAccelerationStructureNV( const VULKAN_HPP_NAMESPACE::AccelerationStructureInfoNV & info,\n                                       VULKAN_HPP_NAMESPACE::Buffer                              instanceData,\n                                       VULKAN_HPP_NAMESPACE::DeviceSize                          instanceOffset,\n                                       VULKAN_HPP_NAMESPACE::Bool32                              update,\n                                       VULKAN_HPP_NAMESPACE::AccelerationStructureNV             dst,\n                                       VULKAN_HPP_NAMESPACE::AccelerationStructureNV             src,\n                                       VULKAN_HPP_NAMESPACE::Buffer                              scratch,\n                                       VULKAN_HPP_NAMESPACE::DeviceSize                          scratchOffset,\n                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyAccelerationStructureNV( VULKAN_HPP_NAMESPACE::AccelerationStructureNV          dst,\n                                      VULKAN_HPP_NAMESPACE::AccelerationStructureNV          src,\n                                      VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR mode,\n                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void traceRaysNV( VULKAN_HPP_NAMESPACE::Buffer     raygenShaderBindingTableBuffer,\n                      VULKAN_HPP_NAMESPACE::DeviceSize raygenShaderBindingOffset,\n                      VULKAN_HPP_NAMESPACE::Buffer     missShaderBindingTableBuffer,\n                      VULKAN_HPP_NAMESPACE::DeviceSize missShaderBindingOffset,\n                      VULKAN_HPP_NAMESPACE::DeviceSize missShaderBindingStride,\n                      VULKAN_HPP_NAMESPACE::Buffer     hitShaderBindingTableBuffer,\n                      VULKAN_HPP_NAMESPACE::DeviceSize hitShaderBindingOffset,\n                      VULKAN_HPP_NAMESPACE::DeviceSize hitShaderBindingStride,\n                      VULKAN_HPP_NAMESPACE::Buffer     callableShaderBindingTableBuffer,\n                      VULKAN_HPP_NAMESPACE::DeviceSize callableShaderBindingOffset,\n                      VULKAN_HPP_NAMESPACE::DeviceSize callableShaderBindingStride,\n                      uint32_t                         width,\n                      uint32_t                         height,\n                      uint32_t                         depth,\n                      Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void writeAccelerationStructuresPropertiesNV( uint32_t                                              accelerationStructureCount,\n                                                  const VULKAN_HPP_NAMESPACE::AccelerationStructureNV * pAccelerationStructures,\n                                                  VULKAN_HPP_NAMESPACE::QueryType                       queryType,\n                                                  VULKAN_HPP_NAMESPACE::QueryPool                       queryPool,\n                                                  uint32_t                                              firstQuery,\n                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void writeAccelerationStructuresPropertiesNV(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureNV> const & accelerationStructures,\n      VULKAN_HPP_NAMESPACE::QueryType                                                               queryType,\n      VULKAN_HPP_NAMESPACE::QueryPool                                                               queryPool,\n      uint32_t                                                                                      firstQuery,\n      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_draw_indirect_count ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void drawIndirectCountKHR( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                               VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                               VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                               VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                               uint32_t                         maxDrawCount,\n                               uint32_t                         stride,\n                               Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void drawIndexedIndirectCountKHR( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                      VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                      VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                      VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                      uint32_t                         maxDrawCount,\n                                      uint32_t                         stride,\n                                      Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_AMD_buffer_marker ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void writeBufferMarkerAMD( VULKAN_HPP_NAMESPACE::PipelineStageFlagBits pipelineStage,\n                               VULKAN_HPP_NAMESPACE::Buffer                dstBuffer,\n                               VULKAN_HPP_NAMESPACE::DeviceSize            dstOffset,\n                               uint32_t                                    marker,\n                               Dispatch const & d                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void writeBufferMarker2AMD( VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stage,\n                                VULKAN_HPP_NAMESPACE::Buffer              dstBuffer,\n                                VULKAN_HPP_NAMESPACE::DeviceSize          dstOffset,\n                                uint32_t                                  marker,\n                                Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_NV_mesh_shader ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void drawMeshTasksNV( uint32_t taskCount, uint32_t firstTask, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void drawMeshTasksIndirectNV( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                  VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                  uint32_t                         drawCount,\n                                  uint32_t                         stride,\n                                  Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void drawMeshTasksIndirectCountNV( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                       VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                       VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                       VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                       uint32_t                         maxDrawCount,\n                                       uint32_t                         stride,\n                                       Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_NV_scissor_exclusive ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setExclusiveScissorEnableNV( uint32_t                             firstExclusiveScissor,\n                                      uint32_t                             exclusiveScissorCount,\n                                      const VULKAN_HPP_NAMESPACE::Bool32 * pExclusiveScissorEnables,\n                                      Dispatch const & d                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setExclusiveScissorEnableNV( uint32_t                                                                     firstExclusiveScissor,\n                                      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Bool32> const & exclusiveScissorEnables,\n                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setExclusiveScissorNV( uint32_t                             firstExclusiveScissor,\n                                uint32_t                             exclusiveScissorCount,\n                                const VULKAN_HPP_NAMESPACE::Rect2D * pExclusiveScissors,\n                                Dispatch const & d                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setExclusiveScissorNV( uint32_t                                                                     firstExclusiveScissor,\n                                VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & exclusiveScissors,\n                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NV_device_diagnostic_checkpoints ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setCheckpointNV( const void * pCheckpointMarker, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename CheckpointMarkerType, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setCheckpointNV( CheckpointMarkerType const & checkpointMarker,\n                          Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_INTEL_performance_query ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result setPerformanceMarkerINTEL( const VULKAN_HPP_NAMESPACE::PerformanceMarkerInfoINTEL * pMarkerInfo,\n                                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      setPerformanceMarkerINTEL( const VULKAN_HPP_NAMESPACE::PerformanceMarkerInfoINTEL & markerInfo,\n                                 Dispatch const & d                                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result setPerformanceStreamMarkerINTEL( const VULKAN_HPP_NAMESPACE::PerformanceStreamMarkerInfoINTEL * pMarkerInfo,\n                                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      setPerformanceStreamMarkerINTEL( const VULKAN_HPP_NAMESPACE::PerformanceStreamMarkerInfoINTEL & markerInfo,\n                                       Dispatch const & d                                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result setPerformanceOverrideINTEL( const VULKAN_HPP_NAMESPACE::PerformanceOverrideInfoINTEL * pOverrideInfo,\n                                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      setPerformanceOverrideINTEL( const VULKAN_HPP_NAMESPACE::PerformanceOverrideInfoINTEL & overrideInfo,\n                                   Dispatch const & d                                         VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_fragment_shading_rate ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setFragmentShadingRateKHR( const VULKAN_HPP_NAMESPACE::Extent2D *                       pFragmentSize,\n                                    const VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR combinerOps[2],\n                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setFragmentShadingRateKHR( const VULKAN_HPP_NAMESPACE::Extent2D &                       fragmentSize,\n                                    const VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR combinerOps[2],\n                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_dynamic_rendering_local_read ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setRenderingAttachmentLocationsKHR( const VULKAN_HPP_NAMESPACE::RenderingAttachmentLocationInfo * pLocationInfo,\n                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setRenderingAttachmentLocationsKHR( const VULKAN_HPP_NAMESPACE::RenderingAttachmentLocationInfo & locationInfo,\n                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setRenderingInputAttachmentIndicesKHR( const VULKAN_HPP_NAMESPACE::RenderingInputAttachmentIndexInfo * pInputAttachmentIndexInfo,\n                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setRenderingInputAttachmentIndicesKHR( const VULKAN_HPP_NAMESPACE::RenderingInputAttachmentIndexInfo & inputAttachmentIndexInfo,\n                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_line_rasterization ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setLineStippleEXT( uint32_t           lineStippleFactor,\n                            uint16_t           lineStipplePattern,\n                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_EXT_extended_dynamic_state ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setCullModeEXT( VULKAN_HPP_NAMESPACE::CullModeFlags cullMode, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setFrontFaceEXT( VULKAN_HPP_NAMESPACE::FrontFace frontFace, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setPrimitiveTopologyEXT( VULKAN_HPP_NAMESPACE::PrimitiveTopology primitiveTopology,\n                                  Dispatch const & d                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setViewportWithCountEXT( uint32_t                               viewportCount,\n                                  const VULKAN_HPP_NAMESPACE::Viewport * pViewports,\n                                  Dispatch const & d                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setViewportWithCountEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Viewport> const & viewports,\n                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setScissorWithCountEXT( uint32_t                             scissorCount,\n                                 const VULKAN_HPP_NAMESPACE::Rect2D * pScissors,\n                                 Dispatch const & d                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setScissorWithCountEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & scissors,\n                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindVertexBuffers2EXT( uint32_t                                 firstBinding,\n                                uint32_t                                 bindingCount,\n                                const VULKAN_HPP_NAMESPACE::Buffer *     pBuffers,\n                                const VULKAN_HPP_NAMESPACE::DeviceSize * pOffsets,\n                                const VULKAN_HPP_NAMESPACE::DeviceSize * pSizes,\n                                const VULKAN_HPP_NAMESPACE::DeviceSize * pStrides,\n                                Dispatch const & d                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindVertexBuffers2EXT(\n      uint32_t                                                                                 firstBinding,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &             buffers,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &         offsets,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & sizes   VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & strides VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDepthTestEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthTestEnable,\n                                Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDepthWriteEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthWriteEnable,\n                                 Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDepthCompareOpEXT( VULKAN_HPP_NAMESPACE::CompareOp depthCompareOp,\n                               Dispatch const & d              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDepthBoundsTestEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthBoundsTestEnable,\n                                      Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setStencilTestEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 stencilTestEnable,\n                                  Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setStencilOpEXT( VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask,\n                          VULKAN_HPP_NAMESPACE::StencilOp        failOp,\n                          VULKAN_HPP_NAMESPACE::StencilOp        passOp,\n                          VULKAN_HPP_NAMESPACE::StencilOp        depthFailOp,\n                          VULKAN_HPP_NAMESPACE::CompareOp        compareOp,\n                          Dispatch const & d                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_NV_device_generated_commands ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void preprocessGeneratedCommandsNV( const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV * pGeneratedCommandsInfo,\n                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void preprocessGeneratedCommandsNV( const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV & generatedCommandsInfo,\n                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void executeGeneratedCommandsNV( VULKAN_HPP_NAMESPACE::Bool32                          isPreprocessed,\n                                     const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV * pGeneratedCommandsInfo,\n                                     Dispatch const & d                                    VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void executeGeneratedCommandsNV( VULKAN_HPP_NAMESPACE::Bool32                          isPreprocessed,\n                                     const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV & generatedCommandsInfo,\n                                     Dispatch const & d                                    VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindPipelineShaderGroupNV( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint,\n                                    VULKAN_HPP_NAMESPACE::Pipeline          pipeline,\n                                    uint32_t                                groupIndex,\n                                    Dispatch const & d                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_EXT_depth_bias_control ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDepthBias2EXT( const VULKAN_HPP_NAMESPACE::DepthBiasInfoEXT * pDepthBiasInfo,\n                           Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDepthBias2EXT( const VULKAN_HPP_NAMESPACE::DepthBiasInfoEXT & depthBiasInfo,\n                           Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_video_encode_queue ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void encodeVideoKHR( const VULKAN_HPP_NAMESPACE::VideoEncodeInfoKHR * pEncodeInfo,\n                         Dispatch const & d                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void encodeVideoKHR( const VULKAN_HPP_NAMESPACE::VideoEncodeInfoKHR & encodeInfo,\n                         Dispatch const & d                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n    //=== VK_NV_cuda_kernel_launch ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void cudaLaunchKernelNV( const VULKAN_HPP_NAMESPACE::CudaLaunchInfoNV * pLaunchInfo,\n                             Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void cudaLaunchKernelNV( const VULKAN_HPP_NAMESPACE::CudaLaunchInfoNV & launchInfo,\n                             Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_ENABLE_BETA_EXTENSIONS*/\n\n    //=== VK_KHR_synchronization2 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setEvent2KHR( VULKAN_HPP_NAMESPACE::Event                  event,\n                       const VULKAN_HPP_NAMESPACE::DependencyInfo * pDependencyInfo,\n                       Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setEvent2KHR( VULKAN_HPP_NAMESPACE::Event                  event,\n                       const VULKAN_HPP_NAMESPACE::DependencyInfo & dependencyInfo,\n                       Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void resetEvent2KHR( VULKAN_HPP_NAMESPACE::Event               event,\n                         VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stageMask,\n                         Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void waitEvents2KHR( uint32_t                                     eventCount,\n                         const VULKAN_HPP_NAMESPACE::Event *          pEvents,\n                         const VULKAN_HPP_NAMESPACE::DependencyInfo * pDependencyInfos,\n                         Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void waitEvents2KHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Event> const &          events,\n                         VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DependencyInfo> const & dependencyInfos,\n                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pipelineBarrier2KHR( const VULKAN_HPP_NAMESPACE::DependencyInfo * pDependencyInfo,\n                              Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pipelineBarrier2KHR( const VULKAN_HPP_NAMESPACE::DependencyInfo & dependencyInfo,\n                              Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void writeTimestamp2KHR( VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stage,\n                             VULKAN_HPP_NAMESPACE::QueryPool           queryPool,\n                             uint32_t                                  query,\n                             Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_EXT_descriptor_buffer ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindDescriptorBuffersEXT( uint32_t                                                     bufferCount,\n                                   const VULKAN_HPP_NAMESPACE::DescriptorBufferBindingInfoEXT * pBindingInfos,\n                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindDescriptorBuffersEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DescriptorBufferBindingInfoEXT> const & bindingInfos,\n                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDescriptorBufferOffsetsEXT( VULKAN_HPP_NAMESPACE::PipelineBindPoint  pipelineBindPoint,\n                                        VULKAN_HPP_NAMESPACE::PipelineLayout     layout,\n                                        uint32_t                                 firstSet,\n                                        uint32_t                                 setCount,\n                                        const uint32_t *                         pBufferIndices,\n                                        const VULKAN_HPP_NAMESPACE::DeviceSize * pOffsets,\n                                        Dispatch const & d                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDescriptorBufferOffsetsEXT( VULKAN_HPP_NAMESPACE::PipelineBindPoint                                          pipelineBindPoint,\n                                        VULKAN_HPP_NAMESPACE::PipelineLayout                                             layout,\n                                        uint32_t                                                                         firstSet,\n                                        VULKAN_HPP_NAMESPACE::ArrayProxy<const uint32_t> const &                         bufferIndices,\n                                        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & offsets,\n                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindDescriptorBufferEmbeddedSamplersEXT( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint,\n                                                  VULKAN_HPP_NAMESPACE::PipelineLayout    layout,\n                                                  uint32_t                                set,\n                                                  Dispatch const & d                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_NV_fragment_shading_rate_enums ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setFragmentShadingRateEnumNV( VULKAN_HPP_NAMESPACE::FragmentShadingRateNV                  shadingRate,\n                                       const VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR combinerOps[2],\n                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_EXT_mesh_shader ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void drawMeshTasksEXT( uint32_t           groupCountX,\n                           uint32_t           groupCountY,\n                           uint32_t           groupCountZ,\n                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void drawMeshTasksIndirectEXT( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                   VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                   uint32_t                         drawCount,\n                                   uint32_t                         stride,\n                                   Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void drawMeshTasksIndirectCountEXT( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                        VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                        VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                        VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                        uint32_t                         maxDrawCount,\n                                        uint32_t                         stride,\n                                        Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_KHR_copy_commands2 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyBuffer2KHR( const VULKAN_HPP_NAMESPACE::CopyBufferInfo2 * pCopyBufferInfo,\n                         Dispatch const & d                            VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyBuffer2KHR( const VULKAN_HPP_NAMESPACE::CopyBufferInfo2 & copyBufferInfo,\n                         Dispatch const & d                            VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyImage2KHR( const VULKAN_HPP_NAMESPACE::CopyImageInfo2 * pCopyImageInfo,\n                        Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyImage2KHR( const VULKAN_HPP_NAMESPACE::CopyImageInfo2 & copyImageInfo,\n                        Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyBufferToImage2KHR( const VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2 * pCopyBufferToImageInfo,\n                                Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyBufferToImage2KHR( const VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2 & copyBufferToImageInfo,\n                                Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyImageToBuffer2KHR( const VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2 * pCopyImageToBufferInfo,\n                                Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyImageToBuffer2KHR( const VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2 & copyImageToBufferInfo,\n                                Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void blitImage2KHR( const VULKAN_HPP_NAMESPACE::BlitImageInfo2 * pBlitImageInfo,\n                        Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void blitImage2KHR( const VULKAN_HPP_NAMESPACE::BlitImageInfo2 & blitImageInfo,\n                        Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void resolveImage2KHR( const VULKAN_HPP_NAMESPACE::ResolveImageInfo2 * pResolveImageInfo,\n                           Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void resolveImage2KHR( const VULKAN_HPP_NAMESPACE::ResolveImageInfo2 & resolveImageInfo,\n                           Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_vertex_input_dynamic_state ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setVertexInputEXT( uint32_t                                                          vertexBindingDescriptionCount,\n                            const VULKAN_HPP_NAMESPACE::VertexInputBindingDescription2EXT *   pVertexBindingDescriptions,\n                            uint32_t                                                          vertexAttributeDescriptionCount,\n                            const VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription2EXT * pVertexAttributeDescriptions,\n                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void\n      setVertexInputEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::VertexInputBindingDescription2EXT> const &   vertexBindingDescriptions,\n                         VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription2EXT> const & vertexAttributeDescriptions,\n                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_HUAWEI_subpass_shading ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void subpassShadingHUAWEI( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_HUAWEI_invocation_mask ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindInvocationMaskHUAWEI( VULKAN_HPP_NAMESPACE::ImageView   imageView,\n                                   VULKAN_HPP_NAMESPACE::ImageLayout imageLayout,\n                                   Dispatch const & d                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_EXT_extended_dynamic_state2 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setPatchControlPointsEXT( uint32_t patchControlPoints, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setRasterizerDiscardEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 rasterizerDiscardEnable,\n                                        Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDepthBiasEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthBiasEnable,\n                                Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setLogicOpEXT( VULKAN_HPP_NAMESPACE::LogicOp logicOp, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setPrimitiveRestartEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 primitiveRestartEnable,\n                                       Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_EXT_color_write_enable ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setColorWriteEnableEXT( uint32_t                             attachmentCount,\n                                 const VULKAN_HPP_NAMESPACE::Bool32 * pColorWriteEnables,\n                                 Dispatch const & d                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setColorWriteEnableEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Bool32> const & colorWriteEnables,\n                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_ray_tracing_maintenance1 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void traceRaysIndirect2KHR( VULKAN_HPP_NAMESPACE::DeviceAddress indirectDeviceAddress,\n                                Dispatch const & d                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_EXT_multi_draw ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void drawMultiEXT( uint32_t                                       drawCount,\n                       const VULKAN_HPP_NAMESPACE::MultiDrawInfoEXT * pVertexInfo,\n                       uint32_t                                       instanceCount,\n                       uint32_t                                       firstInstance,\n                       uint32_t                                       stride,\n                       Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void drawMultiEXT( VULKAN_HPP_NAMESPACE::StridedArrayProxy<const VULKAN_HPP_NAMESPACE::MultiDrawInfoEXT> const & vertexInfo,\n                       uint32_t                                                                                      instanceCount,\n                       uint32_t                                                                                      firstInstance,\n                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void drawMultiIndexedEXT( uint32_t                                              drawCount,\n                              const VULKAN_HPP_NAMESPACE::MultiDrawIndexedInfoEXT * pIndexInfo,\n                              uint32_t                                              instanceCount,\n                              uint32_t                                              firstInstance,\n                              uint32_t                                              stride,\n                              const int32_t *                                       pVertexOffset,\n                              Dispatch const & d                                    VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void drawMultiIndexedEXT( VULKAN_HPP_NAMESPACE::StridedArrayProxy<const VULKAN_HPP_NAMESPACE::MultiDrawIndexedInfoEXT> const & indexInfo,\n                              uint32_t                                                                                             instanceCount,\n                              uint32_t                                                                                             firstInstance,\n                              Optional<const int32_t> vertexOffset VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                              Dispatch const & d                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_opacity_micromap ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void buildMicromapsEXT( uint32_t                                           infoCount,\n                            const VULKAN_HPP_NAMESPACE::MicromapBuildInfoEXT * pInfos,\n                            Dispatch const & d                                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void buildMicromapsEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MicromapBuildInfoEXT> const & infos,\n                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyMicromapEXT( const VULKAN_HPP_NAMESPACE::CopyMicromapInfoEXT * pInfo,\n                          Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyMicromapEXT( const VULKAN_HPP_NAMESPACE::CopyMicromapInfoEXT & info,\n                          Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyMicromapToMemoryEXT( const VULKAN_HPP_NAMESPACE::CopyMicromapToMemoryInfoEXT * pInfo,\n                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyMicromapToMemoryEXT( const VULKAN_HPP_NAMESPACE::CopyMicromapToMemoryInfoEXT & info,\n                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyMemoryToMicromapEXT( const VULKAN_HPP_NAMESPACE::CopyMemoryToMicromapInfoEXT * pInfo,\n                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyMemoryToMicromapEXT( const VULKAN_HPP_NAMESPACE::CopyMemoryToMicromapInfoEXT & info,\n                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void writeMicromapsPropertiesEXT( uint32_t                                  micromapCount,\n                                      const VULKAN_HPP_NAMESPACE::MicromapEXT * pMicromaps,\n                                      VULKAN_HPP_NAMESPACE::QueryType           queryType,\n                                      VULKAN_HPP_NAMESPACE::QueryPool           queryPool,\n                                      uint32_t                                  firstQuery,\n                                      Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void writeMicromapsPropertiesEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MicromapEXT> const & micromaps,\n                                      VULKAN_HPP_NAMESPACE::QueryType                                                   queryType,\n                                      VULKAN_HPP_NAMESPACE::QueryPool                                                   queryPool,\n                                      uint32_t                                                                          firstQuery,\n                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_HUAWEI_cluster_culling_shader ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void drawClusterHUAWEI( uint32_t           groupCountX,\n                            uint32_t           groupCountY,\n                            uint32_t           groupCountZ,\n                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void drawClusterIndirectHUAWEI( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                    VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                    Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_NV_copy_memory_indirect ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyMemoryIndirectNV( VULKAN_HPP_NAMESPACE::DeviceAddress copyBufferAddress,\n                               uint32_t                            copyCount,\n                               uint32_t                            stride,\n                               Dispatch const & d                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyMemoryToImageIndirectNV( VULKAN_HPP_NAMESPACE::DeviceAddress                  copyBufferAddress,\n                                      uint32_t                                             copyCount,\n                                      uint32_t                                             stride,\n                                      VULKAN_HPP_NAMESPACE::Image                          dstImage,\n                                      VULKAN_HPP_NAMESPACE::ImageLayout                    dstImageLayout,\n                                      const VULKAN_HPP_NAMESPACE::ImageSubresourceLayers * pImageSubresources,\n                                      Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void copyMemoryToImageIndirectNV( VULKAN_HPP_NAMESPACE::DeviceAddress                                                          copyBufferAddress,\n                                      uint32_t                                                                                     stride,\n                                      VULKAN_HPP_NAMESPACE::Image                                                                  dstImage,\n                                      VULKAN_HPP_NAMESPACE::ImageLayout                                                            dstImageLayout,\n                                      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageSubresourceLayers> const & imageSubresources,\n                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NV_memory_decompression ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void decompressMemoryNV( uint32_t                                               decompressRegionCount,\n                             const VULKAN_HPP_NAMESPACE::DecompressMemoryRegionNV * pDecompressMemoryRegions,\n                             Dispatch const & d                                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void decompressMemoryNV( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DecompressMemoryRegionNV> const & decompressMemoryRegions,\n                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void decompressMemoryIndirectCountNV( VULKAN_HPP_NAMESPACE::DeviceAddress indirectCommandsAddress,\n                                          VULKAN_HPP_NAMESPACE::DeviceAddress indirectCommandsCountAddress,\n                                          uint32_t                            stride,\n                                          Dispatch const & d                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_NV_device_generated_commands_compute ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void updatePipelineIndirectBufferNV( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint,\n                                         VULKAN_HPP_NAMESPACE::Pipeline          pipeline,\n                                         Dispatch const & d                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_EXT_extended_dynamic_state3 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDepthClampEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthClampEnable,\n                                 Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setPolygonModeEXT( VULKAN_HPP_NAMESPACE::PolygonMode polygonMode,\n                            Dispatch const & d                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setRasterizationSamplesEXT( VULKAN_HPP_NAMESPACE::SampleCountFlagBits rasterizationSamples,\n                                     Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setSampleMaskEXT( VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples,\n                           const VULKAN_HPP_NAMESPACE::SampleMask *  pSampleMask,\n                           Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setSampleMaskEXT( VULKAN_HPP_NAMESPACE::SampleCountFlagBits                                        samples,\n                           VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SampleMask> const & sampleMask,\n                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setAlphaToCoverageEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 alphaToCoverageEnable,\n                                      Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setAlphaToOneEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 alphaToOneEnable,\n                                 Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setLogicOpEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 logicOpEnable,\n                              Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setColorBlendEnableEXT( uint32_t                             firstAttachment,\n                                 uint32_t                             attachmentCount,\n                                 const VULKAN_HPP_NAMESPACE::Bool32 * pColorBlendEnables,\n                                 Dispatch const & d                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setColorBlendEnableEXT( uint32_t                                                                     firstAttachment,\n                                 VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Bool32> const & colorBlendEnables,\n                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setColorBlendEquationEXT( uint32_t                                            firstAttachment,\n                                   uint32_t                                            attachmentCount,\n                                   const VULKAN_HPP_NAMESPACE::ColorBlendEquationEXT * pColorBlendEquations,\n                                   Dispatch const & d                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setColorBlendEquationEXT( uint32_t                                                                                    firstAttachment,\n                                   VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ColorBlendEquationEXT> const & colorBlendEquations,\n                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setColorWriteMaskEXT( uint32_t                                          firstAttachment,\n                               uint32_t                                          attachmentCount,\n                               const VULKAN_HPP_NAMESPACE::ColorComponentFlags * pColorWriteMasks,\n                               Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setColorWriteMaskEXT( uint32_t                                                                                  firstAttachment,\n                               VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ColorComponentFlags> const & colorWriteMasks,\n                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setTessellationDomainOriginEXT( VULKAN_HPP_NAMESPACE::TessellationDomainOrigin domainOrigin,\n                                         Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setRasterizationStreamEXT( uint32_t rasterizationStream, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setConservativeRasterizationModeEXT( VULKAN_HPP_NAMESPACE::ConservativeRasterizationModeEXT conservativeRasterizationMode,\n                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setExtraPrimitiveOverestimationSizeEXT( float              extraPrimitiveOverestimationSize,\n                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDepthClipEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthClipEnable,\n                                Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setSampleLocationsEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 sampleLocationsEnable,\n                                      Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setColorBlendAdvancedEXT( uint32_t                                            firstAttachment,\n                                   uint32_t                                            attachmentCount,\n                                   const VULKAN_HPP_NAMESPACE::ColorBlendAdvancedEXT * pColorBlendAdvanced,\n                                   Dispatch const & d                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setColorBlendAdvancedEXT( uint32_t                                                                                    firstAttachment,\n                                   VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ColorBlendAdvancedEXT> const & colorBlendAdvanced,\n                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setProvokingVertexModeEXT( VULKAN_HPP_NAMESPACE::ProvokingVertexModeEXT provokingVertexMode,\n                                    Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setLineRasterizationModeEXT( VULKAN_HPP_NAMESPACE::LineRasterizationModeEXT lineRasterizationMode,\n                                      Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setLineStippleEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 stippledLineEnable,\n                                  Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDepthClipNegativeOneToOneEXT( VULKAN_HPP_NAMESPACE::Bool32 negativeOneToOne,\n                                          Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setViewportWScalingEnableNV( VULKAN_HPP_NAMESPACE::Bool32 viewportWScalingEnable,\n                                      Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setViewportSwizzleNV( uint32_t                                        firstViewport,\n                               uint32_t                                        viewportCount,\n                               const VULKAN_HPP_NAMESPACE::ViewportSwizzleNV * pViewportSwizzles,\n                               Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setViewportSwizzleNV( uint32_t                                                                                firstViewport,\n                               VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ViewportSwizzleNV> const & viewportSwizzles,\n                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setCoverageToColorEnableNV( VULKAN_HPP_NAMESPACE::Bool32 coverageToColorEnable,\n                                     Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setCoverageToColorLocationNV( uint32_t           coverageToColorLocation,\n                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setCoverageModulationModeNV( VULKAN_HPP_NAMESPACE::CoverageModulationModeNV coverageModulationMode,\n                                      Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setCoverageModulationTableEnableNV( VULKAN_HPP_NAMESPACE::Bool32 coverageModulationTableEnable,\n                                             Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setCoverageModulationTableNV( uint32_t           coverageModulationTableCount,\n                                       const float *      pCoverageModulationTable,\n                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setCoverageModulationTableNV( VULKAN_HPP_NAMESPACE::ArrayProxy<const float> const & coverageModulationTable,\n                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setShadingRateImageEnableNV( VULKAN_HPP_NAMESPACE::Bool32 shadingRateImageEnable,\n                                      Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setRepresentativeFragmentTestEnableNV( VULKAN_HPP_NAMESPACE::Bool32 representativeFragmentTestEnable,\n                                                Dispatch const & d           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setCoverageReductionModeNV( VULKAN_HPP_NAMESPACE::CoverageReductionModeNV coverageReductionMode,\n                                     Dispatch const & d                            VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_NV_optical_flow ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void opticalFlowExecuteNV( VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV             session,\n                               const VULKAN_HPP_NAMESPACE::OpticalFlowExecuteInfoNV * pExecuteInfo,\n                               Dispatch const & d                                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void opticalFlowExecuteNV( VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV             session,\n                               const VULKAN_HPP_NAMESPACE::OpticalFlowExecuteInfoNV & executeInfo,\n                               Dispatch const & d                                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_maintenance5 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindIndexBuffer2KHR( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                              VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                              VULKAN_HPP_NAMESPACE::DeviceSize size,\n                              VULKAN_HPP_NAMESPACE::IndexType  indexType,\n                              Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_EXT_shader_object ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindShadersEXT( uint32_t                                          stageCount,\n                         const VULKAN_HPP_NAMESPACE::ShaderStageFlagBits * pStages,\n                         const VULKAN_HPP_NAMESPACE::ShaderEXT *           pShaders,\n                         Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindShadersEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ShaderStageFlagBits> const & stages,\n                         VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ShaderEXT> const &           shaders,\n                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDepthClampRangeEXT( VULKAN_HPP_NAMESPACE::DepthClampModeEXT          depthClampMode,\n                                const VULKAN_HPP_NAMESPACE::DepthClampRangeEXT * pDepthClampRange,\n                                Dispatch const & d                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDepthClampRangeEXT( VULKAN_HPP_NAMESPACE::DepthClampModeEXT                                  depthClampMode,\n                                Optional<const VULKAN_HPP_NAMESPACE::DepthClampRangeEXT> depthClampRange VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NV_cooperative_vector ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void convertCooperativeVectorMatrixNV( uint32_t                                                           infoCount,\n                                           const VULKAN_HPP_NAMESPACE::ConvertCooperativeVectorMatrixInfoNV * pInfos,\n                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void convertCooperativeVectorMatrixNV( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ConvertCooperativeVectorMatrixInfoNV> const & infos,\n                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_attachment_feedback_loop_dynamic_state ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setAttachmentFeedbackLoopEnableEXT( VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask,\n                                             Dispatch const & d                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_KHR_line_rasterization ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setLineStippleKHR( uint32_t           lineStippleFactor,\n                            uint16_t           lineStipplePattern,\n                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_KHR_maintenance6 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindDescriptorSets2KHR( const VULKAN_HPP_NAMESPACE::BindDescriptorSetsInfo * pBindDescriptorSetsInfo,\n                                 Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindDescriptorSets2KHR( const VULKAN_HPP_NAMESPACE::BindDescriptorSetsInfo & bindDescriptorSetsInfo,\n                                 Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pushConstants2KHR( const VULKAN_HPP_NAMESPACE::PushConstantsInfo * pPushConstantsInfo,\n                            Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pushConstants2KHR( const VULKAN_HPP_NAMESPACE::PushConstantsInfo & pushConstantsInfo,\n                            Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pushDescriptorSet2KHR( const VULKAN_HPP_NAMESPACE::PushDescriptorSetInfo * pPushDescriptorSetInfo,\n                                Dispatch const & d                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pushDescriptorSet2KHR( const VULKAN_HPP_NAMESPACE::PushDescriptorSetInfo & pushDescriptorSetInfo,\n                                Dispatch const & d                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pushDescriptorSetWithTemplate2KHR( const VULKAN_HPP_NAMESPACE::PushDescriptorSetWithTemplateInfo * pPushDescriptorSetWithTemplateInfo,\n                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void pushDescriptorSetWithTemplate2KHR( const VULKAN_HPP_NAMESPACE::PushDescriptorSetWithTemplateInfo & pushDescriptorSetWithTemplateInfo,\n                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDescriptorBufferOffsets2EXT( const VULKAN_HPP_NAMESPACE::SetDescriptorBufferOffsetsInfoEXT * pSetDescriptorBufferOffsetsInfo,\n                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setDescriptorBufferOffsets2EXT( const VULKAN_HPP_NAMESPACE::SetDescriptorBufferOffsetsInfoEXT & setDescriptorBufferOffsetsInfo,\n                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindDescriptorBufferEmbeddedSamplers2EXT(\n      const VULKAN_HPP_NAMESPACE::BindDescriptorBufferEmbeddedSamplersInfoEXT * pBindDescriptorBufferEmbeddedSamplersInfo,\n      Dispatch const & d                                                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void bindDescriptorBufferEmbeddedSamplers2EXT(\n      const VULKAN_HPP_NAMESPACE::BindDescriptorBufferEmbeddedSamplersInfoEXT & bindDescriptorBufferEmbeddedSamplersInfo,\n      Dispatch const & d                                                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NV_cluster_acceleration_structure ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void buildClusterAccelerationStructureIndirectNV( const VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureCommandsInfoNV * pCommandInfos,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void buildClusterAccelerationStructureIndirectNV( const VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureCommandsInfoNV & commandInfos,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NV_partitioned_acceleration_structure ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void buildPartitionedAccelerationStructuresNV( const VULKAN_HPP_NAMESPACE::BuildPartitionedAccelerationStructureInfoNV * pBuildInfo,\n                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void buildPartitionedAccelerationStructuresNV( const VULKAN_HPP_NAMESPACE::BuildPartitionedAccelerationStructureInfoNV & buildInfo,\n                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_device_generated_commands ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void preprocessGeneratedCommandsEXT( const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoEXT * pGeneratedCommandsInfo,\n                                         VULKAN_HPP_NAMESPACE::CommandBuffer                    stateCommandBuffer,\n                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void preprocessGeneratedCommandsEXT( const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoEXT & generatedCommandsInfo,\n                                         VULKAN_HPP_NAMESPACE::CommandBuffer                    stateCommandBuffer,\n                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void executeGeneratedCommandsEXT( VULKAN_HPP_NAMESPACE::Bool32                           isPreprocessed,\n                                      const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoEXT * pGeneratedCommandsInfo,\n                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void executeGeneratedCommandsEXT( VULKAN_HPP_NAMESPACE::Bool32                           isPreprocessed,\n                                      const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoEXT & generatedCommandsInfo,\n                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    operator VkCommandBuffer() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_commandBuffer;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_commandBuffer != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_commandBuffer == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkCommandBuffer m_commandBuffer = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eCommandBuffer>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::CommandBuffer;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCommandBuffer>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::CommandBuffer;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkCommandBuffer, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::CommandBuffer;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::CommandBuffer>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class DeviceMemory\n  {\n  public:\n    using CType      = VkDeviceMemory;\n    using NativeType = VkDeviceMemory;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDeviceMemory;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDeviceMemory;\n\n  public:\n    DeviceMemory() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    DeviceMemory( DeviceMemory const & rhs )             = default;\n    DeviceMemory & operator=( DeviceMemory const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    DeviceMemory( DeviceMemory && rhs )             = default;\n    DeviceMemory & operator=( DeviceMemory && rhs ) = default;\n#else\n    DeviceMemory( DeviceMemory && rhs ) VULKAN_HPP_NOEXCEPT : m_deviceMemory( VULKAN_HPP_NAMESPACE::exchange( rhs.m_deviceMemory, {} ) ) {}\n\n    DeviceMemory & operator=( DeviceMemory && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_deviceMemory = VULKAN_HPP_NAMESPACE::exchange( rhs.m_deviceMemory, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR DeviceMemory( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT DeviceMemory( VkDeviceMemory deviceMemory ) VULKAN_HPP_NOEXCEPT : m_deviceMemory( deviceMemory ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    DeviceMemory & operator=( VkDeviceMemory deviceMemory ) VULKAN_HPP_NOEXCEPT\n    {\n      m_deviceMemory = deviceMemory;\n      return *this;\n    }\n#endif\n\n    DeviceMemory & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_deviceMemory = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkDeviceMemory() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_deviceMemory;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_deviceMemory != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_deviceMemory == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkDeviceMemory m_deviceMemory = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eDeviceMemory>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DeviceMemory;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDeviceMemory>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DeviceMemory;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkDeviceMemory, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DeviceMemory;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::DeviceMemory>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class VideoSessionKHR\n  {\n  public:\n    using CType      = VkVideoSessionKHR;\n    using NativeType = VkVideoSessionKHR;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eVideoSessionKHR;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n  public:\n    VideoSessionKHR() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    VideoSessionKHR( VideoSessionKHR const & rhs )             = default;\n    VideoSessionKHR & operator=( VideoSessionKHR const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    VideoSessionKHR( VideoSessionKHR && rhs )             = default;\n    VideoSessionKHR & operator=( VideoSessionKHR && rhs ) = default;\n#else\n    VideoSessionKHR( VideoSessionKHR && rhs ) VULKAN_HPP_NOEXCEPT : m_videoSessionKHR( VULKAN_HPP_NAMESPACE::exchange( rhs.m_videoSessionKHR, {} ) ) {}\n\n    VideoSessionKHR & operator=( VideoSessionKHR && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_videoSessionKHR = VULKAN_HPP_NAMESPACE::exchange( rhs.m_videoSessionKHR, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR VideoSessionKHR( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT VideoSessionKHR( VkVideoSessionKHR videoSessionKHR ) VULKAN_HPP_NOEXCEPT : m_videoSessionKHR( videoSessionKHR ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    VideoSessionKHR & operator=( VkVideoSessionKHR videoSessionKHR ) VULKAN_HPP_NOEXCEPT\n    {\n      m_videoSessionKHR = videoSessionKHR;\n      return *this;\n    }\n#endif\n\n    VideoSessionKHR & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_videoSessionKHR = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkVideoSessionKHR() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_videoSessionKHR;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_videoSessionKHR != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_videoSessionKHR == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkVideoSessionKHR m_videoSessionKHR = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eVideoSessionKHR>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::VideoSessionKHR;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkVideoSessionKHR, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::VideoSessionKHR;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::VideoSessionKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class DeferredOperationKHR\n  {\n  public:\n    using CType      = VkDeferredOperationKHR;\n    using NativeType = VkDeferredOperationKHR;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDeferredOperationKHR;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n  public:\n    DeferredOperationKHR() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    DeferredOperationKHR( DeferredOperationKHR const & rhs )             = default;\n    DeferredOperationKHR & operator=( DeferredOperationKHR const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    DeferredOperationKHR( DeferredOperationKHR && rhs )             = default;\n    DeferredOperationKHR & operator=( DeferredOperationKHR && rhs ) = default;\n#else\n    DeferredOperationKHR( DeferredOperationKHR && rhs ) VULKAN_HPP_NOEXCEPT\n      : m_deferredOperationKHR( VULKAN_HPP_NAMESPACE::exchange( rhs.m_deferredOperationKHR, {} ) )\n    {\n    }\n\n    DeferredOperationKHR & operator=( DeferredOperationKHR && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_deferredOperationKHR = VULKAN_HPP_NAMESPACE::exchange( rhs.m_deferredOperationKHR, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR DeferredOperationKHR( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT DeferredOperationKHR( VkDeferredOperationKHR deferredOperationKHR ) VULKAN_HPP_NOEXCEPT\n      : m_deferredOperationKHR( deferredOperationKHR )\n    {\n    }\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    DeferredOperationKHR & operator=( VkDeferredOperationKHR deferredOperationKHR ) VULKAN_HPP_NOEXCEPT\n    {\n      m_deferredOperationKHR = deferredOperationKHR;\n      return *this;\n    }\n#endif\n\n    DeferredOperationKHR & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_deferredOperationKHR = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkDeferredOperationKHR() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_deferredOperationKHR;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_deferredOperationKHR != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_deferredOperationKHR == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkDeferredOperationKHR m_deferredOperationKHR = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eDeferredOperationKHR>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DeferredOperationKHR;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkDeferredOperationKHR, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DeferredOperationKHR;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::DeferredOperationKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  class BufferCollectionFUCHSIA\n  {\n  public:\n    using CType      = VkBufferCollectionFUCHSIA;\n    using NativeType = VkBufferCollectionFUCHSIA;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eBufferCollectionFUCHSIA;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eBufferCollectionFUCHSIA;\n\n  public:\n    BufferCollectionFUCHSIA() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    BufferCollectionFUCHSIA( BufferCollectionFUCHSIA const & rhs )             = default;\n    BufferCollectionFUCHSIA & operator=( BufferCollectionFUCHSIA const & rhs ) = default;\n\n#  if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    BufferCollectionFUCHSIA( BufferCollectionFUCHSIA && rhs )             = default;\n    BufferCollectionFUCHSIA & operator=( BufferCollectionFUCHSIA && rhs ) = default;\n#  else\n    BufferCollectionFUCHSIA( BufferCollectionFUCHSIA && rhs ) VULKAN_HPP_NOEXCEPT\n      : m_bufferCollectionFUCHSIA( VULKAN_HPP_NAMESPACE::exchange( rhs.m_bufferCollectionFUCHSIA, {} ) )\n    {\n    }\n\n    BufferCollectionFUCHSIA & operator=( BufferCollectionFUCHSIA && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_bufferCollectionFUCHSIA = VULKAN_HPP_NAMESPACE::exchange( rhs.m_bufferCollectionFUCHSIA, {} );\n      return *this;\n    }\n#  endif\n\n    VULKAN_HPP_CONSTEXPR BufferCollectionFUCHSIA( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT BufferCollectionFUCHSIA( VkBufferCollectionFUCHSIA bufferCollectionFUCHSIA ) VULKAN_HPP_NOEXCEPT\n      : m_bufferCollectionFUCHSIA( bufferCollectionFUCHSIA )\n    {\n    }\n\n#  if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    BufferCollectionFUCHSIA & operator=( VkBufferCollectionFUCHSIA bufferCollectionFUCHSIA ) VULKAN_HPP_NOEXCEPT\n    {\n      m_bufferCollectionFUCHSIA = bufferCollectionFUCHSIA;\n      return *this;\n    }\n#  endif\n\n    BufferCollectionFUCHSIA & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_bufferCollectionFUCHSIA = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkBufferCollectionFUCHSIA() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_bufferCollectionFUCHSIA;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_bufferCollectionFUCHSIA != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_bufferCollectionFUCHSIA == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkBufferCollectionFUCHSIA m_bufferCollectionFUCHSIA = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eBufferCollectionFUCHSIA>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eBufferCollectionFUCHSIA>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA;\n  };\n\n#  if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkBufferCollectionFUCHSIA, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA;\n  };\n#  endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  class BufferView\n  {\n  public:\n    using CType      = VkBufferView;\n    using NativeType = VkBufferView;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eBufferView;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eBufferView;\n\n  public:\n    BufferView() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    BufferView( BufferView const & rhs )             = default;\n    BufferView & operator=( BufferView const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    BufferView( BufferView && rhs )             = default;\n    BufferView & operator=( BufferView && rhs ) = default;\n#else\n    BufferView( BufferView && rhs ) VULKAN_HPP_NOEXCEPT : m_bufferView( VULKAN_HPP_NAMESPACE::exchange( rhs.m_bufferView, {} ) ) {}\n\n    BufferView & operator=( BufferView && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_bufferView = VULKAN_HPP_NAMESPACE::exchange( rhs.m_bufferView, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR BufferView( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT BufferView( VkBufferView bufferView ) VULKAN_HPP_NOEXCEPT : m_bufferView( bufferView ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    BufferView & operator=( VkBufferView bufferView ) VULKAN_HPP_NOEXCEPT\n    {\n      m_bufferView = bufferView;\n      return *this;\n    }\n#endif\n\n    BufferView & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_bufferView = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkBufferView() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_bufferView;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_bufferView != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_bufferView == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkBufferView m_bufferView = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eBufferView>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::BufferView;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eBufferView>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::BufferView;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkBufferView, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::BufferView;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::BufferView>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class CommandPool\n  {\n  public:\n    using CType      = VkCommandPool;\n    using NativeType = VkCommandPool;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eCommandPool;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCommandPool;\n\n  public:\n    CommandPool() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    CommandPool( CommandPool const & rhs )             = default;\n    CommandPool & operator=( CommandPool const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    CommandPool( CommandPool && rhs )             = default;\n    CommandPool & operator=( CommandPool && rhs ) = default;\n#else\n    CommandPool( CommandPool && rhs ) VULKAN_HPP_NOEXCEPT : m_commandPool( VULKAN_HPP_NAMESPACE::exchange( rhs.m_commandPool, {} ) ) {}\n\n    CommandPool & operator=( CommandPool && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_commandPool = VULKAN_HPP_NAMESPACE::exchange( rhs.m_commandPool, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR CommandPool( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT CommandPool( VkCommandPool commandPool ) VULKAN_HPP_NOEXCEPT : m_commandPool( commandPool ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    CommandPool & operator=( VkCommandPool commandPool ) VULKAN_HPP_NOEXCEPT\n    {\n      m_commandPool = commandPool;\n      return *this;\n    }\n#endif\n\n    CommandPool & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_commandPool = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkCommandPool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_commandPool;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_commandPool != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_commandPool == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkCommandPool m_commandPool = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eCommandPool>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::CommandPool;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCommandPool>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::CommandPool;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkCommandPool, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::CommandPool;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::CommandPool>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class PipelineCache\n  {\n  public:\n    using CType      = VkPipelineCache;\n    using NativeType = VkPipelineCache;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::ePipelineCache;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePipelineCache;\n\n  public:\n    PipelineCache() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    PipelineCache( PipelineCache const & rhs )             = default;\n    PipelineCache & operator=( PipelineCache const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    PipelineCache( PipelineCache && rhs )             = default;\n    PipelineCache & operator=( PipelineCache && rhs ) = default;\n#else\n    PipelineCache( PipelineCache && rhs ) VULKAN_HPP_NOEXCEPT : m_pipelineCache( VULKAN_HPP_NAMESPACE::exchange( rhs.m_pipelineCache, {} ) ) {}\n\n    PipelineCache & operator=( PipelineCache && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_pipelineCache = VULKAN_HPP_NAMESPACE::exchange( rhs.m_pipelineCache, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR PipelineCache( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT PipelineCache( VkPipelineCache pipelineCache ) VULKAN_HPP_NOEXCEPT : m_pipelineCache( pipelineCache ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    PipelineCache & operator=( VkPipelineCache pipelineCache ) VULKAN_HPP_NOEXCEPT\n    {\n      m_pipelineCache = pipelineCache;\n      return *this;\n    }\n#endif\n\n    PipelineCache & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_pipelineCache = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkPipelineCache() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_pipelineCache;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_pipelineCache != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_pipelineCache == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkPipelineCache m_pipelineCache = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::ePipelineCache>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::PipelineCache;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePipelineCache>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::PipelineCache;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkPipelineCache, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::PipelineCache;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::PipelineCache>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class CuFunctionNVX\n  {\n  public:\n    using CType      = VkCuFunctionNVX;\n    using NativeType = VkCuFunctionNVX;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eCuFunctionNVX;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCuFunctionNVX;\n\n  public:\n    CuFunctionNVX() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    CuFunctionNVX( CuFunctionNVX const & rhs )             = default;\n    CuFunctionNVX & operator=( CuFunctionNVX const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    CuFunctionNVX( CuFunctionNVX && rhs )             = default;\n    CuFunctionNVX & operator=( CuFunctionNVX && rhs ) = default;\n#else\n    CuFunctionNVX( CuFunctionNVX && rhs ) VULKAN_HPP_NOEXCEPT : m_cuFunctionNVX( VULKAN_HPP_NAMESPACE::exchange( rhs.m_cuFunctionNVX, {} ) ) {}\n\n    CuFunctionNVX & operator=( CuFunctionNVX && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_cuFunctionNVX = VULKAN_HPP_NAMESPACE::exchange( rhs.m_cuFunctionNVX, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR CuFunctionNVX( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT CuFunctionNVX( VkCuFunctionNVX cuFunctionNVX ) VULKAN_HPP_NOEXCEPT : m_cuFunctionNVX( cuFunctionNVX ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    CuFunctionNVX & operator=( VkCuFunctionNVX cuFunctionNVX ) VULKAN_HPP_NOEXCEPT\n    {\n      m_cuFunctionNVX = cuFunctionNVX;\n      return *this;\n    }\n#endif\n\n    CuFunctionNVX & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_cuFunctionNVX = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkCuFunctionNVX() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_cuFunctionNVX;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_cuFunctionNVX != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_cuFunctionNVX == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkCuFunctionNVX m_cuFunctionNVX = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eCuFunctionNVX>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::CuFunctionNVX;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCuFunctionNVX>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::CuFunctionNVX;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkCuFunctionNVX, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::CuFunctionNVX;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::CuFunctionNVX>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class CuModuleNVX\n  {\n  public:\n    using CType      = VkCuModuleNVX;\n    using NativeType = VkCuModuleNVX;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eCuModuleNVX;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCuModuleNVX;\n\n  public:\n    CuModuleNVX() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    CuModuleNVX( CuModuleNVX const & rhs )             = default;\n    CuModuleNVX & operator=( CuModuleNVX const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    CuModuleNVX( CuModuleNVX && rhs )             = default;\n    CuModuleNVX & operator=( CuModuleNVX && rhs ) = default;\n#else\n    CuModuleNVX( CuModuleNVX && rhs ) VULKAN_HPP_NOEXCEPT : m_cuModuleNVX( VULKAN_HPP_NAMESPACE::exchange( rhs.m_cuModuleNVX, {} ) ) {}\n\n    CuModuleNVX & operator=( CuModuleNVX && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_cuModuleNVX = VULKAN_HPP_NAMESPACE::exchange( rhs.m_cuModuleNVX, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR CuModuleNVX( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT CuModuleNVX( VkCuModuleNVX cuModuleNVX ) VULKAN_HPP_NOEXCEPT : m_cuModuleNVX( cuModuleNVX ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    CuModuleNVX & operator=( VkCuModuleNVX cuModuleNVX ) VULKAN_HPP_NOEXCEPT\n    {\n      m_cuModuleNVX = cuModuleNVX;\n      return *this;\n    }\n#endif\n\n    CuModuleNVX & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_cuModuleNVX = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkCuModuleNVX() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_cuModuleNVX;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_cuModuleNVX != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_cuModuleNVX == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkCuModuleNVX m_cuModuleNVX = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eCuModuleNVX>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::CuModuleNVX;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCuModuleNVX>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::CuModuleNVX;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkCuModuleNVX, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::CuModuleNVX;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::CuModuleNVX>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  class CudaFunctionNV\n  {\n  public:\n    using CType      = VkCudaFunctionNV;\n    using NativeType = VkCudaFunctionNV;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eCudaFunctionNV;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCudaFunctionNV;\n\n  public:\n    CudaFunctionNV() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    CudaFunctionNV( CudaFunctionNV const & rhs )             = default;\n    CudaFunctionNV & operator=( CudaFunctionNV const & rhs ) = default;\n\n#  if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    CudaFunctionNV( CudaFunctionNV && rhs )             = default;\n    CudaFunctionNV & operator=( CudaFunctionNV && rhs ) = default;\n#  else\n    CudaFunctionNV( CudaFunctionNV && rhs ) VULKAN_HPP_NOEXCEPT : m_cudaFunctionNV( VULKAN_HPP_NAMESPACE::exchange( rhs.m_cudaFunctionNV, {} ) ) {}\n\n    CudaFunctionNV & operator=( CudaFunctionNV && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_cudaFunctionNV = VULKAN_HPP_NAMESPACE::exchange( rhs.m_cudaFunctionNV, {} );\n      return *this;\n    }\n#  endif\n\n    VULKAN_HPP_CONSTEXPR CudaFunctionNV( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT CudaFunctionNV( VkCudaFunctionNV cudaFunctionNV ) VULKAN_HPP_NOEXCEPT : m_cudaFunctionNV( cudaFunctionNV ) {}\n\n#  if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    CudaFunctionNV & operator=( VkCudaFunctionNV cudaFunctionNV ) VULKAN_HPP_NOEXCEPT\n    {\n      m_cudaFunctionNV = cudaFunctionNV;\n      return *this;\n    }\n#  endif\n\n    CudaFunctionNV & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_cudaFunctionNV = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkCudaFunctionNV() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_cudaFunctionNV;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_cudaFunctionNV != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_cudaFunctionNV == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkCudaFunctionNV m_cudaFunctionNV = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eCudaFunctionNV>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::CudaFunctionNV;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCudaFunctionNV>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::CudaFunctionNV;\n  };\n\n#  if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkCudaFunctionNV, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::CudaFunctionNV;\n  };\n#  endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::CudaFunctionNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  class CudaModuleNV\n  {\n  public:\n    using CType      = VkCudaModuleNV;\n    using NativeType = VkCudaModuleNV;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eCudaModuleNV;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCudaModuleNV;\n\n  public:\n    CudaModuleNV() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    CudaModuleNV( CudaModuleNV const & rhs )             = default;\n    CudaModuleNV & operator=( CudaModuleNV const & rhs ) = default;\n\n#  if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    CudaModuleNV( CudaModuleNV && rhs )             = default;\n    CudaModuleNV & operator=( CudaModuleNV && rhs ) = default;\n#  else\n    CudaModuleNV( CudaModuleNV && rhs ) VULKAN_HPP_NOEXCEPT : m_cudaModuleNV( VULKAN_HPP_NAMESPACE::exchange( rhs.m_cudaModuleNV, {} ) ) {}\n\n    CudaModuleNV & operator=( CudaModuleNV && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_cudaModuleNV = VULKAN_HPP_NAMESPACE::exchange( rhs.m_cudaModuleNV, {} );\n      return *this;\n    }\n#  endif\n\n    VULKAN_HPP_CONSTEXPR CudaModuleNV( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT CudaModuleNV( VkCudaModuleNV cudaModuleNV ) VULKAN_HPP_NOEXCEPT : m_cudaModuleNV( cudaModuleNV ) {}\n\n#  if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    CudaModuleNV & operator=( VkCudaModuleNV cudaModuleNV ) VULKAN_HPP_NOEXCEPT\n    {\n      m_cudaModuleNV = cudaModuleNV;\n      return *this;\n    }\n#  endif\n\n    CudaModuleNV & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_cudaModuleNV = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkCudaModuleNV() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_cudaModuleNV;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_cudaModuleNV != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_cudaModuleNV == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkCudaModuleNV m_cudaModuleNV = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eCudaModuleNV>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::CudaModuleNV;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCudaModuleNV>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::CudaModuleNV;\n  };\n\n#  if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkCudaModuleNV, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::CudaModuleNV;\n  };\n#  endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::CudaModuleNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  class DescriptorPool\n  {\n  public:\n    using CType      = VkDescriptorPool;\n    using NativeType = VkDescriptorPool;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDescriptorPool;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDescriptorPool;\n\n  public:\n    DescriptorPool() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    DescriptorPool( DescriptorPool const & rhs )             = default;\n    DescriptorPool & operator=( DescriptorPool const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    DescriptorPool( DescriptorPool && rhs )             = default;\n    DescriptorPool & operator=( DescriptorPool && rhs ) = default;\n#else\n    DescriptorPool( DescriptorPool && rhs ) VULKAN_HPP_NOEXCEPT : m_descriptorPool( VULKAN_HPP_NAMESPACE::exchange( rhs.m_descriptorPool, {} ) ) {}\n\n    DescriptorPool & operator=( DescriptorPool && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_descriptorPool = VULKAN_HPP_NAMESPACE::exchange( rhs.m_descriptorPool, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR DescriptorPool( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT DescriptorPool( VkDescriptorPool descriptorPool ) VULKAN_HPP_NOEXCEPT : m_descriptorPool( descriptorPool ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    DescriptorPool & operator=( VkDescriptorPool descriptorPool ) VULKAN_HPP_NOEXCEPT\n    {\n      m_descriptorPool = descriptorPool;\n      return *this;\n    }\n#endif\n\n    DescriptorPool & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_descriptorPool = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkDescriptorPool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_descriptorPool;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_descriptorPool != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_descriptorPool == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkDescriptorPool m_descriptorPool = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eDescriptorPool>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DescriptorPool;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDescriptorPool>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DescriptorPool;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkDescriptorPool, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DescriptorPool;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::DescriptorPool>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class DescriptorSetLayout\n  {\n  public:\n    using CType      = VkDescriptorSetLayout;\n    using NativeType = VkDescriptorSetLayout;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDescriptorSetLayout;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDescriptorSetLayout;\n\n  public:\n    DescriptorSetLayout() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    DescriptorSetLayout( DescriptorSetLayout const & rhs )             = default;\n    DescriptorSetLayout & operator=( DescriptorSetLayout const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    DescriptorSetLayout( DescriptorSetLayout && rhs )             = default;\n    DescriptorSetLayout & operator=( DescriptorSetLayout && rhs ) = default;\n#else\n    DescriptorSetLayout( DescriptorSetLayout && rhs ) VULKAN_HPP_NOEXCEPT\n      : m_descriptorSetLayout( VULKAN_HPP_NAMESPACE::exchange( rhs.m_descriptorSetLayout, {} ) )\n    {\n    }\n\n    DescriptorSetLayout & operator=( DescriptorSetLayout && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_descriptorSetLayout = VULKAN_HPP_NAMESPACE::exchange( rhs.m_descriptorSetLayout, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR DescriptorSetLayout( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT DescriptorSetLayout( VkDescriptorSetLayout descriptorSetLayout ) VULKAN_HPP_NOEXCEPT\n      : m_descriptorSetLayout( descriptorSetLayout )\n    {\n    }\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    DescriptorSetLayout & operator=( VkDescriptorSetLayout descriptorSetLayout ) VULKAN_HPP_NOEXCEPT\n    {\n      m_descriptorSetLayout = descriptorSetLayout;\n      return *this;\n    }\n#endif\n\n    DescriptorSetLayout & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_descriptorSetLayout = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkDescriptorSetLayout() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_descriptorSetLayout;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_descriptorSetLayout != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_descriptorSetLayout == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkDescriptorSetLayout m_descriptorSetLayout = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eDescriptorSetLayout>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DescriptorSetLayout;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDescriptorSetLayout>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DescriptorSetLayout;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkDescriptorSetLayout, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DescriptorSetLayout;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::DescriptorSetLayout>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class Framebuffer\n  {\n  public:\n    using CType      = VkFramebuffer;\n    using NativeType = VkFramebuffer;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eFramebuffer;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eFramebuffer;\n\n  public:\n    Framebuffer() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    Framebuffer( Framebuffer const & rhs )             = default;\n    Framebuffer & operator=( Framebuffer const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    Framebuffer( Framebuffer && rhs )             = default;\n    Framebuffer & operator=( Framebuffer && rhs ) = default;\n#else\n    Framebuffer( Framebuffer && rhs ) VULKAN_HPP_NOEXCEPT : m_framebuffer( VULKAN_HPP_NAMESPACE::exchange( rhs.m_framebuffer, {} ) ) {}\n\n    Framebuffer & operator=( Framebuffer && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_framebuffer = VULKAN_HPP_NAMESPACE::exchange( rhs.m_framebuffer, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR Framebuffer( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT Framebuffer( VkFramebuffer framebuffer ) VULKAN_HPP_NOEXCEPT : m_framebuffer( framebuffer ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    Framebuffer & operator=( VkFramebuffer framebuffer ) VULKAN_HPP_NOEXCEPT\n    {\n      m_framebuffer = framebuffer;\n      return *this;\n    }\n#endif\n\n    Framebuffer & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_framebuffer = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkFramebuffer() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_framebuffer;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_framebuffer != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_framebuffer == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkFramebuffer m_framebuffer = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eFramebuffer>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Framebuffer;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eFramebuffer>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Framebuffer;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkFramebuffer, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Framebuffer;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::Framebuffer>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class IndirectCommandsLayoutEXT\n  {\n  public:\n    using CType      = VkIndirectCommandsLayoutEXT;\n    using NativeType = VkIndirectCommandsLayoutEXT;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eIndirectCommandsLayoutEXT;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n  public:\n    IndirectCommandsLayoutEXT() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    IndirectCommandsLayoutEXT( IndirectCommandsLayoutEXT const & rhs )             = default;\n    IndirectCommandsLayoutEXT & operator=( IndirectCommandsLayoutEXT const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    IndirectCommandsLayoutEXT( IndirectCommandsLayoutEXT && rhs )             = default;\n    IndirectCommandsLayoutEXT & operator=( IndirectCommandsLayoutEXT && rhs ) = default;\n#else\n    IndirectCommandsLayoutEXT( IndirectCommandsLayoutEXT && rhs ) VULKAN_HPP_NOEXCEPT\n      : m_indirectCommandsLayoutEXT( VULKAN_HPP_NAMESPACE::exchange( rhs.m_indirectCommandsLayoutEXT, {} ) )\n    {\n    }\n\n    IndirectCommandsLayoutEXT & operator=( IndirectCommandsLayoutEXT && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_indirectCommandsLayoutEXT = VULKAN_HPP_NAMESPACE::exchange( rhs.m_indirectCommandsLayoutEXT, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR IndirectCommandsLayoutEXT( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT IndirectCommandsLayoutEXT( VkIndirectCommandsLayoutEXT indirectCommandsLayoutEXT ) VULKAN_HPP_NOEXCEPT\n      : m_indirectCommandsLayoutEXT( indirectCommandsLayoutEXT )\n    {\n    }\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    IndirectCommandsLayoutEXT & operator=( VkIndirectCommandsLayoutEXT indirectCommandsLayoutEXT ) VULKAN_HPP_NOEXCEPT\n    {\n      m_indirectCommandsLayoutEXT = indirectCommandsLayoutEXT;\n      return *this;\n    }\n#endif\n\n    IndirectCommandsLayoutEXT & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_indirectCommandsLayoutEXT = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkIndirectCommandsLayoutEXT() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_indirectCommandsLayoutEXT;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_indirectCommandsLayoutEXT != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_indirectCommandsLayoutEXT == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkIndirectCommandsLayoutEXT m_indirectCommandsLayoutEXT = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eIndirectCommandsLayoutEXT>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkIndirectCommandsLayoutEXT, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class IndirectCommandsLayoutNV\n  {\n  public:\n    using CType      = VkIndirectCommandsLayoutNV;\n    using NativeType = VkIndirectCommandsLayoutNV;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eIndirectCommandsLayoutNV;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n  public:\n    IndirectCommandsLayoutNV() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    IndirectCommandsLayoutNV( IndirectCommandsLayoutNV const & rhs )             = default;\n    IndirectCommandsLayoutNV & operator=( IndirectCommandsLayoutNV const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    IndirectCommandsLayoutNV( IndirectCommandsLayoutNV && rhs )             = default;\n    IndirectCommandsLayoutNV & operator=( IndirectCommandsLayoutNV && rhs ) = default;\n#else\n    IndirectCommandsLayoutNV( IndirectCommandsLayoutNV && rhs ) VULKAN_HPP_NOEXCEPT\n      : m_indirectCommandsLayoutNV( VULKAN_HPP_NAMESPACE::exchange( rhs.m_indirectCommandsLayoutNV, {} ) )\n    {\n    }\n\n    IndirectCommandsLayoutNV & operator=( IndirectCommandsLayoutNV && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_indirectCommandsLayoutNV = VULKAN_HPP_NAMESPACE::exchange( rhs.m_indirectCommandsLayoutNV, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR IndirectCommandsLayoutNV( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT IndirectCommandsLayoutNV( VkIndirectCommandsLayoutNV indirectCommandsLayoutNV ) VULKAN_HPP_NOEXCEPT\n      : m_indirectCommandsLayoutNV( indirectCommandsLayoutNV )\n    {\n    }\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    IndirectCommandsLayoutNV & operator=( VkIndirectCommandsLayoutNV indirectCommandsLayoutNV ) VULKAN_HPP_NOEXCEPT\n    {\n      m_indirectCommandsLayoutNV = indirectCommandsLayoutNV;\n      return *this;\n    }\n#endif\n\n    IndirectCommandsLayoutNV & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_indirectCommandsLayoutNV = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkIndirectCommandsLayoutNV() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_indirectCommandsLayoutNV;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_indirectCommandsLayoutNV != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_indirectCommandsLayoutNV == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkIndirectCommandsLayoutNV m_indirectCommandsLayoutNV = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eIndirectCommandsLayoutNV>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkIndirectCommandsLayoutNV, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class IndirectExecutionSetEXT\n  {\n  public:\n    using CType      = VkIndirectExecutionSetEXT;\n    using NativeType = VkIndirectExecutionSetEXT;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eIndirectExecutionSetEXT;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n  public:\n    IndirectExecutionSetEXT() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    IndirectExecutionSetEXT( IndirectExecutionSetEXT const & rhs )             = default;\n    IndirectExecutionSetEXT & operator=( IndirectExecutionSetEXT const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    IndirectExecutionSetEXT( IndirectExecutionSetEXT && rhs )             = default;\n    IndirectExecutionSetEXT & operator=( IndirectExecutionSetEXT && rhs ) = default;\n#else\n    IndirectExecutionSetEXT( IndirectExecutionSetEXT && rhs ) VULKAN_HPP_NOEXCEPT\n      : m_indirectExecutionSetEXT( VULKAN_HPP_NAMESPACE::exchange( rhs.m_indirectExecutionSetEXT, {} ) )\n    {\n    }\n\n    IndirectExecutionSetEXT & operator=( IndirectExecutionSetEXT && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_indirectExecutionSetEXT = VULKAN_HPP_NAMESPACE::exchange( rhs.m_indirectExecutionSetEXT, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR IndirectExecutionSetEXT( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT IndirectExecutionSetEXT( VkIndirectExecutionSetEXT indirectExecutionSetEXT ) VULKAN_HPP_NOEXCEPT\n      : m_indirectExecutionSetEXT( indirectExecutionSetEXT )\n    {\n    }\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    IndirectExecutionSetEXT & operator=( VkIndirectExecutionSetEXT indirectExecutionSetEXT ) VULKAN_HPP_NOEXCEPT\n    {\n      m_indirectExecutionSetEXT = indirectExecutionSetEXT;\n      return *this;\n    }\n#endif\n\n    IndirectExecutionSetEXT & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_indirectExecutionSetEXT = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkIndirectExecutionSetEXT() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_indirectExecutionSetEXT;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_indirectExecutionSetEXT != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_indirectExecutionSetEXT == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkIndirectExecutionSetEXT m_indirectExecutionSetEXT = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eIndirectExecutionSetEXT>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkIndirectExecutionSetEXT, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class PrivateDataSlot\n  {\n  public:\n    using CType      = VkPrivateDataSlot;\n    using NativeType = VkPrivateDataSlot;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::ePrivateDataSlot;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n  public:\n    PrivateDataSlot() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    PrivateDataSlot( PrivateDataSlot const & rhs )             = default;\n    PrivateDataSlot & operator=( PrivateDataSlot const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    PrivateDataSlot( PrivateDataSlot && rhs )             = default;\n    PrivateDataSlot & operator=( PrivateDataSlot && rhs ) = default;\n#else\n    PrivateDataSlot( PrivateDataSlot && rhs ) VULKAN_HPP_NOEXCEPT : m_privateDataSlot( VULKAN_HPP_NAMESPACE::exchange( rhs.m_privateDataSlot, {} ) ) {}\n\n    PrivateDataSlot & operator=( PrivateDataSlot && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_privateDataSlot = VULKAN_HPP_NAMESPACE::exchange( rhs.m_privateDataSlot, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR PrivateDataSlot( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT PrivateDataSlot( VkPrivateDataSlot privateDataSlot ) VULKAN_HPP_NOEXCEPT : m_privateDataSlot( privateDataSlot ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    PrivateDataSlot & operator=( VkPrivateDataSlot privateDataSlot ) VULKAN_HPP_NOEXCEPT\n    {\n      m_privateDataSlot = privateDataSlot;\n      return *this;\n    }\n#endif\n\n    PrivateDataSlot & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_privateDataSlot = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkPrivateDataSlot() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_privateDataSlot;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_privateDataSlot != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_privateDataSlot == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkPrivateDataSlot m_privateDataSlot = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::ePrivateDataSlot>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::PrivateDataSlot;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkPrivateDataSlot, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::PrivateDataSlot;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::PrivateDataSlot>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  using PrivateDataSlotEXT = PrivateDataSlot;\n\n  class RenderPass\n  {\n  public:\n    using CType      = VkRenderPass;\n    using NativeType = VkRenderPass;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eRenderPass;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eRenderPass;\n\n  public:\n    RenderPass() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    RenderPass( RenderPass const & rhs )             = default;\n    RenderPass & operator=( RenderPass const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    RenderPass( RenderPass && rhs )             = default;\n    RenderPass & operator=( RenderPass && rhs ) = default;\n#else\n    RenderPass( RenderPass && rhs ) VULKAN_HPP_NOEXCEPT : m_renderPass( VULKAN_HPP_NAMESPACE::exchange( rhs.m_renderPass, {} ) ) {}\n\n    RenderPass & operator=( RenderPass && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_renderPass = VULKAN_HPP_NAMESPACE::exchange( rhs.m_renderPass, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR RenderPass( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT RenderPass( VkRenderPass renderPass ) VULKAN_HPP_NOEXCEPT : m_renderPass( renderPass ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    RenderPass & operator=( VkRenderPass renderPass ) VULKAN_HPP_NOEXCEPT\n    {\n      m_renderPass = renderPass;\n      return *this;\n    }\n#endif\n\n    RenderPass & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_renderPass = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkRenderPass() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_renderPass;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_renderPass != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_renderPass == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkRenderPass m_renderPass = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eRenderPass>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::RenderPass;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eRenderPass>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::RenderPass;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkRenderPass, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::RenderPass;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::RenderPass>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class Sampler\n  {\n  public:\n    using CType      = VkSampler;\n    using NativeType = VkSampler;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eSampler;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSampler;\n\n  public:\n    Sampler() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    Sampler( Sampler const & rhs )             = default;\n    Sampler & operator=( Sampler const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    Sampler( Sampler && rhs )             = default;\n    Sampler & operator=( Sampler && rhs ) = default;\n#else\n    Sampler( Sampler && rhs ) VULKAN_HPP_NOEXCEPT : m_sampler( VULKAN_HPP_NAMESPACE::exchange( rhs.m_sampler, {} ) ) {}\n\n    Sampler & operator=( Sampler && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_sampler = VULKAN_HPP_NAMESPACE::exchange( rhs.m_sampler, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR Sampler( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT Sampler( VkSampler sampler ) VULKAN_HPP_NOEXCEPT : m_sampler( sampler ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    Sampler & operator=( VkSampler sampler ) VULKAN_HPP_NOEXCEPT\n    {\n      m_sampler = sampler;\n      return *this;\n    }\n#endif\n\n    Sampler & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_sampler = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkSampler() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_sampler;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_sampler != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_sampler == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkSampler m_sampler = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eSampler>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Sampler;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSampler>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Sampler;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkSampler, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Sampler;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::Sampler>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class SamplerYcbcrConversion\n  {\n  public:\n    using CType      = VkSamplerYcbcrConversion;\n    using NativeType = VkSamplerYcbcrConversion;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eSamplerYcbcrConversion;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSamplerYcbcrConversion;\n\n  public:\n    SamplerYcbcrConversion() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    SamplerYcbcrConversion( SamplerYcbcrConversion const & rhs )             = default;\n    SamplerYcbcrConversion & operator=( SamplerYcbcrConversion const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    SamplerYcbcrConversion( SamplerYcbcrConversion && rhs )             = default;\n    SamplerYcbcrConversion & operator=( SamplerYcbcrConversion && rhs ) = default;\n#else\n    SamplerYcbcrConversion( SamplerYcbcrConversion && rhs ) VULKAN_HPP_NOEXCEPT\n      : m_samplerYcbcrConversion( VULKAN_HPP_NAMESPACE::exchange( rhs.m_samplerYcbcrConversion, {} ) )\n    {\n    }\n\n    SamplerYcbcrConversion & operator=( SamplerYcbcrConversion && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_samplerYcbcrConversion = VULKAN_HPP_NAMESPACE::exchange( rhs.m_samplerYcbcrConversion, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR SamplerYcbcrConversion( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT SamplerYcbcrConversion( VkSamplerYcbcrConversion samplerYcbcrConversion ) VULKAN_HPP_NOEXCEPT\n      : m_samplerYcbcrConversion( samplerYcbcrConversion )\n    {\n    }\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    SamplerYcbcrConversion & operator=( VkSamplerYcbcrConversion samplerYcbcrConversion ) VULKAN_HPP_NOEXCEPT\n    {\n      m_samplerYcbcrConversion = samplerYcbcrConversion;\n      return *this;\n    }\n#endif\n\n    SamplerYcbcrConversion & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_samplerYcbcrConversion = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkSamplerYcbcrConversion() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_samplerYcbcrConversion;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_samplerYcbcrConversion != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_samplerYcbcrConversion == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkSamplerYcbcrConversion m_samplerYcbcrConversion = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eSamplerYcbcrConversion>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSamplerYcbcrConversion>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkSamplerYcbcrConversion, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  using SamplerYcbcrConversionKHR = SamplerYcbcrConversion;\n\n  class ShaderModule\n  {\n  public:\n    using CType      = VkShaderModule;\n    using NativeType = VkShaderModule;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eShaderModule;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eShaderModule;\n\n  public:\n    ShaderModule() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    ShaderModule( ShaderModule const & rhs )             = default;\n    ShaderModule & operator=( ShaderModule const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    ShaderModule( ShaderModule && rhs )             = default;\n    ShaderModule & operator=( ShaderModule && rhs ) = default;\n#else\n    ShaderModule( ShaderModule && rhs ) VULKAN_HPP_NOEXCEPT : m_shaderModule( VULKAN_HPP_NAMESPACE::exchange( rhs.m_shaderModule, {} ) ) {}\n\n    ShaderModule & operator=( ShaderModule && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_shaderModule = VULKAN_HPP_NAMESPACE::exchange( rhs.m_shaderModule, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR ShaderModule( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT ShaderModule( VkShaderModule shaderModule ) VULKAN_HPP_NOEXCEPT : m_shaderModule( shaderModule ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    ShaderModule & operator=( VkShaderModule shaderModule ) VULKAN_HPP_NOEXCEPT\n    {\n      m_shaderModule = shaderModule;\n      return *this;\n    }\n#endif\n\n    ShaderModule & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_shaderModule = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkShaderModule() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_shaderModule;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_shaderModule != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_shaderModule == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkShaderModule m_shaderModule = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eShaderModule>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::ShaderModule;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eShaderModule>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::ShaderModule;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkShaderModule, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::ShaderModule;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::ShaderModule>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class ValidationCacheEXT\n  {\n  public:\n    using CType      = VkValidationCacheEXT;\n    using NativeType = VkValidationCacheEXT;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eValidationCacheEXT;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eValidationCacheEXT;\n\n  public:\n    ValidationCacheEXT() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    ValidationCacheEXT( ValidationCacheEXT const & rhs )             = default;\n    ValidationCacheEXT & operator=( ValidationCacheEXT const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    ValidationCacheEXT( ValidationCacheEXT && rhs )             = default;\n    ValidationCacheEXT & operator=( ValidationCacheEXT && rhs ) = default;\n#else\n    ValidationCacheEXT( ValidationCacheEXT && rhs ) VULKAN_HPP_NOEXCEPT : m_validationCacheEXT( VULKAN_HPP_NAMESPACE::exchange( rhs.m_validationCacheEXT, {} ) )\n    {\n    }\n\n    ValidationCacheEXT & operator=( ValidationCacheEXT && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_validationCacheEXT = VULKAN_HPP_NAMESPACE::exchange( rhs.m_validationCacheEXT, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR ValidationCacheEXT( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT ValidationCacheEXT( VkValidationCacheEXT validationCacheEXT ) VULKAN_HPP_NOEXCEPT : m_validationCacheEXT( validationCacheEXT )\n    {\n    }\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    ValidationCacheEXT & operator=( VkValidationCacheEXT validationCacheEXT ) VULKAN_HPP_NOEXCEPT\n    {\n      m_validationCacheEXT = validationCacheEXT;\n      return *this;\n    }\n#endif\n\n    ValidationCacheEXT & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_validationCacheEXT = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkValidationCacheEXT() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_validationCacheEXT;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_validationCacheEXT != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_validationCacheEXT == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkValidationCacheEXT m_validationCacheEXT = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eValidationCacheEXT>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::ValidationCacheEXT;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eValidationCacheEXT>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::ValidationCacheEXT;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkValidationCacheEXT, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::ValidationCacheEXT;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::ValidationCacheEXT>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class VideoSessionParametersKHR\n  {\n  public:\n    using CType      = VkVideoSessionParametersKHR;\n    using NativeType = VkVideoSessionParametersKHR;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eVideoSessionParametersKHR;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n  public:\n    VideoSessionParametersKHR() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    VideoSessionParametersKHR( VideoSessionParametersKHR const & rhs )             = default;\n    VideoSessionParametersKHR & operator=( VideoSessionParametersKHR const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    VideoSessionParametersKHR( VideoSessionParametersKHR && rhs )             = default;\n    VideoSessionParametersKHR & operator=( VideoSessionParametersKHR && rhs ) = default;\n#else\n    VideoSessionParametersKHR( VideoSessionParametersKHR && rhs ) VULKAN_HPP_NOEXCEPT\n      : m_videoSessionParametersKHR( VULKAN_HPP_NAMESPACE::exchange( rhs.m_videoSessionParametersKHR, {} ) )\n    {\n    }\n\n    VideoSessionParametersKHR & operator=( VideoSessionParametersKHR && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_videoSessionParametersKHR = VULKAN_HPP_NAMESPACE::exchange( rhs.m_videoSessionParametersKHR, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR VideoSessionParametersKHR( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT VideoSessionParametersKHR( VkVideoSessionParametersKHR videoSessionParametersKHR ) VULKAN_HPP_NOEXCEPT\n      : m_videoSessionParametersKHR( videoSessionParametersKHR )\n    {\n    }\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    VideoSessionParametersKHR & operator=( VkVideoSessionParametersKHR videoSessionParametersKHR ) VULKAN_HPP_NOEXCEPT\n    {\n      m_videoSessionParametersKHR = videoSessionParametersKHR;\n      return *this;\n    }\n#endif\n\n    VideoSessionParametersKHR & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_videoSessionParametersKHR = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkVideoSessionParametersKHR() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_videoSessionParametersKHR;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_videoSessionParametersKHR != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_videoSessionParametersKHR == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkVideoSessionParametersKHR m_videoSessionParametersKHR = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eVideoSessionParametersKHR>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkVideoSessionParametersKHR, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class PipelineBinaryKHR\n  {\n  public:\n    using CType      = VkPipelineBinaryKHR;\n    using NativeType = VkPipelineBinaryKHR;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::ePipelineBinaryKHR;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n  public:\n    PipelineBinaryKHR() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    PipelineBinaryKHR( PipelineBinaryKHR const & rhs )             = default;\n    PipelineBinaryKHR & operator=( PipelineBinaryKHR const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    PipelineBinaryKHR( PipelineBinaryKHR && rhs )             = default;\n    PipelineBinaryKHR & operator=( PipelineBinaryKHR && rhs ) = default;\n#else\n    PipelineBinaryKHR( PipelineBinaryKHR && rhs ) VULKAN_HPP_NOEXCEPT : m_pipelineBinaryKHR( VULKAN_HPP_NAMESPACE::exchange( rhs.m_pipelineBinaryKHR, {} ) ) {}\n\n    PipelineBinaryKHR & operator=( PipelineBinaryKHR && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_pipelineBinaryKHR = VULKAN_HPP_NAMESPACE::exchange( rhs.m_pipelineBinaryKHR, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR PipelineBinaryKHR( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT PipelineBinaryKHR( VkPipelineBinaryKHR pipelineBinaryKHR ) VULKAN_HPP_NOEXCEPT : m_pipelineBinaryKHR( pipelineBinaryKHR ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    PipelineBinaryKHR & operator=( VkPipelineBinaryKHR pipelineBinaryKHR ) VULKAN_HPP_NOEXCEPT\n    {\n      m_pipelineBinaryKHR = pipelineBinaryKHR;\n      return *this;\n    }\n#endif\n\n    PipelineBinaryKHR & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_pipelineBinaryKHR = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkPipelineBinaryKHR() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_pipelineBinaryKHR;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_pipelineBinaryKHR != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_pipelineBinaryKHR == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkPipelineBinaryKHR m_pipelineBinaryKHR = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::ePipelineBinaryKHR>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::PipelineBinaryKHR;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkPipelineBinaryKHR, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::PipelineBinaryKHR;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class Queue\n  {\n  public:\n    using CType      = VkQueue;\n    using NativeType = VkQueue;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eQueue;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eQueue;\n\n  public:\n    Queue() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    Queue( Queue const & rhs )             = default;\n    Queue & operator=( Queue const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    Queue( Queue && rhs )             = default;\n    Queue & operator=( Queue && rhs ) = default;\n#else\n    Queue( Queue && rhs ) VULKAN_HPP_NOEXCEPT : m_queue( VULKAN_HPP_NAMESPACE::exchange( rhs.m_queue, {} ) ) {}\n\n    Queue & operator=( Queue && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_queue = VULKAN_HPP_NAMESPACE::exchange( rhs.m_queue, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR Queue( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    Queue( VkQueue queue ) VULKAN_HPP_NOEXCEPT : m_queue( queue ) {}\n\n    Queue & operator=( VkQueue queue ) VULKAN_HPP_NOEXCEPT\n    {\n      m_queue = queue;\n      return *this;\n    }\n\n    Queue & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_queue = {};\n      return *this;\n    }\n\n    //=== VK_VERSION_1_0 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result submit( uint32_t                                 submitCount,\n                                        const VULKAN_HPP_NAMESPACE::SubmitInfo * pSubmits,\n                                        VULKAN_HPP_NAMESPACE::Fence              fence,\n                                        Dispatch const & d                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      submit( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SubmitInfo> const & submits,\n              VULKAN_HPP_NAMESPACE::Fence fence                                                VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n              Dispatch const & d                                                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result waitIdle( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type waitIdle( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result bindSparse( uint32_t                                     bindInfoCount,\n                                            const VULKAN_HPP_NAMESPACE::BindSparseInfo * pBindInfo,\n                                            VULKAN_HPP_NAMESPACE::Fence                  fence,\n                                            Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      bindSparse( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindSparseInfo> const & bindInfo,\n                  VULKAN_HPP_NAMESPACE::Fence fence                                                    VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                  Dispatch const & d                                                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_VERSION_1_3 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result submit2( uint32_t                                  submitCount,\n                                         const VULKAN_HPP_NAMESPACE::SubmitInfo2 * pSubmits,\n                                         VULKAN_HPP_NAMESPACE::Fence               fence,\n                                         Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      submit2( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SubmitInfo2> const & submits,\n               VULKAN_HPP_NAMESPACE::Fence fence                                                 VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n               Dispatch const & d                                                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_swapchain ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result presentKHR( const VULKAN_HPP_NAMESPACE::PresentInfoKHR * pPresentInfo,\n                                            Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result presentKHR( const VULKAN_HPP_NAMESPACE::PresentInfoKHR & presentInfo,\n                                                                  Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_debug_utils ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void beginDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT * pLabelInfo,\n                                  Dispatch const & d                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void beginDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT & labelInfo,\n                                  Dispatch const & d                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void endDebugUtilsLabelEXT( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void insertDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT * pLabelInfo,\n                                   Dispatch const & d                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void insertDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT & labelInfo,\n                                   Dispatch const & d                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NV_device_diagnostic_checkpoints ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getCheckpointDataNV( uint32_t *                               pCheckpointDataCount,\n                              VULKAN_HPP_NAMESPACE::CheckpointDataNV * pCheckpointData,\n                              Dispatch const & d                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <\n      typename CheckpointDataNVAllocator = std::allocator<VULKAN_HPP_NAMESPACE::CheckpointDataNV>,\n      typename Dispatch                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename CheckpointDataNVAllocator::value_type, VULKAN_HPP_NAMESPACE::CheckpointDataNV>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::CheckpointDataNV, CheckpointDataNVAllocator>\n                         getCheckpointDataNV( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <\n      typename CheckpointDataNVAllocator = std::allocator<VULKAN_HPP_NAMESPACE::CheckpointDataNV>,\n      typename Dispatch                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename CheckpointDataNVAllocator::value_type, VULKAN_HPP_NAMESPACE::CheckpointDataNV>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::CheckpointDataNV, CheckpointDataNVAllocator>\n      getCheckpointDataNV( CheckpointDataNVAllocator & checkpointDataNVAllocator, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getCheckpointData2NV( uint32_t *                                pCheckpointDataCount,\n                               VULKAN_HPP_NAMESPACE::CheckpointData2NV * pCheckpointData,\n                               Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <\n      typename CheckpointData2NVAllocator = std::allocator<VULKAN_HPP_NAMESPACE::CheckpointData2NV>,\n      typename Dispatch                   = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename CheckpointData2NVAllocator::value_type, VULKAN_HPP_NAMESPACE::CheckpointData2NV>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::CheckpointData2NV, CheckpointData2NVAllocator>\n                         getCheckpointData2NV( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <\n      typename CheckpointData2NVAllocator = std::allocator<VULKAN_HPP_NAMESPACE::CheckpointData2NV>,\n      typename Dispatch                   = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename CheckpointData2NVAllocator::value_type, VULKAN_HPP_NAMESPACE::CheckpointData2NV>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::CheckpointData2NV, CheckpointData2NVAllocator>\n      getCheckpointData2NV( CheckpointData2NVAllocator & checkpointData2NVAllocator, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_INTEL_performance_query ===\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result setPerformanceConfigurationINTEL( VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration,\n                                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      setPerformanceConfigurationINTEL( VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration,\n                                        Dispatch const & d                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    //=== VK_KHR_synchronization2 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result submit2KHR( uint32_t                                  submitCount,\n                                            const VULKAN_HPP_NAMESPACE::SubmitInfo2 * pSubmits,\n                                            VULKAN_HPP_NAMESPACE::Fence               fence,\n                                            Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      submit2KHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SubmitInfo2> const & submits,\n                  VULKAN_HPP_NAMESPACE::Fence fence                                                 VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                  Dispatch const & d                                                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NV_low_latency2 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void notifyOutOfBandNV( const VULKAN_HPP_NAMESPACE::OutOfBandQueueTypeInfoNV * pQueueTypeInfo,\n                            Dispatch const & d                                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void notifyOutOfBandNV( const VULKAN_HPP_NAMESPACE::OutOfBandQueueTypeInfoNV & queueTypeInfo,\n                            Dispatch const & d                                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    operator VkQueue() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_queue;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_queue != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_queue == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkQueue m_queue = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eQueue>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Queue;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eQueue>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Queue;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkQueue, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Queue;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::Queue>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class Device\n  {\n  public:\n    using CType      = VkDevice;\n    using NativeType = VkDevice;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDevice;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDevice;\n\n  public:\n    Device() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    Device( Device const & rhs )             = default;\n    Device & operator=( Device const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    Device( Device && rhs )             = default;\n    Device & operator=( Device && rhs ) = default;\n#else\n    Device( Device && rhs ) VULKAN_HPP_NOEXCEPT : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) ) {}\n\n    Device & operator=( Device && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_device = VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR Device( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    Device( VkDevice device ) VULKAN_HPP_NOEXCEPT : m_device( device ) {}\n\n    Device & operator=( VkDevice device ) VULKAN_HPP_NOEXCEPT\n    {\n      m_device = device;\n      return *this;\n    }\n\n    Device & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_device = {};\n      return *this;\n    }\n\n    //=== VK_VERSION_1_0 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    PFN_vkVoidFunction getProcAddr( const char * pName, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NAMESPACE::PFN_VoidFunction getProcAddr( const std::string & name,\n                                                        Dispatch const & d  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getQueue( uint32_t                      queueFamilyIndex,\n                   uint32_t                      queueIndex,\n                   VULKAN_HPP_NAMESPACE::Queue * pQueue,\n                   Dispatch const & d            VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Queue\n      getQueue( uint32_t queueFamilyIndex, uint32_t queueIndex, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result waitIdle( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type waitIdle( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result allocateMemory( const VULKAN_HPP_NAMESPACE::MemoryAllocateInfo *  pAllocateInfo,\n                                                const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                VULKAN_HPP_NAMESPACE::DeviceMemory *              pMemory,\n                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::DeviceMemory>::type\n      allocateMemory( const VULKAN_HPP_NAMESPACE::MemoryAllocateInfo &                    allocateInfo,\n                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                      Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DeviceMemory, Dispatch>>::type\n      allocateMemoryUnique( const VULKAN_HPP_NAMESPACE::MemoryAllocateInfo &                    allocateInfo,\n                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                            Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void freeMemory( VULKAN_HPP_NAMESPACE::DeviceMemory                memory,\n                     const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                     Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void freeMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory                           VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                     Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void( free )( VULKAN_HPP_NAMESPACE::DeviceMemory                memory,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void( free )( VULKAN_HPP_NAMESPACE::DeviceMemory                                  memory,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result mapMemory( VULKAN_HPP_NAMESPACE::DeviceMemory   memory,\n                                           VULKAN_HPP_NAMESPACE::DeviceSize     offset,\n                                           VULKAN_HPP_NAMESPACE::DeviceSize     size,\n                                           VULKAN_HPP_NAMESPACE::MemoryMapFlags flags,\n                                           void **                              ppData,\n                                           Dispatch const & d                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<void *>::type mapMemory( VULKAN_HPP_NAMESPACE::DeviceMemory         memory,\n                                                                           VULKAN_HPP_NAMESPACE::DeviceSize           offset,\n                                                                           VULKAN_HPP_NAMESPACE::DeviceSize           size,\n                                                                           VULKAN_HPP_NAMESPACE::MemoryMapFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void unmapMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result flushMappedMemoryRanges( uint32_t                                        memoryRangeCount,\n                                                         const VULKAN_HPP_NAMESPACE::MappedMemoryRange * pMemoryRanges,\n                                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      flushMappedMemoryRanges( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MappedMemoryRange> const & memoryRanges,\n                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result invalidateMappedMemoryRanges( uint32_t                                        memoryRangeCount,\n                                                              const VULKAN_HPP_NAMESPACE::MappedMemoryRange * pMemoryRanges,\n                                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      invalidateMappedMemoryRanges( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MappedMemoryRange> const & memoryRanges,\n                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getMemoryCommitment( VULKAN_HPP_NAMESPACE::DeviceMemory memory,\n                              VULKAN_HPP_NAMESPACE::DeviceSize * pCommittedMemoryInBytes,\n                              Dispatch const & d                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceSize\n      getMemoryCommitment( VULKAN_HPP_NAMESPACE::DeviceMemory memory, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result bindBufferMemory( VULKAN_HPP_NAMESPACE::Buffer       buffer,\n                                                  VULKAN_HPP_NAMESPACE::DeviceMemory memory,\n                                                  VULKAN_HPP_NAMESPACE::DeviceSize   memoryOffset,\n                                                  Dispatch const & d                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      bindBufferMemory( VULKAN_HPP_NAMESPACE::Buffer       buffer,\n                        VULKAN_HPP_NAMESPACE::DeviceMemory memory,\n                        VULKAN_HPP_NAMESPACE::DeviceSize   memoryOffset,\n                        Dispatch const & d                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result bindImageMemory( VULKAN_HPP_NAMESPACE::Image        image,\n                                                 VULKAN_HPP_NAMESPACE::DeviceMemory memory,\n                                                 VULKAN_HPP_NAMESPACE::DeviceSize   memoryOffset,\n                                                 Dispatch const & d                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      bindImageMemory( VULKAN_HPP_NAMESPACE::Image        image,\n                       VULKAN_HPP_NAMESPACE::DeviceMemory memory,\n                       VULKAN_HPP_NAMESPACE::DeviceSize   memoryOffset,\n                       Dispatch const & d                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getBufferMemoryRequirements( VULKAN_HPP_NAMESPACE::Buffer               buffer,\n                                      VULKAN_HPP_NAMESPACE::MemoryRequirements * pMemoryRequirements,\n                                      Dispatch const & d                         VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements\n      getBufferMemoryRequirements( VULKAN_HPP_NAMESPACE::Buffer buffer, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getImageMemoryRequirements( VULKAN_HPP_NAMESPACE::Image                image,\n                                     VULKAN_HPP_NAMESPACE::MemoryRequirements * pMemoryRequirements,\n                                     Dispatch const & d                         VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements\n      getImageMemoryRequirements( VULKAN_HPP_NAMESPACE::Image image, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getImageSparseMemoryRequirements( VULKAN_HPP_NAMESPACE::Image                           image,\n                                           uint32_t *                                            pSparseMemoryRequirementCount,\n                                           VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements * pSparseMemoryRequirements,\n                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename SparseImageMemoryRequirementsAllocator = std::allocator<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements>,\n              typename Dispatch                               = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename SparseImageMemoryRequirementsAllocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements, SparseImageMemoryRequirementsAllocator>\n      getImageSparseMemoryRequirements( VULKAN_HPP_NAMESPACE::Image image, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename SparseImageMemoryRequirementsAllocator = std::allocator<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements>,\n              typename Dispatch                               = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename SparseImageMemoryRequirementsAllocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements, SparseImageMemoryRequirementsAllocator>\n                         getImageSparseMemoryRequirements( VULKAN_HPP_NAMESPACE::Image              image,\n                                                           SparseImageMemoryRequirementsAllocator & sparseImageMemoryRequirementsAllocator,\n                                                           Dispatch const & d                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createFence( const VULKAN_HPP_NAMESPACE::FenceCreateInfo *     pCreateInfo,\n                                             const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                             VULKAN_HPP_NAMESPACE::Fence *                     pFence,\n                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::Fence>::type\n      createFence( const VULKAN_HPP_NAMESPACE::FenceCreateInfo &                       createInfo,\n                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                   Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::Fence, Dispatch>>::type\n      createFenceUnique( const VULKAN_HPP_NAMESPACE::FenceCreateInfo &                       createInfo,\n                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                         Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyFence( VULKAN_HPP_NAMESPACE::Fence                       fence,\n                       const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                       Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyFence( VULKAN_HPP_NAMESPACE::Fence fence                                   VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                       Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::Fence                       fence,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::Fence                                         fence,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result resetFences( uint32_t                            fenceCount,\n                                             const VULKAN_HPP_NAMESPACE::Fence * pFences,\n                                             Dispatch const & d                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    typename ResultValueType<void>::type resetFences( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Fence> const & fences,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getFenceStatus( VULKAN_HPP_NAMESPACE::Fence fence,\n                                                Dispatch const & d          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result getFenceStatus( VULKAN_HPP_NAMESPACE::Fence fence,\n                                                                      Dispatch const & d          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result waitForFences( uint32_t                            fenceCount,\n                                               const VULKAN_HPP_NAMESPACE::Fence * pFences,\n                                               VULKAN_HPP_NAMESPACE::Bool32        waitAll,\n                                               uint64_t                            timeout,\n                                               Dispatch const & d                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result waitForFences( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Fence> const & fences,\n                                                                     VULKAN_HPP_NAMESPACE::Bool32                                                waitAll,\n                                                                     uint64_t                                                                    timeout,\n                                                                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createSemaphore( const VULKAN_HPP_NAMESPACE::SemaphoreCreateInfo * pCreateInfo,\n                                                 const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                 VULKAN_HPP_NAMESPACE::Semaphore *                 pSemaphore,\n                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::Semaphore>::type\n      createSemaphore( const VULKAN_HPP_NAMESPACE::SemaphoreCreateInfo &                   createInfo,\n                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                       Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::Semaphore, Dispatch>>::type\n      createSemaphoreUnique( const VULKAN_HPP_NAMESPACE::SemaphoreCreateInfo &                   createInfo,\n                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                             Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroySemaphore( VULKAN_HPP_NAMESPACE::Semaphore                   semaphore,\n                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                           Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroySemaphore( VULKAN_HPP_NAMESPACE::Semaphore semaphore                           VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::Semaphore                   semaphore,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::Semaphore                                     semaphore,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createEvent( const VULKAN_HPP_NAMESPACE::EventCreateInfo *     pCreateInfo,\n                                             const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                             VULKAN_HPP_NAMESPACE::Event *                     pEvent,\n                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::Event>::type\n      createEvent( const VULKAN_HPP_NAMESPACE::EventCreateInfo &                       createInfo,\n                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                   Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::Event, Dispatch>>::type\n      createEventUnique( const VULKAN_HPP_NAMESPACE::EventCreateInfo &                       createInfo,\n                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                         Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyEvent( VULKAN_HPP_NAMESPACE::Event                       event,\n                       const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                       Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyEvent( VULKAN_HPP_NAMESPACE::Event event                                   VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                       Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::Event                       event,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::Event                                         event,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getEventStatus( VULKAN_HPP_NAMESPACE::Event event,\n                                                Dispatch const & d          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result getEventStatus( VULKAN_HPP_NAMESPACE::Event event,\n                                                                      Dispatch const & d          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result setEvent( VULKAN_HPP_NAMESPACE::Event event,\n                                          Dispatch const & d          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type setEvent( VULKAN_HPP_NAMESPACE::Event event,\n                                                                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result resetEvent( VULKAN_HPP_NAMESPACE::Event event,\n                                            Dispatch const & d          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    typename ResultValueType<void>::type resetEvent( VULKAN_HPP_NAMESPACE::Event event, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createQueryPool( const VULKAN_HPP_NAMESPACE::QueryPoolCreateInfo * pCreateInfo,\n                                                 const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                 VULKAN_HPP_NAMESPACE::QueryPool *                 pQueryPool,\n                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::QueryPool>::type\n      createQueryPool( const VULKAN_HPP_NAMESPACE::QueryPoolCreateInfo &                   createInfo,\n                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                       Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::QueryPool, Dispatch>>::type\n      createQueryPoolUnique( const VULKAN_HPP_NAMESPACE::QueryPoolCreateInfo &                   createInfo,\n                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                             Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyQueryPool( VULKAN_HPP_NAMESPACE::QueryPool                   queryPool,\n                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                           Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyQueryPool( VULKAN_HPP_NAMESPACE::QueryPool queryPool                           VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::QueryPool                   queryPool,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::QueryPool                                     queryPool,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getQueryPoolResults( VULKAN_HPP_NAMESPACE::QueryPool        queryPool,\n                                                     uint32_t                               firstQuery,\n                                                     uint32_t                               queryCount,\n                                                     size_t                                 dataSize,\n                                                     void *                                 pData,\n                                                     VULKAN_HPP_NAMESPACE::DeviceSize       stride,\n                                                     VULKAN_HPP_NAMESPACE::QueryResultFlags flags,\n                                                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename DataType,\n              typename DataTypeAllocator                                                                                = std::allocator<DataType>,\n              typename Dispatch                                                                                         = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename DataTypeAllocator::value_type, DataType>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<DataType, DataTypeAllocator>>\n                         getQueryPoolResults( VULKAN_HPP_NAMESPACE::QueryPool              queryPool,\n                                              uint32_t                                     firstQuery,\n                                              uint32_t                                     queryCount,\n                                              size_t                                       dataSize,\n                                              VULKAN_HPP_NAMESPACE::DeviceSize             stride,\n                                              VULKAN_HPP_NAMESPACE::QueryResultFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                              Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename DataType, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD ResultValue<DataType> getQueryPoolResult( VULKAN_HPP_NAMESPACE::QueryPool              queryPool,\n                                                                   uint32_t                                     firstQuery,\n                                                                   uint32_t                                     queryCount,\n                                                                   VULKAN_HPP_NAMESPACE::DeviceSize             stride,\n                                                                   VULKAN_HPP_NAMESPACE::QueryResultFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createBuffer( const VULKAN_HPP_NAMESPACE::BufferCreateInfo *    pCreateInfo,\n                                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                              VULKAN_HPP_NAMESPACE::Buffer *                    pBuffer,\n                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::Buffer>::type\n      createBuffer( const VULKAN_HPP_NAMESPACE::BufferCreateInfo &                      createInfo,\n                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                    Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::Buffer, Dispatch>>::type\n      createBufferUnique( const VULKAN_HPP_NAMESPACE::BufferCreateInfo &                      createInfo,\n                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                          Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyBuffer( VULKAN_HPP_NAMESPACE::Buffer                      buffer,\n                        const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                        Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyBuffer( VULKAN_HPP_NAMESPACE::Buffer buffer                                 VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::Buffer                      buffer,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::Buffer                                        buffer,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createBufferView( const VULKAN_HPP_NAMESPACE::BufferViewCreateInfo * pCreateInfo,\n                                                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks *  pAllocator,\n                                                  VULKAN_HPP_NAMESPACE::BufferView *                 pView,\n                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::BufferView>::type\n      createBufferView( const VULKAN_HPP_NAMESPACE::BufferViewCreateInfo &                  createInfo,\n                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                        Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::BufferView, Dispatch>>::type\n      createBufferViewUnique( const VULKAN_HPP_NAMESPACE::BufferViewCreateInfo &                  createInfo,\n                              Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                              Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyBufferView( VULKAN_HPP_NAMESPACE::BufferView                  bufferView,\n                            const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                            Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyBufferView( VULKAN_HPP_NAMESPACE::BufferView bufferView                         VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::BufferView                  bufferView,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::BufferView                                    bufferView,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createImage( const VULKAN_HPP_NAMESPACE::ImageCreateInfo *     pCreateInfo,\n                                             const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                             VULKAN_HPP_NAMESPACE::Image *                     pImage,\n                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::Image>::type\n      createImage( const VULKAN_HPP_NAMESPACE::ImageCreateInfo &                       createInfo,\n                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                   Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::Image, Dispatch>>::type\n      createImageUnique( const VULKAN_HPP_NAMESPACE::ImageCreateInfo &                       createInfo,\n                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                         Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyImage( VULKAN_HPP_NAMESPACE::Image                       image,\n                       const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                       Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyImage( VULKAN_HPP_NAMESPACE::Image image                                   VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                       Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::Image                       image,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::Image                                         image,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getImageSubresourceLayout( VULKAN_HPP_NAMESPACE::Image                    image,\n                                    const VULKAN_HPP_NAMESPACE::ImageSubresource * pSubresource,\n                                    VULKAN_HPP_NAMESPACE::SubresourceLayout *      pLayout,\n                                    Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::SubresourceLayout\n                         getImageSubresourceLayout( VULKAN_HPP_NAMESPACE::Image                    image,\n                                                    const VULKAN_HPP_NAMESPACE::ImageSubresource & subresource,\n                                                    Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createImageView( const VULKAN_HPP_NAMESPACE::ImageViewCreateInfo * pCreateInfo,\n                                                 const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                 VULKAN_HPP_NAMESPACE::ImageView *                 pView,\n                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::ImageView>::type\n      createImageView( const VULKAN_HPP_NAMESPACE::ImageViewCreateInfo &                   createInfo,\n                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                       Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::ImageView, Dispatch>>::type\n      createImageViewUnique( const VULKAN_HPP_NAMESPACE::ImageViewCreateInfo &                   createInfo,\n                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                             Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyImageView( VULKAN_HPP_NAMESPACE::ImageView                   imageView,\n                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                           Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyImageView( VULKAN_HPP_NAMESPACE::ImageView imageView                           VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::ImageView                   imageView,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::ImageView                                     imageView,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createShaderModule( const VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo * pCreateInfo,\n                                                    const VULKAN_HPP_NAMESPACE::AllocationCallbacks *    pAllocator,\n                                                    VULKAN_HPP_NAMESPACE::ShaderModule *                 pShaderModule,\n                                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::ShaderModule>::type\n      createShaderModule( const VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo &                createInfo,\n                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                          Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::ShaderModule, Dispatch>>::type\n      createShaderModuleUnique( const VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo &                createInfo,\n                                Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyShaderModule( VULKAN_HPP_NAMESPACE::ShaderModule                shaderModule,\n                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                              Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyShaderModule( VULKAN_HPP_NAMESPACE::ShaderModule shaderModule                     VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                              Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::ShaderModule                shaderModule,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::ShaderModule                                  shaderModule,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createPipelineCache( const VULKAN_HPP_NAMESPACE::PipelineCacheCreateInfo * pCreateInfo,\n                                                     const VULKAN_HPP_NAMESPACE::AllocationCallbacks *     pAllocator,\n                                                     VULKAN_HPP_NAMESPACE::PipelineCache *                 pPipelineCache,\n                                                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::PipelineCache>::type\n      createPipelineCache( const VULKAN_HPP_NAMESPACE::PipelineCacheCreateInfo &               createInfo,\n                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                           Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::PipelineCache, Dispatch>>::type\n      createPipelineCacheUnique( const VULKAN_HPP_NAMESPACE::PipelineCacheCreateInfo &               createInfo,\n                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                 Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyPipelineCache( VULKAN_HPP_NAMESPACE::PipelineCache               pipelineCache,\n                               const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                               Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyPipelineCache( VULKAN_HPP_NAMESPACE::PipelineCache pipelineCache                   VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::PipelineCache               pipelineCache,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::PipelineCache                                 pipelineCache,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getPipelineCacheData( VULKAN_HPP_NAMESPACE::PipelineCache pipelineCache,\n                                                      size_t *                            pDataSize,\n                                                      void *                              pData,\n                                                      Dispatch const & d                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Uint8_tAllocator                                                                               = std::allocator<uint8_t>,\n              typename Dispatch                                                                                       = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<uint8_t, Uint8_tAllocator>>::type\n      getPipelineCacheData( VULKAN_HPP_NAMESPACE::PipelineCache pipelineCache, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Uint8_tAllocator                                                                               = std::allocator<uint8_t>,\n              typename Dispatch                                                                                       = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<uint8_t, Uint8_tAllocator>>::type\n      getPipelineCacheData( VULKAN_HPP_NAMESPACE::PipelineCache pipelineCache,\n                            Uint8_tAllocator &                  uint8_tAllocator,\n                            Dispatch const & d                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result mergePipelineCaches( VULKAN_HPP_NAMESPACE::PipelineCache         dstCache,\n                                                     uint32_t                                    srcCacheCount,\n                                                     const VULKAN_HPP_NAMESPACE::PipelineCache * pSrcCaches,\n                                                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      mergePipelineCaches( VULKAN_HPP_NAMESPACE::PipelineCache                                                 dstCache,\n                           VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::PipelineCache> const & srcCaches,\n                           Dispatch const & d                                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createGraphicsPipelines( VULKAN_HPP_NAMESPACE::PipelineCache                      pipelineCache,\n                                                         uint32_t                                                 createInfoCount,\n                                                         const VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo * pCreateInfos,\n                                                         const VULKAN_HPP_NAMESPACE::AllocationCallbacks *        pAllocator,\n                                                         VULKAN_HPP_NAMESPACE::Pipeline *                         pPipelines,\n                                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename PipelineAllocator = std::allocator<VULKAN_HPP_NAMESPACE::Pipeline>,\n              typename Dispatch          = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, VULKAN_HPP_NAMESPACE::Pipeline>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>\n                         createGraphicsPipelines( VULKAN_HPP_NAMESPACE::PipelineCache                                                              pipelineCache,\n                                                  VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo> const & createInfos,\n                                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename PipelineAllocator = std::allocator<VULKAN_HPP_NAMESPACE::Pipeline>,\n              typename Dispatch          = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, VULKAN_HPP_NAMESPACE::Pipeline>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>\n                         createGraphicsPipelines( VULKAN_HPP_NAMESPACE::PipelineCache                                                              pipelineCache,\n                                                  VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo> const & createInfos,\n                                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                        allocator,\n                                                  PipelineAllocator &                                                                              pipelineAllocator,\n                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD ResultValue<VULKAN_HPP_NAMESPACE::Pipeline>\n                         createGraphicsPipeline( VULKAN_HPP_NAMESPACE::PipelineCache                                 pipelineCache,\n                                                 const VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo &            createInfo,\n                                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                                 Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename PipelineAllocator         = std::allocator<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>,\n              typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>::value,\n                                      int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>\n                         createGraphicsPipelinesUnique( VULKAN_HPP_NAMESPACE::PipelineCache                                                              pipelineCache,\n                                                        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo> const & createInfos,\n                                                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                                        Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Dispatch                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename PipelineAllocator         = std::allocator<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>,\n              typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>::value,\n                                      int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>\n                         createGraphicsPipelinesUnique( VULKAN_HPP_NAMESPACE::PipelineCache                                                              pipelineCache,\n                                                        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo> const & createInfos,\n                                                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                        allocator,\n                                                        PipelineAllocator &                                                                              pipelineAllocator,\n                                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD ResultValue<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>\n                         createGraphicsPipelineUnique( VULKAN_HPP_NAMESPACE::PipelineCache                                 pipelineCache,\n                                                       const VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo &            createInfo,\n                                                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                                       Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createComputePipelines( VULKAN_HPP_NAMESPACE::PipelineCache                     pipelineCache,\n                                                        uint32_t                                                createInfoCount,\n                                                        const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo * pCreateInfos,\n                                                        const VULKAN_HPP_NAMESPACE::AllocationCallbacks *       pAllocator,\n                                                        VULKAN_HPP_NAMESPACE::Pipeline *                        pPipelines,\n                                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename PipelineAllocator = std::allocator<VULKAN_HPP_NAMESPACE::Pipeline>,\n              typename Dispatch          = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, VULKAN_HPP_NAMESPACE::Pipeline>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>\n                         createComputePipelines( VULKAN_HPP_NAMESPACE::PipelineCache                                                             pipelineCache,\n                                                 VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo> const & createInfos,\n                                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                                 Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename PipelineAllocator = std::allocator<VULKAN_HPP_NAMESPACE::Pipeline>,\n              typename Dispatch          = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, VULKAN_HPP_NAMESPACE::Pipeline>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>\n                         createComputePipelines( VULKAN_HPP_NAMESPACE::PipelineCache                                                             pipelineCache,\n                                                 VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo> const & createInfos,\n                                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                       allocator,\n                                                 PipelineAllocator &                                                                             pipelineAllocator,\n                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD ResultValue<VULKAN_HPP_NAMESPACE::Pipeline>\n                         createComputePipeline( VULKAN_HPP_NAMESPACE::PipelineCache                                 pipelineCache,\n                                                const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo &             createInfo,\n                                                Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                                Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename PipelineAllocator         = std::allocator<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>,\n              typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>::value,\n                                      int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>\n                         createComputePipelinesUnique( VULKAN_HPP_NAMESPACE::PipelineCache                                                             pipelineCache,\n                                                       VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo> const & createInfos,\n                                                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                                       Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Dispatch                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename PipelineAllocator         = std::allocator<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>,\n              typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>::value,\n                                      int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>\n                         createComputePipelinesUnique( VULKAN_HPP_NAMESPACE::PipelineCache                                                             pipelineCache,\n                                                       VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo> const & createInfos,\n                                                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                       allocator,\n                                                       PipelineAllocator &                                                                             pipelineAllocator,\n                                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD ResultValue<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>\n                         createComputePipelineUnique( VULKAN_HPP_NAMESPACE::PipelineCache                                 pipelineCache,\n                                                      const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo &             createInfo,\n                                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                                      Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyPipeline( VULKAN_HPP_NAMESPACE::Pipeline                    pipeline,\n                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                          Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyPipeline( VULKAN_HPP_NAMESPACE::Pipeline pipeline                             VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::Pipeline                    pipeline,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::Pipeline                                      pipeline,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createPipelineLayout( const VULKAN_HPP_NAMESPACE::PipelineLayoutCreateInfo * pCreateInfo,\n                                                      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *      pAllocator,\n                                                      VULKAN_HPP_NAMESPACE::PipelineLayout *                 pPipelineLayout,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::PipelineLayout>::type\n      createPipelineLayout( const VULKAN_HPP_NAMESPACE::PipelineLayoutCreateInfo &              createInfo,\n                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                            Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::PipelineLayout, Dispatch>>::type\n      createPipelineLayoutUnique( const VULKAN_HPP_NAMESPACE::PipelineLayoutCreateInfo &              createInfo,\n                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyPipelineLayout( VULKAN_HPP_NAMESPACE::PipelineLayout              pipelineLayout,\n                                const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyPipelineLayout( VULKAN_HPP_NAMESPACE::PipelineLayout pipelineLayout                 VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::PipelineLayout              pipelineLayout,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::PipelineLayout                                pipelineLayout,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createSampler( const VULKAN_HPP_NAMESPACE::SamplerCreateInfo *   pCreateInfo,\n                                               const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                               VULKAN_HPP_NAMESPACE::Sampler *                   pSampler,\n                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::Sampler>::type\n      createSampler( const VULKAN_HPP_NAMESPACE::SamplerCreateInfo &                     createInfo,\n                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                     Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::Sampler, Dispatch>>::type\n      createSamplerUnique( const VULKAN_HPP_NAMESPACE::SamplerCreateInfo &                     createInfo,\n                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                           Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroySampler( VULKAN_HPP_NAMESPACE::Sampler                     sampler,\n                         const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                         Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroySampler( VULKAN_HPP_NAMESPACE::Sampler sampler                               VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::Sampler                     sampler,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::Sampler                                       sampler,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createDescriptorSetLayout( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo * pCreateInfo,\n                                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks *           pAllocator,\n                                                           VULKAN_HPP_NAMESPACE::DescriptorSetLayout *                 pSetLayout,\n                                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::DescriptorSetLayout>::type\n      createDescriptorSetLayout( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo &         createInfo,\n                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                 Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorSetLayout, Dispatch>>::type\n      createDescriptorSetLayoutUnique( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo &         createInfo,\n                                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                       Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyDescriptorSetLayout( VULKAN_HPP_NAMESPACE::DescriptorSetLayout         descriptorSetLayout,\n                                     const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                     Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyDescriptorSetLayout( VULKAN_HPP_NAMESPACE::DescriptorSetLayout descriptorSetLayout       VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::DescriptorSetLayout         descriptorSetLayout,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::DescriptorSetLayout                           descriptorSetLayout,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createDescriptorPool( const VULKAN_HPP_NAMESPACE::DescriptorPoolCreateInfo * pCreateInfo,\n                                                      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *      pAllocator,\n                                                      VULKAN_HPP_NAMESPACE::DescriptorPool *                 pDescriptorPool,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::DescriptorPool>::type\n      createDescriptorPool( const VULKAN_HPP_NAMESPACE::DescriptorPoolCreateInfo &              createInfo,\n                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                            Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorPool, Dispatch>>::type\n      createDescriptorPoolUnique( const VULKAN_HPP_NAMESPACE::DescriptorPoolCreateInfo &              createInfo,\n                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyDescriptorPool( VULKAN_HPP_NAMESPACE::DescriptorPool              descriptorPool,\n                                const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyDescriptorPool( VULKAN_HPP_NAMESPACE::DescriptorPool descriptorPool                 VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::DescriptorPool              descriptorPool,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::DescriptorPool                                descriptorPool,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    Result resetDescriptorPool( VULKAN_HPP_NAMESPACE::DescriptorPool           descriptorPool,\n                                VULKAN_HPP_NAMESPACE::DescriptorPoolResetFlags flags,\n                                Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void resetDescriptorPool( VULKAN_HPP_NAMESPACE::DescriptorPool                 descriptorPool,\n                              VULKAN_HPP_NAMESPACE::DescriptorPoolResetFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                              Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result allocateDescriptorSets( const VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo * pAllocateInfo,\n                                                        VULKAN_HPP_NAMESPACE::DescriptorSet *                   pDescriptorSets,\n                                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename DescriptorSetAllocator = std::allocator<VULKAN_HPP_NAMESPACE::DescriptorSet>,\n              typename Dispatch               = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename DescriptorSetAllocator::value_type, VULKAN_HPP_NAMESPACE::DescriptorSet>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DescriptorSet, DescriptorSetAllocator>>::type\n      allocateDescriptorSets( const VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo & allocateInfo,\n                              Dispatch const & d                                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename DescriptorSetAllocator = std::allocator<VULKAN_HPP_NAMESPACE::DescriptorSet>,\n              typename Dispatch               = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename DescriptorSetAllocator::value_type, VULKAN_HPP_NAMESPACE::DescriptorSet>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DescriptorSet, DescriptorSetAllocator>>::type\n      allocateDescriptorSets( const VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo & allocateInfo,\n                              DescriptorSetAllocator &                                descriptorSetAllocator,\n                              Dispatch const & d                                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <\n      typename Dispatch                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename DescriptorSetAllocator    = std::allocator<UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorSet, Dispatch>>,\n      typename std::enable_if<std::is_same<typename DescriptorSetAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorSet, Dispatch>>::value,\n                              int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorSet, Dispatch>, DescriptorSetAllocator>>::type\n      allocateDescriptorSetsUnique( const VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo & allocateInfo,\n                                    Dispatch const & d                                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <\n      typename Dispatch                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename DescriptorSetAllocator    = std::allocator<UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorSet, Dispatch>>,\n      typename std::enable_if<std::is_same<typename DescriptorSetAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorSet, Dispatch>>::value,\n                              int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorSet, Dispatch>, DescriptorSetAllocator>>::type\n      allocateDescriptorSetsUnique( const VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo & allocateInfo,\n                                    DescriptorSetAllocator &                                descriptorSetAllocator,\n                                    Dispatch const & d                                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    Result freeDescriptorSets( VULKAN_HPP_NAMESPACE::DescriptorPool        descriptorPool,\n                               uint32_t                                    descriptorSetCount,\n                               const VULKAN_HPP_NAMESPACE::DescriptorSet * pDescriptorSets,\n                               Dispatch const & d                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void freeDescriptorSets( VULKAN_HPP_NAMESPACE::DescriptorPool                                                descriptorPool,\n                             VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DescriptorSet> const & descriptorSets,\n                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    Result( free )( VULKAN_HPP_NAMESPACE::DescriptorPool        descriptorPool,\n                    uint32_t                                    descriptorSetCount,\n                    const VULKAN_HPP_NAMESPACE::DescriptorSet * pDescriptorSets,\n                    Dispatch const & d                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void( free )( VULKAN_HPP_NAMESPACE::DescriptorPool                                                descriptorPool,\n                  VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DescriptorSet> const & descriptorSets,\n                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void updateDescriptorSets( uint32_t                                         descriptorWriteCount,\n                               const VULKAN_HPP_NAMESPACE::WriteDescriptorSet * pDescriptorWrites,\n                               uint32_t                                         descriptorCopyCount,\n                               const VULKAN_HPP_NAMESPACE::CopyDescriptorSet *  pDescriptorCopies,\n                               Dispatch const & d                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void updateDescriptorSets( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteDescriptorSet> const & descriptorWrites,\n                               VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CopyDescriptorSet> const &  descriptorCopies,\n                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createFramebuffer( const VULKAN_HPP_NAMESPACE::FramebufferCreateInfo * pCreateInfo,\n                                                   const VULKAN_HPP_NAMESPACE::AllocationCallbacks *   pAllocator,\n                                                   VULKAN_HPP_NAMESPACE::Framebuffer *                 pFramebuffer,\n                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::Framebuffer>::type\n      createFramebuffer( const VULKAN_HPP_NAMESPACE::FramebufferCreateInfo &                 createInfo,\n                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                         Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::Framebuffer, Dispatch>>::type\n      createFramebufferUnique( const VULKAN_HPP_NAMESPACE::FramebufferCreateInfo &                 createInfo,\n                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                               Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyFramebuffer( VULKAN_HPP_NAMESPACE::Framebuffer                 framebuffer,\n                             const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                             Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyFramebuffer( VULKAN_HPP_NAMESPACE::Framebuffer framebuffer                       VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::Framebuffer                 framebuffer,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::Framebuffer                                   framebuffer,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createRenderPass( const VULKAN_HPP_NAMESPACE::RenderPassCreateInfo * pCreateInfo,\n                                                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks *  pAllocator,\n                                                  VULKAN_HPP_NAMESPACE::RenderPass *                 pRenderPass,\n                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::RenderPass>::type\n      createRenderPass( const VULKAN_HPP_NAMESPACE::RenderPassCreateInfo &                  createInfo,\n                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                        Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::RenderPass, Dispatch>>::type\n      createRenderPassUnique( const VULKAN_HPP_NAMESPACE::RenderPassCreateInfo &                  createInfo,\n                              Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                              Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyRenderPass( VULKAN_HPP_NAMESPACE::RenderPass                  renderPass,\n                            const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                            Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyRenderPass( VULKAN_HPP_NAMESPACE::RenderPass renderPass                         VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::RenderPass                  renderPass,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::RenderPass                                    renderPass,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getRenderAreaGranularity( VULKAN_HPP_NAMESPACE::RenderPass renderPass,\n                                   VULKAN_HPP_NAMESPACE::Extent2D * pGranularity,\n                                   Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Extent2D\n                         getRenderAreaGranularity( VULKAN_HPP_NAMESPACE::RenderPass renderPass,\n                                                   Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createCommandPool( const VULKAN_HPP_NAMESPACE::CommandPoolCreateInfo * pCreateInfo,\n                                                   const VULKAN_HPP_NAMESPACE::AllocationCallbacks *   pAllocator,\n                                                   VULKAN_HPP_NAMESPACE::CommandPool *                 pCommandPool,\n                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::CommandPool>::type\n      createCommandPool( const VULKAN_HPP_NAMESPACE::CommandPoolCreateInfo &                 createInfo,\n                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                         Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::CommandPool, Dispatch>>::type\n      createCommandPoolUnique( const VULKAN_HPP_NAMESPACE::CommandPoolCreateInfo &                 createInfo,\n                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                               Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyCommandPool( VULKAN_HPP_NAMESPACE::CommandPool                 commandPool,\n                             const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                             Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyCommandPool( VULKAN_HPP_NAMESPACE::CommandPool commandPool                       VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::CommandPool                 commandPool,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::CommandPool                                   commandPool,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result resetCommandPool( VULKAN_HPP_NAMESPACE::CommandPool           commandPool,\n                                                  VULKAN_HPP_NAMESPACE::CommandPoolResetFlags flags,\n                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    typename ResultValueType<void>::type resetCommandPool( VULKAN_HPP_NAMESPACE::CommandPool                 commandPool,\n                                                           VULKAN_HPP_NAMESPACE::CommandPoolResetFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                                           Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result allocateCommandBuffers( const VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo * pAllocateInfo,\n                                                        VULKAN_HPP_NAMESPACE::CommandBuffer *                   pCommandBuffers,\n                                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename CommandBufferAllocator = std::allocator<VULKAN_HPP_NAMESPACE::CommandBuffer>,\n              typename Dispatch               = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename CommandBufferAllocator::value_type, VULKAN_HPP_NAMESPACE::CommandBuffer>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::CommandBuffer, CommandBufferAllocator>>::type\n      allocateCommandBuffers( const VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo & allocateInfo,\n                              Dispatch const & d                                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename CommandBufferAllocator = std::allocator<VULKAN_HPP_NAMESPACE::CommandBuffer>,\n              typename Dispatch               = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename CommandBufferAllocator::value_type, VULKAN_HPP_NAMESPACE::CommandBuffer>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::CommandBuffer, CommandBufferAllocator>>::type\n      allocateCommandBuffers( const VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo & allocateInfo,\n                              CommandBufferAllocator &                                commandBufferAllocator,\n                              Dispatch const & d                                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <\n      typename Dispatch                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename CommandBufferAllocator    = std::allocator<UniqueHandle<VULKAN_HPP_NAMESPACE::CommandBuffer, Dispatch>>,\n      typename std::enable_if<std::is_same<typename CommandBufferAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::CommandBuffer, Dispatch>>::value,\n                              int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::CommandBuffer, Dispatch>, CommandBufferAllocator>>::type\n      allocateCommandBuffersUnique( const VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo & allocateInfo,\n                                    Dispatch const & d                                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <\n      typename Dispatch                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename CommandBufferAllocator    = std::allocator<UniqueHandle<VULKAN_HPP_NAMESPACE::CommandBuffer, Dispatch>>,\n      typename std::enable_if<std::is_same<typename CommandBufferAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::CommandBuffer, Dispatch>>::value,\n                              int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::CommandBuffer, Dispatch>, CommandBufferAllocator>>::type\n      allocateCommandBuffersUnique( const VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo & allocateInfo,\n                                    CommandBufferAllocator &                                commandBufferAllocator,\n                                    Dispatch const & d                                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void freeCommandBuffers( VULKAN_HPP_NAMESPACE::CommandPool           commandPool,\n                             uint32_t                                    commandBufferCount,\n                             const VULKAN_HPP_NAMESPACE::CommandBuffer * pCommandBuffers,\n                             Dispatch const & d                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void freeCommandBuffers( VULKAN_HPP_NAMESPACE::CommandPool                                                   commandPool,\n                             VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CommandBuffer> const & commandBuffers,\n                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void( free )( VULKAN_HPP_NAMESPACE::CommandPool           commandPool,\n                  uint32_t                                    commandBufferCount,\n                  const VULKAN_HPP_NAMESPACE::CommandBuffer * pCommandBuffers,\n                  Dispatch const & d                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void( free )( VULKAN_HPP_NAMESPACE::CommandPool                                                   commandPool,\n                  VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CommandBuffer> const & commandBuffers,\n                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_VERSION_1_1 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result bindBufferMemory2( uint32_t                                           bindInfoCount,\n                                                   const VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo * pBindInfos,\n                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      bindBufferMemory2( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo> const & bindInfos,\n                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result bindImageMemory2( uint32_t                                          bindInfoCount,\n                                                  const VULKAN_HPP_NAMESPACE::BindImageMemoryInfo * pBindInfos,\n                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      bindImageMemory2( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindImageMemoryInfo> const & bindInfos,\n                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getGroupPeerMemoryFeatures( uint32_t                                       heapIndex,\n                                     uint32_t                                       localDeviceIndex,\n                                     uint32_t                                       remoteDeviceIndex,\n                                     VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags * pPeerMemoryFeatures,\n                                     Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags\n                         getGroupPeerMemoryFeatures( uint32_t           heapIndex,\n                                                     uint32_t           localDeviceIndex,\n                                                     uint32_t           remoteDeviceIndex,\n                                                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getImageMemoryRequirements2( const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 * pInfo,\n                                      VULKAN_HPP_NAMESPACE::MemoryRequirements2 *                pMemoryRequirements,\n                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2\n                         getImageMemoryRequirements2( const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 & info,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getImageMemoryRequirements2( const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 & info,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getBufferMemoryRequirements2( const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 * pInfo,\n                                       VULKAN_HPP_NAMESPACE::MemoryRequirements2 *                 pMemoryRequirements,\n                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2\n                         getBufferMemoryRequirements2( const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 & info,\n                                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getBufferMemoryRequirements2( const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 & info,\n                                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getImageSparseMemoryRequirements2( const VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 * pInfo,\n                                            uint32_t *                                                       pSparseMemoryRequirementCount,\n                                            VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2 *           pSparseMemoryRequirements,\n                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename SparseImageMemoryRequirements2Allocator = std::allocator<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>,\n              typename Dispatch                                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename SparseImageMemoryRequirements2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator>\n                         getImageSparseMemoryRequirements2( const VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 & info,\n                                                            Dispatch const & d                                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename SparseImageMemoryRequirements2Allocator = std::allocator<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>,\n              typename Dispatch                                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename SparseImageMemoryRequirements2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator>\n                         getImageSparseMemoryRequirements2( const VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 & info,\n                                                            SparseImageMemoryRequirements2Allocator &                        sparseImageMemoryRequirements2Allocator,\n                                                            Dispatch const & d                                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void trimCommandPool( VULKAN_HPP_NAMESPACE::CommandPool          commandPool,\n                          VULKAN_HPP_NAMESPACE::CommandPoolTrimFlags flags,\n                          Dispatch const & d                         VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getQueue2( const VULKAN_HPP_NAMESPACE::DeviceQueueInfo2 * pQueueInfo,\n                    VULKAN_HPP_NAMESPACE::Queue *                  pQueue,\n                    Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Queue getQueue2( const VULKAN_HPP_NAMESPACE::DeviceQueueInfo2 & queueInfo,\n                                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createSamplerYcbcrConversion( const VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo * pCreateInfo,\n                                                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks *              pAllocator,\n                                                              VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion *                 pYcbcrConversion,\n                                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion>::type\n      createSamplerYcbcrConversion( const VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo &      createInfo,\n                                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                    Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion, Dispatch>>::type\n      createSamplerYcbcrConversionUnique( const VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo &      createInfo,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                          Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroySamplerYcbcrConversion( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion      ycbcrConversion,\n                                        const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                        Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroySamplerYcbcrConversion( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion ycbcrConversion        VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion      ycbcrConversion,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion                        ycbcrConversion,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createDescriptorUpdateTemplate( const VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo * pCreateInfo,\n                                                                const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                pAllocator,\n                                                                VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate *                 pDescriptorUpdateTemplate,\n                                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate>::type\n      createDescriptorUpdateTemplate( const VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo &    createInfo,\n                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                      Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate, Dispatch>>::type\n      createDescriptorUpdateTemplateUnique( const VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo &    createInfo,\n                                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyDescriptorUpdateTemplate( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate    descriptorUpdateTemplate,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyDescriptorUpdateTemplate( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate    descriptorUpdateTemplate,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate                      descriptorUpdateTemplate,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void updateDescriptorSetWithTemplate( VULKAN_HPP_NAMESPACE::DescriptorSet            descriptorSet,\n                                          VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,\n                                          const void *                                   pData,\n                                          Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename DataType, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void updateDescriptorSetWithTemplate( VULKAN_HPP_NAMESPACE::DescriptorSet            descriptorSet,\n                                          VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,\n                                          DataType const &                               data,\n                                          Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getDescriptorSetLayoutSupport( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo * pCreateInfo,\n                                        VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport *          pSupport,\n                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport\n                         getDescriptorSetLayoutSupport( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo & createInfo,\n                                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getDescriptorSetLayoutSupport( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo & createInfo,\n                                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_VERSION_1_2 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createRenderPass2( const VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 * pCreateInfo,\n                                                   const VULKAN_HPP_NAMESPACE::AllocationCallbacks *   pAllocator,\n                                                   VULKAN_HPP_NAMESPACE::RenderPass *                  pRenderPass,\n                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::RenderPass>::type\n      createRenderPass2( const VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 &                 createInfo,\n                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                         Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::RenderPass, Dispatch>>::type\n      createRenderPass2Unique( const VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 &                 createInfo,\n                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                               Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void resetQueryPool( VULKAN_HPP_NAMESPACE::QueryPool queryPool,\n                         uint32_t                        firstQuery,\n                         uint32_t                        queryCount,\n                         Dispatch const & d              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getSemaphoreCounterValue( VULKAN_HPP_NAMESPACE::Semaphore semaphore,\n                                                          uint64_t *                      pValue,\n                                                          Dispatch const & d              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<uint64_t>::type getSemaphoreCounterValue( VULKAN_HPP_NAMESPACE::Semaphore semaphore,\n                                                                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result waitSemaphores( const VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo * pWaitInfo,\n                                                uint64_t                                        timeout,\n                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result waitSemaphores( const VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo & waitInfo,\n                                                                      uint64_t                                        timeout,\n                                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result signalSemaphore( const VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo * pSignalInfo,\n                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      signalSemaphore( const VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo & signalInfo, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    DeviceAddress getBufferAddress( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo * pInfo,\n                                    Dispatch const & d                                    VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NAMESPACE::DeviceAddress getBufferAddress( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo & info,\n                                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    uint64_t getBufferOpaqueCaptureAddress( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo * pInfo,\n                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    uint64_t getBufferOpaqueCaptureAddress( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo & info,\n                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    uint64_t getMemoryOpaqueCaptureAddress( const VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo * pInfo,\n                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    uint64_t getMemoryOpaqueCaptureAddress( const VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo & info,\n                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_VERSION_1_3 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createPrivateDataSlot( const VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo * pCreateInfo,\n                                                       const VULKAN_HPP_NAMESPACE::AllocationCallbacks *       pAllocator,\n                                                       VULKAN_HPP_NAMESPACE::PrivateDataSlot *                 pPrivateDataSlot,\n                                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::PrivateDataSlot>::type\n      createPrivateDataSlot( const VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo &             createInfo,\n                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                             Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::PrivateDataSlot, Dispatch>>::type\n      createPrivateDataSlotUnique( const VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo &             createInfo,\n                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                   Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyPrivateDataSlot( VULKAN_HPP_NAMESPACE::PrivateDataSlot             privateDataSlot,\n                                 const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                 Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyPrivateDataSlot( VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot               VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::PrivateDataSlot             privateDataSlot,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::PrivateDataSlot                               privateDataSlot,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result setPrivateData( VULKAN_HPP_NAMESPACE::ObjectType      objectType,\n                                                uint64_t                              objectHandle,\n                                                VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,\n                                                uint64_t                              data,\n                                                Dispatch const & d                    VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    typename ResultValueType<void>::type setPrivateData( VULKAN_HPP_NAMESPACE::ObjectType      objectType,\n                                                         uint64_t                              objectHandle,\n                                                         VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,\n                                                         uint64_t                              data,\n                                                         Dispatch const & d                    VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getPrivateData( VULKAN_HPP_NAMESPACE::ObjectType      objectType,\n                         uint64_t                              objectHandle,\n                         VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,\n                         uint64_t *                            pData,\n                         Dispatch const & d                    VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD uint64_t getPrivateData( VULKAN_HPP_NAMESPACE::ObjectType      objectType,\n                                                  uint64_t                              objectHandle,\n                                                  VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,\n                                                  Dispatch const & d                    VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getBufferMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements * pInfo,\n                                      VULKAN_HPP_NAMESPACE::MemoryRequirements2 *                  pMemoryRequirements,\n                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2\n                         getBufferMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements & info,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getBufferMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements & info,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getImageMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements * pInfo,\n                                     VULKAN_HPP_NAMESPACE::MemoryRequirements2 *                 pMemoryRequirements,\n                                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2\n                         getImageMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info,\n                                                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getImageMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info,\n                                                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getImageSparseMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements * pInfo,\n                                           uint32_t *                                                  pSparseMemoryRequirementCount,\n                                           VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2 *      pSparseMemoryRequirements,\n                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename SparseImageMemoryRequirements2Allocator = std::allocator<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>,\n              typename Dispatch                                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename SparseImageMemoryRequirements2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator>\n                         getImageSparseMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info,\n                                                           Dispatch const & d                                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename SparseImageMemoryRequirements2Allocator = std::allocator<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>,\n              typename Dispatch                                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename SparseImageMemoryRequirements2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator>\n                         getImageSparseMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info,\n                                                           SparseImageMemoryRequirements2Allocator &                   sparseImageMemoryRequirements2Allocator,\n                                                           Dispatch const & d                                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_VERSION_1_4 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result mapMemory2( const VULKAN_HPP_NAMESPACE::MemoryMapInfo * pMemoryMapInfo,\n                                            void **                                     ppData,\n                                            Dispatch const & d                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<void *>::type mapMemory2( const VULKAN_HPP_NAMESPACE::MemoryMapInfo & memoryMapInfo,\n                                                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result unmapMemory2( const VULKAN_HPP_NAMESPACE::MemoryUnmapInfo * pMemoryUnmapInfo,\n                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    typename ResultValueType<void>::type unmapMemory2( const VULKAN_HPP_NAMESPACE::MemoryUnmapInfo & memoryUnmapInfo,\n                                                       Dispatch const & d                            VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getRenderingAreaGranularity( const VULKAN_HPP_NAMESPACE::RenderingAreaInfo * pRenderingAreaInfo,\n                                      VULKAN_HPP_NAMESPACE::Extent2D *                pGranularity,\n                                      Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Extent2D\n                         getRenderingAreaGranularity( const VULKAN_HPP_NAMESPACE::RenderingAreaInfo & renderingAreaInfo,\n                                                      Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getImageSubresourceLayout( const VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo * pInfo,\n                                    VULKAN_HPP_NAMESPACE::SubresourceLayout2 *               pLayout,\n                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::SubresourceLayout2\n                         getImageSubresourceLayout( const VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo & info,\n                                                    Dispatch const & d                                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getImageSubresourceLayout( const VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo & info,\n                                                    Dispatch const & d                                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getImageSubresourceLayout2( VULKAN_HPP_NAMESPACE::Image                     image,\n                                     const VULKAN_HPP_NAMESPACE::ImageSubresource2 * pSubresource,\n                                     VULKAN_HPP_NAMESPACE::SubresourceLayout2 *      pLayout,\n                                     Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::SubresourceLayout2\n                         getImageSubresourceLayout2( VULKAN_HPP_NAMESPACE::Image                     image,\n                                                     const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource,\n                                                     Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getImageSubresourceLayout2( VULKAN_HPP_NAMESPACE::Image                     image,\n                                                     const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource,\n                                                     Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result copyMemoryToImage( const VULKAN_HPP_NAMESPACE::CopyMemoryToImageInfo * pCopyMemoryToImageInfo,\n                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      copyMemoryToImage( const VULKAN_HPP_NAMESPACE::CopyMemoryToImageInfo & copyMemoryToImageInfo,\n                         Dispatch const & d                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result copyImageToMemory( const VULKAN_HPP_NAMESPACE::CopyImageToMemoryInfo * pCopyImageToMemoryInfo,\n                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      copyImageToMemory( const VULKAN_HPP_NAMESPACE::CopyImageToMemoryInfo & copyImageToMemoryInfo,\n                         Dispatch const & d                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result copyImageToImage( const VULKAN_HPP_NAMESPACE::CopyImageToImageInfo * pCopyImageToImageInfo,\n                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      copyImageToImage( const VULKAN_HPP_NAMESPACE::CopyImageToImageInfo & copyImageToImageInfo,\n                        Dispatch const & d                                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result transitionImageLayout( uint32_t                                                    transitionCount,\n                                                       const VULKAN_HPP_NAMESPACE::HostImageLayoutTransitionInfo * pTransitions,\n                                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      transitionImageLayout( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::HostImageLayoutTransitionInfo> const & transitions,\n                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_swapchain ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createSwapchainKHR( const VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR * pCreateInfo,\n                                                    const VULKAN_HPP_NAMESPACE::AllocationCallbacks *    pAllocator,\n                                                    VULKAN_HPP_NAMESPACE::SwapchainKHR *                 pSwapchain,\n                                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::SwapchainKHR>::type\n      createSwapchainKHR( const VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR &                createInfo,\n                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                          Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SwapchainKHR, Dispatch>>::type\n      createSwapchainKHRUnique( const VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR &                createInfo,\n                                Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroySwapchainKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR                swapchain,\n                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                              Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroySwapchainKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain                        VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                              Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::SwapchainKHR                swapchain,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::SwapchainKHR                                  swapchain,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getSwapchainImagesKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain,\n                                                       uint32_t *                         pSwapchainImageCount,\n                                                       VULKAN_HPP_NAMESPACE::Image *      pSwapchainImages,\n                                                       Dispatch const & d                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename ImageAllocator = std::allocator<VULKAN_HPP_NAMESPACE::Image>,\n              typename Dispatch       = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename ImageAllocator::value_type, VULKAN_HPP_NAMESPACE::Image>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::Image, ImageAllocator>>::type\n      getSwapchainImagesKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename ImageAllocator = std::allocator<VULKAN_HPP_NAMESPACE::Image>,\n              typename Dispatch       = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename ImageAllocator::value_type, VULKAN_HPP_NAMESPACE::Image>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::Image, ImageAllocator>>::type getSwapchainImagesKHR(\n      VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, ImageAllocator & imageAllocator, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result acquireNextImageKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain,\n                                                     uint64_t                           timeout,\n                                                     VULKAN_HPP_NAMESPACE::Semaphore    semaphore,\n                                                     VULKAN_HPP_NAMESPACE::Fence        fence,\n                                                     uint32_t *                         pImageIndex,\n                                                     Dispatch const & d                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD ResultValue<uint32_t> acquireNextImageKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR        swapchain,\n                                                                    uint64_t                                  timeout,\n                                                                    VULKAN_HPP_NAMESPACE::Semaphore semaphore VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                                                    VULKAN_HPP_NAMESPACE::Fence fence         VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                                                    Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getGroupPresentCapabilitiesKHR( VULKAN_HPP_NAMESPACE::DeviceGroupPresentCapabilitiesKHR * pDeviceGroupPresentCapabilities,\n                                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::DeviceGroupPresentCapabilitiesKHR>::type\n      getGroupPresentCapabilitiesKHR( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getGroupSurfacePresentModesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR                       surface,\n                                                                VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR * pModes,\n                                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR>::type\n      getGroupSurfacePresentModesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result acquireNextImage2KHR( const VULKAN_HPP_NAMESPACE::AcquireNextImageInfoKHR * pAcquireInfo,\n                                                      uint32_t *                                            pImageIndex,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD ResultValue<uint32_t> acquireNextImage2KHR( const VULKAN_HPP_NAMESPACE::AcquireNextImageInfoKHR & acquireInfo,\n                                                                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_display_swapchain ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createSharedSwapchainsKHR( uint32_t                                             swapchainCount,\n                                                           const VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR * pCreateInfos,\n                                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks *    pAllocator,\n                                                           VULKAN_HPP_NAMESPACE::SwapchainKHR *                 pSwapchains,\n                                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename SwapchainKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::SwapchainKHR>,\n              typename Dispatch              = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename SwapchainKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::SwapchainKHR>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::SwapchainKHR, SwapchainKHRAllocator>>::type\n      createSharedSwapchainsKHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR> const & createInfos,\n                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                 Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename SwapchainKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::SwapchainKHR>,\n              typename Dispatch              = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename SwapchainKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::SwapchainKHR>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::SwapchainKHR, SwapchainKHRAllocator>>::type\n      createSharedSwapchainsKHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR> const & createInfos,\n                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                    allocator,\n                                 SwapchainKHRAllocator &                                                                      swapchainKHRAllocator,\n                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::SwapchainKHR>::type\n      createSharedSwapchainKHR( const VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR &                createInfo,\n                                Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <\n      typename Dispatch                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename SwapchainKHRAllocator     = std::allocator<UniqueHandle<VULKAN_HPP_NAMESPACE::SwapchainKHR, Dispatch>>,\n      typename std::enable_if<std::is_same<typename SwapchainKHRAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::SwapchainKHR, Dispatch>>::value,\n                              int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::SwapchainKHR, Dispatch>, SwapchainKHRAllocator>>::type\n      createSharedSwapchainsKHRUnique( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR> const & createInfos,\n                                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                       Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <\n      typename Dispatch                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename SwapchainKHRAllocator     = std::allocator<UniqueHandle<VULKAN_HPP_NAMESPACE::SwapchainKHR, Dispatch>>,\n      typename std::enable_if<std::is_same<typename SwapchainKHRAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::SwapchainKHR, Dispatch>>::value,\n                              int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::SwapchainKHR, Dispatch>, SwapchainKHRAllocator>>::type\n      createSharedSwapchainsKHRUnique( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR> const & createInfos,\n                                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                    allocator,\n                                       SwapchainKHRAllocator &                                                                      swapchainKHRAllocator,\n                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SwapchainKHR, Dispatch>>::type\n      createSharedSwapchainKHRUnique( const VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR &                createInfo,\n                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                      Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_debug_marker ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result debugMarkerSetObjectTagEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerObjectTagInfoEXT * pTagInfo,\n                                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      debugMarkerSetObjectTagEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerObjectTagInfoEXT & tagInfo,\n                                  Dispatch const & d                                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result debugMarkerSetObjectNameEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerObjectNameInfoEXT * pNameInfo,\n                                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      debugMarkerSetObjectNameEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerObjectNameInfoEXT & nameInfo,\n                                   Dispatch const & d                                         VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_video_queue ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createVideoSessionKHR( const VULKAN_HPP_NAMESPACE::VideoSessionCreateInfoKHR * pCreateInfo,\n                                                       const VULKAN_HPP_NAMESPACE::AllocationCallbacks *       pAllocator,\n                                                       VULKAN_HPP_NAMESPACE::VideoSessionKHR *                 pVideoSession,\n                                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::VideoSessionKHR>::type\n      createVideoSessionKHR( const VULKAN_HPP_NAMESPACE::VideoSessionCreateInfoKHR &             createInfo,\n                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                             Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::VideoSessionKHR, Dispatch>>::type\n      createVideoSessionKHRUnique( const VULKAN_HPP_NAMESPACE::VideoSessionCreateInfoKHR &             createInfo,\n                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                   Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyVideoSessionKHR( VULKAN_HPP_NAMESPACE::VideoSessionKHR             videoSession,\n                                 const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                 Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyVideoSessionKHR( VULKAN_HPP_NAMESPACE::VideoSessionKHR videoSession                  VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::VideoSessionKHR             videoSession,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::VideoSessionKHR                               videoSession,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getVideoSessionMemoryRequirementsKHR( VULKAN_HPP_NAMESPACE::VideoSessionKHR                     videoSession,\n                                                                      uint32_t *                                                pMemoryRequirementsCount,\n                                                                      VULKAN_HPP_NAMESPACE::VideoSessionMemoryRequirementsKHR * pMemoryRequirements,\n                                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename VideoSessionMemoryRequirementsKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::VideoSessionMemoryRequirementsKHR>,\n              typename Dispatch                                   = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename VideoSessionMemoryRequirementsKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::VideoSessionMemoryRequirementsKHR>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::VideoSessionMemoryRequirementsKHR, VideoSessionMemoryRequirementsKHRAllocator>>::type\n      getVideoSessionMemoryRequirementsKHR( VULKAN_HPP_NAMESPACE::VideoSessionKHR videoSession,\n                                            Dispatch const & d                    VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename VideoSessionMemoryRequirementsKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::VideoSessionMemoryRequirementsKHR>,\n              typename Dispatch                                   = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename VideoSessionMemoryRequirementsKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::VideoSessionMemoryRequirementsKHR>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::VideoSessionMemoryRequirementsKHR, VideoSessionMemoryRequirementsKHRAllocator>>::type\n      getVideoSessionMemoryRequirementsKHR( VULKAN_HPP_NAMESPACE::VideoSessionKHR        videoSession,\n                                            VideoSessionMemoryRequirementsKHRAllocator & videoSessionMemoryRequirementsKHRAllocator,\n                                            Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result bindVideoSessionMemoryKHR( VULKAN_HPP_NAMESPACE::VideoSessionKHR                       videoSession,\n                                                           uint32_t                                                    bindSessionMemoryInfoCount,\n                                                           const VULKAN_HPP_NAMESPACE::BindVideoSessionMemoryInfoKHR * pBindSessionMemoryInfos,\n                                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      bindVideoSessionMemoryKHR( VULKAN_HPP_NAMESPACE::VideoSessionKHR                                                               videoSession,\n                                 VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindVideoSessionMemoryInfoKHR> const & bindSessionMemoryInfos,\n                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createVideoSessionParametersKHR( const VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateInfoKHR * pCreateInfo,\n                                                                 const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                 pAllocator,\n                                                                 VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR *                 pVideoSessionParameters,\n                                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR>::type\n      createVideoSessionParametersKHR( const VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateInfoKHR &   createInfo,\n                                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                       Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR, Dispatch>>::type\n      createVideoSessionParametersKHRUnique( const VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateInfoKHR &   createInfo,\n                                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result updateVideoSessionParametersKHR( VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR                   videoSessionParameters,\n                                                                 const VULKAN_HPP_NAMESPACE::VideoSessionParametersUpdateInfoKHR * pUpdateInfo,\n                                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      updateVideoSessionParametersKHR( VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR                   videoSessionParameters,\n                                       const VULKAN_HPP_NAMESPACE::VideoSessionParametersUpdateInfoKHR & updateInfo,\n                                       Dispatch const & d                                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyVideoSessionParametersKHR( VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR   videoSessionParameters,\n                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyVideoSessionParametersKHR( VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR videoSessionParameters VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR   videoSessionParameters,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR                     videoSessionParameters,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NVX_binary_import ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createCuModuleNVX( const VULKAN_HPP_NAMESPACE::CuModuleCreateInfoNVX * pCreateInfo,\n                                                   const VULKAN_HPP_NAMESPACE::AllocationCallbacks *   pAllocator,\n                                                   VULKAN_HPP_NAMESPACE::CuModuleNVX *                 pModule,\n                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::CuModuleNVX>::type\n      createCuModuleNVX( const VULKAN_HPP_NAMESPACE::CuModuleCreateInfoNVX &                 createInfo,\n                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                         Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::CuModuleNVX, Dispatch>>::type\n      createCuModuleNVXUnique( const VULKAN_HPP_NAMESPACE::CuModuleCreateInfoNVX &                 createInfo,\n                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                               Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createCuFunctionNVX( const VULKAN_HPP_NAMESPACE::CuFunctionCreateInfoNVX * pCreateInfo,\n                                                     const VULKAN_HPP_NAMESPACE::AllocationCallbacks *     pAllocator,\n                                                     VULKAN_HPP_NAMESPACE::CuFunctionNVX *                 pFunction,\n                                                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::CuFunctionNVX>::type\n      createCuFunctionNVX( const VULKAN_HPP_NAMESPACE::CuFunctionCreateInfoNVX &               createInfo,\n                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                           Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::CuFunctionNVX, Dispatch>>::type\n      createCuFunctionNVXUnique( const VULKAN_HPP_NAMESPACE::CuFunctionCreateInfoNVX &               createInfo,\n                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                 Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyCuModuleNVX( VULKAN_HPP_NAMESPACE::CuModuleNVX                 module,\n                             const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                             Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyCuModuleNVX( VULKAN_HPP_NAMESPACE::CuModuleNVX                                   module,\n                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::CuModuleNVX                 module,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::CuModuleNVX                                   module,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyCuFunctionNVX( VULKAN_HPP_NAMESPACE::CuFunctionNVX               function,\n                               const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                               Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyCuFunctionNVX( VULKAN_HPP_NAMESPACE::CuFunctionNVX                                 function,\n                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::CuFunctionNVX               function,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::CuFunctionNVX                                 function,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NVX_image_view_handle ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    uint32_t getImageViewHandleNVX( const VULKAN_HPP_NAMESPACE::ImageViewHandleInfoNVX * pInfo,\n                                    Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    uint32_t getImageViewHandleNVX( const VULKAN_HPP_NAMESPACE::ImageViewHandleInfoNVX & info,\n                                    Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    uint64_t getImageViewHandle64NVX( const VULKAN_HPP_NAMESPACE::ImageViewHandleInfoNVX * pInfo,\n                                      Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    uint64_t getImageViewHandle64NVX( const VULKAN_HPP_NAMESPACE::ImageViewHandleInfoNVX & info,\n                                      Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getImageViewAddressNVX( VULKAN_HPP_NAMESPACE::ImageView                       imageView,\n                                                        VULKAN_HPP_NAMESPACE::ImageViewAddressPropertiesNVX * pProperties,\n                                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::ImageViewAddressPropertiesNVX>::type\n      getImageViewAddressNVX( VULKAN_HPP_NAMESPACE::ImageView imageView, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_AMD_shader_info ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getShaderInfoAMD( VULKAN_HPP_NAMESPACE::Pipeline            pipeline,\n                                                  VULKAN_HPP_NAMESPACE::ShaderStageFlagBits shaderStage,\n                                                  VULKAN_HPP_NAMESPACE::ShaderInfoTypeAMD   infoType,\n                                                  size_t *                                  pInfoSize,\n                                                  void *                                    pInfo,\n                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Uint8_tAllocator                                                                               = std::allocator<uint8_t>,\n              typename Dispatch                                                                                       = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<uint8_t, Uint8_tAllocator>>::type\n      getShaderInfoAMD( VULKAN_HPP_NAMESPACE::Pipeline            pipeline,\n                        VULKAN_HPP_NAMESPACE::ShaderStageFlagBits shaderStage,\n                        VULKAN_HPP_NAMESPACE::ShaderInfoTypeAMD   infoType,\n                        Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Uint8_tAllocator                                                                               = std::allocator<uint8_t>,\n              typename Dispatch                                                                                       = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<uint8_t, Uint8_tAllocator>>::type\n      getShaderInfoAMD( VULKAN_HPP_NAMESPACE::Pipeline            pipeline,\n                        VULKAN_HPP_NAMESPACE::ShaderStageFlagBits shaderStage,\n                        VULKAN_HPP_NAMESPACE::ShaderInfoTypeAMD   infoType,\n                        Uint8_tAllocator &                        uint8_tAllocator,\n                        Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n    //=== VK_NV_external_memory_win32 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getMemoryWin32HandleNV( VULKAN_HPP_NAMESPACE::DeviceMemory                    memory,\n                                                        VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV handleType,\n                                                        HANDLE *                                              pHandle,\n                                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<HANDLE>::type getMemoryWin32HandleNV( VULKAN_HPP_NAMESPACE::DeviceMemory                    memory,\n                                                                                        VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV handleType,\n                                                                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_WIN32_KHR*/\n\n    //=== VK_KHR_device_group ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getGroupPeerMemoryFeaturesKHR( uint32_t                                       heapIndex,\n                                        uint32_t                                       localDeviceIndex,\n                                        uint32_t                                       remoteDeviceIndex,\n                                        VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags * pPeerMemoryFeatures,\n                                        Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags\n                         getGroupPeerMemoryFeaturesKHR( uint32_t           heapIndex,\n                                                        uint32_t           localDeviceIndex,\n                                                        uint32_t           remoteDeviceIndex,\n                                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_maintenance1 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void trimCommandPoolKHR( VULKAN_HPP_NAMESPACE::CommandPool          commandPool,\n                             VULKAN_HPP_NAMESPACE::CommandPoolTrimFlags flags,\n                             Dispatch const & d                         VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n    //=== VK_KHR_external_memory_win32 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getMemoryWin32HandleKHR( const VULKAN_HPP_NAMESPACE::MemoryGetWin32HandleInfoKHR * pGetWin32HandleInfo,\n                                                         HANDLE *                                                  pHandle,\n                                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<HANDLE>::type\n      getMemoryWin32HandleKHR( const VULKAN_HPP_NAMESPACE::MemoryGetWin32HandleInfoKHR & getWin32HandleInfo,\n                               Dispatch const & d                                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getMemoryWin32HandlePropertiesKHR( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType,\n                                                                   HANDLE                                                 handle,\n                                                                   VULKAN_HPP_NAMESPACE::MemoryWin32HandlePropertiesKHR * pMemoryWin32HandleProperties,\n                                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::MemoryWin32HandlePropertiesKHR>::type getMemoryWin32HandlePropertiesKHR(\n      VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType, HANDLE handle, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_WIN32_KHR*/\n\n    //=== VK_KHR_external_memory_fd ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getMemoryFdKHR( const VULKAN_HPP_NAMESPACE::MemoryGetFdInfoKHR * pGetFdInfo,\n                                                int *                                            pFd,\n                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<int>::type getMemoryFdKHR( const VULKAN_HPP_NAMESPACE::MemoryGetFdInfoKHR & getFdInfo,\n                                                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getMemoryFdPropertiesKHR( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType,\n                                                          int                                                    fd,\n                                                          VULKAN_HPP_NAMESPACE::MemoryFdPropertiesKHR *          pMemoryFdProperties,\n                                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::MemoryFdPropertiesKHR>::type getMemoryFdPropertiesKHR(\n      VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType, int fd, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n    //=== VK_KHR_external_semaphore_win32 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result importSemaphoreWin32HandleKHR( const VULKAN_HPP_NAMESPACE::ImportSemaphoreWin32HandleInfoKHR * pImportSemaphoreWin32HandleInfo,\n                                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      importSemaphoreWin32HandleKHR( const VULKAN_HPP_NAMESPACE::ImportSemaphoreWin32HandleInfoKHR & importSemaphoreWin32HandleInfo,\n                                     Dispatch const & d                                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getSemaphoreWin32HandleKHR( const VULKAN_HPP_NAMESPACE::SemaphoreGetWin32HandleInfoKHR * pGetWin32HandleInfo,\n                                                            HANDLE *                                                     pHandle,\n                                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<HANDLE>::type\n      getSemaphoreWin32HandleKHR( const VULKAN_HPP_NAMESPACE::SemaphoreGetWin32HandleInfoKHR & getWin32HandleInfo,\n                                  Dispatch const & d                                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_WIN32_KHR*/\n\n    //=== VK_KHR_external_semaphore_fd ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result importSemaphoreFdKHR( const VULKAN_HPP_NAMESPACE::ImportSemaphoreFdInfoKHR * pImportSemaphoreFdInfo,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      importSemaphoreFdKHR( const VULKAN_HPP_NAMESPACE::ImportSemaphoreFdInfoKHR & importSemaphoreFdInfo,\n                            Dispatch const & d                                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getSemaphoreFdKHR( const VULKAN_HPP_NAMESPACE::SemaphoreGetFdInfoKHR * pGetFdInfo,\n                                                   int *                                               pFd,\n                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<int>::type getSemaphoreFdKHR( const VULKAN_HPP_NAMESPACE::SemaphoreGetFdInfoKHR & getFdInfo,\n                                                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_descriptor_update_template ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createDescriptorUpdateTemplateKHR( const VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo * pCreateInfo,\n                                                                   const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                pAllocator,\n                                                                   VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate *                 pDescriptorUpdateTemplate,\n                                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate>::type\n      createDescriptorUpdateTemplateKHR( const VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo &    createInfo,\n                                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                         Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate, Dispatch>>::type\n      createDescriptorUpdateTemplateKHRUnique( const VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo & createInfo,\n                                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator\n                                                                  VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyDescriptorUpdateTemplateKHR( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate    descriptorUpdateTemplate,\n                                             const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyDescriptorUpdateTemplateKHR( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void updateDescriptorSetWithTemplateKHR( VULKAN_HPP_NAMESPACE::DescriptorSet            descriptorSet,\n                                             VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,\n                                             const void *                                   pData,\n                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename DataType, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void updateDescriptorSetWithTemplateKHR( VULKAN_HPP_NAMESPACE::DescriptorSet            descriptorSet,\n                                             VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,\n                                             DataType const &                               data,\n                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_display_control ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result displayPowerControlEXT( VULKAN_HPP_NAMESPACE::DisplayKHR                  display,\n                                                        const VULKAN_HPP_NAMESPACE::DisplayPowerInfoEXT * pDisplayPowerInfo,\n                                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    typename ResultValueType<void>::type displayPowerControlEXT( VULKAN_HPP_NAMESPACE::DisplayKHR                  display,\n                                                                 const VULKAN_HPP_NAMESPACE::DisplayPowerInfoEXT & displayPowerInfo,\n                                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result registerEventEXT( const VULKAN_HPP_NAMESPACE::DeviceEventInfoEXT *  pDeviceEventInfo,\n                                                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                  VULKAN_HPP_NAMESPACE::Fence *                     pFence,\n                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::Fence>::type\n      registerEventEXT( const VULKAN_HPP_NAMESPACE::DeviceEventInfoEXT &                    deviceEventInfo,\n                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                        Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::Fence, Dispatch>>::type\n      registerEventEXTUnique( const VULKAN_HPP_NAMESPACE::DeviceEventInfoEXT &                    deviceEventInfo,\n                              Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                              Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result registerDisplayEventEXT( VULKAN_HPP_NAMESPACE::DisplayKHR                  display,\n                                                         const VULKAN_HPP_NAMESPACE::DisplayEventInfoEXT * pDisplayEventInfo,\n                                                         const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                         VULKAN_HPP_NAMESPACE::Fence *                     pFence,\n                                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::Fence>::type\n      registerDisplayEventEXT( VULKAN_HPP_NAMESPACE::DisplayKHR                                    display,\n                               const VULKAN_HPP_NAMESPACE::DisplayEventInfoEXT &                   displayEventInfo,\n                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                               Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::Fence, Dispatch>>::type\n      registerDisplayEventEXTUnique( VULKAN_HPP_NAMESPACE::DisplayKHR                                    display,\n                                     const VULKAN_HPP_NAMESPACE::DisplayEventInfoEXT &                   displayEventInfo,\n                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                     Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getSwapchainCounterEXT( VULKAN_HPP_NAMESPACE::SwapchainKHR              swapchain,\n                                                        VULKAN_HPP_NAMESPACE::SurfaceCounterFlagBitsEXT counter,\n                                                        uint64_t *                                      pCounterValue,\n                                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<uint64_t>::type getSwapchainCounterEXT( VULKAN_HPP_NAMESPACE::SwapchainKHR              swapchain,\n                                                                                          VULKAN_HPP_NAMESPACE::SurfaceCounterFlagBitsEXT counter,\n                                                                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_GOOGLE_display_timing ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getRefreshCycleDurationGOOGLE( VULKAN_HPP_NAMESPACE::SwapchainKHR                 swapchain,\n                                                               VULKAN_HPP_NAMESPACE::RefreshCycleDurationGOOGLE * pDisplayTimingProperties,\n                                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::RefreshCycleDurationGOOGLE>::type\n      getRefreshCycleDurationGOOGLE( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getPastPresentationTimingGOOGLE( VULKAN_HPP_NAMESPACE::SwapchainKHR                   swapchain,\n                                                                 uint32_t *                                           pPresentationTimingCount,\n                                                                 VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE * pPresentationTimings,\n                                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename PastPresentationTimingGOOGLEAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE>,\n              typename Dispatch                              = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename PastPresentationTimingGOOGLEAllocator::value_type, VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE, PastPresentationTimingGOOGLEAllocator>>::type\n      getPastPresentationTimingGOOGLE( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename PastPresentationTimingGOOGLEAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE>,\n              typename Dispatch                              = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename PastPresentationTimingGOOGLEAllocator::value_type, VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE, PastPresentationTimingGOOGLEAllocator>>::type\n      getPastPresentationTimingGOOGLE( VULKAN_HPP_NAMESPACE::SwapchainKHR      swapchain,\n                                       PastPresentationTimingGOOGLEAllocator & pastPresentationTimingGOOGLEAllocator,\n                                       Dispatch const & d                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_hdr_metadata ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setHdrMetadataEXT( uint32_t                                     swapchainCount,\n                            const VULKAN_HPP_NAMESPACE::SwapchainKHR *   pSwapchains,\n                            const VULKAN_HPP_NAMESPACE::HdrMetadataEXT * pMetadata,\n                            Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setHdrMetadataEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SwapchainKHR> const &   swapchains,\n                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::HdrMetadataEXT> const & metadata,\n                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_create_renderpass2 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createRenderPass2KHR( const VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 * pCreateInfo,\n                                                      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *   pAllocator,\n                                                      VULKAN_HPP_NAMESPACE::RenderPass *                  pRenderPass,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::RenderPass>::type\n      createRenderPass2KHR( const VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 &                 createInfo,\n                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                            Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::RenderPass, Dispatch>>::type\n      createRenderPass2KHRUnique( const VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 &                 createInfo,\n                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_shared_presentable_image ===\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getSwapchainStatusKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain,\n                                                       Dispatch const & d                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result getSwapchainStatusKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain,\n                                                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n    //=== VK_KHR_external_fence_win32 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result importFenceWin32HandleKHR( const VULKAN_HPP_NAMESPACE::ImportFenceWin32HandleInfoKHR * pImportFenceWin32HandleInfo,\n                                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      importFenceWin32HandleKHR( const VULKAN_HPP_NAMESPACE::ImportFenceWin32HandleInfoKHR & importFenceWin32HandleInfo,\n                                 Dispatch const & d                                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getFenceWin32HandleKHR( const VULKAN_HPP_NAMESPACE::FenceGetWin32HandleInfoKHR * pGetWin32HandleInfo,\n                                                        HANDLE *                                                 pHandle,\n                                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<HANDLE>::type\n      getFenceWin32HandleKHR( const VULKAN_HPP_NAMESPACE::FenceGetWin32HandleInfoKHR & getWin32HandleInfo,\n                              Dispatch const & d                                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_WIN32_KHR*/\n\n    //=== VK_KHR_external_fence_fd ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result importFenceFdKHR( const VULKAN_HPP_NAMESPACE::ImportFenceFdInfoKHR * pImportFenceFdInfo,\n                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      importFenceFdKHR( const VULKAN_HPP_NAMESPACE::ImportFenceFdInfoKHR & importFenceFdInfo,\n                        Dispatch const & d                                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getFenceFdKHR( const VULKAN_HPP_NAMESPACE::FenceGetFdInfoKHR * pGetFdInfo,\n                                               int *                                           pFd,\n                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<int>::type getFenceFdKHR( const VULKAN_HPP_NAMESPACE::FenceGetFdInfoKHR & getFdInfo,\n                                                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_performance_query ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result acquireProfilingLockKHR( const VULKAN_HPP_NAMESPACE::AcquireProfilingLockInfoKHR * pInfo,\n                                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      acquireProfilingLockKHR( const VULKAN_HPP_NAMESPACE::AcquireProfilingLockInfoKHR & info,\n                               Dispatch const & d                                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void releaseProfilingLockKHR( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_EXT_debug_utils ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result setDebugUtilsObjectNameEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT * pNameInfo,\n                                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      setDebugUtilsObjectNameEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT & nameInfo,\n                                  Dispatch const & d                                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result setDebugUtilsObjectTagEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsObjectTagInfoEXT * pTagInfo,\n                                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      setDebugUtilsObjectTagEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsObjectTagInfoEXT & tagInfo,\n                                 Dispatch const & d                                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n    //=== VK_ANDROID_external_memory_android_hardware_buffer ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result\n      getAndroidHardwareBufferPropertiesANDROID( const struct AHardwareBuffer *                                 buffer,\n                                                 VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID * pProperties,\n                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID>::type\n      getAndroidHardwareBufferPropertiesANDROID( const struct AHardwareBuffer & buffer, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>>::type\n      getAndroidHardwareBufferPropertiesANDROID( const struct AHardwareBuffer & buffer, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getMemoryAndroidHardwareBufferANDROID( const VULKAN_HPP_NAMESPACE::MemoryGetAndroidHardwareBufferInfoANDROID * pInfo,\n                                                                       struct AHardwareBuffer **                                               pBuffer,\n                                                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<struct AHardwareBuffer *>::type\n      getMemoryAndroidHardwareBufferANDROID( const VULKAN_HPP_NAMESPACE::MemoryGetAndroidHardwareBufferInfoANDROID & info,\n                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n    //=== VK_AMDX_shader_enqueue ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createExecutionGraphPipelinesAMDX( VULKAN_HPP_NAMESPACE::PipelineCache                                pipelineCache,\n                                                                   uint32_t                                                           createInfoCount,\n                                                                   const VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX * pCreateInfos,\n                                                                   const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                  pAllocator,\n                                                                   VULKAN_HPP_NAMESPACE::Pipeline *                                   pPipelines,\n                                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename PipelineAllocator = std::allocator<VULKAN_HPP_NAMESPACE::Pipeline>,\n              typename Dispatch          = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, VULKAN_HPP_NAMESPACE::Pipeline>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>\n                         createExecutionGraphPipelinesAMDX( VULKAN_HPP_NAMESPACE::PipelineCache pipelineCache,\n                                                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX> const & createInfos,\n                                                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                                            Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename PipelineAllocator = std::allocator<VULKAN_HPP_NAMESPACE::Pipeline>,\n              typename Dispatch          = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, VULKAN_HPP_NAMESPACE::Pipeline>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>\n                         createExecutionGraphPipelinesAMDX( VULKAN_HPP_NAMESPACE::PipelineCache pipelineCache,\n                                                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX> const & createInfos,\n                                                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                                  allocator,\n                                                            PipelineAllocator & pipelineAllocator,\n                                                            Dispatch const & d  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD ResultValue<VULKAN_HPP_NAMESPACE::Pipeline>\n                         createExecutionGraphPipelineAMDX( VULKAN_HPP_NAMESPACE::PipelineCache                                 pipelineCache,\n                                                           const VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX &  createInfo,\n                                                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                                           Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename PipelineAllocator         = std::allocator<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>,\n              typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>::value,\n                                      int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>\n                         createExecutionGraphPipelinesAMDXUnique(\n                           VULKAN_HPP_NAMESPACE::PipelineCache                                                                        pipelineCache,\n                           VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX> const & createInfos,\n                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                           Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Dispatch                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename PipelineAllocator         = std::allocator<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>,\n              typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>::value,\n                                      int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>\n                         createExecutionGraphPipelinesAMDXUnique(\n                           VULKAN_HPP_NAMESPACE::PipelineCache                                                                        pipelineCache,\n                           VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX> const & createInfos,\n                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                                  allocator,\n                           PipelineAllocator &                                                                                        pipelineAllocator,\n                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD ResultValue<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>> createExecutionGraphPipelineAMDXUnique(\n      VULKAN_HPP_NAMESPACE::PipelineCache                                 pipelineCache,\n      const VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX &  createInfo,\n      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n      Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result\n      getExecutionGraphPipelineScratchSizeAMDX( VULKAN_HPP_NAMESPACE::Pipeline                                executionGraph,\n                                                VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineScratchSizeAMDX * pSizeInfo,\n                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineScratchSizeAMDX>::type\n      getExecutionGraphPipelineScratchSizeAMDX( VULKAN_HPP_NAMESPACE::Pipeline executionGraph,\n                                                Dispatch const & d             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getExecutionGraphPipelineNodeIndexAMDX( VULKAN_HPP_NAMESPACE::Pipeline                                      executionGraph,\n                                                                        const VULKAN_HPP_NAMESPACE::PipelineShaderStageNodeCreateInfoAMDX * pNodeInfo,\n                                                                        uint32_t *                                                          pNodeIndex,\n                                                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<uint32_t>::type\n      getExecutionGraphPipelineNodeIndexAMDX( VULKAN_HPP_NAMESPACE::Pipeline                                      executionGraph,\n                                              const VULKAN_HPP_NAMESPACE::PipelineShaderStageNodeCreateInfoAMDX & nodeInfo,\n                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_ENABLE_BETA_EXTENSIONS*/\n\n    //=== VK_KHR_get_memory_requirements2 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getImageMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 * pInfo,\n                                         VULKAN_HPP_NAMESPACE::MemoryRequirements2 *                pMemoryRequirements,\n                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2\n                         getImageMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 & info,\n                                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getImageMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 & info,\n                                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getBufferMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 * pInfo,\n                                          VULKAN_HPP_NAMESPACE::MemoryRequirements2 *                 pMemoryRequirements,\n                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2\n                         getBufferMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 & info,\n                                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getBufferMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 & info,\n                                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getImageSparseMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 * pInfo,\n                                               uint32_t *                                                       pSparseMemoryRequirementCount,\n                                               VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2 *           pSparseMemoryRequirements,\n                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename SparseImageMemoryRequirements2Allocator = std::allocator<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>,\n              typename Dispatch                                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename SparseImageMemoryRequirements2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator>\n                         getImageSparseMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 & info,\n                                                               Dispatch const & d                                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename SparseImageMemoryRequirements2Allocator = std::allocator<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>,\n              typename Dispatch                                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename SparseImageMemoryRequirements2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator>\n                         getImageSparseMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 & info,\n                                                               SparseImageMemoryRequirements2Allocator &                        sparseImageMemoryRequirements2Allocator,\n                                                               Dispatch const & d                                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_acceleration_structure ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createAccelerationStructureKHR( const VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoKHR * pCreateInfo,\n                                                                const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                pAllocator,\n                                                                VULKAN_HPP_NAMESPACE::AccelerationStructureKHR *                 pAccelerationStructure,\n                                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::AccelerationStructureKHR>::type\n      createAccelerationStructureKHR( const VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoKHR &    createInfo,\n                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                      Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::AccelerationStructureKHR, Dispatch>>::type\n      createAccelerationStructureKHRUnique( const VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoKHR &    createInfo,\n                                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyAccelerationStructureKHR( VULKAN_HPP_NAMESPACE::AccelerationStructureKHR    accelerationStructure,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyAccelerationStructureKHR( VULKAN_HPP_NAMESPACE::AccelerationStructureKHR accelerationStructure VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator  VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::AccelerationStructureKHR    accelerationStructure,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::AccelerationStructureKHR                      accelerationStructure,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result buildAccelerationStructuresKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                                   deferredOperation,\n                                                                uint32_t                                                                     infoCount,\n                                                                const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR *      pInfos,\n                                                                const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR * const * ppBuildRangeInfos,\n                                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result buildAccelerationStructuresKHR(\n      VULKAN_HPP_NAMESPACE::DeferredOperationKHR                                                                           deferredOperation,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR> const &      infos,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR * const> const & pBuildRangeInfos,\n      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result copyAccelerationStructureKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                     deferredOperation,\n                                                              const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR * pInfo,\n                                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result copyAccelerationStructureKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR deferredOperation,\n                                                                                    const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR & info,\n                                                                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result copyAccelerationStructureToMemoryKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                             deferredOperation,\n                                                                      const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureToMemoryInfoKHR * pInfo,\n                                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result\n                         copyAccelerationStructureToMemoryKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                             deferredOperation,\n                                                               const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureToMemoryInfoKHR & info,\n                                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result copyMemoryToAccelerationStructureKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                             deferredOperation,\n                                                                      const VULKAN_HPP_NAMESPACE::CopyMemoryToAccelerationStructureInfoKHR * pInfo,\n                                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result\n                         copyMemoryToAccelerationStructureKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                             deferredOperation,\n                                                               const VULKAN_HPP_NAMESPACE::CopyMemoryToAccelerationStructureInfoKHR & info,\n                                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result\n      writeAccelerationStructuresPropertiesKHR( uint32_t                                               accelerationStructureCount,\n                                                const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR * pAccelerationStructures,\n                                                VULKAN_HPP_NAMESPACE::QueryType                        queryType,\n                                                size_t                                                 dataSize,\n                                                void *                                                 pData,\n                                                size_t                                                 stride,\n                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename DataType,\n              typename DataTypeAllocator                                                                                = std::allocator<DataType>,\n              typename Dispatch                                                                                         = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename DataTypeAllocator::value_type, DataType>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<DataType, DataTypeAllocator>>::type writeAccelerationStructuresPropertiesKHR(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR> const & accelerationStructures,\n      VULKAN_HPP_NAMESPACE::QueryType                                                                queryType,\n      size_t                                                                                         dataSize,\n      size_t                                                                                         stride,\n      Dispatch const & d                                                                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename DataType, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<DataType>::type writeAccelerationStructuresPropertyKHR(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR> const & accelerationStructures,\n      VULKAN_HPP_NAMESPACE::QueryType                                                                queryType,\n      size_t                                                                                         stride,\n      Dispatch const & d                                                                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    DeviceAddress getAccelerationStructureAddressKHR( const VULKAN_HPP_NAMESPACE::AccelerationStructureDeviceAddressInfoKHR * pInfo,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NAMESPACE::DeviceAddress\n      getAccelerationStructureAddressKHR( const VULKAN_HPP_NAMESPACE::AccelerationStructureDeviceAddressInfoKHR & info,\n                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getAccelerationStructureCompatibilityKHR( const VULKAN_HPP_NAMESPACE::AccelerationStructureVersionInfoKHR * pVersionInfo,\n                                                   VULKAN_HPP_NAMESPACE::AccelerationStructureCompatibilityKHR *     pCompatibility,\n                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::AccelerationStructureCompatibilityKHR\n                         getAccelerationStructureCompatibilityKHR( const VULKAN_HPP_NAMESPACE::AccelerationStructureVersionInfoKHR & versionInfo,\n                                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getAccelerationStructureBuildSizesKHR( VULKAN_HPP_NAMESPACE::AccelerationStructureBuildTypeKHR                 buildType,\n                                                const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR * pBuildInfo,\n                                                const uint32_t *                                                        pMaxPrimitiveCounts,\n                                                VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR *          pSizeInfo,\n                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR getAccelerationStructureBuildSizesKHR(\n      VULKAN_HPP_NAMESPACE::AccelerationStructureBuildTypeKHR                     buildType,\n      const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR &     buildInfo,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const uint32_t> const & maxPrimitiveCounts VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_ray_tracing_pipeline ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createRayTracingPipelinesKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                    deferredOperation,\n                                                              VULKAN_HPP_NAMESPACE::PipelineCache                           pipelineCache,\n                                                              uint32_t                                                      createInfoCount,\n                                                              const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR * pCreateInfos,\n                                                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks *             pAllocator,\n                                                              VULKAN_HPP_NAMESPACE::Pipeline *                              pPipelines,\n                                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename PipelineAllocator = std::allocator<VULKAN_HPP_NAMESPACE::Pipeline>,\n              typename Dispatch          = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, VULKAN_HPP_NAMESPACE::Pipeline>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>\n                         createRayTracingPipelinesKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                                                            deferredOperation,\n                                                       VULKAN_HPP_NAMESPACE::PipelineCache                                                                   pipelineCache,\n                                                       VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR> const & createInfos,\n                                                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                                       Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename PipelineAllocator = std::allocator<VULKAN_HPP_NAMESPACE::Pipeline>,\n              typename Dispatch          = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, VULKAN_HPP_NAMESPACE::Pipeline>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>\n                         createRayTracingPipelinesKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                                                            deferredOperation,\n                                                       VULKAN_HPP_NAMESPACE::PipelineCache                                                                   pipelineCache,\n                                                       VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR> const & createInfos,\n                                                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                             allocator,\n                                                       PipelineAllocator &                                                                                   pipelineAllocator,\n                                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD ResultValue<VULKAN_HPP_NAMESPACE::Pipeline>\n                         createRayTracingPipelineKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                          deferredOperation,\n                                                      VULKAN_HPP_NAMESPACE::PipelineCache                                 pipelineCache,\n                                                      const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR &       createInfo,\n                                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                                      Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename PipelineAllocator         = std::allocator<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>,\n              typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>::value,\n                                      int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>\n                         createRayTracingPipelinesKHRUnique( VULKAN_HPP_NAMESPACE::DeferredOperationKHR deferredOperation,\n                                                             VULKAN_HPP_NAMESPACE::PipelineCache        pipelineCache,\n                                                             VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR> const & createInfos,\n                                                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                                             Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Dispatch                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename PipelineAllocator         = std::allocator<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>,\n              typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>::value,\n                                      int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>\n                         createRayTracingPipelinesKHRUnique( VULKAN_HPP_NAMESPACE::DeferredOperationKHR deferredOperation,\n                                                             VULKAN_HPP_NAMESPACE::PipelineCache        pipelineCache,\n                                                             VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR> const & createInfos,\n                                                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                             allocator,\n                                                             PipelineAllocator & pipelineAllocator,\n                                                             Dispatch const & d  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD ResultValue<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>\n                         createRayTracingPipelineKHRUnique( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                          deferredOperation,\n                                                            VULKAN_HPP_NAMESPACE::PipelineCache                                 pipelineCache,\n                                                            const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR &       createInfo,\n                                                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                                            Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getRayTracingShaderGroupHandlesKHR( VULKAN_HPP_NAMESPACE::Pipeline pipeline,\n                                                                    uint32_t                       firstGroup,\n                                                                    uint32_t                       groupCount,\n                                                                    size_t                         dataSize,\n                                                                    void *                         pData,\n                                                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename DataType,\n              typename DataTypeAllocator                                                                                = std::allocator<DataType>,\n              typename Dispatch                                                                                         = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename DataTypeAllocator::value_type, DataType>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<DataType, DataTypeAllocator>>::type\n      getRayTracingShaderGroupHandlesKHR( VULKAN_HPP_NAMESPACE::Pipeline pipeline,\n                                          uint32_t                       firstGroup,\n                                          uint32_t                       groupCount,\n                                          size_t                         dataSize,\n                                          Dispatch const & d             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename DataType, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<DataType>::type getRayTracingShaderGroupHandleKHR(\n      VULKAN_HPP_NAMESPACE::Pipeline pipeline, uint32_t firstGroup, uint32_t groupCount, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result\n      getRayTracingCaptureReplayShaderGroupHandlesKHR( VULKAN_HPP_NAMESPACE::Pipeline pipeline,\n                                                       uint32_t                       firstGroup,\n                                                       uint32_t                       groupCount,\n                                                       size_t                         dataSize,\n                                                       void *                         pData,\n                                                       Dispatch const & d             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename DataType,\n              typename DataTypeAllocator                                                                                = std::allocator<DataType>,\n              typename Dispatch                                                                                         = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename DataTypeAllocator::value_type, DataType>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<DataType, DataTypeAllocator>>::type\n      getRayTracingCaptureReplayShaderGroupHandlesKHR( VULKAN_HPP_NAMESPACE::Pipeline pipeline,\n                                                       uint32_t                       firstGroup,\n                                                       uint32_t                       groupCount,\n                                                       size_t                         dataSize,\n                                                       Dispatch const & d             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename DataType, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<DataType>::type getRayTracingCaptureReplayShaderGroupHandleKHR(\n      VULKAN_HPP_NAMESPACE::Pipeline pipeline, uint32_t firstGroup, uint32_t groupCount, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    DeviceSize getRayTracingShaderGroupStackSizeKHR( VULKAN_HPP_NAMESPACE::Pipeline             pipeline,\n                                                     uint32_t                                   group,\n                                                     VULKAN_HPP_NAMESPACE::ShaderGroupShaderKHR groupShader,\n                                                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_KHR_sampler_ycbcr_conversion ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createSamplerYcbcrConversionKHR( const VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo * pCreateInfo,\n                                                                 const VULKAN_HPP_NAMESPACE::AllocationCallbacks *              pAllocator,\n                                                                 VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion *                 pYcbcrConversion,\n                                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion>::type\n      createSamplerYcbcrConversionKHR( const VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo &      createInfo,\n                                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                       Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion, Dispatch>>::type\n      createSamplerYcbcrConversionKHRUnique( const VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo &      createInfo,\n                                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroySamplerYcbcrConversionKHR( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion      ycbcrConversion,\n                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroySamplerYcbcrConversionKHR( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion ycbcrConversion        VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_bind_memory2 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result bindBufferMemory2KHR( uint32_t                                           bindInfoCount,\n                                                      const VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo * pBindInfos,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      bindBufferMemory2KHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo> const & bindInfos,\n                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result bindImageMemory2KHR( uint32_t                                          bindInfoCount,\n                                                     const VULKAN_HPP_NAMESPACE::BindImageMemoryInfo * pBindInfos,\n                                                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      bindImageMemory2KHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindImageMemoryInfo> const & bindInfos,\n                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_image_drm_format_modifier ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getImageDrmFormatModifierPropertiesEXT( VULKAN_HPP_NAMESPACE::Image                                 image,\n                                                                        VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierPropertiesEXT * pProperties,\n                                                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierPropertiesEXT>::type\n      getImageDrmFormatModifierPropertiesEXT( VULKAN_HPP_NAMESPACE::Image image, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_validation_cache ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createValidationCacheEXT( const VULKAN_HPP_NAMESPACE::ValidationCacheCreateInfoEXT * pCreateInfo,\n                                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks *          pAllocator,\n                                                          VULKAN_HPP_NAMESPACE::ValidationCacheEXT *                 pValidationCache,\n                                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::ValidationCacheEXT>::type\n      createValidationCacheEXT( const VULKAN_HPP_NAMESPACE::ValidationCacheCreateInfoEXT &          createInfo,\n                                Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::ValidationCacheEXT, Dispatch>>::type\n      createValidationCacheEXTUnique( const VULKAN_HPP_NAMESPACE::ValidationCacheCreateInfoEXT &          createInfo,\n                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                      Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyValidationCacheEXT( VULKAN_HPP_NAMESPACE::ValidationCacheEXT          validationCache,\n                                    const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                    Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyValidationCacheEXT( VULKAN_HPP_NAMESPACE::ValidationCacheEXT validationCache            VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::ValidationCacheEXT          validationCache,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::ValidationCacheEXT                            validationCache,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result mergeValidationCachesEXT( VULKAN_HPP_NAMESPACE::ValidationCacheEXT         dstCache,\n                                                          uint32_t                                         srcCacheCount,\n                                                          const VULKAN_HPP_NAMESPACE::ValidationCacheEXT * pSrcCaches,\n                                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      mergeValidationCachesEXT( VULKAN_HPP_NAMESPACE::ValidationCacheEXT                                                 dstCache,\n                                VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ValidationCacheEXT> const & srcCaches,\n                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getValidationCacheDataEXT( VULKAN_HPP_NAMESPACE::ValidationCacheEXT validationCache,\n                                                           size_t *                                 pDataSize,\n                                                           void *                                   pData,\n                                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Uint8_tAllocator                                                                               = std::allocator<uint8_t>,\n              typename Dispatch                                                                                       = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<uint8_t, Uint8_tAllocator>>::type\n      getValidationCacheDataEXT( VULKAN_HPP_NAMESPACE::ValidationCacheEXT validationCache, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Uint8_tAllocator                                                                               = std::allocator<uint8_t>,\n              typename Dispatch                                                                                       = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<uint8_t, Uint8_tAllocator>>::type\n      getValidationCacheDataEXT( VULKAN_HPP_NAMESPACE::ValidationCacheEXT validationCache,\n                                 Uint8_tAllocator &                       uint8_tAllocator,\n                                 Dispatch const & d                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NV_ray_tracing ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createAccelerationStructureNV( const VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoNV * pCreateInfo,\n                                                               const VULKAN_HPP_NAMESPACE::AllocationCallbacks *               pAllocator,\n                                                               VULKAN_HPP_NAMESPACE::AccelerationStructureNV *                 pAccelerationStructure,\n                                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::AccelerationStructureNV>::type\n      createAccelerationStructureNV( const VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoNV &     createInfo,\n                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                     Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::AccelerationStructureNV, Dispatch>>::type\n      createAccelerationStructureNVUnique( const VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoNV &     createInfo,\n                                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                           Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyAccelerationStructureNV( VULKAN_HPP_NAMESPACE::AccelerationStructureNV     accelerationStructure,\n                                         const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                         Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyAccelerationStructureNV( VULKAN_HPP_NAMESPACE::AccelerationStructureNV accelerationStructure VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::AccelerationStructureNV     accelerationStructure,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::AccelerationStructureNV                       accelerationStructure,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getAccelerationStructureMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsInfoNV * pInfo,\n                                                       VULKAN_HPP_NAMESPACE::MemoryRequirements2KHR *                              pMemoryRequirements,\n                                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2KHR\n                         getAccelerationStructureMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsInfoNV & info,\n                                                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getAccelerationStructureMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsInfoNV & info,\n                                                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result bindAccelerationStructureMemoryNV( uint32_t                                                            bindInfoCount,\n                                                                   const VULKAN_HPP_NAMESPACE::BindAccelerationStructureMemoryInfoNV * pBindInfos,\n                                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      bindAccelerationStructureMemoryNV( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindAccelerationStructureMemoryInfoNV> const & bindInfos,\n                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createRayTracingPipelinesNV( VULKAN_HPP_NAMESPACE::PipelineCache                          pipelineCache,\n                                                             uint32_t                                                     createInfoCount,\n                                                             const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV * pCreateInfos,\n                                                             const VULKAN_HPP_NAMESPACE::AllocationCallbacks *            pAllocator,\n                                                             VULKAN_HPP_NAMESPACE::Pipeline *                             pPipelines,\n                                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename PipelineAllocator = std::allocator<VULKAN_HPP_NAMESPACE::Pipeline>,\n              typename Dispatch          = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, VULKAN_HPP_NAMESPACE::Pipeline>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>\n                         createRayTracingPipelinesNV( VULKAN_HPP_NAMESPACE::PipelineCache                                                                  pipelineCache,\n                                                      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV> const & createInfos,\n                                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                                      Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename PipelineAllocator = std::allocator<VULKAN_HPP_NAMESPACE::Pipeline>,\n              typename Dispatch          = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, VULKAN_HPP_NAMESPACE::Pipeline>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<VULKAN_HPP_NAMESPACE::Pipeline, PipelineAllocator>>\n                         createRayTracingPipelinesNV( VULKAN_HPP_NAMESPACE::PipelineCache                                                                  pipelineCache,\n                                                      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV> const & createInfos,\n                                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                            allocator,\n                                                      PipelineAllocator &                                                                                  pipelineAllocator,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD ResultValue<VULKAN_HPP_NAMESPACE::Pipeline>\n                         createRayTracingPipelineNV( VULKAN_HPP_NAMESPACE::PipelineCache                                 pipelineCache,\n                                                     const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV &        createInfo,\n                                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                                     Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename PipelineAllocator         = std::allocator<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>,\n              typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>::value,\n                                      int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>\n                         createRayTracingPipelinesNVUnique( VULKAN_HPP_NAMESPACE::PipelineCache                                                                  pipelineCache,\n                                                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV> const & createInfos,\n                                                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                                            Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Dispatch                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename PipelineAllocator         = std::allocator<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>,\n              typename std::enable_if<std::is_same<typename PipelineAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>::value,\n                                      int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>, PipelineAllocator>>\n                         createRayTracingPipelinesNVUnique( VULKAN_HPP_NAMESPACE::PipelineCache                                                                  pipelineCache,\n                                                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV> const & createInfos,\n                                                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                            allocator,\n                                                            PipelineAllocator &                                                                                  pipelineAllocator,\n                                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD ResultValue<UniqueHandle<VULKAN_HPP_NAMESPACE::Pipeline, Dispatch>>\n                         createRayTracingPipelineNVUnique( VULKAN_HPP_NAMESPACE::PipelineCache                                 pipelineCache,\n                                                           const VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV &        createInfo,\n                                                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                                           Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getRayTracingShaderGroupHandlesNV( VULKAN_HPP_NAMESPACE::Pipeline pipeline,\n                                                                   uint32_t                       firstGroup,\n                                                                   uint32_t                       groupCount,\n                                                                   size_t                         dataSize,\n                                                                   void *                         pData,\n                                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename DataType,\n              typename DataTypeAllocator                                                                                = std::allocator<DataType>,\n              typename Dispatch                                                                                         = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename DataTypeAllocator::value_type, DataType>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<DataType, DataTypeAllocator>>::type\n      getRayTracingShaderGroupHandlesNV( VULKAN_HPP_NAMESPACE::Pipeline pipeline,\n                                         uint32_t                       firstGroup,\n                                         uint32_t                       groupCount,\n                                         size_t                         dataSize,\n                                         Dispatch const & d             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename DataType, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<DataType>::type getRayTracingShaderGroupHandleNV(\n      VULKAN_HPP_NAMESPACE::Pipeline pipeline, uint32_t firstGroup, uint32_t groupCount, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getAccelerationStructureHandleNV( VULKAN_HPP_NAMESPACE::AccelerationStructureNV accelerationStructure,\n                                                                  size_t                                        dataSize,\n                                                                  void *                                        pData,\n                                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename DataType,\n              typename DataTypeAllocator                                                                                = std::allocator<DataType>,\n              typename Dispatch                                                                                         = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename DataTypeAllocator::value_type, DataType>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<DataType, DataTypeAllocator>>::type getAccelerationStructureHandleNV(\n      VULKAN_HPP_NAMESPACE::AccelerationStructureNV accelerationStructure, size_t dataSize, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename DataType, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<DataType>::type\n      getAccelerationStructureHandleNV( VULKAN_HPP_NAMESPACE::AccelerationStructureNV accelerationStructure,\n                                        Dispatch const & d                            VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result compileDeferredNV( VULKAN_HPP_NAMESPACE::Pipeline pipeline,\n                                                   uint32_t                       shader,\n                                                   Dispatch const & d             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      compileDeferredNV( VULKAN_HPP_NAMESPACE::Pipeline pipeline, uint32_t shader, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    //=== VK_KHR_maintenance3 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getDescriptorSetLayoutSupportKHR( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo * pCreateInfo,\n                                           VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport *          pSupport,\n                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport\n                         getDescriptorSetLayoutSupportKHR( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo & createInfo,\n                                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getDescriptorSetLayoutSupportKHR( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo & createInfo,\n                                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_external_memory_host ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getMemoryHostPointerPropertiesEXT( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType,\n                                                                   const void *                                           pHostPointer,\n                                                                   VULKAN_HPP_NAMESPACE::MemoryHostPointerPropertiesEXT * pMemoryHostPointerProperties,\n                                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::MemoryHostPointerPropertiesEXT>::type\n      getMemoryHostPointerPropertiesEXT( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType,\n                                         const void *                                           pHostPointer,\n                                         Dispatch const & d                                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_calibrated_timestamps ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getCalibratedTimestampsEXT( uint32_t                                                 timestampCount,\n                                                            const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR * pTimestampInfos,\n                                                            uint64_t *                                               pTimestamps,\n                                                            uint64_t *                                               pMaxDeviation,\n                                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Uint64_tAllocator                                                                                = std::allocator<uint64_t>,\n              typename Dispatch                                                                                         = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename Uint64_tAllocator::value_type, uint64_t>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::pair<std::vector<uint64_t, Uint64_tAllocator>, uint64_t>>::type\n      getCalibratedTimestampsEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR> const & timestampInfos,\n                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Uint64_tAllocator                                                                                = std::allocator<uint64_t>,\n              typename Dispatch                                                                                         = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename Uint64_tAllocator::value_type, uint64_t>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::pair<std::vector<uint64_t, Uint64_tAllocator>, uint64_t>>::type\n      getCalibratedTimestampsEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR> const & timestampInfos,\n                                  Uint64_tAllocator &                                                                              uint64_tAllocator,\n                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::pair<uint64_t, uint64_t>>::type\n      getCalibratedTimestampEXT( const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR & timestampInfo,\n                                 Dispatch const & d                                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_timeline_semaphore ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getSemaphoreCounterValueKHR( VULKAN_HPP_NAMESPACE::Semaphore semaphore,\n                                                             uint64_t *                      pValue,\n                                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<uint64_t>::type\n      getSemaphoreCounterValueKHR( VULKAN_HPP_NAMESPACE::Semaphore semaphore, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result waitSemaphoresKHR( const VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo * pWaitInfo,\n                                                   uint64_t                                        timeout,\n                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result waitSemaphoresKHR( const VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo & waitInfo,\n                                                                         uint64_t                                        timeout,\n                                                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result signalSemaphoreKHR( const VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo * pSignalInfo,\n                                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      signalSemaphoreKHR( const VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo & signalInfo, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_INTEL_performance_query ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result initializePerformanceApiINTEL( const VULKAN_HPP_NAMESPACE::InitializePerformanceApiInfoINTEL * pInitializeInfo,\n                                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      initializePerformanceApiINTEL( const VULKAN_HPP_NAMESPACE::InitializePerformanceApiInfoINTEL & initializeInfo,\n                                     Dispatch const & d                                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void uninitializePerformanceApiINTEL( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result acquirePerformanceConfigurationINTEL( const VULKAN_HPP_NAMESPACE::PerformanceConfigurationAcquireInfoINTEL * pAcquireInfo,\n                                                                      VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL *                  pConfiguration,\n                                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL>::type\n      acquirePerformanceConfigurationINTEL( const VULKAN_HPP_NAMESPACE::PerformanceConfigurationAcquireInfoINTEL & acquireInfo,\n                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL, Dispatch>>::type\n      acquirePerformanceConfigurationINTELUnique( const VULKAN_HPP_NAMESPACE::PerformanceConfigurationAcquireInfoINTEL & acquireInfo,\n                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result releasePerformanceConfigurationINTEL( VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration,\n                                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      releasePerformanceConfigurationINTEL( VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                            Dispatch const & d                                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result release( VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration,\n                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type release( VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration,\n                                                                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getPerformanceParameterINTEL( VULKAN_HPP_NAMESPACE::PerformanceParameterTypeINTEL parameter,\n                                                              VULKAN_HPP_NAMESPACE::PerformanceValueINTEL *       pValue,\n                                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::PerformanceValueINTEL>::type\n      getPerformanceParameterINTEL( VULKAN_HPP_NAMESPACE::PerformanceParameterTypeINTEL parameter,\n                                    Dispatch const & d                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_AMD_display_native_hdr ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setLocalDimmingAMD( VULKAN_HPP_NAMESPACE::SwapchainKHR swapChain,\n                             VULKAN_HPP_NAMESPACE::Bool32       localDimmingEnable,\n                             Dispatch const & d                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_EXT_buffer_device_address ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    DeviceAddress getBufferAddressEXT( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo * pInfo,\n                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NAMESPACE::DeviceAddress getBufferAddressEXT( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo & info,\n                                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_present_wait ===\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result waitForPresentKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain,\n                                                   uint64_t                           presentId,\n                                                   uint64_t                           timeout,\n                                                   Dispatch const & d                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result waitForPresentKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain,\n                                                                         uint64_t                           presentId,\n                                                                         uint64_t                           timeout,\n                                                                         Dispatch const & d                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n    //=== VK_EXT_full_screen_exclusive ===\n\n#  ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result acquireFullScreenExclusiveModeEXT( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain,\n                                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      acquireFullScreenExclusiveModeEXT( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n#  ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result releaseFullScreenExclusiveModeEXT( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain,\n                                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      releaseFullScreenExclusiveModeEXT( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getGroupSurfacePresentModes2EXT( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR * pSurfaceInfo,\n                                                                 VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR *      pModes,\n                                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR>::type\n      getGroupSurfacePresentModes2EXT( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo,\n                                       Dispatch const & d                                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_WIN32_KHR*/\n\n    //=== VK_KHR_buffer_device_address ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    DeviceAddress getBufferAddressKHR( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo * pInfo,\n                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NAMESPACE::DeviceAddress getBufferAddressKHR( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo & info,\n                                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    uint64_t getBufferOpaqueCaptureAddressKHR( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo * pInfo,\n                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    uint64_t getBufferOpaqueCaptureAddressKHR( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo & info,\n                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    uint64_t getMemoryOpaqueCaptureAddressKHR( const VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo * pInfo,\n                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    uint64_t getMemoryOpaqueCaptureAddressKHR( const VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo & info,\n                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_host_query_reset ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void resetQueryPoolEXT( VULKAN_HPP_NAMESPACE::QueryPool queryPool,\n                            uint32_t                        firstQuery,\n                            uint32_t                        queryCount,\n                            Dispatch const & d              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_KHR_deferred_host_operations ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createDeferredOperationKHR( const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                            VULKAN_HPP_NAMESPACE::DeferredOperationKHR *      pDeferredOperation,\n                                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::DeferredOperationKHR>::type\n      createDeferredOperationKHR( Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DeferredOperationKHR, Dispatch>>::type\n      createDeferredOperationKHRUnique( Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                        Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyDeferredOperationKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR        operation,\n                                      const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                      Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyDeferredOperationKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR operation                VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::DeferredOperationKHR        operation,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                          operation,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    uint32_t getDeferredOperationMaxConcurrencyKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR operation,\n                                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getDeferredOperationResultKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR operation,\n                                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result\n                         getDeferredOperationResultKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR operation,\n                                                        Dispatch const & d                         VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result deferredOperationJoinKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR operation,\n                                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result deferredOperationJoinKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR operation,\n                                                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    //=== VK_KHR_pipeline_executable_properties ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getPipelineExecutablePropertiesKHR( const VULKAN_HPP_NAMESPACE::PipelineInfoKHR *           pPipelineInfo,\n                                                                    uint32_t *                                              pExecutableCount,\n                                                                    VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR * pProperties,\n                                                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename PipelineExecutablePropertiesKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR>,\n              typename Dispatch                                 = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename PipelineExecutablePropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR, PipelineExecutablePropertiesKHRAllocator>>::type\n      getPipelineExecutablePropertiesKHR( const VULKAN_HPP_NAMESPACE::PipelineInfoKHR & pipelineInfo,\n                                          Dispatch const & d                            VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename PipelineExecutablePropertiesKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR>,\n              typename Dispatch                                 = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename PipelineExecutablePropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR, PipelineExecutablePropertiesKHRAllocator>>::type\n      getPipelineExecutablePropertiesKHR( const VULKAN_HPP_NAMESPACE::PipelineInfoKHR & pipelineInfo,\n                                          PipelineExecutablePropertiesKHRAllocator &    pipelineExecutablePropertiesKHRAllocator,\n                                          Dispatch const & d                            VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getPipelineExecutableStatisticsKHR( const VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR * pExecutableInfo,\n                                                                    uint32_t *                                              pStatisticCount,\n                                                                    VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR *  pStatistics,\n                                                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename PipelineExecutableStatisticKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR>,\n              typename Dispatch                                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename PipelineExecutableStatisticKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR, PipelineExecutableStatisticKHRAllocator>>::type\n      getPipelineExecutableStatisticsKHR( const VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR & executableInfo,\n                                          Dispatch const & d                                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename PipelineExecutableStatisticKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR>,\n              typename Dispatch                                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename PipelineExecutableStatisticKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR, PipelineExecutableStatisticKHRAllocator>>::type\n      getPipelineExecutableStatisticsKHR( const VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR & executableInfo,\n                                          PipelineExecutableStatisticKHRAllocator &               pipelineExecutableStatisticKHRAllocator,\n                                          Dispatch const & d                                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result\n      getPipelineExecutableInternalRepresentationsKHR( const VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR *             pExecutableInfo,\n                                                       uint32_t *                                                          pInternalRepresentationCount,\n                                                       VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR * pInternalRepresentations,\n                                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename PipelineExecutableInternalRepresentationKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR>,\n              typename Dispatch                                             = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename PipelineExecutableInternalRepresentationKHRAllocator::value_type,\n                                                   VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR>::value,\n                                      int>::type                            = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<\n      std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR, PipelineExecutableInternalRepresentationKHRAllocator>>::type\n      getPipelineExecutableInternalRepresentationsKHR( const VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR & executableInfo,\n                                                       Dispatch const & d                                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename PipelineExecutableInternalRepresentationKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR>,\n              typename Dispatch                                             = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename PipelineExecutableInternalRepresentationKHRAllocator::value_type,\n                                                   VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR>::value,\n                                      int>::type                            = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<\n      std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR, PipelineExecutableInternalRepresentationKHRAllocator>>::type\n      getPipelineExecutableInternalRepresentationsKHR(\n        const VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR & executableInfo,\n        PipelineExecutableInternalRepresentationKHRAllocator &  pipelineExecutableInternalRepresentationKHRAllocator,\n        Dispatch const & d                                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_host_image_copy ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result copyMemoryToImageEXT( const VULKAN_HPP_NAMESPACE::CopyMemoryToImageInfo * pCopyMemoryToImageInfo,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      copyMemoryToImageEXT( const VULKAN_HPP_NAMESPACE::CopyMemoryToImageInfo & copyMemoryToImageInfo,\n                            Dispatch const & d                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result copyImageToMemoryEXT( const VULKAN_HPP_NAMESPACE::CopyImageToMemoryInfo * pCopyImageToMemoryInfo,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      copyImageToMemoryEXT( const VULKAN_HPP_NAMESPACE::CopyImageToMemoryInfo & copyImageToMemoryInfo,\n                            Dispatch const & d                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result copyImageToImageEXT( const VULKAN_HPP_NAMESPACE::CopyImageToImageInfo * pCopyImageToImageInfo,\n                                                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      copyImageToImageEXT( const VULKAN_HPP_NAMESPACE::CopyImageToImageInfo & copyImageToImageInfo,\n                           Dispatch const & d                                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result transitionImageLayoutEXT( uint32_t                                                    transitionCount,\n                                                          const VULKAN_HPP_NAMESPACE::HostImageLayoutTransitionInfo * pTransitions,\n                                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      transitionImageLayoutEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::HostImageLayoutTransitionInfo> const & transitions,\n                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getImageSubresourceLayout2EXT( VULKAN_HPP_NAMESPACE::Image                     image,\n                                        const VULKAN_HPP_NAMESPACE::ImageSubresource2 * pSubresource,\n                                        VULKAN_HPP_NAMESPACE::SubresourceLayout2 *      pLayout,\n                                        Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::SubresourceLayout2\n                         getImageSubresourceLayout2EXT( VULKAN_HPP_NAMESPACE::Image                     image,\n                                                        const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource,\n                                                        Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getImageSubresourceLayout2EXT( VULKAN_HPP_NAMESPACE::Image                     image,\n                                                        const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource,\n                                                        Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_map_memory2 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result mapMemory2KHR( const VULKAN_HPP_NAMESPACE::MemoryMapInfo * pMemoryMapInfo,\n                                               void **                                     ppData,\n                                               Dispatch const & d                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<void *>::type mapMemory2KHR( const VULKAN_HPP_NAMESPACE::MemoryMapInfo & memoryMapInfo,\n                                                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result unmapMemory2KHR( const VULKAN_HPP_NAMESPACE::MemoryUnmapInfo * pMemoryUnmapInfo,\n                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    typename ResultValueType<void>::type unmapMemory2KHR( const VULKAN_HPP_NAMESPACE::MemoryUnmapInfo & memoryUnmapInfo,\n                                                          Dispatch const & d                            VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_swapchain_maintenance1 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result releaseSwapchainImagesEXT( const VULKAN_HPP_NAMESPACE::ReleaseSwapchainImagesInfoEXT * pReleaseInfo,\n                                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    typename ResultValueType<void>::type releaseSwapchainImagesEXT( const VULKAN_HPP_NAMESPACE::ReleaseSwapchainImagesInfoEXT & releaseInfo,\n                                                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NV_device_generated_commands ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getGeneratedCommandsMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoNV * pInfo,\n                                                   VULKAN_HPP_NAMESPACE::MemoryRequirements2 *                             pMemoryRequirements,\n                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2\n                         getGeneratedCommandsMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoNV & info,\n                                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getGeneratedCommandsMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoNV & info,\n                                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createIndirectCommandsLayoutNV( const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoNV * pCreateInfo,\n                                                                const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                pAllocator,\n                                                                VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV *                 pIndirectCommandsLayout,\n                                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV>::type\n      createIndirectCommandsLayoutNV( const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoNV &    createInfo,\n                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                      Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV, Dispatch>>::type\n      createIndirectCommandsLayoutNVUnique( const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoNV &    createInfo,\n                                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyIndirectCommandsLayoutNV( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV    indirectCommandsLayout,\n                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyIndirectCommandsLayoutNV( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV indirectCommandsLayout VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator   VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV    indirectCommandsLayout,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV                      indirectCommandsLayout,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_private_data ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createPrivateDataSlotEXT( const VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo * pCreateInfo,\n                                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks *       pAllocator,\n                                                          VULKAN_HPP_NAMESPACE::PrivateDataSlot *                 pPrivateDataSlot,\n                                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::PrivateDataSlot>::type\n      createPrivateDataSlotEXT( const VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo &             createInfo,\n                                Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::PrivateDataSlot, Dispatch>>::type\n      createPrivateDataSlotEXTUnique( const VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo &             createInfo,\n                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                      Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyPrivateDataSlotEXT( VULKAN_HPP_NAMESPACE::PrivateDataSlot             privateDataSlot,\n                                    const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                    Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyPrivateDataSlotEXT( VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot               VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result setPrivateDataEXT( VULKAN_HPP_NAMESPACE::ObjectType      objectType,\n                                                   uint64_t                              objectHandle,\n                                                   VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,\n                                                   uint64_t                              data,\n                                                   Dispatch const & d                    VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    typename ResultValueType<void>::type setPrivateDataEXT( VULKAN_HPP_NAMESPACE::ObjectType      objectType,\n                                                            uint64_t                              objectHandle,\n                                                            VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,\n                                                            uint64_t                              data,\n                                                            Dispatch const & d                    VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getPrivateDataEXT( VULKAN_HPP_NAMESPACE::ObjectType      objectType,\n                            uint64_t                              objectHandle,\n                            VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,\n                            uint64_t *                            pData,\n                            Dispatch const & d                    VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD uint64_t getPrivateDataEXT( VULKAN_HPP_NAMESPACE::ObjectType      objectType,\n                                                     uint64_t                              objectHandle,\n                                                     VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,\n                                                     Dispatch const & d                    VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_video_encode_queue ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result\n      getEncodedVideoSessionParametersKHR( const VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersGetInfoKHR * pVideoSessionParametersInfo,\n                                           VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR *  pFeedbackInfo,\n                                           size_t *                                                             pDataSize,\n                                           void *                                                               pData,\n                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Uint8_tAllocator                                                                               = std::allocator<uint8_t>,\n              typename Dispatch                                                                                       = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::pair<VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR, std::vector<uint8_t, Uint8_tAllocator>>>::type\n      getEncodedVideoSessionParametersKHR( const VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersGetInfoKHR & videoSessionParametersInfo,\n                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Uint8_tAllocator                                                                               = std::allocator<uint8_t>,\n              typename Dispatch                                                                                       = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::pair<VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR, std::vector<uint8_t, Uint8_tAllocator>>>::type\n      getEncodedVideoSessionParametersKHR( const VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersGetInfoKHR & videoSessionParametersInfo,\n                                           Uint8_tAllocator &                                                   uint8_tAllocator,\n                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename X,\n              typename Y,\n              typename... Z,\n              typename Uint8_tAllocator                                                                               = std::allocator<uint8_t>,\n              typename Dispatch                                                                                       = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::pair<VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>, std::vector<uint8_t, Uint8_tAllocator>>>::type\n      getEncodedVideoSessionParametersKHR( const VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersGetInfoKHR & videoSessionParametersInfo,\n                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename X,\n              typename Y,\n              typename... Z,\n              typename Uint8_tAllocator                                                                               = std::allocator<uint8_t>,\n              typename Dispatch                                                                                       = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::pair<VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>, std::vector<uint8_t, Uint8_tAllocator>>>::type\n      getEncodedVideoSessionParametersKHR( const VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersGetInfoKHR & videoSessionParametersInfo,\n                                           Uint8_tAllocator &                                                   uint8_tAllocator,\n                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n    //=== VK_NV_cuda_kernel_launch ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createCudaModuleNV( const VULKAN_HPP_NAMESPACE::CudaModuleCreateInfoNV * pCreateInfo,\n                                                    const VULKAN_HPP_NAMESPACE::AllocationCallbacks *    pAllocator,\n                                                    VULKAN_HPP_NAMESPACE::CudaModuleNV *                 pModule,\n                                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::CudaModuleNV>::type\n      createCudaModuleNV( const VULKAN_HPP_NAMESPACE::CudaModuleCreateInfoNV &                createInfo,\n                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                          Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::CudaModuleNV, Dispatch>>::type\n      createCudaModuleNVUnique( const VULKAN_HPP_NAMESPACE::CudaModuleCreateInfoNV &                createInfo,\n                                Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getCudaModuleCacheNV( VULKAN_HPP_NAMESPACE::CudaModuleNV module,\n                                                      size_t *                           pCacheSize,\n                                                      void *                             pCacheData,\n                                                      Dispatch const & d                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Uint8_tAllocator                                                                               = std::allocator<uint8_t>,\n              typename Dispatch                                                                                       = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<uint8_t, Uint8_tAllocator>>::type\n      getCudaModuleCacheNV( VULKAN_HPP_NAMESPACE::CudaModuleNV module, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Uint8_tAllocator                                                                               = std::allocator<uint8_t>,\n              typename Dispatch                                                                                       = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<uint8_t, Uint8_tAllocator>>::type getCudaModuleCacheNV(\n      VULKAN_HPP_NAMESPACE::CudaModuleNV module, Uint8_tAllocator & uint8_tAllocator, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createCudaFunctionNV( const VULKAN_HPP_NAMESPACE::CudaFunctionCreateInfoNV * pCreateInfo,\n                                                      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *      pAllocator,\n                                                      VULKAN_HPP_NAMESPACE::CudaFunctionNV *                 pFunction,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::CudaFunctionNV>::type\n      createCudaFunctionNV( const VULKAN_HPP_NAMESPACE::CudaFunctionCreateInfoNV &              createInfo,\n                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                            Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::CudaFunctionNV, Dispatch>>::type\n      createCudaFunctionNVUnique( const VULKAN_HPP_NAMESPACE::CudaFunctionCreateInfoNV &              createInfo,\n                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyCudaModuleNV( VULKAN_HPP_NAMESPACE::CudaModuleNV                module,\n                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                              Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyCudaModuleNV( VULKAN_HPP_NAMESPACE::CudaModuleNV                                  module,\n                              Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::CudaModuleNV                module,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::CudaModuleNV                                  module,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyCudaFunctionNV( VULKAN_HPP_NAMESPACE::CudaFunctionNV              function,\n                                const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyCudaFunctionNV( VULKAN_HPP_NAMESPACE::CudaFunctionNV                                function,\n                                Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::CudaFunctionNV              function,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::CudaFunctionNV                                function,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n    //=== VK_EXT_metal_objects ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void exportMetalObjectsEXT( VULKAN_HPP_NAMESPACE::ExportMetalObjectsInfoEXT * pMetalObjectsInfo,\n                                Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ExportMetalObjectsInfoEXT\n                         exportMetalObjectsEXT( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         exportMetalObjectsEXT( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_METAL_EXT*/\n\n    //=== VK_EXT_descriptor_buffer ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getDescriptorSetLayoutSizeEXT( VULKAN_HPP_NAMESPACE::DescriptorSetLayout layout,\n                                        VULKAN_HPP_NAMESPACE::DeviceSize *        pLayoutSizeInBytes,\n                                        Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceSize\n                         getDescriptorSetLayoutSizeEXT( VULKAN_HPP_NAMESPACE::DescriptorSetLayout layout,\n                                                        Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getDescriptorSetLayoutBindingOffsetEXT( VULKAN_HPP_NAMESPACE::DescriptorSetLayout layout,\n                                                 uint32_t                                  binding,\n                                                 VULKAN_HPP_NAMESPACE::DeviceSize *        pOffset,\n                                                 Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceSize\n                         getDescriptorSetLayoutBindingOffsetEXT( VULKAN_HPP_NAMESPACE::DescriptorSetLayout layout,\n                                                                 uint32_t                                  binding,\n                                                                 Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getDescriptorEXT( const VULKAN_HPP_NAMESPACE::DescriptorGetInfoEXT * pDescriptorInfo,\n                           size_t                                             dataSize,\n                           void *                                             pDescriptor,\n                           Dispatch const & d                                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getDescriptorEXT( const VULKAN_HPP_NAMESPACE::DescriptorGetInfoEXT & descriptorInfo,\n                           size_t                                             dataSize,\n                           void *                                             pDescriptor,\n                           Dispatch const & d                                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename DescriptorType, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD DescriptorType getDescriptorEXT( const VULKAN_HPP_NAMESPACE::DescriptorGetInfoEXT & descriptorInfo,\n                                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result\n      getBufferOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::BufferCaptureDescriptorDataInfoEXT * pInfo,\n                                               void *                                                           pData,\n                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename DataType, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<DataType>::type\n      getBufferOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::BufferCaptureDescriptorDataInfoEXT & info,\n                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getImageOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::ImageCaptureDescriptorDataInfoEXT * pInfo,\n                                                                        void *                                                          pData,\n                                                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename DataType, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<DataType>::type\n      getImageOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::ImageCaptureDescriptorDataInfoEXT & info,\n                                              Dispatch const & d                                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result\n      getImageViewOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::ImageViewCaptureDescriptorDataInfoEXT * pInfo,\n                                                  void *                                                              pData,\n                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename DataType, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<DataType>::type\n      getImageViewOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::ImageViewCaptureDescriptorDataInfoEXT & info,\n                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result\n      getSamplerOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::SamplerCaptureDescriptorDataInfoEXT * pInfo,\n                                                void *                                                            pData,\n                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename DataType, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<DataType>::type\n      getSamplerOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::SamplerCaptureDescriptorDataInfoEXT & info,\n                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result\n      getAccelerationStructureOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::AccelerationStructureCaptureDescriptorDataInfoEXT * pInfo,\n                                                              void *                                                                          pData,\n                                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename DataType, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<DataType>::type\n      getAccelerationStructureOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::AccelerationStructureCaptureDescriptorDataInfoEXT & info,\n                                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_device_fault ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getFaultInfoEXT( VULKAN_HPP_NAMESPACE::DeviceFaultCountsEXT * pFaultCounts,\n                                                 VULKAN_HPP_NAMESPACE::DeviceFaultInfoEXT *   pFaultInfo,\n                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n    //=== VK_FUCHSIA_external_memory ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getMemoryZirconHandleFUCHSIA( const VULKAN_HPP_NAMESPACE::MemoryGetZirconHandleInfoFUCHSIA * pGetZirconHandleInfo,\n                                                              zx_handle_t *                                                  pZirconHandle,\n                                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<zx_handle_t>::type\n      getMemoryZirconHandleFUCHSIA( const VULKAN_HPP_NAMESPACE::MemoryGetZirconHandleInfoFUCHSIA & getZirconHandleInfo,\n                                    Dispatch const & d                                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result\n      getMemoryZirconHandlePropertiesFUCHSIA( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits      handleType,\n                                              zx_handle_t                                                 zirconHandle,\n                                              VULKAN_HPP_NAMESPACE::MemoryZirconHandlePropertiesFUCHSIA * pMemoryZirconHandleProperties,\n                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::MemoryZirconHandlePropertiesFUCHSIA>::type\n      getMemoryZirconHandlePropertiesFUCHSIA( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType,\n                                              zx_handle_t                                            zirconHandle,\n                                              Dispatch const & d                                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n    //=== VK_FUCHSIA_external_semaphore ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result\n      importSemaphoreZirconHandleFUCHSIA( const VULKAN_HPP_NAMESPACE::ImportSemaphoreZirconHandleInfoFUCHSIA * pImportSemaphoreZirconHandleInfo,\n                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      importSemaphoreZirconHandleFUCHSIA( const VULKAN_HPP_NAMESPACE::ImportSemaphoreZirconHandleInfoFUCHSIA & importSemaphoreZirconHandleInfo,\n                                          Dispatch const & d                                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getSemaphoreZirconHandleFUCHSIA( const VULKAN_HPP_NAMESPACE::SemaphoreGetZirconHandleInfoFUCHSIA * pGetZirconHandleInfo,\n                                                                 zx_handle_t *                                                     pZirconHandle,\n                                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<zx_handle_t>::type\n      getSemaphoreZirconHandleFUCHSIA( const VULKAN_HPP_NAMESPACE::SemaphoreGetZirconHandleInfoFUCHSIA & getZirconHandleInfo,\n                                       Dispatch const & d                                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n    //=== VK_FUCHSIA_buffer_collection ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createBufferCollectionFUCHSIA( const VULKAN_HPP_NAMESPACE::BufferCollectionCreateInfoFUCHSIA * pCreateInfo,\n                                                               const VULKAN_HPP_NAMESPACE::AllocationCallbacks *               pAllocator,\n                                                               VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA *                 pCollection,\n                                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA>::type\n      createBufferCollectionFUCHSIA( const VULKAN_HPP_NAMESPACE::BufferCollectionCreateInfoFUCHSIA &     createInfo,\n                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                     Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA, Dispatch>>::type\n      createBufferCollectionFUCHSIAUnique( const VULKAN_HPP_NAMESPACE::BufferCollectionCreateInfoFUCHSIA &     createInfo,\n                                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                           Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result\n      setBufferCollectionImageConstraintsFUCHSIA( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA             collection,\n                                                  const VULKAN_HPP_NAMESPACE::ImageConstraintsInfoFUCHSIA * pImageConstraintsInfo,\n                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      setBufferCollectionImageConstraintsFUCHSIA( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA             collection,\n                                                  const VULKAN_HPP_NAMESPACE::ImageConstraintsInfoFUCHSIA & imageConstraintsInfo,\n                                                  Dispatch const & d                                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result\n      setBufferCollectionBufferConstraintsFUCHSIA( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA              collection,\n                                                   const VULKAN_HPP_NAMESPACE::BufferConstraintsInfoFUCHSIA * pBufferConstraintsInfo,\n                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      setBufferCollectionBufferConstraintsFUCHSIA( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA              collection,\n                                                   const VULKAN_HPP_NAMESPACE::BufferConstraintsInfoFUCHSIA & bufferConstraintsInfo,\n                                                   Dispatch const & d                                         VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyBufferCollectionFUCHSIA( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA     collection,\n                                         const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                         Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyBufferCollectionFUCHSIA( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA                       collection,\n                                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA     collection,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA                       collection,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getBufferCollectionPropertiesFUCHSIA( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA             collection,\n                                                                      VULKAN_HPP_NAMESPACE::BufferCollectionPropertiesFUCHSIA * pProperties,\n                                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::BufferCollectionPropertiesFUCHSIA>::type\n      getBufferCollectionPropertiesFUCHSIA( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA collection,\n                                            Dispatch const & d                            VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_FUCHSIA*/\n\n    //=== VK_HUAWEI_subpass_shading ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result\n      getSubpassShadingMaxWorkgroupSizeHUAWEI( VULKAN_HPP_NAMESPACE::RenderPass renderpass,\n                                               VULKAN_HPP_NAMESPACE::Extent2D * pMaxWorkgroupSize,\n                                               Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::Extent2D>::type\n      getSubpassShadingMaxWorkgroupSizeHUAWEI( VULKAN_HPP_NAMESPACE::RenderPass renderpass, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NV_external_memory_rdma ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getMemoryRemoteAddressNV( const VULKAN_HPP_NAMESPACE::MemoryGetRemoteAddressInfoNV * pMemoryGetRemoteAddressInfo,\n                                                          VULKAN_HPP_NAMESPACE::RemoteAddressNV *                    pAddress,\n                                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::RemoteAddressNV>::type\n      getMemoryRemoteAddressNV( const VULKAN_HPP_NAMESPACE::MemoryGetRemoteAddressInfoNV & memoryGetRemoteAddressInfo,\n                                Dispatch const & d                                         VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_pipeline_properties ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getPipelinePropertiesEXT( const VULKAN_HPP_NAMESPACE::PipelineInfoEXT * pPipelineInfo,\n                                                          VULKAN_HPP_NAMESPACE::BaseOutStructure *      pPipelineProperties,\n                                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::BaseOutStructure>::type\n      getPipelinePropertiesEXT( const VULKAN_HPP_NAMESPACE::PipelineInfoEXT & pipelineInfo, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_opacity_micromap ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createMicromapEXT( const VULKAN_HPP_NAMESPACE::MicromapCreateInfoEXT * pCreateInfo,\n                                                   const VULKAN_HPP_NAMESPACE::AllocationCallbacks *   pAllocator,\n                                                   VULKAN_HPP_NAMESPACE::MicromapEXT *                 pMicromap,\n                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::MicromapEXT>::type\n      createMicromapEXT( const VULKAN_HPP_NAMESPACE::MicromapCreateInfoEXT &                 createInfo,\n                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                         Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::MicromapEXT, Dispatch>>::type\n      createMicromapEXTUnique( const VULKAN_HPP_NAMESPACE::MicromapCreateInfoEXT &                 createInfo,\n                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                               Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyMicromapEXT( VULKAN_HPP_NAMESPACE::MicromapEXT                 micromap,\n                             const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                             Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyMicromapEXT( VULKAN_HPP_NAMESPACE::MicromapEXT micromap                          VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::MicromapEXT                 micromap,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::MicromapEXT                                   micromap,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result buildMicromapsEXT( VULKAN_HPP_NAMESPACE::DeferredOperationKHR         deferredOperation,\n                                                   uint32_t                                           infoCount,\n                                                   const VULKAN_HPP_NAMESPACE::MicromapBuildInfoEXT * pInfos,\n                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result\n                         buildMicromapsEXT( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                                                 deferredOperation,\n                                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MicromapBuildInfoEXT> const & infos,\n                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result copyMicromapEXT( VULKAN_HPP_NAMESPACE::DeferredOperationKHR        deferredOperation,\n                                                 const VULKAN_HPP_NAMESPACE::CopyMicromapInfoEXT * pInfo,\n                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result copyMicromapEXT( VULKAN_HPP_NAMESPACE::DeferredOperationKHR        deferredOperation,\n                                                                       const VULKAN_HPP_NAMESPACE::CopyMicromapInfoEXT & info,\n                                                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result copyMicromapToMemoryEXT( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                deferredOperation,\n                                                         const VULKAN_HPP_NAMESPACE::CopyMicromapToMemoryInfoEXT * pInfo,\n                                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result copyMicromapToMemoryEXT( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                deferredOperation,\n                                                                               const VULKAN_HPP_NAMESPACE::CopyMicromapToMemoryInfoEXT & info,\n                                                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result copyMemoryToMicromapEXT( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                deferredOperation,\n                                                         const VULKAN_HPP_NAMESPACE::CopyMemoryToMicromapInfoEXT * pInfo,\n                                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result copyMemoryToMicromapEXT( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                deferredOperation,\n                                                                               const VULKAN_HPP_NAMESPACE::CopyMemoryToMicromapInfoEXT & info,\n                                                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result writeMicromapsPropertiesEXT( uint32_t                                  micromapCount,\n                                                             const VULKAN_HPP_NAMESPACE::MicromapEXT * pMicromaps,\n                                                             VULKAN_HPP_NAMESPACE::QueryType           queryType,\n                                                             size_t                                    dataSize,\n                                                             void *                                    pData,\n                                                             size_t                                    stride,\n                                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename DataType,\n              typename DataTypeAllocator                                                                                = std::allocator<DataType>,\n              typename Dispatch                                                                                         = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename DataTypeAllocator::value_type, DataType>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<DataType, DataTypeAllocator>>::type\n      writeMicromapsPropertiesEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MicromapEXT> const & micromaps,\n                                   VULKAN_HPP_NAMESPACE::QueryType                                                   queryType,\n                                   size_t                                                                            dataSize,\n                                   size_t                                                                            stride,\n                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename DataType, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<DataType>::type\n      writeMicromapsPropertyEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MicromapEXT> const & micromaps,\n                                 VULKAN_HPP_NAMESPACE::QueryType                                                   queryType,\n                                 size_t                                                                            stride,\n                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getMicromapCompatibilityEXT( const VULKAN_HPP_NAMESPACE::MicromapVersionInfoEXT *          pVersionInfo,\n                                      VULKAN_HPP_NAMESPACE::AccelerationStructureCompatibilityKHR * pCompatibility,\n                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::AccelerationStructureCompatibilityKHR\n                         getMicromapCompatibilityEXT( const VULKAN_HPP_NAMESPACE::MicromapVersionInfoEXT & versionInfo,\n                                                      Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getMicromapBuildSizesEXT( VULKAN_HPP_NAMESPACE::AccelerationStructureBuildTypeKHR buildType,\n                                   const VULKAN_HPP_NAMESPACE::MicromapBuildInfoEXT *      pBuildInfo,\n                                   VULKAN_HPP_NAMESPACE::MicromapBuildSizesInfoEXT *       pSizeInfo,\n                                   Dispatch const & d                                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MicromapBuildSizesInfoEXT\n                         getMicromapBuildSizesEXT( VULKAN_HPP_NAMESPACE::AccelerationStructureBuildTypeKHR buildType,\n                                                   const VULKAN_HPP_NAMESPACE::MicromapBuildInfoEXT &      buildInfo,\n                                                   Dispatch const & d                                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_pageable_device_local_memory ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setMemoryPriorityEXT( VULKAN_HPP_NAMESPACE::DeviceMemory memory,\n                               float                              priority,\n                               Dispatch const & d                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    //=== VK_KHR_maintenance4 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getBufferMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements * pInfo,\n                                         VULKAN_HPP_NAMESPACE::MemoryRequirements2 *                  pMemoryRequirements,\n                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2\n                         getBufferMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements & info,\n                                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getBufferMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements & info,\n                                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getImageMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements * pInfo,\n                                        VULKAN_HPP_NAMESPACE::MemoryRequirements2 *                 pMemoryRequirements,\n                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2\n                         getImageMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info,\n                                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getImageMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info,\n                                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getImageSparseMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements * pInfo,\n                                              uint32_t *                                                  pSparseMemoryRequirementCount,\n                                              VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2 *      pSparseMemoryRequirements,\n                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename SparseImageMemoryRequirements2Allocator = std::allocator<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>,\n              typename Dispatch                                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename SparseImageMemoryRequirements2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator>\n                         getImageSparseMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info,\n                                                              Dispatch const & d                                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename SparseImageMemoryRequirements2Allocator = std::allocator<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>,\n              typename Dispatch                                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename SparseImageMemoryRequirements2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator>\n                         getImageSparseMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info,\n                                                              SparseImageMemoryRequirements2Allocator &                   sparseImageMemoryRequirements2Allocator,\n                                                              Dispatch const & d                                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_VALVE_descriptor_set_host_mapping ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getDescriptorSetLayoutHostMappingInfoVALVE( const VULKAN_HPP_NAMESPACE::DescriptorSetBindingReferenceVALVE * pBindingReference,\n                                                     VULKAN_HPP_NAMESPACE::DescriptorSetLayoutHostMappingInfoVALVE *  pHostMapping,\n                                                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DescriptorSetLayoutHostMappingInfoVALVE\n                         getDescriptorSetLayoutHostMappingInfoVALVE( const VULKAN_HPP_NAMESPACE::DescriptorSetBindingReferenceVALVE & bindingReference,\n                                                                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getDescriptorSetHostMappingVALVE( VULKAN_HPP_NAMESPACE::DescriptorSet descriptorSet,\n                                           void **                             ppData,\n                                           Dispatch const & d                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD void * getDescriptorSetHostMappingVALVE( VULKAN_HPP_NAMESPACE::DescriptorSet descriptorSet,\n                                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NV_device_generated_commands_compute ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getPipelineIndirectMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo * pCreateInfo,\n                                                  VULKAN_HPP_NAMESPACE::MemoryRequirements2 *             pMemoryRequirements,\n                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2\n                         getPipelineIndirectMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo & createInfo,\n                                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getPipelineIndirectMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo & createInfo,\n                                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    DeviceAddress getPipelineIndirectAddressNV( const VULKAN_HPP_NAMESPACE::PipelineIndirectDeviceAddressInfoNV * pInfo,\n                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NAMESPACE::DeviceAddress getPipelineIndirectAddressNV( const VULKAN_HPP_NAMESPACE::PipelineIndirectDeviceAddressInfoNV & info,\n                                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_shader_module_identifier ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getShaderModuleIdentifierEXT( VULKAN_HPP_NAMESPACE::ShaderModule                shaderModule,\n                                       VULKAN_HPP_NAMESPACE::ShaderModuleIdentifierEXT * pIdentifier,\n                                       Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ShaderModuleIdentifierEXT\n                         getShaderModuleIdentifierEXT( VULKAN_HPP_NAMESPACE::ShaderModule shaderModule,\n                                                       Dispatch const & d                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getShaderModuleCreateInfoIdentifierEXT( const VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo * pCreateInfo,\n                                                 VULKAN_HPP_NAMESPACE::ShaderModuleIdentifierEXT *    pIdentifier,\n                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ShaderModuleIdentifierEXT\n                         getShaderModuleCreateInfoIdentifierEXT( const VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo & createInfo,\n                                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NV_optical_flow ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createOpticalFlowSessionNV( const VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreateInfoNV * pCreateInfo,\n                                                            const VULKAN_HPP_NAMESPACE::AllocationCallbacks *            pAllocator,\n                                                            VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV *                 pSession,\n                                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV>::type\n      createOpticalFlowSessionNV( const VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreateInfoNV &        createInfo,\n                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV, Dispatch>>::type\n      createOpticalFlowSessionNVUnique( const VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreateInfoNV &        createInfo,\n                                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                        Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyOpticalFlowSessionNV( VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV        session,\n                                      const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                      Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyOpticalFlowSessionNV( VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV                          session,\n                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV        session,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV                          session,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result bindOpticalFlowSessionImageNV( VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV             session,\n                                                               VULKAN_HPP_NAMESPACE::OpticalFlowSessionBindingPointNV bindingPoint,\n                                                               VULKAN_HPP_NAMESPACE::ImageView                        view,\n                                                               VULKAN_HPP_NAMESPACE::ImageLayout                      layout,\n                                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      bindOpticalFlowSessionImageNV( VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV             session,\n                                     VULKAN_HPP_NAMESPACE::OpticalFlowSessionBindingPointNV bindingPoint,\n                                     VULKAN_HPP_NAMESPACE::ImageView                        view,\n                                     VULKAN_HPP_NAMESPACE::ImageLayout                      layout,\n                                     Dispatch const & d                                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    //=== VK_KHR_maintenance5 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getRenderingAreaGranularityKHR( const VULKAN_HPP_NAMESPACE::RenderingAreaInfo * pRenderingAreaInfo,\n                                         VULKAN_HPP_NAMESPACE::Extent2D *                pGranularity,\n                                         Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Extent2D\n                         getRenderingAreaGranularityKHR( const VULKAN_HPP_NAMESPACE::RenderingAreaInfo & renderingAreaInfo,\n                                                         Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getImageSubresourceLayoutKHR( const VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo * pInfo,\n                                       VULKAN_HPP_NAMESPACE::SubresourceLayout2 *               pLayout,\n                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::SubresourceLayout2\n                         getImageSubresourceLayoutKHR( const VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo & info,\n                                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getImageSubresourceLayoutKHR( const VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo & info,\n                                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getImageSubresourceLayout2KHR( VULKAN_HPP_NAMESPACE::Image                     image,\n                                        const VULKAN_HPP_NAMESPACE::ImageSubresource2 * pSubresource,\n                                        VULKAN_HPP_NAMESPACE::SubresourceLayout2 *      pLayout,\n                                        Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::SubresourceLayout2\n                         getImageSubresourceLayout2KHR( VULKAN_HPP_NAMESPACE::Image                     image,\n                                                        const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource,\n                                                        Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getImageSubresourceLayout2KHR( VULKAN_HPP_NAMESPACE::Image                     image,\n                                                        const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource,\n                                                        Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_AMD_anti_lag ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void antiLagUpdateAMD( const VULKAN_HPP_NAMESPACE::AntiLagDataAMD * pData,\n                           Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void antiLagUpdateAMD( const VULKAN_HPP_NAMESPACE::AntiLagDataAMD & data,\n                           Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_shader_object ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createShadersEXT( uint32_t                                          createInfoCount,\n                                                  const VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT * pCreateInfos,\n                                                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                                  VULKAN_HPP_NAMESPACE::ShaderEXT *                 pShaders,\n                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename ShaderEXTAllocator = std::allocator<VULKAN_HPP_NAMESPACE::ShaderEXT>,\n              typename Dispatch           = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename ShaderEXTAllocator::value_type, VULKAN_HPP_NAMESPACE::ShaderEXT>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<VULKAN_HPP_NAMESPACE::ShaderEXT, ShaderEXTAllocator>>\n                         createShadersEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT> const & createInfos,\n                                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                           Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename ShaderEXTAllocator = std::allocator<VULKAN_HPP_NAMESPACE::ShaderEXT>,\n              typename Dispatch           = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename ShaderEXTAllocator::value_type, VULKAN_HPP_NAMESPACE::ShaderEXT>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<VULKAN_HPP_NAMESPACE::ShaderEXT, ShaderEXTAllocator>>\n                         createShadersEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT> const & createInfos,\n                                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                 allocator,\n                                           ShaderEXTAllocator &                                                                      shaderEXTAllocator,\n                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD ResultValue<VULKAN_HPP_NAMESPACE::ShaderEXT>\n                         createShaderEXT( const VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT &                   createInfo,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                          Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename ShaderEXTAllocator        = std::allocator<UniqueHandle<VULKAN_HPP_NAMESPACE::ShaderEXT, Dispatch>>,\n              typename std::enable_if<std::is_same<typename ShaderEXTAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::ShaderEXT, Dispatch>>::value,\n                                      int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::ShaderEXT, Dispatch>, ShaderEXTAllocator>>\n                         createShadersEXTUnique( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT> const & createInfos,\n                                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                                 Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Dispatch                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename ShaderEXTAllocator        = std::allocator<UniqueHandle<VULKAN_HPP_NAMESPACE::ShaderEXT, Dispatch>>,\n              typename std::enable_if<std::is_same<typename ShaderEXTAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::ShaderEXT, Dispatch>>::value,\n                                      int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::ShaderEXT, Dispatch>, ShaderEXTAllocator>>\n                         createShadersEXTUnique( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT> const & createInfos,\n                                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                 allocator,\n                                                 ShaderEXTAllocator &                                                                      shaderEXTAllocator,\n                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD ResultValue<UniqueHandle<VULKAN_HPP_NAMESPACE::ShaderEXT, Dispatch>>\n                         createShaderEXTUnique( const VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT &                   createInfo,\n                                                Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                                Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyShaderEXT( VULKAN_HPP_NAMESPACE::ShaderEXT                   shader,\n                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                           Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyShaderEXT( VULKAN_HPP_NAMESPACE::ShaderEXT shader                              VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::ShaderEXT                   shader,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::ShaderEXT                                     shader,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getShaderBinaryDataEXT( VULKAN_HPP_NAMESPACE::ShaderEXT shader,\n                                                        size_t *                        pDataSize,\n                                                        void *                          pData,\n                                                        Dispatch const & d              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Uint8_tAllocator                                                                               = std::allocator<uint8_t>,\n              typename Dispatch                                                                                       = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<uint8_t, Uint8_tAllocator>>::type\n      getShaderBinaryDataEXT( VULKAN_HPP_NAMESPACE::ShaderEXT shader, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Uint8_tAllocator                                                                               = std::allocator<uint8_t>,\n              typename Dispatch                                                                                       = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<uint8_t, Uint8_tAllocator>>::type getShaderBinaryDataEXT(\n      VULKAN_HPP_NAMESPACE::ShaderEXT shader, Uint8_tAllocator & uint8_tAllocator, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_pipeline_binary ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createPipelineBinariesKHR( const VULKAN_HPP_NAMESPACE::PipelineBinaryCreateInfoKHR * pCreateInfo,\n                                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks *         pAllocator,\n                                                           VULKAN_HPP_NAMESPACE::PipelineBinaryHandlesInfoKHR *      pBinaries,\n                                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <\n      typename PipelineBinaryKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR>,\n      typename Dispatch                   = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename PipelineBinaryKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PipelineBinaryKHR>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR, PipelineBinaryKHRAllocator>>\n                         createPipelineBinariesKHR( const VULKAN_HPP_NAMESPACE::PipelineBinaryCreateInfoKHR &           createInfo,\n                                                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                                    Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <\n      typename PipelineBinaryKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR>,\n      typename Dispatch                   = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename PipelineBinaryKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PipelineBinaryKHR>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR, PipelineBinaryKHRAllocator>>\n                         createPipelineBinariesKHR( const VULKAN_HPP_NAMESPACE::PipelineBinaryCreateInfoKHR & createInfo,\n                                                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                    PipelineBinaryKHRAllocator &                              pipelineBinaryKHRAllocator,\n                                                    Dispatch const & d                                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch                   = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename PipelineBinaryKHRAllocator = std::allocator<UniqueHandle<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR, Dispatch>>,\n              typename std::enable_if<\n                std::is_same<typename PipelineBinaryKHRAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR, Dispatch>>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR, Dispatch>, PipelineBinaryKHRAllocator>>\n                         createPipelineBinariesKHRUnique( const VULKAN_HPP_NAMESPACE::PipelineBinaryCreateInfoKHR &           createInfo,\n                                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                                          Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Dispatch                   = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename PipelineBinaryKHRAllocator = std::allocator<UniqueHandle<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR, Dispatch>>,\n              typename std::enable_if<\n                std::is_same<typename PipelineBinaryKHRAllocator::value_type, UniqueHandle<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR, Dispatch>>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD ResultValue<std::vector<UniqueHandle<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR, Dispatch>, PipelineBinaryKHRAllocator>>\n                         createPipelineBinariesKHRUnique( const VULKAN_HPP_NAMESPACE::PipelineBinaryCreateInfoKHR & createInfo,\n                                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator,\n                                                          PipelineBinaryKHRAllocator &                              pipelineBinaryKHRAllocator,\n                                                          Dispatch const & d                                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyPipelineBinaryKHR( VULKAN_HPP_NAMESPACE::PipelineBinaryKHR           pipelineBinary,\n                                   const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                   Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyPipelineBinaryKHR( VULKAN_HPP_NAMESPACE::PipelineBinaryKHR pipelineBinary              VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::PipelineBinaryKHR           pipelineBinary,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::PipelineBinaryKHR                             pipelineBinary,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getPipelineKeyKHR( const VULKAN_HPP_NAMESPACE::PipelineCreateInfoKHR * pPipelineCreateInfo,\n                                                   VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR *        pPipelineKey,\n                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR>::type\n      getPipelineKeyKHR( Optional<const VULKAN_HPP_NAMESPACE::PipelineCreateInfoKHR> pipelineCreateInfo VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                         Dispatch const & d                                                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getPipelineBinaryDataKHR( const VULKAN_HPP_NAMESPACE::PipelineBinaryDataInfoKHR * pInfo,\n                                                          VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR *            pPipelineBinaryKey,\n                                                          size_t *                                                pPipelineBinaryDataSize,\n                                                          void *                                                  pPipelineBinaryData,\n                                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Uint8_tAllocator                                                                               = std::allocator<uint8_t>,\n              typename Dispatch                                                                                       = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::pair<VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR, std::vector<uint8_t, Uint8_tAllocator>>>::type\n      getPipelineBinaryDataKHR( const VULKAN_HPP_NAMESPACE::PipelineBinaryDataInfoKHR & info,\n                                Dispatch const & d                                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Uint8_tAllocator                                                                               = std::allocator<uint8_t>,\n              typename Dispatch                                                                                       = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename Uint8_tAllocator::value_type, uint8_t>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::pair<VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR, std::vector<uint8_t, Uint8_tAllocator>>>::type\n      getPipelineBinaryDataKHR( const VULKAN_HPP_NAMESPACE::PipelineBinaryDataInfoKHR & info,\n                                Uint8_tAllocator &                                      uint8_tAllocator,\n                                Dispatch const & d                                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    Result releaseCapturedPipelineDataKHR( const VULKAN_HPP_NAMESPACE::ReleaseCapturedPipelineDataInfoKHR * pInfo,\n                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                pAllocator,\n                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void releaseCapturedPipelineDataKHR( const VULKAN_HPP_NAMESPACE::ReleaseCapturedPipelineDataInfoKHR &    info,\n                                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_QCOM_tile_properties ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getFramebufferTilePropertiesQCOM( VULKAN_HPP_NAMESPACE::Framebuffer          framebuffer,\n                                                                  uint32_t *                                 pPropertiesCount,\n                                                                  VULKAN_HPP_NAMESPACE::TilePropertiesQCOM * pProperties,\n                                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <\n      typename TilePropertiesQCOMAllocator = std::allocator<VULKAN_HPP_NAMESPACE::TilePropertiesQCOM>,\n      typename Dispatch                    = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename TilePropertiesQCOMAllocator::value_type, VULKAN_HPP_NAMESPACE::TilePropertiesQCOM>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::TilePropertiesQCOM, TilePropertiesQCOMAllocator>>::type\n      getFramebufferTilePropertiesQCOM( VULKAN_HPP_NAMESPACE::Framebuffer framebuffer, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <\n      typename TilePropertiesQCOMAllocator = std::allocator<VULKAN_HPP_NAMESPACE::TilePropertiesQCOM>,\n      typename Dispatch                    = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename TilePropertiesQCOMAllocator::value_type, VULKAN_HPP_NAMESPACE::TilePropertiesQCOM>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::TilePropertiesQCOM, TilePropertiesQCOMAllocator>>::type\n      getFramebufferTilePropertiesQCOM( VULKAN_HPP_NAMESPACE::Framebuffer framebuffer,\n                                        TilePropertiesQCOMAllocator &     tilePropertiesQCOMAllocator,\n                                        Dispatch const & d                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    Result getDynamicRenderingTilePropertiesQCOM( const VULKAN_HPP_NAMESPACE::RenderingInfo * pRenderingInfo,\n                                                  VULKAN_HPP_NAMESPACE::TilePropertiesQCOM *  pProperties,\n                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::TilePropertiesQCOM\n                         getDynamicRenderingTilePropertiesQCOM( const VULKAN_HPP_NAMESPACE::RenderingInfo & renderingInfo,\n                                                                Dispatch const & d                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NV_cooperative_vector ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result convertCooperativeVectorMatrixNV( const VULKAN_HPP_NAMESPACE::ConvertCooperativeVectorMatrixInfoNV * pInfo,\n                                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result convertCooperativeVectorMatrixNV( const VULKAN_HPP_NAMESPACE::ConvertCooperativeVectorMatrixInfoNV & info,\n                                                                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NV_low_latency2 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result setLatencySleepModeNV( VULKAN_HPP_NAMESPACE::SwapchainKHR                   swapchain,\n                                                       const VULKAN_HPP_NAMESPACE::LatencySleepModeInfoNV * pSleepModeInfo,\n                                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    typename ResultValueType<void>::type setLatencySleepModeNV( VULKAN_HPP_NAMESPACE::SwapchainKHR                   swapchain,\n                                                                const VULKAN_HPP_NAMESPACE::LatencySleepModeInfoNV & sleepModeInfo,\n                                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    Result latencySleepNV( VULKAN_HPP_NAMESPACE::SwapchainKHR               swapchain,\n                           const VULKAN_HPP_NAMESPACE::LatencySleepInfoNV * pSleepInfo,\n                           Dispatch const & d                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void latencySleepNV( VULKAN_HPP_NAMESPACE::SwapchainKHR               swapchain,\n                         const VULKAN_HPP_NAMESPACE::LatencySleepInfoNV & sleepInfo,\n                         Dispatch const & d                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setLatencyMarkerNV( VULKAN_HPP_NAMESPACE::SwapchainKHR                   swapchain,\n                             const VULKAN_HPP_NAMESPACE::SetLatencyMarkerInfoNV * pLatencyMarkerInfo,\n                             Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void setLatencyMarkerNV( VULKAN_HPP_NAMESPACE::SwapchainKHR                   swapchain,\n                             const VULKAN_HPP_NAMESPACE::SetLatencyMarkerInfoNV & latencyMarkerInfo,\n                             Dispatch const & d                                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getLatencyTimingsNV( VULKAN_HPP_NAMESPACE::SwapchainKHR             swapchain,\n                              VULKAN_HPP_NAMESPACE::GetLatencyMarkerInfoNV * pLatencyMarkerInfo,\n                              Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <\n      typename LatencyTimingsFrameReportNVAllocator = std::allocator<VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV>,\n      typename Dispatch                             = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename LatencyTimingsFrameReportNVAllocator::value_type, VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV>::value,\n                              int>::type            = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV, LatencyTimingsFrameReportNVAllocator>\n                         getLatencyTimingsNV( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <\n      typename LatencyTimingsFrameReportNVAllocator = std::allocator<VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV>,\n      typename Dispatch                             = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename LatencyTimingsFrameReportNVAllocator::value_type, VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV>::value,\n                              int>::type            = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV, LatencyTimingsFrameReportNVAllocator>\n                         getLatencyTimingsNV( VULKAN_HPP_NAMESPACE::SwapchainKHR     swapchain,\n                                              LatencyTimingsFrameReportNVAllocator & latencyTimingsFrameReportNVAllocator,\n                                              Dispatch const & d                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n    //=== VK_QNX_external_memory_screen_buffer ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getScreenBufferPropertiesQNX( const struct _screen_buffer *                     buffer,\n                                                              VULKAN_HPP_NAMESPACE::ScreenBufferPropertiesQNX * pProperties,\n                                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::ScreenBufferPropertiesQNX>::type\n      getScreenBufferPropertiesQNX( const struct _screen_buffer & buffer, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>>::type\n      getScreenBufferPropertiesQNX( const struct _screen_buffer & buffer, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n    //=== VK_KHR_calibrated_timestamps ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getCalibratedTimestampsKHR( uint32_t                                                 timestampCount,\n                                                            const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR * pTimestampInfos,\n                                                            uint64_t *                                               pTimestamps,\n                                                            uint64_t *                                               pMaxDeviation,\n                                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Uint64_tAllocator                                                                                = std::allocator<uint64_t>,\n              typename Dispatch                                                                                         = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename Uint64_tAllocator::value_type, uint64_t>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::pair<std::vector<uint64_t, Uint64_tAllocator>, uint64_t>>::type\n      getCalibratedTimestampsKHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR> const & timestampInfos,\n                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Uint64_tAllocator                                                                                = std::allocator<uint64_t>,\n              typename Dispatch                                                                                         = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename Uint64_tAllocator::value_type, uint64_t>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::pair<std::vector<uint64_t, Uint64_tAllocator>, uint64_t>>::type\n      getCalibratedTimestampsKHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR> const & timestampInfos,\n                                  Uint64_tAllocator &                                                                              uint64_tAllocator,\n                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::pair<uint64_t, uint64_t>>::type\n      getCalibratedTimestampKHR( const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR & timestampInfo,\n                                 Dispatch const & d                                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NV_cluster_acceleration_structure ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getClusterAccelerationStructureBuildSizesNV( const VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureInputInfoNV * pInfo,\n                                                      VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR *        pSizeInfo,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR\n                         getClusterAccelerationStructureBuildSizesNV( const VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureInputInfoNV & info,\n                                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NV_partitioned_acceleration_structure ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getPartitionedAccelerationStructuresBuildSizesNV( const VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureInstancesInputNV * pInfo,\n                                                           VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR *                 pSizeInfo,\n                                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR\n                         getPartitionedAccelerationStructuresBuildSizesNV( const VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureInstancesInputNV & info,\n                                                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_device_generated_commands ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getGeneratedCommandsMemoryRequirementsEXT( const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoEXT * pInfo,\n                                                    VULKAN_HPP_NAMESPACE::MemoryRequirements2 *                              pMemoryRequirements,\n                                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2\n                         getGeneratedCommandsMemoryRequirementsEXT( const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoEXT & info,\n                                                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getGeneratedCommandsMemoryRequirementsEXT( const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoEXT & info,\n                                                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createIndirectCommandsLayoutEXT( const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoEXT * pCreateInfo,\n                                                                 const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                 pAllocator,\n                                                                 VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT *                 pIndirectCommandsLayout,\n                                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT>::type\n      createIndirectCommandsLayoutEXT( const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoEXT &   createInfo,\n                                       Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                       Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT, Dispatch>>::type\n      createIndirectCommandsLayoutEXTUnique( const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoEXT &   createInfo,\n                                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyIndirectCommandsLayoutEXT( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT   indirectCommandsLayout,\n                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyIndirectCommandsLayoutEXT( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT indirectCommandsLayout VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT   indirectCommandsLayout,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT                     indirectCommandsLayout,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createIndirectExecutionSetEXT( const VULKAN_HPP_NAMESPACE::IndirectExecutionSetCreateInfoEXT * pCreateInfo,\n                                                               const VULKAN_HPP_NAMESPACE::AllocationCallbacks *               pAllocator,\n                                                               VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT *                 pIndirectExecutionSet,\n                                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT>::type\n      createIndirectExecutionSetEXT( const VULKAN_HPP_NAMESPACE::IndirectExecutionSetCreateInfoEXT &     createInfo,\n                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                     Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT, Dispatch>>::type\n      createIndirectExecutionSetEXTUnique( const VULKAN_HPP_NAMESPACE::IndirectExecutionSetCreateInfoEXT &     createInfo,\n                                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                           Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyIndirectExecutionSetEXT( VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT     indirectExecutionSet,\n                                         const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                         Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyIndirectExecutionSetEXT( VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT indirectExecutionSet  VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT     indirectExecutionSet,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT                       indirectExecutionSet,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void updateIndirectExecutionSetPipelineEXT( VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT                      indirectExecutionSet,\n                                                uint32_t                                                           executionSetWriteCount,\n                                                const VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetPipelineEXT * pExecutionSetWrites,\n                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void updateIndirectExecutionSetPipelineEXT(\n      VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT                                                              indirectExecutionSet,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetPipelineEXT> const & executionSetWrites,\n      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void updateIndirectExecutionSetShaderEXT( VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT                    indirectExecutionSet,\n                                              uint32_t                                                         executionSetWriteCount,\n                                              const VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetShaderEXT * pExecutionSetWrites,\n                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void updateIndirectExecutionSetShaderEXT(\n      VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT                                                            indirectExecutionSet,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetShaderEXT> const & executionSetWrites,\n      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n    //=== VK_EXT_external_memory_metal ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getMemoryMetalHandleEXT( const VULKAN_HPP_NAMESPACE::MemoryGetMetalHandleInfoEXT * pGetMetalHandleInfo,\n                                                         void **                                                   pHandle,\n                                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<void *>::type\n      getMemoryMetalHandleEXT( const VULKAN_HPP_NAMESPACE::MemoryGetMetalHandleInfoEXT & getMetalHandleInfo,\n                               Dispatch const & d                                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getMemoryMetalHandlePropertiesEXT( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType,\n                                                                   const void *                                           pHandle,\n                                                                   VULKAN_HPP_NAMESPACE::MemoryMetalHandlePropertiesEXT * pMemoryMetalHandleProperties,\n                                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename HandleType, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::MemoryMetalHandlePropertiesEXT>::type\n      getMemoryMetalHandlePropertiesEXT( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType,\n                                         HandleType const &                                     handle,\n                                         Dispatch const & d                                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_METAL_EXT*/\n\n    operator VkDevice() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_device;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_device != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_device == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkDevice m_device = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eDevice>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Device;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDevice>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Device;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkDevice, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Device;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::Device>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class DisplayModeKHR\n  {\n  public:\n    using CType      = VkDisplayModeKHR;\n    using NativeType = VkDisplayModeKHR;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDisplayModeKHR;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDisplayModeKHR;\n\n  public:\n    DisplayModeKHR() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    DisplayModeKHR( DisplayModeKHR const & rhs )             = default;\n    DisplayModeKHR & operator=( DisplayModeKHR const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    DisplayModeKHR( DisplayModeKHR && rhs )             = default;\n    DisplayModeKHR & operator=( DisplayModeKHR && rhs ) = default;\n#else\n    DisplayModeKHR( DisplayModeKHR && rhs ) VULKAN_HPP_NOEXCEPT : m_displayModeKHR( VULKAN_HPP_NAMESPACE::exchange( rhs.m_displayModeKHR, {} ) ) {}\n\n    DisplayModeKHR & operator=( DisplayModeKHR && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_displayModeKHR = VULKAN_HPP_NAMESPACE::exchange( rhs.m_displayModeKHR, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR DisplayModeKHR( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT DisplayModeKHR( VkDisplayModeKHR displayModeKHR ) VULKAN_HPP_NOEXCEPT : m_displayModeKHR( displayModeKHR ) {}\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n    DisplayModeKHR & operator=( VkDisplayModeKHR displayModeKHR ) VULKAN_HPP_NOEXCEPT\n    {\n      m_displayModeKHR = displayModeKHR;\n      return *this;\n    }\n#endif\n\n    DisplayModeKHR & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_displayModeKHR = {};\n      return *this;\n    }\n\n    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkDisplayModeKHR() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_displayModeKHR;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_displayModeKHR != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_displayModeKHR == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkDisplayModeKHR m_displayModeKHR = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eDisplayModeKHR>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DisplayModeKHR;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDisplayModeKHR>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DisplayModeKHR;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkDisplayModeKHR, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::DisplayModeKHR;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::DisplayModeKHR>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class PhysicalDevice\n  {\n  public:\n    using CType      = VkPhysicalDevice;\n    using NativeType = VkPhysicalDevice;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::ePhysicalDevice;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePhysicalDevice;\n\n  public:\n    PhysicalDevice() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    PhysicalDevice( PhysicalDevice const & rhs )             = default;\n    PhysicalDevice & operator=( PhysicalDevice const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    PhysicalDevice( PhysicalDevice && rhs )             = default;\n    PhysicalDevice & operator=( PhysicalDevice && rhs ) = default;\n#else\n    PhysicalDevice( PhysicalDevice && rhs ) VULKAN_HPP_NOEXCEPT : m_physicalDevice( VULKAN_HPP_NAMESPACE::exchange( rhs.m_physicalDevice, {} ) ) {}\n\n    PhysicalDevice & operator=( PhysicalDevice && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_physicalDevice = VULKAN_HPP_NAMESPACE::exchange( rhs.m_physicalDevice, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR PhysicalDevice( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    PhysicalDevice( VkPhysicalDevice physicalDevice ) VULKAN_HPP_NOEXCEPT : m_physicalDevice( physicalDevice ) {}\n\n    PhysicalDevice & operator=( VkPhysicalDevice physicalDevice ) VULKAN_HPP_NOEXCEPT\n    {\n      m_physicalDevice = physicalDevice;\n      return *this;\n    }\n\n    PhysicalDevice & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_physicalDevice = {};\n      return *this;\n    }\n\n    //=== VK_VERSION_1_0 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getFeatures( VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures * pFeatures,\n                      Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures\n                         getFeatures( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getFormatProperties( VULKAN_HPP_NAMESPACE::Format             format,\n                              VULKAN_HPP_NAMESPACE::FormatProperties * pFormatProperties,\n                              Dispatch const & d                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::FormatProperties\n      getFormatProperties( VULKAN_HPP_NAMESPACE::Format format, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getImageFormatProperties( VULKAN_HPP_NAMESPACE::Format                  format,\n                                                          VULKAN_HPP_NAMESPACE::ImageType               type,\n                                                          VULKAN_HPP_NAMESPACE::ImageTiling             tiling,\n                                                          VULKAN_HPP_NAMESPACE::ImageUsageFlags         usage,\n                                                          VULKAN_HPP_NAMESPACE::ImageCreateFlags        flags,\n                                                          VULKAN_HPP_NAMESPACE::ImageFormatProperties * pImageFormatProperties,\n                                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::ImageFormatProperties>::type\n      getImageFormatProperties( VULKAN_HPP_NAMESPACE::Format                 format,\n                                VULKAN_HPP_NAMESPACE::ImageType              type,\n                                VULKAN_HPP_NAMESPACE::ImageTiling            tiling,\n                                VULKAN_HPP_NAMESPACE::ImageUsageFlags        usage,\n                                VULKAN_HPP_NAMESPACE::ImageCreateFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                Dispatch const & d                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getProperties( VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties * pProperties,\n                        Dispatch const & d                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties\n                         getProperties( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getQueueFamilyProperties( uint32_t *                                    pQueueFamilyPropertyCount,\n                                   VULKAN_HPP_NAMESPACE::QueueFamilyProperties * pQueueFamilyProperties,\n                                   Dispatch const & d                            VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename QueueFamilyPropertiesAllocator = std::allocator<VULKAN_HPP_NAMESPACE::QueueFamilyProperties>,\n              typename Dispatch                       = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename QueueFamilyPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::QueueFamilyProperties>::value,\n                                      int>::type      = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties, QueueFamilyPropertiesAllocator>\n                         getQueueFamilyProperties( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename QueueFamilyPropertiesAllocator = std::allocator<VULKAN_HPP_NAMESPACE::QueueFamilyProperties>,\n              typename Dispatch                       = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename QueueFamilyPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::QueueFamilyProperties>::value,\n                                      int>::type      = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties, QueueFamilyPropertiesAllocator>\n                         getQueueFamilyProperties( QueueFamilyPropertiesAllocator & queueFamilyPropertiesAllocator,\n                                                   Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getMemoryProperties( VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties * pMemoryProperties,\n                              Dispatch const & d                                     VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties\n                         getMemoryProperties( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createDevice( const VULKAN_HPP_NAMESPACE::DeviceCreateInfo *    pCreateInfo,\n                                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                              VULKAN_HPP_NAMESPACE::Device *                    pDevice,\n                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::Device>::type\n      createDevice( const VULKAN_HPP_NAMESPACE::DeviceCreateInfo &                      createInfo,\n                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                    Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::Device, Dispatch>>::type\n      createDeviceUnique( const VULKAN_HPP_NAMESPACE::DeviceCreateInfo &                      createInfo,\n                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                          Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result enumerateDeviceExtensionProperties( const char *                                pLayerName,\n                                                                    uint32_t *                                  pPropertyCount,\n                                                                    VULKAN_HPP_NAMESPACE::ExtensionProperties * pProperties,\n                                                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <\n      typename ExtensionPropertiesAllocator = std::allocator<VULKAN_HPP_NAMESPACE::ExtensionProperties>,\n      typename Dispatch                     = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename ExtensionPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::ExtensionProperties>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties, ExtensionPropertiesAllocator>>::type\n      enumerateDeviceExtensionProperties( Optional<const std::string> layerName VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                          Dispatch const & d                    VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <\n      typename ExtensionPropertiesAllocator = std::allocator<VULKAN_HPP_NAMESPACE::ExtensionProperties>,\n      typename Dispatch                     = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename ExtensionPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::ExtensionProperties>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties, ExtensionPropertiesAllocator>>::type\n      enumerateDeviceExtensionProperties( Optional<const std::string>    layerName,\n                                          ExtensionPropertiesAllocator & extensionPropertiesAllocator,\n                                          Dispatch const & d             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result enumerateDeviceLayerProperties( uint32_t *                              pPropertyCount,\n                                                                VULKAN_HPP_NAMESPACE::LayerProperties * pProperties,\n                                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename LayerPropertiesAllocator = std::allocator<VULKAN_HPP_NAMESPACE::LayerProperties>,\n              typename Dispatch                 = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename LayerPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::LayerProperties>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::LayerProperties, LayerPropertiesAllocator>>::type\n      enumerateDeviceLayerProperties( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename LayerPropertiesAllocator = std::allocator<VULKAN_HPP_NAMESPACE::LayerProperties>,\n              typename Dispatch                 = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename LayerPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::LayerProperties>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::LayerProperties, LayerPropertiesAllocator>>::type\n      enumerateDeviceLayerProperties( LayerPropertiesAllocator & layerPropertiesAllocator, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getSparseImageFormatProperties( VULKAN_HPP_NAMESPACE::Format                        format,\n                                         VULKAN_HPP_NAMESPACE::ImageType                     type,\n                                         VULKAN_HPP_NAMESPACE::SampleCountFlagBits           samples,\n                                         VULKAN_HPP_NAMESPACE::ImageUsageFlags               usage,\n                                         VULKAN_HPP_NAMESPACE::ImageTiling                   tiling,\n                                         uint32_t *                                          pPropertyCount,\n                                         VULKAN_HPP_NAMESPACE::SparseImageFormatProperties * pProperties,\n                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <\n      typename SparseImageFormatPropertiesAllocator = std::allocator<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties>,\n      typename Dispatch                             = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename SparseImageFormatPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageFormatProperties>::value,\n                              int>::type            = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties, SparseImageFormatPropertiesAllocator>\n                         getSparseImageFormatProperties( VULKAN_HPP_NAMESPACE::Format              format,\n                                                         VULKAN_HPP_NAMESPACE::ImageType           type,\n                                                         VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples,\n                                                         VULKAN_HPP_NAMESPACE::ImageUsageFlags     usage,\n                                                         VULKAN_HPP_NAMESPACE::ImageTiling         tiling,\n                                                         Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <\n      typename SparseImageFormatPropertiesAllocator = std::allocator<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties>,\n      typename Dispatch                             = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename SparseImageFormatPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageFormatProperties>::value,\n                              int>::type            = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties, SparseImageFormatPropertiesAllocator>\n                         getSparseImageFormatProperties( VULKAN_HPP_NAMESPACE::Format              format,\n                                                         VULKAN_HPP_NAMESPACE::ImageType           type,\n                                                         VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples,\n                                                         VULKAN_HPP_NAMESPACE::ImageUsageFlags     usage,\n                                                         VULKAN_HPP_NAMESPACE::ImageTiling         tiling,\n                                                         SparseImageFormatPropertiesAllocator &    sparseImageFormatPropertiesAllocator,\n                                                         Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_VERSION_1_1 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getFeatures2( VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 * pFeatures,\n                       Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2\n                         getFeatures2( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getFeatures2( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getProperties2( VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 * pProperties,\n                         Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2\n                         getProperties2( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getProperties2( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getFormatProperties2( VULKAN_HPP_NAMESPACE::Format              format,\n                               VULKAN_HPP_NAMESPACE::FormatProperties2 * pFormatProperties,\n                               Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::FormatProperties2\n      getFormatProperties2( VULKAN_HPP_NAMESPACE::Format format, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n      getFormatProperties2( VULKAN_HPP_NAMESPACE::Format format, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getImageFormatProperties2( const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 * pImageFormatInfo,\n                                                           VULKAN_HPP_NAMESPACE::ImageFormatProperties2 *               pImageFormatProperties,\n                                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::ImageFormatProperties2>::type\n      getImageFormatProperties2( const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 & imageFormatInfo,\n                                 Dispatch const & d                                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>>::type\n      getImageFormatProperties2( const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 & imageFormatInfo,\n                                 Dispatch const & d                                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getQueueFamilyProperties2( uint32_t *                                     pQueueFamilyPropertyCount,\n                                    VULKAN_HPP_NAMESPACE::QueueFamilyProperties2 * pQueueFamilyProperties,\n                                    Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename QueueFamilyProperties2Allocator = std::allocator<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>,\n              typename Dispatch                        = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename QueueFamilyProperties2Allocator::value_type, VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>::value,\n                                      int>::type       = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2, QueueFamilyProperties2Allocator>\n                         getQueueFamilyProperties2( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename QueueFamilyProperties2Allocator = std::allocator<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>,\n              typename Dispatch                        = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename QueueFamilyProperties2Allocator::value_type, VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>::value,\n                                      int>::type       = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2, QueueFamilyProperties2Allocator>\n                         getQueueFamilyProperties2( QueueFamilyProperties2Allocator & queueFamilyProperties2Allocator,\n                                                    Dispatch const & d                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename StructureChain,\n              typename StructureChainAllocator = std::allocator<StructureChain>,\n              typename Dispatch                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename StructureChainAllocator::value_type, StructureChain>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD std::vector<StructureChain, StructureChainAllocator>\n                         getQueueFamilyProperties2( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename StructureChain,\n              typename StructureChainAllocator = std::allocator<StructureChain>,\n              typename Dispatch                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename StructureChainAllocator::value_type, StructureChain>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD std::vector<StructureChain, StructureChainAllocator>\n      getQueueFamilyProperties2( StructureChainAllocator & structureChainAllocator, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getMemoryProperties2( VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 * pMemoryProperties,\n                               Dispatch const & d                                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2\n                         getMemoryProperties2( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getMemoryProperties2( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getSparseImageFormatProperties2( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 * pFormatInfo,\n                                          uint32_t *                                                         pPropertyCount,\n                                          VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2 *               pProperties,\n                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename SparseImageFormatProperties2Allocator = std::allocator<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2>,\n              typename Dispatch                              = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename SparseImageFormatProperties2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2, SparseImageFormatProperties2Allocator>\n                         getSparseImageFormatProperties2( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 & formatInfo,\n                                                          Dispatch const & d                                                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename SparseImageFormatProperties2Allocator = std::allocator<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2>,\n              typename Dispatch                              = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename SparseImageFormatProperties2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2, SparseImageFormatProperties2Allocator>\n                         getSparseImageFormatProperties2( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 & formatInfo,\n                                                          SparseImageFormatProperties2Allocator &                            sparseImageFormatProperties2Allocator,\n                                                          Dispatch const & d                                                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getExternalBufferProperties( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo * pExternalBufferInfo,\n                                      VULKAN_HPP_NAMESPACE::ExternalBufferProperties *               pExternalBufferProperties,\n                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ExternalBufferProperties\n                         getExternalBufferProperties( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo & externalBufferInfo,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getExternalFenceProperties( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo * pExternalFenceInfo,\n                                     VULKAN_HPP_NAMESPACE::ExternalFenceProperties *               pExternalFenceProperties,\n                                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ExternalFenceProperties\n                         getExternalFenceProperties( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo & externalFenceInfo,\n                                                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getExternalSemaphoreProperties( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo * pExternalSemaphoreInfo,\n                                         VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties *               pExternalSemaphoreProperties,\n                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties\n                         getExternalSemaphoreProperties( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo & externalSemaphoreInfo,\n                                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_VERSION_1_3 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getToolProperties( uint32_t *                                           pToolCount,\n                                                   VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties * pToolProperties,\n                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename PhysicalDeviceToolPropertiesAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties>,\n              typename Dispatch                              = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename PhysicalDeviceToolPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties, PhysicalDeviceToolPropertiesAllocator>>::type\n      getToolProperties( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename PhysicalDeviceToolPropertiesAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties>,\n              typename Dispatch                              = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename PhysicalDeviceToolPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties, PhysicalDeviceToolPropertiesAllocator>>::type\n      getToolProperties( PhysicalDeviceToolPropertiesAllocator & physicalDeviceToolPropertiesAllocator,\n                         Dispatch const & d                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_surface ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getSurfaceSupportKHR( uint32_t                         queueFamilyIndex,\n                                                      VULKAN_HPP_NAMESPACE::SurfaceKHR surface,\n                                                      VULKAN_HPP_NAMESPACE::Bool32 *   pSupported,\n                                                      Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::Bool32>::type getSurfaceSupportKHR(\n      uint32_t queueFamilyIndex, VULKAN_HPP_NAMESPACE::SurfaceKHR surface, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getSurfaceCapabilitiesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR               surface,\n                                                           VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR * pSurfaceCapabilities,\n                                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR>::type\n      getSurfaceCapabilitiesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getSurfaceFormatsKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR         surface,\n                                                      uint32_t *                               pSurfaceFormatCount,\n                                                      VULKAN_HPP_NAMESPACE::SurfaceFormatKHR * pSurfaceFormats,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <\n      typename SurfaceFormatKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::SurfaceFormatKHR>,\n      typename Dispatch                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename SurfaceFormatKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::SurfaceFormatKHR>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormatKHR, SurfaceFormatKHRAllocator>>::type\n      getSurfaceFormatsKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                            Dispatch const & d                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <\n      typename SurfaceFormatKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::SurfaceFormatKHR>,\n      typename Dispatch                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename SurfaceFormatKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::SurfaceFormatKHR>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormatKHR, SurfaceFormatKHRAllocator>>::type\n      getSurfaceFormatsKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface,\n                            SurfaceFormatKHRAllocator &      surfaceFormatKHRAllocator,\n                            Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getSurfacePresentModesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR       surface,\n                                                           uint32_t *                             pPresentModeCount,\n                                                           VULKAN_HPP_NAMESPACE::PresentModeKHR * pPresentModes,\n                                                           Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename PresentModeKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PresentModeKHR>,\n              typename Dispatch                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename PresentModeKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PresentModeKHR>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR, PresentModeKHRAllocator>>::type\n      getSurfacePresentModesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                 Dispatch const & d                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename PresentModeKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PresentModeKHR>,\n              typename Dispatch                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename PresentModeKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PresentModeKHR>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR, PresentModeKHRAllocator>>::type\n      getSurfacePresentModesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface,\n                                 PresentModeKHRAllocator &        presentModeKHRAllocator,\n                                 Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_swapchain ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getPresentRectanglesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface,\n                                                         uint32_t *                       pRectCount,\n                                                         VULKAN_HPP_NAMESPACE::Rect2D *   pRects,\n                                                         Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Rect2DAllocator = std::allocator<VULKAN_HPP_NAMESPACE::Rect2D>,\n              typename Dispatch        = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename Rect2DAllocator::value_type, VULKAN_HPP_NAMESPACE::Rect2D>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::Rect2D, Rect2DAllocator>>::type\n      getPresentRectanglesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename Rect2DAllocator = std::allocator<VULKAN_HPP_NAMESPACE::Rect2D>,\n              typename Dispatch        = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename Rect2DAllocator::value_type, VULKAN_HPP_NAMESPACE::Rect2D>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::Rect2D, Rect2DAllocator>>::type getPresentRectanglesKHR(\n      VULKAN_HPP_NAMESPACE::SurfaceKHR surface, Rect2DAllocator & rect2DAllocator, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_display ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getDisplayPropertiesKHR( uint32_t *                                   pPropertyCount,\n                                                         VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR * pProperties,\n                                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename DisplayPropertiesKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR>,\n              typename Dispatch                      = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename DisplayPropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR>::value,\n                                      int>::type     = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR, DisplayPropertiesKHRAllocator>>::type\n      getDisplayPropertiesKHR( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename DisplayPropertiesKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR>,\n              typename Dispatch                      = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename DisplayPropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR>::value,\n                                      int>::type     = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR, DisplayPropertiesKHRAllocator>>::type\n      getDisplayPropertiesKHR( DisplayPropertiesKHRAllocator & displayPropertiesKHRAllocator,\n                               Dispatch const & d              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getDisplayPlanePropertiesKHR( uint32_t *                                        pPropertyCount,\n                                                              VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR * pProperties,\n                                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <\n      typename DisplayPlanePropertiesKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR>,\n      typename Dispatch                           = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename DisplayPlanePropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR>::value,\n                              int>::type          = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR, DisplayPlanePropertiesKHRAllocator>>::type\n      getDisplayPlanePropertiesKHR( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <\n      typename DisplayPlanePropertiesKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR>,\n      typename Dispatch                           = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename DisplayPlanePropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR>::value,\n                              int>::type          = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR, DisplayPlanePropertiesKHRAllocator>>::type\n      getDisplayPlanePropertiesKHR( DisplayPlanePropertiesKHRAllocator & displayPlanePropertiesKHRAllocator,\n                                    Dispatch const & d                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getDisplayPlaneSupportedDisplaysKHR( uint32_t                           planeIndex,\n                                                                     uint32_t *                         pDisplayCount,\n                                                                     VULKAN_HPP_NAMESPACE::DisplayKHR * pDisplays,\n                                                                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename DisplayKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::DisplayKHR>,\n              typename Dispatch            = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename DisplayKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayKHR>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayKHR, DisplayKHRAllocator>>::type\n      getDisplayPlaneSupportedDisplaysKHR( uint32_t planeIndex, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename DisplayKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::DisplayKHR>,\n              typename Dispatch            = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename DisplayKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayKHR>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayKHR, DisplayKHRAllocator>>::type getDisplayPlaneSupportedDisplaysKHR(\n      uint32_t planeIndex, DisplayKHRAllocator & displayKHRAllocator, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getDisplayModePropertiesKHR( VULKAN_HPP_NAMESPACE::DisplayKHR                 display,\n                                                             uint32_t *                                       pPropertyCount,\n                                                             VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR * pProperties,\n                                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <\n      typename DisplayModePropertiesKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR>,\n      typename Dispatch                          = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename DisplayModePropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR>::value,\n                              int>::type         = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR, DisplayModePropertiesKHRAllocator>>::type\n      getDisplayModePropertiesKHR( VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <\n      typename DisplayModePropertiesKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR>,\n      typename Dispatch                          = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename DisplayModePropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR>::value,\n                              int>::type         = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR, DisplayModePropertiesKHRAllocator>>::type\n      getDisplayModePropertiesKHR( VULKAN_HPP_NAMESPACE::DisplayKHR    display,\n                                   DisplayModePropertiesKHRAllocator & displayModePropertiesKHRAllocator,\n                                   Dispatch const & d                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createDisplayModeKHR( VULKAN_HPP_NAMESPACE::DisplayKHR                       display,\n                                                      const VULKAN_HPP_NAMESPACE::DisplayModeCreateInfoKHR * pCreateInfo,\n                                                      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *      pAllocator,\n                                                      VULKAN_HPP_NAMESPACE::DisplayModeKHR *                 pMode,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::DisplayModeKHR>::type\n      createDisplayModeKHR( VULKAN_HPP_NAMESPACE::DisplayKHR                                    display,\n                            const VULKAN_HPP_NAMESPACE::DisplayModeCreateInfoKHR &              createInfo,\n                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                            Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DisplayModeKHR, Dispatch>>::type\n      createDisplayModeKHRUnique( VULKAN_HPP_NAMESPACE::DisplayKHR                                    display,\n                                  const VULKAN_HPP_NAMESPACE::DisplayModeCreateInfoKHR &              createInfo,\n                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getDisplayPlaneCapabilitiesKHR( VULKAN_HPP_NAMESPACE::DisplayModeKHR                mode,\n                                                                uint32_t                                            planeIndex,\n                                                                VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR * pCapabilities,\n                                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR>::type getDisplayPlaneCapabilitiesKHR(\n      VULKAN_HPP_NAMESPACE::DisplayModeKHR mode, uint32_t planeIndex, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_USE_PLATFORM_XLIB_KHR )\n    //=== VK_KHR_xlib_surface ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    Bool32 getXlibPresentationSupportKHR( uint32_t           queueFamilyIndex,\n                                          Display *          dpy,\n                                          VisualID           visualID,\n                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NAMESPACE::Bool32 getXlibPresentationSupportKHR( uint32_t           queueFamilyIndex,\n                                                                Display &          dpy,\n                                                                VisualID           visualID,\n                                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_XLIB_KHR*/\n\n#if defined( VK_USE_PLATFORM_XCB_KHR )\n    //=== VK_KHR_xcb_surface ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    Bool32 getXcbPresentationSupportKHR( uint32_t           queueFamilyIndex,\n                                         xcb_connection_t * connection,\n                                         xcb_visualid_t     visual_id,\n                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NAMESPACE::Bool32 getXcbPresentationSupportKHR( uint32_t           queueFamilyIndex,\n                                                               xcb_connection_t & connection,\n                                                               xcb_visualid_t     visual_id,\n                                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_XCB_KHR*/\n\n#if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n    //=== VK_KHR_wayland_surface ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    Bool32 getWaylandPresentationSupportKHR( uint32_t            queueFamilyIndex,\n                                             struct wl_display * display,\n                                             Dispatch const & d  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NAMESPACE::Bool32 getWaylandPresentationSupportKHR( uint32_t            queueFamilyIndex,\n                                                                   struct wl_display & display,\n                                                                   Dispatch const & d  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_WAYLAND_KHR*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n    //=== VK_KHR_win32_surface ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    Bool32 getWin32PresentationSupportKHR( uint32_t queueFamilyIndex, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n    //=== VK_KHR_video_queue ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getVideoCapabilitiesKHR( const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR * pVideoProfile,\n                                                         VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR *      pCapabilities,\n                                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR>::type\n      getVideoCapabilitiesKHR( const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR & videoProfile,\n                               Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>>::type\n      getVideoCapabilitiesKHR( const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR & videoProfile,\n                               Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getVideoFormatPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR * pVideoFormatInfo,\n                                                             uint32_t *                                                     pVideoFormatPropertyCount,\n                                                             VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR *               pVideoFormatProperties,\n                                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <\n      typename VideoFormatPropertiesKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR>,\n      typename Dispatch                          = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename VideoFormatPropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR>::value,\n                              int>::type         = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR, VideoFormatPropertiesKHRAllocator>>::type\n      getVideoFormatPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR & videoFormatInfo,\n                                   Dispatch const & d                                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <\n      typename VideoFormatPropertiesKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR>,\n      typename Dispatch                          = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename VideoFormatPropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR>::value,\n                              int>::type         = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR, VideoFormatPropertiesKHRAllocator>>::type\n      getVideoFormatPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR & videoFormatInfo,\n                                   VideoFormatPropertiesKHRAllocator &                            videoFormatPropertiesKHRAllocator,\n                                   Dispatch const & d                                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename StructureChain,\n              typename StructureChainAllocator = std::allocator<StructureChain>,\n              typename Dispatch                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename StructureChainAllocator::value_type, StructureChain>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<StructureChain, StructureChainAllocator>>::type\n      getVideoFormatPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR & videoFormatInfo,\n                                   Dispatch const & d                                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename StructureChain,\n              typename StructureChainAllocator = std::allocator<StructureChain>,\n              typename Dispatch                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename StructureChainAllocator::value_type, StructureChain>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<StructureChain, StructureChainAllocator>>::type\n      getVideoFormatPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR & videoFormatInfo,\n                                   StructureChainAllocator &                                      structureChainAllocator,\n                                   Dispatch const & d                                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NV_external_memory_capabilities ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getExternalImageFormatPropertiesNV( VULKAN_HPP_NAMESPACE::Format                            format,\n                                                                    VULKAN_HPP_NAMESPACE::ImageType                         type,\n                                                                    VULKAN_HPP_NAMESPACE::ImageTiling                       tiling,\n                                                                    VULKAN_HPP_NAMESPACE::ImageUsageFlags                   usage,\n                                                                    VULKAN_HPP_NAMESPACE::ImageCreateFlags                  flags,\n                                                                    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV   externalHandleType,\n                                                                    VULKAN_HPP_NAMESPACE::ExternalImageFormatPropertiesNV * pExternalImageFormatProperties,\n                                                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::ExternalImageFormatPropertiesNV>::type\n      getExternalImageFormatPropertiesNV( VULKAN_HPP_NAMESPACE::Format                                             format,\n                                          VULKAN_HPP_NAMESPACE::ImageType                                          type,\n                                          VULKAN_HPP_NAMESPACE::ImageTiling                                        tiling,\n                                          VULKAN_HPP_NAMESPACE::ImageUsageFlags                                    usage,\n                                          VULKAN_HPP_NAMESPACE::ImageCreateFlags flags                             VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                          VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV externalHandleType VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_get_physical_device_properties2 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getFeatures2KHR( VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 * pFeatures,\n                          Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2\n                         getFeatures2KHR( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getFeatures2KHR( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getProperties2KHR( VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 * pProperties,\n                            Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2\n                         getProperties2KHR( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getProperties2KHR( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getFormatProperties2KHR( VULKAN_HPP_NAMESPACE::Format              format,\n                                  VULKAN_HPP_NAMESPACE::FormatProperties2 * pFormatProperties,\n                                  Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::FormatProperties2\n      getFormatProperties2KHR( VULKAN_HPP_NAMESPACE::Format format, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n      getFormatProperties2KHR( VULKAN_HPP_NAMESPACE::Format format, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getImageFormatProperties2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 * pImageFormatInfo,\n                                                              VULKAN_HPP_NAMESPACE::ImageFormatProperties2 *               pImageFormatProperties,\n                                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::ImageFormatProperties2>::type\n      getImageFormatProperties2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 & imageFormatInfo,\n                                    Dispatch const & d                                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>>::type\n      getImageFormatProperties2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 & imageFormatInfo,\n                                    Dispatch const & d                                           VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getQueueFamilyProperties2KHR( uint32_t *                                     pQueueFamilyPropertyCount,\n                                       VULKAN_HPP_NAMESPACE::QueueFamilyProperties2 * pQueueFamilyProperties,\n                                       Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename QueueFamilyProperties2Allocator = std::allocator<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>,\n              typename Dispatch                        = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename QueueFamilyProperties2Allocator::value_type, VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>::value,\n                                      int>::type       = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2, QueueFamilyProperties2Allocator>\n                         getQueueFamilyProperties2KHR( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename QueueFamilyProperties2Allocator = std::allocator<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>,\n              typename Dispatch                        = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename QueueFamilyProperties2Allocator::value_type, VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>::value,\n                                      int>::type       = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2, QueueFamilyProperties2Allocator>\n                         getQueueFamilyProperties2KHR( QueueFamilyProperties2Allocator & queueFamilyProperties2Allocator,\n                                                       Dispatch const & d                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename StructureChain,\n              typename StructureChainAllocator = std::allocator<StructureChain>,\n              typename Dispatch                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename StructureChainAllocator::value_type, StructureChain>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD std::vector<StructureChain, StructureChainAllocator>\n                         getQueueFamilyProperties2KHR( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename StructureChain,\n              typename StructureChainAllocator = std::allocator<StructureChain>,\n              typename Dispatch                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename StructureChainAllocator::value_type, StructureChain>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD std::vector<StructureChain, StructureChainAllocator>\n      getQueueFamilyProperties2KHR( StructureChainAllocator & structureChainAllocator, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getMemoryProperties2KHR( VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 * pMemoryProperties,\n                                  Dispatch const & d                                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2\n                         getMemoryProperties2KHR( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                         getMemoryProperties2KHR( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getSparseImageFormatProperties2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 * pFormatInfo,\n                                             uint32_t *                                                         pPropertyCount,\n                                             VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2 *               pProperties,\n                                             Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename SparseImageFormatProperties2Allocator = std::allocator<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2>,\n              typename Dispatch                              = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename SparseImageFormatProperties2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2, SparseImageFormatProperties2Allocator>\n                         getSparseImageFormatProperties2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 & formatInfo,\n                                                             Dispatch const & d                                                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename SparseImageFormatProperties2Allocator = std::allocator<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2>,\n              typename Dispatch                              = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename SparseImageFormatProperties2Allocator::value_type, VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2, SparseImageFormatProperties2Allocator>\n                         getSparseImageFormatProperties2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 & formatInfo,\n                                                             SparseImageFormatProperties2Allocator &                            sparseImageFormatProperties2Allocator,\n                                                             Dispatch const & d                                                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_external_memory_capabilities ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getExternalBufferPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo * pExternalBufferInfo,\n                                         VULKAN_HPP_NAMESPACE::ExternalBufferProperties *               pExternalBufferProperties,\n                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ExternalBufferProperties\n                         getExternalBufferPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo & externalBufferInfo,\n                                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_external_semaphore_capabilities ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getExternalSemaphorePropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo * pExternalSemaphoreInfo,\n                                            VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties *               pExternalSemaphoreProperties,\n                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties\n                         getExternalSemaphorePropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo & externalSemaphoreInfo,\n                                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_direct_mode_display ===\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    Result releaseDisplayEXT( VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void releaseDisplayEXT( VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n#if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )\n    //=== VK_EXT_acquire_xlib_display ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result acquireXlibDisplayEXT( Display *                        dpy,\n                                                       VULKAN_HPP_NAMESPACE::DisplayKHR display,\n                                                       Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      acquireXlibDisplayEXT( Display & dpy, VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getRandROutputDisplayEXT( Display *                          dpy,\n                                                          RROutput                           rrOutput,\n                                                          VULKAN_HPP_NAMESPACE::DisplayKHR * pDisplay,\n                                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::DisplayKHR>::type\n      getRandROutputDisplayEXT( Display & dpy, RROutput rrOutput, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DisplayKHR, Dispatch>>::type\n      getRandROutputDisplayEXTUnique( Display & dpy, RROutput rrOutput, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/\n\n    //=== VK_EXT_display_surface_counter ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getSurfaceCapabilities2EXT( VULKAN_HPP_NAMESPACE::SurfaceKHR                surface,\n                                                            VULKAN_HPP_NAMESPACE::SurfaceCapabilities2EXT * pSurfaceCapabilities,\n                                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceCapabilities2EXT>::type\n      getSurfaceCapabilities2EXT( VULKAN_HPP_NAMESPACE::SurfaceKHR surface, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_external_fence_capabilities ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getExternalFencePropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo * pExternalFenceInfo,\n                                        VULKAN_HPP_NAMESPACE::ExternalFenceProperties *               pExternalFenceProperties,\n                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ExternalFenceProperties\n                         getExternalFencePropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo & externalFenceInfo,\n                                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_performance_query ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result\n      enumerateQueueFamilyPerformanceQueryCountersKHR( uint32_t                                                 queueFamilyIndex,\n                                                       uint32_t *                                               pCounterCount,\n                                                       VULKAN_HPP_NAMESPACE::PerformanceCounterKHR *            pCounters,\n                                                       VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR * pCounterDescriptions,\n                                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename PerformanceCounterKHRAllocator            = std::allocator<VULKAN_HPP_NAMESPACE::PerformanceCounterKHR>,\n              typename PerformanceCounterDescriptionKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR>,\n              typename Dispatch                                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename PerformanceCounterKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PerformanceCounterKHR>::value &&\n                  std::is_same<typename PerformanceCounterDescriptionKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::pair<std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterKHR, PerformanceCounterKHRAllocator>,\n                                         std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR, PerformanceCounterDescriptionKHRAllocator>>>::type\n      enumerateQueueFamilyPerformanceQueryCountersKHR( uint32_t queueFamilyIndex, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename PerformanceCounterKHRAllocator            = std::allocator<VULKAN_HPP_NAMESPACE::PerformanceCounterKHR>,\n              typename PerformanceCounterDescriptionKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR>,\n              typename Dispatch                                  = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename PerformanceCounterKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PerformanceCounterKHR>::value &&\n                  std::is_same<typename PerformanceCounterDescriptionKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::pair<std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterKHR, PerformanceCounterKHRAllocator>,\n                                         std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR, PerformanceCounterDescriptionKHRAllocator>>>::type\n      enumerateQueueFamilyPerformanceQueryCountersKHR( uint32_t                                    queueFamilyIndex,\n                                                       PerformanceCounterKHRAllocator &            performanceCounterKHRAllocator,\n                                                       PerformanceCounterDescriptionKHRAllocator & performanceCounterDescriptionKHRAllocator,\n                                                       Dispatch const & d                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getQueueFamilyPerformanceQueryPassesKHR( const VULKAN_HPP_NAMESPACE::QueryPoolPerformanceCreateInfoKHR * pPerformanceQueryCreateInfo,\n                                                  uint32_t *                                                      pNumPasses,\n                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD uint32_t\n      getQueueFamilyPerformanceQueryPassesKHR( const VULKAN_HPP_NAMESPACE::QueryPoolPerformanceCreateInfoKHR & performanceQueryCreateInfo,\n                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_get_surface_capabilities2 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getSurfaceCapabilities2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR * pSurfaceInfo,\n                                                            VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR *             pSurfaceCapabilities,\n                                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR>::type\n      getSurfaceCapabilities2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo,\n                                  Dispatch const & d                                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>>::type\n      getSurfaceCapabilities2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo,\n                                  Dispatch const & d                                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getSurfaceFormats2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR * pSurfaceInfo,\n                                                       uint32_t *                                                  pSurfaceFormatCount,\n                                                       VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR *                   pSurfaceFormats,\n                                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <\n      typename SurfaceFormat2KHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR>,\n      typename Dispatch                   = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename SurfaceFormat2KHRAllocator::value_type, VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR, SurfaceFormat2KHRAllocator>>::type\n      getSurfaceFormats2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo,\n                             Dispatch const & d                                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <\n      typename SurfaceFormat2KHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR>,\n      typename Dispatch                   = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename SurfaceFormat2KHRAllocator::value_type, VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR, SurfaceFormat2KHRAllocator>>::type\n      getSurfaceFormats2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo,\n                             SurfaceFormat2KHRAllocator &                                surfaceFormat2KHRAllocator,\n                             Dispatch const & d                                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename StructureChain,\n              typename StructureChainAllocator = std::allocator<StructureChain>,\n              typename Dispatch                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename StructureChainAllocator::value_type, StructureChain>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<StructureChain, StructureChainAllocator>>::type\n      getSurfaceFormats2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo,\n                             Dispatch const & d                                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename StructureChain,\n              typename StructureChainAllocator = std::allocator<StructureChain>,\n              typename Dispatch                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename StructureChainAllocator::value_type, StructureChain>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<StructureChain, StructureChainAllocator>>::type\n      getSurfaceFormats2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo,\n                             StructureChainAllocator &                                   structureChainAllocator,\n                             Dispatch const & d                                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_get_display_properties2 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getDisplayProperties2KHR( uint32_t *                                    pPropertyCount,\n                                                          VULKAN_HPP_NAMESPACE::DisplayProperties2KHR * pProperties,\n                                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename DisplayProperties2KHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::DisplayProperties2KHR>,\n              typename Dispatch                       = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename DisplayProperties2KHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayProperties2KHR>::value,\n                                      int>::type      = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayProperties2KHR, DisplayProperties2KHRAllocator>>::type\n      getDisplayProperties2KHR( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename DisplayProperties2KHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::DisplayProperties2KHR>,\n              typename Dispatch                       = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename DisplayProperties2KHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayProperties2KHR>::value,\n                                      int>::type      = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayProperties2KHR, DisplayProperties2KHRAllocator>>::type\n      getDisplayProperties2KHR( DisplayProperties2KHRAllocator & displayProperties2KHRAllocator,\n                                Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getDisplayPlaneProperties2KHR( uint32_t *                                         pPropertyCount,\n                                                               VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR * pProperties,\n                                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <\n      typename DisplayPlaneProperties2KHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR>,\n      typename Dispatch                            = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename DisplayPlaneProperties2KHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR>::value,\n                              int>::type           = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR, DisplayPlaneProperties2KHRAllocator>>::type\n      getDisplayPlaneProperties2KHR( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <\n      typename DisplayPlaneProperties2KHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR>,\n      typename Dispatch                            = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename DisplayPlaneProperties2KHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR>::value,\n                              int>::type           = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR, DisplayPlaneProperties2KHRAllocator>>::type\n      getDisplayPlaneProperties2KHR( DisplayPlaneProperties2KHRAllocator & displayPlaneProperties2KHRAllocator,\n                                     Dispatch const & d                    VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getDisplayModeProperties2KHR( VULKAN_HPP_NAMESPACE::DisplayKHR                  display,\n                                                              uint32_t *                                        pPropertyCount,\n                                                              VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR * pProperties,\n                                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <\n      typename DisplayModeProperties2KHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR>,\n      typename Dispatch                           = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename DisplayModeProperties2KHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR>::value,\n                              int>::type          = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR, DisplayModeProperties2KHRAllocator>>::type\n      getDisplayModeProperties2KHR( VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <\n      typename DisplayModeProperties2KHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR>,\n      typename Dispatch                           = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename DisplayModeProperties2KHRAllocator::value_type, VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR>::value,\n                              int>::type          = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR, DisplayModeProperties2KHRAllocator>>::type\n      getDisplayModeProperties2KHR( VULKAN_HPP_NAMESPACE::DisplayKHR     display,\n                                    DisplayModeProperties2KHRAllocator & displayModeProperties2KHRAllocator,\n                                    Dispatch const & d                   VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename StructureChain,\n              typename StructureChainAllocator = std::allocator<StructureChain>,\n              typename Dispatch                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename StructureChainAllocator::value_type, StructureChain>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<StructureChain, StructureChainAllocator>>::type\n      getDisplayModeProperties2KHR( VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename StructureChain,\n              typename StructureChainAllocator = std::allocator<StructureChain>,\n              typename Dispatch                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename StructureChainAllocator::value_type, StructureChain>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<StructureChain, StructureChainAllocator>>::type\n      getDisplayModeProperties2KHR( VULKAN_HPP_NAMESPACE::DisplayKHR display,\n                                    StructureChainAllocator &        structureChainAllocator,\n                                    Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getDisplayPlaneCapabilities2KHR( const VULKAN_HPP_NAMESPACE::DisplayPlaneInfo2KHR *   pDisplayPlaneInfo,\n                                                                 VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilities2KHR * pCapabilities,\n                                                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilities2KHR>::type\n      getDisplayPlaneCapabilities2KHR( const VULKAN_HPP_NAMESPACE::DisplayPlaneInfo2KHR & displayPlaneInfo,\n                                       Dispatch const & d                                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_sample_locations ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void getMultisamplePropertiesEXT( VULKAN_HPP_NAMESPACE::SampleCountFlagBits        samples,\n                                      VULKAN_HPP_NAMESPACE::MultisamplePropertiesEXT * pMultisampleProperties,\n                                      Dispatch const & d                               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MultisamplePropertiesEXT\n                         getMultisamplePropertiesEXT( VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples,\n                                                      Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_calibrated_timestamps ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getCalibrateableTimeDomainsEXT( uint32_t *                            pTimeDomainCount,\n                                                                VULKAN_HPP_NAMESPACE::TimeDomainKHR * pTimeDomains,\n                                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename TimeDomainKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::TimeDomainKHR>,\n              typename Dispatch               = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename TimeDomainKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::TimeDomainKHR>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::TimeDomainKHR, TimeDomainKHRAllocator>>::type\n      getCalibrateableTimeDomainsEXT( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename TimeDomainKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::TimeDomainKHR>,\n              typename Dispatch               = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename TimeDomainKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::TimeDomainKHR>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::TimeDomainKHR, TimeDomainKHRAllocator>>::type\n      getCalibrateableTimeDomainsEXT( TimeDomainKHRAllocator & timeDomainKHRAllocator, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_fragment_shading_rate ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getFragmentShadingRatesKHR( uint32_t *                                                   pFragmentShadingRateCount,\n                                                            VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR * pFragmentShadingRates,\n                                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename PhysicalDeviceFragmentShadingRateKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR>,\n              typename Dispatch                                      = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename PhysicalDeviceFragmentShadingRateKHRAllocator::value_type,\n                                                   VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR>::value,\n                                      int>::type                     = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR, PhysicalDeviceFragmentShadingRateKHRAllocator>>::type\n      getFragmentShadingRatesKHR( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename PhysicalDeviceFragmentShadingRateKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR>,\n              typename Dispatch                                      = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename PhysicalDeviceFragmentShadingRateKHRAllocator::value_type,\n                                                   VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR>::value,\n                                      int>::type                     = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR, PhysicalDeviceFragmentShadingRateKHRAllocator>>::type\n      getFragmentShadingRatesKHR( PhysicalDeviceFragmentShadingRateKHRAllocator & physicalDeviceFragmentShadingRateKHRAllocator,\n                                  Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_EXT_tooling_info ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getToolPropertiesEXT( uint32_t *                                           pToolCount,\n                                                      VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties * pToolProperties,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename PhysicalDeviceToolPropertiesAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties>,\n              typename Dispatch                              = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename PhysicalDeviceToolPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties, PhysicalDeviceToolPropertiesAllocator>>::type\n      getToolPropertiesEXT( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename PhysicalDeviceToolPropertiesAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties>,\n              typename Dispatch                              = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename PhysicalDeviceToolPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties, PhysicalDeviceToolPropertiesAllocator>>::type\n      getToolPropertiesEXT( PhysicalDeviceToolPropertiesAllocator & physicalDeviceToolPropertiesAllocator,\n                            Dispatch const & d                      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NV_cooperative_matrix ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getCooperativeMatrixPropertiesNV( uint32_t *                                            pPropertyCount,\n                                                                  VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV * pProperties,\n                                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename CooperativeMatrixPropertiesNVAllocator = std::allocator<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV>,\n              typename Dispatch                               = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename CooperativeMatrixPropertiesNVAllocator::value_type, VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV, CooperativeMatrixPropertiesNVAllocator>>::type\n      getCooperativeMatrixPropertiesNV( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename CooperativeMatrixPropertiesNVAllocator = std::allocator<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV>,\n              typename Dispatch                               = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename CooperativeMatrixPropertiesNVAllocator::value_type, VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV, CooperativeMatrixPropertiesNVAllocator>>::type\n      getCooperativeMatrixPropertiesNV( CooperativeMatrixPropertiesNVAllocator & cooperativeMatrixPropertiesNVAllocator,\n                                        Dispatch const & d                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NV_coverage_reduction_mode ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result\n      getSupportedFramebufferMixedSamplesCombinationsNV( uint32_t *                                                   pCombinationCount,\n                                                         VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV * pCombinations,\n                                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename FramebufferMixedSamplesCombinationNVAllocator = std::allocator<VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV>,\n              typename Dispatch                                      = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename FramebufferMixedSamplesCombinationNVAllocator::value_type,\n                                                   VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV>::value,\n                                      int>::type                     = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV, FramebufferMixedSamplesCombinationNVAllocator>>::type\n      getSupportedFramebufferMixedSamplesCombinationsNV( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename FramebufferMixedSamplesCombinationNVAllocator = std::allocator<VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV>,\n              typename Dispatch                                      = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename FramebufferMixedSamplesCombinationNVAllocator::value_type,\n                                                   VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV>::value,\n                                      int>::type                     = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV, FramebufferMixedSamplesCombinationNVAllocator>>::type\n      getSupportedFramebufferMixedSamplesCombinationsNV( FramebufferMixedSamplesCombinationNVAllocator & framebufferMixedSamplesCombinationNVAllocator,\n                                                         Dispatch const & d                              VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n    //=== VK_EXT_full_screen_exclusive ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getSurfacePresentModes2EXT( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR * pSurfaceInfo,\n                                                            uint32_t *                                                  pPresentModeCount,\n                                                            VULKAN_HPP_NAMESPACE::PresentModeKHR *                      pPresentModes,\n                                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename PresentModeKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PresentModeKHR>,\n              typename Dispatch                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename PresentModeKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PresentModeKHR>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR, PresentModeKHRAllocator>>::type\n      getSurfacePresentModes2EXT( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo,\n                                  Dispatch const & d                                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename PresentModeKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PresentModeKHR>,\n              typename Dispatch                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename PresentModeKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::PresentModeKHR>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR, PresentModeKHRAllocator>>::type\n      getSurfacePresentModes2EXT( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo,\n                                  PresentModeKHRAllocator &                                   presentModeKHRAllocator,\n                                  Dispatch const & d                                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_WIN32_KHR*/\n\n    //=== VK_EXT_acquire_drm_display ===\n\n#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result acquireDrmDisplayEXT( int32_t                          drmFd,\n                                                      VULKAN_HPP_NAMESPACE::DisplayKHR display,\n                                                      Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    typename ResultValueType<void>::type\n      acquireDrmDisplayEXT( int32_t drmFd, VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getDrmDisplayEXT( int32_t                            drmFd,\n                                                  uint32_t                           connectorId,\n                                                  VULKAN_HPP_NAMESPACE::DisplayKHR * display,\n                                                  Dispatch const & d                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::DisplayKHR>::type\n      getDrmDisplayEXT( int32_t drmFd, uint32_t connectorId, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DisplayKHR, Dispatch>>::type\n      getDrmDisplayEXTUnique( int32_t drmFd, uint32_t connectorId, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_video_encode_queue ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result\n      getVideoEncodeQualityLevelPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeQualityLevelInfoKHR * pQualityLevelInfo,\n                                               VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelPropertiesKHR *               pQualityLevelProperties,\n                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelPropertiesKHR>::type\n      getVideoEncodeQualityLevelPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeQualityLevelInfoKHR & qualityLevelInfo,\n                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename X, typename Y, typename... Z, typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>>::type\n      getVideoEncodeQualityLevelPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeQualityLevelInfoKHR & qualityLevelInfo,\n                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n    //=== VK_NV_acquire_winrt_display ===\n\n#  ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result acquireWinrtDisplayNV( VULKAN_HPP_NAMESPACE::DisplayKHR display,\n                                                       Dispatch const & d               VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  else\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS typename ResultValueType<void>::type\n      acquireWinrtDisplayNV( VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getWinrtDisplayNV( uint32_t                           deviceRelativeId,\n                                                   VULKAN_HPP_NAMESPACE::DisplayKHR * pDisplay,\n                                                   Dispatch const & d                 VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::DisplayKHR>::type\n      getWinrtDisplayNV( uint32_t deviceRelativeId, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DisplayKHR, Dispatch>>::type\n      getWinrtDisplayNVUnique( uint32_t deviceRelativeId, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n    //=== VK_EXT_directfb_surface ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    Bool32 getDirectFBPresentationSupportEXT( uint32_t           queueFamilyIndex,\n                                              IDirectFB *        dfb,\n                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NAMESPACE::Bool32 getDirectFBPresentationSupportEXT( uint32_t           queueFamilyIndex,\n                                                                    IDirectFB &        dfb,\n                                                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n    //=== VK_QNX_screen_surface ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    Bool32 getScreenPresentationSupportQNX( uint32_t                queueFamilyIndex,\n                                            struct _screen_window * window,\n                                            Dispatch const & d      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NAMESPACE::Bool32 getScreenPresentationSupportQNX( uint32_t                queueFamilyIndex,\n                                                                  struct _screen_window & window,\n                                                                  Dispatch const & d      VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif   /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n    //=== VK_NV_optical_flow ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getOpticalFlowImageFormatsNV( const VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatInfoNV * pOpticalFlowImageFormatInfo,\n                                                              uint32_t *                                                 pFormatCount,\n                                                              VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatPropertiesNV * pImageFormatProperties,\n                                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename OpticalFlowImageFormatPropertiesNVAllocator = std::allocator<VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatPropertiesNV>,\n              typename Dispatch                                    = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename OpticalFlowImageFormatPropertiesNVAllocator::value_type, VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatPropertiesNV>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatPropertiesNV, OpticalFlowImageFormatPropertiesNVAllocator>>::type\n      getOpticalFlowImageFormatsNV( const VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatInfoNV & opticalFlowImageFormatInfo,\n                                    Dispatch const & d                                         VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename OpticalFlowImageFormatPropertiesNVAllocator = std::allocator<VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatPropertiesNV>,\n              typename Dispatch                                    = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename OpticalFlowImageFormatPropertiesNVAllocator::value_type, VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatPropertiesNV>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatPropertiesNV, OpticalFlowImageFormatPropertiesNVAllocator>>::type\n      getOpticalFlowImageFormatsNV( const VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatInfoNV & opticalFlowImageFormatInfo,\n                                    OpticalFlowImageFormatPropertiesNVAllocator &              opticalFlowImageFormatPropertiesNVAllocator,\n                                    Dispatch const & d                                         VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NV_cooperative_vector ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getCooperativeVectorPropertiesNV( uint32_t *                                            pPropertyCount,\n                                                                  VULKAN_HPP_NAMESPACE::CooperativeVectorPropertiesNV * pProperties,\n                                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename CooperativeVectorPropertiesNVAllocator = std::allocator<VULKAN_HPP_NAMESPACE::CooperativeVectorPropertiesNV>,\n              typename Dispatch                               = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename CooperativeVectorPropertiesNVAllocator::value_type, VULKAN_HPP_NAMESPACE::CooperativeVectorPropertiesNV>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::CooperativeVectorPropertiesNV, CooperativeVectorPropertiesNVAllocator>>::type\n      getCooperativeVectorPropertiesNV( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename CooperativeVectorPropertiesNVAllocator = std::allocator<VULKAN_HPP_NAMESPACE::CooperativeVectorPropertiesNV>,\n              typename Dispatch                               = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename CooperativeVectorPropertiesNVAllocator::value_type, VULKAN_HPP_NAMESPACE::CooperativeVectorPropertiesNV>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::CooperativeVectorPropertiesNV, CooperativeVectorPropertiesNVAllocator>>::type\n      getCooperativeVectorPropertiesNV( CooperativeVectorPropertiesNVAllocator & cooperativeVectorPropertiesNVAllocator,\n                                        Dispatch const & d                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_cooperative_matrix ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getCooperativeMatrixPropertiesKHR( uint32_t *                                             pPropertyCount,\n                                                                   VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesKHR * pProperties,\n                                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename CooperativeMatrixPropertiesKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesKHR>,\n              typename Dispatch                                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename CooperativeMatrixPropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesKHR>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesKHR, CooperativeMatrixPropertiesKHRAllocator>>::type\n      getCooperativeMatrixPropertiesKHR( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename CooperativeMatrixPropertiesKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesKHR>,\n              typename Dispatch                                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename CooperativeMatrixPropertiesKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesKHR>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesKHR, CooperativeMatrixPropertiesKHRAllocator>>::type\n      getCooperativeMatrixPropertiesKHR( CooperativeMatrixPropertiesKHRAllocator & cooperativeMatrixPropertiesKHRAllocator,\n                                         Dispatch const & d                        VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_calibrated_timestamps ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result getCalibrateableTimeDomainsKHR( uint32_t *                            pTimeDomainCount,\n                                                                VULKAN_HPP_NAMESPACE::TimeDomainKHR * pTimeDomains,\n                                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename TimeDomainKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::TimeDomainKHR>,\n              typename Dispatch               = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename TimeDomainKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::TimeDomainKHR>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::TimeDomainKHR, TimeDomainKHRAllocator>>::type\n      getCalibrateableTimeDomainsKHR( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename TimeDomainKHRAllocator = std::allocator<VULKAN_HPP_NAMESPACE::TimeDomainKHR>,\n              typename Dispatch               = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename TimeDomainKHRAllocator::value_type, VULKAN_HPP_NAMESPACE::TimeDomainKHR>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::TimeDomainKHR, TimeDomainKHRAllocator>>::type\n      getCalibrateableTimeDomainsKHR( TimeDomainKHRAllocator & timeDomainKHRAllocator, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_NV_cooperative_matrix2 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result\n      getCooperativeMatrixFlexibleDimensionsPropertiesNV( uint32_t *                                                              pPropertyCount,\n                                                          VULKAN_HPP_NAMESPACE::CooperativeMatrixFlexibleDimensionsPropertiesNV * pProperties,\n                                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <\n      typename CooperativeMatrixFlexibleDimensionsPropertiesNVAllocator = std::allocator<VULKAN_HPP_NAMESPACE::CooperativeMatrixFlexibleDimensionsPropertiesNV>,\n      typename Dispatch                                                 = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename CooperativeMatrixFlexibleDimensionsPropertiesNVAllocator::value_type,\n                                           VULKAN_HPP_NAMESPACE::CooperativeMatrixFlexibleDimensionsPropertiesNV>::value,\n                              int>::type                                = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<\n      std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixFlexibleDimensionsPropertiesNV, CooperativeMatrixFlexibleDimensionsPropertiesNVAllocator>>::type\n      getCooperativeMatrixFlexibleDimensionsPropertiesNV( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <\n      typename CooperativeMatrixFlexibleDimensionsPropertiesNVAllocator = std::allocator<VULKAN_HPP_NAMESPACE::CooperativeMatrixFlexibleDimensionsPropertiesNV>,\n      typename Dispatch                                                 = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n      typename std::enable_if<std::is_same<typename CooperativeMatrixFlexibleDimensionsPropertiesNVAllocator::value_type,\n                                           VULKAN_HPP_NAMESPACE::CooperativeMatrixFlexibleDimensionsPropertiesNV>::value,\n                              int>::type                                = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<\n      std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixFlexibleDimensionsPropertiesNV, CooperativeMatrixFlexibleDimensionsPropertiesNVAllocator>>::type\n      getCooperativeMatrixFlexibleDimensionsPropertiesNV(\n        CooperativeMatrixFlexibleDimensionsPropertiesNVAllocator & cooperativeMatrixFlexibleDimensionsPropertiesNVAllocator,\n        Dispatch const & d                                         VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    operator VkPhysicalDevice() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_physicalDevice;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_physicalDevice != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_physicalDevice == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkPhysicalDevice m_physicalDevice = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::ePhysicalDevice>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::PhysicalDevice;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePhysicalDevice>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::PhysicalDevice;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkPhysicalDevice, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::PhysicalDevice;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::PhysicalDevice>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  class Instance\n  {\n  public:\n    using CType      = VkInstance;\n    using NativeType = VkInstance;\n\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eInstance;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eInstance;\n\n  public:\n    Instance() VULKAN_HPP_NOEXCEPT{};  // = default - try to workaround a compiler issue\n    Instance( Instance const & rhs )             = default;\n    Instance & operator=( Instance const & rhs ) = default;\n\n#if !defined( VULKAN_HPP_HANDLES_MOVE_EXCHANGE )\n    Instance( Instance && rhs )             = default;\n    Instance & operator=( Instance && rhs ) = default;\n#else\n    Instance( Instance && rhs ) VULKAN_HPP_NOEXCEPT : m_instance( VULKAN_HPP_NAMESPACE::exchange( rhs.m_instance, {} ) ) {}\n\n    Instance & operator=( Instance && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      m_instance = VULKAN_HPP_NAMESPACE::exchange( rhs.m_instance, {} );\n      return *this;\n    }\n#endif\n\n    VULKAN_HPP_CONSTEXPR Instance( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}\n\n    Instance( VkInstance instance ) VULKAN_HPP_NOEXCEPT : m_instance( instance ) {}\n\n    Instance & operator=( VkInstance instance ) VULKAN_HPP_NOEXCEPT\n    {\n      m_instance = instance;\n      return *this;\n    }\n\n    Instance & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      m_instance = {};\n      return *this;\n    }\n\n    //=== VK_VERSION_1_0 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result enumeratePhysicalDevices( uint32_t *                             pPhysicalDeviceCount,\n                                                          VULKAN_HPP_NAMESPACE::PhysicalDevice * pPhysicalDevices,\n                                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename PhysicalDeviceAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PhysicalDevice>,\n              typename Dispatch                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename PhysicalDeviceAllocator::value_type, VULKAN_HPP_NAMESPACE::PhysicalDevice>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDevice, PhysicalDeviceAllocator>>::type\n      enumeratePhysicalDevices( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename PhysicalDeviceAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PhysicalDevice>,\n              typename Dispatch                = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<std::is_same<typename PhysicalDeviceAllocator::value_type, VULKAN_HPP_NAMESPACE::PhysicalDevice>::value, int>::type = 0>\n    VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDevice, PhysicalDeviceAllocator>>::type\n      enumeratePhysicalDevices( PhysicalDeviceAllocator & physicalDeviceAllocator, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    PFN_vkVoidFunction getProcAddr( const char * pName, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NAMESPACE::PFN_VoidFunction getProcAddr( const std::string & name,\n                                                        Dispatch const & d  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_VERSION_1_1 ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result enumeratePhysicalDeviceGroups( uint32_t *                                            pPhysicalDeviceGroupCount,\n                                                               VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties * pPhysicalDeviceGroupProperties,\n                                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename PhysicalDeviceGroupPropertiesAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties>,\n              typename Dispatch                               = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename PhysicalDeviceGroupPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties, PhysicalDeviceGroupPropertiesAllocator>>::type\n      enumeratePhysicalDeviceGroups( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename PhysicalDeviceGroupPropertiesAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties>,\n              typename Dispatch                               = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename PhysicalDeviceGroupPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties, PhysicalDeviceGroupPropertiesAllocator>>::type\n      enumeratePhysicalDeviceGroups( PhysicalDeviceGroupPropertiesAllocator & physicalDeviceGroupPropertiesAllocator,\n                                     Dispatch const & d                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_surface ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroySurfaceKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR                  surface,\n                            const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                            Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroySurfaceKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface                            VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::SurfaceKHR                  surface,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::SurfaceKHR                                    surface,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    //=== VK_KHR_display ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createDisplayPlaneSurfaceKHR( const VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateInfoKHR * pCreateInfo,\n                                                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks *         pAllocator,\n                                                              VULKAN_HPP_NAMESPACE::SurfaceKHR *                        pSurface,\n                                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n      createDisplayPlaneSurfaceKHR( const VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateInfoKHR &           createInfo,\n                                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                    Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n      createDisplayPlaneSurfaceKHRUnique( const VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateInfoKHR &           createInfo,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                          Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_USE_PLATFORM_XLIB_KHR )\n    //=== VK_KHR_xlib_surface ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createXlibSurfaceKHR( const VULKAN_HPP_NAMESPACE::XlibSurfaceCreateInfoKHR * pCreateInfo,\n                                                      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *      pAllocator,\n                                                      VULKAN_HPP_NAMESPACE::SurfaceKHR *                     pSurface,\n                                                      Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n      createXlibSurfaceKHR( const VULKAN_HPP_NAMESPACE::XlibSurfaceCreateInfoKHR &              createInfo,\n                            Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                            Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n      createXlibSurfaceKHRUnique( const VULKAN_HPP_NAMESPACE::XlibSurfaceCreateInfoKHR &              createInfo,\n                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_XLIB_KHR*/\n\n#if defined( VK_USE_PLATFORM_XCB_KHR )\n    //=== VK_KHR_xcb_surface ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createXcbSurfaceKHR( const VULKAN_HPP_NAMESPACE::XcbSurfaceCreateInfoKHR * pCreateInfo,\n                                                     const VULKAN_HPP_NAMESPACE::AllocationCallbacks *     pAllocator,\n                                                     VULKAN_HPP_NAMESPACE::SurfaceKHR *                    pSurface,\n                                                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n      createXcbSurfaceKHR( const VULKAN_HPP_NAMESPACE::XcbSurfaceCreateInfoKHR &               createInfo,\n                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                           Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n      createXcbSurfaceKHRUnique( const VULKAN_HPP_NAMESPACE::XcbSurfaceCreateInfoKHR &               createInfo,\n                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                 Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_XCB_KHR*/\n\n#if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n    //=== VK_KHR_wayland_surface ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createWaylandSurfaceKHR( const VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateInfoKHR * pCreateInfo,\n                                                         const VULKAN_HPP_NAMESPACE::AllocationCallbacks *         pAllocator,\n                                                         VULKAN_HPP_NAMESPACE::SurfaceKHR *                        pSurface,\n                                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n      createWaylandSurfaceKHR( const VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateInfoKHR &           createInfo,\n                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                               Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n      createWaylandSurfaceKHRUnique( const VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateInfoKHR &           createInfo,\n                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                     Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_WAYLAND_KHR*/\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n    //=== VK_KHR_android_surface ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createAndroidSurfaceKHR( const VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateInfoKHR * pCreateInfo,\n                                                         const VULKAN_HPP_NAMESPACE::AllocationCallbacks *         pAllocator,\n                                                         VULKAN_HPP_NAMESPACE::SurfaceKHR *                        pSurface,\n                                                         Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n      createAndroidSurfaceKHR( const VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateInfoKHR &           createInfo,\n                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                               Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n      createAndroidSurfaceKHRUnique( const VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateInfoKHR &           createInfo,\n                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                     Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n    //=== VK_KHR_win32_surface ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createWin32SurfaceKHR( const VULKAN_HPP_NAMESPACE::Win32SurfaceCreateInfoKHR * pCreateInfo,\n                                                       const VULKAN_HPP_NAMESPACE::AllocationCallbacks *       pAllocator,\n                                                       VULKAN_HPP_NAMESPACE::SurfaceKHR *                      pSurface,\n                                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n      createWin32SurfaceKHR( const VULKAN_HPP_NAMESPACE::Win32SurfaceCreateInfoKHR &             createInfo,\n                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                             Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n      createWin32SurfaceKHRUnique( const VULKAN_HPP_NAMESPACE::Win32SurfaceCreateInfoKHR &             createInfo,\n                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                   Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_WIN32_KHR*/\n\n    //=== VK_EXT_debug_report ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createDebugReportCallbackEXT( const VULKAN_HPP_NAMESPACE::DebugReportCallbackCreateInfoEXT * pCreateInfo,\n                                                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks *              pAllocator,\n                                                              VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT *                 pCallback,\n                                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT>::type\n      createDebugReportCallbackEXT( const VULKAN_HPP_NAMESPACE::DebugReportCallbackCreateInfoEXT &      createInfo,\n                                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                    Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT, Dispatch>>::type\n      createDebugReportCallbackEXTUnique( const VULKAN_HPP_NAMESPACE::DebugReportCallbackCreateInfoEXT &      createInfo,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                          Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyDebugReportCallbackEXT( VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT      callback,\n                                        const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                        Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyDebugReportCallbackEXT( VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT callback               VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT      callback,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT                        callback,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void debugReportMessageEXT( VULKAN_HPP_NAMESPACE::DebugReportFlagsEXT      flags,\n                                VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT objectType,\n                                uint64_t                                       object,\n                                size_t                                         location,\n                                int32_t                                        messageCode,\n                                const char *                                   pLayerPrefix,\n                                const char *                                   pMessage,\n                                Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void debugReportMessageEXT( VULKAN_HPP_NAMESPACE::DebugReportFlagsEXT      flags,\n                                VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT objectType,\n                                uint64_t                                       object,\n                                size_t                                         location,\n                                int32_t                                        messageCode,\n                                const std::string &                            layerPrefix,\n                                const std::string &                            message,\n                                Dispatch const & d                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_USE_PLATFORM_GGP )\n    //=== VK_GGP_stream_descriptor_surface ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createStreamDescriptorSurfaceGGP( const VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateInfoGGP * pCreateInfo,\n                                                                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                  pAllocator,\n                                                                  VULKAN_HPP_NAMESPACE::SurfaceKHR *                                 pSurface,\n                                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n      createStreamDescriptorSurfaceGGP( const VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateInfoGGP &  createInfo,\n                                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                        Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type createStreamDescriptorSurfaceGGPUnique(\n      const VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateInfoGGP &  createInfo,\n      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n      Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_GGP*/\n\n#if defined( VK_USE_PLATFORM_VI_NN )\n    //=== VK_NN_vi_surface ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createViSurfaceNN( const VULKAN_HPP_NAMESPACE::ViSurfaceCreateInfoNN * pCreateInfo,\n                                                   const VULKAN_HPP_NAMESPACE::AllocationCallbacks *   pAllocator,\n                                                   VULKAN_HPP_NAMESPACE::SurfaceKHR *                  pSurface,\n                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n      createViSurfaceNN( const VULKAN_HPP_NAMESPACE::ViSurfaceCreateInfoNN &                 createInfo,\n                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                         Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n      createViSurfaceNNUnique( const VULKAN_HPP_NAMESPACE::ViSurfaceCreateInfoNN &                 createInfo,\n                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                               Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_VI_NN*/\n\n    //=== VK_KHR_device_group_creation ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result enumeratePhysicalDeviceGroupsKHR( uint32_t *                                            pPhysicalDeviceGroupCount,\n                                                                  VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties * pPhysicalDeviceGroupProperties,\n                                                                  Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename PhysicalDeviceGroupPropertiesAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties>,\n              typename Dispatch                               = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename PhysicalDeviceGroupPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties, PhysicalDeviceGroupPropertiesAllocator>>::type\n      enumeratePhysicalDeviceGroupsKHR( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n    template <typename PhysicalDeviceGroupPropertiesAllocator = std::allocator<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties>,\n              typename Dispatch                               = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename std::enable_if<\n                std::is_same<typename PhysicalDeviceGroupPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties>::value,\n                int>::type = 0>\n    VULKAN_HPP_NODISCARD\n      typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties, PhysicalDeviceGroupPropertiesAllocator>>::type\n      enumeratePhysicalDeviceGroupsKHR( PhysicalDeviceGroupPropertiesAllocator & physicalDeviceGroupPropertiesAllocator,\n                                        Dispatch const & d                       VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_USE_PLATFORM_IOS_MVK )\n    //=== VK_MVK_ios_surface ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createIOSSurfaceMVK( const VULKAN_HPP_NAMESPACE::IOSSurfaceCreateInfoMVK * pCreateInfo,\n                                                     const VULKAN_HPP_NAMESPACE::AllocationCallbacks *     pAllocator,\n                                                     VULKAN_HPP_NAMESPACE::SurfaceKHR *                    pSurface,\n                                                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n      createIOSSurfaceMVK( const VULKAN_HPP_NAMESPACE::IOSSurfaceCreateInfoMVK &               createInfo,\n                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                           Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n      createIOSSurfaceMVKUnique( const VULKAN_HPP_NAMESPACE::IOSSurfaceCreateInfoMVK &               createInfo,\n                                 Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                 Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_IOS_MVK*/\n\n#if defined( VK_USE_PLATFORM_MACOS_MVK )\n    //=== VK_MVK_macos_surface ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createMacOSSurfaceMVK( const VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateInfoMVK * pCreateInfo,\n                                                       const VULKAN_HPP_NAMESPACE::AllocationCallbacks *       pAllocator,\n                                                       VULKAN_HPP_NAMESPACE::SurfaceKHR *                      pSurface,\n                                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n      createMacOSSurfaceMVK( const VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateInfoMVK &             createInfo,\n                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                             Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n      createMacOSSurfaceMVKUnique( const VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateInfoMVK &             createInfo,\n                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                   Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_MACOS_MVK*/\n\n    //=== VK_EXT_debug_utils ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createDebugUtilsMessengerEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateInfoEXT * pCreateInfo,\n                                                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks *              pAllocator,\n                                                              VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT *                 pMessenger,\n                                                              Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT>::type\n      createDebugUtilsMessengerEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateInfoEXT &      createInfo,\n                                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                    Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT, Dispatch>>::type\n      createDebugUtilsMessengerEXTUnique( const VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateInfoEXT &      createInfo,\n                                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                          Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyDebugUtilsMessengerEXT( VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT      messenger,\n                                        const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                        Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroyDebugUtilsMessengerEXT( VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT messenger              VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT      messenger,\n                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                  Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void destroy( VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT                        messenger,\n                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                  Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void submitDebugUtilsMessageEXT( VULKAN_HPP_NAMESPACE::DebugUtilsMessageSeverityFlagBitsEXT       messageSeverity,\n                                     VULKAN_HPP_NAMESPACE::DebugUtilsMessageTypeFlagsEXT              messageTypes,\n                                     const VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCallbackDataEXT * pCallbackData,\n                                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    void submitDebugUtilsMessageEXT( VULKAN_HPP_NAMESPACE::DebugUtilsMessageSeverityFlagBitsEXT       messageSeverity,\n                                     VULKAN_HPP_NAMESPACE::DebugUtilsMessageTypeFlagsEXT              messageTypes,\n                                     const VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCallbackDataEXT & callbackData,\n                                     Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n    //=== VK_FUCHSIA_imagepipe_surface ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createImagePipeSurfaceFUCHSIA( const VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateInfoFUCHSIA * pCreateInfo,\n                                                               const VULKAN_HPP_NAMESPACE::AllocationCallbacks *               pAllocator,\n                                                               VULKAN_HPP_NAMESPACE::SurfaceKHR *                              pSurface,\n                                                               Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n      createImagePipeSurfaceFUCHSIA( const VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateInfoFUCHSIA &     createInfo,\n                                     Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                     Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n      createImagePipeSurfaceFUCHSIAUnique( const VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateInfoFUCHSIA &     createInfo,\n                                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                           Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n    //=== VK_EXT_metal_surface ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createMetalSurfaceEXT( const VULKAN_HPP_NAMESPACE::MetalSurfaceCreateInfoEXT * pCreateInfo,\n                                                       const VULKAN_HPP_NAMESPACE::AllocationCallbacks *       pAllocator,\n                                                       VULKAN_HPP_NAMESPACE::SurfaceKHR *                      pSurface,\n                                                       Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n      createMetalSurfaceEXT( const VULKAN_HPP_NAMESPACE::MetalSurfaceCreateInfoEXT &             createInfo,\n                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                             Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n      createMetalSurfaceEXTUnique( const VULKAN_HPP_NAMESPACE::MetalSurfaceCreateInfoEXT &             createInfo,\n                                   Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                   Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_METAL_EXT*/\n\n    //=== VK_EXT_headless_surface ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createHeadlessSurfaceEXT( const VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateInfoEXT * pCreateInfo,\n                                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks *          pAllocator,\n                                                          VULKAN_HPP_NAMESPACE::SurfaceKHR *                         pSurface,\n                                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n      createHeadlessSurfaceEXT( const VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateInfoEXT &          createInfo,\n                                Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n      createHeadlessSurfaceEXTUnique( const VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateInfoEXT &          createInfo,\n                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                      Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n    //=== VK_EXT_directfb_surface ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createDirectFBSurfaceEXT( const VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateInfoEXT * pCreateInfo,\n                                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks *          pAllocator,\n                                                          VULKAN_HPP_NAMESPACE::SurfaceKHR *                         pSurface,\n                                                          Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n      createDirectFBSurfaceEXT( const VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateInfoEXT &          createInfo,\n                                Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n      createDirectFBSurfaceEXTUnique( const VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateInfoEXT &          createInfo,\n                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                      Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n    //=== VK_QNX_screen_surface ===\n\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD Result createScreenSurfaceQNX( const VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateInfoQNX * pCreateInfo,\n                                                        const VULKAN_HPP_NAMESPACE::AllocationCallbacks *        pAllocator,\n                                                        VULKAN_HPP_NAMESPACE::SurfaceKHR *                       pSurface,\n                                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceKHR>::type\n      createScreenSurfaceQNX( const VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateInfoQNX &            createInfo,\n                              Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                              Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    ifndef VULKAN_HPP_NO_SMART_HANDLE\n    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n    VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR, Dispatch>>::type\n      createScreenSurfaceQNXUnique( const VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateInfoQNX &            createInfo,\n                                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                    Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;\n#    endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#  endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n#endif     /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n    operator VkInstance() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_instance;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_instance != VK_NULL_HANDLE;\n    }\n\n    bool operator!() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_instance == VK_NULL_HANDLE;\n    }\n\n  private:\n    VkInstance m_instance = {};\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::eInstance>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Instance;\n  };\n\n  template <>\n  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT, VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eInstance>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Instance;\n  };\n\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n  template <>\n  struct CppType<VkInstance, VK_NULL_HANDLE>\n  {\n    using Type = VULKAN_HPP_NAMESPACE::Instance;\n  };\n#endif\n\n  template <>\n  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::Instance>\n  {\n    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n  };\n\n  //=== VK_VERSION_1_0 ===\n\n  template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n  VULKAN_HPP_NODISCARD Result createInstance( const VULKAN_HPP_NAMESPACE::InstanceCreateInfo *  pCreateInfo,\n                                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,\n                                              VULKAN_HPP_NAMESPACE::Instance *                  pInstance,\n                                              Dispatch const & d                                VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n  VULKAN_HPP_NODISCARD typename ResultValueType<VULKAN_HPP_NAMESPACE::Instance>::type\n    createInstance( const VULKAN_HPP_NAMESPACE::InstanceCreateInfo &                    createInfo,\n                    Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                    Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT );\n#  ifndef VULKAN_HPP_NO_SMART_HANDLE\n  template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n  VULKAN_HPP_NODISCARD typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::Instance, Dispatch>>::type\n    createInstanceUnique( const VULKAN_HPP_NAMESPACE::InstanceCreateInfo &                    createInfo,\n                          Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                          Dispatch const & d                                                  VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT );\n#  endif /* VULKAN_HPP_NO_SMART_HANDLE */\n#endif   /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n  VULKAN_HPP_NODISCARD Result enumerateInstanceExtensionProperties( const char *                                pLayerName,\n                                                                    uint32_t *                                  pPropertyCount,\n                                                                    VULKAN_HPP_NAMESPACE::ExtensionProperties * pProperties,\n                                                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <\n    typename ExtensionPropertiesAllocator = std::allocator<VULKAN_HPP_NAMESPACE::ExtensionProperties>,\n    typename Dispatch                     = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n    typename std::enable_if<std::is_same<typename ExtensionPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::ExtensionProperties>::value, int>::type = 0>\n  VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties, ExtensionPropertiesAllocator>>::type\n    enumerateInstanceExtensionProperties( Optional<const std::string> layerName VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                                          Dispatch const & d                    VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT );\n  template <\n    typename ExtensionPropertiesAllocator = std::allocator<VULKAN_HPP_NAMESPACE::ExtensionProperties>,\n    typename Dispatch                     = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n    typename std::enable_if<std::is_same<typename ExtensionPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::ExtensionProperties>::value, int>::type = 0>\n  VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties, ExtensionPropertiesAllocator>>::type\n    enumerateInstanceExtensionProperties( Optional<const std::string>    layerName,\n                                          ExtensionPropertiesAllocator & extensionPropertiesAllocator,\n                                          Dispatch const & d             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT );\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n  VULKAN_HPP_NODISCARD Result enumerateInstanceLayerProperties( uint32_t *                              pPropertyCount,\n                                                                VULKAN_HPP_NAMESPACE::LayerProperties * pProperties,\n                                                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename LayerPropertiesAllocator = std::allocator<VULKAN_HPP_NAMESPACE::LayerProperties>,\n            typename Dispatch                 = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n            typename std::enable_if<std::is_same<typename LayerPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::LayerProperties>::value, int>::type = 0>\n  VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::LayerProperties, LayerPropertiesAllocator>>::type\n    enumerateInstanceLayerProperties( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT );\n  template <typename LayerPropertiesAllocator = std::allocator<VULKAN_HPP_NAMESPACE::LayerProperties>,\n            typename Dispatch                 = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n            typename std::enable_if<std::is_same<typename LayerPropertiesAllocator::value_type, VULKAN_HPP_NAMESPACE::LayerProperties>::value, int>::type = 0>\n  VULKAN_HPP_NODISCARD typename ResultValueType<std::vector<VULKAN_HPP_NAMESPACE::LayerProperties, LayerPropertiesAllocator>>::type\n    enumerateInstanceLayerProperties( LayerPropertiesAllocator & layerPropertiesAllocator, Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT );\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  //=== VK_VERSION_1_1 ===\n\n  template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n  VULKAN_HPP_NODISCARD Result enumerateInstanceVersion( uint32_t *         pApiVersion,\n                                                        Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) VULKAN_HPP_NOEXCEPT;\n#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE\n  template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n  VULKAN_HPP_NODISCARD typename ResultValueType<uint32_t>::type enumerateInstanceVersion( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT );\n#endif /* VULKAN_HPP_DISABLE_ENHANCED_MODE */\n\n  // operators to compare vk::-handles\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n  template <typename T, typename std::enable_if<VULKAN_HPP_NAMESPACE::isVulkanHandleType<T>::value, int>::type = 0>\n  auto operator<=>( T const & lhs, T const & rhs )\n  {\n    return static_cast<typename T::NativeType>( lhs ) <=> static_cast<typename T::NativeType>( rhs );\n  }\n#else\n  template <typename T, typename std::enable_if<VULKAN_HPP_NAMESPACE::isVulkanHandleType<T>::value, int>::type = 0>\n  bool operator==( T const & lhs, T const & rhs )\n  {\n    return static_cast<typename T::NativeType>( lhs ) == static_cast<typename T::NativeType>( rhs );\n  }\n\n  template <typename T, typename std::enable_if<VULKAN_HPP_NAMESPACE::isVulkanHandleType<T>::value, int>::type = 0>\n  bool operator!=( T const & lhs, T const & rhs )\n  {\n    return static_cast<typename T::NativeType>( lhs ) != static_cast<typename T::NativeType>( rhs );\n  }\n\n  template <typename T, typename std::enable_if<VULKAN_HPP_NAMESPACE::isVulkanHandleType<T>::value, int>::type = 0>\n  bool operator<( T const & lhs, T const & rhs )\n  {\n    return static_cast<typename T::NativeType>( lhs ) < static_cast<typename T::NativeType>( rhs );\n  }\n#endif\n\n  template <typename T, typename std::enable_if<VULKAN_HPP_NAMESPACE::isVulkanHandleType<T>::value, int>::type = 0>\n  bool operator==( T const & v, std::nullptr_t )\n  {\n    return !v;\n  }\n\n  template <typename T, typename std::enable_if<VULKAN_HPP_NAMESPACE::isVulkanHandleType<T>::value, int>::type = 0>\n  bool operator==( std::nullptr_t, T const & v )\n  {\n    return !v;\n  }\n\n  template <typename T, typename std::enable_if<VULKAN_HPP_NAMESPACE::isVulkanHandleType<T>::value, int>::type = 0>\n  bool operator!=( T const & v, std::nullptr_t )\n  {\n    return !!v;\n  }\n\n  template <typename T, typename std::enable_if<VULKAN_HPP_NAMESPACE::isVulkanHandleType<T>::value, int>::type = 0>\n  bool operator!=( std::nullptr_t, T const & v )\n  {\n    return !!v;\n  }\n}  // namespace VULKAN_HPP_NAMESPACE\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_hash.hpp",
    "content": "// Copyright 2015-2025 The Khronos Group Inc.\n//\n// SPDX-License-Identifier: Apache-2.0 OR MIT\n//\n\n// This header is generated from the Khronos Vulkan XML API Registry.\n\n#ifndef VULKAN_HASH_HPP\n#define VULKAN_HASH_HPP\n\n#include <vulkan/vulkan.hpp>\n\nnamespace std\n{\n  //=======================================\n  //=== HASH structures for Flags types ===\n  //=======================================\n\n  template <typename BitType>\n  struct hash<VULKAN_HPP_NAMESPACE::Flags<BitType>>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::Flags<BitType> const & flags ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<typename std::underlying_type<BitType>::type>{}( static_cast<typename std::underlying_type<BitType>::type>( flags ) );\n    }\n  };\n\n  //===================================\n  //=== HASH structures for handles ===\n  //===================================\n\n  //=== VK_VERSION_1_0 ===\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::Instance>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::Instance const & instance ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkInstance>{}( static_cast<VkInstance>( instance ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevice>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDevice const & physicalDevice ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkPhysicalDevice>{}( static_cast<VkPhysicalDevice>( physicalDevice ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::Device>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::Device const & device ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkDevice>{}( static_cast<VkDevice>( device ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::Queue>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::Queue const & queue ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkQueue>{}( static_cast<VkQueue>( queue ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceMemory>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceMemory const & deviceMemory ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkDeviceMemory>{}( static_cast<VkDeviceMemory>( deviceMemory ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::Fence>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::Fence const & fence ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkFence>{}( static_cast<VkFence>( fence ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::Semaphore>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::Semaphore const & semaphore ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkSemaphore>{}( static_cast<VkSemaphore>( semaphore ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::Event>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::Event const & event ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkEvent>{}( static_cast<VkEvent>( event ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::QueryPool>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::QueryPool const & queryPool ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkQueryPool>{}( static_cast<VkQueryPool>( queryPool ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::Buffer>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::Buffer const & buffer ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkBuffer>{}( static_cast<VkBuffer>( buffer ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BufferView>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BufferView const & bufferView ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkBufferView>{}( static_cast<VkBufferView>( bufferView ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::Image>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::Image const & image ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkImage>{}( static_cast<VkImage>( image ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageView>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageView const & imageView ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkImageView>{}( static_cast<VkImageView>( imageView ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ShaderModule>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ShaderModule const & shaderModule ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkShaderModule>{}( static_cast<VkShaderModule>( shaderModule ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineCache>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineCache const & pipelineCache ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkPipelineCache>{}( static_cast<VkPipelineCache>( pipelineCache ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::Pipeline>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::Pipeline const & pipeline ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkPipeline>{}( static_cast<VkPipeline>( pipeline ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineLayout>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineLayout const & pipelineLayout ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkPipelineLayout>{}( static_cast<VkPipelineLayout>( pipelineLayout ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::Sampler>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::Sampler const & sampler ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkSampler>{}( static_cast<VkSampler>( sampler ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DescriptorPool>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DescriptorPool const & descriptorPool ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkDescriptorPool>{}( static_cast<VkDescriptorPool>( descriptorPool ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DescriptorSet>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DescriptorSet const & descriptorSet ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkDescriptorSet>{}( static_cast<VkDescriptorSet>( descriptorSet ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DescriptorSetLayout>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DescriptorSetLayout const & descriptorSetLayout ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkDescriptorSetLayout>{}( static_cast<VkDescriptorSetLayout>( descriptorSetLayout ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::Framebuffer>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::Framebuffer const & framebuffer ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkFramebuffer>{}( static_cast<VkFramebuffer>( framebuffer ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderPass>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RenderPass const & renderPass ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkRenderPass>{}( static_cast<VkRenderPass>( renderPass ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CommandPool>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CommandPool const & commandPool ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkCommandPool>{}( static_cast<VkCommandPool>( commandPool ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CommandBuffer>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CommandBuffer const & commandBuffer ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkCommandBuffer>{}( static_cast<VkCommandBuffer>( commandBuffer ) );\n    }\n  };\n\n  //=== VK_VERSION_1_1 ===\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion const & samplerYcbcrConversion ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkSamplerYcbcrConversion>{}( static_cast<VkSamplerYcbcrConversion>( samplerYcbcrConversion ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate const & descriptorUpdateTemplate ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkDescriptorUpdateTemplate>{}( static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ) );\n    }\n  };\n\n  //=== VK_VERSION_1_3 ===\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PrivateDataSlot>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PrivateDataSlot const & privateDataSlot ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkPrivateDataSlot>{}( static_cast<VkPrivateDataSlot>( privateDataSlot ) );\n    }\n  };\n\n  //=== VK_KHR_surface ===\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SurfaceKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SurfaceKHR const & surfaceKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkSurfaceKHR>{}( static_cast<VkSurfaceKHR>( surfaceKHR ) );\n    }\n  };\n\n  //=== VK_KHR_swapchain ===\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SwapchainKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SwapchainKHR const & swapchainKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkSwapchainKHR>{}( static_cast<VkSwapchainKHR>( swapchainKHR ) );\n    }\n  };\n\n  //=== VK_KHR_display ===\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DisplayKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DisplayKHR const & displayKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkDisplayKHR>{}( static_cast<VkDisplayKHR>( displayKHR ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DisplayModeKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DisplayModeKHR const & displayModeKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkDisplayModeKHR>{}( static_cast<VkDisplayModeKHR>( displayModeKHR ) );\n    }\n  };\n\n  //=== VK_EXT_debug_report ===\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT const & debugReportCallbackEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkDebugReportCallbackEXT>{}( static_cast<VkDebugReportCallbackEXT>( debugReportCallbackEXT ) );\n    }\n  };\n\n  //=== VK_KHR_video_queue ===\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoSessionKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoSessionKHR const & videoSessionKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkVideoSessionKHR>{}( static_cast<VkVideoSessionKHR>( videoSessionKHR ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR const & videoSessionParametersKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkVideoSessionParametersKHR>{}( static_cast<VkVideoSessionParametersKHR>( videoSessionParametersKHR ) );\n    }\n  };\n\n  //=== VK_NVX_binary_import ===\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CuModuleNVX>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CuModuleNVX const & cuModuleNVX ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkCuModuleNVX>{}( static_cast<VkCuModuleNVX>( cuModuleNVX ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CuFunctionNVX>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CuFunctionNVX const & cuFunctionNVX ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkCuFunctionNVX>{}( static_cast<VkCuFunctionNVX>( cuFunctionNVX ) );\n    }\n  };\n\n  //=== VK_EXT_debug_utils ===\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT const & debugUtilsMessengerEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkDebugUtilsMessengerEXT>{}( static_cast<VkDebugUtilsMessengerEXT>( debugUtilsMessengerEXT ) );\n    }\n  };\n\n  //=== VK_KHR_acceleration_structure ===\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AccelerationStructureKHR const & accelerationStructureKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkAccelerationStructureKHR>{}( static_cast<VkAccelerationStructureKHR>( accelerationStructureKHR ) );\n    }\n  };\n\n  //=== VK_EXT_validation_cache ===\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ValidationCacheEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ValidationCacheEXT const & validationCacheEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkValidationCacheEXT>{}( static_cast<VkValidationCacheEXT>( validationCacheEXT ) );\n    }\n  };\n\n  //=== VK_NV_ray_tracing ===\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AccelerationStructureNV const & accelerationStructureNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkAccelerationStructureNV>{}( static_cast<VkAccelerationStructureNV>( accelerationStructureNV ) );\n    }\n  };\n\n  //=== VK_INTEL_performance_query ===\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL const & performanceConfigurationINTEL ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkPerformanceConfigurationINTEL>{}( static_cast<VkPerformanceConfigurationINTEL>( performanceConfigurationINTEL ) );\n    }\n  };\n\n  //=== VK_KHR_deferred_host_operations ===\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeferredOperationKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeferredOperationKHR const & deferredOperationKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkDeferredOperationKHR>{}( static_cast<VkDeferredOperationKHR>( deferredOperationKHR ) );\n    }\n  };\n\n  //=== VK_NV_device_generated_commands ===\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV const & indirectCommandsLayoutNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkIndirectCommandsLayoutNV>{}( static_cast<VkIndirectCommandsLayoutNV>( indirectCommandsLayoutNV ) );\n    }\n  };\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  //=== VK_NV_cuda_kernel_launch ===\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CudaModuleNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CudaModuleNV const & cudaModuleNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkCudaModuleNV>{}( static_cast<VkCudaModuleNV>( cudaModuleNV ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CudaFunctionNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CudaFunctionNV const & cudaFunctionNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkCudaFunctionNV>{}( static_cast<VkCudaFunctionNV>( cudaFunctionNV ) );\n    }\n  };\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_buffer_collection ===\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA const & bufferCollectionFUCHSIA ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkBufferCollectionFUCHSIA>{}( static_cast<VkBufferCollectionFUCHSIA>( bufferCollectionFUCHSIA ) );\n    }\n  };\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  //=== VK_EXT_opacity_micromap ===\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MicromapEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MicromapEXT const & micromapEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkMicromapEXT>{}( static_cast<VkMicromapEXT>( micromapEXT ) );\n    }\n  };\n\n  //=== VK_NV_optical_flow ===\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV const & opticalFlowSessionNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkOpticalFlowSessionNV>{}( static_cast<VkOpticalFlowSessionNV>( opticalFlowSessionNV ) );\n    }\n  };\n\n  //=== VK_EXT_shader_object ===\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ShaderEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ShaderEXT const & shaderEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkShaderEXT>{}( static_cast<VkShaderEXT>( shaderEXT ) );\n    }\n  };\n\n  //=== VK_KHR_pipeline_binary ===\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineBinaryKHR const & pipelineBinaryKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkPipelineBinaryKHR>{}( static_cast<VkPipelineBinaryKHR>( pipelineBinaryKHR ) );\n    }\n  };\n\n  //=== VK_EXT_device_generated_commands ===\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT const & indirectCommandsLayoutEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkIndirectCommandsLayoutEXT>{}( static_cast<VkIndirectCommandsLayoutEXT>( indirectCommandsLayoutEXT ) );\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT const & indirectExecutionSetEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      return std::hash<VkIndirectExecutionSetEXT>{}( static_cast<VkIndirectExecutionSetEXT>( indirectExecutionSetEXT ) );\n    }\n  };\n\n#if 14 <= VULKAN_HPP_CPP_VERSION\n  //======================================\n  //=== HASH structures for structures ===\n  //======================================\n\n#  if !defined( VULKAN_HPP_HASH_COMBINE )\n#    define VULKAN_HPP_HASH_COMBINE( seed, value ) \\\n      seed ^= std::hash<std::decay<decltype( value )>::type>{}( value ) + 0x9e3779b9 + ( seed << 6 ) + ( seed >> 2 )\n#  endif\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AabbPositionsKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AabbPositionsKHR const & aabbPositionsKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, aabbPositionsKHR.minX );\n      VULKAN_HPP_HASH_COMBINE( seed, aabbPositionsKHR.minY );\n      VULKAN_HPP_HASH_COMBINE( seed, aabbPositionsKHR.minZ );\n      VULKAN_HPP_HASH_COMBINE( seed, aabbPositionsKHR.maxX );\n      VULKAN_HPP_HASH_COMBINE( seed, aabbPositionsKHR.maxY );\n      VULKAN_HPP_HASH_COMBINE( seed, aabbPositionsKHR.maxZ );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR const & accelerationStructureBuildRangeInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureBuildRangeInfoKHR.primitiveCount );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureBuildRangeInfoKHR.primitiveOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureBuildRangeInfoKHR.firstVertex );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureBuildRangeInfoKHR.transformOffset );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR const & accelerationStructureBuildSizesInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureBuildSizesInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureBuildSizesInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureBuildSizesInfoKHR.accelerationStructureSize );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureBuildSizesInfoKHR.updateScratchSize );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureBuildSizesInfoKHR.buildScratchSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureCaptureDescriptorDataInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AccelerationStructureCaptureDescriptorDataInfoEXT const & accelerationStructureCaptureDescriptorDataInfoEXT )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureCaptureDescriptorDataInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureCaptureDescriptorDataInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureCaptureDescriptorDataInfoEXT.accelerationStructure );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureCaptureDescriptorDataInfoEXT.accelerationStructureNV );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoKHR const & accelerationStructureCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureCreateInfoKHR.createFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureCreateInfoKHR.buffer );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureCreateInfoKHR.offset );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureCreateInfoKHR.size );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureCreateInfoKHR.type );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureCreateInfoKHR.deviceAddress );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::GeometryTrianglesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::GeometryTrianglesNV const & geometryTrianglesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, geometryTrianglesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, geometryTrianglesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, geometryTrianglesNV.vertexData );\n      VULKAN_HPP_HASH_COMBINE( seed, geometryTrianglesNV.vertexOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, geometryTrianglesNV.vertexCount );\n      VULKAN_HPP_HASH_COMBINE( seed, geometryTrianglesNV.vertexStride );\n      VULKAN_HPP_HASH_COMBINE( seed, geometryTrianglesNV.vertexFormat );\n      VULKAN_HPP_HASH_COMBINE( seed, geometryTrianglesNV.indexData );\n      VULKAN_HPP_HASH_COMBINE( seed, geometryTrianglesNV.indexOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, geometryTrianglesNV.indexCount );\n      VULKAN_HPP_HASH_COMBINE( seed, geometryTrianglesNV.indexType );\n      VULKAN_HPP_HASH_COMBINE( seed, geometryTrianglesNV.transformData );\n      VULKAN_HPP_HASH_COMBINE( seed, geometryTrianglesNV.transformOffset );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::GeometryAABBNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::GeometryAABBNV const & geometryAABBNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, geometryAABBNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, geometryAABBNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, geometryAABBNV.aabbData );\n      VULKAN_HPP_HASH_COMBINE( seed, geometryAABBNV.numAABBs );\n      VULKAN_HPP_HASH_COMBINE( seed, geometryAABBNV.stride );\n      VULKAN_HPP_HASH_COMBINE( seed, geometryAABBNV.offset );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::GeometryDataNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::GeometryDataNV const & geometryDataNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, geometryDataNV.triangles );\n      VULKAN_HPP_HASH_COMBINE( seed, geometryDataNV.aabbs );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::GeometryNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::GeometryNV const & geometryNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, geometryNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, geometryNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, geometryNV.geometryType );\n      VULKAN_HPP_HASH_COMBINE( seed, geometryNV.geometry );\n      VULKAN_HPP_HASH_COMBINE( seed, geometryNV.flags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AccelerationStructureInfoNV const & accelerationStructureInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureInfoNV.type );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureInfoNV.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureInfoNV.instanceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureInfoNV.geometryCount );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureInfoNV.pGeometries );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoNV const & accelerationStructureCreateInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureCreateInfoNV.compactedSize );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureCreateInfoNV.info );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureDeviceAddressInfoKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::AccelerationStructureDeviceAddressInfoKHR const & accelerationStructureDeviceAddressInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureDeviceAddressInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureDeviceAddressInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureDeviceAddressInfoKHR.accelerationStructure );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::TransformMatrixKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::TransformMatrixKHR const & transformMatrixKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      for ( size_t i = 0; i < 3; ++i )\n      {\n        for ( size_t j = 0; j < 4; ++j )\n        {\n          VULKAN_HPP_HASH_COMBINE( seed, transformMatrixKHR.matrix[i][j] );\n        }\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureInstanceKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AccelerationStructureInstanceKHR const & accelerationStructureInstanceKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureInstanceKHR.transform );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureInstanceKHR.instanceCustomIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureInstanceKHR.mask );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureInstanceKHR.instanceShaderBindingTableRecordOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureInstanceKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureInstanceKHR.accelerationStructureReference );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureMatrixMotionInstanceNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AccelerationStructureMatrixMotionInstanceNV const & accelerationStructureMatrixMotionInstanceNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureMatrixMotionInstanceNV.transformT0 );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureMatrixMotionInstanceNV.transformT1 );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureMatrixMotionInstanceNV.instanceCustomIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureMatrixMotionInstanceNV.mask );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureMatrixMotionInstanceNV.instanceShaderBindingTableRecordOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureMatrixMotionInstanceNV.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureMatrixMotionInstanceNV.accelerationStructureReference );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsInfoNV const & accelerationStructureMemoryRequirementsInfoNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureMemoryRequirementsInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureMemoryRequirementsInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureMemoryRequirementsInfoNV.type );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureMemoryRequirementsInfoNV.accelerationStructure );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInfoNV const & accelerationStructureMotionInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureMotionInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureMotionInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureMotionInfoNV.maxInstances );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureMotionInfoNV.flags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SRTDataNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SRTDataNV const & sRTDataNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, sRTDataNV.sx );\n      VULKAN_HPP_HASH_COMBINE( seed, sRTDataNV.a );\n      VULKAN_HPP_HASH_COMBINE( seed, sRTDataNV.b );\n      VULKAN_HPP_HASH_COMBINE( seed, sRTDataNV.pvx );\n      VULKAN_HPP_HASH_COMBINE( seed, sRTDataNV.sy );\n      VULKAN_HPP_HASH_COMBINE( seed, sRTDataNV.c );\n      VULKAN_HPP_HASH_COMBINE( seed, sRTDataNV.pvy );\n      VULKAN_HPP_HASH_COMBINE( seed, sRTDataNV.sz );\n      VULKAN_HPP_HASH_COMBINE( seed, sRTDataNV.pvz );\n      VULKAN_HPP_HASH_COMBINE( seed, sRTDataNV.qx );\n      VULKAN_HPP_HASH_COMBINE( seed, sRTDataNV.qy );\n      VULKAN_HPP_HASH_COMBINE( seed, sRTDataNV.qz );\n      VULKAN_HPP_HASH_COMBINE( seed, sRTDataNV.qw );\n      VULKAN_HPP_HASH_COMBINE( seed, sRTDataNV.tx );\n      VULKAN_HPP_HASH_COMBINE( seed, sRTDataNV.ty );\n      VULKAN_HPP_HASH_COMBINE( seed, sRTDataNV.tz );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureSRTMotionInstanceNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::AccelerationStructureSRTMotionInstanceNV const & accelerationStructureSRTMotionInstanceNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureSRTMotionInstanceNV.transformT0 );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureSRTMotionInstanceNV.transformT1 );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureSRTMotionInstanceNV.instanceCustomIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureSRTMotionInstanceNV.mask );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureSRTMotionInstanceNV.instanceShaderBindingTableRecordOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureSRTMotionInstanceNV.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureSRTMotionInstanceNV.accelerationStructureReference );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MicromapUsageEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MicromapUsageEXT const & micromapUsageEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, micromapUsageEXT.count );\n      VULKAN_HPP_HASH_COMBINE( seed, micromapUsageEXT.subdivisionLevel );\n      VULKAN_HPP_HASH_COMBINE( seed, micromapUsageEXT.format );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureVersionInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AccelerationStructureVersionInfoKHR const & accelerationStructureVersionInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureVersionInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureVersionInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, accelerationStructureVersionInfoKHR.pVersionData );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AcquireNextImageInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AcquireNextImageInfoKHR const & acquireNextImageInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, acquireNextImageInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, acquireNextImageInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, acquireNextImageInfoKHR.swapchain );\n      VULKAN_HPP_HASH_COMBINE( seed, acquireNextImageInfoKHR.timeout );\n      VULKAN_HPP_HASH_COMBINE( seed, acquireNextImageInfoKHR.semaphore );\n      VULKAN_HPP_HASH_COMBINE( seed, acquireNextImageInfoKHR.fence );\n      VULKAN_HPP_HASH_COMBINE( seed, acquireNextImageInfoKHR.deviceMask );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AcquireProfilingLockInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AcquireProfilingLockInfoKHR const & acquireProfilingLockInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, acquireProfilingLockInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, acquireProfilingLockInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, acquireProfilingLockInfoKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, acquireProfilingLockInfoKHR.timeout );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AllocationCallbacks>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AllocationCallbacks const & allocationCallbacks ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, allocationCallbacks.pUserData );\n      VULKAN_HPP_HASH_COMBINE( seed, allocationCallbacks.pfnAllocation );\n      VULKAN_HPP_HASH_COMBINE( seed, allocationCallbacks.pfnReallocation );\n      VULKAN_HPP_HASH_COMBINE( seed, allocationCallbacks.pfnFree );\n      VULKAN_HPP_HASH_COMBINE( seed, allocationCallbacks.pfnInternalAllocation );\n      VULKAN_HPP_HASH_COMBINE( seed, allocationCallbacks.pfnInternalFree );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AmigoProfilingSubmitInfoSEC>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AmigoProfilingSubmitInfoSEC const & amigoProfilingSubmitInfoSEC ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, amigoProfilingSubmitInfoSEC.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, amigoProfilingSubmitInfoSEC.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, amigoProfilingSubmitInfoSEC.firstDrawTimestamp );\n      VULKAN_HPP_HASH_COMBINE( seed, amigoProfilingSubmitInfoSEC.swapBufferTimestamp );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ComponentMapping>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ComponentMapping const & componentMapping ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, componentMapping.r );\n      VULKAN_HPP_HASH_COMBINE( seed, componentMapping.g );\n      VULKAN_HPP_HASH_COMBINE( seed, componentMapping.b );\n      VULKAN_HPP_HASH_COMBINE( seed, componentMapping.a );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferFormatProperties2ANDROID>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AndroidHardwareBufferFormatProperties2ANDROID const & androidHardwareBufferFormatProperties2ANDROID ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferFormatProperties2ANDROID.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferFormatProperties2ANDROID.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferFormatProperties2ANDROID.format );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferFormatProperties2ANDROID.externalFormat );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferFormatProperties2ANDROID.formatFeatures );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferFormatProperties2ANDROID.samplerYcbcrConversionComponents );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferFormatProperties2ANDROID.suggestedYcbcrModel );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferFormatProperties2ANDROID.suggestedYcbcrRange );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferFormatProperties2ANDROID.suggestedXChromaOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferFormatProperties2ANDROID.suggestedYChromaOffset );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#  if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferFormatPropertiesANDROID>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AndroidHardwareBufferFormatPropertiesANDROID const & androidHardwareBufferFormatPropertiesANDROID ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferFormatPropertiesANDROID.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferFormatPropertiesANDROID.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferFormatPropertiesANDROID.format );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferFormatPropertiesANDROID.externalFormat );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferFormatPropertiesANDROID.formatFeatures );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferFormatPropertiesANDROID.samplerYcbcrConversionComponents );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferFormatPropertiesANDROID.suggestedYcbcrModel );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferFormatPropertiesANDROID.suggestedYcbcrRange );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferFormatPropertiesANDROID.suggestedXChromaOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferFormatPropertiesANDROID.suggestedYChromaOffset );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#  if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferFormatResolvePropertiesANDROID>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::AndroidHardwareBufferFormatResolvePropertiesANDROID const & androidHardwareBufferFormatResolvePropertiesANDROID ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferFormatResolvePropertiesANDROID.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferFormatResolvePropertiesANDROID.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferFormatResolvePropertiesANDROID.colorAttachmentFormat );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#  if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID const & androidHardwareBufferPropertiesANDROID ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferPropertiesANDROID.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferPropertiesANDROID.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferPropertiesANDROID.allocationSize );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferPropertiesANDROID.memoryTypeBits );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#  if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferUsageANDROID>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AndroidHardwareBufferUsageANDROID const & androidHardwareBufferUsageANDROID ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferUsageANDROID.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferUsageANDROID.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, androidHardwareBufferUsageANDROID.androidHardwareBufferUsage );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#  if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateInfoKHR const & androidSurfaceCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, androidSurfaceCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, androidSurfaceCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, androidSurfaceCreateInfoKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, androidSurfaceCreateInfoKHR.window );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AntiLagPresentationInfoAMD>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AntiLagPresentationInfoAMD const & antiLagPresentationInfoAMD ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, antiLagPresentationInfoAMD.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, antiLagPresentationInfoAMD.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, antiLagPresentationInfoAMD.stage );\n      VULKAN_HPP_HASH_COMBINE( seed, antiLagPresentationInfoAMD.frameIndex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AntiLagDataAMD>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AntiLagDataAMD const & antiLagDataAMD ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, antiLagDataAMD.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, antiLagDataAMD.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, antiLagDataAMD.mode );\n      VULKAN_HPP_HASH_COMBINE( seed, antiLagDataAMD.maxFPS );\n      VULKAN_HPP_HASH_COMBINE( seed, antiLagDataAMD.pPresentationInfo );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ApplicationInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ApplicationInfo const & applicationInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, applicationInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, applicationInfo.pNext );\n      for ( const char * p = applicationInfo.pApplicationName; *p != '\\0'; ++p )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, *p );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, applicationInfo.applicationVersion );\n      for ( const char * p = applicationInfo.pEngineName; *p != '\\0'; ++p )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, *p );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, applicationInfo.engineVersion );\n      VULKAN_HPP_HASH_COMBINE( seed, applicationInfo.apiVersion );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AttachmentDescription>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AttachmentDescription const & attachmentDescription ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescription.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescription.format );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescription.samples );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescription.loadOp );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescription.storeOp );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescription.stencilLoadOp );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescription.stencilStoreOp );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescription.initialLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescription.finalLayout );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AttachmentDescription2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AttachmentDescription2 const & attachmentDescription2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescription2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescription2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescription2.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescription2.format );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescription2.samples );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescription2.loadOp );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescription2.storeOp );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescription2.stencilLoadOp );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescription2.stencilStoreOp );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescription2.initialLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescription2.finalLayout );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AttachmentDescriptionStencilLayout>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AttachmentDescriptionStencilLayout const & attachmentDescriptionStencilLayout ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescriptionStencilLayout.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescriptionStencilLayout.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescriptionStencilLayout.stencilInitialLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentDescriptionStencilLayout.stencilFinalLayout );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AttachmentReference>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AttachmentReference const & attachmentReference ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentReference.attachment );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentReference.layout );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AttachmentReference2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AttachmentReference2 const & attachmentReference2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentReference2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentReference2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentReference2.attachment );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentReference2.layout );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentReference2.aspectMask );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AttachmentReferenceStencilLayout>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AttachmentReferenceStencilLayout const & attachmentReferenceStencilLayout ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentReferenceStencilLayout.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentReferenceStencilLayout.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentReferenceStencilLayout.stencilLayout );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AttachmentSampleCountInfoAMD>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AttachmentSampleCountInfoAMD const & attachmentSampleCountInfoAMD ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentSampleCountInfoAMD.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentSampleCountInfoAMD.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentSampleCountInfoAMD.colorAttachmentCount );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentSampleCountInfoAMD.pColorAttachmentSamples );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentSampleCountInfoAMD.depthStencilAttachmentSamples );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::Extent2D>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::Extent2D const & extent2D ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, extent2D.width );\n      VULKAN_HPP_HASH_COMBINE( seed, extent2D.height );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SampleLocationEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SampleLocationEXT const & sampleLocationEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, sampleLocationEXT.x );\n      VULKAN_HPP_HASH_COMBINE( seed, sampleLocationEXT.y );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT const & sampleLocationsInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, sampleLocationsInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, sampleLocationsInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, sampleLocationsInfoEXT.sampleLocationsPerPixel );\n      VULKAN_HPP_HASH_COMBINE( seed, sampleLocationsInfoEXT.sampleLocationGridSize );\n      VULKAN_HPP_HASH_COMBINE( seed, sampleLocationsInfoEXT.sampleLocationsCount );\n      VULKAN_HPP_HASH_COMBINE( seed, sampleLocationsInfoEXT.pSampleLocations );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::AttachmentSampleLocationsEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::AttachmentSampleLocationsEXT const & attachmentSampleLocationsEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentSampleLocationsEXT.attachmentIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, attachmentSampleLocationsEXT.sampleLocationsInfo );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BaseInStructure>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BaseInStructure const & baseInStructure ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, baseInStructure.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, baseInStructure.pNext );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BaseOutStructure>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BaseOutStructure const & baseOutStructure ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, baseOutStructure.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, baseOutStructure.pNext );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BindAccelerationStructureMemoryInfoNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::BindAccelerationStructureMemoryInfoNV const & bindAccelerationStructureMemoryInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bindAccelerationStructureMemoryInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bindAccelerationStructureMemoryInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bindAccelerationStructureMemoryInfoNV.accelerationStructure );\n      VULKAN_HPP_HASH_COMBINE( seed, bindAccelerationStructureMemoryInfoNV.memory );\n      VULKAN_HPP_HASH_COMBINE( seed, bindAccelerationStructureMemoryInfoNV.memoryOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, bindAccelerationStructureMemoryInfoNV.deviceIndexCount );\n      VULKAN_HPP_HASH_COMBINE( seed, bindAccelerationStructureMemoryInfoNV.pDeviceIndices );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BindBufferMemoryDeviceGroupInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BindBufferMemoryDeviceGroupInfo const & bindBufferMemoryDeviceGroupInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bindBufferMemoryDeviceGroupInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bindBufferMemoryDeviceGroupInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bindBufferMemoryDeviceGroupInfo.deviceIndexCount );\n      VULKAN_HPP_HASH_COMBINE( seed, bindBufferMemoryDeviceGroupInfo.pDeviceIndices );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo const & bindBufferMemoryInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bindBufferMemoryInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bindBufferMemoryInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bindBufferMemoryInfo.buffer );\n      VULKAN_HPP_HASH_COMBINE( seed, bindBufferMemoryInfo.memory );\n      VULKAN_HPP_HASH_COMBINE( seed, bindBufferMemoryInfo.memoryOffset );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BindDescriptorBufferEmbeddedSamplersInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BindDescriptorBufferEmbeddedSamplersInfoEXT const & bindDescriptorBufferEmbeddedSamplersInfoEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bindDescriptorBufferEmbeddedSamplersInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bindDescriptorBufferEmbeddedSamplersInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bindDescriptorBufferEmbeddedSamplersInfoEXT.stageFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, bindDescriptorBufferEmbeddedSamplersInfoEXT.layout );\n      VULKAN_HPP_HASH_COMBINE( seed, bindDescriptorBufferEmbeddedSamplersInfoEXT.set );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BindDescriptorSetsInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BindDescriptorSetsInfo const & bindDescriptorSetsInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bindDescriptorSetsInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bindDescriptorSetsInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bindDescriptorSetsInfo.stageFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, bindDescriptorSetsInfo.layout );\n      VULKAN_HPP_HASH_COMBINE( seed, bindDescriptorSetsInfo.firstSet );\n      VULKAN_HPP_HASH_COMBINE( seed, bindDescriptorSetsInfo.descriptorSetCount );\n      VULKAN_HPP_HASH_COMBINE( seed, bindDescriptorSetsInfo.pDescriptorSets );\n      VULKAN_HPP_HASH_COMBINE( seed, bindDescriptorSetsInfo.dynamicOffsetCount );\n      VULKAN_HPP_HASH_COMBINE( seed, bindDescriptorSetsInfo.pDynamicOffsets );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::Offset2D>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::Offset2D const & offset2D ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, offset2D.x );\n      VULKAN_HPP_HASH_COMBINE( seed, offset2D.y );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::Rect2D>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::Rect2D const & rect2D ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, rect2D.offset );\n      VULKAN_HPP_HASH_COMBINE( seed, rect2D.extent );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BindImageMemoryDeviceGroupInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BindImageMemoryDeviceGroupInfo const & bindImageMemoryDeviceGroupInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bindImageMemoryDeviceGroupInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bindImageMemoryDeviceGroupInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bindImageMemoryDeviceGroupInfo.deviceIndexCount );\n      VULKAN_HPP_HASH_COMBINE( seed, bindImageMemoryDeviceGroupInfo.pDeviceIndices );\n      VULKAN_HPP_HASH_COMBINE( seed, bindImageMemoryDeviceGroupInfo.splitInstanceBindRegionCount );\n      VULKAN_HPP_HASH_COMBINE( seed, bindImageMemoryDeviceGroupInfo.pSplitInstanceBindRegions );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BindImageMemoryInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BindImageMemoryInfo const & bindImageMemoryInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bindImageMemoryInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bindImageMemoryInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bindImageMemoryInfo.image );\n      VULKAN_HPP_HASH_COMBINE( seed, bindImageMemoryInfo.memory );\n      VULKAN_HPP_HASH_COMBINE( seed, bindImageMemoryInfo.memoryOffset );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BindImageMemorySwapchainInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BindImageMemorySwapchainInfoKHR const & bindImageMemorySwapchainInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bindImageMemorySwapchainInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bindImageMemorySwapchainInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bindImageMemorySwapchainInfoKHR.swapchain );\n      VULKAN_HPP_HASH_COMBINE( seed, bindImageMemorySwapchainInfoKHR.imageIndex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BindImagePlaneMemoryInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BindImagePlaneMemoryInfo const & bindImagePlaneMemoryInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bindImagePlaneMemoryInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bindImagePlaneMemoryInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bindImagePlaneMemoryInfo.planeAspect );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BindIndexBufferIndirectCommandEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BindIndexBufferIndirectCommandEXT const & bindIndexBufferIndirectCommandEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bindIndexBufferIndirectCommandEXT.bufferAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, bindIndexBufferIndirectCommandEXT.size );\n      VULKAN_HPP_HASH_COMBINE( seed, bindIndexBufferIndirectCommandEXT.indexType );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BindIndexBufferIndirectCommandNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BindIndexBufferIndirectCommandNV const & bindIndexBufferIndirectCommandNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bindIndexBufferIndirectCommandNV.bufferAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, bindIndexBufferIndirectCommandNV.size );\n      VULKAN_HPP_HASH_COMBINE( seed, bindIndexBufferIndirectCommandNV.indexType );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BindMemoryStatus>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BindMemoryStatus const & bindMemoryStatus ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bindMemoryStatus.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bindMemoryStatus.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bindMemoryStatus.pResult );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BindPipelineIndirectCommandNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BindPipelineIndirectCommandNV const & bindPipelineIndirectCommandNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bindPipelineIndirectCommandNV.pipelineAddress );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BindShaderGroupIndirectCommandNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BindShaderGroupIndirectCommandNV const & bindShaderGroupIndirectCommandNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bindShaderGroupIndirectCommandNV.groupIndex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SparseMemoryBind>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SparseMemoryBind const & sparseMemoryBind ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, sparseMemoryBind.resourceOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseMemoryBind.size );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseMemoryBind.memory );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseMemoryBind.memoryOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseMemoryBind.flags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SparseBufferMemoryBindInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SparseBufferMemoryBindInfo const & sparseBufferMemoryBindInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, sparseBufferMemoryBindInfo.buffer );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseBufferMemoryBindInfo.bindCount );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseBufferMemoryBindInfo.pBinds );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SparseImageOpaqueMemoryBindInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SparseImageOpaqueMemoryBindInfo const & sparseImageOpaqueMemoryBindInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageOpaqueMemoryBindInfo.image );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageOpaqueMemoryBindInfo.bindCount );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageOpaqueMemoryBindInfo.pBinds );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageSubresource>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageSubresource const & imageSubresource ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageSubresource.aspectMask );\n      VULKAN_HPP_HASH_COMBINE( seed, imageSubresource.mipLevel );\n      VULKAN_HPP_HASH_COMBINE( seed, imageSubresource.arrayLayer );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::Offset3D>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::Offset3D const & offset3D ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, offset3D.x );\n      VULKAN_HPP_HASH_COMBINE( seed, offset3D.y );\n      VULKAN_HPP_HASH_COMBINE( seed, offset3D.z );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::Extent3D>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::Extent3D const & extent3D ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, extent3D.width );\n      VULKAN_HPP_HASH_COMBINE( seed, extent3D.height );\n      VULKAN_HPP_HASH_COMBINE( seed, extent3D.depth );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SparseImageMemoryBind>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SparseImageMemoryBind const & sparseImageMemoryBind ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageMemoryBind.subresource );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageMemoryBind.offset );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageMemoryBind.extent );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageMemoryBind.memory );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageMemoryBind.memoryOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageMemoryBind.flags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SparseImageMemoryBindInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SparseImageMemoryBindInfo const & sparseImageMemoryBindInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageMemoryBindInfo.image );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageMemoryBindInfo.bindCount );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageMemoryBindInfo.pBinds );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BindSparseInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BindSparseInfo const & bindSparseInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bindSparseInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bindSparseInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bindSparseInfo.waitSemaphoreCount );\n      VULKAN_HPP_HASH_COMBINE( seed, bindSparseInfo.pWaitSemaphores );\n      VULKAN_HPP_HASH_COMBINE( seed, bindSparseInfo.bufferBindCount );\n      VULKAN_HPP_HASH_COMBINE( seed, bindSparseInfo.pBufferBinds );\n      VULKAN_HPP_HASH_COMBINE( seed, bindSparseInfo.imageOpaqueBindCount );\n      VULKAN_HPP_HASH_COMBINE( seed, bindSparseInfo.pImageOpaqueBinds );\n      VULKAN_HPP_HASH_COMBINE( seed, bindSparseInfo.imageBindCount );\n      VULKAN_HPP_HASH_COMBINE( seed, bindSparseInfo.pImageBinds );\n      VULKAN_HPP_HASH_COMBINE( seed, bindSparseInfo.signalSemaphoreCount );\n      VULKAN_HPP_HASH_COMBINE( seed, bindSparseInfo.pSignalSemaphores );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BindVertexBufferIndirectCommandEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BindVertexBufferIndirectCommandEXT const & bindVertexBufferIndirectCommandEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bindVertexBufferIndirectCommandEXT.bufferAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, bindVertexBufferIndirectCommandEXT.size );\n      VULKAN_HPP_HASH_COMBINE( seed, bindVertexBufferIndirectCommandEXT.stride );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BindVertexBufferIndirectCommandNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BindVertexBufferIndirectCommandNV const & bindVertexBufferIndirectCommandNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bindVertexBufferIndirectCommandNV.bufferAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, bindVertexBufferIndirectCommandNV.size );\n      VULKAN_HPP_HASH_COMBINE( seed, bindVertexBufferIndirectCommandNV.stride );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BindVideoSessionMemoryInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BindVideoSessionMemoryInfoKHR const & bindVideoSessionMemoryInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bindVideoSessionMemoryInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bindVideoSessionMemoryInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bindVideoSessionMemoryInfoKHR.memoryBindIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, bindVideoSessionMemoryInfoKHR.memory );\n      VULKAN_HPP_HASH_COMBINE( seed, bindVideoSessionMemoryInfoKHR.memoryOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, bindVideoSessionMemoryInfoKHR.memorySize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BlitImageCubicWeightsInfoQCOM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BlitImageCubicWeightsInfoQCOM const & blitImageCubicWeightsInfoQCOM ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, blitImageCubicWeightsInfoQCOM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, blitImageCubicWeightsInfoQCOM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, blitImageCubicWeightsInfoQCOM.cubicWeights );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageSubresourceLayers>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const & imageSubresourceLayers ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageSubresourceLayers.aspectMask );\n      VULKAN_HPP_HASH_COMBINE( seed, imageSubresourceLayers.mipLevel );\n      VULKAN_HPP_HASH_COMBINE( seed, imageSubresourceLayers.baseArrayLayer );\n      VULKAN_HPP_HASH_COMBINE( seed, imageSubresourceLayers.layerCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageBlit2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageBlit2 const & imageBlit2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageBlit2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageBlit2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageBlit2.srcSubresource );\n      for ( size_t i = 0; i < 2; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, imageBlit2.srcOffsets[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, imageBlit2.dstSubresource );\n      for ( size_t i = 0; i < 2; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, imageBlit2.dstOffsets[i] );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BlitImageInfo2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BlitImageInfo2 const & blitImageInfo2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, blitImageInfo2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, blitImageInfo2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, blitImageInfo2.srcImage );\n      VULKAN_HPP_HASH_COMBINE( seed, blitImageInfo2.srcImageLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, blitImageInfo2.dstImage );\n      VULKAN_HPP_HASH_COMBINE( seed, blitImageInfo2.dstImageLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, blitImageInfo2.regionCount );\n      VULKAN_HPP_HASH_COMBINE( seed, blitImageInfo2.pRegions );\n      VULKAN_HPP_HASH_COMBINE( seed, blitImageInfo2.filter );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BufferCaptureDescriptorDataInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BufferCaptureDescriptorDataInfoEXT const & bufferCaptureDescriptorDataInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCaptureDescriptorDataInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCaptureDescriptorDataInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCaptureDescriptorDataInfoEXT.buffer );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BufferCollectionBufferCreateInfoFUCHSIA>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::BufferCollectionBufferCreateInfoFUCHSIA const & bufferCollectionBufferCreateInfoFUCHSIA ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionBufferCreateInfoFUCHSIA.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionBufferCreateInfoFUCHSIA.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionBufferCreateInfoFUCHSIA.collection );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionBufferCreateInfoFUCHSIA.index );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BufferCollectionConstraintsInfoFUCHSIA>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::BufferCollectionConstraintsInfoFUCHSIA const & bufferCollectionConstraintsInfoFUCHSIA ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionConstraintsInfoFUCHSIA.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionConstraintsInfoFUCHSIA.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionConstraintsInfoFUCHSIA.minBufferCount );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionConstraintsInfoFUCHSIA.maxBufferCount );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionConstraintsInfoFUCHSIA.minBufferCountForCamping );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionConstraintsInfoFUCHSIA.minBufferCountForDedicatedSlack );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionConstraintsInfoFUCHSIA.minBufferCountForSharedSlack );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BufferCollectionCreateInfoFUCHSIA>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BufferCollectionCreateInfoFUCHSIA const & bufferCollectionCreateInfoFUCHSIA ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionCreateInfoFUCHSIA.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionCreateInfoFUCHSIA.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionCreateInfoFUCHSIA.collectionToken );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BufferCollectionImageCreateInfoFUCHSIA>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::BufferCollectionImageCreateInfoFUCHSIA const & bufferCollectionImageCreateInfoFUCHSIA ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionImageCreateInfoFUCHSIA.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionImageCreateInfoFUCHSIA.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionImageCreateInfoFUCHSIA.collection );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionImageCreateInfoFUCHSIA.index );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SysmemColorSpaceFUCHSIA>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SysmemColorSpaceFUCHSIA const & sysmemColorSpaceFUCHSIA ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, sysmemColorSpaceFUCHSIA.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, sysmemColorSpaceFUCHSIA.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, sysmemColorSpaceFUCHSIA.colorSpace );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BufferCollectionPropertiesFUCHSIA>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BufferCollectionPropertiesFUCHSIA const & bufferCollectionPropertiesFUCHSIA ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionPropertiesFUCHSIA.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionPropertiesFUCHSIA.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionPropertiesFUCHSIA.memoryTypeBits );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionPropertiesFUCHSIA.bufferCount );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionPropertiesFUCHSIA.createInfoIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionPropertiesFUCHSIA.sysmemPixelFormat );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionPropertiesFUCHSIA.formatFeatures );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionPropertiesFUCHSIA.sysmemColorSpaceIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionPropertiesFUCHSIA.samplerYcbcrConversionComponents );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionPropertiesFUCHSIA.suggestedYcbcrModel );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionPropertiesFUCHSIA.suggestedYcbcrRange );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionPropertiesFUCHSIA.suggestedXChromaOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCollectionPropertiesFUCHSIA.suggestedYChromaOffset );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BufferCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BufferCreateInfo const & bufferCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCreateInfo.size );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCreateInfo.usage );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCreateInfo.sharingMode );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCreateInfo.queueFamilyIndexCount );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCreateInfo.pQueueFamilyIndices );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BufferConstraintsInfoFUCHSIA>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BufferConstraintsInfoFUCHSIA const & bufferConstraintsInfoFUCHSIA ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bufferConstraintsInfoFUCHSIA.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferConstraintsInfoFUCHSIA.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferConstraintsInfoFUCHSIA.createInfo );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferConstraintsInfoFUCHSIA.requiredFormatFeatures );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferConstraintsInfoFUCHSIA.bufferCollectionConstraints );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BufferCopy>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BufferCopy const & bufferCopy ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCopy.srcOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCopy.dstOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCopy.size );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BufferCopy2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BufferCopy2 const & bufferCopy2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCopy2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCopy2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCopy2.srcOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCopy2.dstOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferCopy2.size );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BufferDeviceAddressCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BufferDeviceAddressCreateInfoEXT const & bufferDeviceAddressCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bufferDeviceAddressCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferDeviceAddressCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferDeviceAddressCreateInfoEXT.deviceAddress );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo const & bufferDeviceAddressInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bufferDeviceAddressInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferDeviceAddressInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferDeviceAddressInfo.buffer );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BufferImageCopy>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BufferImageCopy const & bufferImageCopy ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bufferImageCopy.bufferOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferImageCopy.bufferRowLength );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferImageCopy.bufferImageHeight );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferImageCopy.imageSubresource );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferImageCopy.imageOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferImageCopy.imageExtent );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BufferImageCopy2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BufferImageCopy2 const & bufferImageCopy2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bufferImageCopy2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferImageCopy2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferImageCopy2.bufferOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferImageCopy2.bufferRowLength );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferImageCopy2.bufferImageHeight );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferImageCopy2.imageSubresource );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferImageCopy2.imageOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferImageCopy2.imageExtent );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BufferMemoryBarrier>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BufferMemoryBarrier const & bufferMemoryBarrier ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bufferMemoryBarrier.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferMemoryBarrier.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferMemoryBarrier.srcAccessMask );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferMemoryBarrier.dstAccessMask );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferMemoryBarrier.srcQueueFamilyIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferMemoryBarrier.dstQueueFamilyIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferMemoryBarrier.buffer );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferMemoryBarrier.offset );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferMemoryBarrier.size );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BufferMemoryBarrier2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BufferMemoryBarrier2 const & bufferMemoryBarrier2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bufferMemoryBarrier2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferMemoryBarrier2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferMemoryBarrier2.srcStageMask );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferMemoryBarrier2.srcAccessMask );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferMemoryBarrier2.dstStageMask );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferMemoryBarrier2.dstAccessMask );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferMemoryBarrier2.srcQueueFamilyIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferMemoryBarrier2.dstQueueFamilyIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferMemoryBarrier2.buffer );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferMemoryBarrier2.offset );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferMemoryBarrier2.size );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 const & bufferMemoryRequirementsInfo2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bufferMemoryRequirementsInfo2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferMemoryRequirementsInfo2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferMemoryRequirementsInfo2.buffer );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BufferOpaqueCaptureAddressCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BufferOpaqueCaptureAddressCreateInfo const & bufferOpaqueCaptureAddressCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bufferOpaqueCaptureAddressCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferOpaqueCaptureAddressCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferOpaqueCaptureAddressCreateInfo.opaqueCaptureAddress );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BufferUsageFlags2CreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BufferUsageFlags2CreateInfo const & bufferUsageFlags2CreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bufferUsageFlags2CreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferUsageFlags2CreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferUsageFlags2CreateInfo.usage );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BufferViewCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BufferViewCreateInfo const & bufferViewCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, bufferViewCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferViewCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferViewCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferViewCreateInfo.buffer );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferViewCreateInfo.format );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferViewCreateInfo.offset );\n      VULKAN_HPP_HASH_COMBINE( seed, bufferViewCreateInfo.range );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::StridedDeviceAddressNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::StridedDeviceAddressNV const & stridedDeviceAddressNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, stridedDeviceAddressNV.startAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, stridedDeviceAddressNV.strideInBytes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BuildPartitionedAccelerationStructureIndirectCommandNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BuildPartitionedAccelerationStructureIndirectCommandNV const &\n                              buildPartitionedAccelerationStructureIndirectCommandNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, buildPartitionedAccelerationStructureIndirectCommandNV.opType );\n      VULKAN_HPP_HASH_COMBINE( seed, buildPartitionedAccelerationStructureIndirectCommandNV.argCount );\n      VULKAN_HPP_HASH_COMBINE( seed, buildPartitionedAccelerationStructureIndirectCommandNV.argData );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureInstancesInputNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureInstancesInputNV const & partitionedAccelerationStructureInstancesInputNV )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureInstancesInputNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureInstancesInputNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureInstancesInputNV.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureInstancesInputNV.instanceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureInstancesInputNV.maxInstancePerPartitionCount );\n      VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureInstancesInputNV.partitionCount );\n      VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureInstancesInputNV.maxInstanceInGlobalPartitionCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::BuildPartitionedAccelerationStructureInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::BuildPartitionedAccelerationStructureInfoNV const & buildPartitionedAccelerationStructureInfoNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, buildPartitionedAccelerationStructureInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, buildPartitionedAccelerationStructureInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, buildPartitionedAccelerationStructureInfoNV.input );\n      VULKAN_HPP_HASH_COMBINE( seed, buildPartitionedAccelerationStructureInfoNV.srcAccelerationStructureData );\n      VULKAN_HPP_HASH_COMBINE( seed, buildPartitionedAccelerationStructureInfoNV.dstAccelerationStructureData );\n      VULKAN_HPP_HASH_COMBINE( seed, buildPartitionedAccelerationStructureInfoNV.scratchData );\n      VULKAN_HPP_HASH_COMBINE( seed, buildPartitionedAccelerationStructureInfoNV.srcInfos );\n      VULKAN_HPP_HASH_COMBINE( seed, buildPartitionedAccelerationStructureInfoNV.srcInfosCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR const & calibratedTimestampInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, calibratedTimestampInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, calibratedTimestampInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, calibratedTimestampInfoKHR.timeDomain );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CheckpointData2NV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CheckpointData2NV const & checkpointData2NV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, checkpointData2NV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, checkpointData2NV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, checkpointData2NV.stage );\n      VULKAN_HPP_HASH_COMBINE( seed, checkpointData2NV.pCheckpointMarker );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CheckpointDataNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CheckpointDataNV const & checkpointDataNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, checkpointDataNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, checkpointDataNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, checkpointDataNV.stage );\n      VULKAN_HPP_HASH_COMBINE( seed, checkpointDataNV.pCheckpointMarker );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ClearDepthStencilValue>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ClearDepthStencilValue const & clearDepthStencilValue ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, clearDepthStencilValue.depth );\n      VULKAN_HPP_HASH_COMBINE( seed, clearDepthStencilValue.stencil );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ClearRect>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ClearRect const & clearRect ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, clearRect.rect );\n      VULKAN_HPP_HASH_COMBINE( seed, clearRect.baseArrayLayer );\n      VULKAN_HPP_HASH_COMBINE( seed, clearRect.layerCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureBuildClustersBottomLevelInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureBuildClustersBottomLevelInfoNV const &\n                              clusterAccelerationStructureBuildClustersBottomLevelInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildClustersBottomLevelInfoNV.clusterReferencesCount );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildClustersBottomLevelInfoNV.clusterReferencesStride );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildClustersBottomLevelInfoNV.clusterReferences );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV const &\n                              clusterAccelerationStructureGeometryIndexAndGeometryFlagsNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureGeometryIndexAndGeometryFlagsNV.geometryIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureGeometryIndexAndGeometryFlagsNV.reserved );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureGeometryIndexAndGeometryFlagsNV.geometryFlags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureBuildTriangleClusterInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureBuildTriangleClusterInfoNV const &\n                              clusterAccelerationStructureBuildTriangleClusterInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterInfoNV.clusterID );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterInfoNV.clusterFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterInfoNV.triangleCount );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterInfoNV.vertexCount );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterInfoNV.positionTruncateBitCount );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterInfoNV.indexType );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterInfoNV.opacityMicromapIndexType );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterInfoNV.baseGeometryIndexAndGeometryFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterInfoNV.indexBufferStride );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterInfoNV.vertexBufferStride );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterInfoNV.geometryIndexAndFlagsBufferStride );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterInfoNV.opacityMicromapIndexBufferStride );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterInfoNV.indexBuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterInfoNV.vertexBuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterInfoNV.geometryIndexAndFlagsBuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterInfoNV.opacityMicromapArray );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterInfoNV.opacityMicromapIndexBuffer );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV const &\n                              clusterAccelerationStructureBuildTriangleClusterTemplateInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterTemplateInfoNV.clusterID );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterTemplateInfoNV.clusterFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterTemplateInfoNV.triangleCount );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterTemplateInfoNV.vertexCount );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterTemplateInfoNV.positionTruncateBitCount );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterTemplateInfoNV.indexType );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterTemplateInfoNV.opacityMicromapIndexType );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterTemplateInfoNV.baseGeometryIndexAndGeometryFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterTemplateInfoNV.indexBufferStride );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterTemplateInfoNV.vertexBufferStride );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterTemplateInfoNV.geometryIndexAndFlagsBufferStride );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterTemplateInfoNV.opacityMicromapIndexBufferStride );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterTemplateInfoNV.indexBuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterTemplateInfoNV.vertexBuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterTemplateInfoNV.geometryIndexAndFlagsBuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterTemplateInfoNV.opacityMicromapArray );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterTemplateInfoNV.opacityMicromapIndexBuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureBuildTriangleClusterTemplateInfoNV.instantiationBoundingBoxLimit );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureClustersBottomLevelInputNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureClustersBottomLevelInputNV const &\n                              clusterAccelerationStructureClustersBottomLevelInputNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureClustersBottomLevelInputNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureClustersBottomLevelInputNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureClustersBottomLevelInputNV.maxTotalClusterCount );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureClustersBottomLevelInputNV.maxClusterCountPerAccelerationStructure );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureTriangleClusterInputNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureTriangleClusterInputNV const & clusterAccelerationStructureTriangleClusterInputNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureTriangleClusterInputNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureTriangleClusterInputNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureTriangleClusterInputNV.vertexFormat );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureTriangleClusterInputNV.maxGeometryIndexValue );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureTriangleClusterInputNV.maxClusterUniqueGeometryCount );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureTriangleClusterInputNV.maxClusterTriangleCount );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureTriangleClusterInputNV.maxClusterVertexCount );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureTriangleClusterInputNV.maxTotalTriangleCount );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureTriangleClusterInputNV.maxTotalVertexCount );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureTriangleClusterInputNV.minPositionTruncateBitCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureMoveObjectsInputNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureMoveObjectsInputNV const & clusterAccelerationStructureMoveObjectsInputNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureMoveObjectsInputNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureMoveObjectsInputNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureMoveObjectsInputNV.type );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureMoveObjectsInputNV.noMoveOverlap );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureMoveObjectsInputNV.maxMovedBytes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR const & stridedDeviceAddressRegionKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, stridedDeviceAddressRegionKHR.deviceAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, stridedDeviceAddressRegionKHR.stride );\n      VULKAN_HPP_HASH_COMBINE( seed, stridedDeviceAddressRegionKHR.size );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureInstantiateClusterInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureInstantiateClusterInfoNV const &\n                              clusterAccelerationStructureInstantiateClusterInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureInstantiateClusterInfoNV.clusterIdOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureInstantiateClusterInfoNV.geometryIndexOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureInstantiateClusterInfoNV.reserved );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureInstantiateClusterInfoNV.clusterTemplateAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureInstantiateClusterInfoNV.vertexBuffer );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureMoveObjectsInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureMoveObjectsInfoNV const & clusterAccelerationStructureMoveObjectsInfoNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, clusterAccelerationStructureMoveObjectsInfoNV.srcAccelerationStructure );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CoarseSampleLocationNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CoarseSampleLocationNV const & coarseSampleLocationNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, coarseSampleLocationNV.pixelX );\n      VULKAN_HPP_HASH_COMBINE( seed, coarseSampleLocationNV.pixelY );\n      VULKAN_HPP_HASH_COMBINE( seed, coarseSampleLocationNV.sample );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV const & coarseSampleOrderCustomNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, coarseSampleOrderCustomNV.shadingRate );\n      VULKAN_HPP_HASH_COMBINE( seed, coarseSampleOrderCustomNV.sampleCount );\n      VULKAN_HPP_HASH_COMBINE( seed, coarseSampleOrderCustomNV.sampleLocationCount );\n      VULKAN_HPP_HASH_COMBINE( seed, coarseSampleOrderCustomNV.pSampleLocations );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ColorBlendAdvancedEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ColorBlendAdvancedEXT const & colorBlendAdvancedEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, colorBlendAdvancedEXT.advancedBlendOp );\n      VULKAN_HPP_HASH_COMBINE( seed, colorBlendAdvancedEXT.srcPremultiplied );\n      VULKAN_HPP_HASH_COMBINE( seed, colorBlendAdvancedEXT.dstPremultiplied );\n      VULKAN_HPP_HASH_COMBINE( seed, colorBlendAdvancedEXT.blendOverlap );\n      VULKAN_HPP_HASH_COMBINE( seed, colorBlendAdvancedEXT.clampResults );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ColorBlendEquationEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ColorBlendEquationEXT const & colorBlendEquationEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, colorBlendEquationEXT.srcColorBlendFactor );\n      VULKAN_HPP_HASH_COMBINE( seed, colorBlendEquationEXT.dstColorBlendFactor );\n      VULKAN_HPP_HASH_COMBINE( seed, colorBlendEquationEXT.colorBlendOp );\n      VULKAN_HPP_HASH_COMBINE( seed, colorBlendEquationEXT.srcAlphaBlendFactor );\n      VULKAN_HPP_HASH_COMBINE( seed, colorBlendEquationEXT.dstAlphaBlendFactor );\n      VULKAN_HPP_HASH_COMBINE( seed, colorBlendEquationEXT.alphaBlendOp );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo const & commandBufferAllocateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferAllocateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferAllocateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferAllocateInfo.commandPool );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferAllocateInfo.level );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferAllocateInfo.commandBufferCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CommandBufferInheritanceInfo const & commandBufferInheritanceInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceInfo.renderPass );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceInfo.subpass );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceInfo.framebuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceInfo.occlusionQueryEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceInfo.queryFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceInfo.pipelineStatistics );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CommandBufferBeginInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CommandBufferBeginInfo const & commandBufferBeginInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferBeginInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferBeginInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferBeginInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferBeginInfo.pInheritanceInfo );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceConditionalRenderingInfoEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::CommandBufferInheritanceConditionalRenderingInfoEXT const & commandBufferInheritanceConditionalRenderingInfoEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceConditionalRenderingInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceConditionalRenderingInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceConditionalRenderingInfoEXT.conditionalRenderingEnable );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceRenderPassTransformInfoQCOM>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::CommandBufferInheritanceRenderPassTransformInfoQCOM const & commandBufferInheritanceRenderPassTransformInfoQCOM ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceRenderPassTransformInfoQCOM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceRenderPassTransformInfoQCOM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceRenderPassTransformInfoQCOM.transform );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceRenderPassTransformInfoQCOM.renderArea );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceRenderingInfo>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::CommandBufferInheritanceRenderingInfo const & commandBufferInheritanceRenderingInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceRenderingInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceRenderingInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceRenderingInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceRenderingInfo.viewMask );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceRenderingInfo.colorAttachmentCount );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceRenderingInfo.pColorAttachmentFormats );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceRenderingInfo.depthAttachmentFormat );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceRenderingInfo.stencilAttachmentFormat );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceRenderingInfo.rasterizationSamples );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::Viewport>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::Viewport const & viewport ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, viewport.x );\n      VULKAN_HPP_HASH_COMBINE( seed, viewport.y );\n      VULKAN_HPP_HASH_COMBINE( seed, viewport.width );\n      VULKAN_HPP_HASH_COMBINE( seed, viewport.height );\n      VULKAN_HPP_HASH_COMBINE( seed, viewport.minDepth );\n      VULKAN_HPP_HASH_COMBINE( seed, viewport.maxDepth );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceViewportScissorInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CommandBufferInheritanceViewportScissorInfoNV const & commandBufferInheritanceViewportScissorInfoNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceViewportScissorInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceViewportScissorInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceViewportScissorInfoNV.viewportScissor2D );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceViewportScissorInfoNV.viewportDepthCount );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferInheritanceViewportScissorInfoNV.pViewportDepths );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CommandBufferSubmitInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CommandBufferSubmitInfo const & commandBufferSubmitInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferSubmitInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferSubmitInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferSubmitInfo.commandBuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, commandBufferSubmitInfo.deviceMask );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CommandPoolCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CommandPoolCreateInfo const & commandPoolCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, commandPoolCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, commandPoolCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, commandPoolCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, commandPoolCreateInfo.queueFamilyIndex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SpecializationMapEntry>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SpecializationMapEntry const & specializationMapEntry ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, specializationMapEntry.constantID );\n      VULKAN_HPP_HASH_COMBINE( seed, specializationMapEntry.offset );\n      VULKAN_HPP_HASH_COMBINE( seed, specializationMapEntry.size );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SpecializationInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SpecializationInfo const & specializationInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, specializationInfo.mapEntryCount );\n      VULKAN_HPP_HASH_COMBINE( seed, specializationInfo.pMapEntries );\n      VULKAN_HPP_HASH_COMBINE( seed, specializationInfo.dataSize );\n      VULKAN_HPP_HASH_COMBINE( seed, specializationInfo.pData );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo const & pipelineShaderStageCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineShaderStageCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineShaderStageCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineShaderStageCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineShaderStageCreateInfo.stage );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineShaderStageCreateInfo.module );\n      for ( const char * p = pipelineShaderStageCreateInfo.pName; *p != '\\0'; ++p )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, *p );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineShaderStageCreateInfo.pSpecializationInfo );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo const & computePipelineCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, computePipelineCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, computePipelineCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, computePipelineCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, computePipelineCreateInfo.stage );\n      VULKAN_HPP_HASH_COMBINE( seed, computePipelineCreateInfo.layout );\n      VULKAN_HPP_HASH_COMBINE( seed, computePipelineCreateInfo.basePipelineHandle );\n      VULKAN_HPP_HASH_COMBINE( seed, computePipelineCreateInfo.basePipelineIndex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ComputePipelineIndirectBufferInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ComputePipelineIndirectBufferInfoNV const & computePipelineIndirectBufferInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, computePipelineIndirectBufferInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, computePipelineIndirectBufferInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, computePipelineIndirectBufferInfoNV.deviceAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, computePipelineIndirectBufferInfoNV.size );\n      VULKAN_HPP_HASH_COMBINE( seed, computePipelineIndirectBufferInfoNV.pipelineDeviceAddressCaptureReplay );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ConditionalRenderingBeginInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ConditionalRenderingBeginInfoEXT const & conditionalRenderingBeginInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, conditionalRenderingBeginInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, conditionalRenderingBeginInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, conditionalRenderingBeginInfoEXT.buffer );\n      VULKAN_HPP_HASH_COMBINE( seed, conditionalRenderingBeginInfoEXT.offset );\n      VULKAN_HPP_HASH_COMBINE( seed, conditionalRenderingBeginInfoEXT.flags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ConformanceVersion>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ConformanceVersion const & conformanceVersion ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, conformanceVersion.major );\n      VULKAN_HPP_HASH_COMBINE( seed, conformanceVersion.minor );\n      VULKAN_HPP_HASH_COMBINE( seed, conformanceVersion.subminor );\n      VULKAN_HPP_HASH_COMBINE( seed, conformanceVersion.patch );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CooperativeMatrixFlexibleDimensionsPropertiesNV>\n  {\n    std::size_t operator()(\n      VULKAN_HPP_NAMESPACE::CooperativeMatrixFlexibleDimensionsPropertiesNV const & cooperativeMatrixFlexibleDimensionsPropertiesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixFlexibleDimensionsPropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixFlexibleDimensionsPropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixFlexibleDimensionsPropertiesNV.MGranularity );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixFlexibleDimensionsPropertiesNV.NGranularity );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixFlexibleDimensionsPropertiesNV.KGranularity );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixFlexibleDimensionsPropertiesNV.AType );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixFlexibleDimensionsPropertiesNV.BType );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixFlexibleDimensionsPropertiesNV.CType );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixFlexibleDimensionsPropertiesNV.ResultType );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixFlexibleDimensionsPropertiesNV.saturatingAccumulation );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixFlexibleDimensionsPropertiesNV.scope );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixFlexibleDimensionsPropertiesNV.workgroupInvocations );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesKHR const & cooperativeMatrixPropertiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixPropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixPropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixPropertiesKHR.MSize );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixPropertiesKHR.NSize );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixPropertiesKHR.KSize );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixPropertiesKHR.AType );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixPropertiesKHR.BType );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixPropertiesKHR.CType );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixPropertiesKHR.ResultType );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixPropertiesKHR.saturatingAccumulation );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixPropertiesKHR.scope );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV const & cooperativeMatrixPropertiesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixPropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixPropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixPropertiesNV.MSize );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixPropertiesNV.NSize );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixPropertiesNV.KSize );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixPropertiesNV.AType );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixPropertiesNV.BType );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixPropertiesNV.CType );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixPropertiesNV.DType );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeMatrixPropertiesNV.scope );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CooperativeVectorPropertiesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CooperativeVectorPropertiesNV const & cooperativeVectorPropertiesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeVectorPropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeVectorPropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeVectorPropertiesNV.inputType );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeVectorPropertiesNV.inputInterpretation );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeVectorPropertiesNV.matrixInterpretation );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeVectorPropertiesNV.biasInterpretation );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeVectorPropertiesNV.resultType );\n      VULKAN_HPP_HASH_COMBINE( seed, cooperativeVectorPropertiesNV.transpose );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR const & copyAccelerationStructureInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, copyAccelerationStructureInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, copyAccelerationStructureInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, copyAccelerationStructureInfoKHR.src );\n      VULKAN_HPP_HASH_COMBINE( seed, copyAccelerationStructureInfoKHR.dst );\n      VULKAN_HPP_HASH_COMBINE( seed, copyAccelerationStructureInfoKHR.mode );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CopyBufferInfo2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CopyBufferInfo2 const & copyBufferInfo2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, copyBufferInfo2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, copyBufferInfo2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, copyBufferInfo2.srcBuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, copyBufferInfo2.dstBuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, copyBufferInfo2.regionCount );\n      VULKAN_HPP_HASH_COMBINE( seed, copyBufferInfo2.pRegions );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2 const & copyBufferToImageInfo2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, copyBufferToImageInfo2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, copyBufferToImageInfo2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, copyBufferToImageInfo2.srcBuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, copyBufferToImageInfo2.dstImage );\n      VULKAN_HPP_HASH_COMBINE( seed, copyBufferToImageInfo2.dstImageLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, copyBufferToImageInfo2.regionCount );\n      VULKAN_HPP_HASH_COMBINE( seed, copyBufferToImageInfo2.pRegions );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CopyCommandTransformInfoQCOM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CopyCommandTransformInfoQCOM const & copyCommandTransformInfoQCOM ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, copyCommandTransformInfoQCOM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, copyCommandTransformInfoQCOM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, copyCommandTransformInfoQCOM.transform );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CopyDescriptorSet>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CopyDescriptorSet const & copyDescriptorSet ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, copyDescriptorSet.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, copyDescriptorSet.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, copyDescriptorSet.srcSet );\n      VULKAN_HPP_HASH_COMBINE( seed, copyDescriptorSet.srcBinding );\n      VULKAN_HPP_HASH_COMBINE( seed, copyDescriptorSet.srcArrayElement );\n      VULKAN_HPP_HASH_COMBINE( seed, copyDescriptorSet.dstSet );\n      VULKAN_HPP_HASH_COMBINE( seed, copyDescriptorSet.dstBinding );\n      VULKAN_HPP_HASH_COMBINE( seed, copyDescriptorSet.dstArrayElement );\n      VULKAN_HPP_HASH_COMBINE( seed, copyDescriptorSet.descriptorCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageCopy2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageCopy2 const & imageCopy2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageCopy2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCopy2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCopy2.srcSubresource );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCopy2.srcOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCopy2.dstSubresource );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCopy2.dstOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCopy2.extent );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CopyImageInfo2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CopyImageInfo2 const & copyImageInfo2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageInfo2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageInfo2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageInfo2.srcImage );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageInfo2.srcImageLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageInfo2.dstImage );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageInfo2.dstImageLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageInfo2.regionCount );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageInfo2.pRegions );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2 const & copyImageToBufferInfo2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageToBufferInfo2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageToBufferInfo2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageToBufferInfo2.srcImage );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageToBufferInfo2.srcImageLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageToBufferInfo2.dstBuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageToBufferInfo2.regionCount );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageToBufferInfo2.pRegions );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CopyImageToImageInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CopyImageToImageInfo const & copyImageToImageInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageToImageInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageToImageInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageToImageInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageToImageInfo.srcImage );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageToImageInfo.srcImageLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageToImageInfo.dstImage );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageToImageInfo.dstImageLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageToImageInfo.regionCount );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageToImageInfo.pRegions );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageToMemoryCopy>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageToMemoryCopy const & imageToMemoryCopy ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageToMemoryCopy.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageToMemoryCopy.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageToMemoryCopy.pHostPointer );\n      VULKAN_HPP_HASH_COMBINE( seed, imageToMemoryCopy.memoryRowLength );\n      VULKAN_HPP_HASH_COMBINE( seed, imageToMemoryCopy.memoryImageHeight );\n      VULKAN_HPP_HASH_COMBINE( seed, imageToMemoryCopy.imageSubresource );\n      VULKAN_HPP_HASH_COMBINE( seed, imageToMemoryCopy.imageOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, imageToMemoryCopy.imageExtent );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CopyImageToMemoryInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CopyImageToMemoryInfo const & copyImageToMemoryInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageToMemoryInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageToMemoryInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageToMemoryInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageToMemoryInfo.srcImage );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageToMemoryInfo.srcImageLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageToMemoryInfo.regionCount );\n      VULKAN_HPP_HASH_COMBINE( seed, copyImageToMemoryInfo.pRegions );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CopyMemoryIndirectCommandNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CopyMemoryIndirectCommandNV const & copyMemoryIndirectCommandNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, copyMemoryIndirectCommandNV.srcAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, copyMemoryIndirectCommandNV.dstAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, copyMemoryIndirectCommandNV.size );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CopyMemoryToImageIndirectCommandNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CopyMemoryToImageIndirectCommandNV const & copyMemoryToImageIndirectCommandNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, copyMemoryToImageIndirectCommandNV.srcAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, copyMemoryToImageIndirectCommandNV.bufferRowLength );\n      VULKAN_HPP_HASH_COMBINE( seed, copyMemoryToImageIndirectCommandNV.bufferImageHeight );\n      VULKAN_HPP_HASH_COMBINE( seed, copyMemoryToImageIndirectCommandNV.imageSubresource );\n      VULKAN_HPP_HASH_COMBINE( seed, copyMemoryToImageIndirectCommandNV.imageOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, copyMemoryToImageIndirectCommandNV.imageExtent );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryToImageCopy>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryToImageCopy const & memoryToImageCopy ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryToImageCopy.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryToImageCopy.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryToImageCopy.pHostPointer );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryToImageCopy.memoryRowLength );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryToImageCopy.memoryImageHeight );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryToImageCopy.imageSubresource );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryToImageCopy.imageOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryToImageCopy.imageExtent );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CopyMemoryToImageInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CopyMemoryToImageInfo const & copyMemoryToImageInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, copyMemoryToImageInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, copyMemoryToImageInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, copyMemoryToImageInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, copyMemoryToImageInfo.dstImage );\n      VULKAN_HPP_HASH_COMBINE( seed, copyMemoryToImageInfo.dstImageLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, copyMemoryToImageInfo.regionCount );\n      VULKAN_HPP_HASH_COMBINE( seed, copyMemoryToImageInfo.pRegions );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CopyMicromapInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CopyMicromapInfoEXT const & copyMicromapInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, copyMicromapInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, copyMicromapInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, copyMicromapInfoEXT.src );\n      VULKAN_HPP_HASH_COMBINE( seed, copyMicromapInfoEXT.dst );\n      VULKAN_HPP_HASH_COMBINE( seed, copyMicromapInfoEXT.mode );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CuFunctionCreateInfoNVX>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CuFunctionCreateInfoNVX const & cuFunctionCreateInfoNVX ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, cuFunctionCreateInfoNVX.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, cuFunctionCreateInfoNVX.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, cuFunctionCreateInfoNVX.module );\n      for ( const char * p = cuFunctionCreateInfoNVX.pName; *p != '\\0'; ++p )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, *p );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CuLaunchInfoNVX>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CuLaunchInfoNVX const & cuLaunchInfoNVX ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, cuLaunchInfoNVX.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, cuLaunchInfoNVX.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, cuLaunchInfoNVX.function );\n      VULKAN_HPP_HASH_COMBINE( seed, cuLaunchInfoNVX.gridDimX );\n      VULKAN_HPP_HASH_COMBINE( seed, cuLaunchInfoNVX.gridDimY );\n      VULKAN_HPP_HASH_COMBINE( seed, cuLaunchInfoNVX.gridDimZ );\n      VULKAN_HPP_HASH_COMBINE( seed, cuLaunchInfoNVX.blockDimX );\n      VULKAN_HPP_HASH_COMBINE( seed, cuLaunchInfoNVX.blockDimY );\n      VULKAN_HPP_HASH_COMBINE( seed, cuLaunchInfoNVX.blockDimZ );\n      VULKAN_HPP_HASH_COMBINE( seed, cuLaunchInfoNVX.sharedMemBytes );\n      VULKAN_HPP_HASH_COMBINE( seed, cuLaunchInfoNVX.paramCount );\n      VULKAN_HPP_HASH_COMBINE( seed, cuLaunchInfoNVX.pParams );\n      VULKAN_HPP_HASH_COMBINE( seed, cuLaunchInfoNVX.extraCount );\n      VULKAN_HPP_HASH_COMBINE( seed, cuLaunchInfoNVX.pExtras );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CuModuleCreateInfoNVX>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CuModuleCreateInfoNVX const & cuModuleCreateInfoNVX ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, cuModuleCreateInfoNVX.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, cuModuleCreateInfoNVX.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, cuModuleCreateInfoNVX.dataSize );\n      VULKAN_HPP_HASH_COMBINE( seed, cuModuleCreateInfoNVX.pData );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CuModuleTexturingModeCreateInfoNVX>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CuModuleTexturingModeCreateInfoNVX const & cuModuleTexturingModeCreateInfoNVX ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, cuModuleTexturingModeCreateInfoNVX.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, cuModuleTexturingModeCreateInfoNVX.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, cuModuleTexturingModeCreateInfoNVX.use64bitTexturing );\n      return seed;\n    }\n  };\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CudaFunctionCreateInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CudaFunctionCreateInfoNV const & cudaFunctionCreateInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, cudaFunctionCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, cudaFunctionCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, cudaFunctionCreateInfoNV.module );\n      for ( const char * p = cudaFunctionCreateInfoNV.pName; *p != '\\0'; ++p )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, *p );\n      }\n      return seed;\n    }\n  };\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CudaLaunchInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CudaLaunchInfoNV const & cudaLaunchInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, cudaLaunchInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, cudaLaunchInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, cudaLaunchInfoNV.function );\n      VULKAN_HPP_HASH_COMBINE( seed, cudaLaunchInfoNV.gridDimX );\n      VULKAN_HPP_HASH_COMBINE( seed, cudaLaunchInfoNV.gridDimY );\n      VULKAN_HPP_HASH_COMBINE( seed, cudaLaunchInfoNV.gridDimZ );\n      VULKAN_HPP_HASH_COMBINE( seed, cudaLaunchInfoNV.blockDimX );\n      VULKAN_HPP_HASH_COMBINE( seed, cudaLaunchInfoNV.blockDimY );\n      VULKAN_HPP_HASH_COMBINE( seed, cudaLaunchInfoNV.blockDimZ );\n      VULKAN_HPP_HASH_COMBINE( seed, cudaLaunchInfoNV.sharedMemBytes );\n      VULKAN_HPP_HASH_COMBINE( seed, cudaLaunchInfoNV.paramCount );\n      VULKAN_HPP_HASH_COMBINE( seed, cudaLaunchInfoNV.pParams );\n      VULKAN_HPP_HASH_COMBINE( seed, cudaLaunchInfoNV.extraCount );\n      VULKAN_HPP_HASH_COMBINE( seed, cudaLaunchInfoNV.pExtras );\n      return seed;\n    }\n  };\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::CudaModuleCreateInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::CudaModuleCreateInfoNV const & cudaModuleCreateInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, cudaModuleCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, cudaModuleCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, cudaModuleCreateInfoNV.dataSize );\n      VULKAN_HPP_HASH_COMBINE( seed, cudaModuleCreateInfoNV.pData );\n      return seed;\n    }\n  };\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::D3D12FenceSubmitInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::D3D12FenceSubmitInfoKHR const & d3D12FenceSubmitInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, d3D12FenceSubmitInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, d3D12FenceSubmitInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, d3D12FenceSubmitInfoKHR.waitSemaphoreValuesCount );\n      VULKAN_HPP_HASH_COMBINE( seed, d3D12FenceSubmitInfoKHR.pWaitSemaphoreValues );\n      VULKAN_HPP_HASH_COMBINE( seed, d3D12FenceSubmitInfoKHR.signalSemaphoreValuesCount );\n      VULKAN_HPP_HASH_COMBINE( seed, d3D12FenceSubmitInfoKHR.pSignalSemaphoreValues );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT const & debugMarkerMarkerInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, debugMarkerMarkerInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, debugMarkerMarkerInfoEXT.pNext );\n      for ( const char * p = debugMarkerMarkerInfoEXT.pMarkerName; *p != '\\0'; ++p )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, *p );\n      }\n      for ( size_t i = 0; i < 4; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, debugMarkerMarkerInfoEXT.color[i] );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DebugMarkerObjectNameInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DebugMarkerObjectNameInfoEXT const & debugMarkerObjectNameInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, debugMarkerObjectNameInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, debugMarkerObjectNameInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, debugMarkerObjectNameInfoEXT.objectType );\n      VULKAN_HPP_HASH_COMBINE( seed, debugMarkerObjectNameInfoEXT.object );\n      for ( const char * p = debugMarkerObjectNameInfoEXT.pObjectName; *p != '\\0'; ++p )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, *p );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DebugMarkerObjectTagInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DebugMarkerObjectTagInfoEXT const & debugMarkerObjectTagInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, debugMarkerObjectTagInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, debugMarkerObjectTagInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, debugMarkerObjectTagInfoEXT.objectType );\n      VULKAN_HPP_HASH_COMBINE( seed, debugMarkerObjectTagInfoEXT.object );\n      VULKAN_HPP_HASH_COMBINE( seed, debugMarkerObjectTagInfoEXT.tagName );\n      VULKAN_HPP_HASH_COMBINE( seed, debugMarkerObjectTagInfoEXT.tagSize );\n      VULKAN_HPP_HASH_COMBINE( seed, debugMarkerObjectTagInfoEXT.pTag );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DebugReportCallbackCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DebugReportCallbackCreateInfoEXT const & debugReportCallbackCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, debugReportCallbackCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, debugReportCallbackCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, debugReportCallbackCreateInfoEXT.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, debugReportCallbackCreateInfoEXT.pfnCallback );\n      VULKAN_HPP_HASH_COMBINE( seed, debugReportCallbackCreateInfoEXT.pUserData );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT const & debugUtilsLabelEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsLabelEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsLabelEXT.pNext );\n      for ( const char * p = debugUtilsLabelEXT.pLabelName; *p != '\\0'; ++p )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, *p );\n      }\n      for ( size_t i = 0; i < 4; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, debugUtilsLabelEXT.color[i] );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT const & debugUtilsObjectNameInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsObjectNameInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsObjectNameInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsObjectNameInfoEXT.objectType );\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsObjectNameInfoEXT.objectHandle );\n      for ( const char * p = debugUtilsObjectNameInfoEXT.pObjectName; *p != '\\0'; ++p )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, *p );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCallbackDataEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCallbackDataEXT const & debugUtilsMessengerCallbackDataEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsMessengerCallbackDataEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsMessengerCallbackDataEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsMessengerCallbackDataEXT.flags );\n      for ( const char * p = debugUtilsMessengerCallbackDataEXT.pMessageIdName; *p != '\\0'; ++p )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, *p );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsMessengerCallbackDataEXT.messageIdNumber );\n      for ( const char * p = debugUtilsMessengerCallbackDataEXT.pMessage; *p != '\\0'; ++p )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, *p );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsMessengerCallbackDataEXT.queueLabelCount );\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsMessengerCallbackDataEXT.pQueueLabels );\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsMessengerCallbackDataEXT.cmdBufLabelCount );\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsMessengerCallbackDataEXT.pCmdBufLabels );\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsMessengerCallbackDataEXT.objectCount );\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsMessengerCallbackDataEXT.pObjects );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateInfoEXT const & debugUtilsMessengerCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsMessengerCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsMessengerCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsMessengerCreateInfoEXT.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsMessengerCreateInfoEXT.messageSeverity );\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsMessengerCreateInfoEXT.messageType );\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsMessengerCreateInfoEXT.pfnUserCallback );\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsMessengerCreateInfoEXT.pUserData );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DebugUtilsObjectTagInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DebugUtilsObjectTagInfoEXT const & debugUtilsObjectTagInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsObjectTagInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsObjectTagInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsObjectTagInfoEXT.objectType );\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsObjectTagInfoEXT.objectHandle );\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsObjectTagInfoEXT.tagName );\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsObjectTagInfoEXT.tagSize );\n      VULKAN_HPP_HASH_COMBINE( seed, debugUtilsObjectTagInfoEXT.pTag );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DecompressMemoryRegionNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DecompressMemoryRegionNV const & decompressMemoryRegionNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, decompressMemoryRegionNV.srcAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, decompressMemoryRegionNV.dstAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, decompressMemoryRegionNV.compressedSize );\n      VULKAN_HPP_HASH_COMBINE( seed, decompressMemoryRegionNV.decompressedSize );\n      VULKAN_HPP_HASH_COMBINE( seed, decompressMemoryRegionNV.decompressionMethod );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DedicatedAllocationBufferCreateInfoNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::DedicatedAllocationBufferCreateInfoNV const & dedicatedAllocationBufferCreateInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, dedicatedAllocationBufferCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, dedicatedAllocationBufferCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, dedicatedAllocationBufferCreateInfoNV.dedicatedAllocation );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DedicatedAllocationImageCreateInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DedicatedAllocationImageCreateInfoNV const & dedicatedAllocationImageCreateInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, dedicatedAllocationImageCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, dedicatedAllocationImageCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, dedicatedAllocationImageCreateInfoNV.dedicatedAllocation );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DedicatedAllocationMemoryAllocateInfoNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::DedicatedAllocationMemoryAllocateInfoNV const & dedicatedAllocationMemoryAllocateInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, dedicatedAllocationMemoryAllocateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, dedicatedAllocationMemoryAllocateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, dedicatedAllocationMemoryAllocateInfoNV.image );\n      VULKAN_HPP_HASH_COMBINE( seed, dedicatedAllocationMemoryAllocateInfoNV.buffer );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryBarrier2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryBarrier2 const & memoryBarrier2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryBarrier2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryBarrier2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryBarrier2.srcStageMask );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryBarrier2.srcAccessMask );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryBarrier2.dstStageMask );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryBarrier2.dstAccessMask );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageSubresourceRange>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageSubresourceRange const & imageSubresourceRange ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageSubresourceRange.aspectMask );\n      VULKAN_HPP_HASH_COMBINE( seed, imageSubresourceRange.baseMipLevel );\n      VULKAN_HPP_HASH_COMBINE( seed, imageSubresourceRange.levelCount );\n      VULKAN_HPP_HASH_COMBINE( seed, imageSubresourceRange.baseArrayLayer );\n      VULKAN_HPP_HASH_COMBINE( seed, imageSubresourceRange.layerCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageMemoryBarrier2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageMemoryBarrier2 const & imageMemoryBarrier2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryBarrier2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryBarrier2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryBarrier2.srcStageMask );\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryBarrier2.srcAccessMask );\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryBarrier2.dstStageMask );\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryBarrier2.dstAccessMask );\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryBarrier2.oldLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryBarrier2.newLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryBarrier2.srcQueueFamilyIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryBarrier2.dstQueueFamilyIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryBarrier2.image );\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryBarrier2.subresourceRange );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DependencyInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DependencyInfo const & dependencyInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, dependencyInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, dependencyInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, dependencyInfo.dependencyFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, dependencyInfo.memoryBarrierCount );\n      VULKAN_HPP_HASH_COMBINE( seed, dependencyInfo.pMemoryBarriers );\n      VULKAN_HPP_HASH_COMBINE( seed, dependencyInfo.bufferMemoryBarrierCount );\n      VULKAN_HPP_HASH_COMBINE( seed, dependencyInfo.pBufferMemoryBarriers );\n      VULKAN_HPP_HASH_COMBINE( seed, dependencyInfo.imageMemoryBarrierCount );\n      VULKAN_HPP_HASH_COMBINE( seed, dependencyInfo.pImageMemoryBarriers );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DepthBiasInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DepthBiasInfoEXT const & depthBiasInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, depthBiasInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, depthBiasInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, depthBiasInfoEXT.depthBiasConstantFactor );\n      VULKAN_HPP_HASH_COMBINE( seed, depthBiasInfoEXT.depthBiasClamp );\n      VULKAN_HPP_HASH_COMBINE( seed, depthBiasInfoEXT.depthBiasSlopeFactor );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DepthBiasRepresentationInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DepthBiasRepresentationInfoEXT const & depthBiasRepresentationInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, depthBiasRepresentationInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, depthBiasRepresentationInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, depthBiasRepresentationInfoEXT.depthBiasRepresentation );\n      VULKAN_HPP_HASH_COMBINE( seed, depthBiasRepresentationInfoEXT.depthBiasExact );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DepthClampRangeEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DepthClampRangeEXT const & depthClampRangeEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, depthClampRangeEXT.minDepthClamp );\n      VULKAN_HPP_HASH_COMBINE( seed, depthClampRangeEXT.maxDepthClamp );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DescriptorAddressInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DescriptorAddressInfoEXT const & descriptorAddressInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorAddressInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorAddressInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorAddressInfoEXT.address );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorAddressInfoEXT.range );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorAddressInfoEXT.format );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DescriptorBufferBindingInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DescriptorBufferBindingInfoEXT const & descriptorBufferBindingInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorBufferBindingInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorBufferBindingInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorBufferBindingInfoEXT.address );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorBufferBindingInfoEXT.usage );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DescriptorBufferBindingPushDescriptorBufferHandleEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DescriptorBufferBindingPushDescriptorBufferHandleEXT const &\n                              descriptorBufferBindingPushDescriptorBufferHandleEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorBufferBindingPushDescriptorBufferHandleEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorBufferBindingPushDescriptorBufferHandleEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorBufferBindingPushDescriptorBufferHandleEXT.buffer );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DescriptorBufferInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DescriptorBufferInfo const & descriptorBufferInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorBufferInfo.buffer );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorBufferInfo.offset );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorBufferInfo.range );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DescriptorImageInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DescriptorImageInfo const & descriptorImageInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorImageInfo.sampler );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorImageInfo.imageView );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorImageInfo.imageLayout );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DescriptorPoolSize>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DescriptorPoolSize const & descriptorPoolSize ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorPoolSize.type );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorPoolSize.descriptorCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DescriptorPoolCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DescriptorPoolCreateInfo const & descriptorPoolCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorPoolCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorPoolCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorPoolCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorPoolCreateInfo.maxSets );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorPoolCreateInfo.poolSizeCount );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorPoolCreateInfo.pPoolSizes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DescriptorPoolInlineUniformBlockCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DescriptorPoolInlineUniformBlockCreateInfo const & descriptorPoolInlineUniformBlockCreateInfo ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorPoolInlineUniformBlockCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorPoolInlineUniformBlockCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorPoolInlineUniformBlockCreateInfo.maxInlineUniformBlockBindings );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo const & descriptorSetAllocateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetAllocateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetAllocateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetAllocateInfo.descriptorPool );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetAllocateInfo.descriptorSetCount );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetAllocateInfo.pSetLayouts );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DescriptorSetBindingReferenceVALVE>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DescriptorSetBindingReferenceVALVE const & descriptorSetBindingReferenceVALVE ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetBindingReferenceVALVE.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetBindingReferenceVALVE.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetBindingReferenceVALVE.descriptorSetLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetBindingReferenceVALVE.binding );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutBinding>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DescriptorSetLayoutBinding const & descriptorSetLayoutBinding ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetLayoutBinding.binding );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetLayoutBinding.descriptorType );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetLayoutBinding.descriptorCount );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetLayoutBinding.stageFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetLayoutBinding.pImmutableSamplers );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutBindingFlagsCreateInfo>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::DescriptorSetLayoutBindingFlagsCreateInfo const & descriptorSetLayoutBindingFlagsCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetLayoutBindingFlagsCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetLayoutBindingFlagsCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetLayoutBindingFlagsCreateInfo.bindingCount );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetLayoutBindingFlagsCreateInfo.pBindingFlags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo const & descriptorSetLayoutCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetLayoutCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetLayoutCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetLayoutCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetLayoutCreateInfo.bindingCount );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetLayoutCreateInfo.pBindings );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutHostMappingInfoVALVE>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::DescriptorSetLayoutHostMappingInfoVALVE const & descriptorSetLayoutHostMappingInfoVALVE ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetLayoutHostMappingInfoVALVE.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetLayoutHostMappingInfoVALVE.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetLayoutHostMappingInfoVALVE.descriptorOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetLayoutHostMappingInfoVALVE.descriptorSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport const & descriptorSetLayoutSupport ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetLayoutSupport.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetLayoutSupport.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetLayoutSupport.supported );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DescriptorSetVariableDescriptorCountAllocateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DescriptorSetVariableDescriptorCountAllocateInfo const & descriptorSetVariableDescriptorCountAllocateInfo )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetVariableDescriptorCountAllocateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetVariableDescriptorCountAllocateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetVariableDescriptorCountAllocateInfo.descriptorSetCount );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetVariableDescriptorCountAllocateInfo.pDescriptorCounts );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DescriptorSetVariableDescriptorCountLayoutSupport>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DescriptorSetVariableDescriptorCountLayoutSupport const & descriptorSetVariableDescriptorCountLayoutSupport )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetVariableDescriptorCountLayoutSupport.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetVariableDescriptorCountLayoutSupport.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorSetVariableDescriptorCountLayoutSupport.maxVariableDescriptorCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateEntry>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateEntry const & descriptorUpdateTemplateEntry ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorUpdateTemplateEntry.dstBinding );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorUpdateTemplateEntry.dstArrayElement );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorUpdateTemplateEntry.descriptorCount );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorUpdateTemplateEntry.descriptorType );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorUpdateTemplateEntry.offset );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorUpdateTemplateEntry.stride );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo const & descriptorUpdateTemplateCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorUpdateTemplateCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorUpdateTemplateCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorUpdateTemplateCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorUpdateTemplateCreateInfo.descriptorUpdateEntryCount );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorUpdateTemplateCreateInfo.pDescriptorUpdateEntries );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorUpdateTemplateCreateInfo.templateType );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorUpdateTemplateCreateInfo.descriptorSetLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorUpdateTemplateCreateInfo.pipelineBindPoint );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorUpdateTemplateCreateInfo.pipelineLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, descriptorUpdateTemplateCreateInfo.set );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceAddressBindingCallbackDataEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceAddressBindingCallbackDataEXT const & deviceAddressBindingCallbackDataEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceAddressBindingCallbackDataEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceAddressBindingCallbackDataEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceAddressBindingCallbackDataEXT.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceAddressBindingCallbackDataEXT.baseAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceAddressBindingCallbackDataEXT.size );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceAddressBindingCallbackDataEXT.bindingType );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements const & deviceBufferMemoryRequirements ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceBufferMemoryRequirements.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceBufferMemoryRequirements.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceBufferMemoryRequirements.pCreateInfo );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceQueueCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceQueueCreateInfo const & deviceQueueCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceQueueCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceQueueCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceQueueCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceQueueCreateInfo.queueFamilyIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceQueueCreateInfo.queueCount );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceQueueCreateInfo.pQueuePriorities );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures const & physicalDeviceFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.robustBufferAccess );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.fullDrawIndexUint32 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.imageCubeArray );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.independentBlend );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.geometryShader );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.tessellationShader );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.sampleRateShading );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.dualSrcBlend );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.logicOp );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.multiDrawIndirect );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.drawIndirectFirstInstance );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.depthClamp );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.depthBiasClamp );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.fillModeNonSolid );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.depthBounds );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.wideLines );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.largePoints );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.alphaToOne );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.multiViewport );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.samplerAnisotropy );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.textureCompressionETC2 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.textureCompressionASTC_LDR );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.textureCompressionBC );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.occlusionQueryPrecise );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.pipelineStatisticsQuery );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.vertexPipelineStoresAndAtomics );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.fragmentStoresAndAtomics );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.shaderTessellationAndGeometryPointSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.shaderImageGatherExtended );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.shaderStorageImageExtendedFormats );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.shaderStorageImageMultisample );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.shaderStorageImageReadWithoutFormat );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.shaderStorageImageWriteWithoutFormat );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.shaderUniformBufferArrayDynamicIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.shaderSampledImageArrayDynamicIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.shaderStorageBufferArrayDynamicIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.shaderStorageImageArrayDynamicIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.shaderClipDistance );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.shaderCullDistance );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.shaderFloat64 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.shaderInt64 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.shaderInt16 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.shaderResourceResidency );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.shaderResourceMinLod );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.sparseBinding );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.sparseResidencyBuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.sparseResidencyImage2D );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.sparseResidencyImage3D );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.sparseResidency2Samples );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.sparseResidency4Samples );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.sparseResidency8Samples );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.sparseResidency16Samples );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.sparseResidencyAliased );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.variableMultisampleRate );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures.inheritedQueries );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceCreateInfo const & deviceCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceCreateInfo.queueCreateInfoCount );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceCreateInfo.pQueueCreateInfos );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceCreateInfo.enabledLayerCount );\n      for ( size_t i = 0; i < deviceCreateInfo.enabledLayerCount; ++i )\n      {\n        for ( const char * p = deviceCreateInfo.ppEnabledLayerNames[i]; *p != '\\0'; ++p )\n        {\n          VULKAN_HPP_HASH_COMBINE( seed, *p );\n        }\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, deviceCreateInfo.enabledExtensionCount );\n      for ( size_t i = 0; i < deviceCreateInfo.enabledExtensionCount; ++i )\n      {\n        for ( const char * p = deviceCreateInfo.ppEnabledExtensionNames[i]; *p != '\\0'; ++p )\n        {\n          VULKAN_HPP_HASH_COMBINE( seed, *p );\n        }\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, deviceCreateInfo.pEnabledFeatures );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceDeviceMemoryReportCreateInfoEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::DeviceDeviceMemoryReportCreateInfoEXT const & deviceDeviceMemoryReportCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceDeviceMemoryReportCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceDeviceMemoryReportCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceDeviceMemoryReportCreateInfoEXT.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceDeviceMemoryReportCreateInfoEXT.pfnUserCallback );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceDeviceMemoryReportCreateInfoEXT.pUserData );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceDiagnosticsConfigCreateInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceDiagnosticsConfigCreateInfoNV const & deviceDiagnosticsConfigCreateInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceDiagnosticsConfigCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceDiagnosticsConfigCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceDiagnosticsConfigCreateInfoNV.flags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceEventInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceEventInfoEXT const & deviceEventInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceEventInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceEventInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceEventInfoEXT.deviceEvent );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceFaultAddressInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceFaultAddressInfoEXT const & deviceFaultAddressInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultAddressInfoEXT.addressType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultAddressInfoEXT.reportedAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultAddressInfoEXT.addressPrecision );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceFaultCountsEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceFaultCountsEXT const & deviceFaultCountsEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultCountsEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultCountsEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultCountsEXT.addressInfoCount );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultCountsEXT.vendorInfoCount );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultCountsEXT.vendorBinarySize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceFaultVendorInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceFaultVendorInfoEXT const & deviceFaultVendorInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      for ( size_t i = 0; i < VK_MAX_DESCRIPTION_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, deviceFaultVendorInfoEXT.description[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultVendorInfoEXT.vendorFaultCode );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultVendorInfoEXT.vendorFaultData );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceFaultInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceFaultInfoEXT const & deviceFaultInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultInfoEXT.pNext );\n      for ( size_t i = 0; i < VK_MAX_DESCRIPTION_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, deviceFaultInfoEXT.description[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultInfoEXT.pAddressInfos );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultInfoEXT.pVendorInfos );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultInfoEXT.pVendorBinaryData );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceFaultVendorBinaryHeaderVersionOneEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceFaultVendorBinaryHeaderVersionOneEXT const & deviceFaultVendorBinaryHeaderVersionOneEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultVendorBinaryHeaderVersionOneEXT.headerSize );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultVendorBinaryHeaderVersionOneEXT.headerVersion );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultVendorBinaryHeaderVersionOneEXT.vendorID );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultVendorBinaryHeaderVersionOneEXT.deviceID );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultVendorBinaryHeaderVersionOneEXT.driverVersion );\n      for ( size_t i = 0; i < VK_UUID_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, deviceFaultVendorBinaryHeaderVersionOneEXT.pipelineCacheUUID[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultVendorBinaryHeaderVersionOneEXT.applicationNameOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultVendorBinaryHeaderVersionOneEXT.applicationVersion );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultVendorBinaryHeaderVersionOneEXT.engineNameOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultVendorBinaryHeaderVersionOneEXT.engineVersion );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceFaultVendorBinaryHeaderVersionOneEXT.apiVersion );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceGroupBindSparseInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceGroupBindSparseInfo const & deviceGroupBindSparseInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupBindSparseInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupBindSparseInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupBindSparseInfo.resourceDeviceIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupBindSparseInfo.memoryDeviceIndex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceGroupCommandBufferBeginInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceGroupCommandBufferBeginInfo const & deviceGroupCommandBufferBeginInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupCommandBufferBeginInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupCommandBufferBeginInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupCommandBufferBeginInfo.deviceMask );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceGroupDeviceCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceGroupDeviceCreateInfo const & deviceGroupDeviceCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupDeviceCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupDeviceCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupDeviceCreateInfo.physicalDeviceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupDeviceCreateInfo.pPhysicalDevices );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceGroupPresentCapabilitiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceGroupPresentCapabilitiesKHR const & deviceGroupPresentCapabilitiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupPresentCapabilitiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupPresentCapabilitiesKHR.pNext );\n      for ( size_t i = 0; i < VK_MAX_DEVICE_GROUP_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, deviceGroupPresentCapabilitiesKHR.presentMask[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupPresentCapabilitiesKHR.modes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceGroupPresentInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceGroupPresentInfoKHR const & deviceGroupPresentInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupPresentInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupPresentInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupPresentInfoKHR.swapchainCount );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupPresentInfoKHR.pDeviceMasks );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupPresentInfoKHR.mode );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceGroupRenderPassBeginInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceGroupRenderPassBeginInfo const & deviceGroupRenderPassBeginInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupRenderPassBeginInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupRenderPassBeginInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupRenderPassBeginInfo.deviceMask );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupRenderPassBeginInfo.deviceRenderAreaCount );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupRenderPassBeginInfo.pDeviceRenderAreas );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceGroupSubmitInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceGroupSubmitInfo const & deviceGroupSubmitInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupSubmitInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupSubmitInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupSubmitInfo.waitSemaphoreCount );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupSubmitInfo.pWaitSemaphoreDeviceIndices );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupSubmitInfo.commandBufferCount );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupSubmitInfo.pCommandBufferDeviceMasks );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupSubmitInfo.signalSemaphoreCount );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupSubmitInfo.pSignalSemaphoreDeviceIndices );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceGroupSwapchainCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceGroupSwapchainCreateInfoKHR const & deviceGroupSwapchainCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupSwapchainCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupSwapchainCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceGroupSwapchainCreateInfoKHR.modes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageCreateInfo const & imageCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCreateInfo.imageType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCreateInfo.format );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCreateInfo.extent );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCreateInfo.mipLevels );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCreateInfo.arrayLayers );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCreateInfo.samples );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCreateInfo.tiling );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCreateInfo.usage );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCreateInfo.sharingMode );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCreateInfo.queueFamilyIndexCount );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCreateInfo.pQueueFamilyIndices );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCreateInfo.initialLayout );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements const & deviceImageMemoryRequirements ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceImageMemoryRequirements.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceImageMemoryRequirements.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceImageMemoryRequirements.pCreateInfo );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceImageMemoryRequirements.planeAspect );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageSubresource2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageSubresource2 const & imageSubresource2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageSubresource2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageSubresource2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageSubresource2.imageSubresource );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo const & deviceImageSubresourceInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceImageSubresourceInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceImageSubresourceInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceImageSubresourceInfo.pCreateInfo );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceImageSubresourceInfo.pSubresource );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo const & deviceMemoryOpaqueCaptureAddressInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceMemoryOpaqueCaptureAddressInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceMemoryOpaqueCaptureAddressInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceMemoryOpaqueCaptureAddressInfo.memory );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceMemoryOverallocationCreateInfoAMD>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::DeviceMemoryOverallocationCreateInfoAMD const & deviceMemoryOverallocationCreateInfoAMD ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceMemoryOverallocationCreateInfoAMD.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceMemoryOverallocationCreateInfoAMD.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceMemoryOverallocationCreateInfoAMD.overallocationBehavior );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceMemoryReportCallbackDataEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceMemoryReportCallbackDataEXT const & deviceMemoryReportCallbackDataEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceMemoryReportCallbackDataEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceMemoryReportCallbackDataEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceMemoryReportCallbackDataEXT.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceMemoryReportCallbackDataEXT.type );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceMemoryReportCallbackDataEXT.memoryObjectId );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceMemoryReportCallbackDataEXT.size );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceMemoryReportCallbackDataEXT.objectType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceMemoryReportCallbackDataEXT.objectHandle );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceMemoryReportCallbackDataEXT.heapIndex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DevicePipelineBinaryInternalCacheControlKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DevicePipelineBinaryInternalCacheControlKHR const & devicePipelineBinaryInternalCacheControlKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, devicePipelineBinaryInternalCacheControlKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, devicePipelineBinaryInternalCacheControlKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, devicePipelineBinaryInternalCacheControlKHR.disableInternalCache );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DevicePrivateDataCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DevicePrivateDataCreateInfo const & devicePrivateDataCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, devicePrivateDataCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, devicePrivateDataCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, devicePrivateDataCreateInfo.privateDataSlotRequestCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceQueueGlobalPriorityCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceQueueGlobalPriorityCreateInfo const & deviceQueueGlobalPriorityCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceQueueGlobalPriorityCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceQueueGlobalPriorityCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceQueueGlobalPriorityCreateInfo.globalPriority );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceQueueInfo2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceQueueInfo2 const & deviceQueueInfo2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceQueueInfo2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceQueueInfo2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceQueueInfo2.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceQueueInfo2.queueFamilyIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceQueueInfo2.queueIndex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DeviceQueueShaderCoreControlCreateInfoARM>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::DeviceQueueShaderCoreControlCreateInfoARM const & deviceQueueShaderCoreControlCreateInfoARM ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, deviceQueueShaderCoreControlCreateInfoARM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceQueueShaderCoreControlCreateInfoARM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, deviceQueueShaderCoreControlCreateInfoARM.shaderCoreCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DirectDriverLoadingInfoLUNARG>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DirectDriverLoadingInfoLUNARG const & directDriverLoadingInfoLUNARG ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, directDriverLoadingInfoLUNARG.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, directDriverLoadingInfoLUNARG.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, directDriverLoadingInfoLUNARG.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, directDriverLoadingInfoLUNARG.pfnGetInstanceProcAddr );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DirectDriverLoadingListLUNARG>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DirectDriverLoadingListLUNARG const & directDriverLoadingListLUNARG ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, directDriverLoadingListLUNARG.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, directDriverLoadingListLUNARG.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, directDriverLoadingListLUNARG.mode );\n      VULKAN_HPP_HASH_COMBINE( seed, directDriverLoadingListLUNARG.driverCount );\n      VULKAN_HPP_HASH_COMBINE( seed, directDriverLoadingListLUNARG.pDrivers );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateInfoEXT const & directFBSurfaceCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, directFBSurfaceCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, directFBSurfaceCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, directFBSurfaceCreateInfoEXT.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, directFBSurfaceCreateInfoEXT.dfb );\n      VULKAN_HPP_HASH_COMBINE( seed, directFBSurfaceCreateInfoEXT.surface );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DispatchIndirectCommand>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DispatchIndirectCommand const & dispatchIndirectCommand ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, dispatchIndirectCommand.x );\n      VULKAN_HPP_HASH_COMBINE( seed, dispatchIndirectCommand.y );\n      VULKAN_HPP_HASH_COMBINE( seed, dispatchIndirectCommand.z );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DisplayEventInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DisplayEventInfoEXT const & displayEventInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, displayEventInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, displayEventInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, displayEventInfoEXT.displayEvent );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DisplayModeParametersKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DisplayModeParametersKHR const & displayModeParametersKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, displayModeParametersKHR.visibleRegion );\n      VULKAN_HPP_HASH_COMBINE( seed, displayModeParametersKHR.refreshRate );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DisplayModeCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DisplayModeCreateInfoKHR const & displayModeCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, displayModeCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, displayModeCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, displayModeCreateInfoKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, displayModeCreateInfoKHR.parameters );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR const & displayModePropertiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, displayModePropertiesKHR.displayMode );\n      VULKAN_HPP_HASH_COMBINE( seed, displayModePropertiesKHR.parameters );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR const & displayModeProperties2KHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, displayModeProperties2KHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, displayModeProperties2KHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, displayModeProperties2KHR.displayModeProperties );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DisplayModeStereoPropertiesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DisplayModeStereoPropertiesNV const & displayModeStereoPropertiesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, displayModeStereoPropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, displayModeStereoPropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, displayModeStereoPropertiesNV.hdmi3DSupported );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DisplayNativeHdrSurfaceCapabilitiesAMD>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::DisplayNativeHdrSurfaceCapabilitiesAMD const & displayNativeHdrSurfaceCapabilitiesAMD ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, displayNativeHdrSurfaceCapabilitiesAMD.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, displayNativeHdrSurfaceCapabilitiesAMD.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, displayNativeHdrSurfaceCapabilitiesAMD.localDimmingSupport );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR const & displayPlaneCapabilitiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, displayPlaneCapabilitiesKHR.supportedAlpha );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPlaneCapabilitiesKHR.minSrcPosition );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPlaneCapabilitiesKHR.maxSrcPosition );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPlaneCapabilitiesKHR.minSrcExtent );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPlaneCapabilitiesKHR.maxSrcExtent );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPlaneCapabilitiesKHR.minDstPosition );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPlaneCapabilitiesKHR.maxDstPosition );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPlaneCapabilitiesKHR.minDstExtent );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPlaneCapabilitiesKHR.maxDstExtent );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilities2KHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilities2KHR const & displayPlaneCapabilities2KHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, displayPlaneCapabilities2KHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPlaneCapabilities2KHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPlaneCapabilities2KHR.capabilities );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DisplayPlaneInfo2KHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DisplayPlaneInfo2KHR const & displayPlaneInfo2KHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, displayPlaneInfo2KHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPlaneInfo2KHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPlaneInfo2KHR.mode );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPlaneInfo2KHR.planeIndex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR const & displayPlanePropertiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, displayPlanePropertiesKHR.currentDisplay );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPlanePropertiesKHR.currentStackIndex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR const & displayPlaneProperties2KHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, displayPlaneProperties2KHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPlaneProperties2KHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPlaneProperties2KHR.displayPlaneProperties );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DisplayPowerInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DisplayPowerInfoEXT const & displayPowerInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, displayPowerInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPowerInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPowerInfoEXT.powerState );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DisplayPresentInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DisplayPresentInfoKHR const & displayPresentInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, displayPresentInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPresentInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPresentInfoKHR.srcRect );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPresentInfoKHR.dstRect );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPresentInfoKHR.persistent );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR const & displayPropertiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, displayPropertiesKHR.display );\n      for ( const char * p = displayPropertiesKHR.displayName; *p != '\\0'; ++p )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, *p );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, displayPropertiesKHR.physicalDimensions );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPropertiesKHR.physicalResolution );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPropertiesKHR.supportedTransforms );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPropertiesKHR.planeReorderPossible );\n      VULKAN_HPP_HASH_COMBINE( seed, displayPropertiesKHR.persistentContent );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DisplayProperties2KHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DisplayProperties2KHR const & displayProperties2KHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, displayProperties2KHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, displayProperties2KHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, displayProperties2KHR.displayProperties );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateInfoKHR const & displaySurfaceCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, displaySurfaceCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, displaySurfaceCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, displaySurfaceCreateInfoKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, displaySurfaceCreateInfoKHR.displayMode );\n      VULKAN_HPP_HASH_COMBINE( seed, displaySurfaceCreateInfoKHR.planeIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, displaySurfaceCreateInfoKHR.planeStackIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, displaySurfaceCreateInfoKHR.transform );\n      VULKAN_HPP_HASH_COMBINE( seed, displaySurfaceCreateInfoKHR.globalAlpha );\n      VULKAN_HPP_HASH_COMBINE( seed, displaySurfaceCreateInfoKHR.alphaMode );\n      VULKAN_HPP_HASH_COMBINE( seed, displaySurfaceCreateInfoKHR.imageExtent );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DisplaySurfaceStereoCreateInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DisplaySurfaceStereoCreateInfoNV const & displaySurfaceStereoCreateInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, displaySurfaceStereoCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, displaySurfaceStereoCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, displaySurfaceStereoCreateInfoNV.stereoType );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DrawIndexedIndirectCommand>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DrawIndexedIndirectCommand const & drawIndexedIndirectCommand ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, drawIndexedIndirectCommand.indexCount );\n      VULKAN_HPP_HASH_COMBINE( seed, drawIndexedIndirectCommand.instanceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, drawIndexedIndirectCommand.firstIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, drawIndexedIndirectCommand.vertexOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, drawIndexedIndirectCommand.firstInstance );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DrawIndirectCommand>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DrawIndirectCommand const & drawIndirectCommand ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, drawIndirectCommand.vertexCount );\n      VULKAN_HPP_HASH_COMBINE( seed, drawIndirectCommand.instanceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, drawIndirectCommand.firstVertex );\n      VULKAN_HPP_HASH_COMBINE( seed, drawIndirectCommand.firstInstance );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DrawIndirectCountIndirectCommandEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DrawIndirectCountIndirectCommandEXT const & drawIndirectCountIndirectCommandEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, drawIndirectCountIndirectCommandEXT.bufferAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, drawIndirectCountIndirectCommandEXT.stride );\n      VULKAN_HPP_HASH_COMBINE( seed, drawIndirectCountIndirectCommandEXT.commandCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DrawMeshTasksIndirectCommandEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DrawMeshTasksIndirectCommandEXT const & drawMeshTasksIndirectCommandEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, drawMeshTasksIndirectCommandEXT.groupCountX );\n      VULKAN_HPP_HASH_COMBINE( seed, drawMeshTasksIndirectCommandEXT.groupCountY );\n      VULKAN_HPP_HASH_COMBINE( seed, drawMeshTasksIndirectCommandEXT.groupCountZ );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DrawMeshTasksIndirectCommandNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DrawMeshTasksIndirectCommandNV const & drawMeshTasksIndirectCommandNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, drawMeshTasksIndirectCommandNV.taskCount );\n      VULKAN_HPP_HASH_COMBINE( seed, drawMeshTasksIndirectCommandNV.firstTask );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DrmFormatModifierProperties2EXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DrmFormatModifierProperties2EXT const & drmFormatModifierProperties2EXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, drmFormatModifierProperties2EXT.drmFormatModifier );\n      VULKAN_HPP_HASH_COMBINE( seed, drmFormatModifierProperties2EXT.drmFormatModifierPlaneCount );\n      VULKAN_HPP_HASH_COMBINE( seed, drmFormatModifierProperties2EXT.drmFormatModifierTilingFeatures );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesEXT const & drmFormatModifierPropertiesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, drmFormatModifierPropertiesEXT.drmFormatModifier );\n      VULKAN_HPP_HASH_COMBINE( seed, drmFormatModifierPropertiesEXT.drmFormatModifierPlaneCount );\n      VULKAN_HPP_HASH_COMBINE( seed, drmFormatModifierPropertiesEXT.drmFormatModifierTilingFeatures );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesList2EXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesList2EXT const & drmFormatModifierPropertiesList2EXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, drmFormatModifierPropertiesList2EXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, drmFormatModifierPropertiesList2EXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, drmFormatModifierPropertiesList2EXT.drmFormatModifierCount );\n      VULKAN_HPP_HASH_COMBINE( seed, drmFormatModifierPropertiesList2EXT.pDrmFormatModifierProperties );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesListEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesListEXT const & drmFormatModifierPropertiesListEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, drmFormatModifierPropertiesListEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, drmFormatModifierPropertiesListEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, drmFormatModifierPropertiesListEXT.drmFormatModifierCount );\n      VULKAN_HPP_HASH_COMBINE( seed, drmFormatModifierPropertiesListEXT.pDrmFormatModifierProperties );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::EventCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::EventCreateInfo const & eventCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, eventCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, eventCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, eventCreateInfo.flags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineLibraryCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineLibraryCreateInfoKHR const & pipelineLibraryCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineLibraryCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineLibraryCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineLibraryCreateInfoKHR.libraryCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineLibraryCreateInfoKHR.pLibraries );\n      return seed;\n    }\n  };\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX const & executionGraphPipelineCreateInfoAMDX ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, executionGraphPipelineCreateInfoAMDX.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, executionGraphPipelineCreateInfoAMDX.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, executionGraphPipelineCreateInfoAMDX.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, executionGraphPipelineCreateInfoAMDX.stageCount );\n      VULKAN_HPP_HASH_COMBINE( seed, executionGraphPipelineCreateInfoAMDX.pStages );\n      VULKAN_HPP_HASH_COMBINE( seed, executionGraphPipelineCreateInfoAMDX.pLibraryInfo );\n      VULKAN_HPP_HASH_COMBINE( seed, executionGraphPipelineCreateInfoAMDX.layout );\n      VULKAN_HPP_HASH_COMBINE( seed, executionGraphPipelineCreateInfoAMDX.basePipelineHandle );\n      VULKAN_HPP_HASH_COMBINE( seed, executionGraphPipelineCreateInfoAMDX.basePipelineIndex );\n      return seed;\n    }\n  };\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineScratchSizeAMDX>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineScratchSizeAMDX const & executionGraphPipelineScratchSizeAMDX ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, executionGraphPipelineScratchSizeAMDX.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, executionGraphPipelineScratchSizeAMDX.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, executionGraphPipelineScratchSizeAMDX.minSize );\n      VULKAN_HPP_HASH_COMBINE( seed, executionGraphPipelineScratchSizeAMDX.maxSize );\n      VULKAN_HPP_HASH_COMBINE( seed, executionGraphPipelineScratchSizeAMDX.sizeGranularity );\n      return seed;\n    }\n  };\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExportFenceCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExportFenceCreateInfo const & exportFenceCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, exportFenceCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, exportFenceCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, exportFenceCreateInfo.handleTypes );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExportFenceWin32HandleInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExportFenceWin32HandleInfoKHR const & exportFenceWin32HandleInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, exportFenceWin32HandleInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, exportFenceWin32HandleInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, exportFenceWin32HandleInfoKHR.pAttributes );\n      VULKAN_HPP_HASH_COMBINE( seed, exportFenceWin32HandleInfoKHR.dwAccess );\n      VULKAN_HPP_HASH_COMBINE( seed, exportFenceWin32HandleInfoKHR.name );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExportMemoryAllocateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExportMemoryAllocateInfo const & exportMemoryAllocateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, exportMemoryAllocateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMemoryAllocateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMemoryAllocateInfo.handleTypes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExportMemoryAllocateInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExportMemoryAllocateInfoNV const & exportMemoryAllocateInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, exportMemoryAllocateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMemoryAllocateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMemoryAllocateInfoNV.handleTypes );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExportMemoryWin32HandleInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExportMemoryWin32HandleInfoKHR const & exportMemoryWin32HandleInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, exportMemoryWin32HandleInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMemoryWin32HandleInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMemoryWin32HandleInfoKHR.pAttributes );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMemoryWin32HandleInfoKHR.dwAccess );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMemoryWin32HandleInfoKHR.name );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExportMemoryWin32HandleInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExportMemoryWin32HandleInfoNV const & exportMemoryWin32HandleInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, exportMemoryWin32HandleInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMemoryWin32HandleInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMemoryWin32HandleInfoNV.pAttributes );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMemoryWin32HandleInfoNV.dwAccess );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExportMetalBufferInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExportMetalBufferInfoEXT const & exportMetalBufferInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalBufferInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalBufferInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalBufferInfoEXT.memory );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalBufferInfoEXT.mtlBuffer );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExportMetalCommandQueueInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExportMetalCommandQueueInfoEXT const & exportMetalCommandQueueInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalCommandQueueInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalCommandQueueInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalCommandQueueInfoEXT.queue );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalCommandQueueInfoEXT.mtlCommandQueue );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExportMetalDeviceInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExportMetalDeviceInfoEXT const & exportMetalDeviceInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalDeviceInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalDeviceInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalDeviceInfoEXT.mtlDevice );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExportMetalIOSurfaceInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExportMetalIOSurfaceInfoEXT const & exportMetalIOSurfaceInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalIOSurfaceInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalIOSurfaceInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalIOSurfaceInfoEXT.image );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalIOSurfaceInfoEXT.ioSurface );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExportMetalObjectCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExportMetalObjectCreateInfoEXT const & exportMetalObjectCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalObjectCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalObjectCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalObjectCreateInfoEXT.exportObjectType );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExportMetalObjectsInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExportMetalObjectsInfoEXT const & exportMetalObjectsInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalObjectsInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalObjectsInfoEXT.pNext );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExportMetalSharedEventInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExportMetalSharedEventInfoEXT const & exportMetalSharedEventInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalSharedEventInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalSharedEventInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalSharedEventInfoEXT.semaphore );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalSharedEventInfoEXT.event );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalSharedEventInfoEXT.mtlSharedEvent );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExportMetalTextureInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExportMetalTextureInfoEXT const & exportMetalTextureInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalTextureInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalTextureInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalTextureInfoEXT.image );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalTextureInfoEXT.imageView );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalTextureInfoEXT.bufferView );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalTextureInfoEXT.plane );\n      VULKAN_HPP_HASH_COMBINE( seed, exportMetalTextureInfoEXT.mtlTexture );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExportSemaphoreCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExportSemaphoreCreateInfo const & exportSemaphoreCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, exportSemaphoreCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, exportSemaphoreCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, exportSemaphoreCreateInfo.handleTypes );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExportSemaphoreWin32HandleInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExportSemaphoreWin32HandleInfoKHR const & exportSemaphoreWin32HandleInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, exportSemaphoreWin32HandleInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, exportSemaphoreWin32HandleInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, exportSemaphoreWin32HandleInfoKHR.pAttributes );\n      VULKAN_HPP_HASH_COMBINE( seed, exportSemaphoreWin32HandleInfoKHR.dwAccess );\n      VULKAN_HPP_HASH_COMBINE( seed, exportSemaphoreWin32HandleInfoKHR.name );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExtensionProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExtensionProperties const & extensionProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      for ( size_t i = 0; i < VK_MAX_EXTENSION_NAME_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, extensionProperties.extensionName[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, extensionProperties.specVersion );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExternalMemoryProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExternalMemoryProperties const & externalMemoryProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, externalMemoryProperties.externalMemoryFeatures );\n      VULKAN_HPP_HASH_COMBINE( seed, externalMemoryProperties.exportFromImportedHandleTypes );\n      VULKAN_HPP_HASH_COMBINE( seed, externalMemoryProperties.compatibleHandleTypes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExternalBufferProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExternalBufferProperties const & externalBufferProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, externalBufferProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, externalBufferProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, externalBufferProperties.externalMemoryProperties );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExternalFenceProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExternalFenceProperties const & externalFenceProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, externalFenceProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, externalFenceProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, externalFenceProperties.exportFromImportedHandleTypes );\n      VULKAN_HPP_HASH_COMBINE( seed, externalFenceProperties.compatibleHandleTypes );\n      VULKAN_HPP_HASH_COMBINE( seed, externalFenceProperties.externalFenceFeatures );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExternalFormatANDROID>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExternalFormatANDROID const & externalFormatANDROID ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, externalFormatANDROID.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, externalFormatANDROID.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, externalFormatANDROID.externalFormat );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#  if defined( VK_USE_PLATFORM_SCREEN_QNX )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExternalFormatQNX>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExternalFormatQNX const & externalFormatQNX ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, externalFormatQNX.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, externalFormatQNX.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, externalFormatQNX.externalFormat );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExternalImageFormatProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExternalImageFormatProperties const & externalImageFormatProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, externalImageFormatProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, externalImageFormatProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, externalImageFormatProperties.externalMemoryProperties );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageFormatProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageFormatProperties const & imageFormatProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageFormatProperties.maxExtent );\n      VULKAN_HPP_HASH_COMBINE( seed, imageFormatProperties.maxMipLevels );\n      VULKAN_HPP_HASH_COMBINE( seed, imageFormatProperties.maxArrayLayers );\n      VULKAN_HPP_HASH_COMBINE( seed, imageFormatProperties.sampleCounts );\n      VULKAN_HPP_HASH_COMBINE( seed, imageFormatProperties.maxResourceSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExternalImageFormatPropertiesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExternalImageFormatPropertiesNV const & externalImageFormatPropertiesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, externalImageFormatPropertiesNV.imageFormatProperties );\n      VULKAN_HPP_HASH_COMBINE( seed, externalImageFormatPropertiesNV.externalMemoryFeatures );\n      VULKAN_HPP_HASH_COMBINE( seed, externalImageFormatPropertiesNV.exportFromImportedHandleTypes );\n      VULKAN_HPP_HASH_COMBINE( seed, externalImageFormatPropertiesNV.compatibleHandleTypes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExternalMemoryAcquireUnmodifiedEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExternalMemoryAcquireUnmodifiedEXT const & externalMemoryAcquireUnmodifiedEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, externalMemoryAcquireUnmodifiedEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, externalMemoryAcquireUnmodifiedEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, externalMemoryAcquireUnmodifiedEXT.acquireUnmodifiedMemory );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExternalMemoryBufferCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExternalMemoryBufferCreateInfo const & externalMemoryBufferCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, externalMemoryBufferCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, externalMemoryBufferCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, externalMemoryBufferCreateInfo.handleTypes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExternalMemoryImageCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExternalMemoryImageCreateInfo const & externalMemoryImageCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, externalMemoryImageCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, externalMemoryImageCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, externalMemoryImageCreateInfo.handleTypes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExternalMemoryImageCreateInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExternalMemoryImageCreateInfoNV const & externalMemoryImageCreateInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, externalMemoryImageCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, externalMemoryImageCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, externalMemoryImageCreateInfoNV.handleTypes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties const & externalSemaphoreProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, externalSemaphoreProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, externalSemaphoreProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, externalSemaphoreProperties.exportFromImportedHandleTypes );\n      VULKAN_HPP_HASH_COMBINE( seed, externalSemaphoreProperties.compatibleHandleTypes );\n      VULKAN_HPP_HASH_COMBINE( seed, externalSemaphoreProperties.externalSemaphoreFeatures );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::FenceCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::FenceCreateInfo const & fenceCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, fenceCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, fenceCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, fenceCreateInfo.flags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::FenceGetFdInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::FenceGetFdInfoKHR const & fenceGetFdInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, fenceGetFdInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, fenceGetFdInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, fenceGetFdInfoKHR.fence );\n      VULKAN_HPP_HASH_COMBINE( seed, fenceGetFdInfoKHR.handleType );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::FenceGetWin32HandleInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::FenceGetWin32HandleInfoKHR const & fenceGetWin32HandleInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, fenceGetWin32HandleInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, fenceGetWin32HandleInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, fenceGetWin32HandleInfoKHR.fence );\n      VULKAN_HPP_HASH_COMBINE( seed, fenceGetWin32HandleInfoKHR.handleType );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::FilterCubicImageViewImageFormatPropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::FilterCubicImageViewImageFormatPropertiesEXT const & filterCubicImageViewImageFormatPropertiesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, filterCubicImageViewImageFormatPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, filterCubicImageViewImageFormatPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, filterCubicImageViewImageFormatPropertiesEXT.filterCubic );\n      VULKAN_HPP_HASH_COMBINE( seed, filterCubicImageViewImageFormatPropertiesEXT.filterCubicMinmax );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::FormatProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::FormatProperties const & formatProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, formatProperties.linearTilingFeatures );\n      VULKAN_HPP_HASH_COMBINE( seed, formatProperties.optimalTilingFeatures );\n      VULKAN_HPP_HASH_COMBINE( seed, formatProperties.bufferFeatures );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::FormatProperties2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::FormatProperties2 const & formatProperties2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, formatProperties2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, formatProperties2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, formatProperties2.formatProperties );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::FormatProperties3>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::FormatProperties3 const & formatProperties3 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, formatProperties3.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, formatProperties3.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, formatProperties3.linearTilingFeatures );\n      VULKAN_HPP_HASH_COMBINE( seed, formatProperties3.optimalTilingFeatures );\n      VULKAN_HPP_HASH_COMBINE( seed, formatProperties3.bufferFeatures );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::FragmentShadingRateAttachmentInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::FragmentShadingRateAttachmentInfoKHR const & fragmentShadingRateAttachmentInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, fragmentShadingRateAttachmentInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, fragmentShadingRateAttachmentInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, fragmentShadingRateAttachmentInfoKHR.pFragmentShadingRateAttachment );\n      VULKAN_HPP_HASH_COMBINE( seed, fragmentShadingRateAttachmentInfoKHR.shadingRateAttachmentTexelSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::FrameBoundaryEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::FrameBoundaryEXT const & frameBoundaryEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, frameBoundaryEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, frameBoundaryEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, frameBoundaryEXT.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, frameBoundaryEXT.frameID );\n      VULKAN_HPP_HASH_COMBINE( seed, frameBoundaryEXT.imageCount );\n      VULKAN_HPP_HASH_COMBINE( seed, frameBoundaryEXT.pImages );\n      VULKAN_HPP_HASH_COMBINE( seed, frameBoundaryEXT.bufferCount );\n      VULKAN_HPP_HASH_COMBINE( seed, frameBoundaryEXT.pBuffers );\n      VULKAN_HPP_HASH_COMBINE( seed, frameBoundaryEXT.tagName );\n      VULKAN_HPP_HASH_COMBINE( seed, frameBoundaryEXT.tagSize );\n      VULKAN_HPP_HASH_COMBINE( seed, frameBoundaryEXT.pTag );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::FramebufferAttachmentImageInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::FramebufferAttachmentImageInfo const & framebufferAttachmentImageInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferAttachmentImageInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferAttachmentImageInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferAttachmentImageInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferAttachmentImageInfo.usage );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferAttachmentImageInfo.width );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferAttachmentImageInfo.height );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferAttachmentImageInfo.layerCount );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferAttachmentImageInfo.viewFormatCount );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferAttachmentImageInfo.pViewFormats );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::FramebufferAttachmentsCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::FramebufferAttachmentsCreateInfo const & framebufferAttachmentsCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferAttachmentsCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferAttachmentsCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferAttachmentsCreateInfo.attachmentImageInfoCount );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferAttachmentsCreateInfo.pAttachmentImageInfos );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::FramebufferCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::FramebufferCreateInfo const & framebufferCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferCreateInfo.renderPass );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferCreateInfo.attachmentCount );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferCreateInfo.pAttachments );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferCreateInfo.width );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferCreateInfo.height );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferCreateInfo.layers );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV const & framebufferMixedSamplesCombinationNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferMixedSamplesCombinationNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferMixedSamplesCombinationNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferMixedSamplesCombinationNV.coverageReductionMode );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferMixedSamplesCombinationNV.rasterizationSamples );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferMixedSamplesCombinationNV.depthStencilSamples );\n      VULKAN_HPP_HASH_COMBINE( seed, framebufferMixedSamplesCombinationNV.colorSamples );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoEXT const & generatedCommandsInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoEXT.shaderStages );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoEXT.indirectExecutionSet );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoEXT.indirectCommandsLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoEXT.indirectAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoEXT.indirectAddressSize );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoEXT.preprocessAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoEXT.preprocessSize );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoEXT.maxSequenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoEXT.sequenceCountAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoEXT.maxDrawCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::IndirectCommandsStreamNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::IndirectCommandsStreamNV const & indirectCommandsStreamNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsStreamNV.buffer );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsStreamNV.offset );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV const & generatedCommandsInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoNV.pipelineBindPoint );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoNV.pipeline );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoNV.indirectCommandsLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoNV.streamCount );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoNV.pStreams );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoNV.sequencesCount );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoNV.preprocessBuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoNV.preprocessOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoNV.preprocessSize );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoNV.sequencesCountBuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoNV.sequencesCountOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoNV.sequencesIndexBuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsInfoNV.sequencesIndexOffset );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoEXT const & generatedCommandsMemoryRequirementsInfoEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsMemoryRequirementsInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsMemoryRequirementsInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsMemoryRequirementsInfoEXT.indirectExecutionSet );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsMemoryRequirementsInfoEXT.indirectCommandsLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsMemoryRequirementsInfoEXT.maxSequenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsMemoryRequirementsInfoEXT.maxDrawCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoNV const & generatedCommandsMemoryRequirementsInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsMemoryRequirementsInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsMemoryRequirementsInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsMemoryRequirementsInfoNV.pipelineBindPoint );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsMemoryRequirementsInfoNV.pipeline );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsMemoryRequirementsInfoNV.indirectCommandsLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsMemoryRequirementsInfoNV.maxSequencesCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::GeneratedCommandsPipelineInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::GeneratedCommandsPipelineInfoEXT const & generatedCommandsPipelineInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsPipelineInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsPipelineInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsPipelineInfoEXT.pipeline );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::GeneratedCommandsShaderInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::GeneratedCommandsShaderInfoEXT const & generatedCommandsShaderInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsShaderInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsShaderInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsShaderInfoEXT.shaderCount );\n      VULKAN_HPP_HASH_COMBINE( seed, generatedCommandsShaderInfoEXT.pShaders );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV const & latencyTimingsFrameReportNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, latencyTimingsFrameReportNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, latencyTimingsFrameReportNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, latencyTimingsFrameReportNV.presentID );\n      VULKAN_HPP_HASH_COMBINE( seed, latencyTimingsFrameReportNV.inputSampleTimeUs );\n      VULKAN_HPP_HASH_COMBINE( seed, latencyTimingsFrameReportNV.simStartTimeUs );\n      VULKAN_HPP_HASH_COMBINE( seed, latencyTimingsFrameReportNV.simEndTimeUs );\n      VULKAN_HPP_HASH_COMBINE( seed, latencyTimingsFrameReportNV.renderSubmitStartTimeUs );\n      VULKAN_HPP_HASH_COMBINE( seed, latencyTimingsFrameReportNV.renderSubmitEndTimeUs );\n      VULKAN_HPP_HASH_COMBINE( seed, latencyTimingsFrameReportNV.presentStartTimeUs );\n      VULKAN_HPP_HASH_COMBINE( seed, latencyTimingsFrameReportNV.presentEndTimeUs );\n      VULKAN_HPP_HASH_COMBINE( seed, latencyTimingsFrameReportNV.driverStartTimeUs );\n      VULKAN_HPP_HASH_COMBINE( seed, latencyTimingsFrameReportNV.driverEndTimeUs );\n      VULKAN_HPP_HASH_COMBINE( seed, latencyTimingsFrameReportNV.osRenderQueueStartTimeUs );\n      VULKAN_HPP_HASH_COMBINE( seed, latencyTimingsFrameReportNV.osRenderQueueEndTimeUs );\n      VULKAN_HPP_HASH_COMBINE( seed, latencyTimingsFrameReportNV.gpuRenderStartTimeUs );\n      VULKAN_HPP_HASH_COMBINE( seed, latencyTimingsFrameReportNV.gpuRenderEndTimeUs );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::GetLatencyMarkerInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::GetLatencyMarkerInfoNV const & getLatencyMarkerInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, getLatencyMarkerInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, getLatencyMarkerInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, getLatencyMarkerInfoNV.timingCount );\n      VULKAN_HPP_HASH_COMBINE( seed, getLatencyMarkerInfoNV.pTimings );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VertexInputBindingDescription>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VertexInputBindingDescription const & vertexInputBindingDescription ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, vertexInputBindingDescription.binding );\n      VULKAN_HPP_HASH_COMBINE( seed, vertexInputBindingDescription.stride );\n      VULKAN_HPP_HASH_COMBINE( seed, vertexInputBindingDescription.inputRate );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription const & vertexInputAttributeDescription ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, vertexInputAttributeDescription.location );\n      VULKAN_HPP_HASH_COMBINE( seed, vertexInputAttributeDescription.binding );\n      VULKAN_HPP_HASH_COMBINE( seed, vertexInputAttributeDescription.format );\n      VULKAN_HPP_HASH_COMBINE( seed, vertexInputAttributeDescription.offset );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateInfo const & pipelineVertexInputStateCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineVertexInputStateCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineVertexInputStateCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineVertexInputStateCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineVertexInputStateCreateInfo.pVertexBindingDescriptions );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineInputAssemblyStateCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineInputAssemblyStateCreateInfo const & pipelineInputAssemblyStateCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineInputAssemblyStateCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineInputAssemblyStateCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineInputAssemblyStateCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineInputAssemblyStateCreateInfo.topology );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineInputAssemblyStateCreateInfo.primitiveRestartEnable );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineTessellationStateCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineTessellationStateCreateInfo const & pipelineTessellationStateCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineTessellationStateCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineTessellationStateCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineTessellationStateCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineTessellationStateCreateInfo.patchControlPoints );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineViewportStateCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineViewportStateCreateInfo const & pipelineViewportStateCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportStateCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportStateCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportStateCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportStateCreateInfo.viewportCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportStateCreateInfo.pViewports );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportStateCreateInfo.scissorCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportStateCreateInfo.pScissors );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineRasterizationStateCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineRasterizationStateCreateInfo const & pipelineRasterizationStateCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationStateCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationStateCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationStateCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationStateCreateInfo.depthClampEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationStateCreateInfo.rasterizerDiscardEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationStateCreateInfo.polygonMode );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationStateCreateInfo.cullMode );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationStateCreateInfo.frontFace );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationStateCreateInfo.depthBiasEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationStateCreateInfo.depthBiasConstantFactor );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationStateCreateInfo.depthBiasClamp );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationStateCreateInfo.depthBiasSlopeFactor );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationStateCreateInfo.lineWidth );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineMultisampleStateCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineMultisampleStateCreateInfo const & pipelineMultisampleStateCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineMultisampleStateCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineMultisampleStateCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineMultisampleStateCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineMultisampleStateCreateInfo.rasterizationSamples );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineMultisampleStateCreateInfo.sampleShadingEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineMultisampleStateCreateInfo.minSampleShading );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineMultisampleStateCreateInfo.pSampleMask );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineMultisampleStateCreateInfo.alphaToCoverageEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineMultisampleStateCreateInfo.alphaToOneEnable );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::StencilOpState>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::StencilOpState const & stencilOpState ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, stencilOpState.failOp );\n      VULKAN_HPP_HASH_COMBINE( seed, stencilOpState.passOp );\n      VULKAN_HPP_HASH_COMBINE( seed, stencilOpState.depthFailOp );\n      VULKAN_HPP_HASH_COMBINE( seed, stencilOpState.compareOp );\n      VULKAN_HPP_HASH_COMBINE( seed, stencilOpState.compareMask );\n      VULKAN_HPP_HASH_COMBINE( seed, stencilOpState.writeMask );\n      VULKAN_HPP_HASH_COMBINE( seed, stencilOpState.reference );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineDepthStencilStateCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineDepthStencilStateCreateInfo const & pipelineDepthStencilStateCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineDepthStencilStateCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineDepthStencilStateCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineDepthStencilStateCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineDepthStencilStateCreateInfo.depthTestEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineDepthStencilStateCreateInfo.depthWriteEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineDepthStencilStateCreateInfo.depthCompareOp );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineDepthStencilStateCreateInfo.depthBoundsTestEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineDepthStencilStateCreateInfo.stencilTestEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineDepthStencilStateCreateInfo.front );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineDepthStencilStateCreateInfo.back );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineDepthStencilStateCreateInfo.minDepthBounds );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineDepthStencilStateCreateInfo.maxDepthBounds );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineColorBlendAttachmentState>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineColorBlendAttachmentState const & pipelineColorBlendAttachmentState ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorBlendAttachmentState.blendEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorBlendAttachmentState.srcColorBlendFactor );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorBlendAttachmentState.dstColorBlendFactor );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorBlendAttachmentState.colorBlendOp );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorBlendAttachmentState.srcAlphaBlendFactor );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorBlendAttachmentState.dstAlphaBlendFactor );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorBlendAttachmentState.alphaBlendOp );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorBlendAttachmentState.colorWriteMask );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineColorBlendStateCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineColorBlendStateCreateInfo const & pipelineColorBlendStateCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorBlendStateCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorBlendStateCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorBlendStateCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorBlendStateCreateInfo.logicOpEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorBlendStateCreateInfo.logicOp );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorBlendStateCreateInfo.attachmentCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorBlendStateCreateInfo.pAttachments );\n      for ( size_t i = 0; i < 4; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, pipelineColorBlendStateCreateInfo.blendConstants[i] );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineDynamicStateCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineDynamicStateCreateInfo const & pipelineDynamicStateCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineDynamicStateCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineDynamicStateCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineDynamicStateCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineDynamicStateCreateInfo.dynamicStateCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineDynamicStateCreateInfo.pDynamicStates );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo const & graphicsPipelineCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineCreateInfo.stageCount );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineCreateInfo.pStages );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineCreateInfo.pVertexInputState );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineCreateInfo.pInputAssemblyState );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineCreateInfo.pTessellationState );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineCreateInfo.pViewportState );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineCreateInfo.pRasterizationState );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineCreateInfo.pMultisampleState );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineCreateInfo.pDepthStencilState );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineCreateInfo.pColorBlendState );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineCreateInfo.pDynamicState );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineCreateInfo.layout );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineCreateInfo.renderPass );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineCreateInfo.subpass );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineCreateInfo.basePipelineHandle );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineCreateInfo.basePipelineIndex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::GraphicsPipelineLibraryCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::GraphicsPipelineLibraryCreateInfoEXT const & graphicsPipelineLibraryCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineLibraryCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineLibraryCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineLibraryCreateInfoEXT.flags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::GraphicsShaderGroupCreateInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::GraphicsShaderGroupCreateInfoNV const & graphicsShaderGroupCreateInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsShaderGroupCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsShaderGroupCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsShaderGroupCreateInfoNV.stageCount );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsShaderGroupCreateInfoNV.pStages );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsShaderGroupCreateInfoNV.pVertexInputState );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsShaderGroupCreateInfoNV.pTessellationState );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::GraphicsPipelineShaderGroupsCreateInfoNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::GraphicsPipelineShaderGroupsCreateInfoNV const & graphicsPipelineShaderGroupsCreateInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineShaderGroupsCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineShaderGroupsCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineShaderGroupsCreateInfoNV.groupCount );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineShaderGroupsCreateInfoNV.pGroups );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineShaderGroupsCreateInfoNV.pipelineCount );\n      VULKAN_HPP_HASH_COMBINE( seed, graphicsPipelineShaderGroupsCreateInfoNV.pPipelines );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::XYColorEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::XYColorEXT const & xYColorEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, xYColorEXT.x );\n      VULKAN_HPP_HASH_COMBINE( seed, xYColorEXT.y );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::HdrMetadataEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::HdrMetadataEXT const & hdrMetadataEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, hdrMetadataEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, hdrMetadataEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, hdrMetadataEXT.displayPrimaryRed );\n      VULKAN_HPP_HASH_COMBINE( seed, hdrMetadataEXT.displayPrimaryGreen );\n      VULKAN_HPP_HASH_COMBINE( seed, hdrMetadataEXT.displayPrimaryBlue );\n      VULKAN_HPP_HASH_COMBINE( seed, hdrMetadataEXT.whitePoint );\n      VULKAN_HPP_HASH_COMBINE( seed, hdrMetadataEXT.maxLuminance );\n      VULKAN_HPP_HASH_COMBINE( seed, hdrMetadataEXT.minLuminance );\n      VULKAN_HPP_HASH_COMBINE( seed, hdrMetadataEXT.maxContentLightLevel );\n      VULKAN_HPP_HASH_COMBINE( seed, hdrMetadataEXT.maxFrameAverageLightLevel );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::HdrVividDynamicMetadataHUAWEI>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::HdrVividDynamicMetadataHUAWEI const & hdrVividDynamicMetadataHUAWEI ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, hdrVividDynamicMetadataHUAWEI.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, hdrVividDynamicMetadataHUAWEI.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, hdrVividDynamicMetadataHUAWEI.dynamicMetadataSize );\n      VULKAN_HPP_HASH_COMBINE( seed, hdrVividDynamicMetadataHUAWEI.pDynamicMetadata );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateInfoEXT const & headlessSurfaceCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, headlessSurfaceCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, headlessSurfaceCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, headlessSurfaceCreateInfoEXT.flags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::HostImageCopyDevicePerformanceQuery>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::HostImageCopyDevicePerformanceQuery const & hostImageCopyDevicePerformanceQuery ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, hostImageCopyDevicePerformanceQuery.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, hostImageCopyDevicePerformanceQuery.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, hostImageCopyDevicePerformanceQuery.optimalDeviceAccess );\n      VULKAN_HPP_HASH_COMBINE( seed, hostImageCopyDevicePerformanceQuery.identicalMemoryLayout );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::HostImageLayoutTransitionInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::HostImageLayoutTransitionInfo const & hostImageLayoutTransitionInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, hostImageLayoutTransitionInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, hostImageLayoutTransitionInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, hostImageLayoutTransitionInfo.image );\n      VULKAN_HPP_HASH_COMBINE( seed, hostImageLayoutTransitionInfo.oldLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, hostImageLayoutTransitionInfo.newLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, hostImageLayoutTransitionInfo.subresourceRange );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_IOS_MVK )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::IOSSurfaceCreateInfoMVK>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::IOSSurfaceCreateInfoMVK const & iOSSurfaceCreateInfoMVK ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, iOSSurfaceCreateInfoMVK.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, iOSSurfaceCreateInfoMVK.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, iOSSurfaceCreateInfoMVK.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, iOSSurfaceCreateInfoMVK.pView );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_IOS_MVK*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageAlignmentControlCreateInfoMESA>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageAlignmentControlCreateInfoMESA const & imageAlignmentControlCreateInfoMESA ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageAlignmentControlCreateInfoMESA.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageAlignmentControlCreateInfoMESA.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageAlignmentControlCreateInfoMESA.maximumRequestedAlignment );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageBlit>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageBlit const & imageBlit ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageBlit.srcSubresource );\n      for ( size_t i = 0; i < 2; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, imageBlit.srcOffsets[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, imageBlit.dstSubresource );\n      for ( size_t i = 0; i < 2; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, imageBlit.dstOffsets[i] );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageCaptureDescriptorDataInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageCaptureDescriptorDataInfoEXT const & imageCaptureDescriptorDataInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageCaptureDescriptorDataInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCaptureDescriptorDataInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCaptureDescriptorDataInfoEXT.image );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageCompressionControlEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageCompressionControlEXT const & imageCompressionControlEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageCompressionControlEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCompressionControlEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCompressionControlEXT.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCompressionControlEXT.compressionControlPlaneCount );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCompressionControlEXT.pFixedRateFlags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageCompressionPropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageCompressionPropertiesEXT const & imageCompressionPropertiesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageCompressionPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCompressionPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCompressionPropertiesEXT.imageCompressionFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCompressionPropertiesEXT.imageCompressionFixedRateFlags );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageFormatConstraintsInfoFUCHSIA>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageFormatConstraintsInfoFUCHSIA const & imageFormatConstraintsInfoFUCHSIA ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageFormatConstraintsInfoFUCHSIA.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageFormatConstraintsInfoFUCHSIA.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageFormatConstraintsInfoFUCHSIA.imageCreateInfo );\n      VULKAN_HPP_HASH_COMBINE( seed, imageFormatConstraintsInfoFUCHSIA.requiredFormatFeatures );\n      VULKAN_HPP_HASH_COMBINE( seed, imageFormatConstraintsInfoFUCHSIA.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, imageFormatConstraintsInfoFUCHSIA.sysmemPixelFormat );\n      VULKAN_HPP_HASH_COMBINE( seed, imageFormatConstraintsInfoFUCHSIA.colorSpaceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, imageFormatConstraintsInfoFUCHSIA.pColorSpaces );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageConstraintsInfoFUCHSIA>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageConstraintsInfoFUCHSIA const & imageConstraintsInfoFUCHSIA ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageConstraintsInfoFUCHSIA.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageConstraintsInfoFUCHSIA.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageConstraintsInfoFUCHSIA.formatConstraintsCount );\n      VULKAN_HPP_HASH_COMBINE( seed, imageConstraintsInfoFUCHSIA.pFormatConstraints );\n      VULKAN_HPP_HASH_COMBINE( seed, imageConstraintsInfoFUCHSIA.bufferCollectionConstraints );\n      VULKAN_HPP_HASH_COMBINE( seed, imageConstraintsInfoFUCHSIA.flags );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageCopy>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageCopy const & imageCopy ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageCopy.srcSubresource );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCopy.srcOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCopy.dstSubresource );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCopy.dstOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, imageCopy.extent );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SubresourceLayout>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SubresourceLayout const & subresourceLayout ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, subresourceLayout.offset );\n      VULKAN_HPP_HASH_COMBINE( seed, subresourceLayout.size );\n      VULKAN_HPP_HASH_COMBINE( seed, subresourceLayout.rowPitch );\n      VULKAN_HPP_HASH_COMBINE( seed, subresourceLayout.arrayPitch );\n      VULKAN_HPP_HASH_COMBINE( seed, subresourceLayout.depthPitch );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierExplicitCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierExplicitCreateInfoEXT const & imageDrmFormatModifierExplicitCreateInfoEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageDrmFormatModifierExplicitCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageDrmFormatModifierExplicitCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageDrmFormatModifierExplicitCreateInfoEXT.drmFormatModifier );\n      VULKAN_HPP_HASH_COMBINE( seed, imageDrmFormatModifierExplicitCreateInfoEXT.drmFormatModifierPlaneCount );\n      VULKAN_HPP_HASH_COMBINE( seed, imageDrmFormatModifierExplicitCreateInfoEXT.pPlaneLayouts );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierListCreateInfoEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierListCreateInfoEXT const & imageDrmFormatModifierListCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageDrmFormatModifierListCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageDrmFormatModifierListCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageDrmFormatModifierListCreateInfoEXT.drmFormatModifierCount );\n      VULKAN_HPP_HASH_COMBINE( seed, imageDrmFormatModifierListCreateInfoEXT.pDrmFormatModifiers );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierPropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierPropertiesEXT const & imageDrmFormatModifierPropertiesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageDrmFormatModifierPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageDrmFormatModifierPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageDrmFormatModifierPropertiesEXT.drmFormatModifier );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageFormatListCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageFormatListCreateInfo const & imageFormatListCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageFormatListCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageFormatListCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageFormatListCreateInfo.viewFormatCount );\n      VULKAN_HPP_HASH_COMBINE( seed, imageFormatListCreateInfo.pViewFormats );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageFormatProperties2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageFormatProperties2 const & imageFormatProperties2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageFormatProperties2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageFormatProperties2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageFormatProperties2.imageFormatProperties );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageMemoryBarrier>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageMemoryBarrier const & imageMemoryBarrier ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryBarrier.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryBarrier.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryBarrier.srcAccessMask );\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryBarrier.dstAccessMask );\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryBarrier.oldLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryBarrier.newLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryBarrier.srcQueueFamilyIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryBarrier.dstQueueFamilyIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryBarrier.image );\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryBarrier.subresourceRange );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 const & imageMemoryRequirementsInfo2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryRequirementsInfo2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryRequirementsInfo2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageMemoryRequirementsInfo2.image );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateInfoFUCHSIA>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateInfoFUCHSIA const & imagePipeSurfaceCreateInfoFUCHSIA ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imagePipeSurfaceCreateInfoFUCHSIA.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imagePipeSurfaceCreateInfoFUCHSIA.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imagePipeSurfaceCreateInfoFUCHSIA.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, imagePipeSurfaceCreateInfoFUCHSIA.imagePipeHandle );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImagePlaneMemoryRequirementsInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImagePlaneMemoryRequirementsInfo const & imagePlaneMemoryRequirementsInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imagePlaneMemoryRequirementsInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imagePlaneMemoryRequirementsInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imagePlaneMemoryRequirementsInfo.planeAspect );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageResolve>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageResolve const & imageResolve ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageResolve.srcSubresource );\n      VULKAN_HPP_HASH_COMBINE( seed, imageResolve.srcOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, imageResolve.dstSubresource );\n      VULKAN_HPP_HASH_COMBINE( seed, imageResolve.dstOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, imageResolve.extent );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageResolve2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageResolve2 const & imageResolve2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageResolve2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageResolve2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageResolve2.srcSubresource );\n      VULKAN_HPP_HASH_COMBINE( seed, imageResolve2.srcOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, imageResolve2.dstSubresource );\n      VULKAN_HPP_HASH_COMBINE( seed, imageResolve2.dstOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, imageResolve2.extent );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 const & imageSparseMemoryRequirementsInfo2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageSparseMemoryRequirementsInfo2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageSparseMemoryRequirementsInfo2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageSparseMemoryRequirementsInfo2.image );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageStencilUsageCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageStencilUsageCreateInfo const & imageStencilUsageCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageStencilUsageCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageStencilUsageCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageStencilUsageCreateInfo.stencilUsage );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageSwapchainCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageSwapchainCreateInfoKHR const & imageSwapchainCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageSwapchainCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageSwapchainCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageSwapchainCreateInfoKHR.swapchain );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageViewASTCDecodeModeEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageViewASTCDecodeModeEXT const & imageViewASTCDecodeModeEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewASTCDecodeModeEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewASTCDecodeModeEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewASTCDecodeModeEXT.decodeMode );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageViewAddressPropertiesNVX>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageViewAddressPropertiesNVX const & imageViewAddressPropertiesNVX ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewAddressPropertiesNVX.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewAddressPropertiesNVX.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewAddressPropertiesNVX.deviceAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewAddressPropertiesNVX.size );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageViewCaptureDescriptorDataInfoEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::ImageViewCaptureDescriptorDataInfoEXT const & imageViewCaptureDescriptorDataInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewCaptureDescriptorDataInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewCaptureDescriptorDataInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewCaptureDescriptorDataInfoEXT.imageView );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageViewCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageViewCreateInfo const & imageViewCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewCreateInfo.image );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewCreateInfo.viewType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewCreateInfo.format );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewCreateInfo.components );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewCreateInfo.subresourceRange );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageViewHandleInfoNVX>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageViewHandleInfoNVX const & imageViewHandleInfoNVX ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewHandleInfoNVX.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewHandleInfoNVX.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewHandleInfoNVX.imageView );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewHandleInfoNVX.descriptorType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewHandleInfoNVX.sampler );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageViewMinLodCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageViewMinLodCreateInfoEXT const & imageViewMinLodCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewMinLodCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewMinLodCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewMinLodCreateInfoEXT.minLod );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageViewSampleWeightCreateInfoQCOM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageViewSampleWeightCreateInfoQCOM const & imageViewSampleWeightCreateInfoQCOM ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewSampleWeightCreateInfoQCOM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewSampleWeightCreateInfoQCOM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewSampleWeightCreateInfoQCOM.filterCenter );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewSampleWeightCreateInfoQCOM.filterSize );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewSampleWeightCreateInfoQCOM.numPhases );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageViewSlicedCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageViewSlicedCreateInfoEXT const & imageViewSlicedCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewSlicedCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewSlicedCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewSlicedCreateInfoEXT.sliceOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewSlicedCreateInfoEXT.sliceCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImageViewUsageCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageViewUsageCreateInfo const & imageViewUsageCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewUsageCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewUsageCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, imageViewUsageCreateInfo.usage );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImportAndroidHardwareBufferInfoANDROID>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::ImportAndroidHardwareBufferInfoANDROID const & importAndroidHardwareBufferInfoANDROID ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, importAndroidHardwareBufferInfoANDROID.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, importAndroidHardwareBufferInfoANDROID.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, importAndroidHardwareBufferInfoANDROID.buffer );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImportFenceFdInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImportFenceFdInfoKHR const & importFenceFdInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, importFenceFdInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, importFenceFdInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, importFenceFdInfoKHR.fence );\n      VULKAN_HPP_HASH_COMBINE( seed, importFenceFdInfoKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, importFenceFdInfoKHR.handleType );\n      VULKAN_HPP_HASH_COMBINE( seed, importFenceFdInfoKHR.fd );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImportFenceWin32HandleInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImportFenceWin32HandleInfoKHR const & importFenceWin32HandleInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, importFenceWin32HandleInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, importFenceWin32HandleInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, importFenceWin32HandleInfoKHR.fence );\n      VULKAN_HPP_HASH_COMBINE( seed, importFenceWin32HandleInfoKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, importFenceWin32HandleInfoKHR.handleType );\n      VULKAN_HPP_HASH_COMBINE( seed, importFenceWin32HandleInfoKHR.handle );\n      VULKAN_HPP_HASH_COMBINE( seed, importFenceWin32HandleInfoKHR.name );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImportMemoryBufferCollectionFUCHSIA>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImportMemoryBufferCollectionFUCHSIA const & importMemoryBufferCollectionFUCHSIA ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryBufferCollectionFUCHSIA.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryBufferCollectionFUCHSIA.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryBufferCollectionFUCHSIA.collection );\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryBufferCollectionFUCHSIA.index );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImportMemoryFdInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImportMemoryFdInfoKHR const & importMemoryFdInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryFdInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryFdInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryFdInfoKHR.handleType );\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryFdInfoKHR.fd );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImportMemoryHostPointerInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImportMemoryHostPointerInfoEXT const & importMemoryHostPointerInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryHostPointerInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryHostPointerInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryHostPointerInfoEXT.handleType );\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryHostPointerInfoEXT.pHostPointer );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImportMemoryMetalHandleInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImportMemoryMetalHandleInfoEXT const & importMemoryMetalHandleInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryMetalHandleInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryMetalHandleInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryMetalHandleInfoEXT.handleType );\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryMetalHandleInfoEXT.handle );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImportMemoryWin32HandleInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImportMemoryWin32HandleInfoKHR const & importMemoryWin32HandleInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryWin32HandleInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryWin32HandleInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryWin32HandleInfoKHR.handleType );\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryWin32HandleInfoKHR.handle );\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryWin32HandleInfoKHR.name );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImportMemoryWin32HandleInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImportMemoryWin32HandleInfoNV const & importMemoryWin32HandleInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryWin32HandleInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryWin32HandleInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryWin32HandleInfoNV.handleType );\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryWin32HandleInfoNV.handle );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImportMemoryZirconHandleInfoFUCHSIA>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImportMemoryZirconHandleInfoFUCHSIA const & importMemoryZirconHandleInfoFUCHSIA ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryZirconHandleInfoFUCHSIA.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryZirconHandleInfoFUCHSIA.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryZirconHandleInfoFUCHSIA.handleType );\n      VULKAN_HPP_HASH_COMBINE( seed, importMemoryZirconHandleInfoFUCHSIA.handle );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImportMetalBufferInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImportMetalBufferInfoEXT const & importMetalBufferInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, importMetalBufferInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, importMetalBufferInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, importMetalBufferInfoEXT.mtlBuffer );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImportMetalIOSurfaceInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImportMetalIOSurfaceInfoEXT const & importMetalIOSurfaceInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, importMetalIOSurfaceInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, importMetalIOSurfaceInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, importMetalIOSurfaceInfoEXT.ioSurface );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImportMetalSharedEventInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImportMetalSharedEventInfoEXT const & importMetalSharedEventInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, importMetalSharedEventInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, importMetalSharedEventInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, importMetalSharedEventInfoEXT.mtlSharedEvent );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImportMetalTextureInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImportMetalTextureInfoEXT const & importMetalTextureInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, importMetalTextureInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, importMetalTextureInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, importMetalTextureInfoEXT.plane );\n      VULKAN_HPP_HASH_COMBINE( seed, importMetalTextureInfoEXT.mtlTexture );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#  if defined( VK_USE_PLATFORM_SCREEN_QNX )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImportScreenBufferInfoQNX>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImportScreenBufferInfoQNX const & importScreenBufferInfoQNX ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, importScreenBufferInfoQNX.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, importScreenBufferInfoQNX.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, importScreenBufferInfoQNX.buffer );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImportSemaphoreFdInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImportSemaphoreFdInfoKHR const & importSemaphoreFdInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, importSemaphoreFdInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, importSemaphoreFdInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, importSemaphoreFdInfoKHR.semaphore );\n      VULKAN_HPP_HASH_COMBINE( seed, importSemaphoreFdInfoKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, importSemaphoreFdInfoKHR.handleType );\n      VULKAN_HPP_HASH_COMBINE( seed, importSemaphoreFdInfoKHR.fd );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImportSemaphoreWin32HandleInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImportSemaphoreWin32HandleInfoKHR const & importSemaphoreWin32HandleInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, importSemaphoreWin32HandleInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, importSemaphoreWin32HandleInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, importSemaphoreWin32HandleInfoKHR.semaphore );\n      VULKAN_HPP_HASH_COMBINE( seed, importSemaphoreWin32HandleInfoKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, importSemaphoreWin32HandleInfoKHR.handleType );\n      VULKAN_HPP_HASH_COMBINE( seed, importSemaphoreWin32HandleInfoKHR.handle );\n      VULKAN_HPP_HASH_COMBINE( seed, importSemaphoreWin32HandleInfoKHR.name );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ImportSemaphoreZirconHandleInfoFUCHSIA>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::ImportSemaphoreZirconHandleInfoFUCHSIA const & importSemaphoreZirconHandleInfoFUCHSIA ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, importSemaphoreZirconHandleInfoFUCHSIA.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, importSemaphoreZirconHandleInfoFUCHSIA.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, importSemaphoreZirconHandleInfoFUCHSIA.semaphore );\n      VULKAN_HPP_HASH_COMBINE( seed, importSemaphoreZirconHandleInfoFUCHSIA.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, importSemaphoreZirconHandleInfoFUCHSIA.handleType );\n      VULKAN_HPP_HASH_COMBINE( seed, importSemaphoreZirconHandleInfoFUCHSIA.zirconHandle );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::IndirectCommandsExecutionSetTokenEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::IndirectCommandsExecutionSetTokenEXT const & indirectCommandsExecutionSetTokenEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsExecutionSetTokenEXT.type );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsExecutionSetTokenEXT.shaderStages );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::IndirectCommandsIndexBufferTokenEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::IndirectCommandsIndexBufferTokenEXT const & indirectCommandsIndexBufferTokenEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsIndexBufferTokenEXT.mode );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PushConstantRange>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PushConstantRange const & pushConstantRange ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pushConstantRange.stageFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, pushConstantRange.offset );\n      VULKAN_HPP_HASH_COMBINE( seed, pushConstantRange.size );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::IndirectCommandsPushConstantTokenEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::IndirectCommandsPushConstantTokenEXT const & indirectCommandsPushConstantTokenEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsPushConstantTokenEXT.updateRange );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::IndirectCommandsVertexBufferTokenEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::IndirectCommandsVertexBufferTokenEXT const & indirectCommandsVertexBufferTokenEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsVertexBufferTokenEXT.vertexBindingUnit );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoEXT const & indirectCommandsLayoutCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutCreateInfoEXT.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutCreateInfoEXT.shaderStages );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutCreateInfoEXT.indirectStride );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutCreateInfoEXT.pipelineLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutCreateInfoEXT.tokenCount );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutCreateInfoEXT.pTokens );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenNV const & indirectCommandsLayoutTokenNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutTokenNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutTokenNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutTokenNV.tokenType );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutTokenNV.stream );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutTokenNV.offset );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutTokenNV.vertexBindingUnit );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutTokenNV.vertexDynamicStride );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutTokenNV.pushconstantPipelineLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutTokenNV.pushconstantShaderStageFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutTokenNV.pushconstantOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutTokenNV.pushconstantSize );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutTokenNV.indirectStateFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutTokenNV.indexTypeCount );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutTokenNV.pIndexTypes );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutTokenNV.pIndexTypeValues );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoNV const & indirectCommandsLayoutCreateInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutCreateInfoNV.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutCreateInfoNV.pipelineBindPoint );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutCreateInfoNV.tokenCount );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutCreateInfoNV.pTokens );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutCreateInfoNV.streamCount );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectCommandsLayoutCreateInfoNV.pStreamStrides );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::IndirectExecutionSetPipelineInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::IndirectExecutionSetPipelineInfoEXT const & indirectExecutionSetPipelineInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, indirectExecutionSetPipelineInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectExecutionSetPipelineInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectExecutionSetPipelineInfoEXT.initialPipeline );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectExecutionSetPipelineInfoEXT.maxPipelineCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::IndirectExecutionSetShaderLayoutInfoEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::IndirectExecutionSetShaderLayoutInfoEXT const & indirectExecutionSetShaderLayoutInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, indirectExecutionSetShaderLayoutInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectExecutionSetShaderLayoutInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectExecutionSetShaderLayoutInfoEXT.setLayoutCount );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectExecutionSetShaderLayoutInfoEXT.pSetLayouts );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::IndirectExecutionSetShaderInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::IndirectExecutionSetShaderInfoEXT const & indirectExecutionSetShaderInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, indirectExecutionSetShaderInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectExecutionSetShaderInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectExecutionSetShaderInfoEXT.shaderCount );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectExecutionSetShaderInfoEXT.pInitialShaders );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectExecutionSetShaderInfoEXT.pSetLayoutInfos );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectExecutionSetShaderInfoEXT.maxShaderCount );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectExecutionSetShaderInfoEXT.pushConstantRangeCount );\n      VULKAN_HPP_HASH_COMBINE( seed, indirectExecutionSetShaderInfoEXT.pPushConstantRanges );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::InitializePerformanceApiInfoINTEL>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::InitializePerformanceApiInfoINTEL const & initializePerformanceApiInfoINTEL ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, initializePerformanceApiInfoINTEL.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, initializePerformanceApiInfoINTEL.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, initializePerformanceApiInfoINTEL.pUserData );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::InputAttachmentAspectReference>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::InputAttachmentAspectReference const & inputAttachmentAspectReference ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, inputAttachmentAspectReference.subpass );\n      VULKAN_HPP_HASH_COMBINE( seed, inputAttachmentAspectReference.inputAttachmentIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, inputAttachmentAspectReference.aspectMask );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::InstanceCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::InstanceCreateInfo const & instanceCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, instanceCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, instanceCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, instanceCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, instanceCreateInfo.pApplicationInfo );\n      VULKAN_HPP_HASH_COMBINE( seed, instanceCreateInfo.enabledLayerCount );\n      for ( size_t i = 0; i < instanceCreateInfo.enabledLayerCount; ++i )\n      {\n        for ( const char * p = instanceCreateInfo.ppEnabledLayerNames[i]; *p != '\\0'; ++p )\n        {\n          VULKAN_HPP_HASH_COMBINE( seed, *p );\n        }\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, instanceCreateInfo.enabledExtensionCount );\n      for ( size_t i = 0; i < instanceCreateInfo.enabledExtensionCount; ++i )\n      {\n        for ( const char * p = instanceCreateInfo.ppEnabledExtensionNames[i]; *p != '\\0'; ++p )\n        {\n          VULKAN_HPP_HASH_COMBINE( seed, *p );\n        }\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::LatencySleepInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::LatencySleepInfoNV const & latencySleepInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, latencySleepInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, latencySleepInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, latencySleepInfoNV.signalSemaphore );\n      VULKAN_HPP_HASH_COMBINE( seed, latencySleepInfoNV.value );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::LatencySleepModeInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::LatencySleepModeInfoNV const & latencySleepModeInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, latencySleepModeInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, latencySleepModeInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, latencySleepModeInfoNV.lowLatencyMode );\n      VULKAN_HPP_HASH_COMBINE( seed, latencySleepModeInfoNV.lowLatencyBoost );\n      VULKAN_HPP_HASH_COMBINE( seed, latencySleepModeInfoNV.minimumIntervalUs );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::LatencySubmissionPresentIdNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::LatencySubmissionPresentIdNV const & latencySubmissionPresentIdNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, latencySubmissionPresentIdNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, latencySubmissionPresentIdNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, latencySubmissionPresentIdNV.presentID );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::LatencySurfaceCapabilitiesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::LatencySurfaceCapabilitiesNV const & latencySurfaceCapabilitiesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, latencySurfaceCapabilitiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, latencySurfaceCapabilitiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, latencySurfaceCapabilitiesNV.presentModeCount );\n      VULKAN_HPP_HASH_COMBINE( seed, latencySurfaceCapabilitiesNV.pPresentModes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::LayerProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::LayerProperties const & layerProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      for ( size_t i = 0; i < VK_MAX_EXTENSION_NAME_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, layerProperties.layerName[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, layerProperties.specVersion );\n      VULKAN_HPP_HASH_COMBINE( seed, layerProperties.implementationVersion );\n      for ( size_t i = 0; i < VK_MAX_DESCRIPTION_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, layerProperties.description[i] );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::LayerSettingEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::LayerSettingEXT const & layerSettingEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      for ( const char * p = layerSettingEXT.pLayerName; *p != '\\0'; ++p )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, *p );\n      }\n      for ( const char * p = layerSettingEXT.pSettingName; *p != '\\0'; ++p )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, *p );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, layerSettingEXT.type );\n      VULKAN_HPP_HASH_COMBINE( seed, layerSettingEXT.valueCount );\n      VULKAN_HPP_HASH_COMBINE( seed, layerSettingEXT.pValues );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::LayerSettingsCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::LayerSettingsCreateInfoEXT const & layerSettingsCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, layerSettingsCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, layerSettingsCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, layerSettingsCreateInfoEXT.settingCount );\n      VULKAN_HPP_HASH_COMBINE( seed, layerSettingsCreateInfoEXT.pSettings );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_MACOS_MVK )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateInfoMVK>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateInfoMVK const & macOSSurfaceCreateInfoMVK ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, macOSSurfaceCreateInfoMVK.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, macOSSurfaceCreateInfoMVK.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, macOSSurfaceCreateInfoMVK.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, macOSSurfaceCreateInfoMVK.pView );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_MACOS_MVK*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MappedMemoryRange>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MappedMemoryRange const & mappedMemoryRange ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, mappedMemoryRange.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, mappedMemoryRange.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, mappedMemoryRange.memory );\n      VULKAN_HPP_HASH_COMBINE( seed, mappedMemoryRange.offset );\n      VULKAN_HPP_HASH_COMBINE( seed, mappedMemoryRange.size );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryAllocateFlagsInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryAllocateFlagsInfo const & memoryAllocateFlagsInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryAllocateFlagsInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryAllocateFlagsInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryAllocateFlagsInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryAllocateFlagsInfo.deviceMask );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryAllocateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryAllocateInfo const & memoryAllocateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryAllocateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryAllocateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryAllocateInfo.allocationSize );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryAllocateInfo.memoryTypeIndex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryBarrier>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryBarrier const & memoryBarrier ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryBarrier.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryBarrier.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryBarrier.srcAccessMask );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryBarrier.dstAccessMask );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryBarrierAccessFlags3KHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryBarrierAccessFlags3KHR const & memoryBarrierAccessFlags3KHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryBarrierAccessFlags3KHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryBarrierAccessFlags3KHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryBarrierAccessFlags3KHR.srcAccessMask3 );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryBarrierAccessFlags3KHR.dstAccessMask3 );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryDedicatedAllocateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryDedicatedAllocateInfo const & memoryDedicatedAllocateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryDedicatedAllocateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryDedicatedAllocateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryDedicatedAllocateInfo.image );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryDedicatedAllocateInfo.buffer );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryDedicatedRequirements>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryDedicatedRequirements const & memoryDedicatedRequirements ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryDedicatedRequirements.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryDedicatedRequirements.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryDedicatedRequirements.prefersDedicatedAllocation );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryDedicatedRequirements.requiresDedicatedAllocation );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryFdPropertiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryFdPropertiesKHR const & memoryFdPropertiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryFdPropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryFdPropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryFdPropertiesKHR.memoryTypeBits );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryGetAndroidHardwareBufferInfoANDROID>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::MemoryGetAndroidHardwareBufferInfoANDROID const & memoryGetAndroidHardwareBufferInfoANDROID ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryGetAndroidHardwareBufferInfoANDROID.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryGetAndroidHardwareBufferInfoANDROID.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryGetAndroidHardwareBufferInfoANDROID.memory );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryGetFdInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryGetFdInfoKHR const & memoryGetFdInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryGetFdInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryGetFdInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryGetFdInfoKHR.memory );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryGetFdInfoKHR.handleType );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryGetMetalHandleInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryGetMetalHandleInfoEXT const & memoryGetMetalHandleInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryGetMetalHandleInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryGetMetalHandleInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryGetMetalHandleInfoEXT.memory );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryGetMetalHandleInfoEXT.handleType );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryGetRemoteAddressInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryGetRemoteAddressInfoNV const & memoryGetRemoteAddressInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryGetRemoteAddressInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryGetRemoteAddressInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryGetRemoteAddressInfoNV.memory );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryGetRemoteAddressInfoNV.handleType );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryGetWin32HandleInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryGetWin32HandleInfoKHR const & memoryGetWin32HandleInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryGetWin32HandleInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryGetWin32HandleInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryGetWin32HandleInfoKHR.memory );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryGetWin32HandleInfoKHR.handleType );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryGetZirconHandleInfoFUCHSIA>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryGetZirconHandleInfoFUCHSIA const & memoryGetZirconHandleInfoFUCHSIA ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryGetZirconHandleInfoFUCHSIA.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryGetZirconHandleInfoFUCHSIA.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryGetZirconHandleInfoFUCHSIA.memory );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryGetZirconHandleInfoFUCHSIA.handleType );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryHeap>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryHeap const & memoryHeap ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryHeap.size );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryHeap.flags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryHostPointerPropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryHostPointerPropertiesEXT const & memoryHostPointerPropertiesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryHostPointerPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryHostPointerPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryHostPointerPropertiesEXT.memoryTypeBits );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryMapInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryMapInfo const & memoryMapInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryMapInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryMapInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryMapInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryMapInfo.memory );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryMapInfo.offset );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryMapInfo.size );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryMapPlacedInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryMapPlacedInfoEXT const & memoryMapPlacedInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryMapPlacedInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryMapPlacedInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryMapPlacedInfoEXT.pPlacedAddress );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryMetalHandlePropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryMetalHandlePropertiesEXT const & memoryMetalHandlePropertiesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryMetalHandlePropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryMetalHandlePropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryMetalHandlePropertiesEXT.memoryTypeBits );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryOpaqueCaptureAddressAllocateInfo>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::MemoryOpaqueCaptureAddressAllocateInfo const & memoryOpaqueCaptureAddressAllocateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryOpaqueCaptureAddressAllocateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryOpaqueCaptureAddressAllocateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryOpaqueCaptureAddressAllocateInfo.opaqueCaptureAddress );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryPriorityAllocateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryPriorityAllocateInfoEXT const & memoryPriorityAllocateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryPriorityAllocateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryPriorityAllocateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryPriorityAllocateInfoEXT.priority );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryRequirements>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryRequirements const & memoryRequirements ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryRequirements.size );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryRequirements.alignment );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryRequirements.memoryTypeBits );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryRequirements2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryRequirements2 const & memoryRequirements2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryRequirements2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryRequirements2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryRequirements2.memoryRequirements );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryType>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryType const & memoryType ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryType.propertyFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryType.heapIndex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryUnmapInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryUnmapInfo const & memoryUnmapInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryUnmapInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryUnmapInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryUnmapInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryUnmapInfo.memory );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryWin32HandlePropertiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryWin32HandlePropertiesKHR const & memoryWin32HandlePropertiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryWin32HandlePropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryWin32HandlePropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryWin32HandlePropertiesKHR.memoryTypeBits );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MemoryZirconHandlePropertiesFUCHSIA>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MemoryZirconHandlePropertiesFUCHSIA const & memoryZirconHandlePropertiesFUCHSIA ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, memoryZirconHandlePropertiesFUCHSIA.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryZirconHandlePropertiesFUCHSIA.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, memoryZirconHandlePropertiesFUCHSIA.memoryTypeBits );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MetalSurfaceCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MetalSurfaceCreateInfoEXT const & metalSurfaceCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, metalSurfaceCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, metalSurfaceCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, metalSurfaceCreateInfoEXT.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, metalSurfaceCreateInfoEXT.pLayer );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MicromapBuildSizesInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MicromapBuildSizesInfoEXT const & micromapBuildSizesInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, micromapBuildSizesInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, micromapBuildSizesInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, micromapBuildSizesInfoEXT.micromapSize );\n      VULKAN_HPP_HASH_COMBINE( seed, micromapBuildSizesInfoEXT.buildScratchSize );\n      VULKAN_HPP_HASH_COMBINE( seed, micromapBuildSizesInfoEXT.discardable );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MicromapCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MicromapCreateInfoEXT const & micromapCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, micromapCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, micromapCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, micromapCreateInfoEXT.createFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, micromapCreateInfoEXT.buffer );\n      VULKAN_HPP_HASH_COMBINE( seed, micromapCreateInfoEXT.offset );\n      VULKAN_HPP_HASH_COMBINE( seed, micromapCreateInfoEXT.size );\n      VULKAN_HPP_HASH_COMBINE( seed, micromapCreateInfoEXT.type );\n      VULKAN_HPP_HASH_COMBINE( seed, micromapCreateInfoEXT.deviceAddress );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MicromapTriangleEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MicromapTriangleEXT const & micromapTriangleEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, micromapTriangleEXT.dataOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, micromapTriangleEXT.subdivisionLevel );\n      VULKAN_HPP_HASH_COMBINE( seed, micromapTriangleEXT.format );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MicromapVersionInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MicromapVersionInfoEXT const & micromapVersionInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, micromapVersionInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, micromapVersionInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, micromapVersionInfoEXT.pVersionData );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MultiDrawIndexedInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MultiDrawIndexedInfoEXT const & multiDrawIndexedInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, multiDrawIndexedInfoEXT.firstIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, multiDrawIndexedInfoEXT.indexCount );\n      VULKAN_HPP_HASH_COMBINE( seed, multiDrawIndexedInfoEXT.vertexOffset );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MultiDrawInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MultiDrawInfoEXT const & multiDrawInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, multiDrawInfoEXT.firstVertex );\n      VULKAN_HPP_HASH_COMBINE( seed, multiDrawInfoEXT.vertexCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MultisamplePropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MultisamplePropertiesEXT const & multisamplePropertiesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, multisamplePropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, multisamplePropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, multisamplePropertiesEXT.maxSampleLocationGridSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MultisampledRenderToSingleSampledInfoEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::MultisampledRenderToSingleSampledInfoEXT const & multisampledRenderToSingleSampledInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, multisampledRenderToSingleSampledInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, multisampledRenderToSingleSampledInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, multisampledRenderToSingleSampledInfoEXT.multisampledRenderToSingleSampledEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, multisampledRenderToSingleSampledInfoEXT.rasterizationSamples );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MultiviewPerViewAttributesInfoNVX>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MultiviewPerViewAttributesInfoNVX const & multiviewPerViewAttributesInfoNVX ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, multiviewPerViewAttributesInfoNVX.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, multiviewPerViewAttributesInfoNVX.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, multiviewPerViewAttributesInfoNVX.perViewAttributes );\n      VULKAN_HPP_HASH_COMBINE( seed, multiviewPerViewAttributesInfoNVX.perViewAttributesPositionXOnly );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM const & multiviewPerViewRenderAreasRenderPassBeginInfoQCOM ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, multiviewPerViewRenderAreasRenderPassBeginInfoQCOM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, multiviewPerViewRenderAreasRenderPassBeginInfoQCOM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, multiviewPerViewRenderAreasRenderPassBeginInfoQCOM.perViewRenderAreaCount );\n      VULKAN_HPP_HASH_COMBINE( seed, multiviewPerViewRenderAreasRenderPassBeginInfoQCOM.pPerViewRenderAreas );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MutableDescriptorTypeListEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MutableDescriptorTypeListEXT const & mutableDescriptorTypeListEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, mutableDescriptorTypeListEXT.descriptorTypeCount );\n      VULKAN_HPP_HASH_COMBINE( seed, mutableDescriptorTypeListEXT.pDescriptorTypes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::MutableDescriptorTypeCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::MutableDescriptorTypeCreateInfoEXT const & mutableDescriptorTypeCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, mutableDescriptorTypeCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, mutableDescriptorTypeCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, mutableDescriptorTypeCreateInfoEXT.mutableDescriptorTypeListCount );\n      VULKAN_HPP_HASH_COMBINE( seed, mutableDescriptorTypeCreateInfoEXT.pMutableDescriptorTypeLists );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::OpaqueCaptureDescriptorDataCreateInfoEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::OpaqueCaptureDescriptorDataCreateInfoEXT const & opaqueCaptureDescriptorDataCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, opaqueCaptureDescriptorDataCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, opaqueCaptureDescriptorDataCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, opaqueCaptureDescriptorDataCreateInfoEXT.opaqueCaptureDescriptorData );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::OpticalFlowExecuteInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::OpticalFlowExecuteInfoNV const & opticalFlowExecuteInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowExecuteInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowExecuteInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowExecuteInfoNV.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowExecuteInfoNV.regionCount );\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowExecuteInfoNV.pRegions );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatInfoNV const & opticalFlowImageFormatInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowImageFormatInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowImageFormatInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowImageFormatInfoNV.usage );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatPropertiesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatPropertiesNV const & opticalFlowImageFormatPropertiesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowImageFormatPropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowImageFormatPropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowImageFormatPropertiesNV.format );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreateInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreateInfoNV const & opticalFlowSessionCreateInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowSessionCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowSessionCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowSessionCreateInfoNV.width );\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowSessionCreateInfoNV.height );\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowSessionCreateInfoNV.imageFormat );\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowSessionCreateInfoNV.flowVectorFormat );\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowSessionCreateInfoNV.costFormat );\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowSessionCreateInfoNV.outputGridSize );\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowSessionCreateInfoNV.hintGridSize );\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowSessionCreateInfoNV.performanceLevel );\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowSessionCreateInfoNV.flags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreatePrivateDataInfoNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreatePrivateDataInfoNV const & opticalFlowSessionCreatePrivateDataInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowSessionCreatePrivateDataInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowSessionCreatePrivateDataInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowSessionCreatePrivateDataInfoNV.id );\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowSessionCreatePrivateDataInfoNV.size );\n      VULKAN_HPP_HASH_COMBINE( seed, opticalFlowSessionCreatePrivateDataInfoNV.pPrivateData );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::OutOfBandQueueTypeInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::OutOfBandQueueTypeInfoNV const & outOfBandQueueTypeInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, outOfBandQueueTypeInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, outOfBandQueueTypeInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, outOfBandQueueTypeInfoNV.queueType );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureFlagsNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureFlagsNV const & partitionedAccelerationStructureFlagsNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureFlagsNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureFlagsNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureFlagsNV.enablePartitionTranslation );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureUpdateInstanceDataNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureUpdateInstanceDataNV const &\n                              partitionedAccelerationStructureUpdateInstanceDataNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureUpdateInstanceDataNV.instanceIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureUpdateInstanceDataNV.instanceContributionToHitGroupIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureUpdateInstanceDataNV.accelerationStructure );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureWriteInstanceDataNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureWriteInstanceDataNV const & partitionedAccelerationStructureWriteInstanceDataNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureWriteInstanceDataNV.transform );\n      for ( size_t i = 0; i < 6; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureWriteInstanceDataNV.explicitAABB[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureWriteInstanceDataNV.instanceID );\n      VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureWriteInstanceDataNV.instanceMask );\n      VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureWriteInstanceDataNV.instanceContributionToHitGroupIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureWriteInstanceDataNV.instanceFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureWriteInstanceDataNV.instanceIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureWriteInstanceDataNV.partitionIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureWriteInstanceDataNV.accelerationStructure );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureWritePartitionTranslationDataNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureWritePartitionTranslationDataNV const &\n                              partitionedAccelerationStructureWritePartitionTranslationDataNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureWritePartitionTranslationDataNV.partitionIndex );\n      for ( size_t i = 0; i < 3; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, partitionedAccelerationStructureWritePartitionTranslationDataNV.partitionTranslation[i] );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE const & pastPresentationTimingGOOGLE ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pastPresentationTimingGOOGLE.presentID );\n      VULKAN_HPP_HASH_COMBINE( seed, pastPresentationTimingGOOGLE.desiredPresentTime );\n      VULKAN_HPP_HASH_COMBINE( seed, pastPresentationTimingGOOGLE.actualPresentTime );\n      VULKAN_HPP_HASH_COMBINE( seed, pastPresentationTimingGOOGLE.earliestPresentTime );\n      VULKAN_HPP_HASH_COMBINE( seed, pastPresentationTimingGOOGLE.presentMargin );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PerformanceConfigurationAcquireInfoINTEL>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PerformanceConfigurationAcquireInfoINTEL const & performanceConfigurationAcquireInfoINTEL ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, performanceConfigurationAcquireInfoINTEL.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, performanceConfigurationAcquireInfoINTEL.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, performanceConfigurationAcquireInfoINTEL.type );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR const & performanceCounterDescriptionKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, performanceCounterDescriptionKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, performanceCounterDescriptionKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, performanceCounterDescriptionKHR.flags );\n      for ( size_t i = 0; i < VK_MAX_DESCRIPTION_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, performanceCounterDescriptionKHR.name[i] );\n      }\n      for ( size_t i = 0; i < VK_MAX_DESCRIPTION_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, performanceCounterDescriptionKHR.category[i] );\n      }\n      for ( size_t i = 0; i < VK_MAX_DESCRIPTION_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, performanceCounterDescriptionKHR.description[i] );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PerformanceCounterKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PerformanceCounterKHR const & performanceCounterKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, performanceCounterKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, performanceCounterKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, performanceCounterKHR.unit );\n      VULKAN_HPP_HASH_COMBINE( seed, performanceCounterKHR.scope );\n      VULKAN_HPP_HASH_COMBINE( seed, performanceCounterKHR.storage );\n      for ( size_t i = 0; i < VK_UUID_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, performanceCounterKHR.uuid[i] );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PerformanceMarkerInfoINTEL>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PerformanceMarkerInfoINTEL const & performanceMarkerInfoINTEL ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, performanceMarkerInfoINTEL.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, performanceMarkerInfoINTEL.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, performanceMarkerInfoINTEL.marker );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PerformanceOverrideInfoINTEL>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PerformanceOverrideInfoINTEL const & performanceOverrideInfoINTEL ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, performanceOverrideInfoINTEL.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, performanceOverrideInfoINTEL.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, performanceOverrideInfoINTEL.type );\n      VULKAN_HPP_HASH_COMBINE( seed, performanceOverrideInfoINTEL.enable );\n      VULKAN_HPP_HASH_COMBINE( seed, performanceOverrideInfoINTEL.parameter );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PerformanceQuerySubmitInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PerformanceQuerySubmitInfoKHR const & performanceQuerySubmitInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, performanceQuerySubmitInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, performanceQuerySubmitInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, performanceQuerySubmitInfoKHR.counterPassIndex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PerformanceStreamMarkerInfoINTEL>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PerformanceStreamMarkerInfoINTEL const & performanceStreamMarkerInfoINTEL ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, performanceStreamMarkerInfoINTEL.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, performanceStreamMarkerInfoINTEL.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, performanceStreamMarkerInfoINTEL.marker );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevice16BitStorageFeatures>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDevice16BitStorageFeatures const & physicalDevice16BitStorageFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevice16BitStorageFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevice16BitStorageFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevice16BitStorageFeatures.storageBuffer16BitAccess );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevice16BitStorageFeatures.uniformAndStorageBuffer16BitAccess );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevice16BitStorageFeatures.storagePushConstant16 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevice16BitStorageFeatures.storageInputOutput16 );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevice4444FormatsFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDevice4444FormatsFeaturesEXT const & physicalDevice4444FormatsFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevice4444FormatsFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevice4444FormatsFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevice4444FormatsFeaturesEXT.formatA4R4G4B4 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevice4444FormatsFeaturesEXT.formatA4B4G4R4 );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevice8BitStorageFeatures>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDevice8BitStorageFeatures const & physicalDevice8BitStorageFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevice8BitStorageFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevice8BitStorageFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevice8BitStorageFeatures.storageBuffer8BitAccess );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevice8BitStorageFeatures.uniformAndStorageBuffer8BitAccess );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevice8BitStorageFeatures.storagePushConstant8 );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceASTCDecodeFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceASTCDecodeFeaturesEXT const & physicalDeviceASTCDecodeFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceASTCDecodeFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceASTCDecodeFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceASTCDecodeFeaturesEXT.decodeModeSharedExponent );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceAccelerationStructureFeaturesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceAccelerationStructureFeaturesKHR const & physicalDeviceAccelerationStructureFeaturesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAccelerationStructureFeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAccelerationStructureFeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAccelerationStructureFeaturesKHR.accelerationStructure );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAccelerationStructureFeaturesKHR.accelerationStructureCaptureReplay );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAccelerationStructureFeaturesKHR.accelerationStructureIndirectBuild );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAccelerationStructureFeaturesKHR.accelerationStructureHostCommands );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAccelerationStructureFeaturesKHR.descriptorBindingAccelerationStructureUpdateAfterBind );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceAccelerationStructurePropertiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceAccelerationStructurePropertiesKHR const & physicalDeviceAccelerationStructurePropertiesKHR )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAccelerationStructurePropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAccelerationStructurePropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAccelerationStructurePropertiesKHR.maxGeometryCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAccelerationStructurePropertiesKHR.maxInstanceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAccelerationStructurePropertiesKHR.maxPrimitiveCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAccelerationStructurePropertiesKHR.maxPerStageDescriptorAccelerationStructures );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAccelerationStructurePropertiesKHR.maxPerStageDescriptorUpdateAfterBindAccelerationStructures );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAccelerationStructurePropertiesKHR.maxDescriptorSetAccelerationStructures );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAccelerationStructurePropertiesKHR.maxDescriptorSetUpdateAfterBindAccelerationStructures );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAccelerationStructurePropertiesKHR.minAccelerationStructureScratchOffsetAlignment );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceAddressBindingReportFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceAddressBindingReportFeaturesEXT const & physicalDeviceAddressBindingReportFeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAddressBindingReportFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAddressBindingReportFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAddressBindingReportFeaturesEXT.reportAddressBinding );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceAmigoProfilingFeaturesSEC>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceAmigoProfilingFeaturesSEC const & physicalDeviceAmigoProfilingFeaturesSEC ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAmigoProfilingFeaturesSEC.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAmigoProfilingFeaturesSEC.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAmigoProfilingFeaturesSEC.amigoProfiling );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceAntiLagFeaturesAMD>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceAntiLagFeaturesAMD const & physicalDeviceAntiLagFeaturesAMD ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAntiLagFeaturesAMD.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAntiLagFeaturesAMD.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAntiLagFeaturesAMD.antiLag );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT const &\n                              physicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT.attachmentFeedbackLoopDynamicState );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT const &\n                              physicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT.attachmentFeedbackLoopLayout );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceBlendOperationAdvancedFeaturesEXT>\n  {\n    std::size_t operator()(\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceBlendOperationAdvancedFeaturesEXT const & physicalDeviceBlendOperationAdvancedFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBlendOperationAdvancedFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBlendOperationAdvancedFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBlendOperationAdvancedFeaturesEXT.advancedBlendCoherentOperations );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceBlendOperationAdvancedPropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceBlendOperationAdvancedPropertiesEXT const & physicalDeviceBlendOperationAdvancedPropertiesEXT )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBlendOperationAdvancedPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBlendOperationAdvancedPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBlendOperationAdvancedPropertiesEXT.advancedBlendMaxColorAttachments );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBlendOperationAdvancedPropertiesEXT.advancedBlendIndependentBlend );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBlendOperationAdvancedPropertiesEXT.advancedBlendNonPremultipliedSrcColor );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBlendOperationAdvancedPropertiesEXT.advancedBlendNonPremultipliedDstColor );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBlendOperationAdvancedPropertiesEXT.advancedBlendCorrelatedOverlap );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBlendOperationAdvancedPropertiesEXT.advancedBlendAllOperations );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceBorderColorSwizzleFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceBorderColorSwizzleFeaturesEXT const & physicalDeviceBorderColorSwizzleFeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBorderColorSwizzleFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBorderColorSwizzleFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBorderColorSwizzleFeaturesEXT.borderColorSwizzle );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBorderColorSwizzleFeaturesEXT.borderColorSwizzleFromImage );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceBufferDeviceAddressFeatures>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceBufferDeviceAddressFeatures const & physicalDeviceBufferDeviceAddressFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBufferDeviceAddressFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBufferDeviceAddressFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBufferDeviceAddressFeatures.bufferDeviceAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBufferDeviceAddressFeatures.bufferDeviceAddressCaptureReplay );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBufferDeviceAddressFeatures.bufferDeviceAddressMultiDevice );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceBufferDeviceAddressFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceBufferDeviceAddressFeaturesEXT const & physicalDeviceBufferDeviceAddressFeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBufferDeviceAddressFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBufferDeviceAddressFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBufferDeviceAddressFeaturesEXT.bufferDeviceAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBufferDeviceAddressFeaturesEXT.bufferDeviceAddressCaptureReplay );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceBufferDeviceAddressFeaturesEXT.bufferDeviceAddressMultiDevice );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterAccelerationStructureFeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterAccelerationStructureFeaturesNV const &\n                              physicalDeviceClusterAccelerationStructureFeaturesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterAccelerationStructureFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterAccelerationStructureFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterAccelerationStructureFeaturesNV.clusterAccelerationStructure );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterAccelerationStructurePropertiesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterAccelerationStructurePropertiesNV const &\n                              physicalDeviceClusterAccelerationStructurePropertiesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterAccelerationStructurePropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterAccelerationStructurePropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterAccelerationStructurePropertiesNV.maxVerticesPerCluster );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterAccelerationStructurePropertiesNV.maxTrianglesPerCluster );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterAccelerationStructurePropertiesNV.clusterScratchByteAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterAccelerationStructurePropertiesNV.clusterByteAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterAccelerationStructurePropertiesNV.clusterTemplateByteAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterAccelerationStructurePropertiesNV.clusterBottomLevelByteAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterAccelerationStructurePropertiesNV.clusterTemplateBoundsByteAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterAccelerationStructurePropertiesNV.maxClusterGeometryIndex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterCullingShaderFeaturesHUAWEI>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterCullingShaderFeaturesHUAWEI const & physicalDeviceClusterCullingShaderFeaturesHUAWEI )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterCullingShaderFeaturesHUAWEI.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterCullingShaderFeaturesHUAWEI.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterCullingShaderFeaturesHUAWEI.clustercullingShader );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterCullingShaderFeaturesHUAWEI.multiviewClusterCullingShader );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterCullingShaderPropertiesHUAWEI>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterCullingShaderPropertiesHUAWEI const & physicalDeviceClusterCullingShaderPropertiesHUAWEI ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterCullingShaderPropertiesHUAWEI.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterCullingShaderPropertiesHUAWEI.pNext );\n      for ( size_t i = 0; i < 3; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterCullingShaderPropertiesHUAWEI.maxWorkGroupCount[i] );\n      }\n      for ( size_t i = 0; i < 3; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterCullingShaderPropertiesHUAWEI.maxWorkGroupSize[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterCullingShaderPropertiesHUAWEI.maxOutputClusterCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterCullingShaderPropertiesHUAWEI.indirectBufferOffsetAlignment );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI const & physicalDeviceClusterCullingShaderVrsFeaturesHUAWEI ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterCullingShaderVrsFeaturesHUAWEI.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterCullingShaderVrsFeaturesHUAWEI.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceClusterCullingShaderVrsFeaturesHUAWEI.clusterShadingRate );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCoherentMemoryFeaturesAMD>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceCoherentMemoryFeaturesAMD const & physicalDeviceCoherentMemoryFeaturesAMD ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCoherentMemoryFeaturesAMD.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCoherentMemoryFeaturesAMD.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCoherentMemoryFeaturesAMD.deviceCoherentMemory );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceColorWriteEnableFeaturesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceColorWriteEnableFeaturesEXT const & physicalDeviceColorWriteEnableFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceColorWriteEnableFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceColorWriteEnableFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceColorWriteEnableFeaturesEXT.colorWriteEnable );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCommandBufferInheritanceFeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceCommandBufferInheritanceFeaturesNV const & physicalDeviceCommandBufferInheritanceFeaturesNV )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCommandBufferInheritanceFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCommandBufferInheritanceFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCommandBufferInheritanceFeaturesNV.commandBufferInheritance );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceComputeShaderDerivativesFeaturesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceComputeShaderDerivativesFeaturesKHR const & physicalDeviceComputeShaderDerivativesFeaturesKHR )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceComputeShaderDerivativesFeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceComputeShaderDerivativesFeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceComputeShaderDerivativesFeaturesKHR.computeDerivativeGroupQuads );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceComputeShaderDerivativesFeaturesKHR.computeDerivativeGroupLinear );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceComputeShaderDerivativesPropertiesKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceComputeShaderDerivativesPropertiesKHR const & physicalDeviceComputeShaderDerivativesPropertiesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceComputeShaderDerivativesPropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceComputeShaderDerivativesPropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceComputeShaderDerivativesPropertiesKHR.meshAndTaskShaderDerivatives );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceConditionalRenderingFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceConditionalRenderingFeaturesEXT const & physicalDeviceConditionalRenderingFeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceConditionalRenderingFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceConditionalRenderingFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceConditionalRenderingFeaturesEXT.conditionalRendering );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceConditionalRenderingFeaturesEXT.inheritedConditionalRendering );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceConservativeRasterizationPropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceConservativeRasterizationPropertiesEXT const &\n                              physicalDeviceConservativeRasterizationPropertiesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceConservativeRasterizationPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceConservativeRasterizationPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceConservativeRasterizationPropertiesEXT.primitiveOverestimationSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceConservativeRasterizationPropertiesEXT.maxExtraPrimitiveOverestimationSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceConservativeRasterizationPropertiesEXT.extraPrimitiveOverestimationSizeGranularity );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceConservativeRasterizationPropertiesEXT.primitiveUnderestimation );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceConservativeRasterizationPropertiesEXT.conservativePointAndLineRasterization );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceConservativeRasterizationPropertiesEXT.degenerateTrianglesRasterized );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceConservativeRasterizationPropertiesEXT.degenerateLinesRasterized );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceConservativeRasterizationPropertiesEXT.fullyCoveredFragmentShaderInputVariable );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceConservativeRasterizationPropertiesEXT.conservativeRasterizationPostDepthCoverage );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrix2FeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrix2FeaturesNV const & physicalDeviceCooperativeMatrix2FeaturesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrix2FeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrix2FeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrix2FeaturesNV.cooperativeMatrixWorkgroupScope );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrix2FeaturesNV.cooperativeMatrixFlexibleDimensions );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrix2FeaturesNV.cooperativeMatrixReductions );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrix2FeaturesNV.cooperativeMatrixConversions );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrix2FeaturesNV.cooperativeMatrixPerElementOperations );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrix2FeaturesNV.cooperativeMatrixTensorAddressing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrix2FeaturesNV.cooperativeMatrixBlockLoads );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrix2PropertiesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrix2PropertiesNV const & physicalDeviceCooperativeMatrix2PropertiesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrix2PropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrix2PropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrix2PropertiesNV.cooperativeMatrixWorkgroupScopeMaxWorkgroupSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrix2PropertiesNV.cooperativeMatrixFlexibleDimensionsMaxDimension );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrix2PropertiesNV.cooperativeMatrixWorkgroupScopeReservedSharedMemory );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixFeaturesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixFeaturesKHR const & physicalDeviceCooperativeMatrixFeaturesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrixFeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrixFeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrixFeaturesKHR.cooperativeMatrix );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrixFeaturesKHR.cooperativeMatrixRobustBufferAccess );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixFeaturesNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixFeaturesNV const & physicalDeviceCooperativeMatrixFeaturesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrixFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrixFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrixFeaturesNV.cooperativeMatrix );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrixFeaturesNV.cooperativeMatrixRobustBufferAccess );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixPropertiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixPropertiesKHR const & physicalDeviceCooperativeMatrixPropertiesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrixPropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrixPropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrixPropertiesKHR.cooperativeMatrixSupportedStages );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixPropertiesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixPropertiesNV const & physicalDeviceCooperativeMatrixPropertiesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrixPropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrixPropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeMatrixPropertiesNV.cooperativeMatrixSupportedStages );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeVectorFeaturesNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeVectorFeaturesNV const & physicalDeviceCooperativeVectorFeaturesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeVectorFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeVectorFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeVectorFeaturesNV.cooperativeVector );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeVectorFeaturesNV.cooperativeVectorTraining );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeVectorPropertiesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeVectorPropertiesNV const & physicalDeviceCooperativeVectorPropertiesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeVectorPropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeVectorPropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeVectorPropertiesNV.cooperativeVectorSupportedStages );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeVectorPropertiesNV.cooperativeVectorTrainingFloat16Accumulation );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeVectorPropertiesNV.cooperativeVectorTrainingFloat32Accumulation );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCooperativeVectorPropertiesNV.maxCooperativeVectorComponents );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCopyMemoryIndirectFeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceCopyMemoryIndirectFeaturesNV const & physicalDeviceCopyMemoryIndirectFeaturesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCopyMemoryIndirectFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCopyMemoryIndirectFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCopyMemoryIndirectFeaturesNV.indirectCopy );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCopyMemoryIndirectPropertiesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceCopyMemoryIndirectPropertiesNV const & physicalDeviceCopyMemoryIndirectPropertiesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCopyMemoryIndirectPropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCopyMemoryIndirectPropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCopyMemoryIndirectPropertiesNV.supportedQueues );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCornerSampledImageFeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceCornerSampledImageFeaturesNV const & physicalDeviceCornerSampledImageFeaturesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCornerSampledImageFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCornerSampledImageFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCornerSampledImageFeaturesNV.cornerSampledImage );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCoverageReductionModeFeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceCoverageReductionModeFeaturesNV const & physicalDeviceCoverageReductionModeFeaturesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCoverageReductionModeFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCoverageReductionModeFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCoverageReductionModeFeaturesNV.coverageReductionMode );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCubicClampFeaturesQCOM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceCubicClampFeaturesQCOM const & physicalDeviceCubicClampFeaturesQCOM ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCubicClampFeaturesQCOM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCubicClampFeaturesQCOM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCubicClampFeaturesQCOM.cubicRangeClamp );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCubicWeightsFeaturesQCOM>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceCubicWeightsFeaturesQCOM const & physicalDeviceCubicWeightsFeaturesQCOM ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCubicWeightsFeaturesQCOM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCubicWeightsFeaturesQCOM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCubicWeightsFeaturesQCOM.selectableCubicWeights );\n      return seed;\n    }\n  };\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCudaKernelLaunchFeaturesNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceCudaKernelLaunchFeaturesNV const & physicalDeviceCudaKernelLaunchFeaturesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCudaKernelLaunchFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCudaKernelLaunchFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCudaKernelLaunchFeaturesNV.cudaKernelLaunchFeatures );\n      return seed;\n    }\n  };\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCudaKernelLaunchPropertiesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceCudaKernelLaunchPropertiesNV const & physicalDeviceCudaKernelLaunchPropertiesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCudaKernelLaunchPropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCudaKernelLaunchPropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCudaKernelLaunchPropertiesNV.computeCapabilityMinor );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCudaKernelLaunchPropertiesNV.computeCapabilityMajor );\n      return seed;\n    }\n  };\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCustomBorderColorFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceCustomBorderColorFeaturesEXT const & physicalDeviceCustomBorderColorFeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCustomBorderColorFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCustomBorderColorFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCustomBorderColorFeaturesEXT.customBorderColors );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCustomBorderColorFeaturesEXT.customBorderColorWithoutFormat );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCustomBorderColorPropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceCustomBorderColorPropertiesEXT const & physicalDeviceCustomBorderColorPropertiesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCustomBorderColorPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCustomBorderColorPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceCustomBorderColorPropertiesEXT.maxCustomBorderColorSamplers );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV const &\n                              physicalDeviceDedicatedAllocationImageAliasingFeaturesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDedicatedAllocationImageAliasingFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDedicatedAllocationImageAliasingFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDedicatedAllocationImageAliasingFeaturesNV.dedicatedAllocationImageAliasing );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthBiasControlFeaturesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthBiasControlFeaturesEXT const & physicalDeviceDepthBiasControlFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthBiasControlFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthBiasControlFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthBiasControlFeaturesEXT.depthBiasControl );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthBiasControlFeaturesEXT.leastRepresentableValueForceUnormRepresentation );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthBiasControlFeaturesEXT.floatRepresentation );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthBiasControlFeaturesEXT.depthBiasExact );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClampControlFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClampControlFeaturesEXT const & physicalDeviceDepthClampControlFeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthClampControlFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthClampControlFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthClampControlFeaturesEXT.depthClampControl );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClampZeroOneFeaturesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClampZeroOneFeaturesKHR const & physicalDeviceDepthClampZeroOneFeaturesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthClampZeroOneFeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthClampZeroOneFeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthClampZeroOneFeaturesKHR.depthClampZeroOne );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClipControlFeaturesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClipControlFeaturesEXT const & physicalDeviceDepthClipControlFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthClipControlFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthClipControlFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthClipControlFeaturesEXT.depthClipControl );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClipEnableFeaturesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClipEnableFeaturesEXT const & physicalDeviceDepthClipEnableFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthClipEnableFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthClipEnableFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthClipEnableFeaturesEXT.depthClipEnable );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthStencilResolveProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthStencilResolveProperties const & physicalDeviceDepthStencilResolveProperties ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthStencilResolveProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthStencilResolveProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthStencilResolveProperties.supportedDepthResolveModes );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthStencilResolveProperties.supportedStencilResolveModes );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthStencilResolveProperties.independentResolveNone );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDepthStencilResolveProperties.independentResolve );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT const &\n                              physicalDeviceDescriptorBufferDensityMapPropertiesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferDensityMapPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferDensityMapPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferDensityMapPropertiesEXT.combinedImageSamplerDensityMapDescriptorSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorBufferFeaturesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorBufferFeaturesEXT const & physicalDeviceDescriptorBufferFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferFeaturesEXT.descriptorBuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferFeaturesEXT.descriptorBufferCaptureReplay );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferFeaturesEXT.descriptorBufferImageLayoutIgnored );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferFeaturesEXT.descriptorBufferPushDescriptors );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorBufferPropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorBufferPropertiesEXT const & physicalDeviceDescriptorBufferPropertiesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.combinedImageSamplerDescriptorSingleArray );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.bufferlessPushDescriptors );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.allowSamplerImageViewPostSubmitCreation );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.descriptorBufferOffsetAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.maxDescriptorBufferBindings );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.maxResourceDescriptorBufferBindings );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.maxSamplerDescriptorBufferBindings );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.maxEmbeddedImmutableSamplerBindings );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.maxEmbeddedImmutableSamplers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.bufferCaptureReplayDescriptorDataSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.imageCaptureReplayDescriptorDataSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.imageViewCaptureReplayDescriptorDataSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.samplerCaptureReplayDescriptorDataSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.accelerationStructureCaptureReplayDescriptorDataSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.samplerDescriptorSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.combinedImageSamplerDescriptorSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.sampledImageDescriptorSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.storageImageDescriptorSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.uniformTexelBufferDescriptorSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.robustUniformTexelBufferDescriptorSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.storageTexelBufferDescriptorSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.robustStorageTexelBufferDescriptorSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.uniformBufferDescriptorSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.robustUniformBufferDescriptorSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.storageBufferDescriptorSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.robustStorageBufferDescriptorSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.inputAttachmentDescriptorSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.accelerationStructureDescriptorSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.maxSamplerDescriptorBufferRange );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.maxResourceDescriptorBufferRange );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.samplerDescriptorBufferAddressSpaceSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.resourceDescriptorBufferAddressSpaceSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorBufferPropertiesEXT.descriptorBufferAddressSpaceSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorIndexingFeatures>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorIndexingFeatures const & physicalDeviceDescriptorIndexingFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingFeatures.shaderInputAttachmentArrayDynamicIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingFeatures.shaderUniformTexelBufferArrayDynamicIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingFeatures.shaderStorageTexelBufferArrayDynamicIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingFeatures.shaderUniformBufferArrayNonUniformIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingFeatures.shaderSampledImageArrayNonUniformIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingFeatures.shaderStorageBufferArrayNonUniformIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingFeatures.shaderStorageImageArrayNonUniformIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingFeatures.shaderInputAttachmentArrayNonUniformIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingFeatures.shaderUniformTexelBufferArrayNonUniformIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingFeatures.shaderStorageTexelBufferArrayNonUniformIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingFeatures.descriptorBindingUniformBufferUpdateAfterBind );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingFeatures.descriptorBindingSampledImageUpdateAfterBind );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingFeatures.descriptorBindingStorageImageUpdateAfterBind );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingFeatures.descriptorBindingStorageBufferUpdateAfterBind );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingFeatures.descriptorBindingUniformTexelBufferUpdateAfterBind );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingFeatures.descriptorBindingStorageTexelBufferUpdateAfterBind );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingFeatures.descriptorBindingUpdateUnusedWhilePending );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingFeatures.descriptorBindingPartiallyBound );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingFeatures.descriptorBindingVariableDescriptorCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingFeatures.runtimeDescriptorArray );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorIndexingProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorIndexingProperties const & physicalDeviceDescriptorIndexingProperties ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.maxUpdateAfterBindDescriptorsInAllPools );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.shaderUniformBufferArrayNonUniformIndexingNative );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.shaderSampledImageArrayNonUniformIndexingNative );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.shaderStorageBufferArrayNonUniformIndexingNative );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.shaderStorageImageArrayNonUniformIndexingNative );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.shaderInputAttachmentArrayNonUniformIndexingNative );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.robustBufferAccessUpdateAfterBind );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.quadDivergentImplicitLod );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindSamplers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindUniformBuffers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindStorageBuffers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindSampledImages );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindStorageImages );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindInputAttachments );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.maxPerStageUpdateAfterBindResources );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.maxDescriptorSetUpdateAfterBindSamplers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.maxDescriptorSetUpdateAfterBindUniformBuffers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.maxDescriptorSetUpdateAfterBindStorageBuffers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.maxDescriptorSetUpdateAfterBindSampledImages );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.maxDescriptorSetUpdateAfterBindStorageImages );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorIndexingProperties.maxDescriptorSetUpdateAfterBindInputAttachments );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorPoolOverallocationFeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorPoolOverallocationFeaturesNV const &\n                              physicalDeviceDescriptorPoolOverallocationFeaturesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorPoolOverallocationFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorPoolOverallocationFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorPoolOverallocationFeaturesNV.descriptorPoolOverallocation );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE const & physicalDeviceDescriptorSetHostMappingFeaturesVALVE ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorSetHostMappingFeaturesVALVE.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorSetHostMappingFeaturesVALVE.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDescriptorSetHostMappingFeaturesVALVE.descriptorSetHostMapping );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV const &\n                              physicalDeviceDeviceGeneratedCommandsComputeFeaturesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsComputeFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsComputeFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsComputeFeaturesNV.deviceGeneratedCompute );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsComputeFeaturesNV.deviceGeneratedComputePipelines );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsComputeFeaturesNV.deviceGeneratedComputeCaptureReplay );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT const & physicalDeviceDeviceGeneratedCommandsFeaturesEXT )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsFeaturesEXT.deviceGeneratedCommands );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsFeaturesEXT.dynamicGeneratedPipelineLayout );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsFeaturesNV>\n  {\n    std::size_t operator()(\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsFeaturesNV const & physicalDeviceDeviceGeneratedCommandsFeaturesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsFeaturesNV.deviceGeneratedCommands );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT const & physicalDeviceDeviceGeneratedCommandsPropertiesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesEXT.maxIndirectPipelineCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesEXT.maxIndirectShaderObjectCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesEXT.maxIndirectSequenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesEXT.maxIndirectCommandsTokenCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesEXT.maxIndirectCommandsTokenOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesEXT.maxIndirectCommandsIndirectStride );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesEXT.supportedIndirectCommandsInputModes );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesEXT.supportedIndirectCommandsShaderStages );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesEXT.supportedIndirectCommandsShaderStagesPipelineBinding );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesEXT.supportedIndirectCommandsShaderStagesShaderBinding );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesEXT.deviceGeneratedCommandsTransformFeedback );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesEXT.deviceGeneratedCommandsMultiDrawIndirectCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsPropertiesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsPropertiesNV const & physicalDeviceDeviceGeneratedCommandsPropertiesNV )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesNV.maxGraphicsShaderGroupCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesNV.maxIndirectSequenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesNV.maxIndirectCommandsTokenCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesNV.maxIndirectCommandsStreamCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesNV.maxIndirectCommandsTokenOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesNV.maxIndirectCommandsStreamStride );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesNV.minSequencesCountBufferOffsetAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesNV.minSequencesIndexBufferOffsetAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceGeneratedCommandsPropertiesNV.minIndirectCommandsBufferOffsetAlignment );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceMemoryReportFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceMemoryReportFeaturesEXT const & physicalDeviceDeviceMemoryReportFeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceMemoryReportFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceMemoryReportFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDeviceMemoryReportFeaturesEXT.deviceMemoryReport );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDiagnosticsConfigFeaturesNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDiagnosticsConfigFeaturesNV const & physicalDeviceDiagnosticsConfigFeaturesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDiagnosticsConfigFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDiagnosticsConfigFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDiagnosticsConfigFeaturesNV.diagnosticsConfig );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDiscardRectanglePropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDiscardRectanglePropertiesEXT const & physicalDeviceDiscardRectanglePropertiesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDiscardRectanglePropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDiscardRectanglePropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDiscardRectanglePropertiesEXT.maxDiscardRectangles );\n      return seed;\n    }\n  };\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDisplacementMicromapFeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDisplacementMicromapFeaturesNV const & physicalDeviceDisplacementMicromapFeaturesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDisplacementMicromapFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDisplacementMicromapFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDisplacementMicromapFeaturesNV.displacementMicromap );\n      return seed;\n    }\n  };\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDisplacementMicromapPropertiesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDisplacementMicromapPropertiesNV const & physicalDeviceDisplacementMicromapPropertiesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDisplacementMicromapPropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDisplacementMicromapPropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDisplacementMicromapPropertiesNV.maxDisplacementMicromapSubdivisionLevel );\n      return seed;\n    }\n  };\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDriverProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDriverProperties const & physicalDeviceDriverProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDriverProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDriverProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDriverProperties.driverID );\n      for ( size_t i = 0; i < VK_MAX_DRIVER_NAME_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDriverProperties.driverName[i] );\n      }\n      for ( size_t i = 0; i < VK_MAX_DRIVER_INFO_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDriverProperties.driverInfo[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDriverProperties.conformanceVersion );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDrmPropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDrmPropertiesEXT const & physicalDeviceDrmPropertiesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDrmPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDrmPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDrmPropertiesEXT.hasPrimary );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDrmPropertiesEXT.hasRender );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDrmPropertiesEXT.primaryMajor );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDrmPropertiesEXT.primaryMinor );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDrmPropertiesEXT.renderMajor );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDrmPropertiesEXT.renderMinor );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDynamicRenderingFeatures>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDynamicRenderingFeatures const & physicalDeviceDynamicRenderingFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDynamicRenderingFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDynamicRenderingFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDynamicRenderingFeatures.dynamicRendering );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDynamicRenderingLocalReadFeatures>\n  {\n    std::size_t operator()(\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceDynamicRenderingLocalReadFeatures const & physicalDeviceDynamicRenderingLocalReadFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDynamicRenderingLocalReadFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDynamicRenderingLocalReadFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDynamicRenderingLocalReadFeatures.dynamicRenderingLocalRead );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT const &\n                              physicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT.dynamicRenderingUnusedAttachments );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExclusiveScissorFeaturesNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceExclusiveScissorFeaturesNV const & physicalDeviceExclusiveScissorFeaturesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExclusiveScissorFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExclusiveScissorFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExclusiveScissorFeaturesNV.exclusiveScissor );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicState2FeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicState2FeaturesEXT const & physicalDeviceExtendedDynamicState2FeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState2FeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState2FeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState2FeaturesEXT.extendedDynamicState2 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState2FeaturesEXT.extendedDynamicState2LogicOp );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState2FeaturesEXT.extendedDynamicState2PatchControlPoints );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicState3FeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicState3FeaturesEXT const & physicalDeviceExtendedDynamicState3FeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3TessellationDomainOrigin );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3DepthClampEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3PolygonMode );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3RasterizationSamples );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3SampleMask );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3AlphaToCoverageEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3AlphaToOneEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3LogicOpEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3ColorBlendEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3ColorBlendEquation );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3ColorWriteMask );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3RasterizationStream );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3ConservativeRasterizationMode );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3ExtraPrimitiveOverestimationSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3DepthClipEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3SampleLocationsEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3ColorBlendAdvanced );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3ProvokingVertexMode );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3LineRasterizationMode );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3LineStippleEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3DepthClipNegativeOneToOne );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3ViewportWScalingEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3ViewportSwizzle );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3CoverageToColorEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3CoverageToColorLocation );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3CoverageModulationMode );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3CoverageModulationTableEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3CoverageModulationTable );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3CoverageReductionMode );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3RepresentativeFragmentTestEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3FeaturesEXT.extendedDynamicState3ShadingRateImageEnable );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicState3PropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicState3PropertiesEXT const & physicalDeviceExtendedDynamicState3PropertiesEXT )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3PropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3PropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicState3PropertiesEXT.dynamicPrimitiveTopologyUnrestricted );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicStateFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicStateFeaturesEXT const & physicalDeviceExtendedDynamicStateFeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicStateFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicStateFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedDynamicStateFeaturesEXT.extendedDynamicState );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV const & physicalDeviceExtendedSparseAddressSpaceFeaturesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedSparseAddressSpaceFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedSparseAddressSpaceFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedSparseAddressSpaceFeaturesNV.extendedSparseAddressSpace );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedSparseAddressSpacePropertiesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedSparseAddressSpacePropertiesNV const &\n                              physicalDeviceExtendedSparseAddressSpacePropertiesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedSparseAddressSpacePropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedSparseAddressSpacePropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedSparseAddressSpacePropertiesNV.extendedSparseAddressSpaceSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedSparseAddressSpacePropertiesNV.extendedSparseImageUsageFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExtendedSparseAddressSpacePropertiesNV.extendedSparseBufferUsageFlags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo const & physicalDeviceExternalBufferInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalBufferInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalBufferInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalBufferInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalBufferInfo.usage );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalBufferInfo.handleType );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo const & physicalDeviceExternalFenceInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalFenceInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalFenceInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalFenceInfo.handleType );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFormatResolveFeaturesANDROID>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFormatResolveFeaturesANDROID const & physicalDeviceExternalFormatResolveFeaturesANDROID ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalFormatResolveFeaturesANDROID.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalFormatResolveFeaturesANDROID.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalFormatResolveFeaturesANDROID.externalFormatResolve );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#  if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFormatResolvePropertiesANDROID>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFormatResolvePropertiesANDROID const &\n                              physicalDeviceExternalFormatResolvePropertiesANDROID ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalFormatResolvePropertiesANDROID.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalFormatResolvePropertiesANDROID.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalFormatResolvePropertiesANDROID.nullColorAttachmentWithExternalFormatResolve );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalFormatResolvePropertiesANDROID.externalFormatResolveChromaOffsetX );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalFormatResolvePropertiesANDROID.externalFormatResolveChromaOffsetY );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalImageFormatInfo>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalImageFormatInfo const & physicalDeviceExternalImageFormatInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalImageFormatInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalImageFormatInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalImageFormatInfo.handleType );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalMemoryHostPropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalMemoryHostPropertiesEXT const & physicalDeviceExternalMemoryHostPropertiesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalMemoryHostPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalMemoryHostPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalMemoryHostPropertiesEXT.minImportedHostPointerAlignment );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalMemoryRDMAFeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalMemoryRDMAFeaturesNV const & physicalDeviceExternalMemoryRDMAFeaturesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalMemoryRDMAFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalMemoryRDMAFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalMemoryRDMAFeaturesNV.externalMemoryRDMA );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_SCREEN_QNX )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX const & physicalDeviceExternalMemoryScreenBufferFeaturesQNX ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalMemoryScreenBufferFeaturesQNX.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalMemoryScreenBufferFeaturesQNX.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalMemoryScreenBufferFeaturesQNX.screenBufferImport );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo const & physicalDeviceExternalSemaphoreInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalSemaphoreInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalSemaphoreInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceExternalSemaphoreInfo.handleType );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFaultFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceFaultFeaturesEXT const & physicalDeviceFaultFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFaultFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFaultFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFaultFeaturesEXT.deviceFault );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFaultFeaturesEXT.deviceFaultVendorBinary );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 const & physicalDeviceFeatures2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFeatures2.features );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFloatControlsProperties>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceFloatControlsProperties const & physicalDeviceFloatControlsProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFloatControlsProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFloatControlsProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFloatControlsProperties.denormBehaviorIndependence );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFloatControlsProperties.roundingModeIndependence );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFloatControlsProperties.shaderSignedZeroInfNanPreserveFloat16 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFloatControlsProperties.shaderSignedZeroInfNanPreserveFloat32 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFloatControlsProperties.shaderSignedZeroInfNanPreserveFloat64 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFloatControlsProperties.shaderDenormPreserveFloat16 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFloatControlsProperties.shaderDenormPreserveFloat32 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFloatControlsProperties.shaderDenormPreserveFloat64 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFloatControlsProperties.shaderDenormFlushToZeroFloat16 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFloatControlsProperties.shaderDenormFlushToZeroFloat32 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFloatControlsProperties.shaderDenormFlushToZeroFloat64 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFloatControlsProperties.shaderRoundingModeRTEFloat16 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFloatControlsProperties.shaderRoundingModeRTEFloat32 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFloatControlsProperties.shaderRoundingModeRTEFloat64 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFloatControlsProperties.shaderRoundingModeRTZFloat16 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFloatControlsProperties.shaderRoundingModeRTZFloat32 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFloatControlsProperties.shaderRoundingModeRTZFloat64 );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMap2FeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMap2FeaturesEXT const & physicalDeviceFragmentDensityMap2FeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMap2FeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMap2FeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMap2FeaturesEXT.fragmentDensityMapDeferred );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMap2PropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMap2PropertiesEXT const & physicalDeviceFragmentDensityMap2PropertiesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMap2PropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMap2PropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMap2PropertiesEXT.subsampledLoads );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMap2PropertiesEXT.subsampledCoarseReconstructionEarlyAccess );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMap2PropertiesEXT.maxSubsampledArrayLayers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMap2PropertiesEXT.maxDescriptorSetSubsampledSamplers );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapFeaturesEXT const & physicalDeviceFragmentDensityMapFeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMapFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMapFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMapFeaturesEXT.fragmentDensityMap );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMapFeaturesEXT.fragmentDensityMapDynamic );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMapFeaturesEXT.fragmentDensityMapNonSubsampledImages );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM const & physicalDeviceFragmentDensityMapOffsetFeaturesQCOM ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMapOffsetFeaturesQCOM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMapOffsetFeaturesQCOM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMapOffsetFeaturesQCOM.fragmentDensityMapOffset );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM const &\n                              physicalDeviceFragmentDensityMapOffsetPropertiesQCOM ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMapOffsetPropertiesQCOM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMapOffsetPropertiesQCOM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMapOffsetPropertiesQCOM.fragmentDensityOffsetGranularity );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapPropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapPropertiesEXT const & physicalDeviceFragmentDensityMapPropertiesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMapPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMapPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMapPropertiesEXT.minFragmentDensityTexelSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMapPropertiesEXT.maxFragmentDensityTexelSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentDensityMapPropertiesEXT.fragmentDensityInvocations );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShaderBarycentricFeaturesKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShaderBarycentricFeaturesKHR const & physicalDeviceFragmentShaderBarycentricFeaturesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShaderBarycentricFeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShaderBarycentricFeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShaderBarycentricFeaturesKHR.fragmentShaderBarycentric );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShaderBarycentricPropertiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShaderBarycentricPropertiesKHR const &\n                              physicalDeviceFragmentShaderBarycentricPropertiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShaderBarycentricPropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShaderBarycentricPropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShaderBarycentricPropertiesKHR.triStripVertexOrderIndependentOfProvokingVertex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShaderInterlockFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShaderInterlockFeaturesEXT const & physicalDeviceFragmentShaderInterlockFeaturesEXT )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShaderInterlockFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShaderInterlockFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShaderInterlockFeaturesEXT.fragmentShaderSampleInterlock );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShaderInterlockFeaturesEXT.fragmentShaderPixelInterlock );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShaderInterlockFeaturesEXT.fragmentShaderShadingRateInterlock );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateEnumsFeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateEnumsFeaturesNV const & physicalDeviceFragmentShadingRateEnumsFeaturesNV )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRateEnumsFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRateEnumsFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRateEnumsFeaturesNV.fragmentShadingRateEnums );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRateEnumsFeaturesNV.supersampleFragmentShadingRates );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRateEnumsFeaturesNV.noInvocationFragmentShadingRates );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateEnumsPropertiesNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateEnumsPropertiesNV const & physicalDeviceFragmentShadingRateEnumsPropertiesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRateEnumsPropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRateEnumsPropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRateEnumsPropertiesNV.maxFragmentShadingRateInvocationCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateFeaturesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateFeaturesKHR const & physicalDeviceFragmentShadingRateFeaturesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRateFeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRateFeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRateFeaturesKHR.pipelineFragmentShadingRate );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRateFeaturesKHR.primitiveFragmentShadingRate );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRateFeaturesKHR.attachmentFragmentShadingRate );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR const & physicalDeviceFragmentShadingRateKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRateKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRateKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRateKHR.sampleCounts );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRateKHR.fragmentSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRatePropertiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRatePropertiesKHR const & physicalDeviceFragmentShadingRatePropertiesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRatePropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRatePropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRatePropertiesKHR.minFragmentShadingRateAttachmentTexelSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRatePropertiesKHR.maxFragmentShadingRateAttachmentTexelSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRatePropertiesKHR.maxFragmentShadingRateAttachmentTexelSizeAspectRatio );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRatePropertiesKHR.primitiveFragmentShadingRateWithMultipleViewports );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRatePropertiesKHR.layeredShadingRateAttachments );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRatePropertiesKHR.fragmentShadingRateNonTrivialCombinerOps );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRatePropertiesKHR.maxFragmentSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRatePropertiesKHR.maxFragmentSizeAspectRatio );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRatePropertiesKHR.maxFragmentShadingRateCoverageSamples );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRatePropertiesKHR.maxFragmentShadingRateRasterizationSamples );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRatePropertiesKHR.fragmentShadingRateWithShaderDepthStencilWrites );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRatePropertiesKHR.fragmentShadingRateWithSampleMask );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRatePropertiesKHR.fragmentShadingRateWithShaderSampleMask );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRatePropertiesKHR.fragmentShadingRateWithConservativeRasterization );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRatePropertiesKHR.fragmentShadingRateWithFragmentShaderInterlock );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRatePropertiesKHR.fragmentShadingRateWithCustomSampleLocations );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFragmentShadingRatePropertiesKHR.fragmentShadingRateStrictMultiplyCombiner );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFrameBoundaryFeaturesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceFrameBoundaryFeaturesEXT const & physicalDeviceFrameBoundaryFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFrameBoundaryFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFrameBoundaryFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceFrameBoundaryFeaturesEXT.frameBoundary );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceGlobalPriorityQueryFeatures>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceGlobalPriorityQueryFeatures const & physicalDeviceGlobalPriorityQueryFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceGlobalPriorityQueryFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceGlobalPriorityQueryFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceGlobalPriorityQueryFeatures.globalPriorityQuery );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT const & physicalDeviceGraphicsPipelineLibraryFeaturesEXT )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceGraphicsPipelineLibraryFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceGraphicsPipelineLibraryFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceGraphicsPipelineLibraryFeaturesEXT.graphicsPipelineLibrary );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT const & physicalDeviceGraphicsPipelineLibraryPropertiesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceGraphicsPipelineLibraryPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceGraphicsPipelineLibraryPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceGraphicsPipelineLibraryPropertiesEXT.graphicsPipelineLibraryFastLinking );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceGraphicsPipelineLibraryPropertiesEXT.graphicsPipelineLibraryIndependentInterpolationDecoration );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties const & physicalDeviceGroupProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceGroupProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceGroupProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceGroupProperties.physicalDeviceCount );\n      for ( size_t i = 0; i < VK_MAX_DEVICE_GROUP_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceGroupProperties.physicalDevices[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceGroupProperties.subsetAllocation );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceHdrVividFeaturesHUAWEI>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceHdrVividFeaturesHUAWEI const & physicalDeviceHdrVividFeaturesHUAWEI ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceHdrVividFeaturesHUAWEI.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceHdrVividFeaturesHUAWEI.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceHdrVividFeaturesHUAWEI.hdrVivid );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceHostImageCopyFeatures>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceHostImageCopyFeatures const & physicalDeviceHostImageCopyFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceHostImageCopyFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceHostImageCopyFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceHostImageCopyFeatures.hostImageCopy );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceHostImageCopyProperties>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceHostImageCopyProperties const & physicalDeviceHostImageCopyProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceHostImageCopyProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceHostImageCopyProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceHostImageCopyProperties.copySrcLayoutCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceHostImageCopyProperties.pCopySrcLayouts );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceHostImageCopyProperties.copyDstLayoutCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceHostImageCopyProperties.pCopyDstLayouts );\n      for ( size_t i = 0; i < VK_UUID_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceHostImageCopyProperties.optimalTilingLayoutUUID[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceHostImageCopyProperties.identicalMemoryTypeRequirements );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceHostQueryResetFeatures>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceHostQueryResetFeatures const & physicalDeviceHostQueryResetFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceHostQueryResetFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceHostQueryResetFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceHostQueryResetFeatures.hostQueryReset );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceIDProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceIDProperties const & physicalDeviceIDProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceIDProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceIDProperties.pNext );\n      for ( size_t i = 0; i < VK_UUID_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceIDProperties.deviceUUID[i] );\n      }\n      for ( size_t i = 0; i < VK_UUID_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceIDProperties.driverUUID[i] );\n      }\n      for ( size_t i = 0; i < VK_LUID_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceIDProperties.deviceLUID[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceIDProperties.deviceNodeMask );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceIDProperties.deviceLUIDValid );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceImage2DViewOf3DFeaturesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceImage2DViewOf3DFeaturesEXT const & physicalDeviceImage2DViewOf3DFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImage2DViewOf3DFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImage2DViewOf3DFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImage2DViewOf3DFeaturesEXT.image2DViewOf3D );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImage2DViewOf3DFeaturesEXT.sampler2DViewOf3D );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageAlignmentControlFeaturesMESA>\n  {\n    std::size_t operator()(\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceImageAlignmentControlFeaturesMESA const & physicalDeviceImageAlignmentControlFeaturesMESA ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageAlignmentControlFeaturesMESA.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageAlignmentControlFeaturesMESA.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageAlignmentControlFeaturesMESA.imageAlignmentControl );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageAlignmentControlPropertiesMESA>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageAlignmentControlPropertiesMESA const & physicalDeviceImageAlignmentControlPropertiesMESA )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageAlignmentControlPropertiesMESA.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageAlignmentControlPropertiesMESA.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageAlignmentControlPropertiesMESA.supportedImageAlignmentMask );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageCompressionControlFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageCompressionControlFeaturesEXT const & physicalDeviceImageCompressionControlFeaturesEXT )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageCompressionControlFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageCompressionControlFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageCompressionControlFeaturesEXT.imageCompressionControl );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT const &\n                              physicalDeviceImageCompressionControlSwapchainFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageCompressionControlSwapchainFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageCompressionControlSwapchainFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageCompressionControlSwapchainFeaturesEXT.imageCompressionControlSwapchain );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageDrmFormatModifierInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageDrmFormatModifierInfoEXT const & physicalDeviceImageDrmFormatModifierInfoEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageDrmFormatModifierInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageDrmFormatModifierInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageDrmFormatModifierInfoEXT.drmFormatModifier );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageDrmFormatModifierInfoEXT.sharingMode );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageDrmFormatModifierInfoEXT.queueFamilyIndexCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageDrmFormatModifierInfoEXT.pQueueFamilyIndices );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 const & physicalDeviceImageFormatInfo2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageFormatInfo2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageFormatInfo2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageFormatInfo2.format );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageFormatInfo2.type );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageFormatInfo2.tiling );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageFormatInfo2.usage );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageFormatInfo2.flags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessing2FeaturesQCOM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessing2FeaturesQCOM const & physicalDeviceImageProcessing2FeaturesQCOM ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageProcessing2FeaturesQCOM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageProcessing2FeaturesQCOM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageProcessing2FeaturesQCOM.textureBlockMatch2 );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessing2PropertiesQCOM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessing2PropertiesQCOM const & physicalDeviceImageProcessing2PropertiesQCOM ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageProcessing2PropertiesQCOM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageProcessing2PropertiesQCOM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageProcessing2PropertiesQCOM.maxBlockMatchWindow );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessingFeaturesQCOM>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessingFeaturesQCOM const & physicalDeviceImageProcessingFeaturesQCOM ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageProcessingFeaturesQCOM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageProcessingFeaturesQCOM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageProcessingFeaturesQCOM.textureSampleWeighted );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageProcessingFeaturesQCOM.textureBoxFilter );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageProcessingFeaturesQCOM.textureBlockMatch );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessingPropertiesQCOM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessingPropertiesQCOM const & physicalDeviceImageProcessingPropertiesQCOM ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageProcessingPropertiesQCOM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageProcessingPropertiesQCOM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageProcessingPropertiesQCOM.maxWeightFilterPhases );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageProcessingPropertiesQCOM.maxWeightFilterDimension );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageProcessingPropertiesQCOM.maxBlockMatchRegion );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageProcessingPropertiesQCOM.maxBoxFilterBlockSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageRobustnessFeatures>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageRobustnessFeatures const & physicalDeviceImageRobustnessFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageRobustnessFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageRobustnessFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageRobustnessFeatures.robustImageAccess );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageSlicedViewOf3DFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageSlicedViewOf3DFeaturesEXT const & physicalDeviceImageSlicedViewOf3DFeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageSlicedViewOf3DFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageSlicedViewOf3DFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageSlicedViewOf3DFeaturesEXT.imageSlicedViewOf3D );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageViewImageFormatInfoEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageViewImageFormatInfoEXT const & physicalDeviceImageViewImageFormatInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageViewImageFormatInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageViewImageFormatInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageViewImageFormatInfoEXT.imageViewType );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageViewMinLodFeaturesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageViewMinLodFeaturesEXT const & physicalDeviceImageViewMinLodFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageViewMinLodFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageViewMinLodFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImageViewMinLodFeaturesEXT.minLod );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceImagelessFramebufferFeatures>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceImagelessFramebufferFeatures const & physicalDeviceImagelessFramebufferFeatures ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImagelessFramebufferFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImagelessFramebufferFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceImagelessFramebufferFeatures.imagelessFramebuffer );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceIndexTypeUint8Features>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceIndexTypeUint8Features const & physicalDeviceIndexTypeUint8Features ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceIndexTypeUint8Features.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceIndexTypeUint8Features.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceIndexTypeUint8Features.indexTypeUint8 );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceInheritedViewportScissorFeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceInheritedViewportScissorFeaturesNV const & physicalDeviceInheritedViewportScissorFeaturesNV )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceInheritedViewportScissorFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceInheritedViewportScissorFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceInheritedViewportScissorFeaturesNV.inheritedViewportScissor2D );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceInlineUniformBlockFeatures>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceInlineUniformBlockFeatures const & physicalDeviceInlineUniformBlockFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceInlineUniformBlockFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceInlineUniformBlockFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceInlineUniformBlockFeatures.inlineUniformBlock );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceInlineUniformBlockFeatures.descriptorBindingInlineUniformBlockUpdateAfterBind );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceInlineUniformBlockProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceInlineUniformBlockProperties const & physicalDeviceInlineUniformBlockProperties ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceInlineUniformBlockProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceInlineUniformBlockProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceInlineUniformBlockProperties.maxInlineUniformBlockSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceInlineUniformBlockProperties.maxPerStageDescriptorInlineUniformBlocks );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceInlineUniformBlockProperties.maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceInlineUniformBlockProperties.maxDescriptorSetInlineUniformBlocks );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceInlineUniformBlockProperties.maxDescriptorSetUpdateAfterBindInlineUniformBlocks );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceInvocationMaskFeaturesHUAWEI>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceInvocationMaskFeaturesHUAWEI const & physicalDeviceInvocationMaskFeaturesHUAWEI ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceInvocationMaskFeaturesHUAWEI.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceInvocationMaskFeaturesHUAWEI.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceInvocationMaskFeaturesHUAWEI.invocationMask );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiPropertiesKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiPropertiesKHR const & physicalDeviceLayeredApiPropertiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLayeredApiPropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLayeredApiPropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLayeredApiPropertiesKHR.vendorID );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLayeredApiPropertiesKHR.deviceID );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLayeredApiPropertiesKHR.layeredAPI );\n      for ( size_t i = 0; i < VK_MAX_PHYSICAL_DEVICE_NAME_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLayeredApiPropertiesKHR.deviceName[i] );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiPropertiesListKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiPropertiesListKHR const & physicalDeviceLayeredApiPropertiesListKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLayeredApiPropertiesListKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLayeredApiPropertiesListKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLayeredApiPropertiesListKHR.layeredApiCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLayeredApiPropertiesListKHR.pLayeredApis );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceLimits>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceLimits const & physicalDeviceLimits ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxImageDimension1D );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxImageDimension2D );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxImageDimension3D );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxImageDimensionCube );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxImageArrayLayers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxTexelBufferElements );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxUniformBufferRange );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxStorageBufferRange );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxPushConstantsSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxMemoryAllocationCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxSamplerAllocationCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.bufferImageGranularity );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.sparseAddressSpaceSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxBoundDescriptorSets );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxPerStageDescriptorSamplers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxPerStageDescriptorUniformBuffers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxPerStageDescriptorStorageBuffers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxPerStageDescriptorSampledImages );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxPerStageDescriptorStorageImages );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxPerStageDescriptorInputAttachments );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxPerStageResources );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxDescriptorSetSamplers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxDescriptorSetUniformBuffers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxDescriptorSetUniformBuffersDynamic );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxDescriptorSetStorageBuffers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxDescriptorSetStorageBuffersDynamic );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxDescriptorSetSampledImages );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxDescriptorSetStorageImages );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxDescriptorSetInputAttachments );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxVertexInputAttributes );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxVertexInputBindings );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxVertexInputAttributeOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxVertexInputBindingStride );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxVertexOutputComponents );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxTessellationGenerationLevel );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxTessellationPatchSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxTessellationControlPerVertexInputComponents );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxTessellationControlPerVertexOutputComponents );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxTessellationControlPerPatchOutputComponents );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxTessellationControlTotalOutputComponents );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxTessellationEvaluationInputComponents );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxTessellationEvaluationOutputComponents );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxGeometryShaderInvocations );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxGeometryInputComponents );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxGeometryOutputComponents );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxGeometryOutputVertices );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxGeometryTotalOutputComponents );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxFragmentInputComponents );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxFragmentOutputAttachments );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxFragmentDualSrcAttachments );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxFragmentCombinedOutputResources );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxComputeSharedMemorySize );\n      for ( size_t i = 0; i < 3; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxComputeWorkGroupCount[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxComputeWorkGroupInvocations );\n      for ( size_t i = 0; i < 3; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxComputeWorkGroupSize[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.subPixelPrecisionBits );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.subTexelPrecisionBits );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.mipmapPrecisionBits );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxDrawIndexedIndexValue );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxDrawIndirectCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxSamplerLodBias );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxSamplerAnisotropy );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxViewports );\n      for ( size_t i = 0; i < 2; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxViewportDimensions[i] );\n      }\n      for ( size_t i = 0; i < 2; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.viewportBoundsRange[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.viewportSubPixelBits );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.minMemoryMapAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.minTexelBufferOffsetAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.minUniformBufferOffsetAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.minStorageBufferOffsetAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.minTexelOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxTexelOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.minTexelGatherOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxTexelGatherOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.minInterpolationOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxInterpolationOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.subPixelInterpolationOffsetBits );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxFramebufferWidth );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxFramebufferHeight );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxFramebufferLayers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.framebufferColorSampleCounts );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.framebufferDepthSampleCounts );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.framebufferStencilSampleCounts );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.framebufferNoAttachmentsSampleCounts );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxColorAttachments );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.sampledImageColorSampleCounts );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.sampledImageIntegerSampleCounts );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.sampledImageDepthSampleCounts );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.sampledImageStencilSampleCounts );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.storageImageSampleCounts );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxSampleMaskWords );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.timestampComputeAndGraphics );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.timestampPeriod );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxClipDistances );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxCullDistances );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.maxCombinedClipAndCullDistances );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.discreteQueuePriorities );\n      for ( size_t i = 0; i < 2; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.pointSizeRange[i] );\n      }\n      for ( size_t i = 0; i < 2; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.lineWidthRange[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.pointSizeGranularity );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.lineWidthGranularity );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.strictLines );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.standardSampleLocations );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.optimalBufferCopyOffsetAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.optimalBufferCopyRowPitchAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLimits.nonCoherentAtomSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseProperties const & physicalDeviceSparseProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSparseProperties.residencyStandard2DBlockShape );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSparseProperties.residencyStandard2DMultisampleBlockShape );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSparseProperties.residencyStandard3DBlockShape );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSparseProperties.residencyAlignedMipSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSparseProperties.residencyNonResidentStrict );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties const & physicalDeviceProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProperties.apiVersion );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProperties.driverVersion );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProperties.vendorID );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProperties.deviceID );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProperties.deviceType );\n      for ( size_t i = 0; i < VK_MAX_PHYSICAL_DEVICE_NAME_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProperties.deviceName[i] );\n      }\n      for ( size_t i = 0; i < VK_UUID_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProperties.pipelineCacheUUID[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProperties.limits );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProperties.sparseProperties );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 const & physicalDeviceProperties2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProperties2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProperties2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProperties2.properties );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiVulkanPropertiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiVulkanPropertiesKHR const & physicalDeviceLayeredApiVulkanPropertiesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLayeredApiVulkanPropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLayeredApiVulkanPropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLayeredApiVulkanPropertiesKHR.properties );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredDriverPropertiesMSFT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredDriverPropertiesMSFT const & physicalDeviceLayeredDriverPropertiesMSFT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLayeredDriverPropertiesMSFT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLayeredDriverPropertiesMSFT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLayeredDriverPropertiesMSFT.underlyingAPI );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceLegacyDitheringFeaturesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceLegacyDitheringFeaturesEXT const & physicalDeviceLegacyDitheringFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLegacyDitheringFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLegacyDitheringFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLegacyDitheringFeaturesEXT.legacyDithering );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceLegacyVertexAttributesFeaturesEXT>\n  {\n    std::size_t operator()(\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceLegacyVertexAttributesFeaturesEXT const & physicalDeviceLegacyVertexAttributesFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLegacyVertexAttributesFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLegacyVertexAttributesFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLegacyVertexAttributesFeaturesEXT.legacyVertexAttributes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceLegacyVertexAttributesPropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceLegacyVertexAttributesPropertiesEXT const & physicalDeviceLegacyVertexAttributesPropertiesEXT )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLegacyVertexAttributesPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLegacyVertexAttributesPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLegacyVertexAttributesPropertiesEXT.nativeUnalignedPerformance );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceLineRasterizationFeatures>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceLineRasterizationFeatures const & physicalDeviceLineRasterizationFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLineRasterizationFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLineRasterizationFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLineRasterizationFeatures.rectangularLines );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLineRasterizationFeatures.bresenhamLines );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLineRasterizationFeatures.smoothLines );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLineRasterizationFeatures.stippledRectangularLines );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLineRasterizationFeatures.stippledBresenhamLines );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLineRasterizationFeatures.stippledSmoothLines );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceLineRasterizationProperties>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceLineRasterizationProperties const & physicalDeviceLineRasterizationProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLineRasterizationProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLineRasterizationProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLineRasterizationProperties.lineSubPixelPrecisionBits );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceLinearColorAttachmentFeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceLinearColorAttachmentFeaturesNV const & physicalDeviceLinearColorAttachmentFeaturesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLinearColorAttachmentFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLinearColorAttachmentFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceLinearColorAttachmentFeaturesNV.linearColorAttachment );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance3Properties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance3Properties const & physicalDeviceMaintenance3Properties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance3Properties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance3Properties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance3Properties.maxPerSetDescriptors );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance3Properties.maxMemoryAllocationSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance4Features>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance4Features const & physicalDeviceMaintenance4Features ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance4Features.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance4Features.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance4Features.maintenance4 );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance4Properties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance4Properties const & physicalDeviceMaintenance4Properties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance4Properties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance4Properties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance4Properties.maxBufferSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance5Features>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance5Features const & physicalDeviceMaintenance5Features ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance5Features.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance5Features.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance5Features.maintenance5 );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance5Properties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance5Properties const & physicalDeviceMaintenance5Properties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance5Properties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance5Properties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance5Properties.earlyFragmentMultisampleCoverageAfterSampleCounting );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance5Properties.earlyFragmentSampleMaskTestBeforeSampleCounting );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance5Properties.depthStencilSwizzleOneSupport );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance5Properties.polygonModePointSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance5Properties.nonStrictSinglePixelWideLinesUseParallelogram );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance5Properties.nonStrictWideLinesUseParallelogram );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance6Features>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance6Features const & physicalDeviceMaintenance6Features ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance6Features.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance6Features.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance6Features.maintenance6 );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance6Properties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance6Properties const & physicalDeviceMaintenance6Properties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance6Properties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance6Properties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance6Properties.blockTexelViewCompatibleMultipleLayers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance6Properties.maxCombinedImageSamplerDescriptorCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance6Properties.fragmentShadingRateClampCombinerInputs );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance7FeaturesKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance7FeaturesKHR const & physicalDeviceMaintenance7FeaturesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance7FeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance7FeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance7FeaturesKHR.maintenance7 );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance7PropertiesKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance7PropertiesKHR const & physicalDeviceMaintenance7PropertiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance7PropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance7PropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance7PropertiesKHR.robustFragmentShadingRateAttachmentAccess );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance7PropertiesKHR.separateDepthStencilAttachmentAccess );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance7PropertiesKHR.maxDescriptorSetTotalUniformBuffersDynamic );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance7PropertiesKHR.maxDescriptorSetTotalStorageBuffersDynamic );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance7PropertiesKHR.maxDescriptorSetTotalBuffersDynamic );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance7PropertiesKHR.maxDescriptorSetUpdateAfterBindTotalUniformBuffersDynamic );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance7PropertiesKHR.maxDescriptorSetUpdateAfterBindTotalStorageBuffersDynamic );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance7PropertiesKHR.maxDescriptorSetUpdateAfterBindTotalBuffersDynamic );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance8FeaturesKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance8FeaturesKHR const & physicalDeviceMaintenance8FeaturesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance8FeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance8FeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMaintenance8FeaturesKHR.maintenance8 );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMapMemoryPlacedFeaturesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMapMemoryPlacedFeaturesEXT const & physicalDeviceMapMemoryPlacedFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMapMemoryPlacedFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMapMemoryPlacedFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMapMemoryPlacedFeaturesEXT.memoryMapPlaced );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMapMemoryPlacedFeaturesEXT.memoryMapRangePlaced );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMapMemoryPlacedFeaturesEXT.memoryUnmapReserve );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMapMemoryPlacedPropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMapMemoryPlacedPropertiesEXT const & physicalDeviceMapMemoryPlacedPropertiesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMapMemoryPlacedPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMapMemoryPlacedPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMapMemoryPlacedPropertiesEXT.minPlacedMemoryMapAlignment );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryBudgetPropertiesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryBudgetPropertiesEXT const & physicalDeviceMemoryBudgetPropertiesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMemoryBudgetPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMemoryBudgetPropertiesEXT.pNext );\n      for ( size_t i = 0; i < VK_MAX_MEMORY_HEAPS; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMemoryBudgetPropertiesEXT.heapBudget[i] );\n      }\n      for ( size_t i = 0; i < VK_MAX_MEMORY_HEAPS; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMemoryBudgetPropertiesEXT.heapUsage[i] );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryDecompressionFeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryDecompressionFeaturesNV const & physicalDeviceMemoryDecompressionFeaturesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMemoryDecompressionFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMemoryDecompressionFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMemoryDecompressionFeaturesNV.memoryDecompression );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryDecompressionPropertiesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryDecompressionPropertiesNV const & physicalDeviceMemoryDecompressionPropertiesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMemoryDecompressionPropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMemoryDecompressionPropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMemoryDecompressionPropertiesNV.decompressionMethods );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMemoryDecompressionPropertiesNV.maxDecompressionIndirectCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryPriorityFeaturesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryPriorityFeaturesEXT const & physicalDeviceMemoryPriorityFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMemoryPriorityFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMemoryPriorityFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMemoryPriorityFeaturesEXT.memoryPriority );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties const & physicalDeviceMemoryProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMemoryProperties.memoryTypeCount );\n      for ( size_t i = 0; i < VK_MAX_MEMORY_TYPES; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMemoryProperties.memoryTypes[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMemoryProperties.memoryHeapCount );\n      for ( size_t i = 0; i < VK_MAX_MEMORY_HEAPS; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMemoryProperties.memoryHeaps[i] );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 const & physicalDeviceMemoryProperties2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMemoryProperties2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMemoryProperties2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMemoryProperties2.memoryProperties );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderFeaturesEXT const & physicalDeviceMeshShaderFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderFeaturesEXT.taskShader );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderFeaturesEXT.meshShader );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderFeaturesEXT.multiviewMeshShader );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderFeaturesEXT.primitiveFragmentShadingRateMeshShader );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderFeaturesEXT.meshShaderQueries );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderFeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderFeaturesNV const & physicalDeviceMeshShaderFeaturesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderFeaturesNV.taskShader );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderFeaturesNV.meshShader );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderPropertiesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderPropertiesEXT const & physicalDeviceMeshShaderPropertiesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.maxTaskWorkGroupTotalCount );\n      for ( size_t i = 0; i < 3; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.maxTaskWorkGroupCount[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.maxTaskWorkGroupInvocations );\n      for ( size_t i = 0; i < 3; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.maxTaskWorkGroupSize[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.maxTaskPayloadSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.maxTaskSharedMemorySize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.maxTaskPayloadAndSharedMemorySize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.maxMeshWorkGroupTotalCount );\n      for ( size_t i = 0; i < 3; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.maxMeshWorkGroupCount[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.maxMeshWorkGroupInvocations );\n      for ( size_t i = 0; i < 3; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.maxMeshWorkGroupSize[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.maxMeshSharedMemorySize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.maxMeshPayloadAndSharedMemorySize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.maxMeshOutputMemorySize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.maxMeshPayloadAndOutputMemorySize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.maxMeshOutputComponents );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.maxMeshOutputVertices );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.maxMeshOutputPrimitives );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.maxMeshOutputLayers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.maxMeshMultiviewViewCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.meshOutputPerVertexGranularity );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.meshOutputPerPrimitiveGranularity );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.maxPreferredTaskWorkGroupInvocations );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.maxPreferredMeshWorkGroupInvocations );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.prefersLocalInvocationVertexOutput );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.prefersLocalInvocationPrimitiveOutput );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.prefersCompactVertexOutput );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesEXT.prefersCompactPrimitiveOutput );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderPropertiesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderPropertiesNV const & physicalDeviceMeshShaderPropertiesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesNV.maxDrawMeshTasksCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesNV.maxTaskWorkGroupInvocations );\n      for ( size_t i = 0; i < 3; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesNV.maxTaskWorkGroupSize[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesNV.maxTaskTotalMemorySize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesNV.maxTaskOutputCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesNV.maxMeshWorkGroupInvocations );\n      for ( size_t i = 0; i < 3; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesNV.maxMeshWorkGroupSize[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesNV.maxMeshTotalMemorySize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesNV.maxMeshOutputVertices );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesNV.maxMeshOutputPrimitives );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesNV.maxMeshMultiviewViewCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesNV.meshOutputPerVertexGranularity );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMeshShaderPropertiesNV.meshOutputPerPrimitiveGranularity );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiDrawFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiDrawFeaturesEXT const & physicalDeviceMultiDrawFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiDrawFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiDrawFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiDrawFeaturesEXT.multiDraw );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiDrawPropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiDrawPropertiesEXT const & physicalDeviceMultiDrawPropertiesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiDrawPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiDrawPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiDrawPropertiesEXT.maxMultiDrawCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT const &\n                              physicalDeviceMultisampledRenderToSingleSampledFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultisampledRenderToSingleSampledFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultisampledRenderToSingleSampledFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultisampledRenderToSingleSampledFeaturesEXT.multisampledRenderToSingleSampled );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewFeatures>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewFeatures const & physicalDeviceMultiviewFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiviewFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiviewFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiviewFeatures.multiview );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiviewFeatures.multiviewGeometryShader );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiviewFeatures.multiviewTessellationShader );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX const &\n                              physicalDeviceMultiviewPerViewAttributesPropertiesNVX ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiviewPerViewAttributesPropertiesNVX.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiviewPerViewAttributesPropertiesNVX.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiviewPerViewAttributesPropertiesNVX.perViewPositionAllComponents );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM const &\n                              physicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM.multiviewPerViewRenderAreas );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM const & physicalDeviceMultiviewPerViewViewportsFeaturesQCOM ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiviewPerViewViewportsFeaturesQCOM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiviewPerViewViewportsFeaturesQCOM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiviewPerViewViewportsFeaturesQCOM.multiviewPerViewViewports );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewProperties const & physicalDeviceMultiviewProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiviewProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiviewProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiviewProperties.maxMultiviewViewCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMultiviewProperties.maxMultiviewInstanceIndex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMutableDescriptorTypeFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceMutableDescriptorTypeFeaturesEXT const & physicalDeviceMutableDescriptorTypeFeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMutableDescriptorTypeFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMutableDescriptorTypeFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceMutableDescriptorTypeFeaturesEXT.mutableDescriptorType );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceNestedCommandBufferFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceNestedCommandBufferFeaturesEXT const & physicalDeviceNestedCommandBufferFeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceNestedCommandBufferFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceNestedCommandBufferFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceNestedCommandBufferFeaturesEXT.nestedCommandBuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceNestedCommandBufferFeaturesEXT.nestedCommandBufferRendering );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceNestedCommandBufferFeaturesEXT.nestedCommandBufferSimultaneousUse );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceNestedCommandBufferPropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceNestedCommandBufferPropertiesEXT const & physicalDeviceNestedCommandBufferPropertiesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceNestedCommandBufferPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceNestedCommandBufferPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceNestedCommandBufferPropertiesEXT.maxCommandBufferNestingLevel );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceNonSeamlessCubeMapFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceNonSeamlessCubeMapFeaturesEXT const & physicalDeviceNonSeamlessCubeMapFeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceNonSeamlessCubeMapFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceNonSeamlessCubeMapFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceNonSeamlessCubeMapFeaturesEXT.nonSeamlessCubeMap );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceOpacityMicromapFeaturesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceOpacityMicromapFeaturesEXT const & physicalDeviceOpacityMicromapFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpacityMicromapFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpacityMicromapFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpacityMicromapFeaturesEXT.micromap );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpacityMicromapFeaturesEXT.micromapCaptureReplay );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpacityMicromapFeaturesEXT.micromapHostCommands );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceOpacityMicromapPropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceOpacityMicromapPropertiesEXT const & physicalDeviceOpacityMicromapPropertiesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpacityMicromapPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpacityMicromapPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpacityMicromapPropertiesEXT.maxOpacity2StateSubdivisionLevel );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpacityMicromapPropertiesEXT.maxOpacity4StateSubdivisionLevel );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceOpticalFlowFeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceOpticalFlowFeaturesNV const & physicalDeviceOpticalFlowFeaturesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpticalFlowFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpticalFlowFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpticalFlowFeaturesNV.opticalFlow );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceOpticalFlowPropertiesNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceOpticalFlowPropertiesNV const & physicalDeviceOpticalFlowPropertiesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpticalFlowPropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpticalFlowPropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpticalFlowPropertiesNV.supportedOutputGridSizes );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpticalFlowPropertiesNV.supportedHintGridSizes );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpticalFlowPropertiesNV.hintSupported );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpticalFlowPropertiesNV.costSupported );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpticalFlowPropertiesNV.bidirectionalFlowSupported );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpticalFlowPropertiesNV.globalFlowSupported );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpticalFlowPropertiesNV.minWidth );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpticalFlowPropertiesNV.minHeight );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpticalFlowPropertiesNV.maxWidth );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpticalFlowPropertiesNV.maxHeight );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceOpticalFlowPropertiesNV.maxNumRegionsOfInterest );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePCIBusInfoPropertiesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePCIBusInfoPropertiesEXT const & physicalDevicePCIBusInfoPropertiesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePCIBusInfoPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePCIBusInfoPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePCIBusInfoPropertiesEXT.pciDomain );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePCIBusInfoPropertiesEXT.pciBus );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePCIBusInfoPropertiesEXT.pciDevice );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePCIBusInfoPropertiesEXT.pciFunction );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT const & physicalDevicePageableDeviceLocalMemoryFeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePageableDeviceLocalMemoryFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePageableDeviceLocalMemoryFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePageableDeviceLocalMemoryFeaturesEXT.pageableDeviceLocalMemory );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePartitionedAccelerationStructureFeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePartitionedAccelerationStructureFeaturesNV const &\n                              physicalDevicePartitionedAccelerationStructureFeaturesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePartitionedAccelerationStructureFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePartitionedAccelerationStructureFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePartitionedAccelerationStructureFeaturesNV.partitionedAccelerationStructure );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePartitionedAccelerationStructurePropertiesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePartitionedAccelerationStructurePropertiesNV const &\n                              physicalDevicePartitionedAccelerationStructurePropertiesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePartitionedAccelerationStructurePropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePartitionedAccelerationStructurePropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePartitionedAccelerationStructurePropertiesNV.maxPartitionCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePerStageDescriptorSetFeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePerStageDescriptorSetFeaturesNV const & physicalDevicePerStageDescriptorSetFeaturesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePerStageDescriptorSetFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePerStageDescriptorSetFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePerStageDescriptorSetFeaturesNV.perStageDescriptorSet );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePerStageDescriptorSetFeaturesNV.dynamicPipelineLayout );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePerformanceQueryFeaturesKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePerformanceQueryFeaturesKHR const & physicalDevicePerformanceQueryFeaturesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePerformanceQueryFeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePerformanceQueryFeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePerformanceQueryFeaturesKHR.performanceCounterQueryPools );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePerformanceQueryFeaturesKHR.performanceCounterMultipleQueryPools );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePerformanceQueryPropertiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePerformanceQueryPropertiesKHR const & physicalDevicePerformanceQueryPropertiesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePerformanceQueryPropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePerformanceQueryPropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePerformanceQueryPropertiesKHR.allowCommandBufferQueryCopies );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineBinaryFeaturesKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineBinaryFeaturesKHR const & physicalDevicePipelineBinaryFeaturesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineBinaryFeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineBinaryFeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineBinaryFeaturesKHR.pipelineBinaries );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineBinaryPropertiesKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineBinaryPropertiesKHR const & physicalDevicePipelineBinaryPropertiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineBinaryPropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineBinaryPropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineBinaryPropertiesKHR.pipelineBinaryInternalCache );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineBinaryPropertiesKHR.pipelineBinaryInternalCacheControl );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineBinaryPropertiesKHR.pipelineBinaryPrefersInternalCache );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineBinaryPropertiesKHR.pipelineBinaryPrecompiledInternalCache );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineBinaryPropertiesKHR.pipelineBinaryCompressedData );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineCreationCacheControlFeatures>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineCreationCacheControlFeatures const & physicalDevicePipelineCreationCacheControlFeatures ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineCreationCacheControlFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineCreationCacheControlFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineCreationCacheControlFeatures.pipelineCreationCacheControl );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineExecutablePropertiesFeaturesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineExecutablePropertiesFeaturesKHR const &\n                              physicalDevicePipelineExecutablePropertiesFeaturesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineExecutablePropertiesFeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineExecutablePropertiesFeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineExecutablePropertiesFeaturesKHR.pipelineExecutableInfo );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT const &\n                              physicalDevicePipelineLibraryGroupHandlesFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineLibraryGroupHandlesFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineLibraryGroupHandlesFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineLibraryGroupHandlesFeaturesEXT.pipelineLibraryGroupHandles );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineOpacityMicromapFeaturesARM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineOpacityMicromapFeaturesARM const & physicalDevicePipelineOpacityMicromapFeaturesARM )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineOpacityMicromapFeaturesARM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineOpacityMicromapFeaturesARM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineOpacityMicromapFeaturesARM.pipelineOpacityMicromap );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelinePropertiesFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePipelinePropertiesFeaturesEXT const & physicalDevicePipelinePropertiesFeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelinePropertiesFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelinePropertiesFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelinePropertiesFeaturesEXT.pipelinePropertiesIdentifier );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineProtectedAccessFeatures>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineProtectedAccessFeatures const & physicalDevicePipelineProtectedAccessFeatures ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineProtectedAccessFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineProtectedAccessFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineProtectedAccessFeatures.pipelineProtectedAccess );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineRobustnessFeatures>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineRobustnessFeatures const & physicalDevicePipelineRobustnessFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineRobustnessFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineRobustnessFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineRobustnessFeatures.pipelineRobustness );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineRobustnessProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineRobustnessProperties const & physicalDevicePipelineRobustnessProperties ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineRobustnessProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineRobustnessProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineRobustnessProperties.defaultRobustnessStorageBuffers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineRobustnessProperties.defaultRobustnessUniformBuffers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineRobustnessProperties.defaultRobustnessVertexInputs );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePipelineRobustnessProperties.defaultRobustnessImages );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePointClippingProperties>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePointClippingProperties const & physicalDevicePointClippingProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePointClippingProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePointClippingProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePointClippingProperties.pointClippingBehavior );\n      return seed;\n    }\n  };\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePortabilitySubsetFeaturesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePortabilitySubsetFeaturesKHR const & physicalDevicePortabilitySubsetFeaturesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePortabilitySubsetFeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePortabilitySubsetFeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePortabilitySubsetFeaturesKHR.constantAlphaColorBlendFactors );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePortabilitySubsetFeaturesKHR.events );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePortabilitySubsetFeaturesKHR.imageViewFormatReinterpretation );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePortabilitySubsetFeaturesKHR.imageViewFormatSwizzle );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePortabilitySubsetFeaturesKHR.imageView2DOn3DImage );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePortabilitySubsetFeaturesKHR.multisampleArrayImage );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePortabilitySubsetFeaturesKHR.mutableComparisonSamplers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePortabilitySubsetFeaturesKHR.pointPolygons );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePortabilitySubsetFeaturesKHR.samplerMipLodBias );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePortabilitySubsetFeaturesKHR.separateStencilMaskRef );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePortabilitySubsetFeaturesKHR.shaderSampleRateInterpolationFunctions );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePortabilitySubsetFeaturesKHR.tessellationIsolines );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePortabilitySubsetFeaturesKHR.tessellationPointMode );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePortabilitySubsetFeaturesKHR.triangleFans );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePortabilitySubsetFeaturesKHR.vertexAttributeAccessBeyondStride );\n      return seed;\n    }\n  };\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePortabilitySubsetPropertiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePortabilitySubsetPropertiesKHR const & physicalDevicePortabilitySubsetPropertiesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePortabilitySubsetPropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePortabilitySubsetPropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePortabilitySubsetPropertiesKHR.minVertexInputBindingStrideAlignment );\n      return seed;\n    }\n  };\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePresentBarrierFeaturesNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePresentBarrierFeaturesNV const & physicalDevicePresentBarrierFeaturesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePresentBarrierFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePresentBarrierFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePresentBarrierFeaturesNV.presentBarrier );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePresentIdFeaturesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePresentIdFeaturesKHR const & physicalDevicePresentIdFeaturesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePresentIdFeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePresentIdFeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePresentIdFeaturesKHR.presentId );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT const & physicalDevicePresentModeFifoLatestReadyFeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePresentModeFifoLatestReadyFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePresentModeFifoLatestReadyFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePresentModeFifoLatestReadyFeaturesEXT.presentModeFifoLatestReady );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePresentWaitFeaturesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePresentWaitFeaturesKHR const & physicalDevicePresentWaitFeaturesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePresentWaitFeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePresentWaitFeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePresentWaitFeaturesKHR.presentWait );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT const &\n                              physicalDevicePrimitiveTopologyListRestartFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePrimitiveTopologyListRestartFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePrimitiveTopologyListRestartFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePrimitiveTopologyListRestartFeaturesEXT.primitiveTopologyListRestart );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePrimitiveTopologyListRestartFeaturesEXT.primitiveTopologyPatchListRestart );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT const & physicalDevicePrimitivesGeneratedQueryFeaturesEXT )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePrimitivesGeneratedQueryFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePrimitivesGeneratedQueryFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePrimitivesGeneratedQueryFeaturesEXT.primitivesGeneratedQuery );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePrimitivesGeneratedQueryFeaturesEXT.primitivesGeneratedQueryWithRasterizerDiscard );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePrimitivesGeneratedQueryFeaturesEXT.primitivesGeneratedQueryWithNonZeroStreams );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePrivateDataFeatures>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePrivateDataFeatures const & physicalDevicePrivateDataFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePrivateDataFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePrivateDataFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePrivateDataFeatures.privateData );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceProtectedMemoryFeatures>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceProtectedMemoryFeatures const & physicalDeviceProtectedMemoryFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProtectedMemoryFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProtectedMemoryFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProtectedMemoryFeatures.protectedMemory );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceProtectedMemoryProperties>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceProtectedMemoryProperties const & physicalDeviceProtectedMemoryProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProtectedMemoryProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProtectedMemoryProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProtectedMemoryProperties.protectedNoFault );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceProvokingVertexFeaturesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceProvokingVertexFeaturesEXT const & physicalDeviceProvokingVertexFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProvokingVertexFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProvokingVertexFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProvokingVertexFeaturesEXT.provokingVertexLast );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProvokingVertexFeaturesEXT.transformFeedbackPreservesProvokingVertex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceProvokingVertexPropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceProvokingVertexPropertiesEXT const & physicalDeviceProvokingVertexPropertiesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProvokingVertexPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProvokingVertexPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProvokingVertexPropertiesEXT.provokingVertexModePerPipeline );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceProvokingVertexPropertiesEXT.transformFeedbackPreservesTriangleFanProvokingVertex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePushDescriptorProperties>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDevicePushDescriptorProperties const & physicalDevicePushDescriptorProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePushDescriptorProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePushDescriptorProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDevicePushDescriptorProperties.maxPushDescriptors );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRGBA10X6FormatsFeaturesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceRGBA10X6FormatsFeaturesEXT const & physicalDeviceRGBA10X6FormatsFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRGBA10X6FormatsFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRGBA10X6FormatsFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRGBA10X6FormatsFeaturesEXT.formatRgba10x6WithoutYCbCrSampler );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT const &\n                              physicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT.rasterizationOrderColorAttachmentAccess );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT.rasterizationOrderDepthAttachmentAccess );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT.rasterizationOrderStencilAttachmentAccess );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRawAccessChainsFeaturesNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceRawAccessChainsFeaturesNV const & physicalDeviceRawAccessChainsFeaturesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRawAccessChainsFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRawAccessChainsFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRawAccessChainsFeaturesNV.shaderRawAccessChains );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayQueryFeaturesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceRayQueryFeaturesKHR const & physicalDeviceRayQueryFeaturesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayQueryFeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayQueryFeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayQueryFeaturesKHR.rayQuery );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingInvocationReorderFeaturesNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingInvocationReorderFeaturesNV const & physicalDeviceRayTracingInvocationReorderFeaturesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingInvocationReorderFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingInvocationReorderFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingInvocationReorderFeaturesNV.rayTracingInvocationReorder );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingInvocationReorderPropertiesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingInvocationReorderPropertiesNV const &\n                              physicalDeviceRayTracingInvocationReorderPropertiesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingInvocationReorderPropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingInvocationReorderPropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingInvocationReorderPropertiesNV.rayTracingInvocationReorderReorderingHint );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV const &\n                              physicalDeviceRayTracingLinearSweptSpheresFeaturesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingLinearSweptSpheresFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingLinearSweptSpheresFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingLinearSweptSpheresFeaturesNV.spheres );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingLinearSweptSpheresFeaturesNV.linearSweptSpheres );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingMaintenance1FeaturesKHR>\n  {\n    std::size_t operator()(\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingMaintenance1FeaturesKHR const & physicalDeviceRayTracingMaintenance1FeaturesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingMaintenance1FeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingMaintenance1FeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingMaintenance1FeaturesKHR.rayTracingMaintenance1 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingMaintenance1FeaturesKHR.rayTracingPipelineTraceRaysIndirect2 );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingMotionBlurFeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingMotionBlurFeaturesNV const & physicalDeviceRayTracingMotionBlurFeaturesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingMotionBlurFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingMotionBlurFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingMotionBlurFeaturesNV.rayTracingMotionBlur );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingMotionBlurFeaturesNV.rayTracingMotionBlurPipelineTraceRaysIndirect );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPipelineFeaturesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPipelineFeaturesKHR const & physicalDeviceRayTracingPipelineFeaturesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPipelineFeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPipelineFeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPipelineFeaturesKHR.rayTracingPipeline );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPipelineFeaturesKHR.rayTracingPipelineShaderGroupHandleCaptureReplay );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPipelineFeaturesKHR.rayTracingPipelineShaderGroupHandleCaptureReplayMixed );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPipelineFeaturesKHR.rayTracingPipelineTraceRaysIndirect );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPipelineFeaturesKHR.rayTraversalPrimitiveCulling );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPipelinePropertiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPipelinePropertiesKHR const & physicalDeviceRayTracingPipelinePropertiesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPipelinePropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPipelinePropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPipelinePropertiesKHR.shaderGroupHandleSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPipelinePropertiesKHR.maxRayRecursionDepth );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPipelinePropertiesKHR.maxShaderGroupStride );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPipelinePropertiesKHR.shaderGroupBaseAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPipelinePropertiesKHR.shaderGroupHandleCaptureReplaySize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPipelinePropertiesKHR.maxRayDispatchInvocationCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPipelinePropertiesKHR.shaderGroupHandleAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPipelinePropertiesKHR.maxRayHitAttributeSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPositionFetchFeaturesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPositionFetchFeaturesKHR const & physicalDeviceRayTracingPositionFetchFeaturesKHR )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPositionFetchFeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPositionFetchFeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPositionFetchFeaturesKHR.rayTracingPositionFetch );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPropertiesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPropertiesNV const & physicalDeviceRayTracingPropertiesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPropertiesNV.shaderGroupHandleSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPropertiesNV.maxRecursionDepth );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPropertiesNV.maxShaderGroupStride );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPropertiesNV.shaderGroupBaseAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPropertiesNV.maxGeometryCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPropertiesNV.maxInstanceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPropertiesNV.maxTriangleCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingPropertiesNV.maxDescriptorSetAccelerationStructures );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingValidationFeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingValidationFeaturesNV const & physicalDeviceRayTracingValidationFeaturesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingValidationFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingValidationFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRayTracingValidationFeaturesNV.rayTracingValidation );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRelaxedLineRasterizationFeaturesIMG>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceRelaxedLineRasterizationFeaturesIMG const & physicalDeviceRelaxedLineRasterizationFeaturesIMG )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRelaxedLineRasterizationFeaturesIMG.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRelaxedLineRasterizationFeaturesIMG.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRelaxedLineRasterizationFeaturesIMG.relaxedLineRasterization );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRenderPassStripedFeaturesARM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceRenderPassStripedFeaturesARM const & physicalDeviceRenderPassStripedFeaturesARM ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRenderPassStripedFeaturesARM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRenderPassStripedFeaturesARM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRenderPassStripedFeaturesARM.renderPassStriped );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRenderPassStripedPropertiesARM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceRenderPassStripedPropertiesARM const & physicalDeviceRenderPassStripedPropertiesARM ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRenderPassStripedPropertiesARM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRenderPassStripedPropertiesARM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRenderPassStripedPropertiesARM.renderPassStripeGranularity );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRenderPassStripedPropertiesARM.maxRenderPassStripes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRepresentativeFragmentTestFeaturesNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceRepresentativeFragmentTestFeaturesNV const & physicalDeviceRepresentativeFragmentTestFeaturesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRepresentativeFragmentTestFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRepresentativeFragmentTestFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRepresentativeFragmentTestFeaturesNV.representativeFragmentTest );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRobustness2FeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceRobustness2FeaturesEXT const & physicalDeviceRobustness2FeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRobustness2FeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRobustness2FeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRobustness2FeaturesEXT.robustBufferAccess2 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRobustness2FeaturesEXT.robustImageAccess2 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRobustness2FeaturesEXT.nullDescriptor );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRobustness2PropertiesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceRobustness2PropertiesEXT const & physicalDeviceRobustness2PropertiesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRobustness2PropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRobustness2PropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRobustness2PropertiesEXT.robustStorageBufferAccessSizeAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceRobustness2PropertiesEXT.robustUniformBufferAccessSizeAlignment );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSampleLocationsPropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceSampleLocationsPropertiesEXT const & physicalDeviceSampleLocationsPropertiesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSampleLocationsPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSampleLocationsPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSampleLocationsPropertiesEXT.sampleLocationSampleCounts );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSampleLocationsPropertiesEXT.maxSampleLocationGridSize );\n      for ( size_t i = 0; i < 2; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSampleLocationsPropertiesEXT.sampleLocationCoordinateRange[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSampleLocationsPropertiesEXT.sampleLocationSubPixelBits );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSampleLocationsPropertiesEXT.variableSampleLocations );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSamplerFilterMinmaxProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceSamplerFilterMinmaxProperties const & physicalDeviceSamplerFilterMinmaxProperties ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSamplerFilterMinmaxProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSamplerFilterMinmaxProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSamplerFilterMinmaxProperties.filterMinmaxSingleComponentFormats );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSamplerFilterMinmaxProperties.filterMinmaxImageComponentMapping );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSamplerYcbcrConversionFeatures>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceSamplerYcbcrConversionFeatures const & physicalDeviceSamplerYcbcrConversionFeatures ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSamplerYcbcrConversionFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSamplerYcbcrConversionFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSamplerYcbcrConversionFeatures.samplerYcbcrConversion );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceScalarBlockLayoutFeatures>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceScalarBlockLayoutFeatures const & physicalDeviceScalarBlockLayoutFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceScalarBlockLayoutFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceScalarBlockLayoutFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceScalarBlockLayoutFeatures.scalarBlockLayout );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSchedulingControlsFeaturesARM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceSchedulingControlsFeaturesARM const & physicalDeviceSchedulingControlsFeaturesARM ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSchedulingControlsFeaturesARM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSchedulingControlsFeaturesARM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSchedulingControlsFeaturesARM.schedulingControls );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSchedulingControlsPropertiesARM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceSchedulingControlsPropertiesARM const & physicalDeviceSchedulingControlsPropertiesARM ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSchedulingControlsPropertiesARM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSchedulingControlsPropertiesARM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSchedulingControlsPropertiesARM.schedulingControlsFlags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSeparateDepthStencilLayoutsFeatures>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceSeparateDepthStencilLayoutsFeatures const & physicalDeviceSeparateDepthStencilLayoutsFeatures )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSeparateDepthStencilLayoutsFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSeparateDepthStencilLayoutsFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSeparateDepthStencilLayoutsFeatures.separateDepthStencilLayouts );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV const & physicalDeviceShaderAtomicFloat16VectorFeaturesNV )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloat16VectorFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloat16VectorFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloat16VectorFeaturesNV.shaderFloat16VectorAtomics );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicFloat2FeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicFloat2FeaturesEXT const & physicalDeviceShaderAtomicFloat2FeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.shaderBufferFloat16Atomics );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.shaderBufferFloat16AtomicAdd );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.shaderBufferFloat16AtomicMinMax );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.shaderBufferFloat32AtomicMinMax );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.shaderBufferFloat64AtomicMinMax );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.shaderSharedFloat16Atomics );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.shaderSharedFloat16AtomicAdd );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.shaderSharedFloat16AtomicMinMax );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.shaderSharedFloat32AtomicMinMax );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.shaderSharedFloat64AtomicMinMax );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.shaderImageFloat32AtomicMinMax );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.sparseImageFloat32AtomicMinMax );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicFloatFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicFloatFeaturesEXT const & physicalDeviceShaderAtomicFloatFeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloatFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloatFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloatFeaturesEXT.shaderBufferFloat32Atomics );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloatFeaturesEXT.shaderBufferFloat32AtomicAdd );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloatFeaturesEXT.shaderBufferFloat64Atomics );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloatFeaturesEXT.shaderBufferFloat64AtomicAdd );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloatFeaturesEXT.shaderSharedFloat32Atomics );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloatFeaturesEXT.shaderSharedFloat32AtomicAdd );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloatFeaturesEXT.shaderSharedFloat64Atomics );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloatFeaturesEXT.shaderSharedFloat64AtomicAdd );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloatFeaturesEXT.shaderImageFloat32Atomics );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloatFeaturesEXT.shaderImageFloat32AtomicAdd );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloatFeaturesEXT.sparseImageFloat32Atomics );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicFloatFeaturesEXT.sparseImageFloat32AtomicAdd );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicInt64Features>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicInt64Features const & physicalDeviceShaderAtomicInt64Features ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicInt64Features.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicInt64Features.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicInt64Features.shaderBufferInt64Atomics );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderAtomicInt64Features.shaderSharedInt64Atomics );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderClockFeaturesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderClockFeaturesKHR const & physicalDeviceShaderClockFeaturesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderClockFeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderClockFeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderClockFeaturesKHR.shaderSubgroupClock );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderClockFeaturesKHR.shaderDeviceClock );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCoreBuiltinsFeaturesARM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCoreBuiltinsFeaturesARM const & physicalDeviceShaderCoreBuiltinsFeaturesARM ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCoreBuiltinsFeaturesARM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCoreBuiltinsFeaturesARM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCoreBuiltinsFeaturesARM.shaderCoreBuiltins );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCoreBuiltinsPropertiesARM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCoreBuiltinsPropertiesARM const & physicalDeviceShaderCoreBuiltinsPropertiesARM ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCoreBuiltinsPropertiesARM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCoreBuiltinsPropertiesARM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCoreBuiltinsPropertiesARM.shaderCoreMask );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCoreBuiltinsPropertiesARM.shaderCoreCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCoreBuiltinsPropertiesARM.shaderWarpsPerCore );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCoreProperties2AMD>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCoreProperties2AMD const & physicalDeviceShaderCoreProperties2AMD ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCoreProperties2AMD.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCoreProperties2AMD.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCoreProperties2AMD.shaderCoreFeatures );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCoreProperties2AMD.activeComputeUnitCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCorePropertiesAMD>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCorePropertiesAMD const & physicalDeviceShaderCorePropertiesAMD ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCorePropertiesAMD.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCorePropertiesAMD.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCorePropertiesAMD.shaderEngineCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCorePropertiesAMD.shaderArraysPerEngineCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCorePropertiesAMD.computeUnitsPerShaderArray );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCorePropertiesAMD.simdPerComputeUnit );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCorePropertiesAMD.wavefrontsPerSimd );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCorePropertiesAMD.wavefrontSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCorePropertiesAMD.sgprsPerSimd );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCorePropertiesAMD.minSgprAllocation );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCorePropertiesAMD.maxSgprAllocation );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCorePropertiesAMD.sgprAllocationGranularity );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCorePropertiesAMD.vgprsPerSimd );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCorePropertiesAMD.minVgprAllocation );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCorePropertiesAMD.maxVgprAllocation );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCorePropertiesAMD.vgprAllocationGranularity );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCorePropertiesARM>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCorePropertiesARM const & physicalDeviceShaderCorePropertiesARM ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCorePropertiesARM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCorePropertiesARM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCorePropertiesARM.pixelRate );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCorePropertiesARM.texelRate );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderCorePropertiesARM.fmaRate );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderDemoteToHelperInvocationFeatures>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderDemoteToHelperInvocationFeatures const &\n                              physicalDeviceShaderDemoteToHelperInvocationFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderDemoteToHelperInvocationFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderDemoteToHelperInvocationFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderDemoteToHelperInvocationFeatures.shaderDemoteToHelperInvocation );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderDrawParametersFeatures>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderDrawParametersFeatures const & physicalDeviceShaderDrawParametersFeatures ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderDrawParametersFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderDrawParametersFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderDrawParametersFeatures.shaderDrawParameters );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD const &\n                              physicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD.shaderEarlyAndLateFragmentTests );\n      return seed;\n    }\n  };\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderEnqueueFeaturesAMDX>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderEnqueueFeaturesAMDX const & physicalDeviceShaderEnqueueFeaturesAMDX ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderEnqueueFeaturesAMDX.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderEnqueueFeaturesAMDX.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderEnqueueFeaturesAMDX.shaderEnqueue );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderEnqueueFeaturesAMDX.shaderMeshEnqueue );\n      return seed;\n    }\n  };\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderEnqueuePropertiesAMDX>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderEnqueuePropertiesAMDX const & physicalDeviceShaderEnqueuePropertiesAMDX ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderEnqueuePropertiesAMDX.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderEnqueuePropertiesAMDX.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderEnqueuePropertiesAMDX.maxExecutionGraphDepth );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderEnqueuePropertiesAMDX.maxExecutionGraphShaderOutputNodes );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderEnqueuePropertiesAMDX.maxExecutionGraphShaderPayloadSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderEnqueuePropertiesAMDX.maxExecutionGraphShaderPayloadCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderEnqueuePropertiesAMDX.executionGraphDispatchAddressAlignment );\n      for ( size_t i = 0; i < 3; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderEnqueuePropertiesAMDX.maxExecutionGraphWorkgroupCount[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderEnqueuePropertiesAMDX.maxExecutionGraphWorkgroups );\n      return seed;\n    }\n  };\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderExpectAssumeFeatures>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderExpectAssumeFeatures const & physicalDeviceShaderExpectAssumeFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderExpectAssumeFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderExpectAssumeFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderExpectAssumeFeatures.shaderExpectAssume );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderFloat16Int8Features>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderFloat16Int8Features const & physicalDeviceShaderFloat16Int8Features ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderFloat16Int8Features.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderFloat16Int8Features.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderFloat16Int8Features.shaderFloat16 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderFloat16Int8Features.shaderInt8 );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderFloatControls2Features>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderFloatControls2Features const & physicalDeviceShaderFloatControls2Features ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderFloatControls2Features.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderFloatControls2Features.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderFloatControls2Features.shaderFloatControls2 );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderImageAtomicInt64FeaturesEXT>\n  {\n    std::size_t operator()(\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderImageAtomicInt64FeaturesEXT const & physicalDeviceShaderImageAtomicInt64FeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderImageAtomicInt64FeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderImageAtomicInt64FeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderImageAtomicInt64FeaturesEXT.shaderImageInt64Atomics );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderImageAtomicInt64FeaturesEXT.sparseImageInt64Atomics );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderImageFootprintFeaturesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderImageFootprintFeaturesNV const & physicalDeviceShaderImageFootprintFeaturesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderImageFootprintFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderImageFootprintFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderImageFootprintFeaturesNV.imageFootprint );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerDotProductFeatures>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerDotProductFeatures const & physicalDeviceShaderIntegerDotProductFeatures ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductFeatures.shaderIntegerDotProduct );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerDotProductProperties>\n  {\n    std::size_t operator()(\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerDotProductProperties const & physicalDeviceShaderIntegerDotProductProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct8BitUnsignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct8BitSignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct8BitMixedSignednessAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct4x8BitPackedUnsignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct4x8BitPackedSignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct4x8BitPackedMixedSignednessAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct16BitUnsignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct16BitSignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct16BitMixedSignednessAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct32BitUnsignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct32BitSignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct32BitMixedSignednessAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct64BitUnsignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct64BitSignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct64BitMixedSignednessAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating8BitUnsignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating8BitSignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed,\n                               physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating16BitUnsignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating16BitSignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating32BitUnsignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating32BitSignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating64BitUnsignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating64BitSignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL const & physicalDeviceShaderIntegerFunctions2FeaturesINTEL ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerFunctions2FeaturesINTEL.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerFunctions2FeaturesINTEL.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderIntegerFunctions2FeaturesINTEL.shaderIntegerFunctions2 );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR const & physicalDeviceShaderMaximalReconvergenceFeaturesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderMaximalReconvergenceFeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderMaximalReconvergenceFeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderMaximalReconvergenceFeaturesKHR.shaderMaximalReconvergence );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderModuleIdentifierFeaturesEXT>\n  {\n    std::size_t operator()(\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderModuleIdentifierFeaturesEXT const & physicalDeviceShaderModuleIdentifierFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderModuleIdentifierFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderModuleIdentifierFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderModuleIdentifierFeaturesEXT.shaderModuleIdentifier );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderModuleIdentifierPropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderModuleIdentifierPropertiesEXT const & physicalDeviceShaderModuleIdentifierPropertiesEXT )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderModuleIdentifierPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderModuleIdentifierPropertiesEXT.pNext );\n      for ( size_t i = 0; i < VK_UUID_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderModuleIdentifierPropertiesEXT.shaderModuleIdentifierAlgorithmUUID[i] );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderObjectFeaturesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderObjectFeaturesEXT const & physicalDeviceShaderObjectFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderObjectFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderObjectFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderObjectFeaturesEXT.shaderObject );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderObjectPropertiesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderObjectPropertiesEXT const & physicalDeviceShaderObjectPropertiesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderObjectPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderObjectPropertiesEXT.pNext );\n      for ( size_t i = 0; i < VK_UUID_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderObjectPropertiesEXT.shaderBinaryUUID[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderObjectPropertiesEXT.shaderBinaryVersion );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderQuadControlFeaturesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderQuadControlFeaturesKHR const & physicalDeviceShaderQuadControlFeaturesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderQuadControlFeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderQuadControlFeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderQuadControlFeaturesKHR.shaderQuadControl );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR const &\n                              physicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR.shaderRelaxedExtendedInstruction );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderReplicatedCompositesFeaturesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderReplicatedCompositesFeaturesEXT const & physicalDeviceShaderReplicatedCompositesFeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderReplicatedCompositesFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderReplicatedCompositesFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderReplicatedCompositesFeaturesEXT.shaderReplicatedComposites );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSMBuiltinsFeaturesNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSMBuiltinsFeaturesNV const & physicalDeviceShaderSMBuiltinsFeaturesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderSMBuiltinsFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderSMBuiltinsFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderSMBuiltinsFeaturesNV.shaderSMBuiltins );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSMBuiltinsPropertiesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSMBuiltinsPropertiesNV const & physicalDeviceShaderSMBuiltinsPropertiesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderSMBuiltinsPropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderSMBuiltinsPropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderSMBuiltinsPropertiesNV.shaderSMCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderSMBuiltinsPropertiesNV.shaderWarpsPerSM );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSubgroupExtendedTypesFeatures>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSubgroupExtendedTypesFeatures const & physicalDeviceShaderSubgroupExtendedTypesFeatures )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderSubgroupExtendedTypesFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderSubgroupExtendedTypesFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderSubgroupExtendedTypesFeatures.shaderSubgroupExtendedTypes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSubgroupRotateFeatures>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSubgroupRotateFeatures const & physicalDeviceShaderSubgroupRotateFeatures ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderSubgroupRotateFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderSubgroupRotateFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderSubgroupRotateFeatures.shaderSubgroupRotate );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderSubgroupRotateFeatures.shaderSubgroupRotateClustered );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR const &\n                              physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR.shaderSubgroupUniformControlFlow );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderTerminateInvocationFeatures>\n  {\n    std::size_t operator()(\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderTerminateInvocationFeatures const & physicalDeviceShaderTerminateInvocationFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderTerminateInvocationFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderTerminateInvocationFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderTerminateInvocationFeatures.shaderTerminateInvocation );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderTileImageFeaturesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderTileImageFeaturesEXT const & physicalDeviceShaderTileImageFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderTileImageFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderTileImageFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderTileImageFeaturesEXT.shaderTileImageColorReadAccess );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderTileImageFeaturesEXT.shaderTileImageDepthReadAccess );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderTileImageFeaturesEXT.shaderTileImageStencilReadAccess );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderTileImagePropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderTileImagePropertiesEXT const & physicalDeviceShaderTileImagePropertiesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderTileImagePropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderTileImagePropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderTileImagePropertiesEXT.shaderTileImageCoherentReadAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderTileImagePropertiesEXT.shaderTileImageReadSampleFromPixelRateInvocation );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShaderTileImagePropertiesEXT.shaderTileImageReadFromHelperInvocation );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShadingRateImageFeaturesNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShadingRateImageFeaturesNV const & physicalDeviceShadingRateImageFeaturesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShadingRateImageFeaturesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShadingRateImageFeaturesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShadingRateImageFeaturesNV.shadingRateImage );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShadingRateImageFeaturesNV.shadingRateCoarseSampleOrder );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShadingRateImagePropertiesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceShadingRateImagePropertiesNV const & physicalDeviceShadingRateImagePropertiesNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShadingRateImagePropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShadingRateImagePropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShadingRateImagePropertiesNV.shadingRateTexelSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShadingRateImagePropertiesNV.shadingRatePaletteSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceShadingRateImagePropertiesNV.shadingRateMaxCoarseSamples );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 const & physicalDeviceSparseImageFormatInfo2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSparseImageFormatInfo2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSparseImageFormatInfo2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSparseImageFormatInfo2.format );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSparseImageFormatInfo2.type );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSparseImageFormatInfo2.samples );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSparseImageFormatInfo2.usage );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSparseImageFormatInfo2.tiling );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupProperties const & physicalDeviceSubgroupProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubgroupProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubgroupProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubgroupProperties.subgroupSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubgroupProperties.supportedStages );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubgroupProperties.supportedOperations );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubgroupProperties.quadOperationsInAllStages );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupSizeControlFeatures>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupSizeControlFeatures const & physicalDeviceSubgroupSizeControlFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubgroupSizeControlFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubgroupSizeControlFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubgroupSizeControlFeatures.subgroupSizeControl );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubgroupSizeControlFeatures.computeFullSubgroups );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupSizeControlProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupSizeControlProperties const & physicalDeviceSubgroupSizeControlProperties ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubgroupSizeControlProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubgroupSizeControlProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubgroupSizeControlProperties.minSubgroupSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubgroupSizeControlProperties.maxSubgroupSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubgroupSizeControlProperties.maxComputeWorkgroupSubgroups );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubgroupSizeControlProperties.requiredSubgroupSizeStages );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubpassMergeFeedbackFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceSubpassMergeFeedbackFeaturesEXT const & physicalDeviceSubpassMergeFeedbackFeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubpassMergeFeedbackFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubpassMergeFeedbackFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubpassMergeFeedbackFeaturesEXT.subpassMergeFeedback );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubpassShadingFeaturesHUAWEI>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceSubpassShadingFeaturesHUAWEI const & physicalDeviceSubpassShadingFeaturesHUAWEI ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubpassShadingFeaturesHUAWEI.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubpassShadingFeaturesHUAWEI.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubpassShadingFeaturesHUAWEI.subpassShading );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubpassShadingPropertiesHUAWEI>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceSubpassShadingPropertiesHUAWEI const & physicalDeviceSubpassShadingPropertiesHUAWEI ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubpassShadingPropertiesHUAWEI.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubpassShadingPropertiesHUAWEI.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSubpassShadingPropertiesHUAWEI.maxSubpassShadingWorkgroupSizeAspectRatio );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR const & physicalDeviceSurfaceInfo2KHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSurfaceInfo2KHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSurfaceInfo2KHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSurfaceInfo2KHR.surface );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSwapchainMaintenance1FeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceSwapchainMaintenance1FeaturesEXT const & physicalDeviceSwapchainMaintenance1FeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSwapchainMaintenance1FeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSwapchainMaintenance1FeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSwapchainMaintenance1FeaturesEXT.swapchainMaintenance1 );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSynchronization2Features>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceSynchronization2Features const & physicalDeviceSynchronization2Features ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSynchronization2Features.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSynchronization2Features.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceSynchronization2Features.synchronization2 );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceTexelBufferAlignmentFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceTexelBufferAlignmentFeaturesEXT const & physicalDeviceTexelBufferAlignmentFeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTexelBufferAlignmentFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTexelBufferAlignmentFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTexelBufferAlignmentFeaturesEXT.texelBufferAlignment );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceTexelBufferAlignmentProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceTexelBufferAlignmentProperties const & physicalDeviceTexelBufferAlignmentProperties ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTexelBufferAlignmentProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTexelBufferAlignmentProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTexelBufferAlignmentProperties.storageTexelBufferOffsetAlignmentBytes );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTexelBufferAlignmentProperties.storageTexelBufferOffsetSingleTexelAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTexelBufferAlignmentProperties.uniformTexelBufferOffsetAlignmentBytes );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTexelBufferAlignmentProperties.uniformTexelBufferOffsetSingleTexelAlignment );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceTextureCompressionASTCHDRFeatures>\n  {\n    std::size_t operator()(\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceTextureCompressionASTCHDRFeatures const & physicalDeviceTextureCompressionASTCHDRFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTextureCompressionASTCHDRFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTextureCompressionASTCHDRFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTextureCompressionASTCHDRFeatures.textureCompressionASTC_HDR );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceTilePropertiesFeaturesQCOM>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceTilePropertiesFeaturesQCOM const & physicalDeviceTilePropertiesFeaturesQCOM ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTilePropertiesFeaturesQCOM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTilePropertiesFeaturesQCOM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTilePropertiesFeaturesQCOM.tileProperties );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceTimelineSemaphoreFeatures>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceTimelineSemaphoreFeatures const & physicalDeviceTimelineSemaphoreFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTimelineSemaphoreFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTimelineSemaphoreFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTimelineSemaphoreFeatures.timelineSemaphore );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceTimelineSemaphoreProperties>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceTimelineSemaphoreProperties const & physicalDeviceTimelineSemaphoreProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTimelineSemaphoreProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTimelineSemaphoreProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTimelineSemaphoreProperties.maxTimelineSemaphoreValueDifference );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties const & physicalDeviceToolProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceToolProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceToolProperties.pNext );\n      for ( size_t i = 0; i < VK_MAX_EXTENSION_NAME_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceToolProperties.name[i] );\n      }\n      for ( size_t i = 0; i < VK_MAX_EXTENSION_NAME_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceToolProperties.version[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceToolProperties.purposes );\n      for ( size_t i = 0; i < VK_MAX_DESCRIPTION_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceToolProperties.description[i] );\n      }\n      for ( size_t i = 0; i < VK_MAX_EXTENSION_NAME_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceToolProperties.layer[i] );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceTransformFeedbackFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceTransformFeedbackFeaturesEXT const & physicalDeviceTransformFeedbackFeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTransformFeedbackFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTransformFeedbackFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTransformFeedbackFeaturesEXT.transformFeedback );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTransformFeedbackFeaturesEXT.geometryStreams );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceTransformFeedbackPropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceTransformFeedbackPropertiesEXT const & physicalDeviceTransformFeedbackPropertiesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTransformFeedbackPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTransformFeedbackPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTransformFeedbackPropertiesEXT.maxTransformFeedbackStreams );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTransformFeedbackPropertiesEXT.maxTransformFeedbackBuffers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTransformFeedbackPropertiesEXT.maxTransformFeedbackBufferSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTransformFeedbackPropertiesEXT.maxTransformFeedbackStreamDataSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTransformFeedbackPropertiesEXT.maxTransformFeedbackBufferDataSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTransformFeedbackPropertiesEXT.maxTransformFeedbackBufferDataStride );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTransformFeedbackPropertiesEXT.transformFeedbackQueries );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTransformFeedbackPropertiesEXT.transformFeedbackStreamsLinesTriangles );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTransformFeedbackPropertiesEXT.transformFeedbackRasterizationStreamSelect );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceTransformFeedbackPropertiesEXT.transformFeedbackDraw );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceUniformBufferStandardLayoutFeatures>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceUniformBufferStandardLayoutFeatures const & physicalDeviceUniformBufferStandardLayoutFeatures )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceUniformBufferStandardLayoutFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceUniformBufferStandardLayoutFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceUniformBufferStandardLayoutFeatures.uniformBufferStandardLayout );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVariablePointersFeatures>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceVariablePointersFeatures const & physicalDeviceVariablePointersFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVariablePointersFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVariablePointersFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVariablePointersFeatures.variablePointersStorageBuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVariablePointersFeatures.variablePointers );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeDivisorFeatures>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeDivisorFeatures const & physicalDeviceVertexAttributeDivisorFeatures ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVertexAttributeDivisorFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVertexAttributeDivisorFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVertexAttributeDivisorFeatures.vertexAttributeInstanceRateDivisor );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVertexAttributeDivisorFeatures.vertexAttributeInstanceRateZeroDivisor );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeDivisorProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeDivisorProperties const & physicalDeviceVertexAttributeDivisorProperties ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVertexAttributeDivisorProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVertexAttributeDivisorProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVertexAttributeDivisorProperties.maxVertexAttribDivisor );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVertexAttributeDivisorProperties.supportsNonZeroFirstInstance );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeDivisorPropertiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeDivisorPropertiesEXT const & physicalDeviceVertexAttributeDivisorPropertiesEXT )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVertexAttributeDivisorPropertiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVertexAttributeDivisorPropertiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVertexAttributeDivisorPropertiesEXT.maxVertexAttribDivisor );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeRobustnessFeaturesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeRobustnessFeaturesEXT const & physicalDeviceVertexAttributeRobustnessFeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVertexAttributeRobustnessFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVertexAttributeRobustnessFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVertexAttributeRobustnessFeaturesEXT.vertexAttributeRobustness );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexInputDynamicStateFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexInputDynamicStateFeaturesEXT const & physicalDeviceVertexInputDynamicStateFeaturesEXT )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVertexInputDynamicStateFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVertexInputDynamicStateFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVertexInputDynamicStateFeaturesEXT.vertexInputDynamicState );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeAV1FeaturesKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeAV1FeaturesKHR const & physicalDeviceVideoEncodeAV1FeaturesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVideoEncodeAV1FeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVideoEncodeAV1FeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVideoEncodeAV1FeaturesKHR.videoEncodeAV1 );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR const & videoProfileInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoProfileInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoProfileInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoProfileInfoKHR.videoCodecOperation );\n      VULKAN_HPP_HASH_COMBINE( seed, videoProfileInfoKHR.chromaSubsampling );\n      VULKAN_HPP_HASH_COMBINE( seed, videoProfileInfoKHR.lumaBitDepth );\n      VULKAN_HPP_HASH_COMBINE( seed, videoProfileInfoKHR.chromaBitDepth );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeQualityLevelInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeQualityLevelInfoKHR const & physicalDeviceVideoEncodeQualityLevelInfoKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVideoEncodeQualityLevelInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVideoEncodeQualityLevelInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVideoEncodeQualityLevelInfoKHR.pVideoProfile );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVideoEncodeQualityLevelInfoKHR.qualityLevel );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR const & physicalDeviceVideoEncodeQuantizationMapFeaturesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVideoEncodeQuantizationMapFeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVideoEncodeQuantizationMapFeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVideoEncodeQuantizationMapFeaturesKHR.videoEncodeQuantizationMap );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR const & physicalDeviceVideoFormatInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVideoFormatInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVideoFormatInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVideoFormatInfoKHR.imageUsage );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoMaintenance1FeaturesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoMaintenance1FeaturesKHR const & physicalDeviceVideoMaintenance1FeaturesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVideoMaintenance1FeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVideoMaintenance1FeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVideoMaintenance1FeaturesKHR.videoMaintenance1 );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoMaintenance2FeaturesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoMaintenance2FeaturesKHR const & physicalDeviceVideoMaintenance2FeaturesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVideoMaintenance2FeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVideoMaintenance2FeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVideoMaintenance2FeaturesKHR.videoMaintenance2 );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan11Features>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan11Features const & physicalDeviceVulkan11Features ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Features.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Features.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Features.storageBuffer16BitAccess );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Features.uniformAndStorageBuffer16BitAccess );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Features.storagePushConstant16 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Features.storageInputOutput16 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Features.multiview );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Features.multiviewGeometryShader );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Features.multiviewTessellationShader );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Features.variablePointersStorageBuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Features.variablePointers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Features.protectedMemory );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Features.samplerYcbcrConversion );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Features.shaderDrawParameters );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan11Properties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan11Properties const & physicalDeviceVulkan11Properties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Properties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Properties.pNext );\n      for ( size_t i = 0; i < VK_UUID_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Properties.deviceUUID[i] );\n      }\n      for ( size_t i = 0; i < VK_UUID_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Properties.driverUUID[i] );\n      }\n      for ( size_t i = 0; i < VK_LUID_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Properties.deviceLUID[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Properties.deviceNodeMask );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Properties.deviceLUIDValid );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Properties.subgroupSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Properties.subgroupSupportedStages );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Properties.subgroupSupportedOperations );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Properties.subgroupQuadOperationsInAllStages );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Properties.pointClippingBehavior );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Properties.maxMultiviewViewCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Properties.maxMultiviewInstanceIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Properties.protectedNoFault );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Properties.maxPerSetDescriptors );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan11Properties.maxMemoryAllocationSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan12Features>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan12Features const & physicalDeviceVulkan12Features ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.samplerMirrorClampToEdge );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.drawIndirectCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.storageBuffer8BitAccess );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.uniformAndStorageBuffer8BitAccess );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.storagePushConstant8 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.shaderBufferInt64Atomics );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.shaderSharedInt64Atomics );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.shaderFloat16 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.shaderInt8 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.descriptorIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.shaderInputAttachmentArrayDynamicIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.shaderUniformTexelBufferArrayDynamicIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.shaderStorageTexelBufferArrayDynamicIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.shaderUniformBufferArrayNonUniformIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.shaderSampledImageArrayNonUniformIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.shaderStorageBufferArrayNonUniformIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.shaderStorageImageArrayNonUniformIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.shaderInputAttachmentArrayNonUniformIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.shaderUniformTexelBufferArrayNonUniformIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.shaderStorageTexelBufferArrayNonUniformIndexing );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.descriptorBindingUniformBufferUpdateAfterBind );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.descriptorBindingSampledImageUpdateAfterBind );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.descriptorBindingStorageImageUpdateAfterBind );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.descriptorBindingStorageBufferUpdateAfterBind );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.descriptorBindingUniformTexelBufferUpdateAfterBind );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.descriptorBindingStorageTexelBufferUpdateAfterBind );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.descriptorBindingUpdateUnusedWhilePending );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.descriptorBindingPartiallyBound );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.descriptorBindingVariableDescriptorCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.runtimeDescriptorArray );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.samplerFilterMinmax );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.scalarBlockLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.imagelessFramebuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.uniformBufferStandardLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.shaderSubgroupExtendedTypes );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.separateDepthStencilLayouts );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.hostQueryReset );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.timelineSemaphore );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.bufferDeviceAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.bufferDeviceAddressCaptureReplay );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.bufferDeviceAddressMultiDevice );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.vulkanMemoryModel );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.vulkanMemoryModelDeviceScope );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.vulkanMemoryModelAvailabilityVisibilityChains );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.shaderOutputViewportIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.shaderOutputLayer );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Features.subgroupBroadcastDynamicId );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan12Properties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan12Properties const & physicalDeviceVulkan12Properties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.driverID );\n      for ( size_t i = 0; i < VK_MAX_DRIVER_NAME_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.driverName[i] );\n      }\n      for ( size_t i = 0; i < VK_MAX_DRIVER_INFO_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.driverInfo[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.conformanceVersion );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.denormBehaviorIndependence );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.roundingModeIndependence );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.shaderSignedZeroInfNanPreserveFloat16 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.shaderSignedZeroInfNanPreserveFloat32 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.shaderSignedZeroInfNanPreserveFloat64 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.shaderDenormPreserveFloat16 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.shaderDenormPreserveFloat32 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.shaderDenormPreserveFloat64 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.shaderDenormFlushToZeroFloat16 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.shaderDenormFlushToZeroFloat32 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.shaderDenormFlushToZeroFloat64 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.shaderRoundingModeRTEFloat16 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.shaderRoundingModeRTEFloat32 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.shaderRoundingModeRTEFloat64 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.shaderRoundingModeRTZFloat16 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.shaderRoundingModeRTZFloat32 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.shaderRoundingModeRTZFloat64 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.maxUpdateAfterBindDescriptorsInAllPools );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.shaderUniformBufferArrayNonUniformIndexingNative );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.shaderSampledImageArrayNonUniformIndexingNative );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.shaderStorageBufferArrayNonUniformIndexingNative );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.shaderStorageImageArrayNonUniformIndexingNative );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.shaderInputAttachmentArrayNonUniformIndexingNative );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.robustBufferAccessUpdateAfterBind );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.quadDivergentImplicitLod );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.maxPerStageDescriptorUpdateAfterBindSamplers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.maxPerStageDescriptorUpdateAfterBindUniformBuffers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.maxPerStageDescriptorUpdateAfterBindStorageBuffers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.maxPerStageDescriptorUpdateAfterBindSampledImages );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.maxPerStageDescriptorUpdateAfterBindStorageImages );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.maxPerStageDescriptorUpdateAfterBindInputAttachments );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.maxPerStageUpdateAfterBindResources );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.maxDescriptorSetUpdateAfterBindSamplers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.maxDescriptorSetUpdateAfterBindUniformBuffers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.maxDescriptorSetUpdateAfterBindStorageBuffers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.maxDescriptorSetUpdateAfterBindSampledImages );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.maxDescriptorSetUpdateAfterBindStorageImages );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.maxDescriptorSetUpdateAfterBindInputAttachments );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.supportedDepthResolveModes );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.supportedStencilResolveModes );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.independentResolveNone );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.independentResolve );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.filterMinmaxSingleComponentFormats );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.filterMinmaxImageComponentMapping );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.maxTimelineSemaphoreValueDifference );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan12Properties.framebufferIntegerColorSampleCounts );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan13Features>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan13Features const & physicalDeviceVulkan13Features ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Features.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Features.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Features.robustImageAccess );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Features.inlineUniformBlock );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Features.descriptorBindingInlineUniformBlockUpdateAfterBind );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Features.pipelineCreationCacheControl );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Features.privateData );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Features.shaderDemoteToHelperInvocation );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Features.shaderTerminateInvocation );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Features.subgroupSizeControl );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Features.computeFullSubgroups );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Features.synchronization2 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Features.textureCompressionASTC_HDR );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Features.shaderZeroInitializeWorkgroupMemory );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Features.dynamicRendering );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Features.shaderIntegerDotProduct );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Features.maintenance4 );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan13Properties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan13Properties const & physicalDeviceVulkan13Properties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.minSubgroupSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.maxSubgroupSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.maxComputeWorkgroupSubgroups );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.requiredSubgroupSizeStages );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.maxInlineUniformBlockSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.maxPerStageDescriptorInlineUniformBlocks );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.maxDescriptorSetInlineUniformBlocks );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.maxDescriptorSetUpdateAfterBindInlineUniformBlocks );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.maxInlineUniformTotalSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProduct8BitUnsignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProduct8BitSignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProduct8BitMixedSignednessAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProduct4x8BitPackedUnsignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProduct4x8BitPackedSignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProduct4x8BitPackedMixedSignednessAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProduct16BitUnsignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProduct16BitSignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProduct16BitMixedSignednessAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProduct32BitUnsignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProduct32BitSignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProduct32BitMixedSignednessAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProduct64BitUnsignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProduct64BitSignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProduct64BitMixedSignednessAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating8BitUnsignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating8BitSignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating16BitUnsignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating16BitSignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating32BitUnsignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating32BitSignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating64BitUnsignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating64BitSignedAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.storageTexelBufferOffsetAlignmentBytes );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.storageTexelBufferOffsetSingleTexelAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.uniformTexelBufferOffsetAlignmentBytes );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.uniformTexelBufferOffsetSingleTexelAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan13Properties.maxBufferSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan14Features>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan14Features const & physicalDeviceVulkan14Features ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Features.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Features.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Features.globalPriorityQuery );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Features.shaderSubgroupRotate );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Features.shaderSubgroupRotateClustered );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Features.shaderFloatControls2 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Features.shaderExpectAssume );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Features.rectangularLines );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Features.bresenhamLines );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Features.smoothLines );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Features.stippledRectangularLines );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Features.stippledBresenhamLines );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Features.stippledSmoothLines );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Features.vertexAttributeInstanceRateDivisor );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Features.vertexAttributeInstanceRateZeroDivisor );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Features.indexTypeUint8 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Features.dynamicRenderingLocalRead );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Features.maintenance5 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Features.maintenance6 );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Features.pipelineProtectedAccess );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Features.pipelineRobustness );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Features.hostImageCopy );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Features.pushDescriptor );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan14Properties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan14Properties const & physicalDeviceVulkan14Properties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.lineSubPixelPrecisionBits );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.maxVertexAttribDivisor );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.supportsNonZeroFirstInstance );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.maxPushDescriptors );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.dynamicRenderingLocalReadDepthStencilAttachments );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.dynamicRenderingLocalReadMultisampledAttachments );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.earlyFragmentMultisampleCoverageAfterSampleCounting );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.earlyFragmentSampleMaskTestBeforeSampleCounting );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.depthStencilSwizzleOneSupport );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.polygonModePointSize );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.nonStrictSinglePixelWideLinesUseParallelogram );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.nonStrictWideLinesUseParallelogram );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.blockTexelViewCompatibleMultipleLayers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.maxCombinedImageSamplerDescriptorCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.fragmentShadingRateClampCombinerInputs );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.defaultRobustnessStorageBuffers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.defaultRobustnessUniformBuffers );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.defaultRobustnessVertexInputs );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.defaultRobustnessImages );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.copySrcLayoutCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.pCopySrcLayouts );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.copyDstLayoutCount );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.pCopyDstLayouts );\n      for ( size_t i = 0; i < VK_UUID_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.optimalTilingLayoutUUID[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkan14Properties.identicalMemoryTypeRequirements );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkanMemoryModelFeatures>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkanMemoryModelFeatures const & physicalDeviceVulkanMemoryModelFeatures ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkanMemoryModelFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkanMemoryModelFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkanMemoryModelFeatures.vulkanMemoryModel );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceVulkanMemoryModelFeatures.vulkanMemoryModelAvailabilityVisibilityChains );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR const &\n                              physicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.workgroupMemoryExplicitLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.workgroupMemoryExplicitLayoutScalarBlockLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.workgroupMemoryExplicitLayout8BitAccess );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.workgroupMemoryExplicitLayout16BitAccess );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT const & physicalDeviceYcbcr2Plane444FormatsFeaturesEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceYcbcr2Plane444FormatsFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceYcbcr2Plane444FormatsFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceYcbcr2Plane444FormatsFeaturesEXT.ycbcr2plane444Formats );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceYcbcrDegammaFeaturesQCOM>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceYcbcrDegammaFeaturesQCOM const & physicalDeviceYcbcrDegammaFeaturesQCOM ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceYcbcrDegammaFeaturesQCOM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceYcbcrDegammaFeaturesQCOM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceYcbcrDegammaFeaturesQCOM.ycbcrDegamma );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceYcbcrImageArraysFeaturesEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceYcbcrImageArraysFeaturesEXT const & physicalDeviceYcbcrImageArraysFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceYcbcrImageArraysFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceYcbcrImageArraysFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceYcbcrImageArraysFeaturesEXT.ycbcrImageArrays );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures const & physicalDeviceZeroInitializeWorkgroupMemoryFeatures ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceZeroInitializeWorkgroupMemoryFeatures.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceZeroInitializeWorkgroupMemoryFeatures.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, physicalDeviceZeroInitializeWorkgroupMemoryFeatures.shaderZeroInitializeWorkgroupMemory );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR const & pipelineBinaryKeyKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryKeyKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryKeyKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryKeyKHR.keySize );\n      for ( size_t i = 0; i < VK_MAX_PIPELINE_BINARY_KEY_SIZE_KHR; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryKeyKHR.key[i] );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineBinaryDataKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineBinaryDataKHR const & pipelineBinaryDataKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryDataKHR.dataSize );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryDataKHR.pData );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineBinaryKeysAndDataKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineBinaryKeysAndDataKHR const & pipelineBinaryKeysAndDataKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryKeysAndDataKHR.binaryCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryKeysAndDataKHR.pPipelineBinaryKeys );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryKeysAndDataKHR.pPipelineBinaryData );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineCreateInfoKHR const & pipelineCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCreateInfoKHR.pNext );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineBinaryCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineBinaryCreateInfoKHR const & pipelineBinaryCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryCreateInfoKHR.pKeysAndDataInfo );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryCreateInfoKHR.pipeline );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryCreateInfoKHR.pPipelineCreateInfo );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineBinaryDataInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineBinaryDataInfoKHR const & pipelineBinaryDataInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryDataInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryDataInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryDataInfoKHR.pipelineBinary );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineBinaryHandlesInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineBinaryHandlesInfoKHR const & pipelineBinaryHandlesInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryHandlesInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryHandlesInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryHandlesInfoKHR.pipelineBinaryCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryHandlesInfoKHR.pPipelineBinaries );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineBinaryInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineBinaryInfoKHR const & pipelineBinaryInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryInfoKHR.binaryCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineBinaryInfoKHR.pPipelineBinaries );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineCacheCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineCacheCreateInfo const & pipelineCacheCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCacheCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCacheCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCacheCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCacheCreateInfo.initialDataSize );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCacheCreateInfo.pInitialData );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineCacheHeaderVersionOne>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineCacheHeaderVersionOne const & pipelineCacheHeaderVersionOne ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCacheHeaderVersionOne.headerSize );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCacheHeaderVersionOne.headerVersion );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCacheHeaderVersionOne.vendorID );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCacheHeaderVersionOne.deviceID );\n      for ( size_t i = 0; i < VK_UUID_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, pipelineCacheHeaderVersionOne.pipelineCacheUUID[i] );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineColorBlendAdvancedStateCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineColorBlendAdvancedStateCreateInfoEXT const & pipelineColorBlendAdvancedStateCreateInfoEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorBlendAdvancedStateCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorBlendAdvancedStateCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorBlendAdvancedStateCreateInfoEXT.srcPremultiplied );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorBlendAdvancedStateCreateInfoEXT.dstPremultiplied );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorBlendAdvancedStateCreateInfoEXT.blendOverlap );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineColorWriteCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineColorWriteCreateInfoEXT const & pipelineColorWriteCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorWriteCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorWriteCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorWriteCreateInfoEXT.attachmentCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineColorWriteCreateInfoEXT.pColorWriteEnables );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineCompilerControlCreateInfoAMD>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineCompilerControlCreateInfoAMD const & pipelineCompilerControlCreateInfoAMD ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCompilerControlCreateInfoAMD.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCompilerControlCreateInfoAMD.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCompilerControlCreateInfoAMD.compilerControlFlags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineCoverageModulationStateCreateInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineCoverageModulationStateCreateInfoNV const & pipelineCoverageModulationStateCreateInfoNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCoverageModulationStateCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCoverageModulationStateCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCoverageModulationStateCreateInfoNV.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCoverageModulationStateCreateInfoNV.coverageModulationMode );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCoverageModulationStateCreateInfoNV.coverageModulationTableEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCoverageModulationStateCreateInfoNV.coverageModulationTableCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCoverageModulationStateCreateInfoNV.pCoverageModulationTable );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineCoverageReductionStateCreateInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineCoverageReductionStateCreateInfoNV const & pipelineCoverageReductionStateCreateInfoNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCoverageReductionStateCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCoverageReductionStateCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCoverageReductionStateCreateInfoNV.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCoverageReductionStateCreateInfoNV.coverageReductionMode );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineCoverageToColorStateCreateInfoNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PipelineCoverageToColorStateCreateInfoNV const & pipelineCoverageToColorStateCreateInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCoverageToColorStateCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCoverageToColorStateCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCoverageToColorStateCreateInfoNV.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCoverageToColorStateCreateInfoNV.coverageToColorEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCoverageToColorStateCreateInfoNV.coverageToColorLocation );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineCreateFlags2CreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineCreateFlags2CreateInfo const & pipelineCreateFlags2CreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCreateFlags2CreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCreateFlags2CreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCreateFlags2CreateInfo.flags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineCreationFeedback>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineCreationFeedback const & pipelineCreationFeedback ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCreationFeedback.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCreationFeedback.duration );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineCreationFeedbackCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineCreationFeedbackCreateInfo const & pipelineCreationFeedbackCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCreationFeedbackCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCreationFeedbackCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCreationFeedbackCreateInfo.pPipelineCreationFeedback );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCreationFeedbackCreateInfo.pipelineStageCreationFeedbackCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineCreationFeedbackCreateInfo.pPipelineStageCreationFeedbacks );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineDiscardRectangleStateCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineDiscardRectangleStateCreateInfoEXT const & pipelineDiscardRectangleStateCreateInfoEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineDiscardRectangleStateCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineDiscardRectangleStateCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineDiscardRectangleStateCreateInfoEXT.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineDiscardRectangleStateCreateInfoEXT.discardRectangleMode );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineDiscardRectangleStateCreateInfoEXT.discardRectangleCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineDiscardRectangleStateCreateInfoEXT.pDiscardRectangles );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR const & pipelineExecutableInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineExecutableInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineExecutableInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineExecutableInfoKHR.pipeline );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineExecutableInfoKHR.executableIndex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR const & pipelineExecutableInternalRepresentationKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineExecutableInternalRepresentationKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineExecutableInternalRepresentationKHR.pNext );\n      for ( size_t i = 0; i < VK_MAX_DESCRIPTION_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, pipelineExecutableInternalRepresentationKHR.name[i] );\n      }\n      for ( size_t i = 0; i < VK_MAX_DESCRIPTION_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, pipelineExecutableInternalRepresentationKHR.description[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineExecutableInternalRepresentationKHR.isText );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineExecutableInternalRepresentationKHR.dataSize );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineExecutableInternalRepresentationKHR.pData );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR const & pipelineExecutablePropertiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineExecutablePropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineExecutablePropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineExecutablePropertiesKHR.stages );\n      for ( size_t i = 0; i < VK_MAX_DESCRIPTION_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, pipelineExecutablePropertiesKHR.name[i] );\n      }\n      for ( size_t i = 0; i < VK_MAX_DESCRIPTION_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, pipelineExecutablePropertiesKHR.description[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineExecutablePropertiesKHR.subgroupSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineFragmentShadingRateEnumStateCreateInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineFragmentShadingRateEnumStateCreateInfoNV const & pipelineFragmentShadingRateEnumStateCreateInfoNV )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineFragmentShadingRateEnumStateCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineFragmentShadingRateEnumStateCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineFragmentShadingRateEnumStateCreateInfoNV.shadingRateType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineFragmentShadingRateEnumStateCreateInfoNV.shadingRate );\n      for ( size_t i = 0; i < 2; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, pipelineFragmentShadingRateEnumStateCreateInfoNV.combinerOps[i] );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineFragmentShadingRateStateCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineFragmentShadingRateStateCreateInfoKHR const & pipelineFragmentShadingRateStateCreateInfoKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineFragmentShadingRateStateCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineFragmentShadingRateStateCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineFragmentShadingRateStateCreateInfoKHR.fragmentSize );\n      for ( size_t i = 0; i < 2; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, pipelineFragmentShadingRateStateCreateInfoKHR.combinerOps[i] );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineIndirectDeviceAddressInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineIndirectDeviceAddressInfoNV const & pipelineIndirectDeviceAddressInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineIndirectDeviceAddressInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineIndirectDeviceAddressInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineIndirectDeviceAddressInfoNV.pipelineBindPoint );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineIndirectDeviceAddressInfoNV.pipeline );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineInfoKHR const & pipelineInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineInfoKHR.pipeline );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineLayoutCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineLayoutCreateInfo const & pipelineLayoutCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineLayoutCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineLayoutCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineLayoutCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineLayoutCreateInfo.setLayoutCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineLayoutCreateInfo.pSetLayouts );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineLayoutCreateInfo.pushConstantRangeCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineLayoutCreateInfo.pPushConstantRanges );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelinePropertiesIdentifierEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelinePropertiesIdentifierEXT const & pipelinePropertiesIdentifierEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelinePropertiesIdentifierEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelinePropertiesIdentifierEXT.pNext );\n      for ( size_t i = 0; i < VK_UUID_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, pipelinePropertiesIdentifierEXT.pipelineIdentifier[i] );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineRasterizationConservativeStateCreateInfoEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PipelineRasterizationConservativeStateCreateInfoEXT const & pipelineRasterizationConservativeStateCreateInfoEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationConservativeStateCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationConservativeStateCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationConservativeStateCreateInfoEXT.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationConservativeStateCreateInfoEXT.conservativeRasterizationMode );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationConservativeStateCreateInfoEXT.extraPrimitiveOverestimationSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineRasterizationDepthClipStateCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineRasterizationDepthClipStateCreateInfoEXT const & pipelineRasterizationDepthClipStateCreateInfoEXT )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationDepthClipStateCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationDepthClipStateCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationDepthClipStateCreateInfoEXT.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationDepthClipStateCreateInfoEXT.depthClipEnable );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineRasterizationLineStateCreateInfo>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PipelineRasterizationLineStateCreateInfo const & pipelineRasterizationLineStateCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationLineStateCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationLineStateCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationLineStateCreateInfo.lineRasterizationMode );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationLineStateCreateInfo.stippledLineEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationLineStateCreateInfo.lineStippleFactor );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationLineStateCreateInfo.lineStipplePattern );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineRasterizationProvokingVertexStateCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineRasterizationProvokingVertexStateCreateInfoEXT const &\n                              pipelineRasterizationProvokingVertexStateCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationProvokingVertexStateCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationProvokingVertexStateCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationProvokingVertexStateCreateInfoEXT.provokingVertexMode );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineRasterizationStateRasterizationOrderAMD>\n  {\n    std::size_t operator()(\n      VULKAN_HPP_NAMESPACE::PipelineRasterizationStateRasterizationOrderAMD const & pipelineRasterizationStateRasterizationOrderAMD ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationStateRasterizationOrderAMD.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationStateRasterizationOrderAMD.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationStateRasterizationOrderAMD.rasterizationOrder );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineRasterizationStateStreamCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineRasterizationStateStreamCreateInfoEXT const & pipelineRasterizationStateStreamCreateInfoEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationStateStreamCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationStateStreamCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationStateStreamCreateInfoEXT.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRasterizationStateStreamCreateInfoEXT.rasterizationStream );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineRenderingCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineRenderingCreateInfo const & pipelineRenderingCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRenderingCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRenderingCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRenderingCreateInfo.viewMask );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRenderingCreateInfo.colorAttachmentCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRenderingCreateInfo.pColorAttachmentFormats );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRenderingCreateInfo.depthAttachmentFormat );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRenderingCreateInfo.stencilAttachmentFormat );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineRepresentativeFragmentTestStateCreateInfoNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PipelineRepresentativeFragmentTestStateCreateInfoNV const & pipelineRepresentativeFragmentTestStateCreateInfoNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRepresentativeFragmentTestStateCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRepresentativeFragmentTestStateCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRepresentativeFragmentTestStateCreateInfoNV.representativeFragmentTestEnable );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineRobustnessCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineRobustnessCreateInfo const & pipelineRobustnessCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRobustnessCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRobustnessCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRobustnessCreateInfo.storageBuffers );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRobustnessCreateInfo.uniformBuffers );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRobustnessCreateInfo.vertexInputs );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineRobustnessCreateInfo.images );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineSampleLocationsStateCreateInfoEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PipelineSampleLocationsStateCreateInfoEXT const & pipelineSampleLocationsStateCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineSampleLocationsStateCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineSampleLocationsStateCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineSampleLocationsStateCreateInfoEXT.sampleLocationsEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineSampleLocationsStateCreateInfoEXT.sampleLocationsInfo );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineShaderStageModuleIdentifierCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineShaderStageModuleIdentifierCreateInfoEXT const & pipelineShaderStageModuleIdentifierCreateInfoEXT )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineShaderStageModuleIdentifierCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineShaderStageModuleIdentifierCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineShaderStageModuleIdentifierCreateInfoEXT.identifierSize );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineShaderStageModuleIdentifierCreateInfoEXT.pIdentifier );\n      return seed;\n    }\n  };\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineShaderStageNodeCreateInfoAMDX>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PipelineShaderStageNodeCreateInfoAMDX const & pipelineShaderStageNodeCreateInfoAMDX ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineShaderStageNodeCreateInfoAMDX.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineShaderStageNodeCreateInfoAMDX.pNext );\n      for ( const char * p = pipelineShaderStageNodeCreateInfoAMDX.pName; *p != '\\0'; ++p )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, *p );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineShaderStageNodeCreateInfoAMDX.index );\n      return seed;\n    }\n  };\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineShaderStageRequiredSubgroupSizeCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineShaderStageRequiredSubgroupSizeCreateInfo const & pipelineShaderStageRequiredSubgroupSizeCreateInfo )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineShaderStageRequiredSubgroupSizeCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineShaderStageRequiredSubgroupSizeCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineShaderStageRequiredSubgroupSizeCreateInfo.requiredSubgroupSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineTessellationDomainOriginStateCreateInfo>\n  {\n    std::size_t operator()(\n      VULKAN_HPP_NAMESPACE::PipelineTessellationDomainOriginStateCreateInfo const & pipelineTessellationDomainOriginStateCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineTessellationDomainOriginStateCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineTessellationDomainOriginStateCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineTessellationDomainOriginStateCreateInfo.domainOrigin );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VertexInputBindingDivisorDescription>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VertexInputBindingDivisorDescription const & vertexInputBindingDivisorDescription ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, vertexInputBindingDivisorDescription.binding );\n      VULKAN_HPP_HASH_COMBINE( seed, vertexInputBindingDivisorDescription.divisor );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineVertexInputDivisorStateCreateInfo>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PipelineVertexInputDivisorStateCreateInfo const & pipelineVertexInputDivisorStateCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineVertexInputDivisorStateCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineVertexInputDivisorStateCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineVertexInputDivisorStateCreateInfo.vertexBindingDivisorCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineVertexInputDivisorStateCreateInfo.pVertexBindingDivisors );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineViewportCoarseSampleOrderStateCreateInfoNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PipelineViewportCoarseSampleOrderStateCreateInfoNV const & pipelineViewportCoarseSampleOrderStateCreateInfoNV ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportCoarseSampleOrderStateCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportCoarseSampleOrderStateCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportCoarseSampleOrderStateCreateInfoNV.sampleOrderType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportCoarseSampleOrderStateCreateInfoNV.customSampleOrderCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportCoarseSampleOrderStateCreateInfoNV.pCustomSampleOrders );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineViewportDepthClampControlCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineViewportDepthClampControlCreateInfoEXT const & pipelineViewportDepthClampControlCreateInfoEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportDepthClampControlCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportDepthClampControlCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportDepthClampControlCreateInfoEXT.depthClampMode );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportDepthClampControlCreateInfoEXT.pDepthClampRange );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineViewportDepthClipControlCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineViewportDepthClipControlCreateInfoEXT const & pipelineViewportDepthClipControlCreateInfoEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportDepthClipControlCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportDepthClipControlCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportDepthClipControlCreateInfoEXT.negativeOneToOne );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineViewportExclusiveScissorStateCreateInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineViewportExclusiveScissorStateCreateInfoNV const & pipelineViewportExclusiveScissorStateCreateInfoNV )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportExclusiveScissorStateCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportExclusiveScissorStateCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportExclusiveScissorStateCreateInfoNV.exclusiveScissorCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportExclusiveScissorStateCreateInfoNV.pExclusiveScissors );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV const & shadingRatePaletteNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, shadingRatePaletteNV.shadingRatePaletteEntryCount );\n      VULKAN_HPP_HASH_COMBINE( seed, shadingRatePaletteNV.pShadingRatePaletteEntries );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineViewportShadingRateImageStateCreateInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineViewportShadingRateImageStateCreateInfoNV const & pipelineViewportShadingRateImageStateCreateInfoNV )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportShadingRateImageStateCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportShadingRateImageStateCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportShadingRateImageStateCreateInfoNV.shadingRateImageEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportShadingRateImageStateCreateInfoNV.viewportCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportShadingRateImageStateCreateInfoNV.pShadingRatePalettes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ViewportSwizzleNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ViewportSwizzleNV const & viewportSwizzleNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, viewportSwizzleNV.x );\n      VULKAN_HPP_HASH_COMBINE( seed, viewportSwizzleNV.y );\n      VULKAN_HPP_HASH_COMBINE( seed, viewportSwizzleNV.z );\n      VULKAN_HPP_HASH_COMBINE( seed, viewportSwizzleNV.w );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineViewportSwizzleStateCreateInfoNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PipelineViewportSwizzleStateCreateInfoNV const & pipelineViewportSwizzleStateCreateInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportSwizzleStateCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportSwizzleStateCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportSwizzleStateCreateInfoNV.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportSwizzleStateCreateInfoNV.viewportCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportSwizzleStateCreateInfoNV.pViewportSwizzles );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ViewportWScalingNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ViewportWScalingNV const & viewportWScalingNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, viewportWScalingNV.xcoeff );\n      VULKAN_HPP_HASH_COMBINE( seed, viewportWScalingNV.ycoeff );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PipelineViewportWScalingStateCreateInfoNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::PipelineViewportWScalingStateCreateInfoNV const & pipelineViewportWScalingStateCreateInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportWScalingStateCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportWScalingStateCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportWScalingStateCreateInfoNV.viewportWScalingEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportWScalingStateCreateInfoNV.viewportCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pipelineViewportWScalingStateCreateInfoNV.pViewportWScalings );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_GGP )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PresentFrameTokenGGP>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PresentFrameTokenGGP const & presentFrameTokenGGP ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, presentFrameTokenGGP.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, presentFrameTokenGGP.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, presentFrameTokenGGP.frameToken );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_GGP*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PresentIdKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PresentIdKHR const & presentIdKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, presentIdKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, presentIdKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, presentIdKHR.swapchainCount );\n      VULKAN_HPP_HASH_COMBINE( seed, presentIdKHR.pPresentIds );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PresentInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PresentInfoKHR const & presentInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, presentInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, presentInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, presentInfoKHR.waitSemaphoreCount );\n      VULKAN_HPP_HASH_COMBINE( seed, presentInfoKHR.pWaitSemaphores );\n      VULKAN_HPP_HASH_COMBINE( seed, presentInfoKHR.swapchainCount );\n      VULKAN_HPP_HASH_COMBINE( seed, presentInfoKHR.pSwapchains );\n      VULKAN_HPP_HASH_COMBINE( seed, presentInfoKHR.pImageIndices );\n      VULKAN_HPP_HASH_COMBINE( seed, presentInfoKHR.pResults );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RectLayerKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RectLayerKHR const & rectLayerKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, rectLayerKHR.offset );\n      VULKAN_HPP_HASH_COMBINE( seed, rectLayerKHR.extent );\n      VULKAN_HPP_HASH_COMBINE( seed, rectLayerKHR.layer );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PresentRegionKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PresentRegionKHR const & presentRegionKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, presentRegionKHR.rectangleCount );\n      VULKAN_HPP_HASH_COMBINE( seed, presentRegionKHR.pRectangles );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PresentRegionsKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PresentRegionsKHR const & presentRegionsKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, presentRegionsKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, presentRegionsKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, presentRegionsKHR.swapchainCount );\n      VULKAN_HPP_HASH_COMBINE( seed, presentRegionsKHR.pRegions );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PresentTimeGOOGLE>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PresentTimeGOOGLE const & presentTimeGOOGLE ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, presentTimeGOOGLE.presentID );\n      VULKAN_HPP_HASH_COMBINE( seed, presentTimeGOOGLE.desiredPresentTime );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PresentTimesInfoGOOGLE>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PresentTimesInfoGOOGLE const & presentTimesInfoGOOGLE ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, presentTimesInfoGOOGLE.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, presentTimesInfoGOOGLE.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, presentTimesInfoGOOGLE.swapchainCount );\n      VULKAN_HPP_HASH_COMBINE( seed, presentTimesInfoGOOGLE.pTimes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo const & privateDataSlotCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, privateDataSlotCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, privateDataSlotCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, privateDataSlotCreateInfo.flags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ProtectedSubmitInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ProtectedSubmitInfo const & protectedSubmitInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, protectedSubmitInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, protectedSubmitInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, protectedSubmitInfo.protectedSubmit );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PushConstantsInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PushConstantsInfo const & pushConstantsInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pushConstantsInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pushConstantsInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pushConstantsInfo.layout );\n      VULKAN_HPP_HASH_COMBINE( seed, pushConstantsInfo.stageFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, pushConstantsInfo.offset );\n      VULKAN_HPP_HASH_COMBINE( seed, pushConstantsInfo.size );\n      VULKAN_HPP_HASH_COMBINE( seed, pushConstantsInfo.pValues );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::WriteDescriptorSet>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::WriteDescriptorSet const & writeDescriptorSet ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSet.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSet.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSet.dstSet );\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSet.dstBinding );\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSet.dstArrayElement );\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSet.descriptorCount );\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSet.descriptorType );\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSet.pImageInfo );\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSet.pBufferInfo );\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSet.pTexelBufferView );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PushDescriptorSetInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PushDescriptorSetInfo const & pushDescriptorSetInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pushDescriptorSetInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pushDescriptorSetInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pushDescriptorSetInfo.stageFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, pushDescriptorSetInfo.layout );\n      VULKAN_HPP_HASH_COMBINE( seed, pushDescriptorSetInfo.set );\n      VULKAN_HPP_HASH_COMBINE( seed, pushDescriptorSetInfo.descriptorWriteCount );\n      VULKAN_HPP_HASH_COMBINE( seed, pushDescriptorSetInfo.pDescriptorWrites );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::PushDescriptorSetWithTemplateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::PushDescriptorSetWithTemplateInfo const & pushDescriptorSetWithTemplateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, pushDescriptorSetWithTemplateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, pushDescriptorSetWithTemplateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, pushDescriptorSetWithTemplateInfo.descriptorUpdateTemplate );\n      VULKAN_HPP_HASH_COMBINE( seed, pushDescriptorSetWithTemplateInfo.layout );\n      VULKAN_HPP_HASH_COMBINE( seed, pushDescriptorSetWithTemplateInfo.set );\n      VULKAN_HPP_HASH_COMBINE( seed, pushDescriptorSetWithTemplateInfo.pData );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::QueryLowLatencySupportNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::QueryLowLatencySupportNV const & queryLowLatencySupportNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, queryLowLatencySupportNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, queryLowLatencySupportNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, queryLowLatencySupportNV.pQueriedLowLatencyData );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::QueryPoolCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::QueryPoolCreateInfo const & queryPoolCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, queryPoolCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, queryPoolCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, queryPoolCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, queryPoolCreateInfo.queryType );\n      VULKAN_HPP_HASH_COMBINE( seed, queryPoolCreateInfo.queryCount );\n      VULKAN_HPP_HASH_COMBINE( seed, queryPoolCreateInfo.pipelineStatistics );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::QueryPoolPerformanceCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::QueryPoolPerformanceCreateInfoKHR const & queryPoolPerformanceCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, queryPoolPerformanceCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, queryPoolPerformanceCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, queryPoolPerformanceCreateInfoKHR.queueFamilyIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, queryPoolPerformanceCreateInfoKHR.counterIndexCount );\n      VULKAN_HPP_HASH_COMBINE( seed, queryPoolPerformanceCreateInfoKHR.pCounterIndices );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::QueryPoolPerformanceQueryCreateInfoINTEL>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::QueryPoolPerformanceQueryCreateInfoINTEL const & queryPoolPerformanceQueryCreateInfoINTEL ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, queryPoolPerformanceQueryCreateInfoINTEL.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, queryPoolPerformanceQueryCreateInfoINTEL.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, queryPoolPerformanceQueryCreateInfoINTEL.performanceCountersSampling );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::QueryPoolVideoEncodeFeedbackCreateInfoKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::QueryPoolVideoEncodeFeedbackCreateInfoKHR const & queryPoolVideoEncodeFeedbackCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, queryPoolVideoEncodeFeedbackCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, queryPoolVideoEncodeFeedbackCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, queryPoolVideoEncodeFeedbackCreateInfoKHR.encodeFeedbackFlags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::QueueFamilyCheckpointProperties2NV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::QueueFamilyCheckpointProperties2NV const & queueFamilyCheckpointProperties2NV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, queueFamilyCheckpointProperties2NV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, queueFamilyCheckpointProperties2NV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, queueFamilyCheckpointProperties2NV.checkpointExecutionStageMask );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::QueueFamilyCheckpointPropertiesNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::QueueFamilyCheckpointPropertiesNV const & queueFamilyCheckpointPropertiesNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, queueFamilyCheckpointPropertiesNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, queueFamilyCheckpointPropertiesNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, queueFamilyCheckpointPropertiesNV.checkpointExecutionStageMask );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::QueueFamilyGlobalPriorityProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::QueueFamilyGlobalPriorityProperties const & queueFamilyGlobalPriorityProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, queueFamilyGlobalPriorityProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, queueFamilyGlobalPriorityProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, queueFamilyGlobalPriorityProperties.priorityCount );\n      for ( size_t i = 0; i < VK_MAX_GLOBAL_PRIORITY_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, queueFamilyGlobalPriorityProperties.priorities[i] );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::QueueFamilyProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::QueueFamilyProperties const & queueFamilyProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, queueFamilyProperties.queueFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, queueFamilyProperties.queueCount );\n      VULKAN_HPP_HASH_COMBINE( seed, queueFamilyProperties.timestampValidBits );\n      VULKAN_HPP_HASH_COMBINE( seed, queueFamilyProperties.minImageTransferGranularity );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::QueueFamilyProperties2 const & queueFamilyProperties2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, queueFamilyProperties2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, queueFamilyProperties2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, queueFamilyProperties2.queueFamilyProperties );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::QueueFamilyQueryResultStatusPropertiesKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::QueueFamilyQueryResultStatusPropertiesKHR const & queueFamilyQueryResultStatusPropertiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, queueFamilyQueryResultStatusPropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, queueFamilyQueryResultStatusPropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, queueFamilyQueryResultStatusPropertiesKHR.queryResultStatusSupport );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::QueueFamilyVideoPropertiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::QueueFamilyVideoPropertiesKHR const & queueFamilyVideoPropertiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, queueFamilyVideoPropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, queueFamilyVideoPropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, queueFamilyVideoPropertiesKHR.videoCodecOperations );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RayTracingPipelineClusterAccelerationStructureCreateInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RayTracingPipelineClusterAccelerationStructureCreateInfoNV const &\n                              rayTracingPipelineClusterAccelerationStructureCreateInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineClusterAccelerationStructureCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineClusterAccelerationStructureCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineClusterAccelerationStructureCreateInfoNV.allowClusterAccelerationStructure );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoKHR const & rayTracingShaderGroupCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingShaderGroupCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingShaderGroupCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingShaderGroupCreateInfoKHR.type );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingShaderGroupCreateInfoKHR.generalShader );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingShaderGroupCreateInfoKHR.closestHitShader );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingShaderGroupCreateInfoKHR.anyHitShader );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingShaderGroupCreateInfoKHR.intersectionShader );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingShaderGroupCreateInfoKHR.pShaderGroupCaptureReplayHandle );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RayTracingPipelineInterfaceCreateInfoKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::RayTracingPipelineInterfaceCreateInfoKHR const & rayTracingPipelineInterfaceCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineInterfaceCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineInterfaceCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineInterfaceCreateInfoKHR.maxPipelineRayPayloadSize );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineInterfaceCreateInfoKHR.maxPipelineRayHitAttributeSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR const & rayTracingPipelineCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoKHR.stageCount );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoKHR.pStages );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoKHR.groupCount );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoKHR.pGroups );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoKHR.maxPipelineRayRecursionDepth );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoKHR.pLibraryInfo );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoKHR.pLibraryInterface );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoKHR.pDynamicState );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoKHR.layout );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoKHR.basePipelineHandle );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoKHR.basePipelineIndex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoNV const & rayTracingShaderGroupCreateInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingShaderGroupCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingShaderGroupCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingShaderGroupCreateInfoNV.type );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingShaderGroupCreateInfoNV.generalShader );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingShaderGroupCreateInfoNV.closestHitShader );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingShaderGroupCreateInfoNV.anyHitShader );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingShaderGroupCreateInfoNV.intersectionShader );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV const & rayTracingPipelineCreateInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoNV.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoNV.stageCount );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoNV.pStages );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoNV.groupCount );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoNV.pGroups );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoNV.maxRecursionDepth );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoNV.layout );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoNV.basePipelineHandle );\n      VULKAN_HPP_HASH_COMBINE( seed, rayTracingPipelineCreateInfoNV.basePipelineIndex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RefreshCycleDurationGOOGLE>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RefreshCycleDurationGOOGLE const & refreshCycleDurationGOOGLE ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, refreshCycleDurationGOOGLE.refreshDuration );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ReleaseCapturedPipelineDataInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ReleaseCapturedPipelineDataInfoKHR const & releaseCapturedPipelineDataInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, releaseCapturedPipelineDataInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, releaseCapturedPipelineDataInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, releaseCapturedPipelineDataInfoKHR.pipeline );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ReleaseSwapchainImagesInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ReleaseSwapchainImagesInfoEXT const & releaseSwapchainImagesInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, releaseSwapchainImagesInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, releaseSwapchainImagesInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, releaseSwapchainImagesInfoEXT.swapchain );\n      VULKAN_HPP_HASH_COMBINE( seed, releaseSwapchainImagesInfoEXT.imageIndexCount );\n      VULKAN_HPP_HASH_COMBINE( seed, releaseSwapchainImagesInfoEXT.pImageIndices );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderPassAttachmentBeginInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RenderPassAttachmentBeginInfo const & renderPassAttachmentBeginInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassAttachmentBeginInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassAttachmentBeginInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassAttachmentBeginInfo.attachmentCount );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassAttachmentBeginInfo.pAttachments );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderPassBeginInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RenderPassBeginInfo const & renderPassBeginInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassBeginInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassBeginInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassBeginInfo.renderPass );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassBeginInfo.framebuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassBeginInfo.renderArea );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassBeginInfo.clearValueCount );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassBeginInfo.pClearValues );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SubpassDescription>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SubpassDescription const & subpassDescription ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescription.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescription.pipelineBindPoint );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescription.inputAttachmentCount );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescription.pInputAttachments );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescription.colorAttachmentCount );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescription.pColorAttachments );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescription.pResolveAttachments );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescription.pDepthStencilAttachment );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescription.preserveAttachmentCount );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescription.pPreserveAttachments );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SubpassDependency>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SubpassDependency const & subpassDependency ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDependency.srcSubpass );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDependency.dstSubpass );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDependency.srcStageMask );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDependency.dstStageMask );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDependency.srcAccessMask );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDependency.dstAccessMask );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDependency.dependencyFlags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderPassCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RenderPassCreateInfo const & renderPassCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreateInfo.attachmentCount );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreateInfo.pAttachments );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreateInfo.subpassCount );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreateInfo.pSubpasses );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreateInfo.dependencyCount );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreateInfo.pDependencies );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SubpassDescription2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SubpassDescription2 const & subpassDescription2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescription2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescription2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescription2.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescription2.pipelineBindPoint );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescription2.viewMask );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescription2.inputAttachmentCount );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescription2.pInputAttachments );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescription2.colorAttachmentCount );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescription2.pColorAttachments );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescription2.pResolveAttachments );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescription2.pDepthStencilAttachment );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescription2.preserveAttachmentCount );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescription2.pPreserveAttachments );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SubpassDependency2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SubpassDependency2 const & subpassDependency2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDependency2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDependency2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDependency2.srcSubpass );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDependency2.dstSubpass );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDependency2.srcStageMask );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDependency2.dstStageMask );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDependency2.srcAccessMask );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDependency2.dstAccessMask );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDependency2.dependencyFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDependency2.viewOffset );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 const & renderPassCreateInfo2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreateInfo2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreateInfo2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreateInfo2.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreateInfo2.attachmentCount );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreateInfo2.pAttachments );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreateInfo2.subpassCount );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreateInfo2.pSubpasses );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreateInfo2.dependencyCount );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreateInfo2.pDependencies );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreateInfo2.correlatedViewMaskCount );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreateInfo2.pCorrelatedViewMasks );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderPassCreationControlEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RenderPassCreationControlEXT const & renderPassCreationControlEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreationControlEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreationControlEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreationControlEXT.disallowMerging );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderPassCreationFeedbackInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RenderPassCreationFeedbackInfoEXT const & renderPassCreationFeedbackInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreationFeedbackInfoEXT.postMergeSubpassCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderPassCreationFeedbackCreateInfoEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::RenderPassCreationFeedbackCreateInfoEXT const & renderPassCreationFeedbackCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreationFeedbackCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreationFeedbackCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassCreationFeedbackCreateInfoEXT.pRenderPassFeedback );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderPassFragmentDensityMapCreateInfoEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::RenderPassFragmentDensityMapCreateInfoEXT const & renderPassFragmentDensityMapCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassFragmentDensityMapCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassFragmentDensityMapCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassFragmentDensityMapCreateInfoEXT.fragmentDensityMapAttachment );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderPassInputAttachmentAspectCreateInfo>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::RenderPassInputAttachmentAspectCreateInfo const & renderPassInputAttachmentAspectCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassInputAttachmentAspectCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassInputAttachmentAspectCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassInputAttachmentAspectCreateInfo.aspectReferenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassInputAttachmentAspectCreateInfo.pAspectReferences );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderPassMultiviewCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RenderPassMultiviewCreateInfo const & renderPassMultiviewCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassMultiviewCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassMultiviewCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassMultiviewCreateInfo.subpassCount );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassMultiviewCreateInfo.pViewMasks );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassMultiviewCreateInfo.dependencyCount );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassMultiviewCreateInfo.pViewOffsets );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassMultiviewCreateInfo.correlationMaskCount );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassMultiviewCreateInfo.pCorrelationMasks );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SubpassSampleLocationsEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SubpassSampleLocationsEXT const & subpassSampleLocationsEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, subpassSampleLocationsEXT.subpassIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassSampleLocationsEXT.sampleLocationsInfo );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderPassSampleLocationsBeginInfoEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::RenderPassSampleLocationsBeginInfoEXT const & renderPassSampleLocationsBeginInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassSampleLocationsBeginInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassSampleLocationsBeginInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassSampleLocationsBeginInfoEXT.attachmentInitialSampleLocationsCount );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassSampleLocationsBeginInfoEXT.pAttachmentInitialSampleLocations );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassSampleLocationsBeginInfoEXT.postSubpassSampleLocationsCount );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassSampleLocationsBeginInfoEXT.pPostSubpassSampleLocations );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderPassStripeInfoARM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RenderPassStripeInfoARM const & renderPassStripeInfoARM ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassStripeInfoARM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassStripeInfoARM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassStripeInfoARM.stripeArea );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderPassStripeBeginInfoARM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RenderPassStripeBeginInfoARM const & renderPassStripeBeginInfoARM ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassStripeBeginInfoARM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassStripeBeginInfoARM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassStripeBeginInfoARM.stripeInfoCount );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassStripeBeginInfoARM.pStripeInfos );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo const & semaphoreSubmitInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreSubmitInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreSubmitInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreSubmitInfo.semaphore );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreSubmitInfo.value );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreSubmitInfo.stageMask );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreSubmitInfo.deviceIndex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderPassStripeSubmitInfoARM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RenderPassStripeSubmitInfoARM const & renderPassStripeSubmitInfoARM ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassStripeSubmitInfoARM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassStripeSubmitInfoARM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassStripeSubmitInfoARM.stripeSemaphoreInfoCount );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassStripeSubmitInfoARM.pStripeSemaphoreInfos );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderPassSubpassFeedbackInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RenderPassSubpassFeedbackInfoEXT const & renderPassSubpassFeedbackInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassSubpassFeedbackInfoEXT.subpassMergeStatus );\n      for ( size_t i = 0; i < VK_MAX_DESCRIPTION_SIZE; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, renderPassSubpassFeedbackInfoEXT.description[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassSubpassFeedbackInfoEXT.postMergeIndex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderPassSubpassFeedbackCreateInfoEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::RenderPassSubpassFeedbackCreateInfoEXT const & renderPassSubpassFeedbackCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassSubpassFeedbackCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassSubpassFeedbackCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassSubpassFeedbackCreateInfoEXT.pSubpassFeedback );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderPassTransformBeginInfoQCOM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RenderPassTransformBeginInfoQCOM const & renderPassTransformBeginInfoQCOM ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassTransformBeginInfoQCOM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassTransformBeginInfoQCOM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, renderPassTransformBeginInfoQCOM.transform );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderingAreaInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RenderingAreaInfo const & renderingAreaInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, renderingAreaInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingAreaInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingAreaInfo.viewMask );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingAreaInfo.colorAttachmentCount );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingAreaInfo.pColorAttachmentFormats );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingAreaInfo.depthAttachmentFormat );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingAreaInfo.stencilAttachmentFormat );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderingAttachmentLocationInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RenderingAttachmentLocationInfo const & renderingAttachmentLocationInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, renderingAttachmentLocationInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingAttachmentLocationInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingAttachmentLocationInfo.colorAttachmentCount );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingAttachmentLocationInfo.pColorAttachmentLocations );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderingFragmentDensityMapAttachmentInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RenderingFragmentDensityMapAttachmentInfoEXT const & renderingFragmentDensityMapAttachmentInfoEXT ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, renderingFragmentDensityMapAttachmentInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingFragmentDensityMapAttachmentInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingFragmentDensityMapAttachmentInfoEXT.imageView );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingFragmentDensityMapAttachmentInfoEXT.imageLayout );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderingFragmentShadingRateAttachmentInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RenderingFragmentShadingRateAttachmentInfoKHR const & renderingFragmentShadingRateAttachmentInfoKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, renderingFragmentShadingRateAttachmentInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingFragmentShadingRateAttachmentInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingFragmentShadingRateAttachmentInfoKHR.imageView );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingFragmentShadingRateAttachmentInfoKHR.imageLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingFragmentShadingRateAttachmentInfoKHR.shadingRateAttachmentTexelSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderingInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RenderingInfo const & renderingInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, renderingInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingInfo.renderArea );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingInfo.layerCount );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingInfo.viewMask );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingInfo.colorAttachmentCount );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingInfo.pColorAttachments );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingInfo.pDepthAttachment );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingInfo.pStencilAttachment );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::RenderingInputAttachmentIndexInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::RenderingInputAttachmentIndexInfo const & renderingInputAttachmentIndexInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, renderingInputAttachmentIndexInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingInputAttachmentIndexInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingInputAttachmentIndexInfo.colorAttachmentCount );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingInputAttachmentIndexInfo.pColorAttachmentInputIndices );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingInputAttachmentIndexInfo.pDepthInputAttachmentIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, renderingInputAttachmentIndexInfo.pStencilInputAttachmentIndex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ResolveImageInfo2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ResolveImageInfo2 const & resolveImageInfo2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, resolveImageInfo2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, resolveImageInfo2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, resolveImageInfo2.srcImage );\n      VULKAN_HPP_HASH_COMBINE( seed, resolveImageInfo2.srcImageLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, resolveImageInfo2.dstImage );\n      VULKAN_HPP_HASH_COMBINE( seed, resolveImageInfo2.dstImageLayout );\n      VULKAN_HPP_HASH_COMBINE( seed, resolveImageInfo2.regionCount );\n      VULKAN_HPP_HASH_COMBINE( seed, resolveImageInfo2.pRegions );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SamplerBlockMatchWindowCreateInfoQCOM>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::SamplerBlockMatchWindowCreateInfoQCOM const & samplerBlockMatchWindowCreateInfoQCOM ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, samplerBlockMatchWindowCreateInfoQCOM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerBlockMatchWindowCreateInfoQCOM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerBlockMatchWindowCreateInfoQCOM.windowExtent );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerBlockMatchWindowCreateInfoQCOM.windowCompareMode );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SamplerBorderColorComponentMappingCreateInfoEXT>\n  {\n    std::size_t operator()(\n      VULKAN_HPP_NAMESPACE::SamplerBorderColorComponentMappingCreateInfoEXT const & samplerBorderColorComponentMappingCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, samplerBorderColorComponentMappingCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerBorderColorComponentMappingCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerBorderColorComponentMappingCreateInfoEXT.components );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerBorderColorComponentMappingCreateInfoEXT.srgb );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SamplerCaptureDescriptorDataInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SamplerCaptureDescriptorDataInfoEXT const & samplerCaptureDescriptorDataInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCaptureDescriptorDataInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCaptureDescriptorDataInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCaptureDescriptorDataInfoEXT.sampler );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SamplerCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SamplerCreateInfo const & samplerCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCreateInfo.magFilter );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCreateInfo.minFilter );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCreateInfo.mipmapMode );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCreateInfo.addressModeU );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCreateInfo.addressModeV );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCreateInfo.addressModeW );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCreateInfo.mipLodBias );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCreateInfo.anisotropyEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCreateInfo.maxAnisotropy );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCreateInfo.compareEnable );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCreateInfo.compareOp );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCreateInfo.minLod );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCreateInfo.maxLod );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCreateInfo.borderColor );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCreateInfo.unnormalizedCoordinates );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SamplerCubicWeightsCreateInfoQCOM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SamplerCubicWeightsCreateInfoQCOM const & samplerCubicWeightsCreateInfoQCOM ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCubicWeightsCreateInfoQCOM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCubicWeightsCreateInfoQCOM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerCubicWeightsCreateInfoQCOM.cubicWeights );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SamplerReductionModeCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SamplerReductionModeCreateInfo const & samplerReductionModeCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, samplerReductionModeCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerReductionModeCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerReductionModeCreateInfo.reductionMode );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo const & samplerYcbcrConversionCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, samplerYcbcrConversionCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerYcbcrConversionCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerYcbcrConversionCreateInfo.format );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerYcbcrConversionCreateInfo.ycbcrModel );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerYcbcrConversionCreateInfo.ycbcrRange );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerYcbcrConversionCreateInfo.components );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerYcbcrConversionCreateInfo.xChromaOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerYcbcrConversionCreateInfo.yChromaOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerYcbcrConversionCreateInfo.chromaFilter );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerYcbcrConversionCreateInfo.forceExplicitReconstruction );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionImageFormatProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionImageFormatProperties const & samplerYcbcrConversionImageFormatProperties ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, samplerYcbcrConversionImageFormatProperties.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerYcbcrConversionImageFormatProperties.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerYcbcrConversionImageFormatProperties.combinedImageSamplerDescriptorCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionInfo const & samplerYcbcrConversionInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, samplerYcbcrConversionInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerYcbcrConversionInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerYcbcrConversionInfo.conversion );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM const & samplerYcbcrConversionYcbcrDegammaCreateInfoQCOM )\n      const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, samplerYcbcrConversionYcbcrDegammaCreateInfoQCOM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerYcbcrConversionYcbcrDegammaCreateInfoQCOM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerYcbcrConversionYcbcrDegammaCreateInfoQCOM.enableYDegamma );\n      VULKAN_HPP_HASH_COMBINE( seed, samplerYcbcrConversionYcbcrDegammaCreateInfoQCOM.enableCbCrDegamma );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_SCREEN_QNX )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ScreenBufferFormatPropertiesQNX>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ScreenBufferFormatPropertiesQNX const & screenBufferFormatPropertiesQNX ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, screenBufferFormatPropertiesQNX.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, screenBufferFormatPropertiesQNX.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, screenBufferFormatPropertiesQNX.format );\n      VULKAN_HPP_HASH_COMBINE( seed, screenBufferFormatPropertiesQNX.externalFormat );\n      VULKAN_HPP_HASH_COMBINE( seed, screenBufferFormatPropertiesQNX.screenUsage );\n      VULKAN_HPP_HASH_COMBINE( seed, screenBufferFormatPropertiesQNX.formatFeatures );\n      VULKAN_HPP_HASH_COMBINE( seed, screenBufferFormatPropertiesQNX.samplerYcbcrConversionComponents );\n      VULKAN_HPP_HASH_COMBINE( seed, screenBufferFormatPropertiesQNX.suggestedYcbcrModel );\n      VULKAN_HPP_HASH_COMBINE( seed, screenBufferFormatPropertiesQNX.suggestedYcbcrRange );\n      VULKAN_HPP_HASH_COMBINE( seed, screenBufferFormatPropertiesQNX.suggestedXChromaOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, screenBufferFormatPropertiesQNX.suggestedYChromaOffset );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n#  if defined( VK_USE_PLATFORM_SCREEN_QNX )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ScreenBufferPropertiesQNX>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ScreenBufferPropertiesQNX const & screenBufferPropertiesQNX ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, screenBufferPropertiesQNX.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, screenBufferPropertiesQNX.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, screenBufferPropertiesQNX.allocationSize );\n      VULKAN_HPP_HASH_COMBINE( seed, screenBufferPropertiesQNX.memoryTypeBits );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n#  if defined( VK_USE_PLATFORM_SCREEN_QNX )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateInfoQNX>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateInfoQNX const & screenSurfaceCreateInfoQNX ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, screenSurfaceCreateInfoQNX.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, screenSurfaceCreateInfoQNX.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, screenSurfaceCreateInfoQNX.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, screenSurfaceCreateInfoQNX.context );\n      VULKAN_HPP_HASH_COMBINE( seed, screenSurfaceCreateInfoQNX.window );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SemaphoreCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SemaphoreCreateInfo const & semaphoreCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreCreateInfo.flags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SemaphoreGetFdInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SemaphoreGetFdInfoKHR const & semaphoreGetFdInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreGetFdInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreGetFdInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreGetFdInfoKHR.semaphore );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreGetFdInfoKHR.handleType );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SemaphoreGetWin32HandleInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SemaphoreGetWin32HandleInfoKHR const & semaphoreGetWin32HandleInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreGetWin32HandleInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreGetWin32HandleInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreGetWin32HandleInfoKHR.semaphore );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreGetWin32HandleInfoKHR.handleType );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SemaphoreGetZirconHandleInfoFUCHSIA>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SemaphoreGetZirconHandleInfoFUCHSIA const & semaphoreGetZirconHandleInfoFUCHSIA ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreGetZirconHandleInfoFUCHSIA.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreGetZirconHandleInfoFUCHSIA.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreGetZirconHandleInfoFUCHSIA.semaphore );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreGetZirconHandleInfoFUCHSIA.handleType );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo const & semaphoreSignalInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreSignalInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreSignalInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreSignalInfo.semaphore );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreSignalInfo.value );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SemaphoreTypeCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SemaphoreTypeCreateInfo const & semaphoreTypeCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreTypeCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreTypeCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreTypeCreateInfo.semaphoreType );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreTypeCreateInfo.initialValue );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo const & semaphoreWaitInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreWaitInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreWaitInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreWaitInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreWaitInfo.semaphoreCount );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreWaitInfo.pSemaphores );\n      VULKAN_HPP_HASH_COMBINE( seed, semaphoreWaitInfo.pValues );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SetDescriptorBufferOffsetsInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SetDescriptorBufferOffsetsInfoEXT const & setDescriptorBufferOffsetsInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, setDescriptorBufferOffsetsInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, setDescriptorBufferOffsetsInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, setDescriptorBufferOffsetsInfoEXT.stageFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, setDescriptorBufferOffsetsInfoEXT.layout );\n      VULKAN_HPP_HASH_COMBINE( seed, setDescriptorBufferOffsetsInfoEXT.firstSet );\n      VULKAN_HPP_HASH_COMBINE( seed, setDescriptorBufferOffsetsInfoEXT.setCount );\n      VULKAN_HPP_HASH_COMBINE( seed, setDescriptorBufferOffsetsInfoEXT.pBufferIndices );\n      VULKAN_HPP_HASH_COMBINE( seed, setDescriptorBufferOffsetsInfoEXT.pOffsets );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SetLatencyMarkerInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SetLatencyMarkerInfoNV const & setLatencyMarkerInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, setLatencyMarkerInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, setLatencyMarkerInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, setLatencyMarkerInfoNV.presentID );\n      VULKAN_HPP_HASH_COMBINE( seed, setLatencyMarkerInfoNV.marker );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SetStateFlagsIndirectCommandNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SetStateFlagsIndirectCommandNV const & setStateFlagsIndirectCommandNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, setStateFlagsIndirectCommandNV.data );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT const & shaderCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, shaderCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderCreateInfoEXT.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderCreateInfoEXT.stage );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderCreateInfoEXT.nextStage );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderCreateInfoEXT.codeType );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderCreateInfoEXT.codeSize );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderCreateInfoEXT.pCode );\n      for ( const char * p = shaderCreateInfoEXT.pName; *p != '\\0'; ++p )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, *p );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, shaderCreateInfoEXT.setLayoutCount );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderCreateInfoEXT.pSetLayouts );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderCreateInfoEXT.pushConstantRangeCount );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderCreateInfoEXT.pPushConstantRanges );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderCreateInfoEXT.pSpecializationInfo );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo const & shaderModuleCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, shaderModuleCreateInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderModuleCreateInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderModuleCreateInfo.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderModuleCreateInfo.codeSize );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderModuleCreateInfo.pCode );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ShaderModuleIdentifierEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ShaderModuleIdentifierEXT const & shaderModuleIdentifierEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, shaderModuleIdentifierEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderModuleIdentifierEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderModuleIdentifierEXT.identifierSize );\n      for ( size_t i = 0; i < VK_MAX_SHADER_MODULE_IDENTIFIER_SIZE_EXT; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, shaderModuleIdentifierEXT.identifier[i] );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ShaderModuleValidationCacheCreateInfoEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::ShaderModuleValidationCacheCreateInfoEXT const & shaderModuleValidationCacheCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, shaderModuleValidationCacheCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderModuleValidationCacheCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderModuleValidationCacheCreateInfoEXT.validationCache );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ShaderResourceUsageAMD>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ShaderResourceUsageAMD const & shaderResourceUsageAMD ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, shaderResourceUsageAMD.numUsedVgprs );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderResourceUsageAMD.numUsedSgprs );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderResourceUsageAMD.ldsSizePerLocalWorkGroup );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderResourceUsageAMD.ldsUsageSizeInBytes );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderResourceUsageAMD.scratchMemUsageInBytes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ShaderStatisticsInfoAMD>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ShaderStatisticsInfoAMD const & shaderStatisticsInfoAMD ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, shaderStatisticsInfoAMD.shaderStageMask );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderStatisticsInfoAMD.resourceUsage );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderStatisticsInfoAMD.numPhysicalVgprs );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderStatisticsInfoAMD.numPhysicalSgprs );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderStatisticsInfoAMD.numAvailableVgprs );\n      VULKAN_HPP_HASH_COMBINE( seed, shaderStatisticsInfoAMD.numAvailableSgprs );\n      for ( size_t i = 0; i < 3; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, shaderStatisticsInfoAMD.computeWorkGroupSize[i] );\n      }\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SharedPresentSurfaceCapabilitiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SharedPresentSurfaceCapabilitiesKHR const & sharedPresentSurfaceCapabilitiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, sharedPresentSurfaceCapabilitiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, sharedPresentSurfaceCapabilitiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, sharedPresentSurfaceCapabilitiesKHR.sharedPresentSupportedUsageFlags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SparseImageFormatProperties const & sparseImageFormatProperties ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageFormatProperties.aspectMask );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageFormatProperties.imageGranularity );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageFormatProperties.flags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2 const & sparseImageFormatProperties2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageFormatProperties2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageFormatProperties2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageFormatProperties2.properties );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements const & sparseImageMemoryRequirements ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageMemoryRequirements.formatProperties );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageMemoryRequirements.imageMipTailFirstLod );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageMemoryRequirements.imageMipTailSize );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageMemoryRequirements.imageMipTailOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageMemoryRequirements.imageMipTailStride );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2 const & sparseImageMemoryRequirements2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageMemoryRequirements2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageMemoryRequirements2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, sparseImageMemoryRequirements2.memoryRequirements );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_GGP )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateInfoGGP>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateInfoGGP const & streamDescriptorSurfaceCreateInfoGGP ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, streamDescriptorSurfaceCreateInfoGGP.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, streamDescriptorSurfaceCreateInfoGGP.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, streamDescriptorSurfaceCreateInfoGGP.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, streamDescriptorSurfaceCreateInfoGGP.streamDescriptor );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_GGP*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SubmitInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SubmitInfo const & submitInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, submitInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, submitInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, submitInfo.waitSemaphoreCount );\n      VULKAN_HPP_HASH_COMBINE( seed, submitInfo.pWaitSemaphores );\n      VULKAN_HPP_HASH_COMBINE( seed, submitInfo.pWaitDstStageMask );\n      VULKAN_HPP_HASH_COMBINE( seed, submitInfo.commandBufferCount );\n      VULKAN_HPP_HASH_COMBINE( seed, submitInfo.pCommandBuffers );\n      VULKAN_HPP_HASH_COMBINE( seed, submitInfo.signalSemaphoreCount );\n      VULKAN_HPP_HASH_COMBINE( seed, submitInfo.pSignalSemaphores );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SubmitInfo2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SubmitInfo2 const & submitInfo2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, submitInfo2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, submitInfo2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, submitInfo2.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, submitInfo2.waitSemaphoreInfoCount );\n      VULKAN_HPP_HASH_COMBINE( seed, submitInfo2.pWaitSemaphoreInfos );\n      VULKAN_HPP_HASH_COMBINE( seed, submitInfo2.commandBufferInfoCount );\n      VULKAN_HPP_HASH_COMBINE( seed, submitInfo2.pCommandBufferInfos );\n      VULKAN_HPP_HASH_COMBINE( seed, submitInfo2.signalSemaphoreInfoCount );\n      VULKAN_HPP_HASH_COMBINE( seed, submitInfo2.pSignalSemaphoreInfos );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SubpassBeginInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SubpassBeginInfo const & subpassBeginInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, subpassBeginInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassBeginInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassBeginInfo.contents );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SubpassDescriptionDepthStencilResolve>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::SubpassDescriptionDepthStencilResolve const & subpassDescriptionDepthStencilResolve ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescriptionDepthStencilResolve.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescriptionDepthStencilResolve.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescriptionDepthStencilResolve.depthResolveMode );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescriptionDepthStencilResolve.stencilResolveMode );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassDescriptionDepthStencilResolve.pDepthStencilResolveAttachment );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SubpassEndInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SubpassEndInfo const & subpassEndInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, subpassEndInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassEndInfo.pNext );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SubpassFragmentDensityMapOffsetEndInfoQCOM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SubpassFragmentDensityMapOffsetEndInfoQCOM const & subpassFragmentDensityMapOffsetEndInfoQCOM ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, subpassFragmentDensityMapOffsetEndInfoQCOM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassFragmentDensityMapOffsetEndInfoQCOM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassFragmentDensityMapOffsetEndInfoQCOM.fragmentDensityOffsetCount );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassFragmentDensityMapOffsetEndInfoQCOM.pFragmentDensityOffsets );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SubpassResolvePerformanceQueryEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SubpassResolvePerformanceQueryEXT const & subpassResolvePerformanceQueryEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, subpassResolvePerformanceQueryEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassResolvePerformanceQueryEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassResolvePerformanceQueryEXT.optimal );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SubpassShadingPipelineCreateInfoHUAWEI>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::SubpassShadingPipelineCreateInfoHUAWEI const & subpassShadingPipelineCreateInfoHUAWEI ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, subpassShadingPipelineCreateInfoHUAWEI.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassShadingPipelineCreateInfoHUAWEI.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassShadingPipelineCreateInfoHUAWEI.renderPass );\n      VULKAN_HPP_HASH_COMBINE( seed, subpassShadingPipelineCreateInfoHUAWEI.subpass );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SubresourceHostMemcpySize>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SubresourceHostMemcpySize const & subresourceHostMemcpySize ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, subresourceHostMemcpySize.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, subresourceHostMemcpySize.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, subresourceHostMemcpySize.size );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SubresourceLayout2>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SubresourceLayout2 const & subresourceLayout2 ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, subresourceLayout2.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, subresourceLayout2.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, subresourceLayout2.subresourceLayout );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SurfaceCapabilities2EXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SurfaceCapabilities2EXT const & surfaceCapabilities2EXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilities2EXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilities2EXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilities2EXT.minImageCount );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilities2EXT.maxImageCount );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilities2EXT.currentExtent );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilities2EXT.minImageExtent );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilities2EXT.maxImageExtent );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilities2EXT.maxImageArrayLayers );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilities2EXT.supportedTransforms );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilities2EXT.currentTransform );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilities2EXT.supportedCompositeAlpha );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilities2EXT.supportedUsageFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilities2EXT.supportedSurfaceCounters );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR const & surfaceCapabilitiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilitiesKHR.minImageCount );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilitiesKHR.maxImageCount );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilitiesKHR.currentExtent );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilitiesKHR.minImageExtent );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilitiesKHR.maxImageExtent );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilitiesKHR.maxImageArrayLayers );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilitiesKHR.supportedTransforms );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilitiesKHR.currentTransform );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilitiesKHR.supportedCompositeAlpha );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilitiesKHR.supportedUsageFlags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR const & surfaceCapabilities2KHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilities2KHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilities2KHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilities2KHR.surfaceCapabilities );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesFullScreenExclusiveEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesFullScreenExclusiveEXT const & surfaceCapabilitiesFullScreenExclusiveEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilitiesFullScreenExclusiveEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilitiesFullScreenExclusiveEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilitiesFullScreenExclusiveEXT.fullScreenExclusiveSupported );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesPresentBarrierNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesPresentBarrierNV const & surfaceCapabilitiesPresentBarrierNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilitiesPresentBarrierNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilitiesPresentBarrierNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceCapabilitiesPresentBarrierNV.presentBarrierSupported );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SurfaceFormatKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SurfaceFormatKHR const & surfaceFormatKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceFormatKHR.format );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceFormatKHR.colorSpace );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR const & surfaceFormat2KHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceFormat2KHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceFormat2KHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceFormat2KHR.surfaceFormat );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SurfaceFullScreenExclusiveInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SurfaceFullScreenExclusiveInfoEXT const & surfaceFullScreenExclusiveInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceFullScreenExclusiveInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceFullScreenExclusiveInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceFullScreenExclusiveInfoEXT.fullScreenExclusive );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SurfaceFullScreenExclusiveWin32InfoEXT>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::SurfaceFullScreenExclusiveWin32InfoEXT const & surfaceFullScreenExclusiveWin32InfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceFullScreenExclusiveWin32InfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceFullScreenExclusiveWin32InfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceFullScreenExclusiveWin32InfoEXT.hmonitor );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SurfacePresentModeCompatibilityEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SurfacePresentModeCompatibilityEXT const & surfacePresentModeCompatibilityEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, surfacePresentModeCompatibilityEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, surfacePresentModeCompatibilityEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, surfacePresentModeCompatibilityEXT.presentModeCount );\n      VULKAN_HPP_HASH_COMBINE( seed, surfacePresentModeCompatibilityEXT.pPresentModes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SurfacePresentModeEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SurfacePresentModeEXT const & surfacePresentModeEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, surfacePresentModeEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, surfacePresentModeEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, surfacePresentModeEXT.presentMode );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SurfacePresentScalingCapabilitiesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SurfacePresentScalingCapabilitiesEXT const & surfacePresentScalingCapabilitiesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, surfacePresentScalingCapabilitiesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, surfacePresentScalingCapabilitiesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, surfacePresentScalingCapabilitiesEXT.supportedPresentScaling );\n      VULKAN_HPP_HASH_COMBINE( seed, surfacePresentScalingCapabilitiesEXT.supportedPresentGravityX );\n      VULKAN_HPP_HASH_COMBINE( seed, surfacePresentScalingCapabilitiesEXT.supportedPresentGravityY );\n      VULKAN_HPP_HASH_COMBINE( seed, surfacePresentScalingCapabilitiesEXT.minScaledImageExtent );\n      VULKAN_HPP_HASH_COMBINE( seed, surfacePresentScalingCapabilitiesEXT.maxScaledImageExtent );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SurfaceProtectedCapabilitiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SurfaceProtectedCapabilitiesKHR const & surfaceProtectedCapabilitiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceProtectedCapabilitiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceProtectedCapabilitiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, surfaceProtectedCapabilitiesKHR.supportsProtected );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SwapchainCounterCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SwapchainCounterCreateInfoEXT const & swapchainCounterCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainCounterCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainCounterCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainCounterCreateInfoEXT.surfaceCounters );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR const & swapchainCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainCreateInfoKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainCreateInfoKHR.surface );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainCreateInfoKHR.minImageCount );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainCreateInfoKHR.imageFormat );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainCreateInfoKHR.imageColorSpace );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainCreateInfoKHR.imageExtent );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainCreateInfoKHR.imageArrayLayers );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainCreateInfoKHR.imageUsage );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainCreateInfoKHR.imageSharingMode );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainCreateInfoKHR.queueFamilyIndexCount );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainCreateInfoKHR.pQueueFamilyIndices );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainCreateInfoKHR.preTransform );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainCreateInfoKHR.compositeAlpha );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainCreateInfoKHR.presentMode );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainCreateInfoKHR.clipped );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainCreateInfoKHR.oldSwapchain );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SwapchainDisplayNativeHdrCreateInfoAMD>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::SwapchainDisplayNativeHdrCreateInfoAMD const & swapchainDisplayNativeHdrCreateInfoAMD ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainDisplayNativeHdrCreateInfoAMD.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainDisplayNativeHdrCreateInfoAMD.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainDisplayNativeHdrCreateInfoAMD.localDimmingEnable );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SwapchainLatencyCreateInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SwapchainLatencyCreateInfoNV const & swapchainLatencyCreateInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainLatencyCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainLatencyCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainLatencyCreateInfoNV.latencyModeEnable );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SwapchainPresentBarrierCreateInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SwapchainPresentBarrierCreateInfoNV const & swapchainPresentBarrierCreateInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainPresentBarrierCreateInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainPresentBarrierCreateInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainPresentBarrierCreateInfoNV.presentBarrierEnable );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SwapchainPresentFenceInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SwapchainPresentFenceInfoEXT const & swapchainPresentFenceInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainPresentFenceInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainPresentFenceInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainPresentFenceInfoEXT.swapchainCount );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainPresentFenceInfoEXT.pFences );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SwapchainPresentModeInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SwapchainPresentModeInfoEXT const & swapchainPresentModeInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainPresentModeInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainPresentModeInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainPresentModeInfoEXT.swapchainCount );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainPresentModeInfoEXT.pPresentModes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SwapchainPresentModesCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SwapchainPresentModesCreateInfoEXT const & swapchainPresentModesCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainPresentModesCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainPresentModesCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainPresentModesCreateInfoEXT.presentModeCount );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainPresentModesCreateInfoEXT.pPresentModes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::SwapchainPresentScalingCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::SwapchainPresentScalingCreateInfoEXT const & swapchainPresentScalingCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainPresentScalingCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainPresentScalingCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainPresentScalingCreateInfoEXT.scalingBehavior );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainPresentScalingCreateInfoEXT.presentGravityX );\n      VULKAN_HPP_HASH_COMBINE( seed, swapchainPresentScalingCreateInfoEXT.presentGravityY );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::TextureLODGatherFormatPropertiesAMD>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::TextureLODGatherFormatPropertiesAMD const & textureLODGatherFormatPropertiesAMD ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, textureLODGatherFormatPropertiesAMD.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, textureLODGatherFormatPropertiesAMD.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, textureLODGatherFormatPropertiesAMD.supportsTextureGatherLODBiasAMD );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::TilePropertiesQCOM>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::TilePropertiesQCOM const & tilePropertiesQCOM ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, tilePropertiesQCOM.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, tilePropertiesQCOM.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, tilePropertiesQCOM.tileSize );\n      VULKAN_HPP_HASH_COMBINE( seed, tilePropertiesQCOM.apronSize );\n      VULKAN_HPP_HASH_COMBINE( seed, tilePropertiesQCOM.origin );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::TimelineSemaphoreSubmitInfo>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::TimelineSemaphoreSubmitInfo const & timelineSemaphoreSubmitInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, timelineSemaphoreSubmitInfo.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, timelineSemaphoreSubmitInfo.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, timelineSemaphoreSubmitInfo.waitSemaphoreValueCount );\n      VULKAN_HPP_HASH_COMBINE( seed, timelineSemaphoreSubmitInfo.pWaitSemaphoreValues );\n      VULKAN_HPP_HASH_COMBINE( seed, timelineSemaphoreSubmitInfo.signalSemaphoreValueCount );\n      VULKAN_HPP_HASH_COMBINE( seed, timelineSemaphoreSubmitInfo.pSignalSemaphoreValues );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::TraceRaysIndirectCommand2KHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::TraceRaysIndirectCommand2KHR const & traceRaysIndirectCommand2KHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, traceRaysIndirectCommand2KHR.raygenShaderRecordAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, traceRaysIndirectCommand2KHR.raygenShaderRecordSize );\n      VULKAN_HPP_HASH_COMBINE( seed, traceRaysIndirectCommand2KHR.missShaderBindingTableAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, traceRaysIndirectCommand2KHR.missShaderBindingTableSize );\n      VULKAN_HPP_HASH_COMBINE( seed, traceRaysIndirectCommand2KHR.missShaderBindingTableStride );\n      VULKAN_HPP_HASH_COMBINE( seed, traceRaysIndirectCommand2KHR.hitShaderBindingTableAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, traceRaysIndirectCommand2KHR.hitShaderBindingTableSize );\n      VULKAN_HPP_HASH_COMBINE( seed, traceRaysIndirectCommand2KHR.hitShaderBindingTableStride );\n      VULKAN_HPP_HASH_COMBINE( seed, traceRaysIndirectCommand2KHR.callableShaderBindingTableAddress );\n      VULKAN_HPP_HASH_COMBINE( seed, traceRaysIndirectCommand2KHR.callableShaderBindingTableSize );\n      VULKAN_HPP_HASH_COMBINE( seed, traceRaysIndirectCommand2KHR.callableShaderBindingTableStride );\n      VULKAN_HPP_HASH_COMBINE( seed, traceRaysIndirectCommand2KHR.width );\n      VULKAN_HPP_HASH_COMBINE( seed, traceRaysIndirectCommand2KHR.height );\n      VULKAN_HPP_HASH_COMBINE( seed, traceRaysIndirectCommand2KHR.depth );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::TraceRaysIndirectCommandKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::TraceRaysIndirectCommandKHR const & traceRaysIndirectCommandKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, traceRaysIndirectCommandKHR.width );\n      VULKAN_HPP_HASH_COMBINE( seed, traceRaysIndirectCommandKHR.height );\n      VULKAN_HPP_HASH_COMBINE( seed, traceRaysIndirectCommandKHR.depth );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ValidationCacheCreateInfoEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ValidationCacheCreateInfoEXT const & validationCacheCreateInfoEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, validationCacheCreateInfoEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, validationCacheCreateInfoEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, validationCacheCreateInfoEXT.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, validationCacheCreateInfoEXT.initialDataSize );\n      VULKAN_HPP_HASH_COMBINE( seed, validationCacheCreateInfoEXT.pInitialData );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ValidationFeaturesEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ValidationFeaturesEXT const & validationFeaturesEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, validationFeaturesEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, validationFeaturesEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, validationFeaturesEXT.enabledValidationFeatureCount );\n      VULKAN_HPP_HASH_COMBINE( seed, validationFeaturesEXT.pEnabledValidationFeatures );\n      VULKAN_HPP_HASH_COMBINE( seed, validationFeaturesEXT.disabledValidationFeatureCount );\n      VULKAN_HPP_HASH_COMBINE( seed, validationFeaturesEXT.pDisabledValidationFeatures );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ValidationFlagsEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ValidationFlagsEXT const & validationFlagsEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, validationFlagsEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, validationFlagsEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, validationFlagsEXT.disabledValidationCheckCount );\n      VULKAN_HPP_HASH_COMBINE( seed, validationFlagsEXT.pDisabledValidationChecks );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription2EXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription2EXT const & vertexInputAttributeDescription2EXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, vertexInputAttributeDescription2EXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, vertexInputAttributeDescription2EXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, vertexInputAttributeDescription2EXT.location );\n      VULKAN_HPP_HASH_COMBINE( seed, vertexInputAttributeDescription2EXT.binding );\n      VULKAN_HPP_HASH_COMBINE( seed, vertexInputAttributeDescription2EXT.format );\n      VULKAN_HPP_HASH_COMBINE( seed, vertexInputAttributeDescription2EXT.offset );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VertexInputBindingDescription2EXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VertexInputBindingDescription2EXT const & vertexInputBindingDescription2EXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, vertexInputBindingDescription2EXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, vertexInputBindingDescription2EXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, vertexInputBindingDescription2EXT.binding );\n      VULKAN_HPP_HASH_COMBINE( seed, vertexInputBindingDescription2EXT.stride );\n      VULKAN_HPP_HASH_COMBINE( seed, vertexInputBindingDescription2EXT.inputRate );\n      VULKAN_HPP_HASH_COMBINE( seed, vertexInputBindingDescription2EXT.divisor );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_VI_NN )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::ViSurfaceCreateInfoNN>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::ViSurfaceCreateInfoNN const & viSurfaceCreateInfoNN ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, viSurfaceCreateInfoNN.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, viSurfaceCreateInfoNN.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, viSurfaceCreateInfoNN.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, viSurfaceCreateInfoNN.window );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_VI_NN*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoPictureResourceInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoPictureResourceInfoKHR const & videoPictureResourceInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoPictureResourceInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoPictureResourceInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoPictureResourceInfoKHR.codedOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, videoPictureResourceInfoKHR.codedExtent );\n      VULKAN_HPP_HASH_COMBINE( seed, videoPictureResourceInfoKHR.baseArrayLayer );\n      VULKAN_HPP_HASH_COMBINE( seed, videoPictureResourceInfoKHR.imageViewBinding );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR const & videoReferenceSlotInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoReferenceSlotInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoReferenceSlotInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoReferenceSlotInfoKHR.slotIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, videoReferenceSlotInfoKHR.pPictureResource );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoBeginCodingInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoBeginCodingInfoKHR const & videoBeginCodingInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoBeginCodingInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoBeginCodingInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoBeginCodingInfoKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, videoBeginCodingInfoKHR.videoSession );\n      VULKAN_HPP_HASH_COMBINE( seed, videoBeginCodingInfoKHR.videoSessionParameters );\n      VULKAN_HPP_HASH_COMBINE( seed, videoBeginCodingInfoKHR.referenceSlotCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoBeginCodingInfoKHR.pReferenceSlots );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR const & videoCapabilitiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoCapabilitiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoCapabilitiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoCapabilitiesKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, videoCapabilitiesKHR.minBitstreamBufferOffsetAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, videoCapabilitiesKHR.minBitstreamBufferSizeAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, videoCapabilitiesKHR.pictureAccessGranularity );\n      VULKAN_HPP_HASH_COMBINE( seed, videoCapabilitiesKHR.minCodedExtent );\n      VULKAN_HPP_HASH_COMBINE( seed, videoCapabilitiesKHR.maxCodedExtent );\n      VULKAN_HPP_HASH_COMBINE( seed, videoCapabilitiesKHR.maxDpbSlots );\n      VULKAN_HPP_HASH_COMBINE( seed, videoCapabilitiesKHR.maxActiveReferencePictures );\n      VULKAN_HPP_HASH_COMBINE( seed, videoCapabilitiesKHR.stdHeaderVersion );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoCodingControlInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoCodingControlInfoKHR const & videoCodingControlInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoCodingControlInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoCodingControlInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoCodingControlInfoKHR.flags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeAV1CapabilitiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoDecodeAV1CapabilitiesKHR const & videoDecodeAV1CapabilitiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1CapabilitiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1CapabilitiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1CapabilitiesKHR.maxLevel );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeAV1DpbSlotInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoDecodeAV1DpbSlotInfoKHR const & videoDecodeAV1DpbSlotInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1DpbSlotInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1DpbSlotInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1DpbSlotInfoKHR.pStdReferenceInfo );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeAV1InlineSessionParametersInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoDecodeAV1InlineSessionParametersInfoKHR const & videoDecodeAV1InlineSessionParametersInfoKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1InlineSessionParametersInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1InlineSessionParametersInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1InlineSessionParametersInfoKHR.pStdSequenceHeader );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeAV1PictureInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoDecodeAV1PictureInfoKHR const & videoDecodeAV1PictureInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1PictureInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1PictureInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1PictureInfoKHR.pStdPictureInfo );\n      for ( size_t i = 0; i < VK_MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1PictureInfoKHR.referenceNameSlotIndices[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1PictureInfoKHR.frameHeaderOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1PictureInfoKHR.tileCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1PictureInfoKHR.pTileOffsets );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1PictureInfoKHR.pTileSizes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeAV1ProfileInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoDecodeAV1ProfileInfoKHR const & videoDecodeAV1ProfileInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1ProfileInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1ProfileInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1ProfileInfoKHR.stdProfile );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1ProfileInfoKHR.filmGrainSupport );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeAV1SessionParametersCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoDecodeAV1SessionParametersCreateInfoKHR const & videoDecodeAV1SessionParametersCreateInfoKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1SessionParametersCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1SessionParametersCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeAV1SessionParametersCreateInfoKHR.pStdSequenceHeader );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeCapabilitiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoDecodeCapabilitiesKHR const & videoDecodeCapabilitiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeCapabilitiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeCapabilitiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeCapabilitiesKHR.flags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH264CapabilitiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoDecodeH264CapabilitiesKHR const & videoDecodeH264CapabilitiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264CapabilitiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264CapabilitiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264CapabilitiesKHR.maxLevelIdc );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264CapabilitiesKHR.fieldOffsetGranularity );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH264DpbSlotInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoDecodeH264DpbSlotInfoKHR const & videoDecodeH264DpbSlotInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264DpbSlotInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264DpbSlotInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264DpbSlotInfoKHR.pStdReferenceInfo );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH264InlineSessionParametersInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoDecodeH264InlineSessionParametersInfoKHR const & videoDecodeH264InlineSessionParametersInfoKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264InlineSessionParametersInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264InlineSessionParametersInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264InlineSessionParametersInfoKHR.pStdSPS );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264InlineSessionParametersInfoKHR.pStdPPS );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH264PictureInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoDecodeH264PictureInfoKHR const & videoDecodeH264PictureInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264PictureInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264PictureInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264PictureInfoKHR.pStdPictureInfo );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264PictureInfoKHR.sliceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264PictureInfoKHR.pSliceOffsets );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH264ProfileInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoDecodeH264ProfileInfoKHR const & videoDecodeH264ProfileInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264ProfileInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264ProfileInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264ProfileInfoKHR.stdProfileIdc );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264ProfileInfoKHR.pictureLayout );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH264SessionParametersAddInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoDecodeH264SessionParametersAddInfoKHR const & videoDecodeH264SessionParametersAddInfoKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264SessionParametersAddInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264SessionParametersAddInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264SessionParametersAddInfoKHR.stdSPSCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264SessionParametersAddInfoKHR.pStdSPSs );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264SessionParametersAddInfoKHR.stdPPSCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264SessionParametersAddInfoKHR.pStdPPSs );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH264SessionParametersCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoDecodeH264SessionParametersCreateInfoKHR const & videoDecodeH264SessionParametersCreateInfoKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264SessionParametersCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264SessionParametersCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264SessionParametersCreateInfoKHR.maxStdSPSCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264SessionParametersCreateInfoKHR.maxStdPPSCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH264SessionParametersCreateInfoKHR.pParametersAddInfo );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH265CapabilitiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoDecodeH265CapabilitiesKHR const & videoDecodeH265CapabilitiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265CapabilitiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265CapabilitiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265CapabilitiesKHR.maxLevelIdc );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH265DpbSlotInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoDecodeH265DpbSlotInfoKHR const & videoDecodeH265DpbSlotInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265DpbSlotInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265DpbSlotInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265DpbSlotInfoKHR.pStdReferenceInfo );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH265InlineSessionParametersInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoDecodeH265InlineSessionParametersInfoKHR const & videoDecodeH265InlineSessionParametersInfoKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265InlineSessionParametersInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265InlineSessionParametersInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265InlineSessionParametersInfoKHR.pStdVPS );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265InlineSessionParametersInfoKHR.pStdSPS );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265InlineSessionParametersInfoKHR.pStdPPS );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH265PictureInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoDecodeH265PictureInfoKHR const & videoDecodeH265PictureInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265PictureInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265PictureInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265PictureInfoKHR.pStdPictureInfo );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265PictureInfoKHR.sliceSegmentCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265PictureInfoKHR.pSliceSegmentOffsets );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH265ProfileInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoDecodeH265ProfileInfoKHR const & videoDecodeH265ProfileInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265ProfileInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265ProfileInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265ProfileInfoKHR.stdProfileIdc );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH265SessionParametersAddInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoDecodeH265SessionParametersAddInfoKHR const & videoDecodeH265SessionParametersAddInfoKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265SessionParametersAddInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265SessionParametersAddInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265SessionParametersAddInfoKHR.stdVPSCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265SessionParametersAddInfoKHR.pStdVPSs );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265SessionParametersAddInfoKHR.stdSPSCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265SessionParametersAddInfoKHR.pStdSPSs );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265SessionParametersAddInfoKHR.stdPPSCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265SessionParametersAddInfoKHR.pStdPPSs );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH265SessionParametersCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoDecodeH265SessionParametersCreateInfoKHR const & videoDecodeH265SessionParametersCreateInfoKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265SessionParametersCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265SessionParametersCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265SessionParametersCreateInfoKHR.maxStdVPSCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265SessionParametersCreateInfoKHR.maxStdSPSCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265SessionParametersCreateInfoKHR.maxStdPPSCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeH265SessionParametersCreateInfoKHR.pParametersAddInfo );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoDecodeInfoKHR const & videoDecodeInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeInfoKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeInfoKHR.srcBuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeInfoKHR.srcBufferOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeInfoKHR.srcBufferRange );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeInfoKHR.dstPictureResource );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeInfoKHR.pSetupReferenceSlot );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeInfoKHR.referenceSlotCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeInfoKHR.pReferenceSlots );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeUsageInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoDecodeUsageInfoKHR const & videoDecodeUsageInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeUsageInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeUsageInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoDecodeUsageInfoKHR.videoUsageHints );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeAV1CapabilitiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeAV1CapabilitiesKHR const & videoEncodeAV1CapabilitiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.maxLevel );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.codedPictureAlignment );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.maxTiles );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.minTileSize );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.maxTileSize );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.superblockSizes );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.maxSingleReferenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.singleReferenceNameMask );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.maxUnidirectionalCompoundReferenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.maxUnidirectionalCompoundGroup1ReferenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.unidirectionalCompoundReferenceNameMask );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.maxBidirectionalCompoundReferenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.maxBidirectionalCompoundGroup1ReferenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.maxBidirectionalCompoundGroup2ReferenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.bidirectionalCompoundReferenceNameMask );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.maxTemporalLayerCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.maxSpatialLayerCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.maxOperatingPoints );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.minQIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.maxQIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.prefersGopRemainingFrames );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.requiresGopRemainingFrames );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1CapabilitiesKHR.stdSyntaxFlags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeAV1DpbSlotInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeAV1DpbSlotInfoKHR const & videoEncodeAV1DpbSlotInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1DpbSlotInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1DpbSlotInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1DpbSlotInfoKHR.pStdReferenceInfo );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeAV1FrameSizeKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeAV1FrameSizeKHR const & videoEncodeAV1FrameSizeKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1FrameSizeKHR.intraFrameSize );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1FrameSizeKHR.predictiveFrameSize );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1FrameSizeKHR.bipredictiveFrameSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeAV1GopRemainingFrameInfoKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::VideoEncodeAV1GopRemainingFrameInfoKHR const & videoEncodeAV1GopRemainingFrameInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1GopRemainingFrameInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1GopRemainingFrameInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1GopRemainingFrameInfoKHR.useGopRemainingFrames );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1GopRemainingFrameInfoKHR.gopRemainingIntra );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1GopRemainingFrameInfoKHR.gopRemainingPredictive );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1GopRemainingFrameInfoKHR.gopRemainingBipredictive );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeAV1PictureInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeAV1PictureInfoKHR const & videoEncodeAV1PictureInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1PictureInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1PictureInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1PictureInfoKHR.predictionMode );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1PictureInfoKHR.rateControlGroup );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1PictureInfoKHR.constantQIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1PictureInfoKHR.pStdPictureInfo );\n      for ( size_t i = 0; i < VK_MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR; ++i )\n      {\n        VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1PictureInfoKHR.referenceNameSlotIndices[i] );\n      }\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1PictureInfoKHR.primaryReferenceCdfOnly );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1PictureInfoKHR.generateObuExtensionHeader );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeAV1ProfileInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeAV1ProfileInfoKHR const & videoEncodeAV1ProfileInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1ProfileInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1ProfileInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1ProfileInfoKHR.stdProfile );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeAV1QIndexKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeAV1QIndexKHR const & videoEncodeAV1QIndexKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QIndexKHR.intraQIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QIndexKHR.predictiveQIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QIndexKHR.bipredictiveQIndex );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeAV1QualityLevelPropertiesKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::VideoEncodeAV1QualityLevelPropertiesKHR const & videoEncodeAV1QualityLevelPropertiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QualityLevelPropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QualityLevelPropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QualityLevelPropertiesKHR.preferredRateControlFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QualityLevelPropertiesKHR.preferredGopFrameCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QualityLevelPropertiesKHR.preferredKeyFramePeriod );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QualityLevelPropertiesKHR.preferredConsecutiveBipredictiveFrameCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QualityLevelPropertiesKHR.preferredTemporalLayerCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QualityLevelPropertiesKHR.preferredConstantQIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QualityLevelPropertiesKHR.preferredMaxSingleReferenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QualityLevelPropertiesKHR.preferredSingleReferenceNameMask );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QualityLevelPropertiesKHR.preferredMaxUnidirectionalCompoundReferenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QualityLevelPropertiesKHR.preferredMaxUnidirectionalCompoundGroup1ReferenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QualityLevelPropertiesKHR.preferredUnidirectionalCompoundReferenceNameMask );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QualityLevelPropertiesKHR.preferredMaxBidirectionalCompoundReferenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QualityLevelPropertiesKHR.preferredMaxBidirectionalCompoundGroup1ReferenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QualityLevelPropertiesKHR.preferredMaxBidirectionalCompoundGroup2ReferenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QualityLevelPropertiesKHR.preferredBidirectionalCompoundReferenceNameMask );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeAV1QuantizationMapCapabilitiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeAV1QuantizationMapCapabilitiesKHR const & videoEncodeAV1QuantizationMapCapabilitiesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QuantizationMapCapabilitiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QuantizationMapCapabilitiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QuantizationMapCapabilitiesKHR.minQIndexDelta );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1QuantizationMapCapabilitiesKHR.maxQIndexDelta );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlInfoKHR const & videoEncodeAV1RateControlInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1RateControlInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1RateControlInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1RateControlInfoKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1RateControlInfoKHR.gopFrameCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1RateControlInfoKHR.keyFramePeriod );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1RateControlInfoKHR.consecutiveBipredictiveFrameCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1RateControlInfoKHR.temporalLayerCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlLayerInfoKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlLayerInfoKHR const & videoEncodeAV1RateControlLayerInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1RateControlLayerInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1RateControlLayerInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1RateControlLayerInfoKHR.useMinQIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1RateControlLayerInfoKHR.minQIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1RateControlLayerInfoKHR.useMaxQIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1RateControlLayerInfoKHR.maxQIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1RateControlLayerInfoKHR.useMaxFrameSize );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1RateControlLayerInfoKHR.maxFrameSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeAV1SessionCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeAV1SessionCreateInfoKHR const & videoEncodeAV1SessionCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1SessionCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1SessionCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1SessionCreateInfoKHR.useMaxLevel );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1SessionCreateInfoKHR.maxLevel );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeAV1SessionParametersCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeAV1SessionParametersCreateInfoKHR const & videoEncodeAV1SessionParametersCreateInfoKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1SessionParametersCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1SessionParametersCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1SessionParametersCreateInfoKHR.pStdSequenceHeader );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1SessionParametersCreateInfoKHR.pStdDecoderModelInfo );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1SessionParametersCreateInfoKHR.stdOperatingPointCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeAV1SessionParametersCreateInfoKHR.pStdOperatingPoints );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeCapabilitiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeCapabilitiesKHR const & videoEncodeCapabilitiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeCapabilitiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeCapabilitiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeCapabilitiesKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeCapabilitiesKHR.rateControlModes );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeCapabilitiesKHR.maxRateControlLayers );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeCapabilitiesKHR.maxBitrate );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeCapabilitiesKHR.maxQualityLevels );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeCapabilitiesKHR.encodeInputPictureGranularity );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeCapabilitiesKHR.supportedEncodeFeedbackFlags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264CapabilitiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH264CapabilitiesKHR const & videoEncodeH264CapabilitiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264CapabilitiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264CapabilitiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264CapabilitiesKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264CapabilitiesKHR.maxLevelIdc );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264CapabilitiesKHR.maxSliceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264CapabilitiesKHR.maxPPictureL0ReferenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264CapabilitiesKHR.maxBPictureL0ReferenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264CapabilitiesKHR.maxL1ReferenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264CapabilitiesKHR.maxTemporalLayerCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264CapabilitiesKHR.expectDyadicTemporalLayerPattern );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264CapabilitiesKHR.minQp );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264CapabilitiesKHR.maxQp );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264CapabilitiesKHR.prefersGopRemainingFrames );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264CapabilitiesKHR.requiresGopRemainingFrames );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264CapabilitiesKHR.stdSyntaxFlags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264DpbSlotInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH264DpbSlotInfoKHR const & videoEncodeH264DpbSlotInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264DpbSlotInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264DpbSlotInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264DpbSlotInfoKHR.pStdReferenceInfo );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264FrameSizeKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH264FrameSizeKHR const & videoEncodeH264FrameSizeKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264FrameSizeKHR.frameISize );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264FrameSizeKHR.framePSize );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264FrameSizeKHR.frameBSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264GopRemainingFrameInfoKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH264GopRemainingFrameInfoKHR const & videoEncodeH264GopRemainingFrameInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264GopRemainingFrameInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264GopRemainingFrameInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264GopRemainingFrameInfoKHR.useGopRemainingFrames );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264GopRemainingFrameInfoKHR.gopRemainingI );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264GopRemainingFrameInfoKHR.gopRemainingP );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264GopRemainingFrameInfoKHR.gopRemainingB );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264NaluSliceInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH264NaluSliceInfoKHR const & videoEncodeH264NaluSliceInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264NaluSliceInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264NaluSliceInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264NaluSliceInfoKHR.constantQp );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264NaluSliceInfoKHR.pStdSliceHeader );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264PictureInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH264PictureInfoKHR const & videoEncodeH264PictureInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264PictureInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264PictureInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264PictureInfoKHR.naluSliceEntryCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264PictureInfoKHR.pNaluSliceEntries );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264PictureInfoKHR.pStdPictureInfo );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264PictureInfoKHR.generatePrefixNalu );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264ProfileInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH264ProfileInfoKHR const & videoEncodeH264ProfileInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264ProfileInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264ProfileInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264ProfileInfoKHR.stdProfileIdc );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264QpKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH264QpKHR const & videoEncodeH264QpKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264QpKHR.qpI );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264QpKHR.qpP );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264QpKHR.qpB );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264QualityLevelPropertiesKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH264QualityLevelPropertiesKHR const & videoEncodeH264QualityLevelPropertiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264QualityLevelPropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264QualityLevelPropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264QualityLevelPropertiesKHR.preferredRateControlFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264QualityLevelPropertiesKHR.preferredGopFrameCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264QualityLevelPropertiesKHR.preferredIdrPeriod );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264QualityLevelPropertiesKHR.preferredConsecutiveBFrameCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264QualityLevelPropertiesKHR.preferredTemporalLayerCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264QualityLevelPropertiesKHR.preferredConstantQp );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264QualityLevelPropertiesKHR.preferredMaxL0ReferenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264QualityLevelPropertiesKHR.preferredMaxL1ReferenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264QualityLevelPropertiesKHR.preferredStdEntropyCodingModeFlag );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264QuantizationMapCapabilitiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH264QuantizationMapCapabilitiesKHR const & videoEncodeH264QuantizationMapCapabilitiesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264QuantizationMapCapabilitiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264QuantizationMapCapabilitiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264QuantizationMapCapabilitiesKHR.minQpDelta );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264QuantizationMapCapabilitiesKHR.maxQpDelta );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264RateControlInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH264RateControlInfoKHR const & videoEncodeH264RateControlInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264RateControlInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264RateControlInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264RateControlInfoKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264RateControlInfoKHR.gopFrameCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264RateControlInfoKHR.idrPeriod );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264RateControlInfoKHR.consecutiveBFrameCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264RateControlInfoKHR.temporalLayerCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264RateControlLayerInfoKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH264RateControlLayerInfoKHR const & videoEncodeH264RateControlLayerInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264RateControlLayerInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264RateControlLayerInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264RateControlLayerInfoKHR.useMinQp );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264RateControlLayerInfoKHR.minQp );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264RateControlLayerInfoKHR.useMaxQp );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264RateControlLayerInfoKHR.maxQp );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264RateControlLayerInfoKHR.useMaxFrameSize );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264RateControlLayerInfoKHR.maxFrameSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionCreateInfoKHR const & videoEncodeH264SessionCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionCreateInfoKHR.useMaxLevelIdc );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionCreateInfoKHR.maxLevelIdc );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersAddInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersAddInfoKHR const & videoEncodeH264SessionParametersAddInfoKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionParametersAddInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionParametersAddInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionParametersAddInfoKHR.stdSPSCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionParametersAddInfoKHR.pStdSPSs );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionParametersAddInfoKHR.stdPPSCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionParametersAddInfoKHR.pStdPPSs );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersCreateInfoKHR const & videoEncodeH264SessionParametersCreateInfoKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionParametersCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionParametersCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionParametersCreateInfoKHR.maxStdSPSCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionParametersCreateInfoKHR.maxStdPPSCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionParametersCreateInfoKHR.pParametersAddInfo );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersFeedbackInfoKHR>\n  {\n    std::size_t operator()(\n      VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersFeedbackInfoKHR const & videoEncodeH264SessionParametersFeedbackInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionParametersFeedbackInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionParametersFeedbackInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionParametersFeedbackInfoKHR.hasStdSPSOverrides );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionParametersFeedbackInfoKHR.hasStdPPSOverrides );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersGetInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersGetInfoKHR const & videoEncodeH264SessionParametersGetInfoKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionParametersGetInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionParametersGetInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionParametersGetInfoKHR.writeStdSPS );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionParametersGetInfoKHR.writeStdPPS );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionParametersGetInfoKHR.stdSPSId );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH264SessionParametersGetInfoKHR.stdPPSId );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265CapabilitiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH265CapabilitiesKHR const & videoEncodeH265CapabilitiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265CapabilitiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265CapabilitiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265CapabilitiesKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265CapabilitiesKHR.maxLevelIdc );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265CapabilitiesKHR.maxSliceSegmentCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265CapabilitiesKHR.maxTiles );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265CapabilitiesKHR.ctbSizes );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265CapabilitiesKHR.transformBlockSizes );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265CapabilitiesKHR.maxPPictureL0ReferenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265CapabilitiesKHR.maxBPictureL0ReferenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265CapabilitiesKHR.maxL1ReferenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265CapabilitiesKHR.maxSubLayerCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265CapabilitiesKHR.expectDyadicTemporalSubLayerPattern );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265CapabilitiesKHR.minQp );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265CapabilitiesKHR.maxQp );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265CapabilitiesKHR.prefersGopRemainingFrames );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265CapabilitiesKHR.requiresGopRemainingFrames );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265CapabilitiesKHR.stdSyntaxFlags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265DpbSlotInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH265DpbSlotInfoKHR const & videoEncodeH265DpbSlotInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265DpbSlotInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265DpbSlotInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265DpbSlotInfoKHR.pStdReferenceInfo );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265FrameSizeKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH265FrameSizeKHR const & videoEncodeH265FrameSizeKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265FrameSizeKHR.frameISize );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265FrameSizeKHR.framePSize );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265FrameSizeKHR.frameBSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265GopRemainingFrameInfoKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH265GopRemainingFrameInfoKHR const & videoEncodeH265GopRemainingFrameInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265GopRemainingFrameInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265GopRemainingFrameInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265GopRemainingFrameInfoKHR.useGopRemainingFrames );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265GopRemainingFrameInfoKHR.gopRemainingI );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265GopRemainingFrameInfoKHR.gopRemainingP );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265GopRemainingFrameInfoKHR.gopRemainingB );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265NaluSliceSegmentInfoKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH265NaluSliceSegmentInfoKHR const & videoEncodeH265NaluSliceSegmentInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265NaluSliceSegmentInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265NaluSliceSegmentInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265NaluSliceSegmentInfoKHR.constantQp );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265NaluSliceSegmentInfoKHR.pStdSliceSegmentHeader );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265PictureInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH265PictureInfoKHR const & videoEncodeH265PictureInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265PictureInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265PictureInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265PictureInfoKHR.naluSliceSegmentEntryCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265PictureInfoKHR.pNaluSliceSegmentEntries );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265PictureInfoKHR.pStdPictureInfo );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265ProfileInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH265ProfileInfoKHR const & videoEncodeH265ProfileInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265ProfileInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265ProfileInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265ProfileInfoKHR.stdProfileIdc );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265QpKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH265QpKHR const & videoEncodeH265QpKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265QpKHR.qpI );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265QpKHR.qpP );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265QpKHR.qpB );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265QualityLevelPropertiesKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH265QualityLevelPropertiesKHR const & videoEncodeH265QualityLevelPropertiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265QualityLevelPropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265QualityLevelPropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265QualityLevelPropertiesKHR.preferredRateControlFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265QualityLevelPropertiesKHR.preferredGopFrameCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265QualityLevelPropertiesKHR.preferredIdrPeriod );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265QualityLevelPropertiesKHR.preferredConsecutiveBFrameCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265QualityLevelPropertiesKHR.preferredSubLayerCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265QualityLevelPropertiesKHR.preferredConstantQp );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265QualityLevelPropertiesKHR.preferredMaxL0ReferenceCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265QualityLevelPropertiesKHR.preferredMaxL1ReferenceCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265QuantizationMapCapabilitiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH265QuantizationMapCapabilitiesKHR const & videoEncodeH265QuantizationMapCapabilitiesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265QuantizationMapCapabilitiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265QuantizationMapCapabilitiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265QuantizationMapCapabilitiesKHR.minQpDelta );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265QuantizationMapCapabilitiesKHR.maxQpDelta );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265RateControlInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH265RateControlInfoKHR const & videoEncodeH265RateControlInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265RateControlInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265RateControlInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265RateControlInfoKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265RateControlInfoKHR.gopFrameCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265RateControlInfoKHR.idrPeriod );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265RateControlInfoKHR.consecutiveBFrameCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265RateControlInfoKHR.subLayerCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265RateControlLayerInfoKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH265RateControlLayerInfoKHR const & videoEncodeH265RateControlLayerInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265RateControlLayerInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265RateControlLayerInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265RateControlLayerInfoKHR.useMinQp );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265RateControlLayerInfoKHR.minQp );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265RateControlLayerInfoKHR.useMaxQp );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265RateControlLayerInfoKHR.maxQp );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265RateControlLayerInfoKHR.useMaxFrameSize );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265RateControlLayerInfoKHR.maxFrameSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionCreateInfoKHR const & videoEncodeH265SessionCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionCreateInfoKHR.useMaxLevelIdc );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionCreateInfoKHR.maxLevelIdc );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersAddInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersAddInfoKHR const & videoEncodeH265SessionParametersAddInfoKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersAddInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersAddInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersAddInfoKHR.stdVPSCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersAddInfoKHR.pStdVPSs );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersAddInfoKHR.stdSPSCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersAddInfoKHR.pStdSPSs );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersAddInfoKHR.stdPPSCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersAddInfoKHR.pStdPPSs );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersCreateInfoKHR const & videoEncodeH265SessionParametersCreateInfoKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersCreateInfoKHR.maxStdVPSCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersCreateInfoKHR.maxStdSPSCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersCreateInfoKHR.maxStdPPSCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersCreateInfoKHR.pParametersAddInfo );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersFeedbackInfoKHR>\n  {\n    std::size_t operator()(\n      VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersFeedbackInfoKHR const & videoEncodeH265SessionParametersFeedbackInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersFeedbackInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersFeedbackInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersFeedbackInfoKHR.hasStdVPSOverrides );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersFeedbackInfoKHR.hasStdSPSOverrides );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersFeedbackInfoKHR.hasStdPPSOverrides );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersGetInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersGetInfoKHR const & videoEncodeH265SessionParametersGetInfoKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersGetInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersGetInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersGetInfoKHR.writeStdVPS );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersGetInfoKHR.writeStdSPS );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersGetInfoKHR.writeStdPPS );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersGetInfoKHR.stdVPSId );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersGetInfoKHR.stdSPSId );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeH265SessionParametersGetInfoKHR.stdPPSId );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeInfoKHR const & videoEncodeInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeInfoKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeInfoKHR.dstBuffer );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeInfoKHR.dstBufferOffset );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeInfoKHR.dstBufferRange );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeInfoKHR.srcPictureResource );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeInfoKHR.pSetupReferenceSlot );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeInfoKHR.referenceSlotCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeInfoKHR.pReferenceSlots );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeInfoKHR.precedingExternallyEncodedBytes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelInfoKHR const & videoEncodeQualityLevelInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeQualityLevelInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeQualityLevelInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeQualityLevelInfoKHR.qualityLevel );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelPropertiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelPropertiesKHR const & videoEncodeQualityLevelPropertiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeQualityLevelPropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeQualityLevelPropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeQualityLevelPropertiesKHR.preferredRateControlMode );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeQualityLevelPropertiesKHR.preferredRateControlLayerCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeQuantizationMapCapabilitiesKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::VideoEncodeQuantizationMapCapabilitiesKHR const & videoEncodeQuantizationMapCapabilitiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeQuantizationMapCapabilitiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeQuantizationMapCapabilitiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeQuantizationMapCapabilitiesKHR.maxQuantizationMapExtent );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeQuantizationMapInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeQuantizationMapInfoKHR const & videoEncodeQuantizationMapInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeQuantizationMapInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeQuantizationMapInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeQuantizationMapInfoKHR.quantizationMap );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeQuantizationMapInfoKHR.quantizationMapExtent );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeQuantizationMapSessionParametersCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeQuantizationMapSessionParametersCreateInfoKHR const &\n                              videoEncodeQuantizationMapSessionParametersCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeQuantizationMapSessionParametersCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeQuantizationMapSessionParametersCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeQuantizationMapSessionParametersCreateInfoKHR.quantizationMapTexelSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeRateControlLayerInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeRateControlLayerInfoKHR const & videoEncodeRateControlLayerInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeRateControlLayerInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeRateControlLayerInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeRateControlLayerInfoKHR.averageBitrate );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeRateControlLayerInfoKHR.maxBitrate );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeRateControlLayerInfoKHR.frameRateNumerator );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeRateControlLayerInfoKHR.frameRateDenominator );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeRateControlInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeRateControlInfoKHR const & videoEncodeRateControlInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeRateControlInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeRateControlInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeRateControlInfoKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeRateControlInfoKHR.rateControlMode );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeRateControlInfoKHR.layerCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeRateControlInfoKHR.pLayers );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeRateControlInfoKHR.virtualBufferSizeInMs );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeRateControlInfoKHR.initialVirtualBufferSizeInMs );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR const & videoEncodeSessionParametersFeedbackInfoKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeSessionParametersFeedbackInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeSessionParametersFeedbackInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeSessionParametersFeedbackInfoKHR.hasOverrides );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersGetInfoKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersGetInfoKHR const & videoEncodeSessionParametersGetInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeSessionParametersGetInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeSessionParametersGetInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeSessionParametersGetInfoKHR.videoSessionParameters );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeUsageInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEncodeUsageInfoKHR const & videoEncodeUsageInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeUsageInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeUsageInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeUsageInfoKHR.videoUsageHints );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeUsageInfoKHR.videoContentHints );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEncodeUsageInfoKHR.tuningMode );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoEndCodingInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoEndCodingInfoKHR const & videoEndCodingInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoEndCodingInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEndCodingInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoEndCodingInfoKHR.flags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoFormatAV1QuantizationMapPropertiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoFormatAV1QuantizationMapPropertiesKHR const & videoFormatAV1QuantizationMapPropertiesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoFormatAV1QuantizationMapPropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoFormatAV1QuantizationMapPropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoFormatAV1QuantizationMapPropertiesKHR.compatibleSuperblockSizes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoFormatH265QuantizationMapPropertiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoFormatH265QuantizationMapPropertiesKHR const & videoFormatH265QuantizationMapPropertiesKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoFormatH265QuantizationMapPropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoFormatH265QuantizationMapPropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoFormatH265QuantizationMapPropertiesKHR.compatibleCtbSizes );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR const & videoFormatPropertiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoFormatPropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoFormatPropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoFormatPropertiesKHR.format );\n      VULKAN_HPP_HASH_COMBINE( seed, videoFormatPropertiesKHR.componentMapping );\n      VULKAN_HPP_HASH_COMBINE( seed, videoFormatPropertiesKHR.imageCreateFlags );\n      VULKAN_HPP_HASH_COMBINE( seed, videoFormatPropertiesKHR.imageType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoFormatPropertiesKHR.imageTiling );\n      VULKAN_HPP_HASH_COMBINE( seed, videoFormatPropertiesKHR.imageUsageFlags );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoFormatQuantizationMapPropertiesKHR>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::VideoFormatQuantizationMapPropertiesKHR const & videoFormatQuantizationMapPropertiesKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoFormatQuantizationMapPropertiesKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoFormatQuantizationMapPropertiesKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoFormatQuantizationMapPropertiesKHR.quantizationMapTexelSize );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoInlineQueryInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoInlineQueryInfoKHR const & videoInlineQueryInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoInlineQueryInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoInlineQueryInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoInlineQueryInfoKHR.queryPool );\n      VULKAN_HPP_HASH_COMBINE( seed, videoInlineQueryInfoKHR.firstQuery );\n      VULKAN_HPP_HASH_COMBINE( seed, videoInlineQueryInfoKHR.queryCount );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoProfileListInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoProfileListInfoKHR const & videoProfileListInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoProfileListInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoProfileListInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoProfileListInfoKHR.profileCount );\n      VULKAN_HPP_HASH_COMBINE( seed, videoProfileListInfoKHR.pProfiles );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoSessionCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoSessionCreateInfoKHR const & videoSessionCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoSessionCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoSessionCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoSessionCreateInfoKHR.queueFamilyIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, videoSessionCreateInfoKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, videoSessionCreateInfoKHR.pVideoProfile );\n      VULKAN_HPP_HASH_COMBINE( seed, videoSessionCreateInfoKHR.pictureFormat );\n      VULKAN_HPP_HASH_COMBINE( seed, videoSessionCreateInfoKHR.maxCodedExtent );\n      VULKAN_HPP_HASH_COMBINE( seed, videoSessionCreateInfoKHR.referencePictureFormat );\n      VULKAN_HPP_HASH_COMBINE( seed, videoSessionCreateInfoKHR.maxDpbSlots );\n      VULKAN_HPP_HASH_COMBINE( seed, videoSessionCreateInfoKHR.maxActiveReferencePictures );\n      VULKAN_HPP_HASH_COMBINE( seed, videoSessionCreateInfoKHR.pStdHeaderVersion );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoSessionMemoryRequirementsKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoSessionMemoryRequirementsKHR const & videoSessionMemoryRequirementsKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoSessionMemoryRequirementsKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoSessionMemoryRequirementsKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoSessionMemoryRequirementsKHR.memoryBindIndex );\n      VULKAN_HPP_HASH_COMBINE( seed, videoSessionMemoryRequirementsKHR.memoryRequirements );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateInfoKHR const & videoSessionParametersCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoSessionParametersCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoSessionParametersCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoSessionParametersCreateInfoKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, videoSessionParametersCreateInfoKHR.videoSessionParametersTemplate );\n      VULKAN_HPP_HASH_COMBINE( seed, videoSessionParametersCreateInfoKHR.videoSession );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::VideoSessionParametersUpdateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoSessionParametersUpdateInfoKHR const & videoSessionParametersUpdateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, videoSessionParametersUpdateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, videoSessionParametersUpdateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, videoSessionParametersUpdateInfoKHR.updateSequenceCount );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateInfoKHR const & waylandSurfaceCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, waylandSurfaceCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, waylandSurfaceCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, waylandSurfaceCreateInfoKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, waylandSurfaceCreateInfoKHR.display );\n      VULKAN_HPP_HASH_COMBINE( seed, waylandSurfaceCreateInfoKHR.surface );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_WAYLAND_KHR*/\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::Win32KeyedMutexAcquireReleaseInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::Win32KeyedMutexAcquireReleaseInfoKHR const & win32KeyedMutexAcquireReleaseInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, win32KeyedMutexAcquireReleaseInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, win32KeyedMutexAcquireReleaseInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, win32KeyedMutexAcquireReleaseInfoKHR.acquireCount );\n      VULKAN_HPP_HASH_COMBINE( seed, win32KeyedMutexAcquireReleaseInfoKHR.pAcquireSyncs );\n      VULKAN_HPP_HASH_COMBINE( seed, win32KeyedMutexAcquireReleaseInfoKHR.pAcquireKeys );\n      VULKAN_HPP_HASH_COMBINE( seed, win32KeyedMutexAcquireReleaseInfoKHR.pAcquireTimeouts );\n      VULKAN_HPP_HASH_COMBINE( seed, win32KeyedMutexAcquireReleaseInfoKHR.releaseCount );\n      VULKAN_HPP_HASH_COMBINE( seed, win32KeyedMutexAcquireReleaseInfoKHR.pReleaseSyncs );\n      VULKAN_HPP_HASH_COMBINE( seed, win32KeyedMutexAcquireReleaseInfoKHR.pReleaseKeys );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::Win32KeyedMutexAcquireReleaseInfoNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::Win32KeyedMutexAcquireReleaseInfoNV const & win32KeyedMutexAcquireReleaseInfoNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, win32KeyedMutexAcquireReleaseInfoNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, win32KeyedMutexAcquireReleaseInfoNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, win32KeyedMutexAcquireReleaseInfoNV.acquireCount );\n      VULKAN_HPP_HASH_COMBINE( seed, win32KeyedMutexAcquireReleaseInfoNV.pAcquireSyncs );\n      VULKAN_HPP_HASH_COMBINE( seed, win32KeyedMutexAcquireReleaseInfoNV.pAcquireKeys );\n      VULKAN_HPP_HASH_COMBINE( seed, win32KeyedMutexAcquireReleaseInfoNV.pAcquireTimeoutMilliseconds );\n      VULKAN_HPP_HASH_COMBINE( seed, win32KeyedMutexAcquireReleaseInfoNV.releaseCount );\n      VULKAN_HPP_HASH_COMBINE( seed, win32KeyedMutexAcquireReleaseInfoNV.pReleaseSyncs );\n      VULKAN_HPP_HASH_COMBINE( seed, win32KeyedMutexAcquireReleaseInfoNV.pReleaseKeys );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::Win32SurfaceCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::Win32SurfaceCreateInfoKHR const & win32SurfaceCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, win32SurfaceCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, win32SurfaceCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, win32SurfaceCreateInfoKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, win32SurfaceCreateInfoKHR.hinstance );\n      VULKAN_HPP_HASH_COMBINE( seed, win32SurfaceCreateInfoKHR.hwnd );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::WriteDescriptorSetAccelerationStructureKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::WriteDescriptorSetAccelerationStructureKHR const & writeDescriptorSetAccelerationStructureKHR ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSetAccelerationStructureKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSetAccelerationStructureKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSetAccelerationStructureKHR.accelerationStructureCount );\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSetAccelerationStructureKHR.pAccelerationStructures );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::WriteDescriptorSetAccelerationStructureNV>\n  {\n    std::size_t\n      operator()( VULKAN_HPP_NAMESPACE::WriteDescriptorSetAccelerationStructureNV const & writeDescriptorSetAccelerationStructureNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSetAccelerationStructureNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSetAccelerationStructureNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSetAccelerationStructureNV.accelerationStructureCount );\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSetAccelerationStructureNV.pAccelerationStructures );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::WriteDescriptorSetInlineUniformBlock>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::WriteDescriptorSetInlineUniformBlock const & writeDescriptorSetInlineUniformBlock ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSetInlineUniformBlock.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSetInlineUniformBlock.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSetInlineUniformBlock.dataSize );\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSetInlineUniformBlock.pData );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::WriteDescriptorSetPartitionedAccelerationStructureNV>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::WriteDescriptorSetPartitionedAccelerationStructureNV const &\n                              writeDescriptorSetPartitionedAccelerationStructureNV ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSetPartitionedAccelerationStructureNV.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSetPartitionedAccelerationStructureNV.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSetPartitionedAccelerationStructureNV.accelerationStructureCount );\n      VULKAN_HPP_HASH_COMBINE( seed, writeDescriptorSetPartitionedAccelerationStructureNV.pAccelerationStructures );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetPipelineEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetPipelineEXT const & writeIndirectExecutionSetPipelineEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, writeIndirectExecutionSetPipelineEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, writeIndirectExecutionSetPipelineEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, writeIndirectExecutionSetPipelineEXT.index );\n      VULKAN_HPP_HASH_COMBINE( seed, writeIndirectExecutionSetPipelineEXT.pipeline );\n      return seed;\n    }\n  };\n\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetShaderEXT>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetShaderEXT const & writeIndirectExecutionSetShaderEXT ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, writeIndirectExecutionSetShaderEXT.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, writeIndirectExecutionSetShaderEXT.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, writeIndirectExecutionSetShaderEXT.index );\n      VULKAN_HPP_HASH_COMBINE( seed, writeIndirectExecutionSetShaderEXT.shader );\n      return seed;\n    }\n  };\n\n#  if defined( VK_USE_PLATFORM_XCB_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::XcbSurfaceCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::XcbSurfaceCreateInfoKHR const & xcbSurfaceCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, xcbSurfaceCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, xcbSurfaceCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, xcbSurfaceCreateInfoKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, xcbSurfaceCreateInfoKHR.connection );\n      VULKAN_HPP_HASH_COMBINE( seed, xcbSurfaceCreateInfoKHR.window );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_XCB_KHR*/\n\n#  if defined( VK_USE_PLATFORM_XLIB_KHR )\n  template <>\n  struct hash<VULKAN_HPP_NAMESPACE::XlibSurfaceCreateInfoKHR>\n  {\n    std::size_t operator()( VULKAN_HPP_NAMESPACE::XlibSurfaceCreateInfoKHR const & xlibSurfaceCreateInfoKHR ) const VULKAN_HPP_NOEXCEPT\n    {\n      std::size_t seed = 0;\n      VULKAN_HPP_HASH_COMBINE( seed, xlibSurfaceCreateInfoKHR.sType );\n      VULKAN_HPP_HASH_COMBINE( seed, xlibSurfaceCreateInfoKHR.pNext );\n      VULKAN_HPP_HASH_COMBINE( seed, xlibSurfaceCreateInfoKHR.flags );\n      VULKAN_HPP_HASH_COMBINE( seed, xlibSurfaceCreateInfoKHR.dpy );\n      VULKAN_HPP_HASH_COMBINE( seed, xlibSurfaceCreateInfoKHR.window );\n      return seed;\n    }\n  };\n#  endif /*VK_USE_PLATFORM_XLIB_KHR*/\n\n#endif  // 14 <= VULKAN_HPP_CPP_VERSION\n\n}  // namespace std\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_hpp_macros.hpp",
    "content": "// Copyright 2015-2025 The Khronos Group Inc.\n//\n// SPDX-License-Identifier: Apache-2.0 OR MIT\n//\n\n// This header is generated from the Khronos Vulkan XML API Registry.\n\n#ifndef VULKAN_HPP_MACROS_HPP\n#define VULKAN_HPP_MACROS_HPP\n\n#if defined( _MSVC_LANG )\n#  define VULKAN_HPP_CPLUSPLUS _MSVC_LANG\n#else\n#  define VULKAN_HPP_CPLUSPLUS __cplusplus\n#endif\n\n#if 202002L < VULKAN_HPP_CPLUSPLUS\n#  define VULKAN_HPP_CPP_VERSION 23\n#elif 201703L < VULKAN_HPP_CPLUSPLUS\n#  define VULKAN_HPP_CPP_VERSION 20\n#elif 201402L < VULKAN_HPP_CPLUSPLUS\n#  define VULKAN_HPP_CPP_VERSION 17\n#elif 201103L < VULKAN_HPP_CPLUSPLUS\n#  define VULKAN_HPP_CPP_VERSION 14\n#elif 199711L < VULKAN_HPP_CPLUSPLUS\n#  define VULKAN_HPP_CPP_VERSION 11\n#else\n#  error \"vulkan.hpp needs at least c++ standard version 11\"\n#endif\n\n// include headers holding feature-test macros\n#if 20 <= VULKAN_HPP_CPP_VERSION\n#  include <version>\n#else\n#  include <ciso646>\n#endif\n\n#if defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n#  if !defined( VULKAN_HPP_NO_SMART_HANDLE )\n#    define VULKAN_HPP_NO_SMART_HANDLE\n#  endif\n#endif\n\n#if defined( VULKAN_HPP_NO_CONSTRUCTORS )\n#  if !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n#    define VULKAN_HPP_NO_STRUCT_CONSTRUCTORS\n#  endif\n#  if !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )\n#    define VULKAN_HPP_NO_UNION_CONSTRUCTORS\n#  endif\n#endif\n\n#if defined( VULKAN_HPP_NO_SETTERS )\n#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n#    define VULKAN_HPP_NO_STRUCT_SETTERS\n#  endif\n#  if !defined( VULKAN_HPP_NO_UNION_SETTERS )\n#    define VULKAN_HPP_NO_UNION_SETTERS\n#  endif\n#endif\n\n#if !defined( VULKAN_HPP_ASSERT )\n#  define VULKAN_HPP_ASSERT assert\n#endif\n\n#if !defined( VULKAN_HPP_ASSERT_ON_RESULT )\n#  define VULKAN_HPP_ASSERT_ON_RESULT VULKAN_HPP_ASSERT\n#endif\n\n#if !defined( VULKAN_HPP_STATIC_ASSERT )\n#  define VULKAN_HPP_STATIC_ASSERT static_assert\n#endif\n\n#if !defined( VULKAN_HPP_ENABLE_DYNAMIC_LOADER_TOOL )\n#  define VULKAN_HPP_ENABLE_DYNAMIC_LOADER_TOOL 1\n#endif\n\n#if !defined( __has_include )\n#  define __has_include( x ) false\n#endif\n\n#if ( 201907 <= __cpp_lib_three_way_comparison ) && __has_include( <compare> ) && !defined( VULKAN_HPP_NO_SPACESHIP_OPERATOR )\n#  define VULKAN_HPP_HAS_SPACESHIP_OPERATOR\n#endif\n\n#if ( 201803 <= __cpp_lib_span )\n#  define VULKAN_HPP_SUPPORT_SPAN\n#endif\n\n#if defined( __cpp_lib_modules ) && !defined( VULKAN_HPP_STD_MODULE ) && defined( VULKAN_HPP_ENABLE_STD_MODULE )\n#  define VULKAN_HPP_STD_MODULE std.compat\n#endif\n\n#ifndef VK_USE_64_BIT_PTR_DEFINES\n#  if defined( __LP64__ ) || defined( _WIN64 ) || ( defined( __x86_64__ ) && !defined( __ILP32__ ) ) || defined( _M_X64 ) || defined( __ia64 ) || \\\n    defined( _M_IA64 ) || defined( __aarch64__ ) || defined( __powerpc64__ ) || ( defined( __riscv ) && __riscv_xlen == 64 )\n#    define VK_USE_64_BIT_PTR_DEFINES 1\n#  else\n#    define VK_USE_64_BIT_PTR_DEFINES 0\n#  endif\n#endif\n\n// 32-bit vulkan is not typesafe for non-dispatchable handles, so don't allow copy constructors on this platform by default.\n// To enable this feature on 32-bit platforms please #define VULKAN_HPP_TYPESAFE_CONVERSION 1\n// To disable this feature on 64-bit platforms please #define VULKAN_HPP_TYPESAFE_CONVERSION 0\n#if ( VK_USE_64_BIT_PTR_DEFINES == 1 )\n#  if !defined( VULKAN_HPP_TYPESAFE_CONVERSION )\n#    define VULKAN_HPP_TYPESAFE_CONVERSION 1\n#  endif\n#endif\n\n#if defined( __GNUC__ )\n#  define GCC_VERSION ( __GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ )\n#endif\n\n#if !defined( VULKAN_HPP_HAS_UNRESTRICTED_UNIONS )\n#  if defined( __clang__ )\n#    if __has_feature( cxx_unrestricted_unions )\n#      define VULKAN_HPP_HAS_UNRESTRICTED_UNIONS\n#    endif\n#  elif defined( __GNUC__ )\n#    if 40600 <= GCC_VERSION\n#      define VULKAN_HPP_HAS_UNRESTRICTED_UNIONS\n#    endif\n#  elif defined( _MSC_VER )\n#    if 1900 <= _MSC_VER\n#      define VULKAN_HPP_HAS_UNRESTRICTED_UNIONS\n#    endif\n#  endif\n#endif\n\n#if !defined( VULKAN_HPP_INLINE )\n#  if defined( __clang__ )\n#    if __has_attribute( always_inline )\n#      define VULKAN_HPP_INLINE __attribute__( ( always_inline ) ) __inline__\n#    else\n#      define VULKAN_HPP_INLINE inline\n#    endif\n#  elif defined( __GNUC__ )\n#    define VULKAN_HPP_INLINE __attribute__( ( always_inline ) ) __inline__\n#  elif defined( _MSC_VER )\n#    define VULKAN_HPP_INLINE inline\n#  else\n#    define VULKAN_HPP_INLINE inline\n#  endif\n#endif\n\n#if ( VULKAN_HPP_TYPESAFE_CONVERSION == 1 )\n#  define VULKAN_HPP_TYPESAFE_EXPLICIT\n#else\n#  define VULKAN_HPP_TYPESAFE_EXPLICIT explicit\n#endif\n\n#if defined( __cpp_constexpr )\n#  define VULKAN_HPP_CONSTEXPR constexpr\n#  if 201304 <= __cpp_constexpr\n#    define VULKAN_HPP_CONSTEXPR_14 constexpr\n#  else\n#    define VULKAN_HPP_CONSTEXPR_14\n#  endif\n#  if ( 201907 <= __cpp_constexpr ) && ( !defined( __GNUC__ ) || ( 110400 < GCC_VERSION ) )\n#    define VULKAN_HPP_CONSTEXPR_20 constexpr\n#  else\n#    define VULKAN_HPP_CONSTEXPR_20\n#  endif\n#  define VULKAN_HPP_CONST_OR_CONSTEXPR constexpr\n#else\n#  define VULKAN_HPP_CONSTEXPR\n#  define VULKAN_HPP_CONSTEXPR_14\n#  define VULKAN_HPP_CONST_OR_CONSTEXPR const\n#endif\n\n#if !defined( VULKAN_HPP_CONSTEXPR_INLINE )\n#  if 201606L <= __cpp_inline_variables\n#    define VULKAN_HPP_CONSTEXPR_INLINE VULKAN_HPP_CONSTEXPR inline\n#  else\n#    define VULKAN_HPP_CONSTEXPR_INLINE VULKAN_HPP_CONSTEXPR\n#  endif\n#endif\n\n#if !defined( VULKAN_HPP_NOEXCEPT )\n#  if defined( _MSC_VER ) && ( _MSC_VER <= 1800 )\n#    define VULKAN_HPP_NOEXCEPT\n#  else\n#    define VULKAN_HPP_NOEXCEPT     noexcept\n#    define VULKAN_HPP_HAS_NOEXCEPT 1\n#    if defined( VULKAN_HPP_NO_EXCEPTIONS )\n#      define VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS noexcept\n#    else\n#      define VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS\n#    endif\n#  endif\n#endif\n\n#if 14 <= VULKAN_HPP_CPP_VERSION\n#  define VULKAN_HPP_DEPRECATED( msg ) [[deprecated( msg )]]\n#else\n#  define VULKAN_HPP_DEPRECATED( msg )\n#endif\n\n#if 17 <= VULKAN_HPP_CPP_VERSION\n#  define VULKAN_HPP_DEPRECATED_17( msg ) [[deprecated( msg )]]\n#else\n#  define VULKAN_HPP_DEPRECATED_17( msg )\n#endif\n\n#if ( 17 <= VULKAN_HPP_CPP_VERSION ) && !defined( VULKAN_HPP_NO_NODISCARD_WARNINGS )\n#  define VULKAN_HPP_NODISCARD [[nodiscard]]\n#  if defined( VULKAN_HPP_NO_EXCEPTIONS )\n#    define VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS [[nodiscard]]\n#  else\n#    define VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS\n#  endif\n#else\n#  define VULKAN_HPP_NODISCARD\n#  define VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS\n#endif\n\n#if !defined( VULKAN_HPP_NAMESPACE )\n#  define VULKAN_HPP_NAMESPACE vk\n#endif\n\n#define VULKAN_HPP_STRINGIFY2( text ) #text\n#define VULKAN_HPP_STRINGIFY( text )  VULKAN_HPP_STRINGIFY2( text )\n#define VULKAN_HPP_NAMESPACE_STRING   VULKAN_HPP_STRINGIFY( VULKAN_HPP_NAMESPACE )\n\n#if !defined( VULKAN_HPP_DISPATCH_LOADER_DYNAMIC )\n#  if defined( VK_NO_PROTOTYPES )\n#    define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1\n#  else\n#    define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 0\n#  endif\n#endif\n\n#if !defined( VULKAN_HPP_STORAGE_API )\n#  if defined( VULKAN_HPP_STORAGE_SHARED )\n#    if defined( _MSC_VER )\n#      if defined( VULKAN_HPP_STORAGE_SHARED_EXPORT )\n#        define VULKAN_HPP_STORAGE_API __declspec( dllexport )\n#      else\n#        define VULKAN_HPP_STORAGE_API __declspec( dllimport )\n#      endif\n#    elif defined( __clang__ ) || defined( __GNUC__ )\n#      if defined( VULKAN_HPP_STORAGE_SHARED_EXPORT )\n#        define VULKAN_HPP_STORAGE_API __attribute__( ( visibility( \"default\" ) ) )\n#      else\n#        define VULKAN_HPP_STORAGE_API\n#      endif\n#    else\n#      define VULKAN_HPP_STORAGE_API\n#      pragma warning Unknown import / export semantics\n#    endif\n#  else\n#    define VULKAN_HPP_STORAGE_API\n#  endif\n#endif\n\nnamespace VULKAN_HPP_NAMESPACE\n{\n  namespace detail\n  {\n    class DispatchLoaderDynamic;\n\n#if !defined( VULKAN_HPP_DEFAULT_DISPATCHER )\n#  if VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1\n    extern VULKAN_HPP_STORAGE_API DispatchLoaderDynamic defaultDispatchLoaderDynamic;\n#  endif\n#endif\n  }  // namespace detail\n}  // namespace VULKAN_HPP_NAMESPACE\n\n#if !defined( VULKAN_HPP_DEFAULT_DISPATCHER )\n#  if VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1\n#    define VULKAN_HPP_DEFAULT_DISPATCHER ::VULKAN_HPP_NAMESPACE::detail::defaultDispatchLoaderDynamic\n#    define VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE                       \\\n      namespace VULKAN_HPP_NAMESPACE                                                 \\\n      {                                                                              \\\n        namespace detail                                                             \\\n        {                                                                            \\\n          VULKAN_HPP_STORAGE_API DispatchLoaderDynamic defaultDispatchLoaderDynamic; \\\n        }                                                                            \\\n      }\n#  else\n#    define VULKAN_HPP_DEFAULT_DISPATCHER ::VULKAN_HPP_NAMESPACE::detail::getDispatchLoaderStatic()\n#    define VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE\n#  endif\n#endif\n\n#if !defined( VULKAN_HPP_DEFAULT_DISPATCHER_TYPE )\n#  if VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1\n#    define VULKAN_HPP_DEFAULT_DISPATCHER_TYPE ::VULKAN_HPP_NAMESPACE::detail::DispatchLoaderDynamic\n#  else\n#    define VULKAN_HPP_DEFAULT_DISPATCHER_TYPE ::VULKAN_HPP_NAMESPACE::detail::DispatchLoaderStatic\n#  endif\n#endif\n\n#if defined( VULKAN_HPP_NO_DEFAULT_DISPATCHER )\n#  define VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT\n#  define VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT\n#  define VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT\n#else\n#  define VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT         = {}\n#  define VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT = nullptr\n#  define VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT       = VULKAN_HPP_DEFAULT_DISPATCHER\n#endif\n\n#if !defined( VULKAN_HPP_EXPECTED ) && ( 23 <= VULKAN_HPP_CPP_VERSION ) && defined( __cpp_lib_expected )\n#  if !( defined( VULKAN_HPP_ENABLE_STD_MODULE ) && defined( VULKAN_HPP_STD_MODULE ) )\n#    include <expected>\n#  endif\n#  define VULKAN_HPP_EXPECTED   std::expected\n#  define VULKAN_HPP_UNEXPECTED std::unexpected\n#endif\n\n#if !defined( VULKAN_HPP_RAII_NAMESPACE )\n#  define VULKAN_HPP_RAII_NAMESPACE raii\n#endif\n\n#if defined( VULKAN_HPP_NO_EXCEPTIONS ) && defined( VULKAN_HPP_EXPECTED )\n#  define VULKAN_HPP_RAII_NO_EXCEPTIONS\n#  define VULKAN_HPP_RAII_CREATE_NOEXCEPT noexcept\n#else\n#  define VULKAN_HPP_RAII_CREATE_NOEXCEPT\n#endif\n\n#endif"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_ios.h",
    "content": "#ifndef VULKAN_IOS_H_\n#define VULKAN_IOS_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// VK_MVK_ios_surface is a preprocessor guard. Do not pass it to API calls.\n#define VK_MVK_ios_surface 1\n#define VK_MVK_IOS_SURFACE_SPEC_VERSION   3\n#define VK_MVK_IOS_SURFACE_EXTENSION_NAME \"VK_MVK_ios_surface\"\ntypedef VkFlags VkIOSSurfaceCreateFlagsMVK;\ntypedef struct VkIOSSurfaceCreateInfoMVK {\n    VkStructureType               sType;\n    const void*                   pNext;\n    VkIOSSurfaceCreateFlagsMVK    flags;\n    const void*                   pView;\n} VkIOSSurfaceCreateInfoMVK;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateIOSSurfaceMVK)(VkInstance instance, const VkIOSSurfaceCreateInfoMVK* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateIOSSurfaceMVK(\n    VkInstance                                  instance,\n    const VkIOSSurfaceCreateInfoMVK*            pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSurfaceKHR*                               pSurface);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_macos.h",
    "content": "#ifndef VULKAN_MACOS_H_\n#define VULKAN_MACOS_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// VK_MVK_macos_surface is a preprocessor guard. Do not pass it to API calls.\n#define VK_MVK_macos_surface 1\n#define VK_MVK_MACOS_SURFACE_SPEC_VERSION 3\n#define VK_MVK_MACOS_SURFACE_EXTENSION_NAME \"VK_MVK_macos_surface\"\ntypedef VkFlags VkMacOSSurfaceCreateFlagsMVK;\ntypedef struct VkMacOSSurfaceCreateInfoMVK {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    VkMacOSSurfaceCreateFlagsMVK    flags;\n    const void*                     pView;\n} VkMacOSSurfaceCreateInfoMVK;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateMacOSSurfaceMVK)(VkInstance instance, const VkMacOSSurfaceCreateInfoMVK* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateMacOSSurfaceMVK(\n    VkInstance                                  instance,\n    const VkMacOSSurfaceCreateInfoMVK*          pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSurfaceKHR*                               pSurface);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_metal.h",
    "content": "#ifndef VULKAN_METAL_H_\n#define VULKAN_METAL_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// VK_EXT_metal_surface is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_metal_surface 1\n#ifdef __OBJC__\n@class CAMetalLayer;\n#else\ntypedef void CAMetalLayer;\n#endif\n\n#define VK_EXT_METAL_SURFACE_SPEC_VERSION 1\n#define VK_EXT_METAL_SURFACE_EXTENSION_NAME \"VK_EXT_metal_surface\"\ntypedef VkFlags VkMetalSurfaceCreateFlagsEXT;\ntypedef struct VkMetalSurfaceCreateInfoEXT {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    VkMetalSurfaceCreateFlagsEXT    flags;\n    const CAMetalLayer*             pLayer;\n} VkMetalSurfaceCreateInfoEXT;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateMetalSurfaceEXT)(VkInstance instance, const VkMetalSurfaceCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateMetalSurfaceEXT(\n    VkInstance                                  instance,\n    const VkMetalSurfaceCreateInfoEXT*          pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSurfaceKHR*                               pSurface);\n#endif\n\n\n// VK_EXT_metal_objects is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_metal_objects 1\n#ifdef __OBJC__\n@protocol MTLDevice;\ntypedef __unsafe_unretained id<MTLDevice> MTLDevice_id;\n#else\ntypedef void* MTLDevice_id;\n#endif\n\n#ifdef __OBJC__\n@protocol MTLCommandQueue;\ntypedef __unsafe_unretained id<MTLCommandQueue> MTLCommandQueue_id;\n#else\ntypedef void* MTLCommandQueue_id;\n#endif\n\n#ifdef __OBJC__\n@protocol MTLBuffer;\ntypedef __unsafe_unretained id<MTLBuffer> MTLBuffer_id;\n#else\ntypedef void* MTLBuffer_id;\n#endif\n\n#ifdef __OBJC__\n@protocol MTLTexture;\ntypedef __unsafe_unretained id<MTLTexture> MTLTexture_id;\n#else\ntypedef void* MTLTexture_id;\n#endif\n\ntypedef struct __IOSurface* IOSurfaceRef;\n#ifdef __OBJC__\n@protocol MTLSharedEvent;\ntypedef __unsafe_unretained id<MTLSharedEvent> MTLSharedEvent_id;\n#else\ntypedef void* MTLSharedEvent_id;\n#endif\n\n#define VK_EXT_METAL_OBJECTS_SPEC_VERSION 2\n#define VK_EXT_METAL_OBJECTS_EXTENSION_NAME \"VK_EXT_metal_objects\"\n\ntypedef enum VkExportMetalObjectTypeFlagBitsEXT {\n    VK_EXPORT_METAL_OBJECT_TYPE_METAL_DEVICE_BIT_EXT = 0x00000001,\n    VK_EXPORT_METAL_OBJECT_TYPE_METAL_COMMAND_QUEUE_BIT_EXT = 0x00000002,\n    VK_EXPORT_METAL_OBJECT_TYPE_METAL_BUFFER_BIT_EXT = 0x00000004,\n    VK_EXPORT_METAL_OBJECT_TYPE_METAL_TEXTURE_BIT_EXT = 0x00000008,\n    VK_EXPORT_METAL_OBJECT_TYPE_METAL_IOSURFACE_BIT_EXT = 0x00000010,\n    VK_EXPORT_METAL_OBJECT_TYPE_METAL_SHARED_EVENT_BIT_EXT = 0x00000020,\n    VK_EXPORT_METAL_OBJECT_TYPE_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkExportMetalObjectTypeFlagBitsEXT;\ntypedef VkFlags VkExportMetalObjectTypeFlagsEXT;\ntypedef struct VkExportMetalObjectCreateInfoEXT {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkExportMetalObjectTypeFlagBitsEXT    exportObjectType;\n} VkExportMetalObjectCreateInfoEXT;\n\ntypedef struct VkExportMetalObjectsInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n} VkExportMetalObjectsInfoEXT;\n\ntypedef struct VkExportMetalDeviceInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    MTLDevice_id       mtlDevice;\n} VkExportMetalDeviceInfoEXT;\n\ntypedef struct VkExportMetalCommandQueueInfoEXT {\n    VkStructureType       sType;\n    const void*           pNext;\n    VkQueue               queue;\n    MTLCommandQueue_id    mtlCommandQueue;\n} VkExportMetalCommandQueueInfoEXT;\n\ntypedef struct VkExportMetalBufferInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkDeviceMemory     memory;\n    MTLBuffer_id       mtlBuffer;\n} VkExportMetalBufferInfoEXT;\n\ntypedef struct VkImportMetalBufferInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    MTLBuffer_id       mtlBuffer;\n} VkImportMetalBufferInfoEXT;\n\ntypedef struct VkExportMetalTextureInfoEXT {\n    VkStructureType          sType;\n    const void*              pNext;\n    VkImage                  image;\n    VkImageView              imageView;\n    VkBufferView             bufferView;\n    VkImageAspectFlagBits    plane;\n    MTLTexture_id            mtlTexture;\n} VkExportMetalTextureInfoEXT;\n\ntypedef struct VkImportMetalTextureInfoEXT {\n    VkStructureType          sType;\n    const void*              pNext;\n    VkImageAspectFlagBits    plane;\n    MTLTexture_id            mtlTexture;\n} VkImportMetalTextureInfoEXT;\n\ntypedef struct VkExportMetalIOSurfaceInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkImage            image;\n    IOSurfaceRef       ioSurface;\n} VkExportMetalIOSurfaceInfoEXT;\n\ntypedef struct VkImportMetalIOSurfaceInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    IOSurfaceRef       ioSurface;\n} VkImportMetalIOSurfaceInfoEXT;\n\ntypedef struct VkExportMetalSharedEventInfoEXT {\n    VkStructureType      sType;\n    const void*          pNext;\n    VkSemaphore          semaphore;\n    VkEvent              event;\n    MTLSharedEvent_id    mtlSharedEvent;\n} VkExportMetalSharedEventInfoEXT;\n\ntypedef struct VkImportMetalSharedEventInfoEXT {\n    VkStructureType      sType;\n    const void*          pNext;\n    MTLSharedEvent_id    mtlSharedEvent;\n} VkImportMetalSharedEventInfoEXT;\n\ntypedef void (VKAPI_PTR *PFN_vkExportMetalObjectsEXT)(VkDevice device, VkExportMetalObjectsInfoEXT* pMetalObjectsInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkExportMetalObjectsEXT(\n    VkDevice                                    device,\n    VkExportMetalObjectsInfoEXT*                pMetalObjectsInfo);\n#endif\n\n\n// VK_EXT_external_memory_metal is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_external_memory_metal 1\n#define VK_EXT_EXTERNAL_MEMORY_METAL_SPEC_VERSION 1\n#define VK_EXT_EXTERNAL_MEMORY_METAL_EXTENSION_NAME \"VK_EXT_external_memory_metal\"\ntypedef struct VkImportMemoryMetalHandleInfoEXT {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkExternalMemoryHandleTypeFlagBits    handleType;\n    void*                                 handle;\n} VkImportMemoryMetalHandleInfoEXT;\n\ntypedef struct VkMemoryMetalHandlePropertiesEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           memoryTypeBits;\n} VkMemoryMetalHandlePropertiesEXT;\n\ntypedef struct VkMemoryGetMetalHandleInfoEXT {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkDeviceMemory                        memory;\n    VkExternalMemoryHandleTypeFlagBits    handleType;\n} VkMemoryGetMetalHandleInfoEXT;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetMemoryMetalHandleEXT)(VkDevice device, const VkMemoryGetMetalHandleInfoEXT* pGetMetalHandleInfo, void** pHandle);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetMemoryMetalHandlePropertiesEXT)(VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, const void* pHandle, VkMemoryMetalHandlePropertiesEXT* pMemoryMetalHandleProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryMetalHandleEXT(\n    VkDevice                                    device,\n    const VkMemoryGetMetalHandleInfoEXT*        pGetMetalHandleInfo,\n    void**                                      pHandle);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryMetalHandlePropertiesEXT(\n    VkDevice                                    device,\n    VkExternalMemoryHandleTypeFlagBits          handleType,\n    const void*                                 pHandle,\n    VkMemoryMetalHandlePropertiesEXT*           pMemoryMetalHandleProperties);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_raii.hpp",
    "content": "// Copyright 2015-2025 The Khronos Group Inc.\n//\n// SPDX-License-Identifier: Apache-2.0 OR MIT\n//\n\n// This header is generated from the Khronos Vulkan XML API Registry.\n\n#ifndef VULKAN_RAII_HPP\n#define VULKAN_RAII_HPP\n\n#include <vulkan/vulkan.hpp>\n#if !( defined( VULKAN_HPP_ENABLE_STD_MODULE ) && defined( VULKAN_HPP_STD_MODULE ) )\n#  include <memory>   // std::unique_ptr\n#  include <utility>  // std::forward\n#endif\n\n#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\nnamespace VULKAN_HPP_NAMESPACE\n{\n  namespace VULKAN_HPP_RAII_NAMESPACE\n  {\n    namespace detail\n    {\n      template <class T>\n      class CreateReturnType\n      {\n      public:\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        using Type = VULKAN_HPP_EXPECTED<T, VULKAN_HPP_NAMESPACE::Result>;\n#  else\n        using Type                                                              = T;\n#  endif\n      };\n\n      using PFN_dummy = void ( * )();\n\n      class ContextDispatcher : public ::VULKAN_HPP_NAMESPACE::detail::DispatchLoaderBase\n      {\n      public:\n        ContextDispatcher( PFN_vkGetInstanceProcAddr getProcAddr )\n          : vkGetInstanceProcAddr( getProcAddr )\n          //=== VK_VERSION_1_0 ===\n          , vkCreateInstance( PFN_vkCreateInstance( getProcAddr( NULL, \"vkCreateInstance\" ) ) )\n          , vkEnumerateInstanceExtensionProperties(\n              PFN_vkEnumerateInstanceExtensionProperties( getProcAddr( NULL, \"vkEnumerateInstanceExtensionProperties\" ) ) )\n          , vkEnumerateInstanceLayerProperties( PFN_vkEnumerateInstanceLayerProperties( getProcAddr( NULL, \"vkEnumerateInstanceLayerProperties\" ) ) )\n          //=== VK_VERSION_1_1 ===\n          , vkEnumerateInstanceVersion( PFN_vkEnumerateInstanceVersion( getProcAddr( NULL, \"vkEnumerateInstanceVersion\" ) ) )\n        {\n        }\n\n      public:\n        PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = 0;\n\n        //=== VK_VERSION_1_0 ===\n        PFN_vkCreateInstance                       vkCreateInstance                       = 0;\n        PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties = 0;\n        PFN_vkEnumerateInstanceLayerProperties     vkEnumerateInstanceLayerProperties     = 0;\n\n        //=== VK_VERSION_1_1 ===\n        PFN_vkEnumerateInstanceVersion vkEnumerateInstanceVersion = 0;\n      };\n\n      class InstanceDispatcher : public ::VULKAN_HPP_NAMESPACE::detail::DispatchLoaderBase\n      {\n      public:\n        InstanceDispatcher( PFN_vkGetInstanceProcAddr getProcAddr, VkInstance instance ) : vkGetInstanceProcAddr( getProcAddr )\n        {\n          //=== VK_VERSION_1_0 ===\n          vkDestroyInstance           = PFN_vkDestroyInstance( vkGetInstanceProcAddr( instance, \"vkDestroyInstance\" ) );\n          vkEnumeratePhysicalDevices  = PFN_vkEnumeratePhysicalDevices( vkGetInstanceProcAddr( instance, \"vkEnumeratePhysicalDevices\" ) );\n          vkGetPhysicalDeviceFeatures = PFN_vkGetPhysicalDeviceFeatures( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceFeatures\" ) );\n          vkGetPhysicalDeviceFormatProperties =\n            PFN_vkGetPhysicalDeviceFormatProperties( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceFormatProperties\" ) );\n          vkGetPhysicalDeviceImageFormatProperties =\n            PFN_vkGetPhysicalDeviceImageFormatProperties( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceImageFormatProperties\" ) );\n          vkGetPhysicalDeviceProperties = PFN_vkGetPhysicalDeviceProperties( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceProperties\" ) );\n          vkGetPhysicalDeviceQueueFamilyProperties =\n            PFN_vkGetPhysicalDeviceQueueFamilyProperties( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceQueueFamilyProperties\" ) );\n          vkGetPhysicalDeviceMemoryProperties =\n            PFN_vkGetPhysicalDeviceMemoryProperties( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceMemoryProperties\" ) );\n          vkCreateDevice = PFN_vkCreateDevice( vkGetInstanceProcAddr( instance, \"vkCreateDevice\" ) );\n          vkEnumerateDeviceExtensionProperties =\n            PFN_vkEnumerateDeviceExtensionProperties( vkGetInstanceProcAddr( instance, \"vkEnumerateDeviceExtensionProperties\" ) );\n          vkEnumerateDeviceLayerProperties = PFN_vkEnumerateDeviceLayerProperties( vkGetInstanceProcAddr( instance, \"vkEnumerateDeviceLayerProperties\" ) );\n          vkGetPhysicalDeviceSparseImageFormatProperties =\n            PFN_vkGetPhysicalDeviceSparseImageFormatProperties( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSparseImageFormatProperties\" ) );\n\n          //=== VK_VERSION_1_1 ===\n          vkEnumeratePhysicalDeviceGroups = PFN_vkEnumeratePhysicalDeviceGroups( vkGetInstanceProcAddr( instance, \"vkEnumeratePhysicalDeviceGroups\" ) );\n          vkGetPhysicalDeviceFeatures2    = PFN_vkGetPhysicalDeviceFeatures2( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceFeatures2\" ) );\n          vkGetPhysicalDeviceProperties2  = PFN_vkGetPhysicalDeviceProperties2( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceProperties2\" ) );\n          vkGetPhysicalDeviceFormatProperties2 =\n            PFN_vkGetPhysicalDeviceFormatProperties2( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceFormatProperties2\" ) );\n          vkGetPhysicalDeviceImageFormatProperties2 =\n            PFN_vkGetPhysicalDeviceImageFormatProperties2( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceImageFormatProperties2\" ) );\n          vkGetPhysicalDeviceQueueFamilyProperties2 =\n            PFN_vkGetPhysicalDeviceQueueFamilyProperties2( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceQueueFamilyProperties2\" ) );\n          vkGetPhysicalDeviceMemoryProperties2 =\n            PFN_vkGetPhysicalDeviceMemoryProperties2( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceMemoryProperties2\" ) );\n          vkGetPhysicalDeviceSparseImageFormatProperties2 =\n            PFN_vkGetPhysicalDeviceSparseImageFormatProperties2( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSparseImageFormatProperties2\" ) );\n          vkGetPhysicalDeviceExternalBufferProperties =\n            PFN_vkGetPhysicalDeviceExternalBufferProperties( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceExternalBufferProperties\" ) );\n          vkGetPhysicalDeviceExternalFenceProperties =\n            PFN_vkGetPhysicalDeviceExternalFenceProperties( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceExternalFenceProperties\" ) );\n          vkGetPhysicalDeviceExternalSemaphoreProperties =\n            PFN_vkGetPhysicalDeviceExternalSemaphoreProperties( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceExternalSemaphoreProperties\" ) );\n\n          //=== VK_VERSION_1_3 ===\n          vkGetPhysicalDeviceToolProperties = PFN_vkGetPhysicalDeviceToolProperties( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceToolProperties\" ) );\n\n          //=== VK_KHR_surface ===\n          vkDestroySurfaceKHR = PFN_vkDestroySurfaceKHR( vkGetInstanceProcAddr( instance, \"vkDestroySurfaceKHR\" ) );\n          vkGetPhysicalDeviceSurfaceSupportKHR =\n            PFN_vkGetPhysicalDeviceSurfaceSupportKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSurfaceSupportKHR\" ) );\n          vkGetPhysicalDeviceSurfaceCapabilitiesKHR =\n            PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSurfaceCapabilitiesKHR\" ) );\n          vkGetPhysicalDeviceSurfaceFormatsKHR =\n            PFN_vkGetPhysicalDeviceSurfaceFormatsKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSurfaceFormatsKHR\" ) );\n          vkGetPhysicalDeviceSurfacePresentModesKHR =\n            PFN_vkGetPhysicalDeviceSurfacePresentModesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSurfacePresentModesKHR\" ) );\n\n          //=== VK_KHR_swapchain ===\n          vkGetPhysicalDevicePresentRectanglesKHR =\n            PFN_vkGetPhysicalDevicePresentRectanglesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDevicePresentRectanglesKHR\" ) );\n\n          //=== VK_KHR_display ===\n          vkGetPhysicalDeviceDisplayPropertiesKHR =\n            PFN_vkGetPhysicalDeviceDisplayPropertiesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceDisplayPropertiesKHR\" ) );\n          vkGetPhysicalDeviceDisplayPlanePropertiesKHR =\n            PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceDisplayPlanePropertiesKHR\" ) );\n          vkGetDisplayPlaneSupportedDisplaysKHR =\n            PFN_vkGetDisplayPlaneSupportedDisplaysKHR( vkGetInstanceProcAddr( instance, \"vkGetDisplayPlaneSupportedDisplaysKHR\" ) );\n          vkGetDisplayModePropertiesKHR    = PFN_vkGetDisplayModePropertiesKHR( vkGetInstanceProcAddr( instance, \"vkGetDisplayModePropertiesKHR\" ) );\n          vkCreateDisplayModeKHR           = PFN_vkCreateDisplayModeKHR( vkGetInstanceProcAddr( instance, \"vkCreateDisplayModeKHR\" ) );\n          vkGetDisplayPlaneCapabilitiesKHR = PFN_vkGetDisplayPlaneCapabilitiesKHR( vkGetInstanceProcAddr( instance, \"vkGetDisplayPlaneCapabilitiesKHR\" ) );\n          vkCreateDisplayPlaneSurfaceKHR   = PFN_vkCreateDisplayPlaneSurfaceKHR( vkGetInstanceProcAddr( instance, \"vkCreateDisplayPlaneSurfaceKHR\" ) );\n\n#  if defined( VK_USE_PLATFORM_XLIB_KHR )\n          //=== VK_KHR_xlib_surface ===\n          vkCreateXlibSurfaceKHR = PFN_vkCreateXlibSurfaceKHR( vkGetInstanceProcAddr( instance, \"vkCreateXlibSurfaceKHR\" ) );\n          vkGetPhysicalDeviceXlibPresentationSupportKHR =\n            PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceXlibPresentationSupportKHR\" ) );\n#  endif /*VK_USE_PLATFORM_XLIB_KHR*/\n\n#  if defined( VK_USE_PLATFORM_XCB_KHR )\n          //=== VK_KHR_xcb_surface ===\n          vkCreateXcbSurfaceKHR = PFN_vkCreateXcbSurfaceKHR( vkGetInstanceProcAddr( instance, \"vkCreateXcbSurfaceKHR\" ) );\n          vkGetPhysicalDeviceXcbPresentationSupportKHR =\n            PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceXcbPresentationSupportKHR\" ) );\n#  endif /*VK_USE_PLATFORM_XCB_KHR*/\n\n#  if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n          //=== VK_KHR_wayland_surface ===\n          vkCreateWaylandSurfaceKHR = PFN_vkCreateWaylandSurfaceKHR( vkGetInstanceProcAddr( instance, \"vkCreateWaylandSurfaceKHR\" ) );\n          vkGetPhysicalDeviceWaylandPresentationSupportKHR =\n            PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceWaylandPresentationSupportKHR\" ) );\n#  endif /*VK_USE_PLATFORM_WAYLAND_KHR*/\n\n#  if defined( VK_USE_PLATFORM_ANDROID_KHR )\n          //=== VK_KHR_android_surface ===\n          vkCreateAndroidSurfaceKHR = PFN_vkCreateAndroidSurfaceKHR( vkGetInstanceProcAddr( instance, \"vkCreateAndroidSurfaceKHR\" ) );\n#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n          //=== VK_KHR_win32_surface ===\n          vkCreateWin32SurfaceKHR = PFN_vkCreateWin32SurfaceKHR( vkGetInstanceProcAddr( instance, \"vkCreateWin32SurfaceKHR\" ) );\n          vkGetPhysicalDeviceWin32PresentationSupportKHR =\n            PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceWin32PresentationSupportKHR\" ) );\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n          //=== VK_EXT_debug_report ===\n          vkCreateDebugReportCallbackEXT  = PFN_vkCreateDebugReportCallbackEXT( vkGetInstanceProcAddr( instance, \"vkCreateDebugReportCallbackEXT\" ) );\n          vkDestroyDebugReportCallbackEXT = PFN_vkDestroyDebugReportCallbackEXT( vkGetInstanceProcAddr( instance, \"vkDestroyDebugReportCallbackEXT\" ) );\n          vkDebugReportMessageEXT         = PFN_vkDebugReportMessageEXT( vkGetInstanceProcAddr( instance, \"vkDebugReportMessageEXT\" ) );\n\n          //=== VK_KHR_video_queue ===\n          vkGetPhysicalDeviceVideoCapabilitiesKHR =\n            PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceVideoCapabilitiesKHR\" ) );\n          vkGetPhysicalDeviceVideoFormatPropertiesKHR =\n            PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceVideoFormatPropertiesKHR\" ) );\n\n#  if defined( VK_USE_PLATFORM_GGP )\n          //=== VK_GGP_stream_descriptor_surface ===\n          vkCreateStreamDescriptorSurfaceGGP =\n            PFN_vkCreateStreamDescriptorSurfaceGGP( vkGetInstanceProcAddr( instance, \"vkCreateStreamDescriptorSurfaceGGP\" ) );\n#  endif /*VK_USE_PLATFORM_GGP*/\n\n          //=== VK_NV_external_memory_capabilities ===\n          vkGetPhysicalDeviceExternalImageFormatPropertiesNV =\n            PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceExternalImageFormatPropertiesNV\" ) );\n\n          //=== VK_KHR_get_physical_device_properties2 ===\n          vkGetPhysicalDeviceFeatures2KHR = PFN_vkGetPhysicalDeviceFeatures2KHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceFeatures2KHR\" ) );\n          if ( !vkGetPhysicalDeviceFeatures2 )\n            vkGetPhysicalDeviceFeatures2 = vkGetPhysicalDeviceFeatures2KHR;\n          vkGetPhysicalDeviceProperties2KHR = PFN_vkGetPhysicalDeviceProperties2KHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceProperties2KHR\" ) );\n          if ( !vkGetPhysicalDeviceProperties2 )\n            vkGetPhysicalDeviceProperties2 = vkGetPhysicalDeviceProperties2KHR;\n          vkGetPhysicalDeviceFormatProperties2KHR =\n            PFN_vkGetPhysicalDeviceFormatProperties2KHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceFormatProperties2KHR\" ) );\n          if ( !vkGetPhysicalDeviceFormatProperties2 )\n            vkGetPhysicalDeviceFormatProperties2 = vkGetPhysicalDeviceFormatProperties2KHR;\n          vkGetPhysicalDeviceImageFormatProperties2KHR =\n            PFN_vkGetPhysicalDeviceImageFormatProperties2KHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceImageFormatProperties2KHR\" ) );\n          if ( !vkGetPhysicalDeviceImageFormatProperties2 )\n            vkGetPhysicalDeviceImageFormatProperties2 = vkGetPhysicalDeviceImageFormatProperties2KHR;\n          vkGetPhysicalDeviceQueueFamilyProperties2KHR =\n            PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceQueueFamilyProperties2KHR\" ) );\n          if ( !vkGetPhysicalDeviceQueueFamilyProperties2 )\n            vkGetPhysicalDeviceQueueFamilyProperties2 = vkGetPhysicalDeviceQueueFamilyProperties2KHR;\n          vkGetPhysicalDeviceMemoryProperties2KHR =\n            PFN_vkGetPhysicalDeviceMemoryProperties2KHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceMemoryProperties2KHR\" ) );\n          if ( !vkGetPhysicalDeviceMemoryProperties2 )\n            vkGetPhysicalDeviceMemoryProperties2 = vkGetPhysicalDeviceMemoryProperties2KHR;\n          vkGetPhysicalDeviceSparseImageFormatProperties2KHR =\n            PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSparseImageFormatProperties2KHR\" ) );\n          if ( !vkGetPhysicalDeviceSparseImageFormatProperties2 )\n            vkGetPhysicalDeviceSparseImageFormatProperties2 = vkGetPhysicalDeviceSparseImageFormatProperties2KHR;\n\n#  if defined( VK_USE_PLATFORM_VI_NN )\n          //=== VK_NN_vi_surface ===\n          vkCreateViSurfaceNN = PFN_vkCreateViSurfaceNN( vkGetInstanceProcAddr( instance, \"vkCreateViSurfaceNN\" ) );\n#  endif /*VK_USE_PLATFORM_VI_NN*/\n\n          //=== VK_KHR_device_group_creation ===\n          vkEnumeratePhysicalDeviceGroupsKHR =\n            PFN_vkEnumeratePhysicalDeviceGroupsKHR( vkGetInstanceProcAddr( instance, \"vkEnumeratePhysicalDeviceGroupsKHR\" ) );\n          if ( !vkEnumeratePhysicalDeviceGroups )\n            vkEnumeratePhysicalDeviceGroups = vkEnumeratePhysicalDeviceGroupsKHR;\n\n          //=== VK_KHR_external_memory_capabilities ===\n          vkGetPhysicalDeviceExternalBufferPropertiesKHR =\n            PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceExternalBufferPropertiesKHR\" ) );\n          if ( !vkGetPhysicalDeviceExternalBufferProperties )\n            vkGetPhysicalDeviceExternalBufferProperties = vkGetPhysicalDeviceExternalBufferPropertiesKHR;\n\n          //=== VK_KHR_external_semaphore_capabilities ===\n          vkGetPhysicalDeviceExternalSemaphorePropertiesKHR =\n            PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceExternalSemaphorePropertiesKHR\" ) );\n          if ( !vkGetPhysicalDeviceExternalSemaphoreProperties )\n            vkGetPhysicalDeviceExternalSemaphoreProperties = vkGetPhysicalDeviceExternalSemaphorePropertiesKHR;\n\n          //=== VK_EXT_direct_mode_display ===\n          vkReleaseDisplayEXT = PFN_vkReleaseDisplayEXT( vkGetInstanceProcAddr( instance, \"vkReleaseDisplayEXT\" ) );\n\n#  if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )\n          //=== VK_EXT_acquire_xlib_display ===\n          vkAcquireXlibDisplayEXT    = PFN_vkAcquireXlibDisplayEXT( vkGetInstanceProcAddr( instance, \"vkAcquireXlibDisplayEXT\" ) );\n          vkGetRandROutputDisplayEXT = PFN_vkGetRandROutputDisplayEXT( vkGetInstanceProcAddr( instance, \"vkGetRandROutputDisplayEXT\" ) );\n#  endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/\n\n          //=== VK_EXT_display_surface_counter ===\n          vkGetPhysicalDeviceSurfaceCapabilities2EXT =\n            PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSurfaceCapabilities2EXT\" ) );\n\n          //=== VK_KHR_external_fence_capabilities ===\n          vkGetPhysicalDeviceExternalFencePropertiesKHR =\n            PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceExternalFencePropertiesKHR\" ) );\n          if ( !vkGetPhysicalDeviceExternalFenceProperties )\n            vkGetPhysicalDeviceExternalFenceProperties = vkGetPhysicalDeviceExternalFencePropertiesKHR;\n\n          //=== VK_KHR_performance_query ===\n          vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR = PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(\n            vkGetInstanceProcAddr( instance, \"vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR\" ) );\n          vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR = PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(\n            vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR\" ) );\n\n          //=== VK_KHR_get_surface_capabilities2 ===\n          vkGetPhysicalDeviceSurfaceCapabilities2KHR =\n            PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSurfaceCapabilities2KHR\" ) );\n          vkGetPhysicalDeviceSurfaceFormats2KHR =\n            PFN_vkGetPhysicalDeviceSurfaceFormats2KHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSurfaceFormats2KHR\" ) );\n\n          //=== VK_KHR_get_display_properties2 ===\n          vkGetPhysicalDeviceDisplayProperties2KHR =\n            PFN_vkGetPhysicalDeviceDisplayProperties2KHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceDisplayProperties2KHR\" ) );\n          vkGetPhysicalDeviceDisplayPlaneProperties2KHR =\n            PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceDisplayPlaneProperties2KHR\" ) );\n          vkGetDisplayModeProperties2KHR    = PFN_vkGetDisplayModeProperties2KHR( vkGetInstanceProcAddr( instance, \"vkGetDisplayModeProperties2KHR\" ) );\n          vkGetDisplayPlaneCapabilities2KHR = PFN_vkGetDisplayPlaneCapabilities2KHR( vkGetInstanceProcAddr( instance, \"vkGetDisplayPlaneCapabilities2KHR\" ) );\n\n#  if defined( VK_USE_PLATFORM_IOS_MVK )\n          //=== VK_MVK_ios_surface ===\n          vkCreateIOSSurfaceMVK = PFN_vkCreateIOSSurfaceMVK( vkGetInstanceProcAddr( instance, \"vkCreateIOSSurfaceMVK\" ) );\n#  endif /*VK_USE_PLATFORM_IOS_MVK*/\n\n#  if defined( VK_USE_PLATFORM_MACOS_MVK )\n          //=== VK_MVK_macos_surface ===\n          vkCreateMacOSSurfaceMVK = PFN_vkCreateMacOSSurfaceMVK( vkGetInstanceProcAddr( instance, \"vkCreateMacOSSurfaceMVK\" ) );\n#  endif /*VK_USE_PLATFORM_MACOS_MVK*/\n\n          //=== VK_EXT_debug_utils ===\n          vkCreateDebugUtilsMessengerEXT  = PFN_vkCreateDebugUtilsMessengerEXT( vkGetInstanceProcAddr( instance, \"vkCreateDebugUtilsMessengerEXT\" ) );\n          vkDestroyDebugUtilsMessengerEXT = PFN_vkDestroyDebugUtilsMessengerEXT( vkGetInstanceProcAddr( instance, \"vkDestroyDebugUtilsMessengerEXT\" ) );\n          vkSubmitDebugUtilsMessageEXT    = PFN_vkSubmitDebugUtilsMessageEXT( vkGetInstanceProcAddr( instance, \"vkSubmitDebugUtilsMessageEXT\" ) );\n\n          //=== VK_EXT_sample_locations ===\n          vkGetPhysicalDeviceMultisamplePropertiesEXT =\n            PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceMultisamplePropertiesEXT\" ) );\n\n          //=== VK_EXT_calibrated_timestamps ===\n          vkGetPhysicalDeviceCalibrateableTimeDomainsEXT =\n            PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceCalibrateableTimeDomainsEXT\" ) );\n          if ( !vkGetPhysicalDeviceCalibrateableTimeDomainsKHR )\n            vkGetPhysicalDeviceCalibrateableTimeDomainsKHR = vkGetPhysicalDeviceCalibrateableTimeDomainsEXT;\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n          //=== VK_FUCHSIA_imagepipe_surface ===\n          vkCreateImagePipeSurfaceFUCHSIA = PFN_vkCreateImagePipeSurfaceFUCHSIA( vkGetInstanceProcAddr( instance, \"vkCreateImagePipeSurfaceFUCHSIA\" ) );\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n          //=== VK_EXT_metal_surface ===\n          vkCreateMetalSurfaceEXT = PFN_vkCreateMetalSurfaceEXT( vkGetInstanceProcAddr( instance, \"vkCreateMetalSurfaceEXT\" ) );\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n          //=== VK_KHR_fragment_shading_rate ===\n          vkGetPhysicalDeviceFragmentShadingRatesKHR =\n            PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceFragmentShadingRatesKHR\" ) );\n\n          //=== VK_EXT_tooling_info ===\n          vkGetPhysicalDeviceToolPropertiesEXT =\n            PFN_vkGetPhysicalDeviceToolPropertiesEXT( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceToolPropertiesEXT\" ) );\n          if ( !vkGetPhysicalDeviceToolProperties )\n            vkGetPhysicalDeviceToolProperties = vkGetPhysicalDeviceToolPropertiesEXT;\n\n          //=== VK_NV_cooperative_matrix ===\n          vkGetPhysicalDeviceCooperativeMatrixPropertiesNV =\n            PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceCooperativeMatrixPropertiesNV\" ) );\n\n          //=== VK_NV_coverage_reduction_mode ===\n          vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV = PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(\n            vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV\" ) );\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n          //=== VK_EXT_full_screen_exclusive ===\n          vkGetPhysicalDeviceSurfacePresentModes2EXT =\n            PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceSurfacePresentModes2EXT\" ) );\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n          //=== VK_EXT_headless_surface ===\n          vkCreateHeadlessSurfaceEXT = PFN_vkCreateHeadlessSurfaceEXT( vkGetInstanceProcAddr( instance, \"vkCreateHeadlessSurfaceEXT\" ) );\n\n          //=== VK_EXT_acquire_drm_display ===\n          vkAcquireDrmDisplayEXT = PFN_vkAcquireDrmDisplayEXT( vkGetInstanceProcAddr( instance, \"vkAcquireDrmDisplayEXT\" ) );\n          vkGetDrmDisplayEXT     = PFN_vkGetDrmDisplayEXT( vkGetInstanceProcAddr( instance, \"vkGetDrmDisplayEXT\" ) );\n\n          //=== VK_KHR_video_encode_queue ===\n          vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR = PFN_vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR(\n            vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR\" ) );\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n          //=== VK_NV_acquire_winrt_display ===\n          vkAcquireWinrtDisplayNV = PFN_vkAcquireWinrtDisplayNV( vkGetInstanceProcAddr( instance, \"vkAcquireWinrtDisplayNV\" ) );\n          vkGetWinrtDisplayNV     = PFN_vkGetWinrtDisplayNV( vkGetInstanceProcAddr( instance, \"vkGetWinrtDisplayNV\" ) );\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#  if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n          //=== VK_EXT_directfb_surface ===\n          vkCreateDirectFBSurfaceEXT = PFN_vkCreateDirectFBSurfaceEXT( vkGetInstanceProcAddr( instance, \"vkCreateDirectFBSurfaceEXT\" ) );\n          vkGetPhysicalDeviceDirectFBPresentationSupportEXT =\n            PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceDirectFBPresentationSupportEXT\" ) );\n#  endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n\n#  if defined( VK_USE_PLATFORM_SCREEN_QNX )\n          //=== VK_QNX_screen_surface ===\n          vkCreateScreenSurfaceQNX = PFN_vkCreateScreenSurfaceQNX( vkGetInstanceProcAddr( instance, \"vkCreateScreenSurfaceQNX\" ) );\n          vkGetPhysicalDeviceScreenPresentationSupportQNX =\n            PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceScreenPresentationSupportQNX\" ) );\n#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n          //=== VK_NV_optical_flow ===\n          vkGetPhysicalDeviceOpticalFlowImageFormatsNV =\n            PFN_vkGetPhysicalDeviceOpticalFlowImageFormatsNV( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceOpticalFlowImageFormatsNV\" ) );\n\n          //=== VK_NV_cooperative_vector ===\n          vkGetPhysicalDeviceCooperativeVectorPropertiesNV =\n            PFN_vkGetPhysicalDeviceCooperativeVectorPropertiesNV( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceCooperativeVectorPropertiesNV\" ) );\n\n          //=== VK_KHR_cooperative_matrix ===\n          vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR =\n            PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR\" ) );\n\n          //=== VK_KHR_calibrated_timestamps ===\n          vkGetPhysicalDeviceCalibrateableTimeDomainsKHR =\n            PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsKHR( vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceCalibrateableTimeDomainsKHR\" ) );\n\n          //=== VK_NV_cooperative_matrix2 ===\n          vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV = PFN_vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV(\n            vkGetInstanceProcAddr( instance, \"vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV\" ) );\n\n          vkGetDeviceProcAddr = PFN_vkGetDeviceProcAddr( vkGetInstanceProcAddr( instance, \"vkGetDeviceProcAddr\" ) );\n        }\n\n      public:\n        //=== VK_VERSION_1_0 ===\n        PFN_vkDestroyInstance                              vkDestroyInstance                              = 0;\n        PFN_vkEnumeratePhysicalDevices                     vkEnumeratePhysicalDevices                     = 0;\n        PFN_vkGetPhysicalDeviceFeatures                    vkGetPhysicalDeviceFeatures                    = 0;\n        PFN_vkGetPhysicalDeviceFormatProperties            vkGetPhysicalDeviceFormatProperties            = 0;\n        PFN_vkGetPhysicalDeviceImageFormatProperties       vkGetPhysicalDeviceImageFormatProperties       = 0;\n        PFN_vkGetPhysicalDeviceProperties                  vkGetPhysicalDeviceProperties                  = 0;\n        PFN_vkGetPhysicalDeviceQueueFamilyProperties       vkGetPhysicalDeviceQueueFamilyProperties       = 0;\n        PFN_vkGetPhysicalDeviceMemoryProperties            vkGetPhysicalDeviceMemoryProperties            = 0;\n        PFN_vkGetInstanceProcAddr                          vkGetInstanceProcAddr                          = 0;\n        PFN_vkCreateDevice                                 vkCreateDevice                                 = 0;\n        PFN_vkEnumerateDeviceExtensionProperties           vkEnumerateDeviceExtensionProperties           = 0;\n        PFN_vkEnumerateDeviceLayerProperties               vkEnumerateDeviceLayerProperties               = 0;\n        PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties = 0;\n\n        //=== VK_VERSION_1_1 ===\n        PFN_vkEnumeratePhysicalDeviceGroups                 vkEnumeratePhysicalDeviceGroups                 = 0;\n        PFN_vkGetPhysicalDeviceFeatures2                    vkGetPhysicalDeviceFeatures2                    = 0;\n        PFN_vkGetPhysicalDeviceProperties2                  vkGetPhysicalDeviceProperties2                  = 0;\n        PFN_vkGetPhysicalDeviceFormatProperties2            vkGetPhysicalDeviceFormatProperties2            = 0;\n        PFN_vkGetPhysicalDeviceImageFormatProperties2       vkGetPhysicalDeviceImageFormatProperties2       = 0;\n        PFN_vkGetPhysicalDeviceQueueFamilyProperties2       vkGetPhysicalDeviceQueueFamilyProperties2       = 0;\n        PFN_vkGetPhysicalDeviceMemoryProperties2            vkGetPhysicalDeviceMemoryProperties2            = 0;\n        PFN_vkGetPhysicalDeviceSparseImageFormatProperties2 vkGetPhysicalDeviceSparseImageFormatProperties2 = 0;\n        PFN_vkGetPhysicalDeviceExternalBufferProperties     vkGetPhysicalDeviceExternalBufferProperties     = 0;\n        PFN_vkGetPhysicalDeviceExternalFenceProperties      vkGetPhysicalDeviceExternalFenceProperties      = 0;\n        PFN_vkGetPhysicalDeviceExternalSemaphoreProperties  vkGetPhysicalDeviceExternalSemaphoreProperties  = 0;\n\n        //=== VK_VERSION_1_3 ===\n        PFN_vkGetPhysicalDeviceToolProperties vkGetPhysicalDeviceToolProperties = 0;\n\n        //=== VK_KHR_surface ===\n        PFN_vkDestroySurfaceKHR                       vkDestroySurfaceKHR                       = 0;\n        PFN_vkGetPhysicalDeviceSurfaceSupportKHR      vkGetPhysicalDeviceSurfaceSupportKHR      = 0;\n        PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR = 0;\n        PFN_vkGetPhysicalDeviceSurfaceFormatsKHR      vkGetPhysicalDeviceSurfaceFormatsKHR      = 0;\n        PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR = 0;\n\n        //=== VK_KHR_swapchain ===\n        PFN_vkGetPhysicalDevicePresentRectanglesKHR vkGetPhysicalDevicePresentRectanglesKHR = 0;\n\n        //=== VK_KHR_display ===\n        PFN_vkGetPhysicalDeviceDisplayPropertiesKHR      vkGetPhysicalDeviceDisplayPropertiesKHR      = 0;\n        PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR vkGetPhysicalDeviceDisplayPlanePropertiesKHR = 0;\n        PFN_vkGetDisplayPlaneSupportedDisplaysKHR        vkGetDisplayPlaneSupportedDisplaysKHR        = 0;\n        PFN_vkGetDisplayModePropertiesKHR                vkGetDisplayModePropertiesKHR                = 0;\n        PFN_vkCreateDisplayModeKHR                       vkCreateDisplayModeKHR                       = 0;\n        PFN_vkGetDisplayPlaneCapabilitiesKHR             vkGetDisplayPlaneCapabilitiesKHR             = 0;\n        PFN_vkCreateDisplayPlaneSurfaceKHR               vkCreateDisplayPlaneSurfaceKHR               = 0;\n\n#  if defined( VK_USE_PLATFORM_XLIB_KHR )\n        //=== VK_KHR_xlib_surface ===\n        PFN_vkCreateXlibSurfaceKHR                        vkCreateXlibSurfaceKHR                        = 0;\n        PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR vkGetPhysicalDeviceXlibPresentationSupportKHR = 0;\n#  else\n        PFN_dummy vkCreateXlibSurfaceKHR_placeholder                            = 0;\n        PFN_dummy vkGetPhysicalDeviceXlibPresentationSupportKHR_placeholder     = 0;\n#  endif /*VK_USE_PLATFORM_XLIB_KHR*/\n\n#  if defined( VK_USE_PLATFORM_XCB_KHR )\n        //=== VK_KHR_xcb_surface ===\n        PFN_vkCreateXcbSurfaceKHR                        vkCreateXcbSurfaceKHR                        = 0;\n        PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR vkGetPhysicalDeviceXcbPresentationSupportKHR = 0;\n#  else\n        PFN_dummy vkCreateXcbSurfaceKHR_placeholder                             = 0;\n        PFN_dummy vkGetPhysicalDeviceXcbPresentationSupportKHR_placeholder      = 0;\n#  endif /*VK_USE_PLATFORM_XCB_KHR*/\n\n#  if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n        //=== VK_KHR_wayland_surface ===\n        PFN_vkCreateWaylandSurfaceKHR                        vkCreateWaylandSurfaceKHR                        = 0;\n        PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR vkGetPhysicalDeviceWaylandPresentationSupportKHR = 0;\n#  else\n        PFN_dummy vkCreateWaylandSurfaceKHR_placeholder                         = 0;\n        PFN_dummy vkGetPhysicalDeviceWaylandPresentationSupportKHR_placeholder  = 0;\n#  endif /*VK_USE_PLATFORM_WAYLAND_KHR*/\n\n#  if defined( VK_USE_PLATFORM_ANDROID_KHR )\n        //=== VK_KHR_android_surface ===\n        PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR = 0;\n#  else\n        PFN_dummy vkCreateAndroidSurfaceKHR_placeholder                         = 0;\n#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n        //=== VK_KHR_win32_surface ===\n        PFN_vkCreateWin32SurfaceKHR                        vkCreateWin32SurfaceKHR                        = 0;\n        PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR vkGetPhysicalDeviceWin32PresentationSupportKHR = 0;\n#  else\n        PFN_dummy vkCreateWin32SurfaceKHR_placeholder                           = 0;\n        PFN_dummy vkGetPhysicalDeviceWin32PresentationSupportKHR_placeholder    = 0;\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n        //=== VK_EXT_debug_report ===\n        PFN_vkCreateDebugReportCallbackEXT  vkCreateDebugReportCallbackEXT  = 0;\n        PFN_vkDestroyDebugReportCallbackEXT vkDestroyDebugReportCallbackEXT = 0;\n        PFN_vkDebugReportMessageEXT         vkDebugReportMessageEXT         = 0;\n\n        //=== VK_KHR_video_queue ===\n        PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR     vkGetPhysicalDeviceVideoCapabilitiesKHR     = 0;\n        PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR vkGetPhysicalDeviceVideoFormatPropertiesKHR = 0;\n\n#  if defined( VK_USE_PLATFORM_GGP )\n        //=== VK_GGP_stream_descriptor_surface ===\n        PFN_vkCreateStreamDescriptorSurfaceGGP vkCreateStreamDescriptorSurfaceGGP = 0;\n#  else\n        PFN_dummy vkCreateStreamDescriptorSurfaceGGP_placeholder                = 0;\n#  endif /*VK_USE_PLATFORM_GGP*/\n\n        //=== VK_NV_external_memory_capabilities ===\n        PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV vkGetPhysicalDeviceExternalImageFormatPropertiesNV = 0;\n\n        //=== VK_KHR_get_physical_device_properties2 ===\n        PFN_vkGetPhysicalDeviceFeatures2KHR                    vkGetPhysicalDeviceFeatures2KHR                    = 0;\n        PFN_vkGetPhysicalDeviceProperties2KHR                  vkGetPhysicalDeviceProperties2KHR                  = 0;\n        PFN_vkGetPhysicalDeviceFormatProperties2KHR            vkGetPhysicalDeviceFormatProperties2KHR            = 0;\n        PFN_vkGetPhysicalDeviceImageFormatProperties2KHR       vkGetPhysicalDeviceImageFormatProperties2KHR       = 0;\n        PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR       vkGetPhysicalDeviceQueueFamilyProperties2KHR       = 0;\n        PFN_vkGetPhysicalDeviceMemoryProperties2KHR            vkGetPhysicalDeviceMemoryProperties2KHR            = 0;\n        PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR vkGetPhysicalDeviceSparseImageFormatProperties2KHR = 0;\n\n#  if defined( VK_USE_PLATFORM_VI_NN )\n        //=== VK_NN_vi_surface ===\n        PFN_vkCreateViSurfaceNN vkCreateViSurfaceNN = 0;\n#  else\n        PFN_dummy vkCreateViSurfaceNN_placeholder                               = 0;\n#  endif /*VK_USE_PLATFORM_VI_NN*/\n\n        //=== VK_KHR_device_group_creation ===\n        PFN_vkEnumeratePhysicalDeviceGroupsKHR vkEnumeratePhysicalDeviceGroupsKHR = 0;\n\n        //=== VK_KHR_external_memory_capabilities ===\n        PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR vkGetPhysicalDeviceExternalBufferPropertiesKHR = 0;\n\n        //=== VK_KHR_external_semaphore_capabilities ===\n        PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR vkGetPhysicalDeviceExternalSemaphorePropertiesKHR = 0;\n\n        //=== VK_EXT_direct_mode_display ===\n        PFN_vkReleaseDisplayEXT vkReleaseDisplayEXT = 0;\n\n#  if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )\n        //=== VK_EXT_acquire_xlib_display ===\n        PFN_vkAcquireXlibDisplayEXT    vkAcquireXlibDisplayEXT    = 0;\n        PFN_vkGetRandROutputDisplayEXT vkGetRandROutputDisplayEXT = 0;\n#  else\n        PFN_dummy vkAcquireXlibDisplayEXT_placeholder                           = 0;\n        PFN_dummy vkGetRandROutputDisplayEXT_placeholder                        = 0;\n#  endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/\n\n        //=== VK_EXT_display_surface_counter ===\n        PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT vkGetPhysicalDeviceSurfaceCapabilities2EXT = 0;\n\n        //=== VK_KHR_external_fence_capabilities ===\n        PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR vkGetPhysicalDeviceExternalFencePropertiesKHR = 0;\n\n        //=== VK_KHR_performance_query ===\n        PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR = 0;\n        PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR         vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR         = 0;\n\n        //=== VK_KHR_get_surface_capabilities2 ===\n        PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR vkGetPhysicalDeviceSurfaceCapabilities2KHR = 0;\n        PFN_vkGetPhysicalDeviceSurfaceFormats2KHR      vkGetPhysicalDeviceSurfaceFormats2KHR      = 0;\n\n        //=== VK_KHR_get_display_properties2 ===\n        PFN_vkGetPhysicalDeviceDisplayProperties2KHR      vkGetPhysicalDeviceDisplayProperties2KHR      = 0;\n        PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR vkGetPhysicalDeviceDisplayPlaneProperties2KHR = 0;\n        PFN_vkGetDisplayModeProperties2KHR                vkGetDisplayModeProperties2KHR                = 0;\n        PFN_vkGetDisplayPlaneCapabilities2KHR             vkGetDisplayPlaneCapabilities2KHR             = 0;\n\n#  if defined( VK_USE_PLATFORM_IOS_MVK )\n        //=== VK_MVK_ios_surface ===\n        PFN_vkCreateIOSSurfaceMVK vkCreateIOSSurfaceMVK = 0;\n#  else\n        PFN_dummy vkCreateIOSSurfaceMVK_placeholder                             = 0;\n#  endif /*VK_USE_PLATFORM_IOS_MVK*/\n\n#  if defined( VK_USE_PLATFORM_MACOS_MVK )\n        //=== VK_MVK_macos_surface ===\n        PFN_vkCreateMacOSSurfaceMVK vkCreateMacOSSurfaceMVK = 0;\n#  else\n        PFN_dummy vkCreateMacOSSurfaceMVK_placeholder                           = 0;\n#  endif /*VK_USE_PLATFORM_MACOS_MVK*/\n\n        //=== VK_EXT_debug_utils ===\n        PFN_vkCreateDebugUtilsMessengerEXT  vkCreateDebugUtilsMessengerEXT  = 0;\n        PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT = 0;\n        PFN_vkSubmitDebugUtilsMessageEXT    vkSubmitDebugUtilsMessageEXT    = 0;\n\n        //=== VK_EXT_sample_locations ===\n        PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT vkGetPhysicalDeviceMultisamplePropertiesEXT = 0;\n\n        //=== VK_EXT_calibrated_timestamps ===\n        PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT vkGetPhysicalDeviceCalibrateableTimeDomainsEXT = 0;\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n        //=== VK_FUCHSIA_imagepipe_surface ===\n        PFN_vkCreateImagePipeSurfaceFUCHSIA vkCreateImagePipeSurfaceFUCHSIA = 0;\n#  else\n        PFN_dummy vkCreateImagePipeSurfaceFUCHSIA_placeholder                   = 0;\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n        //=== VK_EXT_metal_surface ===\n        PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT = 0;\n#  else\n        PFN_dummy vkCreateMetalSurfaceEXT_placeholder                           = 0;\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n        //=== VK_KHR_fragment_shading_rate ===\n        PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR vkGetPhysicalDeviceFragmentShadingRatesKHR = 0;\n\n        //=== VK_EXT_tooling_info ===\n        PFN_vkGetPhysicalDeviceToolPropertiesEXT vkGetPhysicalDeviceToolPropertiesEXT = 0;\n\n        //=== VK_NV_cooperative_matrix ===\n        PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV vkGetPhysicalDeviceCooperativeMatrixPropertiesNV = 0;\n\n        //=== VK_NV_coverage_reduction_mode ===\n        PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV = 0;\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n        //=== VK_EXT_full_screen_exclusive ===\n        PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT vkGetPhysicalDeviceSurfacePresentModes2EXT = 0;\n#  else\n        PFN_dummy vkGetPhysicalDeviceSurfacePresentModes2EXT_placeholder        = 0;\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n        //=== VK_EXT_headless_surface ===\n        PFN_vkCreateHeadlessSurfaceEXT vkCreateHeadlessSurfaceEXT = 0;\n\n        //=== VK_EXT_acquire_drm_display ===\n        PFN_vkAcquireDrmDisplayEXT vkAcquireDrmDisplayEXT = 0;\n        PFN_vkGetDrmDisplayEXT     vkGetDrmDisplayEXT     = 0;\n\n        //=== VK_KHR_video_encode_queue ===\n        PFN_vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR = 0;\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n        //=== VK_NV_acquire_winrt_display ===\n        PFN_vkAcquireWinrtDisplayNV vkAcquireWinrtDisplayNV = 0;\n        PFN_vkGetWinrtDisplayNV     vkGetWinrtDisplayNV     = 0;\n#  else\n        PFN_dummy vkAcquireWinrtDisplayNV_placeholder                           = 0;\n        PFN_dummy vkGetWinrtDisplayNV_placeholder                               = 0;\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#  if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n        //=== VK_EXT_directfb_surface ===\n        PFN_vkCreateDirectFBSurfaceEXT                        vkCreateDirectFBSurfaceEXT                        = 0;\n        PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT vkGetPhysicalDeviceDirectFBPresentationSupportEXT = 0;\n#  else\n        PFN_dummy vkCreateDirectFBSurfaceEXT_placeholder                        = 0;\n        PFN_dummy vkGetPhysicalDeviceDirectFBPresentationSupportEXT_placeholder = 0;\n#  endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n\n#  if defined( VK_USE_PLATFORM_SCREEN_QNX )\n        //=== VK_QNX_screen_surface ===\n        PFN_vkCreateScreenSurfaceQNX                        vkCreateScreenSurfaceQNX                        = 0;\n        PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX vkGetPhysicalDeviceScreenPresentationSupportQNX = 0;\n#  else\n        PFN_dummy vkCreateScreenSurfaceQNX_placeholder                          = 0;\n        PFN_dummy vkGetPhysicalDeviceScreenPresentationSupportQNX_placeholder   = 0;\n#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n        //=== VK_NV_optical_flow ===\n        PFN_vkGetPhysicalDeviceOpticalFlowImageFormatsNV vkGetPhysicalDeviceOpticalFlowImageFormatsNV = 0;\n\n        //=== VK_NV_cooperative_vector ===\n        PFN_vkGetPhysicalDeviceCooperativeVectorPropertiesNV vkGetPhysicalDeviceCooperativeVectorPropertiesNV = 0;\n\n        //=== VK_KHR_cooperative_matrix ===\n        PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR = 0;\n\n        //=== VK_KHR_calibrated_timestamps ===\n        PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsKHR vkGetPhysicalDeviceCalibrateableTimeDomainsKHR = 0;\n\n        //=== VK_NV_cooperative_matrix2 ===\n        PFN_vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV = 0;\n\n        PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr = 0;\n      };\n\n      class DeviceDispatcher : public ::VULKAN_HPP_NAMESPACE::detail::DispatchLoaderBase\n      {\n      public:\n        DeviceDispatcher( PFN_vkGetDeviceProcAddr getProcAddr, VkDevice device ) : vkGetDeviceProcAddr( getProcAddr )\n        {\n          //=== VK_VERSION_1_0 ===\n          vkGetDeviceProcAddr                = PFN_vkGetDeviceProcAddr( vkGetDeviceProcAddr( device, \"vkGetDeviceProcAddr\" ) );\n          vkDestroyDevice                    = PFN_vkDestroyDevice( vkGetDeviceProcAddr( device, \"vkDestroyDevice\" ) );\n          vkGetDeviceQueue                   = PFN_vkGetDeviceQueue( vkGetDeviceProcAddr( device, \"vkGetDeviceQueue\" ) );\n          vkQueueSubmit                      = PFN_vkQueueSubmit( vkGetDeviceProcAddr( device, \"vkQueueSubmit\" ) );\n          vkQueueWaitIdle                    = PFN_vkQueueWaitIdle( vkGetDeviceProcAddr( device, \"vkQueueWaitIdle\" ) );\n          vkDeviceWaitIdle                   = PFN_vkDeviceWaitIdle( vkGetDeviceProcAddr( device, \"vkDeviceWaitIdle\" ) );\n          vkAllocateMemory                   = PFN_vkAllocateMemory( vkGetDeviceProcAddr( device, \"vkAllocateMemory\" ) );\n          vkFreeMemory                       = PFN_vkFreeMemory( vkGetDeviceProcAddr( device, \"vkFreeMemory\" ) );\n          vkMapMemory                        = PFN_vkMapMemory( vkGetDeviceProcAddr( device, \"vkMapMemory\" ) );\n          vkUnmapMemory                      = PFN_vkUnmapMemory( vkGetDeviceProcAddr( device, \"vkUnmapMemory\" ) );\n          vkFlushMappedMemoryRanges          = PFN_vkFlushMappedMemoryRanges( vkGetDeviceProcAddr( device, \"vkFlushMappedMemoryRanges\" ) );\n          vkInvalidateMappedMemoryRanges     = PFN_vkInvalidateMappedMemoryRanges( vkGetDeviceProcAddr( device, \"vkInvalidateMappedMemoryRanges\" ) );\n          vkGetDeviceMemoryCommitment        = PFN_vkGetDeviceMemoryCommitment( vkGetDeviceProcAddr( device, \"vkGetDeviceMemoryCommitment\" ) );\n          vkBindBufferMemory                 = PFN_vkBindBufferMemory( vkGetDeviceProcAddr( device, \"vkBindBufferMemory\" ) );\n          vkBindImageMemory                  = PFN_vkBindImageMemory( vkGetDeviceProcAddr( device, \"vkBindImageMemory\" ) );\n          vkGetBufferMemoryRequirements      = PFN_vkGetBufferMemoryRequirements( vkGetDeviceProcAddr( device, \"vkGetBufferMemoryRequirements\" ) );\n          vkGetImageMemoryRequirements       = PFN_vkGetImageMemoryRequirements( vkGetDeviceProcAddr( device, \"vkGetImageMemoryRequirements\" ) );\n          vkGetImageSparseMemoryRequirements = PFN_vkGetImageSparseMemoryRequirements( vkGetDeviceProcAddr( device, \"vkGetImageSparseMemoryRequirements\" ) );\n          vkQueueBindSparse                  = PFN_vkQueueBindSparse( vkGetDeviceProcAddr( device, \"vkQueueBindSparse\" ) );\n          vkCreateFence                      = PFN_vkCreateFence( vkGetDeviceProcAddr( device, \"vkCreateFence\" ) );\n          vkDestroyFence                     = PFN_vkDestroyFence( vkGetDeviceProcAddr( device, \"vkDestroyFence\" ) );\n          vkResetFences                      = PFN_vkResetFences( vkGetDeviceProcAddr( device, \"vkResetFences\" ) );\n          vkGetFenceStatus                   = PFN_vkGetFenceStatus( vkGetDeviceProcAddr( device, \"vkGetFenceStatus\" ) );\n          vkWaitForFences                    = PFN_vkWaitForFences( vkGetDeviceProcAddr( device, \"vkWaitForFences\" ) );\n          vkCreateSemaphore                  = PFN_vkCreateSemaphore( vkGetDeviceProcAddr( device, \"vkCreateSemaphore\" ) );\n          vkDestroySemaphore                 = PFN_vkDestroySemaphore( vkGetDeviceProcAddr( device, \"vkDestroySemaphore\" ) );\n          vkCreateEvent                      = PFN_vkCreateEvent( vkGetDeviceProcAddr( device, \"vkCreateEvent\" ) );\n          vkDestroyEvent                     = PFN_vkDestroyEvent( vkGetDeviceProcAddr( device, \"vkDestroyEvent\" ) );\n          vkGetEventStatus                   = PFN_vkGetEventStatus( vkGetDeviceProcAddr( device, \"vkGetEventStatus\" ) );\n          vkSetEvent                         = PFN_vkSetEvent( vkGetDeviceProcAddr( device, \"vkSetEvent\" ) );\n          vkResetEvent                       = PFN_vkResetEvent( vkGetDeviceProcAddr( device, \"vkResetEvent\" ) );\n          vkCreateQueryPool                  = PFN_vkCreateQueryPool( vkGetDeviceProcAddr( device, \"vkCreateQueryPool\" ) );\n          vkDestroyQueryPool                 = PFN_vkDestroyQueryPool( vkGetDeviceProcAddr( device, \"vkDestroyQueryPool\" ) );\n          vkGetQueryPoolResults              = PFN_vkGetQueryPoolResults( vkGetDeviceProcAddr( device, \"vkGetQueryPoolResults\" ) );\n          vkCreateBuffer                     = PFN_vkCreateBuffer( vkGetDeviceProcAddr( device, \"vkCreateBuffer\" ) );\n          vkDestroyBuffer                    = PFN_vkDestroyBuffer( vkGetDeviceProcAddr( device, \"vkDestroyBuffer\" ) );\n          vkCreateBufferView                 = PFN_vkCreateBufferView( vkGetDeviceProcAddr( device, \"vkCreateBufferView\" ) );\n          vkDestroyBufferView                = PFN_vkDestroyBufferView( vkGetDeviceProcAddr( device, \"vkDestroyBufferView\" ) );\n          vkCreateImage                      = PFN_vkCreateImage( vkGetDeviceProcAddr( device, \"vkCreateImage\" ) );\n          vkDestroyImage                     = PFN_vkDestroyImage( vkGetDeviceProcAddr( device, \"vkDestroyImage\" ) );\n          vkGetImageSubresourceLayout        = PFN_vkGetImageSubresourceLayout( vkGetDeviceProcAddr( device, \"vkGetImageSubresourceLayout\" ) );\n          vkCreateImageView                  = PFN_vkCreateImageView( vkGetDeviceProcAddr( device, \"vkCreateImageView\" ) );\n          vkDestroyImageView                 = PFN_vkDestroyImageView( vkGetDeviceProcAddr( device, \"vkDestroyImageView\" ) );\n          vkCreateShaderModule               = PFN_vkCreateShaderModule( vkGetDeviceProcAddr( device, \"vkCreateShaderModule\" ) );\n          vkDestroyShaderModule              = PFN_vkDestroyShaderModule( vkGetDeviceProcAddr( device, \"vkDestroyShaderModule\" ) );\n          vkCreatePipelineCache              = PFN_vkCreatePipelineCache( vkGetDeviceProcAddr( device, \"vkCreatePipelineCache\" ) );\n          vkDestroyPipelineCache             = PFN_vkDestroyPipelineCache( vkGetDeviceProcAddr( device, \"vkDestroyPipelineCache\" ) );\n          vkGetPipelineCacheData             = PFN_vkGetPipelineCacheData( vkGetDeviceProcAddr( device, \"vkGetPipelineCacheData\" ) );\n          vkMergePipelineCaches              = PFN_vkMergePipelineCaches( vkGetDeviceProcAddr( device, \"vkMergePipelineCaches\" ) );\n          vkCreateGraphicsPipelines          = PFN_vkCreateGraphicsPipelines( vkGetDeviceProcAddr( device, \"vkCreateGraphicsPipelines\" ) );\n          vkCreateComputePipelines           = PFN_vkCreateComputePipelines( vkGetDeviceProcAddr( device, \"vkCreateComputePipelines\" ) );\n          vkDestroyPipeline                  = PFN_vkDestroyPipeline( vkGetDeviceProcAddr( device, \"vkDestroyPipeline\" ) );\n          vkCreatePipelineLayout             = PFN_vkCreatePipelineLayout( vkGetDeviceProcAddr( device, \"vkCreatePipelineLayout\" ) );\n          vkDestroyPipelineLayout            = PFN_vkDestroyPipelineLayout( vkGetDeviceProcAddr( device, \"vkDestroyPipelineLayout\" ) );\n          vkCreateSampler                    = PFN_vkCreateSampler( vkGetDeviceProcAddr( device, \"vkCreateSampler\" ) );\n          vkDestroySampler                   = PFN_vkDestroySampler( vkGetDeviceProcAddr( device, \"vkDestroySampler\" ) );\n          vkCreateDescriptorSetLayout        = PFN_vkCreateDescriptorSetLayout( vkGetDeviceProcAddr( device, \"vkCreateDescriptorSetLayout\" ) );\n          vkDestroyDescriptorSetLayout       = PFN_vkDestroyDescriptorSetLayout( vkGetDeviceProcAddr( device, \"vkDestroyDescriptorSetLayout\" ) );\n          vkCreateDescriptorPool             = PFN_vkCreateDescriptorPool( vkGetDeviceProcAddr( device, \"vkCreateDescriptorPool\" ) );\n          vkDestroyDescriptorPool            = PFN_vkDestroyDescriptorPool( vkGetDeviceProcAddr( device, \"vkDestroyDescriptorPool\" ) );\n          vkResetDescriptorPool              = PFN_vkResetDescriptorPool( vkGetDeviceProcAddr( device, \"vkResetDescriptorPool\" ) );\n          vkAllocateDescriptorSets           = PFN_vkAllocateDescriptorSets( vkGetDeviceProcAddr( device, \"vkAllocateDescriptorSets\" ) );\n          vkFreeDescriptorSets               = PFN_vkFreeDescriptorSets( vkGetDeviceProcAddr( device, \"vkFreeDescriptorSets\" ) );\n          vkUpdateDescriptorSets             = PFN_vkUpdateDescriptorSets( vkGetDeviceProcAddr( device, \"vkUpdateDescriptorSets\" ) );\n          vkCreateFramebuffer                = PFN_vkCreateFramebuffer( vkGetDeviceProcAddr( device, \"vkCreateFramebuffer\" ) );\n          vkDestroyFramebuffer               = PFN_vkDestroyFramebuffer( vkGetDeviceProcAddr( device, \"vkDestroyFramebuffer\" ) );\n          vkCreateRenderPass                 = PFN_vkCreateRenderPass( vkGetDeviceProcAddr( device, \"vkCreateRenderPass\" ) );\n          vkDestroyRenderPass                = PFN_vkDestroyRenderPass( vkGetDeviceProcAddr( device, \"vkDestroyRenderPass\" ) );\n          vkGetRenderAreaGranularity         = PFN_vkGetRenderAreaGranularity( vkGetDeviceProcAddr( device, \"vkGetRenderAreaGranularity\" ) );\n          vkCreateCommandPool                = PFN_vkCreateCommandPool( vkGetDeviceProcAddr( device, \"vkCreateCommandPool\" ) );\n          vkDestroyCommandPool               = PFN_vkDestroyCommandPool( vkGetDeviceProcAddr( device, \"vkDestroyCommandPool\" ) );\n          vkResetCommandPool                 = PFN_vkResetCommandPool( vkGetDeviceProcAddr( device, \"vkResetCommandPool\" ) );\n          vkAllocateCommandBuffers           = PFN_vkAllocateCommandBuffers( vkGetDeviceProcAddr( device, \"vkAllocateCommandBuffers\" ) );\n          vkFreeCommandBuffers               = PFN_vkFreeCommandBuffers( vkGetDeviceProcAddr( device, \"vkFreeCommandBuffers\" ) );\n          vkBeginCommandBuffer               = PFN_vkBeginCommandBuffer( vkGetDeviceProcAddr( device, \"vkBeginCommandBuffer\" ) );\n          vkEndCommandBuffer                 = PFN_vkEndCommandBuffer( vkGetDeviceProcAddr( device, \"vkEndCommandBuffer\" ) );\n          vkResetCommandBuffer               = PFN_vkResetCommandBuffer( vkGetDeviceProcAddr( device, \"vkResetCommandBuffer\" ) );\n          vkCmdBindPipeline                  = PFN_vkCmdBindPipeline( vkGetDeviceProcAddr( device, \"vkCmdBindPipeline\" ) );\n          vkCmdSetViewport                   = PFN_vkCmdSetViewport( vkGetDeviceProcAddr( device, \"vkCmdSetViewport\" ) );\n          vkCmdSetScissor                    = PFN_vkCmdSetScissor( vkGetDeviceProcAddr( device, \"vkCmdSetScissor\" ) );\n          vkCmdSetLineWidth                  = PFN_vkCmdSetLineWidth( vkGetDeviceProcAddr( device, \"vkCmdSetLineWidth\" ) );\n          vkCmdSetDepthBias                  = PFN_vkCmdSetDepthBias( vkGetDeviceProcAddr( device, \"vkCmdSetDepthBias\" ) );\n          vkCmdSetBlendConstants             = PFN_vkCmdSetBlendConstants( vkGetDeviceProcAddr( device, \"vkCmdSetBlendConstants\" ) );\n          vkCmdSetDepthBounds                = PFN_vkCmdSetDepthBounds( vkGetDeviceProcAddr( device, \"vkCmdSetDepthBounds\" ) );\n          vkCmdSetStencilCompareMask         = PFN_vkCmdSetStencilCompareMask( vkGetDeviceProcAddr( device, \"vkCmdSetStencilCompareMask\" ) );\n          vkCmdSetStencilWriteMask           = PFN_vkCmdSetStencilWriteMask( vkGetDeviceProcAddr( device, \"vkCmdSetStencilWriteMask\" ) );\n          vkCmdSetStencilReference           = PFN_vkCmdSetStencilReference( vkGetDeviceProcAddr( device, \"vkCmdSetStencilReference\" ) );\n          vkCmdBindDescriptorSets            = PFN_vkCmdBindDescriptorSets( vkGetDeviceProcAddr( device, \"vkCmdBindDescriptorSets\" ) );\n          vkCmdBindIndexBuffer               = PFN_vkCmdBindIndexBuffer( vkGetDeviceProcAddr( device, \"vkCmdBindIndexBuffer\" ) );\n          vkCmdBindVertexBuffers             = PFN_vkCmdBindVertexBuffers( vkGetDeviceProcAddr( device, \"vkCmdBindVertexBuffers\" ) );\n          vkCmdDraw                          = PFN_vkCmdDraw( vkGetDeviceProcAddr( device, \"vkCmdDraw\" ) );\n          vkCmdDrawIndexed                   = PFN_vkCmdDrawIndexed( vkGetDeviceProcAddr( device, \"vkCmdDrawIndexed\" ) );\n          vkCmdDrawIndirect                  = PFN_vkCmdDrawIndirect( vkGetDeviceProcAddr( device, \"vkCmdDrawIndirect\" ) );\n          vkCmdDrawIndexedIndirect           = PFN_vkCmdDrawIndexedIndirect( vkGetDeviceProcAddr( device, \"vkCmdDrawIndexedIndirect\" ) );\n          vkCmdDispatch                      = PFN_vkCmdDispatch( vkGetDeviceProcAddr( device, \"vkCmdDispatch\" ) );\n          vkCmdDispatchIndirect              = PFN_vkCmdDispatchIndirect( vkGetDeviceProcAddr( device, \"vkCmdDispatchIndirect\" ) );\n          vkCmdCopyBuffer                    = PFN_vkCmdCopyBuffer( vkGetDeviceProcAddr( device, \"vkCmdCopyBuffer\" ) );\n          vkCmdCopyImage                     = PFN_vkCmdCopyImage( vkGetDeviceProcAddr( device, \"vkCmdCopyImage\" ) );\n          vkCmdBlitImage                     = PFN_vkCmdBlitImage( vkGetDeviceProcAddr( device, \"vkCmdBlitImage\" ) );\n          vkCmdCopyBufferToImage             = PFN_vkCmdCopyBufferToImage( vkGetDeviceProcAddr( device, \"vkCmdCopyBufferToImage\" ) );\n          vkCmdCopyImageToBuffer             = PFN_vkCmdCopyImageToBuffer( vkGetDeviceProcAddr( device, \"vkCmdCopyImageToBuffer\" ) );\n          vkCmdUpdateBuffer                  = PFN_vkCmdUpdateBuffer( vkGetDeviceProcAddr( device, \"vkCmdUpdateBuffer\" ) );\n          vkCmdFillBuffer                    = PFN_vkCmdFillBuffer( vkGetDeviceProcAddr( device, \"vkCmdFillBuffer\" ) );\n          vkCmdClearColorImage               = PFN_vkCmdClearColorImage( vkGetDeviceProcAddr( device, \"vkCmdClearColorImage\" ) );\n          vkCmdClearDepthStencilImage        = PFN_vkCmdClearDepthStencilImage( vkGetDeviceProcAddr( device, \"vkCmdClearDepthStencilImage\" ) );\n          vkCmdClearAttachments              = PFN_vkCmdClearAttachments( vkGetDeviceProcAddr( device, \"vkCmdClearAttachments\" ) );\n          vkCmdResolveImage                  = PFN_vkCmdResolveImage( vkGetDeviceProcAddr( device, \"vkCmdResolveImage\" ) );\n          vkCmdSetEvent                      = PFN_vkCmdSetEvent( vkGetDeviceProcAddr( device, \"vkCmdSetEvent\" ) );\n          vkCmdResetEvent                    = PFN_vkCmdResetEvent( vkGetDeviceProcAddr( device, \"vkCmdResetEvent\" ) );\n          vkCmdWaitEvents                    = PFN_vkCmdWaitEvents( vkGetDeviceProcAddr( device, \"vkCmdWaitEvents\" ) );\n          vkCmdPipelineBarrier               = PFN_vkCmdPipelineBarrier( vkGetDeviceProcAddr( device, \"vkCmdPipelineBarrier\" ) );\n          vkCmdBeginQuery                    = PFN_vkCmdBeginQuery( vkGetDeviceProcAddr( device, \"vkCmdBeginQuery\" ) );\n          vkCmdEndQuery                      = PFN_vkCmdEndQuery( vkGetDeviceProcAddr( device, \"vkCmdEndQuery\" ) );\n          vkCmdResetQueryPool                = PFN_vkCmdResetQueryPool( vkGetDeviceProcAddr( device, \"vkCmdResetQueryPool\" ) );\n          vkCmdWriteTimestamp                = PFN_vkCmdWriteTimestamp( vkGetDeviceProcAddr( device, \"vkCmdWriteTimestamp\" ) );\n          vkCmdCopyQueryPoolResults          = PFN_vkCmdCopyQueryPoolResults( vkGetDeviceProcAddr( device, \"vkCmdCopyQueryPoolResults\" ) );\n          vkCmdPushConstants                 = PFN_vkCmdPushConstants( vkGetDeviceProcAddr( device, \"vkCmdPushConstants\" ) );\n          vkCmdBeginRenderPass               = PFN_vkCmdBeginRenderPass( vkGetDeviceProcAddr( device, \"vkCmdBeginRenderPass\" ) );\n          vkCmdNextSubpass                   = PFN_vkCmdNextSubpass( vkGetDeviceProcAddr( device, \"vkCmdNextSubpass\" ) );\n          vkCmdEndRenderPass                 = PFN_vkCmdEndRenderPass( vkGetDeviceProcAddr( device, \"vkCmdEndRenderPass\" ) );\n          vkCmdExecuteCommands               = PFN_vkCmdExecuteCommands( vkGetDeviceProcAddr( device, \"vkCmdExecuteCommands\" ) );\n\n          //=== VK_VERSION_1_1 ===\n          vkBindBufferMemory2                 = PFN_vkBindBufferMemory2( vkGetDeviceProcAddr( device, \"vkBindBufferMemory2\" ) );\n          vkBindImageMemory2                  = PFN_vkBindImageMemory2( vkGetDeviceProcAddr( device, \"vkBindImageMemory2\" ) );\n          vkGetDeviceGroupPeerMemoryFeatures  = PFN_vkGetDeviceGroupPeerMemoryFeatures( vkGetDeviceProcAddr( device, \"vkGetDeviceGroupPeerMemoryFeatures\" ) );\n          vkCmdSetDeviceMask                  = PFN_vkCmdSetDeviceMask( vkGetDeviceProcAddr( device, \"vkCmdSetDeviceMask\" ) );\n          vkCmdDispatchBase                   = PFN_vkCmdDispatchBase( vkGetDeviceProcAddr( device, \"vkCmdDispatchBase\" ) );\n          vkGetImageMemoryRequirements2       = PFN_vkGetImageMemoryRequirements2( vkGetDeviceProcAddr( device, \"vkGetImageMemoryRequirements2\" ) );\n          vkGetBufferMemoryRequirements2      = PFN_vkGetBufferMemoryRequirements2( vkGetDeviceProcAddr( device, \"vkGetBufferMemoryRequirements2\" ) );\n          vkGetImageSparseMemoryRequirements2 = PFN_vkGetImageSparseMemoryRequirements2( vkGetDeviceProcAddr( device, \"vkGetImageSparseMemoryRequirements2\" ) );\n          vkTrimCommandPool                   = PFN_vkTrimCommandPool( vkGetDeviceProcAddr( device, \"vkTrimCommandPool\" ) );\n          vkGetDeviceQueue2                   = PFN_vkGetDeviceQueue2( vkGetDeviceProcAddr( device, \"vkGetDeviceQueue2\" ) );\n          vkCreateSamplerYcbcrConversion      = PFN_vkCreateSamplerYcbcrConversion( vkGetDeviceProcAddr( device, \"vkCreateSamplerYcbcrConversion\" ) );\n          vkDestroySamplerYcbcrConversion     = PFN_vkDestroySamplerYcbcrConversion( vkGetDeviceProcAddr( device, \"vkDestroySamplerYcbcrConversion\" ) );\n          vkCreateDescriptorUpdateTemplate    = PFN_vkCreateDescriptorUpdateTemplate( vkGetDeviceProcAddr( device, \"vkCreateDescriptorUpdateTemplate\" ) );\n          vkDestroyDescriptorUpdateTemplate   = PFN_vkDestroyDescriptorUpdateTemplate( vkGetDeviceProcAddr( device, \"vkDestroyDescriptorUpdateTemplate\" ) );\n          vkUpdateDescriptorSetWithTemplate   = PFN_vkUpdateDescriptorSetWithTemplate( vkGetDeviceProcAddr( device, \"vkUpdateDescriptorSetWithTemplate\" ) );\n          vkGetDescriptorSetLayoutSupport     = PFN_vkGetDescriptorSetLayoutSupport( vkGetDeviceProcAddr( device, \"vkGetDescriptorSetLayoutSupport\" ) );\n\n          //=== VK_VERSION_1_2 ===\n          vkCmdDrawIndirectCount          = PFN_vkCmdDrawIndirectCount( vkGetDeviceProcAddr( device, \"vkCmdDrawIndirectCount\" ) );\n          vkCmdDrawIndexedIndirectCount   = PFN_vkCmdDrawIndexedIndirectCount( vkGetDeviceProcAddr( device, \"vkCmdDrawIndexedIndirectCount\" ) );\n          vkCreateRenderPass2             = PFN_vkCreateRenderPass2( vkGetDeviceProcAddr( device, \"vkCreateRenderPass2\" ) );\n          vkCmdBeginRenderPass2           = PFN_vkCmdBeginRenderPass2( vkGetDeviceProcAddr( device, \"vkCmdBeginRenderPass2\" ) );\n          vkCmdNextSubpass2               = PFN_vkCmdNextSubpass2( vkGetDeviceProcAddr( device, \"vkCmdNextSubpass2\" ) );\n          vkCmdEndRenderPass2             = PFN_vkCmdEndRenderPass2( vkGetDeviceProcAddr( device, \"vkCmdEndRenderPass2\" ) );\n          vkResetQueryPool                = PFN_vkResetQueryPool( vkGetDeviceProcAddr( device, \"vkResetQueryPool\" ) );\n          vkGetSemaphoreCounterValue      = PFN_vkGetSemaphoreCounterValue( vkGetDeviceProcAddr( device, \"vkGetSemaphoreCounterValue\" ) );\n          vkWaitSemaphores                = PFN_vkWaitSemaphores( vkGetDeviceProcAddr( device, \"vkWaitSemaphores\" ) );\n          vkSignalSemaphore               = PFN_vkSignalSemaphore( vkGetDeviceProcAddr( device, \"vkSignalSemaphore\" ) );\n          vkGetBufferDeviceAddress        = PFN_vkGetBufferDeviceAddress( vkGetDeviceProcAddr( device, \"vkGetBufferDeviceAddress\" ) );\n          vkGetBufferOpaqueCaptureAddress = PFN_vkGetBufferOpaqueCaptureAddress( vkGetDeviceProcAddr( device, \"vkGetBufferOpaqueCaptureAddress\" ) );\n          vkGetDeviceMemoryOpaqueCaptureAddress =\n            PFN_vkGetDeviceMemoryOpaqueCaptureAddress( vkGetDeviceProcAddr( device, \"vkGetDeviceMemoryOpaqueCaptureAddress\" ) );\n\n          //=== VK_VERSION_1_3 ===\n          vkCreatePrivateDataSlot             = PFN_vkCreatePrivateDataSlot( vkGetDeviceProcAddr( device, \"vkCreatePrivateDataSlot\" ) );\n          vkDestroyPrivateDataSlot            = PFN_vkDestroyPrivateDataSlot( vkGetDeviceProcAddr( device, \"vkDestroyPrivateDataSlot\" ) );\n          vkSetPrivateData                    = PFN_vkSetPrivateData( vkGetDeviceProcAddr( device, \"vkSetPrivateData\" ) );\n          vkGetPrivateData                    = PFN_vkGetPrivateData( vkGetDeviceProcAddr( device, \"vkGetPrivateData\" ) );\n          vkCmdSetEvent2                      = PFN_vkCmdSetEvent2( vkGetDeviceProcAddr( device, \"vkCmdSetEvent2\" ) );\n          vkCmdResetEvent2                    = PFN_vkCmdResetEvent2( vkGetDeviceProcAddr( device, \"vkCmdResetEvent2\" ) );\n          vkCmdWaitEvents2                    = PFN_vkCmdWaitEvents2( vkGetDeviceProcAddr( device, \"vkCmdWaitEvents2\" ) );\n          vkCmdPipelineBarrier2               = PFN_vkCmdPipelineBarrier2( vkGetDeviceProcAddr( device, \"vkCmdPipelineBarrier2\" ) );\n          vkCmdWriteTimestamp2                = PFN_vkCmdWriteTimestamp2( vkGetDeviceProcAddr( device, \"vkCmdWriteTimestamp2\" ) );\n          vkQueueSubmit2                      = PFN_vkQueueSubmit2( vkGetDeviceProcAddr( device, \"vkQueueSubmit2\" ) );\n          vkCmdCopyBuffer2                    = PFN_vkCmdCopyBuffer2( vkGetDeviceProcAddr( device, \"vkCmdCopyBuffer2\" ) );\n          vkCmdCopyImage2                     = PFN_vkCmdCopyImage2( vkGetDeviceProcAddr( device, \"vkCmdCopyImage2\" ) );\n          vkCmdCopyBufferToImage2             = PFN_vkCmdCopyBufferToImage2( vkGetDeviceProcAddr( device, \"vkCmdCopyBufferToImage2\" ) );\n          vkCmdCopyImageToBuffer2             = PFN_vkCmdCopyImageToBuffer2( vkGetDeviceProcAddr( device, \"vkCmdCopyImageToBuffer2\" ) );\n          vkCmdBlitImage2                     = PFN_vkCmdBlitImage2( vkGetDeviceProcAddr( device, \"vkCmdBlitImage2\" ) );\n          vkCmdResolveImage2                  = PFN_vkCmdResolveImage2( vkGetDeviceProcAddr( device, \"vkCmdResolveImage2\" ) );\n          vkCmdBeginRendering                 = PFN_vkCmdBeginRendering( vkGetDeviceProcAddr( device, \"vkCmdBeginRendering\" ) );\n          vkCmdEndRendering                   = PFN_vkCmdEndRendering( vkGetDeviceProcAddr( device, \"vkCmdEndRendering\" ) );\n          vkCmdSetCullMode                    = PFN_vkCmdSetCullMode( vkGetDeviceProcAddr( device, \"vkCmdSetCullMode\" ) );\n          vkCmdSetFrontFace                   = PFN_vkCmdSetFrontFace( vkGetDeviceProcAddr( device, \"vkCmdSetFrontFace\" ) );\n          vkCmdSetPrimitiveTopology           = PFN_vkCmdSetPrimitiveTopology( vkGetDeviceProcAddr( device, \"vkCmdSetPrimitiveTopology\" ) );\n          vkCmdSetViewportWithCount           = PFN_vkCmdSetViewportWithCount( vkGetDeviceProcAddr( device, \"vkCmdSetViewportWithCount\" ) );\n          vkCmdSetScissorWithCount            = PFN_vkCmdSetScissorWithCount( vkGetDeviceProcAddr( device, \"vkCmdSetScissorWithCount\" ) );\n          vkCmdBindVertexBuffers2             = PFN_vkCmdBindVertexBuffers2( vkGetDeviceProcAddr( device, \"vkCmdBindVertexBuffers2\" ) );\n          vkCmdSetDepthTestEnable             = PFN_vkCmdSetDepthTestEnable( vkGetDeviceProcAddr( device, \"vkCmdSetDepthTestEnable\" ) );\n          vkCmdSetDepthWriteEnable            = PFN_vkCmdSetDepthWriteEnable( vkGetDeviceProcAddr( device, \"vkCmdSetDepthWriteEnable\" ) );\n          vkCmdSetDepthCompareOp              = PFN_vkCmdSetDepthCompareOp( vkGetDeviceProcAddr( device, \"vkCmdSetDepthCompareOp\" ) );\n          vkCmdSetDepthBoundsTestEnable       = PFN_vkCmdSetDepthBoundsTestEnable( vkGetDeviceProcAddr( device, \"vkCmdSetDepthBoundsTestEnable\" ) );\n          vkCmdSetStencilTestEnable           = PFN_vkCmdSetStencilTestEnable( vkGetDeviceProcAddr( device, \"vkCmdSetStencilTestEnable\" ) );\n          vkCmdSetStencilOp                   = PFN_vkCmdSetStencilOp( vkGetDeviceProcAddr( device, \"vkCmdSetStencilOp\" ) );\n          vkCmdSetRasterizerDiscardEnable     = PFN_vkCmdSetRasterizerDiscardEnable( vkGetDeviceProcAddr( device, \"vkCmdSetRasterizerDiscardEnable\" ) );\n          vkCmdSetDepthBiasEnable             = PFN_vkCmdSetDepthBiasEnable( vkGetDeviceProcAddr( device, \"vkCmdSetDepthBiasEnable\" ) );\n          vkCmdSetPrimitiveRestartEnable      = PFN_vkCmdSetPrimitiveRestartEnable( vkGetDeviceProcAddr( device, \"vkCmdSetPrimitiveRestartEnable\" ) );\n          vkGetDeviceBufferMemoryRequirements = PFN_vkGetDeviceBufferMemoryRequirements( vkGetDeviceProcAddr( device, \"vkGetDeviceBufferMemoryRequirements\" ) );\n          vkGetDeviceImageMemoryRequirements  = PFN_vkGetDeviceImageMemoryRequirements( vkGetDeviceProcAddr( device, \"vkGetDeviceImageMemoryRequirements\" ) );\n          vkGetDeviceImageSparseMemoryRequirements =\n            PFN_vkGetDeviceImageSparseMemoryRequirements( vkGetDeviceProcAddr( device, \"vkGetDeviceImageSparseMemoryRequirements\" ) );\n\n          //=== VK_VERSION_1_4 ===\n          vkCmdSetLineStipple                = PFN_vkCmdSetLineStipple( vkGetDeviceProcAddr( device, \"vkCmdSetLineStipple\" ) );\n          vkMapMemory2                       = PFN_vkMapMemory2( vkGetDeviceProcAddr( device, \"vkMapMemory2\" ) );\n          vkUnmapMemory2                     = PFN_vkUnmapMemory2( vkGetDeviceProcAddr( device, \"vkUnmapMemory2\" ) );\n          vkCmdBindIndexBuffer2              = PFN_vkCmdBindIndexBuffer2( vkGetDeviceProcAddr( device, \"vkCmdBindIndexBuffer2\" ) );\n          vkGetRenderingAreaGranularity      = PFN_vkGetRenderingAreaGranularity( vkGetDeviceProcAddr( device, \"vkGetRenderingAreaGranularity\" ) );\n          vkGetDeviceImageSubresourceLayout  = PFN_vkGetDeviceImageSubresourceLayout( vkGetDeviceProcAddr( device, \"vkGetDeviceImageSubresourceLayout\" ) );\n          vkGetImageSubresourceLayout2       = PFN_vkGetImageSubresourceLayout2( vkGetDeviceProcAddr( device, \"vkGetImageSubresourceLayout2\" ) );\n          vkCmdPushDescriptorSet             = PFN_vkCmdPushDescriptorSet( vkGetDeviceProcAddr( device, \"vkCmdPushDescriptorSet\" ) );\n          vkCmdPushDescriptorSetWithTemplate = PFN_vkCmdPushDescriptorSetWithTemplate( vkGetDeviceProcAddr( device, \"vkCmdPushDescriptorSetWithTemplate\" ) );\n          vkCmdSetRenderingAttachmentLocations =\n            PFN_vkCmdSetRenderingAttachmentLocations( vkGetDeviceProcAddr( device, \"vkCmdSetRenderingAttachmentLocations\" ) );\n          vkCmdSetRenderingInputAttachmentIndices =\n            PFN_vkCmdSetRenderingInputAttachmentIndices( vkGetDeviceProcAddr( device, \"vkCmdSetRenderingInputAttachmentIndices\" ) );\n          vkCmdBindDescriptorSets2            = PFN_vkCmdBindDescriptorSets2( vkGetDeviceProcAddr( device, \"vkCmdBindDescriptorSets2\" ) );\n          vkCmdPushConstants2                 = PFN_vkCmdPushConstants2( vkGetDeviceProcAddr( device, \"vkCmdPushConstants2\" ) );\n          vkCmdPushDescriptorSet2             = PFN_vkCmdPushDescriptorSet2( vkGetDeviceProcAddr( device, \"vkCmdPushDescriptorSet2\" ) );\n          vkCmdPushDescriptorSetWithTemplate2 = PFN_vkCmdPushDescriptorSetWithTemplate2( vkGetDeviceProcAddr( device, \"vkCmdPushDescriptorSetWithTemplate2\" ) );\n          vkCopyMemoryToImage                 = PFN_vkCopyMemoryToImage( vkGetDeviceProcAddr( device, \"vkCopyMemoryToImage\" ) );\n          vkCopyImageToMemory                 = PFN_vkCopyImageToMemory( vkGetDeviceProcAddr( device, \"vkCopyImageToMemory\" ) );\n          vkCopyImageToImage                  = PFN_vkCopyImageToImage( vkGetDeviceProcAddr( device, \"vkCopyImageToImage\" ) );\n          vkTransitionImageLayout             = PFN_vkTransitionImageLayout( vkGetDeviceProcAddr( device, \"vkTransitionImageLayout\" ) );\n\n          //=== VK_KHR_swapchain ===\n          vkCreateSwapchainKHR    = PFN_vkCreateSwapchainKHR( vkGetDeviceProcAddr( device, \"vkCreateSwapchainKHR\" ) );\n          vkDestroySwapchainKHR   = PFN_vkDestroySwapchainKHR( vkGetDeviceProcAddr( device, \"vkDestroySwapchainKHR\" ) );\n          vkGetSwapchainImagesKHR = PFN_vkGetSwapchainImagesKHR( vkGetDeviceProcAddr( device, \"vkGetSwapchainImagesKHR\" ) );\n          vkAcquireNextImageKHR   = PFN_vkAcquireNextImageKHR( vkGetDeviceProcAddr( device, \"vkAcquireNextImageKHR\" ) );\n          vkQueuePresentKHR       = PFN_vkQueuePresentKHR( vkGetDeviceProcAddr( device, \"vkQueuePresentKHR\" ) );\n          vkGetDeviceGroupPresentCapabilitiesKHR =\n            PFN_vkGetDeviceGroupPresentCapabilitiesKHR( vkGetDeviceProcAddr( device, \"vkGetDeviceGroupPresentCapabilitiesKHR\" ) );\n          vkGetDeviceGroupSurfacePresentModesKHR =\n            PFN_vkGetDeviceGroupSurfacePresentModesKHR( vkGetDeviceProcAddr( device, \"vkGetDeviceGroupSurfacePresentModesKHR\" ) );\n          vkAcquireNextImage2KHR = PFN_vkAcquireNextImage2KHR( vkGetDeviceProcAddr( device, \"vkAcquireNextImage2KHR\" ) );\n\n          //=== VK_KHR_display_swapchain ===\n          vkCreateSharedSwapchainsKHR = PFN_vkCreateSharedSwapchainsKHR( vkGetDeviceProcAddr( device, \"vkCreateSharedSwapchainsKHR\" ) );\n\n          //=== VK_EXT_debug_marker ===\n          vkDebugMarkerSetObjectTagEXT  = PFN_vkDebugMarkerSetObjectTagEXT( vkGetDeviceProcAddr( device, \"vkDebugMarkerSetObjectTagEXT\" ) );\n          vkDebugMarkerSetObjectNameEXT = PFN_vkDebugMarkerSetObjectNameEXT( vkGetDeviceProcAddr( device, \"vkDebugMarkerSetObjectNameEXT\" ) );\n          vkCmdDebugMarkerBeginEXT      = PFN_vkCmdDebugMarkerBeginEXT( vkGetDeviceProcAddr( device, \"vkCmdDebugMarkerBeginEXT\" ) );\n          vkCmdDebugMarkerEndEXT        = PFN_vkCmdDebugMarkerEndEXT( vkGetDeviceProcAddr( device, \"vkCmdDebugMarkerEndEXT\" ) );\n          vkCmdDebugMarkerInsertEXT     = PFN_vkCmdDebugMarkerInsertEXT( vkGetDeviceProcAddr( device, \"vkCmdDebugMarkerInsertEXT\" ) );\n\n          //=== VK_KHR_video_queue ===\n          vkCreateVideoSessionKHR  = PFN_vkCreateVideoSessionKHR( vkGetDeviceProcAddr( device, \"vkCreateVideoSessionKHR\" ) );\n          vkDestroyVideoSessionKHR = PFN_vkDestroyVideoSessionKHR( vkGetDeviceProcAddr( device, \"vkDestroyVideoSessionKHR\" ) );\n          vkGetVideoSessionMemoryRequirementsKHR =\n            PFN_vkGetVideoSessionMemoryRequirementsKHR( vkGetDeviceProcAddr( device, \"vkGetVideoSessionMemoryRequirementsKHR\" ) );\n          vkBindVideoSessionMemoryKHR        = PFN_vkBindVideoSessionMemoryKHR( vkGetDeviceProcAddr( device, \"vkBindVideoSessionMemoryKHR\" ) );\n          vkCreateVideoSessionParametersKHR  = PFN_vkCreateVideoSessionParametersKHR( vkGetDeviceProcAddr( device, \"vkCreateVideoSessionParametersKHR\" ) );\n          vkUpdateVideoSessionParametersKHR  = PFN_vkUpdateVideoSessionParametersKHR( vkGetDeviceProcAddr( device, \"vkUpdateVideoSessionParametersKHR\" ) );\n          vkDestroyVideoSessionParametersKHR = PFN_vkDestroyVideoSessionParametersKHR( vkGetDeviceProcAddr( device, \"vkDestroyVideoSessionParametersKHR\" ) );\n          vkCmdBeginVideoCodingKHR           = PFN_vkCmdBeginVideoCodingKHR( vkGetDeviceProcAddr( device, \"vkCmdBeginVideoCodingKHR\" ) );\n          vkCmdEndVideoCodingKHR             = PFN_vkCmdEndVideoCodingKHR( vkGetDeviceProcAddr( device, \"vkCmdEndVideoCodingKHR\" ) );\n          vkCmdControlVideoCodingKHR         = PFN_vkCmdControlVideoCodingKHR( vkGetDeviceProcAddr( device, \"vkCmdControlVideoCodingKHR\" ) );\n\n          //=== VK_KHR_video_decode_queue ===\n          vkCmdDecodeVideoKHR = PFN_vkCmdDecodeVideoKHR( vkGetDeviceProcAddr( device, \"vkCmdDecodeVideoKHR\" ) );\n\n          //=== VK_EXT_transform_feedback ===\n          vkCmdBindTransformFeedbackBuffersEXT =\n            PFN_vkCmdBindTransformFeedbackBuffersEXT( vkGetDeviceProcAddr( device, \"vkCmdBindTransformFeedbackBuffersEXT\" ) );\n          vkCmdBeginTransformFeedbackEXT = PFN_vkCmdBeginTransformFeedbackEXT( vkGetDeviceProcAddr( device, \"vkCmdBeginTransformFeedbackEXT\" ) );\n          vkCmdEndTransformFeedbackEXT   = PFN_vkCmdEndTransformFeedbackEXT( vkGetDeviceProcAddr( device, \"vkCmdEndTransformFeedbackEXT\" ) );\n          vkCmdBeginQueryIndexedEXT      = PFN_vkCmdBeginQueryIndexedEXT( vkGetDeviceProcAddr( device, \"vkCmdBeginQueryIndexedEXT\" ) );\n          vkCmdEndQueryIndexedEXT        = PFN_vkCmdEndQueryIndexedEXT( vkGetDeviceProcAddr( device, \"vkCmdEndQueryIndexedEXT\" ) );\n          vkCmdDrawIndirectByteCountEXT  = PFN_vkCmdDrawIndirectByteCountEXT( vkGetDeviceProcAddr( device, \"vkCmdDrawIndirectByteCountEXT\" ) );\n\n          //=== VK_NVX_binary_import ===\n          vkCreateCuModuleNVX    = PFN_vkCreateCuModuleNVX( vkGetDeviceProcAddr( device, \"vkCreateCuModuleNVX\" ) );\n          vkCreateCuFunctionNVX  = PFN_vkCreateCuFunctionNVX( vkGetDeviceProcAddr( device, \"vkCreateCuFunctionNVX\" ) );\n          vkDestroyCuModuleNVX   = PFN_vkDestroyCuModuleNVX( vkGetDeviceProcAddr( device, \"vkDestroyCuModuleNVX\" ) );\n          vkDestroyCuFunctionNVX = PFN_vkDestroyCuFunctionNVX( vkGetDeviceProcAddr( device, \"vkDestroyCuFunctionNVX\" ) );\n          vkCmdCuLaunchKernelNVX = PFN_vkCmdCuLaunchKernelNVX( vkGetDeviceProcAddr( device, \"vkCmdCuLaunchKernelNVX\" ) );\n\n          //=== VK_NVX_image_view_handle ===\n          vkGetImageViewHandleNVX   = PFN_vkGetImageViewHandleNVX( vkGetDeviceProcAddr( device, \"vkGetImageViewHandleNVX\" ) );\n          vkGetImageViewHandle64NVX = PFN_vkGetImageViewHandle64NVX( vkGetDeviceProcAddr( device, \"vkGetImageViewHandle64NVX\" ) );\n          vkGetImageViewAddressNVX  = PFN_vkGetImageViewAddressNVX( vkGetDeviceProcAddr( device, \"vkGetImageViewAddressNVX\" ) );\n\n          //=== VK_AMD_draw_indirect_count ===\n          vkCmdDrawIndirectCountAMD = PFN_vkCmdDrawIndirectCountAMD( vkGetDeviceProcAddr( device, \"vkCmdDrawIndirectCountAMD\" ) );\n          if ( !vkCmdDrawIndirectCount )\n            vkCmdDrawIndirectCount = vkCmdDrawIndirectCountAMD;\n          vkCmdDrawIndexedIndirectCountAMD = PFN_vkCmdDrawIndexedIndirectCountAMD( vkGetDeviceProcAddr( device, \"vkCmdDrawIndexedIndirectCountAMD\" ) );\n          if ( !vkCmdDrawIndexedIndirectCount )\n            vkCmdDrawIndexedIndirectCount = vkCmdDrawIndexedIndirectCountAMD;\n\n          //=== VK_AMD_shader_info ===\n          vkGetShaderInfoAMD = PFN_vkGetShaderInfoAMD( vkGetDeviceProcAddr( device, \"vkGetShaderInfoAMD\" ) );\n\n          //=== VK_KHR_dynamic_rendering ===\n          vkCmdBeginRenderingKHR = PFN_vkCmdBeginRenderingKHR( vkGetDeviceProcAddr( device, \"vkCmdBeginRenderingKHR\" ) );\n          if ( !vkCmdBeginRendering )\n            vkCmdBeginRendering = vkCmdBeginRenderingKHR;\n          vkCmdEndRenderingKHR = PFN_vkCmdEndRenderingKHR( vkGetDeviceProcAddr( device, \"vkCmdEndRenderingKHR\" ) );\n          if ( !vkCmdEndRendering )\n            vkCmdEndRendering = vkCmdEndRenderingKHR;\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n          //=== VK_NV_external_memory_win32 ===\n          vkGetMemoryWin32HandleNV = PFN_vkGetMemoryWin32HandleNV( vkGetDeviceProcAddr( device, \"vkGetMemoryWin32HandleNV\" ) );\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n          //=== VK_KHR_device_group ===\n          vkGetDeviceGroupPeerMemoryFeaturesKHR =\n            PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR( vkGetDeviceProcAddr( device, \"vkGetDeviceGroupPeerMemoryFeaturesKHR\" ) );\n          if ( !vkGetDeviceGroupPeerMemoryFeatures )\n            vkGetDeviceGroupPeerMemoryFeatures = vkGetDeviceGroupPeerMemoryFeaturesKHR;\n          vkCmdSetDeviceMaskKHR = PFN_vkCmdSetDeviceMaskKHR( vkGetDeviceProcAddr( device, \"vkCmdSetDeviceMaskKHR\" ) );\n          if ( !vkCmdSetDeviceMask )\n            vkCmdSetDeviceMask = vkCmdSetDeviceMaskKHR;\n          vkCmdDispatchBaseKHR = PFN_vkCmdDispatchBaseKHR( vkGetDeviceProcAddr( device, \"vkCmdDispatchBaseKHR\" ) );\n          if ( !vkCmdDispatchBase )\n            vkCmdDispatchBase = vkCmdDispatchBaseKHR;\n\n          //=== VK_KHR_maintenance1 ===\n          vkTrimCommandPoolKHR = PFN_vkTrimCommandPoolKHR( vkGetDeviceProcAddr( device, \"vkTrimCommandPoolKHR\" ) );\n          if ( !vkTrimCommandPool )\n            vkTrimCommandPool = vkTrimCommandPoolKHR;\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n          //=== VK_KHR_external_memory_win32 ===\n          vkGetMemoryWin32HandleKHR           = PFN_vkGetMemoryWin32HandleKHR( vkGetDeviceProcAddr( device, \"vkGetMemoryWin32HandleKHR\" ) );\n          vkGetMemoryWin32HandlePropertiesKHR = PFN_vkGetMemoryWin32HandlePropertiesKHR( vkGetDeviceProcAddr( device, \"vkGetMemoryWin32HandlePropertiesKHR\" ) );\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n          //=== VK_KHR_external_memory_fd ===\n          vkGetMemoryFdKHR           = PFN_vkGetMemoryFdKHR( vkGetDeviceProcAddr( device, \"vkGetMemoryFdKHR\" ) );\n          vkGetMemoryFdPropertiesKHR = PFN_vkGetMemoryFdPropertiesKHR( vkGetDeviceProcAddr( device, \"vkGetMemoryFdPropertiesKHR\" ) );\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n          //=== VK_KHR_external_semaphore_win32 ===\n          vkImportSemaphoreWin32HandleKHR = PFN_vkImportSemaphoreWin32HandleKHR( vkGetDeviceProcAddr( device, \"vkImportSemaphoreWin32HandleKHR\" ) );\n          vkGetSemaphoreWin32HandleKHR    = PFN_vkGetSemaphoreWin32HandleKHR( vkGetDeviceProcAddr( device, \"vkGetSemaphoreWin32HandleKHR\" ) );\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n          //=== VK_KHR_external_semaphore_fd ===\n          vkImportSemaphoreFdKHR = PFN_vkImportSemaphoreFdKHR( vkGetDeviceProcAddr( device, \"vkImportSemaphoreFdKHR\" ) );\n          vkGetSemaphoreFdKHR    = PFN_vkGetSemaphoreFdKHR( vkGetDeviceProcAddr( device, \"vkGetSemaphoreFdKHR\" ) );\n\n          //=== VK_KHR_push_descriptor ===\n          vkCmdPushDescriptorSetKHR = PFN_vkCmdPushDescriptorSetKHR( vkGetDeviceProcAddr( device, \"vkCmdPushDescriptorSetKHR\" ) );\n          if ( !vkCmdPushDescriptorSet )\n            vkCmdPushDescriptorSet = vkCmdPushDescriptorSetKHR;\n          vkCmdPushDescriptorSetWithTemplateKHR =\n            PFN_vkCmdPushDescriptorSetWithTemplateKHR( vkGetDeviceProcAddr( device, \"vkCmdPushDescriptorSetWithTemplateKHR\" ) );\n          if ( !vkCmdPushDescriptorSetWithTemplate )\n            vkCmdPushDescriptorSetWithTemplate = vkCmdPushDescriptorSetWithTemplateKHR;\n\n          //=== VK_EXT_conditional_rendering ===\n          vkCmdBeginConditionalRenderingEXT = PFN_vkCmdBeginConditionalRenderingEXT( vkGetDeviceProcAddr( device, \"vkCmdBeginConditionalRenderingEXT\" ) );\n          vkCmdEndConditionalRenderingEXT   = PFN_vkCmdEndConditionalRenderingEXT( vkGetDeviceProcAddr( device, \"vkCmdEndConditionalRenderingEXT\" ) );\n\n          //=== VK_KHR_descriptor_update_template ===\n          vkCreateDescriptorUpdateTemplateKHR = PFN_vkCreateDescriptorUpdateTemplateKHR( vkGetDeviceProcAddr( device, \"vkCreateDescriptorUpdateTemplateKHR\" ) );\n          if ( !vkCreateDescriptorUpdateTemplate )\n            vkCreateDescriptorUpdateTemplate = vkCreateDescriptorUpdateTemplateKHR;\n          vkDestroyDescriptorUpdateTemplateKHR =\n            PFN_vkDestroyDescriptorUpdateTemplateKHR( vkGetDeviceProcAddr( device, \"vkDestroyDescriptorUpdateTemplateKHR\" ) );\n          if ( !vkDestroyDescriptorUpdateTemplate )\n            vkDestroyDescriptorUpdateTemplate = vkDestroyDescriptorUpdateTemplateKHR;\n          vkUpdateDescriptorSetWithTemplateKHR =\n            PFN_vkUpdateDescriptorSetWithTemplateKHR( vkGetDeviceProcAddr( device, \"vkUpdateDescriptorSetWithTemplateKHR\" ) );\n          if ( !vkUpdateDescriptorSetWithTemplate )\n            vkUpdateDescriptorSetWithTemplate = vkUpdateDescriptorSetWithTemplateKHR;\n\n          //=== VK_NV_clip_space_w_scaling ===\n          vkCmdSetViewportWScalingNV = PFN_vkCmdSetViewportWScalingNV( vkGetDeviceProcAddr( device, \"vkCmdSetViewportWScalingNV\" ) );\n\n          //=== VK_EXT_display_control ===\n          vkDisplayPowerControlEXT  = PFN_vkDisplayPowerControlEXT( vkGetDeviceProcAddr( device, \"vkDisplayPowerControlEXT\" ) );\n          vkRegisterDeviceEventEXT  = PFN_vkRegisterDeviceEventEXT( vkGetDeviceProcAddr( device, \"vkRegisterDeviceEventEXT\" ) );\n          vkRegisterDisplayEventEXT = PFN_vkRegisterDisplayEventEXT( vkGetDeviceProcAddr( device, \"vkRegisterDisplayEventEXT\" ) );\n          vkGetSwapchainCounterEXT  = PFN_vkGetSwapchainCounterEXT( vkGetDeviceProcAddr( device, \"vkGetSwapchainCounterEXT\" ) );\n\n          //=== VK_GOOGLE_display_timing ===\n          vkGetRefreshCycleDurationGOOGLE   = PFN_vkGetRefreshCycleDurationGOOGLE( vkGetDeviceProcAddr( device, \"vkGetRefreshCycleDurationGOOGLE\" ) );\n          vkGetPastPresentationTimingGOOGLE = PFN_vkGetPastPresentationTimingGOOGLE( vkGetDeviceProcAddr( device, \"vkGetPastPresentationTimingGOOGLE\" ) );\n\n          //=== VK_EXT_discard_rectangles ===\n          vkCmdSetDiscardRectangleEXT       = PFN_vkCmdSetDiscardRectangleEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDiscardRectangleEXT\" ) );\n          vkCmdSetDiscardRectangleEnableEXT = PFN_vkCmdSetDiscardRectangleEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDiscardRectangleEnableEXT\" ) );\n          vkCmdSetDiscardRectangleModeEXT   = PFN_vkCmdSetDiscardRectangleModeEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDiscardRectangleModeEXT\" ) );\n\n          //=== VK_EXT_hdr_metadata ===\n          vkSetHdrMetadataEXT = PFN_vkSetHdrMetadataEXT( vkGetDeviceProcAddr( device, \"vkSetHdrMetadataEXT\" ) );\n\n          //=== VK_KHR_create_renderpass2 ===\n          vkCreateRenderPass2KHR = PFN_vkCreateRenderPass2KHR( vkGetDeviceProcAddr( device, \"vkCreateRenderPass2KHR\" ) );\n          if ( !vkCreateRenderPass2 )\n            vkCreateRenderPass2 = vkCreateRenderPass2KHR;\n          vkCmdBeginRenderPass2KHR = PFN_vkCmdBeginRenderPass2KHR( vkGetDeviceProcAddr( device, \"vkCmdBeginRenderPass2KHR\" ) );\n          if ( !vkCmdBeginRenderPass2 )\n            vkCmdBeginRenderPass2 = vkCmdBeginRenderPass2KHR;\n          vkCmdNextSubpass2KHR = PFN_vkCmdNextSubpass2KHR( vkGetDeviceProcAddr( device, \"vkCmdNextSubpass2KHR\" ) );\n          if ( !vkCmdNextSubpass2 )\n            vkCmdNextSubpass2 = vkCmdNextSubpass2KHR;\n          vkCmdEndRenderPass2KHR = PFN_vkCmdEndRenderPass2KHR( vkGetDeviceProcAddr( device, \"vkCmdEndRenderPass2KHR\" ) );\n          if ( !vkCmdEndRenderPass2 )\n            vkCmdEndRenderPass2 = vkCmdEndRenderPass2KHR;\n\n          //=== VK_KHR_shared_presentable_image ===\n          vkGetSwapchainStatusKHR = PFN_vkGetSwapchainStatusKHR( vkGetDeviceProcAddr( device, \"vkGetSwapchainStatusKHR\" ) );\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n          //=== VK_KHR_external_fence_win32 ===\n          vkImportFenceWin32HandleKHR = PFN_vkImportFenceWin32HandleKHR( vkGetDeviceProcAddr( device, \"vkImportFenceWin32HandleKHR\" ) );\n          vkGetFenceWin32HandleKHR    = PFN_vkGetFenceWin32HandleKHR( vkGetDeviceProcAddr( device, \"vkGetFenceWin32HandleKHR\" ) );\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n          //=== VK_KHR_external_fence_fd ===\n          vkImportFenceFdKHR = PFN_vkImportFenceFdKHR( vkGetDeviceProcAddr( device, \"vkImportFenceFdKHR\" ) );\n          vkGetFenceFdKHR    = PFN_vkGetFenceFdKHR( vkGetDeviceProcAddr( device, \"vkGetFenceFdKHR\" ) );\n\n          //=== VK_KHR_performance_query ===\n          vkAcquireProfilingLockKHR = PFN_vkAcquireProfilingLockKHR( vkGetDeviceProcAddr( device, \"vkAcquireProfilingLockKHR\" ) );\n          vkReleaseProfilingLockKHR = PFN_vkReleaseProfilingLockKHR( vkGetDeviceProcAddr( device, \"vkReleaseProfilingLockKHR\" ) );\n\n          //=== VK_EXT_debug_utils ===\n          vkSetDebugUtilsObjectNameEXT    = PFN_vkSetDebugUtilsObjectNameEXT( vkGetDeviceProcAddr( device, \"vkSetDebugUtilsObjectNameEXT\" ) );\n          vkSetDebugUtilsObjectTagEXT     = PFN_vkSetDebugUtilsObjectTagEXT( vkGetDeviceProcAddr( device, \"vkSetDebugUtilsObjectTagEXT\" ) );\n          vkQueueBeginDebugUtilsLabelEXT  = PFN_vkQueueBeginDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, \"vkQueueBeginDebugUtilsLabelEXT\" ) );\n          vkQueueEndDebugUtilsLabelEXT    = PFN_vkQueueEndDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, \"vkQueueEndDebugUtilsLabelEXT\" ) );\n          vkQueueInsertDebugUtilsLabelEXT = PFN_vkQueueInsertDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, \"vkQueueInsertDebugUtilsLabelEXT\" ) );\n          vkCmdBeginDebugUtilsLabelEXT    = PFN_vkCmdBeginDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, \"vkCmdBeginDebugUtilsLabelEXT\" ) );\n          vkCmdEndDebugUtilsLabelEXT      = PFN_vkCmdEndDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, \"vkCmdEndDebugUtilsLabelEXT\" ) );\n          vkCmdInsertDebugUtilsLabelEXT   = PFN_vkCmdInsertDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, \"vkCmdInsertDebugUtilsLabelEXT\" ) );\n\n#  if defined( VK_USE_PLATFORM_ANDROID_KHR )\n          //=== VK_ANDROID_external_memory_android_hardware_buffer ===\n          vkGetAndroidHardwareBufferPropertiesANDROID =\n            PFN_vkGetAndroidHardwareBufferPropertiesANDROID( vkGetDeviceProcAddr( device, \"vkGetAndroidHardwareBufferPropertiesANDROID\" ) );\n          vkGetMemoryAndroidHardwareBufferANDROID =\n            PFN_vkGetMemoryAndroidHardwareBufferANDROID( vkGetDeviceProcAddr( device, \"vkGetMemoryAndroidHardwareBufferANDROID\" ) );\n#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n          //=== VK_AMDX_shader_enqueue ===\n          vkCreateExecutionGraphPipelinesAMDX = PFN_vkCreateExecutionGraphPipelinesAMDX( vkGetDeviceProcAddr( device, \"vkCreateExecutionGraphPipelinesAMDX\" ) );\n          vkGetExecutionGraphPipelineScratchSizeAMDX =\n            PFN_vkGetExecutionGraphPipelineScratchSizeAMDX( vkGetDeviceProcAddr( device, \"vkGetExecutionGraphPipelineScratchSizeAMDX\" ) );\n          vkGetExecutionGraphPipelineNodeIndexAMDX =\n            PFN_vkGetExecutionGraphPipelineNodeIndexAMDX( vkGetDeviceProcAddr( device, \"vkGetExecutionGraphPipelineNodeIndexAMDX\" ) );\n          vkCmdInitializeGraphScratchMemoryAMDX =\n            PFN_vkCmdInitializeGraphScratchMemoryAMDX( vkGetDeviceProcAddr( device, \"vkCmdInitializeGraphScratchMemoryAMDX\" ) );\n          vkCmdDispatchGraphAMDX              = PFN_vkCmdDispatchGraphAMDX( vkGetDeviceProcAddr( device, \"vkCmdDispatchGraphAMDX\" ) );\n          vkCmdDispatchGraphIndirectAMDX      = PFN_vkCmdDispatchGraphIndirectAMDX( vkGetDeviceProcAddr( device, \"vkCmdDispatchGraphIndirectAMDX\" ) );\n          vkCmdDispatchGraphIndirectCountAMDX = PFN_vkCmdDispatchGraphIndirectCountAMDX( vkGetDeviceProcAddr( device, \"vkCmdDispatchGraphIndirectCountAMDX\" ) );\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n          //=== VK_EXT_sample_locations ===\n          vkCmdSetSampleLocationsEXT = PFN_vkCmdSetSampleLocationsEXT( vkGetDeviceProcAddr( device, \"vkCmdSetSampleLocationsEXT\" ) );\n\n          //=== VK_KHR_get_memory_requirements2 ===\n          vkGetImageMemoryRequirements2KHR = PFN_vkGetImageMemoryRequirements2KHR( vkGetDeviceProcAddr( device, \"vkGetImageMemoryRequirements2KHR\" ) );\n          if ( !vkGetImageMemoryRequirements2 )\n            vkGetImageMemoryRequirements2 = vkGetImageMemoryRequirements2KHR;\n          vkGetBufferMemoryRequirements2KHR = PFN_vkGetBufferMemoryRequirements2KHR( vkGetDeviceProcAddr( device, \"vkGetBufferMemoryRequirements2KHR\" ) );\n          if ( !vkGetBufferMemoryRequirements2 )\n            vkGetBufferMemoryRequirements2 = vkGetBufferMemoryRequirements2KHR;\n          vkGetImageSparseMemoryRequirements2KHR =\n            PFN_vkGetImageSparseMemoryRequirements2KHR( vkGetDeviceProcAddr( device, \"vkGetImageSparseMemoryRequirements2KHR\" ) );\n          if ( !vkGetImageSparseMemoryRequirements2 )\n            vkGetImageSparseMemoryRequirements2 = vkGetImageSparseMemoryRequirements2KHR;\n\n          //=== VK_KHR_acceleration_structure ===\n          vkCreateAccelerationStructureKHR    = PFN_vkCreateAccelerationStructureKHR( vkGetDeviceProcAddr( device, \"vkCreateAccelerationStructureKHR\" ) );\n          vkDestroyAccelerationStructureKHR   = PFN_vkDestroyAccelerationStructureKHR( vkGetDeviceProcAddr( device, \"vkDestroyAccelerationStructureKHR\" ) );\n          vkCmdBuildAccelerationStructuresKHR = PFN_vkCmdBuildAccelerationStructuresKHR( vkGetDeviceProcAddr( device, \"vkCmdBuildAccelerationStructuresKHR\" ) );\n          vkCmdBuildAccelerationStructuresIndirectKHR =\n            PFN_vkCmdBuildAccelerationStructuresIndirectKHR( vkGetDeviceProcAddr( device, \"vkCmdBuildAccelerationStructuresIndirectKHR\" ) );\n          vkBuildAccelerationStructuresKHR = PFN_vkBuildAccelerationStructuresKHR( vkGetDeviceProcAddr( device, \"vkBuildAccelerationStructuresKHR\" ) );\n          vkCopyAccelerationStructureKHR   = PFN_vkCopyAccelerationStructureKHR( vkGetDeviceProcAddr( device, \"vkCopyAccelerationStructureKHR\" ) );\n          vkCopyAccelerationStructureToMemoryKHR =\n            PFN_vkCopyAccelerationStructureToMemoryKHR( vkGetDeviceProcAddr( device, \"vkCopyAccelerationStructureToMemoryKHR\" ) );\n          vkCopyMemoryToAccelerationStructureKHR =\n            PFN_vkCopyMemoryToAccelerationStructureKHR( vkGetDeviceProcAddr( device, \"vkCopyMemoryToAccelerationStructureKHR\" ) );\n          vkWriteAccelerationStructuresPropertiesKHR =\n            PFN_vkWriteAccelerationStructuresPropertiesKHR( vkGetDeviceProcAddr( device, \"vkWriteAccelerationStructuresPropertiesKHR\" ) );\n          vkCmdCopyAccelerationStructureKHR = PFN_vkCmdCopyAccelerationStructureKHR( vkGetDeviceProcAddr( device, \"vkCmdCopyAccelerationStructureKHR\" ) );\n          vkCmdCopyAccelerationStructureToMemoryKHR =\n            PFN_vkCmdCopyAccelerationStructureToMemoryKHR( vkGetDeviceProcAddr( device, \"vkCmdCopyAccelerationStructureToMemoryKHR\" ) );\n          vkCmdCopyMemoryToAccelerationStructureKHR =\n            PFN_vkCmdCopyMemoryToAccelerationStructureKHR( vkGetDeviceProcAddr( device, \"vkCmdCopyMemoryToAccelerationStructureKHR\" ) );\n          vkGetAccelerationStructureDeviceAddressKHR =\n            PFN_vkGetAccelerationStructureDeviceAddressKHR( vkGetDeviceProcAddr( device, \"vkGetAccelerationStructureDeviceAddressKHR\" ) );\n          vkCmdWriteAccelerationStructuresPropertiesKHR =\n            PFN_vkCmdWriteAccelerationStructuresPropertiesKHR( vkGetDeviceProcAddr( device, \"vkCmdWriteAccelerationStructuresPropertiesKHR\" ) );\n          vkGetDeviceAccelerationStructureCompatibilityKHR =\n            PFN_vkGetDeviceAccelerationStructureCompatibilityKHR( vkGetDeviceProcAddr( device, \"vkGetDeviceAccelerationStructureCompatibilityKHR\" ) );\n          vkGetAccelerationStructureBuildSizesKHR =\n            PFN_vkGetAccelerationStructureBuildSizesKHR( vkGetDeviceProcAddr( device, \"vkGetAccelerationStructureBuildSizesKHR\" ) );\n\n          //=== VK_KHR_ray_tracing_pipeline ===\n          vkCmdTraceRaysKHR              = PFN_vkCmdTraceRaysKHR( vkGetDeviceProcAddr( device, \"vkCmdTraceRaysKHR\" ) );\n          vkCreateRayTracingPipelinesKHR = PFN_vkCreateRayTracingPipelinesKHR( vkGetDeviceProcAddr( device, \"vkCreateRayTracingPipelinesKHR\" ) );\n          vkGetRayTracingShaderGroupHandlesKHR =\n            PFN_vkGetRayTracingShaderGroupHandlesKHR( vkGetDeviceProcAddr( device, \"vkGetRayTracingShaderGroupHandlesKHR\" ) );\n          vkGetRayTracingCaptureReplayShaderGroupHandlesKHR =\n            PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR( vkGetDeviceProcAddr( device, \"vkGetRayTracingCaptureReplayShaderGroupHandlesKHR\" ) );\n          vkCmdTraceRaysIndirectKHR = PFN_vkCmdTraceRaysIndirectKHR( vkGetDeviceProcAddr( device, \"vkCmdTraceRaysIndirectKHR\" ) );\n          vkGetRayTracingShaderGroupStackSizeKHR =\n            PFN_vkGetRayTracingShaderGroupStackSizeKHR( vkGetDeviceProcAddr( device, \"vkGetRayTracingShaderGroupStackSizeKHR\" ) );\n          vkCmdSetRayTracingPipelineStackSizeKHR =\n            PFN_vkCmdSetRayTracingPipelineStackSizeKHR( vkGetDeviceProcAddr( device, \"vkCmdSetRayTracingPipelineStackSizeKHR\" ) );\n\n          //=== VK_KHR_sampler_ycbcr_conversion ===\n          vkCreateSamplerYcbcrConversionKHR = PFN_vkCreateSamplerYcbcrConversionKHR( vkGetDeviceProcAddr( device, \"vkCreateSamplerYcbcrConversionKHR\" ) );\n          if ( !vkCreateSamplerYcbcrConversion )\n            vkCreateSamplerYcbcrConversion = vkCreateSamplerYcbcrConversionKHR;\n          vkDestroySamplerYcbcrConversionKHR = PFN_vkDestroySamplerYcbcrConversionKHR( vkGetDeviceProcAddr( device, \"vkDestroySamplerYcbcrConversionKHR\" ) );\n          if ( !vkDestroySamplerYcbcrConversion )\n            vkDestroySamplerYcbcrConversion = vkDestroySamplerYcbcrConversionKHR;\n\n          //=== VK_KHR_bind_memory2 ===\n          vkBindBufferMemory2KHR = PFN_vkBindBufferMemory2KHR( vkGetDeviceProcAddr( device, \"vkBindBufferMemory2KHR\" ) );\n          if ( !vkBindBufferMemory2 )\n            vkBindBufferMemory2 = vkBindBufferMemory2KHR;\n          vkBindImageMemory2KHR = PFN_vkBindImageMemory2KHR( vkGetDeviceProcAddr( device, \"vkBindImageMemory2KHR\" ) );\n          if ( !vkBindImageMemory2 )\n            vkBindImageMemory2 = vkBindImageMemory2KHR;\n\n          //=== VK_EXT_image_drm_format_modifier ===\n          vkGetImageDrmFormatModifierPropertiesEXT =\n            PFN_vkGetImageDrmFormatModifierPropertiesEXT( vkGetDeviceProcAddr( device, \"vkGetImageDrmFormatModifierPropertiesEXT\" ) );\n\n          //=== VK_EXT_validation_cache ===\n          vkCreateValidationCacheEXT  = PFN_vkCreateValidationCacheEXT( vkGetDeviceProcAddr( device, \"vkCreateValidationCacheEXT\" ) );\n          vkDestroyValidationCacheEXT = PFN_vkDestroyValidationCacheEXT( vkGetDeviceProcAddr( device, \"vkDestroyValidationCacheEXT\" ) );\n          vkMergeValidationCachesEXT  = PFN_vkMergeValidationCachesEXT( vkGetDeviceProcAddr( device, \"vkMergeValidationCachesEXT\" ) );\n          vkGetValidationCacheDataEXT = PFN_vkGetValidationCacheDataEXT( vkGetDeviceProcAddr( device, \"vkGetValidationCacheDataEXT\" ) );\n\n          //=== VK_NV_shading_rate_image ===\n          vkCmdBindShadingRateImageNV = PFN_vkCmdBindShadingRateImageNV( vkGetDeviceProcAddr( device, \"vkCmdBindShadingRateImageNV\" ) );\n          vkCmdSetViewportShadingRatePaletteNV =\n            PFN_vkCmdSetViewportShadingRatePaletteNV( vkGetDeviceProcAddr( device, \"vkCmdSetViewportShadingRatePaletteNV\" ) );\n          vkCmdSetCoarseSampleOrderNV = PFN_vkCmdSetCoarseSampleOrderNV( vkGetDeviceProcAddr( device, \"vkCmdSetCoarseSampleOrderNV\" ) );\n\n          //=== VK_NV_ray_tracing ===\n          vkCreateAccelerationStructureNV  = PFN_vkCreateAccelerationStructureNV( vkGetDeviceProcAddr( device, \"vkCreateAccelerationStructureNV\" ) );\n          vkDestroyAccelerationStructureNV = PFN_vkDestroyAccelerationStructureNV( vkGetDeviceProcAddr( device, \"vkDestroyAccelerationStructureNV\" ) );\n          vkGetAccelerationStructureMemoryRequirementsNV =\n            PFN_vkGetAccelerationStructureMemoryRequirementsNV( vkGetDeviceProcAddr( device, \"vkGetAccelerationStructureMemoryRequirementsNV\" ) );\n          vkBindAccelerationStructureMemoryNV = PFN_vkBindAccelerationStructureMemoryNV( vkGetDeviceProcAddr( device, \"vkBindAccelerationStructureMemoryNV\" ) );\n          vkCmdBuildAccelerationStructureNV   = PFN_vkCmdBuildAccelerationStructureNV( vkGetDeviceProcAddr( device, \"vkCmdBuildAccelerationStructureNV\" ) );\n          vkCmdCopyAccelerationStructureNV    = PFN_vkCmdCopyAccelerationStructureNV( vkGetDeviceProcAddr( device, \"vkCmdCopyAccelerationStructureNV\" ) );\n          vkCmdTraceRaysNV                    = PFN_vkCmdTraceRaysNV( vkGetDeviceProcAddr( device, \"vkCmdTraceRaysNV\" ) );\n          vkCreateRayTracingPipelinesNV       = PFN_vkCreateRayTracingPipelinesNV( vkGetDeviceProcAddr( device, \"vkCreateRayTracingPipelinesNV\" ) );\n          vkGetRayTracingShaderGroupHandlesNV = PFN_vkGetRayTracingShaderGroupHandlesNV( vkGetDeviceProcAddr( device, \"vkGetRayTracingShaderGroupHandlesNV\" ) );\n          if ( !vkGetRayTracingShaderGroupHandlesKHR )\n            vkGetRayTracingShaderGroupHandlesKHR = vkGetRayTracingShaderGroupHandlesNV;\n          vkGetAccelerationStructureHandleNV = PFN_vkGetAccelerationStructureHandleNV( vkGetDeviceProcAddr( device, \"vkGetAccelerationStructureHandleNV\" ) );\n          vkCmdWriteAccelerationStructuresPropertiesNV =\n            PFN_vkCmdWriteAccelerationStructuresPropertiesNV( vkGetDeviceProcAddr( device, \"vkCmdWriteAccelerationStructuresPropertiesNV\" ) );\n          vkCompileDeferredNV = PFN_vkCompileDeferredNV( vkGetDeviceProcAddr( device, \"vkCompileDeferredNV\" ) );\n\n          //=== VK_KHR_maintenance3 ===\n          vkGetDescriptorSetLayoutSupportKHR = PFN_vkGetDescriptorSetLayoutSupportKHR( vkGetDeviceProcAddr( device, \"vkGetDescriptorSetLayoutSupportKHR\" ) );\n          if ( !vkGetDescriptorSetLayoutSupport )\n            vkGetDescriptorSetLayoutSupport = vkGetDescriptorSetLayoutSupportKHR;\n\n          //=== VK_KHR_draw_indirect_count ===\n          vkCmdDrawIndirectCountKHR = PFN_vkCmdDrawIndirectCountKHR( vkGetDeviceProcAddr( device, \"vkCmdDrawIndirectCountKHR\" ) );\n          if ( !vkCmdDrawIndirectCount )\n            vkCmdDrawIndirectCount = vkCmdDrawIndirectCountKHR;\n          vkCmdDrawIndexedIndirectCountKHR = PFN_vkCmdDrawIndexedIndirectCountKHR( vkGetDeviceProcAddr( device, \"vkCmdDrawIndexedIndirectCountKHR\" ) );\n          if ( !vkCmdDrawIndexedIndirectCount )\n            vkCmdDrawIndexedIndirectCount = vkCmdDrawIndexedIndirectCountKHR;\n\n          //=== VK_EXT_external_memory_host ===\n          vkGetMemoryHostPointerPropertiesEXT = PFN_vkGetMemoryHostPointerPropertiesEXT( vkGetDeviceProcAddr( device, \"vkGetMemoryHostPointerPropertiesEXT\" ) );\n\n          //=== VK_AMD_buffer_marker ===\n          vkCmdWriteBufferMarkerAMD  = PFN_vkCmdWriteBufferMarkerAMD( vkGetDeviceProcAddr( device, \"vkCmdWriteBufferMarkerAMD\" ) );\n          vkCmdWriteBufferMarker2AMD = PFN_vkCmdWriteBufferMarker2AMD( vkGetDeviceProcAddr( device, \"vkCmdWriteBufferMarker2AMD\" ) );\n\n          //=== VK_EXT_calibrated_timestamps ===\n          vkGetCalibratedTimestampsEXT = PFN_vkGetCalibratedTimestampsEXT( vkGetDeviceProcAddr( device, \"vkGetCalibratedTimestampsEXT\" ) );\n          if ( !vkGetCalibratedTimestampsKHR )\n            vkGetCalibratedTimestampsKHR = vkGetCalibratedTimestampsEXT;\n\n          //=== VK_NV_mesh_shader ===\n          vkCmdDrawMeshTasksNV              = PFN_vkCmdDrawMeshTasksNV( vkGetDeviceProcAddr( device, \"vkCmdDrawMeshTasksNV\" ) );\n          vkCmdDrawMeshTasksIndirectNV      = PFN_vkCmdDrawMeshTasksIndirectNV( vkGetDeviceProcAddr( device, \"vkCmdDrawMeshTasksIndirectNV\" ) );\n          vkCmdDrawMeshTasksIndirectCountNV = PFN_vkCmdDrawMeshTasksIndirectCountNV( vkGetDeviceProcAddr( device, \"vkCmdDrawMeshTasksIndirectCountNV\" ) );\n\n          //=== VK_NV_scissor_exclusive ===\n          vkCmdSetExclusiveScissorEnableNV = PFN_vkCmdSetExclusiveScissorEnableNV( vkGetDeviceProcAddr( device, \"vkCmdSetExclusiveScissorEnableNV\" ) );\n          vkCmdSetExclusiveScissorNV       = PFN_vkCmdSetExclusiveScissorNV( vkGetDeviceProcAddr( device, \"vkCmdSetExclusiveScissorNV\" ) );\n\n          //=== VK_NV_device_diagnostic_checkpoints ===\n          vkCmdSetCheckpointNV        = PFN_vkCmdSetCheckpointNV( vkGetDeviceProcAddr( device, \"vkCmdSetCheckpointNV\" ) );\n          vkGetQueueCheckpointDataNV  = PFN_vkGetQueueCheckpointDataNV( vkGetDeviceProcAddr( device, \"vkGetQueueCheckpointDataNV\" ) );\n          vkGetQueueCheckpointData2NV = PFN_vkGetQueueCheckpointData2NV( vkGetDeviceProcAddr( device, \"vkGetQueueCheckpointData2NV\" ) );\n\n          //=== VK_KHR_timeline_semaphore ===\n          vkGetSemaphoreCounterValueKHR = PFN_vkGetSemaphoreCounterValueKHR( vkGetDeviceProcAddr( device, \"vkGetSemaphoreCounterValueKHR\" ) );\n          if ( !vkGetSemaphoreCounterValue )\n            vkGetSemaphoreCounterValue = vkGetSemaphoreCounterValueKHR;\n          vkWaitSemaphoresKHR = PFN_vkWaitSemaphoresKHR( vkGetDeviceProcAddr( device, \"vkWaitSemaphoresKHR\" ) );\n          if ( !vkWaitSemaphores )\n            vkWaitSemaphores = vkWaitSemaphoresKHR;\n          vkSignalSemaphoreKHR = PFN_vkSignalSemaphoreKHR( vkGetDeviceProcAddr( device, \"vkSignalSemaphoreKHR\" ) );\n          if ( !vkSignalSemaphore )\n            vkSignalSemaphore = vkSignalSemaphoreKHR;\n\n          //=== VK_INTEL_performance_query ===\n          vkInitializePerformanceApiINTEL   = PFN_vkInitializePerformanceApiINTEL( vkGetDeviceProcAddr( device, \"vkInitializePerformanceApiINTEL\" ) );\n          vkUninitializePerformanceApiINTEL = PFN_vkUninitializePerformanceApiINTEL( vkGetDeviceProcAddr( device, \"vkUninitializePerformanceApiINTEL\" ) );\n          vkCmdSetPerformanceMarkerINTEL    = PFN_vkCmdSetPerformanceMarkerINTEL( vkGetDeviceProcAddr( device, \"vkCmdSetPerformanceMarkerINTEL\" ) );\n          vkCmdSetPerformanceStreamMarkerINTEL =\n            PFN_vkCmdSetPerformanceStreamMarkerINTEL( vkGetDeviceProcAddr( device, \"vkCmdSetPerformanceStreamMarkerINTEL\" ) );\n          vkCmdSetPerformanceOverrideINTEL = PFN_vkCmdSetPerformanceOverrideINTEL( vkGetDeviceProcAddr( device, \"vkCmdSetPerformanceOverrideINTEL\" ) );\n          vkAcquirePerformanceConfigurationINTEL =\n            PFN_vkAcquirePerformanceConfigurationINTEL( vkGetDeviceProcAddr( device, \"vkAcquirePerformanceConfigurationINTEL\" ) );\n          vkReleasePerformanceConfigurationINTEL =\n            PFN_vkReleasePerformanceConfigurationINTEL( vkGetDeviceProcAddr( device, \"vkReleasePerformanceConfigurationINTEL\" ) );\n          vkQueueSetPerformanceConfigurationINTEL =\n            PFN_vkQueueSetPerformanceConfigurationINTEL( vkGetDeviceProcAddr( device, \"vkQueueSetPerformanceConfigurationINTEL\" ) );\n          vkGetPerformanceParameterINTEL = PFN_vkGetPerformanceParameterINTEL( vkGetDeviceProcAddr( device, \"vkGetPerformanceParameterINTEL\" ) );\n\n          //=== VK_AMD_display_native_hdr ===\n          vkSetLocalDimmingAMD = PFN_vkSetLocalDimmingAMD( vkGetDeviceProcAddr( device, \"vkSetLocalDimmingAMD\" ) );\n\n          //=== VK_KHR_fragment_shading_rate ===\n          vkCmdSetFragmentShadingRateKHR = PFN_vkCmdSetFragmentShadingRateKHR( vkGetDeviceProcAddr( device, \"vkCmdSetFragmentShadingRateKHR\" ) );\n\n          //=== VK_KHR_dynamic_rendering_local_read ===\n          vkCmdSetRenderingAttachmentLocationsKHR =\n            PFN_vkCmdSetRenderingAttachmentLocationsKHR( vkGetDeviceProcAddr( device, \"vkCmdSetRenderingAttachmentLocationsKHR\" ) );\n          if ( !vkCmdSetRenderingAttachmentLocations )\n            vkCmdSetRenderingAttachmentLocations = vkCmdSetRenderingAttachmentLocationsKHR;\n          vkCmdSetRenderingInputAttachmentIndicesKHR =\n            PFN_vkCmdSetRenderingInputAttachmentIndicesKHR( vkGetDeviceProcAddr( device, \"vkCmdSetRenderingInputAttachmentIndicesKHR\" ) );\n          if ( !vkCmdSetRenderingInputAttachmentIndices )\n            vkCmdSetRenderingInputAttachmentIndices = vkCmdSetRenderingInputAttachmentIndicesKHR;\n\n          //=== VK_EXT_buffer_device_address ===\n          vkGetBufferDeviceAddressEXT = PFN_vkGetBufferDeviceAddressEXT( vkGetDeviceProcAddr( device, \"vkGetBufferDeviceAddressEXT\" ) );\n          if ( !vkGetBufferDeviceAddress )\n            vkGetBufferDeviceAddress = vkGetBufferDeviceAddressEXT;\n\n          //=== VK_KHR_present_wait ===\n          vkWaitForPresentKHR = PFN_vkWaitForPresentKHR( vkGetDeviceProcAddr( device, \"vkWaitForPresentKHR\" ) );\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n          //=== VK_EXT_full_screen_exclusive ===\n          vkAcquireFullScreenExclusiveModeEXT = PFN_vkAcquireFullScreenExclusiveModeEXT( vkGetDeviceProcAddr( device, \"vkAcquireFullScreenExclusiveModeEXT\" ) );\n          vkReleaseFullScreenExclusiveModeEXT = PFN_vkReleaseFullScreenExclusiveModeEXT( vkGetDeviceProcAddr( device, \"vkReleaseFullScreenExclusiveModeEXT\" ) );\n          vkGetDeviceGroupSurfacePresentModes2EXT =\n            PFN_vkGetDeviceGroupSurfacePresentModes2EXT( vkGetDeviceProcAddr( device, \"vkGetDeviceGroupSurfacePresentModes2EXT\" ) );\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n          //=== VK_KHR_buffer_device_address ===\n          vkGetBufferDeviceAddressKHR = PFN_vkGetBufferDeviceAddressKHR( vkGetDeviceProcAddr( device, \"vkGetBufferDeviceAddressKHR\" ) );\n          if ( !vkGetBufferDeviceAddress )\n            vkGetBufferDeviceAddress = vkGetBufferDeviceAddressKHR;\n          vkGetBufferOpaqueCaptureAddressKHR = PFN_vkGetBufferOpaqueCaptureAddressKHR( vkGetDeviceProcAddr( device, \"vkGetBufferOpaqueCaptureAddressKHR\" ) );\n          if ( !vkGetBufferOpaqueCaptureAddress )\n            vkGetBufferOpaqueCaptureAddress = vkGetBufferOpaqueCaptureAddressKHR;\n          vkGetDeviceMemoryOpaqueCaptureAddressKHR =\n            PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR( vkGetDeviceProcAddr( device, \"vkGetDeviceMemoryOpaqueCaptureAddressKHR\" ) );\n          if ( !vkGetDeviceMemoryOpaqueCaptureAddress )\n            vkGetDeviceMemoryOpaqueCaptureAddress = vkGetDeviceMemoryOpaqueCaptureAddressKHR;\n\n          //=== VK_EXT_line_rasterization ===\n          vkCmdSetLineStippleEXT = PFN_vkCmdSetLineStippleEXT( vkGetDeviceProcAddr( device, \"vkCmdSetLineStippleEXT\" ) );\n          if ( !vkCmdSetLineStipple )\n            vkCmdSetLineStipple = vkCmdSetLineStippleEXT;\n\n          //=== VK_EXT_host_query_reset ===\n          vkResetQueryPoolEXT = PFN_vkResetQueryPoolEXT( vkGetDeviceProcAddr( device, \"vkResetQueryPoolEXT\" ) );\n          if ( !vkResetQueryPool )\n            vkResetQueryPool = vkResetQueryPoolEXT;\n\n          //=== VK_EXT_extended_dynamic_state ===\n          vkCmdSetCullModeEXT = PFN_vkCmdSetCullModeEXT( vkGetDeviceProcAddr( device, \"vkCmdSetCullModeEXT\" ) );\n          if ( !vkCmdSetCullMode )\n            vkCmdSetCullMode = vkCmdSetCullModeEXT;\n          vkCmdSetFrontFaceEXT = PFN_vkCmdSetFrontFaceEXT( vkGetDeviceProcAddr( device, \"vkCmdSetFrontFaceEXT\" ) );\n          if ( !vkCmdSetFrontFace )\n            vkCmdSetFrontFace = vkCmdSetFrontFaceEXT;\n          vkCmdSetPrimitiveTopologyEXT = PFN_vkCmdSetPrimitiveTopologyEXT( vkGetDeviceProcAddr( device, \"vkCmdSetPrimitiveTopologyEXT\" ) );\n          if ( !vkCmdSetPrimitiveTopology )\n            vkCmdSetPrimitiveTopology = vkCmdSetPrimitiveTopologyEXT;\n          vkCmdSetViewportWithCountEXT = PFN_vkCmdSetViewportWithCountEXT( vkGetDeviceProcAddr( device, \"vkCmdSetViewportWithCountEXT\" ) );\n          if ( !vkCmdSetViewportWithCount )\n            vkCmdSetViewportWithCount = vkCmdSetViewportWithCountEXT;\n          vkCmdSetScissorWithCountEXT = PFN_vkCmdSetScissorWithCountEXT( vkGetDeviceProcAddr( device, \"vkCmdSetScissorWithCountEXT\" ) );\n          if ( !vkCmdSetScissorWithCount )\n            vkCmdSetScissorWithCount = vkCmdSetScissorWithCountEXT;\n          vkCmdBindVertexBuffers2EXT = PFN_vkCmdBindVertexBuffers2EXT( vkGetDeviceProcAddr( device, \"vkCmdBindVertexBuffers2EXT\" ) );\n          if ( !vkCmdBindVertexBuffers2 )\n            vkCmdBindVertexBuffers2 = vkCmdBindVertexBuffers2EXT;\n          vkCmdSetDepthTestEnableEXT = PFN_vkCmdSetDepthTestEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDepthTestEnableEXT\" ) );\n          if ( !vkCmdSetDepthTestEnable )\n            vkCmdSetDepthTestEnable = vkCmdSetDepthTestEnableEXT;\n          vkCmdSetDepthWriteEnableEXT = PFN_vkCmdSetDepthWriteEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDepthWriteEnableEXT\" ) );\n          if ( !vkCmdSetDepthWriteEnable )\n            vkCmdSetDepthWriteEnable = vkCmdSetDepthWriteEnableEXT;\n          vkCmdSetDepthCompareOpEXT = PFN_vkCmdSetDepthCompareOpEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDepthCompareOpEXT\" ) );\n          if ( !vkCmdSetDepthCompareOp )\n            vkCmdSetDepthCompareOp = vkCmdSetDepthCompareOpEXT;\n          vkCmdSetDepthBoundsTestEnableEXT = PFN_vkCmdSetDepthBoundsTestEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDepthBoundsTestEnableEXT\" ) );\n          if ( !vkCmdSetDepthBoundsTestEnable )\n            vkCmdSetDepthBoundsTestEnable = vkCmdSetDepthBoundsTestEnableEXT;\n          vkCmdSetStencilTestEnableEXT = PFN_vkCmdSetStencilTestEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetStencilTestEnableEXT\" ) );\n          if ( !vkCmdSetStencilTestEnable )\n            vkCmdSetStencilTestEnable = vkCmdSetStencilTestEnableEXT;\n          vkCmdSetStencilOpEXT = PFN_vkCmdSetStencilOpEXT( vkGetDeviceProcAddr( device, \"vkCmdSetStencilOpEXT\" ) );\n          if ( !vkCmdSetStencilOp )\n            vkCmdSetStencilOp = vkCmdSetStencilOpEXT;\n\n          //=== VK_KHR_deferred_host_operations ===\n          vkCreateDeferredOperationKHR  = PFN_vkCreateDeferredOperationKHR( vkGetDeviceProcAddr( device, \"vkCreateDeferredOperationKHR\" ) );\n          vkDestroyDeferredOperationKHR = PFN_vkDestroyDeferredOperationKHR( vkGetDeviceProcAddr( device, \"vkDestroyDeferredOperationKHR\" ) );\n          vkGetDeferredOperationMaxConcurrencyKHR =\n            PFN_vkGetDeferredOperationMaxConcurrencyKHR( vkGetDeviceProcAddr( device, \"vkGetDeferredOperationMaxConcurrencyKHR\" ) );\n          vkGetDeferredOperationResultKHR = PFN_vkGetDeferredOperationResultKHR( vkGetDeviceProcAddr( device, \"vkGetDeferredOperationResultKHR\" ) );\n          vkDeferredOperationJoinKHR      = PFN_vkDeferredOperationJoinKHR( vkGetDeviceProcAddr( device, \"vkDeferredOperationJoinKHR\" ) );\n\n          //=== VK_KHR_pipeline_executable_properties ===\n          vkGetPipelineExecutablePropertiesKHR =\n            PFN_vkGetPipelineExecutablePropertiesKHR( vkGetDeviceProcAddr( device, \"vkGetPipelineExecutablePropertiesKHR\" ) );\n          vkGetPipelineExecutableStatisticsKHR =\n            PFN_vkGetPipelineExecutableStatisticsKHR( vkGetDeviceProcAddr( device, \"vkGetPipelineExecutableStatisticsKHR\" ) );\n          vkGetPipelineExecutableInternalRepresentationsKHR =\n            PFN_vkGetPipelineExecutableInternalRepresentationsKHR( vkGetDeviceProcAddr( device, \"vkGetPipelineExecutableInternalRepresentationsKHR\" ) );\n\n          //=== VK_EXT_host_image_copy ===\n          vkCopyMemoryToImageEXT = PFN_vkCopyMemoryToImageEXT( vkGetDeviceProcAddr( device, \"vkCopyMemoryToImageEXT\" ) );\n          if ( !vkCopyMemoryToImage )\n            vkCopyMemoryToImage = vkCopyMemoryToImageEXT;\n          vkCopyImageToMemoryEXT = PFN_vkCopyImageToMemoryEXT( vkGetDeviceProcAddr( device, \"vkCopyImageToMemoryEXT\" ) );\n          if ( !vkCopyImageToMemory )\n            vkCopyImageToMemory = vkCopyImageToMemoryEXT;\n          vkCopyImageToImageEXT = PFN_vkCopyImageToImageEXT( vkGetDeviceProcAddr( device, \"vkCopyImageToImageEXT\" ) );\n          if ( !vkCopyImageToImage )\n            vkCopyImageToImage = vkCopyImageToImageEXT;\n          vkTransitionImageLayoutEXT = PFN_vkTransitionImageLayoutEXT( vkGetDeviceProcAddr( device, \"vkTransitionImageLayoutEXT\" ) );\n          if ( !vkTransitionImageLayout )\n            vkTransitionImageLayout = vkTransitionImageLayoutEXT;\n          vkGetImageSubresourceLayout2EXT = PFN_vkGetImageSubresourceLayout2EXT( vkGetDeviceProcAddr( device, \"vkGetImageSubresourceLayout2EXT\" ) );\n          if ( !vkGetImageSubresourceLayout2 )\n            vkGetImageSubresourceLayout2 = vkGetImageSubresourceLayout2EXT;\n\n          //=== VK_KHR_map_memory2 ===\n          vkMapMemory2KHR = PFN_vkMapMemory2KHR( vkGetDeviceProcAddr( device, \"vkMapMemory2KHR\" ) );\n          if ( !vkMapMemory2 )\n            vkMapMemory2 = vkMapMemory2KHR;\n          vkUnmapMemory2KHR = PFN_vkUnmapMemory2KHR( vkGetDeviceProcAddr( device, \"vkUnmapMemory2KHR\" ) );\n          if ( !vkUnmapMemory2 )\n            vkUnmapMemory2 = vkUnmapMemory2KHR;\n\n          //=== VK_EXT_swapchain_maintenance1 ===\n          vkReleaseSwapchainImagesEXT = PFN_vkReleaseSwapchainImagesEXT( vkGetDeviceProcAddr( device, \"vkReleaseSwapchainImagesEXT\" ) );\n\n          //=== VK_NV_device_generated_commands ===\n          vkGetGeneratedCommandsMemoryRequirementsNV =\n            PFN_vkGetGeneratedCommandsMemoryRequirementsNV( vkGetDeviceProcAddr( device, \"vkGetGeneratedCommandsMemoryRequirementsNV\" ) );\n          vkCmdPreprocessGeneratedCommandsNV = PFN_vkCmdPreprocessGeneratedCommandsNV( vkGetDeviceProcAddr( device, \"vkCmdPreprocessGeneratedCommandsNV\" ) );\n          vkCmdExecuteGeneratedCommandsNV    = PFN_vkCmdExecuteGeneratedCommandsNV( vkGetDeviceProcAddr( device, \"vkCmdExecuteGeneratedCommandsNV\" ) );\n          vkCmdBindPipelineShaderGroupNV     = PFN_vkCmdBindPipelineShaderGroupNV( vkGetDeviceProcAddr( device, \"vkCmdBindPipelineShaderGroupNV\" ) );\n          vkCreateIndirectCommandsLayoutNV   = PFN_vkCreateIndirectCommandsLayoutNV( vkGetDeviceProcAddr( device, \"vkCreateIndirectCommandsLayoutNV\" ) );\n          vkDestroyIndirectCommandsLayoutNV  = PFN_vkDestroyIndirectCommandsLayoutNV( vkGetDeviceProcAddr( device, \"vkDestroyIndirectCommandsLayoutNV\" ) );\n\n          //=== VK_EXT_depth_bias_control ===\n          vkCmdSetDepthBias2EXT = PFN_vkCmdSetDepthBias2EXT( vkGetDeviceProcAddr( device, \"vkCmdSetDepthBias2EXT\" ) );\n\n          //=== VK_EXT_private_data ===\n          vkCreatePrivateDataSlotEXT = PFN_vkCreatePrivateDataSlotEXT( vkGetDeviceProcAddr( device, \"vkCreatePrivateDataSlotEXT\" ) );\n          if ( !vkCreatePrivateDataSlot )\n            vkCreatePrivateDataSlot = vkCreatePrivateDataSlotEXT;\n          vkDestroyPrivateDataSlotEXT = PFN_vkDestroyPrivateDataSlotEXT( vkGetDeviceProcAddr( device, \"vkDestroyPrivateDataSlotEXT\" ) );\n          if ( !vkDestroyPrivateDataSlot )\n            vkDestroyPrivateDataSlot = vkDestroyPrivateDataSlotEXT;\n          vkSetPrivateDataEXT = PFN_vkSetPrivateDataEXT( vkGetDeviceProcAddr( device, \"vkSetPrivateDataEXT\" ) );\n          if ( !vkSetPrivateData )\n            vkSetPrivateData = vkSetPrivateDataEXT;\n          vkGetPrivateDataEXT = PFN_vkGetPrivateDataEXT( vkGetDeviceProcAddr( device, \"vkGetPrivateDataEXT\" ) );\n          if ( !vkGetPrivateData )\n            vkGetPrivateData = vkGetPrivateDataEXT;\n\n          //=== VK_KHR_video_encode_queue ===\n          vkGetEncodedVideoSessionParametersKHR =\n            PFN_vkGetEncodedVideoSessionParametersKHR( vkGetDeviceProcAddr( device, \"vkGetEncodedVideoSessionParametersKHR\" ) );\n          vkCmdEncodeVideoKHR = PFN_vkCmdEncodeVideoKHR( vkGetDeviceProcAddr( device, \"vkCmdEncodeVideoKHR\" ) );\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n          //=== VK_NV_cuda_kernel_launch ===\n          vkCreateCudaModuleNV    = PFN_vkCreateCudaModuleNV( vkGetDeviceProcAddr( device, \"vkCreateCudaModuleNV\" ) );\n          vkGetCudaModuleCacheNV  = PFN_vkGetCudaModuleCacheNV( vkGetDeviceProcAddr( device, \"vkGetCudaModuleCacheNV\" ) );\n          vkCreateCudaFunctionNV  = PFN_vkCreateCudaFunctionNV( vkGetDeviceProcAddr( device, \"vkCreateCudaFunctionNV\" ) );\n          vkDestroyCudaModuleNV   = PFN_vkDestroyCudaModuleNV( vkGetDeviceProcAddr( device, \"vkDestroyCudaModuleNV\" ) );\n          vkDestroyCudaFunctionNV = PFN_vkDestroyCudaFunctionNV( vkGetDeviceProcAddr( device, \"vkDestroyCudaFunctionNV\" ) );\n          vkCmdCudaLaunchKernelNV = PFN_vkCmdCudaLaunchKernelNV( vkGetDeviceProcAddr( device, \"vkCmdCudaLaunchKernelNV\" ) );\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n          //=== VK_EXT_metal_objects ===\n          vkExportMetalObjectsEXT = PFN_vkExportMetalObjectsEXT( vkGetDeviceProcAddr( device, \"vkExportMetalObjectsEXT\" ) );\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n          //=== VK_KHR_synchronization2 ===\n          vkCmdSetEvent2KHR = PFN_vkCmdSetEvent2KHR( vkGetDeviceProcAddr( device, \"vkCmdSetEvent2KHR\" ) );\n          if ( !vkCmdSetEvent2 )\n            vkCmdSetEvent2 = vkCmdSetEvent2KHR;\n          vkCmdResetEvent2KHR = PFN_vkCmdResetEvent2KHR( vkGetDeviceProcAddr( device, \"vkCmdResetEvent2KHR\" ) );\n          if ( !vkCmdResetEvent2 )\n            vkCmdResetEvent2 = vkCmdResetEvent2KHR;\n          vkCmdWaitEvents2KHR = PFN_vkCmdWaitEvents2KHR( vkGetDeviceProcAddr( device, \"vkCmdWaitEvents2KHR\" ) );\n          if ( !vkCmdWaitEvents2 )\n            vkCmdWaitEvents2 = vkCmdWaitEvents2KHR;\n          vkCmdPipelineBarrier2KHR = PFN_vkCmdPipelineBarrier2KHR( vkGetDeviceProcAddr( device, \"vkCmdPipelineBarrier2KHR\" ) );\n          if ( !vkCmdPipelineBarrier2 )\n            vkCmdPipelineBarrier2 = vkCmdPipelineBarrier2KHR;\n          vkCmdWriteTimestamp2KHR = PFN_vkCmdWriteTimestamp2KHR( vkGetDeviceProcAddr( device, \"vkCmdWriteTimestamp2KHR\" ) );\n          if ( !vkCmdWriteTimestamp2 )\n            vkCmdWriteTimestamp2 = vkCmdWriteTimestamp2KHR;\n          vkQueueSubmit2KHR = PFN_vkQueueSubmit2KHR( vkGetDeviceProcAddr( device, \"vkQueueSubmit2KHR\" ) );\n          if ( !vkQueueSubmit2 )\n            vkQueueSubmit2 = vkQueueSubmit2KHR;\n\n          //=== VK_EXT_descriptor_buffer ===\n          vkGetDescriptorSetLayoutSizeEXT = PFN_vkGetDescriptorSetLayoutSizeEXT( vkGetDeviceProcAddr( device, \"vkGetDescriptorSetLayoutSizeEXT\" ) );\n          vkGetDescriptorSetLayoutBindingOffsetEXT =\n            PFN_vkGetDescriptorSetLayoutBindingOffsetEXT( vkGetDeviceProcAddr( device, \"vkGetDescriptorSetLayoutBindingOffsetEXT\" ) );\n          vkGetDescriptorEXT                 = PFN_vkGetDescriptorEXT( vkGetDeviceProcAddr( device, \"vkGetDescriptorEXT\" ) );\n          vkCmdBindDescriptorBuffersEXT      = PFN_vkCmdBindDescriptorBuffersEXT( vkGetDeviceProcAddr( device, \"vkCmdBindDescriptorBuffersEXT\" ) );\n          vkCmdSetDescriptorBufferOffsetsEXT = PFN_vkCmdSetDescriptorBufferOffsetsEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDescriptorBufferOffsetsEXT\" ) );\n          vkCmdBindDescriptorBufferEmbeddedSamplersEXT =\n            PFN_vkCmdBindDescriptorBufferEmbeddedSamplersEXT( vkGetDeviceProcAddr( device, \"vkCmdBindDescriptorBufferEmbeddedSamplersEXT\" ) );\n          vkGetBufferOpaqueCaptureDescriptorDataEXT =\n            PFN_vkGetBufferOpaqueCaptureDescriptorDataEXT( vkGetDeviceProcAddr( device, \"vkGetBufferOpaqueCaptureDescriptorDataEXT\" ) );\n          vkGetImageOpaqueCaptureDescriptorDataEXT =\n            PFN_vkGetImageOpaqueCaptureDescriptorDataEXT( vkGetDeviceProcAddr( device, \"vkGetImageOpaqueCaptureDescriptorDataEXT\" ) );\n          vkGetImageViewOpaqueCaptureDescriptorDataEXT =\n            PFN_vkGetImageViewOpaqueCaptureDescriptorDataEXT( vkGetDeviceProcAddr( device, \"vkGetImageViewOpaqueCaptureDescriptorDataEXT\" ) );\n          vkGetSamplerOpaqueCaptureDescriptorDataEXT =\n            PFN_vkGetSamplerOpaqueCaptureDescriptorDataEXT( vkGetDeviceProcAddr( device, \"vkGetSamplerOpaqueCaptureDescriptorDataEXT\" ) );\n          vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT = PFN_vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT(\n            vkGetDeviceProcAddr( device, \"vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT\" ) );\n\n          //=== VK_NV_fragment_shading_rate_enums ===\n          vkCmdSetFragmentShadingRateEnumNV = PFN_vkCmdSetFragmentShadingRateEnumNV( vkGetDeviceProcAddr( device, \"vkCmdSetFragmentShadingRateEnumNV\" ) );\n\n          //=== VK_EXT_mesh_shader ===\n          vkCmdDrawMeshTasksEXT              = PFN_vkCmdDrawMeshTasksEXT( vkGetDeviceProcAddr( device, \"vkCmdDrawMeshTasksEXT\" ) );\n          vkCmdDrawMeshTasksIndirectEXT      = PFN_vkCmdDrawMeshTasksIndirectEXT( vkGetDeviceProcAddr( device, \"vkCmdDrawMeshTasksIndirectEXT\" ) );\n          vkCmdDrawMeshTasksIndirectCountEXT = PFN_vkCmdDrawMeshTasksIndirectCountEXT( vkGetDeviceProcAddr( device, \"vkCmdDrawMeshTasksIndirectCountEXT\" ) );\n\n          //=== VK_KHR_copy_commands2 ===\n          vkCmdCopyBuffer2KHR = PFN_vkCmdCopyBuffer2KHR( vkGetDeviceProcAddr( device, \"vkCmdCopyBuffer2KHR\" ) );\n          if ( !vkCmdCopyBuffer2 )\n            vkCmdCopyBuffer2 = vkCmdCopyBuffer2KHR;\n          vkCmdCopyImage2KHR = PFN_vkCmdCopyImage2KHR( vkGetDeviceProcAddr( device, \"vkCmdCopyImage2KHR\" ) );\n          if ( !vkCmdCopyImage2 )\n            vkCmdCopyImage2 = vkCmdCopyImage2KHR;\n          vkCmdCopyBufferToImage2KHR = PFN_vkCmdCopyBufferToImage2KHR( vkGetDeviceProcAddr( device, \"vkCmdCopyBufferToImage2KHR\" ) );\n          if ( !vkCmdCopyBufferToImage2 )\n            vkCmdCopyBufferToImage2 = vkCmdCopyBufferToImage2KHR;\n          vkCmdCopyImageToBuffer2KHR = PFN_vkCmdCopyImageToBuffer2KHR( vkGetDeviceProcAddr( device, \"vkCmdCopyImageToBuffer2KHR\" ) );\n          if ( !vkCmdCopyImageToBuffer2 )\n            vkCmdCopyImageToBuffer2 = vkCmdCopyImageToBuffer2KHR;\n          vkCmdBlitImage2KHR = PFN_vkCmdBlitImage2KHR( vkGetDeviceProcAddr( device, \"vkCmdBlitImage2KHR\" ) );\n          if ( !vkCmdBlitImage2 )\n            vkCmdBlitImage2 = vkCmdBlitImage2KHR;\n          vkCmdResolveImage2KHR = PFN_vkCmdResolveImage2KHR( vkGetDeviceProcAddr( device, \"vkCmdResolveImage2KHR\" ) );\n          if ( !vkCmdResolveImage2 )\n            vkCmdResolveImage2 = vkCmdResolveImage2KHR;\n\n          //=== VK_EXT_device_fault ===\n          vkGetDeviceFaultInfoEXT = PFN_vkGetDeviceFaultInfoEXT( vkGetDeviceProcAddr( device, \"vkGetDeviceFaultInfoEXT\" ) );\n\n          //=== VK_EXT_vertex_input_dynamic_state ===\n          vkCmdSetVertexInputEXT = PFN_vkCmdSetVertexInputEXT( vkGetDeviceProcAddr( device, \"vkCmdSetVertexInputEXT\" ) );\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n          //=== VK_FUCHSIA_external_memory ===\n          vkGetMemoryZirconHandleFUCHSIA = PFN_vkGetMemoryZirconHandleFUCHSIA( vkGetDeviceProcAddr( device, \"vkGetMemoryZirconHandleFUCHSIA\" ) );\n          vkGetMemoryZirconHandlePropertiesFUCHSIA =\n            PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA( vkGetDeviceProcAddr( device, \"vkGetMemoryZirconHandlePropertiesFUCHSIA\" ) );\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n          //=== VK_FUCHSIA_external_semaphore ===\n          vkImportSemaphoreZirconHandleFUCHSIA =\n            PFN_vkImportSemaphoreZirconHandleFUCHSIA( vkGetDeviceProcAddr( device, \"vkImportSemaphoreZirconHandleFUCHSIA\" ) );\n          vkGetSemaphoreZirconHandleFUCHSIA = PFN_vkGetSemaphoreZirconHandleFUCHSIA( vkGetDeviceProcAddr( device, \"vkGetSemaphoreZirconHandleFUCHSIA\" ) );\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n          //=== VK_FUCHSIA_buffer_collection ===\n          vkCreateBufferCollectionFUCHSIA = PFN_vkCreateBufferCollectionFUCHSIA( vkGetDeviceProcAddr( device, \"vkCreateBufferCollectionFUCHSIA\" ) );\n          vkSetBufferCollectionImageConstraintsFUCHSIA =\n            PFN_vkSetBufferCollectionImageConstraintsFUCHSIA( vkGetDeviceProcAddr( device, \"vkSetBufferCollectionImageConstraintsFUCHSIA\" ) );\n          vkSetBufferCollectionBufferConstraintsFUCHSIA =\n            PFN_vkSetBufferCollectionBufferConstraintsFUCHSIA( vkGetDeviceProcAddr( device, \"vkSetBufferCollectionBufferConstraintsFUCHSIA\" ) );\n          vkDestroyBufferCollectionFUCHSIA = PFN_vkDestroyBufferCollectionFUCHSIA( vkGetDeviceProcAddr( device, \"vkDestroyBufferCollectionFUCHSIA\" ) );\n          vkGetBufferCollectionPropertiesFUCHSIA =\n            PFN_vkGetBufferCollectionPropertiesFUCHSIA( vkGetDeviceProcAddr( device, \"vkGetBufferCollectionPropertiesFUCHSIA\" ) );\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n          //=== VK_HUAWEI_subpass_shading ===\n          vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI =\n            PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI( vkGetDeviceProcAddr( device, \"vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI\" ) );\n          vkCmdSubpassShadingHUAWEI = PFN_vkCmdSubpassShadingHUAWEI( vkGetDeviceProcAddr( device, \"vkCmdSubpassShadingHUAWEI\" ) );\n\n          //=== VK_HUAWEI_invocation_mask ===\n          vkCmdBindInvocationMaskHUAWEI = PFN_vkCmdBindInvocationMaskHUAWEI( vkGetDeviceProcAddr( device, \"vkCmdBindInvocationMaskHUAWEI\" ) );\n\n          //=== VK_NV_external_memory_rdma ===\n          vkGetMemoryRemoteAddressNV = PFN_vkGetMemoryRemoteAddressNV( vkGetDeviceProcAddr( device, \"vkGetMemoryRemoteAddressNV\" ) );\n\n          //=== VK_EXT_pipeline_properties ===\n          vkGetPipelinePropertiesEXT = PFN_vkGetPipelinePropertiesEXT( vkGetDeviceProcAddr( device, \"vkGetPipelinePropertiesEXT\" ) );\n\n          //=== VK_EXT_extended_dynamic_state2 ===\n          vkCmdSetPatchControlPointsEXT      = PFN_vkCmdSetPatchControlPointsEXT( vkGetDeviceProcAddr( device, \"vkCmdSetPatchControlPointsEXT\" ) );\n          vkCmdSetRasterizerDiscardEnableEXT = PFN_vkCmdSetRasterizerDiscardEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetRasterizerDiscardEnableEXT\" ) );\n          if ( !vkCmdSetRasterizerDiscardEnable )\n            vkCmdSetRasterizerDiscardEnable = vkCmdSetRasterizerDiscardEnableEXT;\n          vkCmdSetDepthBiasEnableEXT = PFN_vkCmdSetDepthBiasEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDepthBiasEnableEXT\" ) );\n          if ( !vkCmdSetDepthBiasEnable )\n            vkCmdSetDepthBiasEnable = vkCmdSetDepthBiasEnableEXT;\n          vkCmdSetLogicOpEXT                = PFN_vkCmdSetLogicOpEXT( vkGetDeviceProcAddr( device, \"vkCmdSetLogicOpEXT\" ) );\n          vkCmdSetPrimitiveRestartEnableEXT = PFN_vkCmdSetPrimitiveRestartEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetPrimitiveRestartEnableEXT\" ) );\n          if ( !vkCmdSetPrimitiveRestartEnable )\n            vkCmdSetPrimitiveRestartEnable = vkCmdSetPrimitiveRestartEnableEXT;\n\n          //=== VK_EXT_color_write_enable ===\n          vkCmdSetColorWriteEnableEXT = PFN_vkCmdSetColorWriteEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetColorWriteEnableEXT\" ) );\n\n          //=== VK_KHR_ray_tracing_maintenance1 ===\n          vkCmdTraceRaysIndirect2KHR = PFN_vkCmdTraceRaysIndirect2KHR( vkGetDeviceProcAddr( device, \"vkCmdTraceRaysIndirect2KHR\" ) );\n\n          //=== VK_EXT_multi_draw ===\n          vkCmdDrawMultiEXT        = PFN_vkCmdDrawMultiEXT( vkGetDeviceProcAddr( device, \"vkCmdDrawMultiEXT\" ) );\n          vkCmdDrawMultiIndexedEXT = PFN_vkCmdDrawMultiIndexedEXT( vkGetDeviceProcAddr( device, \"vkCmdDrawMultiIndexedEXT\" ) );\n\n          //=== VK_EXT_opacity_micromap ===\n          vkCreateMicromapEXT                 = PFN_vkCreateMicromapEXT( vkGetDeviceProcAddr( device, \"vkCreateMicromapEXT\" ) );\n          vkDestroyMicromapEXT                = PFN_vkDestroyMicromapEXT( vkGetDeviceProcAddr( device, \"vkDestroyMicromapEXT\" ) );\n          vkCmdBuildMicromapsEXT              = PFN_vkCmdBuildMicromapsEXT( vkGetDeviceProcAddr( device, \"vkCmdBuildMicromapsEXT\" ) );\n          vkBuildMicromapsEXT                 = PFN_vkBuildMicromapsEXT( vkGetDeviceProcAddr( device, \"vkBuildMicromapsEXT\" ) );\n          vkCopyMicromapEXT                   = PFN_vkCopyMicromapEXT( vkGetDeviceProcAddr( device, \"vkCopyMicromapEXT\" ) );\n          vkCopyMicromapToMemoryEXT           = PFN_vkCopyMicromapToMemoryEXT( vkGetDeviceProcAddr( device, \"vkCopyMicromapToMemoryEXT\" ) );\n          vkCopyMemoryToMicromapEXT           = PFN_vkCopyMemoryToMicromapEXT( vkGetDeviceProcAddr( device, \"vkCopyMemoryToMicromapEXT\" ) );\n          vkWriteMicromapsPropertiesEXT       = PFN_vkWriteMicromapsPropertiesEXT( vkGetDeviceProcAddr( device, \"vkWriteMicromapsPropertiesEXT\" ) );\n          vkCmdCopyMicromapEXT                = PFN_vkCmdCopyMicromapEXT( vkGetDeviceProcAddr( device, \"vkCmdCopyMicromapEXT\" ) );\n          vkCmdCopyMicromapToMemoryEXT        = PFN_vkCmdCopyMicromapToMemoryEXT( vkGetDeviceProcAddr( device, \"vkCmdCopyMicromapToMemoryEXT\" ) );\n          vkCmdCopyMemoryToMicromapEXT        = PFN_vkCmdCopyMemoryToMicromapEXT( vkGetDeviceProcAddr( device, \"vkCmdCopyMemoryToMicromapEXT\" ) );\n          vkCmdWriteMicromapsPropertiesEXT    = PFN_vkCmdWriteMicromapsPropertiesEXT( vkGetDeviceProcAddr( device, \"vkCmdWriteMicromapsPropertiesEXT\" ) );\n          vkGetDeviceMicromapCompatibilityEXT = PFN_vkGetDeviceMicromapCompatibilityEXT( vkGetDeviceProcAddr( device, \"vkGetDeviceMicromapCompatibilityEXT\" ) );\n          vkGetMicromapBuildSizesEXT          = PFN_vkGetMicromapBuildSizesEXT( vkGetDeviceProcAddr( device, \"vkGetMicromapBuildSizesEXT\" ) );\n\n          //=== VK_HUAWEI_cluster_culling_shader ===\n          vkCmdDrawClusterHUAWEI         = PFN_vkCmdDrawClusterHUAWEI( vkGetDeviceProcAddr( device, \"vkCmdDrawClusterHUAWEI\" ) );\n          vkCmdDrawClusterIndirectHUAWEI = PFN_vkCmdDrawClusterIndirectHUAWEI( vkGetDeviceProcAddr( device, \"vkCmdDrawClusterIndirectHUAWEI\" ) );\n\n          //=== VK_EXT_pageable_device_local_memory ===\n          vkSetDeviceMemoryPriorityEXT = PFN_vkSetDeviceMemoryPriorityEXT( vkGetDeviceProcAddr( device, \"vkSetDeviceMemoryPriorityEXT\" ) );\n\n          //=== VK_KHR_maintenance4 ===\n          vkGetDeviceBufferMemoryRequirementsKHR =\n            PFN_vkGetDeviceBufferMemoryRequirementsKHR( vkGetDeviceProcAddr( device, \"vkGetDeviceBufferMemoryRequirementsKHR\" ) );\n          if ( !vkGetDeviceBufferMemoryRequirements )\n            vkGetDeviceBufferMemoryRequirements = vkGetDeviceBufferMemoryRequirementsKHR;\n          vkGetDeviceImageMemoryRequirementsKHR =\n            PFN_vkGetDeviceImageMemoryRequirementsKHR( vkGetDeviceProcAddr( device, \"vkGetDeviceImageMemoryRequirementsKHR\" ) );\n          if ( !vkGetDeviceImageMemoryRequirements )\n            vkGetDeviceImageMemoryRequirements = vkGetDeviceImageMemoryRequirementsKHR;\n          vkGetDeviceImageSparseMemoryRequirementsKHR =\n            PFN_vkGetDeviceImageSparseMemoryRequirementsKHR( vkGetDeviceProcAddr( device, \"vkGetDeviceImageSparseMemoryRequirementsKHR\" ) );\n          if ( !vkGetDeviceImageSparseMemoryRequirements )\n            vkGetDeviceImageSparseMemoryRequirements = vkGetDeviceImageSparseMemoryRequirementsKHR;\n\n          //=== VK_VALVE_descriptor_set_host_mapping ===\n          vkGetDescriptorSetLayoutHostMappingInfoVALVE =\n            PFN_vkGetDescriptorSetLayoutHostMappingInfoVALVE( vkGetDeviceProcAddr( device, \"vkGetDescriptorSetLayoutHostMappingInfoVALVE\" ) );\n          vkGetDescriptorSetHostMappingVALVE = PFN_vkGetDescriptorSetHostMappingVALVE( vkGetDeviceProcAddr( device, \"vkGetDescriptorSetHostMappingVALVE\" ) );\n\n          //=== VK_NV_copy_memory_indirect ===\n          vkCmdCopyMemoryIndirectNV        = PFN_vkCmdCopyMemoryIndirectNV( vkGetDeviceProcAddr( device, \"vkCmdCopyMemoryIndirectNV\" ) );\n          vkCmdCopyMemoryToImageIndirectNV = PFN_vkCmdCopyMemoryToImageIndirectNV( vkGetDeviceProcAddr( device, \"vkCmdCopyMemoryToImageIndirectNV\" ) );\n\n          //=== VK_NV_memory_decompression ===\n          vkCmdDecompressMemoryNV = PFN_vkCmdDecompressMemoryNV( vkGetDeviceProcAddr( device, \"vkCmdDecompressMemoryNV\" ) );\n          vkCmdDecompressMemoryIndirectCountNV =\n            PFN_vkCmdDecompressMemoryIndirectCountNV( vkGetDeviceProcAddr( device, \"vkCmdDecompressMemoryIndirectCountNV\" ) );\n\n          //=== VK_NV_device_generated_commands_compute ===\n          vkGetPipelineIndirectMemoryRequirementsNV =\n            PFN_vkGetPipelineIndirectMemoryRequirementsNV( vkGetDeviceProcAddr( device, \"vkGetPipelineIndirectMemoryRequirementsNV\" ) );\n          vkCmdUpdatePipelineIndirectBufferNV = PFN_vkCmdUpdatePipelineIndirectBufferNV( vkGetDeviceProcAddr( device, \"vkCmdUpdatePipelineIndirectBufferNV\" ) );\n          vkGetPipelineIndirectDeviceAddressNV =\n            PFN_vkGetPipelineIndirectDeviceAddressNV( vkGetDeviceProcAddr( device, \"vkGetPipelineIndirectDeviceAddressNV\" ) );\n\n          //=== VK_EXT_extended_dynamic_state3 ===\n          vkCmdSetDepthClampEnableEXT         = PFN_vkCmdSetDepthClampEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDepthClampEnableEXT\" ) );\n          vkCmdSetPolygonModeEXT              = PFN_vkCmdSetPolygonModeEXT( vkGetDeviceProcAddr( device, \"vkCmdSetPolygonModeEXT\" ) );\n          vkCmdSetRasterizationSamplesEXT     = PFN_vkCmdSetRasterizationSamplesEXT( vkGetDeviceProcAddr( device, \"vkCmdSetRasterizationSamplesEXT\" ) );\n          vkCmdSetSampleMaskEXT               = PFN_vkCmdSetSampleMaskEXT( vkGetDeviceProcAddr( device, \"vkCmdSetSampleMaskEXT\" ) );\n          vkCmdSetAlphaToCoverageEnableEXT    = PFN_vkCmdSetAlphaToCoverageEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetAlphaToCoverageEnableEXT\" ) );\n          vkCmdSetAlphaToOneEnableEXT         = PFN_vkCmdSetAlphaToOneEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetAlphaToOneEnableEXT\" ) );\n          vkCmdSetLogicOpEnableEXT            = PFN_vkCmdSetLogicOpEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetLogicOpEnableEXT\" ) );\n          vkCmdSetColorBlendEnableEXT         = PFN_vkCmdSetColorBlendEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetColorBlendEnableEXT\" ) );\n          vkCmdSetColorBlendEquationEXT       = PFN_vkCmdSetColorBlendEquationEXT( vkGetDeviceProcAddr( device, \"vkCmdSetColorBlendEquationEXT\" ) );\n          vkCmdSetColorWriteMaskEXT           = PFN_vkCmdSetColorWriteMaskEXT( vkGetDeviceProcAddr( device, \"vkCmdSetColorWriteMaskEXT\" ) );\n          vkCmdSetTessellationDomainOriginEXT = PFN_vkCmdSetTessellationDomainOriginEXT( vkGetDeviceProcAddr( device, \"vkCmdSetTessellationDomainOriginEXT\" ) );\n          vkCmdSetRasterizationStreamEXT      = PFN_vkCmdSetRasterizationStreamEXT( vkGetDeviceProcAddr( device, \"vkCmdSetRasterizationStreamEXT\" ) );\n          vkCmdSetConservativeRasterizationModeEXT =\n            PFN_vkCmdSetConservativeRasterizationModeEXT( vkGetDeviceProcAddr( device, \"vkCmdSetConservativeRasterizationModeEXT\" ) );\n          vkCmdSetExtraPrimitiveOverestimationSizeEXT =\n            PFN_vkCmdSetExtraPrimitiveOverestimationSizeEXT( vkGetDeviceProcAddr( device, \"vkCmdSetExtraPrimitiveOverestimationSizeEXT\" ) );\n          vkCmdSetDepthClipEnableEXT       = PFN_vkCmdSetDepthClipEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDepthClipEnableEXT\" ) );\n          vkCmdSetSampleLocationsEnableEXT = PFN_vkCmdSetSampleLocationsEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetSampleLocationsEnableEXT\" ) );\n          vkCmdSetColorBlendAdvancedEXT    = PFN_vkCmdSetColorBlendAdvancedEXT( vkGetDeviceProcAddr( device, \"vkCmdSetColorBlendAdvancedEXT\" ) );\n          vkCmdSetProvokingVertexModeEXT   = PFN_vkCmdSetProvokingVertexModeEXT( vkGetDeviceProcAddr( device, \"vkCmdSetProvokingVertexModeEXT\" ) );\n          vkCmdSetLineRasterizationModeEXT = PFN_vkCmdSetLineRasterizationModeEXT( vkGetDeviceProcAddr( device, \"vkCmdSetLineRasterizationModeEXT\" ) );\n          vkCmdSetLineStippleEnableEXT     = PFN_vkCmdSetLineStippleEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetLineStippleEnableEXT\" ) );\n          vkCmdSetDepthClipNegativeOneToOneEXT =\n            PFN_vkCmdSetDepthClipNegativeOneToOneEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDepthClipNegativeOneToOneEXT\" ) );\n          vkCmdSetViewportWScalingEnableNV  = PFN_vkCmdSetViewportWScalingEnableNV( vkGetDeviceProcAddr( device, \"vkCmdSetViewportWScalingEnableNV\" ) );\n          vkCmdSetViewportSwizzleNV         = PFN_vkCmdSetViewportSwizzleNV( vkGetDeviceProcAddr( device, \"vkCmdSetViewportSwizzleNV\" ) );\n          vkCmdSetCoverageToColorEnableNV   = PFN_vkCmdSetCoverageToColorEnableNV( vkGetDeviceProcAddr( device, \"vkCmdSetCoverageToColorEnableNV\" ) );\n          vkCmdSetCoverageToColorLocationNV = PFN_vkCmdSetCoverageToColorLocationNV( vkGetDeviceProcAddr( device, \"vkCmdSetCoverageToColorLocationNV\" ) );\n          vkCmdSetCoverageModulationModeNV  = PFN_vkCmdSetCoverageModulationModeNV( vkGetDeviceProcAddr( device, \"vkCmdSetCoverageModulationModeNV\" ) );\n          vkCmdSetCoverageModulationTableEnableNV =\n            PFN_vkCmdSetCoverageModulationTableEnableNV( vkGetDeviceProcAddr( device, \"vkCmdSetCoverageModulationTableEnableNV\" ) );\n          vkCmdSetCoverageModulationTableNV = PFN_vkCmdSetCoverageModulationTableNV( vkGetDeviceProcAddr( device, \"vkCmdSetCoverageModulationTableNV\" ) );\n          vkCmdSetShadingRateImageEnableNV  = PFN_vkCmdSetShadingRateImageEnableNV( vkGetDeviceProcAddr( device, \"vkCmdSetShadingRateImageEnableNV\" ) );\n          vkCmdSetRepresentativeFragmentTestEnableNV =\n            PFN_vkCmdSetRepresentativeFragmentTestEnableNV( vkGetDeviceProcAddr( device, \"vkCmdSetRepresentativeFragmentTestEnableNV\" ) );\n          vkCmdSetCoverageReductionModeNV = PFN_vkCmdSetCoverageReductionModeNV( vkGetDeviceProcAddr( device, \"vkCmdSetCoverageReductionModeNV\" ) );\n\n          //=== VK_EXT_shader_module_identifier ===\n          vkGetShaderModuleIdentifierEXT = PFN_vkGetShaderModuleIdentifierEXT( vkGetDeviceProcAddr( device, \"vkGetShaderModuleIdentifierEXT\" ) );\n          vkGetShaderModuleCreateInfoIdentifierEXT =\n            PFN_vkGetShaderModuleCreateInfoIdentifierEXT( vkGetDeviceProcAddr( device, \"vkGetShaderModuleCreateInfoIdentifierEXT\" ) );\n\n          //=== VK_NV_optical_flow ===\n          vkCreateOpticalFlowSessionNV    = PFN_vkCreateOpticalFlowSessionNV( vkGetDeviceProcAddr( device, \"vkCreateOpticalFlowSessionNV\" ) );\n          vkDestroyOpticalFlowSessionNV   = PFN_vkDestroyOpticalFlowSessionNV( vkGetDeviceProcAddr( device, \"vkDestroyOpticalFlowSessionNV\" ) );\n          vkBindOpticalFlowSessionImageNV = PFN_vkBindOpticalFlowSessionImageNV( vkGetDeviceProcAddr( device, \"vkBindOpticalFlowSessionImageNV\" ) );\n          vkCmdOpticalFlowExecuteNV       = PFN_vkCmdOpticalFlowExecuteNV( vkGetDeviceProcAddr( device, \"vkCmdOpticalFlowExecuteNV\" ) );\n\n          //=== VK_KHR_maintenance5 ===\n          vkCmdBindIndexBuffer2KHR = PFN_vkCmdBindIndexBuffer2KHR( vkGetDeviceProcAddr( device, \"vkCmdBindIndexBuffer2KHR\" ) );\n          if ( !vkCmdBindIndexBuffer2 )\n            vkCmdBindIndexBuffer2 = vkCmdBindIndexBuffer2KHR;\n          vkGetRenderingAreaGranularityKHR = PFN_vkGetRenderingAreaGranularityKHR( vkGetDeviceProcAddr( device, \"vkGetRenderingAreaGranularityKHR\" ) );\n          if ( !vkGetRenderingAreaGranularity )\n            vkGetRenderingAreaGranularity = vkGetRenderingAreaGranularityKHR;\n          vkGetDeviceImageSubresourceLayoutKHR =\n            PFN_vkGetDeviceImageSubresourceLayoutKHR( vkGetDeviceProcAddr( device, \"vkGetDeviceImageSubresourceLayoutKHR\" ) );\n          if ( !vkGetDeviceImageSubresourceLayout )\n            vkGetDeviceImageSubresourceLayout = vkGetDeviceImageSubresourceLayoutKHR;\n          vkGetImageSubresourceLayout2KHR = PFN_vkGetImageSubresourceLayout2KHR( vkGetDeviceProcAddr( device, \"vkGetImageSubresourceLayout2KHR\" ) );\n          if ( !vkGetImageSubresourceLayout2 )\n            vkGetImageSubresourceLayout2 = vkGetImageSubresourceLayout2KHR;\n\n          //=== VK_AMD_anti_lag ===\n          vkAntiLagUpdateAMD = PFN_vkAntiLagUpdateAMD( vkGetDeviceProcAddr( device, \"vkAntiLagUpdateAMD\" ) );\n\n          //=== VK_EXT_shader_object ===\n          vkCreateShadersEXT         = PFN_vkCreateShadersEXT( vkGetDeviceProcAddr( device, \"vkCreateShadersEXT\" ) );\n          vkDestroyShaderEXT         = PFN_vkDestroyShaderEXT( vkGetDeviceProcAddr( device, \"vkDestroyShaderEXT\" ) );\n          vkGetShaderBinaryDataEXT   = PFN_vkGetShaderBinaryDataEXT( vkGetDeviceProcAddr( device, \"vkGetShaderBinaryDataEXT\" ) );\n          vkCmdBindShadersEXT        = PFN_vkCmdBindShadersEXT( vkGetDeviceProcAddr( device, \"vkCmdBindShadersEXT\" ) );\n          vkCmdSetDepthClampRangeEXT = PFN_vkCmdSetDepthClampRangeEXT( vkGetDeviceProcAddr( device, \"vkCmdSetDepthClampRangeEXT\" ) );\n\n          //=== VK_KHR_pipeline_binary ===\n          vkCreatePipelineBinariesKHR      = PFN_vkCreatePipelineBinariesKHR( vkGetDeviceProcAddr( device, \"vkCreatePipelineBinariesKHR\" ) );\n          vkDestroyPipelineBinaryKHR       = PFN_vkDestroyPipelineBinaryKHR( vkGetDeviceProcAddr( device, \"vkDestroyPipelineBinaryKHR\" ) );\n          vkGetPipelineKeyKHR              = PFN_vkGetPipelineKeyKHR( vkGetDeviceProcAddr( device, \"vkGetPipelineKeyKHR\" ) );\n          vkGetPipelineBinaryDataKHR       = PFN_vkGetPipelineBinaryDataKHR( vkGetDeviceProcAddr( device, \"vkGetPipelineBinaryDataKHR\" ) );\n          vkReleaseCapturedPipelineDataKHR = PFN_vkReleaseCapturedPipelineDataKHR( vkGetDeviceProcAddr( device, \"vkReleaseCapturedPipelineDataKHR\" ) );\n\n          //=== VK_QCOM_tile_properties ===\n          vkGetFramebufferTilePropertiesQCOM = PFN_vkGetFramebufferTilePropertiesQCOM( vkGetDeviceProcAddr( device, \"vkGetFramebufferTilePropertiesQCOM\" ) );\n          vkGetDynamicRenderingTilePropertiesQCOM =\n            PFN_vkGetDynamicRenderingTilePropertiesQCOM( vkGetDeviceProcAddr( device, \"vkGetDynamicRenderingTilePropertiesQCOM\" ) );\n\n          //=== VK_NV_cooperative_vector ===\n          vkConvertCooperativeVectorMatrixNV = PFN_vkConvertCooperativeVectorMatrixNV( vkGetDeviceProcAddr( device, \"vkConvertCooperativeVectorMatrixNV\" ) );\n          vkCmdConvertCooperativeVectorMatrixNV =\n            PFN_vkCmdConvertCooperativeVectorMatrixNV( vkGetDeviceProcAddr( device, \"vkCmdConvertCooperativeVectorMatrixNV\" ) );\n\n          //=== VK_NV_low_latency2 ===\n          vkSetLatencySleepModeNV  = PFN_vkSetLatencySleepModeNV( vkGetDeviceProcAddr( device, \"vkSetLatencySleepModeNV\" ) );\n          vkLatencySleepNV         = PFN_vkLatencySleepNV( vkGetDeviceProcAddr( device, \"vkLatencySleepNV\" ) );\n          vkSetLatencyMarkerNV     = PFN_vkSetLatencyMarkerNV( vkGetDeviceProcAddr( device, \"vkSetLatencyMarkerNV\" ) );\n          vkGetLatencyTimingsNV    = PFN_vkGetLatencyTimingsNV( vkGetDeviceProcAddr( device, \"vkGetLatencyTimingsNV\" ) );\n          vkQueueNotifyOutOfBandNV = PFN_vkQueueNotifyOutOfBandNV( vkGetDeviceProcAddr( device, \"vkQueueNotifyOutOfBandNV\" ) );\n\n          //=== VK_EXT_attachment_feedback_loop_dynamic_state ===\n          vkCmdSetAttachmentFeedbackLoopEnableEXT =\n            PFN_vkCmdSetAttachmentFeedbackLoopEnableEXT( vkGetDeviceProcAddr( device, \"vkCmdSetAttachmentFeedbackLoopEnableEXT\" ) );\n\n#  if defined( VK_USE_PLATFORM_SCREEN_QNX )\n          //=== VK_QNX_external_memory_screen_buffer ===\n          vkGetScreenBufferPropertiesQNX = PFN_vkGetScreenBufferPropertiesQNX( vkGetDeviceProcAddr( device, \"vkGetScreenBufferPropertiesQNX\" ) );\n#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n          //=== VK_KHR_line_rasterization ===\n          vkCmdSetLineStippleKHR = PFN_vkCmdSetLineStippleKHR( vkGetDeviceProcAddr( device, \"vkCmdSetLineStippleKHR\" ) );\n          if ( !vkCmdSetLineStipple )\n            vkCmdSetLineStipple = vkCmdSetLineStippleKHR;\n\n          //=== VK_KHR_calibrated_timestamps ===\n          vkGetCalibratedTimestampsKHR = PFN_vkGetCalibratedTimestampsKHR( vkGetDeviceProcAddr( device, \"vkGetCalibratedTimestampsKHR\" ) );\n\n          //=== VK_KHR_maintenance6 ===\n          vkCmdBindDescriptorSets2KHR = PFN_vkCmdBindDescriptorSets2KHR( vkGetDeviceProcAddr( device, \"vkCmdBindDescriptorSets2KHR\" ) );\n          if ( !vkCmdBindDescriptorSets2 )\n            vkCmdBindDescriptorSets2 = vkCmdBindDescriptorSets2KHR;\n          vkCmdPushConstants2KHR = PFN_vkCmdPushConstants2KHR( vkGetDeviceProcAddr( device, \"vkCmdPushConstants2KHR\" ) );\n          if ( !vkCmdPushConstants2 )\n            vkCmdPushConstants2 = vkCmdPushConstants2KHR;\n          vkCmdPushDescriptorSet2KHR = PFN_vkCmdPushDescriptorSet2KHR( vkGetDeviceProcAddr( device, \"vkCmdPushDescriptorSet2KHR\" ) );\n          if ( !vkCmdPushDescriptorSet2 )\n            vkCmdPushDescriptorSet2 = vkCmdPushDescriptorSet2KHR;\n          vkCmdPushDescriptorSetWithTemplate2KHR =\n            PFN_vkCmdPushDescriptorSetWithTemplate2KHR( vkGetDeviceProcAddr( device, \"vkCmdPushDescriptorSetWithTemplate2KHR\" ) );\n          if ( !vkCmdPushDescriptorSetWithTemplate2 )\n            vkCmdPushDescriptorSetWithTemplate2 = vkCmdPushDescriptorSetWithTemplate2KHR;\n          vkCmdSetDescriptorBufferOffsets2EXT = PFN_vkCmdSetDescriptorBufferOffsets2EXT( vkGetDeviceProcAddr( device, \"vkCmdSetDescriptorBufferOffsets2EXT\" ) );\n          vkCmdBindDescriptorBufferEmbeddedSamplers2EXT =\n            PFN_vkCmdBindDescriptorBufferEmbeddedSamplers2EXT( vkGetDeviceProcAddr( device, \"vkCmdBindDescriptorBufferEmbeddedSamplers2EXT\" ) );\n\n          //=== VK_NV_cluster_acceleration_structure ===\n          vkGetClusterAccelerationStructureBuildSizesNV =\n            PFN_vkGetClusterAccelerationStructureBuildSizesNV( vkGetDeviceProcAddr( device, \"vkGetClusterAccelerationStructureBuildSizesNV\" ) );\n          vkCmdBuildClusterAccelerationStructureIndirectNV =\n            PFN_vkCmdBuildClusterAccelerationStructureIndirectNV( vkGetDeviceProcAddr( device, \"vkCmdBuildClusterAccelerationStructureIndirectNV\" ) );\n\n          //=== VK_NV_partitioned_acceleration_structure ===\n          vkGetPartitionedAccelerationStructuresBuildSizesNV =\n            PFN_vkGetPartitionedAccelerationStructuresBuildSizesNV( vkGetDeviceProcAddr( device, \"vkGetPartitionedAccelerationStructuresBuildSizesNV\" ) );\n          vkCmdBuildPartitionedAccelerationStructuresNV =\n            PFN_vkCmdBuildPartitionedAccelerationStructuresNV( vkGetDeviceProcAddr( device, \"vkCmdBuildPartitionedAccelerationStructuresNV\" ) );\n\n          //=== VK_EXT_device_generated_commands ===\n          vkGetGeneratedCommandsMemoryRequirementsEXT =\n            PFN_vkGetGeneratedCommandsMemoryRequirementsEXT( vkGetDeviceProcAddr( device, \"vkGetGeneratedCommandsMemoryRequirementsEXT\" ) );\n          vkCmdPreprocessGeneratedCommandsEXT = PFN_vkCmdPreprocessGeneratedCommandsEXT( vkGetDeviceProcAddr( device, \"vkCmdPreprocessGeneratedCommandsEXT\" ) );\n          vkCmdExecuteGeneratedCommandsEXT    = PFN_vkCmdExecuteGeneratedCommandsEXT( vkGetDeviceProcAddr( device, \"vkCmdExecuteGeneratedCommandsEXT\" ) );\n          vkCreateIndirectCommandsLayoutEXT   = PFN_vkCreateIndirectCommandsLayoutEXT( vkGetDeviceProcAddr( device, \"vkCreateIndirectCommandsLayoutEXT\" ) );\n          vkDestroyIndirectCommandsLayoutEXT  = PFN_vkDestroyIndirectCommandsLayoutEXT( vkGetDeviceProcAddr( device, \"vkDestroyIndirectCommandsLayoutEXT\" ) );\n          vkCreateIndirectExecutionSetEXT     = PFN_vkCreateIndirectExecutionSetEXT( vkGetDeviceProcAddr( device, \"vkCreateIndirectExecutionSetEXT\" ) );\n          vkDestroyIndirectExecutionSetEXT    = PFN_vkDestroyIndirectExecutionSetEXT( vkGetDeviceProcAddr( device, \"vkDestroyIndirectExecutionSetEXT\" ) );\n          vkUpdateIndirectExecutionSetPipelineEXT =\n            PFN_vkUpdateIndirectExecutionSetPipelineEXT( vkGetDeviceProcAddr( device, \"vkUpdateIndirectExecutionSetPipelineEXT\" ) );\n          vkUpdateIndirectExecutionSetShaderEXT =\n            PFN_vkUpdateIndirectExecutionSetShaderEXT( vkGetDeviceProcAddr( device, \"vkUpdateIndirectExecutionSetShaderEXT\" ) );\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n          //=== VK_EXT_external_memory_metal ===\n          vkGetMemoryMetalHandleEXT           = PFN_vkGetMemoryMetalHandleEXT( vkGetDeviceProcAddr( device, \"vkGetMemoryMetalHandleEXT\" ) );\n          vkGetMemoryMetalHandlePropertiesEXT = PFN_vkGetMemoryMetalHandlePropertiesEXT( vkGetDeviceProcAddr( device, \"vkGetMemoryMetalHandlePropertiesEXT\" ) );\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n        }\n\n      public:\n        //=== VK_VERSION_1_0 ===\n        PFN_vkGetDeviceProcAddr                vkGetDeviceProcAddr                = 0;\n        PFN_vkDestroyDevice                    vkDestroyDevice                    = 0;\n        PFN_vkGetDeviceQueue                   vkGetDeviceQueue                   = 0;\n        PFN_vkQueueSubmit                      vkQueueSubmit                      = 0;\n        PFN_vkQueueWaitIdle                    vkQueueWaitIdle                    = 0;\n        PFN_vkDeviceWaitIdle                   vkDeviceWaitIdle                   = 0;\n        PFN_vkAllocateMemory                   vkAllocateMemory                   = 0;\n        PFN_vkFreeMemory                       vkFreeMemory                       = 0;\n        PFN_vkMapMemory                        vkMapMemory                        = 0;\n        PFN_vkUnmapMemory                      vkUnmapMemory                      = 0;\n        PFN_vkFlushMappedMemoryRanges          vkFlushMappedMemoryRanges          = 0;\n        PFN_vkInvalidateMappedMemoryRanges     vkInvalidateMappedMemoryRanges     = 0;\n        PFN_vkGetDeviceMemoryCommitment        vkGetDeviceMemoryCommitment        = 0;\n        PFN_vkBindBufferMemory                 vkBindBufferMemory                 = 0;\n        PFN_vkBindImageMemory                  vkBindImageMemory                  = 0;\n        PFN_vkGetBufferMemoryRequirements      vkGetBufferMemoryRequirements      = 0;\n        PFN_vkGetImageMemoryRequirements       vkGetImageMemoryRequirements       = 0;\n        PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements = 0;\n        PFN_vkQueueBindSparse                  vkQueueBindSparse                  = 0;\n        PFN_vkCreateFence                      vkCreateFence                      = 0;\n        PFN_vkDestroyFence                     vkDestroyFence                     = 0;\n        PFN_vkResetFences                      vkResetFences                      = 0;\n        PFN_vkGetFenceStatus                   vkGetFenceStatus                   = 0;\n        PFN_vkWaitForFences                    vkWaitForFences                    = 0;\n        PFN_vkCreateSemaphore                  vkCreateSemaphore                  = 0;\n        PFN_vkDestroySemaphore                 vkDestroySemaphore                 = 0;\n        PFN_vkCreateEvent                      vkCreateEvent                      = 0;\n        PFN_vkDestroyEvent                     vkDestroyEvent                     = 0;\n        PFN_vkGetEventStatus                   vkGetEventStatus                   = 0;\n        PFN_vkSetEvent                         vkSetEvent                         = 0;\n        PFN_vkResetEvent                       vkResetEvent                       = 0;\n        PFN_vkCreateQueryPool                  vkCreateQueryPool                  = 0;\n        PFN_vkDestroyQueryPool                 vkDestroyQueryPool                 = 0;\n        PFN_vkGetQueryPoolResults              vkGetQueryPoolResults              = 0;\n        PFN_vkCreateBuffer                     vkCreateBuffer                     = 0;\n        PFN_vkDestroyBuffer                    vkDestroyBuffer                    = 0;\n        PFN_vkCreateBufferView                 vkCreateBufferView                 = 0;\n        PFN_vkDestroyBufferView                vkDestroyBufferView                = 0;\n        PFN_vkCreateImage                      vkCreateImage                      = 0;\n        PFN_vkDestroyImage                     vkDestroyImage                     = 0;\n        PFN_vkGetImageSubresourceLayout        vkGetImageSubresourceLayout        = 0;\n        PFN_vkCreateImageView                  vkCreateImageView                  = 0;\n        PFN_vkDestroyImageView                 vkDestroyImageView                 = 0;\n        PFN_vkCreateShaderModule               vkCreateShaderModule               = 0;\n        PFN_vkDestroyShaderModule              vkDestroyShaderModule              = 0;\n        PFN_vkCreatePipelineCache              vkCreatePipelineCache              = 0;\n        PFN_vkDestroyPipelineCache             vkDestroyPipelineCache             = 0;\n        PFN_vkGetPipelineCacheData             vkGetPipelineCacheData             = 0;\n        PFN_vkMergePipelineCaches              vkMergePipelineCaches              = 0;\n        PFN_vkCreateGraphicsPipelines          vkCreateGraphicsPipelines          = 0;\n        PFN_vkCreateComputePipelines           vkCreateComputePipelines           = 0;\n        PFN_vkDestroyPipeline                  vkDestroyPipeline                  = 0;\n        PFN_vkCreatePipelineLayout             vkCreatePipelineLayout             = 0;\n        PFN_vkDestroyPipelineLayout            vkDestroyPipelineLayout            = 0;\n        PFN_vkCreateSampler                    vkCreateSampler                    = 0;\n        PFN_vkDestroySampler                   vkDestroySampler                   = 0;\n        PFN_vkCreateDescriptorSetLayout        vkCreateDescriptorSetLayout        = 0;\n        PFN_vkDestroyDescriptorSetLayout       vkDestroyDescriptorSetLayout       = 0;\n        PFN_vkCreateDescriptorPool             vkCreateDescriptorPool             = 0;\n        PFN_vkDestroyDescriptorPool            vkDestroyDescriptorPool            = 0;\n        PFN_vkResetDescriptorPool              vkResetDescriptorPool              = 0;\n        PFN_vkAllocateDescriptorSets           vkAllocateDescriptorSets           = 0;\n        PFN_vkFreeDescriptorSets               vkFreeDescriptorSets               = 0;\n        PFN_vkUpdateDescriptorSets             vkUpdateDescriptorSets             = 0;\n        PFN_vkCreateFramebuffer                vkCreateFramebuffer                = 0;\n        PFN_vkDestroyFramebuffer               vkDestroyFramebuffer               = 0;\n        PFN_vkCreateRenderPass                 vkCreateRenderPass                 = 0;\n        PFN_vkDestroyRenderPass                vkDestroyRenderPass                = 0;\n        PFN_vkGetRenderAreaGranularity         vkGetRenderAreaGranularity         = 0;\n        PFN_vkCreateCommandPool                vkCreateCommandPool                = 0;\n        PFN_vkDestroyCommandPool               vkDestroyCommandPool               = 0;\n        PFN_vkResetCommandPool                 vkResetCommandPool                 = 0;\n        PFN_vkAllocateCommandBuffers           vkAllocateCommandBuffers           = 0;\n        PFN_vkFreeCommandBuffers               vkFreeCommandBuffers               = 0;\n        PFN_vkBeginCommandBuffer               vkBeginCommandBuffer               = 0;\n        PFN_vkEndCommandBuffer                 vkEndCommandBuffer                 = 0;\n        PFN_vkResetCommandBuffer               vkResetCommandBuffer               = 0;\n        PFN_vkCmdBindPipeline                  vkCmdBindPipeline                  = 0;\n        PFN_vkCmdSetViewport                   vkCmdSetViewport                   = 0;\n        PFN_vkCmdSetScissor                    vkCmdSetScissor                    = 0;\n        PFN_vkCmdSetLineWidth                  vkCmdSetLineWidth                  = 0;\n        PFN_vkCmdSetDepthBias                  vkCmdSetDepthBias                  = 0;\n        PFN_vkCmdSetBlendConstants             vkCmdSetBlendConstants             = 0;\n        PFN_vkCmdSetDepthBounds                vkCmdSetDepthBounds                = 0;\n        PFN_vkCmdSetStencilCompareMask         vkCmdSetStencilCompareMask         = 0;\n        PFN_vkCmdSetStencilWriteMask           vkCmdSetStencilWriteMask           = 0;\n        PFN_vkCmdSetStencilReference           vkCmdSetStencilReference           = 0;\n        PFN_vkCmdBindDescriptorSets            vkCmdBindDescriptorSets            = 0;\n        PFN_vkCmdBindIndexBuffer               vkCmdBindIndexBuffer               = 0;\n        PFN_vkCmdBindVertexBuffers             vkCmdBindVertexBuffers             = 0;\n        PFN_vkCmdDraw                          vkCmdDraw                          = 0;\n        PFN_vkCmdDrawIndexed                   vkCmdDrawIndexed                   = 0;\n        PFN_vkCmdDrawIndirect                  vkCmdDrawIndirect                  = 0;\n        PFN_vkCmdDrawIndexedIndirect           vkCmdDrawIndexedIndirect           = 0;\n        PFN_vkCmdDispatch                      vkCmdDispatch                      = 0;\n        PFN_vkCmdDispatchIndirect              vkCmdDispatchIndirect              = 0;\n        PFN_vkCmdCopyBuffer                    vkCmdCopyBuffer                    = 0;\n        PFN_vkCmdCopyImage                     vkCmdCopyImage                     = 0;\n        PFN_vkCmdBlitImage                     vkCmdBlitImage                     = 0;\n        PFN_vkCmdCopyBufferToImage             vkCmdCopyBufferToImage             = 0;\n        PFN_vkCmdCopyImageToBuffer             vkCmdCopyImageToBuffer             = 0;\n        PFN_vkCmdUpdateBuffer                  vkCmdUpdateBuffer                  = 0;\n        PFN_vkCmdFillBuffer                    vkCmdFillBuffer                    = 0;\n        PFN_vkCmdClearColorImage               vkCmdClearColorImage               = 0;\n        PFN_vkCmdClearDepthStencilImage        vkCmdClearDepthStencilImage        = 0;\n        PFN_vkCmdClearAttachments              vkCmdClearAttachments              = 0;\n        PFN_vkCmdResolveImage                  vkCmdResolveImage                  = 0;\n        PFN_vkCmdSetEvent                      vkCmdSetEvent                      = 0;\n        PFN_vkCmdResetEvent                    vkCmdResetEvent                    = 0;\n        PFN_vkCmdWaitEvents                    vkCmdWaitEvents                    = 0;\n        PFN_vkCmdPipelineBarrier               vkCmdPipelineBarrier               = 0;\n        PFN_vkCmdBeginQuery                    vkCmdBeginQuery                    = 0;\n        PFN_vkCmdEndQuery                      vkCmdEndQuery                      = 0;\n        PFN_vkCmdResetQueryPool                vkCmdResetQueryPool                = 0;\n        PFN_vkCmdWriteTimestamp                vkCmdWriteTimestamp                = 0;\n        PFN_vkCmdCopyQueryPoolResults          vkCmdCopyQueryPoolResults          = 0;\n        PFN_vkCmdPushConstants                 vkCmdPushConstants                 = 0;\n        PFN_vkCmdBeginRenderPass               vkCmdBeginRenderPass               = 0;\n        PFN_vkCmdNextSubpass                   vkCmdNextSubpass                   = 0;\n        PFN_vkCmdEndRenderPass                 vkCmdEndRenderPass                 = 0;\n        PFN_vkCmdExecuteCommands               vkCmdExecuteCommands               = 0;\n\n        //=== VK_VERSION_1_1 ===\n        PFN_vkBindBufferMemory2                 vkBindBufferMemory2                 = 0;\n        PFN_vkBindImageMemory2                  vkBindImageMemory2                  = 0;\n        PFN_vkGetDeviceGroupPeerMemoryFeatures  vkGetDeviceGroupPeerMemoryFeatures  = 0;\n        PFN_vkCmdSetDeviceMask                  vkCmdSetDeviceMask                  = 0;\n        PFN_vkCmdDispatchBase                   vkCmdDispatchBase                   = 0;\n        PFN_vkGetImageMemoryRequirements2       vkGetImageMemoryRequirements2       = 0;\n        PFN_vkGetBufferMemoryRequirements2      vkGetBufferMemoryRequirements2      = 0;\n        PFN_vkGetImageSparseMemoryRequirements2 vkGetImageSparseMemoryRequirements2 = 0;\n        PFN_vkTrimCommandPool                   vkTrimCommandPool                   = 0;\n        PFN_vkGetDeviceQueue2                   vkGetDeviceQueue2                   = 0;\n        PFN_vkCreateSamplerYcbcrConversion      vkCreateSamplerYcbcrConversion      = 0;\n        PFN_vkDestroySamplerYcbcrConversion     vkDestroySamplerYcbcrConversion     = 0;\n        PFN_vkCreateDescriptorUpdateTemplate    vkCreateDescriptorUpdateTemplate    = 0;\n        PFN_vkDestroyDescriptorUpdateTemplate   vkDestroyDescriptorUpdateTemplate   = 0;\n        PFN_vkUpdateDescriptorSetWithTemplate   vkUpdateDescriptorSetWithTemplate   = 0;\n        PFN_vkGetDescriptorSetLayoutSupport     vkGetDescriptorSetLayoutSupport     = 0;\n\n        //=== VK_VERSION_1_2 ===\n        PFN_vkCmdDrawIndirectCount                vkCmdDrawIndirectCount                = 0;\n        PFN_vkCmdDrawIndexedIndirectCount         vkCmdDrawIndexedIndirectCount         = 0;\n        PFN_vkCreateRenderPass2                   vkCreateRenderPass2                   = 0;\n        PFN_vkCmdBeginRenderPass2                 vkCmdBeginRenderPass2                 = 0;\n        PFN_vkCmdNextSubpass2                     vkCmdNextSubpass2                     = 0;\n        PFN_vkCmdEndRenderPass2                   vkCmdEndRenderPass2                   = 0;\n        PFN_vkResetQueryPool                      vkResetQueryPool                      = 0;\n        PFN_vkGetSemaphoreCounterValue            vkGetSemaphoreCounterValue            = 0;\n        PFN_vkWaitSemaphores                      vkWaitSemaphores                      = 0;\n        PFN_vkSignalSemaphore                     vkSignalSemaphore                     = 0;\n        PFN_vkGetBufferDeviceAddress              vkGetBufferDeviceAddress              = 0;\n        PFN_vkGetBufferOpaqueCaptureAddress       vkGetBufferOpaqueCaptureAddress       = 0;\n        PFN_vkGetDeviceMemoryOpaqueCaptureAddress vkGetDeviceMemoryOpaqueCaptureAddress = 0;\n\n        //=== VK_VERSION_1_3 ===\n        PFN_vkCreatePrivateDataSlot                  vkCreatePrivateDataSlot                  = 0;\n        PFN_vkDestroyPrivateDataSlot                 vkDestroyPrivateDataSlot                 = 0;\n        PFN_vkSetPrivateData                         vkSetPrivateData                         = 0;\n        PFN_vkGetPrivateData                         vkGetPrivateData                         = 0;\n        PFN_vkCmdSetEvent2                           vkCmdSetEvent2                           = 0;\n        PFN_vkCmdResetEvent2                         vkCmdResetEvent2                         = 0;\n        PFN_vkCmdWaitEvents2                         vkCmdWaitEvents2                         = 0;\n        PFN_vkCmdPipelineBarrier2                    vkCmdPipelineBarrier2                    = 0;\n        PFN_vkCmdWriteTimestamp2                     vkCmdWriteTimestamp2                     = 0;\n        PFN_vkQueueSubmit2                           vkQueueSubmit2                           = 0;\n        PFN_vkCmdCopyBuffer2                         vkCmdCopyBuffer2                         = 0;\n        PFN_vkCmdCopyImage2                          vkCmdCopyImage2                          = 0;\n        PFN_vkCmdCopyBufferToImage2                  vkCmdCopyBufferToImage2                  = 0;\n        PFN_vkCmdCopyImageToBuffer2                  vkCmdCopyImageToBuffer2                  = 0;\n        PFN_vkCmdBlitImage2                          vkCmdBlitImage2                          = 0;\n        PFN_vkCmdResolveImage2                       vkCmdResolveImage2                       = 0;\n        PFN_vkCmdBeginRendering                      vkCmdBeginRendering                      = 0;\n        PFN_vkCmdEndRendering                        vkCmdEndRendering                        = 0;\n        PFN_vkCmdSetCullMode                         vkCmdSetCullMode                         = 0;\n        PFN_vkCmdSetFrontFace                        vkCmdSetFrontFace                        = 0;\n        PFN_vkCmdSetPrimitiveTopology                vkCmdSetPrimitiveTopology                = 0;\n        PFN_vkCmdSetViewportWithCount                vkCmdSetViewportWithCount                = 0;\n        PFN_vkCmdSetScissorWithCount                 vkCmdSetScissorWithCount                 = 0;\n        PFN_vkCmdBindVertexBuffers2                  vkCmdBindVertexBuffers2                  = 0;\n        PFN_vkCmdSetDepthTestEnable                  vkCmdSetDepthTestEnable                  = 0;\n        PFN_vkCmdSetDepthWriteEnable                 vkCmdSetDepthWriteEnable                 = 0;\n        PFN_vkCmdSetDepthCompareOp                   vkCmdSetDepthCompareOp                   = 0;\n        PFN_vkCmdSetDepthBoundsTestEnable            vkCmdSetDepthBoundsTestEnable            = 0;\n        PFN_vkCmdSetStencilTestEnable                vkCmdSetStencilTestEnable                = 0;\n        PFN_vkCmdSetStencilOp                        vkCmdSetStencilOp                        = 0;\n        PFN_vkCmdSetRasterizerDiscardEnable          vkCmdSetRasterizerDiscardEnable          = 0;\n        PFN_vkCmdSetDepthBiasEnable                  vkCmdSetDepthBiasEnable                  = 0;\n        PFN_vkCmdSetPrimitiveRestartEnable           vkCmdSetPrimitiveRestartEnable           = 0;\n        PFN_vkGetDeviceBufferMemoryRequirements      vkGetDeviceBufferMemoryRequirements      = 0;\n        PFN_vkGetDeviceImageMemoryRequirements       vkGetDeviceImageMemoryRequirements       = 0;\n        PFN_vkGetDeviceImageSparseMemoryRequirements vkGetDeviceImageSparseMemoryRequirements = 0;\n\n        //=== VK_VERSION_1_4 ===\n        PFN_vkCmdSetLineStipple                     vkCmdSetLineStipple                     = 0;\n        PFN_vkMapMemory2                            vkMapMemory2                            = 0;\n        PFN_vkUnmapMemory2                          vkUnmapMemory2                          = 0;\n        PFN_vkCmdBindIndexBuffer2                   vkCmdBindIndexBuffer2                   = 0;\n        PFN_vkGetRenderingAreaGranularity           vkGetRenderingAreaGranularity           = 0;\n        PFN_vkGetDeviceImageSubresourceLayout       vkGetDeviceImageSubresourceLayout       = 0;\n        PFN_vkGetImageSubresourceLayout2            vkGetImageSubresourceLayout2            = 0;\n        PFN_vkCmdPushDescriptorSet                  vkCmdPushDescriptorSet                  = 0;\n        PFN_vkCmdPushDescriptorSetWithTemplate      vkCmdPushDescriptorSetWithTemplate      = 0;\n        PFN_vkCmdSetRenderingAttachmentLocations    vkCmdSetRenderingAttachmentLocations    = 0;\n        PFN_vkCmdSetRenderingInputAttachmentIndices vkCmdSetRenderingInputAttachmentIndices = 0;\n        PFN_vkCmdBindDescriptorSets2                vkCmdBindDescriptorSets2                = 0;\n        PFN_vkCmdPushConstants2                     vkCmdPushConstants2                     = 0;\n        PFN_vkCmdPushDescriptorSet2                 vkCmdPushDescriptorSet2                 = 0;\n        PFN_vkCmdPushDescriptorSetWithTemplate2     vkCmdPushDescriptorSetWithTemplate2     = 0;\n        PFN_vkCopyMemoryToImage                     vkCopyMemoryToImage                     = 0;\n        PFN_vkCopyImageToMemory                     vkCopyImageToMemory                     = 0;\n        PFN_vkCopyImageToImage                      vkCopyImageToImage                      = 0;\n        PFN_vkTransitionImageLayout                 vkTransitionImageLayout                 = 0;\n\n        //=== VK_KHR_swapchain ===\n        PFN_vkCreateSwapchainKHR                   vkCreateSwapchainKHR                   = 0;\n        PFN_vkDestroySwapchainKHR                  vkDestroySwapchainKHR                  = 0;\n        PFN_vkGetSwapchainImagesKHR                vkGetSwapchainImagesKHR                = 0;\n        PFN_vkAcquireNextImageKHR                  vkAcquireNextImageKHR                  = 0;\n        PFN_vkQueuePresentKHR                      vkQueuePresentKHR                      = 0;\n        PFN_vkGetDeviceGroupPresentCapabilitiesKHR vkGetDeviceGroupPresentCapabilitiesKHR = 0;\n        PFN_vkGetDeviceGroupSurfacePresentModesKHR vkGetDeviceGroupSurfacePresentModesKHR = 0;\n        PFN_vkAcquireNextImage2KHR                 vkAcquireNextImage2KHR                 = 0;\n\n        //=== VK_KHR_display_swapchain ===\n        PFN_vkCreateSharedSwapchainsKHR vkCreateSharedSwapchainsKHR = 0;\n\n        //=== VK_EXT_debug_marker ===\n        PFN_vkDebugMarkerSetObjectTagEXT  vkDebugMarkerSetObjectTagEXT  = 0;\n        PFN_vkDebugMarkerSetObjectNameEXT vkDebugMarkerSetObjectNameEXT = 0;\n        PFN_vkCmdDebugMarkerBeginEXT      vkCmdDebugMarkerBeginEXT      = 0;\n        PFN_vkCmdDebugMarkerEndEXT        vkCmdDebugMarkerEndEXT        = 0;\n        PFN_vkCmdDebugMarkerInsertEXT     vkCmdDebugMarkerInsertEXT     = 0;\n\n        //=== VK_KHR_video_queue ===\n        PFN_vkCreateVideoSessionKHR                vkCreateVideoSessionKHR                = 0;\n        PFN_vkDestroyVideoSessionKHR               vkDestroyVideoSessionKHR               = 0;\n        PFN_vkGetVideoSessionMemoryRequirementsKHR vkGetVideoSessionMemoryRequirementsKHR = 0;\n        PFN_vkBindVideoSessionMemoryKHR            vkBindVideoSessionMemoryKHR            = 0;\n        PFN_vkCreateVideoSessionParametersKHR      vkCreateVideoSessionParametersKHR      = 0;\n        PFN_vkUpdateVideoSessionParametersKHR      vkUpdateVideoSessionParametersKHR      = 0;\n        PFN_vkDestroyVideoSessionParametersKHR     vkDestroyVideoSessionParametersKHR     = 0;\n        PFN_vkCmdBeginVideoCodingKHR               vkCmdBeginVideoCodingKHR               = 0;\n        PFN_vkCmdEndVideoCodingKHR                 vkCmdEndVideoCodingKHR                 = 0;\n        PFN_vkCmdControlVideoCodingKHR             vkCmdControlVideoCodingKHR             = 0;\n\n        //=== VK_KHR_video_decode_queue ===\n        PFN_vkCmdDecodeVideoKHR vkCmdDecodeVideoKHR = 0;\n\n        //=== VK_EXT_transform_feedback ===\n        PFN_vkCmdBindTransformFeedbackBuffersEXT vkCmdBindTransformFeedbackBuffersEXT = 0;\n        PFN_vkCmdBeginTransformFeedbackEXT       vkCmdBeginTransformFeedbackEXT       = 0;\n        PFN_vkCmdEndTransformFeedbackEXT         vkCmdEndTransformFeedbackEXT         = 0;\n        PFN_vkCmdBeginQueryIndexedEXT            vkCmdBeginQueryIndexedEXT            = 0;\n        PFN_vkCmdEndQueryIndexedEXT              vkCmdEndQueryIndexedEXT              = 0;\n        PFN_vkCmdDrawIndirectByteCountEXT        vkCmdDrawIndirectByteCountEXT        = 0;\n\n        //=== VK_NVX_binary_import ===\n        PFN_vkCreateCuModuleNVX    vkCreateCuModuleNVX    = 0;\n        PFN_vkCreateCuFunctionNVX  vkCreateCuFunctionNVX  = 0;\n        PFN_vkDestroyCuModuleNVX   vkDestroyCuModuleNVX   = 0;\n        PFN_vkDestroyCuFunctionNVX vkDestroyCuFunctionNVX = 0;\n        PFN_vkCmdCuLaunchKernelNVX vkCmdCuLaunchKernelNVX = 0;\n\n        //=== VK_NVX_image_view_handle ===\n        PFN_vkGetImageViewHandleNVX   vkGetImageViewHandleNVX   = 0;\n        PFN_vkGetImageViewHandle64NVX vkGetImageViewHandle64NVX = 0;\n        PFN_vkGetImageViewAddressNVX  vkGetImageViewAddressNVX  = 0;\n\n        //=== VK_AMD_draw_indirect_count ===\n        PFN_vkCmdDrawIndirectCountAMD        vkCmdDrawIndirectCountAMD        = 0;\n        PFN_vkCmdDrawIndexedIndirectCountAMD vkCmdDrawIndexedIndirectCountAMD = 0;\n\n        //=== VK_AMD_shader_info ===\n        PFN_vkGetShaderInfoAMD vkGetShaderInfoAMD = 0;\n\n        //=== VK_KHR_dynamic_rendering ===\n        PFN_vkCmdBeginRenderingKHR vkCmdBeginRenderingKHR = 0;\n        PFN_vkCmdEndRenderingKHR   vkCmdEndRenderingKHR   = 0;\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n        //=== VK_NV_external_memory_win32 ===\n        PFN_vkGetMemoryWin32HandleNV vkGetMemoryWin32HandleNV = 0;\n#  else\n        PFN_dummy vkGetMemoryWin32HandleNV_placeholder                          = 0;\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n        //=== VK_KHR_device_group ===\n        PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR vkGetDeviceGroupPeerMemoryFeaturesKHR = 0;\n        PFN_vkCmdSetDeviceMaskKHR                 vkCmdSetDeviceMaskKHR                 = 0;\n        PFN_vkCmdDispatchBaseKHR                  vkCmdDispatchBaseKHR                  = 0;\n\n        //=== VK_KHR_maintenance1 ===\n        PFN_vkTrimCommandPoolKHR vkTrimCommandPoolKHR = 0;\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n        //=== VK_KHR_external_memory_win32 ===\n        PFN_vkGetMemoryWin32HandleKHR           vkGetMemoryWin32HandleKHR           = 0;\n        PFN_vkGetMemoryWin32HandlePropertiesKHR vkGetMemoryWin32HandlePropertiesKHR = 0;\n#  else\n        PFN_dummy vkGetMemoryWin32HandleKHR_placeholder                         = 0;\n        PFN_dummy vkGetMemoryWin32HandlePropertiesKHR_placeholder               = 0;\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n        //=== VK_KHR_external_memory_fd ===\n        PFN_vkGetMemoryFdKHR           vkGetMemoryFdKHR           = 0;\n        PFN_vkGetMemoryFdPropertiesKHR vkGetMemoryFdPropertiesKHR = 0;\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n        //=== VK_KHR_external_semaphore_win32 ===\n        PFN_vkImportSemaphoreWin32HandleKHR vkImportSemaphoreWin32HandleKHR = 0;\n        PFN_vkGetSemaphoreWin32HandleKHR    vkGetSemaphoreWin32HandleKHR    = 0;\n#  else\n        PFN_dummy vkImportSemaphoreWin32HandleKHR_placeholder                   = 0;\n        PFN_dummy vkGetSemaphoreWin32HandleKHR_placeholder                      = 0;\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n        //=== VK_KHR_external_semaphore_fd ===\n        PFN_vkImportSemaphoreFdKHR vkImportSemaphoreFdKHR = 0;\n        PFN_vkGetSemaphoreFdKHR    vkGetSemaphoreFdKHR    = 0;\n\n        //=== VK_KHR_push_descriptor ===\n        PFN_vkCmdPushDescriptorSetKHR             vkCmdPushDescriptorSetKHR             = 0;\n        PFN_vkCmdPushDescriptorSetWithTemplateKHR vkCmdPushDescriptorSetWithTemplateKHR = 0;\n\n        //=== VK_EXT_conditional_rendering ===\n        PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT = 0;\n        PFN_vkCmdEndConditionalRenderingEXT   vkCmdEndConditionalRenderingEXT   = 0;\n\n        //=== VK_KHR_descriptor_update_template ===\n        PFN_vkCreateDescriptorUpdateTemplateKHR  vkCreateDescriptorUpdateTemplateKHR  = 0;\n        PFN_vkDestroyDescriptorUpdateTemplateKHR vkDestroyDescriptorUpdateTemplateKHR = 0;\n        PFN_vkUpdateDescriptorSetWithTemplateKHR vkUpdateDescriptorSetWithTemplateKHR = 0;\n\n        //=== VK_NV_clip_space_w_scaling ===\n        PFN_vkCmdSetViewportWScalingNV vkCmdSetViewportWScalingNV = 0;\n\n        //=== VK_EXT_display_control ===\n        PFN_vkDisplayPowerControlEXT  vkDisplayPowerControlEXT  = 0;\n        PFN_vkRegisterDeviceEventEXT  vkRegisterDeviceEventEXT  = 0;\n        PFN_vkRegisterDisplayEventEXT vkRegisterDisplayEventEXT = 0;\n        PFN_vkGetSwapchainCounterEXT  vkGetSwapchainCounterEXT  = 0;\n\n        //=== VK_GOOGLE_display_timing ===\n        PFN_vkGetRefreshCycleDurationGOOGLE   vkGetRefreshCycleDurationGOOGLE   = 0;\n        PFN_vkGetPastPresentationTimingGOOGLE vkGetPastPresentationTimingGOOGLE = 0;\n\n        //=== VK_EXT_discard_rectangles ===\n        PFN_vkCmdSetDiscardRectangleEXT       vkCmdSetDiscardRectangleEXT       = 0;\n        PFN_vkCmdSetDiscardRectangleEnableEXT vkCmdSetDiscardRectangleEnableEXT = 0;\n        PFN_vkCmdSetDiscardRectangleModeEXT   vkCmdSetDiscardRectangleModeEXT   = 0;\n\n        //=== VK_EXT_hdr_metadata ===\n        PFN_vkSetHdrMetadataEXT vkSetHdrMetadataEXT = 0;\n\n        //=== VK_KHR_create_renderpass2 ===\n        PFN_vkCreateRenderPass2KHR   vkCreateRenderPass2KHR   = 0;\n        PFN_vkCmdBeginRenderPass2KHR vkCmdBeginRenderPass2KHR = 0;\n        PFN_vkCmdNextSubpass2KHR     vkCmdNextSubpass2KHR     = 0;\n        PFN_vkCmdEndRenderPass2KHR   vkCmdEndRenderPass2KHR   = 0;\n\n        //=== VK_KHR_shared_presentable_image ===\n        PFN_vkGetSwapchainStatusKHR vkGetSwapchainStatusKHR = 0;\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n        //=== VK_KHR_external_fence_win32 ===\n        PFN_vkImportFenceWin32HandleKHR vkImportFenceWin32HandleKHR = 0;\n        PFN_vkGetFenceWin32HandleKHR    vkGetFenceWin32HandleKHR    = 0;\n#  else\n        PFN_dummy vkImportFenceWin32HandleKHR_placeholder                       = 0;\n        PFN_dummy vkGetFenceWin32HandleKHR_placeholder                          = 0;\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n        //=== VK_KHR_external_fence_fd ===\n        PFN_vkImportFenceFdKHR vkImportFenceFdKHR = 0;\n        PFN_vkGetFenceFdKHR    vkGetFenceFdKHR    = 0;\n\n        //=== VK_KHR_performance_query ===\n        PFN_vkAcquireProfilingLockKHR vkAcquireProfilingLockKHR = 0;\n        PFN_vkReleaseProfilingLockKHR vkReleaseProfilingLockKHR = 0;\n\n        //=== VK_EXT_debug_utils ===\n        PFN_vkSetDebugUtilsObjectNameEXT    vkSetDebugUtilsObjectNameEXT    = 0;\n        PFN_vkSetDebugUtilsObjectTagEXT     vkSetDebugUtilsObjectTagEXT     = 0;\n        PFN_vkQueueBeginDebugUtilsLabelEXT  vkQueueBeginDebugUtilsLabelEXT  = 0;\n        PFN_vkQueueEndDebugUtilsLabelEXT    vkQueueEndDebugUtilsLabelEXT    = 0;\n        PFN_vkQueueInsertDebugUtilsLabelEXT vkQueueInsertDebugUtilsLabelEXT = 0;\n        PFN_vkCmdBeginDebugUtilsLabelEXT    vkCmdBeginDebugUtilsLabelEXT    = 0;\n        PFN_vkCmdEndDebugUtilsLabelEXT      vkCmdEndDebugUtilsLabelEXT      = 0;\n        PFN_vkCmdInsertDebugUtilsLabelEXT   vkCmdInsertDebugUtilsLabelEXT   = 0;\n\n#  if defined( VK_USE_PLATFORM_ANDROID_KHR )\n        //=== VK_ANDROID_external_memory_android_hardware_buffer ===\n        PFN_vkGetAndroidHardwareBufferPropertiesANDROID vkGetAndroidHardwareBufferPropertiesANDROID = 0;\n        PFN_vkGetMemoryAndroidHardwareBufferANDROID     vkGetMemoryAndroidHardwareBufferANDROID     = 0;\n#  else\n        PFN_dummy vkGetAndroidHardwareBufferPropertiesANDROID_placeholder       = 0;\n        PFN_dummy vkGetMemoryAndroidHardwareBufferANDROID_placeholder           = 0;\n#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n        //=== VK_AMDX_shader_enqueue ===\n        PFN_vkCreateExecutionGraphPipelinesAMDX        vkCreateExecutionGraphPipelinesAMDX        = 0;\n        PFN_vkGetExecutionGraphPipelineScratchSizeAMDX vkGetExecutionGraphPipelineScratchSizeAMDX = 0;\n        PFN_vkGetExecutionGraphPipelineNodeIndexAMDX   vkGetExecutionGraphPipelineNodeIndexAMDX   = 0;\n        PFN_vkCmdInitializeGraphScratchMemoryAMDX      vkCmdInitializeGraphScratchMemoryAMDX      = 0;\n        PFN_vkCmdDispatchGraphAMDX                     vkCmdDispatchGraphAMDX                     = 0;\n        PFN_vkCmdDispatchGraphIndirectAMDX             vkCmdDispatchGraphIndirectAMDX             = 0;\n        PFN_vkCmdDispatchGraphIndirectCountAMDX        vkCmdDispatchGraphIndirectCountAMDX        = 0;\n#  else\n        PFN_dummy vkCreateExecutionGraphPipelinesAMDX_placeholder               = 0;\n        PFN_dummy vkGetExecutionGraphPipelineScratchSizeAMDX_placeholder        = 0;\n        PFN_dummy vkGetExecutionGraphPipelineNodeIndexAMDX_placeholder          = 0;\n        PFN_dummy vkCmdInitializeGraphScratchMemoryAMDX_placeholder             = 0;\n        PFN_dummy vkCmdDispatchGraphAMDX_placeholder                            = 0;\n        PFN_dummy vkCmdDispatchGraphIndirectAMDX_placeholder                    = 0;\n        PFN_dummy vkCmdDispatchGraphIndirectCountAMDX_placeholder               = 0;\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n        //=== VK_EXT_sample_locations ===\n        PFN_vkCmdSetSampleLocationsEXT vkCmdSetSampleLocationsEXT = 0;\n\n        //=== VK_KHR_get_memory_requirements2 ===\n        PFN_vkGetImageMemoryRequirements2KHR       vkGetImageMemoryRequirements2KHR       = 0;\n        PFN_vkGetBufferMemoryRequirements2KHR      vkGetBufferMemoryRequirements2KHR      = 0;\n        PFN_vkGetImageSparseMemoryRequirements2KHR vkGetImageSparseMemoryRequirements2KHR = 0;\n\n        //=== VK_KHR_acceleration_structure ===\n        PFN_vkCreateAccelerationStructureKHR                 vkCreateAccelerationStructureKHR                 = 0;\n        PFN_vkDestroyAccelerationStructureKHR                vkDestroyAccelerationStructureKHR                = 0;\n        PFN_vkCmdBuildAccelerationStructuresKHR              vkCmdBuildAccelerationStructuresKHR              = 0;\n        PFN_vkCmdBuildAccelerationStructuresIndirectKHR      vkCmdBuildAccelerationStructuresIndirectKHR      = 0;\n        PFN_vkBuildAccelerationStructuresKHR                 vkBuildAccelerationStructuresKHR                 = 0;\n        PFN_vkCopyAccelerationStructureKHR                   vkCopyAccelerationStructureKHR                   = 0;\n        PFN_vkCopyAccelerationStructureToMemoryKHR           vkCopyAccelerationStructureToMemoryKHR           = 0;\n        PFN_vkCopyMemoryToAccelerationStructureKHR           vkCopyMemoryToAccelerationStructureKHR           = 0;\n        PFN_vkWriteAccelerationStructuresPropertiesKHR       vkWriteAccelerationStructuresPropertiesKHR       = 0;\n        PFN_vkCmdCopyAccelerationStructureKHR                vkCmdCopyAccelerationStructureKHR                = 0;\n        PFN_vkCmdCopyAccelerationStructureToMemoryKHR        vkCmdCopyAccelerationStructureToMemoryKHR        = 0;\n        PFN_vkCmdCopyMemoryToAccelerationStructureKHR        vkCmdCopyMemoryToAccelerationStructureKHR        = 0;\n        PFN_vkGetAccelerationStructureDeviceAddressKHR       vkGetAccelerationStructureDeviceAddressKHR       = 0;\n        PFN_vkCmdWriteAccelerationStructuresPropertiesKHR    vkCmdWriteAccelerationStructuresPropertiesKHR    = 0;\n        PFN_vkGetDeviceAccelerationStructureCompatibilityKHR vkGetDeviceAccelerationStructureCompatibilityKHR = 0;\n        PFN_vkGetAccelerationStructureBuildSizesKHR          vkGetAccelerationStructureBuildSizesKHR          = 0;\n\n        //=== VK_KHR_ray_tracing_pipeline ===\n        PFN_vkCmdTraceRaysKHR                                 vkCmdTraceRaysKHR                                 = 0;\n        PFN_vkCreateRayTracingPipelinesKHR                    vkCreateRayTracingPipelinesKHR                    = 0;\n        PFN_vkGetRayTracingShaderGroupHandlesKHR              vkGetRayTracingShaderGroupHandlesKHR              = 0;\n        PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR vkGetRayTracingCaptureReplayShaderGroupHandlesKHR = 0;\n        PFN_vkCmdTraceRaysIndirectKHR                         vkCmdTraceRaysIndirectKHR                         = 0;\n        PFN_vkGetRayTracingShaderGroupStackSizeKHR            vkGetRayTracingShaderGroupStackSizeKHR            = 0;\n        PFN_vkCmdSetRayTracingPipelineStackSizeKHR            vkCmdSetRayTracingPipelineStackSizeKHR            = 0;\n\n        //=== VK_KHR_sampler_ycbcr_conversion ===\n        PFN_vkCreateSamplerYcbcrConversionKHR  vkCreateSamplerYcbcrConversionKHR  = 0;\n        PFN_vkDestroySamplerYcbcrConversionKHR vkDestroySamplerYcbcrConversionKHR = 0;\n\n        //=== VK_KHR_bind_memory2 ===\n        PFN_vkBindBufferMemory2KHR vkBindBufferMemory2KHR = 0;\n        PFN_vkBindImageMemory2KHR  vkBindImageMemory2KHR  = 0;\n\n        //=== VK_EXT_image_drm_format_modifier ===\n        PFN_vkGetImageDrmFormatModifierPropertiesEXT vkGetImageDrmFormatModifierPropertiesEXT = 0;\n\n        //=== VK_EXT_validation_cache ===\n        PFN_vkCreateValidationCacheEXT  vkCreateValidationCacheEXT  = 0;\n        PFN_vkDestroyValidationCacheEXT vkDestroyValidationCacheEXT = 0;\n        PFN_vkMergeValidationCachesEXT  vkMergeValidationCachesEXT  = 0;\n        PFN_vkGetValidationCacheDataEXT vkGetValidationCacheDataEXT = 0;\n\n        //=== VK_NV_shading_rate_image ===\n        PFN_vkCmdBindShadingRateImageNV          vkCmdBindShadingRateImageNV          = 0;\n        PFN_vkCmdSetViewportShadingRatePaletteNV vkCmdSetViewportShadingRatePaletteNV = 0;\n        PFN_vkCmdSetCoarseSampleOrderNV          vkCmdSetCoarseSampleOrderNV          = 0;\n\n        //=== VK_NV_ray_tracing ===\n        PFN_vkCreateAccelerationStructureNV                vkCreateAccelerationStructureNV                = 0;\n        PFN_vkDestroyAccelerationStructureNV               vkDestroyAccelerationStructureNV               = 0;\n        PFN_vkGetAccelerationStructureMemoryRequirementsNV vkGetAccelerationStructureMemoryRequirementsNV = 0;\n        PFN_vkBindAccelerationStructureMemoryNV            vkBindAccelerationStructureMemoryNV            = 0;\n        PFN_vkCmdBuildAccelerationStructureNV              vkCmdBuildAccelerationStructureNV              = 0;\n        PFN_vkCmdCopyAccelerationStructureNV               vkCmdCopyAccelerationStructureNV               = 0;\n        PFN_vkCmdTraceRaysNV                               vkCmdTraceRaysNV                               = 0;\n        PFN_vkCreateRayTracingPipelinesNV                  vkCreateRayTracingPipelinesNV                  = 0;\n        PFN_vkGetRayTracingShaderGroupHandlesNV            vkGetRayTracingShaderGroupHandlesNV            = 0;\n        PFN_vkGetAccelerationStructureHandleNV             vkGetAccelerationStructureHandleNV             = 0;\n        PFN_vkCmdWriteAccelerationStructuresPropertiesNV   vkCmdWriteAccelerationStructuresPropertiesNV   = 0;\n        PFN_vkCompileDeferredNV                            vkCompileDeferredNV                            = 0;\n\n        //=== VK_KHR_maintenance3 ===\n        PFN_vkGetDescriptorSetLayoutSupportKHR vkGetDescriptorSetLayoutSupportKHR = 0;\n\n        //=== VK_KHR_draw_indirect_count ===\n        PFN_vkCmdDrawIndirectCountKHR        vkCmdDrawIndirectCountKHR        = 0;\n        PFN_vkCmdDrawIndexedIndirectCountKHR vkCmdDrawIndexedIndirectCountKHR = 0;\n\n        //=== VK_EXT_external_memory_host ===\n        PFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT = 0;\n\n        //=== VK_AMD_buffer_marker ===\n        PFN_vkCmdWriteBufferMarkerAMD  vkCmdWriteBufferMarkerAMD  = 0;\n        PFN_vkCmdWriteBufferMarker2AMD vkCmdWriteBufferMarker2AMD = 0;\n\n        //=== VK_EXT_calibrated_timestamps ===\n        PFN_vkGetCalibratedTimestampsEXT vkGetCalibratedTimestampsEXT = 0;\n\n        //=== VK_NV_mesh_shader ===\n        PFN_vkCmdDrawMeshTasksNV              vkCmdDrawMeshTasksNV              = 0;\n        PFN_vkCmdDrawMeshTasksIndirectNV      vkCmdDrawMeshTasksIndirectNV      = 0;\n        PFN_vkCmdDrawMeshTasksIndirectCountNV vkCmdDrawMeshTasksIndirectCountNV = 0;\n\n        //=== VK_NV_scissor_exclusive ===\n        PFN_vkCmdSetExclusiveScissorEnableNV vkCmdSetExclusiveScissorEnableNV = 0;\n        PFN_vkCmdSetExclusiveScissorNV       vkCmdSetExclusiveScissorNV       = 0;\n\n        //=== VK_NV_device_diagnostic_checkpoints ===\n        PFN_vkCmdSetCheckpointNV        vkCmdSetCheckpointNV        = 0;\n        PFN_vkGetQueueCheckpointDataNV  vkGetQueueCheckpointDataNV  = 0;\n        PFN_vkGetQueueCheckpointData2NV vkGetQueueCheckpointData2NV = 0;\n\n        //=== VK_KHR_timeline_semaphore ===\n        PFN_vkGetSemaphoreCounterValueKHR vkGetSemaphoreCounterValueKHR = 0;\n        PFN_vkWaitSemaphoresKHR           vkWaitSemaphoresKHR           = 0;\n        PFN_vkSignalSemaphoreKHR          vkSignalSemaphoreKHR          = 0;\n\n        //=== VK_INTEL_performance_query ===\n        PFN_vkInitializePerformanceApiINTEL         vkInitializePerformanceApiINTEL         = 0;\n        PFN_vkUninitializePerformanceApiINTEL       vkUninitializePerformanceApiINTEL       = 0;\n        PFN_vkCmdSetPerformanceMarkerINTEL          vkCmdSetPerformanceMarkerINTEL          = 0;\n        PFN_vkCmdSetPerformanceStreamMarkerINTEL    vkCmdSetPerformanceStreamMarkerINTEL    = 0;\n        PFN_vkCmdSetPerformanceOverrideINTEL        vkCmdSetPerformanceOverrideINTEL        = 0;\n        PFN_vkAcquirePerformanceConfigurationINTEL  vkAcquirePerformanceConfigurationINTEL  = 0;\n        PFN_vkReleasePerformanceConfigurationINTEL  vkReleasePerformanceConfigurationINTEL  = 0;\n        PFN_vkQueueSetPerformanceConfigurationINTEL vkQueueSetPerformanceConfigurationINTEL = 0;\n        PFN_vkGetPerformanceParameterINTEL          vkGetPerformanceParameterINTEL          = 0;\n\n        //=== VK_AMD_display_native_hdr ===\n        PFN_vkSetLocalDimmingAMD vkSetLocalDimmingAMD = 0;\n\n        //=== VK_KHR_fragment_shading_rate ===\n        PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR = 0;\n\n        //=== VK_KHR_dynamic_rendering_local_read ===\n        PFN_vkCmdSetRenderingAttachmentLocationsKHR    vkCmdSetRenderingAttachmentLocationsKHR    = 0;\n        PFN_vkCmdSetRenderingInputAttachmentIndicesKHR vkCmdSetRenderingInputAttachmentIndicesKHR = 0;\n\n        //=== VK_EXT_buffer_device_address ===\n        PFN_vkGetBufferDeviceAddressEXT vkGetBufferDeviceAddressEXT = 0;\n\n        //=== VK_KHR_present_wait ===\n        PFN_vkWaitForPresentKHR vkWaitForPresentKHR = 0;\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n        //=== VK_EXT_full_screen_exclusive ===\n        PFN_vkAcquireFullScreenExclusiveModeEXT     vkAcquireFullScreenExclusiveModeEXT     = 0;\n        PFN_vkReleaseFullScreenExclusiveModeEXT     vkReleaseFullScreenExclusiveModeEXT     = 0;\n        PFN_vkGetDeviceGroupSurfacePresentModes2EXT vkGetDeviceGroupSurfacePresentModes2EXT = 0;\n#  else\n        PFN_dummy vkAcquireFullScreenExclusiveModeEXT_placeholder               = 0;\n        PFN_dummy vkReleaseFullScreenExclusiveModeEXT_placeholder               = 0;\n        PFN_dummy vkGetDeviceGroupSurfacePresentModes2EXT_placeholder           = 0;\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n        //=== VK_KHR_buffer_device_address ===\n        PFN_vkGetBufferDeviceAddressKHR              vkGetBufferDeviceAddressKHR              = 0;\n        PFN_vkGetBufferOpaqueCaptureAddressKHR       vkGetBufferOpaqueCaptureAddressKHR       = 0;\n        PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR vkGetDeviceMemoryOpaqueCaptureAddressKHR = 0;\n\n        //=== VK_EXT_line_rasterization ===\n        PFN_vkCmdSetLineStippleEXT vkCmdSetLineStippleEXT = 0;\n\n        //=== VK_EXT_host_query_reset ===\n        PFN_vkResetQueryPoolEXT vkResetQueryPoolEXT = 0;\n\n        //=== VK_EXT_extended_dynamic_state ===\n        PFN_vkCmdSetCullModeEXT              vkCmdSetCullModeEXT              = 0;\n        PFN_vkCmdSetFrontFaceEXT             vkCmdSetFrontFaceEXT             = 0;\n        PFN_vkCmdSetPrimitiveTopologyEXT     vkCmdSetPrimitiveTopologyEXT     = 0;\n        PFN_vkCmdSetViewportWithCountEXT     vkCmdSetViewportWithCountEXT     = 0;\n        PFN_vkCmdSetScissorWithCountEXT      vkCmdSetScissorWithCountEXT      = 0;\n        PFN_vkCmdBindVertexBuffers2EXT       vkCmdBindVertexBuffers2EXT       = 0;\n        PFN_vkCmdSetDepthTestEnableEXT       vkCmdSetDepthTestEnableEXT       = 0;\n        PFN_vkCmdSetDepthWriteEnableEXT      vkCmdSetDepthWriteEnableEXT      = 0;\n        PFN_vkCmdSetDepthCompareOpEXT        vkCmdSetDepthCompareOpEXT        = 0;\n        PFN_vkCmdSetDepthBoundsTestEnableEXT vkCmdSetDepthBoundsTestEnableEXT = 0;\n        PFN_vkCmdSetStencilTestEnableEXT     vkCmdSetStencilTestEnableEXT     = 0;\n        PFN_vkCmdSetStencilOpEXT             vkCmdSetStencilOpEXT             = 0;\n\n        //=== VK_KHR_deferred_host_operations ===\n        PFN_vkCreateDeferredOperationKHR            vkCreateDeferredOperationKHR            = 0;\n        PFN_vkDestroyDeferredOperationKHR           vkDestroyDeferredOperationKHR           = 0;\n        PFN_vkGetDeferredOperationMaxConcurrencyKHR vkGetDeferredOperationMaxConcurrencyKHR = 0;\n        PFN_vkGetDeferredOperationResultKHR         vkGetDeferredOperationResultKHR         = 0;\n        PFN_vkDeferredOperationJoinKHR              vkDeferredOperationJoinKHR              = 0;\n\n        //=== VK_KHR_pipeline_executable_properties ===\n        PFN_vkGetPipelineExecutablePropertiesKHR              vkGetPipelineExecutablePropertiesKHR              = 0;\n        PFN_vkGetPipelineExecutableStatisticsKHR              vkGetPipelineExecutableStatisticsKHR              = 0;\n        PFN_vkGetPipelineExecutableInternalRepresentationsKHR vkGetPipelineExecutableInternalRepresentationsKHR = 0;\n\n        //=== VK_EXT_host_image_copy ===\n        PFN_vkCopyMemoryToImageEXT          vkCopyMemoryToImageEXT          = 0;\n        PFN_vkCopyImageToMemoryEXT          vkCopyImageToMemoryEXT          = 0;\n        PFN_vkCopyImageToImageEXT           vkCopyImageToImageEXT           = 0;\n        PFN_vkTransitionImageLayoutEXT      vkTransitionImageLayoutEXT      = 0;\n        PFN_vkGetImageSubresourceLayout2EXT vkGetImageSubresourceLayout2EXT = 0;\n\n        //=== VK_KHR_map_memory2 ===\n        PFN_vkMapMemory2KHR   vkMapMemory2KHR   = 0;\n        PFN_vkUnmapMemory2KHR vkUnmapMemory2KHR = 0;\n\n        //=== VK_EXT_swapchain_maintenance1 ===\n        PFN_vkReleaseSwapchainImagesEXT vkReleaseSwapchainImagesEXT = 0;\n\n        //=== VK_NV_device_generated_commands ===\n        PFN_vkGetGeneratedCommandsMemoryRequirementsNV vkGetGeneratedCommandsMemoryRequirementsNV = 0;\n        PFN_vkCmdPreprocessGeneratedCommandsNV         vkCmdPreprocessGeneratedCommandsNV         = 0;\n        PFN_vkCmdExecuteGeneratedCommandsNV            vkCmdExecuteGeneratedCommandsNV            = 0;\n        PFN_vkCmdBindPipelineShaderGroupNV             vkCmdBindPipelineShaderGroupNV             = 0;\n        PFN_vkCreateIndirectCommandsLayoutNV           vkCreateIndirectCommandsLayoutNV           = 0;\n        PFN_vkDestroyIndirectCommandsLayoutNV          vkDestroyIndirectCommandsLayoutNV          = 0;\n\n        //=== VK_EXT_depth_bias_control ===\n        PFN_vkCmdSetDepthBias2EXT vkCmdSetDepthBias2EXT = 0;\n\n        //=== VK_EXT_private_data ===\n        PFN_vkCreatePrivateDataSlotEXT  vkCreatePrivateDataSlotEXT  = 0;\n        PFN_vkDestroyPrivateDataSlotEXT vkDestroyPrivateDataSlotEXT = 0;\n        PFN_vkSetPrivateDataEXT         vkSetPrivateDataEXT         = 0;\n        PFN_vkGetPrivateDataEXT         vkGetPrivateDataEXT         = 0;\n\n        //=== VK_KHR_video_encode_queue ===\n        PFN_vkGetEncodedVideoSessionParametersKHR vkGetEncodedVideoSessionParametersKHR = 0;\n        PFN_vkCmdEncodeVideoKHR                   vkCmdEncodeVideoKHR                   = 0;\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n        //=== VK_NV_cuda_kernel_launch ===\n        PFN_vkCreateCudaModuleNV    vkCreateCudaModuleNV    = 0;\n        PFN_vkGetCudaModuleCacheNV  vkGetCudaModuleCacheNV  = 0;\n        PFN_vkCreateCudaFunctionNV  vkCreateCudaFunctionNV  = 0;\n        PFN_vkDestroyCudaModuleNV   vkDestroyCudaModuleNV   = 0;\n        PFN_vkDestroyCudaFunctionNV vkDestroyCudaFunctionNV = 0;\n        PFN_vkCmdCudaLaunchKernelNV vkCmdCudaLaunchKernelNV = 0;\n#  else\n        PFN_dummy vkCreateCudaModuleNV_placeholder                              = 0;\n        PFN_dummy vkGetCudaModuleCacheNV_placeholder                            = 0;\n        PFN_dummy vkCreateCudaFunctionNV_placeholder                            = 0;\n        PFN_dummy vkDestroyCudaModuleNV_placeholder                             = 0;\n        PFN_dummy vkDestroyCudaFunctionNV_placeholder                           = 0;\n        PFN_dummy vkCmdCudaLaunchKernelNV_placeholder                           = 0;\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n        //=== VK_EXT_metal_objects ===\n        PFN_vkExportMetalObjectsEXT vkExportMetalObjectsEXT = 0;\n#  else\n        PFN_dummy vkExportMetalObjectsEXT_placeholder                           = 0;\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n        //=== VK_KHR_synchronization2 ===\n        PFN_vkCmdSetEvent2KHR        vkCmdSetEvent2KHR        = 0;\n        PFN_vkCmdResetEvent2KHR      vkCmdResetEvent2KHR      = 0;\n        PFN_vkCmdWaitEvents2KHR      vkCmdWaitEvents2KHR      = 0;\n        PFN_vkCmdPipelineBarrier2KHR vkCmdPipelineBarrier2KHR = 0;\n        PFN_vkCmdWriteTimestamp2KHR  vkCmdWriteTimestamp2KHR  = 0;\n        PFN_vkQueueSubmit2KHR        vkQueueSubmit2KHR        = 0;\n\n        //=== VK_EXT_descriptor_buffer ===\n        PFN_vkGetDescriptorSetLayoutSizeEXT                          vkGetDescriptorSetLayoutSizeEXT                          = 0;\n        PFN_vkGetDescriptorSetLayoutBindingOffsetEXT                 vkGetDescriptorSetLayoutBindingOffsetEXT                 = 0;\n        PFN_vkGetDescriptorEXT                                       vkGetDescriptorEXT                                       = 0;\n        PFN_vkCmdBindDescriptorBuffersEXT                            vkCmdBindDescriptorBuffersEXT                            = 0;\n        PFN_vkCmdSetDescriptorBufferOffsetsEXT                       vkCmdSetDescriptorBufferOffsetsEXT                       = 0;\n        PFN_vkCmdBindDescriptorBufferEmbeddedSamplersEXT             vkCmdBindDescriptorBufferEmbeddedSamplersEXT             = 0;\n        PFN_vkGetBufferOpaqueCaptureDescriptorDataEXT                vkGetBufferOpaqueCaptureDescriptorDataEXT                = 0;\n        PFN_vkGetImageOpaqueCaptureDescriptorDataEXT                 vkGetImageOpaqueCaptureDescriptorDataEXT                 = 0;\n        PFN_vkGetImageViewOpaqueCaptureDescriptorDataEXT             vkGetImageViewOpaqueCaptureDescriptorDataEXT             = 0;\n        PFN_vkGetSamplerOpaqueCaptureDescriptorDataEXT               vkGetSamplerOpaqueCaptureDescriptorDataEXT               = 0;\n        PFN_vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT = 0;\n\n        //=== VK_NV_fragment_shading_rate_enums ===\n        PFN_vkCmdSetFragmentShadingRateEnumNV vkCmdSetFragmentShadingRateEnumNV = 0;\n\n        //=== VK_EXT_mesh_shader ===\n        PFN_vkCmdDrawMeshTasksEXT              vkCmdDrawMeshTasksEXT              = 0;\n        PFN_vkCmdDrawMeshTasksIndirectEXT      vkCmdDrawMeshTasksIndirectEXT      = 0;\n        PFN_vkCmdDrawMeshTasksIndirectCountEXT vkCmdDrawMeshTasksIndirectCountEXT = 0;\n\n        //=== VK_KHR_copy_commands2 ===\n        PFN_vkCmdCopyBuffer2KHR        vkCmdCopyBuffer2KHR        = 0;\n        PFN_vkCmdCopyImage2KHR         vkCmdCopyImage2KHR         = 0;\n        PFN_vkCmdCopyBufferToImage2KHR vkCmdCopyBufferToImage2KHR = 0;\n        PFN_vkCmdCopyImageToBuffer2KHR vkCmdCopyImageToBuffer2KHR = 0;\n        PFN_vkCmdBlitImage2KHR         vkCmdBlitImage2KHR         = 0;\n        PFN_vkCmdResolveImage2KHR      vkCmdResolveImage2KHR      = 0;\n\n        //=== VK_EXT_device_fault ===\n        PFN_vkGetDeviceFaultInfoEXT vkGetDeviceFaultInfoEXT = 0;\n\n        //=== VK_EXT_vertex_input_dynamic_state ===\n        PFN_vkCmdSetVertexInputEXT vkCmdSetVertexInputEXT = 0;\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n        //=== VK_FUCHSIA_external_memory ===\n        PFN_vkGetMemoryZirconHandleFUCHSIA           vkGetMemoryZirconHandleFUCHSIA           = 0;\n        PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA vkGetMemoryZirconHandlePropertiesFUCHSIA = 0;\n#  else\n        PFN_dummy vkGetMemoryZirconHandleFUCHSIA_placeholder                    = 0;\n        PFN_dummy vkGetMemoryZirconHandlePropertiesFUCHSIA_placeholder          = 0;\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n        //=== VK_FUCHSIA_external_semaphore ===\n        PFN_vkImportSemaphoreZirconHandleFUCHSIA vkImportSemaphoreZirconHandleFUCHSIA = 0;\n        PFN_vkGetSemaphoreZirconHandleFUCHSIA    vkGetSemaphoreZirconHandleFUCHSIA    = 0;\n#  else\n        PFN_dummy vkImportSemaphoreZirconHandleFUCHSIA_placeholder              = 0;\n        PFN_dummy vkGetSemaphoreZirconHandleFUCHSIA_placeholder                 = 0;\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n        //=== VK_FUCHSIA_buffer_collection ===\n        PFN_vkCreateBufferCollectionFUCHSIA               vkCreateBufferCollectionFUCHSIA               = 0;\n        PFN_vkSetBufferCollectionImageConstraintsFUCHSIA  vkSetBufferCollectionImageConstraintsFUCHSIA  = 0;\n        PFN_vkSetBufferCollectionBufferConstraintsFUCHSIA vkSetBufferCollectionBufferConstraintsFUCHSIA = 0;\n        PFN_vkDestroyBufferCollectionFUCHSIA              vkDestroyBufferCollectionFUCHSIA              = 0;\n        PFN_vkGetBufferCollectionPropertiesFUCHSIA        vkGetBufferCollectionPropertiesFUCHSIA        = 0;\n#  else\n        PFN_dummy vkCreateBufferCollectionFUCHSIA_placeholder                   = 0;\n        PFN_dummy vkSetBufferCollectionImageConstraintsFUCHSIA_placeholder      = 0;\n        PFN_dummy vkSetBufferCollectionBufferConstraintsFUCHSIA_placeholder     = 0;\n        PFN_dummy vkDestroyBufferCollectionFUCHSIA_placeholder                  = 0;\n        PFN_dummy vkGetBufferCollectionPropertiesFUCHSIA_placeholder            = 0;\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n        //=== VK_HUAWEI_subpass_shading ===\n        PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = 0;\n        PFN_vkCmdSubpassShadingHUAWEI                       vkCmdSubpassShadingHUAWEI                       = 0;\n\n        //=== VK_HUAWEI_invocation_mask ===\n        PFN_vkCmdBindInvocationMaskHUAWEI vkCmdBindInvocationMaskHUAWEI = 0;\n\n        //=== VK_NV_external_memory_rdma ===\n        PFN_vkGetMemoryRemoteAddressNV vkGetMemoryRemoteAddressNV = 0;\n\n        //=== VK_EXT_pipeline_properties ===\n        PFN_vkGetPipelinePropertiesEXT vkGetPipelinePropertiesEXT = 0;\n\n        //=== VK_EXT_extended_dynamic_state2 ===\n        PFN_vkCmdSetPatchControlPointsEXT      vkCmdSetPatchControlPointsEXT      = 0;\n        PFN_vkCmdSetRasterizerDiscardEnableEXT vkCmdSetRasterizerDiscardEnableEXT = 0;\n        PFN_vkCmdSetDepthBiasEnableEXT         vkCmdSetDepthBiasEnableEXT         = 0;\n        PFN_vkCmdSetLogicOpEXT                 vkCmdSetLogicOpEXT                 = 0;\n        PFN_vkCmdSetPrimitiveRestartEnableEXT  vkCmdSetPrimitiveRestartEnableEXT  = 0;\n\n        //=== VK_EXT_color_write_enable ===\n        PFN_vkCmdSetColorWriteEnableEXT vkCmdSetColorWriteEnableEXT = 0;\n\n        //=== VK_KHR_ray_tracing_maintenance1 ===\n        PFN_vkCmdTraceRaysIndirect2KHR vkCmdTraceRaysIndirect2KHR = 0;\n\n        //=== VK_EXT_multi_draw ===\n        PFN_vkCmdDrawMultiEXT        vkCmdDrawMultiEXT        = 0;\n        PFN_vkCmdDrawMultiIndexedEXT vkCmdDrawMultiIndexedEXT = 0;\n\n        //=== VK_EXT_opacity_micromap ===\n        PFN_vkCreateMicromapEXT                 vkCreateMicromapEXT                 = 0;\n        PFN_vkDestroyMicromapEXT                vkDestroyMicromapEXT                = 0;\n        PFN_vkCmdBuildMicromapsEXT              vkCmdBuildMicromapsEXT              = 0;\n        PFN_vkBuildMicromapsEXT                 vkBuildMicromapsEXT                 = 0;\n        PFN_vkCopyMicromapEXT                   vkCopyMicromapEXT                   = 0;\n        PFN_vkCopyMicromapToMemoryEXT           vkCopyMicromapToMemoryEXT           = 0;\n        PFN_vkCopyMemoryToMicromapEXT           vkCopyMemoryToMicromapEXT           = 0;\n        PFN_vkWriteMicromapsPropertiesEXT       vkWriteMicromapsPropertiesEXT       = 0;\n        PFN_vkCmdCopyMicromapEXT                vkCmdCopyMicromapEXT                = 0;\n        PFN_vkCmdCopyMicromapToMemoryEXT        vkCmdCopyMicromapToMemoryEXT        = 0;\n        PFN_vkCmdCopyMemoryToMicromapEXT        vkCmdCopyMemoryToMicromapEXT        = 0;\n        PFN_vkCmdWriteMicromapsPropertiesEXT    vkCmdWriteMicromapsPropertiesEXT    = 0;\n        PFN_vkGetDeviceMicromapCompatibilityEXT vkGetDeviceMicromapCompatibilityEXT = 0;\n        PFN_vkGetMicromapBuildSizesEXT          vkGetMicromapBuildSizesEXT          = 0;\n\n        //=== VK_HUAWEI_cluster_culling_shader ===\n        PFN_vkCmdDrawClusterHUAWEI         vkCmdDrawClusterHUAWEI         = 0;\n        PFN_vkCmdDrawClusterIndirectHUAWEI vkCmdDrawClusterIndirectHUAWEI = 0;\n\n        //=== VK_EXT_pageable_device_local_memory ===\n        PFN_vkSetDeviceMemoryPriorityEXT vkSetDeviceMemoryPriorityEXT = 0;\n\n        //=== VK_KHR_maintenance4 ===\n        PFN_vkGetDeviceBufferMemoryRequirementsKHR      vkGetDeviceBufferMemoryRequirementsKHR      = 0;\n        PFN_vkGetDeviceImageMemoryRequirementsKHR       vkGetDeviceImageMemoryRequirementsKHR       = 0;\n        PFN_vkGetDeviceImageSparseMemoryRequirementsKHR vkGetDeviceImageSparseMemoryRequirementsKHR = 0;\n\n        //=== VK_VALVE_descriptor_set_host_mapping ===\n        PFN_vkGetDescriptorSetLayoutHostMappingInfoVALVE vkGetDescriptorSetLayoutHostMappingInfoVALVE = 0;\n        PFN_vkGetDescriptorSetHostMappingVALVE           vkGetDescriptorSetHostMappingVALVE           = 0;\n\n        //=== VK_NV_copy_memory_indirect ===\n        PFN_vkCmdCopyMemoryIndirectNV        vkCmdCopyMemoryIndirectNV        = 0;\n        PFN_vkCmdCopyMemoryToImageIndirectNV vkCmdCopyMemoryToImageIndirectNV = 0;\n\n        //=== VK_NV_memory_decompression ===\n        PFN_vkCmdDecompressMemoryNV              vkCmdDecompressMemoryNV              = 0;\n        PFN_vkCmdDecompressMemoryIndirectCountNV vkCmdDecompressMemoryIndirectCountNV = 0;\n\n        //=== VK_NV_device_generated_commands_compute ===\n        PFN_vkGetPipelineIndirectMemoryRequirementsNV vkGetPipelineIndirectMemoryRequirementsNV = 0;\n        PFN_vkCmdUpdatePipelineIndirectBufferNV       vkCmdUpdatePipelineIndirectBufferNV       = 0;\n        PFN_vkGetPipelineIndirectDeviceAddressNV      vkGetPipelineIndirectDeviceAddressNV      = 0;\n\n        //=== VK_EXT_extended_dynamic_state3 ===\n        PFN_vkCmdSetDepthClampEnableEXT                 vkCmdSetDepthClampEnableEXT                 = 0;\n        PFN_vkCmdSetPolygonModeEXT                      vkCmdSetPolygonModeEXT                      = 0;\n        PFN_vkCmdSetRasterizationSamplesEXT             vkCmdSetRasterizationSamplesEXT             = 0;\n        PFN_vkCmdSetSampleMaskEXT                       vkCmdSetSampleMaskEXT                       = 0;\n        PFN_vkCmdSetAlphaToCoverageEnableEXT            vkCmdSetAlphaToCoverageEnableEXT            = 0;\n        PFN_vkCmdSetAlphaToOneEnableEXT                 vkCmdSetAlphaToOneEnableEXT                 = 0;\n        PFN_vkCmdSetLogicOpEnableEXT                    vkCmdSetLogicOpEnableEXT                    = 0;\n        PFN_vkCmdSetColorBlendEnableEXT                 vkCmdSetColorBlendEnableEXT                 = 0;\n        PFN_vkCmdSetColorBlendEquationEXT               vkCmdSetColorBlendEquationEXT               = 0;\n        PFN_vkCmdSetColorWriteMaskEXT                   vkCmdSetColorWriteMaskEXT                   = 0;\n        PFN_vkCmdSetTessellationDomainOriginEXT         vkCmdSetTessellationDomainOriginEXT         = 0;\n        PFN_vkCmdSetRasterizationStreamEXT              vkCmdSetRasterizationStreamEXT              = 0;\n        PFN_vkCmdSetConservativeRasterizationModeEXT    vkCmdSetConservativeRasterizationModeEXT    = 0;\n        PFN_vkCmdSetExtraPrimitiveOverestimationSizeEXT vkCmdSetExtraPrimitiveOverestimationSizeEXT = 0;\n        PFN_vkCmdSetDepthClipEnableEXT                  vkCmdSetDepthClipEnableEXT                  = 0;\n        PFN_vkCmdSetSampleLocationsEnableEXT            vkCmdSetSampleLocationsEnableEXT            = 0;\n        PFN_vkCmdSetColorBlendAdvancedEXT               vkCmdSetColorBlendAdvancedEXT               = 0;\n        PFN_vkCmdSetProvokingVertexModeEXT              vkCmdSetProvokingVertexModeEXT              = 0;\n        PFN_vkCmdSetLineRasterizationModeEXT            vkCmdSetLineRasterizationModeEXT            = 0;\n        PFN_vkCmdSetLineStippleEnableEXT                vkCmdSetLineStippleEnableEXT                = 0;\n        PFN_vkCmdSetDepthClipNegativeOneToOneEXT        vkCmdSetDepthClipNegativeOneToOneEXT        = 0;\n        PFN_vkCmdSetViewportWScalingEnableNV            vkCmdSetViewportWScalingEnableNV            = 0;\n        PFN_vkCmdSetViewportSwizzleNV                   vkCmdSetViewportSwizzleNV                   = 0;\n        PFN_vkCmdSetCoverageToColorEnableNV             vkCmdSetCoverageToColorEnableNV             = 0;\n        PFN_vkCmdSetCoverageToColorLocationNV           vkCmdSetCoverageToColorLocationNV           = 0;\n        PFN_vkCmdSetCoverageModulationModeNV            vkCmdSetCoverageModulationModeNV            = 0;\n        PFN_vkCmdSetCoverageModulationTableEnableNV     vkCmdSetCoverageModulationTableEnableNV     = 0;\n        PFN_vkCmdSetCoverageModulationTableNV           vkCmdSetCoverageModulationTableNV           = 0;\n        PFN_vkCmdSetShadingRateImageEnableNV            vkCmdSetShadingRateImageEnableNV            = 0;\n        PFN_vkCmdSetRepresentativeFragmentTestEnableNV  vkCmdSetRepresentativeFragmentTestEnableNV  = 0;\n        PFN_vkCmdSetCoverageReductionModeNV             vkCmdSetCoverageReductionModeNV             = 0;\n\n        //=== VK_EXT_shader_module_identifier ===\n        PFN_vkGetShaderModuleIdentifierEXT           vkGetShaderModuleIdentifierEXT           = 0;\n        PFN_vkGetShaderModuleCreateInfoIdentifierEXT vkGetShaderModuleCreateInfoIdentifierEXT = 0;\n\n        //=== VK_NV_optical_flow ===\n        PFN_vkCreateOpticalFlowSessionNV    vkCreateOpticalFlowSessionNV    = 0;\n        PFN_vkDestroyOpticalFlowSessionNV   vkDestroyOpticalFlowSessionNV   = 0;\n        PFN_vkBindOpticalFlowSessionImageNV vkBindOpticalFlowSessionImageNV = 0;\n        PFN_vkCmdOpticalFlowExecuteNV       vkCmdOpticalFlowExecuteNV       = 0;\n\n        //=== VK_KHR_maintenance5 ===\n        PFN_vkCmdBindIndexBuffer2KHR             vkCmdBindIndexBuffer2KHR             = 0;\n        PFN_vkGetRenderingAreaGranularityKHR     vkGetRenderingAreaGranularityKHR     = 0;\n        PFN_vkGetDeviceImageSubresourceLayoutKHR vkGetDeviceImageSubresourceLayoutKHR = 0;\n        PFN_vkGetImageSubresourceLayout2KHR      vkGetImageSubresourceLayout2KHR      = 0;\n\n        //=== VK_AMD_anti_lag ===\n        PFN_vkAntiLagUpdateAMD vkAntiLagUpdateAMD = 0;\n\n        //=== VK_EXT_shader_object ===\n        PFN_vkCreateShadersEXT         vkCreateShadersEXT         = 0;\n        PFN_vkDestroyShaderEXT         vkDestroyShaderEXT         = 0;\n        PFN_vkGetShaderBinaryDataEXT   vkGetShaderBinaryDataEXT   = 0;\n        PFN_vkCmdBindShadersEXT        vkCmdBindShadersEXT        = 0;\n        PFN_vkCmdSetDepthClampRangeEXT vkCmdSetDepthClampRangeEXT = 0;\n\n        //=== VK_KHR_pipeline_binary ===\n        PFN_vkCreatePipelineBinariesKHR      vkCreatePipelineBinariesKHR      = 0;\n        PFN_vkDestroyPipelineBinaryKHR       vkDestroyPipelineBinaryKHR       = 0;\n        PFN_vkGetPipelineKeyKHR              vkGetPipelineKeyKHR              = 0;\n        PFN_vkGetPipelineBinaryDataKHR       vkGetPipelineBinaryDataKHR       = 0;\n        PFN_vkReleaseCapturedPipelineDataKHR vkReleaseCapturedPipelineDataKHR = 0;\n\n        //=== VK_QCOM_tile_properties ===\n        PFN_vkGetFramebufferTilePropertiesQCOM      vkGetFramebufferTilePropertiesQCOM      = 0;\n        PFN_vkGetDynamicRenderingTilePropertiesQCOM vkGetDynamicRenderingTilePropertiesQCOM = 0;\n\n        //=== VK_NV_cooperative_vector ===\n        PFN_vkConvertCooperativeVectorMatrixNV    vkConvertCooperativeVectorMatrixNV    = 0;\n        PFN_vkCmdConvertCooperativeVectorMatrixNV vkCmdConvertCooperativeVectorMatrixNV = 0;\n\n        //=== VK_NV_low_latency2 ===\n        PFN_vkSetLatencySleepModeNV  vkSetLatencySleepModeNV  = 0;\n        PFN_vkLatencySleepNV         vkLatencySleepNV         = 0;\n        PFN_vkSetLatencyMarkerNV     vkSetLatencyMarkerNV     = 0;\n        PFN_vkGetLatencyTimingsNV    vkGetLatencyTimingsNV    = 0;\n        PFN_vkQueueNotifyOutOfBandNV vkQueueNotifyOutOfBandNV = 0;\n\n        //=== VK_EXT_attachment_feedback_loop_dynamic_state ===\n        PFN_vkCmdSetAttachmentFeedbackLoopEnableEXT vkCmdSetAttachmentFeedbackLoopEnableEXT = 0;\n\n#  if defined( VK_USE_PLATFORM_SCREEN_QNX )\n        //=== VK_QNX_external_memory_screen_buffer ===\n        PFN_vkGetScreenBufferPropertiesQNX vkGetScreenBufferPropertiesQNX = 0;\n#  else\n        PFN_dummy vkGetScreenBufferPropertiesQNX_placeholder                    = 0;\n#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n        //=== VK_KHR_line_rasterization ===\n        PFN_vkCmdSetLineStippleKHR vkCmdSetLineStippleKHR = 0;\n\n        //=== VK_KHR_calibrated_timestamps ===\n        PFN_vkGetCalibratedTimestampsKHR vkGetCalibratedTimestampsKHR = 0;\n\n        //=== VK_KHR_maintenance6 ===\n        PFN_vkCmdBindDescriptorSets2KHR                   vkCmdBindDescriptorSets2KHR                   = 0;\n        PFN_vkCmdPushConstants2KHR                        vkCmdPushConstants2KHR                        = 0;\n        PFN_vkCmdPushDescriptorSet2KHR                    vkCmdPushDescriptorSet2KHR                    = 0;\n        PFN_vkCmdPushDescriptorSetWithTemplate2KHR        vkCmdPushDescriptorSetWithTemplate2KHR        = 0;\n        PFN_vkCmdSetDescriptorBufferOffsets2EXT           vkCmdSetDescriptorBufferOffsets2EXT           = 0;\n        PFN_vkCmdBindDescriptorBufferEmbeddedSamplers2EXT vkCmdBindDescriptorBufferEmbeddedSamplers2EXT = 0;\n\n        //=== VK_NV_cluster_acceleration_structure ===\n        PFN_vkGetClusterAccelerationStructureBuildSizesNV    vkGetClusterAccelerationStructureBuildSizesNV    = 0;\n        PFN_vkCmdBuildClusterAccelerationStructureIndirectNV vkCmdBuildClusterAccelerationStructureIndirectNV = 0;\n\n        //=== VK_NV_partitioned_acceleration_structure ===\n        PFN_vkGetPartitionedAccelerationStructuresBuildSizesNV vkGetPartitionedAccelerationStructuresBuildSizesNV = 0;\n        PFN_vkCmdBuildPartitionedAccelerationStructuresNV      vkCmdBuildPartitionedAccelerationStructuresNV      = 0;\n\n        //=== VK_EXT_device_generated_commands ===\n        PFN_vkGetGeneratedCommandsMemoryRequirementsEXT vkGetGeneratedCommandsMemoryRequirementsEXT = 0;\n        PFN_vkCmdPreprocessGeneratedCommandsEXT         vkCmdPreprocessGeneratedCommandsEXT         = 0;\n        PFN_vkCmdExecuteGeneratedCommandsEXT            vkCmdExecuteGeneratedCommandsEXT            = 0;\n        PFN_vkCreateIndirectCommandsLayoutEXT           vkCreateIndirectCommandsLayoutEXT           = 0;\n        PFN_vkDestroyIndirectCommandsLayoutEXT          vkDestroyIndirectCommandsLayoutEXT          = 0;\n        PFN_vkCreateIndirectExecutionSetEXT             vkCreateIndirectExecutionSetEXT             = 0;\n        PFN_vkDestroyIndirectExecutionSetEXT            vkDestroyIndirectExecutionSetEXT            = 0;\n        PFN_vkUpdateIndirectExecutionSetPipelineEXT     vkUpdateIndirectExecutionSetPipelineEXT     = 0;\n        PFN_vkUpdateIndirectExecutionSetShaderEXT       vkUpdateIndirectExecutionSetShaderEXT       = 0;\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n        //=== VK_EXT_external_memory_metal ===\n        PFN_vkGetMemoryMetalHandleEXT           vkGetMemoryMetalHandleEXT           = 0;\n        PFN_vkGetMemoryMetalHandlePropertiesEXT vkGetMemoryMetalHandlePropertiesEXT = 0;\n#  else\n        PFN_dummy vkGetMemoryMetalHandleEXT_placeholder                         = 0;\n        PFN_dummy vkGetMemoryMetalHandlePropertiesEXT_placeholder               = 0;\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n      };\n\n    }  // namespace detail\n\n    //========================================\n    //=== RAII HANDLE forward declarations ===\n    //========================================\n\n    //=== VK_VERSION_1_0 ===\n    class Instance;\n    class PhysicalDevice;\n    class Device;\n    class Queue;\n    class DeviceMemory;\n    class Fence;\n    class Semaphore;\n    class Event;\n    class QueryPool;\n    class Buffer;\n    class BufferView;\n    class Image;\n    class ImageView;\n    class ShaderModule;\n    class PipelineCache;\n    class Pipeline;\n    class PipelineLayout;\n    class Sampler;\n    class DescriptorPool;\n    class DescriptorSet;\n    class DescriptorSetLayout;\n    class Framebuffer;\n    class RenderPass;\n    class CommandPool;\n    class CommandBuffer;\n\n    //=== VK_VERSION_1_1 ===\n    class SamplerYcbcrConversion;\n    class DescriptorUpdateTemplate;\n\n    //=== VK_VERSION_1_3 ===\n    class PrivateDataSlot;\n\n    //=== VK_KHR_surface ===\n    class SurfaceKHR;\n\n    //=== VK_KHR_swapchain ===\n    class SwapchainKHR;\n\n    //=== VK_KHR_display ===\n    class DisplayKHR;\n    class DisplayModeKHR;\n\n    //=== VK_EXT_debug_report ===\n    class DebugReportCallbackEXT;\n\n    //=== VK_KHR_video_queue ===\n    class VideoSessionKHR;\n    class VideoSessionParametersKHR;\n\n    //=== VK_NVX_binary_import ===\n    class CuModuleNVX;\n    class CuFunctionNVX;\n\n    //=== VK_EXT_debug_utils ===\n    class DebugUtilsMessengerEXT;\n\n    //=== VK_KHR_acceleration_structure ===\n    class AccelerationStructureKHR;\n\n    //=== VK_EXT_validation_cache ===\n    class ValidationCacheEXT;\n\n    //=== VK_NV_ray_tracing ===\n    class AccelerationStructureNV;\n\n    //=== VK_INTEL_performance_query ===\n    class PerformanceConfigurationINTEL;\n\n    //=== VK_KHR_deferred_host_operations ===\n    class DeferredOperationKHR;\n\n    //=== VK_NV_device_generated_commands ===\n    class IndirectCommandsLayoutNV;\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n    //=== VK_NV_cuda_kernel_launch ===\n    class CudaModuleNV;\n    class CudaFunctionNV;\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n    //=== VK_FUCHSIA_buffer_collection ===\n    class BufferCollectionFUCHSIA;\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n    //=== VK_EXT_opacity_micromap ===\n    class MicromapEXT;\n\n    //=== VK_NV_optical_flow ===\n    class OpticalFlowSessionNV;\n\n    //=== VK_EXT_shader_object ===\n    class ShaderEXT;\n\n    //=== VK_KHR_pipeline_binary ===\n    class PipelineBinaryKHR;\n\n    //=== VK_EXT_device_generated_commands ===\n    class IndirectCommandsLayoutEXT;\n    class IndirectExecutionSetEXT;\n\n    //====================\n    //=== RAII HANDLES ===\n    //====================\n\n    template <typename Type>\n    struct isVulkanRAIIHandleType\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = false;\n    };\n\n    class Context\n    {\n    public:\n#  if VULKAN_HPP_ENABLE_DYNAMIC_LOADER_TOOL\n      Context()\n        : m_dispatcher( new VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::ContextDispatcher(\n            m_dynamicLoader.getProcAddress<PFN_vkGetInstanceProcAddr>( \"vkGetInstanceProcAddr\" ) ) )\n#  else\n      Context( PFN_vkGetInstanceProcAddr getInstanceProcAddr )\n        : m_dispatcher( new VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::ContextDispatcher( getInstanceProcAddr ) )\n#  endif\n      {\n      }\n\n      ~Context() = default;\n\n      Context( Context const & ) = delete;\n      Context( Context && rhs ) VULKAN_HPP_NOEXCEPT\n#  if VULKAN_HPP_ENABLE_DYNAMIC_LOADER_TOOL\n        : m_dynamicLoader( std::move( rhs.m_dynamicLoader ) )\n        , m_dispatcher( rhs.m_dispatcher.release() )\n#  else\n        : m_dispatcher( rhs.m_dispatcher.release() )\n#  endif\n      {\n      }\n      Context & operator=( Context const & ) = delete;\n\n      Context & operator=( Context && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n#  if VULKAN_HPP_ENABLE_DYNAMIC_LOADER_TOOL\n          m_dynamicLoader = std::move( rhs.m_dynamicLoader );\n#  endif\n          m_dispatcher.reset( rhs.m_dispatcher.release() );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::ContextDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return &*m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Context & rhs )\n      {\n#  if VULKAN_HPP_ENABLE_DYNAMIC_LOADER_TOOL\n        std::swap( m_dynamicLoader, rhs.m_dynamicLoader );\n#  endif\n        m_dispatcher.swap( rhs.m_dispatcher );\n      }\n\n      //=== VK_VERSION_1_0 ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance>::Type\n        createInstance( VULKAN_HPP_NAMESPACE::InstanceCreateInfo const &                                createInfo,\n                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties>\n                           enumerateInstanceExtensionProperties( Optional<const std::string> layerName VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT ) const;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::LayerProperties> enumerateInstanceLayerProperties() const;\n\n      //=== VK_VERSION_1_1 ===\n\n      VULKAN_HPP_NODISCARD uint32_t enumerateInstanceVersion() const;\n\n    private:\n#  if VULKAN_HPP_ENABLE_DYNAMIC_LOADER_TOOL\n      VULKAN_HPP_NAMESPACE::detail::DynamicLoader m_dynamicLoader;\n#  endif\n      std::unique_ptr<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::ContextDispatcher> m_dispatcher;\n    };\n\n    class Instance\n    {\n    public:\n      using CType   = VkInstance;\n      using CppType = VULKAN_HPP_NAMESPACE::Instance;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eInstance;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eInstance;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      Instance( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Context const &                context,\n                VULKAN_HPP_NAMESPACE::InstanceCreateInfo const &                                createInfo,\n                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = context.createInstance( createInfo, allocator );\n      }\n#  endif\n\n      Instance( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Context const &                context,\n                VkInstance                                                                      instance,\n                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_instance( instance ), m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n      {\n        m_dispatcher.reset( new VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::InstanceDispatcher( context.getDispatcher()->vkGetInstanceProcAddr,\n                                                                                                             static_cast<VkInstance>( m_instance ) ) );\n      }\n\n      Instance( std::nullptr_t ) {}\n\n      ~Instance()\n      {\n        clear();\n      }\n\n      Instance()                   = delete;\n      Instance( Instance const & ) = delete;\n\n      Instance( Instance && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_instance( VULKAN_HPP_NAMESPACE::exchange( rhs.m_instance, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( rhs.m_dispatcher.release() )\n      {\n      }\n\n      Instance & operator=( Instance const & ) = delete;\n\n      Instance & operator=( Instance && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_instance, rhs.m_instance );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::Instance const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_instance;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::Instance() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_instance;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_instance )\n        {\n          getDispatcher()->vkDestroyInstance( static_cast<VkInstance>( m_instance ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_instance   = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::Instance release()\n      {\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_instance, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::InstanceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return &*m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_instance, rhs.m_instance );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_VERSION_1_0 ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n        std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice>>::Type\n        enumeratePhysicalDevices() const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PFN_VoidFunction getProcAddr( const std::string & name ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_VERSION_1_1 ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties> enumeratePhysicalDeviceGroups() const;\n\n      //=== VK_KHR_display ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n        createDisplayPlaneSurfaceKHR( VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateInfoKHR const &                       createInfo,\n                                      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n#  if defined( VK_USE_PLATFORM_XLIB_KHR )\n      //=== VK_KHR_xlib_surface ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n        createXlibSurfaceKHR( VULKAN_HPP_NAMESPACE::XlibSurfaceCreateInfoKHR const &                          createInfo,\n                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n#  endif /*VK_USE_PLATFORM_XLIB_KHR*/\n\n#  if defined( VK_USE_PLATFORM_XCB_KHR )\n      //=== VK_KHR_xcb_surface ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n        createXcbSurfaceKHR( VULKAN_HPP_NAMESPACE::XcbSurfaceCreateInfoKHR const &                           createInfo,\n                             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n#  endif /*VK_USE_PLATFORM_XCB_KHR*/\n\n#  if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n      //=== VK_KHR_wayland_surface ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n        createWaylandSurfaceKHR( VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateInfoKHR const &                       createInfo,\n                                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n#  endif /*VK_USE_PLATFORM_WAYLAND_KHR*/\n\n#  if defined( VK_USE_PLATFORM_ANDROID_KHR )\n      //=== VK_KHR_android_surface ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n        createAndroidSurfaceKHR( VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateInfoKHR const &                       createInfo,\n                                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_KHR_win32_surface ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n        createWin32SurfaceKHR( VULKAN_HPP_NAMESPACE::Win32SurfaceCreateInfoKHR const &                         createInfo,\n                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n      //=== VK_EXT_debug_report ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DebugReportCallbackEXT>::Type\n        createDebugReportCallbackEXT( VULKAN_HPP_NAMESPACE::DebugReportCallbackCreateInfoEXT const &                  createInfo,\n                                      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      void debugReportMessageEXT( VULKAN_HPP_NAMESPACE::DebugReportFlagsEXT      flags,\n                                  VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT objectType,\n                                  uint64_t                                       object,\n                                  size_t                                         location,\n                                  int32_t                                        messageCode,\n                                  const std::string &                            layerPrefix,\n                                  const std::string &                            message ) const VULKAN_HPP_NOEXCEPT;\n\n#  if defined( VK_USE_PLATFORM_GGP )\n      //=== VK_GGP_stream_descriptor_surface ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n        createStreamDescriptorSurfaceGGP( VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateInfoGGP const &              createInfo,\n                                          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n#  endif /*VK_USE_PLATFORM_GGP*/\n\n#  if defined( VK_USE_PLATFORM_VI_NN )\n      //=== VK_NN_vi_surface ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n        createViSurfaceNN( VULKAN_HPP_NAMESPACE::ViSurfaceCreateInfoNN const &                             createInfo,\n                           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n#  endif /*VK_USE_PLATFORM_VI_NN*/\n\n      //=== VK_KHR_device_group_creation ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties> enumeratePhysicalDeviceGroupsKHR() const;\n\n#  if defined( VK_USE_PLATFORM_IOS_MVK )\n      //=== VK_MVK_ios_surface ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n        createIOSSurfaceMVK( VULKAN_HPP_NAMESPACE::IOSSurfaceCreateInfoMVK const &                           createInfo,\n                             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n#  endif /*VK_USE_PLATFORM_IOS_MVK*/\n\n#  if defined( VK_USE_PLATFORM_MACOS_MVK )\n      //=== VK_MVK_macos_surface ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n        createMacOSSurfaceMVK( VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateInfoMVK const &                         createInfo,\n                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n#  endif /*VK_USE_PLATFORM_MACOS_MVK*/\n\n      //=== VK_EXT_debug_utils ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DebugUtilsMessengerEXT>::Type\n        createDebugUtilsMessengerEXT( VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateInfoEXT const &                  createInfo,\n                                      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      void submitDebugUtilsMessageEXT( VULKAN_HPP_NAMESPACE::DebugUtilsMessageSeverityFlagBitsEXT       messageSeverity,\n                                       VULKAN_HPP_NAMESPACE::DebugUtilsMessageTypeFlagsEXT              messageTypes,\n                                       const VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCallbackDataEXT & callbackData ) const VULKAN_HPP_NOEXCEPT;\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n      //=== VK_FUCHSIA_imagepipe_surface ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n        createImagePipeSurfaceFUCHSIA( VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateInfoFUCHSIA const &                 createInfo,\n                                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n      //=== VK_EXT_metal_surface ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n        createMetalSurfaceEXT( VULKAN_HPP_NAMESPACE::MetalSurfaceCreateInfoEXT const &                         createInfo,\n                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n      //=== VK_EXT_headless_surface ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n        createHeadlessSurfaceEXT( VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateInfoEXT const &                      createInfo,\n                                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n#  if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n      //=== VK_EXT_directfb_surface ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n        createDirectFBSurfaceEXT( VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateInfoEXT const &                      createInfo,\n                                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n#  endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n\n#  if defined( VK_USE_PLATFORM_SCREEN_QNX )\n      //=== VK_QNX_screen_surface ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n        createScreenSurfaceQNX( VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateInfoQNX const &                        createInfo,\n                                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n    private:\n      VULKAN_HPP_NAMESPACE::Instance                                                               m_instance  = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                            m_allocator = {};\n      std::unique_ptr<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::InstanceDispatcher> m_dispatcher;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class PhysicalDevice\n    {\n    public:\n      using CType   = VkPhysicalDevice;\n      using CppType = VULKAN_HPP_NAMESPACE::PhysicalDevice;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::ePhysicalDevice;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePhysicalDevice;\n\n    public:\n      PhysicalDevice( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const & instance, VkPhysicalDevice physicalDevice )\n        : m_physicalDevice( physicalDevice ), m_dispatcher( instance.getDispatcher() )\n      {\n      }\n\n      PhysicalDevice( std::nullptr_t ) {}\n\n      ~PhysicalDevice()\n      {\n        clear();\n      }\n\n      PhysicalDevice() = delete;\n\n      PhysicalDevice( PhysicalDevice const & rhs ) : m_physicalDevice( rhs.m_physicalDevice ), m_dispatcher( rhs.m_dispatcher ) {}\n\n      PhysicalDevice( PhysicalDevice && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_physicalDevice( VULKAN_HPP_NAMESPACE::exchange( rhs.m_physicalDevice, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      PhysicalDevice & operator=( PhysicalDevice const & rhs )\n      {\n        m_physicalDevice = rhs.m_physicalDevice;\n        m_dispatcher     = rhs.m_dispatcher;\n        return *this;\n      }\n\n      PhysicalDevice & operator=( PhysicalDevice && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_physicalDevice, rhs.m_physicalDevice );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::PhysicalDevice const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_physicalDevice;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::PhysicalDevice() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_physicalDevice;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        m_physicalDevice = nullptr;\n        m_dispatcher     = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::PhysicalDevice release()\n      {\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_physicalDevice, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::InstanceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_physicalDevice, rhs.m_physicalDevice );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_VERSION_1_0 ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures getFeatures() const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::FormatProperties getFormatProperties( VULKAN_HPP_NAMESPACE::Format format ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ImageFormatProperties\n                           getImageFormatProperties( VULKAN_HPP_NAMESPACE::Format                 format,\n                                                     VULKAN_HPP_NAMESPACE::ImageType              type,\n                                                     VULKAN_HPP_NAMESPACE::ImageTiling            tiling,\n                                                     VULKAN_HPP_NAMESPACE::ImageUsageFlags        usage,\n                                                     VULKAN_HPP_NAMESPACE::ImageCreateFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties getProperties() const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties> getQueueFamilyProperties() const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties getMemoryProperties() const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device>::Type\n        createDevice( VULKAN_HPP_NAMESPACE::DeviceCreateInfo const &                                  createInfo,\n                      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties>\n                           enumerateDeviceExtensionProperties( Optional<const std::string> layerName VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT ) const;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::LayerProperties> enumerateDeviceLayerProperties() const;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties>\n                           getSparseImageFormatProperties( VULKAN_HPP_NAMESPACE::Format              format,\n                                                           VULKAN_HPP_NAMESPACE::ImageType           type,\n                                                           VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples,\n                                                           VULKAN_HPP_NAMESPACE::ImageUsageFlags     usage,\n                                                           VULKAN_HPP_NAMESPACE::ImageTiling         tiling ) const;\n\n      //=== VK_VERSION_1_1 ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 getFeatures2() const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> getFeatures2() const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 getProperties2() const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> getProperties2() const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::FormatProperties2 getFormatProperties2( VULKAN_HPP_NAMESPACE::Format format ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                           getFormatProperties2( VULKAN_HPP_NAMESPACE::Format format ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ImageFormatProperties2\n                           getImageFormatProperties2( const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 & imageFormatInfo ) const;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                           getImageFormatProperties2( const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 & imageFormatInfo ) const;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2> getQueueFamilyProperties2() const;\n\n      template <typename StructureChain>\n      VULKAN_HPP_NODISCARD std::vector<StructureChain> getQueueFamilyProperties2() const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 getMemoryProperties2() const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> getMemoryProperties2() const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2>\n                           getSparseImageFormatProperties2( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 & formatInfo ) const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ExternalBufferProperties\n        getExternalBufferProperties( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo & externalBufferInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ExternalFenceProperties\n        getExternalFenceProperties( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo & externalFenceInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties\n        getExternalSemaphoreProperties( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo & externalSemaphoreInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_VERSION_1_3 ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties> getToolProperties() const;\n\n      //=== VK_KHR_surface ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Bool32 getSurfaceSupportKHR( uint32_t queueFamilyIndex, VULKAN_HPP_NAMESPACE::SurfaceKHR surface ) const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR getSurfaceCapabilitiesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface ) const;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormatKHR>\n                           getSurfaceFormatsKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR>\n                           getSurfacePresentModesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const;\n\n      //=== VK_KHR_swapchain ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::Rect2D> getPresentRectanglesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface ) const;\n\n      //=== VK_KHR_display ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR> getDisplayPropertiesKHR() const;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR> getDisplayPlanePropertiesKHR() const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n        std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR>>::Type\n        getDisplayPlaneSupportedDisplaysKHR( uint32_t planeIndex ) const;\n\n#  if defined( VK_USE_PLATFORM_XLIB_KHR )\n      //=== VK_KHR_xlib_surface ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Bool32\n                           getXlibPresentationSupportKHR( uint32_t queueFamilyIndex, Display & dpy, VisualID visualID ) const VULKAN_HPP_NOEXCEPT;\n#  endif /*VK_USE_PLATFORM_XLIB_KHR*/\n\n#  if defined( VK_USE_PLATFORM_XCB_KHR )\n      //=== VK_KHR_xcb_surface ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Bool32\n        getXcbPresentationSupportKHR( uint32_t queueFamilyIndex, xcb_connection_t & connection, xcb_visualid_t visual_id ) const VULKAN_HPP_NOEXCEPT;\n#  endif /*VK_USE_PLATFORM_XCB_KHR*/\n\n#  if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n      //=== VK_KHR_wayland_surface ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Bool32 getWaylandPresentationSupportKHR( uint32_t            queueFamilyIndex,\n                                                                                          struct wl_display & display ) const VULKAN_HPP_NOEXCEPT;\n#  endif /*VK_USE_PLATFORM_WAYLAND_KHR*/\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_KHR_win32_surface ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Bool32 getWin32PresentationSupportKHR( uint32_t queueFamilyIndex ) const VULKAN_HPP_NOEXCEPT;\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n      //=== VK_KHR_video_queue ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR\n                           getVideoCapabilitiesKHR( const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR & videoProfile ) const;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                           getVideoCapabilitiesKHR( const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR & videoProfile ) const;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR>\n                           getVideoFormatPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR & videoFormatInfo ) const;\n\n      template <typename StructureChain>\n      VULKAN_HPP_NODISCARD std::vector<StructureChain>\n                           getVideoFormatPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR & videoFormatInfo ) const;\n\n      //=== VK_NV_external_memory_capabilities ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ExternalImageFormatPropertiesNV getExternalImageFormatPropertiesNV(\n        VULKAN_HPP_NAMESPACE::Format                                             format,\n        VULKAN_HPP_NAMESPACE::ImageType                                          type,\n        VULKAN_HPP_NAMESPACE::ImageTiling                                        tiling,\n        VULKAN_HPP_NAMESPACE::ImageUsageFlags                                    usage,\n        VULKAN_HPP_NAMESPACE::ImageCreateFlags flags                             VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n        VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV externalHandleType VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const;\n\n      //=== VK_KHR_get_physical_device_properties2 ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 getFeatures2KHR() const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> getFeatures2KHR() const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 getProperties2KHR() const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> getProperties2KHR() const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::FormatProperties2 getFormatProperties2KHR( VULKAN_HPP_NAMESPACE::Format format ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                           getFormatProperties2KHR( VULKAN_HPP_NAMESPACE::Format format ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ImageFormatProperties2\n                           getImageFormatProperties2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 & imageFormatInfo ) const;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                           getImageFormatProperties2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 & imageFormatInfo ) const;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2> getQueueFamilyProperties2KHR() const;\n\n      template <typename StructureChain>\n      VULKAN_HPP_NODISCARD std::vector<StructureChain> getQueueFamilyProperties2KHR() const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 getMemoryProperties2KHR() const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> getMemoryProperties2KHR() const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2>\n                           getSparseImageFormatProperties2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 & formatInfo ) const;\n\n      //=== VK_KHR_external_memory_capabilities ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ExternalBufferProperties\n        getExternalBufferPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo & externalBufferInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_external_semaphore_capabilities ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties\n        getExternalSemaphorePropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo & externalSemaphoreInfo ) const VULKAN_HPP_NOEXCEPT;\n\n#  if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )\n      //=== VK_EXT_acquire_xlib_display ===\n\n      void acquireXlibDisplayEXT( Display & dpy, VULKAN_HPP_NAMESPACE::DisplayKHR display ) const;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR>::Type\n        getRandROutputDisplayEXT( Display & dpy, RROutput rrOutput ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n#  endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/\n\n      //=== VK_EXT_display_surface_counter ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::SurfaceCapabilities2EXT getSurfaceCapabilities2EXT( VULKAN_HPP_NAMESPACE::SurfaceKHR surface ) const;\n\n      //=== VK_KHR_external_fence_capabilities ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ExternalFenceProperties\n        getExternalFencePropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo & externalFenceInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_performance_query ===\n\n      VULKAN_HPP_NODISCARD\n        std::pair<std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterKHR>, std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR>>\n        enumerateQueueFamilyPerformanceQueryCountersKHR( uint32_t queueFamilyIndex ) const;\n\n      VULKAN_HPP_NODISCARD uint32_t getQueueFamilyPerformanceQueryPassesKHR(\n        const VULKAN_HPP_NAMESPACE::QueryPoolPerformanceCreateInfoKHR & performanceQueryCreateInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_get_surface_capabilities2 ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR\n                           getSurfaceCapabilities2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo ) const;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                           getSurfaceCapabilities2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo ) const;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR>\n                           getSurfaceFormats2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo ) const;\n\n      template <typename StructureChain>\n      VULKAN_HPP_NODISCARD std::vector<StructureChain> getSurfaceFormats2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo ) const;\n\n      //=== VK_KHR_get_display_properties2 ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::DisplayProperties2KHR> getDisplayProperties2KHR() const;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR> getDisplayPlaneProperties2KHR() const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilities2KHR\n                           getDisplayPlaneCapabilities2KHR( const VULKAN_HPP_NAMESPACE::DisplayPlaneInfo2KHR & displayPlaneInfo ) const;\n\n      //=== VK_EXT_sample_locations ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MultisamplePropertiesEXT\n                           getMultisamplePropertiesEXT( VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_calibrated_timestamps ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::TimeDomainKHR> getCalibrateableTimeDomainsEXT() const;\n\n      //=== VK_KHR_fragment_shading_rate ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR> getFragmentShadingRatesKHR() const;\n\n      //=== VK_EXT_tooling_info ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties> getToolPropertiesEXT() const;\n\n      //=== VK_NV_cooperative_matrix ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV> getCooperativeMatrixPropertiesNV() const;\n\n      //=== VK_NV_coverage_reduction_mode ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV> getSupportedFramebufferMixedSamplesCombinationsNV() const;\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_EXT_full_screen_exclusive ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR>\n                           getSurfacePresentModes2EXT( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo ) const;\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n      //=== VK_EXT_acquire_drm_display ===\n\n      void acquireDrmDisplayEXT( int32_t drmFd, VULKAN_HPP_NAMESPACE::DisplayKHR display ) const;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR>::Type\n        getDrmDisplayEXT( int32_t drmFd, uint32_t connectorId ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      //=== VK_KHR_video_encode_queue ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelPropertiesKHR\n        getVideoEncodeQualityLevelPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeQualityLevelInfoKHR & qualityLevelInfo ) const;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n        getVideoEncodeQualityLevelPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeQualityLevelInfoKHR & qualityLevelInfo ) const;\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_NV_acquire_winrt_display ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR>::Type\n        getWinrtDisplayNV( uint32_t deviceRelativeId ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#  if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n      //=== VK_EXT_directfb_surface ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Bool32 getDirectFBPresentationSupportEXT( uint32_t    queueFamilyIndex,\n                                                                                           IDirectFB & dfb ) const VULKAN_HPP_NOEXCEPT;\n#  endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n\n#  if defined( VK_USE_PLATFORM_SCREEN_QNX )\n      //=== VK_QNX_screen_surface ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Bool32 getScreenPresentationSupportQNX( uint32_t                queueFamilyIndex,\n                                                                                         struct _screen_window & window ) const VULKAN_HPP_NOEXCEPT;\n#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n      //=== VK_NV_optical_flow ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatPropertiesNV>\n                           getOpticalFlowImageFormatsNV( const VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatInfoNV & opticalFlowImageFormatInfo ) const;\n\n      //=== VK_NV_cooperative_vector ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::CooperativeVectorPropertiesNV> getCooperativeVectorPropertiesNV() const;\n\n      //=== VK_KHR_cooperative_matrix ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesKHR> getCooperativeMatrixPropertiesKHR() const;\n\n      //=== VK_KHR_calibrated_timestamps ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::TimeDomainKHR> getCalibrateableTimeDomainsKHR() const;\n\n      //=== VK_NV_cooperative_matrix2 ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixFlexibleDimensionsPropertiesNV>\n                           getCooperativeMatrixFlexibleDimensionsPropertiesNV() const;\n\n    private:\n      VULKAN_HPP_NAMESPACE::PhysicalDevice                                                m_physicalDevice = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::InstanceDispatcher const * m_dispatcher     = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class PhysicalDevices : public std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice>\n    {\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      PhysicalDevices( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const & instance )\n      {\n        *this = instance.enumeratePhysicalDevices();\n      }\n#  endif\n\n      PhysicalDevices( std::nullptr_t ) {}\n\n      PhysicalDevices()                                      = delete;\n      PhysicalDevices( PhysicalDevices const & )             = delete;\n      PhysicalDevices( PhysicalDevices && rhs )              = default;\n      PhysicalDevices & operator=( PhysicalDevices const & ) = delete;\n      PhysicalDevices & operator=( PhysicalDevices && rhs )  = default;\n\n    private:\n      PhysicalDevices( std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice> && rhs )\n      {\n        std::swap( *this, rhs );\n      }\n    };\n\n    class Device\n    {\n    public:\n      using CType   = VkDevice;\n      using CppType = VULKAN_HPP_NAMESPACE::Device;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDevice;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDevice;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      Device( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice const &         physicalDevice,\n              VULKAN_HPP_NAMESPACE::DeviceCreateInfo const &                                  createInfo,\n              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = physicalDevice.createDevice( createInfo, allocator );\n      }\n#  endif\n\n      Device( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice const &         physicalDevice,\n              VkDevice                                                                        device,\n              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device ), m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n      {\n        m_dispatcher.reset( new VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher( physicalDevice.getDispatcher()->vkGetDeviceProcAddr,\n                                                                                                           static_cast<VkDevice>( m_device ) ) );\n      }\n\n      Device( std::nullptr_t ) {}\n\n      ~Device()\n      {\n        clear();\n      }\n\n      Device()                 = delete;\n      Device( Device const & ) = delete;\n\n      Device( Device && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( rhs.m_dispatcher.release() )\n      {\n      }\n\n      Device & operator=( Device const & ) = delete;\n\n      Device & operator=( Device && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::Device const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_device;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::Device() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_device;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_device )\n        {\n          getDispatcher()->vkDestroyDevice( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::Device release()\n      {\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_device, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return &*m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_VERSION_1_0 ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PFN_VoidFunction getProcAddr( const std::string & name ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Queue>::Type\n        getQueue( uint32_t queueFamilyIndex, uint32_t queueIndex ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      void waitIdle() const;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceMemory>::Type\n        allocateMemory( VULKAN_HPP_NAMESPACE::MemoryAllocateInfo const &                                allocateInfo,\n                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      void flushMappedMemoryRanges( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MappedMemoryRange> const & memoryRanges ) const;\n\n      void invalidateMappedMemoryRanges( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MappedMemoryRange> const & memoryRanges ) const;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Fence>::Type\n        createFence( VULKAN_HPP_NAMESPACE::FenceCreateInfo const &                                   createInfo,\n                     VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      void resetFences( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Fence> const & fences ) const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result waitForFences( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Fence> const & fences,\n                                                                       VULKAN_HPP_NAMESPACE::Bool32                                                waitAll,\n                                                                       uint64_t timeout ) const;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Semaphore>::Type\n        createSemaphore( VULKAN_HPP_NAMESPACE::SemaphoreCreateInfo const &                               createInfo,\n                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Event>::Type\n        createEvent( VULKAN_HPP_NAMESPACE::EventCreateInfo const &                                   createInfo,\n                     VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::QueryPool>::Type\n        createQueryPool( VULKAN_HPP_NAMESPACE::QueryPoolCreateInfo const &                               createInfo,\n                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Buffer>::Type\n        createBuffer( VULKAN_HPP_NAMESPACE::BufferCreateInfo const &                                  createInfo,\n                      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::BufferView>::Type\n        createBufferView( VULKAN_HPP_NAMESPACE::BufferViewCreateInfo const &                              createInfo,\n                          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Image>::Type\n        createImage( VULKAN_HPP_NAMESPACE::ImageCreateInfo const &                                   createInfo,\n                     VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ImageView>::Type\n        createImageView( VULKAN_HPP_NAMESPACE::ImageViewCreateInfo const &                               createInfo,\n                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ShaderModule>::Type\n        createShaderModule( VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo const &                            createInfo,\n                            VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache>::Type\n        createPipelineCache( VULKAN_HPP_NAMESPACE::PipelineCacheCreateInfo const &                           createInfo,\n                             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline>>::Type\n        createGraphicsPipelines( VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n                                 VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo> const &                   createInfos,\n                                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline>::Type\n        createGraphicsPipeline( VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n                                VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo const &                                                     createInfo,\n                                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline>>::Type\n        createComputePipelines( VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n                                VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo> const &                    createInfos,\n                                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline>::Type\n        createComputePipeline( VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n                               VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo const &                                                      createInfo,\n                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineLayout>::Type\n        createPipelineLayout( VULKAN_HPP_NAMESPACE::PipelineLayoutCreateInfo const &                          createInfo,\n                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Sampler>::Type\n        createSampler( VULKAN_HPP_NAMESPACE::SamplerCreateInfo const &                                 createInfo,\n                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorSetLayout>::Type\n        createDescriptorSetLayout( VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo const &                     createInfo,\n                                   VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorPool>::Type\n        createDescriptorPool( VULKAN_HPP_NAMESPACE::DescriptorPoolCreateInfo const &                          createInfo,\n                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n        std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorSet>>::Type\n        allocateDescriptorSets( VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo const & allocateInfo ) const;\n\n      void updateDescriptorSets( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteDescriptorSet> const & descriptorWrites,\n                                 VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CopyDescriptorSet> const &  descriptorCopies ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Framebuffer>::Type\n        createFramebuffer( VULKAN_HPP_NAMESPACE::FramebufferCreateInfo const &                             createInfo,\n                           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::RenderPass>::Type\n        createRenderPass( VULKAN_HPP_NAMESPACE::RenderPassCreateInfo const &                              createInfo,\n                          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CommandPool>::Type\n        createCommandPool( VULKAN_HPP_NAMESPACE::CommandPoolCreateInfo const &                             createInfo,\n                           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n        std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CommandBuffer>>::Type\n        allocateCommandBuffers( VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo const & allocateInfo ) const;\n\n      //=== VK_VERSION_1_1 ===\n\n      void bindBufferMemory2( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo> const & bindInfos ) const;\n\n      void bindImageMemory2( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindImageMemoryInfo> const & bindInfos ) const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags\n                           getGroupPeerMemoryFeatures( uint32_t heapIndex, uint32_t localDeviceIndex, uint32_t remoteDeviceIndex ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2\n                           getImageMemoryRequirements2( const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 & info ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                           getImageMemoryRequirements2( const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 & info ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2\n                           getBufferMemoryRequirements2( const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 & info ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                           getBufferMemoryRequirements2( const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 & info ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>\n                           getImageSparseMemoryRequirements2( const VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 & info ) const;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Queue>::Type\n        getQueue2( VULKAN_HPP_NAMESPACE::DeviceQueueInfo2 const & queueInfo ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SamplerYcbcrConversion>::Type\n        createSamplerYcbcrConversion( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo const &                  createInfo,\n                                      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorUpdateTemplate>::Type\n        createDescriptorUpdateTemplate( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo const &                createInfo,\n                                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport\n                           getDescriptorSetLayoutSupport( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo & createInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                           getDescriptorSetLayoutSupport( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo & createInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_VERSION_1_2 ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::RenderPass>::Type\n        createRenderPass2( VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 const &                             createInfo,\n                           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result waitSemaphores( const VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo & waitInfo, uint64_t timeout ) const;\n\n      void signalSemaphore( const VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo & signalInfo ) const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceAddress\n                           getBufferAddress( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo & info ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD uint64_t getBufferOpaqueCaptureAddress( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo & info ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD uint64_t\n        getMemoryOpaqueCaptureAddress( const VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo & info ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_VERSION_1_3 ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PrivateDataSlot>::Type\n        createPrivateDataSlot( VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo const &                         createInfo,\n                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      void setPrivateData( VULKAN_HPP_NAMESPACE::ObjectType      objectType,\n                           uint64_t                              objectHandle,\n                           VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,\n                           uint64_t                              data ) const;\n\n      VULKAN_HPP_NODISCARD uint64_t getPrivateData( VULKAN_HPP_NAMESPACE::ObjectType      objectType,\n                                                    uint64_t                              objectHandle,\n                                                    VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2\n                           getBufferMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements & info ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                           getBufferMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements & info ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2\n                           getImageMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                           getImageMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>\n                           getImageSparseMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info ) const;\n\n      //=== VK_VERSION_1_4 ===\n\n      VULKAN_HPP_NODISCARD void * mapMemory2( const VULKAN_HPP_NAMESPACE::MemoryMapInfo & memoryMapInfo ) const;\n\n      void unmapMemory2( const VULKAN_HPP_NAMESPACE::MemoryUnmapInfo & memoryUnmapInfo ) const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Extent2D\n                           getRenderingAreaGranularity( const VULKAN_HPP_NAMESPACE::RenderingAreaInfo & renderingAreaInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::SubresourceLayout2\n                           getImageSubresourceLayout( const VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo & info ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                           getImageSubresourceLayout( const VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo & info ) const VULKAN_HPP_NOEXCEPT;\n\n      void copyMemoryToImage( const VULKAN_HPP_NAMESPACE::CopyMemoryToImageInfo & copyMemoryToImageInfo ) const;\n\n      void copyImageToMemory( const VULKAN_HPP_NAMESPACE::CopyImageToMemoryInfo & copyImageToMemoryInfo ) const;\n\n      void copyImageToImage( const VULKAN_HPP_NAMESPACE::CopyImageToImageInfo & copyImageToImageInfo ) const;\n\n      void transitionImageLayout( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::HostImageLayoutTransitionInfo> const & transitions ) const;\n\n      //=== VK_KHR_swapchain ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SwapchainKHR>::Type\n        createSwapchainKHR( VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR const &                            createInfo,\n                            VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceGroupPresentCapabilitiesKHR getGroupPresentCapabilitiesKHR() const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR\n                           getGroupSurfacePresentModesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface ) const;\n\n      VULKAN_HPP_NODISCARD std::pair<VULKAN_HPP_NAMESPACE::Result, uint32_t>\n                           acquireNextImage2KHR( const VULKAN_HPP_NAMESPACE::AcquireNextImageInfoKHR & acquireInfo ) const;\n\n      //=== VK_KHR_display_swapchain ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n        std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SwapchainKHR>>::Type\n        createSharedSwapchainsKHR( VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR> const & createInfos,\n                                   VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>        allocator = nullptr ) const;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SwapchainKHR>::Type\n        createSharedSwapchainKHR( VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR const &                            createInfo,\n                                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      //=== VK_EXT_debug_marker ===\n\n      void debugMarkerSetObjectTagEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerObjectTagInfoEXT & tagInfo ) const;\n\n      void debugMarkerSetObjectNameEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerObjectNameInfoEXT & nameInfo ) const;\n\n      //=== VK_KHR_video_queue ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::VideoSessionKHR>::Type\n        createVideoSessionKHR( VULKAN_HPP_NAMESPACE::VideoSessionCreateInfoKHR const &                         createInfo,\n                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::VideoSessionParametersKHR>::Type\n        createVideoSessionParametersKHR( VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateInfoKHR const &               createInfo,\n                                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      //=== VK_NVX_binary_import ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CuModuleNVX>::Type\n        createCuModuleNVX( VULKAN_HPP_NAMESPACE::CuModuleCreateInfoNVX const &                             createInfo,\n                           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CuFunctionNVX>::Type\n        createCuFunctionNVX( VULKAN_HPP_NAMESPACE::CuFunctionCreateInfoNVX const &                           createInfo,\n                             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      //=== VK_NVX_image_view_handle ===\n\n      VULKAN_HPP_NODISCARD uint32_t getImageViewHandleNVX( const VULKAN_HPP_NAMESPACE::ImageViewHandleInfoNVX & info ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD uint64_t getImageViewHandle64NVX( const VULKAN_HPP_NAMESPACE::ImageViewHandleInfoNVX & info ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_device_group ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags\n                           getGroupPeerMemoryFeaturesKHR( uint32_t heapIndex, uint32_t localDeviceIndex, uint32_t remoteDeviceIndex ) const VULKAN_HPP_NOEXCEPT;\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_KHR_external_memory_win32 ===\n\n      VULKAN_HPP_NODISCARD HANDLE getMemoryWin32HandleKHR( const VULKAN_HPP_NAMESPACE::MemoryGetWin32HandleInfoKHR & getWin32HandleInfo ) const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryWin32HandlePropertiesKHR\n                           getMemoryWin32HandlePropertiesKHR( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType, HANDLE handle ) const;\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n      //=== VK_KHR_external_memory_fd ===\n\n      VULKAN_HPP_NODISCARD int getMemoryFdKHR( const VULKAN_HPP_NAMESPACE::MemoryGetFdInfoKHR & getFdInfo ) const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryFdPropertiesKHR\n                           getMemoryFdPropertiesKHR( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType, int fd ) const;\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_KHR_external_semaphore_win32 ===\n\n      void importSemaphoreWin32HandleKHR( const VULKAN_HPP_NAMESPACE::ImportSemaphoreWin32HandleInfoKHR & importSemaphoreWin32HandleInfo ) const;\n\n      VULKAN_HPP_NODISCARD HANDLE getSemaphoreWin32HandleKHR( const VULKAN_HPP_NAMESPACE::SemaphoreGetWin32HandleInfoKHR & getWin32HandleInfo ) const;\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n      //=== VK_KHR_external_semaphore_fd ===\n\n      void importSemaphoreFdKHR( const VULKAN_HPP_NAMESPACE::ImportSemaphoreFdInfoKHR & importSemaphoreFdInfo ) const;\n\n      VULKAN_HPP_NODISCARD int getSemaphoreFdKHR( const VULKAN_HPP_NAMESPACE::SemaphoreGetFdInfoKHR & getFdInfo ) const;\n\n      //=== VK_KHR_descriptor_update_template ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorUpdateTemplate>::Type\n        createDescriptorUpdateTemplateKHR( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo const &                createInfo,\n                                           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      void destroyDescriptorUpdateTemplateKHR( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator\n                                                 VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_display_control ===\n\n      void displayPowerControlEXT( VULKAN_HPP_NAMESPACE::DisplayKHR display, const VULKAN_HPP_NAMESPACE::DisplayPowerInfoEXT & displayPowerInfo ) const;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Fence>::Type\n        registerEventEXT( VULKAN_HPP_NAMESPACE::DeviceEventInfoEXT const &                                deviceEventInfo,\n                          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Fence>::Type\n        registerDisplayEventEXT( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR const &             display,\n                                 VULKAN_HPP_NAMESPACE::DisplayEventInfoEXT const &                               displayEventInfo,\n                                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      //=== VK_EXT_hdr_metadata ===\n\n      void setHdrMetadataEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SwapchainKHR> const &   swapchains,\n                              VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::HdrMetadataEXT> const & metadata ) const;\n\n      //=== VK_KHR_create_renderpass2 ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::RenderPass>::Type\n        createRenderPass2KHR( VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 const &                             createInfo,\n                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_KHR_external_fence_win32 ===\n\n      void importFenceWin32HandleKHR( const VULKAN_HPP_NAMESPACE::ImportFenceWin32HandleInfoKHR & importFenceWin32HandleInfo ) const;\n\n      VULKAN_HPP_NODISCARD HANDLE getFenceWin32HandleKHR( const VULKAN_HPP_NAMESPACE::FenceGetWin32HandleInfoKHR & getWin32HandleInfo ) const;\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n      //=== VK_KHR_external_fence_fd ===\n\n      void importFenceFdKHR( const VULKAN_HPP_NAMESPACE::ImportFenceFdInfoKHR & importFenceFdInfo ) const;\n\n      VULKAN_HPP_NODISCARD int getFenceFdKHR( const VULKAN_HPP_NAMESPACE::FenceGetFdInfoKHR & getFdInfo ) const;\n\n      //=== VK_KHR_performance_query ===\n\n      void acquireProfilingLockKHR( const VULKAN_HPP_NAMESPACE::AcquireProfilingLockInfoKHR & info ) const;\n\n      void releaseProfilingLockKHR() const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_debug_utils ===\n\n      void setDebugUtilsObjectNameEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT & nameInfo ) const;\n\n      void setDebugUtilsObjectTagEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsObjectTagInfoEXT & tagInfo ) const;\n\n#  if defined( VK_USE_PLATFORM_ANDROID_KHR )\n      //=== VK_ANDROID_external_memory_android_hardware_buffer ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID\n                           getAndroidHardwareBufferPropertiesANDROID( const struct AHardwareBuffer & buffer ) const;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                           getAndroidHardwareBufferPropertiesANDROID( const struct AHardwareBuffer & buffer ) const;\n\n      VULKAN_HPP_NODISCARD struct AHardwareBuffer *\n        getMemoryAndroidHardwareBufferANDROID( const VULKAN_HPP_NAMESPACE::MemoryGetAndroidHardwareBufferInfoANDROID & info ) const;\n#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n      //=== VK_AMDX_shader_enqueue ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline>>::Type\n        createExecutionGraphPipelinesAMDX(\n          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n          VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX> const &         createInfos,\n          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                              allocator = nullptr ) const;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline>::Type\n        createExecutionGraphPipelineAMDX(\n          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n          VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX const &                                           createInfo,\n          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n      //=== VK_KHR_get_memory_requirements2 ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2\n                           getImageMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 & info ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                           getImageMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 & info ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2\n                           getBufferMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 & info ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                           getBufferMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 & info ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>\n                           getImageSparseMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 & info ) const;\n\n      //=== VK_KHR_acceleration_structure ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::AccelerationStructureKHR>::Type\n        createAccelerationStructureKHR( VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoKHR const &                createInfo,\n                                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result buildAccelerationStructuresKHR(\n        VULKAN_HPP_NAMESPACE::DeferredOperationKHR                                                                           deferredOperation,\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR> const &      infos,\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR * const> const & pBuildRangeInfos ) const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result\n                           copyAccelerationStructureKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                     deferredOperation,\n                                                         const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR & info ) const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result\n                           copyAccelerationStructureToMemoryKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                             deferredOperation,\n                                                                 const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureToMemoryInfoKHR & info ) const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result\n                           copyMemoryToAccelerationStructureKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                             deferredOperation,\n                                                                 const VULKAN_HPP_NAMESPACE::CopyMemoryToAccelerationStructureInfoKHR & info ) const;\n\n      template <typename DataType>\n      VULKAN_HPP_NODISCARD std::vector<DataType> writeAccelerationStructuresPropertiesKHR(\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR> const & accelerationStructures,\n        VULKAN_HPP_NAMESPACE::QueryType                                                                queryType,\n        size_t                                                                                         dataSize,\n        size_t                                                                                         stride ) const;\n\n      template <typename DataType>\n      VULKAN_HPP_NODISCARD DataType writeAccelerationStructuresPropertyKHR(\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR> const & accelerationStructures,\n        VULKAN_HPP_NAMESPACE::QueryType                                                                queryType,\n        size_t                                                                                         stride ) const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceAddress\n        getAccelerationStructureAddressKHR( const VULKAN_HPP_NAMESPACE::AccelerationStructureDeviceAddressInfoKHR & info ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::AccelerationStructureCompatibilityKHR\n        getAccelerationStructureCompatibilityKHR( const VULKAN_HPP_NAMESPACE::AccelerationStructureVersionInfoKHR & versionInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR getAccelerationStructureBuildSizesKHR(\n        VULKAN_HPP_NAMESPACE::AccelerationStructureBuildTypeKHR                     buildType,\n        const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR &     buildInfo,\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const uint32_t> const & maxPrimitiveCounts VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT ) const;\n\n      //=== VK_KHR_ray_tracing_pipeline ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline>>::Type\n        createRayTracingPipelinesKHR(\n          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeferredOperationKHR> const & deferredOperation,\n          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &        pipelineCache,\n          VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR> const &                     createInfos,\n          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                     allocator = nullptr ) const;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline>::Type\n        createRayTracingPipelineKHR(\n          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeferredOperationKHR> const & deferredOperation,\n          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &        pipelineCache,\n          VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR const &                                                       createInfo,\n          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      //=== VK_KHR_sampler_ycbcr_conversion ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SamplerYcbcrConversion>::Type\n        createSamplerYcbcrConversionKHR( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo const &                  createInfo,\n                                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      void destroySamplerYcbcrConversionKHR( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion ycbcrConversion VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                             Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator\n                                               VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_bind_memory2 ===\n\n      void bindBufferMemory2KHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo> const & bindInfos ) const;\n\n      void bindImageMemory2KHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindImageMemoryInfo> const & bindInfos ) const;\n\n      //=== VK_EXT_validation_cache ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ValidationCacheEXT>::Type\n        createValidationCacheEXT( VULKAN_HPP_NAMESPACE::ValidationCacheCreateInfoEXT const &                      createInfo,\n                                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      //=== VK_NV_ray_tracing ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::AccelerationStructureNV>::Type\n        createAccelerationStructureNV( VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoNV const &                 createInfo,\n                                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2KHR getAccelerationStructureMemoryRequirementsNV(\n        const VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsInfoNV & info ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> getAccelerationStructureMemoryRequirementsNV(\n        const VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsInfoNV & info ) const VULKAN_HPP_NOEXCEPT;\n\n      void bindAccelerationStructureMemoryNV(\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindAccelerationStructureMemoryInfoNV> const & bindInfos ) const;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline>>::Type\n        createRayTracingPipelinesNV( VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n                                     VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV> const &               createInfos,\n                                     VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline>::Type\n        createRayTracingPipelineNV( VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n                                    VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV const &                                                 createInfo,\n                                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      //=== VK_KHR_maintenance3 ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport\n                           getDescriptorSetLayoutSupportKHR( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo & createInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                           getDescriptorSetLayoutSupportKHR( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo & createInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_external_memory_host ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryHostPointerPropertiesEXT\n        getMemoryHostPointerPropertiesEXT( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType, const void * pHostPointer ) const;\n\n      //=== VK_EXT_calibrated_timestamps ===\n\n      VULKAN_HPP_NODISCARD std::pair<std::vector<uint64_t>, uint64_t>\n        getCalibratedTimestampsEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR> const & timestampInfos ) const;\n\n      VULKAN_HPP_NODISCARD std::pair<uint64_t, uint64_t>\n                           getCalibratedTimestampEXT( const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR & timestampInfo ) const;\n\n      //=== VK_KHR_timeline_semaphore ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result waitSemaphoresKHR( const VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo & waitInfo, uint64_t timeout ) const;\n\n      void signalSemaphoreKHR( const VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo & signalInfo ) const;\n\n      //=== VK_INTEL_performance_query ===\n\n      void initializePerformanceApiINTEL( const VULKAN_HPP_NAMESPACE::InitializePerformanceApiInfoINTEL & initializeInfo ) const;\n\n      void uninitializePerformanceApiINTEL() const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PerformanceConfigurationINTEL>::Type\n        acquirePerformanceConfigurationINTEL( VULKAN_HPP_NAMESPACE::PerformanceConfigurationAcquireInfoINTEL const & acquireInfo ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PerformanceValueINTEL\n                           getPerformanceParameterINTEL( VULKAN_HPP_NAMESPACE::PerformanceParameterTypeINTEL parameter ) const;\n\n      //=== VK_EXT_buffer_device_address ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceAddress\n                           getBufferAddressEXT( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo & info ) const VULKAN_HPP_NOEXCEPT;\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_EXT_full_screen_exclusive ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR\n                           getGroupSurfacePresentModes2EXT( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo ) const;\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n      //=== VK_KHR_buffer_device_address ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceAddress\n                           getBufferAddressKHR( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo & info ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD uint64_t getBufferOpaqueCaptureAddressKHR( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo & info ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD uint64_t\n        getMemoryOpaqueCaptureAddressKHR( const VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo & info ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_deferred_host_operations ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeferredOperationKHR>::Type\n        createDeferredOperationKHR( VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      //=== VK_KHR_pipeline_executable_properties ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR>\n                           getPipelineExecutablePropertiesKHR( const VULKAN_HPP_NAMESPACE::PipelineInfoKHR & pipelineInfo ) const;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR>\n                           getPipelineExecutableStatisticsKHR( const VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR & executableInfo ) const;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR>\n                           getPipelineExecutableInternalRepresentationsKHR( const VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR & executableInfo ) const;\n\n      //=== VK_EXT_host_image_copy ===\n\n      void copyMemoryToImageEXT( const VULKAN_HPP_NAMESPACE::CopyMemoryToImageInfo & copyMemoryToImageInfo ) const;\n\n      void copyImageToMemoryEXT( const VULKAN_HPP_NAMESPACE::CopyImageToMemoryInfo & copyImageToMemoryInfo ) const;\n\n      void copyImageToImageEXT( const VULKAN_HPP_NAMESPACE::CopyImageToImageInfo & copyImageToImageInfo ) const;\n\n      void transitionImageLayoutEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::HostImageLayoutTransitionInfo> const & transitions ) const;\n\n      //=== VK_KHR_map_memory2 ===\n\n      VULKAN_HPP_NODISCARD void * mapMemory2KHR( const VULKAN_HPP_NAMESPACE::MemoryMapInfo & memoryMapInfo ) const;\n\n      void unmapMemory2KHR( const VULKAN_HPP_NAMESPACE::MemoryUnmapInfo & memoryUnmapInfo ) const;\n\n      //=== VK_EXT_swapchain_maintenance1 ===\n\n      void releaseSwapchainImagesEXT( const VULKAN_HPP_NAMESPACE::ReleaseSwapchainImagesInfoEXT & releaseInfo ) const;\n\n      //=== VK_NV_device_generated_commands ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2\n        getGeneratedCommandsMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoNV & info ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n        getGeneratedCommandsMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoNV & info ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::IndirectCommandsLayoutNV>::Type\n        createIndirectCommandsLayoutNV( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoNV const &                createInfo,\n                                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      //=== VK_EXT_private_data ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PrivateDataSlot>::Type\n        createPrivateDataSlotEXT( VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo const &                         createInfo,\n                                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      void destroyPrivateDataSlotEXT( VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator\n                                        VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n      void setPrivateDataEXT( VULKAN_HPP_NAMESPACE::ObjectType      objectType,\n                              uint64_t                              objectHandle,\n                              VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,\n                              uint64_t                              data ) const;\n\n      VULKAN_HPP_NODISCARD uint64_t getPrivateDataEXT( VULKAN_HPP_NAMESPACE::ObjectType      objectType,\n                                                       uint64_t                              objectHandle,\n                                                       VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_video_encode_queue ===\n\n      VULKAN_HPP_NODISCARD std::pair<VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR, std::vector<uint8_t>>\n        getEncodedVideoSessionParametersKHR( const VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersGetInfoKHR & videoSessionParametersInfo ) const;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD std::pair<VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>, std::vector<uint8_t>>\n        getEncodedVideoSessionParametersKHR( const VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersGetInfoKHR & videoSessionParametersInfo ) const;\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n      //=== VK_NV_cuda_kernel_launch ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CudaModuleNV>::Type\n        createCudaModuleNV( VULKAN_HPP_NAMESPACE::CudaModuleCreateInfoNV const &                            createInfo,\n                            VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CudaFunctionNV>::Type\n        createCudaFunctionNV( VULKAN_HPP_NAMESPACE::CudaFunctionCreateInfoNV const &                          createInfo,\n                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n      //=== VK_EXT_metal_objects ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ExportMetalObjectsInfoEXT exportMetalObjectsEXT() const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> exportMetalObjectsEXT() const VULKAN_HPP_NOEXCEPT;\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n      //=== VK_EXT_descriptor_buffer ===\n\n      void getDescriptorEXT( const VULKAN_HPP_NAMESPACE::DescriptorGetInfoEXT & descriptorInfo, size_t dataSize, void * pDescriptor ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename DescriptorType>\n      VULKAN_HPP_NODISCARD DescriptorType getDescriptorEXT( const VULKAN_HPP_NAMESPACE::DescriptorGetInfoEXT & descriptorInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename DataType>\n      VULKAN_HPP_NODISCARD DataType getBufferOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::BufferCaptureDescriptorDataInfoEXT & info ) const;\n\n      template <typename DataType>\n      VULKAN_HPP_NODISCARD DataType getImageOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::ImageCaptureDescriptorDataInfoEXT & info ) const;\n\n      template <typename DataType>\n      VULKAN_HPP_NODISCARD DataType\n        getImageViewOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::ImageViewCaptureDescriptorDataInfoEXT & info ) const;\n\n      template <typename DataType>\n      VULKAN_HPP_NODISCARD DataType getSamplerOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::SamplerCaptureDescriptorDataInfoEXT & info ) const;\n\n      template <typename DataType>\n      VULKAN_HPP_NODISCARD DataType\n        getAccelerationStructureOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::AccelerationStructureCaptureDescriptorDataInfoEXT & info ) const;\n\n      //=== VK_EXT_device_fault ===\n      template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n      VULKAN_HPP_NODISCARD Result getFaultInfoEXT( VULKAN_HPP_NAMESPACE::DeviceFaultCountsEXT * pFaultCounts,\n                                                   VULKAN_HPP_NAMESPACE::DeviceFaultInfoEXT *   pFaultInfo,\n                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n      //=== VK_FUCHSIA_external_memory ===\n\n      VULKAN_HPP_NODISCARD zx_handle_t getMemoryZirconHandleFUCHSIA( const VULKAN_HPP_NAMESPACE::MemoryGetZirconHandleInfoFUCHSIA & getZirconHandleInfo ) const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryZirconHandlePropertiesFUCHSIA\n        getMemoryZirconHandlePropertiesFUCHSIA( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType, zx_handle_t zirconHandle ) const;\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n      //=== VK_FUCHSIA_external_semaphore ===\n\n      void importSemaphoreZirconHandleFUCHSIA( const VULKAN_HPP_NAMESPACE::ImportSemaphoreZirconHandleInfoFUCHSIA & importSemaphoreZirconHandleInfo ) const;\n\n      VULKAN_HPP_NODISCARD zx_handle_t\n        getSemaphoreZirconHandleFUCHSIA( const VULKAN_HPP_NAMESPACE::SemaphoreGetZirconHandleInfoFUCHSIA & getZirconHandleInfo ) const;\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n      //=== VK_FUCHSIA_buffer_collection ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::BufferCollectionFUCHSIA>::Type\n        createBufferCollectionFUCHSIA( VULKAN_HPP_NAMESPACE::BufferCollectionCreateInfoFUCHSIA const &                 createInfo,\n                                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n      //=== VK_NV_external_memory_rdma ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::RemoteAddressNV\n                           getMemoryRemoteAddressNV( const VULKAN_HPP_NAMESPACE::MemoryGetRemoteAddressInfoNV & memoryGetRemoteAddressInfo ) const;\n\n      //=== VK_EXT_pipeline_properties ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::BaseOutStructure getPipelinePropertiesEXT( const VULKAN_HPP_NAMESPACE::PipelineInfoEXT & pipelineInfo ) const;\n\n      //=== VK_EXT_opacity_micromap ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::MicromapEXT>::Type\n        createMicromapEXT( VULKAN_HPP_NAMESPACE::MicromapCreateInfoEXT const &                             createInfo,\n                           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result\n                           buildMicromapsEXT( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                                                 deferredOperation,\n                                              VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MicromapBuildInfoEXT> const & infos ) const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result copyMicromapEXT( VULKAN_HPP_NAMESPACE::DeferredOperationKHR        deferredOperation,\n                                                                         const VULKAN_HPP_NAMESPACE::CopyMicromapInfoEXT & info ) const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result copyMicromapToMemoryEXT( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                deferredOperation,\n                                                                                 const VULKAN_HPP_NAMESPACE::CopyMicromapToMemoryInfoEXT & info ) const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result copyMemoryToMicromapEXT( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                deferredOperation,\n                                                                                 const VULKAN_HPP_NAMESPACE::CopyMemoryToMicromapInfoEXT & info ) const;\n\n      template <typename DataType>\n      VULKAN_HPP_NODISCARD std::vector<DataType>\n                           writeMicromapsPropertiesEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MicromapEXT> const & micromaps,\n                                                        VULKAN_HPP_NAMESPACE::QueryType                                                   queryType,\n                                                        size_t                                                                            dataSize,\n                                                        size_t                                                                            stride ) const;\n\n      template <typename DataType>\n      VULKAN_HPP_NODISCARD DataType writeMicromapsPropertyEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MicromapEXT> const & micromaps,\n                                                               VULKAN_HPP_NAMESPACE::QueryType                                                   queryType,\n                                                               size_t                                                                            stride ) const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::AccelerationStructureCompatibilityKHR\n                           getMicromapCompatibilityEXT( const VULKAN_HPP_NAMESPACE::MicromapVersionInfoEXT & versionInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MicromapBuildSizesInfoEXT\n                           getMicromapBuildSizesEXT( VULKAN_HPP_NAMESPACE::AccelerationStructureBuildTypeKHR buildType,\n                                                     const VULKAN_HPP_NAMESPACE::MicromapBuildInfoEXT &      buildInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_maintenance4 ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2\n                           getBufferMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements & info ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                           getBufferMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements & info ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2\n                           getImageMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                           getImageMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>\n                           getImageSparseMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info ) const;\n\n      //=== VK_VALVE_descriptor_set_host_mapping ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DescriptorSetLayoutHostMappingInfoVALVE getDescriptorSetLayoutHostMappingInfoVALVE(\n        const VULKAN_HPP_NAMESPACE::DescriptorSetBindingReferenceVALVE & bindingReference ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_NV_device_generated_commands_compute ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2\n        getPipelineIndirectMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo & createInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n        getPipelineIndirectMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo & createInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceAddress\n                           getPipelineIndirectAddressNV( const VULKAN_HPP_NAMESPACE::PipelineIndirectDeviceAddressInfoNV & info ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_shader_module_identifier ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ShaderModuleIdentifierEXT\n                           getShaderModuleCreateInfoIdentifierEXT( const VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo & createInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_NV_optical_flow ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::OpticalFlowSessionNV>::Type\n        createOpticalFlowSessionNV( VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreateInfoNV const &                    createInfo,\n                                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      //=== VK_KHR_maintenance5 ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Extent2D\n                           getRenderingAreaGranularityKHR( const VULKAN_HPP_NAMESPACE::RenderingAreaInfo & renderingAreaInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::SubresourceLayout2\n                           getImageSubresourceLayoutKHR( const VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo & info ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                           getImageSubresourceLayoutKHR( const VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo & info ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_AMD_anti_lag ===\n\n      void antiLagUpdateAMD( const VULKAN_HPP_NAMESPACE::AntiLagDataAMD & data ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_shader_object ===\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ShaderEXT>>::Type\n        createShadersEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT> const & createInfos,\n                          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>     allocator = nullptr ) const;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ShaderEXT>::Type\n        createShaderEXT( VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT const &                               createInfo,\n                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      //=== VK_KHR_pipeline_binary ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n        std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineBinaryKHR>>::Type\n        createPipelineBinariesKHR( VULKAN_HPP_NAMESPACE::PipelineBinaryCreateInfoKHR const &                       createInfo,\n                                   VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR getPipelineKeyKHR(\n        Optional<const VULKAN_HPP_NAMESPACE::PipelineCreateInfoKHR> pipelineCreateInfo VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT ) const;\n\n      VULKAN_HPP_NODISCARD std::pair<VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR, std::vector<uint8_t>>\n                           getPipelineBinaryDataKHR( const VULKAN_HPP_NAMESPACE::PipelineBinaryDataInfoKHR & info ) const;\n\n      void releaseCapturedPipelineDataKHR( const VULKAN_HPP_NAMESPACE::ReleaseCapturedPipelineDataInfoKHR & info,\n                                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator\n                                             VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_QCOM_tile_properties ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::TilePropertiesQCOM\n                           getDynamicRenderingTilePropertiesQCOM( const VULKAN_HPP_NAMESPACE::RenderingInfo & renderingInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_NV_cooperative_vector ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result\n                           convertCooperativeVectorMatrixNV( const VULKAN_HPP_NAMESPACE::ConvertCooperativeVectorMatrixInfoNV & info ) const;\n\n#  if defined( VK_USE_PLATFORM_SCREEN_QNX )\n      //=== VK_QNX_external_memory_screen_buffer ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ScreenBufferPropertiesQNX getScreenBufferPropertiesQNX( const struct _screen_buffer & buffer ) const;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> getScreenBufferPropertiesQNX( const struct _screen_buffer & buffer ) const;\n#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n      //=== VK_KHR_calibrated_timestamps ===\n\n      VULKAN_HPP_NODISCARD std::pair<std::vector<uint64_t>, uint64_t>\n        getCalibratedTimestampsKHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR> const & timestampInfos ) const;\n\n      VULKAN_HPP_NODISCARD std::pair<uint64_t, uint64_t>\n                           getCalibratedTimestampKHR( const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR & timestampInfo ) const;\n\n      //=== VK_NV_cluster_acceleration_structure ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR\n        getClusterAccelerationStructureBuildSizesNV( const VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureInputInfoNV & info ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_NV_partitioned_acceleration_structure ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR getPartitionedAccelerationStructuresBuildSizesNV(\n        const VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureInstancesInputNV & info ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_device_generated_commands ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2\n        getGeneratedCommandsMemoryRequirementsEXT( const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoEXT & info ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n        getGeneratedCommandsMemoryRequirementsEXT( const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoEXT & info ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::IndirectCommandsLayoutEXT>::Type\n        createIndirectCommandsLayoutEXT( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoEXT const &               createInfo,\n                                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::IndirectExecutionSetEXT>::Type\n        createIndirectExecutionSetEXT( VULKAN_HPP_NAMESPACE::IndirectExecutionSetCreateInfoEXT const &                 createInfo,\n                                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const\n        VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n      //=== VK_EXT_external_memory_metal ===\n\n      VULKAN_HPP_NODISCARD void * getMemoryMetalHandleEXT( const VULKAN_HPP_NAMESPACE::MemoryGetMetalHandleInfoEXT & getMetalHandleInfo ) const;\n\n      template <typename HandleType>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryMetalHandlePropertiesEXT\n        getMemoryMetalHandlePropertiesEXT( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType, HandleType const & handle ) const;\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                               m_device    = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                          m_allocator = {};\n      std::unique_ptr<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher> m_dispatcher;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class AccelerationStructureKHR\n    {\n    public:\n      using CType   = VkAccelerationStructureKHR;\n      using CppType = VULKAN_HPP_NAMESPACE::AccelerationStructureKHR;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eAccelerationStructureKHR;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eAccelerationStructureKHR;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      AccelerationStructureKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                                VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoKHR const &                createInfo,\n                                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createAccelerationStructureKHR( createInfo, allocator );\n      }\n#  endif\n\n      AccelerationStructureKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                                VkAccelerationStructureKHR                                                      accelerationStructure,\n                                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_accelerationStructure( accelerationStructure )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      AccelerationStructureKHR( std::nullptr_t ) {}\n\n      ~AccelerationStructureKHR()\n      {\n        clear();\n      }\n\n      AccelerationStructureKHR()                                   = delete;\n      AccelerationStructureKHR( AccelerationStructureKHR const & ) = delete;\n\n      AccelerationStructureKHR( AccelerationStructureKHR && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_accelerationStructure( VULKAN_HPP_NAMESPACE::exchange( rhs.m_accelerationStructure, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      AccelerationStructureKHR & operator=( AccelerationStructureKHR const & ) = delete;\n\n      AccelerationStructureKHR & operator=( AccelerationStructureKHR && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_accelerationStructure, rhs.m_accelerationStructure );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::AccelerationStructureKHR const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_accelerationStructure;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::AccelerationStructureKHR() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_accelerationStructure;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_accelerationStructure )\n        {\n          getDispatcher()->vkDestroyAccelerationStructureKHR( static_cast<VkDevice>( m_device ),\n                                                              static_cast<VkAccelerationStructureKHR>( m_accelerationStructure ),\n                                                              reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device                = nullptr;\n        m_accelerationStructure = nullptr;\n        m_allocator             = nullptr;\n        m_dispatcher            = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::AccelerationStructureKHR release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_accelerationStructure, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::AccelerationStructureKHR & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_accelerationStructure, rhs.m_accelerationStructure );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device                = {};\n      VULKAN_HPP_NAMESPACE::AccelerationStructureKHR                                    m_accelerationStructure = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator             = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher            = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::AccelerationStructureKHR>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class AccelerationStructureNV\n    {\n    public:\n      using CType   = VkAccelerationStructureNV;\n      using CppType = VULKAN_HPP_NAMESPACE::AccelerationStructureNV;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eAccelerationStructureNV;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eAccelerationStructureNV;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      AccelerationStructureNV( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                               VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoNV const &                 createInfo,\n                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createAccelerationStructureNV( createInfo, allocator );\n      }\n#  endif\n\n      AccelerationStructureNV( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                               VkAccelerationStructureNV                                                       accelerationStructure,\n                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_accelerationStructure( accelerationStructure )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      AccelerationStructureNV( std::nullptr_t ) {}\n\n      ~AccelerationStructureNV()\n      {\n        clear();\n      }\n\n      AccelerationStructureNV()                                  = delete;\n      AccelerationStructureNV( AccelerationStructureNV const & ) = delete;\n\n      AccelerationStructureNV( AccelerationStructureNV && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_accelerationStructure( VULKAN_HPP_NAMESPACE::exchange( rhs.m_accelerationStructure, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      AccelerationStructureNV & operator=( AccelerationStructureNV const & ) = delete;\n\n      AccelerationStructureNV & operator=( AccelerationStructureNV && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_accelerationStructure, rhs.m_accelerationStructure );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::AccelerationStructureNV const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_accelerationStructure;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::AccelerationStructureNV() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_accelerationStructure;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_accelerationStructure )\n        {\n          getDispatcher()->vkDestroyAccelerationStructureNV( static_cast<VkDevice>( m_device ),\n                                                             static_cast<VkAccelerationStructureNV>( m_accelerationStructure ),\n                                                             reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device                = nullptr;\n        m_accelerationStructure = nullptr;\n        m_allocator             = nullptr;\n        m_dispatcher            = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::AccelerationStructureNV release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_accelerationStructure, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::AccelerationStructureNV & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_accelerationStructure, rhs.m_accelerationStructure );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_NV_ray_tracing ===\n\n      template <typename DataType>\n      VULKAN_HPP_NODISCARD std::vector<DataType> getHandle( size_t dataSize ) const;\n\n      template <typename DataType>\n      VULKAN_HPP_NODISCARD DataType getHandle() const;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device                = {};\n      VULKAN_HPP_NAMESPACE::AccelerationStructureNV                                     m_accelerationStructure = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator             = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher            = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::AccelerationStructureNV>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class Buffer\n    {\n    public:\n      using CType   = VkBuffer;\n      using CppType = VULKAN_HPP_NAMESPACE::Buffer;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eBuffer;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eBuffer;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      Buffer( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n              VULKAN_HPP_NAMESPACE::BufferCreateInfo const &                                  createInfo,\n              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createBuffer( createInfo, allocator );\n      }\n#  endif\n\n      Buffer( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n              VkBuffer                                                                        buffer,\n              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_buffer( buffer )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      Buffer( std::nullptr_t ) {}\n\n      ~Buffer()\n      {\n        clear();\n      }\n\n      Buffer()                 = delete;\n      Buffer( Buffer const & ) = delete;\n\n      Buffer( Buffer && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_buffer( VULKAN_HPP_NAMESPACE::exchange( rhs.m_buffer, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      Buffer & operator=( Buffer const & ) = delete;\n\n      Buffer & operator=( Buffer && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_buffer, rhs.m_buffer );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::Buffer const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_buffer;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::Buffer() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_buffer;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_buffer )\n        {\n          getDispatcher()->vkDestroyBuffer(\n            static_cast<VkDevice>( m_device ), static_cast<VkBuffer>( m_buffer ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device     = nullptr;\n        m_buffer     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::Buffer release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_buffer, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Buffer & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_buffer, rhs.m_buffer );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_VERSION_1_0 ===\n\n      void bindMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory, VULKAN_HPP_NAMESPACE::DeviceSize memoryOffset ) const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements getMemoryRequirements() const VULKAN_HPP_NOEXCEPT;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device     = {};\n      VULKAN_HPP_NAMESPACE::Buffer                                                      m_buffer     = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Buffer>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n    class BufferCollectionFUCHSIA\n    {\n    public:\n      using CType   = VkBufferCollectionFUCHSIA;\n      using CppType = VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eBufferCollectionFUCHSIA;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eBufferCollectionFUCHSIA;\n\n    public:\n#    if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      BufferCollectionFUCHSIA( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                               VULKAN_HPP_NAMESPACE::BufferCollectionCreateInfoFUCHSIA const &                 createInfo,\n                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createBufferCollectionFUCHSIA( createInfo, allocator );\n      }\n#    endif\n\n      BufferCollectionFUCHSIA( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                               VkBufferCollectionFUCHSIA                                                       collection,\n                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_collection( collection )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      BufferCollectionFUCHSIA( std::nullptr_t ) {}\n\n      ~BufferCollectionFUCHSIA()\n      {\n        clear();\n      }\n\n      BufferCollectionFUCHSIA()                                  = delete;\n      BufferCollectionFUCHSIA( BufferCollectionFUCHSIA const & ) = delete;\n\n      BufferCollectionFUCHSIA( BufferCollectionFUCHSIA && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_collection( VULKAN_HPP_NAMESPACE::exchange( rhs.m_collection, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      BufferCollectionFUCHSIA & operator=( BufferCollectionFUCHSIA const & ) = delete;\n\n      BufferCollectionFUCHSIA & operator=( BufferCollectionFUCHSIA && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_collection, rhs.m_collection );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_collection;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_collection;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_collection )\n        {\n          getDispatcher()->vkDestroyBufferCollectionFUCHSIA( static_cast<VkDevice>( m_device ),\n                                                             static_cast<VkBufferCollectionFUCHSIA>( m_collection ),\n                                                             reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device     = nullptr;\n        m_collection = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_collection, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::BufferCollectionFUCHSIA & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_collection, rhs.m_collection );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_FUCHSIA_buffer_collection ===\n\n      void setImageConstraints( const VULKAN_HPP_NAMESPACE::ImageConstraintsInfoFUCHSIA & imageConstraintsInfo ) const;\n\n      void setBufferConstraints( const VULKAN_HPP_NAMESPACE::BufferConstraintsInfoFUCHSIA & bufferConstraintsInfo ) const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::BufferCollectionPropertiesFUCHSIA getProperties() const;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device     = {};\n      VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA                                     m_collection = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::BufferCollectionFUCHSIA>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n    class BufferView\n    {\n    public:\n      using CType   = VkBufferView;\n      using CppType = VULKAN_HPP_NAMESPACE::BufferView;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eBufferView;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eBufferView;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      BufferView( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                  VULKAN_HPP_NAMESPACE::BufferViewCreateInfo const &                              createInfo,\n                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createBufferView( createInfo, allocator );\n      }\n#  endif\n\n      BufferView( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                  VkBufferView                                                                    bufferView,\n                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_bufferView( bufferView )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      BufferView( std::nullptr_t ) {}\n\n      ~BufferView()\n      {\n        clear();\n      }\n\n      BufferView()                     = delete;\n      BufferView( BufferView const & ) = delete;\n\n      BufferView( BufferView && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_bufferView( VULKAN_HPP_NAMESPACE::exchange( rhs.m_bufferView, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      BufferView & operator=( BufferView const & ) = delete;\n\n      BufferView & operator=( BufferView && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_bufferView, rhs.m_bufferView );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::BufferView const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_bufferView;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::BufferView() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_bufferView;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_bufferView )\n        {\n          getDispatcher()->vkDestroyBufferView(\n            static_cast<VkDevice>( m_device ), static_cast<VkBufferView>( m_bufferView ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device     = nullptr;\n        m_bufferView = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::BufferView release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_bufferView, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::BufferView & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_bufferView, rhs.m_bufferView );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device     = {};\n      VULKAN_HPP_NAMESPACE::BufferView                                                  m_bufferView = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::BufferView>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class CommandPool\n    {\n    public:\n      using CType   = VkCommandPool;\n      using CppType = VULKAN_HPP_NAMESPACE::CommandPool;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eCommandPool;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCommandPool;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      CommandPool( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                   VULKAN_HPP_NAMESPACE::CommandPoolCreateInfo const &                             createInfo,\n                   VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createCommandPool( createInfo, allocator );\n      }\n#  endif\n\n      CommandPool( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                   VkCommandPool                                                                   commandPool,\n                   VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_commandPool( commandPool )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      CommandPool( std::nullptr_t ) {}\n\n      ~CommandPool()\n      {\n        clear();\n      }\n\n      CommandPool()                      = delete;\n      CommandPool( CommandPool const & ) = delete;\n\n      CommandPool( CommandPool && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_commandPool( VULKAN_HPP_NAMESPACE::exchange( rhs.m_commandPool, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      CommandPool & operator=( CommandPool const & ) = delete;\n\n      CommandPool & operator=( CommandPool && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_commandPool, rhs.m_commandPool );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::CommandPool const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_commandPool;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::CommandPool() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_commandPool;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_commandPool )\n        {\n          getDispatcher()->vkDestroyCommandPool(\n            static_cast<VkDevice>( m_device ), static_cast<VkCommandPool>( m_commandPool ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device      = nullptr;\n        m_commandPool = nullptr;\n        m_allocator   = nullptr;\n        m_dispatcher  = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::CommandPool release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_commandPool, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CommandPool & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_commandPool, rhs.m_commandPool );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_VERSION_1_0 ===\n\n      void reset( VULKAN_HPP_NAMESPACE::CommandPoolResetFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const;\n\n      //=== VK_VERSION_1_1 ===\n\n      void trim( VULKAN_HPP_NAMESPACE::CommandPoolTrimFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_maintenance1 ===\n\n      void trimKHR( VULKAN_HPP_NAMESPACE::CommandPoolTrimFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device      = {};\n      VULKAN_HPP_NAMESPACE::CommandPool                                                 m_commandPool = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator   = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher  = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CommandPool>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class CommandBuffer\n    {\n    public:\n      using CType   = VkCommandBuffer;\n      using CppType = VULKAN_HPP_NAMESPACE::CommandBuffer;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eCommandBuffer;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCommandBuffer;\n\n    public:\n      CommandBuffer( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const & device, VkCommandBuffer commandBuffer, VkCommandPool commandPool )\n        : m_device( device ), m_commandPool( commandPool ), m_commandBuffer( commandBuffer ), m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      CommandBuffer( std::nullptr_t ) {}\n\n      ~CommandBuffer()\n      {\n        clear();\n      }\n\n      CommandBuffer()                        = delete;\n      CommandBuffer( CommandBuffer const & ) = delete;\n\n      CommandBuffer( CommandBuffer && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_commandPool( VULKAN_HPP_NAMESPACE::exchange( rhs.m_commandPool, {} ) )\n        , m_commandBuffer( VULKAN_HPP_NAMESPACE::exchange( rhs.m_commandBuffer, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      CommandBuffer & operator=( CommandBuffer const & ) = delete;\n\n      CommandBuffer & operator=( CommandBuffer && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_commandPool, rhs.m_commandPool );\n          std::swap( m_commandBuffer, rhs.m_commandBuffer );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::CommandBuffer const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_commandBuffer;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::CommandBuffer() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_commandBuffer;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_commandBuffer )\n        {\n          getDispatcher()->vkFreeCommandBuffers(\n            static_cast<VkDevice>( m_device ), static_cast<VkCommandPool>( m_commandPool ), 1, reinterpret_cast<VkCommandBuffer const *>( &m_commandBuffer ) );\n        }\n        m_device        = nullptr;\n        m_commandPool   = nullptr;\n        m_commandBuffer = nullptr;\n        m_dispatcher    = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::CommandBuffer release()\n      {\n        m_device      = nullptr;\n        m_commandPool = nullptr;\n        m_dispatcher  = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_commandBuffer, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CommandBuffer & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_commandPool, rhs.m_commandPool );\n        std::swap( m_commandBuffer, rhs.m_commandBuffer );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_VERSION_1_0 ===\n\n      void begin( const VULKAN_HPP_NAMESPACE::CommandBufferBeginInfo & beginInfo ) const;\n\n      void end() const;\n\n      void reset( VULKAN_HPP_NAMESPACE::CommandBufferResetFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const;\n\n      void bindPipeline( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint, VULKAN_HPP_NAMESPACE::Pipeline pipeline ) const VULKAN_HPP_NOEXCEPT;\n\n      void setViewport( uint32_t                                                                       firstViewport,\n                        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Viewport> const & viewports ) const VULKAN_HPP_NOEXCEPT;\n\n      void setScissor( uint32_t firstScissor, VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & scissors ) const VULKAN_HPP_NOEXCEPT;\n\n      void setLineWidth( float lineWidth ) const VULKAN_HPP_NOEXCEPT;\n\n      void setDepthBias( float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor ) const VULKAN_HPP_NOEXCEPT;\n\n      void setBlendConstants( const float blendConstants[4] ) const VULKAN_HPP_NOEXCEPT;\n\n      void setDepthBounds( float minDepthBounds, float maxDepthBounds ) const VULKAN_HPP_NOEXCEPT;\n\n      void setStencilCompareMask( VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask, uint32_t compareMask ) const VULKAN_HPP_NOEXCEPT;\n\n      void setStencilWriteMask( VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask, uint32_t writeMask ) const VULKAN_HPP_NOEXCEPT;\n\n      void setStencilReference( VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask, uint32_t reference ) const VULKAN_HPP_NOEXCEPT;\n\n      void bindDescriptorSets( VULKAN_HPP_NAMESPACE::PipelineBindPoint                                             pipelineBindPoint,\n                               VULKAN_HPP_NAMESPACE::PipelineLayout                                                layout,\n                               uint32_t                                                                            firstSet,\n                               VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DescriptorSet> const & descriptorSets,\n                               VULKAN_HPP_NAMESPACE::ArrayProxy<const uint32_t> const &                            dynamicOffsets ) const VULKAN_HPP_NOEXCEPT;\n\n      void bindIndexBuffer( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                            VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                            VULKAN_HPP_NAMESPACE::IndexType  indexType ) const VULKAN_HPP_NOEXCEPT;\n\n      void bindVertexBuffers( uint32_t                                                                         firstBinding,\n                              VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &     buffers,\n                              VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & offsets ) const;\n\n      void draw( uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance ) const VULKAN_HPP_NOEXCEPT;\n\n      void\n        drawIndexed( uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance ) const VULKAN_HPP_NOEXCEPT;\n\n      void drawIndirect( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                         VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                         uint32_t                         drawCount,\n                         uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT;\n\n      void drawIndexedIndirect( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                uint32_t                         drawCount,\n                                uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT;\n\n      void dispatch( uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ ) const VULKAN_HPP_NOEXCEPT;\n\n      void dispatchIndirect( VULKAN_HPP_NAMESPACE::Buffer buffer, VULKAN_HPP_NAMESPACE::DeviceSize offset ) const VULKAN_HPP_NOEXCEPT;\n\n      void copyBuffer( VULKAN_HPP_NAMESPACE::Buffer                                                     srcBuffer,\n                       VULKAN_HPP_NAMESPACE::Buffer                                                     dstBuffer,\n                       VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferCopy> const & regions ) const VULKAN_HPP_NOEXCEPT;\n\n      void copyImage( VULKAN_HPP_NAMESPACE::Image                                                     srcImage,\n                      VULKAN_HPP_NAMESPACE::ImageLayout                                               srcImageLayout,\n                      VULKAN_HPP_NAMESPACE::Image                                                     dstImage,\n                      VULKAN_HPP_NAMESPACE::ImageLayout                                               dstImageLayout,\n                      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageCopy> const & regions ) const VULKAN_HPP_NOEXCEPT;\n\n      void blitImage( VULKAN_HPP_NAMESPACE::Image                                                     srcImage,\n                      VULKAN_HPP_NAMESPACE::ImageLayout                                               srcImageLayout,\n                      VULKAN_HPP_NAMESPACE::Image                                                     dstImage,\n                      VULKAN_HPP_NAMESPACE::ImageLayout                                               dstImageLayout,\n                      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageBlit> const & regions,\n                      VULKAN_HPP_NAMESPACE::Filter                                                    filter ) const VULKAN_HPP_NOEXCEPT;\n\n      void copyBufferToImage( VULKAN_HPP_NAMESPACE::Buffer                                                          srcBuffer,\n                              VULKAN_HPP_NAMESPACE::Image                                                           dstImage,\n                              VULKAN_HPP_NAMESPACE::ImageLayout                                                     dstImageLayout,\n                              VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferImageCopy> const & regions ) const VULKAN_HPP_NOEXCEPT;\n\n      void copyImageToBuffer( VULKAN_HPP_NAMESPACE::Image                                                           srcImage,\n                              VULKAN_HPP_NAMESPACE::ImageLayout                                                     srcImageLayout,\n                              VULKAN_HPP_NAMESPACE::Buffer                                                          dstBuffer,\n                              VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferImageCopy> const & regions ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename DataType>\n      void updateBuffer( VULKAN_HPP_NAMESPACE::Buffer                             dstBuffer,\n                         VULKAN_HPP_NAMESPACE::DeviceSize                         dstOffset,\n                         VULKAN_HPP_NAMESPACE::ArrayProxy<const DataType> const & data ) const VULKAN_HPP_NOEXCEPT;\n\n      void fillBuffer( VULKAN_HPP_NAMESPACE::Buffer     dstBuffer,\n                       VULKAN_HPP_NAMESPACE::DeviceSize dstOffset,\n                       VULKAN_HPP_NAMESPACE::DeviceSize size,\n                       uint32_t                         data ) const VULKAN_HPP_NOEXCEPT;\n\n      void clearColorImage( VULKAN_HPP_NAMESPACE::Image                                                                 image,\n                            VULKAN_HPP_NAMESPACE::ImageLayout                                                           imageLayout,\n                            const VULKAN_HPP_NAMESPACE::ClearColorValue &                                               color,\n                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageSubresourceRange> const & ranges ) const VULKAN_HPP_NOEXCEPT;\n\n      void\n        clearDepthStencilImage( VULKAN_HPP_NAMESPACE::Image                                                                 image,\n                                VULKAN_HPP_NAMESPACE::ImageLayout                                                           imageLayout,\n                                const VULKAN_HPP_NAMESPACE::ClearDepthStencilValue &                                        depthStencil,\n                                VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageSubresourceRange> const & ranges ) const VULKAN_HPP_NOEXCEPT;\n\n      void clearAttachments( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ClearAttachment> const & attachments,\n                             VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ClearRect> const &       rects ) const VULKAN_HPP_NOEXCEPT;\n\n      void resolveImage( VULKAN_HPP_NAMESPACE::Image                                                        srcImage,\n                         VULKAN_HPP_NAMESPACE::ImageLayout                                                  srcImageLayout,\n                         VULKAN_HPP_NAMESPACE::Image                                                        dstImage,\n                         VULKAN_HPP_NAMESPACE::ImageLayout                                                  dstImageLayout,\n                         VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageResolve> const & regions ) const VULKAN_HPP_NOEXCEPT;\n\n      void setEvent( VULKAN_HPP_NAMESPACE::Event                        event,\n                     VULKAN_HPP_NAMESPACE::PipelineStageFlags stageMask VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n      void resetEvent( VULKAN_HPP_NAMESPACE::Event                        event,\n                       VULKAN_HPP_NAMESPACE::PipelineStageFlags stageMask VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n      void waitEvents( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Event> const &               events,\n                       VULKAN_HPP_NAMESPACE::PipelineStageFlags                                                  srcStageMask,\n                       VULKAN_HPP_NAMESPACE::PipelineStageFlags                                                  dstStageMask,\n                       VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MemoryBarrier> const &       memoryBarriers,\n                       VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferMemoryBarrier> const & bufferMemoryBarriers,\n                       VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier> const & imageMemoryBarriers ) const VULKAN_HPP_NOEXCEPT;\n\n      void pipelineBarrier( VULKAN_HPP_NAMESPACE::PipelineStageFlags                                                  srcStageMask,\n                            VULKAN_HPP_NAMESPACE::PipelineStageFlags                                                  dstStageMask,\n                            VULKAN_HPP_NAMESPACE::DependencyFlags                                                     dependencyFlags,\n                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MemoryBarrier> const &       memoryBarriers,\n                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferMemoryBarrier> const & bufferMemoryBarriers,\n                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier> const &  imageMemoryBarriers ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      void beginQuery( VULKAN_HPP_NAMESPACE::QueryPool               queryPool,\n                       uint32_t                                      query,\n                       VULKAN_HPP_NAMESPACE::QueryControlFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n      void endQuery( VULKAN_HPP_NAMESPACE::QueryPool queryPool, uint32_t query ) const VULKAN_HPP_NOEXCEPT;\n\n      void resetQueryPool( VULKAN_HPP_NAMESPACE::QueryPool queryPool, uint32_t firstQuery, uint32_t queryCount ) const VULKAN_HPP_NOEXCEPT;\n\n      void writeTimestamp( VULKAN_HPP_NAMESPACE::PipelineStageFlagBits pipelineStage,\n                           VULKAN_HPP_NAMESPACE::QueryPool             queryPool,\n                           uint32_t                                    query ) const VULKAN_HPP_NOEXCEPT;\n\n      void copyQueryPoolResults( VULKAN_HPP_NAMESPACE::QueryPool              queryPool,\n                                 uint32_t                                     firstQuery,\n                                 uint32_t                                     queryCount,\n                                 VULKAN_HPP_NAMESPACE::Buffer                 dstBuffer,\n                                 VULKAN_HPP_NAMESPACE::DeviceSize             dstOffset,\n                                 VULKAN_HPP_NAMESPACE::DeviceSize             stride,\n                                 VULKAN_HPP_NAMESPACE::QueryResultFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename ValuesType>\n      void pushConstants( VULKAN_HPP_NAMESPACE::PipelineLayout                       layout,\n                          VULKAN_HPP_NAMESPACE::ShaderStageFlags                     stageFlags,\n                          uint32_t                                                   offset,\n                          VULKAN_HPP_NAMESPACE::ArrayProxy<const ValuesType> const & values ) const VULKAN_HPP_NOEXCEPT;\n\n      void beginRenderPass( const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo & renderPassBegin,\n                            VULKAN_HPP_NAMESPACE::SubpassContents             contents ) const VULKAN_HPP_NOEXCEPT;\n\n      void nextSubpass( VULKAN_HPP_NAMESPACE::SubpassContents contents ) const VULKAN_HPP_NOEXCEPT;\n\n      void endRenderPass() const VULKAN_HPP_NOEXCEPT;\n\n      void executeCommands( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CommandBuffer> const & commandBuffers ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_VERSION_1_1 ===\n\n      void setDeviceMask( uint32_t deviceMask ) const VULKAN_HPP_NOEXCEPT;\n\n      void dispatchBase( uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_VERSION_1_2 ===\n\n      void drawIndirectCount( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                              VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                              VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                              VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                              uint32_t                         maxDrawCount,\n                              uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT;\n\n      void drawIndexedIndirectCount( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                     VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                     VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                     VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                     uint32_t                         maxDrawCount,\n                                     uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT;\n\n      void beginRenderPass2( const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo & renderPassBegin,\n                             const VULKAN_HPP_NAMESPACE::SubpassBeginInfo &    subpassBeginInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void nextSubpass2( const VULKAN_HPP_NAMESPACE::SubpassBeginInfo & subpassBeginInfo,\n                         const VULKAN_HPP_NAMESPACE::SubpassEndInfo &   subpassEndInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void endRenderPass2( const VULKAN_HPP_NAMESPACE::SubpassEndInfo & subpassEndInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_VERSION_1_3 ===\n\n      void setEvent2( VULKAN_HPP_NAMESPACE::Event event, const VULKAN_HPP_NAMESPACE::DependencyInfo & dependencyInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void resetEvent2( VULKAN_HPP_NAMESPACE::Event                         event,\n                        VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stageMask VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n      void waitEvents2( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Event> const &          events,\n                        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DependencyInfo> const & dependencyInfos ) const;\n\n      void pipelineBarrier2( const VULKAN_HPP_NAMESPACE::DependencyInfo & dependencyInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void\n        writeTimestamp2( VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stage, VULKAN_HPP_NAMESPACE::QueryPool queryPool, uint32_t query ) const VULKAN_HPP_NOEXCEPT;\n\n      void copyBuffer2( const VULKAN_HPP_NAMESPACE::CopyBufferInfo2 & copyBufferInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void copyImage2( const VULKAN_HPP_NAMESPACE::CopyImageInfo2 & copyImageInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void copyBufferToImage2( const VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2 & copyBufferToImageInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void copyImageToBuffer2( const VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2 & copyImageToBufferInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void blitImage2( const VULKAN_HPP_NAMESPACE::BlitImageInfo2 & blitImageInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void resolveImage2( const VULKAN_HPP_NAMESPACE::ResolveImageInfo2 & resolveImageInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void beginRendering( const VULKAN_HPP_NAMESPACE::RenderingInfo & renderingInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void endRendering() const VULKAN_HPP_NOEXCEPT;\n\n      void setCullMode( VULKAN_HPP_NAMESPACE::CullModeFlags cullMode VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n      void setFrontFace( VULKAN_HPP_NAMESPACE::FrontFace frontFace ) const VULKAN_HPP_NOEXCEPT;\n\n      void setPrimitiveTopology( VULKAN_HPP_NAMESPACE::PrimitiveTopology primitiveTopology ) const VULKAN_HPP_NOEXCEPT;\n\n      void setViewportWithCount( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Viewport> const & viewports ) const VULKAN_HPP_NOEXCEPT;\n\n      void setScissorWithCount( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & scissors ) const VULKAN_HPP_NOEXCEPT;\n\n      void bindVertexBuffers2(\n        uint32_t                                                                                 firstBinding,\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &             buffers,\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &         offsets,\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & sizes   VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & strides VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT ) const;\n\n      void setDepthTestEnable( VULKAN_HPP_NAMESPACE::Bool32 depthTestEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setDepthWriteEnable( VULKAN_HPP_NAMESPACE::Bool32 depthWriteEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setDepthCompareOp( VULKAN_HPP_NAMESPACE::CompareOp depthCompareOp ) const VULKAN_HPP_NOEXCEPT;\n\n      void setDepthBoundsTestEnable( VULKAN_HPP_NAMESPACE::Bool32 depthBoundsTestEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setStencilTestEnable( VULKAN_HPP_NAMESPACE::Bool32 stencilTestEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setStencilOp( VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask,\n                         VULKAN_HPP_NAMESPACE::StencilOp        failOp,\n                         VULKAN_HPP_NAMESPACE::StencilOp        passOp,\n                         VULKAN_HPP_NAMESPACE::StencilOp        depthFailOp,\n                         VULKAN_HPP_NAMESPACE::CompareOp        compareOp ) const VULKAN_HPP_NOEXCEPT;\n\n      void setRasterizerDiscardEnable( VULKAN_HPP_NAMESPACE::Bool32 rasterizerDiscardEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setDepthBiasEnable( VULKAN_HPP_NAMESPACE::Bool32 depthBiasEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setPrimitiveRestartEnable( VULKAN_HPP_NAMESPACE::Bool32 primitiveRestartEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_VERSION_1_4 ===\n\n      void setLineStipple( uint32_t lineStippleFactor, uint16_t lineStipplePattern ) const VULKAN_HPP_NOEXCEPT;\n\n      void bindIndexBuffer2( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                             VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                             VULKAN_HPP_NAMESPACE::DeviceSize size,\n                             VULKAN_HPP_NAMESPACE::IndexType  indexType ) const VULKAN_HPP_NOEXCEPT;\n\n      void pushDescriptorSet( VULKAN_HPP_NAMESPACE::PipelineBindPoint                                                  pipelineBindPoint,\n                              VULKAN_HPP_NAMESPACE::PipelineLayout                                                     layout,\n                              uint32_t                                                                                 set,\n                              VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteDescriptorSet> const & descriptorWrites ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      template <typename DataType>\n      void pushDescriptorSetWithTemplate( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,\n                                          VULKAN_HPP_NAMESPACE::PipelineLayout           layout,\n                                          uint32_t                                       set,\n                                          DataType const &                               data ) const VULKAN_HPP_NOEXCEPT;\n\n      void setRenderingAttachmentLocations( const VULKAN_HPP_NAMESPACE::RenderingAttachmentLocationInfo & locationInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void setRenderingInputAttachmentIndices( const VULKAN_HPP_NAMESPACE::RenderingInputAttachmentIndexInfo & inputAttachmentIndexInfo ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      void bindDescriptorSets2( const VULKAN_HPP_NAMESPACE::BindDescriptorSetsInfo & bindDescriptorSetsInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void pushConstants2( const VULKAN_HPP_NAMESPACE::PushConstantsInfo & pushConstantsInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void pushDescriptorSet2( const VULKAN_HPP_NAMESPACE::PushDescriptorSetInfo & pushDescriptorSetInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void pushDescriptorSetWithTemplate2( const VULKAN_HPP_NAMESPACE::PushDescriptorSetWithTemplateInfo & pushDescriptorSetWithTemplateInfo ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_debug_marker ===\n\n      void debugMarkerBeginEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT & markerInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void debugMarkerEndEXT() const VULKAN_HPP_NOEXCEPT;\n\n      void debugMarkerInsertEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT & markerInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_video_queue ===\n\n      void beginVideoCodingKHR( const VULKAN_HPP_NAMESPACE::VideoBeginCodingInfoKHR & beginInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void endVideoCodingKHR( const VULKAN_HPP_NAMESPACE::VideoEndCodingInfoKHR & endCodingInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void controlVideoCodingKHR( const VULKAN_HPP_NAMESPACE::VideoCodingControlInfoKHR & codingControlInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_video_decode_queue ===\n\n      void decodeVideoKHR( const VULKAN_HPP_NAMESPACE::VideoDecodeInfoKHR & decodeInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_transform_feedback ===\n\n      void bindTransformFeedbackBuffersEXT( uint32_t                                                                         firstBinding,\n                                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &     buffers,\n                                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & offsets,\n                                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & sizes\n                                              VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT ) const;\n\n      void beginTransformFeedbackEXT( uint32_t                                                                     firstCounterBuffer,\n                                      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const & counterBuffers,\n                                      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & counterBufferOffsets\n                                        VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT ) const;\n\n      void endTransformFeedbackEXT( uint32_t                                                                     firstCounterBuffer,\n                                    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const & counterBuffers,\n                                    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & counterBufferOffsets\n                                      VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT ) const;\n\n      void beginQueryIndexedEXT( VULKAN_HPP_NAMESPACE::QueryPool         queryPool,\n                                 uint32_t                                query,\n                                 VULKAN_HPP_NAMESPACE::QueryControlFlags flags,\n                                 uint32_t                                index ) const VULKAN_HPP_NOEXCEPT;\n\n      void endQueryIndexedEXT( VULKAN_HPP_NAMESPACE::QueryPool queryPool, uint32_t query, uint32_t index ) const VULKAN_HPP_NOEXCEPT;\n\n      void drawIndirectByteCountEXT( uint32_t                         instanceCount,\n                                     uint32_t                         firstInstance,\n                                     VULKAN_HPP_NAMESPACE::Buffer     counterBuffer,\n                                     VULKAN_HPP_NAMESPACE::DeviceSize counterBufferOffset,\n                                     uint32_t                         counterOffset,\n                                     uint32_t                         vertexStride ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_NVX_binary_import ===\n\n      void cuLaunchKernelNVX( const VULKAN_HPP_NAMESPACE::CuLaunchInfoNVX & launchInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_AMD_draw_indirect_count ===\n\n      void drawIndirectCountAMD( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                 VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                 VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                 VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                 uint32_t                         maxDrawCount,\n                                 uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT;\n\n      void drawIndexedIndirectCountAMD( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                        VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                        VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                        VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                        uint32_t                         maxDrawCount,\n                                        uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_dynamic_rendering ===\n\n      void beginRenderingKHR( const VULKAN_HPP_NAMESPACE::RenderingInfo & renderingInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void endRenderingKHR() const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_device_group ===\n\n      void setDeviceMaskKHR( uint32_t deviceMask ) const VULKAN_HPP_NOEXCEPT;\n\n      void dispatchBaseKHR( uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ )\n        const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_push_descriptor ===\n\n      void pushDescriptorSetKHR( VULKAN_HPP_NAMESPACE::PipelineBindPoint                                                  pipelineBindPoint,\n                                 VULKAN_HPP_NAMESPACE::PipelineLayout                                                     layout,\n                                 uint32_t                                                                                 set,\n                                 VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteDescriptorSet> const & descriptorWrites ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      template <typename DataType>\n      void pushDescriptorSetWithTemplateKHR( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,\n                                             VULKAN_HPP_NAMESPACE::PipelineLayout           layout,\n                                             uint32_t                                       set,\n                                             DataType const &                               data ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_conditional_rendering ===\n\n      void beginConditionalRenderingEXT( const VULKAN_HPP_NAMESPACE::ConditionalRenderingBeginInfoEXT & conditionalRenderingBegin ) const VULKAN_HPP_NOEXCEPT;\n\n      void endConditionalRenderingEXT() const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_NV_clip_space_w_scaling ===\n\n      void setViewportWScalingNV( uint32_t                                                                                 firstViewport,\n                                  VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ViewportWScalingNV> const & viewportWScalings ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_discard_rectangles ===\n\n      void setDiscardRectangleEXT( uint32_t                                                                     firstDiscardRectangle,\n                                   VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & discardRectangles ) const VULKAN_HPP_NOEXCEPT;\n\n      void setDiscardRectangleEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 discardRectangleEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setDiscardRectangleModeEXT( VULKAN_HPP_NAMESPACE::DiscardRectangleModeEXT discardRectangleMode ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_create_renderpass2 ===\n\n      void beginRenderPass2KHR( const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo & renderPassBegin,\n                                const VULKAN_HPP_NAMESPACE::SubpassBeginInfo &    subpassBeginInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void nextSubpass2KHR( const VULKAN_HPP_NAMESPACE::SubpassBeginInfo & subpassBeginInfo,\n                            const VULKAN_HPP_NAMESPACE::SubpassEndInfo &   subpassEndInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void endRenderPass2KHR( const VULKAN_HPP_NAMESPACE::SubpassEndInfo & subpassEndInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_debug_utils ===\n\n      void beginDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT & labelInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void endDebugUtilsLabelEXT() const VULKAN_HPP_NOEXCEPT;\n\n      void insertDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT & labelInfo ) const VULKAN_HPP_NOEXCEPT;\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n      //=== VK_AMDX_shader_enqueue ===\n\n      void initializeGraphScratchMemoryAMDX( VULKAN_HPP_NAMESPACE::Pipeline      executionGraph,\n                                             VULKAN_HPP_NAMESPACE::DeviceAddress scratch,\n                                             VULKAN_HPP_NAMESPACE::DeviceSize    scratchSize ) const VULKAN_HPP_NOEXCEPT;\n\n      void dispatchGraphAMDX( VULKAN_HPP_NAMESPACE::DeviceAddress                      scratch,\n                              VULKAN_HPP_NAMESPACE::DeviceSize                         scratchSize,\n                              const VULKAN_HPP_NAMESPACE::DispatchGraphCountInfoAMDX & countInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void dispatchGraphIndirectAMDX( VULKAN_HPP_NAMESPACE::DeviceAddress                      scratch,\n                                      VULKAN_HPP_NAMESPACE::DeviceSize                         scratchSize,\n                                      const VULKAN_HPP_NAMESPACE::DispatchGraphCountInfoAMDX & countInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void dispatchGraphIndirectCountAMDX( VULKAN_HPP_NAMESPACE::DeviceAddress scratch,\n                                           VULKAN_HPP_NAMESPACE::DeviceSize    scratchSize,\n                                           VULKAN_HPP_NAMESPACE::DeviceAddress countInfo ) const VULKAN_HPP_NOEXCEPT;\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n      //=== VK_EXT_sample_locations ===\n\n      void setSampleLocationsEXT( const VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT & sampleLocationsInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_acceleration_structure ===\n\n      void buildAccelerationStructuresKHR(\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR> const &      infos,\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR * const> const & pBuildRangeInfos ) const;\n\n      void buildAccelerationStructuresIndirectKHR(\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR> const & infos,\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceAddress> const &                             indirectDeviceAddresses,\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const uint32_t> const &                                                        indirectStrides,\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const uint32_t * const> const &                                                pMaxPrimitiveCounts ) const;\n\n      void copyAccelerationStructureKHR( const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR & info ) const VULKAN_HPP_NOEXCEPT;\n\n      void copyAccelerationStructureToMemoryKHR( const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureToMemoryInfoKHR & info ) const VULKAN_HPP_NOEXCEPT;\n\n      void copyMemoryToAccelerationStructureKHR( const VULKAN_HPP_NAMESPACE::CopyMemoryToAccelerationStructureInfoKHR & info ) const VULKAN_HPP_NOEXCEPT;\n\n      void writeAccelerationStructuresPropertiesKHR(\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR> const & accelerationStructures,\n        VULKAN_HPP_NAMESPACE::QueryType                                                                queryType,\n        VULKAN_HPP_NAMESPACE::QueryPool                                                                queryPool,\n        uint32_t                                                                                       firstQuery ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_ray_tracing_pipeline ===\n\n      void traceRaysKHR( const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & raygenShaderBindingTable,\n                         const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & missShaderBindingTable,\n                         const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & hitShaderBindingTable,\n                         const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & callableShaderBindingTable,\n                         uint32_t                                                    width,\n                         uint32_t                                                    height,\n                         uint32_t                                                    depth ) const VULKAN_HPP_NOEXCEPT;\n\n      void traceRaysIndirectKHR( const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & raygenShaderBindingTable,\n                                 const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & missShaderBindingTable,\n                                 const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & hitShaderBindingTable,\n                                 const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & callableShaderBindingTable,\n                                 VULKAN_HPP_NAMESPACE::DeviceAddress                         indirectDeviceAddress ) const VULKAN_HPP_NOEXCEPT;\n\n      void setRayTracingPipelineStackSizeKHR( uint32_t pipelineStackSize ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_NV_shading_rate_image ===\n\n      void bindShadingRateImageNV( VULKAN_HPP_NAMESPACE::ImageView imageView, VULKAN_HPP_NAMESPACE::ImageLayout imageLayout ) const VULKAN_HPP_NOEXCEPT;\n\n      void setViewportShadingRatePaletteNV(\n        uint32_t                                                                                   firstViewport,\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV> const & shadingRatePalettes ) const VULKAN_HPP_NOEXCEPT;\n\n      void setCoarseSampleOrderNV( VULKAN_HPP_NAMESPACE::CoarseSampleOrderTypeNV                                                   sampleOrderType,\n                                   VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV> const & customSampleOrders ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_NV_ray_tracing ===\n\n      void buildAccelerationStructureNV( const VULKAN_HPP_NAMESPACE::AccelerationStructureInfoNV & info,\n                                         VULKAN_HPP_NAMESPACE::Buffer                              instanceData,\n                                         VULKAN_HPP_NAMESPACE::DeviceSize                          instanceOffset,\n                                         VULKAN_HPP_NAMESPACE::Bool32                              update,\n                                         VULKAN_HPP_NAMESPACE::AccelerationStructureNV             dst,\n                                         VULKAN_HPP_NAMESPACE::AccelerationStructureNV             src,\n                                         VULKAN_HPP_NAMESPACE::Buffer                              scratch,\n                                         VULKAN_HPP_NAMESPACE::DeviceSize                          scratchOffset ) const VULKAN_HPP_NOEXCEPT;\n\n      void copyAccelerationStructureNV( VULKAN_HPP_NAMESPACE::AccelerationStructureNV          dst,\n                                        VULKAN_HPP_NAMESPACE::AccelerationStructureNV          src,\n                                        VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR mode ) const VULKAN_HPP_NOEXCEPT;\n\n      void traceRaysNV( VULKAN_HPP_NAMESPACE::Buffer     raygenShaderBindingTableBuffer,\n                        VULKAN_HPP_NAMESPACE::DeviceSize raygenShaderBindingOffset,\n                        VULKAN_HPP_NAMESPACE::Buffer     missShaderBindingTableBuffer,\n                        VULKAN_HPP_NAMESPACE::DeviceSize missShaderBindingOffset,\n                        VULKAN_HPP_NAMESPACE::DeviceSize missShaderBindingStride,\n                        VULKAN_HPP_NAMESPACE::Buffer     hitShaderBindingTableBuffer,\n                        VULKAN_HPP_NAMESPACE::DeviceSize hitShaderBindingOffset,\n                        VULKAN_HPP_NAMESPACE::DeviceSize hitShaderBindingStride,\n                        VULKAN_HPP_NAMESPACE::Buffer     callableShaderBindingTableBuffer,\n                        VULKAN_HPP_NAMESPACE::DeviceSize callableShaderBindingOffset,\n                        VULKAN_HPP_NAMESPACE::DeviceSize callableShaderBindingStride,\n                        uint32_t                         width,\n                        uint32_t                         height,\n                        uint32_t                         depth ) const VULKAN_HPP_NOEXCEPT;\n\n      void writeAccelerationStructuresPropertiesNV(\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureNV> const & accelerationStructures,\n        VULKAN_HPP_NAMESPACE::QueryType                                                               queryType,\n        VULKAN_HPP_NAMESPACE::QueryPool                                                               queryPool,\n        uint32_t                                                                                      firstQuery ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_draw_indirect_count ===\n\n      void drawIndirectCountKHR( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                 VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                 VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                 VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                 uint32_t                         maxDrawCount,\n                                 uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT;\n\n      void drawIndexedIndirectCountKHR( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                        VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                        VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                        VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                        uint32_t                         maxDrawCount,\n                                        uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_AMD_buffer_marker ===\n\n      void writeBufferMarkerAMD( VULKAN_HPP_NAMESPACE::PipelineStageFlagBits pipelineStage,\n                                 VULKAN_HPP_NAMESPACE::Buffer                dstBuffer,\n                                 VULKAN_HPP_NAMESPACE::DeviceSize            dstOffset,\n                                 uint32_t                                    marker ) const VULKAN_HPP_NOEXCEPT;\n\n      void writeBufferMarker2AMD( VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stage,\n                                  VULKAN_HPP_NAMESPACE::Buffer              dstBuffer,\n                                  VULKAN_HPP_NAMESPACE::DeviceSize          dstOffset,\n                                  uint32_t                                  marker ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_NV_mesh_shader ===\n\n      void drawMeshTasksNV( uint32_t taskCount, uint32_t firstTask ) const VULKAN_HPP_NOEXCEPT;\n\n      void drawMeshTasksIndirectNV( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                    VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                    uint32_t                         drawCount,\n                                    uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT;\n\n      void drawMeshTasksIndirectCountNV( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                         VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                         VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                         VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                         uint32_t                         maxDrawCount,\n                                         uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_NV_scissor_exclusive ===\n\n      void setExclusiveScissorEnableNV( uint32_t                                                                     firstExclusiveScissor,\n                                        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Bool32> const & exclusiveScissorEnables ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      void setExclusiveScissorNV( uint32_t                                                                     firstExclusiveScissor,\n                                  VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & exclusiveScissors ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_NV_device_diagnostic_checkpoints ===\n\n      template <typename CheckpointMarkerType>\n      void setCheckpointNV( CheckpointMarkerType const & checkpointMarker ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_INTEL_performance_query ===\n\n      void setPerformanceMarkerINTEL( const VULKAN_HPP_NAMESPACE::PerformanceMarkerInfoINTEL & markerInfo ) const;\n\n      void setPerformanceStreamMarkerINTEL( const VULKAN_HPP_NAMESPACE::PerformanceStreamMarkerInfoINTEL & markerInfo ) const;\n\n      void setPerformanceOverrideINTEL( const VULKAN_HPP_NAMESPACE::PerformanceOverrideInfoINTEL & overrideInfo ) const;\n\n      //=== VK_KHR_fragment_shading_rate ===\n\n      void setFragmentShadingRateKHR( const VULKAN_HPP_NAMESPACE::Extent2D &                       fragmentSize,\n                                      const VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR combinerOps[2] ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_dynamic_rendering_local_read ===\n\n      void setRenderingAttachmentLocationsKHR( const VULKAN_HPP_NAMESPACE::RenderingAttachmentLocationInfo & locationInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void setRenderingInputAttachmentIndicesKHR( const VULKAN_HPP_NAMESPACE::RenderingInputAttachmentIndexInfo & inputAttachmentIndexInfo ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_line_rasterization ===\n\n      void setLineStippleEXT( uint32_t lineStippleFactor, uint16_t lineStipplePattern ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_extended_dynamic_state ===\n\n      void setCullModeEXT( VULKAN_HPP_NAMESPACE::CullModeFlags cullMode VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n      void setFrontFaceEXT( VULKAN_HPP_NAMESPACE::FrontFace frontFace ) const VULKAN_HPP_NOEXCEPT;\n\n      void setPrimitiveTopologyEXT( VULKAN_HPP_NAMESPACE::PrimitiveTopology primitiveTopology ) const VULKAN_HPP_NOEXCEPT;\n\n      void setViewportWithCountEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Viewport> const & viewports ) const VULKAN_HPP_NOEXCEPT;\n\n      void setScissorWithCountEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & scissors ) const VULKAN_HPP_NOEXCEPT;\n\n      void bindVertexBuffers2EXT(\n        uint32_t                                                                                 firstBinding,\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &             buffers,\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &         offsets,\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & sizes   VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & strides VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT ) const;\n\n      void setDepthTestEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthTestEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setDepthWriteEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthWriteEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setDepthCompareOpEXT( VULKAN_HPP_NAMESPACE::CompareOp depthCompareOp ) const VULKAN_HPP_NOEXCEPT;\n\n      void setDepthBoundsTestEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthBoundsTestEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setStencilTestEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 stencilTestEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setStencilOpEXT( VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask,\n                            VULKAN_HPP_NAMESPACE::StencilOp        failOp,\n                            VULKAN_HPP_NAMESPACE::StencilOp        passOp,\n                            VULKAN_HPP_NAMESPACE::StencilOp        depthFailOp,\n                            VULKAN_HPP_NAMESPACE::CompareOp        compareOp ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_NV_device_generated_commands ===\n\n      void preprocessGeneratedCommandsNV( const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV & generatedCommandsInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void executeGeneratedCommandsNV( VULKAN_HPP_NAMESPACE::Bool32                          isPreprocessed,\n                                       const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV & generatedCommandsInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void bindPipelineShaderGroupNV( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint,\n                                      VULKAN_HPP_NAMESPACE::Pipeline          pipeline,\n                                      uint32_t                                groupIndex ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_depth_bias_control ===\n\n      void setDepthBias2EXT( const VULKAN_HPP_NAMESPACE::DepthBiasInfoEXT & depthBiasInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_video_encode_queue ===\n\n      void encodeVideoKHR( const VULKAN_HPP_NAMESPACE::VideoEncodeInfoKHR & encodeInfo ) const VULKAN_HPP_NOEXCEPT;\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n      //=== VK_NV_cuda_kernel_launch ===\n\n      void cudaLaunchKernelNV( const VULKAN_HPP_NAMESPACE::CudaLaunchInfoNV & launchInfo ) const VULKAN_HPP_NOEXCEPT;\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n      //=== VK_KHR_synchronization2 ===\n\n      void setEvent2KHR( VULKAN_HPP_NAMESPACE::Event event, const VULKAN_HPP_NAMESPACE::DependencyInfo & dependencyInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void resetEvent2KHR( VULKAN_HPP_NAMESPACE::Event                         event,\n                           VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stageMask VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n      void waitEvents2KHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Event> const &          events,\n                           VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DependencyInfo> const & dependencyInfos ) const;\n\n      void pipelineBarrier2KHR( const VULKAN_HPP_NAMESPACE::DependencyInfo & dependencyInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void writeTimestamp2KHR( VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stage,\n                               VULKAN_HPP_NAMESPACE::QueryPool           queryPool,\n                               uint32_t                                  query ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_descriptor_buffer ===\n\n      void bindDescriptorBuffersEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DescriptorBufferBindingInfoEXT> const & bindingInfos ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      void setDescriptorBufferOffsetsEXT( VULKAN_HPP_NAMESPACE::PipelineBindPoint                                          pipelineBindPoint,\n                                          VULKAN_HPP_NAMESPACE::PipelineLayout                                             layout,\n                                          uint32_t                                                                         firstSet,\n                                          VULKAN_HPP_NAMESPACE::ArrayProxy<const uint32_t> const &                         bufferIndices,\n                                          VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & offsets ) const;\n\n      void bindDescriptorBufferEmbeddedSamplersEXT( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint,\n                                                    VULKAN_HPP_NAMESPACE::PipelineLayout    layout,\n                                                    uint32_t                                set ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_NV_fragment_shading_rate_enums ===\n\n      void setFragmentShadingRateEnumNV( VULKAN_HPP_NAMESPACE::FragmentShadingRateNV                  shadingRate,\n                                         const VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR combinerOps[2] ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_mesh_shader ===\n\n      void drawMeshTasksEXT( uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ ) const VULKAN_HPP_NOEXCEPT;\n\n      void drawMeshTasksIndirectEXT( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                     VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                     uint32_t                         drawCount,\n                                     uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT;\n\n      void drawMeshTasksIndirectCountEXT( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                          VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                          VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                          VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                          uint32_t                         maxDrawCount,\n                                          uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_copy_commands2 ===\n\n      void copyBuffer2KHR( const VULKAN_HPP_NAMESPACE::CopyBufferInfo2 & copyBufferInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void copyImage2KHR( const VULKAN_HPP_NAMESPACE::CopyImageInfo2 & copyImageInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void copyBufferToImage2KHR( const VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2 & copyBufferToImageInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void copyImageToBuffer2KHR( const VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2 & copyImageToBufferInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void blitImage2KHR( const VULKAN_HPP_NAMESPACE::BlitImageInfo2 & blitImageInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void resolveImage2KHR( const VULKAN_HPP_NAMESPACE::ResolveImageInfo2 & resolveImageInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_vertex_input_dynamic_state ===\n\n      void setVertexInputEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::VertexInputBindingDescription2EXT> const & vertexBindingDescriptions,\n                              VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription2EXT> const &\n                                vertexAttributeDescriptions ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_HUAWEI_subpass_shading ===\n\n      void subpassShadingHUAWEI() const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_HUAWEI_invocation_mask ===\n\n      void bindInvocationMaskHUAWEI( VULKAN_HPP_NAMESPACE::ImageView imageView, VULKAN_HPP_NAMESPACE::ImageLayout imageLayout ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_extended_dynamic_state2 ===\n\n      void setPatchControlPointsEXT( uint32_t patchControlPoints ) const VULKAN_HPP_NOEXCEPT;\n\n      void setRasterizerDiscardEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 rasterizerDiscardEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setDepthBiasEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthBiasEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setLogicOpEXT( VULKAN_HPP_NAMESPACE::LogicOp logicOp ) const VULKAN_HPP_NOEXCEPT;\n\n      void setPrimitiveRestartEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 primitiveRestartEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_color_write_enable ===\n\n      void setColorWriteEnableEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Bool32> const & colorWriteEnables ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_ray_tracing_maintenance1 ===\n\n      void traceRaysIndirect2KHR( VULKAN_HPP_NAMESPACE::DeviceAddress indirectDeviceAddress ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_multi_draw ===\n\n      void drawMultiEXT( VULKAN_HPP_NAMESPACE::StridedArrayProxy<const VULKAN_HPP_NAMESPACE::MultiDrawInfoEXT> const & vertexInfo,\n                         uint32_t                                                                                      instanceCount,\n                         uint32_t firstInstance ) const VULKAN_HPP_NOEXCEPT;\n\n      void drawMultiIndexedEXT( VULKAN_HPP_NAMESPACE::StridedArrayProxy<const VULKAN_HPP_NAMESPACE::MultiDrawIndexedInfoEXT> const & indexInfo,\n                                uint32_t                                                                                             instanceCount,\n                                uint32_t                                                                                             firstInstance,\n                                Optional<const int32_t> vertexOffset VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_opacity_micromap ===\n\n      void buildMicromapsEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MicromapBuildInfoEXT> const & infos ) const VULKAN_HPP_NOEXCEPT;\n\n      void copyMicromapEXT( const VULKAN_HPP_NAMESPACE::CopyMicromapInfoEXT & info ) const VULKAN_HPP_NOEXCEPT;\n\n      void copyMicromapToMemoryEXT( const VULKAN_HPP_NAMESPACE::CopyMicromapToMemoryInfoEXT & info ) const VULKAN_HPP_NOEXCEPT;\n\n      void copyMemoryToMicromapEXT( const VULKAN_HPP_NAMESPACE::CopyMemoryToMicromapInfoEXT & info ) const VULKAN_HPP_NOEXCEPT;\n\n      void writeMicromapsPropertiesEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MicromapEXT> const & micromaps,\n                                        VULKAN_HPP_NAMESPACE::QueryType                                                   queryType,\n                                        VULKAN_HPP_NAMESPACE::QueryPool                                                   queryPool,\n                                        uint32_t firstQuery ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_HUAWEI_cluster_culling_shader ===\n\n      void drawClusterHUAWEI( uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ ) const VULKAN_HPP_NOEXCEPT;\n\n      void drawClusterIndirectHUAWEI( VULKAN_HPP_NAMESPACE::Buffer buffer, VULKAN_HPP_NAMESPACE::DeviceSize offset ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_NV_copy_memory_indirect ===\n\n      void copyMemoryIndirectNV( VULKAN_HPP_NAMESPACE::DeviceAddress copyBufferAddress, uint32_t copyCount, uint32_t stride ) const VULKAN_HPP_NOEXCEPT;\n\n      void copyMemoryToImageIndirectNV( VULKAN_HPP_NAMESPACE::DeviceAddress                                                          copyBufferAddress,\n                                        uint32_t                                                                                     stride,\n                                        VULKAN_HPP_NAMESPACE::Image                                                                  dstImage,\n                                        VULKAN_HPP_NAMESPACE::ImageLayout                                                            dstImageLayout,\n                                        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageSubresourceLayers> const & imageSubresources ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_NV_memory_decompression ===\n\n      void decompressMemoryNV( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DecompressMemoryRegionNV> const & decompressMemoryRegions ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      void decompressMemoryIndirectCountNV( VULKAN_HPP_NAMESPACE::DeviceAddress indirectCommandsAddress,\n                                            VULKAN_HPP_NAMESPACE::DeviceAddress indirectCommandsCountAddress,\n                                            uint32_t                            stride ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_NV_device_generated_commands_compute ===\n\n      void updatePipelineIndirectBufferNV( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint,\n                                           VULKAN_HPP_NAMESPACE::Pipeline          pipeline ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_extended_dynamic_state3 ===\n\n      void setDepthClampEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthClampEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setPolygonModeEXT( VULKAN_HPP_NAMESPACE::PolygonMode polygonMode ) const VULKAN_HPP_NOEXCEPT;\n\n      void setRasterizationSamplesEXT( VULKAN_HPP_NAMESPACE::SampleCountFlagBits rasterizationSamples ) const VULKAN_HPP_NOEXCEPT;\n\n      void setSampleMaskEXT( VULKAN_HPP_NAMESPACE::SampleCountFlagBits                                        samples,\n                             VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SampleMask> const & sampleMask ) const;\n\n      void setAlphaToCoverageEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 alphaToCoverageEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setAlphaToOneEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 alphaToOneEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setLogicOpEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 logicOpEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setColorBlendEnableEXT( uint32_t                                                                     firstAttachment,\n                                   VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Bool32> const & colorBlendEnables ) const VULKAN_HPP_NOEXCEPT;\n\n      void setColorBlendEquationEXT( uint32_t                                                                                    firstAttachment,\n                                     VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ColorBlendEquationEXT> const & colorBlendEquations ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      void setColorWriteMaskEXT( uint32_t                                                                                  firstAttachment,\n                                 VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ColorComponentFlags> const & colorWriteMasks ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      void setTessellationDomainOriginEXT( VULKAN_HPP_NAMESPACE::TessellationDomainOrigin domainOrigin ) const VULKAN_HPP_NOEXCEPT;\n\n      void setRasterizationStreamEXT( uint32_t rasterizationStream ) const VULKAN_HPP_NOEXCEPT;\n\n      void\n        setConservativeRasterizationModeEXT( VULKAN_HPP_NAMESPACE::ConservativeRasterizationModeEXT conservativeRasterizationMode ) const VULKAN_HPP_NOEXCEPT;\n\n      void setExtraPrimitiveOverestimationSizeEXT( float extraPrimitiveOverestimationSize ) const VULKAN_HPP_NOEXCEPT;\n\n      void setDepthClipEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthClipEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setSampleLocationsEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 sampleLocationsEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setColorBlendAdvancedEXT( uint32_t                                                                                    firstAttachment,\n                                     VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ColorBlendAdvancedEXT> const & colorBlendAdvanced ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      void setProvokingVertexModeEXT( VULKAN_HPP_NAMESPACE::ProvokingVertexModeEXT provokingVertexMode ) const VULKAN_HPP_NOEXCEPT;\n\n      void setLineRasterizationModeEXT( VULKAN_HPP_NAMESPACE::LineRasterizationModeEXT lineRasterizationMode ) const VULKAN_HPP_NOEXCEPT;\n\n      void setLineStippleEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 stippledLineEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setDepthClipNegativeOneToOneEXT( VULKAN_HPP_NAMESPACE::Bool32 negativeOneToOne ) const VULKAN_HPP_NOEXCEPT;\n\n      void setViewportWScalingEnableNV( VULKAN_HPP_NAMESPACE::Bool32 viewportWScalingEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setViewportSwizzleNV( uint32_t                                                                                firstViewport,\n                                 VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ViewportSwizzleNV> const & viewportSwizzles ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      void setCoverageToColorEnableNV( VULKAN_HPP_NAMESPACE::Bool32 coverageToColorEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setCoverageToColorLocationNV( uint32_t coverageToColorLocation ) const VULKAN_HPP_NOEXCEPT;\n\n      void setCoverageModulationModeNV( VULKAN_HPP_NAMESPACE::CoverageModulationModeNV coverageModulationMode ) const VULKAN_HPP_NOEXCEPT;\n\n      void setCoverageModulationTableEnableNV( VULKAN_HPP_NAMESPACE::Bool32 coverageModulationTableEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setCoverageModulationTableNV( VULKAN_HPP_NAMESPACE::ArrayProxy<const float> const & coverageModulationTable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setShadingRateImageEnableNV( VULKAN_HPP_NAMESPACE::Bool32 shadingRateImageEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setRepresentativeFragmentTestEnableNV( VULKAN_HPP_NAMESPACE::Bool32 representativeFragmentTestEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      void setCoverageReductionModeNV( VULKAN_HPP_NAMESPACE::CoverageReductionModeNV coverageReductionMode ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_NV_optical_flow ===\n\n      void opticalFlowExecuteNV( VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV             session,\n                                 const VULKAN_HPP_NAMESPACE::OpticalFlowExecuteInfoNV & executeInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_maintenance5 ===\n\n      void bindIndexBuffer2KHR( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                VULKAN_HPP_NAMESPACE::DeviceSize size,\n                                VULKAN_HPP_NAMESPACE::IndexType  indexType ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_shader_object ===\n\n      void bindShadersEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ShaderStageFlagBits> const & stages,\n                           VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ShaderEXT> const &           shaders ) const;\n\n      void setDepthClampRangeEXT( VULKAN_HPP_NAMESPACE::DepthClampModeEXT depthClampMode,\n                                  Optional<const VULKAN_HPP_NAMESPACE::DepthClampRangeEXT> depthClampRange\n                                    VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_NV_cooperative_vector ===\n\n      void convertCooperativeVectorMatrixNV(\n        VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ConvertCooperativeVectorMatrixInfoNV> const & infos ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_attachment_feedback_loop_dynamic_state ===\n\n      void setAttachmentFeedbackLoopEnableEXT( VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_line_rasterization ===\n\n      void setLineStippleKHR( uint32_t lineStippleFactor, uint16_t lineStipplePattern ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_maintenance6 ===\n\n      void bindDescriptorSets2KHR( const VULKAN_HPP_NAMESPACE::BindDescriptorSetsInfo & bindDescriptorSetsInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void pushConstants2KHR( const VULKAN_HPP_NAMESPACE::PushConstantsInfo & pushConstantsInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void pushDescriptorSet2KHR( const VULKAN_HPP_NAMESPACE::PushDescriptorSetInfo & pushDescriptorSetInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void pushDescriptorSetWithTemplate2KHR( const VULKAN_HPP_NAMESPACE::PushDescriptorSetWithTemplateInfo & pushDescriptorSetWithTemplateInfo ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      void setDescriptorBufferOffsets2EXT( const VULKAN_HPP_NAMESPACE::SetDescriptorBufferOffsetsInfoEXT & setDescriptorBufferOffsetsInfo ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      void bindDescriptorBufferEmbeddedSamplers2EXT(\n        const VULKAN_HPP_NAMESPACE::BindDescriptorBufferEmbeddedSamplersInfoEXT & bindDescriptorBufferEmbeddedSamplersInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_NV_cluster_acceleration_structure ===\n\n      void buildClusterAccelerationStructureIndirectNV( const VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureCommandsInfoNV & commandInfos ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_NV_partitioned_acceleration_structure ===\n\n      void buildPartitionedAccelerationStructuresNV( const VULKAN_HPP_NAMESPACE::BuildPartitionedAccelerationStructureInfoNV & buildInfo ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_device_generated_commands ===\n\n      void preprocessGeneratedCommandsEXT( const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoEXT & generatedCommandsInfo,\n                                           VULKAN_HPP_NAMESPACE::CommandBuffer                    stateCommandBuffer ) const VULKAN_HPP_NOEXCEPT;\n\n      void executeGeneratedCommandsEXT( VULKAN_HPP_NAMESPACE::Bool32                           isPreprocessed,\n                                        const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoEXT & generatedCommandsInfo ) const VULKAN_HPP_NOEXCEPT;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device        = {};\n      VULKAN_HPP_NAMESPACE::CommandPool                                                 m_commandPool   = {};\n      VULKAN_HPP_NAMESPACE::CommandBuffer                                               m_commandBuffer = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher    = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CommandBuffer>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class CommandBuffers : public std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CommandBuffer>\n    {\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      CommandBuffers( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const & device,\n                      VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo const &         allocateInfo )\n      {\n        *this = device.allocateCommandBuffers( allocateInfo );\n      }\n#  endif\n\n      CommandBuffers( std::nullptr_t ) {}\n\n      CommandBuffers()                                     = delete;\n      CommandBuffers( CommandBuffers const & )             = delete;\n      CommandBuffers( CommandBuffers && rhs )              = default;\n      CommandBuffers & operator=( CommandBuffers const & ) = delete;\n      CommandBuffers & operator=( CommandBuffers && rhs )  = default;\n\n    private:\n      CommandBuffers( std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CommandBuffer> && rhs )\n      {\n        std::swap( *this, rhs );\n      }\n    };\n\n    class CuFunctionNVX\n    {\n    public:\n      using CType   = VkCuFunctionNVX;\n      using CppType = VULKAN_HPP_NAMESPACE::CuFunctionNVX;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eCuFunctionNVX;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCuFunctionNVX;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      CuFunctionNVX( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                     VULKAN_HPP_NAMESPACE::CuFunctionCreateInfoNVX const &                           createInfo,\n                     VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createCuFunctionNVX( createInfo, allocator );\n      }\n#  endif\n\n      CuFunctionNVX( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                     VkCuFunctionNVX                                                                 function,\n                     VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_function( function )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      CuFunctionNVX( std::nullptr_t ) {}\n\n      ~CuFunctionNVX()\n      {\n        clear();\n      }\n\n      CuFunctionNVX()                        = delete;\n      CuFunctionNVX( CuFunctionNVX const & ) = delete;\n\n      CuFunctionNVX( CuFunctionNVX && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_function( VULKAN_HPP_NAMESPACE::exchange( rhs.m_function, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      CuFunctionNVX & operator=( CuFunctionNVX const & ) = delete;\n\n      CuFunctionNVX & operator=( CuFunctionNVX && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_function, rhs.m_function );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::CuFunctionNVX const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_function;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::CuFunctionNVX() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_function;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_function )\n        {\n          getDispatcher()->vkDestroyCuFunctionNVX(\n            static_cast<VkDevice>( m_device ), static_cast<VkCuFunctionNVX>( m_function ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device     = nullptr;\n        m_function   = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::CuFunctionNVX release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_function, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CuFunctionNVX & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_function, rhs.m_function );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device     = {};\n      VULKAN_HPP_NAMESPACE::CuFunctionNVX                                               m_function   = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CuFunctionNVX>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class CuModuleNVX\n    {\n    public:\n      using CType   = VkCuModuleNVX;\n      using CppType = VULKAN_HPP_NAMESPACE::CuModuleNVX;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eCuModuleNVX;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCuModuleNVX;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      CuModuleNVX( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                   VULKAN_HPP_NAMESPACE::CuModuleCreateInfoNVX const &                             createInfo,\n                   VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createCuModuleNVX( createInfo, allocator );\n      }\n#  endif\n\n      CuModuleNVX( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                   VkCuModuleNVX                                                                   module,\n                   VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_module( module )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      CuModuleNVX( std::nullptr_t ) {}\n\n      ~CuModuleNVX()\n      {\n        clear();\n      }\n\n      CuModuleNVX()                      = delete;\n      CuModuleNVX( CuModuleNVX const & ) = delete;\n\n      CuModuleNVX( CuModuleNVX && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_module( VULKAN_HPP_NAMESPACE::exchange( rhs.m_module, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      CuModuleNVX & operator=( CuModuleNVX const & ) = delete;\n\n      CuModuleNVX & operator=( CuModuleNVX && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_module, rhs.m_module );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::CuModuleNVX const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_module;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::CuModuleNVX() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_module;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_module )\n        {\n          getDispatcher()->vkDestroyCuModuleNVX(\n            static_cast<VkDevice>( m_device ), static_cast<VkCuModuleNVX>( m_module ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device     = nullptr;\n        m_module     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::CuModuleNVX release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_module, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CuModuleNVX & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_module, rhs.m_module );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device     = {};\n      VULKAN_HPP_NAMESPACE::CuModuleNVX                                                 m_module     = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CuModuleNVX>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n    class CudaFunctionNV\n    {\n    public:\n      using CType   = VkCudaFunctionNV;\n      using CppType = VULKAN_HPP_NAMESPACE::CudaFunctionNV;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eCudaFunctionNV;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCudaFunctionNV;\n\n    public:\n#    if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      CudaFunctionNV( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                      VULKAN_HPP_NAMESPACE::CudaFunctionCreateInfoNV const &                          createInfo,\n                      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createCudaFunctionNV( createInfo, allocator );\n      }\n#    endif\n\n      CudaFunctionNV( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                      VkCudaFunctionNV                                                                function,\n                      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_function( function )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      CudaFunctionNV( std::nullptr_t ) {}\n\n      ~CudaFunctionNV()\n      {\n        clear();\n      }\n\n      CudaFunctionNV()                         = delete;\n      CudaFunctionNV( CudaFunctionNV const & ) = delete;\n\n      CudaFunctionNV( CudaFunctionNV && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_function( VULKAN_HPP_NAMESPACE::exchange( rhs.m_function, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      CudaFunctionNV & operator=( CudaFunctionNV const & ) = delete;\n\n      CudaFunctionNV & operator=( CudaFunctionNV && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_function, rhs.m_function );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::CudaFunctionNV const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_function;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::CudaFunctionNV() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_function;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_function )\n        {\n          getDispatcher()->vkDestroyCudaFunctionNV(\n            static_cast<VkDevice>( m_device ), static_cast<VkCudaFunctionNV>( m_function ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device     = nullptr;\n        m_function   = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::CudaFunctionNV release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_function, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CudaFunctionNV & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_function, rhs.m_function );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device     = {};\n      VULKAN_HPP_NAMESPACE::CudaFunctionNV                                              m_function   = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CudaFunctionNV>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n    class CudaModuleNV\n    {\n    public:\n      using CType   = VkCudaModuleNV;\n      using CppType = VULKAN_HPP_NAMESPACE::CudaModuleNV;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eCudaModuleNV;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCudaModuleNV;\n\n    public:\n#    if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      CudaModuleNV( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                    VULKAN_HPP_NAMESPACE::CudaModuleCreateInfoNV const &                            createInfo,\n                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createCudaModuleNV( createInfo, allocator );\n      }\n#    endif\n\n      CudaModuleNV( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                    VkCudaModuleNV                                                                  module,\n                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_module( module )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      CudaModuleNV( std::nullptr_t ) {}\n\n      ~CudaModuleNV()\n      {\n        clear();\n      }\n\n      CudaModuleNV()                       = delete;\n      CudaModuleNV( CudaModuleNV const & ) = delete;\n\n      CudaModuleNV( CudaModuleNV && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_module( VULKAN_HPP_NAMESPACE::exchange( rhs.m_module, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      CudaModuleNV & operator=( CudaModuleNV const & ) = delete;\n\n      CudaModuleNV & operator=( CudaModuleNV && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_module, rhs.m_module );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::CudaModuleNV const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_module;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::CudaModuleNV() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_module;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_module )\n        {\n          getDispatcher()->vkDestroyCudaModuleNV(\n            static_cast<VkDevice>( m_device ), static_cast<VkCudaModuleNV>( m_module ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device     = nullptr;\n        m_module     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::CudaModuleNV release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_module, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CudaModuleNV & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_module, rhs.m_module );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_NV_cuda_kernel_launch ===\n\n      VULKAN_HPP_NODISCARD std::vector<uint8_t> getCache() const;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device     = {};\n      VULKAN_HPP_NAMESPACE::CudaModuleNV                                                m_module     = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CudaModuleNV>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n    class DebugReportCallbackEXT\n    {\n    public:\n      using CType   = VkDebugReportCallbackEXT;\n      using CppType = VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDebugReportCallbackEXT;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDebugReportCallbackEXT;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      DebugReportCallbackEXT( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &               instance,\n                              VULKAN_HPP_NAMESPACE::DebugReportCallbackCreateInfoEXT const &                  createInfo,\n                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = instance.createDebugReportCallbackEXT( createInfo, allocator );\n      }\n#  endif\n\n      DebugReportCallbackEXT( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &               instance,\n                              VkDebugReportCallbackEXT                                                        callback,\n                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_instance( instance )\n        , m_callback( callback )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( instance.getDispatcher() )\n      {\n      }\n\n      DebugReportCallbackEXT( std::nullptr_t ) {}\n\n      ~DebugReportCallbackEXT()\n      {\n        clear();\n      }\n\n      DebugReportCallbackEXT()                                 = delete;\n      DebugReportCallbackEXT( DebugReportCallbackEXT const & ) = delete;\n\n      DebugReportCallbackEXT( DebugReportCallbackEXT && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_instance( VULKAN_HPP_NAMESPACE::exchange( rhs.m_instance, {} ) )\n        , m_callback( VULKAN_HPP_NAMESPACE::exchange( rhs.m_callback, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      DebugReportCallbackEXT & operator=( DebugReportCallbackEXT const & ) = delete;\n\n      DebugReportCallbackEXT & operator=( DebugReportCallbackEXT && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_instance, rhs.m_instance );\n          std::swap( m_callback, rhs.m_callback );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_callback;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_callback;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_callback )\n        {\n          getDispatcher()->vkDestroyDebugReportCallbackEXT( static_cast<VkInstance>( m_instance ),\n                                                            static_cast<VkDebugReportCallbackEXT>( m_callback ),\n                                                            reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_instance   = nullptr;\n        m_callback   = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT release()\n      {\n        m_instance   = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_callback, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Instance getInstance() const\n      {\n        return m_instance;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::InstanceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DebugReportCallbackEXT & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_instance, rhs.m_instance );\n        std::swap( m_callback, rhs.m_callback );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n    private:\n      VULKAN_HPP_NAMESPACE::Instance                                                      m_instance   = {};\n      VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT                                        m_callback   = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                   m_allocator  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::InstanceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DebugReportCallbackEXT>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class DebugUtilsMessengerEXT\n    {\n    public:\n      using CType   = VkDebugUtilsMessengerEXT;\n      using CppType = VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDebugUtilsMessengerEXT;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      DebugUtilsMessengerEXT( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &               instance,\n                              VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateInfoEXT const &                  createInfo,\n                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = instance.createDebugUtilsMessengerEXT( createInfo, allocator );\n      }\n#  endif\n\n      DebugUtilsMessengerEXT( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &               instance,\n                              VkDebugUtilsMessengerEXT                                                        messenger,\n                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_instance( instance )\n        , m_messenger( messenger )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( instance.getDispatcher() )\n      {\n      }\n\n      DebugUtilsMessengerEXT( std::nullptr_t ) {}\n\n      ~DebugUtilsMessengerEXT()\n      {\n        clear();\n      }\n\n      DebugUtilsMessengerEXT()                                 = delete;\n      DebugUtilsMessengerEXT( DebugUtilsMessengerEXT const & ) = delete;\n\n      DebugUtilsMessengerEXT( DebugUtilsMessengerEXT && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_instance( VULKAN_HPP_NAMESPACE::exchange( rhs.m_instance, {} ) )\n        , m_messenger( VULKAN_HPP_NAMESPACE::exchange( rhs.m_messenger, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      DebugUtilsMessengerEXT & operator=( DebugUtilsMessengerEXT const & ) = delete;\n\n      DebugUtilsMessengerEXT & operator=( DebugUtilsMessengerEXT && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_instance, rhs.m_instance );\n          std::swap( m_messenger, rhs.m_messenger );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_messenger;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_messenger;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_messenger )\n        {\n          getDispatcher()->vkDestroyDebugUtilsMessengerEXT( static_cast<VkInstance>( m_instance ),\n                                                            static_cast<VkDebugUtilsMessengerEXT>( m_messenger ),\n                                                            reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_instance   = nullptr;\n        m_messenger  = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT release()\n      {\n        m_instance   = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_messenger, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Instance getInstance() const\n      {\n        return m_instance;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::InstanceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DebugUtilsMessengerEXT & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_instance, rhs.m_instance );\n        std::swap( m_messenger, rhs.m_messenger );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n    private:\n      VULKAN_HPP_NAMESPACE::Instance                                                      m_instance   = {};\n      VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT                                        m_messenger  = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                   m_allocator  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::InstanceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DebugUtilsMessengerEXT>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class DeferredOperationKHR\n    {\n    public:\n      using CType   = VkDeferredOperationKHR;\n      using CppType = VULKAN_HPP_NAMESPACE::DeferredOperationKHR;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDeferredOperationKHR;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      DeferredOperationKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                            VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createDeferredOperationKHR( allocator );\n      }\n#  endif\n\n      DeferredOperationKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                            VkDeferredOperationKHR                                                          operation,\n                            VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_operation( operation )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      DeferredOperationKHR( std::nullptr_t ) {}\n\n      ~DeferredOperationKHR()\n      {\n        clear();\n      }\n\n      DeferredOperationKHR()                               = delete;\n      DeferredOperationKHR( DeferredOperationKHR const & ) = delete;\n\n      DeferredOperationKHR( DeferredOperationKHR && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_operation( VULKAN_HPP_NAMESPACE::exchange( rhs.m_operation, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      DeferredOperationKHR & operator=( DeferredOperationKHR const & ) = delete;\n\n      DeferredOperationKHR & operator=( DeferredOperationKHR && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_operation, rhs.m_operation );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::DeferredOperationKHR const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_operation;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::DeferredOperationKHR() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_operation;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_operation )\n        {\n          getDispatcher()->vkDestroyDeferredOperationKHR( static_cast<VkDevice>( m_device ),\n                                                          static_cast<VkDeferredOperationKHR>( m_operation ),\n                                                          reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device     = nullptr;\n        m_operation  = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::DeferredOperationKHR release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_operation, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeferredOperationKHR & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_operation, rhs.m_operation );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_KHR_deferred_host_operations ===\n\n      VULKAN_HPP_NODISCARD uint32_t getMaxConcurrency() const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result getResult() const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result join() const;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device     = {};\n      VULKAN_HPP_NAMESPACE::DeferredOperationKHR                                        m_operation  = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeferredOperationKHR>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class DescriptorPool\n    {\n    public:\n      using CType   = VkDescriptorPool;\n      using CppType = VULKAN_HPP_NAMESPACE::DescriptorPool;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDescriptorPool;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDescriptorPool;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      DescriptorPool( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                      VULKAN_HPP_NAMESPACE::DescriptorPoolCreateInfo const &                          createInfo,\n                      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createDescriptorPool( createInfo, allocator );\n      }\n#  endif\n\n      DescriptorPool( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                      VkDescriptorPool                                                                descriptorPool,\n                      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_descriptorPool( descriptorPool )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      DescriptorPool( std::nullptr_t ) {}\n\n      ~DescriptorPool()\n      {\n        clear();\n      }\n\n      DescriptorPool()                         = delete;\n      DescriptorPool( DescriptorPool const & ) = delete;\n\n      DescriptorPool( DescriptorPool && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_descriptorPool( VULKAN_HPP_NAMESPACE::exchange( rhs.m_descriptorPool, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      DescriptorPool & operator=( DescriptorPool const & ) = delete;\n\n      DescriptorPool & operator=( DescriptorPool && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_descriptorPool, rhs.m_descriptorPool );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::DescriptorPool const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_descriptorPool;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::DescriptorPool() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_descriptorPool;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_descriptorPool )\n        {\n          getDispatcher()->vkDestroyDescriptorPool( static_cast<VkDevice>( m_device ),\n                                                    static_cast<VkDescriptorPool>( m_descriptorPool ),\n                                                    reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device         = nullptr;\n        m_descriptorPool = nullptr;\n        m_allocator      = nullptr;\n        m_dispatcher     = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::DescriptorPool release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_descriptorPool, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorPool & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_descriptorPool, rhs.m_descriptorPool );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_VERSION_1_0 ===\n\n      void reset( VULKAN_HPP_NAMESPACE::DescriptorPoolResetFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device         = {};\n      VULKAN_HPP_NAMESPACE::DescriptorPool                                              m_descriptorPool = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator      = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher     = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorPool>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class DescriptorSet\n    {\n    public:\n      using CType   = VkDescriptorSet;\n      using CppType = VULKAN_HPP_NAMESPACE::DescriptorSet;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDescriptorSet;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDescriptorSet;\n\n    public:\n      DescriptorSet( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const & device, VkDescriptorSet descriptorSet, VkDescriptorPool descriptorPool )\n        : m_device( device ), m_descriptorPool( descriptorPool ), m_descriptorSet( descriptorSet ), m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      DescriptorSet( std::nullptr_t ) {}\n\n      ~DescriptorSet()\n      {\n        clear();\n      }\n\n      DescriptorSet()                        = delete;\n      DescriptorSet( DescriptorSet const & ) = delete;\n\n      DescriptorSet( DescriptorSet && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_descriptorPool( VULKAN_HPP_NAMESPACE::exchange( rhs.m_descriptorPool, {} ) )\n        , m_descriptorSet( VULKAN_HPP_NAMESPACE::exchange( rhs.m_descriptorSet, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      DescriptorSet & operator=( DescriptorSet const & ) = delete;\n\n      DescriptorSet & operator=( DescriptorSet && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_descriptorPool, rhs.m_descriptorPool );\n          std::swap( m_descriptorSet, rhs.m_descriptorSet );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::DescriptorSet const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_descriptorSet;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::DescriptorSet() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_descriptorSet;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_descriptorSet )\n        {\n          getDispatcher()->vkFreeDescriptorSets( static_cast<VkDevice>( m_device ),\n                                                 static_cast<VkDescriptorPool>( m_descriptorPool ),\n                                                 1,\n                                                 reinterpret_cast<VkDescriptorSet const *>( &m_descriptorSet ) );\n        }\n        m_device         = nullptr;\n        m_descriptorPool = nullptr;\n        m_descriptorSet  = nullptr;\n        m_dispatcher     = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::DescriptorSet release()\n      {\n        m_device         = nullptr;\n        m_descriptorPool = nullptr;\n        m_dispatcher     = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_descriptorSet, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorSet & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_descriptorPool, rhs.m_descriptorPool );\n        std::swap( m_descriptorSet, rhs.m_descriptorSet );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_VERSION_1_1 ===\n\n      template <typename DataType>\n      void updateWithTemplate( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate, DataType const & data ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_descriptor_update_template ===\n\n      template <typename DataType>\n      void updateWithTemplateKHR( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate, DataType const & data ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_VALVE_descriptor_set_host_mapping ===\n\n      VULKAN_HPP_NODISCARD void * getHostMappingVALVE() const VULKAN_HPP_NOEXCEPT;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device         = {};\n      VULKAN_HPP_NAMESPACE::DescriptorPool                                              m_descriptorPool = {};\n      VULKAN_HPP_NAMESPACE::DescriptorSet                                               m_descriptorSet  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher     = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorSet>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class DescriptorSets : public std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorSet>\n    {\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      DescriptorSets( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const & device,\n                      VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo const &         allocateInfo )\n      {\n        *this = device.allocateDescriptorSets( allocateInfo );\n      }\n#  endif\n\n      DescriptorSets( std::nullptr_t ) {}\n\n      DescriptorSets()                                     = delete;\n      DescriptorSets( DescriptorSets const & )             = delete;\n      DescriptorSets( DescriptorSets && rhs )              = default;\n      DescriptorSets & operator=( DescriptorSets const & ) = delete;\n      DescriptorSets & operator=( DescriptorSets && rhs )  = default;\n\n    private:\n      DescriptorSets( std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorSet> && rhs )\n      {\n        std::swap( *this, rhs );\n      }\n    };\n\n    class DescriptorSetLayout\n    {\n    public:\n      using CType   = VkDescriptorSetLayout;\n      using CppType = VULKAN_HPP_NAMESPACE::DescriptorSetLayout;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDescriptorSetLayout;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDescriptorSetLayout;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      DescriptorSetLayout( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                           VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo const &                     createInfo,\n                           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createDescriptorSetLayout( createInfo, allocator );\n      }\n#  endif\n\n      DescriptorSetLayout( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                           VkDescriptorSetLayout                                                           descriptorSetLayout,\n                           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_descriptorSetLayout( descriptorSetLayout )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      DescriptorSetLayout( std::nullptr_t ) {}\n\n      ~DescriptorSetLayout()\n      {\n        clear();\n      }\n\n      DescriptorSetLayout()                              = delete;\n      DescriptorSetLayout( DescriptorSetLayout const & ) = delete;\n\n      DescriptorSetLayout( DescriptorSetLayout && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_descriptorSetLayout( VULKAN_HPP_NAMESPACE::exchange( rhs.m_descriptorSetLayout, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      DescriptorSetLayout & operator=( DescriptorSetLayout const & ) = delete;\n\n      DescriptorSetLayout & operator=( DescriptorSetLayout && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_descriptorSetLayout, rhs.m_descriptorSetLayout );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::DescriptorSetLayout const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_descriptorSetLayout;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::DescriptorSetLayout() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_descriptorSetLayout;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_descriptorSetLayout )\n        {\n          getDispatcher()->vkDestroyDescriptorSetLayout( static_cast<VkDevice>( m_device ),\n                                                         static_cast<VkDescriptorSetLayout>( m_descriptorSetLayout ),\n                                                         reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device              = nullptr;\n        m_descriptorSetLayout = nullptr;\n        m_allocator           = nullptr;\n        m_dispatcher          = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::DescriptorSetLayout release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_descriptorSetLayout, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorSetLayout & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_descriptorSetLayout, rhs.m_descriptorSetLayout );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_EXT_descriptor_buffer ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceSize getSizeEXT() const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceSize getBindingOffsetEXT( uint32_t binding ) const VULKAN_HPP_NOEXCEPT;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device              = {};\n      VULKAN_HPP_NAMESPACE::DescriptorSetLayout                                         m_descriptorSetLayout = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator           = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher          = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorSetLayout>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class DescriptorUpdateTemplate\n    {\n    public:\n      using CType   = VkDescriptorUpdateTemplate;\n      using CppType = VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDescriptorUpdateTemplate;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDescriptorUpdateTemplate;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      DescriptorUpdateTemplate( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                                VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo const &                createInfo,\n                                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createDescriptorUpdateTemplate( createInfo, allocator );\n      }\n#  endif\n\n      DescriptorUpdateTemplate( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                                VkDescriptorUpdateTemplate                                                      descriptorUpdateTemplate,\n                                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_descriptorUpdateTemplate( descriptorUpdateTemplate )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      DescriptorUpdateTemplate( std::nullptr_t ) {}\n\n      ~DescriptorUpdateTemplate()\n      {\n        clear();\n      }\n\n      DescriptorUpdateTemplate()                                   = delete;\n      DescriptorUpdateTemplate( DescriptorUpdateTemplate const & ) = delete;\n\n      DescriptorUpdateTemplate( DescriptorUpdateTemplate && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_descriptorUpdateTemplate( VULKAN_HPP_NAMESPACE::exchange( rhs.m_descriptorUpdateTemplate, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      DescriptorUpdateTemplate & operator=( DescriptorUpdateTemplate const & ) = delete;\n\n      DescriptorUpdateTemplate & operator=( DescriptorUpdateTemplate && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_descriptorUpdateTemplate, rhs.m_descriptorUpdateTemplate );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_descriptorUpdateTemplate;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_descriptorUpdateTemplate;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_descriptorUpdateTemplate )\n        {\n          getDispatcher()->vkDestroyDescriptorUpdateTemplate( static_cast<VkDevice>( m_device ),\n                                                              static_cast<VkDescriptorUpdateTemplate>( m_descriptorUpdateTemplate ),\n                                                              reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device                   = nullptr;\n        m_descriptorUpdateTemplate = nullptr;\n        m_allocator                = nullptr;\n        m_dispatcher               = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_descriptorUpdateTemplate, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorUpdateTemplate & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_descriptorUpdateTemplate, rhs.m_descriptorUpdateTemplate );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device                   = {};\n      VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate                                    m_descriptorUpdateTemplate = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator                = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher               = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorUpdateTemplate>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class DeviceMemory\n    {\n    public:\n      using CType   = VkDeviceMemory;\n      using CppType = VULKAN_HPP_NAMESPACE::DeviceMemory;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDeviceMemory;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDeviceMemory;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      DeviceMemory( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                    VULKAN_HPP_NAMESPACE::MemoryAllocateInfo const &                                allocateInfo,\n                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.allocateMemory( allocateInfo, allocator );\n      }\n#  endif\n\n      DeviceMemory( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                    VkDeviceMemory                                                                  memory,\n                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_memory( memory )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      DeviceMemory( std::nullptr_t ) {}\n\n      ~DeviceMemory()\n      {\n        clear();\n      }\n\n      DeviceMemory()                       = delete;\n      DeviceMemory( DeviceMemory const & ) = delete;\n\n      DeviceMemory( DeviceMemory && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_memory( VULKAN_HPP_NAMESPACE::exchange( rhs.m_memory, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      DeviceMemory & operator=( DeviceMemory const & ) = delete;\n\n      DeviceMemory & operator=( DeviceMemory && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_memory, rhs.m_memory );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::DeviceMemory const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_memory;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::DeviceMemory() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_memory;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_memory )\n        {\n          getDispatcher()->vkFreeMemory(\n            static_cast<VkDevice>( m_device ), static_cast<VkDeviceMemory>( m_memory ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device     = nullptr;\n        m_memory     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::DeviceMemory release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_memory, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceMemory & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_memory, rhs.m_memory );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_VERSION_1_0 ===\n\n      VULKAN_HPP_NODISCARD void * mapMemory( VULKAN_HPP_NAMESPACE::DeviceSize           offset,\n                                             VULKAN_HPP_NAMESPACE::DeviceSize           size,\n                                             VULKAN_HPP_NAMESPACE::MemoryMapFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const;\n\n      void unmapMemory() const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceSize getCommitment() const VULKAN_HPP_NOEXCEPT;\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_NV_external_memory_win32 ===\n\n      VULKAN_HPP_NODISCARD HANDLE getMemoryWin32HandleNV( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV handleType ) const;\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n      //=== VK_EXT_pageable_device_local_memory ===\n\n      void setPriorityEXT( float priority ) const VULKAN_HPP_NOEXCEPT;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device     = {};\n      VULKAN_HPP_NAMESPACE::DeviceMemory                                                m_memory     = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceMemory>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class DisplayKHR\n    {\n    public:\n      using CType   = VkDisplayKHR;\n      using CppType = VULKAN_HPP_NAMESPACE::DisplayKHR;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDisplayKHR;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDisplayKHR;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      DisplayKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice const & physicalDevice, int32_t drmFd, uint32_t connectorId )\n      {\n        *this = physicalDevice.getDrmDisplayEXT( drmFd, connectorId );\n      }\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n#    if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )\n      DisplayKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice const & physicalDevice, Display & dpy, RROutput rrOutput )\n      {\n        *this = physicalDevice.getRandROutputDisplayEXT( dpy, rrOutput );\n      }\n#    endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n#    if defined( VK_USE_PLATFORM_WIN32_KHR )\n      DisplayKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice const & physicalDevice, uint32_t deviceRelativeId )\n      {\n        *this = physicalDevice.getWinrtDisplayNV( deviceRelativeId );\n      }\n#    endif /*VK_USE_PLATFORM_WIN32_KHR*/\n#  endif\n\n      DisplayKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice const & physicalDevice, VkDisplayKHR display )\n        : m_physicalDevice( physicalDevice ), m_display( display ), m_dispatcher( physicalDevice.getDispatcher() )\n      {\n      }\n\n      DisplayKHR( std::nullptr_t ) {}\n\n      ~DisplayKHR()\n      {\n        clear();\n      }\n\n      DisplayKHR()                     = delete;\n      DisplayKHR( DisplayKHR const & ) = delete;\n\n      DisplayKHR( DisplayKHR && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_physicalDevice( VULKAN_HPP_NAMESPACE::exchange( rhs.m_physicalDevice, {} ) )\n        , m_display( VULKAN_HPP_NAMESPACE::exchange( rhs.m_display, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      DisplayKHR & operator=( DisplayKHR const & ) = delete;\n\n      DisplayKHR & operator=( DisplayKHR && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_physicalDevice, rhs.m_physicalDevice );\n          std::swap( m_display, rhs.m_display );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::DisplayKHR const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_display;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::DisplayKHR() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_display;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_display )\n        {\n          getDispatcher()->vkReleaseDisplayEXT( static_cast<VkPhysicalDevice>( m_physicalDevice ), static_cast<VkDisplayKHR>( m_display ) );\n        }\n        m_physicalDevice = nullptr;\n        m_display        = nullptr;\n        m_dispatcher     = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::DisplayKHR release()\n      {\n        m_physicalDevice = nullptr;\n        m_dispatcher     = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_display, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::PhysicalDevice getPhysicalDevice() const\n      {\n        return m_physicalDevice;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::InstanceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_physicalDevice, rhs.m_physicalDevice );\n        std::swap( m_display, rhs.m_display );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_KHR_display ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR> getModeProperties() const;\n\n      VULKAN_HPP_NODISCARD\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayModeKHR>::Type\n        createMode( VULKAN_HPP_NAMESPACE::DisplayModeCreateInfoKHR const &                          createInfo,\n                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT;\n\n      //=== VK_KHR_get_display_properties2 ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR> getModeProperties2() const;\n\n      template <typename StructureChain>\n      VULKAN_HPP_NODISCARD std::vector<StructureChain> getModeProperties2() const;\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_NV_acquire_winrt_display ===\n\n      void acquireWinrtNV() const;\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n    private:\n      VULKAN_HPP_NAMESPACE::PhysicalDevice                                                m_physicalDevice = {};\n      VULKAN_HPP_NAMESPACE::DisplayKHR                                                    m_display        = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::InstanceDispatcher const * m_dispatcher     = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class DisplayKHRs : public std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR>\n    {\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      DisplayKHRs( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice const & physicalDevice, uint32_t planeIndex )\n      {\n        *this = physicalDevice.getDisplayPlaneSupportedDisplaysKHR( planeIndex );\n      }\n#  endif\n\n      DisplayKHRs( std::nullptr_t ) {}\n\n      DisplayKHRs()                                  = delete;\n      DisplayKHRs( DisplayKHRs const & )             = delete;\n      DisplayKHRs( DisplayKHRs && rhs )              = default;\n      DisplayKHRs & operator=( DisplayKHRs const & ) = delete;\n      DisplayKHRs & operator=( DisplayKHRs && rhs )  = default;\n\n    private:\n      DisplayKHRs( std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR> && rhs )\n      {\n        std::swap( *this, rhs );\n      }\n    };\n\n    class DisplayModeKHR\n    {\n    public:\n      using CType   = VkDisplayModeKHR;\n      using CppType = VULKAN_HPP_NAMESPACE::DisplayModeKHR;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDisplayModeKHR;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDisplayModeKHR;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      DisplayModeKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR const &             display,\n                      VULKAN_HPP_NAMESPACE::DisplayModeCreateInfoKHR const &                          createInfo,\n                      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = display.createMode( createInfo, allocator );\n      }\n#  endif\n\n      DisplayModeKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR const & display, VkDisplayModeKHR displayModeKHR )\n        : m_physicalDevice( display.getPhysicalDevice() ), m_displayModeKHR( displayModeKHR ), m_dispatcher( display.getDispatcher() )\n      {\n      }\n\n      DisplayModeKHR( std::nullptr_t ) {}\n\n      ~DisplayModeKHR()\n      {\n        clear();\n      }\n\n      DisplayModeKHR() = delete;\n\n      DisplayModeKHR( DisplayModeKHR const & rhs ) : m_displayModeKHR( rhs.m_displayModeKHR ), m_dispatcher( rhs.m_dispatcher ) {}\n\n      DisplayModeKHR( DisplayModeKHR && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_physicalDevice( VULKAN_HPP_NAMESPACE::exchange( rhs.m_physicalDevice, {} ) )\n        , m_displayModeKHR( VULKAN_HPP_NAMESPACE::exchange( rhs.m_displayModeKHR, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      DisplayModeKHR & operator=( DisplayModeKHR const & rhs )\n      {\n        m_displayModeKHR = rhs.m_displayModeKHR;\n        m_dispatcher     = rhs.m_dispatcher;\n        return *this;\n      }\n\n      DisplayModeKHR & operator=( DisplayModeKHR && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_physicalDevice, rhs.m_physicalDevice );\n          std::swap( m_displayModeKHR, rhs.m_displayModeKHR );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::DisplayModeKHR const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_displayModeKHR;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::DisplayModeKHR() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_displayModeKHR;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        m_physicalDevice = nullptr;\n        m_displayModeKHR = nullptr;\n        m_dispatcher     = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::DisplayModeKHR release()\n      {\n        m_physicalDevice = nullptr;\n        m_dispatcher     = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_displayModeKHR, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::InstanceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayModeKHR & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_physicalDevice, rhs.m_physicalDevice );\n        std::swap( m_displayModeKHR, rhs.m_displayModeKHR );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_KHR_display ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR getDisplayPlaneCapabilities( uint32_t planeIndex ) const;\n\n    private:\n      VULKAN_HPP_NAMESPACE::PhysicalDevice                                                m_physicalDevice = {};\n      VULKAN_HPP_NAMESPACE::DisplayModeKHR                                                m_displayModeKHR = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::InstanceDispatcher const * m_dispatcher     = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayModeKHR>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class Event\n    {\n    public:\n      using CType   = VkEvent;\n      using CppType = VULKAN_HPP_NAMESPACE::Event;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eEvent;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eEvent;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      Event( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n             VULKAN_HPP_NAMESPACE::EventCreateInfo const &                                   createInfo,\n             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createEvent( createInfo, allocator );\n      }\n#  endif\n\n      Event( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n             VkEvent                                                                         event,\n             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_event( event )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      Event( std::nullptr_t ) {}\n\n      ~Event()\n      {\n        clear();\n      }\n\n      Event()                = delete;\n      Event( Event const & ) = delete;\n\n      Event( Event && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_event( VULKAN_HPP_NAMESPACE::exchange( rhs.m_event, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      Event & operator=( Event const & ) = delete;\n\n      Event & operator=( Event && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_event, rhs.m_event );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::Event const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_event;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::Event() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_event;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_event )\n        {\n          getDispatcher()->vkDestroyEvent(\n            static_cast<VkDevice>( m_device ), static_cast<VkEvent>( m_event ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device     = nullptr;\n        m_event      = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::Event release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_event, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Event & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_event, rhs.m_event );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_VERSION_1_0 ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result getStatus() const;\n\n      void set() const;\n\n      void reset() const;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device     = {};\n      VULKAN_HPP_NAMESPACE::Event                                                       m_event      = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Event>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class Fence\n    {\n    public:\n      using CType   = VkFence;\n      using CppType = VULKAN_HPP_NAMESPACE::Fence;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eFence;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eFence;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      Fence( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n             VULKAN_HPP_NAMESPACE::FenceCreateInfo const &                                   createInfo,\n             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createFence( createInfo, allocator );\n      }\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      Fence( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n             VULKAN_HPP_NAMESPACE::DeviceEventInfoEXT const &                                deviceEventInfo,\n             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.registerEventEXT( deviceEventInfo, allocator );\n      }\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      Fence( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n             VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR const &             display,\n             VULKAN_HPP_NAMESPACE::DisplayEventInfoEXT const &                               displayEventInfo,\n             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.registerDisplayEventEXT( display, displayEventInfo, allocator );\n      }\n#  endif\n\n      Fence( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n             VkFence                                                                         fence,\n             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_fence( fence )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      Fence( std::nullptr_t ) {}\n\n      ~Fence()\n      {\n        clear();\n      }\n\n      Fence()                = delete;\n      Fence( Fence const & ) = delete;\n\n      Fence( Fence && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_fence( VULKAN_HPP_NAMESPACE::exchange( rhs.m_fence, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      Fence & operator=( Fence const & ) = delete;\n\n      Fence & operator=( Fence && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_fence, rhs.m_fence );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::Fence const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_fence;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::Fence() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_fence;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_fence )\n        {\n          getDispatcher()->vkDestroyFence(\n            static_cast<VkDevice>( m_device ), static_cast<VkFence>( m_fence ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device     = nullptr;\n        m_fence      = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::Fence release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_fence, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Fence & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_fence, rhs.m_fence );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_VERSION_1_0 ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result getStatus() const;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device     = {};\n      VULKAN_HPP_NAMESPACE::Fence                                                       m_fence      = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Fence>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class Framebuffer\n    {\n    public:\n      using CType   = VkFramebuffer;\n      using CppType = VULKAN_HPP_NAMESPACE::Framebuffer;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eFramebuffer;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eFramebuffer;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      Framebuffer( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                   VULKAN_HPP_NAMESPACE::FramebufferCreateInfo const &                             createInfo,\n                   VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createFramebuffer( createInfo, allocator );\n      }\n#  endif\n\n      Framebuffer( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                   VkFramebuffer                                                                   framebuffer,\n                   VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_framebuffer( framebuffer )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      Framebuffer( std::nullptr_t ) {}\n\n      ~Framebuffer()\n      {\n        clear();\n      }\n\n      Framebuffer()                      = delete;\n      Framebuffer( Framebuffer const & ) = delete;\n\n      Framebuffer( Framebuffer && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_framebuffer( VULKAN_HPP_NAMESPACE::exchange( rhs.m_framebuffer, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      Framebuffer & operator=( Framebuffer const & ) = delete;\n\n      Framebuffer & operator=( Framebuffer && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_framebuffer, rhs.m_framebuffer );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::Framebuffer const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_framebuffer;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::Framebuffer() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_framebuffer;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_framebuffer )\n        {\n          getDispatcher()->vkDestroyFramebuffer(\n            static_cast<VkDevice>( m_device ), static_cast<VkFramebuffer>( m_framebuffer ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device      = nullptr;\n        m_framebuffer = nullptr;\n        m_allocator   = nullptr;\n        m_dispatcher  = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::Framebuffer release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_framebuffer, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Framebuffer & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_framebuffer, rhs.m_framebuffer );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_QCOM_tile_properties ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::TilePropertiesQCOM> getTilePropertiesQCOM() const;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device      = {};\n      VULKAN_HPP_NAMESPACE::Framebuffer                                                 m_framebuffer = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator   = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher  = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Framebuffer>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class Image\n    {\n    public:\n      using CType   = VkImage;\n      using CppType = VULKAN_HPP_NAMESPACE::Image;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eImage;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eImage;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      Image( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n             VULKAN_HPP_NAMESPACE::ImageCreateInfo const &                                   createInfo,\n             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createImage( createInfo, allocator );\n      }\n#  endif\n\n      Image( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n             VkImage                                                                         image,\n             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_image( image )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      Image( std::nullptr_t ) {}\n\n      ~Image()\n      {\n        clear();\n      }\n\n      Image()                = delete;\n      Image( Image const & ) = delete;\n\n      Image( Image && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_image( VULKAN_HPP_NAMESPACE::exchange( rhs.m_image, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      Image & operator=( Image const & ) = delete;\n\n      Image & operator=( Image && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_image, rhs.m_image );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::Image const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_image;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::Image() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_image;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_image )\n        {\n          getDispatcher()->vkDestroyImage(\n            static_cast<VkDevice>( m_device ), static_cast<VkImage>( m_image ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device     = nullptr;\n        m_image      = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::Image release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_image, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Image & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_image, rhs.m_image );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_VERSION_1_0 ===\n\n      void bindMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory, VULKAN_HPP_NAMESPACE::DeviceSize memoryOffset ) const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements getMemoryRequirements() const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements> getSparseMemoryRequirements() const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::SubresourceLayout\n                           getSubresourceLayout( const VULKAN_HPP_NAMESPACE::ImageSubresource & subresource ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_VERSION_1_4 ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::SubresourceLayout2\n                           getSubresourceLayout2( const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                           getSubresourceLayout2( const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_image_drm_format_modifier ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierPropertiesEXT getDrmFormatModifierPropertiesEXT() const;\n\n      //=== VK_EXT_host_image_copy ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::SubresourceLayout2\n                           getSubresourceLayout2EXT( const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                           getSubresourceLayout2EXT( const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_maintenance5 ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::SubresourceLayout2\n                           getSubresourceLayout2KHR( const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource ) const VULKAN_HPP_NOEXCEPT;\n\n      template <typename X, typename Y, typename... Z>\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                           getSubresourceLayout2KHR( const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource ) const VULKAN_HPP_NOEXCEPT;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device     = {};\n      VULKAN_HPP_NAMESPACE::Image                                                       m_image      = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Image>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class ImageView\n    {\n    public:\n      using CType   = VkImageView;\n      using CppType = VULKAN_HPP_NAMESPACE::ImageView;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eImageView;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eImageView;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      ImageView( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                 VULKAN_HPP_NAMESPACE::ImageViewCreateInfo const &                               createInfo,\n                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createImageView( createInfo, allocator );\n      }\n#  endif\n\n      ImageView( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                 VkImageView                                                                     imageView,\n                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_imageView( imageView )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      ImageView( std::nullptr_t ) {}\n\n      ~ImageView()\n      {\n        clear();\n      }\n\n      ImageView()                    = delete;\n      ImageView( ImageView const & ) = delete;\n\n      ImageView( ImageView && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_imageView( VULKAN_HPP_NAMESPACE::exchange( rhs.m_imageView, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      ImageView & operator=( ImageView const & ) = delete;\n\n      ImageView & operator=( ImageView && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_imageView, rhs.m_imageView );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::ImageView const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_imageView;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::ImageView() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_imageView;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_imageView )\n        {\n          getDispatcher()->vkDestroyImageView(\n            static_cast<VkDevice>( m_device ), static_cast<VkImageView>( m_imageView ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device     = nullptr;\n        m_imageView  = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::ImageView release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_imageView, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ImageView & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_imageView, rhs.m_imageView );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_NVX_image_view_handle ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ImageViewAddressPropertiesNVX getAddressNVX() const;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device     = {};\n      VULKAN_HPP_NAMESPACE::ImageView                                                   m_imageView  = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ImageView>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class IndirectCommandsLayoutEXT\n    {\n    public:\n      using CType   = VkIndirectCommandsLayoutEXT;\n      using CppType = VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eIndirectCommandsLayoutEXT;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      IndirectCommandsLayoutEXT( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                                 VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoEXT const &               createInfo,\n                                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createIndirectCommandsLayoutEXT( createInfo, allocator );\n      }\n#  endif\n\n      IndirectCommandsLayoutEXT( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                                 VkIndirectCommandsLayoutEXT                                                     indirectCommandsLayout,\n                                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_indirectCommandsLayout( indirectCommandsLayout )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      IndirectCommandsLayoutEXT( std::nullptr_t ) {}\n\n      ~IndirectCommandsLayoutEXT()\n      {\n        clear();\n      }\n\n      IndirectCommandsLayoutEXT()                                    = delete;\n      IndirectCommandsLayoutEXT( IndirectCommandsLayoutEXT const & ) = delete;\n\n      IndirectCommandsLayoutEXT( IndirectCommandsLayoutEXT && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_indirectCommandsLayout( VULKAN_HPP_NAMESPACE::exchange( rhs.m_indirectCommandsLayout, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      IndirectCommandsLayoutEXT & operator=( IndirectCommandsLayoutEXT const & ) = delete;\n\n      IndirectCommandsLayoutEXT & operator=( IndirectCommandsLayoutEXT && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_indirectCommandsLayout, rhs.m_indirectCommandsLayout );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_indirectCommandsLayout;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_indirectCommandsLayout;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_indirectCommandsLayout )\n        {\n          getDispatcher()->vkDestroyIndirectCommandsLayoutEXT( static_cast<VkDevice>( m_device ),\n                                                               static_cast<VkIndirectCommandsLayoutEXT>( m_indirectCommandsLayout ),\n                                                               reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device                 = nullptr;\n        m_indirectCommandsLayout = nullptr;\n        m_allocator              = nullptr;\n        m_dispatcher             = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_indirectCommandsLayout, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::IndirectCommandsLayoutEXT & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_indirectCommandsLayout, rhs.m_indirectCommandsLayout );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device                 = {};\n      VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT                                   m_indirectCommandsLayout = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator              = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher             = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::IndirectCommandsLayoutEXT>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class IndirectCommandsLayoutNV\n    {\n    public:\n      using CType   = VkIndirectCommandsLayoutNV;\n      using CppType = VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eIndirectCommandsLayoutNV;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      IndirectCommandsLayoutNV( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                                VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoNV const &                createInfo,\n                                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createIndirectCommandsLayoutNV( createInfo, allocator );\n      }\n#  endif\n\n      IndirectCommandsLayoutNV( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                                VkIndirectCommandsLayoutNV                                                      indirectCommandsLayout,\n                                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_indirectCommandsLayout( indirectCommandsLayout )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      IndirectCommandsLayoutNV( std::nullptr_t ) {}\n\n      ~IndirectCommandsLayoutNV()\n      {\n        clear();\n      }\n\n      IndirectCommandsLayoutNV()                                   = delete;\n      IndirectCommandsLayoutNV( IndirectCommandsLayoutNV const & ) = delete;\n\n      IndirectCommandsLayoutNV( IndirectCommandsLayoutNV && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_indirectCommandsLayout( VULKAN_HPP_NAMESPACE::exchange( rhs.m_indirectCommandsLayout, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      IndirectCommandsLayoutNV & operator=( IndirectCommandsLayoutNV const & ) = delete;\n\n      IndirectCommandsLayoutNV & operator=( IndirectCommandsLayoutNV && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_indirectCommandsLayout, rhs.m_indirectCommandsLayout );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_indirectCommandsLayout;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_indirectCommandsLayout;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_indirectCommandsLayout )\n        {\n          getDispatcher()->vkDestroyIndirectCommandsLayoutNV( static_cast<VkDevice>( m_device ),\n                                                              static_cast<VkIndirectCommandsLayoutNV>( m_indirectCommandsLayout ),\n                                                              reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device                 = nullptr;\n        m_indirectCommandsLayout = nullptr;\n        m_allocator              = nullptr;\n        m_dispatcher             = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_indirectCommandsLayout, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::IndirectCommandsLayoutNV & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_indirectCommandsLayout, rhs.m_indirectCommandsLayout );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device                 = {};\n      VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV                                    m_indirectCommandsLayout = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator              = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher             = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::IndirectCommandsLayoutNV>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class IndirectExecutionSetEXT\n    {\n    public:\n      using CType   = VkIndirectExecutionSetEXT;\n      using CppType = VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eIndirectExecutionSetEXT;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      IndirectExecutionSetEXT( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                               VULKAN_HPP_NAMESPACE::IndirectExecutionSetCreateInfoEXT const &                 createInfo,\n                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createIndirectExecutionSetEXT( createInfo, allocator );\n      }\n#  endif\n\n      IndirectExecutionSetEXT( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                               VkIndirectExecutionSetEXT                                                       indirectExecutionSet,\n                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_indirectExecutionSet( indirectExecutionSet )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      IndirectExecutionSetEXT( std::nullptr_t ) {}\n\n      ~IndirectExecutionSetEXT()\n      {\n        clear();\n      }\n\n      IndirectExecutionSetEXT()                                  = delete;\n      IndirectExecutionSetEXT( IndirectExecutionSetEXT const & ) = delete;\n\n      IndirectExecutionSetEXT( IndirectExecutionSetEXT && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_indirectExecutionSet( VULKAN_HPP_NAMESPACE::exchange( rhs.m_indirectExecutionSet, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      IndirectExecutionSetEXT & operator=( IndirectExecutionSetEXT const & ) = delete;\n\n      IndirectExecutionSetEXT & operator=( IndirectExecutionSetEXT && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_indirectExecutionSet, rhs.m_indirectExecutionSet );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_indirectExecutionSet;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_indirectExecutionSet;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_indirectExecutionSet )\n        {\n          getDispatcher()->vkDestroyIndirectExecutionSetEXT( static_cast<VkDevice>( m_device ),\n                                                             static_cast<VkIndirectExecutionSetEXT>( m_indirectExecutionSet ),\n                                                             reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device               = nullptr;\n        m_indirectExecutionSet = nullptr;\n        m_allocator            = nullptr;\n        m_dispatcher           = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_indirectExecutionSet, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::IndirectExecutionSetEXT & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_indirectExecutionSet, rhs.m_indirectExecutionSet );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_EXT_device_generated_commands ===\n\n      void updatePipeline( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetPipelineEXT> const & executionSetWrites ) const\n        VULKAN_HPP_NOEXCEPT;\n\n      void updateShader( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetShaderEXT> const & executionSetWrites ) const\n        VULKAN_HPP_NOEXCEPT;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device               = {};\n      VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT                                     m_indirectExecutionSet = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator            = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher           = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::IndirectExecutionSetEXT>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class MicromapEXT\n    {\n    public:\n      using CType   = VkMicromapEXT;\n      using CppType = VULKAN_HPP_NAMESPACE::MicromapEXT;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eMicromapEXT;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      MicromapEXT( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                   VULKAN_HPP_NAMESPACE::MicromapCreateInfoEXT const &                             createInfo,\n                   VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createMicromapEXT( createInfo, allocator );\n      }\n#  endif\n\n      MicromapEXT( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                   VkMicromapEXT                                                                   micromap,\n                   VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_micromap( micromap )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      MicromapEXT( std::nullptr_t ) {}\n\n      ~MicromapEXT()\n      {\n        clear();\n      }\n\n      MicromapEXT()                      = delete;\n      MicromapEXT( MicromapEXT const & ) = delete;\n\n      MicromapEXT( MicromapEXT && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_micromap( VULKAN_HPP_NAMESPACE::exchange( rhs.m_micromap, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      MicromapEXT & operator=( MicromapEXT const & ) = delete;\n\n      MicromapEXT & operator=( MicromapEXT && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_micromap, rhs.m_micromap );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::MicromapEXT const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_micromap;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::MicromapEXT() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_micromap;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_micromap )\n        {\n          getDispatcher()->vkDestroyMicromapEXT(\n            static_cast<VkDevice>( m_device ), static_cast<VkMicromapEXT>( m_micromap ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device     = nullptr;\n        m_micromap   = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::MicromapEXT release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_micromap, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::MicromapEXT & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_micromap, rhs.m_micromap );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device     = {};\n      VULKAN_HPP_NAMESPACE::MicromapEXT                                                 m_micromap   = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::MicromapEXT>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class OpticalFlowSessionNV\n    {\n    public:\n      using CType   = VkOpticalFlowSessionNV;\n      using CppType = VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eOpticalFlowSessionNV;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      OpticalFlowSessionNV( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                            VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreateInfoNV const &                    createInfo,\n                            VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createOpticalFlowSessionNV( createInfo, allocator );\n      }\n#  endif\n\n      OpticalFlowSessionNV( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                            VkOpticalFlowSessionNV                                                          session,\n                            VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_session( session )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      OpticalFlowSessionNV( std::nullptr_t ) {}\n\n      ~OpticalFlowSessionNV()\n      {\n        clear();\n      }\n\n      OpticalFlowSessionNV()                               = delete;\n      OpticalFlowSessionNV( OpticalFlowSessionNV const & ) = delete;\n\n      OpticalFlowSessionNV( OpticalFlowSessionNV && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_session( VULKAN_HPP_NAMESPACE::exchange( rhs.m_session, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      OpticalFlowSessionNV & operator=( OpticalFlowSessionNV const & ) = delete;\n\n      OpticalFlowSessionNV & operator=( OpticalFlowSessionNV && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_session, rhs.m_session );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_session;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_session;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_session )\n        {\n          getDispatcher()->vkDestroyOpticalFlowSessionNV( static_cast<VkDevice>( m_device ),\n                                                          static_cast<VkOpticalFlowSessionNV>( m_session ),\n                                                          reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device     = nullptr;\n        m_session    = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_session, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::OpticalFlowSessionNV & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_session, rhs.m_session );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_NV_optical_flow ===\n\n      void bindImage( VULKAN_HPP_NAMESPACE::OpticalFlowSessionBindingPointNV bindingPoint,\n                      VULKAN_HPP_NAMESPACE::ImageView                        view,\n                      VULKAN_HPP_NAMESPACE::ImageLayout                      layout ) const;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device     = {};\n      VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV                                        m_session    = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::OpticalFlowSessionNV>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class PerformanceConfigurationINTEL\n    {\n    public:\n      using CType   = VkPerformanceConfigurationINTEL;\n      using CppType = VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::ePerformanceConfigurationINTEL;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      PerformanceConfigurationINTEL( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &        device,\n                                     VULKAN_HPP_NAMESPACE::PerformanceConfigurationAcquireInfoINTEL const & acquireInfo )\n      {\n        *this = device.acquirePerformanceConfigurationINTEL( acquireInfo );\n      }\n#  endif\n\n      PerformanceConfigurationINTEL( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const & device, VkPerformanceConfigurationINTEL configuration )\n        : m_device( device ), m_configuration( configuration ), m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      PerformanceConfigurationINTEL( std::nullptr_t ) {}\n\n      ~PerformanceConfigurationINTEL()\n      {\n        clear();\n      }\n\n      PerformanceConfigurationINTEL()                                        = delete;\n      PerformanceConfigurationINTEL( PerformanceConfigurationINTEL const & ) = delete;\n\n      PerformanceConfigurationINTEL( PerformanceConfigurationINTEL && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_configuration( VULKAN_HPP_NAMESPACE::exchange( rhs.m_configuration, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      PerformanceConfigurationINTEL & operator=( PerformanceConfigurationINTEL const & ) = delete;\n\n      PerformanceConfigurationINTEL & operator=( PerformanceConfigurationINTEL && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_configuration, rhs.m_configuration );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_configuration;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_configuration;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_configuration )\n        {\n          getDispatcher()->vkReleasePerformanceConfigurationINTEL( static_cast<VkDevice>( m_device ),\n                                                                   static_cast<VkPerformanceConfigurationINTEL>( m_configuration ) );\n        }\n        m_device        = nullptr;\n        m_configuration = nullptr;\n        m_dispatcher    = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL release()\n      {\n        m_device     = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_configuration, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PerformanceConfigurationINTEL & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_configuration, rhs.m_configuration );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device        = {};\n      VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL                               m_configuration = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher    = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PerformanceConfigurationINTEL>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class PipelineCache\n    {\n    public:\n      using CType   = VkPipelineCache;\n      using CppType = VULKAN_HPP_NAMESPACE::PipelineCache;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::ePipelineCache;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePipelineCache;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      PipelineCache( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                     VULKAN_HPP_NAMESPACE::PipelineCacheCreateInfo const &                           createInfo,\n                     VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createPipelineCache( createInfo, allocator );\n      }\n#  endif\n\n      PipelineCache( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                     VkPipelineCache                                                                 pipelineCache,\n                     VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_pipelineCache( pipelineCache )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      PipelineCache( std::nullptr_t ) {}\n\n      ~PipelineCache()\n      {\n        clear();\n      }\n\n      PipelineCache()                        = delete;\n      PipelineCache( PipelineCache const & ) = delete;\n\n      PipelineCache( PipelineCache && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_pipelineCache( VULKAN_HPP_NAMESPACE::exchange( rhs.m_pipelineCache, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      PipelineCache & operator=( PipelineCache const & ) = delete;\n\n      PipelineCache & operator=( PipelineCache && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_pipelineCache, rhs.m_pipelineCache );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::PipelineCache const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_pipelineCache;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::PipelineCache() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_pipelineCache;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_pipelineCache )\n        {\n          getDispatcher()->vkDestroyPipelineCache( static_cast<VkDevice>( m_device ),\n                                                   static_cast<VkPipelineCache>( m_pipelineCache ),\n                                                   reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device        = nullptr;\n        m_pipelineCache = nullptr;\n        m_allocator     = nullptr;\n        m_dispatcher    = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::PipelineCache release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_pipelineCache, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_pipelineCache, rhs.m_pipelineCache );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_VERSION_1_0 ===\n\n      VULKAN_HPP_NODISCARD std::vector<uint8_t> getData() const;\n\n      void merge( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::PipelineCache> const & srcCaches ) const;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device        = {};\n      VULKAN_HPP_NAMESPACE::PipelineCache                                               m_pipelineCache = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator     = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher    = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class Pipeline\n    {\n    public:\n      using CType   = VkPipeline;\n      using CppType = VULKAN_HPP_NAMESPACE::Pipeline;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::ePipeline;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePipeline;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      Pipeline( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                                              device,\n                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n                VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo const &                                                      createInfo,\n                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                              allocator = nullptr )\n      {\n        *this = device.createComputePipeline( pipelineCache, createInfo, allocator );\n      }\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n#    if defined( VK_ENABLE_BETA_EXTENSIONS )\n      Pipeline( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                                              device,\n                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n                VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX const &                                           createInfo,\n                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                              allocator = nullptr )\n      {\n        *this = device.createExecutionGraphPipelineAMDX( pipelineCache, createInfo, allocator );\n      }\n#    endif /*VK_ENABLE_BETA_EXTENSIONS*/\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      Pipeline( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                                              device,\n                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n                VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo const &                                                     createInfo,\n                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                              allocator = nullptr )\n      {\n        *this = device.createGraphicsPipeline( pipelineCache, createInfo, allocator );\n      }\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      Pipeline( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                                                     device,\n                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeferredOperationKHR> const & deferredOperation,\n                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &        pipelineCache,\n                VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR const &                                                       createInfo,\n                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                     allocator = nullptr )\n      {\n        *this = device.createRayTracingPipelineKHR( deferredOperation, pipelineCache, createInfo, allocator );\n      }\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      Pipeline( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                                              device,\n                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n                VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV const &                                                 createInfo,\n                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                              allocator = nullptr )\n      {\n        *this = device.createRayTracingPipelineNV( pipelineCache, createInfo, allocator );\n      }\n#  endif\n\n      Pipeline( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                VkPipeline                                                                      pipeline,\n                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator   = nullptr,\n                VULKAN_HPP_NAMESPACE::Result                                                    successCode = VULKAN_HPP_NAMESPACE::Result::eSuccess )\n        : m_device( device )\n        , m_pipeline( pipeline )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_constructorSuccessCode( successCode )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      Pipeline( std::nullptr_t ) {}\n\n      ~Pipeline()\n      {\n        clear();\n      }\n\n      Pipeline()                   = delete;\n      Pipeline( Pipeline const & ) = delete;\n\n      Pipeline( Pipeline && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_pipeline( VULKAN_HPP_NAMESPACE::exchange( rhs.m_pipeline, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_constructorSuccessCode( VULKAN_HPP_NAMESPACE::exchange( rhs.m_constructorSuccessCode, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      Pipeline & operator=( Pipeline const & ) = delete;\n\n      Pipeline & operator=( Pipeline && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_pipeline, rhs.m_pipeline );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_constructorSuccessCode, rhs.m_constructorSuccessCode );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::Pipeline const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_pipeline;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::Pipeline() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_pipeline;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_pipeline )\n        {\n          getDispatcher()->vkDestroyPipeline(\n            static_cast<VkDevice>( m_device ), static_cast<VkPipeline>( m_pipeline ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device                 = nullptr;\n        m_pipeline               = nullptr;\n        m_allocator              = nullptr;\n        m_constructorSuccessCode = VULKAN_HPP_NAMESPACE::Result::eErrorUnknown;\n        m_dispatcher             = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::Pipeline release()\n      {\n        m_device                 = nullptr;\n        m_allocator              = nullptr;\n        m_constructorSuccessCode = VULKAN_HPP_NAMESPACE::Result::eErrorUnknown;\n        m_dispatcher             = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_pipeline, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Result getConstructorSuccessCode() const\n      {\n        return m_constructorSuccessCode;\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_pipeline, rhs.m_pipeline );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_constructorSuccessCode, rhs.m_constructorSuccessCode );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_AMD_shader_info ===\n\n      VULKAN_HPP_NODISCARD std::vector<uint8_t> getShaderInfoAMD( VULKAN_HPP_NAMESPACE::ShaderStageFlagBits shaderStage,\n                                                                  VULKAN_HPP_NAMESPACE::ShaderInfoTypeAMD   infoType ) const;\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n      //=== VK_AMDX_shader_enqueue ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineScratchSizeAMDX getExecutionGraphScratchSizeAMDX() const;\n\n      VULKAN_HPP_NODISCARD uint32_t getExecutionGraphNodeIndexAMDX( const VULKAN_HPP_NAMESPACE::PipelineShaderStageNodeCreateInfoAMDX & nodeInfo ) const;\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n      //=== VK_KHR_ray_tracing_pipeline ===\n\n      template <typename DataType>\n      VULKAN_HPP_NODISCARD std::vector<DataType> getRayTracingShaderGroupHandlesKHR( uint32_t firstGroup, uint32_t groupCount, size_t dataSize ) const;\n\n      template <typename DataType>\n      VULKAN_HPP_NODISCARD DataType getRayTracingShaderGroupHandleKHR( uint32_t firstGroup, uint32_t groupCount ) const;\n\n      template <typename DataType>\n      VULKAN_HPP_NODISCARD std::vector<DataType>\n                           getRayTracingCaptureReplayShaderGroupHandlesKHR( uint32_t firstGroup, uint32_t groupCount, size_t dataSize ) const;\n\n      template <typename DataType>\n      VULKAN_HPP_NODISCARD DataType getRayTracingCaptureReplayShaderGroupHandleKHR( uint32_t firstGroup, uint32_t groupCount ) const;\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceSize\n        getRayTracingShaderGroupStackSizeKHR( uint32_t group, VULKAN_HPP_NAMESPACE::ShaderGroupShaderKHR groupShader ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_NV_ray_tracing ===\n\n      template <typename DataType>\n      VULKAN_HPP_NODISCARD std::vector<DataType> getRayTracingShaderGroupHandlesNV( uint32_t firstGroup, uint32_t groupCount, size_t dataSize ) const;\n\n      template <typename DataType>\n      VULKAN_HPP_NODISCARD DataType getRayTracingShaderGroupHandleNV( uint32_t firstGroup, uint32_t groupCount ) const;\n\n      void compileDeferredNV( uint32_t shader ) const;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device                 = {};\n      VULKAN_HPP_NAMESPACE::Pipeline                                                    m_pipeline               = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator              = {};\n      VULKAN_HPP_NAMESPACE::Result                                                      m_constructorSuccessCode = VULKAN_HPP_NAMESPACE::Result::eErrorUnknown;\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher             = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class Pipelines : public std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline>\n    {\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      Pipelines( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                                              device,\n                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n                 VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo> const &                    createInfos,\n                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                              allocator = nullptr )\n      {\n        *this = device.createComputePipelines( pipelineCache, createInfos, allocator );\n      }\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n#    if defined( VK_ENABLE_BETA_EXTENSIONS )\n      Pipelines( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                                              device,\n                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n                 VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX> const &         createInfos,\n                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                              allocator = nullptr )\n      {\n        *this = device.createExecutionGraphPipelinesAMDX( pipelineCache, createInfos, allocator );\n      }\n#    endif /*VK_ENABLE_BETA_EXTENSIONS*/\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      Pipelines( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                                              device,\n                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n                 VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo> const &                   createInfos,\n                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                              allocator = nullptr )\n      {\n        *this = device.createGraphicsPipelines( pipelineCache, createInfos, allocator );\n      }\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      Pipelines( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                                                     device,\n                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeferredOperationKHR> const & deferredOperation,\n                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &        pipelineCache,\n                 VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR> const &                     createInfos,\n                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                     allocator = nullptr )\n      {\n        *this = device.createRayTracingPipelinesKHR( deferredOperation, pipelineCache, createInfos, allocator );\n      }\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      Pipelines( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                                              device,\n                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n                 VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV> const &               createInfos,\n                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                              allocator = nullptr )\n      {\n        *this = device.createRayTracingPipelinesNV( pipelineCache, createInfos, allocator );\n      }\n#  endif\n\n      Pipelines( std::nullptr_t ) {}\n\n      Pipelines()                                = delete;\n      Pipelines( Pipelines const & )             = delete;\n      Pipelines( Pipelines && rhs )              = default;\n      Pipelines & operator=( Pipelines const & ) = delete;\n      Pipelines & operator=( Pipelines && rhs )  = default;\n\n    private:\n      Pipelines( std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline> && rhs )\n      {\n        std::swap( *this, rhs );\n      }\n    };\n\n    class PipelineBinaryKHR\n    {\n    public:\n      using CType   = VkPipelineBinaryKHR;\n      using CppType = VULKAN_HPP_NAMESPACE::PipelineBinaryKHR;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::ePipelineBinaryKHR;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n    public:\n      PipelineBinaryKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                         VkPipelineBinaryKHR                                                             pipelineBinary,\n                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator   = nullptr,\n                         VULKAN_HPP_NAMESPACE::Result                                                    successCode = VULKAN_HPP_NAMESPACE::Result::eSuccess )\n        : m_device( device )\n        , m_pipelineBinary( pipelineBinary )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_constructorSuccessCode( successCode )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      PipelineBinaryKHR( std::nullptr_t ) {}\n\n      ~PipelineBinaryKHR()\n      {\n        clear();\n      }\n\n      PipelineBinaryKHR()                            = delete;\n      PipelineBinaryKHR( PipelineBinaryKHR const & ) = delete;\n\n      PipelineBinaryKHR( PipelineBinaryKHR && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_pipelineBinary( VULKAN_HPP_NAMESPACE::exchange( rhs.m_pipelineBinary, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_constructorSuccessCode( VULKAN_HPP_NAMESPACE::exchange( rhs.m_constructorSuccessCode, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      PipelineBinaryKHR & operator=( PipelineBinaryKHR const & ) = delete;\n\n      PipelineBinaryKHR & operator=( PipelineBinaryKHR && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_pipelineBinary, rhs.m_pipelineBinary );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_constructorSuccessCode, rhs.m_constructorSuccessCode );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::PipelineBinaryKHR const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_pipelineBinary;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::PipelineBinaryKHR() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_pipelineBinary;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_pipelineBinary )\n        {\n          getDispatcher()->vkDestroyPipelineBinaryKHR( static_cast<VkDevice>( m_device ),\n                                                       static_cast<VkPipelineBinaryKHR>( m_pipelineBinary ),\n                                                       reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device                 = nullptr;\n        m_pipelineBinary         = nullptr;\n        m_allocator              = nullptr;\n        m_constructorSuccessCode = VULKAN_HPP_NAMESPACE::Result::eErrorUnknown;\n        m_dispatcher             = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::PipelineBinaryKHR release()\n      {\n        m_device                 = nullptr;\n        m_allocator              = nullptr;\n        m_constructorSuccessCode = VULKAN_HPP_NAMESPACE::Result::eErrorUnknown;\n        m_dispatcher             = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_pipelineBinary, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Result getConstructorSuccessCode() const\n      {\n        return m_constructorSuccessCode;\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineBinaryKHR & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_pipelineBinary, rhs.m_pipelineBinary );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_constructorSuccessCode, rhs.m_constructorSuccessCode );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device                 = {};\n      VULKAN_HPP_NAMESPACE::PipelineBinaryKHR                                           m_pipelineBinary         = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator              = {};\n      VULKAN_HPP_NAMESPACE::Result                                                      m_constructorSuccessCode = VULKAN_HPP_NAMESPACE::Result::eErrorUnknown;\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher             = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineBinaryKHR>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class PipelineBinaryKHRs : public std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineBinaryKHR>\n    {\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      PipelineBinaryKHRs( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                          VULKAN_HPP_NAMESPACE::PipelineBinaryCreateInfoKHR const &                       createInfo,\n                          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createPipelineBinariesKHR( createInfo, allocator );\n      }\n#  endif\n\n      PipelineBinaryKHRs( std::nullptr_t ) {}\n\n      PipelineBinaryKHRs()                                         = delete;\n      PipelineBinaryKHRs( PipelineBinaryKHRs const & )             = delete;\n      PipelineBinaryKHRs( PipelineBinaryKHRs && rhs )              = default;\n      PipelineBinaryKHRs & operator=( PipelineBinaryKHRs const & ) = delete;\n      PipelineBinaryKHRs & operator=( PipelineBinaryKHRs && rhs )  = default;\n\n    private:\n      PipelineBinaryKHRs( std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineBinaryKHR> && rhs )\n      {\n        std::swap( *this, rhs );\n      }\n    };\n\n    class PipelineLayout\n    {\n    public:\n      using CType   = VkPipelineLayout;\n      using CppType = VULKAN_HPP_NAMESPACE::PipelineLayout;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::ePipelineLayout;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePipelineLayout;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      PipelineLayout( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                      VULKAN_HPP_NAMESPACE::PipelineLayoutCreateInfo const &                          createInfo,\n                      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createPipelineLayout( createInfo, allocator );\n      }\n#  endif\n\n      PipelineLayout( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                      VkPipelineLayout                                                                pipelineLayout,\n                      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_pipelineLayout( pipelineLayout )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      PipelineLayout( std::nullptr_t ) {}\n\n      ~PipelineLayout()\n      {\n        clear();\n      }\n\n      PipelineLayout()                         = delete;\n      PipelineLayout( PipelineLayout const & ) = delete;\n\n      PipelineLayout( PipelineLayout && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_pipelineLayout( VULKAN_HPP_NAMESPACE::exchange( rhs.m_pipelineLayout, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      PipelineLayout & operator=( PipelineLayout const & ) = delete;\n\n      PipelineLayout & operator=( PipelineLayout && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_pipelineLayout, rhs.m_pipelineLayout );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::PipelineLayout const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_pipelineLayout;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::PipelineLayout() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_pipelineLayout;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_pipelineLayout )\n        {\n          getDispatcher()->vkDestroyPipelineLayout( static_cast<VkDevice>( m_device ),\n                                                    static_cast<VkPipelineLayout>( m_pipelineLayout ),\n                                                    reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device         = nullptr;\n        m_pipelineLayout = nullptr;\n        m_allocator      = nullptr;\n        m_dispatcher     = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::PipelineLayout release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_pipelineLayout, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineLayout & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_pipelineLayout, rhs.m_pipelineLayout );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device         = {};\n      VULKAN_HPP_NAMESPACE::PipelineLayout                                              m_pipelineLayout = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator      = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher     = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineLayout>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class PrivateDataSlot\n    {\n    public:\n      using CType   = VkPrivateDataSlot;\n      using CppType = VULKAN_HPP_NAMESPACE::PrivateDataSlot;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::ePrivateDataSlot;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      PrivateDataSlot( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                       VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo const &                         createInfo,\n                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createPrivateDataSlot( createInfo, allocator );\n      }\n#  endif\n\n      PrivateDataSlot( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                       VkPrivateDataSlot                                                               privateDataSlot,\n                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_privateDataSlot( privateDataSlot )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      PrivateDataSlot( std::nullptr_t ) {}\n\n      ~PrivateDataSlot()\n      {\n        clear();\n      }\n\n      PrivateDataSlot()                          = delete;\n      PrivateDataSlot( PrivateDataSlot const & ) = delete;\n\n      PrivateDataSlot( PrivateDataSlot && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_privateDataSlot( VULKAN_HPP_NAMESPACE::exchange( rhs.m_privateDataSlot, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      PrivateDataSlot & operator=( PrivateDataSlot const & ) = delete;\n\n      PrivateDataSlot & operator=( PrivateDataSlot && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_privateDataSlot, rhs.m_privateDataSlot );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::PrivateDataSlot const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_privateDataSlot;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::PrivateDataSlot() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_privateDataSlot;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_privateDataSlot )\n        {\n          getDispatcher()->vkDestroyPrivateDataSlot( static_cast<VkDevice>( m_device ),\n                                                     static_cast<VkPrivateDataSlot>( m_privateDataSlot ),\n                                                     reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device          = nullptr;\n        m_privateDataSlot = nullptr;\n        m_allocator       = nullptr;\n        m_dispatcher      = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::PrivateDataSlot release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_privateDataSlot, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PrivateDataSlot & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_privateDataSlot, rhs.m_privateDataSlot );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device          = {};\n      VULKAN_HPP_NAMESPACE::PrivateDataSlot                                             m_privateDataSlot = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator       = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher      = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PrivateDataSlot>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class QueryPool\n    {\n    public:\n      using CType   = VkQueryPool;\n      using CppType = VULKAN_HPP_NAMESPACE::QueryPool;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eQueryPool;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eQueryPool;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      QueryPool( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                 VULKAN_HPP_NAMESPACE::QueryPoolCreateInfo const &                               createInfo,\n                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createQueryPool( createInfo, allocator );\n      }\n#  endif\n\n      QueryPool( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                 VkQueryPool                                                                     queryPool,\n                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_queryPool( queryPool )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      QueryPool( std::nullptr_t ) {}\n\n      ~QueryPool()\n      {\n        clear();\n      }\n\n      QueryPool()                    = delete;\n      QueryPool( QueryPool const & ) = delete;\n\n      QueryPool( QueryPool && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_queryPool( VULKAN_HPP_NAMESPACE::exchange( rhs.m_queryPool, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      QueryPool & operator=( QueryPool const & ) = delete;\n\n      QueryPool & operator=( QueryPool && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_queryPool, rhs.m_queryPool );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::QueryPool const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_queryPool;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::QueryPool() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_queryPool;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_queryPool )\n        {\n          getDispatcher()->vkDestroyQueryPool(\n            static_cast<VkDevice>( m_device ), static_cast<VkQueryPool>( m_queryPool ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device     = nullptr;\n        m_queryPool  = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::QueryPool release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_queryPool, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::QueryPool & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_queryPool, rhs.m_queryPool );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_VERSION_1_0 ===\n\n      template <typename DataType>\n      VULKAN_HPP_NODISCARD std::pair<VULKAN_HPP_NAMESPACE::Result, std::vector<DataType>>\n                           getResults( uint32_t                                     firstQuery,\n                                       uint32_t                                     queryCount,\n                                       size_t                                       dataSize,\n                                       VULKAN_HPP_NAMESPACE::DeviceSize             stride,\n                                       VULKAN_HPP_NAMESPACE::QueryResultFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const;\n\n      template <typename DataType>\n      VULKAN_HPP_NODISCARD std::pair<VULKAN_HPP_NAMESPACE::Result, DataType>\n                           getResult( uint32_t                                     firstQuery,\n                                      uint32_t                                     queryCount,\n                                      VULKAN_HPP_NAMESPACE::DeviceSize             stride,\n                                      VULKAN_HPP_NAMESPACE::QueryResultFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const;\n\n      //=== VK_VERSION_1_2 ===\n\n      void reset( uint32_t firstQuery, uint32_t queryCount ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_EXT_host_query_reset ===\n\n      void resetEXT( uint32_t firstQuery, uint32_t queryCount ) const VULKAN_HPP_NOEXCEPT;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device     = {};\n      VULKAN_HPP_NAMESPACE::QueryPool                                                   m_queryPool  = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::QueryPool>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class Queue\n    {\n    public:\n      using CType   = VkQueue;\n      using CppType = VULKAN_HPP_NAMESPACE::Queue;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eQueue;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eQueue;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      Queue( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const & device, uint32_t queueFamilyIndex, uint32_t queueIndex )\n      {\n        *this = device.getQueue( queueFamilyIndex, queueIndex );\n      }\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      Queue( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const & device, VULKAN_HPP_NAMESPACE::DeviceQueueInfo2 const & queueInfo )\n      {\n        *this = device.getQueue2( queueInfo );\n      }\n#  endif\n\n      Queue( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const & device, VkQueue queue ) : m_queue( queue ), m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      Queue( std::nullptr_t ) {}\n\n      ~Queue()\n      {\n        clear();\n      }\n\n      Queue() = delete;\n\n      Queue( Queue const & rhs ) : m_queue( rhs.m_queue ), m_dispatcher( rhs.m_dispatcher ) {}\n\n      Queue( Queue && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_queue( VULKAN_HPP_NAMESPACE::exchange( rhs.m_queue, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      Queue & operator=( Queue const & rhs )\n      {\n        m_queue      = rhs.m_queue;\n        m_dispatcher = rhs.m_dispatcher;\n        return *this;\n      }\n\n      Queue & operator=( Queue && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_queue, rhs.m_queue );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::Queue const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_queue;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::Queue() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_queue;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        m_queue      = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::Queue release()\n      {\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_queue, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Queue & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_queue, rhs.m_queue );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_VERSION_1_0 ===\n\n      void submit( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SubmitInfo> const & submits,\n                   VULKAN_HPP_NAMESPACE::Fence fence                                                VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const;\n\n      void waitIdle() const;\n\n      void bindSparse( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindSparseInfo> const & bindInfo,\n                       VULKAN_HPP_NAMESPACE::Fence fence                                                    VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const;\n\n      //=== VK_VERSION_1_3 ===\n\n      void submit2( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SubmitInfo2> const & submits,\n                    VULKAN_HPP_NAMESPACE::Fence fence                                                 VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const;\n\n      //=== VK_KHR_swapchain ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result presentKHR( const VULKAN_HPP_NAMESPACE::PresentInfoKHR & presentInfo ) const;\n\n      //=== VK_EXT_debug_utils ===\n\n      void beginDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT & labelInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void endDebugUtilsLabelEXT() const VULKAN_HPP_NOEXCEPT;\n\n      void insertDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT & labelInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_NV_device_diagnostic_checkpoints ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::CheckpointDataNV> getCheckpointDataNV() const;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::CheckpointData2NV> getCheckpointData2NV() const;\n\n      //=== VK_INTEL_performance_query ===\n\n      void setPerformanceConfigurationINTEL( VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration ) const;\n\n      //=== VK_KHR_synchronization2 ===\n\n      void submit2KHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SubmitInfo2> const & submits,\n                       VULKAN_HPP_NAMESPACE::Fence fence                                                 VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const;\n\n      //=== VK_NV_low_latency2 ===\n\n      void notifyOutOfBandNV( const VULKAN_HPP_NAMESPACE::OutOfBandQueueTypeInfoNV & queueTypeInfo ) const VULKAN_HPP_NOEXCEPT;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Queue                                                       m_queue      = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Queue>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class RenderPass\n    {\n    public:\n      using CType   = VkRenderPass;\n      using CppType = VULKAN_HPP_NAMESPACE::RenderPass;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eRenderPass;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eRenderPass;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      RenderPass( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                  VULKAN_HPP_NAMESPACE::RenderPassCreateInfo const &                              createInfo,\n                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createRenderPass( createInfo, allocator );\n      }\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      RenderPass( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                  VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 const &                             createInfo,\n                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createRenderPass2( createInfo, allocator );\n      }\n#  endif\n\n      RenderPass( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                  VkRenderPass                                                                    renderPass,\n                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_renderPass( renderPass )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      RenderPass( std::nullptr_t ) {}\n\n      ~RenderPass()\n      {\n        clear();\n      }\n\n      RenderPass()                     = delete;\n      RenderPass( RenderPass const & ) = delete;\n\n      RenderPass( RenderPass && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_renderPass( VULKAN_HPP_NAMESPACE::exchange( rhs.m_renderPass, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      RenderPass & operator=( RenderPass const & ) = delete;\n\n      RenderPass & operator=( RenderPass && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_renderPass, rhs.m_renderPass );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::RenderPass const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_renderPass;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::RenderPass() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_renderPass;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_renderPass )\n        {\n          getDispatcher()->vkDestroyRenderPass(\n            static_cast<VkDevice>( m_device ), static_cast<VkRenderPass>( m_renderPass ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device     = nullptr;\n        m_renderPass = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::RenderPass release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_renderPass, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::RenderPass & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_renderPass, rhs.m_renderPass );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_VERSION_1_0 ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Extent2D getRenderAreaGranularity() const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_HUAWEI_subpass_shading ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Extent2D getSubpassShadingMaxWorkgroupSizeHUAWEI() const;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device     = {};\n      VULKAN_HPP_NAMESPACE::RenderPass                                                  m_renderPass = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::RenderPass>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class Sampler\n    {\n    public:\n      using CType   = VkSampler;\n      using CppType = VULKAN_HPP_NAMESPACE::Sampler;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eSampler;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSampler;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      Sampler( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n               VULKAN_HPP_NAMESPACE::SamplerCreateInfo const &                                 createInfo,\n               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createSampler( createInfo, allocator );\n      }\n#  endif\n\n      Sampler( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n               VkSampler                                                                       sampler,\n               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_sampler( sampler )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      Sampler( std::nullptr_t ) {}\n\n      ~Sampler()\n      {\n        clear();\n      }\n\n      Sampler()                  = delete;\n      Sampler( Sampler const & ) = delete;\n\n      Sampler( Sampler && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_sampler( VULKAN_HPP_NAMESPACE::exchange( rhs.m_sampler, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      Sampler & operator=( Sampler const & ) = delete;\n\n      Sampler & operator=( Sampler && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_sampler, rhs.m_sampler );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::Sampler const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_sampler;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::Sampler() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_sampler;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_sampler )\n        {\n          getDispatcher()->vkDestroySampler(\n            static_cast<VkDevice>( m_device ), static_cast<VkSampler>( m_sampler ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device     = nullptr;\n        m_sampler    = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::Sampler release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_sampler, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Sampler & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_sampler, rhs.m_sampler );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device     = {};\n      VULKAN_HPP_NAMESPACE::Sampler                                                     m_sampler    = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Sampler>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class SamplerYcbcrConversion\n    {\n    public:\n      using CType   = VkSamplerYcbcrConversion;\n      using CppType = VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eSamplerYcbcrConversion;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSamplerYcbcrConversion;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      SamplerYcbcrConversion( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                              VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo const &                  createInfo,\n                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createSamplerYcbcrConversion( createInfo, allocator );\n      }\n#  endif\n\n      SamplerYcbcrConversion( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                              VkSamplerYcbcrConversion                                                        ycbcrConversion,\n                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_ycbcrConversion( ycbcrConversion )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      SamplerYcbcrConversion( std::nullptr_t ) {}\n\n      ~SamplerYcbcrConversion()\n      {\n        clear();\n      }\n\n      SamplerYcbcrConversion()                                 = delete;\n      SamplerYcbcrConversion( SamplerYcbcrConversion const & ) = delete;\n\n      SamplerYcbcrConversion( SamplerYcbcrConversion && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_ycbcrConversion( VULKAN_HPP_NAMESPACE::exchange( rhs.m_ycbcrConversion, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      SamplerYcbcrConversion & operator=( SamplerYcbcrConversion const & ) = delete;\n\n      SamplerYcbcrConversion & operator=( SamplerYcbcrConversion && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_ycbcrConversion, rhs.m_ycbcrConversion );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_ycbcrConversion;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_ycbcrConversion;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_ycbcrConversion )\n        {\n          getDispatcher()->vkDestroySamplerYcbcrConversion( static_cast<VkDevice>( m_device ),\n                                                            static_cast<VkSamplerYcbcrConversion>( m_ycbcrConversion ),\n                                                            reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device          = nullptr;\n        m_ycbcrConversion = nullptr;\n        m_allocator       = nullptr;\n        m_dispatcher      = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_ycbcrConversion, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SamplerYcbcrConversion & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_ycbcrConversion, rhs.m_ycbcrConversion );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device          = {};\n      VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion                                      m_ycbcrConversion = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator       = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher      = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SamplerYcbcrConversion>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class Semaphore\n    {\n    public:\n      using CType   = VkSemaphore;\n      using CppType = VULKAN_HPP_NAMESPACE::Semaphore;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eSemaphore;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSemaphore;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      Semaphore( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                 VULKAN_HPP_NAMESPACE::SemaphoreCreateInfo const &                               createInfo,\n                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createSemaphore( createInfo, allocator );\n      }\n#  endif\n\n      Semaphore( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                 VkSemaphore                                                                     semaphore,\n                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_semaphore( semaphore )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      Semaphore( std::nullptr_t ) {}\n\n      ~Semaphore()\n      {\n        clear();\n      }\n\n      Semaphore()                    = delete;\n      Semaphore( Semaphore const & ) = delete;\n\n      Semaphore( Semaphore && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_semaphore( VULKAN_HPP_NAMESPACE::exchange( rhs.m_semaphore, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      Semaphore & operator=( Semaphore const & ) = delete;\n\n      Semaphore & operator=( Semaphore && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_semaphore, rhs.m_semaphore );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::Semaphore const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_semaphore;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::Semaphore() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_semaphore;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_semaphore )\n        {\n          getDispatcher()->vkDestroySemaphore(\n            static_cast<VkDevice>( m_device ), static_cast<VkSemaphore>( m_semaphore ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device     = nullptr;\n        m_semaphore  = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::Semaphore release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_semaphore, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Semaphore & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_semaphore, rhs.m_semaphore );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_VERSION_1_2 ===\n\n      VULKAN_HPP_NODISCARD uint64_t getCounterValue() const;\n\n      //=== VK_KHR_timeline_semaphore ===\n\n      VULKAN_HPP_NODISCARD uint64_t getCounterValueKHR() const;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device     = {};\n      VULKAN_HPP_NAMESPACE::Semaphore                                                   m_semaphore  = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Semaphore>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class ShaderEXT\n    {\n    public:\n      using CType   = VkShaderEXT;\n      using CppType = VULKAN_HPP_NAMESPACE::ShaderEXT;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eShaderEXT;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      ShaderEXT( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                 VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT const &                               createInfo,\n                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createShaderEXT( createInfo, allocator );\n      }\n#  endif\n\n      ShaderEXT( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                 VkShaderEXT                                                                     shader,\n                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator   = nullptr,\n                 VULKAN_HPP_NAMESPACE::Result                                                    successCode = VULKAN_HPP_NAMESPACE::Result::eSuccess )\n        : m_device( device )\n        , m_shader( shader )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_constructorSuccessCode( successCode )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      ShaderEXT( std::nullptr_t ) {}\n\n      ~ShaderEXT()\n      {\n        clear();\n      }\n\n      ShaderEXT()                    = delete;\n      ShaderEXT( ShaderEXT const & ) = delete;\n\n      ShaderEXT( ShaderEXT && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_shader( VULKAN_HPP_NAMESPACE::exchange( rhs.m_shader, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_constructorSuccessCode( VULKAN_HPP_NAMESPACE::exchange( rhs.m_constructorSuccessCode, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      ShaderEXT & operator=( ShaderEXT const & ) = delete;\n\n      ShaderEXT & operator=( ShaderEXT && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_shader, rhs.m_shader );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_constructorSuccessCode, rhs.m_constructorSuccessCode );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::ShaderEXT const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_shader;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::ShaderEXT() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_shader;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_shader )\n        {\n          getDispatcher()->vkDestroyShaderEXT(\n            static_cast<VkDevice>( m_device ), static_cast<VkShaderEXT>( m_shader ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device                 = nullptr;\n        m_shader                 = nullptr;\n        m_allocator              = nullptr;\n        m_constructorSuccessCode = VULKAN_HPP_NAMESPACE::Result::eErrorUnknown;\n        m_dispatcher             = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::ShaderEXT release()\n      {\n        m_device                 = nullptr;\n        m_allocator              = nullptr;\n        m_constructorSuccessCode = VULKAN_HPP_NAMESPACE::Result::eErrorUnknown;\n        m_dispatcher             = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_shader, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Result getConstructorSuccessCode() const\n      {\n        return m_constructorSuccessCode;\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ShaderEXT & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_shader, rhs.m_shader );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_constructorSuccessCode, rhs.m_constructorSuccessCode );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_EXT_shader_object ===\n\n      VULKAN_HPP_NODISCARD std::vector<uint8_t> getBinaryData() const;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device                 = {};\n      VULKAN_HPP_NAMESPACE::ShaderEXT                                                   m_shader                 = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator              = {};\n      VULKAN_HPP_NAMESPACE::Result                                                      m_constructorSuccessCode = VULKAN_HPP_NAMESPACE::Result::eErrorUnknown;\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher             = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ShaderEXT>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class ShaderEXTs : public std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ShaderEXT>\n    {\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      ShaderEXTs( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                     device,\n                  VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT> const & createInfos,\n                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>     allocator = nullptr )\n      {\n        *this = device.createShadersEXT( createInfos, allocator );\n      }\n#  endif\n\n      ShaderEXTs( std::nullptr_t ) {}\n\n      ShaderEXTs()                                 = delete;\n      ShaderEXTs( ShaderEXTs const & )             = delete;\n      ShaderEXTs( ShaderEXTs && rhs )              = default;\n      ShaderEXTs & operator=( ShaderEXTs const & ) = delete;\n      ShaderEXTs & operator=( ShaderEXTs && rhs )  = default;\n\n    private:\n      ShaderEXTs( std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ShaderEXT> && rhs )\n      {\n        std::swap( *this, rhs );\n      }\n    };\n\n    class ShaderModule\n    {\n    public:\n      using CType   = VkShaderModule;\n      using CppType = VULKAN_HPP_NAMESPACE::ShaderModule;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eShaderModule;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eShaderModule;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      ShaderModule( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                    VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo const &                            createInfo,\n                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createShaderModule( createInfo, allocator );\n      }\n#  endif\n\n      ShaderModule( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                    VkShaderModule                                                                  shaderModule,\n                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_shaderModule( shaderModule )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      ShaderModule( std::nullptr_t ) {}\n\n      ~ShaderModule()\n      {\n        clear();\n      }\n\n      ShaderModule()                       = delete;\n      ShaderModule( ShaderModule const & ) = delete;\n\n      ShaderModule( ShaderModule && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_shaderModule( VULKAN_HPP_NAMESPACE::exchange( rhs.m_shaderModule, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      ShaderModule & operator=( ShaderModule const & ) = delete;\n\n      ShaderModule & operator=( ShaderModule && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_shaderModule, rhs.m_shaderModule );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::ShaderModule const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_shaderModule;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::ShaderModule() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_shaderModule;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_shaderModule )\n        {\n          getDispatcher()->vkDestroyShaderModule(\n            static_cast<VkDevice>( m_device ), static_cast<VkShaderModule>( m_shaderModule ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device       = nullptr;\n        m_shaderModule = nullptr;\n        m_allocator    = nullptr;\n        m_dispatcher   = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::ShaderModule release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_shaderModule, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ShaderModule & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_shaderModule, rhs.m_shaderModule );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_EXT_shader_module_identifier ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ShaderModuleIdentifierEXT getIdentifierEXT() const VULKAN_HPP_NOEXCEPT;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device       = {};\n      VULKAN_HPP_NAMESPACE::ShaderModule                                                m_shaderModule = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator    = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher   = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ShaderModule>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class SurfaceKHR\n    {\n    public:\n      using CType   = VkSurfaceKHR;\n      using CppType = VULKAN_HPP_NAMESPACE::SurfaceKHR;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eSurfaceKHR;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSurfaceKHR;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n#    if defined( VK_USE_PLATFORM_ANDROID_KHR )\n      SurfaceKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &               instance,\n                  VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateInfoKHR const &                       createInfo,\n                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = instance.createAndroidSurfaceKHR( createInfo, allocator );\n      }\n#    endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n#    if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n      SurfaceKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &               instance,\n                  VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateInfoEXT const &                      createInfo,\n                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = instance.createDirectFBSurfaceEXT( createInfo, allocator );\n      }\n#    endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      SurfaceKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &               instance,\n                  VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateInfoKHR const &                       createInfo,\n                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = instance.createDisplayPlaneSurfaceKHR( createInfo, allocator );\n      }\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      SurfaceKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &               instance,\n                  VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateInfoEXT const &                      createInfo,\n                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = instance.createHeadlessSurfaceEXT( createInfo, allocator );\n      }\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n#    if defined( VK_USE_PLATFORM_IOS_MVK )\n      SurfaceKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &               instance,\n                  VULKAN_HPP_NAMESPACE::IOSSurfaceCreateInfoMVK const &                           createInfo,\n                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = instance.createIOSSurfaceMVK( createInfo, allocator );\n      }\n#    endif /*VK_USE_PLATFORM_IOS_MVK*/\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n#    if defined( VK_USE_PLATFORM_FUCHSIA )\n      SurfaceKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &               instance,\n                  VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateInfoFUCHSIA const &                 createInfo,\n                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = instance.createImagePipeSurfaceFUCHSIA( createInfo, allocator );\n      }\n#    endif /*VK_USE_PLATFORM_FUCHSIA*/\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n#    if defined( VK_USE_PLATFORM_MACOS_MVK )\n      SurfaceKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &               instance,\n                  VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateInfoMVK const &                         createInfo,\n                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = instance.createMacOSSurfaceMVK( createInfo, allocator );\n      }\n#    endif /*VK_USE_PLATFORM_MACOS_MVK*/\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n#    if defined( VK_USE_PLATFORM_METAL_EXT )\n      SurfaceKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &               instance,\n                  VULKAN_HPP_NAMESPACE::MetalSurfaceCreateInfoEXT const &                         createInfo,\n                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = instance.createMetalSurfaceEXT( createInfo, allocator );\n      }\n#    endif /*VK_USE_PLATFORM_METAL_EXT*/\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n#    if defined( VK_USE_PLATFORM_SCREEN_QNX )\n      SurfaceKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &               instance,\n                  VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateInfoQNX const &                        createInfo,\n                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = instance.createScreenSurfaceQNX( createInfo, allocator );\n      }\n#    endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n#    if defined( VK_USE_PLATFORM_GGP )\n      SurfaceKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &               instance,\n                  VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateInfoGGP const &              createInfo,\n                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = instance.createStreamDescriptorSurfaceGGP( createInfo, allocator );\n      }\n#    endif /*VK_USE_PLATFORM_GGP*/\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n#    if defined( VK_USE_PLATFORM_VI_NN )\n      SurfaceKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &               instance,\n                  VULKAN_HPP_NAMESPACE::ViSurfaceCreateInfoNN const &                             createInfo,\n                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = instance.createViSurfaceNN( createInfo, allocator );\n      }\n#    endif /*VK_USE_PLATFORM_VI_NN*/\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n#    if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n      SurfaceKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &               instance,\n                  VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateInfoKHR const &                       createInfo,\n                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = instance.createWaylandSurfaceKHR( createInfo, allocator );\n      }\n#    endif /*VK_USE_PLATFORM_WAYLAND_KHR*/\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n#    if defined( VK_USE_PLATFORM_WIN32_KHR )\n      SurfaceKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &               instance,\n                  VULKAN_HPP_NAMESPACE::Win32SurfaceCreateInfoKHR const &                         createInfo,\n                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = instance.createWin32SurfaceKHR( createInfo, allocator );\n      }\n#    endif /*VK_USE_PLATFORM_WIN32_KHR*/\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n#    if defined( VK_USE_PLATFORM_XCB_KHR )\n      SurfaceKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &               instance,\n                  VULKAN_HPP_NAMESPACE::XcbSurfaceCreateInfoKHR const &                           createInfo,\n                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = instance.createXcbSurfaceKHR( createInfo, allocator );\n      }\n#    endif /*VK_USE_PLATFORM_XCB_KHR*/\n#  endif\n\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n#    if defined( VK_USE_PLATFORM_XLIB_KHR )\n      SurfaceKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &               instance,\n                  VULKAN_HPP_NAMESPACE::XlibSurfaceCreateInfoKHR const &                          createInfo,\n                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = instance.createXlibSurfaceKHR( createInfo, allocator );\n      }\n#    endif /*VK_USE_PLATFORM_XLIB_KHR*/\n#  endif\n\n      SurfaceKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &               instance,\n                  VkSurfaceKHR                                                                    surface,\n                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_instance( instance )\n        , m_surface( surface )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( instance.getDispatcher() )\n      {\n      }\n\n      SurfaceKHR( std::nullptr_t ) {}\n\n      ~SurfaceKHR()\n      {\n        clear();\n      }\n\n      SurfaceKHR()                     = delete;\n      SurfaceKHR( SurfaceKHR const & ) = delete;\n\n      SurfaceKHR( SurfaceKHR && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_instance( VULKAN_HPP_NAMESPACE::exchange( rhs.m_instance, {} ) )\n        , m_surface( VULKAN_HPP_NAMESPACE::exchange( rhs.m_surface, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      SurfaceKHR & operator=( SurfaceKHR const & ) = delete;\n\n      SurfaceKHR & operator=( SurfaceKHR && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_instance, rhs.m_instance );\n          std::swap( m_surface, rhs.m_surface );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::SurfaceKHR const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_surface;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::SurfaceKHR() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_surface;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_surface )\n        {\n          getDispatcher()->vkDestroySurfaceKHR(\n            static_cast<VkInstance>( m_instance ), static_cast<VkSurfaceKHR>( m_surface ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_instance   = nullptr;\n        m_surface    = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::SurfaceKHR release()\n      {\n        m_instance   = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_surface, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Instance getInstance() const\n      {\n        return m_instance;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::InstanceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_instance, rhs.m_instance );\n        std::swap( m_surface, rhs.m_surface );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n    private:\n      VULKAN_HPP_NAMESPACE::Instance                                                      m_instance   = {};\n      VULKAN_HPP_NAMESPACE::SurfaceKHR                                                    m_surface    = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                   m_allocator  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::InstanceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class SwapchainKHR\n    {\n    public:\n      using CType   = VkSwapchainKHR;\n      using CppType = VULKAN_HPP_NAMESPACE::SwapchainKHR;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eSwapchainKHR;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSwapchainKHR;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      SwapchainKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                    VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR const &                            createInfo,\n                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createSwapchainKHR( createInfo, allocator );\n      }\n#  endif\n\n      SwapchainKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                    VkSwapchainKHR                                                                  swapchain,\n                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_swapchain( swapchain )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      SwapchainKHR( std::nullptr_t ) {}\n\n      ~SwapchainKHR()\n      {\n        clear();\n      }\n\n      SwapchainKHR()                       = delete;\n      SwapchainKHR( SwapchainKHR const & ) = delete;\n\n      SwapchainKHR( SwapchainKHR && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_swapchain( VULKAN_HPP_NAMESPACE::exchange( rhs.m_swapchain, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      SwapchainKHR & operator=( SwapchainKHR const & ) = delete;\n\n      SwapchainKHR & operator=( SwapchainKHR && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_swapchain, rhs.m_swapchain );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::SwapchainKHR const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_swapchain;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::SwapchainKHR() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_swapchain;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_swapchain )\n        {\n          getDispatcher()->vkDestroySwapchainKHR(\n            static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( m_swapchain ), reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device     = nullptr;\n        m_swapchain  = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::SwapchainKHR release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_swapchain, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SwapchainKHR & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_swapchain, rhs.m_swapchain );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_KHR_swapchain ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::Image> getImages() const;\n\n      VULKAN_HPP_NODISCARD std::pair<VULKAN_HPP_NAMESPACE::Result, uint32_t>\n                           acquireNextImage( uint64_t                                  timeout,\n                                             VULKAN_HPP_NAMESPACE::Semaphore semaphore VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,\n                                             VULKAN_HPP_NAMESPACE::Fence fence         VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const;\n\n      //=== VK_EXT_display_control ===\n\n      VULKAN_HPP_NODISCARD uint64_t getCounterEXT( VULKAN_HPP_NAMESPACE::SurfaceCounterFlagBitsEXT counter ) const;\n\n      //=== VK_GOOGLE_display_timing ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::RefreshCycleDurationGOOGLE getRefreshCycleDurationGOOGLE() const;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE> getPastPresentationTimingGOOGLE() const;\n\n      //=== VK_KHR_shared_presentable_image ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result getStatus() const;\n\n      //=== VK_AMD_display_native_hdr ===\n\n      void setLocalDimmingAMD( VULKAN_HPP_NAMESPACE::Bool32 localDimmingEnable ) const VULKAN_HPP_NOEXCEPT;\n\n      //=== VK_KHR_present_wait ===\n\n      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result waitForPresent( uint64_t presentId, uint64_t timeout ) const;\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n      //=== VK_EXT_full_screen_exclusive ===\n\n      void acquireFullScreenExclusiveModeEXT() const;\n\n      void releaseFullScreenExclusiveModeEXT() const;\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n      //=== VK_NV_low_latency2 ===\n\n      void setLatencySleepModeNV( const VULKAN_HPP_NAMESPACE::LatencySleepModeInfoNV & sleepModeInfo ) const;\n\n      void latencySleepNV( const VULKAN_HPP_NAMESPACE::LatencySleepInfoNV & sleepInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      void setLatencyMarkerNV( const VULKAN_HPP_NAMESPACE::SetLatencyMarkerInfoNV & latencyMarkerInfo ) const VULKAN_HPP_NOEXCEPT;\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV> getLatencyTimingsNV() const;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device     = {};\n      VULKAN_HPP_NAMESPACE::SwapchainKHR                                                m_swapchain  = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SwapchainKHR>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class SwapchainKHRs : public std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SwapchainKHR>\n    {\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      SwapchainKHRs( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                        device,\n                     VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR> const & createInfos,\n                     VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>        allocator = nullptr )\n      {\n        *this = device.createSharedSwapchainsKHR( createInfos, allocator );\n      }\n#  endif\n\n      SwapchainKHRs( std::nullptr_t ) {}\n\n      SwapchainKHRs()                                    = delete;\n      SwapchainKHRs( SwapchainKHRs const & )             = delete;\n      SwapchainKHRs( SwapchainKHRs && rhs )              = default;\n      SwapchainKHRs & operator=( SwapchainKHRs const & ) = delete;\n      SwapchainKHRs & operator=( SwapchainKHRs && rhs )  = default;\n\n    private:\n      SwapchainKHRs( std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SwapchainKHR> && rhs )\n      {\n        std::swap( *this, rhs );\n      }\n    };\n\n    class ValidationCacheEXT\n    {\n    public:\n      using CType   = VkValidationCacheEXT;\n      using CppType = VULKAN_HPP_NAMESPACE::ValidationCacheEXT;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eValidationCacheEXT;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eValidationCacheEXT;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      ValidationCacheEXT( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                          VULKAN_HPP_NAMESPACE::ValidationCacheCreateInfoEXT const &                      createInfo,\n                          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createValidationCacheEXT( createInfo, allocator );\n      }\n#  endif\n\n      ValidationCacheEXT( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                          VkValidationCacheEXT                                                            validationCache,\n                          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_validationCache( validationCache )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      ValidationCacheEXT( std::nullptr_t ) {}\n\n      ~ValidationCacheEXT()\n      {\n        clear();\n      }\n\n      ValidationCacheEXT()                             = delete;\n      ValidationCacheEXT( ValidationCacheEXT const & ) = delete;\n\n      ValidationCacheEXT( ValidationCacheEXT && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_validationCache( VULKAN_HPP_NAMESPACE::exchange( rhs.m_validationCache, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      ValidationCacheEXT & operator=( ValidationCacheEXT const & ) = delete;\n\n      ValidationCacheEXT & operator=( ValidationCacheEXT && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_validationCache, rhs.m_validationCache );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::ValidationCacheEXT const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_validationCache;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::ValidationCacheEXT() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_validationCache;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_validationCache )\n        {\n          getDispatcher()->vkDestroyValidationCacheEXT( static_cast<VkDevice>( m_device ),\n                                                        static_cast<VkValidationCacheEXT>( m_validationCache ),\n                                                        reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device          = nullptr;\n        m_validationCache = nullptr;\n        m_allocator       = nullptr;\n        m_dispatcher      = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::ValidationCacheEXT release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_validationCache, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ValidationCacheEXT & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_validationCache, rhs.m_validationCache );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_EXT_validation_cache ===\n\n      void merge( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ValidationCacheEXT> const & srcCaches ) const;\n\n      VULKAN_HPP_NODISCARD std::vector<uint8_t> getData() const;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device          = {};\n      VULKAN_HPP_NAMESPACE::ValidationCacheEXT                                          m_validationCache = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator       = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher      = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ValidationCacheEXT>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class VideoSessionKHR\n    {\n    public:\n      using CType   = VkVideoSessionKHR;\n      using CppType = VULKAN_HPP_NAMESPACE::VideoSessionKHR;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eVideoSessionKHR;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      VideoSessionKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                       VULKAN_HPP_NAMESPACE::VideoSessionCreateInfoKHR const &                         createInfo,\n                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createVideoSessionKHR( createInfo, allocator );\n      }\n#  endif\n\n      VideoSessionKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                       VkVideoSessionKHR                                                               videoSession,\n                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_videoSession( videoSession )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      VideoSessionKHR( std::nullptr_t ) {}\n\n      ~VideoSessionKHR()\n      {\n        clear();\n      }\n\n      VideoSessionKHR()                          = delete;\n      VideoSessionKHR( VideoSessionKHR const & ) = delete;\n\n      VideoSessionKHR( VideoSessionKHR && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_videoSession( VULKAN_HPP_NAMESPACE::exchange( rhs.m_videoSession, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      VideoSessionKHR & operator=( VideoSessionKHR const & ) = delete;\n\n      VideoSessionKHR & operator=( VideoSessionKHR && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_videoSession, rhs.m_videoSession );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::VideoSessionKHR const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_videoSession;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::VideoSessionKHR() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_videoSession;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_videoSession )\n        {\n          getDispatcher()->vkDestroyVideoSessionKHR( static_cast<VkDevice>( m_device ),\n                                                     static_cast<VkVideoSessionKHR>( m_videoSession ),\n                                                     reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device       = nullptr;\n        m_videoSession = nullptr;\n        m_allocator    = nullptr;\n        m_dispatcher   = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::VideoSessionKHR release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_videoSession, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::VideoSessionKHR & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_videoSession, rhs.m_videoSession );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_KHR_video_queue ===\n\n      VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::VideoSessionMemoryRequirementsKHR> getMemoryRequirements() const;\n\n      void bindMemory( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindVideoSessionMemoryInfoKHR> const & bindSessionMemoryInfos ) const;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device       = {};\n      VULKAN_HPP_NAMESPACE::VideoSessionKHR                                             m_videoSession = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator    = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher   = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::VideoSessionKHR>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    class VideoSessionParametersKHR\n    {\n    public:\n      using CType   = VkVideoSessionParametersKHR;\n      using CppType = VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR;\n\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eVideoSessionParametersKHR;\n      static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =\n        VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n\n    public:\n#  if !defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n      VideoSessionParametersKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                                 VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateInfoKHR const &               createInfo,\n                                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n      {\n        *this = device.createVideoSessionParametersKHR( createInfo, allocator );\n      }\n#  endif\n\n      VideoSessionParametersKHR( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &                 device,\n                                 VkVideoSessionParametersKHR                                                     videoSessionParameters,\n                                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr )\n        : m_device( device )\n        , m_videoSessionParameters( videoSessionParameters )\n        , m_allocator( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) )\n        , m_dispatcher( device.getDispatcher() )\n      {\n      }\n\n      VideoSessionParametersKHR( std::nullptr_t ) {}\n\n      ~VideoSessionParametersKHR()\n      {\n        clear();\n      }\n\n      VideoSessionParametersKHR()                                    = delete;\n      VideoSessionParametersKHR( VideoSessionParametersKHR const & ) = delete;\n\n      VideoSessionParametersKHR( VideoSessionParametersKHR && rhs ) VULKAN_HPP_NOEXCEPT\n        : m_device( VULKAN_HPP_NAMESPACE::exchange( rhs.m_device, {} ) )\n        , m_videoSessionParameters( VULKAN_HPP_NAMESPACE::exchange( rhs.m_videoSessionParameters, {} ) )\n        , m_allocator( VULKAN_HPP_NAMESPACE::exchange( rhs.m_allocator, {} ) )\n        , m_dispatcher( VULKAN_HPP_NAMESPACE::exchange( rhs.m_dispatcher, nullptr ) )\n      {\n      }\n\n      VideoSessionParametersKHR & operator=( VideoSessionParametersKHR const & ) = delete;\n\n      VideoSessionParametersKHR & operator=( VideoSessionParametersKHR && rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        if ( this != &rhs )\n        {\n          std::swap( m_device, rhs.m_device );\n          std::swap( m_videoSessionParameters, rhs.m_videoSessionParameters );\n          std::swap( m_allocator, rhs.m_allocator );\n          std::swap( m_dispatcher, rhs.m_dispatcher );\n        }\n        return *this;\n      }\n\n      VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR const & operator*() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_videoSessionParameters;\n      }\n\n      operator VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR() const VULKAN_HPP_NOEXCEPT\n      {\n        return m_videoSessionParameters;\n      }\n\n      void clear() VULKAN_HPP_NOEXCEPT\n      {\n        if ( m_videoSessionParameters )\n        {\n          getDispatcher()->vkDestroyVideoSessionParametersKHR( static_cast<VkDevice>( m_device ),\n                                                               static_cast<VkVideoSessionParametersKHR>( m_videoSessionParameters ),\n                                                               reinterpret_cast<const VkAllocationCallbacks *>( m_allocator ) );\n        }\n        m_device                 = nullptr;\n        m_videoSessionParameters = nullptr;\n        m_allocator              = nullptr;\n        m_dispatcher             = nullptr;\n      }\n\n      VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR release()\n      {\n        m_device     = nullptr;\n        m_allocator  = nullptr;\n        m_dispatcher = nullptr;\n        return VULKAN_HPP_NAMESPACE::exchange( m_videoSessionParameters, nullptr );\n      }\n\n      VULKAN_HPP_NAMESPACE::Device getDevice() const\n      {\n        return m_device;\n      }\n\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * getDispatcher() const\n      {\n        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );\n        return m_dispatcher;\n      }\n\n      void swap( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::VideoSessionParametersKHR & rhs ) VULKAN_HPP_NOEXCEPT\n      {\n        std::swap( m_device, rhs.m_device );\n        std::swap( m_videoSessionParameters, rhs.m_videoSessionParameters );\n        std::swap( m_allocator, rhs.m_allocator );\n        std::swap( m_dispatcher, rhs.m_dispatcher );\n      }\n\n      //=== VK_KHR_video_queue ===\n\n      void update( const VULKAN_HPP_NAMESPACE::VideoSessionParametersUpdateInfoKHR & updateInfo ) const;\n\n    private:\n      VULKAN_HPP_NAMESPACE::Device                                                      m_device                 = {};\n      VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR                                   m_videoSessionParameters = {};\n      const VULKAN_HPP_NAMESPACE::AllocationCallbacks *                                 m_allocator              = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::DeviceDispatcher const * m_dispatcher             = nullptr;\n    };\n\n    template <>\n    struct isVulkanRAIIHandleType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::VideoSessionParametersKHR>\n    {\n      static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;\n    };\n\n    // operators to compare vk::raii-handles\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    template <typename T, typename std::enable_if<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::isVulkanRAIIHandleType<T>::value, bool>::type = 0>\n    auto operator<=>( T const & a, T const & b ) VULKAN_HPP_NOEXCEPT\n    {\n      return *a <=> *b;\n    }\n#  else\n    template <typename T, typename std::enable_if<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::isVulkanRAIIHandleType<T>::value, bool>::type = 0>\n    bool operator==( T const & a, T const & b ) VULKAN_HPP_NOEXCEPT\n    {\n      return *a == *b;\n    }\n\n    template <typename T, typename std::enable_if<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::isVulkanRAIIHandleType<T>::value, bool>::type = 0>\n    bool operator!=( T const & a, T const & b ) VULKAN_HPP_NOEXCEPT\n    {\n      return *a != *b;\n    }\n\n    template <typename T, typename std::enable_if<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::isVulkanRAIIHandleType<T>::value, bool>::type = 0>\n    bool operator<( T const & a, T const & b ) VULKAN_HPP_NOEXCEPT\n    {\n      return *a < *b;\n    }\n#  endif\n\n    template <typename T, typename std::enable_if<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::isVulkanRAIIHandleType<T>::value, bool>::type = 0>\n    bool operator==( const T & v, std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      return !*v;\n    }\n\n    template <typename T, typename std::enable_if<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::isVulkanRAIIHandleType<T>::value, bool>::type = 0>\n    bool operator==( std::nullptr_t, const T & v ) VULKAN_HPP_NOEXCEPT\n    {\n      return !*v;\n    }\n\n    template <typename T, typename std::enable_if<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::isVulkanRAIIHandleType<T>::value, bool>::type = 0>\n    bool operator!=( const T & v, std::nullptr_t ) VULKAN_HPP_NOEXCEPT\n    {\n      return *v;\n    }\n\n    template <typename T, typename std::enable_if<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::isVulkanRAIIHandleType<T>::value, bool>::type = 0>\n    bool operator!=( std::nullptr_t, const T & v ) VULKAN_HPP_NOEXCEPT\n    {\n      return *v;\n    }\n\n    //===========================\n    //=== COMMAND Definitions ===\n    //===========================\n\n    //=== VK_VERSION_1_0 ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance>::Type\n      Context::createInstance( VULKAN_HPP_NAMESPACE::InstanceCreateInfo const &                                createInfo,\n                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::Instance instance;\n      VULKAN_HPP_NAMESPACE::Result   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateInstance(\n        reinterpret_cast<const VkInstanceCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkInstance *>( &instance ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Context::createInstance\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance( *this, *reinterpret_cast<VkInstance *>( &instance ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n      std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice>>::Type\n      Instance::enumeratePhysicalDevices() const\n    {\n      std::vector<VULKAN_HPP_NAMESPACE::PhysicalDevice> physicalDevices;\n      uint32_t                                          physicalDeviceCount;\n      VULKAN_HPP_NAMESPACE::Result                      result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkEnumeratePhysicalDevices( static_cast<VkInstance>( m_instance ), &physicalDeviceCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && physicalDeviceCount )\n        {\n          physicalDevices.resize( physicalDeviceCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkEnumeratePhysicalDevices(\n            static_cast<VkInstance>( m_instance ), &physicalDeviceCount, reinterpret_cast<VkPhysicalDevice *>( physicalDevices.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      if ( ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess ) && ( result != VULKAN_HPP_NAMESPACE::Result::eIncomplete ) )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Instance::enumeratePhysicalDevices\" );\n#  endif\n      }\n\n      std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice> physicalDevicesRAII;\n      physicalDevicesRAII.reserve( physicalDevices.size() );\n      for ( auto & physicalDevice : physicalDevices )\n      {\n        physicalDevicesRAII.emplace_back( *this, *reinterpret_cast<VkPhysicalDevice *>( &physicalDevice ) );\n      }\n      return physicalDevicesRAII;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures PhysicalDevice::getFeatures() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceFeatures && \"Function <vkGetPhysicalDeviceFeatures> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures features;\n      getDispatcher()->vkGetPhysicalDeviceFeatures( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                    reinterpret_cast<VkPhysicalDeviceFeatures *>( &features ) );\n\n      return features;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::FormatProperties\n                                           PhysicalDevice::getFormatProperties( VULKAN_HPP_NAMESPACE::Format format ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceFormatProperties && \"Function <vkGetPhysicalDeviceFormatProperties> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::FormatProperties formatProperties;\n      getDispatcher()->vkGetPhysicalDeviceFormatProperties(\n        static_cast<VkPhysicalDevice>( m_physicalDevice ), static_cast<VkFormat>( format ), reinterpret_cast<VkFormatProperties *>( &formatProperties ) );\n\n      return formatProperties;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ImageFormatProperties\n                                           PhysicalDevice::getImageFormatProperties( VULKAN_HPP_NAMESPACE::Format           format,\n                                                VULKAN_HPP_NAMESPACE::ImageType        type,\n                                                VULKAN_HPP_NAMESPACE::ImageTiling      tiling,\n                                                VULKAN_HPP_NAMESPACE::ImageUsageFlags  usage,\n                                                VULKAN_HPP_NAMESPACE::ImageCreateFlags flags ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceImageFormatProperties &&\n                         \"Function <vkGetPhysicalDeviceImageFormatProperties> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::ImageFormatProperties imageFormatProperties;\n      VULKAN_HPP_NAMESPACE::Result                result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetPhysicalDeviceImageFormatProperties( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                   static_cast<VkFormat>( format ),\n                                                                   static_cast<VkImageType>( type ),\n                                                                   static_cast<VkImageTiling>( tiling ),\n                                                                   static_cast<VkImageUsageFlags>( usage ),\n                                                                   static_cast<VkImageCreateFlags>( flags ),\n                                                                   reinterpret_cast<VkImageFormatProperties *>( &imageFormatProperties ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getImageFormatProperties\" );\n\n      return imageFormatProperties;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties PhysicalDevice::getProperties() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceProperties && \"Function <vkGetPhysicalDeviceProperties> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties properties;\n      getDispatcher()->vkGetPhysicalDeviceProperties( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                      reinterpret_cast<VkPhysicalDeviceProperties *>( &properties ) );\n\n      return properties;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties> PhysicalDevice::getQueueFamilyProperties() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties &&\n                         \"Function <vkGetPhysicalDeviceQueueFamilyProperties> requires <VK_VERSION_1_0>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties> queueFamilyProperties;\n      uint32_t                                                 queueFamilyPropertyCount;\n      getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties( static_cast<VkPhysicalDevice>( m_physicalDevice ), &queueFamilyPropertyCount, nullptr );\n      queueFamilyProperties.resize( queueFamilyPropertyCount );\n      getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                 &queueFamilyPropertyCount,\n                                                                 reinterpret_cast<VkQueueFamilyProperties *>( queueFamilyProperties.data() ) );\n\n      VULKAN_HPP_ASSERT( queueFamilyPropertyCount <= queueFamilyProperties.size() );\n      if ( queueFamilyPropertyCount < queueFamilyProperties.size() )\n      {\n        queueFamilyProperties.resize( queueFamilyPropertyCount );\n      }\n      return queueFamilyProperties;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties PhysicalDevice::getMemoryProperties() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceMemoryProperties && \"Function <vkGetPhysicalDeviceMemoryProperties> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties memoryProperties;\n      getDispatcher()->vkGetPhysicalDeviceMemoryProperties( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                            reinterpret_cast<VkPhysicalDeviceMemoryProperties *>( &memoryProperties ) );\n\n      return memoryProperties;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PFN_VoidFunction Instance::getProcAddr( const std::string & name ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetInstanceProcAddr && \"Function <vkGetInstanceProcAddr> requires <VK_VERSION_1_0>\" );\n\n      PFN_vkVoidFunction result = getDispatcher()->vkGetInstanceProcAddr( static_cast<VkInstance>( m_instance ), name.c_str() );\n\n      return result;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PFN_VoidFunction Device::getProcAddr( const std::string & name ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceProcAddr && \"Function <vkGetDeviceProcAddr> requires <VK_VERSION_1_0>\" );\n\n      PFN_vkVoidFunction result = getDispatcher()->vkGetDeviceProcAddr( static_cast<VkDevice>( m_device ), name.c_str() );\n\n      return result;\n    }\n\n    VULKAN_HPP_NODISCARD\n      VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device>::Type\n                        PhysicalDevice::createDevice( VULKAN_HPP_NAMESPACE::DeviceCreateInfo const &                                  createInfo,\n                                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::Device device;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateDevice(\n        static_cast<VkPhysicalDevice>( m_physicalDevice ),\n        reinterpret_cast<const VkDeviceCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkDevice *>( &device ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"PhysicalDevice::createDevice\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device( *this, *reinterpret_cast<VkDevice *>( &device ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties>\n                                           Context::enumerateInstanceExtensionProperties( Optional<const std::string> layerName ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkEnumerateInstanceExtensionProperties &&\n                         \"Function <vkEnumerateInstanceExtensionProperties> requires <VK_VERSION_1_0>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties> properties;\n      uint32_t                                               propertyCount;\n      VULKAN_HPP_NAMESPACE::Result                           result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkEnumerateInstanceExtensionProperties( layerName ? layerName->c_str() : nullptr, &propertyCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n        {\n          properties.resize( propertyCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkEnumerateInstanceExtensionProperties(\n            layerName ? layerName->c_str() : nullptr, &propertyCount, reinterpret_cast<VkExtensionProperties *>( properties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Context::enumerateInstanceExtensionProperties\" );\n      VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n      if ( propertyCount < properties.size() )\n      {\n        properties.resize( propertyCount );\n      }\n      return properties;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties>\n                                           PhysicalDevice::enumerateDeviceExtensionProperties( Optional<const std::string> layerName ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkEnumerateDeviceExtensionProperties && \"Function <vkEnumerateDeviceExtensionProperties> requires <VK_VERSION_1_0>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties> properties;\n      uint32_t                                               propertyCount;\n      VULKAN_HPP_NAMESPACE::Result                           result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkEnumerateDeviceExtensionProperties(\n          static_cast<VkPhysicalDevice>( m_physicalDevice ), layerName ? layerName->c_str() : nullptr, &propertyCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n        {\n          properties.resize( propertyCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n            getDispatcher()->vkEnumerateDeviceExtensionProperties( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                   layerName ? layerName->c_str() : nullptr,\n                                                                   &propertyCount,\n                                                                   reinterpret_cast<VkExtensionProperties *>( properties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::enumerateDeviceExtensionProperties\" );\n      VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n      if ( propertyCount < properties.size() )\n      {\n        properties.resize( propertyCount );\n      }\n      return properties;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::LayerProperties> Context::enumerateInstanceLayerProperties() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkEnumerateInstanceLayerProperties && \"Function <vkEnumerateInstanceLayerProperties> requires <VK_VERSION_1_0>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::LayerProperties> properties;\n      uint32_t                                           propertyCount;\n      VULKAN_HPP_NAMESPACE::Result                       result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkEnumerateInstanceLayerProperties( &propertyCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n        {\n          properties.resize( propertyCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n            getDispatcher()->vkEnumerateInstanceLayerProperties( &propertyCount, reinterpret_cast<VkLayerProperties *>( properties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Context::enumerateInstanceLayerProperties\" );\n      VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n      if ( propertyCount < properties.size() )\n      {\n        properties.resize( propertyCount );\n      }\n      return properties;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::LayerProperties> PhysicalDevice::enumerateDeviceLayerProperties() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkEnumerateDeviceLayerProperties && \"Function <vkEnumerateDeviceLayerProperties> requires <VK_VERSION_1_0>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::LayerProperties> properties;\n      uint32_t                                           propertyCount;\n      VULKAN_HPP_NAMESPACE::Result                       result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkEnumerateDeviceLayerProperties( static_cast<VkPhysicalDevice>( m_physicalDevice ), &propertyCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n        {\n          properties.resize( propertyCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkEnumerateDeviceLayerProperties(\n            static_cast<VkPhysicalDevice>( m_physicalDevice ), &propertyCount, reinterpret_cast<VkLayerProperties *>( properties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::enumerateDeviceLayerProperties\" );\n      VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n      if ( propertyCount < properties.size() )\n      {\n        properties.resize( propertyCount );\n      }\n      return properties;\n    }\n\n    VULKAN_HPP_NODISCARD\n      VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Queue>::Type\n                        Device::getQueue( uint32_t queueFamilyIndex, uint32_t queueIndex ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::Queue queue;\n      getDispatcher()->vkGetDeviceQueue( static_cast<VkDevice>( m_device ), queueFamilyIndex, queueIndex, reinterpret_cast<VkQueue *>( &queue ) );\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Queue( *this, *reinterpret_cast<VkQueue *>( &queue ) );\n    }\n\n    VULKAN_HPP_INLINE void Queue::submit( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SubmitInfo> const & submits,\n                                          VULKAN_HPP_NAMESPACE::Fence                                                      fence ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkQueueSubmit && \"Function <vkQueueSubmit> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkQueueSubmit(\n        static_cast<VkQueue>( m_queue ), submits.size(), reinterpret_cast<const VkSubmitInfo *>( submits.data() ), static_cast<VkFence>( fence ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Queue::submit\" );\n    }\n\n    VULKAN_HPP_INLINE void Queue::waitIdle() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkQueueWaitIdle && \"Function <vkQueueWaitIdle> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkQueueWaitIdle( static_cast<VkQueue>( m_queue ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Queue::waitIdle\" );\n    }\n\n    VULKAN_HPP_INLINE void Device::waitIdle() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkDeviceWaitIdle && \"Function <vkDeviceWaitIdle> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkDeviceWaitIdle( static_cast<VkDevice>( m_device ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::waitIdle\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceMemory>::Type\n      Device::allocateMemory( VULKAN_HPP_NAMESPACE::MemoryAllocateInfo const &                                allocateInfo,\n                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::DeviceMemory memory;\n      VULKAN_HPP_NAMESPACE::Result       result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkAllocateMemory(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkMemoryAllocateInfo *>( &allocateInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkDeviceMemory *>( &memory ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::allocateMemory\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceMemory( *this, *reinterpret_cast<VkDeviceMemory *>( &memory ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE void * DeviceMemory::mapMemory( VULKAN_HPP_NAMESPACE::DeviceSize     offset,\n                                                                           VULKAN_HPP_NAMESPACE::DeviceSize     size,\n                                                                           VULKAN_HPP_NAMESPACE::MemoryMapFlags flags ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkMapMemory && \"Function <vkMapMemory> requires <VK_VERSION_1_0>\" );\n\n      void *                       pData;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkMapMemory( static_cast<VkDevice>( m_device ),\n                                                                                                                     static_cast<VkDeviceMemory>( m_memory ),\n                                                                                                                     static_cast<VkDeviceSize>( offset ),\n                                                                                                                     static_cast<VkDeviceSize>( size ),\n                                                                                                                     static_cast<VkMemoryMapFlags>( flags ),\n                                                                                                                     &pData ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::DeviceMemory::mapMemory\" );\n\n      return pData;\n    }\n\n    VULKAN_HPP_INLINE void DeviceMemory::unmapMemory() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkUnmapMemory && \"Function <vkUnmapMemory> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkUnmapMemory( static_cast<VkDevice>( m_device ), static_cast<VkDeviceMemory>( m_memory ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      Device::flushMappedMemoryRanges( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MappedMemoryRange> const & memoryRanges ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkFlushMappedMemoryRanges && \"Function <vkFlushMappedMemoryRanges> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkFlushMappedMemoryRanges(\n        static_cast<VkDevice>( m_device ), memoryRanges.size(), reinterpret_cast<const VkMappedMemoryRange *>( memoryRanges.data() ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::flushMappedMemoryRanges\" );\n    }\n\n    VULKAN_HPP_INLINE void\n      Device::invalidateMappedMemoryRanges( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MappedMemoryRange> const & memoryRanges ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkInvalidateMappedMemoryRanges && \"Function <vkInvalidateMappedMemoryRanges> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkInvalidateMappedMemoryRanges(\n        static_cast<VkDevice>( m_device ), memoryRanges.size(), reinterpret_cast<const VkMappedMemoryRange *>( memoryRanges.data() ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::invalidateMappedMemoryRanges\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceSize DeviceMemory::getCommitment() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceMemoryCommitment && \"Function <vkGetDeviceMemoryCommitment> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::DeviceSize committedMemoryInBytes;\n      getDispatcher()->vkGetDeviceMemoryCommitment(\n        static_cast<VkDevice>( m_device ), static_cast<VkDeviceMemory>( m_memory ), reinterpret_cast<VkDeviceSize *>( &committedMemoryInBytes ) );\n\n      return committedMemoryInBytes;\n    }\n\n    VULKAN_HPP_INLINE void Buffer::bindMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory, VULKAN_HPP_NAMESPACE::DeviceSize memoryOffset ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkBindBufferMemory && \"Function <vkBindBufferMemory> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkBindBufferMemory( static_cast<VkDevice>( m_device ),\n                                                                                        static_cast<VkBuffer>( m_buffer ),\n                                                                                        static_cast<VkDeviceMemory>( memory ),\n                                                                                        static_cast<VkDeviceSize>( memoryOffset ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Buffer::bindMemory\" );\n    }\n\n    VULKAN_HPP_INLINE void Image::bindMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory, VULKAN_HPP_NAMESPACE::DeviceSize memoryOffset ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkBindImageMemory && \"Function <vkBindImageMemory> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkBindImageMemory( static_cast<VkDevice>( m_device ),\n                                                                                       static_cast<VkImage>( m_image ),\n                                                                                       static_cast<VkDeviceMemory>( memory ),\n                                                                                       static_cast<VkDeviceSize>( memoryOffset ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Image::bindMemory\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements Buffer::getMemoryRequirements() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetBufferMemoryRequirements && \"Function <vkGetBufferMemoryRequirements> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::MemoryRequirements memoryRequirements;\n      getDispatcher()->vkGetBufferMemoryRequirements(\n        static_cast<VkDevice>( m_device ), static_cast<VkBuffer>( m_buffer ), reinterpret_cast<VkMemoryRequirements *>( &memoryRequirements ) );\n\n      return memoryRequirements;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements Image::getMemoryRequirements() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetImageMemoryRequirements && \"Function <vkGetImageMemoryRequirements> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::MemoryRequirements memoryRequirements;\n      getDispatcher()->vkGetImageMemoryRequirements(\n        static_cast<VkDevice>( m_device ), static_cast<VkImage>( m_image ), reinterpret_cast<VkMemoryRequirements *>( &memoryRequirements ) );\n\n      return memoryRequirements;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements> Image::getSparseMemoryRequirements() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetImageSparseMemoryRequirements && \"Function <vkGetImageSparseMemoryRequirements> requires <VK_VERSION_1_0>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements> sparseMemoryRequirements;\n      uint32_t                                                         sparseMemoryRequirementCount;\n      getDispatcher()->vkGetImageSparseMemoryRequirements(\n        static_cast<VkDevice>( m_device ), static_cast<VkImage>( m_image ), &sparseMemoryRequirementCount, nullptr );\n      sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n      getDispatcher()->vkGetImageSparseMemoryRequirements( static_cast<VkDevice>( m_device ),\n                                                           static_cast<VkImage>( m_image ),\n                                                           &sparseMemoryRequirementCount,\n                                                           reinterpret_cast<VkSparseImageMemoryRequirements *>( sparseMemoryRequirements.data() ) );\n\n      VULKAN_HPP_ASSERT( sparseMemoryRequirementCount <= sparseMemoryRequirements.size() );\n      if ( sparseMemoryRequirementCount < sparseMemoryRequirements.size() )\n      {\n        sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n      }\n      return sparseMemoryRequirements;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties>\n                                           PhysicalDevice::getSparseImageFormatProperties( VULKAN_HPP_NAMESPACE::Format              format,\n                                                      VULKAN_HPP_NAMESPACE::ImageType           type,\n                                                      VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples,\n                                                      VULKAN_HPP_NAMESPACE::ImageUsageFlags     usage,\n                                                      VULKAN_HPP_NAMESPACE::ImageTiling         tiling ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceSparseImageFormatProperties &&\n                         \"Function <vkGetPhysicalDeviceSparseImageFormatProperties> requires <VK_VERSION_1_0>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties> properties;\n      uint32_t                                                       propertyCount;\n      getDispatcher()->vkGetPhysicalDeviceSparseImageFormatProperties( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                       static_cast<VkFormat>( format ),\n                                                                       static_cast<VkImageType>( type ),\n                                                                       static_cast<VkSampleCountFlagBits>( samples ),\n                                                                       static_cast<VkImageUsageFlags>( usage ),\n                                                                       static_cast<VkImageTiling>( tiling ),\n                                                                       &propertyCount,\n                                                                       nullptr );\n      properties.resize( propertyCount );\n      getDispatcher()->vkGetPhysicalDeviceSparseImageFormatProperties( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                       static_cast<VkFormat>( format ),\n                                                                       static_cast<VkImageType>( type ),\n                                                                       static_cast<VkSampleCountFlagBits>( samples ),\n                                                                       static_cast<VkImageUsageFlags>( usage ),\n                                                                       static_cast<VkImageTiling>( tiling ),\n                                                                       &propertyCount,\n                                                                       reinterpret_cast<VkSparseImageFormatProperties *>( properties.data() ) );\n\n      VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n      if ( propertyCount < properties.size() )\n      {\n        properties.resize( propertyCount );\n      }\n      return properties;\n    }\n\n    VULKAN_HPP_INLINE void Queue::bindSparse( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindSparseInfo> const & bindInfo,\n                                              VULKAN_HPP_NAMESPACE::Fence                                                          fence ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkQueueBindSparse && \"Function <vkQueueBindSparse> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkQueueBindSparse(\n        static_cast<VkQueue>( m_queue ), bindInfo.size(), reinterpret_cast<const VkBindSparseInfo *>( bindInfo.data() ), static_cast<VkFence>( fence ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Queue::bindSparse\" );\n    }\n\n    VULKAN_HPP_NODISCARD\n      VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Fence>::Type\n                        Device::createFence( VULKAN_HPP_NAMESPACE::FenceCreateInfo const &                                   createInfo,\n                           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::Fence  fence;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateFence(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkFenceCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkFence *>( &fence ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createFence\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Fence( *this, *reinterpret_cast<VkFence *>( &fence ), allocator );\n    }\n\n    VULKAN_HPP_INLINE void Device::resetFences( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Fence> const & fences ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkResetFences && \"Function <vkResetFences> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkResetFences( static_cast<VkDevice>( m_device ), fences.size(), reinterpret_cast<const VkFence *>( fences.data() ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::resetFences\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result Fence::getStatus() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetFenceStatus && \"Function <vkGetFenceStatus> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetFenceStatus( static_cast<VkDevice>( m_device ), static_cast<VkFence>( m_fence ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck(\n        result, VULKAN_HPP_NAMESPACE_STRING \"::Fence::getStatus\", { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eNotReady } );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result Device::waitForFences(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Fence> const & fences, VULKAN_HPP_NAMESPACE::Bool32 waitAll, uint64_t timeout ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkWaitForFences && \"Function <vkWaitForFences> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkWaitForFences(\n        static_cast<VkDevice>( m_device ), fences.size(), reinterpret_cast<const VkFence *>( fences.data() ), static_cast<VkBool32>( waitAll ), timeout ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck(\n        result, VULKAN_HPP_NAMESPACE_STRING \"::Device::waitForFences\", { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eTimeout } );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Semaphore>::Type\n      Device::createSemaphore( VULKAN_HPP_NAMESPACE::SemaphoreCreateInfo const &                               createInfo,\n                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::Semaphore semaphore;\n      VULKAN_HPP_NAMESPACE::Result    result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateSemaphore(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkSemaphoreCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkSemaphore *>( &semaphore ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createSemaphore\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Semaphore( *this, *reinterpret_cast<VkSemaphore *>( &semaphore ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD\n      VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Event>::Type\n                        Device::createEvent( VULKAN_HPP_NAMESPACE::EventCreateInfo const &                                   createInfo,\n                           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::Event  event;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateEvent(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkEventCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkEvent *>( &event ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createEvent\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Event( *this, *reinterpret_cast<VkEvent *>( &event ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result Event::getStatus() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetEventStatus && \"Function <vkGetEventStatus> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetEventStatus( static_cast<VkDevice>( m_device ), static_cast<VkEvent>( m_event ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck(\n        result, VULKAN_HPP_NAMESPACE_STRING \"::Event::getStatus\", { VULKAN_HPP_NAMESPACE::Result::eEventSet, VULKAN_HPP_NAMESPACE::Result::eEventReset } );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n    }\n\n    VULKAN_HPP_INLINE void Event::set() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkSetEvent && \"Function <vkSetEvent> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkSetEvent( static_cast<VkDevice>( m_device ), static_cast<VkEvent>( m_event ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Event::set\" );\n    }\n\n    VULKAN_HPP_INLINE void Event::reset() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkResetEvent && \"Function <vkResetEvent> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkResetEvent( static_cast<VkDevice>( m_device ), static_cast<VkEvent>( m_event ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Event::reset\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::QueryPool>::Type\n      Device::createQueryPool( VULKAN_HPP_NAMESPACE::QueryPoolCreateInfo const &                               createInfo,\n                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::QueryPool queryPool;\n      VULKAN_HPP_NAMESPACE::Result    result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateQueryPool(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkQueryPoolCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkQueryPool *>( &queryPool ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createQueryPool\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::QueryPool( *this, *reinterpret_cast<VkQueryPool *>( &queryPool ), allocator );\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::pair<VULKAN_HPP_NAMESPACE::Result, std::vector<DataType>> QueryPool::getResults(\n      uint32_t firstQuery, uint32_t queryCount, size_t dataSize, VULKAN_HPP_NAMESPACE::DeviceSize stride, VULKAN_HPP_NAMESPACE::QueryResultFlags flags ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetQueryPoolResults && \"Function <vkGetQueryPoolResults> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_ASSERT( dataSize % sizeof( DataType ) == 0 );\n      std::vector<DataType>        data( dataSize / sizeof( DataType ) );\n      VULKAN_HPP_NAMESPACE::Result result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetQueryPoolResults( static_cast<VkDevice>( m_device ),\n                                                                                           static_cast<VkQueryPool>( m_queryPool ),\n                                                                                           firstQuery,\n                                                                                           queryCount,\n                                                                                           data.size() * sizeof( DataType ),\n                                                                                           reinterpret_cast<void *>( data.data() ),\n                                                                                           static_cast<VkDeviceSize>( stride ),\n                                                                                           static_cast<VkQueryResultFlags>( flags ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck(\n        result, VULKAN_HPP_NAMESPACE_STRING \"::QueryPool::getResults\", { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eNotReady } );\n\n      return std::make_pair( result, std::move( data ) );\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::pair<VULKAN_HPP_NAMESPACE::Result, DataType> QueryPool::getResult(\n      uint32_t firstQuery, uint32_t queryCount, VULKAN_HPP_NAMESPACE::DeviceSize stride, VULKAN_HPP_NAMESPACE::QueryResultFlags flags ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetQueryPoolResults && \"Function <vkGetQueryPoolResults> requires <VK_VERSION_1_0>\" );\n\n      DataType                     data;\n      VULKAN_HPP_NAMESPACE::Result result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetQueryPoolResults( static_cast<VkDevice>( m_device ),\n                                                                                           static_cast<VkQueryPool>( m_queryPool ),\n                                                                                           firstQuery,\n                                                                                           queryCount,\n                                                                                           sizeof( DataType ),\n                                                                                           reinterpret_cast<void *>( &data ),\n                                                                                           static_cast<VkDeviceSize>( stride ),\n                                                                                           static_cast<VkQueryResultFlags>( flags ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck(\n        result, VULKAN_HPP_NAMESPACE_STRING \"::QueryPool::getResult\", { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eNotReady } );\n\n      return std::make_pair( result, std::move( data ) );\n    }\n\n    VULKAN_HPP_NODISCARD\n      VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Buffer>::Type\n                        Device::createBuffer( VULKAN_HPP_NAMESPACE::BufferCreateInfo const &                                  createInfo,\n                            VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::Buffer buffer;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateBuffer(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkBufferCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkBuffer *>( &buffer ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createBuffer\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Buffer( *this, *reinterpret_cast<VkBuffer *>( &buffer ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::BufferView>::Type\n      Device::createBufferView( VULKAN_HPP_NAMESPACE::BufferViewCreateInfo const &                              createInfo,\n                                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::BufferView view;\n      VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateBufferView(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkBufferViewCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkBufferView *>( &view ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createBufferView\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::BufferView( *this, *reinterpret_cast<VkBufferView *>( &view ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD\n      VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Image>::Type\n                        Device::createImage( VULKAN_HPP_NAMESPACE::ImageCreateInfo const &                                   createInfo,\n                           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::Image  image;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateImage(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkImageCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkImage *>( &image ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createImage\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Image( *this, *reinterpret_cast<VkImage *>( &image ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::SubresourceLayout\n                                           Image::getSubresourceLayout( const VULKAN_HPP_NAMESPACE::ImageSubresource & subresource ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetImageSubresourceLayout && \"Function <vkGetImageSubresourceLayout> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::SubresourceLayout layout;\n      getDispatcher()->vkGetImageSubresourceLayout( static_cast<VkDevice>( m_device ),\n                                                    static_cast<VkImage>( m_image ),\n                                                    reinterpret_cast<const VkImageSubresource *>( &subresource ),\n                                                    reinterpret_cast<VkSubresourceLayout *>( &layout ) );\n\n      return layout;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ImageView>::Type\n      Device::createImageView( VULKAN_HPP_NAMESPACE::ImageViewCreateInfo const &                               createInfo,\n                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::ImageView view;\n      VULKAN_HPP_NAMESPACE::Result    result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateImageView(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkImageViewCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkImageView *>( &view ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createImageView\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ImageView( *this, *reinterpret_cast<VkImageView *>( &view ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ShaderModule>::Type\n      Device::createShaderModule( VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo const &                            createInfo,\n                                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::ShaderModule shaderModule;\n      VULKAN_HPP_NAMESPACE::Result       result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateShaderModule(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkShaderModuleCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkShaderModule *>( &shaderModule ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createShaderModule\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ShaderModule( *this, *reinterpret_cast<VkShaderModule *>( &shaderModule ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache>::Type\n      Device::createPipelineCache( VULKAN_HPP_NAMESPACE::PipelineCacheCreateInfo const &                           createInfo,\n                                   VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::PipelineCache pipelineCache;\n      VULKAN_HPP_NAMESPACE::Result        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreatePipelineCache(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkPipelineCacheCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkPipelineCache *>( &pipelineCache ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createPipelineCache\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache( *this, *reinterpret_cast<VkPipelineCache *>( &pipelineCache ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<uint8_t> PipelineCache::getData() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPipelineCacheData && \"Function <vkGetPipelineCacheData> requires <VK_VERSION_1_0>\" );\n\n      std::vector<uint8_t>         data;\n      size_t                       dataSize;\n      VULKAN_HPP_NAMESPACE::Result result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkGetPipelineCacheData( static_cast<VkDevice>( m_device ), static_cast<VkPipelineCache>( m_pipelineCache ), &dataSize, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && dataSize )\n        {\n          data.resize( dataSize );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPipelineCacheData(\n            static_cast<VkDevice>( m_device ), static_cast<VkPipelineCache>( m_pipelineCache ), &dataSize, reinterpret_cast<void *>( data.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PipelineCache::getData\" );\n      VULKAN_HPP_ASSERT( dataSize <= data.size() );\n      if ( dataSize < data.size() )\n      {\n        data.resize( dataSize );\n      }\n      return data;\n    }\n\n    VULKAN_HPP_INLINE void PipelineCache::merge( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::PipelineCache> const & srcCaches ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkMergePipelineCaches && \"Function <vkMergePipelineCaches> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkMergePipelineCaches( static_cast<VkDevice>( m_device ),\n                                                                                           static_cast<VkPipelineCache>( m_pipelineCache ),\n                                                                                           srcCaches.size(),\n                                                                                           reinterpret_cast<const VkPipelineCache *>( srcCaches.data() ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PipelineCache::merge\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline>>::Type\n      Device::createGraphicsPipelines(\n        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n        VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo> const &                   createInfos,\n        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                              allocator ) const\n    {\n      std::vector<VULKAN_HPP_NAMESPACE::Pipeline> pipelines( createInfos.size() );\n      VULKAN_HPP_NAMESPACE::Result                result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateGraphicsPipelines(\n        static_cast<VkDevice>( m_device ),\n        pipelineCache ? static_cast<VkPipelineCache>( **pipelineCache ) : 0,\n        createInfos.size(),\n        reinterpret_cast<const VkGraphicsPipelineCreateInfo *>( createInfos.data() ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n      if ( ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess ) && ( result != VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT ) )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createGraphicsPipelines\" );\n#  endif\n      }\n\n      std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline> pipelinesRAII;\n      pipelinesRAII.reserve( pipelines.size() );\n      for ( auto & pipeline : pipelines )\n      {\n        pipelinesRAII.emplace_back( *this, *reinterpret_cast<VkPipeline *>( &pipeline ), allocator, result );\n      }\n      return pipelinesRAII;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline>::Type\n      Device::createGraphicsPipeline(\n        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n        VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo const &                                                     createInfo,\n        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::Pipeline pipeline;\n      VULKAN_HPP_NAMESPACE::Result   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateGraphicsPipelines(\n        static_cast<VkDevice>( m_device ),\n        pipelineCache ? static_cast<VkPipelineCache>( **pipelineCache ) : 0,\n        1,\n        reinterpret_cast<const VkGraphicsPipelineCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkPipeline *>( &pipeline ) ) );\n      if ( ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess ) && ( result != VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT ) )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createGraphicsPipeline\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline( *this, *reinterpret_cast<VkPipeline *>( &pipeline ), allocator, result );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline>>::Type\n      Device::createComputePipelines(\n        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n        VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo> const &                    createInfos,\n        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                              allocator ) const\n    {\n      std::vector<VULKAN_HPP_NAMESPACE::Pipeline> pipelines( createInfos.size() );\n      VULKAN_HPP_NAMESPACE::Result                result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateComputePipelines(\n        static_cast<VkDevice>( m_device ),\n        pipelineCache ? static_cast<VkPipelineCache>( **pipelineCache ) : 0,\n        createInfos.size(),\n        reinterpret_cast<const VkComputePipelineCreateInfo *>( createInfos.data() ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n      if ( ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess ) && ( result != VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT ) )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createComputePipelines\" );\n#  endif\n      }\n\n      std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline> pipelinesRAII;\n      pipelinesRAII.reserve( pipelines.size() );\n      for ( auto & pipeline : pipelines )\n      {\n        pipelinesRAII.emplace_back( *this, *reinterpret_cast<VkPipeline *>( &pipeline ), allocator, result );\n      }\n      return pipelinesRAII;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline>::Type\n      Device::createComputePipeline( VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n                                     VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo const &                                                      createInfo,\n                                     VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::Pipeline pipeline;\n      VULKAN_HPP_NAMESPACE::Result   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateComputePipelines(\n        static_cast<VkDevice>( m_device ),\n        pipelineCache ? static_cast<VkPipelineCache>( **pipelineCache ) : 0,\n        1,\n        reinterpret_cast<const VkComputePipelineCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkPipeline *>( &pipeline ) ) );\n      if ( ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess ) && ( result != VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT ) )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createComputePipeline\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline( *this, *reinterpret_cast<VkPipeline *>( &pipeline ), allocator, result );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineLayout>::Type\n      Device::createPipelineLayout( VULKAN_HPP_NAMESPACE::PipelineLayoutCreateInfo const &                          createInfo,\n                                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::PipelineLayout pipelineLayout;\n      VULKAN_HPP_NAMESPACE::Result         result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreatePipelineLayout(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkPipelineLayoutCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkPipelineLayout *>( &pipelineLayout ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createPipelineLayout\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineLayout( *this, *reinterpret_cast<VkPipelineLayout *>( &pipelineLayout ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Sampler>::Type\n      Device::createSampler( VULKAN_HPP_NAMESPACE::SamplerCreateInfo const &                                 createInfo,\n                             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::Sampler sampler;\n      VULKAN_HPP_NAMESPACE::Result  result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateSampler(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkSamplerCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkSampler *>( &sampler ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createSampler\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Sampler( *this, *reinterpret_cast<VkSampler *>( &sampler ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorSetLayout>::Type\n      Device::createDescriptorSetLayout( VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo const &                     createInfo,\n                                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::DescriptorSetLayout setLayout;\n      VULKAN_HPP_NAMESPACE::Result              result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateDescriptorSetLayout(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkDescriptorSetLayout *>( &setLayout ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createDescriptorSetLayout\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorSetLayout( *this, *reinterpret_cast<VkDescriptorSetLayout *>( &setLayout ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorPool>::Type\n      Device::createDescriptorPool( VULKAN_HPP_NAMESPACE::DescriptorPoolCreateInfo const &                          createInfo,\n                                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::DescriptorPool descriptorPool;\n      VULKAN_HPP_NAMESPACE::Result         result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateDescriptorPool(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkDescriptorPoolCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkDescriptorPool *>( &descriptorPool ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createDescriptorPool\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorPool( *this, *reinterpret_cast<VkDescriptorPool *>( &descriptorPool ), allocator );\n    }\n\n    VULKAN_HPP_INLINE void DescriptorPool::reset( VULKAN_HPP_NAMESPACE::DescriptorPoolResetFlags flags ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkResetDescriptorPool && \"Function <vkResetDescriptorPool> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkResetDescriptorPool(\n        static_cast<VkDevice>( m_device ), static_cast<VkDescriptorPool>( m_descriptorPool ), static_cast<VkDescriptorPoolResetFlags>( flags ) );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n      std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorSet>>::Type\n      Device::allocateDescriptorSets( VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo const & allocateInfo ) const\n    {\n      std::vector<VULKAN_HPP_NAMESPACE::DescriptorSet> descriptorSets( allocateInfo.descriptorSetCount );\n      VULKAN_HPP_NAMESPACE::Result                     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkAllocateDescriptorSets( static_cast<VkDevice>( m_device ),\n                                                   reinterpret_cast<const VkDescriptorSetAllocateInfo *>( &allocateInfo ),\n                                                   reinterpret_cast<VkDescriptorSet *>( descriptorSets.data() ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::allocateDescriptorSets\" );\n#  endif\n      }\n\n      std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorSet> descriptorSetsRAII;\n      descriptorSetsRAII.reserve( descriptorSets.size() );\n      for ( auto & descriptorSet : descriptorSets )\n      {\n        descriptorSetsRAII.emplace_back(\n          *this, *reinterpret_cast<VkDescriptorSet *>( &descriptorSet ), static_cast<VkDescriptorPool>( allocateInfo.descriptorPool ) );\n      }\n      return descriptorSetsRAII;\n    }\n\n    VULKAN_HPP_INLINE void Device::updateDescriptorSets(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteDescriptorSet> const & descriptorWrites,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CopyDescriptorSet> const &  descriptorCopies ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkUpdateDescriptorSets && \"Function <vkUpdateDescriptorSets> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkUpdateDescriptorSets( static_cast<VkDevice>( m_device ),\n                                               descriptorWrites.size(),\n                                               reinterpret_cast<const VkWriteDescriptorSet *>( descriptorWrites.data() ),\n                                               descriptorCopies.size(),\n                                               reinterpret_cast<const VkCopyDescriptorSet *>( descriptorCopies.data() ) );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Framebuffer>::Type\n      Device::createFramebuffer( VULKAN_HPP_NAMESPACE::FramebufferCreateInfo const &                             createInfo,\n                                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::Framebuffer framebuffer;\n      VULKAN_HPP_NAMESPACE::Result      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateFramebuffer(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkFramebufferCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkFramebuffer *>( &framebuffer ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createFramebuffer\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Framebuffer( *this, *reinterpret_cast<VkFramebuffer *>( &framebuffer ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::RenderPass>::Type\n      Device::createRenderPass( VULKAN_HPP_NAMESPACE::RenderPassCreateInfo const &                              createInfo,\n                                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::RenderPass renderPass;\n      VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateRenderPass(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkRenderPassCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkRenderPass *>( &renderPass ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createRenderPass\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::RenderPass( *this, *reinterpret_cast<VkRenderPass *>( &renderPass ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Extent2D RenderPass::getRenderAreaGranularity() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetRenderAreaGranularity && \"Function <vkGetRenderAreaGranularity> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::Extent2D granularity;\n      getDispatcher()->vkGetRenderAreaGranularity(\n        static_cast<VkDevice>( m_device ), static_cast<VkRenderPass>( m_renderPass ), reinterpret_cast<VkExtent2D *>( &granularity ) );\n\n      return granularity;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CommandPool>::Type\n      Device::createCommandPool( VULKAN_HPP_NAMESPACE::CommandPoolCreateInfo const &                             createInfo,\n                                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::CommandPool commandPool;\n      VULKAN_HPP_NAMESPACE::Result      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateCommandPool(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkCommandPoolCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkCommandPool *>( &commandPool ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createCommandPool\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CommandPool( *this, *reinterpret_cast<VkCommandPool *>( &commandPool ), allocator );\n    }\n\n    VULKAN_HPP_INLINE void CommandPool::reset( VULKAN_HPP_NAMESPACE::CommandPoolResetFlags flags ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkResetCommandPool && \"Function <vkResetCommandPool> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkResetCommandPool(\n        static_cast<VkDevice>( m_device ), static_cast<VkCommandPool>( m_commandPool ), static_cast<VkCommandPoolResetFlags>( flags ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::CommandPool::reset\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n      std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CommandBuffer>>::Type\n      Device::allocateCommandBuffers( VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo const & allocateInfo ) const\n    {\n      std::vector<VULKAN_HPP_NAMESPACE::CommandBuffer> commandBuffers( allocateInfo.commandBufferCount );\n      VULKAN_HPP_NAMESPACE::Result                     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkAllocateCommandBuffers( static_cast<VkDevice>( m_device ),\n                                                   reinterpret_cast<const VkCommandBufferAllocateInfo *>( &allocateInfo ),\n                                                   reinterpret_cast<VkCommandBuffer *>( commandBuffers.data() ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::allocateCommandBuffers\" );\n#  endif\n      }\n\n      std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CommandBuffer> commandBuffersRAII;\n      commandBuffersRAII.reserve( commandBuffers.size() );\n      for ( auto & commandBuffer : commandBuffers )\n      {\n        commandBuffersRAII.emplace_back(\n          *this, *reinterpret_cast<VkCommandBuffer *>( &commandBuffer ), static_cast<VkCommandPool>( allocateInfo.commandPool ) );\n      }\n      return commandBuffersRAII;\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::begin( const VULKAN_HPP_NAMESPACE::CommandBufferBeginInfo & beginInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkBeginCommandBuffer && \"Function <vkBeginCommandBuffer> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkBeginCommandBuffer(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkCommandBufferBeginInfo *>( &beginInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::begin\" );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::end() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkEndCommandBuffer && \"Function <vkEndCommandBuffer> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkEndCommandBuffer( static_cast<VkCommandBuffer>( m_commandBuffer ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::end\" );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::reset( VULKAN_HPP_NAMESPACE::CommandBufferResetFlags flags ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkResetCommandBuffer && \"Function <vkResetCommandBuffer> requires <VK_VERSION_1_0>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkResetCommandBuffer( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkCommandBufferResetFlags>( flags ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::reset\" );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::bindPipeline( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint,\n                                                        VULKAN_HPP_NAMESPACE::Pipeline          pipeline ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBindPipeline && \"Function <vkCmdBindPipeline> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdBindPipeline(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkPipelineBindPoint>( pipelineBindPoint ), static_cast<VkPipeline>( pipeline ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::setViewport( uint32_t                                                                       firstViewport,\n                                  VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Viewport> const & viewports ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetViewport && \"Function <vkCmdSetViewport> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdSetViewport(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), firstViewport, viewports.size(), reinterpret_cast<const VkViewport *>( viewports.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::setScissor( uint32_t                                                                     firstScissor,\n                                 VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & scissors ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetScissor && \"Function <vkCmdSetScissor> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdSetScissor(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), firstScissor, scissors.size(), reinterpret_cast<const VkRect2D *>( scissors.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setLineWidth( float lineWidth ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetLineWidth && \"Function <vkCmdSetLineWidth> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdSetLineWidth( static_cast<VkCommandBuffer>( m_commandBuffer ), lineWidth );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::setDepthBias( float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDepthBias && \"Function <vkCmdSetDepthBias> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdSetDepthBias( static_cast<VkCommandBuffer>( m_commandBuffer ), depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setBlendConstants( const float blendConstants[4] ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetBlendConstants && \"Function <vkCmdSetBlendConstants> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdSetBlendConstants( static_cast<VkCommandBuffer>( m_commandBuffer ), blendConstants );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setDepthBounds( float minDepthBounds, float maxDepthBounds ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDepthBounds && \"Function <vkCmdSetDepthBounds> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdSetDepthBounds( static_cast<VkCommandBuffer>( m_commandBuffer ), minDepthBounds, maxDepthBounds );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setStencilCompareMask( VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask,\n                                                                 uint32_t                               compareMask ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetStencilCompareMask && \"Function <vkCmdSetStencilCompareMask> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdSetStencilCompareMask( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkStencilFaceFlags>( faceMask ), compareMask );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setStencilWriteMask( VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask, uint32_t writeMask ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetStencilWriteMask && \"Function <vkCmdSetStencilWriteMask> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdSetStencilWriteMask( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkStencilFaceFlags>( faceMask ), writeMask );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setStencilReference( VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask, uint32_t reference ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetStencilReference && \"Function <vkCmdSetStencilReference> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdSetStencilReference( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkStencilFaceFlags>( faceMask ), reference );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::bindDescriptorSets( VULKAN_HPP_NAMESPACE::PipelineBindPoint                                             pipelineBindPoint,\n                                         VULKAN_HPP_NAMESPACE::PipelineLayout                                                layout,\n                                         uint32_t                                                                            firstSet,\n                                         VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DescriptorSet> const & descriptorSets,\n                                         VULKAN_HPP_NAMESPACE::ArrayProxy<const uint32_t> const & dynamicOffsets ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBindDescriptorSets && \"Function <vkCmdBindDescriptorSets> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdBindDescriptorSets( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                static_cast<VkPipelineBindPoint>( pipelineBindPoint ),\n                                                static_cast<VkPipelineLayout>( layout ),\n                                                firstSet,\n                                                descriptorSets.size(),\n                                                reinterpret_cast<const VkDescriptorSet *>( descriptorSets.data() ),\n                                                dynamicOffsets.size(),\n                                                dynamicOffsets.data() );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::bindIndexBuffer( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                           VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                           VULKAN_HPP_NAMESPACE::IndexType  indexType ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBindIndexBuffer && \"Function <vkCmdBindIndexBuffer> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdBindIndexBuffer( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                             static_cast<VkBuffer>( buffer ),\n                                             static_cast<VkDeviceSize>( offset ),\n                                             static_cast<VkIndexType>( indexType ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::bindVertexBuffers( uint32_t                                                                         firstBinding,\n                                                             VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &     buffers,\n                                                             VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & offsets ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBindVertexBuffers && \"Function <vkCmdBindVertexBuffers> requires <VK_VERSION_1_0>\" );\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( buffers.size() == offsets.size() );\n#  else\n      if ( buffers.size() != offsets.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::bindVertexBuffers: buffers.size() != offsets.size()\" );\n      }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n      getDispatcher()->vkCmdBindVertexBuffers( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                               firstBinding,\n                                               buffers.size(),\n                                               reinterpret_cast<const VkBuffer *>( buffers.data() ),\n                                               reinterpret_cast<const VkDeviceSize *>( offsets.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::draw( uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDraw && \"Function <vkCmdDraw> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdDraw( static_cast<VkCommandBuffer>( m_commandBuffer ), vertexCount, instanceCount, firstVertex, firstInstance );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::drawIndexed(\n      uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDrawIndexed && \"Function <vkCmdDrawIndexed> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdDrawIndexed( static_cast<VkCommandBuffer>( m_commandBuffer ), indexCount, instanceCount, firstIndex, vertexOffset, firstInstance );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::drawIndirect( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                        VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                        uint32_t                         drawCount,\n                                                        uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDrawIndirect && \"Function <vkCmdDrawIndirect> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdDrawIndirect(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBuffer>( buffer ), static_cast<VkDeviceSize>( offset ), drawCount, stride );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::drawIndexedIndirect( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                               VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                               uint32_t                         drawCount,\n                                                               uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDrawIndexedIndirect && \"Function <vkCmdDrawIndexedIndirect> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdDrawIndexedIndirect(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBuffer>( buffer ), static_cast<VkDeviceSize>( offset ), drawCount, stride );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::dispatch( uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDispatch && \"Function <vkCmdDispatch> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdDispatch( static_cast<VkCommandBuffer>( m_commandBuffer ), groupCountX, groupCountY, groupCountZ );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::dispatchIndirect( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                            VULKAN_HPP_NAMESPACE::DeviceSize offset ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDispatchIndirect && \"Function <vkCmdDispatchIndirect> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdDispatchIndirect(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBuffer>( buffer ), static_cast<VkDeviceSize>( offset ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::copyBuffer( VULKAN_HPP_NAMESPACE::Buffer                                                     srcBuffer,\n                                 VULKAN_HPP_NAMESPACE::Buffer                                                     dstBuffer,\n                                 VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferCopy> const & regions ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCopyBuffer && \"Function <vkCmdCopyBuffer> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdCopyBuffer( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                        static_cast<VkBuffer>( srcBuffer ),\n                                        static_cast<VkBuffer>( dstBuffer ),\n                                        regions.size(),\n                                        reinterpret_cast<const VkBufferCopy *>( regions.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::copyImage( VULKAN_HPP_NAMESPACE::Image                                                     srcImage,\n                                VULKAN_HPP_NAMESPACE::ImageLayout                                               srcImageLayout,\n                                VULKAN_HPP_NAMESPACE::Image                                                     dstImage,\n                                VULKAN_HPP_NAMESPACE::ImageLayout                                               dstImageLayout,\n                                VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageCopy> const & regions ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCopyImage && \"Function <vkCmdCopyImage> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdCopyImage( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                       static_cast<VkImage>( srcImage ),\n                                       static_cast<VkImageLayout>( srcImageLayout ),\n                                       static_cast<VkImage>( dstImage ),\n                                       static_cast<VkImageLayout>( dstImageLayout ),\n                                       regions.size(),\n                                       reinterpret_cast<const VkImageCopy *>( regions.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::blitImage( VULKAN_HPP_NAMESPACE::Image                                                     srcImage,\n                                                     VULKAN_HPP_NAMESPACE::ImageLayout                                               srcImageLayout,\n                                                     VULKAN_HPP_NAMESPACE::Image                                                     dstImage,\n                                                     VULKAN_HPP_NAMESPACE::ImageLayout                                               dstImageLayout,\n                                                     VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageBlit> const & regions,\n                                                     VULKAN_HPP_NAMESPACE::Filter filter ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBlitImage && \"Function <vkCmdBlitImage> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdBlitImage( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                       static_cast<VkImage>( srcImage ),\n                                       static_cast<VkImageLayout>( srcImageLayout ),\n                                       static_cast<VkImage>( dstImage ),\n                                       static_cast<VkImageLayout>( dstImageLayout ),\n                                       regions.size(),\n                                       reinterpret_cast<const VkImageBlit *>( regions.data() ),\n                                       static_cast<VkFilter>( filter ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::copyBufferToImage(\n      VULKAN_HPP_NAMESPACE::Buffer                                                          srcBuffer,\n      VULKAN_HPP_NAMESPACE::Image                                                           dstImage,\n      VULKAN_HPP_NAMESPACE::ImageLayout                                                     dstImageLayout,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferImageCopy> const & regions ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCopyBufferToImage && \"Function <vkCmdCopyBufferToImage> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdCopyBufferToImage( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                               static_cast<VkBuffer>( srcBuffer ),\n                                               static_cast<VkImage>( dstImage ),\n                                               static_cast<VkImageLayout>( dstImageLayout ),\n                                               regions.size(),\n                                               reinterpret_cast<const VkBufferImageCopy *>( regions.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::copyImageToBuffer(\n      VULKAN_HPP_NAMESPACE::Image                                                           srcImage,\n      VULKAN_HPP_NAMESPACE::ImageLayout                                                     srcImageLayout,\n      VULKAN_HPP_NAMESPACE::Buffer                                                          dstBuffer,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferImageCopy> const & regions ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCopyImageToBuffer && \"Function <vkCmdCopyImageToBuffer> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdCopyImageToBuffer( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                               static_cast<VkImage>( srcImage ),\n                                               static_cast<VkImageLayout>( srcImageLayout ),\n                                               static_cast<VkBuffer>( dstBuffer ),\n                                               regions.size(),\n                                               reinterpret_cast<const VkBufferImageCopy *>( regions.data() ) );\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_INLINE void CommandBuffer::updateBuffer( VULKAN_HPP_NAMESPACE::Buffer                             dstBuffer,\n                                                        VULKAN_HPP_NAMESPACE::DeviceSize                         dstOffset,\n                                                        VULKAN_HPP_NAMESPACE::ArrayProxy<const DataType> const & data ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdUpdateBuffer && \"Function <vkCmdUpdateBuffer> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdUpdateBuffer( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                          static_cast<VkBuffer>( dstBuffer ),\n                                          static_cast<VkDeviceSize>( dstOffset ),\n                                          data.size() * sizeof( DataType ),\n                                          reinterpret_cast<const void *>( data.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::fillBuffer( VULKAN_HPP_NAMESPACE::Buffer     dstBuffer,\n                                                      VULKAN_HPP_NAMESPACE::DeviceSize dstOffset,\n                                                      VULKAN_HPP_NAMESPACE::DeviceSize size,\n                                                      uint32_t                         data ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdFillBuffer && \"Function <vkCmdFillBuffer> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdFillBuffer( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                        static_cast<VkBuffer>( dstBuffer ),\n                                        static_cast<VkDeviceSize>( dstOffset ),\n                                        static_cast<VkDeviceSize>( size ),\n                                        data );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::clearColorImage(\n      VULKAN_HPP_NAMESPACE::Image                                                                 image,\n      VULKAN_HPP_NAMESPACE::ImageLayout                                                           imageLayout,\n      const VULKAN_HPP_NAMESPACE::ClearColorValue &                                               color,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageSubresourceRange> const & ranges ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdClearColorImage && \"Function <vkCmdClearColorImage> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdClearColorImage( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                             static_cast<VkImage>( image ),\n                                             static_cast<VkImageLayout>( imageLayout ),\n                                             reinterpret_cast<const VkClearColorValue *>( &color ),\n                                             ranges.size(),\n                                             reinterpret_cast<const VkImageSubresourceRange *>( ranges.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::clearDepthStencilImage(\n      VULKAN_HPP_NAMESPACE::Image                                                                 image,\n      VULKAN_HPP_NAMESPACE::ImageLayout                                                           imageLayout,\n      const VULKAN_HPP_NAMESPACE::ClearDepthStencilValue &                                        depthStencil,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageSubresourceRange> const & ranges ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdClearDepthStencilImage && \"Function <vkCmdClearDepthStencilImage> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdClearDepthStencilImage( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                    static_cast<VkImage>( image ),\n                                                    static_cast<VkImageLayout>( imageLayout ),\n                                                    reinterpret_cast<const VkClearDepthStencilValue *>( &depthStencil ),\n                                                    ranges.size(),\n                                                    reinterpret_cast<const VkImageSubresourceRange *>( ranges.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::clearAttachments( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ClearAttachment> const & attachments,\n                                       VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ClearRect> const &       rects ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdClearAttachments && \"Function <vkCmdClearAttachments> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdClearAttachments( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                              attachments.size(),\n                                              reinterpret_cast<const VkClearAttachment *>( attachments.data() ),\n                                              rects.size(),\n                                              reinterpret_cast<const VkClearRect *>( rects.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::resolveImage( VULKAN_HPP_NAMESPACE::Image                                                        srcImage,\n                                   VULKAN_HPP_NAMESPACE::ImageLayout                                                  srcImageLayout,\n                                   VULKAN_HPP_NAMESPACE::Image                                                        dstImage,\n                                   VULKAN_HPP_NAMESPACE::ImageLayout                                                  dstImageLayout,\n                                   VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageResolve> const & regions ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdResolveImage && \"Function <vkCmdResolveImage> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdResolveImage( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                          static_cast<VkImage>( srcImage ),\n                                          static_cast<VkImageLayout>( srcImageLayout ),\n                                          static_cast<VkImage>( dstImage ),\n                                          static_cast<VkImageLayout>( dstImageLayout ),\n                                          regions.size(),\n                                          reinterpret_cast<const VkImageResolve *>( regions.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setEvent( VULKAN_HPP_NAMESPACE::Event              event,\n                                                    VULKAN_HPP_NAMESPACE::PipelineStageFlags stageMask ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetEvent && \"Function <vkCmdSetEvent> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdSetEvent(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkEvent>( event ), static_cast<VkPipelineStageFlags>( stageMask ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::resetEvent( VULKAN_HPP_NAMESPACE::Event              event,\n                                                      VULKAN_HPP_NAMESPACE::PipelineStageFlags stageMask ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdResetEvent && \"Function <vkCmdResetEvent> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdResetEvent(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkEvent>( event ), static_cast<VkPipelineStageFlags>( stageMask ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::waitEvents(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Event> const &               events,\n      VULKAN_HPP_NAMESPACE::PipelineStageFlags                                                  srcStageMask,\n      VULKAN_HPP_NAMESPACE::PipelineStageFlags                                                  dstStageMask,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MemoryBarrier> const &       memoryBarriers,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferMemoryBarrier> const & bufferMemoryBarriers,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier> const &  imageMemoryBarriers ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdWaitEvents && \"Function <vkCmdWaitEvents> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdWaitEvents( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                        events.size(),\n                                        reinterpret_cast<const VkEvent *>( events.data() ),\n                                        static_cast<VkPipelineStageFlags>( srcStageMask ),\n                                        static_cast<VkPipelineStageFlags>( dstStageMask ),\n                                        memoryBarriers.size(),\n                                        reinterpret_cast<const VkMemoryBarrier *>( memoryBarriers.data() ),\n                                        bufferMemoryBarriers.size(),\n                                        reinterpret_cast<const VkBufferMemoryBarrier *>( bufferMemoryBarriers.data() ),\n                                        imageMemoryBarriers.size(),\n                                        reinterpret_cast<const VkImageMemoryBarrier *>( imageMemoryBarriers.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::pipelineBarrier(\n      VULKAN_HPP_NAMESPACE::PipelineStageFlags                                                  srcStageMask,\n      VULKAN_HPP_NAMESPACE::PipelineStageFlags                                                  dstStageMask,\n      VULKAN_HPP_NAMESPACE::DependencyFlags                                                     dependencyFlags,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MemoryBarrier> const &       memoryBarriers,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferMemoryBarrier> const & bufferMemoryBarriers,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier> const &  imageMemoryBarriers ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdPipelineBarrier && \"Function <vkCmdPipelineBarrier> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdPipelineBarrier( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                             static_cast<VkPipelineStageFlags>( srcStageMask ),\n                                             static_cast<VkPipelineStageFlags>( dstStageMask ),\n                                             static_cast<VkDependencyFlags>( dependencyFlags ),\n                                             memoryBarriers.size(),\n                                             reinterpret_cast<const VkMemoryBarrier *>( memoryBarriers.data() ),\n                                             bufferMemoryBarriers.size(),\n                                             reinterpret_cast<const VkBufferMemoryBarrier *>( bufferMemoryBarriers.data() ),\n                                             imageMemoryBarriers.size(),\n                                             reinterpret_cast<const VkImageMemoryBarrier *>( imageMemoryBarriers.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::beginQuery( VULKAN_HPP_NAMESPACE::QueryPool         queryPool,\n                                                      uint32_t                                query,\n                                                      VULKAN_HPP_NAMESPACE::QueryControlFlags flags ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBeginQuery && \"Function <vkCmdBeginQuery> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdBeginQuery(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkQueryPool>( queryPool ), query, static_cast<VkQueryControlFlags>( flags ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::endQuery( VULKAN_HPP_NAMESPACE::QueryPool queryPool, uint32_t query ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdEndQuery && \"Function <vkCmdEndQuery> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdEndQuery( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkQueryPool>( queryPool ), query );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::resetQueryPool( VULKAN_HPP_NAMESPACE::QueryPool queryPool, uint32_t firstQuery, uint32_t queryCount ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdResetQueryPool && \"Function <vkCmdResetQueryPool> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdResetQueryPool( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkQueryPool>( queryPool ), firstQuery, queryCount );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::writeTimestamp( VULKAN_HPP_NAMESPACE::PipelineStageFlagBits pipelineStage,\n                                                          VULKAN_HPP_NAMESPACE::QueryPool             queryPool,\n                                                          uint32_t                                    query ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdWriteTimestamp && \"Function <vkCmdWriteTimestamp> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdWriteTimestamp(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkPipelineStageFlagBits>( pipelineStage ), static_cast<VkQueryPool>( queryPool ), query );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::copyQueryPoolResults( VULKAN_HPP_NAMESPACE::QueryPool        queryPool,\n                                                                uint32_t                               firstQuery,\n                                                                uint32_t                               queryCount,\n                                                                VULKAN_HPP_NAMESPACE::Buffer           dstBuffer,\n                                                                VULKAN_HPP_NAMESPACE::DeviceSize       dstOffset,\n                                                                VULKAN_HPP_NAMESPACE::DeviceSize       stride,\n                                                                VULKAN_HPP_NAMESPACE::QueryResultFlags flags ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCopyQueryPoolResults && \"Function <vkCmdCopyQueryPoolResults> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdCopyQueryPoolResults( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                  static_cast<VkQueryPool>( queryPool ),\n                                                  firstQuery,\n                                                  queryCount,\n                                                  static_cast<VkBuffer>( dstBuffer ),\n                                                  static_cast<VkDeviceSize>( dstOffset ),\n                                                  static_cast<VkDeviceSize>( stride ),\n                                                  static_cast<VkQueryResultFlags>( flags ) );\n    }\n\n    template <typename ValuesType>\n    VULKAN_HPP_INLINE void CommandBuffer::pushConstants( VULKAN_HPP_NAMESPACE::PipelineLayout                       layout,\n                                                         VULKAN_HPP_NAMESPACE::ShaderStageFlags                     stageFlags,\n                                                         uint32_t                                                   offset,\n                                                         VULKAN_HPP_NAMESPACE::ArrayProxy<const ValuesType> const & values ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdPushConstants && \"Function <vkCmdPushConstants> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdPushConstants( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                           static_cast<VkPipelineLayout>( layout ),\n                                           static_cast<VkShaderStageFlags>( stageFlags ),\n                                           offset,\n                                           values.size() * sizeof( ValuesType ),\n                                           reinterpret_cast<const void *>( values.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::beginRenderPass( const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo & renderPassBegin,\n                                                           VULKAN_HPP_NAMESPACE::SubpassContents             contents ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBeginRenderPass && \"Function <vkCmdBeginRenderPass> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdBeginRenderPass( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                             reinterpret_cast<const VkRenderPassBeginInfo *>( &renderPassBegin ),\n                                             static_cast<VkSubpassContents>( contents ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::nextSubpass( VULKAN_HPP_NAMESPACE::SubpassContents contents ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdNextSubpass && \"Function <vkCmdNextSubpass> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdNextSubpass( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkSubpassContents>( contents ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::endRenderPass() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdEndRenderPass && \"Function <vkCmdEndRenderPass> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdEndRenderPass( static_cast<VkCommandBuffer>( m_commandBuffer ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::executeCommands(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CommandBuffer> const & commandBuffers ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdExecuteCommands && \"Function <vkCmdExecuteCommands> requires <VK_VERSION_1_0>\" );\n\n      getDispatcher()->vkCmdExecuteCommands(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), commandBuffers.size(), reinterpret_cast<const VkCommandBuffer *>( commandBuffers.data() ) );\n    }\n\n    //=== VK_VERSION_1_1 ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint32_t Context::enumerateInstanceVersion() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkEnumerateInstanceVersion && \"Function <vkEnumerateInstanceVersion> requires <VK_VERSION_1_1>\" );\n\n      uint32_t                     apiVersion;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkEnumerateInstanceVersion( &apiVersion ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Context::enumerateInstanceVersion\" );\n\n      return apiVersion;\n    }\n\n    VULKAN_HPP_INLINE void\n      Device::bindBufferMemory2( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo> const & bindInfos ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkBindBufferMemory2 && \"Function <vkBindBufferMemory2> requires <VK_KHR_bind_memory2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkBindBufferMemory2(\n        static_cast<VkDevice>( m_device ), bindInfos.size(), reinterpret_cast<const VkBindBufferMemoryInfo *>( bindInfos.data() ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::bindBufferMemory2\" );\n    }\n\n    VULKAN_HPP_INLINE void Device::bindImageMemory2( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindImageMemoryInfo> const & bindInfos ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkBindImageMemory2 && \"Function <vkBindImageMemory2> requires <VK_KHR_bind_memory2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkBindImageMemory2(\n        static_cast<VkDevice>( m_device ), bindInfos.size(), reinterpret_cast<const VkBindImageMemoryInfo *>( bindInfos.data() ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::bindImageMemory2\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags\n      Device::getGroupPeerMemoryFeatures( uint32_t heapIndex, uint32_t localDeviceIndex, uint32_t remoteDeviceIndex ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceGroupPeerMemoryFeatures &&\n                         \"Function <vkGetDeviceGroupPeerMemoryFeatures> requires <VK_KHR_device_group> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags peerMemoryFeatures;\n      getDispatcher()->vkGetDeviceGroupPeerMemoryFeatures( static_cast<VkDevice>( m_device ),\n                                                           heapIndex,\n                                                           localDeviceIndex,\n                                                           remoteDeviceIndex,\n                                                           reinterpret_cast<VkPeerMemoryFeatureFlags *>( &peerMemoryFeatures ) );\n\n      return peerMemoryFeatures;\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setDeviceMask( uint32_t deviceMask ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDeviceMask && \"Function <vkCmdSetDeviceMask> requires <VK_KHR_device_group> or <VK_VERSION_1_1>\" );\n\n      getDispatcher()->vkCmdSetDeviceMask( static_cast<VkCommandBuffer>( m_commandBuffer ), deviceMask );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::dispatchBase( uint32_t baseGroupX,\n                                                        uint32_t baseGroupY,\n                                                        uint32_t baseGroupZ,\n                                                        uint32_t groupCountX,\n                                                        uint32_t groupCountY,\n                                                        uint32_t groupCountZ ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDispatchBase && \"Function <vkCmdDispatchBase> requires <VK_KHR_device_group> or <VK_VERSION_1_1>\" );\n\n      getDispatcher()->vkCmdDispatchBase(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties> Instance::enumeratePhysicalDeviceGroups() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkEnumeratePhysicalDeviceGroups &&\n                         \"Function <vkEnumeratePhysicalDeviceGroups> requires <VK_KHR_device_group_creation> or <VK_VERSION_1_1>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties> physicalDeviceGroupProperties;\n      uint32_t                                                         physicalDeviceGroupCount;\n      VULKAN_HPP_NAMESPACE::Result                                     result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkEnumeratePhysicalDeviceGroups( static_cast<VkInstance>( m_instance ), &physicalDeviceGroupCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && physicalDeviceGroupCount )\n        {\n          physicalDeviceGroupProperties.resize( physicalDeviceGroupCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n            getDispatcher()->vkEnumeratePhysicalDeviceGroups( static_cast<VkInstance>( m_instance ),\n                                                              &physicalDeviceGroupCount,\n                                                              reinterpret_cast<VkPhysicalDeviceGroupProperties *>( physicalDeviceGroupProperties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::enumeratePhysicalDeviceGroups\" );\n      VULKAN_HPP_ASSERT( physicalDeviceGroupCount <= physicalDeviceGroupProperties.size() );\n      if ( physicalDeviceGroupCount < physicalDeviceGroupProperties.size() )\n      {\n        physicalDeviceGroupProperties.resize( physicalDeviceGroupCount );\n      }\n      return physicalDeviceGroupProperties;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2\n      Device::getImageMemoryRequirements2( const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetImageMemoryRequirements2 &&\n                         \"Function <vkGetImageMemoryRequirements2> requires <VK_KHR_get_memory_requirements2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;\n      getDispatcher()->vkGetImageMemoryRequirements2( static_cast<VkDevice>( m_device ),\n                                                      reinterpret_cast<const VkImageMemoryRequirementsInfo2 *>( &info ),\n                                                      reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n      return memoryRequirements;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n      Device::getImageMemoryRequirements2( const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetImageMemoryRequirements2 &&\n                         \"Function <vkGetImageMemoryRequirements2> requires <VK_KHR_get_memory_requirements2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2 &      memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();\n      getDispatcher()->vkGetImageMemoryRequirements2( static_cast<VkDevice>( m_device ),\n                                                      reinterpret_cast<const VkImageMemoryRequirementsInfo2 *>( &info ),\n                                                      reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2\n      Device::getBufferMemoryRequirements2( const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetBufferMemoryRequirements2 &&\n                         \"Function <vkGetBufferMemoryRequirements2> requires <VK_KHR_get_memory_requirements2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;\n      getDispatcher()->vkGetBufferMemoryRequirements2( static_cast<VkDevice>( m_device ),\n                                                       reinterpret_cast<const VkBufferMemoryRequirementsInfo2 *>( &info ),\n                                                       reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n      return memoryRequirements;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n      Device::getBufferMemoryRequirements2( const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetBufferMemoryRequirements2 &&\n                         \"Function <vkGetBufferMemoryRequirements2> requires <VK_KHR_get_memory_requirements2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2 &      memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();\n      getDispatcher()->vkGetBufferMemoryRequirements2( static_cast<VkDevice>( m_device ),\n                                                       reinterpret_cast<const VkBufferMemoryRequirementsInfo2 *>( &info ),\n                                                       reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>\n      Device::getImageSparseMemoryRequirements2( const VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 & info ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetImageSparseMemoryRequirements2 &&\n                         \"Function <vkGetImageSparseMemoryRequirements2> requires <VK_KHR_get_memory_requirements2> or <VK_VERSION_1_1>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2> sparseMemoryRequirements;\n      uint32_t                                                          sparseMemoryRequirementCount;\n      getDispatcher()->vkGetImageSparseMemoryRequirements2(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkImageSparseMemoryRequirementsInfo2 *>( &info ), &sparseMemoryRequirementCount, nullptr );\n      sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n      getDispatcher()->vkGetImageSparseMemoryRequirements2( static_cast<VkDevice>( m_device ),\n                                                            reinterpret_cast<const VkImageSparseMemoryRequirementsInfo2 *>( &info ),\n                                                            &sparseMemoryRequirementCount,\n                                                            reinterpret_cast<VkSparseImageMemoryRequirements2 *>( sparseMemoryRequirements.data() ) );\n\n      VULKAN_HPP_ASSERT( sparseMemoryRequirementCount <= sparseMemoryRequirements.size() );\n      if ( sparseMemoryRequirementCount < sparseMemoryRequirements.size() )\n      {\n        sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n      }\n      return sparseMemoryRequirements;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 PhysicalDevice::getFeatures2() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceFeatures2 &&\n                         \"Function <vkGetPhysicalDeviceFeatures2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 features;\n      getDispatcher()->vkGetPhysicalDeviceFeatures2( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                     reinterpret_cast<VkPhysicalDeviceFeatures2 *>( &features ) );\n\n      return features;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> PhysicalDevice::getFeatures2() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceFeatures2 &&\n                         \"Function <vkGetPhysicalDeviceFeatures2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 &  features = structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2>();\n      getDispatcher()->vkGetPhysicalDeviceFeatures2( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                     reinterpret_cast<VkPhysicalDeviceFeatures2 *>( &features ) );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 PhysicalDevice::getProperties2() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceProperties2 &&\n                         \"Function <vkGetPhysicalDeviceProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 properties;\n      getDispatcher()->vkGetPhysicalDeviceProperties2( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                       reinterpret_cast<VkPhysicalDeviceProperties2 *>( &properties ) );\n\n      return properties;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> PhysicalDevice::getProperties2() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceProperties2 &&\n                         \"Function <vkGetPhysicalDeviceProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>  structureChain;\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 & properties = structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2>();\n      getDispatcher()->vkGetPhysicalDeviceProperties2( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                       reinterpret_cast<VkPhysicalDeviceProperties2 *>( &properties ) );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::FormatProperties2\n                                           PhysicalDevice::getFormatProperties2( VULKAN_HPP_NAMESPACE::Format format ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceFormatProperties2 &&\n                         \"Function <vkGetPhysicalDeviceFormatProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::FormatProperties2 formatProperties;\n      getDispatcher()->vkGetPhysicalDeviceFormatProperties2(\n        static_cast<VkPhysicalDevice>( m_physicalDevice ), static_cast<VkFormat>( format ), reinterpret_cast<VkFormatProperties2 *>( &formatProperties ) );\n\n      return formatProperties;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                                           PhysicalDevice::getFormatProperties2( VULKAN_HPP_NAMESPACE::Format format ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceFormatProperties2 &&\n                         \"Function <vkGetPhysicalDeviceFormatProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n      VULKAN_HPP_NAMESPACE::FormatProperties2 &        formatProperties = structureChain.template get<VULKAN_HPP_NAMESPACE::FormatProperties2>();\n      getDispatcher()->vkGetPhysicalDeviceFormatProperties2(\n        static_cast<VkPhysicalDevice>( m_physicalDevice ), static_cast<VkFormat>( format ), reinterpret_cast<VkFormatProperties2 *>( &formatProperties ) );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ImageFormatProperties2\n      PhysicalDevice::getImageFormatProperties2( const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 & imageFormatInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceImageFormatProperties2 &&\n                         \"Function <vkGetPhysicalDeviceImageFormatProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::ImageFormatProperties2 imageFormatProperties;\n      VULKAN_HPP_NAMESPACE::Result                 result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetPhysicalDeviceImageFormatProperties2( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                    reinterpret_cast<const VkPhysicalDeviceImageFormatInfo2 *>( &imageFormatInfo ),\n                                                                    reinterpret_cast<VkImageFormatProperties2 *>( &imageFormatProperties ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getImageFormatProperties2\" );\n\n      return imageFormatProperties;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n      PhysicalDevice::getImageFormatProperties2( const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 & imageFormatInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceImageFormatProperties2 &&\n                         \"Function <vkGetPhysicalDeviceImageFormatProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      StructureChain<X, Y, Z...>                     structureChain;\n      VULKAN_HPP_NAMESPACE::ImageFormatProperties2 & imageFormatProperties = structureChain.template get<VULKAN_HPP_NAMESPACE::ImageFormatProperties2>();\n      VULKAN_HPP_NAMESPACE::Result                   result                = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetPhysicalDeviceImageFormatProperties2( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                    reinterpret_cast<const VkPhysicalDeviceImageFormatInfo2 *>( &imageFormatInfo ),\n                                                                    reinterpret_cast<VkImageFormatProperties2 *>( &imageFormatProperties ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getImageFormatProperties2\" );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2> PhysicalDevice::getQueueFamilyProperties2() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties2 &&\n                         \"Function <vkGetPhysicalDeviceQueueFamilyProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2> queueFamilyProperties;\n      uint32_t                                                  queueFamilyPropertyCount;\n      getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties2( static_cast<VkPhysicalDevice>( m_physicalDevice ), &queueFamilyPropertyCount, nullptr );\n      queueFamilyProperties.resize( queueFamilyPropertyCount );\n      getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties2( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                  &queueFamilyPropertyCount,\n                                                                  reinterpret_cast<VkQueueFamilyProperties2 *>( queueFamilyProperties.data() ) );\n\n      VULKAN_HPP_ASSERT( queueFamilyPropertyCount <= queueFamilyProperties.size() );\n      if ( queueFamilyPropertyCount < queueFamilyProperties.size() )\n      {\n        queueFamilyProperties.resize( queueFamilyPropertyCount );\n      }\n      return queueFamilyProperties;\n    }\n\n    template <typename StructureChain>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<StructureChain> PhysicalDevice::getQueueFamilyProperties2() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties2 &&\n                         \"Function <vkGetPhysicalDeviceQueueFamilyProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      std::vector<StructureChain>                               structureChains;\n      std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2> queueFamilyProperties;\n      uint32_t                                                  queueFamilyPropertyCount;\n      getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties2( static_cast<VkPhysicalDevice>( m_physicalDevice ), &queueFamilyPropertyCount, nullptr );\n      structureChains.resize( queueFamilyPropertyCount );\n      queueFamilyProperties.resize( queueFamilyPropertyCount );\n      for ( uint32_t i = 0; i < queueFamilyPropertyCount; i++ )\n      {\n        queueFamilyProperties[i].pNext = structureChains[i].template get<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>().pNext;\n      }\n      getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties2( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                  &queueFamilyPropertyCount,\n                                                                  reinterpret_cast<VkQueueFamilyProperties2 *>( queueFamilyProperties.data() ) );\n\n      VULKAN_HPP_ASSERT( queueFamilyPropertyCount <= queueFamilyProperties.size() );\n      if ( queueFamilyPropertyCount < queueFamilyProperties.size() )\n      {\n        structureChains.resize( queueFamilyPropertyCount );\n      }\n      for ( uint32_t i = 0; i < queueFamilyPropertyCount; i++ )\n      {\n        structureChains[i].template get<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>() = queueFamilyProperties[i];\n      }\n      return structureChains;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2\n                                           PhysicalDevice::getMemoryProperties2() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceMemoryProperties2 &&\n                         \"Function <vkGetPhysicalDeviceMemoryProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 memoryProperties;\n      getDispatcher()->vkGetPhysicalDeviceMemoryProperties2( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                             reinterpret_cast<VkPhysicalDeviceMemoryProperties2 *>( &memoryProperties ) );\n\n      return memoryProperties;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> PhysicalDevice::getMemoryProperties2() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceMemoryProperties2 &&\n                         \"Function <vkGetPhysicalDeviceMemoryProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>        structureChain;\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 & memoryProperties =\n        structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2>();\n      getDispatcher()->vkGetPhysicalDeviceMemoryProperties2( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                             reinterpret_cast<VkPhysicalDeviceMemoryProperties2 *>( &memoryProperties ) );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2>\n      PhysicalDevice::getSparseImageFormatProperties2( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 & formatInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceSparseImageFormatProperties2 &&\n                         \"Function <vkGetPhysicalDeviceSparseImageFormatProperties2> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2> properties;\n      uint32_t                                                        propertyCount;\n      getDispatcher()->vkGetPhysicalDeviceSparseImageFormatProperties2( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                        reinterpret_cast<const VkPhysicalDeviceSparseImageFormatInfo2 *>( &formatInfo ),\n                                                                        &propertyCount,\n                                                                        nullptr );\n      properties.resize( propertyCount );\n      getDispatcher()->vkGetPhysicalDeviceSparseImageFormatProperties2( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                        reinterpret_cast<const VkPhysicalDeviceSparseImageFormatInfo2 *>( &formatInfo ),\n                                                                        &propertyCount,\n                                                                        reinterpret_cast<VkSparseImageFormatProperties2 *>( properties.data() ) );\n\n      VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n      if ( propertyCount < properties.size() )\n      {\n        properties.resize( propertyCount );\n      }\n      return properties;\n    }\n\n    VULKAN_HPP_INLINE void CommandPool::trim( VULKAN_HPP_NAMESPACE::CommandPoolTrimFlags flags ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkTrimCommandPool && \"Function <vkTrimCommandPool> requires <VK_KHR_maintenance1> or <VK_VERSION_1_1>\" );\n\n      getDispatcher()->vkTrimCommandPool(\n        static_cast<VkDevice>( m_device ), static_cast<VkCommandPool>( m_commandPool ), static_cast<VkCommandPoolTrimFlags>( flags ) );\n    }\n\n    VULKAN_HPP_NODISCARD\n      VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Queue>::Type\n                        Device::getQueue2( VULKAN_HPP_NAMESPACE::DeviceQueueInfo2 const & queueInfo ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::Queue queue;\n      getDispatcher()->vkGetDeviceQueue2(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkDeviceQueueInfo2 *>( &queueInfo ), reinterpret_cast<VkQueue *>( &queue ) );\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Queue( *this, *reinterpret_cast<VkQueue *>( &queue ) );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SamplerYcbcrConversion>::Type\n      Device::createSamplerYcbcrConversion( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo const &                  createInfo,\n                                            VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion ycbcrConversion;\n      VULKAN_HPP_NAMESPACE::Result                 result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateSamplerYcbcrConversion(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkSamplerYcbcrConversionCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkSamplerYcbcrConversion *>( &ycbcrConversion ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createSamplerYcbcrConversion\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SamplerYcbcrConversion(\n        *this, *reinterpret_cast<VkSamplerYcbcrConversion *>( &ycbcrConversion ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorUpdateTemplate>::Type\n      Device::createDescriptorUpdateTemplate( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo const &                createInfo,\n                                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate;\n      VULKAN_HPP_NAMESPACE::Result                   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateDescriptorUpdateTemplate(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkDescriptorUpdateTemplateCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkDescriptorUpdateTemplate *>( &descriptorUpdateTemplate ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createDescriptorUpdateTemplate\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorUpdateTemplate(\n        *this, *reinterpret_cast<VkDescriptorUpdateTemplate *>( &descriptorUpdateTemplate ), allocator );\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_INLINE void DescriptorSet::updateWithTemplate( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,\n                                                              DataType const &                               data ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkUpdateDescriptorSetWithTemplate &&\n                         \"Function <vkUpdateDescriptorSetWithTemplate> requires <VK_KHR_descriptor_update_template> or <VK_VERSION_1_1>\" );\n\n      getDispatcher()->vkUpdateDescriptorSetWithTemplate( static_cast<VkDevice>( m_device ),\n                                                          static_cast<VkDescriptorSet>( m_descriptorSet ),\n                                                          static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),\n                                                          reinterpret_cast<const void *>( &data ) );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ExternalBufferProperties\n      PhysicalDevice::getExternalBufferProperties( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo & externalBufferInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceExternalBufferProperties &&\n                         \"Function <vkGetPhysicalDeviceExternalBufferProperties> requires <VK_KHR_external_memory_capabilities> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::ExternalBufferProperties externalBufferProperties;\n      getDispatcher()->vkGetPhysicalDeviceExternalBufferProperties( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                    reinterpret_cast<const VkPhysicalDeviceExternalBufferInfo *>( &externalBufferInfo ),\n                                                                    reinterpret_cast<VkExternalBufferProperties *>( &externalBufferProperties ) );\n\n      return externalBufferProperties;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ExternalFenceProperties\n      PhysicalDevice::getExternalFenceProperties( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo & externalFenceInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceExternalFenceProperties &&\n                         \"Function <vkGetPhysicalDeviceExternalFenceProperties> requires <VK_KHR_external_fence_capabilities> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::ExternalFenceProperties externalFenceProperties;\n      getDispatcher()->vkGetPhysicalDeviceExternalFenceProperties( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                   reinterpret_cast<const VkPhysicalDeviceExternalFenceInfo *>( &externalFenceInfo ),\n                                                                   reinterpret_cast<VkExternalFenceProperties *>( &externalFenceProperties ) );\n\n      return externalFenceProperties;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties PhysicalDevice::getExternalSemaphoreProperties(\n      const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo & externalSemaphoreInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceExternalSemaphoreProperties &&\n                         \"Function <vkGetPhysicalDeviceExternalSemaphoreProperties> requires <VK_KHR_external_semaphore_capabilities> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties externalSemaphoreProperties;\n      getDispatcher()->vkGetPhysicalDeviceExternalSemaphoreProperties(\n        static_cast<VkPhysicalDevice>( m_physicalDevice ),\n        reinterpret_cast<const VkPhysicalDeviceExternalSemaphoreInfo *>( &externalSemaphoreInfo ),\n        reinterpret_cast<VkExternalSemaphoreProperties *>( &externalSemaphoreProperties ) );\n\n      return externalSemaphoreProperties;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport\n      Device::getDescriptorSetLayoutSupport( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo & createInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDescriptorSetLayoutSupport &&\n                         \"Function <vkGetDescriptorSetLayoutSupport> requires <VK_KHR_maintenance3> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport support;\n      getDispatcher()->vkGetDescriptorSetLayoutSupport( static_cast<VkDevice>( m_device ),\n                                                        reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>( &createInfo ),\n                                                        reinterpret_cast<VkDescriptorSetLayoutSupport *>( &support ) );\n\n      return support;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n      Device::getDescriptorSetLayoutSupport( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo & createInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDescriptorSetLayoutSupport &&\n                         \"Function <vkGetDescriptorSetLayoutSupport> requires <VK_KHR_maintenance3> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>   structureChain;\n      VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport & support = structureChain.template get<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport>();\n      getDispatcher()->vkGetDescriptorSetLayoutSupport( static_cast<VkDevice>( m_device ),\n                                                        reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>( &createInfo ),\n                                                        reinterpret_cast<VkDescriptorSetLayoutSupport *>( &support ) );\n\n      return structureChain;\n    }\n\n    //=== VK_VERSION_1_2 ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::drawIndirectCount( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                             VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                             VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                                             VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                                             uint32_t                         maxDrawCount,\n                                                             uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDrawIndirectCount &&\n                         \"Function <vkCmdDrawIndirectCount> requires <VK_AMD_draw_indirect_count> or <VK_KHR_draw_indirect_count> or <VK_VERSION_1_2>\" );\n\n      getDispatcher()->vkCmdDrawIndirectCount( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                               static_cast<VkBuffer>( buffer ),\n                                               static_cast<VkDeviceSize>( offset ),\n                                               static_cast<VkBuffer>( countBuffer ),\n                                               static_cast<VkDeviceSize>( countBufferOffset ),\n                                               maxDrawCount,\n                                               stride );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::drawIndexedIndirectCount( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                                    VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                                    VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                                                    VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                                                    uint32_t                         maxDrawCount,\n                                                                    uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDrawIndexedIndirectCount &&\n                         \"Function <vkCmdDrawIndexedIndirectCount> requires <VK_AMD_draw_indirect_count> or <VK_KHR_draw_indirect_count> or <VK_VERSION_1_2>\" );\n\n      getDispatcher()->vkCmdDrawIndexedIndirectCount( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                      static_cast<VkBuffer>( buffer ),\n                                                      static_cast<VkDeviceSize>( offset ),\n                                                      static_cast<VkBuffer>( countBuffer ),\n                                                      static_cast<VkDeviceSize>( countBufferOffset ),\n                                                      maxDrawCount,\n                                                      stride );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::RenderPass>::Type\n      Device::createRenderPass2( VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 const &                             createInfo,\n                                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::RenderPass renderPass;\n      VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateRenderPass2(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkRenderPassCreateInfo2 *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkRenderPass *>( &renderPass ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createRenderPass2\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::RenderPass( *this, *reinterpret_cast<VkRenderPass *>( &renderPass ), allocator );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::beginRenderPass2( const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo & renderPassBegin,\n                                                            const VULKAN_HPP_NAMESPACE::SubpassBeginInfo &    subpassBeginInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBeginRenderPass2 &&\n                         \"Function <vkCmdBeginRenderPass2> requires <VK_KHR_create_renderpass2> or <VK_VERSION_1_2>\" );\n\n      getDispatcher()->vkCmdBeginRenderPass2( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                              reinterpret_cast<const VkRenderPassBeginInfo *>( &renderPassBegin ),\n                                              reinterpret_cast<const VkSubpassBeginInfo *>( &subpassBeginInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::nextSubpass2( const VULKAN_HPP_NAMESPACE::SubpassBeginInfo & subpassBeginInfo,\n                                                        const VULKAN_HPP_NAMESPACE::SubpassEndInfo &   subpassEndInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdNextSubpass2 && \"Function <vkCmdNextSubpass2> requires <VK_KHR_create_renderpass2> or <VK_VERSION_1_2>\" );\n\n      getDispatcher()->vkCmdNextSubpass2( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                          reinterpret_cast<const VkSubpassBeginInfo *>( &subpassBeginInfo ),\n                                          reinterpret_cast<const VkSubpassEndInfo *>( &subpassEndInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::endRenderPass2( const VULKAN_HPP_NAMESPACE::SubpassEndInfo & subpassEndInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdEndRenderPass2 && \"Function <vkCmdEndRenderPass2> requires <VK_KHR_create_renderpass2> or <VK_VERSION_1_2>\" );\n\n      getDispatcher()->vkCmdEndRenderPass2( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkSubpassEndInfo *>( &subpassEndInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void QueryPool::reset( uint32_t firstQuery, uint32_t queryCount ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkResetQueryPool && \"Function <vkResetQueryPool> requires <VK_EXT_host_query_reset> or <VK_VERSION_1_2>\" );\n\n      getDispatcher()->vkResetQueryPool( static_cast<VkDevice>( m_device ), static_cast<VkQueryPool>( m_queryPool ), firstQuery, queryCount );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint64_t Semaphore::getCounterValue() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetSemaphoreCounterValue &&\n                         \"Function <vkGetSemaphoreCounterValue> requires <VK_KHR_timeline_semaphore> or <VK_VERSION_1_2>\" );\n\n      uint64_t                     value;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetSemaphoreCounterValue( static_cast<VkDevice>( m_device ), static_cast<VkSemaphore>( m_semaphore ), &value ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Semaphore::getCounterValue\" );\n\n      return value;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result Device::waitSemaphores( const VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo & waitInfo,\n                                                                                                uint64_t                                        timeout ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkWaitSemaphores && \"Function <vkWaitSemaphores> requires <VK_KHR_timeline_semaphore> or <VK_VERSION_1_2>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkWaitSemaphores( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkSemaphoreWaitInfo *>( &waitInfo ), timeout ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck(\n        result, VULKAN_HPP_NAMESPACE_STRING \"::Device::waitSemaphores\", { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eTimeout } );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n    }\n\n    VULKAN_HPP_INLINE void Device::signalSemaphore( const VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo & signalInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkSignalSemaphore && \"Function <vkSignalSemaphore> requires <VK_KHR_timeline_semaphore> or <VK_VERSION_1_2>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkSignalSemaphore( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkSemaphoreSignalInfo *>( &signalInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::signalSemaphore\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceAddress\n                                           Device::getBufferAddress( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetBufferDeviceAddress &&\n                         \"Function <vkGetBufferDeviceAddress> requires <VK_EXT_buffer_device_address> or <VK_KHR_buffer_device_address> or <VK_VERSION_1_2>\" );\n\n      VkDeviceAddress result =\n        getDispatcher()->vkGetBufferDeviceAddress( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkBufferDeviceAddressInfo *>( &info ) );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::DeviceAddress>( result );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint64_t\n      Device::getBufferOpaqueCaptureAddress( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetBufferOpaqueCaptureAddress &&\n                         \"Function <vkGetBufferOpaqueCaptureAddress> requires <VK_KHR_buffer_device_address> or <VK_VERSION_1_2>\" );\n\n      uint64_t result =\n        getDispatcher()->vkGetBufferOpaqueCaptureAddress( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkBufferDeviceAddressInfo *>( &info ) );\n\n      return result;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint64_t\n      Device::getMemoryOpaqueCaptureAddress( const VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceMemoryOpaqueCaptureAddress &&\n                         \"Function <vkGetDeviceMemoryOpaqueCaptureAddress> requires <VK_KHR_buffer_device_address> or <VK_VERSION_1_2>\" );\n\n      uint64_t result = getDispatcher()->vkGetDeviceMemoryOpaqueCaptureAddress( static_cast<VkDevice>( m_device ),\n                                                                                reinterpret_cast<const VkDeviceMemoryOpaqueCaptureAddressInfo *>( &info ) );\n\n      return result;\n    }\n\n    //=== VK_VERSION_1_3 ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties> PhysicalDevice::getToolProperties() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceToolProperties &&\n                         \"Function <vkGetPhysicalDeviceToolProperties> requires <VK_EXT_tooling_info> or <VK_VERSION_1_3>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties> toolProperties;\n      uint32_t                                                        toolCount;\n      VULKAN_HPP_NAMESPACE::Result                                    result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkGetPhysicalDeviceToolProperties( static_cast<VkPhysicalDevice>( m_physicalDevice ), &toolCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && toolCount )\n        {\n          toolProperties.resize( toolCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceToolProperties(\n            static_cast<VkPhysicalDevice>( m_physicalDevice ), &toolCount, reinterpret_cast<VkPhysicalDeviceToolProperties *>( toolProperties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getToolProperties\" );\n      VULKAN_HPP_ASSERT( toolCount <= toolProperties.size() );\n      if ( toolCount < toolProperties.size() )\n      {\n        toolProperties.resize( toolCount );\n      }\n      return toolProperties;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PrivateDataSlot>::Type\n      Device::createPrivateDataSlot( VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo const &                         createInfo,\n                                     VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot;\n      VULKAN_HPP_NAMESPACE::Result          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreatePrivateDataSlot(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkPrivateDataSlotCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkPrivateDataSlot *>( &privateDataSlot ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createPrivateDataSlot\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PrivateDataSlot( *this, *reinterpret_cast<VkPrivateDataSlot *>( &privateDataSlot ), allocator );\n    }\n\n    VULKAN_HPP_INLINE void Device::setPrivateData( VULKAN_HPP_NAMESPACE::ObjectType      objectType_,\n                                                   uint64_t                              objectHandle,\n                                                   VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,\n                                                   uint64_t                              data ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkSetPrivateData && \"Function <vkSetPrivateData> requires <VK_EXT_private_data> or <VK_VERSION_1_3>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkSetPrivateData(\n        static_cast<VkDevice>( m_device ), static_cast<VkObjectType>( objectType_ ), objectHandle, static_cast<VkPrivateDataSlot>( privateDataSlot ), data ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::setPrivateData\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint64_t Device::getPrivateData( VULKAN_HPP_NAMESPACE::ObjectType      objectType_,\n                                                                            uint64_t                              objectHandle,\n                                                                            VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPrivateData && \"Function <vkGetPrivateData> requires <VK_EXT_private_data> or <VK_VERSION_1_3>\" );\n\n      uint64_t data;\n      getDispatcher()->vkGetPrivateData(\n        static_cast<VkDevice>( m_device ), static_cast<VkObjectType>( objectType_ ), objectHandle, static_cast<VkPrivateDataSlot>( privateDataSlot ), &data );\n\n      return data;\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setEvent2( VULKAN_HPP_NAMESPACE::Event                  event,\n                                                     const VULKAN_HPP_NAMESPACE::DependencyInfo & dependencyInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetEvent2 && \"Function <vkCmdSetEvent2> requires <VK_KHR_synchronization2> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetEvent2(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkEvent>( event ), reinterpret_cast<const VkDependencyInfo *>( &dependencyInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::resetEvent2( VULKAN_HPP_NAMESPACE::Event               event,\n                                                       VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stageMask ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdResetEvent2 && \"Function <vkCmdResetEvent2> requires <VK_KHR_synchronization2> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdResetEvent2(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkEvent>( event ), static_cast<VkPipelineStageFlags2>( stageMask ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::waitEvents2( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Event> const &          events,\n                                  VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DependencyInfo> const & dependencyInfos ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdWaitEvents2 && \"Function <vkCmdWaitEvents2> requires <VK_KHR_synchronization2> or <VK_VERSION_1_3>\" );\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( events.size() == dependencyInfos.size() );\n#  else\n      if ( events.size() != dependencyInfos.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::waitEvents2: events.size() != dependencyInfos.size()\" );\n      }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n      getDispatcher()->vkCmdWaitEvents2( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                         events.size(),\n                                         reinterpret_cast<const VkEvent *>( events.data() ),\n                                         reinterpret_cast<const VkDependencyInfo *>( dependencyInfos.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::pipelineBarrier2( const VULKAN_HPP_NAMESPACE::DependencyInfo & dependencyInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdPipelineBarrier2 && \"Function <vkCmdPipelineBarrier2> requires <VK_KHR_synchronization2> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdPipelineBarrier2( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkDependencyInfo *>( &dependencyInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::writeTimestamp2( VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stage,\n                                                           VULKAN_HPP_NAMESPACE::QueryPool           queryPool,\n                                                           uint32_t                                  query ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdWriteTimestamp2 && \"Function <vkCmdWriteTimestamp2> requires <VK_KHR_synchronization2> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdWriteTimestamp2(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkPipelineStageFlags2>( stage ), static_cast<VkQueryPool>( queryPool ), query );\n    }\n\n    VULKAN_HPP_INLINE void Queue::submit2( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SubmitInfo2> const & submits,\n                                           VULKAN_HPP_NAMESPACE::Fence                                                       fence ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkQueueSubmit2 && \"Function <vkQueueSubmit2> requires <VK_KHR_synchronization2> or <VK_VERSION_1_3>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkQueueSubmit2(\n        static_cast<VkQueue>( m_queue ), submits.size(), reinterpret_cast<const VkSubmitInfo2 *>( submits.data() ), static_cast<VkFence>( fence ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Queue::submit2\" );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::copyBuffer2( const VULKAN_HPP_NAMESPACE::CopyBufferInfo2 & copyBufferInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCopyBuffer2 && \"Function <vkCmdCopyBuffer2> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdCopyBuffer2( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkCopyBufferInfo2 *>( &copyBufferInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::copyImage2( const VULKAN_HPP_NAMESPACE::CopyImageInfo2 & copyImageInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCopyImage2 && \"Function <vkCmdCopyImage2> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdCopyImage2( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkCopyImageInfo2 *>( &copyImageInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::copyBufferToImage2( const VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2 & copyBufferToImageInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCopyBufferToImage2 &&\n                         \"Function <vkCmdCopyBufferToImage2> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdCopyBufferToImage2( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                reinterpret_cast<const VkCopyBufferToImageInfo2 *>( &copyBufferToImageInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::copyImageToBuffer2( const VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2 & copyImageToBufferInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCopyImageToBuffer2 &&\n                         \"Function <vkCmdCopyImageToBuffer2> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdCopyImageToBuffer2( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                reinterpret_cast<const VkCopyImageToBufferInfo2 *>( &copyImageToBufferInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::blitImage2( const VULKAN_HPP_NAMESPACE::BlitImageInfo2 & blitImageInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBlitImage2 && \"Function <vkCmdBlitImage2> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdBlitImage2( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkBlitImageInfo2 *>( &blitImageInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::resolveImage2( const VULKAN_HPP_NAMESPACE::ResolveImageInfo2 & resolveImageInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdResolveImage2 && \"Function <vkCmdResolveImage2> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdResolveImage2( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                           reinterpret_cast<const VkResolveImageInfo2 *>( &resolveImageInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::beginRendering( const VULKAN_HPP_NAMESPACE::RenderingInfo & renderingInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBeginRendering && \"Function <vkCmdBeginRendering> requires <VK_KHR_dynamic_rendering> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdBeginRendering( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkRenderingInfo *>( &renderingInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::endRendering() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdEndRendering && \"Function <vkCmdEndRendering> requires <VK_KHR_dynamic_rendering> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdEndRendering( static_cast<VkCommandBuffer>( m_commandBuffer ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setCullMode( VULKAN_HPP_NAMESPACE::CullModeFlags cullMode ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetCullMode &&\n                         \"Function <vkCmdSetCullMode> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetCullMode( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkCullModeFlags>( cullMode ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setFrontFace( VULKAN_HPP_NAMESPACE::FrontFace frontFace ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetFrontFace &&\n                         \"Function <vkCmdSetFrontFace> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetFrontFace( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkFrontFace>( frontFace ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setPrimitiveTopology( VULKAN_HPP_NAMESPACE::PrimitiveTopology primitiveTopology ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetPrimitiveTopology &&\n                         \"Function <vkCmdSetPrimitiveTopology> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetPrimitiveTopology( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkPrimitiveTopology>( primitiveTopology ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::setViewportWithCount( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Viewport> const & viewports ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetViewportWithCount &&\n                         \"Function <vkCmdSetViewportWithCount> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetViewportWithCount(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), viewports.size(), reinterpret_cast<const VkViewport *>( viewports.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::setScissorWithCount( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & scissors ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetScissorWithCount &&\n                         \"Function <vkCmdSetScissorWithCount> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetScissorWithCount(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), scissors.size(), reinterpret_cast<const VkRect2D *>( scissors.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::bindVertexBuffers2( uint32_t                                                                         firstBinding,\n                                                              VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &     buffers,\n                                                              VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & offsets,\n                                                              VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & sizes,\n                                                              VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & strides ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBindVertexBuffers2 &&\n                         \"Function <vkCmdBindVertexBuffers2> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( buffers.size() == offsets.size() );\n      VULKAN_HPP_ASSERT( sizes.empty() || buffers.size() == sizes.size() );\n      VULKAN_HPP_ASSERT( strides.empty() || buffers.size() == strides.size() );\n#  else\n      if ( buffers.size() != offsets.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::bindVertexBuffers2: buffers.size() != offsets.size()\" );\n      }\n      if ( !sizes.empty() && buffers.size() != sizes.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::bindVertexBuffers2: buffers.size() != sizes.size()\" );\n      }\n      if ( !strides.empty() && buffers.size() != strides.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::bindVertexBuffers2: buffers.size() != strides.size()\" );\n      }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n      getDispatcher()->vkCmdBindVertexBuffers2( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                firstBinding,\n                                                buffers.size(),\n                                                reinterpret_cast<const VkBuffer *>( buffers.data() ),\n                                                reinterpret_cast<const VkDeviceSize *>( offsets.data() ),\n                                                reinterpret_cast<const VkDeviceSize *>( sizes.data() ),\n                                                reinterpret_cast<const VkDeviceSize *>( strides.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setDepthTestEnable( VULKAN_HPP_NAMESPACE::Bool32 depthTestEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDepthTestEnable &&\n                         \"Function <vkCmdSetDepthTestEnable> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetDepthTestEnable( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( depthTestEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setDepthWriteEnable( VULKAN_HPP_NAMESPACE::Bool32 depthWriteEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDepthWriteEnable &&\n                         \"Function <vkCmdSetDepthWriteEnable> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetDepthWriteEnable( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( depthWriteEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setDepthCompareOp( VULKAN_HPP_NAMESPACE::CompareOp depthCompareOp ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDepthCompareOp &&\n                         \"Function <vkCmdSetDepthCompareOp> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetDepthCompareOp( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkCompareOp>( depthCompareOp ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setDepthBoundsTestEnable( VULKAN_HPP_NAMESPACE::Bool32 depthBoundsTestEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDepthBoundsTestEnable &&\n                         \"Function <vkCmdSetDepthBoundsTestEnable> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetDepthBoundsTestEnable( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( depthBoundsTestEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setStencilTestEnable( VULKAN_HPP_NAMESPACE::Bool32 stencilTestEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetStencilTestEnable &&\n                         \"Function <vkCmdSetStencilTestEnable> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetStencilTestEnable( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( stencilTestEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setStencilOp( VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask,\n                                                        VULKAN_HPP_NAMESPACE::StencilOp        failOp,\n                                                        VULKAN_HPP_NAMESPACE::StencilOp        passOp,\n                                                        VULKAN_HPP_NAMESPACE::StencilOp        depthFailOp,\n                                                        VULKAN_HPP_NAMESPACE::CompareOp        compareOp ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetStencilOp &&\n                         \"Function <vkCmdSetStencilOp> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetStencilOp( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                          static_cast<VkStencilFaceFlags>( faceMask ),\n                                          static_cast<VkStencilOp>( failOp ),\n                                          static_cast<VkStencilOp>( passOp ),\n                                          static_cast<VkStencilOp>( depthFailOp ),\n                                          static_cast<VkCompareOp>( compareOp ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setRasterizerDiscardEnable( VULKAN_HPP_NAMESPACE::Bool32 rasterizerDiscardEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetRasterizerDiscardEnable &&\n                         \"Function <vkCmdSetRasterizerDiscardEnable> requires <VK_EXT_extended_dynamic_state2> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetRasterizerDiscardEnable( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( rasterizerDiscardEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setDepthBiasEnable( VULKAN_HPP_NAMESPACE::Bool32 depthBiasEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDepthBiasEnable &&\n                         \"Function <vkCmdSetDepthBiasEnable> requires <VK_EXT_extended_dynamic_state2> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetDepthBiasEnable( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( depthBiasEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setPrimitiveRestartEnable( VULKAN_HPP_NAMESPACE::Bool32 primitiveRestartEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetPrimitiveRestartEnable &&\n                         \"Function <vkCmdSetPrimitiveRestartEnable> requires <VK_EXT_extended_dynamic_state2> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetPrimitiveRestartEnable( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( primitiveRestartEnable ) );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2\n      Device::getBufferMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceBufferMemoryRequirements &&\n                         \"Function <vkGetDeviceBufferMemoryRequirements> requires <VK_KHR_maintenance4> or <VK_VERSION_1_3>\" );\n\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;\n      getDispatcher()->vkGetDeviceBufferMemoryRequirements( static_cast<VkDevice>( m_device ),\n                                                            reinterpret_cast<const VkDeviceBufferMemoryRequirements *>( &info ),\n                                                            reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n      return memoryRequirements;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n      Device::getBufferMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceBufferMemoryRequirements &&\n                         \"Function <vkGetDeviceBufferMemoryRequirements> requires <VK_KHR_maintenance4> or <VK_VERSION_1_3>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2 &      memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();\n      getDispatcher()->vkGetDeviceBufferMemoryRequirements( static_cast<VkDevice>( m_device ),\n                                                            reinterpret_cast<const VkDeviceBufferMemoryRequirements *>( &info ),\n                                                            reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2\n      Device::getImageMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceImageMemoryRequirements &&\n                         \"Function <vkGetDeviceImageMemoryRequirements> requires <VK_KHR_maintenance4> or <VK_VERSION_1_3>\" );\n\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;\n      getDispatcher()->vkGetDeviceImageMemoryRequirements( static_cast<VkDevice>( m_device ),\n                                                           reinterpret_cast<const VkDeviceImageMemoryRequirements *>( &info ),\n                                                           reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n      return memoryRequirements;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n      Device::getImageMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceImageMemoryRequirements &&\n                         \"Function <vkGetDeviceImageMemoryRequirements> requires <VK_KHR_maintenance4> or <VK_VERSION_1_3>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2 &      memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();\n      getDispatcher()->vkGetDeviceImageMemoryRequirements( static_cast<VkDevice>( m_device ),\n                                                           reinterpret_cast<const VkDeviceImageMemoryRequirements *>( &info ),\n                                                           reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>\n                                           Device::getImageSparseMemoryRequirements( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceImageSparseMemoryRequirements &&\n                         \"Function <vkGetDeviceImageSparseMemoryRequirements> requires <VK_KHR_maintenance4> or <VK_VERSION_1_3>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2> sparseMemoryRequirements;\n      uint32_t                                                          sparseMemoryRequirementCount;\n      getDispatcher()->vkGetDeviceImageSparseMemoryRequirements(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkDeviceImageMemoryRequirements *>( &info ), &sparseMemoryRequirementCount, nullptr );\n      sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n      getDispatcher()->vkGetDeviceImageSparseMemoryRequirements( static_cast<VkDevice>( m_device ),\n                                                                 reinterpret_cast<const VkDeviceImageMemoryRequirements *>( &info ),\n                                                                 &sparseMemoryRequirementCount,\n                                                                 reinterpret_cast<VkSparseImageMemoryRequirements2 *>( sparseMemoryRequirements.data() ) );\n\n      VULKAN_HPP_ASSERT( sparseMemoryRequirementCount <= sparseMemoryRequirements.size() );\n      if ( sparseMemoryRequirementCount < sparseMemoryRequirements.size() )\n      {\n        sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n      }\n      return sparseMemoryRequirements;\n    }\n\n    //=== VK_VERSION_1_4 ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::setLineStipple( uint32_t lineStippleFactor, uint16_t lineStipplePattern ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetLineStipple &&\n                         \"Function <vkCmdSetLineStipple> requires <VK_EXT_line_rasterization> or <VK_KHR_line_rasterization> or <VK_VERSION_1_4>\" );\n\n      getDispatcher()->vkCmdSetLineStipple( static_cast<VkCommandBuffer>( m_commandBuffer ), lineStippleFactor, lineStipplePattern );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE void * Device::mapMemory2( const VULKAN_HPP_NAMESPACE::MemoryMapInfo & memoryMapInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkMapMemory2 && \"Function <vkMapMemory2> requires <VK_KHR_map_memory2> or <VK_VERSION_1_4>\" );\n\n      void *                       pData;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkMapMemory2( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkMemoryMapInfo *>( &memoryMapInfo ), &pData ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::mapMemory2\" );\n\n      return pData;\n    }\n\n    VULKAN_HPP_INLINE void Device::unmapMemory2( const VULKAN_HPP_NAMESPACE::MemoryUnmapInfo & memoryUnmapInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkUnmapMemory2 && \"Function <vkUnmapMemory2> requires <VK_KHR_map_memory2> or <VK_VERSION_1_4>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkUnmapMemory2( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkMemoryUnmapInfo *>( &memoryUnmapInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::unmapMemory2\" );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::bindIndexBuffer2( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                            VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                            VULKAN_HPP_NAMESPACE::DeviceSize size,\n                                                            VULKAN_HPP_NAMESPACE::IndexType  indexType ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBindIndexBuffer2 && \"Function <vkCmdBindIndexBuffer2> requires <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n\n      getDispatcher()->vkCmdBindIndexBuffer2( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                              static_cast<VkBuffer>( buffer ),\n                                              static_cast<VkDeviceSize>( offset ),\n                                              static_cast<VkDeviceSize>( size ),\n                                              static_cast<VkIndexType>( indexType ) );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Extent2D\n      Device::getRenderingAreaGranularity( const VULKAN_HPP_NAMESPACE::RenderingAreaInfo & renderingAreaInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetRenderingAreaGranularity &&\n                         \"Function <vkGetRenderingAreaGranularity> requires <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n\n      VULKAN_HPP_NAMESPACE::Extent2D granularity;\n      getDispatcher()->vkGetRenderingAreaGranularity( static_cast<VkDevice>( m_device ),\n                                                      reinterpret_cast<const VkRenderingAreaInfo *>( &renderingAreaInfo ),\n                                                      reinterpret_cast<VkExtent2D *>( &granularity ) );\n\n      return granularity;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::SubresourceLayout2\n      Device::getImageSubresourceLayout( const VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceImageSubresourceLayout &&\n                         \"Function <vkGetDeviceImageSubresourceLayout> requires <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n\n      VULKAN_HPP_NAMESPACE::SubresourceLayout2 layout;\n      getDispatcher()->vkGetDeviceImageSubresourceLayout( static_cast<VkDevice>( m_device ),\n                                                          reinterpret_cast<const VkDeviceImageSubresourceInfo *>( &info ),\n                                                          reinterpret_cast<VkSubresourceLayout2 *>( &layout ) );\n\n      return layout;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n      Device::getImageSubresourceLayout( const VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceImageSubresourceLayout &&\n                         \"Function <vkGetDeviceImageSubresourceLayout> requires <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n      VULKAN_HPP_NAMESPACE::SubresourceLayout2 &       layout = structureChain.template get<VULKAN_HPP_NAMESPACE::SubresourceLayout2>();\n      getDispatcher()->vkGetDeviceImageSubresourceLayout( static_cast<VkDevice>( m_device ),\n                                                          reinterpret_cast<const VkDeviceImageSubresourceInfo *>( &info ),\n                                                          reinterpret_cast<VkSubresourceLayout2 *>( &layout ) );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::SubresourceLayout2\n                                           Image::getSubresourceLayout2( const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT(\n        getDispatcher()->vkGetImageSubresourceLayout2 &&\n        \"Function <vkGetImageSubresourceLayout2> requires <VK_EXT_host_image_copy> or <VK_EXT_image_compression_control> or <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n\n      VULKAN_HPP_NAMESPACE::SubresourceLayout2 layout;\n      getDispatcher()->vkGetImageSubresourceLayout2( static_cast<VkDevice>( m_device ),\n                                                     static_cast<VkImage>( m_image ),\n                                                     reinterpret_cast<const VkImageSubresource2 *>( &subresource ),\n                                                     reinterpret_cast<VkSubresourceLayout2 *>( &layout ) );\n\n      return layout;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                                           Image::getSubresourceLayout2( const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT(\n        getDispatcher()->vkGetImageSubresourceLayout2 &&\n        \"Function <vkGetImageSubresourceLayout2> requires <VK_EXT_host_image_copy> or <VK_EXT_image_compression_control> or <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n      VULKAN_HPP_NAMESPACE::SubresourceLayout2 &       layout = structureChain.template get<VULKAN_HPP_NAMESPACE::SubresourceLayout2>();\n      getDispatcher()->vkGetImageSubresourceLayout2( static_cast<VkDevice>( m_device ),\n                                                     static_cast<VkImage>( m_image ),\n                                                     reinterpret_cast<const VkImageSubresource2 *>( &subresource ),\n                                                     reinterpret_cast<VkSubresourceLayout2 *>( &layout ) );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::pushDescriptorSet(\n      VULKAN_HPP_NAMESPACE::PipelineBindPoint                                                  pipelineBindPoint,\n      VULKAN_HPP_NAMESPACE::PipelineLayout                                                     layout,\n      uint32_t                                                                                 set,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteDescriptorSet> const & descriptorWrites ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdPushDescriptorSet && \"Function <vkCmdPushDescriptorSet> requires <VK_KHR_push_descriptor> or <VK_VERSION_1_4>\" );\n\n      getDispatcher()->vkCmdPushDescriptorSet( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                               static_cast<VkPipelineBindPoint>( pipelineBindPoint ),\n                                               static_cast<VkPipelineLayout>( layout ),\n                                               set,\n                                               descriptorWrites.size(),\n                                               reinterpret_cast<const VkWriteDescriptorSet *>( descriptorWrites.data() ) );\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_INLINE void CommandBuffer::pushDescriptorSetWithTemplate( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,\n                                                                         VULKAN_HPP_NAMESPACE::PipelineLayout           layout,\n                                                                         uint32_t                                       set,\n                                                                         DataType const &                               data ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT(\n        getDispatcher()->vkCmdPushDescriptorSetWithTemplate &&\n        \"Function <vkCmdPushDescriptorSetWithTemplate> requires <VK_KHR_descriptor_update_template> or <VK_KHR_push_descriptor> or <VK_VERSION_1_4>\" );\n\n      getDispatcher()->vkCmdPushDescriptorSetWithTemplate( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                           static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),\n                                                           static_cast<VkPipelineLayout>( layout ),\n                                                           set,\n                                                           reinterpret_cast<const void *>( &data ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::setRenderingAttachmentLocations( const VULKAN_HPP_NAMESPACE::RenderingAttachmentLocationInfo & locationInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetRenderingAttachmentLocations &&\n                         \"Function <vkCmdSetRenderingAttachmentLocations> requires <VK_KHR_dynamic_rendering_local_read> or <VK_VERSION_1_4>\" );\n\n      getDispatcher()->vkCmdSetRenderingAttachmentLocations( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                             reinterpret_cast<const VkRenderingAttachmentLocationInfo *>( &locationInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setRenderingInputAttachmentIndices(\n      const VULKAN_HPP_NAMESPACE::RenderingInputAttachmentIndexInfo & inputAttachmentIndexInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetRenderingInputAttachmentIndices &&\n                         \"Function <vkCmdSetRenderingInputAttachmentIndices> requires <VK_KHR_dynamic_rendering_local_read> or <VK_VERSION_1_4>\" );\n\n      getDispatcher()->vkCmdSetRenderingInputAttachmentIndices( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                                reinterpret_cast<const VkRenderingInputAttachmentIndexInfo *>( &inputAttachmentIndexInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::bindDescriptorSets2( const VULKAN_HPP_NAMESPACE::BindDescriptorSetsInfo & bindDescriptorSetsInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBindDescriptorSets2 &&\n                         \"Function <vkCmdBindDescriptorSets2> requires <VK_KHR_maintenance6> or <VK_VERSION_1_4>\" );\n\n      getDispatcher()->vkCmdBindDescriptorSets2( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                 reinterpret_cast<const VkBindDescriptorSetsInfo *>( &bindDescriptorSetsInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::pushConstants2( const VULKAN_HPP_NAMESPACE::PushConstantsInfo & pushConstantsInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdPushConstants2 && \"Function <vkCmdPushConstants2> requires <VK_KHR_maintenance6> or <VK_VERSION_1_4>\" );\n\n      getDispatcher()->vkCmdPushConstants2( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                            reinterpret_cast<const VkPushConstantsInfo *>( &pushConstantsInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::pushDescriptorSet2( const VULKAN_HPP_NAMESPACE::PushDescriptorSetInfo & pushDescriptorSetInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdPushDescriptorSet2 && \"Function <vkCmdPushDescriptorSet2> requires <VK_KHR_maintenance6> or <VK_VERSION_1_4>\" );\n\n      getDispatcher()->vkCmdPushDescriptorSet2( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                reinterpret_cast<const VkPushDescriptorSetInfo *>( &pushDescriptorSetInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::pushDescriptorSetWithTemplate2(\n      const VULKAN_HPP_NAMESPACE::PushDescriptorSetWithTemplateInfo & pushDescriptorSetWithTemplateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdPushDescriptorSetWithTemplate2 &&\n                         \"Function <vkCmdPushDescriptorSetWithTemplate2> requires <VK_KHR_maintenance6> or <VK_VERSION_1_4>\" );\n\n      getDispatcher()->vkCmdPushDescriptorSetWithTemplate2(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkPushDescriptorSetWithTemplateInfo *>( &pushDescriptorSetWithTemplateInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void Device::copyMemoryToImage( const VULKAN_HPP_NAMESPACE::CopyMemoryToImageInfo & copyMemoryToImageInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCopyMemoryToImage && \"Function <vkCopyMemoryToImage> requires <VK_EXT_host_image_copy> or <VK_VERSION_1_4>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCopyMemoryToImage(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkCopyMemoryToImageInfo *>( &copyMemoryToImageInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::copyMemoryToImage\" );\n    }\n\n    VULKAN_HPP_INLINE void Device::copyImageToMemory( const VULKAN_HPP_NAMESPACE::CopyImageToMemoryInfo & copyImageToMemoryInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCopyImageToMemory && \"Function <vkCopyImageToMemory> requires <VK_EXT_host_image_copy> or <VK_VERSION_1_4>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCopyImageToMemory(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkCopyImageToMemoryInfo *>( &copyImageToMemoryInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::copyImageToMemory\" );\n    }\n\n    VULKAN_HPP_INLINE void Device::copyImageToImage( const VULKAN_HPP_NAMESPACE::CopyImageToImageInfo & copyImageToImageInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCopyImageToImage && \"Function <vkCopyImageToImage> requires <VK_EXT_host_image_copy> or <VK_VERSION_1_4>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkCopyImageToImage( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkCopyImageToImageInfo *>( &copyImageToImageInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::copyImageToImage\" );\n    }\n\n    VULKAN_HPP_INLINE void\n      Device::transitionImageLayout( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::HostImageLayoutTransitionInfo> const & transitions ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkTransitionImageLayout &&\n                         \"Function <vkTransitionImageLayout> requires <VK_EXT_host_image_copy> or <VK_VERSION_1_4>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkTransitionImageLayout(\n        static_cast<VkDevice>( m_device ), transitions.size(), reinterpret_cast<const VkHostImageLayoutTransitionInfo *>( transitions.data() ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::transitionImageLayout\" );\n    }\n\n    //=== VK_KHR_surface ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Bool32 PhysicalDevice::getSurfaceSupportKHR( uint32_t                         queueFamilyIndex,\n                                                                                                              VULKAN_HPP_NAMESPACE::SurfaceKHR surface ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceSurfaceSupportKHR && \"Function <vkGetPhysicalDeviceSurfaceSupportKHR> requires <VK_KHR_surface>\" );\n\n      VULKAN_HPP_NAMESPACE::Bool32 supported;\n      VULKAN_HPP_NAMESPACE::Result result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceSurfaceSupportKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                                                          queueFamilyIndex,\n                                                                                                          static_cast<VkSurfaceKHR>( surface ),\n                                                                                                          reinterpret_cast<VkBool32 *>( &supported ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfaceSupportKHR\" );\n\n      return supported;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR\n                                           PhysicalDevice::getSurfaceCapabilitiesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceSurfaceCapabilitiesKHR &&\n                         \"Function <vkGetPhysicalDeviceSurfaceCapabilitiesKHR> requires <VK_KHR_surface>\" );\n\n      VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR surfaceCapabilities;\n      VULKAN_HPP_NAMESPACE::Result                 result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetPhysicalDeviceSurfaceCapabilitiesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                    static_cast<VkSurfaceKHR>( surface ),\n                                                                    reinterpret_cast<VkSurfaceCapabilitiesKHR *>( &surfaceCapabilities ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfaceCapabilitiesKHR\" );\n\n      return surfaceCapabilities;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormatKHR>\n                                           PhysicalDevice::getSurfaceFormatsKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceSurfaceFormatsKHR && \"Function <vkGetPhysicalDeviceSurfaceFormatsKHR> requires <VK_KHR_surface>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormatKHR> surfaceFormats;\n      uint32_t                                            surfaceFormatCount;\n      VULKAN_HPP_NAMESPACE::Result                        result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceSurfaceFormatsKHR(\n          static_cast<VkPhysicalDevice>( m_physicalDevice ), static_cast<VkSurfaceKHR>( surface ), &surfaceFormatCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && surfaceFormatCount )\n        {\n          surfaceFormats.resize( surfaceFormatCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n            getDispatcher()->vkGetPhysicalDeviceSurfaceFormatsKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                   static_cast<VkSurfaceKHR>( surface ),\n                                                                   &surfaceFormatCount,\n                                                                   reinterpret_cast<VkSurfaceFormatKHR *>( surfaceFormats.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfaceFormatsKHR\" );\n      VULKAN_HPP_ASSERT( surfaceFormatCount <= surfaceFormats.size() );\n      if ( surfaceFormatCount < surfaceFormats.size() )\n      {\n        surfaceFormats.resize( surfaceFormatCount );\n      }\n      return surfaceFormats;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR>\n                                           PhysicalDevice::getSurfacePresentModesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceSurfacePresentModesKHR &&\n                         \"Function <vkGetPhysicalDeviceSurfacePresentModesKHR> requires <VK_KHR_surface>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR> presentModes;\n      uint32_t                                          presentModeCount;\n      VULKAN_HPP_NAMESPACE::Result                      result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceSurfacePresentModesKHR(\n          static_cast<VkPhysicalDevice>( m_physicalDevice ), static_cast<VkSurfaceKHR>( surface ), &presentModeCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && presentModeCount )\n        {\n          presentModes.resize( presentModeCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n            getDispatcher()->vkGetPhysicalDeviceSurfacePresentModesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                        static_cast<VkSurfaceKHR>( surface ),\n                                                                        &presentModeCount,\n                                                                        reinterpret_cast<VkPresentModeKHR *>( presentModes.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfacePresentModesKHR\" );\n      VULKAN_HPP_ASSERT( presentModeCount <= presentModes.size() );\n      if ( presentModeCount < presentModes.size() )\n      {\n        presentModes.resize( presentModeCount );\n      }\n      return presentModes;\n    }\n\n    //=== VK_KHR_swapchain ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SwapchainKHR>::Type\n      Device::createSwapchainKHR( VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR const &                            createInfo,\n                                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain;\n      VULKAN_HPP_NAMESPACE::Result       result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateSwapchainKHR(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkSwapchainCreateInfoKHR *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkSwapchainKHR *>( &swapchain ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createSwapchainKHR\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SwapchainKHR( *this, *reinterpret_cast<VkSwapchainKHR *>( &swapchain ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::Image> SwapchainKHR::getImages() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetSwapchainImagesKHR && \"Function <vkGetSwapchainImagesKHR> requires <VK_KHR_swapchain>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::Image> swapchainImages;\n      uint32_t                                 swapchainImageCount;\n      VULKAN_HPP_NAMESPACE::Result             result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetSwapchainImagesKHR(\n          static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( m_swapchain ), &swapchainImageCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && swapchainImageCount )\n        {\n          swapchainImages.resize( swapchainImageCount );\n          result =\n            static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetSwapchainImagesKHR( static_cast<VkDevice>( m_device ),\n                                                                                                 static_cast<VkSwapchainKHR>( m_swapchain ),\n                                                                                                 &swapchainImageCount,\n                                                                                                 reinterpret_cast<VkImage *>( swapchainImages.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::SwapchainKHR::getImages\" );\n      VULKAN_HPP_ASSERT( swapchainImageCount <= swapchainImages.size() );\n      if ( swapchainImageCount < swapchainImages.size() )\n      {\n        swapchainImages.resize( swapchainImageCount );\n      }\n      return swapchainImages;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::pair<VULKAN_HPP_NAMESPACE::Result, uint32_t>\n      SwapchainKHR::acquireNextImage( uint64_t timeout, VULKAN_HPP_NAMESPACE::Semaphore semaphore, VULKAN_HPP_NAMESPACE::Fence fence ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkAcquireNextImageKHR && \"Function <vkAcquireNextImageKHR> requires <VK_KHR_swapchain>\" );\n\n      uint32_t                     imageIndex;\n      VULKAN_HPP_NAMESPACE::Result result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkAcquireNextImageKHR( static_cast<VkDevice>( m_device ),\n                                                                                           static_cast<VkSwapchainKHR>( m_swapchain ),\n                                                                                           timeout,\n                                                                                           static_cast<VkSemaphore>( semaphore ),\n                                                                                           static_cast<VkFence>( fence ),\n                                                                                           &imageIndex ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                                 VULKAN_HPP_NAMESPACE_STRING \"::SwapchainKHR::acquireNextImage\",\n                                                 { VULKAN_HPP_NAMESPACE::Result::eSuccess,\n                                                   VULKAN_HPP_NAMESPACE::Result::eTimeout,\n                                                   VULKAN_HPP_NAMESPACE::Result::eNotReady,\n                                                   VULKAN_HPP_NAMESPACE::Result::eSuboptimalKHR } );\n\n      return std::make_pair( result, std::move( imageIndex ) );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result Queue::presentKHR( const VULKAN_HPP_NAMESPACE::PresentInfoKHR & presentInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkQueuePresentKHR && \"Function <vkQueuePresentKHR> requires <VK_KHR_swapchain>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkQueuePresentKHR( static_cast<VkQueue>( m_queue ), reinterpret_cast<const VkPresentInfoKHR *>( &presentInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck(\n        result, VULKAN_HPP_NAMESPACE_STRING \"::Queue::presentKHR\", { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eSuboptimalKHR } );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceGroupPresentCapabilitiesKHR Device::getGroupPresentCapabilitiesKHR() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceGroupPresentCapabilitiesKHR &&\n                         \"Function <vkGetDeviceGroupPresentCapabilitiesKHR> requires <VK_KHR_device_group> or <VK_KHR_swapchain>\" );\n\n      VULKAN_HPP_NAMESPACE::DeviceGroupPresentCapabilitiesKHR deviceGroupPresentCapabilities;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetDeviceGroupPresentCapabilitiesKHR(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<VkDeviceGroupPresentCapabilitiesKHR *>( &deviceGroupPresentCapabilities ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getGroupPresentCapabilitiesKHR\" );\n\n      return deviceGroupPresentCapabilities;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR\n                                           Device::getGroupSurfacePresentModesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceGroupSurfacePresentModesKHR &&\n                         \"Function <vkGetDeviceGroupSurfacePresentModesKHR> requires <VK_KHR_device_group> or <VK_KHR_swapchain>\" );\n\n      VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR modes;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetDeviceGroupSurfacePresentModesKHR(\n        static_cast<VkDevice>( m_device ), static_cast<VkSurfaceKHR>( surface ), reinterpret_cast<VkDeviceGroupPresentModeFlagsKHR *>( &modes ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getGroupSurfacePresentModesKHR\" );\n\n      return modes;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::Rect2D>\n                                           PhysicalDevice::getPresentRectanglesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDevicePresentRectanglesKHR &&\n                         \"Function <vkGetPhysicalDevicePresentRectanglesKHR> requires <VK_KHR_device_group> or <VK_KHR_swapchain>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::Rect2D> rects;\n      uint32_t                                  rectCount;\n      VULKAN_HPP_NAMESPACE::Result              result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDevicePresentRectanglesKHR(\n          static_cast<VkPhysicalDevice>( m_physicalDevice ), static_cast<VkSurfaceKHR>( surface ), &rectCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && rectCount )\n        {\n          rects.resize( rectCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n            getDispatcher()->vkGetPhysicalDevicePresentRectanglesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                      static_cast<VkSurfaceKHR>( surface ),\n                                                                      &rectCount,\n                                                                      reinterpret_cast<VkRect2D *>( rects.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getPresentRectanglesKHR\" );\n      VULKAN_HPP_ASSERT( rectCount <= rects.size() );\n      if ( rectCount < rects.size() )\n      {\n        rects.resize( rectCount );\n      }\n      return rects;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::pair<VULKAN_HPP_NAMESPACE::Result, uint32_t>\n                                           Device::acquireNextImage2KHR( const VULKAN_HPP_NAMESPACE::AcquireNextImageInfoKHR & acquireInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkAcquireNextImage2KHR && \"Function <vkAcquireNextImage2KHR> requires <VK_KHR_device_group> or <VK_KHR_swapchain>\" );\n\n      uint32_t                     imageIndex;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkAcquireNextImage2KHR(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkAcquireNextImageInfoKHR *>( &acquireInfo ), &imageIndex ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                                 VULKAN_HPP_NAMESPACE_STRING \"::Device::acquireNextImage2KHR\",\n                                                 { VULKAN_HPP_NAMESPACE::Result::eSuccess,\n                                                   VULKAN_HPP_NAMESPACE::Result::eTimeout,\n                                                   VULKAN_HPP_NAMESPACE::Result::eNotReady,\n                                                   VULKAN_HPP_NAMESPACE::Result::eSuboptimalKHR } );\n\n      return std::make_pair( result, std::move( imageIndex ) );\n    }\n\n    //=== VK_KHR_display ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR> PhysicalDevice::getDisplayPropertiesKHR() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceDisplayPropertiesKHR &&\n                         \"Function <vkGetPhysicalDeviceDisplayPropertiesKHR> requires <VK_KHR_display>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR> properties;\n      uint32_t                                                propertyCount;\n      VULKAN_HPP_NAMESPACE::Result                            result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkGetPhysicalDeviceDisplayPropertiesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ), &propertyCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n        {\n          properties.resize( propertyCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceDisplayPropertiesKHR(\n            static_cast<VkPhysicalDevice>( m_physicalDevice ), &propertyCount, reinterpret_cast<VkDisplayPropertiesKHR *>( properties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDisplayPropertiesKHR\" );\n      VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n      if ( propertyCount < properties.size() )\n      {\n        properties.resize( propertyCount );\n      }\n      return properties;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR> PhysicalDevice::getDisplayPlanePropertiesKHR() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceDisplayPlanePropertiesKHR &&\n                         \"Function <vkGetPhysicalDeviceDisplayPlanePropertiesKHR> requires <VK_KHR_display>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR> properties;\n      uint32_t                                                     propertyCount;\n      VULKAN_HPP_NAMESPACE::Result                                 result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkGetPhysicalDeviceDisplayPlanePropertiesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ), &propertyCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n        {\n          properties.resize( propertyCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceDisplayPlanePropertiesKHR(\n            static_cast<VkPhysicalDevice>( m_physicalDevice ), &propertyCount, reinterpret_cast<VkDisplayPlanePropertiesKHR *>( properties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDisplayPlanePropertiesKHR\" );\n      VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n      if ( propertyCount < properties.size() )\n      {\n        properties.resize( propertyCount );\n      }\n      return properties;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR>>::Type\n      PhysicalDevice::getDisplayPlaneSupportedDisplaysKHR( uint32_t planeIndex ) const\n    {\n      std::vector<VULKAN_HPP_NAMESPACE::DisplayKHR> displays;\n      uint32_t                                      displayCount;\n      VULKAN_HPP_NAMESPACE::Result                  result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkGetDisplayPlaneSupportedDisplaysKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ), planeIndex, &displayCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && displayCount )\n        {\n          displays.resize( displayCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetDisplayPlaneSupportedDisplaysKHR(\n            static_cast<VkPhysicalDevice>( m_physicalDevice ), planeIndex, &displayCount, reinterpret_cast<VkDisplayKHR *>( displays.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      if ( ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess ) && ( result != VULKAN_HPP_NAMESPACE::Result::eIncomplete ) )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"PhysicalDevice::getDisplayPlaneSupportedDisplaysKHR\" );\n#  endif\n      }\n\n      std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR> displaysRAII;\n      displaysRAII.reserve( displays.size() );\n      for ( auto & display : displays )\n      {\n        displaysRAII.emplace_back( *this, *reinterpret_cast<VkDisplayKHR *>( &display ) );\n      }\n      return displaysRAII;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR> DisplayKHR::getModeProperties() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDisplayModePropertiesKHR && \"Function <vkGetDisplayModePropertiesKHR> requires <VK_KHR_display>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR> properties;\n      uint32_t                                                    propertyCount;\n      VULKAN_HPP_NAMESPACE::Result                                result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetDisplayModePropertiesKHR(\n          static_cast<VkPhysicalDevice>( m_physicalDevice ), static_cast<VkDisplayKHR>( m_display ), &propertyCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n        {\n          properties.resize( propertyCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n            getDispatcher()->vkGetDisplayModePropertiesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                            static_cast<VkDisplayKHR>( m_display ),\n                                                            &propertyCount,\n                                                            reinterpret_cast<VkDisplayModePropertiesKHR *>( properties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::DisplayKHR::getModeProperties\" );\n      VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n      if ( propertyCount < properties.size() )\n      {\n        properties.resize( propertyCount );\n      }\n      return properties;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayModeKHR>::Type\n      DisplayKHR::createMode( VULKAN_HPP_NAMESPACE::DisplayModeCreateInfoKHR const &                          createInfo,\n                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::DisplayModeKHR mode;\n      VULKAN_HPP_NAMESPACE::Result         result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateDisplayModeKHR(\n        static_cast<VkPhysicalDevice>( m_physicalDevice ),\n        static_cast<VkDisplayKHR>( m_display ),\n        reinterpret_cast<const VkDisplayModeCreateInfoKHR *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkDisplayModeKHR *>( &mode ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"DisplayKHR::createMode\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayModeKHR( *this, *reinterpret_cast<VkDisplayModeKHR *>( &mode ) );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR\n                                           DisplayModeKHR::getDisplayPlaneCapabilities( uint32_t planeIndex ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDisplayPlaneCapabilitiesKHR && \"Function <vkGetDisplayPlaneCapabilitiesKHR> requires <VK_KHR_display>\" );\n\n      VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR capabilities;\n      VULKAN_HPP_NAMESPACE::Result                      result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetDisplayPlaneCapabilitiesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                           static_cast<VkDisplayModeKHR>( m_displayModeKHR ),\n                                                           planeIndex,\n                                                           reinterpret_cast<VkDisplayPlaneCapabilitiesKHR *>( &capabilities ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::DisplayModeKHR::getDisplayPlaneCapabilities\" );\n\n      return capabilities;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n      Instance::createDisplayPlaneSurfaceKHR( VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateInfoKHR const &                       createInfo,\n                                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n      VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateDisplayPlaneSurfaceKHR(\n        static_cast<VkInstance>( m_instance ),\n        reinterpret_cast<const VkDisplaySurfaceCreateInfoKHR *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Instance::createDisplayPlaneSurfaceKHR\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR( *this, *reinterpret_cast<VkSurfaceKHR *>( &surface ), allocator );\n    }\n\n    //=== VK_KHR_display_swapchain ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n      std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SwapchainKHR>>::Type\n      Device::createSharedSwapchainsKHR( VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR> const & createInfos,\n                                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>        allocator ) const\n    {\n      std::vector<VULKAN_HPP_NAMESPACE::SwapchainKHR> swapchains( createInfos.size() );\n      VULKAN_HPP_NAMESPACE::Result                    result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateSharedSwapchainsKHR(\n        static_cast<VkDevice>( m_device ),\n        createInfos.size(),\n        reinterpret_cast<const VkSwapchainCreateInfoKHR *>( createInfos.data() ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkSwapchainKHR *>( swapchains.data() ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createSharedSwapchainsKHR\" );\n#  endif\n      }\n\n      std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SwapchainKHR> swapchainsRAII;\n      swapchainsRAII.reserve( swapchains.size() );\n      for ( auto & swapchain : swapchains )\n      {\n        swapchainsRAII.emplace_back( *this, *reinterpret_cast<VkSwapchainKHR *>( &swapchain ), allocator );\n      }\n      return swapchainsRAII;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SwapchainKHR>::Type\n      Device::createSharedSwapchainKHR( VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR const &                            createInfo,\n                                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain;\n      VULKAN_HPP_NAMESPACE::Result       result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateSharedSwapchainsKHR(\n        static_cast<VkDevice>( m_device ),\n        1,\n        reinterpret_cast<const VkSwapchainCreateInfoKHR *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkSwapchainKHR *>( &swapchain ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createSharedSwapchainKHR\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SwapchainKHR( *this, *reinterpret_cast<VkSwapchainKHR *>( &swapchain ), allocator );\n    }\n\n#  if defined( VK_USE_PLATFORM_XLIB_KHR )\n    //=== VK_KHR_xlib_surface ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n      Instance::createXlibSurfaceKHR( VULKAN_HPP_NAMESPACE::XlibSurfaceCreateInfoKHR const &                          createInfo,\n                                      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n      VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateXlibSurfaceKHR(\n        static_cast<VkInstance>( m_instance ),\n        reinterpret_cast<const VkXlibSurfaceCreateInfoKHR *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#    if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#    else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Instance::createXlibSurfaceKHR\" );\n#    endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR( *this, *reinterpret_cast<VkSurfaceKHR *>( &surface ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Bool32\n      PhysicalDevice::getXlibPresentationSupportKHR( uint32_t queueFamilyIndex, Display & dpy, VisualID visualID ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceXlibPresentationSupportKHR &&\n                         \"Function <vkGetPhysicalDeviceXlibPresentationSupportKHR> requires <VK_KHR_xlib_surface>\" );\n\n      VkBool32 result =\n        getDispatcher()->vkGetPhysicalDeviceXlibPresentationSupportKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ), queueFamilyIndex, &dpy, visualID );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Bool32>( result );\n    }\n#  endif /*VK_USE_PLATFORM_XLIB_KHR*/\n\n#  if defined( VK_USE_PLATFORM_XCB_KHR )\n    //=== VK_KHR_xcb_surface ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n      Instance::createXcbSurfaceKHR( VULKAN_HPP_NAMESPACE::XcbSurfaceCreateInfoKHR const &                           createInfo,\n                                     VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n      VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateXcbSurfaceKHR(\n        static_cast<VkInstance>( m_instance ),\n        reinterpret_cast<const VkXcbSurfaceCreateInfoKHR *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#    if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#    else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Instance::createXcbSurfaceKHR\" );\n#    endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR( *this, *reinterpret_cast<VkSurfaceKHR *>( &surface ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Bool32 PhysicalDevice::getXcbPresentationSupportKHR(\n      uint32_t queueFamilyIndex, xcb_connection_t & connection, xcb_visualid_t visual_id ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceXcbPresentationSupportKHR &&\n                         \"Function <vkGetPhysicalDeviceXcbPresentationSupportKHR> requires <VK_KHR_xcb_surface>\" );\n\n      VkBool32 result = getDispatcher()->vkGetPhysicalDeviceXcbPresentationSupportKHR(\n        static_cast<VkPhysicalDevice>( m_physicalDevice ), queueFamilyIndex, &connection, visual_id );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Bool32>( result );\n    }\n#  endif /*VK_USE_PLATFORM_XCB_KHR*/\n\n#  if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n    //=== VK_KHR_wayland_surface ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n      Instance::createWaylandSurfaceKHR( VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateInfoKHR const &                       createInfo,\n                                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n      VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateWaylandSurfaceKHR(\n        static_cast<VkInstance>( m_instance ),\n        reinterpret_cast<const VkWaylandSurfaceCreateInfoKHR *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#    if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#    else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Instance::createWaylandSurfaceKHR\" );\n#    endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR( *this, *reinterpret_cast<VkSurfaceKHR *>( &surface ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Bool32\n      PhysicalDevice::getWaylandPresentationSupportKHR( uint32_t queueFamilyIndex, struct wl_display & display ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceWaylandPresentationSupportKHR &&\n                         \"Function <vkGetPhysicalDeviceWaylandPresentationSupportKHR> requires <VK_KHR_wayland_surface>\" );\n\n      VkBool32 result =\n        getDispatcher()->vkGetPhysicalDeviceWaylandPresentationSupportKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ), queueFamilyIndex, &display );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Bool32>( result );\n    }\n#  endif /*VK_USE_PLATFORM_WAYLAND_KHR*/\n\n#  if defined( VK_USE_PLATFORM_ANDROID_KHR )\n    //=== VK_KHR_android_surface ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n      Instance::createAndroidSurfaceKHR( VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateInfoKHR const &                       createInfo,\n                                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n      VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateAndroidSurfaceKHR(\n        static_cast<VkInstance>( m_instance ),\n        reinterpret_cast<const VkAndroidSurfaceCreateInfoKHR *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#    if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#    else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Instance::createAndroidSurfaceKHR\" );\n#    endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR( *this, *reinterpret_cast<VkSurfaceKHR *>( &surface ), allocator );\n    }\n#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n    //=== VK_KHR_win32_surface ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n      Instance::createWin32SurfaceKHR( VULKAN_HPP_NAMESPACE::Win32SurfaceCreateInfoKHR const &                         createInfo,\n                                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n      VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateWin32SurfaceKHR(\n        static_cast<VkInstance>( m_instance ),\n        reinterpret_cast<const VkWin32SurfaceCreateInfoKHR *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#    if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#    else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Instance::createWin32SurfaceKHR\" );\n#    endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR( *this, *reinterpret_cast<VkSurfaceKHR *>( &surface ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Bool32\n                                           PhysicalDevice::getWin32PresentationSupportKHR( uint32_t queueFamilyIndex ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceWin32PresentationSupportKHR &&\n                         \"Function <vkGetPhysicalDeviceWin32PresentationSupportKHR> requires <VK_KHR_win32_surface>\" );\n\n      VkBool32 result = getDispatcher()->vkGetPhysicalDeviceWin32PresentationSupportKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ), queueFamilyIndex );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Bool32>( result );\n    }\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n    //=== VK_EXT_debug_report ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DebugReportCallbackEXT>::Type\n      Instance::createDebugReportCallbackEXT( VULKAN_HPP_NAMESPACE::DebugReportCallbackCreateInfoEXT const &                  createInfo,\n                                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT callback;\n      VULKAN_HPP_NAMESPACE::Result                 result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateDebugReportCallbackEXT(\n        static_cast<VkInstance>( m_instance ),\n        reinterpret_cast<const VkDebugReportCallbackCreateInfoEXT *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkDebugReportCallbackEXT *>( &callback ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Instance::createDebugReportCallbackEXT\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DebugReportCallbackEXT(\n        *this, *reinterpret_cast<VkDebugReportCallbackEXT *>( &callback ), allocator );\n    }\n\n    VULKAN_HPP_INLINE void Instance::debugReportMessageEXT( VULKAN_HPP_NAMESPACE::DebugReportFlagsEXT      flags,\n                                                            VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT objectType_,\n                                                            uint64_t                                       object,\n                                                            size_t                                         location,\n                                                            int32_t                                        messageCode,\n                                                            const std::string &                            layerPrefix,\n                                                            const std::string &                            message ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkDebugReportMessageEXT && \"Function <vkDebugReportMessageEXT> requires <VK_EXT_debug_report>\" );\n\n      getDispatcher()->vkDebugReportMessageEXT( static_cast<VkInstance>( m_instance ),\n                                                static_cast<VkDebugReportFlagsEXT>( flags ),\n                                                static_cast<VkDebugReportObjectTypeEXT>( objectType_ ),\n                                                object,\n                                                location,\n                                                messageCode,\n                                                layerPrefix.c_str(),\n                                                message.c_str() );\n    }\n\n    //=== VK_EXT_debug_marker ===\n\n    VULKAN_HPP_INLINE void Device::debugMarkerSetObjectTagEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerObjectTagInfoEXT & tagInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkDebugMarkerSetObjectTagEXT && \"Function <vkDebugMarkerSetObjectTagEXT> requires <VK_EXT_debug_marker>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkDebugMarkerSetObjectTagEXT(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkDebugMarkerObjectTagInfoEXT *>( &tagInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::debugMarkerSetObjectTagEXT\" );\n    }\n\n    VULKAN_HPP_INLINE void Device::debugMarkerSetObjectNameEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerObjectNameInfoEXT & nameInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkDebugMarkerSetObjectNameEXT && \"Function <vkDebugMarkerSetObjectNameEXT> requires <VK_EXT_debug_marker>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkDebugMarkerSetObjectNameEXT(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkDebugMarkerObjectNameInfoEXT *>( &nameInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::debugMarkerSetObjectNameEXT\" );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::debugMarkerBeginEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT & markerInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDebugMarkerBeginEXT && \"Function <vkCmdDebugMarkerBeginEXT> requires <VK_EXT_debug_marker>\" );\n\n      getDispatcher()->vkCmdDebugMarkerBeginEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                 reinterpret_cast<const VkDebugMarkerMarkerInfoEXT *>( &markerInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::debugMarkerEndEXT() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDebugMarkerEndEXT && \"Function <vkCmdDebugMarkerEndEXT> requires <VK_EXT_debug_marker>\" );\n\n      getDispatcher()->vkCmdDebugMarkerEndEXT( static_cast<VkCommandBuffer>( m_commandBuffer ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::debugMarkerInsertEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT & markerInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDebugMarkerInsertEXT && \"Function <vkCmdDebugMarkerInsertEXT> requires <VK_EXT_debug_marker>\" );\n\n      getDispatcher()->vkCmdDebugMarkerInsertEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                  reinterpret_cast<const VkDebugMarkerMarkerInfoEXT *>( &markerInfo ) );\n    }\n\n    //=== VK_KHR_video_queue ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR\n                                           PhysicalDevice::getVideoCapabilitiesKHR( const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR & videoProfile ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceVideoCapabilitiesKHR &&\n                         \"Function <vkGetPhysicalDeviceVideoCapabilitiesKHR> requires <VK_KHR_video_queue>\" );\n\n      VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR capabilities;\n      VULKAN_HPP_NAMESPACE::Result               result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetPhysicalDeviceVideoCapabilitiesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                  reinterpret_cast<const VkVideoProfileInfoKHR *>( &videoProfile ),\n                                                                  reinterpret_cast<VkVideoCapabilitiesKHR *>( &capabilities ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getVideoCapabilitiesKHR\" );\n\n      return capabilities;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                                           PhysicalDevice::getVideoCapabilitiesKHR( const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR & videoProfile ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceVideoCapabilitiesKHR &&\n                         \"Function <vkGetPhysicalDeviceVideoCapabilitiesKHR> requires <VK_KHR_video_queue>\" );\n\n      StructureChain<X, Y, Z...>                   structureChain;\n      VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR & capabilities = structureChain.template get<VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR>();\n      VULKAN_HPP_NAMESPACE::Result                 result       = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetPhysicalDeviceVideoCapabilitiesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                  reinterpret_cast<const VkVideoProfileInfoKHR *>( &videoProfile ),\n                                                                  reinterpret_cast<VkVideoCapabilitiesKHR *>( &capabilities ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getVideoCapabilitiesKHR\" );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR>\n      PhysicalDevice::getVideoFormatPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR & videoFormatInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceVideoFormatPropertiesKHR &&\n                         \"Function <vkGetPhysicalDeviceVideoFormatPropertiesKHR> requires <VK_KHR_video_queue>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR> videoFormatProperties;\n      uint32_t                                                    videoFormatPropertyCount;\n      VULKAN_HPP_NAMESPACE::Result                                result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkGetPhysicalDeviceVideoFormatPropertiesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                        reinterpret_cast<const VkPhysicalDeviceVideoFormatInfoKHR *>( &videoFormatInfo ),\n                                                                        &videoFormatPropertyCount,\n                                                                        nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && videoFormatPropertyCount )\n        {\n          videoFormatProperties.resize( videoFormatPropertyCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n            getDispatcher()->vkGetPhysicalDeviceVideoFormatPropertiesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                          reinterpret_cast<const VkPhysicalDeviceVideoFormatInfoKHR *>( &videoFormatInfo ),\n                                                                          &videoFormatPropertyCount,\n                                                                          reinterpret_cast<VkVideoFormatPropertiesKHR *>( videoFormatProperties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getVideoFormatPropertiesKHR\" );\n      VULKAN_HPP_ASSERT( videoFormatPropertyCount <= videoFormatProperties.size() );\n      if ( videoFormatPropertyCount < videoFormatProperties.size() )\n      {\n        videoFormatProperties.resize( videoFormatPropertyCount );\n      }\n      return videoFormatProperties;\n    }\n\n    template <typename StructureChain>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<StructureChain>\n      PhysicalDevice::getVideoFormatPropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR & videoFormatInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceVideoFormatPropertiesKHR &&\n                         \"Function <vkGetPhysicalDeviceVideoFormatPropertiesKHR> requires <VK_KHR_video_queue>\" );\n\n      std::vector<StructureChain>                                 structureChains;\n      std::vector<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR> videoFormatProperties;\n      uint32_t                                                    videoFormatPropertyCount;\n      VULKAN_HPP_NAMESPACE::Result                                result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkGetPhysicalDeviceVideoFormatPropertiesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                        reinterpret_cast<const VkPhysicalDeviceVideoFormatInfoKHR *>( &videoFormatInfo ),\n                                                                        &videoFormatPropertyCount,\n                                                                        nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && videoFormatPropertyCount )\n        {\n          structureChains.resize( videoFormatPropertyCount );\n          videoFormatProperties.resize( videoFormatPropertyCount );\n          for ( uint32_t i = 0; i < videoFormatPropertyCount; i++ )\n          {\n            videoFormatProperties[i].pNext = structureChains[i].template get<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR>().pNext;\n          }\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n            getDispatcher()->vkGetPhysicalDeviceVideoFormatPropertiesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                          reinterpret_cast<const VkPhysicalDeviceVideoFormatInfoKHR *>( &videoFormatInfo ),\n                                                                          &videoFormatPropertyCount,\n                                                                          reinterpret_cast<VkVideoFormatPropertiesKHR *>( videoFormatProperties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getVideoFormatPropertiesKHR\" );\n      VULKAN_HPP_ASSERT( videoFormatPropertyCount <= videoFormatProperties.size() );\n      if ( videoFormatPropertyCount < videoFormatProperties.size() )\n      {\n        structureChains.resize( videoFormatPropertyCount );\n      }\n      for ( uint32_t i = 0; i < videoFormatPropertyCount; i++ )\n      {\n        structureChains[i].template get<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR>() = videoFormatProperties[i];\n      }\n      return structureChains;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::VideoSessionKHR>::Type\n      Device::createVideoSessionKHR( VULKAN_HPP_NAMESPACE::VideoSessionCreateInfoKHR const &                         createInfo,\n                                     VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::VideoSessionKHR videoSession;\n      VULKAN_HPP_NAMESPACE::Result          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateVideoSessionKHR(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkVideoSessionCreateInfoKHR *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkVideoSessionKHR *>( &videoSession ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createVideoSessionKHR\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::VideoSessionKHR( *this, *reinterpret_cast<VkVideoSessionKHR *>( &videoSession ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::VideoSessionMemoryRequirementsKHR> VideoSessionKHR::getMemoryRequirements() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetVideoSessionMemoryRequirementsKHR &&\n                         \"Function <vkGetVideoSessionMemoryRequirementsKHR> requires <VK_KHR_video_queue>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::VideoSessionMemoryRequirementsKHR> memoryRequirements;\n      uint32_t                                                             memoryRequirementsCount;\n      VULKAN_HPP_NAMESPACE::Result                                         result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetVideoSessionMemoryRequirementsKHR(\n          static_cast<VkDevice>( m_device ), static_cast<VkVideoSessionKHR>( m_videoSession ), &memoryRequirementsCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && memoryRequirementsCount )\n        {\n          memoryRequirements.resize( memoryRequirementsCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n            getDispatcher()->vkGetVideoSessionMemoryRequirementsKHR( static_cast<VkDevice>( m_device ),\n                                                                     static_cast<VkVideoSessionKHR>( m_videoSession ),\n                                                                     &memoryRequirementsCount,\n                                                                     reinterpret_cast<VkVideoSessionMemoryRequirementsKHR *>( memoryRequirements.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n\n      VULKAN_HPP_ASSERT( memoryRequirementsCount <= memoryRequirements.size() );\n      if ( memoryRequirementsCount < memoryRequirements.size() )\n      {\n        memoryRequirements.resize( memoryRequirementsCount );\n      }\n      return memoryRequirements;\n    }\n\n    VULKAN_HPP_INLINE void VideoSessionKHR::bindMemory(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindVideoSessionMemoryInfoKHR> const & bindSessionMemoryInfos ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkBindVideoSessionMemoryKHR && \"Function <vkBindVideoSessionMemoryKHR> requires <VK_KHR_video_queue>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkBindVideoSessionMemoryKHR( static_cast<VkDevice>( m_device ),\n                                                      static_cast<VkVideoSessionKHR>( m_videoSession ),\n                                                      bindSessionMemoryInfos.size(),\n                                                      reinterpret_cast<const VkBindVideoSessionMemoryInfoKHR *>( bindSessionMemoryInfos.data() ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::VideoSessionKHR::bindMemory\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::VideoSessionParametersKHR>::Type\n      Device::createVideoSessionParametersKHR( VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateInfoKHR const &               createInfo,\n                                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR videoSessionParameters;\n      VULKAN_HPP_NAMESPACE::Result                    result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateVideoSessionParametersKHR(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkVideoSessionParametersCreateInfoKHR *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkVideoSessionParametersKHR *>( &videoSessionParameters ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createVideoSessionParametersKHR\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::VideoSessionParametersKHR(\n        *this, *reinterpret_cast<VkVideoSessionParametersKHR *>( &videoSessionParameters ), allocator );\n    }\n\n    VULKAN_HPP_INLINE void VideoSessionParametersKHR::update( const VULKAN_HPP_NAMESPACE::VideoSessionParametersUpdateInfoKHR & updateInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkUpdateVideoSessionParametersKHR && \"Function <vkUpdateVideoSessionParametersKHR> requires <VK_KHR_video_queue>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkUpdateVideoSessionParametersKHR( static_cast<VkDevice>( m_device ),\n                                                            static_cast<VkVideoSessionParametersKHR>( m_videoSessionParameters ),\n                                                            reinterpret_cast<const VkVideoSessionParametersUpdateInfoKHR *>( &updateInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::VideoSessionParametersKHR::update\" );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::beginVideoCodingKHR( const VULKAN_HPP_NAMESPACE::VideoBeginCodingInfoKHR & beginInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBeginVideoCodingKHR && \"Function <vkCmdBeginVideoCodingKHR> requires <VK_KHR_video_queue>\" );\n\n      getDispatcher()->vkCmdBeginVideoCodingKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                 reinterpret_cast<const VkVideoBeginCodingInfoKHR *>( &beginInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::endVideoCodingKHR( const VULKAN_HPP_NAMESPACE::VideoEndCodingInfoKHR & endCodingInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdEndVideoCodingKHR && \"Function <vkCmdEndVideoCodingKHR> requires <VK_KHR_video_queue>\" );\n\n      getDispatcher()->vkCmdEndVideoCodingKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                               reinterpret_cast<const VkVideoEndCodingInfoKHR *>( &endCodingInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::controlVideoCodingKHR( const VULKAN_HPP_NAMESPACE::VideoCodingControlInfoKHR & codingControlInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdControlVideoCodingKHR && \"Function <vkCmdControlVideoCodingKHR> requires <VK_KHR_video_queue>\" );\n\n      getDispatcher()->vkCmdControlVideoCodingKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                   reinterpret_cast<const VkVideoCodingControlInfoKHR *>( &codingControlInfo ) );\n    }\n\n    //=== VK_KHR_video_decode_queue ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::decodeVideoKHR( const VULKAN_HPP_NAMESPACE::VideoDecodeInfoKHR & decodeInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDecodeVideoKHR && \"Function <vkCmdDecodeVideoKHR> requires <VK_KHR_video_decode_queue>\" );\n\n      getDispatcher()->vkCmdDecodeVideoKHR( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkVideoDecodeInfoKHR *>( &decodeInfo ) );\n    }\n\n    //=== VK_EXT_transform_feedback ===\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::bindTransformFeedbackBuffersEXT( uint32_t                                                                         firstBinding,\n                                                      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &     buffers,\n                                                      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & offsets,\n                                                      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & sizes ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBindTransformFeedbackBuffersEXT &&\n                         \"Function <vkCmdBindTransformFeedbackBuffersEXT> requires <VK_EXT_transform_feedback>\" );\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( buffers.size() == offsets.size() );\n      VULKAN_HPP_ASSERT( sizes.empty() || buffers.size() == sizes.size() );\n#  else\n      if ( buffers.size() != offsets.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::bindTransformFeedbackBuffersEXT: buffers.size() != offsets.size()\" );\n      }\n      if ( !sizes.empty() && buffers.size() != sizes.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::bindTransformFeedbackBuffersEXT: buffers.size() != sizes.size()\" );\n      }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n      getDispatcher()->vkCmdBindTransformFeedbackBuffersEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                             firstBinding,\n                                                             buffers.size(),\n                                                             reinterpret_cast<const VkBuffer *>( buffers.data() ),\n                                                             reinterpret_cast<const VkDeviceSize *>( offsets.data() ),\n                                                             reinterpret_cast<const VkDeviceSize *>( sizes.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::beginTransformFeedbackEXT( uint32_t                                                                         firstCounterBuffer,\n                                                VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &     counterBuffers,\n                                                VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & counterBufferOffsets ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBeginTransformFeedbackEXT && \"Function <vkCmdBeginTransformFeedbackEXT> requires <VK_EXT_transform_feedback>\" );\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( counterBufferOffsets.empty() || counterBuffers.size() == counterBufferOffsets.size() );\n#  else\n      if ( !counterBufferOffsets.empty() && counterBuffers.size() != counterBufferOffsets.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::beginTransformFeedbackEXT: counterBuffers.size() != counterBufferOffsets.size()\" );\n      }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n      getDispatcher()->vkCmdBeginTransformFeedbackEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                       firstCounterBuffer,\n                                                       counterBuffers.size(),\n                                                       reinterpret_cast<const VkBuffer *>( counterBuffers.data() ),\n                                                       reinterpret_cast<const VkDeviceSize *>( counterBufferOffsets.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::endTransformFeedbackEXT( uint32_t                                                                         firstCounterBuffer,\n                                              VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &     counterBuffers,\n                                              VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & counterBufferOffsets ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdEndTransformFeedbackEXT && \"Function <vkCmdEndTransformFeedbackEXT> requires <VK_EXT_transform_feedback>\" );\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( counterBufferOffsets.empty() || counterBuffers.size() == counterBufferOffsets.size() );\n#  else\n      if ( !counterBufferOffsets.empty() && counterBuffers.size() != counterBufferOffsets.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::endTransformFeedbackEXT: counterBuffers.size() != counterBufferOffsets.size()\" );\n      }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n      getDispatcher()->vkCmdEndTransformFeedbackEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                     firstCounterBuffer,\n                                                     counterBuffers.size(),\n                                                     reinterpret_cast<const VkBuffer *>( counterBuffers.data() ),\n                                                     reinterpret_cast<const VkDeviceSize *>( counterBufferOffsets.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::beginQueryIndexedEXT( VULKAN_HPP_NAMESPACE::QueryPool         queryPool,\n                                                                uint32_t                                query,\n                                                                VULKAN_HPP_NAMESPACE::QueryControlFlags flags,\n                                                                uint32_t                                index ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBeginQueryIndexedEXT && \"Function <vkCmdBeginQueryIndexedEXT> requires <VK_EXT_transform_feedback>\" );\n\n      getDispatcher()->vkCmdBeginQueryIndexedEXT(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkQueryPool>( queryPool ), query, static_cast<VkQueryControlFlags>( flags ), index );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::endQueryIndexedEXT( VULKAN_HPP_NAMESPACE::QueryPool queryPool, uint32_t query, uint32_t index ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdEndQueryIndexedEXT && \"Function <vkCmdEndQueryIndexedEXT> requires <VK_EXT_transform_feedback>\" );\n\n      getDispatcher()->vkCmdEndQueryIndexedEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkQueryPool>( queryPool ), query, index );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::drawIndirectByteCountEXT( uint32_t                         instanceCount,\n                                                                    uint32_t                         firstInstance,\n                                                                    VULKAN_HPP_NAMESPACE::Buffer     counterBuffer,\n                                                                    VULKAN_HPP_NAMESPACE::DeviceSize counterBufferOffset,\n                                                                    uint32_t                         counterOffset,\n                                                                    uint32_t                         vertexStride ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDrawIndirectByteCountEXT && \"Function <vkCmdDrawIndirectByteCountEXT> requires <VK_EXT_transform_feedback>\" );\n\n      getDispatcher()->vkCmdDrawIndirectByteCountEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                      instanceCount,\n                                                      firstInstance,\n                                                      static_cast<VkBuffer>( counterBuffer ),\n                                                      static_cast<VkDeviceSize>( counterBufferOffset ),\n                                                      counterOffset,\n                                                      vertexStride );\n    }\n\n    //=== VK_NVX_binary_import ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CuModuleNVX>::Type\n      Device::createCuModuleNVX( VULKAN_HPP_NAMESPACE::CuModuleCreateInfoNVX const &                             createInfo,\n                                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::CuModuleNVX module;\n      VULKAN_HPP_NAMESPACE::Result      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateCuModuleNVX(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkCuModuleCreateInfoNVX *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkCuModuleNVX *>( &module ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createCuModuleNVX\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CuModuleNVX( *this, *reinterpret_cast<VkCuModuleNVX *>( &module ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CuFunctionNVX>::Type\n      Device::createCuFunctionNVX( VULKAN_HPP_NAMESPACE::CuFunctionCreateInfoNVX const &                           createInfo,\n                                   VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::CuFunctionNVX function;\n      VULKAN_HPP_NAMESPACE::Result        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateCuFunctionNVX(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkCuFunctionCreateInfoNVX *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkCuFunctionNVX *>( &function ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createCuFunctionNVX\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CuFunctionNVX( *this, *reinterpret_cast<VkCuFunctionNVX *>( &function ), allocator );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::cuLaunchKernelNVX( const VULKAN_HPP_NAMESPACE::CuLaunchInfoNVX & launchInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCuLaunchKernelNVX && \"Function <vkCmdCuLaunchKernelNVX> requires <VK_NVX_binary_import>\" );\n\n      getDispatcher()->vkCmdCuLaunchKernelNVX( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkCuLaunchInfoNVX *>( &launchInfo ) );\n    }\n\n    //=== VK_NVX_image_view_handle ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint32_t\n      Device::getImageViewHandleNVX( const VULKAN_HPP_NAMESPACE::ImageViewHandleInfoNVX & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetImageViewHandleNVX && \"Function <vkGetImageViewHandleNVX> requires <VK_NVX_image_view_handle>\" );\n\n      uint32_t result =\n        getDispatcher()->vkGetImageViewHandleNVX( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkImageViewHandleInfoNVX *>( &info ) );\n\n      return result;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint64_t\n      Device::getImageViewHandle64NVX( const VULKAN_HPP_NAMESPACE::ImageViewHandleInfoNVX & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetImageViewHandle64NVX && \"Function <vkGetImageViewHandle64NVX> requires <VK_NVX_image_view_handle>\" );\n\n      uint64_t result =\n        getDispatcher()->vkGetImageViewHandle64NVX( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkImageViewHandleInfoNVX *>( &info ) );\n\n      return result;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ImageViewAddressPropertiesNVX ImageView::getAddressNVX() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetImageViewAddressNVX && \"Function <vkGetImageViewAddressNVX> requires <VK_NVX_image_view_handle>\" );\n\n      VULKAN_HPP_NAMESPACE::ImageViewAddressPropertiesNVX properties;\n      VULKAN_HPP_NAMESPACE::Result                        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetImageViewAddressNVX(\n        static_cast<VkDevice>( m_device ), static_cast<VkImageView>( m_imageView ), reinterpret_cast<VkImageViewAddressPropertiesNVX *>( &properties ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::ImageView::getAddressNVX\" );\n\n      return properties;\n    }\n\n    //=== VK_AMD_draw_indirect_count ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::drawIndirectCountAMD( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                                VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                                VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                                                VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                                                uint32_t                         maxDrawCount,\n                                                                uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDrawIndirectCountAMD &&\n                         \"Function <vkCmdDrawIndirectCountAMD> requires <VK_AMD_draw_indirect_count> or <VK_KHR_draw_indirect_count> or <VK_VERSION_1_2>\" );\n\n      getDispatcher()->vkCmdDrawIndirectCountAMD( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                  static_cast<VkBuffer>( buffer ),\n                                                  static_cast<VkDeviceSize>( offset ),\n                                                  static_cast<VkBuffer>( countBuffer ),\n                                                  static_cast<VkDeviceSize>( countBufferOffset ),\n                                                  maxDrawCount,\n                                                  stride );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::drawIndexedIndirectCountAMD( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                                       VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                                       VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                                                       VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                                                       uint32_t                         maxDrawCount,\n                                                                       uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT(\n        getDispatcher()->vkCmdDrawIndexedIndirectCountAMD &&\n        \"Function <vkCmdDrawIndexedIndirectCountAMD> requires <VK_AMD_draw_indirect_count> or <VK_KHR_draw_indirect_count> or <VK_VERSION_1_2>\" );\n\n      getDispatcher()->vkCmdDrawIndexedIndirectCountAMD( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                         static_cast<VkBuffer>( buffer ),\n                                                         static_cast<VkDeviceSize>( offset ),\n                                                         static_cast<VkBuffer>( countBuffer ),\n                                                         static_cast<VkDeviceSize>( countBufferOffset ),\n                                                         maxDrawCount,\n                                                         stride );\n    }\n\n    //=== VK_AMD_shader_info ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<uint8_t> Pipeline::getShaderInfoAMD( VULKAN_HPP_NAMESPACE::ShaderStageFlagBits shaderStage,\n                                                                                            VULKAN_HPP_NAMESPACE::ShaderInfoTypeAMD   infoType ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetShaderInfoAMD && \"Function <vkGetShaderInfoAMD> requires <VK_AMD_shader_info>\" );\n\n      std::vector<uint8_t>         info;\n      size_t                       infoSize;\n      VULKAN_HPP_NAMESPACE::Result result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetShaderInfoAMD( static_cast<VkDevice>( m_device ),\n                                                                                                 static_cast<VkPipeline>( m_pipeline ),\n                                                                                                 static_cast<VkShaderStageFlagBits>( shaderStage ),\n                                                                                                 static_cast<VkShaderInfoTypeAMD>( infoType ),\n                                                                                                 &infoSize,\n                                                                                                 nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && infoSize )\n        {\n          info.resize( infoSize );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetShaderInfoAMD( static_cast<VkDevice>( m_device ),\n                                                                                                   static_cast<VkPipeline>( m_pipeline ),\n                                                                                                   static_cast<VkShaderStageFlagBits>( shaderStage ),\n                                                                                                   static_cast<VkShaderInfoTypeAMD>( infoType ),\n                                                                                                   &infoSize,\n                                                                                                   reinterpret_cast<void *>( info.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Pipeline::getShaderInfoAMD\" );\n      VULKAN_HPP_ASSERT( infoSize <= info.size() );\n      if ( infoSize < info.size() )\n      {\n        info.resize( infoSize );\n      }\n      return info;\n    }\n\n    //=== VK_KHR_dynamic_rendering ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::beginRenderingKHR( const VULKAN_HPP_NAMESPACE::RenderingInfo & renderingInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBeginRenderingKHR &&\n                         \"Function <vkCmdBeginRenderingKHR> requires <VK_KHR_dynamic_rendering> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdBeginRenderingKHR( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkRenderingInfo *>( &renderingInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::endRenderingKHR() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdEndRenderingKHR && \"Function <vkCmdEndRenderingKHR> requires <VK_KHR_dynamic_rendering> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdEndRenderingKHR( static_cast<VkCommandBuffer>( m_commandBuffer ) );\n    }\n\n#  if defined( VK_USE_PLATFORM_GGP )\n    //=== VK_GGP_stream_descriptor_surface ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n      Instance::createStreamDescriptorSurfaceGGP( VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateInfoGGP const &              createInfo,\n                                                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n      VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateStreamDescriptorSurfaceGGP(\n        static_cast<VkInstance>( m_instance ),\n        reinterpret_cast<const VkStreamDescriptorSurfaceCreateInfoGGP *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#    if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#    else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Instance::createStreamDescriptorSurfaceGGP\" );\n#    endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR( *this, *reinterpret_cast<VkSurfaceKHR *>( &surface ), allocator );\n    }\n#  endif /*VK_USE_PLATFORM_GGP*/\n\n    //=== VK_NV_external_memory_capabilities ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ExternalImageFormatPropertiesNV\n                                           PhysicalDevice::getExternalImageFormatPropertiesNV( VULKAN_HPP_NAMESPACE::Format                          format,\n                                                          VULKAN_HPP_NAMESPACE::ImageType                       type,\n                                                          VULKAN_HPP_NAMESPACE::ImageTiling                     tiling,\n                                                          VULKAN_HPP_NAMESPACE::ImageUsageFlags                 usage,\n                                                          VULKAN_HPP_NAMESPACE::ImageCreateFlags                flags,\n                                                          VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV externalHandleType ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceExternalImageFormatPropertiesNV &&\n                         \"Function <vkGetPhysicalDeviceExternalImageFormatPropertiesNV> requires <VK_NV_external_memory_capabilities>\" );\n\n      VULKAN_HPP_NAMESPACE::ExternalImageFormatPropertiesNV externalImageFormatProperties;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceExternalImageFormatPropertiesNV(\n        static_cast<VkPhysicalDevice>( m_physicalDevice ),\n        static_cast<VkFormat>( format ),\n        static_cast<VkImageType>( type ),\n        static_cast<VkImageTiling>( tiling ),\n        static_cast<VkImageUsageFlags>( usage ),\n        static_cast<VkImageCreateFlags>( flags ),\n        static_cast<VkExternalMemoryHandleTypeFlagsNV>( externalHandleType ),\n        reinterpret_cast<VkExternalImageFormatPropertiesNV *>( &externalImageFormatProperties ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getExternalImageFormatPropertiesNV\" );\n\n      return externalImageFormatProperties;\n    }\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n    //=== VK_NV_external_memory_win32 ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE HANDLE DeviceMemory::getMemoryWin32HandleNV( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV handleType ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetMemoryWin32HandleNV && \"Function <vkGetMemoryWin32HandleNV> requires <VK_NV_external_memory_win32>\" );\n\n      HANDLE                       handle;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetMemoryWin32HandleNV(\n        static_cast<VkDevice>( m_device ), static_cast<VkDeviceMemory>( m_memory ), static_cast<VkExternalMemoryHandleTypeFlagsNV>( handleType ), &handle ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::DeviceMemory::getMemoryWin32HandleNV\" );\n\n      return handle;\n    }\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n    //=== VK_KHR_get_physical_device_properties2 ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 PhysicalDevice::getFeatures2KHR() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceFeatures2KHR &&\n                         \"Function <vkGetPhysicalDeviceFeatures2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 features;\n      getDispatcher()->vkGetPhysicalDeviceFeatures2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                        reinterpret_cast<VkPhysicalDeviceFeatures2 *>( &features ) );\n\n      return features;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> PhysicalDevice::getFeatures2KHR() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceFeatures2KHR &&\n                         \"Function <vkGetPhysicalDeviceFeatures2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 &  features = structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2>();\n      getDispatcher()->vkGetPhysicalDeviceFeatures2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                        reinterpret_cast<VkPhysicalDeviceFeatures2 *>( &features ) );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 PhysicalDevice::getProperties2KHR() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceProperties2KHR &&\n                         \"Function <vkGetPhysicalDeviceProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 properties;\n      getDispatcher()->vkGetPhysicalDeviceProperties2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                          reinterpret_cast<VkPhysicalDeviceProperties2 *>( &properties ) );\n\n      return properties;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> PhysicalDevice::getProperties2KHR() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceProperties2KHR &&\n                         \"Function <vkGetPhysicalDeviceProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>  structureChain;\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 & properties = structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2>();\n      getDispatcher()->vkGetPhysicalDeviceProperties2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                          reinterpret_cast<VkPhysicalDeviceProperties2 *>( &properties ) );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::FormatProperties2\n                                           PhysicalDevice::getFormatProperties2KHR( VULKAN_HPP_NAMESPACE::Format format ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceFormatProperties2KHR &&\n                         \"Function <vkGetPhysicalDeviceFormatProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::FormatProperties2 formatProperties;\n      getDispatcher()->vkGetPhysicalDeviceFormatProperties2KHR(\n        static_cast<VkPhysicalDevice>( m_physicalDevice ), static_cast<VkFormat>( format ), reinterpret_cast<VkFormatProperties2 *>( &formatProperties ) );\n\n      return formatProperties;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                                           PhysicalDevice::getFormatProperties2KHR( VULKAN_HPP_NAMESPACE::Format format ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceFormatProperties2KHR &&\n                         \"Function <vkGetPhysicalDeviceFormatProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n      VULKAN_HPP_NAMESPACE::FormatProperties2 &        formatProperties = structureChain.template get<VULKAN_HPP_NAMESPACE::FormatProperties2>();\n      getDispatcher()->vkGetPhysicalDeviceFormatProperties2KHR(\n        static_cast<VkPhysicalDevice>( m_physicalDevice ), static_cast<VkFormat>( format ), reinterpret_cast<VkFormatProperties2 *>( &formatProperties ) );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ImageFormatProperties2\n      PhysicalDevice::getImageFormatProperties2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 & imageFormatInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceImageFormatProperties2KHR &&\n                         \"Function <vkGetPhysicalDeviceImageFormatProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::ImageFormatProperties2 imageFormatProperties;\n      VULKAN_HPP_NAMESPACE::Result                 result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetPhysicalDeviceImageFormatProperties2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                       reinterpret_cast<const VkPhysicalDeviceImageFormatInfo2 *>( &imageFormatInfo ),\n                                                                       reinterpret_cast<VkImageFormatProperties2 *>( &imageFormatProperties ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getImageFormatProperties2KHR\" );\n\n      return imageFormatProperties;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n      PhysicalDevice::getImageFormatProperties2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 & imageFormatInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceImageFormatProperties2KHR &&\n                         \"Function <vkGetPhysicalDeviceImageFormatProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      StructureChain<X, Y, Z...>                     structureChain;\n      VULKAN_HPP_NAMESPACE::ImageFormatProperties2 & imageFormatProperties = structureChain.template get<VULKAN_HPP_NAMESPACE::ImageFormatProperties2>();\n      VULKAN_HPP_NAMESPACE::Result                   result                = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetPhysicalDeviceImageFormatProperties2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                       reinterpret_cast<const VkPhysicalDeviceImageFormatInfo2 *>( &imageFormatInfo ),\n                                                                       reinterpret_cast<VkImageFormatProperties2 *>( &imageFormatProperties ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getImageFormatProperties2KHR\" );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2> PhysicalDevice::getQueueFamilyProperties2KHR() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties2KHR &&\n                         \"Function <vkGetPhysicalDeviceQueueFamilyProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2> queueFamilyProperties;\n      uint32_t                                                  queueFamilyPropertyCount;\n      getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ), &queueFamilyPropertyCount, nullptr );\n      queueFamilyProperties.resize( queueFamilyPropertyCount );\n      getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                     &queueFamilyPropertyCount,\n                                                                     reinterpret_cast<VkQueueFamilyProperties2 *>( queueFamilyProperties.data() ) );\n\n      VULKAN_HPP_ASSERT( queueFamilyPropertyCount <= queueFamilyProperties.size() );\n      if ( queueFamilyPropertyCount < queueFamilyProperties.size() )\n      {\n        queueFamilyProperties.resize( queueFamilyPropertyCount );\n      }\n      return queueFamilyProperties;\n    }\n\n    template <typename StructureChain>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<StructureChain> PhysicalDevice::getQueueFamilyProperties2KHR() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties2KHR &&\n                         \"Function <vkGetPhysicalDeviceQueueFamilyProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      std::vector<StructureChain>                               structureChains;\n      std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2> queueFamilyProperties;\n      uint32_t                                                  queueFamilyPropertyCount;\n      getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ), &queueFamilyPropertyCount, nullptr );\n      structureChains.resize( queueFamilyPropertyCount );\n      queueFamilyProperties.resize( queueFamilyPropertyCount );\n      for ( uint32_t i = 0; i < queueFamilyPropertyCount; i++ )\n      {\n        queueFamilyProperties[i].pNext = structureChains[i].template get<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>().pNext;\n      }\n      getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                     &queueFamilyPropertyCount,\n                                                                     reinterpret_cast<VkQueueFamilyProperties2 *>( queueFamilyProperties.data() ) );\n\n      VULKAN_HPP_ASSERT( queueFamilyPropertyCount <= queueFamilyProperties.size() );\n      if ( queueFamilyPropertyCount < queueFamilyProperties.size() )\n      {\n        structureChains.resize( queueFamilyPropertyCount );\n      }\n      for ( uint32_t i = 0; i < queueFamilyPropertyCount; i++ )\n      {\n        structureChains[i].template get<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>() = queueFamilyProperties[i];\n      }\n      return structureChains;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2\n                                           PhysicalDevice::getMemoryProperties2KHR() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceMemoryProperties2KHR &&\n                         \"Function <vkGetPhysicalDeviceMemoryProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 memoryProperties;\n      getDispatcher()->vkGetPhysicalDeviceMemoryProperties2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                reinterpret_cast<VkPhysicalDeviceMemoryProperties2 *>( &memoryProperties ) );\n\n      return memoryProperties;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> PhysicalDevice::getMemoryProperties2KHR() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceMemoryProperties2KHR &&\n                         \"Function <vkGetPhysicalDeviceMemoryProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>        structureChain;\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 & memoryProperties =\n        structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2>();\n      getDispatcher()->vkGetPhysicalDeviceMemoryProperties2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                reinterpret_cast<VkPhysicalDeviceMemoryProperties2 *>( &memoryProperties ) );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2>\n      PhysicalDevice::getSparseImageFormatProperties2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 & formatInfo ) const\n    {\n      VULKAN_HPP_ASSERT(\n        getDispatcher()->vkGetPhysicalDeviceSparseImageFormatProperties2KHR &&\n        \"Function <vkGetPhysicalDeviceSparseImageFormatProperties2KHR> requires <VK_KHR_get_physical_device_properties2> or <VK_VERSION_1_1>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2> properties;\n      uint32_t                                                        propertyCount;\n      getDispatcher()->vkGetPhysicalDeviceSparseImageFormatProperties2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                           reinterpret_cast<const VkPhysicalDeviceSparseImageFormatInfo2 *>( &formatInfo ),\n                                                                           &propertyCount,\n                                                                           nullptr );\n      properties.resize( propertyCount );\n      getDispatcher()->vkGetPhysicalDeviceSparseImageFormatProperties2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                           reinterpret_cast<const VkPhysicalDeviceSparseImageFormatInfo2 *>( &formatInfo ),\n                                                                           &propertyCount,\n                                                                           reinterpret_cast<VkSparseImageFormatProperties2 *>( properties.data() ) );\n\n      VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n      if ( propertyCount < properties.size() )\n      {\n        properties.resize( propertyCount );\n      }\n      return properties;\n    }\n\n    //=== VK_KHR_device_group ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags\n      Device::getGroupPeerMemoryFeaturesKHR( uint32_t heapIndex, uint32_t localDeviceIndex, uint32_t remoteDeviceIndex ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceGroupPeerMemoryFeaturesKHR &&\n                         \"Function <vkGetDeviceGroupPeerMemoryFeaturesKHR> requires <VK_KHR_device_group> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags peerMemoryFeatures;\n      getDispatcher()->vkGetDeviceGroupPeerMemoryFeaturesKHR( static_cast<VkDevice>( m_device ),\n                                                              heapIndex,\n                                                              localDeviceIndex,\n                                                              remoteDeviceIndex,\n                                                              reinterpret_cast<VkPeerMemoryFeatureFlags *>( &peerMemoryFeatures ) );\n\n      return peerMemoryFeatures;\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setDeviceMaskKHR( uint32_t deviceMask ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDeviceMaskKHR && \"Function <vkCmdSetDeviceMaskKHR> requires <VK_KHR_device_group> or <VK_VERSION_1_1>\" );\n\n      getDispatcher()->vkCmdSetDeviceMaskKHR( static_cast<VkCommandBuffer>( m_commandBuffer ), deviceMask );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::dispatchBaseKHR( uint32_t baseGroupX,\n                                                           uint32_t baseGroupY,\n                                                           uint32_t baseGroupZ,\n                                                           uint32_t groupCountX,\n                                                           uint32_t groupCountY,\n                                                           uint32_t groupCountZ ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDispatchBaseKHR && \"Function <vkCmdDispatchBaseKHR> requires <VK_KHR_device_group> or <VK_VERSION_1_1>\" );\n\n      getDispatcher()->vkCmdDispatchBaseKHR(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ );\n    }\n\n#  if defined( VK_USE_PLATFORM_VI_NN )\n    //=== VK_NN_vi_surface ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n      Instance::createViSurfaceNN( VULKAN_HPP_NAMESPACE::ViSurfaceCreateInfoNN const &                             createInfo,\n                                   VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n      VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateViSurfaceNN(\n        static_cast<VkInstance>( m_instance ),\n        reinterpret_cast<const VkViSurfaceCreateInfoNN *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#    if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#    else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Instance::createViSurfaceNN\" );\n#    endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR( *this, *reinterpret_cast<VkSurfaceKHR *>( &surface ), allocator );\n    }\n#  endif /*VK_USE_PLATFORM_VI_NN*/\n\n    //=== VK_KHR_maintenance1 ===\n\n    VULKAN_HPP_INLINE void CommandPool::trimKHR( VULKAN_HPP_NAMESPACE::CommandPoolTrimFlags flags ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkTrimCommandPoolKHR && \"Function <vkTrimCommandPoolKHR> requires <VK_KHR_maintenance1> or <VK_VERSION_1_1>\" );\n\n      getDispatcher()->vkTrimCommandPoolKHR(\n        static_cast<VkDevice>( m_device ), static_cast<VkCommandPool>( m_commandPool ), static_cast<VkCommandPoolTrimFlags>( flags ) );\n    }\n\n    //=== VK_KHR_device_group_creation ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties> Instance::enumeratePhysicalDeviceGroupsKHR() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkEnumeratePhysicalDeviceGroupsKHR &&\n                         \"Function <vkEnumeratePhysicalDeviceGroupsKHR> requires <VK_KHR_device_group_creation> or <VK_VERSION_1_1>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties> physicalDeviceGroupProperties;\n      uint32_t                                                         physicalDeviceGroupCount;\n      VULKAN_HPP_NAMESPACE::Result                                     result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkEnumeratePhysicalDeviceGroupsKHR( static_cast<VkInstance>( m_instance ), &physicalDeviceGroupCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && physicalDeviceGroupCount )\n        {\n          physicalDeviceGroupProperties.resize( physicalDeviceGroupCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkEnumeratePhysicalDeviceGroupsKHR(\n            static_cast<VkInstance>( m_instance ),\n            &physicalDeviceGroupCount,\n            reinterpret_cast<VkPhysicalDeviceGroupProperties *>( physicalDeviceGroupProperties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Instance::enumeratePhysicalDeviceGroupsKHR\" );\n      VULKAN_HPP_ASSERT( physicalDeviceGroupCount <= physicalDeviceGroupProperties.size() );\n      if ( physicalDeviceGroupCount < physicalDeviceGroupProperties.size() )\n      {\n        physicalDeviceGroupProperties.resize( physicalDeviceGroupCount );\n      }\n      return physicalDeviceGroupProperties;\n    }\n\n    //=== VK_KHR_external_memory_capabilities ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ExternalBufferProperties PhysicalDevice::getExternalBufferPropertiesKHR(\n      const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo & externalBufferInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceExternalBufferPropertiesKHR &&\n                         \"Function <vkGetPhysicalDeviceExternalBufferPropertiesKHR> requires <VK_KHR_external_memory_capabilities> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::ExternalBufferProperties externalBufferProperties;\n      getDispatcher()->vkGetPhysicalDeviceExternalBufferPropertiesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                       reinterpret_cast<const VkPhysicalDeviceExternalBufferInfo *>( &externalBufferInfo ),\n                                                                       reinterpret_cast<VkExternalBufferProperties *>( &externalBufferProperties ) );\n\n      return externalBufferProperties;\n    }\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n    //=== VK_KHR_external_memory_win32 ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE HANDLE\n      Device::getMemoryWin32HandleKHR( const VULKAN_HPP_NAMESPACE::MemoryGetWin32HandleInfoKHR & getWin32HandleInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetMemoryWin32HandleKHR && \"Function <vkGetMemoryWin32HandleKHR> requires <VK_KHR_external_memory_win32>\" );\n\n      HANDLE                       handle;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetMemoryWin32HandleKHR(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkMemoryGetWin32HandleInfoKHR *>( &getWin32HandleInfo ), &handle ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getMemoryWin32HandleKHR\" );\n\n      return handle;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryWin32HandlePropertiesKHR\n      Device::getMemoryWin32HandlePropertiesKHR( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType, HANDLE handle ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetMemoryWin32HandlePropertiesKHR &&\n                         \"Function <vkGetMemoryWin32HandlePropertiesKHR> requires <VK_KHR_external_memory_win32>\" );\n\n      VULKAN_HPP_NAMESPACE::MemoryWin32HandlePropertiesKHR memoryWin32HandleProperties;\n      VULKAN_HPP_NAMESPACE::Result                         result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetMemoryWin32HandlePropertiesKHR( static_cast<VkDevice>( m_device ),\n                                                              static_cast<VkExternalMemoryHandleTypeFlagBits>( handleType ),\n                                                              handle,\n                                                              reinterpret_cast<VkMemoryWin32HandlePropertiesKHR *>( &memoryWin32HandleProperties ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getMemoryWin32HandlePropertiesKHR\" );\n\n      return memoryWin32HandleProperties;\n    }\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n    //=== VK_KHR_external_memory_fd ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE int Device::getMemoryFdKHR( const VULKAN_HPP_NAMESPACE::MemoryGetFdInfoKHR & getFdInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetMemoryFdKHR && \"Function <vkGetMemoryFdKHR> requires <VK_KHR_external_memory_fd>\" );\n\n      int                          fd;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetMemoryFdKHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkMemoryGetFdInfoKHR *>( &getFdInfo ), &fd ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getMemoryFdKHR\" );\n\n      return fd;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryFdPropertiesKHR\n                                           Device::getMemoryFdPropertiesKHR( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType, int fd ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetMemoryFdPropertiesKHR && \"Function <vkGetMemoryFdPropertiesKHR> requires <VK_KHR_external_memory_fd>\" );\n\n      VULKAN_HPP_NAMESPACE::MemoryFdPropertiesKHR memoryFdProperties;\n      VULKAN_HPP_NAMESPACE::Result                result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetMemoryFdPropertiesKHR( static_cast<VkDevice>( m_device ),\n                                                     static_cast<VkExternalMemoryHandleTypeFlagBits>( handleType ),\n                                                     fd,\n                                                     reinterpret_cast<VkMemoryFdPropertiesKHR *>( &memoryFdProperties ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getMemoryFdPropertiesKHR\" );\n\n      return memoryFdProperties;\n    }\n\n    //=== VK_KHR_external_semaphore_capabilities ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties PhysicalDevice::getExternalSemaphorePropertiesKHR(\n      const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo & externalSemaphoreInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceExternalSemaphorePropertiesKHR &&\n                         \"Function <vkGetPhysicalDeviceExternalSemaphorePropertiesKHR> requires <VK_KHR_external_semaphore_capabilities> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties externalSemaphoreProperties;\n      getDispatcher()->vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(\n        static_cast<VkPhysicalDevice>( m_physicalDevice ),\n        reinterpret_cast<const VkPhysicalDeviceExternalSemaphoreInfo *>( &externalSemaphoreInfo ),\n        reinterpret_cast<VkExternalSemaphoreProperties *>( &externalSemaphoreProperties ) );\n\n      return externalSemaphoreProperties;\n    }\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n    //=== VK_KHR_external_semaphore_win32 ===\n\n    VULKAN_HPP_INLINE void\n      Device::importSemaphoreWin32HandleKHR( const VULKAN_HPP_NAMESPACE::ImportSemaphoreWin32HandleInfoKHR & importSemaphoreWin32HandleInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkImportSemaphoreWin32HandleKHR &&\n                         \"Function <vkImportSemaphoreWin32HandleKHR> requires <VK_KHR_external_semaphore_win32>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkImportSemaphoreWin32HandleKHR(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkImportSemaphoreWin32HandleInfoKHR *>( &importSemaphoreWin32HandleInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::importSemaphoreWin32HandleKHR\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE HANDLE\n      Device::getSemaphoreWin32HandleKHR( const VULKAN_HPP_NAMESPACE::SemaphoreGetWin32HandleInfoKHR & getWin32HandleInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetSemaphoreWin32HandleKHR &&\n                         \"Function <vkGetSemaphoreWin32HandleKHR> requires <VK_KHR_external_semaphore_win32>\" );\n\n      HANDLE                       handle;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetSemaphoreWin32HandleKHR(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkSemaphoreGetWin32HandleInfoKHR *>( &getWin32HandleInfo ), &handle ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getSemaphoreWin32HandleKHR\" );\n\n      return handle;\n    }\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n    //=== VK_KHR_external_semaphore_fd ===\n\n    VULKAN_HPP_INLINE void Device::importSemaphoreFdKHR( const VULKAN_HPP_NAMESPACE::ImportSemaphoreFdInfoKHR & importSemaphoreFdInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkImportSemaphoreFdKHR && \"Function <vkImportSemaphoreFdKHR> requires <VK_KHR_external_semaphore_fd>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkImportSemaphoreFdKHR(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkImportSemaphoreFdInfoKHR *>( &importSemaphoreFdInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::importSemaphoreFdKHR\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE int Device::getSemaphoreFdKHR( const VULKAN_HPP_NAMESPACE::SemaphoreGetFdInfoKHR & getFdInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetSemaphoreFdKHR && \"Function <vkGetSemaphoreFdKHR> requires <VK_KHR_external_semaphore_fd>\" );\n\n      int                          fd;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetSemaphoreFdKHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkSemaphoreGetFdInfoKHR *>( &getFdInfo ), &fd ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getSemaphoreFdKHR\" );\n\n      return fd;\n    }\n\n    //=== VK_KHR_push_descriptor ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::pushDescriptorSetKHR(\n      VULKAN_HPP_NAMESPACE::PipelineBindPoint                                                  pipelineBindPoint,\n      VULKAN_HPP_NAMESPACE::PipelineLayout                                                     layout,\n      uint32_t                                                                                 set,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteDescriptorSet> const & descriptorWrites ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdPushDescriptorSetKHR &&\n                         \"Function <vkCmdPushDescriptorSetKHR> requires <VK_KHR_push_descriptor> or <VK_VERSION_1_4>\" );\n\n      getDispatcher()->vkCmdPushDescriptorSetKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                  static_cast<VkPipelineBindPoint>( pipelineBindPoint ),\n                                                  static_cast<VkPipelineLayout>( layout ),\n                                                  set,\n                                                  descriptorWrites.size(),\n                                                  reinterpret_cast<const VkWriteDescriptorSet *>( descriptorWrites.data() ) );\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_INLINE void CommandBuffer::pushDescriptorSetWithTemplateKHR( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,\n                                                                            VULKAN_HPP_NAMESPACE::PipelineLayout           layout,\n                                                                            uint32_t                                       set,\n                                                                            DataType const &                               data ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT(\n        getDispatcher()->vkCmdPushDescriptorSetWithTemplateKHR &&\n        \"Function <vkCmdPushDescriptorSetWithTemplateKHR> requires <VK_KHR_descriptor_update_template> or <VK_KHR_push_descriptor> or <VK_VERSION_1_4>\" );\n\n      getDispatcher()->vkCmdPushDescriptorSetWithTemplateKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                              static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),\n                                                              static_cast<VkPipelineLayout>( layout ),\n                                                              set,\n                                                              reinterpret_cast<const void *>( &data ) );\n    }\n\n    //=== VK_EXT_conditional_rendering ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::beginConditionalRenderingEXT(\n      const VULKAN_HPP_NAMESPACE::ConditionalRenderingBeginInfoEXT & conditionalRenderingBegin ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBeginConditionalRenderingEXT &&\n                         \"Function <vkCmdBeginConditionalRenderingEXT> requires <VK_EXT_conditional_rendering>\" );\n\n      getDispatcher()->vkCmdBeginConditionalRenderingEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                          reinterpret_cast<const VkConditionalRenderingBeginInfoEXT *>( &conditionalRenderingBegin ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::endConditionalRenderingEXT() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdEndConditionalRenderingEXT &&\n                         \"Function <vkCmdEndConditionalRenderingEXT> requires <VK_EXT_conditional_rendering>\" );\n\n      getDispatcher()->vkCmdEndConditionalRenderingEXT( static_cast<VkCommandBuffer>( m_commandBuffer ) );\n    }\n\n    //=== VK_KHR_descriptor_update_template ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorUpdateTemplate>::Type\n      Device::createDescriptorUpdateTemplateKHR( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo const &                createInfo,\n                                                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate;\n      VULKAN_HPP_NAMESPACE::Result                   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateDescriptorUpdateTemplateKHR(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkDescriptorUpdateTemplateCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkDescriptorUpdateTemplate *>( &descriptorUpdateTemplate ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createDescriptorUpdateTemplateKHR\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorUpdateTemplate(\n        *this, *reinterpret_cast<VkDescriptorUpdateTemplate *>( &descriptorUpdateTemplate ), allocator );\n    }\n\n    VULKAN_HPP_INLINE void\n      Device::destroyDescriptorUpdateTemplateKHR( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate            descriptorUpdateTemplate,\n                                                  Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkDestroyDescriptorUpdateTemplateKHR &&\n                         \"Function <vkDestroyDescriptorUpdateTemplateKHR> requires <VK_KHR_descriptor_update_template> or <VK_VERSION_1_1>\" );\n\n      getDispatcher()->vkDestroyDescriptorUpdateTemplateKHR(\n        static_cast<VkDevice>( m_device ),\n        static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_INLINE void DescriptorSet::updateWithTemplateKHR( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,\n                                                                 DataType const &                               data ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkUpdateDescriptorSetWithTemplateKHR &&\n                         \"Function <vkUpdateDescriptorSetWithTemplateKHR> requires <VK_KHR_descriptor_update_template> or <VK_VERSION_1_1>\" );\n\n      getDispatcher()->vkUpdateDescriptorSetWithTemplateKHR( static_cast<VkDevice>( m_device ),\n                                                             static_cast<VkDescriptorSet>( m_descriptorSet ),\n                                                             static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),\n                                                             reinterpret_cast<const void *>( &data ) );\n    }\n\n    //=== VK_NV_clip_space_w_scaling ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::setViewportWScalingNV(\n      uint32_t                                                                                 firstViewport,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ViewportWScalingNV> const & viewportWScalings ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetViewportWScalingNV && \"Function <vkCmdSetViewportWScalingNV> requires <VK_NV_clip_space_w_scaling>\" );\n\n      getDispatcher()->vkCmdSetViewportWScalingNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                   firstViewport,\n                                                   viewportWScalings.size(),\n                                                   reinterpret_cast<const VkViewportWScalingNV *>( viewportWScalings.data() ) );\n    }\n\n#  if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )\n    //=== VK_EXT_acquire_xlib_display ===\n\n    VULKAN_HPP_INLINE void PhysicalDevice::acquireXlibDisplayEXT( Display & dpy, VULKAN_HPP_NAMESPACE::DisplayKHR display ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkAcquireXlibDisplayEXT && \"Function <vkAcquireXlibDisplayEXT> requires <VK_EXT_acquire_xlib_display>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkAcquireXlibDisplayEXT( static_cast<VkPhysicalDevice>( m_physicalDevice ), &dpy, static_cast<VkDisplayKHR>( display ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::acquireXlibDisplayEXT\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR>::Type\n      PhysicalDevice::getRandROutputDisplayEXT( Display & dpy, RROutput rrOutput ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::DisplayKHR display;\n      VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetRandROutputDisplayEXT(\n        static_cast<VkPhysicalDevice>( m_physicalDevice ), &dpy, rrOutput, reinterpret_cast<VkDisplayKHR *>( &display ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#    if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#    else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"PhysicalDevice::getRandROutputDisplayEXT\" );\n#    endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR( *this, *reinterpret_cast<VkDisplayKHR *>( &display ) );\n    }\n#  endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/\n\n    //=== VK_EXT_display_surface_counter ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::SurfaceCapabilities2EXT\n                                           PhysicalDevice::getSurfaceCapabilities2EXT( VULKAN_HPP_NAMESPACE::SurfaceKHR surface ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceSurfaceCapabilities2EXT &&\n                         \"Function <vkGetPhysicalDeviceSurfaceCapabilities2EXT> requires <VK_EXT_display_surface_counter>\" );\n\n      VULKAN_HPP_NAMESPACE::SurfaceCapabilities2EXT surfaceCapabilities;\n      VULKAN_HPP_NAMESPACE::Result                  result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetPhysicalDeviceSurfaceCapabilities2EXT( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                     static_cast<VkSurfaceKHR>( surface ),\n                                                                     reinterpret_cast<VkSurfaceCapabilities2EXT *>( &surfaceCapabilities ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfaceCapabilities2EXT\" );\n\n      return surfaceCapabilities;\n    }\n\n    //=== VK_EXT_display_control ===\n\n    VULKAN_HPP_INLINE void Device::displayPowerControlEXT( VULKAN_HPP_NAMESPACE::DisplayKHR                  display,\n                                                           const VULKAN_HPP_NAMESPACE::DisplayPowerInfoEXT & displayPowerInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkDisplayPowerControlEXT && \"Function <vkDisplayPowerControlEXT> requires <VK_EXT_display_control>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkDisplayPowerControlEXT(\n        static_cast<VkDevice>( m_device ), static_cast<VkDisplayKHR>( display ), reinterpret_cast<const VkDisplayPowerInfoEXT *>( &displayPowerInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::displayPowerControlEXT\" );\n    }\n\n    VULKAN_HPP_NODISCARD\n      VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Fence>::Type\n                        Device::registerEventEXT( VULKAN_HPP_NAMESPACE::DeviceEventInfoEXT const &                                deviceEventInfo,\n                                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::Fence  fence;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkRegisterDeviceEventEXT(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkDeviceEventInfoEXT *>( &deviceEventInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkFence *>( &fence ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::registerEventEXT\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Fence( *this, *reinterpret_cast<VkFence *>( &fence ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD\n      VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Fence>::Type\n                        Device::registerDisplayEventEXT( VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR const &             display,\n                                       VULKAN_HPP_NAMESPACE::DisplayEventInfoEXT const &                               displayEventInfo,\n                                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::Fence  fence;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkRegisterDisplayEventEXT(\n        static_cast<VkDevice>( m_device ),\n        static_cast<VkDisplayKHR>( *display ),\n        reinterpret_cast<const VkDisplayEventInfoEXT *>( &displayEventInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkFence *>( &fence ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::registerDisplayEventEXT\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Fence( *this, *reinterpret_cast<VkFence *>( &fence ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint64_t SwapchainKHR::getCounterEXT( VULKAN_HPP_NAMESPACE::SurfaceCounterFlagBitsEXT counter ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetSwapchainCounterEXT && \"Function <vkGetSwapchainCounterEXT> requires <VK_EXT_display_control>\" );\n\n      uint64_t                     counterValue;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetSwapchainCounterEXT(\n        static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( m_swapchain ), static_cast<VkSurfaceCounterFlagBitsEXT>( counter ), &counterValue ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::SwapchainKHR::getCounterEXT\" );\n\n      return counterValue;\n    }\n\n    //=== VK_GOOGLE_display_timing ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::RefreshCycleDurationGOOGLE SwapchainKHR::getRefreshCycleDurationGOOGLE() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetRefreshCycleDurationGOOGLE && \"Function <vkGetRefreshCycleDurationGOOGLE> requires <VK_GOOGLE_display_timing>\" );\n\n      VULKAN_HPP_NAMESPACE::RefreshCycleDurationGOOGLE displayTimingProperties;\n      VULKAN_HPP_NAMESPACE::Result                     result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetRefreshCycleDurationGOOGLE( static_cast<VkDevice>( m_device ),\n                                                          static_cast<VkSwapchainKHR>( m_swapchain ),\n                                                          reinterpret_cast<VkRefreshCycleDurationGOOGLE *>( &displayTimingProperties ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::SwapchainKHR::getRefreshCycleDurationGOOGLE\" );\n\n      return displayTimingProperties;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE> SwapchainKHR::getPastPresentationTimingGOOGLE() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPastPresentationTimingGOOGLE &&\n                         \"Function <vkGetPastPresentationTimingGOOGLE> requires <VK_GOOGLE_display_timing>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE> presentationTimings;\n      uint32_t                                                        presentationTimingCount;\n      VULKAN_HPP_NAMESPACE::Result                                    result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPastPresentationTimingGOOGLE(\n          static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( m_swapchain ), &presentationTimingCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && presentationTimingCount )\n        {\n          presentationTimings.resize( presentationTimingCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n            getDispatcher()->vkGetPastPresentationTimingGOOGLE( static_cast<VkDevice>( m_device ),\n                                                                static_cast<VkSwapchainKHR>( m_swapchain ),\n                                                                &presentationTimingCount,\n                                                                reinterpret_cast<VkPastPresentationTimingGOOGLE *>( presentationTimings.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::SwapchainKHR::getPastPresentationTimingGOOGLE\" );\n      VULKAN_HPP_ASSERT( presentationTimingCount <= presentationTimings.size() );\n      if ( presentationTimingCount < presentationTimings.size() )\n      {\n        presentationTimings.resize( presentationTimingCount );\n      }\n      return presentationTimings;\n    }\n\n    //=== VK_EXT_discard_rectangles ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::setDiscardRectangleEXT(\n      uint32_t firstDiscardRectangle, VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & discardRectangles ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDiscardRectangleEXT && \"Function <vkCmdSetDiscardRectangleEXT> requires <VK_EXT_discard_rectangles>\" );\n\n      getDispatcher()->vkCmdSetDiscardRectangleEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                    firstDiscardRectangle,\n                                                    discardRectangles.size(),\n                                                    reinterpret_cast<const VkRect2D *>( discardRectangles.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setDiscardRectangleEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 discardRectangleEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDiscardRectangleEnableEXT &&\n                         \"Function <vkCmdSetDiscardRectangleEnableEXT> requires <VK_EXT_discard_rectangles>\" );\n\n      getDispatcher()->vkCmdSetDiscardRectangleEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( discardRectangleEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::setDiscardRectangleModeEXT( VULKAN_HPP_NAMESPACE::DiscardRectangleModeEXT discardRectangleMode ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDiscardRectangleModeEXT &&\n                         \"Function <vkCmdSetDiscardRectangleModeEXT> requires <VK_EXT_discard_rectangles>\" );\n\n      getDispatcher()->vkCmdSetDiscardRectangleModeEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                        static_cast<VkDiscardRectangleModeEXT>( discardRectangleMode ) );\n    }\n\n    //=== VK_EXT_hdr_metadata ===\n\n    VULKAN_HPP_INLINE void Device::setHdrMetadataEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SwapchainKHR> const &   swapchains,\n                                                      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::HdrMetadataEXT> const & metadata ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkSetHdrMetadataEXT && \"Function <vkSetHdrMetadataEXT> requires <VK_EXT_hdr_metadata>\" );\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( swapchains.size() == metadata.size() );\n#  else\n      if ( swapchains.size() != metadata.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::Device::setHdrMetadataEXT: swapchains.size() != metadata.size()\" );\n      }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n      getDispatcher()->vkSetHdrMetadataEXT( static_cast<VkDevice>( m_device ),\n                                            swapchains.size(),\n                                            reinterpret_cast<const VkSwapchainKHR *>( swapchains.data() ),\n                                            reinterpret_cast<const VkHdrMetadataEXT *>( metadata.data() ) );\n    }\n\n    //=== VK_KHR_create_renderpass2 ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::RenderPass>::Type\n      Device::createRenderPass2KHR( VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 const &                             createInfo,\n                                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::RenderPass renderPass;\n      VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateRenderPass2KHR(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkRenderPassCreateInfo2 *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkRenderPass *>( &renderPass ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createRenderPass2KHR\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::RenderPass( *this, *reinterpret_cast<VkRenderPass *>( &renderPass ), allocator );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::beginRenderPass2KHR( const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo & renderPassBegin,\n                                                               const VULKAN_HPP_NAMESPACE::SubpassBeginInfo &    subpassBeginInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBeginRenderPass2KHR &&\n                         \"Function <vkCmdBeginRenderPass2KHR> requires <VK_KHR_create_renderpass2> or <VK_VERSION_1_2>\" );\n\n      getDispatcher()->vkCmdBeginRenderPass2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                 reinterpret_cast<const VkRenderPassBeginInfo *>( &renderPassBegin ),\n                                                 reinterpret_cast<const VkSubpassBeginInfo *>( &subpassBeginInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::nextSubpass2KHR( const VULKAN_HPP_NAMESPACE::SubpassBeginInfo & subpassBeginInfo,\n                                                           const VULKAN_HPP_NAMESPACE::SubpassEndInfo &   subpassEndInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdNextSubpass2KHR && \"Function <vkCmdNextSubpass2KHR> requires <VK_KHR_create_renderpass2> or <VK_VERSION_1_2>\" );\n\n      getDispatcher()->vkCmdNextSubpass2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                             reinterpret_cast<const VkSubpassBeginInfo *>( &subpassBeginInfo ),\n                                             reinterpret_cast<const VkSubpassEndInfo *>( &subpassEndInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::endRenderPass2KHR( const VULKAN_HPP_NAMESPACE::SubpassEndInfo & subpassEndInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdEndRenderPass2KHR &&\n                         \"Function <vkCmdEndRenderPass2KHR> requires <VK_KHR_create_renderpass2> or <VK_VERSION_1_2>\" );\n\n      getDispatcher()->vkCmdEndRenderPass2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkSubpassEndInfo *>( &subpassEndInfo ) );\n    }\n\n    //=== VK_KHR_shared_presentable_image ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result SwapchainKHR::getStatus() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetSwapchainStatusKHR && \"Function <vkGetSwapchainStatusKHR> requires <VK_KHR_shared_presentable_image>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetSwapchainStatusKHR( static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( m_swapchain ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                                 VULKAN_HPP_NAMESPACE_STRING \"::SwapchainKHR::getStatus\",\n                                                 { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eSuboptimalKHR } );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n    }\n\n    //=== VK_KHR_external_fence_capabilities ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ExternalFenceProperties\n      PhysicalDevice::getExternalFencePropertiesKHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo & externalFenceInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceExternalFencePropertiesKHR &&\n                         \"Function <vkGetPhysicalDeviceExternalFencePropertiesKHR> requires <VK_KHR_external_fence_capabilities> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::ExternalFenceProperties externalFenceProperties;\n      getDispatcher()->vkGetPhysicalDeviceExternalFencePropertiesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                      reinterpret_cast<const VkPhysicalDeviceExternalFenceInfo *>( &externalFenceInfo ),\n                                                                      reinterpret_cast<VkExternalFenceProperties *>( &externalFenceProperties ) );\n\n      return externalFenceProperties;\n    }\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n    //=== VK_KHR_external_fence_win32 ===\n\n    VULKAN_HPP_INLINE void Device::importFenceWin32HandleKHR( const VULKAN_HPP_NAMESPACE::ImportFenceWin32HandleInfoKHR & importFenceWin32HandleInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkImportFenceWin32HandleKHR && \"Function <vkImportFenceWin32HandleKHR> requires <VK_KHR_external_fence_win32>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkImportFenceWin32HandleKHR(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkImportFenceWin32HandleInfoKHR *>( &importFenceWin32HandleInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::importFenceWin32HandleKHR\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE HANDLE\n      Device::getFenceWin32HandleKHR( const VULKAN_HPP_NAMESPACE::FenceGetWin32HandleInfoKHR & getWin32HandleInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetFenceWin32HandleKHR && \"Function <vkGetFenceWin32HandleKHR> requires <VK_KHR_external_fence_win32>\" );\n\n      HANDLE                       handle;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetFenceWin32HandleKHR(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkFenceGetWin32HandleInfoKHR *>( &getWin32HandleInfo ), &handle ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getFenceWin32HandleKHR\" );\n\n      return handle;\n    }\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n    //=== VK_KHR_external_fence_fd ===\n\n    VULKAN_HPP_INLINE void Device::importFenceFdKHR( const VULKAN_HPP_NAMESPACE::ImportFenceFdInfoKHR & importFenceFdInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkImportFenceFdKHR && \"Function <vkImportFenceFdKHR> requires <VK_KHR_external_fence_fd>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkImportFenceFdKHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkImportFenceFdInfoKHR *>( &importFenceFdInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::importFenceFdKHR\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE int Device::getFenceFdKHR( const VULKAN_HPP_NAMESPACE::FenceGetFdInfoKHR & getFdInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetFenceFdKHR && \"Function <vkGetFenceFdKHR> requires <VK_KHR_external_fence_fd>\" );\n\n      int                          fd;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetFenceFdKHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkFenceGetFdInfoKHR *>( &getFdInfo ), &fd ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getFenceFdKHR\" );\n\n      return fd;\n    }\n\n    //=== VK_KHR_performance_query ===\n\n    VULKAN_HPP_NODISCARD\n      VULKAN_HPP_INLINE std::pair<std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterKHR>, std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR>>\n                        PhysicalDevice::enumerateQueueFamilyPerformanceQueryCountersKHR( uint32_t queueFamilyIndex ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR &&\n                         \"Function <vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR> requires <VK_KHR_performance_query>\" );\n\n      std::pair<std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterKHR>, std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR>> data_;\n      std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterKHR> &            counters            = data_.first;\n      std::vector<VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR> & counterDescriptions = data_.second;\n      uint32_t                                                              counterCount;\n      VULKAN_HPP_NAMESPACE::Result                                          result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(\n          static_cast<VkPhysicalDevice>( m_physicalDevice ), queueFamilyIndex, &counterCount, nullptr, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && counterCount )\n        {\n          counters.resize( counterCount );\n          counterDescriptions.resize( counterCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(\n            static_cast<VkPhysicalDevice>( m_physicalDevice ),\n            queueFamilyIndex,\n            &counterCount,\n            reinterpret_cast<VkPerformanceCounterKHR *>( counters.data() ),\n            reinterpret_cast<VkPerformanceCounterDescriptionKHR *>( counterDescriptions.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::enumerateQueueFamilyPerformanceQueryCountersKHR\" );\n      VULKAN_HPP_ASSERT( counterCount <= counters.size() );\n      if ( counterCount < counters.size() )\n      {\n        counters.resize( counterCount );\n        counterDescriptions.resize( counterCount );\n      }\n      return data_;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint32_t PhysicalDevice::getQueueFamilyPerformanceQueryPassesKHR(\n      const VULKAN_HPP_NAMESPACE::QueryPoolPerformanceCreateInfoKHR & performanceQueryCreateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR &&\n                         \"Function <vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR> requires <VK_KHR_performance_query>\" );\n\n      uint32_t numPasses;\n      getDispatcher()->vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(\n        static_cast<VkPhysicalDevice>( m_physicalDevice ),\n        reinterpret_cast<const VkQueryPoolPerformanceCreateInfoKHR *>( &performanceQueryCreateInfo ),\n        &numPasses );\n\n      return numPasses;\n    }\n\n    VULKAN_HPP_INLINE void Device::acquireProfilingLockKHR( const VULKAN_HPP_NAMESPACE::AcquireProfilingLockInfoKHR & info ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkAcquireProfilingLockKHR && \"Function <vkAcquireProfilingLockKHR> requires <VK_KHR_performance_query>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkAcquireProfilingLockKHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkAcquireProfilingLockInfoKHR *>( &info ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::acquireProfilingLockKHR\" );\n    }\n\n    VULKAN_HPP_INLINE void Device::releaseProfilingLockKHR() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkReleaseProfilingLockKHR && \"Function <vkReleaseProfilingLockKHR> requires <VK_KHR_performance_query>\" );\n\n      getDispatcher()->vkReleaseProfilingLockKHR( static_cast<VkDevice>( m_device ) );\n    }\n\n    //=== VK_KHR_get_surface_capabilities2 ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR\n      PhysicalDevice::getSurfaceCapabilities2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceSurfaceCapabilities2KHR &&\n                         \"Function <vkGetPhysicalDeviceSurfaceCapabilities2KHR> requires <VK_KHR_get_surface_capabilities2>\" );\n\n      VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR surfaceCapabilities;\n      VULKAN_HPP_NAMESPACE::Result                  result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetPhysicalDeviceSurfaceCapabilities2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                     reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ),\n                                                                     reinterpret_cast<VkSurfaceCapabilities2KHR *>( &surfaceCapabilities ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfaceCapabilities2KHR\" );\n\n      return surfaceCapabilities;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n      PhysicalDevice::getSurfaceCapabilities2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceSurfaceCapabilities2KHR &&\n                         \"Function <vkGetPhysicalDeviceSurfaceCapabilities2KHR> requires <VK_KHR_get_surface_capabilities2>\" );\n\n      StructureChain<X, Y, Z...>                      structureChain;\n      VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR & surfaceCapabilities = structureChain.template get<VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR>();\n      VULKAN_HPP_NAMESPACE::Result                    result              = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetPhysicalDeviceSurfaceCapabilities2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                     reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ),\n                                                                     reinterpret_cast<VkSurfaceCapabilities2KHR *>( &surfaceCapabilities ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfaceCapabilities2KHR\" );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR>\n      PhysicalDevice::getSurfaceFormats2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceSurfaceFormats2KHR &&\n                         \"Function <vkGetPhysicalDeviceSurfaceFormats2KHR> requires <VK_KHR_get_surface_capabilities2>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR> surfaceFormats;\n      uint32_t                                             surfaceFormatCount;\n      VULKAN_HPP_NAMESPACE::Result                         result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkGetPhysicalDeviceSurfaceFormats2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                  reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ),\n                                                                  &surfaceFormatCount,\n                                                                  nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && surfaceFormatCount )\n        {\n          surfaceFormats.resize( surfaceFormatCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n            getDispatcher()->vkGetPhysicalDeviceSurfaceFormats2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                    reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ),\n                                                                    &surfaceFormatCount,\n                                                                    reinterpret_cast<VkSurfaceFormat2KHR *>( surfaceFormats.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfaceFormats2KHR\" );\n      VULKAN_HPP_ASSERT( surfaceFormatCount <= surfaceFormats.size() );\n      if ( surfaceFormatCount < surfaceFormats.size() )\n      {\n        surfaceFormats.resize( surfaceFormatCount );\n      }\n      return surfaceFormats;\n    }\n\n    template <typename StructureChain>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<StructureChain>\n      PhysicalDevice::getSurfaceFormats2KHR( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceSurfaceFormats2KHR &&\n                         \"Function <vkGetPhysicalDeviceSurfaceFormats2KHR> requires <VK_KHR_get_surface_capabilities2>\" );\n\n      std::vector<StructureChain>                          structureChains;\n      std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR> surfaceFormats;\n      uint32_t                                             surfaceFormatCount;\n      VULKAN_HPP_NAMESPACE::Result                         result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkGetPhysicalDeviceSurfaceFormats2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                  reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ),\n                                                                  &surfaceFormatCount,\n                                                                  nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && surfaceFormatCount )\n        {\n          structureChains.resize( surfaceFormatCount );\n          surfaceFormats.resize( surfaceFormatCount );\n          for ( uint32_t i = 0; i < surfaceFormatCount; i++ )\n          {\n            surfaceFormats[i].pNext = structureChains[i].template get<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR>().pNext;\n          }\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n            getDispatcher()->vkGetPhysicalDeviceSurfaceFormats2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                    reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ),\n                                                                    &surfaceFormatCount,\n                                                                    reinterpret_cast<VkSurfaceFormat2KHR *>( surfaceFormats.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfaceFormats2KHR\" );\n      VULKAN_HPP_ASSERT( surfaceFormatCount <= surfaceFormats.size() );\n      if ( surfaceFormatCount < surfaceFormats.size() )\n      {\n        structureChains.resize( surfaceFormatCount );\n      }\n      for ( uint32_t i = 0; i < surfaceFormatCount; i++ )\n      {\n        structureChains[i].template get<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR>() = surfaceFormats[i];\n      }\n      return structureChains;\n    }\n\n    //=== VK_KHR_get_display_properties2 ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::DisplayProperties2KHR> PhysicalDevice::getDisplayProperties2KHR() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceDisplayProperties2KHR &&\n                         \"Function <vkGetPhysicalDeviceDisplayProperties2KHR> requires <VK_KHR_get_display_properties2>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::DisplayProperties2KHR> properties;\n      uint32_t                                                 propertyCount;\n      VULKAN_HPP_NAMESPACE::Result                             result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkGetPhysicalDeviceDisplayProperties2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ), &propertyCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n        {\n          properties.resize( propertyCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceDisplayProperties2KHR(\n            static_cast<VkPhysicalDevice>( m_physicalDevice ), &propertyCount, reinterpret_cast<VkDisplayProperties2KHR *>( properties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDisplayProperties2KHR\" );\n      VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n      if ( propertyCount < properties.size() )\n      {\n        properties.resize( propertyCount );\n      }\n      return properties;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR> PhysicalDevice::getDisplayPlaneProperties2KHR() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceDisplayPlaneProperties2KHR &&\n                         \"Function <vkGetPhysicalDeviceDisplayPlaneProperties2KHR> requires <VK_KHR_get_display_properties2>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR> properties;\n      uint32_t                                                      propertyCount;\n      VULKAN_HPP_NAMESPACE::Result                                  result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkGetPhysicalDeviceDisplayPlaneProperties2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ), &propertyCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n        {\n          properties.resize( propertyCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceDisplayPlaneProperties2KHR(\n            static_cast<VkPhysicalDevice>( m_physicalDevice ), &propertyCount, reinterpret_cast<VkDisplayPlaneProperties2KHR *>( properties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDisplayPlaneProperties2KHR\" );\n      VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n      if ( propertyCount < properties.size() )\n      {\n        properties.resize( propertyCount );\n      }\n      return properties;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR> DisplayKHR::getModeProperties2() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDisplayModeProperties2KHR &&\n                         \"Function <vkGetDisplayModeProperties2KHR> requires <VK_KHR_get_display_properties2>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR> properties;\n      uint32_t                                                     propertyCount;\n      VULKAN_HPP_NAMESPACE::Result                                 result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetDisplayModeProperties2KHR(\n          static_cast<VkPhysicalDevice>( m_physicalDevice ), static_cast<VkDisplayKHR>( m_display ), &propertyCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n        {\n          properties.resize( propertyCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n            getDispatcher()->vkGetDisplayModeProperties2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                             static_cast<VkDisplayKHR>( m_display ),\n                                                             &propertyCount,\n                                                             reinterpret_cast<VkDisplayModeProperties2KHR *>( properties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::DisplayKHR::getModeProperties2\" );\n      VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n      if ( propertyCount < properties.size() )\n      {\n        properties.resize( propertyCount );\n      }\n      return properties;\n    }\n\n    template <typename StructureChain>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<StructureChain> DisplayKHR::getModeProperties2() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDisplayModeProperties2KHR &&\n                         \"Function <vkGetDisplayModeProperties2KHR> requires <VK_KHR_get_display_properties2>\" );\n\n      std::vector<StructureChain>                                  structureChains;\n      std::vector<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR> properties;\n      uint32_t                                                     propertyCount;\n      VULKAN_HPP_NAMESPACE::Result                                 result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetDisplayModeProperties2KHR(\n          static_cast<VkPhysicalDevice>( m_physicalDevice ), static_cast<VkDisplayKHR>( m_display ), &propertyCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n        {\n          structureChains.resize( propertyCount );\n          properties.resize( propertyCount );\n          for ( uint32_t i = 0; i < propertyCount; i++ )\n          {\n            properties[i].pNext = structureChains[i].template get<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR>().pNext;\n          }\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n            getDispatcher()->vkGetDisplayModeProperties2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                             static_cast<VkDisplayKHR>( m_display ),\n                                                             &propertyCount,\n                                                             reinterpret_cast<VkDisplayModeProperties2KHR *>( properties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::DisplayKHR::getModeProperties2\" );\n      VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n      if ( propertyCount < properties.size() )\n      {\n        structureChains.resize( propertyCount );\n      }\n      for ( uint32_t i = 0; i < propertyCount; i++ )\n      {\n        structureChains[i].template get<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR>() = properties[i];\n      }\n      return structureChains;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilities2KHR\n      PhysicalDevice::getDisplayPlaneCapabilities2KHR( const VULKAN_HPP_NAMESPACE::DisplayPlaneInfo2KHR & displayPlaneInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDisplayPlaneCapabilities2KHR &&\n                         \"Function <vkGetDisplayPlaneCapabilities2KHR> requires <VK_KHR_get_display_properties2>\" );\n\n      VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilities2KHR capabilities;\n      VULKAN_HPP_NAMESPACE::Result                       result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetDisplayPlaneCapabilities2KHR( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                            reinterpret_cast<const VkDisplayPlaneInfo2KHR *>( &displayPlaneInfo ),\n                                                            reinterpret_cast<VkDisplayPlaneCapabilities2KHR *>( &capabilities ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getDisplayPlaneCapabilities2KHR\" );\n\n      return capabilities;\n    }\n\n#  if defined( VK_USE_PLATFORM_IOS_MVK )\n    //=== VK_MVK_ios_surface ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n      Instance::createIOSSurfaceMVK( VULKAN_HPP_NAMESPACE::IOSSurfaceCreateInfoMVK const &                           createInfo,\n                                     VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n      VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateIOSSurfaceMVK(\n        static_cast<VkInstance>( m_instance ),\n        reinterpret_cast<const VkIOSSurfaceCreateInfoMVK *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#    if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#    else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Instance::createIOSSurfaceMVK\" );\n#    endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR( *this, *reinterpret_cast<VkSurfaceKHR *>( &surface ), allocator );\n    }\n#  endif /*VK_USE_PLATFORM_IOS_MVK*/\n\n#  if defined( VK_USE_PLATFORM_MACOS_MVK )\n    //=== VK_MVK_macos_surface ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n      Instance::createMacOSSurfaceMVK( VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateInfoMVK const &                         createInfo,\n                                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n      VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateMacOSSurfaceMVK(\n        static_cast<VkInstance>( m_instance ),\n        reinterpret_cast<const VkMacOSSurfaceCreateInfoMVK *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#    if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#    else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Instance::createMacOSSurfaceMVK\" );\n#    endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR( *this, *reinterpret_cast<VkSurfaceKHR *>( &surface ), allocator );\n    }\n#  endif /*VK_USE_PLATFORM_MACOS_MVK*/\n\n    //=== VK_EXT_debug_utils ===\n\n    VULKAN_HPP_INLINE void Device::setDebugUtilsObjectNameEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT & nameInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkSetDebugUtilsObjectNameEXT && \"Function <vkSetDebugUtilsObjectNameEXT> requires <VK_EXT_debug_utils>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkSetDebugUtilsObjectNameEXT(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkDebugUtilsObjectNameInfoEXT *>( &nameInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::setDebugUtilsObjectNameEXT\" );\n    }\n\n    VULKAN_HPP_INLINE void Device::setDebugUtilsObjectTagEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsObjectTagInfoEXT & tagInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkSetDebugUtilsObjectTagEXT && \"Function <vkSetDebugUtilsObjectTagEXT> requires <VK_EXT_debug_utils>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkSetDebugUtilsObjectTagEXT( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkDebugUtilsObjectTagInfoEXT *>( &tagInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::setDebugUtilsObjectTagEXT\" );\n    }\n\n    VULKAN_HPP_INLINE void Queue::beginDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT & labelInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkQueueBeginDebugUtilsLabelEXT && \"Function <vkQueueBeginDebugUtilsLabelEXT> requires <VK_EXT_debug_utils>\" );\n\n      getDispatcher()->vkQueueBeginDebugUtilsLabelEXT( static_cast<VkQueue>( m_queue ), reinterpret_cast<const VkDebugUtilsLabelEXT *>( &labelInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void Queue::endDebugUtilsLabelEXT() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkQueueEndDebugUtilsLabelEXT && \"Function <vkQueueEndDebugUtilsLabelEXT> requires <VK_EXT_debug_utils>\" );\n\n      getDispatcher()->vkQueueEndDebugUtilsLabelEXT( static_cast<VkQueue>( m_queue ) );\n    }\n\n    VULKAN_HPP_INLINE void Queue::insertDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT & labelInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkQueueInsertDebugUtilsLabelEXT && \"Function <vkQueueInsertDebugUtilsLabelEXT> requires <VK_EXT_debug_utils>\" );\n\n      getDispatcher()->vkQueueInsertDebugUtilsLabelEXT( static_cast<VkQueue>( m_queue ), reinterpret_cast<const VkDebugUtilsLabelEXT *>( &labelInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::beginDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT & labelInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBeginDebugUtilsLabelEXT && \"Function <vkCmdBeginDebugUtilsLabelEXT> requires <VK_EXT_debug_utils>\" );\n\n      getDispatcher()->vkCmdBeginDebugUtilsLabelEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                     reinterpret_cast<const VkDebugUtilsLabelEXT *>( &labelInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::endDebugUtilsLabelEXT() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdEndDebugUtilsLabelEXT && \"Function <vkCmdEndDebugUtilsLabelEXT> requires <VK_EXT_debug_utils>\" );\n\n      getDispatcher()->vkCmdEndDebugUtilsLabelEXT( static_cast<VkCommandBuffer>( m_commandBuffer ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::insertDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT & labelInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdInsertDebugUtilsLabelEXT && \"Function <vkCmdInsertDebugUtilsLabelEXT> requires <VK_EXT_debug_utils>\" );\n\n      getDispatcher()->vkCmdInsertDebugUtilsLabelEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                      reinterpret_cast<const VkDebugUtilsLabelEXT *>( &labelInfo ) );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DebugUtilsMessengerEXT>::Type\n      Instance::createDebugUtilsMessengerEXT( VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateInfoEXT const &                  createInfo,\n                                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT messenger;\n      VULKAN_HPP_NAMESPACE::Result                 result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateDebugUtilsMessengerEXT(\n        static_cast<VkInstance>( m_instance ),\n        reinterpret_cast<const VkDebugUtilsMessengerCreateInfoEXT *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkDebugUtilsMessengerEXT *>( &messenger ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Instance::createDebugUtilsMessengerEXT\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DebugUtilsMessengerEXT(\n        *this, *reinterpret_cast<VkDebugUtilsMessengerEXT *>( &messenger ), allocator );\n    }\n\n    VULKAN_HPP_INLINE void\n      Instance::submitDebugUtilsMessageEXT( VULKAN_HPP_NAMESPACE::DebugUtilsMessageSeverityFlagBitsEXT       messageSeverity,\n                                            VULKAN_HPP_NAMESPACE::DebugUtilsMessageTypeFlagsEXT              messageTypes,\n                                            const VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCallbackDataEXT & callbackData ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkSubmitDebugUtilsMessageEXT && \"Function <vkSubmitDebugUtilsMessageEXT> requires <VK_EXT_debug_utils>\" );\n\n      getDispatcher()->vkSubmitDebugUtilsMessageEXT( static_cast<VkInstance>( m_instance ),\n                                                     static_cast<VkDebugUtilsMessageSeverityFlagBitsEXT>( messageSeverity ),\n                                                     static_cast<VkDebugUtilsMessageTypeFlagsEXT>( messageTypes ),\n                                                     reinterpret_cast<const VkDebugUtilsMessengerCallbackDataEXT *>( &callbackData ) );\n    }\n\n#  if defined( VK_USE_PLATFORM_ANDROID_KHR )\n    //=== VK_ANDROID_external_memory_android_hardware_buffer ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID\n                                           Device::getAndroidHardwareBufferPropertiesANDROID( const struct AHardwareBuffer & buffer ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetAndroidHardwareBufferPropertiesANDROID &&\n                         \"Function <vkGetAndroidHardwareBufferPropertiesANDROID> requires <VK_ANDROID_external_memory_android_hardware_buffer>\" );\n\n      VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID properties;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetAndroidHardwareBufferPropertiesANDROID(\n        static_cast<VkDevice>( m_device ), &buffer, reinterpret_cast<VkAndroidHardwareBufferPropertiesANDROID *>( &properties ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getAndroidHardwareBufferPropertiesANDROID\" );\n\n      return properties;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                                           Device::getAndroidHardwareBufferPropertiesANDROID( const struct AHardwareBuffer & buffer ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetAndroidHardwareBufferPropertiesANDROID &&\n                         \"Function <vkGetAndroidHardwareBufferPropertiesANDROID> requires <VK_ANDROID_external_memory_android_hardware_buffer>\" );\n\n      StructureChain<X, Y, Z...>                                     structureChain;\n      VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID & properties =\n        structureChain.template get<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID>();\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetAndroidHardwareBufferPropertiesANDROID(\n        static_cast<VkDevice>( m_device ), &buffer, reinterpret_cast<VkAndroidHardwareBufferPropertiesANDROID *>( &properties ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getAndroidHardwareBufferPropertiesANDROID\" );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE struct AHardwareBuffer *\n      Device::getMemoryAndroidHardwareBufferANDROID( const VULKAN_HPP_NAMESPACE::MemoryGetAndroidHardwareBufferInfoANDROID & info ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetMemoryAndroidHardwareBufferANDROID &&\n                         \"Function <vkGetMemoryAndroidHardwareBufferANDROID> requires <VK_ANDROID_external_memory_android_hardware_buffer>\" );\n\n      struct AHardwareBuffer *     buffer;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetMemoryAndroidHardwareBufferANDROID(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkMemoryGetAndroidHardwareBufferInfoANDROID *>( &info ), &buffer ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getMemoryAndroidHardwareBufferANDROID\" );\n\n      return buffer;\n    }\n#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n    //=== VK_AMDX_shader_enqueue ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline>>::Type\n      Device::createExecutionGraphPipelinesAMDX(\n        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n        VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX> const &         createInfos,\n        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                              allocator ) const\n    {\n      std::vector<VULKAN_HPP_NAMESPACE::Pipeline> pipelines( createInfos.size() );\n      VULKAN_HPP_NAMESPACE::Result                result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateExecutionGraphPipelinesAMDX(\n        static_cast<VkDevice>( m_device ),\n        pipelineCache ? static_cast<VkPipelineCache>( **pipelineCache ) : 0,\n        createInfos.size(),\n        reinterpret_cast<const VkExecutionGraphPipelineCreateInfoAMDX *>( createInfos.data() ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n      if ( ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess ) && ( result != VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT ) )\n      {\n#    if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#    else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createExecutionGraphPipelinesAMDX\" );\n#    endif\n      }\n\n      std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline> pipelinesRAII;\n      pipelinesRAII.reserve( pipelines.size() );\n      for ( auto & pipeline : pipelines )\n      {\n        pipelinesRAII.emplace_back( *this, *reinterpret_cast<VkPipeline *>( &pipeline ), allocator, result );\n      }\n      return pipelinesRAII;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline>::Type\n      Device::createExecutionGraphPipelineAMDX(\n        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n        VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX const &                                           createInfo,\n        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::Pipeline pipeline;\n      VULKAN_HPP_NAMESPACE::Result   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateExecutionGraphPipelinesAMDX(\n        static_cast<VkDevice>( m_device ),\n        pipelineCache ? static_cast<VkPipelineCache>( **pipelineCache ) : 0,\n        1,\n        reinterpret_cast<const VkExecutionGraphPipelineCreateInfoAMDX *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkPipeline *>( &pipeline ) ) );\n      if ( ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess ) && ( result != VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT ) )\n      {\n#    if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#    else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createExecutionGraphPipelineAMDX\" );\n#    endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline( *this, *reinterpret_cast<VkPipeline *>( &pipeline ), allocator, result );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineScratchSizeAMDX Pipeline::getExecutionGraphScratchSizeAMDX() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetExecutionGraphPipelineScratchSizeAMDX &&\n                         \"Function <vkGetExecutionGraphPipelineScratchSizeAMDX> requires <VK_AMDX_shader_enqueue>\" );\n\n      VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineScratchSizeAMDX sizeInfo;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetExecutionGraphPipelineScratchSizeAMDX(\n        static_cast<VkDevice>( m_device ), static_cast<VkPipeline>( m_pipeline ), reinterpret_cast<VkExecutionGraphPipelineScratchSizeAMDX *>( &sizeInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Pipeline::getExecutionGraphScratchSizeAMDX\" );\n\n      return sizeInfo;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint32_t\n      Pipeline::getExecutionGraphNodeIndexAMDX( const VULKAN_HPP_NAMESPACE::PipelineShaderStageNodeCreateInfoAMDX & nodeInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetExecutionGraphPipelineNodeIndexAMDX &&\n                         \"Function <vkGetExecutionGraphPipelineNodeIndexAMDX> requires <VK_AMDX_shader_enqueue>\" );\n\n      uint32_t                     nodeIndex;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetExecutionGraphPipelineNodeIndexAMDX( static_cast<VkDevice>( m_device ),\n                                                                   static_cast<VkPipeline>( m_pipeline ),\n                                                                   reinterpret_cast<const VkPipelineShaderStageNodeCreateInfoAMDX *>( &nodeInfo ),\n                                                                   &nodeIndex ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Pipeline::getExecutionGraphNodeIndexAMDX\" );\n\n      return nodeIndex;\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::initializeGraphScratchMemoryAMDX( VULKAN_HPP_NAMESPACE::Pipeline      executionGraph,\n                                                                            VULKAN_HPP_NAMESPACE::DeviceAddress scratch,\n                                                                            VULKAN_HPP_NAMESPACE::DeviceSize    scratchSize ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdInitializeGraphScratchMemoryAMDX &&\n                         \"Function <vkCmdInitializeGraphScratchMemoryAMDX> requires <VK_AMDX_shader_enqueue>\" );\n\n      getDispatcher()->vkCmdInitializeGraphScratchMemoryAMDX( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                              static_cast<VkPipeline>( executionGraph ),\n                                                              static_cast<VkDeviceAddress>( scratch ),\n                                                              static_cast<VkDeviceSize>( scratchSize ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::dispatchGraphAMDX( VULKAN_HPP_NAMESPACE::DeviceAddress                      scratch,\n                                                             VULKAN_HPP_NAMESPACE::DeviceSize                         scratchSize,\n                                                             const VULKAN_HPP_NAMESPACE::DispatchGraphCountInfoAMDX & countInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDispatchGraphAMDX && \"Function <vkCmdDispatchGraphAMDX> requires <VK_AMDX_shader_enqueue>\" );\n\n      getDispatcher()->vkCmdDispatchGraphAMDX( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                               static_cast<VkDeviceAddress>( scratch ),\n                                               static_cast<VkDeviceSize>( scratchSize ),\n                                               reinterpret_cast<const VkDispatchGraphCountInfoAMDX *>( &countInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::dispatchGraphIndirectAMDX( VULKAN_HPP_NAMESPACE::DeviceAddress                      scratch,\n                                                VULKAN_HPP_NAMESPACE::DeviceSize                         scratchSize,\n                                                const VULKAN_HPP_NAMESPACE::DispatchGraphCountInfoAMDX & countInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDispatchGraphIndirectAMDX && \"Function <vkCmdDispatchGraphIndirectAMDX> requires <VK_AMDX_shader_enqueue>\" );\n\n      getDispatcher()->vkCmdDispatchGraphIndirectAMDX( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                       static_cast<VkDeviceAddress>( scratch ),\n                                                       static_cast<VkDeviceSize>( scratchSize ),\n                                                       reinterpret_cast<const VkDispatchGraphCountInfoAMDX *>( &countInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::dispatchGraphIndirectCountAMDX( VULKAN_HPP_NAMESPACE::DeviceAddress scratch,\n                                                                          VULKAN_HPP_NAMESPACE::DeviceSize    scratchSize,\n                                                                          VULKAN_HPP_NAMESPACE::DeviceAddress countInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDispatchGraphIndirectCountAMDX &&\n                         \"Function <vkCmdDispatchGraphIndirectCountAMDX> requires <VK_AMDX_shader_enqueue>\" );\n\n      getDispatcher()->vkCmdDispatchGraphIndirectCountAMDX( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                            static_cast<VkDeviceAddress>( scratch ),\n                                                            static_cast<VkDeviceSize>( scratchSize ),\n                                                            static_cast<VkDeviceAddress>( countInfo ) );\n    }\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n    //=== VK_EXT_sample_locations ===\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::setSampleLocationsEXT( const VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT & sampleLocationsInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetSampleLocationsEXT && \"Function <vkCmdSetSampleLocationsEXT> requires <VK_EXT_sample_locations>\" );\n\n      getDispatcher()->vkCmdSetSampleLocationsEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                   reinterpret_cast<const VkSampleLocationsInfoEXT *>( &sampleLocationsInfo ) );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MultisamplePropertiesEXT\n      PhysicalDevice::getMultisamplePropertiesEXT( VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceMultisamplePropertiesEXT &&\n                         \"Function <vkGetPhysicalDeviceMultisamplePropertiesEXT> requires <VK_EXT_sample_locations>\" );\n\n      VULKAN_HPP_NAMESPACE::MultisamplePropertiesEXT multisampleProperties;\n      getDispatcher()->vkGetPhysicalDeviceMultisamplePropertiesEXT( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                    static_cast<VkSampleCountFlagBits>( samples ),\n                                                                    reinterpret_cast<VkMultisamplePropertiesEXT *>( &multisampleProperties ) );\n\n      return multisampleProperties;\n    }\n\n    //=== VK_KHR_get_memory_requirements2 ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2\n      Device::getImageMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetImageMemoryRequirements2KHR &&\n                         \"Function <vkGetImageMemoryRequirements2KHR> requires <VK_KHR_get_memory_requirements2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;\n      getDispatcher()->vkGetImageMemoryRequirements2KHR( static_cast<VkDevice>( m_device ),\n                                                         reinterpret_cast<const VkImageMemoryRequirementsInfo2 *>( &info ),\n                                                         reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n      return memoryRequirements;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n      Device::getImageMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetImageMemoryRequirements2KHR &&\n                         \"Function <vkGetImageMemoryRequirements2KHR> requires <VK_KHR_get_memory_requirements2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2 &      memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();\n      getDispatcher()->vkGetImageMemoryRequirements2KHR( static_cast<VkDevice>( m_device ),\n                                                         reinterpret_cast<const VkImageMemoryRequirementsInfo2 *>( &info ),\n                                                         reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2\n      Device::getBufferMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetBufferMemoryRequirements2KHR &&\n                         \"Function <vkGetBufferMemoryRequirements2KHR> requires <VK_KHR_get_memory_requirements2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;\n      getDispatcher()->vkGetBufferMemoryRequirements2KHR( static_cast<VkDevice>( m_device ),\n                                                          reinterpret_cast<const VkBufferMemoryRequirementsInfo2 *>( &info ),\n                                                          reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n      return memoryRequirements;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n      Device::getBufferMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetBufferMemoryRequirements2KHR &&\n                         \"Function <vkGetBufferMemoryRequirements2KHR> requires <VK_KHR_get_memory_requirements2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2 &      memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();\n      getDispatcher()->vkGetBufferMemoryRequirements2KHR( static_cast<VkDevice>( m_device ),\n                                                          reinterpret_cast<const VkBufferMemoryRequirementsInfo2 *>( &info ),\n                                                          reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>\n      Device::getImageSparseMemoryRequirements2KHR( const VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 & info ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetImageSparseMemoryRequirements2KHR &&\n                         \"Function <vkGetImageSparseMemoryRequirements2KHR> requires <VK_KHR_get_memory_requirements2> or <VK_VERSION_1_1>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2> sparseMemoryRequirements;\n      uint32_t                                                          sparseMemoryRequirementCount;\n      getDispatcher()->vkGetImageSparseMemoryRequirements2KHR(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkImageSparseMemoryRequirementsInfo2 *>( &info ), &sparseMemoryRequirementCount, nullptr );\n      sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n      getDispatcher()->vkGetImageSparseMemoryRequirements2KHR( static_cast<VkDevice>( m_device ),\n                                                               reinterpret_cast<const VkImageSparseMemoryRequirementsInfo2 *>( &info ),\n                                                               &sparseMemoryRequirementCount,\n                                                               reinterpret_cast<VkSparseImageMemoryRequirements2 *>( sparseMemoryRequirements.data() ) );\n\n      VULKAN_HPP_ASSERT( sparseMemoryRequirementCount <= sparseMemoryRequirements.size() );\n      if ( sparseMemoryRequirementCount < sparseMemoryRequirements.size() )\n      {\n        sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n      }\n      return sparseMemoryRequirements;\n    }\n\n    //=== VK_KHR_acceleration_structure ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::AccelerationStructureKHR>::Type\n      Device::createAccelerationStructureKHR( VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoKHR const &                createInfo,\n                                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::AccelerationStructureKHR accelerationStructure;\n      VULKAN_HPP_NAMESPACE::Result                   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateAccelerationStructureKHR(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkAccelerationStructureCreateInfoKHR *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkAccelerationStructureKHR *>( &accelerationStructure ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createAccelerationStructureKHR\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::AccelerationStructureKHR(\n        *this, *reinterpret_cast<VkAccelerationStructureKHR *>( &accelerationStructure ), allocator );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::buildAccelerationStructuresKHR(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR> const &      infos,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR * const> const & pBuildRangeInfos ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBuildAccelerationStructuresKHR &&\n                         \"Function <vkCmdBuildAccelerationStructuresKHR> requires <VK_KHR_acceleration_structure>\" );\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( infos.size() == pBuildRangeInfos.size() );\n#  else\n      if ( infos.size() != pBuildRangeInfos.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::buildAccelerationStructuresKHR: infos.size() != pBuildRangeInfos.size()\" );\n      }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n      getDispatcher()->vkCmdBuildAccelerationStructuresKHR(\n        static_cast<VkCommandBuffer>( m_commandBuffer ),\n        infos.size(),\n        reinterpret_cast<const VkAccelerationStructureBuildGeometryInfoKHR *>( infos.data() ),\n        reinterpret_cast<const VkAccelerationStructureBuildRangeInfoKHR * const *>( pBuildRangeInfos.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::buildAccelerationStructuresIndirectKHR(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR> const & infos,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceAddress> const &                             indirectDeviceAddresses,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const uint32_t> const &                                                        indirectStrides,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const uint32_t * const> const &                                                pMaxPrimitiveCounts ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBuildAccelerationStructuresIndirectKHR &&\n                         \"Function <vkCmdBuildAccelerationStructuresIndirectKHR> requires <VK_KHR_acceleration_structure>\" );\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( infos.size() == indirectDeviceAddresses.size() );\n      VULKAN_HPP_ASSERT( infos.size() == indirectStrides.size() );\n      VULKAN_HPP_ASSERT( infos.size() == pMaxPrimitiveCounts.size() );\n#  else\n      if ( infos.size() != indirectDeviceAddresses.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING\n                          \"::CommandBuffer::buildAccelerationStructuresIndirectKHR: infos.size() != indirectDeviceAddresses.size()\" );\n      }\n      if ( infos.size() != indirectStrides.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::buildAccelerationStructuresIndirectKHR: infos.size() != indirectStrides.size()\" );\n      }\n      if ( infos.size() != pMaxPrimitiveCounts.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::buildAccelerationStructuresIndirectKHR: infos.size() != pMaxPrimitiveCounts.size()\" );\n      }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n      getDispatcher()->vkCmdBuildAccelerationStructuresIndirectKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                                    infos.size(),\n                                                                    reinterpret_cast<const VkAccelerationStructureBuildGeometryInfoKHR *>( infos.data() ),\n                                                                    reinterpret_cast<const VkDeviceAddress *>( indirectDeviceAddresses.data() ),\n                                                                    indirectStrides.data(),\n                                                                    pMaxPrimitiveCounts.data() );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result Device::buildAccelerationStructuresKHR(\n      VULKAN_HPP_NAMESPACE::DeferredOperationKHR                                                                           deferredOperation,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR> const &      infos,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR * const> const & pBuildRangeInfos ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkBuildAccelerationStructuresKHR &&\n                         \"Function <vkBuildAccelerationStructuresKHR> requires <VK_KHR_acceleration_structure>\" );\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( infos.size() == pBuildRangeInfos.size() );\n#  else\n      if ( infos.size() != pBuildRangeInfos.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::Device::buildAccelerationStructuresKHR: infos.size() != pBuildRangeInfos.size()\" );\n      }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkBuildAccelerationStructuresKHR(\n        static_cast<VkDevice>( m_device ),\n        static_cast<VkDeferredOperationKHR>( deferredOperation ),\n        infos.size(),\n        reinterpret_cast<const VkAccelerationStructureBuildGeometryInfoKHR *>( infos.data() ),\n        reinterpret_cast<const VkAccelerationStructureBuildRangeInfoKHR * const *>( pBuildRangeInfos.data() ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                                 VULKAN_HPP_NAMESPACE_STRING \"::Device::buildAccelerationStructuresKHR\",\n                                                 { VULKAN_HPP_NAMESPACE::Result::eSuccess,\n                                                   VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR,\n                                                   VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR } );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result\n                                           Device::copyAccelerationStructureKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                     deferredOperation,\n                                            const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR & info ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCopyAccelerationStructureKHR &&\n                         \"Function <vkCopyAccelerationStructureKHR> requires <VK_KHR_acceleration_structure>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkCopyAccelerationStructureKHR( static_cast<VkDevice>( m_device ),\n                                                         static_cast<VkDeferredOperationKHR>( deferredOperation ),\n                                                         reinterpret_cast<const VkCopyAccelerationStructureInfoKHR *>( &info ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                                 VULKAN_HPP_NAMESPACE_STRING \"::Device::copyAccelerationStructureKHR\",\n                                                 { VULKAN_HPP_NAMESPACE::Result::eSuccess,\n                                                   VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR,\n                                                   VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR } );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result\n                                           Device::copyAccelerationStructureToMemoryKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                             deferredOperation,\n                                                    const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureToMemoryInfoKHR & info ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCopyAccelerationStructureToMemoryKHR &&\n                         \"Function <vkCopyAccelerationStructureToMemoryKHR> requires <VK_KHR_acceleration_structure>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkCopyAccelerationStructureToMemoryKHR( static_cast<VkDevice>( m_device ),\n                                                                 static_cast<VkDeferredOperationKHR>( deferredOperation ),\n                                                                 reinterpret_cast<const VkCopyAccelerationStructureToMemoryInfoKHR *>( &info ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                                 VULKAN_HPP_NAMESPACE_STRING \"::Device::copyAccelerationStructureToMemoryKHR\",\n                                                 { VULKAN_HPP_NAMESPACE::Result::eSuccess,\n                                                   VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR,\n                                                   VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR } );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result\n                                           Device::copyMemoryToAccelerationStructureKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                             deferredOperation,\n                                                    const VULKAN_HPP_NAMESPACE::CopyMemoryToAccelerationStructureInfoKHR & info ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCopyMemoryToAccelerationStructureKHR &&\n                         \"Function <vkCopyMemoryToAccelerationStructureKHR> requires <VK_KHR_acceleration_structure>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkCopyMemoryToAccelerationStructureKHR( static_cast<VkDevice>( m_device ),\n                                                                 static_cast<VkDeferredOperationKHR>( deferredOperation ),\n                                                                 reinterpret_cast<const VkCopyMemoryToAccelerationStructureInfoKHR *>( &info ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                                 VULKAN_HPP_NAMESPACE_STRING \"::Device::copyMemoryToAccelerationStructureKHR\",\n                                                 { VULKAN_HPP_NAMESPACE::Result::eSuccess,\n                                                   VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR,\n                                                   VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR } );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<DataType> Device::writeAccelerationStructuresPropertiesKHR(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR> const & accelerationStructures,\n      VULKAN_HPP_NAMESPACE::QueryType                                                                queryType,\n      size_t                                                                                         dataSize,\n      size_t                                                                                         stride ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkWriteAccelerationStructuresPropertiesKHR &&\n                         \"Function <vkWriteAccelerationStructuresPropertiesKHR> requires <VK_KHR_acceleration_structure>\" );\n\n      VULKAN_HPP_ASSERT( dataSize % sizeof( DataType ) == 0 );\n      std::vector<DataType>        data( dataSize / sizeof( DataType ) );\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkWriteAccelerationStructuresPropertiesKHR( static_cast<VkDevice>( m_device ),\n                                                                     accelerationStructures.size(),\n                                                                     reinterpret_cast<const VkAccelerationStructureKHR *>( accelerationStructures.data() ),\n                                                                     static_cast<VkQueryType>( queryType ),\n                                                                     data.size() * sizeof( DataType ),\n                                                                     reinterpret_cast<void *>( data.data() ),\n                                                                     stride ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::writeAccelerationStructuresPropertiesKHR\" );\n\n      return data;\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE DataType Device::writeAccelerationStructuresPropertyKHR(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR> const & accelerationStructures,\n      VULKAN_HPP_NAMESPACE::QueryType                                                                queryType,\n      size_t                                                                                         stride ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkWriteAccelerationStructuresPropertiesKHR &&\n                         \"Function <vkWriteAccelerationStructuresPropertiesKHR> requires <VK_KHR_acceleration_structure>\" );\n\n      DataType                     data;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkWriteAccelerationStructuresPropertiesKHR( static_cast<VkDevice>( m_device ),\n                                                                     accelerationStructures.size(),\n                                                                     reinterpret_cast<const VkAccelerationStructureKHR *>( accelerationStructures.data() ),\n                                                                     static_cast<VkQueryType>( queryType ),\n                                                                     sizeof( DataType ),\n                                                                     reinterpret_cast<void *>( &data ),\n                                                                     stride ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::writeAccelerationStructuresPropertyKHR\" );\n\n      return data;\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::copyAccelerationStructureKHR( const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCopyAccelerationStructureKHR &&\n                         \"Function <vkCmdCopyAccelerationStructureKHR> requires <VK_KHR_acceleration_structure>\" );\n\n      getDispatcher()->vkCmdCopyAccelerationStructureKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                          reinterpret_cast<const VkCopyAccelerationStructureInfoKHR *>( &info ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::copyAccelerationStructureToMemoryKHR(\n      const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureToMemoryInfoKHR & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCopyAccelerationStructureToMemoryKHR &&\n                         \"Function <vkCmdCopyAccelerationStructureToMemoryKHR> requires <VK_KHR_acceleration_structure>\" );\n\n      getDispatcher()->vkCmdCopyAccelerationStructureToMemoryKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                                  reinterpret_cast<const VkCopyAccelerationStructureToMemoryInfoKHR *>( &info ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::copyMemoryToAccelerationStructureKHR(\n      const VULKAN_HPP_NAMESPACE::CopyMemoryToAccelerationStructureInfoKHR & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCopyMemoryToAccelerationStructureKHR &&\n                         \"Function <vkCmdCopyMemoryToAccelerationStructureKHR> requires <VK_KHR_acceleration_structure>\" );\n\n      getDispatcher()->vkCmdCopyMemoryToAccelerationStructureKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                                  reinterpret_cast<const VkCopyMemoryToAccelerationStructureInfoKHR *>( &info ) );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceAddress\n      Device::getAccelerationStructureAddressKHR( const VULKAN_HPP_NAMESPACE::AccelerationStructureDeviceAddressInfoKHR & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetAccelerationStructureDeviceAddressKHR &&\n                         \"Function <vkGetAccelerationStructureDeviceAddressKHR> requires <VK_KHR_acceleration_structure>\" );\n\n      VkDeviceAddress result = getDispatcher()->vkGetAccelerationStructureDeviceAddressKHR(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkAccelerationStructureDeviceAddressInfoKHR *>( &info ) );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::DeviceAddress>( result );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::writeAccelerationStructuresPropertiesKHR(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR> const & accelerationStructures,\n      VULKAN_HPP_NAMESPACE::QueryType                                                                queryType,\n      VULKAN_HPP_NAMESPACE::QueryPool                                                                queryPool,\n      uint32_t                                                                                       firstQuery ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdWriteAccelerationStructuresPropertiesKHR &&\n                         \"Function <vkCmdWriteAccelerationStructuresPropertiesKHR> requires <VK_KHR_acceleration_structure>\" );\n\n      getDispatcher()->vkCmdWriteAccelerationStructuresPropertiesKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                                      accelerationStructures.size(),\n                                                                      reinterpret_cast<const VkAccelerationStructureKHR *>( accelerationStructures.data() ),\n                                                                      static_cast<VkQueryType>( queryType ),\n                                                                      static_cast<VkQueryPool>( queryPool ),\n                                                                      firstQuery );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::AccelerationStructureCompatibilityKHR Device::getAccelerationStructureCompatibilityKHR(\n      const VULKAN_HPP_NAMESPACE::AccelerationStructureVersionInfoKHR & versionInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceAccelerationStructureCompatibilityKHR &&\n                         \"Function <vkGetDeviceAccelerationStructureCompatibilityKHR> requires <VK_KHR_acceleration_structure>\" );\n\n      VULKAN_HPP_NAMESPACE::AccelerationStructureCompatibilityKHR compatibility;\n      getDispatcher()->vkGetDeviceAccelerationStructureCompatibilityKHR( static_cast<VkDevice>( m_device ),\n                                                                         reinterpret_cast<const VkAccelerationStructureVersionInfoKHR *>( &versionInfo ),\n                                                                         reinterpret_cast<VkAccelerationStructureCompatibilityKHR *>( &compatibility ) );\n\n      return compatibility;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR\n                                           Device::getAccelerationStructureBuildSizesKHR( VULKAN_HPP_NAMESPACE::AccelerationStructureBuildTypeKHR                 buildType,\n                                                     const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR & buildInfo,\n                                                     VULKAN_HPP_NAMESPACE::ArrayProxy<const uint32_t> const &                maxPrimitiveCounts ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetAccelerationStructureBuildSizesKHR &&\n                         \"Function <vkGetAccelerationStructureBuildSizesKHR> requires <VK_KHR_acceleration_structure>\" );\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( maxPrimitiveCounts.size() == buildInfo.geometryCount );\n#  else\n      if ( maxPrimitiveCounts.size() != buildInfo.geometryCount )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::Device::getAccelerationStructureBuildSizesKHR: maxPrimitiveCounts.size() != buildInfo.geometryCount\" );\n      }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n      VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR sizeInfo;\n      getDispatcher()->vkGetAccelerationStructureBuildSizesKHR( static_cast<VkDevice>( m_device ),\n                                                                static_cast<VkAccelerationStructureBuildTypeKHR>( buildType ),\n                                                                reinterpret_cast<const VkAccelerationStructureBuildGeometryInfoKHR *>( &buildInfo ),\n                                                                maxPrimitiveCounts.data(),\n                                                                reinterpret_cast<VkAccelerationStructureBuildSizesInfoKHR *>( &sizeInfo ) );\n\n      return sizeInfo;\n    }\n\n    //=== VK_KHR_ray_tracing_pipeline ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::traceRaysKHR( const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & raygenShaderBindingTable,\n                                                        const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & missShaderBindingTable,\n                                                        const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & hitShaderBindingTable,\n                                                        const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & callableShaderBindingTable,\n                                                        uint32_t                                                    width,\n                                                        uint32_t                                                    height,\n                                                        uint32_t                                                    depth ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdTraceRaysKHR && \"Function <vkCmdTraceRaysKHR> requires <VK_KHR_ray_tracing_pipeline>\" );\n\n      getDispatcher()->vkCmdTraceRaysKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                          reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( &raygenShaderBindingTable ),\n                                          reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( &missShaderBindingTable ),\n                                          reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( &hitShaderBindingTable ),\n                                          reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( &callableShaderBindingTable ),\n                                          width,\n                                          height,\n                                          depth );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline>>::Type\n      Device::createRayTracingPipelinesKHR(\n        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeferredOperationKHR> const & deferredOperation,\n        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &        pipelineCache,\n        VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR> const &                     createInfos,\n        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                                     allocator ) const\n    {\n      std::vector<VULKAN_HPP_NAMESPACE::Pipeline> pipelines( createInfos.size() );\n      VULKAN_HPP_NAMESPACE::Result                result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateRayTracingPipelinesKHR(\n        static_cast<VkDevice>( m_device ),\n        deferredOperation ? static_cast<VkDeferredOperationKHR>( **deferredOperation ) : 0,\n        pipelineCache ? static_cast<VkPipelineCache>( **pipelineCache ) : 0,\n        createInfos.size(),\n        reinterpret_cast<const VkRayTracingPipelineCreateInfoKHR *>( createInfos.data() ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n      if ( ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess ) && ( result != VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR ) &&\n           ( result != VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR ) && ( result != VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT ) )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createRayTracingPipelinesKHR\" );\n#  endif\n      }\n\n      std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline> pipelinesRAII;\n      pipelinesRAII.reserve( pipelines.size() );\n      for ( auto & pipeline : pipelines )\n      {\n        pipelinesRAII.emplace_back( *this, *reinterpret_cast<VkPipeline *>( &pipeline ), allocator, result );\n      }\n      return pipelinesRAII;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline>::Type\n      Device::createRayTracingPipelineKHR(\n        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeferredOperationKHR> const & deferredOperation,\n        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &        pipelineCache,\n        VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR const &                                                       createInfo,\n        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::Pipeline pipeline;\n      VULKAN_HPP_NAMESPACE::Result   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateRayTracingPipelinesKHR(\n        static_cast<VkDevice>( m_device ),\n        deferredOperation ? static_cast<VkDeferredOperationKHR>( **deferredOperation ) : 0,\n        pipelineCache ? static_cast<VkPipelineCache>( **pipelineCache ) : 0,\n        1,\n        reinterpret_cast<const VkRayTracingPipelineCreateInfoKHR *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkPipeline *>( &pipeline ) ) );\n      if ( ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess ) && ( result != VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR ) &&\n           ( result != VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR ) && ( result != VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT ) )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createRayTracingPipelineKHR\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline( *this, *reinterpret_cast<VkPipeline *>( &pipeline ), allocator, result );\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<DataType>\n                                           Pipeline::getRayTracingShaderGroupHandlesKHR( uint32_t firstGroup, uint32_t groupCount, size_t dataSize ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetRayTracingShaderGroupHandlesKHR &&\n                         \"Function <vkGetRayTracingShaderGroupHandlesKHR> requires <VK_KHR_ray_tracing_pipeline> or <VK_NV_ray_tracing>\" );\n\n      VULKAN_HPP_ASSERT( dataSize % sizeof( DataType ) == 0 );\n      std::vector<DataType>        data( dataSize / sizeof( DataType ) );\n      VULKAN_HPP_NAMESPACE::Result result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetRayTracingShaderGroupHandlesKHR( static_cast<VkDevice>( m_device ),\n                                                                                                          static_cast<VkPipeline>( m_pipeline ),\n                                                                                                          firstGroup,\n                                                                                                          groupCount,\n                                                                                                          data.size() * sizeof( DataType ),\n                                                                                                          reinterpret_cast<void *>( data.data() ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Pipeline::getRayTracingShaderGroupHandlesKHR\" );\n\n      return data;\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE DataType Pipeline::getRayTracingShaderGroupHandleKHR( uint32_t firstGroup, uint32_t groupCount ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetRayTracingShaderGroupHandlesKHR &&\n                         \"Function <vkGetRayTracingShaderGroupHandlesKHR> requires <VK_KHR_ray_tracing_pipeline> or <VK_NV_ray_tracing>\" );\n\n      DataType                     data;\n      VULKAN_HPP_NAMESPACE::Result result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetRayTracingShaderGroupHandlesKHR( static_cast<VkDevice>( m_device ),\n                                                                                                          static_cast<VkPipeline>( m_pipeline ),\n                                                                                                          firstGroup,\n                                                                                                          groupCount,\n                                                                                                          sizeof( DataType ),\n                                                                                                          reinterpret_cast<void *>( &data ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Pipeline::getRayTracingShaderGroupHandleKHR\" );\n\n      return data;\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<DataType>\n      Pipeline::getRayTracingCaptureReplayShaderGroupHandlesKHR( uint32_t firstGroup, uint32_t groupCount, size_t dataSize ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetRayTracingCaptureReplayShaderGroupHandlesKHR &&\n                         \"Function <vkGetRayTracingCaptureReplayShaderGroupHandlesKHR> requires <VK_KHR_ray_tracing_pipeline>\" );\n\n      VULKAN_HPP_ASSERT( dataSize % sizeof( DataType ) == 0 );\n      std::vector<DataType>        data( dataSize / sizeof( DataType ) );\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetRayTracingCaptureReplayShaderGroupHandlesKHR( static_cast<VkDevice>( m_device ),\n                                                                            static_cast<VkPipeline>( m_pipeline ),\n                                                                            firstGroup,\n                                                                            groupCount,\n                                                                            data.size() * sizeof( DataType ),\n                                                                            reinterpret_cast<void *>( data.data() ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Pipeline::getRayTracingCaptureReplayShaderGroupHandlesKHR\" );\n\n      return data;\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE DataType Pipeline::getRayTracingCaptureReplayShaderGroupHandleKHR( uint32_t firstGroup, uint32_t groupCount ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetRayTracingCaptureReplayShaderGroupHandlesKHR &&\n                         \"Function <vkGetRayTracingCaptureReplayShaderGroupHandlesKHR> requires <VK_KHR_ray_tracing_pipeline>\" );\n\n      DataType                     data;\n      VULKAN_HPP_NAMESPACE::Result result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetRayTracingCaptureReplayShaderGroupHandlesKHR( static_cast<VkDevice>( m_device ),\n                                                                                                                       static_cast<VkPipeline>( m_pipeline ),\n                                                                                                                       firstGroup,\n                                                                                                                       groupCount,\n                                                                                                                       sizeof( DataType ),\n                                                                                                                       reinterpret_cast<void *>( &data ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Pipeline::getRayTracingCaptureReplayShaderGroupHandleKHR\" );\n\n      return data;\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::traceRaysIndirectKHR( const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & raygenShaderBindingTable,\n                                                                const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & missShaderBindingTable,\n                                                                const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & hitShaderBindingTable,\n                                                                const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR & callableShaderBindingTable,\n                                                                VULKAN_HPP_NAMESPACE::DeviceAddress indirectDeviceAddress ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdTraceRaysIndirectKHR && \"Function <vkCmdTraceRaysIndirectKHR> requires <VK_KHR_ray_tracing_pipeline>\" );\n\n      getDispatcher()->vkCmdTraceRaysIndirectKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                  reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( &raygenShaderBindingTable ),\n                                                  reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( &missShaderBindingTable ),\n                                                  reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( &hitShaderBindingTable ),\n                                                  reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( &callableShaderBindingTable ),\n                                                  static_cast<VkDeviceAddress>( indirectDeviceAddress ) );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceSize\n      Pipeline::getRayTracingShaderGroupStackSizeKHR( uint32_t group, VULKAN_HPP_NAMESPACE::ShaderGroupShaderKHR groupShader ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetRayTracingShaderGroupStackSizeKHR &&\n                         \"Function <vkGetRayTracingShaderGroupStackSizeKHR> requires <VK_KHR_ray_tracing_pipeline>\" );\n\n      VkDeviceSize result = getDispatcher()->vkGetRayTracingShaderGroupStackSizeKHR(\n        static_cast<VkDevice>( m_device ), static_cast<VkPipeline>( m_pipeline ), group, static_cast<VkShaderGroupShaderKHR>( groupShader ) );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::DeviceSize>( result );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setRayTracingPipelineStackSizeKHR( uint32_t pipelineStackSize ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetRayTracingPipelineStackSizeKHR &&\n                         \"Function <vkCmdSetRayTracingPipelineStackSizeKHR> requires <VK_KHR_ray_tracing_pipeline>\" );\n\n      getDispatcher()->vkCmdSetRayTracingPipelineStackSizeKHR( static_cast<VkCommandBuffer>( m_commandBuffer ), pipelineStackSize );\n    }\n\n    //=== VK_KHR_sampler_ycbcr_conversion ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SamplerYcbcrConversion>::Type\n      Device::createSamplerYcbcrConversionKHR( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo const &                  createInfo,\n                                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion ycbcrConversion;\n      VULKAN_HPP_NAMESPACE::Result                 result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateSamplerYcbcrConversionKHR(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkSamplerYcbcrConversionCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkSamplerYcbcrConversion *>( &ycbcrConversion ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createSamplerYcbcrConversionKHR\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SamplerYcbcrConversion(\n        *this, *reinterpret_cast<VkSamplerYcbcrConversion *>( &ycbcrConversion ), allocator );\n    }\n\n    VULKAN_HPP_INLINE void\n      Device::destroySamplerYcbcrConversionKHR( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion              ycbcrConversion,\n                                                Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkDestroySamplerYcbcrConversionKHR &&\n                         \"Function <vkDestroySamplerYcbcrConversionKHR> requires <VK_KHR_sampler_ycbcr_conversion> or <VK_VERSION_1_1>\" );\n\n      getDispatcher()->vkDestroySamplerYcbcrConversionKHR(\n        static_cast<VkDevice>( m_device ),\n        static_cast<VkSamplerYcbcrConversion>( ycbcrConversion ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n    }\n\n    //=== VK_KHR_bind_memory2 ===\n\n    VULKAN_HPP_INLINE void\n      Device::bindBufferMemory2KHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo> const & bindInfos ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkBindBufferMemory2KHR && \"Function <vkBindBufferMemory2KHR> requires <VK_KHR_bind_memory2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkBindBufferMemory2KHR(\n        static_cast<VkDevice>( m_device ), bindInfos.size(), reinterpret_cast<const VkBindBufferMemoryInfo *>( bindInfos.data() ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::bindBufferMemory2KHR\" );\n    }\n\n    VULKAN_HPP_INLINE void\n      Device::bindImageMemory2KHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindImageMemoryInfo> const & bindInfos ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkBindImageMemory2KHR && \"Function <vkBindImageMemory2KHR> requires <VK_KHR_bind_memory2> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkBindImageMemory2KHR(\n        static_cast<VkDevice>( m_device ), bindInfos.size(), reinterpret_cast<const VkBindImageMemoryInfo *>( bindInfos.data() ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::bindImageMemory2KHR\" );\n    }\n\n    //=== VK_EXT_image_drm_format_modifier ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierPropertiesEXT Image::getDrmFormatModifierPropertiesEXT() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetImageDrmFormatModifierPropertiesEXT &&\n                         \"Function <vkGetImageDrmFormatModifierPropertiesEXT> requires <VK_EXT_image_drm_format_modifier>\" );\n\n      VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierPropertiesEXT properties;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetImageDrmFormatModifierPropertiesEXT(\n        static_cast<VkDevice>( m_device ), static_cast<VkImage>( m_image ), reinterpret_cast<VkImageDrmFormatModifierPropertiesEXT *>( &properties ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Image::getDrmFormatModifierPropertiesEXT\" );\n\n      return properties;\n    }\n\n    //=== VK_EXT_validation_cache ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ValidationCacheEXT>::Type\n      Device::createValidationCacheEXT( VULKAN_HPP_NAMESPACE::ValidationCacheCreateInfoEXT const &                      createInfo,\n                                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::ValidationCacheEXT validationCache;\n      VULKAN_HPP_NAMESPACE::Result             result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateValidationCacheEXT(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkValidationCacheCreateInfoEXT *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkValidationCacheEXT *>( &validationCache ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createValidationCacheEXT\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ValidationCacheEXT(\n        *this, *reinterpret_cast<VkValidationCacheEXT *>( &validationCache ), allocator );\n    }\n\n    VULKAN_HPP_INLINE void ValidationCacheEXT::merge( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ValidationCacheEXT> const & srcCaches ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkMergeValidationCachesEXT && \"Function <vkMergeValidationCachesEXT> requires <VK_EXT_validation_cache>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkMergeValidationCachesEXT( static_cast<VkDevice>( m_device ),\n                                                     static_cast<VkValidationCacheEXT>( m_validationCache ),\n                                                     srcCaches.size(),\n                                                     reinterpret_cast<const VkValidationCacheEXT *>( srcCaches.data() ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::ValidationCacheEXT::merge\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<uint8_t> ValidationCacheEXT::getData() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetValidationCacheDataEXT && \"Function <vkGetValidationCacheDataEXT> requires <VK_EXT_validation_cache>\" );\n\n      std::vector<uint8_t>         data;\n      size_t                       dataSize;\n      VULKAN_HPP_NAMESPACE::Result result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetValidationCacheDataEXT(\n          static_cast<VkDevice>( m_device ), static_cast<VkValidationCacheEXT>( m_validationCache ), &dataSize, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && dataSize )\n        {\n          data.resize( dataSize );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetValidationCacheDataEXT(\n            static_cast<VkDevice>( m_device ), static_cast<VkValidationCacheEXT>( m_validationCache ), &dataSize, reinterpret_cast<void *>( data.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::ValidationCacheEXT::getData\" );\n      VULKAN_HPP_ASSERT( dataSize <= data.size() );\n      if ( dataSize < data.size() )\n      {\n        data.resize( dataSize );\n      }\n      return data;\n    }\n\n    //=== VK_NV_shading_rate_image ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::bindShadingRateImageNV( VULKAN_HPP_NAMESPACE::ImageView   imageView,\n                                                                  VULKAN_HPP_NAMESPACE::ImageLayout imageLayout ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBindShadingRateImageNV && \"Function <vkCmdBindShadingRateImageNV> requires <VK_NV_shading_rate_image>\" );\n\n      getDispatcher()->vkCmdBindShadingRateImageNV(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkImageView>( imageView ), static_cast<VkImageLayout>( imageLayout ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setViewportShadingRatePaletteNV(\n      uint32_t                                                                                   firstViewport,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV> const & shadingRatePalettes ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetViewportShadingRatePaletteNV &&\n                         \"Function <vkCmdSetViewportShadingRatePaletteNV> requires <VK_NV_shading_rate_image>\" );\n\n      getDispatcher()->vkCmdSetViewportShadingRatePaletteNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                             firstViewport,\n                                                             shadingRatePalettes.size(),\n                                                             reinterpret_cast<const VkShadingRatePaletteNV *>( shadingRatePalettes.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setCoarseSampleOrderNV(\n      VULKAN_HPP_NAMESPACE::CoarseSampleOrderTypeNV                                                   sampleOrderType,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV> const & customSampleOrders ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetCoarseSampleOrderNV && \"Function <vkCmdSetCoarseSampleOrderNV> requires <VK_NV_shading_rate_image>\" );\n\n      getDispatcher()->vkCmdSetCoarseSampleOrderNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                    static_cast<VkCoarseSampleOrderTypeNV>( sampleOrderType ),\n                                                    customSampleOrders.size(),\n                                                    reinterpret_cast<const VkCoarseSampleOrderCustomNV *>( customSampleOrders.data() ) );\n    }\n\n    //=== VK_NV_ray_tracing ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::AccelerationStructureNV>::Type\n      Device::createAccelerationStructureNV( VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoNV const &                 createInfo,\n                                             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::AccelerationStructureNV accelerationStructure;\n      VULKAN_HPP_NAMESPACE::Result                  result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateAccelerationStructureNV(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkAccelerationStructureCreateInfoNV *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkAccelerationStructureNV *>( &accelerationStructure ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createAccelerationStructureNV\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::AccelerationStructureNV(\n        *this, *reinterpret_cast<VkAccelerationStructureNV *>( &accelerationStructure ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2KHR Device::getAccelerationStructureMemoryRequirementsNV(\n      const VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsInfoNV & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetAccelerationStructureMemoryRequirementsNV &&\n                         \"Function <vkGetAccelerationStructureMemoryRequirementsNV> requires <VK_NV_ray_tracing>\" );\n\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2KHR memoryRequirements;\n      getDispatcher()->vkGetAccelerationStructureMemoryRequirementsNV( static_cast<VkDevice>( m_device ),\n                                                                       reinterpret_cast<const VkAccelerationStructureMemoryRequirementsInfoNV *>( &info ),\n                                                                       reinterpret_cast<VkMemoryRequirements2KHR *>( &memoryRequirements ) );\n\n      return memoryRequirements;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> Device::getAccelerationStructureMemoryRequirementsNV(\n      const VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsInfoNV & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetAccelerationStructureMemoryRequirementsNV &&\n                         \"Function <vkGetAccelerationStructureMemoryRequirementsNV> requires <VK_NV_ray_tracing>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2KHR &   memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2KHR>();\n      getDispatcher()->vkGetAccelerationStructureMemoryRequirementsNV( static_cast<VkDevice>( m_device ),\n                                                                       reinterpret_cast<const VkAccelerationStructureMemoryRequirementsInfoNV *>( &info ),\n                                                                       reinterpret_cast<VkMemoryRequirements2KHR *>( &memoryRequirements ) );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_INLINE void Device::bindAccelerationStructureMemoryNV(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::BindAccelerationStructureMemoryInfoNV> const & bindInfos ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkBindAccelerationStructureMemoryNV &&\n                         \"Function <vkBindAccelerationStructureMemoryNV> requires <VK_NV_ray_tracing>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkBindAccelerationStructureMemoryNV(\n        static_cast<VkDevice>( m_device ), bindInfos.size(), reinterpret_cast<const VkBindAccelerationStructureMemoryInfoNV *>( bindInfos.data() ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::bindAccelerationStructureMemoryNV\" );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::buildAccelerationStructureNV( const VULKAN_HPP_NAMESPACE::AccelerationStructureInfoNV & info,\n                                                                        VULKAN_HPP_NAMESPACE::Buffer                              instanceData,\n                                                                        VULKAN_HPP_NAMESPACE::DeviceSize                          instanceOffset,\n                                                                        VULKAN_HPP_NAMESPACE::Bool32                              update,\n                                                                        VULKAN_HPP_NAMESPACE::AccelerationStructureNV             dst,\n                                                                        VULKAN_HPP_NAMESPACE::AccelerationStructureNV             src,\n                                                                        VULKAN_HPP_NAMESPACE::Buffer                              scratch,\n                                                                        VULKAN_HPP_NAMESPACE::DeviceSize scratchOffset ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBuildAccelerationStructureNV && \"Function <vkCmdBuildAccelerationStructureNV> requires <VK_NV_ray_tracing>\" );\n\n      getDispatcher()->vkCmdBuildAccelerationStructureNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                          reinterpret_cast<const VkAccelerationStructureInfoNV *>( &info ),\n                                                          static_cast<VkBuffer>( instanceData ),\n                                                          static_cast<VkDeviceSize>( instanceOffset ),\n                                                          static_cast<VkBool32>( update ),\n                                                          static_cast<VkAccelerationStructureNV>( dst ),\n                                                          static_cast<VkAccelerationStructureNV>( src ),\n                                                          static_cast<VkBuffer>( scratch ),\n                                                          static_cast<VkDeviceSize>( scratchOffset ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::copyAccelerationStructureNV( VULKAN_HPP_NAMESPACE::AccelerationStructureNV          dst,\n                                                                       VULKAN_HPP_NAMESPACE::AccelerationStructureNV          src,\n                                                                       VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR mode ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCopyAccelerationStructureNV && \"Function <vkCmdCopyAccelerationStructureNV> requires <VK_NV_ray_tracing>\" );\n\n      getDispatcher()->vkCmdCopyAccelerationStructureNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                         static_cast<VkAccelerationStructureNV>( dst ),\n                                                         static_cast<VkAccelerationStructureNV>( src ),\n                                                         static_cast<VkCopyAccelerationStructureModeKHR>( mode ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::traceRaysNV( VULKAN_HPP_NAMESPACE::Buffer     raygenShaderBindingTableBuffer,\n                                                       VULKAN_HPP_NAMESPACE::DeviceSize raygenShaderBindingOffset,\n                                                       VULKAN_HPP_NAMESPACE::Buffer     missShaderBindingTableBuffer,\n                                                       VULKAN_HPP_NAMESPACE::DeviceSize missShaderBindingOffset,\n                                                       VULKAN_HPP_NAMESPACE::DeviceSize missShaderBindingStride,\n                                                       VULKAN_HPP_NAMESPACE::Buffer     hitShaderBindingTableBuffer,\n                                                       VULKAN_HPP_NAMESPACE::DeviceSize hitShaderBindingOffset,\n                                                       VULKAN_HPP_NAMESPACE::DeviceSize hitShaderBindingStride,\n                                                       VULKAN_HPP_NAMESPACE::Buffer     callableShaderBindingTableBuffer,\n                                                       VULKAN_HPP_NAMESPACE::DeviceSize callableShaderBindingOffset,\n                                                       VULKAN_HPP_NAMESPACE::DeviceSize callableShaderBindingStride,\n                                                       uint32_t                         width,\n                                                       uint32_t                         height,\n                                                       uint32_t                         depth ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdTraceRaysNV && \"Function <vkCmdTraceRaysNV> requires <VK_NV_ray_tracing>\" );\n\n      getDispatcher()->vkCmdTraceRaysNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                         static_cast<VkBuffer>( raygenShaderBindingTableBuffer ),\n                                         static_cast<VkDeviceSize>( raygenShaderBindingOffset ),\n                                         static_cast<VkBuffer>( missShaderBindingTableBuffer ),\n                                         static_cast<VkDeviceSize>( missShaderBindingOffset ),\n                                         static_cast<VkDeviceSize>( missShaderBindingStride ),\n                                         static_cast<VkBuffer>( hitShaderBindingTableBuffer ),\n                                         static_cast<VkDeviceSize>( hitShaderBindingOffset ),\n                                         static_cast<VkDeviceSize>( hitShaderBindingStride ),\n                                         static_cast<VkBuffer>( callableShaderBindingTableBuffer ),\n                                         static_cast<VkDeviceSize>( callableShaderBindingOffset ),\n                                         static_cast<VkDeviceSize>( callableShaderBindingStride ),\n                                         width,\n                                         height,\n                                         depth );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline>>::Type\n      Device::createRayTracingPipelinesNV(\n        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n        VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV> const &               createInfos,\n        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>                              allocator ) const\n    {\n      std::vector<VULKAN_HPP_NAMESPACE::Pipeline> pipelines( createInfos.size() );\n      VULKAN_HPP_NAMESPACE::Result                result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateRayTracingPipelinesNV(\n        static_cast<VkDevice>( m_device ),\n        pipelineCache ? static_cast<VkPipelineCache>( **pipelineCache ) : 0,\n        createInfos.size(),\n        reinterpret_cast<const VkRayTracingPipelineCreateInfoNV *>( createInfos.data() ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkPipeline *>( pipelines.data() ) ) );\n      if ( ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess ) && ( result != VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT ) )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createRayTracingPipelinesNV\" );\n#  endif\n      }\n\n      std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline> pipelinesRAII;\n      pipelinesRAII.reserve( pipelines.size() );\n      for ( auto & pipeline : pipelines )\n      {\n        pipelinesRAII.emplace_back( *this, *reinterpret_cast<VkPipeline *>( &pipeline ), allocator, result );\n      }\n      return pipelinesRAII;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline>::Type\n      Device::createRayTracingPipelineNV(\n        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const & pipelineCache,\n        VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV const &                                                 createInfo,\n        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::Pipeline pipeline;\n      VULKAN_HPP_NAMESPACE::Result   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateRayTracingPipelinesNV(\n        static_cast<VkDevice>( m_device ),\n        pipelineCache ? static_cast<VkPipelineCache>( **pipelineCache ) : 0,\n        1,\n        reinterpret_cast<const VkRayTracingPipelineCreateInfoNV *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkPipeline *>( &pipeline ) ) );\n      if ( ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess ) && ( result != VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT ) )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createRayTracingPipelineNV\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline( *this, *reinterpret_cast<VkPipeline *>( &pipeline ), allocator, result );\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<DataType>\n                                           Pipeline::getRayTracingShaderGroupHandlesNV( uint32_t firstGroup, uint32_t groupCount, size_t dataSize ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetRayTracingShaderGroupHandlesNV &&\n                         \"Function <vkGetRayTracingShaderGroupHandlesNV> requires <VK_KHR_ray_tracing_pipeline> or <VK_NV_ray_tracing>\" );\n\n      VULKAN_HPP_ASSERT( dataSize % sizeof( DataType ) == 0 );\n      std::vector<DataType>        data( dataSize / sizeof( DataType ) );\n      VULKAN_HPP_NAMESPACE::Result result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetRayTracingShaderGroupHandlesNV( static_cast<VkDevice>( m_device ),\n                                                                                                         static_cast<VkPipeline>( m_pipeline ),\n                                                                                                         firstGroup,\n                                                                                                         groupCount,\n                                                                                                         data.size() * sizeof( DataType ),\n                                                                                                         reinterpret_cast<void *>( data.data() ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Pipeline::getRayTracingShaderGroupHandlesNV\" );\n\n      return data;\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE DataType Pipeline::getRayTracingShaderGroupHandleNV( uint32_t firstGroup, uint32_t groupCount ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetRayTracingShaderGroupHandlesNV &&\n                         \"Function <vkGetRayTracingShaderGroupHandlesNV> requires <VK_KHR_ray_tracing_pipeline> or <VK_NV_ray_tracing>\" );\n\n      DataType                     data;\n      VULKAN_HPP_NAMESPACE::Result result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetRayTracingShaderGroupHandlesNV( static_cast<VkDevice>( m_device ),\n                                                                                                         static_cast<VkPipeline>( m_pipeline ),\n                                                                                                         firstGroup,\n                                                                                                         groupCount,\n                                                                                                         sizeof( DataType ),\n                                                                                                         reinterpret_cast<void *>( &data ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Pipeline::getRayTracingShaderGroupHandleNV\" );\n\n      return data;\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<DataType> AccelerationStructureNV::getHandle( size_t dataSize ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetAccelerationStructureHandleNV && \"Function <vkGetAccelerationStructureHandleNV> requires <VK_NV_ray_tracing>\" );\n\n      VULKAN_HPP_ASSERT( dataSize % sizeof( DataType ) == 0 );\n      std::vector<DataType>        data( dataSize / sizeof( DataType ) );\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetAccelerationStructureHandleNV( static_cast<VkDevice>( m_device ),\n                                                             static_cast<VkAccelerationStructureNV>( m_accelerationStructure ),\n                                                             data.size() * sizeof( DataType ),\n                                                             reinterpret_cast<void *>( data.data() ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::AccelerationStructureNV::getHandle\" );\n\n      return data;\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE DataType AccelerationStructureNV::getHandle() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetAccelerationStructureHandleNV && \"Function <vkGetAccelerationStructureHandleNV> requires <VK_NV_ray_tracing>\" );\n\n      DataType                     data;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetAccelerationStructureHandleNV( static_cast<VkDevice>( m_device ),\n                                                             static_cast<VkAccelerationStructureNV>( m_accelerationStructure ),\n                                                             sizeof( DataType ),\n                                                             reinterpret_cast<void *>( &data ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::AccelerationStructureNV::getHandle\" );\n\n      return data;\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::writeAccelerationStructuresPropertiesNV(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureNV> const & accelerationStructures,\n      VULKAN_HPP_NAMESPACE::QueryType                                                               queryType,\n      VULKAN_HPP_NAMESPACE::QueryPool                                                               queryPool,\n      uint32_t                                                                                      firstQuery ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdWriteAccelerationStructuresPropertiesNV &&\n                         \"Function <vkCmdWriteAccelerationStructuresPropertiesNV> requires <VK_NV_ray_tracing>\" );\n\n      getDispatcher()->vkCmdWriteAccelerationStructuresPropertiesNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                                     accelerationStructures.size(),\n                                                                     reinterpret_cast<const VkAccelerationStructureNV *>( accelerationStructures.data() ),\n                                                                     static_cast<VkQueryType>( queryType ),\n                                                                     static_cast<VkQueryPool>( queryPool ),\n                                                                     firstQuery );\n    }\n\n    VULKAN_HPP_INLINE void Pipeline::compileDeferredNV( uint32_t shader ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCompileDeferredNV && \"Function <vkCompileDeferredNV> requires <VK_NV_ray_tracing>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkCompileDeferredNV( static_cast<VkDevice>( m_device ), static_cast<VkPipeline>( m_pipeline ), shader ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Pipeline::compileDeferredNV\" );\n    }\n\n    //=== VK_KHR_maintenance3 ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport\n      Device::getDescriptorSetLayoutSupportKHR( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo & createInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDescriptorSetLayoutSupportKHR &&\n                         \"Function <vkGetDescriptorSetLayoutSupportKHR> requires <VK_KHR_maintenance3> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport support;\n      getDispatcher()->vkGetDescriptorSetLayoutSupportKHR( static_cast<VkDevice>( m_device ),\n                                                           reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>( &createInfo ),\n                                                           reinterpret_cast<VkDescriptorSetLayoutSupport *>( &support ) );\n\n      return support;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n      Device::getDescriptorSetLayoutSupportKHR( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo & createInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDescriptorSetLayoutSupportKHR &&\n                         \"Function <vkGetDescriptorSetLayoutSupportKHR> requires <VK_KHR_maintenance3> or <VK_VERSION_1_1>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>   structureChain;\n      VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport & support = structureChain.template get<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport>();\n      getDispatcher()->vkGetDescriptorSetLayoutSupportKHR( static_cast<VkDevice>( m_device ),\n                                                           reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>( &createInfo ),\n                                                           reinterpret_cast<VkDescriptorSetLayoutSupport *>( &support ) );\n\n      return structureChain;\n    }\n\n    //=== VK_KHR_draw_indirect_count ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::drawIndirectCountKHR( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                                VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                                VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                                                VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                                                uint32_t                         maxDrawCount,\n                                                                uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDrawIndirectCountKHR &&\n                         \"Function <vkCmdDrawIndirectCountKHR> requires <VK_AMD_draw_indirect_count> or <VK_KHR_draw_indirect_count> or <VK_VERSION_1_2>\" );\n\n      getDispatcher()->vkCmdDrawIndirectCountKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                  static_cast<VkBuffer>( buffer ),\n                                                  static_cast<VkDeviceSize>( offset ),\n                                                  static_cast<VkBuffer>( countBuffer ),\n                                                  static_cast<VkDeviceSize>( countBufferOffset ),\n                                                  maxDrawCount,\n                                                  stride );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::drawIndexedIndirectCountKHR( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                                       VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                                       VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                                                       VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                                                       uint32_t                         maxDrawCount,\n                                                                       uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT(\n        getDispatcher()->vkCmdDrawIndexedIndirectCountKHR &&\n        \"Function <vkCmdDrawIndexedIndirectCountKHR> requires <VK_AMD_draw_indirect_count> or <VK_KHR_draw_indirect_count> or <VK_VERSION_1_2>\" );\n\n      getDispatcher()->vkCmdDrawIndexedIndirectCountKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                         static_cast<VkBuffer>( buffer ),\n                                                         static_cast<VkDeviceSize>( offset ),\n                                                         static_cast<VkBuffer>( countBuffer ),\n                                                         static_cast<VkDeviceSize>( countBufferOffset ),\n                                                         maxDrawCount,\n                                                         stride );\n    }\n\n    //=== VK_EXT_external_memory_host ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryHostPointerPropertiesEXT\n      Device::getMemoryHostPointerPropertiesEXT( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType, const void * pHostPointer ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetMemoryHostPointerPropertiesEXT &&\n                         \"Function <vkGetMemoryHostPointerPropertiesEXT> requires <VK_EXT_external_memory_host>\" );\n\n      VULKAN_HPP_NAMESPACE::MemoryHostPointerPropertiesEXT memoryHostPointerProperties;\n      VULKAN_HPP_NAMESPACE::Result                         result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetMemoryHostPointerPropertiesEXT( static_cast<VkDevice>( m_device ),\n                                                              static_cast<VkExternalMemoryHandleTypeFlagBits>( handleType ),\n                                                              pHostPointer,\n                                                              reinterpret_cast<VkMemoryHostPointerPropertiesEXT *>( &memoryHostPointerProperties ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getMemoryHostPointerPropertiesEXT\" );\n\n      return memoryHostPointerProperties;\n    }\n\n    //=== VK_AMD_buffer_marker ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::writeBufferMarkerAMD( VULKAN_HPP_NAMESPACE::PipelineStageFlagBits pipelineStage,\n                                                                VULKAN_HPP_NAMESPACE::Buffer                dstBuffer,\n                                                                VULKAN_HPP_NAMESPACE::DeviceSize            dstOffset,\n                                                                uint32_t                                    marker ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdWriteBufferMarkerAMD && \"Function <vkCmdWriteBufferMarkerAMD> requires <VK_AMD_buffer_marker>\" );\n\n      getDispatcher()->vkCmdWriteBufferMarkerAMD( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                  static_cast<VkPipelineStageFlagBits>( pipelineStage ),\n                                                  static_cast<VkBuffer>( dstBuffer ),\n                                                  static_cast<VkDeviceSize>( dstOffset ),\n                                                  marker );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::writeBufferMarker2AMD( VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stage,\n                                                                 VULKAN_HPP_NAMESPACE::Buffer              dstBuffer,\n                                                                 VULKAN_HPP_NAMESPACE::DeviceSize          dstOffset,\n                                                                 uint32_t                                  marker ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdWriteBufferMarker2AMD && \"Function <vkCmdWriteBufferMarker2AMD> requires <VK_AMD_buffer_marker>\" );\n\n      getDispatcher()->vkCmdWriteBufferMarker2AMD( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                   static_cast<VkPipelineStageFlags2>( stage ),\n                                                   static_cast<VkBuffer>( dstBuffer ),\n                                                   static_cast<VkDeviceSize>( dstOffset ),\n                                                   marker );\n    }\n\n    //=== VK_EXT_calibrated_timestamps ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::TimeDomainKHR> PhysicalDevice::getCalibrateableTimeDomainsEXT() const\n    {\n      VULKAN_HPP_ASSERT(\n        getDispatcher()->vkGetPhysicalDeviceCalibrateableTimeDomainsEXT &&\n        \"Function <vkGetPhysicalDeviceCalibrateableTimeDomainsEXT> requires <VK_EXT_calibrated_timestamps> or <VK_KHR_calibrated_timestamps>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::TimeDomainKHR> timeDomains;\n      uint32_t                                         timeDomainCount;\n      VULKAN_HPP_NAMESPACE::Result                     result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkGetPhysicalDeviceCalibrateableTimeDomainsEXT( static_cast<VkPhysicalDevice>( m_physicalDevice ), &timeDomainCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && timeDomainCount )\n        {\n          timeDomains.resize( timeDomainCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(\n            static_cast<VkPhysicalDevice>( m_physicalDevice ), &timeDomainCount, reinterpret_cast<VkTimeDomainKHR *>( timeDomains.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getCalibrateableTimeDomainsEXT\" );\n      VULKAN_HPP_ASSERT( timeDomainCount <= timeDomains.size() );\n      if ( timeDomainCount < timeDomains.size() )\n      {\n        timeDomains.resize( timeDomainCount );\n      }\n      return timeDomains;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::pair<std::vector<uint64_t>, uint64_t> Device::getCalibratedTimestampsEXT(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR> const & timestampInfos ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetCalibratedTimestampsEXT &&\n                         \"Function <vkGetCalibratedTimestampsEXT> requires <VK_EXT_calibrated_timestamps> or <VK_KHR_calibrated_timestamps>\" );\n\n      std::pair<std::vector<uint64_t>, uint64_t> data_( std::piecewise_construct, std::forward_as_tuple( timestampInfos.size() ), std::forward_as_tuple( 0 ) );\n      std::vector<uint64_t> &                    timestamps   = data_.first;\n      uint64_t &                                 maxDeviation = data_.second;\n      VULKAN_HPP_NAMESPACE::Result               result       = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetCalibratedTimestampsEXT( static_cast<VkDevice>( m_device ),\n                                                       timestampInfos.size(),\n                                                       reinterpret_cast<const VkCalibratedTimestampInfoKHR *>( timestampInfos.data() ),\n                                                       timestamps.data(),\n                                                       &maxDeviation ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getCalibratedTimestampsEXT\" );\n\n      return data_;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::pair<uint64_t, uint64_t>\n                                           Device::getCalibratedTimestampEXT( const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR & timestampInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetCalibratedTimestampsEXT &&\n                         \"Function <vkGetCalibratedTimestampsEXT> requires <VK_EXT_calibrated_timestamps> or <VK_KHR_calibrated_timestamps>\" );\n\n      std::pair<uint64_t, uint64_t> data_;\n      uint64_t &                    timestamp    = data_.first;\n      uint64_t &                    maxDeviation = data_.second;\n      VULKAN_HPP_NAMESPACE::Result  result       = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetCalibratedTimestampsEXT(\n        static_cast<VkDevice>( m_device ), 1, reinterpret_cast<const VkCalibratedTimestampInfoKHR *>( &timestampInfo ), &timestamp, &maxDeviation ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getCalibratedTimestampEXT\" );\n\n      return data_;\n    }\n\n    //=== VK_NV_mesh_shader ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::drawMeshTasksNV( uint32_t taskCount, uint32_t firstTask ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDrawMeshTasksNV && \"Function <vkCmdDrawMeshTasksNV> requires <VK_NV_mesh_shader>\" );\n\n      getDispatcher()->vkCmdDrawMeshTasksNV( static_cast<VkCommandBuffer>( m_commandBuffer ), taskCount, firstTask );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::drawMeshTasksIndirectNV( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                                   VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                                   uint32_t                         drawCount,\n                                                                   uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDrawMeshTasksIndirectNV && \"Function <vkCmdDrawMeshTasksIndirectNV> requires <VK_NV_mesh_shader>\" );\n\n      getDispatcher()->vkCmdDrawMeshTasksIndirectNV(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBuffer>( buffer ), static_cast<VkDeviceSize>( offset ), drawCount, stride );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::drawMeshTasksIndirectCountNV( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                                        VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                                        VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                                                        VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                                                        uint32_t                         maxDrawCount,\n                                                                        uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDrawMeshTasksIndirectCountNV && \"Function <vkCmdDrawMeshTasksIndirectCountNV> requires <VK_NV_mesh_shader>\" );\n\n      getDispatcher()->vkCmdDrawMeshTasksIndirectCountNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                          static_cast<VkBuffer>( buffer ),\n                                                          static_cast<VkDeviceSize>( offset ),\n                                                          static_cast<VkBuffer>( countBuffer ),\n                                                          static_cast<VkDeviceSize>( countBufferOffset ),\n                                                          maxDrawCount,\n                                                          stride );\n    }\n\n    //=== VK_NV_scissor_exclusive ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::setExclusiveScissorEnableNV(\n      uint32_t                                                                     firstExclusiveScissor,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Bool32> const & exclusiveScissorEnables ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetExclusiveScissorEnableNV &&\n                         \"Function <vkCmdSetExclusiveScissorEnableNV> requires <VK_NV_scissor_exclusive>\" );\n\n      getDispatcher()->vkCmdSetExclusiveScissorEnableNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                         firstExclusiveScissor,\n                                                         exclusiveScissorEnables.size(),\n                                                         reinterpret_cast<const VkBool32 *>( exclusiveScissorEnables.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setExclusiveScissorNV(\n      uint32_t firstExclusiveScissor, VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & exclusiveScissors ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetExclusiveScissorNV && \"Function <vkCmdSetExclusiveScissorNV> requires <VK_NV_scissor_exclusive>\" );\n\n      getDispatcher()->vkCmdSetExclusiveScissorNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                   firstExclusiveScissor,\n                                                   exclusiveScissors.size(),\n                                                   reinterpret_cast<const VkRect2D *>( exclusiveScissors.data() ) );\n    }\n\n    //=== VK_NV_device_diagnostic_checkpoints ===\n\n    template <typename CheckpointMarkerType>\n    VULKAN_HPP_INLINE void CommandBuffer::setCheckpointNV( CheckpointMarkerType const & checkpointMarker ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetCheckpointNV && \"Function <vkCmdSetCheckpointNV> requires <VK_NV_device_diagnostic_checkpoints>\" );\n\n      getDispatcher()->vkCmdSetCheckpointNV( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const void *>( &checkpointMarker ) );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::CheckpointDataNV> Queue::getCheckpointDataNV() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetQueueCheckpointDataNV &&\n                         \"Function <vkGetQueueCheckpointDataNV> requires <VK_NV_device_diagnostic_checkpoints>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::CheckpointDataNV> checkpointData;\n      uint32_t                                            checkpointDataCount;\n      getDispatcher()->vkGetQueueCheckpointDataNV( static_cast<VkQueue>( m_queue ), &checkpointDataCount, nullptr );\n      checkpointData.resize( checkpointDataCount );\n      getDispatcher()->vkGetQueueCheckpointDataNV(\n        static_cast<VkQueue>( m_queue ), &checkpointDataCount, reinterpret_cast<VkCheckpointDataNV *>( checkpointData.data() ) );\n\n      VULKAN_HPP_ASSERT( checkpointDataCount <= checkpointData.size() );\n      if ( checkpointDataCount < checkpointData.size() )\n      {\n        checkpointData.resize( checkpointDataCount );\n      }\n      return checkpointData;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::CheckpointData2NV> Queue::getCheckpointData2NV() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetQueueCheckpointData2NV &&\n                         \"Function <vkGetQueueCheckpointData2NV> requires <VK_NV_device_diagnostic_checkpoints>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::CheckpointData2NV> checkpointData;\n      uint32_t                                             checkpointDataCount;\n      getDispatcher()->vkGetQueueCheckpointData2NV( static_cast<VkQueue>( m_queue ), &checkpointDataCount, nullptr );\n      checkpointData.resize( checkpointDataCount );\n      getDispatcher()->vkGetQueueCheckpointData2NV(\n        static_cast<VkQueue>( m_queue ), &checkpointDataCount, reinterpret_cast<VkCheckpointData2NV *>( checkpointData.data() ) );\n\n      VULKAN_HPP_ASSERT( checkpointDataCount <= checkpointData.size() );\n      if ( checkpointDataCount < checkpointData.size() )\n      {\n        checkpointData.resize( checkpointDataCount );\n      }\n      return checkpointData;\n    }\n\n    //=== VK_KHR_timeline_semaphore ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint64_t Semaphore::getCounterValueKHR() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetSemaphoreCounterValueKHR &&\n                         \"Function <vkGetSemaphoreCounterValueKHR> requires <VK_KHR_timeline_semaphore> or <VK_VERSION_1_2>\" );\n\n      uint64_t                     value;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetSemaphoreCounterValueKHR( static_cast<VkDevice>( m_device ), static_cast<VkSemaphore>( m_semaphore ), &value ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Semaphore::getCounterValueKHR\" );\n\n      return value;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result Device::waitSemaphoresKHR( const VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo & waitInfo,\n                                                                                                   uint64_t timeout ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkWaitSemaphoresKHR && \"Function <vkWaitSemaphoresKHR> requires <VK_KHR_timeline_semaphore> or <VK_VERSION_1_2>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkWaitSemaphoresKHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkSemaphoreWaitInfo *>( &waitInfo ), timeout ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck(\n        result, VULKAN_HPP_NAMESPACE_STRING \"::Device::waitSemaphoresKHR\", { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eTimeout } );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n    }\n\n    VULKAN_HPP_INLINE void Device::signalSemaphoreKHR( const VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo & signalInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkSignalSemaphoreKHR && \"Function <vkSignalSemaphoreKHR> requires <VK_KHR_timeline_semaphore> or <VK_VERSION_1_2>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkSignalSemaphoreKHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkSemaphoreSignalInfo *>( &signalInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::signalSemaphoreKHR\" );\n    }\n\n    //=== VK_INTEL_performance_query ===\n\n    VULKAN_HPP_INLINE void Device::initializePerformanceApiINTEL( const VULKAN_HPP_NAMESPACE::InitializePerformanceApiInfoINTEL & initializeInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkInitializePerformanceApiINTEL &&\n                         \"Function <vkInitializePerformanceApiINTEL> requires <VK_INTEL_performance_query>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkInitializePerformanceApiINTEL(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkInitializePerformanceApiInfoINTEL *>( &initializeInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::initializePerformanceApiINTEL\" );\n    }\n\n    VULKAN_HPP_INLINE void Device::uninitializePerformanceApiINTEL() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkUninitializePerformanceApiINTEL &&\n                         \"Function <vkUninitializePerformanceApiINTEL> requires <VK_INTEL_performance_query>\" );\n\n      getDispatcher()->vkUninitializePerformanceApiINTEL( static_cast<VkDevice>( m_device ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setPerformanceMarkerINTEL( const VULKAN_HPP_NAMESPACE::PerformanceMarkerInfoINTEL & markerInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetPerformanceMarkerINTEL && \"Function <vkCmdSetPerformanceMarkerINTEL> requires <VK_INTEL_performance_query>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCmdSetPerformanceMarkerINTEL(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkPerformanceMarkerInfoINTEL *>( &markerInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::setPerformanceMarkerINTEL\" );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setPerformanceStreamMarkerINTEL( const VULKAN_HPP_NAMESPACE::PerformanceStreamMarkerInfoINTEL & markerInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetPerformanceStreamMarkerINTEL &&\n                         \"Function <vkCmdSetPerformanceStreamMarkerINTEL> requires <VK_INTEL_performance_query>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCmdSetPerformanceStreamMarkerINTEL(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkPerformanceStreamMarkerInfoINTEL *>( &markerInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::setPerformanceStreamMarkerINTEL\" );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setPerformanceOverrideINTEL( const VULKAN_HPP_NAMESPACE::PerformanceOverrideInfoINTEL & overrideInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetPerformanceOverrideINTEL &&\n                         \"Function <vkCmdSetPerformanceOverrideINTEL> requires <VK_INTEL_performance_query>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCmdSetPerformanceOverrideINTEL(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkPerformanceOverrideInfoINTEL *>( &overrideInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::setPerformanceOverrideINTEL\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PerformanceConfigurationINTEL>::Type\n      Device::acquirePerformanceConfigurationINTEL( VULKAN_HPP_NAMESPACE::PerformanceConfigurationAcquireInfoINTEL const & acquireInfo ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration;\n      VULKAN_HPP_NAMESPACE::Result                        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkAcquirePerformanceConfigurationINTEL( static_cast<VkDevice>( m_device ),\n                                                                 reinterpret_cast<const VkPerformanceConfigurationAcquireInfoINTEL *>( &acquireInfo ),\n                                                                 reinterpret_cast<VkPerformanceConfigurationINTEL *>( &configuration ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::acquirePerformanceConfigurationINTEL\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PerformanceConfigurationINTEL(\n        *this, *reinterpret_cast<VkPerformanceConfigurationINTEL *>( &configuration ) );\n    }\n\n    VULKAN_HPP_INLINE void Queue::setPerformanceConfigurationINTEL( VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkQueueSetPerformanceConfigurationINTEL &&\n                         \"Function <vkQueueSetPerformanceConfigurationINTEL> requires <VK_INTEL_performance_query>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkQueueSetPerformanceConfigurationINTEL(\n        static_cast<VkQueue>( m_queue ), static_cast<VkPerformanceConfigurationINTEL>( configuration ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Queue::setPerformanceConfigurationINTEL\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PerformanceValueINTEL\n                                           Device::getPerformanceParameterINTEL( VULKAN_HPP_NAMESPACE::PerformanceParameterTypeINTEL parameter ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPerformanceParameterINTEL && \"Function <vkGetPerformanceParameterINTEL> requires <VK_INTEL_performance_query>\" );\n\n      VULKAN_HPP_NAMESPACE::PerformanceValueINTEL value;\n      VULKAN_HPP_NAMESPACE::Result                result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPerformanceParameterINTEL(\n        static_cast<VkDevice>( m_device ), static_cast<VkPerformanceParameterTypeINTEL>( parameter ), reinterpret_cast<VkPerformanceValueINTEL *>( &value ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getPerformanceParameterINTEL\" );\n\n      return value;\n    }\n\n    //=== VK_AMD_display_native_hdr ===\n\n    VULKAN_HPP_INLINE void SwapchainKHR::setLocalDimmingAMD( VULKAN_HPP_NAMESPACE::Bool32 localDimmingEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkSetLocalDimmingAMD && \"Function <vkSetLocalDimmingAMD> requires <VK_AMD_display_native_hdr>\" );\n\n      getDispatcher()->vkSetLocalDimmingAMD(\n        static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( m_swapchain ), static_cast<VkBool32>( localDimmingEnable ) );\n    }\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n    //=== VK_FUCHSIA_imagepipe_surface ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n      Instance::createImagePipeSurfaceFUCHSIA( VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateInfoFUCHSIA const &                 createInfo,\n                                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n      VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateImagePipeSurfaceFUCHSIA(\n        static_cast<VkInstance>( m_instance ),\n        reinterpret_cast<const VkImagePipeSurfaceCreateInfoFUCHSIA *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#    if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#    else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Instance::createImagePipeSurfaceFUCHSIA\" );\n#    endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR( *this, *reinterpret_cast<VkSurfaceKHR *>( &surface ), allocator );\n    }\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n    //=== VK_EXT_metal_surface ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n      Instance::createMetalSurfaceEXT( VULKAN_HPP_NAMESPACE::MetalSurfaceCreateInfoEXT const &                         createInfo,\n                                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n      VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateMetalSurfaceEXT(\n        static_cast<VkInstance>( m_instance ),\n        reinterpret_cast<const VkMetalSurfaceCreateInfoEXT *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#    if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#    else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Instance::createMetalSurfaceEXT\" );\n#    endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR( *this, *reinterpret_cast<VkSurfaceKHR *>( &surface ), allocator );\n    }\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n    //=== VK_KHR_fragment_shading_rate ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR>\n                                           PhysicalDevice::getFragmentShadingRatesKHR() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceFragmentShadingRatesKHR &&\n                         \"Function <vkGetPhysicalDeviceFragmentShadingRatesKHR> requires <VK_KHR_fragment_shading_rate>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR> fragmentShadingRates;\n      uint32_t                                                                fragmentShadingRateCount;\n      VULKAN_HPP_NAMESPACE::Result                                            result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceFragmentShadingRatesKHR(\n          static_cast<VkPhysicalDevice>( m_physicalDevice ), &fragmentShadingRateCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && fragmentShadingRateCount )\n        {\n          fragmentShadingRates.resize( fragmentShadingRateCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceFragmentShadingRatesKHR(\n            static_cast<VkPhysicalDevice>( m_physicalDevice ),\n            &fragmentShadingRateCount,\n            reinterpret_cast<VkPhysicalDeviceFragmentShadingRateKHR *>( fragmentShadingRates.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getFragmentShadingRatesKHR\" );\n      VULKAN_HPP_ASSERT( fragmentShadingRateCount <= fragmentShadingRates.size() );\n      if ( fragmentShadingRateCount < fragmentShadingRates.size() )\n      {\n        fragmentShadingRates.resize( fragmentShadingRateCount );\n      }\n      return fragmentShadingRates;\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::setFragmentShadingRateKHR( const VULKAN_HPP_NAMESPACE::Extent2D &                       fragmentSize,\n                                                const VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR combinerOps[2] ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetFragmentShadingRateKHR &&\n                         \"Function <vkCmdSetFragmentShadingRateKHR> requires <VK_KHR_fragment_shading_rate>\" );\n\n      getDispatcher()->vkCmdSetFragmentShadingRateKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                       reinterpret_cast<const VkExtent2D *>( &fragmentSize ),\n                                                       reinterpret_cast<const VkFragmentShadingRateCombinerOpKHR *>( combinerOps ) );\n    }\n\n    //=== VK_KHR_dynamic_rendering_local_read ===\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::setRenderingAttachmentLocationsKHR( const VULKAN_HPP_NAMESPACE::RenderingAttachmentLocationInfo & locationInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetRenderingAttachmentLocationsKHR &&\n                         \"Function <vkCmdSetRenderingAttachmentLocationsKHR> requires <VK_KHR_dynamic_rendering_local_read> or <VK_VERSION_1_4>\" );\n\n      getDispatcher()->vkCmdSetRenderingAttachmentLocationsKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                                reinterpret_cast<const VkRenderingAttachmentLocationInfo *>( &locationInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setRenderingInputAttachmentIndicesKHR(\n      const VULKAN_HPP_NAMESPACE::RenderingInputAttachmentIndexInfo & inputAttachmentIndexInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetRenderingInputAttachmentIndicesKHR &&\n                         \"Function <vkCmdSetRenderingInputAttachmentIndicesKHR> requires <VK_KHR_dynamic_rendering_local_read> or <VK_VERSION_1_4>\" );\n\n      getDispatcher()->vkCmdSetRenderingInputAttachmentIndicesKHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                                   reinterpret_cast<const VkRenderingInputAttachmentIndexInfo *>( &inputAttachmentIndexInfo ) );\n    }\n\n    //=== VK_EXT_buffer_device_address ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceAddress\n                                           Device::getBufferAddressEXT( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT(\n        getDispatcher()->vkGetBufferDeviceAddressEXT &&\n        \"Function <vkGetBufferDeviceAddressEXT> requires <VK_EXT_buffer_device_address> or <VK_KHR_buffer_device_address> or <VK_VERSION_1_2>\" );\n\n      VkDeviceAddress result =\n        getDispatcher()->vkGetBufferDeviceAddressEXT( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkBufferDeviceAddressInfo *>( &info ) );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::DeviceAddress>( result );\n    }\n\n    //=== VK_EXT_tooling_info ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties> PhysicalDevice::getToolPropertiesEXT() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceToolPropertiesEXT &&\n                         \"Function <vkGetPhysicalDeviceToolPropertiesEXT> requires <VK_EXT_tooling_info> or <VK_VERSION_1_3>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties> toolProperties;\n      uint32_t                                                        toolCount;\n      VULKAN_HPP_NAMESPACE::Result                                    result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkGetPhysicalDeviceToolPropertiesEXT( static_cast<VkPhysicalDevice>( m_physicalDevice ), &toolCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && toolCount )\n        {\n          toolProperties.resize( toolCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceToolPropertiesEXT(\n            static_cast<VkPhysicalDevice>( m_physicalDevice ), &toolCount, reinterpret_cast<VkPhysicalDeviceToolProperties *>( toolProperties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getToolPropertiesEXT\" );\n      VULKAN_HPP_ASSERT( toolCount <= toolProperties.size() );\n      if ( toolCount < toolProperties.size() )\n      {\n        toolProperties.resize( toolCount );\n      }\n      return toolProperties;\n    }\n\n    //=== VK_KHR_present_wait ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result SwapchainKHR::waitForPresent( uint64_t presentId, uint64_t timeout ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkWaitForPresentKHR && \"Function <vkWaitForPresentKHR> requires <VK_KHR_present_wait>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkWaitForPresentKHR( static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( m_swapchain ), presentId, timeout ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck(\n        result,\n        VULKAN_HPP_NAMESPACE_STRING \"::SwapchainKHR::waitForPresent\",\n        { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eTimeout, VULKAN_HPP_NAMESPACE::Result::eSuboptimalKHR } );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n    }\n\n    //=== VK_NV_cooperative_matrix ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV>\n                                           PhysicalDevice::getCooperativeMatrixPropertiesNV() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceCooperativeMatrixPropertiesNV &&\n                         \"Function <vkGetPhysicalDeviceCooperativeMatrixPropertiesNV> requires <VK_NV_cooperative_matrix>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV> properties;\n      uint32_t                                                         propertyCount;\n      VULKAN_HPP_NAMESPACE::Result                                     result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkGetPhysicalDeviceCooperativeMatrixPropertiesNV( static_cast<VkPhysicalDevice>( m_physicalDevice ), &propertyCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n        {\n          properties.resize( propertyCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(\n            static_cast<VkPhysicalDevice>( m_physicalDevice ), &propertyCount, reinterpret_cast<VkCooperativeMatrixPropertiesNV *>( properties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getCooperativeMatrixPropertiesNV\" );\n      VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n      if ( propertyCount < properties.size() )\n      {\n        properties.resize( propertyCount );\n      }\n      return properties;\n    }\n\n    //=== VK_NV_coverage_reduction_mode ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV>\n                                           PhysicalDevice::getSupportedFramebufferMixedSamplesCombinationsNV() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV &&\n                         \"Function <vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV> requires <VK_NV_coverage_reduction_mode>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV> combinations;\n      uint32_t                                                                combinationCount;\n      VULKAN_HPP_NAMESPACE::Result                                            result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(\n          static_cast<VkPhysicalDevice>( m_physicalDevice ), &combinationCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && combinationCount )\n        {\n          combinations.resize( combinationCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(\n            static_cast<VkPhysicalDevice>( m_physicalDevice ),\n            &combinationCount,\n            reinterpret_cast<VkFramebufferMixedSamplesCombinationNV *>( combinations.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSupportedFramebufferMixedSamplesCombinationsNV\" );\n      VULKAN_HPP_ASSERT( combinationCount <= combinations.size() );\n      if ( combinationCount < combinations.size() )\n      {\n        combinations.resize( combinationCount );\n      }\n      return combinations;\n    }\n\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n    //=== VK_EXT_full_screen_exclusive ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR>\n      PhysicalDevice::getSurfacePresentModes2EXT( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceSurfacePresentModes2EXT &&\n                         \"Function <vkGetPhysicalDeviceSurfacePresentModes2EXT> requires <VK_EXT_full_screen_exclusive>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR> presentModes;\n      uint32_t                                          presentModeCount;\n      VULKAN_HPP_NAMESPACE::Result                      result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkGetPhysicalDeviceSurfacePresentModes2EXT( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                       reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ),\n                                                                       &presentModeCount,\n                                                                       nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && presentModeCount )\n        {\n          presentModes.resize( presentModeCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n            getDispatcher()->vkGetPhysicalDeviceSurfacePresentModes2EXT( static_cast<VkPhysicalDevice>( m_physicalDevice ),\n                                                                         reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ),\n                                                                         &presentModeCount,\n                                                                         reinterpret_cast<VkPresentModeKHR *>( presentModes.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getSurfacePresentModes2EXT\" );\n      VULKAN_HPP_ASSERT( presentModeCount <= presentModes.size() );\n      if ( presentModeCount < presentModes.size() )\n      {\n        presentModes.resize( presentModeCount );\n      }\n      return presentModes;\n    }\n\n    VULKAN_HPP_INLINE void SwapchainKHR::acquireFullScreenExclusiveModeEXT() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkAcquireFullScreenExclusiveModeEXT &&\n                         \"Function <vkAcquireFullScreenExclusiveModeEXT> requires <VK_EXT_full_screen_exclusive>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkAcquireFullScreenExclusiveModeEXT( static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( m_swapchain ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::SwapchainKHR::acquireFullScreenExclusiveModeEXT\" );\n    }\n\n    VULKAN_HPP_INLINE void SwapchainKHR::releaseFullScreenExclusiveModeEXT() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkReleaseFullScreenExclusiveModeEXT &&\n                         \"Function <vkReleaseFullScreenExclusiveModeEXT> requires <VK_EXT_full_screen_exclusive>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkReleaseFullScreenExclusiveModeEXT( static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( m_swapchain ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::SwapchainKHR::releaseFullScreenExclusiveModeEXT\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR\n      Device::getGroupSurfacePresentModes2EXT( const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR & surfaceInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceGroupSurfacePresentModes2EXT &&\n                         \"Function <vkGetDeviceGroupSurfacePresentModes2EXT> requires <VK_EXT_full_screen_exclusive>\" );\n\n      VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR modes;\n      VULKAN_HPP_NAMESPACE::Result                         result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetDeviceGroupSurfacePresentModes2EXT( static_cast<VkDevice>( m_device ),\n                                                                  reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( &surfaceInfo ),\n                                                                  reinterpret_cast<VkDeviceGroupPresentModeFlagsKHR *>( &modes ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getGroupSurfacePresentModes2EXT\" );\n\n      return modes;\n    }\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n    //=== VK_EXT_headless_surface ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n      Instance::createHeadlessSurfaceEXT( VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateInfoEXT const &                      createInfo,\n                                          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n      VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateHeadlessSurfaceEXT(\n        static_cast<VkInstance>( m_instance ),\n        reinterpret_cast<const VkHeadlessSurfaceCreateInfoEXT *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Instance::createHeadlessSurfaceEXT\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR( *this, *reinterpret_cast<VkSurfaceKHR *>( &surface ), allocator );\n    }\n\n    //=== VK_KHR_buffer_device_address ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceAddress\n                                           Device::getBufferAddressKHR( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT(\n        getDispatcher()->vkGetBufferDeviceAddressKHR &&\n        \"Function <vkGetBufferDeviceAddressKHR> requires <VK_EXT_buffer_device_address> or <VK_KHR_buffer_device_address> or <VK_VERSION_1_2>\" );\n\n      VkDeviceAddress result =\n        getDispatcher()->vkGetBufferDeviceAddressKHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkBufferDeviceAddressInfo *>( &info ) );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::DeviceAddress>( result );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint64_t\n      Device::getBufferOpaqueCaptureAddressKHR( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetBufferOpaqueCaptureAddressKHR &&\n                         \"Function <vkGetBufferOpaqueCaptureAddressKHR> requires <VK_KHR_buffer_device_address> or <VK_VERSION_1_2>\" );\n\n      uint64_t result =\n        getDispatcher()->vkGetBufferOpaqueCaptureAddressKHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkBufferDeviceAddressInfo *>( &info ) );\n\n      return result;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint64_t\n      Device::getMemoryOpaqueCaptureAddressKHR( const VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceMemoryOpaqueCaptureAddressKHR &&\n                         \"Function <vkGetDeviceMemoryOpaqueCaptureAddressKHR> requires <VK_KHR_buffer_device_address> or <VK_VERSION_1_2>\" );\n\n      uint64_t result = getDispatcher()->vkGetDeviceMemoryOpaqueCaptureAddressKHR( static_cast<VkDevice>( m_device ),\n                                                                                   reinterpret_cast<const VkDeviceMemoryOpaqueCaptureAddressInfo *>( &info ) );\n\n      return result;\n    }\n\n    //=== VK_EXT_line_rasterization ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::setLineStippleEXT( uint32_t lineStippleFactor, uint16_t lineStipplePattern ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetLineStippleEXT &&\n                         \"Function <vkCmdSetLineStippleEXT> requires <VK_EXT_line_rasterization> or <VK_KHR_line_rasterization> or <VK_VERSION_1_4>\" );\n\n      getDispatcher()->vkCmdSetLineStippleEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), lineStippleFactor, lineStipplePattern );\n    }\n\n    //=== VK_EXT_host_query_reset ===\n\n    VULKAN_HPP_INLINE void QueryPool::resetEXT( uint32_t firstQuery, uint32_t queryCount ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkResetQueryPoolEXT && \"Function <vkResetQueryPoolEXT> requires <VK_EXT_host_query_reset> or <VK_VERSION_1_2>\" );\n\n      getDispatcher()->vkResetQueryPoolEXT( static_cast<VkDevice>( m_device ), static_cast<VkQueryPool>( m_queryPool ), firstQuery, queryCount );\n    }\n\n    //=== VK_EXT_extended_dynamic_state ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::setCullModeEXT( VULKAN_HPP_NAMESPACE::CullModeFlags cullMode ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetCullModeEXT &&\n                         \"Function <vkCmdSetCullModeEXT> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetCullModeEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkCullModeFlags>( cullMode ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setFrontFaceEXT( VULKAN_HPP_NAMESPACE::FrontFace frontFace ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetFrontFaceEXT &&\n                         \"Function <vkCmdSetFrontFaceEXT> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetFrontFaceEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkFrontFace>( frontFace ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setPrimitiveTopologyEXT( VULKAN_HPP_NAMESPACE::PrimitiveTopology primitiveTopology ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetPrimitiveTopologyEXT &&\n                         \"Function <vkCmdSetPrimitiveTopologyEXT> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetPrimitiveTopologyEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkPrimitiveTopology>( primitiveTopology ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setViewportWithCountEXT(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Viewport> const & viewports ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetViewportWithCountEXT &&\n                         \"Function <vkCmdSetViewportWithCountEXT> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetViewportWithCountEXT(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), viewports.size(), reinterpret_cast<const VkViewport *>( viewports.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::setScissorWithCountEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & scissors ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetScissorWithCountEXT &&\n                         \"Function <vkCmdSetScissorWithCountEXT> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetScissorWithCountEXT(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), scissors.size(), reinterpret_cast<const VkRect2D *>( scissors.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::bindVertexBuffers2EXT( uint32_t                                                                         firstBinding,\n                                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &     buffers,\n                                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & offsets,\n                                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & sizes,\n                                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & strides ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBindVertexBuffers2EXT &&\n                         \"Function <vkCmdBindVertexBuffers2EXT> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( buffers.size() == offsets.size() );\n      VULKAN_HPP_ASSERT( sizes.empty() || buffers.size() == sizes.size() );\n      VULKAN_HPP_ASSERT( strides.empty() || buffers.size() == strides.size() );\n#  else\n      if ( buffers.size() != offsets.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::bindVertexBuffers2EXT: buffers.size() != offsets.size()\" );\n      }\n      if ( !sizes.empty() && buffers.size() != sizes.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::bindVertexBuffers2EXT: buffers.size() != sizes.size()\" );\n      }\n      if ( !strides.empty() && buffers.size() != strides.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::bindVertexBuffers2EXT: buffers.size() != strides.size()\" );\n      }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n      getDispatcher()->vkCmdBindVertexBuffers2EXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                   firstBinding,\n                                                   buffers.size(),\n                                                   reinterpret_cast<const VkBuffer *>( buffers.data() ),\n                                                   reinterpret_cast<const VkDeviceSize *>( offsets.data() ),\n                                                   reinterpret_cast<const VkDeviceSize *>( sizes.data() ),\n                                                   reinterpret_cast<const VkDeviceSize *>( strides.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setDepthTestEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthTestEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDepthTestEnableEXT &&\n                         \"Function <vkCmdSetDepthTestEnableEXT> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetDepthTestEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( depthTestEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setDepthWriteEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthWriteEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDepthWriteEnableEXT &&\n                         \"Function <vkCmdSetDepthWriteEnableEXT> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetDepthWriteEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( depthWriteEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setDepthCompareOpEXT( VULKAN_HPP_NAMESPACE::CompareOp depthCompareOp ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDepthCompareOpEXT &&\n                         \"Function <vkCmdSetDepthCompareOpEXT> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetDepthCompareOpEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkCompareOp>( depthCompareOp ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setDepthBoundsTestEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthBoundsTestEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDepthBoundsTestEnableEXT &&\n                         \"Function <vkCmdSetDepthBoundsTestEnableEXT> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetDepthBoundsTestEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( depthBoundsTestEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setStencilTestEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 stencilTestEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetStencilTestEnableEXT &&\n                         \"Function <vkCmdSetStencilTestEnableEXT> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetStencilTestEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( stencilTestEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setStencilOpEXT( VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask,\n                                                           VULKAN_HPP_NAMESPACE::StencilOp        failOp,\n                                                           VULKAN_HPP_NAMESPACE::StencilOp        passOp,\n                                                           VULKAN_HPP_NAMESPACE::StencilOp        depthFailOp,\n                                                           VULKAN_HPP_NAMESPACE::CompareOp        compareOp ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetStencilOpEXT &&\n                         \"Function <vkCmdSetStencilOpEXT> requires <VK_EXT_extended_dynamic_state> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetStencilOpEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                             static_cast<VkStencilFaceFlags>( faceMask ),\n                                             static_cast<VkStencilOp>( failOp ),\n                                             static_cast<VkStencilOp>( passOp ),\n                                             static_cast<VkStencilOp>( depthFailOp ),\n                                             static_cast<VkCompareOp>( compareOp ) );\n    }\n\n    //=== VK_KHR_deferred_host_operations ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeferredOperationKHR>::Type\n      Device::createDeferredOperationKHR( VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::DeferredOperationKHR deferredOperation;\n      VULKAN_HPP_NAMESPACE::Result               result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateDeferredOperationKHR(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkDeferredOperationKHR *>( &deferredOperation ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createDeferredOperationKHR\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeferredOperationKHR(\n        *this, *reinterpret_cast<VkDeferredOperationKHR *>( &deferredOperation ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint32_t DeferredOperationKHR::getMaxConcurrency() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeferredOperationMaxConcurrencyKHR &&\n                         \"Function <vkGetDeferredOperationMaxConcurrencyKHR> requires <VK_KHR_deferred_host_operations>\" );\n\n      uint32_t result =\n        getDispatcher()->vkGetDeferredOperationMaxConcurrencyKHR( static_cast<VkDevice>( m_device ), static_cast<VkDeferredOperationKHR>( m_operation ) );\n\n      return result;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result DeferredOperationKHR::getResult() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeferredOperationResultKHR &&\n                         \"Function <vkGetDeferredOperationResultKHR> requires <VK_KHR_deferred_host_operations>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetDeferredOperationResultKHR( static_cast<VkDevice>( m_device ), static_cast<VkDeferredOperationKHR>( m_operation ) ) );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result DeferredOperationKHR::join() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkDeferredOperationJoinKHR && \"Function <vkDeferredOperationJoinKHR> requires <VK_KHR_deferred_host_operations>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkDeferredOperationJoinKHR( static_cast<VkDevice>( m_device ), static_cast<VkDeferredOperationKHR>( m_operation ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck(\n        result,\n        VULKAN_HPP_NAMESPACE_STRING \"::DeferredOperationKHR::join\",\n        { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eThreadDoneKHR, VULKAN_HPP_NAMESPACE::Result::eThreadIdleKHR } );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n    }\n\n    //=== VK_KHR_pipeline_executable_properties ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR>\n                                           Device::getPipelineExecutablePropertiesKHR( const VULKAN_HPP_NAMESPACE::PipelineInfoKHR & pipelineInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPipelineExecutablePropertiesKHR &&\n                         \"Function <vkGetPipelineExecutablePropertiesKHR> requires <VK_KHR_pipeline_executable_properties>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR> properties;\n      uint32_t                                                           executableCount;\n      VULKAN_HPP_NAMESPACE::Result                                       result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPipelineExecutablePropertiesKHR(\n          static_cast<VkDevice>( m_device ), reinterpret_cast<const VkPipelineInfoKHR *>( &pipelineInfo ), &executableCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && executableCount )\n        {\n          properties.resize( executableCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n            getDispatcher()->vkGetPipelineExecutablePropertiesKHR( static_cast<VkDevice>( m_device ),\n                                                                   reinterpret_cast<const VkPipelineInfoKHR *>( &pipelineInfo ),\n                                                                   &executableCount,\n                                                                   reinterpret_cast<VkPipelineExecutablePropertiesKHR *>( properties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getPipelineExecutablePropertiesKHR\" );\n      VULKAN_HPP_ASSERT( executableCount <= properties.size() );\n      if ( executableCount < properties.size() )\n      {\n        properties.resize( executableCount );\n      }\n      return properties;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR>\n      Device::getPipelineExecutableStatisticsKHR( const VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR & executableInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPipelineExecutableStatisticsKHR &&\n                         \"Function <vkGetPipelineExecutableStatisticsKHR> requires <VK_KHR_pipeline_executable_properties>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR> statistics;\n      uint32_t                                                          statisticCount;\n      VULKAN_HPP_NAMESPACE::Result                                      result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPipelineExecutableStatisticsKHR(\n          static_cast<VkDevice>( m_device ), reinterpret_cast<const VkPipelineExecutableInfoKHR *>( &executableInfo ), &statisticCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && statisticCount )\n        {\n          statistics.resize( statisticCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n            getDispatcher()->vkGetPipelineExecutableStatisticsKHR( static_cast<VkDevice>( m_device ),\n                                                                   reinterpret_cast<const VkPipelineExecutableInfoKHR *>( &executableInfo ),\n                                                                   &statisticCount,\n                                                                   reinterpret_cast<VkPipelineExecutableStatisticKHR *>( statistics.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getPipelineExecutableStatisticsKHR\" );\n      VULKAN_HPP_ASSERT( statisticCount <= statistics.size() );\n      if ( statisticCount < statistics.size() )\n      {\n        statistics.resize( statisticCount );\n      }\n      return statistics;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR>\n      Device::getPipelineExecutableInternalRepresentationsKHR( const VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR & executableInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPipelineExecutableInternalRepresentationsKHR &&\n                         \"Function <vkGetPipelineExecutableInternalRepresentationsKHR> requires <VK_KHR_pipeline_executable_properties>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR> internalRepresentations;\n      uint32_t                                                                       internalRepresentationCount;\n      VULKAN_HPP_NAMESPACE::Result                                                   result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkGetPipelineExecutableInternalRepresentationsKHR( static_cast<VkDevice>( m_device ),\n                                                                              reinterpret_cast<const VkPipelineExecutableInfoKHR *>( &executableInfo ),\n                                                                              &internalRepresentationCount,\n                                                                              nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && internalRepresentationCount )\n        {\n          internalRepresentations.resize( internalRepresentationCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPipelineExecutableInternalRepresentationsKHR(\n            static_cast<VkDevice>( m_device ),\n            reinterpret_cast<const VkPipelineExecutableInfoKHR *>( &executableInfo ),\n            &internalRepresentationCount,\n            reinterpret_cast<VkPipelineExecutableInternalRepresentationKHR *>( internalRepresentations.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getPipelineExecutableInternalRepresentationsKHR\" );\n      VULKAN_HPP_ASSERT( internalRepresentationCount <= internalRepresentations.size() );\n      if ( internalRepresentationCount < internalRepresentations.size() )\n      {\n        internalRepresentations.resize( internalRepresentationCount );\n      }\n      return internalRepresentations;\n    }\n\n    //=== VK_EXT_host_image_copy ===\n\n    VULKAN_HPP_INLINE void Device::copyMemoryToImageEXT( const VULKAN_HPP_NAMESPACE::CopyMemoryToImageInfo & copyMemoryToImageInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCopyMemoryToImageEXT && \"Function <vkCopyMemoryToImageEXT> requires <VK_EXT_host_image_copy> or <VK_VERSION_1_4>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCopyMemoryToImageEXT(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkCopyMemoryToImageInfo *>( &copyMemoryToImageInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::copyMemoryToImageEXT\" );\n    }\n\n    VULKAN_HPP_INLINE void Device::copyImageToMemoryEXT( const VULKAN_HPP_NAMESPACE::CopyImageToMemoryInfo & copyImageToMemoryInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCopyImageToMemoryEXT && \"Function <vkCopyImageToMemoryEXT> requires <VK_EXT_host_image_copy> or <VK_VERSION_1_4>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCopyImageToMemoryEXT(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkCopyImageToMemoryInfo *>( &copyImageToMemoryInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::copyImageToMemoryEXT\" );\n    }\n\n    VULKAN_HPP_INLINE void Device::copyImageToImageEXT( const VULKAN_HPP_NAMESPACE::CopyImageToImageInfo & copyImageToImageInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCopyImageToImageEXT && \"Function <vkCopyImageToImageEXT> requires <VK_EXT_host_image_copy> or <VK_VERSION_1_4>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCopyImageToImageEXT(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkCopyImageToImageInfo *>( &copyImageToImageInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::copyImageToImageEXT\" );\n    }\n\n    VULKAN_HPP_INLINE void\n      Device::transitionImageLayoutEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::HostImageLayoutTransitionInfo> const & transitions ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkTransitionImageLayoutEXT &&\n                         \"Function <vkTransitionImageLayoutEXT> requires <VK_EXT_host_image_copy> or <VK_VERSION_1_4>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkTransitionImageLayoutEXT(\n        static_cast<VkDevice>( m_device ), transitions.size(), reinterpret_cast<const VkHostImageLayoutTransitionInfo *>( transitions.data() ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::transitionImageLayoutEXT\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::SubresourceLayout2\n      Image::getSubresourceLayout2EXT( const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT(\n        getDispatcher()->vkGetImageSubresourceLayout2EXT &&\n        \"Function <vkGetImageSubresourceLayout2EXT> requires <VK_EXT_host_image_copy> or <VK_EXT_image_compression_control> or <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n\n      VULKAN_HPP_NAMESPACE::SubresourceLayout2 layout;\n      getDispatcher()->vkGetImageSubresourceLayout2EXT( static_cast<VkDevice>( m_device ),\n                                                        static_cast<VkImage>( m_image ),\n                                                        reinterpret_cast<const VkImageSubresource2 *>( &subresource ),\n                                                        reinterpret_cast<VkSubresourceLayout2 *>( &layout ) );\n\n      return layout;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n      Image::getSubresourceLayout2EXT( const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT(\n        getDispatcher()->vkGetImageSubresourceLayout2EXT &&\n        \"Function <vkGetImageSubresourceLayout2EXT> requires <VK_EXT_host_image_copy> or <VK_EXT_image_compression_control> or <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n      VULKAN_HPP_NAMESPACE::SubresourceLayout2 &       layout = structureChain.template get<VULKAN_HPP_NAMESPACE::SubresourceLayout2>();\n      getDispatcher()->vkGetImageSubresourceLayout2EXT( static_cast<VkDevice>( m_device ),\n                                                        static_cast<VkImage>( m_image ),\n                                                        reinterpret_cast<const VkImageSubresource2 *>( &subresource ),\n                                                        reinterpret_cast<VkSubresourceLayout2 *>( &layout ) );\n\n      return structureChain;\n    }\n\n    //=== VK_KHR_map_memory2 ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE void * Device::mapMemory2KHR( const VULKAN_HPP_NAMESPACE::MemoryMapInfo & memoryMapInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkMapMemory2KHR && \"Function <vkMapMemory2KHR> requires <VK_KHR_map_memory2> or <VK_VERSION_1_4>\" );\n\n      void *                       pData;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkMapMemory2KHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkMemoryMapInfo *>( &memoryMapInfo ), &pData ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::mapMemory2KHR\" );\n\n      return pData;\n    }\n\n    VULKAN_HPP_INLINE void Device::unmapMemory2KHR( const VULKAN_HPP_NAMESPACE::MemoryUnmapInfo & memoryUnmapInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkUnmapMemory2KHR && \"Function <vkUnmapMemory2KHR> requires <VK_KHR_map_memory2> or <VK_VERSION_1_4>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkUnmapMemory2KHR( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkMemoryUnmapInfo *>( &memoryUnmapInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::unmapMemory2KHR\" );\n    }\n\n    //=== VK_EXT_swapchain_maintenance1 ===\n\n    VULKAN_HPP_INLINE void Device::releaseSwapchainImagesEXT( const VULKAN_HPP_NAMESPACE::ReleaseSwapchainImagesInfoEXT & releaseInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkReleaseSwapchainImagesEXT && \"Function <vkReleaseSwapchainImagesEXT> requires <VK_EXT_swapchain_maintenance1>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkReleaseSwapchainImagesEXT(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkReleaseSwapchainImagesInfoEXT *>( &releaseInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::releaseSwapchainImagesEXT\" );\n    }\n\n    //=== VK_NV_device_generated_commands ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2\n      Device::getGeneratedCommandsMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoNV & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetGeneratedCommandsMemoryRequirementsNV &&\n                         \"Function <vkGetGeneratedCommandsMemoryRequirementsNV> requires <VK_NV_device_generated_commands>\" );\n\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;\n      getDispatcher()->vkGetGeneratedCommandsMemoryRequirementsNV( static_cast<VkDevice>( m_device ),\n                                                                   reinterpret_cast<const VkGeneratedCommandsMemoryRequirementsInfoNV *>( &info ),\n                                                                   reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n      return memoryRequirements;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n      Device::getGeneratedCommandsMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoNV & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetGeneratedCommandsMemoryRequirementsNV &&\n                         \"Function <vkGetGeneratedCommandsMemoryRequirementsNV> requires <VK_NV_device_generated_commands>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2 &      memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();\n      getDispatcher()->vkGetGeneratedCommandsMemoryRequirementsNV( static_cast<VkDevice>( m_device ),\n                                                                   reinterpret_cast<const VkGeneratedCommandsMemoryRequirementsInfoNV *>( &info ),\n                                                                   reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::preprocessGeneratedCommandsNV( const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV & generatedCommandsInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdPreprocessGeneratedCommandsNV &&\n                         \"Function <vkCmdPreprocessGeneratedCommandsNV> requires <VK_NV_device_generated_commands>\" );\n\n      getDispatcher()->vkCmdPreprocessGeneratedCommandsNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                           reinterpret_cast<const VkGeneratedCommandsInfoNV *>( &generatedCommandsInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::executeGeneratedCommandsNV( VULKAN_HPP_NAMESPACE::Bool32                          isPreprocessed,\n                                                 const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV & generatedCommandsInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdExecuteGeneratedCommandsNV &&\n                         \"Function <vkCmdExecuteGeneratedCommandsNV> requires <VK_NV_device_generated_commands>\" );\n\n      getDispatcher()->vkCmdExecuteGeneratedCommandsNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                        static_cast<VkBool32>( isPreprocessed ),\n                                                        reinterpret_cast<const VkGeneratedCommandsInfoNV *>( &generatedCommandsInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::bindPipelineShaderGroupNV( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint,\n                                                                     VULKAN_HPP_NAMESPACE::Pipeline          pipeline,\n                                                                     uint32_t                                groupIndex ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBindPipelineShaderGroupNV &&\n                         \"Function <vkCmdBindPipelineShaderGroupNV> requires <VK_NV_device_generated_commands>\" );\n\n      getDispatcher()->vkCmdBindPipelineShaderGroupNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                       static_cast<VkPipelineBindPoint>( pipelineBindPoint ),\n                                                       static_cast<VkPipeline>( pipeline ),\n                                                       groupIndex );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::IndirectCommandsLayoutNV>::Type\n      Device::createIndirectCommandsLayoutNV( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoNV const &                createInfo,\n                                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV indirectCommandsLayout;\n      VULKAN_HPP_NAMESPACE::Result                   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateIndirectCommandsLayoutNV(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkIndirectCommandsLayoutCreateInfoNV *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkIndirectCommandsLayoutNV *>( &indirectCommandsLayout ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createIndirectCommandsLayoutNV\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::IndirectCommandsLayoutNV(\n        *this, *reinterpret_cast<VkIndirectCommandsLayoutNV *>( &indirectCommandsLayout ), allocator );\n    }\n\n    //=== VK_EXT_depth_bias_control ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::setDepthBias2EXT( const VULKAN_HPP_NAMESPACE::DepthBiasInfoEXT & depthBiasInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDepthBias2EXT && \"Function <vkCmdSetDepthBias2EXT> requires <VK_EXT_depth_bias_control>\" );\n\n      getDispatcher()->vkCmdSetDepthBias2EXT( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkDepthBiasInfoEXT *>( &depthBiasInfo ) );\n    }\n\n    //=== VK_EXT_acquire_drm_display ===\n\n    VULKAN_HPP_INLINE void PhysicalDevice::acquireDrmDisplayEXT( int32_t drmFd, VULKAN_HPP_NAMESPACE::DisplayKHR display ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkAcquireDrmDisplayEXT && \"Function <vkAcquireDrmDisplayEXT> requires <VK_EXT_acquire_drm_display>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkAcquireDrmDisplayEXT( static_cast<VkPhysicalDevice>( m_physicalDevice ), drmFd, static_cast<VkDisplayKHR>( display ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::acquireDrmDisplayEXT\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR>::Type\n      PhysicalDevice::getDrmDisplayEXT( int32_t drmFd, uint32_t connectorId ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::DisplayKHR display;\n      VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetDrmDisplayEXT(\n        static_cast<VkPhysicalDevice>( m_physicalDevice ), drmFd, connectorId, reinterpret_cast<VkDisplayKHR *>( &display ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"PhysicalDevice::getDrmDisplayEXT\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR( *this, *reinterpret_cast<VkDisplayKHR *>( &display ) );\n    }\n\n    //=== VK_EXT_private_data ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PrivateDataSlot>::Type\n      Device::createPrivateDataSlotEXT( VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo const &                         createInfo,\n                                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot;\n      VULKAN_HPP_NAMESPACE::Result          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreatePrivateDataSlotEXT(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkPrivateDataSlotCreateInfo *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkPrivateDataSlot *>( &privateDataSlot ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createPrivateDataSlotEXT\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PrivateDataSlot( *this, *reinterpret_cast<VkPrivateDataSlot *>( &privateDataSlot ), allocator );\n    }\n\n    VULKAN_HPP_INLINE void Device::destroyPrivateDataSlotEXT( VULKAN_HPP_NAMESPACE::PrivateDataSlot                     privateDataSlot,\n                                                              Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkDestroyPrivateDataSlotEXT &&\n                         \"Function <vkDestroyPrivateDataSlotEXT> requires <VK_EXT_private_data> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkDestroyPrivateDataSlotEXT(\n        static_cast<VkDevice>( m_device ),\n        static_cast<VkPrivateDataSlot>( privateDataSlot ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n    }\n\n    VULKAN_HPP_INLINE void Device::setPrivateDataEXT( VULKAN_HPP_NAMESPACE::ObjectType      objectType_,\n                                                      uint64_t                              objectHandle,\n                                                      VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,\n                                                      uint64_t                              data ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkSetPrivateDataEXT && \"Function <vkSetPrivateDataEXT> requires <VK_EXT_private_data> or <VK_VERSION_1_3>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkSetPrivateDataEXT(\n        static_cast<VkDevice>( m_device ), static_cast<VkObjectType>( objectType_ ), objectHandle, static_cast<VkPrivateDataSlot>( privateDataSlot ), data ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::setPrivateDataEXT\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint64_t Device::getPrivateDataEXT( VULKAN_HPP_NAMESPACE::ObjectType      objectType_,\n                                                                               uint64_t                              objectHandle,\n                                                                               VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPrivateDataEXT && \"Function <vkGetPrivateDataEXT> requires <VK_EXT_private_data> or <VK_VERSION_1_3>\" );\n\n      uint64_t data;\n      getDispatcher()->vkGetPrivateDataEXT(\n        static_cast<VkDevice>( m_device ), static_cast<VkObjectType>( objectType_ ), objectHandle, static_cast<VkPrivateDataSlot>( privateDataSlot ), &data );\n\n      return data;\n    }\n\n    //=== VK_KHR_video_encode_queue ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelPropertiesKHR PhysicalDevice::getVideoEncodeQualityLevelPropertiesKHR(\n      const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeQualityLevelInfoKHR & qualityLevelInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR &&\n                         \"Function <vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR> requires <VK_KHR_video_encode_queue>\" );\n\n      VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelPropertiesKHR qualityLevelProperties;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR(\n        static_cast<VkPhysicalDevice>( m_physicalDevice ),\n        reinterpret_cast<const VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR *>( &qualityLevelInfo ),\n        reinterpret_cast<VkVideoEncodeQualityLevelPropertiesKHR *>( &qualityLevelProperties ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getVideoEncodeQualityLevelPropertiesKHR\" );\n\n      return qualityLevelProperties;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> PhysicalDevice::getVideoEncodeQualityLevelPropertiesKHR(\n      const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeQualityLevelInfoKHR & qualityLevelInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR &&\n                         \"Function <vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR> requires <VK_KHR_video_encode_queue>\" );\n\n      StructureChain<X, Y, Z...>                                   structureChain;\n      VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelPropertiesKHR & qualityLevelProperties =\n        structureChain.template get<VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelPropertiesKHR>();\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR(\n        static_cast<VkPhysicalDevice>( m_physicalDevice ),\n        reinterpret_cast<const VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR *>( &qualityLevelInfo ),\n        reinterpret_cast<VkVideoEncodeQualityLevelPropertiesKHR *>( &qualityLevelProperties ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getVideoEncodeQualityLevelPropertiesKHR\" );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::pair<VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR, std::vector<uint8_t>>\n      Device::getEncodedVideoSessionParametersKHR( const VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersGetInfoKHR & videoSessionParametersInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetEncodedVideoSessionParametersKHR &&\n                         \"Function <vkGetEncodedVideoSessionParametersKHR> requires <VK_KHR_video_encode_queue>\" );\n\n      std::pair<VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR, std::vector<uint8_t>> data_;\n      VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR &                                feedbackInfo = data_.first;\n      std::vector<uint8_t> &                                                                             data         = data_.second;\n      size_t                                                                                             dataSize;\n      VULKAN_HPP_NAMESPACE::Result                                                                       result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetEncodedVideoSessionParametersKHR(\n          static_cast<VkDevice>( m_device ),\n          reinterpret_cast<const VkVideoEncodeSessionParametersGetInfoKHR *>( &videoSessionParametersInfo ),\n          reinterpret_cast<VkVideoEncodeSessionParametersFeedbackInfoKHR *>( &feedbackInfo ),\n          &dataSize,\n          nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && dataSize )\n        {\n          data.resize( dataSize );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetEncodedVideoSessionParametersKHR(\n            static_cast<VkDevice>( m_device ),\n            reinterpret_cast<const VkVideoEncodeSessionParametersGetInfoKHR *>( &videoSessionParametersInfo ),\n            reinterpret_cast<VkVideoEncodeSessionParametersFeedbackInfoKHR *>( &feedbackInfo ),\n            &dataSize,\n            reinterpret_cast<void *>( data.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getEncodedVideoSessionParametersKHR\" );\n\n      return data_;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::pair<VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>, std::vector<uint8_t>>\n      Device::getEncodedVideoSessionParametersKHR( const VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersGetInfoKHR & videoSessionParametersInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetEncodedVideoSessionParametersKHR &&\n                         \"Function <vkGetEncodedVideoSessionParametersKHR> requires <VK_KHR_video_encode_queue>\" );\n\n      std::pair<VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>, std::vector<uint8_t>> data_;\n      VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR &               feedbackInfo =\n        data_.first.template get<VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR>();\n      std::vector<uint8_t> &       data = data_.second;\n      size_t                       dataSize;\n      VULKAN_HPP_NAMESPACE::Result result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetEncodedVideoSessionParametersKHR(\n          static_cast<VkDevice>( m_device ),\n          reinterpret_cast<const VkVideoEncodeSessionParametersGetInfoKHR *>( &videoSessionParametersInfo ),\n          reinterpret_cast<VkVideoEncodeSessionParametersFeedbackInfoKHR *>( &feedbackInfo ),\n          &dataSize,\n          nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && dataSize )\n        {\n          data.resize( dataSize );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetEncodedVideoSessionParametersKHR(\n            static_cast<VkDevice>( m_device ),\n            reinterpret_cast<const VkVideoEncodeSessionParametersGetInfoKHR *>( &videoSessionParametersInfo ),\n            reinterpret_cast<VkVideoEncodeSessionParametersFeedbackInfoKHR *>( &feedbackInfo ),\n            &dataSize,\n            reinterpret_cast<void *>( data.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getEncodedVideoSessionParametersKHR\" );\n\n      return data_;\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::encodeVideoKHR( const VULKAN_HPP_NAMESPACE::VideoEncodeInfoKHR & encodeInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdEncodeVideoKHR && \"Function <vkCmdEncodeVideoKHR> requires <VK_KHR_video_encode_queue>\" );\n\n      getDispatcher()->vkCmdEncodeVideoKHR( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkVideoEncodeInfoKHR *>( &encodeInfo ) );\n    }\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n    //=== VK_NV_cuda_kernel_launch ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CudaModuleNV>::Type\n      Device::createCudaModuleNV( VULKAN_HPP_NAMESPACE::CudaModuleCreateInfoNV const &                            createInfo,\n                                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::CudaModuleNV module;\n      VULKAN_HPP_NAMESPACE::Result       result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateCudaModuleNV(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkCudaModuleCreateInfoNV *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkCudaModuleNV *>( &module ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#    if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#    else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createCudaModuleNV\" );\n#    endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CudaModuleNV( *this, *reinterpret_cast<VkCudaModuleNV *>( &module ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<uint8_t> CudaModuleNV::getCache() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetCudaModuleCacheNV && \"Function <vkGetCudaModuleCacheNV> requires <VK_NV_cuda_kernel_launch>\" );\n\n      std::vector<uint8_t>         cacheData;\n      size_t                       cacheSize;\n      VULKAN_HPP_NAMESPACE::Result result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkGetCudaModuleCacheNV( static_cast<VkDevice>( m_device ), static_cast<VkCudaModuleNV>( m_module ), &cacheSize, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && cacheSize )\n        {\n          cacheData.resize( cacheSize );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetCudaModuleCacheNV(\n            static_cast<VkDevice>( m_device ), static_cast<VkCudaModuleNV>( m_module ), &cacheSize, reinterpret_cast<void *>( cacheData.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::CudaModuleNV::getCache\" );\n      VULKAN_HPP_ASSERT( cacheSize <= cacheData.size() );\n      if ( cacheSize < cacheData.size() )\n      {\n        cacheData.resize( cacheSize );\n      }\n      return cacheData;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CudaFunctionNV>::Type\n      Device::createCudaFunctionNV( VULKAN_HPP_NAMESPACE::CudaFunctionCreateInfoNV const &                          createInfo,\n                                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::CudaFunctionNV function;\n      VULKAN_HPP_NAMESPACE::Result         result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateCudaFunctionNV(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkCudaFunctionCreateInfoNV *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkCudaFunctionNV *>( &function ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#    if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#    else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createCudaFunctionNV\" );\n#    endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CudaFunctionNV( *this, *reinterpret_cast<VkCudaFunctionNV *>( &function ), allocator );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::cudaLaunchKernelNV( const VULKAN_HPP_NAMESPACE::CudaLaunchInfoNV & launchInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCudaLaunchKernelNV && \"Function <vkCmdCudaLaunchKernelNV> requires <VK_NV_cuda_kernel_launch>\" );\n\n      getDispatcher()->vkCmdCudaLaunchKernelNV( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkCudaLaunchInfoNV *>( &launchInfo ) );\n    }\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n    //=== VK_EXT_metal_objects ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ExportMetalObjectsInfoEXT Device::exportMetalObjectsEXT() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkExportMetalObjectsEXT && \"Function <vkExportMetalObjectsEXT> requires <VK_EXT_metal_objects>\" );\n\n      VULKAN_HPP_NAMESPACE::ExportMetalObjectsInfoEXT metalObjectsInfo;\n      getDispatcher()->vkExportMetalObjectsEXT( static_cast<VkDevice>( m_device ), reinterpret_cast<VkExportMetalObjectsInfoEXT *>( &metalObjectsInfo ) );\n\n      return metalObjectsInfo;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> Device::exportMetalObjectsEXT() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkExportMetalObjectsEXT && \"Function <vkExportMetalObjectsEXT> requires <VK_EXT_metal_objects>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>  structureChain;\n      VULKAN_HPP_NAMESPACE::ExportMetalObjectsInfoEXT & metalObjectsInfo = structureChain.template get<VULKAN_HPP_NAMESPACE::ExportMetalObjectsInfoEXT>();\n      getDispatcher()->vkExportMetalObjectsEXT( static_cast<VkDevice>( m_device ), reinterpret_cast<VkExportMetalObjectsInfoEXT *>( &metalObjectsInfo ) );\n\n      return structureChain;\n    }\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n    //=== VK_KHR_synchronization2 ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::setEvent2KHR( VULKAN_HPP_NAMESPACE::Event                  event,\n                                                        const VULKAN_HPP_NAMESPACE::DependencyInfo & dependencyInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetEvent2KHR && \"Function <vkCmdSetEvent2KHR> requires <VK_KHR_synchronization2> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetEvent2KHR(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkEvent>( event ), reinterpret_cast<const VkDependencyInfo *>( &dependencyInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::resetEvent2KHR( VULKAN_HPP_NAMESPACE::Event               event,\n                                                          VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stageMask ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdResetEvent2KHR && \"Function <vkCmdResetEvent2KHR> requires <VK_KHR_synchronization2> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdResetEvent2KHR(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkEvent>( event ), static_cast<VkPipelineStageFlags2>( stageMask ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::waitEvents2KHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Event> const &          events,\n                                     VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DependencyInfo> const & dependencyInfos ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdWaitEvents2KHR && \"Function <vkCmdWaitEvents2KHR> requires <VK_KHR_synchronization2> or <VK_VERSION_1_3>\" );\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( events.size() == dependencyInfos.size() );\n#  else\n      if ( events.size() != dependencyInfos.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::waitEvents2KHR: events.size() != dependencyInfos.size()\" );\n      }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n      getDispatcher()->vkCmdWaitEvents2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                            events.size(),\n                                            reinterpret_cast<const VkEvent *>( events.data() ),\n                                            reinterpret_cast<const VkDependencyInfo *>( dependencyInfos.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::pipelineBarrier2KHR( const VULKAN_HPP_NAMESPACE::DependencyInfo & dependencyInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdPipelineBarrier2KHR &&\n                         \"Function <vkCmdPipelineBarrier2KHR> requires <VK_KHR_synchronization2> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdPipelineBarrier2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                 reinterpret_cast<const VkDependencyInfo *>( &dependencyInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::writeTimestamp2KHR( VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stage,\n                                                              VULKAN_HPP_NAMESPACE::QueryPool           queryPool,\n                                                              uint32_t                                  query ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdWriteTimestamp2KHR &&\n                         \"Function <vkCmdWriteTimestamp2KHR> requires <VK_KHR_synchronization2> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdWriteTimestamp2KHR(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkPipelineStageFlags2>( stage ), static_cast<VkQueryPool>( queryPool ), query );\n    }\n\n    VULKAN_HPP_INLINE void Queue::submit2KHR( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SubmitInfo2> const & submits,\n                                              VULKAN_HPP_NAMESPACE::Fence                                                       fence ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkQueueSubmit2KHR && \"Function <vkQueueSubmit2KHR> requires <VK_KHR_synchronization2> or <VK_VERSION_1_3>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkQueueSubmit2KHR(\n        static_cast<VkQueue>( m_queue ), submits.size(), reinterpret_cast<const VkSubmitInfo2 *>( submits.data() ), static_cast<VkFence>( fence ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Queue::submit2KHR\" );\n    }\n\n    //=== VK_EXT_descriptor_buffer ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceSize DescriptorSetLayout::getSizeEXT() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDescriptorSetLayoutSizeEXT && \"Function <vkGetDescriptorSetLayoutSizeEXT> requires <VK_EXT_descriptor_buffer>\" );\n\n      VULKAN_HPP_NAMESPACE::DeviceSize layoutSizeInBytes;\n      getDispatcher()->vkGetDescriptorSetLayoutSizeEXT( static_cast<VkDevice>( m_device ),\n                                                        static_cast<VkDescriptorSetLayout>( m_descriptorSetLayout ),\n                                                        reinterpret_cast<VkDeviceSize *>( &layoutSizeInBytes ) );\n\n      return layoutSizeInBytes;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceSize\n                                           DescriptorSetLayout::getBindingOffsetEXT( uint32_t binding ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDescriptorSetLayoutBindingOffsetEXT &&\n                         \"Function <vkGetDescriptorSetLayoutBindingOffsetEXT> requires <VK_EXT_descriptor_buffer>\" );\n\n      VULKAN_HPP_NAMESPACE::DeviceSize offset;\n      getDispatcher()->vkGetDescriptorSetLayoutBindingOffsetEXT(\n        static_cast<VkDevice>( m_device ), static_cast<VkDescriptorSetLayout>( m_descriptorSetLayout ), binding, reinterpret_cast<VkDeviceSize *>( &offset ) );\n\n      return offset;\n    }\n\n    VULKAN_HPP_INLINE void Device::getDescriptorEXT( const VULKAN_HPP_NAMESPACE::DescriptorGetInfoEXT & descriptorInfo,\n                                                     size_t                                             dataSize,\n                                                     void *                                             pDescriptor ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDescriptorEXT && \"Function <vkGetDescriptorEXT> requires <VK_EXT_descriptor_buffer>\" );\n\n      getDispatcher()->vkGetDescriptorEXT(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkDescriptorGetInfoEXT *>( &descriptorInfo ), dataSize, pDescriptor );\n    }\n\n    template <typename DescriptorType>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE DescriptorType\n      Device::getDescriptorEXT( const VULKAN_HPP_NAMESPACE::DescriptorGetInfoEXT & descriptorInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDescriptorEXT && \"Function <vkGetDescriptorEXT> requires <VK_EXT_descriptor_buffer>\" );\n\n      DescriptorType descriptor;\n      getDispatcher()->vkGetDescriptorEXT( static_cast<VkDevice>( m_device ),\n                                           reinterpret_cast<const VkDescriptorGetInfoEXT *>( &descriptorInfo ),\n                                           sizeof( DescriptorType ),\n                                           reinterpret_cast<void *>( &descriptor ) );\n\n      return descriptor;\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::bindDescriptorBuffersEXT(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DescriptorBufferBindingInfoEXT> const & bindingInfos ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBindDescriptorBuffersEXT && \"Function <vkCmdBindDescriptorBuffersEXT> requires <VK_EXT_descriptor_buffer>\" );\n\n      getDispatcher()->vkCmdBindDescriptorBuffersEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                      bindingInfos.size(),\n                                                      reinterpret_cast<const VkDescriptorBufferBindingInfoEXT *>( bindingInfos.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::setDescriptorBufferOffsetsEXT( VULKAN_HPP_NAMESPACE::PipelineBindPoint                                          pipelineBindPoint,\n                                                    VULKAN_HPP_NAMESPACE::PipelineLayout                                             layout,\n                                                    uint32_t                                                                         firstSet,\n                                                    VULKAN_HPP_NAMESPACE::ArrayProxy<const uint32_t> const &                         bufferIndices,\n                                                    VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & offsets ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDescriptorBufferOffsetsEXT &&\n                         \"Function <vkCmdSetDescriptorBufferOffsetsEXT> requires <VK_EXT_descriptor_buffer>\" );\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( bufferIndices.size() == offsets.size() );\n#  else\n      if ( bufferIndices.size() != offsets.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::setDescriptorBufferOffsetsEXT: bufferIndices.size() != offsets.size()\" );\n      }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n      getDispatcher()->vkCmdSetDescriptorBufferOffsetsEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                           static_cast<VkPipelineBindPoint>( pipelineBindPoint ),\n                                                           static_cast<VkPipelineLayout>( layout ),\n                                                           firstSet,\n                                                           bufferIndices.size(),\n                                                           bufferIndices.data(),\n                                                           reinterpret_cast<const VkDeviceSize *>( offsets.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::bindDescriptorBufferEmbeddedSamplersEXT( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint,\n                                                                                   VULKAN_HPP_NAMESPACE::PipelineLayout    layout,\n                                                                                   uint32_t                                set ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBindDescriptorBufferEmbeddedSamplersEXT &&\n                         \"Function <vkCmdBindDescriptorBufferEmbeddedSamplersEXT> requires <VK_EXT_descriptor_buffer>\" );\n\n      getDispatcher()->vkCmdBindDescriptorBufferEmbeddedSamplersEXT(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkPipelineBindPoint>( pipelineBindPoint ), static_cast<VkPipelineLayout>( layout ), set );\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE DataType\n      Device::getBufferOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::BufferCaptureDescriptorDataInfoEXT & info ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetBufferOpaqueCaptureDescriptorDataEXT &&\n                         \"Function <vkGetBufferOpaqueCaptureDescriptorDataEXT> requires <VK_EXT_descriptor_buffer>\" );\n\n      DataType                     data;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetBufferOpaqueCaptureDescriptorDataEXT(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkBufferCaptureDescriptorDataInfoEXT *>( &info ), &data ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getBufferOpaqueCaptureDescriptorDataEXT\" );\n\n      return data;\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE DataType\n      Device::getImageOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::ImageCaptureDescriptorDataInfoEXT & info ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetImageOpaqueCaptureDescriptorDataEXT &&\n                         \"Function <vkGetImageOpaqueCaptureDescriptorDataEXT> requires <VK_EXT_descriptor_buffer>\" );\n\n      DataType                     data;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetImageOpaqueCaptureDescriptorDataEXT(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkImageCaptureDescriptorDataInfoEXT *>( &info ), &data ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getImageOpaqueCaptureDescriptorDataEXT\" );\n\n      return data;\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE DataType\n      Device::getImageViewOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::ImageViewCaptureDescriptorDataInfoEXT & info ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetImageViewOpaqueCaptureDescriptorDataEXT &&\n                         \"Function <vkGetImageViewOpaqueCaptureDescriptorDataEXT> requires <VK_EXT_descriptor_buffer>\" );\n\n      DataType                     data;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetImageViewOpaqueCaptureDescriptorDataEXT(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkImageViewCaptureDescriptorDataInfoEXT *>( &info ), &data ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getImageViewOpaqueCaptureDescriptorDataEXT\" );\n\n      return data;\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE DataType\n      Device::getSamplerOpaqueCaptureDescriptorDataEXT( const VULKAN_HPP_NAMESPACE::SamplerCaptureDescriptorDataInfoEXT & info ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetSamplerOpaqueCaptureDescriptorDataEXT &&\n                         \"Function <vkGetSamplerOpaqueCaptureDescriptorDataEXT> requires <VK_EXT_descriptor_buffer>\" );\n\n      DataType                     data;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetSamplerOpaqueCaptureDescriptorDataEXT(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkSamplerCaptureDescriptorDataInfoEXT *>( &info ), &data ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getSamplerOpaqueCaptureDescriptorDataEXT\" );\n\n      return data;\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE DataType Device::getAccelerationStructureOpaqueCaptureDescriptorDataEXT(\n      const VULKAN_HPP_NAMESPACE::AccelerationStructureCaptureDescriptorDataInfoEXT & info ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT &&\n                         \"Function <vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT> requires <VK_EXT_descriptor_buffer>\" );\n\n      DataType                     data;\n      VULKAN_HPP_NAMESPACE::Result result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT(\n          static_cast<VkDevice>( m_device ), reinterpret_cast<const VkAccelerationStructureCaptureDescriptorDataInfoEXT *>( &info ), &data ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getAccelerationStructureOpaqueCaptureDescriptorDataEXT\" );\n\n      return data;\n    }\n\n    //=== VK_NV_fragment_shading_rate_enums ===\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::setFragmentShadingRateEnumNV( VULKAN_HPP_NAMESPACE::FragmentShadingRateNV                  shadingRate,\n                                                   const VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR combinerOps[2] ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetFragmentShadingRateEnumNV &&\n                         \"Function <vkCmdSetFragmentShadingRateEnumNV> requires <VK_NV_fragment_shading_rate_enums>\" );\n\n      getDispatcher()->vkCmdSetFragmentShadingRateEnumNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                          static_cast<VkFragmentShadingRateNV>( shadingRate ),\n                                                          reinterpret_cast<const VkFragmentShadingRateCombinerOpKHR *>( combinerOps ) );\n    }\n\n    //=== VK_EXT_mesh_shader ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::drawMeshTasksEXT( uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDrawMeshTasksEXT && \"Function <vkCmdDrawMeshTasksEXT> requires <VK_EXT_mesh_shader>\" );\n\n      getDispatcher()->vkCmdDrawMeshTasksEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), groupCountX, groupCountY, groupCountZ );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::drawMeshTasksIndirectEXT( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                                    VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                                    uint32_t                         drawCount,\n                                                                    uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDrawMeshTasksIndirectEXT && \"Function <vkCmdDrawMeshTasksIndirectEXT> requires <VK_EXT_mesh_shader>\" );\n\n      getDispatcher()->vkCmdDrawMeshTasksIndirectEXT(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBuffer>( buffer ), static_cast<VkDeviceSize>( offset ), drawCount, stride );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::drawMeshTasksIndirectCountEXT( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                                         VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                                         VULKAN_HPP_NAMESPACE::Buffer     countBuffer,\n                                                                         VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,\n                                                                         uint32_t                         maxDrawCount,\n                                                                         uint32_t                         stride ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDrawMeshTasksIndirectCountEXT && \"Function <vkCmdDrawMeshTasksIndirectCountEXT> requires <VK_EXT_mesh_shader>\" );\n\n      getDispatcher()->vkCmdDrawMeshTasksIndirectCountEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                           static_cast<VkBuffer>( buffer ),\n                                                           static_cast<VkDeviceSize>( offset ),\n                                                           static_cast<VkBuffer>( countBuffer ),\n                                                           static_cast<VkDeviceSize>( countBufferOffset ),\n                                                           maxDrawCount,\n                                                           stride );\n    }\n\n    //=== VK_KHR_copy_commands2 ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::copyBuffer2KHR( const VULKAN_HPP_NAMESPACE::CopyBufferInfo2 & copyBufferInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCopyBuffer2KHR && \"Function <vkCmdCopyBuffer2KHR> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdCopyBuffer2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkCopyBufferInfo2 *>( &copyBufferInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::copyImage2KHR( const VULKAN_HPP_NAMESPACE::CopyImageInfo2 & copyImageInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCopyImage2KHR && \"Function <vkCmdCopyImage2KHR> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdCopyImage2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkCopyImageInfo2 *>( &copyImageInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::copyBufferToImage2KHR( const VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2 & copyBufferToImageInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCopyBufferToImage2KHR &&\n                         \"Function <vkCmdCopyBufferToImage2KHR> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdCopyBufferToImage2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                   reinterpret_cast<const VkCopyBufferToImageInfo2 *>( &copyBufferToImageInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::copyImageToBuffer2KHR( const VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2 & copyImageToBufferInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCopyImageToBuffer2KHR &&\n                         \"Function <vkCmdCopyImageToBuffer2KHR> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdCopyImageToBuffer2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                   reinterpret_cast<const VkCopyImageToBufferInfo2 *>( &copyImageToBufferInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::blitImage2KHR( const VULKAN_HPP_NAMESPACE::BlitImageInfo2 & blitImageInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBlitImage2KHR && \"Function <vkCmdBlitImage2KHR> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdBlitImage2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkBlitImageInfo2 *>( &blitImageInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::resolveImage2KHR( const VULKAN_HPP_NAMESPACE::ResolveImageInfo2 & resolveImageInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdResolveImage2KHR && \"Function <vkCmdResolveImage2KHR> requires <VK_KHR_copy_commands2> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdResolveImage2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                              reinterpret_cast<const VkResolveImageInfo2 *>( &resolveImageInfo ) );\n    }\n\n    //=== VK_EXT_device_fault ===\n    template <typename Dispatch>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getFaultInfoEXT( VULKAN_HPP_NAMESPACE::DeviceFaultCountsEXT * pFaultCounts,\n                                                                           VULKAN_HPP_NAMESPACE::DeviceFaultInfoEXT *   pFaultInfo,\n                                                                           Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );\n      return static_cast<Result>( d.vkGetDeviceFaultInfoEXT( static_cast<VkDevice>( m_device ),\n                                                             reinterpret_cast<VkDeviceFaultCountsEXT *>( pFaultCounts ),\n                                                             reinterpret_cast<VkDeviceFaultInfoEXT *>( pFaultInfo ) ) );\n    }\n#  if defined( VK_USE_PLATFORM_WIN32_KHR )\n    //=== VK_NV_acquire_winrt_display ===\n\n    VULKAN_HPP_INLINE void DisplayKHR::acquireWinrtNV() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkAcquireWinrtDisplayNV && \"Function <vkAcquireWinrtDisplayNV> requires <VK_NV_acquire_winrt_display>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkAcquireWinrtDisplayNV( static_cast<VkPhysicalDevice>( m_physicalDevice ), static_cast<VkDisplayKHR>( m_display ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::DisplayKHR::acquireWinrtNV\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR>::Type\n      PhysicalDevice::getWinrtDisplayNV( uint32_t deviceRelativeId ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::DisplayKHR display;\n      VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetWinrtDisplayNV(\n        static_cast<VkPhysicalDevice>( m_physicalDevice ), deviceRelativeId, reinterpret_cast<VkDisplayKHR *>( &display ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#    if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#    else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"PhysicalDevice::getWinrtDisplayNV\" );\n#    endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR( *this, *reinterpret_cast<VkDisplayKHR *>( &display ) );\n    }\n#  endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#  if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n    //=== VK_EXT_directfb_surface ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n      Instance::createDirectFBSurfaceEXT( VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateInfoEXT const &                      createInfo,\n                                          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n      VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateDirectFBSurfaceEXT(\n        static_cast<VkInstance>( m_instance ),\n        reinterpret_cast<const VkDirectFBSurfaceCreateInfoEXT *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#    if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#    else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Instance::createDirectFBSurfaceEXT\" );\n#    endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR( *this, *reinterpret_cast<VkSurfaceKHR *>( &surface ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Bool32\n      PhysicalDevice::getDirectFBPresentationSupportEXT( uint32_t queueFamilyIndex, IDirectFB & dfb ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceDirectFBPresentationSupportEXT &&\n                         \"Function <vkGetPhysicalDeviceDirectFBPresentationSupportEXT> requires <VK_EXT_directfb_surface>\" );\n\n      VkBool32 result =\n        getDispatcher()->vkGetPhysicalDeviceDirectFBPresentationSupportEXT( static_cast<VkPhysicalDevice>( m_physicalDevice ), queueFamilyIndex, &dfb );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Bool32>( result );\n    }\n#  endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n\n    //=== VK_EXT_vertex_input_dynamic_state ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::setVertexInputEXT(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::VertexInputBindingDescription2EXT> const &   vertexBindingDescriptions,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription2EXT> const & vertexAttributeDescriptions ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetVertexInputEXT &&\n                         \"Function <vkCmdSetVertexInputEXT> requires <VK_EXT_shader_object> or <VK_EXT_vertex_input_dynamic_state>\" );\n\n      getDispatcher()->vkCmdSetVertexInputEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                               vertexBindingDescriptions.size(),\n                                               reinterpret_cast<const VkVertexInputBindingDescription2EXT *>( vertexBindingDescriptions.data() ),\n                                               vertexAttributeDescriptions.size(),\n                                               reinterpret_cast<const VkVertexInputAttributeDescription2EXT *>( vertexAttributeDescriptions.data() ) );\n    }\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n    //=== VK_FUCHSIA_external_memory ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE zx_handle_t\n      Device::getMemoryZirconHandleFUCHSIA( const VULKAN_HPP_NAMESPACE::MemoryGetZirconHandleInfoFUCHSIA & getZirconHandleInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetMemoryZirconHandleFUCHSIA && \"Function <vkGetMemoryZirconHandleFUCHSIA> requires <VK_FUCHSIA_external_memory>\" );\n\n      zx_handle_t                  zirconHandle;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetMemoryZirconHandleFUCHSIA(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkMemoryGetZirconHandleInfoFUCHSIA *>( &getZirconHandleInfo ), &zirconHandle ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getMemoryZirconHandleFUCHSIA\" );\n\n      return zirconHandle;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryZirconHandlePropertiesFUCHSIA\n      Device::getMemoryZirconHandlePropertiesFUCHSIA( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType, zx_handle_t zirconHandle ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetMemoryZirconHandlePropertiesFUCHSIA &&\n                         \"Function <vkGetMemoryZirconHandlePropertiesFUCHSIA> requires <VK_FUCHSIA_external_memory>\" );\n\n      VULKAN_HPP_NAMESPACE::MemoryZirconHandlePropertiesFUCHSIA memoryZirconHandleProperties;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetMemoryZirconHandlePropertiesFUCHSIA(\n        static_cast<VkDevice>( m_device ),\n        static_cast<VkExternalMemoryHandleTypeFlagBits>( handleType ),\n        zirconHandle,\n        reinterpret_cast<VkMemoryZirconHandlePropertiesFUCHSIA *>( &memoryZirconHandleProperties ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getMemoryZirconHandlePropertiesFUCHSIA\" );\n\n      return memoryZirconHandleProperties;\n    }\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n    //=== VK_FUCHSIA_external_semaphore ===\n\n    VULKAN_HPP_INLINE void\n      Device::importSemaphoreZirconHandleFUCHSIA( const VULKAN_HPP_NAMESPACE::ImportSemaphoreZirconHandleInfoFUCHSIA & importSemaphoreZirconHandleInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkImportSemaphoreZirconHandleFUCHSIA &&\n                         \"Function <vkImportSemaphoreZirconHandleFUCHSIA> requires <VK_FUCHSIA_external_semaphore>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkImportSemaphoreZirconHandleFUCHSIA(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkImportSemaphoreZirconHandleInfoFUCHSIA *>( &importSemaphoreZirconHandleInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::importSemaphoreZirconHandleFUCHSIA\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE zx_handle_t\n      Device::getSemaphoreZirconHandleFUCHSIA( const VULKAN_HPP_NAMESPACE::SemaphoreGetZirconHandleInfoFUCHSIA & getZirconHandleInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetSemaphoreZirconHandleFUCHSIA &&\n                         \"Function <vkGetSemaphoreZirconHandleFUCHSIA> requires <VK_FUCHSIA_external_semaphore>\" );\n\n      zx_handle_t                  zirconHandle;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetSemaphoreZirconHandleFUCHSIA(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkSemaphoreGetZirconHandleInfoFUCHSIA *>( &getZirconHandleInfo ), &zirconHandle ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getSemaphoreZirconHandleFUCHSIA\" );\n\n      return zirconHandle;\n    }\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n    //=== VK_FUCHSIA_buffer_collection ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::BufferCollectionFUCHSIA>::Type\n      Device::createBufferCollectionFUCHSIA( VULKAN_HPP_NAMESPACE::BufferCollectionCreateInfoFUCHSIA const &                 createInfo,\n                                             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA collection;\n      VULKAN_HPP_NAMESPACE::Result                  result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateBufferCollectionFUCHSIA(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkBufferCollectionCreateInfoFUCHSIA *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkBufferCollectionFUCHSIA *>( &collection ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#    if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#    else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createBufferCollectionFUCHSIA\" );\n#    endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::BufferCollectionFUCHSIA(\n        *this, *reinterpret_cast<VkBufferCollectionFUCHSIA *>( &collection ), allocator );\n    }\n\n    VULKAN_HPP_INLINE void BufferCollectionFUCHSIA::setImageConstraints( const VULKAN_HPP_NAMESPACE::ImageConstraintsInfoFUCHSIA & imageConstraintsInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkSetBufferCollectionImageConstraintsFUCHSIA &&\n                         \"Function <vkSetBufferCollectionImageConstraintsFUCHSIA> requires <VK_FUCHSIA_buffer_collection>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkSetBufferCollectionImageConstraintsFUCHSIA( static_cast<VkDevice>( m_device ),\n                                                                       static_cast<VkBufferCollectionFUCHSIA>( m_collection ),\n                                                                       reinterpret_cast<const VkImageConstraintsInfoFUCHSIA *>( &imageConstraintsInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::BufferCollectionFUCHSIA::setImageConstraints\" );\n    }\n\n    VULKAN_HPP_INLINE void\n      BufferCollectionFUCHSIA::setBufferConstraints( const VULKAN_HPP_NAMESPACE::BufferConstraintsInfoFUCHSIA & bufferConstraintsInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkSetBufferCollectionBufferConstraintsFUCHSIA &&\n                         \"Function <vkSetBufferCollectionBufferConstraintsFUCHSIA> requires <VK_FUCHSIA_buffer_collection>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkSetBufferCollectionBufferConstraintsFUCHSIA( static_cast<VkDevice>( m_device ),\n                                                                        static_cast<VkBufferCollectionFUCHSIA>( m_collection ),\n                                                                        reinterpret_cast<const VkBufferConstraintsInfoFUCHSIA *>( &bufferConstraintsInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::BufferCollectionFUCHSIA::setBufferConstraints\" );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::BufferCollectionPropertiesFUCHSIA BufferCollectionFUCHSIA::getProperties() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetBufferCollectionPropertiesFUCHSIA &&\n                         \"Function <vkGetBufferCollectionPropertiesFUCHSIA> requires <VK_FUCHSIA_buffer_collection>\" );\n\n      VULKAN_HPP_NAMESPACE::BufferCollectionPropertiesFUCHSIA properties;\n      VULKAN_HPP_NAMESPACE::Result                            result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetBufferCollectionPropertiesFUCHSIA( static_cast<VkDevice>( m_device ),\n                                                                 static_cast<VkBufferCollectionFUCHSIA>( m_collection ),\n                                                                 reinterpret_cast<VkBufferCollectionPropertiesFUCHSIA *>( &properties ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::BufferCollectionFUCHSIA::getProperties\" );\n\n      return properties;\n    }\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n    //=== VK_HUAWEI_subpass_shading ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Extent2D RenderPass::getSubpassShadingMaxWorkgroupSizeHUAWEI() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI &&\n                         \"Function <vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI> requires <VK_HUAWEI_subpass_shading>\" );\n\n      VULKAN_HPP_NAMESPACE::Extent2D maxWorkgroupSize;\n      VULKAN_HPP_NAMESPACE::Result   result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(\n        static_cast<VkDevice>( m_device ), static_cast<VkRenderPass>( m_renderPass ), reinterpret_cast<VkExtent2D *>( &maxWorkgroupSize ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::RenderPass::getSubpassShadingMaxWorkgroupSizeHUAWEI\" );\n\n      return maxWorkgroupSize;\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::subpassShadingHUAWEI() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSubpassShadingHUAWEI && \"Function <vkCmdSubpassShadingHUAWEI> requires <VK_HUAWEI_subpass_shading>\" );\n\n      getDispatcher()->vkCmdSubpassShadingHUAWEI( static_cast<VkCommandBuffer>( m_commandBuffer ) );\n    }\n\n    //=== VK_HUAWEI_invocation_mask ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::bindInvocationMaskHUAWEI( VULKAN_HPP_NAMESPACE::ImageView   imageView,\n                                                                    VULKAN_HPP_NAMESPACE::ImageLayout imageLayout ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBindInvocationMaskHUAWEI && \"Function <vkCmdBindInvocationMaskHUAWEI> requires <VK_HUAWEI_invocation_mask>\" );\n\n      getDispatcher()->vkCmdBindInvocationMaskHUAWEI(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkImageView>( imageView ), static_cast<VkImageLayout>( imageLayout ) );\n    }\n\n    //=== VK_NV_external_memory_rdma ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::RemoteAddressNV\n      Device::getMemoryRemoteAddressNV( const VULKAN_HPP_NAMESPACE::MemoryGetRemoteAddressInfoNV & memoryGetRemoteAddressInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetMemoryRemoteAddressNV && \"Function <vkGetMemoryRemoteAddressNV> requires <VK_NV_external_memory_rdma>\" );\n\n      VULKAN_HPP_NAMESPACE::RemoteAddressNV address;\n      VULKAN_HPP_NAMESPACE::Result          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetMemoryRemoteAddressNV( static_cast<VkDevice>( m_device ),\n                                                     reinterpret_cast<const VkMemoryGetRemoteAddressInfoNV *>( &memoryGetRemoteAddressInfo ),\n                                                     reinterpret_cast<VkRemoteAddressNV *>( &address ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getMemoryRemoteAddressNV\" );\n\n      return address;\n    }\n\n    //=== VK_EXT_pipeline_properties ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::BaseOutStructure\n                                           Device::getPipelinePropertiesEXT( const VULKAN_HPP_NAMESPACE::PipelineInfoEXT & pipelineInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPipelinePropertiesEXT && \"Function <vkGetPipelinePropertiesEXT> requires <VK_EXT_pipeline_properties>\" );\n\n      VULKAN_HPP_NAMESPACE::BaseOutStructure pipelineProperties;\n      VULKAN_HPP_NAMESPACE::Result           result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetPipelinePropertiesEXT( static_cast<VkDevice>( m_device ),\n                                                     reinterpret_cast<const VkPipelineInfoEXT *>( &pipelineInfo ),\n                                                     reinterpret_cast<VkBaseOutStructure *>( &pipelineProperties ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getPipelinePropertiesEXT\" );\n\n      return pipelineProperties;\n    }\n\n    //=== VK_EXT_extended_dynamic_state2 ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::setPatchControlPointsEXT( uint32_t patchControlPoints ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetPatchControlPointsEXT &&\n                         \"Function <vkCmdSetPatchControlPointsEXT> requires <VK_EXT_extended_dynamic_state2> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetPatchControlPointsEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), patchControlPoints );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setRasterizerDiscardEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 rasterizerDiscardEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT(\n        getDispatcher()->vkCmdSetRasterizerDiscardEnableEXT &&\n        \"Function <vkCmdSetRasterizerDiscardEnableEXT> requires <VK_EXT_extended_dynamic_state2> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetRasterizerDiscardEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( rasterizerDiscardEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setDepthBiasEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthBiasEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDepthBiasEnableEXT &&\n                         \"Function <vkCmdSetDepthBiasEnableEXT> requires <VK_EXT_extended_dynamic_state2> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetDepthBiasEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( depthBiasEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setLogicOpEXT( VULKAN_HPP_NAMESPACE::LogicOp logicOp ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetLogicOpEXT &&\n                         \"Function <vkCmdSetLogicOpEXT> requires <VK_EXT_extended_dynamic_state2> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetLogicOpEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkLogicOp>( logicOp ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setPrimitiveRestartEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 primitiveRestartEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT(\n        getDispatcher()->vkCmdSetPrimitiveRestartEnableEXT &&\n        \"Function <vkCmdSetPrimitiveRestartEnableEXT> requires <VK_EXT_extended_dynamic_state2> or <VK_EXT_shader_object> or <VK_VERSION_1_3>\" );\n\n      getDispatcher()->vkCmdSetPrimitiveRestartEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( primitiveRestartEnable ) );\n    }\n\n#  if defined( VK_USE_PLATFORM_SCREEN_QNX )\n    //=== VK_QNX_screen_surface ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR>::Type\n      Instance::createScreenSurfaceQNX( VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateInfoQNX const &                        createInfo,\n                                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::SurfaceKHR surface;\n      VULKAN_HPP_NAMESPACE::Result     result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateScreenSurfaceQNX(\n        static_cast<VkInstance>( m_instance ),\n        reinterpret_cast<const VkScreenSurfaceCreateInfoQNX *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkSurfaceKHR *>( &surface ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#    if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#    else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Instance::createScreenSurfaceQNX\" );\n#    endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR( *this, *reinterpret_cast<VkSurfaceKHR *>( &surface ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Bool32\n      PhysicalDevice::getScreenPresentationSupportQNX( uint32_t queueFamilyIndex, struct _screen_window & window ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceScreenPresentationSupportQNX &&\n                         \"Function <vkGetPhysicalDeviceScreenPresentationSupportQNX> requires <VK_QNX_screen_surface>\" );\n\n      VkBool32 result =\n        getDispatcher()->vkGetPhysicalDeviceScreenPresentationSupportQNX( static_cast<VkPhysicalDevice>( m_physicalDevice ), queueFamilyIndex, &window );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Bool32>( result );\n    }\n#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n    //=== VK_EXT_color_write_enable ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::setColorWriteEnableEXT(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Bool32> const & colorWriteEnables ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetColorWriteEnableEXT && \"Function <vkCmdSetColorWriteEnableEXT> requires <VK_EXT_color_write_enable>\" );\n\n      getDispatcher()->vkCmdSetColorWriteEnableEXT(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), colorWriteEnables.size(), reinterpret_cast<const VkBool32 *>( colorWriteEnables.data() ) );\n    }\n\n    //=== VK_KHR_ray_tracing_maintenance1 ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::traceRaysIndirect2KHR( VULKAN_HPP_NAMESPACE::DeviceAddress indirectDeviceAddress ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdTraceRaysIndirect2KHR && \"Function <vkCmdTraceRaysIndirect2KHR> requires <VK_KHR_ray_tracing_maintenance1>\" );\n\n      getDispatcher()->vkCmdTraceRaysIndirect2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkDeviceAddress>( indirectDeviceAddress ) );\n    }\n\n    //=== VK_EXT_multi_draw ===\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::drawMultiEXT( VULKAN_HPP_NAMESPACE::StridedArrayProxy<const VULKAN_HPP_NAMESPACE::MultiDrawInfoEXT> const & vertexInfo,\n                                   uint32_t                                                                                      instanceCount,\n                                   uint32_t firstInstance ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDrawMultiEXT && \"Function <vkCmdDrawMultiEXT> requires <VK_EXT_multi_draw>\" );\n\n      getDispatcher()->vkCmdDrawMultiEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                          vertexInfo.size(),\n                                          reinterpret_cast<const VkMultiDrawInfoEXT *>( vertexInfo.data() ),\n                                          instanceCount,\n                                          firstInstance,\n                                          vertexInfo.stride() );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::drawMultiIndexedEXT( VULKAN_HPP_NAMESPACE::StridedArrayProxy<const VULKAN_HPP_NAMESPACE::MultiDrawIndexedInfoEXT> const & indexInfo,\n                                          uint32_t                                                                                             instanceCount,\n                                          uint32_t                                                                                             firstInstance,\n                                          Optional<const int32_t> vertexOffset ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDrawMultiIndexedEXT && \"Function <vkCmdDrawMultiIndexedEXT> requires <VK_EXT_multi_draw>\" );\n\n      getDispatcher()->vkCmdDrawMultiIndexedEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                 indexInfo.size(),\n                                                 reinterpret_cast<const VkMultiDrawIndexedInfoEXT *>( indexInfo.data() ),\n                                                 instanceCount,\n                                                 firstInstance,\n                                                 indexInfo.stride(),\n                                                 static_cast<const int32_t *>( vertexOffset ) );\n    }\n\n    //=== VK_EXT_opacity_micromap ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::MicromapEXT>::Type\n      Device::createMicromapEXT( VULKAN_HPP_NAMESPACE::MicromapCreateInfoEXT const &                             createInfo,\n                                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::MicromapEXT micromap;\n      VULKAN_HPP_NAMESPACE::Result      result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateMicromapEXT(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkMicromapCreateInfoEXT *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkMicromapEXT *>( &micromap ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createMicromapEXT\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::MicromapEXT( *this, *reinterpret_cast<VkMicromapEXT *>( &micromap ), allocator );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::buildMicromapsEXT(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MicromapBuildInfoEXT> const & infos ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBuildMicromapsEXT && \"Function <vkCmdBuildMicromapsEXT> requires <VK_EXT_opacity_micromap>\" );\n\n      getDispatcher()->vkCmdBuildMicromapsEXT(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), infos.size(), reinterpret_cast<const VkMicromapBuildInfoEXT *>( infos.data() ) );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result\n                                           Device::buildMicromapsEXT( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                                                 deferredOperation,\n                                 VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MicromapBuildInfoEXT> const & infos ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkBuildMicromapsEXT && \"Function <vkBuildMicromapsEXT> requires <VK_EXT_opacity_micromap>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkBuildMicromapsEXT( static_cast<VkDevice>( m_device ),\n                                                                                         static_cast<VkDeferredOperationKHR>( deferredOperation ),\n                                                                                         infos.size(),\n                                                                                         reinterpret_cast<const VkMicromapBuildInfoEXT *>( infos.data() ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                                 VULKAN_HPP_NAMESPACE_STRING \"::Device::buildMicromapsEXT\",\n                                                 { VULKAN_HPP_NAMESPACE::Result::eSuccess,\n                                                   VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR,\n                                                   VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR } );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result Device::copyMicromapEXT( VULKAN_HPP_NAMESPACE::DeferredOperationKHR deferredOperation,\n                                                                                                 const VULKAN_HPP_NAMESPACE::CopyMicromapInfoEXT & info ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCopyMicromapEXT && \"Function <vkCopyMicromapEXT> requires <VK_EXT_opacity_micromap>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCopyMicromapEXT( static_cast<VkDevice>( m_device ),\n                                                                                       static_cast<VkDeferredOperationKHR>( deferredOperation ),\n                                                                                       reinterpret_cast<const VkCopyMicromapInfoEXT *>( &info ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                                 VULKAN_HPP_NAMESPACE_STRING \"::Device::copyMicromapEXT\",\n                                                 { VULKAN_HPP_NAMESPACE::Result::eSuccess,\n                                                   VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR,\n                                                   VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR } );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result\n                                           Device::copyMicromapToMemoryEXT( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                deferredOperation,\n                                       const VULKAN_HPP_NAMESPACE::CopyMicromapToMemoryInfoEXT & info ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCopyMicromapToMemoryEXT && \"Function <vkCopyMicromapToMemoryEXT> requires <VK_EXT_opacity_micromap>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkCopyMicromapToMemoryEXT( static_cast<VkDevice>( m_device ),\n                                                    static_cast<VkDeferredOperationKHR>( deferredOperation ),\n                                                    reinterpret_cast<const VkCopyMicromapToMemoryInfoEXT *>( &info ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                                 VULKAN_HPP_NAMESPACE_STRING \"::Device::copyMicromapToMemoryEXT\",\n                                                 { VULKAN_HPP_NAMESPACE::Result::eSuccess,\n                                                   VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR,\n                                                   VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR } );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result\n                                           Device::copyMemoryToMicromapEXT( VULKAN_HPP_NAMESPACE::DeferredOperationKHR                deferredOperation,\n                                       const VULKAN_HPP_NAMESPACE::CopyMemoryToMicromapInfoEXT & info ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCopyMemoryToMicromapEXT && \"Function <vkCopyMemoryToMicromapEXT> requires <VK_EXT_opacity_micromap>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkCopyMemoryToMicromapEXT( static_cast<VkDevice>( m_device ),\n                                                    static_cast<VkDeferredOperationKHR>( deferredOperation ),\n                                                    reinterpret_cast<const VkCopyMemoryToMicromapInfoEXT *>( &info ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                                 VULKAN_HPP_NAMESPACE_STRING \"::Device::copyMemoryToMicromapEXT\",\n                                                 { VULKAN_HPP_NAMESPACE::Result::eSuccess,\n                                                   VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR,\n                                                   VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR } );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<DataType>\n      Device::writeMicromapsPropertiesEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MicromapEXT> const & micromaps,\n                                           VULKAN_HPP_NAMESPACE::QueryType                                                   queryType,\n                                           size_t                                                                            dataSize,\n                                           size_t                                                                            stride ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkWriteMicromapsPropertiesEXT && \"Function <vkWriteMicromapsPropertiesEXT> requires <VK_EXT_opacity_micromap>\" );\n\n      VULKAN_HPP_ASSERT( dataSize % sizeof( DataType ) == 0 );\n      std::vector<DataType>        data( dataSize / sizeof( DataType ) );\n      VULKAN_HPP_NAMESPACE::Result result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkWriteMicromapsPropertiesEXT( static_cast<VkDevice>( m_device ),\n                                                                                                   micromaps.size(),\n                                                                                                   reinterpret_cast<const VkMicromapEXT *>( micromaps.data() ),\n                                                                                                   static_cast<VkQueryType>( queryType ),\n                                                                                                   data.size() * sizeof( DataType ),\n                                                                                                   reinterpret_cast<void *>( data.data() ),\n                                                                                                   stride ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::writeMicromapsPropertiesEXT\" );\n\n      return data;\n    }\n\n    template <typename DataType>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE DataType\n      Device::writeMicromapsPropertyEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MicromapEXT> const & micromaps,\n                                         VULKAN_HPP_NAMESPACE::QueryType                                                   queryType,\n                                         size_t                                                                            stride ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkWriteMicromapsPropertiesEXT && \"Function <vkWriteMicromapsPropertiesEXT> requires <VK_EXT_opacity_micromap>\" );\n\n      DataType                     data;\n      VULKAN_HPP_NAMESPACE::Result result =\n        static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkWriteMicromapsPropertiesEXT( static_cast<VkDevice>( m_device ),\n                                                                                                   micromaps.size(),\n                                                                                                   reinterpret_cast<const VkMicromapEXT *>( micromaps.data() ),\n                                                                                                   static_cast<VkQueryType>( queryType ),\n                                                                                                   sizeof( DataType ),\n                                                                                                   reinterpret_cast<void *>( &data ),\n                                                                                                   stride ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::writeMicromapsPropertyEXT\" );\n\n      return data;\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::copyMicromapEXT( const VULKAN_HPP_NAMESPACE::CopyMicromapInfoEXT & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCopyMicromapEXT && \"Function <vkCmdCopyMicromapEXT> requires <VK_EXT_opacity_micromap>\" );\n\n      getDispatcher()->vkCmdCopyMicromapEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkCopyMicromapInfoEXT *>( &info ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::copyMicromapToMemoryEXT( const VULKAN_HPP_NAMESPACE::CopyMicromapToMemoryInfoEXT & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCopyMicromapToMemoryEXT && \"Function <vkCmdCopyMicromapToMemoryEXT> requires <VK_EXT_opacity_micromap>\" );\n\n      getDispatcher()->vkCmdCopyMicromapToMemoryEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                     reinterpret_cast<const VkCopyMicromapToMemoryInfoEXT *>( &info ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::copyMemoryToMicromapEXT( const VULKAN_HPP_NAMESPACE::CopyMemoryToMicromapInfoEXT & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCopyMemoryToMicromapEXT && \"Function <vkCmdCopyMemoryToMicromapEXT> requires <VK_EXT_opacity_micromap>\" );\n\n      getDispatcher()->vkCmdCopyMemoryToMicromapEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                     reinterpret_cast<const VkCopyMemoryToMicromapInfoEXT *>( &info ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::writeMicromapsPropertiesEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::MicromapEXT> const & micromaps,\n                                                  VULKAN_HPP_NAMESPACE::QueryType                                                   queryType,\n                                                  VULKAN_HPP_NAMESPACE::QueryPool                                                   queryPool,\n                                                  uint32_t firstQuery ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdWriteMicromapsPropertiesEXT &&\n                         \"Function <vkCmdWriteMicromapsPropertiesEXT> requires <VK_EXT_opacity_micromap>\" );\n\n      getDispatcher()->vkCmdWriteMicromapsPropertiesEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                         micromaps.size(),\n                                                         reinterpret_cast<const VkMicromapEXT *>( micromaps.data() ),\n                                                         static_cast<VkQueryType>( queryType ),\n                                                         static_cast<VkQueryPool>( queryPool ),\n                                                         firstQuery );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::AccelerationStructureCompatibilityKHR\n      Device::getMicromapCompatibilityEXT( const VULKAN_HPP_NAMESPACE::MicromapVersionInfoEXT & versionInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceMicromapCompatibilityEXT &&\n                         \"Function <vkGetDeviceMicromapCompatibilityEXT> requires <VK_EXT_opacity_micromap>\" );\n\n      VULKAN_HPP_NAMESPACE::AccelerationStructureCompatibilityKHR compatibility;\n      getDispatcher()->vkGetDeviceMicromapCompatibilityEXT( static_cast<VkDevice>( m_device ),\n                                                            reinterpret_cast<const VkMicromapVersionInfoEXT *>( &versionInfo ),\n                                                            reinterpret_cast<VkAccelerationStructureCompatibilityKHR *>( &compatibility ) );\n\n      return compatibility;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MicromapBuildSizesInfoEXT\n                                           Device::getMicromapBuildSizesEXT( VULKAN_HPP_NAMESPACE::AccelerationStructureBuildTypeKHR buildType,\n                                        const VULKAN_HPP_NAMESPACE::MicromapBuildInfoEXT &      buildInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetMicromapBuildSizesEXT && \"Function <vkGetMicromapBuildSizesEXT> requires <VK_EXT_opacity_micromap>\" );\n\n      VULKAN_HPP_NAMESPACE::MicromapBuildSizesInfoEXT sizeInfo;\n      getDispatcher()->vkGetMicromapBuildSizesEXT( static_cast<VkDevice>( m_device ),\n                                                   static_cast<VkAccelerationStructureBuildTypeKHR>( buildType ),\n                                                   reinterpret_cast<const VkMicromapBuildInfoEXT *>( &buildInfo ),\n                                                   reinterpret_cast<VkMicromapBuildSizesInfoEXT *>( &sizeInfo ) );\n\n      return sizeInfo;\n    }\n\n    //=== VK_HUAWEI_cluster_culling_shader ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::drawClusterHUAWEI( uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDrawClusterHUAWEI && \"Function <vkCmdDrawClusterHUAWEI> requires <VK_HUAWEI_cluster_culling_shader>\" );\n\n      getDispatcher()->vkCmdDrawClusterHUAWEI( static_cast<VkCommandBuffer>( m_commandBuffer ), groupCountX, groupCountY, groupCountZ );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::drawClusterIndirectHUAWEI( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                                     VULKAN_HPP_NAMESPACE::DeviceSize offset ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDrawClusterIndirectHUAWEI &&\n                         \"Function <vkCmdDrawClusterIndirectHUAWEI> requires <VK_HUAWEI_cluster_culling_shader>\" );\n\n      getDispatcher()->vkCmdDrawClusterIndirectHUAWEI(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBuffer>( buffer ), static_cast<VkDeviceSize>( offset ) );\n    }\n\n    //=== VK_EXT_pageable_device_local_memory ===\n\n    VULKAN_HPP_INLINE void DeviceMemory::setPriorityEXT( float priority ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkSetDeviceMemoryPriorityEXT &&\n                         \"Function <vkSetDeviceMemoryPriorityEXT> requires <VK_EXT_pageable_device_local_memory>\" );\n\n      getDispatcher()->vkSetDeviceMemoryPriorityEXT( static_cast<VkDevice>( m_device ), static_cast<VkDeviceMemory>( m_memory ), priority );\n    }\n\n    //=== VK_KHR_maintenance4 ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2\n      Device::getBufferMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceBufferMemoryRequirementsKHR &&\n                         \"Function <vkGetDeviceBufferMemoryRequirementsKHR> requires <VK_KHR_maintenance4> or <VK_VERSION_1_3>\" );\n\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;\n      getDispatcher()->vkGetDeviceBufferMemoryRequirementsKHR( static_cast<VkDevice>( m_device ),\n                                                               reinterpret_cast<const VkDeviceBufferMemoryRequirements *>( &info ),\n                                                               reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n      return memoryRequirements;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n      Device::getBufferMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceBufferMemoryRequirementsKHR &&\n                         \"Function <vkGetDeviceBufferMemoryRequirementsKHR> requires <VK_KHR_maintenance4> or <VK_VERSION_1_3>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2 &      memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();\n      getDispatcher()->vkGetDeviceBufferMemoryRequirementsKHR( static_cast<VkDevice>( m_device ),\n                                                               reinterpret_cast<const VkDeviceBufferMemoryRequirements *>( &info ),\n                                                               reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2\n      Device::getImageMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceImageMemoryRequirementsKHR &&\n                         \"Function <vkGetDeviceImageMemoryRequirementsKHR> requires <VK_KHR_maintenance4> or <VK_VERSION_1_3>\" );\n\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;\n      getDispatcher()->vkGetDeviceImageMemoryRequirementsKHR( static_cast<VkDevice>( m_device ),\n                                                              reinterpret_cast<const VkDeviceImageMemoryRequirements *>( &info ),\n                                                              reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n      return memoryRequirements;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n      Device::getImageMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceImageMemoryRequirementsKHR &&\n                         \"Function <vkGetDeviceImageMemoryRequirementsKHR> requires <VK_KHR_maintenance4> or <VK_VERSION_1_3>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2 &      memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();\n      getDispatcher()->vkGetDeviceImageMemoryRequirementsKHR( static_cast<VkDevice>( m_device ),\n                                                              reinterpret_cast<const VkDeviceImageMemoryRequirements *>( &info ),\n                                                              reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>\n                                           Device::getImageSparseMemoryRequirementsKHR( const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements & info ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceImageSparseMemoryRequirementsKHR &&\n                         \"Function <vkGetDeviceImageSparseMemoryRequirementsKHR> requires <VK_KHR_maintenance4> or <VK_VERSION_1_3>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2> sparseMemoryRequirements;\n      uint32_t                                                          sparseMemoryRequirementCount;\n      getDispatcher()->vkGetDeviceImageSparseMemoryRequirementsKHR(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkDeviceImageMemoryRequirements *>( &info ), &sparseMemoryRequirementCount, nullptr );\n      sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n      getDispatcher()->vkGetDeviceImageSparseMemoryRequirementsKHR( static_cast<VkDevice>( m_device ),\n                                                                    reinterpret_cast<const VkDeviceImageMemoryRequirements *>( &info ),\n                                                                    &sparseMemoryRequirementCount,\n                                                                    reinterpret_cast<VkSparseImageMemoryRequirements2 *>( sparseMemoryRequirements.data() ) );\n\n      VULKAN_HPP_ASSERT( sparseMemoryRequirementCount <= sparseMemoryRequirements.size() );\n      if ( sparseMemoryRequirementCount < sparseMemoryRequirements.size() )\n      {\n        sparseMemoryRequirements.resize( sparseMemoryRequirementCount );\n      }\n      return sparseMemoryRequirements;\n    }\n\n    //=== VK_VALVE_descriptor_set_host_mapping ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DescriptorSetLayoutHostMappingInfoVALVE Device::getDescriptorSetLayoutHostMappingInfoVALVE(\n      const VULKAN_HPP_NAMESPACE::DescriptorSetBindingReferenceVALVE & bindingReference ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDescriptorSetLayoutHostMappingInfoVALVE &&\n                         \"Function <vkGetDescriptorSetLayoutHostMappingInfoVALVE> requires <VK_VALVE_descriptor_set_host_mapping>\" );\n\n      VULKAN_HPP_NAMESPACE::DescriptorSetLayoutHostMappingInfoVALVE hostMapping;\n      getDispatcher()->vkGetDescriptorSetLayoutHostMappingInfoVALVE( static_cast<VkDevice>( m_device ),\n                                                                     reinterpret_cast<const VkDescriptorSetBindingReferenceVALVE *>( &bindingReference ),\n                                                                     reinterpret_cast<VkDescriptorSetLayoutHostMappingInfoVALVE *>( &hostMapping ) );\n\n      return hostMapping;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE void * DescriptorSet::getHostMappingVALVE() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDescriptorSetHostMappingVALVE &&\n                         \"Function <vkGetDescriptorSetHostMappingVALVE> requires <VK_VALVE_descriptor_set_host_mapping>\" );\n\n      void * pData;\n      getDispatcher()->vkGetDescriptorSetHostMappingVALVE( static_cast<VkDevice>( m_device ), static_cast<VkDescriptorSet>( m_descriptorSet ), &pData );\n\n      return pData;\n    }\n\n    //=== VK_NV_copy_memory_indirect ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::copyMemoryIndirectNV( VULKAN_HPP_NAMESPACE::DeviceAddress copyBufferAddress,\n                                                                uint32_t                            copyCount,\n                                                                uint32_t                            stride ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCopyMemoryIndirectNV && \"Function <vkCmdCopyMemoryIndirectNV> requires <VK_NV_copy_memory_indirect>\" );\n\n      getDispatcher()->vkCmdCopyMemoryIndirectNV(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkDeviceAddress>( copyBufferAddress ), copyCount, stride );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::copyMemoryToImageIndirectNV(\n      VULKAN_HPP_NAMESPACE::DeviceAddress                                                          copyBufferAddress,\n      uint32_t                                                                                     stride,\n      VULKAN_HPP_NAMESPACE::Image                                                                  dstImage,\n      VULKAN_HPP_NAMESPACE::ImageLayout                                                            dstImageLayout,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageSubresourceLayers> const & imageSubresources ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdCopyMemoryToImageIndirectNV &&\n                         \"Function <vkCmdCopyMemoryToImageIndirectNV> requires <VK_NV_copy_memory_indirect>\" );\n\n      getDispatcher()->vkCmdCopyMemoryToImageIndirectNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                         static_cast<VkDeviceAddress>( copyBufferAddress ),\n                                                         imageSubresources.size(),\n                                                         stride,\n                                                         static_cast<VkImage>( dstImage ),\n                                                         static_cast<VkImageLayout>( dstImageLayout ),\n                                                         reinterpret_cast<const VkImageSubresourceLayers *>( imageSubresources.data() ) );\n    }\n\n    //=== VK_NV_memory_decompression ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::decompressMemoryNV(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::DecompressMemoryRegionNV> const & decompressMemoryRegions ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDecompressMemoryNV && \"Function <vkCmdDecompressMemoryNV> requires <VK_NV_memory_decompression>\" );\n\n      getDispatcher()->vkCmdDecompressMemoryNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                decompressMemoryRegions.size(),\n                                                reinterpret_cast<const VkDecompressMemoryRegionNV *>( decompressMemoryRegions.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::decompressMemoryIndirectCountNV( VULKAN_HPP_NAMESPACE::DeviceAddress indirectCommandsAddress,\n                                                                           VULKAN_HPP_NAMESPACE::DeviceAddress indirectCommandsCountAddress,\n                                                                           uint32_t                            stride ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdDecompressMemoryIndirectCountNV &&\n                         \"Function <vkCmdDecompressMemoryIndirectCountNV> requires <VK_NV_memory_decompression>\" );\n\n      getDispatcher()->vkCmdDecompressMemoryIndirectCountNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                             static_cast<VkDeviceAddress>( indirectCommandsAddress ),\n                                                             static_cast<VkDeviceAddress>( indirectCommandsCountAddress ),\n                                                             stride );\n    }\n\n    //=== VK_NV_device_generated_commands_compute ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2\n      Device::getPipelineIndirectMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo & createInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPipelineIndirectMemoryRequirementsNV &&\n                         \"Function <vkGetPipelineIndirectMemoryRequirementsNV> requires <VK_NV_device_generated_commands_compute>\" );\n\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;\n      getDispatcher()->vkGetPipelineIndirectMemoryRequirementsNV( static_cast<VkDevice>( m_device ),\n                                                                  reinterpret_cast<const VkComputePipelineCreateInfo *>( &createInfo ),\n                                                                  reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n      return memoryRequirements;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n      Device::getPipelineIndirectMemoryRequirementsNV( const VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo & createInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPipelineIndirectMemoryRequirementsNV &&\n                         \"Function <vkGetPipelineIndirectMemoryRequirementsNV> requires <VK_NV_device_generated_commands_compute>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2 &      memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();\n      getDispatcher()->vkGetPipelineIndirectMemoryRequirementsNV( static_cast<VkDevice>( m_device ),\n                                                                  reinterpret_cast<const VkComputePipelineCreateInfo *>( &createInfo ),\n                                                                  reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::updatePipelineIndirectBufferNV( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint,\n                                                                          VULKAN_HPP_NAMESPACE::Pipeline          pipeline ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdUpdatePipelineIndirectBufferNV &&\n                         \"Function <vkCmdUpdatePipelineIndirectBufferNV> requires <VK_NV_device_generated_commands_compute>\" );\n\n      getDispatcher()->vkCmdUpdatePipelineIndirectBufferNV(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkPipelineBindPoint>( pipelineBindPoint ), static_cast<VkPipeline>( pipeline ) );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceAddress\n      Device::getPipelineIndirectAddressNV( const VULKAN_HPP_NAMESPACE::PipelineIndirectDeviceAddressInfoNV & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPipelineIndirectDeviceAddressNV &&\n                         \"Function <vkGetPipelineIndirectDeviceAddressNV> requires <VK_NV_device_generated_commands_compute>\" );\n\n      VkDeviceAddress result = getDispatcher()->vkGetPipelineIndirectDeviceAddressNV(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkPipelineIndirectDeviceAddressInfoNV *>( &info ) );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::DeviceAddress>( result );\n    }\n\n    //=== VK_EXT_extended_dynamic_state3 ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::setDepthClampEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthClampEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDepthClampEnableEXT &&\n                         \"Function <vkCmdSetDepthClampEnableEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetDepthClampEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( depthClampEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setPolygonModeEXT( VULKAN_HPP_NAMESPACE::PolygonMode polygonMode ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetPolygonModeEXT &&\n                         \"Function <vkCmdSetPolygonModeEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetPolygonModeEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkPolygonMode>( polygonMode ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setRasterizationSamplesEXT( VULKAN_HPP_NAMESPACE::SampleCountFlagBits rasterizationSamples ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetRasterizationSamplesEXT &&\n                         \"Function <vkCmdSetRasterizationSamplesEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetRasterizationSamplesEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                        static_cast<VkSampleCountFlagBits>( rasterizationSamples ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setSampleMaskEXT( VULKAN_HPP_NAMESPACE::SampleCountFlagBits                                        samples,\n                                                            VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::SampleMask> const & sampleMask ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetSampleMaskEXT &&\n                         \"Function <vkCmdSetSampleMaskEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( sampleMask.size() == ( static_cast<uint32_t>( samples ) + 31 ) / 32 );\n#  else\n      if ( sampleMask.size() != ( static_cast<uint32_t>( samples ) + 31 ) / 32 )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING\n                          \"::CommandBuffer::setSampleMaskEXT: sampleMask.size() != ( static_cast<uint32_t>( samples ) + 31 ) / 32\" );\n      }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n      getDispatcher()->vkCmdSetSampleMaskEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                              static_cast<VkSampleCountFlagBits>( samples ),\n                                              reinterpret_cast<const VkSampleMask *>( sampleMask.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setAlphaToCoverageEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 alphaToCoverageEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetAlphaToCoverageEnableEXT &&\n                         \"Function <vkCmdSetAlphaToCoverageEnableEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetAlphaToCoverageEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( alphaToCoverageEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setAlphaToOneEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 alphaToOneEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetAlphaToOneEnableEXT &&\n                         \"Function <vkCmdSetAlphaToOneEnableEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetAlphaToOneEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( alphaToOneEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setLogicOpEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 logicOpEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetLogicOpEnableEXT &&\n                         \"Function <vkCmdSetLogicOpEnableEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetLogicOpEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( logicOpEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setColorBlendEnableEXT(\n      uint32_t firstAttachment, VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::Bool32> const & colorBlendEnables ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetColorBlendEnableEXT &&\n                         \"Function <vkCmdSetColorBlendEnableEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetColorBlendEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                    firstAttachment,\n                                                    colorBlendEnables.size(),\n                                                    reinterpret_cast<const VkBool32 *>( colorBlendEnables.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setColorBlendEquationEXT(\n      uint32_t                                                                                    firstAttachment,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ColorBlendEquationEXT> const & colorBlendEquations ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetColorBlendEquationEXT &&\n                         \"Function <vkCmdSetColorBlendEquationEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetColorBlendEquationEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                      firstAttachment,\n                                                      colorBlendEquations.size(),\n                                                      reinterpret_cast<const VkColorBlendEquationEXT *>( colorBlendEquations.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setColorWriteMaskEXT(\n      uint32_t                                                                                  firstAttachment,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ColorComponentFlags> const & colorWriteMasks ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetColorWriteMaskEXT &&\n                         \"Function <vkCmdSetColorWriteMaskEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetColorWriteMaskEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                  firstAttachment,\n                                                  colorWriteMasks.size(),\n                                                  reinterpret_cast<const VkColorComponentFlags *>( colorWriteMasks.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::setTessellationDomainOriginEXT( VULKAN_HPP_NAMESPACE::TessellationDomainOrigin domainOrigin ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetTessellationDomainOriginEXT &&\n                         \"Function <vkCmdSetTessellationDomainOriginEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetTessellationDomainOriginEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                            static_cast<VkTessellationDomainOrigin>( domainOrigin ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setRasterizationStreamEXT( uint32_t rasterizationStream ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetRasterizationStreamEXT &&\n                         \"Function <vkCmdSetRasterizationStreamEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetRasterizationStreamEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), rasterizationStream );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setConservativeRasterizationModeEXT(\n      VULKAN_HPP_NAMESPACE::ConservativeRasterizationModeEXT conservativeRasterizationMode ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetConservativeRasterizationModeEXT &&\n                         \"Function <vkCmdSetConservativeRasterizationModeEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetConservativeRasterizationModeEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                                 static_cast<VkConservativeRasterizationModeEXT>( conservativeRasterizationMode ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setExtraPrimitiveOverestimationSizeEXT( float extraPrimitiveOverestimationSize ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetExtraPrimitiveOverestimationSizeEXT &&\n                         \"Function <vkCmdSetExtraPrimitiveOverestimationSizeEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetExtraPrimitiveOverestimationSizeEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), extraPrimitiveOverestimationSize );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setDepthClipEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthClipEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDepthClipEnableEXT &&\n                         \"Function <vkCmdSetDepthClipEnableEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetDepthClipEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( depthClipEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setSampleLocationsEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 sampleLocationsEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetSampleLocationsEnableEXT &&\n                         \"Function <vkCmdSetSampleLocationsEnableEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetSampleLocationsEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( sampleLocationsEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setColorBlendAdvancedEXT(\n      uint32_t                                                                                    firstAttachment,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ColorBlendAdvancedEXT> const & colorBlendAdvanced ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetColorBlendAdvancedEXT &&\n                         \"Function <vkCmdSetColorBlendAdvancedEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetColorBlendAdvancedEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                      firstAttachment,\n                                                      colorBlendAdvanced.size(),\n                                                      reinterpret_cast<const VkColorBlendAdvancedEXT *>( colorBlendAdvanced.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::setProvokingVertexModeEXT( VULKAN_HPP_NAMESPACE::ProvokingVertexModeEXT provokingVertexMode ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetProvokingVertexModeEXT &&\n                         \"Function <vkCmdSetProvokingVertexModeEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetProvokingVertexModeEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                       static_cast<VkProvokingVertexModeEXT>( provokingVertexMode ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::setLineRasterizationModeEXT( VULKAN_HPP_NAMESPACE::LineRasterizationModeEXT lineRasterizationMode ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetLineRasterizationModeEXT &&\n                         \"Function <vkCmdSetLineRasterizationModeEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetLineRasterizationModeEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                         static_cast<VkLineRasterizationModeEXT>( lineRasterizationMode ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setLineStippleEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 stippledLineEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetLineStippleEnableEXT &&\n                         \"Function <vkCmdSetLineStippleEnableEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetLineStippleEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( stippledLineEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setDepthClipNegativeOneToOneEXT( VULKAN_HPP_NAMESPACE::Bool32 negativeOneToOne ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDepthClipNegativeOneToOneEXT &&\n                         \"Function <vkCmdSetDepthClipNegativeOneToOneEXT> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetDepthClipNegativeOneToOneEXT( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( negativeOneToOne ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setViewportWScalingEnableNV( VULKAN_HPP_NAMESPACE::Bool32 viewportWScalingEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetViewportWScalingEnableNV &&\n                         \"Function <vkCmdSetViewportWScalingEnableNV> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetViewportWScalingEnableNV( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( viewportWScalingEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setViewportSwizzleNV(\n      uint32_t                                                                                firstViewport,\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ViewportSwizzleNV> const & viewportSwizzles ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetViewportSwizzleNV &&\n                         \"Function <vkCmdSetViewportSwizzleNV> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetViewportSwizzleNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                  firstViewport,\n                                                  viewportSwizzles.size(),\n                                                  reinterpret_cast<const VkViewportSwizzleNV *>( viewportSwizzles.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setCoverageToColorEnableNV( VULKAN_HPP_NAMESPACE::Bool32 coverageToColorEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetCoverageToColorEnableNV &&\n                         \"Function <vkCmdSetCoverageToColorEnableNV> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetCoverageToColorEnableNV( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( coverageToColorEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setCoverageToColorLocationNV( uint32_t coverageToColorLocation ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetCoverageToColorLocationNV &&\n                         \"Function <vkCmdSetCoverageToColorLocationNV> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetCoverageToColorLocationNV( static_cast<VkCommandBuffer>( m_commandBuffer ), coverageToColorLocation );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::setCoverageModulationModeNV( VULKAN_HPP_NAMESPACE::CoverageModulationModeNV coverageModulationMode ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetCoverageModulationModeNV &&\n                         \"Function <vkCmdSetCoverageModulationModeNV> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetCoverageModulationModeNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                         static_cast<VkCoverageModulationModeNV>( coverageModulationMode ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::setCoverageModulationTableEnableNV( VULKAN_HPP_NAMESPACE::Bool32 coverageModulationTableEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetCoverageModulationTableEnableNV &&\n                         \"Function <vkCmdSetCoverageModulationTableEnableNV> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetCoverageModulationTableEnableNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                                static_cast<VkBool32>( coverageModulationTableEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::setCoverageModulationTableNV( VULKAN_HPP_NAMESPACE::ArrayProxy<const float> const & coverageModulationTable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetCoverageModulationTableNV &&\n                         \"Function <vkCmdSetCoverageModulationTableNV> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetCoverageModulationTableNV(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), coverageModulationTable.size(), coverageModulationTable.data() );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setShadingRateImageEnableNV( VULKAN_HPP_NAMESPACE::Bool32 shadingRateImageEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetShadingRateImageEnableNV &&\n                         \"Function <vkCmdSetShadingRateImageEnableNV> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetShadingRateImageEnableNV( static_cast<VkCommandBuffer>( m_commandBuffer ), static_cast<VkBool32>( shadingRateImageEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::setRepresentativeFragmentTestEnableNV( VULKAN_HPP_NAMESPACE::Bool32 representativeFragmentTestEnable ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetRepresentativeFragmentTestEnableNV &&\n                         \"Function <vkCmdSetRepresentativeFragmentTestEnableNV> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetRepresentativeFragmentTestEnableNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                                   static_cast<VkBool32>( representativeFragmentTestEnable ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::setCoverageReductionModeNV( VULKAN_HPP_NAMESPACE::CoverageReductionModeNV coverageReductionMode ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetCoverageReductionModeNV &&\n                         \"Function <vkCmdSetCoverageReductionModeNV> requires <VK_EXT_extended_dynamic_state3> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetCoverageReductionModeNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                        static_cast<VkCoverageReductionModeNV>( coverageReductionMode ) );\n    }\n\n    //=== VK_EXT_shader_module_identifier ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ShaderModuleIdentifierEXT ShaderModule::getIdentifierEXT() const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetShaderModuleIdentifierEXT &&\n                         \"Function <vkGetShaderModuleIdentifierEXT> requires <VK_EXT_shader_module_identifier>\" );\n\n      VULKAN_HPP_NAMESPACE::ShaderModuleIdentifierEXT identifier;\n      getDispatcher()->vkGetShaderModuleIdentifierEXT(\n        static_cast<VkDevice>( m_device ), static_cast<VkShaderModule>( m_shaderModule ), reinterpret_cast<VkShaderModuleIdentifierEXT *>( &identifier ) );\n\n      return identifier;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ShaderModuleIdentifierEXT\n      Device::getShaderModuleCreateInfoIdentifierEXT( const VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo & createInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetShaderModuleCreateInfoIdentifierEXT &&\n                         \"Function <vkGetShaderModuleCreateInfoIdentifierEXT> requires <VK_EXT_shader_module_identifier>\" );\n\n      VULKAN_HPP_NAMESPACE::ShaderModuleIdentifierEXT identifier;\n      getDispatcher()->vkGetShaderModuleCreateInfoIdentifierEXT( static_cast<VkDevice>( m_device ),\n                                                                 reinterpret_cast<const VkShaderModuleCreateInfo *>( &createInfo ),\n                                                                 reinterpret_cast<VkShaderModuleIdentifierEXT *>( &identifier ) );\n\n      return identifier;\n    }\n\n    //=== VK_NV_optical_flow ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatPropertiesNV>\n      PhysicalDevice::getOpticalFlowImageFormatsNV( const VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatInfoNV & opticalFlowImageFormatInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceOpticalFlowImageFormatsNV &&\n                         \"Function <vkGetPhysicalDeviceOpticalFlowImageFormatsNV> requires <VK_NV_optical_flow>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatPropertiesNV> imageFormatProperties;\n      uint32_t                                                              formatCount;\n      VULKAN_HPP_NAMESPACE::Result                                          result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceOpticalFlowImageFormatsNV(\n          static_cast<VkPhysicalDevice>( m_physicalDevice ),\n          reinterpret_cast<const VkOpticalFlowImageFormatInfoNV *>( &opticalFlowImageFormatInfo ),\n          &formatCount,\n          nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && formatCount )\n        {\n          imageFormatProperties.resize( formatCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceOpticalFlowImageFormatsNV(\n            static_cast<VkPhysicalDevice>( m_physicalDevice ),\n            reinterpret_cast<const VkOpticalFlowImageFormatInfoNV *>( &opticalFlowImageFormatInfo ),\n            &formatCount,\n            reinterpret_cast<VkOpticalFlowImageFormatPropertiesNV *>( imageFormatProperties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getOpticalFlowImageFormatsNV\" );\n      VULKAN_HPP_ASSERT( formatCount <= imageFormatProperties.size() );\n      if ( formatCount < imageFormatProperties.size() )\n      {\n        imageFormatProperties.resize( formatCount );\n      }\n      return imageFormatProperties;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::OpticalFlowSessionNV>::Type\n      Device::createOpticalFlowSessionNV( VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreateInfoNV const &                    createInfo,\n                                          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV session;\n      VULKAN_HPP_NAMESPACE::Result               result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateOpticalFlowSessionNV(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkOpticalFlowSessionCreateInfoNV *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkOpticalFlowSessionNV *>( &session ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createOpticalFlowSessionNV\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::OpticalFlowSessionNV( *this, *reinterpret_cast<VkOpticalFlowSessionNV *>( &session ), allocator );\n    }\n\n    VULKAN_HPP_INLINE void OpticalFlowSessionNV::bindImage( VULKAN_HPP_NAMESPACE::OpticalFlowSessionBindingPointNV bindingPoint,\n                                                            VULKAN_HPP_NAMESPACE::ImageView                        view,\n                                                            VULKAN_HPP_NAMESPACE::ImageLayout                      layout ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkBindOpticalFlowSessionImageNV && \"Function <vkBindOpticalFlowSessionImageNV> requires <VK_NV_optical_flow>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkBindOpticalFlowSessionImageNV( static_cast<VkDevice>( m_device ),\n                                                          static_cast<VkOpticalFlowSessionNV>( m_session ),\n                                                          static_cast<VkOpticalFlowSessionBindingPointNV>( bindingPoint ),\n                                                          static_cast<VkImageView>( view ),\n                                                          static_cast<VkImageLayout>( layout ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::OpticalFlowSessionNV::bindImage\" );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::opticalFlowExecuteNV( VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV             session,\n                                                                const VULKAN_HPP_NAMESPACE::OpticalFlowExecuteInfoNV & executeInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdOpticalFlowExecuteNV && \"Function <vkCmdOpticalFlowExecuteNV> requires <VK_NV_optical_flow>\" );\n\n      getDispatcher()->vkCmdOpticalFlowExecuteNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                  static_cast<VkOpticalFlowSessionNV>( session ),\n                                                  reinterpret_cast<const VkOpticalFlowExecuteInfoNV *>( &executeInfo ) );\n    }\n\n    //=== VK_KHR_maintenance5 ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::bindIndexBuffer2KHR( VULKAN_HPP_NAMESPACE::Buffer     buffer,\n                                                               VULKAN_HPP_NAMESPACE::DeviceSize offset,\n                                                               VULKAN_HPP_NAMESPACE::DeviceSize size,\n                                                               VULKAN_HPP_NAMESPACE::IndexType  indexType ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBindIndexBuffer2KHR &&\n                         \"Function <vkCmdBindIndexBuffer2KHR> requires <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n\n      getDispatcher()->vkCmdBindIndexBuffer2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                 static_cast<VkBuffer>( buffer ),\n                                                 static_cast<VkDeviceSize>( offset ),\n                                                 static_cast<VkDeviceSize>( size ),\n                                                 static_cast<VkIndexType>( indexType ) );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Extent2D\n      Device::getRenderingAreaGranularityKHR( const VULKAN_HPP_NAMESPACE::RenderingAreaInfo & renderingAreaInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetRenderingAreaGranularityKHR &&\n                         \"Function <vkGetRenderingAreaGranularityKHR> requires <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n\n      VULKAN_HPP_NAMESPACE::Extent2D granularity;\n      getDispatcher()->vkGetRenderingAreaGranularityKHR( static_cast<VkDevice>( m_device ),\n                                                         reinterpret_cast<const VkRenderingAreaInfo *>( &renderingAreaInfo ),\n                                                         reinterpret_cast<VkExtent2D *>( &granularity ) );\n\n      return granularity;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::SubresourceLayout2\n      Device::getImageSubresourceLayoutKHR( const VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceImageSubresourceLayoutKHR &&\n                         \"Function <vkGetDeviceImageSubresourceLayoutKHR> requires <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n\n      VULKAN_HPP_NAMESPACE::SubresourceLayout2 layout;\n      getDispatcher()->vkGetDeviceImageSubresourceLayoutKHR( static_cast<VkDevice>( m_device ),\n                                                             reinterpret_cast<const VkDeviceImageSubresourceInfo *>( &info ),\n                                                             reinterpret_cast<VkSubresourceLayout2 *>( &layout ) );\n\n      return layout;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n      Device::getImageSubresourceLayoutKHR( const VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDeviceImageSubresourceLayoutKHR &&\n                         \"Function <vkGetDeviceImageSubresourceLayoutKHR> requires <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n      VULKAN_HPP_NAMESPACE::SubresourceLayout2 &       layout = structureChain.template get<VULKAN_HPP_NAMESPACE::SubresourceLayout2>();\n      getDispatcher()->vkGetDeviceImageSubresourceLayoutKHR( static_cast<VkDevice>( m_device ),\n                                                             reinterpret_cast<const VkDeviceImageSubresourceInfo *>( &info ),\n                                                             reinterpret_cast<VkSubresourceLayout2 *>( &layout ) );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::SubresourceLayout2\n      Image::getSubresourceLayout2KHR( const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT(\n        getDispatcher()->vkGetImageSubresourceLayout2KHR &&\n        \"Function <vkGetImageSubresourceLayout2KHR> requires <VK_EXT_host_image_copy> or <VK_EXT_image_compression_control> or <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n\n      VULKAN_HPP_NAMESPACE::SubresourceLayout2 layout;\n      getDispatcher()->vkGetImageSubresourceLayout2KHR( static_cast<VkDevice>( m_device ),\n                                                        static_cast<VkImage>( m_image ),\n                                                        reinterpret_cast<const VkImageSubresource2 *>( &subresource ),\n                                                        reinterpret_cast<VkSubresourceLayout2 *>( &layout ) );\n\n      return layout;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n      Image::getSubresourceLayout2KHR( const VULKAN_HPP_NAMESPACE::ImageSubresource2 & subresource ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT(\n        getDispatcher()->vkGetImageSubresourceLayout2KHR &&\n        \"Function <vkGetImageSubresourceLayout2KHR> requires <VK_EXT_host_image_copy> or <VK_EXT_image_compression_control> or <VK_KHR_maintenance5> or <VK_VERSION_1_4>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n      VULKAN_HPP_NAMESPACE::SubresourceLayout2 &       layout = structureChain.template get<VULKAN_HPP_NAMESPACE::SubresourceLayout2>();\n      getDispatcher()->vkGetImageSubresourceLayout2KHR( static_cast<VkDevice>( m_device ),\n                                                        static_cast<VkImage>( m_image ),\n                                                        reinterpret_cast<const VkImageSubresource2 *>( &subresource ),\n                                                        reinterpret_cast<VkSubresourceLayout2 *>( &layout ) );\n\n      return structureChain;\n    }\n\n    //=== VK_AMD_anti_lag ===\n\n    VULKAN_HPP_INLINE void Device::antiLagUpdateAMD( const VULKAN_HPP_NAMESPACE::AntiLagDataAMD & data ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkAntiLagUpdateAMD && \"Function <vkAntiLagUpdateAMD> requires <VK_AMD_anti_lag>\" );\n\n      getDispatcher()->vkAntiLagUpdateAMD( static_cast<VkDevice>( m_device ), reinterpret_cast<const VkAntiLagDataAMD *>( &data ) );\n    }\n\n    //=== VK_EXT_shader_object ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ShaderEXT>>::Type\n      Device::createShadersEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT> const & createInfos,\n                                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>     allocator ) const\n    {\n      std::vector<VULKAN_HPP_NAMESPACE::ShaderEXT> shaders( createInfos.size() );\n      VULKAN_HPP_NAMESPACE::Result                 result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateShadersEXT(\n        static_cast<VkDevice>( m_device ),\n        createInfos.size(),\n        reinterpret_cast<const VkShaderCreateInfoEXT *>( createInfos.data() ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkShaderEXT *>( shaders.data() ) ) );\n      if ( ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess ) && ( result != VULKAN_HPP_NAMESPACE::Result::eIncompatibleShaderBinaryEXT ) )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createShadersEXT\" );\n#  endif\n      }\n\n      std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ShaderEXT> shadersRAII;\n      shadersRAII.reserve( shaders.size() );\n      for ( auto & shader : shaders )\n      {\n        shadersRAII.emplace_back( *this, *reinterpret_cast<VkShaderEXT *>( &shader ), allocator, result );\n      }\n      return shadersRAII;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ShaderEXT>::Type\n      Device::createShaderEXT( VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT const &                               createInfo,\n                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::ShaderEXT shader;\n      VULKAN_HPP_NAMESPACE::Result    result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateShadersEXT(\n        static_cast<VkDevice>( m_device ),\n        1,\n        reinterpret_cast<const VkShaderCreateInfoEXT *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkShaderEXT *>( &shader ) ) );\n      if ( ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess ) && ( result != VULKAN_HPP_NAMESPACE::Result::eIncompatibleShaderBinaryEXT ) )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createShaderEXT\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ShaderEXT( *this, *reinterpret_cast<VkShaderEXT *>( &shader ), allocator, result );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<uint8_t> ShaderEXT::getBinaryData() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetShaderBinaryDataEXT && \"Function <vkGetShaderBinaryDataEXT> requires <VK_EXT_shader_object>\" );\n\n      std::vector<uint8_t>         data;\n      size_t                       dataSize;\n      VULKAN_HPP_NAMESPACE::Result result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkGetShaderBinaryDataEXT( static_cast<VkDevice>( m_device ), static_cast<VkShaderEXT>( m_shader ), &dataSize, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && dataSize )\n        {\n          data.resize( dataSize );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetShaderBinaryDataEXT(\n            static_cast<VkDevice>( m_device ), static_cast<VkShaderEXT>( m_shader ), &dataSize, reinterpret_cast<void *>( data.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::ShaderEXT::getBinaryData\" );\n      VULKAN_HPP_ASSERT( dataSize <= data.size() );\n      if ( dataSize < data.size() )\n      {\n        data.resize( dataSize );\n      }\n      return data;\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::bindShadersEXT( VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ShaderStageFlagBits> const & stages,\n                                                          VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ShaderEXT> const & shaders ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBindShadersEXT && \"Function <vkCmdBindShadersEXT> requires <VK_EXT_shader_object>\" );\n#  ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( stages.size() == shaders.size() );\n#  else\n      if ( stages.size() != shaders.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::CommandBuffer::bindShadersEXT: stages.size() != shaders.size()\" );\n      }\n#  endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n      getDispatcher()->vkCmdBindShadersEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                            stages.size(),\n                                            reinterpret_cast<const VkShaderStageFlagBits *>( stages.data() ),\n                                            reinterpret_cast<const VkShaderEXT *>( shaders.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::setDepthClampRangeEXT( VULKAN_HPP_NAMESPACE::DepthClampModeEXT                  depthClampMode,\n                                            Optional<const VULKAN_HPP_NAMESPACE::DepthClampRangeEXT> depthClampRange ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDepthClampRangeEXT &&\n                         \"Function <vkCmdSetDepthClampRangeEXT> requires <VK_EXT_depth_clamp_control> or <VK_EXT_shader_object>\" );\n\n      getDispatcher()->vkCmdSetDepthClampRangeEXT(\n        static_cast<VkCommandBuffer>( m_commandBuffer ),\n        static_cast<VkDepthClampModeEXT>( depthClampMode ),\n        reinterpret_cast<const VkDepthClampRangeEXT *>( static_cast<const VULKAN_HPP_NAMESPACE::DepthClampRangeEXT *>( depthClampRange ) ) );\n    }\n\n    //=== VK_KHR_pipeline_binary ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n      std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineBinaryKHR>>::Type\n      Device::createPipelineBinariesKHR( VULKAN_HPP_NAMESPACE::PipelineBinaryCreateInfoKHR const &                       createInfo,\n                                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n    {\n      std::vector<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR> pipelineBinaries;\n      VULKAN_HPP_NAMESPACE::PipelineBinaryHandlesInfoKHR   binaries;\n      VULKAN_HPP_NAMESPACE::Result                         result;\n      if ( createInfo.pKeysAndDataInfo )\n      {\n        VULKAN_HPP_ASSERT( !createInfo.pipeline && !createInfo.pPipelineCreateInfo );\n        pipelineBinaries.resize( createInfo.pKeysAndDataInfo->binaryCount );\n        binaries.pipelineBinaryCount = createInfo.pKeysAndDataInfo->binaryCount;\n        binaries.pPipelineBinaries   = pipelineBinaries.data();\n        result                       = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreatePipelineBinariesKHR(\n          static_cast<VkDevice>( m_device ),\n          reinterpret_cast<const VkPipelineBinaryCreateInfoKHR *>( &createInfo ),\n          reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n          reinterpret_cast<VkPipelineBinaryHandlesInfoKHR *>( &binaries ) ) );\n      }\n      else\n      {\n        VULKAN_HPP_ASSERT( !createInfo.pipeline ^ !createInfo.pPipelineCreateInfo );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreatePipelineBinariesKHR(\n          static_cast<VkDevice>( m_device ),\n          reinterpret_cast<const VkPipelineBinaryCreateInfoKHR *>( &createInfo ),\n          reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n          reinterpret_cast<VkPipelineBinaryHandlesInfoKHR *>( &binaries ) ) );\n        if ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess )\n        {\n          pipelineBinaries.resize( binaries.pipelineBinaryCount );\n          binaries.pPipelineBinaries = pipelineBinaries.data();\n          result                     = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreatePipelineBinariesKHR(\n            static_cast<VkDevice>( m_device ),\n            reinterpret_cast<const VkPipelineBinaryCreateInfoKHR *>( &createInfo ),\n            reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n            reinterpret_cast<VkPipelineBinaryHandlesInfoKHR *>( &binaries ) ) );\n        }\n      }\n\n      if ( ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess ) && ( result != VULKAN_HPP_NAMESPACE::Result::eIncomplete ) &&\n           ( result != VULKAN_HPP_NAMESPACE::Result::ePipelineBinaryMissingKHR ) )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createPipelineBinariesKHR\" );\n#  endif\n      }\n\n      std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineBinaryKHR> pipelineBinariesRAII;\n      pipelineBinariesRAII.reserve( pipelineBinaries.size() );\n      for ( auto & pipelineBinary : pipelineBinaries )\n      {\n        pipelineBinariesRAII.emplace_back( *this, *reinterpret_cast<VkPipelineBinaryKHR *>( &pipelineBinary ), allocator, result );\n      }\n      return pipelineBinariesRAII;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR\n                                           Device::getPipelineKeyKHR( Optional<const VULKAN_HPP_NAMESPACE::PipelineCreateInfoKHR> pipelineCreateInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPipelineKeyKHR && \"Function <vkGetPipelineKeyKHR> requires <VK_KHR_pipeline_binary>\" );\n\n      VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR pipelineKey;\n      VULKAN_HPP_NAMESPACE::Result               result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPipelineKeyKHR(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkPipelineCreateInfoKHR *>( static_cast<const VULKAN_HPP_NAMESPACE::PipelineCreateInfoKHR *>( pipelineCreateInfo ) ),\n        reinterpret_cast<VkPipelineBinaryKeyKHR *>( &pipelineKey ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getPipelineKeyKHR\" );\n\n      return pipelineKey;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::pair<VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR, std::vector<uint8_t>>\n                                           Device::getPipelineBinaryDataKHR( const VULKAN_HPP_NAMESPACE::PipelineBinaryDataInfoKHR & info ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPipelineBinaryDataKHR && \"Function <vkGetPipelineBinaryDataKHR> requires <VK_KHR_pipeline_binary>\" );\n\n      std::pair<VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR, std::vector<uint8_t>> data_;\n      VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR &                                pipelineBinaryKey  = data_.first;\n      std::vector<uint8_t> &                                                      pipelineBinaryData = data_.second;\n      size_t                                                                      pipelineBinaryDataSize;\n      VULKAN_HPP_NAMESPACE::Result                                                result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetPipelineBinaryDataKHR( static_cast<VkDevice>( m_device ),\n                                                     reinterpret_cast<const VkPipelineBinaryDataInfoKHR *>( &info ),\n                                                     reinterpret_cast<VkPipelineBinaryKeyKHR *>( &pipelineBinaryKey ),\n                                                     &pipelineBinaryDataSize,\n                                                     nullptr ) );\n      if ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n        pipelineBinaryData.resize( pipelineBinaryDataSize );\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkGetPipelineBinaryDataKHR( static_cast<VkDevice>( m_device ),\n                                                       reinterpret_cast<const VkPipelineBinaryDataInfoKHR *>( &info ),\n                                                       reinterpret_cast<VkPipelineBinaryKeyKHR *>( &pipelineBinaryKey ),\n                                                       &pipelineBinaryDataSize,\n                                                       reinterpret_cast<void *>( pipelineBinaryData.data() ) ) );\n      }\n\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getPipelineBinaryDataKHR\" );\n\n      return data_;\n    }\n\n    VULKAN_HPP_INLINE void\n      Device::releaseCapturedPipelineDataKHR( const VULKAN_HPP_NAMESPACE::ReleaseCapturedPipelineDataInfoKHR & info,\n                                              Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks>        allocator ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkReleaseCapturedPipelineDataKHR && \"Function <vkReleaseCapturedPipelineDataKHR> requires <VK_KHR_pipeline_binary>\" );\n\n      getDispatcher()->vkReleaseCapturedPipelineDataKHR(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkReleaseCapturedPipelineDataInfoKHR *>( &info ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );\n    }\n\n    //=== VK_QCOM_tile_properties ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::TilePropertiesQCOM> Framebuffer::getTilePropertiesQCOM() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetFramebufferTilePropertiesQCOM &&\n                         \"Function <vkGetFramebufferTilePropertiesQCOM> requires <VK_QCOM_tile_properties>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::TilePropertiesQCOM> properties;\n      uint32_t                                              propertiesCount;\n      VULKAN_HPP_NAMESPACE::Result                          result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetFramebufferTilePropertiesQCOM(\n          static_cast<VkDevice>( m_device ), static_cast<VkFramebuffer>( m_framebuffer ), &propertiesCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertiesCount )\n        {\n          properties.resize( propertiesCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n            getDispatcher()->vkGetFramebufferTilePropertiesQCOM( static_cast<VkDevice>( m_device ),\n                                                                 static_cast<VkFramebuffer>( m_framebuffer ),\n                                                                 &propertiesCount,\n                                                                 reinterpret_cast<VkTilePropertiesQCOM *>( properties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n\n      VULKAN_HPP_ASSERT( propertiesCount <= properties.size() );\n      if ( propertiesCount < properties.size() )\n      {\n        properties.resize( propertiesCount );\n      }\n      return properties;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::TilePropertiesQCOM\n      Device::getDynamicRenderingTilePropertiesQCOM( const VULKAN_HPP_NAMESPACE::RenderingInfo & renderingInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetDynamicRenderingTilePropertiesQCOM &&\n                         \"Function <vkGetDynamicRenderingTilePropertiesQCOM> requires <VK_QCOM_tile_properties>\" );\n\n      VULKAN_HPP_NAMESPACE::TilePropertiesQCOM properties;\n      getDispatcher()->vkGetDynamicRenderingTilePropertiesQCOM( static_cast<VkDevice>( m_device ),\n                                                                reinterpret_cast<const VkRenderingInfo *>( &renderingInfo ),\n                                                                reinterpret_cast<VkTilePropertiesQCOM *>( &properties ) );\n\n      return properties;\n    }\n\n    //=== VK_NV_cooperative_vector ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::CooperativeVectorPropertiesNV>\n                                           PhysicalDevice::getCooperativeVectorPropertiesNV() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceCooperativeVectorPropertiesNV &&\n                         \"Function <vkGetPhysicalDeviceCooperativeVectorPropertiesNV> requires <VK_NV_cooperative_vector>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::CooperativeVectorPropertiesNV> properties;\n      uint32_t                                                         propertyCount;\n      VULKAN_HPP_NAMESPACE::Result                                     result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkGetPhysicalDeviceCooperativeVectorPropertiesNV( static_cast<VkPhysicalDevice>( m_physicalDevice ), &propertyCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n        {\n          properties.resize( propertyCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceCooperativeVectorPropertiesNV(\n            static_cast<VkPhysicalDevice>( m_physicalDevice ), &propertyCount, reinterpret_cast<VkCooperativeVectorPropertiesNV *>( properties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getCooperativeVectorPropertiesNV\" );\n      VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n      if ( propertyCount < properties.size() )\n      {\n        properties.resize( propertyCount );\n      }\n      return properties;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result\n      Device::convertCooperativeVectorMatrixNV( const VULKAN_HPP_NAMESPACE::ConvertCooperativeVectorMatrixInfoNV & info ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkConvertCooperativeVectorMatrixNV &&\n                         \"Function <vkConvertCooperativeVectorMatrixNV> requires <VK_NV_cooperative_vector>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkConvertCooperativeVectorMatrixNV(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkConvertCooperativeVectorMatrixInfoNV *>( &info ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result,\n                                                 VULKAN_HPP_NAMESPACE_STRING \"::Device::convertCooperativeVectorMatrixNV\",\n                                                 { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eIncomplete } );\n\n      return static_cast<VULKAN_HPP_NAMESPACE::Result>( result );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::convertCooperativeVectorMatrixNV(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::ConvertCooperativeVectorMatrixInfoNV> const & infos ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdConvertCooperativeVectorMatrixNV &&\n                         \"Function <vkCmdConvertCooperativeVectorMatrixNV> requires <VK_NV_cooperative_vector>\" );\n\n      getDispatcher()->vkCmdConvertCooperativeVectorMatrixNV(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), infos.size(), reinterpret_cast<const VkConvertCooperativeVectorMatrixInfoNV *>( infos.data() ) );\n    }\n\n    //=== VK_NV_low_latency2 ===\n\n    VULKAN_HPP_INLINE void SwapchainKHR::setLatencySleepModeNV( const VULKAN_HPP_NAMESPACE::LatencySleepModeInfoNV & sleepModeInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkSetLatencySleepModeNV && \"Function <vkSetLatencySleepModeNV> requires <VK_NV_low_latency2>\" );\n\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkSetLatencySleepModeNV(\n        static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( m_swapchain ), reinterpret_cast<const VkLatencySleepModeInfoNV *>( &sleepModeInfo ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::SwapchainKHR::setLatencySleepModeNV\" );\n    }\n\n    VULKAN_HPP_INLINE void SwapchainKHR::latencySleepNV( const VULKAN_HPP_NAMESPACE::LatencySleepInfoNV & sleepInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkLatencySleepNV && \"Function <vkLatencySleepNV> requires <VK_NV_low_latency2>\" );\n\n      getDispatcher()->vkLatencySleepNV(\n        static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( m_swapchain ), reinterpret_cast<const VkLatencySleepInfoNV *>( &sleepInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void SwapchainKHR::setLatencyMarkerNV( const VULKAN_HPP_NAMESPACE::SetLatencyMarkerInfoNV & latencyMarkerInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkSetLatencyMarkerNV && \"Function <vkSetLatencyMarkerNV> requires <VK_NV_low_latency2>\" );\n\n      getDispatcher()->vkSetLatencyMarkerNV( static_cast<VkDevice>( m_device ),\n                                             static_cast<VkSwapchainKHR>( m_swapchain ),\n                                             reinterpret_cast<const VkSetLatencyMarkerInfoNV *>( &latencyMarkerInfo ) );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV> SwapchainKHR::getLatencyTimingsNV() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetLatencyTimingsNV && \"Function <vkGetLatencyTimingsNV> requires <VK_NV_low_latency2>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV> timings;\n      VULKAN_HPP_NAMESPACE::GetLatencyMarkerInfoNV                   latencyMarkerInfo;\n      getDispatcher()->vkGetLatencyTimingsNV(\n        static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( m_swapchain ), reinterpret_cast<VkGetLatencyMarkerInfoNV *>( &latencyMarkerInfo ) );\n      timings.resize( latencyMarkerInfo.timingCount );\n      latencyMarkerInfo.pTimings = timings.data();\n      getDispatcher()->vkGetLatencyTimingsNV(\n        static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( m_swapchain ), reinterpret_cast<VkGetLatencyMarkerInfoNV *>( &latencyMarkerInfo ) );\n\n      return timings;\n    }\n\n    VULKAN_HPP_INLINE void Queue::notifyOutOfBandNV( const VULKAN_HPP_NAMESPACE::OutOfBandQueueTypeInfoNV & queueTypeInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkQueueNotifyOutOfBandNV && \"Function <vkQueueNotifyOutOfBandNV> requires <VK_NV_low_latency2>\" );\n\n      getDispatcher()->vkQueueNotifyOutOfBandNV( static_cast<VkQueue>( m_queue ), reinterpret_cast<const VkOutOfBandQueueTypeInfoNV *>( &queueTypeInfo ) );\n    }\n\n    //=== VK_KHR_cooperative_matrix ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesKHR>\n                                           PhysicalDevice::getCooperativeMatrixPropertiesKHR() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR &&\n                         \"Function <vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR> requires <VK_KHR_cooperative_matrix>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesKHR> properties;\n      uint32_t                                                          propertyCount;\n      VULKAN_HPP_NAMESPACE::Result                                      result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ), &propertyCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n        {\n          properties.resize( propertyCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR(\n            static_cast<VkPhysicalDevice>( m_physicalDevice ), &propertyCount, reinterpret_cast<VkCooperativeMatrixPropertiesKHR *>( properties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getCooperativeMatrixPropertiesKHR\" );\n      VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n      if ( propertyCount < properties.size() )\n      {\n        properties.resize( propertyCount );\n      }\n      return properties;\n    }\n\n    //=== VK_EXT_attachment_feedback_loop_dynamic_state ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::setAttachmentFeedbackLoopEnableEXT( VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetAttachmentFeedbackLoopEnableEXT &&\n                         \"Function <vkCmdSetAttachmentFeedbackLoopEnableEXT> requires <VK_EXT_attachment_feedback_loop_dynamic_state>\" );\n\n      getDispatcher()->vkCmdSetAttachmentFeedbackLoopEnableEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                                static_cast<VkImageAspectFlags>( aspectMask ) );\n    }\n\n#  if defined( VK_USE_PLATFORM_SCREEN_QNX )\n    //=== VK_QNX_external_memory_screen_buffer ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ScreenBufferPropertiesQNX\n                                           Device::getScreenBufferPropertiesQNX( const struct _screen_buffer & buffer ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetScreenBufferPropertiesQNX &&\n                         \"Function <vkGetScreenBufferPropertiesQNX> requires <VK_QNX_external_memory_screen_buffer>\" );\n\n      VULKAN_HPP_NAMESPACE::ScreenBufferPropertiesQNX properties;\n      VULKAN_HPP_NAMESPACE::Result                    result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetScreenBufferPropertiesQNX(\n        static_cast<VkDevice>( m_device ), &buffer, reinterpret_cast<VkScreenBufferPropertiesQNX *>( &properties ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getScreenBufferPropertiesQNX\" );\n\n      return properties;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...>\n                                           Device::getScreenBufferPropertiesQNX( const struct _screen_buffer & buffer ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetScreenBufferPropertiesQNX &&\n                         \"Function <vkGetScreenBufferPropertiesQNX> requires <VK_QNX_external_memory_screen_buffer>\" );\n\n      StructureChain<X, Y, Z...>                        structureChain;\n      VULKAN_HPP_NAMESPACE::ScreenBufferPropertiesQNX & properties = structureChain.template get<VULKAN_HPP_NAMESPACE::ScreenBufferPropertiesQNX>();\n      VULKAN_HPP_NAMESPACE::Result                      result     = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetScreenBufferPropertiesQNX(\n        static_cast<VkDevice>( m_device ), &buffer, reinterpret_cast<VkScreenBufferPropertiesQNX *>( &properties ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getScreenBufferPropertiesQNX\" );\n\n      return structureChain;\n    }\n#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n    //=== VK_KHR_line_rasterization ===\n\n    VULKAN_HPP_INLINE void CommandBuffer::setLineStippleKHR( uint32_t lineStippleFactor, uint16_t lineStipplePattern ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetLineStippleKHR &&\n                         \"Function <vkCmdSetLineStippleKHR> requires <VK_EXT_line_rasterization> or <VK_KHR_line_rasterization> or <VK_VERSION_1_4>\" );\n\n      getDispatcher()->vkCmdSetLineStippleKHR( static_cast<VkCommandBuffer>( m_commandBuffer ), lineStippleFactor, lineStipplePattern );\n    }\n\n    //=== VK_KHR_calibrated_timestamps ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::TimeDomainKHR> PhysicalDevice::getCalibrateableTimeDomainsKHR() const\n    {\n      VULKAN_HPP_ASSERT(\n        getDispatcher()->vkGetPhysicalDeviceCalibrateableTimeDomainsKHR &&\n        \"Function <vkGetPhysicalDeviceCalibrateableTimeDomainsKHR> requires <VK_EXT_calibrated_timestamps> or <VK_KHR_calibrated_timestamps>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::TimeDomainKHR> timeDomains;\n      uint32_t                                         timeDomainCount;\n      VULKAN_HPP_NAMESPACE::Result                     result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n          getDispatcher()->vkGetPhysicalDeviceCalibrateableTimeDomainsKHR( static_cast<VkPhysicalDevice>( m_physicalDevice ), &timeDomainCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && timeDomainCount )\n        {\n          timeDomains.resize( timeDomainCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceCalibrateableTimeDomainsKHR(\n            static_cast<VkPhysicalDevice>( m_physicalDevice ), &timeDomainCount, reinterpret_cast<VkTimeDomainKHR *>( timeDomains.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getCalibrateableTimeDomainsKHR\" );\n      VULKAN_HPP_ASSERT( timeDomainCount <= timeDomains.size() );\n      if ( timeDomainCount < timeDomains.size() )\n      {\n        timeDomains.resize( timeDomainCount );\n      }\n      return timeDomains;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::pair<std::vector<uint64_t>, uint64_t> Device::getCalibratedTimestampsKHR(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR> const & timestampInfos ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetCalibratedTimestampsKHR &&\n                         \"Function <vkGetCalibratedTimestampsKHR> requires <VK_EXT_calibrated_timestamps> or <VK_KHR_calibrated_timestamps>\" );\n\n      std::pair<std::vector<uint64_t>, uint64_t> data_( std::piecewise_construct, std::forward_as_tuple( timestampInfos.size() ), std::forward_as_tuple( 0 ) );\n      std::vector<uint64_t> &                    timestamps   = data_.first;\n      uint64_t &                                 maxDeviation = data_.second;\n      VULKAN_HPP_NAMESPACE::Result               result       = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetCalibratedTimestampsKHR( static_cast<VkDevice>( m_device ),\n                                                       timestampInfos.size(),\n                                                       reinterpret_cast<const VkCalibratedTimestampInfoKHR *>( timestampInfos.data() ),\n                                                       timestamps.data(),\n                                                       &maxDeviation ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getCalibratedTimestampsKHR\" );\n\n      return data_;\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::pair<uint64_t, uint64_t>\n                                           Device::getCalibratedTimestampKHR( const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR & timestampInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetCalibratedTimestampsKHR &&\n                         \"Function <vkGetCalibratedTimestampsKHR> requires <VK_EXT_calibrated_timestamps> or <VK_KHR_calibrated_timestamps>\" );\n\n      std::pair<uint64_t, uint64_t> data_;\n      uint64_t &                    timestamp    = data_.first;\n      uint64_t &                    maxDeviation = data_.second;\n      VULKAN_HPP_NAMESPACE::Result  result       = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetCalibratedTimestampsKHR(\n        static_cast<VkDevice>( m_device ), 1, reinterpret_cast<const VkCalibratedTimestampInfoKHR *>( &timestampInfo ), &timestamp, &maxDeviation ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getCalibratedTimestampKHR\" );\n\n      return data_;\n    }\n\n    //=== VK_KHR_maintenance6 ===\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::bindDescriptorSets2KHR( const VULKAN_HPP_NAMESPACE::BindDescriptorSetsInfo & bindDescriptorSetsInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBindDescriptorSets2KHR &&\n                         \"Function <vkCmdBindDescriptorSets2KHR> requires <VK_KHR_maintenance6> or <VK_VERSION_1_4>\" );\n\n      getDispatcher()->vkCmdBindDescriptorSets2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                    reinterpret_cast<const VkBindDescriptorSetsInfo *>( &bindDescriptorSetsInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::pushConstants2KHR( const VULKAN_HPP_NAMESPACE::PushConstantsInfo & pushConstantsInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdPushConstants2KHR && \"Function <vkCmdPushConstants2KHR> requires <VK_KHR_maintenance6> or <VK_VERSION_1_4>\" );\n\n      getDispatcher()->vkCmdPushConstants2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                               reinterpret_cast<const VkPushConstantsInfo *>( &pushConstantsInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::pushDescriptorSet2KHR( const VULKAN_HPP_NAMESPACE::PushDescriptorSetInfo & pushDescriptorSetInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdPushDescriptorSet2KHR &&\n                         \"Function <vkCmdPushDescriptorSet2KHR> requires <VK_KHR_maintenance6> or <VK_VERSION_1_4>\" );\n\n      getDispatcher()->vkCmdPushDescriptorSet2KHR( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                   reinterpret_cast<const VkPushDescriptorSetInfo *>( &pushDescriptorSetInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::pushDescriptorSetWithTemplate2KHR(\n      const VULKAN_HPP_NAMESPACE::PushDescriptorSetWithTemplateInfo & pushDescriptorSetWithTemplateInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdPushDescriptorSetWithTemplate2KHR &&\n                         \"Function <vkCmdPushDescriptorSetWithTemplate2KHR> requires <VK_KHR_maintenance6> or <VK_VERSION_1_4>\" );\n\n      getDispatcher()->vkCmdPushDescriptorSetWithTemplate2KHR(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkPushDescriptorSetWithTemplateInfo *>( &pushDescriptorSetWithTemplateInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::setDescriptorBufferOffsets2EXT(\n      const VULKAN_HPP_NAMESPACE::SetDescriptorBufferOffsetsInfoEXT & setDescriptorBufferOffsetsInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdSetDescriptorBufferOffsets2EXT &&\n                         \"Function <vkCmdSetDescriptorBufferOffsets2EXT> requires <VK_KHR_maintenance6>\" );\n\n      getDispatcher()->vkCmdSetDescriptorBufferOffsets2EXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                            reinterpret_cast<const VkSetDescriptorBufferOffsetsInfoEXT *>( &setDescriptorBufferOffsetsInfo ) );\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::bindDescriptorBufferEmbeddedSamplers2EXT(\n      const VULKAN_HPP_NAMESPACE::BindDescriptorBufferEmbeddedSamplersInfoEXT & bindDescriptorBufferEmbeddedSamplersInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBindDescriptorBufferEmbeddedSamplers2EXT &&\n                         \"Function <vkCmdBindDescriptorBufferEmbeddedSamplers2EXT> requires <VK_KHR_maintenance6>\" );\n\n      getDispatcher()->vkCmdBindDescriptorBufferEmbeddedSamplers2EXT(\n        static_cast<VkCommandBuffer>( m_commandBuffer ),\n        reinterpret_cast<const VkBindDescriptorBufferEmbeddedSamplersInfoEXT *>( &bindDescriptorBufferEmbeddedSamplersInfo ) );\n    }\n\n    //=== VK_NV_cluster_acceleration_structure ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR Device::getClusterAccelerationStructureBuildSizesNV(\n      const VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureInputInfoNV & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetClusterAccelerationStructureBuildSizesNV &&\n                         \"Function <vkGetClusterAccelerationStructureBuildSizesNV> requires <VK_NV_cluster_acceleration_structure>\" );\n\n      VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR sizeInfo;\n      getDispatcher()->vkGetClusterAccelerationStructureBuildSizesNV( static_cast<VkDevice>( m_device ),\n                                                                      reinterpret_cast<const VkClusterAccelerationStructureInputInfoNV *>( &info ),\n                                                                      reinterpret_cast<VkAccelerationStructureBuildSizesInfoKHR *>( &sizeInfo ) );\n\n      return sizeInfo;\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::buildClusterAccelerationStructureIndirectNV(\n      const VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureCommandsInfoNV & commandInfos ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBuildClusterAccelerationStructureIndirectNV &&\n                         \"Function <vkCmdBuildClusterAccelerationStructureIndirectNV> requires <VK_NV_cluster_acceleration_structure>\" );\n\n      getDispatcher()->vkCmdBuildClusterAccelerationStructureIndirectNV(\n        static_cast<VkCommandBuffer>( m_commandBuffer ), reinterpret_cast<const VkClusterAccelerationStructureCommandsInfoNV *>( &commandInfos ) );\n    }\n\n    //=== VK_NV_partitioned_acceleration_structure ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR\n      Device::getPartitionedAccelerationStructuresBuildSizesNV( const VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureInstancesInputNV & info ) const\n      VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPartitionedAccelerationStructuresBuildSizesNV &&\n                         \"Function <vkGetPartitionedAccelerationStructuresBuildSizesNV> requires <VK_NV_partitioned_acceleration_structure>\" );\n\n      VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR sizeInfo;\n      getDispatcher()->vkGetPartitionedAccelerationStructuresBuildSizesNV(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkPartitionedAccelerationStructureInstancesInputNV *>( &info ),\n        reinterpret_cast<VkAccelerationStructureBuildSizesInfoKHR *>( &sizeInfo ) );\n\n      return sizeInfo;\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::buildPartitionedAccelerationStructuresNV(\n      const VULKAN_HPP_NAMESPACE::BuildPartitionedAccelerationStructureInfoNV & buildInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdBuildPartitionedAccelerationStructuresNV &&\n                         \"Function <vkCmdBuildPartitionedAccelerationStructuresNV> requires <VK_NV_partitioned_acceleration_structure>\" );\n\n      getDispatcher()->vkCmdBuildPartitionedAccelerationStructuresNV( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                                      reinterpret_cast<const VkBuildPartitionedAccelerationStructureInfoNV *>( &buildInfo ) );\n    }\n\n    //=== VK_EXT_device_generated_commands ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2 Device::getGeneratedCommandsMemoryRequirementsEXT(\n      const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoEXT & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetGeneratedCommandsMemoryRequirementsEXT &&\n                         \"Function <vkGetGeneratedCommandsMemoryRequirementsEXT> requires <VK_EXT_device_generated_commands>\" );\n\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;\n      getDispatcher()->vkGetGeneratedCommandsMemoryRequirementsEXT( static_cast<VkDevice>( m_device ),\n                                                                    reinterpret_cast<const VkGeneratedCommandsMemoryRequirementsInfoEXT *>( &info ),\n                                                                    reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n      return memoryRequirements;\n    }\n\n    template <typename X, typename Y, typename... Z>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> Device::getGeneratedCommandsMemoryRequirementsEXT(\n      const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoEXT & info ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetGeneratedCommandsMemoryRequirementsEXT &&\n                         \"Function <vkGetGeneratedCommandsMemoryRequirementsEXT> requires <VK_EXT_device_generated_commands>\" );\n\n      VULKAN_HPP_NAMESPACE::StructureChain<X, Y, Z...> structureChain;\n      VULKAN_HPP_NAMESPACE::MemoryRequirements2 &      memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();\n      getDispatcher()->vkGetGeneratedCommandsMemoryRequirementsEXT( static_cast<VkDevice>( m_device ),\n                                                                    reinterpret_cast<const VkGeneratedCommandsMemoryRequirementsInfoEXT *>( &info ),\n                                                                    reinterpret_cast<VkMemoryRequirements2 *>( &memoryRequirements ) );\n\n      return structureChain;\n    }\n\n    VULKAN_HPP_INLINE void CommandBuffer::preprocessGeneratedCommandsEXT( const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoEXT & generatedCommandsInfo,\n                                                                          VULKAN_HPP_NAMESPACE::CommandBuffer stateCommandBuffer ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdPreprocessGeneratedCommandsEXT &&\n                         \"Function <vkCmdPreprocessGeneratedCommandsEXT> requires <VK_EXT_device_generated_commands>\" );\n\n      getDispatcher()->vkCmdPreprocessGeneratedCommandsEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                            reinterpret_cast<const VkGeneratedCommandsInfoEXT *>( &generatedCommandsInfo ),\n                                                            static_cast<VkCommandBuffer>( stateCommandBuffer ) );\n    }\n\n    VULKAN_HPP_INLINE void\n      CommandBuffer::executeGeneratedCommandsEXT( VULKAN_HPP_NAMESPACE::Bool32                           isPreprocessed,\n                                                  const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoEXT & generatedCommandsInfo ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkCmdExecuteGeneratedCommandsEXT &&\n                         \"Function <vkCmdExecuteGeneratedCommandsEXT> requires <VK_EXT_device_generated_commands>\" );\n\n      getDispatcher()->vkCmdExecuteGeneratedCommandsEXT( static_cast<VkCommandBuffer>( m_commandBuffer ),\n                                                         static_cast<VkBool32>( isPreprocessed ),\n                                                         reinterpret_cast<const VkGeneratedCommandsInfoEXT *>( &generatedCommandsInfo ) );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::IndirectCommandsLayoutEXT>::Type\n      Device::createIndirectCommandsLayoutEXT( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoEXT const &               createInfo,\n                                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT indirectCommandsLayout;\n      VULKAN_HPP_NAMESPACE::Result                    result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateIndirectCommandsLayoutEXT(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkIndirectCommandsLayoutCreateInfoEXT *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkIndirectCommandsLayoutEXT *>( &indirectCommandsLayout ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createIndirectCommandsLayoutEXT\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::IndirectCommandsLayoutEXT(\n        *this, *reinterpret_cast<VkIndirectCommandsLayoutEXT *>( &indirectCommandsLayout ), allocator );\n    }\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::detail::CreateReturnType<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::IndirectExecutionSetEXT>::Type\n      Device::createIndirectExecutionSetEXT( VULKAN_HPP_NAMESPACE::IndirectExecutionSetCreateInfoEXT const &                 createInfo,\n                                             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator ) const\n      VULKAN_HPP_RAII_CREATE_NOEXCEPT\n    {\n      VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT indirectExecutionSet;\n      VULKAN_HPP_NAMESPACE::Result                  result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkCreateIndirectExecutionSetEXT(\n        static_cast<VkDevice>( m_device ),\n        reinterpret_cast<const VkIndirectExecutionSetCreateInfoEXT *>( &createInfo ),\n        reinterpret_cast<const VkAllocationCallbacks *>( static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ),\n        reinterpret_cast<VkIndirectExecutionSetEXT *>( &indirectExecutionSet ) ) );\n      if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )\n      {\n#  if defined( VULKAN_HPP_RAII_NO_EXCEPTIONS )\n        return VULKAN_HPP_UNEXPECTED( result );\n#  else\n        VULKAN_HPP_NAMESPACE::detail::throwResultException( result, \"Device::createIndirectExecutionSetEXT\" );\n#  endif\n      }\n\n      return VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::IndirectExecutionSetEXT(\n        *this, *reinterpret_cast<VkIndirectExecutionSetEXT *>( &indirectExecutionSet ), allocator );\n    }\n\n    VULKAN_HPP_INLINE void IndirectExecutionSetEXT::updatePipeline(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetPipelineEXT> const & executionSetWrites ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkUpdateIndirectExecutionSetPipelineEXT &&\n                         \"Function <vkUpdateIndirectExecutionSetPipelineEXT> requires <VK_EXT_device_generated_commands>\" );\n\n      getDispatcher()->vkUpdateIndirectExecutionSetPipelineEXT( static_cast<VkDevice>( m_device ),\n                                                                static_cast<VkIndirectExecutionSetEXT>( m_indirectExecutionSet ),\n                                                                executionSetWrites.size(),\n                                                                reinterpret_cast<const VkWriteIndirectExecutionSetPipelineEXT *>( executionSetWrites.data() ) );\n    }\n\n    VULKAN_HPP_INLINE void IndirectExecutionSetEXT::updateShader(\n      VULKAN_HPP_NAMESPACE::ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetShaderEXT> const & executionSetWrites ) const VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkUpdateIndirectExecutionSetShaderEXT &&\n                         \"Function <vkUpdateIndirectExecutionSetShaderEXT> requires <VK_EXT_device_generated_commands>\" );\n\n      getDispatcher()->vkUpdateIndirectExecutionSetShaderEXT( static_cast<VkDevice>( m_device ),\n                                                              static_cast<VkIndirectExecutionSetEXT>( m_indirectExecutionSet ),\n                                                              executionSetWrites.size(),\n                                                              reinterpret_cast<const VkWriteIndirectExecutionSetShaderEXT *>( executionSetWrites.data() ) );\n    }\n\n    //=== VK_NV_cooperative_matrix2 ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixFlexibleDimensionsPropertiesNV>\n                                           PhysicalDevice::getCooperativeMatrixFlexibleDimensionsPropertiesNV() const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV &&\n                         \"Function <vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV> requires <VK_NV_cooperative_matrix2>\" );\n\n      std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixFlexibleDimensionsPropertiesNV> properties;\n      uint32_t                                                                           propertyCount;\n      VULKAN_HPP_NAMESPACE::Result                                                       result;\n      do\n      {\n        result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV(\n          static_cast<VkPhysicalDevice>( m_physicalDevice ), &propertyCount, nullptr ) );\n        if ( ( result == VULKAN_HPP_NAMESPACE::Result::eSuccess ) && propertyCount )\n        {\n          properties.resize( propertyCount );\n          result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV(\n            static_cast<VkPhysicalDevice>( m_physicalDevice ),\n            &propertyCount,\n            reinterpret_cast<VkCooperativeMatrixFlexibleDimensionsPropertiesNV *>( properties.data() ) ) );\n        }\n      } while ( result == VULKAN_HPP_NAMESPACE::Result::eIncomplete );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::PhysicalDevice::getCooperativeMatrixFlexibleDimensionsPropertiesNV\" );\n      VULKAN_HPP_ASSERT( propertyCount <= properties.size() );\n      if ( propertyCount < properties.size() )\n      {\n        properties.resize( propertyCount );\n      }\n      return properties;\n    }\n\n#  if defined( VK_USE_PLATFORM_METAL_EXT )\n    //=== VK_EXT_external_memory_metal ===\n\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE void *\n      Device::getMemoryMetalHandleEXT( const VULKAN_HPP_NAMESPACE::MemoryGetMetalHandleInfoEXT & getMetalHandleInfo ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetMemoryMetalHandleEXT && \"Function <vkGetMemoryMetalHandleEXT> requires <VK_EXT_external_memory_metal>\" );\n\n      void *                       handle;\n      VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetMemoryMetalHandleEXT(\n        static_cast<VkDevice>( m_device ), reinterpret_cast<const VkMemoryGetMetalHandleInfoEXT *>( &getMetalHandleInfo ), &handle ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getMemoryMetalHandleEXT\" );\n\n      return handle;\n    }\n\n    template <typename HandleType>\n    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryMetalHandlePropertiesEXT\n      Device::getMemoryMetalHandlePropertiesEXT( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType, HandleType const & handle ) const\n    {\n      VULKAN_HPP_ASSERT( getDispatcher()->vkGetMemoryMetalHandlePropertiesEXT &&\n                         \"Function <vkGetMemoryMetalHandlePropertiesEXT> requires <VK_EXT_external_memory_metal>\" );\n\n      VULKAN_HPP_NAMESPACE::MemoryMetalHandlePropertiesEXT memoryMetalHandleProperties;\n      VULKAN_HPP_NAMESPACE::Result                         result = static_cast<VULKAN_HPP_NAMESPACE::Result>(\n        getDispatcher()->vkGetMemoryMetalHandlePropertiesEXT( static_cast<VkDevice>( m_device ),\n                                                              static_cast<VkExternalMemoryHandleTypeFlagBits>( handleType ),\n                                                              reinterpret_cast<const void *>( &handle ),\n                                                              reinterpret_cast<VkMemoryMetalHandlePropertiesEXT *>( &memoryMetalHandleProperties ) ) );\n      VULKAN_HPP_NAMESPACE::detail::resultCheck( result, VULKAN_HPP_NAMESPACE_STRING \"::Device::getMemoryMetalHandlePropertiesEXT\" );\n\n      return memoryMetalHandleProperties;\n    }\n#  endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n    //====================\n    //=== RAII Helpers ===\n    //====================\n\n    template <typename RAIIType>\n    std::vector<typename RAIIType::CppType> filterCppTypes( std::vector<RAIIType> const & raiiTypes )\n    {\n      std::vector<typename RAIIType::CppType> cppTypes( raiiTypes.size() );\n      std::transform( raiiTypes.begin(), raiiTypes.end(), cppTypes.begin(), []( RAIIType const & d ) { return *d; } );\n      return cppTypes;\n    }\n\n    template <typename RAIIType, class UnaryPredicate>\n    std::vector<typename RAIIType::CppType> filterCppTypes( std::vector<RAIIType> const & raiiTypes, UnaryPredicate p )\n    {\n      std::vector<typename RAIIType::CppType> cppTypes;\n      for ( auto const & t : raiiTypes )\n      {\n        if ( p( t ) )\n        {\n          cppTypes.push_back( *t );\n        }\n      }\n      return cppTypes;\n    }\n\n  }  // namespace VULKAN_HPP_RAII_NAMESPACE\n}  // namespace VULKAN_HPP_NAMESPACE\n#endif\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_screen.h",
    "content": "#ifndef VULKAN_SCREEN_H_\n#define VULKAN_SCREEN_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// VK_QNX_screen_surface is a preprocessor guard. Do not pass it to API calls.\n#define VK_QNX_screen_surface 1\n#define VK_QNX_SCREEN_SURFACE_SPEC_VERSION 1\n#define VK_QNX_SCREEN_SURFACE_EXTENSION_NAME \"VK_QNX_screen_surface\"\ntypedef VkFlags VkScreenSurfaceCreateFlagsQNX;\ntypedef struct VkScreenSurfaceCreateInfoQNX {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkScreenSurfaceCreateFlagsQNX    flags;\n    struct _screen_context*          context;\n    struct _screen_window*           window;\n} VkScreenSurfaceCreateInfoQNX;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateScreenSurfaceQNX)(VkInstance instance, const VkScreenSurfaceCreateInfoQNX* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);\ntypedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, struct _screen_window* window);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateScreenSurfaceQNX(\n    VkInstance                                  instance,\n    const VkScreenSurfaceCreateInfoQNX*         pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSurfaceKHR*                               pSurface);\n\nVKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceScreenPresentationSupportQNX(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t                                    queueFamilyIndex,\n    struct _screen_window*                      window);\n#endif\n\n\n// VK_QNX_external_memory_screen_buffer is a preprocessor guard. Do not pass it to API calls.\n#define VK_QNX_external_memory_screen_buffer 1\n#define VK_QNX_EXTERNAL_MEMORY_SCREEN_BUFFER_SPEC_VERSION 1\n#define VK_QNX_EXTERNAL_MEMORY_SCREEN_BUFFER_EXTENSION_NAME \"VK_QNX_external_memory_screen_buffer\"\ntypedef struct VkScreenBufferPropertiesQNX {\n    VkStructureType    sType;\n    void*              pNext;\n    VkDeviceSize       allocationSize;\n    uint32_t           memoryTypeBits;\n} VkScreenBufferPropertiesQNX;\n\ntypedef struct VkScreenBufferFormatPropertiesQNX {\n    VkStructureType                  sType;\n    void*                            pNext;\n    VkFormat                         format;\n    uint64_t                         externalFormat;\n    uint64_t                         screenUsage;\n    VkFormatFeatureFlags             formatFeatures;\n    VkComponentMapping               samplerYcbcrConversionComponents;\n    VkSamplerYcbcrModelConversion    suggestedYcbcrModel;\n    VkSamplerYcbcrRange              suggestedYcbcrRange;\n    VkChromaLocation                 suggestedXChromaOffset;\n    VkChromaLocation                 suggestedYChromaOffset;\n} VkScreenBufferFormatPropertiesQNX;\n\ntypedef struct VkImportScreenBufferInfoQNX {\n    VkStructureType           sType;\n    const void*               pNext;\n    struct _screen_buffer*    buffer;\n} VkImportScreenBufferInfoQNX;\n\ntypedef struct VkExternalFormatQNX {\n    VkStructureType    sType;\n    void*              pNext;\n    uint64_t           externalFormat;\n} VkExternalFormatQNX;\n\ntypedef struct VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           screenBufferImport;\n} VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetScreenBufferPropertiesQNX)(VkDevice device, const struct _screen_buffer* buffer, VkScreenBufferPropertiesQNX* pProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetScreenBufferPropertiesQNX(\n    VkDevice                                    device,\n    const struct _screen_buffer*                buffer,\n    VkScreenBufferPropertiesQNX*                pProperties);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_shared.hpp",
    "content": "// Copyright 2015-2025 The Khronos Group Inc.\n//\n// SPDX-License-Identifier: Apache-2.0 OR MIT\n//\n\n// This header is generated from the Khronos Vulkan XML API Registry.\n\n#ifndef VULKAN_SHARED_HPP\n#define VULKAN_SHARED_HPP\n\n#include <vulkan/vulkan.hpp>\n\n#if !( defined( VULKAN_HPP_ENABLE_STD_MODULE ) && defined( VULKAN_HPP_STD_MODULE ) )\n#  include <atomic>  // std::atomic_size_t\n#endif\n\nnamespace VULKAN_HPP_NAMESPACE\n{\n#if !defined( VULKAN_HPP_NO_SMART_HANDLE )\n\n  template <typename HandleType>\n  class SharedHandleTraits;\n\n  class NoDestructor\n  {\n  };\n\n  template <typename HandleType, typename = void>\n  struct HasDestructorType : std::false_type\n  {\n  };\n\n  template <typename HandleType>\n  struct HasDestructorType<HandleType, decltype( (void)typename SharedHandleTraits<HandleType>::DestructorType() )> : std::true_type\n  {\n  };\n\n  template <typename HandleType, typename Enable = void>\n  struct GetDestructorType\n  {\n    using type = NoDestructor;\n  };\n\n  template <typename HandleType>\n  struct GetDestructorType<HandleType, typename std::enable_if<HasDestructorType<HandleType>::value>::type>\n  {\n    using type = typename SharedHandleTraits<HandleType>::DestructorType;\n  };\n\n  template <class HandleType>\n  using DestructorTypeOf = typename GetDestructorType<HandleType>::type;\n\n  template <class HandleType>\n  struct HasDestructor : std::integral_constant<bool, !std::is_same<DestructorTypeOf<HandleType>, NoDestructor>::value>\n  {\n  };\n\n  template <typename HandleType, typename = void>\n  struct HasPoolType : std::false_type\n  {\n  };\n\n  template <typename HandleType>\n  struct HasPoolType<HandleType, decltype( (void)typename SharedHandleTraits<HandleType>::deleter::PoolTypeExport() )> : std::true_type\n  {\n  };\n\n  template <typename HandleType, typename Enable = void>\n  struct GetPoolType\n  {\n    using type = NoDestructor;\n  };\n\n  template <typename HandleType>\n  struct GetPoolType<HandleType, typename std::enable_if<HasPoolType<HandleType>::value>::type>\n  {\n    using type = typename SharedHandleTraits<HandleType>::deleter::PoolTypeExport;\n  };\n\n  //=====================================================================================================================\n\n  template <typename HandleType>\n  class SharedHandle;\n\n  template <typename DestructorType, typename Deleter>\n  struct SharedHeader\n  {\n    SharedHeader( SharedHandle<DestructorType> parent, Deleter deleter = Deleter() ) VULKAN_HPP_NOEXCEPT\n      : parent( std::move( parent ) )\n      , deleter( std::move( deleter ) )\n    {\n    }\n\n    SharedHandle<DestructorType> parent;\n    Deleter                      deleter;\n  };\n\n  template <typename Deleter>\n  struct SharedHeader<NoDestructor, Deleter>\n  {\n    SharedHeader( Deleter deleter = Deleter() ) VULKAN_HPP_NOEXCEPT : deleter( std::move( deleter ) ) {}\n\n    Deleter deleter;\n  };\n\n  //=====================================================================================================================\n\n  template <typename HeaderType>\n  class ReferenceCounter\n  {\n  public:\n    template <typename... Args>\n    ReferenceCounter( Args &&... control_args ) : m_header( std::forward<Args>( control_args )... )\n    {\n    }\n\n    ReferenceCounter( const ReferenceCounter & )             = delete;\n    ReferenceCounter & operator=( const ReferenceCounter & ) = delete;\n\n  public:\n    size_t addRef() VULKAN_HPP_NOEXCEPT\n    {\n      // Relaxed memory order is sufficient since this does not impose any ordering on other operations\n      return m_ref_cnt.fetch_add( 1, std::memory_order_relaxed );\n    }\n\n    size_t release() VULKAN_HPP_NOEXCEPT\n    {\n      // A release memory order to ensure that all releases are ordered\n      return m_ref_cnt.fetch_sub( 1, std::memory_order_release );\n    }\n\n  public:\n    std::atomic_size_t m_ref_cnt{ 1 };\n    HeaderType         m_header{};\n  };\n\n  //=====================================================================================================================\n\n  template <typename HandleType, typename HeaderType, typename ForwardType = SharedHandle<HandleType>>\n  class SharedHandleBase\n  {\n  public:\n    SharedHandleBase() = default;\n\n    template <typename... Args>\n    SharedHandleBase( HandleType handle, Args &&... control_args )\n      : m_control( new ReferenceCounter<HeaderType>( std::forward<Args>( control_args )... ) ), m_handle( handle )\n    {\n    }\n\n    SharedHandleBase( const SharedHandleBase & o ) VULKAN_HPP_NOEXCEPT\n    {\n      o.addRef();\n      m_handle  = o.m_handle;\n      m_control = o.m_control;\n    }\n\n    SharedHandleBase( SharedHandleBase && o ) VULKAN_HPP_NOEXCEPT\n      : m_control( o.m_control )\n      , m_handle( o.m_handle )\n    {\n      o.m_handle  = nullptr;\n      o.m_control = nullptr;\n    }\n\n    SharedHandleBase & operator=( const SharedHandleBase & o ) VULKAN_HPP_NOEXCEPT\n    {\n      SharedHandleBase( o ).swap( *this );\n      return *this;\n    }\n\n    SharedHandleBase & operator=( SharedHandleBase && o ) VULKAN_HPP_NOEXCEPT\n    {\n      SharedHandleBase( std::move( o ) ).swap( *this );\n      return *this;\n    }\n\n    ~SharedHandleBase()\n    {\n      // only this function owns the last reference to the control block\n      // the same principle is used in the default deleter of std::shared_ptr\n      if ( m_control && ( m_control->release() == 1 ) )\n      {\n        // noop in x86, but does thread synchronization in ARM\n        // it is required to ensure that last thread is getting to destroy the control block\n        // by ordering all atomic operations before this fence\n        std::atomic_thread_fence( std::memory_order_acquire );\n        ForwardType::internalDestroy( getHeader(), m_handle );\n        delete m_control;\n      }\n    }\n\n  public:\n    HandleType get() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_handle;\n    }\n\n    HandleType operator*() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_handle;\n    }\n\n    explicit operator bool() const VULKAN_HPP_NOEXCEPT\n    {\n      return bool( m_handle );\n    }\n\n#  if defined( VULKAN_HPP_SMART_HANDLE_IMPLICIT_CAST )\n    operator HandleType() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_handle;\n    }\n#  endif\n\n    const HandleType * operator->() const VULKAN_HPP_NOEXCEPT\n    {\n      return &m_handle;\n    }\n\n    HandleType * operator->() VULKAN_HPP_NOEXCEPT\n    {\n      return &m_handle;\n    }\n\n    void reset() VULKAN_HPP_NOEXCEPT\n    {\n      SharedHandleBase().swap( *this );\n    }\n\n    void swap( SharedHandleBase & o ) VULKAN_HPP_NOEXCEPT\n    {\n      std::swap( m_handle, o.m_handle );\n      std::swap( m_control, o.m_control );\n    }\n\n    template <typename T = HandleType>\n    typename std::enable_if<HasDestructor<T>::value, const SharedHandle<DestructorTypeOf<HandleType>> &>::type getDestructorType() const VULKAN_HPP_NOEXCEPT\n    {\n      return getHeader().parent;\n    }\n\n  protected:\n    template <typename T = HandleType>\n    static typename std::enable_if<!HasDestructor<T>::value, void>::type internalDestroy( const HeaderType & control, HandleType handle ) VULKAN_HPP_NOEXCEPT\n    {\n      control.deleter.destroy( handle );\n    }\n\n    template <typename T = HandleType>\n    static typename std::enable_if<HasDestructor<T>::value, void>::type internalDestroy( const HeaderType & control, HandleType handle ) VULKAN_HPP_NOEXCEPT\n    {\n      control.deleter.destroy( control.parent.get(), handle );\n    }\n\n    const HeaderType & getHeader() const VULKAN_HPP_NOEXCEPT\n    {\n      return m_control->m_header;\n    }\n\n  private:\n    void addRef() const VULKAN_HPP_NOEXCEPT\n    {\n      if ( m_control )\n        m_control->addRef();\n    }\n\n  protected:\n    ReferenceCounter<HeaderType> * m_control = nullptr;\n    HandleType                     m_handle{};\n  };\n\n  template <typename HandleType>\n  class SharedHandle : public SharedHandleBase<HandleType, SharedHeader<DestructorTypeOf<HandleType>, typename SharedHandleTraits<HandleType>::deleter>>\n  {\n  private:\n    using BaseType    = SharedHandleBase<HandleType, SharedHeader<DestructorTypeOf<HandleType>, typename SharedHandleTraits<HandleType>::deleter>>;\n    using DeleterType = typename SharedHandleTraits<HandleType>::deleter;\n    friend BaseType;\n\n  public:\n    SharedHandle() = default;\n\n    template <typename T = HandleType, typename = typename std::enable_if<HasDestructor<T>::value && !HasPoolType<T>::value>::type>\n    explicit SharedHandle( HandleType handle, SharedHandle<DestructorTypeOf<HandleType>> parent, DeleterType deleter = DeleterType() ) VULKAN_HPP_NOEXCEPT\n      : BaseType( handle, std::move( parent ), std::move( deleter ) )\n    {\n    }\n\n    template <typename Dispatcher = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE,\n              typename T          = HandleType,\n              typename            = typename std::enable_if<HasDestructor<T>::value && HasPoolType<T>::value>::type>\n    explicit SharedHandle( HandleType                                           handle,\n                           SharedHandle<DestructorTypeOf<HandleType>>           parent,\n                           SharedHandle<typename GetPoolType<HandleType>::type> pool,\n                           const Dispatcher & dispatch                          VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) VULKAN_HPP_NOEXCEPT\n      : BaseType( handle, std::move( parent ), DeleterType{ std::move( pool ), dispatch } )\n    {\n    }\n\n    template <typename T = HandleType, typename = typename std::enable_if<!HasDestructor<T>::value>::type>\n    explicit SharedHandle( HandleType handle, DeleterType deleter = DeleterType() ) VULKAN_HPP_NOEXCEPT : BaseType( handle, std::move( deleter ) )\n    {\n    }\n\n  protected:\n    using BaseType::internalDestroy;\n  };\n\n  namespace detail\n  {\n\n// Silence the function cast warnings.\n#  if defined( __GNUC__ ) && !defined( __clang__ ) && !defined( __INTEL_COMPILER )\n#    pragma GCC diagnostic push\n#    pragma GCC diagnostic ignored \"-Wcast-function-type\"\n#  endif\n\n    template <typename HandleType>\n    class ObjectDestroyShared\n    {\n    public:\n      using DestructorType = typename SharedHandleTraits<HandleType>::DestructorType;\n\n      template <class Dispatcher>\n      using DestroyFunctionPointerType =\n        typename std::conditional<HasDestructor<HandleType>::value,\n                                  void ( DestructorType::* )( HandleType, const AllocationCallbacks *, const Dispatcher & ) const,\n                                  void ( HandleType::* )( const AllocationCallbacks *, const Dispatcher & ) const>::type;\n\n      using SelectorType = typename std::conditional<HasDestructor<HandleType>::value, DestructorType, HandleType>::type;\n\n      template <typename Dispatcher = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n      ObjectDestroyShared( Optional<const AllocationCallbacks> allocationCallbacks VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                           const Dispatcher & dispatch                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT )\n        : m_destroy( reinterpret_cast<decltype( m_destroy )>( static_cast<DestroyFunctionPointerType<Dispatcher>>( &SelectorType::destroy ) ) )\n        , m_dispatch( &dispatch )\n        , m_allocationCallbacks( allocationCallbacks )\n      {\n      }\n\n    public:\n      template <typename T = HandleType>\n      typename std::enable_if<HasDestructor<T>::value, void>::type destroy( DestructorType parent, HandleType handle ) const VULKAN_HPP_NOEXCEPT\n      {\n        VULKAN_HPP_ASSERT( m_destroy && m_dispatch );\n        ( parent.*m_destroy )( handle, m_allocationCallbacks, *m_dispatch );\n      }\n\n      template <typename T = HandleType>\n      typename std::enable_if<!HasDestructor<T>::value, void>::type destroy( HandleType handle ) const VULKAN_HPP_NOEXCEPT\n      {\n        VULKAN_HPP_ASSERT( m_destroy && m_dispatch );\n        ( handle.*m_destroy )( m_allocationCallbacks, *m_dispatch );\n      }\n\n    private:\n      DestroyFunctionPointerType<detail::DispatchLoaderBase> m_destroy             = nullptr;\n      const detail::DispatchLoaderBase *                     m_dispatch            = nullptr;\n      Optional<const AllocationCallbacks>                    m_allocationCallbacks = nullptr;\n    };\n\n    template <typename HandleType>\n    class ObjectFreeShared\n    {\n    public:\n      using DestructorType = typename SharedHandleTraits<HandleType>::DestructorType;\n\n      template <class Dispatcher>\n      using DestroyFunctionPointerType = void ( DestructorType::* )( HandleType, const AllocationCallbacks *, const Dispatcher & ) const;\n\n      template <class Dispatcher = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n      ObjectFreeShared( Optional<const AllocationCallbacks> allocationCallbacks VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,\n                        const Dispatcher & dispatch                             VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT )\n        : m_destroy( reinterpret_cast<decltype( m_destroy )>( static_cast<DestroyFunctionPointerType<Dispatcher>>( &DestructorType::free ) ) )\n        , m_dispatch( &dispatch )\n        , m_allocationCallbacks( allocationCallbacks )\n      {\n      }\n\n    public:\n      void destroy( DestructorType parent, HandleType handle ) const VULKAN_HPP_NOEXCEPT\n      {\n        VULKAN_HPP_ASSERT( m_destroy && m_dispatch );\n        ( parent.*m_destroy )( handle, m_allocationCallbacks, *m_dispatch );\n      }\n\n    private:\n      DestroyFunctionPointerType<detail::DispatchLoaderBase> m_destroy             = nullptr;\n      const detail::DispatchLoaderBase *                     m_dispatch            = nullptr;\n      Optional<const AllocationCallbacks>                    m_allocationCallbacks = nullptr;\n    };\n\n    template <typename HandleType>\n    class ObjectReleaseShared\n    {\n    public:\n      using DestructorType = typename SharedHandleTraits<HandleType>::DestructorType;\n\n      template <class Dispatcher>\n      using DestroyFunctionPointerType = void ( DestructorType::* )( HandleType, const Dispatcher & ) const;\n\n      template <class Dispatcher = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n      ObjectReleaseShared( const Dispatcher & dispatch VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT )\n        : m_destroy( reinterpret_cast<decltype( m_destroy )>( static_cast<DestroyFunctionPointerType<Dispatcher>>( &DestructorType::release ) ) )\n        , m_dispatch( &dispatch )\n      {\n      }\n\n    public:\n      void destroy( DestructorType parent, HandleType handle ) const VULKAN_HPP_NOEXCEPT\n      {\n        VULKAN_HPP_ASSERT( m_destroy && m_dispatch );\n        ( parent.*m_destroy )( handle, *m_dispatch );\n      }\n\n    private:\n      DestroyFunctionPointerType<detail::DispatchLoaderBase> m_destroy  = nullptr;\n      const detail::DispatchLoaderBase *                     m_dispatch = nullptr;\n    };\n\n    template <typename HandleType, typename PoolType>\n    class PoolFreeShared\n    {\n    public:\n      using DestructorType = typename SharedHandleTraits<HandleType>::DestructorType;\n\n      using PoolTypeExport = PoolType;\n\n      template <class Dispatcher>\n      using ReturnType = decltype( std::declval<DestructorType>().free( PoolType(), 0u, nullptr, Dispatcher() ) );\n\n      template <class Dispatcher>\n      using DestroyFunctionPointerType = ReturnType<Dispatcher> ( DestructorType::* )( PoolType, uint32_t, const HandleType *, const Dispatcher & ) const;\n\n      PoolFreeShared() = default;\n\n      template <class Dispatcher = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>\n      PoolFreeShared( SharedHandle<PoolType> pool, const Dispatcher & dispatch VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT )\n        : m_destroy( reinterpret_cast<decltype( m_destroy )>( static_cast<DestroyFunctionPointerType<Dispatcher>>( &DestructorType::free ) ) )\n        , m_dispatch( &dispatch )\n        , m_pool( std::move( pool ) )\n      {\n      }\n\n    public:\n      void destroy( DestructorType parent, HandleType handle ) const VULKAN_HPP_NOEXCEPT\n      {\n        VULKAN_HPP_ASSERT( m_destroy && m_dispatch && m_pool );\n        ( parent.*m_destroy )( m_pool.get(), 1u, &handle, *m_dispatch );\n      }\n\n    private:\n      DestroyFunctionPointerType<detail::DispatchLoaderBase> m_destroy  = nullptr;\n      const detail::DispatchLoaderBase *                     m_dispatch = nullptr;\n      SharedHandle<PoolType>                                 m_pool{};\n    };\n\n#  if defined( __GNUC__ ) && !defined( __clang__ ) && !defined( __INTEL_COMPILER )\n#    pragma GCC diagnostic pop\n#  endif\n\n  }  // namespace detail\n\n  //======================\n  //=== SHARED HANDLEs ===\n  //======================\n\n  //=== VK_VERSION_1_0 ===\n  template <>\n  class SharedHandleTraits<Instance>\n  {\n  public:\n    using DestructorType = NoDestructor;\n    using deleter        = detail::ObjectDestroyShared<Instance>;\n  };\n\n  using SharedInstance = SharedHandle<Instance>;\n\n  template <>\n  class SharedHandleTraits<Device>\n  {\n  public:\n    using DestructorType = NoDestructor;\n    using deleter        = detail::ObjectDestroyShared<Device>;\n  };\n\n  using SharedDevice = SharedHandle<Device>;\n\n  template <>\n  class SharedHandleTraits<DeviceMemory>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectFreeShared<DeviceMemory>;\n  };\n\n  using SharedDeviceMemory = SharedHandle<DeviceMemory>;\n\n  template <>\n  class SharedHandleTraits<Fence>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<Fence>;\n  };\n\n  using SharedFence = SharedHandle<Fence>;\n\n  template <>\n  class SharedHandleTraits<Semaphore>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<Semaphore>;\n  };\n\n  using SharedSemaphore = SharedHandle<Semaphore>;\n\n  template <>\n  class SharedHandleTraits<Event>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<Event>;\n  };\n\n  using SharedEvent = SharedHandle<Event>;\n\n  template <>\n  class SharedHandleTraits<QueryPool>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<QueryPool>;\n  };\n\n  using SharedQueryPool = SharedHandle<QueryPool>;\n\n  template <>\n  class SharedHandleTraits<Buffer>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<Buffer>;\n  };\n\n  using SharedBuffer = SharedHandle<Buffer>;\n\n  template <>\n  class SharedHandleTraits<BufferView>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<BufferView>;\n  };\n\n  using SharedBufferView = SharedHandle<BufferView>;\n\n  template <>\n  class SharedHandleTraits<Image>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<Image>;\n  };\n\n  using SharedImage = SharedHandle<Image>;\n\n  template <>\n  class SharedHandleTraits<ImageView>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<ImageView>;\n  };\n\n  using SharedImageView = SharedHandle<ImageView>;\n\n  template <>\n  class SharedHandleTraits<ShaderModule>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<ShaderModule>;\n  };\n\n  using SharedShaderModule = SharedHandle<ShaderModule>;\n\n  template <>\n  class SharedHandleTraits<PipelineCache>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<PipelineCache>;\n  };\n\n  using SharedPipelineCache = SharedHandle<PipelineCache>;\n\n  template <>\n  class SharedHandleTraits<Pipeline>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<Pipeline>;\n  };\n\n  using SharedPipeline = SharedHandle<Pipeline>;\n\n  template <>\n  class SharedHandleTraits<PipelineLayout>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<PipelineLayout>;\n  };\n\n  using SharedPipelineLayout = SharedHandle<PipelineLayout>;\n\n  template <>\n  class SharedHandleTraits<Sampler>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<Sampler>;\n  };\n\n  using SharedSampler = SharedHandle<Sampler>;\n\n  template <>\n  class SharedHandleTraits<DescriptorPool>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<DescriptorPool>;\n  };\n\n  using SharedDescriptorPool = SharedHandle<DescriptorPool>;\n\n  template <>\n  class SharedHandleTraits<DescriptorSet>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::PoolFreeShared<DescriptorSet, DescriptorPool>;\n  };\n\n  using SharedDescriptorSet = SharedHandle<DescriptorSet>;\n\n  template <>\n  class SharedHandleTraits<DescriptorSetLayout>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<DescriptorSetLayout>;\n  };\n\n  using SharedDescriptorSetLayout = SharedHandle<DescriptorSetLayout>;\n\n  template <>\n  class SharedHandleTraits<Framebuffer>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<Framebuffer>;\n  };\n\n  using SharedFramebuffer = SharedHandle<Framebuffer>;\n\n  template <>\n  class SharedHandleTraits<RenderPass>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<RenderPass>;\n  };\n\n  using SharedRenderPass = SharedHandle<RenderPass>;\n\n  template <>\n  class SharedHandleTraits<CommandPool>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<CommandPool>;\n  };\n\n  using SharedCommandPool = SharedHandle<CommandPool>;\n\n  template <>\n  class SharedHandleTraits<CommandBuffer>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::PoolFreeShared<CommandBuffer, CommandPool>;\n  };\n\n  using SharedCommandBuffer = SharedHandle<CommandBuffer>;\n\n  //=== VK_VERSION_1_1 ===\n  template <>\n  class SharedHandleTraits<SamplerYcbcrConversion>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<SamplerYcbcrConversion>;\n  };\n\n  using SharedSamplerYcbcrConversion    = SharedHandle<SamplerYcbcrConversion>;\n  using SharedSamplerYcbcrConversionKHR = SharedHandle<SamplerYcbcrConversion>;\n\n  template <>\n  class SharedHandleTraits<DescriptorUpdateTemplate>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<DescriptorUpdateTemplate>;\n  };\n\n  using SharedDescriptorUpdateTemplate    = SharedHandle<DescriptorUpdateTemplate>;\n  using SharedDescriptorUpdateTemplateKHR = SharedHandle<DescriptorUpdateTemplate>;\n\n  //=== VK_VERSION_1_3 ===\n  template <>\n  class SharedHandleTraits<PrivateDataSlot>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<PrivateDataSlot>;\n  };\n\n  using SharedPrivateDataSlot    = SharedHandle<PrivateDataSlot>;\n  using SharedPrivateDataSlotEXT = SharedHandle<PrivateDataSlot>;\n\n  //=== VK_KHR_surface ===\n  template <>\n  class SharedHandleTraits<SurfaceKHR>\n  {\n  public:\n    using DestructorType = Instance;\n    using deleter        = detail::ObjectDestroyShared<SurfaceKHR>;\n  };\n\n  using SharedSurfaceKHR = SharedHandle<SurfaceKHR>;\n\n  //=== VK_KHR_swapchain ===\n  template <>\n  class SharedHandleTraits<SwapchainKHR>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<SwapchainKHR>;\n  };\n\n  using SharedSwapchainKHR = SharedHandle<SwapchainKHR>;\n\n  //=== VK_KHR_display ===\n  template <>\n  class SharedHandleTraits<DisplayKHR>\n  {\n  public:\n    using DestructorType = PhysicalDevice;\n    using deleter        = detail::ObjectDestroyShared<DisplayKHR>;\n  };\n\n  using SharedDisplayKHR = SharedHandle<DisplayKHR>;\n\n  //=== VK_EXT_debug_report ===\n  template <>\n  class SharedHandleTraits<DebugReportCallbackEXT>\n  {\n  public:\n    using DestructorType = Instance;\n    using deleter        = detail::ObjectDestroyShared<DebugReportCallbackEXT>;\n  };\n\n  using SharedDebugReportCallbackEXT = SharedHandle<DebugReportCallbackEXT>;\n\n  //=== VK_KHR_video_queue ===\n  template <>\n  class SharedHandleTraits<VideoSessionKHR>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<VideoSessionKHR>;\n  };\n\n  using SharedVideoSessionKHR = SharedHandle<VideoSessionKHR>;\n\n  template <>\n  class SharedHandleTraits<VideoSessionParametersKHR>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<VideoSessionParametersKHR>;\n  };\n\n  using SharedVideoSessionParametersKHR = SharedHandle<VideoSessionParametersKHR>;\n\n  //=== VK_NVX_binary_import ===\n  template <>\n  class SharedHandleTraits<CuModuleNVX>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<CuModuleNVX>;\n  };\n\n  using SharedCuModuleNVX = SharedHandle<CuModuleNVX>;\n\n  template <>\n  class SharedHandleTraits<CuFunctionNVX>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<CuFunctionNVX>;\n  };\n\n  using SharedCuFunctionNVX = SharedHandle<CuFunctionNVX>;\n\n  //=== VK_EXT_debug_utils ===\n  template <>\n  class SharedHandleTraits<DebugUtilsMessengerEXT>\n  {\n  public:\n    using DestructorType = Instance;\n    using deleter        = detail::ObjectDestroyShared<DebugUtilsMessengerEXT>;\n  };\n\n  using SharedDebugUtilsMessengerEXT = SharedHandle<DebugUtilsMessengerEXT>;\n\n  //=== VK_KHR_acceleration_structure ===\n  template <>\n  class SharedHandleTraits<AccelerationStructureKHR>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<AccelerationStructureKHR>;\n  };\n\n  using SharedAccelerationStructureKHR = SharedHandle<AccelerationStructureKHR>;\n\n  //=== VK_EXT_validation_cache ===\n  template <>\n  class SharedHandleTraits<ValidationCacheEXT>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<ValidationCacheEXT>;\n  };\n\n  using SharedValidationCacheEXT = SharedHandle<ValidationCacheEXT>;\n\n  //=== VK_NV_ray_tracing ===\n  template <>\n  class SharedHandleTraits<AccelerationStructureNV>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<AccelerationStructureNV>;\n  };\n\n  using SharedAccelerationStructureNV = SharedHandle<AccelerationStructureNV>;\n\n  //=== VK_INTEL_performance_query ===\n  template <>\n  class SharedHandleTraits<PerformanceConfigurationINTEL>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<PerformanceConfigurationINTEL>;\n  };\n\n  using SharedPerformanceConfigurationINTEL = SharedHandle<PerformanceConfigurationINTEL>;\n\n  //=== VK_KHR_deferred_host_operations ===\n  template <>\n  class SharedHandleTraits<DeferredOperationKHR>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<DeferredOperationKHR>;\n  };\n\n  using SharedDeferredOperationKHR = SharedHandle<DeferredOperationKHR>;\n\n  //=== VK_NV_device_generated_commands ===\n  template <>\n  class SharedHandleTraits<IndirectCommandsLayoutNV>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<IndirectCommandsLayoutNV>;\n  };\n\n  using SharedIndirectCommandsLayoutNV = SharedHandle<IndirectCommandsLayoutNV>;\n\n#  if defined( VK_ENABLE_BETA_EXTENSIONS )\n  //=== VK_NV_cuda_kernel_launch ===\n  template <>\n  class SharedHandleTraits<CudaModuleNV>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<CudaModuleNV>;\n  };\n\n  using SharedCudaModuleNV = SharedHandle<CudaModuleNV>;\n\n  template <>\n  class SharedHandleTraits<CudaFunctionNV>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<CudaFunctionNV>;\n  };\n\n  using SharedCudaFunctionNV = SharedHandle<CudaFunctionNV>;\n#  endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#  if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_buffer_collection ===\n  template <>\n  class SharedHandleTraits<BufferCollectionFUCHSIA>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<BufferCollectionFUCHSIA>;\n  };\n\n  using SharedBufferCollectionFUCHSIA = SharedHandle<BufferCollectionFUCHSIA>;\n#  endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  //=== VK_EXT_opacity_micromap ===\n  template <>\n  class SharedHandleTraits<MicromapEXT>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<MicromapEXT>;\n  };\n\n  using SharedMicromapEXT = SharedHandle<MicromapEXT>;\n\n  //=== VK_NV_optical_flow ===\n  template <>\n  class SharedHandleTraits<OpticalFlowSessionNV>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<OpticalFlowSessionNV>;\n  };\n\n  using SharedOpticalFlowSessionNV = SharedHandle<OpticalFlowSessionNV>;\n\n  //=== VK_EXT_shader_object ===\n  template <>\n  class SharedHandleTraits<ShaderEXT>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<ShaderEXT>;\n  };\n\n  using SharedShaderEXT = SharedHandle<ShaderEXT>;\n\n  //=== VK_KHR_pipeline_binary ===\n  template <>\n  class SharedHandleTraits<PipelineBinaryKHR>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<PipelineBinaryKHR>;\n  };\n\n  using SharedPipelineBinaryKHR = SharedHandle<PipelineBinaryKHR>;\n\n  //=== VK_EXT_device_generated_commands ===\n  template <>\n  class SharedHandleTraits<IndirectCommandsLayoutEXT>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<IndirectCommandsLayoutEXT>;\n  };\n\n  using SharedIndirectCommandsLayoutEXT = SharedHandle<IndirectCommandsLayoutEXT>;\n\n  template <>\n  class SharedHandleTraits<IndirectExecutionSetEXT>\n  {\n  public:\n    using DestructorType = Device;\n    using deleter        = detail::ObjectDestroyShared<IndirectExecutionSetEXT>;\n  };\n\n  using SharedIndirectExecutionSetEXT = SharedHandle<IndirectExecutionSetEXT>;\n\n  enum class SwapchainOwns\n  {\n    no,\n    yes,\n  };\n\n  struct ImageHeader : SharedHeader<DestructorTypeOf<VULKAN_HPP_NAMESPACE::Image>, typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::Image>::deleter>\n  {\n    ImageHeader(\n      SharedHandle<DestructorTypeOf<VULKAN_HPP_NAMESPACE::Image>>       parent,\n      typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::Image>::deleter deleter        = typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::Image>::deleter(),\n      SwapchainOwns                                                     swapchainOwned = SwapchainOwns::no ) VULKAN_HPP_NOEXCEPT\n      : SharedHeader<DestructorTypeOf<VULKAN_HPP_NAMESPACE::Image>, typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::Image>::deleter>( std::move( parent ),\n                                                                                                                                        std::move( deleter ) )\n      , swapchainOwned( swapchainOwned )\n    {\n    }\n\n    SwapchainOwns swapchainOwned = SwapchainOwns::no;\n  };\n\n  template <>\n  class SharedHandle<VULKAN_HPP_NAMESPACE::Image> : public SharedHandleBase<VULKAN_HPP_NAMESPACE::Image, ImageHeader>\n  {\n    using BaseType    = SharedHandleBase<VULKAN_HPP_NAMESPACE::Image, ImageHeader>;\n    using DeleterType = typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::Image>::deleter;\n    friend BaseType;\n\n  public:\n    SharedHandle() = default;\n\n    explicit SharedHandle( VULKAN_HPP_NAMESPACE::Image                                 handle,\n                           SharedHandle<DestructorTypeOf<VULKAN_HPP_NAMESPACE::Image>> parent,\n                           SwapchainOwns                                               swapchain_owned = SwapchainOwns::no,\n                           DeleterType                                                 deleter         = DeleterType() ) VULKAN_HPP_NOEXCEPT\n      : BaseType( handle, std::move( parent ), std::move( deleter ), swapchain_owned )\n    {\n    }\n\n  protected:\n    static void internalDestroy( const ImageHeader & control, VULKAN_HPP_NAMESPACE::Image handle ) VULKAN_HPP_NOEXCEPT\n    {\n      if ( control.swapchainOwned == SwapchainOwns::no )\n      {\n        control.deleter.destroy( control.parent.get(), handle );\n      }\n    }\n  };\n\n  struct SwapchainHeader\n  {\n    SwapchainHeader( SharedHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR>                           surface,\n                     SharedHandle<DestructorTypeOf<VULKAN_HPP_NAMESPACE::SwapchainKHR>>       parent,\n                     typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::SwapchainKHR>::deleter deleter =\n                       typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::SwapchainKHR>::deleter() ) VULKAN_HPP_NOEXCEPT\n      : surface( std::move( surface ) )\n      , parent( std::move( parent ) )\n      , deleter( std::move( deleter ) )\n    {\n    }\n\n    SharedHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR>                           surface{};\n    SharedHandle<DestructorTypeOf<VULKAN_HPP_NAMESPACE::SwapchainKHR>>       parent{};\n    typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::SwapchainKHR>::deleter deleter{};\n  };\n\n  template <>\n  class SharedHandle<VULKAN_HPP_NAMESPACE::SwapchainKHR> : public SharedHandleBase<VULKAN_HPP_NAMESPACE::SwapchainKHR, SwapchainHeader>\n  {\n    using BaseType    = SharedHandleBase<VULKAN_HPP_NAMESPACE::SwapchainKHR, SwapchainHeader>;\n    using DeleterType = typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::SwapchainKHR>::deleter;\n    friend BaseType;\n\n  public:\n    SharedHandle() = default;\n\n    explicit SharedHandle( VULKAN_HPP_NAMESPACE::SwapchainKHR                                 handle,\n                           SharedHandle<DestructorTypeOf<VULKAN_HPP_NAMESPACE::SwapchainKHR>> parent,\n                           SharedHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR>                     surface,\n                           DeleterType                                                        deleter = DeleterType() ) VULKAN_HPP_NOEXCEPT\n      : BaseType( handle, std::move( surface ), std::move( parent ), std::move( deleter ) )\n    {\n    }\n\n  public:\n    const SharedHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR> & getSurface() const VULKAN_HPP_NOEXCEPT\n    {\n      return getHeader().surface;\n    }\n\n  protected:\n    using BaseType::internalDestroy;\n  };\n\n  template <typename HandleType, typename DestructorType>\n  class SharedHandleBaseNoDestroy : public SharedHandleBase<HandleType, DestructorType>\n  {\n  public:\n    using SharedHandleBase<HandleType, DestructorType>::SharedHandleBase;\n\n    const DestructorType & getDestructorType() const VULKAN_HPP_NOEXCEPT\n    {\n      return SharedHandleBase<HandleType, DestructorType>::getHeader();\n    }\n\n  protected:\n    static void internalDestroy( const DestructorType &, HandleType ) VULKAN_HPP_NOEXCEPT {}\n  };\n\n  //=== VK_VERSION_1_0 ===\n\n  template <>\n  class SharedHandle<PhysicalDevice> : public SharedHandleBaseNoDestroy<PhysicalDevice, SharedInstance>\n  {\n    friend SharedHandleBase<PhysicalDevice, SharedInstance>;\n\n  public:\n    SharedHandle() = default;\n\n    explicit SharedHandle( PhysicalDevice handle, SharedInstance parent ) noexcept\n      : SharedHandleBaseNoDestroy<PhysicalDevice, SharedInstance>( handle, std::move( parent ) )\n    {\n    }\n  };\n\n  using SharedPhysicalDevice = SharedHandle<PhysicalDevice>;\n\n  template <>\n  class SharedHandle<Queue> : public SharedHandleBaseNoDestroy<Queue, SharedDevice>\n  {\n    friend SharedHandleBase<Queue, SharedDevice>;\n\n  public:\n    SharedHandle() = default;\n\n    explicit SharedHandle( Queue handle, SharedDevice parent ) noexcept : SharedHandleBaseNoDestroy<Queue, SharedDevice>( handle, std::move( parent ) ) {}\n  };\n\n  using SharedQueue = SharedHandle<Queue>;\n\n  //=== VK_KHR_display ===\n\n  template <>\n  class SharedHandle<DisplayModeKHR> : public SharedHandleBaseNoDestroy<DisplayModeKHR, SharedDisplayKHR>\n  {\n    friend SharedHandleBase<DisplayModeKHR, SharedDisplayKHR>;\n\n  public:\n    SharedHandle() = default;\n\n    explicit SharedHandle( DisplayModeKHR handle, SharedDisplayKHR parent ) noexcept\n      : SharedHandleBaseNoDestroy<DisplayModeKHR, SharedDisplayKHR>( handle, std::move( parent ) )\n    {\n    }\n  };\n\n  using SharedDisplayModeKHR = SharedHandle<DisplayModeKHR>;\n#endif  // !VULKAN_HPP_NO_SMART_HANDLE\n}  // namespace VULKAN_HPP_NAMESPACE\n#endif  // VULKAN_SHARED_HPP\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_static_assertions.hpp",
    "content": "// Copyright 2015-2025 The Khronos Group Inc.\n//\n// SPDX-License-Identifier: Apache-2.0 OR MIT\n//\n\n// This header is generated from the Khronos Vulkan XML API Registry.\n\n#ifndef VULKAN_STATIC_ASSERTIONS_HPP\n#define VULKAN_STATIC_ASSERTIONS_HPP\n\n#include <vulkan/vulkan.hpp>\n\n//=========================\n//=== static_assertions ===\n//=========================\n\n//=== VK_VERSION_1_0 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::Extent2D ) == sizeof( VkExtent2D ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::Extent2D>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::Extent2D>::value, \"Extent2D is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::Extent3D ) == sizeof( VkExtent3D ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::Extent3D>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::Extent3D>::value, \"Extent3D is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::Offset2D ) == sizeof( VkOffset2D ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::Offset2D>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::Offset2D>::value, \"Offset2D is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::Offset3D ) == sizeof( VkOffset3D ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::Offset3D>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::Offset3D>::value, \"Offset3D is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::Rect2D ) == sizeof( VkRect2D ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::Rect2D>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::Rect2D>::value, \"Rect2D is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BaseInStructure ) == sizeof( VkBaseInStructure ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BaseInStructure>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BaseInStructure>::value,\n                          \"BaseInStructure is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BaseOutStructure ) == sizeof( VkBaseOutStructure ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BaseOutStructure>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BaseOutStructure>::value,\n                          \"BaseOutStructure is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BufferMemoryBarrier ) == sizeof( VkBufferMemoryBarrier ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BufferMemoryBarrier>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BufferMemoryBarrier>::value,\n                          \"BufferMemoryBarrier is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DispatchIndirectCommand ) == sizeof( VkDispatchIndirectCommand ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DispatchIndirectCommand>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DispatchIndirectCommand>::value,\n                          \"DispatchIndirectCommand is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DrawIndexedIndirectCommand ) == sizeof( VkDrawIndexedIndirectCommand ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DrawIndexedIndirectCommand>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DrawIndexedIndirectCommand>::value,\n                          \"DrawIndexedIndirectCommand is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DrawIndirectCommand ) == sizeof( VkDrawIndirectCommand ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DrawIndirectCommand>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DrawIndirectCommand>::value,\n                          \"DrawIndirectCommand is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageMemoryBarrier ) == sizeof( VkImageMemoryBarrier ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageMemoryBarrier>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageMemoryBarrier>::value,\n                          \"ImageMemoryBarrier is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryBarrier ) == sizeof( VkMemoryBarrier ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryBarrier>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryBarrier>::value, \"MemoryBarrier is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineCacheHeaderVersionOne ) == sizeof( VkPipelineCacheHeaderVersionOne ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineCacheHeaderVersionOne>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineCacheHeaderVersionOne>::value,\n                          \"PipelineCacheHeaderVersionOne is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AllocationCallbacks ) == sizeof( VkAllocationCallbacks ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AllocationCallbacks>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AllocationCallbacks>::value,\n                          \"AllocationCallbacks is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ApplicationInfo ) == sizeof( VkApplicationInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ApplicationInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ApplicationInfo>::value,\n                          \"ApplicationInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::FormatProperties ) == sizeof( VkFormatProperties ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::FormatProperties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::FormatProperties>::value,\n                          \"FormatProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageFormatProperties ) == sizeof( VkImageFormatProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageFormatProperties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageFormatProperties>::value,\n                          \"ImageFormatProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::Instance ) == sizeof( VkInstance ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::Instance>::value, \"Instance is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::Instance>::value, \"Instance is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::InstanceCreateInfo ) == sizeof( VkInstanceCreateInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::InstanceCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::InstanceCreateInfo>::value,\n                          \"InstanceCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryHeap ) == sizeof( VkMemoryHeap ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryHeap>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryHeap>::value, \"MemoryHeap is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryType ) == sizeof( VkMemoryType ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryType>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryType>::value, \"MemoryType is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevice ) == sizeof( VkPhysicalDevice ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevice>::value, \"PhysicalDevice is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevice>::value,\n                          \"PhysicalDevice is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures ) == sizeof( VkPhysicalDeviceFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures>::value,\n                          \"PhysicalDeviceFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceLimits ) == sizeof( VkPhysicalDeviceLimits ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceLimits>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceLimits>::value,\n                          \"PhysicalDeviceLimits is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties ) == sizeof( VkPhysicalDeviceMemoryProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties>::value,\n                          \"PhysicalDeviceMemoryProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties ) == sizeof( VkPhysicalDeviceProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties>::value,\n                          \"PhysicalDeviceProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseProperties ) == sizeof( VkPhysicalDeviceSparseProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseProperties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseProperties>::value,\n                          \"PhysicalDeviceSparseProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::QueueFamilyProperties ) == sizeof( VkQueueFamilyProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::QueueFamilyProperties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::QueueFamilyProperties>::value,\n                          \"QueueFamilyProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::Device ) == sizeof( VkDevice ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::Device>::value, \"Device is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::Device>::value, \"Device is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceCreateInfo ) == sizeof( VkDeviceCreateInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceCreateInfo>::value,\n                          \"DeviceCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceQueueCreateInfo ) == sizeof( VkDeviceQueueCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceQueueCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceQueueCreateInfo>::value,\n                          \"DeviceQueueCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExtensionProperties ) == sizeof( VkExtensionProperties ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExtensionProperties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExtensionProperties>::value,\n                          \"ExtensionProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::LayerProperties ) == sizeof( VkLayerProperties ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::LayerProperties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::LayerProperties>::value,\n                          \"LayerProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::Queue ) == sizeof( VkQueue ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::Queue>::value, \"Queue is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::Queue>::value, \"Queue is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SubmitInfo ) == sizeof( VkSubmitInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SubmitInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SubmitInfo>::value, \"SubmitInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MappedMemoryRange ) == sizeof( VkMappedMemoryRange ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MappedMemoryRange>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MappedMemoryRange>::value,\n                          \"MappedMemoryRange is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryAllocateInfo ) == sizeof( VkMemoryAllocateInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryAllocateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryAllocateInfo>::value,\n                          \"MemoryAllocateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceMemory ) == sizeof( VkDeviceMemory ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::DeviceMemory>::value, \"DeviceMemory is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceMemory>::value, \"DeviceMemory is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryRequirements ) == sizeof( VkMemoryRequirements ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryRequirements>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryRequirements>::value,\n                          \"MemoryRequirements is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BindSparseInfo ) == sizeof( VkBindSparseInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BindSparseInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BindSparseInfo>::value,\n                          \"BindSparseInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageSubresource ) == sizeof( VkImageSubresource ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageSubresource>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageSubresource>::value,\n                          \"ImageSubresource is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SparseBufferMemoryBindInfo ) == sizeof( VkSparseBufferMemoryBindInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SparseBufferMemoryBindInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SparseBufferMemoryBindInfo>::value,\n                          \"SparseBufferMemoryBindInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SparseImageFormatProperties ) == sizeof( VkSparseImageFormatProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties>::value,\n                          \"SparseImageFormatProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SparseImageMemoryBind ) == sizeof( VkSparseImageMemoryBind ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SparseImageMemoryBind>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SparseImageMemoryBind>::value,\n                          \"SparseImageMemoryBind is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SparseImageMemoryBindInfo ) == sizeof( VkSparseImageMemoryBindInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SparseImageMemoryBindInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SparseImageMemoryBindInfo>::value,\n                          \"SparseImageMemoryBindInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements ) == sizeof( VkSparseImageMemoryRequirements ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements>::value,\n                          \"SparseImageMemoryRequirements is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SparseImageOpaqueMemoryBindInfo ) == sizeof( VkSparseImageOpaqueMemoryBindInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SparseImageOpaqueMemoryBindInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SparseImageOpaqueMemoryBindInfo>::value,\n                          \"SparseImageOpaqueMemoryBindInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SparseMemoryBind ) == sizeof( VkSparseMemoryBind ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SparseMemoryBind>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SparseMemoryBind>::value,\n                          \"SparseMemoryBind is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::Fence ) == sizeof( VkFence ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::Fence>::value, \"Fence is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::Fence>::value, \"Fence is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::FenceCreateInfo ) == sizeof( VkFenceCreateInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::FenceCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::FenceCreateInfo>::value,\n                          \"FenceCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::Semaphore ) == sizeof( VkSemaphore ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::Semaphore>::value, \"Semaphore is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::Semaphore>::value, \"Semaphore is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SemaphoreCreateInfo ) == sizeof( VkSemaphoreCreateInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SemaphoreCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SemaphoreCreateInfo>::value,\n                          \"SemaphoreCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::Event ) == sizeof( VkEvent ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::Event>::value, \"Event is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::Event>::value, \"Event is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::EventCreateInfo ) == sizeof( VkEventCreateInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::EventCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::EventCreateInfo>::value,\n                          \"EventCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::QueryPool ) == sizeof( VkQueryPool ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::QueryPool>::value, \"QueryPool is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::QueryPool>::value, \"QueryPool is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::QueryPoolCreateInfo ) == sizeof( VkQueryPoolCreateInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::QueryPoolCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::QueryPoolCreateInfo>::value,\n                          \"QueryPoolCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::Buffer ) == sizeof( VkBuffer ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::Buffer>::value, \"Buffer is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::Buffer>::value, \"Buffer is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BufferCreateInfo ) == sizeof( VkBufferCreateInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BufferCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BufferCreateInfo>::value,\n                          \"BufferCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BufferView ) == sizeof( VkBufferView ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::BufferView>::value, \"BufferView is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BufferView>::value, \"BufferView is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BufferViewCreateInfo ) == sizeof( VkBufferViewCreateInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BufferViewCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BufferViewCreateInfo>::value,\n                          \"BufferViewCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::Image ) == sizeof( VkImage ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::Image>::value, \"Image is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::Image>::value, \"Image is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageCreateInfo ) == sizeof( VkImageCreateInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageCreateInfo>::value,\n                          \"ImageCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SubresourceLayout ) == sizeof( VkSubresourceLayout ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SubresourceLayout>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SubresourceLayout>::value,\n                          \"SubresourceLayout is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ComponentMapping ) == sizeof( VkComponentMapping ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ComponentMapping>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ComponentMapping>::value,\n                          \"ComponentMapping is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageSubresourceRange ) == sizeof( VkImageSubresourceRange ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageSubresourceRange>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageSubresourceRange>::value,\n                          \"ImageSubresourceRange is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageView ) == sizeof( VkImageView ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::ImageView>::value, \"ImageView is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageView>::value, \"ImageView is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageViewCreateInfo ) == sizeof( VkImageViewCreateInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageViewCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageViewCreateInfo>::value,\n                          \"ImageViewCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ShaderModule ) == sizeof( VkShaderModule ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::ShaderModule>::value, \"ShaderModule is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ShaderModule>::value, \"ShaderModule is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo ) == sizeof( VkShaderModuleCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo>::value,\n                          \"ShaderModuleCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineCache ) == sizeof( VkPipelineCache ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::PipelineCache>::value, \"PipelineCache is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineCache>::value, \"PipelineCache is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineCacheCreateInfo ) == sizeof( VkPipelineCacheCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineCacheCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineCacheCreateInfo>::value,\n                          \"PipelineCacheCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo ) == sizeof( VkComputePipelineCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo>::value,\n                          \"ComputePipelineCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo ) == sizeof( VkGraphicsPipelineCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo>::value,\n                          \"GraphicsPipelineCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::Pipeline ) == sizeof( VkPipeline ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::Pipeline>::value, \"Pipeline is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::Pipeline>::value, \"Pipeline is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineColorBlendAttachmentState ) == sizeof( VkPipelineColorBlendAttachmentState ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineColorBlendAttachmentState>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineColorBlendAttachmentState>::value,\n                          \"PipelineColorBlendAttachmentState is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineColorBlendStateCreateInfo ) == sizeof( VkPipelineColorBlendStateCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineColorBlendStateCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineColorBlendStateCreateInfo>::value,\n                          \"PipelineColorBlendStateCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineDepthStencilStateCreateInfo ) == sizeof( VkPipelineDepthStencilStateCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineDepthStencilStateCreateInfo>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineDepthStencilStateCreateInfo>::value,\n                          \"PipelineDepthStencilStateCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineDynamicStateCreateInfo ) == sizeof( VkPipelineDynamicStateCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineDynamicStateCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineDynamicStateCreateInfo>::value,\n                          \"PipelineDynamicStateCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineInputAssemblyStateCreateInfo ) == sizeof( VkPipelineInputAssemblyStateCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineInputAssemblyStateCreateInfo>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineInputAssemblyStateCreateInfo>::value,\n                          \"PipelineInputAssemblyStateCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineMultisampleStateCreateInfo ) == sizeof( VkPipelineMultisampleStateCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineMultisampleStateCreateInfo>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineMultisampleStateCreateInfo>::value,\n                          \"PipelineMultisampleStateCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineRasterizationStateCreateInfo ) == sizeof( VkPipelineRasterizationStateCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineRasterizationStateCreateInfo>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineRasterizationStateCreateInfo>::value,\n                          \"PipelineRasterizationStateCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo ) == sizeof( VkPipelineShaderStageCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo>::value,\n                          \"PipelineShaderStageCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineTessellationStateCreateInfo ) == sizeof( VkPipelineTessellationStateCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineTessellationStateCreateInfo>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineTessellationStateCreateInfo>::value,\n                          \"PipelineTessellationStateCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateInfo ) == sizeof( VkPipelineVertexInputStateCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateInfo>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateInfo>::value,\n                          \"PipelineVertexInputStateCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineViewportStateCreateInfo ) == sizeof( VkPipelineViewportStateCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineViewportStateCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineViewportStateCreateInfo>::value,\n                          \"PipelineViewportStateCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SpecializationInfo ) == sizeof( VkSpecializationInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SpecializationInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SpecializationInfo>::value,\n                          \"SpecializationInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SpecializationMapEntry ) == sizeof( VkSpecializationMapEntry ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SpecializationMapEntry>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SpecializationMapEntry>::value,\n                          \"SpecializationMapEntry is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::StencilOpState ) == sizeof( VkStencilOpState ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::StencilOpState>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::StencilOpState>::value,\n                          \"StencilOpState is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription ) == sizeof( VkVertexInputAttributeDescription ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription>::value,\n                          \"VertexInputAttributeDescription is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VertexInputBindingDescription ) == sizeof( VkVertexInputBindingDescription ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VertexInputBindingDescription>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VertexInputBindingDescription>::value,\n                          \"VertexInputBindingDescription is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::Viewport ) == sizeof( VkViewport ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::Viewport>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::Viewport>::value, \"Viewport is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineLayout ) == sizeof( VkPipelineLayout ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::PipelineLayout>::value, \"PipelineLayout is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineLayout>::value,\n                          \"PipelineLayout is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineLayoutCreateInfo ) == sizeof( VkPipelineLayoutCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineLayoutCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineLayoutCreateInfo>::value,\n                          \"PipelineLayoutCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PushConstantRange ) == sizeof( VkPushConstantRange ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PushConstantRange>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PushConstantRange>::value,\n                          \"PushConstantRange is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::Sampler ) == sizeof( VkSampler ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::Sampler>::value, \"Sampler is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::Sampler>::value, \"Sampler is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SamplerCreateInfo ) == sizeof( VkSamplerCreateInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SamplerCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SamplerCreateInfo>::value,\n                          \"SamplerCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CopyDescriptorSet ) == sizeof( VkCopyDescriptorSet ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CopyDescriptorSet>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CopyDescriptorSet>::value,\n                          \"CopyDescriptorSet is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorBufferInfo ) == sizeof( VkDescriptorBufferInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DescriptorBufferInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorBufferInfo>::value,\n                          \"DescriptorBufferInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorImageInfo ) == sizeof( VkDescriptorImageInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DescriptorImageInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorImageInfo>::value,\n                          \"DescriptorImageInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorPool ) == sizeof( VkDescriptorPool ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::DescriptorPool>::value, \"DescriptorPool is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorPool>::value,\n                          \"DescriptorPool is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorPoolCreateInfo ) == sizeof( VkDescriptorPoolCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DescriptorPoolCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorPoolCreateInfo>::value,\n                          \"DescriptorPoolCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorPoolSize ) == sizeof( VkDescriptorPoolSize ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DescriptorPoolSize>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorPoolSize>::value,\n                          \"DescriptorPoolSize is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorSet ) == sizeof( VkDescriptorSet ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::DescriptorSet>::value, \"DescriptorSet is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorSet>::value, \"DescriptorSet is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo ) == sizeof( VkDescriptorSetAllocateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo>::value,\n                          \"DescriptorSetAllocateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorSetLayout ) == sizeof( VkDescriptorSetLayout ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::DescriptorSetLayout>::value, \"DescriptorSetLayout is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorSetLayout>::value,\n                          \"DescriptorSetLayout is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorSetLayoutBinding ) == sizeof( VkDescriptorSetLayoutBinding ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutBinding>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutBinding>::value,\n                          \"DescriptorSetLayoutBinding is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo ) == sizeof( VkDescriptorSetLayoutCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo>::value,\n                          \"DescriptorSetLayoutCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::WriteDescriptorSet ) == sizeof( VkWriteDescriptorSet ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::WriteDescriptorSet>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::WriteDescriptorSet>::value,\n                          \"WriteDescriptorSet is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AttachmentDescription ) == sizeof( VkAttachmentDescription ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AttachmentDescription>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AttachmentDescription>::value,\n                          \"AttachmentDescription is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AttachmentReference ) == sizeof( VkAttachmentReference ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AttachmentReference>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AttachmentReference>::value,\n                          \"AttachmentReference is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::Framebuffer ) == sizeof( VkFramebuffer ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::Framebuffer>::value, \"Framebuffer is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::Framebuffer>::value, \"Framebuffer is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::FramebufferCreateInfo ) == sizeof( VkFramebufferCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::FramebufferCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::FramebufferCreateInfo>::value,\n                          \"FramebufferCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderPass ) == sizeof( VkRenderPass ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::RenderPass>::value, \"RenderPass is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderPass>::value, \"RenderPass is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderPassCreateInfo ) == sizeof( VkRenderPassCreateInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderPassCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderPassCreateInfo>::value,\n                          \"RenderPassCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SubpassDependency ) == sizeof( VkSubpassDependency ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SubpassDependency>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SubpassDependency>::value,\n                          \"SubpassDependency is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SubpassDescription ) == sizeof( VkSubpassDescription ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SubpassDescription>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SubpassDescription>::value,\n                          \"SubpassDescription is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CommandPool ) == sizeof( VkCommandPool ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::CommandPool>::value, \"CommandPool is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CommandPool>::value, \"CommandPool is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CommandPoolCreateInfo ) == sizeof( VkCommandPoolCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CommandPoolCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CommandPoolCreateInfo>::value,\n                          \"CommandPoolCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CommandBuffer ) == sizeof( VkCommandBuffer ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::CommandBuffer>::value, \"CommandBuffer is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CommandBuffer>::value, \"CommandBuffer is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo ) == sizeof( VkCommandBufferAllocateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo>::value,\n                          \"CommandBufferAllocateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CommandBufferBeginInfo ) == sizeof( VkCommandBufferBeginInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CommandBufferBeginInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CommandBufferBeginInfo>::value,\n                          \"CommandBufferBeginInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CommandBufferInheritanceInfo ) == sizeof( VkCommandBufferInheritanceInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceInfo>::value,\n                          \"CommandBufferInheritanceInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BufferCopy ) == sizeof( VkBufferCopy ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BufferCopy>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BufferCopy>::value, \"BufferCopy is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BufferImageCopy ) == sizeof( VkBufferImageCopy ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BufferImageCopy>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BufferImageCopy>::value,\n                          \"BufferImageCopy is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ClearAttachment ) == sizeof( VkClearAttachment ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ClearAttachment>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ClearAttachment>::value,\n                          \"ClearAttachment is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ClearColorValue ) == sizeof( VkClearColorValue ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ClearColorValue>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ClearColorValue>::value,\n                          \"ClearColorValue is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ClearDepthStencilValue ) == sizeof( VkClearDepthStencilValue ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ClearDepthStencilValue>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ClearDepthStencilValue>::value,\n                          \"ClearDepthStencilValue is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ClearRect ) == sizeof( VkClearRect ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ClearRect>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ClearRect>::value, \"ClearRect is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ClearValue ) == sizeof( VkClearValue ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ClearValue>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ClearValue>::value, \"ClearValue is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageBlit ) == sizeof( VkImageBlit ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageBlit>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageBlit>::value, \"ImageBlit is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageCopy ) == sizeof( VkImageCopy ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageCopy>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageCopy>::value, \"ImageCopy is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageResolve ) == sizeof( VkImageResolve ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageResolve>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageResolve>::value, \"ImageResolve is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers ) == sizeof( VkImageSubresourceLayers ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageSubresourceLayers>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageSubresourceLayers>::value,\n                          \"ImageSubresourceLayers is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderPassBeginInfo ) == sizeof( VkRenderPassBeginInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderPassBeginInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderPassBeginInfo>::value,\n                          \"RenderPassBeginInfo is not nothrow_move_constructible!\" );\n\n//=== VK_VERSION_1_1 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupProperties ) == sizeof( VkPhysicalDeviceSubgroupProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupProperties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupProperties>::value,\n                          \"PhysicalDeviceSubgroupProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo ) == sizeof( VkBindBufferMemoryInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo>::value,\n                          \"BindBufferMemoryInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BindImageMemoryInfo ) == sizeof( VkBindImageMemoryInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BindImageMemoryInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BindImageMemoryInfo>::value,\n                          \"BindImageMemoryInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevice16BitStorageFeatures ) == sizeof( VkPhysicalDevice16BitStorageFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevice16BitStorageFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevice16BitStorageFeatures>::value,\n                          \"PhysicalDevice16BitStorageFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryDedicatedRequirements ) == sizeof( VkMemoryDedicatedRequirements ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryDedicatedRequirements>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryDedicatedRequirements>::value,\n                          \"MemoryDedicatedRequirements is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryDedicatedAllocateInfo ) == sizeof( VkMemoryDedicatedAllocateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryDedicatedAllocateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryDedicatedAllocateInfo>::value,\n                          \"MemoryDedicatedAllocateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryAllocateFlagsInfo ) == sizeof( VkMemoryAllocateFlagsInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryAllocateFlagsInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryAllocateFlagsInfo>::value,\n                          \"MemoryAllocateFlagsInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceGroupRenderPassBeginInfo ) == sizeof( VkDeviceGroupRenderPassBeginInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceGroupRenderPassBeginInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceGroupRenderPassBeginInfo>::value,\n                          \"DeviceGroupRenderPassBeginInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceGroupCommandBufferBeginInfo ) == sizeof( VkDeviceGroupCommandBufferBeginInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceGroupCommandBufferBeginInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceGroupCommandBufferBeginInfo>::value,\n                          \"DeviceGroupCommandBufferBeginInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceGroupSubmitInfo ) == sizeof( VkDeviceGroupSubmitInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceGroupSubmitInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceGroupSubmitInfo>::value,\n                          \"DeviceGroupSubmitInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceGroupBindSparseInfo ) == sizeof( VkDeviceGroupBindSparseInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceGroupBindSparseInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceGroupBindSparseInfo>::value,\n                          \"DeviceGroupBindSparseInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BindBufferMemoryDeviceGroupInfo ) == sizeof( VkBindBufferMemoryDeviceGroupInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BindBufferMemoryDeviceGroupInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BindBufferMemoryDeviceGroupInfo>::value,\n                          \"BindBufferMemoryDeviceGroupInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BindImageMemoryDeviceGroupInfo ) == sizeof( VkBindImageMemoryDeviceGroupInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BindImageMemoryDeviceGroupInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BindImageMemoryDeviceGroupInfo>::value,\n                          \"BindImageMemoryDeviceGroupInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties ) == sizeof( VkPhysicalDeviceGroupProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties>::value,\n                          \"PhysicalDeviceGroupProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceGroupDeviceCreateInfo ) == sizeof( VkDeviceGroupDeviceCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceGroupDeviceCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceGroupDeviceCreateInfo>::value,\n                          \"DeviceGroupDeviceCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 ) == sizeof( VkBufferMemoryRequirementsInfo2 ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2>::value,\n                          \"BufferMemoryRequirementsInfo2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 ) == sizeof( VkImageMemoryRequirementsInfo2 ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2>::value,\n                          \"ImageMemoryRequirementsInfo2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 ) == sizeof( VkImageSparseMemoryRequirementsInfo2 ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2>::value,\n                          \"ImageSparseMemoryRequirementsInfo2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryRequirements2 ) == sizeof( VkMemoryRequirements2 ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryRequirements2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryRequirements2>::value,\n                          \"MemoryRequirements2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2 ) == sizeof( VkSparseImageMemoryRequirements2 ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>::value,\n                          \"SparseImageMemoryRequirements2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 ) == sizeof( VkPhysicalDeviceFeatures2 ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2>::value,\n                          \"PhysicalDeviceFeatures2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 ) == sizeof( VkPhysicalDeviceProperties2 ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2>::value,\n                          \"PhysicalDeviceProperties2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::FormatProperties2 ) == sizeof( VkFormatProperties2 ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::FormatProperties2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::FormatProperties2>::value,\n                          \"FormatProperties2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageFormatProperties2 ) == sizeof( VkImageFormatProperties2 ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageFormatProperties2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageFormatProperties2>::value,\n                          \"ImageFormatProperties2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 ) == sizeof( VkPhysicalDeviceImageFormatInfo2 ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2>::value,\n                          \"PhysicalDeviceImageFormatInfo2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::QueueFamilyProperties2 ) == sizeof( VkQueueFamilyProperties2 ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>::value,\n                          \"QueueFamilyProperties2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 ) == sizeof( VkPhysicalDeviceMemoryProperties2 ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2>::value,\n                          \"PhysicalDeviceMemoryProperties2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2 ) == sizeof( VkSparseImageFormatProperties2 ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2>::value,\n                          \"SparseImageFormatProperties2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 ) == sizeof( VkPhysicalDeviceSparseImageFormatInfo2 ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2>::value,\n                          \"PhysicalDeviceSparseImageFormatInfo2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePointClippingProperties ) == sizeof( VkPhysicalDevicePointClippingProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePointClippingProperties>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePointClippingProperties>::value,\n                          \"PhysicalDevicePointClippingProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderPassInputAttachmentAspectCreateInfo ) == sizeof( VkRenderPassInputAttachmentAspectCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderPassInputAttachmentAspectCreateInfo>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderPassInputAttachmentAspectCreateInfo>::value,\n                          \"RenderPassInputAttachmentAspectCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::InputAttachmentAspectReference ) == sizeof( VkInputAttachmentAspectReference ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::InputAttachmentAspectReference>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::InputAttachmentAspectReference>::value,\n                          \"InputAttachmentAspectReference is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageViewUsageCreateInfo ) == sizeof( VkImageViewUsageCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageViewUsageCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageViewUsageCreateInfo>::value,\n                          \"ImageViewUsageCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineTessellationDomainOriginStateCreateInfo ) ==\n                            sizeof( VkPipelineTessellationDomainOriginStateCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineTessellationDomainOriginStateCreateInfo>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineTessellationDomainOriginStateCreateInfo>::value,\n                          \"PipelineTessellationDomainOriginStateCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderPassMultiviewCreateInfo ) == sizeof( VkRenderPassMultiviewCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderPassMultiviewCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderPassMultiviewCreateInfo>::value,\n                          \"RenderPassMultiviewCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewFeatures ) == sizeof( VkPhysicalDeviceMultiviewFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewFeatures>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewFeatures>::value,\n                          \"PhysicalDeviceMultiviewFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewProperties ) == sizeof( VkPhysicalDeviceMultiviewProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewProperties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewProperties>::value,\n                          \"PhysicalDeviceMultiviewProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceVariablePointersFeatures ) == sizeof( VkPhysicalDeviceVariablePointersFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceVariablePointersFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceVariablePointersFeatures>::value,\n                          \"PhysicalDeviceVariablePointersFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceProtectedMemoryFeatures ) == sizeof( VkPhysicalDeviceProtectedMemoryFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceProtectedMemoryFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceProtectedMemoryFeatures>::value,\n                          \"PhysicalDeviceProtectedMemoryFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceProtectedMemoryProperties ) == sizeof( VkPhysicalDeviceProtectedMemoryProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceProtectedMemoryProperties>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceProtectedMemoryProperties>::value,\n                          \"PhysicalDeviceProtectedMemoryProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceQueueInfo2 ) == sizeof( VkDeviceQueueInfo2 ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceQueueInfo2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceQueueInfo2>::value,\n                          \"DeviceQueueInfo2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ProtectedSubmitInfo ) == sizeof( VkProtectedSubmitInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ProtectedSubmitInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ProtectedSubmitInfo>::value,\n                          \"ProtectedSubmitInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo ) == sizeof( VkSamplerYcbcrConversionCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo>::value,\n                          \"SamplerYcbcrConversionCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionInfo ) == sizeof( VkSamplerYcbcrConversionInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionInfo>::value,\n                          \"SamplerYcbcrConversionInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BindImagePlaneMemoryInfo ) == sizeof( VkBindImagePlaneMemoryInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BindImagePlaneMemoryInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BindImagePlaneMemoryInfo>::value,\n                          \"BindImagePlaneMemoryInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImagePlaneMemoryRequirementsInfo ) == sizeof( VkImagePlaneMemoryRequirementsInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImagePlaneMemoryRequirementsInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImagePlaneMemoryRequirementsInfo>::value,\n                          \"ImagePlaneMemoryRequirementsInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceSamplerYcbcrConversionFeatures ) ==\n                            sizeof( VkPhysicalDeviceSamplerYcbcrConversionFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceSamplerYcbcrConversionFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceSamplerYcbcrConversionFeatures>::value,\n                          \"PhysicalDeviceSamplerYcbcrConversionFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionImageFormatProperties ) ==\n                            sizeof( VkSamplerYcbcrConversionImageFormatProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionImageFormatProperties>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionImageFormatProperties>::value,\n                          \"SamplerYcbcrConversionImageFormatProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion ) == sizeof( VkSamplerYcbcrConversion ),\n                          \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion>::value,\n                          \"SamplerYcbcrConversion is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion>::value,\n                          \"SamplerYcbcrConversion is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate ) == sizeof( VkDescriptorUpdateTemplate ),\n                          \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate>::value,\n                          \"DescriptorUpdateTemplate is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate>::value,\n                          \"DescriptorUpdateTemplate is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateEntry ) == sizeof( VkDescriptorUpdateTemplateEntry ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateEntry>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateEntry>::value,\n                          \"DescriptorUpdateTemplateEntry is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo ) == sizeof( VkDescriptorUpdateTemplateCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo>::value,\n                          \"DescriptorUpdateTemplateCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExternalMemoryProperties ) == sizeof( VkExternalMemoryProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExternalMemoryProperties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExternalMemoryProperties>::value,\n                          \"ExternalMemoryProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalImageFormatInfo ) == sizeof( VkPhysicalDeviceExternalImageFormatInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalImageFormatInfo>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalImageFormatInfo>::value,\n                          \"PhysicalDeviceExternalImageFormatInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExternalImageFormatProperties ) == sizeof( VkExternalImageFormatProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExternalImageFormatProperties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExternalImageFormatProperties>::value,\n                          \"ExternalImageFormatProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo ) == sizeof( VkPhysicalDeviceExternalBufferInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo>::value,\n                          \"PhysicalDeviceExternalBufferInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExternalBufferProperties ) == sizeof( VkExternalBufferProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExternalBufferProperties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExternalBufferProperties>::value,\n                          \"ExternalBufferProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceIDProperties ) == sizeof( VkPhysicalDeviceIDProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceIDProperties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceIDProperties>::value,\n                          \"PhysicalDeviceIDProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExternalMemoryImageCreateInfo ) == sizeof( VkExternalMemoryImageCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExternalMemoryImageCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExternalMemoryImageCreateInfo>::value,\n                          \"ExternalMemoryImageCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExternalMemoryBufferCreateInfo ) == sizeof( VkExternalMemoryBufferCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExternalMemoryBufferCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExternalMemoryBufferCreateInfo>::value,\n                          \"ExternalMemoryBufferCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExportMemoryAllocateInfo ) == sizeof( VkExportMemoryAllocateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExportMemoryAllocateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExportMemoryAllocateInfo>::value,\n                          \"ExportMemoryAllocateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo ) == sizeof( VkPhysicalDeviceExternalFenceInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo>::value,\n                          \"PhysicalDeviceExternalFenceInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExternalFenceProperties ) == sizeof( VkExternalFenceProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExternalFenceProperties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExternalFenceProperties>::value,\n                          \"ExternalFenceProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExportFenceCreateInfo ) == sizeof( VkExportFenceCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExportFenceCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExportFenceCreateInfo>::value,\n                          \"ExportFenceCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExportSemaphoreCreateInfo ) == sizeof( VkExportSemaphoreCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExportSemaphoreCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExportSemaphoreCreateInfo>::value,\n                          \"ExportSemaphoreCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo ) == sizeof( VkPhysicalDeviceExternalSemaphoreInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo>::value,\n                          \"PhysicalDeviceExternalSemaphoreInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties ) == sizeof( VkExternalSemaphoreProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties>::value,\n                          \"ExternalSemaphoreProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance3Properties ) == sizeof( VkPhysicalDeviceMaintenance3Properties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance3Properties>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance3Properties>::value,\n                          \"PhysicalDeviceMaintenance3Properties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport ) == sizeof( VkDescriptorSetLayoutSupport ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport>::value,\n                          \"DescriptorSetLayoutSupport is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderDrawParametersFeatures ) == sizeof( VkPhysicalDeviceShaderDrawParametersFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderDrawParametersFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderDrawParametersFeatures>::value,\n                          \"PhysicalDeviceShaderDrawParametersFeatures is not nothrow_move_constructible!\" );\n\n//=== VK_VERSION_1_2 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan11Features ) == sizeof( VkPhysicalDeviceVulkan11Features ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan11Features>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan11Features>::value,\n                          \"PhysicalDeviceVulkan11Features is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan11Properties ) == sizeof( VkPhysicalDeviceVulkan11Properties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan11Properties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan11Properties>::value,\n                          \"PhysicalDeviceVulkan11Properties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan12Features ) == sizeof( VkPhysicalDeviceVulkan12Features ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan12Features>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan12Features>::value,\n                          \"PhysicalDeviceVulkan12Features is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan12Properties ) == sizeof( VkPhysicalDeviceVulkan12Properties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan12Properties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan12Properties>::value,\n                          \"PhysicalDeviceVulkan12Properties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageFormatListCreateInfo ) == sizeof( VkImageFormatListCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageFormatListCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageFormatListCreateInfo>::value,\n                          \"ImageFormatListCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 ) == sizeof( VkRenderPassCreateInfo2 ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2>::value,\n                          \"RenderPassCreateInfo2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AttachmentDescription2 ) == sizeof( VkAttachmentDescription2 ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AttachmentDescription2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AttachmentDescription2>::value,\n                          \"AttachmentDescription2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AttachmentReference2 ) == sizeof( VkAttachmentReference2 ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AttachmentReference2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AttachmentReference2>::value,\n                          \"AttachmentReference2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SubpassDescription2 ) == sizeof( VkSubpassDescription2 ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SubpassDescription2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SubpassDescription2>::value,\n                          \"SubpassDescription2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SubpassDependency2 ) == sizeof( VkSubpassDependency2 ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SubpassDependency2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SubpassDependency2>::value,\n                          \"SubpassDependency2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SubpassBeginInfo ) == sizeof( VkSubpassBeginInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SubpassBeginInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SubpassBeginInfo>::value,\n                          \"SubpassBeginInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SubpassEndInfo ) == sizeof( VkSubpassEndInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SubpassEndInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SubpassEndInfo>::value,\n                          \"SubpassEndInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevice8BitStorageFeatures ) == sizeof( VkPhysicalDevice8BitStorageFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevice8BitStorageFeatures>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevice8BitStorageFeatures>::value,\n                          \"PhysicalDevice8BitStorageFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ConformanceVersion ) == sizeof( VkConformanceVersion ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ConformanceVersion>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ConformanceVersion>::value,\n                          \"ConformanceVersion is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDriverProperties ) == sizeof( VkPhysicalDeviceDriverProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDriverProperties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDriverProperties>::value,\n                          \"PhysicalDeviceDriverProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicInt64Features ) == sizeof( VkPhysicalDeviceShaderAtomicInt64Features ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicInt64Features>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicInt64Features>::value,\n                          \"PhysicalDeviceShaderAtomicInt64Features is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderFloat16Int8Features ) == sizeof( VkPhysicalDeviceShaderFloat16Int8Features ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderFloat16Int8Features>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderFloat16Int8Features>::value,\n                          \"PhysicalDeviceShaderFloat16Int8Features is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceFloatControlsProperties ) == sizeof( VkPhysicalDeviceFloatControlsProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceFloatControlsProperties>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceFloatControlsProperties>::value,\n                          \"PhysicalDeviceFloatControlsProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorSetLayoutBindingFlagsCreateInfo ) == sizeof( VkDescriptorSetLayoutBindingFlagsCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutBindingFlagsCreateInfo>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutBindingFlagsCreateInfo>::value,\n                          \"DescriptorSetLayoutBindingFlagsCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorIndexingFeatures ) == sizeof( VkPhysicalDeviceDescriptorIndexingFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorIndexingFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorIndexingFeatures>::value,\n                          \"PhysicalDeviceDescriptorIndexingFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorIndexingProperties ) == sizeof( VkPhysicalDeviceDescriptorIndexingProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorIndexingProperties>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorIndexingProperties>::value,\n                          \"PhysicalDeviceDescriptorIndexingProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorSetVariableDescriptorCountAllocateInfo ) ==\n                            sizeof( VkDescriptorSetVariableDescriptorCountAllocateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DescriptorSetVariableDescriptorCountAllocateInfo>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorSetVariableDescriptorCountAllocateInfo>::value,\n                          \"DescriptorSetVariableDescriptorCountAllocateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorSetVariableDescriptorCountLayoutSupport ) ==\n                            sizeof( VkDescriptorSetVariableDescriptorCountLayoutSupport ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DescriptorSetVariableDescriptorCountLayoutSupport>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorSetVariableDescriptorCountLayoutSupport>::value,\n                          \"DescriptorSetVariableDescriptorCountLayoutSupport is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SubpassDescriptionDepthStencilResolve ) == sizeof( VkSubpassDescriptionDepthStencilResolve ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SubpassDescriptionDepthStencilResolve>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SubpassDescriptionDepthStencilResolve>::value,\n                          \"SubpassDescriptionDepthStencilResolve is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthStencilResolveProperties ) ==\n                            sizeof( VkPhysicalDeviceDepthStencilResolveProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthStencilResolveProperties>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthStencilResolveProperties>::value,\n                          \"PhysicalDeviceDepthStencilResolveProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceScalarBlockLayoutFeatures ) == sizeof( VkPhysicalDeviceScalarBlockLayoutFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceScalarBlockLayoutFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceScalarBlockLayoutFeatures>::value,\n                          \"PhysicalDeviceScalarBlockLayoutFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageStencilUsageCreateInfo ) == sizeof( VkImageStencilUsageCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageStencilUsageCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageStencilUsageCreateInfo>::value,\n                          \"ImageStencilUsageCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SamplerReductionModeCreateInfo ) == sizeof( VkSamplerReductionModeCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SamplerReductionModeCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SamplerReductionModeCreateInfo>::value,\n                          \"SamplerReductionModeCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceSamplerFilterMinmaxProperties ) ==\n                            sizeof( VkPhysicalDeviceSamplerFilterMinmaxProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceSamplerFilterMinmaxProperties>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceSamplerFilterMinmaxProperties>::value,\n                          \"PhysicalDeviceSamplerFilterMinmaxProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkanMemoryModelFeatures ) == sizeof( VkPhysicalDeviceVulkanMemoryModelFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkanMemoryModelFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkanMemoryModelFeatures>::value,\n                          \"PhysicalDeviceVulkanMemoryModelFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceImagelessFramebufferFeatures ) == sizeof( VkPhysicalDeviceImagelessFramebufferFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceImagelessFramebufferFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceImagelessFramebufferFeatures>::value,\n                          \"PhysicalDeviceImagelessFramebufferFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::FramebufferAttachmentsCreateInfo ) == sizeof( VkFramebufferAttachmentsCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::FramebufferAttachmentsCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::FramebufferAttachmentsCreateInfo>::value,\n                          \"FramebufferAttachmentsCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::FramebufferAttachmentImageInfo ) == sizeof( VkFramebufferAttachmentImageInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::FramebufferAttachmentImageInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::FramebufferAttachmentImageInfo>::value,\n                          \"FramebufferAttachmentImageInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderPassAttachmentBeginInfo ) == sizeof( VkRenderPassAttachmentBeginInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderPassAttachmentBeginInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderPassAttachmentBeginInfo>::value,\n                          \"RenderPassAttachmentBeginInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceUniformBufferStandardLayoutFeatures ) ==\n                            sizeof( VkPhysicalDeviceUniformBufferStandardLayoutFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceUniformBufferStandardLayoutFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceUniformBufferStandardLayoutFeatures>::value,\n                          \"PhysicalDeviceUniformBufferStandardLayoutFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSubgroupExtendedTypesFeatures ) ==\n                            sizeof( VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSubgroupExtendedTypesFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSubgroupExtendedTypesFeatures>::value,\n                          \"PhysicalDeviceShaderSubgroupExtendedTypesFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceSeparateDepthStencilLayoutsFeatures ) ==\n                            sizeof( VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceSeparateDepthStencilLayoutsFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceSeparateDepthStencilLayoutsFeatures>::value,\n                          \"PhysicalDeviceSeparateDepthStencilLayoutsFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AttachmentReferenceStencilLayout ) == sizeof( VkAttachmentReferenceStencilLayout ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AttachmentReferenceStencilLayout>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AttachmentReferenceStencilLayout>::value,\n                          \"AttachmentReferenceStencilLayout is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AttachmentDescriptionStencilLayout ) == sizeof( VkAttachmentDescriptionStencilLayout ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AttachmentDescriptionStencilLayout>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AttachmentDescriptionStencilLayout>::value,\n                          \"AttachmentDescriptionStencilLayout is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceHostQueryResetFeatures ) == sizeof( VkPhysicalDeviceHostQueryResetFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceHostQueryResetFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceHostQueryResetFeatures>::value,\n                          \"PhysicalDeviceHostQueryResetFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceTimelineSemaphoreFeatures ) == sizeof( VkPhysicalDeviceTimelineSemaphoreFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceTimelineSemaphoreFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceTimelineSemaphoreFeatures>::value,\n                          \"PhysicalDeviceTimelineSemaphoreFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceTimelineSemaphoreProperties ) == sizeof( VkPhysicalDeviceTimelineSemaphoreProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceTimelineSemaphoreProperties>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceTimelineSemaphoreProperties>::value,\n                          \"PhysicalDeviceTimelineSemaphoreProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SemaphoreTypeCreateInfo ) == sizeof( VkSemaphoreTypeCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SemaphoreTypeCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SemaphoreTypeCreateInfo>::value,\n                          \"SemaphoreTypeCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::TimelineSemaphoreSubmitInfo ) == sizeof( VkTimelineSemaphoreSubmitInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::TimelineSemaphoreSubmitInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::TimelineSemaphoreSubmitInfo>::value,\n                          \"TimelineSemaphoreSubmitInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo ) == sizeof( VkSemaphoreWaitInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo>::value,\n                          \"SemaphoreWaitInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo ) == sizeof( VkSemaphoreSignalInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo>::value,\n                          \"SemaphoreSignalInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceBufferDeviceAddressFeatures ) == sizeof( VkPhysicalDeviceBufferDeviceAddressFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceBufferDeviceAddressFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceBufferDeviceAddressFeatures>::value,\n                          \"PhysicalDeviceBufferDeviceAddressFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo ) == sizeof( VkBufferDeviceAddressInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo>::value,\n                          \"BufferDeviceAddressInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BufferOpaqueCaptureAddressCreateInfo ) == sizeof( VkBufferOpaqueCaptureAddressCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BufferOpaqueCaptureAddressCreateInfo>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BufferOpaqueCaptureAddressCreateInfo>::value,\n                          \"BufferOpaqueCaptureAddressCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryOpaqueCaptureAddressAllocateInfo ) == sizeof( VkMemoryOpaqueCaptureAddressAllocateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryOpaqueCaptureAddressAllocateInfo>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryOpaqueCaptureAddressAllocateInfo>::value,\n                          \"MemoryOpaqueCaptureAddressAllocateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo ) == sizeof( VkDeviceMemoryOpaqueCaptureAddressInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo>::value,\n                          \"DeviceMemoryOpaqueCaptureAddressInfo is not nothrow_move_constructible!\" );\n\n//=== VK_VERSION_1_3 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan13Features ) == sizeof( VkPhysicalDeviceVulkan13Features ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan13Features>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan13Features>::value,\n                          \"PhysicalDeviceVulkan13Features is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan13Properties ) == sizeof( VkPhysicalDeviceVulkan13Properties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan13Properties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan13Properties>::value,\n                          \"PhysicalDeviceVulkan13Properties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineCreationFeedbackCreateInfo ) == sizeof( VkPipelineCreationFeedbackCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineCreationFeedbackCreateInfo>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineCreationFeedbackCreateInfo>::value,\n                          \"PipelineCreationFeedbackCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineCreationFeedback ) == sizeof( VkPipelineCreationFeedback ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineCreationFeedback>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineCreationFeedback>::value,\n                          \"PipelineCreationFeedback is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderTerminateInvocationFeatures ) ==\n                            sizeof( VkPhysicalDeviceShaderTerminateInvocationFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderTerminateInvocationFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderTerminateInvocationFeatures>::value,\n                          \"PhysicalDeviceShaderTerminateInvocationFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties ) == sizeof( VkPhysicalDeviceToolProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties>::value,\n                          \"PhysicalDeviceToolProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderDemoteToHelperInvocationFeatures ) ==\n                            sizeof( VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderDemoteToHelperInvocationFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderDemoteToHelperInvocationFeatures>::value,\n                          \"PhysicalDeviceShaderDemoteToHelperInvocationFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePrivateDataFeatures ) == sizeof( VkPhysicalDevicePrivateDataFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePrivateDataFeatures>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePrivateDataFeatures>::value,\n                          \"PhysicalDevicePrivateDataFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DevicePrivateDataCreateInfo ) == sizeof( VkDevicePrivateDataCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DevicePrivateDataCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DevicePrivateDataCreateInfo>::value,\n                          \"DevicePrivateDataCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo ) == sizeof( VkPrivateDataSlotCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo>::value,\n                          \"PrivateDataSlotCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PrivateDataSlot ) == sizeof( VkPrivateDataSlot ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::PrivateDataSlot>::value, \"PrivateDataSlot is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PrivateDataSlot>::value,\n                          \"PrivateDataSlot is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineCreationCacheControlFeatures ) ==\n                            sizeof( VkPhysicalDevicePipelineCreationCacheControlFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineCreationCacheControlFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineCreationCacheControlFeatures>::value,\n                          \"PhysicalDevicePipelineCreationCacheControlFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryBarrier2 ) == sizeof( VkMemoryBarrier2 ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryBarrier2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryBarrier2>::value,\n                          \"MemoryBarrier2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BufferMemoryBarrier2 ) == sizeof( VkBufferMemoryBarrier2 ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BufferMemoryBarrier2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BufferMemoryBarrier2>::value,\n                          \"BufferMemoryBarrier2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageMemoryBarrier2 ) == sizeof( VkImageMemoryBarrier2 ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageMemoryBarrier2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageMemoryBarrier2>::value,\n                          \"ImageMemoryBarrier2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DependencyInfo ) == sizeof( VkDependencyInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DependencyInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DependencyInfo>::value,\n                          \"DependencyInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SubmitInfo2 ) == sizeof( VkSubmitInfo2 ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SubmitInfo2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SubmitInfo2>::value, \"SubmitInfo2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo ) == sizeof( VkSemaphoreSubmitInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo>::value,\n                          \"SemaphoreSubmitInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CommandBufferSubmitInfo ) == sizeof( VkCommandBufferSubmitInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CommandBufferSubmitInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CommandBufferSubmitInfo>::value,\n                          \"CommandBufferSubmitInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceSynchronization2Features ) == sizeof( VkPhysicalDeviceSynchronization2Features ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceSynchronization2Features>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceSynchronization2Features>::value,\n                          \"PhysicalDeviceSynchronization2Features is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures ) ==\n                            sizeof( VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures>::value,\n                          \"PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageRobustnessFeatures ) == sizeof( VkPhysicalDeviceImageRobustnessFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageRobustnessFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageRobustnessFeatures>::value,\n                          \"PhysicalDeviceImageRobustnessFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CopyBufferInfo2 ) == sizeof( VkCopyBufferInfo2 ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CopyBufferInfo2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CopyBufferInfo2>::value,\n                          \"CopyBufferInfo2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CopyImageInfo2 ) == sizeof( VkCopyImageInfo2 ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CopyImageInfo2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CopyImageInfo2>::value,\n                          \"CopyImageInfo2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2 ) == sizeof( VkCopyBufferToImageInfo2 ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2>::value,\n                          \"CopyBufferToImageInfo2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2 ) == sizeof( VkCopyImageToBufferInfo2 ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2>::value,\n                          \"CopyImageToBufferInfo2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BlitImageInfo2 ) == sizeof( VkBlitImageInfo2 ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BlitImageInfo2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BlitImageInfo2>::value,\n                          \"BlitImageInfo2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ResolveImageInfo2 ) == sizeof( VkResolveImageInfo2 ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ResolveImageInfo2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ResolveImageInfo2>::value,\n                          \"ResolveImageInfo2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BufferCopy2 ) == sizeof( VkBufferCopy2 ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BufferCopy2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BufferCopy2>::value, \"BufferCopy2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageCopy2 ) == sizeof( VkImageCopy2 ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageCopy2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageCopy2>::value, \"ImageCopy2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageBlit2 ) == sizeof( VkImageBlit2 ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageBlit2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageBlit2>::value, \"ImageBlit2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BufferImageCopy2 ) == sizeof( VkBufferImageCopy2 ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BufferImageCopy2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BufferImageCopy2>::value,\n                          \"BufferImageCopy2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageResolve2 ) == sizeof( VkImageResolve2 ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageResolve2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageResolve2>::value, \"ImageResolve2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupSizeControlFeatures ) == sizeof( VkPhysicalDeviceSubgroupSizeControlFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupSizeControlFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupSizeControlFeatures>::value,\n                          \"PhysicalDeviceSubgroupSizeControlFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupSizeControlProperties ) ==\n                            sizeof( VkPhysicalDeviceSubgroupSizeControlProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupSizeControlProperties>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupSizeControlProperties>::value,\n                          \"PhysicalDeviceSubgroupSizeControlProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineShaderStageRequiredSubgroupSizeCreateInfo ) ==\n                            sizeof( VkPipelineShaderStageRequiredSubgroupSizeCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineShaderStageRequiredSubgroupSizeCreateInfo>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineShaderStageRequiredSubgroupSizeCreateInfo>::value,\n                          \"PipelineShaderStageRequiredSubgroupSizeCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceInlineUniformBlockFeatures ) == sizeof( VkPhysicalDeviceInlineUniformBlockFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceInlineUniformBlockFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceInlineUniformBlockFeatures>::value,\n                          \"PhysicalDeviceInlineUniformBlockFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceInlineUniformBlockProperties ) == sizeof( VkPhysicalDeviceInlineUniformBlockProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceInlineUniformBlockProperties>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceInlineUniformBlockProperties>::value,\n                          \"PhysicalDeviceInlineUniformBlockProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::WriteDescriptorSetInlineUniformBlock ) == sizeof( VkWriteDescriptorSetInlineUniformBlock ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::WriteDescriptorSetInlineUniformBlock>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::WriteDescriptorSetInlineUniformBlock>::value,\n                          \"WriteDescriptorSetInlineUniformBlock is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorPoolInlineUniformBlockCreateInfo ) == sizeof( VkDescriptorPoolInlineUniformBlockCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DescriptorPoolInlineUniformBlockCreateInfo>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorPoolInlineUniformBlockCreateInfo>::value,\n                          \"DescriptorPoolInlineUniformBlockCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceTextureCompressionASTCHDRFeatures ) ==\n                            sizeof( VkPhysicalDeviceTextureCompressionASTCHDRFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceTextureCompressionASTCHDRFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceTextureCompressionASTCHDRFeatures>::value,\n                          \"PhysicalDeviceTextureCompressionASTCHDRFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderingInfo ) == sizeof( VkRenderingInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderingInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderingInfo>::value, \"RenderingInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderingAttachmentInfo ) == sizeof( VkRenderingAttachmentInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderingAttachmentInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderingAttachmentInfo>::value,\n                          \"RenderingAttachmentInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineRenderingCreateInfo ) == sizeof( VkPipelineRenderingCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineRenderingCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineRenderingCreateInfo>::value,\n                          \"PipelineRenderingCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDynamicRenderingFeatures ) == sizeof( VkPhysicalDeviceDynamicRenderingFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDynamicRenderingFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDynamicRenderingFeatures>::value,\n                          \"PhysicalDeviceDynamicRenderingFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CommandBufferInheritanceRenderingInfo ) == sizeof( VkCommandBufferInheritanceRenderingInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceRenderingInfo>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceRenderingInfo>::value,\n                          \"CommandBufferInheritanceRenderingInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerDotProductFeatures ) ==\n                            sizeof( VkPhysicalDeviceShaderIntegerDotProductFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerDotProductFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerDotProductFeatures>::value,\n                          \"PhysicalDeviceShaderIntegerDotProductFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerDotProductProperties ) ==\n                            sizeof( VkPhysicalDeviceShaderIntegerDotProductProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerDotProductProperties>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerDotProductProperties>::value,\n                          \"PhysicalDeviceShaderIntegerDotProductProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceTexelBufferAlignmentProperties ) ==\n                            sizeof( VkPhysicalDeviceTexelBufferAlignmentProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceTexelBufferAlignmentProperties>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceTexelBufferAlignmentProperties>::value,\n                          \"PhysicalDeviceTexelBufferAlignmentProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::FormatProperties3 ) == sizeof( VkFormatProperties3 ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::FormatProperties3>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::FormatProperties3>::value,\n                          \"FormatProperties3 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance4Features ) == sizeof( VkPhysicalDeviceMaintenance4Features ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance4Features>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance4Features>::value,\n                          \"PhysicalDeviceMaintenance4Features is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance4Properties ) == sizeof( VkPhysicalDeviceMaintenance4Properties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance4Properties>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance4Properties>::value,\n                          \"PhysicalDeviceMaintenance4Properties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements ) == sizeof( VkDeviceBufferMemoryRequirements ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements>::value,\n                          \"DeviceBufferMemoryRequirements is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements ) == sizeof( VkDeviceImageMemoryRequirements ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements>::value,\n                          \"DeviceImageMemoryRequirements is not nothrow_move_constructible!\" );\n\n//=== VK_VERSION_1_4 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan14Features ) == sizeof( VkPhysicalDeviceVulkan14Features ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan14Features>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan14Features>::value,\n                          \"PhysicalDeviceVulkan14Features is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan14Properties ) == sizeof( VkPhysicalDeviceVulkan14Properties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan14Properties>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan14Properties>::value,\n                          \"PhysicalDeviceVulkan14Properties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceQueueGlobalPriorityCreateInfo ) == sizeof( VkDeviceQueueGlobalPriorityCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceQueueGlobalPriorityCreateInfo>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceQueueGlobalPriorityCreateInfo>::value,\n                          \"DeviceQueueGlobalPriorityCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceGlobalPriorityQueryFeatures ) == sizeof( VkPhysicalDeviceGlobalPriorityQueryFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceGlobalPriorityQueryFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceGlobalPriorityQueryFeatures>::value,\n                          \"PhysicalDeviceGlobalPriorityQueryFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::QueueFamilyGlobalPriorityProperties ) == sizeof( VkQueueFamilyGlobalPriorityProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::QueueFamilyGlobalPriorityProperties>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::QueueFamilyGlobalPriorityProperties>::value,\n                          \"QueueFamilyGlobalPriorityProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSubgroupRotateFeatures ) == sizeof( VkPhysicalDeviceShaderSubgroupRotateFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSubgroupRotateFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSubgroupRotateFeatures>::value,\n                          \"PhysicalDeviceShaderSubgroupRotateFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderFloatControls2Features ) == sizeof( VkPhysicalDeviceShaderFloatControls2Features ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderFloatControls2Features>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderFloatControls2Features>::value,\n                          \"PhysicalDeviceShaderFloatControls2Features is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderExpectAssumeFeatures ) == sizeof( VkPhysicalDeviceShaderExpectAssumeFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderExpectAssumeFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderExpectAssumeFeatures>::value,\n                          \"PhysicalDeviceShaderExpectAssumeFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceLineRasterizationFeatures ) == sizeof( VkPhysicalDeviceLineRasterizationFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceLineRasterizationFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceLineRasterizationFeatures>::value,\n                          \"PhysicalDeviceLineRasterizationFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceLineRasterizationProperties ) == sizeof( VkPhysicalDeviceLineRasterizationProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceLineRasterizationProperties>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceLineRasterizationProperties>::value,\n                          \"PhysicalDeviceLineRasterizationProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineRasterizationLineStateCreateInfo ) == sizeof( VkPipelineRasterizationLineStateCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineRasterizationLineStateCreateInfo>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineRasterizationLineStateCreateInfo>::value,\n                          \"PipelineRasterizationLineStateCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeDivisorProperties ) ==\n                            sizeof( VkPhysicalDeviceVertexAttributeDivisorProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeDivisorProperties>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeDivisorProperties>::value,\n                          \"PhysicalDeviceVertexAttributeDivisorProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VertexInputBindingDivisorDescription ) == sizeof( VkVertexInputBindingDivisorDescription ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VertexInputBindingDivisorDescription>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VertexInputBindingDivisorDescription>::value,\n                          \"VertexInputBindingDivisorDescription is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineVertexInputDivisorStateCreateInfo ) == sizeof( VkPipelineVertexInputDivisorStateCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineVertexInputDivisorStateCreateInfo>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineVertexInputDivisorStateCreateInfo>::value,\n                          \"PipelineVertexInputDivisorStateCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeDivisorFeatures ) ==\n                            sizeof( VkPhysicalDeviceVertexAttributeDivisorFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeDivisorFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeDivisorFeatures>::value,\n                          \"PhysicalDeviceVertexAttributeDivisorFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceIndexTypeUint8Features ) == sizeof( VkPhysicalDeviceIndexTypeUint8Features ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceIndexTypeUint8Features>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceIndexTypeUint8Features>::value,\n                          \"PhysicalDeviceIndexTypeUint8Features is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryMapInfo ) == sizeof( VkMemoryMapInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryMapInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryMapInfo>::value, \"MemoryMapInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryUnmapInfo ) == sizeof( VkMemoryUnmapInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryUnmapInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryUnmapInfo>::value,\n                          \"MemoryUnmapInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance5Features ) == sizeof( VkPhysicalDeviceMaintenance5Features ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance5Features>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance5Features>::value,\n                          \"PhysicalDeviceMaintenance5Features is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance5Properties ) == sizeof( VkPhysicalDeviceMaintenance5Properties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance5Properties>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance5Properties>::value,\n                          \"PhysicalDeviceMaintenance5Properties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderingAreaInfo ) == sizeof( VkRenderingAreaInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderingAreaInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderingAreaInfo>::value,\n                          \"RenderingAreaInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo ) == sizeof( VkDeviceImageSubresourceInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo>::value,\n                          \"DeviceImageSubresourceInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageSubresource2 ) == sizeof( VkImageSubresource2 ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageSubresource2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageSubresource2>::value,\n                          \"ImageSubresource2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SubresourceLayout2 ) == sizeof( VkSubresourceLayout2 ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SubresourceLayout2>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SubresourceLayout2>::value,\n                          \"SubresourceLayout2 is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineCreateFlags2CreateInfo ) == sizeof( VkPipelineCreateFlags2CreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineCreateFlags2CreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineCreateFlags2CreateInfo>::value,\n                          \"PipelineCreateFlags2CreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BufferUsageFlags2CreateInfo ) == sizeof( VkBufferUsageFlags2CreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BufferUsageFlags2CreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BufferUsageFlags2CreateInfo>::value,\n                          \"BufferUsageFlags2CreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePushDescriptorProperties ) == sizeof( VkPhysicalDevicePushDescriptorProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePushDescriptorProperties>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePushDescriptorProperties>::value,\n                          \"PhysicalDevicePushDescriptorProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDynamicRenderingLocalReadFeatures ) ==\n                            sizeof( VkPhysicalDeviceDynamicRenderingLocalReadFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDynamicRenderingLocalReadFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDynamicRenderingLocalReadFeatures>::value,\n                          \"PhysicalDeviceDynamicRenderingLocalReadFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderingAttachmentLocationInfo ) == sizeof( VkRenderingAttachmentLocationInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderingAttachmentLocationInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderingAttachmentLocationInfo>::value,\n                          \"RenderingAttachmentLocationInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderingInputAttachmentIndexInfo ) == sizeof( VkRenderingInputAttachmentIndexInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderingInputAttachmentIndexInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderingInputAttachmentIndexInfo>::value,\n                          \"RenderingInputAttachmentIndexInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance6Features ) == sizeof( VkPhysicalDeviceMaintenance6Features ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance6Features>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance6Features>::value,\n                          \"PhysicalDeviceMaintenance6Features is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance6Properties ) == sizeof( VkPhysicalDeviceMaintenance6Properties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance6Properties>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance6Properties>::value,\n                          \"PhysicalDeviceMaintenance6Properties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BindMemoryStatus ) == sizeof( VkBindMemoryStatus ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BindMemoryStatus>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BindMemoryStatus>::value,\n                          \"BindMemoryStatus is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BindDescriptorSetsInfo ) == sizeof( VkBindDescriptorSetsInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BindDescriptorSetsInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BindDescriptorSetsInfo>::value,\n                          \"BindDescriptorSetsInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PushConstantsInfo ) == sizeof( VkPushConstantsInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PushConstantsInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PushConstantsInfo>::value,\n                          \"PushConstantsInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PushDescriptorSetInfo ) == sizeof( VkPushDescriptorSetInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PushDescriptorSetInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PushDescriptorSetInfo>::value,\n                          \"PushDescriptorSetInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PushDescriptorSetWithTemplateInfo ) == sizeof( VkPushDescriptorSetWithTemplateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PushDescriptorSetWithTemplateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PushDescriptorSetWithTemplateInfo>::value,\n                          \"PushDescriptorSetWithTemplateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineProtectedAccessFeatures ) ==\n                            sizeof( VkPhysicalDevicePipelineProtectedAccessFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineProtectedAccessFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineProtectedAccessFeatures>::value,\n                          \"PhysicalDevicePipelineProtectedAccessFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineRobustnessFeatures ) == sizeof( VkPhysicalDevicePipelineRobustnessFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineRobustnessFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineRobustnessFeatures>::value,\n                          \"PhysicalDevicePipelineRobustnessFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineRobustnessProperties ) == sizeof( VkPhysicalDevicePipelineRobustnessProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineRobustnessProperties>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineRobustnessProperties>::value,\n                          \"PhysicalDevicePipelineRobustnessProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineRobustnessCreateInfo ) == sizeof( VkPipelineRobustnessCreateInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineRobustnessCreateInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineRobustnessCreateInfo>::value,\n                          \"PipelineRobustnessCreateInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceHostImageCopyFeatures ) == sizeof( VkPhysicalDeviceHostImageCopyFeatures ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceHostImageCopyFeatures>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceHostImageCopyFeatures>::value,\n                          \"PhysicalDeviceHostImageCopyFeatures is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceHostImageCopyProperties ) == sizeof( VkPhysicalDeviceHostImageCopyProperties ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceHostImageCopyProperties>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceHostImageCopyProperties>::value,\n                          \"PhysicalDeviceHostImageCopyProperties is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryToImageCopy ) == sizeof( VkMemoryToImageCopy ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryToImageCopy>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryToImageCopy>::value,\n                          \"MemoryToImageCopy is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageToMemoryCopy ) == sizeof( VkImageToMemoryCopy ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageToMemoryCopy>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageToMemoryCopy>::value,\n                          \"ImageToMemoryCopy is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CopyMemoryToImageInfo ) == sizeof( VkCopyMemoryToImageInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CopyMemoryToImageInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CopyMemoryToImageInfo>::value,\n                          \"CopyMemoryToImageInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CopyImageToMemoryInfo ) == sizeof( VkCopyImageToMemoryInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CopyImageToMemoryInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CopyImageToMemoryInfo>::value,\n                          \"CopyImageToMemoryInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CopyImageToImageInfo ) == sizeof( VkCopyImageToImageInfo ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CopyImageToImageInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CopyImageToImageInfo>::value,\n                          \"CopyImageToImageInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::HostImageLayoutTransitionInfo ) == sizeof( VkHostImageLayoutTransitionInfo ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::HostImageLayoutTransitionInfo>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::HostImageLayoutTransitionInfo>::value,\n                          \"HostImageLayoutTransitionInfo is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SubresourceHostMemcpySize ) == sizeof( VkSubresourceHostMemcpySize ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SubresourceHostMemcpySize>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SubresourceHostMemcpySize>::value,\n                          \"SubresourceHostMemcpySize is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::HostImageCopyDevicePerformanceQuery ) == sizeof( VkHostImageCopyDevicePerformanceQuery ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::HostImageCopyDevicePerformanceQuery>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::HostImageCopyDevicePerformanceQuery>::value,\n                          \"HostImageCopyDevicePerformanceQuery is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_surface ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SurfaceKHR ) == sizeof( VkSurfaceKHR ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::SurfaceKHR>::value, \"SurfaceKHR is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SurfaceKHR>::value, \"SurfaceKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR ) == sizeof( VkSurfaceCapabilitiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR>::value,\n                          \"SurfaceCapabilitiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SurfaceFormatKHR ) == sizeof( VkSurfaceFormatKHR ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SurfaceFormatKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SurfaceFormatKHR>::value,\n                          \"SurfaceFormatKHR is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_swapchain ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR ) == sizeof( VkSwapchainCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR>::value,\n                          \"SwapchainCreateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SwapchainKHR ) == sizeof( VkSwapchainKHR ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::SwapchainKHR>::value, \"SwapchainKHR is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SwapchainKHR>::value, \"SwapchainKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PresentInfoKHR ) == sizeof( VkPresentInfoKHR ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PresentInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PresentInfoKHR>::value,\n                          \"PresentInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageSwapchainCreateInfoKHR ) == sizeof( VkImageSwapchainCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageSwapchainCreateInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageSwapchainCreateInfoKHR>::value,\n                          \"ImageSwapchainCreateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BindImageMemorySwapchainInfoKHR ) == sizeof( VkBindImageMemorySwapchainInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BindImageMemorySwapchainInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BindImageMemorySwapchainInfoKHR>::value,\n                          \"BindImageMemorySwapchainInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AcquireNextImageInfoKHR ) == sizeof( VkAcquireNextImageInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AcquireNextImageInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AcquireNextImageInfoKHR>::value,\n                          \"AcquireNextImageInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceGroupPresentCapabilitiesKHR ) == sizeof( VkDeviceGroupPresentCapabilitiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceGroupPresentCapabilitiesKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceGroupPresentCapabilitiesKHR>::value,\n                          \"DeviceGroupPresentCapabilitiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceGroupPresentInfoKHR ) == sizeof( VkDeviceGroupPresentInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceGroupPresentInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceGroupPresentInfoKHR>::value,\n                          \"DeviceGroupPresentInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceGroupSwapchainCreateInfoKHR ) == sizeof( VkDeviceGroupSwapchainCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceGroupSwapchainCreateInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceGroupSwapchainCreateInfoKHR>::value,\n                          \"DeviceGroupSwapchainCreateInfoKHR is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_display ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DisplayKHR ) == sizeof( VkDisplayKHR ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::DisplayKHR>::value, \"DisplayKHR is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DisplayKHR>::value, \"DisplayKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DisplayModeCreateInfoKHR ) == sizeof( VkDisplayModeCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DisplayModeCreateInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DisplayModeCreateInfoKHR>::value,\n                          \"DisplayModeCreateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DisplayModeKHR ) == sizeof( VkDisplayModeKHR ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::DisplayModeKHR>::value, \"DisplayModeKHR is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DisplayModeKHR>::value,\n                          \"DisplayModeKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DisplayModeParametersKHR ) == sizeof( VkDisplayModeParametersKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DisplayModeParametersKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DisplayModeParametersKHR>::value,\n                          \"DisplayModeParametersKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR ) == sizeof( VkDisplayModePropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR>::value,\n                          \"DisplayModePropertiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR ) == sizeof( VkDisplayPlaneCapabilitiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR>::value,\n                          \"DisplayPlaneCapabilitiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR ) == sizeof( VkDisplayPlanePropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR>::value,\n                          \"DisplayPlanePropertiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR ) == sizeof( VkDisplayPropertiesKHR ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR>::value,\n                          \"DisplayPropertiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateInfoKHR ) == sizeof( VkDisplaySurfaceCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateInfoKHR>::value,\n                          \"DisplaySurfaceCreateInfoKHR is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_display_swapchain ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DisplayPresentInfoKHR ) == sizeof( VkDisplayPresentInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DisplayPresentInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DisplayPresentInfoKHR>::value,\n                          \"DisplayPresentInfoKHR is not nothrow_move_constructible!\" );\n\n#if defined( VK_USE_PLATFORM_XLIB_KHR )\n//=== VK_KHR_xlib_surface ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::XlibSurfaceCreateInfoKHR ) == sizeof( VkXlibSurfaceCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::XlibSurfaceCreateInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::XlibSurfaceCreateInfoKHR>::value,\n                          \"XlibSurfaceCreateInfoKHR is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_XLIB_KHR*/\n\n#if defined( VK_USE_PLATFORM_XCB_KHR )\n//=== VK_KHR_xcb_surface ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::XcbSurfaceCreateInfoKHR ) == sizeof( VkXcbSurfaceCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::XcbSurfaceCreateInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::XcbSurfaceCreateInfoKHR>::value,\n                          \"XcbSurfaceCreateInfoKHR is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_XCB_KHR*/\n\n#if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n//=== VK_KHR_wayland_surface ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateInfoKHR ) == sizeof( VkWaylandSurfaceCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateInfoKHR>::value,\n                          \"WaylandSurfaceCreateInfoKHR is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_WAYLAND_KHR*/\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n//=== VK_KHR_android_surface ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateInfoKHR ) == sizeof( VkAndroidSurfaceCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateInfoKHR>::value,\n                          \"AndroidSurfaceCreateInfoKHR is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n//=== VK_KHR_win32_surface ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::Win32SurfaceCreateInfoKHR ) == sizeof( VkWin32SurfaceCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::Win32SurfaceCreateInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::Win32SurfaceCreateInfoKHR>::value,\n                          \"Win32SurfaceCreateInfoKHR is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n//=== VK_EXT_debug_report ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT ) == sizeof( VkDebugReportCallbackEXT ),\n                          \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT>::value,\n                          \"DebugReportCallbackEXT is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT>::value,\n                          \"DebugReportCallbackEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DebugReportCallbackCreateInfoEXT ) == sizeof( VkDebugReportCallbackCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DebugReportCallbackCreateInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DebugReportCallbackCreateInfoEXT>::value,\n                          \"DebugReportCallbackCreateInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_AMD_rasterization_order ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineRasterizationStateRasterizationOrderAMD ) ==\n                            sizeof( VkPipelineRasterizationStateRasterizationOrderAMD ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineRasterizationStateRasterizationOrderAMD>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineRasterizationStateRasterizationOrderAMD>::value,\n                          \"PipelineRasterizationStateRasterizationOrderAMD is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_debug_marker ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DebugMarkerObjectNameInfoEXT ) == sizeof( VkDebugMarkerObjectNameInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DebugMarkerObjectNameInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DebugMarkerObjectNameInfoEXT>::value,\n                          \"DebugMarkerObjectNameInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DebugMarkerObjectTagInfoEXT ) == sizeof( VkDebugMarkerObjectTagInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DebugMarkerObjectTagInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DebugMarkerObjectTagInfoEXT>::value,\n                          \"DebugMarkerObjectTagInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT ) == sizeof( VkDebugMarkerMarkerInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT>::value,\n                          \"DebugMarkerMarkerInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_video_queue ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoSessionKHR ) == sizeof( VkVideoSessionKHR ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::VideoSessionKHR>::value, \"VideoSessionKHR is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoSessionKHR>::value,\n                          \"VideoSessionKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR ) == sizeof( VkVideoSessionParametersKHR ),\n                          \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR>::value,\n                          \"VideoSessionParametersKHR is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR>::value,\n                          \"VideoSessionParametersKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::QueueFamilyQueryResultStatusPropertiesKHR ) == sizeof( VkQueueFamilyQueryResultStatusPropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::QueueFamilyQueryResultStatusPropertiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::QueueFamilyQueryResultStatusPropertiesKHR>::value,\n                          \"QueueFamilyQueryResultStatusPropertiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::QueueFamilyVideoPropertiesKHR ) == sizeof( VkQueueFamilyVideoPropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::QueueFamilyVideoPropertiesKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::QueueFamilyVideoPropertiesKHR>::value,\n                          \"QueueFamilyVideoPropertiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR ) == sizeof( VkVideoProfileInfoKHR ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR>::value,\n                          \"VideoProfileInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoProfileListInfoKHR ) == sizeof( VkVideoProfileListInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoProfileListInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoProfileListInfoKHR>::value,\n                          \"VideoProfileListInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR ) == sizeof( VkVideoCapabilitiesKHR ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR>::value,\n                          \"VideoCapabilitiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR ) == sizeof( VkPhysicalDeviceVideoFormatInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR>::value,\n                          \"PhysicalDeviceVideoFormatInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR ) == sizeof( VkVideoFormatPropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR>::value,\n                          \"VideoFormatPropertiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoPictureResourceInfoKHR ) == sizeof( VkVideoPictureResourceInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoPictureResourceInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoPictureResourceInfoKHR>::value,\n                          \"VideoPictureResourceInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR ) == sizeof( VkVideoReferenceSlotInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR>::value,\n                          \"VideoReferenceSlotInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoSessionMemoryRequirementsKHR ) == sizeof( VkVideoSessionMemoryRequirementsKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoSessionMemoryRequirementsKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoSessionMemoryRequirementsKHR>::value,\n                          \"VideoSessionMemoryRequirementsKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BindVideoSessionMemoryInfoKHR ) == sizeof( VkBindVideoSessionMemoryInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BindVideoSessionMemoryInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BindVideoSessionMemoryInfoKHR>::value,\n                          \"BindVideoSessionMemoryInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoSessionCreateInfoKHR ) == sizeof( VkVideoSessionCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoSessionCreateInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoSessionCreateInfoKHR>::value,\n                          \"VideoSessionCreateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateInfoKHR ) == sizeof( VkVideoSessionParametersCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateInfoKHR>::value,\n                          \"VideoSessionParametersCreateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoSessionParametersUpdateInfoKHR ) == sizeof( VkVideoSessionParametersUpdateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoSessionParametersUpdateInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoSessionParametersUpdateInfoKHR>::value,\n                          \"VideoSessionParametersUpdateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoBeginCodingInfoKHR ) == sizeof( VkVideoBeginCodingInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoBeginCodingInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoBeginCodingInfoKHR>::value,\n                          \"VideoBeginCodingInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEndCodingInfoKHR ) == sizeof( VkVideoEndCodingInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEndCodingInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEndCodingInfoKHR>::value,\n                          \"VideoEndCodingInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoCodingControlInfoKHR ) == sizeof( VkVideoCodingControlInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoCodingControlInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoCodingControlInfoKHR>::value,\n                          \"VideoCodingControlInfoKHR is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_video_decode_queue ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoDecodeCapabilitiesKHR ) == sizeof( VkVideoDecodeCapabilitiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoDecodeCapabilitiesKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoDecodeCapabilitiesKHR>::value,\n                          \"VideoDecodeCapabilitiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoDecodeUsageInfoKHR ) == sizeof( VkVideoDecodeUsageInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoDecodeUsageInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoDecodeUsageInfoKHR>::value,\n                          \"VideoDecodeUsageInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoDecodeInfoKHR ) == sizeof( VkVideoDecodeInfoKHR ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoDecodeInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoDecodeInfoKHR>::value,\n                          \"VideoDecodeInfoKHR is not nothrow_move_constructible!\" );\n\n//=== VK_NV_dedicated_allocation ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DedicatedAllocationImageCreateInfoNV ) == sizeof( VkDedicatedAllocationImageCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DedicatedAllocationImageCreateInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DedicatedAllocationImageCreateInfoNV>::value,\n                          \"DedicatedAllocationImageCreateInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DedicatedAllocationBufferCreateInfoNV ) == sizeof( VkDedicatedAllocationBufferCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DedicatedAllocationBufferCreateInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DedicatedAllocationBufferCreateInfoNV>::value,\n                          \"DedicatedAllocationBufferCreateInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DedicatedAllocationMemoryAllocateInfoNV ) == sizeof( VkDedicatedAllocationMemoryAllocateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DedicatedAllocationMemoryAllocateInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DedicatedAllocationMemoryAllocateInfoNV>::value,\n                          \"DedicatedAllocationMemoryAllocateInfoNV is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_transform_feedback ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceTransformFeedbackFeaturesEXT ) == sizeof( VkPhysicalDeviceTransformFeedbackFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceTransformFeedbackFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceTransformFeedbackFeaturesEXT>::value,\n                          \"PhysicalDeviceTransformFeedbackFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceTransformFeedbackPropertiesEXT ) ==\n                            sizeof( VkPhysicalDeviceTransformFeedbackPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceTransformFeedbackPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceTransformFeedbackPropertiesEXT>::value,\n                          \"PhysicalDeviceTransformFeedbackPropertiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineRasterizationStateStreamCreateInfoEXT ) ==\n                            sizeof( VkPipelineRasterizationStateStreamCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineRasterizationStateStreamCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineRasterizationStateStreamCreateInfoEXT>::value,\n                          \"PipelineRasterizationStateStreamCreateInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_NVX_binary_import ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CuModuleNVX ) == sizeof( VkCuModuleNVX ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::CuModuleNVX>::value, \"CuModuleNVX is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CuModuleNVX>::value, \"CuModuleNVX is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CuFunctionNVX ) == sizeof( VkCuFunctionNVX ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::CuFunctionNVX>::value, \"CuFunctionNVX is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CuFunctionNVX>::value, \"CuFunctionNVX is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CuModuleCreateInfoNVX ) == sizeof( VkCuModuleCreateInfoNVX ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CuModuleCreateInfoNVX>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CuModuleCreateInfoNVX>::value,\n                          \"CuModuleCreateInfoNVX is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CuModuleTexturingModeCreateInfoNVX ) == sizeof( VkCuModuleTexturingModeCreateInfoNVX ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CuModuleTexturingModeCreateInfoNVX>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CuModuleTexturingModeCreateInfoNVX>::value,\n                          \"CuModuleTexturingModeCreateInfoNVX is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CuFunctionCreateInfoNVX ) == sizeof( VkCuFunctionCreateInfoNVX ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CuFunctionCreateInfoNVX>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CuFunctionCreateInfoNVX>::value,\n                          \"CuFunctionCreateInfoNVX is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CuLaunchInfoNVX ) == sizeof( VkCuLaunchInfoNVX ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CuLaunchInfoNVX>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CuLaunchInfoNVX>::value,\n                          \"CuLaunchInfoNVX is not nothrow_move_constructible!\" );\n\n//=== VK_NVX_image_view_handle ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageViewHandleInfoNVX ) == sizeof( VkImageViewHandleInfoNVX ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageViewHandleInfoNVX>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageViewHandleInfoNVX>::value,\n                          \"ImageViewHandleInfoNVX is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageViewAddressPropertiesNVX ) == sizeof( VkImageViewAddressPropertiesNVX ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageViewAddressPropertiesNVX>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageViewAddressPropertiesNVX>::value,\n                          \"ImageViewAddressPropertiesNVX is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_video_encode_h264 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH264CapabilitiesKHR ) == sizeof( VkVideoEncodeH264CapabilitiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH264CapabilitiesKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH264CapabilitiesKHR>::value,\n                          \"VideoEncodeH264CapabilitiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH264QualityLevelPropertiesKHR ) == sizeof( VkVideoEncodeH264QualityLevelPropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH264QualityLevelPropertiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH264QualityLevelPropertiesKHR>::value,\n                          \"VideoEncodeH264QualityLevelPropertiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionCreateInfoKHR ) == sizeof( VkVideoEncodeH264SessionCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionCreateInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionCreateInfoKHR>::value,\n                          \"VideoEncodeH264SessionCreateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersCreateInfoKHR ) ==\n                            sizeof( VkVideoEncodeH264SessionParametersCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersCreateInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersCreateInfoKHR>::value,\n                          \"VideoEncodeH264SessionParametersCreateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersAddInfoKHR ) == sizeof( VkVideoEncodeH264SessionParametersAddInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersAddInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersAddInfoKHR>::value,\n                          \"VideoEncodeH264SessionParametersAddInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersGetInfoKHR ) == sizeof( VkVideoEncodeH264SessionParametersGetInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersGetInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersGetInfoKHR>::value,\n                          \"VideoEncodeH264SessionParametersGetInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersFeedbackInfoKHR ) ==\n                            sizeof( VkVideoEncodeH264SessionParametersFeedbackInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersFeedbackInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersFeedbackInfoKHR>::value,\n                          \"VideoEncodeH264SessionParametersFeedbackInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH264PictureInfoKHR ) == sizeof( VkVideoEncodeH264PictureInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH264PictureInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH264PictureInfoKHR>::value,\n                          \"VideoEncodeH264PictureInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH264DpbSlotInfoKHR ) == sizeof( VkVideoEncodeH264DpbSlotInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH264DpbSlotInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH264DpbSlotInfoKHR>::value,\n                          \"VideoEncodeH264DpbSlotInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH264NaluSliceInfoKHR ) == sizeof( VkVideoEncodeH264NaluSliceInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH264NaluSliceInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH264NaluSliceInfoKHR>::value,\n                          \"VideoEncodeH264NaluSliceInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH264ProfileInfoKHR ) == sizeof( VkVideoEncodeH264ProfileInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH264ProfileInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH264ProfileInfoKHR>::value,\n                          \"VideoEncodeH264ProfileInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH264RateControlInfoKHR ) == sizeof( VkVideoEncodeH264RateControlInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH264RateControlInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH264RateControlInfoKHR>::value,\n                          \"VideoEncodeH264RateControlInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH264RateControlLayerInfoKHR ) == sizeof( VkVideoEncodeH264RateControlLayerInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH264RateControlLayerInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH264RateControlLayerInfoKHR>::value,\n                          \"VideoEncodeH264RateControlLayerInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH264QpKHR ) == sizeof( VkVideoEncodeH264QpKHR ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH264QpKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH264QpKHR>::value,\n                          \"VideoEncodeH264QpKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH264FrameSizeKHR ) == sizeof( VkVideoEncodeH264FrameSizeKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH264FrameSizeKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH264FrameSizeKHR>::value,\n                          \"VideoEncodeH264FrameSizeKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH264GopRemainingFrameInfoKHR ) == sizeof( VkVideoEncodeH264GopRemainingFrameInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH264GopRemainingFrameInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH264GopRemainingFrameInfoKHR>::value,\n                          \"VideoEncodeH264GopRemainingFrameInfoKHR is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_video_encode_h265 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH265CapabilitiesKHR ) == sizeof( VkVideoEncodeH265CapabilitiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH265CapabilitiesKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH265CapabilitiesKHR>::value,\n                          \"VideoEncodeH265CapabilitiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionCreateInfoKHR ) == sizeof( VkVideoEncodeH265SessionCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionCreateInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionCreateInfoKHR>::value,\n                          \"VideoEncodeH265SessionCreateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH265QualityLevelPropertiesKHR ) == sizeof( VkVideoEncodeH265QualityLevelPropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH265QualityLevelPropertiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH265QualityLevelPropertiesKHR>::value,\n                          \"VideoEncodeH265QualityLevelPropertiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersCreateInfoKHR ) ==\n                            sizeof( VkVideoEncodeH265SessionParametersCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersCreateInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersCreateInfoKHR>::value,\n                          \"VideoEncodeH265SessionParametersCreateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersAddInfoKHR ) == sizeof( VkVideoEncodeH265SessionParametersAddInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersAddInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersAddInfoKHR>::value,\n                          \"VideoEncodeH265SessionParametersAddInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersGetInfoKHR ) == sizeof( VkVideoEncodeH265SessionParametersGetInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersGetInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersGetInfoKHR>::value,\n                          \"VideoEncodeH265SessionParametersGetInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersFeedbackInfoKHR ) ==\n                            sizeof( VkVideoEncodeH265SessionParametersFeedbackInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersFeedbackInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersFeedbackInfoKHR>::value,\n                          \"VideoEncodeH265SessionParametersFeedbackInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH265PictureInfoKHR ) == sizeof( VkVideoEncodeH265PictureInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH265PictureInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH265PictureInfoKHR>::value,\n                          \"VideoEncodeH265PictureInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH265DpbSlotInfoKHR ) == sizeof( VkVideoEncodeH265DpbSlotInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH265DpbSlotInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH265DpbSlotInfoKHR>::value,\n                          \"VideoEncodeH265DpbSlotInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH265NaluSliceSegmentInfoKHR ) == sizeof( VkVideoEncodeH265NaluSliceSegmentInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH265NaluSliceSegmentInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH265NaluSliceSegmentInfoKHR>::value,\n                          \"VideoEncodeH265NaluSliceSegmentInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH265ProfileInfoKHR ) == sizeof( VkVideoEncodeH265ProfileInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH265ProfileInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH265ProfileInfoKHR>::value,\n                          \"VideoEncodeH265ProfileInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH265RateControlInfoKHR ) == sizeof( VkVideoEncodeH265RateControlInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH265RateControlInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH265RateControlInfoKHR>::value,\n                          \"VideoEncodeH265RateControlInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH265RateControlLayerInfoKHR ) == sizeof( VkVideoEncodeH265RateControlLayerInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH265RateControlLayerInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH265RateControlLayerInfoKHR>::value,\n                          \"VideoEncodeH265RateControlLayerInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH265QpKHR ) == sizeof( VkVideoEncodeH265QpKHR ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH265QpKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH265QpKHR>::value,\n                          \"VideoEncodeH265QpKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH265FrameSizeKHR ) == sizeof( VkVideoEncodeH265FrameSizeKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH265FrameSizeKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH265FrameSizeKHR>::value,\n                          \"VideoEncodeH265FrameSizeKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH265GopRemainingFrameInfoKHR ) == sizeof( VkVideoEncodeH265GopRemainingFrameInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH265GopRemainingFrameInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH265GopRemainingFrameInfoKHR>::value,\n                          \"VideoEncodeH265GopRemainingFrameInfoKHR is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_video_decode_h264 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoDecodeH264ProfileInfoKHR ) == sizeof( VkVideoDecodeH264ProfileInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoDecodeH264ProfileInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoDecodeH264ProfileInfoKHR>::value,\n                          \"VideoDecodeH264ProfileInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoDecodeH264CapabilitiesKHR ) == sizeof( VkVideoDecodeH264CapabilitiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoDecodeH264CapabilitiesKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoDecodeH264CapabilitiesKHR>::value,\n                          \"VideoDecodeH264CapabilitiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoDecodeH264SessionParametersCreateInfoKHR ) ==\n                            sizeof( VkVideoDecodeH264SessionParametersCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoDecodeH264SessionParametersCreateInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoDecodeH264SessionParametersCreateInfoKHR>::value,\n                          \"VideoDecodeH264SessionParametersCreateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoDecodeH264SessionParametersAddInfoKHR ) == sizeof( VkVideoDecodeH264SessionParametersAddInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoDecodeH264SessionParametersAddInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoDecodeH264SessionParametersAddInfoKHR>::value,\n                          \"VideoDecodeH264SessionParametersAddInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoDecodeH264PictureInfoKHR ) == sizeof( VkVideoDecodeH264PictureInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoDecodeH264PictureInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoDecodeH264PictureInfoKHR>::value,\n                          \"VideoDecodeH264PictureInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoDecodeH264DpbSlotInfoKHR ) == sizeof( VkVideoDecodeH264DpbSlotInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoDecodeH264DpbSlotInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoDecodeH264DpbSlotInfoKHR>::value,\n                          \"VideoDecodeH264DpbSlotInfoKHR is not nothrow_move_constructible!\" );\n\n//=== VK_AMD_texture_gather_bias_lod ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::TextureLODGatherFormatPropertiesAMD ) == sizeof( VkTextureLODGatherFormatPropertiesAMD ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::TextureLODGatherFormatPropertiesAMD>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::TextureLODGatherFormatPropertiesAMD>::value,\n                          \"TextureLODGatherFormatPropertiesAMD is not nothrow_move_constructible!\" );\n\n//=== VK_AMD_shader_info ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ShaderResourceUsageAMD ) == sizeof( VkShaderResourceUsageAMD ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ShaderResourceUsageAMD>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ShaderResourceUsageAMD>::value,\n                          \"ShaderResourceUsageAMD is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ShaderStatisticsInfoAMD ) == sizeof( VkShaderStatisticsInfoAMD ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ShaderStatisticsInfoAMD>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ShaderStatisticsInfoAMD>::value,\n                          \"ShaderStatisticsInfoAMD is not nothrow_move_constructible!\" );\n\n#if defined( VK_USE_PLATFORM_GGP )\n//=== VK_GGP_stream_descriptor_surface ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateInfoGGP ) == sizeof( VkStreamDescriptorSurfaceCreateInfoGGP ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateInfoGGP>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateInfoGGP>::value,\n                          \"StreamDescriptorSurfaceCreateInfoGGP is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_GGP*/\n\n//=== VK_NV_corner_sampled_image ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceCornerSampledImageFeaturesNV ) == sizeof( VkPhysicalDeviceCornerSampledImageFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceCornerSampledImageFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceCornerSampledImageFeaturesNV>::value,\n                          \"PhysicalDeviceCornerSampledImageFeaturesNV is not nothrow_move_constructible!\" );\n\n//=== VK_NV_external_memory_capabilities ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExternalImageFormatPropertiesNV ) == sizeof( VkExternalImageFormatPropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExternalImageFormatPropertiesNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExternalImageFormatPropertiesNV>::value,\n                          \"ExternalImageFormatPropertiesNV is not nothrow_move_constructible!\" );\n\n//=== VK_NV_external_memory ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExternalMemoryImageCreateInfoNV ) == sizeof( VkExternalMemoryImageCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExternalMemoryImageCreateInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExternalMemoryImageCreateInfoNV>::value,\n                          \"ExternalMemoryImageCreateInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExportMemoryAllocateInfoNV ) == sizeof( VkExportMemoryAllocateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExportMemoryAllocateInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExportMemoryAllocateInfoNV>::value,\n                          \"ExportMemoryAllocateInfoNV is not nothrow_move_constructible!\" );\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n//=== VK_NV_external_memory_win32 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImportMemoryWin32HandleInfoNV ) == sizeof( VkImportMemoryWin32HandleInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImportMemoryWin32HandleInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImportMemoryWin32HandleInfoNV>::value,\n                          \"ImportMemoryWin32HandleInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExportMemoryWin32HandleInfoNV ) == sizeof( VkExportMemoryWin32HandleInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExportMemoryWin32HandleInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExportMemoryWin32HandleInfoNV>::value,\n                          \"ExportMemoryWin32HandleInfoNV is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n//=== VK_NV_win32_keyed_mutex ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::Win32KeyedMutexAcquireReleaseInfoNV ) == sizeof( VkWin32KeyedMutexAcquireReleaseInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::Win32KeyedMutexAcquireReleaseInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::Win32KeyedMutexAcquireReleaseInfoNV>::value,\n                          \"Win32KeyedMutexAcquireReleaseInfoNV is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n//=== VK_EXT_validation_flags ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ValidationFlagsEXT ) == sizeof( VkValidationFlagsEXT ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ValidationFlagsEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ValidationFlagsEXT>::value,\n                          \"ValidationFlagsEXT is not nothrow_move_constructible!\" );\n\n#if defined( VK_USE_PLATFORM_VI_NN )\n//=== VK_NN_vi_surface ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ViSurfaceCreateInfoNN ) == sizeof( VkViSurfaceCreateInfoNN ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ViSurfaceCreateInfoNN>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ViSurfaceCreateInfoNN>::value,\n                          \"ViSurfaceCreateInfoNN is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_VI_NN*/\n\n//=== VK_EXT_astc_decode_mode ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageViewASTCDecodeModeEXT ) == sizeof( VkImageViewASTCDecodeModeEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageViewASTCDecodeModeEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageViewASTCDecodeModeEXT>::value,\n                          \"ImageViewASTCDecodeModeEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceASTCDecodeFeaturesEXT ) == sizeof( VkPhysicalDeviceASTCDecodeFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceASTCDecodeFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceASTCDecodeFeaturesEXT>::value,\n                          \"PhysicalDeviceASTCDecodeFeaturesEXT is not nothrow_move_constructible!\" );\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n//=== VK_KHR_external_memory_win32 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImportMemoryWin32HandleInfoKHR ) == sizeof( VkImportMemoryWin32HandleInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImportMemoryWin32HandleInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImportMemoryWin32HandleInfoKHR>::value,\n                          \"ImportMemoryWin32HandleInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExportMemoryWin32HandleInfoKHR ) == sizeof( VkExportMemoryWin32HandleInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExportMemoryWin32HandleInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExportMemoryWin32HandleInfoKHR>::value,\n                          \"ExportMemoryWin32HandleInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryWin32HandlePropertiesKHR ) == sizeof( VkMemoryWin32HandlePropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryWin32HandlePropertiesKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryWin32HandlePropertiesKHR>::value,\n                          \"MemoryWin32HandlePropertiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryGetWin32HandleInfoKHR ) == sizeof( VkMemoryGetWin32HandleInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryGetWin32HandleInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryGetWin32HandleInfoKHR>::value,\n                          \"MemoryGetWin32HandleInfoKHR is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n//=== VK_KHR_external_memory_fd ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImportMemoryFdInfoKHR ) == sizeof( VkImportMemoryFdInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImportMemoryFdInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImportMemoryFdInfoKHR>::value,\n                          \"ImportMemoryFdInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryFdPropertiesKHR ) == sizeof( VkMemoryFdPropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryFdPropertiesKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryFdPropertiesKHR>::value,\n                          \"MemoryFdPropertiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryGetFdInfoKHR ) == sizeof( VkMemoryGetFdInfoKHR ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryGetFdInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryGetFdInfoKHR>::value,\n                          \"MemoryGetFdInfoKHR is not nothrow_move_constructible!\" );\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n//=== VK_KHR_win32_keyed_mutex ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::Win32KeyedMutexAcquireReleaseInfoKHR ) == sizeof( VkWin32KeyedMutexAcquireReleaseInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::Win32KeyedMutexAcquireReleaseInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::Win32KeyedMutexAcquireReleaseInfoKHR>::value,\n                          \"Win32KeyedMutexAcquireReleaseInfoKHR is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n//=== VK_KHR_external_semaphore_win32 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImportSemaphoreWin32HandleInfoKHR ) == sizeof( VkImportSemaphoreWin32HandleInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImportSemaphoreWin32HandleInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImportSemaphoreWin32HandleInfoKHR>::value,\n                          \"ImportSemaphoreWin32HandleInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExportSemaphoreWin32HandleInfoKHR ) == sizeof( VkExportSemaphoreWin32HandleInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExportSemaphoreWin32HandleInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExportSemaphoreWin32HandleInfoKHR>::value,\n                          \"ExportSemaphoreWin32HandleInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::D3D12FenceSubmitInfoKHR ) == sizeof( VkD3D12FenceSubmitInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::D3D12FenceSubmitInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::D3D12FenceSubmitInfoKHR>::value,\n                          \"D3D12FenceSubmitInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SemaphoreGetWin32HandleInfoKHR ) == sizeof( VkSemaphoreGetWin32HandleInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SemaphoreGetWin32HandleInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SemaphoreGetWin32HandleInfoKHR>::value,\n                          \"SemaphoreGetWin32HandleInfoKHR is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n//=== VK_KHR_external_semaphore_fd ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImportSemaphoreFdInfoKHR ) == sizeof( VkImportSemaphoreFdInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImportSemaphoreFdInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImportSemaphoreFdInfoKHR>::value,\n                          \"ImportSemaphoreFdInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SemaphoreGetFdInfoKHR ) == sizeof( VkSemaphoreGetFdInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SemaphoreGetFdInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SemaphoreGetFdInfoKHR>::value,\n                          \"SemaphoreGetFdInfoKHR is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_conditional_rendering ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ConditionalRenderingBeginInfoEXT ) == sizeof( VkConditionalRenderingBeginInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ConditionalRenderingBeginInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ConditionalRenderingBeginInfoEXT>::value,\n                          \"ConditionalRenderingBeginInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceConditionalRenderingFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceConditionalRenderingFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceConditionalRenderingFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceConditionalRenderingFeaturesEXT>::value,\n                          \"PhysicalDeviceConditionalRenderingFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CommandBufferInheritanceConditionalRenderingInfoEXT ) ==\n                            sizeof( VkCommandBufferInheritanceConditionalRenderingInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceConditionalRenderingInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceConditionalRenderingInfoEXT>::value,\n                          \"CommandBufferInheritanceConditionalRenderingInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_incremental_present ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PresentRegionsKHR ) == sizeof( VkPresentRegionsKHR ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PresentRegionsKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PresentRegionsKHR>::value,\n                          \"PresentRegionsKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PresentRegionKHR ) == sizeof( VkPresentRegionKHR ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PresentRegionKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PresentRegionKHR>::value,\n                          \"PresentRegionKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RectLayerKHR ) == sizeof( VkRectLayerKHR ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RectLayerKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RectLayerKHR>::value, \"RectLayerKHR is not nothrow_move_constructible!\" );\n\n//=== VK_NV_clip_space_w_scaling ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ViewportWScalingNV ) == sizeof( VkViewportWScalingNV ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ViewportWScalingNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ViewportWScalingNV>::value,\n                          \"ViewportWScalingNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineViewportWScalingStateCreateInfoNV ) == sizeof( VkPipelineViewportWScalingStateCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineViewportWScalingStateCreateInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineViewportWScalingStateCreateInfoNV>::value,\n                          \"PipelineViewportWScalingStateCreateInfoNV is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_display_surface_counter ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SurfaceCapabilities2EXT ) == sizeof( VkSurfaceCapabilities2EXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SurfaceCapabilities2EXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SurfaceCapabilities2EXT>::value,\n                          \"SurfaceCapabilities2EXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_display_control ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DisplayPowerInfoEXT ) == sizeof( VkDisplayPowerInfoEXT ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DisplayPowerInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DisplayPowerInfoEXT>::value,\n                          \"DisplayPowerInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceEventInfoEXT ) == sizeof( VkDeviceEventInfoEXT ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceEventInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceEventInfoEXT>::value,\n                          \"DeviceEventInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DisplayEventInfoEXT ) == sizeof( VkDisplayEventInfoEXT ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DisplayEventInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DisplayEventInfoEXT>::value,\n                          \"DisplayEventInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SwapchainCounterCreateInfoEXT ) == sizeof( VkSwapchainCounterCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SwapchainCounterCreateInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SwapchainCounterCreateInfoEXT>::value,\n                          \"SwapchainCounterCreateInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_GOOGLE_display_timing ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RefreshCycleDurationGOOGLE ) == sizeof( VkRefreshCycleDurationGOOGLE ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RefreshCycleDurationGOOGLE>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RefreshCycleDurationGOOGLE>::value,\n                          \"RefreshCycleDurationGOOGLE is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE ) == sizeof( VkPastPresentationTimingGOOGLE ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE>::value,\n                          \"PastPresentationTimingGOOGLE is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PresentTimesInfoGOOGLE ) == sizeof( VkPresentTimesInfoGOOGLE ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PresentTimesInfoGOOGLE>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PresentTimesInfoGOOGLE>::value,\n                          \"PresentTimesInfoGOOGLE is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PresentTimeGOOGLE ) == sizeof( VkPresentTimeGOOGLE ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PresentTimeGOOGLE>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PresentTimeGOOGLE>::value,\n                          \"PresentTimeGOOGLE is not nothrow_move_constructible!\" );\n\n//=== VK_NVX_multiview_per_view_attributes ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX ) ==\n                            sizeof( VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX>::value,\n                          \"PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MultiviewPerViewAttributesInfoNVX ) == sizeof( VkMultiviewPerViewAttributesInfoNVX ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MultiviewPerViewAttributesInfoNVX>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MultiviewPerViewAttributesInfoNVX>::value,\n                          \"MultiviewPerViewAttributesInfoNVX is not nothrow_move_constructible!\" );\n\n//=== VK_NV_viewport_swizzle ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ViewportSwizzleNV ) == sizeof( VkViewportSwizzleNV ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ViewportSwizzleNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ViewportSwizzleNV>::value,\n                          \"ViewportSwizzleNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineViewportSwizzleStateCreateInfoNV ) == sizeof( VkPipelineViewportSwizzleStateCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineViewportSwizzleStateCreateInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineViewportSwizzleStateCreateInfoNV>::value,\n                          \"PipelineViewportSwizzleStateCreateInfoNV is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_discard_rectangles ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDiscardRectanglePropertiesEXT ) ==\n                            sizeof( VkPhysicalDeviceDiscardRectanglePropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDiscardRectanglePropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDiscardRectanglePropertiesEXT>::value,\n                          \"PhysicalDeviceDiscardRectanglePropertiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineDiscardRectangleStateCreateInfoEXT ) == sizeof( VkPipelineDiscardRectangleStateCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineDiscardRectangleStateCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineDiscardRectangleStateCreateInfoEXT>::value,\n                          \"PipelineDiscardRectangleStateCreateInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_conservative_rasterization ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceConservativeRasterizationPropertiesEXT ) ==\n                            sizeof( VkPhysicalDeviceConservativeRasterizationPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceConservativeRasterizationPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceConservativeRasterizationPropertiesEXT>::value,\n                          \"PhysicalDeviceConservativeRasterizationPropertiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineRasterizationConservativeStateCreateInfoEXT ) ==\n                            sizeof( VkPipelineRasterizationConservativeStateCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineRasterizationConservativeStateCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineRasterizationConservativeStateCreateInfoEXT>::value,\n                          \"PipelineRasterizationConservativeStateCreateInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_depth_clip_enable ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClipEnableFeaturesEXT ) == sizeof( VkPhysicalDeviceDepthClipEnableFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClipEnableFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClipEnableFeaturesEXT>::value,\n                          \"PhysicalDeviceDepthClipEnableFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineRasterizationDepthClipStateCreateInfoEXT ) ==\n                            sizeof( VkPipelineRasterizationDepthClipStateCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineRasterizationDepthClipStateCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineRasterizationDepthClipStateCreateInfoEXT>::value,\n                          \"PipelineRasterizationDepthClipStateCreateInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_hdr_metadata ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::HdrMetadataEXT ) == sizeof( VkHdrMetadataEXT ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::HdrMetadataEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::HdrMetadataEXT>::value,\n                          \"HdrMetadataEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::XYColorEXT ) == sizeof( VkXYColorEXT ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::XYColorEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::XYColorEXT>::value, \"XYColorEXT is not nothrow_move_constructible!\" );\n\n//=== VK_IMG_relaxed_line_rasterization ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceRelaxedLineRasterizationFeaturesIMG ) ==\n                            sizeof( VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceRelaxedLineRasterizationFeaturesIMG>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceRelaxedLineRasterizationFeaturesIMG>::value,\n                          \"PhysicalDeviceRelaxedLineRasterizationFeaturesIMG is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_shared_presentable_image ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SharedPresentSurfaceCapabilitiesKHR ) == sizeof( VkSharedPresentSurfaceCapabilitiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SharedPresentSurfaceCapabilitiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SharedPresentSurfaceCapabilitiesKHR>::value,\n                          \"SharedPresentSurfaceCapabilitiesKHR is not nothrow_move_constructible!\" );\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n//=== VK_KHR_external_fence_win32 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImportFenceWin32HandleInfoKHR ) == sizeof( VkImportFenceWin32HandleInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImportFenceWin32HandleInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImportFenceWin32HandleInfoKHR>::value,\n                          \"ImportFenceWin32HandleInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExportFenceWin32HandleInfoKHR ) == sizeof( VkExportFenceWin32HandleInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExportFenceWin32HandleInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExportFenceWin32HandleInfoKHR>::value,\n                          \"ExportFenceWin32HandleInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::FenceGetWin32HandleInfoKHR ) == sizeof( VkFenceGetWin32HandleInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::FenceGetWin32HandleInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::FenceGetWin32HandleInfoKHR>::value,\n                          \"FenceGetWin32HandleInfoKHR is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n//=== VK_KHR_external_fence_fd ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImportFenceFdInfoKHR ) == sizeof( VkImportFenceFdInfoKHR ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImportFenceFdInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImportFenceFdInfoKHR>::value,\n                          \"ImportFenceFdInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::FenceGetFdInfoKHR ) == sizeof( VkFenceGetFdInfoKHR ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::FenceGetFdInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::FenceGetFdInfoKHR>::value,\n                          \"FenceGetFdInfoKHR is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_performance_query ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePerformanceQueryFeaturesKHR ) == sizeof( VkPhysicalDevicePerformanceQueryFeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePerformanceQueryFeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePerformanceQueryFeaturesKHR>::value,\n                          \"PhysicalDevicePerformanceQueryFeaturesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePerformanceQueryPropertiesKHR ) ==\n                            sizeof( VkPhysicalDevicePerformanceQueryPropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePerformanceQueryPropertiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePerformanceQueryPropertiesKHR>::value,\n                          \"PhysicalDevicePerformanceQueryPropertiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PerformanceCounterKHR ) == sizeof( VkPerformanceCounterKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PerformanceCounterKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PerformanceCounterKHR>::value,\n                          \"PerformanceCounterKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR ) == sizeof( VkPerformanceCounterDescriptionKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR>::value,\n                          \"PerformanceCounterDescriptionKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::QueryPoolPerformanceCreateInfoKHR ) == sizeof( VkQueryPoolPerformanceCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::QueryPoolPerformanceCreateInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::QueryPoolPerformanceCreateInfoKHR>::value,\n                          \"QueryPoolPerformanceCreateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PerformanceCounterResultKHR ) == sizeof( VkPerformanceCounterResultKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PerformanceCounterResultKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PerformanceCounterResultKHR>::value,\n                          \"PerformanceCounterResultKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AcquireProfilingLockInfoKHR ) == sizeof( VkAcquireProfilingLockInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AcquireProfilingLockInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AcquireProfilingLockInfoKHR>::value,\n                          \"AcquireProfilingLockInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PerformanceQuerySubmitInfoKHR ) == sizeof( VkPerformanceQuerySubmitInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PerformanceQuerySubmitInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PerformanceQuerySubmitInfoKHR>::value,\n                          \"PerformanceQuerySubmitInfoKHR is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_get_surface_capabilities2 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR ) == sizeof( VkPhysicalDeviceSurfaceInfo2KHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR>::value,\n                          \"PhysicalDeviceSurfaceInfo2KHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR ) == sizeof( VkSurfaceCapabilities2KHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR>::value,\n                          \"SurfaceCapabilities2KHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR ) == sizeof( VkSurfaceFormat2KHR ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR>::value,\n                          \"SurfaceFormat2KHR is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_get_display_properties2 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DisplayProperties2KHR ) == sizeof( VkDisplayProperties2KHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DisplayProperties2KHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DisplayProperties2KHR>::value,\n                          \"DisplayProperties2KHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR ) == sizeof( VkDisplayPlaneProperties2KHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR>::value,\n                          \"DisplayPlaneProperties2KHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR ) == sizeof( VkDisplayModeProperties2KHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR>::value,\n                          \"DisplayModeProperties2KHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DisplayPlaneInfo2KHR ) == sizeof( VkDisplayPlaneInfo2KHR ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DisplayPlaneInfo2KHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DisplayPlaneInfo2KHR>::value,\n                          \"DisplayPlaneInfo2KHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilities2KHR ) == sizeof( VkDisplayPlaneCapabilities2KHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilities2KHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilities2KHR>::value,\n                          \"DisplayPlaneCapabilities2KHR is not nothrow_move_constructible!\" );\n\n#if defined( VK_USE_PLATFORM_IOS_MVK )\n//=== VK_MVK_ios_surface ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::IOSSurfaceCreateInfoMVK ) == sizeof( VkIOSSurfaceCreateInfoMVK ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::IOSSurfaceCreateInfoMVK>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::IOSSurfaceCreateInfoMVK>::value,\n                          \"IOSSurfaceCreateInfoMVK is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_IOS_MVK*/\n\n#if defined( VK_USE_PLATFORM_MACOS_MVK )\n//=== VK_MVK_macos_surface ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateInfoMVK ) == sizeof( VkMacOSSurfaceCreateInfoMVK ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateInfoMVK>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateInfoMVK>::value,\n                          \"MacOSSurfaceCreateInfoMVK is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_MACOS_MVK*/\n\n//=== VK_EXT_debug_utils ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT ) == sizeof( VkDebugUtilsLabelEXT ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT>::value,\n                          \"DebugUtilsLabelEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCallbackDataEXT ) == sizeof( VkDebugUtilsMessengerCallbackDataEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCallbackDataEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCallbackDataEXT>::value,\n                          \"DebugUtilsMessengerCallbackDataEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateInfoEXT ) == sizeof( VkDebugUtilsMessengerCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateInfoEXT>::value,\n                          \"DebugUtilsMessengerCreateInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT ) == sizeof( VkDebugUtilsMessengerEXT ),\n                          \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT>::value,\n                          \"DebugUtilsMessengerEXT is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT>::value,\n                          \"DebugUtilsMessengerEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT ) == sizeof( VkDebugUtilsObjectNameInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT>::value,\n                          \"DebugUtilsObjectNameInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DebugUtilsObjectTagInfoEXT ) == sizeof( VkDebugUtilsObjectTagInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DebugUtilsObjectTagInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DebugUtilsObjectTagInfoEXT>::value,\n                          \"DebugUtilsObjectTagInfoEXT is not nothrow_move_constructible!\" );\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n//=== VK_ANDROID_external_memory_android_hardware_buffer ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AndroidHardwareBufferUsageANDROID ) == sizeof( VkAndroidHardwareBufferUsageANDROID ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferUsageANDROID>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferUsageANDROID>::value,\n                          \"AndroidHardwareBufferUsageANDROID is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID ) == sizeof( VkAndroidHardwareBufferPropertiesANDROID ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID>::value,\n                          \"AndroidHardwareBufferPropertiesANDROID is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AndroidHardwareBufferFormatPropertiesANDROID ) ==\n                            sizeof( VkAndroidHardwareBufferFormatPropertiesANDROID ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferFormatPropertiesANDROID>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferFormatPropertiesANDROID>::value,\n                          \"AndroidHardwareBufferFormatPropertiesANDROID is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImportAndroidHardwareBufferInfoANDROID ) == sizeof( VkImportAndroidHardwareBufferInfoANDROID ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImportAndroidHardwareBufferInfoANDROID>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImportAndroidHardwareBufferInfoANDROID>::value,\n                          \"ImportAndroidHardwareBufferInfoANDROID is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryGetAndroidHardwareBufferInfoANDROID ) == sizeof( VkMemoryGetAndroidHardwareBufferInfoANDROID ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryGetAndroidHardwareBufferInfoANDROID>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryGetAndroidHardwareBufferInfoANDROID>::value,\n                          \"MemoryGetAndroidHardwareBufferInfoANDROID is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExternalFormatANDROID ) == sizeof( VkExternalFormatANDROID ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExternalFormatANDROID>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExternalFormatANDROID>::value,\n                          \"ExternalFormatANDROID is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AndroidHardwareBufferFormatProperties2ANDROID ) ==\n                            sizeof( VkAndroidHardwareBufferFormatProperties2ANDROID ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferFormatProperties2ANDROID>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferFormatProperties2ANDROID>::value,\n                          \"AndroidHardwareBufferFormatProperties2ANDROID is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n//=== VK_AMDX_shader_enqueue ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderEnqueueFeaturesAMDX ) == sizeof( VkPhysicalDeviceShaderEnqueueFeaturesAMDX ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderEnqueueFeaturesAMDX>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderEnqueueFeaturesAMDX>::value,\n                          \"PhysicalDeviceShaderEnqueueFeaturesAMDX is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderEnqueuePropertiesAMDX ) == sizeof( VkPhysicalDeviceShaderEnqueuePropertiesAMDX ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderEnqueuePropertiesAMDX>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderEnqueuePropertiesAMDX>::value,\n                          \"PhysicalDeviceShaderEnqueuePropertiesAMDX is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineScratchSizeAMDX ) == sizeof( VkExecutionGraphPipelineScratchSizeAMDX ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineScratchSizeAMDX>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineScratchSizeAMDX>::value,\n                          \"ExecutionGraphPipelineScratchSizeAMDX is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX ) == sizeof( VkExecutionGraphPipelineCreateInfoAMDX ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX>::value,\n                          \"ExecutionGraphPipelineCreateInfoAMDX is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DispatchGraphInfoAMDX ) == sizeof( VkDispatchGraphInfoAMDX ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DispatchGraphInfoAMDX>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DispatchGraphInfoAMDX>::value,\n                          \"DispatchGraphInfoAMDX is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DispatchGraphCountInfoAMDX ) == sizeof( VkDispatchGraphCountInfoAMDX ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DispatchGraphCountInfoAMDX>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DispatchGraphCountInfoAMDX>::value,\n                          \"DispatchGraphCountInfoAMDX is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineShaderStageNodeCreateInfoAMDX ) == sizeof( VkPipelineShaderStageNodeCreateInfoAMDX ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineShaderStageNodeCreateInfoAMDX>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineShaderStageNodeCreateInfoAMDX>::value,\n                          \"PipelineShaderStageNodeCreateInfoAMDX is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstAMDX ) == sizeof( VkDeviceOrHostAddressConstAMDX ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstAMDX>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstAMDX>::value,\n                          \"DeviceOrHostAddressConstAMDX is not nothrow_move_constructible!\" );\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n//=== VK_AMD_mixed_attachment_samples ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AttachmentSampleCountInfoAMD ) == sizeof( VkAttachmentSampleCountInfoAMD ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AttachmentSampleCountInfoAMD>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AttachmentSampleCountInfoAMD>::value,\n                          \"AttachmentSampleCountInfoAMD is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_sample_locations ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SampleLocationEXT ) == sizeof( VkSampleLocationEXT ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SampleLocationEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SampleLocationEXT>::value,\n                          \"SampleLocationEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT ) == sizeof( VkSampleLocationsInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT>::value,\n                          \"SampleLocationsInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AttachmentSampleLocationsEXT ) == sizeof( VkAttachmentSampleLocationsEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AttachmentSampleLocationsEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AttachmentSampleLocationsEXT>::value,\n                          \"AttachmentSampleLocationsEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SubpassSampleLocationsEXT ) == sizeof( VkSubpassSampleLocationsEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SubpassSampleLocationsEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SubpassSampleLocationsEXT>::value,\n                          \"SubpassSampleLocationsEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderPassSampleLocationsBeginInfoEXT ) == sizeof( VkRenderPassSampleLocationsBeginInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderPassSampleLocationsBeginInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderPassSampleLocationsBeginInfoEXT>::value,\n                          \"RenderPassSampleLocationsBeginInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineSampleLocationsStateCreateInfoEXT ) == sizeof( VkPipelineSampleLocationsStateCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineSampleLocationsStateCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineSampleLocationsStateCreateInfoEXT>::value,\n                          \"PipelineSampleLocationsStateCreateInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceSampleLocationsPropertiesEXT ) == sizeof( VkPhysicalDeviceSampleLocationsPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceSampleLocationsPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceSampleLocationsPropertiesEXT>::value,\n                          \"PhysicalDeviceSampleLocationsPropertiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MultisamplePropertiesEXT ) == sizeof( VkMultisamplePropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MultisamplePropertiesEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MultisamplePropertiesEXT>::value,\n                          \"MultisamplePropertiesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_blend_operation_advanced ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceBlendOperationAdvancedFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceBlendOperationAdvancedFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceBlendOperationAdvancedFeaturesEXT>::value,\n                          \"PhysicalDeviceBlendOperationAdvancedFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceBlendOperationAdvancedPropertiesEXT ) ==\n                            sizeof( VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceBlendOperationAdvancedPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceBlendOperationAdvancedPropertiesEXT>::value,\n                          \"PhysicalDeviceBlendOperationAdvancedPropertiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineColorBlendAdvancedStateCreateInfoEXT ) ==\n                            sizeof( VkPipelineColorBlendAdvancedStateCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineColorBlendAdvancedStateCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineColorBlendAdvancedStateCreateInfoEXT>::value,\n                          \"PipelineColorBlendAdvancedStateCreateInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_NV_fragment_coverage_to_color ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineCoverageToColorStateCreateInfoNV ) == sizeof( VkPipelineCoverageToColorStateCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineCoverageToColorStateCreateInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineCoverageToColorStateCreateInfoNV>::value,\n                          \"PipelineCoverageToColorStateCreateInfoNV is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_acceleration_structure ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR ) == sizeof( VkDeviceOrHostAddressKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR>::value,\n                          \"DeviceOrHostAddressKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR ) == sizeof( VkDeviceOrHostAddressConstKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR>::value,\n                          \"DeviceOrHostAddressConstKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR ) == sizeof( VkAccelerationStructureBuildRangeInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR>::value,\n                          \"AccelerationStructureBuildRangeInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AabbPositionsKHR ) == sizeof( VkAabbPositionsKHR ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AabbPositionsKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AabbPositionsKHR>::value,\n                          \"AabbPositionsKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryTrianglesDataKHR ) ==\n                            sizeof( VkAccelerationStructureGeometryTrianglesDataKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryTrianglesDataKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryTrianglesDataKHR>::value,\n                          \"AccelerationStructureGeometryTrianglesDataKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::TransformMatrixKHR ) == sizeof( VkTransformMatrixKHR ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::TransformMatrixKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::TransformMatrixKHR>::value,\n                          \"TransformMatrixKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR ) == sizeof( VkAccelerationStructureBuildGeometryInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR>::value,\n                          \"AccelerationStructureBuildGeometryInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryAabbsDataKHR ) == sizeof( VkAccelerationStructureGeometryAabbsDataKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryAabbsDataKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryAabbsDataKHR>::value,\n                          \"AccelerationStructureGeometryAabbsDataKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureInstanceKHR ) == sizeof( VkAccelerationStructureInstanceKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureInstanceKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureInstanceKHR>::value,\n                          \"AccelerationStructureInstanceKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryInstancesDataKHR ) ==\n                            sizeof( VkAccelerationStructureGeometryInstancesDataKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryInstancesDataKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryInstancesDataKHR>::value,\n                          \"AccelerationStructureGeometryInstancesDataKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryDataKHR ) == sizeof( VkAccelerationStructureGeometryDataKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryDataKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryDataKHR>::value,\n                          \"AccelerationStructureGeometryDataKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryKHR ) == sizeof( VkAccelerationStructureGeometryKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryKHR>::value,\n                          \"AccelerationStructureGeometryKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoKHR ) == sizeof( VkAccelerationStructureCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoKHR>::value,\n                          \"AccelerationStructureCreateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureKHR ) == sizeof( VkAccelerationStructureKHR ),\n                          \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureKHR>::value,\n                          \"AccelerationStructureKHR is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureKHR>::value,\n                          \"AccelerationStructureKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::WriteDescriptorSetAccelerationStructureKHR ) == sizeof( VkWriteDescriptorSetAccelerationStructureKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::WriteDescriptorSetAccelerationStructureKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::WriteDescriptorSetAccelerationStructureKHR>::value,\n                          \"WriteDescriptorSetAccelerationStructureKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceAccelerationStructureFeaturesKHR ) ==\n                            sizeof( VkPhysicalDeviceAccelerationStructureFeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceAccelerationStructureFeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceAccelerationStructureFeaturesKHR>::value,\n                          \"PhysicalDeviceAccelerationStructureFeaturesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceAccelerationStructurePropertiesKHR ) ==\n                            sizeof( VkPhysicalDeviceAccelerationStructurePropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceAccelerationStructurePropertiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceAccelerationStructurePropertiesKHR>::value,\n                          \"PhysicalDeviceAccelerationStructurePropertiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureDeviceAddressInfoKHR ) == sizeof( VkAccelerationStructureDeviceAddressInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureDeviceAddressInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureDeviceAddressInfoKHR>::value,\n                          \"AccelerationStructureDeviceAddressInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureVersionInfoKHR ) == sizeof( VkAccelerationStructureVersionInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureVersionInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureVersionInfoKHR>::value,\n                          \"AccelerationStructureVersionInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CopyAccelerationStructureToMemoryInfoKHR ) == sizeof( VkCopyAccelerationStructureToMemoryInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CopyAccelerationStructureToMemoryInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CopyAccelerationStructureToMemoryInfoKHR>::value,\n                          \"CopyAccelerationStructureToMemoryInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CopyMemoryToAccelerationStructureInfoKHR ) == sizeof( VkCopyMemoryToAccelerationStructureInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CopyMemoryToAccelerationStructureInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CopyMemoryToAccelerationStructureInfoKHR>::value,\n                          \"CopyMemoryToAccelerationStructureInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR ) == sizeof( VkCopyAccelerationStructureInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR>::value,\n                          \"CopyAccelerationStructureInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR ) == sizeof( VkAccelerationStructureBuildSizesInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR>::value,\n                          \"AccelerationStructureBuildSizesInfoKHR is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_ray_tracing_pipeline ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoKHR ) == sizeof( VkRayTracingShaderGroupCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoKHR>::value,\n                          \"RayTracingShaderGroupCreateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR ) == sizeof( VkRayTracingPipelineCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR>::value,\n                          \"RayTracingPipelineCreateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPipelineFeaturesKHR ) ==\n                            sizeof( VkPhysicalDeviceRayTracingPipelineFeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPipelineFeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPipelineFeaturesKHR>::value,\n                          \"PhysicalDeviceRayTracingPipelineFeaturesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPipelinePropertiesKHR ) ==\n                            sizeof( VkPhysicalDeviceRayTracingPipelinePropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPipelinePropertiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPipelinePropertiesKHR>::value,\n                          \"PhysicalDeviceRayTracingPipelinePropertiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR ) == sizeof( VkStridedDeviceAddressRegionKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR>::value,\n                          \"StridedDeviceAddressRegionKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::TraceRaysIndirectCommandKHR ) == sizeof( VkTraceRaysIndirectCommandKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::TraceRaysIndirectCommandKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::TraceRaysIndirectCommandKHR>::value,\n                          \"TraceRaysIndirectCommandKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RayTracingPipelineInterfaceCreateInfoKHR ) == sizeof( VkRayTracingPipelineInterfaceCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RayTracingPipelineInterfaceCreateInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RayTracingPipelineInterfaceCreateInfoKHR>::value,\n                          \"RayTracingPipelineInterfaceCreateInfoKHR is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_ray_query ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceRayQueryFeaturesKHR ) == sizeof( VkPhysicalDeviceRayQueryFeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayQueryFeaturesKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayQueryFeaturesKHR>::value,\n                          \"PhysicalDeviceRayQueryFeaturesKHR is not nothrow_move_constructible!\" );\n\n//=== VK_NV_framebuffer_mixed_samples ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineCoverageModulationStateCreateInfoNV ) ==\n                            sizeof( VkPipelineCoverageModulationStateCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineCoverageModulationStateCreateInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineCoverageModulationStateCreateInfoNV>::value,\n                          \"PipelineCoverageModulationStateCreateInfoNV is not nothrow_move_constructible!\" );\n\n//=== VK_NV_shader_sm_builtins ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSMBuiltinsPropertiesNV ) == sizeof( VkPhysicalDeviceShaderSMBuiltinsPropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSMBuiltinsPropertiesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSMBuiltinsPropertiesNV>::value,\n                          \"PhysicalDeviceShaderSMBuiltinsPropertiesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSMBuiltinsFeaturesNV ) == sizeof( VkPhysicalDeviceShaderSMBuiltinsFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSMBuiltinsFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSMBuiltinsFeaturesNV>::value,\n                          \"PhysicalDeviceShaderSMBuiltinsFeaturesNV is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_image_drm_format_modifier ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesListEXT ) == sizeof( VkDrmFormatModifierPropertiesListEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesListEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesListEXT>::value,\n                          \"DrmFormatModifierPropertiesListEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesEXT ) == sizeof( VkDrmFormatModifierPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesEXT>::value,\n                          \"DrmFormatModifierPropertiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageDrmFormatModifierInfoEXT ) ==\n                            sizeof( VkPhysicalDeviceImageDrmFormatModifierInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageDrmFormatModifierInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageDrmFormatModifierInfoEXT>::value,\n                          \"PhysicalDeviceImageDrmFormatModifierInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierListCreateInfoEXT ) == sizeof( VkImageDrmFormatModifierListCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierListCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierListCreateInfoEXT>::value,\n                          \"ImageDrmFormatModifierListCreateInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierExplicitCreateInfoEXT ) ==\n                            sizeof( VkImageDrmFormatModifierExplicitCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierExplicitCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierExplicitCreateInfoEXT>::value,\n                          \"ImageDrmFormatModifierExplicitCreateInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierPropertiesEXT ) == sizeof( VkImageDrmFormatModifierPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierPropertiesEXT>::value,\n                          \"ImageDrmFormatModifierPropertiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesList2EXT ) == sizeof( VkDrmFormatModifierPropertiesList2EXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesList2EXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesList2EXT>::value,\n                          \"DrmFormatModifierPropertiesList2EXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DrmFormatModifierProperties2EXT ) == sizeof( VkDrmFormatModifierProperties2EXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DrmFormatModifierProperties2EXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DrmFormatModifierProperties2EXT>::value,\n                          \"DrmFormatModifierProperties2EXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_validation_cache ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ValidationCacheEXT ) == sizeof( VkValidationCacheEXT ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::ValidationCacheEXT>::value, \"ValidationCacheEXT is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ValidationCacheEXT>::value,\n                          \"ValidationCacheEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ValidationCacheCreateInfoEXT ) == sizeof( VkValidationCacheCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ValidationCacheCreateInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ValidationCacheCreateInfoEXT>::value,\n                          \"ValidationCacheCreateInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ShaderModuleValidationCacheCreateInfoEXT ) == sizeof( VkShaderModuleValidationCacheCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ShaderModuleValidationCacheCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ShaderModuleValidationCacheCreateInfoEXT>::value,\n                          \"ShaderModuleValidationCacheCreateInfoEXT is not nothrow_move_constructible!\" );\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n//=== VK_KHR_portability_subset ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePortabilitySubsetFeaturesKHR ) == sizeof( VkPhysicalDevicePortabilitySubsetFeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePortabilitySubsetFeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePortabilitySubsetFeaturesKHR>::value,\n                          \"PhysicalDevicePortabilitySubsetFeaturesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePortabilitySubsetPropertiesKHR ) ==\n                            sizeof( VkPhysicalDevicePortabilitySubsetPropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePortabilitySubsetPropertiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePortabilitySubsetPropertiesKHR>::value,\n                          \"PhysicalDevicePortabilitySubsetPropertiesKHR is not nothrow_move_constructible!\" );\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n//=== VK_NV_shading_rate_image ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV ) == sizeof( VkShadingRatePaletteNV ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV>::value,\n                          \"ShadingRatePaletteNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineViewportShadingRateImageStateCreateInfoNV ) ==\n                            sizeof( VkPipelineViewportShadingRateImageStateCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineViewportShadingRateImageStateCreateInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineViewportShadingRateImageStateCreateInfoNV>::value,\n                          \"PipelineViewportShadingRateImageStateCreateInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShadingRateImageFeaturesNV ) == sizeof( VkPhysicalDeviceShadingRateImageFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShadingRateImageFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShadingRateImageFeaturesNV>::value,\n                          \"PhysicalDeviceShadingRateImageFeaturesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShadingRateImagePropertiesNV ) == sizeof( VkPhysicalDeviceShadingRateImagePropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShadingRateImagePropertiesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShadingRateImagePropertiesNV>::value,\n                          \"PhysicalDeviceShadingRateImagePropertiesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CoarseSampleLocationNV ) == sizeof( VkCoarseSampleLocationNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CoarseSampleLocationNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CoarseSampleLocationNV>::value,\n                          \"CoarseSampleLocationNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV ) == sizeof( VkCoarseSampleOrderCustomNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV>::value,\n                          \"CoarseSampleOrderCustomNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineViewportCoarseSampleOrderStateCreateInfoNV ) ==\n                            sizeof( VkPipelineViewportCoarseSampleOrderStateCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineViewportCoarseSampleOrderStateCreateInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineViewportCoarseSampleOrderStateCreateInfoNV>::value,\n                          \"PipelineViewportCoarseSampleOrderStateCreateInfoNV is not nothrow_move_constructible!\" );\n\n//=== VK_NV_ray_tracing ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoNV ) == sizeof( VkRayTracingShaderGroupCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoNV>::value,\n                          \"RayTracingShaderGroupCreateInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV ) == sizeof( VkRayTracingPipelineCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV>::value,\n                          \"RayTracingPipelineCreateInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::GeometryTrianglesNV ) == sizeof( VkGeometryTrianglesNV ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::GeometryTrianglesNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::GeometryTrianglesNV>::value,\n                          \"GeometryTrianglesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::GeometryAABBNV ) == sizeof( VkGeometryAABBNV ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::GeometryAABBNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::GeometryAABBNV>::value,\n                          \"GeometryAABBNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::GeometryDataNV ) == sizeof( VkGeometryDataNV ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::GeometryDataNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::GeometryDataNV>::value,\n                          \"GeometryDataNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::GeometryNV ) == sizeof( VkGeometryNV ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::GeometryNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::GeometryNV>::value, \"GeometryNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureInfoNV ) == sizeof( VkAccelerationStructureInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureInfoNV>::value,\n                          \"AccelerationStructureInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoNV ) == sizeof( VkAccelerationStructureCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoNV>::value,\n                          \"AccelerationStructureCreateInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureNV ) == sizeof( VkAccelerationStructureNV ),\n                          \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureNV>::value,\n                          \"AccelerationStructureNV is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureNV>::value,\n                          \"AccelerationStructureNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BindAccelerationStructureMemoryInfoNV ) == sizeof( VkBindAccelerationStructureMemoryInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BindAccelerationStructureMemoryInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BindAccelerationStructureMemoryInfoNV>::value,\n                          \"BindAccelerationStructureMemoryInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::WriteDescriptorSetAccelerationStructureNV ) == sizeof( VkWriteDescriptorSetAccelerationStructureNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::WriteDescriptorSetAccelerationStructureNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::WriteDescriptorSetAccelerationStructureNV>::value,\n                          \"WriteDescriptorSetAccelerationStructureNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsInfoNV ) ==\n                            sizeof( VkAccelerationStructureMemoryRequirementsInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsInfoNV>::value,\n                          \"AccelerationStructureMemoryRequirementsInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPropertiesNV ) == sizeof( VkPhysicalDeviceRayTracingPropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPropertiesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPropertiesNV>::value,\n                          \"PhysicalDeviceRayTracingPropertiesNV is not nothrow_move_constructible!\" );\n\n//=== VK_NV_representative_fragment_test ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceRepresentativeFragmentTestFeaturesNV ) ==\n                            sizeof( VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceRepresentativeFragmentTestFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceRepresentativeFragmentTestFeaturesNV>::value,\n                          \"PhysicalDeviceRepresentativeFragmentTestFeaturesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineRepresentativeFragmentTestStateCreateInfoNV ) ==\n                            sizeof( VkPipelineRepresentativeFragmentTestStateCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineRepresentativeFragmentTestStateCreateInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineRepresentativeFragmentTestStateCreateInfoNV>::value,\n                          \"PipelineRepresentativeFragmentTestStateCreateInfoNV is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_filter_cubic ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageViewImageFormatInfoEXT ) == sizeof( VkPhysicalDeviceImageViewImageFormatInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageViewImageFormatInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageViewImageFormatInfoEXT>::value,\n                          \"PhysicalDeviceImageViewImageFormatInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::FilterCubicImageViewImageFormatPropertiesEXT ) ==\n                            sizeof( VkFilterCubicImageViewImageFormatPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::FilterCubicImageViewImageFormatPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::FilterCubicImageViewImageFormatPropertiesEXT>::value,\n                          \"FilterCubicImageViewImageFormatPropertiesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_external_memory_host ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImportMemoryHostPointerInfoEXT ) == sizeof( VkImportMemoryHostPointerInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImportMemoryHostPointerInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImportMemoryHostPointerInfoEXT>::value,\n                          \"ImportMemoryHostPointerInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryHostPointerPropertiesEXT ) == sizeof( VkMemoryHostPointerPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryHostPointerPropertiesEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryHostPointerPropertiesEXT>::value,\n                          \"MemoryHostPointerPropertiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalMemoryHostPropertiesEXT ) ==\n                            sizeof( VkPhysicalDeviceExternalMemoryHostPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalMemoryHostPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalMemoryHostPropertiesEXT>::value,\n                          \"PhysicalDeviceExternalMemoryHostPropertiesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_shader_clock ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderClockFeaturesKHR ) == sizeof( VkPhysicalDeviceShaderClockFeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderClockFeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderClockFeaturesKHR>::value,\n                          \"PhysicalDeviceShaderClockFeaturesKHR is not nothrow_move_constructible!\" );\n\n//=== VK_AMD_pipeline_compiler_control ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineCompilerControlCreateInfoAMD ) == sizeof( VkPipelineCompilerControlCreateInfoAMD ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineCompilerControlCreateInfoAMD>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineCompilerControlCreateInfoAMD>::value,\n                          \"PipelineCompilerControlCreateInfoAMD is not nothrow_move_constructible!\" );\n\n//=== VK_AMD_shader_core_properties ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCorePropertiesAMD ) == sizeof( VkPhysicalDeviceShaderCorePropertiesAMD ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCorePropertiesAMD>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCorePropertiesAMD>::value,\n                          \"PhysicalDeviceShaderCorePropertiesAMD is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_video_decode_h265 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoDecodeH265ProfileInfoKHR ) == sizeof( VkVideoDecodeH265ProfileInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoDecodeH265ProfileInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoDecodeH265ProfileInfoKHR>::value,\n                          \"VideoDecodeH265ProfileInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoDecodeH265CapabilitiesKHR ) == sizeof( VkVideoDecodeH265CapabilitiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoDecodeH265CapabilitiesKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoDecodeH265CapabilitiesKHR>::value,\n                          \"VideoDecodeH265CapabilitiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoDecodeH265SessionParametersCreateInfoKHR ) ==\n                            sizeof( VkVideoDecodeH265SessionParametersCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoDecodeH265SessionParametersCreateInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoDecodeH265SessionParametersCreateInfoKHR>::value,\n                          \"VideoDecodeH265SessionParametersCreateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoDecodeH265SessionParametersAddInfoKHR ) == sizeof( VkVideoDecodeH265SessionParametersAddInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoDecodeH265SessionParametersAddInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoDecodeH265SessionParametersAddInfoKHR>::value,\n                          \"VideoDecodeH265SessionParametersAddInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoDecodeH265PictureInfoKHR ) == sizeof( VkVideoDecodeH265PictureInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoDecodeH265PictureInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoDecodeH265PictureInfoKHR>::value,\n                          \"VideoDecodeH265PictureInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoDecodeH265DpbSlotInfoKHR ) == sizeof( VkVideoDecodeH265DpbSlotInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoDecodeH265DpbSlotInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoDecodeH265DpbSlotInfoKHR>::value,\n                          \"VideoDecodeH265DpbSlotInfoKHR is not nothrow_move_constructible!\" );\n\n//=== VK_AMD_memory_overallocation_behavior ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceMemoryOverallocationCreateInfoAMD ) == sizeof( VkDeviceMemoryOverallocationCreateInfoAMD ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceMemoryOverallocationCreateInfoAMD>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceMemoryOverallocationCreateInfoAMD>::value,\n                          \"DeviceMemoryOverallocationCreateInfoAMD is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_vertex_attribute_divisor ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeDivisorPropertiesEXT ) ==\n                            sizeof( VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeDivisorPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeDivisorPropertiesEXT>::value,\n                          \"PhysicalDeviceVertexAttributeDivisorPropertiesEXT is not nothrow_move_constructible!\" );\n\n#if defined( VK_USE_PLATFORM_GGP )\n//=== VK_GGP_frame_token ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PresentFrameTokenGGP ) == sizeof( VkPresentFrameTokenGGP ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PresentFrameTokenGGP>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PresentFrameTokenGGP>::value,\n                          \"PresentFrameTokenGGP is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_GGP*/\n\n//=== VK_NV_mesh_shader ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderFeaturesNV ) == sizeof( VkPhysicalDeviceMeshShaderFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderFeaturesNV>::value,\n                          \"PhysicalDeviceMeshShaderFeaturesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderPropertiesNV ) == sizeof( VkPhysicalDeviceMeshShaderPropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderPropertiesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderPropertiesNV>::value,\n                          \"PhysicalDeviceMeshShaderPropertiesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DrawMeshTasksIndirectCommandNV ) == sizeof( VkDrawMeshTasksIndirectCommandNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DrawMeshTasksIndirectCommandNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DrawMeshTasksIndirectCommandNV>::value,\n                          \"DrawMeshTasksIndirectCommandNV is not nothrow_move_constructible!\" );\n\n//=== VK_NV_shader_image_footprint ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderImageFootprintFeaturesNV ) ==\n                            sizeof( VkPhysicalDeviceShaderImageFootprintFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderImageFootprintFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderImageFootprintFeaturesNV>::value,\n                          \"PhysicalDeviceShaderImageFootprintFeaturesNV is not nothrow_move_constructible!\" );\n\n//=== VK_NV_scissor_exclusive ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineViewportExclusiveScissorStateCreateInfoNV ) ==\n                            sizeof( VkPipelineViewportExclusiveScissorStateCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineViewportExclusiveScissorStateCreateInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineViewportExclusiveScissorStateCreateInfoNV>::value,\n                          \"PipelineViewportExclusiveScissorStateCreateInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceExclusiveScissorFeaturesNV ) == sizeof( VkPhysicalDeviceExclusiveScissorFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceExclusiveScissorFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceExclusiveScissorFeaturesNV>::value,\n                          \"PhysicalDeviceExclusiveScissorFeaturesNV is not nothrow_move_constructible!\" );\n\n//=== VK_NV_device_diagnostic_checkpoints ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::QueueFamilyCheckpointPropertiesNV ) == sizeof( VkQueueFamilyCheckpointPropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::QueueFamilyCheckpointPropertiesNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::QueueFamilyCheckpointPropertiesNV>::value,\n                          \"QueueFamilyCheckpointPropertiesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CheckpointDataNV ) == sizeof( VkCheckpointDataNV ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CheckpointDataNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CheckpointDataNV>::value,\n                          \"CheckpointDataNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::QueueFamilyCheckpointProperties2NV ) == sizeof( VkQueueFamilyCheckpointProperties2NV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::QueueFamilyCheckpointProperties2NV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::QueueFamilyCheckpointProperties2NV>::value,\n                          \"QueueFamilyCheckpointProperties2NV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CheckpointData2NV ) == sizeof( VkCheckpointData2NV ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CheckpointData2NV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CheckpointData2NV>::value,\n                          \"CheckpointData2NV is not nothrow_move_constructible!\" );\n\n//=== VK_INTEL_shader_integer_functions2 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL ) ==\n                            sizeof( VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL>::value,\n                          \"PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL is not nothrow_move_constructible!\" );\n\n//=== VK_INTEL_performance_query ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PerformanceValueDataINTEL ) == sizeof( VkPerformanceValueDataINTEL ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PerformanceValueDataINTEL>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PerformanceValueDataINTEL>::value,\n                          \"PerformanceValueDataINTEL is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PerformanceValueINTEL ) == sizeof( VkPerformanceValueINTEL ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PerformanceValueINTEL>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PerformanceValueINTEL>::value,\n                          \"PerformanceValueINTEL is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::InitializePerformanceApiInfoINTEL ) == sizeof( VkInitializePerformanceApiInfoINTEL ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::InitializePerformanceApiInfoINTEL>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::InitializePerformanceApiInfoINTEL>::value,\n                          \"InitializePerformanceApiInfoINTEL is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::QueryPoolPerformanceQueryCreateInfoINTEL ) == sizeof( VkQueryPoolPerformanceQueryCreateInfoINTEL ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::QueryPoolPerformanceQueryCreateInfoINTEL>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::QueryPoolPerformanceQueryCreateInfoINTEL>::value,\n                          \"QueryPoolPerformanceQueryCreateInfoINTEL is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PerformanceMarkerInfoINTEL ) == sizeof( VkPerformanceMarkerInfoINTEL ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PerformanceMarkerInfoINTEL>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PerformanceMarkerInfoINTEL>::value,\n                          \"PerformanceMarkerInfoINTEL is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PerformanceStreamMarkerInfoINTEL ) == sizeof( VkPerformanceStreamMarkerInfoINTEL ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PerformanceStreamMarkerInfoINTEL>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PerformanceStreamMarkerInfoINTEL>::value,\n                          \"PerformanceStreamMarkerInfoINTEL is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PerformanceOverrideInfoINTEL ) == sizeof( VkPerformanceOverrideInfoINTEL ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PerformanceOverrideInfoINTEL>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PerformanceOverrideInfoINTEL>::value,\n                          \"PerformanceOverrideInfoINTEL is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PerformanceConfigurationAcquireInfoINTEL ) == sizeof( VkPerformanceConfigurationAcquireInfoINTEL ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PerformanceConfigurationAcquireInfoINTEL>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PerformanceConfigurationAcquireInfoINTEL>::value,\n                          \"PerformanceConfigurationAcquireInfoINTEL is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL ) == sizeof( VkPerformanceConfigurationINTEL ),\n                          \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL>::value,\n                          \"PerformanceConfigurationINTEL is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL>::value,\n                          \"PerformanceConfigurationINTEL is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_pci_bus_info ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePCIBusInfoPropertiesEXT ) == sizeof( VkPhysicalDevicePCIBusInfoPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePCIBusInfoPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePCIBusInfoPropertiesEXT>::value,\n                          \"PhysicalDevicePCIBusInfoPropertiesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_AMD_display_native_hdr ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DisplayNativeHdrSurfaceCapabilitiesAMD ) == sizeof( VkDisplayNativeHdrSurfaceCapabilitiesAMD ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DisplayNativeHdrSurfaceCapabilitiesAMD>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DisplayNativeHdrSurfaceCapabilitiesAMD>::value,\n                          \"DisplayNativeHdrSurfaceCapabilitiesAMD is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SwapchainDisplayNativeHdrCreateInfoAMD ) == sizeof( VkSwapchainDisplayNativeHdrCreateInfoAMD ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SwapchainDisplayNativeHdrCreateInfoAMD>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SwapchainDisplayNativeHdrCreateInfoAMD>::value,\n                          \"SwapchainDisplayNativeHdrCreateInfoAMD is not nothrow_move_constructible!\" );\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n//=== VK_FUCHSIA_imagepipe_surface ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateInfoFUCHSIA ) == sizeof( VkImagePipeSurfaceCreateInfoFUCHSIA ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateInfoFUCHSIA>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateInfoFUCHSIA>::value,\n                          \"ImagePipeSurfaceCreateInfoFUCHSIA is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n//=== VK_EXT_metal_surface ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MetalSurfaceCreateInfoEXT ) == sizeof( VkMetalSurfaceCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MetalSurfaceCreateInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MetalSurfaceCreateInfoEXT>::value,\n                          \"MetalSurfaceCreateInfoEXT is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n//=== VK_EXT_fragment_density_map ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceFragmentDensityMapFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapFeaturesEXT>::value,\n                          \"PhysicalDeviceFragmentDensityMapFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapPropertiesEXT ) ==\n                            sizeof( VkPhysicalDeviceFragmentDensityMapPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapPropertiesEXT>::value,\n                          \"PhysicalDeviceFragmentDensityMapPropertiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderPassFragmentDensityMapCreateInfoEXT ) == sizeof( VkRenderPassFragmentDensityMapCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderPassFragmentDensityMapCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderPassFragmentDensityMapCreateInfoEXT>::value,\n                          \"RenderPassFragmentDensityMapCreateInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderingFragmentDensityMapAttachmentInfoEXT ) ==\n                            sizeof( VkRenderingFragmentDensityMapAttachmentInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderingFragmentDensityMapAttachmentInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderingFragmentDensityMapAttachmentInfoEXT>::value,\n                          \"RenderingFragmentDensityMapAttachmentInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_fragment_shading_rate ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::FragmentShadingRateAttachmentInfoKHR ) == sizeof( VkFragmentShadingRateAttachmentInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::FragmentShadingRateAttachmentInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::FragmentShadingRateAttachmentInfoKHR>::value,\n                          \"FragmentShadingRateAttachmentInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineFragmentShadingRateStateCreateInfoKHR ) ==\n                            sizeof( VkPipelineFragmentShadingRateStateCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineFragmentShadingRateStateCreateInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineFragmentShadingRateStateCreateInfoKHR>::value,\n                          \"PipelineFragmentShadingRateStateCreateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateFeaturesKHR ) ==\n                            sizeof( VkPhysicalDeviceFragmentShadingRateFeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateFeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateFeaturesKHR>::value,\n                          \"PhysicalDeviceFragmentShadingRateFeaturesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRatePropertiesKHR ) ==\n                            sizeof( VkPhysicalDeviceFragmentShadingRatePropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRatePropertiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRatePropertiesKHR>::value,\n                          \"PhysicalDeviceFragmentShadingRatePropertiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR ) == sizeof( VkPhysicalDeviceFragmentShadingRateKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR>::value,\n                          \"PhysicalDeviceFragmentShadingRateKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderingFragmentShadingRateAttachmentInfoKHR ) ==\n                            sizeof( VkRenderingFragmentShadingRateAttachmentInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderingFragmentShadingRateAttachmentInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderingFragmentShadingRateAttachmentInfoKHR>::value,\n                          \"RenderingFragmentShadingRateAttachmentInfoKHR is not nothrow_move_constructible!\" );\n\n//=== VK_AMD_shader_core_properties2 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCoreProperties2AMD ) == sizeof( VkPhysicalDeviceShaderCoreProperties2AMD ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCoreProperties2AMD>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCoreProperties2AMD>::value,\n                          \"PhysicalDeviceShaderCoreProperties2AMD is not nothrow_move_constructible!\" );\n\n//=== VK_AMD_device_coherent_memory ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceCoherentMemoryFeaturesAMD ) == sizeof( VkPhysicalDeviceCoherentMemoryFeaturesAMD ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceCoherentMemoryFeaturesAMD>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceCoherentMemoryFeaturesAMD>::value,\n                          \"PhysicalDeviceCoherentMemoryFeaturesAMD is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_shader_image_atomic_int64 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderImageAtomicInt64FeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderImageAtomicInt64FeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderImageAtomicInt64FeaturesEXT>::value,\n                          \"PhysicalDeviceShaderImageAtomicInt64FeaturesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_shader_quad_control ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderQuadControlFeaturesKHR ) == sizeof( VkPhysicalDeviceShaderQuadControlFeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderQuadControlFeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderQuadControlFeaturesKHR>::value,\n                          \"PhysicalDeviceShaderQuadControlFeaturesKHR is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_memory_budget ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryBudgetPropertiesEXT ) == sizeof( VkPhysicalDeviceMemoryBudgetPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryBudgetPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryBudgetPropertiesEXT>::value,\n                          \"PhysicalDeviceMemoryBudgetPropertiesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_memory_priority ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryPriorityFeaturesEXT ) == sizeof( VkPhysicalDeviceMemoryPriorityFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryPriorityFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryPriorityFeaturesEXT>::value,\n                          \"PhysicalDeviceMemoryPriorityFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryPriorityAllocateInfoEXT ) == sizeof( VkMemoryPriorityAllocateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryPriorityAllocateInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryPriorityAllocateInfoEXT>::value,\n                          \"MemoryPriorityAllocateInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_surface_protected_capabilities ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SurfaceProtectedCapabilitiesKHR ) == sizeof( VkSurfaceProtectedCapabilitiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SurfaceProtectedCapabilitiesKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SurfaceProtectedCapabilitiesKHR>::value,\n                          \"SurfaceProtectedCapabilitiesKHR is not nothrow_move_constructible!\" );\n\n//=== VK_NV_dedicated_allocation_image_aliasing ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV ) ==\n                            sizeof( VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV>::value,\n                          \"PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_buffer_device_address ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceBufferDeviceAddressFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceBufferDeviceAddressFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceBufferDeviceAddressFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceBufferDeviceAddressFeaturesEXT>::value,\n                          \"PhysicalDeviceBufferDeviceAddressFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BufferDeviceAddressCreateInfoEXT ) == sizeof( VkBufferDeviceAddressCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BufferDeviceAddressCreateInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BufferDeviceAddressCreateInfoEXT>::value,\n                          \"BufferDeviceAddressCreateInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_validation_features ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ValidationFeaturesEXT ) == sizeof( VkValidationFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ValidationFeaturesEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ValidationFeaturesEXT>::value,\n                          \"ValidationFeaturesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_present_wait ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePresentWaitFeaturesKHR ) == sizeof( VkPhysicalDevicePresentWaitFeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePresentWaitFeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePresentWaitFeaturesKHR>::value,\n                          \"PhysicalDevicePresentWaitFeaturesKHR is not nothrow_move_constructible!\" );\n\n//=== VK_NV_cooperative_matrix ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV ) == sizeof( VkCooperativeMatrixPropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV>::value,\n                          \"CooperativeMatrixPropertiesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixFeaturesNV ) == sizeof( VkPhysicalDeviceCooperativeMatrixFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixFeaturesNV>::value,\n                          \"PhysicalDeviceCooperativeMatrixFeaturesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixPropertiesNV ) ==\n                            sizeof( VkPhysicalDeviceCooperativeMatrixPropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixPropertiesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixPropertiesNV>::value,\n                          \"PhysicalDeviceCooperativeMatrixPropertiesNV is not nothrow_move_constructible!\" );\n\n//=== VK_NV_coverage_reduction_mode ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceCoverageReductionModeFeaturesNV ) ==\n                            sizeof( VkPhysicalDeviceCoverageReductionModeFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceCoverageReductionModeFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceCoverageReductionModeFeaturesNV>::value,\n                          \"PhysicalDeviceCoverageReductionModeFeaturesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineCoverageReductionStateCreateInfoNV ) == sizeof( VkPipelineCoverageReductionStateCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineCoverageReductionStateCreateInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineCoverageReductionStateCreateInfoNV>::value,\n                          \"PipelineCoverageReductionStateCreateInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV ) == sizeof( VkFramebufferMixedSamplesCombinationNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV>::value,\n                          \"FramebufferMixedSamplesCombinationNV is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_fragment_shader_interlock ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShaderInterlockFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShaderInterlockFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShaderInterlockFeaturesEXT>::value,\n                          \"PhysicalDeviceFragmentShaderInterlockFeaturesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_ycbcr_image_arrays ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceYcbcrImageArraysFeaturesEXT ) == sizeof( VkPhysicalDeviceYcbcrImageArraysFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceYcbcrImageArraysFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceYcbcrImageArraysFeaturesEXT>::value,\n                          \"PhysicalDeviceYcbcrImageArraysFeaturesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_provoking_vertex ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceProvokingVertexFeaturesEXT ) == sizeof( VkPhysicalDeviceProvokingVertexFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceProvokingVertexFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceProvokingVertexFeaturesEXT>::value,\n                          \"PhysicalDeviceProvokingVertexFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceProvokingVertexPropertiesEXT ) == sizeof( VkPhysicalDeviceProvokingVertexPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceProvokingVertexPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceProvokingVertexPropertiesEXT>::value,\n                          \"PhysicalDeviceProvokingVertexPropertiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineRasterizationProvokingVertexStateCreateInfoEXT ) ==\n                            sizeof( VkPipelineRasterizationProvokingVertexStateCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineRasterizationProvokingVertexStateCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineRasterizationProvokingVertexStateCreateInfoEXT>::value,\n                          \"PipelineRasterizationProvokingVertexStateCreateInfoEXT is not nothrow_move_constructible!\" );\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n//=== VK_EXT_full_screen_exclusive ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SurfaceFullScreenExclusiveInfoEXT ) == sizeof( VkSurfaceFullScreenExclusiveInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SurfaceFullScreenExclusiveInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SurfaceFullScreenExclusiveInfoEXT>::value,\n                          \"SurfaceFullScreenExclusiveInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesFullScreenExclusiveEXT ) == sizeof( VkSurfaceCapabilitiesFullScreenExclusiveEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesFullScreenExclusiveEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesFullScreenExclusiveEXT>::value,\n                          \"SurfaceCapabilitiesFullScreenExclusiveEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SurfaceFullScreenExclusiveWin32InfoEXT ) == sizeof( VkSurfaceFullScreenExclusiveWin32InfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SurfaceFullScreenExclusiveWin32InfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SurfaceFullScreenExclusiveWin32InfoEXT>::value,\n                          \"SurfaceFullScreenExclusiveWin32InfoEXT is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n//=== VK_EXT_headless_surface ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateInfoEXT ) == sizeof( VkHeadlessSurfaceCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateInfoEXT>::value,\n                          \"HeadlessSurfaceCreateInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_shader_atomic_float ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicFloatFeaturesEXT ) == sizeof( VkPhysicalDeviceShaderAtomicFloatFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicFloatFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicFloatFeaturesEXT>::value,\n                          \"PhysicalDeviceShaderAtomicFloatFeaturesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_extended_dynamic_state ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicStateFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceExtendedDynamicStateFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicStateFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicStateFeaturesEXT>::value,\n                          \"PhysicalDeviceExtendedDynamicStateFeaturesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_deferred_host_operations ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeferredOperationKHR ) == sizeof( VkDeferredOperationKHR ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::DeferredOperationKHR>::value, \"DeferredOperationKHR is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeferredOperationKHR>::value,\n                          \"DeferredOperationKHR is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_pipeline_executable_properties ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineExecutablePropertiesFeaturesKHR ) ==\n                            sizeof( VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineExecutablePropertiesFeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineExecutablePropertiesFeaturesKHR>::value,\n                          \"PhysicalDevicePipelineExecutablePropertiesFeaturesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineInfoKHR ) == sizeof( VkPipelineInfoKHR ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineInfoKHR>::value,\n                          \"PipelineInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR ) == sizeof( VkPipelineExecutablePropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR>::value,\n                          \"PipelineExecutablePropertiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR ) == sizeof( VkPipelineExecutableInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR>::value,\n                          \"PipelineExecutableInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticValueKHR ) == sizeof( VkPipelineExecutableStatisticValueKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticValueKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticValueKHR>::value,\n                          \"PipelineExecutableStatisticValueKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR ) == sizeof( VkPipelineExecutableStatisticKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR>::value,\n                          \"PipelineExecutableStatisticKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR ) ==\n                            sizeof( VkPipelineExecutableInternalRepresentationKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR>::value,\n                          \"PipelineExecutableInternalRepresentationKHR is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_map_memory_placed ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMapMemoryPlacedFeaturesEXT ) == sizeof( VkPhysicalDeviceMapMemoryPlacedFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMapMemoryPlacedFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMapMemoryPlacedFeaturesEXT>::value,\n                          \"PhysicalDeviceMapMemoryPlacedFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMapMemoryPlacedPropertiesEXT ) == sizeof( VkPhysicalDeviceMapMemoryPlacedPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMapMemoryPlacedPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMapMemoryPlacedPropertiesEXT>::value,\n                          \"PhysicalDeviceMapMemoryPlacedPropertiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryMapPlacedInfoEXT ) == sizeof( VkMemoryMapPlacedInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryMapPlacedInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryMapPlacedInfoEXT>::value,\n                          \"MemoryMapPlacedInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_shader_atomic_float2 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicFloat2FeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicFloat2FeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicFloat2FeaturesEXT>::value,\n                          \"PhysicalDeviceShaderAtomicFloat2FeaturesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_surface_maintenance1 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SurfacePresentModeEXT ) == sizeof( VkSurfacePresentModeEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SurfacePresentModeEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SurfacePresentModeEXT>::value,\n                          \"SurfacePresentModeEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SurfacePresentScalingCapabilitiesEXT ) == sizeof( VkSurfacePresentScalingCapabilitiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SurfacePresentScalingCapabilitiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SurfacePresentScalingCapabilitiesEXT>::value,\n                          \"SurfacePresentScalingCapabilitiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SurfacePresentModeCompatibilityEXT ) == sizeof( VkSurfacePresentModeCompatibilityEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SurfacePresentModeCompatibilityEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SurfacePresentModeCompatibilityEXT>::value,\n                          \"SurfacePresentModeCompatibilityEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_swapchain_maintenance1 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceSwapchainMaintenance1FeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceSwapchainMaintenance1FeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceSwapchainMaintenance1FeaturesEXT>::value,\n                          \"PhysicalDeviceSwapchainMaintenance1FeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SwapchainPresentFenceInfoEXT ) == sizeof( VkSwapchainPresentFenceInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SwapchainPresentFenceInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SwapchainPresentFenceInfoEXT>::value,\n                          \"SwapchainPresentFenceInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SwapchainPresentModesCreateInfoEXT ) == sizeof( VkSwapchainPresentModesCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SwapchainPresentModesCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SwapchainPresentModesCreateInfoEXT>::value,\n                          \"SwapchainPresentModesCreateInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SwapchainPresentModeInfoEXT ) == sizeof( VkSwapchainPresentModeInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SwapchainPresentModeInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SwapchainPresentModeInfoEXT>::value,\n                          \"SwapchainPresentModeInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SwapchainPresentScalingCreateInfoEXT ) == sizeof( VkSwapchainPresentScalingCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SwapchainPresentScalingCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SwapchainPresentScalingCreateInfoEXT>::value,\n                          \"SwapchainPresentScalingCreateInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ReleaseSwapchainImagesInfoEXT ) == sizeof( VkReleaseSwapchainImagesInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ReleaseSwapchainImagesInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ReleaseSwapchainImagesInfoEXT>::value,\n                          \"ReleaseSwapchainImagesInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_NV_device_generated_commands ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsPropertiesNV ) ==\n                            sizeof( VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsPropertiesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsPropertiesNV>::value,\n                          \"PhysicalDeviceDeviceGeneratedCommandsPropertiesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsFeaturesNV ) ==\n                            sizeof( VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsFeaturesNV>::value,\n                          \"PhysicalDeviceDeviceGeneratedCommandsFeaturesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::GraphicsShaderGroupCreateInfoNV ) == sizeof( VkGraphicsShaderGroupCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::GraphicsShaderGroupCreateInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::GraphicsShaderGroupCreateInfoNV>::value,\n                          \"GraphicsShaderGroupCreateInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::GraphicsPipelineShaderGroupsCreateInfoNV ) == sizeof( VkGraphicsPipelineShaderGroupsCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::GraphicsPipelineShaderGroupsCreateInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::GraphicsPipelineShaderGroupsCreateInfoNV>::value,\n                          \"GraphicsPipelineShaderGroupsCreateInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BindShaderGroupIndirectCommandNV ) == sizeof( VkBindShaderGroupIndirectCommandNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BindShaderGroupIndirectCommandNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BindShaderGroupIndirectCommandNV>::value,\n                          \"BindShaderGroupIndirectCommandNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BindIndexBufferIndirectCommandNV ) == sizeof( VkBindIndexBufferIndirectCommandNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BindIndexBufferIndirectCommandNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BindIndexBufferIndirectCommandNV>::value,\n                          \"BindIndexBufferIndirectCommandNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BindVertexBufferIndirectCommandNV ) == sizeof( VkBindVertexBufferIndirectCommandNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BindVertexBufferIndirectCommandNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BindVertexBufferIndirectCommandNV>::value,\n                          \"BindVertexBufferIndirectCommandNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SetStateFlagsIndirectCommandNV ) == sizeof( VkSetStateFlagsIndirectCommandNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SetStateFlagsIndirectCommandNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SetStateFlagsIndirectCommandNV>::value,\n                          \"SetStateFlagsIndirectCommandNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV ) == sizeof( VkIndirectCommandsLayoutNV ),\n                          \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV>::value,\n                          \"IndirectCommandsLayoutNV is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV>::value,\n                          \"IndirectCommandsLayoutNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::IndirectCommandsStreamNV ) == sizeof( VkIndirectCommandsStreamNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::IndirectCommandsStreamNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::IndirectCommandsStreamNV>::value,\n                          \"IndirectCommandsStreamNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenNV ) == sizeof( VkIndirectCommandsLayoutTokenNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenNV>::value,\n                          \"IndirectCommandsLayoutTokenNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoNV ) == sizeof( VkIndirectCommandsLayoutCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoNV>::value,\n                          \"IndirectCommandsLayoutCreateInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV ) == sizeof( VkGeneratedCommandsInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV>::value,\n                          \"GeneratedCommandsInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoNV ) == sizeof( VkGeneratedCommandsMemoryRequirementsInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoNV>::value,\n                          \"GeneratedCommandsMemoryRequirementsInfoNV is not nothrow_move_constructible!\" );\n\n//=== VK_NV_inherited_viewport_scissor ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceInheritedViewportScissorFeaturesNV ) ==\n                            sizeof( VkPhysicalDeviceInheritedViewportScissorFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceInheritedViewportScissorFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceInheritedViewportScissorFeaturesNV>::value,\n                          \"PhysicalDeviceInheritedViewportScissorFeaturesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CommandBufferInheritanceViewportScissorInfoNV ) ==\n                            sizeof( VkCommandBufferInheritanceViewportScissorInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceViewportScissorInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceViewportScissorInfoNV>::value,\n                          \"CommandBufferInheritanceViewportScissorInfoNV is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_texel_buffer_alignment ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceTexelBufferAlignmentFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceTexelBufferAlignmentFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceTexelBufferAlignmentFeaturesEXT>::value,\n                          \"PhysicalDeviceTexelBufferAlignmentFeaturesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_QCOM_render_pass_transform ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderPassTransformBeginInfoQCOM ) == sizeof( VkRenderPassTransformBeginInfoQCOM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderPassTransformBeginInfoQCOM>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderPassTransformBeginInfoQCOM>::value,\n                          \"RenderPassTransformBeginInfoQCOM is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CommandBufferInheritanceRenderPassTransformInfoQCOM ) ==\n                            sizeof( VkCommandBufferInheritanceRenderPassTransformInfoQCOM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceRenderPassTransformInfoQCOM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceRenderPassTransformInfoQCOM>::value,\n                          \"CommandBufferInheritanceRenderPassTransformInfoQCOM is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_depth_bias_control ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthBiasControlFeaturesEXT ) == sizeof( VkPhysicalDeviceDepthBiasControlFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthBiasControlFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthBiasControlFeaturesEXT>::value,\n                          \"PhysicalDeviceDepthBiasControlFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DepthBiasInfoEXT ) == sizeof( VkDepthBiasInfoEXT ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DepthBiasInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DepthBiasInfoEXT>::value,\n                          \"DepthBiasInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DepthBiasRepresentationInfoEXT ) == sizeof( VkDepthBiasRepresentationInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DepthBiasRepresentationInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DepthBiasRepresentationInfoEXT>::value,\n                          \"DepthBiasRepresentationInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_device_memory_report ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceMemoryReportFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceDeviceMemoryReportFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceMemoryReportFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceMemoryReportFeaturesEXT>::value,\n                          \"PhysicalDeviceDeviceMemoryReportFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceDeviceMemoryReportCreateInfoEXT ) == sizeof( VkDeviceDeviceMemoryReportCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceDeviceMemoryReportCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceDeviceMemoryReportCreateInfoEXT>::value,\n                          \"DeviceDeviceMemoryReportCreateInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceMemoryReportCallbackDataEXT ) == sizeof( VkDeviceMemoryReportCallbackDataEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceMemoryReportCallbackDataEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceMemoryReportCallbackDataEXT>::value,\n                          \"DeviceMemoryReportCallbackDataEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_robustness2 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceRobustness2FeaturesEXT ) == sizeof( VkPhysicalDeviceRobustness2FeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceRobustness2FeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceRobustness2FeaturesEXT>::value,\n                          \"PhysicalDeviceRobustness2FeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceRobustness2PropertiesEXT ) == sizeof( VkPhysicalDeviceRobustness2PropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceRobustness2PropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceRobustness2PropertiesEXT>::value,\n                          \"PhysicalDeviceRobustness2PropertiesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_custom_border_color ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SamplerCustomBorderColorCreateInfoEXT ) == sizeof( VkSamplerCustomBorderColorCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SamplerCustomBorderColorCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SamplerCustomBorderColorCreateInfoEXT>::value,\n                          \"SamplerCustomBorderColorCreateInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceCustomBorderColorPropertiesEXT ) ==\n                            sizeof( VkPhysicalDeviceCustomBorderColorPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceCustomBorderColorPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceCustomBorderColorPropertiesEXT>::value,\n                          \"PhysicalDeviceCustomBorderColorPropertiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceCustomBorderColorFeaturesEXT ) == sizeof( VkPhysicalDeviceCustomBorderColorFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceCustomBorderColorFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceCustomBorderColorFeaturesEXT>::value,\n                          \"PhysicalDeviceCustomBorderColorFeaturesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_pipeline_library ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineLibraryCreateInfoKHR ) == sizeof( VkPipelineLibraryCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineLibraryCreateInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineLibraryCreateInfoKHR>::value,\n                          \"PipelineLibraryCreateInfoKHR is not nothrow_move_constructible!\" );\n\n//=== VK_NV_present_barrier ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePresentBarrierFeaturesNV ) == sizeof( VkPhysicalDevicePresentBarrierFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePresentBarrierFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePresentBarrierFeaturesNV>::value,\n                          \"PhysicalDevicePresentBarrierFeaturesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesPresentBarrierNV ) == sizeof( VkSurfaceCapabilitiesPresentBarrierNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesPresentBarrierNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesPresentBarrierNV>::value,\n                          \"SurfaceCapabilitiesPresentBarrierNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SwapchainPresentBarrierCreateInfoNV ) == sizeof( VkSwapchainPresentBarrierCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SwapchainPresentBarrierCreateInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SwapchainPresentBarrierCreateInfoNV>::value,\n                          \"SwapchainPresentBarrierCreateInfoNV is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_present_id ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PresentIdKHR ) == sizeof( VkPresentIdKHR ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PresentIdKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PresentIdKHR>::value, \"PresentIdKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePresentIdFeaturesKHR ) == sizeof( VkPhysicalDevicePresentIdFeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePresentIdFeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePresentIdFeaturesKHR>::value,\n                          \"PhysicalDevicePresentIdFeaturesKHR is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_video_encode_queue ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeInfoKHR ) == sizeof( VkVideoEncodeInfoKHR ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeInfoKHR>::value,\n                          \"VideoEncodeInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeCapabilitiesKHR ) == sizeof( VkVideoEncodeCapabilitiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeCapabilitiesKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeCapabilitiesKHR>::value,\n                          \"VideoEncodeCapabilitiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::QueryPoolVideoEncodeFeedbackCreateInfoKHR ) == sizeof( VkQueryPoolVideoEncodeFeedbackCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::QueryPoolVideoEncodeFeedbackCreateInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::QueryPoolVideoEncodeFeedbackCreateInfoKHR>::value,\n                          \"QueryPoolVideoEncodeFeedbackCreateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeUsageInfoKHR ) == sizeof( VkVideoEncodeUsageInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeUsageInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeUsageInfoKHR>::value,\n                          \"VideoEncodeUsageInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeRateControlInfoKHR ) == sizeof( VkVideoEncodeRateControlInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeRateControlInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeRateControlInfoKHR>::value,\n                          \"VideoEncodeRateControlInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeRateControlLayerInfoKHR ) == sizeof( VkVideoEncodeRateControlLayerInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeRateControlLayerInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeRateControlLayerInfoKHR>::value,\n                          \"VideoEncodeRateControlLayerInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeQualityLevelInfoKHR ) ==\n                            sizeof( VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeQualityLevelInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeQualityLevelInfoKHR>::value,\n                          \"PhysicalDeviceVideoEncodeQualityLevelInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelPropertiesKHR ) == sizeof( VkVideoEncodeQualityLevelPropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelPropertiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelPropertiesKHR>::value,\n                          \"VideoEncodeQualityLevelPropertiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelInfoKHR ) == sizeof( VkVideoEncodeQualityLevelInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelInfoKHR>::value,\n                          \"VideoEncodeQualityLevelInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersGetInfoKHR ) == sizeof( VkVideoEncodeSessionParametersGetInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersGetInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersGetInfoKHR>::value,\n                          \"VideoEncodeSessionParametersGetInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR ) ==\n                            sizeof( VkVideoEncodeSessionParametersFeedbackInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR>::value,\n                          \"VideoEncodeSessionParametersFeedbackInfoKHR is not nothrow_move_constructible!\" );\n\n//=== VK_NV_device_diagnostics_config ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDiagnosticsConfigFeaturesNV ) == sizeof( VkPhysicalDeviceDiagnosticsConfigFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDiagnosticsConfigFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDiagnosticsConfigFeaturesNV>::value,\n                          \"PhysicalDeviceDiagnosticsConfigFeaturesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceDiagnosticsConfigCreateInfoNV ) == sizeof( VkDeviceDiagnosticsConfigCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceDiagnosticsConfigCreateInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceDiagnosticsConfigCreateInfoNV>::value,\n                          \"DeviceDiagnosticsConfigCreateInfoNV is not nothrow_move_constructible!\" );\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n//=== VK_NV_cuda_kernel_launch ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CudaModuleNV ) == sizeof( VkCudaModuleNV ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::CudaModuleNV>::value, \"CudaModuleNV is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CudaModuleNV>::value, \"CudaModuleNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CudaFunctionNV ) == sizeof( VkCudaFunctionNV ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::CudaFunctionNV>::value, \"CudaFunctionNV is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CudaFunctionNV>::value,\n                          \"CudaFunctionNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CudaModuleCreateInfoNV ) == sizeof( VkCudaModuleCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CudaModuleCreateInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CudaModuleCreateInfoNV>::value,\n                          \"CudaModuleCreateInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CudaFunctionCreateInfoNV ) == sizeof( VkCudaFunctionCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CudaFunctionCreateInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CudaFunctionCreateInfoNV>::value,\n                          \"CudaFunctionCreateInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CudaLaunchInfoNV ) == sizeof( VkCudaLaunchInfoNV ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CudaLaunchInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CudaLaunchInfoNV>::value,\n                          \"CudaLaunchInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceCudaKernelLaunchFeaturesNV ) == sizeof( VkPhysicalDeviceCudaKernelLaunchFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceCudaKernelLaunchFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceCudaKernelLaunchFeaturesNV>::value,\n                          \"PhysicalDeviceCudaKernelLaunchFeaturesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceCudaKernelLaunchPropertiesNV ) == sizeof( VkPhysicalDeviceCudaKernelLaunchPropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceCudaKernelLaunchPropertiesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceCudaKernelLaunchPropertiesNV>::value,\n                          \"PhysicalDeviceCudaKernelLaunchPropertiesNV is not nothrow_move_constructible!\" );\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n//=== VK_NV_low_latency ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::QueryLowLatencySupportNV ) == sizeof( VkQueryLowLatencySupportNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::QueryLowLatencySupportNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::QueryLowLatencySupportNV>::value,\n                          \"QueryLowLatencySupportNV is not nothrow_move_constructible!\" );\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n//=== VK_EXT_metal_objects ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExportMetalObjectCreateInfoEXT ) == sizeof( VkExportMetalObjectCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExportMetalObjectCreateInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExportMetalObjectCreateInfoEXT>::value,\n                          \"ExportMetalObjectCreateInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExportMetalObjectsInfoEXT ) == sizeof( VkExportMetalObjectsInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExportMetalObjectsInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExportMetalObjectsInfoEXT>::value,\n                          \"ExportMetalObjectsInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExportMetalDeviceInfoEXT ) == sizeof( VkExportMetalDeviceInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExportMetalDeviceInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExportMetalDeviceInfoEXT>::value,\n                          \"ExportMetalDeviceInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExportMetalCommandQueueInfoEXT ) == sizeof( VkExportMetalCommandQueueInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExportMetalCommandQueueInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExportMetalCommandQueueInfoEXT>::value,\n                          \"ExportMetalCommandQueueInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExportMetalBufferInfoEXT ) == sizeof( VkExportMetalBufferInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExportMetalBufferInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExportMetalBufferInfoEXT>::value,\n                          \"ExportMetalBufferInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImportMetalBufferInfoEXT ) == sizeof( VkImportMetalBufferInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImportMetalBufferInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImportMetalBufferInfoEXT>::value,\n                          \"ImportMetalBufferInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExportMetalTextureInfoEXT ) == sizeof( VkExportMetalTextureInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExportMetalTextureInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExportMetalTextureInfoEXT>::value,\n                          \"ExportMetalTextureInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImportMetalTextureInfoEXT ) == sizeof( VkImportMetalTextureInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImportMetalTextureInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImportMetalTextureInfoEXT>::value,\n                          \"ImportMetalTextureInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExportMetalIOSurfaceInfoEXT ) == sizeof( VkExportMetalIOSurfaceInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExportMetalIOSurfaceInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExportMetalIOSurfaceInfoEXT>::value,\n                          \"ExportMetalIOSurfaceInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImportMetalIOSurfaceInfoEXT ) == sizeof( VkImportMetalIOSurfaceInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImportMetalIOSurfaceInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImportMetalIOSurfaceInfoEXT>::value,\n                          \"ImportMetalIOSurfaceInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExportMetalSharedEventInfoEXT ) == sizeof( VkExportMetalSharedEventInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExportMetalSharedEventInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExportMetalSharedEventInfoEXT>::value,\n                          \"ExportMetalSharedEventInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImportMetalSharedEventInfoEXT ) == sizeof( VkImportMetalSharedEventInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImportMetalSharedEventInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImportMetalSharedEventInfoEXT>::value,\n                          \"ImportMetalSharedEventInfoEXT is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n//=== VK_EXT_descriptor_buffer ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorBufferPropertiesEXT ) ==\n                            sizeof( VkPhysicalDeviceDescriptorBufferPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorBufferPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorBufferPropertiesEXT>::value,\n                          \"PhysicalDeviceDescriptorBufferPropertiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT ) ==\n                            sizeof( VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT>::value,\n                          \"PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorBufferFeaturesEXT ) == sizeof( VkPhysicalDeviceDescriptorBufferFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorBufferFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorBufferFeaturesEXT>::value,\n                          \"PhysicalDeviceDescriptorBufferFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorAddressInfoEXT ) == sizeof( VkDescriptorAddressInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DescriptorAddressInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorAddressInfoEXT>::value,\n                          \"DescriptorAddressInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorBufferBindingInfoEXT ) == sizeof( VkDescriptorBufferBindingInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DescriptorBufferBindingInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorBufferBindingInfoEXT>::value,\n                          \"DescriptorBufferBindingInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorBufferBindingPushDescriptorBufferHandleEXT ) ==\n                            sizeof( VkDescriptorBufferBindingPushDescriptorBufferHandleEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DescriptorBufferBindingPushDescriptorBufferHandleEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorBufferBindingPushDescriptorBufferHandleEXT>::value,\n                          \"DescriptorBufferBindingPushDescriptorBufferHandleEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorDataEXT ) == sizeof( VkDescriptorDataEXT ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DescriptorDataEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorDataEXT>::value,\n                          \"DescriptorDataEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorGetInfoEXT ) == sizeof( VkDescriptorGetInfoEXT ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DescriptorGetInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorGetInfoEXT>::value,\n                          \"DescriptorGetInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BufferCaptureDescriptorDataInfoEXT ) == sizeof( VkBufferCaptureDescriptorDataInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BufferCaptureDescriptorDataInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BufferCaptureDescriptorDataInfoEXT>::value,\n                          \"BufferCaptureDescriptorDataInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageCaptureDescriptorDataInfoEXT ) == sizeof( VkImageCaptureDescriptorDataInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageCaptureDescriptorDataInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageCaptureDescriptorDataInfoEXT>::value,\n                          \"ImageCaptureDescriptorDataInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageViewCaptureDescriptorDataInfoEXT ) == sizeof( VkImageViewCaptureDescriptorDataInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageViewCaptureDescriptorDataInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageViewCaptureDescriptorDataInfoEXT>::value,\n                          \"ImageViewCaptureDescriptorDataInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SamplerCaptureDescriptorDataInfoEXT ) == sizeof( VkSamplerCaptureDescriptorDataInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SamplerCaptureDescriptorDataInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SamplerCaptureDescriptorDataInfoEXT>::value,\n                          \"SamplerCaptureDescriptorDataInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::OpaqueCaptureDescriptorDataCreateInfoEXT ) == sizeof( VkOpaqueCaptureDescriptorDataCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::OpaqueCaptureDescriptorDataCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::OpaqueCaptureDescriptorDataCreateInfoEXT>::value,\n                          \"OpaqueCaptureDescriptorDataCreateInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureCaptureDescriptorDataInfoEXT ) ==\n                            sizeof( VkAccelerationStructureCaptureDescriptorDataInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureCaptureDescriptorDataInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureCaptureDescriptorDataInfoEXT>::value,\n                          \"AccelerationStructureCaptureDescriptorDataInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_graphics_pipeline_library ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT>::value,\n                          \"PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT ) ==\n                            sizeof( VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT>::value,\n                          \"PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::GraphicsPipelineLibraryCreateInfoEXT ) == sizeof( VkGraphicsPipelineLibraryCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::GraphicsPipelineLibraryCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::GraphicsPipelineLibraryCreateInfoEXT>::value,\n                          \"GraphicsPipelineLibraryCreateInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_AMD_shader_early_and_late_fragment_tests ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD ) ==\n                            sizeof( VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD>::value,\n                          \"PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_fragment_shader_barycentric ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShaderBarycentricFeaturesKHR ) ==\n                            sizeof( VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShaderBarycentricFeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShaderBarycentricFeaturesKHR>::value,\n                          \"PhysicalDeviceFragmentShaderBarycentricFeaturesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShaderBarycentricPropertiesKHR ) ==\n                            sizeof( VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShaderBarycentricPropertiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShaderBarycentricPropertiesKHR>::value,\n                          \"PhysicalDeviceFragmentShaderBarycentricPropertiesKHR is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_shader_subgroup_uniform_control_flow ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR ) ==\n                            sizeof( VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR>::value,\n                          \"PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR is not nothrow_move_constructible!\" );\n\n//=== VK_NV_fragment_shading_rate_enums ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateEnumsFeaturesNV ) ==\n                            sizeof( VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateEnumsFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateEnumsFeaturesNV>::value,\n                          \"PhysicalDeviceFragmentShadingRateEnumsFeaturesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateEnumsPropertiesNV ) ==\n                            sizeof( VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateEnumsPropertiesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateEnumsPropertiesNV>::value,\n                          \"PhysicalDeviceFragmentShadingRateEnumsPropertiesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineFragmentShadingRateEnumStateCreateInfoNV ) ==\n                            sizeof( VkPipelineFragmentShadingRateEnumStateCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineFragmentShadingRateEnumStateCreateInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineFragmentShadingRateEnumStateCreateInfoNV>::value,\n                          \"PipelineFragmentShadingRateEnumStateCreateInfoNV is not nothrow_move_constructible!\" );\n\n//=== VK_NV_ray_tracing_motion_blur ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryMotionTrianglesDataNV ) ==\n                            sizeof( VkAccelerationStructureGeometryMotionTrianglesDataNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryMotionTrianglesDataNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryMotionTrianglesDataNV>::value,\n                          \"AccelerationStructureGeometryMotionTrianglesDataNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInfoNV ) == sizeof( VkAccelerationStructureMotionInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInfoNV>::value,\n                          \"AccelerationStructureMotionInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceNV ) == sizeof( VkAccelerationStructureMotionInstanceNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceNV>::value,\n                          \"AccelerationStructureMotionInstanceNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceDataNV ) == sizeof( VkAccelerationStructureMotionInstanceDataNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceDataNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceDataNV>::value,\n                          \"AccelerationStructureMotionInstanceDataNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureMatrixMotionInstanceNV ) ==\n                            sizeof( VkAccelerationStructureMatrixMotionInstanceNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureMatrixMotionInstanceNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureMatrixMotionInstanceNV>::value,\n                          \"AccelerationStructureMatrixMotionInstanceNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureSRTMotionInstanceNV ) == sizeof( VkAccelerationStructureSRTMotionInstanceNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureSRTMotionInstanceNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureSRTMotionInstanceNV>::value,\n                          \"AccelerationStructureSRTMotionInstanceNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SRTDataNV ) == sizeof( VkSRTDataNV ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SRTDataNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SRTDataNV>::value, \"SRTDataNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingMotionBlurFeaturesNV ) ==\n                            sizeof( VkPhysicalDeviceRayTracingMotionBlurFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingMotionBlurFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingMotionBlurFeaturesNV>::value,\n                          \"PhysicalDeviceRayTracingMotionBlurFeaturesNV is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_mesh_shader ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderFeaturesEXT ) == sizeof( VkPhysicalDeviceMeshShaderFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderFeaturesEXT>::value,\n                          \"PhysicalDeviceMeshShaderFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderPropertiesEXT ) == sizeof( VkPhysicalDeviceMeshShaderPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderPropertiesEXT>::value,\n                          \"PhysicalDeviceMeshShaderPropertiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DrawMeshTasksIndirectCommandEXT ) == sizeof( VkDrawMeshTasksIndirectCommandEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DrawMeshTasksIndirectCommandEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DrawMeshTasksIndirectCommandEXT>::value,\n                          \"DrawMeshTasksIndirectCommandEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_ycbcr_2plane_444_formats ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT>::value,\n                          \"PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_fragment_density_map2 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMap2FeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceFragmentDensityMap2FeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMap2FeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMap2FeaturesEXT>::value,\n                          \"PhysicalDeviceFragmentDensityMap2FeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMap2PropertiesEXT ) ==\n                            sizeof( VkPhysicalDeviceFragmentDensityMap2PropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMap2PropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMap2PropertiesEXT>::value,\n                          \"PhysicalDeviceFragmentDensityMap2PropertiesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_QCOM_rotated_copy_commands ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CopyCommandTransformInfoQCOM ) == sizeof( VkCopyCommandTransformInfoQCOM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CopyCommandTransformInfoQCOM>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CopyCommandTransformInfoQCOM>::value,\n                          \"CopyCommandTransformInfoQCOM is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_workgroup_memory_explicit_layout ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR ) ==\n                            sizeof( VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR>::value,\n                          \"PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_image_compression_control ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageCompressionControlFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceImageCompressionControlFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageCompressionControlFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageCompressionControlFeaturesEXT>::value,\n                          \"PhysicalDeviceImageCompressionControlFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageCompressionControlEXT ) == sizeof( VkImageCompressionControlEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageCompressionControlEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageCompressionControlEXT>::value,\n                          \"ImageCompressionControlEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageCompressionPropertiesEXT ) == sizeof( VkImageCompressionPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageCompressionPropertiesEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageCompressionPropertiesEXT>::value,\n                          \"ImageCompressionPropertiesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_attachment_feedback_loop_layout ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT>::value,\n                          \"PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_4444_formats ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevice4444FormatsFeaturesEXT ) == sizeof( VkPhysicalDevice4444FormatsFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevice4444FormatsFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevice4444FormatsFeaturesEXT>::value,\n                          \"PhysicalDevice4444FormatsFeaturesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_device_fault ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceFaultFeaturesEXT ) == sizeof( VkPhysicalDeviceFaultFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceFaultFeaturesEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceFaultFeaturesEXT>::value,\n                          \"PhysicalDeviceFaultFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceFaultCountsEXT ) == sizeof( VkDeviceFaultCountsEXT ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceFaultCountsEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceFaultCountsEXT>::value,\n                          \"DeviceFaultCountsEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceFaultInfoEXT ) == sizeof( VkDeviceFaultInfoEXT ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceFaultInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceFaultInfoEXT>::value,\n                          \"DeviceFaultInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceFaultAddressInfoEXT ) == sizeof( VkDeviceFaultAddressInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceFaultAddressInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceFaultAddressInfoEXT>::value,\n                          \"DeviceFaultAddressInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceFaultVendorInfoEXT ) == sizeof( VkDeviceFaultVendorInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceFaultVendorInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceFaultVendorInfoEXT>::value,\n                          \"DeviceFaultVendorInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceFaultVendorBinaryHeaderVersionOneEXT ) == sizeof( VkDeviceFaultVendorBinaryHeaderVersionOneEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceFaultVendorBinaryHeaderVersionOneEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceFaultVendorBinaryHeaderVersionOneEXT>::value,\n                          \"DeviceFaultVendorBinaryHeaderVersionOneEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_rgba10x6_formats ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceRGBA10X6FormatsFeaturesEXT ) == sizeof( VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceRGBA10X6FormatsFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceRGBA10X6FormatsFeaturesEXT>::value,\n                          \"PhysicalDeviceRGBA10X6FormatsFeaturesEXT is not nothrow_move_constructible!\" );\n\n#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n//=== VK_EXT_directfb_surface ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateInfoEXT ) == sizeof( VkDirectFBSurfaceCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateInfoEXT>::value,\n                          \"DirectFBSurfaceCreateInfoEXT is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n\n//=== VK_EXT_vertex_input_dynamic_state ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexInputDynamicStateFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexInputDynamicStateFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexInputDynamicStateFeaturesEXT>::value,\n                          \"PhysicalDeviceVertexInputDynamicStateFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VertexInputBindingDescription2EXT ) == sizeof( VkVertexInputBindingDescription2EXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VertexInputBindingDescription2EXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VertexInputBindingDescription2EXT>::value,\n                          \"VertexInputBindingDescription2EXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription2EXT ) == sizeof( VkVertexInputAttributeDescription2EXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription2EXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription2EXT>::value,\n                          \"VertexInputAttributeDescription2EXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_physical_device_drm ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDrmPropertiesEXT ) == sizeof( VkPhysicalDeviceDrmPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDrmPropertiesEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDrmPropertiesEXT>::value,\n                          \"PhysicalDeviceDrmPropertiesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_device_address_binding_report ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceAddressBindingReportFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceAddressBindingReportFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceAddressBindingReportFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceAddressBindingReportFeaturesEXT>::value,\n                          \"PhysicalDeviceAddressBindingReportFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceAddressBindingCallbackDataEXT ) == sizeof( VkDeviceAddressBindingCallbackDataEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceAddressBindingCallbackDataEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceAddressBindingCallbackDataEXT>::value,\n                          \"DeviceAddressBindingCallbackDataEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_depth_clip_control ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClipControlFeaturesEXT ) == sizeof( VkPhysicalDeviceDepthClipControlFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClipControlFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClipControlFeaturesEXT>::value,\n                          \"PhysicalDeviceDepthClipControlFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineViewportDepthClipControlCreateInfoEXT ) ==\n                            sizeof( VkPipelineViewportDepthClipControlCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineViewportDepthClipControlCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineViewportDepthClipControlCreateInfoEXT>::value,\n                          \"PipelineViewportDepthClipControlCreateInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_primitive_topology_list_restart ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT ) ==\n                            sizeof( VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT>::value,\n                          \"PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_present_mode_fifo_latest_ready ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT ) ==\n                            sizeof( VkPhysicalDevicePresentModeFifoLatestReadyFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT>::value,\n                          \"PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT is not nothrow_move_constructible!\" );\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n//=== VK_FUCHSIA_external_memory ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImportMemoryZirconHandleInfoFUCHSIA ) == sizeof( VkImportMemoryZirconHandleInfoFUCHSIA ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImportMemoryZirconHandleInfoFUCHSIA>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImportMemoryZirconHandleInfoFUCHSIA>::value,\n                          \"ImportMemoryZirconHandleInfoFUCHSIA is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryZirconHandlePropertiesFUCHSIA ) == sizeof( VkMemoryZirconHandlePropertiesFUCHSIA ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryZirconHandlePropertiesFUCHSIA>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryZirconHandlePropertiesFUCHSIA>::value,\n                          \"MemoryZirconHandlePropertiesFUCHSIA is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryGetZirconHandleInfoFUCHSIA ) == sizeof( VkMemoryGetZirconHandleInfoFUCHSIA ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryGetZirconHandleInfoFUCHSIA>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryGetZirconHandleInfoFUCHSIA>::value,\n                          \"MemoryGetZirconHandleInfoFUCHSIA is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n//=== VK_FUCHSIA_external_semaphore ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImportSemaphoreZirconHandleInfoFUCHSIA ) == sizeof( VkImportSemaphoreZirconHandleInfoFUCHSIA ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImportSemaphoreZirconHandleInfoFUCHSIA>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImportSemaphoreZirconHandleInfoFUCHSIA>::value,\n                          \"ImportSemaphoreZirconHandleInfoFUCHSIA is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SemaphoreGetZirconHandleInfoFUCHSIA ) == sizeof( VkSemaphoreGetZirconHandleInfoFUCHSIA ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SemaphoreGetZirconHandleInfoFUCHSIA>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SemaphoreGetZirconHandleInfoFUCHSIA>::value,\n                          \"SemaphoreGetZirconHandleInfoFUCHSIA is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n//=== VK_FUCHSIA_buffer_collection ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA ) == sizeof( VkBufferCollectionFUCHSIA ),\n                          \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA>::value,\n                          \"BufferCollectionFUCHSIA is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA>::value,\n                          \"BufferCollectionFUCHSIA is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BufferCollectionCreateInfoFUCHSIA ) == sizeof( VkBufferCollectionCreateInfoFUCHSIA ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BufferCollectionCreateInfoFUCHSIA>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BufferCollectionCreateInfoFUCHSIA>::value,\n                          \"BufferCollectionCreateInfoFUCHSIA is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImportMemoryBufferCollectionFUCHSIA ) == sizeof( VkImportMemoryBufferCollectionFUCHSIA ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImportMemoryBufferCollectionFUCHSIA>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImportMemoryBufferCollectionFUCHSIA>::value,\n                          \"ImportMemoryBufferCollectionFUCHSIA is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BufferCollectionImageCreateInfoFUCHSIA ) == sizeof( VkBufferCollectionImageCreateInfoFUCHSIA ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BufferCollectionImageCreateInfoFUCHSIA>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BufferCollectionImageCreateInfoFUCHSIA>::value,\n                          \"BufferCollectionImageCreateInfoFUCHSIA is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BufferConstraintsInfoFUCHSIA ) == sizeof( VkBufferConstraintsInfoFUCHSIA ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BufferConstraintsInfoFUCHSIA>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BufferConstraintsInfoFUCHSIA>::value,\n                          \"BufferConstraintsInfoFUCHSIA is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BufferCollectionBufferCreateInfoFUCHSIA ) == sizeof( VkBufferCollectionBufferCreateInfoFUCHSIA ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BufferCollectionBufferCreateInfoFUCHSIA>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BufferCollectionBufferCreateInfoFUCHSIA>::value,\n                          \"BufferCollectionBufferCreateInfoFUCHSIA is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BufferCollectionPropertiesFUCHSIA ) == sizeof( VkBufferCollectionPropertiesFUCHSIA ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BufferCollectionPropertiesFUCHSIA>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BufferCollectionPropertiesFUCHSIA>::value,\n                          \"BufferCollectionPropertiesFUCHSIA is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SysmemColorSpaceFUCHSIA ) == sizeof( VkSysmemColorSpaceFUCHSIA ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SysmemColorSpaceFUCHSIA>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SysmemColorSpaceFUCHSIA>::value,\n                          \"SysmemColorSpaceFUCHSIA is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageConstraintsInfoFUCHSIA ) == sizeof( VkImageConstraintsInfoFUCHSIA ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageConstraintsInfoFUCHSIA>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageConstraintsInfoFUCHSIA>::value,\n                          \"ImageConstraintsInfoFUCHSIA is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageFormatConstraintsInfoFUCHSIA ) == sizeof( VkImageFormatConstraintsInfoFUCHSIA ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageFormatConstraintsInfoFUCHSIA>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageFormatConstraintsInfoFUCHSIA>::value,\n                          \"ImageFormatConstraintsInfoFUCHSIA is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BufferCollectionConstraintsInfoFUCHSIA ) == sizeof( VkBufferCollectionConstraintsInfoFUCHSIA ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BufferCollectionConstraintsInfoFUCHSIA>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BufferCollectionConstraintsInfoFUCHSIA>::value,\n                          \"BufferCollectionConstraintsInfoFUCHSIA is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n//=== VK_HUAWEI_subpass_shading ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SubpassShadingPipelineCreateInfoHUAWEI ) == sizeof( VkSubpassShadingPipelineCreateInfoHUAWEI ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SubpassShadingPipelineCreateInfoHUAWEI>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SubpassShadingPipelineCreateInfoHUAWEI>::value,\n                          \"SubpassShadingPipelineCreateInfoHUAWEI is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceSubpassShadingFeaturesHUAWEI ) == sizeof( VkPhysicalDeviceSubpassShadingFeaturesHUAWEI ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubpassShadingFeaturesHUAWEI>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubpassShadingFeaturesHUAWEI>::value,\n                          \"PhysicalDeviceSubpassShadingFeaturesHUAWEI is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceSubpassShadingPropertiesHUAWEI ) ==\n                            sizeof( VkPhysicalDeviceSubpassShadingPropertiesHUAWEI ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubpassShadingPropertiesHUAWEI>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubpassShadingPropertiesHUAWEI>::value,\n                          \"PhysicalDeviceSubpassShadingPropertiesHUAWEI is not nothrow_move_constructible!\" );\n\n//=== VK_HUAWEI_invocation_mask ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceInvocationMaskFeaturesHUAWEI ) == sizeof( VkPhysicalDeviceInvocationMaskFeaturesHUAWEI ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceInvocationMaskFeaturesHUAWEI>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceInvocationMaskFeaturesHUAWEI>::value,\n                          \"PhysicalDeviceInvocationMaskFeaturesHUAWEI is not nothrow_move_constructible!\" );\n\n//=== VK_NV_external_memory_rdma ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryGetRemoteAddressInfoNV ) == sizeof( VkMemoryGetRemoteAddressInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryGetRemoteAddressInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryGetRemoteAddressInfoNV>::value,\n                          \"MemoryGetRemoteAddressInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalMemoryRDMAFeaturesNV ) == sizeof( VkPhysicalDeviceExternalMemoryRDMAFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalMemoryRDMAFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalMemoryRDMAFeaturesNV>::value,\n                          \"PhysicalDeviceExternalMemoryRDMAFeaturesNV is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_pipeline_properties ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelinePropertiesIdentifierEXT ) == sizeof( VkPipelinePropertiesIdentifierEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelinePropertiesIdentifierEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelinePropertiesIdentifierEXT>::value,\n                          \"PipelinePropertiesIdentifierEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePipelinePropertiesFeaturesEXT ) ==\n                            sizeof( VkPhysicalDevicePipelinePropertiesFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelinePropertiesFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelinePropertiesFeaturesEXT>::value,\n                          \"PhysicalDevicePipelinePropertiesFeaturesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_frame_boundary ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceFrameBoundaryFeaturesEXT ) == sizeof( VkPhysicalDeviceFrameBoundaryFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceFrameBoundaryFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceFrameBoundaryFeaturesEXT>::value,\n                          \"PhysicalDeviceFrameBoundaryFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::FrameBoundaryEXT ) == sizeof( VkFrameBoundaryEXT ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::FrameBoundaryEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::FrameBoundaryEXT>::value,\n                          \"FrameBoundaryEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_multisampled_render_to_single_sampled ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT>::value,\n                          \"PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SubpassResolvePerformanceQueryEXT ) == sizeof( VkSubpassResolvePerformanceQueryEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SubpassResolvePerformanceQueryEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SubpassResolvePerformanceQueryEXT>::value,\n                          \"SubpassResolvePerformanceQueryEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MultisampledRenderToSingleSampledInfoEXT ) == sizeof( VkMultisampledRenderToSingleSampledInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MultisampledRenderToSingleSampledInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MultisampledRenderToSingleSampledInfoEXT>::value,\n                          \"MultisampledRenderToSingleSampledInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_extended_dynamic_state2 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicState2FeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceExtendedDynamicState2FeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicState2FeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicState2FeaturesEXT>::value,\n                          \"PhysicalDeviceExtendedDynamicState2FeaturesEXT is not nothrow_move_constructible!\" );\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n//=== VK_QNX_screen_surface ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateInfoQNX ) == sizeof( VkScreenSurfaceCreateInfoQNX ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateInfoQNX>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateInfoQNX>::value,\n                          \"ScreenSurfaceCreateInfoQNX is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n//=== VK_EXT_color_write_enable ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceColorWriteEnableFeaturesEXT ) == sizeof( VkPhysicalDeviceColorWriteEnableFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceColorWriteEnableFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceColorWriteEnableFeaturesEXT>::value,\n                          \"PhysicalDeviceColorWriteEnableFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineColorWriteCreateInfoEXT ) == sizeof( VkPipelineColorWriteCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineColorWriteCreateInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineColorWriteCreateInfoEXT>::value,\n                          \"PipelineColorWriteCreateInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_primitives_generated_query ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT ) ==\n                            sizeof( VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT>::value,\n                          \"PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_ray_tracing_maintenance1 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingMaintenance1FeaturesKHR ) ==\n                            sizeof( VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingMaintenance1FeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingMaintenance1FeaturesKHR>::value,\n                          \"PhysicalDeviceRayTracingMaintenance1FeaturesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::TraceRaysIndirectCommand2KHR ) == sizeof( VkTraceRaysIndirectCommand2KHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::TraceRaysIndirectCommand2KHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::TraceRaysIndirectCommand2KHR>::value,\n                          \"TraceRaysIndirectCommand2KHR is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_image_view_min_lod ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageViewMinLodFeaturesEXT ) == sizeof( VkPhysicalDeviceImageViewMinLodFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageViewMinLodFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageViewMinLodFeaturesEXT>::value,\n                          \"PhysicalDeviceImageViewMinLodFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageViewMinLodCreateInfoEXT ) == sizeof( VkImageViewMinLodCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageViewMinLodCreateInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageViewMinLodCreateInfoEXT>::value,\n                          \"ImageViewMinLodCreateInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_multi_draw ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiDrawFeaturesEXT ) == sizeof( VkPhysicalDeviceMultiDrawFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiDrawFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiDrawFeaturesEXT>::value,\n                          \"PhysicalDeviceMultiDrawFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiDrawPropertiesEXT ) == sizeof( VkPhysicalDeviceMultiDrawPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiDrawPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiDrawPropertiesEXT>::value,\n                          \"PhysicalDeviceMultiDrawPropertiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MultiDrawInfoEXT ) == sizeof( VkMultiDrawInfoEXT ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MultiDrawInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MultiDrawInfoEXT>::value,\n                          \"MultiDrawInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MultiDrawIndexedInfoEXT ) == sizeof( VkMultiDrawIndexedInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MultiDrawIndexedInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MultiDrawIndexedInfoEXT>::value,\n                          \"MultiDrawIndexedInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_image_2d_view_of_3d ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceImage2DViewOf3DFeaturesEXT ) == sizeof( VkPhysicalDeviceImage2DViewOf3DFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceImage2DViewOf3DFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceImage2DViewOf3DFeaturesEXT>::value,\n                          \"PhysicalDeviceImage2DViewOf3DFeaturesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_shader_tile_image ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderTileImageFeaturesEXT ) == sizeof( VkPhysicalDeviceShaderTileImageFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderTileImageFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderTileImageFeaturesEXT>::value,\n                          \"PhysicalDeviceShaderTileImageFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderTileImagePropertiesEXT ) == sizeof( VkPhysicalDeviceShaderTileImagePropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderTileImagePropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderTileImagePropertiesEXT>::value,\n                          \"PhysicalDeviceShaderTileImagePropertiesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_opacity_micromap ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MicromapBuildInfoEXT ) == sizeof( VkMicromapBuildInfoEXT ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MicromapBuildInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MicromapBuildInfoEXT>::value,\n                          \"MicromapBuildInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MicromapUsageEXT ) == sizeof( VkMicromapUsageEXT ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MicromapUsageEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MicromapUsageEXT>::value,\n                          \"MicromapUsageEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MicromapCreateInfoEXT ) == sizeof( VkMicromapCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MicromapCreateInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MicromapCreateInfoEXT>::value,\n                          \"MicromapCreateInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MicromapEXT ) == sizeof( VkMicromapEXT ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::MicromapEXT>::value, \"MicromapEXT is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MicromapEXT>::value, \"MicromapEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceOpacityMicromapFeaturesEXT ) == sizeof( VkPhysicalDeviceOpacityMicromapFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceOpacityMicromapFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceOpacityMicromapFeaturesEXT>::value,\n                          \"PhysicalDeviceOpacityMicromapFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceOpacityMicromapPropertiesEXT ) == sizeof( VkPhysicalDeviceOpacityMicromapPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceOpacityMicromapPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceOpacityMicromapPropertiesEXT>::value,\n                          \"PhysicalDeviceOpacityMicromapPropertiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MicromapVersionInfoEXT ) == sizeof( VkMicromapVersionInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MicromapVersionInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MicromapVersionInfoEXT>::value,\n                          \"MicromapVersionInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CopyMicromapToMemoryInfoEXT ) == sizeof( VkCopyMicromapToMemoryInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CopyMicromapToMemoryInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CopyMicromapToMemoryInfoEXT>::value,\n                          \"CopyMicromapToMemoryInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CopyMemoryToMicromapInfoEXT ) == sizeof( VkCopyMemoryToMicromapInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CopyMemoryToMicromapInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CopyMemoryToMicromapInfoEXT>::value,\n                          \"CopyMemoryToMicromapInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CopyMicromapInfoEXT ) == sizeof( VkCopyMicromapInfoEXT ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CopyMicromapInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CopyMicromapInfoEXT>::value,\n                          \"CopyMicromapInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MicromapBuildSizesInfoEXT ) == sizeof( VkMicromapBuildSizesInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MicromapBuildSizesInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MicromapBuildSizesInfoEXT>::value,\n                          \"MicromapBuildSizesInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureTrianglesOpacityMicromapEXT ) ==\n                            sizeof( VkAccelerationStructureTrianglesOpacityMicromapEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureTrianglesOpacityMicromapEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureTrianglesOpacityMicromapEXT>::value,\n                          \"AccelerationStructureTrianglesOpacityMicromapEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MicromapTriangleEXT ) == sizeof( VkMicromapTriangleEXT ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MicromapTriangleEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MicromapTriangleEXT>::value,\n                          \"MicromapTriangleEXT is not nothrow_move_constructible!\" );\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n//=== VK_NV_displacement_micromap ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDisplacementMicromapFeaturesNV ) ==\n                            sizeof( VkPhysicalDeviceDisplacementMicromapFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDisplacementMicromapFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDisplacementMicromapFeaturesNV>::value,\n                          \"PhysicalDeviceDisplacementMicromapFeaturesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDisplacementMicromapPropertiesNV ) ==\n                            sizeof( VkPhysicalDeviceDisplacementMicromapPropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDisplacementMicromapPropertiesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDisplacementMicromapPropertiesNV>::value,\n                          \"PhysicalDeviceDisplacementMicromapPropertiesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureTrianglesDisplacementMicromapNV ) ==\n                            sizeof( VkAccelerationStructureTrianglesDisplacementMicromapNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureTrianglesDisplacementMicromapNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureTrianglesDisplacementMicromapNV>::value,\n                          \"AccelerationStructureTrianglesDisplacementMicromapNV is not nothrow_move_constructible!\" );\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n//=== VK_HUAWEI_cluster_culling_shader ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterCullingShaderFeaturesHUAWEI ) ==\n                            sizeof( VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterCullingShaderFeaturesHUAWEI>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterCullingShaderFeaturesHUAWEI>::value,\n                          \"PhysicalDeviceClusterCullingShaderFeaturesHUAWEI is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterCullingShaderPropertiesHUAWEI ) ==\n                            sizeof( VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterCullingShaderPropertiesHUAWEI>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterCullingShaderPropertiesHUAWEI>::value,\n                          \"PhysicalDeviceClusterCullingShaderPropertiesHUAWEI is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI ) ==\n                            sizeof( VkPhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI>::value,\n                          \"PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_border_color_swizzle ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceBorderColorSwizzleFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceBorderColorSwizzleFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceBorderColorSwizzleFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceBorderColorSwizzleFeaturesEXT>::value,\n                          \"PhysicalDeviceBorderColorSwizzleFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SamplerBorderColorComponentMappingCreateInfoEXT ) ==\n                            sizeof( VkSamplerBorderColorComponentMappingCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SamplerBorderColorComponentMappingCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SamplerBorderColorComponentMappingCreateInfoEXT>::value,\n                          \"SamplerBorderColorComponentMappingCreateInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_pageable_device_local_memory ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT ) ==\n                            sizeof( VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT>::value,\n                          \"PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_ARM_shader_core_properties ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCorePropertiesARM ) == sizeof( VkPhysicalDeviceShaderCorePropertiesARM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCorePropertiesARM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCorePropertiesARM>::value,\n                          \"PhysicalDeviceShaderCorePropertiesARM is not nothrow_move_constructible!\" );\n\n//=== VK_ARM_scheduling_controls ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DeviceQueueShaderCoreControlCreateInfoARM ) == sizeof( VkDeviceQueueShaderCoreControlCreateInfoARM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DeviceQueueShaderCoreControlCreateInfoARM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DeviceQueueShaderCoreControlCreateInfoARM>::value,\n                          \"DeviceQueueShaderCoreControlCreateInfoARM is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceSchedulingControlsFeaturesARM ) ==\n                            sizeof( VkPhysicalDeviceSchedulingControlsFeaturesARM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceSchedulingControlsFeaturesARM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceSchedulingControlsFeaturesARM>::value,\n                          \"PhysicalDeviceSchedulingControlsFeaturesARM is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceSchedulingControlsPropertiesARM ) ==\n                            sizeof( VkPhysicalDeviceSchedulingControlsPropertiesARM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceSchedulingControlsPropertiesARM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceSchedulingControlsPropertiesARM>::value,\n                          \"PhysicalDeviceSchedulingControlsPropertiesARM is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_image_sliced_view_of_3d ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageSlicedViewOf3DFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageSlicedViewOf3DFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageSlicedViewOf3DFeaturesEXT>::value,\n                          \"PhysicalDeviceImageSlicedViewOf3DFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageViewSlicedCreateInfoEXT ) == sizeof( VkImageViewSlicedCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageViewSlicedCreateInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageViewSlicedCreateInfoEXT>::value,\n                          \"ImageViewSlicedCreateInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_VALVE_descriptor_set_host_mapping ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE ) ==\n                            sizeof( VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE>::value,\n                          \"PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorSetBindingReferenceVALVE ) == sizeof( VkDescriptorSetBindingReferenceVALVE ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DescriptorSetBindingReferenceVALVE>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorSetBindingReferenceVALVE>::value,\n                          \"DescriptorSetBindingReferenceVALVE is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DescriptorSetLayoutHostMappingInfoVALVE ) == sizeof( VkDescriptorSetLayoutHostMappingInfoVALVE ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutHostMappingInfoVALVE>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutHostMappingInfoVALVE>::value,\n                          \"DescriptorSetLayoutHostMappingInfoVALVE is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_non_seamless_cube_map ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceNonSeamlessCubeMapFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceNonSeamlessCubeMapFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceNonSeamlessCubeMapFeaturesEXT>::value,\n                          \"PhysicalDeviceNonSeamlessCubeMapFeaturesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_ARM_render_pass_striped ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceRenderPassStripedFeaturesARM ) == sizeof( VkPhysicalDeviceRenderPassStripedFeaturesARM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceRenderPassStripedFeaturesARM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceRenderPassStripedFeaturesARM>::value,\n                          \"PhysicalDeviceRenderPassStripedFeaturesARM is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceRenderPassStripedPropertiesARM ) ==\n                            sizeof( VkPhysicalDeviceRenderPassStripedPropertiesARM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceRenderPassStripedPropertiesARM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceRenderPassStripedPropertiesARM>::value,\n                          \"PhysicalDeviceRenderPassStripedPropertiesARM is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderPassStripeBeginInfoARM ) == sizeof( VkRenderPassStripeBeginInfoARM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderPassStripeBeginInfoARM>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderPassStripeBeginInfoARM>::value,\n                          \"RenderPassStripeBeginInfoARM is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderPassStripeInfoARM ) == sizeof( VkRenderPassStripeInfoARM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderPassStripeInfoARM>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderPassStripeInfoARM>::value,\n                          \"RenderPassStripeInfoARM is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderPassStripeSubmitInfoARM ) == sizeof( VkRenderPassStripeSubmitInfoARM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderPassStripeSubmitInfoARM>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderPassStripeSubmitInfoARM>::value,\n                          \"RenderPassStripeSubmitInfoARM is not nothrow_move_constructible!\" );\n\n//=== VK_QCOM_fragment_density_map_offset ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM ) ==\n                            sizeof( VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM>::value,\n                          \"PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM ) ==\n                            sizeof( VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM>::value,\n                          \"PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SubpassFragmentDensityMapOffsetEndInfoQCOM ) == sizeof( VkSubpassFragmentDensityMapOffsetEndInfoQCOM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SubpassFragmentDensityMapOffsetEndInfoQCOM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SubpassFragmentDensityMapOffsetEndInfoQCOM>::value,\n                          \"SubpassFragmentDensityMapOffsetEndInfoQCOM is not nothrow_move_constructible!\" );\n\n//=== VK_NV_copy_memory_indirect ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CopyMemoryIndirectCommandNV ) == sizeof( VkCopyMemoryIndirectCommandNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CopyMemoryIndirectCommandNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CopyMemoryIndirectCommandNV>::value,\n                          \"CopyMemoryIndirectCommandNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CopyMemoryToImageIndirectCommandNV ) == sizeof( VkCopyMemoryToImageIndirectCommandNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CopyMemoryToImageIndirectCommandNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CopyMemoryToImageIndirectCommandNV>::value,\n                          \"CopyMemoryToImageIndirectCommandNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceCopyMemoryIndirectFeaturesNV ) == sizeof( VkPhysicalDeviceCopyMemoryIndirectFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceCopyMemoryIndirectFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceCopyMemoryIndirectFeaturesNV>::value,\n                          \"PhysicalDeviceCopyMemoryIndirectFeaturesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceCopyMemoryIndirectPropertiesNV ) ==\n                            sizeof( VkPhysicalDeviceCopyMemoryIndirectPropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceCopyMemoryIndirectPropertiesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceCopyMemoryIndirectPropertiesNV>::value,\n                          \"PhysicalDeviceCopyMemoryIndirectPropertiesNV is not nothrow_move_constructible!\" );\n\n//=== VK_NV_memory_decompression ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DecompressMemoryRegionNV ) == sizeof( VkDecompressMemoryRegionNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DecompressMemoryRegionNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DecompressMemoryRegionNV>::value,\n                          \"DecompressMemoryRegionNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryDecompressionFeaturesNV ) ==\n                            sizeof( VkPhysicalDeviceMemoryDecompressionFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryDecompressionFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryDecompressionFeaturesNV>::value,\n                          \"PhysicalDeviceMemoryDecompressionFeaturesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryDecompressionPropertiesNV ) ==\n                            sizeof( VkPhysicalDeviceMemoryDecompressionPropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryDecompressionPropertiesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryDecompressionPropertiesNV>::value,\n                          \"PhysicalDeviceMemoryDecompressionPropertiesNV is not nothrow_move_constructible!\" );\n\n//=== VK_NV_device_generated_commands_compute ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV ) ==\n                            sizeof( VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV>::value,\n                          \"PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ComputePipelineIndirectBufferInfoNV ) == sizeof( VkComputePipelineIndirectBufferInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ComputePipelineIndirectBufferInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ComputePipelineIndirectBufferInfoNV>::value,\n                          \"ComputePipelineIndirectBufferInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineIndirectDeviceAddressInfoNV ) == sizeof( VkPipelineIndirectDeviceAddressInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineIndirectDeviceAddressInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineIndirectDeviceAddressInfoNV>::value,\n                          \"PipelineIndirectDeviceAddressInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BindPipelineIndirectCommandNV ) == sizeof( VkBindPipelineIndirectCommandNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BindPipelineIndirectCommandNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BindPipelineIndirectCommandNV>::value,\n                          \"BindPipelineIndirectCommandNV is not nothrow_move_constructible!\" );\n\n//=== VK_NV_ray_tracing_linear_swept_spheres ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV ) ==\n                            sizeof( VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV>::value,\n                          \"PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryLinearSweptSpheresDataNV ) ==\n                            sizeof( VkAccelerationStructureGeometryLinearSweptSpheresDataNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryLinearSweptSpheresDataNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryLinearSweptSpheresDataNV>::value,\n                          \"AccelerationStructureGeometryLinearSweptSpheresDataNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AccelerationStructureGeometrySpheresDataNV ) == sizeof( VkAccelerationStructureGeometrySpheresDataNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AccelerationStructureGeometrySpheresDataNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AccelerationStructureGeometrySpheresDataNV>::value,\n                          \"AccelerationStructureGeometrySpheresDataNV is not nothrow_move_constructible!\" );\n\n//=== VK_NV_linear_color_attachment ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceLinearColorAttachmentFeaturesNV ) ==\n                            sizeof( VkPhysicalDeviceLinearColorAttachmentFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceLinearColorAttachmentFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceLinearColorAttachmentFeaturesNV>::value,\n                          \"PhysicalDeviceLinearColorAttachmentFeaturesNV is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_shader_maximal_reconvergence ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR ) ==\n                            sizeof( VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR>::value,\n                          \"PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_image_compression_control_swapchain ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT>::value,\n                          \"PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_QCOM_image_processing ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageViewSampleWeightCreateInfoQCOM ) == sizeof( VkImageViewSampleWeightCreateInfoQCOM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageViewSampleWeightCreateInfoQCOM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageViewSampleWeightCreateInfoQCOM>::value,\n                          \"ImageViewSampleWeightCreateInfoQCOM is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessingFeaturesQCOM ) == sizeof( VkPhysicalDeviceImageProcessingFeaturesQCOM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessingFeaturesQCOM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessingFeaturesQCOM>::value,\n                          \"PhysicalDeviceImageProcessingFeaturesQCOM is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessingPropertiesQCOM ) ==\n                            sizeof( VkPhysicalDeviceImageProcessingPropertiesQCOM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessingPropertiesQCOM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessingPropertiesQCOM>::value,\n                          \"PhysicalDeviceImageProcessingPropertiesQCOM is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_nested_command_buffer ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceNestedCommandBufferFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceNestedCommandBufferFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceNestedCommandBufferFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceNestedCommandBufferFeaturesEXT>::value,\n                          \"PhysicalDeviceNestedCommandBufferFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceNestedCommandBufferPropertiesEXT ) ==\n                            sizeof( VkPhysicalDeviceNestedCommandBufferPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceNestedCommandBufferPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceNestedCommandBufferPropertiesEXT>::value,\n                          \"PhysicalDeviceNestedCommandBufferPropertiesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_external_memory_acquire_unmodified ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExternalMemoryAcquireUnmodifiedEXT ) == sizeof( VkExternalMemoryAcquireUnmodifiedEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExternalMemoryAcquireUnmodifiedEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExternalMemoryAcquireUnmodifiedEXT>::value,\n                          \"ExternalMemoryAcquireUnmodifiedEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_extended_dynamic_state3 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicState3FeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceExtendedDynamicState3FeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicState3FeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicState3FeaturesEXT>::value,\n                          \"PhysicalDeviceExtendedDynamicState3FeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicState3PropertiesEXT ) ==\n                            sizeof( VkPhysicalDeviceExtendedDynamicState3PropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicState3PropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicState3PropertiesEXT>::value,\n                          \"PhysicalDeviceExtendedDynamicState3PropertiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ColorBlendEquationEXT ) == sizeof( VkColorBlendEquationEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ColorBlendEquationEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ColorBlendEquationEXT>::value,\n                          \"ColorBlendEquationEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ColorBlendAdvancedEXT ) == sizeof( VkColorBlendAdvancedEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ColorBlendAdvancedEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ColorBlendAdvancedEXT>::value,\n                          \"ColorBlendAdvancedEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_subpass_merge_feedback ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceSubpassMergeFeedbackFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubpassMergeFeedbackFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubpassMergeFeedbackFeaturesEXT>::value,\n                          \"PhysicalDeviceSubpassMergeFeedbackFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderPassCreationControlEXT ) == sizeof( VkRenderPassCreationControlEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderPassCreationControlEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderPassCreationControlEXT>::value,\n                          \"RenderPassCreationControlEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderPassCreationFeedbackInfoEXT ) == sizeof( VkRenderPassCreationFeedbackInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderPassCreationFeedbackInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderPassCreationFeedbackInfoEXT>::value,\n                          \"RenderPassCreationFeedbackInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderPassCreationFeedbackCreateInfoEXT ) == sizeof( VkRenderPassCreationFeedbackCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderPassCreationFeedbackCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderPassCreationFeedbackCreateInfoEXT>::value,\n                          \"RenderPassCreationFeedbackCreateInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderPassSubpassFeedbackInfoEXT ) == sizeof( VkRenderPassSubpassFeedbackInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderPassSubpassFeedbackInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderPassSubpassFeedbackInfoEXT>::value,\n                          \"RenderPassSubpassFeedbackInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RenderPassSubpassFeedbackCreateInfoEXT ) == sizeof( VkRenderPassSubpassFeedbackCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RenderPassSubpassFeedbackCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RenderPassSubpassFeedbackCreateInfoEXT>::value,\n                          \"RenderPassSubpassFeedbackCreateInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_LUNARG_direct_driver_loading ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DirectDriverLoadingInfoLUNARG ) == sizeof( VkDirectDriverLoadingInfoLUNARG ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DirectDriverLoadingInfoLUNARG>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DirectDriverLoadingInfoLUNARG>::value,\n                          \"DirectDriverLoadingInfoLUNARG is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DirectDriverLoadingListLUNARG ) == sizeof( VkDirectDriverLoadingListLUNARG ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DirectDriverLoadingListLUNARG>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DirectDriverLoadingListLUNARG>::value,\n                          \"DirectDriverLoadingListLUNARG is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_shader_module_identifier ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderModuleIdentifierFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderModuleIdentifierFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderModuleIdentifierFeaturesEXT>::value,\n                          \"PhysicalDeviceShaderModuleIdentifierFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderModuleIdentifierPropertiesEXT ) ==\n                            sizeof( VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderModuleIdentifierPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderModuleIdentifierPropertiesEXT>::value,\n                          \"PhysicalDeviceShaderModuleIdentifierPropertiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineShaderStageModuleIdentifierCreateInfoEXT ) ==\n                            sizeof( VkPipelineShaderStageModuleIdentifierCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineShaderStageModuleIdentifierCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineShaderStageModuleIdentifierCreateInfoEXT>::value,\n                          \"PipelineShaderStageModuleIdentifierCreateInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ShaderModuleIdentifierEXT ) == sizeof( VkShaderModuleIdentifierEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ShaderModuleIdentifierEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ShaderModuleIdentifierEXT>::value,\n                          \"ShaderModuleIdentifierEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_rasterization_order_attachment_access ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT>::value,\n                          \"PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_NV_optical_flow ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceOpticalFlowFeaturesNV ) == sizeof( VkPhysicalDeviceOpticalFlowFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceOpticalFlowFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceOpticalFlowFeaturesNV>::value,\n                          \"PhysicalDeviceOpticalFlowFeaturesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceOpticalFlowPropertiesNV ) == sizeof( VkPhysicalDeviceOpticalFlowPropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceOpticalFlowPropertiesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceOpticalFlowPropertiesNV>::value,\n                          \"PhysicalDeviceOpticalFlowPropertiesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatInfoNV ) == sizeof( VkOpticalFlowImageFormatInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatInfoNV>::value,\n                          \"OpticalFlowImageFormatInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatPropertiesNV ) == sizeof( VkOpticalFlowImageFormatPropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatPropertiesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatPropertiesNV>::value,\n                          \"OpticalFlowImageFormatPropertiesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV ) == sizeof( VkOpticalFlowSessionNV ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV>::value, \"OpticalFlowSessionNV is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::OpticalFlowSessionNV>::value,\n                          \"OpticalFlowSessionNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreateInfoNV ) == sizeof( VkOpticalFlowSessionCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreateInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreateInfoNV>::value,\n                          \"OpticalFlowSessionCreateInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreatePrivateDataInfoNV ) == sizeof( VkOpticalFlowSessionCreatePrivateDataInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreatePrivateDataInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreatePrivateDataInfoNV>::value,\n                          \"OpticalFlowSessionCreatePrivateDataInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::OpticalFlowExecuteInfoNV ) == sizeof( VkOpticalFlowExecuteInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::OpticalFlowExecuteInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::OpticalFlowExecuteInfoNV>::value,\n                          \"OpticalFlowExecuteInfoNV is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_legacy_dithering ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceLegacyDitheringFeaturesEXT ) == sizeof( VkPhysicalDeviceLegacyDitheringFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceLegacyDitheringFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceLegacyDitheringFeaturesEXT>::value,\n                          \"PhysicalDeviceLegacyDitheringFeaturesEXT is not nothrow_move_constructible!\" );\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n//=== VK_ANDROID_external_format_resolve ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFormatResolveFeaturesANDROID ) ==\n                            sizeof( VkPhysicalDeviceExternalFormatResolveFeaturesANDROID ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFormatResolveFeaturesANDROID>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFormatResolveFeaturesANDROID>::value,\n                          \"PhysicalDeviceExternalFormatResolveFeaturesANDROID is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFormatResolvePropertiesANDROID ) ==\n                            sizeof( VkPhysicalDeviceExternalFormatResolvePropertiesANDROID ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFormatResolvePropertiesANDROID>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFormatResolvePropertiesANDROID>::value,\n                          \"PhysicalDeviceExternalFormatResolvePropertiesANDROID is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AndroidHardwareBufferFormatResolvePropertiesANDROID ) ==\n                            sizeof( VkAndroidHardwareBufferFormatResolvePropertiesANDROID ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferFormatResolvePropertiesANDROID>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferFormatResolvePropertiesANDROID>::value,\n                          \"AndroidHardwareBufferFormatResolvePropertiesANDROID is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n//=== VK_AMD_anti_lag ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceAntiLagFeaturesAMD ) == sizeof( VkPhysicalDeviceAntiLagFeaturesAMD ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceAntiLagFeaturesAMD>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceAntiLagFeaturesAMD>::value,\n                          \"PhysicalDeviceAntiLagFeaturesAMD is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AntiLagDataAMD ) == sizeof( VkAntiLagDataAMD ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AntiLagDataAMD>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AntiLagDataAMD>::value,\n                          \"AntiLagDataAMD is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AntiLagPresentationInfoAMD ) == sizeof( VkAntiLagPresentationInfoAMD ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AntiLagPresentationInfoAMD>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AntiLagPresentationInfoAMD>::value,\n                          \"AntiLagPresentationInfoAMD is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_ray_tracing_position_fetch ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPositionFetchFeaturesKHR ) ==\n                            sizeof( VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPositionFetchFeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPositionFetchFeaturesKHR>::value,\n                          \"PhysicalDeviceRayTracingPositionFetchFeaturesKHR is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_shader_object ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ShaderEXT ) == sizeof( VkShaderEXT ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::ShaderEXT>::value, \"ShaderEXT is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ShaderEXT>::value, \"ShaderEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderObjectFeaturesEXT ) == sizeof( VkPhysicalDeviceShaderObjectFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderObjectFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderObjectFeaturesEXT>::value,\n                          \"PhysicalDeviceShaderObjectFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderObjectPropertiesEXT ) == sizeof( VkPhysicalDeviceShaderObjectPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderObjectPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderObjectPropertiesEXT>::value,\n                          \"PhysicalDeviceShaderObjectPropertiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT ) == sizeof( VkShaderCreateInfoEXT ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT>::value,\n                          \"ShaderCreateInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_pipeline_binary ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineBinaryFeaturesKHR ) == sizeof( VkPhysicalDevicePipelineBinaryFeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineBinaryFeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineBinaryFeaturesKHR>::value,\n                          \"PhysicalDevicePipelineBinaryFeaturesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineBinaryPropertiesKHR ) == sizeof( VkPhysicalDevicePipelineBinaryPropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineBinaryPropertiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineBinaryPropertiesKHR>::value,\n                          \"PhysicalDevicePipelineBinaryPropertiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DevicePipelineBinaryInternalCacheControlKHR ) ==\n                            sizeof( VkDevicePipelineBinaryInternalCacheControlKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DevicePipelineBinaryInternalCacheControlKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DevicePipelineBinaryInternalCacheControlKHR>::value,\n                          \"DevicePipelineBinaryInternalCacheControlKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineBinaryKHR ) == sizeof( VkPipelineBinaryKHR ), \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR>::value, \"PipelineBinaryKHR is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR>::value,\n                          \"PipelineBinaryKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR ) == sizeof( VkPipelineBinaryKeyKHR ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR>::value,\n                          \"PipelineBinaryKeyKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineBinaryDataKHR ) == sizeof( VkPipelineBinaryDataKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineBinaryDataKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineBinaryDataKHR>::value,\n                          \"PipelineBinaryDataKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineBinaryKeysAndDataKHR ) == sizeof( VkPipelineBinaryKeysAndDataKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineBinaryKeysAndDataKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineBinaryKeysAndDataKHR>::value,\n                          \"PipelineBinaryKeysAndDataKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineBinaryCreateInfoKHR ) == sizeof( VkPipelineBinaryCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineBinaryCreateInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineBinaryCreateInfoKHR>::value,\n                          \"PipelineBinaryCreateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineBinaryInfoKHR ) == sizeof( VkPipelineBinaryInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineBinaryInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineBinaryInfoKHR>::value,\n                          \"PipelineBinaryInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ReleaseCapturedPipelineDataInfoKHR ) == sizeof( VkReleaseCapturedPipelineDataInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ReleaseCapturedPipelineDataInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ReleaseCapturedPipelineDataInfoKHR>::value,\n                          \"ReleaseCapturedPipelineDataInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineBinaryDataInfoKHR ) == sizeof( VkPipelineBinaryDataInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineBinaryDataInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineBinaryDataInfoKHR>::value,\n                          \"PipelineBinaryDataInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineCreateInfoKHR ) == sizeof( VkPipelineCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineCreateInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineCreateInfoKHR>::value,\n                          \"PipelineCreateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineBinaryHandlesInfoKHR ) == sizeof( VkPipelineBinaryHandlesInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineBinaryHandlesInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineBinaryHandlesInfoKHR>::value,\n                          \"PipelineBinaryHandlesInfoKHR is not nothrow_move_constructible!\" );\n\n//=== VK_QCOM_tile_properties ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceTilePropertiesFeaturesQCOM ) == sizeof( VkPhysicalDeviceTilePropertiesFeaturesQCOM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceTilePropertiesFeaturesQCOM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceTilePropertiesFeaturesQCOM>::value,\n                          \"PhysicalDeviceTilePropertiesFeaturesQCOM is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::TilePropertiesQCOM ) == sizeof( VkTilePropertiesQCOM ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::TilePropertiesQCOM>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::TilePropertiesQCOM>::value,\n                          \"TilePropertiesQCOM is not nothrow_move_constructible!\" );\n\n//=== VK_SEC_amigo_profiling ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceAmigoProfilingFeaturesSEC ) == sizeof( VkPhysicalDeviceAmigoProfilingFeaturesSEC ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceAmigoProfilingFeaturesSEC>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceAmigoProfilingFeaturesSEC>::value,\n                          \"PhysicalDeviceAmigoProfilingFeaturesSEC is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::AmigoProfilingSubmitInfoSEC ) == sizeof( VkAmigoProfilingSubmitInfoSEC ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::AmigoProfilingSubmitInfoSEC>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::AmigoProfilingSubmitInfoSEC>::value,\n                          \"AmigoProfilingSubmitInfoSEC is not nothrow_move_constructible!\" );\n\n//=== VK_QCOM_multiview_per_view_viewports ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM ) ==\n                            sizeof( VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM>::value,\n                          \"PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM is not nothrow_move_constructible!\" );\n\n//=== VK_NV_ray_tracing_invocation_reorder ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingInvocationReorderPropertiesNV ) ==\n                            sizeof( VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingInvocationReorderPropertiesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingInvocationReorderPropertiesNV>::value,\n                          \"PhysicalDeviceRayTracingInvocationReorderPropertiesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingInvocationReorderFeaturesNV ) ==\n                            sizeof( VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingInvocationReorderFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingInvocationReorderFeaturesNV>::value,\n                          \"PhysicalDeviceRayTracingInvocationReorderFeaturesNV is not nothrow_move_constructible!\" );\n\n//=== VK_NV_cooperative_vector ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeVectorPropertiesNV ) ==\n                            sizeof( VkPhysicalDeviceCooperativeVectorPropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeVectorPropertiesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeVectorPropertiesNV>::value,\n                          \"PhysicalDeviceCooperativeVectorPropertiesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeVectorFeaturesNV ) == sizeof( VkPhysicalDeviceCooperativeVectorFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeVectorFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeVectorFeaturesNV>::value,\n                          \"PhysicalDeviceCooperativeVectorFeaturesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CooperativeVectorPropertiesNV ) == sizeof( VkCooperativeVectorPropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CooperativeVectorPropertiesNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CooperativeVectorPropertiesNV>::value,\n                          \"CooperativeVectorPropertiesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ConvertCooperativeVectorMatrixInfoNV ) == sizeof( VkConvertCooperativeVectorMatrixInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ConvertCooperativeVectorMatrixInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ConvertCooperativeVectorMatrixInfoNV>::value,\n                          \"ConvertCooperativeVectorMatrixInfoNV is not nothrow_move_constructible!\" );\n\n//=== VK_NV_extended_sparse_address_space ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV ) ==\n                            sizeof( VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV>::value,\n                          \"PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedSparseAddressSpacePropertiesNV ) ==\n                            sizeof( VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedSparseAddressSpacePropertiesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedSparseAddressSpacePropertiesNV>::value,\n                          \"PhysicalDeviceExtendedSparseAddressSpacePropertiesNV is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_mutable_descriptor_type ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMutableDescriptorTypeFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMutableDescriptorTypeFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMutableDescriptorTypeFeaturesEXT>::value,\n                          \"PhysicalDeviceMutableDescriptorTypeFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MutableDescriptorTypeListEXT ) == sizeof( VkMutableDescriptorTypeListEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MutableDescriptorTypeListEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MutableDescriptorTypeListEXT>::value,\n                          \"MutableDescriptorTypeListEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MutableDescriptorTypeCreateInfoEXT ) == sizeof( VkMutableDescriptorTypeCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MutableDescriptorTypeCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MutableDescriptorTypeCreateInfoEXT>::value,\n                          \"MutableDescriptorTypeCreateInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_legacy_vertex_attributes ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceLegacyVertexAttributesFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceLegacyVertexAttributesFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceLegacyVertexAttributesFeaturesEXT>::value,\n                          \"PhysicalDeviceLegacyVertexAttributesFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceLegacyVertexAttributesPropertiesEXT ) ==\n                            sizeof( VkPhysicalDeviceLegacyVertexAttributesPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceLegacyVertexAttributesPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceLegacyVertexAttributesPropertiesEXT>::value,\n                          \"PhysicalDeviceLegacyVertexAttributesPropertiesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_layer_settings ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::LayerSettingsCreateInfoEXT ) == sizeof( VkLayerSettingsCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::LayerSettingsCreateInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::LayerSettingsCreateInfoEXT>::value,\n                          \"LayerSettingsCreateInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::LayerSettingEXT ) == sizeof( VkLayerSettingEXT ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::LayerSettingEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::LayerSettingEXT>::value,\n                          \"LayerSettingEXT is not nothrow_move_constructible!\" );\n\n//=== VK_ARM_shader_core_builtins ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCoreBuiltinsFeaturesARM ) ==\n                            sizeof( VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCoreBuiltinsFeaturesARM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCoreBuiltinsFeaturesARM>::value,\n                          \"PhysicalDeviceShaderCoreBuiltinsFeaturesARM is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCoreBuiltinsPropertiesARM ) ==\n                            sizeof( VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCoreBuiltinsPropertiesARM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCoreBuiltinsPropertiesARM>::value,\n                          \"PhysicalDeviceShaderCoreBuiltinsPropertiesARM is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_pipeline_library_group_handles ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT ) ==\n                            sizeof( VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT>::value,\n                          \"PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_dynamic_rendering_unused_attachments ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT>::value,\n                          \"PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_NV_low_latency2 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::LatencySleepModeInfoNV ) == sizeof( VkLatencySleepModeInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::LatencySleepModeInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::LatencySleepModeInfoNV>::value,\n                          \"LatencySleepModeInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::LatencySleepInfoNV ) == sizeof( VkLatencySleepInfoNV ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::LatencySleepInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::LatencySleepInfoNV>::value,\n                          \"LatencySleepInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SetLatencyMarkerInfoNV ) == sizeof( VkSetLatencyMarkerInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SetLatencyMarkerInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SetLatencyMarkerInfoNV>::value,\n                          \"SetLatencyMarkerInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::GetLatencyMarkerInfoNV ) == sizeof( VkGetLatencyMarkerInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::GetLatencyMarkerInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::GetLatencyMarkerInfoNV>::value,\n                          \"GetLatencyMarkerInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV ) == sizeof( VkLatencyTimingsFrameReportNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV>::value,\n                          \"LatencyTimingsFrameReportNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::LatencySubmissionPresentIdNV ) == sizeof( VkLatencySubmissionPresentIdNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::LatencySubmissionPresentIdNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::LatencySubmissionPresentIdNV>::value,\n                          \"LatencySubmissionPresentIdNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SwapchainLatencyCreateInfoNV ) == sizeof( VkSwapchainLatencyCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SwapchainLatencyCreateInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SwapchainLatencyCreateInfoNV>::value,\n                          \"SwapchainLatencyCreateInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::OutOfBandQueueTypeInfoNV ) == sizeof( VkOutOfBandQueueTypeInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::OutOfBandQueueTypeInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::OutOfBandQueueTypeInfoNV>::value,\n                          \"OutOfBandQueueTypeInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::LatencySurfaceCapabilitiesNV ) == sizeof( VkLatencySurfaceCapabilitiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::LatencySurfaceCapabilitiesNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::LatencySurfaceCapabilitiesNV>::value,\n                          \"LatencySurfaceCapabilitiesNV is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_cooperative_matrix ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesKHR ) == sizeof( VkCooperativeMatrixPropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesKHR>::value,\n                          \"CooperativeMatrixPropertiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixFeaturesKHR ) == sizeof( VkPhysicalDeviceCooperativeMatrixFeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixFeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixFeaturesKHR>::value,\n                          \"PhysicalDeviceCooperativeMatrixFeaturesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixPropertiesKHR ) ==\n                            sizeof( VkPhysicalDeviceCooperativeMatrixPropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixPropertiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixPropertiesKHR>::value,\n                          \"PhysicalDeviceCooperativeMatrixPropertiesKHR is not nothrow_move_constructible!\" );\n\n//=== VK_QCOM_multiview_per_view_render_areas ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM ) ==\n                            sizeof( VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM>::value,\n                          \"PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM ) ==\n                            sizeof( VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM>::value,\n                          \"MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_compute_shader_derivatives ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceComputeShaderDerivativesFeaturesKHR ) ==\n                            sizeof( VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceComputeShaderDerivativesFeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceComputeShaderDerivativesFeaturesKHR>::value,\n                          \"PhysicalDeviceComputeShaderDerivativesFeaturesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceComputeShaderDerivativesPropertiesKHR ) ==\n                            sizeof( VkPhysicalDeviceComputeShaderDerivativesPropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceComputeShaderDerivativesPropertiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceComputeShaderDerivativesPropertiesKHR>::value,\n                          \"PhysicalDeviceComputeShaderDerivativesPropertiesKHR is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_video_decode_av1 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoDecodeAV1ProfileInfoKHR ) == sizeof( VkVideoDecodeAV1ProfileInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoDecodeAV1ProfileInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoDecodeAV1ProfileInfoKHR>::value,\n                          \"VideoDecodeAV1ProfileInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoDecodeAV1CapabilitiesKHR ) == sizeof( VkVideoDecodeAV1CapabilitiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoDecodeAV1CapabilitiesKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoDecodeAV1CapabilitiesKHR>::value,\n                          \"VideoDecodeAV1CapabilitiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoDecodeAV1SessionParametersCreateInfoKHR ) ==\n                            sizeof( VkVideoDecodeAV1SessionParametersCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoDecodeAV1SessionParametersCreateInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoDecodeAV1SessionParametersCreateInfoKHR>::value,\n                          \"VideoDecodeAV1SessionParametersCreateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoDecodeAV1PictureInfoKHR ) == sizeof( VkVideoDecodeAV1PictureInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoDecodeAV1PictureInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoDecodeAV1PictureInfoKHR>::value,\n                          \"VideoDecodeAV1PictureInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoDecodeAV1DpbSlotInfoKHR ) == sizeof( VkVideoDecodeAV1DpbSlotInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoDecodeAV1DpbSlotInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoDecodeAV1DpbSlotInfoKHR>::value,\n                          \"VideoDecodeAV1DpbSlotInfoKHR is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_video_encode_av1 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeAV1FeaturesKHR ) == sizeof( VkPhysicalDeviceVideoEncodeAV1FeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeAV1FeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeAV1FeaturesKHR>::value,\n                          \"PhysicalDeviceVideoEncodeAV1FeaturesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeAV1CapabilitiesKHR ) == sizeof( VkVideoEncodeAV1CapabilitiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeAV1CapabilitiesKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeAV1CapabilitiesKHR>::value,\n                          \"VideoEncodeAV1CapabilitiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeAV1QualityLevelPropertiesKHR ) == sizeof( VkVideoEncodeAV1QualityLevelPropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeAV1QualityLevelPropertiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeAV1QualityLevelPropertiesKHR>::value,\n                          \"VideoEncodeAV1QualityLevelPropertiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeAV1SessionCreateInfoKHR ) == sizeof( VkVideoEncodeAV1SessionCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeAV1SessionCreateInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeAV1SessionCreateInfoKHR>::value,\n                          \"VideoEncodeAV1SessionCreateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeAV1SessionParametersCreateInfoKHR ) ==\n                            sizeof( VkVideoEncodeAV1SessionParametersCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeAV1SessionParametersCreateInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeAV1SessionParametersCreateInfoKHR>::value,\n                          \"VideoEncodeAV1SessionParametersCreateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeAV1PictureInfoKHR ) == sizeof( VkVideoEncodeAV1PictureInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeAV1PictureInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeAV1PictureInfoKHR>::value,\n                          \"VideoEncodeAV1PictureInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeAV1DpbSlotInfoKHR ) == sizeof( VkVideoEncodeAV1DpbSlotInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeAV1DpbSlotInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeAV1DpbSlotInfoKHR>::value,\n                          \"VideoEncodeAV1DpbSlotInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeAV1ProfileInfoKHR ) == sizeof( VkVideoEncodeAV1ProfileInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeAV1ProfileInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeAV1ProfileInfoKHR>::value,\n                          \"VideoEncodeAV1ProfileInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeAV1QIndexKHR ) == sizeof( VkVideoEncodeAV1QIndexKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeAV1QIndexKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeAV1QIndexKHR>::value,\n                          \"VideoEncodeAV1QIndexKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeAV1FrameSizeKHR ) == sizeof( VkVideoEncodeAV1FrameSizeKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeAV1FrameSizeKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeAV1FrameSizeKHR>::value,\n                          \"VideoEncodeAV1FrameSizeKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeAV1GopRemainingFrameInfoKHR ) == sizeof( VkVideoEncodeAV1GopRemainingFrameInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeAV1GopRemainingFrameInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeAV1GopRemainingFrameInfoKHR>::value,\n                          \"VideoEncodeAV1GopRemainingFrameInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlInfoKHR ) == sizeof( VkVideoEncodeAV1RateControlInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlInfoKHR>::value,\n                          \"VideoEncodeAV1RateControlInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlLayerInfoKHR ) == sizeof( VkVideoEncodeAV1RateControlLayerInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlLayerInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlLayerInfoKHR>::value,\n                          \"VideoEncodeAV1RateControlLayerInfoKHR is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_video_maintenance1 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoMaintenance1FeaturesKHR ) == sizeof( VkPhysicalDeviceVideoMaintenance1FeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoMaintenance1FeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoMaintenance1FeaturesKHR>::value,\n                          \"PhysicalDeviceVideoMaintenance1FeaturesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoInlineQueryInfoKHR ) == sizeof( VkVideoInlineQueryInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoInlineQueryInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoInlineQueryInfoKHR>::value,\n                          \"VideoInlineQueryInfoKHR is not nothrow_move_constructible!\" );\n\n//=== VK_NV_per_stage_descriptor_set ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePerStageDescriptorSetFeaturesNV ) ==\n                            sizeof( VkPhysicalDevicePerStageDescriptorSetFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePerStageDescriptorSetFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePerStageDescriptorSetFeaturesNV>::value,\n                          \"PhysicalDevicePerStageDescriptorSetFeaturesNV is not nothrow_move_constructible!\" );\n\n//=== VK_QCOM_image_processing2 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessing2FeaturesQCOM ) == sizeof( VkPhysicalDeviceImageProcessing2FeaturesQCOM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessing2FeaturesQCOM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessing2FeaturesQCOM>::value,\n                          \"PhysicalDeviceImageProcessing2FeaturesQCOM is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessing2PropertiesQCOM ) ==\n                            sizeof( VkPhysicalDeviceImageProcessing2PropertiesQCOM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessing2PropertiesQCOM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessing2PropertiesQCOM>::value,\n                          \"PhysicalDeviceImageProcessing2PropertiesQCOM is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SamplerBlockMatchWindowCreateInfoQCOM ) == sizeof( VkSamplerBlockMatchWindowCreateInfoQCOM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SamplerBlockMatchWindowCreateInfoQCOM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SamplerBlockMatchWindowCreateInfoQCOM>::value,\n                          \"SamplerBlockMatchWindowCreateInfoQCOM is not nothrow_move_constructible!\" );\n\n//=== VK_QCOM_filter_cubic_weights ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceCubicWeightsFeaturesQCOM ) == sizeof( VkPhysicalDeviceCubicWeightsFeaturesQCOM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceCubicWeightsFeaturesQCOM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceCubicWeightsFeaturesQCOM>::value,\n                          \"PhysicalDeviceCubicWeightsFeaturesQCOM is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SamplerCubicWeightsCreateInfoQCOM ) == sizeof( VkSamplerCubicWeightsCreateInfoQCOM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SamplerCubicWeightsCreateInfoQCOM>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SamplerCubicWeightsCreateInfoQCOM>::value,\n                          \"SamplerCubicWeightsCreateInfoQCOM is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BlitImageCubicWeightsInfoQCOM ) == sizeof( VkBlitImageCubicWeightsInfoQCOM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BlitImageCubicWeightsInfoQCOM>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BlitImageCubicWeightsInfoQCOM>::value,\n                          \"BlitImageCubicWeightsInfoQCOM is not nothrow_move_constructible!\" );\n\n//=== VK_QCOM_ycbcr_degamma ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceYcbcrDegammaFeaturesQCOM ) == sizeof( VkPhysicalDeviceYcbcrDegammaFeaturesQCOM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceYcbcrDegammaFeaturesQCOM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceYcbcrDegammaFeaturesQCOM>::value,\n                          \"PhysicalDeviceYcbcrDegammaFeaturesQCOM is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM ) ==\n                            sizeof( VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM>::value,\n                          \"SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM is not nothrow_move_constructible!\" );\n\n//=== VK_QCOM_filter_cubic_clamp ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceCubicClampFeaturesQCOM ) == sizeof( VkPhysicalDeviceCubicClampFeaturesQCOM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceCubicClampFeaturesQCOM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceCubicClampFeaturesQCOM>::value,\n                          \"PhysicalDeviceCubicClampFeaturesQCOM is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_attachment_feedback_loop_dynamic_state ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT>::value,\n                          \"PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT is not nothrow_move_constructible!\" );\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n//=== VK_QNX_external_memory_screen_buffer ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ScreenBufferPropertiesQNX ) == sizeof( VkScreenBufferPropertiesQNX ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ScreenBufferPropertiesQNX>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ScreenBufferPropertiesQNX>::value,\n                          \"ScreenBufferPropertiesQNX is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ScreenBufferFormatPropertiesQNX ) == sizeof( VkScreenBufferFormatPropertiesQNX ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ScreenBufferFormatPropertiesQNX>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ScreenBufferFormatPropertiesQNX>::value,\n                          \"ScreenBufferFormatPropertiesQNX is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImportScreenBufferInfoQNX ) == sizeof( VkImportScreenBufferInfoQNX ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImportScreenBufferInfoQNX>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImportScreenBufferInfoQNX>::value,\n                          \"ImportScreenBufferInfoQNX is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ExternalFormatQNX ) == sizeof( VkExternalFormatQNX ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ExternalFormatQNX>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ExternalFormatQNX>::value,\n                          \"ExternalFormatQNX is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX ) ==\n                            sizeof( VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX>::value,\n                          \"PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n//=== VK_MSFT_layered_driver ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredDriverPropertiesMSFT ) == sizeof( VkPhysicalDeviceLayeredDriverPropertiesMSFT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredDriverPropertiesMSFT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredDriverPropertiesMSFT>::value,\n                          \"PhysicalDeviceLayeredDriverPropertiesMSFT is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_calibrated_timestamps ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR ) == sizeof( VkCalibratedTimestampInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR>::value,\n                          \"CalibratedTimestampInfoKHR is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_maintenance6 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::SetDescriptorBufferOffsetsInfoEXT ) == sizeof( VkSetDescriptorBufferOffsetsInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::SetDescriptorBufferOffsetsInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::SetDescriptorBufferOffsetsInfoEXT>::value,\n                          \"SetDescriptorBufferOffsetsInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BindDescriptorBufferEmbeddedSamplersInfoEXT ) ==\n                            sizeof( VkBindDescriptorBufferEmbeddedSamplersInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BindDescriptorBufferEmbeddedSamplersInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BindDescriptorBufferEmbeddedSamplersInfoEXT>::value,\n                          \"BindDescriptorBufferEmbeddedSamplersInfoEXT is not nothrow_move_constructible!\" );\n\n//=== VK_NV_descriptor_pool_overallocation ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorPoolOverallocationFeaturesNV ) ==\n                            sizeof( VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorPoolOverallocationFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorPoolOverallocationFeaturesNV>::value,\n                          \"PhysicalDeviceDescriptorPoolOverallocationFeaturesNV is not nothrow_move_constructible!\" );\n\n//=== VK_NV_display_stereo ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DisplaySurfaceStereoCreateInfoNV ) == sizeof( VkDisplaySurfaceStereoCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DisplaySurfaceStereoCreateInfoNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DisplaySurfaceStereoCreateInfoNV>::value,\n                          \"DisplaySurfaceStereoCreateInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DisplayModeStereoPropertiesNV ) == sizeof( VkDisplayModeStereoPropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DisplayModeStereoPropertiesNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DisplayModeStereoPropertiesNV>::value,\n                          \"DisplayModeStereoPropertiesNV is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_video_encode_quantization_map ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeQuantizationMapCapabilitiesKHR ) == sizeof( VkVideoEncodeQuantizationMapCapabilitiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeQuantizationMapCapabilitiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeQuantizationMapCapabilitiesKHR>::value,\n                          \"VideoEncodeQuantizationMapCapabilitiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoFormatQuantizationMapPropertiesKHR ) == sizeof( VkVideoFormatQuantizationMapPropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoFormatQuantizationMapPropertiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoFormatQuantizationMapPropertiesKHR>::value,\n                          \"VideoFormatQuantizationMapPropertiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeQuantizationMapInfoKHR ) == sizeof( VkVideoEncodeQuantizationMapInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeQuantizationMapInfoKHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeQuantizationMapInfoKHR>::value,\n                          \"VideoEncodeQuantizationMapInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeQuantizationMapSessionParametersCreateInfoKHR ) ==\n                            sizeof( VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeQuantizationMapSessionParametersCreateInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeQuantizationMapSessionParametersCreateInfoKHR>::value,\n                          \"VideoEncodeQuantizationMapSessionParametersCreateInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR ) ==\n                            sizeof( VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR>::value,\n                          \"PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH264QuantizationMapCapabilitiesKHR ) ==\n                            sizeof( VkVideoEncodeH264QuantizationMapCapabilitiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH264QuantizationMapCapabilitiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH264QuantizationMapCapabilitiesKHR>::value,\n                          \"VideoEncodeH264QuantizationMapCapabilitiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeH265QuantizationMapCapabilitiesKHR ) ==\n                            sizeof( VkVideoEncodeH265QuantizationMapCapabilitiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeH265QuantizationMapCapabilitiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeH265QuantizationMapCapabilitiesKHR>::value,\n                          \"VideoEncodeH265QuantizationMapCapabilitiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoFormatH265QuantizationMapPropertiesKHR ) ==\n                            sizeof( VkVideoFormatH265QuantizationMapPropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoFormatH265QuantizationMapPropertiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoFormatH265QuantizationMapPropertiesKHR>::value,\n                          \"VideoFormatH265QuantizationMapPropertiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoEncodeAV1QuantizationMapCapabilitiesKHR ) ==\n                            sizeof( VkVideoEncodeAV1QuantizationMapCapabilitiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoEncodeAV1QuantizationMapCapabilitiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoEncodeAV1QuantizationMapCapabilitiesKHR>::value,\n                          \"VideoEncodeAV1QuantizationMapCapabilitiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoFormatAV1QuantizationMapPropertiesKHR ) == sizeof( VkVideoFormatAV1QuantizationMapPropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoFormatAV1QuantizationMapPropertiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoFormatAV1QuantizationMapPropertiesKHR>::value,\n                          \"VideoFormatAV1QuantizationMapPropertiesKHR is not nothrow_move_constructible!\" );\n\n//=== VK_NV_raw_access_chains ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceRawAccessChainsFeaturesNV ) == sizeof( VkPhysicalDeviceRawAccessChainsFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceRawAccessChainsFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceRawAccessChainsFeaturesNV>::value,\n                          \"PhysicalDeviceRawAccessChainsFeaturesNV is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_shader_relaxed_extended_instruction ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR ) ==\n                            sizeof( VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR>::value,\n                          \"PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR is not nothrow_move_constructible!\" );\n\n//=== VK_NV_command_buffer_inheritance ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceCommandBufferInheritanceFeaturesNV ) ==\n                            sizeof( VkPhysicalDeviceCommandBufferInheritanceFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceCommandBufferInheritanceFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceCommandBufferInheritanceFeaturesNV>::value,\n                          \"PhysicalDeviceCommandBufferInheritanceFeaturesNV is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_maintenance7 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance7FeaturesKHR ) == sizeof( VkPhysicalDeviceMaintenance7FeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance7FeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance7FeaturesKHR>::value,\n                          \"PhysicalDeviceMaintenance7FeaturesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance7PropertiesKHR ) == sizeof( VkPhysicalDeviceMaintenance7PropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance7PropertiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance7PropertiesKHR>::value,\n                          \"PhysicalDeviceMaintenance7PropertiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiPropertiesListKHR ) == sizeof( VkPhysicalDeviceLayeredApiPropertiesListKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiPropertiesListKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiPropertiesListKHR>::value,\n                          \"PhysicalDeviceLayeredApiPropertiesListKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiPropertiesKHR ) == sizeof( VkPhysicalDeviceLayeredApiPropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiPropertiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiPropertiesKHR>::value,\n                          \"PhysicalDeviceLayeredApiPropertiesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiVulkanPropertiesKHR ) ==\n                            sizeof( VkPhysicalDeviceLayeredApiVulkanPropertiesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiVulkanPropertiesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiVulkanPropertiesKHR>::value,\n                          \"PhysicalDeviceLayeredApiVulkanPropertiesKHR is not nothrow_move_constructible!\" );\n\n//=== VK_NV_shader_atomic_float16_vector ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV ) ==\n                            sizeof( VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV>::value,\n                          \"PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_shader_replicated_composites ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderReplicatedCompositesFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderReplicatedCompositesFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderReplicatedCompositesFeaturesEXT>::value,\n                          \"PhysicalDeviceShaderReplicatedCompositesFeaturesEXT is not nothrow_move_constructible!\" );\n\n//=== VK_NV_ray_tracing_validation ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingValidationFeaturesNV ) ==\n                            sizeof( VkPhysicalDeviceRayTracingValidationFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingValidationFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingValidationFeaturesNV>::value,\n                          \"PhysicalDeviceRayTracingValidationFeaturesNV is not nothrow_move_constructible!\" );\n\n//=== VK_NV_cluster_acceleration_structure ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterAccelerationStructureFeaturesNV ) ==\n                            sizeof( VkPhysicalDeviceClusterAccelerationStructureFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterAccelerationStructureFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterAccelerationStructureFeaturesNV>::value,\n                          \"PhysicalDeviceClusterAccelerationStructureFeaturesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterAccelerationStructurePropertiesNV ) ==\n                            sizeof( VkPhysicalDeviceClusterAccelerationStructurePropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterAccelerationStructurePropertiesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterAccelerationStructurePropertiesNV>::value,\n                          \"PhysicalDeviceClusterAccelerationStructurePropertiesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureClustersBottomLevelInputNV ) ==\n                            sizeof( VkClusterAccelerationStructureClustersBottomLevelInputNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureClustersBottomLevelInputNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureClustersBottomLevelInputNV>::value,\n                          \"ClusterAccelerationStructureClustersBottomLevelInputNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureTriangleClusterInputNV ) ==\n                            sizeof( VkClusterAccelerationStructureTriangleClusterInputNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureTriangleClusterInputNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureTriangleClusterInputNV>::value,\n                          \"ClusterAccelerationStructureTriangleClusterInputNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureMoveObjectsInputNV ) ==\n                            sizeof( VkClusterAccelerationStructureMoveObjectsInputNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureMoveObjectsInputNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureMoveObjectsInputNV>::value,\n                          \"ClusterAccelerationStructureMoveObjectsInputNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureOpInputNV ) == sizeof( VkClusterAccelerationStructureOpInputNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureOpInputNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureOpInputNV>::value,\n                          \"ClusterAccelerationStructureOpInputNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureInputInfoNV ) == sizeof( VkClusterAccelerationStructureInputInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureInputInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureInputInfoNV>::value,\n                          \"ClusterAccelerationStructureInputInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureCommandsInfoNV ) == sizeof( VkClusterAccelerationStructureCommandsInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureCommandsInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureCommandsInfoNV>::value,\n                          \"ClusterAccelerationStructureCommandsInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::StridedDeviceAddressNV ) == sizeof( VkStridedDeviceAddressNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::StridedDeviceAddressNV>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::StridedDeviceAddressNV>::value,\n                          \"StridedDeviceAddressNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV ) ==\n                            sizeof( VkClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV>::value,\n                          \"ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureMoveObjectsInfoNV ) ==\n                            sizeof( VkClusterAccelerationStructureMoveObjectsInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureMoveObjectsInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureMoveObjectsInfoNV>::value,\n                          \"ClusterAccelerationStructureMoveObjectsInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureBuildClustersBottomLevelInfoNV ) ==\n                            sizeof( VkClusterAccelerationStructureBuildClustersBottomLevelInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureBuildClustersBottomLevelInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureBuildClustersBottomLevelInfoNV>::value,\n                          \"ClusterAccelerationStructureBuildClustersBottomLevelInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureBuildTriangleClusterInfoNV ) ==\n                            sizeof( VkClusterAccelerationStructureBuildTriangleClusterInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureBuildTriangleClusterInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureBuildTriangleClusterInfoNV>::value,\n                          \"ClusterAccelerationStructureBuildTriangleClusterInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV ) ==\n                            sizeof( VkClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV>::value,\n                          \"ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureInstantiateClusterInfoNV ) ==\n                            sizeof( VkClusterAccelerationStructureInstantiateClusterInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureInstantiateClusterInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureInstantiateClusterInfoNV>::value,\n                          \"ClusterAccelerationStructureInstantiateClusterInfoNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::RayTracingPipelineClusterAccelerationStructureCreateInfoNV ) ==\n                            sizeof( VkRayTracingPipelineClusterAccelerationStructureCreateInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::RayTracingPipelineClusterAccelerationStructureCreateInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::RayTracingPipelineClusterAccelerationStructureCreateInfoNV>::value,\n                          \"RayTracingPipelineClusterAccelerationStructureCreateInfoNV is not nothrow_move_constructible!\" );\n\n//=== VK_NV_partitioned_acceleration_structure ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePartitionedAccelerationStructureFeaturesNV ) ==\n                            sizeof( VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePartitionedAccelerationStructureFeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePartitionedAccelerationStructureFeaturesNV>::value,\n                          \"PhysicalDevicePartitionedAccelerationStructureFeaturesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePartitionedAccelerationStructurePropertiesNV ) ==\n                            sizeof( VkPhysicalDevicePartitionedAccelerationStructurePropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePartitionedAccelerationStructurePropertiesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePartitionedAccelerationStructurePropertiesNV>::value,\n                          \"PhysicalDevicePartitionedAccelerationStructurePropertiesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureFlagsNV ) == sizeof( VkPartitionedAccelerationStructureFlagsNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureFlagsNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureFlagsNV>::value,\n                          \"PartitionedAccelerationStructureFlagsNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BuildPartitionedAccelerationStructureIndirectCommandNV ) ==\n                            sizeof( VkBuildPartitionedAccelerationStructureIndirectCommandNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BuildPartitionedAccelerationStructureIndirectCommandNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BuildPartitionedAccelerationStructureIndirectCommandNV>::value,\n                          \"BuildPartitionedAccelerationStructureIndirectCommandNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureWriteInstanceDataNV ) ==\n                            sizeof( VkPartitionedAccelerationStructureWriteInstanceDataNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureWriteInstanceDataNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureWriteInstanceDataNV>::value,\n                          \"PartitionedAccelerationStructureWriteInstanceDataNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureUpdateInstanceDataNV ) ==\n                            sizeof( VkPartitionedAccelerationStructureUpdateInstanceDataNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureUpdateInstanceDataNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureUpdateInstanceDataNV>::value,\n                          \"PartitionedAccelerationStructureUpdateInstanceDataNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureWritePartitionTranslationDataNV ) ==\n                            sizeof( VkPartitionedAccelerationStructureWritePartitionTranslationDataNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureWritePartitionTranslationDataNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureWritePartitionTranslationDataNV>::value,\n                          \"PartitionedAccelerationStructureWritePartitionTranslationDataNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::WriteDescriptorSetPartitionedAccelerationStructureNV ) ==\n                            sizeof( VkWriteDescriptorSetPartitionedAccelerationStructureNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::WriteDescriptorSetPartitionedAccelerationStructureNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::WriteDescriptorSetPartitionedAccelerationStructureNV>::value,\n                          \"WriteDescriptorSetPartitionedAccelerationStructureNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureInstancesInputNV ) ==\n                            sizeof( VkPartitionedAccelerationStructureInstancesInputNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureInstancesInputNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureInstancesInputNV>::value,\n                          \"PartitionedAccelerationStructureInstancesInputNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BuildPartitionedAccelerationStructureInfoNV ) ==\n                            sizeof( VkBuildPartitionedAccelerationStructureInfoNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BuildPartitionedAccelerationStructureInfoNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BuildPartitionedAccelerationStructureInfoNV>::value,\n                          \"BuildPartitionedAccelerationStructureInfoNV is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_device_generated_commands ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT>::value,\n                          \"PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT ) ==\n                            sizeof( VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT>::value,\n                          \"PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoEXT ) == sizeof( VkGeneratedCommandsMemoryRequirementsInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoEXT>::value,\n                          \"GeneratedCommandsMemoryRequirementsInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::IndirectExecutionSetCreateInfoEXT ) == sizeof( VkIndirectExecutionSetCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::IndirectExecutionSetCreateInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::IndirectExecutionSetCreateInfoEXT>::value,\n                          \"IndirectExecutionSetCreateInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::IndirectExecutionSetInfoEXT ) == sizeof( VkIndirectExecutionSetInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::IndirectExecutionSetInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::IndirectExecutionSetInfoEXT>::value,\n                          \"IndirectExecutionSetInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::IndirectExecutionSetPipelineInfoEXT ) == sizeof( VkIndirectExecutionSetPipelineInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::IndirectExecutionSetPipelineInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::IndirectExecutionSetPipelineInfoEXT>::value,\n                          \"IndirectExecutionSetPipelineInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::IndirectExecutionSetShaderInfoEXT ) == sizeof( VkIndirectExecutionSetShaderInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::IndirectExecutionSetShaderInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::IndirectExecutionSetShaderInfoEXT>::value,\n                          \"IndirectExecutionSetShaderInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoEXT ) == sizeof( VkGeneratedCommandsInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoEXT>::value,\n                          \"GeneratedCommandsInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetPipelineEXT ) == sizeof( VkWriteIndirectExecutionSetPipelineEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetPipelineEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetPipelineEXT>::value,\n                          \"WriteIndirectExecutionSetPipelineEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoEXT ) == sizeof( VkIndirectCommandsLayoutCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoEXT>::value,\n                          \"IndirectCommandsLayoutCreateInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenEXT ) == sizeof( VkIndirectCommandsLayoutTokenEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenEXT>::value,\n                          \"IndirectCommandsLayoutTokenEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DrawIndirectCountIndirectCommandEXT ) == sizeof( VkDrawIndirectCountIndirectCommandEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DrawIndirectCountIndirectCommandEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DrawIndirectCountIndirectCommandEXT>::value,\n                          \"DrawIndirectCountIndirectCommandEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::IndirectCommandsVertexBufferTokenEXT ) == sizeof( VkIndirectCommandsVertexBufferTokenEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::IndirectCommandsVertexBufferTokenEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::IndirectCommandsVertexBufferTokenEXT>::value,\n                          \"IndirectCommandsVertexBufferTokenEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BindVertexBufferIndirectCommandEXT ) == sizeof( VkBindVertexBufferIndirectCommandEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BindVertexBufferIndirectCommandEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BindVertexBufferIndirectCommandEXT>::value,\n                          \"BindVertexBufferIndirectCommandEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::IndirectCommandsIndexBufferTokenEXT ) == sizeof( VkIndirectCommandsIndexBufferTokenEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::IndirectCommandsIndexBufferTokenEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::IndirectCommandsIndexBufferTokenEXT>::value,\n                          \"IndirectCommandsIndexBufferTokenEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::BindIndexBufferIndirectCommandEXT ) == sizeof( VkBindIndexBufferIndirectCommandEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::BindIndexBufferIndirectCommandEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::BindIndexBufferIndirectCommandEXT>::value,\n                          \"BindIndexBufferIndirectCommandEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::IndirectCommandsPushConstantTokenEXT ) == sizeof( VkIndirectCommandsPushConstantTokenEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::IndirectCommandsPushConstantTokenEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::IndirectCommandsPushConstantTokenEXT>::value,\n                          \"IndirectCommandsPushConstantTokenEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::IndirectCommandsExecutionSetTokenEXT ) == sizeof( VkIndirectCommandsExecutionSetTokenEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::IndirectCommandsExecutionSetTokenEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::IndirectCommandsExecutionSetTokenEXT>::value,\n                          \"IndirectCommandsExecutionSetTokenEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::IndirectCommandsTokenDataEXT ) == sizeof( VkIndirectCommandsTokenDataEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::IndirectCommandsTokenDataEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::IndirectCommandsTokenDataEXT>::value,\n                          \"IndirectCommandsTokenDataEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT ) == sizeof( VkIndirectCommandsLayoutEXT ),\n                          \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT>::value,\n                          \"IndirectCommandsLayoutEXT is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT>::value,\n                          \"IndirectCommandsLayoutEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT ) == sizeof( VkIndirectExecutionSetEXT ),\n                          \"handle and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_copy_constructible<VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT>::value,\n                          \"IndirectExecutionSetEXT is not copy_constructible!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT>::value,\n                          \"IndirectExecutionSetEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::IndirectExecutionSetShaderLayoutInfoEXT ) == sizeof( VkIndirectExecutionSetShaderLayoutInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::IndirectExecutionSetShaderLayoutInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::IndirectExecutionSetShaderLayoutInfoEXT>::value,\n                          \"IndirectExecutionSetShaderLayoutInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::GeneratedCommandsPipelineInfoEXT ) == sizeof( VkGeneratedCommandsPipelineInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::GeneratedCommandsPipelineInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::GeneratedCommandsPipelineInfoEXT>::value,\n                          \"GeneratedCommandsPipelineInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::GeneratedCommandsShaderInfoEXT ) == sizeof( VkGeneratedCommandsShaderInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::GeneratedCommandsShaderInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::GeneratedCommandsShaderInfoEXT>::value,\n                          \"GeneratedCommandsShaderInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetShaderEXT ) == sizeof( VkWriteIndirectExecutionSetShaderEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetShaderEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetShaderEXT>::value,\n                          \"WriteIndirectExecutionSetShaderEXT is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_maintenance8 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance8FeaturesKHR ) == sizeof( VkPhysicalDeviceMaintenance8FeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance8FeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance8FeaturesKHR>::value,\n                          \"PhysicalDeviceMaintenance8FeaturesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryBarrierAccessFlags3KHR ) == sizeof( VkMemoryBarrierAccessFlags3KHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryBarrierAccessFlags3KHR>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryBarrierAccessFlags3KHR>::value,\n                          \"MemoryBarrierAccessFlags3KHR is not nothrow_move_constructible!\" );\n\n//=== VK_MESA_image_alignment_control ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageAlignmentControlFeaturesMESA ) ==\n                            sizeof( VkPhysicalDeviceImageAlignmentControlFeaturesMESA ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageAlignmentControlFeaturesMESA>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageAlignmentControlFeaturesMESA>::value,\n                          \"PhysicalDeviceImageAlignmentControlFeaturesMESA is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceImageAlignmentControlPropertiesMESA ) ==\n                            sizeof( VkPhysicalDeviceImageAlignmentControlPropertiesMESA ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageAlignmentControlPropertiesMESA>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageAlignmentControlPropertiesMESA>::value,\n                          \"PhysicalDeviceImageAlignmentControlPropertiesMESA is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImageAlignmentControlCreateInfoMESA ) == sizeof( VkImageAlignmentControlCreateInfoMESA ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImageAlignmentControlCreateInfoMESA>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImageAlignmentControlCreateInfoMESA>::value,\n                          \"ImageAlignmentControlCreateInfoMESA is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_depth_clamp_control ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClampControlFeaturesEXT ) == sizeof( VkPhysicalDeviceDepthClampControlFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClampControlFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClampControlFeaturesEXT>::value,\n                          \"PhysicalDeviceDepthClampControlFeaturesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PipelineViewportDepthClampControlCreateInfoEXT ) ==\n                            sizeof( VkPipelineViewportDepthClampControlCreateInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PipelineViewportDepthClampControlCreateInfoEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PipelineViewportDepthClampControlCreateInfoEXT>::value,\n                          \"PipelineViewportDepthClampControlCreateInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::DepthClampRangeEXT ) == sizeof( VkDepthClampRangeEXT ), \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::DepthClampRangeEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::DepthClampRangeEXT>::value,\n                          \"DepthClampRangeEXT is not nothrow_move_constructible!\" );\n\n//=== VK_KHR_video_maintenance2 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoMaintenance2FeaturesKHR ) == sizeof( VkPhysicalDeviceVideoMaintenance2FeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoMaintenance2FeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoMaintenance2FeaturesKHR>::value,\n                          \"PhysicalDeviceVideoMaintenance2FeaturesKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoDecodeH264InlineSessionParametersInfoKHR ) ==\n                            sizeof( VkVideoDecodeH264InlineSessionParametersInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoDecodeH264InlineSessionParametersInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoDecodeH264InlineSessionParametersInfoKHR>::value,\n                          \"VideoDecodeH264InlineSessionParametersInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoDecodeH265InlineSessionParametersInfoKHR ) ==\n                            sizeof( VkVideoDecodeH265InlineSessionParametersInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoDecodeH265InlineSessionParametersInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoDecodeH265InlineSessionParametersInfoKHR>::value,\n                          \"VideoDecodeH265InlineSessionParametersInfoKHR is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::VideoDecodeAV1InlineSessionParametersInfoKHR ) ==\n                            sizeof( VkVideoDecodeAV1InlineSessionParametersInfoKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::VideoDecodeAV1InlineSessionParametersInfoKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::VideoDecodeAV1InlineSessionParametersInfoKHR>::value,\n                          \"VideoDecodeAV1InlineSessionParametersInfoKHR is not nothrow_move_constructible!\" );\n\n//=== VK_HUAWEI_hdr_vivid ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceHdrVividFeaturesHUAWEI ) == sizeof( VkPhysicalDeviceHdrVividFeaturesHUAWEI ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceHdrVividFeaturesHUAWEI>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceHdrVividFeaturesHUAWEI>::value,\n                          \"PhysicalDeviceHdrVividFeaturesHUAWEI is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::HdrVividDynamicMetadataHUAWEI ) == sizeof( VkHdrVividDynamicMetadataHUAWEI ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::HdrVividDynamicMetadataHUAWEI>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::HdrVividDynamicMetadataHUAWEI>::value,\n                          \"HdrVividDynamicMetadataHUAWEI is not nothrow_move_constructible!\" );\n\n//=== VK_NV_cooperative_matrix2 ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::CooperativeMatrixFlexibleDimensionsPropertiesNV ) ==\n                            sizeof( VkCooperativeMatrixFlexibleDimensionsPropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::CooperativeMatrixFlexibleDimensionsPropertiesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::CooperativeMatrixFlexibleDimensionsPropertiesNV>::value,\n                          \"CooperativeMatrixFlexibleDimensionsPropertiesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrix2FeaturesNV ) == sizeof( VkPhysicalDeviceCooperativeMatrix2FeaturesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrix2FeaturesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrix2FeaturesNV>::value,\n                          \"PhysicalDeviceCooperativeMatrix2FeaturesNV is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrix2PropertiesNV ) ==\n                            sizeof( VkPhysicalDeviceCooperativeMatrix2PropertiesNV ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrix2PropertiesNV>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrix2PropertiesNV>::value,\n                          \"PhysicalDeviceCooperativeMatrix2PropertiesNV is not nothrow_move_constructible!\" );\n\n//=== VK_ARM_pipeline_opacity_micromap ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineOpacityMicromapFeaturesARM ) ==\n                            sizeof( VkPhysicalDevicePipelineOpacityMicromapFeaturesARM ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineOpacityMicromapFeaturesARM>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineOpacityMicromapFeaturesARM>::value,\n                          \"PhysicalDevicePipelineOpacityMicromapFeaturesARM is not nothrow_move_constructible!\" );\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n//=== VK_EXT_external_memory_metal ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::ImportMemoryMetalHandleInfoEXT ) == sizeof( VkImportMemoryMetalHandleInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::ImportMemoryMetalHandleInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::ImportMemoryMetalHandleInfoEXT>::value,\n                          \"ImportMemoryMetalHandleInfoEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryMetalHandlePropertiesEXT ) == sizeof( VkMemoryMetalHandlePropertiesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryMetalHandlePropertiesEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryMetalHandlePropertiesEXT>::value,\n                          \"MemoryMetalHandlePropertiesEXT is not nothrow_move_constructible!\" );\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::MemoryGetMetalHandleInfoEXT ) == sizeof( VkMemoryGetMetalHandleInfoEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::MemoryGetMetalHandleInfoEXT>::value, \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::MemoryGetMetalHandleInfoEXT>::value,\n                          \"MemoryGetMetalHandleInfoEXT is not nothrow_move_constructible!\" );\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n//=== VK_KHR_depth_clamp_zero_one ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClampZeroOneFeaturesKHR ) == sizeof( VkPhysicalDeviceDepthClampZeroOneFeaturesKHR ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClampZeroOneFeaturesKHR>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClampZeroOneFeaturesKHR>::value,\n                          \"PhysicalDeviceDepthClampZeroOneFeaturesKHR is not nothrow_move_constructible!\" );\n\n//=== VK_EXT_vertex_attribute_robustness ===\n\nVULKAN_HPP_STATIC_ASSERT( sizeof( VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeRobustnessFeaturesEXT ) ==\n                            sizeof( VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT ),\n                          \"struct and wrapper have different size!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_standard_layout<VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeRobustnessFeaturesEXT>::value,\n                          \"struct wrapper is not a standard layout!\" );\nVULKAN_HPP_STATIC_ASSERT( std::is_nothrow_move_constructible<VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeRobustnessFeaturesEXT>::value,\n                          \"PhysicalDeviceVertexAttributeRobustnessFeaturesEXT is not nothrow_move_constructible!\" );\n\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_structs.hpp",
    "content": "// Copyright 2015-2025 The Khronos Group Inc.\n//\n// SPDX-License-Identifier: Apache-2.0 OR MIT\n//\n\n// This header is generated from the Khronos Vulkan XML API Registry.\n\n#ifndef VULKAN_STRUCTS_HPP\n#define VULKAN_STRUCTS_HPP\n\n// include-what-you-use: make sure, vulkan.hpp is used by code-completers\n// IWYU pragma: private; include \"vulkan.hpp\"\n\n#include <cstring>  // strcmp\n\nnamespace VULKAN_HPP_NAMESPACE\n{\n\n  //===============\n  //=== STRUCTS ===\n  //===============\n\n  struct AabbPositionsKHR\n  {\n    using NativeType = VkAabbPositionsKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      AabbPositionsKHR( float minX_ = {}, float minY_ = {}, float minZ_ = {}, float maxX_ = {}, float maxY_ = {}, float maxZ_ = {} ) VULKAN_HPP_NOEXCEPT\n      : minX{ minX_ }\n      , minY{ minY_ }\n      , minZ{ minZ_ }\n      , maxX{ maxX_ }\n      , maxY{ maxY_ }\n      , maxZ{ maxZ_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AabbPositionsKHR( AabbPositionsKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AabbPositionsKHR( VkAabbPositionsKHR const & rhs ) VULKAN_HPP_NOEXCEPT : AabbPositionsKHR( *reinterpret_cast<AabbPositionsKHR const *>( &rhs ) ) {}\n\n    AabbPositionsKHR & operator=( AabbPositionsKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AabbPositionsKHR & operator=( VkAabbPositionsKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AabbPositionsKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AabbPositionsKHR & setMinX( float minX_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minX = minX_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AabbPositionsKHR & setMinY( float minY_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minY = minY_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AabbPositionsKHR & setMinZ( float minZ_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minZ = minZ_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AabbPositionsKHR & setMaxX( float maxX_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxX = maxX_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AabbPositionsKHR & setMaxY( float maxY_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxY = maxY_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AabbPositionsKHR & setMaxZ( float maxZ_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxZ = maxZ_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAabbPositionsKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAabbPositionsKHR *>( this );\n    }\n\n    operator VkAabbPositionsKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAabbPositionsKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<float const &, float const &, float const &, float const &, float const &, float const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( minX, minY, minZ, maxX, maxY, maxZ );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AabbPositionsKHR const & ) const = default;\n#else\n    bool operator==( AabbPositionsKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( minX == rhs.minX ) && ( minY == rhs.minY ) && ( minZ == rhs.minZ ) && ( maxX == rhs.maxX ) && ( maxY == rhs.maxY ) && ( maxZ == rhs.maxZ );\n#  endif\n    }\n\n    bool operator!=( AabbPositionsKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    float minX = {};\n    float minY = {};\n    float minZ = {};\n    float maxX = {};\n    float maxY = {};\n    float maxZ = {};\n  };\n\n  using AabbPositionsNV = AabbPositionsKHR;\n\n  union DeviceOrHostAddressConstKHR\n  {\n    using NativeType = VkDeviceOrHostAddressConstKHR;\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceOrHostAddressConstKHR( VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress_ = {} ) : deviceAddress( deviceAddress_ ) {}\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceOrHostAddressConstKHR( const void * hostAddress_ ) : hostAddress( hostAddress_ ) {}\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_UNION_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceOrHostAddressConstKHR & setDeviceAddress( VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceAddress = deviceAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceOrHostAddressConstKHR & setHostAddress( const void * hostAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      hostAddress = hostAddress_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceOrHostAddressConstKHR const &() const\n    {\n      return *reinterpret_cast<const VkDeviceOrHostAddressConstKHR *>( this );\n    }\n\n    operator VkDeviceOrHostAddressConstKHR &()\n    {\n      return *reinterpret_cast<VkDeviceOrHostAddressConstKHR *>( this );\n    }\n\n#ifdef VULKAN_HPP_HAS_UNRESTRICTED_UNIONS\n    VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress;\n    const void *                        hostAddress;\n#else\n    VkDeviceAddress                                 deviceAddress;\n    const void *                                    hostAddress;\n#endif /*VULKAN_HPP_HAS_UNRESTRICTED_UNIONS*/\n  };\n\n  struct AccelerationStructureGeometryTrianglesDataKHR\n  {\n    using NativeType = VkAccelerationStructureGeometryTrianglesDataKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAccelerationStructureGeometryTrianglesDataKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14\n      AccelerationStructureGeometryTrianglesDataKHR( VULKAN_HPP_NAMESPACE::Format                      vertexFormat_ = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                                     VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR vertexData_   = {},\n                                                     VULKAN_HPP_NAMESPACE::DeviceSize                  vertexStride_ = {},\n                                                     uint32_t                                          maxVertex_    = {},\n                                                     VULKAN_HPP_NAMESPACE::IndexType                   indexType_    = VULKAN_HPP_NAMESPACE::IndexType::eUint16,\n                                                     VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR indexData_    = {},\n                                                     VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR transformData_ = {},\n                                                     const void *                                      pNext_         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , vertexFormat{ vertexFormat_ }\n      , vertexData{ vertexData_ }\n      , vertexStride{ vertexStride_ }\n      , maxVertex{ maxVertex_ }\n      , indexType{ indexType_ }\n      , indexData{ indexData_ }\n      , transformData{ transformData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14\n      AccelerationStructureGeometryTrianglesDataKHR( AccelerationStructureGeometryTrianglesDataKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureGeometryTrianglesDataKHR( VkAccelerationStructureGeometryTrianglesDataKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureGeometryTrianglesDataKHR( *reinterpret_cast<AccelerationStructureGeometryTrianglesDataKHR const *>( &rhs ) )\n    {\n    }\n\n    AccelerationStructureGeometryTrianglesDataKHR & operator=( AccelerationStructureGeometryTrianglesDataKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureGeometryTrianglesDataKHR & operator=( VkAccelerationStructureGeometryTrianglesDataKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryTrianglesDataKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryTrianglesDataKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryTrianglesDataKHR & setVertexFormat( VULKAN_HPP_NAMESPACE::Format vertexFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexFormat = vertexFormat_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryTrianglesDataKHR &\n      setVertexData( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & vertexData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexData = vertexData_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryTrianglesDataKHR &\n      setVertexStride( VULKAN_HPP_NAMESPACE::DeviceSize vertexStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexStride = vertexStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryTrianglesDataKHR & setMaxVertex( uint32_t maxVertex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxVertex = maxVertex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryTrianglesDataKHR & setIndexType( VULKAN_HPP_NAMESPACE::IndexType indexType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexType = indexType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryTrianglesDataKHR &\n      setIndexData( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & indexData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexData = indexData_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryTrianglesDataKHR &\n      setTransformData( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & transformData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      transformData = transformData_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureGeometryTrianglesDataKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureGeometryTrianglesDataKHR *>( this );\n    }\n\n    operator VkAccelerationStructureGeometryTrianglesDataKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureGeometryTrianglesDataKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::IndexType const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, vertexFormat, vertexData, vertexStride, maxVertex, indexType, indexData, transformData );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType         = StructureType::eAccelerationStructureGeometryTrianglesDataKHR;\n    const void *                                      pNext         = {};\n    VULKAN_HPP_NAMESPACE::Format                      vertexFormat  = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR vertexData    = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                  vertexStride  = {};\n    uint32_t                                          maxVertex     = {};\n    VULKAN_HPP_NAMESPACE::IndexType                   indexType     = VULKAN_HPP_NAMESPACE::IndexType::eUint16;\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR indexData     = {};\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR transformData = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAccelerationStructureGeometryTrianglesDataKHR>\n  {\n    using Type = AccelerationStructureGeometryTrianglesDataKHR;\n  };\n\n  struct AccelerationStructureGeometryAabbsDataKHR\n  {\n    using NativeType = VkAccelerationStructureGeometryAabbsDataKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAccelerationStructureGeometryAabbsDataKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryAabbsDataKHR( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR data_   = {},\n                                                                       VULKAN_HPP_NAMESPACE::DeviceSize                  stride_ = {},\n                                                                       const void *                                      pNext_  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , data{ data_ }\n      , stride{ stride_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryAabbsDataKHR( AccelerationStructureGeometryAabbsDataKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureGeometryAabbsDataKHR( VkAccelerationStructureGeometryAabbsDataKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureGeometryAabbsDataKHR( *reinterpret_cast<AccelerationStructureGeometryAabbsDataKHR const *>( &rhs ) )\n    {\n    }\n\n    AccelerationStructureGeometryAabbsDataKHR & operator=( AccelerationStructureGeometryAabbsDataKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureGeometryAabbsDataKHR & operator=( VkAccelerationStructureGeometryAabbsDataKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryAabbsDataKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryAabbsDataKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryAabbsDataKHR &\n      setData( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & data_ ) VULKAN_HPP_NOEXCEPT\n    {\n      data = data_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryAabbsDataKHR & setStride( VULKAN_HPP_NAMESPACE::DeviceSize stride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stride = stride_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureGeometryAabbsDataKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureGeometryAabbsDataKHR *>( this );\n    }\n\n    operator VkAccelerationStructureGeometryAabbsDataKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureGeometryAabbsDataKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, data, stride );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType  = StructureType::eAccelerationStructureGeometryAabbsDataKHR;\n    const void *                                      pNext  = {};\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR data   = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                  stride = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAccelerationStructureGeometryAabbsDataKHR>\n  {\n    using Type = AccelerationStructureGeometryAabbsDataKHR;\n  };\n\n  struct AccelerationStructureGeometryInstancesDataKHR\n  {\n    using NativeType = VkAccelerationStructureGeometryInstancesDataKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAccelerationStructureGeometryInstancesDataKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryInstancesDataKHR( VULKAN_HPP_NAMESPACE::Bool32                      arrayOfPointers_ = {},\n                                                                           VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR data_            = {},\n                                                                           const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , arrayOfPointers{ arrayOfPointers_ }\n      , data{ data_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14\n      AccelerationStructureGeometryInstancesDataKHR( AccelerationStructureGeometryInstancesDataKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureGeometryInstancesDataKHR( VkAccelerationStructureGeometryInstancesDataKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureGeometryInstancesDataKHR( *reinterpret_cast<AccelerationStructureGeometryInstancesDataKHR const *>( &rhs ) )\n    {\n    }\n\n    AccelerationStructureGeometryInstancesDataKHR & operator=( AccelerationStructureGeometryInstancesDataKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureGeometryInstancesDataKHR & operator=( VkAccelerationStructureGeometryInstancesDataKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryInstancesDataKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryInstancesDataKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryInstancesDataKHR &\n      setArrayOfPointers( VULKAN_HPP_NAMESPACE::Bool32 arrayOfPointers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      arrayOfPointers = arrayOfPointers_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryInstancesDataKHR &\n      setData( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & data_ ) VULKAN_HPP_NOEXCEPT\n    {\n      data = data_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureGeometryInstancesDataKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureGeometryInstancesDataKHR *>( this );\n    }\n\n    operator VkAccelerationStructureGeometryInstancesDataKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureGeometryInstancesDataKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, arrayOfPointers, data );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType           = StructureType::eAccelerationStructureGeometryInstancesDataKHR;\n    const void *                                      pNext           = {};\n    VULKAN_HPP_NAMESPACE::Bool32                      arrayOfPointers = {};\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR data            = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAccelerationStructureGeometryInstancesDataKHR>\n  {\n    using Type = AccelerationStructureGeometryInstancesDataKHR;\n  };\n\n  union AccelerationStructureGeometryDataKHR\n  {\n    using NativeType = VkAccelerationStructureGeometryDataKHR;\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryDataKHR( VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryTrianglesDataKHR triangles_ = {} )\n      : triangles( triangles_ )\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryDataKHR( VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryAabbsDataKHR aabbs_ ) : aabbs( aabbs_ ) {}\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryDataKHR( VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryInstancesDataKHR instances_ )\n      : instances( instances_ )\n    {\n    }\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_UNION_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryDataKHR &\n      setTriangles( VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryTrianglesDataKHR const & triangles_ ) VULKAN_HPP_NOEXCEPT\n    {\n      triangles = triangles_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryDataKHR &\n      setAabbs( VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryAabbsDataKHR const & aabbs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      aabbs = aabbs_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryDataKHR &\n      setInstances( VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryInstancesDataKHR const & instances_ ) VULKAN_HPP_NOEXCEPT\n    {\n      instances = instances_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureGeometryDataKHR const &() const\n    {\n      return *reinterpret_cast<const VkAccelerationStructureGeometryDataKHR *>( this );\n    }\n\n    operator VkAccelerationStructureGeometryDataKHR &()\n    {\n      return *reinterpret_cast<VkAccelerationStructureGeometryDataKHR *>( this );\n    }\n\n#ifdef VULKAN_HPP_HAS_UNRESTRICTED_UNIONS\n    VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryTrianglesDataKHR triangles;\n    VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryAabbsDataKHR     aabbs;\n    VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryInstancesDataKHR instances;\n#else\n    VkAccelerationStructureGeometryTrianglesDataKHR triangles;\n    VkAccelerationStructureGeometryAabbsDataKHR     aabbs;\n    VkAccelerationStructureGeometryInstancesDataKHR instances;\n#endif /*VULKAN_HPP_HAS_UNRESTRICTED_UNIONS*/\n  };\n\n  struct AccelerationStructureGeometryKHR\n  {\n    using NativeType = VkAccelerationStructureGeometryKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAccelerationStructureGeometryKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14\n      AccelerationStructureGeometryKHR( VULKAN_HPP_NAMESPACE::GeometryTypeKHR geometryType_ = VULKAN_HPP_NAMESPACE::GeometryTypeKHR::eTriangles,\n                                        VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryDataKHR geometry_ = {},\n                                        VULKAN_HPP_NAMESPACE::GeometryFlagsKHR                     flags_    = {},\n                                        const void *                                               pNext_    = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , geometryType{ geometryType_ }\n      , geometry{ geometry_ }\n      , flags{ flags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryKHR( AccelerationStructureGeometryKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureGeometryKHR( VkAccelerationStructureGeometryKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureGeometryKHR( *reinterpret_cast<AccelerationStructureGeometryKHR const *>( &rhs ) )\n    {\n    }\n\n    AccelerationStructureGeometryKHR & operator=( AccelerationStructureGeometryKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureGeometryKHR & operator=( VkAccelerationStructureGeometryKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryKHR & setGeometryType( VULKAN_HPP_NAMESPACE::GeometryTypeKHR geometryType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      geometryType = geometryType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryKHR &\n      setGeometry( VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryDataKHR const & geometry_ ) VULKAN_HPP_NOEXCEPT\n    {\n      geometry = geometry_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryKHR & setFlags( VULKAN_HPP_NAMESPACE::GeometryFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureGeometryKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureGeometryKHR *>( this );\n    }\n\n    operator VkAccelerationStructureGeometryKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureGeometryKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::GeometryTypeKHR const &,\n               VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryDataKHR const &,\n               VULKAN_HPP_NAMESPACE::GeometryFlagsKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, geometryType, geometry, flags );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                        sType        = StructureType::eAccelerationStructureGeometryKHR;\n    const void *                                               pNext        = {};\n    VULKAN_HPP_NAMESPACE::GeometryTypeKHR                      geometryType = VULKAN_HPP_NAMESPACE::GeometryTypeKHR::eTriangles;\n    VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryDataKHR geometry     = {};\n    VULKAN_HPP_NAMESPACE::GeometryFlagsKHR                     flags        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAccelerationStructureGeometryKHR>\n  {\n    using Type = AccelerationStructureGeometryKHR;\n  };\n\n  union DeviceOrHostAddressKHR\n  {\n    using NativeType = VkDeviceOrHostAddressKHR;\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceOrHostAddressKHR( VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress_ = {} ) : deviceAddress( deviceAddress_ ) {}\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceOrHostAddressKHR( void * hostAddress_ ) : hostAddress( hostAddress_ ) {}\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_UNION_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceOrHostAddressKHR & setDeviceAddress( VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceAddress = deviceAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceOrHostAddressKHR & setHostAddress( void * hostAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      hostAddress = hostAddress_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceOrHostAddressKHR const &() const\n    {\n      return *reinterpret_cast<const VkDeviceOrHostAddressKHR *>( this );\n    }\n\n    operator VkDeviceOrHostAddressKHR &()\n    {\n      return *reinterpret_cast<VkDeviceOrHostAddressKHR *>( this );\n    }\n\n#ifdef VULKAN_HPP_HAS_UNRESTRICTED_UNIONS\n    VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress;\n    void *                              hostAddress;\n#else\n    VkDeviceAddress                                 deviceAddress;\n    void *                                          hostAddress;\n#endif /*VULKAN_HPP_HAS_UNRESTRICTED_UNIONS*/\n  };\n\n  struct AccelerationStructureBuildGeometryInfoKHR\n  {\n    using NativeType = VkAccelerationStructureBuildGeometryInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAccelerationStructureBuildGeometryInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureBuildGeometryInfoKHR(\n      VULKAN_HPP_NAMESPACE::AccelerationStructureTypeKHR                     type_  = VULKAN_HPP_NAMESPACE::AccelerationStructureTypeKHR::eTopLevel,\n      VULKAN_HPP_NAMESPACE::BuildAccelerationStructureFlagsKHR               flags_ = {},\n      VULKAN_HPP_NAMESPACE::BuildAccelerationStructureModeKHR                mode_  = VULKAN_HPP_NAMESPACE::BuildAccelerationStructureModeKHR::eBuild,\n      VULKAN_HPP_NAMESPACE::AccelerationStructureKHR                         srcAccelerationStructure_ = {},\n      VULKAN_HPP_NAMESPACE::AccelerationStructureKHR                         dstAccelerationStructure_ = {},\n      uint32_t                                                               geometryCount_            = {},\n      const VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryKHR *         pGeometries_              = {},\n      const VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryKHR * const * ppGeometries_             = {},\n      VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR                           scratchData_              = {},\n      const void *                                                           pNext_                    = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , type{ type_ }\n      , flags{ flags_ }\n      , mode{ mode_ }\n      , srcAccelerationStructure{ srcAccelerationStructure_ }\n      , dstAccelerationStructure{ dstAccelerationStructure_ }\n      , geometryCount{ geometryCount_ }\n      , pGeometries{ pGeometries_ }\n      , ppGeometries{ ppGeometries_ }\n      , scratchData{ scratchData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureBuildGeometryInfoKHR( AccelerationStructureBuildGeometryInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureBuildGeometryInfoKHR( VkAccelerationStructureBuildGeometryInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureBuildGeometryInfoKHR( *reinterpret_cast<AccelerationStructureBuildGeometryInfoKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    AccelerationStructureBuildGeometryInfoKHR(\n      VULKAN_HPP_NAMESPACE::AccelerationStructureTypeKHR                                                                          type_,\n      VULKAN_HPP_NAMESPACE::BuildAccelerationStructureFlagsKHR                                                                    flags_,\n      VULKAN_HPP_NAMESPACE::BuildAccelerationStructureModeKHR                                                                     mode_,\n      VULKAN_HPP_NAMESPACE::AccelerationStructureKHR                                                                              srcAccelerationStructure_,\n      VULKAN_HPP_NAMESPACE::AccelerationStructureKHR                                                                              dstAccelerationStructure_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryKHR> const &         geometries_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryKHR * const> const & pGeometries_ = {},\n      VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR                                                                                scratchData_ = {},\n      const void *                                                                                                                pNext_       = nullptr )\n      : pNext( pNext_ )\n      , type( type_ )\n      , flags( flags_ )\n      , mode( mode_ )\n      , srcAccelerationStructure( srcAccelerationStructure_ )\n      , dstAccelerationStructure( dstAccelerationStructure_ )\n      , geometryCount( static_cast<uint32_t>( !geometries_.empty() ? geometries_.size() : pGeometries_.size() ) )\n      , pGeometries( geometries_.data() )\n      , ppGeometries( pGeometries_.data() )\n      , scratchData( scratchData_ )\n    {\n#    ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( ( !geometries_.empty() + !pGeometries_.empty() ) <= 1 );\n#    else\n      if ( 1 < ( !geometries_.empty() + !pGeometries_.empty() ) )\n      {\n        throw LogicError(\n          VULKAN_HPP_NAMESPACE_STRING\n          \"::AccelerationStructureBuildGeometryInfoKHR::AccelerationStructureBuildGeometryInfoKHR: 1 < ( !geometries_.empty() + !pGeometries_.empty() )\" );\n      }\n#    endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    AccelerationStructureBuildGeometryInfoKHR & operator=( AccelerationStructureBuildGeometryInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureBuildGeometryInfoKHR & operator=( VkAccelerationStructureBuildGeometryInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureBuildGeometryInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureBuildGeometryInfoKHR & setType( VULKAN_HPP_NAMESPACE::AccelerationStructureTypeKHR type_ ) VULKAN_HPP_NOEXCEPT\n    {\n      type = type_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureBuildGeometryInfoKHR &\n      setFlags( VULKAN_HPP_NAMESPACE::BuildAccelerationStructureFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureBuildGeometryInfoKHR &\n      setMode( VULKAN_HPP_NAMESPACE::BuildAccelerationStructureModeKHR mode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mode = mode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureBuildGeometryInfoKHR &\n      setSrcAccelerationStructure( VULKAN_HPP_NAMESPACE::AccelerationStructureKHR srcAccelerationStructure_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcAccelerationStructure = srcAccelerationStructure_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureBuildGeometryInfoKHR &\n      setDstAccelerationStructure( VULKAN_HPP_NAMESPACE::AccelerationStructureKHR dstAccelerationStructure_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstAccelerationStructure = dstAccelerationStructure_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureBuildGeometryInfoKHR & setGeometryCount( uint32_t geometryCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      geometryCount = geometryCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureBuildGeometryInfoKHR &\n      setPGeometries( const VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryKHR * pGeometries_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pGeometries = pGeometries_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    AccelerationStructureBuildGeometryInfoKHR & setGeometries(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryKHR> const & geometries_ ) VULKAN_HPP_NOEXCEPT\n    {\n      geometryCount = static_cast<uint32_t>( geometries_.size() );\n      pGeometries   = geometries_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureBuildGeometryInfoKHR &\n      setPpGeometries( const VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryKHR * const * ppGeometries_ ) VULKAN_HPP_NOEXCEPT\n    {\n      ppGeometries = ppGeometries_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    AccelerationStructureBuildGeometryInfoKHR &\n      setPGeometries( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryKHR * const> const & pGeometries_ )\n        VULKAN_HPP_NOEXCEPT\n    {\n      geometryCount = static_cast<uint32_t>( pGeometries_.size() );\n      ppGeometries  = pGeometries_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureBuildGeometryInfoKHR &\n      setScratchData( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR const & scratchData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      scratchData = scratchData_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureBuildGeometryInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureBuildGeometryInfoKHR *>( this );\n    }\n\n    operator VkAccelerationStructureBuildGeometryInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureBuildGeometryInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::AccelerationStructureTypeKHR const &,\n               VULKAN_HPP_NAMESPACE::BuildAccelerationStructureFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::BuildAccelerationStructureModeKHR const &,\n               VULKAN_HPP_NAMESPACE::AccelerationStructureKHR const &,\n               VULKAN_HPP_NAMESPACE::AccelerationStructureKHR const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryKHR * const &,\n               const VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryKHR * const * const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie(\n        sType, pNext, type, flags, mode, srcAccelerationStructure, dstAccelerationStructure, geometryCount, pGeometries, ppGeometries, scratchData );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                    sType = StructureType::eAccelerationStructureBuildGeometryInfoKHR;\n    const void *                                                           pNext = {};\n    VULKAN_HPP_NAMESPACE::AccelerationStructureTypeKHR                     type  = VULKAN_HPP_NAMESPACE::AccelerationStructureTypeKHR::eTopLevel;\n    VULKAN_HPP_NAMESPACE::BuildAccelerationStructureFlagsKHR               flags = {};\n    VULKAN_HPP_NAMESPACE::BuildAccelerationStructureModeKHR                mode  = VULKAN_HPP_NAMESPACE::BuildAccelerationStructureModeKHR::eBuild;\n    VULKAN_HPP_NAMESPACE::AccelerationStructureKHR                         srcAccelerationStructure = {};\n    VULKAN_HPP_NAMESPACE::AccelerationStructureKHR                         dstAccelerationStructure = {};\n    uint32_t                                                               geometryCount            = {};\n    const VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryKHR *         pGeometries              = {};\n    const VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryKHR * const * ppGeometries             = {};\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR                           scratchData              = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAccelerationStructureBuildGeometryInfoKHR>\n  {\n    using Type = AccelerationStructureBuildGeometryInfoKHR;\n  };\n\n  struct AccelerationStructureBuildRangeInfoKHR\n  {\n    using NativeType = VkAccelerationStructureBuildRangeInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AccelerationStructureBuildRangeInfoKHR( uint32_t primitiveCount_  = {},\n                                                                 uint32_t primitiveOffset_ = {},\n                                                                 uint32_t firstVertex_     = {},\n                                                                 uint32_t transformOffset_ = {} ) VULKAN_HPP_NOEXCEPT\n      : primitiveCount{ primitiveCount_ }\n      , primitiveOffset{ primitiveOffset_ }\n      , firstVertex{ firstVertex_ }\n      , transformOffset{ transformOffset_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AccelerationStructureBuildRangeInfoKHR( AccelerationStructureBuildRangeInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureBuildRangeInfoKHR( VkAccelerationStructureBuildRangeInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureBuildRangeInfoKHR( *reinterpret_cast<AccelerationStructureBuildRangeInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    AccelerationStructureBuildRangeInfoKHR & operator=( AccelerationStructureBuildRangeInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureBuildRangeInfoKHR & operator=( VkAccelerationStructureBuildRangeInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureBuildRangeInfoKHR & setPrimitiveCount( uint32_t primitiveCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      primitiveCount = primitiveCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureBuildRangeInfoKHR & setPrimitiveOffset( uint32_t primitiveOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      primitiveOffset = primitiveOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureBuildRangeInfoKHR & setFirstVertex( uint32_t firstVertex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      firstVertex = firstVertex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureBuildRangeInfoKHR & setTransformOffset( uint32_t transformOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      transformOffset = transformOffset_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureBuildRangeInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureBuildRangeInfoKHR *>( this );\n    }\n\n    operator VkAccelerationStructureBuildRangeInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureBuildRangeInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( primitiveCount, primitiveOffset, firstVertex, transformOffset );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AccelerationStructureBuildRangeInfoKHR const & ) const = default;\n#else\n    bool                                            operator==( AccelerationStructureBuildRangeInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( primitiveCount == rhs.primitiveCount ) && ( primitiveOffset == rhs.primitiveOffset ) && ( firstVertex == rhs.firstVertex ) &&\n             ( transformOffset == rhs.transformOffset );\n#  endif\n    }\n\n    bool operator!=( AccelerationStructureBuildRangeInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t primitiveCount  = {};\n    uint32_t primitiveOffset = {};\n    uint32_t firstVertex     = {};\n    uint32_t transformOffset = {};\n  };\n\n  struct AccelerationStructureBuildSizesInfoKHR\n  {\n    using NativeType = VkAccelerationStructureBuildSizesInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAccelerationStructureBuildSizesInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AccelerationStructureBuildSizesInfoKHR( VULKAN_HPP_NAMESPACE::DeviceSize accelerationStructureSize_ = {},\n                                                                 VULKAN_HPP_NAMESPACE::DeviceSize updateScratchSize_         = {},\n                                                                 VULKAN_HPP_NAMESPACE::DeviceSize buildScratchSize_          = {},\n                                                                 const void *                     pNext_                     = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , accelerationStructureSize{ accelerationStructureSize_ }\n      , updateScratchSize{ updateScratchSize_ }\n      , buildScratchSize{ buildScratchSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AccelerationStructureBuildSizesInfoKHR( AccelerationStructureBuildSizesInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureBuildSizesInfoKHR( VkAccelerationStructureBuildSizesInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureBuildSizesInfoKHR( *reinterpret_cast<AccelerationStructureBuildSizesInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    AccelerationStructureBuildSizesInfoKHR & operator=( AccelerationStructureBuildSizesInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureBuildSizesInfoKHR & operator=( VkAccelerationStructureBuildSizesInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkAccelerationStructureBuildSizesInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureBuildSizesInfoKHR *>( this );\n    }\n\n    operator VkAccelerationStructureBuildSizesInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureBuildSizesInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, accelerationStructureSize, updateScratchSize, buildScratchSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AccelerationStructureBuildSizesInfoKHR const & ) const = default;\n#else\n    bool operator==( AccelerationStructureBuildSizesInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( accelerationStructureSize == rhs.accelerationStructureSize ) &&\n             ( updateScratchSize == rhs.updateScratchSize ) && ( buildScratchSize == rhs.buildScratchSize );\n#  endif\n    }\n\n    bool operator!=( AccelerationStructureBuildSizesInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                     = StructureType::eAccelerationStructureBuildSizesInfoKHR;\n    const void *                        pNext                     = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    accelerationStructureSize = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    updateScratchSize         = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    buildScratchSize          = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAccelerationStructureBuildSizesInfoKHR>\n  {\n    using Type = AccelerationStructureBuildSizesInfoKHR;\n  };\n\n  struct AccelerationStructureCaptureDescriptorDataInfoEXT\n  {\n    using NativeType = VkAccelerationStructureCaptureDescriptorDataInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAccelerationStructureCaptureDescriptorDataInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AccelerationStructureCaptureDescriptorDataInfoEXT( VULKAN_HPP_NAMESPACE::AccelerationStructureKHR accelerationStructure_   = {},\n                                                                            VULKAN_HPP_NAMESPACE::AccelerationStructureNV  accelerationStructureNV_ = {},\n                                                                            const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , accelerationStructure{ accelerationStructure_ }\n      , accelerationStructureNV{ accelerationStructureNV_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      AccelerationStructureCaptureDescriptorDataInfoEXT( AccelerationStructureCaptureDescriptorDataInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureCaptureDescriptorDataInfoEXT( VkAccelerationStructureCaptureDescriptorDataInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureCaptureDescriptorDataInfoEXT( *reinterpret_cast<AccelerationStructureCaptureDescriptorDataInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    AccelerationStructureCaptureDescriptorDataInfoEXT &\n      operator=( AccelerationStructureCaptureDescriptorDataInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureCaptureDescriptorDataInfoEXT & operator=( VkAccelerationStructureCaptureDescriptorDataInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureCaptureDescriptorDataInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureCaptureDescriptorDataInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureCaptureDescriptorDataInfoEXT &\n      setAccelerationStructure( VULKAN_HPP_NAMESPACE::AccelerationStructureKHR accelerationStructure_ ) VULKAN_HPP_NOEXCEPT\n    {\n      accelerationStructure = accelerationStructure_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureCaptureDescriptorDataInfoEXT &\n      setAccelerationStructureNV( VULKAN_HPP_NAMESPACE::AccelerationStructureNV accelerationStructureNV_ ) VULKAN_HPP_NOEXCEPT\n    {\n      accelerationStructureNV = accelerationStructureNV_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureCaptureDescriptorDataInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureCaptureDescriptorDataInfoEXT *>( this );\n    }\n\n    operator VkAccelerationStructureCaptureDescriptorDataInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureCaptureDescriptorDataInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::AccelerationStructureKHR const &,\n               VULKAN_HPP_NAMESPACE::AccelerationStructureNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, accelerationStructure, accelerationStructureNV );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AccelerationStructureCaptureDescriptorDataInfoEXT const & ) const = default;\n#else\n    bool operator==( AccelerationStructureCaptureDescriptorDataInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( accelerationStructure == rhs.accelerationStructure ) &&\n             ( accelerationStructureNV == rhs.accelerationStructureNV );\n#  endif\n    }\n\n    bool operator!=( AccelerationStructureCaptureDescriptorDataInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType            sType                   = StructureType::eAccelerationStructureCaptureDescriptorDataInfoEXT;\n    const void *                                   pNext                   = {};\n    VULKAN_HPP_NAMESPACE::AccelerationStructureKHR accelerationStructure   = {};\n    VULKAN_HPP_NAMESPACE::AccelerationStructureNV  accelerationStructureNV = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAccelerationStructureCaptureDescriptorDataInfoEXT>\n  {\n    using Type = AccelerationStructureCaptureDescriptorDataInfoEXT;\n  };\n\n  struct AccelerationStructureCreateInfoKHR\n  {\n    using NativeType = VkAccelerationStructureCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAccelerationStructureCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AccelerationStructureCreateInfoKHR(\n      VULKAN_HPP_NAMESPACE::AccelerationStructureCreateFlagsKHR createFlags_   = {},\n      VULKAN_HPP_NAMESPACE::Buffer                              buffer_        = {},\n      VULKAN_HPP_NAMESPACE::DeviceSize                          offset_        = {},\n      VULKAN_HPP_NAMESPACE::DeviceSize                          size_          = {},\n      VULKAN_HPP_NAMESPACE::AccelerationStructureTypeKHR        type_          = VULKAN_HPP_NAMESPACE::AccelerationStructureTypeKHR::eTopLevel,\n      VULKAN_HPP_NAMESPACE::DeviceAddress                       deviceAddress_ = {},\n      const void *                                              pNext_         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , createFlags{ createFlags_ }\n      , buffer{ buffer_ }\n      , offset{ offset_ }\n      , size{ size_ }\n      , type{ type_ }\n      , deviceAddress{ deviceAddress_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AccelerationStructureCreateInfoKHR( AccelerationStructureCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureCreateInfoKHR( VkAccelerationStructureCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureCreateInfoKHR( *reinterpret_cast<AccelerationStructureCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    AccelerationStructureCreateInfoKHR & operator=( AccelerationStructureCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureCreateInfoKHR & operator=( VkAccelerationStructureCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureCreateInfoKHR &\n      setCreateFlags( VULKAN_HPP_NAMESPACE::AccelerationStructureCreateFlagsKHR createFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      createFlags = createFlags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureCreateInfoKHR & setBuffer( VULKAN_HPP_NAMESPACE::Buffer buffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      buffer = buffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureCreateInfoKHR & setOffset( VULKAN_HPP_NAMESPACE::DeviceSize offset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      offset = offset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureCreateInfoKHR & setSize( VULKAN_HPP_NAMESPACE::DeviceSize size_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size = size_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureCreateInfoKHR & setType( VULKAN_HPP_NAMESPACE::AccelerationStructureTypeKHR type_ ) VULKAN_HPP_NOEXCEPT\n    {\n      type = type_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureCreateInfoKHR & setDeviceAddress( VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceAddress = deviceAddress_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureCreateInfoKHR *>( this );\n    }\n\n    operator VkAccelerationStructureCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::AccelerationStructureCreateFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::Buffer const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::AccelerationStructureTypeKHR const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, createFlags, buffer, offset, size, type, deviceAddress );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AccelerationStructureCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( AccelerationStructureCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( createFlags == rhs.createFlags ) && ( buffer == rhs.buffer ) && ( offset == rhs.offset ) &&\n             ( size == rhs.size ) && ( type == rhs.type ) && ( deviceAddress == rhs.deviceAddress );\n#  endif\n    }\n\n    bool operator!=( AccelerationStructureCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                       sType         = StructureType::eAccelerationStructureCreateInfoKHR;\n    const void *                                              pNext         = {};\n    VULKAN_HPP_NAMESPACE::AccelerationStructureCreateFlagsKHR createFlags   = {};\n    VULKAN_HPP_NAMESPACE::Buffer                              buffer        = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                          offset        = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                          size          = {};\n    VULKAN_HPP_NAMESPACE::AccelerationStructureTypeKHR        type          = VULKAN_HPP_NAMESPACE::AccelerationStructureTypeKHR::eTopLevel;\n    VULKAN_HPP_NAMESPACE::DeviceAddress                       deviceAddress = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAccelerationStructureCreateInfoKHR>\n  {\n    using Type = AccelerationStructureCreateInfoKHR;\n  };\n\n  struct GeometryTrianglesNV\n  {\n    using NativeType = VkGeometryTrianglesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eGeometryTrianglesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR GeometryTrianglesNV( VULKAN_HPP_NAMESPACE::Buffer     vertexData_      = {},\n                                              VULKAN_HPP_NAMESPACE::DeviceSize vertexOffset_    = {},\n                                              uint32_t                         vertexCount_     = {},\n                                              VULKAN_HPP_NAMESPACE::DeviceSize vertexStride_    = {},\n                                              VULKAN_HPP_NAMESPACE::Format     vertexFormat_    = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                              VULKAN_HPP_NAMESPACE::Buffer     indexData_       = {},\n                                              VULKAN_HPP_NAMESPACE::DeviceSize indexOffset_     = {},\n                                              uint32_t                         indexCount_      = {},\n                                              VULKAN_HPP_NAMESPACE::IndexType  indexType_       = VULKAN_HPP_NAMESPACE::IndexType::eUint16,\n                                              VULKAN_HPP_NAMESPACE::Buffer     transformData_   = {},\n                                              VULKAN_HPP_NAMESPACE::DeviceSize transformOffset_ = {},\n                                              const void *                     pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , vertexData{ vertexData_ }\n      , vertexOffset{ vertexOffset_ }\n      , vertexCount{ vertexCount_ }\n      , vertexStride{ vertexStride_ }\n      , vertexFormat{ vertexFormat_ }\n      , indexData{ indexData_ }\n      , indexOffset{ indexOffset_ }\n      , indexCount{ indexCount_ }\n      , indexType{ indexType_ }\n      , transformData{ transformData_ }\n      , transformOffset{ transformOffset_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR GeometryTrianglesNV( GeometryTrianglesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    GeometryTrianglesNV( VkGeometryTrianglesNV const & rhs ) VULKAN_HPP_NOEXCEPT : GeometryTrianglesNV( *reinterpret_cast<GeometryTrianglesNV const *>( &rhs ) )\n    {\n    }\n\n    GeometryTrianglesNV & operator=( GeometryTrianglesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    GeometryTrianglesNV & operator=( VkGeometryTrianglesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::GeometryTrianglesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 GeometryTrianglesNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeometryTrianglesNV & setVertexData( VULKAN_HPP_NAMESPACE::Buffer vertexData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexData = vertexData_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeometryTrianglesNV & setVertexOffset( VULKAN_HPP_NAMESPACE::DeviceSize vertexOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexOffset = vertexOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeometryTrianglesNV & setVertexCount( uint32_t vertexCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexCount = vertexCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeometryTrianglesNV & setVertexStride( VULKAN_HPP_NAMESPACE::DeviceSize vertexStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexStride = vertexStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeometryTrianglesNV & setVertexFormat( VULKAN_HPP_NAMESPACE::Format vertexFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexFormat = vertexFormat_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeometryTrianglesNV & setIndexData( VULKAN_HPP_NAMESPACE::Buffer indexData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexData = indexData_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeometryTrianglesNV & setIndexOffset( VULKAN_HPP_NAMESPACE::DeviceSize indexOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexOffset = indexOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeometryTrianglesNV & setIndexCount( uint32_t indexCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexCount = indexCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeometryTrianglesNV & setIndexType( VULKAN_HPP_NAMESPACE::IndexType indexType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexType = indexType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeometryTrianglesNV & setTransformData( VULKAN_HPP_NAMESPACE::Buffer transformData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      transformData = transformData_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeometryTrianglesNV & setTransformOffset( VULKAN_HPP_NAMESPACE::DeviceSize transformOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      transformOffset = transformOffset_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkGeometryTrianglesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkGeometryTrianglesNV *>( this );\n    }\n\n    operator VkGeometryTrianglesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkGeometryTrianglesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Buffer const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::Buffer const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::IndexType const &,\n               VULKAN_HPP_NAMESPACE::Buffer const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       vertexData,\n                       vertexOffset,\n                       vertexCount,\n                       vertexStride,\n                       vertexFormat,\n                       indexData,\n                       indexOffset,\n                       indexCount,\n                       indexType,\n                       transformData,\n                       transformOffset );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( GeometryTrianglesNV const & ) const = default;\n#else\n    bool operator==( GeometryTrianglesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( vertexData == rhs.vertexData ) && ( vertexOffset == rhs.vertexOffset ) &&\n             ( vertexCount == rhs.vertexCount ) && ( vertexStride == rhs.vertexStride ) && ( vertexFormat == rhs.vertexFormat ) &&\n             ( indexData == rhs.indexData ) && ( indexOffset == rhs.indexOffset ) && ( indexCount == rhs.indexCount ) && ( indexType == rhs.indexType ) &&\n             ( transformData == rhs.transformData ) && ( transformOffset == rhs.transformOffset );\n#  endif\n    }\n\n    bool operator!=( GeometryTrianglesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType           = StructureType::eGeometryTrianglesNV;\n    const void *                        pNext           = {};\n    VULKAN_HPP_NAMESPACE::Buffer        vertexData      = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    vertexOffset    = {};\n    uint32_t                            vertexCount     = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    vertexStride    = {};\n    VULKAN_HPP_NAMESPACE::Format        vertexFormat    = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::Buffer        indexData       = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    indexOffset     = {};\n    uint32_t                            indexCount      = {};\n    VULKAN_HPP_NAMESPACE::IndexType     indexType       = VULKAN_HPP_NAMESPACE::IndexType::eUint16;\n    VULKAN_HPP_NAMESPACE::Buffer        transformData   = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    transformOffset = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eGeometryTrianglesNV>\n  {\n    using Type = GeometryTrianglesNV;\n  };\n\n  struct GeometryAABBNV\n  {\n    using NativeType = VkGeometryAABBNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eGeometryAabbNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR GeometryAABBNV( VULKAN_HPP_NAMESPACE::Buffer     aabbData_ = {},\n                                         uint32_t                         numAABBs_ = {},\n                                         uint32_t                         stride_   = {},\n                                         VULKAN_HPP_NAMESPACE::DeviceSize offset_   = {},\n                                         const void *                     pNext_    = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , aabbData{ aabbData_ }\n      , numAABBs{ numAABBs_ }\n      , stride{ stride_ }\n      , offset{ offset_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR GeometryAABBNV( GeometryAABBNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    GeometryAABBNV( VkGeometryAABBNV const & rhs ) VULKAN_HPP_NOEXCEPT : GeometryAABBNV( *reinterpret_cast<GeometryAABBNV const *>( &rhs ) ) {}\n\n    GeometryAABBNV & operator=( GeometryAABBNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    GeometryAABBNV & operator=( VkGeometryAABBNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::GeometryAABBNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 GeometryAABBNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeometryAABBNV & setAabbData( VULKAN_HPP_NAMESPACE::Buffer aabbData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      aabbData = aabbData_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeometryAABBNV & setNumAABBs( uint32_t numAABBs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      numAABBs = numAABBs_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeometryAABBNV & setStride( uint32_t stride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stride = stride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeometryAABBNV & setOffset( VULKAN_HPP_NAMESPACE::DeviceSize offset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      offset = offset_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkGeometryAABBNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkGeometryAABBNV *>( this );\n    }\n\n    operator VkGeometryAABBNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkGeometryAABBNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Buffer const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, aabbData, numAABBs, stride, offset );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( GeometryAABBNV const & ) const = default;\n#else\n    bool operator==( GeometryAABBNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( aabbData == rhs.aabbData ) && ( numAABBs == rhs.numAABBs ) && ( stride == rhs.stride ) &&\n             ( offset == rhs.offset );\n#  endif\n    }\n\n    bool operator!=( GeometryAABBNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType    = StructureType::eGeometryAabbNV;\n    const void *                        pNext    = {};\n    VULKAN_HPP_NAMESPACE::Buffer        aabbData = {};\n    uint32_t                            numAABBs = {};\n    uint32_t                            stride   = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    offset   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eGeometryAabbNV>\n  {\n    using Type = GeometryAABBNV;\n  };\n\n  struct GeometryDataNV\n  {\n    using NativeType = VkGeometryDataNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR GeometryDataNV( VULKAN_HPP_NAMESPACE::GeometryTrianglesNV triangles_ = {},\n                                         VULKAN_HPP_NAMESPACE::GeometryAABBNV      aabbs_     = {} ) VULKAN_HPP_NOEXCEPT\n      : triangles{ triangles_ }\n      , aabbs{ aabbs_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR GeometryDataNV( GeometryDataNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    GeometryDataNV( VkGeometryDataNV const & rhs ) VULKAN_HPP_NOEXCEPT : GeometryDataNV( *reinterpret_cast<GeometryDataNV const *>( &rhs ) ) {}\n\n    GeometryDataNV & operator=( GeometryDataNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    GeometryDataNV & operator=( VkGeometryDataNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::GeometryDataNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 GeometryDataNV & setTriangles( VULKAN_HPP_NAMESPACE::GeometryTrianglesNV const & triangles_ ) VULKAN_HPP_NOEXCEPT\n    {\n      triangles = triangles_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeometryDataNV & setAabbs( VULKAN_HPP_NAMESPACE::GeometryAABBNV const & aabbs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      aabbs = aabbs_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkGeometryDataNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkGeometryDataNV *>( this );\n    }\n\n    operator VkGeometryDataNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkGeometryDataNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::GeometryTrianglesNV const &, VULKAN_HPP_NAMESPACE::GeometryAABBNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( triangles, aabbs );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( GeometryDataNV const & ) const = default;\n#else\n    bool operator==( GeometryDataNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( triangles == rhs.triangles ) && ( aabbs == rhs.aabbs );\n#  endif\n    }\n\n    bool operator!=( GeometryDataNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::GeometryTrianglesNV triangles = {};\n    VULKAN_HPP_NAMESPACE::GeometryAABBNV      aabbs     = {};\n  };\n\n  struct GeometryNV\n  {\n    using NativeType = VkGeometryNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eGeometryNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR GeometryNV( VULKAN_HPP_NAMESPACE::GeometryTypeKHR  geometryType_ = VULKAN_HPP_NAMESPACE::GeometryTypeKHR::eTriangles,\n                                     VULKAN_HPP_NAMESPACE::GeometryDataNV   geometry_     = {},\n                                     VULKAN_HPP_NAMESPACE::GeometryFlagsKHR flags_        = {},\n                                     const void *                           pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , geometryType{ geometryType_ }\n      , geometry{ geometry_ }\n      , flags{ flags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR GeometryNV( GeometryNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    GeometryNV( VkGeometryNV const & rhs ) VULKAN_HPP_NOEXCEPT : GeometryNV( *reinterpret_cast<GeometryNV const *>( &rhs ) ) {}\n\n    GeometryNV & operator=( GeometryNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    GeometryNV & operator=( VkGeometryNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::GeometryNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 GeometryNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeometryNV & setGeometryType( VULKAN_HPP_NAMESPACE::GeometryTypeKHR geometryType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      geometryType = geometryType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeometryNV & setGeometry( VULKAN_HPP_NAMESPACE::GeometryDataNV const & geometry_ ) VULKAN_HPP_NOEXCEPT\n    {\n      geometry = geometry_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeometryNV & setFlags( VULKAN_HPP_NAMESPACE::GeometryFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkGeometryNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkGeometryNV *>( this );\n    }\n\n    operator VkGeometryNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkGeometryNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::GeometryTypeKHR const &,\n               VULKAN_HPP_NAMESPACE::GeometryDataNV const &,\n               VULKAN_HPP_NAMESPACE::GeometryFlagsKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, geometryType, geometry, flags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( GeometryNV const & ) const = default;\n#else\n    bool operator==( GeometryNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( geometryType == rhs.geometryType ) && ( geometry == rhs.geometry ) && ( flags == rhs.flags );\n#  endif\n    }\n\n    bool operator!=( GeometryNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType        = StructureType::eGeometryNV;\n    const void *                           pNext        = {};\n    VULKAN_HPP_NAMESPACE::GeometryTypeKHR  geometryType = VULKAN_HPP_NAMESPACE::GeometryTypeKHR::eTriangles;\n    VULKAN_HPP_NAMESPACE::GeometryDataNV   geometry     = {};\n    VULKAN_HPP_NAMESPACE::GeometryFlagsKHR flags        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eGeometryNV>\n  {\n    using Type = GeometryNV;\n  };\n\n  struct AccelerationStructureInfoNV\n  {\n    using NativeType = VkAccelerationStructureInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAccelerationStructureInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AccelerationStructureInfoNV( VULKAN_HPP_NAMESPACE::AccelerationStructureTypeNV       type_          = {},\n                                                      VULKAN_HPP_NAMESPACE::BuildAccelerationStructureFlagsNV flags_         = {},\n                                                      uint32_t                                                instanceCount_ = {},\n                                                      uint32_t                                                geometryCount_ = {},\n                                                      const VULKAN_HPP_NAMESPACE::GeometryNV *                pGeometries_   = {},\n                                                      const void *                                            pNext_         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , type{ type_ }\n      , flags{ flags_ }\n      , instanceCount{ instanceCount_ }\n      , geometryCount{ geometryCount_ }\n      , pGeometries{ pGeometries_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AccelerationStructureInfoNV( AccelerationStructureInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureInfoNV( VkAccelerationStructureInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureInfoNV( *reinterpret_cast<AccelerationStructureInfoNV const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    AccelerationStructureInfoNV( VULKAN_HPP_NAMESPACE::AccelerationStructureTypeNV                                             type_,\n                                 VULKAN_HPP_NAMESPACE::BuildAccelerationStructureFlagsNV                                       flags_,\n                                 uint32_t                                                                                      instanceCount_,\n                                 VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::GeometryNV> const & geometries_,\n                                 const void *                                                                                  pNext_ = nullptr )\n      : pNext( pNext_ )\n      , type( type_ )\n      , flags( flags_ )\n      , instanceCount( instanceCount_ )\n      , geometryCount( static_cast<uint32_t>( geometries_.size() ) )\n      , pGeometries( geometries_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    AccelerationStructureInfoNV & operator=( AccelerationStructureInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureInfoNV & operator=( VkAccelerationStructureInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureInfoNV & setType( VULKAN_HPP_NAMESPACE::AccelerationStructureTypeNV type_ ) VULKAN_HPP_NOEXCEPT\n    {\n      type = type_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureInfoNV & setFlags( VULKAN_HPP_NAMESPACE::BuildAccelerationStructureFlagsNV flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureInfoNV & setInstanceCount( uint32_t instanceCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      instanceCount = instanceCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureInfoNV & setGeometryCount( uint32_t geometryCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      geometryCount = geometryCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureInfoNV & setPGeometries( const VULKAN_HPP_NAMESPACE::GeometryNV * pGeometries_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pGeometries = pGeometries_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    AccelerationStructureInfoNV &\n      setGeometries( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::GeometryNV> const & geometries_ ) VULKAN_HPP_NOEXCEPT\n    {\n      geometryCount = static_cast<uint32_t>( geometries_.size() );\n      pGeometries   = geometries_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureInfoNV *>( this );\n    }\n\n    operator VkAccelerationStructureInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::AccelerationStructureTypeNV const &,\n               VULKAN_HPP_NAMESPACE::BuildAccelerationStructureFlagsNV const &,\n               uint32_t const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::GeometryNV * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, type, flags, instanceCount, geometryCount, pGeometries );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AccelerationStructureInfoNV const & ) const = default;\n#else\n    bool operator==( AccelerationStructureInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( type == rhs.type ) && ( flags == rhs.flags ) && ( instanceCount == rhs.instanceCount ) &&\n             ( geometryCount == rhs.geometryCount ) && ( pGeometries == rhs.pGeometries );\n#  endif\n    }\n\n    bool operator!=( AccelerationStructureInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                     sType         = StructureType::eAccelerationStructureInfoNV;\n    const void *                                            pNext         = {};\n    VULKAN_HPP_NAMESPACE::AccelerationStructureTypeNV       type          = {};\n    VULKAN_HPP_NAMESPACE::BuildAccelerationStructureFlagsNV flags         = {};\n    uint32_t                                                instanceCount = {};\n    uint32_t                                                geometryCount = {};\n    const VULKAN_HPP_NAMESPACE::GeometryNV *                pGeometries   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAccelerationStructureInfoNV>\n  {\n    using Type = AccelerationStructureInfoNV;\n  };\n\n  struct AccelerationStructureCreateInfoNV\n  {\n    using NativeType = VkAccelerationStructureCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAccelerationStructureCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AccelerationStructureCreateInfoNV( VULKAN_HPP_NAMESPACE::DeviceSize                  compactedSize_ = {},\n                                                            VULKAN_HPP_NAMESPACE::AccelerationStructureInfoNV info_          = {},\n                                                            const void *                                      pNext_         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , compactedSize{ compactedSize_ }\n      , info{ info_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AccelerationStructureCreateInfoNV( AccelerationStructureCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureCreateInfoNV( VkAccelerationStructureCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureCreateInfoNV( *reinterpret_cast<AccelerationStructureCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n    AccelerationStructureCreateInfoNV & operator=( AccelerationStructureCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureCreateInfoNV & operator=( VkAccelerationStructureCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureCreateInfoNV & setCompactedSize( VULKAN_HPP_NAMESPACE::DeviceSize compactedSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      compactedSize = compactedSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureCreateInfoNV & setInfo( VULKAN_HPP_NAMESPACE::AccelerationStructureInfoNV const & info_ ) VULKAN_HPP_NOEXCEPT\n    {\n      info = info_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureCreateInfoNV *>( this );\n    }\n\n    operator VkAccelerationStructureCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::AccelerationStructureInfoNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, compactedSize, info );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AccelerationStructureCreateInfoNV const & ) const = default;\n#else\n    bool operator==( AccelerationStructureCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( compactedSize == rhs.compactedSize ) && ( info == rhs.info );\n#  endif\n    }\n\n    bool operator!=( AccelerationStructureCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType         = StructureType::eAccelerationStructureCreateInfoNV;\n    const void *                                      pNext         = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                  compactedSize = {};\n    VULKAN_HPP_NAMESPACE::AccelerationStructureInfoNV info          = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAccelerationStructureCreateInfoNV>\n  {\n    using Type = AccelerationStructureCreateInfoNV;\n  };\n\n  struct AccelerationStructureDeviceAddressInfoKHR\n  {\n    using NativeType = VkAccelerationStructureDeviceAddressInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAccelerationStructureDeviceAddressInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AccelerationStructureDeviceAddressInfoKHR( VULKAN_HPP_NAMESPACE::AccelerationStructureKHR accelerationStructure_ = {},\n                                                                    const void *                                   pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , accelerationStructure{ accelerationStructure_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AccelerationStructureDeviceAddressInfoKHR( AccelerationStructureDeviceAddressInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureDeviceAddressInfoKHR( VkAccelerationStructureDeviceAddressInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureDeviceAddressInfoKHR( *reinterpret_cast<AccelerationStructureDeviceAddressInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    AccelerationStructureDeviceAddressInfoKHR & operator=( AccelerationStructureDeviceAddressInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureDeviceAddressInfoKHR & operator=( VkAccelerationStructureDeviceAddressInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureDeviceAddressInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureDeviceAddressInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureDeviceAddressInfoKHR &\n      setAccelerationStructure( VULKAN_HPP_NAMESPACE::AccelerationStructureKHR accelerationStructure_ ) VULKAN_HPP_NOEXCEPT\n    {\n      accelerationStructure = accelerationStructure_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureDeviceAddressInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureDeviceAddressInfoKHR *>( this );\n    }\n\n    operator VkAccelerationStructureDeviceAddressInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureDeviceAddressInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::AccelerationStructureKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, accelerationStructure );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AccelerationStructureDeviceAddressInfoKHR const & ) const = default;\n#else\n    bool operator==( AccelerationStructureDeviceAddressInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( accelerationStructure == rhs.accelerationStructure );\n#  endif\n    }\n\n    bool operator!=( AccelerationStructureDeviceAddressInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType            sType                 = StructureType::eAccelerationStructureDeviceAddressInfoKHR;\n    const void *                                   pNext                 = {};\n    VULKAN_HPP_NAMESPACE::AccelerationStructureKHR accelerationStructure = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAccelerationStructureDeviceAddressInfoKHR>\n  {\n    using Type = AccelerationStructureDeviceAddressInfoKHR;\n  };\n\n  struct AccelerationStructureGeometryLinearSweptSpheresDataNV\n  {\n    using NativeType = VkAccelerationStructureGeometryLinearSweptSpheresDataNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAccelerationStructureGeometryLinearSweptSpheresDataNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryLinearSweptSpheresDataNV(\n      VULKAN_HPP_NAMESPACE::Format                              vertexFormat_ = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n      VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR         vertexData_   = {},\n      VULKAN_HPP_NAMESPACE::DeviceSize                          vertexStride_ = {},\n      VULKAN_HPP_NAMESPACE::Format                              radiusFormat_ = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n      VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR         radiusData_   = {},\n      VULKAN_HPP_NAMESPACE::DeviceSize                          radiusStride_ = {},\n      VULKAN_HPP_NAMESPACE::IndexType                           indexType_    = VULKAN_HPP_NAMESPACE::IndexType::eUint16,\n      VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR         indexData_    = {},\n      VULKAN_HPP_NAMESPACE::DeviceSize                          indexStride_  = {},\n      VULKAN_HPP_NAMESPACE::RayTracingLssIndexingModeNV         indexingMode_ = VULKAN_HPP_NAMESPACE::RayTracingLssIndexingModeNV::eList,\n      VULKAN_HPP_NAMESPACE::RayTracingLssPrimitiveEndCapsModeNV endCapsMode_  = VULKAN_HPP_NAMESPACE::RayTracingLssPrimitiveEndCapsModeNV::eNone,\n      const void *                                              pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , vertexFormat{ vertexFormat_ }\n      , vertexData{ vertexData_ }\n      , vertexStride{ vertexStride_ }\n      , radiusFormat{ radiusFormat_ }\n      , radiusData{ radiusData_ }\n      , radiusStride{ radiusStride_ }\n      , indexType{ indexType_ }\n      , indexData{ indexData_ }\n      , indexStride{ indexStride_ }\n      , indexingMode{ indexingMode_ }\n      , endCapsMode{ endCapsMode_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14\n      AccelerationStructureGeometryLinearSweptSpheresDataNV( AccelerationStructureGeometryLinearSweptSpheresDataNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureGeometryLinearSweptSpheresDataNV( VkAccelerationStructureGeometryLinearSweptSpheresDataNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureGeometryLinearSweptSpheresDataNV( *reinterpret_cast<AccelerationStructureGeometryLinearSweptSpheresDataNV const *>( &rhs ) )\n    {\n    }\n\n    AccelerationStructureGeometryLinearSweptSpheresDataNV &\n      operator=( AccelerationStructureGeometryLinearSweptSpheresDataNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureGeometryLinearSweptSpheresDataNV & operator=( VkAccelerationStructureGeometryLinearSweptSpheresDataNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryLinearSweptSpheresDataNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryLinearSweptSpheresDataNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryLinearSweptSpheresDataNV &\n      setVertexFormat( VULKAN_HPP_NAMESPACE::Format vertexFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexFormat = vertexFormat_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryLinearSweptSpheresDataNV &\n      setVertexData( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & vertexData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexData = vertexData_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryLinearSweptSpheresDataNV &\n      setVertexStride( VULKAN_HPP_NAMESPACE::DeviceSize vertexStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexStride = vertexStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryLinearSweptSpheresDataNV &\n      setRadiusFormat( VULKAN_HPP_NAMESPACE::Format radiusFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      radiusFormat = radiusFormat_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryLinearSweptSpheresDataNV &\n      setRadiusData( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & radiusData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      radiusData = radiusData_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryLinearSweptSpheresDataNV &\n      setRadiusStride( VULKAN_HPP_NAMESPACE::DeviceSize radiusStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      radiusStride = radiusStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryLinearSweptSpheresDataNV &\n      setIndexType( VULKAN_HPP_NAMESPACE::IndexType indexType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexType = indexType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryLinearSweptSpheresDataNV &\n      setIndexData( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & indexData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexData = indexData_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryLinearSweptSpheresDataNV &\n      setIndexStride( VULKAN_HPP_NAMESPACE::DeviceSize indexStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexStride = indexStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryLinearSweptSpheresDataNV &\n      setIndexingMode( VULKAN_HPP_NAMESPACE::RayTracingLssIndexingModeNV indexingMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexingMode = indexingMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryLinearSweptSpheresDataNV &\n      setEndCapsMode( VULKAN_HPP_NAMESPACE::RayTracingLssPrimitiveEndCapsModeNV endCapsMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      endCapsMode = endCapsMode_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureGeometryLinearSweptSpheresDataNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureGeometryLinearSweptSpheresDataNV *>( this );\n    }\n\n    operator VkAccelerationStructureGeometryLinearSweptSpheresDataNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureGeometryLinearSweptSpheresDataNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::IndexType const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::RayTracingLssIndexingModeNV const &,\n               VULKAN_HPP_NAMESPACE::RayTracingLssPrimitiveEndCapsModeNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       vertexFormat,\n                       vertexData,\n                       vertexStride,\n                       radiusFormat,\n                       radiusData,\n                       radiusStride,\n                       indexType,\n                       indexData,\n                       indexStride,\n                       indexingMode,\n                       endCapsMode );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                       sType        = StructureType::eAccelerationStructureGeometryLinearSweptSpheresDataNV;\n    const void *                                              pNext        = {};\n    VULKAN_HPP_NAMESPACE::Format                              vertexFormat = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR         vertexData   = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                          vertexStride = {};\n    VULKAN_HPP_NAMESPACE::Format                              radiusFormat = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR         radiusData   = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                          radiusStride = {};\n    VULKAN_HPP_NAMESPACE::IndexType                           indexType    = VULKAN_HPP_NAMESPACE::IndexType::eUint16;\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR         indexData    = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                          indexStride  = {};\n    VULKAN_HPP_NAMESPACE::RayTracingLssIndexingModeNV         indexingMode = VULKAN_HPP_NAMESPACE::RayTracingLssIndexingModeNV::eList;\n    VULKAN_HPP_NAMESPACE::RayTracingLssPrimitiveEndCapsModeNV endCapsMode  = VULKAN_HPP_NAMESPACE::RayTracingLssPrimitiveEndCapsModeNV::eNone;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAccelerationStructureGeometryLinearSweptSpheresDataNV>\n  {\n    using Type = AccelerationStructureGeometryLinearSweptSpheresDataNV;\n  };\n\n  struct AccelerationStructureGeometryMotionTrianglesDataNV\n  {\n    using NativeType = VkAccelerationStructureGeometryMotionTrianglesDataNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAccelerationStructureGeometryMotionTrianglesDataNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryMotionTrianglesDataNV( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR vertexData_ = {},\n                                                                                const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , vertexData{ vertexData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14\n      AccelerationStructureGeometryMotionTrianglesDataNV( AccelerationStructureGeometryMotionTrianglesDataNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureGeometryMotionTrianglesDataNV( VkAccelerationStructureGeometryMotionTrianglesDataNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureGeometryMotionTrianglesDataNV( *reinterpret_cast<AccelerationStructureGeometryMotionTrianglesDataNV const *>( &rhs ) )\n    {\n    }\n\n    AccelerationStructureGeometryMotionTrianglesDataNV &\n      operator=( AccelerationStructureGeometryMotionTrianglesDataNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureGeometryMotionTrianglesDataNV & operator=( VkAccelerationStructureGeometryMotionTrianglesDataNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryMotionTrianglesDataNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryMotionTrianglesDataNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometryMotionTrianglesDataNV &\n      setVertexData( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & vertexData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexData = vertexData_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureGeometryMotionTrianglesDataNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureGeometryMotionTrianglesDataNV *>( this );\n    }\n\n    operator VkAccelerationStructureGeometryMotionTrianglesDataNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureGeometryMotionTrianglesDataNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, vertexData );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType      = StructureType::eAccelerationStructureGeometryMotionTrianglesDataNV;\n    const void *                                      pNext      = {};\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR vertexData = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAccelerationStructureGeometryMotionTrianglesDataNV>\n  {\n    using Type = AccelerationStructureGeometryMotionTrianglesDataNV;\n  };\n\n  struct AccelerationStructureGeometrySpheresDataNV\n  {\n    using NativeType = VkAccelerationStructureGeometrySpheresDataNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAccelerationStructureGeometrySpheresDataNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometrySpheresDataNV( VULKAN_HPP_NAMESPACE::Format vertexFormat_ = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                                                        VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR vertexData_   = {},\n                                                                        VULKAN_HPP_NAMESPACE::DeviceSize                  vertexStride_ = {},\n                                                                        VULKAN_HPP_NAMESPACE::Format radiusFormat_ = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                                                        VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR radiusData_   = {},\n                                                                        VULKAN_HPP_NAMESPACE::DeviceSize                  radiusStride_ = {},\n                                                                        VULKAN_HPP_NAMESPACE::IndexType indexType_ = VULKAN_HPP_NAMESPACE::IndexType::eUint16,\n                                                                        VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR indexData_   = {},\n                                                                        VULKAN_HPP_NAMESPACE::DeviceSize                  indexStride_ = {},\n                                                                        const void *                                      pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , vertexFormat{ vertexFormat_ }\n      , vertexData{ vertexData_ }\n      , vertexStride{ vertexStride_ }\n      , radiusFormat{ radiusFormat_ }\n      , radiusData{ radiusData_ }\n      , radiusStride{ radiusStride_ }\n      , indexType{ indexType_ }\n      , indexData{ indexData_ }\n      , indexStride{ indexStride_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometrySpheresDataNV( AccelerationStructureGeometrySpheresDataNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureGeometrySpheresDataNV( VkAccelerationStructureGeometrySpheresDataNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureGeometrySpheresDataNV( *reinterpret_cast<AccelerationStructureGeometrySpheresDataNV const *>( &rhs ) )\n    {\n    }\n\n    AccelerationStructureGeometrySpheresDataNV & operator=( AccelerationStructureGeometrySpheresDataNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureGeometrySpheresDataNV & operator=( VkAccelerationStructureGeometrySpheresDataNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureGeometrySpheresDataNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometrySpheresDataNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometrySpheresDataNV & setVertexFormat( VULKAN_HPP_NAMESPACE::Format vertexFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexFormat = vertexFormat_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometrySpheresDataNV &\n      setVertexData( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & vertexData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexData = vertexData_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometrySpheresDataNV & setVertexStride( VULKAN_HPP_NAMESPACE::DeviceSize vertexStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexStride = vertexStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometrySpheresDataNV & setRadiusFormat( VULKAN_HPP_NAMESPACE::Format radiusFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      radiusFormat = radiusFormat_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometrySpheresDataNV &\n      setRadiusData( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & radiusData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      radiusData = radiusData_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometrySpheresDataNV & setRadiusStride( VULKAN_HPP_NAMESPACE::DeviceSize radiusStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      radiusStride = radiusStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometrySpheresDataNV & setIndexType( VULKAN_HPP_NAMESPACE::IndexType indexType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexType = indexType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometrySpheresDataNV &\n      setIndexData( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & indexData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexData = indexData_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureGeometrySpheresDataNV & setIndexStride( VULKAN_HPP_NAMESPACE::DeviceSize indexStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexStride = indexStride_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureGeometrySpheresDataNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureGeometrySpheresDataNV *>( this );\n    }\n\n    operator VkAccelerationStructureGeometrySpheresDataNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureGeometrySpheresDataNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::IndexType const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, vertexFormat, vertexData, vertexStride, radiusFormat, radiusData, radiusStride, indexType, indexData, indexStride );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType        = StructureType::eAccelerationStructureGeometrySpheresDataNV;\n    const void *                                      pNext        = {};\n    VULKAN_HPP_NAMESPACE::Format                      vertexFormat = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR vertexData   = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                  vertexStride = {};\n    VULKAN_HPP_NAMESPACE::Format                      radiusFormat = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR radiusData   = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                  radiusStride = {};\n    VULKAN_HPP_NAMESPACE::IndexType                   indexType    = VULKAN_HPP_NAMESPACE::IndexType::eUint16;\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR indexData    = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                  indexStride  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAccelerationStructureGeometrySpheresDataNV>\n  {\n    using Type = AccelerationStructureGeometrySpheresDataNV;\n  };\n\n  struct TransformMatrixKHR\n  {\n    using NativeType = VkTransformMatrixKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 TransformMatrixKHR( std::array<std::array<float, 4>, 3> const & matrix_ = {} ) VULKAN_HPP_NOEXCEPT : matrix{ matrix_ } {}\n\n    VULKAN_HPP_CONSTEXPR_14 TransformMatrixKHR( TransformMatrixKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    TransformMatrixKHR( VkTransformMatrixKHR const & rhs ) VULKAN_HPP_NOEXCEPT : TransformMatrixKHR( *reinterpret_cast<TransformMatrixKHR const *>( &rhs ) ) {}\n\n    TransformMatrixKHR & operator=( TransformMatrixKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    TransformMatrixKHR & operator=( VkTransformMatrixKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::TransformMatrixKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 TransformMatrixKHR & setMatrix( std::array<std::array<float, 4>, 3> matrix_ ) VULKAN_HPP_NOEXCEPT\n    {\n      matrix = matrix_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkTransformMatrixKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkTransformMatrixKHR *>( this );\n    }\n\n    operator VkTransformMatrixKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkTransformMatrixKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::ArrayWrapper2D<float, 3, 4> const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( matrix );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( TransformMatrixKHR const & ) const = default;\n#else\n    bool operator==( TransformMatrixKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( matrix == rhs.matrix );\n#  endif\n    }\n\n    bool operator!=( TransformMatrixKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::ArrayWrapper2D<float, 3, 4> matrix = {};\n  };\n\n  using TransformMatrixNV = TransformMatrixKHR;\n\n  struct AccelerationStructureInstanceKHR\n  {\n    using NativeType = VkAccelerationStructureInstanceKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureInstanceKHR( VULKAN_HPP_NAMESPACE::TransformMatrixKHR       transform_                              = {},\n                                                              uint32_t                                       instanceCustomIndex_                    = {},\n                                                              uint32_t                                       mask_                                   = {},\n                                                              uint32_t                                       instanceShaderBindingTableRecordOffset_ = {},\n                                                              VULKAN_HPP_NAMESPACE::GeometryInstanceFlagsKHR flags_                                  = {},\n                                                              uint64_t accelerationStructureReference_ = {} ) VULKAN_HPP_NOEXCEPT\n      : transform{ transform_ }\n      , instanceCustomIndex{ instanceCustomIndex_ }\n      , mask{ mask_ }\n      , instanceShaderBindingTableRecordOffset{ instanceShaderBindingTableRecordOffset_ }\n      , flags{ flags_ }\n      , accelerationStructureReference{ accelerationStructureReference_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureInstanceKHR( AccelerationStructureInstanceKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureInstanceKHR( VkAccelerationStructureInstanceKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureInstanceKHR( *reinterpret_cast<AccelerationStructureInstanceKHR const *>( &rhs ) )\n    {\n    }\n\n    AccelerationStructureInstanceKHR & operator=( AccelerationStructureInstanceKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureInstanceKHR & operator=( VkAccelerationStructureInstanceKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureInstanceKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureInstanceKHR & setTransform( VULKAN_HPP_NAMESPACE::TransformMatrixKHR const & transform_ ) VULKAN_HPP_NOEXCEPT\n    {\n      transform = transform_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureInstanceKHR & setInstanceCustomIndex( uint32_t instanceCustomIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      instanceCustomIndex = instanceCustomIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureInstanceKHR & setMask( uint32_t mask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mask = mask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureInstanceKHR &\n      setInstanceShaderBindingTableRecordOffset( uint32_t instanceShaderBindingTableRecordOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      instanceShaderBindingTableRecordOffset = instanceShaderBindingTableRecordOffset_;\n      return *this;\n    }\n\n    AccelerationStructureInstanceKHR & setFlags( VULKAN_HPP_NAMESPACE::GeometryInstanceFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = *reinterpret_cast<VkGeometryInstanceFlagsKHR *>( &flags_ );\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureInstanceKHR & setAccelerationStructureReference( uint64_t accelerationStructureReference_ ) VULKAN_HPP_NOEXCEPT\n    {\n      accelerationStructureReference = accelerationStructureReference_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureInstanceKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureInstanceKHR *>( this );\n    }\n\n    operator VkAccelerationStructureInstanceKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureInstanceKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::TransformMatrixKHR const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VkGeometryInstanceFlagsKHR const &,\n               uint64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( transform, instanceCustomIndex, mask, instanceShaderBindingTableRecordOffset, flags, accelerationStructureReference );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AccelerationStructureInstanceKHR const & ) const = default;\n#else\n    bool operator==( AccelerationStructureInstanceKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( transform == rhs.transform ) && ( instanceCustomIndex == rhs.instanceCustomIndex ) && ( mask == rhs.mask ) &&\n             ( instanceShaderBindingTableRecordOffset == rhs.instanceShaderBindingTableRecordOffset ) && ( flags == rhs.flags ) &&\n             ( accelerationStructureReference == rhs.accelerationStructureReference );\n#  endif\n    }\n\n    bool operator!=( AccelerationStructureInstanceKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::TransformMatrixKHR transform = {};\n    uint32_t                                 instanceCustomIndex                    : 24;\n    uint32_t                                 mask                                   : 8;\n    uint32_t                                 instanceShaderBindingTableRecordOffset : 24;\n    VkGeometryInstanceFlagsKHR               flags                                  : 8;\n    uint64_t                                 accelerationStructureReference = {};\n  };\n\n  using AccelerationStructureInstanceNV = AccelerationStructureInstanceKHR;\n\n  struct AccelerationStructureMatrixMotionInstanceNV\n  {\n    using NativeType = VkAccelerationStructureMatrixMotionInstanceNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMatrixMotionInstanceNV( VULKAN_HPP_NAMESPACE::TransformMatrixKHR transformT0_                            = {},\n                                                                         VULKAN_HPP_NAMESPACE::TransformMatrixKHR transformT1_                            = {},\n                                                                         uint32_t                                 instanceCustomIndex_                    = {},\n                                                                         uint32_t                                 mask_                                   = {},\n                                                                         uint32_t                                 instanceShaderBindingTableRecordOffset_ = {},\n                                                                         VULKAN_HPP_NAMESPACE::GeometryInstanceFlagsKHR flags_                            = {},\n                                                                         uint64_t accelerationStructureReference_ = {} ) VULKAN_HPP_NOEXCEPT\n      : transformT0{ transformT0_ }\n      , transformT1{ transformT1_ }\n      , instanceCustomIndex{ instanceCustomIndex_ }\n      , mask{ mask_ }\n      , instanceShaderBindingTableRecordOffset{ instanceShaderBindingTableRecordOffset_ }\n      , flags{ flags_ }\n      , accelerationStructureReference{ accelerationStructureReference_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14\n      AccelerationStructureMatrixMotionInstanceNV( AccelerationStructureMatrixMotionInstanceNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureMatrixMotionInstanceNV( VkAccelerationStructureMatrixMotionInstanceNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureMatrixMotionInstanceNV( *reinterpret_cast<AccelerationStructureMatrixMotionInstanceNV const *>( &rhs ) )\n    {\n    }\n\n    AccelerationStructureMatrixMotionInstanceNV & operator=( AccelerationStructureMatrixMotionInstanceNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureMatrixMotionInstanceNV & operator=( VkAccelerationStructureMatrixMotionInstanceNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureMatrixMotionInstanceNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMatrixMotionInstanceNV &\n      setTransformT0( VULKAN_HPP_NAMESPACE::TransformMatrixKHR const & transformT0_ ) VULKAN_HPP_NOEXCEPT\n    {\n      transformT0 = transformT0_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMatrixMotionInstanceNV &\n      setTransformT1( VULKAN_HPP_NAMESPACE::TransformMatrixKHR const & transformT1_ ) VULKAN_HPP_NOEXCEPT\n    {\n      transformT1 = transformT1_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMatrixMotionInstanceNV & setInstanceCustomIndex( uint32_t instanceCustomIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      instanceCustomIndex = instanceCustomIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMatrixMotionInstanceNV & setMask( uint32_t mask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mask = mask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMatrixMotionInstanceNV &\n      setInstanceShaderBindingTableRecordOffset( uint32_t instanceShaderBindingTableRecordOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      instanceShaderBindingTableRecordOffset = instanceShaderBindingTableRecordOffset_;\n      return *this;\n    }\n\n    AccelerationStructureMatrixMotionInstanceNV & setFlags( VULKAN_HPP_NAMESPACE::GeometryInstanceFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = *reinterpret_cast<VkGeometryInstanceFlagsKHR *>( &flags_ );\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMatrixMotionInstanceNV &\n      setAccelerationStructureReference( uint64_t accelerationStructureReference_ ) VULKAN_HPP_NOEXCEPT\n    {\n      accelerationStructureReference = accelerationStructureReference_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureMatrixMotionInstanceNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureMatrixMotionInstanceNV *>( this );\n    }\n\n    operator VkAccelerationStructureMatrixMotionInstanceNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureMatrixMotionInstanceNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::TransformMatrixKHR const &,\n               VULKAN_HPP_NAMESPACE::TransformMatrixKHR const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VkGeometryInstanceFlagsKHR const &,\n               uint64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( transformT0, transformT1, instanceCustomIndex, mask, instanceShaderBindingTableRecordOffset, flags, accelerationStructureReference );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AccelerationStructureMatrixMotionInstanceNV const & ) const = default;\n#else\n    bool operator==( AccelerationStructureMatrixMotionInstanceNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( transformT0 == rhs.transformT0 ) && ( transformT1 == rhs.transformT1 ) && ( instanceCustomIndex == rhs.instanceCustomIndex ) &&\n             ( mask == rhs.mask ) && ( instanceShaderBindingTableRecordOffset == rhs.instanceShaderBindingTableRecordOffset ) && ( flags == rhs.flags ) &&\n             ( accelerationStructureReference == rhs.accelerationStructureReference );\n#  endif\n    }\n\n    bool operator!=( AccelerationStructureMatrixMotionInstanceNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::TransformMatrixKHR transformT0 = {};\n    VULKAN_HPP_NAMESPACE::TransformMatrixKHR transformT1 = {};\n    uint32_t                                 instanceCustomIndex                    : 24;\n    uint32_t                                 mask                                   : 8;\n    uint32_t                                 instanceShaderBindingTableRecordOffset : 24;\n    VkGeometryInstanceFlagsKHR               flags                                  : 8;\n    uint64_t                                 accelerationStructureReference = {};\n  };\n\n  struct AccelerationStructureMemoryRequirementsInfoNV\n  {\n    using NativeType = VkAccelerationStructureMemoryRequirementsInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAccelerationStructureMemoryRequirementsInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AccelerationStructureMemoryRequirementsInfoNV(\n      VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsTypeNV type_ = VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsTypeNV::eObject,\n      VULKAN_HPP_NAMESPACE::AccelerationStructureNV                       accelerationStructure_ = {},\n      const void *                                                        pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , type{ type_ }\n      , accelerationStructure{ accelerationStructure_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      AccelerationStructureMemoryRequirementsInfoNV( AccelerationStructureMemoryRequirementsInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureMemoryRequirementsInfoNV( VkAccelerationStructureMemoryRequirementsInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureMemoryRequirementsInfoNV( *reinterpret_cast<AccelerationStructureMemoryRequirementsInfoNV const *>( &rhs ) )\n    {\n    }\n\n    AccelerationStructureMemoryRequirementsInfoNV & operator=( AccelerationStructureMemoryRequirementsInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureMemoryRequirementsInfoNV & operator=( VkAccelerationStructureMemoryRequirementsInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMemoryRequirementsInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMemoryRequirementsInfoNV &\n      setType( VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsTypeNV type_ ) VULKAN_HPP_NOEXCEPT\n    {\n      type = type_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMemoryRequirementsInfoNV &\n      setAccelerationStructure( VULKAN_HPP_NAMESPACE::AccelerationStructureNV accelerationStructure_ ) VULKAN_HPP_NOEXCEPT\n    {\n      accelerationStructure = accelerationStructure_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureMemoryRequirementsInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureMemoryRequirementsInfoNV *>( this );\n    }\n\n    operator VkAccelerationStructureMemoryRequirementsInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureMemoryRequirementsInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsTypeNV const &,\n               VULKAN_HPP_NAMESPACE::AccelerationStructureNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, type, accelerationStructure );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AccelerationStructureMemoryRequirementsInfoNV const & ) const = default;\n#else\n    bool operator==( AccelerationStructureMemoryRequirementsInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( type == rhs.type ) && ( accelerationStructure == rhs.accelerationStructure );\n#  endif\n    }\n\n    bool operator!=( AccelerationStructureMemoryRequirementsInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                 sType = StructureType::eAccelerationStructureMemoryRequirementsInfoNV;\n    const void *                                                        pNext = {};\n    VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsTypeNV type  = VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsTypeNV::eObject;\n    VULKAN_HPP_NAMESPACE::AccelerationStructureNV                       accelerationStructure = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAccelerationStructureMemoryRequirementsInfoNV>\n  {\n    using Type = AccelerationStructureMemoryRequirementsInfoNV;\n  };\n\n  struct AccelerationStructureMotionInfoNV\n  {\n    using NativeType = VkAccelerationStructureMotionInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAccelerationStructureMotionInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AccelerationStructureMotionInfoNV( uint32_t                                                     maxInstances_ = {},\n                                                            VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInfoFlagsNV flags_        = {},\n                                                            const void *                                                 pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxInstances{ maxInstances_ }\n      , flags{ flags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AccelerationStructureMotionInfoNV( AccelerationStructureMotionInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureMotionInfoNV( VkAccelerationStructureMotionInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureMotionInfoNV( *reinterpret_cast<AccelerationStructureMotionInfoNV const *>( &rhs ) )\n    {\n    }\n\n    AccelerationStructureMotionInfoNV & operator=( AccelerationStructureMotionInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureMotionInfoNV & operator=( VkAccelerationStructureMotionInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMotionInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMotionInfoNV & setMaxInstances( uint32_t maxInstances_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxInstances = maxInstances_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMotionInfoNV &\n      setFlags( VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInfoFlagsNV flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureMotionInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureMotionInfoNV *>( this );\n    }\n\n    operator VkAccelerationStructureMotionInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureMotionInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInfoFlagsNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxInstances, flags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AccelerationStructureMotionInfoNV const & ) const = default;\n#else\n    bool operator==( AccelerationStructureMotionInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxInstances == rhs.maxInstances ) && ( flags == rhs.flags );\n#  endif\n    }\n\n    bool operator!=( AccelerationStructureMotionInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                          sType        = StructureType::eAccelerationStructureMotionInfoNV;\n    const void *                                                 pNext        = {};\n    uint32_t                                                     maxInstances = {};\n    VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInfoFlagsNV flags        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAccelerationStructureMotionInfoNV>\n  {\n    using Type = AccelerationStructureMotionInfoNV;\n  };\n\n  struct SRTDataNV\n  {\n    using NativeType = VkSRTDataNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SRTDataNV( float sx_  = {},\n                                    float a_   = {},\n                                    float b_   = {},\n                                    float pvx_ = {},\n                                    float sy_  = {},\n                                    float c_   = {},\n                                    float pvy_ = {},\n                                    float sz_  = {},\n                                    float pvz_ = {},\n                                    float qx_  = {},\n                                    float qy_  = {},\n                                    float qz_  = {},\n                                    float qw_  = {},\n                                    float tx_  = {},\n                                    float ty_  = {},\n                                    float tz_  = {} ) VULKAN_HPP_NOEXCEPT\n      : sx{ sx_ }\n      , a{ a_ }\n      , b{ b_ }\n      , pvx{ pvx_ }\n      , sy{ sy_ }\n      , c{ c_ }\n      , pvy{ pvy_ }\n      , sz{ sz_ }\n      , pvz{ pvz_ }\n      , qx{ qx_ }\n      , qy{ qy_ }\n      , qz{ qz_ }\n      , qw{ qw_ }\n      , tx{ tx_ }\n      , ty{ ty_ }\n      , tz{ tz_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SRTDataNV( SRTDataNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SRTDataNV( VkSRTDataNV const & rhs ) VULKAN_HPP_NOEXCEPT : SRTDataNV( *reinterpret_cast<SRTDataNV const *>( &rhs ) ) {}\n\n    SRTDataNV & operator=( SRTDataNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SRTDataNV & operator=( VkSRTDataNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SRTDataNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SRTDataNV & setSx( float sx_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sx = sx_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SRTDataNV & setA( float a_ ) VULKAN_HPP_NOEXCEPT\n    {\n      a = a_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SRTDataNV & setB( float b_ ) VULKAN_HPP_NOEXCEPT\n    {\n      b = b_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SRTDataNV & setPvx( float pvx_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pvx = pvx_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SRTDataNV & setSy( float sy_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sy = sy_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SRTDataNV & setC( float c_ ) VULKAN_HPP_NOEXCEPT\n    {\n      c = c_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SRTDataNV & setPvy( float pvy_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pvy = pvy_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SRTDataNV & setSz( float sz_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sz = sz_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SRTDataNV & setPvz( float pvz_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pvz = pvz_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SRTDataNV & setQx( float qx_ ) VULKAN_HPP_NOEXCEPT\n    {\n      qx = qx_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SRTDataNV & setQy( float qy_ ) VULKAN_HPP_NOEXCEPT\n    {\n      qy = qy_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SRTDataNV & setQz( float qz_ ) VULKAN_HPP_NOEXCEPT\n    {\n      qz = qz_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SRTDataNV & setQw( float qw_ ) VULKAN_HPP_NOEXCEPT\n    {\n      qw = qw_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SRTDataNV & setTx( float tx_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tx = tx_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SRTDataNV & setTy( float ty_ ) VULKAN_HPP_NOEXCEPT\n    {\n      ty = ty_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SRTDataNV & setTz( float tz_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tz = tz_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSRTDataNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSRTDataNV *>( this );\n    }\n\n    operator VkSRTDataNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSRTDataNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<float const &,\n               float const &,\n               float const &,\n               float const &,\n               float const &,\n               float const &,\n               float const &,\n               float const &,\n               float const &,\n               float const &,\n               float const &,\n               float const &,\n               float const &,\n               float const &,\n               float const &,\n               float const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sx, a, b, pvx, sy, c, pvy, sz, pvz, qx, qy, qz, qw, tx, ty, tz );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SRTDataNV const & ) const = default;\n#else\n    bool operator==( SRTDataNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sx == rhs.sx ) && ( a == rhs.a ) && ( b == rhs.b ) && ( pvx == rhs.pvx ) && ( sy == rhs.sy ) && ( c == rhs.c ) && ( pvy == rhs.pvy ) &&\n             ( sz == rhs.sz ) && ( pvz == rhs.pvz ) && ( qx == rhs.qx ) && ( qy == rhs.qy ) && ( qz == rhs.qz ) && ( qw == rhs.qw ) && ( tx == rhs.tx ) &&\n             ( ty == rhs.ty ) && ( tz == rhs.tz );\n#  endif\n    }\n\n    bool operator!=( SRTDataNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    float sx  = {};\n    float a   = {};\n    float b   = {};\n    float pvx = {};\n    float sy  = {};\n    float c   = {};\n    float pvy = {};\n    float sz  = {};\n    float pvz = {};\n    float qx  = {};\n    float qy  = {};\n    float qz  = {};\n    float qw  = {};\n    float tx  = {};\n    float ty  = {};\n    float tz  = {};\n  };\n\n  struct AccelerationStructureSRTMotionInstanceNV\n  {\n    using NativeType = VkAccelerationStructureSRTMotionInstanceNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AccelerationStructureSRTMotionInstanceNV( VULKAN_HPP_NAMESPACE::SRTDataNV                transformT0_                            = {},\n                                                                   VULKAN_HPP_NAMESPACE::SRTDataNV                transformT1_                            = {},\n                                                                   uint32_t                                       instanceCustomIndex_                    = {},\n                                                                   uint32_t                                       mask_                                   = {},\n                                                                   uint32_t                                       instanceShaderBindingTableRecordOffset_ = {},\n                                                                   VULKAN_HPP_NAMESPACE::GeometryInstanceFlagsKHR flags_                                  = {},\n                                                                   uint64_t accelerationStructureReference_ = {} ) VULKAN_HPP_NOEXCEPT\n      : transformT0{ transformT0_ }\n      , transformT1{ transformT1_ }\n      , instanceCustomIndex{ instanceCustomIndex_ }\n      , mask{ mask_ }\n      , instanceShaderBindingTableRecordOffset{ instanceShaderBindingTableRecordOffset_ }\n      , flags{ flags_ }\n      , accelerationStructureReference{ accelerationStructureReference_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AccelerationStructureSRTMotionInstanceNV( AccelerationStructureSRTMotionInstanceNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureSRTMotionInstanceNV( VkAccelerationStructureSRTMotionInstanceNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureSRTMotionInstanceNV( *reinterpret_cast<AccelerationStructureSRTMotionInstanceNV const *>( &rhs ) )\n    {\n    }\n\n    AccelerationStructureSRTMotionInstanceNV & operator=( AccelerationStructureSRTMotionInstanceNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureSRTMotionInstanceNV & operator=( VkAccelerationStructureSRTMotionInstanceNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureSRTMotionInstanceNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureSRTMotionInstanceNV &\n      setTransformT0( VULKAN_HPP_NAMESPACE::SRTDataNV const & transformT0_ ) VULKAN_HPP_NOEXCEPT\n    {\n      transformT0 = transformT0_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureSRTMotionInstanceNV &\n      setTransformT1( VULKAN_HPP_NAMESPACE::SRTDataNV const & transformT1_ ) VULKAN_HPP_NOEXCEPT\n    {\n      transformT1 = transformT1_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureSRTMotionInstanceNV & setInstanceCustomIndex( uint32_t instanceCustomIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      instanceCustomIndex = instanceCustomIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureSRTMotionInstanceNV & setMask( uint32_t mask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mask = mask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureSRTMotionInstanceNV &\n      setInstanceShaderBindingTableRecordOffset( uint32_t instanceShaderBindingTableRecordOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      instanceShaderBindingTableRecordOffset = instanceShaderBindingTableRecordOffset_;\n      return *this;\n    }\n\n    AccelerationStructureSRTMotionInstanceNV & setFlags( VULKAN_HPP_NAMESPACE::GeometryInstanceFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = *reinterpret_cast<VkGeometryInstanceFlagsKHR *>( &flags_ );\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureSRTMotionInstanceNV &\n      setAccelerationStructureReference( uint64_t accelerationStructureReference_ ) VULKAN_HPP_NOEXCEPT\n    {\n      accelerationStructureReference = accelerationStructureReference_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureSRTMotionInstanceNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureSRTMotionInstanceNV *>( this );\n    }\n\n    operator VkAccelerationStructureSRTMotionInstanceNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureSRTMotionInstanceNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::SRTDataNV const &,\n               VULKAN_HPP_NAMESPACE::SRTDataNV const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VkGeometryInstanceFlagsKHR const &,\n               uint64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( transformT0, transformT1, instanceCustomIndex, mask, instanceShaderBindingTableRecordOffset, flags, accelerationStructureReference );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AccelerationStructureSRTMotionInstanceNV const & ) const = default;\n#else\n    bool operator==( AccelerationStructureSRTMotionInstanceNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( transformT0 == rhs.transformT0 ) && ( transformT1 == rhs.transformT1 ) && ( instanceCustomIndex == rhs.instanceCustomIndex ) &&\n             ( mask == rhs.mask ) && ( instanceShaderBindingTableRecordOffset == rhs.instanceShaderBindingTableRecordOffset ) && ( flags == rhs.flags ) &&\n             ( accelerationStructureReference == rhs.accelerationStructureReference );\n#  endif\n    }\n\n    bool operator!=( AccelerationStructureSRTMotionInstanceNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::SRTDataNV transformT0 = {};\n    VULKAN_HPP_NAMESPACE::SRTDataNV transformT1 = {};\n    uint32_t                        instanceCustomIndex                    : 24;\n    uint32_t                        mask                                   : 8;\n    uint32_t                        instanceShaderBindingTableRecordOffset : 24;\n    VkGeometryInstanceFlagsKHR      flags                                  : 8;\n    uint64_t                        accelerationStructureReference = {};\n  };\n\n  union AccelerationStructureMotionInstanceDataNV\n  {\n    using NativeType = VkAccelerationStructureMotionInstanceDataNV;\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMotionInstanceDataNV( VULKAN_HPP_NAMESPACE::AccelerationStructureInstanceKHR staticInstance_ = {} )\n      : staticInstance( staticInstance_ )\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMotionInstanceDataNV( VULKAN_HPP_NAMESPACE::AccelerationStructureMatrixMotionInstanceNV matrixMotionInstance_ )\n      : matrixMotionInstance( matrixMotionInstance_ )\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMotionInstanceDataNV( VULKAN_HPP_NAMESPACE::AccelerationStructureSRTMotionInstanceNV srtMotionInstance_ )\n      : srtMotionInstance( srtMotionInstance_ )\n    {\n    }\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_UNION_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMotionInstanceDataNV &\n      setStaticInstance( VULKAN_HPP_NAMESPACE::AccelerationStructureInstanceKHR const & staticInstance_ ) VULKAN_HPP_NOEXCEPT\n    {\n      staticInstance = staticInstance_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMotionInstanceDataNV &\n      setMatrixMotionInstance( VULKAN_HPP_NAMESPACE::AccelerationStructureMatrixMotionInstanceNV const & matrixMotionInstance_ ) VULKAN_HPP_NOEXCEPT\n    {\n      matrixMotionInstance = matrixMotionInstance_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMotionInstanceDataNV &\n      setSrtMotionInstance( VULKAN_HPP_NAMESPACE::AccelerationStructureSRTMotionInstanceNV const & srtMotionInstance_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srtMotionInstance = srtMotionInstance_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureMotionInstanceDataNV const &() const\n    {\n      return *reinterpret_cast<const VkAccelerationStructureMotionInstanceDataNV *>( this );\n    }\n\n    operator VkAccelerationStructureMotionInstanceDataNV &()\n    {\n      return *reinterpret_cast<VkAccelerationStructureMotionInstanceDataNV *>( this );\n    }\n\n#ifdef VULKAN_HPP_HAS_UNRESTRICTED_UNIONS\n    VULKAN_HPP_NAMESPACE::AccelerationStructureInstanceKHR            staticInstance;\n    VULKAN_HPP_NAMESPACE::AccelerationStructureMatrixMotionInstanceNV matrixMotionInstance;\n    VULKAN_HPP_NAMESPACE::AccelerationStructureSRTMotionInstanceNV    srtMotionInstance;\n#else\n    VkAccelerationStructureInstanceKHR            staticInstance;\n    VkAccelerationStructureMatrixMotionInstanceNV matrixMotionInstance;\n    VkAccelerationStructureSRTMotionInstanceNV    srtMotionInstance;\n#endif /*VULKAN_HPP_HAS_UNRESTRICTED_UNIONS*/\n  };\n\n  struct AccelerationStructureMotionInstanceNV\n  {\n    using NativeType = VkAccelerationStructureMotionInstanceNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMotionInstanceNV(\n      VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceTypeNV  type_  = VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceTypeNV::eStatic,\n      VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceFlagsNV flags_ = {},\n      VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceDataNV  data_  = {} ) VULKAN_HPP_NOEXCEPT\n      : type{ type_ }\n      , flags{ flags_ }\n      , data{ data_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMotionInstanceNV( AccelerationStructureMotionInstanceNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureMotionInstanceNV( VkAccelerationStructureMotionInstanceNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureMotionInstanceNV( *reinterpret_cast<AccelerationStructureMotionInstanceNV const *>( &rhs ) )\n    {\n    }\n\n    AccelerationStructureMotionInstanceNV & operator=( AccelerationStructureMotionInstanceNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureMotionInstanceNV & operator=( VkAccelerationStructureMotionInstanceNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMotionInstanceNV &\n      setType( VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceTypeNV type_ ) VULKAN_HPP_NOEXCEPT\n    {\n      type = type_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMotionInstanceNV &\n      setFlags( VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceFlagsNV flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureMotionInstanceNV &\n      setData( VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceDataNV const & data_ ) VULKAN_HPP_NOEXCEPT\n    {\n      data = data_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureMotionInstanceNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureMotionInstanceNV *>( this );\n    }\n\n    operator VkAccelerationStructureMotionInstanceNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureMotionInstanceNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceTypeNV const &,\n               VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceFlagsNV const &,\n               VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceDataNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( type, flags, data );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceTypeNV  type  = VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceTypeNV::eStatic;\n    VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceFlagsNV flags = {};\n    VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceDataNV  data  = {};\n  };\n\n  struct MicromapUsageEXT\n  {\n    using NativeType = VkMicromapUsageEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MicromapUsageEXT( uint32_t count_ = {}, uint32_t subdivisionLevel_ = {}, uint32_t format_ = {} ) VULKAN_HPP_NOEXCEPT\n      : count{ count_ }\n      , subdivisionLevel{ subdivisionLevel_ }\n      , format{ format_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MicromapUsageEXT( MicromapUsageEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MicromapUsageEXT( VkMicromapUsageEXT const & rhs ) VULKAN_HPP_NOEXCEPT : MicromapUsageEXT( *reinterpret_cast<MicromapUsageEXT const *>( &rhs ) ) {}\n\n    MicromapUsageEXT & operator=( MicromapUsageEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MicromapUsageEXT & operator=( VkMicromapUsageEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MicromapUsageEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MicromapUsageEXT & setCount( uint32_t count_ ) VULKAN_HPP_NOEXCEPT\n    {\n      count = count_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapUsageEXT & setSubdivisionLevel( uint32_t subdivisionLevel_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subdivisionLevel = subdivisionLevel_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapUsageEXT & setFormat( uint32_t format_ ) VULKAN_HPP_NOEXCEPT\n    {\n      format = format_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMicromapUsageEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMicromapUsageEXT *>( this );\n    }\n\n    operator VkMicromapUsageEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMicromapUsageEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( count, subdivisionLevel, format );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MicromapUsageEXT const & ) const = default;\n#else\n    bool                                          operator==( MicromapUsageEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( count == rhs.count ) && ( subdivisionLevel == rhs.subdivisionLevel ) && ( format == rhs.format );\n#  endif\n    }\n\n    bool operator!=( MicromapUsageEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t count            = {};\n    uint32_t subdivisionLevel = {};\n    uint32_t format           = {};\n  };\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  struct AccelerationStructureTrianglesDisplacementMicromapNV\n  {\n    using NativeType = VkAccelerationStructureTrianglesDisplacementMicromapNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAccelerationStructureTrianglesDisplacementMicromapNV;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesDisplacementMicromapNV(\n      VULKAN_HPP_NAMESPACE::Format                           displacementBiasAndScaleFormat_        = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n      VULKAN_HPP_NAMESPACE::Format                           displacementVectorFormat_              = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n      VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR      displacementBiasAndScaleBuffer_        = {},\n      VULKAN_HPP_NAMESPACE::DeviceSize                       displacementBiasAndScaleStride_        = {},\n      VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR      displacementVectorBuffer_              = {},\n      VULKAN_HPP_NAMESPACE::DeviceSize                       displacementVectorStride_              = {},\n      VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR      displacedMicromapPrimitiveFlags_       = {},\n      VULKAN_HPP_NAMESPACE::DeviceSize                       displacedMicromapPrimitiveFlagsStride_ = {},\n      VULKAN_HPP_NAMESPACE::IndexType                        indexType_                             = VULKAN_HPP_NAMESPACE::IndexType::eUint16,\n      VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR      indexBuffer_                           = {},\n      VULKAN_HPP_NAMESPACE::DeviceSize                       indexStride_                           = {},\n      uint32_t                                               baseTriangle_                          = {},\n      uint32_t                                               usageCountsCount_                      = {},\n      const VULKAN_HPP_NAMESPACE::MicromapUsageEXT *         pUsageCounts_                          = {},\n      const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * const * ppUsageCounts_                         = {},\n      VULKAN_HPP_NAMESPACE::MicromapEXT                      micromap_                              = {},\n      void *                                                 pNext_                                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , displacementBiasAndScaleFormat{ displacementBiasAndScaleFormat_ }\n      , displacementVectorFormat{ displacementVectorFormat_ }\n      , displacementBiasAndScaleBuffer{ displacementBiasAndScaleBuffer_ }\n      , displacementBiasAndScaleStride{ displacementBiasAndScaleStride_ }\n      , displacementVectorBuffer{ displacementVectorBuffer_ }\n      , displacementVectorStride{ displacementVectorStride_ }\n      , displacedMicromapPrimitiveFlags{ displacedMicromapPrimitiveFlags_ }\n      , displacedMicromapPrimitiveFlagsStride{ displacedMicromapPrimitiveFlagsStride_ }\n      , indexType{ indexType_ }\n      , indexBuffer{ indexBuffer_ }\n      , indexStride{ indexStride_ }\n      , baseTriangle{ baseTriangle_ }\n      , usageCountsCount{ usageCountsCount_ }\n      , pUsageCounts{ pUsageCounts_ }\n      , ppUsageCounts{ ppUsageCounts_ }\n      , micromap{ micromap_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14\n      AccelerationStructureTrianglesDisplacementMicromapNV( AccelerationStructureTrianglesDisplacementMicromapNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureTrianglesDisplacementMicromapNV( VkAccelerationStructureTrianglesDisplacementMicromapNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureTrianglesDisplacementMicromapNV( *reinterpret_cast<AccelerationStructureTrianglesDisplacementMicromapNV const *>( &rhs ) )\n    {\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    AccelerationStructureTrianglesDisplacementMicromapNV(\n      VULKAN_HPP_NAMESPACE::Format                                                                                displacementBiasAndScaleFormat_,\n      VULKAN_HPP_NAMESPACE::Format                                                                                displacementVectorFormat_,\n      VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR                                                           displacementBiasAndScaleBuffer_,\n      VULKAN_HPP_NAMESPACE::DeviceSize                                                                            displacementBiasAndScaleStride_,\n      VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR                                                           displacementVectorBuffer_,\n      VULKAN_HPP_NAMESPACE::DeviceSize                                                                            displacementVectorStride_,\n      VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR                                                           displacedMicromapPrimitiveFlags_,\n      VULKAN_HPP_NAMESPACE::DeviceSize                                                                            displacedMicromapPrimitiveFlagsStride_,\n      VULKAN_HPP_NAMESPACE::IndexType                                                                             indexType_,\n      VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR                                                           indexBuffer_,\n      VULKAN_HPP_NAMESPACE::DeviceSize                                                                            indexStride_,\n      uint32_t                                                                                                    baseTriangle_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::MicromapUsageEXT> const &         usageCounts_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * const> const & pUsageCounts_ = {},\n      VULKAN_HPP_NAMESPACE::MicromapEXT                                                                           micromap_     = {},\n      void *                                                                                                      pNext_        = nullptr )\n      : pNext( pNext_ )\n      , displacementBiasAndScaleFormat( displacementBiasAndScaleFormat_ )\n      , displacementVectorFormat( displacementVectorFormat_ )\n      , displacementBiasAndScaleBuffer( displacementBiasAndScaleBuffer_ )\n      , displacementBiasAndScaleStride( displacementBiasAndScaleStride_ )\n      , displacementVectorBuffer( displacementVectorBuffer_ )\n      , displacementVectorStride( displacementVectorStride_ )\n      , displacedMicromapPrimitiveFlags( displacedMicromapPrimitiveFlags_ )\n      , displacedMicromapPrimitiveFlagsStride( displacedMicromapPrimitiveFlagsStride_ )\n      , indexType( indexType_ )\n      , indexBuffer( indexBuffer_ )\n      , indexStride( indexStride_ )\n      , baseTriangle( baseTriangle_ )\n      , usageCountsCount( static_cast<uint32_t>( usageCounts_.size() ) )\n      , pUsageCounts( usageCounts_.data() )\n      , ppUsageCounts( pUsageCounts_.data() )\n      , micromap( micromap_ )\n    {\n#      ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( usageCounts_.empty() || pUsageCounts_.empty() || ( usageCounts_.size() == pUsageCounts_.size() ) );\n#      else\n      if ( !usageCounts_.empty() && !pUsageCounts_.empty() && ( usageCounts_.size() != pUsageCounts_.size() ) )\n      {\n        throw LogicError(\n          VULKAN_HPP_NAMESPACE_STRING\n          \"::AccelerationStructureTrianglesDisplacementMicromapNV::AccelerationStructureTrianglesDisplacementMicromapNV: !usageCounts_.empty() && !pUsageCounts_.empty() && ( usageCounts_.size() != pUsageCounts_.size() )\" );\n      }\n#      endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    AccelerationStructureTrianglesDisplacementMicromapNV &\n      operator=( AccelerationStructureTrianglesDisplacementMicromapNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureTrianglesDisplacementMicromapNV & operator=( VkAccelerationStructureTrianglesDisplacementMicromapNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureTrianglesDisplacementMicromapNV const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesDisplacementMicromapNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesDisplacementMicromapNV &\n      setDisplacementBiasAndScaleFormat( VULKAN_HPP_NAMESPACE::Format displacementBiasAndScaleFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      displacementBiasAndScaleFormat = displacementBiasAndScaleFormat_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesDisplacementMicromapNV &\n      setDisplacementVectorFormat( VULKAN_HPP_NAMESPACE::Format displacementVectorFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      displacementVectorFormat = displacementVectorFormat_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesDisplacementMicromapNV &\n      setDisplacementBiasAndScaleBuffer( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & displacementBiasAndScaleBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      displacementBiasAndScaleBuffer = displacementBiasAndScaleBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesDisplacementMicromapNV &\n      setDisplacementBiasAndScaleStride( VULKAN_HPP_NAMESPACE::DeviceSize displacementBiasAndScaleStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      displacementBiasAndScaleStride = displacementBiasAndScaleStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesDisplacementMicromapNV &\n      setDisplacementVectorBuffer( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & displacementVectorBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      displacementVectorBuffer = displacementVectorBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesDisplacementMicromapNV &\n      setDisplacementVectorStride( VULKAN_HPP_NAMESPACE::DeviceSize displacementVectorStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      displacementVectorStride = displacementVectorStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesDisplacementMicromapNV &\n      setDisplacedMicromapPrimitiveFlags( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & displacedMicromapPrimitiveFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      displacedMicromapPrimitiveFlags = displacedMicromapPrimitiveFlags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesDisplacementMicromapNV &\n      setDisplacedMicromapPrimitiveFlagsStride( VULKAN_HPP_NAMESPACE::DeviceSize displacedMicromapPrimitiveFlagsStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      displacedMicromapPrimitiveFlagsStride = displacedMicromapPrimitiveFlagsStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesDisplacementMicromapNV &\n      setIndexType( VULKAN_HPP_NAMESPACE::IndexType indexType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexType = indexType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesDisplacementMicromapNV &\n      setIndexBuffer( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & indexBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexBuffer = indexBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesDisplacementMicromapNV &\n      setIndexStride( VULKAN_HPP_NAMESPACE::DeviceSize indexStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexStride = indexStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesDisplacementMicromapNV & setBaseTriangle( uint32_t baseTriangle_ ) VULKAN_HPP_NOEXCEPT\n    {\n      baseTriangle = baseTriangle_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesDisplacementMicromapNV & setUsageCountsCount( uint32_t usageCountsCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      usageCountsCount = usageCountsCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesDisplacementMicromapNV &\n      setPUsageCounts( const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * pUsageCounts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pUsageCounts = pUsageCounts_;\n      return *this;\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    AccelerationStructureTrianglesDisplacementMicromapNV &\n      setUsageCounts( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::MicromapUsageEXT> const & usageCounts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      usageCountsCount = static_cast<uint32_t>( usageCounts_.size() );\n      pUsageCounts     = usageCounts_.data();\n      return *this;\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesDisplacementMicromapNV &\n      setPpUsageCounts( const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * const * ppUsageCounts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      ppUsageCounts = ppUsageCounts_;\n      return *this;\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    AccelerationStructureTrianglesDisplacementMicromapNV & setPUsageCounts(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * const> const & pUsageCounts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      usageCountsCount = static_cast<uint32_t>( pUsageCounts_.size() );\n      ppUsageCounts    = pUsageCounts_.data();\n      return *this;\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesDisplacementMicromapNV &\n      setMicromap( VULKAN_HPP_NAMESPACE::MicromapEXT micromap_ ) VULKAN_HPP_NOEXCEPT\n    {\n      micromap = micromap_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureTrianglesDisplacementMicromapNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureTrianglesDisplacementMicromapNV *>( this );\n    }\n\n    operator VkAccelerationStructureTrianglesDisplacementMicromapNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureTrianglesDisplacementMicromapNV *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::IndexType const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               uint32_t const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * const &,\n               const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * const * const &,\n               VULKAN_HPP_NAMESPACE::MicromapEXT const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       displacementBiasAndScaleFormat,\n                       displacementVectorFormat,\n                       displacementBiasAndScaleBuffer,\n                       displacementBiasAndScaleStride,\n                       displacementVectorBuffer,\n                       displacementVectorStride,\n                       displacedMicromapPrimitiveFlags,\n                       displacedMicromapPrimitiveFlagsStride,\n                       indexType,\n                       indexBuffer,\n                       indexStride,\n                       baseTriangle,\n                       usageCountsCount,\n                       pUsageCounts,\n                       ppUsageCounts,\n                       micromap );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType = StructureType::eAccelerationStructureTrianglesDisplacementMicromapNV;\n    void *                                                 pNext = {};\n    VULKAN_HPP_NAMESPACE::Format                           displacementBiasAndScaleFormat        = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::Format                           displacementVectorFormat              = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR      displacementBiasAndScaleBuffer        = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                       displacementBiasAndScaleStride        = {};\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR      displacementVectorBuffer              = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                       displacementVectorStride              = {};\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR      displacedMicromapPrimitiveFlags       = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                       displacedMicromapPrimitiveFlagsStride = {};\n    VULKAN_HPP_NAMESPACE::IndexType                        indexType                             = VULKAN_HPP_NAMESPACE::IndexType::eUint16;\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR      indexBuffer                           = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                       indexStride                           = {};\n    uint32_t                                               baseTriangle                          = {};\n    uint32_t                                               usageCountsCount                      = {};\n    const VULKAN_HPP_NAMESPACE::MicromapUsageEXT *         pUsageCounts                          = {};\n    const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * const * ppUsageCounts                         = {};\n    VULKAN_HPP_NAMESPACE::MicromapEXT                      micromap                              = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAccelerationStructureTrianglesDisplacementMicromapNV>\n  {\n    using Type = AccelerationStructureTrianglesDisplacementMicromapNV;\n  };\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  struct AccelerationStructureTrianglesOpacityMicromapEXT\n  {\n    using NativeType = VkAccelerationStructureTrianglesOpacityMicromapEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAccelerationStructureTrianglesOpacityMicromapEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14\n      AccelerationStructureTrianglesOpacityMicromapEXT( VULKAN_HPP_NAMESPACE::IndexType                   indexType_ = VULKAN_HPP_NAMESPACE::IndexType::eUint16,\n                                                        VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR indexBuffer_        = {},\n                                                        VULKAN_HPP_NAMESPACE::DeviceSize                  indexStride_        = {},\n                                                        uint32_t                                          baseTriangle_       = {},\n                                                        uint32_t                                          usageCountsCount_   = {},\n                                                        const VULKAN_HPP_NAMESPACE::MicromapUsageEXT *    pUsageCounts_       = {},\n                                                        const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * const * ppUsageCounts_ = {},\n                                                        VULKAN_HPP_NAMESPACE::MicromapEXT                      micromap_      = {},\n                                                        void *                                                 pNext_         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , indexType{ indexType_ }\n      , indexBuffer{ indexBuffer_ }\n      , indexStride{ indexStride_ }\n      , baseTriangle{ baseTriangle_ }\n      , usageCountsCount{ usageCountsCount_ }\n      , pUsageCounts{ pUsageCounts_ }\n      , ppUsageCounts{ ppUsageCounts_ }\n      , micromap{ micromap_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14\n      AccelerationStructureTrianglesOpacityMicromapEXT( AccelerationStructureTrianglesOpacityMicromapEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureTrianglesOpacityMicromapEXT( VkAccelerationStructureTrianglesOpacityMicromapEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureTrianglesOpacityMicromapEXT( *reinterpret_cast<AccelerationStructureTrianglesOpacityMicromapEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    AccelerationStructureTrianglesOpacityMicromapEXT(\n      VULKAN_HPP_NAMESPACE::IndexType                                                                             indexType_,\n      VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR                                                           indexBuffer_,\n      VULKAN_HPP_NAMESPACE::DeviceSize                                                                            indexStride_,\n      uint32_t                                                                                                    baseTriangle_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::MicromapUsageEXT> const &         usageCounts_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * const> const & pUsageCounts_ = {},\n      VULKAN_HPP_NAMESPACE::MicromapEXT                                                                           micromap_     = {},\n      void *                                                                                                      pNext_        = nullptr )\n      : pNext( pNext_ )\n      , indexType( indexType_ )\n      , indexBuffer( indexBuffer_ )\n      , indexStride( indexStride_ )\n      , baseTriangle( baseTriangle_ )\n      , usageCountsCount( static_cast<uint32_t>( !usageCounts_.empty() ? usageCounts_.size() : pUsageCounts_.size() ) )\n      , pUsageCounts( usageCounts_.data() )\n      , ppUsageCounts( pUsageCounts_.data() )\n      , micromap( micromap_ )\n    {\n#    ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( ( !usageCounts_.empty() + !pUsageCounts_.empty() ) <= 1 );\n#    else\n      if ( 1 < ( !usageCounts_.empty() + !pUsageCounts_.empty() ) )\n      {\n        throw LogicError(\n          VULKAN_HPP_NAMESPACE_STRING\n          \"::AccelerationStructureTrianglesOpacityMicromapEXT::AccelerationStructureTrianglesOpacityMicromapEXT: 1 < ( !usageCounts_.empty() + !pUsageCounts_.empty() )\" );\n      }\n#    endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    AccelerationStructureTrianglesOpacityMicromapEXT & operator=( AccelerationStructureTrianglesOpacityMicromapEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureTrianglesOpacityMicromapEXT & operator=( VkAccelerationStructureTrianglesOpacityMicromapEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureTrianglesOpacityMicromapEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesOpacityMicromapEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesOpacityMicromapEXT & setIndexType( VULKAN_HPP_NAMESPACE::IndexType indexType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexType = indexType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesOpacityMicromapEXT &\n      setIndexBuffer( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & indexBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexBuffer = indexBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesOpacityMicromapEXT &\n      setIndexStride( VULKAN_HPP_NAMESPACE::DeviceSize indexStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexStride = indexStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesOpacityMicromapEXT & setBaseTriangle( uint32_t baseTriangle_ ) VULKAN_HPP_NOEXCEPT\n    {\n      baseTriangle = baseTriangle_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesOpacityMicromapEXT & setUsageCountsCount( uint32_t usageCountsCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      usageCountsCount = usageCountsCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesOpacityMicromapEXT &\n      setPUsageCounts( const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * pUsageCounts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pUsageCounts = pUsageCounts_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    AccelerationStructureTrianglesOpacityMicromapEXT &\n      setUsageCounts( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::MicromapUsageEXT> const & usageCounts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      usageCountsCount = static_cast<uint32_t>( usageCounts_.size() );\n      pUsageCounts     = usageCounts_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesOpacityMicromapEXT &\n      setPpUsageCounts( const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * const * ppUsageCounts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      ppUsageCounts = ppUsageCounts_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    AccelerationStructureTrianglesOpacityMicromapEXT & setPUsageCounts(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * const> const & pUsageCounts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      usageCountsCount = static_cast<uint32_t>( pUsageCounts_.size() );\n      ppUsageCounts    = pUsageCounts_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureTrianglesOpacityMicromapEXT & setMicromap( VULKAN_HPP_NAMESPACE::MicromapEXT micromap_ ) VULKAN_HPP_NOEXCEPT\n    {\n      micromap = micromap_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureTrianglesOpacityMicromapEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureTrianglesOpacityMicromapEXT *>( this );\n    }\n\n    operator VkAccelerationStructureTrianglesOpacityMicromapEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureTrianglesOpacityMicromapEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::IndexType const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               uint32_t const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * const &,\n               const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * const * const &,\n               VULKAN_HPP_NAMESPACE::MicromapEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, indexType, indexBuffer, indexStride, baseTriangle, usageCountsCount, pUsageCounts, ppUsageCounts, micromap );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType            = StructureType::eAccelerationStructureTrianglesOpacityMicromapEXT;\n    void *                                                 pNext            = {};\n    VULKAN_HPP_NAMESPACE::IndexType                        indexType        = VULKAN_HPP_NAMESPACE::IndexType::eUint16;\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR      indexBuffer      = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                       indexStride      = {};\n    uint32_t                                               baseTriangle     = {};\n    uint32_t                                               usageCountsCount = {};\n    const VULKAN_HPP_NAMESPACE::MicromapUsageEXT *         pUsageCounts     = {};\n    const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * const * ppUsageCounts    = {};\n    VULKAN_HPP_NAMESPACE::MicromapEXT                      micromap         = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAccelerationStructureTrianglesOpacityMicromapEXT>\n  {\n    using Type = AccelerationStructureTrianglesOpacityMicromapEXT;\n  };\n\n  struct AccelerationStructureVersionInfoKHR\n  {\n    using NativeType = VkAccelerationStructureVersionInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAccelerationStructureVersionInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AccelerationStructureVersionInfoKHR( const uint8_t * pVersionData_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pVersionData{ pVersionData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AccelerationStructureVersionInfoKHR( AccelerationStructureVersionInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AccelerationStructureVersionInfoKHR( VkAccelerationStructureVersionInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AccelerationStructureVersionInfoKHR( *reinterpret_cast<AccelerationStructureVersionInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    AccelerationStructureVersionInfoKHR & operator=( AccelerationStructureVersionInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AccelerationStructureVersionInfoKHR & operator=( VkAccelerationStructureVersionInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AccelerationStructureVersionInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureVersionInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AccelerationStructureVersionInfoKHR & setPVersionData( const uint8_t * pVersionData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pVersionData = pVersionData_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAccelerationStructureVersionInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAccelerationStructureVersionInfoKHR *>( this );\n    }\n\n    operator VkAccelerationStructureVersionInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAccelerationStructureVersionInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, const uint8_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pVersionData );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AccelerationStructureVersionInfoKHR const & ) const = default;\n#else\n    bool operator==( AccelerationStructureVersionInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pVersionData == rhs.pVersionData );\n#  endif\n    }\n\n    bool operator!=( AccelerationStructureVersionInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType        = StructureType::eAccelerationStructureVersionInfoKHR;\n    const void *                        pNext        = {};\n    const uint8_t *                     pVersionData = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAccelerationStructureVersionInfoKHR>\n  {\n    using Type = AccelerationStructureVersionInfoKHR;\n  };\n\n  struct AcquireNextImageInfoKHR\n  {\n    using NativeType = VkAcquireNextImageInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAcquireNextImageInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AcquireNextImageInfoKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain_  = {},\n                                                  uint64_t                           timeout_    = {},\n                                                  VULKAN_HPP_NAMESPACE::Semaphore    semaphore_  = {},\n                                                  VULKAN_HPP_NAMESPACE::Fence        fence_      = {},\n                                                  uint32_t                           deviceMask_ = {},\n                                                  const void *                       pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , swapchain{ swapchain_ }\n      , timeout{ timeout_ }\n      , semaphore{ semaphore_ }\n      , fence{ fence_ }\n      , deviceMask{ deviceMask_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AcquireNextImageInfoKHR( AcquireNextImageInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AcquireNextImageInfoKHR( VkAcquireNextImageInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AcquireNextImageInfoKHR( *reinterpret_cast<AcquireNextImageInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    AcquireNextImageInfoKHR & operator=( AcquireNextImageInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AcquireNextImageInfoKHR & operator=( VkAcquireNextImageInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AcquireNextImageInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AcquireNextImageInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AcquireNextImageInfoKHR & setSwapchain( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain_ ) VULKAN_HPP_NOEXCEPT\n    {\n      swapchain = swapchain_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AcquireNextImageInfoKHR & setTimeout( uint64_t timeout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      timeout = timeout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AcquireNextImageInfoKHR & setSemaphore( VULKAN_HPP_NAMESPACE::Semaphore semaphore_ ) VULKAN_HPP_NOEXCEPT\n    {\n      semaphore = semaphore_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AcquireNextImageInfoKHR & setFence( VULKAN_HPP_NAMESPACE::Fence fence_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fence = fence_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AcquireNextImageInfoKHR & setDeviceMask( uint32_t deviceMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceMask = deviceMask_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAcquireNextImageInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAcquireNextImageInfoKHR *>( this );\n    }\n\n    operator VkAcquireNextImageInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAcquireNextImageInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::SwapchainKHR const &,\n               uint64_t const &,\n               VULKAN_HPP_NAMESPACE::Semaphore const &,\n               VULKAN_HPP_NAMESPACE::Fence const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, swapchain, timeout, semaphore, fence, deviceMask );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AcquireNextImageInfoKHR const & ) const = default;\n#else\n    bool operator==( AcquireNextImageInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( swapchain == rhs.swapchain ) && ( timeout == rhs.timeout ) &&\n             ( semaphore == rhs.semaphore ) && ( fence == rhs.fence ) && ( deviceMask == rhs.deviceMask );\n#  endif\n    }\n\n    bool operator!=( AcquireNextImageInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType      = StructureType::eAcquireNextImageInfoKHR;\n    const void *                        pNext      = {};\n    VULKAN_HPP_NAMESPACE::SwapchainKHR  swapchain  = {};\n    uint64_t                            timeout    = {};\n    VULKAN_HPP_NAMESPACE::Semaphore     semaphore  = {};\n    VULKAN_HPP_NAMESPACE::Fence         fence      = {};\n    uint32_t                            deviceMask = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAcquireNextImageInfoKHR>\n  {\n    using Type = AcquireNextImageInfoKHR;\n  };\n\n  struct AcquireProfilingLockInfoKHR\n  {\n    using NativeType = VkAcquireProfilingLockInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAcquireProfilingLockInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AcquireProfilingLockInfoKHR( VULKAN_HPP_NAMESPACE::AcquireProfilingLockFlagsKHR flags_   = {},\n                                                      uint64_t                                           timeout_ = {},\n                                                      const void *                                       pNext_   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , timeout{ timeout_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AcquireProfilingLockInfoKHR( AcquireProfilingLockInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AcquireProfilingLockInfoKHR( VkAcquireProfilingLockInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AcquireProfilingLockInfoKHR( *reinterpret_cast<AcquireProfilingLockInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    AcquireProfilingLockInfoKHR & operator=( AcquireProfilingLockInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AcquireProfilingLockInfoKHR & operator=( VkAcquireProfilingLockInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AcquireProfilingLockInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AcquireProfilingLockInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AcquireProfilingLockInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::AcquireProfilingLockFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AcquireProfilingLockInfoKHR & setTimeout( uint64_t timeout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      timeout = timeout_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAcquireProfilingLockInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAcquireProfilingLockInfoKHR *>( this );\n    }\n\n    operator VkAcquireProfilingLockInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAcquireProfilingLockInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::AcquireProfilingLockFlagsKHR const &, uint64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, timeout );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AcquireProfilingLockInfoKHR const & ) const = default;\n#else\n    bool operator==( AcquireProfilingLockInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( timeout == rhs.timeout );\n#  endif\n    }\n\n    bool operator!=( AcquireProfilingLockInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                sType   = StructureType::eAcquireProfilingLockInfoKHR;\n    const void *                                       pNext   = {};\n    VULKAN_HPP_NAMESPACE::AcquireProfilingLockFlagsKHR flags   = {};\n    uint64_t                                           timeout = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAcquireProfilingLockInfoKHR>\n  {\n    using Type = AcquireProfilingLockInfoKHR;\n  };\n\n  typedef void *( VKAPI_PTR * PFN_AllocationFunction )( void *                                      pUserData,\n                                                        size_t                                      size,\n                                                        size_t                                      alignment,\n                                                        VULKAN_HPP_NAMESPACE::SystemAllocationScope allocationScope );\n\n  typedef void *( VKAPI_PTR * PFN_ReallocationFunction )(\n    void * pUserData, void * pOriginal, size_t size, size_t alignment, VULKAN_HPP_NAMESPACE::SystemAllocationScope allocationScope );\n\n  typedef void( VKAPI_PTR * PFN_FreeFunction )( void * pUserData, void * pMemory );\n\n  typedef void( VKAPI_PTR * PFN_InternalAllocationNotification )( void *                                       pUserData,\n                                                                  size_t                                       size,\n                                                                  VULKAN_HPP_NAMESPACE::InternalAllocationType allocationType,\n                                                                  VULKAN_HPP_NAMESPACE::SystemAllocationScope  allocationScope );\n\n  typedef void( VKAPI_PTR * PFN_InternalFreeNotification )( void *                                       pUserData,\n                                                            size_t                                       size,\n                                                            VULKAN_HPP_NAMESPACE::InternalAllocationType allocationType,\n                                                            VULKAN_HPP_NAMESPACE::SystemAllocationScope  allocationScope );\n\n  struct AllocationCallbacks\n  {\n    using NativeType = VkAllocationCallbacks;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AllocationCallbacks( void *                                                   pUserData_             = {},\n                                              VULKAN_HPP_NAMESPACE::PFN_AllocationFunction             pfnAllocation_         = {},\n                                              VULKAN_HPP_NAMESPACE::PFN_ReallocationFunction           pfnReallocation_       = {},\n                                              VULKAN_HPP_NAMESPACE::PFN_FreeFunction                   pfnFree_               = {},\n                                              VULKAN_HPP_NAMESPACE::PFN_InternalAllocationNotification pfnInternalAllocation_ = {},\n                                              VULKAN_HPP_NAMESPACE::PFN_InternalFreeNotification       pfnInternalFree_       = {} ) VULKAN_HPP_NOEXCEPT\n      : pUserData{ pUserData_ }\n      , pfnAllocation{ pfnAllocation_ }\n      , pfnReallocation{ pfnReallocation_ }\n      , pfnFree{ pfnFree_ }\n      , pfnInternalAllocation{ pfnInternalAllocation_ }\n      , pfnInternalFree{ pfnInternalFree_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AllocationCallbacks( AllocationCallbacks const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AllocationCallbacks( VkAllocationCallbacks const & rhs ) VULKAN_HPP_NOEXCEPT : AllocationCallbacks( *reinterpret_cast<AllocationCallbacks const *>( &rhs ) )\n    {\n    }\n\n#  if defined( __clang__ ) || defined( __GNUC__ )\n#    pragma GCC diagnostic push\n#    if defined( __clang__ )\n#      pragma clang diagnostic ignored \"-Wunknown-warning-option\"\n#    endif\n#    pragma GCC diagnostic ignored \"-Wcast-function-type\"\n#  endif\n    VULKAN_HPP_DEPRECATED( \"This constructor is deprecated. Use the one taking function pointer types from the vk-namespace instead.\" )\n\n    AllocationCallbacks( void *                               pUserData_,\n                         PFN_vkAllocationFunction             pfnAllocation_,\n                         PFN_vkReallocationFunction           pfnReallocation_       = {},\n                         PFN_vkFreeFunction                   pfnFree_               = {},\n                         PFN_vkInternalAllocationNotification pfnInternalAllocation_ = {},\n                         PFN_vkInternalFreeNotification       pfnInternalFree_       = {} ) VULKAN_HPP_NOEXCEPT\n      : AllocationCallbacks( pUserData_,\n                             reinterpret_cast<VULKAN_HPP_NAMESPACE::PFN_AllocationFunction>( pfnAllocation_ ),\n                             reinterpret_cast<VULKAN_HPP_NAMESPACE::PFN_ReallocationFunction>( pfnReallocation_ ),\n                             reinterpret_cast<VULKAN_HPP_NAMESPACE::PFN_FreeFunction>( pfnFree_ ),\n                             reinterpret_cast<VULKAN_HPP_NAMESPACE::PFN_InternalAllocationNotification>( pfnInternalAllocation_ ),\n                             reinterpret_cast<VULKAN_HPP_NAMESPACE::PFN_InternalFreeNotification>( pfnInternalFree_ ) )\n    {\n    }\n#  if defined( __clang__ ) || defined( __GNUC__ )\n#    pragma GCC diagnostic pop\n#  endif\n\n    AllocationCallbacks & operator=( AllocationCallbacks const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AllocationCallbacks & operator=( VkAllocationCallbacks const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AllocationCallbacks const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AllocationCallbacks & setPUserData( void * pUserData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pUserData = pUserData_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AllocationCallbacks & setPfnAllocation( VULKAN_HPP_NAMESPACE::PFN_AllocationFunction pfnAllocation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pfnAllocation = pfnAllocation_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AllocationCallbacks & setPfnReallocation( VULKAN_HPP_NAMESPACE::PFN_ReallocationFunction pfnReallocation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pfnReallocation = pfnReallocation_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AllocationCallbacks & setPfnFree( VULKAN_HPP_NAMESPACE::PFN_FreeFunction pfnFree_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pfnFree = pfnFree_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AllocationCallbacks &\n      setPfnInternalAllocation( VULKAN_HPP_NAMESPACE::PFN_InternalAllocationNotification pfnInternalAllocation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pfnInternalAllocation = pfnInternalAllocation_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AllocationCallbacks & setPfnInternalFree( VULKAN_HPP_NAMESPACE::PFN_InternalFreeNotification pfnInternalFree_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pfnInternalFree = pfnInternalFree_;\n      return *this;\n    }\n\n#  if defined( __clang__ ) || defined( __GNUC__ )\n#    pragma GCC diagnostic push\n#    if defined( __clang__ )\n#      pragma clang diagnostic ignored \"-Wunknown-warning-option\"\n#    endif\n#    pragma GCC diagnostic ignored \"-Wcast-function-type\"\n#  endif\n    VULKAN_HPP_DEPRECATED( \"This setter is deprecated. Use the one taking a function pointer type from the vk-namespace instead.\" )\n\n    AllocationCallbacks & setPfnAllocation( PFN_vkAllocationFunction pfnAllocation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      return setPfnAllocation( reinterpret_cast<VULKAN_HPP_NAMESPACE::PFN_AllocationFunction>( pfnAllocation_ ) );\n    }\n\n    VULKAN_HPP_DEPRECATED( \"This setter is deprecated. Use the one taking a function pointer type from the vk-namespace instead.\" )\n\n    AllocationCallbacks & setPfnReallocation( PFN_vkReallocationFunction pfnReallocation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      return setPfnReallocation( reinterpret_cast<VULKAN_HPP_NAMESPACE::PFN_ReallocationFunction>( pfnReallocation_ ) );\n    }\n\n    VULKAN_HPP_DEPRECATED( \"This setter is deprecated. Use the one taking a function pointer type from the vk-namespace instead.\" )\n\n    AllocationCallbacks & setPfnInternalAllocation( PFN_vkInternalAllocationNotification pfnInternalAllocation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      return setPfnInternalAllocation( reinterpret_cast<VULKAN_HPP_NAMESPACE::PFN_InternalAllocationNotification>( pfnInternalAllocation_ ) );\n    }\n\n    VULKAN_HPP_DEPRECATED( \"This setter is deprecated. Use the one taking a function pointer type from the vk-namespace instead.\" )\n\n    AllocationCallbacks & setPfnInternalFree( PFN_vkInternalFreeNotification pfnInternalFree_ ) VULKAN_HPP_NOEXCEPT\n    {\n      return setPfnInternalFree( reinterpret_cast<VULKAN_HPP_NAMESPACE::PFN_InternalFreeNotification>( pfnInternalFree_ ) );\n    }\n#  if defined( __clang__ ) || defined( __GNUC__ )\n#    pragma GCC diagnostic pop\n#  endif\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAllocationCallbacks const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAllocationCallbacks *>( this );\n    }\n\n    operator VkAllocationCallbacks &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAllocationCallbacks *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<void * const &,\n               VULKAN_HPP_NAMESPACE::PFN_AllocationFunction const &,\n               VULKAN_HPP_NAMESPACE::PFN_ReallocationFunction const &,\n               VULKAN_HPP_NAMESPACE::PFN_FreeFunction const &,\n               VULKAN_HPP_NAMESPACE::PFN_InternalAllocationNotification const &,\n               VULKAN_HPP_NAMESPACE::PFN_InternalFreeNotification const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( pUserData, pfnAllocation, pfnReallocation, pfnFree, pfnInternalAllocation, pfnInternalFree );\n    }\n#endif\n\n    bool operator==( AllocationCallbacks const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#else\n      return ( pUserData == rhs.pUserData ) && ( pfnAllocation == rhs.pfnAllocation ) && ( pfnReallocation == rhs.pfnReallocation ) &&\n             ( pfnFree == rhs.pfnFree ) && ( pfnInternalAllocation == rhs.pfnInternalAllocation ) && ( pfnInternalFree == rhs.pfnInternalFree );\n#endif\n    }\n\n    bool operator!=( AllocationCallbacks const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    void *                                                   pUserData             = {};\n    VULKAN_HPP_NAMESPACE::PFN_AllocationFunction             pfnAllocation         = {};\n    VULKAN_HPP_NAMESPACE::PFN_ReallocationFunction           pfnReallocation       = {};\n    VULKAN_HPP_NAMESPACE::PFN_FreeFunction                   pfnFree               = {};\n    VULKAN_HPP_NAMESPACE::PFN_InternalAllocationNotification pfnInternalAllocation = {};\n    VULKAN_HPP_NAMESPACE::PFN_InternalFreeNotification       pfnInternalFree       = {};\n  };\n\n  struct AmigoProfilingSubmitInfoSEC\n  {\n    using NativeType = VkAmigoProfilingSubmitInfoSEC;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAmigoProfilingSubmitInfoSEC;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      AmigoProfilingSubmitInfoSEC( uint64_t firstDrawTimestamp_ = {}, uint64_t swapBufferTimestamp_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , firstDrawTimestamp{ firstDrawTimestamp_ }\n      , swapBufferTimestamp{ swapBufferTimestamp_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AmigoProfilingSubmitInfoSEC( AmigoProfilingSubmitInfoSEC const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AmigoProfilingSubmitInfoSEC( VkAmigoProfilingSubmitInfoSEC const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AmigoProfilingSubmitInfoSEC( *reinterpret_cast<AmigoProfilingSubmitInfoSEC const *>( &rhs ) )\n    {\n    }\n\n    AmigoProfilingSubmitInfoSEC & operator=( AmigoProfilingSubmitInfoSEC const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AmigoProfilingSubmitInfoSEC & operator=( VkAmigoProfilingSubmitInfoSEC const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AmigoProfilingSubmitInfoSEC const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AmigoProfilingSubmitInfoSEC & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AmigoProfilingSubmitInfoSEC & setFirstDrawTimestamp( uint64_t firstDrawTimestamp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      firstDrawTimestamp = firstDrawTimestamp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AmigoProfilingSubmitInfoSEC & setSwapBufferTimestamp( uint64_t swapBufferTimestamp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      swapBufferTimestamp = swapBufferTimestamp_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAmigoProfilingSubmitInfoSEC const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAmigoProfilingSubmitInfoSEC *>( this );\n    }\n\n    operator VkAmigoProfilingSubmitInfoSEC &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAmigoProfilingSubmitInfoSEC *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint64_t const &, uint64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, firstDrawTimestamp, swapBufferTimestamp );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AmigoProfilingSubmitInfoSEC const & ) const = default;\n#else\n    bool operator==( AmigoProfilingSubmitInfoSEC const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( firstDrawTimestamp == rhs.firstDrawTimestamp ) &&\n             ( swapBufferTimestamp == rhs.swapBufferTimestamp );\n#  endif\n    }\n\n    bool operator!=( AmigoProfilingSubmitInfoSEC const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType               = StructureType::eAmigoProfilingSubmitInfoSEC;\n    const void *                        pNext               = {};\n    uint64_t                            firstDrawTimestamp  = {};\n    uint64_t                            swapBufferTimestamp = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAmigoProfilingSubmitInfoSEC>\n  {\n    using Type = AmigoProfilingSubmitInfoSEC;\n  };\n\n  struct ComponentMapping\n  {\n    using NativeType = VkComponentMapping;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ComponentMapping( VULKAN_HPP_NAMESPACE::ComponentSwizzle r_ = VULKAN_HPP_NAMESPACE::ComponentSwizzle::eIdentity,\n                                           VULKAN_HPP_NAMESPACE::ComponentSwizzle g_ = VULKAN_HPP_NAMESPACE::ComponentSwizzle::eIdentity,\n                                           VULKAN_HPP_NAMESPACE::ComponentSwizzle b_ = VULKAN_HPP_NAMESPACE::ComponentSwizzle::eIdentity,\n                                           VULKAN_HPP_NAMESPACE::ComponentSwizzle a_ = VULKAN_HPP_NAMESPACE::ComponentSwizzle::eIdentity ) VULKAN_HPP_NOEXCEPT\n      : r{ r_ }\n      , g{ g_ }\n      , b{ b_ }\n      , a{ a_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ComponentMapping( ComponentMapping const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ComponentMapping( VkComponentMapping const & rhs ) VULKAN_HPP_NOEXCEPT : ComponentMapping( *reinterpret_cast<ComponentMapping const *>( &rhs ) ) {}\n\n    ComponentMapping & operator=( ComponentMapping const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ComponentMapping & operator=( VkComponentMapping const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ComponentMapping const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ComponentMapping & setR( VULKAN_HPP_NAMESPACE::ComponentSwizzle r_ ) VULKAN_HPP_NOEXCEPT\n    {\n      r = r_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ComponentMapping & setG( VULKAN_HPP_NAMESPACE::ComponentSwizzle g_ ) VULKAN_HPP_NOEXCEPT\n    {\n      g = g_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ComponentMapping & setB( VULKAN_HPP_NAMESPACE::ComponentSwizzle b_ ) VULKAN_HPP_NOEXCEPT\n    {\n      b = b_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ComponentMapping & setA( VULKAN_HPP_NAMESPACE::ComponentSwizzle a_ ) VULKAN_HPP_NOEXCEPT\n    {\n      a = a_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkComponentMapping const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkComponentMapping *>( this );\n    }\n\n    operator VkComponentMapping &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkComponentMapping *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::ComponentSwizzle const &,\n               VULKAN_HPP_NAMESPACE::ComponentSwizzle const &,\n               VULKAN_HPP_NAMESPACE::ComponentSwizzle const &,\n               VULKAN_HPP_NAMESPACE::ComponentSwizzle const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( r, g, b, a );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ComponentMapping const & ) const = default;\n#else\n    bool operator==( ComponentMapping const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( r == rhs.r ) && ( g == rhs.g ) && ( b == rhs.b ) && ( a == rhs.a );\n#  endif\n    }\n\n    bool operator!=( ComponentMapping const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::ComponentSwizzle r = VULKAN_HPP_NAMESPACE::ComponentSwizzle::eIdentity;\n    VULKAN_HPP_NAMESPACE::ComponentSwizzle g = VULKAN_HPP_NAMESPACE::ComponentSwizzle::eIdentity;\n    VULKAN_HPP_NAMESPACE::ComponentSwizzle b = VULKAN_HPP_NAMESPACE::ComponentSwizzle::eIdentity;\n    VULKAN_HPP_NAMESPACE::ComponentSwizzle a = VULKAN_HPP_NAMESPACE::ComponentSwizzle::eIdentity;\n  };\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  struct AndroidHardwareBufferFormatProperties2ANDROID\n  {\n    using NativeType = VkAndroidHardwareBufferFormatProperties2ANDROID;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAndroidHardwareBufferFormatProperties2ANDROID;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AndroidHardwareBufferFormatProperties2ANDROID(\n      VULKAN_HPP_NAMESPACE::Format                      format_                           = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n      uint64_t                                          externalFormat_                   = {},\n      VULKAN_HPP_NAMESPACE::FormatFeatureFlags2         formatFeatures_                   = {},\n      VULKAN_HPP_NAMESPACE::ComponentMapping            samplerYcbcrConversionComponents_ = {},\n      VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion suggestedYcbcrModel_              = VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion::eRgbIdentity,\n      VULKAN_HPP_NAMESPACE::SamplerYcbcrRange           suggestedYcbcrRange_              = VULKAN_HPP_NAMESPACE::SamplerYcbcrRange::eItuFull,\n      VULKAN_HPP_NAMESPACE::ChromaLocation              suggestedXChromaOffset_           = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven,\n      VULKAN_HPP_NAMESPACE::ChromaLocation              suggestedYChromaOffset_           = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven,\n      void *                                            pNext_                            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , format{ format_ }\n      , externalFormat{ externalFormat_ }\n      , formatFeatures{ formatFeatures_ }\n      , samplerYcbcrConversionComponents{ samplerYcbcrConversionComponents_ }\n      , suggestedYcbcrModel{ suggestedYcbcrModel_ }\n      , suggestedYcbcrRange{ suggestedYcbcrRange_ }\n      , suggestedXChromaOffset{ suggestedXChromaOffset_ }\n      , suggestedYChromaOffset{ suggestedYChromaOffset_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      AndroidHardwareBufferFormatProperties2ANDROID( AndroidHardwareBufferFormatProperties2ANDROID const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AndroidHardwareBufferFormatProperties2ANDROID( VkAndroidHardwareBufferFormatProperties2ANDROID const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AndroidHardwareBufferFormatProperties2ANDROID( *reinterpret_cast<AndroidHardwareBufferFormatProperties2ANDROID const *>( &rhs ) )\n    {\n    }\n\n    AndroidHardwareBufferFormatProperties2ANDROID & operator=( AndroidHardwareBufferFormatProperties2ANDROID const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AndroidHardwareBufferFormatProperties2ANDROID & operator=( VkAndroidHardwareBufferFormatProperties2ANDROID const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferFormatProperties2ANDROID const *>( &rhs );\n      return *this;\n    }\n\n    operator VkAndroidHardwareBufferFormatProperties2ANDROID const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAndroidHardwareBufferFormatProperties2ANDROID *>( this );\n    }\n\n    operator VkAndroidHardwareBufferFormatProperties2ANDROID &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAndroidHardwareBufferFormatProperties2ANDROID *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               uint64_t const &,\n               VULKAN_HPP_NAMESPACE::FormatFeatureFlags2 const &,\n               VULKAN_HPP_NAMESPACE::ComponentMapping const &,\n               VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion const &,\n               VULKAN_HPP_NAMESPACE::SamplerYcbcrRange const &,\n               VULKAN_HPP_NAMESPACE::ChromaLocation const &,\n               VULKAN_HPP_NAMESPACE::ChromaLocation const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       format,\n                       externalFormat,\n                       formatFeatures,\n                       samplerYcbcrConversionComponents,\n                       suggestedYcbcrModel,\n                       suggestedYcbcrRange,\n                       suggestedXChromaOffset,\n                       suggestedYChromaOffset );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AndroidHardwareBufferFormatProperties2ANDROID const & ) const = default;\n#  else\n    bool operator==( AndroidHardwareBufferFormatProperties2ANDROID const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( format == rhs.format ) && ( externalFormat == rhs.externalFormat ) &&\n             ( formatFeatures == rhs.formatFeatures ) && ( samplerYcbcrConversionComponents == rhs.samplerYcbcrConversionComponents ) &&\n             ( suggestedYcbcrModel == rhs.suggestedYcbcrModel ) && ( suggestedYcbcrRange == rhs.suggestedYcbcrRange ) &&\n             ( suggestedXChromaOffset == rhs.suggestedXChromaOffset ) && ( suggestedYChromaOffset == rhs.suggestedYChromaOffset );\n#    endif\n    }\n\n    bool operator!=( AndroidHardwareBufferFormatProperties2ANDROID const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType                            = StructureType::eAndroidHardwareBufferFormatProperties2ANDROID;\n    void *                                            pNext                            = {};\n    VULKAN_HPP_NAMESPACE::Format                      format                           = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    uint64_t                                          externalFormat                   = {};\n    VULKAN_HPP_NAMESPACE::FormatFeatureFlags2         formatFeatures                   = {};\n    VULKAN_HPP_NAMESPACE::ComponentMapping            samplerYcbcrConversionComponents = {};\n    VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion suggestedYcbcrModel              = VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion::eRgbIdentity;\n    VULKAN_HPP_NAMESPACE::SamplerYcbcrRange           suggestedYcbcrRange              = VULKAN_HPP_NAMESPACE::SamplerYcbcrRange::eItuFull;\n    VULKAN_HPP_NAMESPACE::ChromaLocation              suggestedXChromaOffset           = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven;\n    VULKAN_HPP_NAMESPACE::ChromaLocation              suggestedYChromaOffset           = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAndroidHardwareBufferFormatProperties2ANDROID>\n  {\n    using Type = AndroidHardwareBufferFormatProperties2ANDROID;\n  };\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  struct AndroidHardwareBufferFormatPropertiesANDROID\n  {\n    using NativeType = VkAndroidHardwareBufferFormatPropertiesANDROID;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAndroidHardwareBufferFormatPropertiesANDROID;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AndroidHardwareBufferFormatPropertiesANDROID(\n      VULKAN_HPP_NAMESPACE::Format                      format_                           = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n      uint64_t                                          externalFormat_                   = {},\n      VULKAN_HPP_NAMESPACE::FormatFeatureFlags          formatFeatures_                   = {},\n      VULKAN_HPP_NAMESPACE::ComponentMapping            samplerYcbcrConversionComponents_ = {},\n      VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion suggestedYcbcrModel_              = VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion::eRgbIdentity,\n      VULKAN_HPP_NAMESPACE::SamplerYcbcrRange           suggestedYcbcrRange_              = VULKAN_HPP_NAMESPACE::SamplerYcbcrRange::eItuFull,\n      VULKAN_HPP_NAMESPACE::ChromaLocation              suggestedXChromaOffset_           = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven,\n      VULKAN_HPP_NAMESPACE::ChromaLocation              suggestedYChromaOffset_           = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven,\n      void *                                            pNext_                            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , format{ format_ }\n      , externalFormat{ externalFormat_ }\n      , formatFeatures{ formatFeatures_ }\n      , samplerYcbcrConversionComponents{ samplerYcbcrConversionComponents_ }\n      , suggestedYcbcrModel{ suggestedYcbcrModel_ }\n      , suggestedYcbcrRange{ suggestedYcbcrRange_ }\n      , suggestedXChromaOffset{ suggestedXChromaOffset_ }\n      , suggestedYChromaOffset{ suggestedYChromaOffset_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AndroidHardwareBufferFormatPropertiesANDROID( AndroidHardwareBufferFormatPropertiesANDROID const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AndroidHardwareBufferFormatPropertiesANDROID( VkAndroidHardwareBufferFormatPropertiesANDROID const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AndroidHardwareBufferFormatPropertiesANDROID( *reinterpret_cast<AndroidHardwareBufferFormatPropertiesANDROID const *>( &rhs ) )\n    {\n    }\n\n    AndroidHardwareBufferFormatPropertiesANDROID & operator=( AndroidHardwareBufferFormatPropertiesANDROID const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AndroidHardwareBufferFormatPropertiesANDROID & operator=( VkAndroidHardwareBufferFormatPropertiesANDROID const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferFormatPropertiesANDROID const *>( &rhs );\n      return *this;\n    }\n\n    operator VkAndroidHardwareBufferFormatPropertiesANDROID const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAndroidHardwareBufferFormatPropertiesANDROID *>( this );\n    }\n\n    operator VkAndroidHardwareBufferFormatPropertiesANDROID &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAndroidHardwareBufferFormatPropertiesANDROID *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               uint64_t const &,\n               VULKAN_HPP_NAMESPACE::FormatFeatureFlags const &,\n               VULKAN_HPP_NAMESPACE::ComponentMapping const &,\n               VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion const &,\n               VULKAN_HPP_NAMESPACE::SamplerYcbcrRange const &,\n               VULKAN_HPP_NAMESPACE::ChromaLocation const &,\n               VULKAN_HPP_NAMESPACE::ChromaLocation const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       format,\n                       externalFormat,\n                       formatFeatures,\n                       samplerYcbcrConversionComponents,\n                       suggestedYcbcrModel,\n                       suggestedYcbcrRange,\n                       suggestedXChromaOffset,\n                       suggestedYChromaOffset );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AndroidHardwareBufferFormatPropertiesANDROID const & ) const = default;\n#  else\n    bool operator==( AndroidHardwareBufferFormatPropertiesANDROID const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( format == rhs.format ) && ( externalFormat == rhs.externalFormat ) &&\n             ( formatFeatures == rhs.formatFeatures ) && ( samplerYcbcrConversionComponents == rhs.samplerYcbcrConversionComponents ) &&\n             ( suggestedYcbcrModel == rhs.suggestedYcbcrModel ) && ( suggestedYcbcrRange == rhs.suggestedYcbcrRange ) &&\n             ( suggestedXChromaOffset == rhs.suggestedXChromaOffset ) && ( suggestedYChromaOffset == rhs.suggestedYChromaOffset );\n#    endif\n    }\n\n    bool operator!=( AndroidHardwareBufferFormatPropertiesANDROID const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType                            = StructureType::eAndroidHardwareBufferFormatPropertiesANDROID;\n    void *                                            pNext                            = {};\n    VULKAN_HPP_NAMESPACE::Format                      format                           = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    uint64_t                                          externalFormat                   = {};\n    VULKAN_HPP_NAMESPACE::FormatFeatureFlags          formatFeatures                   = {};\n    VULKAN_HPP_NAMESPACE::ComponentMapping            samplerYcbcrConversionComponents = {};\n    VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion suggestedYcbcrModel              = VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion::eRgbIdentity;\n    VULKAN_HPP_NAMESPACE::SamplerYcbcrRange           suggestedYcbcrRange              = VULKAN_HPP_NAMESPACE::SamplerYcbcrRange::eItuFull;\n    VULKAN_HPP_NAMESPACE::ChromaLocation              suggestedXChromaOffset           = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven;\n    VULKAN_HPP_NAMESPACE::ChromaLocation              suggestedYChromaOffset           = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAndroidHardwareBufferFormatPropertiesANDROID>\n  {\n    using Type = AndroidHardwareBufferFormatPropertiesANDROID;\n  };\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  struct AndroidHardwareBufferFormatResolvePropertiesANDROID\n  {\n    using NativeType = VkAndroidHardwareBufferFormatResolvePropertiesANDROID;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAndroidHardwareBufferFormatResolvePropertiesANDROID;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      AndroidHardwareBufferFormatResolvePropertiesANDROID( VULKAN_HPP_NAMESPACE::Format colorAttachmentFormat_ = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                                           void *                       pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , colorAttachmentFormat{ colorAttachmentFormat_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      AndroidHardwareBufferFormatResolvePropertiesANDROID( AndroidHardwareBufferFormatResolvePropertiesANDROID const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AndroidHardwareBufferFormatResolvePropertiesANDROID( VkAndroidHardwareBufferFormatResolvePropertiesANDROID const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AndroidHardwareBufferFormatResolvePropertiesANDROID( *reinterpret_cast<AndroidHardwareBufferFormatResolvePropertiesANDROID const *>( &rhs ) )\n    {\n    }\n\n    AndroidHardwareBufferFormatResolvePropertiesANDROID &\n      operator=( AndroidHardwareBufferFormatResolvePropertiesANDROID const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AndroidHardwareBufferFormatResolvePropertiesANDROID & operator=( VkAndroidHardwareBufferFormatResolvePropertiesANDROID const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferFormatResolvePropertiesANDROID const *>( &rhs );\n      return *this;\n    }\n\n    operator VkAndroidHardwareBufferFormatResolvePropertiesANDROID const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAndroidHardwareBufferFormatResolvePropertiesANDROID *>( this );\n    }\n\n    operator VkAndroidHardwareBufferFormatResolvePropertiesANDROID &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAndroidHardwareBufferFormatResolvePropertiesANDROID *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Format const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, colorAttachmentFormat );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AndroidHardwareBufferFormatResolvePropertiesANDROID const & ) const = default;\n#  else\n    bool operator==( AndroidHardwareBufferFormatResolvePropertiesANDROID const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( colorAttachmentFormat == rhs.colorAttachmentFormat );\n#    endif\n    }\n\n    bool operator!=( AndroidHardwareBufferFormatResolvePropertiesANDROID const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                 = StructureType::eAndroidHardwareBufferFormatResolvePropertiesANDROID;\n    void *                              pNext                 = {};\n    VULKAN_HPP_NAMESPACE::Format        colorAttachmentFormat = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAndroidHardwareBufferFormatResolvePropertiesANDROID>\n  {\n    using Type = AndroidHardwareBufferFormatResolvePropertiesANDROID;\n  };\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  struct AndroidHardwareBufferPropertiesANDROID\n  {\n    using NativeType = VkAndroidHardwareBufferPropertiesANDROID;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAndroidHardwareBufferPropertiesANDROID;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AndroidHardwareBufferPropertiesANDROID( VULKAN_HPP_NAMESPACE::DeviceSize allocationSize_ = {},\n                                                                 uint32_t                         memoryTypeBits_ = {},\n                                                                 void *                           pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , allocationSize{ allocationSize_ }\n      , memoryTypeBits{ memoryTypeBits_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AndroidHardwareBufferPropertiesANDROID( AndroidHardwareBufferPropertiesANDROID const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AndroidHardwareBufferPropertiesANDROID( VkAndroidHardwareBufferPropertiesANDROID const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AndroidHardwareBufferPropertiesANDROID( *reinterpret_cast<AndroidHardwareBufferPropertiesANDROID const *>( &rhs ) )\n    {\n    }\n\n    AndroidHardwareBufferPropertiesANDROID & operator=( AndroidHardwareBufferPropertiesANDROID const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AndroidHardwareBufferPropertiesANDROID & operator=( VkAndroidHardwareBufferPropertiesANDROID const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID const *>( &rhs );\n      return *this;\n    }\n\n    operator VkAndroidHardwareBufferPropertiesANDROID const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAndroidHardwareBufferPropertiesANDROID *>( this );\n    }\n\n    operator VkAndroidHardwareBufferPropertiesANDROID &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAndroidHardwareBufferPropertiesANDROID *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::DeviceSize const &, uint32_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, allocationSize, memoryTypeBits );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AndroidHardwareBufferPropertiesANDROID const & ) const = default;\n#  else\n    bool operator==( AndroidHardwareBufferPropertiesANDROID const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( allocationSize == rhs.allocationSize ) && ( memoryTypeBits == rhs.memoryTypeBits );\n#    endif\n    }\n\n    bool operator!=( AndroidHardwareBufferPropertiesANDROID const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::eAndroidHardwareBufferPropertiesANDROID;\n    void *                              pNext          = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    allocationSize = {};\n    uint32_t                            memoryTypeBits = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAndroidHardwareBufferPropertiesANDROID>\n  {\n    using Type = AndroidHardwareBufferPropertiesANDROID;\n  };\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  struct AndroidHardwareBufferUsageANDROID\n  {\n    using NativeType = VkAndroidHardwareBufferUsageANDROID;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAndroidHardwareBufferUsageANDROID;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AndroidHardwareBufferUsageANDROID( uint64_t androidHardwareBufferUsage_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , androidHardwareBufferUsage{ androidHardwareBufferUsage_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AndroidHardwareBufferUsageANDROID( AndroidHardwareBufferUsageANDROID const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AndroidHardwareBufferUsageANDROID( VkAndroidHardwareBufferUsageANDROID const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AndroidHardwareBufferUsageANDROID( *reinterpret_cast<AndroidHardwareBufferUsageANDROID const *>( &rhs ) )\n    {\n    }\n\n    AndroidHardwareBufferUsageANDROID & operator=( AndroidHardwareBufferUsageANDROID const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AndroidHardwareBufferUsageANDROID & operator=( VkAndroidHardwareBufferUsageANDROID const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferUsageANDROID const *>( &rhs );\n      return *this;\n    }\n\n    operator VkAndroidHardwareBufferUsageANDROID const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAndroidHardwareBufferUsageANDROID *>( this );\n    }\n\n    operator VkAndroidHardwareBufferUsageANDROID &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAndroidHardwareBufferUsageANDROID *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint64_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, androidHardwareBufferUsage );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AndroidHardwareBufferUsageANDROID const & ) const = default;\n#  else\n    bool operator==( AndroidHardwareBufferUsageANDROID const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( androidHardwareBufferUsage == rhs.androidHardwareBufferUsage );\n#    endif\n    }\n\n    bool operator!=( AndroidHardwareBufferUsageANDROID const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                      = StructureType::eAndroidHardwareBufferUsageANDROID;\n    void *                              pNext                      = {};\n    uint64_t                            androidHardwareBufferUsage = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAndroidHardwareBufferUsageANDROID>\n  {\n    using Type = AndroidHardwareBufferUsageANDROID;\n  };\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  struct AndroidSurfaceCreateInfoKHR\n  {\n    using NativeType = VkAndroidSurfaceCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAndroidSurfaceCreateInfoKHR;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AndroidSurfaceCreateInfoKHR( VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateFlagsKHR flags_  = {},\n                                                      struct ANativeWindow *                             window_ = {},\n                                                      const void *                                       pNext_  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , window{ window_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AndroidSurfaceCreateInfoKHR( AndroidSurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AndroidSurfaceCreateInfoKHR( VkAndroidSurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AndroidSurfaceCreateInfoKHR( *reinterpret_cast<AndroidSurfaceCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    AndroidSurfaceCreateInfoKHR & operator=( AndroidSurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AndroidSurfaceCreateInfoKHR & operator=( VkAndroidSurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AndroidSurfaceCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AndroidSurfaceCreateInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AndroidSurfaceCreateInfoKHR & setWindow( struct ANativeWindow * window_ ) VULKAN_HPP_NOEXCEPT\n    {\n      window = window_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAndroidSurfaceCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAndroidSurfaceCreateInfoKHR *>( this );\n    }\n\n    operator VkAndroidSurfaceCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAndroidSurfaceCreateInfoKHR *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateFlagsKHR const &,\n               struct ANativeWindow * const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, window );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AndroidSurfaceCreateInfoKHR const & ) const = default;\n#  else\n    bool operator==( AndroidSurfaceCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( window == rhs.window );\n#    endif\n    }\n\n    bool operator!=( AndroidSurfaceCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                sType  = StructureType::eAndroidSurfaceCreateInfoKHR;\n    const void *                                       pNext  = {};\n    VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateFlagsKHR flags  = {};\n    struct ANativeWindow *                             window = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAndroidSurfaceCreateInfoKHR>\n  {\n    using Type = AndroidSurfaceCreateInfoKHR;\n  };\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n  struct AntiLagPresentationInfoAMD\n  {\n    using NativeType = VkAntiLagPresentationInfoAMD;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAntiLagPresentationInfoAMD;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AntiLagPresentationInfoAMD( VULKAN_HPP_NAMESPACE::AntiLagStageAMD stage_      = VULKAN_HPP_NAMESPACE::AntiLagStageAMD::eInput,\n                                                     uint64_t                              frameIndex_ = {},\n                                                     void *                                pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stage{ stage_ }\n      , frameIndex{ frameIndex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AntiLagPresentationInfoAMD( AntiLagPresentationInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AntiLagPresentationInfoAMD( VkAntiLagPresentationInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AntiLagPresentationInfoAMD( *reinterpret_cast<AntiLagPresentationInfoAMD const *>( &rhs ) )\n    {\n    }\n\n    AntiLagPresentationInfoAMD & operator=( AntiLagPresentationInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AntiLagPresentationInfoAMD & operator=( VkAntiLagPresentationInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AntiLagPresentationInfoAMD const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AntiLagPresentationInfoAMD & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AntiLagPresentationInfoAMD & setStage( VULKAN_HPP_NAMESPACE::AntiLagStageAMD stage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stage = stage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AntiLagPresentationInfoAMD & setFrameIndex( uint64_t frameIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      frameIndex = frameIndex_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAntiLagPresentationInfoAMD const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAntiLagPresentationInfoAMD *>( this );\n    }\n\n    operator VkAntiLagPresentationInfoAMD &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAntiLagPresentationInfoAMD *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::AntiLagStageAMD const &, uint64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stage, frameIndex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AntiLagPresentationInfoAMD const & ) const = default;\n#else\n    bool operator==( AntiLagPresentationInfoAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( stage == rhs.stage ) && ( frameIndex == rhs.frameIndex );\n#  endif\n    }\n\n    bool operator!=( AntiLagPresentationInfoAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType   sType      = StructureType::eAntiLagPresentationInfoAMD;\n    void *                                pNext      = {};\n    VULKAN_HPP_NAMESPACE::AntiLagStageAMD stage      = VULKAN_HPP_NAMESPACE::AntiLagStageAMD::eInput;\n    uint64_t                              frameIndex = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAntiLagPresentationInfoAMD>\n  {\n    using Type = AntiLagPresentationInfoAMD;\n  };\n\n  struct AntiLagDataAMD\n  {\n    using NativeType = VkAntiLagDataAMD;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAntiLagDataAMD;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AntiLagDataAMD( VULKAN_HPP_NAMESPACE::AntiLagModeAMD                     mode_ = VULKAN_HPP_NAMESPACE::AntiLagModeAMD::eDriverControl,\n                                         uint32_t                                                 maxFPS_            = {},\n                                         const VULKAN_HPP_NAMESPACE::AntiLagPresentationInfoAMD * pPresentationInfo_ = {},\n                                         const void *                                             pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , mode{ mode_ }\n      , maxFPS{ maxFPS_ }\n      , pPresentationInfo{ pPresentationInfo_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AntiLagDataAMD( AntiLagDataAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AntiLagDataAMD( VkAntiLagDataAMD const & rhs ) VULKAN_HPP_NOEXCEPT : AntiLagDataAMD( *reinterpret_cast<AntiLagDataAMD const *>( &rhs ) ) {}\n\n    AntiLagDataAMD & operator=( AntiLagDataAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AntiLagDataAMD & operator=( VkAntiLagDataAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AntiLagDataAMD const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AntiLagDataAMD & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AntiLagDataAMD & setMode( VULKAN_HPP_NAMESPACE::AntiLagModeAMD mode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mode = mode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AntiLagDataAMD & setMaxFPS( uint32_t maxFPS_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxFPS = maxFPS_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AntiLagDataAMD &\n      setPPresentationInfo( const VULKAN_HPP_NAMESPACE::AntiLagPresentationInfoAMD * pPresentationInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPresentationInfo = pPresentationInfo_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAntiLagDataAMD const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAntiLagDataAMD *>( this );\n    }\n\n    operator VkAntiLagDataAMD &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAntiLagDataAMD *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::AntiLagModeAMD const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::AntiLagPresentationInfoAMD * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, mode, maxFPS, pPresentationInfo );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AntiLagDataAMD const & ) const = default;\n#else\n    bool operator==( AntiLagDataAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( mode == rhs.mode ) && ( maxFPS == rhs.maxFPS ) &&\n             ( pPresentationInfo == rhs.pPresentationInfo );\n#  endif\n    }\n\n    bool operator!=( AntiLagDataAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                      sType             = StructureType::eAntiLagDataAMD;\n    const void *                                             pNext             = {};\n    VULKAN_HPP_NAMESPACE::AntiLagModeAMD                     mode              = VULKAN_HPP_NAMESPACE::AntiLagModeAMD::eDriverControl;\n    uint32_t                                                 maxFPS            = {};\n    const VULKAN_HPP_NAMESPACE::AntiLagPresentationInfoAMD * pPresentationInfo = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAntiLagDataAMD>\n  {\n    using Type = AntiLagDataAMD;\n  };\n\n  struct ApplicationInfo\n  {\n    using NativeType = VkApplicationInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eApplicationInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ApplicationInfo( const char * pApplicationName_   = {},\n                                          uint32_t     applicationVersion_ = {},\n                                          const char * pEngineName_        = {},\n                                          uint32_t     engineVersion_      = {},\n                                          uint32_t     apiVersion_         = {},\n                                          const void * pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pApplicationName{ pApplicationName_ }\n      , applicationVersion{ applicationVersion_ }\n      , pEngineName{ pEngineName_ }\n      , engineVersion{ engineVersion_ }\n      , apiVersion{ apiVersion_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ApplicationInfo( ApplicationInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ApplicationInfo( VkApplicationInfo const & rhs ) VULKAN_HPP_NOEXCEPT : ApplicationInfo( *reinterpret_cast<ApplicationInfo const *>( &rhs ) ) {}\n\n    ApplicationInfo & operator=( ApplicationInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ApplicationInfo & operator=( VkApplicationInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ApplicationInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ApplicationInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ApplicationInfo & setPApplicationName( const char * pApplicationName_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pApplicationName = pApplicationName_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ApplicationInfo & setApplicationVersion( uint32_t applicationVersion_ ) VULKAN_HPP_NOEXCEPT\n    {\n      applicationVersion = applicationVersion_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ApplicationInfo & setPEngineName( const char * pEngineName_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pEngineName = pEngineName_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ApplicationInfo & setEngineVersion( uint32_t engineVersion_ ) VULKAN_HPP_NOEXCEPT\n    {\n      engineVersion = engineVersion_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ApplicationInfo & setApiVersion( uint32_t apiVersion_ ) VULKAN_HPP_NOEXCEPT\n    {\n      apiVersion = apiVersion_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkApplicationInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkApplicationInfo *>( this );\n    }\n\n    operator VkApplicationInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkApplicationInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               const char * const &,\n               uint32_t const &,\n               const char * const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pApplicationName, applicationVersion, pEngineName, engineVersion, apiVersion );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( ApplicationInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( pApplicationName != rhs.pApplicationName )\n        if ( auto cmp = strcmp( pApplicationName, rhs.pApplicationName ); cmp != 0 )\n          return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = applicationVersion <=> rhs.applicationVersion; cmp != 0 )\n        return cmp;\n      if ( pEngineName != rhs.pEngineName )\n        if ( auto cmp = strcmp( pEngineName, rhs.pEngineName ); cmp != 0 )\n          return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = engineVersion <=> rhs.engineVersion; cmp != 0 )\n        return cmp;\n      if ( auto cmp = apiVersion <=> rhs.apiVersion; cmp != 0 )\n        return cmp;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( ApplicationInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) &&\n             ( ( pApplicationName == rhs.pApplicationName ) || ( strcmp( pApplicationName, rhs.pApplicationName ) == 0 ) ) &&\n             ( applicationVersion == rhs.applicationVersion ) && ( ( pEngineName == rhs.pEngineName ) || ( strcmp( pEngineName, rhs.pEngineName ) == 0 ) ) &&\n             ( engineVersion == rhs.engineVersion ) && ( apiVersion == rhs.apiVersion );\n    }\n\n    bool operator!=( ApplicationInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType              = StructureType::eApplicationInfo;\n    const void *                        pNext              = {};\n    const char *                        pApplicationName   = {};\n    uint32_t                            applicationVersion = {};\n    const char *                        pEngineName        = {};\n    uint32_t                            engineVersion      = {};\n    uint32_t                            apiVersion         = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eApplicationInfo>\n  {\n    using Type = ApplicationInfo;\n  };\n\n  struct AttachmentDescription\n  {\n    using NativeType = VkAttachmentDescription;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      AttachmentDescription( VULKAN_HPP_NAMESPACE::AttachmentDescriptionFlags flags_          = {},\n                             VULKAN_HPP_NAMESPACE::Format                     format_         = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                             VULKAN_HPP_NAMESPACE::SampleCountFlagBits        samples_        = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1,\n                             VULKAN_HPP_NAMESPACE::AttachmentLoadOp           loadOp_         = VULKAN_HPP_NAMESPACE::AttachmentLoadOp::eLoad,\n                             VULKAN_HPP_NAMESPACE::AttachmentStoreOp          storeOp_        = VULKAN_HPP_NAMESPACE::AttachmentStoreOp::eStore,\n                             VULKAN_HPP_NAMESPACE::AttachmentLoadOp           stencilLoadOp_  = VULKAN_HPP_NAMESPACE::AttachmentLoadOp::eLoad,\n                             VULKAN_HPP_NAMESPACE::AttachmentStoreOp          stencilStoreOp_ = VULKAN_HPP_NAMESPACE::AttachmentStoreOp::eStore,\n                             VULKAN_HPP_NAMESPACE::ImageLayout                initialLayout_  = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                             VULKAN_HPP_NAMESPACE::ImageLayout                finalLayout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined ) VULKAN_HPP_NOEXCEPT\n      : flags{ flags_ }\n      , format{ format_ }\n      , samples{ samples_ }\n      , loadOp{ loadOp_ }\n      , storeOp{ storeOp_ }\n      , stencilLoadOp{ stencilLoadOp_ }\n      , stencilStoreOp{ stencilStoreOp_ }\n      , initialLayout{ initialLayout_ }\n      , finalLayout{ finalLayout_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AttachmentDescription( AttachmentDescription const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AttachmentDescription( VkAttachmentDescription const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AttachmentDescription( *reinterpret_cast<AttachmentDescription const *>( &rhs ) )\n    {\n    }\n\n    AttachmentDescription & operator=( AttachmentDescription const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AttachmentDescription & operator=( VkAttachmentDescription const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AttachmentDescription const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AttachmentDescription & setFlags( VULKAN_HPP_NAMESPACE::AttachmentDescriptionFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentDescription & setFormat( VULKAN_HPP_NAMESPACE::Format format_ ) VULKAN_HPP_NOEXCEPT\n    {\n      format = format_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentDescription & setSamples( VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples_ ) VULKAN_HPP_NOEXCEPT\n    {\n      samples = samples_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentDescription & setLoadOp( VULKAN_HPP_NAMESPACE::AttachmentLoadOp loadOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      loadOp = loadOp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentDescription & setStoreOp( VULKAN_HPP_NAMESPACE::AttachmentStoreOp storeOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      storeOp = storeOp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentDescription & setStencilLoadOp( VULKAN_HPP_NAMESPACE::AttachmentLoadOp stencilLoadOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stencilLoadOp = stencilLoadOp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentDescription & setStencilStoreOp( VULKAN_HPP_NAMESPACE::AttachmentStoreOp stencilStoreOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stencilStoreOp = stencilStoreOp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentDescription & setInitialLayout( VULKAN_HPP_NAMESPACE::ImageLayout initialLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      initialLayout = initialLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentDescription & setFinalLayout( VULKAN_HPP_NAMESPACE::ImageLayout finalLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      finalLayout = finalLayout_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAttachmentDescription const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAttachmentDescription *>( this );\n    }\n\n    operator VkAttachmentDescription &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAttachmentDescription *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::AttachmentDescriptionFlags const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlagBits const &,\n               VULKAN_HPP_NAMESPACE::AttachmentLoadOp const &,\n               VULKAN_HPP_NAMESPACE::AttachmentStoreOp const &,\n               VULKAN_HPP_NAMESPACE::AttachmentLoadOp const &,\n               VULKAN_HPP_NAMESPACE::AttachmentStoreOp const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( flags, format, samples, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalLayout );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AttachmentDescription const & ) const = default;\n#else\n    bool operator==( AttachmentDescription const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( flags == rhs.flags ) && ( format == rhs.format ) && ( samples == rhs.samples ) && ( loadOp == rhs.loadOp ) && ( storeOp == rhs.storeOp ) &&\n             ( stencilLoadOp == rhs.stencilLoadOp ) && ( stencilStoreOp == rhs.stencilStoreOp ) && ( initialLayout == rhs.initialLayout ) &&\n             ( finalLayout == rhs.finalLayout );\n#  endif\n    }\n\n    bool operator!=( AttachmentDescription const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::AttachmentDescriptionFlags flags          = {};\n    VULKAN_HPP_NAMESPACE::Format                     format         = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::SampleCountFlagBits        samples        = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1;\n    VULKAN_HPP_NAMESPACE::AttachmentLoadOp           loadOp         = VULKAN_HPP_NAMESPACE::AttachmentLoadOp::eLoad;\n    VULKAN_HPP_NAMESPACE::AttachmentStoreOp          storeOp        = VULKAN_HPP_NAMESPACE::AttachmentStoreOp::eStore;\n    VULKAN_HPP_NAMESPACE::AttachmentLoadOp           stencilLoadOp  = VULKAN_HPP_NAMESPACE::AttachmentLoadOp::eLoad;\n    VULKAN_HPP_NAMESPACE::AttachmentStoreOp          stencilStoreOp = VULKAN_HPP_NAMESPACE::AttachmentStoreOp::eStore;\n    VULKAN_HPP_NAMESPACE::ImageLayout                initialLayout  = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    VULKAN_HPP_NAMESPACE::ImageLayout                finalLayout    = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n  };\n\n  struct AttachmentDescription2\n  {\n    using NativeType = VkAttachmentDescription2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAttachmentDescription2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AttachmentDescription2( VULKAN_HPP_NAMESPACE::AttachmentDescriptionFlags flags_   = {},\n                                                 VULKAN_HPP_NAMESPACE::Format                     format_  = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                                 VULKAN_HPP_NAMESPACE::SampleCountFlagBits        samples_ = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1,\n                                                 VULKAN_HPP_NAMESPACE::AttachmentLoadOp           loadOp_  = VULKAN_HPP_NAMESPACE::AttachmentLoadOp::eLoad,\n                                                 VULKAN_HPP_NAMESPACE::AttachmentStoreOp          storeOp_ = VULKAN_HPP_NAMESPACE::AttachmentStoreOp::eStore,\n                                                 VULKAN_HPP_NAMESPACE::AttachmentLoadOp  stencilLoadOp_    = VULKAN_HPP_NAMESPACE::AttachmentLoadOp::eLoad,\n                                                 VULKAN_HPP_NAMESPACE::AttachmentStoreOp stencilStoreOp_   = VULKAN_HPP_NAMESPACE::AttachmentStoreOp::eStore,\n                                                 VULKAN_HPP_NAMESPACE::ImageLayout       initialLayout_    = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                                 VULKAN_HPP_NAMESPACE::ImageLayout       finalLayout_      = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                                 const void *                            pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , format{ format_ }\n      , samples{ samples_ }\n      , loadOp{ loadOp_ }\n      , storeOp{ storeOp_ }\n      , stencilLoadOp{ stencilLoadOp_ }\n      , stencilStoreOp{ stencilStoreOp_ }\n      , initialLayout{ initialLayout_ }\n      , finalLayout{ finalLayout_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AttachmentDescription2( AttachmentDescription2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AttachmentDescription2( VkAttachmentDescription2 const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AttachmentDescription2( *reinterpret_cast<AttachmentDescription2 const *>( &rhs ) )\n    {\n    }\n\n    AttachmentDescription2 & operator=( AttachmentDescription2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AttachmentDescription2 & operator=( VkAttachmentDescription2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AttachmentDescription2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AttachmentDescription2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentDescription2 & setFlags( VULKAN_HPP_NAMESPACE::AttachmentDescriptionFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentDescription2 & setFormat( VULKAN_HPP_NAMESPACE::Format format_ ) VULKAN_HPP_NOEXCEPT\n    {\n      format = format_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentDescription2 & setSamples( VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples_ ) VULKAN_HPP_NOEXCEPT\n    {\n      samples = samples_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentDescription2 & setLoadOp( VULKAN_HPP_NAMESPACE::AttachmentLoadOp loadOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      loadOp = loadOp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentDescription2 & setStoreOp( VULKAN_HPP_NAMESPACE::AttachmentStoreOp storeOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      storeOp = storeOp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentDescription2 & setStencilLoadOp( VULKAN_HPP_NAMESPACE::AttachmentLoadOp stencilLoadOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stencilLoadOp = stencilLoadOp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentDescription2 & setStencilStoreOp( VULKAN_HPP_NAMESPACE::AttachmentStoreOp stencilStoreOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stencilStoreOp = stencilStoreOp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentDescription2 & setInitialLayout( VULKAN_HPP_NAMESPACE::ImageLayout initialLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      initialLayout = initialLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentDescription2 & setFinalLayout( VULKAN_HPP_NAMESPACE::ImageLayout finalLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      finalLayout = finalLayout_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAttachmentDescription2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAttachmentDescription2 *>( this );\n    }\n\n    operator VkAttachmentDescription2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAttachmentDescription2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::AttachmentDescriptionFlags const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlagBits const &,\n               VULKAN_HPP_NAMESPACE::AttachmentLoadOp const &,\n               VULKAN_HPP_NAMESPACE::AttachmentStoreOp const &,\n               VULKAN_HPP_NAMESPACE::AttachmentLoadOp const &,\n               VULKAN_HPP_NAMESPACE::AttachmentStoreOp const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, format, samples, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalLayout );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AttachmentDescription2 const & ) const = default;\n#else\n    bool operator==( AttachmentDescription2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( format == rhs.format ) && ( samples == rhs.samples ) &&\n             ( loadOp == rhs.loadOp ) && ( storeOp == rhs.storeOp ) && ( stencilLoadOp == rhs.stencilLoadOp ) && ( stencilStoreOp == rhs.stencilStoreOp ) &&\n             ( initialLayout == rhs.initialLayout ) && ( finalLayout == rhs.finalLayout );\n#  endif\n    }\n\n    bool operator!=( AttachmentDescription2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType              sType          = StructureType::eAttachmentDescription2;\n    const void *                                     pNext          = {};\n    VULKAN_HPP_NAMESPACE::AttachmentDescriptionFlags flags          = {};\n    VULKAN_HPP_NAMESPACE::Format                     format         = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::SampleCountFlagBits        samples        = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1;\n    VULKAN_HPP_NAMESPACE::AttachmentLoadOp           loadOp         = VULKAN_HPP_NAMESPACE::AttachmentLoadOp::eLoad;\n    VULKAN_HPP_NAMESPACE::AttachmentStoreOp          storeOp        = VULKAN_HPP_NAMESPACE::AttachmentStoreOp::eStore;\n    VULKAN_HPP_NAMESPACE::AttachmentLoadOp           stencilLoadOp  = VULKAN_HPP_NAMESPACE::AttachmentLoadOp::eLoad;\n    VULKAN_HPP_NAMESPACE::AttachmentStoreOp          stencilStoreOp = VULKAN_HPP_NAMESPACE::AttachmentStoreOp::eStore;\n    VULKAN_HPP_NAMESPACE::ImageLayout                initialLayout  = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    VULKAN_HPP_NAMESPACE::ImageLayout                finalLayout    = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAttachmentDescription2>\n  {\n    using Type = AttachmentDescription2;\n  };\n\n  using AttachmentDescription2KHR = AttachmentDescription2;\n\n  struct AttachmentDescriptionStencilLayout\n  {\n    using NativeType = VkAttachmentDescriptionStencilLayout;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAttachmentDescriptionStencilLayout;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      AttachmentDescriptionStencilLayout( VULKAN_HPP_NAMESPACE::ImageLayout stencilInitialLayout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                          VULKAN_HPP_NAMESPACE::ImageLayout stencilFinalLayout_   = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                          void *                            pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stencilInitialLayout{ stencilInitialLayout_ }\n      , stencilFinalLayout{ stencilFinalLayout_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AttachmentDescriptionStencilLayout( AttachmentDescriptionStencilLayout const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AttachmentDescriptionStencilLayout( VkAttachmentDescriptionStencilLayout const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AttachmentDescriptionStencilLayout( *reinterpret_cast<AttachmentDescriptionStencilLayout const *>( &rhs ) )\n    {\n    }\n\n    AttachmentDescriptionStencilLayout & operator=( AttachmentDescriptionStencilLayout const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AttachmentDescriptionStencilLayout & operator=( VkAttachmentDescriptionStencilLayout const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AttachmentDescriptionStencilLayout const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AttachmentDescriptionStencilLayout & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentDescriptionStencilLayout &\n      setStencilInitialLayout( VULKAN_HPP_NAMESPACE::ImageLayout stencilInitialLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stencilInitialLayout = stencilInitialLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentDescriptionStencilLayout &\n      setStencilFinalLayout( VULKAN_HPP_NAMESPACE::ImageLayout stencilFinalLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stencilFinalLayout = stencilFinalLayout_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAttachmentDescriptionStencilLayout const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAttachmentDescriptionStencilLayout *>( this );\n    }\n\n    operator VkAttachmentDescriptionStencilLayout &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAttachmentDescriptionStencilLayout *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::\n      tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::ImageLayout const &, VULKAN_HPP_NAMESPACE::ImageLayout const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stencilInitialLayout, stencilFinalLayout );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AttachmentDescriptionStencilLayout const & ) const = default;\n#else\n    bool operator==( AttachmentDescriptionStencilLayout const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( stencilInitialLayout == rhs.stencilInitialLayout ) &&\n             ( stencilFinalLayout == rhs.stencilFinalLayout );\n#  endif\n    }\n\n    bool operator!=( AttachmentDescriptionStencilLayout const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                = StructureType::eAttachmentDescriptionStencilLayout;\n    void *                              pNext                = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout   stencilInitialLayout = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    VULKAN_HPP_NAMESPACE::ImageLayout   stencilFinalLayout   = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAttachmentDescriptionStencilLayout>\n  {\n    using Type = AttachmentDescriptionStencilLayout;\n  };\n\n  using AttachmentDescriptionStencilLayoutKHR = AttachmentDescriptionStencilLayout;\n\n  struct AttachmentReference\n  {\n    using NativeType = VkAttachmentReference;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AttachmentReference( uint32_t                          attachment_ = {},\n                                              VULKAN_HPP_NAMESPACE::ImageLayout layout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined ) VULKAN_HPP_NOEXCEPT\n      : attachment{ attachment_ }\n      , layout{ layout_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AttachmentReference( AttachmentReference const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AttachmentReference( VkAttachmentReference const & rhs ) VULKAN_HPP_NOEXCEPT : AttachmentReference( *reinterpret_cast<AttachmentReference const *>( &rhs ) )\n    {\n    }\n\n    AttachmentReference & operator=( AttachmentReference const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AttachmentReference & operator=( VkAttachmentReference const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AttachmentReference const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AttachmentReference & setAttachment( uint32_t attachment_ ) VULKAN_HPP_NOEXCEPT\n    {\n      attachment = attachment_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentReference & setLayout( VULKAN_HPP_NAMESPACE::ImageLayout layout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layout = layout_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAttachmentReference const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAttachmentReference *>( this );\n    }\n\n    operator VkAttachmentReference &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAttachmentReference *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, VULKAN_HPP_NAMESPACE::ImageLayout const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( attachment, layout );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AttachmentReference const & ) const = default;\n#else\n    bool operator==( AttachmentReference const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( attachment == rhs.attachment ) && ( layout == rhs.layout );\n#  endif\n    }\n\n    bool operator!=( AttachmentReference const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                          attachment = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout layout     = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n  };\n\n  struct AttachmentReference2\n  {\n    using NativeType = VkAttachmentReference2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAttachmentReference2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AttachmentReference2( uint32_t                               attachment_ = {},\n                                               VULKAN_HPP_NAMESPACE::ImageLayout      layout_     = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                               VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask_ = {},\n                                               const void *                           pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , attachment{ attachment_ }\n      , layout{ layout_ }\n      , aspectMask{ aspectMask_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AttachmentReference2( AttachmentReference2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AttachmentReference2( VkAttachmentReference2 const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AttachmentReference2( *reinterpret_cast<AttachmentReference2 const *>( &rhs ) )\n    {\n    }\n\n    AttachmentReference2 & operator=( AttachmentReference2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AttachmentReference2 & operator=( VkAttachmentReference2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AttachmentReference2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AttachmentReference2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentReference2 & setAttachment( uint32_t attachment_ ) VULKAN_HPP_NOEXCEPT\n    {\n      attachment = attachment_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentReference2 & setLayout( VULKAN_HPP_NAMESPACE::ImageLayout layout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layout = layout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentReference2 & setAspectMask( VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      aspectMask = aspectMask_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAttachmentReference2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAttachmentReference2 *>( this );\n    }\n\n    operator VkAttachmentReference2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAttachmentReference2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               VULKAN_HPP_NAMESPACE::ImageAspectFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, attachment, layout, aspectMask );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AttachmentReference2 const & ) const = default;\n#else\n    bool operator==( AttachmentReference2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( attachment == rhs.attachment ) && ( layout == rhs.layout ) &&\n             ( aspectMask == rhs.aspectMask );\n#  endif\n    }\n\n    bool operator!=( AttachmentReference2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType      = StructureType::eAttachmentReference2;\n    const void *                           pNext      = {};\n    uint32_t                               attachment = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout      layout     = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAttachmentReference2>\n  {\n    using Type = AttachmentReference2;\n  };\n\n  using AttachmentReference2KHR = AttachmentReference2;\n\n  struct AttachmentReferenceStencilLayout\n  {\n    using NativeType = VkAttachmentReferenceStencilLayout;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAttachmentReferenceStencilLayout;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AttachmentReferenceStencilLayout( VULKAN_HPP_NAMESPACE::ImageLayout stencilLayout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                                           void *                            pNext_         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stencilLayout{ stencilLayout_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AttachmentReferenceStencilLayout( AttachmentReferenceStencilLayout const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AttachmentReferenceStencilLayout( VkAttachmentReferenceStencilLayout const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AttachmentReferenceStencilLayout( *reinterpret_cast<AttachmentReferenceStencilLayout const *>( &rhs ) )\n    {\n    }\n\n    AttachmentReferenceStencilLayout & operator=( AttachmentReferenceStencilLayout const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AttachmentReferenceStencilLayout & operator=( VkAttachmentReferenceStencilLayout const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AttachmentReferenceStencilLayout const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AttachmentReferenceStencilLayout & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentReferenceStencilLayout & setStencilLayout( VULKAN_HPP_NAMESPACE::ImageLayout stencilLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stencilLayout = stencilLayout_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAttachmentReferenceStencilLayout const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAttachmentReferenceStencilLayout *>( this );\n    }\n\n    operator VkAttachmentReferenceStencilLayout &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAttachmentReferenceStencilLayout *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::ImageLayout const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stencilLayout );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AttachmentReferenceStencilLayout const & ) const = default;\n#else\n    bool operator==( AttachmentReferenceStencilLayout const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( stencilLayout == rhs.stencilLayout );\n#  endif\n    }\n\n    bool operator!=( AttachmentReferenceStencilLayout const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType         = StructureType::eAttachmentReferenceStencilLayout;\n    void *                              pNext         = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout   stencilLayout = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAttachmentReferenceStencilLayout>\n  {\n    using Type = AttachmentReferenceStencilLayout;\n  };\n\n  using AttachmentReferenceStencilLayoutKHR = AttachmentReferenceStencilLayout;\n\n  struct AttachmentSampleCountInfoAMD\n  {\n    using NativeType = VkAttachmentSampleCountInfoAMD;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eAttachmentSampleCountInfoAMD;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      AttachmentSampleCountInfoAMD( uint32_t                                          colorAttachmentCount_    = {},\n                                    const VULKAN_HPP_NAMESPACE::SampleCountFlagBits * pColorAttachmentSamples_ = {},\n                                    VULKAN_HPP_NAMESPACE::SampleCountFlagBits depthStencilAttachmentSamples_   = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1,\n                                    const void *                              pNext_                           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , colorAttachmentCount{ colorAttachmentCount_ }\n      , pColorAttachmentSamples{ pColorAttachmentSamples_ }\n      , depthStencilAttachmentSamples{ depthStencilAttachmentSamples_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AttachmentSampleCountInfoAMD( AttachmentSampleCountInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AttachmentSampleCountInfoAMD( VkAttachmentSampleCountInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AttachmentSampleCountInfoAMD( *reinterpret_cast<AttachmentSampleCountInfoAMD const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    AttachmentSampleCountInfoAMD(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SampleCountFlagBits> const & colorAttachmentSamples_,\n      VULKAN_HPP_NAMESPACE::SampleCountFlagBits depthStencilAttachmentSamples_ = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1,\n      const void *                              pNext_                         = nullptr )\n      : pNext( pNext_ )\n      , colorAttachmentCount( static_cast<uint32_t>( colorAttachmentSamples_.size() ) )\n      , pColorAttachmentSamples( colorAttachmentSamples_.data() )\n      , depthStencilAttachmentSamples( depthStencilAttachmentSamples_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    AttachmentSampleCountInfoAMD & operator=( AttachmentSampleCountInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AttachmentSampleCountInfoAMD & operator=( VkAttachmentSampleCountInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AttachmentSampleCountInfoAMD const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AttachmentSampleCountInfoAMD & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentSampleCountInfoAMD & setColorAttachmentCount( uint32_t colorAttachmentCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorAttachmentCount = colorAttachmentCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentSampleCountInfoAMD &\n      setPColorAttachmentSamples( const VULKAN_HPP_NAMESPACE::SampleCountFlagBits * pColorAttachmentSamples_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pColorAttachmentSamples = pColorAttachmentSamples_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    AttachmentSampleCountInfoAMD & setColorAttachmentSamples(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SampleCountFlagBits> const & colorAttachmentSamples_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorAttachmentCount    = static_cast<uint32_t>( colorAttachmentSamples_.size() );\n      pColorAttachmentSamples = colorAttachmentSamples_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentSampleCountInfoAMD &\n      setDepthStencilAttachmentSamples( VULKAN_HPP_NAMESPACE::SampleCountFlagBits depthStencilAttachmentSamples_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthStencilAttachmentSamples = depthStencilAttachmentSamples_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAttachmentSampleCountInfoAMD const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAttachmentSampleCountInfoAMD *>( this );\n    }\n\n    operator VkAttachmentSampleCountInfoAMD &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAttachmentSampleCountInfoAMD *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::SampleCountFlagBits * const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlagBits const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, colorAttachmentCount, pColorAttachmentSamples, depthStencilAttachmentSamples );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AttachmentSampleCountInfoAMD const & ) const = default;\n#else\n    bool operator==( AttachmentSampleCountInfoAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( colorAttachmentCount == rhs.colorAttachmentCount ) &&\n             ( pColorAttachmentSamples == rhs.pColorAttachmentSamples ) && ( depthStencilAttachmentSamples == rhs.depthStencilAttachmentSamples );\n#  endif\n    }\n\n    bool operator!=( AttachmentSampleCountInfoAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType                         = StructureType::eAttachmentSampleCountInfoAMD;\n    const void *                                      pNext                         = {};\n    uint32_t                                          colorAttachmentCount          = {};\n    const VULKAN_HPP_NAMESPACE::SampleCountFlagBits * pColorAttachmentSamples       = {};\n    VULKAN_HPP_NAMESPACE::SampleCountFlagBits         depthStencilAttachmentSamples = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eAttachmentSampleCountInfoAMD>\n  {\n    using Type = AttachmentSampleCountInfoAMD;\n  };\n\n  using AttachmentSampleCountInfoNV = AttachmentSampleCountInfoAMD;\n\n  struct Extent2D\n  {\n    using NativeType = VkExtent2D;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR Extent2D( uint32_t width_ = {}, uint32_t height_ = {} ) VULKAN_HPP_NOEXCEPT\n      : width{ width_ }\n      , height{ height_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR Extent2D( Extent2D const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    Extent2D( VkExtent2D const & rhs ) VULKAN_HPP_NOEXCEPT : Extent2D( *reinterpret_cast<Extent2D const *>( &rhs ) ) {}\n\n    Extent2D & operator=( Extent2D const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    Extent2D & operator=( VkExtent2D const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::Extent2D const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 Extent2D & setWidth( uint32_t width_ ) VULKAN_HPP_NOEXCEPT\n    {\n      width = width_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 Extent2D & setHeight( uint32_t height_ ) VULKAN_HPP_NOEXCEPT\n    {\n      height = height_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExtent2D const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExtent2D *>( this );\n    }\n\n    operator VkExtent2D &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExtent2D *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( width, height );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( Extent2D const & ) const = default;\n#else\n    bool operator==( Extent2D const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( width == rhs.width ) && ( height == rhs.height );\n#  endif\n    }\n\n    bool operator!=( Extent2D const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t width  = {};\n    uint32_t height = {};\n  };\n\n  struct SampleLocationEXT\n  {\n    using NativeType = VkSampleLocationEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SampleLocationEXT( float x_ = {}, float y_ = {} ) VULKAN_HPP_NOEXCEPT\n      : x{ x_ }\n      , y{ y_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SampleLocationEXT( SampleLocationEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SampleLocationEXT( VkSampleLocationEXT const & rhs ) VULKAN_HPP_NOEXCEPT : SampleLocationEXT( *reinterpret_cast<SampleLocationEXT const *>( &rhs ) ) {}\n\n    SampleLocationEXT & operator=( SampleLocationEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SampleLocationEXT & operator=( VkSampleLocationEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SampleLocationEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SampleLocationEXT & setX( float x_ ) VULKAN_HPP_NOEXCEPT\n    {\n      x = x_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SampleLocationEXT & setY( float y_ ) VULKAN_HPP_NOEXCEPT\n    {\n      y = y_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSampleLocationEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSampleLocationEXT *>( this );\n    }\n\n    operator VkSampleLocationEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSampleLocationEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<float const &, float const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( x, y );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SampleLocationEXT const & ) const = default;\n#else\n    bool operator==( SampleLocationEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( x == rhs.x ) && ( y == rhs.y );\n#  endif\n    }\n\n    bool operator!=( SampleLocationEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    float x = {};\n    float y = {};\n  };\n\n  struct SampleLocationsInfoEXT\n  {\n    using NativeType = VkSampleLocationsInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSampleLocationsInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      SampleLocationsInfoEXT( VULKAN_HPP_NAMESPACE::SampleCountFlagBits       sampleLocationsPerPixel_ = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1,\n                              VULKAN_HPP_NAMESPACE::Extent2D                  sampleLocationGridSize_  = {},\n                              uint32_t                                        sampleLocationsCount_    = {},\n                              const VULKAN_HPP_NAMESPACE::SampleLocationEXT * pSampleLocations_        = {},\n                              const void *                                    pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , sampleLocationsPerPixel{ sampleLocationsPerPixel_ }\n      , sampleLocationGridSize{ sampleLocationGridSize_ }\n      , sampleLocationsCount{ sampleLocationsCount_ }\n      , pSampleLocations{ pSampleLocations_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SampleLocationsInfoEXT( SampleLocationsInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SampleLocationsInfoEXT( VkSampleLocationsInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SampleLocationsInfoEXT( *reinterpret_cast<SampleLocationsInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SampleLocationsInfoEXT( VULKAN_HPP_NAMESPACE::SampleCountFlagBits                                                            sampleLocationsPerPixel_,\n                            VULKAN_HPP_NAMESPACE::Extent2D                                                                       sampleLocationGridSize_,\n                            VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SampleLocationEXT> const & sampleLocations_,\n                            const void *                                                                                         pNext_ = nullptr )\n      : pNext( pNext_ )\n      , sampleLocationsPerPixel( sampleLocationsPerPixel_ )\n      , sampleLocationGridSize( sampleLocationGridSize_ )\n      , sampleLocationsCount( static_cast<uint32_t>( sampleLocations_.size() ) )\n      , pSampleLocations( sampleLocations_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    SampleLocationsInfoEXT & operator=( SampleLocationsInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SampleLocationsInfoEXT & operator=( VkSampleLocationsInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SampleLocationsInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SampleLocationsInfoEXT &\n      setSampleLocationsPerPixel( VULKAN_HPP_NAMESPACE::SampleCountFlagBits sampleLocationsPerPixel_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sampleLocationsPerPixel = sampleLocationsPerPixel_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SampleLocationsInfoEXT &\n      setSampleLocationGridSize( VULKAN_HPP_NAMESPACE::Extent2D const & sampleLocationGridSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sampleLocationGridSize = sampleLocationGridSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SampleLocationsInfoEXT & setSampleLocationsCount( uint32_t sampleLocationsCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sampleLocationsCount = sampleLocationsCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SampleLocationsInfoEXT &\n      setPSampleLocations( const VULKAN_HPP_NAMESPACE::SampleLocationEXT * pSampleLocations_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSampleLocations = pSampleLocations_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SampleLocationsInfoEXT & setSampleLocations(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SampleLocationEXT> const & sampleLocations_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sampleLocationsCount = static_cast<uint32_t>( sampleLocations_.size() );\n      pSampleLocations     = sampleLocations_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSampleLocationsInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSampleLocationsInfoEXT *>( this );\n    }\n\n    operator VkSampleLocationsInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSampleLocationsInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlagBits const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::SampleLocationEXT * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, sampleLocationsPerPixel, sampleLocationGridSize, sampleLocationsCount, pSampleLocations );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SampleLocationsInfoEXT const & ) const = default;\n#else\n    bool operator==( SampleLocationsInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( sampleLocationsPerPixel == rhs.sampleLocationsPerPixel ) &&\n             ( sampleLocationGridSize == rhs.sampleLocationGridSize ) && ( sampleLocationsCount == rhs.sampleLocationsCount ) &&\n             ( pSampleLocations == rhs.pSampleLocations );\n#  endif\n    }\n\n    bool operator!=( SampleLocationsInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType             sType                   = StructureType::eSampleLocationsInfoEXT;\n    const void *                                    pNext                   = {};\n    VULKAN_HPP_NAMESPACE::SampleCountFlagBits       sampleLocationsPerPixel = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1;\n    VULKAN_HPP_NAMESPACE::Extent2D                  sampleLocationGridSize  = {};\n    uint32_t                                        sampleLocationsCount    = {};\n    const VULKAN_HPP_NAMESPACE::SampleLocationEXT * pSampleLocations        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSampleLocationsInfoEXT>\n  {\n    using Type = SampleLocationsInfoEXT;\n  };\n\n  struct AttachmentSampleLocationsEXT\n  {\n    using NativeType = VkAttachmentSampleLocationsEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR AttachmentSampleLocationsEXT( uint32_t                                     attachmentIndex_     = {},\n                                                       VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT sampleLocationsInfo_ = {} ) VULKAN_HPP_NOEXCEPT\n      : attachmentIndex{ attachmentIndex_ }\n      , sampleLocationsInfo{ sampleLocationsInfo_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR AttachmentSampleLocationsEXT( AttachmentSampleLocationsEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    AttachmentSampleLocationsEXT( VkAttachmentSampleLocationsEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : AttachmentSampleLocationsEXT( *reinterpret_cast<AttachmentSampleLocationsEXT const *>( &rhs ) )\n    {\n    }\n\n    AttachmentSampleLocationsEXT & operator=( AttachmentSampleLocationsEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    AttachmentSampleLocationsEXT & operator=( VkAttachmentSampleLocationsEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::AttachmentSampleLocationsEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 AttachmentSampleLocationsEXT & setAttachmentIndex( uint32_t attachmentIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      attachmentIndex = attachmentIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 AttachmentSampleLocationsEXT &\n      setSampleLocationsInfo( VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT const & sampleLocationsInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sampleLocationsInfo = sampleLocationsInfo_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkAttachmentSampleLocationsEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkAttachmentSampleLocationsEXT *>( this );\n    }\n\n    operator VkAttachmentSampleLocationsEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkAttachmentSampleLocationsEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( attachmentIndex, sampleLocationsInfo );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( AttachmentSampleLocationsEXT const & ) const = default;\n#else\n    bool operator==( AttachmentSampleLocationsEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( attachmentIndex == rhs.attachmentIndex ) && ( sampleLocationsInfo == rhs.sampleLocationsInfo );\n#  endif\n    }\n\n    bool operator!=( AttachmentSampleLocationsEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                                     attachmentIndex     = {};\n    VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT sampleLocationsInfo = {};\n  };\n\n  struct BaseInStructure\n  {\n    using NativeType = VkBaseInStructure;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    BaseInStructure( VULKAN_HPP_NAMESPACE::StructureType                  sType_ = VULKAN_HPP_NAMESPACE::StructureType::eApplicationInfo,\n                     const struct VULKAN_HPP_NAMESPACE::BaseInStructure * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : sType{ sType_ }\n      , pNext{ pNext_ }\n    {\n    }\n\n    BaseInStructure( BaseInStructure const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BaseInStructure( VkBaseInStructure const & rhs ) VULKAN_HPP_NOEXCEPT : BaseInStructure( *reinterpret_cast<BaseInStructure const *>( &rhs ) ) {}\n\n    BaseInStructure & operator=( BaseInStructure const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BaseInStructure & operator=( VkBaseInStructure const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BaseInStructure const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BaseInStructure & setPNext( const struct VULKAN_HPP_NAMESPACE::BaseInStructure * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBaseInStructure const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBaseInStructure *>( this );\n    }\n\n    operator VkBaseInStructure &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBaseInStructure *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const struct VULKAN_HPP_NAMESPACE::BaseInStructure * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BaseInStructure const & ) const = default;\n#else\n    bool operator==( BaseInStructure const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext );\n#  endif\n    }\n\n    bool operator!=( BaseInStructure const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                  sType = VULKAN_HPP_NAMESPACE::StructureType::eApplicationInfo;\n    const struct VULKAN_HPP_NAMESPACE::BaseInStructure * pNext = {};\n  };\n\n  struct BaseOutStructure\n  {\n    using NativeType = VkBaseOutStructure;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    BaseOutStructure( VULKAN_HPP_NAMESPACE::StructureType             sType_ = VULKAN_HPP_NAMESPACE::StructureType::eApplicationInfo,\n                      struct VULKAN_HPP_NAMESPACE::BaseOutStructure * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : sType{ sType_ }\n      , pNext{ pNext_ }\n    {\n    }\n\n    BaseOutStructure( BaseOutStructure const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BaseOutStructure( VkBaseOutStructure const & rhs ) VULKAN_HPP_NOEXCEPT : BaseOutStructure( *reinterpret_cast<BaseOutStructure const *>( &rhs ) ) {}\n\n    BaseOutStructure & operator=( BaseOutStructure const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BaseOutStructure & operator=( VkBaseOutStructure const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BaseOutStructure const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BaseOutStructure & setPNext( struct VULKAN_HPP_NAMESPACE::BaseOutStructure * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBaseOutStructure const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBaseOutStructure *>( this );\n    }\n\n    operator VkBaseOutStructure &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBaseOutStructure *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, struct VULKAN_HPP_NAMESPACE::BaseOutStructure * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BaseOutStructure const & ) const = default;\n#else\n    bool operator==( BaseOutStructure const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext );\n#  endif\n    }\n\n    bool operator!=( BaseOutStructure const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType             sType = VULKAN_HPP_NAMESPACE::StructureType::eApplicationInfo;\n    struct VULKAN_HPP_NAMESPACE::BaseOutStructure * pNext = {};\n  };\n\n  struct BindAccelerationStructureMemoryInfoNV\n  {\n    using NativeType = VkBindAccelerationStructureMemoryInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBindAccelerationStructureMemoryInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BindAccelerationStructureMemoryInfoNV( VULKAN_HPP_NAMESPACE::AccelerationStructureNV accelerationStructure_ = {},\n                                                                VULKAN_HPP_NAMESPACE::DeviceMemory            memory_                = {},\n                                                                VULKAN_HPP_NAMESPACE::DeviceSize              memoryOffset_          = {},\n                                                                uint32_t                                      deviceIndexCount_      = {},\n                                                                const uint32_t *                              pDeviceIndices_        = {},\n                                                                const void *                                  pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , accelerationStructure{ accelerationStructure_ }\n      , memory{ memory_ }\n      , memoryOffset{ memoryOffset_ }\n      , deviceIndexCount{ deviceIndexCount_ }\n      , pDeviceIndices{ pDeviceIndices_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BindAccelerationStructureMemoryInfoNV( BindAccelerationStructureMemoryInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BindAccelerationStructureMemoryInfoNV( VkBindAccelerationStructureMemoryInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BindAccelerationStructureMemoryInfoNV( *reinterpret_cast<BindAccelerationStructureMemoryInfoNV const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    BindAccelerationStructureMemoryInfoNV( VULKAN_HPP_NAMESPACE::AccelerationStructureNV                         accelerationStructure_,\n                                           VULKAN_HPP_NAMESPACE::DeviceMemory                                    memory_,\n                                           VULKAN_HPP_NAMESPACE::DeviceSize                                      memoryOffset_,\n                                           VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & deviceIndices_,\n                                           const void *                                                          pNext_ = nullptr )\n      : pNext( pNext_ )\n      , accelerationStructure( accelerationStructure_ )\n      , memory( memory_ )\n      , memoryOffset( memoryOffset_ )\n      , deviceIndexCount( static_cast<uint32_t>( deviceIndices_.size() ) )\n      , pDeviceIndices( deviceIndices_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    BindAccelerationStructureMemoryInfoNV & operator=( BindAccelerationStructureMemoryInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BindAccelerationStructureMemoryInfoNV & operator=( VkBindAccelerationStructureMemoryInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BindAccelerationStructureMemoryInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BindAccelerationStructureMemoryInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindAccelerationStructureMemoryInfoNV &\n      setAccelerationStructure( VULKAN_HPP_NAMESPACE::AccelerationStructureNV accelerationStructure_ ) VULKAN_HPP_NOEXCEPT\n    {\n      accelerationStructure = accelerationStructure_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindAccelerationStructureMemoryInfoNV & setMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memory = memory_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindAccelerationStructureMemoryInfoNV & setMemoryOffset( VULKAN_HPP_NAMESPACE::DeviceSize memoryOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memoryOffset = memoryOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindAccelerationStructureMemoryInfoNV & setDeviceIndexCount( uint32_t deviceIndexCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceIndexCount = deviceIndexCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindAccelerationStructureMemoryInfoNV & setPDeviceIndices( const uint32_t * pDeviceIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDeviceIndices = pDeviceIndices_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    BindAccelerationStructureMemoryInfoNV &\n      setDeviceIndices( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & deviceIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceIndexCount = static_cast<uint32_t>( deviceIndices_.size() );\n      pDeviceIndices   = deviceIndices_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBindAccelerationStructureMemoryInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBindAccelerationStructureMemoryInfoNV *>( this );\n    }\n\n    operator VkBindAccelerationStructureMemoryInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBindAccelerationStructureMemoryInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::AccelerationStructureNV const &,\n               VULKAN_HPP_NAMESPACE::DeviceMemory const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               uint32_t const &,\n               const uint32_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, accelerationStructure, memory, memoryOffset, deviceIndexCount, pDeviceIndices );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BindAccelerationStructureMemoryInfoNV const & ) const = default;\n#else\n    bool operator==( BindAccelerationStructureMemoryInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( accelerationStructure == rhs.accelerationStructure ) && ( memory == rhs.memory ) &&\n             ( memoryOffset == rhs.memoryOffset ) && ( deviceIndexCount == rhs.deviceIndexCount ) && ( pDeviceIndices == rhs.pDeviceIndices );\n#  endif\n    }\n\n    bool operator!=( BindAccelerationStructureMemoryInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType           sType                 = StructureType::eBindAccelerationStructureMemoryInfoNV;\n    const void *                                  pNext                 = {};\n    VULKAN_HPP_NAMESPACE::AccelerationStructureNV accelerationStructure = {};\n    VULKAN_HPP_NAMESPACE::DeviceMemory            memory                = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize              memoryOffset          = {};\n    uint32_t                                      deviceIndexCount      = {};\n    const uint32_t *                              pDeviceIndices        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBindAccelerationStructureMemoryInfoNV>\n  {\n    using Type = BindAccelerationStructureMemoryInfoNV;\n  };\n\n  struct BindBufferMemoryDeviceGroupInfo\n  {\n    using NativeType = VkBindBufferMemoryDeviceGroupInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBindBufferMemoryDeviceGroupInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BindBufferMemoryDeviceGroupInfo( uint32_t         deviceIndexCount_ = {},\n                                                          const uint32_t * pDeviceIndices_   = {},\n                                                          const void *     pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , deviceIndexCount{ deviceIndexCount_ }\n      , pDeviceIndices{ pDeviceIndices_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BindBufferMemoryDeviceGroupInfo( BindBufferMemoryDeviceGroupInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BindBufferMemoryDeviceGroupInfo( VkBindBufferMemoryDeviceGroupInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BindBufferMemoryDeviceGroupInfo( *reinterpret_cast<BindBufferMemoryDeviceGroupInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    BindBufferMemoryDeviceGroupInfo( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & deviceIndices_, const void * pNext_ = nullptr )\n      : pNext( pNext_ ), deviceIndexCount( static_cast<uint32_t>( deviceIndices_.size() ) ), pDeviceIndices( deviceIndices_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    BindBufferMemoryDeviceGroupInfo & operator=( BindBufferMemoryDeviceGroupInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BindBufferMemoryDeviceGroupInfo & operator=( VkBindBufferMemoryDeviceGroupInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BindBufferMemoryDeviceGroupInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BindBufferMemoryDeviceGroupInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindBufferMemoryDeviceGroupInfo & setDeviceIndexCount( uint32_t deviceIndexCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceIndexCount = deviceIndexCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindBufferMemoryDeviceGroupInfo & setPDeviceIndices( const uint32_t * pDeviceIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDeviceIndices = pDeviceIndices_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    BindBufferMemoryDeviceGroupInfo &\n      setDeviceIndices( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & deviceIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceIndexCount = static_cast<uint32_t>( deviceIndices_.size() );\n      pDeviceIndices   = deviceIndices_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBindBufferMemoryDeviceGroupInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBindBufferMemoryDeviceGroupInfo *>( this );\n    }\n\n    operator VkBindBufferMemoryDeviceGroupInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBindBufferMemoryDeviceGroupInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const uint32_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, deviceIndexCount, pDeviceIndices );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BindBufferMemoryDeviceGroupInfo const & ) const = default;\n#else\n    bool operator==( BindBufferMemoryDeviceGroupInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( deviceIndexCount == rhs.deviceIndexCount ) && ( pDeviceIndices == rhs.pDeviceIndices );\n#  endif\n    }\n\n    bool operator!=( BindBufferMemoryDeviceGroupInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType            = StructureType::eBindBufferMemoryDeviceGroupInfo;\n    const void *                        pNext            = {};\n    uint32_t                            deviceIndexCount = {};\n    const uint32_t *                    pDeviceIndices   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBindBufferMemoryDeviceGroupInfo>\n  {\n    using Type = BindBufferMemoryDeviceGroupInfo;\n  };\n\n  using BindBufferMemoryDeviceGroupInfoKHR = BindBufferMemoryDeviceGroupInfo;\n\n  struct BindBufferMemoryInfo\n  {\n    using NativeType = VkBindBufferMemoryInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBindBufferMemoryInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BindBufferMemoryInfo( VULKAN_HPP_NAMESPACE::Buffer       buffer_       = {},\n                                               VULKAN_HPP_NAMESPACE::DeviceMemory memory_       = {},\n                                               VULKAN_HPP_NAMESPACE::DeviceSize   memoryOffset_ = {},\n                                               const void *                       pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , buffer{ buffer_ }\n      , memory{ memory_ }\n      , memoryOffset{ memoryOffset_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BindBufferMemoryInfo( BindBufferMemoryInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BindBufferMemoryInfo( VkBindBufferMemoryInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BindBufferMemoryInfo( *reinterpret_cast<BindBufferMemoryInfo const *>( &rhs ) )\n    {\n    }\n\n    BindBufferMemoryInfo & operator=( BindBufferMemoryInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BindBufferMemoryInfo & operator=( VkBindBufferMemoryInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BindBufferMemoryInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindBufferMemoryInfo & setBuffer( VULKAN_HPP_NAMESPACE::Buffer buffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      buffer = buffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindBufferMemoryInfo & setMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memory = memory_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindBufferMemoryInfo & setMemoryOffset( VULKAN_HPP_NAMESPACE::DeviceSize memoryOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memoryOffset = memoryOffset_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBindBufferMemoryInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBindBufferMemoryInfo *>( this );\n    }\n\n    operator VkBindBufferMemoryInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBindBufferMemoryInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Buffer const &,\n               VULKAN_HPP_NAMESPACE::DeviceMemory const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, buffer, memory, memoryOffset );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BindBufferMemoryInfo const & ) const = default;\n#else\n    bool operator==( BindBufferMemoryInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( buffer == rhs.buffer ) && ( memory == rhs.memory ) && ( memoryOffset == rhs.memoryOffset );\n#  endif\n    }\n\n    bool operator!=( BindBufferMemoryInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType        = StructureType::eBindBufferMemoryInfo;\n    const void *                        pNext        = {};\n    VULKAN_HPP_NAMESPACE::Buffer        buffer       = {};\n    VULKAN_HPP_NAMESPACE::DeviceMemory  memory       = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    memoryOffset = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBindBufferMemoryInfo>\n  {\n    using Type = BindBufferMemoryInfo;\n  };\n\n  using BindBufferMemoryInfoKHR = BindBufferMemoryInfo;\n\n  struct BindDescriptorBufferEmbeddedSamplersInfoEXT\n  {\n    using NativeType = VkBindDescriptorBufferEmbeddedSamplersInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBindDescriptorBufferEmbeddedSamplersInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BindDescriptorBufferEmbeddedSamplersInfoEXT( VULKAN_HPP_NAMESPACE::ShaderStageFlags stageFlags_ = {},\n                                                                      VULKAN_HPP_NAMESPACE::PipelineLayout   layout_     = {},\n                                                                      uint32_t                               set_        = {},\n                                                                      const void *                           pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stageFlags{ stageFlags_ }\n      , layout{ layout_ }\n      , set{ set_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BindDescriptorBufferEmbeddedSamplersInfoEXT( BindDescriptorBufferEmbeddedSamplersInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BindDescriptorBufferEmbeddedSamplersInfoEXT( VkBindDescriptorBufferEmbeddedSamplersInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BindDescriptorBufferEmbeddedSamplersInfoEXT( *reinterpret_cast<BindDescriptorBufferEmbeddedSamplersInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    BindDescriptorBufferEmbeddedSamplersInfoEXT & operator=( BindDescriptorBufferEmbeddedSamplersInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BindDescriptorBufferEmbeddedSamplersInfoEXT & operator=( VkBindDescriptorBufferEmbeddedSamplersInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BindDescriptorBufferEmbeddedSamplersInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BindDescriptorBufferEmbeddedSamplersInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindDescriptorBufferEmbeddedSamplersInfoEXT &\n      setStageFlags( VULKAN_HPP_NAMESPACE::ShaderStageFlags stageFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stageFlags = stageFlags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindDescriptorBufferEmbeddedSamplersInfoEXT & setLayout( VULKAN_HPP_NAMESPACE::PipelineLayout layout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layout = layout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindDescriptorBufferEmbeddedSamplersInfoEXT & setSet( uint32_t set_ ) VULKAN_HPP_NOEXCEPT\n    {\n      set = set_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBindDescriptorBufferEmbeddedSamplersInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBindDescriptorBufferEmbeddedSamplersInfoEXT *>( this );\n    }\n\n    operator VkBindDescriptorBufferEmbeddedSamplersInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBindDescriptorBufferEmbeddedSamplersInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ShaderStageFlags const &,\n               VULKAN_HPP_NAMESPACE::PipelineLayout const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stageFlags, layout, set );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BindDescriptorBufferEmbeddedSamplersInfoEXT const & ) const = default;\n#else\n    bool operator==( BindDescriptorBufferEmbeddedSamplersInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( stageFlags == rhs.stageFlags ) && ( layout == rhs.layout ) && ( set == rhs.set );\n#  endif\n    }\n\n    bool operator!=( BindDescriptorBufferEmbeddedSamplersInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType      = StructureType::eBindDescriptorBufferEmbeddedSamplersInfoEXT;\n    const void *                           pNext      = {};\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags stageFlags = {};\n    VULKAN_HPP_NAMESPACE::PipelineLayout   layout     = {};\n    uint32_t                               set        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBindDescriptorBufferEmbeddedSamplersInfoEXT>\n  {\n    using Type = BindDescriptorBufferEmbeddedSamplersInfoEXT;\n  };\n\n  struct BindDescriptorSetsInfo\n  {\n    using NativeType = VkBindDescriptorSetsInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBindDescriptorSetsInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BindDescriptorSetsInfo( VULKAN_HPP_NAMESPACE::ShaderStageFlags      stageFlags_         = {},\n                                                 VULKAN_HPP_NAMESPACE::PipelineLayout        layout_             = {},\n                                                 uint32_t                                    firstSet_           = {},\n                                                 uint32_t                                    descriptorSetCount_ = {},\n                                                 const VULKAN_HPP_NAMESPACE::DescriptorSet * pDescriptorSets_    = {},\n                                                 uint32_t                                    dynamicOffsetCount_ = {},\n                                                 const uint32_t *                            pDynamicOffsets_    = {},\n                                                 const void *                                pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stageFlags{ stageFlags_ }\n      , layout{ layout_ }\n      , firstSet{ firstSet_ }\n      , descriptorSetCount{ descriptorSetCount_ }\n      , pDescriptorSets{ pDescriptorSets_ }\n      , dynamicOffsetCount{ dynamicOffsetCount_ }\n      , pDynamicOffsets{ pDynamicOffsets_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BindDescriptorSetsInfo( BindDescriptorSetsInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BindDescriptorSetsInfo( VkBindDescriptorSetsInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BindDescriptorSetsInfo( *reinterpret_cast<BindDescriptorSetsInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    BindDescriptorSetsInfo( VULKAN_HPP_NAMESPACE::ShaderStageFlags                                                           stageFlags_,\n                            VULKAN_HPP_NAMESPACE::PipelineLayout                                                             layout_,\n                            uint32_t                                                                                         firstSet_,\n                            VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorSet> const & descriptorSets_,\n                            VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const &                            dynamicOffsets_ = {},\n                            const void *                                                                                     pNext_          = nullptr )\n      : pNext( pNext_ )\n      , stageFlags( stageFlags_ )\n      , layout( layout_ )\n      , firstSet( firstSet_ )\n      , descriptorSetCount( static_cast<uint32_t>( descriptorSets_.size() ) )\n      , pDescriptorSets( descriptorSets_.data() )\n      , dynamicOffsetCount( static_cast<uint32_t>( dynamicOffsets_.size() ) )\n      , pDynamicOffsets( dynamicOffsets_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    BindDescriptorSetsInfo & operator=( BindDescriptorSetsInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BindDescriptorSetsInfo & operator=( VkBindDescriptorSetsInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BindDescriptorSetsInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BindDescriptorSetsInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindDescriptorSetsInfo & setStageFlags( VULKAN_HPP_NAMESPACE::ShaderStageFlags stageFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stageFlags = stageFlags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindDescriptorSetsInfo & setLayout( VULKAN_HPP_NAMESPACE::PipelineLayout layout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layout = layout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindDescriptorSetsInfo & setFirstSet( uint32_t firstSet_ ) VULKAN_HPP_NOEXCEPT\n    {\n      firstSet = firstSet_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindDescriptorSetsInfo & setDescriptorSetCount( uint32_t descriptorSetCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorSetCount = descriptorSetCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindDescriptorSetsInfo & setPDescriptorSets( const VULKAN_HPP_NAMESPACE::DescriptorSet * pDescriptorSets_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDescriptorSets = pDescriptorSets_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    BindDescriptorSetsInfo &\n      setDescriptorSets( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorSet> const & descriptorSets_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorSetCount = static_cast<uint32_t>( descriptorSets_.size() );\n      pDescriptorSets    = descriptorSets_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 BindDescriptorSetsInfo & setDynamicOffsetCount( uint32_t dynamicOffsetCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dynamicOffsetCount = dynamicOffsetCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindDescriptorSetsInfo & setPDynamicOffsets( const uint32_t * pDynamicOffsets_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDynamicOffsets = pDynamicOffsets_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    BindDescriptorSetsInfo & setDynamicOffsets( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & dynamicOffsets_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dynamicOffsetCount = static_cast<uint32_t>( dynamicOffsets_.size() );\n      pDynamicOffsets    = dynamicOffsets_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBindDescriptorSetsInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBindDescriptorSetsInfo *>( this );\n    }\n\n    operator VkBindDescriptorSetsInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBindDescriptorSetsInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ShaderStageFlags const &,\n               VULKAN_HPP_NAMESPACE::PipelineLayout const &,\n               uint32_t const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::DescriptorSet * const &,\n               uint32_t const &,\n               const uint32_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stageFlags, layout, firstSet, descriptorSetCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BindDescriptorSetsInfo const & ) const = default;\n#else\n    bool operator==( BindDescriptorSetsInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( stageFlags == rhs.stageFlags ) && ( layout == rhs.layout ) && ( firstSet == rhs.firstSet ) &&\n             ( descriptorSetCount == rhs.descriptorSetCount ) && ( pDescriptorSets == rhs.pDescriptorSets ) &&\n             ( dynamicOffsetCount == rhs.dynamicOffsetCount ) && ( pDynamicOffsets == rhs.pDynamicOffsets );\n#  endif\n    }\n\n    bool operator!=( BindDescriptorSetsInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType         sType              = StructureType::eBindDescriptorSetsInfo;\n    const void *                                pNext              = {};\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags      stageFlags         = {};\n    VULKAN_HPP_NAMESPACE::PipelineLayout        layout             = {};\n    uint32_t                                    firstSet           = {};\n    uint32_t                                    descriptorSetCount = {};\n    const VULKAN_HPP_NAMESPACE::DescriptorSet * pDescriptorSets    = {};\n    uint32_t                                    dynamicOffsetCount = {};\n    const uint32_t *                            pDynamicOffsets    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBindDescriptorSetsInfo>\n  {\n    using Type = BindDescriptorSetsInfo;\n  };\n\n  using BindDescriptorSetsInfoKHR = BindDescriptorSetsInfo;\n\n  struct Offset2D\n  {\n    using NativeType = VkOffset2D;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR Offset2D( int32_t x_ = {}, int32_t y_ = {} ) VULKAN_HPP_NOEXCEPT\n      : x{ x_ }\n      , y{ y_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR Offset2D( Offset2D const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    Offset2D( VkOffset2D const & rhs ) VULKAN_HPP_NOEXCEPT : Offset2D( *reinterpret_cast<Offset2D const *>( &rhs ) ) {}\n\n    Offset2D & operator=( Offset2D const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    Offset2D & operator=( VkOffset2D const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::Offset2D const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 Offset2D & setX( int32_t x_ ) VULKAN_HPP_NOEXCEPT\n    {\n      x = x_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 Offset2D & setY( int32_t y_ ) VULKAN_HPP_NOEXCEPT\n    {\n      y = y_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkOffset2D const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkOffset2D *>( this );\n    }\n\n    operator VkOffset2D &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkOffset2D *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<int32_t const &, int32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( x, y );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( Offset2D const & ) const = default;\n#else\n    bool operator==( Offset2D const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( x == rhs.x ) && ( y == rhs.y );\n#  endif\n    }\n\n    bool operator!=( Offset2D const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    int32_t x = {};\n    int32_t y = {};\n  };\n\n  struct Rect2D\n  {\n    using NativeType = VkRect2D;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR Rect2D( VULKAN_HPP_NAMESPACE::Offset2D offset_ = {}, VULKAN_HPP_NAMESPACE::Extent2D extent_ = {} ) VULKAN_HPP_NOEXCEPT\n      : offset{ offset_ }\n      , extent{ extent_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR Rect2D( Rect2D const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    Rect2D( VkRect2D const & rhs ) VULKAN_HPP_NOEXCEPT : Rect2D( *reinterpret_cast<Rect2D const *>( &rhs ) ) {}\n\n    Rect2D & operator=( Rect2D const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    Rect2D & operator=( VkRect2D const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::Rect2D const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 Rect2D & setOffset( VULKAN_HPP_NAMESPACE::Offset2D const & offset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      offset = offset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 Rect2D & setExtent( VULKAN_HPP_NAMESPACE::Extent2D const & extent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extent = extent_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRect2D const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRect2D *>( this );\n    }\n\n    operator VkRect2D &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRect2D *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::Offset2D const &, VULKAN_HPP_NAMESPACE::Extent2D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( offset, extent );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( Rect2D const & ) const = default;\n#else\n    bool operator==( Rect2D const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( offset == rhs.offset ) && ( extent == rhs.extent );\n#  endif\n    }\n\n    bool operator!=( Rect2D const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::Offset2D offset = {};\n    VULKAN_HPP_NAMESPACE::Extent2D extent = {};\n  };\n\n  struct BindImageMemoryDeviceGroupInfo\n  {\n    using NativeType = VkBindImageMemoryDeviceGroupInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBindImageMemoryDeviceGroupInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BindImageMemoryDeviceGroupInfo( uint32_t                             deviceIndexCount_             = {},\n                                                         const uint32_t *                     pDeviceIndices_               = {},\n                                                         uint32_t                             splitInstanceBindRegionCount_ = {},\n                                                         const VULKAN_HPP_NAMESPACE::Rect2D * pSplitInstanceBindRegions_    = {},\n                                                         const void *                         pNext_                        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , deviceIndexCount{ deviceIndexCount_ }\n      , pDeviceIndices{ pDeviceIndices_ }\n      , splitInstanceBindRegionCount{ splitInstanceBindRegionCount_ }\n      , pSplitInstanceBindRegions{ pSplitInstanceBindRegions_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BindImageMemoryDeviceGroupInfo( BindImageMemoryDeviceGroupInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BindImageMemoryDeviceGroupInfo( VkBindImageMemoryDeviceGroupInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BindImageMemoryDeviceGroupInfo( *reinterpret_cast<BindImageMemoryDeviceGroupInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    BindImageMemoryDeviceGroupInfo( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const &                     deviceIndices_,\n                                    VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Rect2D> const & splitInstanceBindRegions_ = {},\n                                    const void *                                                                              pNext_ = nullptr )\n      : pNext( pNext_ )\n      , deviceIndexCount( static_cast<uint32_t>( deviceIndices_.size() ) )\n      , pDeviceIndices( deviceIndices_.data() )\n      , splitInstanceBindRegionCount( static_cast<uint32_t>( splitInstanceBindRegions_.size() ) )\n      , pSplitInstanceBindRegions( splitInstanceBindRegions_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    BindImageMemoryDeviceGroupInfo & operator=( BindImageMemoryDeviceGroupInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BindImageMemoryDeviceGroupInfo & operator=( VkBindImageMemoryDeviceGroupInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BindImageMemoryDeviceGroupInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BindImageMemoryDeviceGroupInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindImageMemoryDeviceGroupInfo & setDeviceIndexCount( uint32_t deviceIndexCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceIndexCount = deviceIndexCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindImageMemoryDeviceGroupInfo & setPDeviceIndices( const uint32_t * pDeviceIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDeviceIndices = pDeviceIndices_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    BindImageMemoryDeviceGroupInfo &\n      setDeviceIndices( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & deviceIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceIndexCount = static_cast<uint32_t>( deviceIndices_.size() );\n      pDeviceIndices   = deviceIndices_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 BindImageMemoryDeviceGroupInfo & setSplitInstanceBindRegionCount( uint32_t splitInstanceBindRegionCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      splitInstanceBindRegionCount = splitInstanceBindRegionCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindImageMemoryDeviceGroupInfo &\n      setPSplitInstanceBindRegions( const VULKAN_HPP_NAMESPACE::Rect2D * pSplitInstanceBindRegions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSplitInstanceBindRegions = pSplitInstanceBindRegions_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    BindImageMemoryDeviceGroupInfo & setSplitInstanceBindRegions(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Rect2D> const & splitInstanceBindRegions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      splitInstanceBindRegionCount = static_cast<uint32_t>( splitInstanceBindRegions_.size() );\n      pSplitInstanceBindRegions    = splitInstanceBindRegions_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBindImageMemoryDeviceGroupInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBindImageMemoryDeviceGroupInfo *>( this );\n    }\n\n    operator VkBindImageMemoryDeviceGroupInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBindImageMemoryDeviceGroupInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const uint32_t * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::Rect2D * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, deviceIndexCount, pDeviceIndices, splitInstanceBindRegionCount, pSplitInstanceBindRegions );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BindImageMemoryDeviceGroupInfo const & ) const = default;\n#else\n    bool operator==( BindImageMemoryDeviceGroupInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( deviceIndexCount == rhs.deviceIndexCount ) && ( pDeviceIndices == rhs.pDeviceIndices ) &&\n             ( splitInstanceBindRegionCount == rhs.splitInstanceBindRegionCount ) && ( pSplitInstanceBindRegions == rhs.pSplitInstanceBindRegions );\n#  endif\n    }\n\n    bool operator!=( BindImageMemoryDeviceGroupInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType  sType                        = StructureType::eBindImageMemoryDeviceGroupInfo;\n    const void *                         pNext                        = {};\n    uint32_t                             deviceIndexCount             = {};\n    const uint32_t *                     pDeviceIndices               = {};\n    uint32_t                             splitInstanceBindRegionCount = {};\n    const VULKAN_HPP_NAMESPACE::Rect2D * pSplitInstanceBindRegions    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBindImageMemoryDeviceGroupInfo>\n  {\n    using Type = BindImageMemoryDeviceGroupInfo;\n  };\n\n  using BindImageMemoryDeviceGroupInfoKHR = BindImageMemoryDeviceGroupInfo;\n\n  struct BindImageMemoryInfo\n  {\n    using NativeType = VkBindImageMemoryInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBindImageMemoryInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BindImageMemoryInfo( VULKAN_HPP_NAMESPACE::Image        image_        = {},\n                                              VULKAN_HPP_NAMESPACE::DeviceMemory memory_       = {},\n                                              VULKAN_HPP_NAMESPACE::DeviceSize   memoryOffset_ = {},\n                                              const void *                       pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , image{ image_ }\n      , memory{ memory_ }\n      , memoryOffset{ memoryOffset_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BindImageMemoryInfo( BindImageMemoryInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BindImageMemoryInfo( VkBindImageMemoryInfo const & rhs ) VULKAN_HPP_NOEXCEPT : BindImageMemoryInfo( *reinterpret_cast<BindImageMemoryInfo const *>( &rhs ) )\n    {\n    }\n\n    BindImageMemoryInfo & operator=( BindImageMemoryInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BindImageMemoryInfo & operator=( VkBindImageMemoryInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BindImageMemoryInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BindImageMemoryInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindImageMemoryInfo & setImage( VULKAN_HPP_NAMESPACE::Image image_ ) VULKAN_HPP_NOEXCEPT\n    {\n      image = image_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindImageMemoryInfo & setMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memory = memory_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindImageMemoryInfo & setMemoryOffset( VULKAN_HPP_NAMESPACE::DeviceSize memoryOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memoryOffset = memoryOffset_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBindImageMemoryInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBindImageMemoryInfo *>( this );\n    }\n\n    operator VkBindImageMemoryInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBindImageMemoryInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Image const &,\n               VULKAN_HPP_NAMESPACE::DeviceMemory const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, image, memory, memoryOffset );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BindImageMemoryInfo const & ) const = default;\n#else\n    bool operator==( BindImageMemoryInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( image == rhs.image ) && ( memory == rhs.memory ) && ( memoryOffset == rhs.memoryOffset );\n#  endif\n    }\n\n    bool operator!=( BindImageMemoryInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType        = StructureType::eBindImageMemoryInfo;\n    const void *                        pNext        = {};\n    VULKAN_HPP_NAMESPACE::Image         image        = {};\n    VULKAN_HPP_NAMESPACE::DeviceMemory  memory       = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    memoryOffset = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBindImageMemoryInfo>\n  {\n    using Type = BindImageMemoryInfo;\n  };\n\n  using BindImageMemoryInfoKHR = BindImageMemoryInfo;\n\n  struct BindImageMemorySwapchainInfoKHR\n  {\n    using NativeType = VkBindImageMemorySwapchainInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBindImageMemorySwapchainInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BindImageMemorySwapchainInfoKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain_  = {},\n                                                          uint32_t                           imageIndex_ = {},\n                                                          const void *                       pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , swapchain{ swapchain_ }\n      , imageIndex{ imageIndex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BindImageMemorySwapchainInfoKHR( BindImageMemorySwapchainInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BindImageMemorySwapchainInfoKHR( VkBindImageMemorySwapchainInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BindImageMemorySwapchainInfoKHR( *reinterpret_cast<BindImageMemorySwapchainInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    BindImageMemorySwapchainInfoKHR & operator=( BindImageMemorySwapchainInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BindImageMemorySwapchainInfoKHR & operator=( VkBindImageMemorySwapchainInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BindImageMemorySwapchainInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BindImageMemorySwapchainInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindImageMemorySwapchainInfoKHR & setSwapchain( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain_ ) VULKAN_HPP_NOEXCEPT\n    {\n      swapchain = swapchain_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindImageMemorySwapchainInfoKHR & setImageIndex( uint32_t imageIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageIndex = imageIndex_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBindImageMemorySwapchainInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBindImageMemorySwapchainInfoKHR *>( this );\n    }\n\n    operator VkBindImageMemorySwapchainInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBindImageMemorySwapchainInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::SwapchainKHR const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, swapchain, imageIndex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BindImageMemorySwapchainInfoKHR const & ) const = default;\n#else\n    bool operator==( BindImageMemorySwapchainInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( swapchain == rhs.swapchain ) && ( imageIndex == rhs.imageIndex );\n#  endif\n    }\n\n    bool operator!=( BindImageMemorySwapchainInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType      = StructureType::eBindImageMemorySwapchainInfoKHR;\n    const void *                        pNext      = {};\n    VULKAN_HPP_NAMESPACE::SwapchainKHR  swapchain  = {};\n    uint32_t                            imageIndex = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBindImageMemorySwapchainInfoKHR>\n  {\n    using Type = BindImageMemorySwapchainInfoKHR;\n  };\n\n  struct BindImagePlaneMemoryInfo\n  {\n    using NativeType = VkBindImagePlaneMemoryInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBindImagePlaneMemoryInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BindImagePlaneMemoryInfo( VULKAN_HPP_NAMESPACE::ImageAspectFlagBits planeAspect_ = VULKAN_HPP_NAMESPACE::ImageAspectFlagBits::eColor,\n                                                   const void *                              pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , planeAspect{ planeAspect_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BindImagePlaneMemoryInfo( BindImagePlaneMemoryInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BindImagePlaneMemoryInfo( VkBindImagePlaneMemoryInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BindImagePlaneMemoryInfo( *reinterpret_cast<BindImagePlaneMemoryInfo const *>( &rhs ) )\n    {\n    }\n\n    BindImagePlaneMemoryInfo & operator=( BindImagePlaneMemoryInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BindImagePlaneMemoryInfo & operator=( VkBindImagePlaneMemoryInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BindImagePlaneMemoryInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BindImagePlaneMemoryInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindImagePlaneMemoryInfo & setPlaneAspect( VULKAN_HPP_NAMESPACE::ImageAspectFlagBits planeAspect_ ) VULKAN_HPP_NOEXCEPT\n    {\n      planeAspect = planeAspect_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBindImagePlaneMemoryInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBindImagePlaneMemoryInfo *>( this );\n    }\n\n    operator VkBindImagePlaneMemoryInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBindImagePlaneMemoryInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ImageAspectFlagBits const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, planeAspect );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BindImagePlaneMemoryInfo const & ) const = default;\n#else\n    bool operator==( BindImagePlaneMemoryInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( planeAspect == rhs.planeAspect );\n#  endif\n    }\n\n    bool operator!=( BindImagePlaneMemoryInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType       = StructureType::eBindImagePlaneMemoryInfo;\n    const void *                              pNext       = {};\n    VULKAN_HPP_NAMESPACE::ImageAspectFlagBits planeAspect = VULKAN_HPP_NAMESPACE::ImageAspectFlagBits::eColor;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBindImagePlaneMemoryInfo>\n  {\n    using Type = BindImagePlaneMemoryInfo;\n  };\n\n  using BindImagePlaneMemoryInfoKHR = BindImagePlaneMemoryInfo;\n\n  struct BindIndexBufferIndirectCommandEXT\n  {\n    using NativeType = VkBindIndexBufferIndirectCommandEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      BindIndexBufferIndirectCommandEXT( VULKAN_HPP_NAMESPACE::DeviceAddress bufferAddress_ = {},\n                                         uint32_t                            size_          = {},\n                                         VULKAN_HPP_NAMESPACE::IndexType     indexType_     = VULKAN_HPP_NAMESPACE::IndexType::eUint16 ) VULKAN_HPP_NOEXCEPT\n      : bufferAddress{ bufferAddress_ }\n      , size{ size_ }\n      , indexType{ indexType_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BindIndexBufferIndirectCommandEXT( BindIndexBufferIndirectCommandEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BindIndexBufferIndirectCommandEXT( VkBindIndexBufferIndirectCommandEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BindIndexBufferIndirectCommandEXT( *reinterpret_cast<BindIndexBufferIndirectCommandEXT const *>( &rhs ) )\n    {\n    }\n\n    BindIndexBufferIndirectCommandEXT & operator=( BindIndexBufferIndirectCommandEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BindIndexBufferIndirectCommandEXT & operator=( VkBindIndexBufferIndirectCommandEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BindIndexBufferIndirectCommandEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BindIndexBufferIndirectCommandEXT & setBufferAddress( VULKAN_HPP_NAMESPACE::DeviceAddress bufferAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferAddress = bufferAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindIndexBufferIndirectCommandEXT & setSize( uint32_t size_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size = size_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindIndexBufferIndirectCommandEXT & setIndexType( VULKAN_HPP_NAMESPACE::IndexType indexType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexType = indexType_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBindIndexBufferIndirectCommandEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBindIndexBufferIndirectCommandEXT *>( this );\n    }\n\n    operator VkBindIndexBufferIndirectCommandEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBindIndexBufferIndirectCommandEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DeviceAddress const &, uint32_t const &, VULKAN_HPP_NAMESPACE::IndexType const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( bufferAddress, size, indexType );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BindIndexBufferIndirectCommandEXT const & ) const = default;\n#else\n    bool operator==( BindIndexBufferIndirectCommandEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( bufferAddress == rhs.bufferAddress ) && ( size == rhs.size ) && ( indexType == rhs.indexType );\n#  endif\n    }\n\n    bool operator!=( BindIndexBufferIndirectCommandEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DeviceAddress bufferAddress = {};\n    uint32_t                            size          = {};\n    VULKAN_HPP_NAMESPACE::IndexType     indexType     = VULKAN_HPP_NAMESPACE::IndexType::eUint16;\n  };\n\n  struct BindIndexBufferIndirectCommandNV\n  {\n    using NativeType = VkBindIndexBufferIndirectCommandNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      BindIndexBufferIndirectCommandNV( VULKAN_HPP_NAMESPACE::DeviceAddress bufferAddress_ = {},\n                                        uint32_t                            size_          = {},\n                                        VULKAN_HPP_NAMESPACE::IndexType     indexType_     = VULKAN_HPP_NAMESPACE::IndexType::eUint16 ) VULKAN_HPP_NOEXCEPT\n      : bufferAddress{ bufferAddress_ }\n      , size{ size_ }\n      , indexType{ indexType_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BindIndexBufferIndirectCommandNV( BindIndexBufferIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BindIndexBufferIndirectCommandNV( VkBindIndexBufferIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BindIndexBufferIndirectCommandNV( *reinterpret_cast<BindIndexBufferIndirectCommandNV const *>( &rhs ) )\n    {\n    }\n\n    BindIndexBufferIndirectCommandNV & operator=( BindIndexBufferIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BindIndexBufferIndirectCommandNV & operator=( VkBindIndexBufferIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BindIndexBufferIndirectCommandNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BindIndexBufferIndirectCommandNV & setBufferAddress( VULKAN_HPP_NAMESPACE::DeviceAddress bufferAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferAddress = bufferAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindIndexBufferIndirectCommandNV & setSize( uint32_t size_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size = size_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindIndexBufferIndirectCommandNV & setIndexType( VULKAN_HPP_NAMESPACE::IndexType indexType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexType = indexType_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBindIndexBufferIndirectCommandNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBindIndexBufferIndirectCommandNV *>( this );\n    }\n\n    operator VkBindIndexBufferIndirectCommandNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBindIndexBufferIndirectCommandNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DeviceAddress const &, uint32_t const &, VULKAN_HPP_NAMESPACE::IndexType const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( bufferAddress, size, indexType );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BindIndexBufferIndirectCommandNV const & ) const = default;\n#else\n    bool operator==( BindIndexBufferIndirectCommandNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( bufferAddress == rhs.bufferAddress ) && ( size == rhs.size ) && ( indexType == rhs.indexType );\n#  endif\n    }\n\n    bool operator!=( BindIndexBufferIndirectCommandNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DeviceAddress bufferAddress = {};\n    uint32_t                            size          = {};\n    VULKAN_HPP_NAMESPACE::IndexType     indexType     = VULKAN_HPP_NAMESPACE::IndexType::eUint16;\n  };\n\n  struct BindMemoryStatus\n  {\n    using NativeType = VkBindMemoryStatus;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBindMemoryStatus;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BindMemoryStatus( VULKAN_HPP_NAMESPACE::Result * pResult_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pResult{ pResult_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BindMemoryStatus( BindMemoryStatus const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BindMemoryStatus( VkBindMemoryStatus const & rhs ) VULKAN_HPP_NOEXCEPT : BindMemoryStatus( *reinterpret_cast<BindMemoryStatus const *>( &rhs ) ) {}\n\n    BindMemoryStatus & operator=( BindMemoryStatus const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BindMemoryStatus & operator=( VkBindMemoryStatus const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BindMemoryStatus const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BindMemoryStatus & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindMemoryStatus & setPResult( VULKAN_HPP_NAMESPACE::Result * pResult_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pResult = pResult_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBindMemoryStatus const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBindMemoryStatus *>( this );\n    }\n\n    operator VkBindMemoryStatus &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBindMemoryStatus *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Result * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pResult );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BindMemoryStatus const & ) const = default;\n#else\n    bool operator==( BindMemoryStatus const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pResult == rhs.pResult );\n#  endif\n    }\n\n    bool operator!=( BindMemoryStatus const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType   = StructureType::eBindMemoryStatus;\n    const void *                        pNext   = {};\n    VULKAN_HPP_NAMESPACE::Result *      pResult = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBindMemoryStatus>\n  {\n    using Type = BindMemoryStatus;\n  };\n\n  using BindMemoryStatusKHR = BindMemoryStatus;\n\n  struct BindPipelineIndirectCommandNV\n  {\n    using NativeType = VkBindPipelineIndirectCommandNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BindPipelineIndirectCommandNV( VULKAN_HPP_NAMESPACE::DeviceAddress pipelineAddress_ = {} ) VULKAN_HPP_NOEXCEPT\n      : pipelineAddress{ pipelineAddress_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BindPipelineIndirectCommandNV( BindPipelineIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BindPipelineIndirectCommandNV( VkBindPipelineIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BindPipelineIndirectCommandNV( *reinterpret_cast<BindPipelineIndirectCommandNV const *>( &rhs ) )\n    {\n    }\n\n    BindPipelineIndirectCommandNV & operator=( BindPipelineIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BindPipelineIndirectCommandNV & operator=( VkBindPipelineIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BindPipelineIndirectCommandNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BindPipelineIndirectCommandNV & setPipelineAddress( VULKAN_HPP_NAMESPACE::DeviceAddress pipelineAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineAddress = pipelineAddress_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBindPipelineIndirectCommandNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBindPipelineIndirectCommandNV *>( this );\n    }\n\n    operator VkBindPipelineIndirectCommandNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBindPipelineIndirectCommandNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DeviceAddress const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( pipelineAddress );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BindPipelineIndirectCommandNV const & ) const = default;\n#else\n    bool operator==( BindPipelineIndirectCommandNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( pipelineAddress == rhs.pipelineAddress );\n#  endif\n    }\n\n    bool operator!=( BindPipelineIndirectCommandNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DeviceAddress pipelineAddress = {};\n  };\n\n  struct BindShaderGroupIndirectCommandNV\n  {\n    using NativeType = VkBindShaderGroupIndirectCommandNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BindShaderGroupIndirectCommandNV( uint32_t groupIndex_ = {} ) VULKAN_HPP_NOEXCEPT : groupIndex{ groupIndex_ } {}\n\n    VULKAN_HPP_CONSTEXPR BindShaderGroupIndirectCommandNV( BindShaderGroupIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BindShaderGroupIndirectCommandNV( VkBindShaderGroupIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BindShaderGroupIndirectCommandNV( *reinterpret_cast<BindShaderGroupIndirectCommandNV const *>( &rhs ) )\n    {\n    }\n\n    BindShaderGroupIndirectCommandNV & operator=( BindShaderGroupIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BindShaderGroupIndirectCommandNV & operator=( VkBindShaderGroupIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BindShaderGroupIndirectCommandNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BindShaderGroupIndirectCommandNV & setGroupIndex( uint32_t groupIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      groupIndex = groupIndex_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBindShaderGroupIndirectCommandNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBindShaderGroupIndirectCommandNV *>( this );\n    }\n\n    operator VkBindShaderGroupIndirectCommandNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBindShaderGroupIndirectCommandNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( groupIndex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BindShaderGroupIndirectCommandNV const & ) const = default;\n#else\n    bool operator==( BindShaderGroupIndirectCommandNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( groupIndex == rhs.groupIndex );\n#  endif\n    }\n\n    bool operator!=( BindShaderGroupIndirectCommandNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t groupIndex = {};\n  };\n\n  struct SparseMemoryBind\n  {\n    using NativeType = VkSparseMemoryBind;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SparseMemoryBind( VULKAN_HPP_NAMESPACE::DeviceSize            resourceOffset_ = {},\n                                           VULKAN_HPP_NAMESPACE::DeviceSize            size_           = {},\n                                           VULKAN_HPP_NAMESPACE::DeviceMemory          memory_         = {},\n                                           VULKAN_HPP_NAMESPACE::DeviceSize            memoryOffset_   = {},\n                                           VULKAN_HPP_NAMESPACE::SparseMemoryBindFlags flags_          = {} ) VULKAN_HPP_NOEXCEPT\n      : resourceOffset{ resourceOffset_ }\n      , size{ size_ }\n      , memory{ memory_ }\n      , memoryOffset{ memoryOffset_ }\n      , flags{ flags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SparseMemoryBind( SparseMemoryBind const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SparseMemoryBind( VkSparseMemoryBind const & rhs ) VULKAN_HPP_NOEXCEPT : SparseMemoryBind( *reinterpret_cast<SparseMemoryBind const *>( &rhs ) ) {}\n\n    SparseMemoryBind & operator=( SparseMemoryBind const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SparseMemoryBind & operator=( VkSparseMemoryBind const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SparseMemoryBind const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SparseMemoryBind & setResourceOffset( VULKAN_HPP_NAMESPACE::DeviceSize resourceOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      resourceOffset = resourceOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SparseMemoryBind & setSize( VULKAN_HPP_NAMESPACE::DeviceSize size_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size = size_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SparseMemoryBind & setMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memory = memory_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SparseMemoryBind & setMemoryOffset( VULKAN_HPP_NAMESPACE::DeviceSize memoryOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memoryOffset = memoryOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SparseMemoryBind & setFlags( VULKAN_HPP_NAMESPACE::SparseMemoryBindFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSparseMemoryBind const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSparseMemoryBind *>( this );\n    }\n\n    operator VkSparseMemoryBind &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSparseMemoryBind *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceMemory const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::SparseMemoryBindFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( resourceOffset, size, memory, memoryOffset, flags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SparseMemoryBind const & ) const = default;\n#else\n    bool operator==( SparseMemoryBind const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( resourceOffset == rhs.resourceOffset ) && ( size == rhs.size ) && ( memory == rhs.memory ) && ( memoryOffset == rhs.memoryOffset ) &&\n             ( flags == rhs.flags );\n#  endif\n    }\n\n    bool operator!=( SparseMemoryBind const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DeviceSize            resourceOffset = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize            size           = {};\n    VULKAN_HPP_NAMESPACE::DeviceMemory          memory         = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize            memoryOffset   = {};\n    VULKAN_HPP_NAMESPACE::SparseMemoryBindFlags flags          = {};\n  };\n\n  struct SparseBufferMemoryBindInfo\n  {\n    using NativeType = VkSparseBufferMemoryBindInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SparseBufferMemoryBindInfo( VULKAN_HPP_NAMESPACE::Buffer                   buffer_    = {},\n                                                     uint32_t                                       bindCount_ = {},\n                                                     const VULKAN_HPP_NAMESPACE::SparseMemoryBind * pBinds_    = {} ) VULKAN_HPP_NOEXCEPT\n      : buffer{ buffer_ }\n      , bindCount{ bindCount_ }\n      , pBinds{ pBinds_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SparseBufferMemoryBindInfo( SparseBufferMemoryBindInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SparseBufferMemoryBindInfo( VkSparseBufferMemoryBindInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SparseBufferMemoryBindInfo( *reinterpret_cast<SparseBufferMemoryBindInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SparseBufferMemoryBindInfo( VULKAN_HPP_NAMESPACE::Buffer                                                                        buffer_,\n                                VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SparseMemoryBind> const & binds_ )\n      : buffer( buffer_ ), bindCount( static_cast<uint32_t>( binds_.size() ) ), pBinds( binds_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    SparseBufferMemoryBindInfo & operator=( SparseBufferMemoryBindInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SparseBufferMemoryBindInfo & operator=( VkSparseBufferMemoryBindInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SparseBufferMemoryBindInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SparseBufferMemoryBindInfo & setBuffer( VULKAN_HPP_NAMESPACE::Buffer buffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      buffer = buffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SparseBufferMemoryBindInfo & setBindCount( uint32_t bindCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bindCount = bindCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SparseBufferMemoryBindInfo & setPBinds( const VULKAN_HPP_NAMESPACE::SparseMemoryBind * pBinds_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pBinds = pBinds_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SparseBufferMemoryBindInfo &\n      setBinds( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SparseMemoryBind> const & binds_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bindCount = static_cast<uint32_t>( binds_.size() );\n      pBinds    = binds_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSparseBufferMemoryBindInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSparseBufferMemoryBindInfo *>( this );\n    }\n\n    operator VkSparseBufferMemoryBindInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSparseBufferMemoryBindInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::Buffer const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::SparseMemoryBind * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( buffer, bindCount, pBinds );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SparseBufferMemoryBindInfo const & ) const = default;\n#else\n    bool operator==( SparseBufferMemoryBindInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( buffer == rhs.buffer ) && ( bindCount == rhs.bindCount ) && ( pBinds == rhs.pBinds );\n#  endif\n    }\n\n    bool operator!=( SparseBufferMemoryBindInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::Buffer                   buffer    = {};\n    uint32_t                                       bindCount = {};\n    const VULKAN_HPP_NAMESPACE::SparseMemoryBind * pBinds    = {};\n  };\n\n  struct SparseImageOpaqueMemoryBindInfo\n  {\n    using NativeType = VkSparseImageOpaqueMemoryBindInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SparseImageOpaqueMemoryBindInfo( VULKAN_HPP_NAMESPACE::Image                    image_     = {},\n                                                          uint32_t                                       bindCount_ = {},\n                                                          const VULKAN_HPP_NAMESPACE::SparseMemoryBind * pBinds_    = {} ) VULKAN_HPP_NOEXCEPT\n      : image{ image_ }\n      , bindCount{ bindCount_ }\n      , pBinds{ pBinds_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SparseImageOpaqueMemoryBindInfo( SparseImageOpaqueMemoryBindInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SparseImageOpaqueMemoryBindInfo( VkSparseImageOpaqueMemoryBindInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SparseImageOpaqueMemoryBindInfo( *reinterpret_cast<SparseImageOpaqueMemoryBindInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SparseImageOpaqueMemoryBindInfo( VULKAN_HPP_NAMESPACE::Image                                                                         image_,\n                                     VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SparseMemoryBind> const & binds_ )\n      : image( image_ ), bindCount( static_cast<uint32_t>( binds_.size() ) ), pBinds( binds_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    SparseImageOpaqueMemoryBindInfo & operator=( SparseImageOpaqueMemoryBindInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SparseImageOpaqueMemoryBindInfo & operator=( VkSparseImageOpaqueMemoryBindInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SparseImageOpaqueMemoryBindInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SparseImageOpaqueMemoryBindInfo & setImage( VULKAN_HPP_NAMESPACE::Image image_ ) VULKAN_HPP_NOEXCEPT\n    {\n      image = image_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SparseImageOpaqueMemoryBindInfo & setBindCount( uint32_t bindCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bindCount = bindCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SparseImageOpaqueMemoryBindInfo & setPBinds( const VULKAN_HPP_NAMESPACE::SparseMemoryBind * pBinds_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pBinds = pBinds_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SparseImageOpaqueMemoryBindInfo &\n      setBinds( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SparseMemoryBind> const & binds_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bindCount = static_cast<uint32_t>( binds_.size() );\n      pBinds    = binds_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSparseImageOpaqueMemoryBindInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSparseImageOpaqueMemoryBindInfo *>( this );\n    }\n\n    operator VkSparseImageOpaqueMemoryBindInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSparseImageOpaqueMemoryBindInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::Image const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::SparseMemoryBind * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( image, bindCount, pBinds );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SparseImageOpaqueMemoryBindInfo const & ) const = default;\n#else\n    bool operator==( SparseImageOpaqueMemoryBindInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( image == rhs.image ) && ( bindCount == rhs.bindCount ) && ( pBinds == rhs.pBinds );\n#  endif\n    }\n\n    bool operator!=( SparseImageOpaqueMemoryBindInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::Image                    image     = {};\n    uint32_t                                       bindCount = {};\n    const VULKAN_HPP_NAMESPACE::SparseMemoryBind * pBinds    = {};\n  };\n\n  struct ImageSubresource\n  {\n    using NativeType = VkImageSubresource;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      ImageSubresource( VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask_ = {}, uint32_t mipLevel_ = {}, uint32_t arrayLayer_ = {} ) VULKAN_HPP_NOEXCEPT\n      : aspectMask{ aspectMask_ }\n      , mipLevel{ mipLevel_ }\n      , arrayLayer{ arrayLayer_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageSubresource( ImageSubresource const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageSubresource( VkImageSubresource const & rhs ) VULKAN_HPP_NOEXCEPT : ImageSubresource( *reinterpret_cast<ImageSubresource const *>( &rhs ) ) {}\n\n    ImageSubresource & operator=( ImageSubresource const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageSubresource & operator=( VkImageSubresource const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageSubresource const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageSubresource & setAspectMask( VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      aspectMask = aspectMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageSubresource & setMipLevel( uint32_t mipLevel_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mipLevel = mipLevel_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageSubresource & setArrayLayer( uint32_t arrayLayer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      arrayLayer = arrayLayer_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageSubresource const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageSubresource *>( this );\n    }\n\n    operator VkImageSubresource &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageSubresource *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::ImageAspectFlags const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( aspectMask, mipLevel, arrayLayer );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageSubresource const & ) const = default;\n#else\n    bool operator==( ImageSubresource const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( aspectMask == rhs.aspectMask ) && ( mipLevel == rhs.mipLevel ) && ( arrayLayer == rhs.arrayLayer );\n#  endif\n    }\n\n    bool operator!=( ImageSubresource const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask = {};\n    uint32_t                               mipLevel   = {};\n    uint32_t                               arrayLayer = {};\n  };\n\n  struct Offset3D\n  {\n    using NativeType = VkOffset3D;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR Offset3D( int32_t x_ = {}, int32_t y_ = {}, int32_t z_ = {} ) VULKAN_HPP_NOEXCEPT\n      : x{ x_ }\n      , y{ y_ }\n      , z{ z_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR Offset3D( Offset3D const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    Offset3D( VkOffset3D const & rhs ) VULKAN_HPP_NOEXCEPT : Offset3D( *reinterpret_cast<Offset3D const *>( &rhs ) ) {}\n\n    explicit Offset3D( Offset2D const & offset2D, int32_t z_ = {} ) : x( offset2D.x ), y( offset2D.y ), z( z_ ) {}\n\n    Offset3D & operator=( Offset3D const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    Offset3D & operator=( VkOffset3D const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::Offset3D const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 Offset3D & setX( int32_t x_ ) VULKAN_HPP_NOEXCEPT\n    {\n      x = x_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 Offset3D & setY( int32_t y_ ) VULKAN_HPP_NOEXCEPT\n    {\n      y = y_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 Offset3D & setZ( int32_t z_ ) VULKAN_HPP_NOEXCEPT\n    {\n      z = z_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkOffset3D const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkOffset3D *>( this );\n    }\n\n    operator VkOffset3D &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkOffset3D *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<int32_t const &, int32_t const &, int32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( x, y, z );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( Offset3D const & ) const = default;\n#else\n    bool operator==( Offset3D const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( x == rhs.x ) && ( y == rhs.y ) && ( z == rhs.z );\n#  endif\n    }\n\n    bool operator!=( Offset3D const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    int32_t x = {};\n    int32_t y = {};\n    int32_t z = {};\n  };\n\n  struct Extent3D\n  {\n    using NativeType = VkExtent3D;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR Extent3D( uint32_t width_ = {}, uint32_t height_ = {}, uint32_t depth_ = {} ) VULKAN_HPP_NOEXCEPT\n      : width{ width_ }\n      , height{ height_ }\n      , depth{ depth_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR Extent3D( Extent3D const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    Extent3D( VkExtent3D const & rhs ) VULKAN_HPP_NOEXCEPT : Extent3D( *reinterpret_cast<Extent3D const *>( &rhs ) ) {}\n\n    explicit Extent3D( Extent2D const & extent2D, uint32_t depth_ = {} ) : width( extent2D.width ), height( extent2D.height ), depth( depth_ ) {}\n\n    Extent3D & operator=( Extent3D const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    Extent3D & operator=( VkExtent3D const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::Extent3D const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 Extent3D & setWidth( uint32_t width_ ) VULKAN_HPP_NOEXCEPT\n    {\n      width = width_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 Extent3D & setHeight( uint32_t height_ ) VULKAN_HPP_NOEXCEPT\n    {\n      height = height_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 Extent3D & setDepth( uint32_t depth_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depth = depth_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExtent3D const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExtent3D *>( this );\n    }\n\n    operator VkExtent3D &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExtent3D *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( width, height, depth );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( Extent3D const & ) const = default;\n#else\n    bool operator==( Extent3D const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( width == rhs.width ) && ( height == rhs.height ) && ( depth == rhs.depth );\n#  endif\n    }\n\n    bool operator!=( Extent3D const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t width  = {};\n    uint32_t height = {};\n    uint32_t depth  = {};\n  };\n\n  struct SparseImageMemoryBind\n  {\n    using NativeType = VkSparseImageMemoryBind;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SparseImageMemoryBind( VULKAN_HPP_NAMESPACE::ImageSubresource      subresource_  = {},\n                                                VULKAN_HPP_NAMESPACE::Offset3D              offset_       = {},\n                                                VULKAN_HPP_NAMESPACE::Extent3D              extent_       = {},\n                                                VULKAN_HPP_NAMESPACE::DeviceMemory          memory_       = {},\n                                                VULKAN_HPP_NAMESPACE::DeviceSize            memoryOffset_ = {},\n                                                VULKAN_HPP_NAMESPACE::SparseMemoryBindFlags flags_        = {} ) VULKAN_HPP_NOEXCEPT\n      : subresource{ subresource_ }\n      , offset{ offset_ }\n      , extent{ extent_ }\n      , memory{ memory_ }\n      , memoryOffset{ memoryOffset_ }\n      , flags{ flags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SparseImageMemoryBind( SparseImageMemoryBind const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SparseImageMemoryBind( VkSparseImageMemoryBind const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SparseImageMemoryBind( *reinterpret_cast<SparseImageMemoryBind const *>( &rhs ) )\n    {\n    }\n\n    SparseImageMemoryBind & operator=( SparseImageMemoryBind const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SparseImageMemoryBind & operator=( VkSparseImageMemoryBind const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SparseImageMemoryBind const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SparseImageMemoryBind & setSubresource( VULKAN_HPP_NAMESPACE::ImageSubresource const & subresource_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subresource = subresource_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SparseImageMemoryBind & setOffset( VULKAN_HPP_NAMESPACE::Offset3D const & offset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      offset = offset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SparseImageMemoryBind & setExtent( VULKAN_HPP_NAMESPACE::Extent3D const & extent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extent = extent_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SparseImageMemoryBind & setMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memory = memory_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SparseImageMemoryBind & setMemoryOffset( VULKAN_HPP_NAMESPACE::DeviceSize memoryOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memoryOffset = memoryOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SparseImageMemoryBind & setFlags( VULKAN_HPP_NAMESPACE::SparseMemoryBindFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSparseImageMemoryBind const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSparseImageMemoryBind *>( this );\n    }\n\n    operator VkSparseImageMemoryBind &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSparseImageMemoryBind *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::ImageSubresource const &,\n               VULKAN_HPP_NAMESPACE::Offset3D const &,\n               VULKAN_HPP_NAMESPACE::Extent3D const &,\n               VULKAN_HPP_NAMESPACE::DeviceMemory const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::SparseMemoryBindFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( subresource, offset, extent, memory, memoryOffset, flags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SparseImageMemoryBind const & ) const = default;\n#else\n    bool operator==( SparseImageMemoryBind const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( subresource == rhs.subresource ) && ( offset == rhs.offset ) && ( extent == rhs.extent ) && ( memory == rhs.memory ) &&\n             ( memoryOffset == rhs.memoryOffset ) && ( flags == rhs.flags );\n#  endif\n    }\n\n    bool operator!=( SparseImageMemoryBind const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::ImageSubresource      subresource  = {};\n    VULKAN_HPP_NAMESPACE::Offset3D              offset       = {};\n    VULKAN_HPP_NAMESPACE::Extent3D              extent       = {};\n    VULKAN_HPP_NAMESPACE::DeviceMemory          memory       = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize            memoryOffset = {};\n    VULKAN_HPP_NAMESPACE::SparseMemoryBindFlags flags        = {};\n  };\n\n  struct SparseImageMemoryBindInfo\n  {\n    using NativeType = VkSparseImageMemoryBindInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SparseImageMemoryBindInfo( VULKAN_HPP_NAMESPACE::Image                         image_     = {},\n                                                    uint32_t                                            bindCount_ = {},\n                                                    const VULKAN_HPP_NAMESPACE::SparseImageMemoryBind * pBinds_    = {} ) VULKAN_HPP_NOEXCEPT\n      : image{ image_ }\n      , bindCount{ bindCount_ }\n      , pBinds{ pBinds_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SparseImageMemoryBindInfo( SparseImageMemoryBindInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SparseImageMemoryBindInfo( VkSparseImageMemoryBindInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SparseImageMemoryBindInfo( *reinterpret_cast<SparseImageMemoryBindInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SparseImageMemoryBindInfo( VULKAN_HPP_NAMESPACE::Image                                                                              image_,\n                               VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SparseImageMemoryBind> const & binds_ )\n      : image( image_ ), bindCount( static_cast<uint32_t>( binds_.size() ) ), pBinds( binds_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    SparseImageMemoryBindInfo & operator=( SparseImageMemoryBindInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SparseImageMemoryBindInfo & operator=( VkSparseImageMemoryBindInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SparseImageMemoryBindInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SparseImageMemoryBindInfo & setImage( VULKAN_HPP_NAMESPACE::Image image_ ) VULKAN_HPP_NOEXCEPT\n    {\n      image = image_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SparseImageMemoryBindInfo & setBindCount( uint32_t bindCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bindCount = bindCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SparseImageMemoryBindInfo & setPBinds( const VULKAN_HPP_NAMESPACE::SparseImageMemoryBind * pBinds_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pBinds = pBinds_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SparseImageMemoryBindInfo &\n      setBinds( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SparseImageMemoryBind> const & binds_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bindCount = static_cast<uint32_t>( binds_.size() );\n      pBinds    = binds_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSparseImageMemoryBindInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSparseImageMemoryBindInfo *>( this );\n    }\n\n    operator VkSparseImageMemoryBindInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSparseImageMemoryBindInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::Image const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::SparseImageMemoryBind * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( image, bindCount, pBinds );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SparseImageMemoryBindInfo const & ) const = default;\n#else\n    bool operator==( SparseImageMemoryBindInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( image == rhs.image ) && ( bindCount == rhs.bindCount ) && ( pBinds == rhs.pBinds );\n#  endif\n    }\n\n    bool operator!=( SparseImageMemoryBindInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::Image                         image     = {};\n    uint32_t                                            bindCount = {};\n    const VULKAN_HPP_NAMESPACE::SparseImageMemoryBind * pBinds    = {};\n  };\n\n  struct BindSparseInfo\n  {\n    using NativeType = VkBindSparseInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBindSparseInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BindSparseInfo( uint32_t                                                      waitSemaphoreCount_   = {},\n                                         const VULKAN_HPP_NAMESPACE::Semaphore *                       pWaitSemaphores_      = {},\n                                         uint32_t                                                      bufferBindCount_      = {},\n                                         const VULKAN_HPP_NAMESPACE::SparseBufferMemoryBindInfo *      pBufferBinds_         = {},\n                                         uint32_t                                                      imageOpaqueBindCount_ = {},\n                                         const VULKAN_HPP_NAMESPACE::SparseImageOpaqueMemoryBindInfo * pImageOpaqueBinds_    = {},\n                                         uint32_t                                                      imageBindCount_       = {},\n                                         const VULKAN_HPP_NAMESPACE::SparseImageMemoryBindInfo *       pImageBinds_          = {},\n                                         uint32_t                                                      signalSemaphoreCount_ = {},\n                                         const VULKAN_HPP_NAMESPACE::Semaphore *                       pSignalSemaphores_    = {},\n                                         const void *                                                  pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , waitSemaphoreCount{ waitSemaphoreCount_ }\n      , pWaitSemaphores{ pWaitSemaphores_ }\n      , bufferBindCount{ bufferBindCount_ }\n      , pBufferBinds{ pBufferBinds_ }\n      , imageOpaqueBindCount{ imageOpaqueBindCount_ }\n      , pImageOpaqueBinds{ pImageOpaqueBinds_ }\n      , imageBindCount{ imageBindCount_ }\n      , pImageBinds{ pImageBinds_ }\n      , signalSemaphoreCount{ signalSemaphoreCount_ }\n      , pSignalSemaphores{ pSignalSemaphores_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BindSparseInfo( BindSparseInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BindSparseInfo( VkBindSparseInfo const & rhs ) VULKAN_HPP_NOEXCEPT : BindSparseInfo( *reinterpret_cast<BindSparseInfo const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    BindSparseInfo( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Semaphore> const &                       waitSemaphores_,\n                    VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SparseBufferMemoryBindInfo> const &      bufferBinds_      = {},\n                    VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SparseImageOpaqueMemoryBindInfo> const & imageOpaqueBinds_ = {},\n                    VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SparseImageMemoryBindInfo> const &       imageBinds_       = {},\n                    VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Semaphore> const &                       signalSemaphores_ = {},\n                    const void *                                                                                                       pNext_ = nullptr )\n      : pNext( pNext_ )\n      , waitSemaphoreCount( static_cast<uint32_t>( waitSemaphores_.size() ) )\n      , pWaitSemaphores( waitSemaphores_.data() )\n      , bufferBindCount( static_cast<uint32_t>( bufferBinds_.size() ) )\n      , pBufferBinds( bufferBinds_.data() )\n      , imageOpaqueBindCount( static_cast<uint32_t>( imageOpaqueBinds_.size() ) )\n      , pImageOpaqueBinds( imageOpaqueBinds_.data() )\n      , imageBindCount( static_cast<uint32_t>( imageBinds_.size() ) )\n      , pImageBinds( imageBinds_.data() )\n      , signalSemaphoreCount( static_cast<uint32_t>( signalSemaphores_.size() ) )\n      , pSignalSemaphores( signalSemaphores_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    BindSparseInfo & operator=( BindSparseInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BindSparseInfo & operator=( VkBindSparseInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BindSparseInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BindSparseInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindSparseInfo & setWaitSemaphoreCount( uint32_t waitSemaphoreCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      waitSemaphoreCount = waitSemaphoreCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindSparseInfo & setPWaitSemaphores( const VULKAN_HPP_NAMESPACE::Semaphore * pWaitSemaphores_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pWaitSemaphores = pWaitSemaphores_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    BindSparseInfo &\n      setWaitSemaphores( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Semaphore> const & waitSemaphores_ ) VULKAN_HPP_NOEXCEPT\n    {\n      waitSemaphoreCount = static_cast<uint32_t>( waitSemaphores_.size() );\n      pWaitSemaphores    = waitSemaphores_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 BindSparseInfo & setBufferBindCount( uint32_t bufferBindCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferBindCount = bufferBindCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindSparseInfo & setPBufferBinds( const VULKAN_HPP_NAMESPACE::SparseBufferMemoryBindInfo * pBufferBinds_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pBufferBinds = pBufferBinds_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    BindSparseInfo & setBufferBinds(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SparseBufferMemoryBindInfo> const & bufferBinds_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferBindCount = static_cast<uint32_t>( bufferBinds_.size() );\n      pBufferBinds    = bufferBinds_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 BindSparseInfo & setImageOpaqueBindCount( uint32_t imageOpaqueBindCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageOpaqueBindCount = imageOpaqueBindCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindSparseInfo &\n      setPImageOpaqueBinds( const VULKAN_HPP_NAMESPACE::SparseImageOpaqueMemoryBindInfo * pImageOpaqueBinds_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pImageOpaqueBinds = pImageOpaqueBinds_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    BindSparseInfo & setImageOpaqueBinds(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SparseImageOpaqueMemoryBindInfo> const & imageOpaqueBinds_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageOpaqueBindCount = static_cast<uint32_t>( imageOpaqueBinds_.size() );\n      pImageOpaqueBinds    = imageOpaqueBinds_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 BindSparseInfo & setImageBindCount( uint32_t imageBindCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageBindCount = imageBindCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindSparseInfo & setPImageBinds( const VULKAN_HPP_NAMESPACE::SparseImageMemoryBindInfo * pImageBinds_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pImageBinds = pImageBinds_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    BindSparseInfo & setImageBinds( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SparseImageMemoryBindInfo> const & imageBinds_ )\n      VULKAN_HPP_NOEXCEPT\n    {\n      imageBindCount = static_cast<uint32_t>( imageBinds_.size() );\n      pImageBinds    = imageBinds_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 BindSparseInfo & setSignalSemaphoreCount( uint32_t signalSemaphoreCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      signalSemaphoreCount = signalSemaphoreCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindSparseInfo & setPSignalSemaphores( const VULKAN_HPP_NAMESPACE::Semaphore * pSignalSemaphores_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSignalSemaphores = pSignalSemaphores_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    BindSparseInfo &\n      setSignalSemaphores( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Semaphore> const & signalSemaphores_ ) VULKAN_HPP_NOEXCEPT\n    {\n      signalSemaphoreCount = static_cast<uint32_t>( signalSemaphores_.size() );\n      pSignalSemaphores    = signalSemaphores_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBindSparseInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBindSparseInfo *>( this );\n    }\n\n    operator VkBindSparseInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBindSparseInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::Semaphore * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::SparseBufferMemoryBindInfo * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::SparseImageOpaqueMemoryBindInfo * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::SparseImageMemoryBindInfo * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::Semaphore * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       waitSemaphoreCount,\n                       pWaitSemaphores,\n                       bufferBindCount,\n                       pBufferBinds,\n                       imageOpaqueBindCount,\n                       pImageOpaqueBinds,\n                       imageBindCount,\n                       pImageBinds,\n                       signalSemaphoreCount,\n                       pSignalSemaphores );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BindSparseInfo const & ) const = default;\n#else\n    bool operator==( BindSparseInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( waitSemaphoreCount == rhs.waitSemaphoreCount ) &&\n             ( pWaitSemaphores == rhs.pWaitSemaphores ) && ( bufferBindCount == rhs.bufferBindCount ) && ( pBufferBinds == rhs.pBufferBinds ) &&\n             ( imageOpaqueBindCount == rhs.imageOpaqueBindCount ) && ( pImageOpaqueBinds == rhs.pImageOpaqueBinds ) &&\n             ( imageBindCount == rhs.imageBindCount ) && ( pImageBinds == rhs.pImageBinds ) && ( signalSemaphoreCount == rhs.signalSemaphoreCount ) &&\n             ( pSignalSemaphores == rhs.pSignalSemaphores );\n#  endif\n    }\n\n    bool operator!=( BindSparseInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                           sType                = StructureType::eBindSparseInfo;\n    const void *                                                  pNext                = {};\n    uint32_t                                                      waitSemaphoreCount   = {};\n    const VULKAN_HPP_NAMESPACE::Semaphore *                       pWaitSemaphores      = {};\n    uint32_t                                                      bufferBindCount      = {};\n    const VULKAN_HPP_NAMESPACE::SparseBufferMemoryBindInfo *      pBufferBinds         = {};\n    uint32_t                                                      imageOpaqueBindCount = {};\n    const VULKAN_HPP_NAMESPACE::SparseImageOpaqueMemoryBindInfo * pImageOpaqueBinds    = {};\n    uint32_t                                                      imageBindCount       = {};\n    const VULKAN_HPP_NAMESPACE::SparseImageMemoryBindInfo *       pImageBinds          = {};\n    uint32_t                                                      signalSemaphoreCount = {};\n    const VULKAN_HPP_NAMESPACE::Semaphore *                       pSignalSemaphores    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBindSparseInfo>\n  {\n    using Type = BindSparseInfo;\n  };\n\n  struct BindVertexBufferIndirectCommandEXT\n  {\n    using NativeType = VkBindVertexBufferIndirectCommandEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BindVertexBufferIndirectCommandEXT( VULKAN_HPP_NAMESPACE::DeviceAddress bufferAddress_ = {},\n                                                             uint32_t                            size_          = {},\n                                                             uint32_t                            stride_        = {} ) VULKAN_HPP_NOEXCEPT\n      : bufferAddress{ bufferAddress_ }\n      , size{ size_ }\n      , stride{ stride_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BindVertexBufferIndirectCommandEXT( BindVertexBufferIndirectCommandEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BindVertexBufferIndirectCommandEXT( VkBindVertexBufferIndirectCommandEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BindVertexBufferIndirectCommandEXT( *reinterpret_cast<BindVertexBufferIndirectCommandEXT const *>( &rhs ) )\n    {\n    }\n\n    BindVertexBufferIndirectCommandEXT & operator=( BindVertexBufferIndirectCommandEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BindVertexBufferIndirectCommandEXT & operator=( VkBindVertexBufferIndirectCommandEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BindVertexBufferIndirectCommandEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BindVertexBufferIndirectCommandEXT & setBufferAddress( VULKAN_HPP_NAMESPACE::DeviceAddress bufferAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferAddress = bufferAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindVertexBufferIndirectCommandEXT & setSize( uint32_t size_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size = size_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindVertexBufferIndirectCommandEXT & setStride( uint32_t stride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stride = stride_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBindVertexBufferIndirectCommandEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBindVertexBufferIndirectCommandEXT *>( this );\n    }\n\n    operator VkBindVertexBufferIndirectCommandEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBindVertexBufferIndirectCommandEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DeviceAddress const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( bufferAddress, size, stride );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BindVertexBufferIndirectCommandEXT const & ) const = default;\n#else\n    bool operator==( BindVertexBufferIndirectCommandEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( bufferAddress == rhs.bufferAddress ) && ( size == rhs.size ) && ( stride == rhs.stride );\n#  endif\n    }\n\n    bool operator!=( BindVertexBufferIndirectCommandEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DeviceAddress bufferAddress = {};\n    uint32_t                            size          = {};\n    uint32_t                            stride        = {};\n  };\n\n  struct BindVertexBufferIndirectCommandNV\n  {\n    using NativeType = VkBindVertexBufferIndirectCommandNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BindVertexBufferIndirectCommandNV( VULKAN_HPP_NAMESPACE::DeviceAddress bufferAddress_ = {},\n                                                            uint32_t                            size_          = {},\n                                                            uint32_t                            stride_        = {} ) VULKAN_HPP_NOEXCEPT\n      : bufferAddress{ bufferAddress_ }\n      , size{ size_ }\n      , stride{ stride_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BindVertexBufferIndirectCommandNV( BindVertexBufferIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BindVertexBufferIndirectCommandNV( VkBindVertexBufferIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BindVertexBufferIndirectCommandNV( *reinterpret_cast<BindVertexBufferIndirectCommandNV const *>( &rhs ) )\n    {\n    }\n\n    BindVertexBufferIndirectCommandNV & operator=( BindVertexBufferIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BindVertexBufferIndirectCommandNV & operator=( VkBindVertexBufferIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BindVertexBufferIndirectCommandNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BindVertexBufferIndirectCommandNV & setBufferAddress( VULKAN_HPP_NAMESPACE::DeviceAddress bufferAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferAddress = bufferAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindVertexBufferIndirectCommandNV & setSize( uint32_t size_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size = size_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindVertexBufferIndirectCommandNV & setStride( uint32_t stride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stride = stride_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBindVertexBufferIndirectCommandNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBindVertexBufferIndirectCommandNV *>( this );\n    }\n\n    operator VkBindVertexBufferIndirectCommandNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBindVertexBufferIndirectCommandNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DeviceAddress const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( bufferAddress, size, stride );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BindVertexBufferIndirectCommandNV const & ) const = default;\n#else\n    bool operator==( BindVertexBufferIndirectCommandNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( bufferAddress == rhs.bufferAddress ) && ( size == rhs.size ) && ( stride == rhs.stride );\n#  endif\n    }\n\n    bool operator!=( BindVertexBufferIndirectCommandNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DeviceAddress bufferAddress = {};\n    uint32_t                            size          = {};\n    uint32_t                            stride        = {};\n  };\n\n  struct BindVideoSessionMemoryInfoKHR\n  {\n    using NativeType = VkBindVideoSessionMemoryInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBindVideoSessionMemoryInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BindVideoSessionMemoryInfoKHR( uint32_t                           memoryBindIndex_ = {},\n                                                        VULKAN_HPP_NAMESPACE::DeviceMemory memory_          = {},\n                                                        VULKAN_HPP_NAMESPACE::DeviceSize   memoryOffset_    = {},\n                                                        VULKAN_HPP_NAMESPACE::DeviceSize   memorySize_      = {},\n                                                        const void *                       pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , memoryBindIndex{ memoryBindIndex_ }\n      , memory{ memory_ }\n      , memoryOffset{ memoryOffset_ }\n      , memorySize{ memorySize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BindVideoSessionMemoryInfoKHR( BindVideoSessionMemoryInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BindVideoSessionMemoryInfoKHR( VkBindVideoSessionMemoryInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BindVideoSessionMemoryInfoKHR( *reinterpret_cast<BindVideoSessionMemoryInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    BindVideoSessionMemoryInfoKHR & operator=( BindVideoSessionMemoryInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BindVideoSessionMemoryInfoKHR & operator=( VkBindVideoSessionMemoryInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BindVideoSessionMemoryInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BindVideoSessionMemoryInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindVideoSessionMemoryInfoKHR & setMemoryBindIndex( uint32_t memoryBindIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memoryBindIndex = memoryBindIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindVideoSessionMemoryInfoKHR & setMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memory = memory_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindVideoSessionMemoryInfoKHR & setMemoryOffset( VULKAN_HPP_NAMESPACE::DeviceSize memoryOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memoryOffset = memoryOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BindVideoSessionMemoryInfoKHR & setMemorySize( VULKAN_HPP_NAMESPACE::DeviceSize memorySize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memorySize = memorySize_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBindVideoSessionMemoryInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBindVideoSessionMemoryInfoKHR *>( this );\n    }\n\n    operator VkBindVideoSessionMemoryInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBindVideoSessionMemoryInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::DeviceMemory const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, memoryBindIndex, memory, memoryOffset, memorySize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BindVideoSessionMemoryInfoKHR const & ) const = default;\n#else\n    bool operator==( BindVideoSessionMemoryInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memoryBindIndex == rhs.memoryBindIndex ) && ( memory == rhs.memory ) &&\n             ( memoryOffset == rhs.memoryOffset ) && ( memorySize == rhs.memorySize );\n#  endif\n    }\n\n    bool operator!=( BindVideoSessionMemoryInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType           = StructureType::eBindVideoSessionMemoryInfoKHR;\n    const void *                        pNext           = {};\n    uint32_t                            memoryBindIndex = {};\n    VULKAN_HPP_NAMESPACE::DeviceMemory  memory          = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    memoryOffset    = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    memorySize      = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBindVideoSessionMemoryInfoKHR>\n  {\n    using Type = BindVideoSessionMemoryInfoKHR;\n  };\n\n  struct BlitImageCubicWeightsInfoQCOM\n  {\n    using NativeType = VkBlitImageCubicWeightsInfoQCOM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBlitImageCubicWeightsInfoQCOM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      BlitImageCubicWeightsInfoQCOM( VULKAN_HPP_NAMESPACE::CubicFilterWeightsQCOM cubicWeights_ = VULKAN_HPP_NAMESPACE::CubicFilterWeightsQCOM::eCatmullRom,\n                                     const void *                                 pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , cubicWeights{ cubicWeights_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BlitImageCubicWeightsInfoQCOM( BlitImageCubicWeightsInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BlitImageCubicWeightsInfoQCOM( VkBlitImageCubicWeightsInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BlitImageCubicWeightsInfoQCOM( *reinterpret_cast<BlitImageCubicWeightsInfoQCOM const *>( &rhs ) )\n    {\n    }\n\n    BlitImageCubicWeightsInfoQCOM & operator=( BlitImageCubicWeightsInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BlitImageCubicWeightsInfoQCOM & operator=( VkBlitImageCubicWeightsInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BlitImageCubicWeightsInfoQCOM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BlitImageCubicWeightsInfoQCOM & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BlitImageCubicWeightsInfoQCOM & setCubicWeights( VULKAN_HPP_NAMESPACE::CubicFilterWeightsQCOM cubicWeights_ ) VULKAN_HPP_NOEXCEPT\n    {\n      cubicWeights = cubicWeights_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBlitImageCubicWeightsInfoQCOM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBlitImageCubicWeightsInfoQCOM *>( this );\n    }\n\n    operator VkBlitImageCubicWeightsInfoQCOM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBlitImageCubicWeightsInfoQCOM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::CubicFilterWeightsQCOM const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, cubicWeights );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BlitImageCubicWeightsInfoQCOM const & ) const = default;\n#else\n    bool operator==( BlitImageCubicWeightsInfoQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( cubicWeights == rhs.cubicWeights );\n#  endif\n    }\n\n    bool operator!=( BlitImageCubicWeightsInfoQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType        = StructureType::eBlitImageCubicWeightsInfoQCOM;\n    const void *                                 pNext        = {};\n    VULKAN_HPP_NAMESPACE::CubicFilterWeightsQCOM cubicWeights = VULKAN_HPP_NAMESPACE::CubicFilterWeightsQCOM::eCatmullRom;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBlitImageCubicWeightsInfoQCOM>\n  {\n    using Type = BlitImageCubicWeightsInfoQCOM;\n  };\n\n  struct ImageSubresourceLayers\n  {\n    using NativeType = VkImageSubresourceLayers;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageSubresourceLayers( VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask_     = {},\n                                                 uint32_t                               mipLevel_       = {},\n                                                 uint32_t                               baseArrayLayer_ = {},\n                                                 uint32_t                               layerCount_     = {} ) VULKAN_HPP_NOEXCEPT\n      : aspectMask{ aspectMask_ }\n      , mipLevel{ mipLevel_ }\n      , baseArrayLayer{ baseArrayLayer_ }\n      , layerCount{ layerCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageSubresourceLayers( ImageSubresourceLayers const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageSubresourceLayers( VkImageSubresourceLayers const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageSubresourceLayers( *reinterpret_cast<ImageSubresourceLayers const *>( &rhs ) )\n    {\n    }\n\n    ImageSubresourceLayers & operator=( ImageSubresourceLayers const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageSubresourceLayers & operator=( VkImageSubresourceLayers const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageSubresourceLayers & setAspectMask( VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      aspectMask = aspectMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageSubresourceLayers & setMipLevel( uint32_t mipLevel_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mipLevel = mipLevel_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageSubresourceLayers & setBaseArrayLayer( uint32_t baseArrayLayer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      baseArrayLayer = baseArrayLayer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageSubresourceLayers & setLayerCount( uint32_t layerCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layerCount = layerCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageSubresourceLayers const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageSubresourceLayers *>( this );\n    }\n\n    operator VkImageSubresourceLayers &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageSubresourceLayers *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::ImageAspectFlags const &, uint32_t const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( aspectMask, mipLevel, baseArrayLayer, layerCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageSubresourceLayers const & ) const = default;\n#else\n    bool operator==( ImageSubresourceLayers const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( aspectMask == rhs.aspectMask ) && ( mipLevel == rhs.mipLevel ) && ( baseArrayLayer == rhs.baseArrayLayer ) && ( layerCount == rhs.layerCount );\n#  endif\n    }\n\n    bool operator!=( ImageSubresourceLayers const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask     = {};\n    uint32_t                               mipLevel       = {};\n    uint32_t                               baseArrayLayer = {};\n    uint32_t                               layerCount     = {};\n  };\n\n  struct ImageBlit2\n  {\n    using NativeType = VkImageBlit2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageBlit2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 ImageBlit2( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers          srcSubresource_ = {},\n                                        std::array<VULKAN_HPP_NAMESPACE::Offset3D, 2> const & srcOffsets_     = {},\n                                        VULKAN_HPP_NAMESPACE::ImageSubresourceLayers          dstSubresource_ = {},\n                                        std::array<VULKAN_HPP_NAMESPACE::Offset3D, 2> const & dstOffsets_     = {},\n                                        const void *                                          pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , srcSubresource{ srcSubresource_ }\n      , srcOffsets{ srcOffsets_ }\n      , dstSubresource{ dstSubresource_ }\n      , dstOffsets{ dstOffsets_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageBlit2( ImageBlit2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageBlit2( VkImageBlit2 const & rhs ) VULKAN_HPP_NOEXCEPT : ImageBlit2( *reinterpret_cast<ImageBlit2 const *>( &rhs ) ) {}\n\n    ImageBlit2 & operator=( ImageBlit2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageBlit2 & operator=( VkImageBlit2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageBlit2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageBlit2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageBlit2 & setSrcSubresource( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const & srcSubresource_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcSubresource = srcSubresource_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageBlit2 & setSrcOffsets( std::array<VULKAN_HPP_NAMESPACE::Offset3D, 2> const & srcOffsets_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcOffsets = srcOffsets_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageBlit2 & setDstSubresource( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const & dstSubresource_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstSubresource = dstSubresource_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageBlit2 & setDstOffsets( std::array<VULKAN_HPP_NAMESPACE::Offset3D, 2> const & dstOffsets_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstOffsets = dstOffsets_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageBlit2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageBlit2 *>( this );\n    }\n\n    operator VkImageBlit2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageBlit2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::Offset3D, 2> const &,\n               VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::Offset3D, 2> const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, srcSubresource, srcOffsets, dstSubresource, dstOffsets );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageBlit2 const & ) const = default;\n#else\n    bool operator==( ImageBlit2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( srcSubresource == rhs.srcSubresource ) && ( srcOffsets == rhs.srcOffsets ) &&\n             ( dstSubresource == rhs.dstSubresource ) && ( dstOffsets == rhs.dstOffsets );\n#  endif\n    }\n\n    bool operator!=( ImageBlit2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                     sType          = StructureType::eImageBlit2;\n    const void *                                                            pNext          = {};\n    VULKAN_HPP_NAMESPACE::ImageSubresourceLayers                            srcSubresource = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::Offset3D, 2> srcOffsets     = {};\n    VULKAN_HPP_NAMESPACE::ImageSubresourceLayers                            dstSubresource = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::Offset3D, 2> dstOffsets     = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageBlit2>\n  {\n    using Type = ImageBlit2;\n  };\n\n  using ImageBlit2KHR = ImageBlit2;\n\n  struct BlitImageInfo2\n  {\n    using NativeType = VkBlitImageInfo2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBlitImageInfo2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 BlitImageInfo2( VULKAN_HPP_NAMESPACE::Image              srcImage_       = {},\n                                            VULKAN_HPP_NAMESPACE::ImageLayout        srcImageLayout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                            VULKAN_HPP_NAMESPACE::Image              dstImage_       = {},\n                                            VULKAN_HPP_NAMESPACE::ImageLayout        dstImageLayout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                            uint32_t                                 regionCount_    = {},\n                                            const VULKAN_HPP_NAMESPACE::ImageBlit2 * pRegions_       = {},\n                                            VULKAN_HPP_NAMESPACE::Filter             filter_         = VULKAN_HPP_NAMESPACE::Filter::eNearest,\n                                            const void *                             pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , srcImage{ srcImage_ }\n      , srcImageLayout{ srcImageLayout_ }\n      , dstImage{ dstImage_ }\n      , dstImageLayout{ dstImageLayout_ }\n      , regionCount{ regionCount_ }\n      , pRegions{ pRegions_ }\n      , filter{ filter_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BlitImageInfo2( BlitImageInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BlitImageInfo2( VkBlitImageInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT : BlitImageInfo2( *reinterpret_cast<BlitImageInfo2 const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    BlitImageInfo2( VULKAN_HPP_NAMESPACE::Image                                                                   srcImage_,\n                    VULKAN_HPP_NAMESPACE::ImageLayout                                                             srcImageLayout_,\n                    VULKAN_HPP_NAMESPACE::Image                                                                   dstImage_,\n                    VULKAN_HPP_NAMESPACE::ImageLayout                                                             dstImageLayout_,\n                    VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageBlit2> const & regions_,\n                    VULKAN_HPP_NAMESPACE::Filter filter_ = VULKAN_HPP_NAMESPACE::Filter::eNearest,\n                    const void *                 pNext_  = nullptr )\n      : pNext( pNext_ )\n      , srcImage( srcImage_ )\n      , srcImageLayout( srcImageLayout_ )\n      , dstImage( dstImage_ )\n      , dstImageLayout( dstImageLayout_ )\n      , regionCount( static_cast<uint32_t>( regions_.size() ) )\n      , pRegions( regions_.data() )\n      , filter( filter_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    BlitImageInfo2 & operator=( BlitImageInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BlitImageInfo2 & operator=( VkBlitImageInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BlitImageInfo2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BlitImageInfo2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BlitImageInfo2 & setSrcImage( VULKAN_HPP_NAMESPACE::Image srcImage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcImage = srcImage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BlitImageInfo2 & setSrcImageLayout( VULKAN_HPP_NAMESPACE::ImageLayout srcImageLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcImageLayout = srcImageLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BlitImageInfo2 & setDstImage( VULKAN_HPP_NAMESPACE::Image dstImage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstImage = dstImage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BlitImageInfo2 & setDstImageLayout( VULKAN_HPP_NAMESPACE::ImageLayout dstImageLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstImageLayout = dstImageLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BlitImageInfo2 & setRegionCount( uint32_t regionCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      regionCount = regionCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BlitImageInfo2 & setPRegions( const VULKAN_HPP_NAMESPACE::ImageBlit2 * pRegions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pRegions = pRegions_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    BlitImageInfo2 & setRegions( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageBlit2> const & regions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      regionCount = static_cast<uint32_t>( regions_.size() );\n      pRegions    = regions_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 BlitImageInfo2 & setFilter( VULKAN_HPP_NAMESPACE::Filter filter_ ) VULKAN_HPP_NOEXCEPT\n    {\n      filter = filter_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBlitImageInfo2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBlitImageInfo2 *>( this );\n    }\n\n    operator VkBlitImageInfo2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBlitImageInfo2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Image const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               VULKAN_HPP_NAMESPACE::Image const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::ImageBlit2 * const &,\n               VULKAN_HPP_NAMESPACE::Filter const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BlitImageInfo2 const & ) const = default;\n#else\n    bool operator==( BlitImageInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( srcImage == rhs.srcImage ) && ( srcImageLayout == rhs.srcImageLayout ) &&\n             ( dstImage == rhs.dstImage ) && ( dstImageLayout == rhs.dstImageLayout ) && ( regionCount == rhs.regionCount ) && ( pRegions == rhs.pRegions ) &&\n             ( filter == rhs.filter );\n#  endif\n    }\n\n    bool operator!=( BlitImageInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType      sType          = StructureType::eBlitImageInfo2;\n    const void *                             pNext          = {};\n    VULKAN_HPP_NAMESPACE::Image              srcImage       = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout        srcImageLayout = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    VULKAN_HPP_NAMESPACE::Image              dstImage       = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout        dstImageLayout = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    uint32_t                                 regionCount    = {};\n    const VULKAN_HPP_NAMESPACE::ImageBlit2 * pRegions       = {};\n    VULKAN_HPP_NAMESPACE::Filter             filter         = VULKAN_HPP_NAMESPACE::Filter::eNearest;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBlitImageInfo2>\n  {\n    using Type = BlitImageInfo2;\n  };\n\n  using BlitImageInfo2KHR = BlitImageInfo2;\n\n  struct BufferCaptureDescriptorDataInfoEXT\n  {\n    using NativeType = VkBufferCaptureDescriptorDataInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBufferCaptureDescriptorDataInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BufferCaptureDescriptorDataInfoEXT( VULKAN_HPP_NAMESPACE::Buffer buffer_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , buffer{ buffer_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BufferCaptureDescriptorDataInfoEXT( BufferCaptureDescriptorDataInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BufferCaptureDescriptorDataInfoEXT( VkBufferCaptureDescriptorDataInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BufferCaptureDescriptorDataInfoEXT( *reinterpret_cast<BufferCaptureDescriptorDataInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    BufferCaptureDescriptorDataInfoEXT & operator=( BufferCaptureDescriptorDataInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BufferCaptureDescriptorDataInfoEXT & operator=( VkBufferCaptureDescriptorDataInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BufferCaptureDescriptorDataInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BufferCaptureDescriptorDataInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferCaptureDescriptorDataInfoEXT & setBuffer( VULKAN_HPP_NAMESPACE::Buffer buffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      buffer = buffer_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBufferCaptureDescriptorDataInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBufferCaptureDescriptorDataInfoEXT *>( this );\n    }\n\n    operator VkBufferCaptureDescriptorDataInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBufferCaptureDescriptorDataInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Buffer const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, buffer );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BufferCaptureDescriptorDataInfoEXT const & ) const = default;\n#else\n    bool operator==( BufferCaptureDescriptorDataInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( buffer == rhs.buffer );\n#  endif\n    }\n\n    bool operator!=( BufferCaptureDescriptorDataInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType  = StructureType::eBufferCaptureDescriptorDataInfoEXT;\n    const void *                        pNext  = {};\n    VULKAN_HPP_NAMESPACE::Buffer        buffer = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBufferCaptureDescriptorDataInfoEXT>\n  {\n    using Type = BufferCaptureDescriptorDataInfoEXT;\n  };\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  struct BufferCollectionBufferCreateInfoFUCHSIA\n  {\n    using NativeType = VkBufferCollectionBufferCreateInfoFUCHSIA;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBufferCollectionBufferCreateInfoFUCHSIA;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BufferCollectionBufferCreateInfoFUCHSIA( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA collection_ = {},\n                                                                  uint32_t                                      index_      = {},\n                                                                  const void *                                  pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , collection{ collection_ }\n      , index{ index_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BufferCollectionBufferCreateInfoFUCHSIA( BufferCollectionBufferCreateInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BufferCollectionBufferCreateInfoFUCHSIA( VkBufferCollectionBufferCreateInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BufferCollectionBufferCreateInfoFUCHSIA( *reinterpret_cast<BufferCollectionBufferCreateInfoFUCHSIA const *>( &rhs ) )\n    {\n    }\n\n    BufferCollectionBufferCreateInfoFUCHSIA & operator=( BufferCollectionBufferCreateInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BufferCollectionBufferCreateInfoFUCHSIA & operator=( VkBufferCollectionBufferCreateInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BufferCollectionBufferCreateInfoFUCHSIA const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BufferCollectionBufferCreateInfoFUCHSIA & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferCollectionBufferCreateInfoFUCHSIA &\n      setCollection( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA collection_ ) VULKAN_HPP_NOEXCEPT\n    {\n      collection = collection_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferCollectionBufferCreateInfoFUCHSIA & setIndex( uint32_t index_ ) VULKAN_HPP_NOEXCEPT\n    {\n      index = index_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBufferCollectionBufferCreateInfoFUCHSIA const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBufferCollectionBufferCreateInfoFUCHSIA *>( this );\n    }\n\n    operator VkBufferCollectionBufferCreateInfoFUCHSIA &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBufferCollectionBufferCreateInfoFUCHSIA *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA const &, uint32_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, collection, index );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BufferCollectionBufferCreateInfoFUCHSIA const & ) const = default;\n#  else\n    bool operator==( BufferCollectionBufferCreateInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( collection == rhs.collection ) && ( index == rhs.index );\n#    endif\n    }\n\n    bool operator!=( BufferCollectionBufferCreateInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType           sType      = StructureType::eBufferCollectionBufferCreateInfoFUCHSIA;\n    const void *                                  pNext      = {};\n    VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA collection = {};\n    uint32_t                                      index      = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBufferCollectionBufferCreateInfoFUCHSIA>\n  {\n    using Type = BufferCollectionBufferCreateInfoFUCHSIA;\n  };\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  struct BufferCollectionConstraintsInfoFUCHSIA\n  {\n    using NativeType = VkBufferCollectionConstraintsInfoFUCHSIA;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBufferCollectionConstraintsInfoFUCHSIA;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BufferCollectionConstraintsInfoFUCHSIA( uint32_t     minBufferCount_                  = {},\n                                                                 uint32_t     maxBufferCount_                  = {},\n                                                                 uint32_t     minBufferCountForCamping_        = {},\n                                                                 uint32_t     minBufferCountForDedicatedSlack_ = {},\n                                                                 uint32_t     minBufferCountForSharedSlack_    = {},\n                                                                 const void * pNext_                           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , minBufferCount{ minBufferCount_ }\n      , maxBufferCount{ maxBufferCount_ }\n      , minBufferCountForCamping{ minBufferCountForCamping_ }\n      , minBufferCountForDedicatedSlack{ minBufferCountForDedicatedSlack_ }\n      , minBufferCountForSharedSlack{ minBufferCountForSharedSlack_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BufferCollectionConstraintsInfoFUCHSIA( BufferCollectionConstraintsInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BufferCollectionConstraintsInfoFUCHSIA( VkBufferCollectionConstraintsInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BufferCollectionConstraintsInfoFUCHSIA( *reinterpret_cast<BufferCollectionConstraintsInfoFUCHSIA const *>( &rhs ) )\n    {\n    }\n\n    BufferCollectionConstraintsInfoFUCHSIA & operator=( BufferCollectionConstraintsInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BufferCollectionConstraintsInfoFUCHSIA & operator=( VkBufferCollectionConstraintsInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BufferCollectionConstraintsInfoFUCHSIA const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BufferCollectionConstraintsInfoFUCHSIA & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferCollectionConstraintsInfoFUCHSIA & setMinBufferCount( uint32_t minBufferCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minBufferCount = minBufferCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferCollectionConstraintsInfoFUCHSIA & setMaxBufferCount( uint32_t maxBufferCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxBufferCount = maxBufferCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferCollectionConstraintsInfoFUCHSIA & setMinBufferCountForCamping( uint32_t minBufferCountForCamping_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minBufferCountForCamping = minBufferCountForCamping_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferCollectionConstraintsInfoFUCHSIA &\n      setMinBufferCountForDedicatedSlack( uint32_t minBufferCountForDedicatedSlack_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minBufferCountForDedicatedSlack = minBufferCountForDedicatedSlack_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferCollectionConstraintsInfoFUCHSIA &\n      setMinBufferCountForSharedSlack( uint32_t minBufferCountForSharedSlack_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minBufferCountForSharedSlack = minBufferCountForSharedSlack_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBufferCollectionConstraintsInfoFUCHSIA const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBufferCollectionConstraintsInfoFUCHSIA *>( this );\n    }\n\n    operator VkBufferCollectionConstraintsInfoFUCHSIA &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBufferCollectionConstraintsInfoFUCHSIA *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, minBufferCount, maxBufferCount, minBufferCountForCamping, minBufferCountForDedicatedSlack, minBufferCountForSharedSlack );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BufferCollectionConstraintsInfoFUCHSIA const & ) const = default;\n#  else\n    bool operator==( BufferCollectionConstraintsInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( minBufferCount == rhs.minBufferCount ) && ( maxBufferCount == rhs.maxBufferCount ) &&\n             ( minBufferCountForCamping == rhs.minBufferCountForCamping ) && ( minBufferCountForDedicatedSlack == rhs.minBufferCountForDedicatedSlack ) &&\n             ( minBufferCountForSharedSlack == rhs.minBufferCountForSharedSlack );\n#    endif\n    }\n\n    bool operator!=( BufferCollectionConstraintsInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                           = StructureType::eBufferCollectionConstraintsInfoFUCHSIA;\n    const void *                        pNext                           = {};\n    uint32_t                            minBufferCount                  = {};\n    uint32_t                            maxBufferCount                  = {};\n    uint32_t                            minBufferCountForCamping        = {};\n    uint32_t                            minBufferCountForDedicatedSlack = {};\n    uint32_t                            minBufferCountForSharedSlack    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBufferCollectionConstraintsInfoFUCHSIA>\n  {\n    using Type = BufferCollectionConstraintsInfoFUCHSIA;\n  };\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  struct BufferCollectionCreateInfoFUCHSIA\n  {\n    using NativeType = VkBufferCollectionCreateInfoFUCHSIA;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBufferCollectionCreateInfoFUCHSIA;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BufferCollectionCreateInfoFUCHSIA( zx_handle_t collectionToken_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , collectionToken{ collectionToken_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BufferCollectionCreateInfoFUCHSIA( BufferCollectionCreateInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BufferCollectionCreateInfoFUCHSIA( VkBufferCollectionCreateInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BufferCollectionCreateInfoFUCHSIA( *reinterpret_cast<BufferCollectionCreateInfoFUCHSIA const *>( &rhs ) )\n    {\n    }\n\n    BufferCollectionCreateInfoFUCHSIA & operator=( BufferCollectionCreateInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BufferCollectionCreateInfoFUCHSIA & operator=( VkBufferCollectionCreateInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BufferCollectionCreateInfoFUCHSIA const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BufferCollectionCreateInfoFUCHSIA & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferCollectionCreateInfoFUCHSIA & setCollectionToken( zx_handle_t collectionToken_ ) VULKAN_HPP_NOEXCEPT\n    {\n      collectionToken = collectionToken_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBufferCollectionCreateInfoFUCHSIA const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBufferCollectionCreateInfoFUCHSIA *>( this );\n    }\n\n    operator VkBufferCollectionCreateInfoFUCHSIA &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBufferCollectionCreateInfoFUCHSIA *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, zx_handle_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, collectionToken );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( BufferCollectionCreateInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = memcmp( &collectionToken, &rhs.collectionToken, sizeof( zx_handle_t ) ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#  endif\n\n    bool operator==( BufferCollectionCreateInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memcmp( &collectionToken, &rhs.collectionToken, sizeof( zx_handle_t ) ) == 0 );\n    }\n\n    bool operator!=( BufferCollectionCreateInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType           = StructureType::eBufferCollectionCreateInfoFUCHSIA;\n    const void *                        pNext           = {};\n    zx_handle_t                         collectionToken = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBufferCollectionCreateInfoFUCHSIA>\n  {\n    using Type = BufferCollectionCreateInfoFUCHSIA;\n  };\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  struct BufferCollectionImageCreateInfoFUCHSIA\n  {\n    using NativeType = VkBufferCollectionImageCreateInfoFUCHSIA;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBufferCollectionImageCreateInfoFUCHSIA;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BufferCollectionImageCreateInfoFUCHSIA( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA collection_ = {},\n                                                                 uint32_t                                      index_      = {},\n                                                                 const void *                                  pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , collection{ collection_ }\n      , index{ index_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BufferCollectionImageCreateInfoFUCHSIA( BufferCollectionImageCreateInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BufferCollectionImageCreateInfoFUCHSIA( VkBufferCollectionImageCreateInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BufferCollectionImageCreateInfoFUCHSIA( *reinterpret_cast<BufferCollectionImageCreateInfoFUCHSIA const *>( &rhs ) )\n    {\n    }\n\n    BufferCollectionImageCreateInfoFUCHSIA & operator=( BufferCollectionImageCreateInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BufferCollectionImageCreateInfoFUCHSIA & operator=( VkBufferCollectionImageCreateInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BufferCollectionImageCreateInfoFUCHSIA const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BufferCollectionImageCreateInfoFUCHSIA & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferCollectionImageCreateInfoFUCHSIA &\n      setCollection( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA collection_ ) VULKAN_HPP_NOEXCEPT\n    {\n      collection = collection_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferCollectionImageCreateInfoFUCHSIA & setIndex( uint32_t index_ ) VULKAN_HPP_NOEXCEPT\n    {\n      index = index_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBufferCollectionImageCreateInfoFUCHSIA const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBufferCollectionImageCreateInfoFUCHSIA *>( this );\n    }\n\n    operator VkBufferCollectionImageCreateInfoFUCHSIA &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBufferCollectionImageCreateInfoFUCHSIA *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA const &, uint32_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, collection, index );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BufferCollectionImageCreateInfoFUCHSIA const & ) const = default;\n#  else\n    bool operator==( BufferCollectionImageCreateInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( collection == rhs.collection ) && ( index == rhs.index );\n#    endif\n    }\n\n    bool operator!=( BufferCollectionImageCreateInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType           sType      = StructureType::eBufferCollectionImageCreateInfoFUCHSIA;\n    const void *                                  pNext      = {};\n    VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA collection = {};\n    uint32_t                                      index      = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBufferCollectionImageCreateInfoFUCHSIA>\n  {\n    using Type = BufferCollectionImageCreateInfoFUCHSIA;\n  };\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  struct SysmemColorSpaceFUCHSIA\n  {\n    using NativeType = VkSysmemColorSpaceFUCHSIA;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSysmemColorSpaceFUCHSIA;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SysmemColorSpaceFUCHSIA( uint32_t colorSpace_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , colorSpace{ colorSpace_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SysmemColorSpaceFUCHSIA( SysmemColorSpaceFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SysmemColorSpaceFUCHSIA( VkSysmemColorSpaceFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SysmemColorSpaceFUCHSIA( *reinterpret_cast<SysmemColorSpaceFUCHSIA const *>( &rhs ) )\n    {\n    }\n\n    SysmemColorSpaceFUCHSIA & operator=( SysmemColorSpaceFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SysmemColorSpaceFUCHSIA & operator=( VkSysmemColorSpaceFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SysmemColorSpaceFUCHSIA const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SysmemColorSpaceFUCHSIA & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SysmemColorSpaceFUCHSIA & setColorSpace( uint32_t colorSpace_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorSpace = colorSpace_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSysmemColorSpaceFUCHSIA const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSysmemColorSpaceFUCHSIA *>( this );\n    }\n\n    operator VkSysmemColorSpaceFUCHSIA &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSysmemColorSpaceFUCHSIA *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, colorSpace );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SysmemColorSpaceFUCHSIA const & ) const = default;\n#  else\n    bool operator==( SysmemColorSpaceFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( colorSpace == rhs.colorSpace );\n#    endif\n    }\n\n    bool operator!=( SysmemColorSpaceFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType      = StructureType::eSysmemColorSpaceFUCHSIA;\n    const void *                        pNext      = {};\n    uint32_t                            colorSpace = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSysmemColorSpaceFUCHSIA>\n  {\n    using Type = SysmemColorSpaceFUCHSIA;\n  };\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  struct BufferCollectionPropertiesFUCHSIA\n  {\n    using NativeType = VkBufferCollectionPropertiesFUCHSIA;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBufferCollectionPropertiesFUCHSIA;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BufferCollectionPropertiesFUCHSIA(\n      uint32_t                                          memoryTypeBits_                   = {},\n      uint32_t                                          bufferCount_                      = {},\n      uint32_t                                          createInfoIndex_                  = {},\n      uint64_t                                          sysmemPixelFormat_                = {},\n      VULKAN_HPP_NAMESPACE::FormatFeatureFlags          formatFeatures_                   = {},\n      VULKAN_HPP_NAMESPACE::SysmemColorSpaceFUCHSIA     sysmemColorSpaceIndex_            = {},\n      VULKAN_HPP_NAMESPACE::ComponentMapping            samplerYcbcrConversionComponents_ = {},\n      VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion suggestedYcbcrModel_              = VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion::eRgbIdentity,\n      VULKAN_HPP_NAMESPACE::SamplerYcbcrRange           suggestedYcbcrRange_              = VULKAN_HPP_NAMESPACE::SamplerYcbcrRange::eItuFull,\n      VULKAN_HPP_NAMESPACE::ChromaLocation              suggestedXChromaOffset_           = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven,\n      VULKAN_HPP_NAMESPACE::ChromaLocation              suggestedYChromaOffset_           = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven,\n      void *                                            pNext_                            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , memoryTypeBits{ memoryTypeBits_ }\n      , bufferCount{ bufferCount_ }\n      , createInfoIndex{ createInfoIndex_ }\n      , sysmemPixelFormat{ sysmemPixelFormat_ }\n      , formatFeatures{ formatFeatures_ }\n      , sysmemColorSpaceIndex{ sysmemColorSpaceIndex_ }\n      , samplerYcbcrConversionComponents{ samplerYcbcrConversionComponents_ }\n      , suggestedYcbcrModel{ suggestedYcbcrModel_ }\n      , suggestedYcbcrRange{ suggestedYcbcrRange_ }\n      , suggestedXChromaOffset{ suggestedXChromaOffset_ }\n      , suggestedYChromaOffset{ suggestedYChromaOffset_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BufferCollectionPropertiesFUCHSIA( BufferCollectionPropertiesFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BufferCollectionPropertiesFUCHSIA( VkBufferCollectionPropertiesFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BufferCollectionPropertiesFUCHSIA( *reinterpret_cast<BufferCollectionPropertiesFUCHSIA const *>( &rhs ) )\n    {\n    }\n\n    BufferCollectionPropertiesFUCHSIA & operator=( BufferCollectionPropertiesFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BufferCollectionPropertiesFUCHSIA & operator=( VkBufferCollectionPropertiesFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BufferCollectionPropertiesFUCHSIA const *>( &rhs );\n      return *this;\n    }\n\n    operator VkBufferCollectionPropertiesFUCHSIA const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBufferCollectionPropertiesFUCHSIA *>( this );\n    }\n\n    operator VkBufferCollectionPropertiesFUCHSIA &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBufferCollectionPropertiesFUCHSIA *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint64_t const &,\n               VULKAN_HPP_NAMESPACE::FormatFeatureFlags const &,\n               VULKAN_HPP_NAMESPACE::SysmemColorSpaceFUCHSIA const &,\n               VULKAN_HPP_NAMESPACE::ComponentMapping const &,\n               VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion const &,\n               VULKAN_HPP_NAMESPACE::SamplerYcbcrRange const &,\n               VULKAN_HPP_NAMESPACE::ChromaLocation const &,\n               VULKAN_HPP_NAMESPACE::ChromaLocation const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       memoryTypeBits,\n                       bufferCount,\n                       createInfoIndex,\n                       sysmemPixelFormat,\n                       formatFeatures,\n                       sysmemColorSpaceIndex,\n                       samplerYcbcrConversionComponents,\n                       suggestedYcbcrModel,\n                       suggestedYcbcrRange,\n                       suggestedXChromaOffset,\n                       suggestedYChromaOffset );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BufferCollectionPropertiesFUCHSIA const & ) const = default;\n#  else\n    bool operator==( BufferCollectionPropertiesFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memoryTypeBits == rhs.memoryTypeBits ) && ( bufferCount == rhs.bufferCount ) &&\n             ( createInfoIndex == rhs.createInfoIndex ) && ( sysmemPixelFormat == rhs.sysmemPixelFormat ) && ( formatFeatures == rhs.formatFeatures ) &&\n             ( sysmemColorSpaceIndex == rhs.sysmemColorSpaceIndex ) && ( samplerYcbcrConversionComponents == rhs.samplerYcbcrConversionComponents ) &&\n             ( suggestedYcbcrModel == rhs.suggestedYcbcrModel ) && ( suggestedYcbcrRange == rhs.suggestedYcbcrRange ) &&\n             ( suggestedXChromaOffset == rhs.suggestedXChromaOffset ) && ( suggestedYChromaOffset == rhs.suggestedYChromaOffset );\n#    endif\n    }\n\n    bool operator!=( BufferCollectionPropertiesFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType                            = StructureType::eBufferCollectionPropertiesFUCHSIA;\n    void *                                            pNext                            = {};\n    uint32_t                                          memoryTypeBits                   = {};\n    uint32_t                                          bufferCount                      = {};\n    uint32_t                                          createInfoIndex                  = {};\n    uint64_t                                          sysmemPixelFormat                = {};\n    VULKAN_HPP_NAMESPACE::FormatFeatureFlags          formatFeatures                   = {};\n    VULKAN_HPP_NAMESPACE::SysmemColorSpaceFUCHSIA     sysmemColorSpaceIndex            = {};\n    VULKAN_HPP_NAMESPACE::ComponentMapping            samplerYcbcrConversionComponents = {};\n    VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion suggestedYcbcrModel              = VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion::eRgbIdentity;\n    VULKAN_HPP_NAMESPACE::SamplerYcbcrRange           suggestedYcbcrRange              = VULKAN_HPP_NAMESPACE::SamplerYcbcrRange::eItuFull;\n    VULKAN_HPP_NAMESPACE::ChromaLocation              suggestedXChromaOffset           = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven;\n    VULKAN_HPP_NAMESPACE::ChromaLocation              suggestedYChromaOffset           = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBufferCollectionPropertiesFUCHSIA>\n  {\n    using Type = BufferCollectionPropertiesFUCHSIA;\n  };\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  struct BufferCreateInfo\n  {\n    using NativeType = VkBufferCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBufferCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BufferCreateInfo( VULKAN_HPP_NAMESPACE::BufferCreateFlags flags_                 = {},\n                                           VULKAN_HPP_NAMESPACE::DeviceSize        size_                  = {},\n                                           VULKAN_HPP_NAMESPACE::BufferUsageFlags  usage_                 = {},\n                                           VULKAN_HPP_NAMESPACE::SharingMode       sharingMode_           = VULKAN_HPP_NAMESPACE::SharingMode::eExclusive,\n                                           uint32_t                                queueFamilyIndexCount_ = {},\n                                           const uint32_t *                        pQueueFamilyIndices_   = {},\n                                           const void *                            pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , size{ size_ }\n      , usage{ usage_ }\n      , sharingMode{ sharingMode_ }\n      , queueFamilyIndexCount{ queueFamilyIndexCount_ }\n      , pQueueFamilyIndices{ pQueueFamilyIndices_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BufferCreateInfo( BufferCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BufferCreateInfo( VkBufferCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT : BufferCreateInfo( *reinterpret_cast<BufferCreateInfo const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    BufferCreateInfo( VULKAN_HPP_NAMESPACE::BufferCreateFlags                               flags_,\n                      VULKAN_HPP_NAMESPACE::DeviceSize                                      size_,\n                      VULKAN_HPP_NAMESPACE::BufferUsageFlags                                usage_,\n                      VULKAN_HPP_NAMESPACE::SharingMode                                     sharingMode_,\n                      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & queueFamilyIndices_,\n                      const void *                                                          pNext_ = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , size( size_ )\n      , usage( usage_ )\n      , sharingMode( sharingMode_ )\n      , queueFamilyIndexCount( static_cast<uint32_t>( queueFamilyIndices_.size() ) )\n      , pQueueFamilyIndices( queueFamilyIndices_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    BufferCreateInfo & operator=( BufferCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BufferCreateInfo & operator=( VkBufferCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BufferCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BufferCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::BufferCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferCreateInfo & setSize( VULKAN_HPP_NAMESPACE::DeviceSize size_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size = size_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferCreateInfo & setUsage( VULKAN_HPP_NAMESPACE::BufferUsageFlags usage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      usage = usage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferCreateInfo & setSharingMode( VULKAN_HPP_NAMESPACE::SharingMode sharingMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sharingMode = sharingMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferCreateInfo & setQueueFamilyIndexCount( uint32_t queueFamilyIndexCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queueFamilyIndexCount = queueFamilyIndexCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferCreateInfo & setPQueueFamilyIndices( const uint32_t * pQueueFamilyIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pQueueFamilyIndices = pQueueFamilyIndices_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    BufferCreateInfo & setQueueFamilyIndices( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & queueFamilyIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queueFamilyIndexCount = static_cast<uint32_t>( queueFamilyIndices_.size() );\n      pQueueFamilyIndices   = queueFamilyIndices_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBufferCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBufferCreateInfo *>( this );\n    }\n\n    operator VkBufferCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBufferCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::BufferCreateFlags const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::BufferUsageFlags const &,\n               VULKAN_HPP_NAMESPACE::SharingMode const &,\n               uint32_t const &,\n               const uint32_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, size, usage, sharingMode, queueFamilyIndexCount, pQueueFamilyIndices );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BufferCreateInfo const & ) const = default;\n#else\n    bool operator==( BufferCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( size == rhs.size ) && ( usage == rhs.usage ) &&\n             ( sharingMode == rhs.sharingMode ) && ( queueFamilyIndexCount == rhs.queueFamilyIndexCount ) && ( pQueueFamilyIndices == rhs.pQueueFamilyIndices );\n#  endif\n    }\n\n    bool operator!=( BufferCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType     sType                 = StructureType::eBufferCreateInfo;\n    const void *                            pNext                 = {};\n    VULKAN_HPP_NAMESPACE::BufferCreateFlags flags                 = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize        size                  = {};\n    VULKAN_HPP_NAMESPACE::BufferUsageFlags  usage                 = {};\n    VULKAN_HPP_NAMESPACE::SharingMode       sharingMode           = VULKAN_HPP_NAMESPACE::SharingMode::eExclusive;\n    uint32_t                                queueFamilyIndexCount = {};\n    const uint32_t *                        pQueueFamilyIndices   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBufferCreateInfo>\n  {\n    using Type = BufferCreateInfo;\n  };\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  struct BufferConstraintsInfoFUCHSIA\n  {\n    using NativeType = VkBufferConstraintsInfoFUCHSIA;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBufferConstraintsInfoFUCHSIA;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BufferConstraintsInfoFUCHSIA( VULKAN_HPP_NAMESPACE::BufferCreateInfo                       createInfo_                  = {},\n                                                       VULKAN_HPP_NAMESPACE::FormatFeatureFlags                     requiredFormatFeatures_      = {},\n                                                       VULKAN_HPP_NAMESPACE::BufferCollectionConstraintsInfoFUCHSIA bufferCollectionConstraints_ = {},\n                                                       const void *                                                 pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , createInfo{ createInfo_ }\n      , requiredFormatFeatures{ requiredFormatFeatures_ }\n      , bufferCollectionConstraints{ bufferCollectionConstraints_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BufferConstraintsInfoFUCHSIA( BufferConstraintsInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BufferConstraintsInfoFUCHSIA( VkBufferConstraintsInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BufferConstraintsInfoFUCHSIA( *reinterpret_cast<BufferConstraintsInfoFUCHSIA const *>( &rhs ) )\n    {\n    }\n\n    BufferConstraintsInfoFUCHSIA & operator=( BufferConstraintsInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BufferConstraintsInfoFUCHSIA & operator=( VkBufferConstraintsInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BufferConstraintsInfoFUCHSIA const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BufferConstraintsInfoFUCHSIA & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferConstraintsInfoFUCHSIA & setCreateInfo( VULKAN_HPP_NAMESPACE::BufferCreateInfo const & createInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      createInfo = createInfo_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferConstraintsInfoFUCHSIA &\n      setRequiredFormatFeatures( VULKAN_HPP_NAMESPACE::FormatFeatureFlags requiredFormatFeatures_ ) VULKAN_HPP_NOEXCEPT\n    {\n      requiredFormatFeatures = requiredFormatFeatures_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferConstraintsInfoFUCHSIA &\n      setBufferCollectionConstraints( VULKAN_HPP_NAMESPACE::BufferCollectionConstraintsInfoFUCHSIA const & bufferCollectionConstraints_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferCollectionConstraints = bufferCollectionConstraints_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBufferConstraintsInfoFUCHSIA const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBufferConstraintsInfoFUCHSIA *>( this );\n    }\n\n    operator VkBufferConstraintsInfoFUCHSIA &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBufferConstraintsInfoFUCHSIA *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::BufferCreateInfo const &,\n               VULKAN_HPP_NAMESPACE::FormatFeatureFlags const &,\n               VULKAN_HPP_NAMESPACE::BufferCollectionConstraintsInfoFUCHSIA const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, createInfo, requiredFormatFeatures, bufferCollectionConstraints );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BufferConstraintsInfoFUCHSIA const & ) const = default;\n#  else\n    bool operator==( BufferConstraintsInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( createInfo == rhs.createInfo ) && ( requiredFormatFeatures == rhs.requiredFormatFeatures ) &&\n             ( bufferCollectionConstraints == rhs.bufferCollectionConstraints );\n#    endif\n    }\n\n    bool operator!=( BufferConstraintsInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                          sType                       = StructureType::eBufferConstraintsInfoFUCHSIA;\n    const void *                                                 pNext                       = {};\n    VULKAN_HPP_NAMESPACE::BufferCreateInfo                       createInfo                  = {};\n    VULKAN_HPP_NAMESPACE::FormatFeatureFlags                     requiredFormatFeatures      = {};\n    VULKAN_HPP_NAMESPACE::BufferCollectionConstraintsInfoFUCHSIA bufferCollectionConstraints = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBufferConstraintsInfoFUCHSIA>\n  {\n    using Type = BufferConstraintsInfoFUCHSIA;\n  };\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  struct BufferCopy\n  {\n    using NativeType = VkBufferCopy;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BufferCopy( VULKAN_HPP_NAMESPACE::DeviceSize srcOffset_ = {},\n                                     VULKAN_HPP_NAMESPACE::DeviceSize dstOffset_ = {},\n                                     VULKAN_HPP_NAMESPACE::DeviceSize size_      = {} ) VULKAN_HPP_NOEXCEPT\n      : srcOffset{ srcOffset_ }\n      , dstOffset{ dstOffset_ }\n      , size{ size_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BufferCopy( BufferCopy const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BufferCopy( VkBufferCopy const & rhs ) VULKAN_HPP_NOEXCEPT : BufferCopy( *reinterpret_cast<BufferCopy const *>( &rhs ) ) {}\n\n    BufferCopy & operator=( BufferCopy const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BufferCopy & operator=( VkBufferCopy const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BufferCopy const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BufferCopy & setSrcOffset( VULKAN_HPP_NAMESPACE::DeviceSize srcOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcOffset = srcOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferCopy & setDstOffset( VULKAN_HPP_NAMESPACE::DeviceSize dstOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstOffset = dstOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferCopy & setSize( VULKAN_HPP_NAMESPACE::DeviceSize size_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size = size_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBufferCopy const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBufferCopy *>( this );\n    }\n\n    operator VkBufferCopy &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBufferCopy *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DeviceSize const &, VULKAN_HPP_NAMESPACE::DeviceSize const &, VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( srcOffset, dstOffset, size );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BufferCopy const & ) const = default;\n#else\n    bool operator==( BufferCopy const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( srcOffset == rhs.srcOffset ) && ( dstOffset == rhs.dstOffset ) && ( size == rhs.size );\n#  endif\n    }\n\n    bool operator!=( BufferCopy const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DeviceSize srcOffset = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize dstOffset = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize size      = {};\n  };\n\n  struct BufferCopy2\n  {\n    using NativeType = VkBufferCopy2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBufferCopy2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BufferCopy2( VULKAN_HPP_NAMESPACE::DeviceSize srcOffset_ = {},\n                                      VULKAN_HPP_NAMESPACE::DeviceSize dstOffset_ = {},\n                                      VULKAN_HPP_NAMESPACE::DeviceSize size_      = {},\n                                      const void *                     pNext_     = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , srcOffset{ srcOffset_ }\n      , dstOffset{ dstOffset_ }\n      , size{ size_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BufferCopy2( BufferCopy2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BufferCopy2( VkBufferCopy2 const & rhs ) VULKAN_HPP_NOEXCEPT : BufferCopy2( *reinterpret_cast<BufferCopy2 const *>( &rhs ) ) {}\n\n    BufferCopy2 & operator=( BufferCopy2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BufferCopy2 & operator=( VkBufferCopy2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BufferCopy2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BufferCopy2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferCopy2 & setSrcOffset( VULKAN_HPP_NAMESPACE::DeviceSize srcOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcOffset = srcOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferCopy2 & setDstOffset( VULKAN_HPP_NAMESPACE::DeviceSize dstOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstOffset = dstOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferCopy2 & setSize( VULKAN_HPP_NAMESPACE::DeviceSize size_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size = size_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBufferCopy2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBufferCopy2 *>( this );\n    }\n\n    operator VkBufferCopy2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBufferCopy2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, srcOffset, dstOffset, size );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BufferCopy2 const & ) const = default;\n#else\n    bool operator==( BufferCopy2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( srcOffset == rhs.srcOffset ) && ( dstOffset == rhs.dstOffset ) && ( size == rhs.size );\n#  endif\n    }\n\n    bool operator!=( BufferCopy2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType     = StructureType::eBufferCopy2;\n    const void *                        pNext     = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    srcOffset = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    dstOffset = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    size      = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBufferCopy2>\n  {\n    using Type = BufferCopy2;\n  };\n\n  using BufferCopy2KHR = BufferCopy2;\n\n  struct BufferDeviceAddressCreateInfoEXT\n  {\n    using NativeType = VkBufferDeviceAddressCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBufferDeviceAddressCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BufferDeviceAddressCreateInfoEXT( VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress_ = {},\n                                                           const void *                        pNext_         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , deviceAddress{ deviceAddress_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BufferDeviceAddressCreateInfoEXT( BufferDeviceAddressCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BufferDeviceAddressCreateInfoEXT( VkBufferDeviceAddressCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BufferDeviceAddressCreateInfoEXT( *reinterpret_cast<BufferDeviceAddressCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    BufferDeviceAddressCreateInfoEXT & operator=( BufferDeviceAddressCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BufferDeviceAddressCreateInfoEXT & operator=( VkBufferDeviceAddressCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BufferDeviceAddressCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BufferDeviceAddressCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferDeviceAddressCreateInfoEXT & setDeviceAddress( VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceAddress = deviceAddress_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBufferDeviceAddressCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBufferDeviceAddressCreateInfoEXT *>( this );\n    }\n\n    operator VkBufferDeviceAddressCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBufferDeviceAddressCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::DeviceAddress const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, deviceAddress );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BufferDeviceAddressCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( BufferDeviceAddressCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( deviceAddress == rhs.deviceAddress );\n#  endif\n    }\n\n    bool operator!=( BufferDeviceAddressCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType         = StructureType::eBufferDeviceAddressCreateInfoEXT;\n    const void *                        pNext         = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBufferDeviceAddressCreateInfoEXT>\n  {\n    using Type = BufferDeviceAddressCreateInfoEXT;\n  };\n\n  struct BufferDeviceAddressInfo\n  {\n    using NativeType = VkBufferDeviceAddressInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBufferDeviceAddressInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BufferDeviceAddressInfo( VULKAN_HPP_NAMESPACE::Buffer buffer_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , buffer{ buffer_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BufferDeviceAddressInfo( BufferDeviceAddressInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BufferDeviceAddressInfo( VkBufferDeviceAddressInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BufferDeviceAddressInfo( *reinterpret_cast<BufferDeviceAddressInfo const *>( &rhs ) )\n    {\n    }\n\n    BufferDeviceAddressInfo & operator=( BufferDeviceAddressInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BufferDeviceAddressInfo & operator=( VkBufferDeviceAddressInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BufferDeviceAddressInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferDeviceAddressInfo & setBuffer( VULKAN_HPP_NAMESPACE::Buffer buffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      buffer = buffer_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBufferDeviceAddressInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBufferDeviceAddressInfo *>( this );\n    }\n\n    operator VkBufferDeviceAddressInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBufferDeviceAddressInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Buffer const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, buffer );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BufferDeviceAddressInfo const & ) const = default;\n#else\n    bool operator==( BufferDeviceAddressInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( buffer == rhs.buffer );\n#  endif\n    }\n\n    bool operator!=( BufferDeviceAddressInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType  = StructureType::eBufferDeviceAddressInfo;\n    const void *                        pNext  = {};\n    VULKAN_HPP_NAMESPACE::Buffer        buffer = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBufferDeviceAddressInfo>\n  {\n    using Type = BufferDeviceAddressInfo;\n  };\n\n  using BufferDeviceAddressInfoEXT = BufferDeviceAddressInfo;\n  using BufferDeviceAddressInfoKHR = BufferDeviceAddressInfo;\n\n  struct BufferImageCopy\n  {\n    using NativeType = VkBufferImageCopy;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BufferImageCopy( VULKAN_HPP_NAMESPACE::DeviceSize             bufferOffset_      = {},\n                                          uint32_t                                     bufferRowLength_   = {},\n                                          uint32_t                                     bufferImageHeight_ = {},\n                                          VULKAN_HPP_NAMESPACE::ImageSubresourceLayers imageSubresource_  = {},\n                                          VULKAN_HPP_NAMESPACE::Offset3D               imageOffset_       = {},\n                                          VULKAN_HPP_NAMESPACE::Extent3D               imageExtent_       = {} ) VULKAN_HPP_NOEXCEPT\n      : bufferOffset{ bufferOffset_ }\n      , bufferRowLength{ bufferRowLength_ }\n      , bufferImageHeight{ bufferImageHeight_ }\n      , imageSubresource{ imageSubresource_ }\n      , imageOffset{ imageOffset_ }\n      , imageExtent{ imageExtent_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BufferImageCopy( BufferImageCopy const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BufferImageCopy( VkBufferImageCopy const & rhs ) VULKAN_HPP_NOEXCEPT : BufferImageCopy( *reinterpret_cast<BufferImageCopy const *>( &rhs ) ) {}\n\n    BufferImageCopy & operator=( BufferImageCopy const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BufferImageCopy & operator=( VkBufferImageCopy const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BufferImageCopy const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BufferImageCopy & setBufferOffset( VULKAN_HPP_NAMESPACE::DeviceSize bufferOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferOffset = bufferOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferImageCopy & setBufferRowLength( uint32_t bufferRowLength_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferRowLength = bufferRowLength_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferImageCopy & setBufferImageHeight( uint32_t bufferImageHeight_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferImageHeight = bufferImageHeight_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferImageCopy & setImageSubresource( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const & imageSubresource_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageSubresource = imageSubresource_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferImageCopy & setImageOffset( VULKAN_HPP_NAMESPACE::Offset3D const & imageOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageOffset = imageOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferImageCopy & setImageExtent( VULKAN_HPP_NAMESPACE::Extent3D const & imageExtent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageExtent = imageExtent_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBufferImageCopy const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBufferImageCopy *>( this );\n    }\n\n    operator VkBufferImageCopy &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBufferImageCopy *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const &,\n               VULKAN_HPP_NAMESPACE::Offset3D const &,\n               VULKAN_HPP_NAMESPACE::Extent3D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( bufferOffset, bufferRowLength, bufferImageHeight, imageSubresource, imageOffset, imageExtent );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BufferImageCopy const & ) const = default;\n#else\n    bool operator==( BufferImageCopy const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( bufferOffset == rhs.bufferOffset ) && ( bufferRowLength == rhs.bufferRowLength ) && ( bufferImageHeight == rhs.bufferImageHeight ) &&\n             ( imageSubresource == rhs.imageSubresource ) && ( imageOffset == rhs.imageOffset ) && ( imageExtent == rhs.imageExtent );\n#  endif\n    }\n\n    bool operator!=( BufferImageCopy const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DeviceSize             bufferOffset      = {};\n    uint32_t                                     bufferRowLength   = {};\n    uint32_t                                     bufferImageHeight = {};\n    VULKAN_HPP_NAMESPACE::ImageSubresourceLayers imageSubresource  = {};\n    VULKAN_HPP_NAMESPACE::Offset3D               imageOffset       = {};\n    VULKAN_HPP_NAMESPACE::Extent3D               imageExtent       = {};\n  };\n\n  struct BufferImageCopy2\n  {\n    using NativeType = VkBufferImageCopy2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBufferImageCopy2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BufferImageCopy2( VULKAN_HPP_NAMESPACE::DeviceSize             bufferOffset_      = {},\n                                           uint32_t                                     bufferRowLength_   = {},\n                                           uint32_t                                     bufferImageHeight_ = {},\n                                           VULKAN_HPP_NAMESPACE::ImageSubresourceLayers imageSubresource_  = {},\n                                           VULKAN_HPP_NAMESPACE::Offset3D               imageOffset_       = {},\n                                           VULKAN_HPP_NAMESPACE::Extent3D               imageExtent_       = {},\n                                           const void *                                 pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , bufferOffset{ bufferOffset_ }\n      , bufferRowLength{ bufferRowLength_ }\n      , bufferImageHeight{ bufferImageHeight_ }\n      , imageSubresource{ imageSubresource_ }\n      , imageOffset{ imageOffset_ }\n      , imageExtent{ imageExtent_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BufferImageCopy2( BufferImageCopy2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BufferImageCopy2( VkBufferImageCopy2 const & rhs ) VULKAN_HPP_NOEXCEPT : BufferImageCopy2( *reinterpret_cast<BufferImageCopy2 const *>( &rhs ) ) {}\n\n    BufferImageCopy2 & operator=( BufferImageCopy2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BufferImageCopy2 & operator=( VkBufferImageCopy2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BufferImageCopy2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BufferImageCopy2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferImageCopy2 & setBufferOffset( VULKAN_HPP_NAMESPACE::DeviceSize bufferOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferOffset = bufferOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferImageCopy2 & setBufferRowLength( uint32_t bufferRowLength_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferRowLength = bufferRowLength_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferImageCopy2 & setBufferImageHeight( uint32_t bufferImageHeight_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferImageHeight = bufferImageHeight_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferImageCopy2 & setImageSubresource( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const & imageSubresource_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageSubresource = imageSubresource_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferImageCopy2 & setImageOffset( VULKAN_HPP_NAMESPACE::Offset3D const & imageOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageOffset = imageOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferImageCopy2 & setImageExtent( VULKAN_HPP_NAMESPACE::Extent3D const & imageExtent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageExtent = imageExtent_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBufferImageCopy2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBufferImageCopy2 *>( this );\n    }\n\n    operator VkBufferImageCopy2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBufferImageCopy2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const &,\n               VULKAN_HPP_NAMESPACE::Offset3D const &,\n               VULKAN_HPP_NAMESPACE::Extent3D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, bufferOffset, bufferRowLength, bufferImageHeight, imageSubresource, imageOffset, imageExtent );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BufferImageCopy2 const & ) const = default;\n#else\n    bool operator==( BufferImageCopy2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( bufferOffset == rhs.bufferOffset ) && ( bufferRowLength == rhs.bufferRowLength ) &&\n             ( bufferImageHeight == rhs.bufferImageHeight ) && ( imageSubresource == rhs.imageSubresource ) && ( imageOffset == rhs.imageOffset ) &&\n             ( imageExtent == rhs.imageExtent );\n#  endif\n    }\n\n    bool operator!=( BufferImageCopy2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType             = StructureType::eBufferImageCopy2;\n    const void *                                 pNext             = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize             bufferOffset      = {};\n    uint32_t                                     bufferRowLength   = {};\n    uint32_t                                     bufferImageHeight = {};\n    VULKAN_HPP_NAMESPACE::ImageSubresourceLayers imageSubresource  = {};\n    VULKAN_HPP_NAMESPACE::Offset3D               imageOffset       = {};\n    VULKAN_HPP_NAMESPACE::Extent3D               imageExtent       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBufferImageCopy2>\n  {\n    using Type = BufferImageCopy2;\n  };\n\n  using BufferImageCopy2KHR = BufferImageCopy2;\n\n  struct BufferMemoryBarrier\n  {\n    using NativeType = VkBufferMemoryBarrier;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBufferMemoryBarrier;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BufferMemoryBarrier( VULKAN_HPP_NAMESPACE::AccessFlags srcAccessMask_       = {},\n                                              VULKAN_HPP_NAMESPACE::AccessFlags dstAccessMask_       = {},\n                                              uint32_t                          srcQueueFamilyIndex_ = {},\n                                              uint32_t                          dstQueueFamilyIndex_ = {},\n                                              VULKAN_HPP_NAMESPACE::Buffer      buffer_              = {},\n                                              VULKAN_HPP_NAMESPACE::DeviceSize  offset_              = {},\n                                              VULKAN_HPP_NAMESPACE::DeviceSize  size_                = {},\n                                              const void *                      pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , srcAccessMask{ srcAccessMask_ }\n      , dstAccessMask{ dstAccessMask_ }\n      , srcQueueFamilyIndex{ srcQueueFamilyIndex_ }\n      , dstQueueFamilyIndex{ dstQueueFamilyIndex_ }\n      , buffer{ buffer_ }\n      , offset{ offset_ }\n      , size{ size_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BufferMemoryBarrier( BufferMemoryBarrier const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BufferMemoryBarrier( VkBufferMemoryBarrier const & rhs ) VULKAN_HPP_NOEXCEPT : BufferMemoryBarrier( *reinterpret_cast<BufferMemoryBarrier const *>( &rhs ) )\n    {\n    }\n\n    BufferMemoryBarrier & operator=( BufferMemoryBarrier const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BufferMemoryBarrier & operator=( VkBufferMemoryBarrier const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BufferMemoryBarrier const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BufferMemoryBarrier & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferMemoryBarrier & setSrcAccessMask( VULKAN_HPP_NAMESPACE::AccessFlags srcAccessMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcAccessMask = srcAccessMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferMemoryBarrier & setDstAccessMask( VULKAN_HPP_NAMESPACE::AccessFlags dstAccessMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstAccessMask = dstAccessMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferMemoryBarrier & setSrcQueueFamilyIndex( uint32_t srcQueueFamilyIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcQueueFamilyIndex = srcQueueFamilyIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferMemoryBarrier & setDstQueueFamilyIndex( uint32_t dstQueueFamilyIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstQueueFamilyIndex = dstQueueFamilyIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferMemoryBarrier & setBuffer( VULKAN_HPP_NAMESPACE::Buffer buffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      buffer = buffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferMemoryBarrier & setOffset( VULKAN_HPP_NAMESPACE::DeviceSize offset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      offset = offset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferMemoryBarrier & setSize( VULKAN_HPP_NAMESPACE::DeviceSize size_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size = size_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBufferMemoryBarrier const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBufferMemoryBarrier *>( this );\n    }\n\n    operator VkBufferMemoryBarrier &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBufferMemoryBarrier *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::AccessFlags const &,\n               VULKAN_HPP_NAMESPACE::AccessFlags const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Buffer const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, srcAccessMask, dstAccessMask, srcQueueFamilyIndex, dstQueueFamilyIndex, buffer, offset, size );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BufferMemoryBarrier const & ) const = default;\n#else\n    bool operator==( BufferMemoryBarrier const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( srcAccessMask == rhs.srcAccessMask ) && ( dstAccessMask == rhs.dstAccessMask ) &&\n             ( srcQueueFamilyIndex == rhs.srcQueueFamilyIndex ) && ( dstQueueFamilyIndex == rhs.dstQueueFamilyIndex ) && ( buffer == rhs.buffer ) &&\n             ( offset == rhs.offset ) && ( size == rhs.size );\n#  endif\n    }\n\n    bool operator!=( BufferMemoryBarrier const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType               = StructureType::eBufferMemoryBarrier;\n    const void *                        pNext               = {};\n    VULKAN_HPP_NAMESPACE::AccessFlags   srcAccessMask       = {};\n    VULKAN_HPP_NAMESPACE::AccessFlags   dstAccessMask       = {};\n    uint32_t                            srcQueueFamilyIndex = {};\n    uint32_t                            dstQueueFamilyIndex = {};\n    VULKAN_HPP_NAMESPACE::Buffer        buffer              = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    offset              = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    size                = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBufferMemoryBarrier>\n  {\n    using Type = BufferMemoryBarrier;\n  };\n\n  struct BufferMemoryBarrier2\n  {\n    using NativeType = VkBufferMemoryBarrier2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBufferMemoryBarrier2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BufferMemoryBarrier2( VULKAN_HPP_NAMESPACE::PipelineStageFlags2 srcStageMask_        = {},\n                                               VULKAN_HPP_NAMESPACE::AccessFlags2        srcAccessMask_       = {},\n                                               VULKAN_HPP_NAMESPACE::PipelineStageFlags2 dstStageMask_        = {},\n                                               VULKAN_HPP_NAMESPACE::AccessFlags2        dstAccessMask_       = {},\n                                               uint32_t                                  srcQueueFamilyIndex_ = {},\n                                               uint32_t                                  dstQueueFamilyIndex_ = {},\n                                               VULKAN_HPP_NAMESPACE::Buffer              buffer_              = {},\n                                               VULKAN_HPP_NAMESPACE::DeviceSize          offset_              = {},\n                                               VULKAN_HPP_NAMESPACE::DeviceSize          size_                = {},\n                                               const void *                              pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , srcStageMask{ srcStageMask_ }\n      , srcAccessMask{ srcAccessMask_ }\n      , dstStageMask{ dstStageMask_ }\n      , dstAccessMask{ dstAccessMask_ }\n      , srcQueueFamilyIndex{ srcQueueFamilyIndex_ }\n      , dstQueueFamilyIndex{ dstQueueFamilyIndex_ }\n      , buffer{ buffer_ }\n      , offset{ offset_ }\n      , size{ size_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BufferMemoryBarrier2( BufferMemoryBarrier2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BufferMemoryBarrier2( VkBufferMemoryBarrier2 const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BufferMemoryBarrier2( *reinterpret_cast<BufferMemoryBarrier2 const *>( &rhs ) )\n    {\n    }\n\n    BufferMemoryBarrier2 & operator=( BufferMemoryBarrier2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BufferMemoryBarrier2 & operator=( VkBufferMemoryBarrier2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BufferMemoryBarrier2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BufferMemoryBarrier2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferMemoryBarrier2 & setSrcStageMask( VULKAN_HPP_NAMESPACE::PipelineStageFlags2 srcStageMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcStageMask = srcStageMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferMemoryBarrier2 & setSrcAccessMask( VULKAN_HPP_NAMESPACE::AccessFlags2 srcAccessMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcAccessMask = srcAccessMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferMemoryBarrier2 & setDstStageMask( VULKAN_HPP_NAMESPACE::PipelineStageFlags2 dstStageMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstStageMask = dstStageMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferMemoryBarrier2 & setDstAccessMask( VULKAN_HPP_NAMESPACE::AccessFlags2 dstAccessMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstAccessMask = dstAccessMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferMemoryBarrier2 & setSrcQueueFamilyIndex( uint32_t srcQueueFamilyIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcQueueFamilyIndex = srcQueueFamilyIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferMemoryBarrier2 & setDstQueueFamilyIndex( uint32_t dstQueueFamilyIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstQueueFamilyIndex = dstQueueFamilyIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferMemoryBarrier2 & setBuffer( VULKAN_HPP_NAMESPACE::Buffer buffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      buffer = buffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferMemoryBarrier2 & setOffset( VULKAN_HPP_NAMESPACE::DeviceSize offset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      offset = offset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferMemoryBarrier2 & setSize( VULKAN_HPP_NAMESPACE::DeviceSize size_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size = size_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBufferMemoryBarrier2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBufferMemoryBarrier2 *>( this );\n    }\n\n    operator VkBufferMemoryBarrier2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBufferMemoryBarrier2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineStageFlags2 const &,\n               VULKAN_HPP_NAMESPACE::AccessFlags2 const &,\n               VULKAN_HPP_NAMESPACE::PipelineStageFlags2 const &,\n               VULKAN_HPP_NAMESPACE::AccessFlags2 const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Buffer const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, srcStageMask, srcAccessMask, dstStageMask, dstAccessMask, srcQueueFamilyIndex, dstQueueFamilyIndex, buffer, offset, size );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BufferMemoryBarrier2 const & ) const = default;\n#else\n    bool operator==( BufferMemoryBarrier2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( srcStageMask == rhs.srcStageMask ) && ( srcAccessMask == rhs.srcAccessMask ) &&\n             ( dstStageMask == rhs.dstStageMask ) && ( dstAccessMask == rhs.dstAccessMask ) && ( srcQueueFamilyIndex == rhs.srcQueueFamilyIndex ) &&\n             ( dstQueueFamilyIndex == rhs.dstQueueFamilyIndex ) && ( buffer == rhs.buffer ) && ( offset == rhs.offset ) && ( size == rhs.size );\n#  endif\n    }\n\n    bool operator!=( BufferMemoryBarrier2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType               = StructureType::eBufferMemoryBarrier2;\n    const void *                              pNext               = {};\n    VULKAN_HPP_NAMESPACE::PipelineStageFlags2 srcStageMask        = {};\n    VULKAN_HPP_NAMESPACE::AccessFlags2        srcAccessMask       = {};\n    VULKAN_HPP_NAMESPACE::PipelineStageFlags2 dstStageMask        = {};\n    VULKAN_HPP_NAMESPACE::AccessFlags2        dstAccessMask       = {};\n    uint32_t                                  srcQueueFamilyIndex = {};\n    uint32_t                                  dstQueueFamilyIndex = {};\n    VULKAN_HPP_NAMESPACE::Buffer              buffer              = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize          offset              = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize          size                = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBufferMemoryBarrier2>\n  {\n    using Type = BufferMemoryBarrier2;\n  };\n\n  using BufferMemoryBarrier2KHR = BufferMemoryBarrier2;\n\n  struct BufferMemoryRequirementsInfo2\n  {\n    using NativeType = VkBufferMemoryRequirementsInfo2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBufferMemoryRequirementsInfo2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BufferMemoryRequirementsInfo2( VULKAN_HPP_NAMESPACE::Buffer buffer_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , buffer{ buffer_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BufferMemoryRequirementsInfo2( BufferMemoryRequirementsInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BufferMemoryRequirementsInfo2( VkBufferMemoryRequirementsInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BufferMemoryRequirementsInfo2( *reinterpret_cast<BufferMemoryRequirementsInfo2 const *>( &rhs ) )\n    {\n    }\n\n    BufferMemoryRequirementsInfo2 & operator=( BufferMemoryRequirementsInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BufferMemoryRequirementsInfo2 & operator=( VkBufferMemoryRequirementsInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BufferMemoryRequirementsInfo2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferMemoryRequirementsInfo2 & setBuffer( VULKAN_HPP_NAMESPACE::Buffer buffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      buffer = buffer_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBufferMemoryRequirementsInfo2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBufferMemoryRequirementsInfo2 *>( this );\n    }\n\n    operator VkBufferMemoryRequirementsInfo2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBufferMemoryRequirementsInfo2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Buffer const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, buffer );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BufferMemoryRequirementsInfo2 const & ) const = default;\n#else\n    bool operator==( BufferMemoryRequirementsInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( buffer == rhs.buffer );\n#  endif\n    }\n\n    bool operator!=( BufferMemoryRequirementsInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType  = StructureType::eBufferMemoryRequirementsInfo2;\n    const void *                        pNext  = {};\n    VULKAN_HPP_NAMESPACE::Buffer        buffer = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBufferMemoryRequirementsInfo2>\n  {\n    using Type = BufferMemoryRequirementsInfo2;\n  };\n\n  using BufferMemoryRequirementsInfo2KHR = BufferMemoryRequirementsInfo2;\n\n  struct BufferOpaqueCaptureAddressCreateInfo\n  {\n    using NativeType = VkBufferOpaqueCaptureAddressCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBufferOpaqueCaptureAddressCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BufferOpaqueCaptureAddressCreateInfo( uint64_t opaqueCaptureAddress_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , opaqueCaptureAddress{ opaqueCaptureAddress_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BufferOpaqueCaptureAddressCreateInfo( BufferOpaqueCaptureAddressCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BufferOpaqueCaptureAddressCreateInfo( VkBufferOpaqueCaptureAddressCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BufferOpaqueCaptureAddressCreateInfo( *reinterpret_cast<BufferOpaqueCaptureAddressCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    BufferOpaqueCaptureAddressCreateInfo & operator=( BufferOpaqueCaptureAddressCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BufferOpaqueCaptureAddressCreateInfo & operator=( VkBufferOpaqueCaptureAddressCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BufferOpaqueCaptureAddressCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BufferOpaqueCaptureAddressCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferOpaqueCaptureAddressCreateInfo & setOpaqueCaptureAddress( uint64_t opaqueCaptureAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      opaqueCaptureAddress = opaqueCaptureAddress_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBufferOpaqueCaptureAddressCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBufferOpaqueCaptureAddressCreateInfo *>( this );\n    }\n\n    operator VkBufferOpaqueCaptureAddressCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBufferOpaqueCaptureAddressCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, opaqueCaptureAddress );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BufferOpaqueCaptureAddressCreateInfo const & ) const = default;\n#else\n    bool operator==( BufferOpaqueCaptureAddressCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( opaqueCaptureAddress == rhs.opaqueCaptureAddress );\n#  endif\n    }\n\n    bool operator!=( BufferOpaqueCaptureAddressCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                = StructureType::eBufferOpaqueCaptureAddressCreateInfo;\n    const void *                        pNext                = {};\n    uint64_t                            opaqueCaptureAddress = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBufferOpaqueCaptureAddressCreateInfo>\n  {\n    using Type = BufferOpaqueCaptureAddressCreateInfo;\n  };\n\n  using BufferOpaqueCaptureAddressCreateInfoKHR = BufferOpaqueCaptureAddressCreateInfo;\n\n  struct BufferUsageFlags2CreateInfo\n  {\n    using NativeType = VkBufferUsageFlags2CreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBufferUsageFlags2CreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BufferUsageFlags2CreateInfo( VULKAN_HPP_NAMESPACE::BufferUsageFlags2 usage_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , usage{ usage_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BufferUsageFlags2CreateInfo( BufferUsageFlags2CreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BufferUsageFlags2CreateInfo( VkBufferUsageFlags2CreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BufferUsageFlags2CreateInfo( *reinterpret_cast<BufferUsageFlags2CreateInfo const *>( &rhs ) )\n    {\n    }\n\n    BufferUsageFlags2CreateInfo & operator=( BufferUsageFlags2CreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BufferUsageFlags2CreateInfo & operator=( VkBufferUsageFlags2CreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BufferUsageFlags2CreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BufferUsageFlags2CreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferUsageFlags2CreateInfo & setUsage( VULKAN_HPP_NAMESPACE::BufferUsageFlags2 usage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      usage = usage_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBufferUsageFlags2CreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBufferUsageFlags2CreateInfo *>( this );\n    }\n\n    operator VkBufferUsageFlags2CreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBufferUsageFlags2CreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::BufferUsageFlags2 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, usage );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BufferUsageFlags2CreateInfo const & ) const = default;\n#else\n    bool operator==( BufferUsageFlags2CreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( usage == rhs.usage );\n#  endif\n    }\n\n    bool operator!=( BufferUsageFlags2CreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType     sType = StructureType::eBufferUsageFlags2CreateInfo;\n    const void *                            pNext = {};\n    VULKAN_HPP_NAMESPACE::BufferUsageFlags2 usage = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBufferUsageFlags2CreateInfo>\n  {\n    using Type = BufferUsageFlags2CreateInfo;\n  };\n\n  using BufferUsageFlags2CreateInfoKHR = BufferUsageFlags2CreateInfo;\n\n  struct BufferViewCreateInfo\n  {\n    using NativeType = VkBufferViewCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBufferViewCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BufferViewCreateInfo( VULKAN_HPP_NAMESPACE::BufferViewCreateFlags flags_  = {},\n                                               VULKAN_HPP_NAMESPACE::Buffer                buffer_ = {},\n                                               VULKAN_HPP_NAMESPACE::Format                format_ = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                               VULKAN_HPP_NAMESPACE::DeviceSize            offset_ = {},\n                                               VULKAN_HPP_NAMESPACE::DeviceSize            range_  = {},\n                                               const void *                                pNext_  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , buffer{ buffer_ }\n      , format{ format_ }\n      , offset{ offset_ }\n      , range{ range_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BufferViewCreateInfo( BufferViewCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BufferViewCreateInfo( VkBufferViewCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BufferViewCreateInfo( *reinterpret_cast<BufferViewCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    BufferViewCreateInfo & operator=( BufferViewCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BufferViewCreateInfo & operator=( VkBufferViewCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BufferViewCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BufferViewCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferViewCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::BufferViewCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferViewCreateInfo & setBuffer( VULKAN_HPP_NAMESPACE::Buffer buffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      buffer = buffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferViewCreateInfo & setFormat( VULKAN_HPP_NAMESPACE::Format format_ ) VULKAN_HPP_NOEXCEPT\n    {\n      format = format_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferViewCreateInfo & setOffset( VULKAN_HPP_NAMESPACE::DeviceSize offset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      offset = offset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BufferViewCreateInfo & setRange( VULKAN_HPP_NAMESPACE::DeviceSize range_ ) VULKAN_HPP_NOEXCEPT\n    {\n      range = range_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBufferViewCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBufferViewCreateInfo *>( this );\n    }\n\n    operator VkBufferViewCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBufferViewCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::BufferViewCreateFlags const &,\n               VULKAN_HPP_NAMESPACE::Buffer const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, buffer, format, offset, range );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BufferViewCreateInfo const & ) const = default;\n#else\n    bool operator==( BufferViewCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( buffer == rhs.buffer ) && ( format == rhs.format ) &&\n             ( offset == rhs.offset ) && ( range == rhs.range );\n#  endif\n    }\n\n    bool operator!=( BufferViewCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType         sType  = StructureType::eBufferViewCreateInfo;\n    const void *                                pNext  = {};\n    VULKAN_HPP_NAMESPACE::BufferViewCreateFlags flags  = {};\n    VULKAN_HPP_NAMESPACE::Buffer                buffer = {};\n    VULKAN_HPP_NAMESPACE::Format                format = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::DeviceSize            offset = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize            range  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBufferViewCreateInfo>\n  {\n    using Type = BufferViewCreateInfo;\n  };\n\n  struct StridedDeviceAddressNV\n  {\n    using NativeType = VkStridedDeviceAddressNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR StridedDeviceAddressNV( VULKAN_HPP_NAMESPACE::DeviceAddress startAddress_  = {},\n                                                 VULKAN_HPP_NAMESPACE::DeviceSize    strideInBytes_ = {} ) VULKAN_HPP_NOEXCEPT\n      : startAddress{ startAddress_ }\n      , strideInBytes{ strideInBytes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR StridedDeviceAddressNV( StridedDeviceAddressNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    StridedDeviceAddressNV( VkStridedDeviceAddressNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : StridedDeviceAddressNV( *reinterpret_cast<StridedDeviceAddressNV const *>( &rhs ) )\n    {\n    }\n\n    StridedDeviceAddressNV & operator=( StridedDeviceAddressNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    StridedDeviceAddressNV & operator=( VkStridedDeviceAddressNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::StridedDeviceAddressNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 StridedDeviceAddressNV & setStartAddress( VULKAN_HPP_NAMESPACE::DeviceAddress startAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      startAddress = startAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 StridedDeviceAddressNV & setStrideInBytes( VULKAN_HPP_NAMESPACE::DeviceSize strideInBytes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      strideInBytes = strideInBytes_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkStridedDeviceAddressNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkStridedDeviceAddressNV *>( this );\n    }\n\n    operator VkStridedDeviceAddressNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkStridedDeviceAddressNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DeviceAddress const &, VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( startAddress, strideInBytes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( StridedDeviceAddressNV const & ) const = default;\n#else\n    bool operator==( StridedDeviceAddressNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( startAddress == rhs.startAddress ) && ( strideInBytes == rhs.strideInBytes );\n#  endif\n    }\n\n    bool operator!=( StridedDeviceAddressNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DeviceAddress startAddress  = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    strideInBytes = {};\n  };\n\n  struct BuildPartitionedAccelerationStructureIndirectCommandNV\n  {\n    using NativeType = VkBuildPartitionedAccelerationStructureIndirectCommandNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BuildPartitionedAccelerationStructureIndirectCommandNV(\n      VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureOpTypeNV opType_   = VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureOpTypeNV::eWriteInstance,\n      uint32_t                                                       argCount_ = {},\n      VULKAN_HPP_NAMESPACE::StridedDeviceAddressNV                   argData_  = {} ) VULKAN_HPP_NOEXCEPT\n      : opType{ opType_ }\n      , argCount{ argCount_ }\n      , argData{ argData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BuildPartitionedAccelerationStructureIndirectCommandNV( BuildPartitionedAccelerationStructureIndirectCommandNV const & rhs )\n      VULKAN_HPP_NOEXCEPT = default;\n\n    BuildPartitionedAccelerationStructureIndirectCommandNV( VkBuildPartitionedAccelerationStructureIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BuildPartitionedAccelerationStructureIndirectCommandNV( *reinterpret_cast<BuildPartitionedAccelerationStructureIndirectCommandNV const *>( &rhs ) )\n    {\n    }\n\n    BuildPartitionedAccelerationStructureIndirectCommandNV &\n      operator=( BuildPartitionedAccelerationStructureIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BuildPartitionedAccelerationStructureIndirectCommandNV &\n      operator=( VkBuildPartitionedAccelerationStructureIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BuildPartitionedAccelerationStructureIndirectCommandNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BuildPartitionedAccelerationStructureIndirectCommandNV &\n      setOpType( VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureOpTypeNV opType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      opType = opType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BuildPartitionedAccelerationStructureIndirectCommandNV & setArgCount( uint32_t argCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      argCount = argCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BuildPartitionedAccelerationStructureIndirectCommandNV &\n      setArgData( VULKAN_HPP_NAMESPACE::StridedDeviceAddressNV const & argData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      argData = argData_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBuildPartitionedAccelerationStructureIndirectCommandNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBuildPartitionedAccelerationStructureIndirectCommandNV *>( this );\n    }\n\n    operator VkBuildPartitionedAccelerationStructureIndirectCommandNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBuildPartitionedAccelerationStructureIndirectCommandNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureOpTypeNV const &, uint32_t const &, VULKAN_HPP_NAMESPACE::StridedDeviceAddressNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( opType, argCount, argData );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BuildPartitionedAccelerationStructureIndirectCommandNV const & ) const = default;\n#else\n    bool operator==( BuildPartitionedAccelerationStructureIndirectCommandNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( opType == rhs.opType ) && ( argCount == rhs.argCount ) && ( argData == rhs.argData );\n#  endif\n    }\n\n    bool operator!=( BuildPartitionedAccelerationStructureIndirectCommandNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureOpTypeNV opType   = VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureOpTypeNV::eWriteInstance;\n    uint32_t                                                       argCount = {};\n    VULKAN_HPP_NAMESPACE::StridedDeviceAddressNV                   argData  = {};\n  };\n\n  struct PartitionedAccelerationStructureInstancesInputNV\n  {\n    using NativeType = VkPartitionedAccelerationStructureInstancesInputNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePartitionedAccelerationStructureInstancesInputNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PartitionedAccelerationStructureInstancesInputNV( VULKAN_HPP_NAMESPACE::BuildAccelerationStructureFlagsKHR flags_         = {},\n                                                                           uint32_t                                                 instanceCount_ = {},\n                                                                           uint32_t maxInstancePerPartitionCount_                                  = {},\n                                                                           uint32_t partitionCount_                                                = {},\n                                                                           uint32_t maxInstanceInGlobalPartitionCount_                             = {},\n                                                                           void *   pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , instanceCount{ instanceCount_ }\n      , maxInstancePerPartitionCount{ maxInstancePerPartitionCount_ }\n      , partitionCount{ partitionCount_ }\n      , maxInstanceInGlobalPartitionCount{ maxInstanceInGlobalPartitionCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PartitionedAccelerationStructureInstancesInputNV( PartitionedAccelerationStructureInstancesInputNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PartitionedAccelerationStructureInstancesInputNV( VkPartitionedAccelerationStructureInstancesInputNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PartitionedAccelerationStructureInstancesInputNV( *reinterpret_cast<PartitionedAccelerationStructureInstancesInputNV const *>( &rhs ) )\n    {\n    }\n\n    PartitionedAccelerationStructureInstancesInputNV & operator=( PartitionedAccelerationStructureInstancesInputNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PartitionedAccelerationStructureInstancesInputNV & operator=( VkPartitionedAccelerationStructureInstancesInputNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureInstancesInputNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PartitionedAccelerationStructureInstancesInputNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PartitionedAccelerationStructureInstancesInputNV &\n      setFlags( VULKAN_HPP_NAMESPACE::BuildAccelerationStructureFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PartitionedAccelerationStructureInstancesInputNV & setInstanceCount( uint32_t instanceCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      instanceCount = instanceCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PartitionedAccelerationStructureInstancesInputNV &\n      setMaxInstancePerPartitionCount( uint32_t maxInstancePerPartitionCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxInstancePerPartitionCount = maxInstancePerPartitionCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PartitionedAccelerationStructureInstancesInputNV & setPartitionCount( uint32_t partitionCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      partitionCount = partitionCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PartitionedAccelerationStructureInstancesInputNV &\n      setMaxInstanceInGlobalPartitionCount( uint32_t maxInstanceInGlobalPartitionCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxInstanceInGlobalPartitionCount = maxInstanceInGlobalPartitionCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPartitionedAccelerationStructureInstancesInputNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPartitionedAccelerationStructureInstancesInputNV *>( this );\n    }\n\n    operator VkPartitionedAccelerationStructureInstancesInputNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPartitionedAccelerationStructureInstancesInputNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::BuildAccelerationStructureFlagsKHR const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, instanceCount, maxInstancePerPartitionCount, partitionCount, maxInstanceInGlobalPartitionCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PartitionedAccelerationStructureInstancesInputNV const & ) const = default;\n#else\n    bool operator==( PartitionedAccelerationStructureInstancesInputNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( instanceCount == rhs.instanceCount ) &&\n             ( maxInstancePerPartitionCount == rhs.maxInstancePerPartitionCount ) && ( partitionCount == rhs.partitionCount ) &&\n             ( maxInstanceInGlobalPartitionCount == rhs.maxInstanceInGlobalPartitionCount );\n#  endif\n    }\n\n    bool operator!=( PartitionedAccelerationStructureInstancesInputNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                      sType                        = StructureType::ePartitionedAccelerationStructureInstancesInputNV;\n    void *                                                   pNext                        = {};\n    VULKAN_HPP_NAMESPACE::BuildAccelerationStructureFlagsKHR flags                        = {};\n    uint32_t                                                 instanceCount                = {};\n    uint32_t                                                 maxInstancePerPartitionCount = {};\n    uint32_t                                                 partitionCount               = {};\n    uint32_t                                                 maxInstanceInGlobalPartitionCount = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePartitionedAccelerationStructureInstancesInputNV>\n  {\n    using Type = PartitionedAccelerationStructureInstancesInputNV;\n  };\n\n  struct BuildPartitionedAccelerationStructureInfoNV\n  {\n    using NativeType = VkBuildPartitionedAccelerationStructureInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eBuildPartitionedAccelerationStructureInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR BuildPartitionedAccelerationStructureInfoNV( VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureInstancesInputNV input_ = {},\n                                                                      VULKAN_HPP_NAMESPACE::DeviceAddress srcAccelerationStructureData_             = {},\n                                                                      VULKAN_HPP_NAMESPACE::DeviceAddress dstAccelerationStructureData_             = {},\n                                                                      VULKAN_HPP_NAMESPACE::DeviceAddress scratchData_                              = {},\n                                                                      VULKAN_HPP_NAMESPACE::DeviceAddress srcInfos_                                 = {},\n                                                                      VULKAN_HPP_NAMESPACE::DeviceAddress srcInfosCount_                            = {},\n                                                                      void *                              pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , input{ input_ }\n      , srcAccelerationStructureData{ srcAccelerationStructureData_ }\n      , dstAccelerationStructureData{ dstAccelerationStructureData_ }\n      , scratchData{ scratchData_ }\n      , srcInfos{ srcInfos_ }\n      , srcInfosCount{ srcInfosCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR BuildPartitionedAccelerationStructureInfoNV( BuildPartitionedAccelerationStructureInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    BuildPartitionedAccelerationStructureInfoNV( VkBuildPartitionedAccelerationStructureInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : BuildPartitionedAccelerationStructureInfoNV( *reinterpret_cast<BuildPartitionedAccelerationStructureInfoNV const *>( &rhs ) )\n    {\n    }\n\n    BuildPartitionedAccelerationStructureInfoNV & operator=( BuildPartitionedAccelerationStructureInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    BuildPartitionedAccelerationStructureInfoNV & operator=( VkBuildPartitionedAccelerationStructureInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::BuildPartitionedAccelerationStructureInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 BuildPartitionedAccelerationStructureInfoNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BuildPartitionedAccelerationStructureInfoNV &\n      setInput( VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureInstancesInputNV const & input_ ) VULKAN_HPP_NOEXCEPT\n    {\n      input = input_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BuildPartitionedAccelerationStructureInfoNV &\n      setSrcAccelerationStructureData( VULKAN_HPP_NAMESPACE::DeviceAddress srcAccelerationStructureData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcAccelerationStructureData = srcAccelerationStructureData_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BuildPartitionedAccelerationStructureInfoNV &\n      setDstAccelerationStructureData( VULKAN_HPP_NAMESPACE::DeviceAddress dstAccelerationStructureData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstAccelerationStructureData = dstAccelerationStructureData_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BuildPartitionedAccelerationStructureInfoNV & setScratchData( VULKAN_HPP_NAMESPACE::DeviceAddress scratchData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      scratchData = scratchData_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BuildPartitionedAccelerationStructureInfoNV & setSrcInfos( VULKAN_HPP_NAMESPACE::DeviceAddress srcInfos_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcInfos = srcInfos_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 BuildPartitionedAccelerationStructureInfoNV &\n      setSrcInfosCount( VULKAN_HPP_NAMESPACE::DeviceAddress srcInfosCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcInfosCount = srcInfosCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkBuildPartitionedAccelerationStructureInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkBuildPartitionedAccelerationStructureInfoNV *>( this );\n    }\n\n    operator VkBuildPartitionedAccelerationStructureInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkBuildPartitionedAccelerationStructureInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureInstancesInputNV const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, input, srcAccelerationStructureData, dstAccelerationStructureData, scratchData, srcInfos, srcInfosCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( BuildPartitionedAccelerationStructureInfoNV const & ) const = default;\n#else\n    bool operator==( BuildPartitionedAccelerationStructureInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( input == rhs.input ) &&\n             ( srcAccelerationStructureData == rhs.srcAccelerationStructureData ) && ( dstAccelerationStructureData == rhs.dstAccelerationStructureData ) &&\n             ( scratchData == rhs.scratchData ) && ( srcInfos == rhs.srcInfos ) && ( srcInfosCount == rhs.srcInfosCount );\n#  endif\n    }\n\n    bool operator!=( BuildPartitionedAccelerationStructureInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                    sType = StructureType::eBuildPartitionedAccelerationStructureInfoNV;\n    void *                                                                 pNext = {};\n    VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureInstancesInputNV input = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress                                    srcAccelerationStructureData = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress                                    dstAccelerationStructureData = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress                                    scratchData                  = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress                                    srcInfos                     = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress                                    srcInfosCount                = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eBuildPartitionedAccelerationStructureInfoNV>\n  {\n    using Type = BuildPartitionedAccelerationStructureInfoNV;\n  };\n\n  struct CalibratedTimestampInfoKHR\n  {\n    using NativeType = VkCalibratedTimestampInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCalibratedTimestampInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CalibratedTimestampInfoKHR( VULKAN_HPP_NAMESPACE::TimeDomainKHR timeDomain_ = VULKAN_HPP_NAMESPACE::TimeDomainKHR::eDevice,\n                                                     const void *                        pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , timeDomain{ timeDomain_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CalibratedTimestampInfoKHR( CalibratedTimestampInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CalibratedTimestampInfoKHR( VkCalibratedTimestampInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CalibratedTimestampInfoKHR( *reinterpret_cast<CalibratedTimestampInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    CalibratedTimestampInfoKHR & operator=( CalibratedTimestampInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CalibratedTimestampInfoKHR & operator=( VkCalibratedTimestampInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CalibratedTimestampInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CalibratedTimestampInfoKHR & setTimeDomain( VULKAN_HPP_NAMESPACE::TimeDomainKHR timeDomain_ ) VULKAN_HPP_NOEXCEPT\n    {\n      timeDomain = timeDomain_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCalibratedTimestampInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCalibratedTimestampInfoKHR *>( this );\n    }\n\n    operator VkCalibratedTimestampInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCalibratedTimestampInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::TimeDomainKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, timeDomain );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CalibratedTimestampInfoKHR const & ) const = default;\n#else\n    bool operator==( CalibratedTimestampInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( timeDomain == rhs.timeDomain );\n#  endif\n    }\n\n    bool operator!=( CalibratedTimestampInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType      = StructureType::eCalibratedTimestampInfoKHR;\n    const void *                        pNext      = {};\n    VULKAN_HPP_NAMESPACE::TimeDomainKHR timeDomain = VULKAN_HPP_NAMESPACE::TimeDomainKHR::eDevice;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCalibratedTimestampInfoKHR>\n  {\n    using Type = CalibratedTimestampInfoKHR;\n  };\n\n  using CalibratedTimestampInfoEXT = CalibratedTimestampInfoKHR;\n\n  struct CheckpointData2NV\n  {\n    using NativeType = VkCheckpointData2NV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCheckpointData2NV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      CheckpointData2NV( VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stage_ = {}, void * pCheckpointMarker_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stage{ stage_ }\n      , pCheckpointMarker{ pCheckpointMarker_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CheckpointData2NV( CheckpointData2NV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CheckpointData2NV( VkCheckpointData2NV const & rhs ) VULKAN_HPP_NOEXCEPT : CheckpointData2NV( *reinterpret_cast<CheckpointData2NV const *>( &rhs ) ) {}\n\n    CheckpointData2NV & operator=( CheckpointData2NV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CheckpointData2NV & operator=( VkCheckpointData2NV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CheckpointData2NV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkCheckpointData2NV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCheckpointData2NV *>( this );\n    }\n\n    operator VkCheckpointData2NV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCheckpointData2NV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::PipelineStageFlags2 const &, void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stage, pCheckpointMarker );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CheckpointData2NV const & ) const = default;\n#else\n    bool operator==( CheckpointData2NV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( stage == rhs.stage ) && ( pCheckpointMarker == rhs.pCheckpointMarker );\n#  endif\n    }\n\n    bool operator!=( CheckpointData2NV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType             = StructureType::eCheckpointData2NV;\n    void *                                    pNext             = {};\n    VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stage             = {};\n    void *                                    pCheckpointMarker = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCheckpointData2NV>\n  {\n    using Type = CheckpointData2NV;\n  };\n\n  struct CheckpointDataNV\n  {\n    using NativeType = VkCheckpointDataNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCheckpointDataNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CheckpointDataNV( VULKAN_HPP_NAMESPACE::PipelineStageFlagBits stage_ = VULKAN_HPP_NAMESPACE::PipelineStageFlagBits::eTopOfPipe,\n                                           void *                                      pCheckpointMarker_ = {},\n                                           void *                                      pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stage{ stage_ }\n      , pCheckpointMarker{ pCheckpointMarker_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CheckpointDataNV( CheckpointDataNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CheckpointDataNV( VkCheckpointDataNV const & rhs ) VULKAN_HPP_NOEXCEPT : CheckpointDataNV( *reinterpret_cast<CheckpointDataNV const *>( &rhs ) ) {}\n\n    CheckpointDataNV & operator=( CheckpointDataNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CheckpointDataNV & operator=( VkCheckpointDataNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CheckpointDataNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkCheckpointDataNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCheckpointDataNV *>( this );\n    }\n\n    operator VkCheckpointDataNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCheckpointDataNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::PipelineStageFlagBits const &, void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stage, pCheckpointMarker );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CheckpointDataNV const & ) const = default;\n#else\n    bool operator==( CheckpointDataNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( stage == rhs.stage ) && ( pCheckpointMarker == rhs.pCheckpointMarker );\n#  endif\n    }\n\n    bool operator!=( CheckpointDataNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType         sType             = StructureType::eCheckpointDataNV;\n    void *                                      pNext             = {};\n    VULKAN_HPP_NAMESPACE::PipelineStageFlagBits stage             = VULKAN_HPP_NAMESPACE::PipelineStageFlagBits::eTopOfPipe;\n    void *                                      pCheckpointMarker = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCheckpointDataNV>\n  {\n    using Type = CheckpointDataNV;\n  };\n\n  union ClearColorValue\n  {\n    using NativeType = VkClearColorValue;\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )\n\n    VULKAN_HPP_CONSTEXPR_14 ClearColorValue( const std::array<float, 4> & float32_ = {} ) : float32( float32_ ) {}\n\n    VULKAN_HPP_CONSTEXPR ClearColorValue( float float32_0, float float32_1, float float32_2, float float32_3 )\n      : float32{ { { float32_0, float32_1, float32_2, float32_3 } } }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClearColorValue( const std::array<int32_t, 4> & int32_ ) : int32( int32_ ) {}\n\n    VULKAN_HPP_CONSTEXPR ClearColorValue( int32_t int32_0, int32_t int32_1, int32_t int32_2, int32_t int32_3 )\n      : int32{ { { int32_0, int32_1, int32_2, int32_3 } } }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClearColorValue( const std::array<uint32_t, 4> & uint32_ ) : uint32( uint32_ ) {}\n\n    VULKAN_HPP_CONSTEXPR ClearColorValue( uint32_t uint32_0, uint32_t uint32_1, uint32_t uint32_2, uint32_t uint32_3 )\n      : uint32{ { { uint32_0, uint32_1, uint32_2, uint32_3 } } }\n    {\n    }\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_UNION_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ClearColorValue & setFloat32( std::array<float, 4> float32_ ) VULKAN_HPP_NOEXCEPT\n    {\n      float32 = float32_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClearColorValue & setInt32( std::array<int32_t, 4> int32_ ) VULKAN_HPP_NOEXCEPT\n    {\n      int32 = int32_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClearColorValue & setUint32( std::array<uint32_t, 4> uint32_ ) VULKAN_HPP_NOEXCEPT\n    {\n      uint32 = uint32_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkClearColorValue const &() const\n    {\n      return *reinterpret_cast<const VkClearColorValue *>( this );\n    }\n\n    operator VkClearColorValue &()\n    {\n      return *reinterpret_cast<VkClearColorValue *>( this );\n    }\n\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<float, 4>    float32;\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int32_t, 4>  int32;\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 4> uint32;\n  };\n\n  struct ClearDepthStencilValue\n  {\n    using NativeType = VkClearDepthStencilValue;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ClearDepthStencilValue( float depth_ = {}, uint32_t stencil_ = {} ) VULKAN_HPP_NOEXCEPT\n      : depth{ depth_ }\n      , stencil{ stencil_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ClearDepthStencilValue( ClearDepthStencilValue const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ClearDepthStencilValue( VkClearDepthStencilValue const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ClearDepthStencilValue( *reinterpret_cast<ClearDepthStencilValue const *>( &rhs ) )\n    {\n    }\n\n    ClearDepthStencilValue & operator=( ClearDepthStencilValue const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ClearDepthStencilValue & operator=( VkClearDepthStencilValue const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ClearDepthStencilValue const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ClearDepthStencilValue & setDepth( float depth_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depth = depth_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClearDepthStencilValue & setStencil( uint32_t stencil_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stencil = stencil_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkClearDepthStencilValue const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkClearDepthStencilValue *>( this );\n    }\n\n    operator VkClearDepthStencilValue &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkClearDepthStencilValue *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<float const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( depth, stencil );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ClearDepthStencilValue const & ) const = default;\n#else\n    bool operator==( ClearDepthStencilValue const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( depth == rhs.depth ) && ( stencil == rhs.stencil );\n#  endif\n    }\n\n    bool operator!=( ClearDepthStencilValue const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    float    depth   = {};\n    uint32_t stencil = {};\n  };\n\n  union ClearValue\n  {\n    using NativeType = VkClearValue;\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )\n\n    VULKAN_HPP_CONSTEXPR_14 ClearValue( VULKAN_HPP_NAMESPACE::ClearColorValue color_ = {} ) : color( color_ ) {}\n\n    VULKAN_HPP_CONSTEXPR_14 ClearValue( VULKAN_HPP_NAMESPACE::ClearDepthStencilValue depthStencil_ ) : depthStencil( depthStencil_ ) {}\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_UNION_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ClearValue & setColor( VULKAN_HPP_NAMESPACE::ClearColorValue const & color_ ) VULKAN_HPP_NOEXCEPT\n    {\n      color = color_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClearValue & setDepthStencil( VULKAN_HPP_NAMESPACE::ClearDepthStencilValue const & depthStencil_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthStencil = depthStencil_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkClearValue const &() const\n    {\n      return *reinterpret_cast<const VkClearValue *>( this );\n    }\n\n    operator VkClearValue &()\n    {\n      return *reinterpret_cast<VkClearValue *>( this );\n    }\n\n#ifdef VULKAN_HPP_HAS_UNRESTRICTED_UNIONS\n    VULKAN_HPP_NAMESPACE::ClearColorValue        color;\n    VULKAN_HPP_NAMESPACE::ClearDepthStencilValue depthStencil;\n#else\n    VkClearColorValue        color;\n    VkClearDepthStencilValue depthStencil;\n#endif /*VULKAN_HPP_HAS_UNRESTRICTED_UNIONS*/\n  };\n\n  struct ClearAttachment\n  {\n    using NativeType = VkClearAttachment;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 ClearAttachment( VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask_      = {},\n                                             uint32_t                               colorAttachment_ = {},\n                                             VULKAN_HPP_NAMESPACE::ClearValue       clearValue_      = {} ) VULKAN_HPP_NOEXCEPT\n      : aspectMask{ aspectMask_ }\n      , colorAttachment{ colorAttachment_ }\n      , clearValue{ clearValue_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClearAttachment( ClearAttachment const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ClearAttachment( VkClearAttachment const & rhs ) VULKAN_HPP_NOEXCEPT : ClearAttachment( *reinterpret_cast<ClearAttachment const *>( &rhs ) ) {}\n\n    ClearAttachment & operator=( ClearAttachment const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ClearAttachment & operator=( VkClearAttachment const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ClearAttachment const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ClearAttachment & setAspectMask( VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      aspectMask = aspectMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClearAttachment & setColorAttachment( uint32_t colorAttachment_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorAttachment = colorAttachment_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClearAttachment & setClearValue( VULKAN_HPP_NAMESPACE::ClearValue const & clearValue_ ) VULKAN_HPP_NOEXCEPT\n    {\n      clearValue = clearValue_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkClearAttachment const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkClearAttachment *>( this );\n    }\n\n    operator VkClearAttachment &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkClearAttachment *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::ImageAspectFlags const &, uint32_t const &, VULKAN_HPP_NAMESPACE::ClearValue const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( aspectMask, colorAttachment, clearValue );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask      = {};\n    uint32_t                               colorAttachment = {};\n    VULKAN_HPP_NAMESPACE::ClearValue       clearValue      = {};\n  };\n\n  struct ClearRect\n  {\n    using NativeType = VkClearRect;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ClearRect( VULKAN_HPP_NAMESPACE::Rect2D rect_ = {}, uint32_t baseArrayLayer_ = {}, uint32_t layerCount_ = {} ) VULKAN_HPP_NOEXCEPT\n      : rect{ rect_ }\n      , baseArrayLayer{ baseArrayLayer_ }\n      , layerCount{ layerCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ClearRect( ClearRect const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ClearRect( VkClearRect const & rhs ) VULKAN_HPP_NOEXCEPT : ClearRect( *reinterpret_cast<ClearRect const *>( &rhs ) ) {}\n\n    ClearRect & operator=( ClearRect const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ClearRect & operator=( VkClearRect const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ClearRect const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ClearRect & setRect( VULKAN_HPP_NAMESPACE::Rect2D const & rect_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rect = rect_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClearRect & setBaseArrayLayer( uint32_t baseArrayLayer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      baseArrayLayer = baseArrayLayer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClearRect & setLayerCount( uint32_t layerCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layerCount = layerCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkClearRect const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkClearRect *>( this );\n    }\n\n    operator VkClearRect &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkClearRect *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::Rect2D const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( rect, baseArrayLayer, layerCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ClearRect const & ) const = default;\n#else\n    bool                     operator==( ClearRect const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( rect == rhs.rect ) && ( baseArrayLayer == rhs.baseArrayLayer ) && ( layerCount == rhs.layerCount );\n#  endif\n    }\n\n    bool operator!=( ClearRect const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::Rect2D rect           = {};\n    uint32_t                     baseArrayLayer = {};\n    uint32_t                     layerCount     = {};\n  };\n\n  struct ClusterAccelerationStructureBuildClustersBottomLevelInfoNV\n  {\n    using NativeType = VkClusterAccelerationStructureBuildClustersBottomLevelInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      ClusterAccelerationStructureBuildClustersBottomLevelInfoNV( uint32_t                            clusterReferencesCount_  = {},\n                                                                  uint32_t                            clusterReferencesStride_ = {},\n                                                                  VULKAN_HPP_NAMESPACE::DeviceAddress clusterReferences_       = {} ) VULKAN_HPP_NOEXCEPT\n      : clusterReferencesCount{ clusterReferencesCount_ }\n      , clusterReferencesStride{ clusterReferencesStride_ }\n      , clusterReferences{ clusterReferences_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ClusterAccelerationStructureBuildClustersBottomLevelInfoNV( ClusterAccelerationStructureBuildClustersBottomLevelInfoNV const & rhs )\n      VULKAN_HPP_NOEXCEPT = default;\n\n    ClusterAccelerationStructureBuildClustersBottomLevelInfoNV( VkClusterAccelerationStructureBuildClustersBottomLevelInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ClusterAccelerationStructureBuildClustersBottomLevelInfoNV(\n          *reinterpret_cast<ClusterAccelerationStructureBuildClustersBottomLevelInfoNV const *>( &rhs ) )\n    {\n    }\n\n    ClusterAccelerationStructureBuildClustersBottomLevelInfoNV &\n      operator=( ClusterAccelerationStructureBuildClustersBottomLevelInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ClusterAccelerationStructureBuildClustersBottomLevelInfoNV &\n      operator=( VkClusterAccelerationStructureBuildClustersBottomLevelInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureBuildClustersBottomLevelInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildClustersBottomLevelInfoNV &\n      setClusterReferencesCount( uint32_t clusterReferencesCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      clusterReferencesCount = clusterReferencesCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildClustersBottomLevelInfoNV &\n      setClusterReferencesStride( uint32_t clusterReferencesStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      clusterReferencesStride = clusterReferencesStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildClustersBottomLevelInfoNV &\n      setClusterReferences( VULKAN_HPP_NAMESPACE::DeviceAddress clusterReferences_ ) VULKAN_HPP_NOEXCEPT\n    {\n      clusterReferences = clusterReferences_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkClusterAccelerationStructureBuildClustersBottomLevelInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkClusterAccelerationStructureBuildClustersBottomLevelInfoNV *>( this );\n    }\n\n    operator VkClusterAccelerationStructureBuildClustersBottomLevelInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkClusterAccelerationStructureBuildClustersBottomLevelInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &, VULKAN_HPP_NAMESPACE::DeviceAddress const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( clusterReferencesCount, clusterReferencesStride, clusterReferences );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ClusterAccelerationStructureBuildClustersBottomLevelInfoNV const & ) const = default;\n#else\n    bool operator==( ClusterAccelerationStructureBuildClustersBottomLevelInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( clusterReferencesCount == rhs.clusterReferencesCount ) && ( clusterReferencesStride == rhs.clusterReferencesStride ) &&\n             ( clusterReferences == rhs.clusterReferences );\n#  endif\n    }\n\n    bool operator!=( ClusterAccelerationStructureBuildClustersBottomLevelInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                            clusterReferencesCount  = {};\n    uint32_t                            clusterReferencesStride = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress clusterReferences       = {};\n  };\n\n  struct ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV\n  {\n    using NativeType = VkClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV( uint32_t geometryIndex_ = {},\n                                                                                      uint32_t reserved_      = {},\n                                                                                      uint32_t geometryFlags_ = {} ) VULKAN_HPP_NOEXCEPT\n      : geometryIndex{ geometryIndex_ }\n      , reserved{ reserved_ }\n      , geometryFlags{ geometryFlags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV( ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV const & rhs )\n      VULKAN_HPP_NOEXCEPT = default;\n\n    ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV( VkClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV(\n          *reinterpret_cast<ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV const *>( &rhs ) )\n    {\n    }\n\n    ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV &\n      operator=( ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV &\n      operator=( VkClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV & setGeometryIndex( uint32_t geometryIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      geometryIndex = geometryIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV & setReserved( uint32_t reserved_ ) VULKAN_HPP_NOEXCEPT\n    {\n      reserved = reserved_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV & setGeometryFlags( uint32_t geometryFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      geometryFlags = geometryFlags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV *>( this );\n    }\n\n    operator VkClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( geometryIndex, reserved, geometryFlags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV const & ) const = default;\n#else\n    bool operator==( ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( geometryIndex == rhs.geometryIndex ) && ( reserved == rhs.reserved ) && ( geometryFlags == rhs.geometryFlags );\n#  endif\n    }\n\n    bool operator!=( ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t geometryIndex : 24;\n    uint32_t reserved      : 5;\n    uint32_t geometryFlags : 3;\n  };\n\n  struct ClusterAccelerationStructureBuildTriangleClusterInfoNV\n  {\n    using NativeType = VkClusterAccelerationStructureBuildTriangleClusterInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ClusterAccelerationStructureBuildTriangleClusterInfoNV(\n      uint32_t                                                                          clusterID_                         = {},\n      VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureClusterFlagsNV                  clusterFlags_                      = {},\n      uint32_t                                                                          triangleCount_                     = {},\n      uint32_t                                                                          vertexCount_                       = {},\n      uint32_t                                                                          positionTruncateBitCount_          = {},\n      uint32_t                                                                          indexType_                         = {},\n      uint32_t                                                                          opacityMicromapIndexType_          = {},\n      VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV baseGeometryIndexAndGeometryFlags_ = {},\n      uint16_t                                                                          indexBufferStride_                 = {},\n      uint16_t                                                                          vertexBufferStride_                = {},\n      uint16_t                                                                          geometryIndexAndFlagsBufferStride_ = {},\n      uint16_t                                                                          opacityMicromapIndexBufferStride_  = {},\n      VULKAN_HPP_NAMESPACE::DeviceAddress                                               indexBuffer_                       = {},\n      VULKAN_HPP_NAMESPACE::DeviceAddress                                               vertexBuffer_                      = {},\n      VULKAN_HPP_NAMESPACE::DeviceAddress                                               geometryIndexAndFlagsBuffer_       = {},\n      VULKAN_HPP_NAMESPACE::DeviceAddress                                               opacityMicromapArray_              = {},\n      VULKAN_HPP_NAMESPACE::DeviceAddress                                               opacityMicromapIndexBuffer_        = {} ) VULKAN_HPP_NOEXCEPT\n      : clusterID{ clusterID_ }\n      , clusterFlags{ clusterFlags_ }\n      , triangleCount{ triangleCount_ }\n      , vertexCount{ vertexCount_ }\n      , positionTruncateBitCount{ positionTruncateBitCount_ }\n      , indexType{ indexType_ }\n      , opacityMicromapIndexType{ opacityMicromapIndexType_ }\n      , baseGeometryIndexAndGeometryFlags{ baseGeometryIndexAndGeometryFlags_ }\n      , indexBufferStride{ indexBufferStride_ }\n      , vertexBufferStride{ vertexBufferStride_ }\n      , geometryIndexAndFlagsBufferStride{ geometryIndexAndFlagsBufferStride_ }\n      , opacityMicromapIndexBufferStride{ opacityMicromapIndexBufferStride_ }\n      , indexBuffer{ indexBuffer_ }\n      , vertexBuffer{ vertexBuffer_ }\n      , geometryIndexAndFlagsBuffer{ geometryIndexAndFlagsBuffer_ }\n      , opacityMicromapArray{ opacityMicromapArray_ }\n      , opacityMicromapIndexBuffer{ opacityMicromapIndexBuffer_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ClusterAccelerationStructureBuildTriangleClusterInfoNV( ClusterAccelerationStructureBuildTriangleClusterInfoNV const & rhs )\n      VULKAN_HPP_NOEXCEPT = default;\n\n    ClusterAccelerationStructureBuildTriangleClusterInfoNV( VkClusterAccelerationStructureBuildTriangleClusterInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ClusterAccelerationStructureBuildTriangleClusterInfoNV( *reinterpret_cast<ClusterAccelerationStructureBuildTriangleClusterInfoNV const *>( &rhs ) )\n    {\n    }\n\n    ClusterAccelerationStructureBuildTriangleClusterInfoNV &\n      operator=( ClusterAccelerationStructureBuildTriangleClusterInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ClusterAccelerationStructureBuildTriangleClusterInfoNV &\n      operator=( VkClusterAccelerationStructureBuildTriangleClusterInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureBuildTriangleClusterInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterInfoNV & setClusterID( uint32_t clusterID_ ) VULKAN_HPP_NOEXCEPT\n    {\n      clusterID = clusterID_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterInfoNV &\n      setClusterFlags( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureClusterFlagsNV clusterFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      clusterFlags = clusterFlags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterInfoNV & setTriangleCount( uint32_t triangleCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      triangleCount = triangleCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterInfoNV & setVertexCount( uint32_t vertexCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexCount = vertexCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterInfoNV &\n      setPositionTruncateBitCount( uint32_t positionTruncateBitCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      positionTruncateBitCount = positionTruncateBitCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterInfoNV & setIndexType( uint32_t indexType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexType = indexType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterInfoNV &\n      setOpacityMicromapIndexType( uint32_t opacityMicromapIndexType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      opacityMicromapIndexType = opacityMicromapIndexType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterInfoNV & setBaseGeometryIndexAndGeometryFlags(\n      VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV const & baseGeometryIndexAndGeometryFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      baseGeometryIndexAndGeometryFlags = baseGeometryIndexAndGeometryFlags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterInfoNV & setIndexBufferStride( uint16_t indexBufferStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexBufferStride = indexBufferStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterInfoNV & setVertexBufferStride( uint16_t vertexBufferStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexBufferStride = vertexBufferStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterInfoNV &\n      setGeometryIndexAndFlagsBufferStride( uint16_t geometryIndexAndFlagsBufferStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      geometryIndexAndFlagsBufferStride = geometryIndexAndFlagsBufferStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterInfoNV &\n      setOpacityMicromapIndexBufferStride( uint16_t opacityMicromapIndexBufferStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      opacityMicromapIndexBufferStride = opacityMicromapIndexBufferStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterInfoNV &\n      setIndexBuffer( VULKAN_HPP_NAMESPACE::DeviceAddress indexBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexBuffer = indexBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterInfoNV &\n      setVertexBuffer( VULKAN_HPP_NAMESPACE::DeviceAddress vertexBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexBuffer = vertexBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterInfoNV &\n      setGeometryIndexAndFlagsBuffer( VULKAN_HPP_NAMESPACE::DeviceAddress geometryIndexAndFlagsBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      geometryIndexAndFlagsBuffer = geometryIndexAndFlagsBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterInfoNV &\n      setOpacityMicromapArray( VULKAN_HPP_NAMESPACE::DeviceAddress opacityMicromapArray_ ) VULKAN_HPP_NOEXCEPT\n    {\n      opacityMicromapArray = opacityMicromapArray_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterInfoNV &\n      setOpacityMicromapIndexBuffer( VULKAN_HPP_NAMESPACE::DeviceAddress opacityMicromapIndexBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      opacityMicromapIndexBuffer = opacityMicromapIndexBuffer_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkClusterAccelerationStructureBuildTriangleClusterInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkClusterAccelerationStructureBuildTriangleClusterInfoNV *>( this );\n    }\n\n    operator VkClusterAccelerationStructureBuildTriangleClusterInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkClusterAccelerationStructureBuildTriangleClusterInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureClusterFlagsNV const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV const &,\n               uint16_t const &,\n               uint16_t const &,\n               uint16_t const &,\n               uint16_t const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( clusterID,\n                       clusterFlags,\n                       triangleCount,\n                       vertexCount,\n                       positionTruncateBitCount,\n                       indexType,\n                       opacityMicromapIndexType,\n                       baseGeometryIndexAndGeometryFlags,\n                       indexBufferStride,\n                       vertexBufferStride,\n                       geometryIndexAndFlagsBufferStride,\n                       opacityMicromapIndexBufferStride,\n                       indexBuffer,\n                       vertexBuffer,\n                       geometryIndexAndFlagsBuffer,\n                       opacityMicromapArray,\n                       opacityMicromapIndexBuffer );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ClusterAccelerationStructureBuildTriangleClusterInfoNV const & ) const = default;\n#else\n    bool operator==( ClusterAccelerationStructureBuildTriangleClusterInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( clusterID == rhs.clusterID ) && ( clusterFlags == rhs.clusterFlags ) && ( triangleCount == rhs.triangleCount ) &&\n             ( vertexCount == rhs.vertexCount ) && ( positionTruncateBitCount == rhs.positionTruncateBitCount ) && ( indexType == rhs.indexType ) &&\n             ( opacityMicromapIndexType == rhs.opacityMicromapIndexType ) && ( baseGeometryIndexAndGeometryFlags == rhs.baseGeometryIndexAndGeometryFlags ) &&\n             ( indexBufferStride == rhs.indexBufferStride ) && ( vertexBufferStride == rhs.vertexBufferStride ) &&\n             ( geometryIndexAndFlagsBufferStride == rhs.geometryIndexAndFlagsBufferStride ) &&\n             ( opacityMicromapIndexBufferStride == rhs.opacityMicromapIndexBufferStride ) && ( indexBuffer == rhs.indexBuffer ) &&\n             ( vertexBuffer == rhs.vertexBuffer ) && ( geometryIndexAndFlagsBuffer == rhs.geometryIndexAndFlagsBuffer ) &&\n             ( opacityMicromapArray == rhs.opacityMicromapArray ) && ( opacityMicromapIndexBuffer == rhs.opacityMicromapIndexBuffer );\n#  endif\n    }\n\n    bool operator!=( ClusterAccelerationStructureBuildTriangleClusterInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                                                                          clusterID    = {};\n    VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureClusterFlagsNV                  clusterFlags = {};\n    uint32_t                                                                          triangleCount            : 9;\n    uint32_t                                                                          vertexCount              : 9;\n    uint32_t                                                                          positionTruncateBitCount : 6;\n    uint32_t                                                                          indexType                : 4;\n    uint32_t                                                                          opacityMicromapIndexType : 4;\n    VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV baseGeometryIndexAndGeometryFlags = {};\n    uint16_t                                                                          indexBufferStride                 = {};\n    uint16_t                                                                          vertexBufferStride                = {};\n    uint16_t                                                                          geometryIndexAndFlagsBufferStride = {};\n    uint16_t                                                                          opacityMicromapIndexBufferStride  = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress                                               indexBuffer                       = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress                                               vertexBuffer                      = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress                                               geometryIndexAndFlagsBuffer       = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress                                               opacityMicromapArray              = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress                                               opacityMicromapIndexBuffer        = {};\n  };\n\n  struct ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV\n  {\n    using NativeType = VkClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV(\n      uint32_t                                                                          clusterID_                         = {},\n      VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureClusterFlagsNV                  clusterFlags_                      = {},\n      uint32_t                                                                          triangleCount_                     = {},\n      uint32_t                                                                          vertexCount_                       = {},\n      uint32_t                                                                          positionTruncateBitCount_          = {},\n      uint32_t                                                                          indexType_                         = {},\n      uint32_t                                                                          opacityMicromapIndexType_          = {},\n      VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV baseGeometryIndexAndGeometryFlags_ = {},\n      uint16_t                                                                          indexBufferStride_                 = {},\n      uint16_t                                                                          vertexBufferStride_                = {},\n      uint16_t                                                                          geometryIndexAndFlagsBufferStride_ = {},\n      uint16_t                                                                          opacityMicromapIndexBufferStride_  = {},\n      VULKAN_HPP_NAMESPACE::DeviceAddress                                               indexBuffer_                       = {},\n      VULKAN_HPP_NAMESPACE::DeviceAddress                                               vertexBuffer_                      = {},\n      VULKAN_HPP_NAMESPACE::DeviceAddress                                               geometryIndexAndFlagsBuffer_       = {},\n      VULKAN_HPP_NAMESPACE::DeviceAddress                                               opacityMicromapArray_              = {},\n      VULKAN_HPP_NAMESPACE::DeviceAddress                                               opacityMicromapIndexBuffer_        = {},\n      VULKAN_HPP_NAMESPACE::DeviceAddress                                               instantiationBoundingBoxLimit_     = {} ) VULKAN_HPP_NOEXCEPT\n      : clusterID{ clusterID_ }\n      , clusterFlags{ clusterFlags_ }\n      , triangleCount{ triangleCount_ }\n      , vertexCount{ vertexCount_ }\n      , positionTruncateBitCount{ positionTruncateBitCount_ }\n      , indexType{ indexType_ }\n      , opacityMicromapIndexType{ opacityMicromapIndexType_ }\n      , baseGeometryIndexAndGeometryFlags{ baseGeometryIndexAndGeometryFlags_ }\n      , indexBufferStride{ indexBufferStride_ }\n      , vertexBufferStride{ vertexBufferStride_ }\n      , geometryIndexAndFlagsBufferStride{ geometryIndexAndFlagsBufferStride_ }\n      , opacityMicromapIndexBufferStride{ opacityMicromapIndexBufferStride_ }\n      , indexBuffer{ indexBuffer_ }\n      , vertexBuffer{ vertexBuffer_ }\n      , geometryIndexAndFlagsBuffer{ geometryIndexAndFlagsBuffer_ }\n      , opacityMicromapArray{ opacityMicromapArray_ }\n      , opacityMicromapIndexBuffer{ opacityMicromapIndexBuffer_ }\n      , instantiationBoundingBoxLimit{ instantiationBoundingBoxLimit_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV(\n      ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV( VkClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV const & rhs )\n      VULKAN_HPP_NOEXCEPT\n      : ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV(\n          *reinterpret_cast<ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV const *>( &rhs ) )\n    {\n    }\n\n    explicit ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV(\n      ClusterAccelerationStructureBuildTriangleClusterInfoNV const & clusterAccelerationStructureBuildTriangleClusterInfoNV,\n      VULKAN_HPP_NAMESPACE::DeviceAddress                            instantiationBoundingBoxLimit_ = {} )\n      : clusterID( clusterAccelerationStructureBuildTriangleClusterInfoNV.clusterID )\n      , clusterFlags( clusterAccelerationStructureBuildTriangleClusterInfoNV.clusterFlags )\n      , triangleCount( clusterAccelerationStructureBuildTriangleClusterInfoNV.triangleCount )\n      , vertexCount( clusterAccelerationStructureBuildTriangleClusterInfoNV.vertexCount )\n      , positionTruncateBitCount( clusterAccelerationStructureBuildTriangleClusterInfoNV.positionTruncateBitCount )\n      , indexType( clusterAccelerationStructureBuildTriangleClusterInfoNV.indexType )\n      , opacityMicromapIndexType( clusterAccelerationStructureBuildTriangleClusterInfoNV.opacityMicromapIndexType )\n      , baseGeometryIndexAndGeometryFlags( clusterAccelerationStructureBuildTriangleClusterInfoNV.baseGeometryIndexAndGeometryFlags )\n      , indexBufferStride( clusterAccelerationStructureBuildTriangleClusterInfoNV.indexBufferStride )\n      , vertexBufferStride( clusterAccelerationStructureBuildTriangleClusterInfoNV.vertexBufferStride )\n      , geometryIndexAndFlagsBufferStride( clusterAccelerationStructureBuildTriangleClusterInfoNV.geometryIndexAndFlagsBufferStride )\n      , opacityMicromapIndexBufferStride( clusterAccelerationStructureBuildTriangleClusterInfoNV.opacityMicromapIndexBufferStride )\n      , indexBuffer( clusterAccelerationStructureBuildTriangleClusterInfoNV.indexBuffer )\n      , vertexBuffer( clusterAccelerationStructureBuildTriangleClusterInfoNV.vertexBuffer )\n      , geometryIndexAndFlagsBuffer( clusterAccelerationStructureBuildTriangleClusterInfoNV.geometryIndexAndFlagsBuffer )\n      , opacityMicromapArray( clusterAccelerationStructureBuildTriangleClusterInfoNV.opacityMicromapArray )\n      , opacityMicromapIndexBuffer( clusterAccelerationStructureBuildTriangleClusterInfoNV.opacityMicromapIndexBuffer )\n      , instantiationBoundingBoxLimit( instantiationBoundingBoxLimit_ )\n    {\n    }\n\n    ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV &\n      operator=( ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV &\n      operator=( VkClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV & setClusterID( uint32_t clusterID_ ) VULKAN_HPP_NOEXCEPT\n    {\n      clusterID = clusterID_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV &\n      setClusterFlags( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureClusterFlagsNV clusterFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      clusterFlags = clusterFlags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV & setTriangleCount( uint32_t triangleCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      triangleCount = triangleCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV & setVertexCount( uint32_t vertexCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexCount = vertexCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV &\n      setPositionTruncateBitCount( uint32_t positionTruncateBitCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      positionTruncateBitCount = positionTruncateBitCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV & setIndexType( uint32_t indexType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexType = indexType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV &\n      setOpacityMicromapIndexType( uint32_t opacityMicromapIndexType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      opacityMicromapIndexType = opacityMicromapIndexType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV & setBaseGeometryIndexAndGeometryFlags(\n      VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV const & baseGeometryIndexAndGeometryFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      baseGeometryIndexAndGeometryFlags = baseGeometryIndexAndGeometryFlags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV &\n      setIndexBufferStride( uint16_t indexBufferStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexBufferStride = indexBufferStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV &\n      setVertexBufferStride( uint16_t vertexBufferStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexBufferStride = vertexBufferStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV &\n      setGeometryIndexAndFlagsBufferStride( uint16_t geometryIndexAndFlagsBufferStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      geometryIndexAndFlagsBufferStride = geometryIndexAndFlagsBufferStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV &\n      setOpacityMicromapIndexBufferStride( uint16_t opacityMicromapIndexBufferStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      opacityMicromapIndexBufferStride = opacityMicromapIndexBufferStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV &\n      setIndexBuffer( VULKAN_HPP_NAMESPACE::DeviceAddress indexBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexBuffer = indexBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV &\n      setVertexBuffer( VULKAN_HPP_NAMESPACE::DeviceAddress vertexBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexBuffer = vertexBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV &\n      setGeometryIndexAndFlagsBuffer( VULKAN_HPP_NAMESPACE::DeviceAddress geometryIndexAndFlagsBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      geometryIndexAndFlagsBuffer = geometryIndexAndFlagsBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV &\n      setOpacityMicromapArray( VULKAN_HPP_NAMESPACE::DeviceAddress opacityMicromapArray_ ) VULKAN_HPP_NOEXCEPT\n    {\n      opacityMicromapArray = opacityMicromapArray_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV &\n      setOpacityMicromapIndexBuffer( VULKAN_HPP_NAMESPACE::DeviceAddress opacityMicromapIndexBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      opacityMicromapIndexBuffer = opacityMicromapIndexBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV &\n      setInstantiationBoundingBoxLimit( VULKAN_HPP_NAMESPACE::DeviceAddress instantiationBoundingBoxLimit_ ) VULKAN_HPP_NOEXCEPT\n    {\n      instantiationBoundingBoxLimit = instantiationBoundingBoxLimit_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV *>( this );\n    }\n\n    operator VkClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureClusterFlagsNV const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV const &,\n               uint16_t const &,\n               uint16_t const &,\n               uint16_t const &,\n               uint16_t const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( clusterID,\n                       clusterFlags,\n                       triangleCount,\n                       vertexCount,\n                       positionTruncateBitCount,\n                       indexType,\n                       opacityMicromapIndexType,\n                       baseGeometryIndexAndGeometryFlags,\n                       indexBufferStride,\n                       vertexBufferStride,\n                       geometryIndexAndFlagsBufferStride,\n                       opacityMicromapIndexBufferStride,\n                       indexBuffer,\n                       vertexBuffer,\n                       geometryIndexAndFlagsBuffer,\n                       opacityMicromapArray,\n                       opacityMicromapIndexBuffer,\n                       instantiationBoundingBoxLimit );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV const & ) const = default;\n#else\n    bool operator==( ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( clusterID == rhs.clusterID ) && ( clusterFlags == rhs.clusterFlags ) && ( triangleCount == rhs.triangleCount ) &&\n             ( vertexCount == rhs.vertexCount ) && ( positionTruncateBitCount == rhs.positionTruncateBitCount ) && ( indexType == rhs.indexType ) &&\n             ( opacityMicromapIndexType == rhs.opacityMicromapIndexType ) && ( baseGeometryIndexAndGeometryFlags == rhs.baseGeometryIndexAndGeometryFlags ) &&\n             ( indexBufferStride == rhs.indexBufferStride ) && ( vertexBufferStride == rhs.vertexBufferStride ) &&\n             ( geometryIndexAndFlagsBufferStride == rhs.geometryIndexAndFlagsBufferStride ) &&\n             ( opacityMicromapIndexBufferStride == rhs.opacityMicromapIndexBufferStride ) && ( indexBuffer == rhs.indexBuffer ) &&\n             ( vertexBuffer == rhs.vertexBuffer ) && ( geometryIndexAndFlagsBuffer == rhs.geometryIndexAndFlagsBuffer ) &&\n             ( opacityMicromapArray == rhs.opacityMicromapArray ) && ( opacityMicromapIndexBuffer == rhs.opacityMicromapIndexBuffer ) &&\n             ( instantiationBoundingBoxLimit == rhs.instantiationBoundingBoxLimit );\n#  endif\n    }\n\n    bool operator!=( ClusterAccelerationStructureBuildTriangleClusterTemplateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                                                                          clusterID    = {};\n    VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureClusterFlagsNV                  clusterFlags = {};\n    uint32_t                                                                          triangleCount            : 9;\n    uint32_t                                                                          vertexCount              : 9;\n    uint32_t                                                                          positionTruncateBitCount : 6;\n    uint32_t                                                                          indexType                : 4;\n    uint32_t                                                                          opacityMicromapIndexType : 4;\n    VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV baseGeometryIndexAndGeometryFlags = {};\n    uint16_t                                                                          indexBufferStride                 = {};\n    uint16_t                                                                          vertexBufferStride                = {};\n    uint16_t                                                                          geometryIndexAndFlagsBufferStride = {};\n    uint16_t                                                                          opacityMicromapIndexBufferStride  = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress                                               indexBuffer                       = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress                                               vertexBuffer                      = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress                                               geometryIndexAndFlagsBuffer       = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress                                               opacityMicromapArray              = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress                                               opacityMicromapIndexBuffer        = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress                                               instantiationBoundingBoxLimit     = {};\n  };\n\n  struct ClusterAccelerationStructureClustersBottomLevelInputNV\n  {\n    using NativeType = VkClusterAccelerationStructureClustersBottomLevelInputNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eClusterAccelerationStructureClustersBottomLevelInputNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ClusterAccelerationStructureClustersBottomLevelInputNV( uint32_t maxTotalClusterCount_                    = {},\n                                                                                 uint32_t maxClusterCountPerAccelerationStructure_ = {},\n                                                                                 void *   pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxTotalClusterCount{ maxTotalClusterCount_ }\n      , maxClusterCountPerAccelerationStructure{ maxClusterCountPerAccelerationStructure_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ClusterAccelerationStructureClustersBottomLevelInputNV( ClusterAccelerationStructureClustersBottomLevelInputNV const & rhs )\n      VULKAN_HPP_NOEXCEPT = default;\n\n    ClusterAccelerationStructureClustersBottomLevelInputNV( VkClusterAccelerationStructureClustersBottomLevelInputNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ClusterAccelerationStructureClustersBottomLevelInputNV( *reinterpret_cast<ClusterAccelerationStructureClustersBottomLevelInputNV const *>( &rhs ) )\n    {\n    }\n\n    ClusterAccelerationStructureClustersBottomLevelInputNV &\n      operator=( ClusterAccelerationStructureClustersBottomLevelInputNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ClusterAccelerationStructureClustersBottomLevelInputNV &\n      operator=( VkClusterAccelerationStructureClustersBottomLevelInputNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureClustersBottomLevelInputNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureClustersBottomLevelInputNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureClustersBottomLevelInputNV &\n      setMaxTotalClusterCount( uint32_t maxTotalClusterCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxTotalClusterCount = maxTotalClusterCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureClustersBottomLevelInputNV &\n      setMaxClusterCountPerAccelerationStructure( uint32_t maxClusterCountPerAccelerationStructure_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxClusterCountPerAccelerationStructure = maxClusterCountPerAccelerationStructure_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkClusterAccelerationStructureClustersBottomLevelInputNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkClusterAccelerationStructureClustersBottomLevelInputNV *>( this );\n    }\n\n    operator VkClusterAccelerationStructureClustersBottomLevelInputNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkClusterAccelerationStructureClustersBottomLevelInputNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxTotalClusterCount, maxClusterCountPerAccelerationStructure );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ClusterAccelerationStructureClustersBottomLevelInputNV const & ) const = default;\n#else\n    bool operator==( ClusterAccelerationStructureClustersBottomLevelInputNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxTotalClusterCount == rhs.maxTotalClusterCount ) &&\n             ( maxClusterCountPerAccelerationStructure == rhs.maxClusterCountPerAccelerationStructure );\n#  endif\n    }\n\n    bool operator!=( ClusterAccelerationStructureClustersBottomLevelInputNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                   = StructureType::eClusterAccelerationStructureClustersBottomLevelInputNV;\n    void *                              pNext                                   = {};\n    uint32_t                            maxTotalClusterCount                    = {};\n    uint32_t                            maxClusterCountPerAccelerationStructure = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eClusterAccelerationStructureClustersBottomLevelInputNV>\n  {\n    using Type = ClusterAccelerationStructureClustersBottomLevelInputNV;\n  };\n\n  struct ClusterAccelerationStructureTriangleClusterInputNV\n  {\n    using NativeType = VkClusterAccelerationStructureTriangleClusterInputNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eClusterAccelerationStructureTriangleClusterInputNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      ClusterAccelerationStructureTriangleClusterInputNV( VULKAN_HPP_NAMESPACE::Format vertexFormat_          = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                                          uint32_t                     maxGeometryIndexValue_ = {},\n                                                          uint32_t                     maxClusterUniqueGeometryCount_ = {},\n                                                          uint32_t                     maxClusterTriangleCount_       = {},\n                                                          uint32_t                     maxClusterVertexCount_         = {},\n                                                          uint32_t                     maxTotalTriangleCount_         = {},\n                                                          uint32_t                     maxTotalVertexCount_           = {},\n                                                          uint32_t                     minPositionTruncateBitCount_   = {},\n                                                          void *                       pNext_                         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , vertexFormat{ vertexFormat_ }\n      , maxGeometryIndexValue{ maxGeometryIndexValue_ }\n      , maxClusterUniqueGeometryCount{ maxClusterUniqueGeometryCount_ }\n      , maxClusterTriangleCount{ maxClusterTriangleCount_ }\n      , maxClusterVertexCount{ maxClusterVertexCount_ }\n      , maxTotalTriangleCount{ maxTotalTriangleCount_ }\n      , maxTotalVertexCount{ maxTotalVertexCount_ }\n      , minPositionTruncateBitCount{ minPositionTruncateBitCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      ClusterAccelerationStructureTriangleClusterInputNV( ClusterAccelerationStructureTriangleClusterInputNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ClusterAccelerationStructureTriangleClusterInputNV( VkClusterAccelerationStructureTriangleClusterInputNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ClusterAccelerationStructureTriangleClusterInputNV( *reinterpret_cast<ClusterAccelerationStructureTriangleClusterInputNV const *>( &rhs ) )\n    {\n    }\n\n    ClusterAccelerationStructureTriangleClusterInputNV &\n      operator=( ClusterAccelerationStructureTriangleClusterInputNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ClusterAccelerationStructureTriangleClusterInputNV & operator=( VkClusterAccelerationStructureTriangleClusterInputNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureTriangleClusterInputNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureTriangleClusterInputNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureTriangleClusterInputNV &\n      setVertexFormat( VULKAN_HPP_NAMESPACE::Format vertexFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexFormat = vertexFormat_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureTriangleClusterInputNV & setMaxGeometryIndexValue( uint32_t maxGeometryIndexValue_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxGeometryIndexValue = maxGeometryIndexValue_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureTriangleClusterInputNV &\n      setMaxClusterUniqueGeometryCount( uint32_t maxClusterUniqueGeometryCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxClusterUniqueGeometryCount = maxClusterUniqueGeometryCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureTriangleClusterInputNV &\n      setMaxClusterTriangleCount( uint32_t maxClusterTriangleCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxClusterTriangleCount = maxClusterTriangleCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureTriangleClusterInputNV & setMaxClusterVertexCount( uint32_t maxClusterVertexCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxClusterVertexCount = maxClusterVertexCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureTriangleClusterInputNV & setMaxTotalTriangleCount( uint32_t maxTotalTriangleCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxTotalTriangleCount = maxTotalTriangleCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureTriangleClusterInputNV & setMaxTotalVertexCount( uint32_t maxTotalVertexCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxTotalVertexCount = maxTotalVertexCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureTriangleClusterInputNV &\n      setMinPositionTruncateBitCount( uint32_t minPositionTruncateBitCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minPositionTruncateBitCount = minPositionTruncateBitCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkClusterAccelerationStructureTriangleClusterInputNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkClusterAccelerationStructureTriangleClusterInputNV *>( this );\n    }\n\n    operator VkClusterAccelerationStructureTriangleClusterInputNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkClusterAccelerationStructureTriangleClusterInputNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       vertexFormat,\n                       maxGeometryIndexValue,\n                       maxClusterUniqueGeometryCount,\n                       maxClusterTriangleCount,\n                       maxClusterVertexCount,\n                       maxTotalTriangleCount,\n                       maxTotalVertexCount,\n                       minPositionTruncateBitCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ClusterAccelerationStructureTriangleClusterInputNV const & ) const = default;\n#else\n    bool operator==( ClusterAccelerationStructureTriangleClusterInputNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( vertexFormat == rhs.vertexFormat ) &&\n             ( maxGeometryIndexValue == rhs.maxGeometryIndexValue ) && ( maxClusterUniqueGeometryCount == rhs.maxClusterUniqueGeometryCount ) &&\n             ( maxClusterTriangleCount == rhs.maxClusterTriangleCount ) && ( maxClusterVertexCount == rhs.maxClusterVertexCount ) &&\n             ( maxTotalTriangleCount == rhs.maxTotalTriangleCount ) && ( maxTotalVertexCount == rhs.maxTotalVertexCount ) &&\n             ( minPositionTruncateBitCount == rhs.minPositionTruncateBitCount );\n#  endif\n    }\n\n    bool operator!=( ClusterAccelerationStructureTriangleClusterInputNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                         = StructureType::eClusterAccelerationStructureTriangleClusterInputNV;\n    void *                              pNext                         = {};\n    VULKAN_HPP_NAMESPACE::Format        vertexFormat                  = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    uint32_t                            maxGeometryIndexValue         = {};\n    uint32_t                            maxClusterUniqueGeometryCount = {};\n    uint32_t                            maxClusterTriangleCount       = {};\n    uint32_t                            maxClusterVertexCount         = {};\n    uint32_t                            maxTotalTriangleCount         = {};\n    uint32_t                            maxTotalVertexCount           = {};\n    uint32_t                            minPositionTruncateBitCount   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eClusterAccelerationStructureTriangleClusterInputNV>\n  {\n    using Type = ClusterAccelerationStructureTriangleClusterInputNV;\n  };\n\n  struct ClusterAccelerationStructureMoveObjectsInputNV\n  {\n    using NativeType = VkClusterAccelerationStructureMoveObjectsInputNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eClusterAccelerationStructureMoveObjectsInputNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ClusterAccelerationStructureMoveObjectsInputNV(\n      VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureTypeNV type_          = VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureTypeNV::eClustersBottomLevel,\n      VULKAN_HPP_NAMESPACE::Bool32                             noMoveOverlap_ = {},\n      VULKAN_HPP_NAMESPACE::DeviceSize                         maxMovedBytes_ = {},\n      void *                                                   pNext_         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , type{ type_ }\n      , noMoveOverlap{ noMoveOverlap_ }\n      , maxMovedBytes{ maxMovedBytes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      ClusterAccelerationStructureMoveObjectsInputNV( ClusterAccelerationStructureMoveObjectsInputNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ClusterAccelerationStructureMoveObjectsInputNV( VkClusterAccelerationStructureMoveObjectsInputNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ClusterAccelerationStructureMoveObjectsInputNV( *reinterpret_cast<ClusterAccelerationStructureMoveObjectsInputNV const *>( &rhs ) )\n    {\n    }\n\n    ClusterAccelerationStructureMoveObjectsInputNV & operator=( ClusterAccelerationStructureMoveObjectsInputNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ClusterAccelerationStructureMoveObjectsInputNV & operator=( VkClusterAccelerationStructureMoveObjectsInputNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureMoveObjectsInputNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureMoveObjectsInputNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureMoveObjectsInputNV &\n      setType( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureTypeNV type_ ) VULKAN_HPP_NOEXCEPT\n    {\n      type = type_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureMoveObjectsInputNV & setNoMoveOverlap( VULKAN_HPP_NAMESPACE::Bool32 noMoveOverlap_ ) VULKAN_HPP_NOEXCEPT\n    {\n      noMoveOverlap = noMoveOverlap_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureMoveObjectsInputNV &\n      setMaxMovedBytes( VULKAN_HPP_NAMESPACE::DeviceSize maxMovedBytes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxMovedBytes = maxMovedBytes_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkClusterAccelerationStructureMoveObjectsInputNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkClusterAccelerationStructureMoveObjectsInputNV *>( this );\n    }\n\n    operator VkClusterAccelerationStructureMoveObjectsInputNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkClusterAccelerationStructureMoveObjectsInputNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureTypeNV const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, type, noMoveOverlap, maxMovedBytes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ClusterAccelerationStructureMoveObjectsInputNV const & ) const = default;\n#else\n    bool operator==( ClusterAccelerationStructureMoveObjectsInputNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( type == rhs.type ) && ( noMoveOverlap == rhs.noMoveOverlap ) &&\n             ( maxMovedBytes == rhs.maxMovedBytes );\n#  endif\n    }\n\n    bool operator!=( ClusterAccelerationStructureMoveObjectsInputNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                      sType         = StructureType::eClusterAccelerationStructureMoveObjectsInputNV;\n    void *                                                   pNext         = {};\n    VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureTypeNV type          = VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureTypeNV::eClustersBottomLevel;\n    VULKAN_HPP_NAMESPACE::Bool32                             noMoveOverlap = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                         maxMovedBytes = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eClusterAccelerationStructureMoveObjectsInputNV>\n  {\n    using Type = ClusterAccelerationStructureMoveObjectsInputNV;\n  };\n\n  union ClusterAccelerationStructureOpInputNV\n  {\n    using NativeType = VkClusterAccelerationStructureOpInputNV;\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )\n\n    VULKAN_HPP_CONSTEXPR_14\n      ClusterAccelerationStructureOpInputNV( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureClustersBottomLevelInputNV * pClustersBottomLevel_ = {} )\n      : pClustersBottomLevel( pClustersBottomLevel_ )\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14\n      ClusterAccelerationStructureOpInputNV( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureTriangleClusterInputNV * pTriangleClusters_ )\n      : pTriangleClusters( pTriangleClusters_ )\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureOpInputNV( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureMoveObjectsInputNV * pMoveObjects_ )\n      : pMoveObjects( pMoveObjects_ )\n    {\n    }\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_UNION_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureOpInputNV &\n      setPClustersBottomLevel( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureClustersBottomLevelInputNV * pClustersBottomLevel_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pClustersBottomLevel = pClustersBottomLevel_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureOpInputNV &\n      setPTriangleClusters( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureTriangleClusterInputNV * pTriangleClusters_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pTriangleClusters = pTriangleClusters_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureOpInputNV &\n      setPMoveObjects( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureMoveObjectsInputNV * pMoveObjects_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pMoveObjects = pMoveObjects_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkClusterAccelerationStructureOpInputNV const &() const\n    {\n      return *reinterpret_cast<const VkClusterAccelerationStructureOpInputNV *>( this );\n    }\n\n    operator VkClusterAccelerationStructureOpInputNV &()\n    {\n      return *reinterpret_cast<VkClusterAccelerationStructureOpInputNV *>( this );\n    }\n\n#ifdef VULKAN_HPP_HAS_UNRESTRICTED_UNIONS\n    VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureClustersBottomLevelInputNV * pClustersBottomLevel;\n    VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureTriangleClusterInputNV *     pTriangleClusters;\n    VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureMoveObjectsInputNV *         pMoveObjects;\n#else\n    VkClusterAccelerationStructureClustersBottomLevelInputNV * pClustersBottomLevel;\n    VkClusterAccelerationStructureTriangleClusterInputNV *     pTriangleClusters;\n    VkClusterAccelerationStructureMoveObjectsInputNV *         pMoveObjects;\n#endif /*VULKAN_HPP_HAS_UNRESTRICTED_UNIONS*/\n  };\n\n  struct ClusterAccelerationStructureInputInfoNV\n  {\n    using NativeType = VkClusterAccelerationStructureInputInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eClusterAccelerationStructureInputInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureInputInfoNV(\n      uint32_t                                                    maxAccelerationStructureCount_ = {},\n      VULKAN_HPP_NAMESPACE::BuildAccelerationStructureFlagsKHR    flags_                         = {},\n      VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureOpTypeNV  opType_  = VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureOpTypeNV::eMoveObjects,\n      VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureOpModeNV  opMode_  = VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureOpModeNV::eImplicitDestinations,\n      VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureOpInputNV opInput_ = {},\n      void *                                                      pNext_   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxAccelerationStructureCount{ maxAccelerationStructureCount_ }\n      , flags{ flags_ }\n      , opType{ opType_ }\n      , opMode{ opMode_ }\n      , opInput{ opInput_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureInputInfoNV( ClusterAccelerationStructureInputInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ClusterAccelerationStructureInputInfoNV( VkClusterAccelerationStructureInputInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ClusterAccelerationStructureInputInfoNV( *reinterpret_cast<ClusterAccelerationStructureInputInfoNV const *>( &rhs ) )\n    {\n    }\n\n    ClusterAccelerationStructureInputInfoNV & operator=( ClusterAccelerationStructureInputInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ClusterAccelerationStructureInputInfoNV & operator=( VkClusterAccelerationStructureInputInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureInputInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureInputInfoNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureInputInfoNV &\n      setMaxAccelerationStructureCount( uint32_t maxAccelerationStructureCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxAccelerationStructureCount = maxAccelerationStructureCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureInputInfoNV &\n      setFlags( VULKAN_HPP_NAMESPACE::BuildAccelerationStructureFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureInputInfoNV &\n      setOpType( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureOpTypeNV opType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      opType = opType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureInputInfoNV &\n      setOpMode( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureOpModeNV opMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      opMode = opMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureInputInfoNV &\n      setOpInput( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureOpInputNV const & opInput_ ) VULKAN_HPP_NOEXCEPT\n    {\n      opInput = opInput_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkClusterAccelerationStructureInputInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkClusterAccelerationStructureInputInfoNV *>( this );\n    }\n\n    operator VkClusterAccelerationStructureInputInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkClusterAccelerationStructureInputInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::BuildAccelerationStructureFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureOpTypeNV const &,\n               VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureOpModeNV const &,\n               VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureOpInputNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxAccelerationStructureCount, flags, opType, opMode, opInput );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                         sType                         = StructureType::eClusterAccelerationStructureInputInfoNV;\n    void *                                                      pNext                         = {};\n    uint32_t                                                    maxAccelerationStructureCount = {};\n    VULKAN_HPP_NAMESPACE::BuildAccelerationStructureFlagsKHR    flags                         = {};\n    VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureOpTypeNV  opType  = VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureOpTypeNV::eMoveObjects;\n    VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureOpModeNV  opMode  = VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureOpModeNV::eImplicitDestinations;\n    VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureOpInputNV opInput = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eClusterAccelerationStructureInputInfoNV>\n  {\n    using Type = ClusterAccelerationStructureInputInfoNV;\n  };\n\n  struct StridedDeviceAddressRegionKHR\n  {\n    using NativeType = VkStridedDeviceAddressRegionKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR StridedDeviceAddressRegionKHR( VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress_ = {},\n                                                        VULKAN_HPP_NAMESPACE::DeviceSize    stride_        = {},\n                                                        VULKAN_HPP_NAMESPACE::DeviceSize    size_          = {} ) VULKAN_HPP_NOEXCEPT\n      : deviceAddress{ deviceAddress_ }\n      , stride{ stride_ }\n      , size{ size_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR StridedDeviceAddressRegionKHR( StridedDeviceAddressRegionKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    StridedDeviceAddressRegionKHR( VkStridedDeviceAddressRegionKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : StridedDeviceAddressRegionKHR( *reinterpret_cast<StridedDeviceAddressRegionKHR const *>( &rhs ) )\n    {\n    }\n\n    StridedDeviceAddressRegionKHR & operator=( StridedDeviceAddressRegionKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    StridedDeviceAddressRegionKHR & operator=( VkStridedDeviceAddressRegionKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 StridedDeviceAddressRegionKHR & setDeviceAddress( VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceAddress = deviceAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 StridedDeviceAddressRegionKHR & setStride( VULKAN_HPP_NAMESPACE::DeviceSize stride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stride = stride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 StridedDeviceAddressRegionKHR & setSize( VULKAN_HPP_NAMESPACE::DeviceSize size_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size = size_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkStridedDeviceAddressRegionKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( this );\n    }\n\n    operator VkStridedDeviceAddressRegionKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkStridedDeviceAddressRegionKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DeviceAddress const &, VULKAN_HPP_NAMESPACE::DeviceSize const &, VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( deviceAddress, stride, size );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( StridedDeviceAddressRegionKHR const & ) const = default;\n#else\n    bool                                                       operator==( StridedDeviceAddressRegionKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( deviceAddress == rhs.deviceAddress ) && ( stride == rhs.stride ) && ( size == rhs.size );\n#  endif\n    }\n\n    bool operator!=( StridedDeviceAddressRegionKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    stride        = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    size          = {};\n  };\n\n  struct ClusterAccelerationStructureCommandsInfoNV\n  {\n    using NativeType = VkClusterAccelerationStructureCommandsInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eClusterAccelerationStructureCommandsInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14\n      ClusterAccelerationStructureCommandsInfoNV( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureInputInfoNV              input_                  = {},\n                                                  VULKAN_HPP_NAMESPACE::DeviceAddress                                        dstImplicitData_        = {},\n                                                  VULKAN_HPP_NAMESPACE::DeviceAddress                                        scratchData_            = {},\n                                                  VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR                        dstAddressesArray_      = {},\n                                                  VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR                        dstSizesArray_          = {},\n                                                  VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR                        srcInfosArray_          = {},\n                                                  VULKAN_HPP_NAMESPACE::DeviceAddress                                        srcInfosCount_          = {},\n                                                  VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureAddressResolutionFlagsNV addressResolutionFlags_ = {},\n                                                  void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , input{ input_ }\n      , dstImplicitData{ dstImplicitData_ }\n      , scratchData{ scratchData_ }\n      , dstAddressesArray{ dstAddressesArray_ }\n      , dstSizesArray{ dstSizesArray_ }\n      , srcInfosArray{ srcInfosArray_ }\n      , srcInfosCount{ srcInfosCount_ }\n      , addressResolutionFlags{ addressResolutionFlags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureCommandsInfoNV( ClusterAccelerationStructureCommandsInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ClusterAccelerationStructureCommandsInfoNV( VkClusterAccelerationStructureCommandsInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ClusterAccelerationStructureCommandsInfoNV( *reinterpret_cast<ClusterAccelerationStructureCommandsInfoNV const *>( &rhs ) )\n    {\n    }\n\n    ClusterAccelerationStructureCommandsInfoNV & operator=( ClusterAccelerationStructureCommandsInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ClusterAccelerationStructureCommandsInfoNV & operator=( VkClusterAccelerationStructureCommandsInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureCommandsInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureCommandsInfoNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureCommandsInfoNV &\n      setInput( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureInputInfoNV const & input_ ) VULKAN_HPP_NOEXCEPT\n    {\n      input = input_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureCommandsInfoNV &\n      setDstImplicitData( VULKAN_HPP_NAMESPACE::DeviceAddress dstImplicitData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstImplicitData = dstImplicitData_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureCommandsInfoNV & setScratchData( VULKAN_HPP_NAMESPACE::DeviceAddress scratchData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      scratchData = scratchData_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureCommandsInfoNV &\n      setDstAddressesArray( VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR const & dstAddressesArray_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstAddressesArray = dstAddressesArray_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureCommandsInfoNV &\n      setDstSizesArray( VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR const & dstSizesArray_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstSizesArray = dstSizesArray_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureCommandsInfoNV &\n      setSrcInfosArray( VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR const & srcInfosArray_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcInfosArray = srcInfosArray_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureCommandsInfoNV &\n      setSrcInfosCount( VULKAN_HPP_NAMESPACE::DeviceAddress srcInfosCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcInfosCount = srcInfosCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureCommandsInfoNV &\n      setAddressResolutionFlags( VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureAddressResolutionFlagsNV addressResolutionFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      addressResolutionFlags = addressResolutionFlags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkClusterAccelerationStructureCommandsInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkClusterAccelerationStructureCommandsInfoNV *>( this );\n    }\n\n    operator VkClusterAccelerationStructureCommandsInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkClusterAccelerationStructureCommandsInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureInputInfoNV const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR const &,\n               VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR const &,\n               VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureAddressResolutionFlagsNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie(\n        sType, pNext, input, dstImplicitData, scratchData, dstAddressesArray, dstSizesArray, srcInfosArray, srcInfosCount, addressResolutionFlags );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                        sType             = StructureType::eClusterAccelerationStructureCommandsInfoNV;\n    void *                                                                     pNext             = {};\n    VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureInputInfoNV              input             = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress                                        dstImplicitData   = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress                                        scratchData       = {};\n    VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR                        dstAddressesArray = {};\n    VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR                        dstSizesArray     = {};\n    VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR                        srcInfosArray     = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress                                        srcInfosCount     = {};\n    VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureAddressResolutionFlagsNV addressResolutionFlags = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eClusterAccelerationStructureCommandsInfoNV>\n  {\n    using Type = ClusterAccelerationStructureCommandsInfoNV;\n  };\n\n  struct ClusterAccelerationStructureInstantiateClusterInfoNV\n  {\n    using NativeType = VkClusterAccelerationStructureInstantiateClusterInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      ClusterAccelerationStructureInstantiateClusterInfoNV( uint32_t                                     clusterIdOffset_        = {},\n                                                            uint32_t                                     geometryIndexOffset_    = {},\n                                                            uint32_t                                     reserved_               = {},\n                                                            VULKAN_HPP_NAMESPACE::DeviceAddress          clusterTemplateAddress_ = {},\n                                                            VULKAN_HPP_NAMESPACE::StridedDeviceAddressNV vertexBuffer_           = {} ) VULKAN_HPP_NOEXCEPT\n      : clusterIdOffset{ clusterIdOffset_ }\n      , geometryIndexOffset{ geometryIndexOffset_ }\n      , reserved{ reserved_ }\n      , clusterTemplateAddress{ clusterTemplateAddress_ }\n      , vertexBuffer{ vertexBuffer_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      ClusterAccelerationStructureInstantiateClusterInfoNV( ClusterAccelerationStructureInstantiateClusterInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ClusterAccelerationStructureInstantiateClusterInfoNV( VkClusterAccelerationStructureInstantiateClusterInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ClusterAccelerationStructureInstantiateClusterInfoNV( *reinterpret_cast<ClusterAccelerationStructureInstantiateClusterInfoNV const *>( &rhs ) )\n    {\n    }\n\n    ClusterAccelerationStructureInstantiateClusterInfoNV &\n      operator=( ClusterAccelerationStructureInstantiateClusterInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ClusterAccelerationStructureInstantiateClusterInfoNV & operator=( VkClusterAccelerationStructureInstantiateClusterInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureInstantiateClusterInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureInstantiateClusterInfoNV & setClusterIdOffset( uint32_t clusterIdOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      clusterIdOffset = clusterIdOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureInstantiateClusterInfoNV & setGeometryIndexOffset( uint32_t geometryIndexOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      geometryIndexOffset = geometryIndexOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureInstantiateClusterInfoNV & setReserved( uint32_t reserved_ ) VULKAN_HPP_NOEXCEPT\n    {\n      reserved = reserved_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureInstantiateClusterInfoNV &\n      setClusterTemplateAddress( VULKAN_HPP_NAMESPACE::DeviceAddress clusterTemplateAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      clusterTemplateAddress = clusterTemplateAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureInstantiateClusterInfoNV &\n      setVertexBuffer( VULKAN_HPP_NAMESPACE::StridedDeviceAddressNV const & vertexBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexBuffer = vertexBuffer_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkClusterAccelerationStructureInstantiateClusterInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkClusterAccelerationStructureInstantiateClusterInfoNV *>( this );\n    }\n\n    operator VkClusterAccelerationStructureInstantiateClusterInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkClusterAccelerationStructureInstantiateClusterInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::StridedDeviceAddressNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( clusterIdOffset, geometryIndexOffset, reserved, clusterTemplateAddress, vertexBuffer );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ClusterAccelerationStructureInstantiateClusterInfoNV const & ) const = default;\n#else\n    bool operator==( ClusterAccelerationStructureInstantiateClusterInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( clusterIdOffset == rhs.clusterIdOffset ) && ( geometryIndexOffset == rhs.geometryIndexOffset ) && ( reserved == rhs.reserved ) &&\n             ( clusterTemplateAddress == rhs.clusterTemplateAddress ) && ( vertexBuffer == rhs.vertexBuffer );\n#  endif\n    }\n\n    bool operator!=( ClusterAccelerationStructureInstantiateClusterInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                                     clusterIdOffset = {};\n    uint32_t                                     geometryIndexOffset : 24;\n    uint32_t                                     reserved            : 8;\n    VULKAN_HPP_NAMESPACE::DeviceAddress          clusterTemplateAddress = {};\n    VULKAN_HPP_NAMESPACE::StridedDeviceAddressNV vertexBuffer           = {};\n  };\n\n  struct ClusterAccelerationStructureMoveObjectsInfoNV\n  {\n    using NativeType = VkClusterAccelerationStructureMoveObjectsInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ClusterAccelerationStructureMoveObjectsInfoNV( VULKAN_HPP_NAMESPACE::DeviceAddress srcAccelerationStructure_ = {} ) VULKAN_HPP_NOEXCEPT\n      : srcAccelerationStructure{ srcAccelerationStructure_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      ClusterAccelerationStructureMoveObjectsInfoNV( ClusterAccelerationStructureMoveObjectsInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ClusterAccelerationStructureMoveObjectsInfoNV( VkClusterAccelerationStructureMoveObjectsInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ClusterAccelerationStructureMoveObjectsInfoNV( *reinterpret_cast<ClusterAccelerationStructureMoveObjectsInfoNV const *>( &rhs ) )\n    {\n    }\n\n    ClusterAccelerationStructureMoveObjectsInfoNV & operator=( ClusterAccelerationStructureMoveObjectsInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ClusterAccelerationStructureMoveObjectsInfoNV & operator=( VkClusterAccelerationStructureMoveObjectsInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ClusterAccelerationStructureMoveObjectsInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ClusterAccelerationStructureMoveObjectsInfoNV &\n      setSrcAccelerationStructure( VULKAN_HPP_NAMESPACE::DeviceAddress srcAccelerationStructure_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcAccelerationStructure = srcAccelerationStructure_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkClusterAccelerationStructureMoveObjectsInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkClusterAccelerationStructureMoveObjectsInfoNV *>( this );\n    }\n\n    operator VkClusterAccelerationStructureMoveObjectsInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkClusterAccelerationStructureMoveObjectsInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DeviceAddress const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( srcAccelerationStructure );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ClusterAccelerationStructureMoveObjectsInfoNV const & ) const = default;\n#else\n    bool operator==( ClusterAccelerationStructureMoveObjectsInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( srcAccelerationStructure == rhs.srcAccelerationStructure );\n#  endif\n    }\n\n    bool operator!=( ClusterAccelerationStructureMoveObjectsInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DeviceAddress srcAccelerationStructure = {};\n  };\n\n  struct CoarseSampleLocationNV\n  {\n    using NativeType = VkCoarseSampleLocationNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CoarseSampleLocationNV( uint32_t pixelX_ = {}, uint32_t pixelY_ = {}, uint32_t sample_ = {} ) VULKAN_HPP_NOEXCEPT\n      : pixelX{ pixelX_ }\n      , pixelY{ pixelY_ }\n      , sample{ sample_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CoarseSampleLocationNV( CoarseSampleLocationNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CoarseSampleLocationNV( VkCoarseSampleLocationNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CoarseSampleLocationNV( *reinterpret_cast<CoarseSampleLocationNV const *>( &rhs ) )\n    {\n    }\n\n    CoarseSampleLocationNV & operator=( CoarseSampleLocationNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CoarseSampleLocationNV & operator=( VkCoarseSampleLocationNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CoarseSampleLocationNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CoarseSampleLocationNV & setPixelX( uint32_t pixelX_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pixelX = pixelX_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CoarseSampleLocationNV & setPixelY( uint32_t pixelY_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pixelY = pixelY_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CoarseSampleLocationNV & setSample( uint32_t sample_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sample = sample_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCoarseSampleLocationNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCoarseSampleLocationNV *>( this );\n    }\n\n    operator VkCoarseSampleLocationNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCoarseSampleLocationNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( pixelX, pixelY, sample );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CoarseSampleLocationNV const & ) const = default;\n#else\n    bool operator==( CoarseSampleLocationNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( pixelX == rhs.pixelX ) && ( pixelY == rhs.pixelY ) && ( sample == rhs.sample );\n#  endif\n    }\n\n    bool operator!=( CoarseSampleLocationNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t pixelX = {};\n    uint32_t pixelY = {};\n    uint32_t sample = {};\n  };\n\n  struct CoarseSampleOrderCustomNV\n  {\n    using NativeType = VkCoarseSampleOrderCustomNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      CoarseSampleOrderCustomNV( VULKAN_HPP_NAMESPACE::ShadingRatePaletteEntryNV shadingRate_ = VULKAN_HPP_NAMESPACE::ShadingRatePaletteEntryNV::eNoInvocations,\n                                 uint32_t                                        sampleCount_ = {},\n                                 uint32_t                                        sampleLocationCount_   = {},\n                                 const VULKAN_HPP_NAMESPACE::CoarseSampleLocationNV * pSampleLocations_ = {} ) VULKAN_HPP_NOEXCEPT\n      : shadingRate{ shadingRate_ }\n      , sampleCount{ sampleCount_ }\n      , sampleLocationCount{ sampleLocationCount_ }\n      , pSampleLocations{ pSampleLocations_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CoarseSampleOrderCustomNV( CoarseSampleOrderCustomNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CoarseSampleOrderCustomNV( VkCoarseSampleOrderCustomNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CoarseSampleOrderCustomNV( *reinterpret_cast<CoarseSampleOrderCustomNV const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CoarseSampleOrderCustomNV( VULKAN_HPP_NAMESPACE::ShadingRatePaletteEntryNV                                                           shadingRate_,\n                               uint32_t                                                                                                  sampleCount_,\n                               VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::CoarseSampleLocationNV> const & sampleLocations_ )\n      : shadingRate( shadingRate_ )\n      , sampleCount( sampleCount_ )\n      , sampleLocationCount( static_cast<uint32_t>( sampleLocations_.size() ) )\n      , pSampleLocations( sampleLocations_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    CoarseSampleOrderCustomNV & operator=( CoarseSampleOrderCustomNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CoarseSampleOrderCustomNV & operator=( VkCoarseSampleOrderCustomNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CoarseSampleOrderCustomNV & setShadingRate( VULKAN_HPP_NAMESPACE::ShadingRatePaletteEntryNV shadingRate_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shadingRate = shadingRate_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CoarseSampleOrderCustomNV & setSampleCount( uint32_t sampleCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sampleCount = sampleCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CoarseSampleOrderCustomNV & setSampleLocationCount( uint32_t sampleLocationCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sampleLocationCount = sampleLocationCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CoarseSampleOrderCustomNV &\n      setPSampleLocations( const VULKAN_HPP_NAMESPACE::CoarseSampleLocationNV * pSampleLocations_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSampleLocations = pSampleLocations_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CoarseSampleOrderCustomNV & setSampleLocations(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::CoarseSampleLocationNV> const & sampleLocations_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sampleLocationCount = static_cast<uint32_t>( sampleLocations_.size() );\n      pSampleLocations    = sampleLocations_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCoarseSampleOrderCustomNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCoarseSampleOrderCustomNV *>( this );\n    }\n\n    operator VkCoarseSampleOrderCustomNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCoarseSampleOrderCustomNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::ShadingRatePaletteEntryNV const &,\n               uint32_t const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::CoarseSampleLocationNV * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( shadingRate, sampleCount, sampleLocationCount, pSampleLocations );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CoarseSampleOrderCustomNV const & ) const = default;\n#else\n    bool operator==( CoarseSampleOrderCustomNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( shadingRate == rhs.shadingRate ) && ( sampleCount == rhs.sampleCount ) && ( sampleLocationCount == rhs.sampleLocationCount ) &&\n             ( pSampleLocations == rhs.pSampleLocations );\n#  endif\n    }\n\n    bool operator!=( CoarseSampleOrderCustomNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::ShadingRatePaletteEntryNV      shadingRate         = VULKAN_HPP_NAMESPACE::ShadingRatePaletteEntryNV::eNoInvocations;\n    uint32_t                                             sampleCount         = {};\n    uint32_t                                             sampleLocationCount = {};\n    const VULKAN_HPP_NAMESPACE::CoarseSampleLocationNV * pSampleLocations    = {};\n  };\n\n  struct ColorBlendAdvancedEXT\n  {\n    using NativeType = VkColorBlendAdvancedEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ColorBlendAdvancedEXT( VULKAN_HPP_NAMESPACE::BlendOp         advancedBlendOp_  = VULKAN_HPP_NAMESPACE::BlendOp::eAdd,\n                                                VULKAN_HPP_NAMESPACE::Bool32          srcPremultiplied_ = {},\n                                                VULKAN_HPP_NAMESPACE::Bool32          dstPremultiplied_ = {},\n                                                VULKAN_HPP_NAMESPACE::BlendOverlapEXT blendOverlap_     = VULKAN_HPP_NAMESPACE::BlendOverlapEXT::eUncorrelated,\n                                                VULKAN_HPP_NAMESPACE::Bool32          clampResults_     = {} ) VULKAN_HPP_NOEXCEPT\n      : advancedBlendOp{ advancedBlendOp_ }\n      , srcPremultiplied{ srcPremultiplied_ }\n      , dstPremultiplied{ dstPremultiplied_ }\n      , blendOverlap{ blendOverlap_ }\n      , clampResults{ clampResults_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ColorBlendAdvancedEXT( ColorBlendAdvancedEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ColorBlendAdvancedEXT( VkColorBlendAdvancedEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ColorBlendAdvancedEXT( *reinterpret_cast<ColorBlendAdvancedEXT const *>( &rhs ) )\n    {\n    }\n\n    ColorBlendAdvancedEXT & operator=( ColorBlendAdvancedEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ColorBlendAdvancedEXT & operator=( VkColorBlendAdvancedEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ColorBlendAdvancedEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ColorBlendAdvancedEXT & setAdvancedBlendOp( VULKAN_HPP_NAMESPACE::BlendOp advancedBlendOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      advancedBlendOp = advancedBlendOp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ColorBlendAdvancedEXT & setSrcPremultiplied( VULKAN_HPP_NAMESPACE::Bool32 srcPremultiplied_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcPremultiplied = srcPremultiplied_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ColorBlendAdvancedEXT & setDstPremultiplied( VULKAN_HPP_NAMESPACE::Bool32 dstPremultiplied_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstPremultiplied = dstPremultiplied_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ColorBlendAdvancedEXT & setBlendOverlap( VULKAN_HPP_NAMESPACE::BlendOverlapEXT blendOverlap_ ) VULKAN_HPP_NOEXCEPT\n    {\n      blendOverlap = blendOverlap_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ColorBlendAdvancedEXT & setClampResults( VULKAN_HPP_NAMESPACE::Bool32 clampResults_ ) VULKAN_HPP_NOEXCEPT\n    {\n      clampResults = clampResults_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkColorBlendAdvancedEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkColorBlendAdvancedEXT *>( this );\n    }\n\n    operator VkColorBlendAdvancedEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkColorBlendAdvancedEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::BlendOp const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::BlendOverlapEXT const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( advancedBlendOp, srcPremultiplied, dstPremultiplied, blendOverlap, clampResults );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ColorBlendAdvancedEXT const & ) const = default;\n#else\n    bool operator==( ColorBlendAdvancedEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( advancedBlendOp == rhs.advancedBlendOp ) && ( srcPremultiplied == rhs.srcPremultiplied ) && ( dstPremultiplied == rhs.dstPremultiplied ) &&\n             ( blendOverlap == rhs.blendOverlap ) && ( clampResults == rhs.clampResults );\n#  endif\n    }\n\n    bool operator!=( ColorBlendAdvancedEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::BlendOp         advancedBlendOp  = VULKAN_HPP_NAMESPACE::BlendOp::eAdd;\n    VULKAN_HPP_NAMESPACE::Bool32          srcPremultiplied = {};\n    VULKAN_HPP_NAMESPACE::Bool32          dstPremultiplied = {};\n    VULKAN_HPP_NAMESPACE::BlendOverlapEXT blendOverlap     = VULKAN_HPP_NAMESPACE::BlendOverlapEXT::eUncorrelated;\n    VULKAN_HPP_NAMESPACE::Bool32          clampResults     = {};\n  };\n\n  struct ColorBlendEquationEXT\n  {\n    using NativeType = VkColorBlendEquationEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ColorBlendEquationEXT( VULKAN_HPP_NAMESPACE::BlendFactor srcColorBlendFactor_ = VULKAN_HPP_NAMESPACE::BlendFactor::eZero,\n                                                VULKAN_HPP_NAMESPACE::BlendFactor dstColorBlendFactor_ = VULKAN_HPP_NAMESPACE::BlendFactor::eZero,\n                                                VULKAN_HPP_NAMESPACE::BlendOp     colorBlendOp_        = VULKAN_HPP_NAMESPACE::BlendOp::eAdd,\n                                                VULKAN_HPP_NAMESPACE::BlendFactor srcAlphaBlendFactor_ = VULKAN_HPP_NAMESPACE::BlendFactor::eZero,\n                                                VULKAN_HPP_NAMESPACE::BlendFactor dstAlphaBlendFactor_ = VULKAN_HPP_NAMESPACE::BlendFactor::eZero,\n                                                VULKAN_HPP_NAMESPACE::BlendOp     alphaBlendOp_ = VULKAN_HPP_NAMESPACE::BlendOp::eAdd ) VULKAN_HPP_NOEXCEPT\n      : srcColorBlendFactor{ srcColorBlendFactor_ }\n      , dstColorBlendFactor{ dstColorBlendFactor_ }\n      , colorBlendOp{ colorBlendOp_ }\n      , srcAlphaBlendFactor{ srcAlphaBlendFactor_ }\n      , dstAlphaBlendFactor{ dstAlphaBlendFactor_ }\n      , alphaBlendOp{ alphaBlendOp_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ColorBlendEquationEXT( ColorBlendEquationEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ColorBlendEquationEXT( VkColorBlendEquationEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ColorBlendEquationEXT( *reinterpret_cast<ColorBlendEquationEXT const *>( &rhs ) )\n    {\n    }\n\n    ColorBlendEquationEXT & operator=( ColorBlendEquationEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ColorBlendEquationEXT & operator=( VkColorBlendEquationEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ColorBlendEquationEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ColorBlendEquationEXT & setSrcColorBlendFactor( VULKAN_HPP_NAMESPACE::BlendFactor srcColorBlendFactor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcColorBlendFactor = srcColorBlendFactor_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ColorBlendEquationEXT & setDstColorBlendFactor( VULKAN_HPP_NAMESPACE::BlendFactor dstColorBlendFactor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstColorBlendFactor = dstColorBlendFactor_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ColorBlendEquationEXT & setColorBlendOp( VULKAN_HPP_NAMESPACE::BlendOp colorBlendOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorBlendOp = colorBlendOp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ColorBlendEquationEXT & setSrcAlphaBlendFactor( VULKAN_HPP_NAMESPACE::BlendFactor srcAlphaBlendFactor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcAlphaBlendFactor = srcAlphaBlendFactor_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ColorBlendEquationEXT & setDstAlphaBlendFactor( VULKAN_HPP_NAMESPACE::BlendFactor dstAlphaBlendFactor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstAlphaBlendFactor = dstAlphaBlendFactor_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ColorBlendEquationEXT & setAlphaBlendOp( VULKAN_HPP_NAMESPACE::BlendOp alphaBlendOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      alphaBlendOp = alphaBlendOp_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkColorBlendEquationEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkColorBlendEquationEXT *>( this );\n    }\n\n    operator VkColorBlendEquationEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkColorBlendEquationEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::BlendFactor const &,\n               VULKAN_HPP_NAMESPACE::BlendFactor const &,\n               VULKAN_HPP_NAMESPACE::BlendOp const &,\n               VULKAN_HPP_NAMESPACE::BlendFactor const &,\n               VULKAN_HPP_NAMESPACE::BlendFactor const &,\n               VULKAN_HPP_NAMESPACE::BlendOp const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( srcColorBlendFactor, dstColorBlendFactor, colorBlendOp, srcAlphaBlendFactor, dstAlphaBlendFactor, alphaBlendOp );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ColorBlendEquationEXT const & ) const = default;\n#else\n    bool operator==( ColorBlendEquationEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( srcColorBlendFactor == rhs.srcColorBlendFactor ) && ( dstColorBlendFactor == rhs.dstColorBlendFactor ) && ( colorBlendOp == rhs.colorBlendOp ) &&\n             ( srcAlphaBlendFactor == rhs.srcAlphaBlendFactor ) && ( dstAlphaBlendFactor == rhs.dstAlphaBlendFactor ) && ( alphaBlendOp == rhs.alphaBlendOp );\n#  endif\n    }\n\n    bool operator!=( ColorBlendEquationEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::BlendFactor srcColorBlendFactor = VULKAN_HPP_NAMESPACE::BlendFactor::eZero;\n    VULKAN_HPP_NAMESPACE::BlendFactor dstColorBlendFactor = VULKAN_HPP_NAMESPACE::BlendFactor::eZero;\n    VULKAN_HPP_NAMESPACE::BlendOp     colorBlendOp        = VULKAN_HPP_NAMESPACE::BlendOp::eAdd;\n    VULKAN_HPP_NAMESPACE::BlendFactor srcAlphaBlendFactor = VULKAN_HPP_NAMESPACE::BlendFactor::eZero;\n    VULKAN_HPP_NAMESPACE::BlendFactor dstAlphaBlendFactor = VULKAN_HPP_NAMESPACE::BlendFactor::eZero;\n    VULKAN_HPP_NAMESPACE::BlendOp     alphaBlendOp        = VULKAN_HPP_NAMESPACE::BlendOp::eAdd;\n  };\n\n  struct CommandBufferAllocateInfo\n  {\n    using NativeType = VkCommandBufferAllocateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCommandBufferAllocateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CommandBufferAllocateInfo( VULKAN_HPP_NAMESPACE::CommandPool        commandPool_ = {},\n                                                    VULKAN_HPP_NAMESPACE::CommandBufferLevel level_       = VULKAN_HPP_NAMESPACE::CommandBufferLevel::ePrimary,\n                                                    uint32_t                                 commandBufferCount_ = {},\n                                                    const void *                             pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , commandPool{ commandPool_ }\n      , level{ level_ }\n      , commandBufferCount{ commandBufferCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CommandBufferAllocateInfo( CommandBufferAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CommandBufferAllocateInfo( VkCommandBufferAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CommandBufferAllocateInfo( *reinterpret_cast<CommandBufferAllocateInfo const *>( &rhs ) )\n    {\n    }\n\n    CommandBufferAllocateInfo & operator=( CommandBufferAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CommandBufferAllocateInfo & operator=( VkCommandBufferAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferAllocateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferAllocateInfo & setCommandPool( VULKAN_HPP_NAMESPACE::CommandPool commandPool_ ) VULKAN_HPP_NOEXCEPT\n    {\n      commandPool = commandPool_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferAllocateInfo & setLevel( VULKAN_HPP_NAMESPACE::CommandBufferLevel level_ ) VULKAN_HPP_NOEXCEPT\n    {\n      level = level_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferAllocateInfo & setCommandBufferCount( uint32_t commandBufferCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      commandBufferCount = commandBufferCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCommandBufferAllocateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCommandBufferAllocateInfo *>( this );\n    }\n\n    operator VkCommandBufferAllocateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCommandBufferAllocateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::CommandPool const &,\n               VULKAN_HPP_NAMESPACE::CommandBufferLevel const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, commandPool, level, commandBufferCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CommandBufferAllocateInfo const & ) const = default;\n#else\n    bool operator==( CommandBufferAllocateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( commandPool == rhs.commandPool ) && ( level == rhs.level ) &&\n             ( commandBufferCount == rhs.commandBufferCount );\n#  endif\n    }\n\n    bool operator!=( CommandBufferAllocateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType      sType              = StructureType::eCommandBufferAllocateInfo;\n    const void *                             pNext              = {};\n    VULKAN_HPP_NAMESPACE::CommandPool        commandPool        = {};\n    VULKAN_HPP_NAMESPACE::CommandBufferLevel level              = VULKAN_HPP_NAMESPACE::CommandBufferLevel::ePrimary;\n    uint32_t                                 commandBufferCount = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCommandBufferAllocateInfo>\n  {\n    using Type = CommandBufferAllocateInfo;\n  };\n\n  struct CommandBufferInheritanceInfo\n  {\n    using NativeType = VkCommandBufferInheritanceInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCommandBufferInheritanceInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CommandBufferInheritanceInfo( VULKAN_HPP_NAMESPACE::RenderPass                  renderPass_           = {},\n                                                       uint32_t                                          subpass_              = {},\n                                                       VULKAN_HPP_NAMESPACE::Framebuffer                 framebuffer_          = {},\n                                                       VULKAN_HPP_NAMESPACE::Bool32                      occlusionQueryEnable_ = {},\n                                                       VULKAN_HPP_NAMESPACE::QueryControlFlags           queryFlags_           = {},\n                                                       VULKAN_HPP_NAMESPACE::QueryPipelineStatisticFlags pipelineStatistics_   = {},\n                                                       const void *                                      pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , renderPass{ renderPass_ }\n      , subpass{ subpass_ }\n      , framebuffer{ framebuffer_ }\n      , occlusionQueryEnable{ occlusionQueryEnable_ }\n      , queryFlags{ queryFlags_ }\n      , pipelineStatistics{ pipelineStatistics_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CommandBufferInheritanceInfo( CommandBufferInheritanceInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CommandBufferInheritanceInfo( VkCommandBufferInheritanceInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CommandBufferInheritanceInfo( *reinterpret_cast<CommandBufferInheritanceInfo const *>( &rhs ) )\n    {\n    }\n\n    CommandBufferInheritanceInfo & operator=( CommandBufferInheritanceInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CommandBufferInheritanceInfo & operator=( VkCommandBufferInheritanceInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceInfo & setRenderPass( VULKAN_HPP_NAMESPACE::RenderPass renderPass_ ) VULKAN_HPP_NOEXCEPT\n    {\n      renderPass = renderPass_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceInfo & setSubpass( uint32_t subpass_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subpass = subpass_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceInfo & setFramebuffer( VULKAN_HPP_NAMESPACE::Framebuffer framebuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      framebuffer = framebuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceInfo & setOcclusionQueryEnable( VULKAN_HPP_NAMESPACE::Bool32 occlusionQueryEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      occlusionQueryEnable = occlusionQueryEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceInfo & setQueryFlags( VULKAN_HPP_NAMESPACE::QueryControlFlags queryFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queryFlags = queryFlags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceInfo &\n      setPipelineStatistics( VULKAN_HPP_NAMESPACE::QueryPipelineStatisticFlags pipelineStatistics_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineStatistics = pipelineStatistics_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCommandBufferInheritanceInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCommandBufferInheritanceInfo *>( this );\n    }\n\n    operator VkCommandBufferInheritanceInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCommandBufferInheritanceInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::RenderPass const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Framebuffer const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::QueryControlFlags const &,\n               VULKAN_HPP_NAMESPACE::QueryPipelineStatisticFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, renderPass, subpass, framebuffer, occlusionQueryEnable, queryFlags, pipelineStatistics );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CommandBufferInheritanceInfo const & ) const = default;\n#else\n    bool operator==( CommandBufferInheritanceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( renderPass == rhs.renderPass ) && ( subpass == rhs.subpass ) &&\n             ( framebuffer == rhs.framebuffer ) && ( occlusionQueryEnable == rhs.occlusionQueryEnable ) && ( queryFlags == rhs.queryFlags ) &&\n             ( pipelineStatistics == rhs.pipelineStatistics );\n#  endif\n    }\n\n    bool operator!=( CommandBufferInheritanceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType                = StructureType::eCommandBufferInheritanceInfo;\n    const void *                                      pNext                = {};\n    VULKAN_HPP_NAMESPACE::RenderPass                  renderPass           = {};\n    uint32_t                                          subpass              = {};\n    VULKAN_HPP_NAMESPACE::Framebuffer                 framebuffer          = {};\n    VULKAN_HPP_NAMESPACE::Bool32                      occlusionQueryEnable = {};\n    VULKAN_HPP_NAMESPACE::QueryControlFlags           queryFlags           = {};\n    VULKAN_HPP_NAMESPACE::QueryPipelineStatisticFlags pipelineStatistics   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCommandBufferInheritanceInfo>\n  {\n    using Type = CommandBufferInheritanceInfo;\n  };\n\n  struct CommandBufferBeginInfo\n  {\n    using NativeType = VkCommandBufferBeginInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCommandBufferBeginInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CommandBufferBeginInfo( VULKAN_HPP_NAMESPACE::CommandBufferUsageFlags              flags_            = {},\n                                                 const VULKAN_HPP_NAMESPACE::CommandBufferInheritanceInfo * pInheritanceInfo_ = {},\n                                                 const void *                                               pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , pInheritanceInfo{ pInheritanceInfo_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CommandBufferBeginInfo( CommandBufferBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CommandBufferBeginInfo( VkCommandBufferBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CommandBufferBeginInfo( *reinterpret_cast<CommandBufferBeginInfo const *>( &rhs ) )\n    {\n    }\n\n    CommandBufferBeginInfo & operator=( CommandBufferBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CommandBufferBeginInfo & operator=( VkCommandBufferBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CommandBufferBeginInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferBeginInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferBeginInfo & setFlags( VULKAN_HPP_NAMESPACE::CommandBufferUsageFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferBeginInfo &\n      setPInheritanceInfo( const VULKAN_HPP_NAMESPACE::CommandBufferInheritanceInfo * pInheritanceInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pInheritanceInfo = pInheritanceInfo_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCommandBufferBeginInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCommandBufferBeginInfo *>( this );\n    }\n\n    operator VkCommandBufferBeginInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCommandBufferBeginInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::CommandBufferUsageFlags const &,\n               const VULKAN_HPP_NAMESPACE::CommandBufferInheritanceInfo * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, pInheritanceInfo );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CommandBufferBeginInfo const & ) const = default;\n#else\n    bool operator==( CommandBufferBeginInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( pInheritanceInfo == rhs.pInheritanceInfo );\n#  endif\n    }\n\n    bool operator!=( CommandBufferBeginInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                        sType            = StructureType::eCommandBufferBeginInfo;\n    const void *                                               pNext            = {};\n    VULKAN_HPP_NAMESPACE::CommandBufferUsageFlags              flags            = {};\n    const VULKAN_HPP_NAMESPACE::CommandBufferInheritanceInfo * pInheritanceInfo = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCommandBufferBeginInfo>\n  {\n    using Type = CommandBufferBeginInfo;\n  };\n\n  struct CommandBufferInheritanceConditionalRenderingInfoEXT\n  {\n    using NativeType = VkCommandBufferInheritanceConditionalRenderingInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCommandBufferInheritanceConditionalRenderingInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CommandBufferInheritanceConditionalRenderingInfoEXT( VULKAN_HPP_NAMESPACE::Bool32 conditionalRenderingEnable_ = {},\n                                                                              const void *                 pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , conditionalRenderingEnable{ conditionalRenderingEnable_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      CommandBufferInheritanceConditionalRenderingInfoEXT( CommandBufferInheritanceConditionalRenderingInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CommandBufferInheritanceConditionalRenderingInfoEXT( VkCommandBufferInheritanceConditionalRenderingInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CommandBufferInheritanceConditionalRenderingInfoEXT( *reinterpret_cast<CommandBufferInheritanceConditionalRenderingInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    CommandBufferInheritanceConditionalRenderingInfoEXT &\n      operator=( CommandBufferInheritanceConditionalRenderingInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CommandBufferInheritanceConditionalRenderingInfoEXT & operator=( VkCommandBufferInheritanceConditionalRenderingInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceConditionalRenderingInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceConditionalRenderingInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceConditionalRenderingInfoEXT &\n      setConditionalRenderingEnable( VULKAN_HPP_NAMESPACE::Bool32 conditionalRenderingEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      conditionalRenderingEnable = conditionalRenderingEnable_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCommandBufferInheritanceConditionalRenderingInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCommandBufferInheritanceConditionalRenderingInfoEXT *>( this );\n    }\n\n    operator VkCommandBufferInheritanceConditionalRenderingInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCommandBufferInheritanceConditionalRenderingInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, conditionalRenderingEnable );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CommandBufferInheritanceConditionalRenderingInfoEXT const & ) const = default;\n#else\n    bool operator==( CommandBufferInheritanceConditionalRenderingInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( conditionalRenderingEnable == rhs.conditionalRenderingEnable );\n#  endif\n    }\n\n    bool operator!=( CommandBufferInheritanceConditionalRenderingInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                      = StructureType::eCommandBufferInheritanceConditionalRenderingInfoEXT;\n    const void *                        pNext                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        conditionalRenderingEnable = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCommandBufferInheritanceConditionalRenderingInfoEXT>\n  {\n    using Type = CommandBufferInheritanceConditionalRenderingInfoEXT;\n  };\n\n  struct CommandBufferInheritanceRenderPassTransformInfoQCOM\n  {\n    using NativeType = VkCommandBufferInheritanceRenderPassTransformInfoQCOM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCommandBufferInheritanceRenderPassTransformInfoQCOM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CommandBufferInheritanceRenderPassTransformInfoQCOM(\n      VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR transform_  = VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR::eIdentity,\n      VULKAN_HPP_NAMESPACE::Rect2D                      renderArea_ = {},\n      void *                                            pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , transform{ transform_ }\n      , renderArea{ renderArea_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      CommandBufferInheritanceRenderPassTransformInfoQCOM( CommandBufferInheritanceRenderPassTransformInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CommandBufferInheritanceRenderPassTransformInfoQCOM( VkCommandBufferInheritanceRenderPassTransformInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CommandBufferInheritanceRenderPassTransformInfoQCOM( *reinterpret_cast<CommandBufferInheritanceRenderPassTransformInfoQCOM const *>( &rhs ) )\n    {\n    }\n\n    CommandBufferInheritanceRenderPassTransformInfoQCOM &\n      operator=( CommandBufferInheritanceRenderPassTransformInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CommandBufferInheritanceRenderPassTransformInfoQCOM & operator=( VkCommandBufferInheritanceRenderPassTransformInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceRenderPassTransformInfoQCOM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceRenderPassTransformInfoQCOM & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceRenderPassTransformInfoQCOM &\n      setTransform( VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR transform_ ) VULKAN_HPP_NOEXCEPT\n    {\n      transform = transform_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceRenderPassTransformInfoQCOM &\n      setRenderArea( VULKAN_HPP_NAMESPACE::Rect2D const & renderArea_ ) VULKAN_HPP_NOEXCEPT\n    {\n      renderArea = renderArea_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCommandBufferInheritanceRenderPassTransformInfoQCOM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCommandBufferInheritanceRenderPassTransformInfoQCOM *>( this );\n    }\n\n    operator VkCommandBufferInheritanceRenderPassTransformInfoQCOM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCommandBufferInheritanceRenderPassTransformInfoQCOM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR const &,\n               VULKAN_HPP_NAMESPACE::Rect2D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, transform, renderArea );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CommandBufferInheritanceRenderPassTransformInfoQCOM const & ) const = default;\n#else\n    bool operator==( CommandBufferInheritanceRenderPassTransformInfoQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( transform == rhs.transform ) && ( renderArea == rhs.renderArea );\n#  endif\n    }\n\n    bool operator!=( CommandBufferInheritanceRenderPassTransformInfoQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType      = StructureType::eCommandBufferInheritanceRenderPassTransformInfoQCOM;\n    void *                                            pNext      = {};\n    VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR transform  = VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR::eIdentity;\n    VULKAN_HPP_NAMESPACE::Rect2D                      renderArea = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCommandBufferInheritanceRenderPassTransformInfoQCOM>\n  {\n    using Type = CommandBufferInheritanceRenderPassTransformInfoQCOM;\n  };\n\n  struct CommandBufferInheritanceRenderingInfo\n  {\n    using NativeType = VkCommandBufferInheritanceRenderingInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCommandBufferInheritanceRenderingInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      CommandBufferInheritanceRenderingInfo( VULKAN_HPP_NAMESPACE::RenderingFlags      flags_                   = {},\n                                             uint32_t                                  viewMask_                = {},\n                                             uint32_t                                  colorAttachmentCount_    = {},\n                                             const VULKAN_HPP_NAMESPACE::Format *      pColorAttachmentFormats_ = {},\n                                             VULKAN_HPP_NAMESPACE::Format              depthAttachmentFormat_   = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                             VULKAN_HPP_NAMESPACE::Format              stencilAttachmentFormat_ = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                             VULKAN_HPP_NAMESPACE::SampleCountFlagBits rasterizationSamples_    = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1,\n                                             const void *                              pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , viewMask{ viewMask_ }\n      , colorAttachmentCount{ colorAttachmentCount_ }\n      , pColorAttachmentFormats{ pColorAttachmentFormats_ }\n      , depthAttachmentFormat{ depthAttachmentFormat_ }\n      , stencilAttachmentFormat{ stencilAttachmentFormat_ }\n      , rasterizationSamples{ rasterizationSamples_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CommandBufferInheritanceRenderingInfo( CommandBufferInheritanceRenderingInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CommandBufferInheritanceRenderingInfo( VkCommandBufferInheritanceRenderingInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CommandBufferInheritanceRenderingInfo( *reinterpret_cast<CommandBufferInheritanceRenderingInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CommandBufferInheritanceRenderingInfo( VULKAN_HPP_NAMESPACE::RenderingFlags                                                      flags_,\n                                           uint32_t                                                                                  viewMask_,\n                                           VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Format> const & colorAttachmentFormats_,\n                                           VULKAN_HPP_NAMESPACE::Format              depthAttachmentFormat_   = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                           VULKAN_HPP_NAMESPACE::Format              stencilAttachmentFormat_ = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                           VULKAN_HPP_NAMESPACE::SampleCountFlagBits rasterizationSamples_    = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1,\n                                           const void *                              pNext_                   = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , viewMask( viewMask_ )\n      , colorAttachmentCount( static_cast<uint32_t>( colorAttachmentFormats_.size() ) )\n      , pColorAttachmentFormats( colorAttachmentFormats_.data() )\n      , depthAttachmentFormat( depthAttachmentFormat_ )\n      , stencilAttachmentFormat( stencilAttachmentFormat_ )\n      , rasterizationSamples( rasterizationSamples_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    CommandBufferInheritanceRenderingInfo & operator=( CommandBufferInheritanceRenderingInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CommandBufferInheritanceRenderingInfo & operator=( VkCommandBufferInheritanceRenderingInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceRenderingInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceRenderingInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceRenderingInfo & setFlags( VULKAN_HPP_NAMESPACE::RenderingFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceRenderingInfo & setViewMask( uint32_t viewMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      viewMask = viewMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceRenderingInfo & setColorAttachmentCount( uint32_t colorAttachmentCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorAttachmentCount = colorAttachmentCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceRenderingInfo &\n      setPColorAttachmentFormats( const VULKAN_HPP_NAMESPACE::Format * pColorAttachmentFormats_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pColorAttachmentFormats = pColorAttachmentFormats_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CommandBufferInheritanceRenderingInfo & setColorAttachmentFormats(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Format> const & colorAttachmentFormats_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorAttachmentCount    = static_cast<uint32_t>( colorAttachmentFormats_.size() );\n      pColorAttachmentFormats = colorAttachmentFormats_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceRenderingInfo &\n      setDepthAttachmentFormat( VULKAN_HPP_NAMESPACE::Format depthAttachmentFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthAttachmentFormat = depthAttachmentFormat_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceRenderingInfo &\n      setStencilAttachmentFormat( VULKAN_HPP_NAMESPACE::Format stencilAttachmentFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stencilAttachmentFormat = stencilAttachmentFormat_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceRenderingInfo &\n      setRasterizationSamples( VULKAN_HPP_NAMESPACE::SampleCountFlagBits rasterizationSamples_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rasterizationSamples = rasterizationSamples_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCommandBufferInheritanceRenderingInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCommandBufferInheritanceRenderingInfo *>( this );\n    }\n\n    operator VkCommandBufferInheritanceRenderingInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCommandBufferInheritanceRenderingInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::RenderingFlags const &,\n               uint32_t const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::Format * const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlagBits const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie(\n        sType, pNext, flags, viewMask, colorAttachmentCount, pColorAttachmentFormats, depthAttachmentFormat, stencilAttachmentFormat, rasterizationSamples );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CommandBufferInheritanceRenderingInfo const & ) const = default;\n#else\n    bool operator==( CommandBufferInheritanceRenderingInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( viewMask == rhs.viewMask ) &&\n             ( colorAttachmentCount == rhs.colorAttachmentCount ) && ( pColorAttachmentFormats == rhs.pColorAttachmentFormats ) &&\n             ( depthAttachmentFormat == rhs.depthAttachmentFormat ) && ( stencilAttachmentFormat == rhs.stencilAttachmentFormat ) &&\n             ( rasterizationSamples == rhs.rasterizationSamples );\n#  endif\n    }\n\n    bool operator!=( CommandBufferInheritanceRenderingInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType                   = StructureType::eCommandBufferInheritanceRenderingInfo;\n    const void *                              pNext                   = {};\n    VULKAN_HPP_NAMESPACE::RenderingFlags      flags                   = {};\n    uint32_t                                  viewMask                = {};\n    uint32_t                                  colorAttachmentCount    = {};\n    const VULKAN_HPP_NAMESPACE::Format *      pColorAttachmentFormats = {};\n    VULKAN_HPP_NAMESPACE::Format              depthAttachmentFormat   = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::Format              stencilAttachmentFormat = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::SampleCountFlagBits rasterizationSamples    = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCommandBufferInheritanceRenderingInfo>\n  {\n    using Type = CommandBufferInheritanceRenderingInfo;\n  };\n\n  using CommandBufferInheritanceRenderingInfoKHR = CommandBufferInheritanceRenderingInfo;\n\n  struct Viewport\n  {\n    using NativeType = VkViewport;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      Viewport( float x_ = {}, float y_ = {}, float width_ = {}, float height_ = {}, float minDepth_ = {}, float maxDepth_ = {} ) VULKAN_HPP_NOEXCEPT\n      : x{ x_ }\n      , y{ y_ }\n      , width{ width_ }\n      , height{ height_ }\n      , minDepth{ minDepth_ }\n      , maxDepth{ maxDepth_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR Viewport( Viewport const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    Viewport( VkViewport const & rhs ) VULKAN_HPP_NOEXCEPT : Viewport( *reinterpret_cast<Viewport const *>( &rhs ) ) {}\n\n    Viewport & operator=( Viewport const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    Viewport & operator=( VkViewport const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::Viewport const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 Viewport & setX( float x_ ) VULKAN_HPP_NOEXCEPT\n    {\n      x = x_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 Viewport & setY( float y_ ) VULKAN_HPP_NOEXCEPT\n    {\n      y = y_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 Viewport & setWidth( float width_ ) VULKAN_HPP_NOEXCEPT\n    {\n      width = width_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 Viewport & setHeight( float height_ ) VULKAN_HPP_NOEXCEPT\n    {\n      height = height_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 Viewport & setMinDepth( float minDepth_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minDepth = minDepth_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 Viewport & setMaxDepth( float maxDepth_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxDepth = maxDepth_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkViewport const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkViewport *>( this );\n    }\n\n    operator VkViewport &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkViewport *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<float const &, float const &, float const &, float const &, float const &, float const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( x, y, width, height, minDepth, maxDepth );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( Viewport const & ) const = default;\n#else\n    bool operator==( Viewport const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( x == rhs.x ) && ( y == rhs.y ) && ( width == rhs.width ) && ( height == rhs.height ) && ( minDepth == rhs.minDepth ) &&\n             ( maxDepth == rhs.maxDepth );\n#  endif\n    }\n\n    bool operator!=( Viewport const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    float x        = {};\n    float y        = {};\n    float width    = {};\n    float height   = {};\n    float minDepth = {};\n    float maxDepth = {};\n  };\n\n  struct CommandBufferInheritanceViewportScissorInfoNV\n  {\n    using NativeType = VkCommandBufferInheritanceViewportScissorInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCommandBufferInheritanceViewportScissorInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CommandBufferInheritanceViewportScissorInfoNV( VULKAN_HPP_NAMESPACE::Bool32           viewportScissor2D_  = {},\n                                                                        uint32_t                               viewportDepthCount_ = {},\n                                                                        const VULKAN_HPP_NAMESPACE::Viewport * pViewportDepths_    = {},\n                                                                        const void *                           pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , viewportScissor2D{ viewportScissor2D_ }\n      , viewportDepthCount{ viewportDepthCount_ }\n      , pViewportDepths{ pViewportDepths_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      CommandBufferInheritanceViewportScissorInfoNV( CommandBufferInheritanceViewportScissorInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CommandBufferInheritanceViewportScissorInfoNV( VkCommandBufferInheritanceViewportScissorInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CommandBufferInheritanceViewportScissorInfoNV( *reinterpret_cast<CommandBufferInheritanceViewportScissorInfoNV const *>( &rhs ) )\n    {\n    }\n\n    CommandBufferInheritanceViewportScissorInfoNV & operator=( CommandBufferInheritanceViewportScissorInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CommandBufferInheritanceViewportScissorInfoNV & operator=( VkCommandBufferInheritanceViewportScissorInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceViewportScissorInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceViewportScissorInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceViewportScissorInfoNV &\n      setViewportScissor2D( VULKAN_HPP_NAMESPACE::Bool32 viewportScissor2D_ ) VULKAN_HPP_NOEXCEPT\n    {\n      viewportScissor2D = viewportScissor2D_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceViewportScissorInfoNV & setViewportDepthCount( uint32_t viewportDepthCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      viewportDepthCount = viewportDepthCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferInheritanceViewportScissorInfoNV &\n      setPViewportDepths( const VULKAN_HPP_NAMESPACE::Viewport * pViewportDepths_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pViewportDepths = pViewportDepths_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCommandBufferInheritanceViewportScissorInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCommandBufferInheritanceViewportScissorInfoNV *>( this );\n    }\n\n    operator VkCommandBufferInheritanceViewportScissorInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCommandBufferInheritanceViewportScissorInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::Viewport * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, viewportScissor2D, viewportDepthCount, pViewportDepths );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CommandBufferInheritanceViewportScissorInfoNV const & ) const = default;\n#else\n    bool operator==( CommandBufferInheritanceViewportScissorInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( viewportScissor2D == rhs.viewportScissor2D ) &&\n             ( viewportDepthCount == rhs.viewportDepthCount ) && ( pViewportDepths == rhs.pViewportDepths );\n#  endif\n    }\n\n    bool operator!=( CommandBufferInheritanceViewportScissorInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType              = StructureType::eCommandBufferInheritanceViewportScissorInfoNV;\n    const void *                           pNext              = {};\n    VULKAN_HPP_NAMESPACE::Bool32           viewportScissor2D  = {};\n    uint32_t                               viewportDepthCount = {};\n    const VULKAN_HPP_NAMESPACE::Viewport * pViewportDepths    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCommandBufferInheritanceViewportScissorInfoNV>\n  {\n    using Type = CommandBufferInheritanceViewportScissorInfoNV;\n  };\n\n  struct CommandBufferSubmitInfo\n  {\n    using NativeType = VkCommandBufferSubmitInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCommandBufferSubmitInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CommandBufferSubmitInfo( VULKAN_HPP_NAMESPACE::CommandBuffer commandBuffer_ = {},\n                                                  uint32_t                            deviceMask_    = {},\n                                                  const void *                        pNext_         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , commandBuffer{ commandBuffer_ }\n      , deviceMask{ deviceMask_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CommandBufferSubmitInfo( CommandBufferSubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CommandBufferSubmitInfo( VkCommandBufferSubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CommandBufferSubmitInfo( *reinterpret_cast<CommandBufferSubmitInfo const *>( &rhs ) )\n    {\n    }\n\n    CommandBufferSubmitInfo & operator=( CommandBufferSubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CommandBufferSubmitInfo & operator=( VkCommandBufferSubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CommandBufferSubmitInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferSubmitInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferSubmitInfo & setCommandBuffer( VULKAN_HPP_NAMESPACE::CommandBuffer commandBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      commandBuffer = commandBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandBufferSubmitInfo & setDeviceMask( uint32_t deviceMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceMask = deviceMask_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCommandBufferSubmitInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCommandBufferSubmitInfo *>( this );\n    }\n\n    operator VkCommandBufferSubmitInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCommandBufferSubmitInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::CommandBuffer const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, commandBuffer, deviceMask );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CommandBufferSubmitInfo const & ) const = default;\n#else\n    bool operator==( CommandBufferSubmitInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( commandBuffer == rhs.commandBuffer ) && ( deviceMask == rhs.deviceMask );\n#  endif\n    }\n\n    bool operator!=( CommandBufferSubmitInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType         = StructureType::eCommandBufferSubmitInfo;\n    const void *                        pNext         = {};\n    VULKAN_HPP_NAMESPACE::CommandBuffer commandBuffer = {};\n    uint32_t                            deviceMask    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCommandBufferSubmitInfo>\n  {\n    using Type = CommandBufferSubmitInfo;\n  };\n\n  using CommandBufferSubmitInfoKHR = CommandBufferSubmitInfo;\n\n  struct CommandPoolCreateInfo\n  {\n    using NativeType = VkCommandPoolCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCommandPoolCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CommandPoolCreateInfo( VULKAN_HPP_NAMESPACE::CommandPoolCreateFlags flags_            = {},\n                                                uint32_t                                     queueFamilyIndex_ = {},\n                                                const void *                                 pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , queueFamilyIndex{ queueFamilyIndex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CommandPoolCreateInfo( CommandPoolCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CommandPoolCreateInfo( VkCommandPoolCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CommandPoolCreateInfo( *reinterpret_cast<CommandPoolCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    CommandPoolCreateInfo & operator=( CommandPoolCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CommandPoolCreateInfo & operator=( VkCommandPoolCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CommandPoolCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CommandPoolCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandPoolCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::CommandPoolCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CommandPoolCreateInfo & setQueueFamilyIndex( uint32_t queueFamilyIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queueFamilyIndex = queueFamilyIndex_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCommandPoolCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCommandPoolCreateInfo *>( this );\n    }\n\n    operator VkCommandPoolCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCommandPoolCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::CommandPoolCreateFlags const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, queueFamilyIndex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CommandPoolCreateInfo const & ) const = default;\n#else\n    bool operator==( CommandPoolCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( queueFamilyIndex == rhs.queueFamilyIndex );\n#  endif\n    }\n\n    bool operator!=( CommandPoolCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType            = StructureType::eCommandPoolCreateInfo;\n    const void *                                 pNext            = {};\n    VULKAN_HPP_NAMESPACE::CommandPoolCreateFlags flags            = {};\n    uint32_t                                     queueFamilyIndex = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCommandPoolCreateInfo>\n  {\n    using Type = CommandPoolCreateInfo;\n  };\n\n  struct SpecializationMapEntry\n  {\n    using NativeType = VkSpecializationMapEntry;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SpecializationMapEntry( uint32_t constantID_ = {}, uint32_t offset_ = {}, size_t size_ = {} ) VULKAN_HPP_NOEXCEPT\n      : constantID{ constantID_ }\n      , offset{ offset_ }\n      , size{ size_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SpecializationMapEntry( SpecializationMapEntry const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SpecializationMapEntry( VkSpecializationMapEntry const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SpecializationMapEntry( *reinterpret_cast<SpecializationMapEntry const *>( &rhs ) )\n    {\n    }\n\n    SpecializationMapEntry & operator=( SpecializationMapEntry const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SpecializationMapEntry & operator=( VkSpecializationMapEntry const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SpecializationMapEntry const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SpecializationMapEntry & setConstantID( uint32_t constantID_ ) VULKAN_HPP_NOEXCEPT\n    {\n      constantID = constantID_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SpecializationMapEntry & setOffset( uint32_t offset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      offset = offset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SpecializationMapEntry & setSize( size_t size_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size = size_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSpecializationMapEntry const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSpecializationMapEntry *>( this );\n    }\n\n    operator VkSpecializationMapEntry &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSpecializationMapEntry *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &, size_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( constantID, offset, size );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SpecializationMapEntry const & ) const = default;\n#else\n    bool operator==( SpecializationMapEntry const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( constantID == rhs.constantID ) && ( offset == rhs.offset ) && ( size == rhs.size );\n#  endif\n    }\n\n    bool operator!=( SpecializationMapEntry const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t constantID = {};\n    uint32_t offset     = {};\n    size_t   size       = {};\n  };\n\n  struct SpecializationInfo\n  {\n    using NativeType = VkSpecializationInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SpecializationInfo( uint32_t                                             mapEntryCount_ = {},\n                                             const VULKAN_HPP_NAMESPACE::SpecializationMapEntry * pMapEntries_   = {},\n                                             size_t                                               dataSize_      = {},\n                                             const void *                                         pData_         = {} ) VULKAN_HPP_NOEXCEPT\n      : mapEntryCount{ mapEntryCount_ }\n      , pMapEntries{ pMapEntries_ }\n      , dataSize{ dataSize_ }\n      , pData{ pData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SpecializationInfo( SpecializationInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SpecializationInfo( VkSpecializationInfo const & rhs ) VULKAN_HPP_NOEXCEPT : SpecializationInfo( *reinterpret_cast<SpecializationInfo const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    SpecializationInfo( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SpecializationMapEntry> const & mapEntries_,\n                        VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const &                                            data_ = {} )\n      : mapEntryCount( static_cast<uint32_t>( mapEntries_.size() ) )\n      , pMapEntries( mapEntries_.data() )\n      , dataSize( data_.size() * sizeof( T ) )\n      , pData( data_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    SpecializationInfo & operator=( SpecializationInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SpecializationInfo & operator=( VkSpecializationInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SpecializationInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SpecializationInfo & setMapEntryCount( uint32_t mapEntryCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mapEntryCount = mapEntryCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SpecializationInfo & setPMapEntries( const VULKAN_HPP_NAMESPACE::SpecializationMapEntry * pMapEntries_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pMapEntries = pMapEntries_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SpecializationInfo &\n      setMapEntries( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SpecializationMapEntry> const & mapEntries_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mapEntryCount = static_cast<uint32_t>( mapEntries_.size() );\n      pMapEntries   = mapEntries_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 SpecializationInfo & setDataSize( size_t dataSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dataSize = dataSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SpecializationInfo & setPData( const void * pData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pData = pData_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    SpecializationInfo & setData( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & data_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dataSize = data_.size() * sizeof( T );\n      pData    = data_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSpecializationInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSpecializationInfo *>( this );\n    }\n\n    operator VkSpecializationInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSpecializationInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, const VULKAN_HPP_NAMESPACE::SpecializationMapEntry * const &, size_t const &, const void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( mapEntryCount, pMapEntries, dataSize, pData );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SpecializationInfo const & ) const = default;\n#else\n    bool operator==( SpecializationInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( mapEntryCount == rhs.mapEntryCount ) && ( pMapEntries == rhs.pMapEntries ) && ( dataSize == rhs.dataSize ) && ( pData == rhs.pData );\n#  endif\n    }\n\n    bool operator!=( SpecializationInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                                             mapEntryCount = {};\n    const VULKAN_HPP_NAMESPACE::SpecializationMapEntry * pMapEntries   = {};\n    size_t                                               dataSize      = {};\n    const void *                                         pData         = {};\n  };\n\n  struct PipelineShaderStageCreateInfo\n  {\n    using NativeType = VkPipelineShaderStageCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineShaderStageCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineShaderStageCreateInfo( VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateFlags flags_ = {},\n                                                        VULKAN_HPP_NAMESPACE::ShaderStageFlagBits stage_  = VULKAN_HPP_NAMESPACE::ShaderStageFlagBits::eVertex,\n                                                        VULKAN_HPP_NAMESPACE::ShaderModule        module_ = {},\n                                                        const char *                              pName_  = {},\n                                                        const VULKAN_HPP_NAMESPACE::SpecializationInfo * pSpecializationInfo_ = {},\n                                                        const void *                                     pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , stage{ stage_ }\n      , module{ module_ }\n      , pName{ pName_ }\n      , pSpecializationInfo{ pSpecializationInfo_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineShaderStageCreateInfo( PipelineShaderStageCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineShaderStageCreateInfo( VkPipelineShaderStageCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineShaderStageCreateInfo( *reinterpret_cast<PipelineShaderStageCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    PipelineShaderStageCreateInfo & operator=( PipelineShaderStageCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineShaderStageCreateInfo & operator=( VkPipelineShaderStageCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineShaderStageCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineShaderStageCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineShaderStageCreateInfo & setStage( VULKAN_HPP_NAMESPACE::ShaderStageFlagBits stage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stage = stage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineShaderStageCreateInfo & setModule( VULKAN_HPP_NAMESPACE::ShaderModule module_ ) VULKAN_HPP_NOEXCEPT\n    {\n      module = module_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineShaderStageCreateInfo & setPName( const char * pName_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pName = pName_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineShaderStageCreateInfo &\n      setPSpecializationInfo( const VULKAN_HPP_NAMESPACE::SpecializationInfo * pSpecializationInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSpecializationInfo = pSpecializationInfo_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineShaderStageCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineShaderStageCreateInfo *>( this );\n    }\n\n    operator VkPipelineShaderStageCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineShaderStageCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateFlags const &,\n               VULKAN_HPP_NAMESPACE::ShaderStageFlagBits const &,\n               VULKAN_HPP_NAMESPACE::ShaderModule const &,\n               const char * const &,\n               const VULKAN_HPP_NAMESPACE::SpecializationInfo * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, stage, module, pName, pSpecializationInfo );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( PipelineShaderStageCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = flags <=> rhs.flags; cmp != 0 )\n        return cmp;\n      if ( auto cmp = stage <=> rhs.stage; cmp != 0 )\n        return cmp;\n      if ( auto cmp = module <=> rhs.module; cmp != 0 )\n        return cmp;\n      if ( pName != rhs.pName )\n        if ( auto cmp = strcmp( pName, rhs.pName ); cmp != 0 )\n          return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = pSpecializationInfo <=> rhs.pSpecializationInfo; cmp != 0 )\n        return cmp;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( PipelineShaderStageCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( stage == rhs.stage ) && ( module == rhs.module ) &&\n             ( ( pName == rhs.pName ) || ( strcmp( pName, rhs.pName ) == 0 ) ) && ( pSpecializationInfo == rhs.pSpecializationInfo );\n    }\n\n    bool operator!=( PipelineShaderStageCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                  sType               = StructureType::ePipelineShaderStageCreateInfo;\n    const void *                                         pNext               = {};\n    VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateFlags flags               = {};\n    VULKAN_HPP_NAMESPACE::ShaderStageFlagBits            stage               = VULKAN_HPP_NAMESPACE::ShaderStageFlagBits::eVertex;\n    VULKAN_HPP_NAMESPACE::ShaderModule                   module              = {};\n    const char *                                         pName               = {};\n    const VULKAN_HPP_NAMESPACE::SpecializationInfo *     pSpecializationInfo = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineShaderStageCreateInfo>\n  {\n    using Type = PipelineShaderStageCreateInfo;\n  };\n\n  struct ComputePipelineCreateInfo\n  {\n    using NativeType = VkComputePipelineCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eComputePipelineCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ComputePipelineCreateInfo( VULKAN_HPP_NAMESPACE::PipelineCreateFlags           flags_              = {},\n                                                    VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo stage_              = {},\n                                                    VULKAN_HPP_NAMESPACE::PipelineLayout                layout_             = {},\n                                                    VULKAN_HPP_NAMESPACE::Pipeline                      basePipelineHandle_ = {},\n                                                    int32_t                                             basePipelineIndex_  = {},\n                                                    const void *                                        pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , stage{ stage_ }\n      , layout{ layout_ }\n      , basePipelineHandle{ basePipelineHandle_ }\n      , basePipelineIndex{ basePipelineIndex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ComputePipelineCreateInfo( ComputePipelineCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ComputePipelineCreateInfo( VkComputePipelineCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ComputePipelineCreateInfo( *reinterpret_cast<ComputePipelineCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    ComputePipelineCreateInfo & operator=( ComputePipelineCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ComputePipelineCreateInfo & operator=( VkComputePipelineCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ComputePipelineCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ComputePipelineCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::PipelineCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ComputePipelineCreateInfo & setStage( VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo const & stage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stage = stage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ComputePipelineCreateInfo & setLayout( VULKAN_HPP_NAMESPACE::PipelineLayout layout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layout = layout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ComputePipelineCreateInfo & setBasePipelineHandle( VULKAN_HPP_NAMESPACE::Pipeline basePipelineHandle_ ) VULKAN_HPP_NOEXCEPT\n    {\n      basePipelineHandle = basePipelineHandle_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ComputePipelineCreateInfo & setBasePipelineIndex( int32_t basePipelineIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      basePipelineIndex = basePipelineIndex_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkComputePipelineCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkComputePipelineCreateInfo *>( this );\n    }\n\n    operator VkComputePipelineCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkComputePipelineCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineCreateFlags const &,\n               VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo const &,\n               VULKAN_HPP_NAMESPACE::PipelineLayout const &,\n               VULKAN_HPP_NAMESPACE::Pipeline const &,\n               int32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, stage, layout, basePipelineHandle, basePipelineIndex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ComputePipelineCreateInfo const & ) const = default;\n#else\n    bool operator==( ComputePipelineCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( stage == rhs.stage ) && ( layout == rhs.layout ) &&\n             ( basePipelineHandle == rhs.basePipelineHandle ) && ( basePipelineIndex == rhs.basePipelineIndex );\n#  endif\n    }\n\n    bool operator!=( ComputePipelineCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                 sType              = StructureType::eComputePipelineCreateInfo;\n    const void *                                        pNext              = {};\n    VULKAN_HPP_NAMESPACE::PipelineCreateFlags           flags              = {};\n    VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo stage              = {};\n    VULKAN_HPP_NAMESPACE::PipelineLayout                layout             = {};\n    VULKAN_HPP_NAMESPACE::Pipeline                      basePipelineHandle = {};\n    int32_t                                             basePipelineIndex  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eComputePipelineCreateInfo>\n  {\n    using Type = ComputePipelineCreateInfo;\n  };\n\n  struct ComputePipelineIndirectBufferInfoNV\n  {\n    using NativeType = VkComputePipelineIndirectBufferInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eComputePipelineIndirectBufferInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ComputePipelineIndirectBufferInfoNV( VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress_                      = {},\n                                                              VULKAN_HPP_NAMESPACE::DeviceSize    size_                               = {},\n                                                              VULKAN_HPP_NAMESPACE::DeviceAddress pipelineDeviceAddressCaptureReplay_ = {},\n                                                              const void *                        pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , deviceAddress{ deviceAddress_ }\n      , size{ size_ }\n      , pipelineDeviceAddressCaptureReplay{ pipelineDeviceAddressCaptureReplay_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ComputePipelineIndirectBufferInfoNV( ComputePipelineIndirectBufferInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ComputePipelineIndirectBufferInfoNV( VkComputePipelineIndirectBufferInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ComputePipelineIndirectBufferInfoNV( *reinterpret_cast<ComputePipelineIndirectBufferInfoNV const *>( &rhs ) )\n    {\n    }\n\n    ComputePipelineIndirectBufferInfoNV & operator=( ComputePipelineIndirectBufferInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ComputePipelineIndirectBufferInfoNV & operator=( VkComputePipelineIndirectBufferInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ComputePipelineIndirectBufferInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ComputePipelineIndirectBufferInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ComputePipelineIndirectBufferInfoNV & setDeviceAddress( VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceAddress = deviceAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ComputePipelineIndirectBufferInfoNV & setSize( VULKAN_HPP_NAMESPACE::DeviceSize size_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size = size_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ComputePipelineIndirectBufferInfoNV &\n      setPipelineDeviceAddressCaptureReplay( VULKAN_HPP_NAMESPACE::DeviceAddress pipelineDeviceAddressCaptureReplay_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineDeviceAddressCaptureReplay = pipelineDeviceAddressCaptureReplay_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkComputePipelineIndirectBufferInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkComputePipelineIndirectBufferInfoNV *>( this );\n    }\n\n    operator VkComputePipelineIndirectBufferInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkComputePipelineIndirectBufferInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, deviceAddress, size, pipelineDeviceAddressCaptureReplay );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ComputePipelineIndirectBufferInfoNV const & ) const = default;\n#else\n    bool operator==( ComputePipelineIndirectBufferInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( deviceAddress == rhs.deviceAddress ) && ( size == rhs.size ) &&\n             ( pipelineDeviceAddressCaptureReplay == rhs.pipelineDeviceAddressCaptureReplay );\n#  endif\n    }\n\n    bool operator!=( ComputePipelineIndirectBufferInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                              = StructureType::eComputePipelineIndirectBufferInfoNV;\n    const void *                        pNext                              = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress                      = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    size                               = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress pipelineDeviceAddressCaptureReplay = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eComputePipelineIndirectBufferInfoNV>\n  {\n    using Type = ComputePipelineIndirectBufferInfoNV;\n  };\n\n  struct ConditionalRenderingBeginInfoEXT\n  {\n    using NativeType = VkConditionalRenderingBeginInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eConditionalRenderingBeginInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ConditionalRenderingBeginInfoEXT( VULKAN_HPP_NAMESPACE::Buffer                       buffer_ = {},\n                                                           VULKAN_HPP_NAMESPACE::DeviceSize                   offset_ = {},\n                                                           VULKAN_HPP_NAMESPACE::ConditionalRenderingFlagsEXT flags_  = {},\n                                                           const void *                                       pNext_  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , buffer{ buffer_ }\n      , offset{ offset_ }\n      , flags{ flags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ConditionalRenderingBeginInfoEXT( ConditionalRenderingBeginInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ConditionalRenderingBeginInfoEXT( VkConditionalRenderingBeginInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ConditionalRenderingBeginInfoEXT( *reinterpret_cast<ConditionalRenderingBeginInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    ConditionalRenderingBeginInfoEXT & operator=( ConditionalRenderingBeginInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ConditionalRenderingBeginInfoEXT & operator=( VkConditionalRenderingBeginInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ConditionalRenderingBeginInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ConditionalRenderingBeginInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ConditionalRenderingBeginInfoEXT & setBuffer( VULKAN_HPP_NAMESPACE::Buffer buffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      buffer = buffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ConditionalRenderingBeginInfoEXT & setOffset( VULKAN_HPP_NAMESPACE::DeviceSize offset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      offset = offset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ConditionalRenderingBeginInfoEXT & setFlags( VULKAN_HPP_NAMESPACE::ConditionalRenderingFlagsEXT flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkConditionalRenderingBeginInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkConditionalRenderingBeginInfoEXT *>( this );\n    }\n\n    operator VkConditionalRenderingBeginInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkConditionalRenderingBeginInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Buffer const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::ConditionalRenderingFlagsEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, buffer, offset, flags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ConditionalRenderingBeginInfoEXT const & ) const = default;\n#else\n    bool operator==( ConditionalRenderingBeginInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( buffer == rhs.buffer ) && ( offset == rhs.offset ) && ( flags == rhs.flags );\n#  endif\n    }\n\n    bool operator!=( ConditionalRenderingBeginInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                sType  = StructureType::eConditionalRenderingBeginInfoEXT;\n    const void *                                       pNext  = {};\n    VULKAN_HPP_NAMESPACE::Buffer                       buffer = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                   offset = {};\n    VULKAN_HPP_NAMESPACE::ConditionalRenderingFlagsEXT flags  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eConditionalRenderingBeginInfoEXT>\n  {\n    using Type = ConditionalRenderingBeginInfoEXT;\n  };\n\n  struct ConformanceVersion\n  {\n    using NativeType = VkConformanceVersion;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ConformanceVersion( uint8_t major_ = {}, uint8_t minor_ = {}, uint8_t subminor_ = {}, uint8_t patch_ = {} ) VULKAN_HPP_NOEXCEPT\n      : major{ major_ }\n      , minor{ minor_ }\n      , subminor{ subminor_ }\n      , patch{ patch_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ConformanceVersion( ConformanceVersion const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ConformanceVersion( VkConformanceVersion const & rhs ) VULKAN_HPP_NOEXCEPT : ConformanceVersion( *reinterpret_cast<ConformanceVersion const *>( &rhs ) ) {}\n\n    ConformanceVersion & operator=( ConformanceVersion const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ConformanceVersion & operator=( VkConformanceVersion const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ConformanceVersion const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ConformanceVersion & setMajor( uint8_t major_ ) VULKAN_HPP_NOEXCEPT\n    {\n      major = major_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ConformanceVersion & setMinor( uint8_t minor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minor = minor_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ConformanceVersion & setSubminor( uint8_t subminor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subminor = subminor_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ConformanceVersion & setPatch( uint8_t patch_ ) VULKAN_HPP_NOEXCEPT\n    {\n      patch = patch_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkConformanceVersion const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkConformanceVersion *>( this );\n    }\n\n    operator VkConformanceVersion &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkConformanceVersion *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint8_t const &, uint8_t const &, uint8_t const &, uint8_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( major, minor, subminor, patch );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ConformanceVersion const & ) const = default;\n#else\n    bool operator==( ConformanceVersion const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( major == rhs.major ) && ( minor == rhs.minor ) && ( subminor == rhs.subminor ) && ( patch == rhs.patch );\n#  endif\n    }\n\n    bool operator!=( ConformanceVersion const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint8_t major    = {};\n    uint8_t minor    = {};\n    uint8_t subminor = {};\n    uint8_t patch    = {};\n  };\n\n  using ConformanceVersionKHR = ConformanceVersion;\n\n  struct ConvertCooperativeVectorMatrixInfoNV\n  {\n    using NativeType = VkConvertCooperativeVectorMatrixInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eConvertCooperativeVectorMatrixInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 ConvertCooperativeVectorMatrixInfoNV(\n      size_t                                                srcSize_          = {},\n      VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR     srcData_          = {},\n      size_t *                                              pDstSize_         = {},\n      VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR          dstData_          = {},\n      VULKAN_HPP_NAMESPACE::ComponentTypeKHR                srcComponentType_ = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16,\n      VULKAN_HPP_NAMESPACE::ComponentTypeKHR                dstComponentType_ = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16,\n      uint32_t                                              numRows_          = {},\n      uint32_t                                              numColumns_       = {},\n      VULKAN_HPP_NAMESPACE::CooperativeVectorMatrixLayoutNV srcLayout_        = VULKAN_HPP_NAMESPACE::CooperativeVectorMatrixLayoutNV::eRowMajor,\n      size_t                                                srcStride_        = {},\n      VULKAN_HPP_NAMESPACE::CooperativeVectorMatrixLayoutNV dstLayout_        = VULKAN_HPP_NAMESPACE::CooperativeVectorMatrixLayoutNV::eRowMajor,\n      size_t                                                dstStride_        = {},\n      const void *                                          pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , srcSize{ srcSize_ }\n      , srcData{ srcData_ }\n      , pDstSize{ pDstSize_ }\n      , dstData{ dstData_ }\n      , srcComponentType{ srcComponentType_ }\n      , dstComponentType{ dstComponentType_ }\n      , numRows{ numRows_ }\n      , numColumns{ numColumns_ }\n      , srcLayout{ srcLayout_ }\n      , srcStride{ srcStride_ }\n      , dstLayout{ dstLayout_ }\n      , dstStride{ dstStride_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ConvertCooperativeVectorMatrixInfoNV( ConvertCooperativeVectorMatrixInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ConvertCooperativeVectorMatrixInfoNV( VkConvertCooperativeVectorMatrixInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ConvertCooperativeVectorMatrixInfoNV( *reinterpret_cast<ConvertCooperativeVectorMatrixInfoNV const *>( &rhs ) )\n    {\n    }\n\n    ConvertCooperativeVectorMatrixInfoNV & operator=( ConvertCooperativeVectorMatrixInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ConvertCooperativeVectorMatrixInfoNV & operator=( VkConvertCooperativeVectorMatrixInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ConvertCooperativeVectorMatrixInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ConvertCooperativeVectorMatrixInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ConvertCooperativeVectorMatrixInfoNV & setSrcSize( size_t srcSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcSize = srcSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ConvertCooperativeVectorMatrixInfoNV &\n      setSrcData( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & srcData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcData = srcData_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ConvertCooperativeVectorMatrixInfoNV & setPDstSize( size_t * pDstSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDstSize = pDstSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ConvertCooperativeVectorMatrixInfoNV &\n      setDstData( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR const & dstData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstData = dstData_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ConvertCooperativeVectorMatrixInfoNV &\n      setSrcComponentType( VULKAN_HPP_NAMESPACE::ComponentTypeKHR srcComponentType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcComponentType = srcComponentType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ConvertCooperativeVectorMatrixInfoNV &\n      setDstComponentType( VULKAN_HPP_NAMESPACE::ComponentTypeKHR dstComponentType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstComponentType = dstComponentType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ConvertCooperativeVectorMatrixInfoNV & setNumRows( uint32_t numRows_ ) VULKAN_HPP_NOEXCEPT\n    {\n      numRows = numRows_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ConvertCooperativeVectorMatrixInfoNV & setNumColumns( uint32_t numColumns_ ) VULKAN_HPP_NOEXCEPT\n    {\n      numColumns = numColumns_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ConvertCooperativeVectorMatrixInfoNV &\n      setSrcLayout( VULKAN_HPP_NAMESPACE::CooperativeVectorMatrixLayoutNV srcLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcLayout = srcLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ConvertCooperativeVectorMatrixInfoNV & setSrcStride( size_t srcStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcStride = srcStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ConvertCooperativeVectorMatrixInfoNV &\n      setDstLayout( VULKAN_HPP_NAMESPACE::CooperativeVectorMatrixLayoutNV dstLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstLayout = dstLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ConvertCooperativeVectorMatrixInfoNV & setDstStride( size_t dstStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstStride = dstStride_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkConvertCooperativeVectorMatrixInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkConvertCooperativeVectorMatrixInfoNV *>( this );\n    }\n\n    operator VkConvertCooperativeVectorMatrixInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkConvertCooperativeVectorMatrixInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               size_t const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const &,\n               size_t * const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR const &,\n               VULKAN_HPP_NAMESPACE::ComponentTypeKHR const &,\n               VULKAN_HPP_NAMESPACE::ComponentTypeKHR const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::CooperativeVectorMatrixLayoutNV const &,\n               size_t const &,\n               VULKAN_HPP_NAMESPACE::CooperativeVectorMatrixLayoutNV const &,\n               size_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       srcSize,\n                       srcData,\n                       pDstSize,\n                       dstData,\n                       srcComponentType,\n                       dstComponentType,\n                       numRows,\n                       numColumns,\n                       srcLayout,\n                       srcStride,\n                       dstLayout,\n                       dstStride );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                   sType            = StructureType::eConvertCooperativeVectorMatrixInfoNV;\n    const void *                                          pNext            = {};\n    size_t                                                srcSize          = {};\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR     srcData          = {};\n    size_t *                                              pDstSize         = {};\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR          dstData          = {};\n    VULKAN_HPP_NAMESPACE::ComponentTypeKHR                srcComponentType = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16;\n    VULKAN_HPP_NAMESPACE::ComponentTypeKHR                dstComponentType = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16;\n    uint32_t                                              numRows          = {};\n    uint32_t                                              numColumns       = {};\n    VULKAN_HPP_NAMESPACE::CooperativeVectorMatrixLayoutNV srcLayout        = VULKAN_HPP_NAMESPACE::CooperativeVectorMatrixLayoutNV::eRowMajor;\n    size_t                                                srcStride        = {};\n    VULKAN_HPP_NAMESPACE::CooperativeVectorMatrixLayoutNV dstLayout        = VULKAN_HPP_NAMESPACE::CooperativeVectorMatrixLayoutNV::eRowMajor;\n    size_t                                                dstStride        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eConvertCooperativeVectorMatrixInfoNV>\n  {\n    using Type = ConvertCooperativeVectorMatrixInfoNV;\n  };\n\n  struct CooperativeMatrixFlexibleDimensionsPropertiesNV\n  {\n    using NativeType = VkCooperativeMatrixFlexibleDimensionsPropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCooperativeMatrixFlexibleDimensionsPropertiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      CooperativeMatrixFlexibleDimensionsPropertiesNV( uint32_t                               MGranularity_ = {},\n                                                       uint32_t                               NGranularity_ = {},\n                                                       uint32_t                               KGranularity_ = {},\n                                                       VULKAN_HPP_NAMESPACE::ComponentTypeKHR AType_        = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16,\n                                                       VULKAN_HPP_NAMESPACE::ComponentTypeKHR BType_        = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16,\n                                                       VULKAN_HPP_NAMESPACE::ComponentTypeKHR CType_        = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16,\n                                                       VULKAN_HPP_NAMESPACE::ComponentTypeKHR ResultType_   = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16,\n                                                       VULKAN_HPP_NAMESPACE::Bool32           saturatingAccumulation_ = {},\n                                                       VULKAN_HPP_NAMESPACE::ScopeKHR         scope_                  = VULKAN_HPP_NAMESPACE::ScopeKHR::eDevice,\n                                                       uint32_t                               workgroupInvocations_   = {},\n                                                       void *                                 pNext_                  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , MGranularity{ MGranularity_ }\n      , NGranularity{ NGranularity_ }\n      , KGranularity{ KGranularity_ }\n      , AType{ AType_ }\n      , BType{ BType_ }\n      , CType{ CType_ }\n      , ResultType{ ResultType_ }\n      , saturatingAccumulation{ saturatingAccumulation_ }\n      , scope{ scope_ }\n      , workgroupInvocations{ workgroupInvocations_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      CooperativeMatrixFlexibleDimensionsPropertiesNV( CooperativeMatrixFlexibleDimensionsPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CooperativeMatrixFlexibleDimensionsPropertiesNV( VkCooperativeMatrixFlexibleDimensionsPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CooperativeMatrixFlexibleDimensionsPropertiesNV( *reinterpret_cast<CooperativeMatrixFlexibleDimensionsPropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    CooperativeMatrixFlexibleDimensionsPropertiesNV & operator=( CooperativeMatrixFlexibleDimensionsPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CooperativeMatrixFlexibleDimensionsPropertiesNV & operator=( VkCooperativeMatrixFlexibleDimensionsPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CooperativeMatrixFlexibleDimensionsPropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkCooperativeMatrixFlexibleDimensionsPropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCooperativeMatrixFlexibleDimensionsPropertiesNV *>( this );\n    }\n\n    operator VkCooperativeMatrixFlexibleDimensionsPropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCooperativeMatrixFlexibleDimensionsPropertiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ComponentTypeKHR const &,\n               VULKAN_HPP_NAMESPACE::ComponentTypeKHR const &,\n               VULKAN_HPP_NAMESPACE::ComponentTypeKHR const &,\n               VULKAN_HPP_NAMESPACE::ComponentTypeKHR const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::ScopeKHR const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie(\n        sType, pNext, MGranularity, NGranularity, KGranularity, AType, BType, CType, ResultType, saturatingAccumulation, scope, workgroupInvocations );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CooperativeMatrixFlexibleDimensionsPropertiesNV const & ) const = default;\n#else\n    bool operator==( CooperativeMatrixFlexibleDimensionsPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( MGranularity == rhs.MGranularity ) && ( NGranularity == rhs.NGranularity ) &&\n             ( KGranularity == rhs.KGranularity ) && ( AType == rhs.AType ) && ( BType == rhs.BType ) && ( CType == rhs.CType ) &&\n             ( ResultType == rhs.ResultType ) && ( saturatingAccumulation == rhs.saturatingAccumulation ) && ( scope == rhs.scope ) &&\n             ( workgroupInvocations == rhs.workgroupInvocations );\n#  endif\n    }\n\n    bool operator!=( CooperativeMatrixFlexibleDimensionsPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType                  = StructureType::eCooperativeMatrixFlexibleDimensionsPropertiesNV;\n    void *                                 pNext                  = {};\n    uint32_t                               MGranularity           = {};\n    uint32_t                               NGranularity           = {};\n    uint32_t                               KGranularity           = {};\n    VULKAN_HPP_NAMESPACE::ComponentTypeKHR AType                  = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16;\n    VULKAN_HPP_NAMESPACE::ComponentTypeKHR BType                  = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16;\n    VULKAN_HPP_NAMESPACE::ComponentTypeKHR CType                  = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16;\n    VULKAN_HPP_NAMESPACE::ComponentTypeKHR ResultType             = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16;\n    VULKAN_HPP_NAMESPACE::Bool32           saturatingAccumulation = {};\n    VULKAN_HPP_NAMESPACE::ScopeKHR         scope                  = VULKAN_HPP_NAMESPACE::ScopeKHR::eDevice;\n    uint32_t                               workgroupInvocations   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCooperativeMatrixFlexibleDimensionsPropertiesNV>\n  {\n    using Type = CooperativeMatrixFlexibleDimensionsPropertiesNV;\n  };\n\n  struct CooperativeMatrixPropertiesKHR\n  {\n    using NativeType = VkCooperativeMatrixPropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCooperativeMatrixPropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CooperativeMatrixPropertiesKHR( uint32_t                               MSize_      = {},\n                                                         uint32_t                               NSize_      = {},\n                                                         uint32_t                               KSize_      = {},\n                                                         VULKAN_HPP_NAMESPACE::ComponentTypeKHR AType_      = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16,\n                                                         VULKAN_HPP_NAMESPACE::ComponentTypeKHR BType_      = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16,\n                                                         VULKAN_HPP_NAMESPACE::ComponentTypeKHR CType_      = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16,\n                                                         VULKAN_HPP_NAMESPACE::ComponentTypeKHR ResultType_ = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16,\n                                                         VULKAN_HPP_NAMESPACE::Bool32           saturatingAccumulation_ = {},\n                                                         VULKAN_HPP_NAMESPACE::ScopeKHR         scope_ = VULKAN_HPP_NAMESPACE::ScopeKHR::eDevice,\n                                                         void *                                 pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , MSize{ MSize_ }\n      , NSize{ NSize_ }\n      , KSize{ KSize_ }\n      , AType{ AType_ }\n      , BType{ BType_ }\n      , CType{ CType_ }\n      , ResultType{ ResultType_ }\n      , saturatingAccumulation{ saturatingAccumulation_ }\n      , scope{ scope_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CooperativeMatrixPropertiesKHR( CooperativeMatrixPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CooperativeMatrixPropertiesKHR( VkCooperativeMatrixPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CooperativeMatrixPropertiesKHR( *reinterpret_cast<CooperativeMatrixPropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    CooperativeMatrixPropertiesKHR & operator=( CooperativeMatrixPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CooperativeMatrixPropertiesKHR & operator=( VkCooperativeMatrixPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkCooperativeMatrixPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCooperativeMatrixPropertiesKHR *>( this );\n    }\n\n    operator VkCooperativeMatrixPropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCooperativeMatrixPropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ComponentTypeKHR const &,\n               VULKAN_HPP_NAMESPACE::ComponentTypeKHR const &,\n               VULKAN_HPP_NAMESPACE::ComponentTypeKHR const &,\n               VULKAN_HPP_NAMESPACE::ComponentTypeKHR const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::ScopeKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, MSize, NSize, KSize, AType, BType, CType, ResultType, saturatingAccumulation, scope );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CooperativeMatrixPropertiesKHR const & ) const = default;\n#else\n    bool operator==( CooperativeMatrixPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( MSize == rhs.MSize ) && ( NSize == rhs.NSize ) && ( KSize == rhs.KSize ) &&\n             ( AType == rhs.AType ) && ( BType == rhs.BType ) && ( CType == rhs.CType ) && ( ResultType == rhs.ResultType ) &&\n             ( saturatingAccumulation == rhs.saturatingAccumulation ) && ( scope == rhs.scope );\n#  endif\n    }\n\n    bool operator!=( CooperativeMatrixPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType                  = StructureType::eCooperativeMatrixPropertiesKHR;\n    void *                                 pNext                  = {};\n    uint32_t                               MSize                  = {};\n    uint32_t                               NSize                  = {};\n    uint32_t                               KSize                  = {};\n    VULKAN_HPP_NAMESPACE::ComponentTypeKHR AType                  = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16;\n    VULKAN_HPP_NAMESPACE::ComponentTypeKHR BType                  = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16;\n    VULKAN_HPP_NAMESPACE::ComponentTypeKHR CType                  = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16;\n    VULKAN_HPP_NAMESPACE::ComponentTypeKHR ResultType             = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16;\n    VULKAN_HPP_NAMESPACE::Bool32           saturatingAccumulation = {};\n    VULKAN_HPP_NAMESPACE::ScopeKHR         scope                  = VULKAN_HPP_NAMESPACE::ScopeKHR::eDevice;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCooperativeMatrixPropertiesKHR>\n  {\n    using Type = CooperativeMatrixPropertiesKHR;\n  };\n\n  struct CooperativeMatrixPropertiesNV\n  {\n    using NativeType = VkCooperativeMatrixPropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCooperativeMatrixPropertiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CooperativeMatrixPropertiesNV( uint32_t                              MSize_ = {},\n                                                        uint32_t                              NSize_ = {},\n                                                        uint32_t                              KSize_ = {},\n                                                        VULKAN_HPP_NAMESPACE::ComponentTypeNV AType_ = {},\n                                                        VULKAN_HPP_NAMESPACE::ComponentTypeNV BType_ = {},\n                                                        VULKAN_HPP_NAMESPACE::ComponentTypeNV CType_ = {},\n                                                        VULKAN_HPP_NAMESPACE::ComponentTypeNV DType_ = {},\n                                                        VULKAN_HPP_NAMESPACE::ScopeNV         scope_ = {},\n                                                        void *                                pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , MSize{ MSize_ }\n      , NSize{ NSize_ }\n      , KSize{ KSize_ }\n      , AType{ AType_ }\n      , BType{ BType_ }\n      , CType{ CType_ }\n      , DType{ DType_ }\n      , scope{ scope_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CooperativeMatrixPropertiesNV( CooperativeMatrixPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CooperativeMatrixPropertiesNV( VkCooperativeMatrixPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CooperativeMatrixPropertiesNV( *reinterpret_cast<CooperativeMatrixPropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    CooperativeMatrixPropertiesNV & operator=( CooperativeMatrixPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CooperativeMatrixPropertiesNV & operator=( VkCooperativeMatrixPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkCooperativeMatrixPropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCooperativeMatrixPropertiesNV *>( this );\n    }\n\n    operator VkCooperativeMatrixPropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCooperativeMatrixPropertiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ComponentTypeNV const &,\n               VULKAN_HPP_NAMESPACE::ComponentTypeNV const &,\n               VULKAN_HPP_NAMESPACE::ComponentTypeNV const &,\n               VULKAN_HPP_NAMESPACE::ComponentTypeNV const &,\n               VULKAN_HPP_NAMESPACE::ScopeNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, MSize, NSize, KSize, AType, BType, CType, DType, scope );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CooperativeMatrixPropertiesNV const & ) const = default;\n#else\n    bool operator==( CooperativeMatrixPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( MSize == rhs.MSize ) && ( NSize == rhs.NSize ) && ( KSize == rhs.KSize ) &&\n             ( AType == rhs.AType ) && ( BType == rhs.BType ) && ( CType == rhs.CType ) && ( DType == rhs.DType ) && ( scope == rhs.scope );\n#  endif\n    }\n\n    bool operator!=( CooperativeMatrixPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType   sType = StructureType::eCooperativeMatrixPropertiesNV;\n    void *                                pNext = {};\n    uint32_t                              MSize = {};\n    uint32_t                              NSize = {};\n    uint32_t                              KSize = {};\n    VULKAN_HPP_NAMESPACE::ComponentTypeNV AType = {};\n    VULKAN_HPP_NAMESPACE::ComponentTypeNV BType = {};\n    VULKAN_HPP_NAMESPACE::ComponentTypeNV CType = {};\n    VULKAN_HPP_NAMESPACE::ComponentTypeNV DType = {};\n    VULKAN_HPP_NAMESPACE::ScopeNV         scope = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCooperativeMatrixPropertiesNV>\n  {\n    using Type = CooperativeMatrixPropertiesNV;\n  };\n\n  struct CooperativeVectorPropertiesNV\n  {\n    using NativeType = VkCooperativeVectorPropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCooperativeVectorPropertiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      CooperativeVectorPropertiesNV( VULKAN_HPP_NAMESPACE::ComponentTypeKHR inputType_            = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16,\n                                     VULKAN_HPP_NAMESPACE::ComponentTypeKHR inputInterpretation_  = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16,\n                                     VULKAN_HPP_NAMESPACE::ComponentTypeKHR matrixInterpretation_ = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16,\n                                     VULKAN_HPP_NAMESPACE::ComponentTypeKHR biasInterpretation_   = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16,\n                                     VULKAN_HPP_NAMESPACE::ComponentTypeKHR resultType_           = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16,\n                                     VULKAN_HPP_NAMESPACE::Bool32           transpose_            = {},\n                                     void *                                 pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , inputType{ inputType_ }\n      , inputInterpretation{ inputInterpretation_ }\n      , matrixInterpretation{ matrixInterpretation_ }\n      , biasInterpretation{ biasInterpretation_ }\n      , resultType{ resultType_ }\n      , transpose{ transpose_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CooperativeVectorPropertiesNV( CooperativeVectorPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CooperativeVectorPropertiesNV( VkCooperativeVectorPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CooperativeVectorPropertiesNV( *reinterpret_cast<CooperativeVectorPropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    CooperativeVectorPropertiesNV & operator=( CooperativeVectorPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CooperativeVectorPropertiesNV & operator=( VkCooperativeVectorPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CooperativeVectorPropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CooperativeVectorPropertiesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CooperativeVectorPropertiesNV & setInputType( VULKAN_HPP_NAMESPACE::ComponentTypeKHR inputType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      inputType = inputType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CooperativeVectorPropertiesNV &\n      setInputInterpretation( VULKAN_HPP_NAMESPACE::ComponentTypeKHR inputInterpretation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      inputInterpretation = inputInterpretation_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CooperativeVectorPropertiesNV &\n      setMatrixInterpretation( VULKAN_HPP_NAMESPACE::ComponentTypeKHR matrixInterpretation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      matrixInterpretation = matrixInterpretation_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CooperativeVectorPropertiesNV &\n      setBiasInterpretation( VULKAN_HPP_NAMESPACE::ComponentTypeKHR biasInterpretation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      biasInterpretation = biasInterpretation_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CooperativeVectorPropertiesNV & setResultType( VULKAN_HPP_NAMESPACE::ComponentTypeKHR resultType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      resultType = resultType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CooperativeVectorPropertiesNV & setTranspose( VULKAN_HPP_NAMESPACE::Bool32 transpose_ ) VULKAN_HPP_NOEXCEPT\n    {\n      transpose = transpose_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCooperativeVectorPropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCooperativeVectorPropertiesNV *>( this );\n    }\n\n    operator VkCooperativeVectorPropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCooperativeVectorPropertiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::ComponentTypeKHR const &,\n               VULKAN_HPP_NAMESPACE::ComponentTypeKHR const &,\n               VULKAN_HPP_NAMESPACE::ComponentTypeKHR const &,\n               VULKAN_HPP_NAMESPACE::ComponentTypeKHR const &,\n               VULKAN_HPP_NAMESPACE::ComponentTypeKHR const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, inputType, inputInterpretation, matrixInterpretation, biasInterpretation, resultType, transpose );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CooperativeVectorPropertiesNV const & ) const = default;\n#else\n    bool operator==( CooperativeVectorPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( inputType == rhs.inputType ) && ( inputInterpretation == rhs.inputInterpretation ) &&\n             ( matrixInterpretation == rhs.matrixInterpretation ) && ( biasInterpretation == rhs.biasInterpretation ) && ( resultType == rhs.resultType ) &&\n             ( transpose == rhs.transpose );\n#  endif\n    }\n\n    bool operator!=( CooperativeVectorPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType                = StructureType::eCooperativeVectorPropertiesNV;\n    void *                                 pNext                = {};\n    VULKAN_HPP_NAMESPACE::ComponentTypeKHR inputType            = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16;\n    VULKAN_HPP_NAMESPACE::ComponentTypeKHR inputInterpretation  = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16;\n    VULKAN_HPP_NAMESPACE::ComponentTypeKHR matrixInterpretation = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16;\n    VULKAN_HPP_NAMESPACE::ComponentTypeKHR biasInterpretation   = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16;\n    VULKAN_HPP_NAMESPACE::ComponentTypeKHR resultType           = VULKAN_HPP_NAMESPACE::ComponentTypeKHR::eFloat16;\n    VULKAN_HPP_NAMESPACE::Bool32           transpose            = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCooperativeVectorPropertiesNV>\n  {\n    using Type = CooperativeVectorPropertiesNV;\n  };\n\n  struct CopyAccelerationStructureInfoKHR\n  {\n    using NativeType = VkCopyAccelerationStructureInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCopyAccelerationStructureInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CopyAccelerationStructureInfoKHR(\n      VULKAN_HPP_NAMESPACE::AccelerationStructureKHR         src_   = {},\n      VULKAN_HPP_NAMESPACE::AccelerationStructureKHR         dst_   = {},\n      VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR mode_  = VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR::eClone,\n      const void *                                           pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , src{ src_ }\n      , dst{ dst_ }\n      , mode{ mode_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CopyAccelerationStructureInfoKHR( CopyAccelerationStructureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CopyAccelerationStructureInfoKHR( VkCopyAccelerationStructureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CopyAccelerationStructureInfoKHR( *reinterpret_cast<CopyAccelerationStructureInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    CopyAccelerationStructureInfoKHR & operator=( CopyAccelerationStructureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CopyAccelerationStructureInfoKHR & operator=( VkCopyAccelerationStructureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CopyAccelerationStructureInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyAccelerationStructureInfoKHR & setSrc( VULKAN_HPP_NAMESPACE::AccelerationStructureKHR src_ ) VULKAN_HPP_NOEXCEPT\n    {\n      src = src_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyAccelerationStructureInfoKHR & setDst( VULKAN_HPP_NAMESPACE::AccelerationStructureKHR dst_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dst = dst_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyAccelerationStructureInfoKHR & setMode( VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR mode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mode = mode_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCopyAccelerationStructureInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCopyAccelerationStructureInfoKHR *>( this );\n    }\n\n    operator VkCopyAccelerationStructureInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCopyAccelerationStructureInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::AccelerationStructureKHR const &,\n               VULKAN_HPP_NAMESPACE::AccelerationStructureKHR const &,\n               VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, src, dst, mode );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CopyAccelerationStructureInfoKHR const & ) const = default;\n#else\n    bool operator==( CopyAccelerationStructureInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( src == rhs.src ) && ( dst == rhs.dst ) && ( mode == rhs.mode );\n#  endif\n    }\n\n    bool operator!=( CopyAccelerationStructureInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType = StructureType::eCopyAccelerationStructureInfoKHR;\n    const void *                                           pNext = {};\n    VULKAN_HPP_NAMESPACE::AccelerationStructureKHR         src   = {};\n    VULKAN_HPP_NAMESPACE::AccelerationStructureKHR         dst   = {};\n    VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR mode  = VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR::eClone;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCopyAccelerationStructureInfoKHR>\n  {\n    using Type = CopyAccelerationStructureInfoKHR;\n  };\n\n  struct CopyAccelerationStructureToMemoryInfoKHR\n  {\n    using NativeType = VkCopyAccelerationStructureToMemoryInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCopyAccelerationStructureToMemoryInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 CopyAccelerationStructureToMemoryInfoKHR(\n      VULKAN_HPP_NAMESPACE::AccelerationStructureKHR         src_   = {},\n      VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR           dst_   = {},\n      VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR mode_  = VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR::eClone,\n      const void *                                           pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , src{ src_ }\n      , dst{ dst_ }\n      , mode{ mode_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyAccelerationStructureToMemoryInfoKHR( CopyAccelerationStructureToMemoryInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CopyAccelerationStructureToMemoryInfoKHR( VkCopyAccelerationStructureToMemoryInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CopyAccelerationStructureToMemoryInfoKHR( *reinterpret_cast<CopyAccelerationStructureToMemoryInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    CopyAccelerationStructureToMemoryInfoKHR & operator=( CopyAccelerationStructureToMemoryInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CopyAccelerationStructureToMemoryInfoKHR & operator=( VkCopyAccelerationStructureToMemoryInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CopyAccelerationStructureToMemoryInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CopyAccelerationStructureToMemoryInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyAccelerationStructureToMemoryInfoKHR & setSrc( VULKAN_HPP_NAMESPACE::AccelerationStructureKHR src_ ) VULKAN_HPP_NOEXCEPT\n    {\n      src = src_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyAccelerationStructureToMemoryInfoKHR & setDst( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR const & dst_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dst = dst_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyAccelerationStructureToMemoryInfoKHR &\n      setMode( VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR mode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mode = mode_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCopyAccelerationStructureToMemoryInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCopyAccelerationStructureToMemoryInfoKHR *>( this );\n    }\n\n    operator VkCopyAccelerationStructureToMemoryInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCopyAccelerationStructureToMemoryInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::AccelerationStructureKHR const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR const &,\n               VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, src, dst, mode );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType = StructureType::eCopyAccelerationStructureToMemoryInfoKHR;\n    const void *                                           pNext = {};\n    VULKAN_HPP_NAMESPACE::AccelerationStructureKHR         src   = {};\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR           dst   = {};\n    VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR mode  = VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR::eClone;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCopyAccelerationStructureToMemoryInfoKHR>\n  {\n    using Type = CopyAccelerationStructureToMemoryInfoKHR;\n  };\n\n  struct CopyBufferInfo2\n  {\n    using NativeType = VkCopyBufferInfo2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCopyBufferInfo2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CopyBufferInfo2( VULKAN_HPP_NAMESPACE::Buffer              srcBuffer_   = {},\n                                          VULKAN_HPP_NAMESPACE::Buffer              dstBuffer_   = {},\n                                          uint32_t                                  regionCount_ = {},\n                                          const VULKAN_HPP_NAMESPACE::BufferCopy2 * pRegions_    = {},\n                                          const void *                              pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , srcBuffer{ srcBuffer_ }\n      , dstBuffer{ dstBuffer_ }\n      , regionCount{ regionCount_ }\n      , pRegions{ pRegions_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CopyBufferInfo2( CopyBufferInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CopyBufferInfo2( VkCopyBufferInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT : CopyBufferInfo2( *reinterpret_cast<CopyBufferInfo2 const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CopyBufferInfo2( VULKAN_HPP_NAMESPACE::Buffer                                                                   srcBuffer_,\n                     VULKAN_HPP_NAMESPACE::Buffer                                                                   dstBuffer_,\n                     VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::BufferCopy2> const & regions_,\n                     const void *                                                                                   pNext_ = nullptr )\n      : pNext( pNext_ ), srcBuffer( srcBuffer_ ), dstBuffer( dstBuffer_ ), regionCount( static_cast<uint32_t>( regions_.size() ) ), pRegions( regions_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    CopyBufferInfo2 & operator=( CopyBufferInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CopyBufferInfo2 & operator=( VkCopyBufferInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CopyBufferInfo2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CopyBufferInfo2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyBufferInfo2 & setSrcBuffer( VULKAN_HPP_NAMESPACE::Buffer srcBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcBuffer = srcBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyBufferInfo2 & setDstBuffer( VULKAN_HPP_NAMESPACE::Buffer dstBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstBuffer = dstBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyBufferInfo2 & setRegionCount( uint32_t regionCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      regionCount = regionCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyBufferInfo2 & setPRegions( const VULKAN_HPP_NAMESPACE::BufferCopy2 * pRegions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pRegions = pRegions_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CopyBufferInfo2 & setRegions( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::BufferCopy2> const & regions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      regionCount = static_cast<uint32_t>( regions_.size() );\n      pRegions    = regions_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCopyBufferInfo2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCopyBufferInfo2 *>( this );\n    }\n\n    operator VkCopyBufferInfo2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCopyBufferInfo2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Buffer const &,\n               VULKAN_HPP_NAMESPACE::Buffer const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::BufferCopy2 * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, srcBuffer, dstBuffer, regionCount, pRegions );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CopyBufferInfo2 const & ) const = default;\n#else\n    bool operator==( CopyBufferInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( srcBuffer == rhs.srcBuffer ) && ( dstBuffer == rhs.dstBuffer ) &&\n             ( regionCount == rhs.regionCount ) && ( pRegions == rhs.pRegions );\n#  endif\n    }\n\n    bool operator!=( CopyBufferInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType       = StructureType::eCopyBufferInfo2;\n    const void *                              pNext       = {};\n    VULKAN_HPP_NAMESPACE::Buffer              srcBuffer   = {};\n    VULKAN_HPP_NAMESPACE::Buffer              dstBuffer   = {};\n    uint32_t                                  regionCount = {};\n    const VULKAN_HPP_NAMESPACE::BufferCopy2 * pRegions    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCopyBufferInfo2>\n  {\n    using Type = CopyBufferInfo2;\n  };\n\n  using CopyBufferInfo2KHR = CopyBufferInfo2;\n\n  struct CopyBufferToImageInfo2\n  {\n    using NativeType = VkCopyBufferToImageInfo2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCopyBufferToImageInfo2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CopyBufferToImageInfo2( VULKAN_HPP_NAMESPACE::Buffer                   srcBuffer_      = {},\n                                                 VULKAN_HPP_NAMESPACE::Image                    dstImage_       = {},\n                                                 VULKAN_HPP_NAMESPACE::ImageLayout              dstImageLayout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                                 uint32_t                                       regionCount_    = {},\n                                                 const VULKAN_HPP_NAMESPACE::BufferImageCopy2 * pRegions_       = {},\n                                                 const void *                                   pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , srcBuffer{ srcBuffer_ }\n      , dstImage{ dstImage_ }\n      , dstImageLayout{ dstImageLayout_ }\n      , regionCount{ regionCount_ }\n      , pRegions{ pRegions_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CopyBufferToImageInfo2( CopyBufferToImageInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CopyBufferToImageInfo2( VkCopyBufferToImageInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CopyBufferToImageInfo2( *reinterpret_cast<CopyBufferToImageInfo2 const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CopyBufferToImageInfo2( VULKAN_HPP_NAMESPACE::Buffer                                                                        srcBuffer_,\n                            VULKAN_HPP_NAMESPACE::Image                                                                         dstImage_,\n                            VULKAN_HPP_NAMESPACE::ImageLayout                                                                   dstImageLayout_,\n                            VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::BufferImageCopy2> const & regions_,\n                            const void *                                                                                        pNext_ = nullptr )\n      : pNext( pNext_ )\n      , srcBuffer( srcBuffer_ )\n      , dstImage( dstImage_ )\n      , dstImageLayout( dstImageLayout_ )\n      , regionCount( static_cast<uint32_t>( regions_.size() ) )\n      , pRegions( regions_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    CopyBufferToImageInfo2 & operator=( CopyBufferToImageInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CopyBufferToImageInfo2 & operator=( VkCopyBufferToImageInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CopyBufferToImageInfo2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyBufferToImageInfo2 & setSrcBuffer( VULKAN_HPP_NAMESPACE::Buffer srcBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcBuffer = srcBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyBufferToImageInfo2 & setDstImage( VULKAN_HPP_NAMESPACE::Image dstImage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstImage = dstImage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyBufferToImageInfo2 & setDstImageLayout( VULKAN_HPP_NAMESPACE::ImageLayout dstImageLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstImageLayout = dstImageLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyBufferToImageInfo2 & setRegionCount( uint32_t regionCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      regionCount = regionCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyBufferToImageInfo2 & setPRegions( const VULKAN_HPP_NAMESPACE::BufferImageCopy2 * pRegions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pRegions = pRegions_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CopyBufferToImageInfo2 &\n      setRegions( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::BufferImageCopy2> const & regions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      regionCount = static_cast<uint32_t>( regions_.size() );\n      pRegions    = regions_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCopyBufferToImageInfo2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCopyBufferToImageInfo2 *>( this );\n    }\n\n    operator VkCopyBufferToImageInfo2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCopyBufferToImageInfo2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Buffer const &,\n               VULKAN_HPP_NAMESPACE::Image const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::BufferImageCopy2 * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CopyBufferToImageInfo2 const & ) const = default;\n#else\n    bool operator==( CopyBufferToImageInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( srcBuffer == rhs.srcBuffer ) && ( dstImage == rhs.dstImage ) &&\n             ( dstImageLayout == rhs.dstImageLayout ) && ( regionCount == rhs.regionCount ) && ( pRegions == rhs.pRegions );\n#  endif\n    }\n\n    bool operator!=( CopyBufferToImageInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType            sType          = StructureType::eCopyBufferToImageInfo2;\n    const void *                                   pNext          = {};\n    VULKAN_HPP_NAMESPACE::Buffer                   srcBuffer      = {};\n    VULKAN_HPP_NAMESPACE::Image                    dstImage       = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout              dstImageLayout = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    uint32_t                                       regionCount    = {};\n    const VULKAN_HPP_NAMESPACE::BufferImageCopy2 * pRegions       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCopyBufferToImageInfo2>\n  {\n    using Type = CopyBufferToImageInfo2;\n  };\n\n  using CopyBufferToImageInfo2KHR = CopyBufferToImageInfo2;\n\n  struct CopyCommandTransformInfoQCOM\n  {\n    using NativeType = VkCopyCommandTransformInfoQCOM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCopyCommandTransformInfoQCOM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      CopyCommandTransformInfoQCOM( VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR transform_ = VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR::eIdentity,\n                                    const void *                                      pNext_     = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , transform{ transform_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CopyCommandTransformInfoQCOM( CopyCommandTransformInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CopyCommandTransformInfoQCOM( VkCopyCommandTransformInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CopyCommandTransformInfoQCOM( *reinterpret_cast<CopyCommandTransformInfoQCOM const *>( &rhs ) )\n    {\n    }\n\n    CopyCommandTransformInfoQCOM & operator=( CopyCommandTransformInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CopyCommandTransformInfoQCOM & operator=( VkCopyCommandTransformInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CopyCommandTransformInfoQCOM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CopyCommandTransformInfoQCOM & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyCommandTransformInfoQCOM & setTransform( VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR transform_ ) VULKAN_HPP_NOEXCEPT\n    {\n      transform = transform_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCopyCommandTransformInfoQCOM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCopyCommandTransformInfoQCOM *>( this );\n    }\n\n    operator VkCopyCommandTransformInfoQCOM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCopyCommandTransformInfoQCOM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, transform );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CopyCommandTransformInfoQCOM const & ) const = default;\n#else\n    bool operator==( CopyCommandTransformInfoQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( transform == rhs.transform );\n#  endif\n    }\n\n    bool operator!=( CopyCommandTransformInfoQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType     = StructureType::eCopyCommandTransformInfoQCOM;\n    const void *                                      pNext     = {};\n    VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR transform = VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR::eIdentity;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCopyCommandTransformInfoQCOM>\n  {\n    using Type = CopyCommandTransformInfoQCOM;\n  };\n\n  struct CopyDescriptorSet\n  {\n    using NativeType = VkCopyDescriptorSet;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCopyDescriptorSet;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CopyDescriptorSet( VULKAN_HPP_NAMESPACE::DescriptorSet srcSet_          = {},\n                                            uint32_t                            srcBinding_      = {},\n                                            uint32_t                            srcArrayElement_ = {},\n                                            VULKAN_HPP_NAMESPACE::DescriptorSet dstSet_          = {},\n                                            uint32_t                            dstBinding_      = {},\n                                            uint32_t                            dstArrayElement_ = {},\n                                            uint32_t                            descriptorCount_ = {},\n                                            const void *                        pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , srcSet{ srcSet_ }\n      , srcBinding{ srcBinding_ }\n      , srcArrayElement{ srcArrayElement_ }\n      , dstSet{ dstSet_ }\n      , dstBinding{ dstBinding_ }\n      , dstArrayElement{ dstArrayElement_ }\n      , descriptorCount{ descriptorCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CopyDescriptorSet( CopyDescriptorSet const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CopyDescriptorSet( VkCopyDescriptorSet const & rhs ) VULKAN_HPP_NOEXCEPT : CopyDescriptorSet( *reinterpret_cast<CopyDescriptorSet const *>( &rhs ) ) {}\n\n    CopyDescriptorSet & operator=( CopyDescriptorSet const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CopyDescriptorSet & operator=( VkCopyDescriptorSet const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CopyDescriptorSet const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CopyDescriptorSet & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyDescriptorSet & setSrcSet( VULKAN_HPP_NAMESPACE::DescriptorSet srcSet_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcSet = srcSet_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyDescriptorSet & setSrcBinding( uint32_t srcBinding_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcBinding = srcBinding_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyDescriptorSet & setSrcArrayElement( uint32_t srcArrayElement_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcArrayElement = srcArrayElement_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyDescriptorSet & setDstSet( VULKAN_HPP_NAMESPACE::DescriptorSet dstSet_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstSet = dstSet_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyDescriptorSet & setDstBinding( uint32_t dstBinding_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstBinding = dstBinding_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyDescriptorSet & setDstArrayElement( uint32_t dstArrayElement_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstArrayElement = dstArrayElement_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyDescriptorSet & setDescriptorCount( uint32_t descriptorCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorCount = descriptorCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCopyDescriptorSet const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCopyDescriptorSet *>( this );\n    }\n\n    operator VkCopyDescriptorSet &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCopyDescriptorSet *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DescriptorSet const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::DescriptorSet const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, srcSet, srcBinding, srcArrayElement, dstSet, dstBinding, dstArrayElement, descriptorCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CopyDescriptorSet const & ) const = default;\n#else\n    bool operator==( CopyDescriptorSet const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( srcSet == rhs.srcSet ) && ( srcBinding == rhs.srcBinding ) &&\n             ( srcArrayElement == rhs.srcArrayElement ) && ( dstSet == rhs.dstSet ) && ( dstBinding == rhs.dstBinding ) &&\n             ( dstArrayElement == rhs.dstArrayElement ) && ( descriptorCount == rhs.descriptorCount );\n#  endif\n    }\n\n    bool operator!=( CopyDescriptorSet const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType           = StructureType::eCopyDescriptorSet;\n    const void *                        pNext           = {};\n    VULKAN_HPP_NAMESPACE::DescriptorSet srcSet          = {};\n    uint32_t                            srcBinding      = {};\n    uint32_t                            srcArrayElement = {};\n    VULKAN_HPP_NAMESPACE::DescriptorSet dstSet          = {};\n    uint32_t                            dstBinding      = {};\n    uint32_t                            dstArrayElement = {};\n    uint32_t                            descriptorCount = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCopyDescriptorSet>\n  {\n    using Type = CopyDescriptorSet;\n  };\n\n  struct ImageCopy2\n  {\n    using NativeType = VkImageCopy2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageCopy2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageCopy2( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers srcSubresource_ = {},\n                                     VULKAN_HPP_NAMESPACE::Offset3D               srcOffset_      = {},\n                                     VULKAN_HPP_NAMESPACE::ImageSubresourceLayers dstSubresource_ = {},\n                                     VULKAN_HPP_NAMESPACE::Offset3D               dstOffset_      = {},\n                                     VULKAN_HPP_NAMESPACE::Extent3D               extent_         = {},\n                                     const void *                                 pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , srcSubresource{ srcSubresource_ }\n      , srcOffset{ srcOffset_ }\n      , dstSubresource{ dstSubresource_ }\n      , dstOffset{ dstOffset_ }\n      , extent{ extent_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageCopy2( ImageCopy2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageCopy2( VkImageCopy2 const & rhs ) VULKAN_HPP_NOEXCEPT : ImageCopy2( *reinterpret_cast<ImageCopy2 const *>( &rhs ) ) {}\n\n    ImageCopy2 & operator=( ImageCopy2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageCopy2 & operator=( VkImageCopy2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageCopy2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageCopy2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCopy2 & setSrcSubresource( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const & srcSubresource_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcSubresource = srcSubresource_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCopy2 & setSrcOffset( VULKAN_HPP_NAMESPACE::Offset3D const & srcOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcOffset = srcOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCopy2 & setDstSubresource( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const & dstSubresource_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstSubresource = dstSubresource_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCopy2 & setDstOffset( VULKAN_HPP_NAMESPACE::Offset3D const & dstOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstOffset = dstOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCopy2 & setExtent( VULKAN_HPP_NAMESPACE::Extent3D const & extent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extent = extent_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageCopy2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageCopy2 *>( this );\n    }\n\n    operator VkImageCopy2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageCopy2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const &,\n               VULKAN_HPP_NAMESPACE::Offset3D const &,\n               VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const &,\n               VULKAN_HPP_NAMESPACE::Offset3D const &,\n               VULKAN_HPP_NAMESPACE::Extent3D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, srcSubresource, srcOffset, dstSubresource, dstOffset, extent );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageCopy2 const & ) const = default;\n#else\n    bool operator==( ImageCopy2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( srcSubresource == rhs.srcSubresource ) && ( srcOffset == rhs.srcOffset ) &&\n             ( dstSubresource == rhs.dstSubresource ) && ( dstOffset == rhs.dstOffset ) && ( extent == rhs.extent );\n#  endif\n    }\n\n    bool operator!=( ImageCopy2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType          = StructureType::eImageCopy2;\n    const void *                                 pNext          = {};\n    VULKAN_HPP_NAMESPACE::ImageSubresourceLayers srcSubresource = {};\n    VULKAN_HPP_NAMESPACE::Offset3D               srcOffset      = {};\n    VULKAN_HPP_NAMESPACE::ImageSubresourceLayers dstSubresource = {};\n    VULKAN_HPP_NAMESPACE::Offset3D               dstOffset      = {};\n    VULKAN_HPP_NAMESPACE::Extent3D               extent         = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageCopy2>\n  {\n    using Type = ImageCopy2;\n  };\n\n  using ImageCopy2KHR = ImageCopy2;\n\n  struct CopyImageInfo2\n  {\n    using NativeType = VkCopyImageInfo2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCopyImageInfo2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CopyImageInfo2( VULKAN_HPP_NAMESPACE::Image              srcImage_       = {},\n                                         VULKAN_HPP_NAMESPACE::ImageLayout        srcImageLayout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                         VULKAN_HPP_NAMESPACE::Image              dstImage_       = {},\n                                         VULKAN_HPP_NAMESPACE::ImageLayout        dstImageLayout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                         uint32_t                                 regionCount_    = {},\n                                         const VULKAN_HPP_NAMESPACE::ImageCopy2 * pRegions_       = {},\n                                         const void *                             pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , srcImage{ srcImage_ }\n      , srcImageLayout{ srcImageLayout_ }\n      , dstImage{ dstImage_ }\n      , dstImageLayout{ dstImageLayout_ }\n      , regionCount{ regionCount_ }\n      , pRegions{ pRegions_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CopyImageInfo2( CopyImageInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CopyImageInfo2( VkCopyImageInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT : CopyImageInfo2( *reinterpret_cast<CopyImageInfo2 const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CopyImageInfo2( VULKAN_HPP_NAMESPACE::Image                                                                   srcImage_,\n                    VULKAN_HPP_NAMESPACE::ImageLayout                                                             srcImageLayout_,\n                    VULKAN_HPP_NAMESPACE::Image                                                                   dstImage_,\n                    VULKAN_HPP_NAMESPACE::ImageLayout                                                             dstImageLayout_,\n                    VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageCopy2> const & regions_,\n                    const void *                                                                                  pNext_ = nullptr )\n      : pNext( pNext_ )\n      , srcImage( srcImage_ )\n      , srcImageLayout( srcImageLayout_ )\n      , dstImage( dstImage_ )\n      , dstImageLayout( dstImageLayout_ )\n      , regionCount( static_cast<uint32_t>( regions_.size() ) )\n      , pRegions( regions_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    CopyImageInfo2 & operator=( CopyImageInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CopyImageInfo2 & operator=( VkCopyImageInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CopyImageInfo2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CopyImageInfo2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyImageInfo2 & setSrcImage( VULKAN_HPP_NAMESPACE::Image srcImage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcImage = srcImage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyImageInfo2 & setSrcImageLayout( VULKAN_HPP_NAMESPACE::ImageLayout srcImageLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcImageLayout = srcImageLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyImageInfo2 & setDstImage( VULKAN_HPP_NAMESPACE::Image dstImage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstImage = dstImage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyImageInfo2 & setDstImageLayout( VULKAN_HPP_NAMESPACE::ImageLayout dstImageLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstImageLayout = dstImageLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyImageInfo2 & setRegionCount( uint32_t regionCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      regionCount = regionCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyImageInfo2 & setPRegions( const VULKAN_HPP_NAMESPACE::ImageCopy2 * pRegions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pRegions = pRegions_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CopyImageInfo2 & setRegions( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageCopy2> const & regions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      regionCount = static_cast<uint32_t>( regions_.size() );\n      pRegions    = regions_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCopyImageInfo2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCopyImageInfo2 *>( this );\n    }\n\n    operator VkCopyImageInfo2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCopyImageInfo2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Image const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               VULKAN_HPP_NAMESPACE::Image const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::ImageCopy2 * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CopyImageInfo2 const & ) const = default;\n#else\n    bool operator==( CopyImageInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( srcImage == rhs.srcImage ) && ( srcImageLayout == rhs.srcImageLayout ) &&\n             ( dstImage == rhs.dstImage ) && ( dstImageLayout == rhs.dstImageLayout ) && ( regionCount == rhs.regionCount ) && ( pRegions == rhs.pRegions );\n#  endif\n    }\n\n    bool operator!=( CopyImageInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType      sType          = StructureType::eCopyImageInfo2;\n    const void *                             pNext          = {};\n    VULKAN_HPP_NAMESPACE::Image              srcImage       = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout        srcImageLayout = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    VULKAN_HPP_NAMESPACE::Image              dstImage       = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout        dstImageLayout = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    uint32_t                                 regionCount    = {};\n    const VULKAN_HPP_NAMESPACE::ImageCopy2 * pRegions       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCopyImageInfo2>\n  {\n    using Type = CopyImageInfo2;\n  };\n\n  using CopyImageInfo2KHR = CopyImageInfo2;\n\n  struct CopyImageToBufferInfo2\n  {\n    using NativeType = VkCopyImageToBufferInfo2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCopyImageToBufferInfo2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CopyImageToBufferInfo2( VULKAN_HPP_NAMESPACE::Image                    srcImage_       = {},\n                                                 VULKAN_HPP_NAMESPACE::ImageLayout              srcImageLayout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                                 VULKAN_HPP_NAMESPACE::Buffer                   dstBuffer_      = {},\n                                                 uint32_t                                       regionCount_    = {},\n                                                 const VULKAN_HPP_NAMESPACE::BufferImageCopy2 * pRegions_       = {},\n                                                 const void *                                   pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , srcImage{ srcImage_ }\n      , srcImageLayout{ srcImageLayout_ }\n      , dstBuffer{ dstBuffer_ }\n      , regionCount{ regionCount_ }\n      , pRegions{ pRegions_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CopyImageToBufferInfo2( CopyImageToBufferInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CopyImageToBufferInfo2( VkCopyImageToBufferInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CopyImageToBufferInfo2( *reinterpret_cast<CopyImageToBufferInfo2 const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CopyImageToBufferInfo2( VULKAN_HPP_NAMESPACE::Image                                                                         srcImage_,\n                            VULKAN_HPP_NAMESPACE::ImageLayout                                                                   srcImageLayout_,\n                            VULKAN_HPP_NAMESPACE::Buffer                                                                        dstBuffer_,\n                            VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::BufferImageCopy2> const & regions_,\n                            const void *                                                                                        pNext_ = nullptr )\n      : pNext( pNext_ )\n      , srcImage( srcImage_ )\n      , srcImageLayout( srcImageLayout_ )\n      , dstBuffer( dstBuffer_ )\n      , regionCount( static_cast<uint32_t>( regions_.size() ) )\n      , pRegions( regions_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    CopyImageToBufferInfo2 & operator=( CopyImageToBufferInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CopyImageToBufferInfo2 & operator=( VkCopyImageToBufferInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CopyImageToBufferInfo2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyImageToBufferInfo2 & setSrcImage( VULKAN_HPP_NAMESPACE::Image srcImage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcImage = srcImage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyImageToBufferInfo2 & setSrcImageLayout( VULKAN_HPP_NAMESPACE::ImageLayout srcImageLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcImageLayout = srcImageLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyImageToBufferInfo2 & setDstBuffer( VULKAN_HPP_NAMESPACE::Buffer dstBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstBuffer = dstBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyImageToBufferInfo2 & setRegionCount( uint32_t regionCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      regionCount = regionCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyImageToBufferInfo2 & setPRegions( const VULKAN_HPP_NAMESPACE::BufferImageCopy2 * pRegions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pRegions = pRegions_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CopyImageToBufferInfo2 &\n      setRegions( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::BufferImageCopy2> const & regions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      regionCount = static_cast<uint32_t>( regions_.size() );\n      pRegions    = regions_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCopyImageToBufferInfo2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCopyImageToBufferInfo2 *>( this );\n    }\n\n    operator VkCopyImageToBufferInfo2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCopyImageToBufferInfo2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Image const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               VULKAN_HPP_NAMESPACE::Buffer const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::BufferImageCopy2 * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CopyImageToBufferInfo2 const & ) const = default;\n#else\n    bool operator==( CopyImageToBufferInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( srcImage == rhs.srcImage ) && ( srcImageLayout == rhs.srcImageLayout ) &&\n             ( dstBuffer == rhs.dstBuffer ) && ( regionCount == rhs.regionCount ) && ( pRegions == rhs.pRegions );\n#  endif\n    }\n\n    bool operator!=( CopyImageToBufferInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType            sType          = StructureType::eCopyImageToBufferInfo2;\n    const void *                                   pNext          = {};\n    VULKAN_HPP_NAMESPACE::Image                    srcImage       = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout              srcImageLayout = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    VULKAN_HPP_NAMESPACE::Buffer                   dstBuffer      = {};\n    uint32_t                                       regionCount    = {};\n    const VULKAN_HPP_NAMESPACE::BufferImageCopy2 * pRegions       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCopyImageToBufferInfo2>\n  {\n    using Type = CopyImageToBufferInfo2;\n  };\n\n  using CopyImageToBufferInfo2KHR = CopyImageToBufferInfo2;\n\n  struct CopyImageToImageInfo\n  {\n    using NativeType = VkCopyImageToImageInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCopyImageToImageInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CopyImageToImageInfo( VULKAN_HPP_NAMESPACE::HostImageCopyFlags flags_          = {},\n                                               VULKAN_HPP_NAMESPACE::Image              srcImage_       = {},\n                                               VULKAN_HPP_NAMESPACE::ImageLayout        srcImageLayout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                               VULKAN_HPP_NAMESPACE::Image              dstImage_       = {},\n                                               VULKAN_HPP_NAMESPACE::ImageLayout        dstImageLayout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                               uint32_t                                 regionCount_    = {},\n                                               const VULKAN_HPP_NAMESPACE::ImageCopy2 * pRegions_       = {},\n                                               const void *                             pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , srcImage{ srcImage_ }\n      , srcImageLayout{ srcImageLayout_ }\n      , dstImage{ dstImage_ }\n      , dstImageLayout{ dstImageLayout_ }\n      , regionCount{ regionCount_ }\n      , pRegions{ pRegions_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CopyImageToImageInfo( CopyImageToImageInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CopyImageToImageInfo( VkCopyImageToImageInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CopyImageToImageInfo( *reinterpret_cast<CopyImageToImageInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CopyImageToImageInfo( VULKAN_HPP_NAMESPACE::HostImageCopyFlags                                                      flags_,\n                          VULKAN_HPP_NAMESPACE::Image                                                                   srcImage_,\n                          VULKAN_HPP_NAMESPACE::ImageLayout                                                             srcImageLayout_,\n                          VULKAN_HPP_NAMESPACE::Image                                                                   dstImage_,\n                          VULKAN_HPP_NAMESPACE::ImageLayout                                                             dstImageLayout_,\n                          VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageCopy2> const & regions_,\n                          const void *                                                                                  pNext_ = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , srcImage( srcImage_ )\n      , srcImageLayout( srcImageLayout_ )\n      , dstImage( dstImage_ )\n      , dstImageLayout( dstImageLayout_ )\n      , regionCount( static_cast<uint32_t>( regions_.size() ) )\n      , pRegions( regions_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    CopyImageToImageInfo & operator=( CopyImageToImageInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CopyImageToImageInfo & operator=( VkCopyImageToImageInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CopyImageToImageInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CopyImageToImageInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyImageToImageInfo & setFlags( VULKAN_HPP_NAMESPACE::HostImageCopyFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyImageToImageInfo & setSrcImage( VULKAN_HPP_NAMESPACE::Image srcImage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcImage = srcImage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyImageToImageInfo & setSrcImageLayout( VULKAN_HPP_NAMESPACE::ImageLayout srcImageLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcImageLayout = srcImageLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyImageToImageInfo & setDstImage( VULKAN_HPP_NAMESPACE::Image dstImage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstImage = dstImage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyImageToImageInfo & setDstImageLayout( VULKAN_HPP_NAMESPACE::ImageLayout dstImageLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstImageLayout = dstImageLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyImageToImageInfo & setRegionCount( uint32_t regionCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      regionCount = regionCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyImageToImageInfo & setPRegions( const VULKAN_HPP_NAMESPACE::ImageCopy2 * pRegions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pRegions = pRegions_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CopyImageToImageInfo &\n      setRegions( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageCopy2> const & regions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      regionCount = static_cast<uint32_t>( regions_.size() );\n      pRegions    = regions_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCopyImageToImageInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCopyImageToImageInfo *>( this );\n    }\n\n    operator VkCopyImageToImageInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCopyImageToImageInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::HostImageCopyFlags const &,\n               VULKAN_HPP_NAMESPACE::Image const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               VULKAN_HPP_NAMESPACE::Image const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::ImageCopy2 * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CopyImageToImageInfo const & ) const = default;\n#else\n    bool operator==( CopyImageToImageInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( srcImage == rhs.srcImage ) &&\n             ( srcImageLayout == rhs.srcImageLayout ) && ( dstImage == rhs.dstImage ) && ( dstImageLayout == rhs.dstImageLayout ) &&\n             ( regionCount == rhs.regionCount ) && ( pRegions == rhs.pRegions );\n#  endif\n    }\n\n    bool operator!=( CopyImageToImageInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType      sType          = StructureType::eCopyImageToImageInfo;\n    const void *                             pNext          = {};\n    VULKAN_HPP_NAMESPACE::HostImageCopyFlags flags          = {};\n    VULKAN_HPP_NAMESPACE::Image              srcImage       = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout        srcImageLayout = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    VULKAN_HPP_NAMESPACE::Image              dstImage       = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout        dstImageLayout = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    uint32_t                                 regionCount    = {};\n    const VULKAN_HPP_NAMESPACE::ImageCopy2 * pRegions       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCopyImageToImageInfo>\n  {\n    using Type = CopyImageToImageInfo;\n  };\n\n  using CopyImageToImageInfoEXT = CopyImageToImageInfo;\n\n  struct ImageToMemoryCopy\n  {\n    using NativeType = VkImageToMemoryCopy;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageToMemoryCopy;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageToMemoryCopy( void *                                       pHostPointer_      = {},\n                                            uint32_t                                     memoryRowLength_   = {},\n                                            uint32_t                                     memoryImageHeight_ = {},\n                                            VULKAN_HPP_NAMESPACE::ImageSubresourceLayers imageSubresource_  = {},\n                                            VULKAN_HPP_NAMESPACE::Offset3D               imageOffset_       = {},\n                                            VULKAN_HPP_NAMESPACE::Extent3D               imageExtent_       = {},\n                                            const void *                                 pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pHostPointer{ pHostPointer_ }\n      , memoryRowLength{ memoryRowLength_ }\n      , memoryImageHeight{ memoryImageHeight_ }\n      , imageSubresource{ imageSubresource_ }\n      , imageOffset{ imageOffset_ }\n      , imageExtent{ imageExtent_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageToMemoryCopy( ImageToMemoryCopy const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageToMemoryCopy( VkImageToMemoryCopy const & rhs ) VULKAN_HPP_NOEXCEPT : ImageToMemoryCopy( *reinterpret_cast<ImageToMemoryCopy const *>( &rhs ) ) {}\n\n    ImageToMemoryCopy & operator=( ImageToMemoryCopy const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageToMemoryCopy & operator=( VkImageToMemoryCopy const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageToMemoryCopy const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageToMemoryCopy & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageToMemoryCopy & setPHostPointer( void * pHostPointer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pHostPointer = pHostPointer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageToMemoryCopy & setMemoryRowLength( uint32_t memoryRowLength_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memoryRowLength = memoryRowLength_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageToMemoryCopy & setMemoryImageHeight( uint32_t memoryImageHeight_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memoryImageHeight = memoryImageHeight_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageToMemoryCopy &\n      setImageSubresource( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const & imageSubresource_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageSubresource = imageSubresource_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageToMemoryCopy & setImageOffset( VULKAN_HPP_NAMESPACE::Offset3D const & imageOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageOffset = imageOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageToMemoryCopy & setImageExtent( VULKAN_HPP_NAMESPACE::Extent3D const & imageExtent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageExtent = imageExtent_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageToMemoryCopy const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageToMemoryCopy *>( this );\n    }\n\n    operator VkImageToMemoryCopy &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageToMemoryCopy *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const &,\n               VULKAN_HPP_NAMESPACE::Offset3D const &,\n               VULKAN_HPP_NAMESPACE::Extent3D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pHostPointer, memoryRowLength, memoryImageHeight, imageSubresource, imageOffset, imageExtent );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageToMemoryCopy const & ) const = default;\n#else\n    bool operator==( ImageToMemoryCopy const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pHostPointer == rhs.pHostPointer ) && ( memoryRowLength == rhs.memoryRowLength ) &&\n             ( memoryImageHeight == rhs.memoryImageHeight ) && ( imageSubresource == rhs.imageSubresource ) && ( imageOffset == rhs.imageOffset ) &&\n             ( imageExtent == rhs.imageExtent );\n#  endif\n    }\n\n    bool operator!=( ImageToMemoryCopy const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType             = StructureType::eImageToMemoryCopy;\n    const void *                                 pNext             = {};\n    void *                                       pHostPointer      = {};\n    uint32_t                                     memoryRowLength   = {};\n    uint32_t                                     memoryImageHeight = {};\n    VULKAN_HPP_NAMESPACE::ImageSubresourceLayers imageSubresource  = {};\n    VULKAN_HPP_NAMESPACE::Offset3D               imageOffset       = {};\n    VULKAN_HPP_NAMESPACE::Extent3D               imageExtent       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageToMemoryCopy>\n  {\n    using Type = ImageToMemoryCopy;\n  };\n\n  using ImageToMemoryCopyEXT = ImageToMemoryCopy;\n\n  struct CopyImageToMemoryInfo\n  {\n    using NativeType = VkCopyImageToMemoryInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCopyImageToMemoryInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CopyImageToMemoryInfo( VULKAN_HPP_NAMESPACE::HostImageCopyFlags        flags_          = {},\n                                                VULKAN_HPP_NAMESPACE::Image                     srcImage_       = {},\n                                                VULKAN_HPP_NAMESPACE::ImageLayout               srcImageLayout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                                uint32_t                                        regionCount_    = {},\n                                                const VULKAN_HPP_NAMESPACE::ImageToMemoryCopy * pRegions_       = {},\n                                                const void *                                    pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , srcImage{ srcImage_ }\n      , srcImageLayout{ srcImageLayout_ }\n      , regionCount{ regionCount_ }\n      , pRegions{ pRegions_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CopyImageToMemoryInfo( CopyImageToMemoryInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CopyImageToMemoryInfo( VkCopyImageToMemoryInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CopyImageToMemoryInfo( *reinterpret_cast<CopyImageToMemoryInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CopyImageToMemoryInfo( VULKAN_HPP_NAMESPACE::HostImageCopyFlags                                                             flags_,\n                           VULKAN_HPP_NAMESPACE::Image                                                                          srcImage_,\n                           VULKAN_HPP_NAMESPACE::ImageLayout                                                                    srcImageLayout_,\n                           VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageToMemoryCopy> const & regions_,\n                           const void *                                                                                         pNext_ = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , srcImage( srcImage_ )\n      , srcImageLayout( srcImageLayout_ )\n      , regionCount( static_cast<uint32_t>( regions_.size() ) )\n      , pRegions( regions_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    CopyImageToMemoryInfo & operator=( CopyImageToMemoryInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CopyImageToMemoryInfo & operator=( VkCopyImageToMemoryInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CopyImageToMemoryInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CopyImageToMemoryInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyImageToMemoryInfo & setFlags( VULKAN_HPP_NAMESPACE::HostImageCopyFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyImageToMemoryInfo & setSrcImage( VULKAN_HPP_NAMESPACE::Image srcImage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcImage = srcImage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyImageToMemoryInfo & setSrcImageLayout( VULKAN_HPP_NAMESPACE::ImageLayout srcImageLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcImageLayout = srcImageLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyImageToMemoryInfo & setRegionCount( uint32_t regionCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      regionCount = regionCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyImageToMemoryInfo & setPRegions( const VULKAN_HPP_NAMESPACE::ImageToMemoryCopy * pRegions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pRegions = pRegions_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CopyImageToMemoryInfo &\n      setRegions( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageToMemoryCopy> const & regions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      regionCount = static_cast<uint32_t>( regions_.size() );\n      pRegions    = regions_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCopyImageToMemoryInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCopyImageToMemoryInfo *>( this );\n    }\n\n    operator VkCopyImageToMemoryInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCopyImageToMemoryInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::HostImageCopyFlags const &,\n               VULKAN_HPP_NAMESPACE::Image const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::ImageToMemoryCopy * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, srcImage, srcImageLayout, regionCount, pRegions );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CopyImageToMemoryInfo const & ) const = default;\n#else\n    bool operator==( CopyImageToMemoryInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( srcImage == rhs.srcImage ) &&\n             ( srcImageLayout == rhs.srcImageLayout ) && ( regionCount == rhs.regionCount ) && ( pRegions == rhs.pRegions );\n#  endif\n    }\n\n    bool operator!=( CopyImageToMemoryInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType             sType          = StructureType::eCopyImageToMemoryInfo;\n    const void *                                    pNext          = {};\n    VULKAN_HPP_NAMESPACE::HostImageCopyFlags        flags          = {};\n    VULKAN_HPP_NAMESPACE::Image                     srcImage       = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout               srcImageLayout = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    uint32_t                                        regionCount    = {};\n    const VULKAN_HPP_NAMESPACE::ImageToMemoryCopy * pRegions       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCopyImageToMemoryInfo>\n  {\n    using Type = CopyImageToMemoryInfo;\n  };\n\n  using CopyImageToMemoryInfoEXT = CopyImageToMemoryInfo;\n\n  struct CopyMemoryIndirectCommandNV\n  {\n    using NativeType = VkCopyMemoryIndirectCommandNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CopyMemoryIndirectCommandNV( VULKAN_HPP_NAMESPACE::DeviceAddress srcAddress_ = {},\n                                                      VULKAN_HPP_NAMESPACE::DeviceAddress dstAddress_ = {},\n                                                      VULKAN_HPP_NAMESPACE::DeviceSize    size_       = {} ) VULKAN_HPP_NOEXCEPT\n      : srcAddress{ srcAddress_ }\n      , dstAddress{ dstAddress_ }\n      , size{ size_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CopyMemoryIndirectCommandNV( CopyMemoryIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CopyMemoryIndirectCommandNV( VkCopyMemoryIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CopyMemoryIndirectCommandNV( *reinterpret_cast<CopyMemoryIndirectCommandNV const *>( &rhs ) )\n    {\n    }\n\n    CopyMemoryIndirectCommandNV & operator=( CopyMemoryIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CopyMemoryIndirectCommandNV & operator=( VkCopyMemoryIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CopyMemoryIndirectCommandNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryIndirectCommandNV & setSrcAddress( VULKAN_HPP_NAMESPACE::DeviceAddress srcAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcAddress = srcAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryIndirectCommandNV & setDstAddress( VULKAN_HPP_NAMESPACE::DeviceAddress dstAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstAddress = dstAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryIndirectCommandNV & setSize( VULKAN_HPP_NAMESPACE::DeviceSize size_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size = size_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCopyMemoryIndirectCommandNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCopyMemoryIndirectCommandNV *>( this );\n    }\n\n    operator VkCopyMemoryIndirectCommandNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCopyMemoryIndirectCommandNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DeviceAddress const &, VULKAN_HPP_NAMESPACE::DeviceAddress const &, VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( srcAddress, dstAddress, size );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CopyMemoryIndirectCommandNV const & ) const = default;\n#else\n    bool operator==( CopyMemoryIndirectCommandNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( srcAddress == rhs.srcAddress ) && ( dstAddress == rhs.dstAddress ) && ( size == rhs.size );\n#  endif\n    }\n\n    bool operator!=( CopyMemoryIndirectCommandNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DeviceAddress srcAddress = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress dstAddress = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    size       = {};\n  };\n\n  struct CopyMemoryToAccelerationStructureInfoKHR\n  {\n    using NativeType = VkCopyMemoryToAccelerationStructureInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCopyMemoryToAccelerationStructureInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToAccelerationStructureInfoKHR(\n      VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR      src_   = {},\n      VULKAN_HPP_NAMESPACE::AccelerationStructureKHR         dst_   = {},\n      VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR mode_  = VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR::eClone,\n      const void *                                           pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , src{ src_ }\n      , dst{ dst_ }\n      , mode{ mode_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToAccelerationStructureInfoKHR( CopyMemoryToAccelerationStructureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CopyMemoryToAccelerationStructureInfoKHR( VkCopyMemoryToAccelerationStructureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CopyMemoryToAccelerationStructureInfoKHR( *reinterpret_cast<CopyMemoryToAccelerationStructureInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    CopyMemoryToAccelerationStructureInfoKHR & operator=( CopyMemoryToAccelerationStructureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CopyMemoryToAccelerationStructureInfoKHR & operator=( VkCopyMemoryToAccelerationStructureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CopyMemoryToAccelerationStructureInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToAccelerationStructureInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToAccelerationStructureInfoKHR &\n      setSrc( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & src_ ) VULKAN_HPP_NOEXCEPT\n    {\n      src = src_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToAccelerationStructureInfoKHR & setDst( VULKAN_HPP_NAMESPACE::AccelerationStructureKHR dst_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dst = dst_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToAccelerationStructureInfoKHR &\n      setMode( VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR mode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mode = mode_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCopyMemoryToAccelerationStructureInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCopyMemoryToAccelerationStructureInfoKHR *>( this );\n    }\n\n    operator VkCopyMemoryToAccelerationStructureInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCopyMemoryToAccelerationStructureInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const &,\n               VULKAN_HPP_NAMESPACE::AccelerationStructureKHR const &,\n               VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, src, dst, mode );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType = StructureType::eCopyMemoryToAccelerationStructureInfoKHR;\n    const void *                                           pNext = {};\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR      src   = {};\n    VULKAN_HPP_NAMESPACE::AccelerationStructureKHR         dst   = {};\n    VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR mode  = VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR::eClone;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCopyMemoryToAccelerationStructureInfoKHR>\n  {\n    using Type = CopyMemoryToAccelerationStructureInfoKHR;\n  };\n\n  struct CopyMemoryToImageIndirectCommandNV\n  {\n    using NativeType = VkCopyMemoryToImageIndirectCommandNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CopyMemoryToImageIndirectCommandNV( VULKAN_HPP_NAMESPACE::DeviceAddress          srcAddress_        = {},\n                                                             uint32_t                                     bufferRowLength_   = {},\n                                                             uint32_t                                     bufferImageHeight_ = {},\n                                                             VULKAN_HPP_NAMESPACE::ImageSubresourceLayers imageSubresource_  = {},\n                                                             VULKAN_HPP_NAMESPACE::Offset3D               imageOffset_       = {},\n                                                             VULKAN_HPP_NAMESPACE::Extent3D               imageExtent_       = {} ) VULKAN_HPP_NOEXCEPT\n      : srcAddress{ srcAddress_ }\n      , bufferRowLength{ bufferRowLength_ }\n      , bufferImageHeight{ bufferImageHeight_ }\n      , imageSubresource{ imageSubresource_ }\n      , imageOffset{ imageOffset_ }\n      , imageExtent{ imageExtent_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CopyMemoryToImageIndirectCommandNV( CopyMemoryToImageIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CopyMemoryToImageIndirectCommandNV( VkCopyMemoryToImageIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CopyMemoryToImageIndirectCommandNV( *reinterpret_cast<CopyMemoryToImageIndirectCommandNV const *>( &rhs ) )\n    {\n    }\n\n    CopyMemoryToImageIndirectCommandNV & operator=( CopyMemoryToImageIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CopyMemoryToImageIndirectCommandNV & operator=( VkCopyMemoryToImageIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CopyMemoryToImageIndirectCommandNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToImageIndirectCommandNV & setSrcAddress( VULKAN_HPP_NAMESPACE::DeviceAddress srcAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcAddress = srcAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToImageIndirectCommandNV & setBufferRowLength( uint32_t bufferRowLength_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferRowLength = bufferRowLength_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToImageIndirectCommandNV & setBufferImageHeight( uint32_t bufferImageHeight_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferImageHeight = bufferImageHeight_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToImageIndirectCommandNV &\n      setImageSubresource( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const & imageSubresource_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageSubresource = imageSubresource_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToImageIndirectCommandNV & setImageOffset( VULKAN_HPP_NAMESPACE::Offset3D const & imageOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageOffset = imageOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToImageIndirectCommandNV & setImageExtent( VULKAN_HPP_NAMESPACE::Extent3D const & imageExtent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageExtent = imageExtent_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCopyMemoryToImageIndirectCommandNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCopyMemoryToImageIndirectCommandNV *>( this );\n    }\n\n    operator VkCopyMemoryToImageIndirectCommandNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCopyMemoryToImageIndirectCommandNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const &,\n               VULKAN_HPP_NAMESPACE::Offset3D const &,\n               VULKAN_HPP_NAMESPACE::Extent3D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( srcAddress, bufferRowLength, bufferImageHeight, imageSubresource, imageOffset, imageExtent );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CopyMemoryToImageIndirectCommandNV const & ) const = default;\n#else\n    bool operator==( CopyMemoryToImageIndirectCommandNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( srcAddress == rhs.srcAddress ) && ( bufferRowLength == rhs.bufferRowLength ) && ( bufferImageHeight == rhs.bufferImageHeight ) &&\n             ( imageSubresource == rhs.imageSubresource ) && ( imageOffset == rhs.imageOffset ) && ( imageExtent == rhs.imageExtent );\n#  endif\n    }\n\n    bool operator!=( CopyMemoryToImageIndirectCommandNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DeviceAddress          srcAddress        = {};\n    uint32_t                                     bufferRowLength   = {};\n    uint32_t                                     bufferImageHeight = {};\n    VULKAN_HPP_NAMESPACE::ImageSubresourceLayers imageSubresource  = {};\n    VULKAN_HPP_NAMESPACE::Offset3D               imageOffset       = {};\n    VULKAN_HPP_NAMESPACE::Extent3D               imageExtent       = {};\n  };\n\n  struct MemoryToImageCopy\n  {\n    using NativeType = VkMemoryToImageCopy;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryToImageCopy;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryToImageCopy( const void *                                 pHostPointer_      = {},\n                                            uint32_t                                     memoryRowLength_   = {},\n                                            uint32_t                                     memoryImageHeight_ = {},\n                                            VULKAN_HPP_NAMESPACE::ImageSubresourceLayers imageSubresource_  = {},\n                                            VULKAN_HPP_NAMESPACE::Offset3D               imageOffset_       = {},\n                                            VULKAN_HPP_NAMESPACE::Extent3D               imageExtent_       = {},\n                                            const void *                                 pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pHostPointer{ pHostPointer_ }\n      , memoryRowLength{ memoryRowLength_ }\n      , memoryImageHeight{ memoryImageHeight_ }\n      , imageSubresource{ imageSubresource_ }\n      , imageOffset{ imageOffset_ }\n      , imageExtent{ imageExtent_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryToImageCopy( MemoryToImageCopy const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryToImageCopy( VkMemoryToImageCopy const & rhs ) VULKAN_HPP_NOEXCEPT : MemoryToImageCopy( *reinterpret_cast<MemoryToImageCopy const *>( &rhs ) ) {}\n\n    MemoryToImageCopy & operator=( MemoryToImageCopy const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryToImageCopy & operator=( VkMemoryToImageCopy const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryToImageCopy const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MemoryToImageCopy & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryToImageCopy & setPHostPointer( const void * pHostPointer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pHostPointer = pHostPointer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryToImageCopy & setMemoryRowLength( uint32_t memoryRowLength_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memoryRowLength = memoryRowLength_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryToImageCopy & setMemoryImageHeight( uint32_t memoryImageHeight_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memoryImageHeight = memoryImageHeight_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryToImageCopy &\n      setImageSubresource( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const & imageSubresource_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageSubresource = imageSubresource_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryToImageCopy & setImageOffset( VULKAN_HPP_NAMESPACE::Offset3D const & imageOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageOffset = imageOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryToImageCopy & setImageExtent( VULKAN_HPP_NAMESPACE::Extent3D const & imageExtent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageExtent = imageExtent_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMemoryToImageCopy const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryToImageCopy *>( this );\n    }\n\n    operator VkMemoryToImageCopy &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryToImageCopy *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               const void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const &,\n               VULKAN_HPP_NAMESPACE::Offset3D const &,\n               VULKAN_HPP_NAMESPACE::Extent3D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pHostPointer, memoryRowLength, memoryImageHeight, imageSubresource, imageOffset, imageExtent );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryToImageCopy const & ) const = default;\n#else\n    bool operator==( MemoryToImageCopy const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pHostPointer == rhs.pHostPointer ) && ( memoryRowLength == rhs.memoryRowLength ) &&\n             ( memoryImageHeight == rhs.memoryImageHeight ) && ( imageSubresource == rhs.imageSubresource ) && ( imageOffset == rhs.imageOffset ) &&\n             ( imageExtent == rhs.imageExtent );\n#  endif\n    }\n\n    bool operator!=( MemoryToImageCopy const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType             = StructureType::eMemoryToImageCopy;\n    const void *                                 pNext             = {};\n    const void *                                 pHostPointer      = {};\n    uint32_t                                     memoryRowLength   = {};\n    uint32_t                                     memoryImageHeight = {};\n    VULKAN_HPP_NAMESPACE::ImageSubresourceLayers imageSubresource  = {};\n    VULKAN_HPP_NAMESPACE::Offset3D               imageOffset       = {};\n    VULKAN_HPP_NAMESPACE::Extent3D               imageExtent       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryToImageCopy>\n  {\n    using Type = MemoryToImageCopy;\n  };\n\n  using MemoryToImageCopyEXT = MemoryToImageCopy;\n\n  struct CopyMemoryToImageInfo\n  {\n    using NativeType = VkCopyMemoryToImageInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCopyMemoryToImageInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CopyMemoryToImageInfo( VULKAN_HPP_NAMESPACE::HostImageCopyFlags        flags_          = {},\n                                                VULKAN_HPP_NAMESPACE::Image                     dstImage_       = {},\n                                                VULKAN_HPP_NAMESPACE::ImageLayout               dstImageLayout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                                uint32_t                                        regionCount_    = {},\n                                                const VULKAN_HPP_NAMESPACE::MemoryToImageCopy * pRegions_       = {},\n                                                const void *                                    pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , dstImage{ dstImage_ }\n      , dstImageLayout{ dstImageLayout_ }\n      , regionCount{ regionCount_ }\n      , pRegions{ pRegions_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CopyMemoryToImageInfo( CopyMemoryToImageInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CopyMemoryToImageInfo( VkCopyMemoryToImageInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CopyMemoryToImageInfo( *reinterpret_cast<CopyMemoryToImageInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CopyMemoryToImageInfo( VULKAN_HPP_NAMESPACE::HostImageCopyFlags                                                             flags_,\n                           VULKAN_HPP_NAMESPACE::Image                                                                          dstImage_,\n                           VULKAN_HPP_NAMESPACE::ImageLayout                                                                    dstImageLayout_,\n                           VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::MemoryToImageCopy> const & regions_,\n                           const void *                                                                                         pNext_ = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , dstImage( dstImage_ )\n      , dstImageLayout( dstImageLayout_ )\n      , regionCount( static_cast<uint32_t>( regions_.size() ) )\n      , pRegions( regions_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    CopyMemoryToImageInfo & operator=( CopyMemoryToImageInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CopyMemoryToImageInfo & operator=( VkCopyMemoryToImageInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CopyMemoryToImageInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToImageInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToImageInfo & setFlags( VULKAN_HPP_NAMESPACE::HostImageCopyFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToImageInfo & setDstImage( VULKAN_HPP_NAMESPACE::Image dstImage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstImage = dstImage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToImageInfo & setDstImageLayout( VULKAN_HPP_NAMESPACE::ImageLayout dstImageLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstImageLayout = dstImageLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToImageInfo & setRegionCount( uint32_t regionCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      regionCount = regionCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToImageInfo & setPRegions( const VULKAN_HPP_NAMESPACE::MemoryToImageCopy * pRegions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pRegions = pRegions_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CopyMemoryToImageInfo &\n      setRegions( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::MemoryToImageCopy> const & regions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      regionCount = static_cast<uint32_t>( regions_.size() );\n      pRegions    = regions_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCopyMemoryToImageInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCopyMemoryToImageInfo *>( this );\n    }\n\n    operator VkCopyMemoryToImageInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCopyMemoryToImageInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::HostImageCopyFlags const &,\n               VULKAN_HPP_NAMESPACE::Image const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::MemoryToImageCopy * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, dstImage, dstImageLayout, regionCount, pRegions );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CopyMemoryToImageInfo const & ) const = default;\n#else\n    bool operator==( CopyMemoryToImageInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( dstImage == rhs.dstImage ) &&\n             ( dstImageLayout == rhs.dstImageLayout ) && ( regionCount == rhs.regionCount ) && ( pRegions == rhs.pRegions );\n#  endif\n    }\n\n    bool operator!=( CopyMemoryToImageInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType             sType          = StructureType::eCopyMemoryToImageInfo;\n    const void *                                    pNext          = {};\n    VULKAN_HPP_NAMESPACE::HostImageCopyFlags        flags          = {};\n    VULKAN_HPP_NAMESPACE::Image                     dstImage       = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout               dstImageLayout = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    uint32_t                                        regionCount    = {};\n    const VULKAN_HPP_NAMESPACE::MemoryToImageCopy * pRegions       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCopyMemoryToImageInfo>\n  {\n    using Type = CopyMemoryToImageInfo;\n  };\n\n  using CopyMemoryToImageInfoEXT = CopyMemoryToImageInfo;\n\n  struct CopyMemoryToMicromapInfoEXT\n  {\n    using NativeType = VkCopyMemoryToMicromapInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCopyMemoryToMicromapInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToMicromapInfoEXT( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR src_ = {},\n                                                         VULKAN_HPP_NAMESPACE::MicromapEXT                 dst_ = {},\n                                                         VULKAN_HPP_NAMESPACE::CopyMicromapModeEXT mode_  = VULKAN_HPP_NAMESPACE::CopyMicromapModeEXT::eClone,\n                                                         const void *                              pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , src{ src_ }\n      , dst{ dst_ }\n      , mode{ mode_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToMicromapInfoEXT( CopyMemoryToMicromapInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CopyMemoryToMicromapInfoEXT( VkCopyMemoryToMicromapInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CopyMemoryToMicromapInfoEXT( *reinterpret_cast<CopyMemoryToMicromapInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    CopyMemoryToMicromapInfoEXT & operator=( CopyMemoryToMicromapInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CopyMemoryToMicromapInfoEXT & operator=( VkCopyMemoryToMicromapInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CopyMemoryToMicromapInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToMicromapInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToMicromapInfoEXT & setSrc( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & src_ ) VULKAN_HPP_NOEXCEPT\n    {\n      src = src_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToMicromapInfoEXT & setDst( VULKAN_HPP_NAMESPACE::MicromapEXT dst_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dst = dst_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMemoryToMicromapInfoEXT & setMode( VULKAN_HPP_NAMESPACE::CopyMicromapModeEXT mode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mode = mode_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCopyMemoryToMicromapInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCopyMemoryToMicromapInfoEXT *>( this );\n    }\n\n    operator VkCopyMemoryToMicromapInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCopyMemoryToMicromapInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const &,\n               VULKAN_HPP_NAMESPACE::MicromapEXT const &,\n               VULKAN_HPP_NAMESPACE::CopyMicromapModeEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, src, dst, mode );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType = StructureType::eCopyMemoryToMicromapInfoEXT;\n    const void *                                      pNext = {};\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR src   = {};\n    VULKAN_HPP_NAMESPACE::MicromapEXT                 dst   = {};\n    VULKAN_HPP_NAMESPACE::CopyMicromapModeEXT         mode  = VULKAN_HPP_NAMESPACE::CopyMicromapModeEXT::eClone;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCopyMemoryToMicromapInfoEXT>\n  {\n    using Type = CopyMemoryToMicromapInfoEXT;\n  };\n\n  struct CopyMicromapInfoEXT\n  {\n    using NativeType = VkCopyMicromapInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCopyMicromapInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CopyMicromapInfoEXT( VULKAN_HPP_NAMESPACE::MicromapEXT         src_   = {},\n                                              VULKAN_HPP_NAMESPACE::MicromapEXT         dst_   = {},\n                                              VULKAN_HPP_NAMESPACE::CopyMicromapModeEXT mode_  = VULKAN_HPP_NAMESPACE::CopyMicromapModeEXT::eClone,\n                                              const void *                              pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , src{ src_ }\n      , dst{ dst_ }\n      , mode{ mode_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CopyMicromapInfoEXT( CopyMicromapInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CopyMicromapInfoEXT( VkCopyMicromapInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT : CopyMicromapInfoEXT( *reinterpret_cast<CopyMicromapInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    CopyMicromapInfoEXT & operator=( CopyMicromapInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CopyMicromapInfoEXT & operator=( VkCopyMicromapInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CopyMicromapInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CopyMicromapInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMicromapInfoEXT & setSrc( VULKAN_HPP_NAMESPACE::MicromapEXT src_ ) VULKAN_HPP_NOEXCEPT\n    {\n      src = src_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMicromapInfoEXT & setDst( VULKAN_HPP_NAMESPACE::MicromapEXT dst_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dst = dst_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMicromapInfoEXT & setMode( VULKAN_HPP_NAMESPACE::CopyMicromapModeEXT mode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mode = mode_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCopyMicromapInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCopyMicromapInfoEXT *>( this );\n    }\n\n    operator VkCopyMicromapInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCopyMicromapInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::MicromapEXT const &,\n               VULKAN_HPP_NAMESPACE::MicromapEXT const &,\n               VULKAN_HPP_NAMESPACE::CopyMicromapModeEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, src, dst, mode );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CopyMicromapInfoEXT const & ) const = default;\n#else\n    bool operator==( CopyMicromapInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( src == rhs.src ) && ( dst == rhs.dst ) && ( mode == rhs.mode );\n#  endif\n    }\n\n    bool operator!=( CopyMicromapInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType = StructureType::eCopyMicromapInfoEXT;\n    const void *                              pNext = {};\n    VULKAN_HPP_NAMESPACE::MicromapEXT         src   = {};\n    VULKAN_HPP_NAMESPACE::MicromapEXT         dst   = {};\n    VULKAN_HPP_NAMESPACE::CopyMicromapModeEXT mode  = VULKAN_HPP_NAMESPACE::CopyMicromapModeEXT::eClone;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCopyMicromapInfoEXT>\n  {\n    using Type = CopyMicromapInfoEXT;\n  };\n\n  struct CopyMicromapToMemoryInfoEXT\n  {\n    using NativeType = VkCopyMicromapToMemoryInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCopyMicromapToMemoryInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 CopyMicromapToMemoryInfoEXT( VULKAN_HPP_NAMESPACE::MicromapEXT            src_  = {},\n                                                         VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR dst_  = {},\n                                                         VULKAN_HPP_NAMESPACE::CopyMicromapModeEXT    mode_ = VULKAN_HPP_NAMESPACE::CopyMicromapModeEXT::eClone,\n                                                         const void *                                 pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , src{ src_ }\n      , dst{ dst_ }\n      , mode{ mode_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMicromapToMemoryInfoEXT( CopyMicromapToMemoryInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CopyMicromapToMemoryInfoEXT( VkCopyMicromapToMemoryInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CopyMicromapToMemoryInfoEXT( *reinterpret_cast<CopyMicromapToMemoryInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    CopyMicromapToMemoryInfoEXT & operator=( CopyMicromapToMemoryInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CopyMicromapToMemoryInfoEXT & operator=( VkCopyMicromapToMemoryInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CopyMicromapToMemoryInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CopyMicromapToMemoryInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMicromapToMemoryInfoEXT & setSrc( VULKAN_HPP_NAMESPACE::MicromapEXT src_ ) VULKAN_HPP_NOEXCEPT\n    {\n      src = src_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMicromapToMemoryInfoEXT & setDst( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR const & dst_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dst = dst_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CopyMicromapToMemoryInfoEXT & setMode( VULKAN_HPP_NAMESPACE::CopyMicromapModeEXT mode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mode = mode_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCopyMicromapToMemoryInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCopyMicromapToMemoryInfoEXT *>( this );\n    }\n\n    operator VkCopyMicromapToMemoryInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCopyMicromapToMemoryInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::MicromapEXT const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR const &,\n               VULKAN_HPP_NAMESPACE::CopyMicromapModeEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, src, dst, mode );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType = StructureType::eCopyMicromapToMemoryInfoEXT;\n    const void *                                 pNext = {};\n    VULKAN_HPP_NAMESPACE::MicromapEXT            src   = {};\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR dst   = {};\n    VULKAN_HPP_NAMESPACE::CopyMicromapModeEXT    mode  = VULKAN_HPP_NAMESPACE::CopyMicromapModeEXT::eClone;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCopyMicromapToMemoryInfoEXT>\n  {\n    using Type = CopyMicromapToMemoryInfoEXT;\n  };\n\n  struct CuFunctionCreateInfoNVX\n  {\n    using NativeType = VkCuFunctionCreateInfoNVX;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCuFunctionCreateInfoNVX;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      CuFunctionCreateInfoNVX( VULKAN_HPP_NAMESPACE::CuModuleNVX module_ = {}, const char * pName_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , module{ module_ }\n      , pName{ pName_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CuFunctionCreateInfoNVX( CuFunctionCreateInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CuFunctionCreateInfoNVX( VkCuFunctionCreateInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CuFunctionCreateInfoNVX( *reinterpret_cast<CuFunctionCreateInfoNVX const *>( &rhs ) )\n    {\n    }\n\n    CuFunctionCreateInfoNVX & operator=( CuFunctionCreateInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CuFunctionCreateInfoNVX & operator=( VkCuFunctionCreateInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CuFunctionCreateInfoNVX const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CuFunctionCreateInfoNVX & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CuFunctionCreateInfoNVX & setModule( VULKAN_HPP_NAMESPACE::CuModuleNVX module_ ) VULKAN_HPP_NOEXCEPT\n    {\n      module = module_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CuFunctionCreateInfoNVX & setPName( const char * pName_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pName = pName_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCuFunctionCreateInfoNVX const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCuFunctionCreateInfoNVX *>( this );\n    }\n\n    operator VkCuFunctionCreateInfoNVX &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCuFunctionCreateInfoNVX *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::CuModuleNVX const &, const char * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, module, pName );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( CuFunctionCreateInfoNVX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = module <=> rhs.module; cmp != 0 )\n        return cmp;\n      if ( pName != rhs.pName )\n        if ( auto cmp = strcmp( pName, rhs.pName ); cmp != 0 )\n          return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( CuFunctionCreateInfoNVX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( module == rhs.module ) && ( ( pName == rhs.pName ) || ( strcmp( pName, rhs.pName ) == 0 ) );\n    }\n\n    bool operator!=( CuFunctionCreateInfoNVX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType  = StructureType::eCuFunctionCreateInfoNVX;\n    const void *                        pNext  = {};\n    VULKAN_HPP_NAMESPACE::CuModuleNVX   module = {};\n    const char *                        pName  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCuFunctionCreateInfoNVX>\n  {\n    using Type = CuFunctionCreateInfoNVX;\n  };\n\n  struct CuLaunchInfoNVX\n  {\n    using NativeType = VkCuLaunchInfoNVX;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCuLaunchInfoNVX;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CuLaunchInfoNVX( VULKAN_HPP_NAMESPACE::CuFunctionNVX function_       = {},\n                                          uint32_t                            gridDimX_       = {},\n                                          uint32_t                            gridDimY_       = {},\n                                          uint32_t                            gridDimZ_       = {},\n                                          uint32_t                            blockDimX_      = {},\n                                          uint32_t                            blockDimY_      = {},\n                                          uint32_t                            blockDimZ_      = {},\n                                          uint32_t                            sharedMemBytes_ = {},\n                                          size_t                              paramCount_     = {},\n                                          const void * const *                pParams_        = {},\n                                          size_t                              extraCount_     = {},\n                                          const void * const *                pExtras_        = {},\n                                          const void *                        pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , function{ function_ }\n      , gridDimX{ gridDimX_ }\n      , gridDimY{ gridDimY_ }\n      , gridDimZ{ gridDimZ_ }\n      , blockDimX{ blockDimX_ }\n      , blockDimY{ blockDimY_ }\n      , blockDimZ{ blockDimZ_ }\n      , sharedMemBytes{ sharedMemBytes_ }\n      , paramCount{ paramCount_ }\n      , pParams{ pParams_ }\n      , extraCount{ extraCount_ }\n      , pExtras{ pExtras_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CuLaunchInfoNVX( CuLaunchInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CuLaunchInfoNVX( VkCuLaunchInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT : CuLaunchInfoNVX( *reinterpret_cast<CuLaunchInfoNVX const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CuLaunchInfoNVX( VULKAN_HPP_NAMESPACE::CuFunctionNVX                                       function_,\n                     uint32_t                                                                  gridDimX_,\n                     uint32_t                                                                  gridDimY_,\n                     uint32_t                                                                  gridDimZ_,\n                     uint32_t                                                                  blockDimX_,\n                     uint32_t                                                                  blockDimY_,\n                     uint32_t                                                                  blockDimZ_,\n                     uint32_t                                                                  sharedMemBytes_,\n                     VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const void * const> const & params_,\n                     VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const void * const> const & extras_ = {},\n                     const void *                                                              pNext_  = nullptr )\n      : pNext( pNext_ )\n      , function( function_ )\n      , gridDimX( gridDimX_ )\n      , gridDimY( gridDimY_ )\n      , gridDimZ( gridDimZ_ )\n      , blockDimX( blockDimX_ )\n      , blockDimY( blockDimY_ )\n      , blockDimZ( blockDimZ_ )\n      , sharedMemBytes( sharedMemBytes_ )\n      , paramCount( params_.size() )\n      , pParams( params_.data() )\n      , extraCount( extras_.size() )\n      , pExtras( extras_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    CuLaunchInfoNVX & operator=( CuLaunchInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CuLaunchInfoNVX & operator=( VkCuLaunchInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CuLaunchInfoNVX const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CuLaunchInfoNVX & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CuLaunchInfoNVX & setFunction( VULKAN_HPP_NAMESPACE::CuFunctionNVX function_ ) VULKAN_HPP_NOEXCEPT\n    {\n      function = function_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CuLaunchInfoNVX & setGridDimX( uint32_t gridDimX_ ) VULKAN_HPP_NOEXCEPT\n    {\n      gridDimX = gridDimX_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CuLaunchInfoNVX & setGridDimY( uint32_t gridDimY_ ) VULKAN_HPP_NOEXCEPT\n    {\n      gridDimY = gridDimY_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CuLaunchInfoNVX & setGridDimZ( uint32_t gridDimZ_ ) VULKAN_HPP_NOEXCEPT\n    {\n      gridDimZ = gridDimZ_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CuLaunchInfoNVX & setBlockDimX( uint32_t blockDimX_ ) VULKAN_HPP_NOEXCEPT\n    {\n      blockDimX = blockDimX_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CuLaunchInfoNVX & setBlockDimY( uint32_t blockDimY_ ) VULKAN_HPP_NOEXCEPT\n    {\n      blockDimY = blockDimY_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CuLaunchInfoNVX & setBlockDimZ( uint32_t blockDimZ_ ) VULKAN_HPP_NOEXCEPT\n    {\n      blockDimZ = blockDimZ_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CuLaunchInfoNVX & setSharedMemBytes( uint32_t sharedMemBytes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sharedMemBytes = sharedMemBytes_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CuLaunchInfoNVX & setParamCount( size_t paramCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      paramCount = paramCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CuLaunchInfoNVX & setPParams( const void * const * pParams_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pParams = pParams_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CuLaunchInfoNVX & setParams( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const void * const> const & params_ ) VULKAN_HPP_NOEXCEPT\n    {\n      paramCount = params_.size();\n      pParams    = params_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 CuLaunchInfoNVX & setExtraCount( size_t extraCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extraCount = extraCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CuLaunchInfoNVX & setPExtras( const void * const * pExtras_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pExtras = pExtras_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CuLaunchInfoNVX & setExtras( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const void * const> const & extras_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extraCount = extras_.size();\n      pExtras    = extras_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCuLaunchInfoNVX const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCuLaunchInfoNVX *>( this );\n    }\n\n    operator VkCuLaunchInfoNVX &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCuLaunchInfoNVX *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::CuFunctionNVX const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               size_t const &,\n               const void * const * const &,\n               size_t const &,\n               const void * const * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie(\n        sType, pNext, function, gridDimX, gridDimY, gridDimZ, blockDimX, blockDimY, blockDimZ, sharedMemBytes, paramCount, pParams, extraCount, pExtras );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CuLaunchInfoNVX const & ) const = default;\n#else\n    bool operator==( CuLaunchInfoNVX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( function == rhs.function ) && ( gridDimX == rhs.gridDimX ) && ( gridDimY == rhs.gridDimY ) &&\n             ( gridDimZ == rhs.gridDimZ ) && ( blockDimX == rhs.blockDimX ) && ( blockDimY == rhs.blockDimY ) && ( blockDimZ == rhs.blockDimZ ) &&\n             ( sharedMemBytes == rhs.sharedMemBytes ) && ( paramCount == rhs.paramCount ) && ( pParams == rhs.pParams ) && ( extraCount == rhs.extraCount ) &&\n             ( pExtras == rhs.pExtras );\n#  endif\n    }\n\n    bool operator!=( CuLaunchInfoNVX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::eCuLaunchInfoNVX;\n    const void *                        pNext          = {};\n    VULKAN_HPP_NAMESPACE::CuFunctionNVX function       = {};\n    uint32_t                            gridDimX       = {};\n    uint32_t                            gridDimY       = {};\n    uint32_t                            gridDimZ       = {};\n    uint32_t                            blockDimX      = {};\n    uint32_t                            blockDimY      = {};\n    uint32_t                            blockDimZ      = {};\n    uint32_t                            sharedMemBytes = {};\n    size_t                              paramCount     = {};\n    const void * const *                pParams        = {};\n    size_t                              extraCount     = {};\n    const void * const *                pExtras        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCuLaunchInfoNVX>\n  {\n    using Type = CuLaunchInfoNVX;\n  };\n\n  struct CuModuleCreateInfoNVX\n  {\n    using NativeType = VkCuModuleCreateInfoNVX;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCuModuleCreateInfoNVX;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CuModuleCreateInfoNVX( size_t dataSize_ = {}, const void * pData_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , dataSize{ dataSize_ }\n      , pData{ pData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CuModuleCreateInfoNVX( CuModuleCreateInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CuModuleCreateInfoNVX( VkCuModuleCreateInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CuModuleCreateInfoNVX( *reinterpret_cast<CuModuleCreateInfoNVX const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    CuModuleCreateInfoNVX( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & data_, const void * pNext_ = nullptr )\n      : pNext( pNext_ ), dataSize( data_.size() * sizeof( T ) ), pData( data_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    CuModuleCreateInfoNVX & operator=( CuModuleCreateInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CuModuleCreateInfoNVX & operator=( VkCuModuleCreateInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CuModuleCreateInfoNVX const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CuModuleCreateInfoNVX & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CuModuleCreateInfoNVX & setDataSize( size_t dataSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dataSize = dataSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CuModuleCreateInfoNVX & setPData( const void * pData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pData = pData_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    CuModuleCreateInfoNVX & setData( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & data_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dataSize = data_.size() * sizeof( T );\n      pData    = data_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCuModuleCreateInfoNVX const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCuModuleCreateInfoNVX *>( this );\n    }\n\n    operator VkCuModuleCreateInfoNVX &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCuModuleCreateInfoNVX *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, size_t const &, const void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, dataSize, pData );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CuModuleCreateInfoNVX const & ) const = default;\n#else\n    bool operator==( CuModuleCreateInfoNVX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( dataSize == rhs.dataSize ) && ( pData == rhs.pData );\n#  endif\n    }\n\n    bool operator!=( CuModuleCreateInfoNVX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType    = StructureType::eCuModuleCreateInfoNVX;\n    const void *                        pNext    = {};\n    size_t                              dataSize = {};\n    const void *                        pData    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCuModuleCreateInfoNVX>\n  {\n    using Type = CuModuleCreateInfoNVX;\n  };\n\n  struct CuModuleTexturingModeCreateInfoNVX\n  {\n    using NativeType = VkCuModuleTexturingModeCreateInfoNVX;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCuModuleTexturingModeCreateInfoNVX;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CuModuleTexturingModeCreateInfoNVX( VULKAN_HPP_NAMESPACE::Bool32 use64bitTexturing_ = {},\n                                                             const void *                 pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , use64bitTexturing{ use64bitTexturing_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CuModuleTexturingModeCreateInfoNVX( CuModuleTexturingModeCreateInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CuModuleTexturingModeCreateInfoNVX( VkCuModuleTexturingModeCreateInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CuModuleTexturingModeCreateInfoNVX( *reinterpret_cast<CuModuleTexturingModeCreateInfoNVX const *>( &rhs ) )\n    {\n    }\n\n    CuModuleTexturingModeCreateInfoNVX & operator=( CuModuleTexturingModeCreateInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CuModuleTexturingModeCreateInfoNVX & operator=( VkCuModuleTexturingModeCreateInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CuModuleTexturingModeCreateInfoNVX const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CuModuleTexturingModeCreateInfoNVX & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CuModuleTexturingModeCreateInfoNVX & setUse64bitTexturing( VULKAN_HPP_NAMESPACE::Bool32 use64bitTexturing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      use64bitTexturing = use64bitTexturing_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCuModuleTexturingModeCreateInfoNVX const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCuModuleTexturingModeCreateInfoNVX *>( this );\n    }\n\n    operator VkCuModuleTexturingModeCreateInfoNVX &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCuModuleTexturingModeCreateInfoNVX *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, use64bitTexturing );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CuModuleTexturingModeCreateInfoNVX const & ) const = default;\n#else\n    bool operator==( CuModuleTexturingModeCreateInfoNVX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( use64bitTexturing == rhs.use64bitTexturing );\n#  endif\n    }\n\n    bool operator!=( CuModuleTexturingModeCreateInfoNVX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType             = StructureType::eCuModuleTexturingModeCreateInfoNVX;\n    const void *                        pNext             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        use64bitTexturing = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCuModuleTexturingModeCreateInfoNVX>\n  {\n    using Type = CuModuleTexturingModeCreateInfoNVX;\n  };\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  struct CudaFunctionCreateInfoNV\n  {\n    using NativeType = VkCudaFunctionCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCudaFunctionCreateInfoNV;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      CudaFunctionCreateInfoNV( VULKAN_HPP_NAMESPACE::CudaModuleNV module_ = {}, const char * pName_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , module{ module_ }\n      , pName{ pName_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CudaFunctionCreateInfoNV( CudaFunctionCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CudaFunctionCreateInfoNV( VkCudaFunctionCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CudaFunctionCreateInfoNV( *reinterpret_cast<CudaFunctionCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n    CudaFunctionCreateInfoNV & operator=( CudaFunctionCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CudaFunctionCreateInfoNV & operator=( VkCudaFunctionCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CudaFunctionCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CudaFunctionCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CudaFunctionCreateInfoNV & setModule( VULKAN_HPP_NAMESPACE::CudaModuleNV module_ ) VULKAN_HPP_NOEXCEPT\n    {\n      module = module_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CudaFunctionCreateInfoNV & setPName( const char * pName_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pName = pName_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCudaFunctionCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCudaFunctionCreateInfoNV *>( this );\n    }\n\n    operator VkCudaFunctionCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCudaFunctionCreateInfoNV *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::CudaModuleNV const &, const char * const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, module, pName );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( CudaFunctionCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = module <=> rhs.module; cmp != 0 )\n        return cmp;\n      if ( pName != rhs.pName )\n        if ( auto cmp = strcmp( pName, rhs.pName ); cmp != 0 )\n          return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#  endif\n\n    bool operator==( CudaFunctionCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( module == rhs.module ) && ( ( pName == rhs.pName ) || ( strcmp( pName, rhs.pName ) == 0 ) );\n    }\n\n    bool operator!=( CudaFunctionCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType  = StructureType::eCudaFunctionCreateInfoNV;\n    const void *                        pNext  = {};\n    VULKAN_HPP_NAMESPACE::CudaModuleNV  module = {};\n    const char *                        pName  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCudaFunctionCreateInfoNV>\n  {\n    using Type = CudaFunctionCreateInfoNV;\n  };\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  struct CudaLaunchInfoNV\n  {\n    using NativeType = VkCudaLaunchInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCudaLaunchInfoNV;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CudaLaunchInfoNV( VULKAN_HPP_NAMESPACE::CudaFunctionNV function_       = {},\n                                           uint32_t                             gridDimX_       = {},\n                                           uint32_t                             gridDimY_       = {},\n                                           uint32_t                             gridDimZ_       = {},\n                                           uint32_t                             blockDimX_      = {},\n                                           uint32_t                             blockDimY_      = {},\n                                           uint32_t                             blockDimZ_      = {},\n                                           uint32_t                             sharedMemBytes_ = {},\n                                           size_t                               paramCount_     = {},\n                                           const void * const *                 pParams_        = {},\n                                           size_t                               extraCount_     = {},\n                                           const void * const *                 pExtras_        = {},\n                                           const void *                         pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , function{ function_ }\n      , gridDimX{ gridDimX_ }\n      , gridDimY{ gridDimY_ }\n      , gridDimZ{ gridDimZ_ }\n      , blockDimX{ blockDimX_ }\n      , blockDimY{ blockDimY_ }\n      , blockDimZ{ blockDimZ_ }\n      , sharedMemBytes{ sharedMemBytes_ }\n      , paramCount{ paramCount_ }\n      , pParams{ pParams_ }\n      , extraCount{ extraCount_ }\n      , pExtras{ pExtras_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CudaLaunchInfoNV( CudaLaunchInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CudaLaunchInfoNV( VkCudaLaunchInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT : CudaLaunchInfoNV( *reinterpret_cast<CudaLaunchInfoNV const *>( &rhs ) ) {}\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CudaLaunchInfoNV( VULKAN_HPP_NAMESPACE::CudaFunctionNV                                      function_,\n                      uint32_t                                                                  gridDimX_,\n                      uint32_t                                                                  gridDimY_,\n                      uint32_t                                                                  gridDimZ_,\n                      uint32_t                                                                  blockDimX_,\n                      uint32_t                                                                  blockDimY_,\n                      uint32_t                                                                  blockDimZ_,\n                      uint32_t                                                                  sharedMemBytes_,\n                      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const void * const> const & params_,\n                      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const void * const> const & extras_ = {},\n                      const void *                                                              pNext_  = nullptr )\n      : pNext( pNext_ )\n      , function( function_ )\n      , gridDimX( gridDimX_ )\n      , gridDimY( gridDimY_ )\n      , gridDimZ( gridDimZ_ )\n      , blockDimX( blockDimX_ )\n      , blockDimY( blockDimY_ )\n      , blockDimZ( blockDimZ_ )\n      , sharedMemBytes( sharedMemBytes_ )\n      , paramCount( params_.size() )\n      , pParams( params_.data() )\n      , extraCount( extras_.size() )\n      , pExtras( extras_.data() )\n    {\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    CudaLaunchInfoNV & operator=( CudaLaunchInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CudaLaunchInfoNV & operator=( VkCudaLaunchInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CudaLaunchInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CudaLaunchInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CudaLaunchInfoNV & setFunction( VULKAN_HPP_NAMESPACE::CudaFunctionNV function_ ) VULKAN_HPP_NOEXCEPT\n    {\n      function = function_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CudaLaunchInfoNV & setGridDimX( uint32_t gridDimX_ ) VULKAN_HPP_NOEXCEPT\n    {\n      gridDimX = gridDimX_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CudaLaunchInfoNV & setGridDimY( uint32_t gridDimY_ ) VULKAN_HPP_NOEXCEPT\n    {\n      gridDimY = gridDimY_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CudaLaunchInfoNV & setGridDimZ( uint32_t gridDimZ_ ) VULKAN_HPP_NOEXCEPT\n    {\n      gridDimZ = gridDimZ_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CudaLaunchInfoNV & setBlockDimX( uint32_t blockDimX_ ) VULKAN_HPP_NOEXCEPT\n    {\n      blockDimX = blockDimX_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CudaLaunchInfoNV & setBlockDimY( uint32_t blockDimY_ ) VULKAN_HPP_NOEXCEPT\n    {\n      blockDimY = blockDimY_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CudaLaunchInfoNV & setBlockDimZ( uint32_t blockDimZ_ ) VULKAN_HPP_NOEXCEPT\n    {\n      blockDimZ = blockDimZ_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CudaLaunchInfoNV & setSharedMemBytes( uint32_t sharedMemBytes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sharedMemBytes = sharedMemBytes_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CudaLaunchInfoNV & setParamCount( size_t paramCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      paramCount = paramCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CudaLaunchInfoNV & setPParams( const void * const * pParams_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pParams = pParams_;\n      return *this;\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CudaLaunchInfoNV & setParams( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const void * const> const & params_ ) VULKAN_HPP_NOEXCEPT\n    {\n      paramCount = params_.size();\n      pParams    = params_.data();\n      return *this;\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 CudaLaunchInfoNV & setExtraCount( size_t extraCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extraCount = extraCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CudaLaunchInfoNV & setPExtras( const void * const * pExtras_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pExtras = pExtras_;\n      return *this;\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    CudaLaunchInfoNV & setExtras( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const void * const> const & extras_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extraCount = extras_.size();\n      pExtras    = extras_.data();\n      return *this;\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#  endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCudaLaunchInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCudaLaunchInfoNV *>( this );\n    }\n\n    operator VkCudaLaunchInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCudaLaunchInfoNV *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::CudaFunctionNV const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               size_t const &,\n               const void * const * const &,\n               size_t const &,\n               const void * const * const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie(\n        sType, pNext, function, gridDimX, gridDimY, gridDimZ, blockDimX, blockDimY, blockDimZ, sharedMemBytes, paramCount, pParams, extraCount, pExtras );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CudaLaunchInfoNV const & ) const = default;\n#  else\n    bool operator==( CudaLaunchInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( function == rhs.function ) && ( gridDimX == rhs.gridDimX ) && ( gridDimY == rhs.gridDimY ) &&\n             ( gridDimZ == rhs.gridDimZ ) && ( blockDimX == rhs.blockDimX ) && ( blockDimY == rhs.blockDimY ) && ( blockDimZ == rhs.blockDimZ ) &&\n             ( sharedMemBytes == rhs.sharedMemBytes ) && ( paramCount == rhs.paramCount ) && ( pParams == rhs.pParams ) && ( extraCount == rhs.extraCount ) &&\n             ( pExtras == rhs.pExtras );\n#    endif\n    }\n\n    bool operator!=( CudaLaunchInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType  sType          = StructureType::eCudaLaunchInfoNV;\n    const void *                         pNext          = {};\n    VULKAN_HPP_NAMESPACE::CudaFunctionNV function       = {};\n    uint32_t                             gridDimX       = {};\n    uint32_t                             gridDimY       = {};\n    uint32_t                             gridDimZ       = {};\n    uint32_t                             blockDimX      = {};\n    uint32_t                             blockDimY      = {};\n    uint32_t                             blockDimZ      = {};\n    uint32_t                             sharedMemBytes = {};\n    size_t                               paramCount     = {};\n    const void * const *                 pParams        = {};\n    size_t                               extraCount     = {};\n    const void * const *                 pExtras        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCudaLaunchInfoNV>\n  {\n    using Type = CudaLaunchInfoNV;\n  };\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  struct CudaModuleCreateInfoNV\n  {\n    using NativeType = VkCudaModuleCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eCudaModuleCreateInfoNV;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR CudaModuleCreateInfoNV( size_t dataSize_ = {}, const void * pData_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , dataSize{ dataSize_ }\n      , pData{ pData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR CudaModuleCreateInfoNV( CudaModuleCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    CudaModuleCreateInfoNV( VkCudaModuleCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : CudaModuleCreateInfoNV( *reinterpret_cast<CudaModuleCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    CudaModuleCreateInfoNV( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & data_, const void * pNext_ = nullptr )\n      : pNext( pNext_ ), dataSize( data_.size() * sizeof( T ) ), pData( data_.data() )\n    {\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    CudaModuleCreateInfoNV & operator=( CudaModuleCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    CudaModuleCreateInfoNV & operator=( VkCudaModuleCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::CudaModuleCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 CudaModuleCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CudaModuleCreateInfoNV & setDataSize( size_t dataSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dataSize = dataSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 CudaModuleCreateInfoNV & setPData( const void * pData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pData = pData_;\n      return *this;\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    CudaModuleCreateInfoNV & setData( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & data_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dataSize = data_.size() * sizeof( T );\n      pData    = data_.data();\n      return *this;\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#  endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkCudaModuleCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkCudaModuleCreateInfoNV *>( this );\n    }\n\n    operator VkCudaModuleCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkCudaModuleCreateInfoNV *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, size_t const &, const void * const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, dataSize, pData );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( CudaModuleCreateInfoNV const & ) const = default;\n#  else\n    bool operator==( CudaModuleCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( dataSize == rhs.dataSize ) && ( pData == rhs.pData );\n#    endif\n    }\n\n    bool operator!=( CudaModuleCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType    = StructureType::eCudaModuleCreateInfoNV;\n    const void *                        pNext    = {};\n    size_t                              dataSize = {};\n    const void *                        pData    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eCudaModuleCreateInfoNV>\n  {\n    using Type = CudaModuleCreateInfoNV;\n  };\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  struct D3D12FenceSubmitInfoKHR\n  {\n    using NativeType = VkD3D12FenceSubmitInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eD3D12FenceSubmitInfoKHR;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR D3D12FenceSubmitInfoKHR( uint32_t         waitSemaphoreValuesCount_   = {},\n                                                  const uint64_t * pWaitSemaphoreValues_       = {},\n                                                  uint32_t         signalSemaphoreValuesCount_ = {},\n                                                  const uint64_t * pSignalSemaphoreValues_     = {},\n                                                  const void *     pNext_                      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , waitSemaphoreValuesCount{ waitSemaphoreValuesCount_ }\n      , pWaitSemaphoreValues{ pWaitSemaphoreValues_ }\n      , signalSemaphoreValuesCount{ signalSemaphoreValuesCount_ }\n      , pSignalSemaphoreValues{ pSignalSemaphoreValues_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR D3D12FenceSubmitInfoKHR( D3D12FenceSubmitInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    D3D12FenceSubmitInfoKHR( VkD3D12FenceSubmitInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : D3D12FenceSubmitInfoKHR( *reinterpret_cast<D3D12FenceSubmitInfoKHR const *>( &rhs ) )\n    {\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    D3D12FenceSubmitInfoKHR( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & waitSemaphoreValues_,\n                             VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & signalSemaphoreValues_ = {},\n                             const void *                                                          pNext_                 = nullptr )\n      : pNext( pNext_ )\n      , waitSemaphoreValuesCount( static_cast<uint32_t>( waitSemaphoreValues_.size() ) )\n      , pWaitSemaphoreValues( waitSemaphoreValues_.data() )\n      , signalSemaphoreValuesCount( static_cast<uint32_t>( signalSemaphoreValues_.size() ) )\n      , pSignalSemaphoreValues( signalSemaphoreValues_.data() )\n    {\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    D3D12FenceSubmitInfoKHR & operator=( D3D12FenceSubmitInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    D3D12FenceSubmitInfoKHR & operator=( VkD3D12FenceSubmitInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::D3D12FenceSubmitInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 D3D12FenceSubmitInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 D3D12FenceSubmitInfoKHR & setWaitSemaphoreValuesCount( uint32_t waitSemaphoreValuesCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      waitSemaphoreValuesCount = waitSemaphoreValuesCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 D3D12FenceSubmitInfoKHR & setPWaitSemaphoreValues( const uint64_t * pWaitSemaphoreValues_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pWaitSemaphoreValues = pWaitSemaphoreValues_;\n      return *this;\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    D3D12FenceSubmitInfoKHR &\n      setWaitSemaphoreValues( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & waitSemaphoreValues_ ) VULKAN_HPP_NOEXCEPT\n    {\n      waitSemaphoreValuesCount = static_cast<uint32_t>( waitSemaphoreValues_.size() );\n      pWaitSemaphoreValues     = waitSemaphoreValues_.data();\n      return *this;\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 D3D12FenceSubmitInfoKHR & setSignalSemaphoreValuesCount( uint32_t signalSemaphoreValuesCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      signalSemaphoreValuesCount = signalSemaphoreValuesCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 D3D12FenceSubmitInfoKHR & setPSignalSemaphoreValues( const uint64_t * pSignalSemaphoreValues_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSignalSemaphoreValues = pSignalSemaphoreValues_;\n      return *this;\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    D3D12FenceSubmitInfoKHR &\n      setSignalSemaphoreValues( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & signalSemaphoreValues_ ) VULKAN_HPP_NOEXCEPT\n    {\n      signalSemaphoreValuesCount = static_cast<uint32_t>( signalSemaphoreValues_.size() );\n      pSignalSemaphoreValues     = signalSemaphoreValues_.data();\n      return *this;\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#  endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkD3D12FenceSubmitInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkD3D12FenceSubmitInfoKHR *>( this );\n    }\n\n    operator VkD3D12FenceSubmitInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkD3D12FenceSubmitInfoKHR *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const uint64_t * const &,\n               uint32_t const &,\n               const uint64_t * const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, waitSemaphoreValuesCount, pWaitSemaphoreValues, signalSemaphoreValuesCount, pSignalSemaphoreValues );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( D3D12FenceSubmitInfoKHR const & ) const = default;\n#  else\n    bool operator==( D3D12FenceSubmitInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( waitSemaphoreValuesCount == rhs.waitSemaphoreValuesCount ) &&\n             ( pWaitSemaphoreValues == rhs.pWaitSemaphoreValues ) && ( signalSemaphoreValuesCount == rhs.signalSemaphoreValuesCount ) &&\n             ( pSignalSemaphoreValues == rhs.pSignalSemaphoreValues );\n#    endif\n    }\n\n    bool operator!=( D3D12FenceSubmitInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                      = StructureType::eD3D12FenceSubmitInfoKHR;\n    const void *                        pNext                      = {};\n    uint32_t                            waitSemaphoreValuesCount   = {};\n    const uint64_t *                    pWaitSemaphoreValues       = {};\n    uint32_t                            signalSemaphoreValuesCount = {};\n    const uint64_t *                    pSignalSemaphoreValues     = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eD3D12FenceSubmitInfoKHR>\n  {\n    using Type = D3D12FenceSubmitInfoKHR;\n  };\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  struct DebugMarkerMarkerInfoEXT\n  {\n    using NativeType = VkDebugMarkerMarkerInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDebugMarkerMarkerInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14\n      DebugMarkerMarkerInfoEXT( const char * pMarkerName_ = {}, std::array<float, 4> const & color_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pMarkerName{ pMarkerName_ }\n      , color{ color_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugMarkerMarkerInfoEXT( DebugMarkerMarkerInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DebugMarkerMarkerInfoEXT( VkDebugMarkerMarkerInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DebugMarkerMarkerInfoEXT( *reinterpret_cast<DebugMarkerMarkerInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    DebugMarkerMarkerInfoEXT & operator=( DebugMarkerMarkerInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DebugMarkerMarkerInfoEXT & operator=( VkDebugMarkerMarkerInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DebugMarkerMarkerInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugMarkerMarkerInfoEXT & setPMarkerName( const char * pMarkerName_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pMarkerName = pMarkerName_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugMarkerMarkerInfoEXT & setColor( std::array<float, 4> color_ ) VULKAN_HPP_NOEXCEPT\n    {\n      color = color_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDebugMarkerMarkerInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDebugMarkerMarkerInfoEXT *>( this );\n    }\n\n    operator VkDebugMarkerMarkerInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDebugMarkerMarkerInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, const char * const &, VULKAN_HPP_NAMESPACE::ArrayWrapper1D<float, 4> const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pMarkerName, color );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::partial_ordering operator<=>( DebugMarkerMarkerInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( pMarkerName != rhs.pMarkerName )\n        if ( auto cmp = strcmp( pMarkerName, rhs.pMarkerName ); cmp != 0 )\n          return ( cmp < 0 ) ? std::partial_ordering::less : std::partial_ordering::greater;\n      if ( auto cmp = color <=> rhs.color; cmp != 0 )\n        return cmp;\n\n      return std::partial_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( DebugMarkerMarkerInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( ( pMarkerName == rhs.pMarkerName ) || ( strcmp( pMarkerName, rhs.pMarkerName ) == 0 ) ) &&\n             ( color == rhs.color );\n    }\n\n    bool operator!=( DebugMarkerMarkerInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType            sType       = StructureType::eDebugMarkerMarkerInfoEXT;\n    const void *                                   pNext       = {};\n    const char *                                   pMarkerName = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<float, 4> color       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDebugMarkerMarkerInfoEXT>\n  {\n    using Type = DebugMarkerMarkerInfoEXT;\n  };\n\n  struct DebugMarkerObjectNameInfoEXT\n  {\n    using NativeType = VkDebugMarkerObjectNameInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDebugMarkerObjectNameInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      DebugMarkerObjectNameInfoEXT( VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT objectType_  = VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown,\n                                    uint64_t                                       object_      = {},\n                                    const char *                                   pObjectName_ = {},\n                                    const void *                                   pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , objectType{ objectType_ }\n      , object{ object_ }\n      , pObjectName{ pObjectName_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DebugMarkerObjectNameInfoEXT( DebugMarkerObjectNameInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DebugMarkerObjectNameInfoEXT( VkDebugMarkerObjectNameInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DebugMarkerObjectNameInfoEXT( *reinterpret_cast<DebugMarkerObjectNameInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    DebugMarkerObjectNameInfoEXT & operator=( DebugMarkerObjectNameInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DebugMarkerObjectNameInfoEXT & operator=( VkDebugMarkerObjectNameInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DebugMarkerObjectNameInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DebugMarkerObjectNameInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugMarkerObjectNameInfoEXT & setObjectType( VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT objectType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      objectType = objectType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugMarkerObjectNameInfoEXT & setObject( uint64_t object_ ) VULKAN_HPP_NOEXCEPT\n    {\n      object = object_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugMarkerObjectNameInfoEXT & setPObjectName( const char * pObjectName_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pObjectName = pObjectName_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDebugMarkerObjectNameInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDebugMarkerObjectNameInfoEXT *>( this );\n    }\n\n    operator VkDebugMarkerObjectNameInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDebugMarkerObjectNameInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT const &,\n               uint64_t const &,\n               const char * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, objectType, object, pObjectName );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( DebugMarkerObjectNameInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = objectType <=> rhs.objectType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = object <=> rhs.object; cmp != 0 )\n        return cmp;\n      if ( pObjectName != rhs.pObjectName )\n        if ( auto cmp = strcmp( pObjectName, rhs.pObjectName ); cmp != 0 )\n          return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( DebugMarkerObjectNameInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( objectType == rhs.objectType ) && ( object == rhs.object ) &&\n             ( ( pObjectName == rhs.pObjectName ) || ( strcmp( pObjectName, rhs.pObjectName ) == 0 ) );\n    }\n\n    bool operator!=( DebugMarkerObjectNameInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType            sType       = StructureType::eDebugMarkerObjectNameInfoEXT;\n    const void *                                   pNext       = {};\n    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT objectType  = VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n    uint64_t                                       object      = {};\n    const char *                                   pObjectName = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDebugMarkerObjectNameInfoEXT>\n  {\n    using Type = DebugMarkerObjectNameInfoEXT;\n  };\n\n  struct DebugMarkerObjectTagInfoEXT\n  {\n    using NativeType = VkDebugMarkerObjectTagInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDebugMarkerObjectTagInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      DebugMarkerObjectTagInfoEXT( VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT objectType_ = VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown,\n                                   uint64_t                                       object_     = {},\n                                   uint64_t                                       tagName_    = {},\n                                   size_t                                         tagSize_    = {},\n                                   const void *                                   pTag_       = {},\n                                   const void *                                   pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , objectType{ objectType_ }\n      , object{ object_ }\n      , tagName{ tagName_ }\n      , tagSize{ tagSize_ }\n      , pTag{ pTag_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DebugMarkerObjectTagInfoEXT( DebugMarkerObjectTagInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DebugMarkerObjectTagInfoEXT( VkDebugMarkerObjectTagInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DebugMarkerObjectTagInfoEXT( *reinterpret_cast<DebugMarkerObjectTagInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    DebugMarkerObjectTagInfoEXT( VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT                 objectType_,\n                                 uint64_t                                                       object_,\n                                 uint64_t                                                       tagName_,\n                                 VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & tag_,\n                                 const void *                                                   pNext_ = nullptr )\n      : pNext( pNext_ ), objectType( objectType_ ), object( object_ ), tagName( tagName_ ), tagSize( tag_.size() * sizeof( T ) ), pTag( tag_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    DebugMarkerObjectTagInfoEXT & operator=( DebugMarkerObjectTagInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DebugMarkerObjectTagInfoEXT & operator=( VkDebugMarkerObjectTagInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DebugMarkerObjectTagInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DebugMarkerObjectTagInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugMarkerObjectTagInfoEXT & setObjectType( VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT objectType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      objectType = objectType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugMarkerObjectTagInfoEXT & setObject( uint64_t object_ ) VULKAN_HPP_NOEXCEPT\n    {\n      object = object_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugMarkerObjectTagInfoEXT & setTagName( uint64_t tagName_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tagName = tagName_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugMarkerObjectTagInfoEXT & setTagSize( size_t tagSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tagSize = tagSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugMarkerObjectTagInfoEXT & setPTag( const void * pTag_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pTag = pTag_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    DebugMarkerObjectTagInfoEXT & setTag( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & tag_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tagSize = tag_.size() * sizeof( T );\n      pTag    = tag_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDebugMarkerObjectTagInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDebugMarkerObjectTagInfoEXT *>( this );\n    }\n\n    operator VkDebugMarkerObjectTagInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDebugMarkerObjectTagInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT const &,\n               uint64_t const &,\n               uint64_t const &,\n               size_t const &,\n               const void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, objectType, object, tagName, tagSize, pTag );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DebugMarkerObjectTagInfoEXT const & ) const = default;\n#else\n    bool operator==( DebugMarkerObjectTagInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( objectType == rhs.objectType ) && ( object == rhs.object ) && ( tagName == rhs.tagName ) &&\n             ( tagSize == rhs.tagSize ) && ( pTag == rhs.pTag );\n#  endif\n    }\n\n    bool operator!=( DebugMarkerObjectTagInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType            sType      = StructureType::eDebugMarkerObjectTagInfoEXT;\n    const void *                                   pNext      = {};\n    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT objectType = VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;\n    uint64_t                                       object     = {};\n    uint64_t                                       tagName    = {};\n    size_t                                         tagSize    = {};\n    const void *                                   pTag       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDebugMarkerObjectTagInfoEXT>\n  {\n    using Type = DebugMarkerObjectTagInfoEXT;\n  };\n\n  typedef VULKAN_HPP_NAMESPACE::Bool32( VKAPI_PTR * PFN_DebugReportCallbackEXT )( VULKAN_HPP_NAMESPACE::DebugReportFlagsEXT      flags,\n                                                                                  VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT objectType,\n                                                                                  uint64_t                                       object,\n                                                                                  size_t                                         location,\n                                                                                  int32_t                                        messageCode,\n                                                                                  const char *                                   pLayerPrefix,\n                                                                                  const char *                                   pMessage,\n                                                                                  void *                                         pUserData );\n\n  struct DebugReportCallbackCreateInfoEXT\n  {\n    using NativeType = VkDebugReportCallbackCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDebugReportCallbackCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DebugReportCallbackCreateInfoEXT( VULKAN_HPP_NAMESPACE::DebugReportFlagsEXT        flags_       = {},\n                                                           VULKAN_HPP_NAMESPACE::PFN_DebugReportCallbackEXT pfnCallback_ = {},\n                                                           void *                                           pUserData_   = {},\n                                                           const void *                                     pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , pfnCallback{ pfnCallback_ }\n      , pUserData{ pUserData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DebugReportCallbackCreateInfoEXT( DebugReportCallbackCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DebugReportCallbackCreateInfoEXT( VkDebugReportCallbackCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DebugReportCallbackCreateInfoEXT( *reinterpret_cast<DebugReportCallbackCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if defined( __clang__ ) || defined( __GNUC__ )\n#    pragma GCC diagnostic push\n#    if defined( __clang__ )\n#      pragma clang diagnostic ignored \"-Wunknown-warning-option\"\n#    endif\n#    pragma GCC diagnostic ignored \"-Wcast-function-type\"\n#  endif\n    VULKAN_HPP_DEPRECATED( \"This constructor is deprecated. Use the one taking function pointer types from the vk-namespace instead.\" )\n\n    DebugReportCallbackCreateInfoEXT( VULKAN_HPP_NAMESPACE::DebugReportFlagsEXT flags_,\n                                      PFN_vkDebugReportCallbackEXT              pfnCallback_,\n                                      void *                                    pUserData_ = {},\n                                      const void *                              pNext_     = nullptr ) VULKAN_HPP_NOEXCEPT\n      : DebugReportCallbackCreateInfoEXT( flags_, reinterpret_cast<VULKAN_HPP_NAMESPACE::PFN_DebugReportCallbackEXT>( pfnCallback_ ), pUserData_, pNext_ )\n    {\n    }\n#  if defined( __clang__ ) || defined( __GNUC__ )\n#    pragma GCC diagnostic pop\n#  endif\n\n    DebugReportCallbackCreateInfoEXT & operator=( DebugReportCallbackCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DebugReportCallbackCreateInfoEXT & operator=( VkDebugReportCallbackCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DebugReportCallbackCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DebugReportCallbackCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugReportCallbackCreateInfoEXT & setFlags( VULKAN_HPP_NAMESPACE::DebugReportFlagsEXT flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugReportCallbackCreateInfoEXT &\n      setPfnCallback( VULKAN_HPP_NAMESPACE::PFN_DebugReportCallbackEXT pfnCallback_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pfnCallback = pfnCallback_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugReportCallbackCreateInfoEXT & setPUserData( void * pUserData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pUserData = pUserData_;\n      return *this;\n    }\n\n#  if defined( __clang__ ) || defined( __GNUC__ )\n#    pragma GCC diagnostic push\n#    if defined( __clang__ )\n#      pragma clang diagnostic ignored \"-Wunknown-warning-option\"\n#    endif\n#    pragma GCC diagnostic ignored \"-Wcast-function-type\"\n#  endif\n    VULKAN_HPP_DEPRECATED( \"This setter is deprecated. Use the one taking a function pointer type from the vk-namespace instead.\" )\n\n    DebugReportCallbackCreateInfoEXT & setPfnCallback( PFN_vkDebugReportCallbackEXT pfnCallback_ ) VULKAN_HPP_NOEXCEPT\n    {\n      return setPfnCallback( reinterpret_cast<VULKAN_HPP_NAMESPACE::PFN_DebugReportCallbackEXT>( pfnCallback_ ) );\n    }\n#  if defined( __clang__ ) || defined( __GNUC__ )\n#    pragma GCC diagnostic pop\n#  endif\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDebugReportCallbackCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDebugReportCallbackCreateInfoEXT *>( this );\n    }\n\n    operator VkDebugReportCallbackCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDebugReportCallbackCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DebugReportFlagsEXT const &,\n               VULKAN_HPP_NAMESPACE::PFN_DebugReportCallbackEXT const &,\n               void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, pfnCallback, pUserData );\n    }\n#endif\n\n    bool operator==( DebugReportCallbackCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( pfnCallback == rhs.pfnCallback ) && ( pUserData == rhs.pUserData );\n#endif\n    }\n\n    bool operator!=( DebugReportCallbackCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType              sType       = StructureType::eDebugReportCallbackCreateInfoEXT;\n    const void *                                     pNext       = {};\n    VULKAN_HPP_NAMESPACE::DebugReportFlagsEXT        flags       = {};\n    VULKAN_HPP_NAMESPACE::PFN_DebugReportCallbackEXT pfnCallback = {};\n    void *                                           pUserData   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDebugReportCallbackCreateInfoEXT>\n  {\n    using Type = DebugReportCallbackCreateInfoEXT;\n  };\n\n  struct DebugUtilsLabelEXT\n  {\n    using NativeType = VkDebugUtilsLabelEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDebugUtilsLabelEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14\n      DebugUtilsLabelEXT( const char * pLabelName_ = {}, std::array<float, 4> const & color_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pLabelName{ pLabelName_ }\n      , color{ color_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsLabelEXT( DebugUtilsLabelEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DebugUtilsLabelEXT( VkDebugUtilsLabelEXT const & rhs ) VULKAN_HPP_NOEXCEPT : DebugUtilsLabelEXT( *reinterpret_cast<DebugUtilsLabelEXT const *>( &rhs ) ) {}\n\n    DebugUtilsLabelEXT & operator=( DebugUtilsLabelEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DebugUtilsLabelEXT & operator=( VkDebugUtilsLabelEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsLabelEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsLabelEXT & setPLabelName( const char * pLabelName_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pLabelName = pLabelName_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsLabelEXT & setColor( std::array<float, 4> color_ ) VULKAN_HPP_NOEXCEPT\n    {\n      color = color_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDebugUtilsLabelEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDebugUtilsLabelEXT *>( this );\n    }\n\n    operator VkDebugUtilsLabelEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDebugUtilsLabelEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, const char * const &, VULKAN_HPP_NAMESPACE::ArrayWrapper1D<float, 4> const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pLabelName, color );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::partial_ordering operator<=>( DebugUtilsLabelEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( pLabelName != rhs.pLabelName )\n        if ( auto cmp = strcmp( pLabelName, rhs.pLabelName ); cmp != 0 )\n          return ( cmp < 0 ) ? std::partial_ordering::less : std::partial_ordering::greater;\n      if ( auto cmp = color <=> rhs.color; cmp != 0 )\n        return cmp;\n\n      return std::partial_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( DebugUtilsLabelEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( ( pLabelName == rhs.pLabelName ) || ( strcmp( pLabelName, rhs.pLabelName ) == 0 ) ) &&\n             ( color == rhs.color );\n    }\n\n    bool operator!=( DebugUtilsLabelEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType            sType      = StructureType::eDebugUtilsLabelEXT;\n    const void *                                   pNext      = {};\n    const char *                                   pLabelName = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<float, 4> color      = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDebugUtilsLabelEXT>\n  {\n    using Type = DebugUtilsLabelEXT;\n  };\n\n  struct DebugUtilsObjectNameInfoEXT\n  {\n    using NativeType = VkDebugUtilsObjectNameInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDebugUtilsObjectNameInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DebugUtilsObjectNameInfoEXT( VULKAN_HPP_NAMESPACE::ObjectType objectType_   = VULKAN_HPP_NAMESPACE::ObjectType::eUnknown,\n                                                      uint64_t                         objectHandle_ = {},\n                                                      const char *                     pObjectName_  = {},\n                                                      const void *                     pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , objectType{ objectType_ }\n      , objectHandle{ objectHandle_ }\n      , pObjectName{ pObjectName_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DebugUtilsObjectNameInfoEXT( DebugUtilsObjectNameInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DebugUtilsObjectNameInfoEXT( VkDebugUtilsObjectNameInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DebugUtilsObjectNameInfoEXT( *reinterpret_cast<DebugUtilsObjectNameInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    DebugUtilsObjectNameInfoEXT & operator=( DebugUtilsObjectNameInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DebugUtilsObjectNameInfoEXT & operator=( VkDebugUtilsObjectNameInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsObjectNameInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsObjectNameInfoEXT & setObjectType( VULKAN_HPP_NAMESPACE::ObjectType objectType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      objectType = objectType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsObjectNameInfoEXT & setObjectHandle( uint64_t objectHandle_ ) VULKAN_HPP_NOEXCEPT\n    {\n      objectHandle = objectHandle_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsObjectNameInfoEXT & setPObjectName( const char * pObjectName_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pObjectName = pObjectName_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDebugUtilsObjectNameInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDebugUtilsObjectNameInfoEXT *>( this );\n    }\n\n    operator VkDebugUtilsObjectNameInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDebugUtilsObjectNameInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::\n      tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ObjectType const &, uint64_t const &, const char * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, objectType, objectHandle, pObjectName );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( DebugUtilsObjectNameInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = objectType <=> rhs.objectType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = objectHandle <=> rhs.objectHandle; cmp != 0 )\n        return cmp;\n      if ( pObjectName != rhs.pObjectName )\n        if ( auto cmp = strcmp( pObjectName, rhs.pObjectName ); cmp != 0 )\n          return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( DebugUtilsObjectNameInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( objectType == rhs.objectType ) && ( objectHandle == rhs.objectHandle ) &&\n             ( ( pObjectName == rhs.pObjectName ) || ( strcmp( pObjectName, rhs.pObjectName ) == 0 ) );\n    }\n\n    bool operator!=( DebugUtilsObjectNameInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType        = StructureType::eDebugUtilsObjectNameInfoEXT;\n    const void *                        pNext        = {};\n    VULKAN_HPP_NAMESPACE::ObjectType    objectType   = VULKAN_HPP_NAMESPACE::ObjectType::eUnknown;\n    uint64_t                            objectHandle = {};\n    const char *                        pObjectName  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDebugUtilsObjectNameInfoEXT>\n  {\n    using Type = DebugUtilsObjectNameInfoEXT;\n  };\n\n  struct DebugUtilsMessengerCallbackDataEXT\n  {\n    using NativeType = VkDebugUtilsMessengerCallbackDataEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDebugUtilsMessengerCallbackDataEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsMessengerCallbackDataEXT( VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCallbackDataFlagsEXT flags_            = {},\n                                                                const char *                                                  pMessageIdName_   = {},\n                                                                int32_t                                                       messageIdNumber_  = {},\n                                                                const char *                                                  pMessage_         = {},\n                                                                uint32_t                                                      queueLabelCount_  = {},\n                                                                const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT *              pQueueLabels_     = {},\n                                                                uint32_t                                                      cmdBufLabelCount_ = {},\n                                                                const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT *              pCmdBufLabels_    = {},\n                                                                uint32_t                                                      objectCount_      = {},\n                                                                const VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT *     pObjects_         = {},\n                                                                const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , pMessageIdName{ pMessageIdName_ }\n      , messageIdNumber{ messageIdNumber_ }\n      , pMessage{ pMessage_ }\n      , queueLabelCount{ queueLabelCount_ }\n      , pQueueLabels{ pQueueLabels_ }\n      , cmdBufLabelCount{ cmdBufLabelCount_ }\n      , pCmdBufLabels{ pCmdBufLabels_ }\n      , objectCount{ objectCount_ }\n      , pObjects{ pObjects_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsMessengerCallbackDataEXT( DebugUtilsMessengerCallbackDataEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DebugUtilsMessengerCallbackDataEXT( VkDebugUtilsMessengerCallbackDataEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DebugUtilsMessengerCallbackDataEXT( *reinterpret_cast<DebugUtilsMessengerCallbackDataEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DebugUtilsMessengerCallbackDataEXT(\n      VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCallbackDataFlagsEXT                                                  flags_,\n      const char *                                                                                                   pMessageIdName_,\n      int32_t                                                                                                        messageIdNumber_,\n      const char *                                                                                                   pMessage_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT> const &          queueLabels_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT> const &          cmdBufLabels_ = {},\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT> const & objects_      = {},\n      const void *                                                                                                   pNext_        = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , pMessageIdName( pMessageIdName_ )\n      , messageIdNumber( messageIdNumber_ )\n      , pMessage( pMessage_ )\n      , queueLabelCount( static_cast<uint32_t>( queueLabels_.size() ) )\n      , pQueueLabels( queueLabels_.data() )\n      , cmdBufLabelCount( static_cast<uint32_t>( cmdBufLabels_.size() ) )\n      , pCmdBufLabels( cmdBufLabels_.data() )\n      , objectCount( static_cast<uint32_t>( objects_.size() ) )\n      , pObjects( objects_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    DebugUtilsMessengerCallbackDataEXT & operator=( DebugUtilsMessengerCallbackDataEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DebugUtilsMessengerCallbackDataEXT & operator=( VkDebugUtilsMessengerCallbackDataEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCallbackDataEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsMessengerCallbackDataEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsMessengerCallbackDataEXT &\n      setFlags( VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCallbackDataFlagsEXT flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsMessengerCallbackDataEXT & setPMessageIdName( const char * pMessageIdName_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pMessageIdName = pMessageIdName_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsMessengerCallbackDataEXT & setMessageIdNumber( int32_t messageIdNumber_ ) VULKAN_HPP_NOEXCEPT\n    {\n      messageIdNumber = messageIdNumber_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsMessengerCallbackDataEXT & setPMessage( const char * pMessage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pMessage = pMessage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsMessengerCallbackDataEXT & setQueueLabelCount( uint32_t queueLabelCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queueLabelCount = queueLabelCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsMessengerCallbackDataEXT &\n      setPQueueLabels( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT * pQueueLabels_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pQueueLabels = pQueueLabels_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DebugUtilsMessengerCallbackDataEXT &\n      setQueueLabels( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT> const & queueLabels_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queueLabelCount = static_cast<uint32_t>( queueLabels_.size() );\n      pQueueLabels    = queueLabels_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsMessengerCallbackDataEXT & setCmdBufLabelCount( uint32_t cmdBufLabelCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      cmdBufLabelCount = cmdBufLabelCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsMessengerCallbackDataEXT &\n      setPCmdBufLabels( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT * pCmdBufLabels_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pCmdBufLabels = pCmdBufLabels_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DebugUtilsMessengerCallbackDataEXT &\n      setCmdBufLabels( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT> const & cmdBufLabels_ ) VULKAN_HPP_NOEXCEPT\n    {\n      cmdBufLabelCount = static_cast<uint32_t>( cmdBufLabels_.size() );\n      pCmdBufLabels    = cmdBufLabels_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsMessengerCallbackDataEXT & setObjectCount( uint32_t objectCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      objectCount = objectCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsMessengerCallbackDataEXT &\n      setPObjects( const VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT * pObjects_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pObjects = pObjects_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DebugUtilsMessengerCallbackDataEXT &\n      setObjects( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT> const & objects_ ) VULKAN_HPP_NOEXCEPT\n    {\n      objectCount = static_cast<uint32_t>( objects_.size() );\n      pObjects    = objects_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDebugUtilsMessengerCallbackDataEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDebugUtilsMessengerCallbackDataEXT *>( this );\n    }\n\n    operator VkDebugUtilsMessengerCallbackDataEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDebugUtilsMessengerCallbackDataEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCallbackDataFlagsEXT const &,\n               const char * const &,\n               int32_t const &,\n               const char * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie(\n        sType, pNext, flags, pMessageIdName, messageIdNumber, pMessage, queueLabelCount, pQueueLabels, cmdBufLabelCount, pCmdBufLabels, objectCount, pObjects );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( DebugUtilsMessengerCallbackDataEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = flags <=> rhs.flags; cmp != 0 )\n        return cmp;\n      if ( pMessageIdName != rhs.pMessageIdName )\n        if ( auto cmp = strcmp( pMessageIdName, rhs.pMessageIdName ); cmp != 0 )\n          return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = messageIdNumber <=> rhs.messageIdNumber; cmp != 0 )\n        return cmp;\n      if ( pMessage != rhs.pMessage )\n        if ( auto cmp = strcmp( pMessage, rhs.pMessage ); cmp != 0 )\n          return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = queueLabelCount <=> rhs.queueLabelCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pQueueLabels <=> rhs.pQueueLabels; cmp != 0 )\n        return cmp;\n      if ( auto cmp = cmdBufLabelCount <=> rhs.cmdBufLabelCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pCmdBufLabels <=> rhs.pCmdBufLabels; cmp != 0 )\n        return cmp;\n      if ( auto cmp = objectCount <=> rhs.objectCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pObjects <=> rhs.pObjects; cmp != 0 )\n        return cmp;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( DebugUtilsMessengerCallbackDataEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) &&\n             ( ( pMessageIdName == rhs.pMessageIdName ) || ( strcmp( pMessageIdName, rhs.pMessageIdName ) == 0 ) ) &&\n             ( messageIdNumber == rhs.messageIdNumber ) && ( ( pMessage == rhs.pMessage ) || ( strcmp( pMessage, rhs.pMessage ) == 0 ) ) &&\n             ( queueLabelCount == rhs.queueLabelCount ) && ( pQueueLabels == rhs.pQueueLabels ) && ( cmdBufLabelCount == rhs.cmdBufLabelCount ) &&\n             ( pCmdBufLabels == rhs.pCmdBufLabels ) && ( objectCount == rhs.objectCount ) && ( pObjects == rhs.pObjects );\n    }\n\n    bool operator!=( DebugUtilsMessengerCallbackDataEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                           sType            = StructureType::eDebugUtilsMessengerCallbackDataEXT;\n    const void *                                                  pNext            = {};\n    VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCallbackDataFlagsEXT flags            = {};\n    const char *                                                  pMessageIdName   = {};\n    int32_t                                                       messageIdNumber  = {};\n    const char *                                                  pMessage         = {};\n    uint32_t                                                      queueLabelCount  = {};\n    const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT *              pQueueLabels     = {};\n    uint32_t                                                      cmdBufLabelCount = {};\n    const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT *              pCmdBufLabels    = {};\n    uint32_t                                                      objectCount      = {};\n    const VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT *     pObjects         = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDebugUtilsMessengerCallbackDataEXT>\n  {\n    using Type = DebugUtilsMessengerCallbackDataEXT;\n  };\n\n  typedef VULKAN_HPP_NAMESPACE::Bool32( VKAPI_PTR * PFN_DebugUtilsMessengerCallbackEXT )(\n    VULKAN_HPP_NAMESPACE::DebugUtilsMessageSeverityFlagBitsEXT       messageSeverity,\n    VULKAN_HPP_NAMESPACE::DebugUtilsMessageTypeFlagsEXT              messageTypes,\n    const VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCallbackDataEXT * pCallbackData,\n    void *                                                           pUserData );\n\n  struct DebugUtilsMessengerCreateInfoEXT\n  {\n    using NativeType = VkDebugUtilsMessengerCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDebugUtilsMessengerCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DebugUtilsMessengerCreateInfoEXT( VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateFlagsEXT  flags_           = {},\n                                                           VULKAN_HPP_NAMESPACE::DebugUtilsMessageSeverityFlagsEXT  messageSeverity_ = {},\n                                                           VULKAN_HPP_NAMESPACE::DebugUtilsMessageTypeFlagsEXT      messageType_     = {},\n                                                           VULKAN_HPP_NAMESPACE::PFN_DebugUtilsMessengerCallbackEXT pfnUserCallback_ = {},\n                                                           void *                                                   pUserData_       = {},\n                                                           const void *                                             pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , messageSeverity{ messageSeverity_ }\n      , messageType{ messageType_ }\n      , pfnUserCallback{ pfnUserCallback_ }\n      , pUserData{ pUserData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DebugUtilsMessengerCreateInfoEXT( DebugUtilsMessengerCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DebugUtilsMessengerCreateInfoEXT( VkDebugUtilsMessengerCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DebugUtilsMessengerCreateInfoEXT( *reinterpret_cast<DebugUtilsMessengerCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if defined( __clang__ ) || defined( __GNUC__ )\n#    pragma GCC diagnostic push\n#    if defined( __clang__ )\n#      pragma clang diagnostic ignored \"-Wunknown-warning-option\"\n#    endif\n#    pragma GCC diagnostic ignored \"-Wcast-function-type\"\n#  endif\n    VULKAN_HPP_DEPRECATED( \"This constructor is deprecated. Use the one taking function pointer types from the vk-namespace instead.\" )\n\n    DebugUtilsMessengerCreateInfoEXT( VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateFlagsEXT flags_,\n                                      VULKAN_HPP_NAMESPACE::DebugUtilsMessageSeverityFlagsEXT messageSeverity_,\n                                      VULKAN_HPP_NAMESPACE::DebugUtilsMessageTypeFlagsEXT     messageType_,\n                                      PFN_vkDebugUtilsMessengerCallbackEXT                    pfnUserCallback_,\n                                      void *                                                  pUserData_ = {},\n                                      const void *                                            pNext_     = nullptr ) VULKAN_HPP_NOEXCEPT\n      : DebugUtilsMessengerCreateInfoEXT( flags_,\n                                          messageSeverity_,\n                                          messageType_,\n                                          reinterpret_cast<VULKAN_HPP_NAMESPACE::PFN_DebugUtilsMessengerCallbackEXT>( pfnUserCallback_ ),\n                                          pUserData_,\n                                          pNext_ )\n    {\n    }\n#  if defined( __clang__ ) || defined( __GNUC__ )\n#    pragma GCC diagnostic pop\n#  endif\n\n    DebugUtilsMessengerCreateInfoEXT & operator=( DebugUtilsMessengerCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DebugUtilsMessengerCreateInfoEXT & operator=( VkDebugUtilsMessengerCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsMessengerCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsMessengerCreateInfoEXT & setFlags( VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateFlagsEXT flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsMessengerCreateInfoEXT &\n      setMessageSeverity( VULKAN_HPP_NAMESPACE::DebugUtilsMessageSeverityFlagsEXT messageSeverity_ ) VULKAN_HPP_NOEXCEPT\n    {\n      messageSeverity = messageSeverity_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsMessengerCreateInfoEXT &\n      setMessageType( VULKAN_HPP_NAMESPACE::DebugUtilsMessageTypeFlagsEXT messageType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      messageType = messageType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsMessengerCreateInfoEXT &\n      setPfnUserCallback( VULKAN_HPP_NAMESPACE::PFN_DebugUtilsMessengerCallbackEXT pfnUserCallback_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pfnUserCallback = pfnUserCallback_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsMessengerCreateInfoEXT & setPUserData( void * pUserData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pUserData = pUserData_;\n      return *this;\n    }\n\n#  if defined( __clang__ ) || defined( __GNUC__ )\n#    pragma GCC diagnostic push\n#    if defined( __clang__ )\n#      pragma clang diagnostic ignored \"-Wunknown-warning-option\"\n#    endif\n#    pragma GCC diagnostic ignored \"-Wcast-function-type\"\n#  endif\n    VULKAN_HPP_DEPRECATED( \"This setter is deprecated. Use the one taking a function pointer type from the vk-namespace instead.\" )\n\n    DebugUtilsMessengerCreateInfoEXT & setPfnUserCallback( PFN_vkDebugUtilsMessengerCallbackEXT pfnUserCallback_ ) VULKAN_HPP_NOEXCEPT\n    {\n      return setPfnUserCallback( reinterpret_cast<VULKAN_HPP_NAMESPACE::PFN_DebugUtilsMessengerCallbackEXT>( pfnUserCallback_ ) );\n    }\n#  if defined( __clang__ ) || defined( __GNUC__ )\n#    pragma GCC diagnostic pop\n#  endif\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDebugUtilsMessengerCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDebugUtilsMessengerCreateInfoEXT *>( this );\n    }\n\n    operator VkDebugUtilsMessengerCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDebugUtilsMessengerCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateFlagsEXT const &,\n               VULKAN_HPP_NAMESPACE::DebugUtilsMessageSeverityFlagsEXT const &,\n               VULKAN_HPP_NAMESPACE::DebugUtilsMessageTypeFlagsEXT const &,\n               VULKAN_HPP_NAMESPACE::PFN_DebugUtilsMessengerCallbackEXT const &,\n               void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, messageSeverity, messageType, pfnUserCallback, pUserData );\n    }\n#endif\n\n    bool operator==( DebugUtilsMessengerCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( messageSeverity == rhs.messageSeverity ) &&\n             ( messageType == rhs.messageType ) && ( pfnUserCallback == rhs.pfnUserCallback ) && ( pUserData == rhs.pUserData );\n#endif\n    }\n\n    bool operator!=( DebugUtilsMessengerCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                      sType           = StructureType::eDebugUtilsMessengerCreateInfoEXT;\n    const void *                                             pNext           = {};\n    VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateFlagsEXT  flags           = {};\n    VULKAN_HPP_NAMESPACE::DebugUtilsMessageSeverityFlagsEXT  messageSeverity = {};\n    VULKAN_HPP_NAMESPACE::DebugUtilsMessageTypeFlagsEXT      messageType     = {};\n    VULKAN_HPP_NAMESPACE::PFN_DebugUtilsMessengerCallbackEXT pfnUserCallback = {};\n    void *                                                   pUserData       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDebugUtilsMessengerCreateInfoEXT>\n  {\n    using Type = DebugUtilsMessengerCreateInfoEXT;\n  };\n\n  struct DebugUtilsObjectTagInfoEXT\n  {\n    using NativeType = VkDebugUtilsObjectTagInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDebugUtilsObjectTagInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DebugUtilsObjectTagInfoEXT( VULKAN_HPP_NAMESPACE::ObjectType objectType_   = VULKAN_HPP_NAMESPACE::ObjectType::eUnknown,\n                                                     uint64_t                         objectHandle_ = {},\n                                                     uint64_t                         tagName_      = {},\n                                                     size_t                           tagSize_      = {},\n                                                     const void *                     pTag_         = {},\n                                                     const void *                     pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , objectType{ objectType_ }\n      , objectHandle{ objectHandle_ }\n      , tagName{ tagName_ }\n      , tagSize{ tagSize_ }\n      , pTag{ pTag_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DebugUtilsObjectTagInfoEXT( DebugUtilsObjectTagInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DebugUtilsObjectTagInfoEXT( VkDebugUtilsObjectTagInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DebugUtilsObjectTagInfoEXT( *reinterpret_cast<DebugUtilsObjectTagInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    DebugUtilsObjectTagInfoEXT( VULKAN_HPP_NAMESPACE::ObjectType                               objectType_,\n                                uint64_t                                                       objectHandle_,\n                                uint64_t                                                       tagName_,\n                                VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & tag_,\n                                const void *                                                   pNext_ = nullptr )\n      : pNext( pNext_ )\n      , objectType( objectType_ )\n      , objectHandle( objectHandle_ )\n      , tagName( tagName_ )\n      , tagSize( tag_.size() * sizeof( T ) )\n      , pTag( tag_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    DebugUtilsObjectTagInfoEXT & operator=( DebugUtilsObjectTagInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DebugUtilsObjectTagInfoEXT & operator=( VkDebugUtilsObjectTagInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DebugUtilsObjectTagInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsObjectTagInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsObjectTagInfoEXT & setObjectType( VULKAN_HPP_NAMESPACE::ObjectType objectType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      objectType = objectType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsObjectTagInfoEXT & setObjectHandle( uint64_t objectHandle_ ) VULKAN_HPP_NOEXCEPT\n    {\n      objectHandle = objectHandle_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsObjectTagInfoEXT & setTagName( uint64_t tagName_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tagName = tagName_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsObjectTagInfoEXT & setTagSize( size_t tagSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tagSize = tagSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DebugUtilsObjectTagInfoEXT & setPTag( const void * pTag_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pTag = pTag_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    DebugUtilsObjectTagInfoEXT & setTag( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & tag_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tagSize = tag_.size() * sizeof( T );\n      pTag    = tag_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDebugUtilsObjectTagInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDebugUtilsObjectTagInfoEXT *>( this );\n    }\n\n    operator VkDebugUtilsObjectTagInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDebugUtilsObjectTagInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ObjectType const &,\n               uint64_t const &,\n               uint64_t const &,\n               size_t const &,\n               const void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, objectType, objectHandle, tagName, tagSize, pTag );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DebugUtilsObjectTagInfoEXT const & ) const = default;\n#else\n    bool operator==( DebugUtilsObjectTagInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( objectType == rhs.objectType ) && ( objectHandle == rhs.objectHandle ) &&\n             ( tagName == rhs.tagName ) && ( tagSize == rhs.tagSize ) && ( pTag == rhs.pTag );\n#  endif\n    }\n\n    bool operator!=( DebugUtilsObjectTagInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType        = StructureType::eDebugUtilsObjectTagInfoEXT;\n    const void *                        pNext        = {};\n    VULKAN_HPP_NAMESPACE::ObjectType    objectType   = VULKAN_HPP_NAMESPACE::ObjectType::eUnknown;\n    uint64_t                            objectHandle = {};\n    uint64_t                            tagName      = {};\n    size_t                              tagSize      = {};\n    const void *                        pTag         = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDebugUtilsObjectTagInfoEXT>\n  {\n    using Type = DebugUtilsObjectTagInfoEXT;\n  };\n\n  struct DecompressMemoryRegionNV\n  {\n    using NativeType = VkDecompressMemoryRegionNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DecompressMemoryRegionNV( VULKAN_HPP_NAMESPACE::DeviceAddress                    srcAddress_          = {},\n                                                   VULKAN_HPP_NAMESPACE::DeviceAddress                    dstAddress_          = {},\n                                                   VULKAN_HPP_NAMESPACE::DeviceSize                       compressedSize_      = {},\n                                                   VULKAN_HPP_NAMESPACE::DeviceSize                       decompressedSize_    = {},\n                                                   VULKAN_HPP_NAMESPACE::MemoryDecompressionMethodFlagsNV decompressionMethod_ = {} ) VULKAN_HPP_NOEXCEPT\n      : srcAddress{ srcAddress_ }\n      , dstAddress{ dstAddress_ }\n      , compressedSize{ compressedSize_ }\n      , decompressedSize{ decompressedSize_ }\n      , decompressionMethod{ decompressionMethod_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DecompressMemoryRegionNV( DecompressMemoryRegionNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DecompressMemoryRegionNV( VkDecompressMemoryRegionNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DecompressMemoryRegionNV( *reinterpret_cast<DecompressMemoryRegionNV const *>( &rhs ) )\n    {\n    }\n\n    DecompressMemoryRegionNV & operator=( DecompressMemoryRegionNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DecompressMemoryRegionNV & operator=( VkDecompressMemoryRegionNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DecompressMemoryRegionNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DecompressMemoryRegionNV & setSrcAddress( VULKAN_HPP_NAMESPACE::DeviceAddress srcAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcAddress = srcAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DecompressMemoryRegionNV & setDstAddress( VULKAN_HPP_NAMESPACE::DeviceAddress dstAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstAddress = dstAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DecompressMemoryRegionNV & setCompressedSize( VULKAN_HPP_NAMESPACE::DeviceSize compressedSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      compressedSize = compressedSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DecompressMemoryRegionNV & setDecompressedSize( VULKAN_HPP_NAMESPACE::DeviceSize decompressedSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      decompressedSize = decompressedSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DecompressMemoryRegionNV &\n      setDecompressionMethod( VULKAN_HPP_NAMESPACE::MemoryDecompressionMethodFlagsNV decompressionMethod_ ) VULKAN_HPP_NOEXCEPT\n    {\n      decompressionMethod = decompressionMethod_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDecompressMemoryRegionNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDecompressMemoryRegionNV *>( this );\n    }\n\n    operator VkDecompressMemoryRegionNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDecompressMemoryRegionNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::MemoryDecompressionMethodFlagsNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( srcAddress, dstAddress, compressedSize, decompressedSize, decompressionMethod );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DecompressMemoryRegionNV const & ) const = default;\n#else\n    bool operator==( DecompressMemoryRegionNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( srcAddress == rhs.srcAddress ) && ( dstAddress == rhs.dstAddress ) && ( compressedSize == rhs.compressedSize ) &&\n             ( decompressedSize == rhs.decompressedSize ) && ( decompressionMethod == rhs.decompressionMethod );\n#  endif\n    }\n\n    bool operator!=( DecompressMemoryRegionNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DeviceAddress                    srcAddress          = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress                    dstAddress          = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                       compressedSize      = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                       decompressedSize    = {};\n    VULKAN_HPP_NAMESPACE::MemoryDecompressionMethodFlagsNV decompressionMethod = {};\n  };\n\n  struct DedicatedAllocationBufferCreateInfoNV\n  {\n    using NativeType = VkDedicatedAllocationBufferCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDedicatedAllocationBufferCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DedicatedAllocationBufferCreateInfoNV( VULKAN_HPP_NAMESPACE::Bool32 dedicatedAllocation_ = {},\n                                                                const void *                 pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , dedicatedAllocation{ dedicatedAllocation_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DedicatedAllocationBufferCreateInfoNV( DedicatedAllocationBufferCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DedicatedAllocationBufferCreateInfoNV( VkDedicatedAllocationBufferCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DedicatedAllocationBufferCreateInfoNV( *reinterpret_cast<DedicatedAllocationBufferCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n    DedicatedAllocationBufferCreateInfoNV & operator=( DedicatedAllocationBufferCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DedicatedAllocationBufferCreateInfoNV & operator=( VkDedicatedAllocationBufferCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DedicatedAllocationBufferCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DedicatedAllocationBufferCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DedicatedAllocationBufferCreateInfoNV &\n      setDedicatedAllocation( VULKAN_HPP_NAMESPACE::Bool32 dedicatedAllocation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dedicatedAllocation = dedicatedAllocation_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDedicatedAllocationBufferCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDedicatedAllocationBufferCreateInfoNV *>( this );\n    }\n\n    operator VkDedicatedAllocationBufferCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDedicatedAllocationBufferCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, dedicatedAllocation );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DedicatedAllocationBufferCreateInfoNV const & ) const = default;\n#else\n    bool operator==( DedicatedAllocationBufferCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( dedicatedAllocation == rhs.dedicatedAllocation );\n#  endif\n    }\n\n    bool operator!=( DedicatedAllocationBufferCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType               = StructureType::eDedicatedAllocationBufferCreateInfoNV;\n    const void *                        pNext               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        dedicatedAllocation = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDedicatedAllocationBufferCreateInfoNV>\n  {\n    using Type = DedicatedAllocationBufferCreateInfoNV;\n  };\n\n  struct DedicatedAllocationImageCreateInfoNV\n  {\n    using NativeType = VkDedicatedAllocationImageCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDedicatedAllocationImageCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DedicatedAllocationImageCreateInfoNV( VULKAN_HPP_NAMESPACE::Bool32 dedicatedAllocation_ = {},\n                                                               const void *                 pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , dedicatedAllocation{ dedicatedAllocation_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DedicatedAllocationImageCreateInfoNV( DedicatedAllocationImageCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DedicatedAllocationImageCreateInfoNV( VkDedicatedAllocationImageCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DedicatedAllocationImageCreateInfoNV( *reinterpret_cast<DedicatedAllocationImageCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n    DedicatedAllocationImageCreateInfoNV & operator=( DedicatedAllocationImageCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DedicatedAllocationImageCreateInfoNV & operator=( VkDedicatedAllocationImageCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DedicatedAllocationImageCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DedicatedAllocationImageCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DedicatedAllocationImageCreateInfoNV &\n      setDedicatedAllocation( VULKAN_HPP_NAMESPACE::Bool32 dedicatedAllocation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dedicatedAllocation = dedicatedAllocation_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDedicatedAllocationImageCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDedicatedAllocationImageCreateInfoNV *>( this );\n    }\n\n    operator VkDedicatedAllocationImageCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDedicatedAllocationImageCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, dedicatedAllocation );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DedicatedAllocationImageCreateInfoNV const & ) const = default;\n#else\n    bool operator==( DedicatedAllocationImageCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( dedicatedAllocation == rhs.dedicatedAllocation );\n#  endif\n    }\n\n    bool operator!=( DedicatedAllocationImageCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType               = StructureType::eDedicatedAllocationImageCreateInfoNV;\n    const void *                        pNext               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        dedicatedAllocation = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDedicatedAllocationImageCreateInfoNV>\n  {\n    using Type = DedicatedAllocationImageCreateInfoNV;\n  };\n\n  struct DedicatedAllocationMemoryAllocateInfoNV\n  {\n    using NativeType = VkDedicatedAllocationMemoryAllocateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDedicatedAllocationMemoryAllocateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DedicatedAllocationMemoryAllocateInfoNV( VULKAN_HPP_NAMESPACE::Image  image_  = {},\n                                                                  VULKAN_HPP_NAMESPACE::Buffer buffer_ = {},\n                                                                  const void *                 pNext_  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , image{ image_ }\n      , buffer{ buffer_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DedicatedAllocationMemoryAllocateInfoNV( DedicatedAllocationMemoryAllocateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DedicatedAllocationMemoryAllocateInfoNV( VkDedicatedAllocationMemoryAllocateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DedicatedAllocationMemoryAllocateInfoNV( *reinterpret_cast<DedicatedAllocationMemoryAllocateInfoNV const *>( &rhs ) )\n    {\n    }\n\n    DedicatedAllocationMemoryAllocateInfoNV & operator=( DedicatedAllocationMemoryAllocateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DedicatedAllocationMemoryAllocateInfoNV & operator=( VkDedicatedAllocationMemoryAllocateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DedicatedAllocationMemoryAllocateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DedicatedAllocationMemoryAllocateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DedicatedAllocationMemoryAllocateInfoNV & setImage( VULKAN_HPP_NAMESPACE::Image image_ ) VULKAN_HPP_NOEXCEPT\n    {\n      image = image_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DedicatedAllocationMemoryAllocateInfoNV & setBuffer( VULKAN_HPP_NAMESPACE::Buffer buffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      buffer = buffer_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDedicatedAllocationMemoryAllocateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDedicatedAllocationMemoryAllocateInfoNV *>( this );\n    }\n\n    operator VkDedicatedAllocationMemoryAllocateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDedicatedAllocationMemoryAllocateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Image const &, VULKAN_HPP_NAMESPACE::Buffer const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, image, buffer );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DedicatedAllocationMemoryAllocateInfoNV const & ) const = default;\n#else\n    bool operator==( DedicatedAllocationMemoryAllocateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( image == rhs.image ) && ( buffer == rhs.buffer );\n#  endif\n    }\n\n    bool operator!=( DedicatedAllocationMemoryAllocateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType  = StructureType::eDedicatedAllocationMemoryAllocateInfoNV;\n    const void *                        pNext  = {};\n    VULKAN_HPP_NAMESPACE::Image         image  = {};\n    VULKAN_HPP_NAMESPACE::Buffer        buffer = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDedicatedAllocationMemoryAllocateInfoNV>\n  {\n    using Type = DedicatedAllocationMemoryAllocateInfoNV;\n  };\n\n  struct MemoryBarrier2\n  {\n    using NativeType = VkMemoryBarrier2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryBarrier2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryBarrier2( VULKAN_HPP_NAMESPACE::PipelineStageFlags2 srcStageMask_  = {},\n                                         VULKAN_HPP_NAMESPACE::AccessFlags2        srcAccessMask_ = {},\n                                         VULKAN_HPP_NAMESPACE::PipelineStageFlags2 dstStageMask_  = {},\n                                         VULKAN_HPP_NAMESPACE::AccessFlags2        dstAccessMask_ = {},\n                                         const void *                              pNext_         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , srcStageMask{ srcStageMask_ }\n      , srcAccessMask{ srcAccessMask_ }\n      , dstStageMask{ dstStageMask_ }\n      , dstAccessMask{ dstAccessMask_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryBarrier2( MemoryBarrier2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryBarrier2( VkMemoryBarrier2 const & rhs ) VULKAN_HPP_NOEXCEPT : MemoryBarrier2( *reinterpret_cast<MemoryBarrier2 const *>( &rhs ) ) {}\n\n    MemoryBarrier2 & operator=( MemoryBarrier2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryBarrier2 & operator=( VkMemoryBarrier2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryBarrier2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MemoryBarrier2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryBarrier2 & setSrcStageMask( VULKAN_HPP_NAMESPACE::PipelineStageFlags2 srcStageMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcStageMask = srcStageMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryBarrier2 & setSrcAccessMask( VULKAN_HPP_NAMESPACE::AccessFlags2 srcAccessMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcAccessMask = srcAccessMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryBarrier2 & setDstStageMask( VULKAN_HPP_NAMESPACE::PipelineStageFlags2 dstStageMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstStageMask = dstStageMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryBarrier2 & setDstAccessMask( VULKAN_HPP_NAMESPACE::AccessFlags2 dstAccessMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstAccessMask = dstAccessMask_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMemoryBarrier2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryBarrier2 *>( this );\n    }\n\n    operator VkMemoryBarrier2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryBarrier2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineStageFlags2 const &,\n               VULKAN_HPP_NAMESPACE::AccessFlags2 const &,\n               VULKAN_HPP_NAMESPACE::PipelineStageFlags2 const &,\n               VULKAN_HPP_NAMESPACE::AccessFlags2 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, srcStageMask, srcAccessMask, dstStageMask, dstAccessMask );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryBarrier2 const & ) const = default;\n#else\n    bool operator==( MemoryBarrier2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( srcStageMask == rhs.srcStageMask ) && ( srcAccessMask == rhs.srcAccessMask ) &&\n             ( dstStageMask == rhs.dstStageMask ) && ( dstAccessMask == rhs.dstAccessMask );\n#  endif\n    }\n\n    bool operator!=( MemoryBarrier2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType         = StructureType::eMemoryBarrier2;\n    const void *                              pNext         = {};\n    VULKAN_HPP_NAMESPACE::PipelineStageFlags2 srcStageMask  = {};\n    VULKAN_HPP_NAMESPACE::AccessFlags2        srcAccessMask = {};\n    VULKAN_HPP_NAMESPACE::PipelineStageFlags2 dstStageMask  = {};\n    VULKAN_HPP_NAMESPACE::AccessFlags2        dstAccessMask = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryBarrier2>\n  {\n    using Type = MemoryBarrier2;\n  };\n\n  using MemoryBarrier2KHR = MemoryBarrier2;\n\n  struct ImageSubresourceRange\n  {\n    using NativeType = VkImageSubresourceRange;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageSubresourceRange( VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask_     = {},\n                                                uint32_t                               baseMipLevel_   = {},\n                                                uint32_t                               levelCount_     = {},\n                                                uint32_t                               baseArrayLayer_ = {},\n                                                uint32_t                               layerCount_     = {} ) VULKAN_HPP_NOEXCEPT\n      : aspectMask{ aspectMask_ }\n      , baseMipLevel{ baseMipLevel_ }\n      , levelCount{ levelCount_ }\n      , baseArrayLayer{ baseArrayLayer_ }\n      , layerCount{ layerCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageSubresourceRange( ImageSubresourceRange const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageSubresourceRange( VkImageSubresourceRange const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageSubresourceRange( *reinterpret_cast<ImageSubresourceRange const *>( &rhs ) )\n    {\n    }\n\n    ImageSubresourceRange & operator=( ImageSubresourceRange const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageSubresourceRange & operator=( VkImageSubresourceRange const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageSubresourceRange const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageSubresourceRange & setAspectMask( VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      aspectMask = aspectMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageSubresourceRange & setBaseMipLevel( uint32_t baseMipLevel_ ) VULKAN_HPP_NOEXCEPT\n    {\n      baseMipLevel = baseMipLevel_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageSubresourceRange & setLevelCount( uint32_t levelCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      levelCount = levelCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageSubresourceRange & setBaseArrayLayer( uint32_t baseArrayLayer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      baseArrayLayer = baseArrayLayer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageSubresourceRange & setLayerCount( uint32_t layerCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layerCount = layerCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageSubresourceRange const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageSubresourceRange *>( this );\n    }\n\n    operator VkImageSubresourceRange &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageSubresourceRange *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::ImageAspectFlags const &, uint32_t const &, uint32_t const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( aspectMask, baseMipLevel, levelCount, baseArrayLayer, layerCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageSubresourceRange const & ) const = default;\n#else\n    bool operator==( ImageSubresourceRange const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( aspectMask == rhs.aspectMask ) && ( baseMipLevel == rhs.baseMipLevel ) && ( levelCount == rhs.levelCount ) &&\n             ( baseArrayLayer == rhs.baseArrayLayer ) && ( layerCount == rhs.layerCount );\n#  endif\n    }\n\n    bool operator!=( ImageSubresourceRange const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask     = {};\n    uint32_t                               baseMipLevel   = {};\n    uint32_t                               levelCount     = {};\n    uint32_t                               baseArrayLayer = {};\n    uint32_t                               layerCount     = {};\n  };\n\n  struct ImageMemoryBarrier2\n  {\n    using NativeType = VkImageMemoryBarrier2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageMemoryBarrier2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageMemoryBarrier2( VULKAN_HPP_NAMESPACE::PipelineStageFlags2   srcStageMask_        = {},\n                                              VULKAN_HPP_NAMESPACE::AccessFlags2          srcAccessMask_       = {},\n                                              VULKAN_HPP_NAMESPACE::PipelineStageFlags2   dstStageMask_        = {},\n                                              VULKAN_HPP_NAMESPACE::AccessFlags2          dstAccessMask_       = {},\n                                              VULKAN_HPP_NAMESPACE::ImageLayout           oldLayout_           = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                              VULKAN_HPP_NAMESPACE::ImageLayout           newLayout_           = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                              uint32_t                                    srcQueueFamilyIndex_ = {},\n                                              uint32_t                                    dstQueueFamilyIndex_ = {},\n                                              VULKAN_HPP_NAMESPACE::Image                 image_               = {},\n                                              VULKAN_HPP_NAMESPACE::ImageSubresourceRange subresourceRange_    = {},\n                                              const void *                                pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , srcStageMask{ srcStageMask_ }\n      , srcAccessMask{ srcAccessMask_ }\n      , dstStageMask{ dstStageMask_ }\n      , dstAccessMask{ dstAccessMask_ }\n      , oldLayout{ oldLayout_ }\n      , newLayout{ newLayout_ }\n      , srcQueueFamilyIndex{ srcQueueFamilyIndex_ }\n      , dstQueueFamilyIndex{ dstQueueFamilyIndex_ }\n      , image{ image_ }\n      , subresourceRange{ subresourceRange_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageMemoryBarrier2( ImageMemoryBarrier2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageMemoryBarrier2( VkImageMemoryBarrier2 const & rhs ) VULKAN_HPP_NOEXCEPT : ImageMemoryBarrier2( *reinterpret_cast<ImageMemoryBarrier2 const *>( &rhs ) )\n    {\n    }\n\n    ImageMemoryBarrier2 & operator=( ImageMemoryBarrier2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageMemoryBarrier2 & operator=( VkImageMemoryBarrier2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageMemoryBarrier2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageMemoryBarrier2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageMemoryBarrier2 & setSrcStageMask( VULKAN_HPP_NAMESPACE::PipelineStageFlags2 srcStageMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcStageMask = srcStageMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageMemoryBarrier2 & setSrcAccessMask( VULKAN_HPP_NAMESPACE::AccessFlags2 srcAccessMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcAccessMask = srcAccessMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageMemoryBarrier2 & setDstStageMask( VULKAN_HPP_NAMESPACE::PipelineStageFlags2 dstStageMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstStageMask = dstStageMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageMemoryBarrier2 & setDstAccessMask( VULKAN_HPP_NAMESPACE::AccessFlags2 dstAccessMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstAccessMask = dstAccessMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageMemoryBarrier2 & setOldLayout( VULKAN_HPP_NAMESPACE::ImageLayout oldLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      oldLayout = oldLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageMemoryBarrier2 & setNewLayout( VULKAN_HPP_NAMESPACE::ImageLayout newLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      newLayout = newLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageMemoryBarrier2 & setSrcQueueFamilyIndex( uint32_t srcQueueFamilyIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcQueueFamilyIndex = srcQueueFamilyIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageMemoryBarrier2 & setDstQueueFamilyIndex( uint32_t dstQueueFamilyIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstQueueFamilyIndex = dstQueueFamilyIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageMemoryBarrier2 & setImage( VULKAN_HPP_NAMESPACE::Image image_ ) VULKAN_HPP_NOEXCEPT\n    {\n      image = image_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageMemoryBarrier2 &\n      setSubresourceRange( VULKAN_HPP_NAMESPACE::ImageSubresourceRange const & subresourceRange_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subresourceRange = subresourceRange_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageMemoryBarrier2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageMemoryBarrier2 *>( this );\n    }\n\n    operator VkImageMemoryBarrier2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageMemoryBarrier2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineStageFlags2 const &,\n               VULKAN_HPP_NAMESPACE::AccessFlags2 const &,\n               VULKAN_HPP_NAMESPACE::PipelineStageFlags2 const &,\n               VULKAN_HPP_NAMESPACE::AccessFlags2 const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Image const &,\n               VULKAN_HPP_NAMESPACE::ImageSubresourceRange const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       srcStageMask,\n                       srcAccessMask,\n                       dstStageMask,\n                       dstAccessMask,\n                       oldLayout,\n                       newLayout,\n                       srcQueueFamilyIndex,\n                       dstQueueFamilyIndex,\n                       image,\n                       subresourceRange );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageMemoryBarrier2 const & ) const = default;\n#else\n    bool operator==( ImageMemoryBarrier2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( srcStageMask == rhs.srcStageMask ) && ( srcAccessMask == rhs.srcAccessMask ) &&\n             ( dstStageMask == rhs.dstStageMask ) && ( dstAccessMask == rhs.dstAccessMask ) && ( oldLayout == rhs.oldLayout ) &&\n             ( newLayout == rhs.newLayout ) && ( srcQueueFamilyIndex == rhs.srcQueueFamilyIndex ) && ( dstQueueFamilyIndex == rhs.dstQueueFamilyIndex ) &&\n             ( image == rhs.image ) && ( subresourceRange == rhs.subresourceRange );\n#  endif\n    }\n\n    bool operator!=( ImageMemoryBarrier2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType         sType               = StructureType::eImageMemoryBarrier2;\n    const void *                                pNext               = {};\n    VULKAN_HPP_NAMESPACE::PipelineStageFlags2   srcStageMask        = {};\n    VULKAN_HPP_NAMESPACE::AccessFlags2          srcAccessMask       = {};\n    VULKAN_HPP_NAMESPACE::PipelineStageFlags2   dstStageMask        = {};\n    VULKAN_HPP_NAMESPACE::AccessFlags2          dstAccessMask       = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout           oldLayout           = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    VULKAN_HPP_NAMESPACE::ImageLayout           newLayout           = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    uint32_t                                    srcQueueFamilyIndex = {};\n    uint32_t                                    dstQueueFamilyIndex = {};\n    VULKAN_HPP_NAMESPACE::Image                 image               = {};\n    VULKAN_HPP_NAMESPACE::ImageSubresourceRange subresourceRange    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageMemoryBarrier2>\n  {\n    using Type = ImageMemoryBarrier2;\n  };\n\n  using ImageMemoryBarrier2KHR = ImageMemoryBarrier2;\n\n  struct DependencyInfo\n  {\n    using NativeType = VkDependencyInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDependencyInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DependencyInfo( VULKAN_HPP_NAMESPACE::DependencyFlags              dependencyFlags_          = {},\n                                         uint32_t                                           memoryBarrierCount_       = {},\n                                         const VULKAN_HPP_NAMESPACE::MemoryBarrier2 *       pMemoryBarriers_          = {},\n                                         uint32_t                                           bufferMemoryBarrierCount_ = {},\n                                         const VULKAN_HPP_NAMESPACE::BufferMemoryBarrier2 * pBufferMemoryBarriers_    = {},\n                                         uint32_t                                           imageMemoryBarrierCount_  = {},\n                                         const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier2 *  pImageMemoryBarriers_     = {},\n                                         const void *                                       pNext_                    = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , dependencyFlags{ dependencyFlags_ }\n      , memoryBarrierCount{ memoryBarrierCount_ }\n      , pMemoryBarriers{ pMemoryBarriers_ }\n      , bufferMemoryBarrierCount{ bufferMemoryBarrierCount_ }\n      , pBufferMemoryBarriers{ pBufferMemoryBarriers_ }\n      , imageMemoryBarrierCount{ imageMemoryBarrierCount_ }\n      , pImageMemoryBarriers{ pImageMemoryBarriers_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DependencyInfo( DependencyInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DependencyInfo( VkDependencyInfo const & rhs ) VULKAN_HPP_NOEXCEPT : DependencyInfo( *reinterpret_cast<DependencyInfo const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DependencyInfo( VULKAN_HPP_NAMESPACE::DependencyFlags                                                                   dependencyFlags_,\n                    VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::MemoryBarrier2> const &       memoryBarriers_,\n                    VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::BufferMemoryBarrier2> const & bufferMemoryBarriers_ = {},\n                    VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier2> const &  imageMemoryBarriers_  = {},\n                    const void *                                                                                            pNext_                = nullptr )\n      : pNext( pNext_ )\n      , dependencyFlags( dependencyFlags_ )\n      , memoryBarrierCount( static_cast<uint32_t>( memoryBarriers_.size() ) )\n      , pMemoryBarriers( memoryBarriers_.data() )\n      , bufferMemoryBarrierCount( static_cast<uint32_t>( bufferMemoryBarriers_.size() ) )\n      , pBufferMemoryBarriers( bufferMemoryBarriers_.data() )\n      , imageMemoryBarrierCount( static_cast<uint32_t>( imageMemoryBarriers_.size() ) )\n      , pImageMemoryBarriers( imageMemoryBarriers_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    DependencyInfo & operator=( DependencyInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DependencyInfo & operator=( VkDependencyInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DependencyInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DependencyInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DependencyInfo & setDependencyFlags( VULKAN_HPP_NAMESPACE::DependencyFlags dependencyFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dependencyFlags = dependencyFlags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DependencyInfo & setMemoryBarrierCount( uint32_t memoryBarrierCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memoryBarrierCount = memoryBarrierCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DependencyInfo & setPMemoryBarriers( const VULKAN_HPP_NAMESPACE::MemoryBarrier2 * pMemoryBarriers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pMemoryBarriers = pMemoryBarriers_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DependencyInfo &\n      setMemoryBarriers( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::MemoryBarrier2> const & memoryBarriers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memoryBarrierCount = static_cast<uint32_t>( memoryBarriers_.size() );\n      pMemoryBarriers    = memoryBarriers_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 DependencyInfo & setBufferMemoryBarrierCount( uint32_t bufferMemoryBarrierCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferMemoryBarrierCount = bufferMemoryBarrierCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DependencyInfo &\n      setPBufferMemoryBarriers( const VULKAN_HPP_NAMESPACE::BufferMemoryBarrier2 * pBufferMemoryBarriers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pBufferMemoryBarriers = pBufferMemoryBarriers_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DependencyInfo & setBufferMemoryBarriers(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::BufferMemoryBarrier2> const & bufferMemoryBarriers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferMemoryBarrierCount = static_cast<uint32_t>( bufferMemoryBarriers_.size() );\n      pBufferMemoryBarriers    = bufferMemoryBarriers_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 DependencyInfo & setImageMemoryBarrierCount( uint32_t imageMemoryBarrierCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageMemoryBarrierCount = imageMemoryBarrierCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DependencyInfo &\n      setPImageMemoryBarriers( const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier2 * pImageMemoryBarriers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pImageMemoryBarriers = pImageMemoryBarriers_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DependencyInfo & setImageMemoryBarriers(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier2> const & imageMemoryBarriers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageMemoryBarrierCount = static_cast<uint32_t>( imageMemoryBarriers_.size() );\n      pImageMemoryBarriers    = imageMemoryBarriers_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDependencyInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDependencyInfo *>( this );\n    }\n\n    operator VkDependencyInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDependencyInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DependencyFlags const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::MemoryBarrier2 * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::BufferMemoryBarrier2 * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier2 * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       dependencyFlags,\n                       memoryBarrierCount,\n                       pMemoryBarriers,\n                       bufferMemoryBarrierCount,\n                       pBufferMemoryBarriers,\n                       imageMemoryBarrierCount,\n                       pImageMemoryBarriers );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DependencyInfo const & ) const = default;\n#else\n    bool operator==( DependencyInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( dependencyFlags == rhs.dependencyFlags ) &&\n             ( memoryBarrierCount == rhs.memoryBarrierCount ) && ( pMemoryBarriers == rhs.pMemoryBarriers ) &&\n             ( bufferMemoryBarrierCount == rhs.bufferMemoryBarrierCount ) && ( pBufferMemoryBarriers == rhs.pBufferMemoryBarriers ) &&\n             ( imageMemoryBarrierCount == rhs.imageMemoryBarrierCount ) && ( pImageMemoryBarriers == rhs.pImageMemoryBarriers );\n#  endif\n    }\n\n    bool operator!=( DependencyInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                sType                    = StructureType::eDependencyInfo;\n    const void *                                       pNext                    = {};\n    VULKAN_HPP_NAMESPACE::DependencyFlags              dependencyFlags          = {};\n    uint32_t                                           memoryBarrierCount       = {};\n    const VULKAN_HPP_NAMESPACE::MemoryBarrier2 *       pMemoryBarriers          = {};\n    uint32_t                                           bufferMemoryBarrierCount = {};\n    const VULKAN_HPP_NAMESPACE::BufferMemoryBarrier2 * pBufferMemoryBarriers    = {};\n    uint32_t                                           imageMemoryBarrierCount  = {};\n    const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier2 *  pImageMemoryBarriers     = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDependencyInfo>\n  {\n    using Type = DependencyInfo;\n  };\n\n  using DependencyInfoKHR = DependencyInfo;\n\n  struct DepthBiasInfoEXT\n  {\n    using NativeType = VkDepthBiasInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDepthBiasInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DepthBiasInfoEXT( float        depthBiasConstantFactor_ = {},\n                                           float        depthBiasClamp_          = {},\n                                           float        depthBiasSlopeFactor_    = {},\n                                           const void * pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , depthBiasConstantFactor{ depthBiasConstantFactor_ }\n      , depthBiasClamp{ depthBiasClamp_ }\n      , depthBiasSlopeFactor{ depthBiasSlopeFactor_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DepthBiasInfoEXT( DepthBiasInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DepthBiasInfoEXT( VkDepthBiasInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT : DepthBiasInfoEXT( *reinterpret_cast<DepthBiasInfoEXT const *>( &rhs ) ) {}\n\n    DepthBiasInfoEXT & operator=( DepthBiasInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DepthBiasInfoEXT & operator=( VkDepthBiasInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DepthBiasInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DepthBiasInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DepthBiasInfoEXT & setDepthBiasConstantFactor( float depthBiasConstantFactor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthBiasConstantFactor = depthBiasConstantFactor_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DepthBiasInfoEXT & setDepthBiasClamp( float depthBiasClamp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthBiasClamp = depthBiasClamp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DepthBiasInfoEXT & setDepthBiasSlopeFactor( float depthBiasSlopeFactor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthBiasSlopeFactor = depthBiasSlopeFactor_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDepthBiasInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDepthBiasInfoEXT *>( this );\n    }\n\n    operator VkDepthBiasInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDepthBiasInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, float const &, float const &, float const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DepthBiasInfoEXT const & ) const = default;\n#else\n    bool operator==( DepthBiasInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( depthBiasConstantFactor == rhs.depthBiasConstantFactor ) &&\n             ( depthBiasClamp == rhs.depthBiasClamp ) && ( depthBiasSlopeFactor == rhs.depthBiasSlopeFactor );\n#  endif\n    }\n\n    bool operator!=( DepthBiasInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                   = StructureType::eDepthBiasInfoEXT;\n    const void *                        pNext                   = {};\n    float                               depthBiasConstantFactor = {};\n    float                               depthBiasClamp          = {};\n    float                               depthBiasSlopeFactor    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDepthBiasInfoEXT>\n  {\n    using Type = DepthBiasInfoEXT;\n  };\n\n  struct DepthBiasRepresentationInfoEXT\n  {\n    using NativeType = VkDepthBiasRepresentationInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDepthBiasRepresentationInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DepthBiasRepresentationInfoEXT( VULKAN_HPP_NAMESPACE::DepthBiasRepresentationEXT depthBiasRepresentation_ =\n                                                           VULKAN_HPP_NAMESPACE::DepthBiasRepresentationEXT::eLeastRepresentableValueFormat,\n                                                         VULKAN_HPP_NAMESPACE::Bool32 depthBiasExact_ = {},\n                                                         const void *                 pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , depthBiasRepresentation{ depthBiasRepresentation_ }\n      , depthBiasExact{ depthBiasExact_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DepthBiasRepresentationInfoEXT( DepthBiasRepresentationInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DepthBiasRepresentationInfoEXT( VkDepthBiasRepresentationInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DepthBiasRepresentationInfoEXT( *reinterpret_cast<DepthBiasRepresentationInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    DepthBiasRepresentationInfoEXT & operator=( DepthBiasRepresentationInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DepthBiasRepresentationInfoEXT & operator=( VkDepthBiasRepresentationInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DepthBiasRepresentationInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DepthBiasRepresentationInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DepthBiasRepresentationInfoEXT &\n      setDepthBiasRepresentation( VULKAN_HPP_NAMESPACE::DepthBiasRepresentationEXT depthBiasRepresentation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthBiasRepresentation = depthBiasRepresentation_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DepthBiasRepresentationInfoEXT & setDepthBiasExact( VULKAN_HPP_NAMESPACE::Bool32 depthBiasExact_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthBiasExact = depthBiasExact_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDepthBiasRepresentationInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDepthBiasRepresentationInfoEXT *>( this );\n    }\n\n    operator VkDepthBiasRepresentationInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDepthBiasRepresentationInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DepthBiasRepresentationEXT const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, depthBiasRepresentation, depthBiasExact );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DepthBiasRepresentationInfoEXT const & ) const = default;\n#else\n    bool operator==( DepthBiasRepresentationInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( depthBiasRepresentation == rhs.depthBiasRepresentation ) &&\n             ( depthBiasExact == rhs.depthBiasExact );\n#  endif\n    }\n\n    bool operator!=( DepthBiasRepresentationInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType              sType                   = StructureType::eDepthBiasRepresentationInfoEXT;\n    const void *                                     pNext                   = {};\n    VULKAN_HPP_NAMESPACE::DepthBiasRepresentationEXT depthBiasRepresentation = VULKAN_HPP_NAMESPACE::DepthBiasRepresentationEXT::eLeastRepresentableValueFormat;\n    VULKAN_HPP_NAMESPACE::Bool32                     depthBiasExact          = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDepthBiasRepresentationInfoEXT>\n  {\n    using Type = DepthBiasRepresentationInfoEXT;\n  };\n\n  struct DepthClampRangeEXT\n  {\n    using NativeType = VkDepthClampRangeEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DepthClampRangeEXT( float minDepthClamp_ = {}, float maxDepthClamp_ = {} ) VULKAN_HPP_NOEXCEPT\n      : minDepthClamp{ minDepthClamp_ }\n      , maxDepthClamp{ maxDepthClamp_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DepthClampRangeEXT( DepthClampRangeEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DepthClampRangeEXT( VkDepthClampRangeEXT const & rhs ) VULKAN_HPP_NOEXCEPT : DepthClampRangeEXT( *reinterpret_cast<DepthClampRangeEXT const *>( &rhs ) ) {}\n\n    DepthClampRangeEXT & operator=( DepthClampRangeEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DepthClampRangeEXT & operator=( VkDepthClampRangeEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DepthClampRangeEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DepthClampRangeEXT & setMinDepthClamp( float minDepthClamp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minDepthClamp = minDepthClamp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DepthClampRangeEXT & setMaxDepthClamp( float maxDepthClamp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxDepthClamp = maxDepthClamp_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDepthClampRangeEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDepthClampRangeEXT *>( this );\n    }\n\n    operator VkDepthClampRangeEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDepthClampRangeEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<float const &, float const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( minDepthClamp, maxDepthClamp );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DepthClampRangeEXT const & ) const = default;\n#else\n    bool operator==( DepthClampRangeEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( minDepthClamp == rhs.minDepthClamp ) && ( maxDepthClamp == rhs.maxDepthClamp );\n#  endif\n    }\n\n    bool operator!=( DepthClampRangeEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    float minDepthClamp = {};\n    float maxDepthClamp = {};\n  };\n\n  struct DescriptorAddressInfoEXT\n  {\n    using NativeType = VkDescriptorAddressInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDescriptorAddressInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DescriptorAddressInfoEXT( VULKAN_HPP_NAMESPACE::DeviceAddress address_ = {},\n                                                   VULKAN_HPP_NAMESPACE::DeviceSize    range_   = {},\n                                                   VULKAN_HPP_NAMESPACE::Format        format_  = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                                   void *                              pNext_   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , address{ address_ }\n      , range{ range_ }\n      , format{ format_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DescriptorAddressInfoEXT( DescriptorAddressInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DescriptorAddressInfoEXT( VkDescriptorAddressInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DescriptorAddressInfoEXT( *reinterpret_cast<DescriptorAddressInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    DescriptorAddressInfoEXT & operator=( DescriptorAddressInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DescriptorAddressInfoEXT & operator=( VkDescriptorAddressInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DescriptorAddressInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DescriptorAddressInfoEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorAddressInfoEXT & setAddress( VULKAN_HPP_NAMESPACE::DeviceAddress address_ ) VULKAN_HPP_NOEXCEPT\n    {\n      address = address_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorAddressInfoEXT & setRange( VULKAN_HPP_NAMESPACE::DeviceSize range_ ) VULKAN_HPP_NOEXCEPT\n    {\n      range = range_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorAddressInfoEXT & setFormat( VULKAN_HPP_NAMESPACE::Format format_ ) VULKAN_HPP_NOEXCEPT\n    {\n      format = format_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDescriptorAddressInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDescriptorAddressInfoEXT *>( this );\n    }\n\n    operator VkDescriptorAddressInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDescriptorAddressInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::Format const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, address, range, format );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DescriptorAddressInfoEXT const & ) const = default;\n#else\n    bool operator==( DescriptorAddressInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( address == rhs.address ) && ( range == rhs.range ) && ( format == rhs.format );\n#  endif\n    }\n\n    bool operator!=( DescriptorAddressInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType   = StructureType::eDescriptorAddressInfoEXT;\n    void *                              pNext   = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress address = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    range   = {};\n    VULKAN_HPP_NAMESPACE::Format        format  = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDescriptorAddressInfoEXT>\n  {\n    using Type = DescriptorAddressInfoEXT;\n  };\n\n  struct DescriptorBufferBindingInfoEXT\n  {\n    using NativeType = VkDescriptorBufferBindingInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDescriptorBufferBindingInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DescriptorBufferBindingInfoEXT( VULKAN_HPP_NAMESPACE::DeviceAddress    address_ = {},\n                                                         VULKAN_HPP_NAMESPACE::BufferUsageFlags usage_   = {},\n                                                         const void *                           pNext_   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , address{ address_ }\n      , usage{ usage_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DescriptorBufferBindingInfoEXT( DescriptorBufferBindingInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DescriptorBufferBindingInfoEXT( VkDescriptorBufferBindingInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DescriptorBufferBindingInfoEXT( *reinterpret_cast<DescriptorBufferBindingInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    DescriptorBufferBindingInfoEXT & operator=( DescriptorBufferBindingInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DescriptorBufferBindingInfoEXT & operator=( VkDescriptorBufferBindingInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DescriptorBufferBindingInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DescriptorBufferBindingInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorBufferBindingInfoEXT & setAddress( VULKAN_HPP_NAMESPACE::DeviceAddress address_ ) VULKAN_HPP_NOEXCEPT\n    {\n      address = address_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorBufferBindingInfoEXT & setUsage( VULKAN_HPP_NAMESPACE::BufferUsageFlags usage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      usage = usage_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDescriptorBufferBindingInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDescriptorBufferBindingInfoEXT *>( this );\n    }\n\n    operator VkDescriptorBufferBindingInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDescriptorBufferBindingInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::BufferUsageFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, address, usage );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DescriptorBufferBindingInfoEXT const & ) const = default;\n#else\n    bool operator==( DescriptorBufferBindingInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( address == rhs.address ) && ( usage == rhs.usage );\n#  endif\n    }\n\n    bool operator!=( DescriptorBufferBindingInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType   = StructureType::eDescriptorBufferBindingInfoEXT;\n    const void *                           pNext   = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress    address = {};\n    VULKAN_HPP_NAMESPACE::BufferUsageFlags usage   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDescriptorBufferBindingInfoEXT>\n  {\n    using Type = DescriptorBufferBindingInfoEXT;\n  };\n\n  struct DescriptorBufferBindingPushDescriptorBufferHandleEXT\n  {\n    using NativeType = VkDescriptorBufferBindingPushDescriptorBufferHandleEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDescriptorBufferBindingPushDescriptorBufferHandleEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DescriptorBufferBindingPushDescriptorBufferHandleEXT( VULKAN_HPP_NAMESPACE::Buffer buffer_ = {},\n                                                                               const void *                 pNext_  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , buffer{ buffer_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      DescriptorBufferBindingPushDescriptorBufferHandleEXT( DescriptorBufferBindingPushDescriptorBufferHandleEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DescriptorBufferBindingPushDescriptorBufferHandleEXT( VkDescriptorBufferBindingPushDescriptorBufferHandleEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DescriptorBufferBindingPushDescriptorBufferHandleEXT( *reinterpret_cast<DescriptorBufferBindingPushDescriptorBufferHandleEXT const *>( &rhs ) )\n    {\n    }\n\n    DescriptorBufferBindingPushDescriptorBufferHandleEXT &\n      operator=( DescriptorBufferBindingPushDescriptorBufferHandleEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DescriptorBufferBindingPushDescriptorBufferHandleEXT & operator=( VkDescriptorBufferBindingPushDescriptorBufferHandleEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DescriptorBufferBindingPushDescriptorBufferHandleEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DescriptorBufferBindingPushDescriptorBufferHandleEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorBufferBindingPushDescriptorBufferHandleEXT & setBuffer( VULKAN_HPP_NAMESPACE::Buffer buffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      buffer = buffer_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDescriptorBufferBindingPushDescriptorBufferHandleEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDescriptorBufferBindingPushDescriptorBufferHandleEXT *>( this );\n    }\n\n    operator VkDescriptorBufferBindingPushDescriptorBufferHandleEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDescriptorBufferBindingPushDescriptorBufferHandleEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Buffer const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, buffer );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DescriptorBufferBindingPushDescriptorBufferHandleEXT const & ) const = default;\n#else\n    bool operator==( DescriptorBufferBindingPushDescriptorBufferHandleEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( buffer == rhs.buffer );\n#  endif\n    }\n\n    bool operator!=( DescriptorBufferBindingPushDescriptorBufferHandleEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType  = StructureType::eDescriptorBufferBindingPushDescriptorBufferHandleEXT;\n    const void *                        pNext  = {};\n    VULKAN_HPP_NAMESPACE::Buffer        buffer = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDescriptorBufferBindingPushDescriptorBufferHandleEXT>\n  {\n    using Type = DescriptorBufferBindingPushDescriptorBufferHandleEXT;\n  };\n\n  struct DescriptorBufferInfo\n  {\n    using NativeType = VkDescriptorBufferInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DescriptorBufferInfo( VULKAN_HPP_NAMESPACE::Buffer     buffer_ = {},\n                                               VULKAN_HPP_NAMESPACE::DeviceSize offset_ = {},\n                                               VULKAN_HPP_NAMESPACE::DeviceSize range_  = {} ) VULKAN_HPP_NOEXCEPT\n      : buffer{ buffer_ }\n      , offset{ offset_ }\n      , range{ range_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DescriptorBufferInfo( DescriptorBufferInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DescriptorBufferInfo( VkDescriptorBufferInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DescriptorBufferInfo( *reinterpret_cast<DescriptorBufferInfo const *>( &rhs ) )\n    {\n    }\n\n    DescriptorBufferInfo & operator=( DescriptorBufferInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DescriptorBufferInfo & operator=( VkDescriptorBufferInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DescriptorBufferInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DescriptorBufferInfo & setBuffer( VULKAN_HPP_NAMESPACE::Buffer buffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      buffer = buffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorBufferInfo & setOffset( VULKAN_HPP_NAMESPACE::DeviceSize offset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      offset = offset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorBufferInfo & setRange( VULKAN_HPP_NAMESPACE::DeviceSize range_ ) VULKAN_HPP_NOEXCEPT\n    {\n      range = range_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDescriptorBufferInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDescriptorBufferInfo *>( this );\n    }\n\n    operator VkDescriptorBufferInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDescriptorBufferInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::Buffer const &, VULKAN_HPP_NAMESPACE::DeviceSize const &, VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( buffer, offset, range );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DescriptorBufferInfo const & ) const = default;\n#else\n    bool operator==( DescriptorBufferInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( buffer == rhs.buffer ) && ( offset == rhs.offset ) && ( range == rhs.range );\n#  endif\n    }\n\n    bool operator!=( DescriptorBufferInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::Buffer     buffer = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize offset = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize range  = {};\n  };\n\n  struct DescriptorImageInfo\n  {\n    using NativeType = VkDescriptorImageInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      DescriptorImageInfo( VULKAN_HPP_NAMESPACE::Sampler     sampler_     = {},\n                           VULKAN_HPP_NAMESPACE::ImageView   imageView_   = {},\n                           VULKAN_HPP_NAMESPACE::ImageLayout imageLayout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined ) VULKAN_HPP_NOEXCEPT\n      : sampler{ sampler_ }\n      , imageView{ imageView_ }\n      , imageLayout{ imageLayout_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DescriptorImageInfo( DescriptorImageInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DescriptorImageInfo( VkDescriptorImageInfo const & rhs ) VULKAN_HPP_NOEXCEPT : DescriptorImageInfo( *reinterpret_cast<DescriptorImageInfo const *>( &rhs ) )\n    {\n    }\n\n    DescriptorImageInfo & operator=( DescriptorImageInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DescriptorImageInfo & operator=( VkDescriptorImageInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DescriptorImageInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DescriptorImageInfo & setSampler( VULKAN_HPP_NAMESPACE::Sampler sampler_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sampler = sampler_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorImageInfo & setImageView( VULKAN_HPP_NAMESPACE::ImageView imageView_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageView = imageView_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorImageInfo & setImageLayout( VULKAN_HPP_NAMESPACE::ImageLayout imageLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageLayout = imageLayout_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDescriptorImageInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDescriptorImageInfo *>( this );\n    }\n\n    operator VkDescriptorImageInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDescriptorImageInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::Sampler const &, VULKAN_HPP_NAMESPACE::ImageView const &, VULKAN_HPP_NAMESPACE::ImageLayout const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sampler, imageView, imageLayout );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DescriptorImageInfo const & ) const = default;\n#else\n    bool operator==( DescriptorImageInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sampler == rhs.sampler ) && ( imageView == rhs.imageView ) && ( imageLayout == rhs.imageLayout );\n#  endif\n    }\n\n    bool operator!=( DescriptorImageInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::Sampler     sampler     = {};\n    VULKAN_HPP_NAMESPACE::ImageView   imageView   = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout imageLayout = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n  };\n\n  union DescriptorDataEXT\n  {\n    using NativeType = VkDescriptorDataEXT;\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorDataEXT( const VULKAN_HPP_NAMESPACE::Sampler * pSampler_ = {} ) : pSampler( pSampler_ ) {}\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorDataEXT( const VULKAN_HPP_NAMESPACE::DescriptorImageInfo * pDescriptorImageInfo_ )\n      : pCombinedImageSampler( pDescriptorImageInfo_ )\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorDataEXT( const VULKAN_HPP_NAMESPACE::DescriptorAddressInfoEXT * pDescriptorAddressInfoEXT_ )\n      : pUniformTexelBuffer( pDescriptorAddressInfoEXT_ )\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorDataEXT( VULKAN_HPP_NAMESPACE::DeviceAddress accelerationStructure_ ) : accelerationStructure( accelerationStructure_ ) {}\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_UNION_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DescriptorDataEXT & setPSampler( const VULKAN_HPP_NAMESPACE::Sampler * pSampler_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSampler = pSampler_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorDataEXT &\n      setPCombinedImageSampler( const VULKAN_HPP_NAMESPACE::DescriptorImageInfo * pCombinedImageSampler_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pCombinedImageSampler = pCombinedImageSampler_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorDataEXT &\n      setPInputAttachmentImage( const VULKAN_HPP_NAMESPACE::DescriptorImageInfo * pInputAttachmentImage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pInputAttachmentImage = pInputAttachmentImage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorDataEXT & setPSampledImage( const VULKAN_HPP_NAMESPACE::DescriptorImageInfo * pSampledImage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSampledImage = pSampledImage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorDataEXT & setPStorageImage( const VULKAN_HPP_NAMESPACE::DescriptorImageInfo * pStorageImage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStorageImage = pStorageImage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorDataEXT &\n      setPUniformTexelBuffer( const VULKAN_HPP_NAMESPACE::DescriptorAddressInfoEXT * pUniformTexelBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pUniformTexelBuffer = pUniformTexelBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorDataEXT &\n      setPStorageTexelBuffer( const VULKAN_HPP_NAMESPACE::DescriptorAddressInfoEXT * pStorageTexelBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStorageTexelBuffer = pStorageTexelBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorDataEXT & setPUniformBuffer( const VULKAN_HPP_NAMESPACE::DescriptorAddressInfoEXT * pUniformBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pUniformBuffer = pUniformBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorDataEXT & setPStorageBuffer( const VULKAN_HPP_NAMESPACE::DescriptorAddressInfoEXT * pStorageBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStorageBuffer = pStorageBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorDataEXT & setAccelerationStructure( VULKAN_HPP_NAMESPACE::DeviceAddress accelerationStructure_ ) VULKAN_HPP_NOEXCEPT\n    {\n      accelerationStructure = accelerationStructure_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDescriptorDataEXT const &() const\n    {\n      return *reinterpret_cast<const VkDescriptorDataEXT *>( this );\n    }\n\n    operator VkDescriptorDataEXT &()\n    {\n      return *reinterpret_cast<VkDescriptorDataEXT *>( this );\n    }\n\n#ifdef VULKAN_HPP_HAS_UNRESTRICTED_UNIONS\n    const VULKAN_HPP_NAMESPACE::Sampler *                  pSampler;\n    const VULKAN_HPP_NAMESPACE::DescriptorImageInfo *      pCombinedImageSampler;\n    const VULKAN_HPP_NAMESPACE::DescriptorImageInfo *      pInputAttachmentImage;\n    const VULKAN_HPP_NAMESPACE::DescriptorImageInfo *      pSampledImage;\n    const VULKAN_HPP_NAMESPACE::DescriptorImageInfo *      pStorageImage;\n    const VULKAN_HPP_NAMESPACE::DescriptorAddressInfoEXT * pUniformTexelBuffer;\n    const VULKAN_HPP_NAMESPACE::DescriptorAddressInfoEXT * pStorageTexelBuffer;\n    const VULKAN_HPP_NAMESPACE::DescriptorAddressInfoEXT * pUniformBuffer;\n    const VULKAN_HPP_NAMESPACE::DescriptorAddressInfoEXT * pStorageBuffer;\n    VULKAN_HPP_NAMESPACE::DeviceAddress                    accelerationStructure;\n#else\n    const VkSampler *                  pSampler;\n    const VkDescriptorImageInfo *      pCombinedImageSampler;\n    const VkDescriptorImageInfo *      pInputAttachmentImage;\n    const VkDescriptorImageInfo *      pSampledImage;\n    const VkDescriptorImageInfo *      pStorageImage;\n    const VkDescriptorAddressInfoEXT * pUniformTexelBuffer;\n    const VkDescriptorAddressInfoEXT * pStorageTexelBuffer;\n    const VkDescriptorAddressInfoEXT * pUniformBuffer;\n    const VkDescriptorAddressInfoEXT * pStorageBuffer;\n    VkDeviceAddress                    accelerationStructure;\n#endif /*VULKAN_HPP_HAS_UNRESTRICTED_UNIONS*/\n  };\n\n  struct DescriptorGetInfoEXT\n  {\n    using NativeType = VkDescriptorGetInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDescriptorGetInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 DescriptorGetInfoEXT( VULKAN_HPP_NAMESPACE::DescriptorType    type_  = VULKAN_HPP_NAMESPACE::DescriptorType::eSampler,\n                                                  VULKAN_HPP_NAMESPACE::DescriptorDataEXT data_  = {},\n                                                  const void *                            pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , type{ type_ }\n      , data{ data_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorGetInfoEXT( DescriptorGetInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DescriptorGetInfoEXT( VkDescriptorGetInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DescriptorGetInfoEXT( *reinterpret_cast<DescriptorGetInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    DescriptorGetInfoEXT & operator=( DescriptorGetInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DescriptorGetInfoEXT & operator=( VkDescriptorGetInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DescriptorGetInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DescriptorGetInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorGetInfoEXT & setType( VULKAN_HPP_NAMESPACE::DescriptorType type_ ) VULKAN_HPP_NOEXCEPT\n    {\n      type = type_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorGetInfoEXT & setData( VULKAN_HPP_NAMESPACE::DescriptorDataEXT const & data_ ) VULKAN_HPP_NOEXCEPT\n    {\n      data = data_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDescriptorGetInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDescriptorGetInfoEXT *>( this );\n    }\n\n    operator VkDescriptorGetInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDescriptorGetInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DescriptorType const &,\n               VULKAN_HPP_NAMESPACE::DescriptorDataEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, type, data );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType     sType = StructureType::eDescriptorGetInfoEXT;\n    const void *                            pNext = {};\n    VULKAN_HPP_NAMESPACE::DescriptorType    type  = VULKAN_HPP_NAMESPACE::DescriptorType::eSampler;\n    VULKAN_HPP_NAMESPACE::DescriptorDataEXT data  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDescriptorGetInfoEXT>\n  {\n    using Type = DescriptorGetInfoEXT;\n  };\n\n  struct DescriptorPoolSize\n  {\n    using NativeType = VkDescriptorPoolSize;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DescriptorPoolSize( VULKAN_HPP_NAMESPACE::DescriptorType type_            = VULKAN_HPP_NAMESPACE::DescriptorType::eSampler,\n                                             uint32_t                             descriptorCount_ = {} ) VULKAN_HPP_NOEXCEPT\n      : type{ type_ }\n      , descriptorCount{ descriptorCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DescriptorPoolSize( DescriptorPoolSize const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DescriptorPoolSize( VkDescriptorPoolSize const & rhs ) VULKAN_HPP_NOEXCEPT : DescriptorPoolSize( *reinterpret_cast<DescriptorPoolSize const *>( &rhs ) ) {}\n\n    DescriptorPoolSize & operator=( DescriptorPoolSize const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DescriptorPoolSize & operator=( VkDescriptorPoolSize const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DescriptorPoolSize const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DescriptorPoolSize & setType( VULKAN_HPP_NAMESPACE::DescriptorType type_ ) VULKAN_HPP_NOEXCEPT\n    {\n      type = type_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorPoolSize & setDescriptorCount( uint32_t descriptorCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorCount = descriptorCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDescriptorPoolSize const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDescriptorPoolSize *>( this );\n    }\n\n    operator VkDescriptorPoolSize &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDescriptorPoolSize *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DescriptorType const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( type, descriptorCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DescriptorPoolSize const & ) const = default;\n#else\n    bool                               operator==( DescriptorPoolSize const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( type == rhs.type ) && ( descriptorCount == rhs.descriptorCount );\n#  endif\n    }\n\n    bool operator!=( DescriptorPoolSize const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DescriptorType type            = VULKAN_HPP_NAMESPACE::DescriptorType::eSampler;\n    uint32_t                             descriptorCount = {};\n  };\n\n  struct DescriptorPoolCreateInfo\n  {\n    using NativeType = VkDescriptorPoolCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDescriptorPoolCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DescriptorPoolCreateInfo( VULKAN_HPP_NAMESPACE::DescriptorPoolCreateFlags  flags_         = {},\n                                                   uint32_t                                         maxSets_       = {},\n                                                   uint32_t                                         poolSizeCount_ = {},\n                                                   const VULKAN_HPP_NAMESPACE::DescriptorPoolSize * pPoolSizes_    = {},\n                                                   const void *                                     pNext_         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , maxSets{ maxSets_ }\n      , poolSizeCount{ poolSizeCount_ }\n      , pPoolSizes{ pPoolSizes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DescriptorPoolCreateInfo( DescriptorPoolCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DescriptorPoolCreateInfo( VkDescriptorPoolCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DescriptorPoolCreateInfo( *reinterpret_cast<DescriptorPoolCreateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DescriptorPoolCreateInfo( VULKAN_HPP_NAMESPACE::DescriptorPoolCreateFlags                                                       flags_,\n                              uint32_t                                                                                              maxSets_,\n                              VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorPoolSize> const & poolSizes_,\n                              const void *                                                                                          pNext_ = nullptr )\n      : pNext( pNext_ ), flags( flags_ ), maxSets( maxSets_ ), poolSizeCount( static_cast<uint32_t>( poolSizes_.size() ) ), pPoolSizes( poolSizes_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    DescriptorPoolCreateInfo & operator=( DescriptorPoolCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DescriptorPoolCreateInfo & operator=( VkDescriptorPoolCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DescriptorPoolCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DescriptorPoolCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorPoolCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::DescriptorPoolCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorPoolCreateInfo & setMaxSets( uint32_t maxSets_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxSets = maxSets_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorPoolCreateInfo & setPoolSizeCount( uint32_t poolSizeCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      poolSizeCount = poolSizeCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorPoolCreateInfo & setPPoolSizes( const VULKAN_HPP_NAMESPACE::DescriptorPoolSize * pPoolSizes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPoolSizes = pPoolSizes_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DescriptorPoolCreateInfo &\n      setPoolSizes( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorPoolSize> const & poolSizes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      poolSizeCount = static_cast<uint32_t>( poolSizes_.size() );\n      pPoolSizes    = poolSizes_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDescriptorPoolCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDescriptorPoolCreateInfo *>( this );\n    }\n\n    operator VkDescriptorPoolCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDescriptorPoolCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DescriptorPoolCreateFlags const &,\n               uint32_t const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::DescriptorPoolSize * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, maxSets, poolSizeCount, pPoolSizes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DescriptorPoolCreateInfo const & ) const = default;\n#else\n    bool operator==( DescriptorPoolCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( maxSets == rhs.maxSets ) &&\n             ( poolSizeCount == rhs.poolSizeCount ) && ( pPoolSizes == rhs.pPoolSizes );\n#  endif\n    }\n\n    bool operator!=( DescriptorPoolCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType              sType         = StructureType::eDescriptorPoolCreateInfo;\n    const void *                                     pNext         = {};\n    VULKAN_HPP_NAMESPACE::DescriptorPoolCreateFlags  flags         = {};\n    uint32_t                                         maxSets       = {};\n    uint32_t                                         poolSizeCount = {};\n    const VULKAN_HPP_NAMESPACE::DescriptorPoolSize * pPoolSizes    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDescriptorPoolCreateInfo>\n  {\n    using Type = DescriptorPoolCreateInfo;\n  };\n\n  struct DescriptorPoolInlineUniformBlockCreateInfo\n  {\n    using NativeType = VkDescriptorPoolInlineUniformBlockCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDescriptorPoolInlineUniformBlockCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DescriptorPoolInlineUniformBlockCreateInfo( uint32_t     maxInlineUniformBlockBindings_ = {},\n                                                                     const void * pNext_                         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxInlineUniformBlockBindings{ maxInlineUniformBlockBindings_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DescriptorPoolInlineUniformBlockCreateInfo( DescriptorPoolInlineUniformBlockCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DescriptorPoolInlineUniformBlockCreateInfo( VkDescriptorPoolInlineUniformBlockCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DescriptorPoolInlineUniformBlockCreateInfo( *reinterpret_cast<DescriptorPoolInlineUniformBlockCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    DescriptorPoolInlineUniformBlockCreateInfo & operator=( DescriptorPoolInlineUniformBlockCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DescriptorPoolInlineUniformBlockCreateInfo & operator=( VkDescriptorPoolInlineUniformBlockCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DescriptorPoolInlineUniformBlockCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DescriptorPoolInlineUniformBlockCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorPoolInlineUniformBlockCreateInfo &\n      setMaxInlineUniformBlockBindings( uint32_t maxInlineUniformBlockBindings_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxInlineUniformBlockBindings = maxInlineUniformBlockBindings_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDescriptorPoolInlineUniformBlockCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDescriptorPoolInlineUniformBlockCreateInfo *>( this );\n    }\n\n    operator VkDescriptorPoolInlineUniformBlockCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDescriptorPoolInlineUniformBlockCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxInlineUniformBlockBindings );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DescriptorPoolInlineUniformBlockCreateInfo const & ) const = default;\n#else\n    bool operator==( DescriptorPoolInlineUniformBlockCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxInlineUniformBlockBindings == rhs.maxInlineUniformBlockBindings );\n#  endif\n    }\n\n    bool operator!=( DescriptorPoolInlineUniformBlockCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                         = StructureType::eDescriptorPoolInlineUniformBlockCreateInfo;\n    const void *                        pNext                         = {};\n    uint32_t                            maxInlineUniformBlockBindings = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDescriptorPoolInlineUniformBlockCreateInfo>\n  {\n    using Type = DescriptorPoolInlineUniformBlockCreateInfo;\n  };\n\n  using DescriptorPoolInlineUniformBlockCreateInfoEXT = DescriptorPoolInlineUniformBlockCreateInfo;\n\n  struct DescriptorSetAllocateInfo\n  {\n    using NativeType = VkDescriptorSetAllocateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDescriptorSetAllocateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DescriptorSetAllocateInfo( VULKAN_HPP_NAMESPACE::DescriptorPool              descriptorPool_     = {},\n                                                    uint32_t                                          descriptorSetCount_ = {},\n                                                    const VULKAN_HPP_NAMESPACE::DescriptorSetLayout * pSetLayouts_        = {},\n                                                    const void *                                      pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , descriptorPool{ descriptorPool_ }\n      , descriptorSetCount{ descriptorSetCount_ }\n      , pSetLayouts{ pSetLayouts_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DescriptorSetAllocateInfo( DescriptorSetAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DescriptorSetAllocateInfo( VkDescriptorSetAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DescriptorSetAllocateInfo( *reinterpret_cast<DescriptorSetAllocateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DescriptorSetAllocateInfo( VULKAN_HPP_NAMESPACE::DescriptorPool                                                                   descriptorPool_,\n                               VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorSetLayout> const & setLayouts_,\n                               const void *                                                                                           pNext_ = nullptr )\n      : pNext( pNext_ ), descriptorPool( descriptorPool_ ), descriptorSetCount( static_cast<uint32_t>( setLayouts_.size() ) ), pSetLayouts( setLayouts_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    DescriptorSetAllocateInfo & operator=( DescriptorSetAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DescriptorSetAllocateInfo & operator=( VkDescriptorSetAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetAllocateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetAllocateInfo & setDescriptorPool( VULKAN_HPP_NAMESPACE::DescriptorPool descriptorPool_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorPool = descriptorPool_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetAllocateInfo & setDescriptorSetCount( uint32_t descriptorSetCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorSetCount = descriptorSetCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetAllocateInfo & setPSetLayouts( const VULKAN_HPP_NAMESPACE::DescriptorSetLayout * pSetLayouts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSetLayouts = pSetLayouts_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DescriptorSetAllocateInfo &\n      setSetLayouts( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorSetLayout> const & setLayouts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorSetCount = static_cast<uint32_t>( setLayouts_.size() );\n      pSetLayouts        = setLayouts_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDescriptorSetAllocateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDescriptorSetAllocateInfo *>( this );\n    }\n\n    operator VkDescriptorSetAllocateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDescriptorSetAllocateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DescriptorPool const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::DescriptorSetLayout * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, descriptorPool, descriptorSetCount, pSetLayouts );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DescriptorSetAllocateInfo const & ) const = default;\n#else\n    bool operator==( DescriptorSetAllocateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( descriptorPool == rhs.descriptorPool ) && ( descriptorSetCount == rhs.descriptorSetCount ) &&\n             ( pSetLayouts == rhs.pSetLayouts );\n#  endif\n    }\n\n    bool operator!=( DescriptorSetAllocateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType              = StructureType::eDescriptorSetAllocateInfo;\n    const void *                                      pNext              = {};\n    VULKAN_HPP_NAMESPACE::DescriptorPool              descriptorPool     = {};\n    uint32_t                                          descriptorSetCount = {};\n    const VULKAN_HPP_NAMESPACE::DescriptorSetLayout * pSetLayouts        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDescriptorSetAllocateInfo>\n  {\n    using Type = DescriptorSetAllocateInfo;\n  };\n\n  struct DescriptorSetBindingReferenceVALVE\n  {\n    using NativeType = VkDescriptorSetBindingReferenceVALVE;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDescriptorSetBindingReferenceVALVE;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DescriptorSetBindingReferenceVALVE( VULKAN_HPP_NAMESPACE::DescriptorSetLayout descriptorSetLayout_ = {},\n                                                             uint32_t                                  binding_             = {},\n                                                             const void *                              pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , descriptorSetLayout{ descriptorSetLayout_ }\n      , binding{ binding_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DescriptorSetBindingReferenceVALVE( DescriptorSetBindingReferenceVALVE const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DescriptorSetBindingReferenceVALVE( VkDescriptorSetBindingReferenceVALVE const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DescriptorSetBindingReferenceVALVE( *reinterpret_cast<DescriptorSetBindingReferenceVALVE const *>( &rhs ) )\n    {\n    }\n\n    DescriptorSetBindingReferenceVALVE & operator=( DescriptorSetBindingReferenceVALVE const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DescriptorSetBindingReferenceVALVE & operator=( VkDescriptorSetBindingReferenceVALVE const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DescriptorSetBindingReferenceVALVE const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetBindingReferenceVALVE & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetBindingReferenceVALVE &\n      setDescriptorSetLayout( VULKAN_HPP_NAMESPACE::DescriptorSetLayout descriptorSetLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorSetLayout = descriptorSetLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetBindingReferenceVALVE & setBinding( uint32_t binding_ ) VULKAN_HPP_NOEXCEPT\n    {\n      binding = binding_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDescriptorSetBindingReferenceVALVE const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDescriptorSetBindingReferenceVALVE *>( this );\n    }\n\n    operator VkDescriptorSetBindingReferenceVALVE &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDescriptorSetBindingReferenceVALVE *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::DescriptorSetLayout const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, descriptorSetLayout, binding );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DescriptorSetBindingReferenceVALVE const & ) const = default;\n#else\n    bool operator==( DescriptorSetBindingReferenceVALVE const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( descriptorSetLayout == rhs.descriptorSetLayout ) && ( binding == rhs.binding );\n#  endif\n    }\n\n    bool operator!=( DescriptorSetBindingReferenceVALVE const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType               = StructureType::eDescriptorSetBindingReferenceVALVE;\n    const void *                              pNext               = {};\n    VULKAN_HPP_NAMESPACE::DescriptorSetLayout descriptorSetLayout = {};\n    uint32_t                                  binding             = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDescriptorSetBindingReferenceVALVE>\n  {\n    using Type = DescriptorSetBindingReferenceVALVE;\n  };\n\n  struct DescriptorSetLayoutBinding\n  {\n    using NativeType = VkDescriptorSetLayoutBinding;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DescriptorSetLayoutBinding( uint32_t                               binding_         = {},\n                                                     VULKAN_HPP_NAMESPACE::DescriptorType   descriptorType_  = VULKAN_HPP_NAMESPACE::DescriptorType::eSampler,\n                                                     uint32_t                               descriptorCount_ = {},\n                                                     VULKAN_HPP_NAMESPACE::ShaderStageFlags stageFlags_      = {},\n                                                     const VULKAN_HPP_NAMESPACE::Sampler *  pImmutableSamplers_ = {} ) VULKAN_HPP_NOEXCEPT\n      : binding{ binding_ }\n      , descriptorType{ descriptorType_ }\n      , descriptorCount{ descriptorCount_ }\n      , stageFlags{ stageFlags_ }\n      , pImmutableSamplers{ pImmutableSamplers_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DescriptorSetLayoutBinding( DescriptorSetLayoutBinding const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DescriptorSetLayoutBinding( VkDescriptorSetLayoutBinding const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DescriptorSetLayoutBinding( *reinterpret_cast<DescriptorSetLayoutBinding const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DescriptorSetLayoutBinding( uint32_t                                                                                   binding_,\n                                VULKAN_HPP_NAMESPACE::DescriptorType                                                       descriptorType_,\n                                VULKAN_HPP_NAMESPACE::ShaderStageFlags                                                     stageFlags_,\n                                VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Sampler> const & immutableSamplers_ )\n      : binding( binding_ )\n      , descriptorType( descriptorType_ )\n      , descriptorCount( static_cast<uint32_t>( immutableSamplers_.size() ) )\n      , stageFlags( stageFlags_ )\n      , pImmutableSamplers( immutableSamplers_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    DescriptorSetLayoutBinding & operator=( DescriptorSetLayoutBinding const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DescriptorSetLayoutBinding & operator=( VkDescriptorSetLayoutBinding const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutBinding const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetLayoutBinding & setBinding( uint32_t binding_ ) VULKAN_HPP_NOEXCEPT\n    {\n      binding = binding_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetLayoutBinding & setDescriptorType( VULKAN_HPP_NAMESPACE::DescriptorType descriptorType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorType = descriptorType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetLayoutBinding & setDescriptorCount( uint32_t descriptorCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorCount = descriptorCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetLayoutBinding & setStageFlags( VULKAN_HPP_NAMESPACE::ShaderStageFlags stageFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stageFlags = stageFlags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetLayoutBinding & setPImmutableSamplers( const VULKAN_HPP_NAMESPACE::Sampler * pImmutableSamplers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pImmutableSamplers = pImmutableSamplers_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DescriptorSetLayoutBinding &\n      setImmutableSamplers( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Sampler> const & immutableSamplers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorCount    = static_cast<uint32_t>( immutableSamplers_.size() );\n      pImmutableSamplers = immutableSamplers_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDescriptorSetLayoutBinding const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDescriptorSetLayoutBinding *>( this );\n    }\n\n    operator VkDescriptorSetLayoutBinding &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDescriptorSetLayoutBinding *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &,\n               VULKAN_HPP_NAMESPACE::DescriptorType const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ShaderStageFlags const &,\n               const VULKAN_HPP_NAMESPACE::Sampler * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( binding, descriptorType, descriptorCount, stageFlags, pImmutableSamplers );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DescriptorSetLayoutBinding const & ) const = default;\n#else\n    bool operator==( DescriptorSetLayoutBinding const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( binding == rhs.binding ) && ( descriptorType == rhs.descriptorType ) && ( descriptorCount == rhs.descriptorCount ) &&\n             ( stageFlags == rhs.stageFlags ) && ( pImmutableSamplers == rhs.pImmutableSamplers );\n#  endif\n    }\n\n    bool operator!=( DescriptorSetLayoutBinding const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                               binding            = {};\n    VULKAN_HPP_NAMESPACE::DescriptorType   descriptorType     = VULKAN_HPP_NAMESPACE::DescriptorType::eSampler;\n    uint32_t                               descriptorCount    = {};\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags stageFlags         = {};\n    const VULKAN_HPP_NAMESPACE::Sampler *  pImmutableSamplers = {};\n  };\n\n  struct DescriptorSetLayoutBindingFlagsCreateInfo\n  {\n    using NativeType = VkDescriptorSetLayoutBindingFlagsCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDescriptorSetLayoutBindingFlagsCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DescriptorSetLayoutBindingFlagsCreateInfo( uint32_t                                             bindingCount_  = {},\n                                                                    const VULKAN_HPP_NAMESPACE::DescriptorBindingFlags * pBindingFlags_ = {},\n                                                                    const void *                                         pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , bindingCount{ bindingCount_ }\n      , pBindingFlags{ pBindingFlags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DescriptorSetLayoutBindingFlagsCreateInfo( DescriptorSetLayoutBindingFlagsCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DescriptorSetLayoutBindingFlagsCreateInfo( VkDescriptorSetLayoutBindingFlagsCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DescriptorSetLayoutBindingFlagsCreateInfo( *reinterpret_cast<DescriptorSetLayoutBindingFlagsCreateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DescriptorSetLayoutBindingFlagsCreateInfo(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorBindingFlags> const & bindingFlags_, const void * pNext_ = nullptr )\n      : pNext( pNext_ ), bindingCount( static_cast<uint32_t>( bindingFlags_.size() ) ), pBindingFlags( bindingFlags_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    DescriptorSetLayoutBindingFlagsCreateInfo & operator=( DescriptorSetLayoutBindingFlagsCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DescriptorSetLayoutBindingFlagsCreateInfo & operator=( VkDescriptorSetLayoutBindingFlagsCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutBindingFlagsCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetLayoutBindingFlagsCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetLayoutBindingFlagsCreateInfo & setBindingCount( uint32_t bindingCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bindingCount = bindingCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetLayoutBindingFlagsCreateInfo &\n      setPBindingFlags( const VULKAN_HPP_NAMESPACE::DescriptorBindingFlags * pBindingFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pBindingFlags = pBindingFlags_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DescriptorSetLayoutBindingFlagsCreateInfo & setBindingFlags(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorBindingFlags> const & bindingFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bindingCount  = static_cast<uint32_t>( bindingFlags_.size() );\n      pBindingFlags = bindingFlags_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDescriptorSetLayoutBindingFlagsCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDescriptorSetLayoutBindingFlagsCreateInfo *>( this );\n    }\n\n    operator VkDescriptorSetLayoutBindingFlagsCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDescriptorSetLayoutBindingFlagsCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::\n      tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::DescriptorBindingFlags * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, bindingCount, pBindingFlags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DescriptorSetLayoutBindingFlagsCreateInfo const & ) const = default;\n#else\n    bool operator==( DescriptorSetLayoutBindingFlagsCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( bindingCount == rhs.bindingCount ) && ( pBindingFlags == rhs.pBindingFlags );\n#  endif\n    }\n\n    bool operator!=( DescriptorSetLayoutBindingFlagsCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                  sType         = StructureType::eDescriptorSetLayoutBindingFlagsCreateInfo;\n    const void *                                         pNext         = {};\n    uint32_t                                             bindingCount  = {};\n    const VULKAN_HPP_NAMESPACE::DescriptorBindingFlags * pBindingFlags = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDescriptorSetLayoutBindingFlagsCreateInfo>\n  {\n    using Type = DescriptorSetLayoutBindingFlagsCreateInfo;\n  };\n\n  using DescriptorSetLayoutBindingFlagsCreateInfoEXT = DescriptorSetLayoutBindingFlagsCreateInfo;\n\n  struct DescriptorSetLayoutCreateInfo\n  {\n    using NativeType = VkDescriptorSetLayoutCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDescriptorSetLayoutCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DescriptorSetLayoutCreateInfo( VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateFlags     flags_        = {},\n                                                        uint32_t                                                 bindingCount_ = {},\n                                                        const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutBinding * pBindings_    = {},\n                                                        const void *                                             pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , bindingCount{ bindingCount_ }\n      , pBindings{ pBindings_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DescriptorSetLayoutCreateInfo( DescriptorSetLayoutCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DescriptorSetLayoutCreateInfo( VkDescriptorSetLayoutCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DescriptorSetLayoutCreateInfo( *reinterpret_cast<DescriptorSetLayoutCreateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DescriptorSetLayoutCreateInfo( VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateFlags                                                          flags_,\n                                   VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutBinding> const & bindings_,\n                                   const void * pNext_ = nullptr )\n      : pNext( pNext_ ), flags( flags_ ), bindingCount( static_cast<uint32_t>( bindings_.size() ) ), pBindings( bindings_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    DescriptorSetLayoutCreateInfo & operator=( DescriptorSetLayoutCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DescriptorSetLayoutCreateInfo & operator=( VkDescriptorSetLayoutCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetLayoutCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetLayoutCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetLayoutCreateInfo & setBindingCount( uint32_t bindingCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bindingCount = bindingCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetLayoutCreateInfo &\n      setPBindings( const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutBinding * pBindings_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pBindings = pBindings_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DescriptorSetLayoutCreateInfo &\n      setBindings( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutBinding> const & bindings_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bindingCount = static_cast<uint32_t>( bindings_.size() );\n      pBindings    = bindings_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDescriptorSetLayoutCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>( this );\n    }\n\n    operator VkDescriptorSetLayoutCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDescriptorSetLayoutCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateFlags const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutBinding * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, bindingCount, pBindings );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DescriptorSetLayoutCreateInfo const & ) const = default;\n#else\n    bool operator==( DescriptorSetLayoutCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( bindingCount == rhs.bindingCount ) &&\n             ( pBindings == rhs.pBindings );\n#  endif\n    }\n\n    bool operator!=( DescriptorSetLayoutCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                      sType        = StructureType::eDescriptorSetLayoutCreateInfo;\n    const void *                                             pNext        = {};\n    VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateFlags     flags        = {};\n    uint32_t                                                 bindingCount = {};\n    const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutBinding * pBindings    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDescriptorSetLayoutCreateInfo>\n  {\n    using Type = DescriptorSetLayoutCreateInfo;\n  };\n\n  struct DescriptorSetLayoutHostMappingInfoVALVE\n  {\n    using NativeType = VkDescriptorSetLayoutHostMappingInfoVALVE;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDescriptorSetLayoutHostMappingInfoVALVE;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      DescriptorSetLayoutHostMappingInfoVALVE( size_t descriptorOffset_ = {}, uint32_t descriptorSize_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , descriptorOffset{ descriptorOffset_ }\n      , descriptorSize{ descriptorSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DescriptorSetLayoutHostMappingInfoVALVE( DescriptorSetLayoutHostMappingInfoVALVE const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DescriptorSetLayoutHostMappingInfoVALVE( VkDescriptorSetLayoutHostMappingInfoVALVE const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DescriptorSetLayoutHostMappingInfoVALVE( *reinterpret_cast<DescriptorSetLayoutHostMappingInfoVALVE const *>( &rhs ) )\n    {\n    }\n\n    DescriptorSetLayoutHostMappingInfoVALVE & operator=( DescriptorSetLayoutHostMappingInfoVALVE const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DescriptorSetLayoutHostMappingInfoVALVE & operator=( VkDescriptorSetLayoutHostMappingInfoVALVE const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutHostMappingInfoVALVE const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetLayoutHostMappingInfoVALVE & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetLayoutHostMappingInfoVALVE & setDescriptorOffset( size_t descriptorOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorOffset = descriptorOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetLayoutHostMappingInfoVALVE & setDescriptorSize( uint32_t descriptorSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorSize = descriptorSize_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDescriptorSetLayoutHostMappingInfoVALVE const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDescriptorSetLayoutHostMappingInfoVALVE *>( this );\n    }\n\n    operator VkDescriptorSetLayoutHostMappingInfoVALVE &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDescriptorSetLayoutHostMappingInfoVALVE *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, size_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, descriptorOffset, descriptorSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DescriptorSetLayoutHostMappingInfoVALVE const & ) const = default;\n#else\n    bool operator==( DescriptorSetLayoutHostMappingInfoVALVE const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( descriptorOffset == rhs.descriptorOffset ) && ( descriptorSize == rhs.descriptorSize );\n#  endif\n    }\n\n    bool operator!=( DescriptorSetLayoutHostMappingInfoVALVE const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType            = StructureType::eDescriptorSetLayoutHostMappingInfoVALVE;\n    void *                              pNext            = {};\n    size_t                              descriptorOffset = {};\n    uint32_t                            descriptorSize   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDescriptorSetLayoutHostMappingInfoVALVE>\n  {\n    using Type = DescriptorSetLayoutHostMappingInfoVALVE;\n  };\n\n  struct DescriptorSetLayoutSupport\n  {\n    using NativeType = VkDescriptorSetLayoutSupport;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDescriptorSetLayoutSupport;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DescriptorSetLayoutSupport( VULKAN_HPP_NAMESPACE::Bool32 supported_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , supported{ supported_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DescriptorSetLayoutSupport( DescriptorSetLayoutSupport const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DescriptorSetLayoutSupport( VkDescriptorSetLayoutSupport const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DescriptorSetLayoutSupport( *reinterpret_cast<DescriptorSetLayoutSupport const *>( &rhs ) )\n    {\n    }\n\n    DescriptorSetLayoutSupport & operator=( DescriptorSetLayoutSupport const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DescriptorSetLayoutSupport & operator=( VkDescriptorSetLayoutSupport const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport const *>( &rhs );\n      return *this;\n    }\n\n    operator VkDescriptorSetLayoutSupport const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDescriptorSetLayoutSupport *>( this );\n    }\n\n    operator VkDescriptorSetLayoutSupport &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDescriptorSetLayoutSupport *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, supported );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DescriptorSetLayoutSupport const & ) const = default;\n#else\n    bool operator==( DescriptorSetLayoutSupport const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( supported == rhs.supported );\n#  endif\n    }\n\n    bool operator!=( DescriptorSetLayoutSupport const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType     = StructureType::eDescriptorSetLayoutSupport;\n    void *                              pNext     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        supported = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDescriptorSetLayoutSupport>\n  {\n    using Type = DescriptorSetLayoutSupport;\n  };\n\n  using DescriptorSetLayoutSupportKHR = DescriptorSetLayoutSupport;\n\n  struct DescriptorSetVariableDescriptorCountAllocateInfo\n  {\n    using NativeType = VkDescriptorSetVariableDescriptorCountAllocateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDescriptorSetVariableDescriptorCountAllocateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DescriptorSetVariableDescriptorCountAllocateInfo( uint32_t         descriptorSetCount_ = {},\n                                                                           const uint32_t * pDescriptorCounts_  = {},\n                                                                           const void *     pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , descriptorSetCount{ descriptorSetCount_ }\n      , pDescriptorCounts{ pDescriptorCounts_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      DescriptorSetVariableDescriptorCountAllocateInfo( DescriptorSetVariableDescriptorCountAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DescriptorSetVariableDescriptorCountAllocateInfo( VkDescriptorSetVariableDescriptorCountAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DescriptorSetVariableDescriptorCountAllocateInfo( *reinterpret_cast<DescriptorSetVariableDescriptorCountAllocateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DescriptorSetVariableDescriptorCountAllocateInfo( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & descriptorCounts_,\n                                                      const void *                                                          pNext_ = nullptr )\n      : pNext( pNext_ ), descriptorSetCount( static_cast<uint32_t>( descriptorCounts_.size() ) ), pDescriptorCounts( descriptorCounts_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    DescriptorSetVariableDescriptorCountAllocateInfo & operator=( DescriptorSetVariableDescriptorCountAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DescriptorSetVariableDescriptorCountAllocateInfo & operator=( VkDescriptorSetVariableDescriptorCountAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DescriptorSetVariableDescriptorCountAllocateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetVariableDescriptorCountAllocateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetVariableDescriptorCountAllocateInfo & setDescriptorSetCount( uint32_t descriptorSetCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorSetCount = descriptorSetCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorSetVariableDescriptorCountAllocateInfo & setPDescriptorCounts( const uint32_t * pDescriptorCounts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDescriptorCounts = pDescriptorCounts_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DescriptorSetVariableDescriptorCountAllocateInfo &\n      setDescriptorCounts( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & descriptorCounts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorSetCount = static_cast<uint32_t>( descriptorCounts_.size() );\n      pDescriptorCounts  = descriptorCounts_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDescriptorSetVariableDescriptorCountAllocateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDescriptorSetVariableDescriptorCountAllocateInfo *>( this );\n    }\n\n    operator VkDescriptorSetVariableDescriptorCountAllocateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDescriptorSetVariableDescriptorCountAllocateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const uint32_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, descriptorSetCount, pDescriptorCounts );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DescriptorSetVariableDescriptorCountAllocateInfo const & ) const = default;\n#else\n    bool operator==( DescriptorSetVariableDescriptorCountAllocateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( descriptorSetCount == rhs.descriptorSetCount ) &&\n             ( pDescriptorCounts == rhs.pDescriptorCounts );\n#  endif\n    }\n\n    bool operator!=( DescriptorSetVariableDescriptorCountAllocateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType              = StructureType::eDescriptorSetVariableDescriptorCountAllocateInfo;\n    const void *                        pNext              = {};\n    uint32_t                            descriptorSetCount = {};\n    const uint32_t *                    pDescriptorCounts  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDescriptorSetVariableDescriptorCountAllocateInfo>\n  {\n    using Type = DescriptorSetVariableDescriptorCountAllocateInfo;\n  };\n\n  using DescriptorSetVariableDescriptorCountAllocateInfoEXT = DescriptorSetVariableDescriptorCountAllocateInfo;\n\n  struct DescriptorSetVariableDescriptorCountLayoutSupport\n  {\n    using NativeType = VkDescriptorSetVariableDescriptorCountLayoutSupport;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDescriptorSetVariableDescriptorCountLayoutSupport;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DescriptorSetVariableDescriptorCountLayoutSupport( uint32_t maxVariableDescriptorCount_ = {},\n                                                                            void *   pNext_                      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxVariableDescriptorCount{ maxVariableDescriptorCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      DescriptorSetVariableDescriptorCountLayoutSupport( DescriptorSetVariableDescriptorCountLayoutSupport const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DescriptorSetVariableDescriptorCountLayoutSupport( VkDescriptorSetVariableDescriptorCountLayoutSupport const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DescriptorSetVariableDescriptorCountLayoutSupport( *reinterpret_cast<DescriptorSetVariableDescriptorCountLayoutSupport const *>( &rhs ) )\n    {\n    }\n\n    DescriptorSetVariableDescriptorCountLayoutSupport &\n      operator=( DescriptorSetVariableDescriptorCountLayoutSupport const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DescriptorSetVariableDescriptorCountLayoutSupport & operator=( VkDescriptorSetVariableDescriptorCountLayoutSupport const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DescriptorSetVariableDescriptorCountLayoutSupport const *>( &rhs );\n      return *this;\n    }\n\n    operator VkDescriptorSetVariableDescriptorCountLayoutSupport const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDescriptorSetVariableDescriptorCountLayoutSupport *>( this );\n    }\n\n    operator VkDescriptorSetVariableDescriptorCountLayoutSupport &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDescriptorSetVariableDescriptorCountLayoutSupport *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxVariableDescriptorCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DescriptorSetVariableDescriptorCountLayoutSupport const & ) const = default;\n#else\n    bool operator==( DescriptorSetVariableDescriptorCountLayoutSupport const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxVariableDescriptorCount == rhs.maxVariableDescriptorCount );\n#  endif\n    }\n\n    bool operator!=( DescriptorSetVariableDescriptorCountLayoutSupport const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                      = StructureType::eDescriptorSetVariableDescriptorCountLayoutSupport;\n    void *                              pNext                      = {};\n    uint32_t                            maxVariableDescriptorCount = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDescriptorSetVariableDescriptorCountLayoutSupport>\n  {\n    using Type = DescriptorSetVariableDescriptorCountLayoutSupport;\n  };\n\n  using DescriptorSetVariableDescriptorCountLayoutSupportEXT = DescriptorSetVariableDescriptorCountLayoutSupport;\n\n  struct DescriptorUpdateTemplateEntry\n  {\n    using NativeType = VkDescriptorUpdateTemplateEntry;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DescriptorUpdateTemplateEntry( uint32_t                             dstBinding_      = {},\n                                                        uint32_t                             dstArrayElement_ = {},\n                                                        uint32_t                             descriptorCount_ = {},\n                                                        VULKAN_HPP_NAMESPACE::DescriptorType descriptorType_  = VULKAN_HPP_NAMESPACE::DescriptorType::eSampler,\n                                                        size_t                               offset_          = {},\n                                                        size_t                               stride_          = {} ) VULKAN_HPP_NOEXCEPT\n      : dstBinding{ dstBinding_ }\n      , dstArrayElement{ dstArrayElement_ }\n      , descriptorCount{ descriptorCount_ }\n      , descriptorType{ descriptorType_ }\n      , offset{ offset_ }\n      , stride{ stride_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DescriptorUpdateTemplateEntry( DescriptorUpdateTemplateEntry const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DescriptorUpdateTemplateEntry( VkDescriptorUpdateTemplateEntry const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DescriptorUpdateTemplateEntry( *reinterpret_cast<DescriptorUpdateTemplateEntry const *>( &rhs ) )\n    {\n    }\n\n    DescriptorUpdateTemplateEntry & operator=( DescriptorUpdateTemplateEntry const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DescriptorUpdateTemplateEntry & operator=( VkDescriptorUpdateTemplateEntry const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateEntry const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DescriptorUpdateTemplateEntry & setDstBinding( uint32_t dstBinding_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstBinding = dstBinding_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorUpdateTemplateEntry & setDstArrayElement( uint32_t dstArrayElement_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstArrayElement = dstArrayElement_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorUpdateTemplateEntry & setDescriptorCount( uint32_t descriptorCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorCount = descriptorCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorUpdateTemplateEntry & setDescriptorType( VULKAN_HPP_NAMESPACE::DescriptorType descriptorType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorType = descriptorType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorUpdateTemplateEntry & setOffset( size_t offset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      offset = offset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorUpdateTemplateEntry & setStride( size_t stride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stride = stride_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDescriptorUpdateTemplateEntry const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDescriptorUpdateTemplateEntry *>( this );\n    }\n\n    operator VkDescriptorUpdateTemplateEntry &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDescriptorUpdateTemplateEntry *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &, uint32_t const &, VULKAN_HPP_NAMESPACE::DescriptorType const &, size_t const &, size_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( dstBinding, dstArrayElement, descriptorCount, descriptorType, offset, stride );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DescriptorUpdateTemplateEntry const & ) const = default;\n#else\n    bool operator==( DescriptorUpdateTemplateEntry const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( dstBinding == rhs.dstBinding ) && ( dstArrayElement == rhs.dstArrayElement ) && ( descriptorCount == rhs.descriptorCount ) &&\n             ( descriptorType == rhs.descriptorType ) && ( offset == rhs.offset ) && ( stride == rhs.stride );\n#  endif\n    }\n\n    bool operator!=( DescriptorUpdateTemplateEntry const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                             dstBinding      = {};\n    uint32_t                             dstArrayElement = {};\n    uint32_t                             descriptorCount = {};\n    VULKAN_HPP_NAMESPACE::DescriptorType descriptorType  = VULKAN_HPP_NAMESPACE::DescriptorType::eSampler;\n    size_t                               offset          = {};\n    size_t                               stride          = {};\n  };\n\n  using DescriptorUpdateTemplateEntryKHR = DescriptorUpdateTemplateEntry;\n\n  struct DescriptorUpdateTemplateCreateInfo\n  {\n    using NativeType = VkDescriptorUpdateTemplateCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDescriptorUpdateTemplateCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DescriptorUpdateTemplateCreateInfo(\n      VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateFlags   flags_                      = {},\n      uint32_t                                                    descriptorUpdateEntryCount_ = {},\n      const VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateEntry * pDescriptorUpdateEntries_   = {},\n      VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateType          templateType_        = VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateType::eDescriptorSet,\n      VULKAN_HPP_NAMESPACE::DescriptorSetLayout                   descriptorSetLayout_ = {},\n      VULKAN_HPP_NAMESPACE::PipelineBindPoint                     pipelineBindPoint_   = VULKAN_HPP_NAMESPACE::PipelineBindPoint::eGraphics,\n      VULKAN_HPP_NAMESPACE::PipelineLayout                        pipelineLayout_      = {},\n      uint32_t                                                    set_                 = {},\n      const void *                                                pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , descriptorUpdateEntryCount{ descriptorUpdateEntryCount_ }\n      , pDescriptorUpdateEntries{ pDescriptorUpdateEntries_ }\n      , templateType{ templateType_ }\n      , descriptorSetLayout{ descriptorSetLayout_ }\n      , pipelineBindPoint{ pipelineBindPoint_ }\n      , pipelineLayout{ pipelineLayout_ }\n      , set{ set_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DescriptorUpdateTemplateCreateInfo( DescriptorUpdateTemplateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DescriptorUpdateTemplateCreateInfo( VkDescriptorUpdateTemplateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DescriptorUpdateTemplateCreateInfo( *reinterpret_cast<DescriptorUpdateTemplateCreateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DescriptorUpdateTemplateCreateInfo(\n      VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateFlags                                                        flags_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateEntry> const & descriptorUpdateEntries_,\n      VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateType templateType_        = VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateType::eDescriptorSet,\n      VULKAN_HPP_NAMESPACE::DescriptorSetLayout          descriptorSetLayout_ = {},\n      VULKAN_HPP_NAMESPACE::PipelineBindPoint            pipelineBindPoint_   = VULKAN_HPP_NAMESPACE::PipelineBindPoint::eGraphics,\n      VULKAN_HPP_NAMESPACE::PipelineLayout               pipelineLayout_      = {},\n      uint32_t                                           set_                 = {},\n      const void *                                       pNext_               = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , descriptorUpdateEntryCount( static_cast<uint32_t>( descriptorUpdateEntries_.size() ) )\n      , pDescriptorUpdateEntries( descriptorUpdateEntries_.data() )\n      , templateType( templateType_ )\n      , descriptorSetLayout( descriptorSetLayout_ )\n      , pipelineBindPoint( pipelineBindPoint_ )\n      , pipelineLayout( pipelineLayout_ )\n      , set( set_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    DescriptorUpdateTemplateCreateInfo & operator=( DescriptorUpdateTemplateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DescriptorUpdateTemplateCreateInfo & operator=( VkDescriptorUpdateTemplateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DescriptorUpdateTemplateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorUpdateTemplateCreateInfo &\n      setFlags( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorUpdateTemplateCreateInfo & setDescriptorUpdateEntryCount( uint32_t descriptorUpdateEntryCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorUpdateEntryCount = descriptorUpdateEntryCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorUpdateTemplateCreateInfo &\n      setPDescriptorUpdateEntries( const VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateEntry * pDescriptorUpdateEntries_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDescriptorUpdateEntries = pDescriptorUpdateEntries_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DescriptorUpdateTemplateCreateInfo & setDescriptorUpdateEntries(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateEntry> const & descriptorUpdateEntries_ )\n      VULKAN_HPP_NOEXCEPT\n    {\n      descriptorUpdateEntryCount = static_cast<uint32_t>( descriptorUpdateEntries_.size() );\n      pDescriptorUpdateEntries   = descriptorUpdateEntries_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorUpdateTemplateCreateInfo &\n      setTemplateType( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateType templateType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      templateType = templateType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorUpdateTemplateCreateInfo &\n      setDescriptorSetLayout( VULKAN_HPP_NAMESPACE::DescriptorSetLayout descriptorSetLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorSetLayout = descriptorSetLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorUpdateTemplateCreateInfo &\n      setPipelineBindPoint( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineBindPoint = pipelineBindPoint_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorUpdateTemplateCreateInfo & setPipelineLayout( VULKAN_HPP_NAMESPACE::PipelineLayout pipelineLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineLayout = pipelineLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DescriptorUpdateTemplateCreateInfo & setSet( uint32_t set_ ) VULKAN_HPP_NOEXCEPT\n    {\n      set = set_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDescriptorUpdateTemplateCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDescriptorUpdateTemplateCreateInfo *>( this );\n    }\n\n    operator VkDescriptorUpdateTemplateCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDescriptorUpdateTemplateCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateFlags const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateEntry * const &,\n               VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateType const &,\n               VULKAN_HPP_NAMESPACE::DescriptorSetLayout const &,\n               VULKAN_HPP_NAMESPACE::PipelineBindPoint const &,\n               VULKAN_HPP_NAMESPACE::PipelineLayout const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie(\n        sType, pNext, flags, descriptorUpdateEntryCount, pDescriptorUpdateEntries, templateType, descriptorSetLayout, pipelineBindPoint, pipelineLayout, set );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DescriptorUpdateTemplateCreateInfo const & ) const = default;\n#else\n    bool operator==( DescriptorUpdateTemplateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( descriptorUpdateEntryCount == rhs.descriptorUpdateEntryCount ) &&\n             ( pDescriptorUpdateEntries == rhs.pDescriptorUpdateEntries ) && ( templateType == rhs.templateType ) &&\n             ( descriptorSetLayout == rhs.descriptorSetLayout ) && ( pipelineBindPoint == rhs.pipelineBindPoint ) && ( pipelineLayout == rhs.pipelineLayout ) &&\n             ( set == rhs.set );\n#  endif\n    }\n\n    bool operator!=( DescriptorUpdateTemplateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                         sType                      = StructureType::eDescriptorUpdateTemplateCreateInfo;\n    const void *                                                pNext                      = {};\n    VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateFlags   flags                      = {};\n    uint32_t                                                    descriptorUpdateEntryCount = {};\n    const VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateEntry * pDescriptorUpdateEntries   = {};\n    VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateType          templateType               = VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateType::eDescriptorSet;\n    VULKAN_HPP_NAMESPACE::DescriptorSetLayout                   descriptorSetLayout        = {};\n    VULKAN_HPP_NAMESPACE::PipelineBindPoint                     pipelineBindPoint          = VULKAN_HPP_NAMESPACE::PipelineBindPoint::eGraphics;\n    VULKAN_HPP_NAMESPACE::PipelineLayout                        pipelineLayout             = {};\n    uint32_t                                                    set                        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDescriptorUpdateTemplateCreateInfo>\n  {\n    using Type = DescriptorUpdateTemplateCreateInfo;\n  };\n\n  using DescriptorUpdateTemplateCreateInfoKHR = DescriptorUpdateTemplateCreateInfo;\n\n  struct DeviceAddressBindingCallbackDataEXT\n  {\n    using NativeType = VkDeviceAddressBindingCallbackDataEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceAddressBindingCallbackDataEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DeviceAddressBindingCallbackDataEXT(\n      VULKAN_HPP_NAMESPACE::DeviceAddressBindingFlagsEXT flags_       = {},\n      VULKAN_HPP_NAMESPACE::DeviceAddress                baseAddress_ = {},\n      VULKAN_HPP_NAMESPACE::DeviceSize                   size_        = {},\n      VULKAN_HPP_NAMESPACE::DeviceAddressBindingTypeEXT  bindingType_ = VULKAN_HPP_NAMESPACE::DeviceAddressBindingTypeEXT::eBind,\n      void *                                             pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , baseAddress{ baseAddress_ }\n      , size{ size_ }\n      , bindingType{ bindingType_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceAddressBindingCallbackDataEXT( DeviceAddressBindingCallbackDataEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceAddressBindingCallbackDataEXT( VkDeviceAddressBindingCallbackDataEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceAddressBindingCallbackDataEXT( *reinterpret_cast<DeviceAddressBindingCallbackDataEXT const *>( &rhs ) )\n    {\n    }\n\n    DeviceAddressBindingCallbackDataEXT & operator=( DeviceAddressBindingCallbackDataEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceAddressBindingCallbackDataEXT & operator=( VkDeviceAddressBindingCallbackDataEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceAddressBindingCallbackDataEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceAddressBindingCallbackDataEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceAddressBindingCallbackDataEXT & setFlags( VULKAN_HPP_NAMESPACE::DeviceAddressBindingFlagsEXT flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceAddressBindingCallbackDataEXT & setBaseAddress( VULKAN_HPP_NAMESPACE::DeviceAddress baseAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      baseAddress = baseAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceAddressBindingCallbackDataEXT & setSize( VULKAN_HPP_NAMESPACE::DeviceSize size_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size = size_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceAddressBindingCallbackDataEXT &\n      setBindingType( VULKAN_HPP_NAMESPACE::DeviceAddressBindingTypeEXT bindingType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bindingType = bindingType_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceAddressBindingCallbackDataEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceAddressBindingCallbackDataEXT *>( this );\n    }\n\n    operator VkDeviceAddressBindingCallbackDataEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceAddressBindingCallbackDataEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddressBindingFlagsEXT const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddressBindingTypeEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, baseAddress, size, bindingType );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceAddressBindingCallbackDataEXT const & ) const = default;\n#else\n    bool operator==( DeviceAddressBindingCallbackDataEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( baseAddress == rhs.baseAddress ) && ( size == rhs.size ) &&\n             ( bindingType == rhs.bindingType );\n#  endif\n    }\n\n    bool operator!=( DeviceAddressBindingCallbackDataEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                sType       = StructureType::eDeviceAddressBindingCallbackDataEXT;\n    void *                                             pNext       = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddressBindingFlagsEXT flags       = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress                baseAddress = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                   size        = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddressBindingTypeEXT  bindingType = VULKAN_HPP_NAMESPACE::DeviceAddressBindingTypeEXT::eBind;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceAddressBindingCallbackDataEXT>\n  {\n    using Type = DeviceAddressBindingCallbackDataEXT;\n  };\n\n  struct DeviceBufferMemoryRequirements\n  {\n    using NativeType = VkDeviceBufferMemoryRequirements;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceBufferMemoryRequirements;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DeviceBufferMemoryRequirements( const VULKAN_HPP_NAMESPACE::BufferCreateInfo * pCreateInfo_ = {},\n                                                         const void *                                   pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pCreateInfo{ pCreateInfo_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceBufferMemoryRequirements( DeviceBufferMemoryRequirements const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceBufferMemoryRequirements( VkDeviceBufferMemoryRequirements const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceBufferMemoryRequirements( *reinterpret_cast<DeviceBufferMemoryRequirements const *>( &rhs ) )\n    {\n    }\n\n    DeviceBufferMemoryRequirements & operator=( DeviceBufferMemoryRequirements const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceBufferMemoryRequirements & operator=( VkDeviceBufferMemoryRequirements const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceBufferMemoryRequirements & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceBufferMemoryRequirements & setPCreateInfo( const VULKAN_HPP_NAMESPACE::BufferCreateInfo * pCreateInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pCreateInfo = pCreateInfo_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceBufferMemoryRequirements const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceBufferMemoryRequirements *>( this );\n    }\n\n    operator VkDeviceBufferMemoryRequirements &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceBufferMemoryRequirements *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, const VULKAN_HPP_NAMESPACE::BufferCreateInfo * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pCreateInfo );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceBufferMemoryRequirements const & ) const = default;\n#else\n    bool operator==( DeviceBufferMemoryRequirements const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pCreateInfo == rhs.pCreateInfo );\n#  endif\n    }\n\n    bool operator!=( DeviceBufferMemoryRequirements const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType            sType       = StructureType::eDeviceBufferMemoryRequirements;\n    const void *                                   pNext       = {};\n    const VULKAN_HPP_NAMESPACE::BufferCreateInfo * pCreateInfo = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceBufferMemoryRequirements>\n  {\n    using Type = DeviceBufferMemoryRequirements;\n  };\n\n  using DeviceBufferMemoryRequirementsKHR = DeviceBufferMemoryRequirements;\n\n  struct DeviceQueueCreateInfo\n  {\n    using NativeType = VkDeviceQueueCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceQueueCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DeviceQueueCreateInfo( VULKAN_HPP_NAMESPACE::DeviceQueueCreateFlags flags_            = {},\n                                                uint32_t                                     queueFamilyIndex_ = {},\n                                                uint32_t                                     queueCount_       = {},\n                                                const float *                                pQueuePriorities_ = {},\n                                                const void *                                 pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , queueFamilyIndex{ queueFamilyIndex_ }\n      , queueCount{ queueCount_ }\n      , pQueuePriorities{ pQueuePriorities_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceQueueCreateInfo( DeviceQueueCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceQueueCreateInfo( VkDeviceQueueCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceQueueCreateInfo( *reinterpret_cast<DeviceQueueCreateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DeviceQueueCreateInfo( VULKAN_HPP_NAMESPACE::DeviceQueueCreateFlags                       flags_,\n                           uint32_t                                                           queueFamilyIndex_,\n                           VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const float> const & queuePriorities_,\n                           const void *                                                       pNext_ = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , queueFamilyIndex( queueFamilyIndex_ )\n      , queueCount( static_cast<uint32_t>( queuePriorities_.size() ) )\n      , pQueuePriorities( queuePriorities_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    DeviceQueueCreateInfo & operator=( DeviceQueueCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceQueueCreateInfo & operator=( VkDeviceQueueCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceQueueCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceQueueCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceQueueCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::DeviceQueueCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceQueueCreateInfo & setQueueFamilyIndex( uint32_t queueFamilyIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queueFamilyIndex = queueFamilyIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceQueueCreateInfo & setQueueCount( uint32_t queueCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queueCount = queueCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceQueueCreateInfo & setPQueuePriorities( const float * pQueuePriorities_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pQueuePriorities = pQueuePriorities_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DeviceQueueCreateInfo & setQueuePriorities( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const float> const & queuePriorities_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queueCount       = static_cast<uint32_t>( queuePriorities_.size() );\n      pQueuePriorities = queuePriorities_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceQueueCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceQueueCreateInfo *>( this );\n    }\n\n    operator VkDeviceQueueCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceQueueCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceQueueCreateFlags const &,\n               uint32_t const &,\n               uint32_t const &,\n               const float * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, queueFamilyIndex, queueCount, pQueuePriorities );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceQueueCreateInfo const & ) const = default;\n#else\n    bool operator==( DeviceQueueCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( queueFamilyIndex == rhs.queueFamilyIndex ) &&\n             ( queueCount == rhs.queueCount ) && ( pQueuePriorities == rhs.pQueuePriorities );\n#  endif\n    }\n\n    bool operator!=( DeviceQueueCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType            = StructureType::eDeviceQueueCreateInfo;\n    const void *                                 pNext            = {};\n    VULKAN_HPP_NAMESPACE::DeviceQueueCreateFlags flags            = {};\n    uint32_t                                     queueFamilyIndex = {};\n    uint32_t                                     queueCount       = {};\n    const float *                                pQueuePriorities = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceQueueCreateInfo>\n  {\n    using Type = DeviceQueueCreateInfo;\n  };\n\n  struct PhysicalDeviceFeatures\n  {\n    using NativeType = VkPhysicalDeviceFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFeatures( VULKAN_HPP_NAMESPACE::Bool32 robustBufferAccess_                      = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 fullDrawIndexUint32_                     = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 imageCubeArray_                          = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 independentBlend_                        = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 geometryShader_                          = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 tessellationShader_                      = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 sampleRateShading_                       = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 dualSrcBlend_                            = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 logicOp_                                 = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 multiDrawIndirect_                       = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 drawIndirectFirstInstance_               = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 depthClamp_                              = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 depthBiasClamp_                          = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 fillModeNonSolid_                        = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 depthBounds_                             = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 wideLines_                               = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 largePoints_                             = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 alphaToOne_                              = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 multiViewport_                           = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 samplerAnisotropy_                       = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 textureCompressionETC2_                  = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 textureCompressionASTC_LDR_              = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 textureCompressionBC_                    = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 occlusionQueryPrecise_                   = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 pipelineStatisticsQuery_                 = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 vertexPipelineStoresAndAtomics_          = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 fragmentStoresAndAtomics_                = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 shaderTessellationAndGeometryPointSize_  = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 shaderImageGatherExtended_               = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 shaderStorageImageExtendedFormats_       = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 shaderStorageImageMultisample_           = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 shaderStorageImageReadWithoutFormat_     = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 shaderStorageImageWriteWithoutFormat_    = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 shaderUniformBufferArrayDynamicIndexing_ = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 shaderSampledImageArrayDynamicIndexing_  = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 shaderStorageBufferArrayDynamicIndexing_ = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 shaderStorageImageArrayDynamicIndexing_  = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 shaderClipDistance_                      = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 shaderCullDistance_                      = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 shaderFloat64_                           = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 shaderInt64_                             = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 shaderInt16_                             = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 shaderResourceResidency_                 = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 shaderResourceMinLod_                    = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 sparseBinding_                           = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 sparseResidencyBuffer_                   = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 sparseResidencyImage2D_                  = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 sparseResidencyImage3D_                  = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 sparseResidency2Samples_                 = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 sparseResidency4Samples_                 = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 sparseResidency8Samples_                 = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 sparseResidency16Samples_                = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 sparseResidencyAliased_                  = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 variableMultisampleRate_                 = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 inheritedQueries_                        = {} ) VULKAN_HPP_NOEXCEPT\n      : robustBufferAccess{ robustBufferAccess_ }\n      , fullDrawIndexUint32{ fullDrawIndexUint32_ }\n      , imageCubeArray{ imageCubeArray_ }\n      , independentBlend{ independentBlend_ }\n      , geometryShader{ geometryShader_ }\n      , tessellationShader{ tessellationShader_ }\n      , sampleRateShading{ sampleRateShading_ }\n      , dualSrcBlend{ dualSrcBlend_ }\n      , logicOp{ logicOp_ }\n      , multiDrawIndirect{ multiDrawIndirect_ }\n      , drawIndirectFirstInstance{ drawIndirectFirstInstance_ }\n      , depthClamp{ depthClamp_ }\n      , depthBiasClamp{ depthBiasClamp_ }\n      , fillModeNonSolid{ fillModeNonSolid_ }\n      , depthBounds{ depthBounds_ }\n      , wideLines{ wideLines_ }\n      , largePoints{ largePoints_ }\n      , alphaToOne{ alphaToOne_ }\n      , multiViewport{ multiViewport_ }\n      , samplerAnisotropy{ samplerAnisotropy_ }\n      , textureCompressionETC2{ textureCompressionETC2_ }\n      , textureCompressionASTC_LDR{ textureCompressionASTC_LDR_ }\n      , textureCompressionBC{ textureCompressionBC_ }\n      , occlusionQueryPrecise{ occlusionQueryPrecise_ }\n      , pipelineStatisticsQuery{ pipelineStatisticsQuery_ }\n      , vertexPipelineStoresAndAtomics{ vertexPipelineStoresAndAtomics_ }\n      , fragmentStoresAndAtomics{ fragmentStoresAndAtomics_ }\n      , shaderTessellationAndGeometryPointSize{ shaderTessellationAndGeometryPointSize_ }\n      , shaderImageGatherExtended{ shaderImageGatherExtended_ }\n      , shaderStorageImageExtendedFormats{ shaderStorageImageExtendedFormats_ }\n      , shaderStorageImageMultisample{ shaderStorageImageMultisample_ }\n      , shaderStorageImageReadWithoutFormat{ shaderStorageImageReadWithoutFormat_ }\n      , shaderStorageImageWriteWithoutFormat{ shaderStorageImageWriteWithoutFormat_ }\n      , shaderUniformBufferArrayDynamicIndexing{ shaderUniformBufferArrayDynamicIndexing_ }\n      , shaderSampledImageArrayDynamicIndexing{ shaderSampledImageArrayDynamicIndexing_ }\n      , shaderStorageBufferArrayDynamicIndexing{ shaderStorageBufferArrayDynamicIndexing_ }\n      , shaderStorageImageArrayDynamicIndexing{ shaderStorageImageArrayDynamicIndexing_ }\n      , shaderClipDistance{ shaderClipDistance_ }\n      , shaderCullDistance{ shaderCullDistance_ }\n      , shaderFloat64{ shaderFloat64_ }\n      , shaderInt64{ shaderInt64_ }\n      , shaderInt16{ shaderInt16_ }\n      , shaderResourceResidency{ shaderResourceResidency_ }\n      , shaderResourceMinLod{ shaderResourceMinLod_ }\n      , sparseBinding{ sparseBinding_ }\n      , sparseResidencyBuffer{ sparseResidencyBuffer_ }\n      , sparseResidencyImage2D{ sparseResidencyImage2D_ }\n      , sparseResidencyImage3D{ sparseResidencyImage3D_ }\n      , sparseResidency2Samples{ sparseResidency2Samples_ }\n      , sparseResidency4Samples{ sparseResidency4Samples_ }\n      , sparseResidency8Samples{ sparseResidency8Samples_ }\n      , sparseResidency16Samples{ sparseResidency16Samples_ }\n      , sparseResidencyAliased{ sparseResidencyAliased_ }\n      , variableMultisampleRate{ variableMultisampleRate_ }\n      , inheritedQueries{ inheritedQueries_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFeatures( PhysicalDeviceFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceFeatures( VkPhysicalDeviceFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceFeatures( *reinterpret_cast<PhysicalDeviceFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceFeatures & operator=( PhysicalDeviceFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceFeatures & operator=( VkPhysicalDeviceFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setRobustBufferAccess( VULKAN_HPP_NAMESPACE::Bool32 robustBufferAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      robustBufferAccess = robustBufferAccess_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setFullDrawIndexUint32( VULKAN_HPP_NAMESPACE::Bool32 fullDrawIndexUint32_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fullDrawIndexUint32 = fullDrawIndexUint32_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setImageCubeArray( VULKAN_HPP_NAMESPACE::Bool32 imageCubeArray_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageCubeArray = imageCubeArray_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setIndependentBlend( VULKAN_HPP_NAMESPACE::Bool32 independentBlend_ ) VULKAN_HPP_NOEXCEPT\n    {\n      independentBlend = independentBlend_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setGeometryShader( VULKAN_HPP_NAMESPACE::Bool32 geometryShader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      geometryShader = geometryShader_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setTessellationShader( VULKAN_HPP_NAMESPACE::Bool32 tessellationShader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tessellationShader = tessellationShader_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setSampleRateShading( VULKAN_HPP_NAMESPACE::Bool32 sampleRateShading_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sampleRateShading = sampleRateShading_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setDualSrcBlend( VULKAN_HPP_NAMESPACE::Bool32 dualSrcBlend_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dualSrcBlend = dualSrcBlend_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setLogicOp( VULKAN_HPP_NAMESPACE::Bool32 logicOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      logicOp = logicOp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setMultiDrawIndirect( VULKAN_HPP_NAMESPACE::Bool32 multiDrawIndirect_ ) VULKAN_HPP_NOEXCEPT\n    {\n      multiDrawIndirect = multiDrawIndirect_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setDrawIndirectFirstInstance( VULKAN_HPP_NAMESPACE::Bool32 drawIndirectFirstInstance_ ) VULKAN_HPP_NOEXCEPT\n    {\n      drawIndirectFirstInstance = drawIndirectFirstInstance_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setDepthClamp( VULKAN_HPP_NAMESPACE::Bool32 depthClamp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthClamp = depthClamp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setDepthBiasClamp( VULKAN_HPP_NAMESPACE::Bool32 depthBiasClamp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthBiasClamp = depthBiasClamp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setFillModeNonSolid( VULKAN_HPP_NAMESPACE::Bool32 fillModeNonSolid_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fillModeNonSolid = fillModeNonSolid_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setDepthBounds( VULKAN_HPP_NAMESPACE::Bool32 depthBounds_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthBounds = depthBounds_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setWideLines( VULKAN_HPP_NAMESPACE::Bool32 wideLines_ ) VULKAN_HPP_NOEXCEPT\n    {\n      wideLines = wideLines_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setLargePoints( VULKAN_HPP_NAMESPACE::Bool32 largePoints_ ) VULKAN_HPP_NOEXCEPT\n    {\n      largePoints = largePoints_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setAlphaToOne( VULKAN_HPP_NAMESPACE::Bool32 alphaToOne_ ) VULKAN_HPP_NOEXCEPT\n    {\n      alphaToOne = alphaToOne_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setMultiViewport( VULKAN_HPP_NAMESPACE::Bool32 multiViewport_ ) VULKAN_HPP_NOEXCEPT\n    {\n      multiViewport = multiViewport_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setSamplerAnisotropy( VULKAN_HPP_NAMESPACE::Bool32 samplerAnisotropy_ ) VULKAN_HPP_NOEXCEPT\n    {\n      samplerAnisotropy = samplerAnisotropy_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setTextureCompressionETC2( VULKAN_HPP_NAMESPACE::Bool32 textureCompressionETC2_ ) VULKAN_HPP_NOEXCEPT\n    {\n      textureCompressionETC2 = textureCompressionETC2_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures &\n      setTextureCompressionASTC_LDR( VULKAN_HPP_NAMESPACE::Bool32 textureCompressionASTC_LDR_ ) VULKAN_HPP_NOEXCEPT\n    {\n      textureCompressionASTC_LDR = textureCompressionASTC_LDR_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setTextureCompressionBC( VULKAN_HPP_NAMESPACE::Bool32 textureCompressionBC_ ) VULKAN_HPP_NOEXCEPT\n    {\n      textureCompressionBC = textureCompressionBC_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setOcclusionQueryPrecise( VULKAN_HPP_NAMESPACE::Bool32 occlusionQueryPrecise_ ) VULKAN_HPP_NOEXCEPT\n    {\n      occlusionQueryPrecise = occlusionQueryPrecise_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setPipelineStatisticsQuery( VULKAN_HPP_NAMESPACE::Bool32 pipelineStatisticsQuery_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineStatisticsQuery = pipelineStatisticsQuery_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures &\n      setVertexPipelineStoresAndAtomics( VULKAN_HPP_NAMESPACE::Bool32 vertexPipelineStoresAndAtomics_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexPipelineStoresAndAtomics = vertexPipelineStoresAndAtomics_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setFragmentStoresAndAtomics( VULKAN_HPP_NAMESPACE::Bool32 fragmentStoresAndAtomics_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fragmentStoresAndAtomics = fragmentStoresAndAtomics_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures &\n      setShaderTessellationAndGeometryPointSize( VULKAN_HPP_NAMESPACE::Bool32 shaderTessellationAndGeometryPointSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderTessellationAndGeometryPointSize = shaderTessellationAndGeometryPointSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setShaderImageGatherExtended( VULKAN_HPP_NAMESPACE::Bool32 shaderImageGatherExtended_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderImageGatherExtended = shaderImageGatherExtended_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures &\n      setShaderStorageImageExtendedFormats( VULKAN_HPP_NAMESPACE::Bool32 shaderStorageImageExtendedFormats_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderStorageImageExtendedFormats = shaderStorageImageExtendedFormats_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures &\n      setShaderStorageImageMultisample( VULKAN_HPP_NAMESPACE::Bool32 shaderStorageImageMultisample_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderStorageImageMultisample = shaderStorageImageMultisample_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures &\n      setShaderStorageImageReadWithoutFormat( VULKAN_HPP_NAMESPACE::Bool32 shaderStorageImageReadWithoutFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderStorageImageReadWithoutFormat = shaderStorageImageReadWithoutFormat_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures &\n      setShaderStorageImageWriteWithoutFormat( VULKAN_HPP_NAMESPACE::Bool32 shaderStorageImageWriteWithoutFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderStorageImageWriteWithoutFormat = shaderStorageImageWriteWithoutFormat_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures &\n      setShaderUniformBufferArrayDynamicIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderUniformBufferArrayDynamicIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderUniformBufferArrayDynamicIndexing = shaderUniformBufferArrayDynamicIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures &\n      setShaderSampledImageArrayDynamicIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderSampledImageArrayDynamicIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSampledImageArrayDynamicIndexing = shaderSampledImageArrayDynamicIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures &\n      setShaderStorageBufferArrayDynamicIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderStorageBufferArrayDynamicIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderStorageBufferArrayDynamicIndexing = shaderStorageBufferArrayDynamicIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures &\n      setShaderStorageImageArrayDynamicIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderStorageImageArrayDynamicIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderStorageImageArrayDynamicIndexing = shaderStorageImageArrayDynamicIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setShaderClipDistance( VULKAN_HPP_NAMESPACE::Bool32 shaderClipDistance_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderClipDistance = shaderClipDistance_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setShaderCullDistance( VULKAN_HPP_NAMESPACE::Bool32 shaderCullDistance_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderCullDistance = shaderCullDistance_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setShaderFloat64( VULKAN_HPP_NAMESPACE::Bool32 shaderFloat64_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderFloat64 = shaderFloat64_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setShaderInt64( VULKAN_HPP_NAMESPACE::Bool32 shaderInt64_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderInt64 = shaderInt64_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setShaderInt16( VULKAN_HPP_NAMESPACE::Bool32 shaderInt16_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderInt16 = shaderInt16_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setShaderResourceResidency( VULKAN_HPP_NAMESPACE::Bool32 shaderResourceResidency_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderResourceResidency = shaderResourceResidency_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setShaderResourceMinLod( VULKAN_HPP_NAMESPACE::Bool32 shaderResourceMinLod_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderResourceMinLod = shaderResourceMinLod_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setSparseBinding( VULKAN_HPP_NAMESPACE::Bool32 sparseBinding_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sparseBinding = sparseBinding_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setSparseResidencyBuffer( VULKAN_HPP_NAMESPACE::Bool32 sparseResidencyBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sparseResidencyBuffer = sparseResidencyBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setSparseResidencyImage2D( VULKAN_HPP_NAMESPACE::Bool32 sparseResidencyImage2D_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sparseResidencyImage2D = sparseResidencyImage2D_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setSparseResidencyImage3D( VULKAN_HPP_NAMESPACE::Bool32 sparseResidencyImage3D_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sparseResidencyImage3D = sparseResidencyImage3D_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setSparseResidency2Samples( VULKAN_HPP_NAMESPACE::Bool32 sparseResidency2Samples_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sparseResidency2Samples = sparseResidency2Samples_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setSparseResidency4Samples( VULKAN_HPP_NAMESPACE::Bool32 sparseResidency4Samples_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sparseResidency4Samples = sparseResidency4Samples_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setSparseResidency8Samples( VULKAN_HPP_NAMESPACE::Bool32 sparseResidency8Samples_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sparseResidency8Samples = sparseResidency8Samples_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setSparseResidency16Samples( VULKAN_HPP_NAMESPACE::Bool32 sparseResidency16Samples_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sparseResidency16Samples = sparseResidency16Samples_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setSparseResidencyAliased( VULKAN_HPP_NAMESPACE::Bool32 sparseResidencyAliased_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sparseResidencyAliased = sparseResidencyAliased_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setVariableMultisampleRate( VULKAN_HPP_NAMESPACE::Bool32 variableMultisampleRate_ ) VULKAN_HPP_NOEXCEPT\n    {\n      variableMultisampleRate = variableMultisampleRate_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures & setInheritedQueries( VULKAN_HPP_NAMESPACE::Bool32 inheritedQueries_ ) VULKAN_HPP_NOEXCEPT\n    {\n      inheritedQueries = inheritedQueries_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( robustBufferAccess,\n                       fullDrawIndexUint32,\n                       imageCubeArray,\n                       independentBlend,\n                       geometryShader,\n                       tessellationShader,\n                       sampleRateShading,\n                       dualSrcBlend,\n                       logicOp,\n                       multiDrawIndirect,\n                       drawIndirectFirstInstance,\n                       depthClamp,\n                       depthBiasClamp,\n                       fillModeNonSolid,\n                       depthBounds,\n                       wideLines,\n                       largePoints,\n                       alphaToOne,\n                       multiViewport,\n                       samplerAnisotropy,\n                       textureCompressionETC2,\n                       textureCompressionASTC_LDR,\n                       textureCompressionBC,\n                       occlusionQueryPrecise,\n                       pipelineStatisticsQuery,\n                       vertexPipelineStoresAndAtomics,\n                       fragmentStoresAndAtomics,\n                       shaderTessellationAndGeometryPointSize,\n                       shaderImageGatherExtended,\n                       shaderStorageImageExtendedFormats,\n                       shaderStorageImageMultisample,\n                       shaderStorageImageReadWithoutFormat,\n                       shaderStorageImageWriteWithoutFormat,\n                       shaderUniformBufferArrayDynamicIndexing,\n                       shaderSampledImageArrayDynamicIndexing,\n                       shaderStorageBufferArrayDynamicIndexing,\n                       shaderStorageImageArrayDynamicIndexing,\n                       shaderClipDistance,\n                       shaderCullDistance,\n                       shaderFloat64,\n                       shaderInt64,\n                       shaderInt16,\n                       shaderResourceResidency,\n                       shaderResourceMinLod,\n                       sparseBinding,\n                       sparseResidencyBuffer,\n                       sparseResidencyImage2D,\n                       sparseResidencyImage3D,\n                       sparseResidency2Samples,\n                       sparseResidency4Samples,\n                       sparseResidency8Samples,\n                       sparseResidency16Samples,\n                       sparseResidencyAliased,\n                       variableMultisampleRate,\n                       inheritedQueries );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( robustBufferAccess == rhs.robustBufferAccess ) && ( fullDrawIndexUint32 == rhs.fullDrawIndexUint32 ) &&\n             ( imageCubeArray == rhs.imageCubeArray ) && ( independentBlend == rhs.independentBlend ) && ( geometryShader == rhs.geometryShader ) &&\n             ( tessellationShader == rhs.tessellationShader ) && ( sampleRateShading == rhs.sampleRateShading ) && ( dualSrcBlend == rhs.dualSrcBlend ) &&\n             ( logicOp == rhs.logicOp ) && ( multiDrawIndirect == rhs.multiDrawIndirect ) && ( drawIndirectFirstInstance == rhs.drawIndirectFirstInstance ) &&\n             ( depthClamp == rhs.depthClamp ) && ( depthBiasClamp == rhs.depthBiasClamp ) && ( fillModeNonSolid == rhs.fillModeNonSolid ) &&\n             ( depthBounds == rhs.depthBounds ) && ( wideLines == rhs.wideLines ) && ( largePoints == rhs.largePoints ) && ( alphaToOne == rhs.alphaToOne ) &&\n             ( multiViewport == rhs.multiViewport ) && ( samplerAnisotropy == rhs.samplerAnisotropy ) &&\n             ( textureCompressionETC2 == rhs.textureCompressionETC2 ) && ( textureCompressionASTC_LDR == rhs.textureCompressionASTC_LDR ) &&\n             ( textureCompressionBC == rhs.textureCompressionBC ) && ( occlusionQueryPrecise == rhs.occlusionQueryPrecise ) &&\n             ( pipelineStatisticsQuery == rhs.pipelineStatisticsQuery ) && ( vertexPipelineStoresAndAtomics == rhs.vertexPipelineStoresAndAtomics ) &&\n             ( fragmentStoresAndAtomics == rhs.fragmentStoresAndAtomics ) &&\n             ( shaderTessellationAndGeometryPointSize == rhs.shaderTessellationAndGeometryPointSize ) &&\n             ( shaderImageGatherExtended == rhs.shaderImageGatherExtended ) && ( shaderStorageImageExtendedFormats == rhs.shaderStorageImageExtendedFormats ) &&\n             ( shaderStorageImageMultisample == rhs.shaderStorageImageMultisample ) &&\n             ( shaderStorageImageReadWithoutFormat == rhs.shaderStorageImageReadWithoutFormat ) &&\n             ( shaderStorageImageWriteWithoutFormat == rhs.shaderStorageImageWriteWithoutFormat ) &&\n             ( shaderUniformBufferArrayDynamicIndexing == rhs.shaderUniformBufferArrayDynamicIndexing ) &&\n             ( shaderSampledImageArrayDynamicIndexing == rhs.shaderSampledImageArrayDynamicIndexing ) &&\n             ( shaderStorageBufferArrayDynamicIndexing == rhs.shaderStorageBufferArrayDynamicIndexing ) &&\n             ( shaderStorageImageArrayDynamicIndexing == rhs.shaderStorageImageArrayDynamicIndexing ) && ( shaderClipDistance == rhs.shaderClipDistance ) &&\n             ( shaderCullDistance == rhs.shaderCullDistance ) && ( shaderFloat64 == rhs.shaderFloat64 ) && ( shaderInt64 == rhs.shaderInt64 ) &&\n             ( shaderInt16 == rhs.shaderInt16 ) && ( shaderResourceResidency == rhs.shaderResourceResidency ) &&\n             ( shaderResourceMinLod == rhs.shaderResourceMinLod ) && ( sparseBinding == rhs.sparseBinding ) &&\n             ( sparseResidencyBuffer == rhs.sparseResidencyBuffer ) && ( sparseResidencyImage2D == rhs.sparseResidencyImage2D ) &&\n             ( sparseResidencyImage3D == rhs.sparseResidencyImage3D ) && ( sparseResidency2Samples == rhs.sparseResidency2Samples ) &&\n             ( sparseResidency4Samples == rhs.sparseResidency4Samples ) && ( sparseResidency8Samples == rhs.sparseResidency8Samples ) &&\n             ( sparseResidency16Samples == rhs.sparseResidency16Samples ) && ( sparseResidencyAliased == rhs.sparseResidencyAliased ) &&\n             ( variableMultisampleRate == rhs.variableMultisampleRate ) && ( inheritedQueries == rhs.inheritedQueries );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::Bool32 robustBufferAccess                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32 fullDrawIndexUint32                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32 imageCubeArray                          = {};\n    VULKAN_HPP_NAMESPACE::Bool32 independentBlend                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32 geometryShader                          = {};\n    VULKAN_HPP_NAMESPACE::Bool32 tessellationShader                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32 sampleRateShading                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32 dualSrcBlend                            = {};\n    VULKAN_HPP_NAMESPACE::Bool32 logicOp                                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32 multiDrawIndirect                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32 drawIndirectFirstInstance               = {};\n    VULKAN_HPP_NAMESPACE::Bool32 depthClamp                              = {};\n    VULKAN_HPP_NAMESPACE::Bool32 depthBiasClamp                          = {};\n    VULKAN_HPP_NAMESPACE::Bool32 fillModeNonSolid                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32 depthBounds                             = {};\n    VULKAN_HPP_NAMESPACE::Bool32 wideLines                               = {};\n    VULKAN_HPP_NAMESPACE::Bool32 largePoints                             = {};\n    VULKAN_HPP_NAMESPACE::Bool32 alphaToOne                              = {};\n    VULKAN_HPP_NAMESPACE::Bool32 multiViewport                           = {};\n    VULKAN_HPP_NAMESPACE::Bool32 samplerAnisotropy                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32 textureCompressionETC2                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32 textureCompressionASTC_LDR              = {};\n    VULKAN_HPP_NAMESPACE::Bool32 textureCompressionBC                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32 occlusionQueryPrecise                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32 pipelineStatisticsQuery                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32 vertexPipelineStoresAndAtomics          = {};\n    VULKAN_HPP_NAMESPACE::Bool32 fragmentStoresAndAtomics                = {};\n    VULKAN_HPP_NAMESPACE::Bool32 shaderTessellationAndGeometryPointSize  = {};\n    VULKAN_HPP_NAMESPACE::Bool32 shaderImageGatherExtended               = {};\n    VULKAN_HPP_NAMESPACE::Bool32 shaderStorageImageExtendedFormats       = {};\n    VULKAN_HPP_NAMESPACE::Bool32 shaderStorageImageMultisample           = {};\n    VULKAN_HPP_NAMESPACE::Bool32 shaderStorageImageReadWithoutFormat     = {};\n    VULKAN_HPP_NAMESPACE::Bool32 shaderStorageImageWriteWithoutFormat    = {};\n    VULKAN_HPP_NAMESPACE::Bool32 shaderUniformBufferArrayDynamicIndexing = {};\n    VULKAN_HPP_NAMESPACE::Bool32 shaderSampledImageArrayDynamicIndexing  = {};\n    VULKAN_HPP_NAMESPACE::Bool32 shaderStorageBufferArrayDynamicIndexing = {};\n    VULKAN_HPP_NAMESPACE::Bool32 shaderStorageImageArrayDynamicIndexing  = {};\n    VULKAN_HPP_NAMESPACE::Bool32 shaderClipDistance                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32 shaderCullDistance                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32 shaderFloat64                           = {};\n    VULKAN_HPP_NAMESPACE::Bool32 shaderInt64                             = {};\n    VULKAN_HPP_NAMESPACE::Bool32 shaderInt16                             = {};\n    VULKAN_HPP_NAMESPACE::Bool32 shaderResourceResidency                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32 shaderResourceMinLod                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32 sparseBinding                           = {};\n    VULKAN_HPP_NAMESPACE::Bool32 sparseResidencyBuffer                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32 sparseResidencyImage2D                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32 sparseResidencyImage3D                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32 sparseResidency2Samples                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32 sparseResidency4Samples                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32 sparseResidency8Samples                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32 sparseResidency16Samples                = {};\n    VULKAN_HPP_NAMESPACE::Bool32 sparseResidencyAliased                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32 variableMultisampleRate                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32 inheritedQueries                        = {};\n  };\n\n  struct DeviceCreateInfo\n  {\n    using NativeType = VkDeviceCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DeviceCreateInfo( VULKAN_HPP_NAMESPACE::DeviceCreateFlags              flags_                   = {},\n                                           uint32_t                                             queueCreateInfoCount_    = {},\n                                           const VULKAN_HPP_NAMESPACE::DeviceQueueCreateInfo *  pQueueCreateInfos_       = {},\n                                           uint32_t                                             enabledLayerCount_       = {},\n                                           const char * const *                                 ppEnabledLayerNames_     = {},\n                                           uint32_t                                             enabledExtensionCount_   = {},\n                                           const char * const *                                 ppEnabledExtensionNames_ = {},\n                                           const VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures * pEnabledFeatures_        = {},\n                                           const void *                                         pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , queueCreateInfoCount{ queueCreateInfoCount_ }\n      , pQueueCreateInfos{ pQueueCreateInfos_ }\n      , enabledLayerCount{ enabledLayerCount_ }\n      , ppEnabledLayerNames{ ppEnabledLayerNames_ }\n      , enabledExtensionCount{ enabledExtensionCount_ }\n      , ppEnabledExtensionNames{ ppEnabledExtensionNames_ }\n      , pEnabledFeatures{ pEnabledFeatures_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceCreateInfo( DeviceCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceCreateInfo( VkDeviceCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT : DeviceCreateInfo( *reinterpret_cast<DeviceCreateInfo const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DeviceCreateInfo( VULKAN_HPP_NAMESPACE::DeviceCreateFlags                                                                  flags_,\n                      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DeviceQueueCreateInfo> const & queueCreateInfos_,\n                      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const char * const> const &                                pEnabledLayerNames_     = {},\n                      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const char * const> const &                                pEnabledExtensionNames_ = {},\n                      const VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures *                                                     pEnabledFeatures_       = {},\n                      const void *                                                                                             pNext_ = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , queueCreateInfoCount( static_cast<uint32_t>( queueCreateInfos_.size() ) )\n      , pQueueCreateInfos( queueCreateInfos_.data() )\n      , enabledLayerCount( static_cast<uint32_t>( pEnabledLayerNames_.size() ) )\n      , ppEnabledLayerNames( pEnabledLayerNames_.data() )\n      , enabledExtensionCount( static_cast<uint32_t>( pEnabledExtensionNames_.size() ) )\n      , ppEnabledExtensionNames( pEnabledExtensionNames_.data() )\n      , pEnabledFeatures( pEnabledFeatures_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    DeviceCreateInfo & operator=( DeviceCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceCreateInfo & operator=( VkDeviceCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::DeviceCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceCreateInfo & setQueueCreateInfoCount( uint32_t queueCreateInfoCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queueCreateInfoCount = queueCreateInfoCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceCreateInfo &\n      setPQueueCreateInfos( const VULKAN_HPP_NAMESPACE::DeviceQueueCreateInfo * pQueueCreateInfos_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pQueueCreateInfos = pQueueCreateInfos_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DeviceCreateInfo & setQueueCreateInfos(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DeviceQueueCreateInfo> const & queueCreateInfos_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queueCreateInfoCount = static_cast<uint32_t>( queueCreateInfos_.size() );\n      pQueueCreateInfos    = queueCreateInfos_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceCreateInfo & setEnabledLayerCount( uint32_t enabledLayerCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      enabledLayerCount = enabledLayerCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceCreateInfo & setPpEnabledLayerNames( const char * const * ppEnabledLayerNames_ ) VULKAN_HPP_NOEXCEPT\n    {\n      ppEnabledLayerNames = ppEnabledLayerNames_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DeviceCreateInfo &\n      setPEnabledLayerNames( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const char * const> const & pEnabledLayerNames_ ) VULKAN_HPP_NOEXCEPT\n    {\n      enabledLayerCount   = static_cast<uint32_t>( pEnabledLayerNames_.size() );\n      ppEnabledLayerNames = pEnabledLayerNames_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceCreateInfo & setEnabledExtensionCount( uint32_t enabledExtensionCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      enabledExtensionCount = enabledExtensionCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceCreateInfo & setPpEnabledExtensionNames( const char * const * ppEnabledExtensionNames_ ) VULKAN_HPP_NOEXCEPT\n    {\n      ppEnabledExtensionNames = ppEnabledExtensionNames_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DeviceCreateInfo &\n      setPEnabledExtensionNames( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const char * const> const & pEnabledExtensionNames_ ) VULKAN_HPP_NOEXCEPT\n    {\n      enabledExtensionCount   = static_cast<uint32_t>( pEnabledExtensionNames_.size() );\n      ppEnabledExtensionNames = pEnabledExtensionNames_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceCreateInfo & setPEnabledFeatures( const VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures * pEnabledFeatures_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pEnabledFeatures = pEnabledFeatures_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceCreateInfo *>( this );\n    }\n\n    operator VkDeviceCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceCreateFlags const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::DeviceQueueCreateInfo * const &,\n               uint32_t const &,\n               const char * const * const &,\n               uint32_t const &,\n               const char * const * const &,\n               const VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       flags,\n                       queueCreateInfoCount,\n                       pQueueCreateInfos,\n                       enabledLayerCount,\n                       ppEnabledLayerNames,\n                       enabledExtensionCount,\n                       ppEnabledExtensionNames,\n                       pEnabledFeatures );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( DeviceCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = flags <=> rhs.flags; cmp != 0 )\n        return cmp;\n      if ( auto cmp = queueCreateInfoCount <=> rhs.queueCreateInfoCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pQueueCreateInfos <=> rhs.pQueueCreateInfos; cmp != 0 )\n        return cmp;\n      if ( auto cmp = enabledLayerCount <=> rhs.enabledLayerCount; cmp != 0 )\n        return cmp;\n      for ( size_t i = 0; i < enabledLayerCount; ++i )\n      {\n        if ( ppEnabledLayerNames[i] != rhs.ppEnabledLayerNames[i] )\n          if ( auto cmp = strcmp( ppEnabledLayerNames[i], rhs.ppEnabledLayerNames[i] ); cmp != 0 )\n            return cmp < 0 ? std::strong_ordering::less : std::strong_ordering::greater;\n      }\n      if ( auto cmp = enabledExtensionCount <=> rhs.enabledExtensionCount; cmp != 0 )\n        return cmp;\n      for ( size_t i = 0; i < enabledExtensionCount; ++i )\n      {\n        if ( ppEnabledExtensionNames[i] != rhs.ppEnabledExtensionNames[i] )\n          if ( auto cmp = strcmp( ppEnabledExtensionNames[i], rhs.ppEnabledExtensionNames[i] ); cmp != 0 )\n            return cmp < 0 ? std::strong_ordering::less : std::strong_ordering::greater;\n      }\n      if ( auto cmp = pEnabledFeatures <=> rhs.pEnabledFeatures; cmp != 0 )\n        return cmp;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( DeviceCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( queueCreateInfoCount == rhs.queueCreateInfoCount ) &&\n             ( pQueueCreateInfos == rhs.pQueueCreateInfos ) && ( enabledLayerCount == rhs.enabledLayerCount ) &&\n             std::equal( ppEnabledLayerNames,\n                         ppEnabledLayerNames + enabledLayerCount,\n                         rhs.ppEnabledLayerNames,\n                         []( char const * left, char const * right ) { return ( left == right ) || ( strcmp( left, right ) == 0 ); } ) &&\n             ( enabledExtensionCount == rhs.enabledExtensionCount ) &&\n             std::equal( ppEnabledExtensionNames,\n                         ppEnabledExtensionNames + enabledExtensionCount,\n                         rhs.ppEnabledExtensionNames,\n                         []( char const * left, char const * right ) { return ( left == right ) || ( strcmp( left, right ) == 0 ); } ) &&\n             ( pEnabledFeatures == rhs.pEnabledFeatures );\n    }\n\n    bool operator!=( DeviceCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                  sType                   = StructureType::eDeviceCreateInfo;\n    const void *                                         pNext                   = {};\n    VULKAN_HPP_NAMESPACE::DeviceCreateFlags              flags                   = {};\n    uint32_t                                             queueCreateInfoCount    = {};\n    const VULKAN_HPP_NAMESPACE::DeviceQueueCreateInfo *  pQueueCreateInfos       = {};\n    uint32_t                                             enabledLayerCount       = {};\n    const char * const *                                 ppEnabledLayerNames     = {};\n    uint32_t                                             enabledExtensionCount   = {};\n    const char * const *                                 ppEnabledExtensionNames = {};\n    const VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures * pEnabledFeatures        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceCreateInfo>\n  {\n    using Type = DeviceCreateInfo;\n  };\n\n  struct DeviceMemoryReportCallbackDataEXT\n  {\n    using NativeType = VkDeviceMemoryReportCallbackDataEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceMemoryReportCallbackDataEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DeviceMemoryReportCallbackDataEXT(\n      VULKAN_HPP_NAMESPACE::DeviceMemoryReportFlagsEXT     flags_          = {},\n      VULKAN_HPP_NAMESPACE::DeviceMemoryReportEventTypeEXT type_           = VULKAN_HPP_NAMESPACE::DeviceMemoryReportEventTypeEXT::eAllocate,\n      uint64_t                                             memoryObjectId_ = {},\n      VULKAN_HPP_NAMESPACE::DeviceSize                     size_           = {},\n      VULKAN_HPP_NAMESPACE::ObjectType                     objectType_     = VULKAN_HPP_NAMESPACE::ObjectType::eUnknown,\n      uint64_t                                             objectHandle_   = {},\n      uint32_t                                             heapIndex_      = {},\n      void *                                               pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , type{ type_ }\n      , memoryObjectId{ memoryObjectId_ }\n      , size{ size_ }\n      , objectType{ objectType_ }\n      , objectHandle{ objectHandle_ }\n      , heapIndex{ heapIndex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceMemoryReportCallbackDataEXT( DeviceMemoryReportCallbackDataEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceMemoryReportCallbackDataEXT( VkDeviceMemoryReportCallbackDataEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceMemoryReportCallbackDataEXT( *reinterpret_cast<DeviceMemoryReportCallbackDataEXT const *>( &rhs ) )\n    {\n    }\n\n    DeviceMemoryReportCallbackDataEXT & operator=( DeviceMemoryReportCallbackDataEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceMemoryReportCallbackDataEXT & operator=( VkDeviceMemoryReportCallbackDataEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceMemoryReportCallbackDataEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkDeviceMemoryReportCallbackDataEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceMemoryReportCallbackDataEXT *>( this );\n    }\n\n    operator VkDeviceMemoryReportCallbackDataEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceMemoryReportCallbackDataEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceMemoryReportFlagsEXT const &,\n               VULKAN_HPP_NAMESPACE::DeviceMemoryReportEventTypeEXT const &,\n               uint64_t const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::ObjectType const &,\n               uint64_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, type, memoryObjectId, size, objectType, objectHandle, heapIndex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceMemoryReportCallbackDataEXT const & ) const = default;\n#else\n    bool operator==( DeviceMemoryReportCallbackDataEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( type == rhs.type ) && ( memoryObjectId == rhs.memoryObjectId ) &&\n             ( size == rhs.size ) && ( objectType == rhs.objectType ) && ( objectHandle == rhs.objectHandle ) && ( heapIndex == rhs.heapIndex );\n#  endif\n    }\n\n    bool operator!=( DeviceMemoryReportCallbackDataEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                  sType          = StructureType::eDeviceMemoryReportCallbackDataEXT;\n    void *                                               pNext          = {};\n    VULKAN_HPP_NAMESPACE::DeviceMemoryReportFlagsEXT     flags          = {};\n    VULKAN_HPP_NAMESPACE::DeviceMemoryReportEventTypeEXT type           = VULKAN_HPP_NAMESPACE::DeviceMemoryReportEventTypeEXT::eAllocate;\n    uint64_t                                             memoryObjectId = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                     size           = {};\n    VULKAN_HPP_NAMESPACE::ObjectType                     objectType     = VULKAN_HPP_NAMESPACE::ObjectType::eUnknown;\n    uint64_t                                             objectHandle   = {};\n    uint32_t                                             heapIndex      = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceMemoryReportCallbackDataEXT>\n  {\n    using Type = DeviceMemoryReportCallbackDataEXT;\n  };\n\n  typedef void( VKAPI_PTR * PFN_DeviceMemoryReportCallbackEXT )( const VULKAN_HPP_NAMESPACE::DeviceMemoryReportCallbackDataEXT * pCallbackData,\n                                                                 void *                                                          pUserData );\n\n  struct DeviceDeviceMemoryReportCreateInfoEXT\n  {\n    using NativeType = VkDeviceDeviceMemoryReportCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceDeviceMemoryReportCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DeviceDeviceMemoryReportCreateInfoEXT( VULKAN_HPP_NAMESPACE::DeviceMemoryReportFlagsEXT        flags_           = {},\n                                                                VULKAN_HPP_NAMESPACE::PFN_DeviceMemoryReportCallbackEXT pfnUserCallback_ = {},\n                                                                void *                                                  pUserData_       = {},\n                                                                const void *                                            pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , pfnUserCallback{ pfnUserCallback_ }\n      , pUserData{ pUserData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceDeviceMemoryReportCreateInfoEXT( DeviceDeviceMemoryReportCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceDeviceMemoryReportCreateInfoEXT( VkDeviceDeviceMemoryReportCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceDeviceMemoryReportCreateInfoEXT( *reinterpret_cast<DeviceDeviceMemoryReportCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if defined( __clang__ ) || defined( __GNUC__ )\n#    pragma GCC diagnostic push\n#    if defined( __clang__ )\n#      pragma clang diagnostic ignored \"-Wunknown-warning-option\"\n#    endif\n#    pragma GCC diagnostic ignored \"-Wcast-function-type\"\n#  endif\n    VULKAN_HPP_DEPRECATED( \"This constructor is deprecated. Use the one taking function pointer types from the vk-namespace instead.\" )\n\n    DeviceDeviceMemoryReportCreateInfoEXT( VULKAN_HPP_NAMESPACE::DeviceMemoryReportFlagsEXT flags_,\n                                           PFN_vkDeviceMemoryReportCallbackEXT              pfnUserCallback_,\n                                           void *                                           pUserData_ = {},\n                                           const void *                                     pNext_     = nullptr ) VULKAN_HPP_NOEXCEPT\n      : DeviceDeviceMemoryReportCreateInfoEXT( flags_,\n                                               reinterpret_cast<VULKAN_HPP_NAMESPACE::PFN_DeviceMemoryReportCallbackEXT>( pfnUserCallback_ ),\n                                               pUserData_,\n                                               pNext_ )\n    {\n    }\n#  if defined( __clang__ ) || defined( __GNUC__ )\n#    pragma GCC diagnostic pop\n#  endif\n\n    DeviceDeviceMemoryReportCreateInfoEXT & operator=( DeviceDeviceMemoryReportCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceDeviceMemoryReportCreateInfoEXT & operator=( VkDeviceDeviceMemoryReportCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceDeviceMemoryReportCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceDeviceMemoryReportCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceDeviceMemoryReportCreateInfoEXT & setFlags( VULKAN_HPP_NAMESPACE::DeviceMemoryReportFlagsEXT flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceDeviceMemoryReportCreateInfoEXT &\n      setPfnUserCallback( VULKAN_HPP_NAMESPACE::PFN_DeviceMemoryReportCallbackEXT pfnUserCallback_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pfnUserCallback = pfnUserCallback_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceDeviceMemoryReportCreateInfoEXT & setPUserData( void * pUserData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pUserData = pUserData_;\n      return *this;\n    }\n\n#  if defined( __clang__ ) || defined( __GNUC__ )\n#    pragma GCC diagnostic push\n#    if defined( __clang__ )\n#      pragma clang diagnostic ignored \"-Wunknown-warning-option\"\n#    endif\n#    pragma GCC diagnostic ignored \"-Wcast-function-type\"\n#  endif\n    VULKAN_HPP_DEPRECATED( \"This setter is deprecated. Use the one taking a function pointer type from the vk-namespace instead.\" )\n\n    DeviceDeviceMemoryReportCreateInfoEXT & setPfnUserCallback( PFN_vkDeviceMemoryReportCallbackEXT pfnUserCallback_ ) VULKAN_HPP_NOEXCEPT\n    {\n      return setPfnUserCallback( reinterpret_cast<VULKAN_HPP_NAMESPACE::PFN_DeviceMemoryReportCallbackEXT>( pfnUserCallback_ ) );\n    }\n#  if defined( __clang__ ) || defined( __GNUC__ )\n#    pragma GCC diagnostic pop\n#  endif\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceDeviceMemoryReportCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceDeviceMemoryReportCreateInfoEXT *>( this );\n    }\n\n    operator VkDeviceDeviceMemoryReportCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceDeviceMemoryReportCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceMemoryReportFlagsEXT const &,\n               VULKAN_HPP_NAMESPACE::PFN_DeviceMemoryReportCallbackEXT const &,\n               void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, pfnUserCallback, pUserData );\n    }\n#endif\n\n    bool operator==( DeviceDeviceMemoryReportCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( pfnUserCallback == rhs.pfnUserCallback ) &&\n             ( pUserData == rhs.pUserData );\n#endif\n    }\n\n    bool operator!=( DeviceDeviceMemoryReportCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                     sType           = StructureType::eDeviceDeviceMemoryReportCreateInfoEXT;\n    const void *                                            pNext           = {};\n    VULKAN_HPP_NAMESPACE::DeviceMemoryReportFlagsEXT        flags           = {};\n    VULKAN_HPP_NAMESPACE::PFN_DeviceMemoryReportCallbackEXT pfnUserCallback = {};\n    void *                                                  pUserData       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceDeviceMemoryReportCreateInfoEXT>\n  {\n    using Type = DeviceDeviceMemoryReportCreateInfoEXT;\n  };\n\n  struct DeviceDiagnosticsConfigCreateInfoNV\n  {\n    using NativeType = VkDeviceDiagnosticsConfigCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceDiagnosticsConfigCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DeviceDiagnosticsConfigCreateInfoNV( VULKAN_HPP_NAMESPACE::DeviceDiagnosticsConfigFlagsNV flags_ = {},\n                                                              const void *                                         pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceDiagnosticsConfigCreateInfoNV( DeviceDiagnosticsConfigCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceDiagnosticsConfigCreateInfoNV( VkDeviceDiagnosticsConfigCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceDiagnosticsConfigCreateInfoNV( *reinterpret_cast<DeviceDiagnosticsConfigCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n    DeviceDiagnosticsConfigCreateInfoNV & operator=( DeviceDiagnosticsConfigCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceDiagnosticsConfigCreateInfoNV & operator=( VkDeviceDiagnosticsConfigCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceDiagnosticsConfigCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceDiagnosticsConfigCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceDiagnosticsConfigCreateInfoNV & setFlags( VULKAN_HPP_NAMESPACE::DeviceDiagnosticsConfigFlagsNV flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceDiagnosticsConfigCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceDiagnosticsConfigCreateInfoNV *>( this );\n    }\n\n    operator VkDeviceDiagnosticsConfigCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceDiagnosticsConfigCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::DeviceDiagnosticsConfigFlagsNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceDiagnosticsConfigCreateInfoNV const & ) const = default;\n#else\n    bool operator==( DeviceDiagnosticsConfigCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags );\n#  endif\n    }\n\n    bool operator!=( DeviceDiagnosticsConfigCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                  sType = StructureType::eDeviceDiagnosticsConfigCreateInfoNV;\n    const void *                                         pNext = {};\n    VULKAN_HPP_NAMESPACE::DeviceDiagnosticsConfigFlagsNV flags = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceDiagnosticsConfigCreateInfoNV>\n  {\n    using Type = DeviceDiagnosticsConfigCreateInfoNV;\n  };\n\n  struct DeviceEventInfoEXT\n  {\n    using NativeType = VkDeviceEventInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceEventInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DeviceEventInfoEXT( VULKAN_HPP_NAMESPACE::DeviceEventTypeEXT deviceEvent_ = VULKAN_HPP_NAMESPACE::DeviceEventTypeEXT::eDisplayHotplug,\n                                             const void *                             pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , deviceEvent{ deviceEvent_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceEventInfoEXT( DeviceEventInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceEventInfoEXT( VkDeviceEventInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT : DeviceEventInfoEXT( *reinterpret_cast<DeviceEventInfoEXT const *>( &rhs ) ) {}\n\n    DeviceEventInfoEXT & operator=( DeviceEventInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceEventInfoEXT & operator=( VkDeviceEventInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceEventInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceEventInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceEventInfoEXT & setDeviceEvent( VULKAN_HPP_NAMESPACE::DeviceEventTypeEXT deviceEvent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceEvent = deviceEvent_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceEventInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceEventInfoEXT *>( this );\n    }\n\n    operator VkDeviceEventInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceEventInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::DeviceEventTypeEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, deviceEvent );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceEventInfoEXT const & ) const = default;\n#else\n    bool operator==( DeviceEventInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( deviceEvent == rhs.deviceEvent );\n#  endif\n    }\n\n    bool operator!=( DeviceEventInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType      sType       = StructureType::eDeviceEventInfoEXT;\n    const void *                             pNext       = {};\n    VULKAN_HPP_NAMESPACE::DeviceEventTypeEXT deviceEvent = VULKAN_HPP_NAMESPACE::DeviceEventTypeEXT::eDisplayHotplug;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceEventInfoEXT>\n  {\n    using Type = DeviceEventInfoEXT;\n  };\n\n  struct DeviceFaultAddressInfoEXT\n  {\n    using NativeType = VkDeviceFaultAddressInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      DeviceFaultAddressInfoEXT( VULKAN_HPP_NAMESPACE::DeviceFaultAddressTypeEXT addressType_      = VULKAN_HPP_NAMESPACE::DeviceFaultAddressTypeEXT::eNone,\n                                 VULKAN_HPP_NAMESPACE::DeviceAddress             reportedAddress_  = {},\n                                 VULKAN_HPP_NAMESPACE::DeviceSize                addressPrecision_ = {} ) VULKAN_HPP_NOEXCEPT\n      : addressType{ addressType_ }\n      , reportedAddress{ reportedAddress_ }\n      , addressPrecision{ addressPrecision_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceFaultAddressInfoEXT( DeviceFaultAddressInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceFaultAddressInfoEXT( VkDeviceFaultAddressInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceFaultAddressInfoEXT( *reinterpret_cast<DeviceFaultAddressInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    DeviceFaultAddressInfoEXT & operator=( DeviceFaultAddressInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceFaultAddressInfoEXT & operator=( VkDeviceFaultAddressInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceFaultAddressInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultAddressInfoEXT & setAddressType( VULKAN_HPP_NAMESPACE::DeviceFaultAddressTypeEXT addressType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      addressType = addressType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultAddressInfoEXT & setReportedAddress( VULKAN_HPP_NAMESPACE::DeviceAddress reportedAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      reportedAddress = reportedAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultAddressInfoEXT & setAddressPrecision( VULKAN_HPP_NAMESPACE::DeviceSize addressPrecision_ ) VULKAN_HPP_NOEXCEPT\n    {\n      addressPrecision = addressPrecision_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceFaultAddressInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceFaultAddressInfoEXT *>( this );\n    }\n\n    operator VkDeviceFaultAddressInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceFaultAddressInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DeviceFaultAddressTypeEXT const &, VULKAN_HPP_NAMESPACE::DeviceAddress const &, VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( addressType, reportedAddress, addressPrecision );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceFaultAddressInfoEXT const & ) const = default;\n#else\n    bool operator==( DeviceFaultAddressInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( addressType == rhs.addressType ) && ( reportedAddress == rhs.reportedAddress ) && ( addressPrecision == rhs.addressPrecision );\n#  endif\n    }\n\n    bool operator!=( DeviceFaultAddressInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DeviceFaultAddressTypeEXT addressType      = VULKAN_HPP_NAMESPACE::DeviceFaultAddressTypeEXT::eNone;\n    VULKAN_HPP_NAMESPACE::DeviceAddress             reportedAddress  = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                addressPrecision = {};\n  };\n\n  struct DeviceFaultCountsEXT\n  {\n    using NativeType = VkDeviceFaultCountsEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceFaultCountsEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DeviceFaultCountsEXT( uint32_t                         addressInfoCount_ = {},\n                                               uint32_t                         vendorInfoCount_  = {},\n                                               VULKAN_HPP_NAMESPACE::DeviceSize vendorBinarySize_ = {},\n                                               void *                           pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , addressInfoCount{ addressInfoCount_ }\n      , vendorInfoCount{ vendorInfoCount_ }\n      , vendorBinarySize{ vendorBinarySize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceFaultCountsEXT( DeviceFaultCountsEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceFaultCountsEXT( VkDeviceFaultCountsEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceFaultCountsEXT( *reinterpret_cast<DeviceFaultCountsEXT const *>( &rhs ) )\n    {\n    }\n\n    DeviceFaultCountsEXT & operator=( DeviceFaultCountsEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceFaultCountsEXT & operator=( VkDeviceFaultCountsEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceFaultCountsEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultCountsEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultCountsEXT & setAddressInfoCount( uint32_t addressInfoCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      addressInfoCount = addressInfoCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultCountsEXT & setVendorInfoCount( uint32_t vendorInfoCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vendorInfoCount = vendorInfoCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultCountsEXT & setVendorBinarySize( VULKAN_HPP_NAMESPACE::DeviceSize vendorBinarySize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vendorBinarySize = vendorBinarySize_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceFaultCountsEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceFaultCountsEXT *>( this );\n    }\n\n    operator VkDeviceFaultCountsEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceFaultCountsEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &, uint32_t const &, VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, addressInfoCount, vendorInfoCount, vendorBinarySize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceFaultCountsEXT const & ) const = default;\n#else\n    bool operator==( DeviceFaultCountsEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( addressInfoCount == rhs.addressInfoCount ) && ( vendorInfoCount == rhs.vendorInfoCount ) &&\n             ( vendorBinarySize == rhs.vendorBinarySize );\n#  endif\n    }\n\n    bool operator!=( DeviceFaultCountsEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType            = StructureType::eDeviceFaultCountsEXT;\n    void *                              pNext            = {};\n    uint32_t                            addressInfoCount = {};\n    uint32_t                            vendorInfoCount  = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    vendorBinarySize = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceFaultCountsEXT>\n  {\n    using Type = DeviceFaultCountsEXT;\n  };\n\n  struct DeviceFaultVendorInfoEXT\n  {\n    using NativeType = VkDeviceFaultVendorInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultVendorInfoEXT( std::array<char, VK_MAX_DESCRIPTION_SIZE> const & description_     = {},\n                                                      uint64_t                                          vendorFaultCode_ = {},\n                                                      uint64_t                                          vendorFaultData_ = {} ) VULKAN_HPP_NOEXCEPT\n      : description{ description_ }\n      , vendorFaultCode{ vendorFaultCode_ }\n      , vendorFaultData{ vendorFaultData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultVendorInfoEXT( DeviceFaultVendorInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceFaultVendorInfoEXT( VkDeviceFaultVendorInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceFaultVendorInfoEXT( *reinterpret_cast<DeviceFaultVendorInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DeviceFaultVendorInfoEXT( std::string const & description_, uint64_t vendorFaultCode_ = {}, uint64_t vendorFaultData_ = {} )\n      : vendorFaultCode( vendorFaultCode_ ), vendorFaultData( vendorFaultData_ )\n    {\n      VULKAN_HPP_ASSERT( description_.size() < VK_MAX_DESCRIPTION_SIZE );\n#    if defined( _WIN32 )\n      strncpy_s( description, VK_MAX_DESCRIPTION_SIZE, description_.data(), description_.size() );\n#    else\n      strncpy( description, description_.data(), std::min<size_t>( VK_MAX_DESCRIPTION_SIZE, description_.size() ) );\n#    endif\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    DeviceFaultVendorInfoEXT & operator=( DeviceFaultVendorInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceFaultVendorInfoEXT & operator=( VkDeviceFaultVendorInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceFaultVendorInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultVendorInfoEXT & setDescription( std::array<char, VK_MAX_DESCRIPTION_SIZE> description_ ) VULKAN_HPP_NOEXCEPT\n    {\n      description = description_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DeviceFaultVendorInfoEXT & setDescription( std::string const & description_ ) VULKAN_HPP_NOEXCEPT\n    {\n      VULKAN_HPP_ASSERT( description_.size() < VK_MAX_DESCRIPTION_SIZE );\n#    if defined( _WIN32 )\n      strncpy_s( description, VK_MAX_DESCRIPTION_SIZE, description_.data(), description_.size() );\n#    else\n      strncpy( description, description_.data(), std::min<size_t>( VK_MAX_DESCRIPTION_SIZE, description_.size() ) );\n#    endif\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultVendorInfoEXT & setVendorFaultCode( uint64_t vendorFaultCode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vendorFaultCode = vendorFaultCode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultVendorInfoEXT & setVendorFaultData( uint64_t vendorFaultData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vendorFaultData = vendorFaultData_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceFaultVendorInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceFaultVendorInfoEXT *>( this );\n    }\n\n    operator VkDeviceFaultVendorInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceFaultVendorInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> const &, uint64_t const &, uint64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( description, vendorFaultCode, vendorFaultData );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( DeviceFaultVendorInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = strcmp( description, rhs.description ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = vendorFaultCode <=> rhs.vendorFaultCode; cmp != 0 )\n        return cmp;\n      if ( auto cmp = vendorFaultData <=> rhs.vendorFaultData; cmp != 0 )\n        return cmp;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( DeviceFaultVendorInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( strcmp( description, rhs.description ) == 0 ) && ( vendorFaultCode == rhs.vendorFaultCode ) && ( vendorFaultData == rhs.vendorFaultData );\n    }\n\n    bool operator!=( DeviceFaultVendorInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> description     = {};\n    uint64_t                                                            vendorFaultCode = {};\n    uint64_t                                                            vendorFaultData = {};\n  };\n\n  struct DeviceFaultInfoEXT\n  {\n    using NativeType = VkDeviceFaultInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceFaultInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultInfoEXT( std::array<char, VK_MAX_DESCRIPTION_SIZE> const & description_       = {},\n                                                VULKAN_HPP_NAMESPACE::DeviceFaultAddressInfoEXT * pAddressInfos_     = {},\n                                                VULKAN_HPP_NAMESPACE::DeviceFaultVendorInfoEXT *  pVendorInfos_      = {},\n                                                void *                                            pVendorBinaryData_ = {},\n                                                void *                                            pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , description{ description_ }\n      , pAddressInfos{ pAddressInfos_ }\n      , pVendorInfos{ pVendorInfos_ }\n      , pVendorBinaryData{ pVendorBinaryData_ }\n    {\n    }\n\n#  ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultInfoEXT( DeviceFaultInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceFaultInfoEXT( VkDeviceFaultInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT : DeviceFaultInfoEXT( *reinterpret_cast<DeviceFaultInfoEXT const *>( &rhs ) ) {}\n\n    DeviceFaultInfoEXT & operator=( DeviceFaultInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  else\n    DeviceFaultInfoEXT( DeviceFaultInfoEXT const & )             = delete;\n    DeviceFaultInfoEXT & operator=( DeviceFaultInfoEXT const & ) = delete;\n\n    DeviceFaultInfoEXT( DeviceFaultInfoEXT && rhs ) VULKAN_HPP_NOEXCEPT\n      : pNext{ rhs.pNext }\n      , pAddressInfos{ rhs.pAddressInfos }\n      , pVendorInfos{ rhs.pVendorInfos }\n      , pVendorBinaryData{ rhs.pVendorBinaryData }\n    {\n      memcpy( description, rhs.description, VK_MAX_DESCRIPTION_SIZE );\n\n      rhs.pNext = nullptr;\n      memset( rhs.description, 0, VK_MAX_DESCRIPTION_SIZE );\n      rhs.pAddressInfos     = nullptr;\n      rhs.pVendorInfos      = nullptr;\n      rhs.pVendorBinaryData = nullptr;\n    }\n\n    DeviceFaultInfoEXT & operator=( DeviceFaultInfoEXT && rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      free( pAddressInfos );\n      free( pVendorInfos );\n      free( pVendorBinaryData );\n\n      pNext = rhs.pNext;\n      memcpy( description, rhs.description, VK_MAX_DESCRIPTION_SIZE );\n      pAddressInfos     = rhs.pAddressInfos;\n      pVendorInfos      = rhs.pVendorInfos;\n      pVendorBinaryData = rhs.pVendorBinaryData;\n\n      rhs.pNext = nullptr;\n      memset( rhs.description, 0, VK_MAX_DESCRIPTION_SIZE );\n      rhs.pAddressInfos     = nullptr;\n      rhs.pVendorInfos      = nullptr;\n      rhs.pVendorBinaryData = nullptr;\n\n      return *this;\n    }\n\n    ~DeviceFaultInfoEXT() VULKAN_HPP_NOEXCEPT\n    {\n      free( pAddressInfos );\n      free( pVendorInfos );\n      free( pVendorBinaryData );\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    operator VkDeviceFaultInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceFaultInfoEXT *>( this );\n    }\n\n    operator VkDeviceFaultInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceFaultInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::DeviceFaultAddressInfoEXT * const &,\n               VULKAN_HPP_NAMESPACE::DeviceFaultVendorInfoEXT * const &,\n               void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, description, pAddressInfos, pVendorInfos, pVendorBinaryData );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( DeviceFaultInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = strcmp( description, rhs.description ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = pAddressInfos <=> rhs.pAddressInfos; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pVendorInfos <=> rhs.pVendorInfos; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pVendorBinaryData <=> rhs.pVendorBinaryData; cmp != 0 )\n        return cmp;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( DeviceFaultInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( strcmp( description, rhs.description ) == 0 ) && ( pAddressInfos == rhs.pAddressInfos ) &&\n             ( pVendorInfos == rhs.pVendorInfos ) && ( pVendorBinaryData == rhs.pVendorBinaryData );\n    }\n\n    bool operator!=( DeviceFaultInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                 sType             = StructureType::eDeviceFaultInfoEXT;\n    void *                                                              pNext             = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> description       = {};\n    VULKAN_HPP_NAMESPACE::DeviceFaultAddressInfoEXT *                   pAddressInfos     = {};\n    VULKAN_HPP_NAMESPACE::DeviceFaultVendorInfoEXT *                    pVendorInfos      = {};\n    void *                                                              pVendorBinaryData = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceFaultInfoEXT>\n  {\n    using Type = DeviceFaultInfoEXT;\n  };\n\n  struct DeviceFaultVendorBinaryHeaderVersionOneEXT\n  {\n    using NativeType = VkDeviceFaultVendorBinaryHeaderVersionOneEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultVendorBinaryHeaderVersionOneEXT(\n      uint32_t                                                      headerSize_        = {},\n      VULKAN_HPP_NAMESPACE::DeviceFaultVendorBinaryHeaderVersionEXT headerVersion_     = VULKAN_HPP_NAMESPACE::DeviceFaultVendorBinaryHeaderVersionEXT::eOne,\n      uint32_t                                                      vendorID_          = {},\n      uint32_t                                                      deviceID_          = {},\n      uint32_t                                                      driverVersion_     = {},\n      std::array<uint8_t, VK_UUID_SIZE> const &                     pipelineCacheUUID_ = {},\n      uint32_t                                                      applicationNameOffset_ = {},\n      uint32_t                                                      applicationVersion_    = {},\n      uint32_t                                                      engineNameOffset_      = {},\n      uint32_t                                                      engineVersion_         = {},\n      uint32_t                                                      apiVersion_            = {} ) VULKAN_HPP_NOEXCEPT\n      : headerSize{ headerSize_ }\n      , headerVersion{ headerVersion_ }\n      , vendorID{ vendorID_ }\n      , deviceID{ deviceID_ }\n      , driverVersion{ driverVersion_ }\n      , pipelineCacheUUID{ pipelineCacheUUID_ }\n      , applicationNameOffset{ applicationNameOffset_ }\n      , applicationVersion{ applicationVersion_ }\n      , engineNameOffset{ engineNameOffset_ }\n      , engineVersion{ engineVersion_ }\n      , apiVersion{ apiVersion_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultVendorBinaryHeaderVersionOneEXT( DeviceFaultVendorBinaryHeaderVersionOneEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceFaultVendorBinaryHeaderVersionOneEXT( VkDeviceFaultVendorBinaryHeaderVersionOneEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceFaultVendorBinaryHeaderVersionOneEXT( *reinterpret_cast<DeviceFaultVendorBinaryHeaderVersionOneEXT const *>( &rhs ) )\n    {\n    }\n\n    DeviceFaultVendorBinaryHeaderVersionOneEXT & operator=( DeviceFaultVendorBinaryHeaderVersionOneEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceFaultVendorBinaryHeaderVersionOneEXT & operator=( VkDeviceFaultVendorBinaryHeaderVersionOneEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceFaultVendorBinaryHeaderVersionOneEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultVendorBinaryHeaderVersionOneEXT & setHeaderSize( uint32_t headerSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      headerSize = headerSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultVendorBinaryHeaderVersionOneEXT &\n      setHeaderVersion( VULKAN_HPP_NAMESPACE::DeviceFaultVendorBinaryHeaderVersionEXT headerVersion_ ) VULKAN_HPP_NOEXCEPT\n    {\n      headerVersion = headerVersion_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultVendorBinaryHeaderVersionOneEXT & setVendorID( uint32_t vendorID_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vendorID = vendorID_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultVendorBinaryHeaderVersionOneEXT & setDeviceID( uint32_t deviceID_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceID = deviceID_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultVendorBinaryHeaderVersionOneEXT & setDriverVersion( uint32_t driverVersion_ ) VULKAN_HPP_NOEXCEPT\n    {\n      driverVersion = driverVersion_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultVendorBinaryHeaderVersionOneEXT &\n      setPipelineCacheUUID( std::array<uint8_t, VK_UUID_SIZE> pipelineCacheUUID_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineCacheUUID = pipelineCacheUUID_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultVendorBinaryHeaderVersionOneEXT & setApplicationNameOffset( uint32_t applicationNameOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      applicationNameOffset = applicationNameOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultVendorBinaryHeaderVersionOneEXT & setApplicationVersion( uint32_t applicationVersion_ ) VULKAN_HPP_NOEXCEPT\n    {\n      applicationVersion = applicationVersion_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultVendorBinaryHeaderVersionOneEXT & setEngineNameOffset( uint32_t engineNameOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      engineNameOffset = engineNameOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultVendorBinaryHeaderVersionOneEXT & setEngineVersion( uint32_t engineVersion_ ) VULKAN_HPP_NOEXCEPT\n    {\n      engineVersion = engineVersion_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceFaultVendorBinaryHeaderVersionOneEXT & setApiVersion( uint32_t apiVersion_ ) VULKAN_HPP_NOEXCEPT\n    {\n      apiVersion = apiVersion_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceFaultVendorBinaryHeaderVersionOneEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceFaultVendorBinaryHeaderVersionOneEXT *>( this );\n    }\n\n    operator VkDeviceFaultVendorBinaryHeaderVersionOneEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceFaultVendorBinaryHeaderVersionOneEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &,\n               VULKAN_HPP_NAMESPACE::DeviceFaultVendorBinaryHeaderVersionEXT const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( headerSize,\n                       headerVersion,\n                       vendorID,\n                       deviceID,\n                       driverVersion,\n                       pipelineCacheUUID,\n                       applicationNameOffset,\n                       applicationVersion,\n                       engineNameOffset,\n                       engineVersion,\n                       apiVersion );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceFaultVendorBinaryHeaderVersionOneEXT const & ) const = default;\n#else\n    bool operator==( DeviceFaultVendorBinaryHeaderVersionOneEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( headerSize == rhs.headerSize ) && ( headerVersion == rhs.headerVersion ) && ( vendorID == rhs.vendorID ) && ( deviceID == rhs.deviceID ) &&\n             ( driverVersion == rhs.driverVersion ) && ( pipelineCacheUUID == rhs.pipelineCacheUUID ) &&\n             ( applicationNameOffset == rhs.applicationNameOffset ) && ( applicationVersion == rhs.applicationVersion ) &&\n             ( engineNameOffset == rhs.engineNameOffset ) && ( engineVersion == rhs.engineVersion ) && ( apiVersion == rhs.apiVersion );\n#  endif\n    }\n\n    bool operator!=( DeviceFaultVendorBinaryHeaderVersionOneEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                                                      headerSize            = {};\n    VULKAN_HPP_NAMESPACE::DeviceFaultVendorBinaryHeaderVersionEXT headerVersion         = VULKAN_HPP_NAMESPACE::DeviceFaultVendorBinaryHeaderVersionEXT::eOne;\n    uint32_t                                                      vendorID              = {};\n    uint32_t                                                      deviceID              = {};\n    uint32_t                                                      driverVersion         = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE>   pipelineCacheUUID     = {};\n    uint32_t                                                      applicationNameOffset = {};\n    uint32_t                                                      applicationVersion    = {};\n    uint32_t                                                      engineNameOffset      = {};\n    uint32_t                                                      engineVersion         = {};\n    uint32_t                                                      apiVersion            = {};\n  };\n\n  struct DeviceGroupBindSparseInfo\n  {\n    using NativeType = VkDeviceGroupBindSparseInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceGroupBindSparseInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      DeviceGroupBindSparseInfo( uint32_t resourceDeviceIndex_ = {}, uint32_t memoryDeviceIndex_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , resourceDeviceIndex{ resourceDeviceIndex_ }\n      , memoryDeviceIndex{ memoryDeviceIndex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceGroupBindSparseInfo( DeviceGroupBindSparseInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceGroupBindSparseInfo( VkDeviceGroupBindSparseInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceGroupBindSparseInfo( *reinterpret_cast<DeviceGroupBindSparseInfo const *>( &rhs ) )\n    {\n    }\n\n    DeviceGroupBindSparseInfo & operator=( DeviceGroupBindSparseInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceGroupBindSparseInfo & operator=( VkDeviceGroupBindSparseInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceGroupBindSparseInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupBindSparseInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupBindSparseInfo & setResourceDeviceIndex( uint32_t resourceDeviceIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      resourceDeviceIndex = resourceDeviceIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupBindSparseInfo & setMemoryDeviceIndex( uint32_t memoryDeviceIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memoryDeviceIndex = memoryDeviceIndex_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceGroupBindSparseInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceGroupBindSparseInfo *>( this );\n    }\n\n    operator VkDeviceGroupBindSparseInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceGroupBindSparseInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, resourceDeviceIndex, memoryDeviceIndex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceGroupBindSparseInfo const & ) const = default;\n#else\n    bool operator==( DeviceGroupBindSparseInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( resourceDeviceIndex == rhs.resourceDeviceIndex ) &&\n             ( memoryDeviceIndex == rhs.memoryDeviceIndex );\n#  endif\n    }\n\n    bool operator!=( DeviceGroupBindSparseInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType               = StructureType::eDeviceGroupBindSparseInfo;\n    const void *                        pNext               = {};\n    uint32_t                            resourceDeviceIndex = {};\n    uint32_t                            memoryDeviceIndex   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceGroupBindSparseInfo>\n  {\n    using Type = DeviceGroupBindSparseInfo;\n  };\n\n  using DeviceGroupBindSparseInfoKHR = DeviceGroupBindSparseInfo;\n\n  struct DeviceGroupCommandBufferBeginInfo\n  {\n    using NativeType = VkDeviceGroupCommandBufferBeginInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceGroupCommandBufferBeginInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DeviceGroupCommandBufferBeginInfo( uint32_t deviceMask_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , deviceMask{ deviceMask_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceGroupCommandBufferBeginInfo( DeviceGroupCommandBufferBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceGroupCommandBufferBeginInfo( VkDeviceGroupCommandBufferBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceGroupCommandBufferBeginInfo( *reinterpret_cast<DeviceGroupCommandBufferBeginInfo const *>( &rhs ) )\n    {\n    }\n\n    DeviceGroupCommandBufferBeginInfo & operator=( DeviceGroupCommandBufferBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceGroupCommandBufferBeginInfo & operator=( VkDeviceGroupCommandBufferBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceGroupCommandBufferBeginInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupCommandBufferBeginInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupCommandBufferBeginInfo & setDeviceMask( uint32_t deviceMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceMask = deviceMask_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceGroupCommandBufferBeginInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceGroupCommandBufferBeginInfo *>( this );\n    }\n\n    operator VkDeviceGroupCommandBufferBeginInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceGroupCommandBufferBeginInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, deviceMask );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceGroupCommandBufferBeginInfo const & ) const = default;\n#else\n    bool operator==( DeviceGroupCommandBufferBeginInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( deviceMask == rhs.deviceMask );\n#  endif\n    }\n\n    bool operator!=( DeviceGroupCommandBufferBeginInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType      = StructureType::eDeviceGroupCommandBufferBeginInfo;\n    const void *                        pNext      = {};\n    uint32_t                            deviceMask = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceGroupCommandBufferBeginInfo>\n  {\n    using Type = DeviceGroupCommandBufferBeginInfo;\n  };\n\n  using DeviceGroupCommandBufferBeginInfoKHR = DeviceGroupCommandBufferBeginInfo;\n\n  struct DeviceGroupDeviceCreateInfo\n  {\n    using NativeType = VkDeviceGroupDeviceCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceGroupDeviceCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DeviceGroupDeviceCreateInfo( uint32_t                                     physicalDeviceCount_ = {},\n                                                      const VULKAN_HPP_NAMESPACE::PhysicalDevice * pPhysicalDevices_    = {},\n                                                      const void *                                 pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , physicalDeviceCount{ physicalDeviceCount_ }\n      , pPhysicalDevices{ pPhysicalDevices_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceGroupDeviceCreateInfo( DeviceGroupDeviceCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceGroupDeviceCreateInfo( VkDeviceGroupDeviceCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceGroupDeviceCreateInfo( *reinterpret_cast<DeviceGroupDeviceCreateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DeviceGroupDeviceCreateInfo( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PhysicalDevice> const & physicalDevices_,\n                                 const void *                                                                                      pNext_ = nullptr )\n      : pNext( pNext_ ), physicalDeviceCount( static_cast<uint32_t>( physicalDevices_.size() ) ), pPhysicalDevices( physicalDevices_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    DeviceGroupDeviceCreateInfo & operator=( DeviceGroupDeviceCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceGroupDeviceCreateInfo & operator=( VkDeviceGroupDeviceCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceGroupDeviceCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupDeviceCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupDeviceCreateInfo & setPhysicalDeviceCount( uint32_t physicalDeviceCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      physicalDeviceCount = physicalDeviceCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupDeviceCreateInfo &\n      setPPhysicalDevices( const VULKAN_HPP_NAMESPACE::PhysicalDevice * pPhysicalDevices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPhysicalDevices = pPhysicalDevices_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DeviceGroupDeviceCreateInfo & setPhysicalDevices(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PhysicalDevice> const & physicalDevices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      physicalDeviceCount = static_cast<uint32_t>( physicalDevices_.size() );\n      pPhysicalDevices    = physicalDevices_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceGroupDeviceCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceGroupDeviceCreateInfo *>( this );\n    }\n\n    operator VkDeviceGroupDeviceCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceGroupDeviceCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::PhysicalDevice * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, physicalDeviceCount, pPhysicalDevices );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceGroupDeviceCreateInfo const & ) const = default;\n#else\n    bool operator==( DeviceGroupDeviceCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( physicalDeviceCount == rhs.physicalDeviceCount ) &&\n             ( pPhysicalDevices == rhs.pPhysicalDevices );\n#  endif\n    }\n\n    bool operator!=( DeviceGroupDeviceCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType               = StructureType::eDeviceGroupDeviceCreateInfo;\n    const void *                                 pNext               = {};\n    uint32_t                                     physicalDeviceCount = {};\n    const VULKAN_HPP_NAMESPACE::PhysicalDevice * pPhysicalDevices    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceGroupDeviceCreateInfo>\n  {\n    using Type = DeviceGroupDeviceCreateInfo;\n  };\n\n  using DeviceGroupDeviceCreateInfoKHR = DeviceGroupDeviceCreateInfo;\n\n  struct DeviceGroupPresentCapabilitiesKHR\n  {\n    using NativeType = VkDeviceGroupPresentCapabilitiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceGroupPresentCapabilitiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupPresentCapabilitiesKHR( std::array<uint32_t, VK_MAX_DEVICE_GROUP_SIZE> const & presentMask_ = {},\n                                                               VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR   modes_       = {},\n                                                               void *                                                 pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , presentMask{ presentMask_ }\n      , modes{ modes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupPresentCapabilitiesKHR( DeviceGroupPresentCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceGroupPresentCapabilitiesKHR( VkDeviceGroupPresentCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceGroupPresentCapabilitiesKHR( *reinterpret_cast<DeviceGroupPresentCapabilitiesKHR const *>( &rhs ) )\n    {\n    }\n\n    DeviceGroupPresentCapabilitiesKHR & operator=( DeviceGroupPresentCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceGroupPresentCapabilitiesKHR & operator=( VkDeviceGroupPresentCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceGroupPresentCapabilitiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkDeviceGroupPresentCapabilitiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceGroupPresentCapabilitiesKHR *>( this );\n    }\n\n    operator VkDeviceGroupPresentCapabilitiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceGroupPresentCapabilitiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, VK_MAX_DEVICE_GROUP_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, presentMask, modes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceGroupPresentCapabilitiesKHR const & ) const = default;\n#else\n    bool operator==( DeviceGroupPresentCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( presentMask == rhs.presentMask ) && ( modes == rhs.modes );\n#  endif\n    }\n\n    bool operator!=( DeviceGroupPresentCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                      sType       = StructureType::eDeviceGroupPresentCapabilitiesKHR;\n    void *                                                                   pNext       = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, VK_MAX_DEVICE_GROUP_SIZE> presentMask = {};\n    VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR                     modes       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceGroupPresentCapabilitiesKHR>\n  {\n    using Type = DeviceGroupPresentCapabilitiesKHR;\n  };\n\n  struct DeviceGroupPresentInfoKHR\n  {\n    using NativeType = VkDeviceGroupPresentInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceGroupPresentInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DeviceGroupPresentInfoKHR(\n      uint32_t                                                swapchainCount_ = {},\n      const uint32_t *                                        pDeviceMasks_   = {},\n      VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagBitsKHR mode_           = VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagBitsKHR::eLocal,\n      const void *                                            pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , swapchainCount{ swapchainCount_ }\n      , pDeviceMasks{ pDeviceMasks_ }\n      , mode{ mode_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceGroupPresentInfoKHR( DeviceGroupPresentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceGroupPresentInfoKHR( VkDeviceGroupPresentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceGroupPresentInfoKHR( *reinterpret_cast<DeviceGroupPresentInfoKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DeviceGroupPresentInfoKHR( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & deviceMasks_,\n                               VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagBitsKHR mode_  = VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagBitsKHR::eLocal,\n                               const void *                                            pNext_ = nullptr )\n      : pNext( pNext_ ), swapchainCount( static_cast<uint32_t>( deviceMasks_.size() ) ), pDeviceMasks( deviceMasks_.data() ), mode( mode_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    DeviceGroupPresentInfoKHR & operator=( DeviceGroupPresentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceGroupPresentInfoKHR & operator=( VkDeviceGroupPresentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceGroupPresentInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupPresentInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupPresentInfoKHR & setSwapchainCount( uint32_t swapchainCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      swapchainCount = swapchainCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupPresentInfoKHR & setPDeviceMasks( const uint32_t * pDeviceMasks_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDeviceMasks = pDeviceMasks_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DeviceGroupPresentInfoKHR & setDeviceMasks( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & deviceMasks_ ) VULKAN_HPP_NOEXCEPT\n    {\n      swapchainCount = static_cast<uint32_t>( deviceMasks_.size() );\n      pDeviceMasks   = deviceMasks_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupPresentInfoKHR & setMode( VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagBitsKHR mode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mode = mode_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceGroupPresentInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceGroupPresentInfoKHR *>( this );\n    }\n\n    operator VkDeviceGroupPresentInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceGroupPresentInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const uint32_t * const &,\n               VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagBitsKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, swapchainCount, pDeviceMasks, mode );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceGroupPresentInfoKHR const & ) const = default;\n#else\n    bool operator==( DeviceGroupPresentInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( swapchainCount == rhs.swapchainCount ) && ( pDeviceMasks == rhs.pDeviceMasks ) &&\n             ( mode == rhs.mode );\n#  endif\n    }\n\n    bool operator!=( DeviceGroupPresentInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                     sType          = StructureType::eDeviceGroupPresentInfoKHR;\n    const void *                                            pNext          = {};\n    uint32_t                                                swapchainCount = {};\n    const uint32_t *                                        pDeviceMasks   = {};\n    VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagBitsKHR mode           = VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagBitsKHR::eLocal;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceGroupPresentInfoKHR>\n  {\n    using Type = DeviceGroupPresentInfoKHR;\n  };\n\n  struct DeviceGroupRenderPassBeginInfo\n  {\n    using NativeType = VkDeviceGroupRenderPassBeginInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceGroupRenderPassBeginInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DeviceGroupRenderPassBeginInfo( uint32_t                             deviceMask_            = {},\n                                                         uint32_t                             deviceRenderAreaCount_ = {},\n                                                         const VULKAN_HPP_NAMESPACE::Rect2D * pDeviceRenderAreas_    = {},\n                                                         const void *                         pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , deviceMask{ deviceMask_ }\n      , deviceRenderAreaCount{ deviceRenderAreaCount_ }\n      , pDeviceRenderAreas{ pDeviceRenderAreas_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceGroupRenderPassBeginInfo( DeviceGroupRenderPassBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceGroupRenderPassBeginInfo( VkDeviceGroupRenderPassBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceGroupRenderPassBeginInfo( *reinterpret_cast<DeviceGroupRenderPassBeginInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DeviceGroupRenderPassBeginInfo( uint32_t                                                                                  deviceMask_,\n                                    VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Rect2D> const & deviceRenderAreas_,\n                                    const void *                                                                              pNext_ = nullptr )\n      : pNext( pNext_ )\n      , deviceMask( deviceMask_ )\n      , deviceRenderAreaCount( static_cast<uint32_t>( deviceRenderAreas_.size() ) )\n      , pDeviceRenderAreas( deviceRenderAreas_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    DeviceGroupRenderPassBeginInfo & operator=( DeviceGroupRenderPassBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceGroupRenderPassBeginInfo & operator=( VkDeviceGroupRenderPassBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceGroupRenderPassBeginInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupRenderPassBeginInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupRenderPassBeginInfo & setDeviceMask( uint32_t deviceMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceMask = deviceMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupRenderPassBeginInfo & setDeviceRenderAreaCount( uint32_t deviceRenderAreaCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceRenderAreaCount = deviceRenderAreaCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupRenderPassBeginInfo &\n      setPDeviceRenderAreas( const VULKAN_HPP_NAMESPACE::Rect2D * pDeviceRenderAreas_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDeviceRenderAreas = pDeviceRenderAreas_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DeviceGroupRenderPassBeginInfo &\n      setDeviceRenderAreas( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Rect2D> const & deviceRenderAreas_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceRenderAreaCount = static_cast<uint32_t>( deviceRenderAreas_.size() );\n      pDeviceRenderAreas    = deviceRenderAreas_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceGroupRenderPassBeginInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceGroupRenderPassBeginInfo *>( this );\n    }\n\n    operator VkDeviceGroupRenderPassBeginInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceGroupRenderPassBeginInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::\n      tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::Rect2D * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, deviceMask, deviceRenderAreaCount, pDeviceRenderAreas );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceGroupRenderPassBeginInfo const & ) const = default;\n#else\n    bool operator==( DeviceGroupRenderPassBeginInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( deviceMask == rhs.deviceMask ) && ( deviceRenderAreaCount == rhs.deviceRenderAreaCount ) &&\n             ( pDeviceRenderAreas == rhs.pDeviceRenderAreas );\n#  endif\n    }\n\n    bool operator!=( DeviceGroupRenderPassBeginInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType  sType                 = StructureType::eDeviceGroupRenderPassBeginInfo;\n    const void *                         pNext                 = {};\n    uint32_t                             deviceMask            = {};\n    uint32_t                             deviceRenderAreaCount = {};\n    const VULKAN_HPP_NAMESPACE::Rect2D * pDeviceRenderAreas    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceGroupRenderPassBeginInfo>\n  {\n    using Type = DeviceGroupRenderPassBeginInfo;\n  };\n\n  using DeviceGroupRenderPassBeginInfoKHR = DeviceGroupRenderPassBeginInfo;\n\n  struct DeviceGroupSubmitInfo\n  {\n    using NativeType = VkDeviceGroupSubmitInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceGroupSubmitInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DeviceGroupSubmitInfo( uint32_t         waitSemaphoreCount_            = {},\n                                                const uint32_t * pWaitSemaphoreDeviceIndices_   = {},\n                                                uint32_t         commandBufferCount_            = {},\n                                                const uint32_t * pCommandBufferDeviceMasks_     = {},\n                                                uint32_t         signalSemaphoreCount_          = {},\n                                                const uint32_t * pSignalSemaphoreDeviceIndices_ = {},\n                                                const void *     pNext_                         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , waitSemaphoreCount{ waitSemaphoreCount_ }\n      , pWaitSemaphoreDeviceIndices{ pWaitSemaphoreDeviceIndices_ }\n      , commandBufferCount{ commandBufferCount_ }\n      , pCommandBufferDeviceMasks{ pCommandBufferDeviceMasks_ }\n      , signalSemaphoreCount{ signalSemaphoreCount_ }\n      , pSignalSemaphoreDeviceIndices{ pSignalSemaphoreDeviceIndices_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceGroupSubmitInfo( DeviceGroupSubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceGroupSubmitInfo( VkDeviceGroupSubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceGroupSubmitInfo( *reinterpret_cast<DeviceGroupSubmitInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DeviceGroupSubmitInfo( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & waitSemaphoreDeviceIndices_,\n                           VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & commandBufferDeviceMasks_     = {},\n                           VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & signalSemaphoreDeviceIndices_ = {},\n                           const void *                                                          pNext_                        = nullptr )\n      : pNext( pNext_ )\n      , waitSemaphoreCount( static_cast<uint32_t>( waitSemaphoreDeviceIndices_.size() ) )\n      , pWaitSemaphoreDeviceIndices( waitSemaphoreDeviceIndices_.data() )\n      , commandBufferCount( static_cast<uint32_t>( commandBufferDeviceMasks_.size() ) )\n      , pCommandBufferDeviceMasks( commandBufferDeviceMasks_.data() )\n      , signalSemaphoreCount( static_cast<uint32_t>( signalSemaphoreDeviceIndices_.size() ) )\n      , pSignalSemaphoreDeviceIndices( signalSemaphoreDeviceIndices_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    DeviceGroupSubmitInfo & operator=( DeviceGroupSubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceGroupSubmitInfo & operator=( VkDeviceGroupSubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceGroupSubmitInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupSubmitInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupSubmitInfo & setWaitSemaphoreCount( uint32_t waitSemaphoreCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      waitSemaphoreCount = waitSemaphoreCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupSubmitInfo & setPWaitSemaphoreDeviceIndices( const uint32_t * pWaitSemaphoreDeviceIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pWaitSemaphoreDeviceIndices = pWaitSemaphoreDeviceIndices_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DeviceGroupSubmitInfo &\n      setWaitSemaphoreDeviceIndices( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & waitSemaphoreDeviceIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      waitSemaphoreCount          = static_cast<uint32_t>( waitSemaphoreDeviceIndices_.size() );\n      pWaitSemaphoreDeviceIndices = waitSemaphoreDeviceIndices_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupSubmitInfo & setCommandBufferCount( uint32_t commandBufferCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      commandBufferCount = commandBufferCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupSubmitInfo & setPCommandBufferDeviceMasks( const uint32_t * pCommandBufferDeviceMasks_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pCommandBufferDeviceMasks = pCommandBufferDeviceMasks_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DeviceGroupSubmitInfo &\n      setCommandBufferDeviceMasks( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & commandBufferDeviceMasks_ ) VULKAN_HPP_NOEXCEPT\n    {\n      commandBufferCount        = static_cast<uint32_t>( commandBufferDeviceMasks_.size() );\n      pCommandBufferDeviceMasks = commandBufferDeviceMasks_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupSubmitInfo & setSignalSemaphoreCount( uint32_t signalSemaphoreCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      signalSemaphoreCount = signalSemaphoreCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupSubmitInfo & setPSignalSemaphoreDeviceIndices( const uint32_t * pSignalSemaphoreDeviceIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSignalSemaphoreDeviceIndices = pSignalSemaphoreDeviceIndices_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DeviceGroupSubmitInfo &\n      setSignalSemaphoreDeviceIndices( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & signalSemaphoreDeviceIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      signalSemaphoreCount          = static_cast<uint32_t>( signalSemaphoreDeviceIndices_.size() );\n      pSignalSemaphoreDeviceIndices = signalSemaphoreDeviceIndices_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceGroupSubmitInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceGroupSubmitInfo *>( this );\n    }\n\n    operator VkDeviceGroupSubmitInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceGroupSubmitInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const uint32_t * const &,\n               uint32_t const &,\n               const uint32_t * const &,\n               uint32_t const &,\n               const uint32_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       waitSemaphoreCount,\n                       pWaitSemaphoreDeviceIndices,\n                       commandBufferCount,\n                       pCommandBufferDeviceMasks,\n                       signalSemaphoreCount,\n                       pSignalSemaphoreDeviceIndices );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceGroupSubmitInfo const & ) const = default;\n#else\n    bool operator==( DeviceGroupSubmitInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( waitSemaphoreCount == rhs.waitSemaphoreCount ) &&\n             ( pWaitSemaphoreDeviceIndices == rhs.pWaitSemaphoreDeviceIndices ) && ( commandBufferCount == rhs.commandBufferCount ) &&\n             ( pCommandBufferDeviceMasks == rhs.pCommandBufferDeviceMasks ) && ( signalSemaphoreCount == rhs.signalSemaphoreCount ) &&\n             ( pSignalSemaphoreDeviceIndices == rhs.pSignalSemaphoreDeviceIndices );\n#  endif\n    }\n\n    bool operator!=( DeviceGroupSubmitInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                         = StructureType::eDeviceGroupSubmitInfo;\n    const void *                        pNext                         = {};\n    uint32_t                            waitSemaphoreCount            = {};\n    const uint32_t *                    pWaitSemaphoreDeviceIndices   = {};\n    uint32_t                            commandBufferCount            = {};\n    const uint32_t *                    pCommandBufferDeviceMasks     = {};\n    uint32_t                            signalSemaphoreCount          = {};\n    const uint32_t *                    pSignalSemaphoreDeviceIndices = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceGroupSubmitInfo>\n  {\n    using Type = DeviceGroupSubmitInfo;\n  };\n\n  using DeviceGroupSubmitInfoKHR = DeviceGroupSubmitInfo;\n\n  struct DeviceGroupSwapchainCreateInfoKHR\n  {\n    using NativeType = VkDeviceGroupSwapchainCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceGroupSwapchainCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DeviceGroupSwapchainCreateInfoKHR( VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR modes_ = {},\n                                                            const void *                                         pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , modes{ modes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceGroupSwapchainCreateInfoKHR( DeviceGroupSwapchainCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceGroupSwapchainCreateInfoKHR( VkDeviceGroupSwapchainCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceGroupSwapchainCreateInfoKHR( *reinterpret_cast<DeviceGroupSwapchainCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    DeviceGroupSwapchainCreateInfoKHR & operator=( DeviceGroupSwapchainCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceGroupSwapchainCreateInfoKHR & operator=( VkDeviceGroupSwapchainCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceGroupSwapchainCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupSwapchainCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceGroupSwapchainCreateInfoKHR & setModes( VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR modes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      modes = modes_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceGroupSwapchainCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceGroupSwapchainCreateInfoKHR *>( this );\n    }\n\n    operator VkDeviceGroupSwapchainCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceGroupSwapchainCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, modes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceGroupSwapchainCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( DeviceGroupSwapchainCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( modes == rhs.modes );\n#  endif\n    }\n\n    bool operator!=( DeviceGroupSwapchainCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                  sType = StructureType::eDeviceGroupSwapchainCreateInfoKHR;\n    const void *                                         pNext = {};\n    VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR modes = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceGroupSwapchainCreateInfoKHR>\n  {\n    using Type = DeviceGroupSwapchainCreateInfoKHR;\n  };\n\n  struct ImageCreateInfo\n  {\n    using NativeType = VkImageCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageCreateInfo( VULKAN_HPP_NAMESPACE::ImageCreateFlags    flags_                 = {},\n                                          VULKAN_HPP_NAMESPACE::ImageType           imageType_             = VULKAN_HPP_NAMESPACE::ImageType::e1D,\n                                          VULKAN_HPP_NAMESPACE::Format              format_                = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                          VULKAN_HPP_NAMESPACE::Extent3D            extent_                = {},\n                                          uint32_t                                  mipLevels_             = {},\n                                          uint32_t                                  arrayLayers_           = {},\n                                          VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples_               = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1,\n                                          VULKAN_HPP_NAMESPACE::ImageTiling         tiling_                = VULKAN_HPP_NAMESPACE::ImageTiling::eOptimal,\n                                          VULKAN_HPP_NAMESPACE::ImageUsageFlags     usage_                 = {},\n                                          VULKAN_HPP_NAMESPACE::SharingMode         sharingMode_           = VULKAN_HPP_NAMESPACE::SharingMode::eExclusive,\n                                          uint32_t                                  queueFamilyIndexCount_ = {},\n                                          const uint32_t *                          pQueueFamilyIndices_   = {},\n                                          VULKAN_HPP_NAMESPACE::ImageLayout         initialLayout_         = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                          const void *                              pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , imageType{ imageType_ }\n      , format{ format_ }\n      , extent{ extent_ }\n      , mipLevels{ mipLevels_ }\n      , arrayLayers{ arrayLayers_ }\n      , samples{ samples_ }\n      , tiling{ tiling_ }\n      , usage{ usage_ }\n      , sharingMode{ sharingMode_ }\n      , queueFamilyIndexCount{ queueFamilyIndexCount_ }\n      , pQueueFamilyIndices{ pQueueFamilyIndices_ }\n      , initialLayout{ initialLayout_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageCreateInfo( ImageCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageCreateInfo( VkImageCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT : ImageCreateInfo( *reinterpret_cast<ImageCreateInfo const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ImageCreateInfo( VULKAN_HPP_NAMESPACE::ImageCreateFlags                                flags_,\n                     VULKAN_HPP_NAMESPACE::ImageType                                       imageType_,\n                     VULKAN_HPP_NAMESPACE::Format                                          format_,\n                     VULKAN_HPP_NAMESPACE::Extent3D                                        extent_,\n                     uint32_t                                                              mipLevels_,\n                     uint32_t                                                              arrayLayers_,\n                     VULKAN_HPP_NAMESPACE::SampleCountFlagBits                             samples_,\n                     VULKAN_HPP_NAMESPACE::ImageTiling                                     tiling_,\n                     VULKAN_HPP_NAMESPACE::ImageUsageFlags                                 usage_,\n                     VULKAN_HPP_NAMESPACE::SharingMode                                     sharingMode_,\n                     VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & queueFamilyIndices_,\n                     VULKAN_HPP_NAMESPACE::ImageLayout                                     initialLayout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                     const void *                                                          pNext_         = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , imageType( imageType_ )\n      , format( format_ )\n      , extent( extent_ )\n      , mipLevels( mipLevels_ )\n      , arrayLayers( arrayLayers_ )\n      , samples( samples_ )\n      , tiling( tiling_ )\n      , usage( usage_ )\n      , sharingMode( sharingMode_ )\n      , queueFamilyIndexCount( static_cast<uint32_t>( queueFamilyIndices_.size() ) )\n      , pQueueFamilyIndices( queueFamilyIndices_.data() )\n      , initialLayout( initialLayout_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    ImageCreateInfo & operator=( ImageCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageCreateInfo & operator=( VkImageCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::ImageCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCreateInfo & setImageType( VULKAN_HPP_NAMESPACE::ImageType imageType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageType = imageType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCreateInfo & setFormat( VULKAN_HPP_NAMESPACE::Format format_ ) VULKAN_HPP_NOEXCEPT\n    {\n      format = format_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCreateInfo & setExtent( VULKAN_HPP_NAMESPACE::Extent3D const & extent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extent = extent_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCreateInfo & setMipLevels( uint32_t mipLevels_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mipLevels = mipLevels_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCreateInfo & setArrayLayers( uint32_t arrayLayers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      arrayLayers = arrayLayers_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCreateInfo & setSamples( VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples_ ) VULKAN_HPP_NOEXCEPT\n    {\n      samples = samples_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCreateInfo & setTiling( VULKAN_HPP_NAMESPACE::ImageTiling tiling_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tiling = tiling_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCreateInfo & setUsage( VULKAN_HPP_NAMESPACE::ImageUsageFlags usage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      usage = usage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCreateInfo & setSharingMode( VULKAN_HPP_NAMESPACE::SharingMode sharingMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sharingMode = sharingMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCreateInfo & setQueueFamilyIndexCount( uint32_t queueFamilyIndexCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queueFamilyIndexCount = queueFamilyIndexCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCreateInfo & setPQueueFamilyIndices( const uint32_t * pQueueFamilyIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pQueueFamilyIndices = pQueueFamilyIndices_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ImageCreateInfo & setQueueFamilyIndices( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & queueFamilyIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queueFamilyIndexCount = static_cast<uint32_t>( queueFamilyIndices_.size() );\n      pQueueFamilyIndices   = queueFamilyIndices_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCreateInfo & setInitialLayout( VULKAN_HPP_NAMESPACE::ImageLayout initialLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      initialLayout = initialLayout_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageCreateInfo *>( this );\n    }\n\n    operator VkImageCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ImageCreateFlags const &,\n               VULKAN_HPP_NAMESPACE::ImageType const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::Extent3D const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlagBits const &,\n               VULKAN_HPP_NAMESPACE::ImageTiling const &,\n               VULKAN_HPP_NAMESPACE::ImageUsageFlags const &,\n               VULKAN_HPP_NAMESPACE::SharingMode const &,\n               uint32_t const &,\n               const uint32_t * const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       flags,\n                       imageType,\n                       format,\n                       extent,\n                       mipLevels,\n                       arrayLayers,\n                       samples,\n                       tiling,\n                       usage,\n                       sharingMode,\n                       queueFamilyIndexCount,\n                       pQueueFamilyIndices,\n                       initialLayout );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageCreateInfo const & ) const = default;\n#else\n    bool operator==( ImageCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( imageType == rhs.imageType ) && ( format == rhs.format ) &&\n             ( extent == rhs.extent ) && ( mipLevels == rhs.mipLevels ) && ( arrayLayers == rhs.arrayLayers ) && ( samples == rhs.samples ) &&\n             ( tiling == rhs.tiling ) && ( usage == rhs.usage ) && ( sharingMode == rhs.sharingMode ) &&\n             ( queueFamilyIndexCount == rhs.queueFamilyIndexCount ) && ( pQueueFamilyIndices == rhs.pQueueFamilyIndices ) &&\n             ( initialLayout == rhs.initialLayout );\n#  endif\n    }\n\n    bool operator!=( ImageCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType                 = StructureType::eImageCreateInfo;\n    const void *                              pNext                 = {};\n    VULKAN_HPP_NAMESPACE::ImageCreateFlags    flags                 = {};\n    VULKAN_HPP_NAMESPACE::ImageType           imageType             = VULKAN_HPP_NAMESPACE::ImageType::e1D;\n    VULKAN_HPP_NAMESPACE::Format              format                = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::Extent3D            extent                = {};\n    uint32_t                                  mipLevels             = {};\n    uint32_t                                  arrayLayers           = {};\n    VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples               = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1;\n    VULKAN_HPP_NAMESPACE::ImageTiling         tiling                = VULKAN_HPP_NAMESPACE::ImageTiling::eOptimal;\n    VULKAN_HPP_NAMESPACE::ImageUsageFlags     usage                 = {};\n    VULKAN_HPP_NAMESPACE::SharingMode         sharingMode           = VULKAN_HPP_NAMESPACE::SharingMode::eExclusive;\n    uint32_t                                  queueFamilyIndexCount = {};\n    const uint32_t *                          pQueueFamilyIndices   = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout         initialLayout         = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageCreateInfo>\n  {\n    using Type = ImageCreateInfo;\n  };\n\n  struct DeviceImageMemoryRequirements\n  {\n    using NativeType = VkDeviceImageMemoryRequirements;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceImageMemoryRequirements;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      DeviceImageMemoryRequirements( const VULKAN_HPP_NAMESPACE::ImageCreateInfo * pCreateInfo_ = {},\n                                     VULKAN_HPP_NAMESPACE::ImageAspectFlagBits     planeAspect_ = VULKAN_HPP_NAMESPACE::ImageAspectFlagBits::eColor,\n                                     const void *                                  pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pCreateInfo{ pCreateInfo_ }\n      , planeAspect{ planeAspect_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceImageMemoryRequirements( DeviceImageMemoryRequirements const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceImageMemoryRequirements( VkDeviceImageMemoryRequirements const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceImageMemoryRequirements( *reinterpret_cast<DeviceImageMemoryRequirements const *>( &rhs ) )\n    {\n    }\n\n    DeviceImageMemoryRequirements & operator=( DeviceImageMemoryRequirements const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceImageMemoryRequirements & operator=( VkDeviceImageMemoryRequirements const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceImageMemoryRequirements & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceImageMemoryRequirements & setPCreateInfo( const VULKAN_HPP_NAMESPACE::ImageCreateInfo * pCreateInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pCreateInfo = pCreateInfo_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceImageMemoryRequirements & setPlaneAspect( VULKAN_HPP_NAMESPACE::ImageAspectFlagBits planeAspect_ ) VULKAN_HPP_NOEXCEPT\n    {\n      planeAspect = planeAspect_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceImageMemoryRequirements const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceImageMemoryRequirements *>( this );\n    }\n\n    operator VkDeviceImageMemoryRequirements &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceImageMemoryRequirements *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               const VULKAN_HPP_NAMESPACE::ImageCreateInfo * const &,\n               VULKAN_HPP_NAMESPACE::ImageAspectFlagBits const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pCreateInfo, planeAspect );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceImageMemoryRequirements const & ) const = default;\n#else\n    bool operator==( DeviceImageMemoryRequirements const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pCreateInfo == rhs.pCreateInfo ) && ( planeAspect == rhs.planeAspect );\n#  endif\n    }\n\n    bool operator!=( DeviceImageMemoryRequirements const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType           sType       = StructureType::eDeviceImageMemoryRequirements;\n    const void *                                  pNext       = {};\n    const VULKAN_HPP_NAMESPACE::ImageCreateInfo * pCreateInfo = {};\n    VULKAN_HPP_NAMESPACE::ImageAspectFlagBits     planeAspect = VULKAN_HPP_NAMESPACE::ImageAspectFlagBits::eColor;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceImageMemoryRequirements>\n  {\n    using Type = DeviceImageMemoryRequirements;\n  };\n\n  using DeviceImageMemoryRequirementsKHR = DeviceImageMemoryRequirements;\n\n  struct ImageSubresource2\n  {\n    using NativeType = VkImageSubresource2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageSubresource2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageSubresource2( VULKAN_HPP_NAMESPACE::ImageSubresource imageSubresource_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , imageSubresource{ imageSubresource_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageSubresource2( ImageSubresource2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageSubresource2( VkImageSubresource2 const & rhs ) VULKAN_HPP_NOEXCEPT : ImageSubresource2( *reinterpret_cast<ImageSubresource2 const *>( &rhs ) ) {}\n\n    ImageSubresource2 & operator=( ImageSubresource2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageSubresource2 & operator=( VkImageSubresource2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageSubresource2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageSubresource2 & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageSubresource2 & setImageSubresource( VULKAN_HPP_NAMESPACE::ImageSubresource const & imageSubresource_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageSubresource = imageSubresource_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageSubresource2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageSubresource2 *>( this );\n    }\n\n    operator VkImageSubresource2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageSubresource2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::ImageSubresource const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, imageSubresource );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageSubresource2 const & ) const = default;\n#else\n    bool operator==( ImageSubresource2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( imageSubresource == rhs.imageSubresource );\n#  endif\n    }\n\n    bool operator!=( ImageSubresource2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType            = StructureType::eImageSubresource2;\n    void *                                 pNext            = {};\n    VULKAN_HPP_NAMESPACE::ImageSubresource imageSubresource = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageSubresource2>\n  {\n    using Type = ImageSubresource2;\n  };\n\n  using ImageSubresource2EXT = ImageSubresource2;\n  using ImageSubresource2KHR = ImageSubresource2;\n\n  struct DeviceImageSubresourceInfo\n  {\n    using NativeType = VkDeviceImageSubresourceInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceImageSubresourceInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DeviceImageSubresourceInfo( const VULKAN_HPP_NAMESPACE::ImageCreateInfo *   pCreateInfo_  = {},\n                                                     const VULKAN_HPP_NAMESPACE::ImageSubresource2 * pSubresource_ = {},\n                                                     const void *                                    pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pCreateInfo{ pCreateInfo_ }\n      , pSubresource{ pSubresource_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceImageSubresourceInfo( DeviceImageSubresourceInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceImageSubresourceInfo( VkDeviceImageSubresourceInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceImageSubresourceInfo( *reinterpret_cast<DeviceImageSubresourceInfo const *>( &rhs ) )\n    {\n    }\n\n    DeviceImageSubresourceInfo & operator=( DeviceImageSubresourceInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceImageSubresourceInfo & operator=( VkDeviceImageSubresourceInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceImageSubresourceInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceImageSubresourceInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceImageSubresourceInfo & setPCreateInfo( const VULKAN_HPP_NAMESPACE::ImageCreateInfo * pCreateInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pCreateInfo = pCreateInfo_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceImageSubresourceInfo & setPSubresource( const VULKAN_HPP_NAMESPACE::ImageSubresource2 * pSubresource_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSubresource = pSubresource_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceImageSubresourceInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceImageSubresourceInfo *>( this );\n    }\n\n    operator VkDeviceImageSubresourceInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceImageSubresourceInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               const VULKAN_HPP_NAMESPACE::ImageCreateInfo * const &,\n               const VULKAN_HPP_NAMESPACE::ImageSubresource2 * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pCreateInfo, pSubresource );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceImageSubresourceInfo const & ) const = default;\n#else\n    bool operator==( DeviceImageSubresourceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pCreateInfo == rhs.pCreateInfo ) && ( pSubresource == rhs.pSubresource );\n#  endif\n    }\n\n    bool operator!=( DeviceImageSubresourceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType             sType        = StructureType::eDeviceImageSubresourceInfo;\n    const void *                                    pNext        = {};\n    const VULKAN_HPP_NAMESPACE::ImageCreateInfo *   pCreateInfo  = {};\n    const VULKAN_HPP_NAMESPACE::ImageSubresource2 * pSubresource = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceImageSubresourceInfo>\n  {\n    using Type = DeviceImageSubresourceInfo;\n  };\n\n  using DeviceImageSubresourceInfoKHR = DeviceImageSubresourceInfo;\n\n  struct DeviceMemoryOpaqueCaptureAddressInfo\n  {\n    using NativeType = VkDeviceMemoryOpaqueCaptureAddressInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceMemoryOpaqueCaptureAddressInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DeviceMemoryOpaqueCaptureAddressInfo( VULKAN_HPP_NAMESPACE::DeviceMemory memory_ = {},\n                                                               const void *                       pNext_  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , memory{ memory_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceMemoryOpaqueCaptureAddressInfo( DeviceMemoryOpaqueCaptureAddressInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceMemoryOpaqueCaptureAddressInfo( VkDeviceMemoryOpaqueCaptureAddressInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceMemoryOpaqueCaptureAddressInfo( *reinterpret_cast<DeviceMemoryOpaqueCaptureAddressInfo const *>( &rhs ) )\n    {\n    }\n\n    DeviceMemoryOpaqueCaptureAddressInfo & operator=( DeviceMemoryOpaqueCaptureAddressInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceMemoryOpaqueCaptureAddressInfo & operator=( VkDeviceMemoryOpaqueCaptureAddressInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceMemoryOpaqueCaptureAddressInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceMemoryOpaqueCaptureAddressInfo & setMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memory = memory_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceMemoryOpaqueCaptureAddressInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceMemoryOpaqueCaptureAddressInfo *>( this );\n    }\n\n    operator VkDeviceMemoryOpaqueCaptureAddressInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceMemoryOpaqueCaptureAddressInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::DeviceMemory const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, memory );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceMemoryOpaqueCaptureAddressInfo const & ) const = default;\n#else\n    bool operator==( DeviceMemoryOpaqueCaptureAddressInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memory == rhs.memory );\n#  endif\n    }\n\n    bool operator!=( DeviceMemoryOpaqueCaptureAddressInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType  = StructureType::eDeviceMemoryOpaqueCaptureAddressInfo;\n    const void *                        pNext  = {};\n    VULKAN_HPP_NAMESPACE::DeviceMemory  memory = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceMemoryOpaqueCaptureAddressInfo>\n  {\n    using Type = DeviceMemoryOpaqueCaptureAddressInfo;\n  };\n\n  using DeviceMemoryOpaqueCaptureAddressInfoKHR = DeviceMemoryOpaqueCaptureAddressInfo;\n\n  struct DeviceMemoryOverallocationCreateInfoAMD\n  {\n    using NativeType = VkDeviceMemoryOverallocationCreateInfoAMD;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceMemoryOverallocationCreateInfoAMD;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DeviceMemoryOverallocationCreateInfoAMD(\n      VULKAN_HPP_NAMESPACE::MemoryOverallocationBehaviorAMD overallocationBehavior_ = VULKAN_HPP_NAMESPACE::MemoryOverallocationBehaviorAMD::eDefault,\n      const void *                                          pNext_                  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , overallocationBehavior{ overallocationBehavior_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceMemoryOverallocationCreateInfoAMD( DeviceMemoryOverallocationCreateInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceMemoryOverallocationCreateInfoAMD( VkDeviceMemoryOverallocationCreateInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceMemoryOverallocationCreateInfoAMD( *reinterpret_cast<DeviceMemoryOverallocationCreateInfoAMD const *>( &rhs ) )\n    {\n    }\n\n    DeviceMemoryOverallocationCreateInfoAMD & operator=( DeviceMemoryOverallocationCreateInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceMemoryOverallocationCreateInfoAMD & operator=( VkDeviceMemoryOverallocationCreateInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceMemoryOverallocationCreateInfoAMD const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceMemoryOverallocationCreateInfoAMD & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceMemoryOverallocationCreateInfoAMD &\n      setOverallocationBehavior( VULKAN_HPP_NAMESPACE::MemoryOverallocationBehaviorAMD overallocationBehavior_ ) VULKAN_HPP_NOEXCEPT\n    {\n      overallocationBehavior = overallocationBehavior_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceMemoryOverallocationCreateInfoAMD const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceMemoryOverallocationCreateInfoAMD *>( this );\n    }\n\n    operator VkDeviceMemoryOverallocationCreateInfoAMD &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceMemoryOverallocationCreateInfoAMD *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::MemoryOverallocationBehaviorAMD const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, overallocationBehavior );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceMemoryOverallocationCreateInfoAMD const & ) const = default;\n#else\n    bool operator==( DeviceMemoryOverallocationCreateInfoAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( overallocationBehavior == rhs.overallocationBehavior );\n#  endif\n    }\n\n    bool operator!=( DeviceMemoryOverallocationCreateInfoAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                   sType                  = StructureType::eDeviceMemoryOverallocationCreateInfoAMD;\n    const void *                                          pNext                  = {};\n    VULKAN_HPP_NAMESPACE::MemoryOverallocationBehaviorAMD overallocationBehavior = VULKAN_HPP_NAMESPACE::MemoryOverallocationBehaviorAMD::eDefault;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceMemoryOverallocationCreateInfoAMD>\n  {\n    using Type = DeviceMemoryOverallocationCreateInfoAMD;\n  };\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  union DeviceOrHostAddressConstAMDX\n  {\n    using NativeType = VkDeviceOrHostAddressConstAMDX;\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceOrHostAddressConstAMDX( VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress_ = {} ) : deviceAddress( deviceAddress_ ) {}\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceOrHostAddressConstAMDX( const void * hostAddress_ ) : hostAddress( hostAddress_ ) {}\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_UNION_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceOrHostAddressConstAMDX & setDeviceAddress( VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceAddress = deviceAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceOrHostAddressConstAMDX & setHostAddress( const void * hostAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      hostAddress = hostAddress_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceOrHostAddressConstAMDX const &() const\n    {\n      return *reinterpret_cast<const VkDeviceOrHostAddressConstAMDX *>( this );\n    }\n\n    operator VkDeviceOrHostAddressConstAMDX &()\n    {\n      return *reinterpret_cast<VkDeviceOrHostAddressConstAMDX *>( this );\n    }\n\n#  ifdef VULKAN_HPP_HAS_UNRESTRICTED_UNIONS\n    VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress;\n    const void *                        hostAddress;\n#  else\n    VkDeviceAddress deviceAddress;\n    const void *    hostAddress;\n#  endif /*VULKAN_HPP_HAS_UNRESTRICTED_UNIONS*/\n  };\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  struct DevicePipelineBinaryInternalCacheControlKHR\n  {\n    using NativeType = VkDevicePipelineBinaryInternalCacheControlKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDevicePipelineBinaryInternalCacheControlKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DevicePipelineBinaryInternalCacheControlKHR( VULKAN_HPP_NAMESPACE::Bool32 disableInternalCache_ = {},\n                                                                      const void *                 pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , disableInternalCache{ disableInternalCache_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DevicePipelineBinaryInternalCacheControlKHR( DevicePipelineBinaryInternalCacheControlKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DevicePipelineBinaryInternalCacheControlKHR( VkDevicePipelineBinaryInternalCacheControlKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DevicePipelineBinaryInternalCacheControlKHR( *reinterpret_cast<DevicePipelineBinaryInternalCacheControlKHR const *>( &rhs ) )\n    {\n    }\n\n    DevicePipelineBinaryInternalCacheControlKHR & operator=( DevicePipelineBinaryInternalCacheControlKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DevicePipelineBinaryInternalCacheControlKHR & operator=( VkDevicePipelineBinaryInternalCacheControlKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DevicePipelineBinaryInternalCacheControlKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DevicePipelineBinaryInternalCacheControlKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DevicePipelineBinaryInternalCacheControlKHR &\n      setDisableInternalCache( VULKAN_HPP_NAMESPACE::Bool32 disableInternalCache_ ) VULKAN_HPP_NOEXCEPT\n    {\n      disableInternalCache = disableInternalCache_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDevicePipelineBinaryInternalCacheControlKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDevicePipelineBinaryInternalCacheControlKHR *>( this );\n    }\n\n    operator VkDevicePipelineBinaryInternalCacheControlKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDevicePipelineBinaryInternalCacheControlKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, disableInternalCache );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DevicePipelineBinaryInternalCacheControlKHR const & ) const = default;\n#else\n    bool operator==( DevicePipelineBinaryInternalCacheControlKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( disableInternalCache == rhs.disableInternalCache );\n#  endif\n    }\n\n    bool operator!=( DevicePipelineBinaryInternalCacheControlKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                = StructureType::eDevicePipelineBinaryInternalCacheControlKHR;\n    const void *                        pNext                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        disableInternalCache = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDevicePipelineBinaryInternalCacheControlKHR>\n  {\n    using Type = DevicePipelineBinaryInternalCacheControlKHR;\n  };\n\n  struct DevicePrivateDataCreateInfo\n  {\n    using NativeType = VkDevicePrivateDataCreateInfo;\n\n    static const bool                                  allowDuplicate = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDevicePrivateDataCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DevicePrivateDataCreateInfo( uint32_t privateDataSlotRequestCount_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , privateDataSlotRequestCount{ privateDataSlotRequestCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DevicePrivateDataCreateInfo( DevicePrivateDataCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DevicePrivateDataCreateInfo( VkDevicePrivateDataCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DevicePrivateDataCreateInfo( *reinterpret_cast<DevicePrivateDataCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    DevicePrivateDataCreateInfo & operator=( DevicePrivateDataCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DevicePrivateDataCreateInfo & operator=( VkDevicePrivateDataCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DevicePrivateDataCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DevicePrivateDataCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DevicePrivateDataCreateInfo & setPrivateDataSlotRequestCount( uint32_t privateDataSlotRequestCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      privateDataSlotRequestCount = privateDataSlotRequestCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDevicePrivateDataCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDevicePrivateDataCreateInfo *>( this );\n    }\n\n    operator VkDevicePrivateDataCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDevicePrivateDataCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, privateDataSlotRequestCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DevicePrivateDataCreateInfo const & ) const = default;\n#else\n    bool operator==( DevicePrivateDataCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( privateDataSlotRequestCount == rhs.privateDataSlotRequestCount );\n#  endif\n    }\n\n    bool operator!=( DevicePrivateDataCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                       = StructureType::eDevicePrivateDataCreateInfo;\n    const void *                        pNext                       = {};\n    uint32_t                            privateDataSlotRequestCount = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDevicePrivateDataCreateInfo>\n  {\n    using Type = DevicePrivateDataCreateInfo;\n  };\n\n  using DevicePrivateDataCreateInfoEXT = DevicePrivateDataCreateInfo;\n\n  struct DeviceQueueGlobalPriorityCreateInfo\n  {\n    using NativeType = VkDeviceQueueGlobalPriorityCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceQueueGlobalPriorityCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      DeviceQueueGlobalPriorityCreateInfo( VULKAN_HPP_NAMESPACE::QueueGlobalPriority globalPriority_ = VULKAN_HPP_NAMESPACE::QueueGlobalPriority::eLow,\n                                           const void *                              pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , globalPriority{ globalPriority_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceQueueGlobalPriorityCreateInfo( DeviceQueueGlobalPriorityCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceQueueGlobalPriorityCreateInfo( VkDeviceQueueGlobalPriorityCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceQueueGlobalPriorityCreateInfo( *reinterpret_cast<DeviceQueueGlobalPriorityCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    DeviceQueueGlobalPriorityCreateInfo & operator=( DeviceQueueGlobalPriorityCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceQueueGlobalPriorityCreateInfo & operator=( VkDeviceQueueGlobalPriorityCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceQueueGlobalPriorityCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceQueueGlobalPriorityCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceQueueGlobalPriorityCreateInfo &\n      setGlobalPriority( VULKAN_HPP_NAMESPACE::QueueGlobalPriority globalPriority_ ) VULKAN_HPP_NOEXCEPT\n    {\n      globalPriority = globalPriority_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceQueueGlobalPriorityCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceQueueGlobalPriorityCreateInfo *>( this );\n    }\n\n    operator VkDeviceQueueGlobalPriorityCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceQueueGlobalPriorityCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::QueueGlobalPriority const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, globalPriority );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceQueueGlobalPriorityCreateInfo const & ) const = default;\n#else\n    bool operator==( DeviceQueueGlobalPriorityCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( globalPriority == rhs.globalPriority );\n#  endif\n    }\n\n    bool operator!=( DeviceQueueGlobalPriorityCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType          = StructureType::eDeviceQueueGlobalPriorityCreateInfo;\n    const void *                              pNext          = {};\n    VULKAN_HPP_NAMESPACE::QueueGlobalPriority globalPriority = VULKAN_HPP_NAMESPACE::QueueGlobalPriority::eLow;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceQueueGlobalPriorityCreateInfo>\n  {\n    using Type = DeviceQueueGlobalPriorityCreateInfo;\n  };\n\n  using DeviceQueueGlobalPriorityCreateInfoEXT = DeviceQueueGlobalPriorityCreateInfo;\n  using DeviceQueueGlobalPriorityCreateInfoKHR = DeviceQueueGlobalPriorityCreateInfo;\n\n  struct DeviceQueueInfo2\n  {\n    using NativeType = VkDeviceQueueInfo2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceQueueInfo2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DeviceQueueInfo2( VULKAN_HPP_NAMESPACE::DeviceQueueCreateFlags flags_            = {},\n                                           uint32_t                                     queueFamilyIndex_ = {},\n                                           uint32_t                                     queueIndex_       = {},\n                                           const void *                                 pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , queueFamilyIndex{ queueFamilyIndex_ }\n      , queueIndex{ queueIndex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceQueueInfo2( DeviceQueueInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceQueueInfo2( VkDeviceQueueInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT : DeviceQueueInfo2( *reinterpret_cast<DeviceQueueInfo2 const *>( &rhs ) ) {}\n\n    DeviceQueueInfo2 & operator=( DeviceQueueInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceQueueInfo2 & operator=( VkDeviceQueueInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceQueueInfo2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceQueueInfo2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceQueueInfo2 & setFlags( VULKAN_HPP_NAMESPACE::DeviceQueueCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceQueueInfo2 & setQueueFamilyIndex( uint32_t queueFamilyIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queueFamilyIndex = queueFamilyIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceQueueInfo2 & setQueueIndex( uint32_t queueIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queueIndex = queueIndex_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceQueueInfo2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceQueueInfo2 *>( this );\n    }\n\n    operator VkDeviceQueueInfo2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceQueueInfo2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceQueueCreateFlags const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, queueFamilyIndex, queueIndex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceQueueInfo2 const & ) const = default;\n#else\n    bool operator==( DeviceQueueInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( queueFamilyIndex == rhs.queueFamilyIndex ) &&\n             ( queueIndex == rhs.queueIndex );\n#  endif\n    }\n\n    bool operator!=( DeviceQueueInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType            = StructureType::eDeviceQueueInfo2;\n    const void *                                 pNext            = {};\n    VULKAN_HPP_NAMESPACE::DeviceQueueCreateFlags flags            = {};\n    uint32_t                                     queueFamilyIndex = {};\n    uint32_t                                     queueIndex       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceQueueInfo2>\n  {\n    using Type = DeviceQueueInfo2;\n  };\n\n  struct DeviceQueueShaderCoreControlCreateInfoARM\n  {\n    using NativeType = VkDeviceQueueShaderCoreControlCreateInfoARM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDeviceQueueShaderCoreControlCreateInfoARM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DeviceQueueShaderCoreControlCreateInfoARM( uint32_t shaderCoreCount_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderCoreCount{ shaderCoreCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DeviceQueueShaderCoreControlCreateInfoARM( DeviceQueueShaderCoreControlCreateInfoARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DeviceQueueShaderCoreControlCreateInfoARM( VkDeviceQueueShaderCoreControlCreateInfoARM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DeviceQueueShaderCoreControlCreateInfoARM( *reinterpret_cast<DeviceQueueShaderCoreControlCreateInfoARM const *>( &rhs ) )\n    {\n    }\n\n    DeviceQueueShaderCoreControlCreateInfoARM & operator=( DeviceQueueShaderCoreControlCreateInfoARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DeviceQueueShaderCoreControlCreateInfoARM & operator=( VkDeviceQueueShaderCoreControlCreateInfoARM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DeviceQueueShaderCoreControlCreateInfoARM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DeviceQueueShaderCoreControlCreateInfoARM & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DeviceQueueShaderCoreControlCreateInfoARM & setShaderCoreCount( uint32_t shaderCoreCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderCoreCount = shaderCoreCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDeviceQueueShaderCoreControlCreateInfoARM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDeviceQueueShaderCoreControlCreateInfoARM *>( this );\n    }\n\n    operator VkDeviceQueueShaderCoreControlCreateInfoARM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDeviceQueueShaderCoreControlCreateInfoARM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderCoreCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DeviceQueueShaderCoreControlCreateInfoARM const & ) const = default;\n#else\n    bool operator==( DeviceQueueShaderCoreControlCreateInfoARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderCoreCount == rhs.shaderCoreCount );\n#  endif\n    }\n\n    bool operator!=( DeviceQueueShaderCoreControlCreateInfoARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType           = StructureType::eDeviceQueueShaderCoreControlCreateInfoARM;\n    void *                              pNext           = {};\n    uint32_t                            shaderCoreCount = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDeviceQueueShaderCoreControlCreateInfoARM>\n  {\n    using Type = DeviceQueueShaderCoreControlCreateInfoARM;\n  };\n\n  typedef PFN_vkVoidFunction( VKAPI_PTR * PFN_GetInstanceProcAddrLUNARG )( VULKAN_HPP_NAMESPACE::Instance instance, const char * pName );\n\n  struct DirectDriverLoadingInfoLUNARG\n  {\n    using NativeType = VkDirectDriverLoadingInfoLUNARG;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDirectDriverLoadingInfoLUNARG;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DirectDriverLoadingInfoLUNARG( VULKAN_HPP_NAMESPACE::DirectDriverLoadingFlagsLUNARG flags_                  = {},\n                                                        VULKAN_HPP_NAMESPACE::PFN_GetInstanceProcAddrLUNARG  pfnGetInstanceProcAddr_ = {},\n                                                        void *                                               pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , pfnGetInstanceProcAddr{ pfnGetInstanceProcAddr_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DirectDriverLoadingInfoLUNARG( DirectDriverLoadingInfoLUNARG const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DirectDriverLoadingInfoLUNARG( VkDirectDriverLoadingInfoLUNARG const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DirectDriverLoadingInfoLUNARG( *reinterpret_cast<DirectDriverLoadingInfoLUNARG const *>( &rhs ) )\n    {\n    }\n\n    DirectDriverLoadingInfoLUNARG & operator=( DirectDriverLoadingInfoLUNARG const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DirectDriverLoadingInfoLUNARG & operator=( VkDirectDriverLoadingInfoLUNARG const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DirectDriverLoadingInfoLUNARG const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DirectDriverLoadingInfoLUNARG & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DirectDriverLoadingInfoLUNARG & setFlags( VULKAN_HPP_NAMESPACE::DirectDriverLoadingFlagsLUNARG flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DirectDriverLoadingInfoLUNARG &\n      setPfnGetInstanceProcAddr( VULKAN_HPP_NAMESPACE::PFN_GetInstanceProcAddrLUNARG pfnGetInstanceProcAddr_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pfnGetInstanceProcAddr = pfnGetInstanceProcAddr_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDirectDriverLoadingInfoLUNARG const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDirectDriverLoadingInfoLUNARG *>( this );\n    }\n\n    operator VkDirectDriverLoadingInfoLUNARG &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDirectDriverLoadingInfoLUNARG *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::DirectDriverLoadingFlagsLUNARG const &,\n               VULKAN_HPP_NAMESPACE::PFN_GetInstanceProcAddrLUNARG const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, pfnGetInstanceProcAddr );\n    }\n#endif\n\n    bool operator==( DirectDriverLoadingInfoLUNARG const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( pfnGetInstanceProcAddr == rhs.pfnGetInstanceProcAddr );\n#endif\n    }\n\n    bool operator!=( DirectDriverLoadingInfoLUNARG const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                  sType                  = StructureType::eDirectDriverLoadingInfoLUNARG;\n    void *                                               pNext                  = {};\n    VULKAN_HPP_NAMESPACE::DirectDriverLoadingFlagsLUNARG flags                  = {};\n    VULKAN_HPP_NAMESPACE::PFN_GetInstanceProcAddrLUNARG  pfnGetInstanceProcAddr = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDirectDriverLoadingInfoLUNARG>\n  {\n    using Type = DirectDriverLoadingInfoLUNARG;\n  };\n\n  struct DirectDriverLoadingListLUNARG\n  {\n    using NativeType = VkDirectDriverLoadingListLUNARG;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDirectDriverLoadingListLUNARG;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DirectDriverLoadingListLUNARG(\n      VULKAN_HPP_NAMESPACE::DirectDriverLoadingModeLUNARG         mode_        = VULKAN_HPP_NAMESPACE::DirectDriverLoadingModeLUNARG::eExclusive,\n      uint32_t                                                    driverCount_ = {},\n      const VULKAN_HPP_NAMESPACE::DirectDriverLoadingInfoLUNARG * pDrivers_    = {},\n      const void *                                                pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , mode{ mode_ }\n      , driverCount{ driverCount_ }\n      , pDrivers{ pDrivers_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DirectDriverLoadingListLUNARG( DirectDriverLoadingListLUNARG const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DirectDriverLoadingListLUNARG( VkDirectDriverLoadingListLUNARG const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DirectDriverLoadingListLUNARG( *reinterpret_cast<DirectDriverLoadingListLUNARG const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DirectDriverLoadingListLUNARG( VULKAN_HPP_NAMESPACE::DirectDriverLoadingModeLUNARG                                                              mode_,\n                                   VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DirectDriverLoadingInfoLUNARG> const & drivers_,\n                                   const void * pNext_ = nullptr )\n      : pNext( pNext_ ), mode( mode_ ), driverCount( static_cast<uint32_t>( drivers_.size() ) ), pDrivers( drivers_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    DirectDriverLoadingListLUNARG & operator=( DirectDriverLoadingListLUNARG const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DirectDriverLoadingListLUNARG & operator=( VkDirectDriverLoadingListLUNARG const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DirectDriverLoadingListLUNARG const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DirectDriverLoadingListLUNARG & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DirectDriverLoadingListLUNARG & setMode( VULKAN_HPP_NAMESPACE::DirectDriverLoadingModeLUNARG mode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mode = mode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DirectDriverLoadingListLUNARG & setDriverCount( uint32_t driverCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      driverCount = driverCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DirectDriverLoadingListLUNARG &\n      setPDrivers( const VULKAN_HPP_NAMESPACE::DirectDriverLoadingInfoLUNARG * pDrivers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDrivers = pDrivers_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    DirectDriverLoadingListLUNARG & setDrivers(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DirectDriverLoadingInfoLUNARG> const & drivers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      driverCount = static_cast<uint32_t>( drivers_.size() );\n      pDrivers    = drivers_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDirectDriverLoadingListLUNARG const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDirectDriverLoadingListLUNARG *>( this );\n    }\n\n    operator VkDirectDriverLoadingListLUNARG &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDirectDriverLoadingListLUNARG *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DirectDriverLoadingModeLUNARG const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::DirectDriverLoadingInfoLUNARG * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, mode, driverCount, pDrivers );\n    }\n#endif\n\n    bool operator==( DirectDriverLoadingListLUNARG const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( mode == rhs.mode ) && ( driverCount == rhs.driverCount ) && ( pDrivers == rhs.pDrivers );\n#endif\n    }\n\n    bool operator!=( DirectDriverLoadingListLUNARG const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                         sType       = StructureType::eDirectDriverLoadingListLUNARG;\n    const void *                                                pNext       = {};\n    VULKAN_HPP_NAMESPACE::DirectDriverLoadingModeLUNARG         mode        = VULKAN_HPP_NAMESPACE::DirectDriverLoadingModeLUNARG::eExclusive;\n    uint32_t                                                    driverCount = {};\n    const VULKAN_HPP_NAMESPACE::DirectDriverLoadingInfoLUNARG * pDrivers    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDirectDriverLoadingListLUNARG>\n  {\n    using Type = DirectDriverLoadingListLUNARG;\n  };\n\n#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n  struct DirectFBSurfaceCreateInfoEXT\n  {\n    using NativeType = VkDirectFBSurfaceCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDirectfbSurfaceCreateInfoEXT;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DirectFBSurfaceCreateInfoEXT( VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateFlagsEXT flags_   = {},\n                                                       IDirectFB *                                         dfb_     = {},\n                                                       IDirectFBSurface *                                  surface_ = {},\n                                                       const void *                                        pNext_   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , dfb{ dfb_ }\n      , surface{ surface_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DirectFBSurfaceCreateInfoEXT( DirectFBSurfaceCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DirectFBSurfaceCreateInfoEXT( VkDirectFBSurfaceCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DirectFBSurfaceCreateInfoEXT( *reinterpret_cast<DirectFBSurfaceCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    DirectFBSurfaceCreateInfoEXT & operator=( DirectFBSurfaceCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DirectFBSurfaceCreateInfoEXT & operator=( VkDirectFBSurfaceCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DirectFBSurfaceCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DirectFBSurfaceCreateInfoEXT & setFlags( VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateFlagsEXT flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DirectFBSurfaceCreateInfoEXT & setDfb( IDirectFB * dfb_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dfb = dfb_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DirectFBSurfaceCreateInfoEXT & setSurface( IDirectFBSurface * surface_ ) VULKAN_HPP_NOEXCEPT\n    {\n      surface = surface_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDirectFBSurfaceCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDirectFBSurfaceCreateInfoEXT *>( this );\n    }\n\n    operator VkDirectFBSurfaceCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDirectFBSurfaceCreateInfoEXT *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateFlagsEXT const &,\n               IDirectFB * const &,\n               IDirectFBSurface * const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, dfb, surface );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DirectFBSurfaceCreateInfoEXT const & ) const = default;\n#  else\n    bool operator==( DirectFBSurfaceCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( dfb == rhs.dfb ) && ( surface == rhs.surface );\n#    endif\n    }\n\n    bool operator!=( DirectFBSurfaceCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                 sType   = StructureType::eDirectfbSurfaceCreateInfoEXT;\n    const void *                                        pNext   = {};\n    VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateFlagsEXT flags   = {};\n    IDirectFB *                                         dfb     = {};\n    IDirectFBSurface *                                  surface = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDirectfbSurfaceCreateInfoEXT>\n  {\n    using Type = DirectFBSurfaceCreateInfoEXT;\n  };\n#endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  struct DispatchGraphCountInfoAMDX\n  {\n    using NativeType = VkDispatchGraphCountInfoAMDX;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 DispatchGraphCountInfoAMDX( uint32_t                                           count_  = {},\n                                                        VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstAMDX infos_  = {},\n                                                        uint64_t                                           stride_ = {} ) VULKAN_HPP_NOEXCEPT\n      : count{ count_ }\n      , infos{ infos_ }\n      , stride{ stride_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DispatchGraphCountInfoAMDX( DispatchGraphCountInfoAMDX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DispatchGraphCountInfoAMDX( VkDispatchGraphCountInfoAMDX const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DispatchGraphCountInfoAMDX( *reinterpret_cast<DispatchGraphCountInfoAMDX const *>( &rhs ) )\n    {\n    }\n\n    DispatchGraphCountInfoAMDX & operator=( DispatchGraphCountInfoAMDX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DispatchGraphCountInfoAMDX & operator=( VkDispatchGraphCountInfoAMDX const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DispatchGraphCountInfoAMDX const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DispatchGraphCountInfoAMDX & setCount( uint32_t count_ ) VULKAN_HPP_NOEXCEPT\n    {\n      count = count_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DispatchGraphCountInfoAMDX & setInfos( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstAMDX const & infos_ ) VULKAN_HPP_NOEXCEPT\n    {\n      infos = infos_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DispatchGraphCountInfoAMDX & setStride( uint64_t stride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stride = stride_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDispatchGraphCountInfoAMDX const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDispatchGraphCountInfoAMDX *>( this );\n    }\n\n    operator VkDispatchGraphCountInfoAMDX &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDispatchGraphCountInfoAMDX *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<uint32_t const &, VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstAMDX const &, uint64_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( count, infos, stride );\n    }\n#  endif\n\n  public:\n    uint32_t                                           count  = {};\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstAMDX infos  = {};\n    uint64_t                                           stride = {};\n  };\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  struct DispatchGraphInfoAMDX\n  {\n    using NativeType = VkDispatchGraphInfoAMDX;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 DispatchGraphInfoAMDX( uint32_t                                           nodeIndex_     = {},\n                                                   uint32_t                                           payloadCount_  = {},\n                                                   VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstAMDX payloads_      = {},\n                                                   uint64_t                                           payloadStride_ = {} ) VULKAN_HPP_NOEXCEPT\n      : nodeIndex{ nodeIndex_ }\n      , payloadCount{ payloadCount_ }\n      , payloads{ payloads_ }\n      , payloadStride{ payloadStride_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DispatchGraphInfoAMDX( DispatchGraphInfoAMDX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DispatchGraphInfoAMDX( VkDispatchGraphInfoAMDX const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DispatchGraphInfoAMDX( *reinterpret_cast<DispatchGraphInfoAMDX const *>( &rhs ) )\n    {\n    }\n\n    DispatchGraphInfoAMDX & operator=( DispatchGraphInfoAMDX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DispatchGraphInfoAMDX & operator=( VkDispatchGraphInfoAMDX const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DispatchGraphInfoAMDX const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DispatchGraphInfoAMDX & setNodeIndex( uint32_t nodeIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      nodeIndex = nodeIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DispatchGraphInfoAMDX & setPayloadCount( uint32_t payloadCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      payloadCount = payloadCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DispatchGraphInfoAMDX & setPayloads( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstAMDX const & payloads_ ) VULKAN_HPP_NOEXCEPT\n    {\n      payloads = payloads_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DispatchGraphInfoAMDX & setPayloadStride( uint64_t payloadStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      payloadStride = payloadStride_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDispatchGraphInfoAMDX const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDispatchGraphInfoAMDX *>( this );\n    }\n\n    operator VkDispatchGraphInfoAMDX &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDispatchGraphInfoAMDX *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<uint32_t const &, uint32_t const &, VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstAMDX const &, uint64_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( nodeIndex, payloadCount, payloads, payloadStride );\n    }\n#  endif\n\n  public:\n    uint32_t                                           nodeIndex     = {};\n    uint32_t                                           payloadCount  = {};\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstAMDX payloads      = {};\n    uint64_t                                           payloadStride = {};\n  };\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  struct DispatchIndirectCommand\n  {\n    using NativeType = VkDispatchIndirectCommand;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DispatchIndirectCommand( uint32_t x_ = {}, uint32_t y_ = {}, uint32_t z_ = {} ) VULKAN_HPP_NOEXCEPT\n      : x{ x_ }\n      , y{ y_ }\n      , z{ z_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DispatchIndirectCommand( DispatchIndirectCommand const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DispatchIndirectCommand( VkDispatchIndirectCommand const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DispatchIndirectCommand( *reinterpret_cast<DispatchIndirectCommand const *>( &rhs ) )\n    {\n    }\n\n    DispatchIndirectCommand & operator=( DispatchIndirectCommand const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DispatchIndirectCommand & operator=( VkDispatchIndirectCommand const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DispatchIndirectCommand const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DispatchIndirectCommand & setX( uint32_t x_ ) VULKAN_HPP_NOEXCEPT\n    {\n      x = x_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DispatchIndirectCommand & setY( uint32_t y_ ) VULKAN_HPP_NOEXCEPT\n    {\n      y = y_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DispatchIndirectCommand & setZ( uint32_t z_ ) VULKAN_HPP_NOEXCEPT\n    {\n      z = z_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDispatchIndirectCommand const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDispatchIndirectCommand *>( this );\n    }\n\n    operator VkDispatchIndirectCommand &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDispatchIndirectCommand *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( x, y, z );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DispatchIndirectCommand const & ) const = default;\n#else\n    bool operator==( DispatchIndirectCommand const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( x == rhs.x ) && ( y == rhs.y ) && ( z == rhs.z );\n#  endif\n    }\n\n    bool operator!=( DispatchIndirectCommand const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t x = {};\n    uint32_t y = {};\n    uint32_t z = {};\n  };\n\n  struct DisplayEventInfoEXT\n  {\n    using NativeType = VkDisplayEventInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDisplayEventInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      DisplayEventInfoEXT( VULKAN_HPP_NAMESPACE::DisplayEventTypeEXT displayEvent_ = VULKAN_HPP_NAMESPACE::DisplayEventTypeEXT::eFirstPixelOut,\n                           const void *                              pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , displayEvent{ displayEvent_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DisplayEventInfoEXT( DisplayEventInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DisplayEventInfoEXT( VkDisplayEventInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT : DisplayEventInfoEXT( *reinterpret_cast<DisplayEventInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    DisplayEventInfoEXT & operator=( DisplayEventInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DisplayEventInfoEXT & operator=( VkDisplayEventInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DisplayEventInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DisplayEventInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DisplayEventInfoEXT & setDisplayEvent( VULKAN_HPP_NAMESPACE::DisplayEventTypeEXT displayEvent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      displayEvent = displayEvent_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDisplayEventInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDisplayEventInfoEXT *>( this );\n    }\n\n    operator VkDisplayEventInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDisplayEventInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::DisplayEventTypeEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, displayEvent );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DisplayEventInfoEXT const & ) const = default;\n#else\n    bool operator==( DisplayEventInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( displayEvent == rhs.displayEvent );\n#  endif\n    }\n\n    bool operator!=( DisplayEventInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType        = StructureType::eDisplayEventInfoEXT;\n    const void *                              pNext        = {};\n    VULKAN_HPP_NAMESPACE::DisplayEventTypeEXT displayEvent = VULKAN_HPP_NAMESPACE::DisplayEventTypeEXT::eFirstPixelOut;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDisplayEventInfoEXT>\n  {\n    using Type = DisplayEventInfoEXT;\n  };\n\n  struct DisplayModeParametersKHR\n  {\n    using NativeType = VkDisplayModeParametersKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DisplayModeParametersKHR( VULKAN_HPP_NAMESPACE::Extent2D visibleRegion_ = {}, uint32_t refreshRate_ = {} ) VULKAN_HPP_NOEXCEPT\n      : visibleRegion{ visibleRegion_ }\n      , refreshRate{ refreshRate_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DisplayModeParametersKHR( DisplayModeParametersKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DisplayModeParametersKHR( VkDisplayModeParametersKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DisplayModeParametersKHR( *reinterpret_cast<DisplayModeParametersKHR const *>( &rhs ) )\n    {\n    }\n\n    DisplayModeParametersKHR & operator=( DisplayModeParametersKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DisplayModeParametersKHR & operator=( VkDisplayModeParametersKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DisplayModeParametersKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DisplayModeParametersKHR & setVisibleRegion( VULKAN_HPP_NAMESPACE::Extent2D const & visibleRegion_ ) VULKAN_HPP_NOEXCEPT\n    {\n      visibleRegion = visibleRegion_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DisplayModeParametersKHR & setRefreshRate( uint32_t refreshRate_ ) VULKAN_HPP_NOEXCEPT\n    {\n      refreshRate = refreshRate_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDisplayModeParametersKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDisplayModeParametersKHR *>( this );\n    }\n\n    operator VkDisplayModeParametersKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDisplayModeParametersKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::Extent2D const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( visibleRegion, refreshRate );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DisplayModeParametersKHR const & ) const = default;\n#else\n    bool operator==( DisplayModeParametersKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( visibleRegion == rhs.visibleRegion ) && ( refreshRate == rhs.refreshRate );\n#  endif\n    }\n\n    bool operator!=( DisplayModeParametersKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::Extent2D visibleRegion = {};\n    uint32_t                       refreshRate   = {};\n  };\n\n  struct DisplayModeCreateInfoKHR\n  {\n    using NativeType = VkDisplayModeCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDisplayModeCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DisplayModeCreateInfoKHR( VULKAN_HPP_NAMESPACE::DisplayModeCreateFlagsKHR flags_      = {},\n                                                   VULKAN_HPP_NAMESPACE::DisplayModeParametersKHR  parameters_ = {},\n                                                   const void *                                    pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , parameters{ parameters_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DisplayModeCreateInfoKHR( DisplayModeCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DisplayModeCreateInfoKHR( VkDisplayModeCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DisplayModeCreateInfoKHR( *reinterpret_cast<DisplayModeCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    DisplayModeCreateInfoKHR & operator=( DisplayModeCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DisplayModeCreateInfoKHR & operator=( VkDisplayModeCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DisplayModeCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DisplayModeCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DisplayModeCreateInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::DisplayModeCreateFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DisplayModeCreateInfoKHR & setParameters( VULKAN_HPP_NAMESPACE::DisplayModeParametersKHR const & parameters_ ) VULKAN_HPP_NOEXCEPT\n    {\n      parameters = parameters_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDisplayModeCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDisplayModeCreateInfoKHR *>( this );\n    }\n\n    operator VkDisplayModeCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDisplayModeCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DisplayModeCreateFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::DisplayModeParametersKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, parameters );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DisplayModeCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( DisplayModeCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( parameters == rhs.parameters );\n#  endif\n    }\n\n    bool operator!=( DisplayModeCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType             sType      = StructureType::eDisplayModeCreateInfoKHR;\n    const void *                                    pNext      = {};\n    VULKAN_HPP_NAMESPACE::DisplayModeCreateFlagsKHR flags      = {};\n    VULKAN_HPP_NAMESPACE::DisplayModeParametersKHR  parameters = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDisplayModeCreateInfoKHR>\n  {\n    using Type = DisplayModeCreateInfoKHR;\n  };\n\n  struct DisplayModePropertiesKHR\n  {\n    using NativeType = VkDisplayModePropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DisplayModePropertiesKHR( VULKAN_HPP_NAMESPACE::DisplayModeKHR           displayMode_ = {},\n                                                   VULKAN_HPP_NAMESPACE::DisplayModeParametersKHR parameters_  = {} ) VULKAN_HPP_NOEXCEPT\n      : displayMode{ displayMode_ }\n      , parameters{ parameters_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DisplayModePropertiesKHR( DisplayModePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DisplayModePropertiesKHR( VkDisplayModePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DisplayModePropertiesKHR( *reinterpret_cast<DisplayModePropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    DisplayModePropertiesKHR & operator=( DisplayModePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DisplayModePropertiesKHR & operator=( VkDisplayModePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkDisplayModePropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDisplayModePropertiesKHR *>( this );\n    }\n\n    operator VkDisplayModePropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDisplayModePropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DisplayModeKHR const &, VULKAN_HPP_NAMESPACE::DisplayModeParametersKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( displayMode, parameters );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DisplayModePropertiesKHR const & ) const = default;\n#else\n    bool operator==( DisplayModePropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( displayMode == rhs.displayMode ) && ( parameters == rhs.parameters );\n#  endif\n    }\n\n    bool operator!=( DisplayModePropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DisplayModeKHR           displayMode = {};\n    VULKAN_HPP_NAMESPACE::DisplayModeParametersKHR parameters  = {};\n  };\n\n  struct DisplayModeProperties2KHR\n  {\n    using NativeType = VkDisplayModeProperties2KHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDisplayModeProperties2KHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DisplayModeProperties2KHR( VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR displayModeProperties_ = {},\n                                                    void *                                         pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , displayModeProperties{ displayModeProperties_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DisplayModeProperties2KHR( DisplayModeProperties2KHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DisplayModeProperties2KHR( VkDisplayModeProperties2KHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DisplayModeProperties2KHR( *reinterpret_cast<DisplayModeProperties2KHR const *>( &rhs ) )\n    {\n    }\n\n    DisplayModeProperties2KHR & operator=( DisplayModeProperties2KHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DisplayModeProperties2KHR & operator=( VkDisplayModeProperties2KHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkDisplayModeProperties2KHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDisplayModeProperties2KHR *>( this );\n    }\n\n    operator VkDisplayModeProperties2KHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDisplayModeProperties2KHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, displayModeProperties );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DisplayModeProperties2KHR const & ) const = default;\n#else\n    bool operator==( DisplayModeProperties2KHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( displayModeProperties == rhs.displayModeProperties );\n#  endif\n    }\n\n    bool operator!=( DisplayModeProperties2KHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType            sType                 = StructureType::eDisplayModeProperties2KHR;\n    void *                                         pNext                 = {};\n    VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR displayModeProperties = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDisplayModeProperties2KHR>\n  {\n    using Type = DisplayModeProperties2KHR;\n  };\n\n  struct DisplayModeStereoPropertiesNV\n  {\n    using NativeType = VkDisplayModeStereoPropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDisplayModeStereoPropertiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DisplayModeStereoPropertiesNV( VULKAN_HPP_NAMESPACE::Bool32 hdmi3DSupported_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , hdmi3DSupported{ hdmi3DSupported_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DisplayModeStereoPropertiesNV( DisplayModeStereoPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DisplayModeStereoPropertiesNV( VkDisplayModeStereoPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DisplayModeStereoPropertiesNV( *reinterpret_cast<DisplayModeStereoPropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    DisplayModeStereoPropertiesNV & operator=( DisplayModeStereoPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DisplayModeStereoPropertiesNV & operator=( VkDisplayModeStereoPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DisplayModeStereoPropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkDisplayModeStereoPropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDisplayModeStereoPropertiesNV *>( this );\n    }\n\n    operator VkDisplayModeStereoPropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDisplayModeStereoPropertiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, hdmi3DSupported );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DisplayModeStereoPropertiesNV const & ) const = default;\n#else\n    bool operator==( DisplayModeStereoPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( hdmi3DSupported == rhs.hdmi3DSupported );\n#  endif\n    }\n\n    bool operator!=( DisplayModeStereoPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType           = StructureType::eDisplayModeStereoPropertiesNV;\n    const void *                        pNext           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        hdmi3DSupported = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDisplayModeStereoPropertiesNV>\n  {\n    using Type = DisplayModeStereoPropertiesNV;\n  };\n\n  struct DisplayNativeHdrSurfaceCapabilitiesAMD\n  {\n    using NativeType = VkDisplayNativeHdrSurfaceCapabilitiesAMD;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDisplayNativeHdrSurfaceCapabilitiesAMD;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DisplayNativeHdrSurfaceCapabilitiesAMD( VULKAN_HPP_NAMESPACE::Bool32 localDimmingSupport_ = {},\n                                                                 void *                       pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , localDimmingSupport{ localDimmingSupport_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DisplayNativeHdrSurfaceCapabilitiesAMD( DisplayNativeHdrSurfaceCapabilitiesAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DisplayNativeHdrSurfaceCapabilitiesAMD( VkDisplayNativeHdrSurfaceCapabilitiesAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DisplayNativeHdrSurfaceCapabilitiesAMD( *reinterpret_cast<DisplayNativeHdrSurfaceCapabilitiesAMD const *>( &rhs ) )\n    {\n    }\n\n    DisplayNativeHdrSurfaceCapabilitiesAMD & operator=( DisplayNativeHdrSurfaceCapabilitiesAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DisplayNativeHdrSurfaceCapabilitiesAMD & operator=( VkDisplayNativeHdrSurfaceCapabilitiesAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DisplayNativeHdrSurfaceCapabilitiesAMD const *>( &rhs );\n      return *this;\n    }\n\n    operator VkDisplayNativeHdrSurfaceCapabilitiesAMD const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDisplayNativeHdrSurfaceCapabilitiesAMD *>( this );\n    }\n\n    operator VkDisplayNativeHdrSurfaceCapabilitiesAMD &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDisplayNativeHdrSurfaceCapabilitiesAMD *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, localDimmingSupport );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DisplayNativeHdrSurfaceCapabilitiesAMD const & ) const = default;\n#else\n    bool operator==( DisplayNativeHdrSurfaceCapabilitiesAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( localDimmingSupport == rhs.localDimmingSupport );\n#  endif\n    }\n\n    bool operator!=( DisplayNativeHdrSurfaceCapabilitiesAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType               = StructureType::eDisplayNativeHdrSurfaceCapabilitiesAMD;\n    void *                              pNext               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        localDimmingSupport = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDisplayNativeHdrSurfaceCapabilitiesAMD>\n  {\n    using Type = DisplayNativeHdrSurfaceCapabilitiesAMD;\n  };\n\n  struct DisplayPlaneCapabilitiesKHR\n  {\n    using NativeType = VkDisplayPlaneCapabilitiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DisplayPlaneCapabilitiesKHR( VULKAN_HPP_NAMESPACE::DisplayPlaneAlphaFlagsKHR supportedAlpha_ = {},\n                                                      VULKAN_HPP_NAMESPACE::Offset2D                  minSrcPosition_ = {},\n                                                      VULKAN_HPP_NAMESPACE::Offset2D                  maxSrcPosition_ = {},\n                                                      VULKAN_HPP_NAMESPACE::Extent2D                  minSrcExtent_   = {},\n                                                      VULKAN_HPP_NAMESPACE::Extent2D                  maxSrcExtent_   = {},\n                                                      VULKAN_HPP_NAMESPACE::Offset2D                  minDstPosition_ = {},\n                                                      VULKAN_HPP_NAMESPACE::Offset2D                  maxDstPosition_ = {},\n                                                      VULKAN_HPP_NAMESPACE::Extent2D                  minDstExtent_   = {},\n                                                      VULKAN_HPP_NAMESPACE::Extent2D                  maxDstExtent_   = {} ) VULKAN_HPP_NOEXCEPT\n      : supportedAlpha{ supportedAlpha_ }\n      , minSrcPosition{ minSrcPosition_ }\n      , maxSrcPosition{ maxSrcPosition_ }\n      , minSrcExtent{ minSrcExtent_ }\n      , maxSrcExtent{ maxSrcExtent_ }\n      , minDstPosition{ minDstPosition_ }\n      , maxDstPosition{ maxDstPosition_ }\n      , minDstExtent{ minDstExtent_ }\n      , maxDstExtent{ maxDstExtent_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DisplayPlaneCapabilitiesKHR( DisplayPlaneCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DisplayPlaneCapabilitiesKHR( VkDisplayPlaneCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DisplayPlaneCapabilitiesKHR( *reinterpret_cast<DisplayPlaneCapabilitiesKHR const *>( &rhs ) )\n    {\n    }\n\n    DisplayPlaneCapabilitiesKHR & operator=( DisplayPlaneCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DisplayPlaneCapabilitiesKHR & operator=( VkDisplayPlaneCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkDisplayPlaneCapabilitiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDisplayPlaneCapabilitiesKHR *>( this );\n    }\n\n    operator VkDisplayPlaneCapabilitiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDisplayPlaneCapabilitiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DisplayPlaneAlphaFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::Offset2D const &,\n               VULKAN_HPP_NAMESPACE::Offset2D const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::Offset2D const &,\n               VULKAN_HPP_NAMESPACE::Offset2D const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( supportedAlpha, minSrcPosition, maxSrcPosition, minSrcExtent, maxSrcExtent, minDstPosition, maxDstPosition, minDstExtent, maxDstExtent );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DisplayPlaneCapabilitiesKHR const & ) const = default;\n#else\n    bool operator==( DisplayPlaneCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( supportedAlpha == rhs.supportedAlpha ) && ( minSrcPosition == rhs.minSrcPosition ) && ( maxSrcPosition == rhs.maxSrcPosition ) &&\n             ( minSrcExtent == rhs.minSrcExtent ) && ( maxSrcExtent == rhs.maxSrcExtent ) && ( minDstPosition == rhs.minDstPosition ) &&\n             ( maxDstPosition == rhs.maxDstPosition ) && ( minDstExtent == rhs.minDstExtent ) && ( maxDstExtent == rhs.maxDstExtent );\n#  endif\n    }\n\n    bool operator!=( DisplayPlaneCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DisplayPlaneAlphaFlagsKHR supportedAlpha = {};\n    VULKAN_HPP_NAMESPACE::Offset2D                  minSrcPosition = {};\n    VULKAN_HPP_NAMESPACE::Offset2D                  maxSrcPosition = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                  minSrcExtent   = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                  maxSrcExtent   = {};\n    VULKAN_HPP_NAMESPACE::Offset2D                  minDstPosition = {};\n    VULKAN_HPP_NAMESPACE::Offset2D                  maxDstPosition = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                  minDstExtent   = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                  maxDstExtent   = {};\n  };\n\n  struct DisplayPlaneCapabilities2KHR\n  {\n    using NativeType = VkDisplayPlaneCapabilities2KHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDisplayPlaneCapabilities2KHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DisplayPlaneCapabilities2KHR( VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR capabilities_ = {},\n                                                       void *                                            pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , capabilities{ capabilities_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DisplayPlaneCapabilities2KHR( DisplayPlaneCapabilities2KHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DisplayPlaneCapabilities2KHR( VkDisplayPlaneCapabilities2KHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DisplayPlaneCapabilities2KHR( *reinterpret_cast<DisplayPlaneCapabilities2KHR const *>( &rhs ) )\n    {\n    }\n\n    DisplayPlaneCapabilities2KHR & operator=( DisplayPlaneCapabilities2KHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DisplayPlaneCapabilities2KHR & operator=( VkDisplayPlaneCapabilities2KHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilities2KHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkDisplayPlaneCapabilities2KHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDisplayPlaneCapabilities2KHR *>( this );\n    }\n\n    operator VkDisplayPlaneCapabilities2KHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDisplayPlaneCapabilities2KHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, capabilities );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DisplayPlaneCapabilities2KHR const & ) const = default;\n#else\n    bool operator==( DisplayPlaneCapabilities2KHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( capabilities == rhs.capabilities );\n#  endif\n    }\n\n    bool operator!=( DisplayPlaneCapabilities2KHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType        = StructureType::eDisplayPlaneCapabilities2KHR;\n    void *                                            pNext        = {};\n    VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR capabilities = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDisplayPlaneCapabilities2KHR>\n  {\n    using Type = DisplayPlaneCapabilities2KHR;\n  };\n\n  struct DisplayPlaneInfo2KHR\n  {\n    using NativeType = VkDisplayPlaneInfo2KHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDisplayPlaneInfo2KHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      DisplayPlaneInfo2KHR( VULKAN_HPP_NAMESPACE::DisplayModeKHR mode_ = {}, uint32_t planeIndex_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , mode{ mode_ }\n      , planeIndex{ planeIndex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DisplayPlaneInfo2KHR( DisplayPlaneInfo2KHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DisplayPlaneInfo2KHR( VkDisplayPlaneInfo2KHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DisplayPlaneInfo2KHR( *reinterpret_cast<DisplayPlaneInfo2KHR const *>( &rhs ) )\n    {\n    }\n\n    DisplayPlaneInfo2KHR & operator=( DisplayPlaneInfo2KHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DisplayPlaneInfo2KHR & operator=( VkDisplayPlaneInfo2KHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DisplayPlaneInfo2KHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DisplayPlaneInfo2KHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DisplayPlaneInfo2KHR & setMode( VULKAN_HPP_NAMESPACE::DisplayModeKHR mode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mode = mode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DisplayPlaneInfo2KHR & setPlaneIndex( uint32_t planeIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      planeIndex = planeIndex_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDisplayPlaneInfo2KHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDisplayPlaneInfo2KHR *>( this );\n    }\n\n    operator VkDisplayPlaneInfo2KHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDisplayPlaneInfo2KHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::DisplayModeKHR const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, mode, planeIndex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DisplayPlaneInfo2KHR const & ) const = default;\n#else\n    bool operator==( DisplayPlaneInfo2KHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( mode == rhs.mode ) && ( planeIndex == rhs.planeIndex );\n#  endif\n    }\n\n    bool operator!=( DisplayPlaneInfo2KHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType  sType      = StructureType::eDisplayPlaneInfo2KHR;\n    const void *                         pNext      = {};\n    VULKAN_HPP_NAMESPACE::DisplayModeKHR mode       = {};\n    uint32_t                             planeIndex = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDisplayPlaneInfo2KHR>\n  {\n    using Type = DisplayPlaneInfo2KHR;\n  };\n\n  struct DisplayPlanePropertiesKHR\n  {\n    using NativeType = VkDisplayPlanePropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DisplayPlanePropertiesKHR( VULKAN_HPP_NAMESPACE::DisplayKHR currentDisplay_    = {},\n                                                    uint32_t                         currentStackIndex_ = {} ) VULKAN_HPP_NOEXCEPT\n      : currentDisplay{ currentDisplay_ }\n      , currentStackIndex{ currentStackIndex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DisplayPlanePropertiesKHR( DisplayPlanePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DisplayPlanePropertiesKHR( VkDisplayPlanePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DisplayPlanePropertiesKHR( *reinterpret_cast<DisplayPlanePropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    DisplayPlanePropertiesKHR & operator=( DisplayPlanePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DisplayPlanePropertiesKHR & operator=( VkDisplayPlanePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkDisplayPlanePropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDisplayPlanePropertiesKHR *>( this );\n    }\n\n    operator VkDisplayPlanePropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDisplayPlanePropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DisplayKHR const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( currentDisplay, currentStackIndex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DisplayPlanePropertiesKHR const & ) const = default;\n#else\n    bool operator==( DisplayPlanePropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( currentDisplay == rhs.currentDisplay ) && ( currentStackIndex == rhs.currentStackIndex );\n#  endif\n    }\n\n    bool operator!=( DisplayPlanePropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DisplayKHR currentDisplay    = {};\n    uint32_t                         currentStackIndex = {};\n  };\n\n  struct DisplayPlaneProperties2KHR\n  {\n    using NativeType = VkDisplayPlaneProperties2KHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDisplayPlaneProperties2KHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DisplayPlaneProperties2KHR( VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR displayPlaneProperties_ = {},\n                                                     void *                                          pNext_                  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , displayPlaneProperties{ displayPlaneProperties_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DisplayPlaneProperties2KHR( DisplayPlaneProperties2KHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DisplayPlaneProperties2KHR( VkDisplayPlaneProperties2KHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DisplayPlaneProperties2KHR( *reinterpret_cast<DisplayPlaneProperties2KHR const *>( &rhs ) )\n    {\n    }\n\n    DisplayPlaneProperties2KHR & operator=( DisplayPlaneProperties2KHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DisplayPlaneProperties2KHR & operator=( VkDisplayPlaneProperties2KHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkDisplayPlaneProperties2KHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDisplayPlaneProperties2KHR *>( this );\n    }\n\n    operator VkDisplayPlaneProperties2KHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDisplayPlaneProperties2KHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, displayPlaneProperties );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DisplayPlaneProperties2KHR const & ) const = default;\n#else\n    bool operator==( DisplayPlaneProperties2KHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( displayPlaneProperties == rhs.displayPlaneProperties );\n#  endif\n    }\n\n    bool operator!=( DisplayPlaneProperties2KHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType             sType                  = StructureType::eDisplayPlaneProperties2KHR;\n    void *                                          pNext                  = {};\n    VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR displayPlaneProperties = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDisplayPlaneProperties2KHR>\n  {\n    using Type = DisplayPlaneProperties2KHR;\n  };\n\n  struct DisplayPowerInfoEXT\n  {\n    using NativeType = VkDisplayPowerInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDisplayPowerInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DisplayPowerInfoEXT( VULKAN_HPP_NAMESPACE::DisplayPowerStateEXT powerState_ = VULKAN_HPP_NAMESPACE::DisplayPowerStateEXT::eOff,\n                                              const void *                               pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , powerState{ powerState_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DisplayPowerInfoEXT( DisplayPowerInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DisplayPowerInfoEXT( VkDisplayPowerInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT : DisplayPowerInfoEXT( *reinterpret_cast<DisplayPowerInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    DisplayPowerInfoEXT & operator=( DisplayPowerInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DisplayPowerInfoEXT & operator=( VkDisplayPowerInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DisplayPowerInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DisplayPowerInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DisplayPowerInfoEXT & setPowerState( VULKAN_HPP_NAMESPACE::DisplayPowerStateEXT powerState_ ) VULKAN_HPP_NOEXCEPT\n    {\n      powerState = powerState_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDisplayPowerInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDisplayPowerInfoEXT *>( this );\n    }\n\n    operator VkDisplayPowerInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDisplayPowerInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::DisplayPowerStateEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, powerState );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DisplayPowerInfoEXT const & ) const = default;\n#else\n    bool operator==( DisplayPowerInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( powerState == rhs.powerState );\n#  endif\n    }\n\n    bool operator!=( DisplayPowerInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType        sType      = StructureType::eDisplayPowerInfoEXT;\n    const void *                               pNext      = {};\n    VULKAN_HPP_NAMESPACE::DisplayPowerStateEXT powerState = VULKAN_HPP_NAMESPACE::DisplayPowerStateEXT::eOff;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDisplayPowerInfoEXT>\n  {\n    using Type = DisplayPowerInfoEXT;\n  };\n\n  struct DisplayPresentInfoKHR\n  {\n    using NativeType = VkDisplayPresentInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDisplayPresentInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DisplayPresentInfoKHR( VULKAN_HPP_NAMESPACE::Rect2D srcRect_    = {},\n                                                VULKAN_HPP_NAMESPACE::Rect2D dstRect_    = {},\n                                                VULKAN_HPP_NAMESPACE::Bool32 persistent_ = {},\n                                                const void *                 pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , srcRect{ srcRect_ }\n      , dstRect{ dstRect_ }\n      , persistent{ persistent_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DisplayPresentInfoKHR( DisplayPresentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DisplayPresentInfoKHR( VkDisplayPresentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DisplayPresentInfoKHR( *reinterpret_cast<DisplayPresentInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    DisplayPresentInfoKHR & operator=( DisplayPresentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DisplayPresentInfoKHR & operator=( VkDisplayPresentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DisplayPresentInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DisplayPresentInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DisplayPresentInfoKHR & setSrcRect( VULKAN_HPP_NAMESPACE::Rect2D const & srcRect_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcRect = srcRect_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DisplayPresentInfoKHR & setDstRect( VULKAN_HPP_NAMESPACE::Rect2D const & dstRect_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstRect = dstRect_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DisplayPresentInfoKHR & setPersistent( VULKAN_HPP_NAMESPACE::Bool32 persistent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      persistent = persistent_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDisplayPresentInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDisplayPresentInfoKHR *>( this );\n    }\n\n    operator VkDisplayPresentInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDisplayPresentInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Rect2D const &,\n               VULKAN_HPP_NAMESPACE::Rect2D const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, srcRect, dstRect, persistent );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DisplayPresentInfoKHR const & ) const = default;\n#else\n    bool operator==( DisplayPresentInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( srcRect == rhs.srcRect ) && ( dstRect == rhs.dstRect ) && ( persistent == rhs.persistent );\n#  endif\n    }\n\n    bool operator!=( DisplayPresentInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType      = StructureType::eDisplayPresentInfoKHR;\n    const void *                        pNext      = {};\n    VULKAN_HPP_NAMESPACE::Rect2D        srcRect    = {};\n    VULKAN_HPP_NAMESPACE::Rect2D        dstRect    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        persistent = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDisplayPresentInfoKHR>\n  {\n    using Type = DisplayPresentInfoKHR;\n  };\n\n  struct DisplayPropertiesKHR\n  {\n    using NativeType = VkDisplayPropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DisplayPropertiesKHR( VULKAN_HPP_NAMESPACE::DisplayKHR               display_              = {},\n                                               const char *                                   displayName_          = {},\n                                               VULKAN_HPP_NAMESPACE::Extent2D                 physicalDimensions_   = {},\n                                               VULKAN_HPP_NAMESPACE::Extent2D                 physicalResolution_   = {},\n                                               VULKAN_HPP_NAMESPACE::SurfaceTransformFlagsKHR supportedTransforms_  = {},\n                                               VULKAN_HPP_NAMESPACE::Bool32                   planeReorderPossible_ = {},\n                                               VULKAN_HPP_NAMESPACE::Bool32                   persistentContent_    = {} ) VULKAN_HPP_NOEXCEPT\n      : display{ display_ }\n      , displayName{ displayName_ }\n      , physicalDimensions{ physicalDimensions_ }\n      , physicalResolution{ physicalResolution_ }\n      , supportedTransforms{ supportedTransforms_ }\n      , planeReorderPossible{ planeReorderPossible_ }\n      , persistentContent{ persistentContent_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DisplayPropertiesKHR( DisplayPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DisplayPropertiesKHR( VkDisplayPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DisplayPropertiesKHR( *reinterpret_cast<DisplayPropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    DisplayPropertiesKHR & operator=( DisplayPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DisplayPropertiesKHR & operator=( VkDisplayPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkDisplayPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDisplayPropertiesKHR *>( this );\n    }\n\n    operator VkDisplayPropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDisplayPropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DisplayKHR const &,\n               const char * const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::SurfaceTransformFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( display, displayName, physicalDimensions, physicalResolution, supportedTransforms, planeReorderPossible, persistentContent );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( DisplayPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = display <=> rhs.display; cmp != 0 )\n        return cmp;\n      if ( displayName != rhs.displayName )\n        if ( auto cmp = strcmp( displayName, rhs.displayName ); cmp != 0 )\n          return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = physicalDimensions <=> rhs.physicalDimensions; cmp != 0 )\n        return cmp;\n      if ( auto cmp = physicalResolution <=> rhs.physicalResolution; cmp != 0 )\n        return cmp;\n      if ( auto cmp = supportedTransforms <=> rhs.supportedTransforms; cmp != 0 )\n        return cmp;\n      if ( auto cmp = planeReorderPossible <=> rhs.planeReorderPossible; cmp != 0 )\n        return cmp;\n      if ( auto cmp = persistentContent <=> rhs.persistentContent; cmp != 0 )\n        return cmp;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( DisplayPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( display == rhs.display ) && ( ( displayName == rhs.displayName ) || ( strcmp( displayName, rhs.displayName ) == 0 ) ) &&\n             ( physicalDimensions == rhs.physicalDimensions ) && ( physicalResolution == rhs.physicalResolution ) &&\n             ( supportedTransforms == rhs.supportedTransforms ) && ( planeReorderPossible == rhs.planeReorderPossible ) &&\n             ( persistentContent == rhs.persistentContent );\n    }\n\n    bool operator!=( DisplayPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::DisplayKHR               display              = {};\n    const char *                                   displayName          = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                 physicalDimensions   = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                 physicalResolution   = {};\n    VULKAN_HPP_NAMESPACE::SurfaceTransformFlagsKHR supportedTransforms  = {};\n    VULKAN_HPP_NAMESPACE::Bool32                   planeReorderPossible = {};\n    VULKAN_HPP_NAMESPACE::Bool32                   persistentContent    = {};\n  };\n\n  struct DisplayProperties2KHR\n  {\n    using NativeType = VkDisplayProperties2KHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDisplayProperties2KHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DisplayProperties2KHR( VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR displayProperties_ = {},\n                                                void *                                     pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , displayProperties{ displayProperties_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DisplayProperties2KHR( DisplayProperties2KHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DisplayProperties2KHR( VkDisplayProperties2KHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DisplayProperties2KHR( *reinterpret_cast<DisplayProperties2KHR const *>( &rhs ) )\n    {\n    }\n\n    DisplayProperties2KHR & operator=( DisplayProperties2KHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DisplayProperties2KHR & operator=( VkDisplayProperties2KHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DisplayProperties2KHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkDisplayProperties2KHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDisplayProperties2KHR *>( this );\n    }\n\n    operator VkDisplayProperties2KHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDisplayProperties2KHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, displayProperties );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DisplayProperties2KHR const & ) const = default;\n#else\n    bool operator==( DisplayProperties2KHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( displayProperties == rhs.displayProperties );\n#  endif\n    }\n\n    bool operator!=( DisplayProperties2KHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType        sType             = StructureType::eDisplayProperties2KHR;\n    void *                                     pNext             = {};\n    VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR displayProperties = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDisplayProperties2KHR>\n  {\n    using Type = DisplayProperties2KHR;\n  };\n\n  struct DisplaySurfaceCreateInfoKHR\n  {\n    using NativeType = VkDisplaySurfaceCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDisplaySurfaceCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      DisplaySurfaceCreateInfoKHR( VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateFlagsKHR flags_           = {},\n                                   VULKAN_HPP_NAMESPACE::DisplayModeKHR               displayMode_     = {},\n                                   uint32_t                                           planeIndex_      = {},\n                                   uint32_t                                           planeStackIndex_ = {},\n                                   VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR  transform_ = VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR::eIdentity,\n                                   float                                              globalAlpha_ = {},\n                                   VULKAN_HPP_NAMESPACE::DisplayPlaneAlphaFlagBitsKHR alphaMode_ = VULKAN_HPP_NAMESPACE::DisplayPlaneAlphaFlagBitsKHR::eOpaque,\n                                   VULKAN_HPP_NAMESPACE::Extent2D                     imageExtent_ = {},\n                                   const void *                                       pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , displayMode{ displayMode_ }\n      , planeIndex{ planeIndex_ }\n      , planeStackIndex{ planeStackIndex_ }\n      , transform{ transform_ }\n      , globalAlpha{ globalAlpha_ }\n      , alphaMode{ alphaMode_ }\n      , imageExtent{ imageExtent_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DisplaySurfaceCreateInfoKHR( DisplaySurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DisplaySurfaceCreateInfoKHR( VkDisplaySurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DisplaySurfaceCreateInfoKHR( *reinterpret_cast<DisplaySurfaceCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    DisplaySurfaceCreateInfoKHR & operator=( DisplaySurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DisplaySurfaceCreateInfoKHR & operator=( VkDisplaySurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DisplaySurfaceCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DisplaySurfaceCreateInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DisplaySurfaceCreateInfoKHR & setDisplayMode( VULKAN_HPP_NAMESPACE::DisplayModeKHR displayMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      displayMode = displayMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DisplaySurfaceCreateInfoKHR & setPlaneIndex( uint32_t planeIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      planeIndex = planeIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DisplaySurfaceCreateInfoKHR & setPlaneStackIndex( uint32_t planeStackIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      planeStackIndex = planeStackIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DisplaySurfaceCreateInfoKHR & setTransform( VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR transform_ ) VULKAN_HPP_NOEXCEPT\n    {\n      transform = transform_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DisplaySurfaceCreateInfoKHR & setGlobalAlpha( float globalAlpha_ ) VULKAN_HPP_NOEXCEPT\n    {\n      globalAlpha = globalAlpha_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DisplaySurfaceCreateInfoKHR & setAlphaMode( VULKAN_HPP_NAMESPACE::DisplayPlaneAlphaFlagBitsKHR alphaMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      alphaMode = alphaMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DisplaySurfaceCreateInfoKHR & setImageExtent( VULKAN_HPP_NAMESPACE::Extent2D const & imageExtent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageExtent = imageExtent_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDisplaySurfaceCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDisplaySurfaceCreateInfoKHR *>( this );\n    }\n\n    operator VkDisplaySurfaceCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDisplaySurfaceCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::DisplayModeKHR const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR const &,\n               float const &,\n               VULKAN_HPP_NAMESPACE::DisplayPlaneAlphaFlagBitsKHR const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, displayMode, planeIndex, planeStackIndex, transform, globalAlpha, alphaMode, imageExtent );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DisplaySurfaceCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( DisplaySurfaceCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( displayMode == rhs.displayMode ) &&\n             ( planeIndex == rhs.planeIndex ) && ( planeStackIndex == rhs.planeStackIndex ) && ( transform == rhs.transform ) &&\n             ( globalAlpha == rhs.globalAlpha ) && ( alphaMode == rhs.alphaMode ) && ( imageExtent == rhs.imageExtent );\n#  endif\n    }\n\n    bool operator!=( DisplaySurfaceCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                sType           = StructureType::eDisplaySurfaceCreateInfoKHR;\n    const void *                                       pNext           = {};\n    VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateFlagsKHR flags           = {};\n    VULKAN_HPP_NAMESPACE::DisplayModeKHR               displayMode     = {};\n    uint32_t                                           planeIndex      = {};\n    uint32_t                                           planeStackIndex = {};\n    VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR  transform       = VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR::eIdentity;\n    float                                              globalAlpha     = {};\n    VULKAN_HPP_NAMESPACE::DisplayPlaneAlphaFlagBitsKHR alphaMode       = VULKAN_HPP_NAMESPACE::DisplayPlaneAlphaFlagBitsKHR::eOpaque;\n    VULKAN_HPP_NAMESPACE::Extent2D                     imageExtent     = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDisplaySurfaceCreateInfoKHR>\n  {\n    using Type = DisplaySurfaceCreateInfoKHR;\n  };\n\n  struct DisplaySurfaceStereoCreateInfoNV\n  {\n    using NativeType = VkDisplaySurfaceStereoCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDisplaySurfaceStereoCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      DisplaySurfaceStereoCreateInfoNV( VULKAN_HPP_NAMESPACE::DisplaySurfaceStereoTypeNV stereoType_ = VULKAN_HPP_NAMESPACE::DisplaySurfaceStereoTypeNV::eNone,\n                                        const void *                                     pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stereoType{ stereoType_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DisplaySurfaceStereoCreateInfoNV( DisplaySurfaceStereoCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DisplaySurfaceStereoCreateInfoNV( VkDisplaySurfaceStereoCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DisplaySurfaceStereoCreateInfoNV( *reinterpret_cast<DisplaySurfaceStereoCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n    DisplaySurfaceStereoCreateInfoNV & operator=( DisplaySurfaceStereoCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DisplaySurfaceStereoCreateInfoNV & operator=( VkDisplaySurfaceStereoCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DisplaySurfaceStereoCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DisplaySurfaceStereoCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DisplaySurfaceStereoCreateInfoNV & setStereoType( VULKAN_HPP_NAMESPACE::DisplaySurfaceStereoTypeNV stereoType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stereoType = stereoType_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDisplaySurfaceStereoCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDisplaySurfaceStereoCreateInfoNV *>( this );\n    }\n\n    operator VkDisplaySurfaceStereoCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDisplaySurfaceStereoCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::DisplaySurfaceStereoTypeNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stereoType );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DisplaySurfaceStereoCreateInfoNV const & ) const = default;\n#else\n    bool operator==( DisplaySurfaceStereoCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( stereoType == rhs.stereoType );\n#  endif\n    }\n\n    bool operator!=( DisplaySurfaceStereoCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType              sType      = StructureType::eDisplaySurfaceStereoCreateInfoNV;\n    const void *                                     pNext      = {};\n    VULKAN_HPP_NAMESPACE::DisplaySurfaceStereoTypeNV stereoType = VULKAN_HPP_NAMESPACE::DisplaySurfaceStereoTypeNV::eNone;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDisplaySurfaceStereoCreateInfoNV>\n  {\n    using Type = DisplaySurfaceStereoCreateInfoNV;\n  };\n\n  struct DrawIndexedIndirectCommand\n  {\n    using NativeType = VkDrawIndexedIndirectCommand;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DrawIndexedIndirectCommand( uint32_t indexCount_    = {},\n                                                     uint32_t instanceCount_ = {},\n                                                     uint32_t firstIndex_    = {},\n                                                     int32_t  vertexOffset_  = {},\n                                                     uint32_t firstInstance_ = {} ) VULKAN_HPP_NOEXCEPT\n      : indexCount{ indexCount_ }\n      , instanceCount{ instanceCount_ }\n      , firstIndex{ firstIndex_ }\n      , vertexOffset{ vertexOffset_ }\n      , firstInstance{ firstInstance_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DrawIndexedIndirectCommand( DrawIndexedIndirectCommand const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DrawIndexedIndirectCommand( VkDrawIndexedIndirectCommand const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DrawIndexedIndirectCommand( *reinterpret_cast<DrawIndexedIndirectCommand const *>( &rhs ) )\n    {\n    }\n\n    DrawIndexedIndirectCommand & operator=( DrawIndexedIndirectCommand const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DrawIndexedIndirectCommand & operator=( VkDrawIndexedIndirectCommand const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DrawIndexedIndirectCommand const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DrawIndexedIndirectCommand & setIndexCount( uint32_t indexCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexCount = indexCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DrawIndexedIndirectCommand & setInstanceCount( uint32_t instanceCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      instanceCount = instanceCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DrawIndexedIndirectCommand & setFirstIndex( uint32_t firstIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      firstIndex = firstIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DrawIndexedIndirectCommand & setVertexOffset( int32_t vertexOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexOffset = vertexOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DrawIndexedIndirectCommand & setFirstInstance( uint32_t firstInstance_ ) VULKAN_HPP_NOEXCEPT\n    {\n      firstInstance = firstInstance_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDrawIndexedIndirectCommand const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDrawIndexedIndirectCommand *>( this );\n    }\n\n    operator VkDrawIndexedIndirectCommand &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDrawIndexedIndirectCommand *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &, uint32_t const &, int32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( indexCount, instanceCount, firstIndex, vertexOffset, firstInstance );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DrawIndexedIndirectCommand const & ) const = default;\n#else\n    bool operator==( DrawIndexedIndirectCommand const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( indexCount == rhs.indexCount ) && ( instanceCount == rhs.instanceCount ) && ( firstIndex == rhs.firstIndex ) &&\n             ( vertexOffset == rhs.vertexOffset ) && ( firstInstance == rhs.firstInstance );\n#  endif\n    }\n\n    bool operator!=( DrawIndexedIndirectCommand const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t indexCount    = {};\n    uint32_t instanceCount = {};\n    uint32_t firstIndex    = {};\n    int32_t  vertexOffset  = {};\n    uint32_t firstInstance = {};\n  };\n\n  struct DrawIndirectCommand\n  {\n    using NativeType = VkDrawIndirectCommand;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DrawIndirectCommand( uint32_t vertexCount_   = {},\n                                              uint32_t instanceCount_ = {},\n                                              uint32_t firstVertex_   = {},\n                                              uint32_t firstInstance_ = {} ) VULKAN_HPP_NOEXCEPT\n      : vertexCount{ vertexCount_ }\n      , instanceCount{ instanceCount_ }\n      , firstVertex{ firstVertex_ }\n      , firstInstance{ firstInstance_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DrawIndirectCommand( DrawIndirectCommand const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DrawIndirectCommand( VkDrawIndirectCommand const & rhs ) VULKAN_HPP_NOEXCEPT : DrawIndirectCommand( *reinterpret_cast<DrawIndirectCommand const *>( &rhs ) )\n    {\n    }\n\n    DrawIndirectCommand & operator=( DrawIndirectCommand const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DrawIndirectCommand & operator=( VkDrawIndirectCommand const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DrawIndirectCommand const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DrawIndirectCommand & setVertexCount( uint32_t vertexCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexCount = vertexCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DrawIndirectCommand & setInstanceCount( uint32_t instanceCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      instanceCount = instanceCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DrawIndirectCommand & setFirstVertex( uint32_t firstVertex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      firstVertex = firstVertex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DrawIndirectCommand & setFirstInstance( uint32_t firstInstance_ ) VULKAN_HPP_NOEXCEPT\n    {\n      firstInstance = firstInstance_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDrawIndirectCommand const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDrawIndirectCommand *>( this );\n    }\n\n    operator VkDrawIndirectCommand &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDrawIndirectCommand *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( vertexCount, instanceCount, firstVertex, firstInstance );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DrawIndirectCommand const & ) const = default;\n#else\n    bool operator==( DrawIndirectCommand const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( vertexCount == rhs.vertexCount ) && ( instanceCount == rhs.instanceCount ) && ( firstVertex == rhs.firstVertex ) &&\n             ( firstInstance == rhs.firstInstance );\n#  endif\n    }\n\n    bool operator!=( DrawIndirectCommand const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t vertexCount   = {};\n    uint32_t instanceCount = {};\n    uint32_t firstVertex   = {};\n    uint32_t firstInstance = {};\n  };\n\n  struct DrawIndirectCountIndirectCommandEXT\n  {\n    using NativeType = VkDrawIndirectCountIndirectCommandEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DrawIndirectCountIndirectCommandEXT( VULKAN_HPP_NAMESPACE::DeviceAddress bufferAddress_ = {},\n                                                              uint32_t                            stride_        = {},\n                                                              uint32_t                            commandCount_  = {} ) VULKAN_HPP_NOEXCEPT\n      : bufferAddress{ bufferAddress_ }\n      , stride{ stride_ }\n      , commandCount{ commandCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DrawIndirectCountIndirectCommandEXT( DrawIndirectCountIndirectCommandEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DrawIndirectCountIndirectCommandEXT( VkDrawIndirectCountIndirectCommandEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DrawIndirectCountIndirectCommandEXT( *reinterpret_cast<DrawIndirectCountIndirectCommandEXT const *>( &rhs ) )\n    {\n    }\n\n    DrawIndirectCountIndirectCommandEXT & operator=( DrawIndirectCountIndirectCommandEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DrawIndirectCountIndirectCommandEXT & operator=( VkDrawIndirectCountIndirectCommandEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DrawIndirectCountIndirectCommandEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DrawIndirectCountIndirectCommandEXT & setBufferAddress( VULKAN_HPP_NAMESPACE::DeviceAddress bufferAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferAddress = bufferAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DrawIndirectCountIndirectCommandEXT & setStride( uint32_t stride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stride = stride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DrawIndirectCountIndirectCommandEXT & setCommandCount( uint32_t commandCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      commandCount = commandCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDrawIndirectCountIndirectCommandEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDrawIndirectCountIndirectCommandEXT *>( this );\n    }\n\n    operator VkDrawIndirectCountIndirectCommandEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDrawIndirectCountIndirectCommandEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DeviceAddress const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( bufferAddress, stride, commandCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DrawIndirectCountIndirectCommandEXT const & ) const = default;\n#else\n    bool operator==( DrawIndirectCountIndirectCommandEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( bufferAddress == rhs.bufferAddress ) && ( stride == rhs.stride ) && ( commandCount == rhs.commandCount );\n#  endif\n    }\n\n    bool operator!=( DrawIndirectCountIndirectCommandEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DeviceAddress bufferAddress = {};\n    uint32_t                            stride        = {};\n    uint32_t                            commandCount  = {};\n  };\n\n  struct DrawMeshTasksIndirectCommandEXT\n  {\n    using NativeType = VkDrawMeshTasksIndirectCommandEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      DrawMeshTasksIndirectCommandEXT( uint32_t groupCountX_ = {}, uint32_t groupCountY_ = {}, uint32_t groupCountZ_ = {} ) VULKAN_HPP_NOEXCEPT\n      : groupCountX{ groupCountX_ }\n      , groupCountY{ groupCountY_ }\n      , groupCountZ{ groupCountZ_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DrawMeshTasksIndirectCommandEXT( DrawMeshTasksIndirectCommandEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DrawMeshTasksIndirectCommandEXT( VkDrawMeshTasksIndirectCommandEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DrawMeshTasksIndirectCommandEXT( *reinterpret_cast<DrawMeshTasksIndirectCommandEXT const *>( &rhs ) )\n    {\n    }\n\n    DrawMeshTasksIndirectCommandEXT & operator=( DrawMeshTasksIndirectCommandEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DrawMeshTasksIndirectCommandEXT & operator=( VkDrawMeshTasksIndirectCommandEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DrawMeshTasksIndirectCommandEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DrawMeshTasksIndirectCommandEXT & setGroupCountX( uint32_t groupCountX_ ) VULKAN_HPP_NOEXCEPT\n    {\n      groupCountX = groupCountX_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DrawMeshTasksIndirectCommandEXT & setGroupCountY( uint32_t groupCountY_ ) VULKAN_HPP_NOEXCEPT\n    {\n      groupCountY = groupCountY_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DrawMeshTasksIndirectCommandEXT & setGroupCountZ( uint32_t groupCountZ_ ) VULKAN_HPP_NOEXCEPT\n    {\n      groupCountZ = groupCountZ_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDrawMeshTasksIndirectCommandEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDrawMeshTasksIndirectCommandEXT *>( this );\n    }\n\n    operator VkDrawMeshTasksIndirectCommandEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDrawMeshTasksIndirectCommandEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( groupCountX, groupCountY, groupCountZ );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DrawMeshTasksIndirectCommandEXT const & ) const = default;\n#else\n    bool operator==( DrawMeshTasksIndirectCommandEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( groupCountX == rhs.groupCountX ) && ( groupCountY == rhs.groupCountY ) && ( groupCountZ == rhs.groupCountZ );\n#  endif\n    }\n\n    bool operator!=( DrawMeshTasksIndirectCommandEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t groupCountX = {};\n    uint32_t groupCountY = {};\n    uint32_t groupCountZ = {};\n  };\n\n  struct DrawMeshTasksIndirectCommandNV\n  {\n    using NativeType = VkDrawMeshTasksIndirectCommandNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DrawMeshTasksIndirectCommandNV( uint32_t taskCount_ = {}, uint32_t firstTask_ = {} ) VULKAN_HPP_NOEXCEPT\n      : taskCount{ taskCount_ }\n      , firstTask{ firstTask_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DrawMeshTasksIndirectCommandNV( DrawMeshTasksIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DrawMeshTasksIndirectCommandNV( VkDrawMeshTasksIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DrawMeshTasksIndirectCommandNV( *reinterpret_cast<DrawMeshTasksIndirectCommandNV const *>( &rhs ) )\n    {\n    }\n\n    DrawMeshTasksIndirectCommandNV & operator=( DrawMeshTasksIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DrawMeshTasksIndirectCommandNV & operator=( VkDrawMeshTasksIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DrawMeshTasksIndirectCommandNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 DrawMeshTasksIndirectCommandNV & setTaskCount( uint32_t taskCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      taskCount = taskCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 DrawMeshTasksIndirectCommandNV & setFirstTask( uint32_t firstTask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      firstTask = firstTask_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkDrawMeshTasksIndirectCommandNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDrawMeshTasksIndirectCommandNV *>( this );\n    }\n\n    operator VkDrawMeshTasksIndirectCommandNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDrawMeshTasksIndirectCommandNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( taskCount, firstTask );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DrawMeshTasksIndirectCommandNV const & ) const = default;\n#else\n    bool operator==( DrawMeshTasksIndirectCommandNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( taskCount == rhs.taskCount ) && ( firstTask == rhs.firstTask );\n#  endif\n    }\n\n    bool operator!=( DrawMeshTasksIndirectCommandNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t taskCount = {};\n    uint32_t firstTask = {};\n  };\n\n  struct DrmFormatModifierProperties2EXT\n  {\n    using NativeType = VkDrmFormatModifierProperties2EXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DrmFormatModifierProperties2EXT( uint64_t                                  drmFormatModifier_               = {},\n                                                          uint32_t                                  drmFormatModifierPlaneCount_     = {},\n                                                          VULKAN_HPP_NAMESPACE::FormatFeatureFlags2 drmFormatModifierTilingFeatures_ = {} ) VULKAN_HPP_NOEXCEPT\n      : drmFormatModifier{ drmFormatModifier_ }\n      , drmFormatModifierPlaneCount{ drmFormatModifierPlaneCount_ }\n      , drmFormatModifierTilingFeatures{ drmFormatModifierTilingFeatures_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DrmFormatModifierProperties2EXT( DrmFormatModifierProperties2EXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DrmFormatModifierProperties2EXT( VkDrmFormatModifierProperties2EXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DrmFormatModifierProperties2EXT( *reinterpret_cast<DrmFormatModifierProperties2EXT const *>( &rhs ) )\n    {\n    }\n\n    DrmFormatModifierProperties2EXT & operator=( DrmFormatModifierProperties2EXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DrmFormatModifierProperties2EXT & operator=( VkDrmFormatModifierProperties2EXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DrmFormatModifierProperties2EXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkDrmFormatModifierProperties2EXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDrmFormatModifierProperties2EXT *>( this );\n    }\n\n    operator VkDrmFormatModifierProperties2EXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDrmFormatModifierProperties2EXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint64_t const &, uint32_t const &, VULKAN_HPP_NAMESPACE::FormatFeatureFlags2 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( drmFormatModifier, drmFormatModifierPlaneCount, drmFormatModifierTilingFeatures );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DrmFormatModifierProperties2EXT const & ) const = default;\n#else\n    bool operator==( DrmFormatModifierProperties2EXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( drmFormatModifier == rhs.drmFormatModifier ) && ( drmFormatModifierPlaneCount == rhs.drmFormatModifierPlaneCount ) &&\n             ( drmFormatModifierTilingFeatures == rhs.drmFormatModifierTilingFeatures );\n#  endif\n    }\n\n    bool operator!=( DrmFormatModifierProperties2EXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint64_t                                  drmFormatModifier               = {};\n    uint32_t                                  drmFormatModifierPlaneCount     = {};\n    VULKAN_HPP_NAMESPACE::FormatFeatureFlags2 drmFormatModifierTilingFeatures = {};\n  };\n\n  struct DrmFormatModifierPropertiesEXT\n  {\n    using NativeType = VkDrmFormatModifierPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DrmFormatModifierPropertiesEXT( uint64_t                                 drmFormatModifier_               = {},\n                                                         uint32_t                                 drmFormatModifierPlaneCount_     = {},\n                                                         VULKAN_HPP_NAMESPACE::FormatFeatureFlags drmFormatModifierTilingFeatures_ = {} ) VULKAN_HPP_NOEXCEPT\n      : drmFormatModifier{ drmFormatModifier_ }\n      , drmFormatModifierPlaneCount{ drmFormatModifierPlaneCount_ }\n      , drmFormatModifierTilingFeatures{ drmFormatModifierTilingFeatures_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DrmFormatModifierPropertiesEXT( DrmFormatModifierPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DrmFormatModifierPropertiesEXT( VkDrmFormatModifierPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DrmFormatModifierPropertiesEXT( *reinterpret_cast<DrmFormatModifierPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    DrmFormatModifierPropertiesEXT & operator=( DrmFormatModifierPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DrmFormatModifierPropertiesEXT & operator=( VkDrmFormatModifierPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkDrmFormatModifierPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDrmFormatModifierPropertiesEXT *>( this );\n    }\n\n    operator VkDrmFormatModifierPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDrmFormatModifierPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint64_t const &, uint32_t const &, VULKAN_HPP_NAMESPACE::FormatFeatureFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( drmFormatModifier, drmFormatModifierPlaneCount, drmFormatModifierTilingFeatures );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DrmFormatModifierPropertiesEXT const & ) const = default;\n#else\n    bool operator==( DrmFormatModifierPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( drmFormatModifier == rhs.drmFormatModifier ) && ( drmFormatModifierPlaneCount == rhs.drmFormatModifierPlaneCount ) &&\n             ( drmFormatModifierTilingFeatures == rhs.drmFormatModifierTilingFeatures );\n#  endif\n    }\n\n    bool operator!=( DrmFormatModifierPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint64_t                                 drmFormatModifier               = {};\n    uint32_t                                 drmFormatModifierPlaneCount     = {};\n    VULKAN_HPP_NAMESPACE::FormatFeatureFlags drmFormatModifierTilingFeatures = {};\n  };\n\n  struct DrmFormatModifierPropertiesList2EXT\n  {\n    using NativeType = VkDrmFormatModifierPropertiesList2EXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDrmFormatModifierPropertiesList2EXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DrmFormatModifierPropertiesList2EXT( uint32_t                                                drmFormatModifierCount_       = {},\n                                                              VULKAN_HPP_NAMESPACE::DrmFormatModifierProperties2EXT * pDrmFormatModifierProperties_ = {},\n                                                              void *                                                  pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , drmFormatModifierCount{ drmFormatModifierCount_ }\n      , pDrmFormatModifierProperties{ pDrmFormatModifierProperties_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DrmFormatModifierPropertiesList2EXT( DrmFormatModifierPropertiesList2EXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DrmFormatModifierPropertiesList2EXT( VkDrmFormatModifierPropertiesList2EXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DrmFormatModifierPropertiesList2EXT( *reinterpret_cast<DrmFormatModifierPropertiesList2EXT const *>( &rhs ) )\n    {\n    }\n\n    DrmFormatModifierPropertiesList2EXT & operator=( DrmFormatModifierPropertiesList2EXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DrmFormatModifierPropertiesList2EXT & operator=( VkDrmFormatModifierPropertiesList2EXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesList2EXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkDrmFormatModifierPropertiesList2EXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDrmFormatModifierPropertiesList2EXT *>( this );\n    }\n\n    operator VkDrmFormatModifierPropertiesList2EXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDrmFormatModifierPropertiesList2EXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &, VULKAN_HPP_NAMESPACE::DrmFormatModifierProperties2EXT * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, drmFormatModifierCount, pDrmFormatModifierProperties );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DrmFormatModifierPropertiesList2EXT const & ) const = default;\n#else\n    bool operator==( DrmFormatModifierPropertiesList2EXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( drmFormatModifierCount == rhs.drmFormatModifierCount ) &&\n             ( pDrmFormatModifierProperties == rhs.pDrmFormatModifierProperties );\n#  endif\n    }\n\n    bool operator!=( DrmFormatModifierPropertiesList2EXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                     sType                        = StructureType::eDrmFormatModifierPropertiesList2EXT;\n    void *                                                  pNext                        = {};\n    uint32_t                                                drmFormatModifierCount       = {};\n    VULKAN_HPP_NAMESPACE::DrmFormatModifierProperties2EXT * pDrmFormatModifierProperties = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDrmFormatModifierPropertiesList2EXT>\n  {\n    using Type = DrmFormatModifierPropertiesList2EXT;\n  };\n\n  struct DrmFormatModifierPropertiesListEXT\n  {\n    using NativeType = VkDrmFormatModifierPropertiesListEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eDrmFormatModifierPropertiesListEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR DrmFormatModifierPropertiesListEXT( uint32_t                                               drmFormatModifierCount_       = {},\n                                                             VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesEXT * pDrmFormatModifierProperties_ = {},\n                                                             void *                                                 pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , drmFormatModifierCount{ drmFormatModifierCount_ }\n      , pDrmFormatModifierProperties{ pDrmFormatModifierProperties_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR DrmFormatModifierPropertiesListEXT( DrmFormatModifierPropertiesListEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    DrmFormatModifierPropertiesListEXT( VkDrmFormatModifierPropertiesListEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : DrmFormatModifierPropertiesListEXT( *reinterpret_cast<DrmFormatModifierPropertiesListEXT const *>( &rhs ) )\n    {\n    }\n\n    DrmFormatModifierPropertiesListEXT & operator=( DrmFormatModifierPropertiesListEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    DrmFormatModifierPropertiesListEXT & operator=( VkDrmFormatModifierPropertiesListEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesListEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkDrmFormatModifierPropertiesListEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkDrmFormatModifierPropertiesListEXT *>( this );\n    }\n\n    operator VkDrmFormatModifierPropertiesListEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkDrmFormatModifierPropertiesListEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &, VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesEXT * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, drmFormatModifierCount, pDrmFormatModifierProperties );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( DrmFormatModifierPropertiesListEXT const & ) const = default;\n#else\n    bool operator==( DrmFormatModifierPropertiesListEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( drmFormatModifierCount == rhs.drmFormatModifierCount ) &&\n             ( pDrmFormatModifierProperties == rhs.pDrmFormatModifierProperties );\n#  endif\n    }\n\n    bool operator!=( DrmFormatModifierPropertiesListEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType                        = StructureType::eDrmFormatModifierPropertiesListEXT;\n    void *                                                 pNext                        = {};\n    uint32_t                                               drmFormatModifierCount       = {};\n    VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesEXT * pDrmFormatModifierProperties = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eDrmFormatModifierPropertiesListEXT>\n  {\n    using Type = DrmFormatModifierPropertiesListEXT;\n  };\n\n  struct EventCreateInfo\n  {\n    using NativeType = VkEventCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eEventCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR EventCreateInfo( VULKAN_HPP_NAMESPACE::EventCreateFlags flags_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR EventCreateInfo( EventCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    EventCreateInfo( VkEventCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT : EventCreateInfo( *reinterpret_cast<EventCreateInfo const *>( &rhs ) ) {}\n\n    EventCreateInfo & operator=( EventCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    EventCreateInfo & operator=( VkEventCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::EventCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 EventCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 EventCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::EventCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkEventCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkEventCreateInfo *>( this );\n    }\n\n    operator VkEventCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkEventCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::EventCreateFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( EventCreateInfo const & ) const = default;\n#else\n    bool operator==( EventCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags );\n#  endif\n    }\n\n    bool operator!=( EventCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType = StructureType::eEventCreateInfo;\n    const void *                           pNext = {};\n    VULKAN_HPP_NAMESPACE::EventCreateFlags flags = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eEventCreateInfo>\n  {\n    using Type = EventCreateInfo;\n  };\n\n  struct PipelineLibraryCreateInfoKHR\n  {\n    using NativeType = VkPipelineLibraryCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineLibraryCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineLibraryCreateInfoKHR( uint32_t                               libraryCount_ = {},\n                                                       const VULKAN_HPP_NAMESPACE::Pipeline * pLibraries_   = {},\n                                                       const void *                           pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , libraryCount{ libraryCount_ }\n      , pLibraries{ pLibraries_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineLibraryCreateInfoKHR( PipelineLibraryCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineLibraryCreateInfoKHR( VkPipelineLibraryCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineLibraryCreateInfoKHR( *reinterpret_cast<PipelineLibraryCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineLibraryCreateInfoKHR( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Pipeline> const & libraries_,\n                                  const void *                                                                                pNext_ = nullptr )\n      : pNext( pNext_ ), libraryCount( static_cast<uint32_t>( libraries_.size() ) ), pLibraries( libraries_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PipelineLibraryCreateInfoKHR & operator=( PipelineLibraryCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineLibraryCreateInfoKHR & operator=( VkPipelineLibraryCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineLibraryCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineLibraryCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineLibraryCreateInfoKHR & setLibraryCount( uint32_t libraryCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      libraryCount = libraryCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineLibraryCreateInfoKHR & setPLibraries( const VULKAN_HPP_NAMESPACE::Pipeline * pLibraries_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pLibraries = pLibraries_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineLibraryCreateInfoKHR &\n      setLibraries( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Pipeline> const & libraries_ ) VULKAN_HPP_NOEXCEPT\n    {\n      libraryCount = static_cast<uint32_t>( libraries_.size() );\n      pLibraries   = libraries_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineLibraryCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineLibraryCreateInfoKHR *>( this );\n    }\n\n    operator VkPipelineLibraryCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineLibraryCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::Pipeline * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, libraryCount, pLibraries );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineLibraryCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( PipelineLibraryCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( libraryCount == rhs.libraryCount ) && ( pLibraries == rhs.pLibraries );\n#  endif\n    }\n\n    bool operator!=( PipelineLibraryCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType        = StructureType::ePipelineLibraryCreateInfoKHR;\n    const void *                           pNext        = {};\n    uint32_t                               libraryCount = {};\n    const VULKAN_HPP_NAMESPACE::Pipeline * pLibraries   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineLibraryCreateInfoKHR>\n  {\n    using Type = PipelineLibraryCreateInfoKHR;\n  };\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  struct ExecutionGraphPipelineCreateInfoAMDX\n  {\n    using NativeType = VkExecutionGraphPipelineCreateInfoAMDX;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExecutionGraphPipelineCreateInfoAMDX;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExecutionGraphPipelineCreateInfoAMDX( VULKAN_HPP_NAMESPACE::PipelineCreateFlags                   flags_              = {},\n                                                               uint32_t                                                    stageCount_         = {},\n                                                               const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo * pStages_            = {},\n                                                               const VULKAN_HPP_NAMESPACE::PipelineLibraryCreateInfoKHR *  pLibraryInfo_       = {},\n                                                               VULKAN_HPP_NAMESPACE::PipelineLayout                        layout_             = {},\n                                                               VULKAN_HPP_NAMESPACE::Pipeline                              basePipelineHandle_ = {},\n                                                               int32_t                                                     basePipelineIndex_  = {},\n                                                               const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , stageCount{ stageCount_ }\n      , pStages{ pStages_ }\n      , pLibraryInfo{ pLibraryInfo_ }\n      , layout{ layout_ }\n      , basePipelineHandle{ basePipelineHandle_ }\n      , basePipelineIndex{ basePipelineIndex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExecutionGraphPipelineCreateInfoAMDX( ExecutionGraphPipelineCreateInfoAMDX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExecutionGraphPipelineCreateInfoAMDX( VkExecutionGraphPipelineCreateInfoAMDX const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExecutionGraphPipelineCreateInfoAMDX( *reinterpret_cast<ExecutionGraphPipelineCreateInfoAMDX const *>( &rhs ) )\n    {\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ExecutionGraphPipelineCreateInfoAMDX(\n      VULKAN_HPP_NAMESPACE::PipelineCreateFlags                                                                        flags_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo> const & stages_,\n      const VULKAN_HPP_NAMESPACE::PipelineLibraryCreateInfoKHR *                                                       pLibraryInfo_       = {},\n      VULKAN_HPP_NAMESPACE::PipelineLayout                                                                             layout_             = {},\n      VULKAN_HPP_NAMESPACE::Pipeline                                                                                   basePipelineHandle_ = {},\n      int32_t                                                                                                          basePipelineIndex_  = {},\n      const void *                                                                                                     pNext_              = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , stageCount( static_cast<uint32_t>( stages_.size() ) )\n      , pStages( stages_.data() )\n      , pLibraryInfo( pLibraryInfo_ )\n      , layout( layout_ )\n      , basePipelineHandle( basePipelineHandle_ )\n      , basePipelineIndex( basePipelineIndex_ )\n    {\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    ExecutionGraphPipelineCreateInfoAMDX & operator=( ExecutionGraphPipelineCreateInfoAMDX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExecutionGraphPipelineCreateInfoAMDX & operator=( VkExecutionGraphPipelineCreateInfoAMDX const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineCreateInfoAMDX const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExecutionGraphPipelineCreateInfoAMDX & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExecutionGraphPipelineCreateInfoAMDX & setFlags( VULKAN_HPP_NAMESPACE::PipelineCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExecutionGraphPipelineCreateInfoAMDX & setStageCount( uint32_t stageCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stageCount = stageCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExecutionGraphPipelineCreateInfoAMDX &\n      setPStages( const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo * pStages_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStages = pStages_;\n      return *this;\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ExecutionGraphPipelineCreateInfoAMDX &\n      setStages( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo> const & stages_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stageCount = static_cast<uint32_t>( stages_.size() );\n      pStages    = stages_.data();\n      return *this;\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 ExecutionGraphPipelineCreateInfoAMDX &\n      setPLibraryInfo( const VULKAN_HPP_NAMESPACE::PipelineLibraryCreateInfoKHR * pLibraryInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pLibraryInfo = pLibraryInfo_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExecutionGraphPipelineCreateInfoAMDX & setLayout( VULKAN_HPP_NAMESPACE::PipelineLayout layout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layout = layout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExecutionGraphPipelineCreateInfoAMDX &\n      setBasePipelineHandle( VULKAN_HPP_NAMESPACE::Pipeline basePipelineHandle_ ) VULKAN_HPP_NOEXCEPT\n    {\n      basePipelineHandle = basePipelineHandle_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExecutionGraphPipelineCreateInfoAMDX & setBasePipelineIndex( int32_t basePipelineIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      basePipelineIndex = basePipelineIndex_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExecutionGraphPipelineCreateInfoAMDX const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExecutionGraphPipelineCreateInfoAMDX *>( this );\n    }\n\n    operator VkExecutionGraphPipelineCreateInfoAMDX &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExecutionGraphPipelineCreateInfoAMDX *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineCreateFlags const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo * const &,\n               const VULKAN_HPP_NAMESPACE::PipelineLibraryCreateInfoKHR * const &,\n               VULKAN_HPP_NAMESPACE::PipelineLayout const &,\n               VULKAN_HPP_NAMESPACE::Pipeline const &,\n               int32_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, stageCount, pStages, pLibraryInfo, layout, basePipelineHandle, basePipelineIndex );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExecutionGraphPipelineCreateInfoAMDX const & ) const = default;\n#  else\n    bool operator==( ExecutionGraphPipelineCreateInfoAMDX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( stageCount == rhs.stageCount ) && ( pStages == rhs.pStages ) &&\n             ( pLibraryInfo == rhs.pLibraryInfo ) && ( layout == rhs.layout ) && ( basePipelineHandle == rhs.basePipelineHandle ) &&\n             ( basePipelineIndex == rhs.basePipelineIndex );\n#    endif\n    }\n\n    bool operator!=( ExecutionGraphPipelineCreateInfoAMDX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                         sType              = StructureType::eExecutionGraphPipelineCreateInfoAMDX;\n    const void *                                                pNext              = {};\n    VULKAN_HPP_NAMESPACE::PipelineCreateFlags                   flags              = {};\n    uint32_t                                                    stageCount         = {};\n    const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo * pStages            = {};\n    const VULKAN_HPP_NAMESPACE::PipelineLibraryCreateInfoKHR *  pLibraryInfo       = {};\n    VULKAN_HPP_NAMESPACE::PipelineLayout                        layout             = {};\n    VULKAN_HPP_NAMESPACE::Pipeline                              basePipelineHandle = {};\n    int32_t                                                     basePipelineIndex  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExecutionGraphPipelineCreateInfoAMDX>\n  {\n    using Type = ExecutionGraphPipelineCreateInfoAMDX;\n  };\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  struct ExecutionGraphPipelineScratchSizeAMDX\n  {\n    using NativeType = VkExecutionGraphPipelineScratchSizeAMDX;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExecutionGraphPipelineScratchSizeAMDX;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExecutionGraphPipelineScratchSizeAMDX( VULKAN_HPP_NAMESPACE::DeviceSize minSize_         = {},\n                                                                VULKAN_HPP_NAMESPACE::DeviceSize maxSize_         = {},\n                                                                VULKAN_HPP_NAMESPACE::DeviceSize sizeGranularity_ = {},\n                                                                void *                           pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , minSize{ minSize_ }\n      , maxSize{ maxSize_ }\n      , sizeGranularity{ sizeGranularity_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExecutionGraphPipelineScratchSizeAMDX( ExecutionGraphPipelineScratchSizeAMDX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExecutionGraphPipelineScratchSizeAMDX( VkExecutionGraphPipelineScratchSizeAMDX const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExecutionGraphPipelineScratchSizeAMDX( *reinterpret_cast<ExecutionGraphPipelineScratchSizeAMDX const *>( &rhs ) )\n    {\n    }\n\n    ExecutionGraphPipelineScratchSizeAMDX & operator=( ExecutionGraphPipelineScratchSizeAMDX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExecutionGraphPipelineScratchSizeAMDX & operator=( VkExecutionGraphPipelineScratchSizeAMDX const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExecutionGraphPipelineScratchSizeAMDX const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExecutionGraphPipelineScratchSizeAMDX & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExecutionGraphPipelineScratchSizeAMDX & setMinSize( VULKAN_HPP_NAMESPACE::DeviceSize minSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minSize = minSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExecutionGraphPipelineScratchSizeAMDX & setMaxSize( VULKAN_HPP_NAMESPACE::DeviceSize maxSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxSize = maxSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExecutionGraphPipelineScratchSizeAMDX & setSizeGranularity( VULKAN_HPP_NAMESPACE::DeviceSize sizeGranularity_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sizeGranularity = sizeGranularity_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExecutionGraphPipelineScratchSizeAMDX const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExecutionGraphPipelineScratchSizeAMDX *>( this );\n    }\n\n    operator VkExecutionGraphPipelineScratchSizeAMDX &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExecutionGraphPipelineScratchSizeAMDX *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, minSize, maxSize, sizeGranularity );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExecutionGraphPipelineScratchSizeAMDX const & ) const = default;\n#  else\n    bool operator==( ExecutionGraphPipelineScratchSizeAMDX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( minSize == rhs.minSize ) && ( maxSize == rhs.maxSize ) &&\n             ( sizeGranularity == rhs.sizeGranularity );\n#    endif\n    }\n\n    bool operator!=( ExecutionGraphPipelineScratchSizeAMDX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType           = StructureType::eExecutionGraphPipelineScratchSizeAMDX;\n    void *                              pNext           = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    minSize         = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    maxSize         = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    sizeGranularity = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExecutionGraphPipelineScratchSizeAMDX>\n  {\n    using Type = ExecutionGraphPipelineScratchSizeAMDX;\n  };\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  struct ExportFenceCreateInfo\n  {\n    using NativeType = VkExportFenceCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExportFenceCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExportFenceCreateInfo( VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlags handleTypes_ = {},\n                                                const void *                                       pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , handleTypes{ handleTypes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExportFenceCreateInfo( ExportFenceCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExportFenceCreateInfo( VkExportFenceCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExportFenceCreateInfo( *reinterpret_cast<ExportFenceCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    ExportFenceCreateInfo & operator=( ExportFenceCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExportFenceCreateInfo & operator=( VkExportFenceCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExportFenceCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExportFenceCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportFenceCreateInfo & setHandleTypes( VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlags handleTypes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleTypes = handleTypes_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExportFenceCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExportFenceCreateInfo *>( this );\n    }\n\n    operator VkExportFenceCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExportFenceCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, handleTypes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExportFenceCreateInfo const & ) const = default;\n#else\n    bool operator==( ExportFenceCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( handleTypes == rhs.handleTypes );\n#  endif\n    }\n\n    bool operator!=( ExportFenceCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                sType       = StructureType::eExportFenceCreateInfo;\n    const void *                                       pNext       = {};\n    VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlags handleTypes = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExportFenceCreateInfo>\n  {\n    using Type = ExportFenceCreateInfo;\n  };\n\n  using ExportFenceCreateInfoKHR = ExportFenceCreateInfo;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  struct ExportFenceWin32HandleInfoKHR\n  {\n    using NativeType = VkExportFenceWin32HandleInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExportFenceWin32HandleInfoKHR;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExportFenceWin32HandleInfoKHR( const SECURITY_ATTRIBUTES * pAttributes_ = {},\n                                                        DWORD                       dwAccess_    = {},\n                                                        LPCWSTR                     name_        = {},\n                                                        const void *                pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pAttributes{ pAttributes_ }\n      , dwAccess{ dwAccess_ }\n      , name{ name_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExportFenceWin32HandleInfoKHR( ExportFenceWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExportFenceWin32HandleInfoKHR( VkExportFenceWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExportFenceWin32HandleInfoKHR( *reinterpret_cast<ExportFenceWin32HandleInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    ExportFenceWin32HandleInfoKHR & operator=( ExportFenceWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExportFenceWin32HandleInfoKHR & operator=( VkExportFenceWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExportFenceWin32HandleInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExportFenceWin32HandleInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportFenceWin32HandleInfoKHR & setPAttributes( const SECURITY_ATTRIBUTES * pAttributes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pAttributes = pAttributes_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportFenceWin32HandleInfoKHR & setDwAccess( DWORD dwAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dwAccess = dwAccess_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportFenceWin32HandleInfoKHR & setName( LPCWSTR name_ ) VULKAN_HPP_NOEXCEPT\n    {\n      name = name_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExportFenceWin32HandleInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExportFenceWin32HandleInfoKHR *>( this );\n    }\n\n    operator VkExportFenceWin32HandleInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExportFenceWin32HandleInfoKHR *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, const SECURITY_ATTRIBUTES * const &, DWORD const &, LPCWSTR const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pAttributes, dwAccess, name );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExportFenceWin32HandleInfoKHR const & ) const = default;\n#  else\n    bool operator==( ExportFenceWin32HandleInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pAttributes == rhs.pAttributes ) && ( dwAccess == rhs.dwAccess ) && ( name == rhs.name );\n#    endif\n    }\n\n    bool operator!=( ExportFenceWin32HandleInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType       = StructureType::eExportFenceWin32HandleInfoKHR;\n    const void *                        pNext       = {};\n    const SECURITY_ATTRIBUTES *         pAttributes = {};\n    DWORD                               dwAccess    = {};\n    LPCWSTR                             name        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExportFenceWin32HandleInfoKHR>\n  {\n    using Type = ExportFenceWin32HandleInfoKHR;\n  };\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  struct ExportMemoryAllocateInfo\n  {\n    using NativeType = VkExportMemoryAllocateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExportMemoryAllocateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExportMemoryAllocateInfo( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlags handleTypes_ = {},\n                                                   const void *                                        pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , handleTypes{ handleTypes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExportMemoryAllocateInfo( ExportMemoryAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExportMemoryAllocateInfo( VkExportMemoryAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExportMemoryAllocateInfo( *reinterpret_cast<ExportMemoryAllocateInfo const *>( &rhs ) )\n    {\n    }\n\n    ExportMemoryAllocateInfo & operator=( ExportMemoryAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExportMemoryAllocateInfo & operator=( VkExportMemoryAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExportMemoryAllocateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExportMemoryAllocateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportMemoryAllocateInfo & setHandleTypes( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlags handleTypes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleTypes = handleTypes_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExportMemoryAllocateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExportMemoryAllocateInfo *>( this );\n    }\n\n    operator VkExportMemoryAllocateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExportMemoryAllocateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, handleTypes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExportMemoryAllocateInfo const & ) const = default;\n#else\n    bool operator==( ExportMemoryAllocateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( handleTypes == rhs.handleTypes );\n#  endif\n    }\n\n    bool operator!=( ExportMemoryAllocateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                 sType       = StructureType::eExportMemoryAllocateInfo;\n    const void *                                        pNext       = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlags handleTypes = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExportMemoryAllocateInfo>\n  {\n    using Type = ExportMemoryAllocateInfo;\n  };\n\n  using ExportMemoryAllocateInfoKHR = ExportMemoryAllocateInfo;\n\n  struct ExportMemoryAllocateInfoNV\n  {\n    using NativeType = VkExportMemoryAllocateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExportMemoryAllocateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExportMemoryAllocateInfoNV( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV handleTypes_ = {},\n                                                     const void *                                          pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , handleTypes{ handleTypes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExportMemoryAllocateInfoNV( ExportMemoryAllocateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExportMemoryAllocateInfoNV( VkExportMemoryAllocateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExportMemoryAllocateInfoNV( *reinterpret_cast<ExportMemoryAllocateInfoNV const *>( &rhs ) )\n    {\n    }\n\n    ExportMemoryAllocateInfoNV & operator=( ExportMemoryAllocateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExportMemoryAllocateInfoNV & operator=( VkExportMemoryAllocateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExportMemoryAllocateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExportMemoryAllocateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportMemoryAllocateInfoNV &\n      setHandleTypes( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV handleTypes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleTypes = handleTypes_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExportMemoryAllocateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExportMemoryAllocateInfoNV *>( this );\n    }\n\n    operator VkExportMemoryAllocateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExportMemoryAllocateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, handleTypes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExportMemoryAllocateInfoNV const & ) const = default;\n#else\n    bool operator==( ExportMemoryAllocateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( handleTypes == rhs.handleTypes );\n#  endif\n    }\n\n    bool operator!=( ExportMemoryAllocateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                   sType       = StructureType::eExportMemoryAllocateInfoNV;\n    const void *                                          pNext       = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV handleTypes = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExportMemoryAllocateInfoNV>\n  {\n    using Type = ExportMemoryAllocateInfoNV;\n  };\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  struct ExportMemoryWin32HandleInfoKHR\n  {\n    using NativeType = VkExportMemoryWin32HandleInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExportMemoryWin32HandleInfoKHR;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExportMemoryWin32HandleInfoKHR( const SECURITY_ATTRIBUTES * pAttributes_ = {},\n                                                         DWORD                       dwAccess_    = {},\n                                                         LPCWSTR                     name_        = {},\n                                                         const void *                pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pAttributes{ pAttributes_ }\n      , dwAccess{ dwAccess_ }\n      , name{ name_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExportMemoryWin32HandleInfoKHR( ExportMemoryWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExportMemoryWin32HandleInfoKHR( VkExportMemoryWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExportMemoryWin32HandleInfoKHR( *reinterpret_cast<ExportMemoryWin32HandleInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    ExportMemoryWin32HandleInfoKHR & operator=( ExportMemoryWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExportMemoryWin32HandleInfoKHR & operator=( VkExportMemoryWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExportMemoryWin32HandleInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExportMemoryWin32HandleInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportMemoryWin32HandleInfoKHR & setPAttributes( const SECURITY_ATTRIBUTES * pAttributes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pAttributes = pAttributes_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportMemoryWin32HandleInfoKHR & setDwAccess( DWORD dwAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dwAccess = dwAccess_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportMemoryWin32HandleInfoKHR & setName( LPCWSTR name_ ) VULKAN_HPP_NOEXCEPT\n    {\n      name = name_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExportMemoryWin32HandleInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExportMemoryWin32HandleInfoKHR *>( this );\n    }\n\n    operator VkExportMemoryWin32HandleInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExportMemoryWin32HandleInfoKHR *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, const SECURITY_ATTRIBUTES * const &, DWORD const &, LPCWSTR const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pAttributes, dwAccess, name );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExportMemoryWin32HandleInfoKHR const & ) const = default;\n#  else\n    bool operator==( ExportMemoryWin32HandleInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pAttributes == rhs.pAttributes ) && ( dwAccess == rhs.dwAccess ) && ( name == rhs.name );\n#    endif\n    }\n\n    bool operator!=( ExportMemoryWin32HandleInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType       = StructureType::eExportMemoryWin32HandleInfoKHR;\n    const void *                        pNext       = {};\n    const SECURITY_ATTRIBUTES *         pAttributes = {};\n    DWORD                               dwAccess    = {};\n    LPCWSTR                             name        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExportMemoryWin32HandleInfoKHR>\n  {\n    using Type = ExportMemoryWin32HandleInfoKHR;\n  };\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  struct ExportMemoryWin32HandleInfoNV\n  {\n    using NativeType = VkExportMemoryWin32HandleInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExportMemoryWin32HandleInfoNV;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      ExportMemoryWin32HandleInfoNV( const SECURITY_ATTRIBUTES * pAttributes_ = {}, DWORD dwAccess_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pAttributes{ pAttributes_ }\n      , dwAccess{ dwAccess_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExportMemoryWin32HandleInfoNV( ExportMemoryWin32HandleInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExportMemoryWin32HandleInfoNV( VkExportMemoryWin32HandleInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExportMemoryWin32HandleInfoNV( *reinterpret_cast<ExportMemoryWin32HandleInfoNV const *>( &rhs ) )\n    {\n    }\n\n    ExportMemoryWin32HandleInfoNV & operator=( ExportMemoryWin32HandleInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExportMemoryWin32HandleInfoNV & operator=( VkExportMemoryWin32HandleInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExportMemoryWin32HandleInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExportMemoryWin32HandleInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportMemoryWin32HandleInfoNV & setPAttributes( const SECURITY_ATTRIBUTES * pAttributes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pAttributes = pAttributes_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportMemoryWin32HandleInfoNV & setDwAccess( DWORD dwAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dwAccess = dwAccess_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExportMemoryWin32HandleInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExportMemoryWin32HandleInfoNV *>( this );\n    }\n\n    operator VkExportMemoryWin32HandleInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExportMemoryWin32HandleInfoNV *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, const SECURITY_ATTRIBUTES * const &, DWORD const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pAttributes, dwAccess );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExportMemoryWin32HandleInfoNV const & ) const = default;\n#  else\n    bool operator==( ExportMemoryWin32HandleInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pAttributes == rhs.pAttributes ) && ( dwAccess == rhs.dwAccess );\n#    endif\n    }\n\n    bool operator!=( ExportMemoryWin32HandleInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType       = StructureType::eExportMemoryWin32HandleInfoNV;\n    const void *                        pNext       = {};\n    const SECURITY_ATTRIBUTES *         pAttributes = {};\n    DWORD                               dwAccess    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExportMemoryWin32HandleInfoNV>\n  {\n    using Type = ExportMemoryWin32HandleInfoNV;\n  };\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  struct ExportMetalBufferInfoEXT\n  {\n    using NativeType = VkExportMetalBufferInfoEXT;\n\n    static const bool                                  allowDuplicate = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExportMetalBufferInfoEXT;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExportMetalBufferInfoEXT( VULKAN_HPP_NAMESPACE::DeviceMemory memory_    = {},\n                                                   MTLBuffer_id                       mtlBuffer_ = {},\n                                                   const void *                       pNext_     = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , memory{ memory_ }\n      , mtlBuffer{ mtlBuffer_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExportMetalBufferInfoEXT( ExportMetalBufferInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExportMetalBufferInfoEXT( VkExportMetalBufferInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExportMetalBufferInfoEXT( *reinterpret_cast<ExportMetalBufferInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    ExportMetalBufferInfoEXT & operator=( ExportMetalBufferInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExportMetalBufferInfoEXT & operator=( VkExportMetalBufferInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExportMetalBufferInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalBufferInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalBufferInfoEXT & setMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memory = memory_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalBufferInfoEXT & setMtlBuffer( MTLBuffer_id mtlBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mtlBuffer = mtlBuffer_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExportMetalBufferInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExportMetalBufferInfoEXT *>( this );\n    }\n\n    operator VkExportMetalBufferInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExportMetalBufferInfoEXT *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::DeviceMemory const &, MTLBuffer_id const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, memory, mtlBuffer );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExportMetalBufferInfoEXT const & ) const = default;\n#  else\n    bool operator==( ExportMetalBufferInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memory == rhs.memory ) && ( mtlBuffer == rhs.mtlBuffer );\n#    endif\n    }\n\n    bool operator!=( ExportMetalBufferInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType     = StructureType::eExportMetalBufferInfoEXT;\n    const void *                        pNext     = {};\n    VULKAN_HPP_NAMESPACE::DeviceMemory  memory    = {};\n    MTLBuffer_id                        mtlBuffer = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExportMetalBufferInfoEXT>\n  {\n    using Type = ExportMetalBufferInfoEXT;\n  };\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  struct ExportMetalCommandQueueInfoEXT\n  {\n    using NativeType = VkExportMetalCommandQueueInfoEXT;\n\n    static const bool                                  allowDuplicate = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExportMetalCommandQueueInfoEXT;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExportMetalCommandQueueInfoEXT( VULKAN_HPP_NAMESPACE::Queue queue_           = {},\n                                                         MTLCommandQueue_id          mtlCommandQueue_ = {},\n                                                         const void *                pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , queue{ queue_ }\n      , mtlCommandQueue{ mtlCommandQueue_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExportMetalCommandQueueInfoEXT( ExportMetalCommandQueueInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExportMetalCommandQueueInfoEXT( VkExportMetalCommandQueueInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExportMetalCommandQueueInfoEXT( *reinterpret_cast<ExportMetalCommandQueueInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    ExportMetalCommandQueueInfoEXT & operator=( ExportMetalCommandQueueInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExportMetalCommandQueueInfoEXT & operator=( VkExportMetalCommandQueueInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExportMetalCommandQueueInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalCommandQueueInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalCommandQueueInfoEXT & setQueue( VULKAN_HPP_NAMESPACE::Queue queue_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queue = queue_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalCommandQueueInfoEXT & setMtlCommandQueue( MTLCommandQueue_id mtlCommandQueue_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mtlCommandQueue = mtlCommandQueue_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExportMetalCommandQueueInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExportMetalCommandQueueInfoEXT *>( this );\n    }\n\n    operator VkExportMetalCommandQueueInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExportMetalCommandQueueInfoEXT *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Queue const &, MTLCommandQueue_id const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, queue, mtlCommandQueue );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExportMetalCommandQueueInfoEXT const & ) const = default;\n#  else\n    bool operator==( ExportMetalCommandQueueInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( queue == rhs.queue ) && ( mtlCommandQueue == rhs.mtlCommandQueue );\n#    endif\n    }\n\n    bool operator!=( ExportMetalCommandQueueInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType           = StructureType::eExportMetalCommandQueueInfoEXT;\n    const void *                        pNext           = {};\n    VULKAN_HPP_NAMESPACE::Queue         queue           = {};\n    MTLCommandQueue_id                  mtlCommandQueue = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExportMetalCommandQueueInfoEXT>\n  {\n    using Type = ExportMetalCommandQueueInfoEXT;\n  };\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  struct ExportMetalDeviceInfoEXT\n  {\n    using NativeType = VkExportMetalDeviceInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExportMetalDeviceInfoEXT;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExportMetalDeviceInfoEXT( MTLDevice_id mtlDevice_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , mtlDevice{ mtlDevice_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExportMetalDeviceInfoEXT( ExportMetalDeviceInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExportMetalDeviceInfoEXT( VkExportMetalDeviceInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExportMetalDeviceInfoEXT( *reinterpret_cast<ExportMetalDeviceInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    ExportMetalDeviceInfoEXT & operator=( ExportMetalDeviceInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExportMetalDeviceInfoEXT & operator=( VkExportMetalDeviceInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExportMetalDeviceInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalDeviceInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalDeviceInfoEXT & setMtlDevice( MTLDevice_id mtlDevice_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mtlDevice = mtlDevice_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExportMetalDeviceInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExportMetalDeviceInfoEXT *>( this );\n    }\n\n    operator VkExportMetalDeviceInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExportMetalDeviceInfoEXT *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, MTLDevice_id const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, mtlDevice );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExportMetalDeviceInfoEXT const & ) const = default;\n#  else\n    bool operator==( ExportMetalDeviceInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( mtlDevice == rhs.mtlDevice );\n#    endif\n    }\n\n    bool operator!=( ExportMetalDeviceInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType     = StructureType::eExportMetalDeviceInfoEXT;\n    const void *                        pNext     = {};\n    MTLDevice_id                        mtlDevice = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExportMetalDeviceInfoEXT>\n  {\n    using Type = ExportMetalDeviceInfoEXT;\n  };\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  struct ExportMetalIOSurfaceInfoEXT\n  {\n    using NativeType = VkExportMetalIOSurfaceInfoEXT;\n\n    static const bool                                  allowDuplicate = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExportMetalIoSurfaceInfoEXT;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      ExportMetalIOSurfaceInfoEXT( VULKAN_HPP_NAMESPACE::Image image_ = {}, IOSurfaceRef ioSurface_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , image{ image_ }\n      , ioSurface{ ioSurface_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExportMetalIOSurfaceInfoEXT( ExportMetalIOSurfaceInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExportMetalIOSurfaceInfoEXT( VkExportMetalIOSurfaceInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExportMetalIOSurfaceInfoEXT( *reinterpret_cast<ExportMetalIOSurfaceInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    ExportMetalIOSurfaceInfoEXT & operator=( ExportMetalIOSurfaceInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExportMetalIOSurfaceInfoEXT & operator=( VkExportMetalIOSurfaceInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExportMetalIOSurfaceInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalIOSurfaceInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalIOSurfaceInfoEXT & setImage( VULKAN_HPP_NAMESPACE::Image image_ ) VULKAN_HPP_NOEXCEPT\n    {\n      image = image_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalIOSurfaceInfoEXT & setIoSurface( IOSurfaceRef ioSurface_ ) VULKAN_HPP_NOEXCEPT\n    {\n      ioSurface = ioSurface_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExportMetalIOSurfaceInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExportMetalIOSurfaceInfoEXT *>( this );\n    }\n\n    operator VkExportMetalIOSurfaceInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExportMetalIOSurfaceInfoEXT *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Image const &, IOSurfaceRef const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, image, ioSurface );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExportMetalIOSurfaceInfoEXT const & ) const = default;\n#  else\n    bool operator==( ExportMetalIOSurfaceInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( image == rhs.image ) && ( ioSurface == rhs.ioSurface );\n#    endif\n    }\n\n    bool operator!=( ExportMetalIOSurfaceInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType     = StructureType::eExportMetalIoSurfaceInfoEXT;\n    const void *                        pNext     = {};\n    VULKAN_HPP_NAMESPACE::Image         image     = {};\n    IOSurfaceRef                        ioSurface = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExportMetalIoSurfaceInfoEXT>\n  {\n    using Type = ExportMetalIOSurfaceInfoEXT;\n  };\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  struct ExportMetalObjectCreateInfoEXT\n  {\n    using NativeType = VkExportMetalObjectCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExportMetalObjectCreateInfoEXT;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExportMetalObjectCreateInfoEXT(\n      VULKAN_HPP_NAMESPACE::ExportMetalObjectTypeFlagBitsEXT exportObjectType_ = VULKAN_HPP_NAMESPACE::ExportMetalObjectTypeFlagBitsEXT::eMetalDevice,\n      const void *                                           pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , exportObjectType{ exportObjectType_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExportMetalObjectCreateInfoEXT( ExportMetalObjectCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExportMetalObjectCreateInfoEXT( VkExportMetalObjectCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExportMetalObjectCreateInfoEXT( *reinterpret_cast<ExportMetalObjectCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    ExportMetalObjectCreateInfoEXT & operator=( ExportMetalObjectCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExportMetalObjectCreateInfoEXT & operator=( VkExportMetalObjectCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExportMetalObjectCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalObjectCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalObjectCreateInfoEXT &\n      setExportObjectType( VULKAN_HPP_NAMESPACE::ExportMetalObjectTypeFlagBitsEXT exportObjectType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      exportObjectType = exportObjectType_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExportMetalObjectCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExportMetalObjectCreateInfoEXT *>( this );\n    }\n\n    operator VkExportMetalObjectCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExportMetalObjectCreateInfoEXT *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ExportMetalObjectTypeFlagBitsEXT const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, exportObjectType );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExportMetalObjectCreateInfoEXT const & ) const = default;\n#  else\n    bool operator==( ExportMetalObjectCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( exportObjectType == rhs.exportObjectType );\n#    endif\n    }\n\n    bool operator!=( ExportMetalObjectCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType            = StructureType::eExportMetalObjectCreateInfoEXT;\n    const void *                                           pNext            = {};\n    VULKAN_HPP_NAMESPACE::ExportMetalObjectTypeFlagBitsEXT exportObjectType = VULKAN_HPP_NAMESPACE::ExportMetalObjectTypeFlagBitsEXT::eMetalDevice;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExportMetalObjectCreateInfoEXT>\n  {\n    using Type = ExportMetalObjectCreateInfoEXT;\n  };\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  struct ExportMetalObjectsInfoEXT\n  {\n    using NativeType = VkExportMetalObjectsInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExportMetalObjectsInfoEXT;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExportMetalObjectsInfoEXT( const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT : pNext{ pNext_ } {}\n\n    VULKAN_HPP_CONSTEXPR ExportMetalObjectsInfoEXT( ExportMetalObjectsInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExportMetalObjectsInfoEXT( VkExportMetalObjectsInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExportMetalObjectsInfoEXT( *reinterpret_cast<ExportMetalObjectsInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    ExportMetalObjectsInfoEXT & operator=( ExportMetalObjectsInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExportMetalObjectsInfoEXT & operator=( VkExportMetalObjectsInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExportMetalObjectsInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalObjectsInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExportMetalObjectsInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExportMetalObjectsInfoEXT *>( this );\n    }\n\n    operator VkExportMetalObjectsInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExportMetalObjectsInfoEXT *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExportMetalObjectsInfoEXT const & ) const = default;\n#  else\n    bool operator==( ExportMetalObjectsInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext );\n#    endif\n    }\n\n    bool operator!=( ExportMetalObjectsInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType = StructureType::eExportMetalObjectsInfoEXT;\n    const void *                        pNext = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExportMetalObjectsInfoEXT>\n  {\n    using Type = ExportMetalObjectsInfoEXT;\n  };\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  struct ExportMetalSharedEventInfoEXT\n  {\n    using NativeType = VkExportMetalSharedEventInfoEXT;\n\n    static const bool                                  allowDuplicate = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExportMetalSharedEventInfoEXT;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExportMetalSharedEventInfoEXT( VULKAN_HPP_NAMESPACE::Semaphore semaphore_      = {},\n                                                        VULKAN_HPP_NAMESPACE::Event     event_          = {},\n                                                        MTLSharedEvent_id               mtlSharedEvent_ = {},\n                                                        const void *                    pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , semaphore{ semaphore_ }\n      , event{ event_ }\n      , mtlSharedEvent{ mtlSharedEvent_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExportMetalSharedEventInfoEXT( ExportMetalSharedEventInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExportMetalSharedEventInfoEXT( VkExportMetalSharedEventInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExportMetalSharedEventInfoEXT( *reinterpret_cast<ExportMetalSharedEventInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    ExportMetalSharedEventInfoEXT & operator=( ExportMetalSharedEventInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExportMetalSharedEventInfoEXT & operator=( VkExportMetalSharedEventInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExportMetalSharedEventInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalSharedEventInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalSharedEventInfoEXT & setSemaphore( VULKAN_HPP_NAMESPACE::Semaphore semaphore_ ) VULKAN_HPP_NOEXCEPT\n    {\n      semaphore = semaphore_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalSharedEventInfoEXT & setEvent( VULKAN_HPP_NAMESPACE::Event event_ ) VULKAN_HPP_NOEXCEPT\n    {\n      event = event_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalSharedEventInfoEXT & setMtlSharedEvent( MTLSharedEvent_id mtlSharedEvent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mtlSharedEvent = mtlSharedEvent_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExportMetalSharedEventInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExportMetalSharedEventInfoEXT *>( this );\n    }\n\n    operator VkExportMetalSharedEventInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExportMetalSharedEventInfoEXT *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Semaphore const &,\n               VULKAN_HPP_NAMESPACE::Event const &,\n               MTLSharedEvent_id const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, semaphore, event, mtlSharedEvent );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExportMetalSharedEventInfoEXT const & ) const = default;\n#  else\n    bool operator==( ExportMetalSharedEventInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( semaphore == rhs.semaphore ) && ( event == rhs.event ) &&\n             ( mtlSharedEvent == rhs.mtlSharedEvent );\n#    endif\n    }\n\n    bool operator!=( ExportMetalSharedEventInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::eExportMetalSharedEventInfoEXT;\n    const void *                        pNext          = {};\n    VULKAN_HPP_NAMESPACE::Semaphore     semaphore      = {};\n    VULKAN_HPP_NAMESPACE::Event         event          = {};\n    MTLSharedEvent_id                   mtlSharedEvent = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExportMetalSharedEventInfoEXT>\n  {\n    using Type = ExportMetalSharedEventInfoEXT;\n  };\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  struct ExportMetalTextureInfoEXT\n  {\n    using NativeType = VkExportMetalTextureInfoEXT;\n\n    static const bool                                  allowDuplicate = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExportMetalTextureInfoEXT;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExportMetalTextureInfoEXT( VULKAN_HPP_NAMESPACE::Image               image_      = {},\n                                                    VULKAN_HPP_NAMESPACE::ImageView           imageView_  = {},\n                                                    VULKAN_HPP_NAMESPACE::BufferView          bufferView_ = {},\n                                                    VULKAN_HPP_NAMESPACE::ImageAspectFlagBits plane_      = VULKAN_HPP_NAMESPACE::ImageAspectFlagBits::eColor,\n                                                    MTLTexture_id                             mtlTexture_ = {},\n                                                    const void *                              pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , image{ image_ }\n      , imageView{ imageView_ }\n      , bufferView{ bufferView_ }\n      , plane{ plane_ }\n      , mtlTexture{ mtlTexture_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExportMetalTextureInfoEXT( ExportMetalTextureInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExportMetalTextureInfoEXT( VkExportMetalTextureInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExportMetalTextureInfoEXT( *reinterpret_cast<ExportMetalTextureInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    ExportMetalTextureInfoEXT & operator=( ExportMetalTextureInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExportMetalTextureInfoEXT & operator=( VkExportMetalTextureInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExportMetalTextureInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalTextureInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalTextureInfoEXT & setImage( VULKAN_HPP_NAMESPACE::Image image_ ) VULKAN_HPP_NOEXCEPT\n    {\n      image = image_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalTextureInfoEXT & setImageView( VULKAN_HPP_NAMESPACE::ImageView imageView_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageView = imageView_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalTextureInfoEXT & setBufferView( VULKAN_HPP_NAMESPACE::BufferView bufferView_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferView = bufferView_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalTextureInfoEXT & setPlane( VULKAN_HPP_NAMESPACE::ImageAspectFlagBits plane_ ) VULKAN_HPP_NOEXCEPT\n    {\n      plane = plane_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportMetalTextureInfoEXT & setMtlTexture( MTLTexture_id mtlTexture_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mtlTexture = mtlTexture_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExportMetalTextureInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExportMetalTextureInfoEXT *>( this );\n    }\n\n    operator VkExportMetalTextureInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExportMetalTextureInfoEXT *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Image const &,\n               VULKAN_HPP_NAMESPACE::ImageView const &,\n               VULKAN_HPP_NAMESPACE::BufferView const &,\n               VULKAN_HPP_NAMESPACE::ImageAspectFlagBits const &,\n               MTLTexture_id const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, image, imageView, bufferView, plane, mtlTexture );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExportMetalTextureInfoEXT const & ) const = default;\n#  else\n    bool operator==( ExportMetalTextureInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( image == rhs.image ) && ( imageView == rhs.imageView ) && ( bufferView == rhs.bufferView ) &&\n             ( plane == rhs.plane ) && ( mtlTexture == rhs.mtlTexture );\n#    endif\n    }\n\n    bool operator!=( ExportMetalTextureInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType      = StructureType::eExportMetalTextureInfoEXT;\n    const void *                              pNext      = {};\n    VULKAN_HPP_NAMESPACE::Image               image      = {};\n    VULKAN_HPP_NAMESPACE::ImageView           imageView  = {};\n    VULKAN_HPP_NAMESPACE::BufferView          bufferView = {};\n    VULKAN_HPP_NAMESPACE::ImageAspectFlagBits plane      = VULKAN_HPP_NAMESPACE::ImageAspectFlagBits::eColor;\n    MTLTexture_id                             mtlTexture = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExportMetalTextureInfoEXT>\n  {\n    using Type = ExportMetalTextureInfoEXT;\n  };\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n  struct ExportSemaphoreCreateInfo\n  {\n    using NativeType = VkExportSemaphoreCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExportSemaphoreCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExportSemaphoreCreateInfo( VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlags handleTypes_ = {},\n                                                    const void *                                           pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , handleTypes{ handleTypes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExportSemaphoreCreateInfo( ExportSemaphoreCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExportSemaphoreCreateInfo( VkExportSemaphoreCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExportSemaphoreCreateInfo( *reinterpret_cast<ExportSemaphoreCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    ExportSemaphoreCreateInfo & operator=( ExportSemaphoreCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExportSemaphoreCreateInfo & operator=( VkExportSemaphoreCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExportSemaphoreCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExportSemaphoreCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportSemaphoreCreateInfo &\n      setHandleTypes( VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlags handleTypes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleTypes = handleTypes_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExportSemaphoreCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExportSemaphoreCreateInfo *>( this );\n    }\n\n    operator VkExportSemaphoreCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExportSemaphoreCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, handleTypes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExportSemaphoreCreateInfo const & ) const = default;\n#else\n    bool operator==( ExportSemaphoreCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( handleTypes == rhs.handleTypes );\n#  endif\n    }\n\n    bool operator!=( ExportSemaphoreCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType       = StructureType::eExportSemaphoreCreateInfo;\n    const void *                                           pNext       = {};\n    VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlags handleTypes = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExportSemaphoreCreateInfo>\n  {\n    using Type = ExportSemaphoreCreateInfo;\n  };\n\n  using ExportSemaphoreCreateInfoKHR = ExportSemaphoreCreateInfo;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  struct ExportSemaphoreWin32HandleInfoKHR\n  {\n    using NativeType = VkExportSemaphoreWin32HandleInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExportSemaphoreWin32HandleInfoKHR;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExportSemaphoreWin32HandleInfoKHR( const SECURITY_ATTRIBUTES * pAttributes_ = {},\n                                                            DWORD                       dwAccess_    = {},\n                                                            LPCWSTR                     name_        = {},\n                                                            const void *                pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pAttributes{ pAttributes_ }\n      , dwAccess{ dwAccess_ }\n      , name{ name_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExportSemaphoreWin32HandleInfoKHR( ExportSemaphoreWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExportSemaphoreWin32HandleInfoKHR( VkExportSemaphoreWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExportSemaphoreWin32HandleInfoKHR( *reinterpret_cast<ExportSemaphoreWin32HandleInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    ExportSemaphoreWin32HandleInfoKHR & operator=( ExportSemaphoreWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExportSemaphoreWin32HandleInfoKHR & operator=( VkExportSemaphoreWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExportSemaphoreWin32HandleInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExportSemaphoreWin32HandleInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportSemaphoreWin32HandleInfoKHR & setPAttributes( const SECURITY_ATTRIBUTES * pAttributes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pAttributes = pAttributes_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportSemaphoreWin32HandleInfoKHR & setDwAccess( DWORD dwAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dwAccess = dwAccess_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExportSemaphoreWin32HandleInfoKHR & setName( LPCWSTR name_ ) VULKAN_HPP_NOEXCEPT\n    {\n      name = name_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExportSemaphoreWin32HandleInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExportSemaphoreWin32HandleInfoKHR *>( this );\n    }\n\n    operator VkExportSemaphoreWin32HandleInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExportSemaphoreWin32HandleInfoKHR *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, const SECURITY_ATTRIBUTES * const &, DWORD const &, LPCWSTR const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pAttributes, dwAccess, name );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExportSemaphoreWin32HandleInfoKHR const & ) const = default;\n#  else\n    bool operator==( ExportSemaphoreWin32HandleInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pAttributes == rhs.pAttributes ) && ( dwAccess == rhs.dwAccess ) && ( name == rhs.name );\n#    endif\n    }\n\n    bool operator!=( ExportSemaphoreWin32HandleInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType       = StructureType::eExportSemaphoreWin32HandleInfoKHR;\n    const void *                        pNext       = {};\n    const SECURITY_ATTRIBUTES *         pAttributes = {};\n    DWORD                               dwAccess    = {};\n    LPCWSTR                             name        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExportSemaphoreWin32HandleInfoKHR>\n  {\n    using Type = ExportSemaphoreWin32HandleInfoKHR;\n  };\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  struct ExtensionProperties\n  {\n    using NativeType = VkExtensionProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 ExtensionProperties( std::array<char, VK_MAX_EXTENSION_NAME_SIZE> const & extensionName_ = {},\n                                                 uint32_t                                             specVersion_   = {} ) VULKAN_HPP_NOEXCEPT\n      : extensionName{ extensionName_ }\n      , specVersion{ specVersion_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExtensionProperties( ExtensionProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExtensionProperties( VkExtensionProperties const & rhs ) VULKAN_HPP_NOEXCEPT : ExtensionProperties( *reinterpret_cast<ExtensionProperties const *>( &rhs ) )\n    {\n    }\n\n    ExtensionProperties & operator=( ExtensionProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExtensionProperties & operator=( VkExtensionProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExtensionProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkExtensionProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExtensionProperties *>( this );\n    }\n\n    operator VkExtensionProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExtensionProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_EXTENSION_NAME_SIZE> const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( extensionName, specVersion );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( ExtensionProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = strcmp( extensionName, rhs.extensionName ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = specVersion <=> rhs.specVersion; cmp != 0 )\n        return cmp;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( ExtensionProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( strcmp( extensionName, rhs.extensionName ) == 0 ) && ( specVersion == rhs.specVersion );\n    }\n\n    bool operator!=( ExtensionProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_EXTENSION_NAME_SIZE> extensionName = {};\n    uint32_t                                                               specVersion   = {};\n  };\n\n  struct ExternalMemoryProperties\n  {\n    using NativeType = VkExternalMemoryProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExternalMemoryProperties( VULKAN_HPP_NAMESPACE::ExternalMemoryFeatureFlags    externalMemoryFeatures_        = {},\n                                                   VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlags exportFromImportedHandleTypes_ = {},\n                                                   VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlags compatibleHandleTypes_         = {} ) VULKAN_HPP_NOEXCEPT\n      : externalMemoryFeatures{ externalMemoryFeatures_ }\n      , exportFromImportedHandleTypes{ exportFromImportedHandleTypes_ }\n      , compatibleHandleTypes{ compatibleHandleTypes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExternalMemoryProperties( ExternalMemoryProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExternalMemoryProperties( VkExternalMemoryProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExternalMemoryProperties( *reinterpret_cast<ExternalMemoryProperties const *>( &rhs ) )\n    {\n    }\n\n    ExternalMemoryProperties & operator=( ExternalMemoryProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExternalMemoryProperties & operator=( VkExternalMemoryProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExternalMemoryProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkExternalMemoryProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExternalMemoryProperties *>( this );\n    }\n\n    operator VkExternalMemoryProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExternalMemoryProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::ExternalMemoryFeatureFlags const &,\n               VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlags const &,\n               VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( externalMemoryFeatures, exportFromImportedHandleTypes, compatibleHandleTypes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExternalMemoryProperties const & ) const = default;\n#else\n    bool operator==( ExternalMemoryProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( externalMemoryFeatures == rhs.externalMemoryFeatures ) && ( exportFromImportedHandleTypes == rhs.exportFromImportedHandleTypes ) &&\n             ( compatibleHandleTypes == rhs.compatibleHandleTypes );\n#  endif\n    }\n\n    bool operator!=( ExternalMemoryProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::ExternalMemoryFeatureFlags    externalMemoryFeatures        = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlags exportFromImportedHandleTypes = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlags compatibleHandleTypes         = {};\n  };\n\n  using ExternalMemoryPropertiesKHR = ExternalMemoryProperties;\n\n  struct ExternalBufferProperties\n  {\n    using NativeType = VkExternalBufferProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExternalBufferProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExternalBufferProperties( VULKAN_HPP_NAMESPACE::ExternalMemoryProperties externalMemoryProperties_ = {},\n                                                   void *                                         pNext_                    = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , externalMemoryProperties{ externalMemoryProperties_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExternalBufferProperties( ExternalBufferProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExternalBufferProperties( VkExternalBufferProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExternalBufferProperties( *reinterpret_cast<ExternalBufferProperties const *>( &rhs ) )\n    {\n    }\n\n    ExternalBufferProperties & operator=( ExternalBufferProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExternalBufferProperties & operator=( VkExternalBufferProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExternalBufferProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkExternalBufferProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExternalBufferProperties *>( this );\n    }\n\n    operator VkExternalBufferProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExternalBufferProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::ExternalMemoryProperties const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, externalMemoryProperties );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExternalBufferProperties const & ) const = default;\n#else\n    bool operator==( ExternalBufferProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( externalMemoryProperties == rhs.externalMemoryProperties );\n#  endif\n    }\n\n    bool operator!=( ExternalBufferProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType            sType                    = StructureType::eExternalBufferProperties;\n    void *                                         pNext                    = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryProperties externalMemoryProperties = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExternalBufferProperties>\n  {\n    using Type = ExternalBufferProperties;\n  };\n\n  using ExternalBufferPropertiesKHR = ExternalBufferProperties;\n\n  struct ExternalFenceProperties\n  {\n    using NativeType = VkExternalFenceProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExternalFenceProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExternalFenceProperties( VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlags exportFromImportedHandleTypes_ = {},\n                                                  VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlags compatibleHandleTypes_         = {},\n                                                  VULKAN_HPP_NAMESPACE::ExternalFenceFeatureFlags    externalFenceFeatures_         = {},\n                                                  void *                                             pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , exportFromImportedHandleTypes{ exportFromImportedHandleTypes_ }\n      , compatibleHandleTypes{ compatibleHandleTypes_ }\n      , externalFenceFeatures{ externalFenceFeatures_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExternalFenceProperties( ExternalFenceProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExternalFenceProperties( VkExternalFenceProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExternalFenceProperties( *reinterpret_cast<ExternalFenceProperties const *>( &rhs ) )\n    {\n    }\n\n    ExternalFenceProperties & operator=( ExternalFenceProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExternalFenceProperties & operator=( VkExternalFenceProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExternalFenceProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkExternalFenceProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExternalFenceProperties *>( this );\n    }\n\n    operator VkExternalFenceProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExternalFenceProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlags const &,\n               VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlags const &,\n               VULKAN_HPP_NAMESPACE::ExternalFenceFeatureFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, exportFromImportedHandleTypes, compatibleHandleTypes, externalFenceFeatures );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExternalFenceProperties const & ) const = default;\n#else\n    bool operator==( ExternalFenceProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( exportFromImportedHandleTypes == rhs.exportFromImportedHandleTypes ) &&\n             ( compatibleHandleTypes == rhs.compatibleHandleTypes ) && ( externalFenceFeatures == rhs.externalFenceFeatures );\n#  endif\n    }\n\n    bool operator!=( ExternalFenceProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                sType                         = StructureType::eExternalFenceProperties;\n    void *                                             pNext                         = {};\n    VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlags exportFromImportedHandleTypes = {};\n    VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlags compatibleHandleTypes         = {};\n    VULKAN_HPP_NAMESPACE::ExternalFenceFeatureFlags    externalFenceFeatures         = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExternalFenceProperties>\n  {\n    using Type = ExternalFenceProperties;\n  };\n\n  using ExternalFencePropertiesKHR = ExternalFenceProperties;\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  struct ExternalFormatANDROID\n  {\n    using NativeType = VkExternalFormatANDROID;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExternalFormatANDROID;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExternalFormatANDROID( uint64_t externalFormat_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , externalFormat{ externalFormat_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExternalFormatANDROID( ExternalFormatANDROID const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExternalFormatANDROID( VkExternalFormatANDROID const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExternalFormatANDROID( *reinterpret_cast<ExternalFormatANDROID const *>( &rhs ) )\n    {\n    }\n\n    ExternalFormatANDROID & operator=( ExternalFormatANDROID const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExternalFormatANDROID & operator=( VkExternalFormatANDROID const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExternalFormatANDROID const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExternalFormatANDROID & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExternalFormatANDROID & setExternalFormat( uint64_t externalFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      externalFormat = externalFormat_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExternalFormatANDROID const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExternalFormatANDROID *>( this );\n    }\n\n    operator VkExternalFormatANDROID &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExternalFormatANDROID *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint64_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, externalFormat );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExternalFormatANDROID const & ) const = default;\n#  else\n    bool operator==( ExternalFormatANDROID const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( externalFormat == rhs.externalFormat );\n#    endif\n    }\n\n    bool operator!=( ExternalFormatANDROID const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::eExternalFormatANDROID;\n    void *                              pNext          = {};\n    uint64_t                            externalFormat = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExternalFormatANDROID>\n  {\n    using Type = ExternalFormatANDROID;\n  };\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n  struct ExternalFormatQNX\n  {\n    using NativeType = VkExternalFormatQNX;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExternalFormatQNX;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExternalFormatQNX( uint64_t externalFormat_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , externalFormat{ externalFormat_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExternalFormatQNX( ExternalFormatQNX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExternalFormatQNX( VkExternalFormatQNX const & rhs ) VULKAN_HPP_NOEXCEPT : ExternalFormatQNX( *reinterpret_cast<ExternalFormatQNX const *>( &rhs ) ) {}\n\n    ExternalFormatQNX & operator=( ExternalFormatQNX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExternalFormatQNX & operator=( VkExternalFormatQNX const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExternalFormatQNX const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExternalFormatQNX & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExternalFormatQNX & setExternalFormat( uint64_t externalFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      externalFormat = externalFormat_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExternalFormatQNX const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExternalFormatQNX *>( this );\n    }\n\n    operator VkExternalFormatQNX &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExternalFormatQNX *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint64_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, externalFormat );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExternalFormatQNX const & ) const = default;\n#  else\n    bool operator==( ExternalFormatQNX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( externalFormat == rhs.externalFormat );\n#    endif\n    }\n\n    bool operator!=( ExternalFormatQNX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::eExternalFormatQNX;\n    void *                              pNext          = {};\n    uint64_t                            externalFormat = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExternalFormatQNX>\n  {\n    using Type = ExternalFormatQNX;\n  };\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n  struct ExternalImageFormatProperties\n  {\n    using NativeType = VkExternalImageFormatProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExternalImageFormatProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExternalImageFormatProperties( VULKAN_HPP_NAMESPACE::ExternalMemoryProperties externalMemoryProperties_ = {},\n                                                        void *                                         pNext_                    = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , externalMemoryProperties{ externalMemoryProperties_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExternalImageFormatProperties( ExternalImageFormatProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExternalImageFormatProperties( VkExternalImageFormatProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExternalImageFormatProperties( *reinterpret_cast<ExternalImageFormatProperties const *>( &rhs ) )\n    {\n    }\n\n    ExternalImageFormatProperties & operator=( ExternalImageFormatProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExternalImageFormatProperties & operator=( VkExternalImageFormatProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExternalImageFormatProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkExternalImageFormatProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExternalImageFormatProperties *>( this );\n    }\n\n    operator VkExternalImageFormatProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExternalImageFormatProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::ExternalMemoryProperties const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, externalMemoryProperties );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExternalImageFormatProperties const & ) const = default;\n#else\n    bool operator==( ExternalImageFormatProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( externalMemoryProperties == rhs.externalMemoryProperties );\n#  endif\n    }\n\n    bool operator!=( ExternalImageFormatProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType            sType                    = StructureType::eExternalImageFormatProperties;\n    void *                                         pNext                    = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryProperties externalMemoryProperties = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExternalImageFormatProperties>\n  {\n    using Type = ExternalImageFormatProperties;\n  };\n\n  using ExternalImageFormatPropertiesKHR = ExternalImageFormatProperties;\n\n  struct ImageFormatProperties\n  {\n    using NativeType = VkImageFormatProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageFormatProperties( VULKAN_HPP_NAMESPACE::Extent3D         maxExtent_       = {},\n                                                uint32_t                               maxMipLevels_    = {},\n                                                uint32_t                               maxArrayLayers_  = {},\n                                                VULKAN_HPP_NAMESPACE::SampleCountFlags sampleCounts_    = {},\n                                                VULKAN_HPP_NAMESPACE::DeviceSize       maxResourceSize_ = {} ) VULKAN_HPP_NOEXCEPT\n      : maxExtent{ maxExtent_ }\n      , maxMipLevels{ maxMipLevels_ }\n      , maxArrayLayers{ maxArrayLayers_ }\n      , sampleCounts{ sampleCounts_ }\n      , maxResourceSize{ maxResourceSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageFormatProperties( ImageFormatProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageFormatProperties( VkImageFormatProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageFormatProperties( *reinterpret_cast<ImageFormatProperties const *>( &rhs ) )\n    {\n    }\n\n    ImageFormatProperties & operator=( ImageFormatProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageFormatProperties & operator=( VkImageFormatProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageFormatProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkImageFormatProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageFormatProperties *>( this );\n    }\n\n    operator VkImageFormatProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageFormatProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::Extent3D const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlags const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( maxExtent, maxMipLevels, maxArrayLayers, sampleCounts, maxResourceSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageFormatProperties const & ) const = default;\n#else\n    bool operator==( ImageFormatProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( maxExtent == rhs.maxExtent ) && ( maxMipLevels == rhs.maxMipLevels ) && ( maxArrayLayers == rhs.maxArrayLayers ) &&\n             ( sampleCounts == rhs.sampleCounts ) && ( maxResourceSize == rhs.maxResourceSize );\n#  endif\n    }\n\n    bool operator!=( ImageFormatProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::Extent3D         maxExtent       = {};\n    uint32_t                               maxMipLevels    = {};\n    uint32_t                               maxArrayLayers  = {};\n    VULKAN_HPP_NAMESPACE::SampleCountFlags sampleCounts    = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize       maxResourceSize = {};\n  };\n\n  struct ExternalImageFormatPropertiesNV\n  {\n    using NativeType = VkExternalImageFormatPropertiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      ExternalImageFormatPropertiesNV( VULKAN_HPP_NAMESPACE::ImageFormatProperties           imageFormatProperties_         = {},\n                                       VULKAN_HPP_NAMESPACE::ExternalMemoryFeatureFlagsNV    externalMemoryFeatures_        = {},\n                                       VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV exportFromImportedHandleTypes_ = {},\n                                       VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV compatibleHandleTypes_         = {} ) VULKAN_HPP_NOEXCEPT\n      : imageFormatProperties{ imageFormatProperties_ }\n      , externalMemoryFeatures{ externalMemoryFeatures_ }\n      , exportFromImportedHandleTypes{ exportFromImportedHandleTypes_ }\n      , compatibleHandleTypes{ compatibleHandleTypes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExternalImageFormatPropertiesNV( ExternalImageFormatPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExternalImageFormatPropertiesNV( VkExternalImageFormatPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExternalImageFormatPropertiesNV( *reinterpret_cast<ExternalImageFormatPropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    ExternalImageFormatPropertiesNV & operator=( ExternalImageFormatPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExternalImageFormatPropertiesNV & operator=( VkExternalImageFormatPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExternalImageFormatPropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkExternalImageFormatPropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExternalImageFormatPropertiesNV *>( this );\n    }\n\n    operator VkExternalImageFormatPropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExternalImageFormatPropertiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::ImageFormatProperties const &,\n               VULKAN_HPP_NAMESPACE::ExternalMemoryFeatureFlagsNV const &,\n               VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV const &,\n               VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( imageFormatProperties, externalMemoryFeatures, exportFromImportedHandleTypes, compatibleHandleTypes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExternalImageFormatPropertiesNV const & ) const = default;\n#else\n    bool operator==( ExternalImageFormatPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( imageFormatProperties == rhs.imageFormatProperties ) && ( externalMemoryFeatures == rhs.externalMemoryFeatures ) &&\n             ( exportFromImportedHandleTypes == rhs.exportFromImportedHandleTypes ) && ( compatibleHandleTypes == rhs.compatibleHandleTypes );\n#  endif\n    }\n\n    bool operator!=( ExternalImageFormatPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::ImageFormatProperties           imageFormatProperties         = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryFeatureFlagsNV    externalMemoryFeatures        = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV exportFromImportedHandleTypes = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV compatibleHandleTypes         = {};\n  };\n\n  struct ExternalMemoryAcquireUnmodifiedEXT\n  {\n    using NativeType = VkExternalMemoryAcquireUnmodifiedEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExternalMemoryAcquireUnmodifiedEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExternalMemoryAcquireUnmodifiedEXT( VULKAN_HPP_NAMESPACE::Bool32 acquireUnmodifiedMemory_ = {},\n                                                             const void *                 pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , acquireUnmodifiedMemory{ acquireUnmodifiedMemory_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExternalMemoryAcquireUnmodifiedEXT( ExternalMemoryAcquireUnmodifiedEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExternalMemoryAcquireUnmodifiedEXT( VkExternalMemoryAcquireUnmodifiedEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExternalMemoryAcquireUnmodifiedEXT( *reinterpret_cast<ExternalMemoryAcquireUnmodifiedEXT const *>( &rhs ) )\n    {\n    }\n\n    ExternalMemoryAcquireUnmodifiedEXT & operator=( ExternalMemoryAcquireUnmodifiedEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExternalMemoryAcquireUnmodifiedEXT & operator=( VkExternalMemoryAcquireUnmodifiedEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExternalMemoryAcquireUnmodifiedEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExternalMemoryAcquireUnmodifiedEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExternalMemoryAcquireUnmodifiedEXT &\n      setAcquireUnmodifiedMemory( VULKAN_HPP_NAMESPACE::Bool32 acquireUnmodifiedMemory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      acquireUnmodifiedMemory = acquireUnmodifiedMemory_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExternalMemoryAcquireUnmodifiedEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExternalMemoryAcquireUnmodifiedEXT *>( this );\n    }\n\n    operator VkExternalMemoryAcquireUnmodifiedEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExternalMemoryAcquireUnmodifiedEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, acquireUnmodifiedMemory );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExternalMemoryAcquireUnmodifiedEXT const & ) const = default;\n#else\n    bool operator==( ExternalMemoryAcquireUnmodifiedEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( acquireUnmodifiedMemory == rhs.acquireUnmodifiedMemory );\n#  endif\n    }\n\n    bool operator!=( ExternalMemoryAcquireUnmodifiedEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                   = StructureType::eExternalMemoryAcquireUnmodifiedEXT;\n    const void *                        pNext                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        acquireUnmodifiedMemory = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExternalMemoryAcquireUnmodifiedEXT>\n  {\n    using Type = ExternalMemoryAcquireUnmodifiedEXT;\n  };\n\n  struct ExternalMemoryBufferCreateInfo\n  {\n    using NativeType = VkExternalMemoryBufferCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExternalMemoryBufferCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExternalMemoryBufferCreateInfo( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlags handleTypes_ = {},\n                                                         const void *                                        pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , handleTypes{ handleTypes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExternalMemoryBufferCreateInfo( ExternalMemoryBufferCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExternalMemoryBufferCreateInfo( VkExternalMemoryBufferCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExternalMemoryBufferCreateInfo( *reinterpret_cast<ExternalMemoryBufferCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    ExternalMemoryBufferCreateInfo & operator=( ExternalMemoryBufferCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExternalMemoryBufferCreateInfo & operator=( VkExternalMemoryBufferCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExternalMemoryBufferCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExternalMemoryBufferCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExternalMemoryBufferCreateInfo &\n      setHandleTypes( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlags handleTypes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleTypes = handleTypes_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExternalMemoryBufferCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExternalMemoryBufferCreateInfo *>( this );\n    }\n\n    operator VkExternalMemoryBufferCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExternalMemoryBufferCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, handleTypes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExternalMemoryBufferCreateInfo const & ) const = default;\n#else\n    bool operator==( ExternalMemoryBufferCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( handleTypes == rhs.handleTypes );\n#  endif\n    }\n\n    bool operator!=( ExternalMemoryBufferCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                 sType       = StructureType::eExternalMemoryBufferCreateInfo;\n    const void *                                        pNext       = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlags handleTypes = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExternalMemoryBufferCreateInfo>\n  {\n    using Type = ExternalMemoryBufferCreateInfo;\n  };\n\n  using ExternalMemoryBufferCreateInfoKHR = ExternalMemoryBufferCreateInfo;\n\n  struct ExternalMemoryImageCreateInfo\n  {\n    using NativeType = VkExternalMemoryImageCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExternalMemoryImageCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExternalMemoryImageCreateInfo( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlags handleTypes_ = {},\n                                                        const void *                                        pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , handleTypes{ handleTypes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExternalMemoryImageCreateInfo( ExternalMemoryImageCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExternalMemoryImageCreateInfo( VkExternalMemoryImageCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExternalMemoryImageCreateInfo( *reinterpret_cast<ExternalMemoryImageCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    ExternalMemoryImageCreateInfo & operator=( ExternalMemoryImageCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExternalMemoryImageCreateInfo & operator=( VkExternalMemoryImageCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExternalMemoryImageCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExternalMemoryImageCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExternalMemoryImageCreateInfo &\n      setHandleTypes( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlags handleTypes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleTypes = handleTypes_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExternalMemoryImageCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExternalMemoryImageCreateInfo *>( this );\n    }\n\n    operator VkExternalMemoryImageCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExternalMemoryImageCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, handleTypes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExternalMemoryImageCreateInfo const & ) const = default;\n#else\n    bool operator==( ExternalMemoryImageCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( handleTypes == rhs.handleTypes );\n#  endif\n    }\n\n    bool operator!=( ExternalMemoryImageCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                 sType       = StructureType::eExternalMemoryImageCreateInfo;\n    const void *                                        pNext       = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlags handleTypes = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExternalMemoryImageCreateInfo>\n  {\n    using Type = ExternalMemoryImageCreateInfo;\n  };\n\n  using ExternalMemoryImageCreateInfoKHR = ExternalMemoryImageCreateInfo;\n\n  struct ExternalMemoryImageCreateInfoNV\n  {\n    using NativeType = VkExternalMemoryImageCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExternalMemoryImageCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExternalMemoryImageCreateInfoNV( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV handleTypes_ = {},\n                                                          const void *                                          pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , handleTypes{ handleTypes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExternalMemoryImageCreateInfoNV( ExternalMemoryImageCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExternalMemoryImageCreateInfoNV( VkExternalMemoryImageCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExternalMemoryImageCreateInfoNV( *reinterpret_cast<ExternalMemoryImageCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n    ExternalMemoryImageCreateInfoNV & operator=( ExternalMemoryImageCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExternalMemoryImageCreateInfoNV & operator=( VkExternalMemoryImageCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExternalMemoryImageCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ExternalMemoryImageCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ExternalMemoryImageCreateInfoNV &\n      setHandleTypes( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV handleTypes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleTypes = handleTypes_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkExternalMemoryImageCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExternalMemoryImageCreateInfoNV *>( this );\n    }\n\n    operator VkExternalMemoryImageCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExternalMemoryImageCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, handleTypes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExternalMemoryImageCreateInfoNV const & ) const = default;\n#else\n    bool operator==( ExternalMemoryImageCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( handleTypes == rhs.handleTypes );\n#  endif\n    }\n\n    bool operator!=( ExternalMemoryImageCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                   sType       = StructureType::eExternalMemoryImageCreateInfoNV;\n    const void *                                          pNext       = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV handleTypes = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExternalMemoryImageCreateInfoNV>\n  {\n    using Type = ExternalMemoryImageCreateInfoNV;\n  };\n\n  struct ExternalSemaphoreProperties\n  {\n    using NativeType = VkExternalSemaphoreProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eExternalSemaphoreProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ExternalSemaphoreProperties( VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlags exportFromImportedHandleTypes_ = {},\n                                                      VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlags compatibleHandleTypes_         = {},\n                                                      VULKAN_HPP_NAMESPACE::ExternalSemaphoreFeatureFlags    externalSemaphoreFeatures_     = {},\n                                                      void *                                                 pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , exportFromImportedHandleTypes{ exportFromImportedHandleTypes_ }\n      , compatibleHandleTypes{ compatibleHandleTypes_ }\n      , externalSemaphoreFeatures{ externalSemaphoreFeatures_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ExternalSemaphoreProperties( ExternalSemaphoreProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ExternalSemaphoreProperties( VkExternalSemaphoreProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ExternalSemaphoreProperties( *reinterpret_cast<ExternalSemaphoreProperties const *>( &rhs ) )\n    {\n    }\n\n    ExternalSemaphoreProperties & operator=( ExternalSemaphoreProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ExternalSemaphoreProperties & operator=( VkExternalSemaphoreProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkExternalSemaphoreProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkExternalSemaphoreProperties *>( this );\n    }\n\n    operator VkExternalSemaphoreProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkExternalSemaphoreProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlags const &,\n               VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlags const &,\n               VULKAN_HPP_NAMESPACE::ExternalSemaphoreFeatureFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, exportFromImportedHandleTypes, compatibleHandleTypes, externalSemaphoreFeatures );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ExternalSemaphoreProperties const & ) const = default;\n#else\n    bool operator==( ExternalSemaphoreProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( exportFromImportedHandleTypes == rhs.exportFromImportedHandleTypes ) &&\n             ( compatibleHandleTypes == rhs.compatibleHandleTypes ) && ( externalSemaphoreFeatures == rhs.externalSemaphoreFeatures );\n#  endif\n    }\n\n    bool operator!=( ExternalSemaphoreProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType                         = StructureType::eExternalSemaphoreProperties;\n    void *                                                 pNext                         = {};\n    VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlags exportFromImportedHandleTypes = {};\n    VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlags compatibleHandleTypes         = {};\n    VULKAN_HPP_NAMESPACE::ExternalSemaphoreFeatureFlags    externalSemaphoreFeatures     = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eExternalSemaphoreProperties>\n  {\n    using Type = ExternalSemaphoreProperties;\n  };\n\n  using ExternalSemaphorePropertiesKHR = ExternalSemaphoreProperties;\n\n  struct FenceCreateInfo\n  {\n    using NativeType = VkFenceCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eFenceCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR FenceCreateInfo( VULKAN_HPP_NAMESPACE::FenceCreateFlags flags_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR FenceCreateInfo( FenceCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    FenceCreateInfo( VkFenceCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT : FenceCreateInfo( *reinterpret_cast<FenceCreateInfo const *>( &rhs ) ) {}\n\n    FenceCreateInfo & operator=( FenceCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    FenceCreateInfo & operator=( VkFenceCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::FenceCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 FenceCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FenceCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::FenceCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkFenceCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkFenceCreateInfo *>( this );\n    }\n\n    operator VkFenceCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkFenceCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::FenceCreateFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( FenceCreateInfo const & ) const = default;\n#else\n    bool operator==( FenceCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags );\n#  endif\n    }\n\n    bool operator!=( FenceCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType = StructureType::eFenceCreateInfo;\n    const void *                           pNext = {};\n    VULKAN_HPP_NAMESPACE::FenceCreateFlags flags = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eFenceCreateInfo>\n  {\n    using Type = FenceCreateInfo;\n  };\n\n  struct FenceGetFdInfoKHR\n  {\n    using NativeType = VkFenceGetFdInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eFenceGetFdInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      FenceGetFdInfoKHR( VULKAN_HPP_NAMESPACE::Fence                           fence_      = {},\n                         VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits handleType_ = VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits::eOpaqueFd,\n                         const void *                                          pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , fence{ fence_ }\n      , handleType{ handleType_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR FenceGetFdInfoKHR( FenceGetFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    FenceGetFdInfoKHR( VkFenceGetFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT : FenceGetFdInfoKHR( *reinterpret_cast<FenceGetFdInfoKHR const *>( &rhs ) ) {}\n\n    FenceGetFdInfoKHR & operator=( FenceGetFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    FenceGetFdInfoKHR & operator=( VkFenceGetFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::FenceGetFdInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 FenceGetFdInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FenceGetFdInfoKHR & setFence( VULKAN_HPP_NAMESPACE::Fence fence_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fence = fence_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FenceGetFdInfoKHR & setHandleType( VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkFenceGetFdInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkFenceGetFdInfoKHR *>( this );\n    }\n\n    operator VkFenceGetFdInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkFenceGetFdInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Fence const &,\n               VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, fence, handleType );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( FenceGetFdInfoKHR const & ) const = default;\n#else\n    bool operator==( FenceGetFdInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( fence == rhs.fence ) && ( handleType == rhs.handleType );\n#  endif\n    }\n\n    bool operator!=( FenceGetFdInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                   sType      = StructureType::eFenceGetFdInfoKHR;\n    const void *                                          pNext      = {};\n    VULKAN_HPP_NAMESPACE::Fence                           fence      = {};\n    VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits handleType = VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits::eOpaqueFd;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eFenceGetFdInfoKHR>\n  {\n    using Type = FenceGetFdInfoKHR;\n  };\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  struct FenceGetWin32HandleInfoKHR\n  {\n    using NativeType = VkFenceGetWin32HandleInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eFenceGetWin32HandleInfoKHR;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR FenceGetWin32HandleInfoKHR(\n      VULKAN_HPP_NAMESPACE::Fence                           fence_      = {},\n      VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits handleType_ = VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits::eOpaqueFd,\n      const void *                                          pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , fence{ fence_ }\n      , handleType{ handleType_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR FenceGetWin32HandleInfoKHR( FenceGetWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    FenceGetWin32HandleInfoKHR( VkFenceGetWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : FenceGetWin32HandleInfoKHR( *reinterpret_cast<FenceGetWin32HandleInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    FenceGetWin32HandleInfoKHR & operator=( FenceGetWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    FenceGetWin32HandleInfoKHR & operator=( VkFenceGetWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::FenceGetWin32HandleInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 FenceGetWin32HandleInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FenceGetWin32HandleInfoKHR & setFence( VULKAN_HPP_NAMESPACE::Fence fence_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fence = fence_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FenceGetWin32HandleInfoKHR & setHandleType( VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkFenceGetWin32HandleInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkFenceGetWin32HandleInfoKHR *>( this );\n    }\n\n    operator VkFenceGetWin32HandleInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkFenceGetWin32HandleInfoKHR *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Fence const &,\n               VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, fence, handleType );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( FenceGetWin32HandleInfoKHR const & ) const = default;\n#  else\n    bool operator==( FenceGetWin32HandleInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( fence == rhs.fence ) && ( handleType == rhs.handleType );\n#    endif\n    }\n\n    bool operator!=( FenceGetWin32HandleInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                   sType      = StructureType::eFenceGetWin32HandleInfoKHR;\n    const void *                                          pNext      = {};\n    VULKAN_HPP_NAMESPACE::Fence                           fence      = {};\n    VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits handleType = VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits::eOpaqueFd;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eFenceGetWin32HandleInfoKHR>\n  {\n    using Type = FenceGetWin32HandleInfoKHR;\n  };\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  struct FilterCubicImageViewImageFormatPropertiesEXT\n  {\n    using NativeType = VkFilterCubicImageViewImageFormatPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eFilterCubicImageViewImageFormatPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR FilterCubicImageViewImageFormatPropertiesEXT( VULKAN_HPP_NAMESPACE::Bool32 filterCubic_       = {},\n                                                                       VULKAN_HPP_NAMESPACE::Bool32 filterCubicMinmax_ = {},\n                                                                       void *                       pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , filterCubic{ filterCubic_ }\n      , filterCubicMinmax{ filterCubicMinmax_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR FilterCubicImageViewImageFormatPropertiesEXT( FilterCubicImageViewImageFormatPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    FilterCubicImageViewImageFormatPropertiesEXT( VkFilterCubicImageViewImageFormatPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : FilterCubicImageViewImageFormatPropertiesEXT( *reinterpret_cast<FilterCubicImageViewImageFormatPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    FilterCubicImageViewImageFormatPropertiesEXT & operator=( FilterCubicImageViewImageFormatPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    FilterCubicImageViewImageFormatPropertiesEXT & operator=( VkFilterCubicImageViewImageFormatPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::FilterCubicImageViewImageFormatPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkFilterCubicImageViewImageFormatPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkFilterCubicImageViewImageFormatPropertiesEXT *>( this );\n    }\n\n    operator VkFilterCubicImageViewImageFormatPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkFilterCubicImageViewImageFormatPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, filterCubic, filterCubicMinmax );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( FilterCubicImageViewImageFormatPropertiesEXT const & ) const = default;\n#else\n    bool operator==( FilterCubicImageViewImageFormatPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( filterCubic == rhs.filterCubic ) && ( filterCubicMinmax == rhs.filterCubicMinmax );\n#  endif\n    }\n\n    bool operator!=( FilterCubicImageViewImageFormatPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType             = StructureType::eFilterCubicImageViewImageFormatPropertiesEXT;\n    void *                              pNext             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        filterCubic       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        filterCubicMinmax = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eFilterCubicImageViewImageFormatPropertiesEXT>\n  {\n    using Type = FilterCubicImageViewImageFormatPropertiesEXT;\n  };\n\n  struct FormatProperties\n  {\n    using NativeType = VkFormatProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR FormatProperties( VULKAN_HPP_NAMESPACE::FormatFeatureFlags linearTilingFeatures_  = {},\n                                           VULKAN_HPP_NAMESPACE::FormatFeatureFlags optimalTilingFeatures_ = {},\n                                           VULKAN_HPP_NAMESPACE::FormatFeatureFlags bufferFeatures_        = {} ) VULKAN_HPP_NOEXCEPT\n      : linearTilingFeatures{ linearTilingFeatures_ }\n      , optimalTilingFeatures{ optimalTilingFeatures_ }\n      , bufferFeatures{ bufferFeatures_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR FormatProperties( FormatProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    FormatProperties( VkFormatProperties const & rhs ) VULKAN_HPP_NOEXCEPT : FormatProperties( *reinterpret_cast<FormatProperties const *>( &rhs ) ) {}\n\n    FormatProperties & operator=( FormatProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    FormatProperties & operator=( VkFormatProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::FormatProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkFormatProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkFormatProperties *>( this );\n    }\n\n    operator VkFormatProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkFormatProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::FormatFeatureFlags const &,\n               VULKAN_HPP_NAMESPACE::FormatFeatureFlags const &,\n               VULKAN_HPP_NAMESPACE::FormatFeatureFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( linearTilingFeatures, optimalTilingFeatures, bufferFeatures );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( FormatProperties const & ) const = default;\n#else\n    bool operator==( FormatProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( linearTilingFeatures == rhs.linearTilingFeatures ) && ( optimalTilingFeatures == rhs.optimalTilingFeatures ) &&\n             ( bufferFeatures == rhs.bufferFeatures );\n#  endif\n    }\n\n    bool operator!=( FormatProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::FormatFeatureFlags linearTilingFeatures  = {};\n    VULKAN_HPP_NAMESPACE::FormatFeatureFlags optimalTilingFeatures = {};\n    VULKAN_HPP_NAMESPACE::FormatFeatureFlags bufferFeatures        = {};\n  };\n\n  struct FormatProperties2\n  {\n    using NativeType = VkFormatProperties2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eFormatProperties2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR FormatProperties2( VULKAN_HPP_NAMESPACE::FormatProperties formatProperties_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , formatProperties{ formatProperties_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR FormatProperties2( FormatProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    FormatProperties2( VkFormatProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT : FormatProperties2( *reinterpret_cast<FormatProperties2 const *>( &rhs ) ) {}\n\n    FormatProperties2 & operator=( FormatProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    FormatProperties2 & operator=( VkFormatProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::FormatProperties2 const *>( &rhs );\n      return *this;\n    }\n\n    operator VkFormatProperties2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkFormatProperties2 *>( this );\n    }\n\n    operator VkFormatProperties2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkFormatProperties2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::FormatProperties const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, formatProperties );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( FormatProperties2 const & ) const = default;\n#else\n    bool operator==( FormatProperties2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( formatProperties == rhs.formatProperties );\n#  endif\n    }\n\n    bool operator!=( FormatProperties2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType            = StructureType::eFormatProperties2;\n    void *                                 pNext            = {};\n    VULKAN_HPP_NAMESPACE::FormatProperties formatProperties = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eFormatProperties2>\n  {\n    using Type = FormatProperties2;\n  };\n\n  using FormatProperties2KHR = FormatProperties2;\n\n  struct FormatProperties3\n  {\n    using NativeType = VkFormatProperties3;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eFormatProperties3;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR FormatProperties3( VULKAN_HPP_NAMESPACE::FormatFeatureFlags2 linearTilingFeatures_  = {},\n                                            VULKAN_HPP_NAMESPACE::FormatFeatureFlags2 optimalTilingFeatures_ = {},\n                                            VULKAN_HPP_NAMESPACE::FormatFeatureFlags2 bufferFeatures_        = {},\n                                            void *                                    pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , linearTilingFeatures{ linearTilingFeatures_ }\n      , optimalTilingFeatures{ optimalTilingFeatures_ }\n      , bufferFeatures{ bufferFeatures_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR FormatProperties3( FormatProperties3 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    FormatProperties3( VkFormatProperties3 const & rhs ) VULKAN_HPP_NOEXCEPT : FormatProperties3( *reinterpret_cast<FormatProperties3 const *>( &rhs ) ) {}\n\n    FormatProperties3 & operator=( FormatProperties3 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    FormatProperties3 & operator=( VkFormatProperties3 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::FormatProperties3 const *>( &rhs );\n      return *this;\n    }\n\n    operator VkFormatProperties3 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkFormatProperties3 *>( this );\n    }\n\n    operator VkFormatProperties3 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkFormatProperties3 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::FormatFeatureFlags2 const &,\n               VULKAN_HPP_NAMESPACE::FormatFeatureFlags2 const &,\n               VULKAN_HPP_NAMESPACE::FormatFeatureFlags2 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, linearTilingFeatures, optimalTilingFeatures, bufferFeatures );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( FormatProperties3 const & ) const = default;\n#else\n    bool operator==( FormatProperties3 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( linearTilingFeatures == rhs.linearTilingFeatures ) &&\n             ( optimalTilingFeatures == rhs.optimalTilingFeatures ) && ( bufferFeatures == rhs.bufferFeatures );\n#  endif\n    }\n\n    bool operator!=( FormatProperties3 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType                 = StructureType::eFormatProperties3;\n    void *                                    pNext                 = {};\n    VULKAN_HPP_NAMESPACE::FormatFeatureFlags2 linearTilingFeatures  = {};\n    VULKAN_HPP_NAMESPACE::FormatFeatureFlags2 optimalTilingFeatures = {};\n    VULKAN_HPP_NAMESPACE::FormatFeatureFlags2 bufferFeatures        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eFormatProperties3>\n  {\n    using Type = FormatProperties3;\n  };\n\n  using FormatProperties3KHR = FormatProperties3;\n\n  struct FragmentShadingRateAttachmentInfoKHR\n  {\n    using NativeType = VkFragmentShadingRateAttachmentInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eFragmentShadingRateAttachmentInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR FragmentShadingRateAttachmentInfoKHR( const VULKAN_HPP_NAMESPACE::AttachmentReference2 * pFragmentShadingRateAttachment_ = {},\n                                                               VULKAN_HPP_NAMESPACE::Extent2D                     shadingRateAttachmentTexelSize_ = {},\n                                                               const void *                                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pFragmentShadingRateAttachment{ pFragmentShadingRateAttachment_ }\n      , shadingRateAttachmentTexelSize{ shadingRateAttachmentTexelSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR FragmentShadingRateAttachmentInfoKHR( FragmentShadingRateAttachmentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    FragmentShadingRateAttachmentInfoKHR( VkFragmentShadingRateAttachmentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : FragmentShadingRateAttachmentInfoKHR( *reinterpret_cast<FragmentShadingRateAttachmentInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    FragmentShadingRateAttachmentInfoKHR & operator=( FragmentShadingRateAttachmentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    FragmentShadingRateAttachmentInfoKHR & operator=( VkFragmentShadingRateAttachmentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::FragmentShadingRateAttachmentInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 FragmentShadingRateAttachmentInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FragmentShadingRateAttachmentInfoKHR &\n      setPFragmentShadingRateAttachment( const VULKAN_HPP_NAMESPACE::AttachmentReference2 * pFragmentShadingRateAttachment_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pFragmentShadingRateAttachment = pFragmentShadingRateAttachment_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FragmentShadingRateAttachmentInfoKHR &\n      setShadingRateAttachmentTexelSize( VULKAN_HPP_NAMESPACE::Extent2D const & shadingRateAttachmentTexelSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shadingRateAttachmentTexelSize = shadingRateAttachmentTexelSize_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkFragmentShadingRateAttachmentInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkFragmentShadingRateAttachmentInfoKHR *>( this );\n    }\n\n    operator VkFragmentShadingRateAttachmentInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkFragmentShadingRateAttachmentInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               const VULKAN_HPP_NAMESPACE::AttachmentReference2 * const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pFragmentShadingRateAttachment, shadingRateAttachmentTexelSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( FragmentShadingRateAttachmentInfoKHR const & ) const = default;\n#else\n    bool operator==( FragmentShadingRateAttachmentInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pFragmentShadingRateAttachment == rhs.pFragmentShadingRateAttachment ) &&\n             ( shadingRateAttachmentTexelSize == rhs.shadingRateAttachmentTexelSize );\n#  endif\n    }\n\n    bool operator!=( FragmentShadingRateAttachmentInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                sType                          = StructureType::eFragmentShadingRateAttachmentInfoKHR;\n    const void *                                       pNext                          = {};\n    const VULKAN_HPP_NAMESPACE::AttachmentReference2 * pFragmentShadingRateAttachment = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                     shadingRateAttachmentTexelSize = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eFragmentShadingRateAttachmentInfoKHR>\n  {\n    using Type = FragmentShadingRateAttachmentInfoKHR;\n  };\n\n  struct FrameBoundaryEXT\n  {\n    using NativeType = VkFrameBoundaryEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eFrameBoundaryEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR FrameBoundaryEXT( VULKAN_HPP_NAMESPACE::FrameBoundaryFlagsEXT flags_       = {},\n                                           uint64_t                                    frameID_     = {},\n                                           uint32_t                                    imageCount_  = {},\n                                           const VULKAN_HPP_NAMESPACE::Image *         pImages_     = {},\n                                           uint32_t                                    bufferCount_ = {},\n                                           const VULKAN_HPP_NAMESPACE::Buffer *        pBuffers_    = {},\n                                           uint64_t                                    tagName_     = {},\n                                           size_t                                      tagSize_     = {},\n                                           const void *                                pTag_        = {},\n                                           const void *                                pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , frameID{ frameID_ }\n      , imageCount{ imageCount_ }\n      , pImages{ pImages_ }\n      , bufferCount{ bufferCount_ }\n      , pBuffers{ pBuffers_ }\n      , tagName{ tagName_ }\n      , tagSize{ tagSize_ }\n      , pTag{ pTag_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR FrameBoundaryEXT( FrameBoundaryEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    FrameBoundaryEXT( VkFrameBoundaryEXT const & rhs ) VULKAN_HPP_NOEXCEPT : FrameBoundaryEXT( *reinterpret_cast<FrameBoundaryEXT const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    FrameBoundaryEXT( VULKAN_HPP_NAMESPACE::FrameBoundaryFlagsEXT                                               flags_,\n                      uint64_t                                                                                  frameID_,\n                      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Image> const &  images_,\n                      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Buffer> const & buffers_ = {},\n                      uint64_t                                                                                  tagName_ = {},\n                      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const &                            tag_     = {},\n                      const void *                                                                              pNext_   = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , frameID( frameID_ )\n      , imageCount( static_cast<uint32_t>( images_.size() ) )\n      , pImages( images_.data() )\n      , bufferCount( static_cast<uint32_t>( buffers_.size() ) )\n      , pBuffers( buffers_.data() )\n      , tagName( tagName_ )\n      , tagSize( tag_.size() * sizeof( T ) )\n      , pTag( tag_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    FrameBoundaryEXT & operator=( FrameBoundaryEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    FrameBoundaryEXT & operator=( VkFrameBoundaryEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::FrameBoundaryEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 FrameBoundaryEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FrameBoundaryEXT & setFlags( VULKAN_HPP_NAMESPACE::FrameBoundaryFlagsEXT flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FrameBoundaryEXT & setFrameID( uint64_t frameID_ ) VULKAN_HPP_NOEXCEPT\n    {\n      frameID = frameID_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FrameBoundaryEXT & setImageCount( uint32_t imageCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageCount = imageCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FrameBoundaryEXT & setPImages( const VULKAN_HPP_NAMESPACE::Image * pImages_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pImages = pImages_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    FrameBoundaryEXT & setImages( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Image> const & images_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageCount = static_cast<uint32_t>( images_.size() );\n      pImages    = images_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 FrameBoundaryEXT & setBufferCount( uint32_t bufferCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferCount = bufferCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FrameBoundaryEXT & setPBuffers( const VULKAN_HPP_NAMESPACE::Buffer * pBuffers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pBuffers = pBuffers_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    FrameBoundaryEXT & setBuffers( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Buffer> const & buffers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferCount = static_cast<uint32_t>( buffers_.size() );\n      pBuffers    = buffers_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 FrameBoundaryEXT & setTagName( uint64_t tagName_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tagName = tagName_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FrameBoundaryEXT & setTagSize( size_t tagSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tagSize = tagSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FrameBoundaryEXT & setPTag( const void * pTag_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pTag = pTag_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    FrameBoundaryEXT & setTag( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & tag_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tagSize = tag_.size() * sizeof( T );\n      pTag    = tag_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkFrameBoundaryEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkFrameBoundaryEXT *>( this );\n    }\n\n    operator VkFrameBoundaryEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkFrameBoundaryEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::FrameBoundaryFlagsEXT const &,\n               uint64_t const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::Image * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::Buffer * const &,\n               uint64_t const &,\n               size_t const &,\n               const void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, frameID, imageCount, pImages, bufferCount, pBuffers, tagName, tagSize, pTag );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( FrameBoundaryEXT const & ) const = default;\n#else\n    bool operator==( FrameBoundaryEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( frameID == rhs.frameID ) && ( imageCount == rhs.imageCount ) &&\n             ( pImages == rhs.pImages ) && ( bufferCount == rhs.bufferCount ) && ( pBuffers == rhs.pBuffers ) && ( tagName == rhs.tagName ) &&\n             ( tagSize == rhs.tagSize ) && ( pTag == rhs.pTag );\n#  endif\n    }\n\n    bool operator!=( FrameBoundaryEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType         sType       = StructureType::eFrameBoundaryEXT;\n    const void *                                pNext       = {};\n    VULKAN_HPP_NAMESPACE::FrameBoundaryFlagsEXT flags       = {};\n    uint64_t                                    frameID     = {};\n    uint32_t                                    imageCount  = {};\n    const VULKAN_HPP_NAMESPACE::Image *         pImages     = {};\n    uint32_t                                    bufferCount = {};\n    const VULKAN_HPP_NAMESPACE::Buffer *        pBuffers    = {};\n    uint64_t                                    tagName     = {};\n    size_t                                      tagSize     = {};\n    const void *                                pTag        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eFrameBoundaryEXT>\n  {\n    using Type = FrameBoundaryEXT;\n  };\n\n  struct FramebufferAttachmentImageInfo\n  {\n    using NativeType = VkFramebufferAttachmentImageInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eFramebufferAttachmentImageInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR FramebufferAttachmentImageInfo( VULKAN_HPP_NAMESPACE::ImageCreateFlags flags_           = {},\n                                                         VULKAN_HPP_NAMESPACE::ImageUsageFlags  usage_           = {},\n                                                         uint32_t                               width_           = {},\n                                                         uint32_t                               height_          = {},\n                                                         uint32_t                               layerCount_      = {},\n                                                         uint32_t                               viewFormatCount_ = {},\n                                                         const VULKAN_HPP_NAMESPACE::Format *   pViewFormats_    = {},\n                                                         const void *                           pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , usage{ usage_ }\n      , width{ width_ }\n      , height{ height_ }\n      , layerCount{ layerCount_ }\n      , viewFormatCount{ viewFormatCount_ }\n      , pViewFormats{ pViewFormats_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR FramebufferAttachmentImageInfo( FramebufferAttachmentImageInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    FramebufferAttachmentImageInfo( VkFramebufferAttachmentImageInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : FramebufferAttachmentImageInfo( *reinterpret_cast<FramebufferAttachmentImageInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    FramebufferAttachmentImageInfo( VULKAN_HPP_NAMESPACE::ImageCreateFlags                                                    flags_,\n                                    VULKAN_HPP_NAMESPACE::ImageUsageFlags                                                     usage_,\n                                    uint32_t                                                                                  width_,\n                                    uint32_t                                                                                  height_,\n                                    uint32_t                                                                                  layerCount_,\n                                    VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Format> const & viewFormats_,\n                                    const void *                                                                              pNext_ = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , usage( usage_ )\n      , width( width_ )\n      , height( height_ )\n      , layerCount( layerCount_ )\n      , viewFormatCount( static_cast<uint32_t>( viewFormats_.size() ) )\n      , pViewFormats( viewFormats_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    FramebufferAttachmentImageInfo & operator=( FramebufferAttachmentImageInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    FramebufferAttachmentImageInfo & operator=( VkFramebufferAttachmentImageInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::FramebufferAttachmentImageInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 FramebufferAttachmentImageInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FramebufferAttachmentImageInfo & setFlags( VULKAN_HPP_NAMESPACE::ImageCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FramebufferAttachmentImageInfo & setUsage( VULKAN_HPP_NAMESPACE::ImageUsageFlags usage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      usage = usage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FramebufferAttachmentImageInfo & setWidth( uint32_t width_ ) VULKAN_HPP_NOEXCEPT\n    {\n      width = width_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FramebufferAttachmentImageInfo & setHeight( uint32_t height_ ) VULKAN_HPP_NOEXCEPT\n    {\n      height = height_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FramebufferAttachmentImageInfo & setLayerCount( uint32_t layerCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layerCount = layerCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FramebufferAttachmentImageInfo & setViewFormatCount( uint32_t viewFormatCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      viewFormatCount = viewFormatCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FramebufferAttachmentImageInfo & setPViewFormats( const VULKAN_HPP_NAMESPACE::Format * pViewFormats_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pViewFormats = pViewFormats_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    FramebufferAttachmentImageInfo &\n      setViewFormats( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Format> const & viewFormats_ ) VULKAN_HPP_NOEXCEPT\n    {\n      viewFormatCount = static_cast<uint32_t>( viewFormats_.size() );\n      pViewFormats    = viewFormats_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkFramebufferAttachmentImageInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkFramebufferAttachmentImageInfo *>( this );\n    }\n\n    operator VkFramebufferAttachmentImageInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkFramebufferAttachmentImageInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ImageCreateFlags const &,\n               VULKAN_HPP_NAMESPACE::ImageUsageFlags const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::Format * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, usage, width, height, layerCount, viewFormatCount, pViewFormats );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( FramebufferAttachmentImageInfo const & ) const = default;\n#else\n    bool operator==( FramebufferAttachmentImageInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( usage == rhs.usage ) && ( width == rhs.width ) &&\n             ( height == rhs.height ) && ( layerCount == rhs.layerCount ) && ( viewFormatCount == rhs.viewFormatCount ) && ( pViewFormats == rhs.pViewFormats );\n#  endif\n    }\n\n    bool operator!=( FramebufferAttachmentImageInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType           = StructureType::eFramebufferAttachmentImageInfo;\n    const void *                           pNext           = {};\n    VULKAN_HPP_NAMESPACE::ImageCreateFlags flags           = {};\n    VULKAN_HPP_NAMESPACE::ImageUsageFlags  usage           = {};\n    uint32_t                               width           = {};\n    uint32_t                               height          = {};\n    uint32_t                               layerCount      = {};\n    uint32_t                               viewFormatCount = {};\n    const VULKAN_HPP_NAMESPACE::Format *   pViewFormats    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eFramebufferAttachmentImageInfo>\n  {\n    using Type = FramebufferAttachmentImageInfo;\n  };\n\n  using FramebufferAttachmentImageInfoKHR = FramebufferAttachmentImageInfo;\n\n  struct FramebufferAttachmentsCreateInfo\n  {\n    using NativeType = VkFramebufferAttachmentsCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eFramebufferAttachmentsCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR FramebufferAttachmentsCreateInfo( uint32_t                                                     attachmentImageInfoCount_ = {},\n                                                           const VULKAN_HPP_NAMESPACE::FramebufferAttachmentImageInfo * pAttachmentImageInfos_    = {},\n                                                           const void *                                                 pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , attachmentImageInfoCount{ attachmentImageInfoCount_ }\n      , pAttachmentImageInfos{ pAttachmentImageInfos_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR FramebufferAttachmentsCreateInfo( FramebufferAttachmentsCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    FramebufferAttachmentsCreateInfo( VkFramebufferAttachmentsCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : FramebufferAttachmentsCreateInfo( *reinterpret_cast<FramebufferAttachmentsCreateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    FramebufferAttachmentsCreateInfo(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::FramebufferAttachmentImageInfo> const & attachmentImageInfos_,\n      const void *                                                                                                      pNext_ = nullptr )\n      : pNext( pNext_ )\n      , attachmentImageInfoCount( static_cast<uint32_t>( attachmentImageInfos_.size() ) )\n      , pAttachmentImageInfos( attachmentImageInfos_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    FramebufferAttachmentsCreateInfo & operator=( FramebufferAttachmentsCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    FramebufferAttachmentsCreateInfo & operator=( VkFramebufferAttachmentsCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::FramebufferAttachmentsCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 FramebufferAttachmentsCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FramebufferAttachmentsCreateInfo & setAttachmentImageInfoCount( uint32_t attachmentImageInfoCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      attachmentImageInfoCount = attachmentImageInfoCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FramebufferAttachmentsCreateInfo &\n      setPAttachmentImageInfos( const VULKAN_HPP_NAMESPACE::FramebufferAttachmentImageInfo * pAttachmentImageInfos_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pAttachmentImageInfos = pAttachmentImageInfos_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    FramebufferAttachmentsCreateInfo & setAttachmentImageInfos(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::FramebufferAttachmentImageInfo> const & attachmentImageInfos_ )\n      VULKAN_HPP_NOEXCEPT\n    {\n      attachmentImageInfoCount = static_cast<uint32_t>( attachmentImageInfos_.size() );\n      pAttachmentImageInfos    = attachmentImageInfos_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkFramebufferAttachmentsCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkFramebufferAttachmentsCreateInfo *>( this );\n    }\n\n    operator VkFramebufferAttachmentsCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkFramebufferAttachmentsCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::FramebufferAttachmentImageInfo * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, attachmentImageInfoCount, pAttachmentImageInfos );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( FramebufferAttachmentsCreateInfo const & ) const = default;\n#else\n    bool operator==( FramebufferAttachmentsCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( attachmentImageInfoCount == rhs.attachmentImageInfoCount ) &&\n             ( pAttachmentImageInfos == rhs.pAttachmentImageInfos );\n#  endif\n    }\n\n    bool operator!=( FramebufferAttachmentsCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                          sType                    = StructureType::eFramebufferAttachmentsCreateInfo;\n    const void *                                                 pNext                    = {};\n    uint32_t                                                     attachmentImageInfoCount = {};\n    const VULKAN_HPP_NAMESPACE::FramebufferAttachmentImageInfo * pAttachmentImageInfos    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eFramebufferAttachmentsCreateInfo>\n  {\n    using Type = FramebufferAttachmentsCreateInfo;\n  };\n\n  using FramebufferAttachmentsCreateInfoKHR = FramebufferAttachmentsCreateInfo;\n\n  struct FramebufferCreateInfo\n  {\n    using NativeType = VkFramebufferCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eFramebufferCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR FramebufferCreateInfo( VULKAN_HPP_NAMESPACE::FramebufferCreateFlags flags_           = {},\n                                                VULKAN_HPP_NAMESPACE::RenderPass             renderPass_      = {},\n                                                uint32_t                                     attachmentCount_ = {},\n                                                const VULKAN_HPP_NAMESPACE::ImageView *      pAttachments_    = {},\n                                                uint32_t                                     width_           = {},\n                                                uint32_t                                     height_          = {},\n                                                uint32_t                                     layers_          = {},\n                                                const void *                                 pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , renderPass{ renderPass_ }\n      , attachmentCount{ attachmentCount_ }\n      , pAttachments{ pAttachments_ }\n      , width{ width_ }\n      , height{ height_ }\n      , layers{ layers_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR FramebufferCreateInfo( FramebufferCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    FramebufferCreateInfo( VkFramebufferCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : FramebufferCreateInfo( *reinterpret_cast<FramebufferCreateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    FramebufferCreateInfo( VULKAN_HPP_NAMESPACE::FramebufferCreateFlags                                                 flags_,\n                           VULKAN_HPP_NAMESPACE::RenderPass                                                             renderPass_,\n                           VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageView> const & attachments_,\n                           uint32_t                                                                                     width_  = {},\n                           uint32_t                                                                                     height_ = {},\n                           uint32_t                                                                                     layers_ = {},\n                           const void *                                                                                 pNext_  = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , renderPass( renderPass_ )\n      , attachmentCount( static_cast<uint32_t>( attachments_.size() ) )\n      , pAttachments( attachments_.data() )\n      , width( width_ )\n      , height( height_ )\n      , layers( layers_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    FramebufferCreateInfo & operator=( FramebufferCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    FramebufferCreateInfo & operator=( VkFramebufferCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::FramebufferCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 FramebufferCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FramebufferCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::FramebufferCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FramebufferCreateInfo & setRenderPass( VULKAN_HPP_NAMESPACE::RenderPass renderPass_ ) VULKAN_HPP_NOEXCEPT\n    {\n      renderPass = renderPass_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FramebufferCreateInfo & setAttachmentCount( uint32_t attachmentCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      attachmentCount = attachmentCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FramebufferCreateInfo & setPAttachments( const VULKAN_HPP_NAMESPACE::ImageView * pAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pAttachments = pAttachments_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    FramebufferCreateInfo &\n      setAttachments( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageView> const & attachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      attachmentCount = static_cast<uint32_t>( attachments_.size() );\n      pAttachments    = attachments_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 FramebufferCreateInfo & setWidth( uint32_t width_ ) VULKAN_HPP_NOEXCEPT\n    {\n      width = width_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FramebufferCreateInfo & setHeight( uint32_t height_ ) VULKAN_HPP_NOEXCEPT\n    {\n      height = height_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 FramebufferCreateInfo & setLayers( uint32_t layers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layers = layers_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkFramebufferCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkFramebufferCreateInfo *>( this );\n    }\n\n    operator VkFramebufferCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkFramebufferCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::FramebufferCreateFlags const &,\n               VULKAN_HPP_NAMESPACE::RenderPass const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::ImageView * const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, renderPass, attachmentCount, pAttachments, width, height, layers );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( FramebufferCreateInfo const & ) const = default;\n#else\n    bool operator==( FramebufferCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( renderPass == rhs.renderPass ) &&\n             ( attachmentCount == rhs.attachmentCount ) && ( pAttachments == rhs.pAttachments ) && ( width == rhs.width ) && ( height == rhs.height ) &&\n             ( layers == rhs.layers );\n#  endif\n    }\n\n    bool operator!=( FramebufferCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType           = StructureType::eFramebufferCreateInfo;\n    const void *                                 pNext           = {};\n    VULKAN_HPP_NAMESPACE::FramebufferCreateFlags flags           = {};\n    VULKAN_HPP_NAMESPACE::RenderPass             renderPass      = {};\n    uint32_t                                     attachmentCount = {};\n    const VULKAN_HPP_NAMESPACE::ImageView *      pAttachments    = {};\n    uint32_t                                     width           = {};\n    uint32_t                                     height          = {};\n    uint32_t                                     layers          = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eFramebufferCreateInfo>\n  {\n    using Type = FramebufferCreateInfo;\n  };\n\n  struct FramebufferMixedSamplesCombinationNV\n  {\n    using NativeType = VkFramebufferMixedSamplesCombinationNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eFramebufferMixedSamplesCombinationNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR FramebufferMixedSamplesCombinationNV(\n      VULKAN_HPP_NAMESPACE::CoverageReductionModeNV coverageReductionMode_ = VULKAN_HPP_NAMESPACE::CoverageReductionModeNV::eMerge,\n      VULKAN_HPP_NAMESPACE::SampleCountFlagBits     rasterizationSamples_  = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1,\n      VULKAN_HPP_NAMESPACE::SampleCountFlags        depthStencilSamples_   = {},\n      VULKAN_HPP_NAMESPACE::SampleCountFlags        colorSamples_          = {},\n      void *                                        pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , coverageReductionMode{ coverageReductionMode_ }\n      , rasterizationSamples{ rasterizationSamples_ }\n      , depthStencilSamples{ depthStencilSamples_ }\n      , colorSamples{ colorSamples_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR FramebufferMixedSamplesCombinationNV( FramebufferMixedSamplesCombinationNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    FramebufferMixedSamplesCombinationNV( VkFramebufferMixedSamplesCombinationNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : FramebufferMixedSamplesCombinationNV( *reinterpret_cast<FramebufferMixedSamplesCombinationNV const *>( &rhs ) )\n    {\n    }\n\n    FramebufferMixedSamplesCombinationNV & operator=( FramebufferMixedSamplesCombinationNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    FramebufferMixedSamplesCombinationNV & operator=( VkFramebufferMixedSamplesCombinationNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkFramebufferMixedSamplesCombinationNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkFramebufferMixedSamplesCombinationNV *>( this );\n    }\n\n    operator VkFramebufferMixedSamplesCombinationNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkFramebufferMixedSamplesCombinationNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::CoverageReductionModeNV const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlagBits const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlags const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, coverageReductionMode, rasterizationSamples, depthStencilSamples, colorSamples );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( FramebufferMixedSamplesCombinationNV const & ) const = default;\n#else\n    bool operator==( FramebufferMixedSamplesCombinationNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( coverageReductionMode == rhs.coverageReductionMode ) &&\n             ( rasterizationSamples == rhs.rasterizationSamples ) && ( depthStencilSamples == rhs.depthStencilSamples ) && ( colorSamples == rhs.colorSamples );\n#  endif\n    }\n\n    bool operator!=( FramebufferMixedSamplesCombinationNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType           sType                 = StructureType::eFramebufferMixedSamplesCombinationNV;\n    void *                                        pNext                 = {};\n    VULKAN_HPP_NAMESPACE::CoverageReductionModeNV coverageReductionMode = VULKAN_HPP_NAMESPACE::CoverageReductionModeNV::eMerge;\n    VULKAN_HPP_NAMESPACE::SampleCountFlagBits     rasterizationSamples  = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1;\n    VULKAN_HPP_NAMESPACE::SampleCountFlags        depthStencilSamples   = {};\n    VULKAN_HPP_NAMESPACE::SampleCountFlags        colorSamples          = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eFramebufferMixedSamplesCombinationNV>\n  {\n    using Type = FramebufferMixedSamplesCombinationNV;\n  };\n\n  struct GeneratedCommandsInfoEXT\n  {\n    using NativeType = VkGeneratedCommandsInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eGeneratedCommandsInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR GeneratedCommandsInfoEXT( VULKAN_HPP_NAMESPACE::ShaderStageFlags          shaderStages_           = {},\n                                                   VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT   indirectExecutionSet_   = {},\n                                                   VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT indirectCommandsLayout_ = {},\n                                                   VULKAN_HPP_NAMESPACE::DeviceAddress             indirectAddress_        = {},\n                                                   VULKAN_HPP_NAMESPACE::DeviceSize                indirectAddressSize_    = {},\n                                                   VULKAN_HPP_NAMESPACE::DeviceAddress             preprocessAddress_      = {},\n                                                   VULKAN_HPP_NAMESPACE::DeviceSize                preprocessSize_         = {},\n                                                   uint32_t                                        maxSequenceCount_       = {},\n                                                   VULKAN_HPP_NAMESPACE::DeviceAddress             sequenceCountAddress_   = {},\n                                                   uint32_t                                        maxDrawCount_           = {},\n                                                   const void *                                    pNext_                  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderStages{ shaderStages_ }\n      , indirectExecutionSet{ indirectExecutionSet_ }\n      , indirectCommandsLayout{ indirectCommandsLayout_ }\n      , indirectAddress{ indirectAddress_ }\n      , indirectAddressSize{ indirectAddressSize_ }\n      , preprocessAddress{ preprocessAddress_ }\n      , preprocessSize{ preprocessSize_ }\n      , maxSequenceCount{ maxSequenceCount_ }\n      , sequenceCountAddress{ sequenceCountAddress_ }\n      , maxDrawCount{ maxDrawCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR GeneratedCommandsInfoEXT( GeneratedCommandsInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    GeneratedCommandsInfoEXT( VkGeneratedCommandsInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : GeneratedCommandsInfoEXT( *reinterpret_cast<GeneratedCommandsInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    GeneratedCommandsInfoEXT & operator=( GeneratedCommandsInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    GeneratedCommandsInfoEXT & operator=( VkGeneratedCommandsInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoEXT & setShaderStages( VULKAN_HPP_NAMESPACE::ShaderStageFlags shaderStages_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderStages = shaderStages_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoEXT &\n      setIndirectExecutionSet( VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT indirectExecutionSet_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indirectExecutionSet = indirectExecutionSet_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoEXT &\n      setIndirectCommandsLayout( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT indirectCommandsLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indirectCommandsLayout = indirectCommandsLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoEXT & setIndirectAddress( VULKAN_HPP_NAMESPACE::DeviceAddress indirectAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indirectAddress = indirectAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoEXT & setIndirectAddressSize( VULKAN_HPP_NAMESPACE::DeviceSize indirectAddressSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indirectAddressSize = indirectAddressSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoEXT & setPreprocessAddress( VULKAN_HPP_NAMESPACE::DeviceAddress preprocessAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      preprocessAddress = preprocessAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoEXT & setPreprocessSize( VULKAN_HPP_NAMESPACE::DeviceSize preprocessSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      preprocessSize = preprocessSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoEXT & setMaxSequenceCount( uint32_t maxSequenceCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxSequenceCount = maxSequenceCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoEXT & setSequenceCountAddress( VULKAN_HPP_NAMESPACE::DeviceAddress sequenceCountAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sequenceCountAddress = sequenceCountAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoEXT & setMaxDrawCount( uint32_t maxDrawCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxDrawCount = maxDrawCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkGeneratedCommandsInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkGeneratedCommandsInfoEXT *>( this );\n    }\n\n    operator VkGeneratedCommandsInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkGeneratedCommandsInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ShaderStageFlags const &,\n               VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT const &,\n               VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       shaderStages,\n                       indirectExecutionSet,\n                       indirectCommandsLayout,\n                       indirectAddress,\n                       indirectAddressSize,\n                       preprocessAddress,\n                       preprocessSize,\n                       maxSequenceCount,\n                       sequenceCountAddress,\n                       maxDrawCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( GeneratedCommandsInfoEXT const & ) const = default;\n#else\n    bool operator==( GeneratedCommandsInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderStages == rhs.shaderStages ) && ( indirectExecutionSet == rhs.indirectExecutionSet ) &&\n             ( indirectCommandsLayout == rhs.indirectCommandsLayout ) && ( indirectAddress == rhs.indirectAddress ) &&\n             ( indirectAddressSize == rhs.indirectAddressSize ) && ( preprocessAddress == rhs.preprocessAddress ) && ( preprocessSize == rhs.preprocessSize ) &&\n             ( maxSequenceCount == rhs.maxSequenceCount ) && ( sequenceCountAddress == rhs.sequenceCountAddress ) && ( maxDrawCount == rhs.maxDrawCount );\n#  endif\n    }\n\n    bool operator!=( GeneratedCommandsInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType             sType                  = StructureType::eGeneratedCommandsInfoEXT;\n    const void *                                    pNext                  = {};\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags          shaderStages           = {};\n    VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT   indirectExecutionSet   = {};\n    VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT indirectCommandsLayout = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress             indirectAddress        = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                indirectAddressSize    = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress             preprocessAddress      = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                preprocessSize         = {};\n    uint32_t                                        maxSequenceCount       = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress             sequenceCountAddress   = {};\n    uint32_t                                        maxDrawCount           = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eGeneratedCommandsInfoEXT>\n  {\n    using Type = GeneratedCommandsInfoEXT;\n  };\n\n  struct IndirectCommandsStreamNV\n  {\n    using NativeType = VkIndirectCommandsStreamNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR IndirectCommandsStreamNV( VULKAN_HPP_NAMESPACE::Buffer     buffer_ = {},\n                                                   VULKAN_HPP_NAMESPACE::DeviceSize offset_ = {} ) VULKAN_HPP_NOEXCEPT\n      : buffer{ buffer_ }\n      , offset{ offset_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR IndirectCommandsStreamNV( IndirectCommandsStreamNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    IndirectCommandsStreamNV( VkIndirectCommandsStreamNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : IndirectCommandsStreamNV( *reinterpret_cast<IndirectCommandsStreamNV const *>( &rhs ) )\n    {\n    }\n\n    IndirectCommandsStreamNV & operator=( IndirectCommandsStreamNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    IndirectCommandsStreamNV & operator=( VkIndirectCommandsStreamNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::IndirectCommandsStreamNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsStreamNV & setBuffer( VULKAN_HPP_NAMESPACE::Buffer buffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      buffer = buffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsStreamNV & setOffset( VULKAN_HPP_NAMESPACE::DeviceSize offset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      offset = offset_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkIndirectCommandsStreamNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkIndirectCommandsStreamNV *>( this );\n    }\n\n    operator VkIndirectCommandsStreamNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkIndirectCommandsStreamNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::Buffer const &, VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( buffer, offset );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( IndirectCommandsStreamNV const & ) const = default;\n#else\n    bool operator==( IndirectCommandsStreamNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( buffer == rhs.buffer ) && ( offset == rhs.offset );\n#  endif\n    }\n\n    bool operator!=( IndirectCommandsStreamNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::Buffer     buffer = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize offset = {};\n  };\n\n  struct GeneratedCommandsInfoNV\n  {\n    using NativeType = VkGeneratedCommandsInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eGeneratedCommandsInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      GeneratedCommandsInfoNV( VULKAN_HPP_NAMESPACE::PipelineBindPoint                pipelineBindPoint_ = VULKAN_HPP_NAMESPACE::PipelineBindPoint::eGraphics,\n                               VULKAN_HPP_NAMESPACE::Pipeline                         pipeline_          = {},\n                               VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV         indirectCommandsLayout_ = {},\n                               uint32_t                                               streamCount_            = {},\n                               const VULKAN_HPP_NAMESPACE::IndirectCommandsStreamNV * pStreams_               = {},\n                               uint32_t                                               sequencesCount_         = {},\n                               VULKAN_HPP_NAMESPACE::Buffer                           preprocessBuffer_       = {},\n                               VULKAN_HPP_NAMESPACE::DeviceSize                       preprocessOffset_       = {},\n                               VULKAN_HPP_NAMESPACE::DeviceSize                       preprocessSize_         = {},\n                               VULKAN_HPP_NAMESPACE::Buffer                           sequencesCountBuffer_   = {},\n                               VULKAN_HPP_NAMESPACE::DeviceSize                       sequencesCountOffset_   = {},\n                               VULKAN_HPP_NAMESPACE::Buffer                           sequencesIndexBuffer_   = {},\n                               VULKAN_HPP_NAMESPACE::DeviceSize                       sequencesIndexOffset_   = {},\n                               const void *                                           pNext_                  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pipelineBindPoint{ pipelineBindPoint_ }\n      , pipeline{ pipeline_ }\n      , indirectCommandsLayout{ indirectCommandsLayout_ }\n      , streamCount{ streamCount_ }\n      , pStreams{ pStreams_ }\n      , sequencesCount{ sequencesCount_ }\n      , preprocessBuffer{ preprocessBuffer_ }\n      , preprocessOffset{ preprocessOffset_ }\n      , preprocessSize{ preprocessSize_ }\n      , sequencesCountBuffer{ sequencesCountBuffer_ }\n      , sequencesCountOffset{ sequencesCountOffset_ }\n      , sequencesIndexBuffer{ sequencesIndexBuffer_ }\n      , sequencesIndexOffset{ sequencesIndexOffset_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR GeneratedCommandsInfoNV( GeneratedCommandsInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    GeneratedCommandsInfoNV( VkGeneratedCommandsInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : GeneratedCommandsInfoNV( *reinterpret_cast<GeneratedCommandsInfoNV const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    GeneratedCommandsInfoNV( VULKAN_HPP_NAMESPACE::PipelineBindPoint        pipelineBindPoint_,\n                             VULKAN_HPP_NAMESPACE::Pipeline                 pipeline_,\n                             VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV indirectCommandsLayout_,\n                             VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::IndirectCommandsStreamNV> const & streams_,\n                             uint32_t                                                                                                    sequencesCount_   = {},\n                             VULKAN_HPP_NAMESPACE::Buffer                                                                                preprocessBuffer_ = {},\n                             VULKAN_HPP_NAMESPACE::DeviceSize                                                                            preprocessOffset_ = {},\n                             VULKAN_HPP_NAMESPACE::DeviceSize                                                                            preprocessSize_   = {},\n                             VULKAN_HPP_NAMESPACE::Buffer     sequencesCountBuffer_                                                                        = {},\n                             VULKAN_HPP_NAMESPACE::DeviceSize sequencesCountOffset_                                                                        = {},\n                             VULKAN_HPP_NAMESPACE::Buffer     sequencesIndexBuffer_                                                                        = {},\n                             VULKAN_HPP_NAMESPACE::DeviceSize sequencesIndexOffset_                                                                        = {},\n                             const void *                     pNext_ = nullptr )\n      : pNext( pNext_ )\n      , pipelineBindPoint( pipelineBindPoint_ )\n      , pipeline( pipeline_ )\n      , indirectCommandsLayout( indirectCommandsLayout_ )\n      , streamCount( static_cast<uint32_t>( streams_.size() ) )\n      , pStreams( streams_.data() )\n      , sequencesCount( sequencesCount_ )\n      , preprocessBuffer( preprocessBuffer_ )\n      , preprocessOffset( preprocessOffset_ )\n      , preprocessSize( preprocessSize_ )\n      , sequencesCountBuffer( sequencesCountBuffer_ )\n      , sequencesCountOffset( sequencesCountOffset_ )\n      , sequencesIndexBuffer( sequencesIndexBuffer_ )\n      , sequencesIndexOffset( sequencesIndexOffset_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    GeneratedCommandsInfoNV & operator=( GeneratedCommandsInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    GeneratedCommandsInfoNV & operator=( VkGeneratedCommandsInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoNV & setPipelineBindPoint( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineBindPoint = pipelineBindPoint_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoNV & setPipeline( VULKAN_HPP_NAMESPACE::Pipeline pipeline_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipeline = pipeline_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoNV &\n      setIndirectCommandsLayout( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV indirectCommandsLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indirectCommandsLayout = indirectCommandsLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoNV & setStreamCount( uint32_t streamCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      streamCount = streamCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoNV & setPStreams( const VULKAN_HPP_NAMESPACE::IndirectCommandsStreamNV * pStreams_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStreams = pStreams_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    GeneratedCommandsInfoNV &\n      setStreams( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::IndirectCommandsStreamNV> const & streams_ ) VULKAN_HPP_NOEXCEPT\n    {\n      streamCount = static_cast<uint32_t>( streams_.size() );\n      pStreams    = streams_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoNV & setSequencesCount( uint32_t sequencesCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sequencesCount = sequencesCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoNV & setPreprocessBuffer( VULKAN_HPP_NAMESPACE::Buffer preprocessBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      preprocessBuffer = preprocessBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoNV & setPreprocessOffset( VULKAN_HPP_NAMESPACE::DeviceSize preprocessOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      preprocessOffset = preprocessOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoNV & setPreprocessSize( VULKAN_HPP_NAMESPACE::DeviceSize preprocessSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      preprocessSize = preprocessSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoNV & setSequencesCountBuffer( VULKAN_HPP_NAMESPACE::Buffer sequencesCountBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sequencesCountBuffer = sequencesCountBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoNV & setSequencesCountOffset( VULKAN_HPP_NAMESPACE::DeviceSize sequencesCountOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sequencesCountOffset = sequencesCountOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoNV & setSequencesIndexBuffer( VULKAN_HPP_NAMESPACE::Buffer sequencesIndexBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sequencesIndexBuffer = sequencesIndexBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsInfoNV & setSequencesIndexOffset( VULKAN_HPP_NAMESPACE::DeviceSize sequencesIndexOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sequencesIndexOffset = sequencesIndexOffset_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkGeneratedCommandsInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkGeneratedCommandsInfoNV *>( this );\n    }\n\n    operator VkGeneratedCommandsInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkGeneratedCommandsInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineBindPoint const &,\n               VULKAN_HPP_NAMESPACE::Pipeline const &,\n               VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::IndirectCommandsStreamNV * const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Buffer const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::Buffer const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::Buffer const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       pipelineBindPoint,\n                       pipeline,\n                       indirectCommandsLayout,\n                       streamCount,\n                       pStreams,\n                       sequencesCount,\n                       preprocessBuffer,\n                       preprocessOffset,\n                       preprocessSize,\n                       sequencesCountBuffer,\n                       sequencesCountOffset,\n                       sequencesIndexBuffer,\n                       sequencesIndexOffset );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( GeneratedCommandsInfoNV const & ) const = default;\n#else\n    bool operator==( GeneratedCommandsInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pipelineBindPoint == rhs.pipelineBindPoint ) && ( pipeline == rhs.pipeline ) &&\n             ( indirectCommandsLayout == rhs.indirectCommandsLayout ) && ( streamCount == rhs.streamCount ) && ( pStreams == rhs.pStreams ) &&\n             ( sequencesCount == rhs.sequencesCount ) && ( preprocessBuffer == rhs.preprocessBuffer ) && ( preprocessOffset == rhs.preprocessOffset ) &&\n             ( preprocessSize == rhs.preprocessSize ) && ( sequencesCountBuffer == rhs.sequencesCountBuffer ) &&\n             ( sequencesCountOffset == rhs.sequencesCountOffset ) && ( sequencesIndexBuffer == rhs.sequencesIndexBuffer ) &&\n             ( sequencesIndexOffset == rhs.sequencesIndexOffset );\n#  endif\n    }\n\n    bool operator!=( GeneratedCommandsInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType                  = StructureType::eGeneratedCommandsInfoNV;\n    const void *                                           pNext                  = {};\n    VULKAN_HPP_NAMESPACE::PipelineBindPoint                pipelineBindPoint      = VULKAN_HPP_NAMESPACE::PipelineBindPoint::eGraphics;\n    VULKAN_HPP_NAMESPACE::Pipeline                         pipeline               = {};\n    VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV         indirectCommandsLayout = {};\n    uint32_t                                               streamCount            = {};\n    const VULKAN_HPP_NAMESPACE::IndirectCommandsStreamNV * pStreams               = {};\n    uint32_t                                               sequencesCount         = {};\n    VULKAN_HPP_NAMESPACE::Buffer                           preprocessBuffer       = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                       preprocessOffset       = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                       preprocessSize         = {};\n    VULKAN_HPP_NAMESPACE::Buffer                           sequencesCountBuffer   = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                       sequencesCountOffset   = {};\n    VULKAN_HPP_NAMESPACE::Buffer                           sequencesIndexBuffer   = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                       sequencesIndexOffset   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eGeneratedCommandsInfoNV>\n  {\n    using Type = GeneratedCommandsInfoNV;\n  };\n\n  struct GeneratedCommandsMemoryRequirementsInfoEXT\n  {\n    using NativeType = VkGeneratedCommandsMemoryRequirementsInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eGeneratedCommandsMemoryRequirementsInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR GeneratedCommandsMemoryRequirementsInfoEXT( VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT   indirectExecutionSet_   = {},\n                                                                     VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT indirectCommandsLayout_ = {},\n                                                                     uint32_t                                        maxSequenceCount_       = {},\n                                                                     uint32_t                                        maxDrawCount_           = {},\n                                                                     const void *                                    pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , indirectExecutionSet{ indirectExecutionSet_ }\n      , indirectCommandsLayout{ indirectCommandsLayout_ }\n      , maxSequenceCount{ maxSequenceCount_ }\n      , maxDrawCount{ maxDrawCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR GeneratedCommandsMemoryRequirementsInfoEXT( GeneratedCommandsMemoryRequirementsInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    GeneratedCommandsMemoryRequirementsInfoEXT( VkGeneratedCommandsMemoryRequirementsInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : GeneratedCommandsMemoryRequirementsInfoEXT( *reinterpret_cast<GeneratedCommandsMemoryRequirementsInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    GeneratedCommandsMemoryRequirementsInfoEXT & operator=( GeneratedCommandsMemoryRequirementsInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    GeneratedCommandsMemoryRequirementsInfoEXT & operator=( VkGeneratedCommandsMemoryRequirementsInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsMemoryRequirementsInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsMemoryRequirementsInfoEXT &\n      setIndirectExecutionSet( VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT indirectExecutionSet_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indirectExecutionSet = indirectExecutionSet_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsMemoryRequirementsInfoEXT &\n      setIndirectCommandsLayout( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT indirectCommandsLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indirectCommandsLayout = indirectCommandsLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsMemoryRequirementsInfoEXT & setMaxSequenceCount( uint32_t maxSequenceCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxSequenceCount = maxSequenceCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsMemoryRequirementsInfoEXT & setMaxDrawCount( uint32_t maxDrawCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxDrawCount = maxDrawCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkGeneratedCommandsMemoryRequirementsInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkGeneratedCommandsMemoryRequirementsInfoEXT *>( this );\n    }\n\n    operator VkGeneratedCommandsMemoryRequirementsInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkGeneratedCommandsMemoryRequirementsInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT const &,\n               VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, indirectExecutionSet, indirectCommandsLayout, maxSequenceCount, maxDrawCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( GeneratedCommandsMemoryRequirementsInfoEXT const & ) const = default;\n#else\n    bool operator==( GeneratedCommandsMemoryRequirementsInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( indirectExecutionSet == rhs.indirectExecutionSet ) &&\n             ( indirectCommandsLayout == rhs.indirectCommandsLayout ) && ( maxSequenceCount == rhs.maxSequenceCount ) && ( maxDrawCount == rhs.maxDrawCount );\n#  endif\n    }\n\n    bool operator!=( GeneratedCommandsMemoryRequirementsInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType             sType                  = StructureType::eGeneratedCommandsMemoryRequirementsInfoEXT;\n    const void *                                    pNext                  = {};\n    VULKAN_HPP_NAMESPACE::IndirectExecutionSetEXT   indirectExecutionSet   = {};\n    VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutEXT indirectCommandsLayout = {};\n    uint32_t                                        maxSequenceCount       = {};\n    uint32_t                                        maxDrawCount           = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eGeneratedCommandsMemoryRequirementsInfoEXT>\n  {\n    using Type = GeneratedCommandsMemoryRequirementsInfoEXT;\n  };\n\n  struct GeneratedCommandsMemoryRequirementsInfoNV\n  {\n    using NativeType = VkGeneratedCommandsMemoryRequirementsInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eGeneratedCommandsMemoryRequirementsInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR GeneratedCommandsMemoryRequirementsInfoNV(\n      VULKAN_HPP_NAMESPACE::PipelineBindPoint        pipelineBindPoint_      = VULKAN_HPP_NAMESPACE::PipelineBindPoint::eGraphics,\n      VULKAN_HPP_NAMESPACE::Pipeline                 pipeline_               = {},\n      VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV indirectCommandsLayout_ = {},\n      uint32_t                                       maxSequencesCount_      = {},\n      const void *                                   pNext_                  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pipelineBindPoint{ pipelineBindPoint_ }\n      , pipeline{ pipeline_ }\n      , indirectCommandsLayout{ indirectCommandsLayout_ }\n      , maxSequencesCount{ maxSequencesCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR GeneratedCommandsMemoryRequirementsInfoNV( GeneratedCommandsMemoryRequirementsInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    GeneratedCommandsMemoryRequirementsInfoNV( VkGeneratedCommandsMemoryRequirementsInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : GeneratedCommandsMemoryRequirementsInfoNV( *reinterpret_cast<GeneratedCommandsMemoryRequirementsInfoNV const *>( &rhs ) )\n    {\n    }\n\n    GeneratedCommandsMemoryRequirementsInfoNV & operator=( GeneratedCommandsMemoryRequirementsInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    GeneratedCommandsMemoryRequirementsInfoNV & operator=( VkGeneratedCommandsMemoryRequirementsInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsMemoryRequirementsInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsMemoryRequirementsInfoNV &\n      setPipelineBindPoint( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineBindPoint = pipelineBindPoint_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsMemoryRequirementsInfoNV & setPipeline( VULKAN_HPP_NAMESPACE::Pipeline pipeline_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipeline = pipeline_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsMemoryRequirementsInfoNV &\n      setIndirectCommandsLayout( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV indirectCommandsLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indirectCommandsLayout = indirectCommandsLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsMemoryRequirementsInfoNV & setMaxSequencesCount( uint32_t maxSequencesCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxSequencesCount = maxSequencesCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkGeneratedCommandsMemoryRequirementsInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkGeneratedCommandsMemoryRequirementsInfoNV *>( this );\n    }\n\n    operator VkGeneratedCommandsMemoryRequirementsInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkGeneratedCommandsMemoryRequirementsInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineBindPoint const &,\n               VULKAN_HPP_NAMESPACE::Pipeline const &,\n               VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pipelineBindPoint, pipeline, indirectCommandsLayout, maxSequencesCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( GeneratedCommandsMemoryRequirementsInfoNV const & ) const = default;\n#else\n    bool operator==( GeneratedCommandsMemoryRequirementsInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pipelineBindPoint == rhs.pipelineBindPoint ) && ( pipeline == rhs.pipeline ) &&\n             ( indirectCommandsLayout == rhs.indirectCommandsLayout ) && ( maxSequencesCount == rhs.maxSequencesCount );\n#  endif\n    }\n\n    bool operator!=( GeneratedCommandsMemoryRequirementsInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType            sType                  = StructureType::eGeneratedCommandsMemoryRequirementsInfoNV;\n    const void *                                   pNext                  = {};\n    VULKAN_HPP_NAMESPACE::PipelineBindPoint        pipelineBindPoint      = VULKAN_HPP_NAMESPACE::PipelineBindPoint::eGraphics;\n    VULKAN_HPP_NAMESPACE::Pipeline                 pipeline               = {};\n    VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV indirectCommandsLayout = {};\n    uint32_t                                       maxSequencesCount      = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eGeneratedCommandsMemoryRequirementsInfoNV>\n  {\n    using Type = GeneratedCommandsMemoryRequirementsInfoNV;\n  };\n\n  struct GeneratedCommandsPipelineInfoEXT\n  {\n    using NativeType = VkGeneratedCommandsPipelineInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eGeneratedCommandsPipelineInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR GeneratedCommandsPipelineInfoEXT( VULKAN_HPP_NAMESPACE::Pipeline pipeline_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pipeline{ pipeline_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR GeneratedCommandsPipelineInfoEXT( GeneratedCommandsPipelineInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    GeneratedCommandsPipelineInfoEXT( VkGeneratedCommandsPipelineInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : GeneratedCommandsPipelineInfoEXT( *reinterpret_cast<GeneratedCommandsPipelineInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    GeneratedCommandsPipelineInfoEXT & operator=( GeneratedCommandsPipelineInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    GeneratedCommandsPipelineInfoEXT & operator=( VkGeneratedCommandsPipelineInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::GeneratedCommandsPipelineInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsPipelineInfoEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsPipelineInfoEXT & setPipeline( VULKAN_HPP_NAMESPACE::Pipeline pipeline_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipeline = pipeline_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkGeneratedCommandsPipelineInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkGeneratedCommandsPipelineInfoEXT *>( this );\n    }\n\n    operator VkGeneratedCommandsPipelineInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkGeneratedCommandsPipelineInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Pipeline const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pipeline );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( GeneratedCommandsPipelineInfoEXT const & ) const = default;\n#else\n    bool operator==( GeneratedCommandsPipelineInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pipeline == rhs.pipeline );\n#  endif\n    }\n\n    bool operator!=( GeneratedCommandsPipelineInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType    = StructureType::eGeneratedCommandsPipelineInfoEXT;\n    void *                              pNext    = {};\n    VULKAN_HPP_NAMESPACE::Pipeline      pipeline = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eGeneratedCommandsPipelineInfoEXT>\n  {\n    using Type = GeneratedCommandsPipelineInfoEXT;\n  };\n\n  struct GeneratedCommandsShaderInfoEXT\n  {\n    using NativeType = VkGeneratedCommandsShaderInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eGeneratedCommandsShaderInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR GeneratedCommandsShaderInfoEXT( uint32_t                                shaderCount_ = {},\n                                                         const VULKAN_HPP_NAMESPACE::ShaderEXT * pShaders_    = {},\n                                                         void *                                  pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderCount{ shaderCount_ }\n      , pShaders{ pShaders_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR GeneratedCommandsShaderInfoEXT( GeneratedCommandsShaderInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    GeneratedCommandsShaderInfoEXT( VkGeneratedCommandsShaderInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : GeneratedCommandsShaderInfoEXT( *reinterpret_cast<GeneratedCommandsShaderInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    GeneratedCommandsShaderInfoEXT( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ShaderEXT> const & shaders_,\n                                    void *                                                                                       pNext_ = nullptr )\n      : pNext( pNext_ ), shaderCount( static_cast<uint32_t>( shaders_.size() ) ), pShaders( shaders_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    GeneratedCommandsShaderInfoEXT & operator=( GeneratedCommandsShaderInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    GeneratedCommandsShaderInfoEXT & operator=( VkGeneratedCommandsShaderInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::GeneratedCommandsShaderInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsShaderInfoEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsShaderInfoEXT & setShaderCount( uint32_t shaderCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderCount = shaderCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GeneratedCommandsShaderInfoEXT & setPShaders( const VULKAN_HPP_NAMESPACE::ShaderEXT * pShaders_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pShaders = pShaders_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    GeneratedCommandsShaderInfoEXT &\n      setShaders( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ShaderEXT> const & shaders_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderCount = static_cast<uint32_t>( shaders_.size() );\n      pShaders    = shaders_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkGeneratedCommandsShaderInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkGeneratedCommandsShaderInfoEXT *>( this );\n    }\n\n    operator VkGeneratedCommandsShaderInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkGeneratedCommandsShaderInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::ShaderEXT * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderCount, pShaders );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( GeneratedCommandsShaderInfoEXT const & ) const = default;\n#else\n    bool operator==( GeneratedCommandsShaderInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderCount == rhs.shaderCount ) && ( pShaders == rhs.pShaders );\n#  endif\n    }\n\n    bool operator!=( GeneratedCommandsShaderInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType     sType       = StructureType::eGeneratedCommandsShaderInfoEXT;\n    void *                                  pNext       = {};\n    uint32_t                                shaderCount = {};\n    const VULKAN_HPP_NAMESPACE::ShaderEXT * pShaders    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eGeneratedCommandsShaderInfoEXT>\n  {\n    using Type = GeneratedCommandsShaderInfoEXT;\n  };\n\n  struct LatencyTimingsFrameReportNV\n  {\n    using NativeType = VkLatencyTimingsFrameReportNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eLatencyTimingsFrameReportNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR LatencyTimingsFrameReportNV( uint64_t     presentID_                = {},\n                                                      uint64_t     inputSampleTimeUs_        = {},\n                                                      uint64_t     simStartTimeUs_           = {},\n                                                      uint64_t     simEndTimeUs_             = {},\n                                                      uint64_t     renderSubmitStartTimeUs_  = {},\n                                                      uint64_t     renderSubmitEndTimeUs_    = {},\n                                                      uint64_t     presentStartTimeUs_       = {},\n                                                      uint64_t     presentEndTimeUs_         = {},\n                                                      uint64_t     driverStartTimeUs_        = {},\n                                                      uint64_t     driverEndTimeUs_          = {},\n                                                      uint64_t     osRenderQueueStartTimeUs_ = {},\n                                                      uint64_t     osRenderQueueEndTimeUs_   = {},\n                                                      uint64_t     gpuRenderStartTimeUs_     = {},\n                                                      uint64_t     gpuRenderEndTimeUs_       = {},\n                                                      const void * pNext_                    = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , presentID{ presentID_ }\n      , inputSampleTimeUs{ inputSampleTimeUs_ }\n      , simStartTimeUs{ simStartTimeUs_ }\n      , simEndTimeUs{ simEndTimeUs_ }\n      , renderSubmitStartTimeUs{ renderSubmitStartTimeUs_ }\n      , renderSubmitEndTimeUs{ renderSubmitEndTimeUs_ }\n      , presentStartTimeUs{ presentStartTimeUs_ }\n      , presentEndTimeUs{ presentEndTimeUs_ }\n      , driverStartTimeUs{ driverStartTimeUs_ }\n      , driverEndTimeUs{ driverEndTimeUs_ }\n      , osRenderQueueStartTimeUs{ osRenderQueueStartTimeUs_ }\n      , osRenderQueueEndTimeUs{ osRenderQueueEndTimeUs_ }\n      , gpuRenderStartTimeUs{ gpuRenderStartTimeUs_ }\n      , gpuRenderEndTimeUs{ gpuRenderEndTimeUs_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR LatencyTimingsFrameReportNV( LatencyTimingsFrameReportNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    LatencyTimingsFrameReportNV( VkLatencyTimingsFrameReportNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : LatencyTimingsFrameReportNV( *reinterpret_cast<LatencyTimingsFrameReportNV const *>( &rhs ) )\n    {\n    }\n\n    LatencyTimingsFrameReportNV & operator=( LatencyTimingsFrameReportNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    LatencyTimingsFrameReportNV & operator=( VkLatencyTimingsFrameReportNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkLatencyTimingsFrameReportNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkLatencyTimingsFrameReportNV *>( this );\n    }\n\n    operator VkLatencyTimingsFrameReportNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkLatencyTimingsFrameReportNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint64_t const &,\n               uint64_t const &,\n               uint64_t const &,\n               uint64_t const &,\n               uint64_t const &,\n               uint64_t const &,\n               uint64_t const &,\n               uint64_t const &,\n               uint64_t const &,\n               uint64_t const &,\n               uint64_t const &,\n               uint64_t const &,\n               uint64_t const &,\n               uint64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       presentID,\n                       inputSampleTimeUs,\n                       simStartTimeUs,\n                       simEndTimeUs,\n                       renderSubmitStartTimeUs,\n                       renderSubmitEndTimeUs,\n                       presentStartTimeUs,\n                       presentEndTimeUs,\n                       driverStartTimeUs,\n                       driverEndTimeUs,\n                       osRenderQueueStartTimeUs,\n                       osRenderQueueEndTimeUs,\n                       gpuRenderStartTimeUs,\n                       gpuRenderEndTimeUs );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( LatencyTimingsFrameReportNV const & ) const = default;\n#else\n    bool operator==( LatencyTimingsFrameReportNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( presentID == rhs.presentID ) && ( inputSampleTimeUs == rhs.inputSampleTimeUs ) &&\n             ( simStartTimeUs == rhs.simStartTimeUs ) && ( simEndTimeUs == rhs.simEndTimeUs ) && ( renderSubmitStartTimeUs == rhs.renderSubmitStartTimeUs ) &&\n             ( renderSubmitEndTimeUs == rhs.renderSubmitEndTimeUs ) && ( presentStartTimeUs == rhs.presentStartTimeUs ) &&\n             ( presentEndTimeUs == rhs.presentEndTimeUs ) && ( driverStartTimeUs == rhs.driverStartTimeUs ) && ( driverEndTimeUs == rhs.driverEndTimeUs ) &&\n             ( osRenderQueueStartTimeUs == rhs.osRenderQueueStartTimeUs ) && ( osRenderQueueEndTimeUs == rhs.osRenderQueueEndTimeUs ) &&\n             ( gpuRenderStartTimeUs == rhs.gpuRenderStartTimeUs ) && ( gpuRenderEndTimeUs == rhs.gpuRenderEndTimeUs );\n#  endif\n    }\n\n    bool operator!=( LatencyTimingsFrameReportNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                    = StructureType::eLatencyTimingsFrameReportNV;\n    const void *                        pNext                    = {};\n    uint64_t                            presentID                = {};\n    uint64_t                            inputSampleTimeUs        = {};\n    uint64_t                            simStartTimeUs           = {};\n    uint64_t                            simEndTimeUs             = {};\n    uint64_t                            renderSubmitStartTimeUs  = {};\n    uint64_t                            renderSubmitEndTimeUs    = {};\n    uint64_t                            presentStartTimeUs       = {};\n    uint64_t                            presentEndTimeUs         = {};\n    uint64_t                            driverStartTimeUs        = {};\n    uint64_t                            driverEndTimeUs          = {};\n    uint64_t                            osRenderQueueStartTimeUs = {};\n    uint64_t                            osRenderQueueEndTimeUs   = {};\n    uint64_t                            gpuRenderStartTimeUs     = {};\n    uint64_t                            gpuRenderEndTimeUs       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eLatencyTimingsFrameReportNV>\n  {\n    using Type = LatencyTimingsFrameReportNV;\n  };\n\n  struct GetLatencyMarkerInfoNV\n  {\n    using NativeType = VkGetLatencyMarkerInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eGetLatencyMarkerInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR GetLatencyMarkerInfoNV( uint32_t                                            timingCount_ = {},\n                                                 VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV * pTimings_    = {},\n                                                 const void *                                        pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , timingCount{ timingCount_ }\n      , pTimings{ pTimings_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR GetLatencyMarkerInfoNV( GetLatencyMarkerInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    GetLatencyMarkerInfoNV( VkGetLatencyMarkerInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : GetLatencyMarkerInfoNV( *reinterpret_cast<GetLatencyMarkerInfoNV const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    GetLatencyMarkerInfoNV( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV> const & timings_,\n                            const void *                                                                                             pNext_ = nullptr )\n      : pNext( pNext_ ), timingCount( static_cast<uint32_t>( timings_.size() ) ), pTimings( timings_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    GetLatencyMarkerInfoNV & operator=( GetLatencyMarkerInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    GetLatencyMarkerInfoNV & operator=( VkGetLatencyMarkerInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::GetLatencyMarkerInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 GetLatencyMarkerInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GetLatencyMarkerInfoNV & setTimingCount( uint32_t timingCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      timingCount = timingCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GetLatencyMarkerInfoNV & setPTimings( VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV * pTimings_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pTimings = pTimings_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    GetLatencyMarkerInfoNV &\n      setTimings( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV> const & timings_ ) VULKAN_HPP_NOEXCEPT\n    {\n      timingCount = static_cast<uint32_t>( timings_.size() );\n      pTimings    = timings_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkGetLatencyMarkerInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkGetLatencyMarkerInfoNV *>( this );\n    }\n\n    operator VkGetLatencyMarkerInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkGetLatencyMarkerInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, timingCount, pTimings );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( GetLatencyMarkerInfoNV const & ) const = default;\n#else\n    bool operator==( GetLatencyMarkerInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( timingCount == rhs.timingCount ) && ( pTimings == rhs.pTimings );\n#  endif\n    }\n\n    bool operator!=( GetLatencyMarkerInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                 sType       = StructureType::eGetLatencyMarkerInfoNV;\n    const void *                                        pNext       = {};\n    uint32_t                                            timingCount = {};\n    VULKAN_HPP_NAMESPACE::LatencyTimingsFrameReportNV * pTimings    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eGetLatencyMarkerInfoNV>\n  {\n    using Type = GetLatencyMarkerInfoNV;\n  };\n\n  struct VertexInputBindingDescription\n  {\n    using NativeType = VkVertexInputBindingDescription;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      VertexInputBindingDescription( uint32_t                              binding_   = {},\n                                     uint32_t                              stride_    = {},\n                                     VULKAN_HPP_NAMESPACE::VertexInputRate inputRate_ = VULKAN_HPP_NAMESPACE::VertexInputRate::eVertex ) VULKAN_HPP_NOEXCEPT\n      : binding{ binding_ }\n      , stride{ stride_ }\n      , inputRate{ inputRate_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VertexInputBindingDescription( VertexInputBindingDescription const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VertexInputBindingDescription( VkVertexInputBindingDescription const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VertexInputBindingDescription( *reinterpret_cast<VertexInputBindingDescription const *>( &rhs ) )\n    {\n    }\n\n    VertexInputBindingDescription & operator=( VertexInputBindingDescription const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VertexInputBindingDescription & operator=( VkVertexInputBindingDescription const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VertexInputBindingDescription const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VertexInputBindingDescription & setBinding( uint32_t binding_ ) VULKAN_HPP_NOEXCEPT\n    {\n      binding = binding_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VertexInputBindingDescription & setStride( uint32_t stride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stride = stride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VertexInputBindingDescription & setInputRate( VULKAN_HPP_NAMESPACE::VertexInputRate inputRate_ ) VULKAN_HPP_NOEXCEPT\n    {\n      inputRate = inputRate_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVertexInputBindingDescription const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVertexInputBindingDescription *>( this );\n    }\n\n    operator VkVertexInputBindingDescription &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVertexInputBindingDescription *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &, VULKAN_HPP_NAMESPACE::VertexInputRate const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( binding, stride, inputRate );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VertexInputBindingDescription const & ) const = default;\n#else\n    bool operator==( VertexInputBindingDescription const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( binding == rhs.binding ) && ( stride == rhs.stride ) && ( inputRate == rhs.inputRate );\n#  endif\n    }\n\n    bool operator!=( VertexInputBindingDescription const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                              binding   = {};\n    uint32_t                              stride    = {};\n    VULKAN_HPP_NAMESPACE::VertexInputRate inputRate = VULKAN_HPP_NAMESPACE::VertexInputRate::eVertex;\n  };\n\n  struct VertexInputAttributeDescription\n  {\n    using NativeType = VkVertexInputAttributeDescription;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VertexInputAttributeDescription( uint32_t                     location_ = {},\n                                                          uint32_t                     binding_  = {},\n                                                          VULKAN_HPP_NAMESPACE::Format format_   = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                                          uint32_t                     offset_   = {} ) VULKAN_HPP_NOEXCEPT\n      : location{ location_ }\n      , binding{ binding_ }\n      , format{ format_ }\n      , offset{ offset_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VertexInputAttributeDescription( VertexInputAttributeDescription const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VertexInputAttributeDescription( VkVertexInputAttributeDescription const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VertexInputAttributeDescription( *reinterpret_cast<VertexInputAttributeDescription const *>( &rhs ) )\n    {\n    }\n\n    VertexInputAttributeDescription & operator=( VertexInputAttributeDescription const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VertexInputAttributeDescription & operator=( VkVertexInputAttributeDescription const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VertexInputAttributeDescription & setLocation( uint32_t location_ ) VULKAN_HPP_NOEXCEPT\n    {\n      location = location_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VertexInputAttributeDescription & setBinding( uint32_t binding_ ) VULKAN_HPP_NOEXCEPT\n    {\n      binding = binding_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VertexInputAttributeDescription & setFormat( VULKAN_HPP_NAMESPACE::Format format_ ) VULKAN_HPP_NOEXCEPT\n    {\n      format = format_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VertexInputAttributeDescription & setOffset( uint32_t offset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      offset = offset_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVertexInputAttributeDescription const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVertexInputAttributeDescription *>( this );\n    }\n\n    operator VkVertexInputAttributeDescription &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVertexInputAttributeDescription *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &, VULKAN_HPP_NAMESPACE::Format const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( location, binding, format, offset );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VertexInputAttributeDescription const & ) const = default;\n#else\n    bool operator==( VertexInputAttributeDescription const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( location == rhs.location ) && ( binding == rhs.binding ) && ( format == rhs.format ) && ( offset == rhs.offset );\n#  endif\n    }\n\n    bool operator!=( VertexInputAttributeDescription const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                     location = {};\n    uint32_t                     binding  = {};\n    VULKAN_HPP_NAMESPACE::Format format   = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    uint32_t                     offset   = {};\n  };\n\n  struct PipelineVertexInputStateCreateInfo\n  {\n    using NativeType = VkPipelineVertexInputStateCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineVertexInputStateCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineVertexInputStateCreateInfo( VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateFlags   flags_                           = {},\n                                                             uint32_t                                                    vertexBindingDescriptionCount_   = {},\n                                                             const VULKAN_HPP_NAMESPACE::VertexInputBindingDescription * pVertexBindingDescriptions_      = {},\n                                                             uint32_t                                                    vertexAttributeDescriptionCount_ = {},\n                                                             const VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription * pVertexAttributeDescriptions_  = {},\n                                                             const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , vertexBindingDescriptionCount{ vertexBindingDescriptionCount_ }\n      , pVertexBindingDescriptions{ pVertexBindingDescriptions_ }\n      , vertexAttributeDescriptionCount{ vertexAttributeDescriptionCount_ }\n      , pVertexAttributeDescriptions{ pVertexAttributeDescriptions_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineVertexInputStateCreateInfo( PipelineVertexInputStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineVertexInputStateCreateInfo( VkPipelineVertexInputStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineVertexInputStateCreateInfo( *reinterpret_cast<PipelineVertexInputStateCreateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineVertexInputStateCreateInfo(\n      VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateFlags                                                          flags_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VertexInputBindingDescription> const &   vertexBindingDescriptions_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription> const & vertexAttributeDescriptions_ = {},\n      const void *                                                                                                       pNext_ = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , vertexBindingDescriptionCount( static_cast<uint32_t>( vertexBindingDescriptions_.size() ) )\n      , pVertexBindingDescriptions( vertexBindingDescriptions_.data() )\n      , vertexAttributeDescriptionCount( static_cast<uint32_t>( vertexAttributeDescriptions_.size() ) )\n      , pVertexAttributeDescriptions( vertexAttributeDescriptions_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PipelineVertexInputStateCreateInfo & operator=( PipelineVertexInputStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineVertexInputStateCreateInfo & operator=( VkPipelineVertexInputStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineVertexInputStateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineVertexInputStateCreateInfo &\n      setFlags( VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineVertexInputStateCreateInfo & setVertexBindingDescriptionCount( uint32_t vertexBindingDescriptionCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexBindingDescriptionCount = vertexBindingDescriptionCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineVertexInputStateCreateInfo &\n      setPVertexBindingDescriptions( const VULKAN_HPP_NAMESPACE::VertexInputBindingDescription * pVertexBindingDescriptions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pVertexBindingDescriptions = pVertexBindingDescriptions_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineVertexInputStateCreateInfo & setVertexBindingDescriptions(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VertexInputBindingDescription> const & vertexBindingDescriptions_ )\n      VULKAN_HPP_NOEXCEPT\n    {\n      vertexBindingDescriptionCount = static_cast<uint32_t>( vertexBindingDescriptions_.size() );\n      pVertexBindingDescriptions    = vertexBindingDescriptions_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineVertexInputStateCreateInfo &\n      setVertexAttributeDescriptionCount( uint32_t vertexAttributeDescriptionCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexAttributeDescriptionCount = vertexAttributeDescriptionCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineVertexInputStateCreateInfo &\n      setPVertexAttributeDescriptions( const VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription * pVertexAttributeDescriptions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pVertexAttributeDescriptions = pVertexAttributeDescriptions_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineVertexInputStateCreateInfo & setVertexAttributeDescriptions(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription> const & vertexAttributeDescriptions_ )\n      VULKAN_HPP_NOEXCEPT\n    {\n      vertexAttributeDescriptionCount = static_cast<uint32_t>( vertexAttributeDescriptions_.size() );\n      pVertexAttributeDescriptions    = vertexAttributeDescriptions_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineVertexInputStateCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineVertexInputStateCreateInfo *>( this );\n    }\n\n    operator VkPipelineVertexInputStateCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineVertexInputStateCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateFlags const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::VertexInputBindingDescription * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie(\n        sType, pNext, flags, vertexBindingDescriptionCount, pVertexBindingDescriptions, vertexAttributeDescriptionCount, pVertexAttributeDescriptions );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineVertexInputStateCreateInfo const & ) const = default;\n#else\n    bool operator==( PipelineVertexInputStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) &&\n             ( vertexBindingDescriptionCount == rhs.vertexBindingDescriptionCount ) && ( pVertexBindingDescriptions == rhs.pVertexBindingDescriptions ) &&\n             ( vertexAttributeDescriptionCount == rhs.vertexAttributeDescriptionCount ) && ( pVertexAttributeDescriptions == rhs.pVertexAttributeDescriptions );\n#  endif\n    }\n\n    bool operator!=( PipelineVertexInputStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                           sType                           = StructureType::ePipelineVertexInputStateCreateInfo;\n    const void *                                                  pNext                           = {};\n    VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateFlags     flags                           = {};\n    uint32_t                                                      vertexBindingDescriptionCount   = {};\n    const VULKAN_HPP_NAMESPACE::VertexInputBindingDescription *   pVertexBindingDescriptions      = {};\n    uint32_t                                                      vertexAttributeDescriptionCount = {};\n    const VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription * pVertexAttributeDescriptions    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineVertexInputStateCreateInfo>\n  {\n    using Type = PipelineVertexInputStateCreateInfo;\n  };\n\n  struct PipelineInputAssemblyStateCreateInfo\n  {\n    using NativeType = VkPipelineInputAssemblyStateCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineInputAssemblyStateCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      PipelineInputAssemblyStateCreateInfo( VULKAN_HPP_NAMESPACE::PipelineInputAssemblyStateCreateFlags flags_ = {},\n                                            VULKAN_HPP_NAMESPACE::PrimitiveTopology topology_ = VULKAN_HPP_NAMESPACE::PrimitiveTopology::ePointList,\n                                            VULKAN_HPP_NAMESPACE::Bool32            primitiveRestartEnable_ = {},\n                                            const void *                            pNext_                  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , topology{ topology_ }\n      , primitiveRestartEnable{ primitiveRestartEnable_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineInputAssemblyStateCreateInfo( PipelineInputAssemblyStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineInputAssemblyStateCreateInfo( VkPipelineInputAssemblyStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineInputAssemblyStateCreateInfo( *reinterpret_cast<PipelineInputAssemblyStateCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    PipelineInputAssemblyStateCreateInfo & operator=( PipelineInputAssemblyStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineInputAssemblyStateCreateInfo & operator=( VkPipelineInputAssemblyStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineInputAssemblyStateCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineInputAssemblyStateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineInputAssemblyStateCreateInfo &\n      setFlags( VULKAN_HPP_NAMESPACE::PipelineInputAssemblyStateCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineInputAssemblyStateCreateInfo & setTopology( VULKAN_HPP_NAMESPACE::PrimitiveTopology topology_ ) VULKAN_HPP_NOEXCEPT\n    {\n      topology = topology_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineInputAssemblyStateCreateInfo &\n      setPrimitiveRestartEnable( VULKAN_HPP_NAMESPACE::Bool32 primitiveRestartEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      primitiveRestartEnable = primitiveRestartEnable_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineInputAssemblyStateCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineInputAssemblyStateCreateInfo *>( this );\n    }\n\n    operator VkPipelineInputAssemblyStateCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineInputAssemblyStateCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineInputAssemblyStateCreateFlags const &,\n               VULKAN_HPP_NAMESPACE::PrimitiveTopology const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, topology, primitiveRestartEnable );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineInputAssemblyStateCreateInfo const & ) const = default;\n#else\n    bool operator==( PipelineInputAssemblyStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( topology == rhs.topology ) &&\n             ( primitiveRestartEnable == rhs.primitiveRestartEnable );\n#  endif\n    }\n\n    bool operator!=( PipelineInputAssemblyStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                         sType                  = StructureType::ePipelineInputAssemblyStateCreateInfo;\n    const void *                                                pNext                  = {};\n    VULKAN_HPP_NAMESPACE::PipelineInputAssemblyStateCreateFlags flags                  = {};\n    VULKAN_HPP_NAMESPACE::PrimitiveTopology                     topology               = VULKAN_HPP_NAMESPACE::PrimitiveTopology::ePointList;\n    VULKAN_HPP_NAMESPACE::Bool32                                primitiveRestartEnable = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineInputAssemblyStateCreateInfo>\n  {\n    using Type = PipelineInputAssemblyStateCreateInfo;\n  };\n\n  struct PipelineTessellationStateCreateInfo\n  {\n    using NativeType = VkPipelineTessellationStateCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineTessellationStateCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineTessellationStateCreateInfo( VULKAN_HPP_NAMESPACE::PipelineTessellationStateCreateFlags flags_              = {},\n                                                              uint32_t                                                   patchControlPoints_ = {},\n                                                              const void *                                               pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , patchControlPoints{ patchControlPoints_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineTessellationStateCreateInfo( PipelineTessellationStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineTessellationStateCreateInfo( VkPipelineTessellationStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineTessellationStateCreateInfo( *reinterpret_cast<PipelineTessellationStateCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    PipelineTessellationStateCreateInfo & operator=( PipelineTessellationStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineTessellationStateCreateInfo & operator=( VkPipelineTessellationStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineTessellationStateCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineTessellationStateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineTessellationStateCreateInfo &\n      setFlags( VULKAN_HPP_NAMESPACE::PipelineTessellationStateCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineTessellationStateCreateInfo & setPatchControlPoints( uint32_t patchControlPoints_ ) VULKAN_HPP_NOEXCEPT\n    {\n      patchControlPoints = patchControlPoints_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineTessellationStateCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineTessellationStateCreateInfo *>( this );\n    }\n\n    operator VkPipelineTessellationStateCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineTessellationStateCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineTessellationStateCreateFlags const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, patchControlPoints );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineTessellationStateCreateInfo const & ) const = default;\n#else\n    bool operator==( PipelineTessellationStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( patchControlPoints == rhs.patchControlPoints );\n#  endif\n    }\n\n    bool operator!=( PipelineTessellationStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                        sType              = StructureType::ePipelineTessellationStateCreateInfo;\n    const void *                                               pNext              = {};\n    VULKAN_HPP_NAMESPACE::PipelineTessellationStateCreateFlags flags              = {};\n    uint32_t                                                   patchControlPoints = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineTessellationStateCreateInfo>\n  {\n    using Type = PipelineTessellationStateCreateInfo;\n  };\n\n  struct PipelineViewportStateCreateInfo\n  {\n    using NativeType = VkPipelineViewportStateCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineViewportStateCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineViewportStateCreateInfo( VULKAN_HPP_NAMESPACE::PipelineViewportStateCreateFlags flags_         = {},\n                                                          uint32_t                                               viewportCount_ = {},\n                                                          const VULKAN_HPP_NAMESPACE::Viewport *                 pViewports_    = {},\n                                                          uint32_t                                               scissorCount_  = {},\n                                                          const VULKAN_HPP_NAMESPACE::Rect2D *                   pScissors_     = {},\n                                                          const void *                                           pNext_         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , viewportCount{ viewportCount_ }\n      , pViewports{ pViewports_ }\n      , scissorCount{ scissorCount_ }\n      , pScissors{ pScissors_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineViewportStateCreateInfo( PipelineViewportStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineViewportStateCreateInfo( VkPipelineViewportStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineViewportStateCreateInfo( *reinterpret_cast<PipelineViewportStateCreateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineViewportStateCreateInfo( VULKAN_HPP_NAMESPACE::PipelineViewportStateCreateFlags                                      flags_,\n                                     VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Viewport> const & viewports_,\n                                     VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Rect2D> const &   scissors_ = {},\n                                     const void *                                                                                pNext_    = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , viewportCount( static_cast<uint32_t>( viewports_.size() ) )\n      , pViewports( viewports_.data() )\n      , scissorCount( static_cast<uint32_t>( scissors_.size() ) )\n      , pScissors( scissors_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PipelineViewportStateCreateInfo & operator=( PipelineViewportStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineViewportStateCreateInfo & operator=( VkPipelineViewportStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineViewportStateCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportStateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportStateCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::PipelineViewportStateCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportStateCreateInfo & setViewportCount( uint32_t viewportCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      viewportCount = viewportCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportStateCreateInfo & setPViewports( const VULKAN_HPP_NAMESPACE::Viewport * pViewports_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pViewports = pViewports_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineViewportStateCreateInfo &\n      setViewports( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Viewport> const & viewports_ ) VULKAN_HPP_NOEXCEPT\n    {\n      viewportCount = static_cast<uint32_t>( viewports_.size() );\n      pViewports    = viewports_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportStateCreateInfo & setScissorCount( uint32_t scissorCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      scissorCount = scissorCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportStateCreateInfo & setPScissors( const VULKAN_HPP_NAMESPACE::Rect2D * pScissors_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pScissors = pScissors_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineViewportStateCreateInfo &\n      setScissors( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Rect2D> const & scissors_ ) VULKAN_HPP_NOEXCEPT\n    {\n      scissorCount = static_cast<uint32_t>( scissors_.size() );\n      pScissors    = scissors_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineViewportStateCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineViewportStateCreateInfo *>( this );\n    }\n\n    operator VkPipelineViewportStateCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineViewportStateCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineViewportStateCreateFlags const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::Viewport * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::Rect2D * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, viewportCount, pViewports, scissorCount, pScissors );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineViewportStateCreateInfo const & ) const = default;\n#else\n    bool operator==( PipelineViewportStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( viewportCount == rhs.viewportCount ) &&\n             ( pViewports == rhs.pViewports ) && ( scissorCount == rhs.scissorCount ) && ( pScissors == rhs.pScissors );\n#  endif\n    }\n\n    bool operator!=( PipelineViewportStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType         = StructureType::ePipelineViewportStateCreateInfo;\n    const void *                                           pNext         = {};\n    VULKAN_HPP_NAMESPACE::PipelineViewportStateCreateFlags flags         = {};\n    uint32_t                                               viewportCount = {};\n    const VULKAN_HPP_NAMESPACE::Viewport *                 pViewports    = {};\n    uint32_t                                               scissorCount  = {};\n    const VULKAN_HPP_NAMESPACE::Rect2D *                   pScissors     = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineViewportStateCreateInfo>\n  {\n    using Type = PipelineViewportStateCreateInfo;\n  };\n\n  struct PipelineRasterizationStateCreateInfo\n  {\n    using NativeType = VkPipelineRasterizationStateCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineRasterizationStateCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineRasterizationStateCreateInfo( VULKAN_HPP_NAMESPACE::PipelineRasterizationStateCreateFlags flags_                   = {},\n                                                               VULKAN_HPP_NAMESPACE::Bool32                                depthClampEnable_        = {},\n                                                               VULKAN_HPP_NAMESPACE::Bool32                                rasterizerDiscardEnable_ = {},\n                                                               VULKAN_HPP_NAMESPACE::PolygonMode   polygonMode_ = VULKAN_HPP_NAMESPACE::PolygonMode::eFill,\n                                                               VULKAN_HPP_NAMESPACE::CullModeFlags cullMode_    = {},\n                                                               VULKAN_HPP_NAMESPACE::FrontFace frontFace_ = VULKAN_HPP_NAMESPACE::FrontFace::eCounterClockwise,\n                                                               VULKAN_HPP_NAMESPACE::Bool32    depthBiasEnable_         = {},\n                                                               float                           depthBiasConstantFactor_ = {},\n                                                               float                           depthBiasClamp_          = {},\n                                                               float                           depthBiasSlopeFactor_    = {},\n                                                               float                           lineWidth_               = {},\n                                                               const void *                    pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , depthClampEnable{ depthClampEnable_ }\n      , rasterizerDiscardEnable{ rasterizerDiscardEnable_ }\n      , polygonMode{ polygonMode_ }\n      , cullMode{ cullMode_ }\n      , frontFace{ frontFace_ }\n      , depthBiasEnable{ depthBiasEnable_ }\n      , depthBiasConstantFactor{ depthBiasConstantFactor_ }\n      , depthBiasClamp{ depthBiasClamp_ }\n      , depthBiasSlopeFactor{ depthBiasSlopeFactor_ }\n      , lineWidth{ lineWidth_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineRasterizationStateCreateInfo( PipelineRasterizationStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineRasterizationStateCreateInfo( VkPipelineRasterizationStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineRasterizationStateCreateInfo( *reinterpret_cast<PipelineRasterizationStateCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    PipelineRasterizationStateCreateInfo & operator=( PipelineRasterizationStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineRasterizationStateCreateInfo & operator=( VkPipelineRasterizationStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineRasterizationStateCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationStateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationStateCreateInfo &\n      setFlags( VULKAN_HPP_NAMESPACE::PipelineRasterizationStateCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationStateCreateInfo & setDepthClampEnable( VULKAN_HPP_NAMESPACE::Bool32 depthClampEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthClampEnable = depthClampEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationStateCreateInfo &\n      setRasterizerDiscardEnable( VULKAN_HPP_NAMESPACE::Bool32 rasterizerDiscardEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rasterizerDiscardEnable = rasterizerDiscardEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationStateCreateInfo & setPolygonMode( VULKAN_HPP_NAMESPACE::PolygonMode polygonMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      polygonMode = polygonMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationStateCreateInfo & setCullMode( VULKAN_HPP_NAMESPACE::CullModeFlags cullMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      cullMode = cullMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationStateCreateInfo & setFrontFace( VULKAN_HPP_NAMESPACE::FrontFace frontFace_ ) VULKAN_HPP_NOEXCEPT\n    {\n      frontFace = frontFace_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationStateCreateInfo & setDepthBiasEnable( VULKAN_HPP_NAMESPACE::Bool32 depthBiasEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthBiasEnable = depthBiasEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationStateCreateInfo & setDepthBiasConstantFactor( float depthBiasConstantFactor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthBiasConstantFactor = depthBiasConstantFactor_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationStateCreateInfo & setDepthBiasClamp( float depthBiasClamp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthBiasClamp = depthBiasClamp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationStateCreateInfo & setDepthBiasSlopeFactor( float depthBiasSlopeFactor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthBiasSlopeFactor = depthBiasSlopeFactor_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationStateCreateInfo & setLineWidth( float lineWidth_ ) VULKAN_HPP_NOEXCEPT\n    {\n      lineWidth = lineWidth_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineRasterizationStateCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineRasterizationStateCreateInfo *>( this );\n    }\n\n    operator VkPipelineRasterizationStateCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineRasterizationStateCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineRasterizationStateCreateFlags const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::PolygonMode const &,\n               VULKAN_HPP_NAMESPACE::CullModeFlags const &,\n               VULKAN_HPP_NAMESPACE::FrontFace const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               float const &,\n               float const &,\n               float const &,\n               float const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       flags,\n                       depthClampEnable,\n                       rasterizerDiscardEnable,\n                       polygonMode,\n                       cullMode,\n                       frontFace,\n                       depthBiasEnable,\n                       depthBiasConstantFactor,\n                       depthBiasClamp,\n                       depthBiasSlopeFactor,\n                       lineWidth );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineRasterizationStateCreateInfo const & ) const = default;\n#else\n    bool operator==( PipelineRasterizationStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( depthClampEnable == rhs.depthClampEnable ) &&\n             ( rasterizerDiscardEnable == rhs.rasterizerDiscardEnable ) && ( polygonMode == rhs.polygonMode ) && ( cullMode == rhs.cullMode ) &&\n             ( frontFace == rhs.frontFace ) && ( depthBiasEnable == rhs.depthBiasEnable ) && ( depthBiasConstantFactor == rhs.depthBiasConstantFactor ) &&\n             ( depthBiasClamp == rhs.depthBiasClamp ) && ( depthBiasSlopeFactor == rhs.depthBiasSlopeFactor ) && ( lineWidth == rhs.lineWidth );\n#  endif\n    }\n\n    bool operator!=( PipelineRasterizationStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                         sType                   = StructureType::ePipelineRasterizationStateCreateInfo;\n    const void *                                                pNext                   = {};\n    VULKAN_HPP_NAMESPACE::PipelineRasterizationStateCreateFlags flags                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32                                depthClampEnable        = {};\n    VULKAN_HPP_NAMESPACE::Bool32                                rasterizerDiscardEnable = {};\n    VULKAN_HPP_NAMESPACE::PolygonMode                           polygonMode             = VULKAN_HPP_NAMESPACE::PolygonMode::eFill;\n    VULKAN_HPP_NAMESPACE::CullModeFlags                         cullMode                = {};\n    VULKAN_HPP_NAMESPACE::FrontFace                             frontFace               = VULKAN_HPP_NAMESPACE::FrontFace::eCounterClockwise;\n    VULKAN_HPP_NAMESPACE::Bool32                                depthBiasEnable         = {};\n    float                                                       depthBiasConstantFactor = {};\n    float                                                       depthBiasClamp          = {};\n    float                                                       depthBiasSlopeFactor    = {};\n    float                                                       lineWidth               = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineRasterizationStateCreateInfo>\n  {\n    using Type = PipelineRasterizationStateCreateInfo;\n  };\n\n  struct PipelineMultisampleStateCreateInfo\n  {\n    using NativeType = VkPipelineMultisampleStateCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineMultisampleStateCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      PipelineMultisampleStateCreateInfo( VULKAN_HPP_NAMESPACE::PipelineMultisampleStateCreateFlags flags_ = {},\n                                          VULKAN_HPP_NAMESPACE::SampleCountFlagBits rasterizationSamples_  = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1,\n                                          VULKAN_HPP_NAMESPACE::Bool32              sampleShadingEnable_   = {},\n                                          float                                     minSampleShading_      = {},\n                                          const VULKAN_HPP_NAMESPACE::SampleMask *  pSampleMask_           = {},\n                                          VULKAN_HPP_NAMESPACE::Bool32              alphaToCoverageEnable_ = {},\n                                          VULKAN_HPP_NAMESPACE::Bool32              alphaToOneEnable_      = {},\n                                          const void *                              pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , rasterizationSamples{ rasterizationSamples_ }\n      , sampleShadingEnable{ sampleShadingEnable_ }\n      , minSampleShading{ minSampleShading_ }\n      , pSampleMask{ pSampleMask_ }\n      , alphaToCoverageEnable{ alphaToCoverageEnable_ }\n      , alphaToOneEnable{ alphaToOneEnable_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineMultisampleStateCreateInfo( PipelineMultisampleStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineMultisampleStateCreateInfo( VkPipelineMultisampleStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineMultisampleStateCreateInfo( *reinterpret_cast<PipelineMultisampleStateCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    PipelineMultisampleStateCreateInfo & operator=( PipelineMultisampleStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineMultisampleStateCreateInfo & operator=( VkPipelineMultisampleStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineMultisampleStateCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineMultisampleStateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineMultisampleStateCreateInfo &\n      setFlags( VULKAN_HPP_NAMESPACE::PipelineMultisampleStateCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineMultisampleStateCreateInfo &\n      setRasterizationSamples( VULKAN_HPP_NAMESPACE::SampleCountFlagBits rasterizationSamples_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rasterizationSamples = rasterizationSamples_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineMultisampleStateCreateInfo & setSampleShadingEnable( VULKAN_HPP_NAMESPACE::Bool32 sampleShadingEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sampleShadingEnable = sampleShadingEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineMultisampleStateCreateInfo & setMinSampleShading( float minSampleShading_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minSampleShading = minSampleShading_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineMultisampleStateCreateInfo & setPSampleMask( const VULKAN_HPP_NAMESPACE::SampleMask * pSampleMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSampleMask = pSampleMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineMultisampleStateCreateInfo &\n      setAlphaToCoverageEnable( VULKAN_HPP_NAMESPACE::Bool32 alphaToCoverageEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      alphaToCoverageEnable = alphaToCoverageEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineMultisampleStateCreateInfo & setAlphaToOneEnable( VULKAN_HPP_NAMESPACE::Bool32 alphaToOneEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      alphaToOneEnable = alphaToOneEnable_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineMultisampleStateCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineMultisampleStateCreateInfo *>( this );\n    }\n\n    operator VkPipelineMultisampleStateCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineMultisampleStateCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineMultisampleStateCreateFlags const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlagBits const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               float const &,\n               const VULKAN_HPP_NAMESPACE::SampleMask * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, rasterizationSamples, sampleShadingEnable, minSampleShading, pSampleMask, alphaToCoverageEnable, alphaToOneEnable );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineMultisampleStateCreateInfo const & ) const = default;\n#else\n    bool operator==( PipelineMultisampleStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( rasterizationSamples == rhs.rasterizationSamples ) &&\n             ( sampleShadingEnable == rhs.sampleShadingEnable ) && ( minSampleShading == rhs.minSampleShading ) && ( pSampleMask == rhs.pSampleMask ) &&\n             ( alphaToCoverageEnable == rhs.alphaToCoverageEnable ) && ( alphaToOneEnable == rhs.alphaToOneEnable );\n#  endif\n    }\n\n    bool operator!=( PipelineMultisampleStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                       sType                 = StructureType::ePipelineMultisampleStateCreateInfo;\n    const void *                                              pNext                 = {};\n    VULKAN_HPP_NAMESPACE::PipelineMultisampleStateCreateFlags flags                 = {};\n    VULKAN_HPP_NAMESPACE::SampleCountFlagBits                 rasterizationSamples  = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1;\n    VULKAN_HPP_NAMESPACE::Bool32                              sampleShadingEnable   = {};\n    float                                                     minSampleShading      = {};\n    const VULKAN_HPP_NAMESPACE::SampleMask *                  pSampleMask           = {};\n    VULKAN_HPP_NAMESPACE::Bool32                              alphaToCoverageEnable = {};\n    VULKAN_HPP_NAMESPACE::Bool32                              alphaToOneEnable      = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineMultisampleStateCreateInfo>\n  {\n    using Type = PipelineMultisampleStateCreateInfo;\n  };\n\n  struct StencilOpState\n  {\n    using NativeType = VkStencilOpState;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR StencilOpState( VULKAN_HPP_NAMESPACE::StencilOp failOp_      = VULKAN_HPP_NAMESPACE::StencilOp::eKeep,\n                                         VULKAN_HPP_NAMESPACE::StencilOp passOp_      = VULKAN_HPP_NAMESPACE::StencilOp::eKeep,\n                                         VULKAN_HPP_NAMESPACE::StencilOp depthFailOp_ = VULKAN_HPP_NAMESPACE::StencilOp::eKeep,\n                                         VULKAN_HPP_NAMESPACE::CompareOp compareOp_   = VULKAN_HPP_NAMESPACE::CompareOp::eNever,\n                                         uint32_t                        compareMask_ = {},\n                                         uint32_t                        writeMask_   = {},\n                                         uint32_t                        reference_   = {} ) VULKAN_HPP_NOEXCEPT\n      : failOp{ failOp_ }\n      , passOp{ passOp_ }\n      , depthFailOp{ depthFailOp_ }\n      , compareOp{ compareOp_ }\n      , compareMask{ compareMask_ }\n      , writeMask{ writeMask_ }\n      , reference{ reference_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR StencilOpState( StencilOpState const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    StencilOpState( VkStencilOpState const & rhs ) VULKAN_HPP_NOEXCEPT : StencilOpState( *reinterpret_cast<StencilOpState const *>( &rhs ) ) {}\n\n    StencilOpState & operator=( StencilOpState const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    StencilOpState & operator=( VkStencilOpState const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::StencilOpState const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 StencilOpState & setFailOp( VULKAN_HPP_NAMESPACE::StencilOp failOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      failOp = failOp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 StencilOpState & setPassOp( VULKAN_HPP_NAMESPACE::StencilOp passOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      passOp = passOp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 StencilOpState & setDepthFailOp( VULKAN_HPP_NAMESPACE::StencilOp depthFailOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthFailOp = depthFailOp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 StencilOpState & setCompareOp( VULKAN_HPP_NAMESPACE::CompareOp compareOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      compareOp = compareOp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 StencilOpState & setCompareMask( uint32_t compareMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      compareMask = compareMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 StencilOpState & setWriteMask( uint32_t writeMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      writeMask = writeMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 StencilOpState & setReference( uint32_t reference_ ) VULKAN_HPP_NOEXCEPT\n    {\n      reference = reference_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkStencilOpState const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkStencilOpState *>( this );\n    }\n\n    operator VkStencilOpState &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkStencilOpState *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StencilOp const &,\n               VULKAN_HPP_NAMESPACE::StencilOp const &,\n               VULKAN_HPP_NAMESPACE::StencilOp const &,\n               VULKAN_HPP_NAMESPACE::CompareOp const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( failOp, passOp, depthFailOp, compareOp, compareMask, writeMask, reference );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( StencilOpState const & ) const = default;\n#else\n    bool operator==( StencilOpState const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( failOp == rhs.failOp ) && ( passOp == rhs.passOp ) && ( depthFailOp == rhs.depthFailOp ) && ( compareOp == rhs.compareOp ) &&\n             ( compareMask == rhs.compareMask ) && ( writeMask == rhs.writeMask ) && ( reference == rhs.reference );\n#  endif\n    }\n\n    bool operator!=( StencilOpState const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StencilOp failOp      = VULKAN_HPP_NAMESPACE::StencilOp::eKeep;\n    VULKAN_HPP_NAMESPACE::StencilOp passOp      = VULKAN_HPP_NAMESPACE::StencilOp::eKeep;\n    VULKAN_HPP_NAMESPACE::StencilOp depthFailOp = VULKAN_HPP_NAMESPACE::StencilOp::eKeep;\n    VULKAN_HPP_NAMESPACE::CompareOp compareOp   = VULKAN_HPP_NAMESPACE::CompareOp::eNever;\n    uint32_t                        compareMask = {};\n    uint32_t                        writeMask   = {};\n    uint32_t                        reference   = {};\n  };\n\n  struct PipelineDepthStencilStateCreateInfo\n  {\n    using NativeType = VkPipelineDepthStencilStateCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineDepthStencilStateCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineDepthStencilStateCreateInfo( VULKAN_HPP_NAMESPACE::PipelineDepthStencilStateCreateFlags flags_            = {},\n                                                              VULKAN_HPP_NAMESPACE::Bool32                               depthTestEnable_  = {},\n                                                              VULKAN_HPP_NAMESPACE::Bool32                               depthWriteEnable_ = {},\n                                                              VULKAN_HPP_NAMESPACE::CompareOp      depthCompareOp_ = VULKAN_HPP_NAMESPACE::CompareOp::eNever,\n                                                              VULKAN_HPP_NAMESPACE::Bool32         depthBoundsTestEnable_ = {},\n                                                              VULKAN_HPP_NAMESPACE::Bool32         stencilTestEnable_     = {},\n                                                              VULKAN_HPP_NAMESPACE::StencilOpState front_                 = {},\n                                                              VULKAN_HPP_NAMESPACE::StencilOpState back_                  = {},\n                                                              float                                minDepthBounds_        = {},\n                                                              float                                maxDepthBounds_        = {},\n                                                              const void *                         pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , depthTestEnable{ depthTestEnable_ }\n      , depthWriteEnable{ depthWriteEnable_ }\n      , depthCompareOp{ depthCompareOp_ }\n      , depthBoundsTestEnable{ depthBoundsTestEnable_ }\n      , stencilTestEnable{ stencilTestEnable_ }\n      , front{ front_ }\n      , back{ back_ }\n      , minDepthBounds{ minDepthBounds_ }\n      , maxDepthBounds{ maxDepthBounds_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineDepthStencilStateCreateInfo( PipelineDepthStencilStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineDepthStencilStateCreateInfo( VkPipelineDepthStencilStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineDepthStencilStateCreateInfo( *reinterpret_cast<PipelineDepthStencilStateCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    PipelineDepthStencilStateCreateInfo & operator=( PipelineDepthStencilStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineDepthStencilStateCreateInfo & operator=( VkPipelineDepthStencilStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineDepthStencilStateCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineDepthStencilStateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineDepthStencilStateCreateInfo &\n      setFlags( VULKAN_HPP_NAMESPACE::PipelineDepthStencilStateCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineDepthStencilStateCreateInfo & setDepthTestEnable( VULKAN_HPP_NAMESPACE::Bool32 depthTestEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthTestEnable = depthTestEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineDepthStencilStateCreateInfo & setDepthWriteEnable( VULKAN_HPP_NAMESPACE::Bool32 depthWriteEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthWriteEnable = depthWriteEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineDepthStencilStateCreateInfo & setDepthCompareOp( VULKAN_HPP_NAMESPACE::CompareOp depthCompareOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthCompareOp = depthCompareOp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineDepthStencilStateCreateInfo &\n      setDepthBoundsTestEnable( VULKAN_HPP_NAMESPACE::Bool32 depthBoundsTestEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthBoundsTestEnable = depthBoundsTestEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineDepthStencilStateCreateInfo & setStencilTestEnable( VULKAN_HPP_NAMESPACE::Bool32 stencilTestEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stencilTestEnable = stencilTestEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineDepthStencilStateCreateInfo & setFront( VULKAN_HPP_NAMESPACE::StencilOpState const & front_ ) VULKAN_HPP_NOEXCEPT\n    {\n      front = front_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineDepthStencilStateCreateInfo & setBack( VULKAN_HPP_NAMESPACE::StencilOpState const & back_ ) VULKAN_HPP_NOEXCEPT\n    {\n      back = back_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineDepthStencilStateCreateInfo & setMinDepthBounds( float minDepthBounds_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minDepthBounds = minDepthBounds_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineDepthStencilStateCreateInfo & setMaxDepthBounds( float maxDepthBounds_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxDepthBounds = maxDepthBounds_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineDepthStencilStateCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineDepthStencilStateCreateInfo *>( this );\n    }\n\n    operator VkPipelineDepthStencilStateCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineDepthStencilStateCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineDepthStencilStateCreateFlags const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::CompareOp const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::StencilOpState const &,\n               VULKAN_HPP_NAMESPACE::StencilOpState const &,\n               float const &,\n               float const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       flags,\n                       depthTestEnable,\n                       depthWriteEnable,\n                       depthCompareOp,\n                       depthBoundsTestEnable,\n                       stencilTestEnable,\n                       front,\n                       back,\n                       minDepthBounds,\n                       maxDepthBounds );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineDepthStencilStateCreateInfo const & ) const = default;\n#else\n    bool operator==( PipelineDepthStencilStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( depthTestEnable == rhs.depthTestEnable ) &&\n             ( depthWriteEnable == rhs.depthWriteEnable ) && ( depthCompareOp == rhs.depthCompareOp ) &&\n             ( depthBoundsTestEnable == rhs.depthBoundsTestEnable ) && ( stencilTestEnable == rhs.stencilTestEnable ) && ( front == rhs.front ) &&\n             ( back == rhs.back ) && ( minDepthBounds == rhs.minDepthBounds ) && ( maxDepthBounds == rhs.maxDepthBounds );\n#  endif\n    }\n\n    bool operator!=( PipelineDepthStencilStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                        sType                 = StructureType::ePipelineDepthStencilStateCreateInfo;\n    const void *                                               pNext                 = {};\n    VULKAN_HPP_NAMESPACE::PipelineDepthStencilStateCreateFlags flags                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32                               depthTestEnable       = {};\n    VULKAN_HPP_NAMESPACE::Bool32                               depthWriteEnable      = {};\n    VULKAN_HPP_NAMESPACE::CompareOp                            depthCompareOp        = VULKAN_HPP_NAMESPACE::CompareOp::eNever;\n    VULKAN_HPP_NAMESPACE::Bool32                               depthBoundsTestEnable = {};\n    VULKAN_HPP_NAMESPACE::Bool32                               stencilTestEnable     = {};\n    VULKAN_HPP_NAMESPACE::StencilOpState                       front                 = {};\n    VULKAN_HPP_NAMESPACE::StencilOpState                       back                  = {};\n    float                                                      minDepthBounds        = {};\n    float                                                      maxDepthBounds        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineDepthStencilStateCreateInfo>\n  {\n    using Type = PipelineDepthStencilStateCreateInfo;\n  };\n\n  struct PipelineColorBlendAttachmentState\n  {\n    using NativeType = VkPipelineColorBlendAttachmentState;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineColorBlendAttachmentState( VULKAN_HPP_NAMESPACE::Bool32      blendEnable_         = {},\n                                                            VULKAN_HPP_NAMESPACE::BlendFactor srcColorBlendFactor_ = VULKAN_HPP_NAMESPACE::BlendFactor::eZero,\n                                                            VULKAN_HPP_NAMESPACE::BlendFactor dstColorBlendFactor_ = VULKAN_HPP_NAMESPACE::BlendFactor::eZero,\n                                                            VULKAN_HPP_NAMESPACE::BlendOp     colorBlendOp_        = VULKAN_HPP_NAMESPACE::BlendOp::eAdd,\n                                                            VULKAN_HPP_NAMESPACE::BlendFactor srcAlphaBlendFactor_ = VULKAN_HPP_NAMESPACE::BlendFactor::eZero,\n                                                            VULKAN_HPP_NAMESPACE::BlendFactor dstAlphaBlendFactor_ = VULKAN_HPP_NAMESPACE::BlendFactor::eZero,\n                                                            VULKAN_HPP_NAMESPACE::BlendOp     alphaBlendOp_        = VULKAN_HPP_NAMESPACE::BlendOp::eAdd,\n                                                            VULKAN_HPP_NAMESPACE::ColorComponentFlags colorWriteMask_ = {} ) VULKAN_HPP_NOEXCEPT\n      : blendEnable{ blendEnable_ }\n      , srcColorBlendFactor{ srcColorBlendFactor_ }\n      , dstColorBlendFactor{ dstColorBlendFactor_ }\n      , colorBlendOp{ colorBlendOp_ }\n      , srcAlphaBlendFactor{ srcAlphaBlendFactor_ }\n      , dstAlphaBlendFactor{ dstAlphaBlendFactor_ }\n      , alphaBlendOp{ alphaBlendOp_ }\n      , colorWriteMask{ colorWriteMask_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineColorBlendAttachmentState( PipelineColorBlendAttachmentState const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineColorBlendAttachmentState( VkPipelineColorBlendAttachmentState const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineColorBlendAttachmentState( *reinterpret_cast<PipelineColorBlendAttachmentState const *>( &rhs ) )\n    {\n    }\n\n    PipelineColorBlendAttachmentState & operator=( PipelineColorBlendAttachmentState const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineColorBlendAttachmentState & operator=( VkPipelineColorBlendAttachmentState const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineColorBlendAttachmentState const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorBlendAttachmentState & setBlendEnable( VULKAN_HPP_NAMESPACE::Bool32 blendEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      blendEnable = blendEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorBlendAttachmentState &\n      setSrcColorBlendFactor( VULKAN_HPP_NAMESPACE::BlendFactor srcColorBlendFactor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcColorBlendFactor = srcColorBlendFactor_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorBlendAttachmentState &\n      setDstColorBlendFactor( VULKAN_HPP_NAMESPACE::BlendFactor dstColorBlendFactor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstColorBlendFactor = dstColorBlendFactor_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorBlendAttachmentState & setColorBlendOp( VULKAN_HPP_NAMESPACE::BlendOp colorBlendOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorBlendOp = colorBlendOp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorBlendAttachmentState &\n      setSrcAlphaBlendFactor( VULKAN_HPP_NAMESPACE::BlendFactor srcAlphaBlendFactor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcAlphaBlendFactor = srcAlphaBlendFactor_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorBlendAttachmentState &\n      setDstAlphaBlendFactor( VULKAN_HPP_NAMESPACE::BlendFactor dstAlphaBlendFactor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstAlphaBlendFactor = dstAlphaBlendFactor_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorBlendAttachmentState & setAlphaBlendOp( VULKAN_HPP_NAMESPACE::BlendOp alphaBlendOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      alphaBlendOp = alphaBlendOp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorBlendAttachmentState &\n      setColorWriteMask( VULKAN_HPP_NAMESPACE::ColorComponentFlags colorWriteMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorWriteMask = colorWriteMask_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineColorBlendAttachmentState const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineColorBlendAttachmentState *>( this );\n    }\n\n    operator VkPipelineColorBlendAttachmentState &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineColorBlendAttachmentState *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::BlendFactor const &,\n               VULKAN_HPP_NAMESPACE::BlendFactor const &,\n               VULKAN_HPP_NAMESPACE::BlendOp const &,\n               VULKAN_HPP_NAMESPACE::BlendFactor const &,\n               VULKAN_HPP_NAMESPACE::BlendFactor const &,\n               VULKAN_HPP_NAMESPACE::BlendOp const &,\n               VULKAN_HPP_NAMESPACE::ColorComponentFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie(\n        blendEnable, srcColorBlendFactor, dstColorBlendFactor, colorBlendOp, srcAlphaBlendFactor, dstAlphaBlendFactor, alphaBlendOp, colorWriteMask );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineColorBlendAttachmentState const & ) const = default;\n#else\n    bool operator==( PipelineColorBlendAttachmentState const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( blendEnable == rhs.blendEnable ) && ( srcColorBlendFactor == rhs.srcColorBlendFactor ) && ( dstColorBlendFactor == rhs.dstColorBlendFactor ) &&\n             ( colorBlendOp == rhs.colorBlendOp ) && ( srcAlphaBlendFactor == rhs.srcAlphaBlendFactor ) && ( dstAlphaBlendFactor == rhs.dstAlphaBlendFactor ) &&\n             ( alphaBlendOp == rhs.alphaBlendOp ) && ( colorWriteMask == rhs.colorWriteMask );\n#  endif\n    }\n\n    bool operator!=( PipelineColorBlendAttachmentState const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::Bool32              blendEnable         = {};\n    VULKAN_HPP_NAMESPACE::BlendFactor         srcColorBlendFactor = VULKAN_HPP_NAMESPACE::BlendFactor::eZero;\n    VULKAN_HPP_NAMESPACE::BlendFactor         dstColorBlendFactor = VULKAN_HPP_NAMESPACE::BlendFactor::eZero;\n    VULKAN_HPP_NAMESPACE::BlendOp             colorBlendOp        = VULKAN_HPP_NAMESPACE::BlendOp::eAdd;\n    VULKAN_HPP_NAMESPACE::BlendFactor         srcAlphaBlendFactor = VULKAN_HPP_NAMESPACE::BlendFactor::eZero;\n    VULKAN_HPP_NAMESPACE::BlendFactor         dstAlphaBlendFactor = VULKAN_HPP_NAMESPACE::BlendFactor::eZero;\n    VULKAN_HPP_NAMESPACE::BlendOp             alphaBlendOp        = VULKAN_HPP_NAMESPACE::BlendOp::eAdd;\n    VULKAN_HPP_NAMESPACE::ColorComponentFlags colorWriteMask      = {};\n  };\n\n  struct PipelineColorBlendStateCreateInfo\n  {\n    using NativeType = VkPipelineColorBlendStateCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineColorBlendStateCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorBlendStateCreateInfo( VULKAN_HPP_NAMESPACE::PipelineColorBlendStateCreateFlags flags_         = {},\n                                                               VULKAN_HPP_NAMESPACE::Bool32                             logicOpEnable_ = {},\n                                                               VULKAN_HPP_NAMESPACE::LogicOp logicOp_         = VULKAN_HPP_NAMESPACE::LogicOp::eClear,\n                                                               uint32_t                      attachmentCount_ = {},\n                                                               const VULKAN_HPP_NAMESPACE::PipelineColorBlendAttachmentState * pAttachments_   = {},\n                                                               std::array<float, 4> const &                                    blendConstants_ = {},\n                                                               const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , logicOpEnable{ logicOpEnable_ }\n      , logicOp{ logicOp_ }\n      , attachmentCount{ attachmentCount_ }\n      , pAttachments{ pAttachments_ }\n      , blendConstants{ blendConstants_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorBlendStateCreateInfo( PipelineColorBlendStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineColorBlendStateCreateInfo( VkPipelineColorBlendStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineColorBlendStateCreateInfo( *reinterpret_cast<PipelineColorBlendStateCreateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineColorBlendStateCreateInfo(\n      VULKAN_HPP_NAMESPACE::PipelineColorBlendStateCreateFlags                                                             flags_,\n      VULKAN_HPP_NAMESPACE::Bool32                                                                                         logicOpEnable_,\n      VULKAN_HPP_NAMESPACE::LogicOp                                                                                        logicOp_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineColorBlendAttachmentState> const & attachments_,\n      std::array<float, 4> const &                                                                                         blendConstants_ = {},\n      const void *                                                                                                         pNext_          = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , logicOpEnable( logicOpEnable_ )\n      , logicOp( logicOp_ )\n      , attachmentCount( static_cast<uint32_t>( attachments_.size() ) )\n      , pAttachments( attachments_.data() )\n      , blendConstants( blendConstants_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PipelineColorBlendStateCreateInfo & operator=( PipelineColorBlendStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineColorBlendStateCreateInfo & operator=( VkPipelineColorBlendStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineColorBlendStateCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorBlendStateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorBlendStateCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::PipelineColorBlendStateCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorBlendStateCreateInfo & setLogicOpEnable( VULKAN_HPP_NAMESPACE::Bool32 logicOpEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      logicOpEnable = logicOpEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorBlendStateCreateInfo & setLogicOp( VULKAN_HPP_NAMESPACE::LogicOp logicOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      logicOp = logicOp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorBlendStateCreateInfo & setAttachmentCount( uint32_t attachmentCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      attachmentCount = attachmentCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorBlendStateCreateInfo &\n      setPAttachments( const VULKAN_HPP_NAMESPACE::PipelineColorBlendAttachmentState * pAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pAttachments = pAttachments_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineColorBlendStateCreateInfo & setAttachments(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineColorBlendAttachmentState> const & attachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      attachmentCount = static_cast<uint32_t>( attachments_.size() );\n      pAttachments    = attachments_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorBlendStateCreateInfo & setBlendConstants( std::array<float, 4> blendConstants_ ) VULKAN_HPP_NOEXCEPT\n    {\n      blendConstants = blendConstants_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineColorBlendStateCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineColorBlendStateCreateInfo *>( this );\n    }\n\n    operator VkPipelineColorBlendStateCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineColorBlendStateCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineColorBlendStateCreateFlags const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::LogicOp const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::PipelineColorBlendAttachmentState * const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<float, 4> const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, logicOpEnable, logicOp, attachmentCount, pAttachments, blendConstants );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineColorBlendStateCreateInfo const & ) const = default;\n#else\n    bool operator==( PipelineColorBlendStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( logicOpEnable == rhs.logicOpEnable ) &&\n             ( logicOp == rhs.logicOp ) && ( attachmentCount == rhs.attachmentCount ) && ( pAttachments == rhs.pAttachments ) &&\n             ( blendConstants == rhs.blendConstants );\n#  endif\n    }\n\n    bool operator!=( PipelineColorBlendStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                             sType           = StructureType::ePipelineColorBlendStateCreateInfo;\n    const void *                                                    pNext           = {};\n    VULKAN_HPP_NAMESPACE::PipelineColorBlendStateCreateFlags        flags           = {};\n    VULKAN_HPP_NAMESPACE::Bool32                                    logicOpEnable   = {};\n    VULKAN_HPP_NAMESPACE::LogicOp                                   logicOp         = VULKAN_HPP_NAMESPACE::LogicOp::eClear;\n    uint32_t                                                        attachmentCount = {};\n    const VULKAN_HPP_NAMESPACE::PipelineColorBlendAttachmentState * pAttachments    = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<float, 4>                  blendConstants  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineColorBlendStateCreateInfo>\n  {\n    using Type = PipelineColorBlendStateCreateInfo;\n  };\n\n  struct PipelineDynamicStateCreateInfo\n  {\n    using NativeType = VkPipelineDynamicStateCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineDynamicStateCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineDynamicStateCreateInfo( VULKAN_HPP_NAMESPACE::PipelineDynamicStateCreateFlags flags_             = {},\n                                                         uint32_t                                              dynamicStateCount_ = {},\n                                                         const VULKAN_HPP_NAMESPACE::DynamicState *            pDynamicStates_    = {},\n                                                         const void *                                          pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , dynamicStateCount{ dynamicStateCount_ }\n      , pDynamicStates{ pDynamicStates_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineDynamicStateCreateInfo( PipelineDynamicStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineDynamicStateCreateInfo( VkPipelineDynamicStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineDynamicStateCreateInfo( *reinterpret_cast<PipelineDynamicStateCreateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineDynamicStateCreateInfo( VULKAN_HPP_NAMESPACE::PipelineDynamicStateCreateFlags                                           flags_,\n                                    VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DynamicState> const & dynamicStates_,\n                                    const void *                                                                                    pNext_ = nullptr )\n      : pNext( pNext_ ), flags( flags_ ), dynamicStateCount( static_cast<uint32_t>( dynamicStates_.size() ) ), pDynamicStates( dynamicStates_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PipelineDynamicStateCreateInfo & operator=( PipelineDynamicStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineDynamicStateCreateInfo & operator=( VkPipelineDynamicStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineDynamicStateCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineDynamicStateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineDynamicStateCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::PipelineDynamicStateCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineDynamicStateCreateInfo & setDynamicStateCount( uint32_t dynamicStateCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dynamicStateCount = dynamicStateCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineDynamicStateCreateInfo & setPDynamicStates( const VULKAN_HPP_NAMESPACE::DynamicState * pDynamicStates_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDynamicStates = pDynamicStates_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineDynamicStateCreateInfo &\n      setDynamicStates( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DynamicState> const & dynamicStates_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dynamicStateCount = static_cast<uint32_t>( dynamicStates_.size() );\n      pDynamicStates    = dynamicStates_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineDynamicStateCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineDynamicStateCreateInfo *>( this );\n    }\n\n    operator VkPipelineDynamicStateCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineDynamicStateCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineDynamicStateCreateFlags const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::DynamicState * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, dynamicStateCount, pDynamicStates );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineDynamicStateCreateInfo const & ) const = default;\n#else\n    bool operator==( PipelineDynamicStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( dynamicStateCount == rhs.dynamicStateCount ) &&\n             ( pDynamicStates == rhs.pDynamicStates );\n#  endif\n    }\n\n    bool operator!=( PipelineDynamicStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                   sType             = StructureType::ePipelineDynamicStateCreateInfo;\n    const void *                                          pNext             = {};\n    VULKAN_HPP_NAMESPACE::PipelineDynamicStateCreateFlags flags             = {};\n    uint32_t                                              dynamicStateCount = {};\n    const VULKAN_HPP_NAMESPACE::DynamicState *            pDynamicStates    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineDynamicStateCreateInfo>\n  {\n    using Type = PipelineDynamicStateCreateInfo;\n  };\n\n  struct GraphicsPipelineCreateInfo\n  {\n    using NativeType = VkGraphicsPipelineCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eGraphicsPipelineCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineCreateInfo( VULKAN_HPP_NAMESPACE::PipelineCreateFlags                          flags_               = {},\n                                                        uint32_t                                                           stageCount_          = {},\n                                                        const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo *        pStages_             = {},\n                                                        const VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateInfo *   pVertexInputState_   = {},\n                                                        const VULKAN_HPP_NAMESPACE::PipelineInputAssemblyStateCreateInfo * pInputAssemblyState_ = {},\n                                                        const VULKAN_HPP_NAMESPACE::PipelineTessellationStateCreateInfo *  pTessellationState_  = {},\n                                                        const VULKAN_HPP_NAMESPACE::PipelineViewportStateCreateInfo *      pViewportState_      = {},\n                                                        const VULKAN_HPP_NAMESPACE::PipelineRasterizationStateCreateInfo * pRasterizationState_ = {},\n                                                        const VULKAN_HPP_NAMESPACE::PipelineMultisampleStateCreateInfo *   pMultisampleState_   = {},\n                                                        const VULKAN_HPP_NAMESPACE::PipelineDepthStencilStateCreateInfo *  pDepthStencilState_  = {},\n                                                        const VULKAN_HPP_NAMESPACE::PipelineColorBlendStateCreateInfo *    pColorBlendState_    = {},\n                                                        const VULKAN_HPP_NAMESPACE::PipelineDynamicStateCreateInfo *       pDynamicState_       = {},\n                                                        VULKAN_HPP_NAMESPACE::PipelineLayout                               layout_              = {},\n                                                        VULKAN_HPP_NAMESPACE::RenderPass                                   renderPass_          = {},\n                                                        uint32_t                                                           subpass_             = {},\n                                                        VULKAN_HPP_NAMESPACE::Pipeline                                     basePipelineHandle_  = {},\n                                                        int32_t                                                            basePipelineIndex_   = {},\n                                                        const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , stageCount{ stageCount_ }\n      , pStages{ pStages_ }\n      , pVertexInputState{ pVertexInputState_ }\n      , pInputAssemblyState{ pInputAssemblyState_ }\n      , pTessellationState{ pTessellationState_ }\n      , pViewportState{ pViewportState_ }\n      , pRasterizationState{ pRasterizationState_ }\n      , pMultisampleState{ pMultisampleState_ }\n      , pDepthStencilState{ pDepthStencilState_ }\n      , pColorBlendState{ pColorBlendState_ }\n      , pDynamicState{ pDynamicState_ }\n      , layout{ layout_ }\n      , renderPass{ renderPass_ }\n      , subpass{ subpass_ }\n      , basePipelineHandle{ basePipelineHandle_ }\n      , basePipelineIndex{ basePipelineIndex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineCreateInfo( GraphicsPipelineCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    GraphicsPipelineCreateInfo( VkGraphicsPipelineCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : GraphicsPipelineCreateInfo( *reinterpret_cast<GraphicsPipelineCreateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    GraphicsPipelineCreateInfo( VULKAN_HPP_NAMESPACE::PipelineCreateFlags                                                                        flags_,\n                                VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo> const & stages_,\n                                const VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateInfo *   pVertexInputState_   = {},\n                                const VULKAN_HPP_NAMESPACE::PipelineInputAssemblyStateCreateInfo * pInputAssemblyState_ = {},\n                                const VULKAN_HPP_NAMESPACE::PipelineTessellationStateCreateInfo *  pTessellationState_  = {},\n                                const VULKAN_HPP_NAMESPACE::PipelineViewportStateCreateInfo *      pViewportState_      = {},\n                                const VULKAN_HPP_NAMESPACE::PipelineRasterizationStateCreateInfo * pRasterizationState_ = {},\n                                const VULKAN_HPP_NAMESPACE::PipelineMultisampleStateCreateInfo *   pMultisampleState_   = {},\n                                const VULKAN_HPP_NAMESPACE::PipelineDepthStencilStateCreateInfo *  pDepthStencilState_  = {},\n                                const VULKAN_HPP_NAMESPACE::PipelineColorBlendStateCreateInfo *    pColorBlendState_    = {},\n                                const VULKAN_HPP_NAMESPACE::PipelineDynamicStateCreateInfo *       pDynamicState_       = {},\n                                VULKAN_HPP_NAMESPACE::PipelineLayout                               layout_              = {},\n                                VULKAN_HPP_NAMESPACE::RenderPass                                   renderPass_          = {},\n                                uint32_t                                                           subpass_             = {},\n                                VULKAN_HPP_NAMESPACE::Pipeline                                     basePipelineHandle_  = {},\n                                int32_t                                                            basePipelineIndex_   = {},\n                                const void *                                                       pNext_               = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , stageCount( static_cast<uint32_t>( stages_.size() ) )\n      , pStages( stages_.data() )\n      , pVertexInputState( pVertexInputState_ )\n      , pInputAssemblyState( pInputAssemblyState_ )\n      , pTessellationState( pTessellationState_ )\n      , pViewportState( pViewportState_ )\n      , pRasterizationState( pRasterizationState_ )\n      , pMultisampleState( pMultisampleState_ )\n      , pDepthStencilState( pDepthStencilState_ )\n      , pColorBlendState( pColorBlendState_ )\n      , pDynamicState( pDynamicState_ )\n      , layout( layout_ )\n      , renderPass( renderPass_ )\n      , subpass( subpass_ )\n      , basePipelineHandle( basePipelineHandle_ )\n      , basePipelineIndex( basePipelineIndex_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    GraphicsPipelineCreateInfo & operator=( GraphicsPipelineCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    GraphicsPipelineCreateInfo & operator=( VkGraphicsPipelineCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::PipelineCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineCreateInfo & setStageCount( uint32_t stageCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stageCount = stageCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineCreateInfo & setPStages( const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo * pStages_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStages = pStages_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    GraphicsPipelineCreateInfo &\n      setStages( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo> const & stages_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stageCount = static_cast<uint32_t>( stages_.size() );\n      pStages    = stages_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineCreateInfo &\n      setPVertexInputState( const VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateInfo * pVertexInputState_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pVertexInputState = pVertexInputState_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineCreateInfo &\n      setPInputAssemblyState( const VULKAN_HPP_NAMESPACE::PipelineInputAssemblyStateCreateInfo * pInputAssemblyState_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pInputAssemblyState = pInputAssemblyState_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineCreateInfo &\n      setPTessellationState( const VULKAN_HPP_NAMESPACE::PipelineTessellationStateCreateInfo * pTessellationState_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pTessellationState = pTessellationState_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineCreateInfo &\n      setPViewportState( const VULKAN_HPP_NAMESPACE::PipelineViewportStateCreateInfo * pViewportState_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pViewportState = pViewportState_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineCreateInfo &\n      setPRasterizationState( const VULKAN_HPP_NAMESPACE::PipelineRasterizationStateCreateInfo * pRasterizationState_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pRasterizationState = pRasterizationState_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineCreateInfo &\n      setPMultisampleState( const VULKAN_HPP_NAMESPACE::PipelineMultisampleStateCreateInfo * pMultisampleState_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pMultisampleState = pMultisampleState_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineCreateInfo &\n      setPDepthStencilState( const VULKAN_HPP_NAMESPACE::PipelineDepthStencilStateCreateInfo * pDepthStencilState_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDepthStencilState = pDepthStencilState_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineCreateInfo &\n      setPColorBlendState( const VULKAN_HPP_NAMESPACE::PipelineColorBlendStateCreateInfo * pColorBlendState_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pColorBlendState = pColorBlendState_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineCreateInfo &\n      setPDynamicState( const VULKAN_HPP_NAMESPACE::PipelineDynamicStateCreateInfo * pDynamicState_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDynamicState = pDynamicState_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineCreateInfo & setLayout( VULKAN_HPP_NAMESPACE::PipelineLayout layout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layout = layout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineCreateInfo & setRenderPass( VULKAN_HPP_NAMESPACE::RenderPass renderPass_ ) VULKAN_HPP_NOEXCEPT\n    {\n      renderPass = renderPass_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineCreateInfo & setSubpass( uint32_t subpass_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subpass = subpass_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineCreateInfo & setBasePipelineHandle( VULKAN_HPP_NAMESPACE::Pipeline basePipelineHandle_ ) VULKAN_HPP_NOEXCEPT\n    {\n      basePipelineHandle = basePipelineHandle_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineCreateInfo & setBasePipelineIndex( int32_t basePipelineIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      basePipelineIndex = basePipelineIndex_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkGraphicsPipelineCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkGraphicsPipelineCreateInfo *>( this );\n    }\n\n    operator VkGraphicsPipelineCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkGraphicsPipelineCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineCreateFlags const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo * const &,\n               const VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateInfo * const &,\n               const VULKAN_HPP_NAMESPACE::PipelineInputAssemblyStateCreateInfo * const &,\n               const VULKAN_HPP_NAMESPACE::PipelineTessellationStateCreateInfo * const &,\n               const VULKAN_HPP_NAMESPACE::PipelineViewportStateCreateInfo * const &,\n               const VULKAN_HPP_NAMESPACE::PipelineRasterizationStateCreateInfo * const &,\n               const VULKAN_HPP_NAMESPACE::PipelineMultisampleStateCreateInfo * const &,\n               const VULKAN_HPP_NAMESPACE::PipelineDepthStencilStateCreateInfo * const &,\n               const VULKAN_HPP_NAMESPACE::PipelineColorBlendStateCreateInfo * const &,\n               const VULKAN_HPP_NAMESPACE::PipelineDynamicStateCreateInfo * const &,\n               VULKAN_HPP_NAMESPACE::PipelineLayout const &,\n               VULKAN_HPP_NAMESPACE::RenderPass const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Pipeline const &,\n               int32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       flags,\n                       stageCount,\n                       pStages,\n                       pVertexInputState,\n                       pInputAssemblyState,\n                       pTessellationState,\n                       pViewportState,\n                       pRasterizationState,\n                       pMultisampleState,\n                       pDepthStencilState,\n                       pColorBlendState,\n                       pDynamicState,\n                       layout,\n                       renderPass,\n                       subpass,\n                       basePipelineHandle,\n                       basePipelineIndex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( GraphicsPipelineCreateInfo const & ) const = default;\n#else\n    bool operator==( GraphicsPipelineCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( stageCount == rhs.stageCount ) && ( pStages == rhs.pStages ) &&\n             ( pVertexInputState == rhs.pVertexInputState ) && ( pInputAssemblyState == rhs.pInputAssemblyState ) &&\n             ( pTessellationState == rhs.pTessellationState ) && ( pViewportState == rhs.pViewportState ) &&\n             ( pRasterizationState == rhs.pRasterizationState ) && ( pMultisampleState == rhs.pMultisampleState ) &&\n             ( pDepthStencilState == rhs.pDepthStencilState ) && ( pColorBlendState == rhs.pColorBlendState ) && ( pDynamicState == rhs.pDynamicState ) &&\n             ( layout == rhs.layout ) && ( renderPass == rhs.renderPass ) && ( subpass == rhs.subpass ) && ( basePipelineHandle == rhs.basePipelineHandle ) &&\n             ( basePipelineIndex == rhs.basePipelineIndex );\n#  endif\n    }\n\n    bool operator!=( GraphicsPipelineCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                sType               = StructureType::eGraphicsPipelineCreateInfo;\n    const void *                                                       pNext               = {};\n    VULKAN_HPP_NAMESPACE::PipelineCreateFlags                          flags               = {};\n    uint32_t                                                           stageCount          = {};\n    const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo *        pStages             = {};\n    const VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateInfo *   pVertexInputState   = {};\n    const VULKAN_HPP_NAMESPACE::PipelineInputAssemblyStateCreateInfo * pInputAssemblyState = {};\n    const VULKAN_HPP_NAMESPACE::PipelineTessellationStateCreateInfo *  pTessellationState  = {};\n    const VULKAN_HPP_NAMESPACE::PipelineViewportStateCreateInfo *      pViewportState      = {};\n    const VULKAN_HPP_NAMESPACE::PipelineRasterizationStateCreateInfo * pRasterizationState = {};\n    const VULKAN_HPP_NAMESPACE::PipelineMultisampleStateCreateInfo *   pMultisampleState   = {};\n    const VULKAN_HPP_NAMESPACE::PipelineDepthStencilStateCreateInfo *  pDepthStencilState  = {};\n    const VULKAN_HPP_NAMESPACE::PipelineColorBlendStateCreateInfo *    pColorBlendState    = {};\n    const VULKAN_HPP_NAMESPACE::PipelineDynamicStateCreateInfo *       pDynamicState       = {};\n    VULKAN_HPP_NAMESPACE::PipelineLayout                               layout              = {};\n    VULKAN_HPP_NAMESPACE::RenderPass                                   renderPass          = {};\n    uint32_t                                                           subpass             = {};\n    VULKAN_HPP_NAMESPACE::Pipeline                                     basePipelineHandle  = {};\n    int32_t                                                            basePipelineIndex   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eGraphicsPipelineCreateInfo>\n  {\n    using Type = GraphicsPipelineCreateInfo;\n  };\n\n  struct GraphicsPipelineLibraryCreateInfoEXT\n  {\n    using NativeType = VkGraphicsPipelineLibraryCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eGraphicsPipelineLibraryCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR GraphicsPipelineLibraryCreateInfoEXT( VULKAN_HPP_NAMESPACE::GraphicsPipelineLibraryFlagsEXT flags_ = {},\n                                                               const void *                                          pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR GraphicsPipelineLibraryCreateInfoEXT( GraphicsPipelineLibraryCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    GraphicsPipelineLibraryCreateInfoEXT( VkGraphicsPipelineLibraryCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : GraphicsPipelineLibraryCreateInfoEXT( *reinterpret_cast<GraphicsPipelineLibraryCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    GraphicsPipelineLibraryCreateInfoEXT & operator=( GraphicsPipelineLibraryCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    GraphicsPipelineLibraryCreateInfoEXT & operator=( VkGraphicsPipelineLibraryCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::GraphicsPipelineLibraryCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineLibraryCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineLibraryCreateInfoEXT & setFlags( VULKAN_HPP_NAMESPACE::GraphicsPipelineLibraryFlagsEXT flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkGraphicsPipelineLibraryCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkGraphicsPipelineLibraryCreateInfoEXT *>( this );\n    }\n\n    operator VkGraphicsPipelineLibraryCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkGraphicsPipelineLibraryCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::GraphicsPipelineLibraryFlagsEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( GraphicsPipelineLibraryCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( GraphicsPipelineLibraryCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags );\n#  endif\n    }\n\n    bool operator!=( GraphicsPipelineLibraryCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                   sType = StructureType::eGraphicsPipelineLibraryCreateInfoEXT;\n    const void *                                          pNext = {};\n    VULKAN_HPP_NAMESPACE::GraphicsPipelineLibraryFlagsEXT flags = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eGraphicsPipelineLibraryCreateInfoEXT>\n  {\n    using Type = GraphicsPipelineLibraryCreateInfoEXT;\n  };\n\n  struct GraphicsShaderGroupCreateInfoNV\n  {\n    using NativeType = VkGraphicsShaderGroupCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eGraphicsShaderGroupCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR GraphicsShaderGroupCreateInfoNV( uint32_t                                                          stageCount_         = {},\n                                                          const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo *       pStages_            = {},\n                                                          const VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateInfo *  pVertexInputState_  = {},\n                                                          const VULKAN_HPP_NAMESPACE::PipelineTessellationStateCreateInfo * pTessellationState_ = {},\n                                                          const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stageCount{ stageCount_ }\n      , pStages{ pStages_ }\n      , pVertexInputState{ pVertexInputState_ }\n      , pTessellationState{ pTessellationState_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR GraphicsShaderGroupCreateInfoNV( GraphicsShaderGroupCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    GraphicsShaderGroupCreateInfoNV( VkGraphicsShaderGroupCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : GraphicsShaderGroupCreateInfoNV( *reinterpret_cast<GraphicsShaderGroupCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    GraphicsShaderGroupCreateInfoNV( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo> const & stages_,\n                                     const VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateInfo *  pVertexInputState_  = {},\n                                     const VULKAN_HPP_NAMESPACE::PipelineTessellationStateCreateInfo * pTessellationState_ = {},\n                                     const void *                                                      pNext_              = nullptr )\n      : pNext( pNext_ )\n      , stageCount( static_cast<uint32_t>( stages_.size() ) )\n      , pStages( stages_.data() )\n      , pVertexInputState( pVertexInputState_ )\n      , pTessellationState( pTessellationState_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    GraphicsShaderGroupCreateInfoNV & operator=( GraphicsShaderGroupCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    GraphicsShaderGroupCreateInfoNV & operator=( VkGraphicsShaderGroupCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::GraphicsShaderGroupCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 GraphicsShaderGroupCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsShaderGroupCreateInfoNV & setStageCount( uint32_t stageCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stageCount = stageCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsShaderGroupCreateInfoNV &\n      setPStages( const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo * pStages_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStages = pStages_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    GraphicsShaderGroupCreateInfoNV &\n      setStages( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo> const & stages_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stageCount = static_cast<uint32_t>( stages_.size() );\n      pStages    = stages_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsShaderGroupCreateInfoNV &\n      setPVertexInputState( const VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateInfo * pVertexInputState_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pVertexInputState = pVertexInputState_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsShaderGroupCreateInfoNV &\n      setPTessellationState( const VULKAN_HPP_NAMESPACE::PipelineTessellationStateCreateInfo * pTessellationState_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pTessellationState = pTessellationState_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkGraphicsShaderGroupCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkGraphicsShaderGroupCreateInfoNV *>( this );\n    }\n\n    operator VkGraphicsShaderGroupCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkGraphicsShaderGroupCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo * const &,\n               const VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateInfo * const &,\n               const VULKAN_HPP_NAMESPACE::PipelineTessellationStateCreateInfo * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stageCount, pStages, pVertexInputState, pTessellationState );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( GraphicsShaderGroupCreateInfoNV const & ) const = default;\n#else\n    bool operator==( GraphicsShaderGroupCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( stageCount == rhs.stageCount ) && ( pStages == rhs.pStages ) &&\n             ( pVertexInputState == rhs.pVertexInputState ) && ( pTessellationState == rhs.pTessellationState );\n#  endif\n    }\n\n    bool operator!=( GraphicsShaderGroupCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                               sType              = StructureType::eGraphicsShaderGroupCreateInfoNV;\n    const void *                                                      pNext              = {};\n    uint32_t                                                          stageCount         = {};\n    const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo *       pStages            = {};\n    const VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateInfo *  pVertexInputState  = {};\n    const VULKAN_HPP_NAMESPACE::PipelineTessellationStateCreateInfo * pTessellationState = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eGraphicsShaderGroupCreateInfoNV>\n  {\n    using Type = GraphicsShaderGroupCreateInfoNV;\n  };\n\n  struct GraphicsPipelineShaderGroupsCreateInfoNV\n  {\n    using NativeType = VkGraphicsPipelineShaderGroupsCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eGraphicsPipelineShaderGroupsCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR GraphicsPipelineShaderGroupsCreateInfoNV( uint32_t                                                      groupCount_    = {},\n                                                                   const VULKAN_HPP_NAMESPACE::GraphicsShaderGroupCreateInfoNV * pGroups_       = {},\n                                                                   uint32_t                                                      pipelineCount_ = {},\n                                                                   const VULKAN_HPP_NAMESPACE::Pipeline *                        pPipelines_    = {},\n                                                                   const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , groupCount{ groupCount_ }\n      , pGroups{ pGroups_ }\n      , pipelineCount{ pipelineCount_ }\n      , pPipelines{ pPipelines_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR GraphicsPipelineShaderGroupsCreateInfoNV( GraphicsPipelineShaderGroupsCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    GraphicsPipelineShaderGroupsCreateInfoNV( VkGraphicsPipelineShaderGroupsCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : GraphicsPipelineShaderGroupsCreateInfoNV( *reinterpret_cast<GraphicsPipelineShaderGroupsCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    GraphicsPipelineShaderGroupsCreateInfoNV(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::GraphicsShaderGroupCreateInfoNV> const & groups_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Pipeline> const &                        pipelines_ = {},\n      const void *                                                                                                       pNext_     = nullptr )\n      : pNext( pNext_ )\n      , groupCount( static_cast<uint32_t>( groups_.size() ) )\n      , pGroups( groups_.data() )\n      , pipelineCount( static_cast<uint32_t>( pipelines_.size() ) )\n      , pPipelines( pipelines_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    GraphicsPipelineShaderGroupsCreateInfoNV & operator=( GraphicsPipelineShaderGroupsCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    GraphicsPipelineShaderGroupsCreateInfoNV & operator=( VkGraphicsPipelineShaderGroupsCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::GraphicsPipelineShaderGroupsCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineShaderGroupsCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineShaderGroupsCreateInfoNV & setGroupCount( uint32_t groupCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      groupCount = groupCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineShaderGroupsCreateInfoNV &\n      setPGroups( const VULKAN_HPP_NAMESPACE::GraphicsShaderGroupCreateInfoNV * pGroups_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pGroups = pGroups_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    GraphicsPipelineShaderGroupsCreateInfoNV & setGroups(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::GraphicsShaderGroupCreateInfoNV> const & groups_ ) VULKAN_HPP_NOEXCEPT\n    {\n      groupCount = static_cast<uint32_t>( groups_.size() );\n      pGroups    = groups_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineShaderGroupsCreateInfoNV & setPipelineCount( uint32_t pipelineCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineCount = pipelineCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 GraphicsPipelineShaderGroupsCreateInfoNV & setPPipelines( const VULKAN_HPP_NAMESPACE::Pipeline * pPipelines_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPipelines = pPipelines_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    GraphicsPipelineShaderGroupsCreateInfoNV &\n      setPipelines( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Pipeline> const & pipelines_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineCount = static_cast<uint32_t>( pipelines_.size() );\n      pPipelines    = pipelines_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkGraphicsPipelineShaderGroupsCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkGraphicsPipelineShaderGroupsCreateInfoNV *>( this );\n    }\n\n    operator VkGraphicsPipelineShaderGroupsCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkGraphicsPipelineShaderGroupsCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::GraphicsShaderGroupCreateInfoNV * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::Pipeline * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, groupCount, pGroups, pipelineCount, pPipelines );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( GraphicsPipelineShaderGroupsCreateInfoNV const & ) const = default;\n#else\n    bool operator==( GraphicsPipelineShaderGroupsCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( groupCount == rhs.groupCount ) && ( pGroups == rhs.pGroups ) &&\n             ( pipelineCount == rhs.pipelineCount ) && ( pPipelines == rhs.pPipelines );\n#  endif\n    }\n\n    bool operator!=( GraphicsPipelineShaderGroupsCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                           sType         = StructureType::eGraphicsPipelineShaderGroupsCreateInfoNV;\n    const void *                                                  pNext         = {};\n    uint32_t                                                      groupCount    = {};\n    const VULKAN_HPP_NAMESPACE::GraphicsShaderGroupCreateInfoNV * pGroups       = {};\n    uint32_t                                                      pipelineCount = {};\n    const VULKAN_HPP_NAMESPACE::Pipeline *                        pPipelines    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eGraphicsPipelineShaderGroupsCreateInfoNV>\n  {\n    using Type = GraphicsPipelineShaderGroupsCreateInfoNV;\n  };\n\n  struct XYColorEXT\n  {\n    using NativeType = VkXYColorEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR XYColorEXT( float x_ = {}, float y_ = {} ) VULKAN_HPP_NOEXCEPT\n      : x{ x_ }\n      , y{ y_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR XYColorEXT( XYColorEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    XYColorEXT( VkXYColorEXT const & rhs ) VULKAN_HPP_NOEXCEPT : XYColorEXT( *reinterpret_cast<XYColorEXT const *>( &rhs ) ) {}\n\n    XYColorEXT & operator=( XYColorEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    XYColorEXT & operator=( VkXYColorEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::XYColorEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 XYColorEXT & setX( float x_ ) VULKAN_HPP_NOEXCEPT\n    {\n      x = x_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 XYColorEXT & setY( float y_ ) VULKAN_HPP_NOEXCEPT\n    {\n      y = y_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkXYColorEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkXYColorEXT *>( this );\n    }\n\n    operator VkXYColorEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkXYColorEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<float const &, float const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( x, y );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( XYColorEXT const & ) const = default;\n#else\n    bool operator==( XYColorEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( x == rhs.x ) && ( y == rhs.y );\n#  endif\n    }\n\n    bool operator!=( XYColorEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    float x = {};\n    float y = {};\n  };\n\n  struct HdrMetadataEXT\n  {\n    using NativeType = VkHdrMetadataEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eHdrMetadataEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR HdrMetadataEXT( VULKAN_HPP_NAMESPACE::XYColorEXT displayPrimaryRed_         = {},\n                                         VULKAN_HPP_NAMESPACE::XYColorEXT displayPrimaryGreen_       = {},\n                                         VULKAN_HPP_NAMESPACE::XYColorEXT displayPrimaryBlue_        = {},\n                                         VULKAN_HPP_NAMESPACE::XYColorEXT whitePoint_                = {},\n                                         float                            maxLuminance_              = {},\n                                         float                            minLuminance_              = {},\n                                         float                            maxContentLightLevel_      = {},\n                                         float                            maxFrameAverageLightLevel_ = {},\n                                         const void *                     pNext_                     = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , displayPrimaryRed{ displayPrimaryRed_ }\n      , displayPrimaryGreen{ displayPrimaryGreen_ }\n      , displayPrimaryBlue{ displayPrimaryBlue_ }\n      , whitePoint{ whitePoint_ }\n      , maxLuminance{ maxLuminance_ }\n      , minLuminance{ minLuminance_ }\n      , maxContentLightLevel{ maxContentLightLevel_ }\n      , maxFrameAverageLightLevel{ maxFrameAverageLightLevel_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR HdrMetadataEXT( HdrMetadataEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    HdrMetadataEXT( VkHdrMetadataEXT const & rhs ) VULKAN_HPP_NOEXCEPT : HdrMetadataEXT( *reinterpret_cast<HdrMetadataEXT const *>( &rhs ) ) {}\n\n    HdrMetadataEXT & operator=( HdrMetadataEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    HdrMetadataEXT & operator=( VkHdrMetadataEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::HdrMetadataEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 HdrMetadataEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 HdrMetadataEXT & setDisplayPrimaryRed( VULKAN_HPP_NAMESPACE::XYColorEXT const & displayPrimaryRed_ ) VULKAN_HPP_NOEXCEPT\n    {\n      displayPrimaryRed = displayPrimaryRed_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 HdrMetadataEXT & setDisplayPrimaryGreen( VULKAN_HPP_NAMESPACE::XYColorEXT const & displayPrimaryGreen_ ) VULKAN_HPP_NOEXCEPT\n    {\n      displayPrimaryGreen = displayPrimaryGreen_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 HdrMetadataEXT & setDisplayPrimaryBlue( VULKAN_HPP_NAMESPACE::XYColorEXT const & displayPrimaryBlue_ ) VULKAN_HPP_NOEXCEPT\n    {\n      displayPrimaryBlue = displayPrimaryBlue_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 HdrMetadataEXT & setWhitePoint( VULKAN_HPP_NAMESPACE::XYColorEXT const & whitePoint_ ) VULKAN_HPP_NOEXCEPT\n    {\n      whitePoint = whitePoint_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 HdrMetadataEXT & setMaxLuminance( float maxLuminance_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxLuminance = maxLuminance_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 HdrMetadataEXT & setMinLuminance( float minLuminance_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minLuminance = minLuminance_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 HdrMetadataEXT & setMaxContentLightLevel( float maxContentLightLevel_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxContentLightLevel = maxContentLightLevel_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 HdrMetadataEXT & setMaxFrameAverageLightLevel( float maxFrameAverageLightLevel_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxFrameAverageLightLevel = maxFrameAverageLightLevel_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkHdrMetadataEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkHdrMetadataEXT *>( this );\n    }\n\n    operator VkHdrMetadataEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkHdrMetadataEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::XYColorEXT const &,\n               VULKAN_HPP_NAMESPACE::XYColorEXT const &,\n               VULKAN_HPP_NAMESPACE::XYColorEXT const &,\n               VULKAN_HPP_NAMESPACE::XYColorEXT const &,\n               float const &,\n               float const &,\n               float const &,\n               float const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       displayPrimaryRed,\n                       displayPrimaryGreen,\n                       displayPrimaryBlue,\n                       whitePoint,\n                       maxLuminance,\n                       minLuminance,\n                       maxContentLightLevel,\n                       maxFrameAverageLightLevel );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( HdrMetadataEXT const & ) const = default;\n#else\n    bool operator==( HdrMetadataEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( displayPrimaryRed == rhs.displayPrimaryRed ) &&\n             ( displayPrimaryGreen == rhs.displayPrimaryGreen ) && ( displayPrimaryBlue == rhs.displayPrimaryBlue ) && ( whitePoint == rhs.whitePoint ) &&\n             ( maxLuminance == rhs.maxLuminance ) && ( minLuminance == rhs.minLuminance ) && ( maxContentLightLevel == rhs.maxContentLightLevel ) &&\n             ( maxFrameAverageLightLevel == rhs.maxFrameAverageLightLevel );\n#  endif\n    }\n\n    bool operator!=( HdrMetadataEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                     = StructureType::eHdrMetadataEXT;\n    const void *                        pNext                     = {};\n    VULKAN_HPP_NAMESPACE::XYColorEXT    displayPrimaryRed         = {};\n    VULKAN_HPP_NAMESPACE::XYColorEXT    displayPrimaryGreen       = {};\n    VULKAN_HPP_NAMESPACE::XYColorEXT    displayPrimaryBlue        = {};\n    VULKAN_HPP_NAMESPACE::XYColorEXT    whitePoint                = {};\n    float                               maxLuminance              = {};\n    float                               minLuminance              = {};\n    float                               maxContentLightLevel      = {};\n    float                               maxFrameAverageLightLevel = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eHdrMetadataEXT>\n  {\n    using Type = HdrMetadataEXT;\n  };\n\n  struct HdrVividDynamicMetadataHUAWEI\n  {\n    using NativeType = VkHdrVividDynamicMetadataHUAWEI;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eHdrVividDynamicMetadataHUAWEI;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      HdrVividDynamicMetadataHUAWEI( size_t dynamicMetadataSize_ = {}, const void * pDynamicMetadata_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , dynamicMetadataSize{ dynamicMetadataSize_ }\n      , pDynamicMetadata{ pDynamicMetadata_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR HdrVividDynamicMetadataHUAWEI( HdrVividDynamicMetadataHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    HdrVividDynamicMetadataHUAWEI( VkHdrVividDynamicMetadataHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT\n      : HdrVividDynamicMetadataHUAWEI( *reinterpret_cast<HdrVividDynamicMetadataHUAWEI const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    HdrVividDynamicMetadataHUAWEI( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & dynamicMetadata_, const void * pNext_ = nullptr )\n      : pNext( pNext_ ), dynamicMetadataSize( dynamicMetadata_.size() * sizeof( T ) ), pDynamicMetadata( dynamicMetadata_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    HdrVividDynamicMetadataHUAWEI & operator=( HdrVividDynamicMetadataHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    HdrVividDynamicMetadataHUAWEI & operator=( VkHdrVividDynamicMetadataHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::HdrVividDynamicMetadataHUAWEI const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 HdrVividDynamicMetadataHUAWEI & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 HdrVividDynamicMetadataHUAWEI & setDynamicMetadataSize( size_t dynamicMetadataSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dynamicMetadataSize = dynamicMetadataSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 HdrVividDynamicMetadataHUAWEI & setPDynamicMetadata( const void * pDynamicMetadata_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDynamicMetadata = pDynamicMetadata_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    HdrVividDynamicMetadataHUAWEI & setDynamicMetadata( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & dynamicMetadata_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dynamicMetadataSize = dynamicMetadata_.size() * sizeof( T );\n      pDynamicMetadata    = dynamicMetadata_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkHdrVividDynamicMetadataHUAWEI const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkHdrVividDynamicMetadataHUAWEI *>( this );\n    }\n\n    operator VkHdrVividDynamicMetadataHUAWEI &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkHdrVividDynamicMetadataHUAWEI *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, size_t const &, const void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, dynamicMetadataSize, pDynamicMetadata );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( HdrVividDynamicMetadataHUAWEI const & ) const = default;\n#else\n    bool operator==( HdrVividDynamicMetadataHUAWEI const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( dynamicMetadataSize == rhs.dynamicMetadataSize ) &&\n             ( pDynamicMetadata == rhs.pDynamicMetadata );\n#  endif\n    }\n\n    bool operator!=( HdrVividDynamicMetadataHUAWEI const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType               = StructureType::eHdrVividDynamicMetadataHUAWEI;\n    const void *                        pNext               = {};\n    size_t                              dynamicMetadataSize = {};\n    const void *                        pDynamicMetadata    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eHdrVividDynamicMetadataHUAWEI>\n  {\n    using Type = HdrVividDynamicMetadataHUAWEI;\n  };\n\n  struct HeadlessSurfaceCreateInfoEXT\n  {\n    using NativeType = VkHeadlessSurfaceCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eHeadlessSurfaceCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR HeadlessSurfaceCreateInfoEXT( VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateFlagsEXT flags_ = {},\n                                                       const void *                                        pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR HeadlessSurfaceCreateInfoEXT( HeadlessSurfaceCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    HeadlessSurfaceCreateInfoEXT( VkHeadlessSurfaceCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : HeadlessSurfaceCreateInfoEXT( *reinterpret_cast<HeadlessSurfaceCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    HeadlessSurfaceCreateInfoEXT & operator=( HeadlessSurfaceCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    HeadlessSurfaceCreateInfoEXT & operator=( VkHeadlessSurfaceCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 HeadlessSurfaceCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 HeadlessSurfaceCreateInfoEXT & setFlags( VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateFlagsEXT flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkHeadlessSurfaceCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkHeadlessSurfaceCreateInfoEXT *>( this );\n    }\n\n    operator VkHeadlessSurfaceCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkHeadlessSurfaceCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateFlagsEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( HeadlessSurfaceCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( HeadlessSurfaceCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags );\n#  endif\n    }\n\n    bool operator!=( HeadlessSurfaceCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                 sType = StructureType::eHeadlessSurfaceCreateInfoEXT;\n    const void *                                        pNext = {};\n    VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateFlagsEXT flags = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eHeadlessSurfaceCreateInfoEXT>\n  {\n    using Type = HeadlessSurfaceCreateInfoEXT;\n  };\n\n  struct HostImageCopyDevicePerformanceQuery\n  {\n    using NativeType = VkHostImageCopyDevicePerformanceQuery;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eHostImageCopyDevicePerformanceQuery;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR HostImageCopyDevicePerformanceQuery( VULKAN_HPP_NAMESPACE::Bool32 optimalDeviceAccess_   = {},\n                                                              VULKAN_HPP_NAMESPACE::Bool32 identicalMemoryLayout_ = {},\n                                                              void *                       pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , optimalDeviceAccess{ optimalDeviceAccess_ }\n      , identicalMemoryLayout{ identicalMemoryLayout_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR HostImageCopyDevicePerformanceQuery( HostImageCopyDevicePerformanceQuery const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    HostImageCopyDevicePerformanceQuery( VkHostImageCopyDevicePerformanceQuery const & rhs ) VULKAN_HPP_NOEXCEPT\n      : HostImageCopyDevicePerformanceQuery( *reinterpret_cast<HostImageCopyDevicePerformanceQuery const *>( &rhs ) )\n    {\n    }\n\n    HostImageCopyDevicePerformanceQuery & operator=( HostImageCopyDevicePerformanceQuery const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    HostImageCopyDevicePerformanceQuery & operator=( VkHostImageCopyDevicePerformanceQuery const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::HostImageCopyDevicePerformanceQuery const *>( &rhs );\n      return *this;\n    }\n\n    operator VkHostImageCopyDevicePerformanceQuery const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkHostImageCopyDevicePerformanceQuery *>( this );\n    }\n\n    operator VkHostImageCopyDevicePerformanceQuery &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkHostImageCopyDevicePerformanceQuery *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, optimalDeviceAccess, identicalMemoryLayout );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( HostImageCopyDevicePerformanceQuery const & ) const = default;\n#else\n    bool operator==( HostImageCopyDevicePerformanceQuery const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( optimalDeviceAccess == rhs.optimalDeviceAccess ) &&\n             ( identicalMemoryLayout == rhs.identicalMemoryLayout );\n#  endif\n    }\n\n    bool operator!=( HostImageCopyDevicePerformanceQuery const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                 = StructureType::eHostImageCopyDevicePerformanceQuery;\n    void *                              pNext                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        optimalDeviceAccess   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        identicalMemoryLayout = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eHostImageCopyDevicePerformanceQuery>\n  {\n    using Type = HostImageCopyDevicePerformanceQuery;\n  };\n\n  using HostImageCopyDevicePerformanceQueryEXT = HostImageCopyDevicePerformanceQuery;\n\n  struct HostImageLayoutTransitionInfo\n  {\n    using NativeType = VkHostImageLayoutTransitionInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eHostImageLayoutTransitionInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR HostImageLayoutTransitionInfo( VULKAN_HPP_NAMESPACE::Image                 image_     = {},\n                                                        VULKAN_HPP_NAMESPACE::ImageLayout           oldLayout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                                        VULKAN_HPP_NAMESPACE::ImageLayout           newLayout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                                        VULKAN_HPP_NAMESPACE::ImageSubresourceRange subresourceRange_ = {},\n                                                        const void *                                pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , image{ image_ }\n      , oldLayout{ oldLayout_ }\n      , newLayout{ newLayout_ }\n      , subresourceRange{ subresourceRange_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR HostImageLayoutTransitionInfo( HostImageLayoutTransitionInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    HostImageLayoutTransitionInfo( VkHostImageLayoutTransitionInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : HostImageLayoutTransitionInfo( *reinterpret_cast<HostImageLayoutTransitionInfo const *>( &rhs ) )\n    {\n    }\n\n    HostImageLayoutTransitionInfo & operator=( HostImageLayoutTransitionInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    HostImageLayoutTransitionInfo & operator=( VkHostImageLayoutTransitionInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::HostImageLayoutTransitionInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 HostImageLayoutTransitionInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 HostImageLayoutTransitionInfo & setImage( VULKAN_HPP_NAMESPACE::Image image_ ) VULKAN_HPP_NOEXCEPT\n    {\n      image = image_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 HostImageLayoutTransitionInfo & setOldLayout( VULKAN_HPP_NAMESPACE::ImageLayout oldLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      oldLayout = oldLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 HostImageLayoutTransitionInfo & setNewLayout( VULKAN_HPP_NAMESPACE::ImageLayout newLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      newLayout = newLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 HostImageLayoutTransitionInfo &\n      setSubresourceRange( VULKAN_HPP_NAMESPACE::ImageSubresourceRange const & subresourceRange_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subresourceRange = subresourceRange_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkHostImageLayoutTransitionInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkHostImageLayoutTransitionInfo *>( this );\n    }\n\n    operator VkHostImageLayoutTransitionInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkHostImageLayoutTransitionInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Image const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               VULKAN_HPP_NAMESPACE::ImageSubresourceRange const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, image, oldLayout, newLayout, subresourceRange );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( HostImageLayoutTransitionInfo const & ) const = default;\n#else\n    bool operator==( HostImageLayoutTransitionInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( image == rhs.image ) && ( oldLayout == rhs.oldLayout ) && ( newLayout == rhs.newLayout ) &&\n             ( subresourceRange == rhs.subresourceRange );\n#  endif\n    }\n\n    bool operator!=( HostImageLayoutTransitionInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType         sType            = StructureType::eHostImageLayoutTransitionInfo;\n    const void *                                pNext            = {};\n    VULKAN_HPP_NAMESPACE::Image                 image            = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout           oldLayout        = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    VULKAN_HPP_NAMESPACE::ImageLayout           newLayout        = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    VULKAN_HPP_NAMESPACE::ImageSubresourceRange subresourceRange = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eHostImageLayoutTransitionInfo>\n  {\n    using Type = HostImageLayoutTransitionInfo;\n  };\n\n  using HostImageLayoutTransitionInfoEXT = HostImageLayoutTransitionInfo;\n\n#if defined( VK_USE_PLATFORM_IOS_MVK )\n  struct IOSSurfaceCreateInfoMVK\n  {\n    using NativeType = VkIOSSurfaceCreateInfoMVK;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eIosSurfaceCreateInfoMVK;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR IOSSurfaceCreateInfoMVK( VULKAN_HPP_NAMESPACE::IOSSurfaceCreateFlagsMVK flags_ = {},\n                                                  const void *                                   pView_ = {},\n                                                  const void *                                   pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , pView{ pView_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR IOSSurfaceCreateInfoMVK( IOSSurfaceCreateInfoMVK const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    IOSSurfaceCreateInfoMVK( VkIOSSurfaceCreateInfoMVK const & rhs ) VULKAN_HPP_NOEXCEPT\n      : IOSSurfaceCreateInfoMVK( *reinterpret_cast<IOSSurfaceCreateInfoMVK const *>( &rhs ) )\n    {\n    }\n\n    IOSSurfaceCreateInfoMVK & operator=( IOSSurfaceCreateInfoMVK const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    IOSSurfaceCreateInfoMVK & operator=( VkIOSSurfaceCreateInfoMVK const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::IOSSurfaceCreateInfoMVK const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 IOSSurfaceCreateInfoMVK & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IOSSurfaceCreateInfoMVK & setFlags( VULKAN_HPP_NAMESPACE::IOSSurfaceCreateFlagsMVK flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IOSSurfaceCreateInfoMVK & setPView( const void * pView_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pView = pView_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkIOSSurfaceCreateInfoMVK const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkIOSSurfaceCreateInfoMVK *>( this );\n    }\n\n    operator VkIOSSurfaceCreateInfoMVK &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkIOSSurfaceCreateInfoMVK *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::IOSSurfaceCreateFlagsMVK const &, const void * const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, pView );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( IOSSurfaceCreateInfoMVK const & ) const = default;\n#  else\n    bool operator==( IOSSurfaceCreateInfoMVK const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( pView == rhs.pView );\n#    endif\n    }\n\n    bool operator!=( IOSSurfaceCreateInfoMVK const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType            sType = StructureType::eIosSurfaceCreateInfoMVK;\n    const void *                                   pNext = {};\n    VULKAN_HPP_NAMESPACE::IOSSurfaceCreateFlagsMVK flags = {};\n    const void *                                   pView = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eIosSurfaceCreateInfoMVK>\n  {\n    using Type = IOSSurfaceCreateInfoMVK;\n  };\n#endif /*VK_USE_PLATFORM_IOS_MVK*/\n\n  struct ImageAlignmentControlCreateInfoMESA\n  {\n    using NativeType = VkImageAlignmentControlCreateInfoMESA;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageAlignmentControlCreateInfoMESA;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageAlignmentControlCreateInfoMESA( uint32_t maximumRequestedAlignment_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maximumRequestedAlignment{ maximumRequestedAlignment_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageAlignmentControlCreateInfoMESA( ImageAlignmentControlCreateInfoMESA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageAlignmentControlCreateInfoMESA( VkImageAlignmentControlCreateInfoMESA const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageAlignmentControlCreateInfoMESA( *reinterpret_cast<ImageAlignmentControlCreateInfoMESA const *>( &rhs ) )\n    {\n    }\n\n    ImageAlignmentControlCreateInfoMESA & operator=( ImageAlignmentControlCreateInfoMESA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageAlignmentControlCreateInfoMESA & operator=( VkImageAlignmentControlCreateInfoMESA const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageAlignmentControlCreateInfoMESA const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageAlignmentControlCreateInfoMESA & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageAlignmentControlCreateInfoMESA & setMaximumRequestedAlignment( uint32_t maximumRequestedAlignment_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maximumRequestedAlignment = maximumRequestedAlignment_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageAlignmentControlCreateInfoMESA const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageAlignmentControlCreateInfoMESA *>( this );\n    }\n\n    operator VkImageAlignmentControlCreateInfoMESA &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageAlignmentControlCreateInfoMESA *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maximumRequestedAlignment );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageAlignmentControlCreateInfoMESA const & ) const = default;\n#else\n    bool operator==( ImageAlignmentControlCreateInfoMESA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maximumRequestedAlignment == rhs.maximumRequestedAlignment );\n#  endif\n    }\n\n    bool operator!=( ImageAlignmentControlCreateInfoMESA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                     = StructureType::eImageAlignmentControlCreateInfoMESA;\n    const void *                        pNext                     = {};\n    uint32_t                            maximumRequestedAlignment = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageAlignmentControlCreateInfoMESA>\n  {\n    using Type = ImageAlignmentControlCreateInfoMESA;\n  };\n\n  struct ImageBlit\n  {\n    using NativeType = VkImageBlit;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 ImageBlit( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers          srcSubresource_ = {},\n                                       std::array<VULKAN_HPP_NAMESPACE::Offset3D, 2> const & srcOffsets_     = {},\n                                       VULKAN_HPP_NAMESPACE::ImageSubresourceLayers          dstSubresource_ = {},\n                                       std::array<VULKAN_HPP_NAMESPACE::Offset3D, 2> const & dstOffsets_     = {} ) VULKAN_HPP_NOEXCEPT\n      : srcSubresource{ srcSubresource_ }\n      , srcOffsets{ srcOffsets_ }\n      , dstSubresource{ dstSubresource_ }\n      , dstOffsets{ dstOffsets_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageBlit( ImageBlit const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageBlit( VkImageBlit const & rhs ) VULKAN_HPP_NOEXCEPT : ImageBlit( *reinterpret_cast<ImageBlit const *>( &rhs ) ) {}\n\n    ImageBlit & operator=( ImageBlit const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageBlit & operator=( VkImageBlit const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageBlit const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageBlit & setSrcSubresource( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const & srcSubresource_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcSubresource = srcSubresource_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageBlit & setSrcOffsets( std::array<VULKAN_HPP_NAMESPACE::Offset3D, 2> const & srcOffsets_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcOffsets = srcOffsets_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageBlit & setDstSubresource( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const & dstSubresource_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstSubresource = dstSubresource_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageBlit & setDstOffsets( std::array<VULKAN_HPP_NAMESPACE::Offset3D, 2> const & dstOffsets_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstOffsets = dstOffsets_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageBlit const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageBlit *>( this );\n    }\n\n    operator VkImageBlit &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageBlit *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::Offset3D, 2> const &,\n               VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::Offset3D, 2> const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( srcSubresource, srcOffsets, dstSubresource, dstOffsets );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageBlit const & ) const = default;\n#else\n    bool operator==( ImageBlit const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( srcSubresource == rhs.srcSubresource ) && ( srcOffsets == rhs.srcOffsets ) && ( dstSubresource == rhs.dstSubresource ) &&\n             ( dstOffsets == rhs.dstOffsets );\n#  endif\n    }\n\n    bool operator!=( ImageBlit const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::ImageSubresourceLayers                            srcSubresource = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::Offset3D, 2> srcOffsets     = {};\n    VULKAN_HPP_NAMESPACE::ImageSubresourceLayers                            dstSubresource = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::Offset3D, 2> dstOffsets     = {};\n  };\n\n  struct ImageCaptureDescriptorDataInfoEXT\n  {\n    using NativeType = VkImageCaptureDescriptorDataInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageCaptureDescriptorDataInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageCaptureDescriptorDataInfoEXT( VULKAN_HPP_NAMESPACE::Image image_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , image{ image_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageCaptureDescriptorDataInfoEXT( ImageCaptureDescriptorDataInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageCaptureDescriptorDataInfoEXT( VkImageCaptureDescriptorDataInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageCaptureDescriptorDataInfoEXT( *reinterpret_cast<ImageCaptureDescriptorDataInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    ImageCaptureDescriptorDataInfoEXT & operator=( ImageCaptureDescriptorDataInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageCaptureDescriptorDataInfoEXT & operator=( VkImageCaptureDescriptorDataInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageCaptureDescriptorDataInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageCaptureDescriptorDataInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCaptureDescriptorDataInfoEXT & setImage( VULKAN_HPP_NAMESPACE::Image image_ ) VULKAN_HPP_NOEXCEPT\n    {\n      image = image_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageCaptureDescriptorDataInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageCaptureDescriptorDataInfoEXT *>( this );\n    }\n\n    operator VkImageCaptureDescriptorDataInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageCaptureDescriptorDataInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Image const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, image );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageCaptureDescriptorDataInfoEXT const & ) const = default;\n#else\n    bool operator==( ImageCaptureDescriptorDataInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( image == rhs.image );\n#  endif\n    }\n\n    bool operator!=( ImageCaptureDescriptorDataInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType = StructureType::eImageCaptureDescriptorDataInfoEXT;\n    const void *                        pNext = {};\n    VULKAN_HPP_NAMESPACE::Image         image = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageCaptureDescriptorDataInfoEXT>\n  {\n    using Type = ImageCaptureDescriptorDataInfoEXT;\n  };\n\n  struct ImageCompressionControlEXT\n  {\n    using NativeType = VkImageCompressionControlEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageCompressionControlEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageCompressionControlEXT( VULKAN_HPP_NAMESPACE::ImageCompressionFlagsEXT            flags_                        = {},\n                                                     uint32_t                                                  compressionControlPlaneCount_ = {},\n                                                     VULKAN_HPP_NAMESPACE::ImageCompressionFixedRateFlagsEXT * pFixedRateFlags_              = {},\n                                                     const void *                                              pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , compressionControlPlaneCount{ compressionControlPlaneCount_ }\n      , pFixedRateFlags{ pFixedRateFlags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageCompressionControlEXT( ImageCompressionControlEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageCompressionControlEXT( VkImageCompressionControlEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageCompressionControlEXT( *reinterpret_cast<ImageCompressionControlEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ImageCompressionControlEXT( VULKAN_HPP_NAMESPACE::ImageCompressionFlagsEXT                                                                 flags_,\n                                VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<VULKAN_HPP_NAMESPACE::ImageCompressionFixedRateFlagsEXT> const & fixedRateFlags_,\n                                const void * pNext_ = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , compressionControlPlaneCount( static_cast<uint32_t>( fixedRateFlags_.size() ) )\n      , pFixedRateFlags( fixedRateFlags_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    ImageCompressionControlEXT & operator=( ImageCompressionControlEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageCompressionControlEXT & operator=( VkImageCompressionControlEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageCompressionControlEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageCompressionControlEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCompressionControlEXT & setFlags( VULKAN_HPP_NAMESPACE::ImageCompressionFlagsEXT flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCompressionControlEXT & setCompressionControlPlaneCount( uint32_t compressionControlPlaneCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      compressionControlPlaneCount = compressionControlPlaneCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCompressionControlEXT &\n      setPFixedRateFlags( VULKAN_HPP_NAMESPACE::ImageCompressionFixedRateFlagsEXT * pFixedRateFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pFixedRateFlags = pFixedRateFlags_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ImageCompressionControlEXT & setFixedRateFlags(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<VULKAN_HPP_NAMESPACE::ImageCompressionFixedRateFlagsEXT> const & fixedRateFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      compressionControlPlaneCount = static_cast<uint32_t>( fixedRateFlags_.size() );\n      pFixedRateFlags              = fixedRateFlags_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageCompressionControlEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageCompressionControlEXT *>( this );\n    }\n\n    operator VkImageCompressionControlEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageCompressionControlEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ImageCompressionFlagsEXT const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ImageCompressionFixedRateFlagsEXT * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, compressionControlPlaneCount, pFixedRateFlags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageCompressionControlEXT const & ) const = default;\n#else\n    bool operator==( ImageCompressionControlEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) &&\n             ( compressionControlPlaneCount == rhs.compressionControlPlaneCount ) && ( pFixedRateFlags == rhs.pFixedRateFlags );\n#  endif\n    }\n\n    bool operator!=( ImageCompressionControlEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                       sType                        = StructureType::eImageCompressionControlEXT;\n    const void *                                              pNext                        = {};\n    VULKAN_HPP_NAMESPACE::ImageCompressionFlagsEXT            flags                        = {};\n    uint32_t                                                  compressionControlPlaneCount = {};\n    VULKAN_HPP_NAMESPACE::ImageCompressionFixedRateFlagsEXT * pFixedRateFlags              = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageCompressionControlEXT>\n  {\n    using Type = ImageCompressionControlEXT;\n  };\n\n  struct ImageCompressionPropertiesEXT\n  {\n    using NativeType = VkImageCompressionPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageCompressionPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageCompressionPropertiesEXT( VULKAN_HPP_NAMESPACE::ImageCompressionFlagsEXT          imageCompressionFlags_          = {},\n                                                        VULKAN_HPP_NAMESPACE::ImageCompressionFixedRateFlagsEXT imageCompressionFixedRateFlags_ = {},\n                                                        void *                                                  pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , imageCompressionFlags{ imageCompressionFlags_ }\n      , imageCompressionFixedRateFlags{ imageCompressionFixedRateFlags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageCompressionPropertiesEXT( ImageCompressionPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageCompressionPropertiesEXT( VkImageCompressionPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageCompressionPropertiesEXT( *reinterpret_cast<ImageCompressionPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    ImageCompressionPropertiesEXT & operator=( ImageCompressionPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageCompressionPropertiesEXT & operator=( VkImageCompressionPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageCompressionPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkImageCompressionPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageCompressionPropertiesEXT *>( this );\n    }\n\n    operator VkImageCompressionPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageCompressionPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::ImageCompressionFlagsEXT const &,\n               VULKAN_HPP_NAMESPACE::ImageCompressionFixedRateFlagsEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, imageCompressionFlags, imageCompressionFixedRateFlags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageCompressionPropertiesEXT const & ) const = default;\n#else\n    bool operator==( ImageCompressionPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( imageCompressionFlags == rhs.imageCompressionFlags ) &&\n             ( imageCompressionFixedRateFlags == rhs.imageCompressionFixedRateFlags );\n#  endif\n    }\n\n    bool operator!=( ImageCompressionPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                     sType                          = StructureType::eImageCompressionPropertiesEXT;\n    void *                                                  pNext                          = {};\n    VULKAN_HPP_NAMESPACE::ImageCompressionFlagsEXT          imageCompressionFlags          = {};\n    VULKAN_HPP_NAMESPACE::ImageCompressionFixedRateFlagsEXT imageCompressionFixedRateFlags = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageCompressionPropertiesEXT>\n  {\n    using Type = ImageCompressionPropertiesEXT;\n  };\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  struct ImageFormatConstraintsInfoFUCHSIA\n  {\n    using NativeType = VkImageFormatConstraintsInfoFUCHSIA;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageFormatConstraintsInfoFUCHSIA;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageFormatConstraintsInfoFUCHSIA( VULKAN_HPP_NAMESPACE::ImageCreateInfo                    imageCreateInfo_        = {},\n                                                            VULKAN_HPP_NAMESPACE::FormatFeatureFlags                 requiredFormatFeatures_ = {},\n                                                            VULKAN_HPP_NAMESPACE::ImageFormatConstraintsFlagsFUCHSIA flags_                  = {},\n                                                            uint64_t                                                 sysmemPixelFormat_      = {},\n                                                            uint32_t                                                 colorSpaceCount_        = {},\n                                                            const VULKAN_HPP_NAMESPACE::SysmemColorSpaceFUCHSIA *    pColorSpaces_           = {},\n                                                            const void *                                             pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , imageCreateInfo{ imageCreateInfo_ }\n      , requiredFormatFeatures{ requiredFormatFeatures_ }\n      , flags{ flags_ }\n      , sysmemPixelFormat{ sysmemPixelFormat_ }\n      , colorSpaceCount{ colorSpaceCount_ }\n      , pColorSpaces{ pColorSpaces_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageFormatConstraintsInfoFUCHSIA( ImageFormatConstraintsInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageFormatConstraintsInfoFUCHSIA( VkImageFormatConstraintsInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageFormatConstraintsInfoFUCHSIA( *reinterpret_cast<ImageFormatConstraintsInfoFUCHSIA const *>( &rhs ) )\n    {\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ImageFormatConstraintsInfoFUCHSIA( VULKAN_HPP_NAMESPACE::ImageCreateInfo                    imageCreateInfo_,\n                                       VULKAN_HPP_NAMESPACE::FormatFeatureFlags                 requiredFormatFeatures_,\n                                       VULKAN_HPP_NAMESPACE::ImageFormatConstraintsFlagsFUCHSIA flags_,\n                                       uint64_t                                                 sysmemPixelFormat_,\n                                       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SysmemColorSpaceFUCHSIA> const & colorSpaces_,\n                                       const void * pNext_ = nullptr )\n      : pNext( pNext_ )\n      , imageCreateInfo( imageCreateInfo_ )\n      , requiredFormatFeatures( requiredFormatFeatures_ )\n      , flags( flags_ )\n      , sysmemPixelFormat( sysmemPixelFormat_ )\n      , colorSpaceCount( static_cast<uint32_t>( colorSpaces_.size() ) )\n      , pColorSpaces( colorSpaces_.data() )\n    {\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    ImageFormatConstraintsInfoFUCHSIA & operator=( ImageFormatConstraintsInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageFormatConstraintsInfoFUCHSIA & operator=( VkImageFormatConstraintsInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageFormatConstraintsInfoFUCHSIA const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageFormatConstraintsInfoFUCHSIA & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageFormatConstraintsInfoFUCHSIA &\n      setImageCreateInfo( VULKAN_HPP_NAMESPACE::ImageCreateInfo const & imageCreateInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageCreateInfo = imageCreateInfo_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageFormatConstraintsInfoFUCHSIA &\n      setRequiredFormatFeatures( VULKAN_HPP_NAMESPACE::FormatFeatureFlags requiredFormatFeatures_ ) VULKAN_HPP_NOEXCEPT\n    {\n      requiredFormatFeatures = requiredFormatFeatures_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageFormatConstraintsInfoFUCHSIA & setFlags( VULKAN_HPP_NAMESPACE::ImageFormatConstraintsFlagsFUCHSIA flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageFormatConstraintsInfoFUCHSIA & setSysmemPixelFormat( uint64_t sysmemPixelFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sysmemPixelFormat = sysmemPixelFormat_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageFormatConstraintsInfoFUCHSIA & setColorSpaceCount( uint32_t colorSpaceCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorSpaceCount = colorSpaceCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageFormatConstraintsInfoFUCHSIA &\n      setPColorSpaces( const VULKAN_HPP_NAMESPACE::SysmemColorSpaceFUCHSIA * pColorSpaces_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pColorSpaces = pColorSpaces_;\n      return *this;\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ImageFormatConstraintsInfoFUCHSIA & setColorSpaces(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SysmemColorSpaceFUCHSIA> const & colorSpaces_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorSpaceCount = static_cast<uint32_t>( colorSpaces_.size() );\n      pColorSpaces    = colorSpaces_.data();\n      return *this;\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#  endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageFormatConstraintsInfoFUCHSIA const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageFormatConstraintsInfoFUCHSIA *>( this );\n    }\n\n    operator VkImageFormatConstraintsInfoFUCHSIA &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageFormatConstraintsInfoFUCHSIA *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ImageCreateInfo const &,\n               VULKAN_HPP_NAMESPACE::FormatFeatureFlags const &,\n               VULKAN_HPP_NAMESPACE::ImageFormatConstraintsFlagsFUCHSIA const &,\n               uint64_t const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::SysmemColorSpaceFUCHSIA * const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, imageCreateInfo, requiredFormatFeatures, flags, sysmemPixelFormat, colorSpaceCount, pColorSpaces );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageFormatConstraintsInfoFUCHSIA const & ) const = default;\n#  else\n    bool operator==( ImageFormatConstraintsInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( imageCreateInfo == rhs.imageCreateInfo ) &&\n             ( requiredFormatFeatures == rhs.requiredFormatFeatures ) && ( flags == rhs.flags ) && ( sysmemPixelFormat == rhs.sysmemPixelFormat ) &&\n             ( colorSpaceCount == rhs.colorSpaceCount ) && ( pColorSpaces == rhs.pColorSpaces );\n#    endif\n    }\n\n    bool operator!=( ImageFormatConstraintsInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                      sType                  = StructureType::eImageFormatConstraintsInfoFUCHSIA;\n    const void *                                             pNext                  = {};\n    VULKAN_HPP_NAMESPACE::ImageCreateInfo                    imageCreateInfo        = {};\n    VULKAN_HPP_NAMESPACE::FormatFeatureFlags                 requiredFormatFeatures = {};\n    VULKAN_HPP_NAMESPACE::ImageFormatConstraintsFlagsFUCHSIA flags                  = {};\n    uint64_t                                                 sysmemPixelFormat      = {};\n    uint32_t                                                 colorSpaceCount        = {};\n    const VULKAN_HPP_NAMESPACE::SysmemColorSpaceFUCHSIA *    pColorSpaces           = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageFormatConstraintsInfoFUCHSIA>\n  {\n    using Type = ImageFormatConstraintsInfoFUCHSIA;\n  };\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  struct ImageConstraintsInfoFUCHSIA\n  {\n    using NativeType = VkImageConstraintsInfoFUCHSIA;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageConstraintsInfoFUCHSIA;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageConstraintsInfoFUCHSIA( uint32_t                                                        formatConstraintsCount_      = {},\n                                                      const VULKAN_HPP_NAMESPACE::ImageFormatConstraintsInfoFUCHSIA * pFormatConstraints_          = {},\n                                                      VULKAN_HPP_NAMESPACE::BufferCollectionConstraintsInfoFUCHSIA    bufferCollectionConstraints_ = {},\n                                                      VULKAN_HPP_NAMESPACE::ImageConstraintsInfoFlagsFUCHSIA          flags_                       = {},\n                                                      const void *                                                    pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , formatConstraintsCount{ formatConstraintsCount_ }\n      , pFormatConstraints{ pFormatConstraints_ }\n      , bufferCollectionConstraints{ bufferCollectionConstraints_ }\n      , flags{ flags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageConstraintsInfoFUCHSIA( ImageConstraintsInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageConstraintsInfoFUCHSIA( VkImageConstraintsInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageConstraintsInfoFUCHSIA( *reinterpret_cast<ImageConstraintsInfoFUCHSIA const *>( &rhs ) )\n    {\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ImageConstraintsInfoFUCHSIA(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageFormatConstraintsInfoFUCHSIA> const & formatConstraints_,\n      VULKAN_HPP_NAMESPACE::BufferCollectionConstraintsInfoFUCHSIA                                                         bufferCollectionConstraints_ = {},\n      VULKAN_HPP_NAMESPACE::ImageConstraintsInfoFlagsFUCHSIA                                                               flags_                       = {},\n      const void *                                                                                                         pNext_ = nullptr )\n      : pNext( pNext_ )\n      , formatConstraintsCount( static_cast<uint32_t>( formatConstraints_.size() ) )\n      , pFormatConstraints( formatConstraints_.data() )\n      , bufferCollectionConstraints( bufferCollectionConstraints_ )\n      , flags( flags_ )\n    {\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    ImageConstraintsInfoFUCHSIA & operator=( ImageConstraintsInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageConstraintsInfoFUCHSIA & operator=( VkImageConstraintsInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageConstraintsInfoFUCHSIA const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageConstraintsInfoFUCHSIA & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageConstraintsInfoFUCHSIA & setFormatConstraintsCount( uint32_t formatConstraintsCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      formatConstraintsCount = formatConstraintsCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageConstraintsInfoFUCHSIA &\n      setPFormatConstraints( const VULKAN_HPP_NAMESPACE::ImageFormatConstraintsInfoFUCHSIA * pFormatConstraints_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pFormatConstraints = pFormatConstraints_;\n      return *this;\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ImageConstraintsInfoFUCHSIA & setFormatConstraints(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageFormatConstraintsInfoFUCHSIA> const & formatConstraints_ )\n      VULKAN_HPP_NOEXCEPT\n    {\n      formatConstraintsCount = static_cast<uint32_t>( formatConstraints_.size() );\n      pFormatConstraints     = formatConstraints_.data();\n      return *this;\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 ImageConstraintsInfoFUCHSIA &\n      setBufferCollectionConstraints( VULKAN_HPP_NAMESPACE::BufferCollectionConstraintsInfoFUCHSIA const & bufferCollectionConstraints_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferCollectionConstraints = bufferCollectionConstraints_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageConstraintsInfoFUCHSIA & setFlags( VULKAN_HPP_NAMESPACE::ImageConstraintsInfoFlagsFUCHSIA flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageConstraintsInfoFUCHSIA const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageConstraintsInfoFUCHSIA *>( this );\n    }\n\n    operator VkImageConstraintsInfoFUCHSIA &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageConstraintsInfoFUCHSIA *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::ImageFormatConstraintsInfoFUCHSIA * const &,\n               VULKAN_HPP_NAMESPACE::BufferCollectionConstraintsInfoFUCHSIA const &,\n               VULKAN_HPP_NAMESPACE::ImageConstraintsInfoFlagsFUCHSIA const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, formatConstraintsCount, pFormatConstraints, bufferCollectionConstraints, flags );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageConstraintsInfoFUCHSIA const & ) const = default;\n#  else\n    bool operator==( ImageConstraintsInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( formatConstraintsCount == rhs.formatConstraintsCount ) &&\n             ( pFormatConstraints == rhs.pFormatConstraints ) && ( bufferCollectionConstraints == rhs.bufferCollectionConstraints ) && ( flags == rhs.flags );\n#    endif\n    }\n\n    bool operator!=( ImageConstraintsInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                             sType                       = StructureType::eImageConstraintsInfoFUCHSIA;\n    const void *                                                    pNext                       = {};\n    uint32_t                                                        formatConstraintsCount      = {};\n    const VULKAN_HPP_NAMESPACE::ImageFormatConstraintsInfoFUCHSIA * pFormatConstraints          = {};\n    VULKAN_HPP_NAMESPACE::BufferCollectionConstraintsInfoFUCHSIA    bufferCollectionConstraints = {};\n    VULKAN_HPP_NAMESPACE::ImageConstraintsInfoFlagsFUCHSIA          flags                       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageConstraintsInfoFUCHSIA>\n  {\n    using Type = ImageConstraintsInfoFUCHSIA;\n  };\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  struct ImageCopy\n  {\n    using NativeType = VkImageCopy;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageCopy( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers srcSubresource_ = {},\n                                    VULKAN_HPP_NAMESPACE::Offset3D               srcOffset_      = {},\n                                    VULKAN_HPP_NAMESPACE::ImageSubresourceLayers dstSubresource_ = {},\n                                    VULKAN_HPP_NAMESPACE::Offset3D               dstOffset_      = {},\n                                    VULKAN_HPP_NAMESPACE::Extent3D               extent_         = {} ) VULKAN_HPP_NOEXCEPT\n      : srcSubresource{ srcSubresource_ }\n      , srcOffset{ srcOffset_ }\n      , dstSubresource{ dstSubresource_ }\n      , dstOffset{ dstOffset_ }\n      , extent{ extent_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageCopy( ImageCopy const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageCopy( VkImageCopy const & rhs ) VULKAN_HPP_NOEXCEPT : ImageCopy( *reinterpret_cast<ImageCopy const *>( &rhs ) ) {}\n\n    ImageCopy & operator=( ImageCopy const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageCopy & operator=( VkImageCopy const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageCopy const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageCopy & setSrcSubresource( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const & srcSubresource_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcSubresource = srcSubresource_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCopy & setSrcOffset( VULKAN_HPP_NAMESPACE::Offset3D const & srcOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcOffset = srcOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCopy & setDstSubresource( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const & dstSubresource_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstSubresource = dstSubresource_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCopy & setDstOffset( VULKAN_HPP_NAMESPACE::Offset3D const & dstOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstOffset = dstOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageCopy & setExtent( VULKAN_HPP_NAMESPACE::Extent3D const & extent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extent = extent_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageCopy const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageCopy *>( this );\n    }\n\n    operator VkImageCopy &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageCopy *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const &,\n               VULKAN_HPP_NAMESPACE::Offset3D const &,\n               VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const &,\n               VULKAN_HPP_NAMESPACE::Offset3D const &,\n               VULKAN_HPP_NAMESPACE::Extent3D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( srcSubresource, srcOffset, dstSubresource, dstOffset, extent );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageCopy const & ) const = default;\n#else\n    bool operator==( ImageCopy const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( srcSubresource == rhs.srcSubresource ) && ( srcOffset == rhs.srcOffset ) && ( dstSubresource == rhs.dstSubresource ) &&\n             ( dstOffset == rhs.dstOffset ) && ( extent == rhs.extent );\n#  endif\n    }\n\n    bool operator!=( ImageCopy const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::ImageSubresourceLayers srcSubresource = {};\n    VULKAN_HPP_NAMESPACE::Offset3D               srcOffset      = {};\n    VULKAN_HPP_NAMESPACE::ImageSubresourceLayers dstSubresource = {};\n    VULKAN_HPP_NAMESPACE::Offset3D               dstOffset      = {};\n    VULKAN_HPP_NAMESPACE::Extent3D               extent         = {};\n  };\n\n  struct SubresourceLayout\n  {\n    using NativeType = VkSubresourceLayout;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SubresourceLayout( VULKAN_HPP_NAMESPACE::DeviceSize offset_     = {},\n                                            VULKAN_HPP_NAMESPACE::DeviceSize size_       = {},\n                                            VULKAN_HPP_NAMESPACE::DeviceSize rowPitch_   = {},\n                                            VULKAN_HPP_NAMESPACE::DeviceSize arrayPitch_ = {},\n                                            VULKAN_HPP_NAMESPACE::DeviceSize depthPitch_ = {} ) VULKAN_HPP_NOEXCEPT\n      : offset{ offset_ }\n      , size{ size_ }\n      , rowPitch{ rowPitch_ }\n      , arrayPitch{ arrayPitch_ }\n      , depthPitch{ depthPitch_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SubresourceLayout( SubresourceLayout const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SubresourceLayout( VkSubresourceLayout const & rhs ) VULKAN_HPP_NOEXCEPT : SubresourceLayout( *reinterpret_cast<SubresourceLayout const *>( &rhs ) ) {}\n\n    SubresourceLayout & operator=( SubresourceLayout const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SubresourceLayout & operator=( VkSubresourceLayout const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SubresourceLayout const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SubresourceLayout & setOffset( VULKAN_HPP_NAMESPACE::DeviceSize offset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      offset = offset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubresourceLayout & setSize( VULKAN_HPP_NAMESPACE::DeviceSize size_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size = size_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubresourceLayout & setRowPitch( VULKAN_HPP_NAMESPACE::DeviceSize rowPitch_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rowPitch = rowPitch_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubresourceLayout & setArrayPitch( VULKAN_HPP_NAMESPACE::DeviceSize arrayPitch_ ) VULKAN_HPP_NOEXCEPT\n    {\n      arrayPitch = arrayPitch_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubresourceLayout & setDepthPitch( VULKAN_HPP_NAMESPACE::DeviceSize depthPitch_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthPitch = depthPitch_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSubresourceLayout const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSubresourceLayout *>( this );\n    }\n\n    operator VkSubresourceLayout &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSubresourceLayout *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( offset, size, rowPitch, arrayPitch, depthPitch );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SubresourceLayout const & ) const = default;\n#else\n    bool operator==( SubresourceLayout const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( offset == rhs.offset ) && ( size == rhs.size ) && ( rowPitch == rhs.rowPitch ) && ( arrayPitch == rhs.arrayPitch ) &&\n             ( depthPitch == rhs.depthPitch );\n#  endif\n    }\n\n    bool operator!=( SubresourceLayout const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DeviceSize offset     = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize size       = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize rowPitch   = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize arrayPitch = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize depthPitch = {};\n  };\n\n  struct ImageDrmFormatModifierExplicitCreateInfoEXT\n  {\n    using NativeType = VkImageDrmFormatModifierExplicitCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageDrmFormatModifierExplicitCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageDrmFormatModifierExplicitCreateInfoEXT( uint64_t                                        drmFormatModifier_           = {},\n                                                                      uint32_t                                        drmFormatModifierPlaneCount_ = {},\n                                                                      const VULKAN_HPP_NAMESPACE::SubresourceLayout * pPlaneLayouts_               = {},\n                                                                      const void *                                    pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , drmFormatModifier{ drmFormatModifier_ }\n      , drmFormatModifierPlaneCount{ drmFormatModifierPlaneCount_ }\n      , pPlaneLayouts{ pPlaneLayouts_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageDrmFormatModifierExplicitCreateInfoEXT( ImageDrmFormatModifierExplicitCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageDrmFormatModifierExplicitCreateInfoEXT( VkImageDrmFormatModifierExplicitCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageDrmFormatModifierExplicitCreateInfoEXT( *reinterpret_cast<ImageDrmFormatModifierExplicitCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ImageDrmFormatModifierExplicitCreateInfoEXT(\n      uint64_t                                                                                             drmFormatModifier_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SubresourceLayout> const & planeLayouts_,\n      const void *                                                                                         pNext_ = nullptr )\n      : pNext( pNext_ )\n      , drmFormatModifier( drmFormatModifier_ )\n      , drmFormatModifierPlaneCount( static_cast<uint32_t>( planeLayouts_.size() ) )\n      , pPlaneLayouts( planeLayouts_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    ImageDrmFormatModifierExplicitCreateInfoEXT & operator=( ImageDrmFormatModifierExplicitCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageDrmFormatModifierExplicitCreateInfoEXT & operator=( VkImageDrmFormatModifierExplicitCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierExplicitCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageDrmFormatModifierExplicitCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageDrmFormatModifierExplicitCreateInfoEXT & setDrmFormatModifier( uint64_t drmFormatModifier_ ) VULKAN_HPP_NOEXCEPT\n    {\n      drmFormatModifier = drmFormatModifier_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageDrmFormatModifierExplicitCreateInfoEXT &\n      setDrmFormatModifierPlaneCount( uint32_t drmFormatModifierPlaneCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      drmFormatModifierPlaneCount = drmFormatModifierPlaneCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageDrmFormatModifierExplicitCreateInfoEXT &\n      setPPlaneLayouts( const VULKAN_HPP_NAMESPACE::SubresourceLayout * pPlaneLayouts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPlaneLayouts = pPlaneLayouts_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ImageDrmFormatModifierExplicitCreateInfoEXT &\n      setPlaneLayouts( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SubresourceLayout> const & planeLayouts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      drmFormatModifierPlaneCount = static_cast<uint32_t>( planeLayouts_.size() );\n      pPlaneLayouts               = planeLayouts_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageDrmFormatModifierExplicitCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageDrmFormatModifierExplicitCreateInfoEXT *>( this );\n    }\n\n    operator VkImageDrmFormatModifierExplicitCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageDrmFormatModifierExplicitCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint64_t const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::SubresourceLayout * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, drmFormatModifier, drmFormatModifierPlaneCount, pPlaneLayouts );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageDrmFormatModifierExplicitCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( ImageDrmFormatModifierExplicitCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( drmFormatModifier == rhs.drmFormatModifier ) &&\n             ( drmFormatModifierPlaneCount == rhs.drmFormatModifierPlaneCount ) && ( pPlaneLayouts == rhs.pPlaneLayouts );\n#  endif\n    }\n\n    bool operator!=( ImageDrmFormatModifierExplicitCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType             sType                       = StructureType::eImageDrmFormatModifierExplicitCreateInfoEXT;\n    const void *                                    pNext                       = {};\n    uint64_t                                        drmFormatModifier           = {};\n    uint32_t                                        drmFormatModifierPlaneCount = {};\n    const VULKAN_HPP_NAMESPACE::SubresourceLayout * pPlaneLayouts               = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageDrmFormatModifierExplicitCreateInfoEXT>\n  {\n    using Type = ImageDrmFormatModifierExplicitCreateInfoEXT;\n  };\n\n  struct ImageDrmFormatModifierListCreateInfoEXT\n  {\n    using NativeType = VkImageDrmFormatModifierListCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageDrmFormatModifierListCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageDrmFormatModifierListCreateInfoEXT( uint32_t         drmFormatModifierCount_ = {},\n                                                                  const uint64_t * pDrmFormatModifiers_    = {},\n                                                                  const void *     pNext_                  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , drmFormatModifierCount{ drmFormatModifierCount_ }\n      , pDrmFormatModifiers{ pDrmFormatModifiers_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageDrmFormatModifierListCreateInfoEXT( ImageDrmFormatModifierListCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageDrmFormatModifierListCreateInfoEXT( VkImageDrmFormatModifierListCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageDrmFormatModifierListCreateInfoEXT( *reinterpret_cast<ImageDrmFormatModifierListCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ImageDrmFormatModifierListCreateInfoEXT( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & drmFormatModifiers_,\n                                             const void *                                                          pNext_ = nullptr )\n      : pNext( pNext_ ), drmFormatModifierCount( static_cast<uint32_t>( drmFormatModifiers_.size() ) ), pDrmFormatModifiers( drmFormatModifiers_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    ImageDrmFormatModifierListCreateInfoEXT & operator=( ImageDrmFormatModifierListCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageDrmFormatModifierListCreateInfoEXT & operator=( VkImageDrmFormatModifierListCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierListCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageDrmFormatModifierListCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageDrmFormatModifierListCreateInfoEXT & setDrmFormatModifierCount( uint32_t drmFormatModifierCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      drmFormatModifierCount = drmFormatModifierCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageDrmFormatModifierListCreateInfoEXT & setPDrmFormatModifiers( const uint64_t * pDrmFormatModifiers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDrmFormatModifiers = pDrmFormatModifiers_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ImageDrmFormatModifierListCreateInfoEXT &\n      setDrmFormatModifiers( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & drmFormatModifiers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      drmFormatModifierCount = static_cast<uint32_t>( drmFormatModifiers_.size() );\n      pDrmFormatModifiers    = drmFormatModifiers_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageDrmFormatModifierListCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageDrmFormatModifierListCreateInfoEXT *>( this );\n    }\n\n    operator VkImageDrmFormatModifierListCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageDrmFormatModifierListCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const uint64_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, drmFormatModifierCount, pDrmFormatModifiers );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageDrmFormatModifierListCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( ImageDrmFormatModifierListCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( drmFormatModifierCount == rhs.drmFormatModifierCount ) &&\n             ( pDrmFormatModifiers == rhs.pDrmFormatModifiers );\n#  endif\n    }\n\n    bool operator!=( ImageDrmFormatModifierListCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                  = StructureType::eImageDrmFormatModifierListCreateInfoEXT;\n    const void *                        pNext                  = {};\n    uint32_t                            drmFormatModifierCount = {};\n    const uint64_t *                    pDrmFormatModifiers    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageDrmFormatModifierListCreateInfoEXT>\n  {\n    using Type = ImageDrmFormatModifierListCreateInfoEXT;\n  };\n\n  struct ImageDrmFormatModifierPropertiesEXT\n  {\n    using NativeType = VkImageDrmFormatModifierPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageDrmFormatModifierPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageDrmFormatModifierPropertiesEXT( uint64_t drmFormatModifier_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , drmFormatModifier{ drmFormatModifier_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageDrmFormatModifierPropertiesEXT( ImageDrmFormatModifierPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageDrmFormatModifierPropertiesEXT( VkImageDrmFormatModifierPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageDrmFormatModifierPropertiesEXT( *reinterpret_cast<ImageDrmFormatModifierPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    ImageDrmFormatModifierPropertiesEXT & operator=( ImageDrmFormatModifierPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageDrmFormatModifierPropertiesEXT & operator=( VkImageDrmFormatModifierPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkImageDrmFormatModifierPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageDrmFormatModifierPropertiesEXT *>( this );\n    }\n\n    operator VkImageDrmFormatModifierPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageDrmFormatModifierPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, drmFormatModifier );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageDrmFormatModifierPropertiesEXT const & ) const = default;\n#else\n    bool operator==( ImageDrmFormatModifierPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( drmFormatModifier == rhs.drmFormatModifier );\n#  endif\n    }\n\n    bool operator!=( ImageDrmFormatModifierPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType             = StructureType::eImageDrmFormatModifierPropertiesEXT;\n    void *                              pNext             = {};\n    uint64_t                            drmFormatModifier = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageDrmFormatModifierPropertiesEXT>\n  {\n    using Type = ImageDrmFormatModifierPropertiesEXT;\n  };\n\n  struct ImageFormatListCreateInfo\n  {\n    using NativeType = VkImageFormatListCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageFormatListCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageFormatListCreateInfo( uint32_t                             viewFormatCount_ = {},\n                                                    const VULKAN_HPP_NAMESPACE::Format * pViewFormats_    = {},\n                                                    const void *                         pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , viewFormatCount{ viewFormatCount_ }\n      , pViewFormats{ pViewFormats_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageFormatListCreateInfo( ImageFormatListCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageFormatListCreateInfo( VkImageFormatListCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageFormatListCreateInfo( *reinterpret_cast<ImageFormatListCreateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ImageFormatListCreateInfo( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Format> const & viewFormats_,\n                               const void *                                                                              pNext_ = nullptr )\n      : pNext( pNext_ ), viewFormatCount( static_cast<uint32_t>( viewFormats_.size() ) ), pViewFormats( viewFormats_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    ImageFormatListCreateInfo & operator=( ImageFormatListCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageFormatListCreateInfo & operator=( VkImageFormatListCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageFormatListCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageFormatListCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageFormatListCreateInfo & setViewFormatCount( uint32_t viewFormatCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      viewFormatCount = viewFormatCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageFormatListCreateInfo & setPViewFormats( const VULKAN_HPP_NAMESPACE::Format * pViewFormats_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pViewFormats = pViewFormats_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ImageFormatListCreateInfo &\n      setViewFormats( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Format> const & viewFormats_ ) VULKAN_HPP_NOEXCEPT\n    {\n      viewFormatCount = static_cast<uint32_t>( viewFormats_.size() );\n      pViewFormats    = viewFormats_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageFormatListCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageFormatListCreateInfo *>( this );\n    }\n\n    operator VkImageFormatListCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageFormatListCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::Format * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, viewFormatCount, pViewFormats );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageFormatListCreateInfo const & ) const = default;\n#else\n    bool operator==( ImageFormatListCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( viewFormatCount == rhs.viewFormatCount ) && ( pViewFormats == rhs.pViewFormats );\n#  endif\n    }\n\n    bool operator!=( ImageFormatListCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType  sType           = StructureType::eImageFormatListCreateInfo;\n    const void *                         pNext           = {};\n    uint32_t                             viewFormatCount = {};\n    const VULKAN_HPP_NAMESPACE::Format * pViewFormats    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageFormatListCreateInfo>\n  {\n    using Type = ImageFormatListCreateInfo;\n  };\n\n  using ImageFormatListCreateInfoKHR = ImageFormatListCreateInfo;\n\n  struct ImageFormatProperties2\n  {\n    using NativeType = VkImageFormatProperties2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageFormatProperties2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageFormatProperties2( VULKAN_HPP_NAMESPACE::ImageFormatProperties imageFormatProperties_ = {},\n                                                 void *                                      pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , imageFormatProperties{ imageFormatProperties_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageFormatProperties2( ImageFormatProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageFormatProperties2( VkImageFormatProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageFormatProperties2( *reinterpret_cast<ImageFormatProperties2 const *>( &rhs ) )\n    {\n    }\n\n    ImageFormatProperties2 & operator=( ImageFormatProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageFormatProperties2 & operator=( VkImageFormatProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageFormatProperties2 const *>( &rhs );\n      return *this;\n    }\n\n    operator VkImageFormatProperties2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageFormatProperties2 *>( this );\n    }\n\n    operator VkImageFormatProperties2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageFormatProperties2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::ImageFormatProperties const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, imageFormatProperties );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageFormatProperties2 const & ) const = default;\n#else\n    bool operator==( ImageFormatProperties2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( imageFormatProperties == rhs.imageFormatProperties );\n#  endif\n    }\n\n    bool operator!=( ImageFormatProperties2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType         sType                 = StructureType::eImageFormatProperties2;\n    void *                                      pNext                 = {};\n    VULKAN_HPP_NAMESPACE::ImageFormatProperties imageFormatProperties = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageFormatProperties2>\n  {\n    using Type = ImageFormatProperties2;\n  };\n\n  using ImageFormatProperties2KHR = ImageFormatProperties2;\n\n  struct ImageMemoryBarrier\n  {\n    using NativeType = VkImageMemoryBarrier;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageMemoryBarrier;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageMemoryBarrier( VULKAN_HPP_NAMESPACE::AccessFlags           srcAccessMask_       = {},\n                                             VULKAN_HPP_NAMESPACE::AccessFlags           dstAccessMask_       = {},\n                                             VULKAN_HPP_NAMESPACE::ImageLayout           oldLayout_           = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                             VULKAN_HPP_NAMESPACE::ImageLayout           newLayout_           = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                             uint32_t                                    srcQueueFamilyIndex_ = {},\n                                             uint32_t                                    dstQueueFamilyIndex_ = {},\n                                             VULKAN_HPP_NAMESPACE::Image                 image_               = {},\n                                             VULKAN_HPP_NAMESPACE::ImageSubresourceRange subresourceRange_    = {},\n                                             const void *                                pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , srcAccessMask{ srcAccessMask_ }\n      , dstAccessMask{ dstAccessMask_ }\n      , oldLayout{ oldLayout_ }\n      , newLayout{ newLayout_ }\n      , srcQueueFamilyIndex{ srcQueueFamilyIndex_ }\n      , dstQueueFamilyIndex{ dstQueueFamilyIndex_ }\n      , image{ image_ }\n      , subresourceRange{ subresourceRange_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageMemoryBarrier( ImageMemoryBarrier const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageMemoryBarrier( VkImageMemoryBarrier const & rhs ) VULKAN_HPP_NOEXCEPT : ImageMemoryBarrier( *reinterpret_cast<ImageMemoryBarrier const *>( &rhs ) ) {}\n\n    ImageMemoryBarrier & operator=( ImageMemoryBarrier const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageMemoryBarrier & operator=( VkImageMemoryBarrier const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageMemoryBarrier const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageMemoryBarrier & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageMemoryBarrier & setSrcAccessMask( VULKAN_HPP_NAMESPACE::AccessFlags srcAccessMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcAccessMask = srcAccessMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageMemoryBarrier & setDstAccessMask( VULKAN_HPP_NAMESPACE::AccessFlags dstAccessMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstAccessMask = dstAccessMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageMemoryBarrier & setOldLayout( VULKAN_HPP_NAMESPACE::ImageLayout oldLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      oldLayout = oldLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageMemoryBarrier & setNewLayout( VULKAN_HPP_NAMESPACE::ImageLayout newLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      newLayout = newLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageMemoryBarrier & setSrcQueueFamilyIndex( uint32_t srcQueueFamilyIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcQueueFamilyIndex = srcQueueFamilyIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageMemoryBarrier & setDstQueueFamilyIndex( uint32_t dstQueueFamilyIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstQueueFamilyIndex = dstQueueFamilyIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageMemoryBarrier & setImage( VULKAN_HPP_NAMESPACE::Image image_ ) VULKAN_HPP_NOEXCEPT\n    {\n      image = image_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageMemoryBarrier &\n      setSubresourceRange( VULKAN_HPP_NAMESPACE::ImageSubresourceRange const & subresourceRange_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subresourceRange = subresourceRange_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageMemoryBarrier const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageMemoryBarrier *>( this );\n    }\n\n    operator VkImageMemoryBarrier &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageMemoryBarrier *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::AccessFlags const &,\n               VULKAN_HPP_NAMESPACE::AccessFlags const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Image const &,\n               VULKAN_HPP_NAMESPACE::ImageSubresourceRange const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, srcAccessMask, dstAccessMask, oldLayout, newLayout, srcQueueFamilyIndex, dstQueueFamilyIndex, image, subresourceRange );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageMemoryBarrier const & ) const = default;\n#else\n    bool operator==( ImageMemoryBarrier const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( srcAccessMask == rhs.srcAccessMask ) && ( dstAccessMask == rhs.dstAccessMask ) &&\n             ( oldLayout == rhs.oldLayout ) && ( newLayout == rhs.newLayout ) && ( srcQueueFamilyIndex == rhs.srcQueueFamilyIndex ) &&\n             ( dstQueueFamilyIndex == rhs.dstQueueFamilyIndex ) && ( image == rhs.image ) && ( subresourceRange == rhs.subresourceRange );\n#  endif\n    }\n\n    bool operator!=( ImageMemoryBarrier const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType         sType               = StructureType::eImageMemoryBarrier;\n    const void *                                pNext               = {};\n    VULKAN_HPP_NAMESPACE::AccessFlags           srcAccessMask       = {};\n    VULKAN_HPP_NAMESPACE::AccessFlags           dstAccessMask       = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout           oldLayout           = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    VULKAN_HPP_NAMESPACE::ImageLayout           newLayout           = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    uint32_t                                    srcQueueFamilyIndex = {};\n    uint32_t                                    dstQueueFamilyIndex = {};\n    VULKAN_HPP_NAMESPACE::Image                 image               = {};\n    VULKAN_HPP_NAMESPACE::ImageSubresourceRange subresourceRange    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageMemoryBarrier>\n  {\n    using Type = ImageMemoryBarrier;\n  };\n\n  struct ImageMemoryRequirementsInfo2\n  {\n    using NativeType = VkImageMemoryRequirementsInfo2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageMemoryRequirementsInfo2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageMemoryRequirementsInfo2( VULKAN_HPP_NAMESPACE::Image image_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , image{ image_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageMemoryRequirementsInfo2( ImageMemoryRequirementsInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageMemoryRequirementsInfo2( VkImageMemoryRequirementsInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageMemoryRequirementsInfo2( *reinterpret_cast<ImageMemoryRequirementsInfo2 const *>( &rhs ) )\n    {\n    }\n\n    ImageMemoryRequirementsInfo2 & operator=( ImageMemoryRequirementsInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageMemoryRequirementsInfo2 & operator=( VkImageMemoryRequirementsInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageMemoryRequirementsInfo2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageMemoryRequirementsInfo2 & setImage( VULKAN_HPP_NAMESPACE::Image image_ ) VULKAN_HPP_NOEXCEPT\n    {\n      image = image_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageMemoryRequirementsInfo2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageMemoryRequirementsInfo2 *>( this );\n    }\n\n    operator VkImageMemoryRequirementsInfo2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageMemoryRequirementsInfo2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Image const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, image );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageMemoryRequirementsInfo2 const & ) const = default;\n#else\n    bool operator==( ImageMemoryRequirementsInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( image == rhs.image );\n#  endif\n    }\n\n    bool operator!=( ImageMemoryRequirementsInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType = StructureType::eImageMemoryRequirementsInfo2;\n    const void *                        pNext = {};\n    VULKAN_HPP_NAMESPACE::Image         image = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageMemoryRequirementsInfo2>\n  {\n    using Type = ImageMemoryRequirementsInfo2;\n  };\n\n  using ImageMemoryRequirementsInfo2KHR = ImageMemoryRequirementsInfo2;\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  struct ImagePipeSurfaceCreateInfoFUCHSIA\n  {\n    using NativeType = VkImagePipeSurfaceCreateInfoFUCHSIA;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImagepipeSurfaceCreateInfoFUCHSIA;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImagePipeSurfaceCreateInfoFUCHSIA( VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateFlagsFUCHSIA flags_           = {},\n                                                            zx_handle_t                                              imagePipeHandle_ = {},\n                                                            const void *                                             pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , imagePipeHandle{ imagePipeHandle_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImagePipeSurfaceCreateInfoFUCHSIA( ImagePipeSurfaceCreateInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImagePipeSurfaceCreateInfoFUCHSIA( VkImagePipeSurfaceCreateInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImagePipeSurfaceCreateInfoFUCHSIA( *reinterpret_cast<ImagePipeSurfaceCreateInfoFUCHSIA const *>( &rhs ) )\n    {\n    }\n\n    ImagePipeSurfaceCreateInfoFUCHSIA & operator=( ImagePipeSurfaceCreateInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImagePipeSurfaceCreateInfoFUCHSIA & operator=( VkImagePipeSurfaceCreateInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateInfoFUCHSIA const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImagePipeSurfaceCreateInfoFUCHSIA & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImagePipeSurfaceCreateInfoFUCHSIA & setFlags( VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateFlagsFUCHSIA flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImagePipeSurfaceCreateInfoFUCHSIA & setImagePipeHandle( zx_handle_t imagePipeHandle_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imagePipeHandle = imagePipeHandle_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImagePipeSurfaceCreateInfoFUCHSIA const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImagePipeSurfaceCreateInfoFUCHSIA *>( this );\n    }\n\n    operator VkImagePipeSurfaceCreateInfoFUCHSIA &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImagePipeSurfaceCreateInfoFUCHSIA *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateFlagsFUCHSIA const &,\n               zx_handle_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, imagePipeHandle );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( ImagePipeSurfaceCreateInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = flags <=> rhs.flags; cmp != 0 )\n        return cmp;\n      if ( auto cmp = memcmp( &imagePipeHandle, &rhs.imagePipeHandle, sizeof( zx_handle_t ) ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#  endif\n\n    bool operator==( ImagePipeSurfaceCreateInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) &&\n             ( memcmp( &imagePipeHandle, &rhs.imagePipeHandle, sizeof( zx_handle_t ) ) == 0 );\n    }\n\n    bool operator!=( ImagePipeSurfaceCreateInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                      sType           = StructureType::eImagepipeSurfaceCreateInfoFUCHSIA;\n    const void *                                             pNext           = {};\n    VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateFlagsFUCHSIA flags           = {};\n    zx_handle_t                                              imagePipeHandle = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImagepipeSurfaceCreateInfoFUCHSIA>\n  {\n    using Type = ImagePipeSurfaceCreateInfoFUCHSIA;\n  };\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  struct ImagePlaneMemoryRequirementsInfo\n  {\n    using NativeType = VkImagePlaneMemoryRequirementsInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImagePlaneMemoryRequirementsInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      ImagePlaneMemoryRequirementsInfo( VULKAN_HPP_NAMESPACE::ImageAspectFlagBits planeAspect_ = VULKAN_HPP_NAMESPACE::ImageAspectFlagBits::eColor,\n                                        const void *                              pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , planeAspect{ planeAspect_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImagePlaneMemoryRequirementsInfo( ImagePlaneMemoryRequirementsInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImagePlaneMemoryRequirementsInfo( VkImagePlaneMemoryRequirementsInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImagePlaneMemoryRequirementsInfo( *reinterpret_cast<ImagePlaneMemoryRequirementsInfo const *>( &rhs ) )\n    {\n    }\n\n    ImagePlaneMemoryRequirementsInfo & operator=( ImagePlaneMemoryRequirementsInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImagePlaneMemoryRequirementsInfo & operator=( VkImagePlaneMemoryRequirementsInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImagePlaneMemoryRequirementsInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImagePlaneMemoryRequirementsInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImagePlaneMemoryRequirementsInfo & setPlaneAspect( VULKAN_HPP_NAMESPACE::ImageAspectFlagBits planeAspect_ ) VULKAN_HPP_NOEXCEPT\n    {\n      planeAspect = planeAspect_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImagePlaneMemoryRequirementsInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImagePlaneMemoryRequirementsInfo *>( this );\n    }\n\n    operator VkImagePlaneMemoryRequirementsInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImagePlaneMemoryRequirementsInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ImageAspectFlagBits const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, planeAspect );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImagePlaneMemoryRequirementsInfo const & ) const = default;\n#else\n    bool operator==( ImagePlaneMemoryRequirementsInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( planeAspect == rhs.planeAspect );\n#  endif\n    }\n\n    bool operator!=( ImagePlaneMemoryRequirementsInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType       = StructureType::eImagePlaneMemoryRequirementsInfo;\n    const void *                              pNext       = {};\n    VULKAN_HPP_NAMESPACE::ImageAspectFlagBits planeAspect = VULKAN_HPP_NAMESPACE::ImageAspectFlagBits::eColor;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImagePlaneMemoryRequirementsInfo>\n  {\n    using Type = ImagePlaneMemoryRequirementsInfo;\n  };\n\n  using ImagePlaneMemoryRequirementsInfoKHR = ImagePlaneMemoryRequirementsInfo;\n\n  struct ImageResolve\n  {\n    using NativeType = VkImageResolve;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageResolve( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers srcSubresource_ = {},\n                                       VULKAN_HPP_NAMESPACE::Offset3D               srcOffset_      = {},\n                                       VULKAN_HPP_NAMESPACE::ImageSubresourceLayers dstSubresource_ = {},\n                                       VULKAN_HPP_NAMESPACE::Offset3D               dstOffset_      = {},\n                                       VULKAN_HPP_NAMESPACE::Extent3D               extent_         = {} ) VULKAN_HPP_NOEXCEPT\n      : srcSubresource{ srcSubresource_ }\n      , srcOffset{ srcOffset_ }\n      , dstSubresource{ dstSubresource_ }\n      , dstOffset{ dstOffset_ }\n      , extent{ extent_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageResolve( ImageResolve const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageResolve( VkImageResolve const & rhs ) VULKAN_HPP_NOEXCEPT : ImageResolve( *reinterpret_cast<ImageResolve const *>( &rhs ) ) {}\n\n    ImageResolve & operator=( ImageResolve const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageResolve & operator=( VkImageResolve const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageResolve const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageResolve & setSrcSubresource( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const & srcSubresource_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcSubresource = srcSubresource_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageResolve & setSrcOffset( VULKAN_HPP_NAMESPACE::Offset3D const & srcOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcOffset = srcOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageResolve & setDstSubresource( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const & dstSubresource_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstSubresource = dstSubresource_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageResolve & setDstOffset( VULKAN_HPP_NAMESPACE::Offset3D const & dstOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstOffset = dstOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageResolve & setExtent( VULKAN_HPP_NAMESPACE::Extent3D const & extent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extent = extent_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageResolve const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageResolve *>( this );\n    }\n\n    operator VkImageResolve &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageResolve *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const &,\n               VULKAN_HPP_NAMESPACE::Offset3D const &,\n               VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const &,\n               VULKAN_HPP_NAMESPACE::Offset3D const &,\n               VULKAN_HPP_NAMESPACE::Extent3D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( srcSubresource, srcOffset, dstSubresource, dstOffset, extent );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageResolve const & ) const = default;\n#else\n    bool operator==( ImageResolve const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( srcSubresource == rhs.srcSubresource ) && ( srcOffset == rhs.srcOffset ) && ( dstSubresource == rhs.dstSubresource ) &&\n             ( dstOffset == rhs.dstOffset ) && ( extent == rhs.extent );\n#  endif\n    }\n\n    bool operator!=( ImageResolve const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::ImageSubresourceLayers srcSubresource = {};\n    VULKAN_HPP_NAMESPACE::Offset3D               srcOffset      = {};\n    VULKAN_HPP_NAMESPACE::ImageSubresourceLayers dstSubresource = {};\n    VULKAN_HPP_NAMESPACE::Offset3D               dstOffset      = {};\n    VULKAN_HPP_NAMESPACE::Extent3D               extent         = {};\n  };\n\n  struct ImageResolve2\n  {\n    using NativeType = VkImageResolve2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageResolve2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageResolve2( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers srcSubresource_ = {},\n                                        VULKAN_HPP_NAMESPACE::Offset3D               srcOffset_      = {},\n                                        VULKAN_HPP_NAMESPACE::ImageSubresourceLayers dstSubresource_ = {},\n                                        VULKAN_HPP_NAMESPACE::Offset3D               dstOffset_      = {},\n                                        VULKAN_HPP_NAMESPACE::Extent3D               extent_         = {},\n                                        const void *                                 pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , srcSubresource{ srcSubresource_ }\n      , srcOffset{ srcOffset_ }\n      , dstSubresource{ dstSubresource_ }\n      , dstOffset{ dstOffset_ }\n      , extent{ extent_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageResolve2( ImageResolve2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageResolve2( VkImageResolve2 const & rhs ) VULKAN_HPP_NOEXCEPT : ImageResolve2( *reinterpret_cast<ImageResolve2 const *>( &rhs ) ) {}\n\n    ImageResolve2 & operator=( ImageResolve2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageResolve2 & operator=( VkImageResolve2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageResolve2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageResolve2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageResolve2 & setSrcSubresource( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const & srcSubresource_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcSubresource = srcSubresource_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageResolve2 & setSrcOffset( VULKAN_HPP_NAMESPACE::Offset3D const & srcOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcOffset = srcOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageResolve2 & setDstSubresource( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const & dstSubresource_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstSubresource = dstSubresource_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageResolve2 & setDstOffset( VULKAN_HPP_NAMESPACE::Offset3D const & dstOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstOffset = dstOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageResolve2 & setExtent( VULKAN_HPP_NAMESPACE::Extent3D const & extent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extent = extent_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageResolve2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageResolve2 *>( this );\n    }\n\n    operator VkImageResolve2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageResolve2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const &,\n               VULKAN_HPP_NAMESPACE::Offset3D const &,\n               VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const &,\n               VULKAN_HPP_NAMESPACE::Offset3D const &,\n               VULKAN_HPP_NAMESPACE::Extent3D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, srcSubresource, srcOffset, dstSubresource, dstOffset, extent );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageResolve2 const & ) const = default;\n#else\n    bool operator==( ImageResolve2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( srcSubresource == rhs.srcSubresource ) && ( srcOffset == rhs.srcOffset ) &&\n             ( dstSubresource == rhs.dstSubresource ) && ( dstOffset == rhs.dstOffset ) && ( extent == rhs.extent );\n#  endif\n    }\n\n    bool operator!=( ImageResolve2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType          = StructureType::eImageResolve2;\n    const void *                                 pNext          = {};\n    VULKAN_HPP_NAMESPACE::ImageSubresourceLayers srcSubresource = {};\n    VULKAN_HPP_NAMESPACE::Offset3D               srcOffset      = {};\n    VULKAN_HPP_NAMESPACE::ImageSubresourceLayers dstSubresource = {};\n    VULKAN_HPP_NAMESPACE::Offset3D               dstOffset      = {};\n    VULKAN_HPP_NAMESPACE::Extent3D               extent         = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageResolve2>\n  {\n    using Type = ImageResolve2;\n  };\n\n  using ImageResolve2KHR = ImageResolve2;\n\n  struct ImageSparseMemoryRequirementsInfo2\n  {\n    using NativeType = VkImageSparseMemoryRequirementsInfo2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageSparseMemoryRequirementsInfo2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageSparseMemoryRequirementsInfo2( VULKAN_HPP_NAMESPACE::Image image_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , image{ image_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageSparseMemoryRequirementsInfo2( ImageSparseMemoryRequirementsInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageSparseMemoryRequirementsInfo2( VkImageSparseMemoryRequirementsInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageSparseMemoryRequirementsInfo2( *reinterpret_cast<ImageSparseMemoryRequirementsInfo2 const *>( &rhs ) )\n    {\n    }\n\n    ImageSparseMemoryRequirementsInfo2 & operator=( ImageSparseMemoryRequirementsInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageSparseMemoryRequirementsInfo2 & operator=( VkImageSparseMemoryRequirementsInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageSparseMemoryRequirementsInfo2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageSparseMemoryRequirementsInfo2 & setImage( VULKAN_HPP_NAMESPACE::Image image_ ) VULKAN_HPP_NOEXCEPT\n    {\n      image = image_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageSparseMemoryRequirementsInfo2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageSparseMemoryRequirementsInfo2 *>( this );\n    }\n\n    operator VkImageSparseMemoryRequirementsInfo2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageSparseMemoryRequirementsInfo2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Image const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, image );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageSparseMemoryRequirementsInfo2 const & ) const = default;\n#else\n    bool operator==( ImageSparseMemoryRequirementsInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( image == rhs.image );\n#  endif\n    }\n\n    bool operator!=( ImageSparseMemoryRequirementsInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType = StructureType::eImageSparseMemoryRequirementsInfo2;\n    const void *                        pNext = {};\n    VULKAN_HPP_NAMESPACE::Image         image = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageSparseMemoryRequirementsInfo2>\n  {\n    using Type = ImageSparseMemoryRequirementsInfo2;\n  };\n\n  using ImageSparseMemoryRequirementsInfo2KHR = ImageSparseMemoryRequirementsInfo2;\n\n  struct ImageStencilUsageCreateInfo\n  {\n    using NativeType = VkImageStencilUsageCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageStencilUsageCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageStencilUsageCreateInfo( VULKAN_HPP_NAMESPACE::ImageUsageFlags stencilUsage_ = {},\n                                                      const void *                          pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stencilUsage{ stencilUsage_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageStencilUsageCreateInfo( ImageStencilUsageCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageStencilUsageCreateInfo( VkImageStencilUsageCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageStencilUsageCreateInfo( *reinterpret_cast<ImageStencilUsageCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    ImageStencilUsageCreateInfo & operator=( ImageStencilUsageCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageStencilUsageCreateInfo & operator=( VkImageStencilUsageCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageStencilUsageCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageStencilUsageCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageStencilUsageCreateInfo & setStencilUsage( VULKAN_HPP_NAMESPACE::ImageUsageFlags stencilUsage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stencilUsage = stencilUsage_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageStencilUsageCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageStencilUsageCreateInfo *>( this );\n    }\n\n    operator VkImageStencilUsageCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageStencilUsageCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ImageUsageFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stencilUsage );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageStencilUsageCreateInfo const & ) const = default;\n#else\n    bool operator==( ImageStencilUsageCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( stencilUsage == rhs.stencilUsage );\n#  endif\n    }\n\n    bool operator!=( ImageStencilUsageCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType   sType        = StructureType::eImageStencilUsageCreateInfo;\n    const void *                          pNext        = {};\n    VULKAN_HPP_NAMESPACE::ImageUsageFlags stencilUsage = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageStencilUsageCreateInfo>\n  {\n    using Type = ImageStencilUsageCreateInfo;\n  };\n\n  using ImageStencilUsageCreateInfoEXT = ImageStencilUsageCreateInfo;\n\n  struct ImageSwapchainCreateInfoKHR\n  {\n    using NativeType = VkImageSwapchainCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageSwapchainCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageSwapchainCreateInfoKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , swapchain{ swapchain_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageSwapchainCreateInfoKHR( ImageSwapchainCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageSwapchainCreateInfoKHR( VkImageSwapchainCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageSwapchainCreateInfoKHR( *reinterpret_cast<ImageSwapchainCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    ImageSwapchainCreateInfoKHR & operator=( ImageSwapchainCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageSwapchainCreateInfoKHR & operator=( VkImageSwapchainCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageSwapchainCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageSwapchainCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageSwapchainCreateInfoKHR & setSwapchain( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain_ ) VULKAN_HPP_NOEXCEPT\n    {\n      swapchain = swapchain_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageSwapchainCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageSwapchainCreateInfoKHR *>( this );\n    }\n\n    operator VkImageSwapchainCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageSwapchainCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::SwapchainKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, swapchain );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageSwapchainCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( ImageSwapchainCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( swapchain == rhs.swapchain );\n#  endif\n    }\n\n    bool operator!=( ImageSwapchainCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType     = StructureType::eImageSwapchainCreateInfoKHR;\n    const void *                        pNext     = {};\n    VULKAN_HPP_NAMESPACE::SwapchainKHR  swapchain = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageSwapchainCreateInfoKHR>\n  {\n    using Type = ImageSwapchainCreateInfoKHR;\n  };\n\n  struct ImageViewASTCDecodeModeEXT\n  {\n    using NativeType = VkImageViewASTCDecodeModeEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageViewAstcDecodeModeEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageViewASTCDecodeModeEXT( VULKAN_HPP_NAMESPACE::Format decodeMode_ = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                                     const void *                 pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , decodeMode{ decodeMode_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageViewASTCDecodeModeEXT( ImageViewASTCDecodeModeEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageViewASTCDecodeModeEXT( VkImageViewASTCDecodeModeEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageViewASTCDecodeModeEXT( *reinterpret_cast<ImageViewASTCDecodeModeEXT const *>( &rhs ) )\n    {\n    }\n\n    ImageViewASTCDecodeModeEXT & operator=( ImageViewASTCDecodeModeEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageViewASTCDecodeModeEXT & operator=( VkImageViewASTCDecodeModeEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageViewASTCDecodeModeEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageViewASTCDecodeModeEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageViewASTCDecodeModeEXT & setDecodeMode( VULKAN_HPP_NAMESPACE::Format decodeMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      decodeMode = decodeMode_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageViewASTCDecodeModeEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageViewASTCDecodeModeEXT *>( this );\n    }\n\n    operator VkImageViewASTCDecodeModeEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageViewASTCDecodeModeEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Format const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, decodeMode );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageViewASTCDecodeModeEXT const & ) const = default;\n#else\n    bool operator==( ImageViewASTCDecodeModeEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( decodeMode == rhs.decodeMode );\n#  endif\n    }\n\n    bool operator!=( ImageViewASTCDecodeModeEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType      = StructureType::eImageViewAstcDecodeModeEXT;\n    const void *                        pNext      = {};\n    VULKAN_HPP_NAMESPACE::Format        decodeMode = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageViewAstcDecodeModeEXT>\n  {\n    using Type = ImageViewASTCDecodeModeEXT;\n  };\n\n  struct ImageViewAddressPropertiesNVX\n  {\n    using NativeType = VkImageViewAddressPropertiesNVX;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageViewAddressPropertiesNVX;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageViewAddressPropertiesNVX( VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress_ = {},\n                                                        VULKAN_HPP_NAMESPACE::DeviceSize    size_          = {},\n                                                        void *                              pNext_         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , deviceAddress{ deviceAddress_ }\n      , size{ size_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageViewAddressPropertiesNVX( ImageViewAddressPropertiesNVX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageViewAddressPropertiesNVX( VkImageViewAddressPropertiesNVX const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageViewAddressPropertiesNVX( *reinterpret_cast<ImageViewAddressPropertiesNVX const *>( &rhs ) )\n    {\n    }\n\n    ImageViewAddressPropertiesNVX & operator=( ImageViewAddressPropertiesNVX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageViewAddressPropertiesNVX & operator=( VkImageViewAddressPropertiesNVX const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageViewAddressPropertiesNVX const *>( &rhs );\n      return *this;\n    }\n\n    operator VkImageViewAddressPropertiesNVX const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageViewAddressPropertiesNVX *>( this );\n    }\n\n    operator VkImageViewAddressPropertiesNVX &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageViewAddressPropertiesNVX *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::\n      tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::DeviceAddress const &, VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, deviceAddress, size );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageViewAddressPropertiesNVX const & ) const = default;\n#else\n    bool operator==( ImageViewAddressPropertiesNVX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( deviceAddress == rhs.deviceAddress ) && ( size == rhs.size );\n#  endif\n    }\n\n    bool operator!=( ImageViewAddressPropertiesNVX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType         = StructureType::eImageViewAddressPropertiesNVX;\n    void *                              pNext         = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    size          = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageViewAddressPropertiesNVX>\n  {\n    using Type = ImageViewAddressPropertiesNVX;\n  };\n\n  struct ImageViewCaptureDescriptorDataInfoEXT\n  {\n    using NativeType = VkImageViewCaptureDescriptorDataInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageViewCaptureDescriptorDataInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageViewCaptureDescriptorDataInfoEXT( VULKAN_HPP_NAMESPACE::ImageView imageView_ = {},\n                                                                const void *                    pNext_     = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , imageView{ imageView_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageViewCaptureDescriptorDataInfoEXT( ImageViewCaptureDescriptorDataInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageViewCaptureDescriptorDataInfoEXT( VkImageViewCaptureDescriptorDataInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageViewCaptureDescriptorDataInfoEXT( *reinterpret_cast<ImageViewCaptureDescriptorDataInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    ImageViewCaptureDescriptorDataInfoEXT & operator=( ImageViewCaptureDescriptorDataInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageViewCaptureDescriptorDataInfoEXT & operator=( VkImageViewCaptureDescriptorDataInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageViewCaptureDescriptorDataInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageViewCaptureDescriptorDataInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageViewCaptureDescriptorDataInfoEXT & setImageView( VULKAN_HPP_NAMESPACE::ImageView imageView_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageView = imageView_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageViewCaptureDescriptorDataInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageViewCaptureDescriptorDataInfoEXT *>( this );\n    }\n\n    operator VkImageViewCaptureDescriptorDataInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageViewCaptureDescriptorDataInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ImageView const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, imageView );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageViewCaptureDescriptorDataInfoEXT const & ) const = default;\n#else\n    bool operator==( ImageViewCaptureDescriptorDataInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( imageView == rhs.imageView );\n#  endif\n    }\n\n    bool operator!=( ImageViewCaptureDescriptorDataInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType     = StructureType::eImageViewCaptureDescriptorDataInfoEXT;\n    const void *                        pNext     = {};\n    VULKAN_HPP_NAMESPACE::ImageView     imageView = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageViewCaptureDescriptorDataInfoEXT>\n  {\n    using Type = ImageViewCaptureDescriptorDataInfoEXT;\n  };\n\n  struct ImageViewCreateInfo\n  {\n    using NativeType = VkImageViewCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageViewCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageViewCreateInfo( VULKAN_HPP_NAMESPACE::ImageViewCreateFlags  flags_            = {},\n                                              VULKAN_HPP_NAMESPACE::Image                 image_            = {},\n                                              VULKAN_HPP_NAMESPACE::ImageViewType         viewType_         = VULKAN_HPP_NAMESPACE::ImageViewType::e1D,\n                                              VULKAN_HPP_NAMESPACE::Format                format_           = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                              VULKAN_HPP_NAMESPACE::ComponentMapping      components_       = {},\n                                              VULKAN_HPP_NAMESPACE::ImageSubresourceRange subresourceRange_ = {},\n                                              const void *                                pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , image{ image_ }\n      , viewType{ viewType_ }\n      , format{ format_ }\n      , components{ components_ }\n      , subresourceRange{ subresourceRange_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageViewCreateInfo( ImageViewCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageViewCreateInfo( VkImageViewCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT : ImageViewCreateInfo( *reinterpret_cast<ImageViewCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    ImageViewCreateInfo & operator=( ImageViewCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageViewCreateInfo & operator=( VkImageViewCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageViewCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageViewCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageViewCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::ImageViewCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageViewCreateInfo & setImage( VULKAN_HPP_NAMESPACE::Image image_ ) VULKAN_HPP_NOEXCEPT\n    {\n      image = image_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageViewCreateInfo & setViewType( VULKAN_HPP_NAMESPACE::ImageViewType viewType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      viewType = viewType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageViewCreateInfo & setFormat( VULKAN_HPP_NAMESPACE::Format format_ ) VULKAN_HPP_NOEXCEPT\n    {\n      format = format_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageViewCreateInfo & setComponents( VULKAN_HPP_NAMESPACE::ComponentMapping const & components_ ) VULKAN_HPP_NOEXCEPT\n    {\n      components = components_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageViewCreateInfo &\n      setSubresourceRange( VULKAN_HPP_NAMESPACE::ImageSubresourceRange const & subresourceRange_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subresourceRange = subresourceRange_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageViewCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageViewCreateInfo *>( this );\n    }\n\n    operator VkImageViewCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageViewCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ImageViewCreateFlags const &,\n               VULKAN_HPP_NAMESPACE::Image const &,\n               VULKAN_HPP_NAMESPACE::ImageViewType const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::ComponentMapping const &,\n               VULKAN_HPP_NAMESPACE::ImageSubresourceRange const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, image, viewType, format, components, subresourceRange );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageViewCreateInfo const & ) const = default;\n#else\n    bool operator==( ImageViewCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( image == rhs.image ) && ( viewType == rhs.viewType ) &&\n             ( format == rhs.format ) && ( components == rhs.components ) && ( subresourceRange == rhs.subresourceRange );\n#  endif\n    }\n\n    bool operator!=( ImageViewCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType         sType            = StructureType::eImageViewCreateInfo;\n    const void *                                pNext            = {};\n    VULKAN_HPP_NAMESPACE::ImageViewCreateFlags  flags            = {};\n    VULKAN_HPP_NAMESPACE::Image                 image            = {};\n    VULKAN_HPP_NAMESPACE::ImageViewType         viewType         = VULKAN_HPP_NAMESPACE::ImageViewType::e1D;\n    VULKAN_HPP_NAMESPACE::Format                format           = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::ComponentMapping      components       = {};\n    VULKAN_HPP_NAMESPACE::ImageSubresourceRange subresourceRange = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageViewCreateInfo>\n  {\n    using Type = ImageViewCreateInfo;\n  };\n\n  struct ImageViewHandleInfoNVX\n  {\n    using NativeType = VkImageViewHandleInfoNVX;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageViewHandleInfoNVX;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageViewHandleInfoNVX( VULKAN_HPP_NAMESPACE::ImageView      imageView_      = {},\n                                                 VULKAN_HPP_NAMESPACE::DescriptorType descriptorType_ = VULKAN_HPP_NAMESPACE::DescriptorType::eSampler,\n                                                 VULKAN_HPP_NAMESPACE::Sampler        sampler_        = {},\n                                                 const void *                         pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , imageView{ imageView_ }\n      , descriptorType{ descriptorType_ }\n      , sampler{ sampler_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageViewHandleInfoNVX( ImageViewHandleInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageViewHandleInfoNVX( VkImageViewHandleInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageViewHandleInfoNVX( *reinterpret_cast<ImageViewHandleInfoNVX const *>( &rhs ) )\n    {\n    }\n\n    ImageViewHandleInfoNVX & operator=( ImageViewHandleInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageViewHandleInfoNVX & operator=( VkImageViewHandleInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageViewHandleInfoNVX const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageViewHandleInfoNVX & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageViewHandleInfoNVX & setImageView( VULKAN_HPP_NAMESPACE::ImageView imageView_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageView = imageView_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageViewHandleInfoNVX & setDescriptorType( VULKAN_HPP_NAMESPACE::DescriptorType descriptorType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorType = descriptorType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageViewHandleInfoNVX & setSampler( VULKAN_HPP_NAMESPACE::Sampler sampler_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sampler = sampler_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageViewHandleInfoNVX const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageViewHandleInfoNVX *>( this );\n    }\n\n    operator VkImageViewHandleInfoNVX &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageViewHandleInfoNVX *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ImageView const &,\n               VULKAN_HPP_NAMESPACE::DescriptorType const &,\n               VULKAN_HPP_NAMESPACE::Sampler const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, imageView, descriptorType, sampler );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageViewHandleInfoNVX const & ) const = default;\n#else\n    bool operator==( ImageViewHandleInfoNVX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( imageView == rhs.imageView ) && ( descriptorType == rhs.descriptorType ) &&\n             ( sampler == rhs.sampler );\n#  endif\n    }\n\n    bool operator!=( ImageViewHandleInfoNVX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType  sType          = StructureType::eImageViewHandleInfoNVX;\n    const void *                         pNext          = {};\n    VULKAN_HPP_NAMESPACE::ImageView      imageView      = {};\n    VULKAN_HPP_NAMESPACE::DescriptorType descriptorType = VULKAN_HPP_NAMESPACE::DescriptorType::eSampler;\n    VULKAN_HPP_NAMESPACE::Sampler        sampler        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageViewHandleInfoNVX>\n  {\n    using Type = ImageViewHandleInfoNVX;\n  };\n\n  struct ImageViewMinLodCreateInfoEXT\n  {\n    using NativeType = VkImageViewMinLodCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageViewMinLodCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageViewMinLodCreateInfoEXT( float minLod_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , minLod{ minLod_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageViewMinLodCreateInfoEXT( ImageViewMinLodCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageViewMinLodCreateInfoEXT( VkImageViewMinLodCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageViewMinLodCreateInfoEXT( *reinterpret_cast<ImageViewMinLodCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    ImageViewMinLodCreateInfoEXT & operator=( ImageViewMinLodCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageViewMinLodCreateInfoEXT & operator=( VkImageViewMinLodCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageViewMinLodCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageViewMinLodCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageViewMinLodCreateInfoEXT & setMinLod( float minLod_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minLod = minLod_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageViewMinLodCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageViewMinLodCreateInfoEXT *>( this );\n    }\n\n    operator VkImageViewMinLodCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageViewMinLodCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, float const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, minLod );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageViewMinLodCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( ImageViewMinLodCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( minLod == rhs.minLod );\n#  endif\n    }\n\n    bool operator!=( ImageViewMinLodCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType  = StructureType::eImageViewMinLodCreateInfoEXT;\n    const void *                        pNext  = {};\n    float                               minLod = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageViewMinLodCreateInfoEXT>\n  {\n    using Type = ImageViewMinLodCreateInfoEXT;\n  };\n\n  struct ImageViewSampleWeightCreateInfoQCOM\n  {\n    using NativeType = VkImageViewSampleWeightCreateInfoQCOM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageViewSampleWeightCreateInfoQCOM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageViewSampleWeightCreateInfoQCOM( VULKAN_HPP_NAMESPACE::Offset2D filterCenter_ = {},\n                                                              VULKAN_HPP_NAMESPACE::Extent2D filterSize_   = {},\n                                                              uint32_t                       numPhases_    = {},\n                                                              const void *                   pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , filterCenter{ filterCenter_ }\n      , filterSize{ filterSize_ }\n      , numPhases{ numPhases_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageViewSampleWeightCreateInfoQCOM( ImageViewSampleWeightCreateInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageViewSampleWeightCreateInfoQCOM( VkImageViewSampleWeightCreateInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageViewSampleWeightCreateInfoQCOM( *reinterpret_cast<ImageViewSampleWeightCreateInfoQCOM const *>( &rhs ) )\n    {\n    }\n\n    ImageViewSampleWeightCreateInfoQCOM & operator=( ImageViewSampleWeightCreateInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageViewSampleWeightCreateInfoQCOM & operator=( VkImageViewSampleWeightCreateInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageViewSampleWeightCreateInfoQCOM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageViewSampleWeightCreateInfoQCOM & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageViewSampleWeightCreateInfoQCOM & setFilterCenter( VULKAN_HPP_NAMESPACE::Offset2D const & filterCenter_ ) VULKAN_HPP_NOEXCEPT\n    {\n      filterCenter = filterCenter_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageViewSampleWeightCreateInfoQCOM & setFilterSize( VULKAN_HPP_NAMESPACE::Extent2D const & filterSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      filterSize = filterSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageViewSampleWeightCreateInfoQCOM & setNumPhases( uint32_t numPhases_ ) VULKAN_HPP_NOEXCEPT\n    {\n      numPhases = numPhases_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageViewSampleWeightCreateInfoQCOM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageViewSampleWeightCreateInfoQCOM *>( this );\n    }\n\n    operator VkImageViewSampleWeightCreateInfoQCOM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageViewSampleWeightCreateInfoQCOM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Offset2D const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, filterCenter, filterSize, numPhases );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageViewSampleWeightCreateInfoQCOM const & ) const = default;\n#else\n    bool operator==( ImageViewSampleWeightCreateInfoQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( filterCenter == rhs.filterCenter ) && ( filterSize == rhs.filterSize ) &&\n             ( numPhases == rhs.numPhases );\n#  endif\n    }\n\n    bool operator!=( ImageViewSampleWeightCreateInfoQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType        = StructureType::eImageViewSampleWeightCreateInfoQCOM;\n    const void *                        pNext        = {};\n    VULKAN_HPP_NAMESPACE::Offset2D      filterCenter = {};\n    VULKAN_HPP_NAMESPACE::Extent2D      filterSize   = {};\n    uint32_t                            numPhases    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageViewSampleWeightCreateInfoQCOM>\n  {\n    using Type = ImageViewSampleWeightCreateInfoQCOM;\n  };\n\n  struct ImageViewSlicedCreateInfoEXT\n  {\n    using NativeType = VkImageViewSlicedCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageViewSlicedCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      ImageViewSlicedCreateInfoEXT( uint32_t sliceOffset_ = {}, uint32_t sliceCount_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , sliceOffset{ sliceOffset_ }\n      , sliceCount{ sliceCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageViewSlicedCreateInfoEXT( ImageViewSlicedCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageViewSlicedCreateInfoEXT( VkImageViewSlicedCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageViewSlicedCreateInfoEXT( *reinterpret_cast<ImageViewSlicedCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    ImageViewSlicedCreateInfoEXT & operator=( ImageViewSlicedCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageViewSlicedCreateInfoEXT & operator=( VkImageViewSlicedCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageViewSlicedCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageViewSlicedCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageViewSlicedCreateInfoEXT & setSliceOffset( uint32_t sliceOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sliceOffset = sliceOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageViewSlicedCreateInfoEXT & setSliceCount( uint32_t sliceCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sliceCount = sliceCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageViewSlicedCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageViewSlicedCreateInfoEXT *>( this );\n    }\n\n    operator VkImageViewSlicedCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageViewSlicedCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, sliceOffset, sliceCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageViewSlicedCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( ImageViewSlicedCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( sliceOffset == rhs.sliceOffset ) && ( sliceCount == rhs.sliceCount );\n#  endif\n    }\n\n    bool operator!=( ImageViewSlicedCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType       = StructureType::eImageViewSlicedCreateInfoEXT;\n    const void *                        pNext       = {};\n    uint32_t                            sliceOffset = {};\n    uint32_t                            sliceCount  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageViewSlicedCreateInfoEXT>\n  {\n    using Type = ImageViewSlicedCreateInfoEXT;\n  };\n\n  struct ImageViewUsageCreateInfo\n  {\n    using NativeType = VkImageViewUsageCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImageViewUsageCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImageViewUsageCreateInfo( VULKAN_HPP_NAMESPACE::ImageUsageFlags usage_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , usage{ usage_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImageViewUsageCreateInfo( ImageViewUsageCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImageViewUsageCreateInfo( VkImageViewUsageCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImageViewUsageCreateInfo( *reinterpret_cast<ImageViewUsageCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    ImageViewUsageCreateInfo & operator=( ImageViewUsageCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImageViewUsageCreateInfo & operator=( VkImageViewUsageCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImageViewUsageCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImageViewUsageCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImageViewUsageCreateInfo & setUsage( VULKAN_HPP_NAMESPACE::ImageUsageFlags usage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      usage = usage_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImageViewUsageCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImageViewUsageCreateInfo *>( this );\n    }\n\n    operator VkImageViewUsageCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImageViewUsageCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ImageUsageFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, usage );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImageViewUsageCreateInfo const & ) const = default;\n#else\n    bool operator==( ImageViewUsageCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( usage == rhs.usage );\n#  endif\n    }\n\n    bool operator!=( ImageViewUsageCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType   sType = StructureType::eImageViewUsageCreateInfo;\n    const void *                          pNext = {};\n    VULKAN_HPP_NAMESPACE::ImageUsageFlags usage = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImageViewUsageCreateInfo>\n  {\n    using Type = ImageViewUsageCreateInfo;\n  };\n\n  using ImageViewUsageCreateInfoKHR = ImageViewUsageCreateInfo;\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  struct ImportAndroidHardwareBufferInfoANDROID\n  {\n    using NativeType = VkImportAndroidHardwareBufferInfoANDROID;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImportAndroidHardwareBufferInfoANDROID;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImportAndroidHardwareBufferInfoANDROID( struct AHardwareBuffer * buffer_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , buffer{ buffer_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImportAndroidHardwareBufferInfoANDROID( ImportAndroidHardwareBufferInfoANDROID const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImportAndroidHardwareBufferInfoANDROID( VkImportAndroidHardwareBufferInfoANDROID const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImportAndroidHardwareBufferInfoANDROID( *reinterpret_cast<ImportAndroidHardwareBufferInfoANDROID const *>( &rhs ) )\n    {\n    }\n\n    ImportAndroidHardwareBufferInfoANDROID & operator=( ImportAndroidHardwareBufferInfoANDROID const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImportAndroidHardwareBufferInfoANDROID & operator=( VkImportAndroidHardwareBufferInfoANDROID const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImportAndroidHardwareBufferInfoANDROID const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImportAndroidHardwareBufferInfoANDROID & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportAndroidHardwareBufferInfoANDROID & setBuffer( struct AHardwareBuffer * buffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      buffer = buffer_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImportAndroidHardwareBufferInfoANDROID const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImportAndroidHardwareBufferInfoANDROID *>( this );\n    }\n\n    operator VkImportAndroidHardwareBufferInfoANDROID &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImportAndroidHardwareBufferInfoANDROID *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, struct AHardwareBuffer * const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, buffer );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImportAndroidHardwareBufferInfoANDROID const & ) const = default;\n#  else\n    bool operator==( ImportAndroidHardwareBufferInfoANDROID const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( buffer == rhs.buffer );\n#    endif\n    }\n\n    bool operator!=( ImportAndroidHardwareBufferInfoANDROID const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType  = StructureType::eImportAndroidHardwareBufferInfoANDROID;\n    const void *                        pNext  = {};\n    struct AHardwareBuffer *            buffer = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImportAndroidHardwareBufferInfoANDROID>\n  {\n    using Type = ImportAndroidHardwareBufferInfoANDROID;\n  };\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n  struct ImportFenceFdInfoKHR\n  {\n    using NativeType = VkImportFenceFdInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImportFenceFdInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImportFenceFdInfoKHR(\n      VULKAN_HPP_NAMESPACE::Fence                           fence_      = {},\n      VULKAN_HPP_NAMESPACE::FenceImportFlags                flags_      = {},\n      VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits handleType_ = VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits::eOpaqueFd,\n      int                                                   fd_         = {},\n      const void *                                          pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , fence{ fence_ }\n      , flags{ flags_ }\n      , handleType{ handleType_ }\n      , fd{ fd_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImportFenceFdInfoKHR( ImportFenceFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImportFenceFdInfoKHR( VkImportFenceFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImportFenceFdInfoKHR( *reinterpret_cast<ImportFenceFdInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    ImportFenceFdInfoKHR & operator=( ImportFenceFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImportFenceFdInfoKHR & operator=( VkImportFenceFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImportFenceFdInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImportFenceFdInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportFenceFdInfoKHR & setFence( VULKAN_HPP_NAMESPACE::Fence fence_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fence = fence_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportFenceFdInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::FenceImportFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportFenceFdInfoKHR & setHandleType( VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportFenceFdInfoKHR & setFd( int fd_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fd = fd_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImportFenceFdInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImportFenceFdInfoKHR *>( this );\n    }\n\n    operator VkImportFenceFdInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImportFenceFdInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Fence const &,\n               VULKAN_HPP_NAMESPACE::FenceImportFlags const &,\n               VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits const &,\n               int const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, fence, flags, handleType, fd );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImportFenceFdInfoKHR const & ) const = default;\n#else\n    bool operator==( ImportFenceFdInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( fence == rhs.fence ) && ( flags == rhs.flags ) && ( handleType == rhs.handleType ) &&\n             ( fd == rhs.fd );\n#  endif\n    }\n\n    bool operator!=( ImportFenceFdInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                   sType      = StructureType::eImportFenceFdInfoKHR;\n    const void *                                          pNext      = {};\n    VULKAN_HPP_NAMESPACE::Fence                           fence      = {};\n    VULKAN_HPP_NAMESPACE::FenceImportFlags                flags      = {};\n    VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits handleType = VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits::eOpaqueFd;\n    int                                                   fd         = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImportFenceFdInfoKHR>\n  {\n    using Type = ImportFenceFdInfoKHR;\n  };\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  struct ImportFenceWin32HandleInfoKHR\n  {\n    using NativeType = VkImportFenceWin32HandleInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImportFenceWin32HandleInfoKHR;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImportFenceWin32HandleInfoKHR(\n      VULKAN_HPP_NAMESPACE::Fence                           fence_      = {},\n      VULKAN_HPP_NAMESPACE::FenceImportFlags                flags_      = {},\n      VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits handleType_ = VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits::eOpaqueFd,\n      HANDLE                                                handle_     = {},\n      LPCWSTR                                               name_       = {},\n      const void *                                          pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , fence{ fence_ }\n      , flags{ flags_ }\n      , handleType{ handleType_ }\n      , handle{ handle_ }\n      , name{ name_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImportFenceWin32HandleInfoKHR( ImportFenceWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImportFenceWin32HandleInfoKHR( VkImportFenceWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImportFenceWin32HandleInfoKHR( *reinterpret_cast<ImportFenceWin32HandleInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    ImportFenceWin32HandleInfoKHR & operator=( ImportFenceWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImportFenceWin32HandleInfoKHR & operator=( VkImportFenceWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImportFenceWin32HandleInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImportFenceWin32HandleInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportFenceWin32HandleInfoKHR & setFence( VULKAN_HPP_NAMESPACE::Fence fence_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fence = fence_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportFenceWin32HandleInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::FenceImportFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportFenceWin32HandleInfoKHR &\n      setHandleType( VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportFenceWin32HandleInfoKHR & setHandle( HANDLE handle_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handle = handle_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportFenceWin32HandleInfoKHR & setName( LPCWSTR name_ ) VULKAN_HPP_NOEXCEPT\n    {\n      name = name_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImportFenceWin32HandleInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImportFenceWin32HandleInfoKHR *>( this );\n    }\n\n    operator VkImportFenceWin32HandleInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImportFenceWin32HandleInfoKHR *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Fence const &,\n               VULKAN_HPP_NAMESPACE::FenceImportFlags const &,\n               VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits const &,\n               HANDLE const &,\n               LPCWSTR const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, fence, flags, handleType, handle, name );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImportFenceWin32HandleInfoKHR const & ) const = default;\n#  else\n    bool operator==( ImportFenceWin32HandleInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( fence == rhs.fence ) && ( flags == rhs.flags ) && ( handleType == rhs.handleType ) &&\n             ( handle == rhs.handle ) && ( name == rhs.name );\n#    endif\n    }\n\n    bool operator!=( ImportFenceWin32HandleInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                   sType      = StructureType::eImportFenceWin32HandleInfoKHR;\n    const void *                                          pNext      = {};\n    VULKAN_HPP_NAMESPACE::Fence                           fence      = {};\n    VULKAN_HPP_NAMESPACE::FenceImportFlags                flags      = {};\n    VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits handleType = VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits::eOpaqueFd;\n    HANDLE                                                handle     = {};\n    LPCWSTR                                               name       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImportFenceWin32HandleInfoKHR>\n  {\n    using Type = ImportFenceWin32HandleInfoKHR;\n  };\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  struct ImportMemoryBufferCollectionFUCHSIA\n  {\n    using NativeType = VkImportMemoryBufferCollectionFUCHSIA;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImportMemoryBufferCollectionFUCHSIA;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImportMemoryBufferCollectionFUCHSIA( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA collection_ = {},\n                                                              uint32_t                                      index_      = {},\n                                                              const void *                                  pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , collection{ collection_ }\n      , index{ index_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImportMemoryBufferCollectionFUCHSIA( ImportMemoryBufferCollectionFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImportMemoryBufferCollectionFUCHSIA( VkImportMemoryBufferCollectionFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImportMemoryBufferCollectionFUCHSIA( *reinterpret_cast<ImportMemoryBufferCollectionFUCHSIA const *>( &rhs ) )\n    {\n    }\n\n    ImportMemoryBufferCollectionFUCHSIA & operator=( ImportMemoryBufferCollectionFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImportMemoryBufferCollectionFUCHSIA & operator=( VkImportMemoryBufferCollectionFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImportMemoryBufferCollectionFUCHSIA const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImportMemoryBufferCollectionFUCHSIA & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportMemoryBufferCollectionFUCHSIA & setCollection( VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA collection_ ) VULKAN_HPP_NOEXCEPT\n    {\n      collection = collection_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportMemoryBufferCollectionFUCHSIA & setIndex( uint32_t index_ ) VULKAN_HPP_NOEXCEPT\n    {\n      index = index_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImportMemoryBufferCollectionFUCHSIA const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImportMemoryBufferCollectionFUCHSIA *>( this );\n    }\n\n    operator VkImportMemoryBufferCollectionFUCHSIA &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImportMemoryBufferCollectionFUCHSIA *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA const &, uint32_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, collection, index );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImportMemoryBufferCollectionFUCHSIA const & ) const = default;\n#  else\n    bool operator==( ImportMemoryBufferCollectionFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( collection == rhs.collection ) && ( index == rhs.index );\n#    endif\n    }\n\n    bool operator!=( ImportMemoryBufferCollectionFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType           sType      = StructureType::eImportMemoryBufferCollectionFUCHSIA;\n    const void *                                  pNext      = {};\n    VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA collection = {};\n    uint32_t                                      index      = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImportMemoryBufferCollectionFUCHSIA>\n  {\n    using Type = ImportMemoryBufferCollectionFUCHSIA;\n  };\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  struct ImportMemoryFdInfoKHR\n  {\n    using NativeType = VkImportMemoryFdInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImportMemoryFdInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImportMemoryFdInfoKHR(\n      VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_ = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd,\n      int                                                    fd_         = {},\n      const void *                                           pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , handleType{ handleType_ }\n      , fd{ fd_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImportMemoryFdInfoKHR( ImportMemoryFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImportMemoryFdInfoKHR( VkImportMemoryFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImportMemoryFdInfoKHR( *reinterpret_cast<ImportMemoryFdInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    ImportMemoryFdInfoKHR & operator=( ImportMemoryFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImportMemoryFdInfoKHR & operator=( VkImportMemoryFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImportMemoryFdInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImportMemoryFdInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportMemoryFdInfoKHR & setHandleType( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportMemoryFdInfoKHR & setFd( int fd_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fd = fd_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImportMemoryFdInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImportMemoryFdInfoKHR *>( this );\n    }\n\n    operator VkImportMemoryFdInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImportMemoryFdInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits const &, int const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, handleType, fd );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImportMemoryFdInfoKHR const & ) const = default;\n#else\n    bool operator==( ImportMemoryFdInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( handleType == rhs.handleType ) && ( fd == rhs.fd );\n#  endif\n    }\n\n    bool operator!=( ImportMemoryFdInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType      = StructureType::eImportMemoryFdInfoKHR;\n    const void *                                           pNext      = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd;\n    int                                                    fd         = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImportMemoryFdInfoKHR>\n  {\n    using Type = ImportMemoryFdInfoKHR;\n  };\n\n  struct ImportMemoryHostPointerInfoEXT\n  {\n    using NativeType = VkImportMemoryHostPointerInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImportMemoryHostPointerInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImportMemoryHostPointerInfoEXT(\n      VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_   = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd,\n      void *                                                 pHostPointer_ = {},\n      const void *                                           pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , handleType{ handleType_ }\n      , pHostPointer{ pHostPointer_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImportMemoryHostPointerInfoEXT( ImportMemoryHostPointerInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImportMemoryHostPointerInfoEXT( VkImportMemoryHostPointerInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImportMemoryHostPointerInfoEXT( *reinterpret_cast<ImportMemoryHostPointerInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    ImportMemoryHostPointerInfoEXT & operator=( ImportMemoryHostPointerInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImportMemoryHostPointerInfoEXT & operator=( VkImportMemoryHostPointerInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImportMemoryHostPointerInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImportMemoryHostPointerInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportMemoryHostPointerInfoEXT &\n      setHandleType( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportMemoryHostPointerInfoEXT & setPHostPointer( void * pHostPointer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pHostPointer = pHostPointer_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImportMemoryHostPointerInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImportMemoryHostPointerInfoEXT *>( this );\n    }\n\n    operator VkImportMemoryHostPointerInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImportMemoryHostPointerInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::\n      tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits const &, void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, handleType, pHostPointer );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImportMemoryHostPointerInfoEXT const & ) const = default;\n#else\n    bool operator==( ImportMemoryHostPointerInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( handleType == rhs.handleType ) && ( pHostPointer == rhs.pHostPointer );\n#  endif\n    }\n\n    bool operator!=( ImportMemoryHostPointerInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType        = StructureType::eImportMemoryHostPointerInfoEXT;\n    const void *                                           pNext        = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType   = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd;\n    void *                                                 pHostPointer = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImportMemoryHostPointerInfoEXT>\n  {\n    using Type = ImportMemoryHostPointerInfoEXT;\n  };\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  struct ImportMemoryMetalHandleInfoEXT\n  {\n    using NativeType = VkImportMemoryMetalHandleInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImportMemoryMetalHandleInfoEXT;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImportMemoryMetalHandleInfoEXT(\n      VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_ = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd,\n      void *                                                 handle_     = {},\n      const void *                                           pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , handleType{ handleType_ }\n      , handle{ handle_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImportMemoryMetalHandleInfoEXT( ImportMemoryMetalHandleInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImportMemoryMetalHandleInfoEXT( VkImportMemoryMetalHandleInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImportMemoryMetalHandleInfoEXT( *reinterpret_cast<ImportMemoryMetalHandleInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    ImportMemoryMetalHandleInfoEXT & operator=( ImportMemoryMetalHandleInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImportMemoryMetalHandleInfoEXT & operator=( VkImportMemoryMetalHandleInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImportMemoryMetalHandleInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImportMemoryMetalHandleInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportMemoryMetalHandleInfoEXT &\n      setHandleType( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportMemoryMetalHandleInfoEXT & setHandle( void * handle_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handle = handle_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImportMemoryMetalHandleInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImportMemoryMetalHandleInfoEXT *>( this );\n    }\n\n    operator VkImportMemoryMetalHandleInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImportMemoryMetalHandleInfoEXT *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::\n      tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits const &, void * const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, handleType, handle );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImportMemoryMetalHandleInfoEXT const & ) const = default;\n#  else\n    bool operator==( ImportMemoryMetalHandleInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( handleType == rhs.handleType ) && ( handle == rhs.handle );\n#    endif\n    }\n\n    bool operator!=( ImportMemoryMetalHandleInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType      = StructureType::eImportMemoryMetalHandleInfoEXT;\n    const void *                                           pNext      = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd;\n    void *                                                 handle     = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImportMemoryMetalHandleInfoEXT>\n  {\n    using Type = ImportMemoryMetalHandleInfoEXT;\n  };\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  struct ImportMemoryWin32HandleInfoKHR\n  {\n    using NativeType = VkImportMemoryWin32HandleInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImportMemoryWin32HandleInfoKHR;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImportMemoryWin32HandleInfoKHR(\n      VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_ = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd,\n      HANDLE                                                 handle_     = {},\n      LPCWSTR                                                name_       = {},\n      const void *                                           pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , handleType{ handleType_ }\n      , handle{ handle_ }\n      , name{ name_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImportMemoryWin32HandleInfoKHR( ImportMemoryWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImportMemoryWin32HandleInfoKHR( VkImportMemoryWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImportMemoryWin32HandleInfoKHR( *reinterpret_cast<ImportMemoryWin32HandleInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    ImportMemoryWin32HandleInfoKHR & operator=( ImportMemoryWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImportMemoryWin32HandleInfoKHR & operator=( VkImportMemoryWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImportMemoryWin32HandleInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImportMemoryWin32HandleInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportMemoryWin32HandleInfoKHR &\n      setHandleType( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportMemoryWin32HandleInfoKHR & setHandle( HANDLE handle_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handle = handle_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportMemoryWin32HandleInfoKHR & setName( LPCWSTR name_ ) VULKAN_HPP_NOEXCEPT\n    {\n      name = name_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImportMemoryWin32HandleInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImportMemoryWin32HandleInfoKHR *>( this );\n    }\n\n    operator VkImportMemoryWin32HandleInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImportMemoryWin32HandleInfoKHR *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits const &,\n               HANDLE const &,\n               LPCWSTR const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, handleType, handle, name );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImportMemoryWin32HandleInfoKHR const & ) const = default;\n#  else\n    bool operator==( ImportMemoryWin32HandleInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( handleType == rhs.handleType ) && ( handle == rhs.handle ) && ( name == rhs.name );\n#    endif\n    }\n\n    bool operator!=( ImportMemoryWin32HandleInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType      = StructureType::eImportMemoryWin32HandleInfoKHR;\n    const void *                                           pNext      = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd;\n    HANDLE                                                 handle     = {};\n    LPCWSTR                                                name       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImportMemoryWin32HandleInfoKHR>\n  {\n    using Type = ImportMemoryWin32HandleInfoKHR;\n  };\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  struct ImportMemoryWin32HandleInfoNV\n  {\n    using NativeType = VkImportMemoryWin32HandleInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImportMemoryWin32HandleInfoNV;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImportMemoryWin32HandleInfoNV( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV handleType_ = {},\n                                                        HANDLE                                                handle_     = {},\n                                                        const void *                                          pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , handleType{ handleType_ }\n      , handle{ handle_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImportMemoryWin32HandleInfoNV( ImportMemoryWin32HandleInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImportMemoryWin32HandleInfoNV( VkImportMemoryWin32HandleInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImportMemoryWin32HandleInfoNV( *reinterpret_cast<ImportMemoryWin32HandleInfoNV const *>( &rhs ) )\n    {\n    }\n\n    ImportMemoryWin32HandleInfoNV & operator=( ImportMemoryWin32HandleInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImportMemoryWin32HandleInfoNV & operator=( VkImportMemoryWin32HandleInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImportMemoryWin32HandleInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImportMemoryWin32HandleInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportMemoryWin32HandleInfoNV &\n      setHandleType( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportMemoryWin32HandleInfoNV & setHandle( HANDLE handle_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handle = handle_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImportMemoryWin32HandleInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImportMemoryWin32HandleInfoNV *>( this );\n    }\n\n    operator VkImportMemoryWin32HandleInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImportMemoryWin32HandleInfoNV *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV const &, HANDLE const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, handleType, handle );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImportMemoryWin32HandleInfoNV const & ) const = default;\n#  else\n    bool operator==( ImportMemoryWin32HandleInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( handleType == rhs.handleType ) && ( handle == rhs.handle );\n#    endif\n    }\n\n    bool operator!=( ImportMemoryWin32HandleInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                   sType      = StructureType::eImportMemoryWin32HandleInfoNV;\n    const void *                                          pNext      = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV handleType = {};\n    HANDLE                                                handle     = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImportMemoryWin32HandleInfoNV>\n  {\n    using Type = ImportMemoryWin32HandleInfoNV;\n  };\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  struct ImportMemoryZirconHandleInfoFUCHSIA\n  {\n    using NativeType = VkImportMemoryZirconHandleInfoFUCHSIA;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImportMemoryZirconHandleInfoFUCHSIA;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImportMemoryZirconHandleInfoFUCHSIA(\n      VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_ = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd,\n      zx_handle_t                                            handle_     = {},\n      const void *                                           pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , handleType{ handleType_ }\n      , handle{ handle_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImportMemoryZirconHandleInfoFUCHSIA( ImportMemoryZirconHandleInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImportMemoryZirconHandleInfoFUCHSIA( VkImportMemoryZirconHandleInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImportMemoryZirconHandleInfoFUCHSIA( *reinterpret_cast<ImportMemoryZirconHandleInfoFUCHSIA const *>( &rhs ) )\n    {\n    }\n\n    ImportMemoryZirconHandleInfoFUCHSIA & operator=( ImportMemoryZirconHandleInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImportMemoryZirconHandleInfoFUCHSIA & operator=( VkImportMemoryZirconHandleInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImportMemoryZirconHandleInfoFUCHSIA const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImportMemoryZirconHandleInfoFUCHSIA & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportMemoryZirconHandleInfoFUCHSIA &\n      setHandleType( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportMemoryZirconHandleInfoFUCHSIA & setHandle( zx_handle_t handle_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handle = handle_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImportMemoryZirconHandleInfoFUCHSIA const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImportMemoryZirconHandleInfoFUCHSIA *>( this );\n    }\n\n    operator VkImportMemoryZirconHandleInfoFUCHSIA &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImportMemoryZirconHandleInfoFUCHSIA *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits const &,\n               zx_handle_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, handleType, handle );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( ImportMemoryZirconHandleInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = handleType <=> rhs.handleType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = memcmp( &handle, &rhs.handle, sizeof( zx_handle_t ) ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#  endif\n\n    bool operator==( ImportMemoryZirconHandleInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( handleType == rhs.handleType ) &&\n             ( memcmp( &handle, &rhs.handle, sizeof( zx_handle_t ) ) == 0 );\n    }\n\n    bool operator!=( ImportMemoryZirconHandleInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType      = StructureType::eImportMemoryZirconHandleInfoFUCHSIA;\n    const void *                                           pNext      = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd;\n    zx_handle_t                                            handle     = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImportMemoryZirconHandleInfoFUCHSIA>\n  {\n    using Type = ImportMemoryZirconHandleInfoFUCHSIA;\n  };\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  struct ImportMetalBufferInfoEXT\n  {\n    using NativeType = VkImportMetalBufferInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImportMetalBufferInfoEXT;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImportMetalBufferInfoEXT( MTLBuffer_id mtlBuffer_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , mtlBuffer{ mtlBuffer_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImportMetalBufferInfoEXT( ImportMetalBufferInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImportMetalBufferInfoEXT( VkImportMetalBufferInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImportMetalBufferInfoEXT( *reinterpret_cast<ImportMetalBufferInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    ImportMetalBufferInfoEXT & operator=( ImportMetalBufferInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImportMetalBufferInfoEXT & operator=( VkImportMetalBufferInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImportMetalBufferInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImportMetalBufferInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportMetalBufferInfoEXT & setMtlBuffer( MTLBuffer_id mtlBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mtlBuffer = mtlBuffer_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImportMetalBufferInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImportMetalBufferInfoEXT *>( this );\n    }\n\n    operator VkImportMetalBufferInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImportMetalBufferInfoEXT *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, MTLBuffer_id const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, mtlBuffer );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImportMetalBufferInfoEXT const & ) const = default;\n#  else\n    bool operator==( ImportMetalBufferInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( mtlBuffer == rhs.mtlBuffer );\n#    endif\n    }\n\n    bool operator!=( ImportMetalBufferInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType     = StructureType::eImportMetalBufferInfoEXT;\n    const void *                        pNext     = {};\n    MTLBuffer_id                        mtlBuffer = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImportMetalBufferInfoEXT>\n  {\n    using Type = ImportMetalBufferInfoEXT;\n  };\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  struct ImportMetalIOSurfaceInfoEXT\n  {\n    using NativeType = VkImportMetalIOSurfaceInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImportMetalIoSurfaceInfoEXT;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImportMetalIOSurfaceInfoEXT( IOSurfaceRef ioSurface_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , ioSurface{ ioSurface_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImportMetalIOSurfaceInfoEXT( ImportMetalIOSurfaceInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImportMetalIOSurfaceInfoEXT( VkImportMetalIOSurfaceInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImportMetalIOSurfaceInfoEXT( *reinterpret_cast<ImportMetalIOSurfaceInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    ImportMetalIOSurfaceInfoEXT & operator=( ImportMetalIOSurfaceInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImportMetalIOSurfaceInfoEXT & operator=( VkImportMetalIOSurfaceInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImportMetalIOSurfaceInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImportMetalIOSurfaceInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportMetalIOSurfaceInfoEXT & setIoSurface( IOSurfaceRef ioSurface_ ) VULKAN_HPP_NOEXCEPT\n    {\n      ioSurface = ioSurface_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImportMetalIOSurfaceInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImportMetalIOSurfaceInfoEXT *>( this );\n    }\n\n    operator VkImportMetalIOSurfaceInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImportMetalIOSurfaceInfoEXT *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, IOSurfaceRef const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, ioSurface );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImportMetalIOSurfaceInfoEXT const & ) const = default;\n#  else\n    bool operator==( ImportMetalIOSurfaceInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( ioSurface == rhs.ioSurface );\n#    endif\n    }\n\n    bool operator!=( ImportMetalIOSurfaceInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType     = StructureType::eImportMetalIoSurfaceInfoEXT;\n    const void *                        pNext     = {};\n    IOSurfaceRef                        ioSurface = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImportMetalIoSurfaceInfoEXT>\n  {\n    using Type = ImportMetalIOSurfaceInfoEXT;\n  };\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  struct ImportMetalSharedEventInfoEXT\n  {\n    using NativeType = VkImportMetalSharedEventInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImportMetalSharedEventInfoEXT;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImportMetalSharedEventInfoEXT( MTLSharedEvent_id mtlSharedEvent_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , mtlSharedEvent{ mtlSharedEvent_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImportMetalSharedEventInfoEXT( ImportMetalSharedEventInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImportMetalSharedEventInfoEXT( VkImportMetalSharedEventInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImportMetalSharedEventInfoEXT( *reinterpret_cast<ImportMetalSharedEventInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    ImportMetalSharedEventInfoEXT & operator=( ImportMetalSharedEventInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImportMetalSharedEventInfoEXT & operator=( VkImportMetalSharedEventInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImportMetalSharedEventInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImportMetalSharedEventInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportMetalSharedEventInfoEXT & setMtlSharedEvent( MTLSharedEvent_id mtlSharedEvent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mtlSharedEvent = mtlSharedEvent_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImportMetalSharedEventInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImportMetalSharedEventInfoEXT *>( this );\n    }\n\n    operator VkImportMetalSharedEventInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImportMetalSharedEventInfoEXT *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, MTLSharedEvent_id const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, mtlSharedEvent );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImportMetalSharedEventInfoEXT const & ) const = default;\n#  else\n    bool operator==( ImportMetalSharedEventInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( mtlSharedEvent == rhs.mtlSharedEvent );\n#    endif\n    }\n\n    bool operator!=( ImportMetalSharedEventInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::eImportMetalSharedEventInfoEXT;\n    const void *                        pNext          = {};\n    MTLSharedEvent_id                   mtlSharedEvent = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImportMetalSharedEventInfoEXT>\n  {\n    using Type = ImportMetalSharedEventInfoEXT;\n  };\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  struct ImportMetalTextureInfoEXT\n  {\n    using NativeType = VkImportMetalTextureInfoEXT;\n\n    static const bool                                  allowDuplicate = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImportMetalTextureInfoEXT;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImportMetalTextureInfoEXT( VULKAN_HPP_NAMESPACE::ImageAspectFlagBits plane_      = VULKAN_HPP_NAMESPACE::ImageAspectFlagBits::eColor,\n                                                    MTLTexture_id                             mtlTexture_ = {},\n                                                    const void *                              pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , plane{ plane_ }\n      , mtlTexture{ mtlTexture_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImportMetalTextureInfoEXT( ImportMetalTextureInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImportMetalTextureInfoEXT( VkImportMetalTextureInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImportMetalTextureInfoEXT( *reinterpret_cast<ImportMetalTextureInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    ImportMetalTextureInfoEXT & operator=( ImportMetalTextureInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImportMetalTextureInfoEXT & operator=( VkImportMetalTextureInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImportMetalTextureInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImportMetalTextureInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportMetalTextureInfoEXT & setPlane( VULKAN_HPP_NAMESPACE::ImageAspectFlagBits plane_ ) VULKAN_HPP_NOEXCEPT\n    {\n      plane = plane_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportMetalTextureInfoEXT & setMtlTexture( MTLTexture_id mtlTexture_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mtlTexture = mtlTexture_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImportMetalTextureInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImportMetalTextureInfoEXT *>( this );\n    }\n\n    operator VkImportMetalTextureInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImportMetalTextureInfoEXT *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ImageAspectFlagBits const &, MTLTexture_id const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, plane, mtlTexture );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImportMetalTextureInfoEXT const & ) const = default;\n#  else\n    bool operator==( ImportMetalTextureInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( plane == rhs.plane ) && ( mtlTexture == rhs.mtlTexture );\n#    endif\n    }\n\n    bool operator!=( ImportMetalTextureInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType      = StructureType::eImportMetalTextureInfoEXT;\n    const void *                              pNext      = {};\n    VULKAN_HPP_NAMESPACE::ImageAspectFlagBits plane      = VULKAN_HPP_NAMESPACE::ImageAspectFlagBits::eColor;\n    MTLTexture_id                             mtlTexture = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImportMetalTextureInfoEXT>\n  {\n    using Type = ImportMetalTextureInfoEXT;\n  };\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n  struct ImportScreenBufferInfoQNX\n  {\n    using NativeType = VkImportScreenBufferInfoQNX;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImportScreenBufferInfoQNX;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImportScreenBufferInfoQNX( struct _screen_buffer * buffer_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , buffer{ buffer_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImportScreenBufferInfoQNX( ImportScreenBufferInfoQNX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImportScreenBufferInfoQNX( VkImportScreenBufferInfoQNX const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImportScreenBufferInfoQNX( *reinterpret_cast<ImportScreenBufferInfoQNX const *>( &rhs ) )\n    {\n    }\n\n    ImportScreenBufferInfoQNX & operator=( ImportScreenBufferInfoQNX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImportScreenBufferInfoQNX & operator=( VkImportScreenBufferInfoQNX const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImportScreenBufferInfoQNX const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImportScreenBufferInfoQNX & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportScreenBufferInfoQNX & setBuffer( struct _screen_buffer * buffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      buffer = buffer_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImportScreenBufferInfoQNX const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImportScreenBufferInfoQNX *>( this );\n    }\n\n    operator VkImportScreenBufferInfoQNX &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImportScreenBufferInfoQNX *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, struct _screen_buffer * const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, buffer );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImportScreenBufferInfoQNX const & ) const = default;\n#  else\n    bool operator==( ImportScreenBufferInfoQNX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( buffer == rhs.buffer );\n#    endif\n    }\n\n    bool operator!=( ImportScreenBufferInfoQNX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType  = StructureType::eImportScreenBufferInfoQNX;\n    const void *                        pNext  = {};\n    struct _screen_buffer *             buffer = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImportScreenBufferInfoQNX>\n  {\n    using Type = ImportScreenBufferInfoQNX;\n  };\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n  struct ImportSemaphoreFdInfoKHR\n  {\n    using NativeType = VkImportSemaphoreFdInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImportSemaphoreFdInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImportSemaphoreFdInfoKHR(\n      VULKAN_HPP_NAMESPACE::Semaphore                           semaphore_  = {},\n      VULKAN_HPP_NAMESPACE::SemaphoreImportFlags                flags_      = {},\n      VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits handleType_ = VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits::eOpaqueFd,\n      int                                                       fd_         = {},\n      const void *                                              pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , semaphore{ semaphore_ }\n      , flags{ flags_ }\n      , handleType{ handleType_ }\n      , fd{ fd_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImportSemaphoreFdInfoKHR( ImportSemaphoreFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImportSemaphoreFdInfoKHR( VkImportSemaphoreFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImportSemaphoreFdInfoKHR( *reinterpret_cast<ImportSemaphoreFdInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    ImportSemaphoreFdInfoKHR & operator=( ImportSemaphoreFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImportSemaphoreFdInfoKHR & operator=( VkImportSemaphoreFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImportSemaphoreFdInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImportSemaphoreFdInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportSemaphoreFdInfoKHR & setSemaphore( VULKAN_HPP_NAMESPACE::Semaphore semaphore_ ) VULKAN_HPP_NOEXCEPT\n    {\n      semaphore = semaphore_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportSemaphoreFdInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::SemaphoreImportFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportSemaphoreFdInfoKHR &\n      setHandleType( VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportSemaphoreFdInfoKHR & setFd( int fd_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fd = fd_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImportSemaphoreFdInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImportSemaphoreFdInfoKHR *>( this );\n    }\n\n    operator VkImportSemaphoreFdInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImportSemaphoreFdInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Semaphore const &,\n               VULKAN_HPP_NAMESPACE::SemaphoreImportFlags const &,\n               VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits const &,\n               int const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, semaphore, flags, handleType, fd );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImportSemaphoreFdInfoKHR const & ) const = default;\n#else\n    bool operator==( ImportSemaphoreFdInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( semaphore == rhs.semaphore ) && ( flags == rhs.flags ) && ( handleType == rhs.handleType ) &&\n             ( fd == rhs.fd );\n#  endif\n    }\n\n    bool operator!=( ImportSemaphoreFdInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                       sType      = StructureType::eImportSemaphoreFdInfoKHR;\n    const void *                                              pNext      = {};\n    VULKAN_HPP_NAMESPACE::Semaphore                           semaphore  = {};\n    VULKAN_HPP_NAMESPACE::SemaphoreImportFlags                flags      = {};\n    VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits handleType = VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits::eOpaqueFd;\n    int                                                       fd         = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImportSemaphoreFdInfoKHR>\n  {\n    using Type = ImportSemaphoreFdInfoKHR;\n  };\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  struct ImportSemaphoreWin32HandleInfoKHR\n  {\n    using NativeType = VkImportSemaphoreWin32HandleInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImportSemaphoreWin32HandleInfoKHR;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImportSemaphoreWin32HandleInfoKHR(\n      VULKAN_HPP_NAMESPACE::Semaphore                           semaphore_  = {},\n      VULKAN_HPP_NAMESPACE::SemaphoreImportFlags                flags_      = {},\n      VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits handleType_ = VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits::eOpaqueFd,\n      HANDLE                                                    handle_     = {},\n      LPCWSTR                                                   name_       = {},\n      const void *                                              pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , semaphore{ semaphore_ }\n      , flags{ flags_ }\n      , handleType{ handleType_ }\n      , handle{ handle_ }\n      , name{ name_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImportSemaphoreWin32HandleInfoKHR( ImportSemaphoreWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImportSemaphoreWin32HandleInfoKHR( VkImportSemaphoreWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImportSemaphoreWin32HandleInfoKHR( *reinterpret_cast<ImportSemaphoreWin32HandleInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    ImportSemaphoreWin32HandleInfoKHR & operator=( ImportSemaphoreWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImportSemaphoreWin32HandleInfoKHR & operator=( VkImportSemaphoreWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImportSemaphoreWin32HandleInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImportSemaphoreWin32HandleInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportSemaphoreWin32HandleInfoKHR & setSemaphore( VULKAN_HPP_NAMESPACE::Semaphore semaphore_ ) VULKAN_HPP_NOEXCEPT\n    {\n      semaphore = semaphore_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportSemaphoreWin32HandleInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::SemaphoreImportFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportSemaphoreWin32HandleInfoKHR &\n      setHandleType( VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportSemaphoreWin32HandleInfoKHR & setHandle( HANDLE handle_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handle = handle_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportSemaphoreWin32HandleInfoKHR & setName( LPCWSTR name_ ) VULKAN_HPP_NOEXCEPT\n    {\n      name = name_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImportSemaphoreWin32HandleInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImportSemaphoreWin32HandleInfoKHR *>( this );\n    }\n\n    operator VkImportSemaphoreWin32HandleInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImportSemaphoreWin32HandleInfoKHR *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Semaphore const &,\n               VULKAN_HPP_NAMESPACE::SemaphoreImportFlags const &,\n               VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits const &,\n               HANDLE const &,\n               LPCWSTR const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, semaphore, flags, handleType, handle, name );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ImportSemaphoreWin32HandleInfoKHR const & ) const = default;\n#  else\n    bool operator==( ImportSemaphoreWin32HandleInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( semaphore == rhs.semaphore ) && ( flags == rhs.flags ) && ( handleType == rhs.handleType ) &&\n             ( handle == rhs.handle ) && ( name == rhs.name );\n#    endif\n    }\n\n    bool operator!=( ImportSemaphoreWin32HandleInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                       sType      = StructureType::eImportSemaphoreWin32HandleInfoKHR;\n    const void *                                              pNext      = {};\n    VULKAN_HPP_NAMESPACE::Semaphore                           semaphore  = {};\n    VULKAN_HPP_NAMESPACE::SemaphoreImportFlags                flags      = {};\n    VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits handleType = VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits::eOpaqueFd;\n    HANDLE                                                    handle     = {};\n    LPCWSTR                                                   name       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImportSemaphoreWin32HandleInfoKHR>\n  {\n    using Type = ImportSemaphoreWin32HandleInfoKHR;\n  };\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  struct ImportSemaphoreZirconHandleInfoFUCHSIA\n  {\n    using NativeType = VkImportSemaphoreZirconHandleInfoFUCHSIA;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eImportSemaphoreZirconHandleInfoFUCHSIA;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ImportSemaphoreZirconHandleInfoFUCHSIA(\n      VULKAN_HPP_NAMESPACE::Semaphore                           semaphore_    = {},\n      VULKAN_HPP_NAMESPACE::SemaphoreImportFlags                flags_        = {},\n      VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits handleType_   = VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits::eOpaqueFd,\n      zx_handle_t                                               zirconHandle_ = {},\n      const void *                                              pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , semaphore{ semaphore_ }\n      , flags{ flags_ }\n      , handleType{ handleType_ }\n      , zirconHandle{ zirconHandle_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ImportSemaphoreZirconHandleInfoFUCHSIA( ImportSemaphoreZirconHandleInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ImportSemaphoreZirconHandleInfoFUCHSIA( VkImportSemaphoreZirconHandleInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ImportSemaphoreZirconHandleInfoFUCHSIA( *reinterpret_cast<ImportSemaphoreZirconHandleInfoFUCHSIA const *>( &rhs ) )\n    {\n    }\n\n    ImportSemaphoreZirconHandleInfoFUCHSIA & operator=( ImportSemaphoreZirconHandleInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ImportSemaphoreZirconHandleInfoFUCHSIA & operator=( VkImportSemaphoreZirconHandleInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ImportSemaphoreZirconHandleInfoFUCHSIA const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ImportSemaphoreZirconHandleInfoFUCHSIA & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportSemaphoreZirconHandleInfoFUCHSIA & setSemaphore( VULKAN_HPP_NAMESPACE::Semaphore semaphore_ ) VULKAN_HPP_NOEXCEPT\n    {\n      semaphore = semaphore_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportSemaphoreZirconHandleInfoFUCHSIA & setFlags( VULKAN_HPP_NAMESPACE::SemaphoreImportFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportSemaphoreZirconHandleInfoFUCHSIA &\n      setHandleType( VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ImportSemaphoreZirconHandleInfoFUCHSIA & setZirconHandle( zx_handle_t zirconHandle_ ) VULKAN_HPP_NOEXCEPT\n    {\n      zirconHandle = zirconHandle_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkImportSemaphoreZirconHandleInfoFUCHSIA const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkImportSemaphoreZirconHandleInfoFUCHSIA *>( this );\n    }\n\n    operator VkImportSemaphoreZirconHandleInfoFUCHSIA &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkImportSemaphoreZirconHandleInfoFUCHSIA *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Semaphore const &,\n               VULKAN_HPP_NAMESPACE::SemaphoreImportFlags const &,\n               VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits const &,\n               zx_handle_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, semaphore, flags, handleType, zirconHandle );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( ImportSemaphoreZirconHandleInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = semaphore <=> rhs.semaphore; cmp != 0 )\n        return cmp;\n      if ( auto cmp = flags <=> rhs.flags; cmp != 0 )\n        return cmp;\n      if ( auto cmp = handleType <=> rhs.handleType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = memcmp( &zirconHandle, &rhs.zirconHandle, sizeof( zx_handle_t ) ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#  endif\n\n    bool operator==( ImportSemaphoreZirconHandleInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( semaphore == rhs.semaphore ) && ( flags == rhs.flags ) && ( handleType == rhs.handleType ) &&\n             ( memcmp( &zirconHandle, &rhs.zirconHandle, sizeof( zx_handle_t ) ) == 0 );\n    }\n\n    bool operator!=( ImportSemaphoreZirconHandleInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                       sType        = StructureType::eImportSemaphoreZirconHandleInfoFUCHSIA;\n    const void *                                              pNext        = {};\n    VULKAN_HPP_NAMESPACE::Semaphore                           semaphore    = {};\n    VULKAN_HPP_NAMESPACE::SemaphoreImportFlags                flags        = {};\n    VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits handleType   = VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits::eOpaqueFd;\n    zx_handle_t                                               zirconHandle = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eImportSemaphoreZirconHandleInfoFUCHSIA>\n  {\n    using Type = ImportSemaphoreZirconHandleInfoFUCHSIA;\n  };\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  struct IndirectCommandsExecutionSetTokenEXT\n  {\n    using NativeType = VkIndirectCommandsExecutionSetTokenEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR IndirectCommandsExecutionSetTokenEXT(\n      VULKAN_HPP_NAMESPACE::IndirectExecutionSetInfoTypeEXT type_         = VULKAN_HPP_NAMESPACE::IndirectExecutionSetInfoTypeEXT::ePipelines,\n      VULKAN_HPP_NAMESPACE::ShaderStageFlags                shaderStages_ = {} ) VULKAN_HPP_NOEXCEPT\n      : type{ type_ }\n      , shaderStages{ shaderStages_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR IndirectCommandsExecutionSetTokenEXT( IndirectCommandsExecutionSetTokenEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    IndirectCommandsExecutionSetTokenEXT( VkIndirectCommandsExecutionSetTokenEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : IndirectCommandsExecutionSetTokenEXT( *reinterpret_cast<IndirectCommandsExecutionSetTokenEXT const *>( &rhs ) )\n    {\n    }\n\n    IndirectCommandsExecutionSetTokenEXT & operator=( IndirectCommandsExecutionSetTokenEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    IndirectCommandsExecutionSetTokenEXT & operator=( VkIndirectCommandsExecutionSetTokenEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::IndirectCommandsExecutionSetTokenEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsExecutionSetTokenEXT & setType( VULKAN_HPP_NAMESPACE::IndirectExecutionSetInfoTypeEXT type_ ) VULKAN_HPP_NOEXCEPT\n    {\n      type = type_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsExecutionSetTokenEXT & setShaderStages( VULKAN_HPP_NAMESPACE::ShaderStageFlags shaderStages_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderStages = shaderStages_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkIndirectCommandsExecutionSetTokenEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkIndirectCommandsExecutionSetTokenEXT *>( this );\n    }\n\n    operator VkIndirectCommandsExecutionSetTokenEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkIndirectCommandsExecutionSetTokenEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::IndirectExecutionSetInfoTypeEXT const &, VULKAN_HPP_NAMESPACE::ShaderStageFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( type, shaderStages );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( IndirectCommandsExecutionSetTokenEXT const & ) const = default;\n#else\n    bool operator==( IndirectCommandsExecutionSetTokenEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( type == rhs.type ) && ( shaderStages == rhs.shaderStages );\n#  endif\n    }\n\n    bool operator!=( IndirectCommandsExecutionSetTokenEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::IndirectExecutionSetInfoTypeEXT type         = VULKAN_HPP_NAMESPACE::IndirectExecutionSetInfoTypeEXT::ePipelines;\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags                shaderStages = {};\n  };\n\n  struct IndirectCommandsIndexBufferTokenEXT\n  {\n    using NativeType = VkIndirectCommandsIndexBufferTokenEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      IndirectCommandsIndexBufferTokenEXT( VULKAN_HPP_NAMESPACE::IndirectCommandsInputModeFlagBitsEXT mode_ =\n                                             VULKAN_HPP_NAMESPACE::IndirectCommandsInputModeFlagBitsEXT::eVulkanIndexBuffer ) VULKAN_HPP_NOEXCEPT\n      : mode{ mode_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR IndirectCommandsIndexBufferTokenEXT( IndirectCommandsIndexBufferTokenEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    IndirectCommandsIndexBufferTokenEXT( VkIndirectCommandsIndexBufferTokenEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : IndirectCommandsIndexBufferTokenEXT( *reinterpret_cast<IndirectCommandsIndexBufferTokenEXT const *>( &rhs ) )\n    {\n    }\n\n    IndirectCommandsIndexBufferTokenEXT & operator=( IndirectCommandsIndexBufferTokenEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    IndirectCommandsIndexBufferTokenEXT & operator=( VkIndirectCommandsIndexBufferTokenEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::IndirectCommandsIndexBufferTokenEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsIndexBufferTokenEXT &\n      setMode( VULKAN_HPP_NAMESPACE::IndirectCommandsInputModeFlagBitsEXT mode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mode = mode_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkIndirectCommandsIndexBufferTokenEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkIndirectCommandsIndexBufferTokenEXT *>( this );\n    }\n\n    operator VkIndirectCommandsIndexBufferTokenEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkIndirectCommandsIndexBufferTokenEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::IndirectCommandsInputModeFlagBitsEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( mode );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( IndirectCommandsIndexBufferTokenEXT const & ) const = default;\n#else\n    bool operator==( IndirectCommandsIndexBufferTokenEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( mode == rhs.mode );\n#  endif\n    }\n\n    bool operator!=( IndirectCommandsIndexBufferTokenEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::IndirectCommandsInputModeFlagBitsEXT mode = VULKAN_HPP_NAMESPACE::IndirectCommandsInputModeFlagBitsEXT::eVulkanIndexBuffer;\n  };\n\n  struct PushConstantRange\n  {\n    using NativeType = VkPushConstantRange;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      PushConstantRange( VULKAN_HPP_NAMESPACE::ShaderStageFlags stageFlags_ = {}, uint32_t offset_ = {}, uint32_t size_ = {} ) VULKAN_HPP_NOEXCEPT\n      : stageFlags{ stageFlags_ }\n      , offset{ offset_ }\n      , size{ size_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PushConstantRange( PushConstantRange const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PushConstantRange( VkPushConstantRange const & rhs ) VULKAN_HPP_NOEXCEPT : PushConstantRange( *reinterpret_cast<PushConstantRange const *>( &rhs ) ) {}\n\n    PushConstantRange & operator=( PushConstantRange const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PushConstantRange & operator=( VkPushConstantRange const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PushConstantRange const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PushConstantRange & setStageFlags( VULKAN_HPP_NAMESPACE::ShaderStageFlags stageFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stageFlags = stageFlags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PushConstantRange & setOffset( uint32_t offset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      offset = offset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PushConstantRange & setSize( uint32_t size_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size = size_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPushConstantRange const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPushConstantRange *>( this );\n    }\n\n    operator VkPushConstantRange &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPushConstantRange *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::ShaderStageFlags const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( stageFlags, offset, size );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PushConstantRange const & ) const = default;\n#else\n    bool operator==( PushConstantRange const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( stageFlags == rhs.stageFlags ) && ( offset == rhs.offset ) && ( size == rhs.size );\n#  endif\n    }\n\n    bool operator!=( PushConstantRange const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags stageFlags = {};\n    uint32_t                               offset     = {};\n    uint32_t                               size       = {};\n  };\n\n  struct IndirectCommandsPushConstantTokenEXT\n  {\n    using NativeType = VkIndirectCommandsPushConstantTokenEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR IndirectCommandsPushConstantTokenEXT( VULKAN_HPP_NAMESPACE::PushConstantRange updateRange_ = {} ) VULKAN_HPP_NOEXCEPT\n      : updateRange{ updateRange_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR IndirectCommandsPushConstantTokenEXT( IndirectCommandsPushConstantTokenEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    IndirectCommandsPushConstantTokenEXT( VkIndirectCommandsPushConstantTokenEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : IndirectCommandsPushConstantTokenEXT( *reinterpret_cast<IndirectCommandsPushConstantTokenEXT const *>( &rhs ) )\n    {\n    }\n\n    IndirectCommandsPushConstantTokenEXT & operator=( IndirectCommandsPushConstantTokenEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    IndirectCommandsPushConstantTokenEXT & operator=( VkIndirectCommandsPushConstantTokenEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::IndirectCommandsPushConstantTokenEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsPushConstantTokenEXT &\n      setUpdateRange( VULKAN_HPP_NAMESPACE::PushConstantRange const & updateRange_ ) VULKAN_HPP_NOEXCEPT\n    {\n      updateRange = updateRange_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkIndirectCommandsPushConstantTokenEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkIndirectCommandsPushConstantTokenEXT *>( this );\n    }\n\n    operator VkIndirectCommandsPushConstantTokenEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkIndirectCommandsPushConstantTokenEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::PushConstantRange const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( updateRange );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( IndirectCommandsPushConstantTokenEXT const & ) const = default;\n#else\n    bool operator==( IndirectCommandsPushConstantTokenEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( updateRange == rhs.updateRange );\n#  endif\n    }\n\n    bool operator!=( IndirectCommandsPushConstantTokenEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::PushConstantRange updateRange = {};\n  };\n\n  struct IndirectCommandsVertexBufferTokenEXT\n  {\n    using NativeType = VkIndirectCommandsVertexBufferTokenEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR IndirectCommandsVertexBufferTokenEXT( uint32_t vertexBindingUnit_ = {} ) VULKAN_HPP_NOEXCEPT : vertexBindingUnit{ vertexBindingUnit_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR IndirectCommandsVertexBufferTokenEXT( IndirectCommandsVertexBufferTokenEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    IndirectCommandsVertexBufferTokenEXT( VkIndirectCommandsVertexBufferTokenEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : IndirectCommandsVertexBufferTokenEXT( *reinterpret_cast<IndirectCommandsVertexBufferTokenEXT const *>( &rhs ) )\n    {\n    }\n\n    IndirectCommandsVertexBufferTokenEXT & operator=( IndirectCommandsVertexBufferTokenEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    IndirectCommandsVertexBufferTokenEXT & operator=( VkIndirectCommandsVertexBufferTokenEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::IndirectCommandsVertexBufferTokenEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsVertexBufferTokenEXT & setVertexBindingUnit( uint32_t vertexBindingUnit_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexBindingUnit = vertexBindingUnit_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkIndirectCommandsVertexBufferTokenEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkIndirectCommandsVertexBufferTokenEXT *>( this );\n    }\n\n    operator VkIndirectCommandsVertexBufferTokenEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkIndirectCommandsVertexBufferTokenEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( vertexBindingUnit );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( IndirectCommandsVertexBufferTokenEXT const & ) const = default;\n#else\n    bool operator==( IndirectCommandsVertexBufferTokenEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( vertexBindingUnit == rhs.vertexBindingUnit );\n#  endif\n    }\n\n    bool operator!=( IndirectCommandsVertexBufferTokenEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t vertexBindingUnit = {};\n  };\n\n  union IndirectCommandsTokenDataEXT\n  {\n    using NativeType = VkIndirectCommandsTokenDataEXT;\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsTokenDataEXT( const VULKAN_HPP_NAMESPACE::IndirectCommandsPushConstantTokenEXT * pPushConstant_ = {} )\n      : pPushConstant( pPushConstant_ )\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsTokenDataEXT( const VULKAN_HPP_NAMESPACE::IndirectCommandsVertexBufferTokenEXT * pVertexBuffer_ )\n      : pVertexBuffer( pVertexBuffer_ )\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsTokenDataEXT( const VULKAN_HPP_NAMESPACE::IndirectCommandsIndexBufferTokenEXT * pIndexBuffer_ )\n      : pIndexBuffer( pIndexBuffer_ )\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsTokenDataEXT( const VULKAN_HPP_NAMESPACE::IndirectCommandsExecutionSetTokenEXT * pExecutionSet_ )\n      : pExecutionSet( pExecutionSet_ )\n    {\n    }\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_UNION_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsTokenDataEXT &\n      setPPushConstant( const VULKAN_HPP_NAMESPACE::IndirectCommandsPushConstantTokenEXT * pPushConstant_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPushConstant = pPushConstant_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsTokenDataEXT &\n      setPVertexBuffer( const VULKAN_HPP_NAMESPACE::IndirectCommandsVertexBufferTokenEXT * pVertexBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pVertexBuffer = pVertexBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsTokenDataEXT &\n      setPIndexBuffer( const VULKAN_HPP_NAMESPACE::IndirectCommandsIndexBufferTokenEXT * pIndexBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pIndexBuffer = pIndexBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsTokenDataEXT &\n      setPExecutionSet( const VULKAN_HPP_NAMESPACE::IndirectCommandsExecutionSetTokenEXT * pExecutionSet_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pExecutionSet = pExecutionSet_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkIndirectCommandsTokenDataEXT const &() const\n    {\n      return *reinterpret_cast<const VkIndirectCommandsTokenDataEXT *>( this );\n    }\n\n    operator VkIndirectCommandsTokenDataEXT &()\n    {\n      return *reinterpret_cast<VkIndirectCommandsTokenDataEXT *>( this );\n    }\n\n#ifdef VULKAN_HPP_HAS_UNRESTRICTED_UNIONS\n    const VULKAN_HPP_NAMESPACE::IndirectCommandsPushConstantTokenEXT * pPushConstant;\n    const VULKAN_HPP_NAMESPACE::IndirectCommandsVertexBufferTokenEXT * pVertexBuffer;\n    const VULKAN_HPP_NAMESPACE::IndirectCommandsIndexBufferTokenEXT *  pIndexBuffer;\n    const VULKAN_HPP_NAMESPACE::IndirectCommandsExecutionSetTokenEXT * pExecutionSet;\n#else\n    const VkIndirectCommandsPushConstantTokenEXT * pPushConstant;\n    const VkIndirectCommandsVertexBufferTokenEXT * pVertexBuffer;\n    const VkIndirectCommandsIndexBufferTokenEXT *  pIndexBuffer;\n    const VkIndirectCommandsExecutionSetTokenEXT * pExecutionSet;\n#endif /*VULKAN_HPP_HAS_UNRESTRICTED_UNIONS*/\n  };\n\n  struct IndirectCommandsLayoutTokenEXT\n  {\n    using NativeType = VkIndirectCommandsLayoutTokenEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eIndirectCommandsLayoutTokenEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutTokenEXT(\n      VULKAN_HPP_NAMESPACE::IndirectCommandsTokenTypeEXT type_   = VULKAN_HPP_NAMESPACE::IndirectCommandsTokenTypeEXT::eExecutionSet,\n      VULKAN_HPP_NAMESPACE::IndirectCommandsTokenDataEXT data_   = {},\n      uint32_t                                           offset_ = {},\n      const void *                                       pNext_  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , type{ type_ }\n      , data{ data_ }\n      , offset{ offset_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutTokenEXT( IndirectCommandsLayoutTokenEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    IndirectCommandsLayoutTokenEXT( VkIndirectCommandsLayoutTokenEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : IndirectCommandsLayoutTokenEXT( *reinterpret_cast<IndirectCommandsLayoutTokenEXT const *>( &rhs ) )\n    {\n    }\n\n    IndirectCommandsLayoutTokenEXT & operator=( IndirectCommandsLayoutTokenEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    IndirectCommandsLayoutTokenEXT & operator=( VkIndirectCommandsLayoutTokenEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutTokenEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutTokenEXT & setType( VULKAN_HPP_NAMESPACE::IndirectCommandsTokenTypeEXT type_ ) VULKAN_HPP_NOEXCEPT\n    {\n      type = type_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutTokenEXT & setData( VULKAN_HPP_NAMESPACE::IndirectCommandsTokenDataEXT const & data_ ) VULKAN_HPP_NOEXCEPT\n    {\n      data = data_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutTokenEXT & setOffset( uint32_t offset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      offset = offset_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkIndirectCommandsLayoutTokenEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkIndirectCommandsLayoutTokenEXT *>( this );\n    }\n\n    operator VkIndirectCommandsLayoutTokenEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkIndirectCommandsLayoutTokenEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::IndirectCommandsTokenTypeEXT const &,\n               VULKAN_HPP_NAMESPACE::IndirectCommandsTokenDataEXT const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, type, data, offset );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                sType  = StructureType::eIndirectCommandsLayoutTokenEXT;\n    const void *                                       pNext  = {};\n    VULKAN_HPP_NAMESPACE::IndirectCommandsTokenTypeEXT type   = VULKAN_HPP_NAMESPACE::IndirectCommandsTokenTypeEXT::eExecutionSet;\n    VULKAN_HPP_NAMESPACE::IndirectCommandsTokenDataEXT data   = {};\n    uint32_t                                           offset = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eIndirectCommandsLayoutTokenEXT>\n  {\n    using Type = IndirectCommandsLayoutTokenEXT;\n  };\n\n  struct IndirectCommandsLayoutCreateInfoEXT\n  {\n    using NativeType = VkIndirectCommandsLayoutCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eIndirectCommandsLayoutCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR IndirectCommandsLayoutCreateInfoEXT( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutUsageFlagsEXT    flags_          = {},\n                                                              VULKAN_HPP_NAMESPACE::ShaderStageFlags                       shaderStages_   = {},\n                                                              uint32_t                                                     indirectStride_ = {},\n                                                              VULKAN_HPP_NAMESPACE::PipelineLayout                         pipelineLayout_ = {},\n                                                              uint32_t                                                     tokenCount_     = {},\n                                                              const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenEXT * pTokens_        = {},\n                                                              const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , shaderStages{ shaderStages_ }\n      , indirectStride{ indirectStride_ }\n      , pipelineLayout{ pipelineLayout_ }\n      , tokenCount{ tokenCount_ }\n      , pTokens{ pTokens_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR IndirectCommandsLayoutCreateInfoEXT( IndirectCommandsLayoutCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    IndirectCommandsLayoutCreateInfoEXT( VkIndirectCommandsLayoutCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : IndirectCommandsLayoutCreateInfoEXT( *reinterpret_cast<IndirectCommandsLayoutCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    IndirectCommandsLayoutCreateInfoEXT(\n      VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutUsageFlagsEXT                                                         flags_,\n      VULKAN_HPP_NAMESPACE::ShaderStageFlags                                                                            shaderStages_,\n      uint32_t                                                                                                          indirectStride_,\n      VULKAN_HPP_NAMESPACE::PipelineLayout                                                                              pipelineLayout_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenEXT> const & tokens_,\n      const void *                                                                                                      pNext_ = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , shaderStages( shaderStages_ )\n      , indirectStride( indirectStride_ )\n      , pipelineLayout( pipelineLayout_ )\n      , tokenCount( static_cast<uint32_t>( tokens_.size() ) )\n      , pTokens( tokens_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    IndirectCommandsLayoutCreateInfoEXT & operator=( IndirectCommandsLayoutCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    IndirectCommandsLayoutCreateInfoEXT & operator=( VkIndirectCommandsLayoutCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutCreateInfoEXT &\n      setFlags( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutUsageFlagsEXT flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutCreateInfoEXT & setShaderStages( VULKAN_HPP_NAMESPACE::ShaderStageFlags shaderStages_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderStages = shaderStages_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutCreateInfoEXT & setIndirectStride( uint32_t indirectStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indirectStride = indirectStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutCreateInfoEXT & setPipelineLayout( VULKAN_HPP_NAMESPACE::PipelineLayout pipelineLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineLayout = pipelineLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutCreateInfoEXT & setTokenCount( uint32_t tokenCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tokenCount = tokenCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutCreateInfoEXT &\n      setPTokens( const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenEXT * pTokens_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pTokens = pTokens_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    IndirectCommandsLayoutCreateInfoEXT &\n      setTokens( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenEXT> const & tokens_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tokenCount = static_cast<uint32_t>( tokens_.size() );\n      pTokens    = tokens_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkIndirectCommandsLayoutCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkIndirectCommandsLayoutCreateInfoEXT *>( this );\n    }\n\n    operator VkIndirectCommandsLayoutCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkIndirectCommandsLayoutCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutUsageFlagsEXT const &,\n               VULKAN_HPP_NAMESPACE::ShaderStageFlags const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::PipelineLayout const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenEXT * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, shaderStages, indirectStride, pipelineLayout, tokenCount, pTokens );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( IndirectCommandsLayoutCreateInfoEXT const & ) const = default;\n#else\n    bool                                           operator==( IndirectCommandsLayoutCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( shaderStages == rhs.shaderStages ) &&\n             ( indirectStride == rhs.indirectStride ) && ( pipelineLayout == rhs.pipelineLayout ) && ( tokenCount == rhs.tokenCount ) &&\n             ( pTokens == rhs.pTokens );\n#  endif\n    }\n\n    bool operator!=( IndirectCommandsLayoutCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                          sType          = StructureType::eIndirectCommandsLayoutCreateInfoEXT;\n    const void *                                                 pNext          = {};\n    VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutUsageFlagsEXT    flags          = {};\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags                       shaderStages   = {};\n    uint32_t                                                     indirectStride = {};\n    VULKAN_HPP_NAMESPACE::PipelineLayout                         pipelineLayout = {};\n    uint32_t                                                     tokenCount     = {};\n    const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenEXT * pTokens        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eIndirectCommandsLayoutCreateInfoEXT>\n  {\n    using Type = IndirectCommandsLayoutCreateInfoEXT;\n  };\n\n  struct IndirectCommandsLayoutTokenNV\n  {\n    using NativeType = VkIndirectCommandsLayoutTokenNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eIndirectCommandsLayoutTokenNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR IndirectCommandsLayoutTokenNV(\n      VULKAN_HPP_NAMESPACE::IndirectCommandsTokenTypeNV tokenType_                    = VULKAN_HPP_NAMESPACE::IndirectCommandsTokenTypeNV::eShaderGroup,\n      uint32_t                                          stream_                       = {},\n      uint32_t                                          offset_                       = {},\n      uint32_t                                          vertexBindingUnit_            = {},\n      VULKAN_HPP_NAMESPACE::Bool32                      vertexDynamicStride_          = {},\n      VULKAN_HPP_NAMESPACE::PipelineLayout              pushconstantPipelineLayout_   = {},\n      VULKAN_HPP_NAMESPACE::ShaderStageFlags            pushconstantShaderStageFlags_ = {},\n      uint32_t                                          pushconstantOffset_           = {},\n      uint32_t                                          pushconstantSize_             = {},\n      VULKAN_HPP_NAMESPACE::IndirectStateFlagsNV        indirectStateFlags_           = {},\n      uint32_t                                          indexTypeCount_               = {},\n      const VULKAN_HPP_NAMESPACE::IndexType *           pIndexTypes_                  = {},\n      const uint32_t *                                  pIndexTypeValues_             = {},\n      const void *                                      pNext_                        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , tokenType{ tokenType_ }\n      , stream{ stream_ }\n      , offset{ offset_ }\n      , vertexBindingUnit{ vertexBindingUnit_ }\n      , vertexDynamicStride{ vertexDynamicStride_ }\n      , pushconstantPipelineLayout{ pushconstantPipelineLayout_ }\n      , pushconstantShaderStageFlags{ pushconstantShaderStageFlags_ }\n      , pushconstantOffset{ pushconstantOffset_ }\n      , pushconstantSize{ pushconstantSize_ }\n      , indirectStateFlags{ indirectStateFlags_ }\n      , indexTypeCount{ indexTypeCount_ }\n      , pIndexTypes{ pIndexTypes_ }\n      , pIndexTypeValues{ pIndexTypeValues_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR IndirectCommandsLayoutTokenNV( IndirectCommandsLayoutTokenNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    IndirectCommandsLayoutTokenNV( VkIndirectCommandsLayoutTokenNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : IndirectCommandsLayoutTokenNV( *reinterpret_cast<IndirectCommandsLayoutTokenNV const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    IndirectCommandsLayoutTokenNV( VULKAN_HPP_NAMESPACE::IndirectCommandsTokenTypeNV                                            tokenType_,\n                                   uint32_t                                                                                     stream_,\n                                   uint32_t                                                                                     offset_,\n                                   uint32_t                                                                                     vertexBindingUnit_,\n                                   VULKAN_HPP_NAMESPACE::Bool32                                                                 vertexDynamicStride_,\n                                   VULKAN_HPP_NAMESPACE::PipelineLayout                                                         pushconstantPipelineLayout_,\n                                   VULKAN_HPP_NAMESPACE::ShaderStageFlags                                                       pushconstantShaderStageFlags_,\n                                   uint32_t                                                                                     pushconstantOffset_,\n                                   uint32_t                                                                                     pushconstantSize_,\n                                   VULKAN_HPP_NAMESPACE::IndirectStateFlagsNV                                                   indirectStateFlags_,\n                                   VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::IndexType> const & indexTypes_,\n                                   VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const &                        indexTypeValues_ = {},\n                                   const void *                                                                                 pNext_           = nullptr )\n      : pNext( pNext_ )\n      , tokenType( tokenType_ )\n      , stream( stream_ )\n      , offset( offset_ )\n      , vertexBindingUnit( vertexBindingUnit_ )\n      , vertexDynamicStride( vertexDynamicStride_ )\n      , pushconstantPipelineLayout( pushconstantPipelineLayout_ )\n      , pushconstantShaderStageFlags( pushconstantShaderStageFlags_ )\n      , pushconstantOffset( pushconstantOffset_ )\n      , pushconstantSize( pushconstantSize_ )\n      , indirectStateFlags( indirectStateFlags_ )\n      , indexTypeCount( static_cast<uint32_t>( indexTypes_.size() ) )\n      , pIndexTypes( indexTypes_.data() )\n      , pIndexTypeValues( indexTypeValues_.data() )\n    {\n#    ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( indexTypes_.size() == indexTypeValues_.size() );\n#    else\n      if ( indexTypes_.size() != indexTypeValues_.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING\n                          \"::IndirectCommandsLayoutTokenNV::IndirectCommandsLayoutTokenNV: indexTypes_.size() != indexTypeValues_.size()\" );\n      }\n#    endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    IndirectCommandsLayoutTokenNV & operator=( IndirectCommandsLayoutTokenNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    IndirectCommandsLayoutTokenNV & operator=( VkIndirectCommandsLayoutTokenNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutTokenNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutTokenNV & setTokenType( VULKAN_HPP_NAMESPACE::IndirectCommandsTokenTypeNV tokenType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tokenType = tokenType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutTokenNV & setStream( uint32_t stream_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stream = stream_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutTokenNV & setOffset( uint32_t offset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      offset = offset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutTokenNV & setVertexBindingUnit( uint32_t vertexBindingUnit_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexBindingUnit = vertexBindingUnit_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutTokenNV & setVertexDynamicStride( VULKAN_HPP_NAMESPACE::Bool32 vertexDynamicStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexDynamicStride = vertexDynamicStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutTokenNV &\n      setPushconstantPipelineLayout( VULKAN_HPP_NAMESPACE::PipelineLayout pushconstantPipelineLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pushconstantPipelineLayout = pushconstantPipelineLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutTokenNV &\n      setPushconstantShaderStageFlags( VULKAN_HPP_NAMESPACE::ShaderStageFlags pushconstantShaderStageFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pushconstantShaderStageFlags = pushconstantShaderStageFlags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutTokenNV & setPushconstantOffset( uint32_t pushconstantOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pushconstantOffset = pushconstantOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutTokenNV & setPushconstantSize( uint32_t pushconstantSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pushconstantSize = pushconstantSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutTokenNV &\n      setIndirectStateFlags( VULKAN_HPP_NAMESPACE::IndirectStateFlagsNV indirectStateFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indirectStateFlags = indirectStateFlags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutTokenNV & setIndexTypeCount( uint32_t indexTypeCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexTypeCount = indexTypeCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutTokenNV & setPIndexTypes( const VULKAN_HPP_NAMESPACE::IndexType * pIndexTypes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pIndexTypes = pIndexTypes_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    IndirectCommandsLayoutTokenNV &\n      setIndexTypes( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::IndexType> const & indexTypes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexTypeCount = static_cast<uint32_t>( indexTypes_.size() );\n      pIndexTypes    = indexTypes_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutTokenNV & setPIndexTypeValues( const uint32_t * pIndexTypeValues_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pIndexTypeValues = pIndexTypeValues_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    IndirectCommandsLayoutTokenNV &\n      setIndexTypeValues( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & indexTypeValues_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexTypeCount   = static_cast<uint32_t>( indexTypeValues_.size() );\n      pIndexTypeValues = indexTypeValues_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkIndirectCommandsLayoutTokenNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkIndirectCommandsLayoutTokenNV *>( this );\n    }\n\n    operator VkIndirectCommandsLayoutTokenNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkIndirectCommandsLayoutTokenNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::IndirectCommandsTokenTypeNV const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::PipelineLayout const &,\n               VULKAN_HPP_NAMESPACE::ShaderStageFlags const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::IndirectStateFlagsNV const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::IndexType * const &,\n               const uint32_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       tokenType,\n                       stream,\n                       offset,\n                       vertexBindingUnit,\n                       vertexDynamicStride,\n                       pushconstantPipelineLayout,\n                       pushconstantShaderStageFlags,\n                       pushconstantOffset,\n                       pushconstantSize,\n                       indirectStateFlags,\n                       indexTypeCount,\n                       pIndexTypes,\n                       pIndexTypeValues );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( IndirectCommandsLayoutTokenNV const & ) const = default;\n#else\n    bool operator==( IndirectCommandsLayoutTokenNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( tokenType == rhs.tokenType ) && ( stream == rhs.stream ) && ( offset == rhs.offset ) &&\n             ( vertexBindingUnit == rhs.vertexBindingUnit ) && ( vertexDynamicStride == rhs.vertexDynamicStride ) &&\n             ( pushconstantPipelineLayout == rhs.pushconstantPipelineLayout ) && ( pushconstantShaderStageFlags == rhs.pushconstantShaderStageFlags ) &&\n             ( pushconstantOffset == rhs.pushconstantOffset ) && ( pushconstantSize == rhs.pushconstantSize ) &&\n             ( indirectStateFlags == rhs.indirectStateFlags ) && ( indexTypeCount == rhs.indexTypeCount ) && ( pIndexTypes == rhs.pIndexTypes ) &&\n             ( pIndexTypeValues == rhs.pIndexTypeValues );\n#  endif\n    }\n\n    bool operator!=( IndirectCommandsLayoutTokenNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType                        = StructureType::eIndirectCommandsLayoutTokenNV;\n    const void *                                      pNext                        = {};\n    VULKAN_HPP_NAMESPACE::IndirectCommandsTokenTypeNV tokenType                    = VULKAN_HPP_NAMESPACE::IndirectCommandsTokenTypeNV::eShaderGroup;\n    uint32_t                                          stream                       = {};\n    uint32_t                                          offset                       = {};\n    uint32_t                                          vertexBindingUnit            = {};\n    VULKAN_HPP_NAMESPACE::Bool32                      vertexDynamicStride          = {};\n    VULKAN_HPP_NAMESPACE::PipelineLayout              pushconstantPipelineLayout   = {};\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags            pushconstantShaderStageFlags = {};\n    uint32_t                                          pushconstantOffset           = {};\n    uint32_t                                          pushconstantSize             = {};\n    VULKAN_HPP_NAMESPACE::IndirectStateFlagsNV        indirectStateFlags           = {};\n    uint32_t                                          indexTypeCount               = {};\n    const VULKAN_HPP_NAMESPACE::IndexType *           pIndexTypes                  = {};\n    const uint32_t *                                  pIndexTypeValues             = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eIndirectCommandsLayoutTokenNV>\n  {\n    using Type = IndirectCommandsLayoutTokenNV;\n  };\n\n  struct IndirectCommandsLayoutCreateInfoNV\n  {\n    using NativeType = VkIndirectCommandsLayoutCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eIndirectCommandsLayoutCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      IndirectCommandsLayoutCreateInfoNV( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutUsageFlagsNV flags_ = {},\n                                          VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint_      = VULKAN_HPP_NAMESPACE::PipelineBindPoint::eGraphics,\n                                          uint32_t                                tokenCount_             = {},\n                                          const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenNV * pTokens_        = {},\n                                          uint32_t                                                    streamCount_    = {},\n                                          const uint32_t *                                            pStreamStrides_ = {},\n                                          const void *                                                pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , pipelineBindPoint{ pipelineBindPoint_ }\n      , tokenCount{ tokenCount_ }\n      , pTokens{ pTokens_ }\n      , streamCount{ streamCount_ }\n      , pStreamStrides{ pStreamStrides_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR IndirectCommandsLayoutCreateInfoNV( IndirectCommandsLayoutCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    IndirectCommandsLayoutCreateInfoNV( VkIndirectCommandsLayoutCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : IndirectCommandsLayoutCreateInfoNV( *reinterpret_cast<IndirectCommandsLayoutCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    IndirectCommandsLayoutCreateInfoNV(\n      VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutUsageFlagsNV                                                         flags_,\n      VULKAN_HPP_NAMESPACE::PipelineBindPoint                                                                          pipelineBindPoint_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenNV> const & tokens_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const &                                            streamStrides_ = {},\n      const void *                                                                                                     pNext_         = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , pipelineBindPoint( pipelineBindPoint_ )\n      , tokenCount( static_cast<uint32_t>( tokens_.size() ) )\n      , pTokens( tokens_.data() )\n      , streamCount( static_cast<uint32_t>( streamStrides_.size() ) )\n      , pStreamStrides( streamStrides_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    IndirectCommandsLayoutCreateInfoNV & operator=( IndirectCommandsLayoutCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    IndirectCommandsLayoutCreateInfoNV & operator=( VkIndirectCommandsLayoutCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutCreateInfoNV & setFlags( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutUsageFlagsNV flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutCreateInfoNV &\n      setPipelineBindPoint( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineBindPoint = pipelineBindPoint_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutCreateInfoNV & setTokenCount( uint32_t tokenCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tokenCount = tokenCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutCreateInfoNV &\n      setPTokens( const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenNV * pTokens_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pTokens = pTokens_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    IndirectCommandsLayoutCreateInfoNV &\n      setTokens( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenNV> const & tokens_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tokenCount = static_cast<uint32_t>( tokens_.size() );\n      pTokens    = tokens_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutCreateInfoNV & setStreamCount( uint32_t streamCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      streamCount = streamCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectCommandsLayoutCreateInfoNV & setPStreamStrides( const uint32_t * pStreamStrides_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStreamStrides = pStreamStrides_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    IndirectCommandsLayoutCreateInfoNV &\n      setStreamStrides( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & streamStrides_ ) VULKAN_HPP_NOEXCEPT\n    {\n      streamCount    = static_cast<uint32_t>( streamStrides_.size() );\n      pStreamStrides = streamStrides_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkIndirectCommandsLayoutCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkIndirectCommandsLayoutCreateInfoNV *>( this );\n    }\n\n    operator VkIndirectCommandsLayoutCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkIndirectCommandsLayoutCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutUsageFlagsNV const &,\n               VULKAN_HPP_NAMESPACE::PipelineBindPoint const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenNV * const &,\n               uint32_t const &,\n               const uint32_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, pipelineBindPoint, tokenCount, pTokens, streamCount, pStreamStrides );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( IndirectCommandsLayoutCreateInfoNV const & ) const = default;\n#else\n    bool operator==( IndirectCommandsLayoutCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( pipelineBindPoint == rhs.pipelineBindPoint ) &&\n             ( tokenCount == rhs.tokenCount ) && ( pTokens == rhs.pTokens ) && ( streamCount == rhs.streamCount ) && ( pStreamStrides == rhs.pStreamStrides );\n#  endif\n    }\n\n    bool operator!=( IndirectCommandsLayoutCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                         sType             = StructureType::eIndirectCommandsLayoutCreateInfoNV;\n    const void *                                                pNext             = {};\n    VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutUsageFlagsNV    flags             = {};\n    VULKAN_HPP_NAMESPACE::PipelineBindPoint                     pipelineBindPoint = VULKAN_HPP_NAMESPACE::PipelineBindPoint::eGraphics;\n    uint32_t                                                    tokenCount        = {};\n    const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenNV * pTokens           = {};\n    uint32_t                                                    streamCount       = {};\n    const uint32_t *                                            pStreamStrides    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eIndirectCommandsLayoutCreateInfoNV>\n  {\n    using Type = IndirectCommandsLayoutCreateInfoNV;\n  };\n\n  struct IndirectExecutionSetPipelineInfoEXT\n  {\n    using NativeType = VkIndirectExecutionSetPipelineInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eIndirectExecutionSetPipelineInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR IndirectExecutionSetPipelineInfoEXT( VULKAN_HPP_NAMESPACE::Pipeline initialPipeline_  = {},\n                                                              uint32_t                       maxPipelineCount_ = {},\n                                                              const void *                   pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , initialPipeline{ initialPipeline_ }\n      , maxPipelineCount{ maxPipelineCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR IndirectExecutionSetPipelineInfoEXT( IndirectExecutionSetPipelineInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    IndirectExecutionSetPipelineInfoEXT( VkIndirectExecutionSetPipelineInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : IndirectExecutionSetPipelineInfoEXT( *reinterpret_cast<IndirectExecutionSetPipelineInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    IndirectExecutionSetPipelineInfoEXT & operator=( IndirectExecutionSetPipelineInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    IndirectExecutionSetPipelineInfoEXT & operator=( VkIndirectExecutionSetPipelineInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::IndirectExecutionSetPipelineInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 IndirectExecutionSetPipelineInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectExecutionSetPipelineInfoEXT & setInitialPipeline( VULKAN_HPP_NAMESPACE::Pipeline initialPipeline_ ) VULKAN_HPP_NOEXCEPT\n    {\n      initialPipeline = initialPipeline_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectExecutionSetPipelineInfoEXT & setMaxPipelineCount( uint32_t maxPipelineCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxPipelineCount = maxPipelineCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkIndirectExecutionSetPipelineInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkIndirectExecutionSetPipelineInfoEXT *>( this );\n    }\n\n    operator VkIndirectExecutionSetPipelineInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkIndirectExecutionSetPipelineInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Pipeline const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, initialPipeline, maxPipelineCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( IndirectExecutionSetPipelineInfoEXT const & ) const = default;\n#else\n    bool operator==( IndirectExecutionSetPipelineInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( initialPipeline == rhs.initialPipeline ) && ( maxPipelineCount == rhs.maxPipelineCount );\n#  endif\n    }\n\n    bool operator!=( IndirectExecutionSetPipelineInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType            = StructureType::eIndirectExecutionSetPipelineInfoEXT;\n    const void *                        pNext            = {};\n    VULKAN_HPP_NAMESPACE::Pipeline      initialPipeline  = {};\n    uint32_t                            maxPipelineCount = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eIndirectExecutionSetPipelineInfoEXT>\n  {\n    using Type = IndirectExecutionSetPipelineInfoEXT;\n  };\n\n  struct IndirectExecutionSetShaderLayoutInfoEXT\n  {\n    using NativeType = VkIndirectExecutionSetShaderLayoutInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eIndirectExecutionSetShaderLayoutInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR IndirectExecutionSetShaderLayoutInfoEXT( uint32_t                                          setLayoutCount_ = {},\n                                                                  const VULKAN_HPP_NAMESPACE::DescriptorSetLayout * pSetLayouts_    = {},\n                                                                  const void *                                      pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , setLayoutCount{ setLayoutCount_ }\n      , pSetLayouts{ pSetLayouts_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR IndirectExecutionSetShaderLayoutInfoEXT( IndirectExecutionSetShaderLayoutInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    IndirectExecutionSetShaderLayoutInfoEXT( VkIndirectExecutionSetShaderLayoutInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : IndirectExecutionSetShaderLayoutInfoEXT( *reinterpret_cast<IndirectExecutionSetShaderLayoutInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    IndirectExecutionSetShaderLayoutInfoEXT( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorSetLayout> const & setLayouts_,\n                                             const void * pNext_ = nullptr )\n      : pNext( pNext_ ), setLayoutCount( static_cast<uint32_t>( setLayouts_.size() ) ), pSetLayouts( setLayouts_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    IndirectExecutionSetShaderLayoutInfoEXT & operator=( IndirectExecutionSetShaderLayoutInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    IndirectExecutionSetShaderLayoutInfoEXT & operator=( VkIndirectExecutionSetShaderLayoutInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::IndirectExecutionSetShaderLayoutInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 IndirectExecutionSetShaderLayoutInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectExecutionSetShaderLayoutInfoEXT & setSetLayoutCount( uint32_t setLayoutCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      setLayoutCount = setLayoutCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectExecutionSetShaderLayoutInfoEXT &\n      setPSetLayouts( const VULKAN_HPP_NAMESPACE::DescriptorSetLayout * pSetLayouts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSetLayouts = pSetLayouts_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    IndirectExecutionSetShaderLayoutInfoEXT &\n      setSetLayouts( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorSetLayout> const & setLayouts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      setLayoutCount = static_cast<uint32_t>( setLayouts_.size() );\n      pSetLayouts    = setLayouts_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkIndirectExecutionSetShaderLayoutInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkIndirectExecutionSetShaderLayoutInfoEXT *>( this );\n    }\n\n    operator VkIndirectExecutionSetShaderLayoutInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkIndirectExecutionSetShaderLayoutInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::DescriptorSetLayout * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, setLayoutCount, pSetLayouts );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( IndirectExecutionSetShaderLayoutInfoEXT const & ) const = default;\n#else\n    bool operator==( IndirectExecutionSetShaderLayoutInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( setLayoutCount == rhs.setLayoutCount ) && ( pSetLayouts == rhs.pSetLayouts );\n#  endif\n    }\n\n    bool operator!=( IndirectExecutionSetShaderLayoutInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType          = StructureType::eIndirectExecutionSetShaderLayoutInfoEXT;\n    const void *                                      pNext          = {};\n    uint32_t                                          setLayoutCount = {};\n    const VULKAN_HPP_NAMESPACE::DescriptorSetLayout * pSetLayouts    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eIndirectExecutionSetShaderLayoutInfoEXT>\n  {\n    using Type = IndirectExecutionSetShaderLayoutInfoEXT;\n  };\n\n  struct IndirectExecutionSetShaderInfoEXT\n  {\n    using NativeType = VkIndirectExecutionSetShaderInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eIndirectExecutionSetShaderInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR IndirectExecutionSetShaderInfoEXT( uint32_t                                                              shaderCount_            = {},\n                                                            const VULKAN_HPP_NAMESPACE::ShaderEXT *                               pInitialShaders_        = {},\n                                                            const VULKAN_HPP_NAMESPACE::IndirectExecutionSetShaderLayoutInfoEXT * pSetLayoutInfos_        = {},\n                                                            uint32_t                                                              maxShaderCount_         = {},\n                                                            uint32_t                                                              pushConstantRangeCount_ = {},\n                                                            const VULKAN_HPP_NAMESPACE::PushConstantRange *                       pPushConstantRanges_    = {},\n                                                            const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderCount{ shaderCount_ }\n      , pInitialShaders{ pInitialShaders_ }\n      , pSetLayoutInfos{ pSetLayoutInfos_ }\n      , maxShaderCount{ maxShaderCount_ }\n      , pushConstantRangeCount{ pushConstantRangeCount_ }\n      , pPushConstantRanges{ pPushConstantRanges_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR IndirectExecutionSetShaderInfoEXT( IndirectExecutionSetShaderInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    IndirectExecutionSetShaderInfoEXT( VkIndirectExecutionSetShaderInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : IndirectExecutionSetShaderInfoEXT( *reinterpret_cast<IndirectExecutionSetShaderInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    IndirectExecutionSetShaderInfoEXT(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ShaderEXT> const &                               initialShaders_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::IndirectExecutionSetShaderLayoutInfoEXT> const & setLayoutInfos_     = {},\n      uint32_t                                                                                                                   maxShaderCount_     = {},\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PushConstantRange> const &                       pushConstantRanges_ = {},\n      const void *                                                                                                               pNext_              = nullptr )\n      : pNext( pNext_ )\n      , shaderCount( static_cast<uint32_t>( initialShaders_.size() ) )\n      , pInitialShaders( initialShaders_.data() )\n      , pSetLayoutInfos( setLayoutInfos_.data() )\n      , maxShaderCount( maxShaderCount_ )\n      , pushConstantRangeCount( static_cast<uint32_t>( pushConstantRanges_.size() ) )\n      , pPushConstantRanges( pushConstantRanges_.data() )\n    {\n#    ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( setLayoutInfos_.empty() || ( initialShaders_.size() == setLayoutInfos_.size() ) );\n#    else\n      if ( !setLayoutInfos_.empty() && ( initialShaders_.size() != setLayoutInfos_.size() ) )\n      {\n        throw LogicError(\n          VULKAN_HPP_NAMESPACE_STRING\n          \"::IndirectExecutionSetShaderInfoEXT::IndirectExecutionSetShaderInfoEXT: !setLayoutInfos_.empty() && ( initialShaders_.size() != setLayoutInfos_.size() )\" );\n      }\n#    endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    IndirectExecutionSetShaderInfoEXT & operator=( IndirectExecutionSetShaderInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    IndirectExecutionSetShaderInfoEXT & operator=( VkIndirectExecutionSetShaderInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::IndirectExecutionSetShaderInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 IndirectExecutionSetShaderInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectExecutionSetShaderInfoEXT & setShaderCount( uint32_t shaderCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderCount = shaderCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectExecutionSetShaderInfoEXT &\n      setPInitialShaders( const VULKAN_HPP_NAMESPACE::ShaderEXT * pInitialShaders_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pInitialShaders = pInitialShaders_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    IndirectExecutionSetShaderInfoEXT &\n      setInitialShaders( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ShaderEXT> const & initialShaders_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderCount     = static_cast<uint32_t>( initialShaders_.size() );\n      pInitialShaders = initialShaders_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectExecutionSetShaderInfoEXT &\n      setPSetLayoutInfos( const VULKAN_HPP_NAMESPACE::IndirectExecutionSetShaderLayoutInfoEXT * pSetLayoutInfos_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSetLayoutInfos = pSetLayoutInfos_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    IndirectExecutionSetShaderInfoEXT & setSetLayoutInfos(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::IndirectExecutionSetShaderLayoutInfoEXT> const & setLayoutInfos_ )\n      VULKAN_HPP_NOEXCEPT\n    {\n      shaderCount     = static_cast<uint32_t>( setLayoutInfos_.size() );\n      pSetLayoutInfos = setLayoutInfos_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectExecutionSetShaderInfoEXT & setMaxShaderCount( uint32_t maxShaderCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxShaderCount = maxShaderCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectExecutionSetShaderInfoEXT & setPushConstantRangeCount( uint32_t pushConstantRangeCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pushConstantRangeCount = pushConstantRangeCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectExecutionSetShaderInfoEXT &\n      setPPushConstantRanges( const VULKAN_HPP_NAMESPACE::PushConstantRange * pPushConstantRanges_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPushConstantRanges = pPushConstantRanges_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    IndirectExecutionSetShaderInfoEXT & setPushConstantRanges(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PushConstantRange> const & pushConstantRanges_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pushConstantRangeCount = static_cast<uint32_t>( pushConstantRanges_.size() );\n      pPushConstantRanges    = pushConstantRanges_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkIndirectExecutionSetShaderInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkIndirectExecutionSetShaderInfoEXT *>( this );\n    }\n\n    operator VkIndirectExecutionSetShaderInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkIndirectExecutionSetShaderInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::ShaderEXT * const &,\n               const VULKAN_HPP_NAMESPACE::IndirectExecutionSetShaderLayoutInfoEXT * const &,\n               uint32_t const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::PushConstantRange * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderCount, pInitialShaders, pSetLayoutInfos, maxShaderCount, pushConstantRangeCount, pPushConstantRanges );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( IndirectExecutionSetShaderInfoEXT const & ) const = default;\n#else\n    bool operator==( IndirectExecutionSetShaderInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderCount == rhs.shaderCount ) && ( pInitialShaders == rhs.pInitialShaders ) &&\n             ( pSetLayoutInfos == rhs.pSetLayoutInfos ) && ( maxShaderCount == rhs.maxShaderCount ) &&\n             ( pushConstantRangeCount == rhs.pushConstantRangeCount ) && ( pPushConstantRanges == rhs.pPushConstantRanges );\n#  endif\n    }\n\n    bool operator!=( IndirectExecutionSetShaderInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                   sType                  = StructureType::eIndirectExecutionSetShaderInfoEXT;\n    const void *                                                          pNext                  = {};\n    uint32_t                                                              shaderCount            = {};\n    const VULKAN_HPP_NAMESPACE::ShaderEXT *                               pInitialShaders        = {};\n    const VULKAN_HPP_NAMESPACE::IndirectExecutionSetShaderLayoutInfoEXT * pSetLayoutInfos        = {};\n    uint32_t                                                              maxShaderCount         = {};\n    uint32_t                                                              pushConstantRangeCount = {};\n    const VULKAN_HPP_NAMESPACE::PushConstantRange *                       pPushConstantRanges    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eIndirectExecutionSetShaderInfoEXT>\n  {\n    using Type = IndirectExecutionSetShaderInfoEXT;\n  };\n\n  union IndirectExecutionSetInfoEXT\n  {\n    using NativeType = VkIndirectExecutionSetInfoEXT;\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectExecutionSetInfoEXT( const VULKAN_HPP_NAMESPACE::IndirectExecutionSetPipelineInfoEXT * pPipelineInfo_ = {} )\n      : pPipelineInfo( pPipelineInfo_ )\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectExecutionSetInfoEXT( const VULKAN_HPP_NAMESPACE::IndirectExecutionSetShaderInfoEXT * pShaderInfo_ )\n      : pShaderInfo( pShaderInfo_ )\n    {\n    }\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_UNION_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 IndirectExecutionSetInfoEXT &\n      setPPipelineInfo( const VULKAN_HPP_NAMESPACE::IndirectExecutionSetPipelineInfoEXT * pPipelineInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPipelineInfo = pPipelineInfo_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectExecutionSetInfoEXT &\n      setPShaderInfo( const VULKAN_HPP_NAMESPACE::IndirectExecutionSetShaderInfoEXT * pShaderInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pShaderInfo = pShaderInfo_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkIndirectExecutionSetInfoEXT const &() const\n    {\n      return *reinterpret_cast<const VkIndirectExecutionSetInfoEXT *>( this );\n    }\n\n    operator VkIndirectExecutionSetInfoEXT &()\n    {\n      return *reinterpret_cast<VkIndirectExecutionSetInfoEXT *>( this );\n    }\n\n#ifdef VULKAN_HPP_HAS_UNRESTRICTED_UNIONS\n    const VULKAN_HPP_NAMESPACE::IndirectExecutionSetPipelineInfoEXT * pPipelineInfo;\n    const VULKAN_HPP_NAMESPACE::IndirectExecutionSetShaderInfoEXT *   pShaderInfo;\n#else\n    const VkIndirectExecutionSetPipelineInfoEXT * pPipelineInfo;\n    const VkIndirectExecutionSetShaderInfoEXT *   pShaderInfo;\n#endif /*VULKAN_HPP_HAS_UNRESTRICTED_UNIONS*/\n  };\n\n  struct IndirectExecutionSetCreateInfoEXT\n  {\n    using NativeType = VkIndirectExecutionSetCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eIndirectExecutionSetCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 IndirectExecutionSetCreateInfoEXT(\n      VULKAN_HPP_NAMESPACE::IndirectExecutionSetInfoTypeEXT type_  = VULKAN_HPP_NAMESPACE::IndirectExecutionSetInfoTypeEXT::ePipelines,\n      VULKAN_HPP_NAMESPACE::IndirectExecutionSetInfoEXT     info_  = {},\n      const void *                                          pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , type{ type_ }\n      , info{ info_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectExecutionSetCreateInfoEXT( IndirectExecutionSetCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    IndirectExecutionSetCreateInfoEXT( VkIndirectExecutionSetCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : IndirectExecutionSetCreateInfoEXT( *reinterpret_cast<IndirectExecutionSetCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    IndirectExecutionSetCreateInfoEXT & operator=( IndirectExecutionSetCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    IndirectExecutionSetCreateInfoEXT & operator=( VkIndirectExecutionSetCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::IndirectExecutionSetCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 IndirectExecutionSetCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectExecutionSetCreateInfoEXT & setType( VULKAN_HPP_NAMESPACE::IndirectExecutionSetInfoTypeEXT type_ ) VULKAN_HPP_NOEXCEPT\n    {\n      type = type_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 IndirectExecutionSetCreateInfoEXT & setInfo( VULKAN_HPP_NAMESPACE::IndirectExecutionSetInfoEXT const & info_ ) VULKAN_HPP_NOEXCEPT\n    {\n      info = info_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkIndirectExecutionSetCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkIndirectExecutionSetCreateInfoEXT *>( this );\n    }\n\n    operator VkIndirectExecutionSetCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkIndirectExecutionSetCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::IndirectExecutionSetInfoTypeEXT const &,\n               VULKAN_HPP_NAMESPACE::IndirectExecutionSetInfoEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, type, info );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                   sType = StructureType::eIndirectExecutionSetCreateInfoEXT;\n    const void *                                          pNext = {};\n    VULKAN_HPP_NAMESPACE::IndirectExecutionSetInfoTypeEXT type  = VULKAN_HPP_NAMESPACE::IndirectExecutionSetInfoTypeEXT::ePipelines;\n    VULKAN_HPP_NAMESPACE::IndirectExecutionSetInfoEXT     info  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eIndirectExecutionSetCreateInfoEXT>\n  {\n    using Type = IndirectExecutionSetCreateInfoEXT;\n  };\n\n  struct InitializePerformanceApiInfoINTEL\n  {\n    using NativeType = VkInitializePerformanceApiInfoINTEL;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eInitializePerformanceApiInfoINTEL;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR InitializePerformanceApiInfoINTEL( void * pUserData_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pUserData{ pUserData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR InitializePerformanceApiInfoINTEL( InitializePerformanceApiInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    InitializePerformanceApiInfoINTEL( VkInitializePerformanceApiInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT\n      : InitializePerformanceApiInfoINTEL( *reinterpret_cast<InitializePerformanceApiInfoINTEL const *>( &rhs ) )\n    {\n    }\n\n    InitializePerformanceApiInfoINTEL & operator=( InitializePerformanceApiInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    InitializePerformanceApiInfoINTEL & operator=( VkInitializePerformanceApiInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::InitializePerformanceApiInfoINTEL const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 InitializePerformanceApiInfoINTEL & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 InitializePerformanceApiInfoINTEL & setPUserData( void * pUserData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pUserData = pUserData_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkInitializePerformanceApiInfoINTEL const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkInitializePerformanceApiInfoINTEL *>( this );\n    }\n\n    operator VkInitializePerformanceApiInfoINTEL &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkInitializePerformanceApiInfoINTEL *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pUserData );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( InitializePerformanceApiInfoINTEL const & ) const = default;\n#else\n    bool                                          operator==( InitializePerformanceApiInfoINTEL const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pUserData == rhs.pUserData );\n#  endif\n    }\n\n    bool operator!=( InitializePerformanceApiInfoINTEL const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType     = StructureType::eInitializePerformanceApiInfoINTEL;\n    const void *                        pNext     = {};\n    void *                              pUserData = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eInitializePerformanceApiInfoINTEL>\n  {\n    using Type = InitializePerformanceApiInfoINTEL;\n  };\n\n  struct InputAttachmentAspectReference\n  {\n    using NativeType = VkInputAttachmentAspectReference;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR InputAttachmentAspectReference( uint32_t                               subpass_              = {},\n                                                         uint32_t                               inputAttachmentIndex_ = {},\n                                                         VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask_           = {} ) VULKAN_HPP_NOEXCEPT\n      : subpass{ subpass_ }\n      , inputAttachmentIndex{ inputAttachmentIndex_ }\n      , aspectMask{ aspectMask_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR InputAttachmentAspectReference( InputAttachmentAspectReference const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    InputAttachmentAspectReference( VkInputAttachmentAspectReference const & rhs ) VULKAN_HPP_NOEXCEPT\n      : InputAttachmentAspectReference( *reinterpret_cast<InputAttachmentAspectReference const *>( &rhs ) )\n    {\n    }\n\n    InputAttachmentAspectReference & operator=( InputAttachmentAspectReference const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    InputAttachmentAspectReference & operator=( VkInputAttachmentAspectReference const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::InputAttachmentAspectReference const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 InputAttachmentAspectReference & setSubpass( uint32_t subpass_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subpass = subpass_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 InputAttachmentAspectReference & setInputAttachmentIndex( uint32_t inputAttachmentIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      inputAttachmentIndex = inputAttachmentIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 InputAttachmentAspectReference & setAspectMask( VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      aspectMask = aspectMask_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkInputAttachmentAspectReference const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkInputAttachmentAspectReference *>( this );\n    }\n\n    operator VkInputAttachmentAspectReference &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkInputAttachmentAspectReference *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &, VULKAN_HPP_NAMESPACE::ImageAspectFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( subpass, inputAttachmentIndex, aspectMask );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( InputAttachmentAspectReference const & ) const = default;\n#else\n    bool operator==( InputAttachmentAspectReference const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( subpass == rhs.subpass ) && ( inputAttachmentIndex == rhs.inputAttachmentIndex ) && ( aspectMask == rhs.aspectMask );\n#  endif\n    }\n\n    bool operator!=( InputAttachmentAspectReference const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                               subpass              = {};\n    uint32_t                               inputAttachmentIndex = {};\n    VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask           = {};\n  };\n\n  using InputAttachmentAspectReferenceKHR = InputAttachmentAspectReference;\n\n  struct InstanceCreateInfo\n  {\n    using NativeType = VkInstanceCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eInstanceCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR InstanceCreateInfo( VULKAN_HPP_NAMESPACE::InstanceCreateFlags     flags_                   = {},\n                                             const VULKAN_HPP_NAMESPACE::ApplicationInfo * pApplicationInfo_        = {},\n                                             uint32_t                                      enabledLayerCount_       = {},\n                                             const char * const *                          ppEnabledLayerNames_     = {},\n                                             uint32_t                                      enabledExtensionCount_   = {},\n                                             const char * const *                          ppEnabledExtensionNames_ = {},\n                                             const void *                                  pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , pApplicationInfo{ pApplicationInfo_ }\n      , enabledLayerCount{ enabledLayerCount_ }\n      , ppEnabledLayerNames{ ppEnabledLayerNames_ }\n      , enabledExtensionCount{ enabledExtensionCount_ }\n      , ppEnabledExtensionNames{ ppEnabledExtensionNames_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR InstanceCreateInfo( InstanceCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    InstanceCreateInfo( VkInstanceCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT : InstanceCreateInfo( *reinterpret_cast<InstanceCreateInfo const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    InstanceCreateInfo( VULKAN_HPP_NAMESPACE::InstanceCreateFlags                                 flags_,\n                        const VULKAN_HPP_NAMESPACE::ApplicationInfo *                             pApplicationInfo_,\n                        VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const char * const> const & pEnabledLayerNames_,\n                        VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const char * const> const & pEnabledExtensionNames_ = {},\n                        const void *                                                              pNext_                  = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , pApplicationInfo( pApplicationInfo_ )\n      , enabledLayerCount( static_cast<uint32_t>( pEnabledLayerNames_.size() ) )\n      , ppEnabledLayerNames( pEnabledLayerNames_.data() )\n      , enabledExtensionCount( static_cast<uint32_t>( pEnabledExtensionNames_.size() ) )\n      , ppEnabledExtensionNames( pEnabledExtensionNames_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    InstanceCreateInfo & operator=( InstanceCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    InstanceCreateInfo & operator=( VkInstanceCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::InstanceCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 InstanceCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 InstanceCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::InstanceCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 InstanceCreateInfo & setPApplicationInfo( const VULKAN_HPP_NAMESPACE::ApplicationInfo * pApplicationInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pApplicationInfo = pApplicationInfo_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 InstanceCreateInfo & setEnabledLayerCount( uint32_t enabledLayerCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      enabledLayerCount = enabledLayerCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 InstanceCreateInfo & setPpEnabledLayerNames( const char * const * ppEnabledLayerNames_ ) VULKAN_HPP_NOEXCEPT\n    {\n      ppEnabledLayerNames = ppEnabledLayerNames_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    InstanceCreateInfo &\n      setPEnabledLayerNames( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const char * const> const & pEnabledLayerNames_ ) VULKAN_HPP_NOEXCEPT\n    {\n      enabledLayerCount   = static_cast<uint32_t>( pEnabledLayerNames_.size() );\n      ppEnabledLayerNames = pEnabledLayerNames_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 InstanceCreateInfo & setEnabledExtensionCount( uint32_t enabledExtensionCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      enabledExtensionCount = enabledExtensionCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 InstanceCreateInfo & setPpEnabledExtensionNames( const char * const * ppEnabledExtensionNames_ ) VULKAN_HPP_NOEXCEPT\n    {\n      ppEnabledExtensionNames = ppEnabledExtensionNames_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    InstanceCreateInfo &\n      setPEnabledExtensionNames( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const char * const> const & pEnabledExtensionNames_ ) VULKAN_HPP_NOEXCEPT\n    {\n      enabledExtensionCount   = static_cast<uint32_t>( pEnabledExtensionNames_.size() );\n      ppEnabledExtensionNames = pEnabledExtensionNames_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkInstanceCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkInstanceCreateInfo *>( this );\n    }\n\n    operator VkInstanceCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkInstanceCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::InstanceCreateFlags const &,\n               const VULKAN_HPP_NAMESPACE::ApplicationInfo * const &,\n               uint32_t const &,\n               const char * const * const &,\n               uint32_t const &,\n               const char * const * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, pApplicationInfo, enabledLayerCount, ppEnabledLayerNames, enabledExtensionCount, ppEnabledExtensionNames );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( InstanceCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = flags <=> rhs.flags; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pApplicationInfo <=> rhs.pApplicationInfo; cmp != 0 )\n        return cmp;\n      if ( auto cmp = enabledLayerCount <=> rhs.enabledLayerCount; cmp != 0 )\n        return cmp;\n      for ( size_t i = 0; i < enabledLayerCount; ++i )\n      {\n        if ( ppEnabledLayerNames[i] != rhs.ppEnabledLayerNames[i] )\n          if ( auto cmp = strcmp( ppEnabledLayerNames[i], rhs.ppEnabledLayerNames[i] ); cmp != 0 )\n            return cmp < 0 ? std::strong_ordering::less : std::strong_ordering::greater;\n      }\n      if ( auto cmp = enabledExtensionCount <=> rhs.enabledExtensionCount; cmp != 0 )\n        return cmp;\n      for ( size_t i = 0; i < enabledExtensionCount; ++i )\n      {\n        if ( ppEnabledExtensionNames[i] != rhs.ppEnabledExtensionNames[i] )\n          if ( auto cmp = strcmp( ppEnabledExtensionNames[i], rhs.ppEnabledExtensionNames[i] ); cmp != 0 )\n            return cmp < 0 ? std::strong_ordering::less : std::strong_ordering::greater;\n      }\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( InstanceCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( pApplicationInfo == rhs.pApplicationInfo ) &&\n             ( enabledLayerCount == rhs.enabledLayerCount ) &&\n             std::equal( ppEnabledLayerNames,\n                         ppEnabledLayerNames + enabledLayerCount,\n                         rhs.ppEnabledLayerNames,\n                         []( char const * left, char const * right ) { return ( left == right ) || ( strcmp( left, right ) == 0 ); } ) &&\n             ( enabledExtensionCount == rhs.enabledExtensionCount ) &&\n             std::equal( ppEnabledExtensionNames,\n                         ppEnabledExtensionNames + enabledExtensionCount,\n                         rhs.ppEnabledExtensionNames,\n                         []( char const * left, char const * right ) { return ( left == right ) || ( strcmp( left, right ) == 0 ); } );\n    }\n\n    bool operator!=( InstanceCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType           sType                   = StructureType::eInstanceCreateInfo;\n    const void *                                  pNext                   = {};\n    VULKAN_HPP_NAMESPACE::InstanceCreateFlags     flags                   = {};\n    const VULKAN_HPP_NAMESPACE::ApplicationInfo * pApplicationInfo        = {};\n    uint32_t                                      enabledLayerCount       = {};\n    const char * const *                          ppEnabledLayerNames     = {};\n    uint32_t                                      enabledExtensionCount   = {};\n    const char * const *                          ppEnabledExtensionNames = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eInstanceCreateInfo>\n  {\n    using Type = InstanceCreateInfo;\n  };\n\n  struct LatencySleepInfoNV\n  {\n    using NativeType = VkLatencySleepInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eLatencySleepInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      LatencySleepInfoNV( VULKAN_HPP_NAMESPACE::Semaphore signalSemaphore_ = {}, uint64_t value_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , signalSemaphore{ signalSemaphore_ }\n      , value{ value_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR LatencySleepInfoNV( LatencySleepInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    LatencySleepInfoNV( VkLatencySleepInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT : LatencySleepInfoNV( *reinterpret_cast<LatencySleepInfoNV const *>( &rhs ) ) {}\n\n    LatencySleepInfoNV & operator=( LatencySleepInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    LatencySleepInfoNV & operator=( VkLatencySleepInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::LatencySleepInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 LatencySleepInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 LatencySleepInfoNV & setSignalSemaphore( VULKAN_HPP_NAMESPACE::Semaphore signalSemaphore_ ) VULKAN_HPP_NOEXCEPT\n    {\n      signalSemaphore = signalSemaphore_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 LatencySleepInfoNV & setValue( uint64_t value_ ) VULKAN_HPP_NOEXCEPT\n    {\n      value = value_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkLatencySleepInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkLatencySleepInfoNV *>( this );\n    }\n\n    operator VkLatencySleepInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkLatencySleepInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Semaphore const &, uint64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, signalSemaphore, value );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( LatencySleepInfoNV const & ) const = default;\n#else\n    bool operator==( LatencySleepInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( signalSemaphore == rhs.signalSemaphore ) && ( value == rhs.value );\n#  endif\n    }\n\n    bool operator!=( LatencySleepInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType           = StructureType::eLatencySleepInfoNV;\n    const void *                        pNext           = {};\n    VULKAN_HPP_NAMESPACE::Semaphore     signalSemaphore = {};\n    uint64_t                            value           = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eLatencySleepInfoNV>\n  {\n    using Type = LatencySleepInfoNV;\n  };\n\n  struct LatencySleepModeInfoNV\n  {\n    using NativeType = VkLatencySleepModeInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eLatencySleepModeInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR LatencySleepModeInfoNV( VULKAN_HPP_NAMESPACE::Bool32 lowLatencyMode_    = {},\n                                                 VULKAN_HPP_NAMESPACE::Bool32 lowLatencyBoost_   = {},\n                                                 uint32_t                     minimumIntervalUs_ = {},\n                                                 const void *                 pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , lowLatencyMode{ lowLatencyMode_ }\n      , lowLatencyBoost{ lowLatencyBoost_ }\n      , minimumIntervalUs{ minimumIntervalUs_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR LatencySleepModeInfoNV( LatencySleepModeInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    LatencySleepModeInfoNV( VkLatencySleepModeInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : LatencySleepModeInfoNV( *reinterpret_cast<LatencySleepModeInfoNV const *>( &rhs ) )\n    {\n    }\n\n    LatencySleepModeInfoNV & operator=( LatencySleepModeInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    LatencySleepModeInfoNV & operator=( VkLatencySleepModeInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::LatencySleepModeInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 LatencySleepModeInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 LatencySleepModeInfoNV & setLowLatencyMode( VULKAN_HPP_NAMESPACE::Bool32 lowLatencyMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      lowLatencyMode = lowLatencyMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 LatencySleepModeInfoNV & setLowLatencyBoost( VULKAN_HPP_NAMESPACE::Bool32 lowLatencyBoost_ ) VULKAN_HPP_NOEXCEPT\n    {\n      lowLatencyBoost = lowLatencyBoost_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 LatencySleepModeInfoNV & setMinimumIntervalUs( uint32_t minimumIntervalUs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minimumIntervalUs = minimumIntervalUs_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkLatencySleepModeInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkLatencySleepModeInfoNV *>( this );\n    }\n\n    operator VkLatencySleepModeInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkLatencySleepModeInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, lowLatencyMode, lowLatencyBoost, minimumIntervalUs );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( LatencySleepModeInfoNV const & ) const = default;\n#else\n    bool operator==( LatencySleepModeInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( lowLatencyMode == rhs.lowLatencyMode ) && ( lowLatencyBoost == rhs.lowLatencyBoost ) &&\n             ( minimumIntervalUs == rhs.minimumIntervalUs );\n#  endif\n    }\n\n    bool operator!=( LatencySleepModeInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType             = StructureType::eLatencySleepModeInfoNV;\n    const void *                        pNext             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        lowLatencyMode    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        lowLatencyBoost   = {};\n    uint32_t                            minimumIntervalUs = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eLatencySleepModeInfoNV>\n  {\n    using Type = LatencySleepModeInfoNV;\n  };\n\n  struct LatencySubmissionPresentIdNV\n  {\n    using NativeType = VkLatencySubmissionPresentIdNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eLatencySubmissionPresentIdNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR LatencySubmissionPresentIdNV( uint64_t presentID_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , presentID{ presentID_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR LatencySubmissionPresentIdNV( LatencySubmissionPresentIdNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    LatencySubmissionPresentIdNV( VkLatencySubmissionPresentIdNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : LatencySubmissionPresentIdNV( *reinterpret_cast<LatencySubmissionPresentIdNV const *>( &rhs ) )\n    {\n    }\n\n    LatencySubmissionPresentIdNV & operator=( LatencySubmissionPresentIdNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    LatencySubmissionPresentIdNV & operator=( VkLatencySubmissionPresentIdNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::LatencySubmissionPresentIdNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 LatencySubmissionPresentIdNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 LatencySubmissionPresentIdNV & setPresentID( uint64_t presentID_ ) VULKAN_HPP_NOEXCEPT\n    {\n      presentID = presentID_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkLatencySubmissionPresentIdNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkLatencySubmissionPresentIdNV *>( this );\n    }\n\n    operator VkLatencySubmissionPresentIdNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkLatencySubmissionPresentIdNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, presentID );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( LatencySubmissionPresentIdNV const & ) const = default;\n#else\n    bool operator==( LatencySubmissionPresentIdNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( presentID == rhs.presentID );\n#  endif\n    }\n\n    bool operator!=( LatencySubmissionPresentIdNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType     = StructureType::eLatencySubmissionPresentIdNV;\n    const void *                        pNext     = {};\n    uint64_t                            presentID = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eLatencySubmissionPresentIdNV>\n  {\n    using Type = LatencySubmissionPresentIdNV;\n  };\n\n  struct LatencySurfaceCapabilitiesNV\n  {\n    using NativeType = VkLatencySurfaceCapabilitiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eLatencySurfaceCapabilitiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR LatencySurfaceCapabilitiesNV( uint32_t                               presentModeCount_ = {},\n                                                       VULKAN_HPP_NAMESPACE::PresentModeKHR * pPresentModes_    = {},\n                                                       const void *                           pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , presentModeCount{ presentModeCount_ }\n      , pPresentModes{ pPresentModes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR LatencySurfaceCapabilitiesNV( LatencySurfaceCapabilitiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    LatencySurfaceCapabilitiesNV( VkLatencySurfaceCapabilitiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : LatencySurfaceCapabilitiesNV( *reinterpret_cast<LatencySurfaceCapabilitiesNV const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    LatencySurfaceCapabilitiesNV( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<VULKAN_HPP_NAMESPACE::PresentModeKHR> const & presentModes_,\n                                  const void *                                                                                pNext_ = nullptr )\n      : pNext( pNext_ ), presentModeCount( static_cast<uint32_t>( presentModes_.size() ) ), pPresentModes( presentModes_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    LatencySurfaceCapabilitiesNV & operator=( LatencySurfaceCapabilitiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    LatencySurfaceCapabilitiesNV & operator=( VkLatencySurfaceCapabilitiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::LatencySurfaceCapabilitiesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 LatencySurfaceCapabilitiesNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 LatencySurfaceCapabilitiesNV & setPresentModeCount( uint32_t presentModeCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      presentModeCount = presentModeCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 LatencySurfaceCapabilitiesNV & setPPresentModes( VULKAN_HPP_NAMESPACE::PresentModeKHR * pPresentModes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPresentModes = pPresentModes_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    LatencySurfaceCapabilitiesNV &\n      setPresentModes( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<VULKAN_HPP_NAMESPACE::PresentModeKHR> const & presentModes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      presentModeCount = static_cast<uint32_t>( presentModes_.size() );\n      pPresentModes    = presentModes_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkLatencySurfaceCapabilitiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkLatencySurfaceCapabilitiesNV *>( this );\n    }\n\n    operator VkLatencySurfaceCapabilitiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkLatencySurfaceCapabilitiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, VULKAN_HPP_NAMESPACE::PresentModeKHR * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, presentModeCount, pPresentModes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( LatencySurfaceCapabilitiesNV const & ) const = default;\n#else\n    bool operator==( LatencySurfaceCapabilitiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( presentModeCount == rhs.presentModeCount ) && ( pPresentModes == rhs.pPresentModes );\n#  endif\n    }\n\n    bool operator!=( LatencySurfaceCapabilitiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType            = StructureType::eLatencySurfaceCapabilitiesNV;\n    const void *                           pNext            = {};\n    uint32_t                               presentModeCount = {};\n    VULKAN_HPP_NAMESPACE::PresentModeKHR * pPresentModes    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eLatencySurfaceCapabilitiesNV>\n  {\n    using Type = LatencySurfaceCapabilitiesNV;\n  };\n\n  struct LayerProperties\n  {\n    using NativeType = VkLayerProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 LayerProperties( std::array<char, VK_MAX_EXTENSION_NAME_SIZE> const & layerName_             = {},\n                                             uint32_t                                             specVersion_           = {},\n                                             uint32_t                                             implementationVersion_ = {},\n                                             std::array<char, VK_MAX_DESCRIPTION_SIZE> const &    description_           = {} ) VULKAN_HPP_NOEXCEPT\n      : layerName{ layerName_ }\n      , specVersion{ specVersion_ }\n      , implementationVersion{ implementationVersion_ }\n      , description{ description_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 LayerProperties( LayerProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    LayerProperties( VkLayerProperties const & rhs ) VULKAN_HPP_NOEXCEPT : LayerProperties( *reinterpret_cast<LayerProperties const *>( &rhs ) ) {}\n\n    LayerProperties & operator=( LayerProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    LayerProperties & operator=( VkLayerProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::LayerProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkLayerProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkLayerProperties *>( this );\n    }\n\n    operator VkLayerProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkLayerProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_EXTENSION_NAME_SIZE> const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( layerName, specVersion, implementationVersion, description );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( LayerProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = strcmp( layerName, rhs.layerName ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = specVersion <=> rhs.specVersion; cmp != 0 )\n        return cmp;\n      if ( auto cmp = implementationVersion <=> rhs.implementationVersion; cmp != 0 )\n        return cmp;\n      if ( auto cmp = strcmp( description, rhs.description ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( LayerProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( strcmp( layerName, rhs.layerName ) == 0 ) && ( specVersion == rhs.specVersion ) && ( implementationVersion == rhs.implementationVersion ) &&\n             ( strcmp( description, rhs.description ) == 0 );\n    }\n\n    bool operator!=( LayerProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_EXTENSION_NAME_SIZE> layerName             = {};\n    uint32_t                                                               specVersion           = {};\n    uint32_t                                                               implementationVersion = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE>    description           = {};\n  };\n\n  struct LayerSettingEXT\n  {\n    using NativeType = VkLayerSettingEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR LayerSettingEXT( const char *                              pLayerName_   = {},\n                                          const char *                              pSettingName_ = {},\n                                          VULKAN_HPP_NAMESPACE::LayerSettingTypeEXT type_         = VULKAN_HPP_NAMESPACE::LayerSettingTypeEXT::eBool32,\n                                          uint32_t                                  valueCount_   = {},\n                                          const void *                              pValues_      = {} ) VULKAN_HPP_NOEXCEPT\n      : pLayerName{ pLayerName_ }\n      , pSettingName{ pSettingName_ }\n      , type{ type_ }\n      , valueCount{ valueCount_ }\n      , pValues{ pValues_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR LayerSettingEXT( LayerSettingEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    LayerSettingEXT( VkLayerSettingEXT const & rhs ) VULKAN_HPP_NOEXCEPT : LayerSettingEXT( *reinterpret_cast<LayerSettingEXT const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    // NOTE: you need to provide the type because vk::Bool32 and uint32_t are indistinguishable!\n    LayerSettingEXT( char const *                                       pLayerName_,\n                     char const *                                       pSettingName_,\n                     VULKAN_HPP_NAMESPACE::LayerSettingTypeEXT          type_,\n                     vk::ArrayProxyNoTemporaries<const int32_t> const & values_ )\n      : pLayerName( pLayerName_ )\n      , pSettingName( pSettingName_ )\n      , type( type_ )\n      , valueCount( static_cast<uint32_t>( values_.size() ) )\n      , pValues( values_.data() )\n    {\n      VULKAN_HPP_ASSERT( VULKAN_HPP_NAMESPACE::isSameType<int32_t>( type ) );\n    }\n\n    LayerSettingEXT( char const *                                       pLayerName_,\n                     char const *                                       pSettingName_,\n                     VULKAN_HPP_NAMESPACE::LayerSettingTypeEXT          type_,\n                     vk::ArrayProxyNoTemporaries<const int64_t> const & values_ )\n      : pLayerName( pLayerName_ )\n      , pSettingName( pSettingName_ )\n      , type( type_ )\n      , valueCount( static_cast<uint32_t>( values_.size() ) )\n      , pValues( values_.data() )\n    {\n      VULKAN_HPP_ASSERT( VULKAN_HPP_NAMESPACE::isSameType<int64_t>( type ) );\n    }\n\n    LayerSettingEXT( char const *                                        pLayerName_,\n                     char const *                                        pSettingName_,\n                     VULKAN_HPP_NAMESPACE::LayerSettingTypeEXT           type_,\n                     vk::ArrayProxyNoTemporaries<const uint32_t> const & values_ )\n      : pLayerName( pLayerName_ )\n      , pSettingName( pSettingName_ )\n      , type( type_ )\n      , valueCount( static_cast<uint32_t>( values_.size() ) )\n      , pValues( values_.data() )\n    {\n      VULKAN_HPP_ASSERT( VULKAN_HPP_NAMESPACE::isSameType<uint32_t>( type ) );\n    }\n\n    LayerSettingEXT( char const *                                        pLayerName_,\n                     char const *                                        pSettingName_,\n                     VULKAN_HPP_NAMESPACE::LayerSettingTypeEXT           type_,\n                     vk::ArrayProxyNoTemporaries<const uint64_t> const & values_ )\n      : pLayerName( pLayerName_ )\n      , pSettingName( pSettingName_ )\n      , type( type_ )\n      , valueCount( static_cast<uint32_t>( values_.size() ) )\n      , pValues( values_.data() )\n    {\n      VULKAN_HPP_ASSERT( VULKAN_HPP_NAMESPACE::isSameType<uint64_t>( type ) );\n    }\n\n    LayerSettingEXT( char const *                                     pLayerName_,\n                     char const *                                     pSettingName_,\n                     VULKAN_HPP_NAMESPACE::LayerSettingTypeEXT        type_,\n                     vk::ArrayProxyNoTemporaries<const float> const & values_ )\n      : pLayerName( pLayerName_ )\n      , pSettingName( pSettingName_ )\n      , type( type_ )\n      , valueCount( static_cast<uint32_t>( values_.size() ) )\n      , pValues( values_.data() )\n    {\n      VULKAN_HPP_ASSERT( VULKAN_HPP_NAMESPACE::isSameType<float>( type ) );\n    }\n\n    LayerSettingEXT( char const *                                      pLayerName_,\n                     char const *                                      pSettingName_,\n                     VULKAN_HPP_NAMESPACE::LayerSettingTypeEXT         type_,\n                     vk::ArrayProxyNoTemporaries<const double> const & values_ )\n      : pLayerName( pLayerName_ )\n      , pSettingName( pSettingName_ )\n      , type( type_ )\n      , valueCount( static_cast<uint32_t>( values_.size() ) )\n      , pValues( values_.data() )\n    {\n      VULKAN_HPP_ASSERT( VULKAN_HPP_NAMESPACE::isSameType<double>( type ) );\n    }\n\n    LayerSettingEXT( char const *                                      pLayerName_,\n                     char const *                                      pSettingName_,\n                     VULKAN_HPP_NAMESPACE::LayerSettingTypeEXT         type_,\n                     vk::ArrayProxyNoTemporaries<const char *> const & values_ )\n      : pLayerName( pLayerName_ )\n      , pSettingName( pSettingName_ )\n      , type( type_ )\n      , valueCount( static_cast<uint32_t>( values_.size() ) )\n      , pValues( values_.data() )\n    {\n      VULKAN_HPP_ASSERT( VULKAN_HPP_NAMESPACE::isSameType<char *>( type ) );\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    LayerSettingEXT & operator=( LayerSettingEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    LayerSettingEXT & operator=( VkLayerSettingEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::LayerSettingEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 LayerSettingEXT & setPLayerName( const char * pLayerName_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pLayerName = pLayerName_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 LayerSettingEXT & setPSettingName( const char * pSettingName_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSettingName = pSettingName_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 LayerSettingEXT & setType( VULKAN_HPP_NAMESPACE::LayerSettingTypeEXT type_ ) VULKAN_HPP_NOEXCEPT\n    {\n      type = type_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 LayerSettingEXT & setValueCount( uint32_t valueCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      valueCount = valueCount_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    LayerSettingEXT & setValues( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const int32_t> const & values_ ) VULKAN_HPP_NOEXCEPT\n    {\n      valueCount = static_cast<uint32_t>( values_.size() );\n      pValues    = values_.data();\n      return *this;\n    }\n\n    LayerSettingEXT & setValues( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const int64_t> const & values_ ) VULKAN_HPP_NOEXCEPT\n    {\n      valueCount = static_cast<uint32_t>( values_.size() );\n      pValues    = values_.data();\n      return *this;\n    }\n\n    LayerSettingEXT & setValues( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & values_ ) VULKAN_HPP_NOEXCEPT\n    {\n      valueCount = static_cast<uint32_t>( values_.size() );\n      pValues    = values_.data();\n      return *this;\n    }\n\n    LayerSettingEXT & setValues( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & values_ ) VULKAN_HPP_NOEXCEPT\n    {\n      valueCount = static_cast<uint32_t>( values_.size() );\n      pValues    = values_.data();\n      return *this;\n    }\n\n    LayerSettingEXT & setValues( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const float> const & values_ ) VULKAN_HPP_NOEXCEPT\n    {\n      valueCount = static_cast<uint32_t>( values_.size() );\n      pValues    = values_.data();\n      return *this;\n    }\n\n    LayerSettingEXT & setValues( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const double> const & values_ ) VULKAN_HPP_NOEXCEPT\n    {\n      valueCount = static_cast<uint32_t>( values_.size() );\n      pValues    = values_.data();\n      return *this;\n    }\n\n    LayerSettingEXT & setValues( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const char *> const & values_ ) VULKAN_HPP_NOEXCEPT\n    {\n      valueCount = static_cast<uint32_t>( values_.size() );\n      pValues    = values_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkLayerSettingEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkLayerSettingEXT *>( this );\n    }\n\n    operator VkLayerSettingEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkLayerSettingEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<const char * const &, const char * const &, VULKAN_HPP_NAMESPACE::LayerSettingTypeEXT const &, uint32_t const &, const void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( pLayerName, pSettingName, type, valueCount, pValues );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( LayerSettingEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( pLayerName != rhs.pLayerName )\n        if ( auto cmp = strcmp( pLayerName, rhs.pLayerName ); cmp != 0 )\n          return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( pSettingName != rhs.pSettingName )\n        if ( auto cmp = strcmp( pSettingName, rhs.pSettingName ); cmp != 0 )\n          return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = type <=> rhs.type; cmp != 0 )\n        return cmp;\n      if ( auto cmp = valueCount <=> rhs.valueCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pValues <=> rhs.pValues; cmp != 0 )\n        return cmp;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( LayerSettingEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( ( pLayerName == rhs.pLayerName ) || ( strcmp( pLayerName, rhs.pLayerName ) == 0 ) ) &&\n             ( ( pSettingName == rhs.pSettingName ) || ( strcmp( pSettingName, rhs.pSettingName ) == 0 ) ) && ( type == rhs.type ) &&\n             ( valueCount == rhs.valueCount ) && ( pValues == rhs.pValues );\n    }\n\n    bool operator!=( LayerSettingEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    const char *                              pLayerName   = {};\n    const char *                              pSettingName = {};\n    VULKAN_HPP_NAMESPACE::LayerSettingTypeEXT type         = VULKAN_HPP_NAMESPACE::LayerSettingTypeEXT::eBool32;\n    uint32_t                                  valueCount   = {};\n    const void *                              pValues      = {};\n  };\n\n  struct LayerSettingsCreateInfoEXT\n  {\n    using NativeType = VkLayerSettingsCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = true;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eLayerSettingsCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR LayerSettingsCreateInfoEXT( uint32_t                                      settingCount_ = {},\n                                                     const VULKAN_HPP_NAMESPACE::LayerSettingEXT * pSettings_    = {},\n                                                     const void *                                  pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , settingCount{ settingCount_ }\n      , pSettings{ pSettings_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR LayerSettingsCreateInfoEXT( LayerSettingsCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    LayerSettingsCreateInfoEXT( VkLayerSettingsCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : LayerSettingsCreateInfoEXT( *reinterpret_cast<LayerSettingsCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    LayerSettingsCreateInfoEXT( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::LayerSettingEXT> const & settings_,\n                                const void *                                                                                       pNext_ = nullptr )\n      : pNext( pNext_ ), settingCount( static_cast<uint32_t>( settings_.size() ) ), pSettings( settings_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    LayerSettingsCreateInfoEXT & operator=( LayerSettingsCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    LayerSettingsCreateInfoEXT & operator=( VkLayerSettingsCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::LayerSettingsCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 LayerSettingsCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 LayerSettingsCreateInfoEXT & setSettingCount( uint32_t settingCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      settingCount = settingCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 LayerSettingsCreateInfoEXT & setPSettings( const VULKAN_HPP_NAMESPACE::LayerSettingEXT * pSettings_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSettings = pSettings_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    LayerSettingsCreateInfoEXT &\n      setSettings( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::LayerSettingEXT> const & settings_ ) VULKAN_HPP_NOEXCEPT\n    {\n      settingCount = static_cast<uint32_t>( settings_.size() );\n      pSettings    = settings_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkLayerSettingsCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkLayerSettingsCreateInfoEXT *>( this );\n    }\n\n    operator VkLayerSettingsCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkLayerSettingsCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::LayerSettingEXT * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, settingCount, pSettings );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( LayerSettingsCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( LayerSettingsCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( settingCount == rhs.settingCount ) && ( pSettings == rhs.pSettings );\n#  endif\n    }\n\n    bool operator!=( LayerSettingsCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType           sType        = StructureType::eLayerSettingsCreateInfoEXT;\n    const void *                                  pNext        = {};\n    uint32_t                                      settingCount = {};\n    const VULKAN_HPP_NAMESPACE::LayerSettingEXT * pSettings    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eLayerSettingsCreateInfoEXT>\n  {\n    using Type = LayerSettingsCreateInfoEXT;\n  };\n\n#if defined( VK_USE_PLATFORM_MACOS_MVK )\n  struct MacOSSurfaceCreateInfoMVK\n  {\n    using NativeType = VkMacOSSurfaceCreateInfoMVK;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMacosSurfaceCreateInfoMVK;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MacOSSurfaceCreateInfoMVK( VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateFlagsMVK flags_ = {},\n                                                    const void *                                     pView_ = {},\n                                                    const void *                                     pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , pView{ pView_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MacOSSurfaceCreateInfoMVK( MacOSSurfaceCreateInfoMVK const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MacOSSurfaceCreateInfoMVK( VkMacOSSurfaceCreateInfoMVK const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MacOSSurfaceCreateInfoMVK( *reinterpret_cast<MacOSSurfaceCreateInfoMVK const *>( &rhs ) )\n    {\n    }\n\n    MacOSSurfaceCreateInfoMVK & operator=( MacOSSurfaceCreateInfoMVK const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MacOSSurfaceCreateInfoMVK & operator=( VkMacOSSurfaceCreateInfoMVK const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateInfoMVK const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MacOSSurfaceCreateInfoMVK & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MacOSSurfaceCreateInfoMVK & setFlags( VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateFlagsMVK flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MacOSSurfaceCreateInfoMVK & setPView( const void * pView_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pView = pView_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMacOSSurfaceCreateInfoMVK const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMacOSSurfaceCreateInfoMVK *>( this );\n    }\n\n    operator VkMacOSSurfaceCreateInfoMVK &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMacOSSurfaceCreateInfoMVK *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::\n      tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateFlagsMVK const &, const void * const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, pView );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MacOSSurfaceCreateInfoMVK const & ) const = default;\n#  else\n    bool operator==( MacOSSurfaceCreateInfoMVK const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( pView == rhs.pView );\n#    endif\n    }\n\n    bool operator!=( MacOSSurfaceCreateInfoMVK const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType              sType = StructureType::eMacosSurfaceCreateInfoMVK;\n    const void *                                     pNext = {};\n    VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateFlagsMVK flags = {};\n    const void *                                     pView = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMacosSurfaceCreateInfoMVK>\n  {\n    using Type = MacOSSurfaceCreateInfoMVK;\n  };\n#endif /*VK_USE_PLATFORM_MACOS_MVK*/\n\n  struct MappedMemoryRange\n  {\n    using NativeType = VkMappedMemoryRange;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMappedMemoryRange;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MappedMemoryRange( VULKAN_HPP_NAMESPACE::DeviceMemory memory_ = {},\n                                            VULKAN_HPP_NAMESPACE::DeviceSize   offset_ = {},\n                                            VULKAN_HPP_NAMESPACE::DeviceSize   size_   = {},\n                                            const void *                       pNext_  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , memory{ memory_ }\n      , offset{ offset_ }\n      , size{ size_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MappedMemoryRange( MappedMemoryRange const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MappedMemoryRange( VkMappedMemoryRange const & rhs ) VULKAN_HPP_NOEXCEPT : MappedMemoryRange( *reinterpret_cast<MappedMemoryRange const *>( &rhs ) ) {}\n\n    MappedMemoryRange & operator=( MappedMemoryRange const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MappedMemoryRange & operator=( VkMappedMemoryRange const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MappedMemoryRange const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MappedMemoryRange & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MappedMemoryRange & setMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memory = memory_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MappedMemoryRange & setOffset( VULKAN_HPP_NAMESPACE::DeviceSize offset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      offset = offset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MappedMemoryRange & setSize( VULKAN_HPP_NAMESPACE::DeviceSize size_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size = size_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMappedMemoryRange const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMappedMemoryRange *>( this );\n    }\n\n    operator VkMappedMemoryRange &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMappedMemoryRange *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceMemory const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, memory, offset, size );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MappedMemoryRange const & ) const = default;\n#else\n    bool operator==( MappedMemoryRange const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memory == rhs.memory ) && ( offset == rhs.offset ) && ( size == rhs.size );\n#  endif\n    }\n\n    bool operator!=( MappedMemoryRange const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType  = StructureType::eMappedMemoryRange;\n    const void *                        pNext  = {};\n    VULKAN_HPP_NAMESPACE::DeviceMemory  memory = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    offset = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    size   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMappedMemoryRange>\n  {\n    using Type = MappedMemoryRange;\n  };\n\n  struct MemoryAllocateFlagsInfo\n  {\n    using NativeType = VkMemoryAllocateFlagsInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryAllocateFlagsInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryAllocateFlagsInfo( VULKAN_HPP_NAMESPACE::MemoryAllocateFlags flags_      = {},\n                                                  uint32_t                                  deviceMask_ = {},\n                                                  const void *                              pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , deviceMask{ deviceMask_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryAllocateFlagsInfo( MemoryAllocateFlagsInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryAllocateFlagsInfo( VkMemoryAllocateFlagsInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MemoryAllocateFlagsInfo( *reinterpret_cast<MemoryAllocateFlagsInfo const *>( &rhs ) )\n    {\n    }\n\n    MemoryAllocateFlagsInfo & operator=( MemoryAllocateFlagsInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryAllocateFlagsInfo & operator=( VkMemoryAllocateFlagsInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryAllocateFlagsInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MemoryAllocateFlagsInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryAllocateFlagsInfo & setFlags( VULKAN_HPP_NAMESPACE::MemoryAllocateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryAllocateFlagsInfo & setDeviceMask( uint32_t deviceMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceMask = deviceMask_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMemoryAllocateFlagsInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryAllocateFlagsInfo *>( this );\n    }\n\n    operator VkMemoryAllocateFlagsInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryAllocateFlagsInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::MemoryAllocateFlags const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, deviceMask );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryAllocateFlagsInfo const & ) const = default;\n#else\n    bool operator==( MemoryAllocateFlagsInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( deviceMask == rhs.deviceMask );\n#  endif\n    }\n\n    bool operator!=( MemoryAllocateFlagsInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType      = StructureType::eMemoryAllocateFlagsInfo;\n    const void *                              pNext      = {};\n    VULKAN_HPP_NAMESPACE::MemoryAllocateFlags flags      = {};\n    uint32_t                                  deviceMask = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryAllocateFlagsInfo>\n  {\n    using Type = MemoryAllocateFlagsInfo;\n  };\n\n  using MemoryAllocateFlagsInfoKHR = MemoryAllocateFlagsInfo;\n\n  struct MemoryAllocateInfo\n  {\n    using NativeType = VkMemoryAllocateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryAllocateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryAllocateInfo( VULKAN_HPP_NAMESPACE::DeviceSize allocationSize_  = {},\n                                             uint32_t                         memoryTypeIndex_ = {},\n                                             const void *                     pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , allocationSize{ allocationSize_ }\n      , memoryTypeIndex{ memoryTypeIndex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryAllocateInfo( MemoryAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryAllocateInfo( VkMemoryAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT : MemoryAllocateInfo( *reinterpret_cast<MemoryAllocateInfo const *>( &rhs ) ) {}\n\n    MemoryAllocateInfo & operator=( MemoryAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryAllocateInfo & operator=( VkMemoryAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryAllocateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MemoryAllocateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryAllocateInfo & setAllocationSize( VULKAN_HPP_NAMESPACE::DeviceSize allocationSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      allocationSize = allocationSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryAllocateInfo & setMemoryTypeIndex( uint32_t memoryTypeIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memoryTypeIndex = memoryTypeIndex_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMemoryAllocateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryAllocateInfo *>( this );\n    }\n\n    operator VkMemoryAllocateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryAllocateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::DeviceSize const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, allocationSize, memoryTypeIndex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryAllocateInfo const & ) const = default;\n#else\n    bool operator==( MemoryAllocateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( allocationSize == rhs.allocationSize ) && ( memoryTypeIndex == rhs.memoryTypeIndex );\n#  endif\n    }\n\n    bool operator!=( MemoryAllocateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType           = StructureType::eMemoryAllocateInfo;\n    const void *                        pNext           = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    allocationSize  = {};\n    uint32_t                            memoryTypeIndex = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryAllocateInfo>\n  {\n    using Type = MemoryAllocateInfo;\n  };\n\n  struct MemoryBarrier\n  {\n    using NativeType = VkMemoryBarrier;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryBarrier;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryBarrier( VULKAN_HPP_NAMESPACE::AccessFlags srcAccessMask_ = {},\n                                        VULKAN_HPP_NAMESPACE::AccessFlags dstAccessMask_ = {},\n                                        const void *                      pNext_         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , srcAccessMask{ srcAccessMask_ }\n      , dstAccessMask{ dstAccessMask_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryBarrier( MemoryBarrier const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryBarrier( VkMemoryBarrier const & rhs ) VULKAN_HPP_NOEXCEPT : MemoryBarrier( *reinterpret_cast<MemoryBarrier const *>( &rhs ) ) {}\n\n    MemoryBarrier & operator=( MemoryBarrier const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryBarrier & operator=( VkMemoryBarrier const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryBarrier const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MemoryBarrier & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryBarrier & setSrcAccessMask( VULKAN_HPP_NAMESPACE::AccessFlags srcAccessMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcAccessMask = srcAccessMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryBarrier & setDstAccessMask( VULKAN_HPP_NAMESPACE::AccessFlags dstAccessMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstAccessMask = dstAccessMask_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMemoryBarrier const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryBarrier *>( this );\n    }\n\n    operator VkMemoryBarrier &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryBarrier *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::AccessFlags const &,\n               VULKAN_HPP_NAMESPACE::AccessFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, srcAccessMask, dstAccessMask );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryBarrier const & ) const = default;\n#else\n    bool operator==( MemoryBarrier const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( srcAccessMask == rhs.srcAccessMask ) && ( dstAccessMask == rhs.dstAccessMask );\n#  endif\n    }\n\n    bool operator!=( MemoryBarrier const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType         = StructureType::eMemoryBarrier;\n    const void *                        pNext         = {};\n    VULKAN_HPP_NAMESPACE::AccessFlags   srcAccessMask = {};\n    VULKAN_HPP_NAMESPACE::AccessFlags   dstAccessMask = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryBarrier>\n  {\n    using Type = MemoryBarrier;\n  };\n\n  struct MemoryBarrierAccessFlags3KHR\n  {\n    using NativeType = VkMemoryBarrierAccessFlags3KHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryBarrierAccessFlags3KHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryBarrierAccessFlags3KHR( VULKAN_HPP_NAMESPACE::AccessFlags3KHR srcAccessMask3_ = {},\n                                                       VULKAN_HPP_NAMESPACE::AccessFlags3KHR dstAccessMask3_ = {},\n                                                       const void *                          pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , srcAccessMask3{ srcAccessMask3_ }\n      , dstAccessMask3{ dstAccessMask3_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryBarrierAccessFlags3KHR( MemoryBarrierAccessFlags3KHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryBarrierAccessFlags3KHR( VkMemoryBarrierAccessFlags3KHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MemoryBarrierAccessFlags3KHR( *reinterpret_cast<MemoryBarrierAccessFlags3KHR const *>( &rhs ) )\n    {\n    }\n\n    MemoryBarrierAccessFlags3KHR & operator=( MemoryBarrierAccessFlags3KHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryBarrierAccessFlags3KHR & operator=( VkMemoryBarrierAccessFlags3KHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryBarrierAccessFlags3KHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MemoryBarrierAccessFlags3KHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryBarrierAccessFlags3KHR & setSrcAccessMask3( VULKAN_HPP_NAMESPACE::AccessFlags3KHR srcAccessMask3_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcAccessMask3 = srcAccessMask3_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryBarrierAccessFlags3KHR & setDstAccessMask3( VULKAN_HPP_NAMESPACE::AccessFlags3KHR dstAccessMask3_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstAccessMask3 = dstAccessMask3_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMemoryBarrierAccessFlags3KHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryBarrierAccessFlags3KHR *>( this );\n    }\n\n    operator VkMemoryBarrierAccessFlags3KHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryBarrierAccessFlags3KHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::AccessFlags3KHR const &,\n               VULKAN_HPP_NAMESPACE::AccessFlags3KHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, srcAccessMask3, dstAccessMask3 );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryBarrierAccessFlags3KHR const & ) const = default;\n#else\n    bool operator==( MemoryBarrierAccessFlags3KHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( srcAccessMask3 == rhs.srcAccessMask3 ) && ( dstAccessMask3 == rhs.dstAccessMask3 );\n#  endif\n    }\n\n    bool operator!=( MemoryBarrierAccessFlags3KHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType   sType          = StructureType::eMemoryBarrierAccessFlags3KHR;\n    const void *                          pNext          = {};\n    VULKAN_HPP_NAMESPACE::AccessFlags3KHR srcAccessMask3 = {};\n    VULKAN_HPP_NAMESPACE::AccessFlags3KHR dstAccessMask3 = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryBarrierAccessFlags3KHR>\n  {\n    using Type = MemoryBarrierAccessFlags3KHR;\n  };\n\n  struct MemoryDedicatedAllocateInfo\n  {\n    using NativeType = VkMemoryDedicatedAllocateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryDedicatedAllocateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryDedicatedAllocateInfo( VULKAN_HPP_NAMESPACE::Image  image_  = {},\n                                                      VULKAN_HPP_NAMESPACE::Buffer buffer_ = {},\n                                                      const void *                 pNext_  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , image{ image_ }\n      , buffer{ buffer_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryDedicatedAllocateInfo( MemoryDedicatedAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryDedicatedAllocateInfo( VkMemoryDedicatedAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MemoryDedicatedAllocateInfo( *reinterpret_cast<MemoryDedicatedAllocateInfo const *>( &rhs ) )\n    {\n    }\n\n    MemoryDedicatedAllocateInfo & operator=( MemoryDedicatedAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryDedicatedAllocateInfo & operator=( VkMemoryDedicatedAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryDedicatedAllocateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MemoryDedicatedAllocateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryDedicatedAllocateInfo & setImage( VULKAN_HPP_NAMESPACE::Image image_ ) VULKAN_HPP_NOEXCEPT\n    {\n      image = image_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryDedicatedAllocateInfo & setBuffer( VULKAN_HPP_NAMESPACE::Buffer buffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      buffer = buffer_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMemoryDedicatedAllocateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryDedicatedAllocateInfo *>( this );\n    }\n\n    operator VkMemoryDedicatedAllocateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryDedicatedAllocateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Image const &, VULKAN_HPP_NAMESPACE::Buffer const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, image, buffer );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryDedicatedAllocateInfo const & ) const = default;\n#else\n    bool operator==( MemoryDedicatedAllocateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( image == rhs.image ) && ( buffer == rhs.buffer );\n#  endif\n    }\n\n    bool operator!=( MemoryDedicatedAllocateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType  = StructureType::eMemoryDedicatedAllocateInfo;\n    const void *                        pNext  = {};\n    VULKAN_HPP_NAMESPACE::Image         image  = {};\n    VULKAN_HPP_NAMESPACE::Buffer        buffer = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryDedicatedAllocateInfo>\n  {\n    using Type = MemoryDedicatedAllocateInfo;\n  };\n\n  using MemoryDedicatedAllocateInfoKHR = MemoryDedicatedAllocateInfo;\n\n  struct MemoryDedicatedRequirements\n  {\n    using NativeType = VkMemoryDedicatedRequirements;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryDedicatedRequirements;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryDedicatedRequirements( VULKAN_HPP_NAMESPACE::Bool32 prefersDedicatedAllocation_  = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 requiresDedicatedAllocation_ = {},\n                                                      void *                       pNext_                       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , prefersDedicatedAllocation{ prefersDedicatedAllocation_ }\n      , requiresDedicatedAllocation{ requiresDedicatedAllocation_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryDedicatedRequirements( MemoryDedicatedRequirements const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryDedicatedRequirements( VkMemoryDedicatedRequirements const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MemoryDedicatedRequirements( *reinterpret_cast<MemoryDedicatedRequirements const *>( &rhs ) )\n    {\n    }\n\n    MemoryDedicatedRequirements & operator=( MemoryDedicatedRequirements const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryDedicatedRequirements & operator=( VkMemoryDedicatedRequirements const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryDedicatedRequirements const *>( &rhs );\n      return *this;\n    }\n\n    operator VkMemoryDedicatedRequirements const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryDedicatedRequirements *>( this );\n    }\n\n    operator VkMemoryDedicatedRequirements &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryDedicatedRequirements *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, prefersDedicatedAllocation, requiresDedicatedAllocation );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryDedicatedRequirements const & ) const = default;\n#else\n    bool operator==( MemoryDedicatedRequirements const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( prefersDedicatedAllocation == rhs.prefersDedicatedAllocation ) &&\n             ( requiresDedicatedAllocation == rhs.requiresDedicatedAllocation );\n#  endif\n    }\n\n    bool operator!=( MemoryDedicatedRequirements const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                       = StructureType::eMemoryDedicatedRequirements;\n    void *                              pNext                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        prefersDedicatedAllocation  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        requiresDedicatedAllocation = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryDedicatedRequirements>\n  {\n    using Type = MemoryDedicatedRequirements;\n  };\n\n  using MemoryDedicatedRequirementsKHR = MemoryDedicatedRequirements;\n\n  struct MemoryFdPropertiesKHR\n  {\n    using NativeType = VkMemoryFdPropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryFdPropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryFdPropertiesKHR( uint32_t memoryTypeBits_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , memoryTypeBits{ memoryTypeBits_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryFdPropertiesKHR( MemoryFdPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryFdPropertiesKHR( VkMemoryFdPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MemoryFdPropertiesKHR( *reinterpret_cast<MemoryFdPropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    MemoryFdPropertiesKHR & operator=( MemoryFdPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryFdPropertiesKHR & operator=( VkMemoryFdPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryFdPropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkMemoryFdPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryFdPropertiesKHR *>( this );\n    }\n\n    operator VkMemoryFdPropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryFdPropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, memoryTypeBits );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryFdPropertiesKHR const & ) const = default;\n#else\n    bool operator==( MemoryFdPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memoryTypeBits == rhs.memoryTypeBits );\n#  endif\n    }\n\n    bool operator!=( MemoryFdPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::eMemoryFdPropertiesKHR;\n    void *                              pNext          = {};\n    uint32_t                            memoryTypeBits = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryFdPropertiesKHR>\n  {\n    using Type = MemoryFdPropertiesKHR;\n  };\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  struct MemoryGetAndroidHardwareBufferInfoANDROID\n  {\n    using NativeType = VkMemoryGetAndroidHardwareBufferInfoANDROID;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryGetAndroidHardwareBufferInfoANDROID;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryGetAndroidHardwareBufferInfoANDROID( VULKAN_HPP_NAMESPACE::DeviceMemory memory_ = {},\n                                                                    const void *                       pNext_  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , memory{ memory_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryGetAndroidHardwareBufferInfoANDROID( MemoryGetAndroidHardwareBufferInfoANDROID const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryGetAndroidHardwareBufferInfoANDROID( VkMemoryGetAndroidHardwareBufferInfoANDROID const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MemoryGetAndroidHardwareBufferInfoANDROID( *reinterpret_cast<MemoryGetAndroidHardwareBufferInfoANDROID const *>( &rhs ) )\n    {\n    }\n\n    MemoryGetAndroidHardwareBufferInfoANDROID & operator=( MemoryGetAndroidHardwareBufferInfoANDROID const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryGetAndroidHardwareBufferInfoANDROID & operator=( VkMemoryGetAndroidHardwareBufferInfoANDROID const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryGetAndroidHardwareBufferInfoANDROID const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MemoryGetAndroidHardwareBufferInfoANDROID & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryGetAndroidHardwareBufferInfoANDROID & setMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memory = memory_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMemoryGetAndroidHardwareBufferInfoANDROID const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryGetAndroidHardwareBufferInfoANDROID *>( this );\n    }\n\n    operator VkMemoryGetAndroidHardwareBufferInfoANDROID &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryGetAndroidHardwareBufferInfoANDROID *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::DeviceMemory const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, memory );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryGetAndroidHardwareBufferInfoANDROID const & ) const = default;\n#  else\n    bool operator==( MemoryGetAndroidHardwareBufferInfoANDROID const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memory == rhs.memory );\n#    endif\n    }\n\n    bool operator!=( MemoryGetAndroidHardwareBufferInfoANDROID const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType  = StructureType::eMemoryGetAndroidHardwareBufferInfoANDROID;\n    const void *                        pNext  = {};\n    VULKAN_HPP_NAMESPACE::DeviceMemory  memory = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryGetAndroidHardwareBufferInfoANDROID>\n  {\n    using Type = MemoryGetAndroidHardwareBufferInfoANDROID;\n  };\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n  struct MemoryGetFdInfoKHR\n  {\n    using NativeType = VkMemoryGetFdInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryGetFdInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryGetFdInfoKHR(\n      VULKAN_HPP_NAMESPACE::DeviceMemory                     memory_     = {},\n      VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_ = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd,\n      const void *                                           pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , memory{ memory_ }\n      , handleType{ handleType_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryGetFdInfoKHR( MemoryGetFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryGetFdInfoKHR( VkMemoryGetFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT : MemoryGetFdInfoKHR( *reinterpret_cast<MemoryGetFdInfoKHR const *>( &rhs ) ) {}\n\n    MemoryGetFdInfoKHR & operator=( MemoryGetFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryGetFdInfoKHR & operator=( VkMemoryGetFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryGetFdInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MemoryGetFdInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryGetFdInfoKHR & setMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memory = memory_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryGetFdInfoKHR & setHandleType( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMemoryGetFdInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryGetFdInfoKHR *>( this );\n    }\n\n    operator VkMemoryGetFdInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryGetFdInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceMemory const &,\n               VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, memory, handleType );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryGetFdInfoKHR const & ) const = default;\n#else\n    bool operator==( MemoryGetFdInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memory == rhs.memory ) && ( handleType == rhs.handleType );\n#  endif\n    }\n\n    bool operator!=( MemoryGetFdInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType      = StructureType::eMemoryGetFdInfoKHR;\n    const void *                                           pNext      = {};\n    VULKAN_HPP_NAMESPACE::DeviceMemory                     memory     = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryGetFdInfoKHR>\n  {\n    using Type = MemoryGetFdInfoKHR;\n  };\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  struct MemoryGetMetalHandleInfoEXT\n  {\n    using NativeType = VkMemoryGetMetalHandleInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryGetMetalHandleInfoEXT;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryGetMetalHandleInfoEXT(\n      VULKAN_HPP_NAMESPACE::DeviceMemory                     memory_     = {},\n      VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_ = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd,\n      const void *                                           pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , memory{ memory_ }\n      , handleType{ handleType_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryGetMetalHandleInfoEXT( MemoryGetMetalHandleInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryGetMetalHandleInfoEXT( VkMemoryGetMetalHandleInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MemoryGetMetalHandleInfoEXT( *reinterpret_cast<MemoryGetMetalHandleInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    MemoryGetMetalHandleInfoEXT & operator=( MemoryGetMetalHandleInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryGetMetalHandleInfoEXT & operator=( VkMemoryGetMetalHandleInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryGetMetalHandleInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MemoryGetMetalHandleInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryGetMetalHandleInfoEXT & setMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memory = memory_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryGetMetalHandleInfoEXT &\n      setHandleType( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMemoryGetMetalHandleInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryGetMetalHandleInfoEXT *>( this );\n    }\n\n    operator VkMemoryGetMetalHandleInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryGetMetalHandleInfoEXT *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceMemory const &,\n               VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, memory, handleType );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryGetMetalHandleInfoEXT const & ) const = default;\n#  else\n    bool operator==( MemoryGetMetalHandleInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memory == rhs.memory ) && ( handleType == rhs.handleType );\n#    endif\n    }\n\n    bool operator!=( MemoryGetMetalHandleInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType      = StructureType::eMemoryGetMetalHandleInfoEXT;\n    const void *                                           pNext      = {};\n    VULKAN_HPP_NAMESPACE::DeviceMemory                     memory     = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryGetMetalHandleInfoEXT>\n  {\n    using Type = MemoryGetMetalHandleInfoEXT;\n  };\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n  struct MemoryGetRemoteAddressInfoNV\n  {\n    using NativeType = VkMemoryGetRemoteAddressInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryGetRemoteAddressInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryGetRemoteAddressInfoNV(\n      VULKAN_HPP_NAMESPACE::DeviceMemory                     memory_     = {},\n      VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_ = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd,\n      const void *                                           pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , memory{ memory_ }\n      , handleType{ handleType_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryGetRemoteAddressInfoNV( MemoryGetRemoteAddressInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryGetRemoteAddressInfoNV( VkMemoryGetRemoteAddressInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MemoryGetRemoteAddressInfoNV( *reinterpret_cast<MemoryGetRemoteAddressInfoNV const *>( &rhs ) )\n    {\n    }\n\n    MemoryGetRemoteAddressInfoNV & operator=( MemoryGetRemoteAddressInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryGetRemoteAddressInfoNV & operator=( VkMemoryGetRemoteAddressInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryGetRemoteAddressInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MemoryGetRemoteAddressInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryGetRemoteAddressInfoNV & setMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memory = memory_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryGetRemoteAddressInfoNV &\n      setHandleType( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMemoryGetRemoteAddressInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryGetRemoteAddressInfoNV *>( this );\n    }\n\n    operator VkMemoryGetRemoteAddressInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryGetRemoteAddressInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceMemory const &,\n               VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, memory, handleType );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryGetRemoteAddressInfoNV const & ) const = default;\n#else\n    bool operator==( MemoryGetRemoteAddressInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memory == rhs.memory ) && ( handleType == rhs.handleType );\n#  endif\n    }\n\n    bool operator!=( MemoryGetRemoteAddressInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType      = StructureType::eMemoryGetRemoteAddressInfoNV;\n    const void *                                           pNext      = {};\n    VULKAN_HPP_NAMESPACE::DeviceMemory                     memory     = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryGetRemoteAddressInfoNV>\n  {\n    using Type = MemoryGetRemoteAddressInfoNV;\n  };\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  struct MemoryGetWin32HandleInfoKHR\n  {\n    using NativeType = VkMemoryGetWin32HandleInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryGetWin32HandleInfoKHR;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryGetWin32HandleInfoKHR(\n      VULKAN_HPP_NAMESPACE::DeviceMemory                     memory_     = {},\n      VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_ = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd,\n      const void *                                           pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , memory{ memory_ }\n      , handleType{ handleType_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryGetWin32HandleInfoKHR( MemoryGetWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryGetWin32HandleInfoKHR( VkMemoryGetWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MemoryGetWin32HandleInfoKHR( *reinterpret_cast<MemoryGetWin32HandleInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    MemoryGetWin32HandleInfoKHR & operator=( MemoryGetWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryGetWin32HandleInfoKHR & operator=( VkMemoryGetWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryGetWin32HandleInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MemoryGetWin32HandleInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryGetWin32HandleInfoKHR & setMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memory = memory_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryGetWin32HandleInfoKHR &\n      setHandleType( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMemoryGetWin32HandleInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryGetWin32HandleInfoKHR *>( this );\n    }\n\n    operator VkMemoryGetWin32HandleInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryGetWin32HandleInfoKHR *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceMemory const &,\n               VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, memory, handleType );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryGetWin32HandleInfoKHR const & ) const = default;\n#  else\n    bool operator==( MemoryGetWin32HandleInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memory == rhs.memory ) && ( handleType == rhs.handleType );\n#    endif\n    }\n\n    bool operator!=( MemoryGetWin32HandleInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType      = StructureType::eMemoryGetWin32HandleInfoKHR;\n    const void *                                           pNext      = {};\n    VULKAN_HPP_NAMESPACE::DeviceMemory                     memory     = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryGetWin32HandleInfoKHR>\n  {\n    using Type = MemoryGetWin32HandleInfoKHR;\n  };\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  struct MemoryGetZirconHandleInfoFUCHSIA\n  {\n    using NativeType = VkMemoryGetZirconHandleInfoFUCHSIA;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryGetZirconHandleInfoFUCHSIA;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryGetZirconHandleInfoFUCHSIA(\n      VULKAN_HPP_NAMESPACE::DeviceMemory                     memory_     = {},\n      VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_ = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd,\n      const void *                                           pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , memory{ memory_ }\n      , handleType{ handleType_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryGetZirconHandleInfoFUCHSIA( MemoryGetZirconHandleInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryGetZirconHandleInfoFUCHSIA( VkMemoryGetZirconHandleInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MemoryGetZirconHandleInfoFUCHSIA( *reinterpret_cast<MemoryGetZirconHandleInfoFUCHSIA const *>( &rhs ) )\n    {\n    }\n\n    MemoryGetZirconHandleInfoFUCHSIA & operator=( MemoryGetZirconHandleInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryGetZirconHandleInfoFUCHSIA & operator=( VkMemoryGetZirconHandleInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryGetZirconHandleInfoFUCHSIA const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MemoryGetZirconHandleInfoFUCHSIA & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryGetZirconHandleInfoFUCHSIA & setMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memory = memory_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryGetZirconHandleInfoFUCHSIA &\n      setHandleType( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMemoryGetZirconHandleInfoFUCHSIA const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryGetZirconHandleInfoFUCHSIA *>( this );\n    }\n\n    operator VkMemoryGetZirconHandleInfoFUCHSIA &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryGetZirconHandleInfoFUCHSIA *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceMemory const &,\n               VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, memory, handleType );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryGetZirconHandleInfoFUCHSIA const & ) const = default;\n#  else\n    bool operator==( MemoryGetZirconHandleInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memory == rhs.memory ) && ( handleType == rhs.handleType );\n#    endif\n    }\n\n    bool operator!=( MemoryGetZirconHandleInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType      = StructureType::eMemoryGetZirconHandleInfoFUCHSIA;\n    const void *                                           pNext      = {};\n    VULKAN_HPP_NAMESPACE::DeviceMemory                     memory     = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryGetZirconHandleInfoFUCHSIA>\n  {\n    using Type = MemoryGetZirconHandleInfoFUCHSIA;\n  };\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  struct MemoryHeap\n  {\n    using NativeType = VkMemoryHeap;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryHeap( VULKAN_HPP_NAMESPACE::DeviceSize size_ = {}, VULKAN_HPP_NAMESPACE::MemoryHeapFlags flags_ = {} ) VULKAN_HPP_NOEXCEPT\n      : size{ size_ }\n      , flags{ flags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryHeap( MemoryHeap const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryHeap( VkMemoryHeap const & rhs ) VULKAN_HPP_NOEXCEPT : MemoryHeap( *reinterpret_cast<MemoryHeap const *>( &rhs ) ) {}\n\n    MemoryHeap & operator=( MemoryHeap const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryHeap & operator=( VkMemoryHeap const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryHeap const *>( &rhs );\n      return *this;\n    }\n\n    operator VkMemoryHeap const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryHeap *>( this );\n    }\n\n    operator VkMemoryHeap &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryHeap *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DeviceSize const &, VULKAN_HPP_NAMESPACE::MemoryHeapFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( size, flags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryHeap const & ) const = default;\n#else\n    bool operator==( MemoryHeap const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( size == rhs.size ) && ( flags == rhs.flags );\n#  endif\n    }\n\n    bool operator!=( MemoryHeap const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DeviceSize      size  = {};\n    VULKAN_HPP_NAMESPACE::MemoryHeapFlags flags = {};\n  };\n\n  struct MemoryHostPointerPropertiesEXT\n  {\n    using NativeType = VkMemoryHostPointerPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryHostPointerPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryHostPointerPropertiesEXT( uint32_t memoryTypeBits_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , memoryTypeBits{ memoryTypeBits_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryHostPointerPropertiesEXT( MemoryHostPointerPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryHostPointerPropertiesEXT( VkMemoryHostPointerPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MemoryHostPointerPropertiesEXT( *reinterpret_cast<MemoryHostPointerPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    MemoryHostPointerPropertiesEXT & operator=( MemoryHostPointerPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryHostPointerPropertiesEXT & operator=( VkMemoryHostPointerPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryHostPointerPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkMemoryHostPointerPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryHostPointerPropertiesEXT *>( this );\n    }\n\n    operator VkMemoryHostPointerPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryHostPointerPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, memoryTypeBits );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryHostPointerPropertiesEXT const & ) const = default;\n#else\n    bool operator==( MemoryHostPointerPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memoryTypeBits == rhs.memoryTypeBits );\n#  endif\n    }\n\n    bool operator!=( MemoryHostPointerPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::eMemoryHostPointerPropertiesEXT;\n    void *                              pNext          = {};\n    uint32_t                            memoryTypeBits = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryHostPointerPropertiesEXT>\n  {\n    using Type = MemoryHostPointerPropertiesEXT;\n  };\n\n  struct MemoryMapInfo\n  {\n    using NativeType = VkMemoryMapInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryMapInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryMapInfo( VULKAN_HPP_NAMESPACE::MemoryMapFlags flags_  = {},\n                                        VULKAN_HPP_NAMESPACE::DeviceMemory   memory_ = {},\n                                        VULKAN_HPP_NAMESPACE::DeviceSize     offset_ = {},\n                                        VULKAN_HPP_NAMESPACE::DeviceSize     size_   = {},\n                                        const void *                         pNext_  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , memory{ memory_ }\n      , offset{ offset_ }\n      , size{ size_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryMapInfo( MemoryMapInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryMapInfo( VkMemoryMapInfo const & rhs ) VULKAN_HPP_NOEXCEPT : MemoryMapInfo( *reinterpret_cast<MemoryMapInfo const *>( &rhs ) ) {}\n\n    MemoryMapInfo & operator=( MemoryMapInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryMapInfo & operator=( VkMemoryMapInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryMapInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MemoryMapInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryMapInfo & setFlags( VULKAN_HPP_NAMESPACE::MemoryMapFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryMapInfo & setMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memory = memory_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryMapInfo & setOffset( VULKAN_HPP_NAMESPACE::DeviceSize offset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      offset = offset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryMapInfo & setSize( VULKAN_HPP_NAMESPACE::DeviceSize size_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size = size_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMemoryMapInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryMapInfo *>( this );\n    }\n\n    operator VkMemoryMapInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryMapInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::MemoryMapFlags const &,\n               VULKAN_HPP_NAMESPACE::DeviceMemory const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, memory, offset, size );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryMapInfo const & ) const = default;\n#else\n    bool operator==( MemoryMapInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( memory == rhs.memory ) && ( offset == rhs.offset ) &&\n             ( size == rhs.size );\n#  endif\n    }\n\n    bool operator!=( MemoryMapInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType  sType  = StructureType::eMemoryMapInfo;\n    const void *                         pNext  = {};\n    VULKAN_HPP_NAMESPACE::MemoryMapFlags flags  = {};\n    VULKAN_HPP_NAMESPACE::DeviceMemory   memory = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize     offset = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize     size   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryMapInfo>\n  {\n    using Type = MemoryMapInfo;\n  };\n\n  using MemoryMapInfoKHR = MemoryMapInfo;\n\n  struct MemoryMapPlacedInfoEXT\n  {\n    using NativeType = VkMemoryMapPlacedInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryMapPlacedInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryMapPlacedInfoEXT( void * pPlacedAddress_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pPlacedAddress{ pPlacedAddress_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryMapPlacedInfoEXT( MemoryMapPlacedInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryMapPlacedInfoEXT( VkMemoryMapPlacedInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MemoryMapPlacedInfoEXT( *reinterpret_cast<MemoryMapPlacedInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    MemoryMapPlacedInfoEXT & operator=( MemoryMapPlacedInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryMapPlacedInfoEXT & operator=( VkMemoryMapPlacedInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryMapPlacedInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MemoryMapPlacedInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryMapPlacedInfoEXT & setPPlacedAddress( void * pPlacedAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPlacedAddress = pPlacedAddress_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMemoryMapPlacedInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryMapPlacedInfoEXT *>( this );\n    }\n\n    operator VkMemoryMapPlacedInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryMapPlacedInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pPlacedAddress );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryMapPlacedInfoEXT const & ) const = default;\n#else\n    bool operator==( MemoryMapPlacedInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pPlacedAddress == rhs.pPlacedAddress );\n#  endif\n    }\n\n    bool operator!=( MemoryMapPlacedInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::eMemoryMapPlacedInfoEXT;\n    const void *                        pNext          = {};\n    void *                              pPlacedAddress = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryMapPlacedInfoEXT>\n  {\n    using Type = MemoryMapPlacedInfoEXT;\n  };\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  struct MemoryMetalHandlePropertiesEXT\n  {\n    using NativeType = VkMemoryMetalHandlePropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryMetalHandlePropertiesEXT;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryMetalHandlePropertiesEXT( uint32_t memoryTypeBits_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , memoryTypeBits{ memoryTypeBits_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryMetalHandlePropertiesEXT( MemoryMetalHandlePropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryMetalHandlePropertiesEXT( VkMemoryMetalHandlePropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MemoryMetalHandlePropertiesEXT( *reinterpret_cast<MemoryMetalHandlePropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    MemoryMetalHandlePropertiesEXT & operator=( MemoryMetalHandlePropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryMetalHandlePropertiesEXT & operator=( VkMemoryMetalHandlePropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryMetalHandlePropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkMemoryMetalHandlePropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryMetalHandlePropertiesEXT *>( this );\n    }\n\n    operator VkMemoryMetalHandlePropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryMetalHandlePropertiesEXT *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, memoryTypeBits );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryMetalHandlePropertiesEXT const & ) const = default;\n#  else\n    bool operator==( MemoryMetalHandlePropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memoryTypeBits == rhs.memoryTypeBits );\n#    endif\n    }\n\n    bool operator!=( MemoryMetalHandlePropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::eMemoryMetalHandlePropertiesEXT;\n    void *                              pNext          = {};\n    uint32_t                            memoryTypeBits = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryMetalHandlePropertiesEXT>\n  {\n    using Type = MemoryMetalHandlePropertiesEXT;\n  };\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n  struct MemoryOpaqueCaptureAddressAllocateInfo\n  {\n    using NativeType = VkMemoryOpaqueCaptureAddressAllocateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryOpaqueCaptureAddressAllocateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryOpaqueCaptureAddressAllocateInfo( uint64_t opaqueCaptureAddress_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , opaqueCaptureAddress{ opaqueCaptureAddress_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryOpaqueCaptureAddressAllocateInfo( MemoryOpaqueCaptureAddressAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryOpaqueCaptureAddressAllocateInfo( VkMemoryOpaqueCaptureAddressAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MemoryOpaqueCaptureAddressAllocateInfo( *reinterpret_cast<MemoryOpaqueCaptureAddressAllocateInfo const *>( &rhs ) )\n    {\n    }\n\n    MemoryOpaqueCaptureAddressAllocateInfo & operator=( MemoryOpaqueCaptureAddressAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryOpaqueCaptureAddressAllocateInfo & operator=( VkMemoryOpaqueCaptureAddressAllocateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryOpaqueCaptureAddressAllocateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MemoryOpaqueCaptureAddressAllocateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryOpaqueCaptureAddressAllocateInfo & setOpaqueCaptureAddress( uint64_t opaqueCaptureAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      opaqueCaptureAddress = opaqueCaptureAddress_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMemoryOpaqueCaptureAddressAllocateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryOpaqueCaptureAddressAllocateInfo *>( this );\n    }\n\n    operator VkMemoryOpaqueCaptureAddressAllocateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryOpaqueCaptureAddressAllocateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, opaqueCaptureAddress );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryOpaqueCaptureAddressAllocateInfo const & ) const = default;\n#else\n    bool operator==( MemoryOpaqueCaptureAddressAllocateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( opaqueCaptureAddress == rhs.opaqueCaptureAddress );\n#  endif\n    }\n\n    bool operator!=( MemoryOpaqueCaptureAddressAllocateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                = StructureType::eMemoryOpaqueCaptureAddressAllocateInfo;\n    const void *                        pNext                = {};\n    uint64_t                            opaqueCaptureAddress = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryOpaqueCaptureAddressAllocateInfo>\n  {\n    using Type = MemoryOpaqueCaptureAddressAllocateInfo;\n  };\n\n  using MemoryOpaqueCaptureAddressAllocateInfoKHR = MemoryOpaqueCaptureAddressAllocateInfo;\n\n  struct MemoryPriorityAllocateInfoEXT\n  {\n    using NativeType = VkMemoryPriorityAllocateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryPriorityAllocateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryPriorityAllocateInfoEXT( float priority_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , priority{ priority_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryPriorityAllocateInfoEXT( MemoryPriorityAllocateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryPriorityAllocateInfoEXT( VkMemoryPriorityAllocateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MemoryPriorityAllocateInfoEXT( *reinterpret_cast<MemoryPriorityAllocateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    MemoryPriorityAllocateInfoEXT & operator=( MemoryPriorityAllocateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryPriorityAllocateInfoEXT & operator=( VkMemoryPriorityAllocateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryPriorityAllocateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MemoryPriorityAllocateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryPriorityAllocateInfoEXT & setPriority( float priority_ ) VULKAN_HPP_NOEXCEPT\n    {\n      priority = priority_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMemoryPriorityAllocateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryPriorityAllocateInfoEXT *>( this );\n    }\n\n    operator VkMemoryPriorityAllocateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryPriorityAllocateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, float const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, priority );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryPriorityAllocateInfoEXT const & ) const = default;\n#else\n    bool operator==( MemoryPriorityAllocateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( priority == rhs.priority );\n#  endif\n    }\n\n    bool operator!=( MemoryPriorityAllocateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType    = StructureType::eMemoryPriorityAllocateInfoEXT;\n    const void *                        pNext    = {};\n    float                               priority = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryPriorityAllocateInfoEXT>\n  {\n    using Type = MemoryPriorityAllocateInfoEXT;\n  };\n\n  struct MemoryRequirements\n  {\n    using NativeType = VkMemoryRequirements;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryRequirements( VULKAN_HPP_NAMESPACE::DeviceSize size_           = {},\n                                             VULKAN_HPP_NAMESPACE::DeviceSize alignment_      = {},\n                                             uint32_t                         memoryTypeBits_ = {} ) VULKAN_HPP_NOEXCEPT\n      : size{ size_ }\n      , alignment{ alignment_ }\n      , memoryTypeBits{ memoryTypeBits_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryRequirements( MemoryRequirements const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryRequirements( VkMemoryRequirements const & rhs ) VULKAN_HPP_NOEXCEPT : MemoryRequirements( *reinterpret_cast<MemoryRequirements const *>( &rhs ) ) {}\n\n    MemoryRequirements & operator=( MemoryRequirements const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryRequirements & operator=( VkMemoryRequirements const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryRequirements const *>( &rhs );\n      return *this;\n    }\n\n    operator VkMemoryRequirements const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryRequirements *>( this );\n    }\n\n    operator VkMemoryRequirements &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryRequirements *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DeviceSize const &, VULKAN_HPP_NAMESPACE::DeviceSize const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( size, alignment, memoryTypeBits );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryRequirements const & ) const = default;\n#else\n    bool operator==( MemoryRequirements const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( size == rhs.size ) && ( alignment == rhs.alignment ) && ( memoryTypeBits == rhs.memoryTypeBits );\n#  endif\n    }\n\n    bool operator!=( MemoryRequirements const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DeviceSize size           = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize alignment      = {};\n    uint32_t                         memoryTypeBits = {};\n  };\n\n  struct MemoryRequirements2\n  {\n    using NativeType = VkMemoryRequirements2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryRequirements2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryRequirements2( VULKAN_HPP_NAMESPACE::MemoryRequirements memoryRequirements_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , memoryRequirements{ memoryRequirements_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryRequirements2( MemoryRequirements2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryRequirements2( VkMemoryRequirements2 const & rhs ) VULKAN_HPP_NOEXCEPT : MemoryRequirements2( *reinterpret_cast<MemoryRequirements2 const *>( &rhs ) )\n    {\n    }\n\n    MemoryRequirements2 & operator=( MemoryRequirements2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryRequirements2 & operator=( VkMemoryRequirements2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryRequirements2 const *>( &rhs );\n      return *this;\n    }\n\n    operator VkMemoryRequirements2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryRequirements2 *>( this );\n    }\n\n    operator VkMemoryRequirements2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryRequirements2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::MemoryRequirements const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, memoryRequirements );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryRequirements2 const & ) const = default;\n#else\n    bool operator==( MemoryRequirements2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memoryRequirements == rhs.memoryRequirements );\n#  endif\n    }\n\n    bool operator!=( MemoryRequirements2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType      sType              = StructureType::eMemoryRequirements2;\n    void *                                   pNext              = {};\n    VULKAN_HPP_NAMESPACE::MemoryRequirements memoryRequirements = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryRequirements2>\n  {\n    using Type = MemoryRequirements2;\n  };\n\n  using MemoryRequirements2KHR = MemoryRequirements2;\n\n  struct MemoryType\n  {\n    using NativeType = VkMemoryType;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryType( VULKAN_HPP_NAMESPACE::MemoryPropertyFlags propertyFlags_ = {}, uint32_t heapIndex_ = {} ) VULKAN_HPP_NOEXCEPT\n      : propertyFlags{ propertyFlags_ }\n      , heapIndex{ heapIndex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryType( MemoryType const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryType( VkMemoryType const & rhs ) VULKAN_HPP_NOEXCEPT : MemoryType( *reinterpret_cast<MemoryType const *>( &rhs ) ) {}\n\n    MemoryType & operator=( MemoryType const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryType & operator=( VkMemoryType const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryType const *>( &rhs );\n      return *this;\n    }\n\n    operator VkMemoryType const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryType *>( this );\n    }\n\n    operator VkMemoryType &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryType *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::MemoryPropertyFlags const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( propertyFlags, heapIndex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryType const & ) const = default;\n#else\n    bool operator==( MemoryType const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( propertyFlags == rhs.propertyFlags ) && ( heapIndex == rhs.heapIndex );\n#  endif\n    }\n\n    bool operator!=( MemoryType const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::MemoryPropertyFlags propertyFlags = {};\n    uint32_t                                  heapIndex     = {};\n  };\n\n  struct MemoryUnmapInfo\n  {\n    using NativeType = VkMemoryUnmapInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryUnmapInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryUnmapInfo( VULKAN_HPP_NAMESPACE::MemoryUnmapFlags flags_  = {},\n                                          VULKAN_HPP_NAMESPACE::DeviceMemory     memory_ = {},\n                                          const void *                           pNext_  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , memory{ memory_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryUnmapInfo( MemoryUnmapInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryUnmapInfo( VkMemoryUnmapInfo const & rhs ) VULKAN_HPP_NOEXCEPT : MemoryUnmapInfo( *reinterpret_cast<MemoryUnmapInfo const *>( &rhs ) ) {}\n\n    MemoryUnmapInfo & operator=( MemoryUnmapInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryUnmapInfo & operator=( VkMemoryUnmapInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryUnmapInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MemoryUnmapInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryUnmapInfo & setFlags( VULKAN_HPP_NAMESPACE::MemoryUnmapFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MemoryUnmapInfo & setMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memory = memory_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMemoryUnmapInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryUnmapInfo *>( this );\n    }\n\n    operator VkMemoryUnmapInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryUnmapInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::MemoryUnmapFlags const &,\n               VULKAN_HPP_NAMESPACE::DeviceMemory const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, memory );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryUnmapInfo const & ) const = default;\n#else\n    bool operator==( MemoryUnmapInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( memory == rhs.memory );\n#  endif\n    }\n\n    bool operator!=( MemoryUnmapInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType  = StructureType::eMemoryUnmapInfo;\n    const void *                           pNext  = {};\n    VULKAN_HPP_NAMESPACE::MemoryUnmapFlags flags  = {};\n    VULKAN_HPP_NAMESPACE::DeviceMemory     memory = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryUnmapInfo>\n  {\n    using Type = MemoryUnmapInfo;\n  };\n\n  using MemoryUnmapInfoKHR = MemoryUnmapInfo;\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  struct MemoryWin32HandlePropertiesKHR\n  {\n    using NativeType = VkMemoryWin32HandlePropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryWin32HandlePropertiesKHR;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryWin32HandlePropertiesKHR( uint32_t memoryTypeBits_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , memoryTypeBits{ memoryTypeBits_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryWin32HandlePropertiesKHR( MemoryWin32HandlePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryWin32HandlePropertiesKHR( VkMemoryWin32HandlePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MemoryWin32HandlePropertiesKHR( *reinterpret_cast<MemoryWin32HandlePropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    MemoryWin32HandlePropertiesKHR & operator=( MemoryWin32HandlePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryWin32HandlePropertiesKHR & operator=( VkMemoryWin32HandlePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryWin32HandlePropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkMemoryWin32HandlePropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryWin32HandlePropertiesKHR *>( this );\n    }\n\n    operator VkMemoryWin32HandlePropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryWin32HandlePropertiesKHR *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, memoryTypeBits );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryWin32HandlePropertiesKHR const & ) const = default;\n#  else\n    bool operator==( MemoryWin32HandlePropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memoryTypeBits == rhs.memoryTypeBits );\n#    endif\n    }\n\n    bool operator!=( MemoryWin32HandlePropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::eMemoryWin32HandlePropertiesKHR;\n    void *                              pNext          = {};\n    uint32_t                            memoryTypeBits = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryWin32HandlePropertiesKHR>\n  {\n    using Type = MemoryWin32HandlePropertiesKHR;\n  };\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  struct MemoryZirconHandlePropertiesFUCHSIA\n  {\n    using NativeType = VkMemoryZirconHandlePropertiesFUCHSIA;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMemoryZirconHandlePropertiesFUCHSIA;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MemoryZirconHandlePropertiesFUCHSIA( uint32_t memoryTypeBits_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , memoryTypeBits{ memoryTypeBits_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MemoryZirconHandlePropertiesFUCHSIA( MemoryZirconHandlePropertiesFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MemoryZirconHandlePropertiesFUCHSIA( VkMemoryZirconHandlePropertiesFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MemoryZirconHandlePropertiesFUCHSIA( *reinterpret_cast<MemoryZirconHandlePropertiesFUCHSIA const *>( &rhs ) )\n    {\n    }\n\n    MemoryZirconHandlePropertiesFUCHSIA & operator=( MemoryZirconHandlePropertiesFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MemoryZirconHandlePropertiesFUCHSIA & operator=( VkMemoryZirconHandlePropertiesFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MemoryZirconHandlePropertiesFUCHSIA const *>( &rhs );\n      return *this;\n    }\n\n    operator VkMemoryZirconHandlePropertiesFUCHSIA const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMemoryZirconHandlePropertiesFUCHSIA *>( this );\n    }\n\n    operator VkMemoryZirconHandlePropertiesFUCHSIA &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMemoryZirconHandlePropertiesFUCHSIA *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, memoryTypeBits );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MemoryZirconHandlePropertiesFUCHSIA const & ) const = default;\n#  else\n    bool operator==( MemoryZirconHandlePropertiesFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memoryTypeBits == rhs.memoryTypeBits );\n#    endif\n    }\n\n    bool operator!=( MemoryZirconHandlePropertiesFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::eMemoryZirconHandlePropertiesFUCHSIA;\n    void *                              pNext          = {};\n    uint32_t                            memoryTypeBits = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMemoryZirconHandlePropertiesFUCHSIA>\n  {\n    using Type = MemoryZirconHandlePropertiesFUCHSIA;\n  };\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  struct MetalSurfaceCreateInfoEXT\n  {\n    using NativeType = VkMetalSurfaceCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMetalSurfaceCreateInfoEXT;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MetalSurfaceCreateInfoEXT( VULKAN_HPP_NAMESPACE::MetalSurfaceCreateFlagsEXT flags_  = {},\n                                                    const CAMetalLayer *                             pLayer_ = {},\n                                                    const void *                                     pNext_  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , pLayer{ pLayer_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MetalSurfaceCreateInfoEXT( MetalSurfaceCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MetalSurfaceCreateInfoEXT( VkMetalSurfaceCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MetalSurfaceCreateInfoEXT( *reinterpret_cast<MetalSurfaceCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    MetalSurfaceCreateInfoEXT & operator=( MetalSurfaceCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MetalSurfaceCreateInfoEXT & operator=( VkMetalSurfaceCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MetalSurfaceCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MetalSurfaceCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MetalSurfaceCreateInfoEXT & setFlags( VULKAN_HPP_NAMESPACE::MetalSurfaceCreateFlagsEXT flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MetalSurfaceCreateInfoEXT & setPLayer( const CAMetalLayer * pLayer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pLayer = pLayer_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMetalSurfaceCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMetalSurfaceCreateInfoEXT *>( this );\n    }\n\n    operator VkMetalSurfaceCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMetalSurfaceCreateInfoEXT *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::MetalSurfaceCreateFlagsEXT const &,\n               const CAMetalLayer * const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, pLayer );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MetalSurfaceCreateInfoEXT const & ) const = default;\n#  else\n    bool operator==( MetalSurfaceCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( pLayer == rhs.pLayer );\n#    endif\n    }\n\n    bool operator!=( MetalSurfaceCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType              sType  = StructureType::eMetalSurfaceCreateInfoEXT;\n    const void *                                     pNext  = {};\n    VULKAN_HPP_NAMESPACE::MetalSurfaceCreateFlagsEXT flags  = {};\n    const CAMetalLayer *                             pLayer = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMetalSurfaceCreateInfoEXT>\n  {\n    using Type = MetalSurfaceCreateInfoEXT;\n  };\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n  struct MicromapBuildInfoEXT\n  {\n    using NativeType = VkMicromapBuildInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMicromapBuildInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 MicromapBuildInfoEXT( VULKAN_HPP_NAMESPACE::MicromapTypeEXT       type_  = VULKAN_HPP_NAMESPACE::MicromapTypeEXT::eOpacityMicromap,\n                                                  VULKAN_HPP_NAMESPACE::BuildMicromapFlagsEXT flags_ = {},\n                                                  VULKAN_HPP_NAMESPACE::BuildMicromapModeEXT  mode_  = VULKAN_HPP_NAMESPACE::BuildMicromapModeEXT::eBuild,\n                                                  VULKAN_HPP_NAMESPACE::MicromapEXT           dstMicromap_                    = {},\n                                                  uint32_t                                    usageCountsCount_               = {},\n                                                  const VULKAN_HPP_NAMESPACE::MicromapUsageEXT *         pUsageCounts_        = {},\n                                                  const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * const * ppUsageCounts_       = {},\n                                                  VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR      data_                = {},\n                                                  VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR           scratchData_         = {},\n                                                  VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR      triangleArray_       = {},\n                                                  VULKAN_HPP_NAMESPACE::DeviceSize                       triangleArrayStride_ = {},\n                                                  const void *                                           pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , type{ type_ }\n      , flags{ flags_ }\n      , mode{ mode_ }\n      , dstMicromap{ dstMicromap_ }\n      , usageCountsCount{ usageCountsCount_ }\n      , pUsageCounts{ pUsageCounts_ }\n      , ppUsageCounts{ ppUsageCounts_ }\n      , data{ data_ }\n      , scratchData{ scratchData_ }\n      , triangleArray{ triangleArray_ }\n      , triangleArrayStride{ triangleArrayStride_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapBuildInfoEXT( MicromapBuildInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MicromapBuildInfoEXT( VkMicromapBuildInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MicromapBuildInfoEXT( *reinterpret_cast<MicromapBuildInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    MicromapBuildInfoEXT( VULKAN_HPP_NAMESPACE::MicromapTypeEXT                                                                       type_,\n                          VULKAN_HPP_NAMESPACE::BuildMicromapFlagsEXT                                                                 flags_,\n                          VULKAN_HPP_NAMESPACE::BuildMicromapModeEXT                                                                  mode_,\n                          VULKAN_HPP_NAMESPACE::MicromapEXT                                                                           dstMicromap_,\n                          VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::MicromapUsageEXT> const &         usageCounts_,\n                          VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * const> const & pUsageCounts_        = {},\n                          VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR                                                           data_                = {},\n                          VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR                                                                scratchData_         = {},\n                          VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR                                                           triangleArray_       = {},\n                          VULKAN_HPP_NAMESPACE::DeviceSize                                                                            triangleArrayStride_ = {},\n                          const void *                                                                                                pNext_ = nullptr )\n      : pNext( pNext_ )\n      , type( type_ )\n      , flags( flags_ )\n      , mode( mode_ )\n      , dstMicromap( dstMicromap_ )\n      , usageCountsCount( static_cast<uint32_t>( !usageCounts_.empty() ? usageCounts_.size() : pUsageCounts_.size() ) )\n      , pUsageCounts( usageCounts_.data() )\n      , ppUsageCounts( pUsageCounts_.data() )\n      , data( data_ )\n      , scratchData( scratchData_ )\n      , triangleArray( triangleArray_ )\n      , triangleArrayStride( triangleArrayStride_ )\n    {\n#    ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( ( !usageCounts_.empty() + !pUsageCounts_.empty() ) <= 1 );\n#    else\n      if ( 1 < ( !usageCounts_.empty() + !pUsageCounts_.empty() ) )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::MicromapBuildInfoEXT::MicromapBuildInfoEXT: 1 < ( !usageCounts_.empty() + !pUsageCounts_.empty() )\" );\n      }\n#    endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    MicromapBuildInfoEXT & operator=( MicromapBuildInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MicromapBuildInfoEXT & operator=( VkMicromapBuildInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MicromapBuildInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MicromapBuildInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapBuildInfoEXT & setType( VULKAN_HPP_NAMESPACE::MicromapTypeEXT type_ ) VULKAN_HPP_NOEXCEPT\n    {\n      type = type_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapBuildInfoEXT & setFlags( VULKAN_HPP_NAMESPACE::BuildMicromapFlagsEXT flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapBuildInfoEXT & setMode( VULKAN_HPP_NAMESPACE::BuildMicromapModeEXT mode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mode = mode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapBuildInfoEXT & setDstMicromap( VULKAN_HPP_NAMESPACE::MicromapEXT dstMicromap_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstMicromap = dstMicromap_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapBuildInfoEXT & setUsageCountsCount( uint32_t usageCountsCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      usageCountsCount = usageCountsCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapBuildInfoEXT & setPUsageCounts( const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * pUsageCounts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pUsageCounts = pUsageCounts_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    MicromapBuildInfoEXT &\n      setUsageCounts( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::MicromapUsageEXT> const & usageCounts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      usageCountsCount = static_cast<uint32_t>( usageCounts_.size() );\n      pUsageCounts     = usageCounts_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapBuildInfoEXT & setPpUsageCounts( const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * const * ppUsageCounts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      ppUsageCounts = ppUsageCounts_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    MicromapBuildInfoEXT & setPUsageCounts(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * const> const & pUsageCounts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      usageCountsCount = static_cast<uint32_t>( pUsageCounts_.size() );\n      ppUsageCounts    = pUsageCounts_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapBuildInfoEXT & setData( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & data_ ) VULKAN_HPP_NOEXCEPT\n    {\n      data = data_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapBuildInfoEXT & setScratchData( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR const & scratchData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      scratchData = scratchData_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapBuildInfoEXT &\n      setTriangleArray( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & triangleArray_ ) VULKAN_HPP_NOEXCEPT\n    {\n      triangleArray = triangleArray_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapBuildInfoEXT & setTriangleArrayStride( VULKAN_HPP_NAMESPACE::DeviceSize triangleArrayStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      triangleArrayStride = triangleArrayStride_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMicromapBuildInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMicromapBuildInfoEXT *>( this );\n    }\n\n    operator VkMicromapBuildInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMicromapBuildInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::MicromapTypeEXT const &,\n               VULKAN_HPP_NAMESPACE::BuildMicromapFlagsEXT const &,\n               VULKAN_HPP_NAMESPACE::BuildMicromapModeEXT const &,\n               VULKAN_HPP_NAMESPACE::MicromapEXT const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * const &,\n               const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * const * const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR const &,\n               VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie(\n        sType, pNext, type, flags, mode, dstMicromap, usageCountsCount, pUsageCounts, ppUsageCounts, data, scratchData, triangleArray, triangleArrayStride );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType               = StructureType::eMicromapBuildInfoEXT;\n    const void *                                           pNext               = {};\n    VULKAN_HPP_NAMESPACE::MicromapTypeEXT                  type                = VULKAN_HPP_NAMESPACE::MicromapTypeEXT::eOpacityMicromap;\n    VULKAN_HPP_NAMESPACE::BuildMicromapFlagsEXT            flags               = {};\n    VULKAN_HPP_NAMESPACE::BuildMicromapModeEXT             mode                = VULKAN_HPP_NAMESPACE::BuildMicromapModeEXT::eBuild;\n    VULKAN_HPP_NAMESPACE::MicromapEXT                      dstMicromap         = {};\n    uint32_t                                               usageCountsCount    = {};\n    const VULKAN_HPP_NAMESPACE::MicromapUsageEXT *         pUsageCounts        = {};\n    const VULKAN_HPP_NAMESPACE::MicromapUsageEXT * const * ppUsageCounts       = {};\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR      data                = {};\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR           scratchData         = {};\n    VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR      triangleArray       = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                       triangleArrayStride = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMicromapBuildInfoEXT>\n  {\n    using Type = MicromapBuildInfoEXT;\n  };\n\n  struct MicromapBuildSizesInfoEXT\n  {\n    using NativeType = VkMicromapBuildSizesInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMicromapBuildSizesInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MicromapBuildSizesInfoEXT( VULKAN_HPP_NAMESPACE::DeviceSize micromapSize_     = {},\n                                                    VULKAN_HPP_NAMESPACE::DeviceSize buildScratchSize_ = {},\n                                                    VULKAN_HPP_NAMESPACE::Bool32     discardable_      = {},\n                                                    const void *                     pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , micromapSize{ micromapSize_ }\n      , buildScratchSize{ buildScratchSize_ }\n      , discardable{ discardable_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MicromapBuildSizesInfoEXT( MicromapBuildSizesInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MicromapBuildSizesInfoEXT( VkMicromapBuildSizesInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MicromapBuildSizesInfoEXT( *reinterpret_cast<MicromapBuildSizesInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    MicromapBuildSizesInfoEXT & operator=( MicromapBuildSizesInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MicromapBuildSizesInfoEXT & operator=( VkMicromapBuildSizesInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MicromapBuildSizesInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MicromapBuildSizesInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapBuildSizesInfoEXT & setMicromapSize( VULKAN_HPP_NAMESPACE::DeviceSize micromapSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      micromapSize = micromapSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapBuildSizesInfoEXT & setBuildScratchSize( VULKAN_HPP_NAMESPACE::DeviceSize buildScratchSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      buildScratchSize = buildScratchSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapBuildSizesInfoEXT & setDiscardable( VULKAN_HPP_NAMESPACE::Bool32 discardable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      discardable = discardable_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMicromapBuildSizesInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMicromapBuildSizesInfoEXT *>( this );\n    }\n\n    operator VkMicromapBuildSizesInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMicromapBuildSizesInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, micromapSize, buildScratchSize, discardable );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MicromapBuildSizesInfoEXT const & ) const = default;\n#else\n    bool operator==( MicromapBuildSizesInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( micromapSize == rhs.micromapSize ) && ( buildScratchSize == rhs.buildScratchSize ) &&\n             ( discardable == rhs.discardable );\n#  endif\n    }\n\n    bool operator!=( MicromapBuildSizesInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType            = StructureType::eMicromapBuildSizesInfoEXT;\n    const void *                        pNext            = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    micromapSize     = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    buildScratchSize = {};\n    VULKAN_HPP_NAMESPACE::Bool32        discardable      = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMicromapBuildSizesInfoEXT>\n  {\n    using Type = MicromapBuildSizesInfoEXT;\n  };\n\n  struct MicromapCreateInfoEXT\n  {\n    using NativeType = VkMicromapCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMicromapCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MicromapCreateInfoEXT( VULKAN_HPP_NAMESPACE::MicromapCreateFlagsEXT createFlags_ = {},\n                                                VULKAN_HPP_NAMESPACE::Buffer                 buffer_      = {},\n                                                VULKAN_HPP_NAMESPACE::DeviceSize             offset_      = {},\n                                                VULKAN_HPP_NAMESPACE::DeviceSize             size_        = {},\n                                                VULKAN_HPP_NAMESPACE::MicromapTypeEXT        type_ = VULKAN_HPP_NAMESPACE::MicromapTypeEXT::eOpacityMicromap,\n                                                VULKAN_HPP_NAMESPACE::DeviceAddress          deviceAddress_ = {},\n                                                const void *                                 pNext_         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , createFlags{ createFlags_ }\n      , buffer{ buffer_ }\n      , offset{ offset_ }\n      , size{ size_ }\n      , type{ type_ }\n      , deviceAddress{ deviceAddress_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MicromapCreateInfoEXT( MicromapCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MicromapCreateInfoEXT( VkMicromapCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MicromapCreateInfoEXT( *reinterpret_cast<MicromapCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    MicromapCreateInfoEXT & operator=( MicromapCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MicromapCreateInfoEXT & operator=( VkMicromapCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MicromapCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MicromapCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapCreateInfoEXT & setCreateFlags( VULKAN_HPP_NAMESPACE::MicromapCreateFlagsEXT createFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      createFlags = createFlags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapCreateInfoEXT & setBuffer( VULKAN_HPP_NAMESPACE::Buffer buffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      buffer = buffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapCreateInfoEXT & setOffset( VULKAN_HPP_NAMESPACE::DeviceSize offset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      offset = offset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapCreateInfoEXT & setSize( VULKAN_HPP_NAMESPACE::DeviceSize size_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size = size_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapCreateInfoEXT & setType( VULKAN_HPP_NAMESPACE::MicromapTypeEXT type_ ) VULKAN_HPP_NOEXCEPT\n    {\n      type = type_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapCreateInfoEXT & setDeviceAddress( VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceAddress = deviceAddress_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMicromapCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMicromapCreateInfoEXT *>( this );\n    }\n\n    operator VkMicromapCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMicromapCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::MicromapCreateFlagsEXT const &,\n               VULKAN_HPP_NAMESPACE::Buffer const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::MicromapTypeEXT const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, createFlags, buffer, offset, size, type, deviceAddress );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MicromapCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( MicromapCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( createFlags == rhs.createFlags ) && ( buffer == rhs.buffer ) && ( offset == rhs.offset ) &&\n             ( size == rhs.size ) && ( type == rhs.type ) && ( deviceAddress == rhs.deviceAddress );\n#  endif\n    }\n\n    bool operator!=( MicromapCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType         = StructureType::eMicromapCreateInfoEXT;\n    const void *                                 pNext         = {};\n    VULKAN_HPP_NAMESPACE::MicromapCreateFlagsEXT createFlags   = {};\n    VULKAN_HPP_NAMESPACE::Buffer                 buffer        = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize             offset        = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize             size          = {};\n    VULKAN_HPP_NAMESPACE::MicromapTypeEXT        type          = VULKAN_HPP_NAMESPACE::MicromapTypeEXT::eOpacityMicromap;\n    VULKAN_HPP_NAMESPACE::DeviceAddress          deviceAddress = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMicromapCreateInfoEXT>\n  {\n    using Type = MicromapCreateInfoEXT;\n  };\n\n  struct MicromapTriangleEXT\n  {\n    using NativeType = VkMicromapTriangleEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MicromapTriangleEXT( uint32_t dataOffset_ = {}, uint16_t subdivisionLevel_ = {}, uint16_t format_ = {} ) VULKAN_HPP_NOEXCEPT\n      : dataOffset{ dataOffset_ }\n      , subdivisionLevel{ subdivisionLevel_ }\n      , format{ format_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MicromapTriangleEXT( MicromapTriangleEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MicromapTriangleEXT( VkMicromapTriangleEXT const & rhs ) VULKAN_HPP_NOEXCEPT : MicromapTriangleEXT( *reinterpret_cast<MicromapTriangleEXT const *>( &rhs ) )\n    {\n    }\n\n    MicromapTriangleEXT & operator=( MicromapTriangleEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MicromapTriangleEXT & operator=( VkMicromapTriangleEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MicromapTriangleEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MicromapTriangleEXT & setDataOffset( uint32_t dataOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dataOffset = dataOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapTriangleEXT & setSubdivisionLevel( uint16_t subdivisionLevel_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subdivisionLevel = subdivisionLevel_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapTriangleEXT & setFormat( uint16_t format_ ) VULKAN_HPP_NOEXCEPT\n    {\n      format = format_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMicromapTriangleEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMicromapTriangleEXT *>( this );\n    }\n\n    operator VkMicromapTriangleEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMicromapTriangleEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint16_t const &, uint16_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( dataOffset, subdivisionLevel, format );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MicromapTriangleEXT const & ) const = default;\n#else\n    bool operator==( MicromapTriangleEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( dataOffset == rhs.dataOffset ) && ( subdivisionLevel == rhs.subdivisionLevel ) && ( format == rhs.format );\n#  endif\n    }\n\n    bool operator!=( MicromapTriangleEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t dataOffset       = {};\n    uint16_t subdivisionLevel = {};\n    uint16_t format           = {};\n  };\n\n  struct MicromapVersionInfoEXT\n  {\n    using NativeType = VkMicromapVersionInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMicromapVersionInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MicromapVersionInfoEXT( const uint8_t * pVersionData_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pVersionData{ pVersionData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MicromapVersionInfoEXT( MicromapVersionInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MicromapVersionInfoEXT( VkMicromapVersionInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MicromapVersionInfoEXT( *reinterpret_cast<MicromapVersionInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    MicromapVersionInfoEXT & operator=( MicromapVersionInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MicromapVersionInfoEXT & operator=( VkMicromapVersionInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MicromapVersionInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MicromapVersionInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MicromapVersionInfoEXT & setPVersionData( const uint8_t * pVersionData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pVersionData = pVersionData_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMicromapVersionInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMicromapVersionInfoEXT *>( this );\n    }\n\n    operator VkMicromapVersionInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMicromapVersionInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, const uint8_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pVersionData );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MicromapVersionInfoEXT const & ) const = default;\n#else\n    bool operator==( MicromapVersionInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pVersionData == rhs.pVersionData );\n#  endif\n    }\n\n    bool operator!=( MicromapVersionInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType        = StructureType::eMicromapVersionInfoEXT;\n    const void *                        pNext        = {};\n    const uint8_t *                     pVersionData = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMicromapVersionInfoEXT>\n  {\n    using Type = MicromapVersionInfoEXT;\n  };\n\n  struct MultiDrawIndexedInfoEXT\n  {\n    using NativeType = VkMultiDrawIndexedInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MultiDrawIndexedInfoEXT( uint32_t firstIndex_ = {}, uint32_t indexCount_ = {}, int32_t vertexOffset_ = {} ) VULKAN_HPP_NOEXCEPT\n      : firstIndex{ firstIndex_ }\n      , indexCount{ indexCount_ }\n      , vertexOffset{ vertexOffset_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MultiDrawIndexedInfoEXT( MultiDrawIndexedInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MultiDrawIndexedInfoEXT( VkMultiDrawIndexedInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MultiDrawIndexedInfoEXT( *reinterpret_cast<MultiDrawIndexedInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    MultiDrawIndexedInfoEXT & operator=( MultiDrawIndexedInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MultiDrawIndexedInfoEXT & operator=( VkMultiDrawIndexedInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MultiDrawIndexedInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MultiDrawIndexedInfoEXT & setFirstIndex( uint32_t firstIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      firstIndex = firstIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MultiDrawIndexedInfoEXT & setIndexCount( uint32_t indexCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexCount = indexCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MultiDrawIndexedInfoEXT & setVertexOffset( int32_t vertexOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexOffset = vertexOffset_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMultiDrawIndexedInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMultiDrawIndexedInfoEXT *>( this );\n    }\n\n    operator VkMultiDrawIndexedInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMultiDrawIndexedInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &, int32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( firstIndex, indexCount, vertexOffset );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MultiDrawIndexedInfoEXT const & ) const = default;\n#else\n    bool operator==( MultiDrawIndexedInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( firstIndex == rhs.firstIndex ) && ( indexCount == rhs.indexCount ) && ( vertexOffset == rhs.vertexOffset );\n#  endif\n    }\n\n    bool operator!=( MultiDrawIndexedInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t firstIndex   = {};\n    uint32_t indexCount   = {};\n    int32_t  vertexOffset = {};\n  };\n\n  struct MultiDrawInfoEXT\n  {\n    using NativeType = VkMultiDrawInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MultiDrawInfoEXT( uint32_t firstVertex_ = {}, uint32_t vertexCount_ = {} ) VULKAN_HPP_NOEXCEPT\n      : firstVertex{ firstVertex_ }\n      , vertexCount{ vertexCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MultiDrawInfoEXT( MultiDrawInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MultiDrawInfoEXT( VkMultiDrawInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT : MultiDrawInfoEXT( *reinterpret_cast<MultiDrawInfoEXT const *>( &rhs ) ) {}\n\n    MultiDrawInfoEXT & operator=( MultiDrawInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MultiDrawInfoEXT & operator=( VkMultiDrawInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MultiDrawInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MultiDrawInfoEXT & setFirstVertex( uint32_t firstVertex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      firstVertex = firstVertex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MultiDrawInfoEXT & setVertexCount( uint32_t vertexCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexCount = vertexCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMultiDrawInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMultiDrawInfoEXT *>( this );\n    }\n\n    operator VkMultiDrawInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMultiDrawInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( firstVertex, vertexCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MultiDrawInfoEXT const & ) const = default;\n#else\n    bool operator==( MultiDrawInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( firstVertex == rhs.firstVertex ) && ( vertexCount == rhs.vertexCount );\n#  endif\n    }\n\n    bool operator!=( MultiDrawInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t firstVertex = {};\n    uint32_t vertexCount = {};\n  };\n\n  struct MultisamplePropertiesEXT\n  {\n    using NativeType = VkMultisamplePropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMultisamplePropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MultisamplePropertiesEXT( VULKAN_HPP_NAMESPACE::Extent2D maxSampleLocationGridSize_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxSampleLocationGridSize{ maxSampleLocationGridSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MultisamplePropertiesEXT( MultisamplePropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MultisamplePropertiesEXT( VkMultisamplePropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MultisamplePropertiesEXT( *reinterpret_cast<MultisamplePropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    MultisamplePropertiesEXT & operator=( MultisamplePropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MultisamplePropertiesEXT & operator=( VkMultisamplePropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MultisamplePropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkMultisamplePropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMultisamplePropertiesEXT *>( this );\n    }\n\n    operator VkMultisamplePropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMultisamplePropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Extent2D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxSampleLocationGridSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MultisamplePropertiesEXT const & ) const = default;\n#else\n    bool operator==( MultisamplePropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxSampleLocationGridSize == rhs.maxSampleLocationGridSize );\n#  endif\n    }\n\n    bool operator!=( MultisamplePropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                     = StructureType::eMultisamplePropertiesEXT;\n    void *                              pNext                     = {};\n    VULKAN_HPP_NAMESPACE::Extent2D      maxSampleLocationGridSize = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMultisamplePropertiesEXT>\n  {\n    using Type = MultisamplePropertiesEXT;\n  };\n\n  struct MultisampledRenderToSingleSampledInfoEXT\n  {\n    using NativeType = VkMultisampledRenderToSingleSampledInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMultisampledRenderToSingleSampledInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      MultisampledRenderToSingleSampledInfoEXT( VULKAN_HPP_NAMESPACE::Bool32              multisampledRenderToSingleSampledEnable_ = {},\n                                                VULKAN_HPP_NAMESPACE::SampleCountFlagBits rasterizationSamples_ = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1,\n                                                const void *                              pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , multisampledRenderToSingleSampledEnable{ multisampledRenderToSingleSampledEnable_ }\n      , rasterizationSamples{ rasterizationSamples_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MultisampledRenderToSingleSampledInfoEXT( MultisampledRenderToSingleSampledInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MultisampledRenderToSingleSampledInfoEXT( VkMultisampledRenderToSingleSampledInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MultisampledRenderToSingleSampledInfoEXT( *reinterpret_cast<MultisampledRenderToSingleSampledInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    MultisampledRenderToSingleSampledInfoEXT & operator=( MultisampledRenderToSingleSampledInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MultisampledRenderToSingleSampledInfoEXT & operator=( VkMultisampledRenderToSingleSampledInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MultisampledRenderToSingleSampledInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MultisampledRenderToSingleSampledInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MultisampledRenderToSingleSampledInfoEXT &\n      setMultisampledRenderToSingleSampledEnable( VULKAN_HPP_NAMESPACE::Bool32 multisampledRenderToSingleSampledEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      multisampledRenderToSingleSampledEnable = multisampledRenderToSingleSampledEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MultisampledRenderToSingleSampledInfoEXT &\n      setRasterizationSamples( VULKAN_HPP_NAMESPACE::SampleCountFlagBits rasterizationSamples_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rasterizationSamples = rasterizationSamples_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMultisampledRenderToSingleSampledInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMultisampledRenderToSingleSampledInfoEXT *>( this );\n    }\n\n    operator VkMultisampledRenderToSingleSampledInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMultisampledRenderToSingleSampledInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlagBits const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, multisampledRenderToSingleSampledEnable, rasterizationSamples );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MultisampledRenderToSingleSampledInfoEXT const & ) const = default;\n#else\n    bool operator==( MultisampledRenderToSingleSampledInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( multisampledRenderToSingleSampledEnable == rhs.multisampledRenderToSingleSampledEnable ) &&\n             ( rasterizationSamples == rhs.rasterizationSamples );\n#  endif\n    }\n\n    bool operator!=( MultisampledRenderToSingleSampledInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType                                   = StructureType::eMultisampledRenderToSingleSampledInfoEXT;\n    const void *                              pNext                                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32              multisampledRenderToSingleSampledEnable = {};\n    VULKAN_HPP_NAMESPACE::SampleCountFlagBits rasterizationSamples                    = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMultisampledRenderToSingleSampledInfoEXT>\n  {\n    using Type = MultisampledRenderToSingleSampledInfoEXT;\n  };\n\n  struct MultiviewPerViewAttributesInfoNVX\n  {\n    using NativeType = VkMultiviewPerViewAttributesInfoNVX;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMultiviewPerViewAttributesInfoNVX;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MultiviewPerViewAttributesInfoNVX( VULKAN_HPP_NAMESPACE::Bool32 perViewAttributes_              = {},\n                                                            VULKAN_HPP_NAMESPACE::Bool32 perViewAttributesPositionXOnly_ = {},\n                                                            const void *                 pNext_                          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , perViewAttributes{ perViewAttributes_ }\n      , perViewAttributesPositionXOnly{ perViewAttributesPositionXOnly_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MultiviewPerViewAttributesInfoNVX( MultiviewPerViewAttributesInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MultiviewPerViewAttributesInfoNVX( VkMultiviewPerViewAttributesInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MultiviewPerViewAttributesInfoNVX( *reinterpret_cast<MultiviewPerViewAttributesInfoNVX const *>( &rhs ) )\n    {\n    }\n\n    MultiviewPerViewAttributesInfoNVX & operator=( MultiviewPerViewAttributesInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MultiviewPerViewAttributesInfoNVX & operator=( VkMultiviewPerViewAttributesInfoNVX const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MultiviewPerViewAttributesInfoNVX const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MultiviewPerViewAttributesInfoNVX & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MultiviewPerViewAttributesInfoNVX & setPerViewAttributes( VULKAN_HPP_NAMESPACE::Bool32 perViewAttributes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      perViewAttributes = perViewAttributes_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MultiviewPerViewAttributesInfoNVX &\n      setPerViewAttributesPositionXOnly( VULKAN_HPP_NAMESPACE::Bool32 perViewAttributesPositionXOnly_ ) VULKAN_HPP_NOEXCEPT\n    {\n      perViewAttributesPositionXOnly = perViewAttributesPositionXOnly_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMultiviewPerViewAttributesInfoNVX const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMultiviewPerViewAttributesInfoNVX *>( this );\n    }\n\n    operator VkMultiviewPerViewAttributesInfoNVX &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMultiviewPerViewAttributesInfoNVX *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, perViewAttributes, perViewAttributesPositionXOnly );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MultiviewPerViewAttributesInfoNVX const & ) const = default;\n#else\n    bool operator==( MultiviewPerViewAttributesInfoNVX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( perViewAttributes == rhs.perViewAttributes ) &&\n             ( perViewAttributesPositionXOnly == rhs.perViewAttributesPositionXOnly );\n#  endif\n    }\n\n    bool operator!=( MultiviewPerViewAttributesInfoNVX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                          = StructureType::eMultiviewPerViewAttributesInfoNVX;\n    const void *                        pNext                          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        perViewAttributes              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        perViewAttributesPositionXOnly = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMultiviewPerViewAttributesInfoNVX>\n  {\n    using Type = MultiviewPerViewAttributesInfoNVX;\n  };\n\n  struct MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM\n  {\n    using NativeType = VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM( uint32_t                             perViewRenderAreaCount_ = {},\n                                                                             const VULKAN_HPP_NAMESPACE::Rect2D * pPerViewRenderAreas_    = {},\n                                                                             const void *                         pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , perViewRenderAreaCount{ perViewRenderAreaCount_ }\n      , pPerViewRenderAreas{ pPerViewRenderAreas_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM( MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM( VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM( *reinterpret_cast<MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Rect2D> const & perViewRenderAreas_, const void * pNext_ = nullptr )\n      : pNext( pNext_ ), perViewRenderAreaCount( static_cast<uint32_t>( perViewRenderAreas_.size() ) ), pPerViewRenderAreas( perViewRenderAreas_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM &\n      operator=( MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM & operator=( VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM &\n      setPerViewRenderAreaCount( uint32_t perViewRenderAreaCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      perViewRenderAreaCount = perViewRenderAreaCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM &\n      setPPerViewRenderAreas( const VULKAN_HPP_NAMESPACE::Rect2D * pPerViewRenderAreas_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPerViewRenderAreas = pPerViewRenderAreas_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM &\n      setPerViewRenderAreas( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Rect2D> const & perViewRenderAreas_ ) VULKAN_HPP_NOEXCEPT\n    {\n      perViewRenderAreaCount = static_cast<uint32_t>( perViewRenderAreas_.size() );\n      pPerViewRenderAreas    = perViewRenderAreas_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM *>( this );\n    }\n\n    operator VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::Rect2D * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, perViewRenderAreaCount, pPerViewRenderAreas );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM const & ) const = default;\n#else\n    bool operator==( MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( perViewRenderAreaCount == rhs.perViewRenderAreaCount ) &&\n             ( pPerViewRenderAreas == rhs.pPerViewRenderAreas );\n#  endif\n    }\n\n    bool operator!=( MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType  sType                  = StructureType::eMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM;\n    const void *                         pNext                  = {};\n    uint32_t                             perViewRenderAreaCount = {};\n    const VULKAN_HPP_NAMESPACE::Rect2D * pPerViewRenderAreas    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM>\n  {\n    using Type = MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM;\n  };\n\n  struct MutableDescriptorTypeListEXT\n  {\n    using NativeType = VkMutableDescriptorTypeListEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MutableDescriptorTypeListEXT( uint32_t                                     descriptorTypeCount_ = {},\n                                                       const VULKAN_HPP_NAMESPACE::DescriptorType * pDescriptorTypes_    = {} ) VULKAN_HPP_NOEXCEPT\n      : descriptorTypeCount{ descriptorTypeCount_ }\n      , pDescriptorTypes{ pDescriptorTypes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MutableDescriptorTypeListEXT( MutableDescriptorTypeListEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MutableDescriptorTypeListEXT( VkMutableDescriptorTypeListEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MutableDescriptorTypeListEXT( *reinterpret_cast<MutableDescriptorTypeListEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    MutableDescriptorTypeListEXT( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorType> const & descriptorTypes_ )\n      : descriptorTypeCount( static_cast<uint32_t>( descriptorTypes_.size() ) ), pDescriptorTypes( descriptorTypes_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    MutableDescriptorTypeListEXT & operator=( MutableDescriptorTypeListEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MutableDescriptorTypeListEXT & operator=( VkMutableDescriptorTypeListEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MutableDescriptorTypeListEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MutableDescriptorTypeListEXT & setDescriptorTypeCount( uint32_t descriptorTypeCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorTypeCount = descriptorTypeCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MutableDescriptorTypeListEXT &\n      setPDescriptorTypes( const VULKAN_HPP_NAMESPACE::DescriptorType * pDescriptorTypes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDescriptorTypes = pDescriptorTypes_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    MutableDescriptorTypeListEXT & setDescriptorTypes(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorType> const & descriptorTypes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorTypeCount = static_cast<uint32_t>( descriptorTypes_.size() );\n      pDescriptorTypes    = descriptorTypes_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMutableDescriptorTypeListEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMutableDescriptorTypeListEXT *>( this );\n    }\n\n    operator VkMutableDescriptorTypeListEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMutableDescriptorTypeListEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, const VULKAN_HPP_NAMESPACE::DescriptorType * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( descriptorTypeCount, pDescriptorTypes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MutableDescriptorTypeListEXT const & ) const = default;\n#else\n    bool operator==( MutableDescriptorTypeListEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( descriptorTypeCount == rhs.descriptorTypeCount ) && ( pDescriptorTypes == rhs.pDescriptorTypes );\n#  endif\n    }\n\n    bool operator!=( MutableDescriptorTypeListEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                                     descriptorTypeCount = {};\n    const VULKAN_HPP_NAMESPACE::DescriptorType * pDescriptorTypes    = {};\n  };\n\n  using MutableDescriptorTypeListVALVE = MutableDescriptorTypeListEXT;\n\n  struct MutableDescriptorTypeCreateInfoEXT\n  {\n    using NativeType = VkMutableDescriptorTypeCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eMutableDescriptorTypeCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR MutableDescriptorTypeCreateInfoEXT( uint32_t                                                   mutableDescriptorTypeListCount_ = {},\n                                                             const VULKAN_HPP_NAMESPACE::MutableDescriptorTypeListEXT * pMutableDescriptorTypeLists_    = {},\n                                                             const void *                                               pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , mutableDescriptorTypeListCount{ mutableDescriptorTypeListCount_ }\n      , pMutableDescriptorTypeLists{ pMutableDescriptorTypeLists_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR MutableDescriptorTypeCreateInfoEXT( MutableDescriptorTypeCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    MutableDescriptorTypeCreateInfoEXT( VkMutableDescriptorTypeCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : MutableDescriptorTypeCreateInfoEXT( *reinterpret_cast<MutableDescriptorTypeCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    MutableDescriptorTypeCreateInfoEXT(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::MutableDescriptorTypeListEXT> const & mutableDescriptorTypeLists_,\n      const void *                                                                                                    pNext_ = nullptr )\n      : pNext( pNext_ )\n      , mutableDescriptorTypeListCount( static_cast<uint32_t>( mutableDescriptorTypeLists_.size() ) )\n      , pMutableDescriptorTypeLists( mutableDescriptorTypeLists_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    MutableDescriptorTypeCreateInfoEXT & operator=( MutableDescriptorTypeCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    MutableDescriptorTypeCreateInfoEXT & operator=( VkMutableDescriptorTypeCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::MutableDescriptorTypeCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 MutableDescriptorTypeCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MutableDescriptorTypeCreateInfoEXT &\n      setMutableDescriptorTypeListCount( uint32_t mutableDescriptorTypeListCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mutableDescriptorTypeListCount = mutableDescriptorTypeListCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 MutableDescriptorTypeCreateInfoEXT &\n      setPMutableDescriptorTypeLists( const VULKAN_HPP_NAMESPACE::MutableDescriptorTypeListEXT * pMutableDescriptorTypeLists_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pMutableDescriptorTypeLists = pMutableDescriptorTypeLists_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    MutableDescriptorTypeCreateInfoEXT & setMutableDescriptorTypeLists(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::MutableDescriptorTypeListEXT> const & mutableDescriptorTypeLists_ )\n      VULKAN_HPP_NOEXCEPT\n    {\n      mutableDescriptorTypeListCount = static_cast<uint32_t>( mutableDescriptorTypeLists_.size() );\n      pMutableDescriptorTypeLists    = mutableDescriptorTypeLists_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkMutableDescriptorTypeCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkMutableDescriptorTypeCreateInfoEXT *>( this );\n    }\n\n    operator VkMutableDescriptorTypeCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkMutableDescriptorTypeCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::MutableDescriptorTypeListEXT * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, mutableDescriptorTypeListCount, pMutableDescriptorTypeLists );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( MutableDescriptorTypeCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( MutableDescriptorTypeCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( mutableDescriptorTypeListCount == rhs.mutableDescriptorTypeListCount ) &&\n             ( pMutableDescriptorTypeLists == rhs.pMutableDescriptorTypeLists );\n#  endif\n    }\n\n    bool operator!=( MutableDescriptorTypeCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                        sType                          = StructureType::eMutableDescriptorTypeCreateInfoEXT;\n    const void *                                               pNext                          = {};\n    uint32_t                                                   mutableDescriptorTypeListCount = {};\n    const VULKAN_HPP_NAMESPACE::MutableDescriptorTypeListEXT * pMutableDescriptorTypeLists    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eMutableDescriptorTypeCreateInfoEXT>\n  {\n    using Type = MutableDescriptorTypeCreateInfoEXT;\n  };\n\n  using MutableDescriptorTypeCreateInfoVALVE = MutableDescriptorTypeCreateInfoEXT;\n\n  struct OpaqueCaptureDescriptorDataCreateInfoEXT\n  {\n    using NativeType = VkOpaqueCaptureDescriptorDataCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eOpaqueCaptureDescriptorDataCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR OpaqueCaptureDescriptorDataCreateInfoEXT( const void * opaqueCaptureDescriptorData_ = {},\n                                                                   const void * pNext_                       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , opaqueCaptureDescriptorData{ opaqueCaptureDescriptorData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR OpaqueCaptureDescriptorDataCreateInfoEXT( OpaqueCaptureDescriptorDataCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    OpaqueCaptureDescriptorDataCreateInfoEXT( VkOpaqueCaptureDescriptorDataCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : OpaqueCaptureDescriptorDataCreateInfoEXT( *reinterpret_cast<OpaqueCaptureDescriptorDataCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    OpaqueCaptureDescriptorDataCreateInfoEXT & operator=( OpaqueCaptureDescriptorDataCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    OpaqueCaptureDescriptorDataCreateInfoEXT & operator=( VkOpaqueCaptureDescriptorDataCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::OpaqueCaptureDescriptorDataCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 OpaqueCaptureDescriptorDataCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 OpaqueCaptureDescriptorDataCreateInfoEXT &\n      setOpaqueCaptureDescriptorData( const void * opaqueCaptureDescriptorData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      opaqueCaptureDescriptorData = opaqueCaptureDescriptorData_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkOpaqueCaptureDescriptorDataCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkOpaqueCaptureDescriptorDataCreateInfoEXT *>( this );\n    }\n\n    operator VkOpaqueCaptureDescriptorDataCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkOpaqueCaptureDescriptorDataCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, const void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, opaqueCaptureDescriptorData );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( OpaqueCaptureDescriptorDataCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( OpaqueCaptureDescriptorDataCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( opaqueCaptureDescriptorData == rhs.opaqueCaptureDescriptorData );\n#  endif\n    }\n\n    bool operator!=( OpaqueCaptureDescriptorDataCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                       = StructureType::eOpaqueCaptureDescriptorDataCreateInfoEXT;\n    const void *                        pNext                       = {};\n    const void *                        opaqueCaptureDescriptorData = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eOpaqueCaptureDescriptorDataCreateInfoEXT>\n  {\n    using Type = OpaqueCaptureDescriptorDataCreateInfoEXT;\n  };\n\n  struct OpticalFlowExecuteInfoNV\n  {\n    using NativeType = VkOpticalFlowExecuteInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eOpticalFlowExecuteInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR OpticalFlowExecuteInfoNV( VULKAN_HPP_NAMESPACE::OpticalFlowExecuteFlagsNV flags_       = {},\n                                                   uint32_t                                        regionCount_ = {},\n                                                   const VULKAN_HPP_NAMESPACE::Rect2D *            pRegions_    = {},\n                                                   void *                                          pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , regionCount{ regionCount_ }\n      , pRegions{ pRegions_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR OpticalFlowExecuteInfoNV( OpticalFlowExecuteInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    OpticalFlowExecuteInfoNV( VkOpticalFlowExecuteInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : OpticalFlowExecuteInfoNV( *reinterpret_cast<OpticalFlowExecuteInfoNV const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    OpticalFlowExecuteInfoNV( VULKAN_HPP_NAMESPACE::OpticalFlowExecuteFlagsNV                                           flags_,\n                              VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Rect2D> const & regions_,\n                              void *                                                                                    pNext_ = nullptr )\n      : pNext( pNext_ ), flags( flags_ ), regionCount( static_cast<uint32_t>( regions_.size() ) ), pRegions( regions_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    OpticalFlowExecuteInfoNV & operator=( OpticalFlowExecuteInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    OpticalFlowExecuteInfoNV & operator=( VkOpticalFlowExecuteInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::OpticalFlowExecuteInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 OpticalFlowExecuteInfoNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 OpticalFlowExecuteInfoNV & setFlags( VULKAN_HPP_NAMESPACE::OpticalFlowExecuteFlagsNV flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 OpticalFlowExecuteInfoNV & setRegionCount( uint32_t regionCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      regionCount = regionCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 OpticalFlowExecuteInfoNV & setPRegions( const VULKAN_HPP_NAMESPACE::Rect2D * pRegions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pRegions = pRegions_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    OpticalFlowExecuteInfoNV &\n      setRegions( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Rect2D> const & regions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      regionCount = static_cast<uint32_t>( regions_.size() );\n      pRegions    = regions_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkOpticalFlowExecuteInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkOpticalFlowExecuteInfoNV *>( this );\n    }\n\n    operator VkOpticalFlowExecuteInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkOpticalFlowExecuteInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::OpticalFlowExecuteFlagsNV const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::Rect2D * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, regionCount, pRegions );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( OpticalFlowExecuteInfoNV const & ) const = default;\n#else\n    bool operator==( OpticalFlowExecuteInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( regionCount == rhs.regionCount ) && ( pRegions == rhs.pRegions );\n#  endif\n    }\n\n    bool operator!=( OpticalFlowExecuteInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType             sType       = StructureType::eOpticalFlowExecuteInfoNV;\n    void *                                          pNext       = {};\n    VULKAN_HPP_NAMESPACE::OpticalFlowExecuteFlagsNV flags       = {};\n    uint32_t                                        regionCount = {};\n    const VULKAN_HPP_NAMESPACE::Rect2D *            pRegions    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eOpticalFlowExecuteInfoNV>\n  {\n    using Type = OpticalFlowExecuteInfoNV;\n  };\n\n  struct OpticalFlowImageFormatInfoNV\n  {\n    using NativeType = VkOpticalFlowImageFormatInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eOpticalFlowImageFormatInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR OpticalFlowImageFormatInfoNV( VULKAN_HPP_NAMESPACE::OpticalFlowUsageFlagsNV usage_ = {},\n                                                       const void *                                  pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , usage{ usage_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR OpticalFlowImageFormatInfoNV( OpticalFlowImageFormatInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    OpticalFlowImageFormatInfoNV( VkOpticalFlowImageFormatInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : OpticalFlowImageFormatInfoNV( *reinterpret_cast<OpticalFlowImageFormatInfoNV const *>( &rhs ) )\n    {\n    }\n\n    OpticalFlowImageFormatInfoNV & operator=( OpticalFlowImageFormatInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    OpticalFlowImageFormatInfoNV & operator=( VkOpticalFlowImageFormatInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 OpticalFlowImageFormatInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 OpticalFlowImageFormatInfoNV & setUsage( VULKAN_HPP_NAMESPACE::OpticalFlowUsageFlagsNV usage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      usage = usage_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkOpticalFlowImageFormatInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkOpticalFlowImageFormatInfoNV *>( this );\n    }\n\n    operator VkOpticalFlowImageFormatInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkOpticalFlowImageFormatInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::OpticalFlowUsageFlagsNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, usage );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( OpticalFlowImageFormatInfoNV const & ) const = default;\n#else\n    bool operator==( OpticalFlowImageFormatInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( usage == rhs.usage );\n#  endif\n    }\n\n    bool operator!=( OpticalFlowImageFormatInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType           sType = StructureType::eOpticalFlowImageFormatInfoNV;\n    const void *                                  pNext = {};\n    VULKAN_HPP_NAMESPACE::OpticalFlowUsageFlagsNV usage = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eOpticalFlowImageFormatInfoNV>\n  {\n    using Type = OpticalFlowImageFormatInfoNV;\n  };\n\n  struct OpticalFlowImageFormatPropertiesNV\n  {\n    using NativeType = VkOpticalFlowImageFormatPropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eOpticalFlowImageFormatPropertiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR OpticalFlowImageFormatPropertiesNV( VULKAN_HPP_NAMESPACE::Format format_ = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                                             const void *                 pNext_  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , format{ format_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR OpticalFlowImageFormatPropertiesNV( OpticalFlowImageFormatPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    OpticalFlowImageFormatPropertiesNV( VkOpticalFlowImageFormatPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : OpticalFlowImageFormatPropertiesNV( *reinterpret_cast<OpticalFlowImageFormatPropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    OpticalFlowImageFormatPropertiesNV & operator=( OpticalFlowImageFormatPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    OpticalFlowImageFormatPropertiesNV & operator=( VkOpticalFlowImageFormatPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::OpticalFlowImageFormatPropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkOpticalFlowImageFormatPropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkOpticalFlowImageFormatPropertiesNV *>( this );\n    }\n\n    operator VkOpticalFlowImageFormatPropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkOpticalFlowImageFormatPropertiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Format const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, format );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( OpticalFlowImageFormatPropertiesNV const & ) const = default;\n#else\n    bool operator==( OpticalFlowImageFormatPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( format == rhs.format );\n#  endif\n    }\n\n    bool operator!=( OpticalFlowImageFormatPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType  = StructureType::eOpticalFlowImageFormatPropertiesNV;\n    const void *                        pNext  = {};\n    VULKAN_HPP_NAMESPACE::Format        format = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eOpticalFlowImageFormatPropertiesNV>\n  {\n    using Type = OpticalFlowImageFormatPropertiesNV;\n  };\n\n  struct OpticalFlowSessionCreateInfoNV\n  {\n    using NativeType = VkOpticalFlowSessionCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eOpticalFlowSessionCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR OpticalFlowSessionCreateInfoNV(\n      uint32_t                                              width_            = {},\n      uint32_t                                              height_           = {},\n      VULKAN_HPP_NAMESPACE::Format                          imageFormat_      = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n      VULKAN_HPP_NAMESPACE::Format                          flowVectorFormat_ = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n      VULKAN_HPP_NAMESPACE::Format                          costFormat_       = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n      VULKAN_HPP_NAMESPACE::OpticalFlowGridSizeFlagsNV      outputGridSize_   = {},\n      VULKAN_HPP_NAMESPACE::OpticalFlowGridSizeFlagsNV      hintGridSize_     = {},\n      VULKAN_HPP_NAMESPACE::OpticalFlowPerformanceLevelNV   performanceLevel_ = VULKAN_HPP_NAMESPACE::OpticalFlowPerformanceLevelNV::eUnknown,\n      VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreateFlagsNV flags_            = {},\n      void *                                                pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , width{ width_ }\n      , height{ height_ }\n      , imageFormat{ imageFormat_ }\n      , flowVectorFormat{ flowVectorFormat_ }\n      , costFormat{ costFormat_ }\n      , outputGridSize{ outputGridSize_ }\n      , hintGridSize{ hintGridSize_ }\n      , performanceLevel{ performanceLevel_ }\n      , flags{ flags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR OpticalFlowSessionCreateInfoNV( OpticalFlowSessionCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    OpticalFlowSessionCreateInfoNV( VkOpticalFlowSessionCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : OpticalFlowSessionCreateInfoNV( *reinterpret_cast<OpticalFlowSessionCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n    OpticalFlowSessionCreateInfoNV & operator=( OpticalFlowSessionCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    OpticalFlowSessionCreateInfoNV & operator=( VkOpticalFlowSessionCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 OpticalFlowSessionCreateInfoNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 OpticalFlowSessionCreateInfoNV & setWidth( uint32_t width_ ) VULKAN_HPP_NOEXCEPT\n    {\n      width = width_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 OpticalFlowSessionCreateInfoNV & setHeight( uint32_t height_ ) VULKAN_HPP_NOEXCEPT\n    {\n      height = height_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 OpticalFlowSessionCreateInfoNV & setImageFormat( VULKAN_HPP_NAMESPACE::Format imageFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageFormat = imageFormat_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 OpticalFlowSessionCreateInfoNV & setFlowVectorFormat( VULKAN_HPP_NAMESPACE::Format flowVectorFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flowVectorFormat = flowVectorFormat_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 OpticalFlowSessionCreateInfoNV & setCostFormat( VULKAN_HPP_NAMESPACE::Format costFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      costFormat = costFormat_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 OpticalFlowSessionCreateInfoNV &\n      setOutputGridSize( VULKAN_HPP_NAMESPACE::OpticalFlowGridSizeFlagsNV outputGridSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      outputGridSize = outputGridSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 OpticalFlowSessionCreateInfoNV &\n      setHintGridSize( VULKAN_HPP_NAMESPACE::OpticalFlowGridSizeFlagsNV hintGridSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      hintGridSize = hintGridSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 OpticalFlowSessionCreateInfoNV &\n      setPerformanceLevel( VULKAN_HPP_NAMESPACE::OpticalFlowPerformanceLevelNV performanceLevel_ ) VULKAN_HPP_NOEXCEPT\n    {\n      performanceLevel = performanceLevel_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 OpticalFlowSessionCreateInfoNV & setFlags( VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreateFlagsNV flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkOpticalFlowSessionCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkOpticalFlowSessionCreateInfoNV *>( this );\n    }\n\n    operator VkOpticalFlowSessionCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkOpticalFlowSessionCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::OpticalFlowGridSizeFlagsNV const &,\n               VULKAN_HPP_NAMESPACE::OpticalFlowGridSizeFlagsNV const &,\n               VULKAN_HPP_NAMESPACE::OpticalFlowPerformanceLevelNV const &,\n               VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreateFlagsNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, width, height, imageFormat, flowVectorFormat, costFormat, outputGridSize, hintGridSize, performanceLevel, flags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( OpticalFlowSessionCreateInfoNV const & ) const = default;\n#else\n    bool operator==( OpticalFlowSessionCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( width == rhs.width ) && ( height == rhs.height ) && ( imageFormat == rhs.imageFormat ) &&\n             ( flowVectorFormat == rhs.flowVectorFormat ) && ( costFormat == rhs.costFormat ) && ( outputGridSize == rhs.outputGridSize ) &&\n             ( hintGridSize == rhs.hintGridSize ) && ( performanceLevel == rhs.performanceLevel ) && ( flags == rhs.flags );\n#  endif\n    }\n\n    bool operator!=( OpticalFlowSessionCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                   sType            = StructureType::eOpticalFlowSessionCreateInfoNV;\n    void *                                                pNext            = {};\n    uint32_t                                              width            = {};\n    uint32_t                                              height           = {};\n    VULKAN_HPP_NAMESPACE::Format                          imageFormat      = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::Format                          flowVectorFormat = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::Format                          costFormat       = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::OpticalFlowGridSizeFlagsNV      outputGridSize   = {};\n    VULKAN_HPP_NAMESPACE::OpticalFlowGridSizeFlagsNV      hintGridSize     = {};\n    VULKAN_HPP_NAMESPACE::OpticalFlowPerformanceLevelNV   performanceLevel = VULKAN_HPP_NAMESPACE::OpticalFlowPerformanceLevelNV::eUnknown;\n    VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreateFlagsNV flags            = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eOpticalFlowSessionCreateInfoNV>\n  {\n    using Type = OpticalFlowSessionCreateInfoNV;\n  };\n\n  struct OpticalFlowSessionCreatePrivateDataInfoNV\n  {\n    using NativeType = VkOpticalFlowSessionCreatePrivateDataInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eOpticalFlowSessionCreatePrivateDataInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR OpticalFlowSessionCreatePrivateDataInfoNV( uint32_t     id_           = {},\n                                                                    uint32_t     size_         = {},\n                                                                    const void * pPrivateData_ = {},\n                                                                    void *       pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , id{ id_ }\n      , size{ size_ }\n      , pPrivateData{ pPrivateData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR OpticalFlowSessionCreatePrivateDataInfoNV( OpticalFlowSessionCreatePrivateDataInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    OpticalFlowSessionCreatePrivateDataInfoNV( VkOpticalFlowSessionCreatePrivateDataInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : OpticalFlowSessionCreatePrivateDataInfoNV( *reinterpret_cast<OpticalFlowSessionCreatePrivateDataInfoNV const *>( &rhs ) )\n    {\n    }\n\n    OpticalFlowSessionCreatePrivateDataInfoNV & operator=( OpticalFlowSessionCreatePrivateDataInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    OpticalFlowSessionCreatePrivateDataInfoNV & operator=( VkOpticalFlowSessionCreatePrivateDataInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::OpticalFlowSessionCreatePrivateDataInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 OpticalFlowSessionCreatePrivateDataInfoNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 OpticalFlowSessionCreatePrivateDataInfoNV & setId( uint32_t id_ ) VULKAN_HPP_NOEXCEPT\n    {\n      id = id_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 OpticalFlowSessionCreatePrivateDataInfoNV & setSize( uint32_t size_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size = size_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 OpticalFlowSessionCreatePrivateDataInfoNV & setPPrivateData( const void * pPrivateData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPrivateData = pPrivateData_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkOpticalFlowSessionCreatePrivateDataInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkOpticalFlowSessionCreatePrivateDataInfoNV *>( this );\n    }\n\n    operator VkOpticalFlowSessionCreatePrivateDataInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkOpticalFlowSessionCreatePrivateDataInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &, uint32_t const &, const void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, id, size, pPrivateData );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( OpticalFlowSessionCreatePrivateDataInfoNV const & ) const = default;\n#else\n    bool operator==( OpticalFlowSessionCreatePrivateDataInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( id == rhs.id ) && ( size == rhs.size ) && ( pPrivateData == rhs.pPrivateData );\n#  endif\n    }\n\n    bool operator!=( OpticalFlowSessionCreatePrivateDataInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType        = StructureType::eOpticalFlowSessionCreatePrivateDataInfoNV;\n    void *                              pNext        = {};\n    uint32_t                            id           = {};\n    uint32_t                            size         = {};\n    const void *                        pPrivateData = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eOpticalFlowSessionCreatePrivateDataInfoNV>\n  {\n    using Type = OpticalFlowSessionCreatePrivateDataInfoNV;\n  };\n\n  struct OutOfBandQueueTypeInfoNV\n  {\n    using NativeType = VkOutOfBandQueueTypeInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eOutOfBandQueueTypeInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR OutOfBandQueueTypeInfoNV( VULKAN_HPP_NAMESPACE::OutOfBandQueueTypeNV queueType_ = VULKAN_HPP_NAMESPACE::OutOfBandQueueTypeNV::eRender,\n                                                   const void *                               pNext_     = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , queueType{ queueType_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR OutOfBandQueueTypeInfoNV( OutOfBandQueueTypeInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    OutOfBandQueueTypeInfoNV( VkOutOfBandQueueTypeInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : OutOfBandQueueTypeInfoNV( *reinterpret_cast<OutOfBandQueueTypeInfoNV const *>( &rhs ) )\n    {\n    }\n\n    OutOfBandQueueTypeInfoNV & operator=( OutOfBandQueueTypeInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    OutOfBandQueueTypeInfoNV & operator=( VkOutOfBandQueueTypeInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::OutOfBandQueueTypeInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 OutOfBandQueueTypeInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 OutOfBandQueueTypeInfoNV & setQueueType( VULKAN_HPP_NAMESPACE::OutOfBandQueueTypeNV queueType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queueType = queueType_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkOutOfBandQueueTypeInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkOutOfBandQueueTypeInfoNV *>( this );\n    }\n\n    operator VkOutOfBandQueueTypeInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkOutOfBandQueueTypeInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::OutOfBandQueueTypeNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, queueType );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( OutOfBandQueueTypeInfoNV const & ) const = default;\n#else\n    bool operator==( OutOfBandQueueTypeInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( queueType == rhs.queueType );\n#  endif\n    }\n\n    bool operator!=( OutOfBandQueueTypeInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType        sType     = StructureType::eOutOfBandQueueTypeInfoNV;\n    const void *                               pNext     = {};\n    VULKAN_HPP_NAMESPACE::OutOfBandQueueTypeNV queueType = VULKAN_HPP_NAMESPACE::OutOfBandQueueTypeNV::eRender;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eOutOfBandQueueTypeInfoNV>\n  {\n    using Type = OutOfBandQueueTypeInfoNV;\n  };\n\n  struct PartitionedAccelerationStructureFlagsNV\n  {\n    using NativeType = VkPartitionedAccelerationStructureFlagsNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePartitionedAccelerationStructureFlagsNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PartitionedAccelerationStructureFlagsNV( VULKAN_HPP_NAMESPACE::Bool32 enablePartitionTranslation_ = {},\n                                                                  void *                       pNext_                      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , enablePartitionTranslation{ enablePartitionTranslation_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PartitionedAccelerationStructureFlagsNV( PartitionedAccelerationStructureFlagsNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PartitionedAccelerationStructureFlagsNV( VkPartitionedAccelerationStructureFlagsNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PartitionedAccelerationStructureFlagsNV( *reinterpret_cast<PartitionedAccelerationStructureFlagsNV const *>( &rhs ) )\n    {\n    }\n\n    PartitionedAccelerationStructureFlagsNV & operator=( PartitionedAccelerationStructureFlagsNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PartitionedAccelerationStructureFlagsNV & operator=( VkPartitionedAccelerationStructureFlagsNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureFlagsNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PartitionedAccelerationStructureFlagsNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PartitionedAccelerationStructureFlagsNV &\n      setEnablePartitionTranslation( VULKAN_HPP_NAMESPACE::Bool32 enablePartitionTranslation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      enablePartitionTranslation = enablePartitionTranslation_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPartitionedAccelerationStructureFlagsNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPartitionedAccelerationStructureFlagsNV *>( this );\n    }\n\n    operator VkPartitionedAccelerationStructureFlagsNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPartitionedAccelerationStructureFlagsNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, enablePartitionTranslation );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PartitionedAccelerationStructureFlagsNV const & ) const = default;\n#else\n    bool operator==( PartitionedAccelerationStructureFlagsNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( enablePartitionTranslation == rhs.enablePartitionTranslation );\n#  endif\n    }\n\n    bool operator!=( PartitionedAccelerationStructureFlagsNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                      = StructureType::ePartitionedAccelerationStructureFlagsNV;\n    void *                              pNext                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        enablePartitionTranslation = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePartitionedAccelerationStructureFlagsNV>\n  {\n    using Type = PartitionedAccelerationStructureFlagsNV;\n  };\n\n  struct PartitionedAccelerationStructureUpdateInstanceDataNV\n  {\n    using NativeType = VkPartitionedAccelerationStructureUpdateInstanceDataNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      PartitionedAccelerationStructureUpdateInstanceDataNV( uint32_t                            instanceIndex_                       = {},\n                                                            uint32_t                            instanceContributionToHitGroupIndex_ = {},\n                                                            VULKAN_HPP_NAMESPACE::DeviceAddress accelerationStructure_               = {} ) VULKAN_HPP_NOEXCEPT\n      : instanceIndex{ instanceIndex_ }\n      , instanceContributionToHitGroupIndex{ instanceContributionToHitGroupIndex_ }\n      , accelerationStructure{ accelerationStructure_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PartitionedAccelerationStructureUpdateInstanceDataNV( PartitionedAccelerationStructureUpdateInstanceDataNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PartitionedAccelerationStructureUpdateInstanceDataNV( VkPartitionedAccelerationStructureUpdateInstanceDataNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PartitionedAccelerationStructureUpdateInstanceDataNV( *reinterpret_cast<PartitionedAccelerationStructureUpdateInstanceDataNV const *>( &rhs ) )\n    {\n    }\n\n    PartitionedAccelerationStructureUpdateInstanceDataNV &\n      operator=( PartitionedAccelerationStructureUpdateInstanceDataNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PartitionedAccelerationStructureUpdateInstanceDataNV & operator=( VkPartitionedAccelerationStructureUpdateInstanceDataNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureUpdateInstanceDataNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PartitionedAccelerationStructureUpdateInstanceDataNV & setInstanceIndex( uint32_t instanceIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      instanceIndex = instanceIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PartitionedAccelerationStructureUpdateInstanceDataNV &\n      setInstanceContributionToHitGroupIndex( uint32_t instanceContributionToHitGroupIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      instanceContributionToHitGroupIndex = instanceContributionToHitGroupIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PartitionedAccelerationStructureUpdateInstanceDataNV &\n      setAccelerationStructure( VULKAN_HPP_NAMESPACE::DeviceAddress accelerationStructure_ ) VULKAN_HPP_NOEXCEPT\n    {\n      accelerationStructure = accelerationStructure_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPartitionedAccelerationStructureUpdateInstanceDataNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPartitionedAccelerationStructureUpdateInstanceDataNV *>( this );\n    }\n\n    operator VkPartitionedAccelerationStructureUpdateInstanceDataNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPartitionedAccelerationStructureUpdateInstanceDataNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &, VULKAN_HPP_NAMESPACE::DeviceAddress const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( instanceIndex, instanceContributionToHitGroupIndex, accelerationStructure );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PartitionedAccelerationStructureUpdateInstanceDataNV const & ) const = default;\n#else\n    bool operator==( PartitionedAccelerationStructureUpdateInstanceDataNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( instanceIndex == rhs.instanceIndex ) && ( instanceContributionToHitGroupIndex == rhs.instanceContributionToHitGroupIndex ) &&\n             ( accelerationStructure == rhs.accelerationStructure );\n#  endif\n    }\n\n    bool operator!=( PartitionedAccelerationStructureUpdateInstanceDataNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                            instanceIndex                       = {};\n    uint32_t                            instanceContributionToHitGroupIndex = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress accelerationStructure               = {};\n  };\n\n  struct PartitionedAccelerationStructureWriteInstanceDataNV\n  {\n    using NativeType = VkPartitionedAccelerationStructureWriteInstanceDataNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14\n      PartitionedAccelerationStructureWriteInstanceDataNV( VULKAN_HPP_NAMESPACE::TransformMatrixKHR transform_                                   = {},\n                                                           std::array<float, 6> const &             explicitAABB_                                = {},\n                                                           uint32_t                                 instanceID_                                  = {},\n                                                           uint32_t                                 instanceMask_                                = {},\n                                                           uint32_t                                 instanceContributionToHitGroupIndex_         = {},\n                                                           VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureInstanceFlagsNV instanceFlags_  = {},\n                                                           uint32_t                                                              instanceIndex_  = {},\n                                                           uint32_t                                                              partitionIndex_ = {},\n                                                           VULKAN_HPP_NAMESPACE::DeviceAddress accelerationStructure_ = {} ) VULKAN_HPP_NOEXCEPT\n      : transform{ transform_ }\n      , explicitAABB{ explicitAABB_ }\n      , instanceID{ instanceID_ }\n      , instanceMask{ instanceMask_ }\n      , instanceContributionToHitGroupIndex{ instanceContributionToHitGroupIndex_ }\n      , instanceFlags{ instanceFlags_ }\n      , instanceIndex{ instanceIndex_ }\n      , partitionIndex{ partitionIndex_ }\n      , accelerationStructure{ accelerationStructure_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14\n      PartitionedAccelerationStructureWriteInstanceDataNV( PartitionedAccelerationStructureWriteInstanceDataNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PartitionedAccelerationStructureWriteInstanceDataNV( VkPartitionedAccelerationStructureWriteInstanceDataNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PartitionedAccelerationStructureWriteInstanceDataNV( *reinterpret_cast<PartitionedAccelerationStructureWriteInstanceDataNV const *>( &rhs ) )\n    {\n    }\n\n    PartitionedAccelerationStructureWriteInstanceDataNV &\n      operator=( PartitionedAccelerationStructureWriteInstanceDataNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PartitionedAccelerationStructureWriteInstanceDataNV & operator=( VkPartitionedAccelerationStructureWriteInstanceDataNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureWriteInstanceDataNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PartitionedAccelerationStructureWriteInstanceDataNV &\n      setTransform( VULKAN_HPP_NAMESPACE::TransformMatrixKHR const & transform_ ) VULKAN_HPP_NOEXCEPT\n    {\n      transform = transform_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PartitionedAccelerationStructureWriteInstanceDataNV & setExplicitAABB( std::array<float, 6> explicitAABB_ ) VULKAN_HPP_NOEXCEPT\n    {\n      explicitAABB = explicitAABB_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PartitionedAccelerationStructureWriteInstanceDataNV & setInstanceID( uint32_t instanceID_ ) VULKAN_HPP_NOEXCEPT\n    {\n      instanceID = instanceID_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PartitionedAccelerationStructureWriteInstanceDataNV & setInstanceMask( uint32_t instanceMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      instanceMask = instanceMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PartitionedAccelerationStructureWriteInstanceDataNV &\n      setInstanceContributionToHitGroupIndex( uint32_t instanceContributionToHitGroupIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      instanceContributionToHitGroupIndex = instanceContributionToHitGroupIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PartitionedAccelerationStructureWriteInstanceDataNV &\n      setInstanceFlags( VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureInstanceFlagsNV instanceFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      instanceFlags = instanceFlags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PartitionedAccelerationStructureWriteInstanceDataNV & setInstanceIndex( uint32_t instanceIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      instanceIndex = instanceIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PartitionedAccelerationStructureWriteInstanceDataNV & setPartitionIndex( uint32_t partitionIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      partitionIndex = partitionIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PartitionedAccelerationStructureWriteInstanceDataNV &\n      setAccelerationStructure( VULKAN_HPP_NAMESPACE::DeviceAddress accelerationStructure_ ) VULKAN_HPP_NOEXCEPT\n    {\n      accelerationStructure = accelerationStructure_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPartitionedAccelerationStructureWriteInstanceDataNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPartitionedAccelerationStructureWriteInstanceDataNV *>( this );\n    }\n\n    operator VkPartitionedAccelerationStructureWriteInstanceDataNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPartitionedAccelerationStructureWriteInstanceDataNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::TransformMatrixKHR const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<float, 6> const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureInstanceFlagsNV const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( transform,\n                       explicitAABB,\n                       instanceID,\n                       instanceMask,\n                       instanceContributionToHitGroupIndex,\n                       instanceFlags,\n                       instanceIndex,\n                       partitionIndex,\n                       accelerationStructure );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PartitionedAccelerationStructureWriteInstanceDataNV const & ) const = default;\n#else\n    bool operator==( PartitionedAccelerationStructureWriteInstanceDataNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( transform == rhs.transform ) && ( explicitAABB == rhs.explicitAABB ) && ( instanceID == rhs.instanceID ) &&\n             ( instanceMask == rhs.instanceMask ) && ( instanceContributionToHitGroupIndex == rhs.instanceContributionToHitGroupIndex ) &&\n             ( instanceFlags == rhs.instanceFlags ) && ( instanceIndex == rhs.instanceIndex ) && ( partitionIndex == rhs.partitionIndex ) &&\n             ( accelerationStructure == rhs.accelerationStructure );\n#  endif\n    }\n\n    bool operator!=( PartitionedAccelerationStructureWriteInstanceDataNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::TransformMatrixKHR                              transform                           = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<float, 6>                        explicitAABB                        = {};\n    uint32_t                                                              instanceID                          = {};\n    uint32_t                                                              instanceMask                        = {};\n    uint32_t                                                              instanceContributionToHitGroupIndex = {};\n    VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureInstanceFlagsNV instanceFlags                       = {};\n    uint32_t                                                              instanceIndex                       = {};\n    uint32_t                                                              partitionIndex                      = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress                                   accelerationStructure               = {};\n  };\n\n  struct PartitionedAccelerationStructureWritePartitionTranslationDataNV\n  {\n    using NativeType = VkPartitionedAccelerationStructureWritePartitionTranslationDataNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14\n      PartitionedAccelerationStructureWritePartitionTranslationDataNV( uint32_t                     partitionIndex_       = {},\n                                                                       std::array<float, 3> const & partitionTranslation_ = {} ) VULKAN_HPP_NOEXCEPT\n      : partitionIndex{ partitionIndex_ }\n      , partitionTranslation{ partitionTranslation_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PartitionedAccelerationStructureWritePartitionTranslationDataNV(\n      PartitionedAccelerationStructureWritePartitionTranslationDataNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PartitionedAccelerationStructureWritePartitionTranslationDataNV( VkPartitionedAccelerationStructureWritePartitionTranslationDataNV const & rhs )\n      VULKAN_HPP_NOEXCEPT\n      : PartitionedAccelerationStructureWritePartitionTranslationDataNV(\n          *reinterpret_cast<PartitionedAccelerationStructureWritePartitionTranslationDataNV const *>( &rhs ) )\n    {\n    }\n\n    PartitionedAccelerationStructureWritePartitionTranslationDataNV &\n      operator=( PartitionedAccelerationStructureWritePartitionTranslationDataNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PartitionedAccelerationStructureWritePartitionTranslationDataNV &\n      operator=( VkPartitionedAccelerationStructureWritePartitionTranslationDataNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PartitionedAccelerationStructureWritePartitionTranslationDataNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PartitionedAccelerationStructureWritePartitionTranslationDataNV & setPartitionIndex( uint32_t partitionIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      partitionIndex = partitionIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PartitionedAccelerationStructureWritePartitionTranslationDataNV &\n      setPartitionTranslation( std::array<float, 3> partitionTranslation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      partitionTranslation = partitionTranslation_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPartitionedAccelerationStructureWritePartitionTranslationDataNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPartitionedAccelerationStructureWritePartitionTranslationDataNV *>( this );\n    }\n\n    operator VkPartitionedAccelerationStructureWritePartitionTranslationDataNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPartitionedAccelerationStructureWritePartitionTranslationDataNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, VULKAN_HPP_NAMESPACE::ArrayWrapper1D<float, 3> const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( partitionIndex, partitionTranslation );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PartitionedAccelerationStructureWritePartitionTranslationDataNV const & ) const = default;\n#else\n    bool operator==( PartitionedAccelerationStructureWritePartitionTranslationDataNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( partitionIndex == rhs.partitionIndex ) && ( partitionTranslation == rhs.partitionTranslation );\n#  endif\n    }\n\n    bool operator!=( PartitionedAccelerationStructureWritePartitionTranslationDataNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                                       partitionIndex       = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<float, 3> partitionTranslation = {};\n  };\n\n  struct PastPresentationTimingGOOGLE\n  {\n    using NativeType = VkPastPresentationTimingGOOGLE;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PastPresentationTimingGOOGLE( uint32_t presentID_           = {},\n                                                       uint64_t desiredPresentTime_  = {},\n                                                       uint64_t actualPresentTime_   = {},\n                                                       uint64_t earliestPresentTime_ = {},\n                                                       uint64_t presentMargin_       = {} ) VULKAN_HPP_NOEXCEPT\n      : presentID{ presentID_ }\n      , desiredPresentTime{ desiredPresentTime_ }\n      , actualPresentTime{ actualPresentTime_ }\n      , earliestPresentTime{ earliestPresentTime_ }\n      , presentMargin{ presentMargin_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PastPresentationTimingGOOGLE( PastPresentationTimingGOOGLE const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PastPresentationTimingGOOGLE( VkPastPresentationTimingGOOGLE const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PastPresentationTimingGOOGLE( *reinterpret_cast<PastPresentationTimingGOOGLE const *>( &rhs ) )\n    {\n    }\n\n    PastPresentationTimingGOOGLE & operator=( PastPresentationTimingGOOGLE const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PastPresentationTimingGOOGLE & operator=( VkPastPresentationTimingGOOGLE const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPastPresentationTimingGOOGLE const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPastPresentationTimingGOOGLE *>( this );\n    }\n\n    operator VkPastPresentationTimingGOOGLE &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPastPresentationTimingGOOGLE *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint64_t const &, uint64_t const &, uint64_t const &, uint64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( presentID, desiredPresentTime, actualPresentTime, earliestPresentTime, presentMargin );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PastPresentationTimingGOOGLE const & ) const = default;\n#else\n    bool operator==( PastPresentationTimingGOOGLE const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( presentID == rhs.presentID ) && ( desiredPresentTime == rhs.desiredPresentTime ) && ( actualPresentTime == rhs.actualPresentTime ) &&\n             ( earliestPresentTime == rhs.earliestPresentTime ) && ( presentMargin == rhs.presentMargin );\n#  endif\n    }\n\n    bool operator!=( PastPresentationTimingGOOGLE const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t presentID           = {};\n    uint64_t desiredPresentTime  = {};\n    uint64_t actualPresentTime   = {};\n    uint64_t earliestPresentTime = {};\n    uint64_t presentMargin       = {};\n  };\n\n  struct PerformanceConfigurationAcquireInfoINTEL\n  {\n    using NativeType = VkPerformanceConfigurationAcquireInfoINTEL;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePerformanceConfigurationAcquireInfoINTEL;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      PerformanceConfigurationAcquireInfoINTEL( VULKAN_HPP_NAMESPACE::PerformanceConfigurationTypeINTEL type_ =\n                                                  VULKAN_HPP_NAMESPACE::PerformanceConfigurationTypeINTEL::eCommandQueueMetricsDiscoveryActivated,\n                                                const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , type{ type_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PerformanceConfigurationAcquireInfoINTEL( PerformanceConfigurationAcquireInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PerformanceConfigurationAcquireInfoINTEL( VkPerformanceConfigurationAcquireInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PerformanceConfigurationAcquireInfoINTEL( *reinterpret_cast<PerformanceConfigurationAcquireInfoINTEL const *>( &rhs ) )\n    {\n    }\n\n    PerformanceConfigurationAcquireInfoINTEL & operator=( PerformanceConfigurationAcquireInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PerformanceConfigurationAcquireInfoINTEL & operator=( VkPerformanceConfigurationAcquireInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PerformanceConfigurationAcquireInfoINTEL const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PerformanceConfigurationAcquireInfoINTEL & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceConfigurationAcquireInfoINTEL &\n      setType( VULKAN_HPP_NAMESPACE::PerformanceConfigurationTypeINTEL type_ ) VULKAN_HPP_NOEXCEPT\n    {\n      type = type_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPerformanceConfigurationAcquireInfoINTEL const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPerformanceConfigurationAcquireInfoINTEL *>( this );\n    }\n\n    operator VkPerformanceConfigurationAcquireInfoINTEL &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPerformanceConfigurationAcquireInfoINTEL *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::PerformanceConfigurationTypeINTEL const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, type );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PerformanceConfigurationAcquireInfoINTEL const & ) const = default;\n#else\n    bool operator==( PerformanceConfigurationAcquireInfoINTEL const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( type == rhs.type );\n#  endif\n    }\n\n    bool operator!=( PerformanceConfigurationAcquireInfoINTEL const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                     sType = StructureType::ePerformanceConfigurationAcquireInfoINTEL;\n    const void *                                            pNext = {};\n    VULKAN_HPP_NAMESPACE::PerformanceConfigurationTypeINTEL type =\n      VULKAN_HPP_NAMESPACE::PerformanceConfigurationTypeINTEL::eCommandQueueMetricsDiscoveryActivated;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePerformanceConfigurationAcquireInfoINTEL>\n  {\n    using Type = PerformanceConfigurationAcquireInfoINTEL;\n  };\n\n  struct PerformanceCounterDescriptionKHR\n  {\n    using NativeType = VkPerformanceCounterDescriptionKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePerformanceCounterDescriptionKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PerformanceCounterDescriptionKHR( VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionFlagsKHR flags_       = {},\n                                                              std::array<char, VK_MAX_DESCRIPTION_SIZE> const &           name_        = {},\n                                                              std::array<char, VK_MAX_DESCRIPTION_SIZE> const &           category_    = {},\n                                                              std::array<char, VK_MAX_DESCRIPTION_SIZE> const &           description_ = {},\n                                                              void *                                                      pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , name{ name_ }\n      , category{ category_ }\n      , description{ description_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceCounterDescriptionKHR( PerformanceCounterDescriptionKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PerformanceCounterDescriptionKHR( VkPerformanceCounterDescriptionKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PerformanceCounterDescriptionKHR( *reinterpret_cast<PerformanceCounterDescriptionKHR const *>( &rhs ) )\n    {\n    }\n\n    PerformanceCounterDescriptionKHR & operator=( PerformanceCounterDescriptionKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PerformanceCounterDescriptionKHR & operator=( VkPerformanceCounterDescriptionKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPerformanceCounterDescriptionKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPerformanceCounterDescriptionKHR *>( this );\n    }\n\n    operator VkPerformanceCounterDescriptionKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPerformanceCounterDescriptionKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, name, category, description );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( PerformanceCounterDescriptionKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = flags <=> rhs.flags; cmp != 0 )\n        return cmp;\n      if ( auto cmp = strcmp( name, rhs.name ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = strcmp( category, rhs.category ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = strcmp( description, rhs.description ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( PerformanceCounterDescriptionKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( strcmp( name, rhs.name ) == 0 ) &&\n             ( strcmp( category, rhs.category ) == 0 ) && ( strcmp( description, rhs.description ) == 0 );\n    }\n\n    bool operator!=( PerformanceCounterDescriptionKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                 sType       = StructureType::ePerformanceCounterDescriptionKHR;\n    void *                                                              pNext       = {};\n    VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionFlagsKHR         flags       = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> name        = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> category    = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> description = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePerformanceCounterDescriptionKHR>\n  {\n    using Type = PerformanceCounterDescriptionKHR;\n  };\n\n  struct PerformanceCounterKHR\n  {\n    using NativeType = VkPerformanceCounterKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePerformanceCounterKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14\n      PerformanceCounterKHR( VULKAN_HPP_NAMESPACE::PerformanceCounterUnitKHR    unit_    = VULKAN_HPP_NAMESPACE::PerformanceCounterUnitKHR::eGeneric,\n                             VULKAN_HPP_NAMESPACE::PerformanceCounterScopeKHR   scope_   = VULKAN_HPP_NAMESPACE::PerformanceCounterScopeKHR::eCommandBuffer,\n                             VULKAN_HPP_NAMESPACE::PerformanceCounterStorageKHR storage_ = VULKAN_HPP_NAMESPACE::PerformanceCounterStorageKHR::eInt32,\n                             std::array<uint8_t, VK_UUID_SIZE> const &          uuid_    = {},\n                             void *                                             pNext_   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , unit{ unit_ }\n      , scope{ scope_ }\n      , storage{ storage_ }\n      , uuid{ uuid_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceCounterKHR( PerformanceCounterKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PerformanceCounterKHR( VkPerformanceCounterKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PerformanceCounterKHR( *reinterpret_cast<PerformanceCounterKHR const *>( &rhs ) )\n    {\n    }\n\n    PerformanceCounterKHR & operator=( PerformanceCounterKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PerformanceCounterKHR & operator=( VkPerformanceCounterKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PerformanceCounterKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPerformanceCounterKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPerformanceCounterKHR *>( this );\n    }\n\n    operator VkPerformanceCounterKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPerformanceCounterKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::PerformanceCounterUnitKHR const &,\n               VULKAN_HPP_NAMESPACE::PerformanceCounterScopeKHR const &,\n               VULKAN_HPP_NAMESPACE::PerformanceCounterStorageKHR const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, unit, scope, storage, uuid );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PerformanceCounterKHR const & ) const = default;\n#else\n    bool operator==( PerformanceCounterKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( unit == rhs.unit ) && ( scope == rhs.scope ) && ( storage == rhs.storage ) &&\n             ( uuid == rhs.uuid );\n#  endif\n    }\n\n    bool operator!=( PerformanceCounterKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                         sType   = StructureType::ePerformanceCounterKHR;\n    void *                                                      pNext   = {};\n    VULKAN_HPP_NAMESPACE::PerformanceCounterUnitKHR             unit    = VULKAN_HPP_NAMESPACE::PerformanceCounterUnitKHR::eGeneric;\n    VULKAN_HPP_NAMESPACE::PerformanceCounterScopeKHR            scope   = VULKAN_HPP_NAMESPACE::PerformanceCounterScopeKHR::eCommandBuffer;\n    VULKAN_HPP_NAMESPACE::PerformanceCounterStorageKHR          storage = VULKAN_HPP_NAMESPACE::PerformanceCounterStorageKHR::eInt32;\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> uuid    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePerformanceCounterKHR>\n  {\n    using Type = PerformanceCounterKHR;\n  };\n\n  union PerformanceCounterResultKHR\n  {\n    using NativeType = VkPerformanceCounterResultKHR;\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceCounterResultKHR( int32_t int32_ = {} ) : int32( int32_ ) {}\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceCounterResultKHR( int64_t int64_ ) : int64( int64_ ) {}\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceCounterResultKHR( uint32_t uint32_ ) : uint32( uint32_ ) {}\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceCounterResultKHR( uint64_t uint64_ ) : uint64( uint64_ ) {}\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceCounterResultKHR( float float32_ ) : float32( float32_ ) {}\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceCounterResultKHR( double float64_ ) : float64( float64_ ) {}\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_UNION_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PerformanceCounterResultKHR & setInt32( int32_t int32_ ) VULKAN_HPP_NOEXCEPT\n    {\n      int32 = int32_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceCounterResultKHR & setInt64( int64_t int64_ ) VULKAN_HPP_NOEXCEPT\n    {\n      int64 = int64_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceCounterResultKHR & setUint32( uint32_t uint32_ ) VULKAN_HPP_NOEXCEPT\n    {\n      uint32 = uint32_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceCounterResultKHR & setUint64( uint64_t uint64_ ) VULKAN_HPP_NOEXCEPT\n    {\n      uint64 = uint64_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceCounterResultKHR & setFloat32( float float32_ ) VULKAN_HPP_NOEXCEPT\n    {\n      float32 = float32_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceCounterResultKHR & setFloat64( double float64_ ) VULKAN_HPP_NOEXCEPT\n    {\n      float64 = float64_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPerformanceCounterResultKHR const &() const\n    {\n      return *reinterpret_cast<const VkPerformanceCounterResultKHR *>( this );\n    }\n\n    operator VkPerformanceCounterResultKHR &()\n    {\n      return *reinterpret_cast<VkPerformanceCounterResultKHR *>( this );\n    }\n\n    int32_t  int32;\n    int64_t  int64;\n    uint32_t uint32;\n    uint64_t uint64;\n    float    float32;\n    double   float64;\n  };\n\n  struct PerformanceMarkerInfoINTEL\n  {\n    using NativeType = VkPerformanceMarkerInfoINTEL;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePerformanceMarkerInfoINTEL;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PerformanceMarkerInfoINTEL( uint64_t marker_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , marker{ marker_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PerformanceMarkerInfoINTEL( PerformanceMarkerInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PerformanceMarkerInfoINTEL( VkPerformanceMarkerInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PerformanceMarkerInfoINTEL( *reinterpret_cast<PerformanceMarkerInfoINTEL const *>( &rhs ) )\n    {\n    }\n\n    PerformanceMarkerInfoINTEL & operator=( PerformanceMarkerInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PerformanceMarkerInfoINTEL & operator=( VkPerformanceMarkerInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PerformanceMarkerInfoINTEL const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PerformanceMarkerInfoINTEL & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceMarkerInfoINTEL & setMarker( uint64_t marker_ ) VULKAN_HPP_NOEXCEPT\n    {\n      marker = marker_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPerformanceMarkerInfoINTEL const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPerformanceMarkerInfoINTEL *>( this );\n    }\n\n    operator VkPerformanceMarkerInfoINTEL &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPerformanceMarkerInfoINTEL *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, marker );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PerformanceMarkerInfoINTEL const & ) const = default;\n#else\n    bool operator==( PerformanceMarkerInfoINTEL const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( marker == rhs.marker );\n#  endif\n    }\n\n    bool operator!=( PerformanceMarkerInfoINTEL const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType  = StructureType::ePerformanceMarkerInfoINTEL;\n    const void *                        pNext  = {};\n    uint64_t                            marker = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePerformanceMarkerInfoINTEL>\n  {\n    using Type = PerformanceMarkerInfoINTEL;\n  };\n\n  struct PerformanceOverrideInfoINTEL\n  {\n    using NativeType = VkPerformanceOverrideInfoINTEL;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePerformanceOverrideInfoINTEL;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PerformanceOverrideInfoINTEL(\n      VULKAN_HPP_NAMESPACE::PerformanceOverrideTypeINTEL type_      = VULKAN_HPP_NAMESPACE::PerformanceOverrideTypeINTEL::eNullHardware,\n      VULKAN_HPP_NAMESPACE::Bool32                       enable_    = {},\n      uint64_t                                           parameter_ = {},\n      const void *                                       pNext_     = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , type{ type_ }\n      , enable{ enable_ }\n      , parameter{ parameter_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PerformanceOverrideInfoINTEL( PerformanceOverrideInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PerformanceOverrideInfoINTEL( VkPerformanceOverrideInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PerformanceOverrideInfoINTEL( *reinterpret_cast<PerformanceOverrideInfoINTEL const *>( &rhs ) )\n    {\n    }\n\n    PerformanceOverrideInfoINTEL & operator=( PerformanceOverrideInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PerformanceOverrideInfoINTEL & operator=( VkPerformanceOverrideInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PerformanceOverrideInfoINTEL const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PerformanceOverrideInfoINTEL & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceOverrideInfoINTEL & setType( VULKAN_HPP_NAMESPACE::PerformanceOverrideTypeINTEL type_ ) VULKAN_HPP_NOEXCEPT\n    {\n      type = type_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceOverrideInfoINTEL & setEnable( VULKAN_HPP_NAMESPACE::Bool32 enable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      enable = enable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceOverrideInfoINTEL & setParameter( uint64_t parameter_ ) VULKAN_HPP_NOEXCEPT\n    {\n      parameter = parameter_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPerformanceOverrideInfoINTEL const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPerformanceOverrideInfoINTEL *>( this );\n    }\n\n    operator VkPerformanceOverrideInfoINTEL &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPerformanceOverrideInfoINTEL *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PerformanceOverrideTypeINTEL const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, type, enable, parameter );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PerformanceOverrideInfoINTEL const & ) const = default;\n#else\n    bool operator==( PerformanceOverrideInfoINTEL const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( type == rhs.type ) && ( enable == rhs.enable ) && ( parameter == rhs.parameter );\n#  endif\n    }\n\n    bool operator!=( PerformanceOverrideInfoINTEL const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                sType     = StructureType::ePerformanceOverrideInfoINTEL;\n    const void *                                       pNext     = {};\n    VULKAN_HPP_NAMESPACE::PerformanceOverrideTypeINTEL type      = VULKAN_HPP_NAMESPACE::PerformanceOverrideTypeINTEL::eNullHardware;\n    VULKAN_HPP_NAMESPACE::Bool32                       enable    = {};\n    uint64_t                                           parameter = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePerformanceOverrideInfoINTEL>\n  {\n    using Type = PerformanceOverrideInfoINTEL;\n  };\n\n  struct PerformanceQuerySubmitInfoKHR\n  {\n    using NativeType = VkPerformanceQuerySubmitInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePerformanceQuerySubmitInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PerformanceQuerySubmitInfoKHR( uint32_t counterPassIndex_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , counterPassIndex{ counterPassIndex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PerformanceQuerySubmitInfoKHR( PerformanceQuerySubmitInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PerformanceQuerySubmitInfoKHR( VkPerformanceQuerySubmitInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PerformanceQuerySubmitInfoKHR( *reinterpret_cast<PerformanceQuerySubmitInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    PerformanceQuerySubmitInfoKHR & operator=( PerformanceQuerySubmitInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PerformanceQuerySubmitInfoKHR & operator=( VkPerformanceQuerySubmitInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PerformanceQuerySubmitInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PerformanceQuerySubmitInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceQuerySubmitInfoKHR & setCounterPassIndex( uint32_t counterPassIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      counterPassIndex = counterPassIndex_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPerformanceQuerySubmitInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPerformanceQuerySubmitInfoKHR *>( this );\n    }\n\n    operator VkPerformanceQuerySubmitInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPerformanceQuerySubmitInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, counterPassIndex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PerformanceQuerySubmitInfoKHR const & ) const = default;\n#else\n    bool operator==( PerformanceQuerySubmitInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( counterPassIndex == rhs.counterPassIndex );\n#  endif\n    }\n\n    bool operator!=( PerformanceQuerySubmitInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType            = StructureType::ePerformanceQuerySubmitInfoKHR;\n    const void *                        pNext            = {};\n    uint32_t                            counterPassIndex = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePerformanceQuerySubmitInfoKHR>\n  {\n    using Type = PerformanceQuerySubmitInfoKHR;\n  };\n\n  struct PerformanceStreamMarkerInfoINTEL\n  {\n    using NativeType = VkPerformanceStreamMarkerInfoINTEL;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePerformanceStreamMarkerInfoINTEL;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PerformanceStreamMarkerInfoINTEL( uint32_t marker_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , marker{ marker_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PerformanceStreamMarkerInfoINTEL( PerformanceStreamMarkerInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PerformanceStreamMarkerInfoINTEL( VkPerformanceStreamMarkerInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PerformanceStreamMarkerInfoINTEL( *reinterpret_cast<PerformanceStreamMarkerInfoINTEL const *>( &rhs ) )\n    {\n    }\n\n    PerformanceStreamMarkerInfoINTEL & operator=( PerformanceStreamMarkerInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PerformanceStreamMarkerInfoINTEL & operator=( VkPerformanceStreamMarkerInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PerformanceStreamMarkerInfoINTEL const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PerformanceStreamMarkerInfoINTEL & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceStreamMarkerInfoINTEL & setMarker( uint32_t marker_ ) VULKAN_HPP_NOEXCEPT\n    {\n      marker = marker_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPerformanceStreamMarkerInfoINTEL const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPerformanceStreamMarkerInfoINTEL *>( this );\n    }\n\n    operator VkPerformanceStreamMarkerInfoINTEL &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPerformanceStreamMarkerInfoINTEL *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, marker );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PerformanceStreamMarkerInfoINTEL const & ) const = default;\n#else\n    bool operator==( PerformanceStreamMarkerInfoINTEL const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( marker == rhs.marker );\n#  endif\n    }\n\n    bool operator!=( PerformanceStreamMarkerInfoINTEL const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType  = StructureType::ePerformanceStreamMarkerInfoINTEL;\n    const void *                        pNext  = {};\n    uint32_t                            marker = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePerformanceStreamMarkerInfoINTEL>\n  {\n    using Type = PerformanceStreamMarkerInfoINTEL;\n  };\n\n  union PerformanceValueDataINTEL\n  {\n    using NativeType = VkPerformanceValueDataINTEL;\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceValueDataINTEL( uint32_t value32_ = {} ) : value32( value32_ ) {}\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceValueDataINTEL( uint64_t value64_ ) : value64( value64_ ) {}\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceValueDataINTEL( float valueFloat_ ) : valueFloat( valueFloat_ ) {}\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceValueDataINTEL( const char * valueString_ ) : valueString( valueString_ ) {}\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_UNION_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PerformanceValueDataINTEL & setValue32( uint32_t value32_ ) VULKAN_HPP_NOEXCEPT\n    {\n      value32 = value32_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceValueDataINTEL & setValue64( uint64_t value64_ ) VULKAN_HPP_NOEXCEPT\n    {\n      value64 = value64_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceValueDataINTEL & setValueFloat( float valueFloat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      valueFloat = valueFloat_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceValueDataINTEL & setValueBool( VULKAN_HPP_NAMESPACE::Bool32 valueBool_ ) VULKAN_HPP_NOEXCEPT\n    {\n      valueBool = valueBool_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceValueDataINTEL & setValueString( const char * valueString_ ) VULKAN_HPP_NOEXCEPT\n    {\n      valueString = valueString_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPerformanceValueDataINTEL const &() const\n    {\n      return *reinterpret_cast<const VkPerformanceValueDataINTEL *>( this );\n    }\n\n    operator VkPerformanceValueDataINTEL &()\n    {\n      return *reinterpret_cast<VkPerformanceValueDataINTEL *>( this );\n    }\n\n#ifdef VULKAN_HPP_HAS_UNRESTRICTED_UNIONS\n    uint32_t                     value32;\n    uint64_t                     value64;\n    float                        valueFloat;\n    VULKAN_HPP_NAMESPACE::Bool32 valueBool;\n    const char *                 valueString;\n#else\n    uint32_t     value32;\n    uint64_t     value64;\n    float        valueFloat;\n    VkBool32     valueBool;\n    const char * valueString;\n#endif /*VULKAN_HPP_HAS_UNRESTRICTED_UNIONS*/\n  };\n\n  struct PerformanceValueINTEL\n  {\n    using NativeType = VkPerformanceValueINTEL;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14\n      PerformanceValueINTEL( VULKAN_HPP_NAMESPACE::PerformanceValueTypeINTEL type_ = VULKAN_HPP_NAMESPACE::PerformanceValueTypeINTEL::eUint32,\n                             VULKAN_HPP_NAMESPACE::PerformanceValueDataINTEL data_ = {} ) VULKAN_HPP_NOEXCEPT\n      : type{ type_ }\n      , data{ data_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PerformanceValueINTEL( PerformanceValueINTEL const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PerformanceValueINTEL( VkPerformanceValueINTEL const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PerformanceValueINTEL( *reinterpret_cast<PerformanceValueINTEL const *>( &rhs ) )\n    {\n    }\n\n    PerformanceValueINTEL & operator=( PerformanceValueINTEL const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PerformanceValueINTEL & operator=( VkPerformanceValueINTEL const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PerformanceValueINTEL const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPerformanceValueINTEL const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPerformanceValueINTEL *>( this );\n    }\n\n    operator VkPerformanceValueINTEL &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPerformanceValueINTEL *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::PerformanceValueTypeINTEL const &, VULKAN_HPP_NAMESPACE::PerformanceValueDataINTEL const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( type, data );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::PerformanceValueTypeINTEL type = VULKAN_HPP_NAMESPACE::PerformanceValueTypeINTEL::eUint32;\n    VULKAN_HPP_NAMESPACE::PerformanceValueDataINTEL data = {};\n  };\n\n  struct PhysicalDevice16BitStorageFeatures\n  {\n    using NativeType = VkPhysicalDevice16BitStorageFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevice16BitStorageFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevice16BitStorageFeatures( VULKAN_HPP_NAMESPACE::Bool32 storageBuffer16BitAccess_           = {},\n                                                             VULKAN_HPP_NAMESPACE::Bool32 uniformAndStorageBuffer16BitAccess_ = {},\n                                                             VULKAN_HPP_NAMESPACE::Bool32 storagePushConstant16_              = {},\n                                                             VULKAN_HPP_NAMESPACE::Bool32 storageInputOutput16_               = {},\n                                                             void *                       pNext_                              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , storageBuffer16BitAccess{ storageBuffer16BitAccess_ }\n      , uniformAndStorageBuffer16BitAccess{ uniformAndStorageBuffer16BitAccess_ }\n      , storagePushConstant16{ storagePushConstant16_ }\n      , storageInputOutput16{ storageInputOutput16_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDevice16BitStorageFeatures( PhysicalDevice16BitStorageFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevice16BitStorageFeatures( VkPhysicalDevice16BitStorageFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevice16BitStorageFeatures( *reinterpret_cast<PhysicalDevice16BitStorageFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevice16BitStorageFeatures & operator=( PhysicalDevice16BitStorageFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevice16BitStorageFeatures & operator=( VkPhysicalDevice16BitStorageFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevice16BitStorageFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevice16BitStorageFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevice16BitStorageFeatures &\n      setStorageBuffer16BitAccess( VULKAN_HPP_NAMESPACE::Bool32 storageBuffer16BitAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      storageBuffer16BitAccess = storageBuffer16BitAccess_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevice16BitStorageFeatures &\n      setUniformAndStorageBuffer16BitAccess( VULKAN_HPP_NAMESPACE::Bool32 uniformAndStorageBuffer16BitAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      uniformAndStorageBuffer16BitAccess = uniformAndStorageBuffer16BitAccess_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevice16BitStorageFeatures &\n      setStoragePushConstant16( VULKAN_HPP_NAMESPACE::Bool32 storagePushConstant16_ ) VULKAN_HPP_NOEXCEPT\n    {\n      storagePushConstant16 = storagePushConstant16_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevice16BitStorageFeatures &\n      setStorageInputOutput16( VULKAN_HPP_NAMESPACE::Bool32 storageInputOutput16_ ) VULKAN_HPP_NOEXCEPT\n    {\n      storageInputOutput16 = storageInputOutput16_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevice16BitStorageFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevice16BitStorageFeatures *>( this );\n    }\n\n    operator VkPhysicalDevice16BitStorageFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevice16BitStorageFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, storageBuffer16BitAccess, uniformAndStorageBuffer16BitAccess, storagePushConstant16, storageInputOutput16 );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevice16BitStorageFeatures const & ) const = default;\n#else\n    bool         operator==( PhysicalDevice16BitStorageFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( storageBuffer16BitAccess == rhs.storageBuffer16BitAccess ) &&\n             ( uniformAndStorageBuffer16BitAccess == rhs.uniformAndStorageBuffer16BitAccess ) && ( storagePushConstant16 == rhs.storagePushConstant16 ) &&\n             ( storageInputOutput16 == rhs.storageInputOutput16 );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevice16BitStorageFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                              = StructureType::ePhysicalDevice16BitStorageFeatures;\n    void *                              pNext                              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        storageBuffer16BitAccess           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        uniformAndStorageBuffer16BitAccess = {};\n    VULKAN_HPP_NAMESPACE::Bool32        storagePushConstant16              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        storageInputOutput16               = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevice16BitStorageFeatures>\n  {\n    using Type = PhysicalDevice16BitStorageFeatures;\n  };\n\n  using PhysicalDevice16BitStorageFeaturesKHR = PhysicalDevice16BitStorageFeatures;\n\n  struct PhysicalDevice4444FormatsFeaturesEXT\n  {\n    using NativeType = VkPhysicalDevice4444FormatsFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevice4444FormatsFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevice4444FormatsFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 formatA4R4G4B4_ = {},\n                                                               VULKAN_HPP_NAMESPACE::Bool32 formatA4B4G4R4_ = {},\n                                                               void *                       pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , formatA4R4G4B4{ formatA4R4G4B4_ }\n      , formatA4B4G4R4{ formatA4B4G4R4_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDevice4444FormatsFeaturesEXT( PhysicalDevice4444FormatsFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevice4444FormatsFeaturesEXT( VkPhysicalDevice4444FormatsFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevice4444FormatsFeaturesEXT( *reinterpret_cast<PhysicalDevice4444FormatsFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevice4444FormatsFeaturesEXT & operator=( PhysicalDevice4444FormatsFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevice4444FormatsFeaturesEXT & operator=( VkPhysicalDevice4444FormatsFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevice4444FormatsFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevice4444FormatsFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevice4444FormatsFeaturesEXT & setFormatA4R4G4B4( VULKAN_HPP_NAMESPACE::Bool32 formatA4R4G4B4_ ) VULKAN_HPP_NOEXCEPT\n    {\n      formatA4R4G4B4 = formatA4R4G4B4_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevice4444FormatsFeaturesEXT & setFormatA4B4G4R4( VULKAN_HPP_NAMESPACE::Bool32 formatA4B4G4R4_ ) VULKAN_HPP_NOEXCEPT\n    {\n      formatA4B4G4R4 = formatA4B4G4R4_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevice4444FormatsFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevice4444FormatsFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDevice4444FormatsFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevice4444FormatsFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, formatA4R4G4B4, formatA4B4G4R4 );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevice4444FormatsFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDevice4444FormatsFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( formatA4R4G4B4 == rhs.formatA4R4G4B4 ) && ( formatA4B4G4R4 == rhs.formatA4B4G4R4 );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevice4444FormatsFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::ePhysicalDevice4444FormatsFeaturesEXT;\n    void *                              pNext          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        formatA4R4G4B4 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        formatA4B4G4R4 = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevice4444FormatsFeaturesEXT>\n  {\n    using Type = PhysicalDevice4444FormatsFeaturesEXT;\n  };\n\n  struct PhysicalDevice8BitStorageFeatures\n  {\n    using NativeType = VkPhysicalDevice8BitStorageFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevice8BitStorageFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevice8BitStorageFeatures( VULKAN_HPP_NAMESPACE::Bool32 storageBuffer8BitAccess_           = {},\n                                                            VULKAN_HPP_NAMESPACE::Bool32 uniformAndStorageBuffer8BitAccess_ = {},\n                                                            VULKAN_HPP_NAMESPACE::Bool32 storagePushConstant8_              = {},\n                                                            void *                       pNext_                             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , storageBuffer8BitAccess{ storageBuffer8BitAccess_ }\n      , uniformAndStorageBuffer8BitAccess{ uniformAndStorageBuffer8BitAccess_ }\n      , storagePushConstant8{ storagePushConstant8_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDevice8BitStorageFeatures( PhysicalDevice8BitStorageFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevice8BitStorageFeatures( VkPhysicalDevice8BitStorageFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevice8BitStorageFeatures( *reinterpret_cast<PhysicalDevice8BitStorageFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevice8BitStorageFeatures & operator=( PhysicalDevice8BitStorageFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevice8BitStorageFeatures & operator=( VkPhysicalDevice8BitStorageFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevice8BitStorageFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevice8BitStorageFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevice8BitStorageFeatures &\n      setStorageBuffer8BitAccess( VULKAN_HPP_NAMESPACE::Bool32 storageBuffer8BitAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      storageBuffer8BitAccess = storageBuffer8BitAccess_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevice8BitStorageFeatures &\n      setUniformAndStorageBuffer8BitAccess( VULKAN_HPP_NAMESPACE::Bool32 uniformAndStorageBuffer8BitAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      uniformAndStorageBuffer8BitAccess = uniformAndStorageBuffer8BitAccess_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevice8BitStorageFeatures &\n      setStoragePushConstant8( VULKAN_HPP_NAMESPACE::Bool32 storagePushConstant8_ ) VULKAN_HPP_NOEXCEPT\n    {\n      storagePushConstant8 = storagePushConstant8_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevice8BitStorageFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevice8BitStorageFeatures *>( this );\n    }\n\n    operator VkPhysicalDevice8BitStorageFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevice8BitStorageFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, storageBuffer8BitAccess, uniformAndStorageBuffer8BitAccess, storagePushConstant8 );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevice8BitStorageFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDevice8BitStorageFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( storageBuffer8BitAccess == rhs.storageBuffer8BitAccess ) &&\n             ( uniformAndStorageBuffer8BitAccess == rhs.uniformAndStorageBuffer8BitAccess ) && ( storagePushConstant8 == rhs.storagePushConstant8 );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevice8BitStorageFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                             = StructureType::ePhysicalDevice8BitStorageFeatures;\n    void *                              pNext                             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        storageBuffer8BitAccess           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        uniformAndStorageBuffer8BitAccess = {};\n    VULKAN_HPP_NAMESPACE::Bool32        storagePushConstant8              = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevice8BitStorageFeatures>\n  {\n    using Type = PhysicalDevice8BitStorageFeatures;\n  };\n\n  using PhysicalDevice8BitStorageFeaturesKHR = PhysicalDevice8BitStorageFeatures;\n\n  struct PhysicalDeviceASTCDecodeFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceASTCDecodeFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceAstcDecodeFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceASTCDecodeFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 decodeModeSharedExponent_ = {},\n                                                              void *                       pNext_                    = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , decodeModeSharedExponent{ decodeModeSharedExponent_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceASTCDecodeFeaturesEXT( PhysicalDeviceASTCDecodeFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceASTCDecodeFeaturesEXT( VkPhysicalDeviceASTCDecodeFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceASTCDecodeFeaturesEXT( *reinterpret_cast<PhysicalDeviceASTCDecodeFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceASTCDecodeFeaturesEXT & operator=( PhysicalDeviceASTCDecodeFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceASTCDecodeFeaturesEXT & operator=( VkPhysicalDeviceASTCDecodeFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceASTCDecodeFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceASTCDecodeFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceASTCDecodeFeaturesEXT &\n      setDecodeModeSharedExponent( VULKAN_HPP_NAMESPACE::Bool32 decodeModeSharedExponent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      decodeModeSharedExponent = decodeModeSharedExponent_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceASTCDecodeFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceASTCDecodeFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceASTCDecodeFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceASTCDecodeFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, decodeModeSharedExponent );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceASTCDecodeFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceASTCDecodeFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( decodeModeSharedExponent == rhs.decodeModeSharedExponent );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceASTCDecodeFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                    = StructureType::ePhysicalDeviceAstcDecodeFeaturesEXT;\n    void *                              pNext                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        decodeModeSharedExponent = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceAstcDecodeFeaturesEXT>\n  {\n    using Type = PhysicalDeviceASTCDecodeFeaturesEXT;\n  };\n\n  struct PhysicalDeviceAccelerationStructureFeaturesKHR\n  {\n    using NativeType = VkPhysicalDeviceAccelerationStructureFeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceAccelerationStructureFeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceAccelerationStructureFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 accelerationStructure_                                 = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 accelerationStructureCaptureReplay_                    = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 accelerationStructureIndirectBuild_                    = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 accelerationStructureHostCommands_                     = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingAccelerationStructureUpdateAfterBind_ = {},\n                                                      void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , accelerationStructure{ accelerationStructure_ }\n      , accelerationStructureCaptureReplay{ accelerationStructureCaptureReplay_ }\n      , accelerationStructureIndirectBuild{ accelerationStructureIndirectBuild_ }\n      , accelerationStructureHostCommands{ accelerationStructureHostCommands_ }\n      , descriptorBindingAccelerationStructureUpdateAfterBind{ descriptorBindingAccelerationStructureUpdateAfterBind_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceAccelerationStructureFeaturesKHR( PhysicalDeviceAccelerationStructureFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceAccelerationStructureFeaturesKHR( VkPhysicalDeviceAccelerationStructureFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceAccelerationStructureFeaturesKHR( *reinterpret_cast<PhysicalDeviceAccelerationStructureFeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceAccelerationStructureFeaturesKHR & operator=( PhysicalDeviceAccelerationStructureFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceAccelerationStructureFeaturesKHR & operator=( VkPhysicalDeviceAccelerationStructureFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceAccelerationStructureFeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceAccelerationStructureFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceAccelerationStructureFeaturesKHR &\n      setAccelerationStructure( VULKAN_HPP_NAMESPACE::Bool32 accelerationStructure_ ) VULKAN_HPP_NOEXCEPT\n    {\n      accelerationStructure = accelerationStructure_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceAccelerationStructureFeaturesKHR &\n      setAccelerationStructureCaptureReplay( VULKAN_HPP_NAMESPACE::Bool32 accelerationStructureCaptureReplay_ ) VULKAN_HPP_NOEXCEPT\n    {\n      accelerationStructureCaptureReplay = accelerationStructureCaptureReplay_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceAccelerationStructureFeaturesKHR &\n      setAccelerationStructureIndirectBuild( VULKAN_HPP_NAMESPACE::Bool32 accelerationStructureIndirectBuild_ ) VULKAN_HPP_NOEXCEPT\n    {\n      accelerationStructureIndirectBuild = accelerationStructureIndirectBuild_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceAccelerationStructureFeaturesKHR &\n      setAccelerationStructureHostCommands( VULKAN_HPP_NAMESPACE::Bool32 accelerationStructureHostCommands_ ) VULKAN_HPP_NOEXCEPT\n    {\n      accelerationStructureHostCommands = accelerationStructureHostCommands_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceAccelerationStructureFeaturesKHR & setDescriptorBindingAccelerationStructureUpdateAfterBind(\n      VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingAccelerationStructureUpdateAfterBind_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBindingAccelerationStructureUpdateAfterBind = descriptorBindingAccelerationStructureUpdateAfterBind_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceAccelerationStructureFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceAccelerationStructureFeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceAccelerationStructureFeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceAccelerationStructureFeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       accelerationStructure,\n                       accelerationStructureCaptureReplay,\n                       accelerationStructureIndirectBuild,\n                       accelerationStructureHostCommands,\n                       descriptorBindingAccelerationStructureUpdateAfterBind );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceAccelerationStructureFeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceAccelerationStructureFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( accelerationStructure == rhs.accelerationStructure ) &&\n             ( accelerationStructureCaptureReplay == rhs.accelerationStructureCaptureReplay ) &&\n             ( accelerationStructureIndirectBuild == rhs.accelerationStructureIndirectBuild ) &&\n             ( accelerationStructureHostCommands == rhs.accelerationStructureHostCommands ) &&\n             ( descriptorBindingAccelerationStructureUpdateAfterBind == rhs.descriptorBindingAccelerationStructureUpdateAfterBind );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceAccelerationStructureFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                                 = StructureType::ePhysicalDeviceAccelerationStructureFeaturesKHR;\n    void *                              pNext                                                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        accelerationStructure                                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        accelerationStructureCaptureReplay                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        accelerationStructureIndirectBuild                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        accelerationStructureHostCommands                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBindingAccelerationStructureUpdateAfterBind = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceAccelerationStructureFeaturesKHR>\n  {\n    using Type = PhysicalDeviceAccelerationStructureFeaturesKHR;\n  };\n\n  struct PhysicalDeviceAccelerationStructurePropertiesKHR\n  {\n    using NativeType = VkPhysicalDeviceAccelerationStructurePropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceAccelerationStructurePropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceAccelerationStructurePropertiesKHR( uint64_t maxGeometryCount_                                           = {},\n                                                                           uint64_t maxInstanceCount_                                           = {},\n                                                                           uint64_t maxPrimitiveCount_                                          = {},\n                                                                           uint32_t maxPerStageDescriptorAccelerationStructures_                = {},\n                                                                           uint32_t maxPerStageDescriptorUpdateAfterBindAccelerationStructures_ = {},\n                                                                           uint32_t maxDescriptorSetAccelerationStructures_                     = {},\n                                                                           uint32_t maxDescriptorSetUpdateAfterBindAccelerationStructures_      = {},\n                                                                           uint32_t minAccelerationStructureScratchOffsetAlignment_             = {},\n                                                                           void *   pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxGeometryCount{ maxGeometryCount_ }\n      , maxInstanceCount{ maxInstanceCount_ }\n      , maxPrimitiveCount{ maxPrimitiveCount_ }\n      , maxPerStageDescriptorAccelerationStructures{ maxPerStageDescriptorAccelerationStructures_ }\n      , maxPerStageDescriptorUpdateAfterBindAccelerationStructures{ maxPerStageDescriptorUpdateAfterBindAccelerationStructures_ }\n      , maxDescriptorSetAccelerationStructures{ maxDescriptorSetAccelerationStructures_ }\n      , maxDescriptorSetUpdateAfterBindAccelerationStructures{ maxDescriptorSetUpdateAfterBindAccelerationStructures_ }\n      , minAccelerationStructureScratchOffsetAlignment{ minAccelerationStructureScratchOffsetAlignment_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceAccelerationStructurePropertiesKHR( PhysicalDeviceAccelerationStructurePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceAccelerationStructurePropertiesKHR( VkPhysicalDeviceAccelerationStructurePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceAccelerationStructurePropertiesKHR( *reinterpret_cast<PhysicalDeviceAccelerationStructurePropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceAccelerationStructurePropertiesKHR & operator=( PhysicalDeviceAccelerationStructurePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceAccelerationStructurePropertiesKHR & operator=( VkPhysicalDeviceAccelerationStructurePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceAccelerationStructurePropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceAccelerationStructurePropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceAccelerationStructurePropertiesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceAccelerationStructurePropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceAccelerationStructurePropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint64_t const &,\n               uint64_t const &,\n               uint64_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       maxGeometryCount,\n                       maxInstanceCount,\n                       maxPrimitiveCount,\n                       maxPerStageDescriptorAccelerationStructures,\n                       maxPerStageDescriptorUpdateAfterBindAccelerationStructures,\n                       maxDescriptorSetAccelerationStructures,\n                       maxDescriptorSetUpdateAfterBindAccelerationStructures,\n                       minAccelerationStructureScratchOffsetAlignment );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceAccelerationStructurePropertiesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceAccelerationStructurePropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxGeometryCount == rhs.maxGeometryCount ) && ( maxInstanceCount == rhs.maxInstanceCount ) &&\n             ( maxPrimitiveCount == rhs.maxPrimitiveCount ) &&\n             ( maxPerStageDescriptorAccelerationStructures == rhs.maxPerStageDescriptorAccelerationStructures ) &&\n             ( maxPerStageDescriptorUpdateAfterBindAccelerationStructures == rhs.maxPerStageDescriptorUpdateAfterBindAccelerationStructures ) &&\n             ( maxDescriptorSetAccelerationStructures == rhs.maxDescriptorSetAccelerationStructures ) &&\n             ( maxDescriptorSetUpdateAfterBindAccelerationStructures == rhs.maxDescriptorSetUpdateAfterBindAccelerationStructures ) &&\n             ( minAccelerationStructureScratchOffsetAlignment == rhs.minAccelerationStructureScratchOffsetAlignment );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceAccelerationStructurePropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                       = StructureType::ePhysicalDeviceAccelerationStructurePropertiesKHR;\n    void *                              pNext                                       = {};\n    uint64_t                            maxGeometryCount                            = {};\n    uint64_t                            maxInstanceCount                            = {};\n    uint64_t                            maxPrimitiveCount                           = {};\n    uint32_t                            maxPerStageDescriptorAccelerationStructures = {};\n    uint32_t                            maxPerStageDescriptorUpdateAfterBindAccelerationStructures = {};\n    uint32_t                            maxDescriptorSetAccelerationStructures                     = {};\n    uint32_t                            maxDescriptorSetUpdateAfterBindAccelerationStructures      = {};\n    uint32_t                            minAccelerationStructureScratchOffsetAlignment             = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceAccelerationStructurePropertiesKHR>\n  {\n    using Type = PhysicalDeviceAccelerationStructurePropertiesKHR;\n  };\n\n  struct PhysicalDeviceAddressBindingReportFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceAddressBindingReportFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceAddressBindingReportFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceAddressBindingReportFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 reportAddressBinding_ = {},\n                                                                        void *                       pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , reportAddressBinding{ reportAddressBinding_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceAddressBindingReportFeaturesEXT( PhysicalDeviceAddressBindingReportFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceAddressBindingReportFeaturesEXT( VkPhysicalDeviceAddressBindingReportFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceAddressBindingReportFeaturesEXT( *reinterpret_cast<PhysicalDeviceAddressBindingReportFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceAddressBindingReportFeaturesEXT & operator=( PhysicalDeviceAddressBindingReportFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceAddressBindingReportFeaturesEXT & operator=( VkPhysicalDeviceAddressBindingReportFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceAddressBindingReportFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceAddressBindingReportFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceAddressBindingReportFeaturesEXT &\n      setReportAddressBinding( VULKAN_HPP_NAMESPACE::Bool32 reportAddressBinding_ ) VULKAN_HPP_NOEXCEPT\n    {\n      reportAddressBinding = reportAddressBinding_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceAddressBindingReportFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceAddressBindingReportFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceAddressBindingReportFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceAddressBindingReportFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, reportAddressBinding );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceAddressBindingReportFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceAddressBindingReportFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( reportAddressBinding == rhs.reportAddressBinding );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceAddressBindingReportFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                = StructureType::ePhysicalDeviceAddressBindingReportFeaturesEXT;\n    void *                              pNext                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        reportAddressBinding = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceAddressBindingReportFeaturesEXT>\n  {\n    using Type = PhysicalDeviceAddressBindingReportFeaturesEXT;\n  };\n\n  struct PhysicalDeviceAmigoProfilingFeaturesSEC\n  {\n    using NativeType = VkPhysicalDeviceAmigoProfilingFeaturesSEC;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceAmigoProfilingFeaturesSEC;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceAmigoProfilingFeaturesSEC( VULKAN_HPP_NAMESPACE::Bool32 amigoProfiling_ = {},\n                                                                  void *                       pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , amigoProfiling{ amigoProfiling_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceAmigoProfilingFeaturesSEC( PhysicalDeviceAmigoProfilingFeaturesSEC const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceAmigoProfilingFeaturesSEC( VkPhysicalDeviceAmigoProfilingFeaturesSEC const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceAmigoProfilingFeaturesSEC( *reinterpret_cast<PhysicalDeviceAmigoProfilingFeaturesSEC const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceAmigoProfilingFeaturesSEC & operator=( PhysicalDeviceAmigoProfilingFeaturesSEC const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceAmigoProfilingFeaturesSEC & operator=( VkPhysicalDeviceAmigoProfilingFeaturesSEC const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceAmigoProfilingFeaturesSEC const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceAmigoProfilingFeaturesSEC & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceAmigoProfilingFeaturesSEC & setAmigoProfiling( VULKAN_HPP_NAMESPACE::Bool32 amigoProfiling_ ) VULKAN_HPP_NOEXCEPT\n    {\n      amigoProfiling = amigoProfiling_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceAmigoProfilingFeaturesSEC const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceAmigoProfilingFeaturesSEC *>( this );\n    }\n\n    operator VkPhysicalDeviceAmigoProfilingFeaturesSEC &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceAmigoProfilingFeaturesSEC *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, amigoProfiling );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceAmigoProfilingFeaturesSEC const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceAmigoProfilingFeaturesSEC const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( amigoProfiling == rhs.amigoProfiling );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceAmigoProfilingFeaturesSEC const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::ePhysicalDeviceAmigoProfilingFeaturesSEC;\n    void *                              pNext          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        amigoProfiling = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceAmigoProfilingFeaturesSEC>\n  {\n    using Type = PhysicalDeviceAmigoProfilingFeaturesSEC;\n  };\n\n  struct PhysicalDeviceAntiLagFeaturesAMD\n  {\n    using NativeType = VkPhysicalDeviceAntiLagFeaturesAMD;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceAntiLagFeaturesAMD;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceAntiLagFeaturesAMD( VULKAN_HPP_NAMESPACE::Bool32 antiLag_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , antiLag{ antiLag_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceAntiLagFeaturesAMD( PhysicalDeviceAntiLagFeaturesAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceAntiLagFeaturesAMD( VkPhysicalDeviceAntiLagFeaturesAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceAntiLagFeaturesAMD( *reinterpret_cast<PhysicalDeviceAntiLagFeaturesAMD const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceAntiLagFeaturesAMD & operator=( PhysicalDeviceAntiLagFeaturesAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceAntiLagFeaturesAMD & operator=( VkPhysicalDeviceAntiLagFeaturesAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceAntiLagFeaturesAMD const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceAntiLagFeaturesAMD & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceAntiLagFeaturesAMD & setAntiLag( VULKAN_HPP_NAMESPACE::Bool32 antiLag_ ) VULKAN_HPP_NOEXCEPT\n    {\n      antiLag = antiLag_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceAntiLagFeaturesAMD const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceAntiLagFeaturesAMD *>( this );\n    }\n\n    operator VkPhysicalDeviceAntiLagFeaturesAMD &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceAntiLagFeaturesAMD *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, antiLag );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceAntiLagFeaturesAMD const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceAntiLagFeaturesAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( antiLag == rhs.antiLag );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceAntiLagFeaturesAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType   = StructureType::ePhysicalDeviceAntiLagFeaturesAMD;\n    void *                              pNext   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        antiLag = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceAntiLagFeaturesAMD>\n  {\n    using Type = PhysicalDeviceAntiLagFeaturesAMD;\n  };\n\n  struct PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 attachmentFeedbackLoopDynamicState_ = {},\n                                                                                      void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , attachmentFeedbackLoopDynamicState{ attachmentFeedbackLoopDynamicState_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT( PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT const & rhs )\n      VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT( VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT(\n          *reinterpret_cast<PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT &\n      operator=( PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT &\n      operator=( VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT &\n      setAttachmentFeedbackLoopDynamicState( VULKAN_HPP_NAMESPACE::Bool32 attachmentFeedbackLoopDynamicState_ ) VULKAN_HPP_NOEXCEPT\n    {\n      attachmentFeedbackLoopDynamicState = attachmentFeedbackLoopDynamicState_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, attachmentFeedbackLoopDynamicState );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( attachmentFeedbackLoopDynamicState == rhs.attachmentFeedbackLoopDynamicState );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                              = StructureType::ePhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT;\n    void *                              pNext                              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        attachmentFeedbackLoopDynamicState = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT>\n  {\n    using Type = PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT;\n  };\n\n  struct PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 attachmentFeedbackLoopLayout_ = {},\n                                                                                void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , attachmentFeedbackLoopLayout{ attachmentFeedbackLoopLayout_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT( PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT( VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT( *reinterpret_cast<PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT &\n      operator=( PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT & operator=( VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT &\n      setAttachmentFeedbackLoopLayout( VULKAN_HPP_NAMESPACE::Bool32 attachmentFeedbackLoopLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      attachmentFeedbackLoopLayout = attachmentFeedbackLoopLayout_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, attachmentFeedbackLoopLayout );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( attachmentFeedbackLoopLayout == rhs.attachmentFeedbackLoopLayout );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                        = StructureType::ePhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT;\n    void *                              pNext                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        attachmentFeedbackLoopLayout = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT>\n  {\n    using Type = PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT;\n  };\n\n  struct PhysicalDeviceBlendOperationAdvancedFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceBlendOperationAdvancedFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceBlendOperationAdvancedFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 advancedBlendCoherentOperations_ = {},\n                                                                          void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , advancedBlendCoherentOperations{ advancedBlendCoherentOperations_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceBlendOperationAdvancedFeaturesEXT( PhysicalDeviceBlendOperationAdvancedFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceBlendOperationAdvancedFeaturesEXT( VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceBlendOperationAdvancedFeaturesEXT( *reinterpret_cast<PhysicalDeviceBlendOperationAdvancedFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceBlendOperationAdvancedFeaturesEXT & operator=( PhysicalDeviceBlendOperationAdvancedFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceBlendOperationAdvancedFeaturesEXT & operator=( VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceBlendOperationAdvancedFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceBlendOperationAdvancedFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceBlendOperationAdvancedFeaturesEXT &\n      setAdvancedBlendCoherentOperations( VULKAN_HPP_NAMESPACE::Bool32 advancedBlendCoherentOperations_ ) VULKAN_HPP_NOEXCEPT\n    {\n      advancedBlendCoherentOperations = advancedBlendCoherentOperations_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, advancedBlendCoherentOperations );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceBlendOperationAdvancedFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceBlendOperationAdvancedFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( advancedBlendCoherentOperations == rhs.advancedBlendCoherentOperations );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceBlendOperationAdvancedFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                           = StructureType::ePhysicalDeviceBlendOperationAdvancedFeaturesEXT;\n    void *                              pNext                           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        advancedBlendCoherentOperations = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceBlendOperationAdvancedFeaturesEXT>\n  {\n    using Type = PhysicalDeviceBlendOperationAdvancedFeaturesEXT;\n  };\n\n  struct PhysicalDeviceBlendOperationAdvancedPropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceBlendOperationAdvancedPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceBlendOperationAdvancedPropertiesEXT( uint32_t                     advancedBlendMaxColorAttachments_      = {},\n                                                                            VULKAN_HPP_NAMESPACE::Bool32 advancedBlendIndependentBlend_         = {},\n                                                                            VULKAN_HPP_NAMESPACE::Bool32 advancedBlendNonPremultipliedSrcColor_ = {},\n                                                                            VULKAN_HPP_NAMESPACE::Bool32 advancedBlendNonPremultipliedDstColor_ = {},\n                                                                            VULKAN_HPP_NAMESPACE::Bool32 advancedBlendCorrelatedOverlap_        = {},\n                                                                            VULKAN_HPP_NAMESPACE::Bool32 advancedBlendAllOperations_            = {},\n                                                                            void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , advancedBlendMaxColorAttachments{ advancedBlendMaxColorAttachments_ }\n      , advancedBlendIndependentBlend{ advancedBlendIndependentBlend_ }\n      , advancedBlendNonPremultipliedSrcColor{ advancedBlendNonPremultipliedSrcColor_ }\n      , advancedBlendNonPremultipliedDstColor{ advancedBlendNonPremultipliedDstColor_ }\n      , advancedBlendCorrelatedOverlap{ advancedBlendCorrelatedOverlap_ }\n      , advancedBlendAllOperations{ advancedBlendAllOperations_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceBlendOperationAdvancedPropertiesEXT( PhysicalDeviceBlendOperationAdvancedPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceBlendOperationAdvancedPropertiesEXT( VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceBlendOperationAdvancedPropertiesEXT( *reinterpret_cast<PhysicalDeviceBlendOperationAdvancedPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceBlendOperationAdvancedPropertiesEXT &\n      operator=( PhysicalDeviceBlendOperationAdvancedPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceBlendOperationAdvancedPropertiesEXT & operator=( VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceBlendOperationAdvancedPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       advancedBlendMaxColorAttachments,\n                       advancedBlendIndependentBlend,\n                       advancedBlendNonPremultipliedSrcColor,\n                       advancedBlendNonPremultipliedDstColor,\n                       advancedBlendCorrelatedOverlap,\n                       advancedBlendAllOperations );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceBlendOperationAdvancedPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceBlendOperationAdvancedPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( advancedBlendMaxColorAttachments == rhs.advancedBlendMaxColorAttachments ) &&\n             ( advancedBlendIndependentBlend == rhs.advancedBlendIndependentBlend ) &&\n             ( advancedBlendNonPremultipliedSrcColor == rhs.advancedBlendNonPremultipliedSrcColor ) &&\n             ( advancedBlendNonPremultipliedDstColor == rhs.advancedBlendNonPremultipliedDstColor ) &&\n             ( advancedBlendCorrelatedOverlap == rhs.advancedBlendCorrelatedOverlap ) && ( advancedBlendAllOperations == rhs.advancedBlendAllOperations );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceBlendOperationAdvancedPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                 = StructureType::ePhysicalDeviceBlendOperationAdvancedPropertiesEXT;\n    void *                              pNext                                 = {};\n    uint32_t                            advancedBlendMaxColorAttachments      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        advancedBlendIndependentBlend         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        advancedBlendNonPremultipliedSrcColor = {};\n    VULKAN_HPP_NAMESPACE::Bool32        advancedBlendNonPremultipliedDstColor = {};\n    VULKAN_HPP_NAMESPACE::Bool32        advancedBlendCorrelatedOverlap        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        advancedBlendAllOperations            = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceBlendOperationAdvancedPropertiesEXT>\n  {\n    using Type = PhysicalDeviceBlendOperationAdvancedPropertiesEXT;\n  };\n\n  struct PhysicalDeviceBorderColorSwizzleFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceBorderColorSwizzleFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceBorderColorSwizzleFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceBorderColorSwizzleFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 borderColorSwizzle_          = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32 borderColorSwizzleFromImage_ = {},\n                                                                      void *                       pNext_                       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , borderColorSwizzle{ borderColorSwizzle_ }\n      , borderColorSwizzleFromImage{ borderColorSwizzleFromImage_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceBorderColorSwizzleFeaturesEXT( PhysicalDeviceBorderColorSwizzleFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceBorderColorSwizzleFeaturesEXT( VkPhysicalDeviceBorderColorSwizzleFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceBorderColorSwizzleFeaturesEXT( *reinterpret_cast<PhysicalDeviceBorderColorSwizzleFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceBorderColorSwizzleFeaturesEXT & operator=( PhysicalDeviceBorderColorSwizzleFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceBorderColorSwizzleFeaturesEXT & operator=( VkPhysicalDeviceBorderColorSwizzleFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceBorderColorSwizzleFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceBorderColorSwizzleFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceBorderColorSwizzleFeaturesEXT &\n      setBorderColorSwizzle( VULKAN_HPP_NAMESPACE::Bool32 borderColorSwizzle_ ) VULKAN_HPP_NOEXCEPT\n    {\n      borderColorSwizzle = borderColorSwizzle_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceBorderColorSwizzleFeaturesEXT &\n      setBorderColorSwizzleFromImage( VULKAN_HPP_NAMESPACE::Bool32 borderColorSwizzleFromImage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      borderColorSwizzleFromImage = borderColorSwizzleFromImage_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceBorderColorSwizzleFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceBorderColorSwizzleFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceBorderColorSwizzleFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceBorderColorSwizzleFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, borderColorSwizzle, borderColorSwizzleFromImage );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceBorderColorSwizzleFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceBorderColorSwizzleFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( borderColorSwizzle == rhs.borderColorSwizzle ) &&\n             ( borderColorSwizzleFromImage == rhs.borderColorSwizzleFromImage );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceBorderColorSwizzleFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                       = StructureType::ePhysicalDeviceBorderColorSwizzleFeaturesEXT;\n    void *                              pNext                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        borderColorSwizzle          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        borderColorSwizzleFromImage = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceBorderColorSwizzleFeaturesEXT>\n  {\n    using Type = PhysicalDeviceBorderColorSwizzleFeaturesEXT;\n  };\n\n  struct PhysicalDeviceBufferDeviceAddressFeatures\n  {\n    using NativeType = VkPhysicalDeviceBufferDeviceAddressFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceBufferDeviceAddressFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceBufferDeviceAddressFeatures( VULKAN_HPP_NAMESPACE::Bool32 bufferDeviceAddress_              = {},\n                                                                    VULKAN_HPP_NAMESPACE::Bool32 bufferDeviceAddressCaptureReplay_ = {},\n                                                                    VULKAN_HPP_NAMESPACE::Bool32 bufferDeviceAddressMultiDevice_   = {},\n                                                                    void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , bufferDeviceAddress{ bufferDeviceAddress_ }\n      , bufferDeviceAddressCaptureReplay{ bufferDeviceAddressCaptureReplay_ }\n      , bufferDeviceAddressMultiDevice{ bufferDeviceAddressMultiDevice_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceBufferDeviceAddressFeatures( PhysicalDeviceBufferDeviceAddressFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceBufferDeviceAddressFeatures( VkPhysicalDeviceBufferDeviceAddressFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceBufferDeviceAddressFeatures( *reinterpret_cast<PhysicalDeviceBufferDeviceAddressFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceBufferDeviceAddressFeatures & operator=( PhysicalDeviceBufferDeviceAddressFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceBufferDeviceAddressFeatures & operator=( VkPhysicalDeviceBufferDeviceAddressFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceBufferDeviceAddressFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceBufferDeviceAddressFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceBufferDeviceAddressFeatures &\n      setBufferDeviceAddress( VULKAN_HPP_NAMESPACE::Bool32 bufferDeviceAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferDeviceAddress = bufferDeviceAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceBufferDeviceAddressFeatures &\n      setBufferDeviceAddressCaptureReplay( VULKAN_HPP_NAMESPACE::Bool32 bufferDeviceAddressCaptureReplay_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferDeviceAddressCaptureReplay = bufferDeviceAddressCaptureReplay_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceBufferDeviceAddressFeatures &\n      setBufferDeviceAddressMultiDevice( VULKAN_HPP_NAMESPACE::Bool32 bufferDeviceAddressMultiDevice_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferDeviceAddressMultiDevice = bufferDeviceAddressMultiDevice_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceBufferDeviceAddressFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceBufferDeviceAddressFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, bufferDeviceAddress, bufferDeviceAddressCaptureReplay, bufferDeviceAddressMultiDevice );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceBufferDeviceAddressFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceBufferDeviceAddressFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( bufferDeviceAddress == rhs.bufferDeviceAddress ) &&\n             ( bufferDeviceAddressCaptureReplay == rhs.bufferDeviceAddressCaptureReplay ) &&\n             ( bufferDeviceAddressMultiDevice == rhs.bufferDeviceAddressMultiDevice );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceBufferDeviceAddressFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                            = StructureType::ePhysicalDeviceBufferDeviceAddressFeatures;\n    void *                              pNext                            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        bufferDeviceAddress              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        bufferDeviceAddressCaptureReplay = {};\n    VULKAN_HPP_NAMESPACE::Bool32        bufferDeviceAddressMultiDevice   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceBufferDeviceAddressFeatures>\n  {\n    using Type = PhysicalDeviceBufferDeviceAddressFeatures;\n  };\n\n  using PhysicalDeviceBufferDeviceAddressFeaturesKHR = PhysicalDeviceBufferDeviceAddressFeatures;\n\n  struct PhysicalDeviceBufferDeviceAddressFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceBufferDeviceAddressFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceBufferDeviceAddressFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceBufferDeviceAddressFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 bufferDeviceAddress_              = {},\n                                                                       VULKAN_HPP_NAMESPACE::Bool32 bufferDeviceAddressCaptureReplay_ = {},\n                                                                       VULKAN_HPP_NAMESPACE::Bool32 bufferDeviceAddressMultiDevice_   = {},\n                                                                       void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , bufferDeviceAddress{ bufferDeviceAddress_ }\n      , bufferDeviceAddressCaptureReplay{ bufferDeviceAddressCaptureReplay_ }\n      , bufferDeviceAddressMultiDevice{ bufferDeviceAddressMultiDevice_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceBufferDeviceAddressFeaturesEXT( PhysicalDeviceBufferDeviceAddressFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceBufferDeviceAddressFeaturesEXT( VkPhysicalDeviceBufferDeviceAddressFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceBufferDeviceAddressFeaturesEXT( *reinterpret_cast<PhysicalDeviceBufferDeviceAddressFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceBufferDeviceAddressFeaturesEXT & operator=( PhysicalDeviceBufferDeviceAddressFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceBufferDeviceAddressFeaturesEXT & operator=( VkPhysicalDeviceBufferDeviceAddressFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceBufferDeviceAddressFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceBufferDeviceAddressFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceBufferDeviceAddressFeaturesEXT &\n      setBufferDeviceAddress( VULKAN_HPP_NAMESPACE::Bool32 bufferDeviceAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferDeviceAddress = bufferDeviceAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceBufferDeviceAddressFeaturesEXT &\n      setBufferDeviceAddressCaptureReplay( VULKAN_HPP_NAMESPACE::Bool32 bufferDeviceAddressCaptureReplay_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferDeviceAddressCaptureReplay = bufferDeviceAddressCaptureReplay_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceBufferDeviceAddressFeaturesEXT &\n      setBufferDeviceAddressMultiDevice( VULKAN_HPP_NAMESPACE::Bool32 bufferDeviceAddressMultiDevice_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferDeviceAddressMultiDevice = bufferDeviceAddressMultiDevice_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceBufferDeviceAddressFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceBufferDeviceAddressFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, bufferDeviceAddress, bufferDeviceAddressCaptureReplay, bufferDeviceAddressMultiDevice );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceBufferDeviceAddressFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceBufferDeviceAddressFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( bufferDeviceAddress == rhs.bufferDeviceAddress ) &&\n             ( bufferDeviceAddressCaptureReplay == rhs.bufferDeviceAddressCaptureReplay ) &&\n             ( bufferDeviceAddressMultiDevice == rhs.bufferDeviceAddressMultiDevice );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceBufferDeviceAddressFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                            = StructureType::ePhysicalDeviceBufferDeviceAddressFeaturesEXT;\n    void *                              pNext                            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        bufferDeviceAddress              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        bufferDeviceAddressCaptureReplay = {};\n    VULKAN_HPP_NAMESPACE::Bool32        bufferDeviceAddressMultiDevice   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceBufferDeviceAddressFeaturesEXT>\n  {\n    using Type = PhysicalDeviceBufferDeviceAddressFeaturesEXT;\n  };\n\n  using PhysicalDeviceBufferAddressFeaturesEXT = PhysicalDeviceBufferDeviceAddressFeaturesEXT;\n\n  struct PhysicalDeviceClusterAccelerationStructureFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceClusterAccelerationStructureFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceClusterAccelerationStructureFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceClusterAccelerationStructureFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 clusterAccelerationStructure_ = {},\n                                                                               void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , clusterAccelerationStructure{ clusterAccelerationStructure_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceClusterAccelerationStructureFeaturesNV( PhysicalDeviceClusterAccelerationStructureFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceClusterAccelerationStructureFeaturesNV( VkPhysicalDeviceClusterAccelerationStructureFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceClusterAccelerationStructureFeaturesNV( *reinterpret_cast<PhysicalDeviceClusterAccelerationStructureFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceClusterAccelerationStructureFeaturesNV &\n      operator=( PhysicalDeviceClusterAccelerationStructureFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceClusterAccelerationStructureFeaturesNV & operator=( VkPhysicalDeviceClusterAccelerationStructureFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterAccelerationStructureFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceClusterAccelerationStructureFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceClusterAccelerationStructureFeaturesNV &\n      setClusterAccelerationStructure( VULKAN_HPP_NAMESPACE::Bool32 clusterAccelerationStructure_ ) VULKAN_HPP_NOEXCEPT\n    {\n      clusterAccelerationStructure = clusterAccelerationStructure_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceClusterAccelerationStructureFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceClusterAccelerationStructureFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceClusterAccelerationStructureFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceClusterAccelerationStructureFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, clusterAccelerationStructure );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceClusterAccelerationStructureFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceClusterAccelerationStructureFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( clusterAccelerationStructure == rhs.clusterAccelerationStructure );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceClusterAccelerationStructureFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                        = StructureType::ePhysicalDeviceClusterAccelerationStructureFeaturesNV;\n    void *                              pNext                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        clusterAccelerationStructure = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceClusterAccelerationStructureFeaturesNV>\n  {\n    using Type = PhysicalDeviceClusterAccelerationStructureFeaturesNV;\n  };\n\n  struct PhysicalDeviceClusterAccelerationStructurePropertiesNV\n  {\n    using NativeType = VkPhysicalDeviceClusterAccelerationStructurePropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceClusterAccelerationStructurePropertiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceClusterAccelerationStructurePropertiesNV( uint32_t maxVerticesPerCluster_              = {},\n                                                                                 uint32_t maxTrianglesPerCluster_             = {},\n                                                                                 uint32_t clusterScratchByteAlignment_        = {},\n                                                                                 uint32_t clusterByteAlignment_               = {},\n                                                                                 uint32_t clusterTemplateByteAlignment_       = {},\n                                                                                 uint32_t clusterBottomLevelByteAlignment_    = {},\n                                                                                 uint32_t clusterTemplateBoundsByteAlignment_ = {},\n                                                                                 uint32_t maxClusterGeometryIndex_            = {},\n                                                                                 void *   pNext_                              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxVerticesPerCluster{ maxVerticesPerCluster_ }\n      , maxTrianglesPerCluster{ maxTrianglesPerCluster_ }\n      , clusterScratchByteAlignment{ clusterScratchByteAlignment_ }\n      , clusterByteAlignment{ clusterByteAlignment_ }\n      , clusterTemplateByteAlignment{ clusterTemplateByteAlignment_ }\n      , clusterBottomLevelByteAlignment{ clusterBottomLevelByteAlignment_ }\n      , clusterTemplateBoundsByteAlignment{ clusterTemplateBoundsByteAlignment_ }\n      , maxClusterGeometryIndex{ maxClusterGeometryIndex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceClusterAccelerationStructurePropertiesNV( PhysicalDeviceClusterAccelerationStructurePropertiesNV const & rhs )\n      VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceClusterAccelerationStructurePropertiesNV( VkPhysicalDeviceClusterAccelerationStructurePropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceClusterAccelerationStructurePropertiesNV( *reinterpret_cast<PhysicalDeviceClusterAccelerationStructurePropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceClusterAccelerationStructurePropertiesNV &\n      operator=( PhysicalDeviceClusterAccelerationStructurePropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceClusterAccelerationStructurePropertiesNV &\n      operator=( VkPhysicalDeviceClusterAccelerationStructurePropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterAccelerationStructurePropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceClusterAccelerationStructurePropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceClusterAccelerationStructurePropertiesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceClusterAccelerationStructurePropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceClusterAccelerationStructurePropertiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       maxVerticesPerCluster,\n                       maxTrianglesPerCluster,\n                       clusterScratchByteAlignment,\n                       clusterByteAlignment,\n                       clusterTemplateByteAlignment,\n                       clusterBottomLevelByteAlignment,\n                       clusterTemplateBoundsByteAlignment,\n                       maxClusterGeometryIndex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceClusterAccelerationStructurePropertiesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceClusterAccelerationStructurePropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxVerticesPerCluster == rhs.maxVerticesPerCluster ) &&\n             ( maxTrianglesPerCluster == rhs.maxTrianglesPerCluster ) && ( clusterScratchByteAlignment == rhs.clusterScratchByteAlignment ) &&\n             ( clusterByteAlignment == rhs.clusterByteAlignment ) && ( clusterTemplateByteAlignment == rhs.clusterTemplateByteAlignment ) &&\n             ( clusterBottomLevelByteAlignment == rhs.clusterBottomLevelByteAlignment ) &&\n             ( clusterTemplateBoundsByteAlignment == rhs.clusterTemplateBoundsByteAlignment ) && ( maxClusterGeometryIndex == rhs.maxClusterGeometryIndex );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceClusterAccelerationStructurePropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                              = StructureType::ePhysicalDeviceClusterAccelerationStructurePropertiesNV;\n    void *                              pNext                              = {};\n    uint32_t                            maxVerticesPerCluster              = {};\n    uint32_t                            maxTrianglesPerCluster             = {};\n    uint32_t                            clusterScratchByteAlignment        = {};\n    uint32_t                            clusterByteAlignment               = {};\n    uint32_t                            clusterTemplateByteAlignment       = {};\n    uint32_t                            clusterBottomLevelByteAlignment    = {};\n    uint32_t                            clusterTemplateBoundsByteAlignment = {};\n    uint32_t                            maxClusterGeometryIndex            = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceClusterAccelerationStructurePropertiesNV>\n  {\n    using Type = PhysicalDeviceClusterAccelerationStructurePropertiesNV;\n  };\n\n  struct PhysicalDeviceClusterCullingShaderFeaturesHUAWEI\n  {\n    using NativeType = VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceClusterCullingShaderFeaturesHUAWEI;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceClusterCullingShaderFeaturesHUAWEI( VULKAN_HPP_NAMESPACE::Bool32 clustercullingShader_          = {},\n                                                                           VULKAN_HPP_NAMESPACE::Bool32 multiviewClusterCullingShader_ = {},\n                                                                           void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , clustercullingShader{ clustercullingShader_ }\n      , multiviewClusterCullingShader{ multiviewClusterCullingShader_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceClusterCullingShaderFeaturesHUAWEI( PhysicalDeviceClusterCullingShaderFeaturesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceClusterCullingShaderFeaturesHUAWEI( VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceClusterCullingShaderFeaturesHUAWEI( *reinterpret_cast<PhysicalDeviceClusterCullingShaderFeaturesHUAWEI const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceClusterCullingShaderFeaturesHUAWEI & operator=( PhysicalDeviceClusterCullingShaderFeaturesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceClusterCullingShaderFeaturesHUAWEI & operator=( VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterCullingShaderFeaturesHUAWEI const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceClusterCullingShaderFeaturesHUAWEI & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceClusterCullingShaderFeaturesHUAWEI &\n      setClustercullingShader( VULKAN_HPP_NAMESPACE::Bool32 clustercullingShader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      clustercullingShader = clustercullingShader_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceClusterCullingShaderFeaturesHUAWEI &\n      setMultiviewClusterCullingShader( VULKAN_HPP_NAMESPACE::Bool32 multiviewClusterCullingShader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      multiviewClusterCullingShader = multiviewClusterCullingShader_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI *>( this );\n    }\n\n    operator VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, clustercullingShader, multiviewClusterCullingShader );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceClusterCullingShaderFeaturesHUAWEI const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceClusterCullingShaderFeaturesHUAWEI const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( clustercullingShader == rhs.clustercullingShader ) &&\n             ( multiviewClusterCullingShader == rhs.multiviewClusterCullingShader );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceClusterCullingShaderFeaturesHUAWEI const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                         = StructureType::ePhysicalDeviceClusterCullingShaderFeaturesHUAWEI;\n    void *                              pNext                         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        clustercullingShader          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        multiviewClusterCullingShader = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceClusterCullingShaderFeaturesHUAWEI>\n  {\n    using Type = PhysicalDeviceClusterCullingShaderFeaturesHUAWEI;\n  };\n\n  struct PhysicalDeviceClusterCullingShaderPropertiesHUAWEI\n  {\n    using NativeType = VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceClusterCullingShaderPropertiesHUAWEI;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceClusterCullingShaderPropertiesHUAWEI( std::array<uint32_t, 3> const &  maxWorkGroupCount_             = {},\n                                                                                std::array<uint32_t, 3> const &  maxWorkGroupSize_              = {},\n                                                                                uint32_t                         maxOutputClusterCount_         = {},\n                                                                                VULKAN_HPP_NAMESPACE::DeviceSize indirectBufferOffsetAlignment_ = {},\n                                                                                void *                           pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxWorkGroupCount{ maxWorkGroupCount_ }\n      , maxWorkGroupSize{ maxWorkGroupSize_ }\n      , maxOutputClusterCount{ maxOutputClusterCount_ }\n      , indirectBufferOffsetAlignment{ indirectBufferOffsetAlignment_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14\n      PhysicalDeviceClusterCullingShaderPropertiesHUAWEI( PhysicalDeviceClusterCullingShaderPropertiesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceClusterCullingShaderPropertiesHUAWEI( VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceClusterCullingShaderPropertiesHUAWEI( *reinterpret_cast<PhysicalDeviceClusterCullingShaderPropertiesHUAWEI const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceClusterCullingShaderPropertiesHUAWEI &\n      operator=( PhysicalDeviceClusterCullingShaderPropertiesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceClusterCullingShaderPropertiesHUAWEI & operator=( VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterCullingShaderPropertiesHUAWEI const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI *>( this );\n    }\n\n    operator VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxWorkGroupCount, maxWorkGroupSize, maxOutputClusterCount, indirectBufferOffsetAlignment );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceClusterCullingShaderPropertiesHUAWEI const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceClusterCullingShaderPropertiesHUAWEI const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxWorkGroupCount == rhs.maxWorkGroupCount ) &&\n             ( maxWorkGroupSize == rhs.maxWorkGroupSize ) && ( maxOutputClusterCount == rhs.maxOutputClusterCount ) &&\n             ( indirectBufferOffsetAlignment == rhs.indirectBufferOffsetAlignment );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceClusterCullingShaderPropertiesHUAWEI const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType                         = StructureType::ePhysicalDeviceClusterCullingShaderPropertiesHUAWEI;\n    void *                                            pNext                         = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> maxWorkGroupCount             = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> maxWorkGroupSize              = {};\n    uint32_t                                          maxOutputClusterCount         = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                  indirectBufferOffsetAlignment = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceClusterCullingShaderPropertiesHUAWEI>\n  {\n    using Type = PhysicalDeviceClusterCullingShaderPropertiesHUAWEI;\n  };\n\n  struct PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI\n  {\n    using NativeType = VkPhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI( VULKAN_HPP_NAMESPACE::Bool32 clusterShadingRate_ = {},\n                                                                              void *                       pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , clusterShadingRate{ clusterShadingRate_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI( PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI( VkPhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI( *reinterpret_cast<PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI &\n      operator=( PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI & operator=( VkPhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI &\n      setClusterShadingRate( VULKAN_HPP_NAMESPACE::Bool32 clusterShadingRate_ ) VULKAN_HPP_NOEXCEPT\n    {\n      clusterShadingRate = clusterShadingRate_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI *>( this );\n    }\n\n    operator VkPhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, clusterShadingRate );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( clusterShadingRate == rhs.clusterShadingRate );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType              = StructureType::ePhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI;\n    void *                              pNext              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        clusterShadingRate = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI>\n  {\n    using Type = PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI;\n  };\n\n  struct PhysicalDeviceCoherentMemoryFeaturesAMD\n  {\n    using NativeType = VkPhysicalDeviceCoherentMemoryFeaturesAMD;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceCoherentMemoryFeaturesAMD;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCoherentMemoryFeaturesAMD( VULKAN_HPP_NAMESPACE::Bool32 deviceCoherentMemory_ = {},\n                                                                  void *                       pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , deviceCoherentMemory{ deviceCoherentMemory_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCoherentMemoryFeaturesAMD( PhysicalDeviceCoherentMemoryFeaturesAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceCoherentMemoryFeaturesAMD( VkPhysicalDeviceCoherentMemoryFeaturesAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceCoherentMemoryFeaturesAMD( *reinterpret_cast<PhysicalDeviceCoherentMemoryFeaturesAMD const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceCoherentMemoryFeaturesAMD & operator=( PhysicalDeviceCoherentMemoryFeaturesAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceCoherentMemoryFeaturesAMD & operator=( VkPhysicalDeviceCoherentMemoryFeaturesAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceCoherentMemoryFeaturesAMD const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCoherentMemoryFeaturesAMD & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCoherentMemoryFeaturesAMD &\n      setDeviceCoherentMemory( VULKAN_HPP_NAMESPACE::Bool32 deviceCoherentMemory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceCoherentMemory = deviceCoherentMemory_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceCoherentMemoryFeaturesAMD const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceCoherentMemoryFeaturesAMD *>( this );\n    }\n\n    operator VkPhysicalDeviceCoherentMemoryFeaturesAMD &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceCoherentMemoryFeaturesAMD *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, deviceCoherentMemory );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceCoherentMemoryFeaturesAMD const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceCoherentMemoryFeaturesAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( deviceCoherentMemory == rhs.deviceCoherentMemory );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceCoherentMemoryFeaturesAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                = StructureType::ePhysicalDeviceCoherentMemoryFeaturesAMD;\n    void *                              pNext                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        deviceCoherentMemory = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceCoherentMemoryFeaturesAMD>\n  {\n    using Type = PhysicalDeviceCoherentMemoryFeaturesAMD;\n  };\n\n  struct PhysicalDeviceColorWriteEnableFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceColorWriteEnableFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceColorWriteEnableFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceColorWriteEnableFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 colorWriteEnable_ = {},\n                                                                    void *                       pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , colorWriteEnable{ colorWriteEnable_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceColorWriteEnableFeaturesEXT( PhysicalDeviceColorWriteEnableFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceColorWriteEnableFeaturesEXT( VkPhysicalDeviceColorWriteEnableFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceColorWriteEnableFeaturesEXT( *reinterpret_cast<PhysicalDeviceColorWriteEnableFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceColorWriteEnableFeaturesEXT & operator=( PhysicalDeviceColorWriteEnableFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceColorWriteEnableFeaturesEXT & operator=( VkPhysicalDeviceColorWriteEnableFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceColorWriteEnableFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceColorWriteEnableFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceColorWriteEnableFeaturesEXT &\n      setColorWriteEnable( VULKAN_HPP_NAMESPACE::Bool32 colorWriteEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorWriteEnable = colorWriteEnable_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceColorWriteEnableFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceColorWriteEnableFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceColorWriteEnableFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceColorWriteEnableFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, colorWriteEnable );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceColorWriteEnableFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceColorWriteEnableFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( colorWriteEnable == rhs.colorWriteEnable );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceColorWriteEnableFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType            = StructureType::ePhysicalDeviceColorWriteEnableFeaturesEXT;\n    void *                              pNext            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        colorWriteEnable = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceColorWriteEnableFeaturesEXT>\n  {\n    using Type = PhysicalDeviceColorWriteEnableFeaturesEXT;\n  };\n\n  struct PhysicalDeviceCommandBufferInheritanceFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceCommandBufferInheritanceFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceCommandBufferInheritanceFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCommandBufferInheritanceFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 commandBufferInheritance_ = {},\n                                                                           void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , commandBufferInheritance{ commandBufferInheritance_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceCommandBufferInheritanceFeaturesNV( PhysicalDeviceCommandBufferInheritanceFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceCommandBufferInheritanceFeaturesNV( VkPhysicalDeviceCommandBufferInheritanceFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceCommandBufferInheritanceFeaturesNV( *reinterpret_cast<PhysicalDeviceCommandBufferInheritanceFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceCommandBufferInheritanceFeaturesNV & operator=( PhysicalDeviceCommandBufferInheritanceFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceCommandBufferInheritanceFeaturesNV & operator=( VkPhysicalDeviceCommandBufferInheritanceFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceCommandBufferInheritanceFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCommandBufferInheritanceFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCommandBufferInheritanceFeaturesNV &\n      setCommandBufferInheritance( VULKAN_HPP_NAMESPACE::Bool32 commandBufferInheritance_ ) VULKAN_HPP_NOEXCEPT\n    {\n      commandBufferInheritance = commandBufferInheritance_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceCommandBufferInheritanceFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceCommandBufferInheritanceFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceCommandBufferInheritanceFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceCommandBufferInheritanceFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, commandBufferInheritance );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceCommandBufferInheritanceFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceCommandBufferInheritanceFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( commandBufferInheritance == rhs.commandBufferInheritance );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceCommandBufferInheritanceFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                    = StructureType::ePhysicalDeviceCommandBufferInheritanceFeaturesNV;\n    void *                              pNext                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        commandBufferInheritance = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceCommandBufferInheritanceFeaturesNV>\n  {\n    using Type = PhysicalDeviceCommandBufferInheritanceFeaturesNV;\n  };\n\n  struct PhysicalDeviceComputeShaderDerivativesFeaturesKHR\n  {\n    using NativeType = VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceComputeShaderDerivativesFeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceComputeShaderDerivativesFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 computeDerivativeGroupQuads_  = {},\n                                                                            VULKAN_HPP_NAMESPACE::Bool32 computeDerivativeGroupLinear_ = {},\n                                                                            void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , computeDerivativeGroupQuads{ computeDerivativeGroupQuads_ }\n      , computeDerivativeGroupLinear{ computeDerivativeGroupLinear_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceComputeShaderDerivativesFeaturesKHR( PhysicalDeviceComputeShaderDerivativesFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceComputeShaderDerivativesFeaturesKHR( VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceComputeShaderDerivativesFeaturesKHR( *reinterpret_cast<PhysicalDeviceComputeShaderDerivativesFeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceComputeShaderDerivativesFeaturesKHR &\n      operator=( PhysicalDeviceComputeShaderDerivativesFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceComputeShaderDerivativesFeaturesKHR & operator=( VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceComputeShaderDerivativesFeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceComputeShaderDerivativesFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceComputeShaderDerivativesFeaturesKHR &\n      setComputeDerivativeGroupQuads( VULKAN_HPP_NAMESPACE::Bool32 computeDerivativeGroupQuads_ ) VULKAN_HPP_NOEXCEPT\n    {\n      computeDerivativeGroupQuads = computeDerivativeGroupQuads_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceComputeShaderDerivativesFeaturesKHR &\n      setComputeDerivativeGroupLinear( VULKAN_HPP_NAMESPACE::Bool32 computeDerivativeGroupLinear_ ) VULKAN_HPP_NOEXCEPT\n    {\n      computeDerivativeGroupLinear = computeDerivativeGroupLinear_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceComputeShaderDerivativesFeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, computeDerivativeGroupQuads, computeDerivativeGroupLinear );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceComputeShaderDerivativesFeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceComputeShaderDerivativesFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( computeDerivativeGroupQuads == rhs.computeDerivativeGroupQuads ) &&\n             ( computeDerivativeGroupLinear == rhs.computeDerivativeGroupLinear );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceComputeShaderDerivativesFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                        = StructureType::ePhysicalDeviceComputeShaderDerivativesFeaturesKHR;\n    void *                              pNext                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        computeDerivativeGroupQuads  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        computeDerivativeGroupLinear = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceComputeShaderDerivativesFeaturesKHR>\n  {\n    using Type = PhysicalDeviceComputeShaderDerivativesFeaturesKHR;\n  };\n\n  using PhysicalDeviceComputeShaderDerivativesFeaturesNV = PhysicalDeviceComputeShaderDerivativesFeaturesKHR;\n\n  struct PhysicalDeviceComputeShaderDerivativesPropertiesKHR\n  {\n    using NativeType = VkPhysicalDeviceComputeShaderDerivativesPropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceComputeShaderDerivativesPropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceComputeShaderDerivativesPropertiesKHR( VULKAN_HPP_NAMESPACE::Bool32 meshAndTaskShaderDerivatives_ = {},\n                                                                              void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , meshAndTaskShaderDerivatives{ meshAndTaskShaderDerivatives_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceComputeShaderDerivativesPropertiesKHR( PhysicalDeviceComputeShaderDerivativesPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceComputeShaderDerivativesPropertiesKHR( VkPhysicalDeviceComputeShaderDerivativesPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceComputeShaderDerivativesPropertiesKHR( *reinterpret_cast<PhysicalDeviceComputeShaderDerivativesPropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceComputeShaderDerivativesPropertiesKHR &\n      operator=( PhysicalDeviceComputeShaderDerivativesPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceComputeShaderDerivativesPropertiesKHR & operator=( VkPhysicalDeviceComputeShaderDerivativesPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceComputeShaderDerivativesPropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceComputeShaderDerivativesPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceComputeShaderDerivativesPropertiesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceComputeShaderDerivativesPropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceComputeShaderDerivativesPropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, meshAndTaskShaderDerivatives );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceComputeShaderDerivativesPropertiesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceComputeShaderDerivativesPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( meshAndTaskShaderDerivatives == rhs.meshAndTaskShaderDerivatives );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceComputeShaderDerivativesPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                        = StructureType::ePhysicalDeviceComputeShaderDerivativesPropertiesKHR;\n    void *                              pNext                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        meshAndTaskShaderDerivatives = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceComputeShaderDerivativesPropertiesKHR>\n  {\n    using Type = PhysicalDeviceComputeShaderDerivativesPropertiesKHR;\n  };\n\n  struct PhysicalDeviceConditionalRenderingFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceConditionalRenderingFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceConditionalRenderingFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceConditionalRenderingFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 conditionalRendering_          = {},\n                                                                        VULKAN_HPP_NAMESPACE::Bool32 inheritedConditionalRendering_ = {},\n                                                                        void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , conditionalRendering{ conditionalRendering_ }\n      , inheritedConditionalRendering{ inheritedConditionalRendering_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceConditionalRenderingFeaturesEXT( PhysicalDeviceConditionalRenderingFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceConditionalRenderingFeaturesEXT( VkPhysicalDeviceConditionalRenderingFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceConditionalRenderingFeaturesEXT( *reinterpret_cast<PhysicalDeviceConditionalRenderingFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceConditionalRenderingFeaturesEXT & operator=( PhysicalDeviceConditionalRenderingFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceConditionalRenderingFeaturesEXT & operator=( VkPhysicalDeviceConditionalRenderingFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceConditionalRenderingFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceConditionalRenderingFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceConditionalRenderingFeaturesEXT &\n      setConditionalRendering( VULKAN_HPP_NAMESPACE::Bool32 conditionalRendering_ ) VULKAN_HPP_NOEXCEPT\n    {\n      conditionalRendering = conditionalRendering_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceConditionalRenderingFeaturesEXT &\n      setInheritedConditionalRendering( VULKAN_HPP_NAMESPACE::Bool32 inheritedConditionalRendering_ ) VULKAN_HPP_NOEXCEPT\n    {\n      inheritedConditionalRendering = inheritedConditionalRendering_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceConditionalRenderingFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceConditionalRenderingFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceConditionalRenderingFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceConditionalRenderingFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, conditionalRendering, inheritedConditionalRendering );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceConditionalRenderingFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceConditionalRenderingFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( conditionalRendering == rhs.conditionalRendering ) &&\n             ( inheritedConditionalRendering == rhs.inheritedConditionalRendering );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceConditionalRenderingFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                         = StructureType::ePhysicalDeviceConditionalRenderingFeaturesEXT;\n    void *                              pNext                         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        conditionalRendering          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        inheritedConditionalRendering = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceConditionalRenderingFeaturesEXT>\n  {\n    using Type = PhysicalDeviceConditionalRenderingFeaturesEXT;\n  };\n\n  struct PhysicalDeviceConservativeRasterizationPropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceConservativeRasterizationPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceConservativeRasterizationPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceConservativeRasterizationPropertiesEXT( float                        primitiveOverestimationSize_                 = {},\n                                                                               float                        maxExtraPrimitiveOverestimationSize_         = {},\n                                                                               float                        extraPrimitiveOverestimationSizeGranularity_ = {},\n                                                                               VULKAN_HPP_NAMESPACE::Bool32 primitiveUnderestimation_                    = {},\n                                                                               VULKAN_HPP_NAMESPACE::Bool32 conservativePointAndLineRasterization_       = {},\n                                                                               VULKAN_HPP_NAMESPACE::Bool32 degenerateTrianglesRasterized_               = {},\n                                                                               VULKAN_HPP_NAMESPACE::Bool32 degenerateLinesRasterized_                   = {},\n                                                                               VULKAN_HPP_NAMESPACE::Bool32 fullyCoveredFragmentShaderInputVariable_     = {},\n                                                                               VULKAN_HPP_NAMESPACE::Bool32 conservativeRasterizationPostDepthCoverage_  = {},\n                                                                               void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , primitiveOverestimationSize{ primitiveOverestimationSize_ }\n      , maxExtraPrimitiveOverestimationSize{ maxExtraPrimitiveOverestimationSize_ }\n      , extraPrimitiveOverestimationSizeGranularity{ extraPrimitiveOverestimationSizeGranularity_ }\n      , primitiveUnderestimation{ primitiveUnderestimation_ }\n      , conservativePointAndLineRasterization{ conservativePointAndLineRasterization_ }\n      , degenerateTrianglesRasterized{ degenerateTrianglesRasterized_ }\n      , degenerateLinesRasterized{ degenerateLinesRasterized_ }\n      , fullyCoveredFragmentShaderInputVariable{ fullyCoveredFragmentShaderInputVariable_ }\n      , conservativeRasterizationPostDepthCoverage{ conservativeRasterizationPostDepthCoverage_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceConservativeRasterizationPropertiesEXT( PhysicalDeviceConservativeRasterizationPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceConservativeRasterizationPropertiesEXT( VkPhysicalDeviceConservativeRasterizationPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceConservativeRasterizationPropertiesEXT( *reinterpret_cast<PhysicalDeviceConservativeRasterizationPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceConservativeRasterizationPropertiesEXT &\n      operator=( PhysicalDeviceConservativeRasterizationPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceConservativeRasterizationPropertiesEXT & operator=( VkPhysicalDeviceConservativeRasterizationPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceConservativeRasterizationPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceConservativeRasterizationPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceConservativeRasterizationPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceConservativeRasterizationPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceConservativeRasterizationPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               float const &,\n               float const &,\n               float const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       primitiveOverestimationSize,\n                       maxExtraPrimitiveOverestimationSize,\n                       extraPrimitiveOverestimationSizeGranularity,\n                       primitiveUnderestimation,\n                       conservativePointAndLineRasterization,\n                       degenerateTrianglesRasterized,\n                       degenerateLinesRasterized,\n                       fullyCoveredFragmentShaderInputVariable,\n                       conservativeRasterizationPostDepthCoverage );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceConservativeRasterizationPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceConservativeRasterizationPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( primitiveOverestimationSize == rhs.primitiveOverestimationSize ) &&\n             ( maxExtraPrimitiveOverestimationSize == rhs.maxExtraPrimitiveOverestimationSize ) &&\n             ( extraPrimitiveOverestimationSizeGranularity == rhs.extraPrimitiveOverestimationSizeGranularity ) &&\n             ( primitiveUnderestimation == rhs.primitiveUnderestimation ) &&\n             ( conservativePointAndLineRasterization == rhs.conservativePointAndLineRasterization ) &&\n             ( degenerateTrianglesRasterized == rhs.degenerateTrianglesRasterized ) && ( degenerateLinesRasterized == rhs.degenerateLinesRasterized ) &&\n             ( fullyCoveredFragmentShaderInputVariable == rhs.fullyCoveredFragmentShaderInputVariable ) &&\n             ( conservativeRasterizationPostDepthCoverage == rhs.conservativeRasterizationPostDepthCoverage );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceConservativeRasterizationPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                       = StructureType::ePhysicalDeviceConservativeRasterizationPropertiesEXT;\n    void *                              pNext                                       = {};\n    float                               primitiveOverestimationSize                 = {};\n    float                               maxExtraPrimitiveOverestimationSize         = {};\n    float                               extraPrimitiveOverestimationSizeGranularity = {};\n    VULKAN_HPP_NAMESPACE::Bool32        primitiveUnderestimation                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        conservativePointAndLineRasterization       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        degenerateTrianglesRasterized               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        degenerateLinesRasterized                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        fullyCoveredFragmentShaderInputVariable     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        conservativeRasterizationPostDepthCoverage  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceConservativeRasterizationPropertiesEXT>\n  {\n    using Type = PhysicalDeviceConservativeRasterizationPropertiesEXT;\n  };\n\n  struct PhysicalDeviceCooperativeMatrix2FeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceCooperativeMatrix2FeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceCooperativeMatrix2FeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCooperativeMatrix2FeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 cooperativeMatrixWorkgroupScope_       = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 cooperativeMatrixFlexibleDimensions_   = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 cooperativeMatrixReductions_           = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 cooperativeMatrixConversions_          = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 cooperativeMatrixPerElementOperations_ = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 cooperativeMatrixTensorAddressing_     = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 cooperativeMatrixBlockLoads_           = {},\n                                                                     void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , cooperativeMatrixWorkgroupScope{ cooperativeMatrixWorkgroupScope_ }\n      , cooperativeMatrixFlexibleDimensions{ cooperativeMatrixFlexibleDimensions_ }\n      , cooperativeMatrixReductions{ cooperativeMatrixReductions_ }\n      , cooperativeMatrixConversions{ cooperativeMatrixConversions_ }\n      , cooperativeMatrixPerElementOperations{ cooperativeMatrixPerElementOperations_ }\n      , cooperativeMatrixTensorAddressing{ cooperativeMatrixTensorAddressing_ }\n      , cooperativeMatrixBlockLoads{ cooperativeMatrixBlockLoads_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCooperativeMatrix2FeaturesNV( PhysicalDeviceCooperativeMatrix2FeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceCooperativeMatrix2FeaturesNV( VkPhysicalDeviceCooperativeMatrix2FeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceCooperativeMatrix2FeaturesNV( *reinterpret_cast<PhysicalDeviceCooperativeMatrix2FeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceCooperativeMatrix2FeaturesNV & operator=( PhysicalDeviceCooperativeMatrix2FeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceCooperativeMatrix2FeaturesNV & operator=( VkPhysicalDeviceCooperativeMatrix2FeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrix2FeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCooperativeMatrix2FeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCooperativeMatrix2FeaturesNV &\n      setCooperativeMatrixWorkgroupScope( VULKAN_HPP_NAMESPACE::Bool32 cooperativeMatrixWorkgroupScope_ ) VULKAN_HPP_NOEXCEPT\n    {\n      cooperativeMatrixWorkgroupScope = cooperativeMatrixWorkgroupScope_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCooperativeMatrix2FeaturesNV &\n      setCooperativeMatrixFlexibleDimensions( VULKAN_HPP_NAMESPACE::Bool32 cooperativeMatrixFlexibleDimensions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      cooperativeMatrixFlexibleDimensions = cooperativeMatrixFlexibleDimensions_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCooperativeMatrix2FeaturesNV &\n      setCooperativeMatrixReductions( VULKAN_HPP_NAMESPACE::Bool32 cooperativeMatrixReductions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      cooperativeMatrixReductions = cooperativeMatrixReductions_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCooperativeMatrix2FeaturesNV &\n      setCooperativeMatrixConversions( VULKAN_HPP_NAMESPACE::Bool32 cooperativeMatrixConversions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      cooperativeMatrixConversions = cooperativeMatrixConversions_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCooperativeMatrix2FeaturesNV &\n      setCooperativeMatrixPerElementOperations( VULKAN_HPP_NAMESPACE::Bool32 cooperativeMatrixPerElementOperations_ ) VULKAN_HPP_NOEXCEPT\n    {\n      cooperativeMatrixPerElementOperations = cooperativeMatrixPerElementOperations_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCooperativeMatrix2FeaturesNV &\n      setCooperativeMatrixTensorAddressing( VULKAN_HPP_NAMESPACE::Bool32 cooperativeMatrixTensorAddressing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      cooperativeMatrixTensorAddressing = cooperativeMatrixTensorAddressing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCooperativeMatrix2FeaturesNV &\n      setCooperativeMatrixBlockLoads( VULKAN_HPP_NAMESPACE::Bool32 cooperativeMatrixBlockLoads_ ) VULKAN_HPP_NOEXCEPT\n    {\n      cooperativeMatrixBlockLoads = cooperativeMatrixBlockLoads_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceCooperativeMatrix2FeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceCooperativeMatrix2FeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceCooperativeMatrix2FeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceCooperativeMatrix2FeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       cooperativeMatrixWorkgroupScope,\n                       cooperativeMatrixFlexibleDimensions,\n                       cooperativeMatrixReductions,\n                       cooperativeMatrixConversions,\n                       cooperativeMatrixPerElementOperations,\n                       cooperativeMatrixTensorAddressing,\n                       cooperativeMatrixBlockLoads );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceCooperativeMatrix2FeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceCooperativeMatrix2FeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( cooperativeMatrixWorkgroupScope == rhs.cooperativeMatrixWorkgroupScope ) &&\n             ( cooperativeMatrixFlexibleDimensions == rhs.cooperativeMatrixFlexibleDimensions ) &&\n             ( cooperativeMatrixReductions == rhs.cooperativeMatrixReductions ) && ( cooperativeMatrixConversions == rhs.cooperativeMatrixConversions ) &&\n             ( cooperativeMatrixPerElementOperations == rhs.cooperativeMatrixPerElementOperations ) &&\n             ( cooperativeMatrixTensorAddressing == rhs.cooperativeMatrixTensorAddressing ) &&\n             ( cooperativeMatrixBlockLoads == rhs.cooperativeMatrixBlockLoads );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceCooperativeMatrix2FeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                 = StructureType::ePhysicalDeviceCooperativeMatrix2FeaturesNV;\n    void *                              pNext                                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        cooperativeMatrixWorkgroupScope       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        cooperativeMatrixFlexibleDimensions   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        cooperativeMatrixReductions           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        cooperativeMatrixConversions          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        cooperativeMatrixPerElementOperations = {};\n    VULKAN_HPP_NAMESPACE::Bool32        cooperativeMatrixTensorAddressing     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        cooperativeMatrixBlockLoads           = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceCooperativeMatrix2FeaturesNV>\n  {\n    using Type = PhysicalDeviceCooperativeMatrix2FeaturesNV;\n  };\n\n  struct PhysicalDeviceCooperativeMatrix2PropertiesNV\n  {\n    using NativeType = VkPhysicalDeviceCooperativeMatrix2PropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceCooperativeMatrix2PropertiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCooperativeMatrix2PropertiesNV( uint32_t cooperativeMatrixWorkgroupScopeMaxWorkgroupSize_     = {},\n                                                                       uint32_t cooperativeMatrixFlexibleDimensionsMaxDimension_     = {},\n                                                                       uint32_t cooperativeMatrixWorkgroupScopeReservedSharedMemory_ = {},\n                                                                       void *   pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , cooperativeMatrixWorkgroupScopeMaxWorkgroupSize{ cooperativeMatrixWorkgroupScopeMaxWorkgroupSize_ }\n      , cooperativeMatrixFlexibleDimensionsMaxDimension{ cooperativeMatrixFlexibleDimensionsMaxDimension_ }\n      , cooperativeMatrixWorkgroupScopeReservedSharedMemory{ cooperativeMatrixWorkgroupScopeReservedSharedMemory_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCooperativeMatrix2PropertiesNV( PhysicalDeviceCooperativeMatrix2PropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceCooperativeMatrix2PropertiesNV( VkPhysicalDeviceCooperativeMatrix2PropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceCooperativeMatrix2PropertiesNV( *reinterpret_cast<PhysicalDeviceCooperativeMatrix2PropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceCooperativeMatrix2PropertiesNV & operator=( PhysicalDeviceCooperativeMatrix2PropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceCooperativeMatrix2PropertiesNV & operator=( VkPhysicalDeviceCooperativeMatrix2PropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrix2PropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceCooperativeMatrix2PropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceCooperativeMatrix2PropertiesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceCooperativeMatrix2PropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceCooperativeMatrix2PropertiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       cooperativeMatrixWorkgroupScopeMaxWorkgroupSize,\n                       cooperativeMatrixFlexibleDimensionsMaxDimension,\n                       cooperativeMatrixWorkgroupScopeReservedSharedMemory );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceCooperativeMatrix2PropertiesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceCooperativeMatrix2PropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) &&\n             ( cooperativeMatrixWorkgroupScopeMaxWorkgroupSize == rhs.cooperativeMatrixWorkgroupScopeMaxWorkgroupSize ) &&\n             ( cooperativeMatrixFlexibleDimensionsMaxDimension == rhs.cooperativeMatrixFlexibleDimensionsMaxDimension ) &&\n             ( cooperativeMatrixWorkgroupScopeReservedSharedMemory == rhs.cooperativeMatrixWorkgroupScopeReservedSharedMemory );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceCooperativeMatrix2PropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                               = StructureType::ePhysicalDeviceCooperativeMatrix2PropertiesNV;\n    void *                              pNext                                               = {};\n    uint32_t                            cooperativeMatrixWorkgroupScopeMaxWorkgroupSize     = {};\n    uint32_t                            cooperativeMatrixFlexibleDimensionsMaxDimension     = {};\n    uint32_t                            cooperativeMatrixWorkgroupScopeReservedSharedMemory = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceCooperativeMatrix2PropertiesNV>\n  {\n    using Type = PhysicalDeviceCooperativeMatrix2PropertiesNV;\n  };\n\n  struct PhysicalDeviceCooperativeMatrixFeaturesKHR\n  {\n    using NativeType = VkPhysicalDeviceCooperativeMatrixFeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceCooperativeMatrixFeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCooperativeMatrixFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 cooperativeMatrix_                   = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 cooperativeMatrixRobustBufferAccess_ = {},\n                                                                     void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , cooperativeMatrix{ cooperativeMatrix_ }\n      , cooperativeMatrixRobustBufferAccess{ cooperativeMatrixRobustBufferAccess_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCooperativeMatrixFeaturesKHR( PhysicalDeviceCooperativeMatrixFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceCooperativeMatrixFeaturesKHR( VkPhysicalDeviceCooperativeMatrixFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceCooperativeMatrixFeaturesKHR( *reinterpret_cast<PhysicalDeviceCooperativeMatrixFeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceCooperativeMatrixFeaturesKHR & operator=( PhysicalDeviceCooperativeMatrixFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceCooperativeMatrixFeaturesKHR & operator=( VkPhysicalDeviceCooperativeMatrixFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixFeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCooperativeMatrixFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCooperativeMatrixFeaturesKHR &\n      setCooperativeMatrix( VULKAN_HPP_NAMESPACE::Bool32 cooperativeMatrix_ ) VULKAN_HPP_NOEXCEPT\n    {\n      cooperativeMatrix = cooperativeMatrix_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCooperativeMatrixFeaturesKHR &\n      setCooperativeMatrixRobustBufferAccess( VULKAN_HPP_NAMESPACE::Bool32 cooperativeMatrixRobustBufferAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      cooperativeMatrixRobustBufferAccess = cooperativeMatrixRobustBufferAccess_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceCooperativeMatrixFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixFeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceCooperativeMatrixFeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceCooperativeMatrixFeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, cooperativeMatrix, cooperativeMatrixRobustBufferAccess );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceCooperativeMatrixFeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceCooperativeMatrixFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( cooperativeMatrix == rhs.cooperativeMatrix ) &&\n             ( cooperativeMatrixRobustBufferAccess == rhs.cooperativeMatrixRobustBufferAccess );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceCooperativeMatrixFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                               = StructureType::ePhysicalDeviceCooperativeMatrixFeaturesKHR;\n    void *                              pNext                               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        cooperativeMatrix                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        cooperativeMatrixRobustBufferAccess = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceCooperativeMatrixFeaturesKHR>\n  {\n    using Type = PhysicalDeviceCooperativeMatrixFeaturesKHR;\n  };\n\n  struct PhysicalDeviceCooperativeMatrixFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceCooperativeMatrixFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceCooperativeMatrixFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCooperativeMatrixFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 cooperativeMatrix_                   = {},\n                                                                    VULKAN_HPP_NAMESPACE::Bool32 cooperativeMatrixRobustBufferAccess_ = {},\n                                                                    void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , cooperativeMatrix{ cooperativeMatrix_ }\n      , cooperativeMatrixRobustBufferAccess{ cooperativeMatrixRobustBufferAccess_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCooperativeMatrixFeaturesNV( PhysicalDeviceCooperativeMatrixFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceCooperativeMatrixFeaturesNV( VkPhysicalDeviceCooperativeMatrixFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceCooperativeMatrixFeaturesNV( *reinterpret_cast<PhysicalDeviceCooperativeMatrixFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceCooperativeMatrixFeaturesNV & operator=( PhysicalDeviceCooperativeMatrixFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceCooperativeMatrixFeaturesNV & operator=( VkPhysicalDeviceCooperativeMatrixFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCooperativeMatrixFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCooperativeMatrixFeaturesNV &\n      setCooperativeMatrix( VULKAN_HPP_NAMESPACE::Bool32 cooperativeMatrix_ ) VULKAN_HPP_NOEXCEPT\n    {\n      cooperativeMatrix = cooperativeMatrix_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCooperativeMatrixFeaturesNV &\n      setCooperativeMatrixRobustBufferAccess( VULKAN_HPP_NAMESPACE::Bool32 cooperativeMatrixRobustBufferAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      cooperativeMatrixRobustBufferAccess = cooperativeMatrixRobustBufferAccess_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceCooperativeMatrixFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceCooperativeMatrixFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceCooperativeMatrixFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, cooperativeMatrix, cooperativeMatrixRobustBufferAccess );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceCooperativeMatrixFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceCooperativeMatrixFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( cooperativeMatrix == rhs.cooperativeMatrix ) &&\n             ( cooperativeMatrixRobustBufferAccess == rhs.cooperativeMatrixRobustBufferAccess );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceCooperativeMatrixFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                               = StructureType::ePhysicalDeviceCooperativeMatrixFeaturesNV;\n    void *                              pNext                               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        cooperativeMatrix                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        cooperativeMatrixRobustBufferAccess = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceCooperativeMatrixFeaturesNV>\n  {\n    using Type = PhysicalDeviceCooperativeMatrixFeaturesNV;\n  };\n\n  struct PhysicalDeviceCooperativeMatrixPropertiesKHR\n  {\n    using NativeType = VkPhysicalDeviceCooperativeMatrixPropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceCooperativeMatrixPropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCooperativeMatrixPropertiesKHR( VULKAN_HPP_NAMESPACE::ShaderStageFlags cooperativeMatrixSupportedStages_ = {},\n                                                                       void *                                 pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , cooperativeMatrixSupportedStages{ cooperativeMatrixSupportedStages_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCooperativeMatrixPropertiesKHR( PhysicalDeviceCooperativeMatrixPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceCooperativeMatrixPropertiesKHR( VkPhysicalDeviceCooperativeMatrixPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceCooperativeMatrixPropertiesKHR( *reinterpret_cast<PhysicalDeviceCooperativeMatrixPropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceCooperativeMatrixPropertiesKHR & operator=( PhysicalDeviceCooperativeMatrixPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceCooperativeMatrixPropertiesKHR & operator=( VkPhysicalDeviceCooperativeMatrixPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixPropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceCooperativeMatrixPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixPropertiesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceCooperativeMatrixPropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceCooperativeMatrixPropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::ShaderStageFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, cooperativeMatrixSupportedStages );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceCooperativeMatrixPropertiesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceCooperativeMatrixPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( cooperativeMatrixSupportedStages == rhs.cooperativeMatrixSupportedStages );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceCooperativeMatrixPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType                            = StructureType::ePhysicalDeviceCooperativeMatrixPropertiesKHR;\n    void *                                 pNext                            = {};\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags cooperativeMatrixSupportedStages = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceCooperativeMatrixPropertiesKHR>\n  {\n    using Type = PhysicalDeviceCooperativeMatrixPropertiesKHR;\n  };\n\n  struct PhysicalDeviceCooperativeMatrixPropertiesNV\n  {\n    using NativeType = VkPhysicalDeviceCooperativeMatrixPropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceCooperativeMatrixPropertiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCooperativeMatrixPropertiesNV( VULKAN_HPP_NAMESPACE::ShaderStageFlags cooperativeMatrixSupportedStages_ = {},\n                                                                      void *                                 pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , cooperativeMatrixSupportedStages{ cooperativeMatrixSupportedStages_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCooperativeMatrixPropertiesNV( PhysicalDeviceCooperativeMatrixPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceCooperativeMatrixPropertiesNV( VkPhysicalDeviceCooperativeMatrixPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceCooperativeMatrixPropertiesNV( *reinterpret_cast<PhysicalDeviceCooperativeMatrixPropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceCooperativeMatrixPropertiesNV & operator=( PhysicalDeviceCooperativeMatrixPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceCooperativeMatrixPropertiesNV & operator=( VkPhysicalDeviceCooperativeMatrixPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixPropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceCooperativeMatrixPropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixPropertiesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceCooperativeMatrixPropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceCooperativeMatrixPropertiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::ShaderStageFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, cooperativeMatrixSupportedStages );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceCooperativeMatrixPropertiesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceCooperativeMatrixPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( cooperativeMatrixSupportedStages == rhs.cooperativeMatrixSupportedStages );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceCooperativeMatrixPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType                            = StructureType::ePhysicalDeviceCooperativeMatrixPropertiesNV;\n    void *                                 pNext                            = {};\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags cooperativeMatrixSupportedStages = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceCooperativeMatrixPropertiesNV>\n  {\n    using Type = PhysicalDeviceCooperativeMatrixPropertiesNV;\n  };\n\n  struct PhysicalDeviceCooperativeVectorFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceCooperativeVectorFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceCooperativeVectorFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCooperativeVectorFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 cooperativeVector_         = {},\n                                                                    VULKAN_HPP_NAMESPACE::Bool32 cooperativeVectorTraining_ = {},\n                                                                    void *                       pNext_                     = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , cooperativeVector{ cooperativeVector_ }\n      , cooperativeVectorTraining{ cooperativeVectorTraining_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCooperativeVectorFeaturesNV( PhysicalDeviceCooperativeVectorFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceCooperativeVectorFeaturesNV( VkPhysicalDeviceCooperativeVectorFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceCooperativeVectorFeaturesNV( *reinterpret_cast<PhysicalDeviceCooperativeVectorFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceCooperativeVectorFeaturesNV & operator=( PhysicalDeviceCooperativeVectorFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceCooperativeVectorFeaturesNV & operator=( VkPhysicalDeviceCooperativeVectorFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeVectorFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCooperativeVectorFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCooperativeVectorFeaturesNV &\n      setCooperativeVector( VULKAN_HPP_NAMESPACE::Bool32 cooperativeVector_ ) VULKAN_HPP_NOEXCEPT\n    {\n      cooperativeVector = cooperativeVector_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCooperativeVectorFeaturesNV &\n      setCooperativeVectorTraining( VULKAN_HPP_NAMESPACE::Bool32 cooperativeVectorTraining_ ) VULKAN_HPP_NOEXCEPT\n    {\n      cooperativeVectorTraining = cooperativeVectorTraining_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceCooperativeVectorFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceCooperativeVectorFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceCooperativeVectorFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceCooperativeVectorFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, cooperativeVector, cooperativeVectorTraining );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceCooperativeVectorFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceCooperativeVectorFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( cooperativeVector == rhs.cooperativeVector ) &&\n             ( cooperativeVectorTraining == rhs.cooperativeVectorTraining );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceCooperativeVectorFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                     = StructureType::ePhysicalDeviceCooperativeVectorFeaturesNV;\n    void *                              pNext                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        cooperativeVector         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        cooperativeVectorTraining = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceCooperativeVectorFeaturesNV>\n  {\n    using Type = PhysicalDeviceCooperativeVectorFeaturesNV;\n  };\n\n  struct PhysicalDeviceCooperativeVectorPropertiesNV\n  {\n    using NativeType = VkPhysicalDeviceCooperativeVectorPropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceCooperativeVectorPropertiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCooperativeVectorPropertiesNV( VULKAN_HPP_NAMESPACE::ShaderStageFlags cooperativeVectorSupportedStages_             = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32           cooperativeVectorTrainingFloat16Accumulation_ = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32           cooperativeVectorTrainingFloat32Accumulation_ = {},\n                                                                      uint32_t                               maxCooperativeVectorComponents_               = {},\n                                                                      void *                                 pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , cooperativeVectorSupportedStages{ cooperativeVectorSupportedStages_ }\n      , cooperativeVectorTrainingFloat16Accumulation{ cooperativeVectorTrainingFloat16Accumulation_ }\n      , cooperativeVectorTrainingFloat32Accumulation{ cooperativeVectorTrainingFloat32Accumulation_ }\n      , maxCooperativeVectorComponents{ maxCooperativeVectorComponents_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCooperativeVectorPropertiesNV( PhysicalDeviceCooperativeVectorPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceCooperativeVectorPropertiesNV( VkPhysicalDeviceCooperativeVectorPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceCooperativeVectorPropertiesNV( *reinterpret_cast<PhysicalDeviceCooperativeVectorPropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceCooperativeVectorPropertiesNV & operator=( PhysicalDeviceCooperativeVectorPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceCooperativeVectorPropertiesNV & operator=( VkPhysicalDeviceCooperativeVectorPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeVectorPropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceCooperativeVectorPropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceCooperativeVectorPropertiesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceCooperativeVectorPropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceCooperativeVectorPropertiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::ShaderStageFlags const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       cooperativeVectorSupportedStages,\n                       cooperativeVectorTrainingFloat16Accumulation,\n                       cooperativeVectorTrainingFloat32Accumulation,\n                       maxCooperativeVectorComponents );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceCooperativeVectorPropertiesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceCooperativeVectorPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( cooperativeVectorSupportedStages == rhs.cooperativeVectorSupportedStages ) &&\n             ( cooperativeVectorTrainingFloat16Accumulation == rhs.cooperativeVectorTrainingFloat16Accumulation ) &&\n             ( cooperativeVectorTrainingFloat32Accumulation == rhs.cooperativeVectorTrainingFloat32Accumulation ) &&\n             ( maxCooperativeVectorComponents == rhs.maxCooperativeVectorComponents );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceCooperativeVectorPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType                                        = StructureType::ePhysicalDeviceCooperativeVectorPropertiesNV;\n    void *                                 pNext                                        = {};\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags cooperativeVectorSupportedStages             = {};\n    VULKAN_HPP_NAMESPACE::Bool32           cooperativeVectorTrainingFloat16Accumulation = {};\n    VULKAN_HPP_NAMESPACE::Bool32           cooperativeVectorTrainingFloat32Accumulation = {};\n    uint32_t                               maxCooperativeVectorComponents               = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceCooperativeVectorPropertiesNV>\n  {\n    using Type = PhysicalDeviceCooperativeVectorPropertiesNV;\n  };\n\n  struct PhysicalDeviceCopyMemoryIndirectFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceCopyMemoryIndirectFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceCopyMemoryIndirectFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCopyMemoryIndirectFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 indirectCopy_ = {},\n                                                                     void *                       pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , indirectCopy{ indirectCopy_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCopyMemoryIndirectFeaturesNV( PhysicalDeviceCopyMemoryIndirectFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceCopyMemoryIndirectFeaturesNV( VkPhysicalDeviceCopyMemoryIndirectFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceCopyMemoryIndirectFeaturesNV( *reinterpret_cast<PhysicalDeviceCopyMemoryIndirectFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceCopyMemoryIndirectFeaturesNV & operator=( PhysicalDeviceCopyMemoryIndirectFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceCopyMemoryIndirectFeaturesNV & operator=( VkPhysicalDeviceCopyMemoryIndirectFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceCopyMemoryIndirectFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCopyMemoryIndirectFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCopyMemoryIndirectFeaturesNV & setIndirectCopy( VULKAN_HPP_NAMESPACE::Bool32 indirectCopy_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indirectCopy = indirectCopy_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceCopyMemoryIndirectFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceCopyMemoryIndirectFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceCopyMemoryIndirectFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceCopyMemoryIndirectFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, indirectCopy );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceCopyMemoryIndirectFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceCopyMemoryIndirectFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( indirectCopy == rhs.indirectCopy );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceCopyMemoryIndirectFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType        = StructureType::ePhysicalDeviceCopyMemoryIndirectFeaturesNV;\n    void *                              pNext        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        indirectCopy = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceCopyMemoryIndirectFeaturesNV>\n  {\n    using Type = PhysicalDeviceCopyMemoryIndirectFeaturesNV;\n  };\n\n  struct PhysicalDeviceCopyMemoryIndirectPropertiesNV\n  {\n    using NativeType = VkPhysicalDeviceCopyMemoryIndirectPropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceCopyMemoryIndirectPropertiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCopyMemoryIndirectPropertiesNV( VULKAN_HPP_NAMESPACE::QueueFlags supportedQueues_ = {},\n                                                                       void *                           pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , supportedQueues{ supportedQueues_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCopyMemoryIndirectPropertiesNV( PhysicalDeviceCopyMemoryIndirectPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceCopyMemoryIndirectPropertiesNV( VkPhysicalDeviceCopyMemoryIndirectPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceCopyMemoryIndirectPropertiesNV( *reinterpret_cast<PhysicalDeviceCopyMemoryIndirectPropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceCopyMemoryIndirectPropertiesNV & operator=( PhysicalDeviceCopyMemoryIndirectPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceCopyMemoryIndirectPropertiesNV & operator=( VkPhysicalDeviceCopyMemoryIndirectPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceCopyMemoryIndirectPropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceCopyMemoryIndirectPropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceCopyMemoryIndirectPropertiesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceCopyMemoryIndirectPropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceCopyMemoryIndirectPropertiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::QueueFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, supportedQueues );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceCopyMemoryIndirectPropertiesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceCopyMemoryIndirectPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( supportedQueues == rhs.supportedQueues );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceCopyMemoryIndirectPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType           = StructureType::ePhysicalDeviceCopyMemoryIndirectPropertiesNV;\n    void *                              pNext           = {};\n    VULKAN_HPP_NAMESPACE::QueueFlags    supportedQueues = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceCopyMemoryIndirectPropertiesNV>\n  {\n    using Type = PhysicalDeviceCopyMemoryIndirectPropertiesNV;\n  };\n\n  struct PhysicalDeviceCornerSampledImageFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceCornerSampledImageFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceCornerSampledImageFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCornerSampledImageFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 cornerSampledImage_ = {},\n                                                                     void *                       pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , cornerSampledImage{ cornerSampledImage_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCornerSampledImageFeaturesNV( PhysicalDeviceCornerSampledImageFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceCornerSampledImageFeaturesNV( VkPhysicalDeviceCornerSampledImageFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceCornerSampledImageFeaturesNV( *reinterpret_cast<PhysicalDeviceCornerSampledImageFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceCornerSampledImageFeaturesNV & operator=( PhysicalDeviceCornerSampledImageFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceCornerSampledImageFeaturesNV & operator=( VkPhysicalDeviceCornerSampledImageFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceCornerSampledImageFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCornerSampledImageFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCornerSampledImageFeaturesNV &\n      setCornerSampledImage( VULKAN_HPP_NAMESPACE::Bool32 cornerSampledImage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      cornerSampledImage = cornerSampledImage_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceCornerSampledImageFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceCornerSampledImageFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceCornerSampledImageFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceCornerSampledImageFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, cornerSampledImage );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceCornerSampledImageFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceCornerSampledImageFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( cornerSampledImage == rhs.cornerSampledImage );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceCornerSampledImageFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType              = StructureType::ePhysicalDeviceCornerSampledImageFeaturesNV;\n    void *                              pNext              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        cornerSampledImage = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceCornerSampledImageFeaturesNV>\n  {\n    using Type = PhysicalDeviceCornerSampledImageFeaturesNV;\n  };\n\n  struct PhysicalDeviceCoverageReductionModeFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceCoverageReductionModeFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceCoverageReductionModeFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCoverageReductionModeFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 coverageReductionMode_ = {},\n                                                                        void *                       pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , coverageReductionMode{ coverageReductionMode_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceCoverageReductionModeFeaturesNV( PhysicalDeviceCoverageReductionModeFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceCoverageReductionModeFeaturesNV( VkPhysicalDeviceCoverageReductionModeFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceCoverageReductionModeFeaturesNV( *reinterpret_cast<PhysicalDeviceCoverageReductionModeFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceCoverageReductionModeFeaturesNV & operator=( PhysicalDeviceCoverageReductionModeFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceCoverageReductionModeFeaturesNV & operator=( VkPhysicalDeviceCoverageReductionModeFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceCoverageReductionModeFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCoverageReductionModeFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCoverageReductionModeFeaturesNV &\n      setCoverageReductionMode( VULKAN_HPP_NAMESPACE::Bool32 coverageReductionMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      coverageReductionMode = coverageReductionMode_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceCoverageReductionModeFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceCoverageReductionModeFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceCoverageReductionModeFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceCoverageReductionModeFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, coverageReductionMode );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceCoverageReductionModeFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceCoverageReductionModeFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( coverageReductionMode == rhs.coverageReductionMode );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceCoverageReductionModeFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                 = StructureType::ePhysicalDeviceCoverageReductionModeFeaturesNV;\n    void *                              pNext                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        coverageReductionMode = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceCoverageReductionModeFeaturesNV>\n  {\n    using Type = PhysicalDeviceCoverageReductionModeFeaturesNV;\n  };\n\n  struct PhysicalDeviceCubicClampFeaturesQCOM\n  {\n    using NativeType = VkPhysicalDeviceCubicClampFeaturesQCOM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceCubicClampFeaturesQCOM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCubicClampFeaturesQCOM( VULKAN_HPP_NAMESPACE::Bool32 cubicRangeClamp_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , cubicRangeClamp{ cubicRangeClamp_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCubicClampFeaturesQCOM( PhysicalDeviceCubicClampFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceCubicClampFeaturesQCOM( VkPhysicalDeviceCubicClampFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceCubicClampFeaturesQCOM( *reinterpret_cast<PhysicalDeviceCubicClampFeaturesQCOM const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceCubicClampFeaturesQCOM & operator=( PhysicalDeviceCubicClampFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceCubicClampFeaturesQCOM & operator=( VkPhysicalDeviceCubicClampFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceCubicClampFeaturesQCOM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCubicClampFeaturesQCOM & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCubicClampFeaturesQCOM & setCubicRangeClamp( VULKAN_HPP_NAMESPACE::Bool32 cubicRangeClamp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      cubicRangeClamp = cubicRangeClamp_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceCubicClampFeaturesQCOM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceCubicClampFeaturesQCOM *>( this );\n    }\n\n    operator VkPhysicalDeviceCubicClampFeaturesQCOM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceCubicClampFeaturesQCOM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, cubicRangeClamp );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceCubicClampFeaturesQCOM const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceCubicClampFeaturesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( cubicRangeClamp == rhs.cubicRangeClamp );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceCubicClampFeaturesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType           = StructureType::ePhysicalDeviceCubicClampFeaturesQCOM;\n    void *                              pNext           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        cubicRangeClamp = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceCubicClampFeaturesQCOM>\n  {\n    using Type = PhysicalDeviceCubicClampFeaturesQCOM;\n  };\n\n  struct PhysicalDeviceCubicWeightsFeaturesQCOM\n  {\n    using NativeType = VkPhysicalDeviceCubicWeightsFeaturesQCOM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceCubicWeightsFeaturesQCOM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCubicWeightsFeaturesQCOM( VULKAN_HPP_NAMESPACE::Bool32 selectableCubicWeights_ = {},\n                                                                 void *                       pNext_                  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , selectableCubicWeights{ selectableCubicWeights_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCubicWeightsFeaturesQCOM( PhysicalDeviceCubicWeightsFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceCubicWeightsFeaturesQCOM( VkPhysicalDeviceCubicWeightsFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceCubicWeightsFeaturesQCOM( *reinterpret_cast<PhysicalDeviceCubicWeightsFeaturesQCOM const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceCubicWeightsFeaturesQCOM & operator=( PhysicalDeviceCubicWeightsFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceCubicWeightsFeaturesQCOM & operator=( VkPhysicalDeviceCubicWeightsFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceCubicWeightsFeaturesQCOM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCubicWeightsFeaturesQCOM & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCubicWeightsFeaturesQCOM &\n      setSelectableCubicWeights( VULKAN_HPP_NAMESPACE::Bool32 selectableCubicWeights_ ) VULKAN_HPP_NOEXCEPT\n    {\n      selectableCubicWeights = selectableCubicWeights_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceCubicWeightsFeaturesQCOM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceCubicWeightsFeaturesQCOM *>( this );\n    }\n\n    operator VkPhysicalDeviceCubicWeightsFeaturesQCOM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceCubicWeightsFeaturesQCOM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, selectableCubicWeights );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceCubicWeightsFeaturesQCOM const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceCubicWeightsFeaturesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( selectableCubicWeights == rhs.selectableCubicWeights );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceCubicWeightsFeaturesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                  = StructureType::ePhysicalDeviceCubicWeightsFeaturesQCOM;\n    void *                              pNext                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        selectableCubicWeights = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceCubicWeightsFeaturesQCOM>\n  {\n    using Type = PhysicalDeviceCubicWeightsFeaturesQCOM;\n  };\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  struct PhysicalDeviceCudaKernelLaunchFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceCudaKernelLaunchFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceCudaKernelLaunchFeaturesNV;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCudaKernelLaunchFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 cudaKernelLaunchFeatures_ = {},\n                                                                   void *                       pNext_                    = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , cudaKernelLaunchFeatures{ cudaKernelLaunchFeatures_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCudaKernelLaunchFeaturesNV( PhysicalDeviceCudaKernelLaunchFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceCudaKernelLaunchFeaturesNV( VkPhysicalDeviceCudaKernelLaunchFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceCudaKernelLaunchFeaturesNV( *reinterpret_cast<PhysicalDeviceCudaKernelLaunchFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceCudaKernelLaunchFeaturesNV & operator=( PhysicalDeviceCudaKernelLaunchFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceCudaKernelLaunchFeaturesNV & operator=( VkPhysicalDeviceCudaKernelLaunchFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceCudaKernelLaunchFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCudaKernelLaunchFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCudaKernelLaunchFeaturesNV &\n      setCudaKernelLaunchFeatures( VULKAN_HPP_NAMESPACE::Bool32 cudaKernelLaunchFeatures_ ) VULKAN_HPP_NOEXCEPT\n    {\n      cudaKernelLaunchFeatures = cudaKernelLaunchFeatures_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceCudaKernelLaunchFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceCudaKernelLaunchFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceCudaKernelLaunchFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceCudaKernelLaunchFeaturesNV *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, cudaKernelLaunchFeatures );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceCudaKernelLaunchFeaturesNV const & ) const = default;\n#  else\n    bool operator==( PhysicalDeviceCudaKernelLaunchFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( cudaKernelLaunchFeatures == rhs.cudaKernelLaunchFeatures );\n#    endif\n    }\n\n    bool operator!=( PhysicalDeviceCudaKernelLaunchFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                    = StructureType::ePhysicalDeviceCudaKernelLaunchFeaturesNV;\n    void *                              pNext                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        cudaKernelLaunchFeatures = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceCudaKernelLaunchFeaturesNV>\n  {\n    using Type = PhysicalDeviceCudaKernelLaunchFeaturesNV;\n  };\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  struct PhysicalDeviceCudaKernelLaunchPropertiesNV\n  {\n    using NativeType = VkPhysicalDeviceCudaKernelLaunchPropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceCudaKernelLaunchPropertiesNV;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCudaKernelLaunchPropertiesNV( uint32_t computeCapabilityMinor_ = {},\n                                                                     uint32_t computeCapabilityMajor_ = {},\n                                                                     void *   pNext_                  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , computeCapabilityMinor{ computeCapabilityMinor_ }\n      , computeCapabilityMajor{ computeCapabilityMajor_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCudaKernelLaunchPropertiesNV( PhysicalDeviceCudaKernelLaunchPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceCudaKernelLaunchPropertiesNV( VkPhysicalDeviceCudaKernelLaunchPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceCudaKernelLaunchPropertiesNV( *reinterpret_cast<PhysicalDeviceCudaKernelLaunchPropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceCudaKernelLaunchPropertiesNV & operator=( PhysicalDeviceCudaKernelLaunchPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceCudaKernelLaunchPropertiesNV & operator=( VkPhysicalDeviceCudaKernelLaunchPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceCudaKernelLaunchPropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceCudaKernelLaunchPropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceCudaKernelLaunchPropertiesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceCudaKernelLaunchPropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceCudaKernelLaunchPropertiesNV *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &, uint32_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, computeCapabilityMinor, computeCapabilityMajor );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceCudaKernelLaunchPropertiesNV const & ) const = default;\n#  else\n    bool operator==( PhysicalDeviceCudaKernelLaunchPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( computeCapabilityMinor == rhs.computeCapabilityMinor ) &&\n             ( computeCapabilityMajor == rhs.computeCapabilityMajor );\n#    endif\n    }\n\n    bool operator!=( PhysicalDeviceCudaKernelLaunchPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                  = StructureType::ePhysicalDeviceCudaKernelLaunchPropertiesNV;\n    void *                              pNext                  = {};\n    uint32_t                            computeCapabilityMinor = {};\n    uint32_t                            computeCapabilityMajor = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceCudaKernelLaunchPropertiesNV>\n  {\n    using Type = PhysicalDeviceCudaKernelLaunchPropertiesNV;\n  };\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  struct PhysicalDeviceCustomBorderColorFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceCustomBorderColorFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceCustomBorderColorFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCustomBorderColorFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 customBorderColors_             = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 customBorderColorWithoutFormat_ = {},\n                                                                     void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , customBorderColors{ customBorderColors_ }\n      , customBorderColorWithoutFormat{ customBorderColorWithoutFormat_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCustomBorderColorFeaturesEXT( PhysicalDeviceCustomBorderColorFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceCustomBorderColorFeaturesEXT( VkPhysicalDeviceCustomBorderColorFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceCustomBorderColorFeaturesEXT( *reinterpret_cast<PhysicalDeviceCustomBorderColorFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceCustomBorderColorFeaturesEXT & operator=( PhysicalDeviceCustomBorderColorFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceCustomBorderColorFeaturesEXT & operator=( VkPhysicalDeviceCustomBorderColorFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceCustomBorderColorFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCustomBorderColorFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCustomBorderColorFeaturesEXT &\n      setCustomBorderColors( VULKAN_HPP_NAMESPACE::Bool32 customBorderColors_ ) VULKAN_HPP_NOEXCEPT\n    {\n      customBorderColors = customBorderColors_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceCustomBorderColorFeaturesEXT &\n      setCustomBorderColorWithoutFormat( VULKAN_HPP_NAMESPACE::Bool32 customBorderColorWithoutFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      customBorderColorWithoutFormat = customBorderColorWithoutFormat_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceCustomBorderColorFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceCustomBorderColorFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceCustomBorderColorFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceCustomBorderColorFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, customBorderColors, customBorderColorWithoutFormat );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceCustomBorderColorFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceCustomBorderColorFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( customBorderColors == rhs.customBorderColors ) &&\n             ( customBorderColorWithoutFormat == rhs.customBorderColorWithoutFormat );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceCustomBorderColorFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                          = StructureType::ePhysicalDeviceCustomBorderColorFeaturesEXT;\n    void *                              pNext                          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        customBorderColors             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        customBorderColorWithoutFormat = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceCustomBorderColorFeaturesEXT>\n  {\n    using Type = PhysicalDeviceCustomBorderColorFeaturesEXT;\n  };\n\n  struct PhysicalDeviceCustomBorderColorPropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceCustomBorderColorPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceCustomBorderColorPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCustomBorderColorPropertiesEXT( uint32_t maxCustomBorderColorSamplers_ = {},\n                                                                       void *   pNext_                        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxCustomBorderColorSamplers{ maxCustomBorderColorSamplers_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceCustomBorderColorPropertiesEXT( PhysicalDeviceCustomBorderColorPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceCustomBorderColorPropertiesEXT( VkPhysicalDeviceCustomBorderColorPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceCustomBorderColorPropertiesEXT( *reinterpret_cast<PhysicalDeviceCustomBorderColorPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceCustomBorderColorPropertiesEXT & operator=( PhysicalDeviceCustomBorderColorPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceCustomBorderColorPropertiesEXT & operator=( VkPhysicalDeviceCustomBorderColorPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceCustomBorderColorPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceCustomBorderColorPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceCustomBorderColorPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceCustomBorderColorPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceCustomBorderColorPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxCustomBorderColorSamplers );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceCustomBorderColorPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceCustomBorderColorPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxCustomBorderColorSamplers == rhs.maxCustomBorderColorSamplers );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceCustomBorderColorPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                        = StructureType::ePhysicalDeviceCustomBorderColorPropertiesEXT;\n    void *                              pNext                        = {};\n    uint32_t                            maxCustomBorderColorSamplers = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceCustomBorderColorPropertiesEXT>\n  {\n    using Type = PhysicalDeviceCustomBorderColorPropertiesEXT;\n  };\n\n  struct PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 dedicatedAllocationImageAliasing_ = {},\n                                                                                   void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , dedicatedAllocationImageAliasing{ dedicatedAllocationImageAliasing_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV( PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV const & rhs )\n      VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV( VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV( *reinterpret_cast<PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV &\n      operator=( PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV &\n      operator=( VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV &\n      setDedicatedAllocationImageAliasing( VULKAN_HPP_NAMESPACE::Bool32 dedicatedAllocationImageAliasing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dedicatedAllocationImageAliasing = dedicatedAllocationImageAliasing_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, dedicatedAllocationImageAliasing );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( dedicatedAllocationImageAliasing == rhs.dedicatedAllocationImageAliasing );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                            = StructureType::ePhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV;\n    void *                              pNext                            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        dedicatedAllocationImageAliasing = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV>\n  {\n    using Type = PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV;\n  };\n\n  struct PhysicalDeviceDepthBiasControlFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceDepthBiasControlFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDepthBiasControlFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDepthBiasControlFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 depthBiasControl_                                = {},\n                                                                    VULKAN_HPP_NAMESPACE::Bool32 leastRepresentableValueForceUnormRepresentation_ = {},\n                                                                    VULKAN_HPP_NAMESPACE::Bool32 floatRepresentation_                             = {},\n                                                                    VULKAN_HPP_NAMESPACE::Bool32 depthBiasExact_                                  = {},\n                                                                    void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , depthBiasControl{ depthBiasControl_ }\n      , leastRepresentableValueForceUnormRepresentation{ leastRepresentableValueForceUnormRepresentation_ }\n      , floatRepresentation{ floatRepresentation_ }\n      , depthBiasExact{ depthBiasExact_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDepthBiasControlFeaturesEXT( PhysicalDeviceDepthBiasControlFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDepthBiasControlFeaturesEXT( VkPhysicalDeviceDepthBiasControlFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDepthBiasControlFeaturesEXT( *reinterpret_cast<PhysicalDeviceDepthBiasControlFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDepthBiasControlFeaturesEXT & operator=( PhysicalDeviceDepthBiasControlFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDepthBiasControlFeaturesEXT & operator=( VkPhysicalDeviceDepthBiasControlFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthBiasControlFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDepthBiasControlFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDepthBiasControlFeaturesEXT &\n      setDepthBiasControl( VULKAN_HPP_NAMESPACE::Bool32 depthBiasControl_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthBiasControl = depthBiasControl_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDepthBiasControlFeaturesEXT &\n      setLeastRepresentableValueForceUnormRepresentation( VULKAN_HPP_NAMESPACE::Bool32 leastRepresentableValueForceUnormRepresentation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      leastRepresentableValueForceUnormRepresentation = leastRepresentableValueForceUnormRepresentation_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDepthBiasControlFeaturesEXT &\n      setFloatRepresentation( VULKAN_HPP_NAMESPACE::Bool32 floatRepresentation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      floatRepresentation = floatRepresentation_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDepthBiasControlFeaturesEXT & setDepthBiasExact( VULKAN_HPP_NAMESPACE::Bool32 depthBiasExact_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthBiasExact = depthBiasExact_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceDepthBiasControlFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDepthBiasControlFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceDepthBiasControlFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDepthBiasControlFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, depthBiasControl, leastRepresentableValueForceUnormRepresentation, floatRepresentation, depthBiasExact );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDepthBiasControlFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDepthBiasControlFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( depthBiasControl == rhs.depthBiasControl ) &&\n             ( leastRepresentableValueForceUnormRepresentation == rhs.leastRepresentableValueForceUnormRepresentation ) &&\n             ( floatRepresentation == rhs.floatRepresentation ) && ( depthBiasExact == rhs.depthBiasExact );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDepthBiasControlFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                           = StructureType::ePhysicalDeviceDepthBiasControlFeaturesEXT;\n    void *                              pNext                                           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        depthBiasControl                                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        leastRepresentableValueForceUnormRepresentation = {};\n    VULKAN_HPP_NAMESPACE::Bool32        floatRepresentation                             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        depthBiasExact                                  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDepthBiasControlFeaturesEXT>\n  {\n    using Type = PhysicalDeviceDepthBiasControlFeaturesEXT;\n  };\n\n  struct PhysicalDeviceDepthClampControlFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceDepthClampControlFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDepthClampControlFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDepthClampControlFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 depthClampControl_ = {},\n                                                                     void *                       pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , depthClampControl{ depthClampControl_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDepthClampControlFeaturesEXT( PhysicalDeviceDepthClampControlFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDepthClampControlFeaturesEXT( VkPhysicalDeviceDepthClampControlFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDepthClampControlFeaturesEXT( *reinterpret_cast<PhysicalDeviceDepthClampControlFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDepthClampControlFeaturesEXT & operator=( PhysicalDeviceDepthClampControlFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDepthClampControlFeaturesEXT & operator=( VkPhysicalDeviceDepthClampControlFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClampControlFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDepthClampControlFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDepthClampControlFeaturesEXT &\n      setDepthClampControl( VULKAN_HPP_NAMESPACE::Bool32 depthClampControl_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthClampControl = depthClampControl_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceDepthClampControlFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDepthClampControlFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceDepthClampControlFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDepthClampControlFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, depthClampControl );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDepthClampControlFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDepthClampControlFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( depthClampControl == rhs.depthClampControl );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDepthClampControlFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType             = StructureType::ePhysicalDeviceDepthClampControlFeaturesEXT;\n    void *                              pNext             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        depthClampControl = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDepthClampControlFeaturesEXT>\n  {\n    using Type = PhysicalDeviceDepthClampControlFeaturesEXT;\n  };\n\n  struct PhysicalDeviceDepthClampZeroOneFeaturesKHR\n  {\n    using NativeType = VkPhysicalDeviceDepthClampZeroOneFeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDepthClampZeroOneFeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDepthClampZeroOneFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 depthClampZeroOne_ = {},\n                                                                     void *                       pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , depthClampZeroOne{ depthClampZeroOne_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDepthClampZeroOneFeaturesKHR( PhysicalDeviceDepthClampZeroOneFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDepthClampZeroOneFeaturesKHR( VkPhysicalDeviceDepthClampZeroOneFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDepthClampZeroOneFeaturesKHR( *reinterpret_cast<PhysicalDeviceDepthClampZeroOneFeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDepthClampZeroOneFeaturesKHR & operator=( PhysicalDeviceDepthClampZeroOneFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDepthClampZeroOneFeaturesKHR & operator=( VkPhysicalDeviceDepthClampZeroOneFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClampZeroOneFeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDepthClampZeroOneFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDepthClampZeroOneFeaturesKHR &\n      setDepthClampZeroOne( VULKAN_HPP_NAMESPACE::Bool32 depthClampZeroOne_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthClampZeroOne = depthClampZeroOne_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceDepthClampZeroOneFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDepthClampZeroOneFeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceDepthClampZeroOneFeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDepthClampZeroOneFeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, depthClampZeroOne );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDepthClampZeroOneFeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDepthClampZeroOneFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( depthClampZeroOne == rhs.depthClampZeroOne );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDepthClampZeroOneFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType             = StructureType::ePhysicalDeviceDepthClampZeroOneFeaturesKHR;\n    void *                              pNext             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        depthClampZeroOne = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDepthClampZeroOneFeaturesKHR>\n  {\n    using Type = PhysicalDeviceDepthClampZeroOneFeaturesKHR;\n  };\n\n  using PhysicalDeviceDepthClampZeroOneFeaturesEXT = PhysicalDeviceDepthClampZeroOneFeaturesKHR;\n\n  struct PhysicalDeviceDepthClipControlFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceDepthClipControlFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDepthClipControlFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDepthClipControlFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 depthClipControl_ = {},\n                                                                    void *                       pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , depthClipControl{ depthClipControl_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDepthClipControlFeaturesEXT( PhysicalDeviceDepthClipControlFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDepthClipControlFeaturesEXT( VkPhysicalDeviceDepthClipControlFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDepthClipControlFeaturesEXT( *reinterpret_cast<PhysicalDeviceDepthClipControlFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDepthClipControlFeaturesEXT & operator=( PhysicalDeviceDepthClipControlFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDepthClipControlFeaturesEXT & operator=( VkPhysicalDeviceDepthClipControlFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClipControlFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDepthClipControlFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDepthClipControlFeaturesEXT &\n      setDepthClipControl( VULKAN_HPP_NAMESPACE::Bool32 depthClipControl_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthClipControl = depthClipControl_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceDepthClipControlFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDepthClipControlFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceDepthClipControlFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDepthClipControlFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, depthClipControl );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDepthClipControlFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDepthClipControlFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( depthClipControl == rhs.depthClipControl );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDepthClipControlFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType            = StructureType::ePhysicalDeviceDepthClipControlFeaturesEXT;\n    void *                              pNext            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        depthClipControl = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDepthClipControlFeaturesEXT>\n  {\n    using Type = PhysicalDeviceDepthClipControlFeaturesEXT;\n  };\n\n  struct PhysicalDeviceDepthClipEnableFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceDepthClipEnableFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDepthClipEnableFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDepthClipEnableFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 depthClipEnable_ = {},\n                                                                   void *                       pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , depthClipEnable{ depthClipEnable_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDepthClipEnableFeaturesEXT( PhysicalDeviceDepthClipEnableFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDepthClipEnableFeaturesEXT( VkPhysicalDeviceDepthClipEnableFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDepthClipEnableFeaturesEXT( *reinterpret_cast<PhysicalDeviceDepthClipEnableFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDepthClipEnableFeaturesEXT & operator=( PhysicalDeviceDepthClipEnableFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDepthClipEnableFeaturesEXT & operator=( VkPhysicalDeviceDepthClipEnableFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClipEnableFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDepthClipEnableFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDepthClipEnableFeaturesEXT & setDepthClipEnable( VULKAN_HPP_NAMESPACE::Bool32 depthClipEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthClipEnable = depthClipEnable_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceDepthClipEnableFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDepthClipEnableFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceDepthClipEnableFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDepthClipEnableFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, depthClipEnable );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDepthClipEnableFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDepthClipEnableFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( depthClipEnable == rhs.depthClipEnable );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDepthClipEnableFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType           = StructureType::ePhysicalDeviceDepthClipEnableFeaturesEXT;\n    void *                              pNext           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        depthClipEnable = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDepthClipEnableFeaturesEXT>\n  {\n    using Type = PhysicalDeviceDepthClipEnableFeaturesEXT;\n  };\n\n  struct PhysicalDeviceDepthStencilResolveProperties\n  {\n    using NativeType = VkPhysicalDeviceDepthStencilResolveProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDepthStencilResolveProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDepthStencilResolveProperties( VULKAN_HPP_NAMESPACE::ResolveModeFlags supportedDepthResolveModes_   = {},\n                                                                      VULKAN_HPP_NAMESPACE::ResolveModeFlags supportedStencilResolveModes_ = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32           independentResolveNone_       = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32           independentResolve_           = {},\n                                                                      void *                                 pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , supportedDepthResolveModes{ supportedDepthResolveModes_ }\n      , supportedStencilResolveModes{ supportedStencilResolveModes_ }\n      , independentResolveNone{ independentResolveNone_ }\n      , independentResolve{ independentResolve_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDepthStencilResolveProperties( PhysicalDeviceDepthStencilResolveProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDepthStencilResolveProperties( VkPhysicalDeviceDepthStencilResolveProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDepthStencilResolveProperties( *reinterpret_cast<PhysicalDeviceDepthStencilResolveProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDepthStencilResolveProperties & operator=( PhysicalDeviceDepthStencilResolveProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDepthStencilResolveProperties & operator=( VkPhysicalDeviceDepthStencilResolveProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthStencilResolveProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceDepthStencilResolveProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDepthStencilResolveProperties *>( this );\n    }\n\n    operator VkPhysicalDeviceDepthStencilResolveProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDepthStencilResolveProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::ResolveModeFlags const &,\n               VULKAN_HPP_NAMESPACE::ResolveModeFlags const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, supportedDepthResolveModes, supportedStencilResolveModes, independentResolveNone, independentResolve );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDepthStencilResolveProperties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDepthStencilResolveProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( supportedDepthResolveModes == rhs.supportedDepthResolveModes ) &&\n             ( supportedStencilResolveModes == rhs.supportedStencilResolveModes ) && ( independentResolveNone == rhs.independentResolveNone ) &&\n             ( independentResolve == rhs.independentResolve );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDepthStencilResolveProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType                        = StructureType::ePhysicalDeviceDepthStencilResolveProperties;\n    void *                                 pNext                        = {};\n    VULKAN_HPP_NAMESPACE::ResolveModeFlags supportedDepthResolveModes   = {};\n    VULKAN_HPP_NAMESPACE::ResolveModeFlags supportedStencilResolveModes = {};\n    VULKAN_HPP_NAMESPACE::Bool32           independentResolveNone       = {};\n    VULKAN_HPP_NAMESPACE::Bool32           independentResolve           = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDepthStencilResolveProperties>\n  {\n    using Type = PhysicalDeviceDepthStencilResolveProperties;\n  };\n\n  using PhysicalDeviceDepthStencilResolvePropertiesKHR = PhysicalDeviceDepthStencilResolveProperties;\n\n  struct PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDescriptorBufferDensityMapPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT( size_t combinedImageSamplerDensityMapDescriptorSize_ = {},\n                                                                                void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , combinedImageSamplerDensityMapDescriptorSize{ combinedImageSamplerDensityMapDescriptorSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT( PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT( VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT( *reinterpret_cast<PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT &\n      operator=( PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT & operator=( VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, size_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, combinedImageSamplerDensityMapDescriptorSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) &&\n             ( combinedImageSamplerDensityMapDescriptorSize == rhs.combinedImageSamplerDensityMapDescriptorSize );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                        = StructureType::ePhysicalDeviceDescriptorBufferDensityMapPropertiesEXT;\n    void *                              pNext                                        = {};\n    size_t                              combinedImageSamplerDensityMapDescriptorSize = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDescriptorBufferDensityMapPropertiesEXT>\n  {\n    using Type = PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT;\n  };\n\n  struct PhysicalDeviceDescriptorBufferFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceDescriptorBufferFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDescriptorBufferFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDescriptorBufferFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 descriptorBuffer_                   = {},\n                                                                    VULKAN_HPP_NAMESPACE::Bool32 descriptorBufferCaptureReplay_      = {},\n                                                                    VULKAN_HPP_NAMESPACE::Bool32 descriptorBufferImageLayoutIgnored_ = {},\n                                                                    VULKAN_HPP_NAMESPACE::Bool32 descriptorBufferPushDescriptors_    = {},\n                                                                    void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , descriptorBuffer{ descriptorBuffer_ }\n      , descriptorBufferCaptureReplay{ descriptorBufferCaptureReplay_ }\n      , descriptorBufferImageLayoutIgnored{ descriptorBufferImageLayoutIgnored_ }\n      , descriptorBufferPushDescriptors{ descriptorBufferPushDescriptors_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDescriptorBufferFeaturesEXT( PhysicalDeviceDescriptorBufferFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDescriptorBufferFeaturesEXT( VkPhysicalDeviceDescriptorBufferFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDescriptorBufferFeaturesEXT( *reinterpret_cast<PhysicalDeviceDescriptorBufferFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDescriptorBufferFeaturesEXT & operator=( PhysicalDeviceDescriptorBufferFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDescriptorBufferFeaturesEXT & operator=( VkPhysicalDeviceDescriptorBufferFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorBufferFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorBufferFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorBufferFeaturesEXT &\n      setDescriptorBuffer( VULKAN_HPP_NAMESPACE::Bool32 descriptorBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBuffer = descriptorBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorBufferFeaturesEXT &\n      setDescriptorBufferCaptureReplay( VULKAN_HPP_NAMESPACE::Bool32 descriptorBufferCaptureReplay_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBufferCaptureReplay = descriptorBufferCaptureReplay_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorBufferFeaturesEXT &\n      setDescriptorBufferImageLayoutIgnored( VULKAN_HPP_NAMESPACE::Bool32 descriptorBufferImageLayoutIgnored_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBufferImageLayoutIgnored = descriptorBufferImageLayoutIgnored_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorBufferFeaturesEXT &\n      setDescriptorBufferPushDescriptors( VULKAN_HPP_NAMESPACE::Bool32 descriptorBufferPushDescriptors_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBufferPushDescriptors = descriptorBufferPushDescriptors_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceDescriptorBufferFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDescriptorBufferFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceDescriptorBufferFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDescriptorBufferFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, descriptorBuffer, descriptorBufferCaptureReplay, descriptorBufferImageLayoutIgnored, descriptorBufferPushDescriptors );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDescriptorBufferFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDescriptorBufferFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( descriptorBuffer == rhs.descriptorBuffer ) &&\n             ( descriptorBufferCaptureReplay == rhs.descriptorBufferCaptureReplay ) &&\n             ( descriptorBufferImageLayoutIgnored == rhs.descriptorBufferImageLayoutIgnored ) &&\n             ( descriptorBufferPushDescriptors == rhs.descriptorBufferPushDescriptors );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDescriptorBufferFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                              = StructureType::ePhysicalDeviceDescriptorBufferFeaturesEXT;\n    void *                              pNext                              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBuffer                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBufferCaptureReplay      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBufferImageLayoutIgnored = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBufferPushDescriptors    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDescriptorBufferFeaturesEXT>\n  {\n    using Type = PhysicalDeviceDescriptorBufferFeaturesEXT;\n  };\n\n  struct PhysicalDeviceDescriptorBufferPropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceDescriptorBufferPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDescriptorBufferPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDescriptorBufferPropertiesEXT( VULKAN_HPP_NAMESPACE::Bool32     combinedImageSamplerDescriptorSingleArray_ = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32     bufferlessPushDescriptors_                 = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32     allowSamplerImageViewPostSubmitCreation_   = {},\n                                                                      VULKAN_HPP_NAMESPACE::DeviceSize descriptorBufferOffsetAlignment_           = {},\n                                                                      uint32_t                         maxDescriptorBufferBindings_               = {},\n                                                                      uint32_t                         maxResourceDescriptorBufferBindings_       = {},\n                                                                      uint32_t                         maxSamplerDescriptorBufferBindings_        = {},\n                                                                      uint32_t                         maxEmbeddedImmutableSamplerBindings_       = {},\n                                                                      uint32_t                         maxEmbeddedImmutableSamplers_              = {},\n                                                                      size_t                           bufferCaptureReplayDescriptorDataSize_     = {},\n                                                                      size_t                           imageCaptureReplayDescriptorDataSize_      = {},\n                                                                      size_t                           imageViewCaptureReplayDescriptorDataSize_  = {},\n                                                                      size_t                           samplerCaptureReplayDescriptorDataSize_    = {},\n                                                                      size_t accelerationStructureCaptureReplayDescriptorDataSize_                = {},\n                                                                      size_t samplerDescriptorSize_                                               = {},\n                                                                      size_t combinedImageSamplerDescriptorSize_                                  = {},\n                                                                      size_t sampledImageDescriptorSize_                                          = {},\n                                                                      size_t storageImageDescriptorSize_                                          = {},\n                                                                      size_t uniformTexelBufferDescriptorSize_                                    = {},\n                                                                      size_t robustUniformTexelBufferDescriptorSize_                              = {},\n                                                                      size_t storageTexelBufferDescriptorSize_                                    = {},\n                                                                      size_t robustStorageTexelBufferDescriptorSize_                              = {},\n                                                                      size_t uniformBufferDescriptorSize_                                         = {},\n                                                                      size_t robustUniformBufferDescriptorSize_                                   = {},\n                                                                      size_t storageBufferDescriptorSize_                                         = {},\n                                                                      size_t robustStorageBufferDescriptorSize_                                   = {},\n                                                                      size_t inputAttachmentDescriptorSize_                                       = {},\n                                                                      size_t accelerationStructureDescriptorSize_                                 = {},\n                                                                      VULKAN_HPP_NAMESPACE::DeviceSize maxSamplerDescriptorBufferRange_           = {},\n                                                                      VULKAN_HPP_NAMESPACE::DeviceSize maxResourceDescriptorBufferRange_          = {},\n                                                                      VULKAN_HPP_NAMESPACE::DeviceSize samplerDescriptorBufferAddressSpaceSize_   = {},\n                                                                      VULKAN_HPP_NAMESPACE::DeviceSize resourceDescriptorBufferAddressSpaceSize_  = {},\n                                                                      VULKAN_HPP_NAMESPACE::DeviceSize descriptorBufferAddressSpaceSize_          = {},\n                                                                      void *                           pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , combinedImageSamplerDescriptorSingleArray{ combinedImageSamplerDescriptorSingleArray_ }\n      , bufferlessPushDescriptors{ bufferlessPushDescriptors_ }\n      , allowSamplerImageViewPostSubmitCreation{ allowSamplerImageViewPostSubmitCreation_ }\n      , descriptorBufferOffsetAlignment{ descriptorBufferOffsetAlignment_ }\n      , maxDescriptorBufferBindings{ maxDescriptorBufferBindings_ }\n      , maxResourceDescriptorBufferBindings{ maxResourceDescriptorBufferBindings_ }\n      , maxSamplerDescriptorBufferBindings{ maxSamplerDescriptorBufferBindings_ }\n      , maxEmbeddedImmutableSamplerBindings{ maxEmbeddedImmutableSamplerBindings_ }\n      , maxEmbeddedImmutableSamplers{ maxEmbeddedImmutableSamplers_ }\n      , bufferCaptureReplayDescriptorDataSize{ bufferCaptureReplayDescriptorDataSize_ }\n      , imageCaptureReplayDescriptorDataSize{ imageCaptureReplayDescriptorDataSize_ }\n      , imageViewCaptureReplayDescriptorDataSize{ imageViewCaptureReplayDescriptorDataSize_ }\n      , samplerCaptureReplayDescriptorDataSize{ samplerCaptureReplayDescriptorDataSize_ }\n      , accelerationStructureCaptureReplayDescriptorDataSize{ accelerationStructureCaptureReplayDescriptorDataSize_ }\n      , samplerDescriptorSize{ samplerDescriptorSize_ }\n      , combinedImageSamplerDescriptorSize{ combinedImageSamplerDescriptorSize_ }\n      , sampledImageDescriptorSize{ sampledImageDescriptorSize_ }\n      , storageImageDescriptorSize{ storageImageDescriptorSize_ }\n      , uniformTexelBufferDescriptorSize{ uniformTexelBufferDescriptorSize_ }\n      , robustUniformTexelBufferDescriptorSize{ robustUniformTexelBufferDescriptorSize_ }\n      , storageTexelBufferDescriptorSize{ storageTexelBufferDescriptorSize_ }\n      , robustStorageTexelBufferDescriptorSize{ robustStorageTexelBufferDescriptorSize_ }\n      , uniformBufferDescriptorSize{ uniformBufferDescriptorSize_ }\n      , robustUniformBufferDescriptorSize{ robustUniformBufferDescriptorSize_ }\n      , storageBufferDescriptorSize{ storageBufferDescriptorSize_ }\n      , robustStorageBufferDescriptorSize{ robustStorageBufferDescriptorSize_ }\n      , inputAttachmentDescriptorSize{ inputAttachmentDescriptorSize_ }\n      , accelerationStructureDescriptorSize{ accelerationStructureDescriptorSize_ }\n      , maxSamplerDescriptorBufferRange{ maxSamplerDescriptorBufferRange_ }\n      , maxResourceDescriptorBufferRange{ maxResourceDescriptorBufferRange_ }\n      , samplerDescriptorBufferAddressSpaceSize{ samplerDescriptorBufferAddressSpaceSize_ }\n      , resourceDescriptorBufferAddressSpaceSize{ resourceDescriptorBufferAddressSpaceSize_ }\n      , descriptorBufferAddressSpaceSize{ descriptorBufferAddressSpaceSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDescriptorBufferPropertiesEXT( PhysicalDeviceDescriptorBufferPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDescriptorBufferPropertiesEXT( VkPhysicalDeviceDescriptorBufferPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDescriptorBufferPropertiesEXT( *reinterpret_cast<PhysicalDeviceDescriptorBufferPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDescriptorBufferPropertiesEXT & operator=( PhysicalDeviceDescriptorBufferPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDescriptorBufferPropertiesEXT & operator=( VkPhysicalDeviceDescriptorBufferPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorBufferPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceDescriptorBufferPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDescriptorBufferPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceDescriptorBufferPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDescriptorBufferPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               size_t const &,\n               size_t const &,\n               size_t const &,\n               size_t const &,\n               size_t const &,\n               size_t const &,\n               size_t const &,\n               size_t const &,\n               size_t const &,\n               size_t const &,\n               size_t const &,\n               size_t const &,\n               size_t const &,\n               size_t const &,\n               size_t const &,\n               size_t const &,\n               size_t const &,\n               size_t const &,\n               size_t const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       combinedImageSamplerDescriptorSingleArray,\n                       bufferlessPushDescriptors,\n                       allowSamplerImageViewPostSubmitCreation,\n                       descriptorBufferOffsetAlignment,\n                       maxDescriptorBufferBindings,\n                       maxResourceDescriptorBufferBindings,\n                       maxSamplerDescriptorBufferBindings,\n                       maxEmbeddedImmutableSamplerBindings,\n                       maxEmbeddedImmutableSamplers,\n                       bufferCaptureReplayDescriptorDataSize,\n                       imageCaptureReplayDescriptorDataSize,\n                       imageViewCaptureReplayDescriptorDataSize,\n                       samplerCaptureReplayDescriptorDataSize,\n                       accelerationStructureCaptureReplayDescriptorDataSize,\n                       samplerDescriptorSize,\n                       combinedImageSamplerDescriptorSize,\n                       sampledImageDescriptorSize,\n                       storageImageDescriptorSize,\n                       uniformTexelBufferDescriptorSize,\n                       robustUniformTexelBufferDescriptorSize,\n                       storageTexelBufferDescriptorSize,\n                       robustStorageTexelBufferDescriptorSize,\n                       uniformBufferDescriptorSize,\n                       robustUniformBufferDescriptorSize,\n                       storageBufferDescriptorSize,\n                       robustStorageBufferDescriptorSize,\n                       inputAttachmentDescriptorSize,\n                       accelerationStructureDescriptorSize,\n                       maxSamplerDescriptorBufferRange,\n                       maxResourceDescriptorBufferRange,\n                       samplerDescriptorBufferAddressSpaceSize,\n                       resourceDescriptorBufferAddressSpaceSize,\n                       descriptorBufferAddressSpaceSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDescriptorBufferPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDescriptorBufferPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) &&\n             ( combinedImageSamplerDescriptorSingleArray == rhs.combinedImageSamplerDescriptorSingleArray ) &&\n             ( bufferlessPushDescriptors == rhs.bufferlessPushDescriptors ) &&\n             ( allowSamplerImageViewPostSubmitCreation == rhs.allowSamplerImageViewPostSubmitCreation ) &&\n             ( descriptorBufferOffsetAlignment == rhs.descriptorBufferOffsetAlignment ) && ( maxDescriptorBufferBindings == rhs.maxDescriptorBufferBindings ) &&\n             ( maxResourceDescriptorBufferBindings == rhs.maxResourceDescriptorBufferBindings ) &&\n             ( maxSamplerDescriptorBufferBindings == rhs.maxSamplerDescriptorBufferBindings ) &&\n             ( maxEmbeddedImmutableSamplerBindings == rhs.maxEmbeddedImmutableSamplerBindings ) &&\n             ( maxEmbeddedImmutableSamplers == rhs.maxEmbeddedImmutableSamplers ) &&\n             ( bufferCaptureReplayDescriptorDataSize == rhs.bufferCaptureReplayDescriptorDataSize ) &&\n             ( imageCaptureReplayDescriptorDataSize == rhs.imageCaptureReplayDescriptorDataSize ) &&\n             ( imageViewCaptureReplayDescriptorDataSize == rhs.imageViewCaptureReplayDescriptorDataSize ) &&\n             ( samplerCaptureReplayDescriptorDataSize == rhs.samplerCaptureReplayDescriptorDataSize ) &&\n             ( accelerationStructureCaptureReplayDescriptorDataSize == rhs.accelerationStructureCaptureReplayDescriptorDataSize ) &&\n             ( samplerDescriptorSize == rhs.samplerDescriptorSize ) && ( combinedImageSamplerDescriptorSize == rhs.combinedImageSamplerDescriptorSize ) &&\n             ( sampledImageDescriptorSize == rhs.sampledImageDescriptorSize ) && ( storageImageDescriptorSize == rhs.storageImageDescriptorSize ) &&\n             ( uniformTexelBufferDescriptorSize == rhs.uniformTexelBufferDescriptorSize ) &&\n             ( robustUniformTexelBufferDescriptorSize == rhs.robustUniformTexelBufferDescriptorSize ) &&\n             ( storageTexelBufferDescriptorSize == rhs.storageTexelBufferDescriptorSize ) &&\n             ( robustStorageTexelBufferDescriptorSize == rhs.robustStorageTexelBufferDescriptorSize ) &&\n             ( uniformBufferDescriptorSize == rhs.uniformBufferDescriptorSize ) &&\n             ( robustUniformBufferDescriptorSize == rhs.robustUniformBufferDescriptorSize ) &&\n             ( storageBufferDescriptorSize == rhs.storageBufferDescriptorSize ) &&\n             ( robustStorageBufferDescriptorSize == rhs.robustStorageBufferDescriptorSize ) &&\n             ( inputAttachmentDescriptorSize == rhs.inputAttachmentDescriptorSize ) &&\n             ( accelerationStructureDescriptorSize == rhs.accelerationStructureDescriptorSize ) &&\n             ( maxSamplerDescriptorBufferRange == rhs.maxSamplerDescriptorBufferRange ) &&\n             ( maxResourceDescriptorBufferRange == rhs.maxResourceDescriptorBufferRange ) &&\n             ( samplerDescriptorBufferAddressSpaceSize == rhs.samplerDescriptorBufferAddressSpaceSize ) &&\n             ( resourceDescriptorBufferAddressSpaceSize == rhs.resourceDescriptorBufferAddressSpaceSize ) &&\n             ( descriptorBufferAddressSpaceSize == rhs.descriptorBufferAddressSpaceSize );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDescriptorBufferPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                                = StructureType::ePhysicalDeviceDescriptorBufferPropertiesEXT;\n    void *                              pNext                                                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        combinedImageSamplerDescriptorSingleArray            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        bufferlessPushDescriptors                            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        allowSamplerImageViewPostSubmitCreation              = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    descriptorBufferOffsetAlignment                      = {};\n    uint32_t                            maxDescriptorBufferBindings                          = {};\n    uint32_t                            maxResourceDescriptorBufferBindings                  = {};\n    uint32_t                            maxSamplerDescriptorBufferBindings                   = {};\n    uint32_t                            maxEmbeddedImmutableSamplerBindings                  = {};\n    uint32_t                            maxEmbeddedImmutableSamplers                         = {};\n    size_t                              bufferCaptureReplayDescriptorDataSize                = {};\n    size_t                              imageCaptureReplayDescriptorDataSize                 = {};\n    size_t                              imageViewCaptureReplayDescriptorDataSize             = {};\n    size_t                              samplerCaptureReplayDescriptorDataSize               = {};\n    size_t                              accelerationStructureCaptureReplayDescriptorDataSize = {};\n    size_t                              samplerDescriptorSize                                = {};\n    size_t                              combinedImageSamplerDescriptorSize                   = {};\n    size_t                              sampledImageDescriptorSize                           = {};\n    size_t                              storageImageDescriptorSize                           = {};\n    size_t                              uniformTexelBufferDescriptorSize                     = {};\n    size_t                              robustUniformTexelBufferDescriptorSize               = {};\n    size_t                              storageTexelBufferDescriptorSize                     = {};\n    size_t                              robustStorageTexelBufferDescriptorSize               = {};\n    size_t                              uniformBufferDescriptorSize                          = {};\n    size_t                              robustUniformBufferDescriptorSize                    = {};\n    size_t                              storageBufferDescriptorSize                          = {};\n    size_t                              robustStorageBufferDescriptorSize                    = {};\n    size_t                              inputAttachmentDescriptorSize                        = {};\n    size_t                              accelerationStructureDescriptorSize                  = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    maxSamplerDescriptorBufferRange                      = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    maxResourceDescriptorBufferRange                     = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    samplerDescriptorBufferAddressSpaceSize              = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    resourceDescriptorBufferAddressSpaceSize             = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    descriptorBufferAddressSpaceSize                     = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDescriptorBufferPropertiesEXT>\n  {\n    using Type = PhysicalDeviceDescriptorBufferPropertiesEXT;\n  };\n\n  struct PhysicalDeviceDescriptorIndexingFeatures\n  {\n    using NativeType = VkPhysicalDeviceDescriptorIndexingFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDescriptorIndexingFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDescriptorIndexingFeatures( VULKAN_HPP_NAMESPACE::Bool32 shaderInputAttachmentArrayDynamicIndexing_          = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 shaderUniformTexelBufferArrayDynamicIndexing_       = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 shaderStorageTexelBufferArrayDynamicIndexing_       = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 shaderUniformBufferArrayNonUniformIndexing_         = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 shaderSampledImageArrayNonUniformIndexing_          = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 shaderStorageBufferArrayNonUniformIndexing_         = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 shaderStorageImageArrayNonUniformIndexing_          = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 shaderInputAttachmentArrayNonUniformIndexing_       = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 shaderUniformTexelBufferArrayNonUniformIndexing_    = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 shaderStorageTexelBufferArrayNonUniformIndexing_    = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingUniformBufferUpdateAfterBind_      = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingSampledImageUpdateAfterBind_       = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingStorageImageUpdateAfterBind_       = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingStorageBufferUpdateAfterBind_      = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingUniformTexelBufferUpdateAfterBind_ = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingStorageTexelBufferUpdateAfterBind_ = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingUpdateUnusedWhilePending_          = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingPartiallyBound_                    = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingVariableDescriptorCount_           = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 runtimeDescriptorArray_                             = {},\n                                                                   void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderInputAttachmentArrayDynamicIndexing{ shaderInputAttachmentArrayDynamicIndexing_ }\n      , shaderUniformTexelBufferArrayDynamicIndexing{ shaderUniformTexelBufferArrayDynamicIndexing_ }\n      , shaderStorageTexelBufferArrayDynamicIndexing{ shaderStorageTexelBufferArrayDynamicIndexing_ }\n      , shaderUniformBufferArrayNonUniformIndexing{ shaderUniformBufferArrayNonUniformIndexing_ }\n      , shaderSampledImageArrayNonUniformIndexing{ shaderSampledImageArrayNonUniformIndexing_ }\n      , shaderStorageBufferArrayNonUniformIndexing{ shaderStorageBufferArrayNonUniformIndexing_ }\n      , shaderStorageImageArrayNonUniformIndexing{ shaderStorageImageArrayNonUniformIndexing_ }\n      , shaderInputAttachmentArrayNonUniformIndexing{ shaderInputAttachmentArrayNonUniformIndexing_ }\n      , shaderUniformTexelBufferArrayNonUniformIndexing{ shaderUniformTexelBufferArrayNonUniformIndexing_ }\n      , shaderStorageTexelBufferArrayNonUniformIndexing{ shaderStorageTexelBufferArrayNonUniformIndexing_ }\n      , descriptorBindingUniformBufferUpdateAfterBind{ descriptorBindingUniformBufferUpdateAfterBind_ }\n      , descriptorBindingSampledImageUpdateAfterBind{ descriptorBindingSampledImageUpdateAfterBind_ }\n      , descriptorBindingStorageImageUpdateAfterBind{ descriptorBindingStorageImageUpdateAfterBind_ }\n      , descriptorBindingStorageBufferUpdateAfterBind{ descriptorBindingStorageBufferUpdateAfterBind_ }\n      , descriptorBindingUniformTexelBufferUpdateAfterBind{ descriptorBindingUniformTexelBufferUpdateAfterBind_ }\n      , descriptorBindingStorageTexelBufferUpdateAfterBind{ descriptorBindingStorageTexelBufferUpdateAfterBind_ }\n      , descriptorBindingUpdateUnusedWhilePending{ descriptorBindingUpdateUnusedWhilePending_ }\n      , descriptorBindingPartiallyBound{ descriptorBindingPartiallyBound_ }\n      , descriptorBindingVariableDescriptorCount{ descriptorBindingVariableDescriptorCount_ }\n      , runtimeDescriptorArray{ runtimeDescriptorArray_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDescriptorIndexingFeatures( PhysicalDeviceDescriptorIndexingFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDescriptorIndexingFeatures( VkPhysicalDeviceDescriptorIndexingFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDescriptorIndexingFeatures( *reinterpret_cast<PhysicalDeviceDescriptorIndexingFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDescriptorIndexingFeatures & operator=( PhysicalDeviceDescriptorIndexingFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDescriptorIndexingFeatures & operator=( VkPhysicalDeviceDescriptorIndexingFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorIndexingFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorIndexingFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorIndexingFeatures &\n      setShaderInputAttachmentArrayDynamicIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderInputAttachmentArrayDynamicIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderInputAttachmentArrayDynamicIndexing = shaderInputAttachmentArrayDynamicIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorIndexingFeatures &\n      setShaderUniformTexelBufferArrayDynamicIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderUniformTexelBufferArrayDynamicIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderUniformTexelBufferArrayDynamicIndexing = shaderUniformTexelBufferArrayDynamicIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorIndexingFeatures &\n      setShaderStorageTexelBufferArrayDynamicIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderStorageTexelBufferArrayDynamicIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderStorageTexelBufferArrayDynamicIndexing = shaderStorageTexelBufferArrayDynamicIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorIndexingFeatures &\n      setShaderUniformBufferArrayNonUniformIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderUniformBufferArrayNonUniformIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderUniformBufferArrayNonUniformIndexing = shaderUniformBufferArrayNonUniformIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorIndexingFeatures &\n      setShaderSampledImageArrayNonUniformIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderSampledImageArrayNonUniformIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSampledImageArrayNonUniformIndexing = shaderSampledImageArrayNonUniformIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorIndexingFeatures &\n      setShaderStorageBufferArrayNonUniformIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderStorageBufferArrayNonUniformIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderStorageBufferArrayNonUniformIndexing = shaderStorageBufferArrayNonUniformIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorIndexingFeatures &\n      setShaderStorageImageArrayNonUniformIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderStorageImageArrayNonUniformIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderStorageImageArrayNonUniformIndexing = shaderStorageImageArrayNonUniformIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorIndexingFeatures &\n      setShaderInputAttachmentArrayNonUniformIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderInputAttachmentArrayNonUniformIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderInputAttachmentArrayNonUniformIndexing = shaderInputAttachmentArrayNonUniformIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorIndexingFeatures &\n      setShaderUniformTexelBufferArrayNonUniformIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderUniformTexelBufferArrayNonUniformIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderUniformTexelBufferArrayNonUniformIndexing = shaderUniformTexelBufferArrayNonUniformIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorIndexingFeatures &\n      setShaderStorageTexelBufferArrayNonUniformIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderStorageTexelBufferArrayNonUniformIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderStorageTexelBufferArrayNonUniformIndexing = shaderStorageTexelBufferArrayNonUniformIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorIndexingFeatures &\n      setDescriptorBindingUniformBufferUpdateAfterBind( VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingUniformBufferUpdateAfterBind_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBindingUniformBufferUpdateAfterBind = descriptorBindingUniformBufferUpdateAfterBind_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorIndexingFeatures &\n      setDescriptorBindingSampledImageUpdateAfterBind( VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingSampledImageUpdateAfterBind_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBindingSampledImageUpdateAfterBind = descriptorBindingSampledImageUpdateAfterBind_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorIndexingFeatures &\n      setDescriptorBindingStorageImageUpdateAfterBind( VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingStorageImageUpdateAfterBind_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBindingStorageImageUpdateAfterBind = descriptorBindingStorageImageUpdateAfterBind_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorIndexingFeatures &\n      setDescriptorBindingStorageBufferUpdateAfterBind( VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingStorageBufferUpdateAfterBind_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBindingStorageBufferUpdateAfterBind = descriptorBindingStorageBufferUpdateAfterBind_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorIndexingFeatures & setDescriptorBindingUniformTexelBufferUpdateAfterBind(\n      VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingUniformTexelBufferUpdateAfterBind_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBindingUniformTexelBufferUpdateAfterBind = descriptorBindingUniformTexelBufferUpdateAfterBind_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorIndexingFeatures & setDescriptorBindingStorageTexelBufferUpdateAfterBind(\n      VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingStorageTexelBufferUpdateAfterBind_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBindingStorageTexelBufferUpdateAfterBind = descriptorBindingStorageTexelBufferUpdateAfterBind_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorIndexingFeatures &\n      setDescriptorBindingUpdateUnusedWhilePending( VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingUpdateUnusedWhilePending_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBindingUpdateUnusedWhilePending = descriptorBindingUpdateUnusedWhilePending_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorIndexingFeatures &\n      setDescriptorBindingPartiallyBound( VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingPartiallyBound_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBindingPartiallyBound = descriptorBindingPartiallyBound_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorIndexingFeatures &\n      setDescriptorBindingVariableDescriptorCount( VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingVariableDescriptorCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBindingVariableDescriptorCount = descriptorBindingVariableDescriptorCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorIndexingFeatures &\n      setRuntimeDescriptorArray( VULKAN_HPP_NAMESPACE::Bool32 runtimeDescriptorArray_ ) VULKAN_HPP_NOEXCEPT\n    {\n      runtimeDescriptorArray = runtimeDescriptorArray_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceDescriptorIndexingFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceDescriptorIndexingFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDescriptorIndexingFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       shaderInputAttachmentArrayDynamicIndexing,\n                       shaderUniformTexelBufferArrayDynamicIndexing,\n                       shaderStorageTexelBufferArrayDynamicIndexing,\n                       shaderUniformBufferArrayNonUniformIndexing,\n                       shaderSampledImageArrayNonUniformIndexing,\n                       shaderStorageBufferArrayNonUniformIndexing,\n                       shaderStorageImageArrayNonUniformIndexing,\n                       shaderInputAttachmentArrayNonUniformIndexing,\n                       shaderUniformTexelBufferArrayNonUniformIndexing,\n                       shaderStorageTexelBufferArrayNonUniformIndexing,\n                       descriptorBindingUniformBufferUpdateAfterBind,\n                       descriptorBindingSampledImageUpdateAfterBind,\n                       descriptorBindingStorageImageUpdateAfterBind,\n                       descriptorBindingStorageBufferUpdateAfterBind,\n                       descriptorBindingUniformTexelBufferUpdateAfterBind,\n                       descriptorBindingStorageTexelBufferUpdateAfterBind,\n                       descriptorBindingUpdateUnusedWhilePending,\n                       descriptorBindingPartiallyBound,\n                       descriptorBindingVariableDescriptorCount,\n                       runtimeDescriptorArray );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDescriptorIndexingFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDescriptorIndexingFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) &&\n             ( shaderInputAttachmentArrayDynamicIndexing == rhs.shaderInputAttachmentArrayDynamicIndexing ) &&\n             ( shaderUniformTexelBufferArrayDynamicIndexing == rhs.shaderUniformTexelBufferArrayDynamicIndexing ) &&\n             ( shaderStorageTexelBufferArrayDynamicIndexing == rhs.shaderStorageTexelBufferArrayDynamicIndexing ) &&\n             ( shaderUniformBufferArrayNonUniformIndexing == rhs.shaderUniformBufferArrayNonUniformIndexing ) &&\n             ( shaderSampledImageArrayNonUniformIndexing == rhs.shaderSampledImageArrayNonUniformIndexing ) &&\n             ( shaderStorageBufferArrayNonUniformIndexing == rhs.shaderStorageBufferArrayNonUniformIndexing ) &&\n             ( shaderStorageImageArrayNonUniformIndexing == rhs.shaderStorageImageArrayNonUniformIndexing ) &&\n             ( shaderInputAttachmentArrayNonUniformIndexing == rhs.shaderInputAttachmentArrayNonUniformIndexing ) &&\n             ( shaderUniformTexelBufferArrayNonUniformIndexing == rhs.shaderUniformTexelBufferArrayNonUniformIndexing ) &&\n             ( shaderStorageTexelBufferArrayNonUniformIndexing == rhs.shaderStorageTexelBufferArrayNonUniformIndexing ) &&\n             ( descriptorBindingUniformBufferUpdateAfterBind == rhs.descriptorBindingUniformBufferUpdateAfterBind ) &&\n             ( descriptorBindingSampledImageUpdateAfterBind == rhs.descriptorBindingSampledImageUpdateAfterBind ) &&\n             ( descriptorBindingStorageImageUpdateAfterBind == rhs.descriptorBindingStorageImageUpdateAfterBind ) &&\n             ( descriptorBindingStorageBufferUpdateAfterBind == rhs.descriptorBindingStorageBufferUpdateAfterBind ) &&\n             ( descriptorBindingUniformTexelBufferUpdateAfterBind == rhs.descriptorBindingUniformTexelBufferUpdateAfterBind ) &&\n             ( descriptorBindingStorageTexelBufferUpdateAfterBind == rhs.descriptorBindingStorageTexelBufferUpdateAfterBind ) &&\n             ( descriptorBindingUpdateUnusedWhilePending == rhs.descriptorBindingUpdateUnusedWhilePending ) &&\n             ( descriptorBindingPartiallyBound == rhs.descriptorBindingPartiallyBound ) &&\n             ( descriptorBindingVariableDescriptorCount == rhs.descriptorBindingVariableDescriptorCount ) &&\n             ( runtimeDescriptorArray == rhs.runtimeDescriptorArray );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDescriptorIndexingFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                              = StructureType::ePhysicalDeviceDescriptorIndexingFeatures;\n    void *                              pNext                                              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderInputAttachmentArrayDynamicIndexing          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderUniformTexelBufferArrayDynamicIndexing       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderStorageTexelBufferArrayDynamicIndexing       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderUniformBufferArrayNonUniformIndexing         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSampledImageArrayNonUniformIndexing          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderStorageBufferArrayNonUniformIndexing         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderStorageImageArrayNonUniformIndexing          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderInputAttachmentArrayNonUniformIndexing       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderUniformTexelBufferArrayNonUniformIndexing    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderStorageTexelBufferArrayNonUniformIndexing    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBindingUniformBufferUpdateAfterBind      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBindingSampledImageUpdateAfterBind       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBindingStorageImageUpdateAfterBind       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBindingStorageBufferUpdateAfterBind      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBindingUniformTexelBufferUpdateAfterBind = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBindingStorageTexelBufferUpdateAfterBind = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBindingUpdateUnusedWhilePending          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBindingPartiallyBound                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBindingVariableDescriptorCount           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        runtimeDescriptorArray                             = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDescriptorIndexingFeatures>\n  {\n    using Type = PhysicalDeviceDescriptorIndexingFeatures;\n  };\n\n  using PhysicalDeviceDescriptorIndexingFeaturesEXT = PhysicalDeviceDescriptorIndexingFeatures;\n\n  struct PhysicalDeviceDescriptorIndexingProperties\n  {\n    using NativeType = VkPhysicalDeviceDescriptorIndexingProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDescriptorIndexingProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDescriptorIndexingProperties( uint32_t                     maxUpdateAfterBindDescriptorsInAllPools_              = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 shaderUniformBufferArrayNonUniformIndexingNative_     = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 shaderSampledImageArrayNonUniformIndexingNative_      = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 shaderStorageBufferArrayNonUniformIndexingNative_     = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 shaderStorageImageArrayNonUniformIndexingNative_      = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 shaderInputAttachmentArrayNonUniformIndexingNative_   = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 robustBufferAccessUpdateAfterBind_                    = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 quadDivergentImplicitLod_                             = {},\n                                                                     uint32_t                     maxPerStageDescriptorUpdateAfterBindSamplers_         = {},\n                                                                     uint32_t                     maxPerStageDescriptorUpdateAfterBindUniformBuffers_   = {},\n                                                                     uint32_t                     maxPerStageDescriptorUpdateAfterBindStorageBuffers_   = {},\n                                                                     uint32_t                     maxPerStageDescriptorUpdateAfterBindSampledImages_    = {},\n                                                                     uint32_t                     maxPerStageDescriptorUpdateAfterBindStorageImages_    = {},\n                                                                     uint32_t                     maxPerStageDescriptorUpdateAfterBindInputAttachments_ = {},\n                                                                     uint32_t                     maxPerStageUpdateAfterBindResources_                  = {},\n                                                                     uint32_t                     maxDescriptorSetUpdateAfterBindSamplers_              = {},\n                                                                     uint32_t                     maxDescriptorSetUpdateAfterBindUniformBuffers_        = {},\n                                                                     uint32_t                     maxDescriptorSetUpdateAfterBindUniformBuffersDynamic_ = {},\n                                                                     uint32_t                     maxDescriptorSetUpdateAfterBindStorageBuffers_        = {},\n                                                                     uint32_t                     maxDescriptorSetUpdateAfterBindStorageBuffersDynamic_ = {},\n                                                                     uint32_t                     maxDescriptorSetUpdateAfterBindSampledImages_         = {},\n                                                                     uint32_t                     maxDescriptorSetUpdateAfterBindStorageImages_         = {},\n                                                                     uint32_t                     maxDescriptorSetUpdateAfterBindInputAttachments_      = {},\n                                                                     void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxUpdateAfterBindDescriptorsInAllPools{ maxUpdateAfterBindDescriptorsInAllPools_ }\n      , shaderUniformBufferArrayNonUniformIndexingNative{ shaderUniformBufferArrayNonUniformIndexingNative_ }\n      , shaderSampledImageArrayNonUniformIndexingNative{ shaderSampledImageArrayNonUniformIndexingNative_ }\n      , shaderStorageBufferArrayNonUniformIndexingNative{ shaderStorageBufferArrayNonUniformIndexingNative_ }\n      , shaderStorageImageArrayNonUniformIndexingNative{ shaderStorageImageArrayNonUniformIndexingNative_ }\n      , shaderInputAttachmentArrayNonUniformIndexingNative{ shaderInputAttachmentArrayNonUniformIndexingNative_ }\n      , robustBufferAccessUpdateAfterBind{ robustBufferAccessUpdateAfterBind_ }\n      , quadDivergentImplicitLod{ quadDivergentImplicitLod_ }\n      , maxPerStageDescriptorUpdateAfterBindSamplers{ maxPerStageDescriptorUpdateAfterBindSamplers_ }\n      , maxPerStageDescriptorUpdateAfterBindUniformBuffers{ maxPerStageDescriptorUpdateAfterBindUniformBuffers_ }\n      , maxPerStageDescriptorUpdateAfterBindStorageBuffers{ maxPerStageDescriptorUpdateAfterBindStorageBuffers_ }\n      , maxPerStageDescriptorUpdateAfterBindSampledImages{ maxPerStageDescriptorUpdateAfterBindSampledImages_ }\n      , maxPerStageDescriptorUpdateAfterBindStorageImages{ maxPerStageDescriptorUpdateAfterBindStorageImages_ }\n      , maxPerStageDescriptorUpdateAfterBindInputAttachments{ maxPerStageDescriptorUpdateAfterBindInputAttachments_ }\n      , maxPerStageUpdateAfterBindResources{ maxPerStageUpdateAfterBindResources_ }\n      , maxDescriptorSetUpdateAfterBindSamplers{ maxDescriptorSetUpdateAfterBindSamplers_ }\n      , maxDescriptorSetUpdateAfterBindUniformBuffers{ maxDescriptorSetUpdateAfterBindUniformBuffers_ }\n      , maxDescriptorSetUpdateAfterBindUniformBuffersDynamic{ maxDescriptorSetUpdateAfterBindUniformBuffersDynamic_ }\n      , maxDescriptorSetUpdateAfterBindStorageBuffers{ maxDescriptorSetUpdateAfterBindStorageBuffers_ }\n      , maxDescriptorSetUpdateAfterBindStorageBuffersDynamic{ maxDescriptorSetUpdateAfterBindStorageBuffersDynamic_ }\n      , maxDescriptorSetUpdateAfterBindSampledImages{ maxDescriptorSetUpdateAfterBindSampledImages_ }\n      , maxDescriptorSetUpdateAfterBindStorageImages{ maxDescriptorSetUpdateAfterBindStorageImages_ }\n      , maxDescriptorSetUpdateAfterBindInputAttachments{ maxDescriptorSetUpdateAfterBindInputAttachments_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDescriptorIndexingProperties( PhysicalDeviceDescriptorIndexingProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDescriptorIndexingProperties( VkPhysicalDeviceDescriptorIndexingProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDescriptorIndexingProperties( *reinterpret_cast<PhysicalDeviceDescriptorIndexingProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDescriptorIndexingProperties & operator=( PhysicalDeviceDescriptorIndexingProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDescriptorIndexingProperties & operator=( VkPhysicalDeviceDescriptorIndexingProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorIndexingProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceDescriptorIndexingProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingProperties *>( this );\n    }\n\n    operator VkPhysicalDeviceDescriptorIndexingProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDescriptorIndexingProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       maxUpdateAfterBindDescriptorsInAllPools,\n                       shaderUniformBufferArrayNonUniformIndexingNative,\n                       shaderSampledImageArrayNonUniformIndexingNative,\n                       shaderStorageBufferArrayNonUniformIndexingNative,\n                       shaderStorageImageArrayNonUniformIndexingNative,\n                       shaderInputAttachmentArrayNonUniformIndexingNative,\n                       robustBufferAccessUpdateAfterBind,\n                       quadDivergentImplicitLod,\n                       maxPerStageDescriptorUpdateAfterBindSamplers,\n                       maxPerStageDescriptorUpdateAfterBindUniformBuffers,\n                       maxPerStageDescriptorUpdateAfterBindStorageBuffers,\n                       maxPerStageDescriptorUpdateAfterBindSampledImages,\n                       maxPerStageDescriptorUpdateAfterBindStorageImages,\n                       maxPerStageDescriptorUpdateAfterBindInputAttachments,\n                       maxPerStageUpdateAfterBindResources,\n                       maxDescriptorSetUpdateAfterBindSamplers,\n                       maxDescriptorSetUpdateAfterBindUniformBuffers,\n                       maxDescriptorSetUpdateAfterBindUniformBuffersDynamic,\n                       maxDescriptorSetUpdateAfterBindStorageBuffers,\n                       maxDescriptorSetUpdateAfterBindStorageBuffersDynamic,\n                       maxDescriptorSetUpdateAfterBindSampledImages,\n                       maxDescriptorSetUpdateAfterBindStorageImages,\n                       maxDescriptorSetUpdateAfterBindInputAttachments );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDescriptorIndexingProperties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDescriptorIndexingProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxUpdateAfterBindDescriptorsInAllPools == rhs.maxUpdateAfterBindDescriptorsInAllPools ) &&\n             ( shaderUniformBufferArrayNonUniformIndexingNative == rhs.shaderUniformBufferArrayNonUniformIndexingNative ) &&\n             ( shaderSampledImageArrayNonUniformIndexingNative == rhs.shaderSampledImageArrayNonUniformIndexingNative ) &&\n             ( shaderStorageBufferArrayNonUniformIndexingNative == rhs.shaderStorageBufferArrayNonUniformIndexingNative ) &&\n             ( shaderStorageImageArrayNonUniformIndexingNative == rhs.shaderStorageImageArrayNonUniformIndexingNative ) &&\n             ( shaderInputAttachmentArrayNonUniformIndexingNative == rhs.shaderInputAttachmentArrayNonUniformIndexingNative ) &&\n             ( robustBufferAccessUpdateAfterBind == rhs.robustBufferAccessUpdateAfterBind ) && ( quadDivergentImplicitLod == rhs.quadDivergentImplicitLod ) &&\n             ( maxPerStageDescriptorUpdateAfterBindSamplers == rhs.maxPerStageDescriptorUpdateAfterBindSamplers ) &&\n             ( maxPerStageDescriptorUpdateAfterBindUniformBuffers == rhs.maxPerStageDescriptorUpdateAfterBindUniformBuffers ) &&\n             ( maxPerStageDescriptorUpdateAfterBindStorageBuffers == rhs.maxPerStageDescriptorUpdateAfterBindStorageBuffers ) &&\n             ( maxPerStageDescriptorUpdateAfterBindSampledImages == rhs.maxPerStageDescriptorUpdateAfterBindSampledImages ) &&\n             ( maxPerStageDescriptorUpdateAfterBindStorageImages == rhs.maxPerStageDescriptorUpdateAfterBindStorageImages ) &&\n             ( maxPerStageDescriptorUpdateAfterBindInputAttachments == rhs.maxPerStageDescriptorUpdateAfterBindInputAttachments ) &&\n             ( maxPerStageUpdateAfterBindResources == rhs.maxPerStageUpdateAfterBindResources ) &&\n             ( maxDescriptorSetUpdateAfterBindSamplers == rhs.maxDescriptorSetUpdateAfterBindSamplers ) &&\n             ( maxDescriptorSetUpdateAfterBindUniformBuffers == rhs.maxDescriptorSetUpdateAfterBindUniformBuffers ) &&\n             ( maxDescriptorSetUpdateAfterBindUniformBuffersDynamic == rhs.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic ) &&\n             ( maxDescriptorSetUpdateAfterBindStorageBuffers == rhs.maxDescriptorSetUpdateAfterBindStorageBuffers ) &&\n             ( maxDescriptorSetUpdateAfterBindStorageBuffersDynamic == rhs.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic ) &&\n             ( maxDescriptorSetUpdateAfterBindSampledImages == rhs.maxDescriptorSetUpdateAfterBindSampledImages ) &&\n             ( maxDescriptorSetUpdateAfterBindStorageImages == rhs.maxDescriptorSetUpdateAfterBindStorageImages ) &&\n             ( maxDescriptorSetUpdateAfterBindInputAttachments == rhs.maxDescriptorSetUpdateAfterBindInputAttachments );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDescriptorIndexingProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                                = StructureType::ePhysicalDeviceDescriptorIndexingProperties;\n    void *                              pNext                                                = {};\n    uint32_t                            maxUpdateAfterBindDescriptorsInAllPools              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderUniformBufferArrayNonUniformIndexingNative     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSampledImageArrayNonUniformIndexingNative      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderStorageBufferArrayNonUniformIndexingNative     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderStorageImageArrayNonUniformIndexingNative      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderInputAttachmentArrayNonUniformIndexingNative   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        robustBufferAccessUpdateAfterBind                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        quadDivergentImplicitLod                             = {};\n    uint32_t                            maxPerStageDescriptorUpdateAfterBindSamplers         = {};\n    uint32_t                            maxPerStageDescriptorUpdateAfterBindUniformBuffers   = {};\n    uint32_t                            maxPerStageDescriptorUpdateAfterBindStorageBuffers   = {};\n    uint32_t                            maxPerStageDescriptorUpdateAfterBindSampledImages    = {};\n    uint32_t                            maxPerStageDescriptorUpdateAfterBindStorageImages    = {};\n    uint32_t                            maxPerStageDescriptorUpdateAfterBindInputAttachments = {};\n    uint32_t                            maxPerStageUpdateAfterBindResources                  = {};\n    uint32_t                            maxDescriptorSetUpdateAfterBindSamplers              = {};\n    uint32_t                            maxDescriptorSetUpdateAfterBindUniformBuffers        = {};\n    uint32_t                            maxDescriptorSetUpdateAfterBindUniformBuffersDynamic = {};\n    uint32_t                            maxDescriptorSetUpdateAfterBindStorageBuffers        = {};\n    uint32_t                            maxDescriptorSetUpdateAfterBindStorageBuffersDynamic = {};\n    uint32_t                            maxDescriptorSetUpdateAfterBindSampledImages         = {};\n    uint32_t                            maxDescriptorSetUpdateAfterBindStorageImages         = {};\n    uint32_t                            maxDescriptorSetUpdateAfterBindInputAttachments      = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDescriptorIndexingProperties>\n  {\n    using Type = PhysicalDeviceDescriptorIndexingProperties;\n  };\n\n  using PhysicalDeviceDescriptorIndexingPropertiesEXT = PhysicalDeviceDescriptorIndexingProperties;\n\n  struct PhysicalDeviceDescriptorPoolOverallocationFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDescriptorPoolOverallocationFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDescriptorPoolOverallocationFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 descriptorPoolOverallocation_ = {},\n                                                                               void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , descriptorPoolOverallocation{ descriptorPoolOverallocation_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceDescriptorPoolOverallocationFeaturesNV( PhysicalDeviceDescriptorPoolOverallocationFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDescriptorPoolOverallocationFeaturesNV( VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDescriptorPoolOverallocationFeaturesNV( *reinterpret_cast<PhysicalDeviceDescriptorPoolOverallocationFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDescriptorPoolOverallocationFeaturesNV &\n      operator=( PhysicalDeviceDescriptorPoolOverallocationFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDescriptorPoolOverallocationFeaturesNV & operator=( VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorPoolOverallocationFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorPoolOverallocationFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorPoolOverallocationFeaturesNV &\n      setDescriptorPoolOverallocation( VULKAN_HPP_NAMESPACE::Bool32 descriptorPoolOverallocation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorPoolOverallocation = descriptorPoolOverallocation_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, descriptorPoolOverallocation );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDescriptorPoolOverallocationFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDescriptorPoolOverallocationFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( descriptorPoolOverallocation == rhs.descriptorPoolOverallocation );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDescriptorPoolOverallocationFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                        = StructureType::ePhysicalDeviceDescriptorPoolOverallocationFeaturesNV;\n    void *                              pNext                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorPoolOverallocation = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDescriptorPoolOverallocationFeaturesNV>\n  {\n    using Type = PhysicalDeviceDescriptorPoolOverallocationFeaturesNV;\n  };\n\n  struct PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE\n  {\n    using NativeType = VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDescriptorSetHostMappingFeaturesVALVE;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE( VULKAN_HPP_NAMESPACE::Bool32 descriptorSetHostMapping_ = {},\n                                                                              void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , descriptorSetHostMapping{ descriptorSetHostMapping_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE( PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE( VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE( *reinterpret_cast<PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE &\n      operator=( PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE & operator=( VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE &\n      setDescriptorSetHostMapping( VULKAN_HPP_NAMESPACE::Bool32 descriptorSetHostMapping_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorSetHostMapping = descriptorSetHostMapping_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE *>( this );\n    }\n\n    operator VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, descriptorSetHostMapping );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( descriptorSetHostMapping == rhs.descriptorSetHostMapping );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                    = StructureType::ePhysicalDeviceDescriptorSetHostMappingFeaturesVALVE;\n    void *                              pNext                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorSetHostMapping = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDescriptorSetHostMappingFeaturesVALVE>\n  {\n    using Type = PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE;\n  };\n\n  struct PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 deviceGeneratedCompute_              = {},\n                                                                                 VULKAN_HPP_NAMESPACE::Bool32 deviceGeneratedComputePipelines_     = {},\n                                                                                 VULKAN_HPP_NAMESPACE::Bool32 deviceGeneratedComputeCaptureReplay_ = {},\n                                                                                 void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , deviceGeneratedCompute{ deviceGeneratedCompute_ }\n      , deviceGeneratedComputePipelines{ deviceGeneratedComputePipelines_ }\n      , deviceGeneratedComputeCaptureReplay{ deviceGeneratedComputeCaptureReplay_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV( PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV const & rhs )\n      VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV( VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV( *reinterpret_cast<PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV &\n      operator=( PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV &\n      operator=( VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV &\n      setDeviceGeneratedCompute( VULKAN_HPP_NAMESPACE::Bool32 deviceGeneratedCompute_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceGeneratedCompute = deviceGeneratedCompute_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV &\n      setDeviceGeneratedComputePipelines( VULKAN_HPP_NAMESPACE::Bool32 deviceGeneratedComputePipelines_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceGeneratedComputePipelines = deviceGeneratedComputePipelines_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV &\n      setDeviceGeneratedComputeCaptureReplay( VULKAN_HPP_NAMESPACE::Bool32 deviceGeneratedComputeCaptureReplay_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceGeneratedComputeCaptureReplay = deviceGeneratedComputeCaptureReplay_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, deviceGeneratedCompute, deviceGeneratedComputePipelines, deviceGeneratedComputeCaptureReplay );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( deviceGeneratedCompute == rhs.deviceGeneratedCompute ) &&\n             ( deviceGeneratedComputePipelines == rhs.deviceGeneratedComputePipelines ) &&\n             ( deviceGeneratedComputeCaptureReplay == rhs.deviceGeneratedComputeCaptureReplay );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                               = StructureType::ePhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV;\n    void *                              pNext                               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        deviceGeneratedCompute              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        deviceGeneratedComputePipelines     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        deviceGeneratedComputeCaptureReplay = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV>\n  {\n    using Type = PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV;\n  };\n\n  struct PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDeviceGeneratedCommandsFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 deviceGeneratedCommands_        = {},\n                                                                           VULKAN_HPP_NAMESPACE::Bool32 dynamicGeneratedPipelineLayout_ = {},\n                                                                           void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , deviceGeneratedCommands{ deviceGeneratedCommands_ }\n      , dynamicGeneratedPipelineLayout{ dynamicGeneratedPipelineLayout_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT( PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT( VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT( *reinterpret_cast<PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT & operator=( PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT & operator=( VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT &\n      setDeviceGeneratedCommands( VULKAN_HPP_NAMESPACE::Bool32 deviceGeneratedCommands_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceGeneratedCommands = deviceGeneratedCommands_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT &\n      setDynamicGeneratedPipelineLayout( VULKAN_HPP_NAMESPACE::Bool32 dynamicGeneratedPipelineLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dynamicGeneratedPipelineLayout = dynamicGeneratedPipelineLayout_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, deviceGeneratedCommands, dynamicGeneratedPipelineLayout );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( deviceGeneratedCommands == rhs.deviceGeneratedCommands ) &&\n             ( dynamicGeneratedPipelineLayout == rhs.dynamicGeneratedPipelineLayout );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                          = StructureType::ePhysicalDeviceDeviceGeneratedCommandsFeaturesEXT;\n    void *                              pNext                          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        deviceGeneratedCommands        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        dynamicGeneratedPipelineLayout = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDeviceGeneratedCommandsFeaturesEXT>\n  {\n    using Type = PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT;\n  };\n\n  struct PhysicalDeviceDeviceGeneratedCommandsFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDeviceGeneratedCommandsFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDeviceGeneratedCommandsFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 deviceGeneratedCommands_ = {},\n                                                                          void *                       pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , deviceGeneratedCommands{ deviceGeneratedCommands_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceDeviceGeneratedCommandsFeaturesNV( PhysicalDeviceDeviceGeneratedCommandsFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDeviceGeneratedCommandsFeaturesNV( VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDeviceGeneratedCommandsFeaturesNV( *reinterpret_cast<PhysicalDeviceDeviceGeneratedCommandsFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDeviceGeneratedCommandsFeaturesNV & operator=( PhysicalDeviceDeviceGeneratedCommandsFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDeviceGeneratedCommandsFeaturesNV & operator=( VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDeviceGeneratedCommandsFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDeviceGeneratedCommandsFeaturesNV &\n      setDeviceGeneratedCommands( VULKAN_HPP_NAMESPACE::Bool32 deviceGeneratedCommands_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceGeneratedCommands = deviceGeneratedCommands_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, deviceGeneratedCommands );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDeviceGeneratedCommandsFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDeviceGeneratedCommandsFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( deviceGeneratedCommands == rhs.deviceGeneratedCommands );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDeviceGeneratedCommandsFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                   = StructureType::ePhysicalDeviceDeviceGeneratedCommandsFeaturesNV;\n    void *                              pNext                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        deviceGeneratedCommands = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDeviceGeneratedCommandsFeaturesNV>\n  {\n    using Type = PhysicalDeviceDeviceGeneratedCommandsFeaturesNV;\n  };\n\n  struct PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDeviceGeneratedCommandsPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT( uint32_t                                                maxIndirectPipelineCount_              = {},\n                                                          uint32_t                                                maxIndirectShaderObjectCount_          = {},\n                                                          uint32_t                                                maxIndirectSequenceCount_              = {},\n                                                          uint32_t                                                maxIndirectCommandsTokenCount_         = {},\n                                                          uint32_t                                                maxIndirectCommandsTokenOffset_        = {},\n                                                          uint32_t                                                maxIndirectCommandsIndirectStride_     = {},\n                                                          VULKAN_HPP_NAMESPACE::IndirectCommandsInputModeFlagsEXT supportedIndirectCommandsInputModes_   = {},\n                                                          VULKAN_HPP_NAMESPACE::ShaderStageFlags                  supportedIndirectCommandsShaderStages_ = {},\n                                                          VULKAN_HPP_NAMESPACE::ShaderStageFlags supportedIndirectCommandsShaderStagesPipelineBinding_   = {},\n                                                          VULKAN_HPP_NAMESPACE::ShaderStageFlags supportedIndirectCommandsShaderStagesShaderBinding_     = {},\n                                                          VULKAN_HPP_NAMESPACE::Bool32           deviceGeneratedCommandsTransformFeedback_               = {},\n                                                          VULKAN_HPP_NAMESPACE::Bool32           deviceGeneratedCommandsMultiDrawIndirectCount_          = {},\n                                                          void *                                 pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxIndirectPipelineCount{ maxIndirectPipelineCount_ }\n      , maxIndirectShaderObjectCount{ maxIndirectShaderObjectCount_ }\n      , maxIndirectSequenceCount{ maxIndirectSequenceCount_ }\n      , maxIndirectCommandsTokenCount{ maxIndirectCommandsTokenCount_ }\n      , maxIndirectCommandsTokenOffset{ maxIndirectCommandsTokenOffset_ }\n      , maxIndirectCommandsIndirectStride{ maxIndirectCommandsIndirectStride_ }\n      , supportedIndirectCommandsInputModes{ supportedIndirectCommandsInputModes_ }\n      , supportedIndirectCommandsShaderStages{ supportedIndirectCommandsShaderStages_ }\n      , supportedIndirectCommandsShaderStagesPipelineBinding{ supportedIndirectCommandsShaderStagesPipelineBinding_ }\n      , supportedIndirectCommandsShaderStagesShaderBinding{ supportedIndirectCommandsShaderStagesShaderBinding_ }\n      , deviceGeneratedCommandsTransformFeedback{ deviceGeneratedCommandsTransformFeedback_ }\n      , deviceGeneratedCommandsMultiDrawIndirectCount{ deviceGeneratedCommandsMultiDrawIndirectCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT( PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT( VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT( *reinterpret_cast<PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT &\n      operator=( PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT & operator=( VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::IndirectCommandsInputModeFlagsEXT const &,\n               VULKAN_HPP_NAMESPACE::ShaderStageFlags const &,\n               VULKAN_HPP_NAMESPACE::ShaderStageFlags const &,\n               VULKAN_HPP_NAMESPACE::ShaderStageFlags const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       maxIndirectPipelineCount,\n                       maxIndirectShaderObjectCount,\n                       maxIndirectSequenceCount,\n                       maxIndirectCommandsTokenCount,\n                       maxIndirectCommandsTokenOffset,\n                       maxIndirectCommandsIndirectStride,\n                       supportedIndirectCommandsInputModes,\n                       supportedIndirectCommandsShaderStages,\n                       supportedIndirectCommandsShaderStagesPipelineBinding,\n                       supportedIndirectCommandsShaderStagesShaderBinding,\n                       deviceGeneratedCommandsTransformFeedback,\n                       deviceGeneratedCommandsMultiDrawIndirectCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxIndirectPipelineCount == rhs.maxIndirectPipelineCount ) &&\n             ( maxIndirectShaderObjectCount == rhs.maxIndirectShaderObjectCount ) && ( maxIndirectSequenceCount == rhs.maxIndirectSequenceCount ) &&\n             ( maxIndirectCommandsTokenCount == rhs.maxIndirectCommandsTokenCount ) &&\n             ( maxIndirectCommandsTokenOffset == rhs.maxIndirectCommandsTokenOffset ) &&\n             ( maxIndirectCommandsIndirectStride == rhs.maxIndirectCommandsIndirectStride ) &&\n             ( supportedIndirectCommandsInputModes == rhs.supportedIndirectCommandsInputModes ) &&\n             ( supportedIndirectCommandsShaderStages == rhs.supportedIndirectCommandsShaderStages ) &&\n             ( supportedIndirectCommandsShaderStagesPipelineBinding == rhs.supportedIndirectCommandsShaderStagesPipelineBinding ) &&\n             ( supportedIndirectCommandsShaderStagesShaderBinding == rhs.supportedIndirectCommandsShaderStagesShaderBinding ) &&\n             ( deviceGeneratedCommandsTransformFeedback == rhs.deviceGeneratedCommandsTransformFeedback ) &&\n             ( deviceGeneratedCommandsMultiDrawIndirectCount == rhs.deviceGeneratedCommandsMultiDrawIndirectCount );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                     sType                          = StructureType::ePhysicalDeviceDeviceGeneratedCommandsPropertiesEXT;\n    void *                                                  pNext                          = {};\n    uint32_t                                                maxIndirectPipelineCount       = {};\n    uint32_t                                                maxIndirectShaderObjectCount   = {};\n    uint32_t                                                maxIndirectSequenceCount       = {};\n    uint32_t                                                maxIndirectCommandsTokenCount  = {};\n    uint32_t                                                maxIndirectCommandsTokenOffset = {};\n    uint32_t                                                maxIndirectCommandsIndirectStride                    = {};\n    VULKAN_HPP_NAMESPACE::IndirectCommandsInputModeFlagsEXT supportedIndirectCommandsInputModes                  = {};\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags                  supportedIndirectCommandsShaderStages                = {};\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags                  supportedIndirectCommandsShaderStagesPipelineBinding = {};\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags                  supportedIndirectCommandsShaderStagesShaderBinding   = {};\n    VULKAN_HPP_NAMESPACE::Bool32                            deviceGeneratedCommandsTransformFeedback             = {};\n    VULKAN_HPP_NAMESPACE::Bool32                            deviceGeneratedCommandsMultiDrawIndirectCount        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDeviceGeneratedCommandsPropertiesEXT>\n  {\n    using Type = PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT;\n  };\n\n  struct PhysicalDeviceDeviceGeneratedCommandsPropertiesNV\n  {\n    using NativeType = VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDeviceGeneratedCommandsPropertiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDeviceGeneratedCommandsPropertiesNV( uint32_t maxGraphicsShaderGroupCount_              = {},\n                                                                            uint32_t maxIndirectSequenceCount_                 = {},\n                                                                            uint32_t maxIndirectCommandsTokenCount_            = {},\n                                                                            uint32_t maxIndirectCommandsStreamCount_           = {},\n                                                                            uint32_t maxIndirectCommandsTokenOffset_           = {},\n                                                                            uint32_t maxIndirectCommandsStreamStride_          = {},\n                                                                            uint32_t minSequencesCountBufferOffsetAlignment_   = {},\n                                                                            uint32_t minSequencesIndexBufferOffsetAlignment_   = {},\n                                                                            uint32_t minIndirectCommandsBufferOffsetAlignment_ = {},\n                                                                            void *   pNext_                                    = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxGraphicsShaderGroupCount{ maxGraphicsShaderGroupCount_ }\n      , maxIndirectSequenceCount{ maxIndirectSequenceCount_ }\n      , maxIndirectCommandsTokenCount{ maxIndirectCommandsTokenCount_ }\n      , maxIndirectCommandsStreamCount{ maxIndirectCommandsStreamCount_ }\n      , maxIndirectCommandsTokenOffset{ maxIndirectCommandsTokenOffset_ }\n      , maxIndirectCommandsStreamStride{ maxIndirectCommandsStreamStride_ }\n      , minSequencesCountBufferOffsetAlignment{ minSequencesCountBufferOffsetAlignment_ }\n      , minSequencesIndexBufferOffsetAlignment{ minSequencesIndexBufferOffsetAlignment_ }\n      , minIndirectCommandsBufferOffsetAlignment{ minIndirectCommandsBufferOffsetAlignment_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceDeviceGeneratedCommandsPropertiesNV( PhysicalDeviceDeviceGeneratedCommandsPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDeviceGeneratedCommandsPropertiesNV( VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDeviceGeneratedCommandsPropertiesNV( *reinterpret_cast<PhysicalDeviceDeviceGeneratedCommandsPropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDeviceGeneratedCommandsPropertiesNV &\n      operator=( PhysicalDeviceDeviceGeneratedCommandsPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDeviceGeneratedCommandsPropertiesNV & operator=( VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsPropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       maxGraphicsShaderGroupCount,\n                       maxIndirectSequenceCount,\n                       maxIndirectCommandsTokenCount,\n                       maxIndirectCommandsStreamCount,\n                       maxIndirectCommandsTokenOffset,\n                       maxIndirectCommandsStreamStride,\n                       minSequencesCountBufferOffsetAlignment,\n                       minSequencesIndexBufferOffsetAlignment,\n                       minIndirectCommandsBufferOffsetAlignment );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDeviceGeneratedCommandsPropertiesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDeviceGeneratedCommandsPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxGraphicsShaderGroupCount == rhs.maxGraphicsShaderGroupCount ) &&\n             ( maxIndirectSequenceCount == rhs.maxIndirectSequenceCount ) && ( maxIndirectCommandsTokenCount == rhs.maxIndirectCommandsTokenCount ) &&\n             ( maxIndirectCommandsStreamCount == rhs.maxIndirectCommandsStreamCount ) &&\n             ( maxIndirectCommandsTokenOffset == rhs.maxIndirectCommandsTokenOffset ) &&\n             ( maxIndirectCommandsStreamStride == rhs.maxIndirectCommandsStreamStride ) &&\n             ( minSequencesCountBufferOffsetAlignment == rhs.minSequencesCountBufferOffsetAlignment ) &&\n             ( minSequencesIndexBufferOffsetAlignment == rhs.minSequencesIndexBufferOffsetAlignment ) &&\n             ( minIndirectCommandsBufferOffsetAlignment == rhs.minIndirectCommandsBufferOffsetAlignment );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDeviceGeneratedCommandsPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                    = StructureType::ePhysicalDeviceDeviceGeneratedCommandsPropertiesNV;\n    void *                              pNext                                    = {};\n    uint32_t                            maxGraphicsShaderGroupCount              = {};\n    uint32_t                            maxIndirectSequenceCount                 = {};\n    uint32_t                            maxIndirectCommandsTokenCount            = {};\n    uint32_t                            maxIndirectCommandsStreamCount           = {};\n    uint32_t                            maxIndirectCommandsTokenOffset           = {};\n    uint32_t                            maxIndirectCommandsStreamStride          = {};\n    uint32_t                            minSequencesCountBufferOffsetAlignment   = {};\n    uint32_t                            minSequencesIndexBufferOffsetAlignment   = {};\n    uint32_t                            minIndirectCommandsBufferOffsetAlignment = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDeviceGeneratedCommandsPropertiesNV>\n  {\n    using Type = PhysicalDeviceDeviceGeneratedCommandsPropertiesNV;\n  };\n\n  struct PhysicalDeviceDeviceMemoryReportFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceDeviceMemoryReportFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDeviceMemoryReportFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDeviceMemoryReportFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 deviceMemoryReport_ = {},\n                                                                      void *                       pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , deviceMemoryReport{ deviceMemoryReport_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDeviceMemoryReportFeaturesEXT( PhysicalDeviceDeviceMemoryReportFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDeviceMemoryReportFeaturesEXT( VkPhysicalDeviceDeviceMemoryReportFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDeviceMemoryReportFeaturesEXT( *reinterpret_cast<PhysicalDeviceDeviceMemoryReportFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDeviceMemoryReportFeaturesEXT & operator=( PhysicalDeviceDeviceMemoryReportFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDeviceMemoryReportFeaturesEXT & operator=( VkPhysicalDeviceDeviceMemoryReportFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceMemoryReportFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDeviceMemoryReportFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDeviceMemoryReportFeaturesEXT &\n      setDeviceMemoryReport( VULKAN_HPP_NAMESPACE::Bool32 deviceMemoryReport_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceMemoryReport = deviceMemoryReport_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceDeviceMemoryReportFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceDeviceMemoryReportFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, deviceMemoryReport );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDeviceMemoryReportFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDeviceMemoryReportFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( deviceMemoryReport == rhs.deviceMemoryReport );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDeviceMemoryReportFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType              = StructureType::ePhysicalDeviceDeviceMemoryReportFeaturesEXT;\n    void *                              pNext              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        deviceMemoryReport = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDeviceMemoryReportFeaturesEXT>\n  {\n    using Type = PhysicalDeviceDeviceMemoryReportFeaturesEXT;\n  };\n\n  struct PhysicalDeviceDiagnosticsConfigFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceDiagnosticsConfigFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDiagnosticsConfigFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDiagnosticsConfigFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 diagnosticsConfig_ = {},\n                                                                    void *                       pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , diagnosticsConfig{ diagnosticsConfig_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDiagnosticsConfigFeaturesNV( PhysicalDeviceDiagnosticsConfigFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDiagnosticsConfigFeaturesNV( VkPhysicalDeviceDiagnosticsConfigFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDiagnosticsConfigFeaturesNV( *reinterpret_cast<PhysicalDeviceDiagnosticsConfigFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDiagnosticsConfigFeaturesNV & operator=( PhysicalDeviceDiagnosticsConfigFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDiagnosticsConfigFeaturesNV & operator=( VkPhysicalDeviceDiagnosticsConfigFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDiagnosticsConfigFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDiagnosticsConfigFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDiagnosticsConfigFeaturesNV &\n      setDiagnosticsConfig( VULKAN_HPP_NAMESPACE::Bool32 diagnosticsConfig_ ) VULKAN_HPP_NOEXCEPT\n    {\n      diagnosticsConfig = diagnosticsConfig_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceDiagnosticsConfigFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDiagnosticsConfigFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceDiagnosticsConfigFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDiagnosticsConfigFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, diagnosticsConfig );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDiagnosticsConfigFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDiagnosticsConfigFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( diagnosticsConfig == rhs.diagnosticsConfig );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDiagnosticsConfigFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType             = StructureType::ePhysicalDeviceDiagnosticsConfigFeaturesNV;\n    void *                              pNext             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        diagnosticsConfig = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDiagnosticsConfigFeaturesNV>\n  {\n    using Type = PhysicalDeviceDiagnosticsConfigFeaturesNV;\n  };\n\n  struct PhysicalDeviceDiscardRectanglePropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceDiscardRectanglePropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDiscardRectanglePropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDiscardRectanglePropertiesEXT( uint32_t maxDiscardRectangles_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxDiscardRectangles{ maxDiscardRectangles_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDiscardRectanglePropertiesEXT( PhysicalDeviceDiscardRectanglePropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDiscardRectanglePropertiesEXT( VkPhysicalDeviceDiscardRectanglePropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDiscardRectanglePropertiesEXT( *reinterpret_cast<PhysicalDeviceDiscardRectanglePropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDiscardRectanglePropertiesEXT & operator=( PhysicalDeviceDiscardRectanglePropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDiscardRectanglePropertiesEXT & operator=( VkPhysicalDeviceDiscardRectanglePropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDiscardRectanglePropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceDiscardRectanglePropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDiscardRectanglePropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceDiscardRectanglePropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDiscardRectanglePropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxDiscardRectangles );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDiscardRectanglePropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDiscardRectanglePropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxDiscardRectangles == rhs.maxDiscardRectangles );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDiscardRectanglePropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                = StructureType::ePhysicalDeviceDiscardRectanglePropertiesEXT;\n    void *                              pNext                = {};\n    uint32_t                            maxDiscardRectangles = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDiscardRectanglePropertiesEXT>\n  {\n    using Type = PhysicalDeviceDiscardRectanglePropertiesEXT;\n  };\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  struct PhysicalDeviceDisplacementMicromapFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceDisplacementMicromapFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDisplacementMicromapFeaturesNV;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDisplacementMicromapFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 displacementMicromap_ = {},\n                                                                       void *                       pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , displacementMicromap{ displacementMicromap_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDisplacementMicromapFeaturesNV( PhysicalDeviceDisplacementMicromapFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDisplacementMicromapFeaturesNV( VkPhysicalDeviceDisplacementMicromapFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDisplacementMicromapFeaturesNV( *reinterpret_cast<PhysicalDeviceDisplacementMicromapFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDisplacementMicromapFeaturesNV & operator=( PhysicalDeviceDisplacementMicromapFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDisplacementMicromapFeaturesNV & operator=( VkPhysicalDeviceDisplacementMicromapFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDisplacementMicromapFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDisplacementMicromapFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDisplacementMicromapFeaturesNV &\n      setDisplacementMicromap( VULKAN_HPP_NAMESPACE::Bool32 displacementMicromap_ ) VULKAN_HPP_NOEXCEPT\n    {\n      displacementMicromap = displacementMicromap_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceDisplacementMicromapFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDisplacementMicromapFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceDisplacementMicromapFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDisplacementMicromapFeaturesNV *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, displacementMicromap );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDisplacementMicromapFeaturesNV const & ) const = default;\n#  else\n    bool operator==( PhysicalDeviceDisplacementMicromapFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( displacementMicromap == rhs.displacementMicromap );\n#    endif\n    }\n\n    bool operator!=( PhysicalDeviceDisplacementMicromapFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                = StructureType::ePhysicalDeviceDisplacementMicromapFeaturesNV;\n    void *                              pNext                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        displacementMicromap = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDisplacementMicromapFeaturesNV>\n  {\n    using Type = PhysicalDeviceDisplacementMicromapFeaturesNV;\n  };\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  struct PhysicalDeviceDisplacementMicromapPropertiesNV\n  {\n    using NativeType = VkPhysicalDeviceDisplacementMicromapPropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDisplacementMicromapPropertiesNV;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDisplacementMicromapPropertiesNV( uint32_t maxDisplacementMicromapSubdivisionLevel_ = {},\n                                                                         void *   pNext_                                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxDisplacementMicromapSubdivisionLevel{ maxDisplacementMicromapSubdivisionLevel_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceDisplacementMicromapPropertiesNV( PhysicalDeviceDisplacementMicromapPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDisplacementMicromapPropertiesNV( VkPhysicalDeviceDisplacementMicromapPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDisplacementMicromapPropertiesNV( *reinterpret_cast<PhysicalDeviceDisplacementMicromapPropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDisplacementMicromapPropertiesNV & operator=( PhysicalDeviceDisplacementMicromapPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDisplacementMicromapPropertiesNV & operator=( VkPhysicalDeviceDisplacementMicromapPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDisplacementMicromapPropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceDisplacementMicromapPropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDisplacementMicromapPropertiesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceDisplacementMicromapPropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDisplacementMicromapPropertiesNV *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxDisplacementMicromapSubdivisionLevel );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDisplacementMicromapPropertiesNV const & ) const = default;\n#  else\n    bool operator==( PhysicalDeviceDisplacementMicromapPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxDisplacementMicromapSubdivisionLevel == rhs.maxDisplacementMicromapSubdivisionLevel );\n#    endif\n    }\n\n    bool operator!=( PhysicalDeviceDisplacementMicromapPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                   = StructureType::ePhysicalDeviceDisplacementMicromapPropertiesNV;\n    void *                              pNext                                   = {};\n    uint32_t                            maxDisplacementMicromapSubdivisionLevel = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDisplacementMicromapPropertiesNV>\n  {\n    using Type = PhysicalDeviceDisplacementMicromapPropertiesNV;\n  };\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  struct PhysicalDeviceDriverProperties\n  {\n    using NativeType = VkPhysicalDeviceDriverProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDriverProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDriverProperties( VULKAN_HPP_NAMESPACE::DriverId driverID_ = VULKAN_HPP_NAMESPACE::DriverId::eAmdProprietary,\n                                                            std::array<char, VK_MAX_DRIVER_NAME_SIZE> const & driverName_         = {},\n                                                            std::array<char, VK_MAX_DRIVER_INFO_SIZE> const & driverInfo_         = {},\n                                                            VULKAN_HPP_NAMESPACE::ConformanceVersion          conformanceVersion_ = {},\n                                                            void *                                            pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , driverID{ driverID_ }\n      , driverName{ driverName_ }\n      , driverInfo{ driverInfo_ }\n      , conformanceVersion{ conformanceVersion_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDriverProperties( PhysicalDeviceDriverProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDriverProperties( VkPhysicalDeviceDriverProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDriverProperties( *reinterpret_cast<PhysicalDeviceDriverProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDriverProperties & operator=( PhysicalDeviceDriverProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDriverProperties & operator=( VkPhysicalDeviceDriverProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDriverProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceDriverProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDriverProperties *>( this );\n    }\n\n    operator VkPhysicalDeviceDriverProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDriverProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::DriverId const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DRIVER_NAME_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DRIVER_INFO_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::ConformanceVersion const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, driverID, driverName, driverInfo, conformanceVersion );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( PhysicalDeviceDriverProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = driverID <=> rhs.driverID; cmp != 0 )\n        return cmp;\n      if ( auto cmp = strcmp( driverName, rhs.driverName ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = strcmp( driverInfo, rhs.driverInfo ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = conformanceVersion <=> rhs.conformanceVersion; cmp != 0 )\n        return cmp;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( PhysicalDeviceDriverProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( driverID == rhs.driverID ) && ( strcmp( driverName, rhs.driverName ) == 0 ) &&\n             ( strcmp( driverInfo, rhs.driverInfo ) == 0 ) && ( conformanceVersion == rhs.conformanceVersion );\n    }\n\n    bool operator!=( PhysicalDeviceDriverProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                 sType              = StructureType::ePhysicalDeviceDriverProperties;\n    void *                                                              pNext              = {};\n    VULKAN_HPP_NAMESPACE::DriverId                                      driverID           = VULKAN_HPP_NAMESPACE::DriverId::eAmdProprietary;\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DRIVER_NAME_SIZE> driverName         = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DRIVER_INFO_SIZE> driverInfo         = {};\n    VULKAN_HPP_NAMESPACE::ConformanceVersion                            conformanceVersion = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDriverProperties>\n  {\n    using Type = PhysicalDeviceDriverProperties;\n  };\n\n  using PhysicalDeviceDriverPropertiesKHR = PhysicalDeviceDriverProperties;\n\n  struct PhysicalDeviceDrmPropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceDrmPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDrmPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDrmPropertiesEXT( VULKAN_HPP_NAMESPACE::Bool32 hasPrimary_   = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 hasRender_    = {},\n                                                         int64_t                      primaryMajor_ = {},\n                                                         int64_t                      primaryMinor_ = {},\n                                                         int64_t                      renderMajor_  = {},\n                                                         int64_t                      renderMinor_  = {},\n                                                         void *                       pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , hasPrimary{ hasPrimary_ }\n      , hasRender{ hasRender_ }\n      , primaryMajor{ primaryMajor_ }\n      , primaryMinor{ primaryMinor_ }\n      , renderMajor{ renderMajor_ }\n      , renderMinor{ renderMinor_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDrmPropertiesEXT( PhysicalDeviceDrmPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDrmPropertiesEXT( VkPhysicalDeviceDrmPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDrmPropertiesEXT( *reinterpret_cast<PhysicalDeviceDrmPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDrmPropertiesEXT & operator=( PhysicalDeviceDrmPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDrmPropertiesEXT & operator=( VkPhysicalDeviceDrmPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDrmPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceDrmPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDrmPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceDrmPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDrmPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               int64_t const &,\n               int64_t const &,\n               int64_t const &,\n               int64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, hasPrimary, hasRender, primaryMajor, primaryMinor, renderMajor, renderMinor );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDrmPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDrmPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( hasPrimary == rhs.hasPrimary ) && ( hasRender == rhs.hasRender ) &&\n             ( primaryMajor == rhs.primaryMajor ) && ( primaryMinor == rhs.primaryMinor ) && ( renderMajor == rhs.renderMajor ) &&\n             ( renderMinor == rhs.renderMinor );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDrmPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType        = StructureType::ePhysicalDeviceDrmPropertiesEXT;\n    void *                              pNext        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        hasPrimary   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        hasRender    = {};\n    int64_t                             primaryMajor = {};\n    int64_t                             primaryMinor = {};\n    int64_t                             renderMajor  = {};\n    int64_t                             renderMinor  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDrmPropertiesEXT>\n  {\n    using Type = PhysicalDeviceDrmPropertiesEXT;\n  };\n\n  struct PhysicalDeviceDynamicRenderingFeatures\n  {\n    using NativeType = VkPhysicalDeviceDynamicRenderingFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDynamicRenderingFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDynamicRenderingFeatures( VULKAN_HPP_NAMESPACE::Bool32 dynamicRendering_ = {},\n                                                                 void *                       pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , dynamicRendering{ dynamicRendering_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDynamicRenderingFeatures( PhysicalDeviceDynamicRenderingFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDynamicRenderingFeatures( VkPhysicalDeviceDynamicRenderingFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDynamicRenderingFeatures( *reinterpret_cast<PhysicalDeviceDynamicRenderingFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDynamicRenderingFeatures & operator=( PhysicalDeviceDynamicRenderingFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDynamicRenderingFeatures & operator=( VkPhysicalDeviceDynamicRenderingFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDynamicRenderingFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDynamicRenderingFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDynamicRenderingFeatures & setDynamicRendering( VULKAN_HPP_NAMESPACE::Bool32 dynamicRendering_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dynamicRendering = dynamicRendering_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceDynamicRenderingFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDynamicRenderingFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceDynamicRenderingFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDynamicRenderingFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, dynamicRendering );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDynamicRenderingFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDynamicRenderingFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( dynamicRendering == rhs.dynamicRendering );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDynamicRenderingFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType            = StructureType::ePhysicalDeviceDynamicRenderingFeatures;\n    void *                              pNext            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        dynamicRendering = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDynamicRenderingFeatures>\n  {\n    using Type = PhysicalDeviceDynamicRenderingFeatures;\n  };\n\n  using PhysicalDeviceDynamicRenderingFeaturesKHR = PhysicalDeviceDynamicRenderingFeatures;\n\n  struct PhysicalDeviceDynamicRenderingLocalReadFeatures\n  {\n    using NativeType = VkPhysicalDeviceDynamicRenderingLocalReadFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDynamicRenderingLocalReadFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDynamicRenderingLocalReadFeatures( VULKAN_HPP_NAMESPACE::Bool32 dynamicRenderingLocalRead_ = {},\n                                                                          void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , dynamicRenderingLocalRead{ dynamicRenderingLocalRead_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceDynamicRenderingLocalReadFeatures( PhysicalDeviceDynamicRenderingLocalReadFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDynamicRenderingLocalReadFeatures( VkPhysicalDeviceDynamicRenderingLocalReadFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDynamicRenderingLocalReadFeatures( *reinterpret_cast<PhysicalDeviceDynamicRenderingLocalReadFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDynamicRenderingLocalReadFeatures & operator=( PhysicalDeviceDynamicRenderingLocalReadFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDynamicRenderingLocalReadFeatures & operator=( VkPhysicalDeviceDynamicRenderingLocalReadFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDynamicRenderingLocalReadFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDynamicRenderingLocalReadFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDynamicRenderingLocalReadFeatures &\n      setDynamicRenderingLocalRead( VULKAN_HPP_NAMESPACE::Bool32 dynamicRenderingLocalRead_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dynamicRenderingLocalRead = dynamicRenderingLocalRead_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceDynamicRenderingLocalReadFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDynamicRenderingLocalReadFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceDynamicRenderingLocalReadFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDynamicRenderingLocalReadFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, dynamicRenderingLocalRead );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDynamicRenderingLocalReadFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDynamicRenderingLocalReadFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( dynamicRenderingLocalRead == rhs.dynamicRenderingLocalRead );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDynamicRenderingLocalReadFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                     = StructureType::ePhysicalDeviceDynamicRenderingLocalReadFeatures;\n    void *                              pNext                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        dynamicRenderingLocalRead = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDynamicRenderingLocalReadFeatures>\n  {\n    using Type = PhysicalDeviceDynamicRenderingLocalReadFeatures;\n  };\n\n  using PhysicalDeviceDynamicRenderingLocalReadFeaturesKHR = PhysicalDeviceDynamicRenderingLocalReadFeatures;\n\n  struct PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 dynamicRenderingUnusedAttachments_ = {},\n                                                                                     void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , dynamicRenderingUnusedAttachments{ dynamicRenderingUnusedAttachments_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT( PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT const & rhs )\n      VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT( VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT(\n          *reinterpret_cast<PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT &\n      operator=( PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT &\n      operator=( VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT &\n      setDynamicRenderingUnusedAttachments( VULKAN_HPP_NAMESPACE::Bool32 dynamicRenderingUnusedAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dynamicRenderingUnusedAttachments = dynamicRenderingUnusedAttachments_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, dynamicRenderingUnusedAttachments );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( dynamicRenderingUnusedAttachments == rhs.dynamicRenderingUnusedAttachments );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                             = StructureType::ePhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT;\n    void *                              pNext                             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        dynamicRenderingUnusedAttachments = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT>\n  {\n    using Type = PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT;\n  };\n\n  struct PhysicalDeviceExclusiveScissorFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceExclusiveScissorFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceExclusiveScissorFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceExclusiveScissorFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 exclusiveScissor_ = {},\n                                                                   void *                       pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , exclusiveScissor{ exclusiveScissor_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceExclusiveScissorFeaturesNV( PhysicalDeviceExclusiveScissorFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceExclusiveScissorFeaturesNV( VkPhysicalDeviceExclusiveScissorFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceExclusiveScissorFeaturesNV( *reinterpret_cast<PhysicalDeviceExclusiveScissorFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceExclusiveScissorFeaturesNV & operator=( PhysicalDeviceExclusiveScissorFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceExclusiveScissorFeaturesNV & operator=( VkPhysicalDeviceExclusiveScissorFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceExclusiveScissorFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExclusiveScissorFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExclusiveScissorFeaturesNV & setExclusiveScissor( VULKAN_HPP_NAMESPACE::Bool32 exclusiveScissor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      exclusiveScissor = exclusiveScissor_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceExclusiveScissorFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceExclusiveScissorFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceExclusiveScissorFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceExclusiveScissorFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, exclusiveScissor );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceExclusiveScissorFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceExclusiveScissorFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( exclusiveScissor == rhs.exclusiveScissor );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceExclusiveScissorFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType            = StructureType::ePhysicalDeviceExclusiveScissorFeaturesNV;\n    void *                              pNext            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        exclusiveScissor = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceExclusiveScissorFeaturesNV>\n  {\n    using Type = PhysicalDeviceExclusiveScissorFeaturesNV;\n  };\n\n  struct PhysicalDeviceExtendedDynamicState2FeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceExtendedDynamicState2FeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceExtendedDynamicState2FeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceExtendedDynamicState2FeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState2_                   = {},\n                                                                         VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState2LogicOp_            = {},\n                                                                         VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState2PatchControlPoints_ = {},\n                                                                         void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , extendedDynamicState2{ extendedDynamicState2_ }\n      , extendedDynamicState2LogicOp{ extendedDynamicState2LogicOp_ }\n      , extendedDynamicState2PatchControlPoints{ extendedDynamicState2PatchControlPoints_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceExtendedDynamicState2FeaturesEXT( PhysicalDeviceExtendedDynamicState2FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceExtendedDynamicState2FeaturesEXT( VkPhysicalDeviceExtendedDynamicState2FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceExtendedDynamicState2FeaturesEXT( *reinterpret_cast<PhysicalDeviceExtendedDynamicState2FeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceExtendedDynamicState2FeaturesEXT & operator=( PhysicalDeviceExtendedDynamicState2FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceExtendedDynamicState2FeaturesEXT & operator=( VkPhysicalDeviceExtendedDynamicState2FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicState2FeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState2FeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState2FeaturesEXT &\n      setExtendedDynamicState2( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState2_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState2 = extendedDynamicState2_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState2FeaturesEXT &\n      setExtendedDynamicState2LogicOp( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState2LogicOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState2LogicOp = extendedDynamicState2LogicOp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState2FeaturesEXT &\n      setExtendedDynamicState2PatchControlPoints( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState2PatchControlPoints_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState2PatchControlPoints = extendedDynamicState2PatchControlPoints_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceExtendedDynamicState2FeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceExtendedDynamicState2FeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, extendedDynamicState2, extendedDynamicState2LogicOp, extendedDynamicState2PatchControlPoints );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceExtendedDynamicState2FeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceExtendedDynamicState2FeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( extendedDynamicState2 == rhs.extendedDynamicState2 ) &&\n             ( extendedDynamicState2LogicOp == rhs.extendedDynamicState2LogicOp ) &&\n             ( extendedDynamicState2PatchControlPoints == rhs.extendedDynamicState2PatchControlPoints );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceExtendedDynamicState2FeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                   = StructureType::ePhysicalDeviceExtendedDynamicState2FeaturesEXT;\n    void *                              pNext                                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState2                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState2LogicOp            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState2PatchControlPoints = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceExtendedDynamicState2FeaturesEXT>\n  {\n    using Type = PhysicalDeviceExtendedDynamicState2FeaturesEXT;\n  };\n\n  struct PhysicalDeviceExtendedDynamicState3FeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceExtendedDynamicState3FeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceExtendedDynamicState3FeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceExtendedDynamicState3FeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3TessellationDomainOrigin_         = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3DepthClampEnable_                 = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3PolygonMode_                      = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3RasterizationSamples_             = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3SampleMask_                       = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3AlphaToCoverageEnable_            = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3AlphaToOneEnable_                 = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3LogicOpEnable_                    = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3ColorBlendEnable_                 = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3ColorBlendEquation_               = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3ColorWriteMask_                   = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3RasterizationStream_              = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3ConservativeRasterizationMode_    = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3ExtraPrimitiveOverestimationSize_ = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3DepthClipEnable_                  = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3SampleLocationsEnable_            = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3ColorBlendAdvanced_               = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3ProvokingVertexMode_              = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3LineRasterizationMode_            = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3LineStippleEnable_                = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3DepthClipNegativeOneToOne_        = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3ViewportWScalingEnable_           = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3ViewportSwizzle_                  = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3CoverageToColorEnable_            = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3CoverageToColorLocation_          = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3CoverageModulationMode_           = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3CoverageModulationTableEnable_    = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3CoverageModulationTable_          = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3CoverageReductionMode_            = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3RepresentativeFragmentTestEnable_ = {},\n                                                      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3ShadingRateImageEnable_           = {},\n                                                      void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , extendedDynamicState3TessellationDomainOrigin{ extendedDynamicState3TessellationDomainOrigin_ }\n      , extendedDynamicState3DepthClampEnable{ extendedDynamicState3DepthClampEnable_ }\n      , extendedDynamicState3PolygonMode{ extendedDynamicState3PolygonMode_ }\n      , extendedDynamicState3RasterizationSamples{ extendedDynamicState3RasterizationSamples_ }\n      , extendedDynamicState3SampleMask{ extendedDynamicState3SampleMask_ }\n      , extendedDynamicState3AlphaToCoverageEnable{ extendedDynamicState3AlphaToCoverageEnable_ }\n      , extendedDynamicState3AlphaToOneEnable{ extendedDynamicState3AlphaToOneEnable_ }\n      , extendedDynamicState3LogicOpEnable{ extendedDynamicState3LogicOpEnable_ }\n      , extendedDynamicState3ColorBlendEnable{ extendedDynamicState3ColorBlendEnable_ }\n      , extendedDynamicState3ColorBlendEquation{ extendedDynamicState3ColorBlendEquation_ }\n      , extendedDynamicState3ColorWriteMask{ extendedDynamicState3ColorWriteMask_ }\n      , extendedDynamicState3RasterizationStream{ extendedDynamicState3RasterizationStream_ }\n      , extendedDynamicState3ConservativeRasterizationMode{ extendedDynamicState3ConservativeRasterizationMode_ }\n      , extendedDynamicState3ExtraPrimitiveOverestimationSize{ extendedDynamicState3ExtraPrimitiveOverestimationSize_ }\n      , extendedDynamicState3DepthClipEnable{ extendedDynamicState3DepthClipEnable_ }\n      , extendedDynamicState3SampleLocationsEnable{ extendedDynamicState3SampleLocationsEnable_ }\n      , extendedDynamicState3ColorBlendAdvanced{ extendedDynamicState3ColorBlendAdvanced_ }\n      , extendedDynamicState3ProvokingVertexMode{ extendedDynamicState3ProvokingVertexMode_ }\n      , extendedDynamicState3LineRasterizationMode{ extendedDynamicState3LineRasterizationMode_ }\n      , extendedDynamicState3LineStippleEnable{ extendedDynamicState3LineStippleEnable_ }\n      , extendedDynamicState3DepthClipNegativeOneToOne{ extendedDynamicState3DepthClipNegativeOneToOne_ }\n      , extendedDynamicState3ViewportWScalingEnable{ extendedDynamicState3ViewportWScalingEnable_ }\n      , extendedDynamicState3ViewportSwizzle{ extendedDynamicState3ViewportSwizzle_ }\n      , extendedDynamicState3CoverageToColorEnable{ extendedDynamicState3CoverageToColorEnable_ }\n      , extendedDynamicState3CoverageToColorLocation{ extendedDynamicState3CoverageToColorLocation_ }\n      , extendedDynamicState3CoverageModulationMode{ extendedDynamicState3CoverageModulationMode_ }\n      , extendedDynamicState3CoverageModulationTableEnable{ extendedDynamicState3CoverageModulationTableEnable_ }\n      , extendedDynamicState3CoverageModulationTable{ extendedDynamicState3CoverageModulationTable_ }\n      , extendedDynamicState3CoverageReductionMode{ extendedDynamicState3CoverageReductionMode_ }\n      , extendedDynamicState3RepresentativeFragmentTestEnable{ extendedDynamicState3RepresentativeFragmentTestEnable_ }\n      , extendedDynamicState3ShadingRateImageEnable{ extendedDynamicState3ShadingRateImageEnable_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceExtendedDynamicState3FeaturesEXT( PhysicalDeviceExtendedDynamicState3FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceExtendedDynamicState3FeaturesEXT( VkPhysicalDeviceExtendedDynamicState3FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceExtendedDynamicState3FeaturesEXT( *reinterpret_cast<PhysicalDeviceExtendedDynamicState3FeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceExtendedDynamicState3FeaturesEXT & operator=( PhysicalDeviceExtendedDynamicState3FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceExtendedDynamicState3FeaturesEXT & operator=( VkPhysicalDeviceExtendedDynamicState3FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicState3FeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3TessellationDomainOrigin( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3TessellationDomainOrigin_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3TessellationDomainOrigin = extendedDynamicState3TessellationDomainOrigin_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3DepthClampEnable( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3DepthClampEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3DepthClampEnable = extendedDynamicState3DepthClampEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3PolygonMode( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3PolygonMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3PolygonMode = extendedDynamicState3PolygonMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3RasterizationSamples( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3RasterizationSamples_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3RasterizationSamples = extendedDynamicState3RasterizationSamples_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3SampleMask( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3SampleMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3SampleMask = extendedDynamicState3SampleMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3AlphaToCoverageEnable( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3AlphaToCoverageEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3AlphaToCoverageEnable = extendedDynamicState3AlphaToCoverageEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3AlphaToOneEnable( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3AlphaToOneEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3AlphaToOneEnable = extendedDynamicState3AlphaToOneEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3LogicOpEnable( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3LogicOpEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3LogicOpEnable = extendedDynamicState3LogicOpEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3ColorBlendEnable( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3ColorBlendEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3ColorBlendEnable = extendedDynamicState3ColorBlendEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3ColorBlendEquation( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3ColorBlendEquation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3ColorBlendEquation = extendedDynamicState3ColorBlendEquation_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3ColorWriteMask( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3ColorWriteMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3ColorWriteMask = extendedDynamicState3ColorWriteMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3RasterizationStream( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3RasterizationStream_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3RasterizationStream = extendedDynamicState3RasterizationStream_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT & setExtendedDynamicState3ConservativeRasterizationMode(\n      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3ConservativeRasterizationMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3ConservativeRasterizationMode = extendedDynamicState3ConservativeRasterizationMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT & setExtendedDynamicState3ExtraPrimitiveOverestimationSize(\n      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3ExtraPrimitiveOverestimationSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3ExtraPrimitiveOverestimationSize = extendedDynamicState3ExtraPrimitiveOverestimationSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3DepthClipEnable( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3DepthClipEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3DepthClipEnable = extendedDynamicState3DepthClipEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3SampleLocationsEnable( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3SampleLocationsEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3SampleLocationsEnable = extendedDynamicState3SampleLocationsEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3ColorBlendAdvanced( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3ColorBlendAdvanced_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3ColorBlendAdvanced = extendedDynamicState3ColorBlendAdvanced_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3ProvokingVertexMode( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3ProvokingVertexMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3ProvokingVertexMode = extendedDynamicState3ProvokingVertexMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3LineRasterizationMode( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3LineRasterizationMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3LineRasterizationMode = extendedDynamicState3LineRasterizationMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3LineStippleEnable( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3LineStippleEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3LineStippleEnable = extendedDynamicState3LineStippleEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3DepthClipNegativeOneToOne( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3DepthClipNegativeOneToOne_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3DepthClipNegativeOneToOne = extendedDynamicState3DepthClipNegativeOneToOne_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3ViewportWScalingEnable( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3ViewportWScalingEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3ViewportWScalingEnable = extendedDynamicState3ViewportWScalingEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3ViewportSwizzle( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3ViewportSwizzle_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3ViewportSwizzle = extendedDynamicState3ViewportSwizzle_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3CoverageToColorEnable( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3CoverageToColorEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3CoverageToColorEnable = extendedDynamicState3CoverageToColorEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3CoverageToColorLocation( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3CoverageToColorLocation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3CoverageToColorLocation = extendedDynamicState3CoverageToColorLocation_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3CoverageModulationMode( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3CoverageModulationMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3CoverageModulationMode = extendedDynamicState3CoverageModulationMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT & setExtendedDynamicState3CoverageModulationTableEnable(\n      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3CoverageModulationTableEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3CoverageModulationTableEnable = extendedDynamicState3CoverageModulationTableEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3CoverageModulationTable( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3CoverageModulationTable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3CoverageModulationTable = extendedDynamicState3CoverageModulationTable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3CoverageReductionMode( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3CoverageReductionMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3CoverageReductionMode = extendedDynamicState3CoverageReductionMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT & setExtendedDynamicState3RepresentativeFragmentTestEnable(\n      VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3RepresentativeFragmentTestEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3RepresentativeFragmentTestEnable = extendedDynamicState3RepresentativeFragmentTestEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3FeaturesEXT &\n      setExtendedDynamicState3ShadingRateImageEnable( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState3ShadingRateImageEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState3ShadingRateImageEnable = extendedDynamicState3ShadingRateImageEnable_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceExtendedDynamicState3FeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceExtendedDynamicState3FeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceExtendedDynamicState3FeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceExtendedDynamicState3FeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       extendedDynamicState3TessellationDomainOrigin,\n                       extendedDynamicState3DepthClampEnable,\n                       extendedDynamicState3PolygonMode,\n                       extendedDynamicState3RasterizationSamples,\n                       extendedDynamicState3SampleMask,\n                       extendedDynamicState3AlphaToCoverageEnable,\n                       extendedDynamicState3AlphaToOneEnable,\n                       extendedDynamicState3LogicOpEnable,\n                       extendedDynamicState3ColorBlendEnable,\n                       extendedDynamicState3ColorBlendEquation,\n                       extendedDynamicState3ColorWriteMask,\n                       extendedDynamicState3RasterizationStream,\n                       extendedDynamicState3ConservativeRasterizationMode,\n                       extendedDynamicState3ExtraPrimitiveOverestimationSize,\n                       extendedDynamicState3DepthClipEnable,\n                       extendedDynamicState3SampleLocationsEnable,\n                       extendedDynamicState3ColorBlendAdvanced,\n                       extendedDynamicState3ProvokingVertexMode,\n                       extendedDynamicState3LineRasterizationMode,\n                       extendedDynamicState3LineStippleEnable,\n                       extendedDynamicState3DepthClipNegativeOneToOne,\n                       extendedDynamicState3ViewportWScalingEnable,\n                       extendedDynamicState3ViewportSwizzle,\n                       extendedDynamicState3CoverageToColorEnable,\n                       extendedDynamicState3CoverageToColorLocation,\n                       extendedDynamicState3CoverageModulationMode,\n                       extendedDynamicState3CoverageModulationTableEnable,\n                       extendedDynamicState3CoverageModulationTable,\n                       extendedDynamicState3CoverageReductionMode,\n                       extendedDynamicState3RepresentativeFragmentTestEnable,\n                       extendedDynamicState3ShadingRateImageEnable );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceExtendedDynamicState3FeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceExtendedDynamicState3FeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) &&\n             ( extendedDynamicState3TessellationDomainOrigin == rhs.extendedDynamicState3TessellationDomainOrigin ) &&\n             ( extendedDynamicState3DepthClampEnable == rhs.extendedDynamicState3DepthClampEnable ) &&\n             ( extendedDynamicState3PolygonMode == rhs.extendedDynamicState3PolygonMode ) &&\n             ( extendedDynamicState3RasterizationSamples == rhs.extendedDynamicState3RasterizationSamples ) &&\n             ( extendedDynamicState3SampleMask == rhs.extendedDynamicState3SampleMask ) &&\n             ( extendedDynamicState3AlphaToCoverageEnable == rhs.extendedDynamicState3AlphaToCoverageEnable ) &&\n             ( extendedDynamicState3AlphaToOneEnable == rhs.extendedDynamicState3AlphaToOneEnable ) &&\n             ( extendedDynamicState3LogicOpEnable == rhs.extendedDynamicState3LogicOpEnable ) &&\n             ( extendedDynamicState3ColorBlendEnable == rhs.extendedDynamicState3ColorBlendEnable ) &&\n             ( extendedDynamicState3ColorBlendEquation == rhs.extendedDynamicState3ColorBlendEquation ) &&\n             ( extendedDynamicState3ColorWriteMask == rhs.extendedDynamicState3ColorWriteMask ) &&\n             ( extendedDynamicState3RasterizationStream == rhs.extendedDynamicState3RasterizationStream ) &&\n             ( extendedDynamicState3ConservativeRasterizationMode == rhs.extendedDynamicState3ConservativeRasterizationMode ) &&\n             ( extendedDynamicState3ExtraPrimitiveOverestimationSize == rhs.extendedDynamicState3ExtraPrimitiveOverestimationSize ) &&\n             ( extendedDynamicState3DepthClipEnable == rhs.extendedDynamicState3DepthClipEnable ) &&\n             ( extendedDynamicState3SampleLocationsEnable == rhs.extendedDynamicState3SampleLocationsEnable ) &&\n             ( extendedDynamicState3ColorBlendAdvanced == rhs.extendedDynamicState3ColorBlendAdvanced ) &&\n             ( extendedDynamicState3ProvokingVertexMode == rhs.extendedDynamicState3ProvokingVertexMode ) &&\n             ( extendedDynamicState3LineRasterizationMode == rhs.extendedDynamicState3LineRasterizationMode ) &&\n             ( extendedDynamicState3LineStippleEnable == rhs.extendedDynamicState3LineStippleEnable ) &&\n             ( extendedDynamicState3DepthClipNegativeOneToOne == rhs.extendedDynamicState3DepthClipNegativeOneToOne ) &&\n             ( extendedDynamicState3ViewportWScalingEnable == rhs.extendedDynamicState3ViewportWScalingEnable ) &&\n             ( extendedDynamicState3ViewportSwizzle == rhs.extendedDynamicState3ViewportSwizzle ) &&\n             ( extendedDynamicState3CoverageToColorEnable == rhs.extendedDynamicState3CoverageToColorEnable ) &&\n             ( extendedDynamicState3CoverageToColorLocation == rhs.extendedDynamicState3CoverageToColorLocation ) &&\n             ( extendedDynamicState3CoverageModulationMode == rhs.extendedDynamicState3CoverageModulationMode ) &&\n             ( extendedDynamicState3CoverageModulationTableEnable == rhs.extendedDynamicState3CoverageModulationTableEnable ) &&\n             ( extendedDynamicState3CoverageModulationTable == rhs.extendedDynamicState3CoverageModulationTable ) &&\n             ( extendedDynamicState3CoverageReductionMode == rhs.extendedDynamicState3CoverageReductionMode ) &&\n             ( extendedDynamicState3RepresentativeFragmentTestEnable == rhs.extendedDynamicState3RepresentativeFragmentTestEnable ) &&\n             ( extendedDynamicState3ShadingRateImageEnable == rhs.extendedDynamicState3ShadingRateImageEnable );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceExtendedDynamicState3FeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                                 = StructureType::ePhysicalDeviceExtendedDynamicState3FeaturesEXT;\n    void *                              pNext                                                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3TessellationDomainOrigin         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3DepthClampEnable                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3PolygonMode                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3RasterizationSamples             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3SampleMask                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3AlphaToCoverageEnable            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3AlphaToOneEnable                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3LogicOpEnable                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3ColorBlendEnable                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3ColorBlendEquation               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3ColorWriteMask                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3RasterizationStream              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3ConservativeRasterizationMode    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3ExtraPrimitiveOverestimationSize = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3DepthClipEnable                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3SampleLocationsEnable            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3ColorBlendAdvanced               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3ProvokingVertexMode              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3LineRasterizationMode            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3LineStippleEnable                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3DepthClipNegativeOneToOne        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3ViewportWScalingEnable           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3ViewportSwizzle                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3CoverageToColorEnable            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3CoverageToColorLocation          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3CoverageModulationMode           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3CoverageModulationTableEnable    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3CoverageModulationTable          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3CoverageReductionMode            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3RepresentativeFragmentTestEnable = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState3ShadingRateImageEnable           = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceExtendedDynamicState3FeaturesEXT>\n  {\n    using Type = PhysicalDeviceExtendedDynamicState3FeaturesEXT;\n  };\n\n  struct PhysicalDeviceExtendedDynamicState3PropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceExtendedDynamicState3PropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceExtendedDynamicState3PropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceExtendedDynamicState3PropertiesEXT( VULKAN_HPP_NAMESPACE::Bool32 dynamicPrimitiveTopologyUnrestricted_ = {},\n                                                                           void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , dynamicPrimitiveTopologyUnrestricted{ dynamicPrimitiveTopologyUnrestricted_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceExtendedDynamicState3PropertiesEXT( PhysicalDeviceExtendedDynamicState3PropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceExtendedDynamicState3PropertiesEXT( VkPhysicalDeviceExtendedDynamicState3PropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceExtendedDynamicState3PropertiesEXT( *reinterpret_cast<PhysicalDeviceExtendedDynamicState3PropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceExtendedDynamicState3PropertiesEXT & operator=( PhysicalDeviceExtendedDynamicState3PropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceExtendedDynamicState3PropertiesEXT & operator=( VkPhysicalDeviceExtendedDynamicState3PropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicState3PropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3PropertiesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicState3PropertiesEXT &\n      setDynamicPrimitiveTopologyUnrestricted( VULKAN_HPP_NAMESPACE::Bool32 dynamicPrimitiveTopologyUnrestricted_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dynamicPrimitiveTopologyUnrestricted = dynamicPrimitiveTopologyUnrestricted_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceExtendedDynamicState3PropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceExtendedDynamicState3PropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceExtendedDynamicState3PropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceExtendedDynamicState3PropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, dynamicPrimitiveTopologyUnrestricted );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceExtendedDynamicState3PropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceExtendedDynamicState3PropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( dynamicPrimitiveTopologyUnrestricted == rhs.dynamicPrimitiveTopologyUnrestricted );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceExtendedDynamicState3PropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                = StructureType::ePhysicalDeviceExtendedDynamicState3PropertiesEXT;\n    void *                              pNext                                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        dynamicPrimitiveTopologyUnrestricted = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceExtendedDynamicState3PropertiesEXT>\n  {\n    using Type = PhysicalDeviceExtendedDynamicState3PropertiesEXT;\n  };\n\n  struct PhysicalDeviceExtendedDynamicStateFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceExtendedDynamicStateFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceExtendedDynamicStateFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceExtendedDynamicStateFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState_ = {},\n                                                                        void *                       pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , extendedDynamicState{ extendedDynamicState_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceExtendedDynamicStateFeaturesEXT( PhysicalDeviceExtendedDynamicStateFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceExtendedDynamicStateFeaturesEXT( VkPhysicalDeviceExtendedDynamicStateFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceExtendedDynamicStateFeaturesEXT( *reinterpret_cast<PhysicalDeviceExtendedDynamicStateFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceExtendedDynamicStateFeaturesEXT & operator=( PhysicalDeviceExtendedDynamicStateFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceExtendedDynamicStateFeaturesEXT & operator=( VkPhysicalDeviceExtendedDynamicStateFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicStateFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicStateFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedDynamicStateFeaturesEXT &\n      setExtendedDynamicState( VULKAN_HPP_NAMESPACE::Bool32 extendedDynamicState_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedDynamicState = extendedDynamicState_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceExtendedDynamicStateFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceExtendedDynamicStateFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, extendedDynamicState );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceExtendedDynamicStateFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceExtendedDynamicStateFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( extendedDynamicState == rhs.extendedDynamicState );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceExtendedDynamicStateFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                = StructureType::ePhysicalDeviceExtendedDynamicStateFeaturesEXT;\n    void *                              pNext                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedDynamicState = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceExtendedDynamicStateFeaturesEXT>\n  {\n    using Type = PhysicalDeviceExtendedDynamicStateFeaturesEXT;\n  };\n\n  struct PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceExtendedSparseAddressSpaceFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 extendedSparseAddressSpace_ = {},\n                                                                             void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , extendedSparseAddressSpace{ extendedSparseAddressSpace_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV( PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV( VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV( *reinterpret_cast<PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV &\n      operator=( PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV & operator=( VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV &\n      setExtendedSparseAddressSpace( VULKAN_HPP_NAMESPACE::Bool32 extendedSparseAddressSpace_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extendedSparseAddressSpace = extendedSparseAddressSpace_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceExtendedSparseAddressSpaceFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, extendedSparseAddressSpace );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( extendedSparseAddressSpace == rhs.extendedSparseAddressSpace );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                      = StructureType::ePhysicalDeviceExtendedSparseAddressSpaceFeaturesNV;\n    void *                              pNext                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        extendedSparseAddressSpace = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceExtendedSparseAddressSpaceFeaturesNV>\n  {\n    using Type = PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV;\n  };\n\n  struct PhysicalDeviceExtendedSparseAddressSpacePropertiesNV\n  {\n    using NativeType = VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceExtendedSparseAddressSpacePropertiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceExtendedSparseAddressSpacePropertiesNV( VULKAN_HPP_NAMESPACE::DeviceSize       extendedSparseAddressSpaceSize_ = {},\n                                                                               VULKAN_HPP_NAMESPACE::ImageUsageFlags  extendedSparseImageUsageFlags_  = {},\n                                                                               VULKAN_HPP_NAMESPACE::BufferUsageFlags extendedSparseBufferUsageFlags_ = {},\n                                                                               void *                                 pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , extendedSparseAddressSpaceSize{ extendedSparseAddressSpaceSize_ }\n      , extendedSparseImageUsageFlags{ extendedSparseImageUsageFlags_ }\n      , extendedSparseBufferUsageFlags{ extendedSparseBufferUsageFlags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceExtendedSparseAddressSpacePropertiesNV( PhysicalDeviceExtendedSparseAddressSpacePropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceExtendedSparseAddressSpacePropertiesNV( VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceExtendedSparseAddressSpacePropertiesNV( *reinterpret_cast<PhysicalDeviceExtendedSparseAddressSpacePropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceExtendedSparseAddressSpacePropertiesNV &\n      operator=( PhysicalDeviceExtendedSparseAddressSpacePropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceExtendedSparseAddressSpacePropertiesNV & operator=( VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedSparseAddressSpacePropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceExtendedSparseAddressSpacePropertiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::ImageUsageFlags const &,\n               VULKAN_HPP_NAMESPACE::BufferUsageFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, extendedSparseAddressSpaceSize, extendedSparseImageUsageFlags, extendedSparseBufferUsageFlags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceExtendedSparseAddressSpacePropertiesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceExtendedSparseAddressSpacePropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( extendedSparseAddressSpaceSize == rhs.extendedSparseAddressSpaceSize ) &&\n             ( extendedSparseImageUsageFlags == rhs.extendedSparseImageUsageFlags ) && ( extendedSparseBufferUsageFlags == rhs.extendedSparseBufferUsageFlags );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceExtendedSparseAddressSpacePropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType                          = StructureType::ePhysicalDeviceExtendedSparseAddressSpacePropertiesNV;\n    void *                                 pNext                          = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize       extendedSparseAddressSpaceSize = {};\n    VULKAN_HPP_NAMESPACE::ImageUsageFlags  extendedSparseImageUsageFlags  = {};\n    VULKAN_HPP_NAMESPACE::BufferUsageFlags extendedSparseBufferUsageFlags = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceExtendedSparseAddressSpacePropertiesNV>\n  {\n    using Type = PhysicalDeviceExtendedSparseAddressSpacePropertiesNV;\n  };\n\n  struct PhysicalDeviceExternalBufferInfo\n  {\n    using NativeType = VkPhysicalDeviceExternalBufferInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceExternalBufferInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceExternalBufferInfo(\n      VULKAN_HPP_NAMESPACE::BufferCreateFlags                flags_      = {},\n      VULKAN_HPP_NAMESPACE::BufferUsageFlags                 usage_      = {},\n      VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_ = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd,\n      const void *                                           pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , usage{ usage_ }\n      , handleType{ handleType_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceExternalBufferInfo( PhysicalDeviceExternalBufferInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceExternalBufferInfo( VkPhysicalDeviceExternalBufferInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceExternalBufferInfo( *reinterpret_cast<PhysicalDeviceExternalBufferInfo const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceExternalBufferInfo & operator=( PhysicalDeviceExternalBufferInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceExternalBufferInfo & operator=( VkPhysicalDeviceExternalBufferInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExternalBufferInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExternalBufferInfo & setFlags( VULKAN_HPP_NAMESPACE::BufferCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExternalBufferInfo & setUsage( VULKAN_HPP_NAMESPACE::BufferUsageFlags usage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      usage = usage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExternalBufferInfo &\n      setHandleType( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceExternalBufferInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceExternalBufferInfo *>( this );\n    }\n\n    operator VkPhysicalDeviceExternalBufferInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceExternalBufferInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::BufferCreateFlags const &,\n               VULKAN_HPP_NAMESPACE::BufferUsageFlags const &,\n               VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, usage, handleType );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceExternalBufferInfo const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceExternalBufferInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( usage == rhs.usage ) && ( handleType == rhs.handleType );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceExternalBufferInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType      = StructureType::ePhysicalDeviceExternalBufferInfo;\n    const void *                                           pNext      = {};\n    VULKAN_HPP_NAMESPACE::BufferCreateFlags                flags      = {};\n    VULKAN_HPP_NAMESPACE::BufferUsageFlags                 usage      = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceExternalBufferInfo>\n  {\n    using Type = PhysicalDeviceExternalBufferInfo;\n  };\n\n  using PhysicalDeviceExternalBufferInfoKHR = PhysicalDeviceExternalBufferInfo;\n\n  struct PhysicalDeviceExternalFenceInfo\n  {\n    using NativeType = VkPhysicalDeviceExternalFenceInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceExternalFenceInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceExternalFenceInfo(\n      VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits handleType_ = VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits::eOpaqueFd,\n      const void *                                          pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , handleType{ handleType_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceExternalFenceInfo( PhysicalDeviceExternalFenceInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceExternalFenceInfo( VkPhysicalDeviceExternalFenceInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceExternalFenceInfo( *reinterpret_cast<PhysicalDeviceExternalFenceInfo const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceExternalFenceInfo & operator=( PhysicalDeviceExternalFenceInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceExternalFenceInfo & operator=( VkPhysicalDeviceExternalFenceInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExternalFenceInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExternalFenceInfo &\n      setHandleType( VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceExternalFenceInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceExternalFenceInfo *>( this );\n    }\n\n    operator VkPhysicalDeviceExternalFenceInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceExternalFenceInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, handleType );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceExternalFenceInfo const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceExternalFenceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( handleType == rhs.handleType );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceExternalFenceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                   sType      = StructureType::ePhysicalDeviceExternalFenceInfo;\n    const void *                                          pNext      = {};\n    VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits handleType = VULKAN_HPP_NAMESPACE::ExternalFenceHandleTypeFlagBits::eOpaqueFd;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceExternalFenceInfo>\n  {\n    using Type = PhysicalDeviceExternalFenceInfo;\n  };\n\n  using PhysicalDeviceExternalFenceInfoKHR = PhysicalDeviceExternalFenceInfo;\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  struct PhysicalDeviceExternalFormatResolveFeaturesANDROID\n  {\n    using NativeType = VkPhysicalDeviceExternalFormatResolveFeaturesANDROID;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceExternalFormatResolveFeaturesANDROID;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceExternalFormatResolveFeaturesANDROID( VULKAN_HPP_NAMESPACE::Bool32 externalFormatResolve_ = {},\n                                                                             void *                       pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , externalFormatResolve{ externalFormatResolve_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceExternalFormatResolveFeaturesANDROID( PhysicalDeviceExternalFormatResolveFeaturesANDROID const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceExternalFormatResolveFeaturesANDROID( VkPhysicalDeviceExternalFormatResolveFeaturesANDROID const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceExternalFormatResolveFeaturesANDROID( *reinterpret_cast<PhysicalDeviceExternalFormatResolveFeaturesANDROID const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceExternalFormatResolveFeaturesANDROID &\n      operator=( PhysicalDeviceExternalFormatResolveFeaturesANDROID const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceExternalFormatResolveFeaturesANDROID & operator=( VkPhysicalDeviceExternalFormatResolveFeaturesANDROID const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFormatResolveFeaturesANDROID const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExternalFormatResolveFeaturesANDROID & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExternalFormatResolveFeaturesANDROID &\n      setExternalFormatResolve( VULKAN_HPP_NAMESPACE::Bool32 externalFormatResolve_ ) VULKAN_HPP_NOEXCEPT\n    {\n      externalFormatResolve = externalFormatResolve_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceExternalFormatResolveFeaturesANDROID const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceExternalFormatResolveFeaturesANDROID *>( this );\n    }\n\n    operator VkPhysicalDeviceExternalFormatResolveFeaturesANDROID &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceExternalFormatResolveFeaturesANDROID *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, externalFormatResolve );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceExternalFormatResolveFeaturesANDROID const & ) const = default;\n#  else\n    bool operator==( PhysicalDeviceExternalFormatResolveFeaturesANDROID const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( externalFormatResolve == rhs.externalFormatResolve );\n#    endif\n    }\n\n    bool operator!=( PhysicalDeviceExternalFormatResolveFeaturesANDROID const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                 = StructureType::ePhysicalDeviceExternalFormatResolveFeaturesANDROID;\n    void *                              pNext                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        externalFormatResolve = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceExternalFormatResolveFeaturesANDROID>\n  {\n    using Type = PhysicalDeviceExternalFormatResolveFeaturesANDROID;\n  };\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  struct PhysicalDeviceExternalFormatResolvePropertiesANDROID\n  {\n    using NativeType = VkPhysicalDeviceExternalFormatResolvePropertiesANDROID;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceExternalFormatResolvePropertiesANDROID;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceExternalFormatResolvePropertiesANDROID(\n      VULKAN_HPP_NAMESPACE::Bool32         nullColorAttachmentWithExternalFormatResolve_ = {},\n      VULKAN_HPP_NAMESPACE::ChromaLocation externalFormatResolveChromaOffsetX_           = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven,\n      VULKAN_HPP_NAMESPACE::ChromaLocation externalFormatResolveChromaOffsetY_           = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven,\n      void *                               pNext_                                        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , nullColorAttachmentWithExternalFormatResolve{ nullColorAttachmentWithExternalFormatResolve_ }\n      , externalFormatResolveChromaOffsetX{ externalFormatResolveChromaOffsetX_ }\n      , externalFormatResolveChromaOffsetY{ externalFormatResolveChromaOffsetY_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceExternalFormatResolvePropertiesANDROID( PhysicalDeviceExternalFormatResolvePropertiesANDROID const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceExternalFormatResolvePropertiesANDROID( VkPhysicalDeviceExternalFormatResolvePropertiesANDROID const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceExternalFormatResolvePropertiesANDROID( *reinterpret_cast<PhysicalDeviceExternalFormatResolvePropertiesANDROID const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceExternalFormatResolvePropertiesANDROID &\n      operator=( PhysicalDeviceExternalFormatResolvePropertiesANDROID const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceExternalFormatResolvePropertiesANDROID & operator=( VkPhysicalDeviceExternalFormatResolvePropertiesANDROID const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFormatResolvePropertiesANDROID const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceExternalFormatResolvePropertiesANDROID const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceExternalFormatResolvePropertiesANDROID *>( this );\n    }\n\n    operator VkPhysicalDeviceExternalFormatResolvePropertiesANDROID &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceExternalFormatResolvePropertiesANDROID *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::ChromaLocation const &,\n               VULKAN_HPP_NAMESPACE::ChromaLocation const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, nullColorAttachmentWithExternalFormatResolve, externalFormatResolveChromaOffsetX, externalFormatResolveChromaOffsetY );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceExternalFormatResolvePropertiesANDROID const & ) const = default;\n#  else\n    bool operator==( PhysicalDeviceExternalFormatResolvePropertiesANDROID const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) &&\n             ( nullColorAttachmentWithExternalFormatResolve == rhs.nullColorAttachmentWithExternalFormatResolve ) &&\n             ( externalFormatResolveChromaOffsetX == rhs.externalFormatResolveChromaOffsetX ) &&\n             ( externalFormatResolveChromaOffsetY == rhs.externalFormatResolveChromaOffsetY );\n#    endif\n    }\n\n    bool operator!=( PhysicalDeviceExternalFormatResolvePropertiesANDROID const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType  sType                                        = StructureType::ePhysicalDeviceExternalFormatResolvePropertiesANDROID;\n    void *                               pNext                                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32         nullColorAttachmentWithExternalFormatResolve = {};\n    VULKAN_HPP_NAMESPACE::ChromaLocation externalFormatResolveChromaOffsetX           = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven;\n    VULKAN_HPP_NAMESPACE::ChromaLocation externalFormatResolveChromaOffsetY           = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceExternalFormatResolvePropertiesANDROID>\n  {\n    using Type = PhysicalDeviceExternalFormatResolvePropertiesANDROID;\n  };\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n  struct PhysicalDeviceExternalImageFormatInfo\n  {\n    using NativeType = VkPhysicalDeviceExternalImageFormatInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceExternalImageFormatInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceExternalImageFormatInfo(\n      VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_ = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd,\n      const void *                                           pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , handleType{ handleType_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceExternalImageFormatInfo( PhysicalDeviceExternalImageFormatInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceExternalImageFormatInfo( VkPhysicalDeviceExternalImageFormatInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceExternalImageFormatInfo( *reinterpret_cast<PhysicalDeviceExternalImageFormatInfo const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceExternalImageFormatInfo & operator=( PhysicalDeviceExternalImageFormatInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceExternalImageFormatInfo & operator=( VkPhysicalDeviceExternalImageFormatInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalImageFormatInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExternalImageFormatInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExternalImageFormatInfo &\n      setHandleType( VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceExternalImageFormatInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceExternalImageFormatInfo *>( this );\n    }\n\n    operator VkPhysicalDeviceExternalImageFormatInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, handleType );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceExternalImageFormatInfo const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceExternalImageFormatInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( handleType == rhs.handleType );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceExternalImageFormatInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType      = StructureType::ePhysicalDeviceExternalImageFormatInfo;\n    const void *                                           pNext      = {};\n    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType = VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits::eOpaqueFd;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceExternalImageFormatInfo>\n  {\n    using Type = PhysicalDeviceExternalImageFormatInfo;\n  };\n\n  using PhysicalDeviceExternalImageFormatInfoKHR = PhysicalDeviceExternalImageFormatInfo;\n\n  struct PhysicalDeviceExternalMemoryHostPropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceExternalMemoryHostPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceExternalMemoryHostPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceExternalMemoryHostPropertiesEXT( VULKAN_HPP_NAMESPACE::DeviceSize minImportedHostPointerAlignment_ = {},\n                                                                        void *                           pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , minImportedHostPointerAlignment{ minImportedHostPointerAlignment_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceExternalMemoryHostPropertiesEXT( PhysicalDeviceExternalMemoryHostPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceExternalMemoryHostPropertiesEXT( VkPhysicalDeviceExternalMemoryHostPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceExternalMemoryHostPropertiesEXT( *reinterpret_cast<PhysicalDeviceExternalMemoryHostPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceExternalMemoryHostPropertiesEXT & operator=( PhysicalDeviceExternalMemoryHostPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceExternalMemoryHostPropertiesEXT & operator=( VkPhysicalDeviceExternalMemoryHostPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalMemoryHostPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceExternalMemoryHostPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceExternalMemoryHostPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceExternalMemoryHostPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceExternalMemoryHostPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, minImportedHostPointerAlignment );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceExternalMemoryHostPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceExternalMemoryHostPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( minImportedHostPointerAlignment == rhs.minImportedHostPointerAlignment );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceExternalMemoryHostPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                           = StructureType::ePhysicalDeviceExternalMemoryHostPropertiesEXT;\n    void *                              pNext                           = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    minImportedHostPointerAlignment = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceExternalMemoryHostPropertiesEXT>\n  {\n    using Type = PhysicalDeviceExternalMemoryHostPropertiesEXT;\n  };\n\n  struct PhysicalDeviceExternalMemoryRDMAFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceExternalMemoryRDMAFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceExternalMemoryRdmaFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceExternalMemoryRDMAFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 externalMemoryRDMA_ = {},\n                                                                     void *                       pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , externalMemoryRDMA{ externalMemoryRDMA_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceExternalMemoryRDMAFeaturesNV( PhysicalDeviceExternalMemoryRDMAFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceExternalMemoryRDMAFeaturesNV( VkPhysicalDeviceExternalMemoryRDMAFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceExternalMemoryRDMAFeaturesNV( *reinterpret_cast<PhysicalDeviceExternalMemoryRDMAFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceExternalMemoryRDMAFeaturesNV & operator=( PhysicalDeviceExternalMemoryRDMAFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceExternalMemoryRDMAFeaturesNV & operator=( VkPhysicalDeviceExternalMemoryRDMAFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalMemoryRDMAFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExternalMemoryRDMAFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExternalMemoryRDMAFeaturesNV &\n      setExternalMemoryRDMA( VULKAN_HPP_NAMESPACE::Bool32 externalMemoryRDMA_ ) VULKAN_HPP_NOEXCEPT\n    {\n      externalMemoryRDMA = externalMemoryRDMA_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceExternalMemoryRDMAFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceExternalMemoryRDMAFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceExternalMemoryRDMAFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceExternalMemoryRDMAFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, externalMemoryRDMA );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceExternalMemoryRDMAFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceExternalMemoryRDMAFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( externalMemoryRDMA == rhs.externalMemoryRDMA );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceExternalMemoryRDMAFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType              = StructureType::ePhysicalDeviceExternalMemoryRdmaFeaturesNV;\n    void *                              pNext              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        externalMemoryRDMA = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceExternalMemoryRdmaFeaturesNV>\n  {\n    using Type = PhysicalDeviceExternalMemoryRDMAFeaturesNV;\n  };\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n  struct PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX\n  {\n    using NativeType = VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceExternalMemoryScreenBufferFeaturesQNX;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX( VULKAN_HPP_NAMESPACE::Bool32 screenBufferImport_ = {},\n                                                                              void *                       pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , screenBufferImport{ screenBufferImport_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX( PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX( VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX( *reinterpret_cast<PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX &\n      operator=( PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX & operator=( VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX &\n      setScreenBufferImport( VULKAN_HPP_NAMESPACE::Bool32 screenBufferImport_ ) VULKAN_HPP_NOEXCEPT\n    {\n      screenBufferImport = screenBufferImport_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX *>( this );\n    }\n\n    operator VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, screenBufferImport );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX const & ) const = default;\n#  else\n    bool operator==( PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( screenBufferImport == rhs.screenBufferImport );\n#    endif\n    }\n\n    bool operator!=( PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType              = StructureType::ePhysicalDeviceExternalMemoryScreenBufferFeaturesQNX;\n    void *                              pNext              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        screenBufferImport = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceExternalMemoryScreenBufferFeaturesQNX>\n  {\n    using Type = PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX;\n  };\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n  struct PhysicalDeviceExternalSemaphoreInfo\n  {\n    using NativeType = VkPhysicalDeviceExternalSemaphoreInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceExternalSemaphoreInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceExternalSemaphoreInfo(\n      VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits handleType_ = VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits::eOpaqueFd,\n      const void *                                              pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , handleType{ handleType_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceExternalSemaphoreInfo( PhysicalDeviceExternalSemaphoreInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceExternalSemaphoreInfo( VkPhysicalDeviceExternalSemaphoreInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceExternalSemaphoreInfo( *reinterpret_cast<PhysicalDeviceExternalSemaphoreInfo const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceExternalSemaphoreInfo & operator=( PhysicalDeviceExternalSemaphoreInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceExternalSemaphoreInfo & operator=( VkPhysicalDeviceExternalSemaphoreInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExternalSemaphoreInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceExternalSemaphoreInfo &\n      setHandleType( VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceExternalSemaphoreInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceExternalSemaphoreInfo *>( this );\n    }\n\n    operator VkPhysicalDeviceExternalSemaphoreInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceExternalSemaphoreInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, handleType );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceExternalSemaphoreInfo const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceExternalSemaphoreInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( handleType == rhs.handleType );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceExternalSemaphoreInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                       sType      = StructureType::ePhysicalDeviceExternalSemaphoreInfo;\n    const void *                                              pNext      = {};\n    VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits handleType = VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits::eOpaqueFd;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceExternalSemaphoreInfo>\n  {\n    using Type = PhysicalDeviceExternalSemaphoreInfo;\n  };\n\n  using PhysicalDeviceExternalSemaphoreInfoKHR = PhysicalDeviceExternalSemaphoreInfo;\n\n  struct PhysicalDeviceFaultFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceFaultFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceFaultFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFaultFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 deviceFault_             = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 deviceFaultVendorBinary_ = {},\n                                                         void *                       pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , deviceFault{ deviceFault_ }\n      , deviceFaultVendorBinary{ deviceFaultVendorBinary_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFaultFeaturesEXT( PhysicalDeviceFaultFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceFaultFeaturesEXT( VkPhysicalDeviceFaultFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceFaultFeaturesEXT( *reinterpret_cast<PhysicalDeviceFaultFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceFaultFeaturesEXT & operator=( PhysicalDeviceFaultFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceFaultFeaturesEXT & operator=( VkPhysicalDeviceFaultFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceFaultFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFaultFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFaultFeaturesEXT & setDeviceFault( VULKAN_HPP_NAMESPACE::Bool32 deviceFault_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceFault = deviceFault_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFaultFeaturesEXT &\n      setDeviceFaultVendorBinary( VULKAN_HPP_NAMESPACE::Bool32 deviceFaultVendorBinary_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceFaultVendorBinary = deviceFaultVendorBinary_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceFaultFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceFaultFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceFaultFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceFaultFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, deviceFault, deviceFaultVendorBinary );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceFaultFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceFaultFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( deviceFault == rhs.deviceFault ) &&\n             ( deviceFaultVendorBinary == rhs.deviceFaultVendorBinary );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceFaultFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                   = StructureType::ePhysicalDeviceFaultFeaturesEXT;\n    void *                              pNext                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        deviceFault             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        deviceFaultVendorBinary = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceFaultFeaturesEXT>\n  {\n    using Type = PhysicalDeviceFaultFeaturesEXT;\n  };\n\n  struct PhysicalDeviceFeatures2\n  {\n    using NativeType = VkPhysicalDeviceFeatures2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceFeatures2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFeatures2( VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures features_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , features{ features_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFeatures2( PhysicalDeviceFeatures2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceFeatures2( VkPhysicalDeviceFeatures2 const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceFeatures2( *reinterpret_cast<PhysicalDeviceFeatures2 const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceFeatures2 & operator=( PhysicalDeviceFeatures2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceFeatures2 & operator=( VkPhysicalDeviceFeatures2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures2 & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFeatures2 & setFeatures( VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures const & features_ ) VULKAN_HPP_NOEXCEPT\n    {\n      features = features_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceFeatures2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceFeatures2 *>( this );\n    }\n\n    operator VkPhysicalDeviceFeatures2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceFeatures2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, features );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceFeatures2 const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceFeatures2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( features == rhs.features );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceFeatures2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType    = StructureType::ePhysicalDeviceFeatures2;\n    void *                                       pNext    = {};\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures features = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceFeatures2>\n  {\n    using Type = PhysicalDeviceFeatures2;\n  };\n\n  using PhysicalDeviceFeatures2KHR = PhysicalDeviceFeatures2;\n\n  struct PhysicalDeviceFloatControlsProperties\n  {\n    using NativeType = VkPhysicalDeviceFloatControlsProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceFloatControlsProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFloatControlsProperties(\n      VULKAN_HPP_NAMESPACE::ShaderFloatControlsIndependence denormBehaviorIndependence_ = VULKAN_HPP_NAMESPACE::ShaderFloatControlsIndependence::e32BitOnly,\n      VULKAN_HPP_NAMESPACE::ShaderFloatControlsIndependence roundingModeIndependence_   = VULKAN_HPP_NAMESPACE::ShaderFloatControlsIndependence::e32BitOnly,\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderSignedZeroInfNanPreserveFloat16_ = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderSignedZeroInfNanPreserveFloat32_ = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderSignedZeroInfNanPreserveFloat64_ = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormPreserveFloat16_           = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormPreserveFloat32_           = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormPreserveFloat64_           = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormFlushToZeroFloat16_        = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormFlushToZeroFloat32_        = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormFlushToZeroFloat64_        = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTEFloat16_          = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTEFloat32_          = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTEFloat64_          = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTZFloat16_          = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTZFloat32_          = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTZFloat64_          = {},\n      void *                                                pNext_                                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , denormBehaviorIndependence{ denormBehaviorIndependence_ }\n      , roundingModeIndependence{ roundingModeIndependence_ }\n      , shaderSignedZeroInfNanPreserveFloat16{ shaderSignedZeroInfNanPreserveFloat16_ }\n      , shaderSignedZeroInfNanPreserveFloat32{ shaderSignedZeroInfNanPreserveFloat32_ }\n      , shaderSignedZeroInfNanPreserveFloat64{ shaderSignedZeroInfNanPreserveFloat64_ }\n      , shaderDenormPreserveFloat16{ shaderDenormPreserveFloat16_ }\n      , shaderDenormPreserveFloat32{ shaderDenormPreserveFloat32_ }\n      , shaderDenormPreserveFloat64{ shaderDenormPreserveFloat64_ }\n      , shaderDenormFlushToZeroFloat16{ shaderDenormFlushToZeroFloat16_ }\n      , shaderDenormFlushToZeroFloat32{ shaderDenormFlushToZeroFloat32_ }\n      , shaderDenormFlushToZeroFloat64{ shaderDenormFlushToZeroFloat64_ }\n      , shaderRoundingModeRTEFloat16{ shaderRoundingModeRTEFloat16_ }\n      , shaderRoundingModeRTEFloat32{ shaderRoundingModeRTEFloat32_ }\n      , shaderRoundingModeRTEFloat64{ shaderRoundingModeRTEFloat64_ }\n      , shaderRoundingModeRTZFloat16{ shaderRoundingModeRTZFloat16_ }\n      , shaderRoundingModeRTZFloat32{ shaderRoundingModeRTZFloat32_ }\n      , shaderRoundingModeRTZFloat64{ shaderRoundingModeRTZFloat64_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFloatControlsProperties( PhysicalDeviceFloatControlsProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceFloatControlsProperties( VkPhysicalDeviceFloatControlsProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceFloatControlsProperties( *reinterpret_cast<PhysicalDeviceFloatControlsProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceFloatControlsProperties & operator=( PhysicalDeviceFloatControlsProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceFloatControlsProperties & operator=( VkPhysicalDeviceFloatControlsProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceFloatControlsProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceFloatControlsProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceFloatControlsProperties *>( this );\n    }\n\n    operator VkPhysicalDeviceFloatControlsProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceFloatControlsProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::ShaderFloatControlsIndependence const &,\n               VULKAN_HPP_NAMESPACE::ShaderFloatControlsIndependence const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       denormBehaviorIndependence,\n                       roundingModeIndependence,\n                       shaderSignedZeroInfNanPreserveFloat16,\n                       shaderSignedZeroInfNanPreserveFloat32,\n                       shaderSignedZeroInfNanPreserveFloat64,\n                       shaderDenormPreserveFloat16,\n                       shaderDenormPreserveFloat32,\n                       shaderDenormPreserveFloat64,\n                       shaderDenormFlushToZeroFloat16,\n                       shaderDenormFlushToZeroFloat32,\n                       shaderDenormFlushToZeroFloat64,\n                       shaderRoundingModeRTEFloat16,\n                       shaderRoundingModeRTEFloat32,\n                       shaderRoundingModeRTEFloat64,\n                       shaderRoundingModeRTZFloat16,\n                       shaderRoundingModeRTZFloat32,\n                       shaderRoundingModeRTZFloat64 );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceFloatControlsProperties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceFloatControlsProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( denormBehaviorIndependence == rhs.denormBehaviorIndependence ) &&\n             ( roundingModeIndependence == rhs.roundingModeIndependence ) &&\n             ( shaderSignedZeroInfNanPreserveFloat16 == rhs.shaderSignedZeroInfNanPreserveFloat16 ) &&\n             ( shaderSignedZeroInfNanPreserveFloat32 == rhs.shaderSignedZeroInfNanPreserveFloat32 ) &&\n             ( shaderSignedZeroInfNanPreserveFloat64 == rhs.shaderSignedZeroInfNanPreserveFloat64 ) &&\n             ( shaderDenormPreserveFloat16 == rhs.shaderDenormPreserveFloat16 ) && ( shaderDenormPreserveFloat32 == rhs.shaderDenormPreserveFloat32 ) &&\n             ( shaderDenormPreserveFloat64 == rhs.shaderDenormPreserveFloat64 ) && ( shaderDenormFlushToZeroFloat16 == rhs.shaderDenormFlushToZeroFloat16 ) &&\n             ( shaderDenormFlushToZeroFloat32 == rhs.shaderDenormFlushToZeroFloat32 ) &&\n             ( shaderDenormFlushToZeroFloat64 == rhs.shaderDenormFlushToZeroFloat64 ) && ( shaderRoundingModeRTEFloat16 == rhs.shaderRoundingModeRTEFloat16 ) &&\n             ( shaderRoundingModeRTEFloat32 == rhs.shaderRoundingModeRTEFloat32 ) && ( shaderRoundingModeRTEFloat64 == rhs.shaderRoundingModeRTEFloat64 ) &&\n             ( shaderRoundingModeRTZFloat16 == rhs.shaderRoundingModeRTZFloat16 ) && ( shaderRoundingModeRTZFloat32 == rhs.shaderRoundingModeRTZFloat32 ) &&\n             ( shaderRoundingModeRTZFloat64 == rhs.shaderRoundingModeRTZFloat64 );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceFloatControlsProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                   sType                      = StructureType::ePhysicalDeviceFloatControlsProperties;\n    void *                                                pNext                      = {};\n    VULKAN_HPP_NAMESPACE::ShaderFloatControlsIndependence denormBehaviorIndependence = VULKAN_HPP_NAMESPACE::ShaderFloatControlsIndependence::e32BitOnly;\n    VULKAN_HPP_NAMESPACE::ShaderFloatControlsIndependence roundingModeIndependence   = VULKAN_HPP_NAMESPACE::ShaderFloatControlsIndependence::e32BitOnly;\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderSignedZeroInfNanPreserveFloat16 = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderSignedZeroInfNanPreserveFloat32 = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderSignedZeroInfNanPreserveFloat64 = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormPreserveFloat16           = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormPreserveFloat32           = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormPreserveFloat64           = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormFlushToZeroFloat16        = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormFlushToZeroFloat32        = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormFlushToZeroFloat64        = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTEFloat16          = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTEFloat32          = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTEFloat64          = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTZFloat16          = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTZFloat32          = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTZFloat64          = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceFloatControlsProperties>\n  {\n    using Type = PhysicalDeviceFloatControlsProperties;\n  };\n\n  using PhysicalDeviceFloatControlsPropertiesKHR = PhysicalDeviceFloatControlsProperties;\n\n  struct PhysicalDeviceFragmentDensityMap2FeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceFragmentDensityMap2FeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceFragmentDensityMap2FeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFragmentDensityMap2FeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 fragmentDensityMapDeferred_ = {},\n                                                                       void *                       pNext_                      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , fragmentDensityMapDeferred{ fragmentDensityMapDeferred_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFragmentDensityMap2FeaturesEXT( PhysicalDeviceFragmentDensityMap2FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceFragmentDensityMap2FeaturesEXT( VkPhysicalDeviceFragmentDensityMap2FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceFragmentDensityMap2FeaturesEXT( *reinterpret_cast<PhysicalDeviceFragmentDensityMap2FeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceFragmentDensityMap2FeaturesEXT & operator=( PhysicalDeviceFragmentDensityMap2FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceFragmentDensityMap2FeaturesEXT & operator=( VkPhysicalDeviceFragmentDensityMap2FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMap2FeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentDensityMap2FeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentDensityMap2FeaturesEXT &\n      setFragmentDensityMapDeferred( VULKAN_HPP_NAMESPACE::Bool32 fragmentDensityMapDeferred_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fragmentDensityMapDeferred = fragmentDensityMapDeferred_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceFragmentDensityMap2FeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceFragmentDensityMap2FeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, fragmentDensityMapDeferred );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceFragmentDensityMap2FeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceFragmentDensityMap2FeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( fragmentDensityMapDeferred == rhs.fragmentDensityMapDeferred );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceFragmentDensityMap2FeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                      = StructureType::ePhysicalDeviceFragmentDensityMap2FeaturesEXT;\n    void *                              pNext                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        fragmentDensityMapDeferred = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceFragmentDensityMap2FeaturesEXT>\n  {\n    using Type = PhysicalDeviceFragmentDensityMap2FeaturesEXT;\n  };\n\n  struct PhysicalDeviceFragmentDensityMap2PropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceFragmentDensityMap2PropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceFragmentDensityMap2PropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFragmentDensityMap2PropertiesEXT( VULKAN_HPP_NAMESPACE::Bool32 subsampledLoads_                           = {},\n                                                                         VULKAN_HPP_NAMESPACE::Bool32 subsampledCoarseReconstructionEarlyAccess_ = {},\n                                                                         uint32_t                     maxSubsampledArrayLayers_                  = {},\n                                                                         uint32_t                     maxDescriptorSetSubsampledSamplers_        = {},\n                                                                         void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , subsampledLoads{ subsampledLoads_ }\n      , subsampledCoarseReconstructionEarlyAccess{ subsampledCoarseReconstructionEarlyAccess_ }\n      , maxSubsampledArrayLayers{ maxSubsampledArrayLayers_ }\n      , maxDescriptorSetSubsampledSamplers{ maxDescriptorSetSubsampledSamplers_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceFragmentDensityMap2PropertiesEXT( PhysicalDeviceFragmentDensityMap2PropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceFragmentDensityMap2PropertiesEXT( VkPhysicalDeviceFragmentDensityMap2PropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceFragmentDensityMap2PropertiesEXT( *reinterpret_cast<PhysicalDeviceFragmentDensityMap2PropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceFragmentDensityMap2PropertiesEXT & operator=( PhysicalDeviceFragmentDensityMap2PropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceFragmentDensityMap2PropertiesEXT & operator=( VkPhysicalDeviceFragmentDensityMap2PropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMap2PropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceFragmentDensityMap2PropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceFragmentDensityMap2PropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2PropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, subsampledLoads, subsampledCoarseReconstructionEarlyAccess, maxSubsampledArrayLayers, maxDescriptorSetSubsampledSamplers );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceFragmentDensityMap2PropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceFragmentDensityMap2PropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( subsampledLoads == rhs.subsampledLoads ) &&\n             ( subsampledCoarseReconstructionEarlyAccess == rhs.subsampledCoarseReconstructionEarlyAccess ) &&\n             ( maxSubsampledArrayLayers == rhs.maxSubsampledArrayLayers ) && ( maxDescriptorSetSubsampledSamplers == rhs.maxDescriptorSetSubsampledSamplers );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceFragmentDensityMap2PropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                     = StructureType::ePhysicalDeviceFragmentDensityMap2PropertiesEXT;\n    void *                              pNext                                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        subsampledLoads                           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        subsampledCoarseReconstructionEarlyAccess = {};\n    uint32_t                            maxSubsampledArrayLayers                  = {};\n    uint32_t                            maxDescriptorSetSubsampledSamplers        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceFragmentDensityMap2PropertiesEXT>\n  {\n    using Type = PhysicalDeviceFragmentDensityMap2PropertiesEXT;\n  };\n\n  struct PhysicalDeviceFragmentDensityMapFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceFragmentDensityMapFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceFragmentDensityMapFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFragmentDensityMapFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 fragmentDensityMap_                    = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32 fragmentDensityMapDynamic_             = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32 fragmentDensityMapNonSubsampledImages_ = {},\n                                                                      void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , fragmentDensityMap{ fragmentDensityMap_ }\n      , fragmentDensityMapDynamic{ fragmentDensityMapDynamic_ }\n      , fragmentDensityMapNonSubsampledImages{ fragmentDensityMapNonSubsampledImages_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFragmentDensityMapFeaturesEXT( PhysicalDeviceFragmentDensityMapFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceFragmentDensityMapFeaturesEXT( VkPhysicalDeviceFragmentDensityMapFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceFragmentDensityMapFeaturesEXT( *reinterpret_cast<PhysicalDeviceFragmentDensityMapFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceFragmentDensityMapFeaturesEXT & operator=( PhysicalDeviceFragmentDensityMapFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceFragmentDensityMapFeaturesEXT & operator=( VkPhysicalDeviceFragmentDensityMapFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentDensityMapFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentDensityMapFeaturesEXT &\n      setFragmentDensityMap( VULKAN_HPP_NAMESPACE::Bool32 fragmentDensityMap_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fragmentDensityMap = fragmentDensityMap_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentDensityMapFeaturesEXT &\n      setFragmentDensityMapDynamic( VULKAN_HPP_NAMESPACE::Bool32 fragmentDensityMapDynamic_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fragmentDensityMapDynamic = fragmentDensityMapDynamic_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentDensityMapFeaturesEXT &\n      setFragmentDensityMapNonSubsampledImages( VULKAN_HPP_NAMESPACE::Bool32 fragmentDensityMapNonSubsampledImages_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fragmentDensityMapNonSubsampledImages = fragmentDensityMapNonSubsampledImages_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceFragmentDensityMapFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceFragmentDensityMapFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, fragmentDensityMap, fragmentDensityMapDynamic, fragmentDensityMapNonSubsampledImages );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceFragmentDensityMapFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceFragmentDensityMapFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( fragmentDensityMap == rhs.fragmentDensityMap ) &&\n             ( fragmentDensityMapDynamic == rhs.fragmentDensityMapDynamic ) &&\n             ( fragmentDensityMapNonSubsampledImages == rhs.fragmentDensityMapNonSubsampledImages );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceFragmentDensityMapFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                 = StructureType::ePhysicalDeviceFragmentDensityMapFeaturesEXT;\n    void *                              pNext                                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        fragmentDensityMap                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        fragmentDensityMapDynamic             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        fragmentDensityMapNonSubsampledImages = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceFragmentDensityMapFeaturesEXT>\n  {\n    using Type = PhysicalDeviceFragmentDensityMapFeaturesEXT;\n  };\n\n  struct PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM\n  {\n    using NativeType = VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM( VULKAN_HPP_NAMESPACE::Bool32 fragmentDensityMapOffset_ = {},\n                                                                             void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , fragmentDensityMapOffset{ fragmentDensityMapOffset_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM( PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM( VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM( *reinterpret_cast<PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM &\n      operator=( PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM & operator=( VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM &\n      setFragmentDensityMapOffset( VULKAN_HPP_NAMESPACE::Bool32 fragmentDensityMapOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fragmentDensityMapOffset = fragmentDensityMapOffset_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM *>( this );\n    }\n\n    operator VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, fragmentDensityMapOffset );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( fragmentDensityMapOffset == rhs.fragmentDensityMapOffset );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                    = StructureType::ePhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM;\n    void *                              pNext                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        fragmentDensityMapOffset = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM>\n  {\n    using Type = PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM;\n  };\n\n  struct PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM\n  {\n    using NativeType = VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM( VULKAN_HPP_NAMESPACE::Extent2D fragmentDensityOffsetGranularity_ = {},\n                                                                               void *                         pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , fragmentDensityOffsetGranularity{ fragmentDensityOffsetGranularity_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM( PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM( VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM( *reinterpret_cast<PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM &\n      operator=( PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM & operator=( VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM *>( this );\n    }\n\n    operator VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Extent2D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, fragmentDensityOffsetGranularity );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( fragmentDensityOffsetGranularity == rhs.fragmentDensityOffsetGranularity );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                            = StructureType::ePhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM;\n    void *                              pNext                            = {};\n    VULKAN_HPP_NAMESPACE::Extent2D      fragmentDensityOffsetGranularity = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM>\n  {\n    using Type = PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM;\n  };\n\n  struct PhysicalDeviceFragmentDensityMapPropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceFragmentDensityMapPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceFragmentDensityMapPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFragmentDensityMapPropertiesEXT( VULKAN_HPP_NAMESPACE::Extent2D minFragmentDensityTexelSize_ = {},\n                                                                        VULKAN_HPP_NAMESPACE::Extent2D maxFragmentDensityTexelSize_ = {},\n                                                                        VULKAN_HPP_NAMESPACE::Bool32   fragmentDensityInvocations_  = {},\n                                                                        void *                         pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , minFragmentDensityTexelSize{ minFragmentDensityTexelSize_ }\n      , maxFragmentDensityTexelSize{ maxFragmentDensityTexelSize_ }\n      , fragmentDensityInvocations{ fragmentDensityInvocations_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceFragmentDensityMapPropertiesEXT( PhysicalDeviceFragmentDensityMapPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceFragmentDensityMapPropertiesEXT( VkPhysicalDeviceFragmentDensityMapPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceFragmentDensityMapPropertiesEXT( *reinterpret_cast<PhysicalDeviceFragmentDensityMapPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceFragmentDensityMapPropertiesEXT & operator=( PhysicalDeviceFragmentDensityMapPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceFragmentDensityMapPropertiesEXT & operator=( VkPhysicalDeviceFragmentDensityMapPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceFragmentDensityMapPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceFragmentDensityMapPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, minFragmentDensityTexelSize, maxFragmentDensityTexelSize, fragmentDensityInvocations );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceFragmentDensityMapPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceFragmentDensityMapPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( minFragmentDensityTexelSize == rhs.minFragmentDensityTexelSize ) &&\n             ( maxFragmentDensityTexelSize == rhs.maxFragmentDensityTexelSize ) && ( fragmentDensityInvocations == rhs.fragmentDensityInvocations );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceFragmentDensityMapPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                       = StructureType::ePhysicalDeviceFragmentDensityMapPropertiesEXT;\n    void *                              pNext                       = {};\n    VULKAN_HPP_NAMESPACE::Extent2D      minFragmentDensityTexelSize = {};\n    VULKAN_HPP_NAMESPACE::Extent2D      maxFragmentDensityTexelSize = {};\n    VULKAN_HPP_NAMESPACE::Bool32        fragmentDensityInvocations  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceFragmentDensityMapPropertiesEXT>\n  {\n    using Type = PhysicalDeviceFragmentDensityMapPropertiesEXT;\n  };\n\n  struct PhysicalDeviceFragmentShaderBarycentricFeaturesKHR\n  {\n    using NativeType = VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceFragmentShaderBarycentricFeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFragmentShaderBarycentricFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 fragmentShaderBarycentric_ = {},\n                                                                             void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , fragmentShaderBarycentric{ fragmentShaderBarycentric_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceFragmentShaderBarycentricFeaturesKHR( PhysicalDeviceFragmentShaderBarycentricFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceFragmentShaderBarycentricFeaturesKHR( VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceFragmentShaderBarycentricFeaturesKHR( *reinterpret_cast<PhysicalDeviceFragmentShaderBarycentricFeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceFragmentShaderBarycentricFeaturesKHR &\n      operator=( PhysicalDeviceFragmentShaderBarycentricFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceFragmentShaderBarycentricFeaturesKHR & operator=( VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShaderBarycentricFeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentShaderBarycentricFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentShaderBarycentricFeaturesKHR &\n      setFragmentShaderBarycentric( VULKAN_HPP_NAMESPACE::Bool32 fragmentShaderBarycentric_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fragmentShaderBarycentric = fragmentShaderBarycentric_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, fragmentShaderBarycentric );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceFragmentShaderBarycentricFeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceFragmentShaderBarycentricFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( fragmentShaderBarycentric == rhs.fragmentShaderBarycentric );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceFragmentShaderBarycentricFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                     = StructureType::ePhysicalDeviceFragmentShaderBarycentricFeaturesKHR;\n    void *                              pNext                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        fragmentShaderBarycentric = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceFragmentShaderBarycentricFeaturesKHR>\n  {\n    using Type = PhysicalDeviceFragmentShaderBarycentricFeaturesKHR;\n  };\n\n  using PhysicalDeviceFragmentShaderBarycentricFeaturesNV = PhysicalDeviceFragmentShaderBarycentricFeaturesKHR;\n\n  struct PhysicalDeviceFragmentShaderBarycentricPropertiesKHR\n  {\n    using NativeType = VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceFragmentShaderBarycentricPropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceFragmentShaderBarycentricPropertiesKHR( VULKAN_HPP_NAMESPACE::Bool32 triStripVertexOrderIndependentOfProvokingVertex_ = {},\n                                                            void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , triStripVertexOrderIndependentOfProvokingVertex{ triStripVertexOrderIndependentOfProvokingVertex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceFragmentShaderBarycentricPropertiesKHR( PhysicalDeviceFragmentShaderBarycentricPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceFragmentShaderBarycentricPropertiesKHR( VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceFragmentShaderBarycentricPropertiesKHR( *reinterpret_cast<PhysicalDeviceFragmentShaderBarycentricPropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceFragmentShaderBarycentricPropertiesKHR &\n      operator=( PhysicalDeviceFragmentShaderBarycentricPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceFragmentShaderBarycentricPropertiesKHR & operator=( VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShaderBarycentricPropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, triStripVertexOrderIndependentOfProvokingVertex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceFragmentShaderBarycentricPropertiesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceFragmentShaderBarycentricPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) &&\n             ( triStripVertexOrderIndependentOfProvokingVertex == rhs.triStripVertexOrderIndependentOfProvokingVertex );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceFragmentShaderBarycentricPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                           = StructureType::ePhysicalDeviceFragmentShaderBarycentricPropertiesKHR;\n    void *                              pNext                                           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        triStripVertexOrderIndependentOfProvokingVertex = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceFragmentShaderBarycentricPropertiesKHR>\n  {\n    using Type = PhysicalDeviceFragmentShaderBarycentricPropertiesKHR;\n  };\n\n  struct PhysicalDeviceFragmentShaderInterlockFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceFragmentShaderInterlockFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFragmentShaderInterlockFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 fragmentShaderSampleInterlock_      = {},\n                                                                           VULKAN_HPP_NAMESPACE::Bool32 fragmentShaderPixelInterlock_       = {},\n                                                                           VULKAN_HPP_NAMESPACE::Bool32 fragmentShaderShadingRateInterlock_ = {},\n                                                                           void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , fragmentShaderSampleInterlock{ fragmentShaderSampleInterlock_ }\n      , fragmentShaderPixelInterlock{ fragmentShaderPixelInterlock_ }\n      , fragmentShaderShadingRateInterlock{ fragmentShaderShadingRateInterlock_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceFragmentShaderInterlockFeaturesEXT( PhysicalDeviceFragmentShaderInterlockFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceFragmentShaderInterlockFeaturesEXT( VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceFragmentShaderInterlockFeaturesEXT( *reinterpret_cast<PhysicalDeviceFragmentShaderInterlockFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceFragmentShaderInterlockFeaturesEXT & operator=( PhysicalDeviceFragmentShaderInterlockFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceFragmentShaderInterlockFeaturesEXT & operator=( VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShaderInterlockFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentShaderInterlockFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentShaderInterlockFeaturesEXT &\n      setFragmentShaderSampleInterlock( VULKAN_HPP_NAMESPACE::Bool32 fragmentShaderSampleInterlock_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fragmentShaderSampleInterlock = fragmentShaderSampleInterlock_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentShaderInterlockFeaturesEXT &\n      setFragmentShaderPixelInterlock( VULKAN_HPP_NAMESPACE::Bool32 fragmentShaderPixelInterlock_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fragmentShaderPixelInterlock = fragmentShaderPixelInterlock_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentShaderInterlockFeaturesEXT &\n      setFragmentShaderShadingRateInterlock( VULKAN_HPP_NAMESPACE::Bool32 fragmentShaderShadingRateInterlock_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fragmentShaderShadingRateInterlock = fragmentShaderShadingRateInterlock_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, fragmentShaderSampleInterlock, fragmentShaderPixelInterlock, fragmentShaderShadingRateInterlock );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceFragmentShaderInterlockFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceFragmentShaderInterlockFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( fragmentShaderSampleInterlock == rhs.fragmentShaderSampleInterlock ) &&\n             ( fragmentShaderPixelInterlock == rhs.fragmentShaderPixelInterlock ) &&\n             ( fragmentShaderShadingRateInterlock == rhs.fragmentShaderShadingRateInterlock );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceFragmentShaderInterlockFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                              = StructureType::ePhysicalDeviceFragmentShaderInterlockFeaturesEXT;\n    void *                              pNext                              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        fragmentShaderSampleInterlock      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        fragmentShaderPixelInterlock       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        fragmentShaderShadingRateInterlock = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceFragmentShaderInterlockFeaturesEXT>\n  {\n    using Type = PhysicalDeviceFragmentShaderInterlockFeaturesEXT;\n  };\n\n  struct PhysicalDeviceFragmentShadingRateEnumsFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceFragmentShadingRateEnumsFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFragmentShadingRateEnumsFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 fragmentShadingRateEnums_         = {},\n                                                                           VULKAN_HPP_NAMESPACE::Bool32 supersampleFragmentShadingRates_  = {},\n                                                                           VULKAN_HPP_NAMESPACE::Bool32 noInvocationFragmentShadingRates_ = {},\n                                                                           void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , fragmentShadingRateEnums{ fragmentShadingRateEnums_ }\n      , supersampleFragmentShadingRates{ supersampleFragmentShadingRates_ }\n      , noInvocationFragmentShadingRates{ noInvocationFragmentShadingRates_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceFragmentShadingRateEnumsFeaturesNV( PhysicalDeviceFragmentShadingRateEnumsFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceFragmentShadingRateEnumsFeaturesNV( VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceFragmentShadingRateEnumsFeaturesNV( *reinterpret_cast<PhysicalDeviceFragmentShadingRateEnumsFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceFragmentShadingRateEnumsFeaturesNV & operator=( PhysicalDeviceFragmentShadingRateEnumsFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceFragmentShadingRateEnumsFeaturesNV & operator=( VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateEnumsFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentShadingRateEnumsFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentShadingRateEnumsFeaturesNV &\n      setFragmentShadingRateEnums( VULKAN_HPP_NAMESPACE::Bool32 fragmentShadingRateEnums_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fragmentShadingRateEnums = fragmentShadingRateEnums_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentShadingRateEnumsFeaturesNV &\n      setSupersampleFragmentShadingRates( VULKAN_HPP_NAMESPACE::Bool32 supersampleFragmentShadingRates_ ) VULKAN_HPP_NOEXCEPT\n    {\n      supersampleFragmentShadingRates = supersampleFragmentShadingRates_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentShadingRateEnumsFeaturesNV &\n      setNoInvocationFragmentShadingRates( VULKAN_HPP_NAMESPACE::Bool32 noInvocationFragmentShadingRates_ ) VULKAN_HPP_NOEXCEPT\n    {\n      noInvocationFragmentShadingRates = noInvocationFragmentShadingRates_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, fragmentShadingRateEnums, supersampleFragmentShadingRates, noInvocationFragmentShadingRates );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceFragmentShadingRateEnumsFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceFragmentShadingRateEnumsFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( fragmentShadingRateEnums == rhs.fragmentShadingRateEnums ) &&\n             ( supersampleFragmentShadingRates == rhs.supersampleFragmentShadingRates ) &&\n             ( noInvocationFragmentShadingRates == rhs.noInvocationFragmentShadingRates );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceFragmentShadingRateEnumsFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                            = StructureType::ePhysicalDeviceFragmentShadingRateEnumsFeaturesNV;\n    void *                              pNext                            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        fragmentShadingRateEnums         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        supersampleFragmentShadingRates  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        noInvocationFragmentShadingRates = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceFragmentShadingRateEnumsFeaturesNV>\n  {\n    using Type = PhysicalDeviceFragmentShadingRateEnumsFeaturesNV;\n  };\n\n  struct PhysicalDeviceFragmentShadingRateEnumsPropertiesNV\n  {\n    using NativeType = VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceFragmentShadingRateEnumsPropertiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFragmentShadingRateEnumsPropertiesNV(\n      VULKAN_HPP_NAMESPACE::SampleCountFlagBits maxFragmentShadingRateInvocationCount_ = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1,\n      void *                                    pNext_                                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxFragmentShadingRateInvocationCount{ maxFragmentShadingRateInvocationCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceFragmentShadingRateEnumsPropertiesNV( PhysicalDeviceFragmentShadingRateEnumsPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceFragmentShadingRateEnumsPropertiesNV( VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceFragmentShadingRateEnumsPropertiesNV( *reinterpret_cast<PhysicalDeviceFragmentShadingRateEnumsPropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceFragmentShadingRateEnumsPropertiesNV &\n      operator=( PhysicalDeviceFragmentShadingRateEnumsPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceFragmentShadingRateEnumsPropertiesNV & operator=( VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateEnumsPropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentShadingRateEnumsPropertiesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentShadingRateEnumsPropertiesNV &\n      setMaxFragmentShadingRateInvocationCount( VULKAN_HPP_NAMESPACE::SampleCountFlagBits maxFragmentShadingRateInvocationCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxFragmentShadingRateInvocationCount = maxFragmentShadingRateInvocationCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::SampleCountFlagBits const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxFragmentShadingRateInvocationCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceFragmentShadingRateEnumsPropertiesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceFragmentShadingRateEnumsPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxFragmentShadingRateInvocationCount == rhs.maxFragmentShadingRateInvocationCount );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceFragmentShadingRateEnumsPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType                                 = StructureType::ePhysicalDeviceFragmentShadingRateEnumsPropertiesNV;\n    void *                                    pNext                                 = {};\n    VULKAN_HPP_NAMESPACE::SampleCountFlagBits maxFragmentShadingRateInvocationCount = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceFragmentShadingRateEnumsPropertiesNV>\n  {\n    using Type = PhysicalDeviceFragmentShadingRateEnumsPropertiesNV;\n  };\n\n  struct PhysicalDeviceFragmentShadingRateFeaturesKHR\n  {\n    using NativeType = VkPhysicalDeviceFragmentShadingRateFeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceFragmentShadingRateFeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFragmentShadingRateFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 pipelineFragmentShadingRate_   = {},\n                                                                       VULKAN_HPP_NAMESPACE::Bool32 primitiveFragmentShadingRate_  = {},\n                                                                       VULKAN_HPP_NAMESPACE::Bool32 attachmentFragmentShadingRate_ = {},\n                                                                       void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pipelineFragmentShadingRate{ pipelineFragmentShadingRate_ }\n      , primitiveFragmentShadingRate{ primitiveFragmentShadingRate_ }\n      , attachmentFragmentShadingRate{ attachmentFragmentShadingRate_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFragmentShadingRateFeaturesKHR( PhysicalDeviceFragmentShadingRateFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceFragmentShadingRateFeaturesKHR( VkPhysicalDeviceFragmentShadingRateFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceFragmentShadingRateFeaturesKHR( *reinterpret_cast<PhysicalDeviceFragmentShadingRateFeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceFragmentShadingRateFeaturesKHR & operator=( PhysicalDeviceFragmentShadingRateFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceFragmentShadingRateFeaturesKHR & operator=( VkPhysicalDeviceFragmentShadingRateFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateFeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentShadingRateFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentShadingRateFeaturesKHR &\n      setPipelineFragmentShadingRate( VULKAN_HPP_NAMESPACE::Bool32 pipelineFragmentShadingRate_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineFragmentShadingRate = pipelineFragmentShadingRate_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentShadingRateFeaturesKHR &\n      setPrimitiveFragmentShadingRate( VULKAN_HPP_NAMESPACE::Bool32 primitiveFragmentShadingRate_ ) VULKAN_HPP_NOEXCEPT\n    {\n      primitiveFragmentShadingRate = primitiveFragmentShadingRate_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFragmentShadingRateFeaturesKHR &\n      setAttachmentFragmentShadingRate( VULKAN_HPP_NAMESPACE::Bool32 attachmentFragmentShadingRate_ ) VULKAN_HPP_NOEXCEPT\n    {\n      attachmentFragmentShadingRate = attachmentFragmentShadingRate_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceFragmentShadingRateFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateFeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceFragmentShadingRateFeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceFragmentShadingRateFeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pipelineFragmentShadingRate, primitiveFragmentShadingRate, attachmentFragmentShadingRate );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceFragmentShadingRateFeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceFragmentShadingRateFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pipelineFragmentShadingRate == rhs.pipelineFragmentShadingRate ) &&\n             ( primitiveFragmentShadingRate == rhs.primitiveFragmentShadingRate ) && ( attachmentFragmentShadingRate == rhs.attachmentFragmentShadingRate );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceFragmentShadingRateFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                         = StructureType::ePhysicalDeviceFragmentShadingRateFeaturesKHR;\n    void *                              pNext                         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        pipelineFragmentShadingRate   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        primitiveFragmentShadingRate  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        attachmentFragmentShadingRate = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceFragmentShadingRateFeaturesKHR>\n  {\n    using Type = PhysicalDeviceFragmentShadingRateFeaturesKHR;\n  };\n\n  struct PhysicalDeviceFragmentShadingRateKHR\n  {\n    using NativeType = VkPhysicalDeviceFragmentShadingRateKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceFragmentShadingRateKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFragmentShadingRateKHR( VULKAN_HPP_NAMESPACE::SampleCountFlags sampleCounts_ = {},\n                                                               VULKAN_HPP_NAMESPACE::Extent2D         fragmentSize_ = {},\n                                                               void *                                 pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , sampleCounts{ sampleCounts_ }\n      , fragmentSize{ fragmentSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFragmentShadingRateKHR( PhysicalDeviceFragmentShadingRateKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceFragmentShadingRateKHR( VkPhysicalDeviceFragmentShadingRateKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceFragmentShadingRateKHR( *reinterpret_cast<PhysicalDeviceFragmentShadingRateKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceFragmentShadingRateKHR & operator=( PhysicalDeviceFragmentShadingRateKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceFragmentShadingRateKHR & operator=( VkPhysicalDeviceFragmentShadingRateKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceFragmentShadingRateKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceFragmentShadingRateKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceFragmentShadingRateKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::\n      tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::SampleCountFlags const &, VULKAN_HPP_NAMESPACE::Extent2D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, sampleCounts, fragmentSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceFragmentShadingRateKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceFragmentShadingRateKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( sampleCounts == rhs.sampleCounts ) && ( fragmentSize == rhs.fragmentSize );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceFragmentShadingRateKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType        = StructureType::ePhysicalDeviceFragmentShadingRateKHR;\n    void *                                 pNext        = {};\n    VULKAN_HPP_NAMESPACE::SampleCountFlags sampleCounts = {};\n    VULKAN_HPP_NAMESPACE::Extent2D         fragmentSize = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceFragmentShadingRateKHR>\n  {\n    using Type = PhysicalDeviceFragmentShadingRateKHR;\n  };\n\n  struct PhysicalDeviceFragmentShadingRatePropertiesKHR\n  {\n    using NativeType = VkPhysicalDeviceFragmentShadingRatePropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceFragmentShadingRatePropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFragmentShadingRatePropertiesKHR(\n      VULKAN_HPP_NAMESPACE::Extent2D            minFragmentShadingRateAttachmentTexelSize_            = {},\n      VULKAN_HPP_NAMESPACE::Extent2D            maxFragmentShadingRateAttachmentTexelSize_            = {},\n      uint32_t                                  maxFragmentShadingRateAttachmentTexelSizeAspectRatio_ = {},\n      VULKAN_HPP_NAMESPACE::Bool32              primitiveFragmentShadingRateWithMultipleViewports_    = {},\n      VULKAN_HPP_NAMESPACE::Bool32              layeredShadingRateAttachments_                        = {},\n      VULKAN_HPP_NAMESPACE::Bool32              fragmentShadingRateNonTrivialCombinerOps_             = {},\n      VULKAN_HPP_NAMESPACE::Extent2D            maxFragmentSize_                                      = {},\n      uint32_t                                  maxFragmentSizeAspectRatio_                           = {},\n      uint32_t                                  maxFragmentShadingRateCoverageSamples_                = {},\n      VULKAN_HPP_NAMESPACE::SampleCountFlagBits maxFragmentShadingRateRasterizationSamples_           = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1,\n      VULKAN_HPP_NAMESPACE::Bool32              fragmentShadingRateWithShaderDepthStencilWrites_      = {},\n      VULKAN_HPP_NAMESPACE::Bool32              fragmentShadingRateWithSampleMask_                    = {},\n      VULKAN_HPP_NAMESPACE::Bool32              fragmentShadingRateWithShaderSampleMask_              = {},\n      VULKAN_HPP_NAMESPACE::Bool32              fragmentShadingRateWithConservativeRasterization_     = {},\n      VULKAN_HPP_NAMESPACE::Bool32              fragmentShadingRateWithFragmentShaderInterlock_       = {},\n      VULKAN_HPP_NAMESPACE::Bool32              fragmentShadingRateWithCustomSampleLocations_         = {},\n      VULKAN_HPP_NAMESPACE::Bool32              fragmentShadingRateStrictMultiplyCombiner_            = {},\n      void *                                    pNext_                                                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , minFragmentShadingRateAttachmentTexelSize{ minFragmentShadingRateAttachmentTexelSize_ }\n      , maxFragmentShadingRateAttachmentTexelSize{ maxFragmentShadingRateAttachmentTexelSize_ }\n      , maxFragmentShadingRateAttachmentTexelSizeAspectRatio{ maxFragmentShadingRateAttachmentTexelSizeAspectRatio_ }\n      , primitiveFragmentShadingRateWithMultipleViewports{ primitiveFragmentShadingRateWithMultipleViewports_ }\n      , layeredShadingRateAttachments{ layeredShadingRateAttachments_ }\n      , fragmentShadingRateNonTrivialCombinerOps{ fragmentShadingRateNonTrivialCombinerOps_ }\n      , maxFragmentSize{ maxFragmentSize_ }\n      , maxFragmentSizeAspectRatio{ maxFragmentSizeAspectRatio_ }\n      , maxFragmentShadingRateCoverageSamples{ maxFragmentShadingRateCoverageSamples_ }\n      , maxFragmentShadingRateRasterizationSamples{ maxFragmentShadingRateRasterizationSamples_ }\n      , fragmentShadingRateWithShaderDepthStencilWrites{ fragmentShadingRateWithShaderDepthStencilWrites_ }\n      , fragmentShadingRateWithSampleMask{ fragmentShadingRateWithSampleMask_ }\n      , fragmentShadingRateWithShaderSampleMask{ fragmentShadingRateWithShaderSampleMask_ }\n      , fragmentShadingRateWithConservativeRasterization{ fragmentShadingRateWithConservativeRasterization_ }\n      , fragmentShadingRateWithFragmentShaderInterlock{ fragmentShadingRateWithFragmentShaderInterlock_ }\n      , fragmentShadingRateWithCustomSampleLocations{ fragmentShadingRateWithCustomSampleLocations_ }\n      , fragmentShadingRateStrictMultiplyCombiner{ fragmentShadingRateStrictMultiplyCombiner_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceFragmentShadingRatePropertiesKHR( PhysicalDeviceFragmentShadingRatePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceFragmentShadingRatePropertiesKHR( VkPhysicalDeviceFragmentShadingRatePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceFragmentShadingRatePropertiesKHR( *reinterpret_cast<PhysicalDeviceFragmentShadingRatePropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceFragmentShadingRatePropertiesKHR & operator=( PhysicalDeviceFragmentShadingRatePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceFragmentShadingRatePropertiesKHR & operator=( VkPhysicalDeviceFragmentShadingRatePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRatePropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceFragmentShadingRatePropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceFragmentShadingRatePropertiesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceFragmentShadingRatePropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceFragmentShadingRatePropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlagBits const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       minFragmentShadingRateAttachmentTexelSize,\n                       maxFragmentShadingRateAttachmentTexelSize,\n                       maxFragmentShadingRateAttachmentTexelSizeAspectRatio,\n                       primitiveFragmentShadingRateWithMultipleViewports,\n                       layeredShadingRateAttachments,\n                       fragmentShadingRateNonTrivialCombinerOps,\n                       maxFragmentSize,\n                       maxFragmentSizeAspectRatio,\n                       maxFragmentShadingRateCoverageSamples,\n                       maxFragmentShadingRateRasterizationSamples,\n                       fragmentShadingRateWithShaderDepthStencilWrites,\n                       fragmentShadingRateWithSampleMask,\n                       fragmentShadingRateWithShaderSampleMask,\n                       fragmentShadingRateWithConservativeRasterization,\n                       fragmentShadingRateWithFragmentShaderInterlock,\n                       fragmentShadingRateWithCustomSampleLocations,\n                       fragmentShadingRateStrictMultiplyCombiner );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceFragmentShadingRatePropertiesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceFragmentShadingRatePropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) &&\n             ( minFragmentShadingRateAttachmentTexelSize == rhs.minFragmentShadingRateAttachmentTexelSize ) &&\n             ( maxFragmentShadingRateAttachmentTexelSize == rhs.maxFragmentShadingRateAttachmentTexelSize ) &&\n             ( maxFragmentShadingRateAttachmentTexelSizeAspectRatio == rhs.maxFragmentShadingRateAttachmentTexelSizeAspectRatio ) &&\n             ( primitiveFragmentShadingRateWithMultipleViewports == rhs.primitiveFragmentShadingRateWithMultipleViewports ) &&\n             ( layeredShadingRateAttachments == rhs.layeredShadingRateAttachments ) &&\n             ( fragmentShadingRateNonTrivialCombinerOps == rhs.fragmentShadingRateNonTrivialCombinerOps ) && ( maxFragmentSize == rhs.maxFragmentSize ) &&\n             ( maxFragmentSizeAspectRatio == rhs.maxFragmentSizeAspectRatio ) &&\n             ( maxFragmentShadingRateCoverageSamples == rhs.maxFragmentShadingRateCoverageSamples ) &&\n             ( maxFragmentShadingRateRasterizationSamples == rhs.maxFragmentShadingRateRasterizationSamples ) &&\n             ( fragmentShadingRateWithShaderDepthStencilWrites == rhs.fragmentShadingRateWithShaderDepthStencilWrites ) &&\n             ( fragmentShadingRateWithSampleMask == rhs.fragmentShadingRateWithSampleMask ) &&\n             ( fragmentShadingRateWithShaderSampleMask == rhs.fragmentShadingRateWithShaderSampleMask ) &&\n             ( fragmentShadingRateWithConservativeRasterization == rhs.fragmentShadingRateWithConservativeRasterization ) &&\n             ( fragmentShadingRateWithFragmentShaderInterlock == rhs.fragmentShadingRateWithFragmentShaderInterlock ) &&\n             ( fragmentShadingRateWithCustomSampleLocations == rhs.fragmentShadingRateWithCustomSampleLocations ) &&\n             ( fragmentShadingRateStrictMultiplyCombiner == rhs.fragmentShadingRateStrictMultiplyCombiner );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceFragmentShadingRatePropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType                                     = StructureType::ePhysicalDeviceFragmentShadingRatePropertiesKHR;\n    void *                                    pNext                                     = {};\n    VULKAN_HPP_NAMESPACE::Extent2D            minFragmentShadingRateAttachmentTexelSize = {};\n    VULKAN_HPP_NAMESPACE::Extent2D            maxFragmentShadingRateAttachmentTexelSize = {};\n    uint32_t                                  maxFragmentShadingRateAttachmentTexelSizeAspectRatio = {};\n    VULKAN_HPP_NAMESPACE::Bool32              primitiveFragmentShadingRateWithMultipleViewports    = {};\n    VULKAN_HPP_NAMESPACE::Bool32              layeredShadingRateAttachments                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32              fragmentShadingRateNonTrivialCombinerOps             = {};\n    VULKAN_HPP_NAMESPACE::Extent2D            maxFragmentSize                                      = {};\n    uint32_t                                  maxFragmentSizeAspectRatio                           = {};\n    uint32_t                                  maxFragmentShadingRateCoverageSamples                = {};\n    VULKAN_HPP_NAMESPACE::SampleCountFlagBits maxFragmentShadingRateRasterizationSamples           = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1;\n    VULKAN_HPP_NAMESPACE::Bool32              fragmentShadingRateWithShaderDepthStencilWrites      = {};\n    VULKAN_HPP_NAMESPACE::Bool32              fragmentShadingRateWithSampleMask                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32              fragmentShadingRateWithShaderSampleMask              = {};\n    VULKAN_HPP_NAMESPACE::Bool32              fragmentShadingRateWithConservativeRasterization     = {};\n    VULKAN_HPP_NAMESPACE::Bool32              fragmentShadingRateWithFragmentShaderInterlock       = {};\n    VULKAN_HPP_NAMESPACE::Bool32              fragmentShadingRateWithCustomSampleLocations         = {};\n    VULKAN_HPP_NAMESPACE::Bool32              fragmentShadingRateStrictMultiplyCombiner            = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceFragmentShadingRatePropertiesKHR>\n  {\n    using Type = PhysicalDeviceFragmentShadingRatePropertiesKHR;\n  };\n\n  struct PhysicalDeviceFrameBoundaryFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceFrameBoundaryFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceFrameBoundaryFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFrameBoundaryFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 frameBoundary_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , frameBoundary{ frameBoundary_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceFrameBoundaryFeaturesEXT( PhysicalDeviceFrameBoundaryFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceFrameBoundaryFeaturesEXT( VkPhysicalDeviceFrameBoundaryFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceFrameBoundaryFeaturesEXT( *reinterpret_cast<PhysicalDeviceFrameBoundaryFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceFrameBoundaryFeaturesEXT & operator=( PhysicalDeviceFrameBoundaryFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceFrameBoundaryFeaturesEXT & operator=( VkPhysicalDeviceFrameBoundaryFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceFrameBoundaryFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFrameBoundaryFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceFrameBoundaryFeaturesEXT & setFrameBoundary( VULKAN_HPP_NAMESPACE::Bool32 frameBoundary_ ) VULKAN_HPP_NOEXCEPT\n    {\n      frameBoundary = frameBoundary_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceFrameBoundaryFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceFrameBoundaryFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceFrameBoundaryFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceFrameBoundaryFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, frameBoundary );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceFrameBoundaryFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceFrameBoundaryFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( frameBoundary == rhs.frameBoundary );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceFrameBoundaryFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType         = StructureType::ePhysicalDeviceFrameBoundaryFeaturesEXT;\n    void *                              pNext         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        frameBoundary = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceFrameBoundaryFeaturesEXT>\n  {\n    using Type = PhysicalDeviceFrameBoundaryFeaturesEXT;\n  };\n\n  struct PhysicalDeviceGlobalPriorityQueryFeatures\n  {\n    using NativeType = VkPhysicalDeviceGlobalPriorityQueryFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceGlobalPriorityQueryFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceGlobalPriorityQueryFeatures( VULKAN_HPP_NAMESPACE::Bool32 globalPriorityQuery_ = {},\n                                                                    void *                       pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , globalPriorityQuery{ globalPriorityQuery_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceGlobalPriorityQueryFeatures( PhysicalDeviceGlobalPriorityQueryFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceGlobalPriorityQueryFeatures( VkPhysicalDeviceGlobalPriorityQueryFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceGlobalPriorityQueryFeatures( *reinterpret_cast<PhysicalDeviceGlobalPriorityQueryFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceGlobalPriorityQueryFeatures & operator=( PhysicalDeviceGlobalPriorityQueryFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceGlobalPriorityQueryFeatures & operator=( VkPhysicalDeviceGlobalPriorityQueryFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceGlobalPriorityQueryFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceGlobalPriorityQueryFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceGlobalPriorityQueryFeatures &\n      setGlobalPriorityQuery( VULKAN_HPP_NAMESPACE::Bool32 globalPriorityQuery_ ) VULKAN_HPP_NOEXCEPT\n    {\n      globalPriorityQuery = globalPriorityQuery_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceGlobalPriorityQueryFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceGlobalPriorityQueryFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceGlobalPriorityQueryFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceGlobalPriorityQueryFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, globalPriorityQuery );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceGlobalPriorityQueryFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceGlobalPriorityQueryFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( globalPriorityQuery == rhs.globalPriorityQuery );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceGlobalPriorityQueryFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType               = StructureType::ePhysicalDeviceGlobalPriorityQueryFeatures;\n    void *                              pNext               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        globalPriorityQuery = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceGlobalPriorityQueryFeatures>\n  {\n    using Type = PhysicalDeviceGlobalPriorityQueryFeatures;\n  };\n\n  using PhysicalDeviceGlobalPriorityQueryFeaturesEXT = PhysicalDeviceGlobalPriorityQueryFeatures;\n  using PhysicalDeviceGlobalPriorityQueryFeaturesKHR = PhysicalDeviceGlobalPriorityQueryFeatures;\n\n  struct PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceGraphicsPipelineLibraryFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 graphicsPipelineLibrary_ = {},\n                                                                           void *                       pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , graphicsPipelineLibrary{ graphicsPipelineLibrary_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT( PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT( VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT( *reinterpret_cast<PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT & operator=( PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT & operator=( VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT &\n      setGraphicsPipelineLibrary( VULKAN_HPP_NAMESPACE::Bool32 graphicsPipelineLibrary_ ) VULKAN_HPP_NOEXCEPT\n    {\n      graphicsPipelineLibrary = graphicsPipelineLibrary_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, graphicsPipelineLibrary );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( graphicsPipelineLibrary == rhs.graphicsPipelineLibrary );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                   = StructureType::ePhysicalDeviceGraphicsPipelineLibraryFeaturesEXT;\n    void *                              pNext                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        graphicsPipelineLibrary = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceGraphicsPipelineLibraryFeaturesEXT>\n  {\n    using Type = PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT;\n  };\n\n  struct PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceGraphicsPipelineLibraryPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT( VULKAN_HPP_NAMESPACE::Bool32 graphicsPipelineLibraryFastLinking_                        = {},\n                                                          VULKAN_HPP_NAMESPACE::Bool32 graphicsPipelineLibraryIndependentInterpolationDecoration_ = {},\n                                                          void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , graphicsPipelineLibraryFastLinking{ graphicsPipelineLibraryFastLinking_ }\n      , graphicsPipelineLibraryIndependentInterpolationDecoration{ graphicsPipelineLibraryIndependentInterpolationDecoration_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT( PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT( VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT( *reinterpret_cast<PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT &\n      operator=( PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT & operator=( VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT &\n      setGraphicsPipelineLibraryFastLinking( VULKAN_HPP_NAMESPACE::Bool32 graphicsPipelineLibraryFastLinking_ ) VULKAN_HPP_NOEXCEPT\n    {\n      graphicsPipelineLibraryFastLinking = graphicsPipelineLibraryFastLinking_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT & setGraphicsPipelineLibraryIndependentInterpolationDecoration(\n      VULKAN_HPP_NAMESPACE::Bool32 graphicsPipelineLibraryIndependentInterpolationDecoration_ ) VULKAN_HPP_NOEXCEPT\n    {\n      graphicsPipelineLibraryIndependentInterpolationDecoration = graphicsPipelineLibraryIndependentInterpolationDecoration_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, graphicsPipelineLibraryFastLinking, graphicsPipelineLibraryIndependentInterpolationDecoration );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( graphicsPipelineLibraryFastLinking == rhs.graphicsPipelineLibraryFastLinking ) &&\n             ( graphicsPipelineLibraryIndependentInterpolationDecoration == rhs.graphicsPipelineLibraryIndependentInterpolationDecoration );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                              = StructureType::ePhysicalDeviceGraphicsPipelineLibraryPropertiesEXT;\n    void *                              pNext                              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        graphicsPipelineLibraryFastLinking = {};\n    VULKAN_HPP_NAMESPACE::Bool32        graphicsPipelineLibraryIndependentInterpolationDecoration = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceGraphicsPipelineLibraryPropertiesEXT>\n  {\n    using Type = PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT;\n  };\n\n  struct PhysicalDeviceGroupProperties\n  {\n    using NativeType = VkPhysicalDeviceGroupProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceGroupProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14\n      PhysicalDeviceGroupProperties( uint32_t                                                                           physicalDeviceCount_ = {},\n                                     std::array<VULKAN_HPP_NAMESPACE::PhysicalDevice, VK_MAX_DEVICE_GROUP_SIZE> const & physicalDevices_     = {},\n                                     VULKAN_HPP_NAMESPACE::Bool32                                                       subsetAllocation_    = {},\n                                     void *                                                                             pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , physicalDeviceCount{ physicalDeviceCount_ }\n      , physicalDevices{ physicalDevices_ }\n      , subsetAllocation{ subsetAllocation_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceGroupProperties( PhysicalDeviceGroupProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceGroupProperties( VkPhysicalDeviceGroupProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceGroupProperties( *reinterpret_cast<PhysicalDeviceGroupProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceGroupProperties & operator=( PhysicalDeviceGroupProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceGroupProperties & operator=( VkPhysicalDeviceGroupProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceGroupProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceGroupProperties *>( this );\n    }\n\n    operator VkPhysicalDeviceGroupProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceGroupProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::PhysicalDevice, VK_MAX_DEVICE_GROUP_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, physicalDeviceCount, physicalDevices, subsetAllocation );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( PhysicalDeviceGroupProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = physicalDeviceCount <=> rhs.physicalDeviceCount; cmp != 0 )\n        return cmp;\n      for ( size_t i = 0; i < physicalDeviceCount; ++i )\n      {\n        if ( auto cmp = physicalDevices[i] <=> rhs.physicalDevices[i]; cmp != 0 )\n          return cmp;\n      }\n      if ( auto cmp = subsetAllocation <=> rhs.subsetAllocation; cmp != 0 )\n        return cmp;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( PhysicalDeviceGroupProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( physicalDeviceCount == rhs.physicalDeviceCount ) &&\n             ( memcmp( physicalDevices, rhs.physicalDevices, physicalDeviceCount * sizeof( VULKAN_HPP_NAMESPACE::PhysicalDevice ) ) == 0 ) &&\n             ( subsetAllocation == rhs.subsetAllocation );\n    }\n\n    bool operator!=( PhysicalDeviceGroupProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                                                  sType = StructureType::ePhysicalDeviceGroupProperties;\n    void *                                                                                               pNext = {};\n    uint32_t                                                                                             physicalDeviceCount = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::PhysicalDevice, VK_MAX_DEVICE_GROUP_SIZE> physicalDevices     = {};\n    VULKAN_HPP_NAMESPACE::Bool32                                                                         subsetAllocation    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceGroupProperties>\n  {\n    using Type = PhysicalDeviceGroupProperties;\n  };\n\n  using PhysicalDeviceGroupPropertiesKHR = PhysicalDeviceGroupProperties;\n\n  struct PhysicalDeviceHdrVividFeaturesHUAWEI\n  {\n    using NativeType = VkPhysicalDeviceHdrVividFeaturesHUAWEI;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceHdrVividFeaturesHUAWEI;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceHdrVividFeaturesHUAWEI( VULKAN_HPP_NAMESPACE::Bool32 hdrVivid_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , hdrVivid{ hdrVivid_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceHdrVividFeaturesHUAWEI( PhysicalDeviceHdrVividFeaturesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceHdrVividFeaturesHUAWEI( VkPhysicalDeviceHdrVividFeaturesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceHdrVividFeaturesHUAWEI( *reinterpret_cast<PhysicalDeviceHdrVividFeaturesHUAWEI const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceHdrVividFeaturesHUAWEI & operator=( PhysicalDeviceHdrVividFeaturesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceHdrVividFeaturesHUAWEI & operator=( VkPhysicalDeviceHdrVividFeaturesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceHdrVividFeaturesHUAWEI const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceHdrVividFeaturesHUAWEI & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceHdrVividFeaturesHUAWEI & setHdrVivid( VULKAN_HPP_NAMESPACE::Bool32 hdrVivid_ ) VULKAN_HPP_NOEXCEPT\n    {\n      hdrVivid = hdrVivid_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceHdrVividFeaturesHUAWEI const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceHdrVividFeaturesHUAWEI *>( this );\n    }\n\n    operator VkPhysicalDeviceHdrVividFeaturesHUAWEI &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceHdrVividFeaturesHUAWEI *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, hdrVivid );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceHdrVividFeaturesHUAWEI const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceHdrVividFeaturesHUAWEI const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( hdrVivid == rhs.hdrVivid );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceHdrVividFeaturesHUAWEI const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType    = StructureType::ePhysicalDeviceHdrVividFeaturesHUAWEI;\n    void *                              pNext    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        hdrVivid = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceHdrVividFeaturesHUAWEI>\n  {\n    using Type = PhysicalDeviceHdrVividFeaturesHUAWEI;\n  };\n\n  struct PhysicalDeviceHostImageCopyFeatures\n  {\n    using NativeType = VkPhysicalDeviceHostImageCopyFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceHostImageCopyFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceHostImageCopyFeatures( VULKAN_HPP_NAMESPACE::Bool32 hostImageCopy_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , hostImageCopy{ hostImageCopy_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceHostImageCopyFeatures( PhysicalDeviceHostImageCopyFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceHostImageCopyFeatures( VkPhysicalDeviceHostImageCopyFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceHostImageCopyFeatures( *reinterpret_cast<PhysicalDeviceHostImageCopyFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceHostImageCopyFeatures & operator=( PhysicalDeviceHostImageCopyFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceHostImageCopyFeatures & operator=( VkPhysicalDeviceHostImageCopyFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceHostImageCopyFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceHostImageCopyFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceHostImageCopyFeatures & setHostImageCopy( VULKAN_HPP_NAMESPACE::Bool32 hostImageCopy_ ) VULKAN_HPP_NOEXCEPT\n    {\n      hostImageCopy = hostImageCopy_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceHostImageCopyFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceHostImageCopyFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceHostImageCopyFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceHostImageCopyFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, hostImageCopy );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceHostImageCopyFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceHostImageCopyFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( hostImageCopy == rhs.hostImageCopy );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceHostImageCopyFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType         = StructureType::ePhysicalDeviceHostImageCopyFeatures;\n    void *                              pNext         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        hostImageCopy = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceHostImageCopyFeatures>\n  {\n    using Type = PhysicalDeviceHostImageCopyFeatures;\n  };\n\n  using PhysicalDeviceHostImageCopyFeaturesEXT = PhysicalDeviceHostImageCopyFeatures;\n\n  struct PhysicalDeviceHostImageCopyProperties\n  {\n    using NativeType = VkPhysicalDeviceHostImageCopyProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceHostImageCopyProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceHostImageCopyProperties( uint32_t                                  copySrcLayoutCount_              = {},\n                                                                   VULKAN_HPP_NAMESPACE::ImageLayout *       pCopySrcLayouts_                 = {},\n                                                                   uint32_t                                  copyDstLayoutCount_              = {},\n                                                                   VULKAN_HPP_NAMESPACE::ImageLayout *       pCopyDstLayouts_                 = {},\n                                                                   std::array<uint8_t, VK_UUID_SIZE> const & optimalTilingLayoutUUID_         = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32              identicalMemoryTypeRequirements_ = {},\n                                                                   void *                                    pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , copySrcLayoutCount{ copySrcLayoutCount_ }\n      , pCopySrcLayouts{ pCopySrcLayouts_ }\n      , copyDstLayoutCount{ copyDstLayoutCount_ }\n      , pCopyDstLayouts{ pCopyDstLayouts_ }\n      , optimalTilingLayoutUUID{ optimalTilingLayoutUUID_ }\n      , identicalMemoryTypeRequirements{ identicalMemoryTypeRequirements_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceHostImageCopyProperties( PhysicalDeviceHostImageCopyProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceHostImageCopyProperties( VkPhysicalDeviceHostImageCopyProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceHostImageCopyProperties( *reinterpret_cast<PhysicalDeviceHostImageCopyProperties const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PhysicalDeviceHostImageCopyProperties( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<VULKAN_HPP_NAMESPACE::ImageLayout> const & copySrcLayouts_,\n                                           VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<VULKAN_HPP_NAMESPACE::ImageLayout> const & copyDstLayouts_ = {},\n                                           std::array<uint8_t, VK_UUID_SIZE> const & optimalTilingLayoutUUID_                                       = {},\n                                           VULKAN_HPP_NAMESPACE::Bool32              identicalMemoryTypeRequirements_                               = {},\n                                           void *                                    pNext_                                                         = nullptr )\n      : pNext( pNext_ )\n      , copySrcLayoutCount( static_cast<uint32_t>( copySrcLayouts_.size() ) )\n      , pCopySrcLayouts( copySrcLayouts_.data() )\n      , copyDstLayoutCount( static_cast<uint32_t>( copyDstLayouts_.size() ) )\n      , pCopyDstLayouts( copyDstLayouts_.data() )\n      , optimalTilingLayoutUUID( optimalTilingLayoutUUID_ )\n      , identicalMemoryTypeRequirements( identicalMemoryTypeRequirements_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PhysicalDeviceHostImageCopyProperties & operator=( PhysicalDeviceHostImageCopyProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceHostImageCopyProperties & operator=( VkPhysicalDeviceHostImageCopyProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceHostImageCopyProperties const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceHostImageCopyProperties & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceHostImageCopyProperties & setCopySrcLayoutCount( uint32_t copySrcLayoutCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      copySrcLayoutCount = copySrcLayoutCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceHostImageCopyProperties &\n      setPCopySrcLayouts( VULKAN_HPP_NAMESPACE::ImageLayout * pCopySrcLayouts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pCopySrcLayouts = pCopySrcLayouts_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PhysicalDeviceHostImageCopyProperties &\n      setCopySrcLayouts( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<VULKAN_HPP_NAMESPACE::ImageLayout> const & copySrcLayouts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      copySrcLayoutCount = static_cast<uint32_t>( copySrcLayouts_.size() );\n      pCopySrcLayouts    = copySrcLayouts_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceHostImageCopyProperties & setCopyDstLayoutCount( uint32_t copyDstLayoutCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      copyDstLayoutCount = copyDstLayoutCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceHostImageCopyProperties &\n      setPCopyDstLayouts( VULKAN_HPP_NAMESPACE::ImageLayout * pCopyDstLayouts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pCopyDstLayouts = pCopyDstLayouts_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PhysicalDeviceHostImageCopyProperties &\n      setCopyDstLayouts( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<VULKAN_HPP_NAMESPACE::ImageLayout> const & copyDstLayouts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      copyDstLayoutCount = static_cast<uint32_t>( copyDstLayouts_.size() );\n      pCopyDstLayouts    = copyDstLayouts_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceHostImageCopyProperties &\n      setOptimalTilingLayoutUUID( std::array<uint8_t, VK_UUID_SIZE> optimalTilingLayoutUUID_ ) VULKAN_HPP_NOEXCEPT\n    {\n      optimalTilingLayoutUUID = optimalTilingLayoutUUID_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceHostImageCopyProperties &\n      setIdenticalMemoryTypeRequirements( VULKAN_HPP_NAMESPACE::Bool32 identicalMemoryTypeRequirements_ ) VULKAN_HPP_NOEXCEPT\n    {\n      identicalMemoryTypeRequirements = identicalMemoryTypeRequirements_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceHostImageCopyProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceHostImageCopyProperties *>( this );\n    }\n\n    operator VkPhysicalDeviceHostImageCopyProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceHostImageCopyProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout * const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout * const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie(\n        sType, pNext, copySrcLayoutCount, pCopySrcLayouts, copyDstLayoutCount, pCopyDstLayouts, optimalTilingLayoutUUID, identicalMemoryTypeRequirements );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceHostImageCopyProperties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceHostImageCopyProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( copySrcLayoutCount == rhs.copySrcLayoutCount ) &&\n             ( pCopySrcLayouts == rhs.pCopySrcLayouts ) && ( copyDstLayoutCount == rhs.copyDstLayoutCount ) && ( pCopyDstLayouts == rhs.pCopyDstLayouts ) &&\n             ( optimalTilingLayoutUUID == rhs.optimalTilingLayoutUUID ) && ( identicalMemoryTypeRequirements == rhs.identicalMemoryTypeRequirements );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceHostImageCopyProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                         sType                           = StructureType::ePhysicalDeviceHostImageCopyProperties;\n    void *                                                      pNext                           = {};\n    uint32_t                                                    copySrcLayoutCount              = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout *                         pCopySrcLayouts                 = {};\n    uint32_t                                                    copyDstLayoutCount              = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout *                         pCopyDstLayouts                 = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> optimalTilingLayoutUUID         = {};\n    VULKAN_HPP_NAMESPACE::Bool32                                identicalMemoryTypeRequirements = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceHostImageCopyProperties>\n  {\n    using Type = PhysicalDeviceHostImageCopyProperties;\n  };\n\n  using PhysicalDeviceHostImageCopyPropertiesEXT = PhysicalDeviceHostImageCopyProperties;\n\n  struct PhysicalDeviceHostQueryResetFeatures\n  {\n    using NativeType = VkPhysicalDeviceHostQueryResetFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceHostQueryResetFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceHostQueryResetFeatures( VULKAN_HPP_NAMESPACE::Bool32 hostQueryReset_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , hostQueryReset{ hostQueryReset_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceHostQueryResetFeatures( PhysicalDeviceHostQueryResetFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceHostQueryResetFeatures( VkPhysicalDeviceHostQueryResetFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceHostQueryResetFeatures( *reinterpret_cast<PhysicalDeviceHostQueryResetFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceHostQueryResetFeatures & operator=( PhysicalDeviceHostQueryResetFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceHostQueryResetFeatures & operator=( VkPhysicalDeviceHostQueryResetFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceHostQueryResetFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceHostQueryResetFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceHostQueryResetFeatures & setHostQueryReset( VULKAN_HPP_NAMESPACE::Bool32 hostQueryReset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      hostQueryReset = hostQueryReset_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceHostQueryResetFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceHostQueryResetFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceHostQueryResetFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceHostQueryResetFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, hostQueryReset );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceHostQueryResetFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceHostQueryResetFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( hostQueryReset == rhs.hostQueryReset );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceHostQueryResetFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::ePhysicalDeviceHostQueryResetFeatures;\n    void *                              pNext          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        hostQueryReset = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceHostQueryResetFeatures>\n  {\n    using Type = PhysicalDeviceHostQueryResetFeatures;\n  };\n\n  using PhysicalDeviceHostQueryResetFeaturesEXT = PhysicalDeviceHostQueryResetFeatures;\n\n  struct PhysicalDeviceIDProperties\n  {\n    using NativeType = VkPhysicalDeviceIDProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceIdProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceIDProperties( std::array<uint8_t, VK_UUID_SIZE> const & deviceUUID_      = {},\n                                                        std::array<uint8_t, VK_UUID_SIZE> const & driverUUID_      = {},\n                                                        std::array<uint8_t, VK_LUID_SIZE> const & deviceLUID_      = {},\n                                                        uint32_t                                  deviceNodeMask_  = {},\n                                                        VULKAN_HPP_NAMESPACE::Bool32              deviceLUIDValid_ = {},\n                                                        void *                                    pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , deviceUUID{ deviceUUID_ }\n      , driverUUID{ driverUUID_ }\n      , deviceLUID{ deviceLUID_ }\n      , deviceNodeMask{ deviceNodeMask_ }\n      , deviceLUIDValid{ deviceLUIDValid_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceIDProperties( PhysicalDeviceIDProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceIDProperties( VkPhysicalDeviceIDProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceIDProperties( *reinterpret_cast<PhysicalDeviceIDProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceIDProperties & operator=( PhysicalDeviceIDProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceIDProperties & operator=( VkPhysicalDeviceIDProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceIDProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceIDProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceIDProperties *>( this );\n    }\n\n    operator VkPhysicalDeviceIDProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceIDProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_LUID_SIZE> const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, deviceUUID, driverUUID, deviceLUID, deviceNodeMask, deviceLUIDValid );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceIDProperties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceIDProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( deviceUUID == rhs.deviceUUID ) && ( driverUUID == rhs.driverUUID ) &&\n             ( deviceLUID == rhs.deviceLUID ) && ( deviceNodeMask == rhs.deviceNodeMask ) && ( deviceLUIDValid == rhs.deviceLUIDValid );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceIDProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                         sType           = StructureType::ePhysicalDeviceIdProperties;\n    void *                                                      pNext           = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> deviceUUID      = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> driverUUID      = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_LUID_SIZE> deviceLUID      = {};\n    uint32_t                                                    deviceNodeMask  = {};\n    VULKAN_HPP_NAMESPACE::Bool32                                deviceLUIDValid = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceIdProperties>\n  {\n    using Type = PhysicalDeviceIDProperties;\n  };\n\n  using PhysicalDeviceIDPropertiesKHR = PhysicalDeviceIDProperties;\n\n  struct PhysicalDeviceImage2DViewOf3DFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceImage2DViewOf3DFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceImage2DViewOf3DFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImage2DViewOf3DFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 image2DViewOf3D_   = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 sampler2DViewOf3D_ = {},\n                                                                   void *                       pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , image2DViewOf3D{ image2DViewOf3D_ }\n      , sampler2DViewOf3D{ sampler2DViewOf3D_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImage2DViewOf3DFeaturesEXT( PhysicalDeviceImage2DViewOf3DFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceImage2DViewOf3DFeaturesEXT( VkPhysicalDeviceImage2DViewOf3DFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceImage2DViewOf3DFeaturesEXT( *reinterpret_cast<PhysicalDeviceImage2DViewOf3DFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceImage2DViewOf3DFeaturesEXT & operator=( PhysicalDeviceImage2DViewOf3DFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceImage2DViewOf3DFeaturesEXT & operator=( VkPhysicalDeviceImage2DViewOf3DFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceImage2DViewOf3DFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImage2DViewOf3DFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImage2DViewOf3DFeaturesEXT & setImage2DViewOf3D( VULKAN_HPP_NAMESPACE::Bool32 image2DViewOf3D_ ) VULKAN_HPP_NOEXCEPT\n    {\n      image2DViewOf3D = image2DViewOf3D_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImage2DViewOf3DFeaturesEXT &\n      setSampler2DViewOf3D( VULKAN_HPP_NAMESPACE::Bool32 sampler2DViewOf3D_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sampler2DViewOf3D = sampler2DViewOf3D_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceImage2DViewOf3DFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceImage2DViewOf3DFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceImage2DViewOf3DFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceImage2DViewOf3DFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, image2DViewOf3D, sampler2DViewOf3D );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceImage2DViewOf3DFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceImage2DViewOf3DFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( image2DViewOf3D == rhs.image2DViewOf3D ) && ( sampler2DViewOf3D == rhs.sampler2DViewOf3D );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceImage2DViewOf3DFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType             = StructureType::ePhysicalDeviceImage2DViewOf3DFeaturesEXT;\n    void *                              pNext             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        image2DViewOf3D   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        sampler2DViewOf3D = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceImage2DViewOf3DFeaturesEXT>\n  {\n    using Type = PhysicalDeviceImage2DViewOf3DFeaturesEXT;\n  };\n\n  struct PhysicalDeviceImageAlignmentControlFeaturesMESA\n  {\n    using NativeType = VkPhysicalDeviceImageAlignmentControlFeaturesMESA;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceImageAlignmentControlFeaturesMESA;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImageAlignmentControlFeaturesMESA( VULKAN_HPP_NAMESPACE::Bool32 imageAlignmentControl_ = {},\n                                                                          void *                       pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , imageAlignmentControl{ imageAlignmentControl_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceImageAlignmentControlFeaturesMESA( PhysicalDeviceImageAlignmentControlFeaturesMESA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceImageAlignmentControlFeaturesMESA( VkPhysicalDeviceImageAlignmentControlFeaturesMESA const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceImageAlignmentControlFeaturesMESA( *reinterpret_cast<PhysicalDeviceImageAlignmentControlFeaturesMESA const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceImageAlignmentControlFeaturesMESA & operator=( PhysicalDeviceImageAlignmentControlFeaturesMESA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceImageAlignmentControlFeaturesMESA & operator=( VkPhysicalDeviceImageAlignmentControlFeaturesMESA const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageAlignmentControlFeaturesMESA const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageAlignmentControlFeaturesMESA & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageAlignmentControlFeaturesMESA &\n      setImageAlignmentControl( VULKAN_HPP_NAMESPACE::Bool32 imageAlignmentControl_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageAlignmentControl = imageAlignmentControl_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceImageAlignmentControlFeaturesMESA const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceImageAlignmentControlFeaturesMESA *>( this );\n    }\n\n    operator VkPhysicalDeviceImageAlignmentControlFeaturesMESA &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceImageAlignmentControlFeaturesMESA *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, imageAlignmentControl );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceImageAlignmentControlFeaturesMESA const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceImageAlignmentControlFeaturesMESA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( imageAlignmentControl == rhs.imageAlignmentControl );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceImageAlignmentControlFeaturesMESA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                 = StructureType::ePhysicalDeviceImageAlignmentControlFeaturesMESA;\n    void *                              pNext                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        imageAlignmentControl = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceImageAlignmentControlFeaturesMESA>\n  {\n    using Type = PhysicalDeviceImageAlignmentControlFeaturesMESA;\n  };\n\n  struct PhysicalDeviceImageAlignmentControlPropertiesMESA\n  {\n    using NativeType = VkPhysicalDeviceImageAlignmentControlPropertiesMESA;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceImageAlignmentControlPropertiesMESA;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImageAlignmentControlPropertiesMESA( uint32_t supportedImageAlignmentMask_ = {},\n                                                                            void *   pNext_                       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , supportedImageAlignmentMask{ supportedImageAlignmentMask_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceImageAlignmentControlPropertiesMESA( PhysicalDeviceImageAlignmentControlPropertiesMESA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceImageAlignmentControlPropertiesMESA( VkPhysicalDeviceImageAlignmentControlPropertiesMESA const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceImageAlignmentControlPropertiesMESA( *reinterpret_cast<PhysicalDeviceImageAlignmentControlPropertiesMESA const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceImageAlignmentControlPropertiesMESA &\n      operator=( PhysicalDeviceImageAlignmentControlPropertiesMESA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceImageAlignmentControlPropertiesMESA & operator=( VkPhysicalDeviceImageAlignmentControlPropertiesMESA const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageAlignmentControlPropertiesMESA const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageAlignmentControlPropertiesMESA & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageAlignmentControlPropertiesMESA &\n      setSupportedImageAlignmentMask( uint32_t supportedImageAlignmentMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      supportedImageAlignmentMask = supportedImageAlignmentMask_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceImageAlignmentControlPropertiesMESA const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceImageAlignmentControlPropertiesMESA *>( this );\n    }\n\n    operator VkPhysicalDeviceImageAlignmentControlPropertiesMESA &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceImageAlignmentControlPropertiesMESA *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, supportedImageAlignmentMask );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceImageAlignmentControlPropertiesMESA const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceImageAlignmentControlPropertiesMESA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( supportedImageAlignmentMask == rhs.supportedImageAlignmentMask );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceImageAlignmentControlPropertiesMESA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                       = StructureType::ePhysicalDeviceImageAlignmentControlPropertiesMESA;\n    void *                              pNext                       = {};\n    uint32_t                            supportedImageAlignmentMask = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceImageAlignmentControlPropertiesMESA>\n  {\n    using Type = PhysicalDeviceImageAlignmentControlPropertiesMESA;\n  };\n\n  struct PhysicalDeviceImageCompressionControlFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceImageCompressionControlFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceImageCompressionControlFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImageCompressionControlFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 imageCompressionControl_ = {},\n                                                                           void *                       pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , imageCompressionControl{ imageCompressionControl_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceImageCompressionControlFeaturesEXT( PhysicalDeviceImageCompressionControlFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceImageCompressionControlFeaturesEXT( VkPhysicalDeviceImageCompressionControlFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceImageCompressionControlFeaturesEXT( *reinterpret_cast<PhysicalDeviceImageCompressionControlFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceImageCompressionControlFeaturesEXT & operator=( PhysicalDeviceImageCompressionControlFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceImageCompressionControlFeaturesEXT & operator=( VkPhysicalDeviceImageCompressionControlFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageCompressionControlFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageCompressionControlFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageCompressionControlFeaturesEXT &\n      setImageCompressionControl( VULKAN_HPP_NAMESPACE::Bool32 imageCompressionControl_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageCompressionControl = imageCompressionControl_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceImageCompressionControlFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceImageCompressionControlFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceImageCompressionControlFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceImageCompressionControlFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, imageCompressionControl );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceImageCompressionControlFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceImageCompressionControlFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( imageCompressionControl == rhs.imageCompressionControl );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceImageCompressionControlFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                   = StructureType::ePhysicalDeviceImageCompressionControlFeaturesEXT;\n    void *                              pNext                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        imageCompressionControl = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceImageCompressionControlFeaturesEXT>\n  {\n    using Type = PhysicalDeviceImageCompressionControlFeaturesEXT;\n  };\n\n  struct PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceImageCompressionControlSwapchainFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 imageCompressionControlSwapchain_ = {},\n                                                                                    void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , imageCompressionControlSwapchain{ imageCompressionControlSwapchain_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT( PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT const & rhs )\n      VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT( VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT(\n          *reinterpret_cast<PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT &\n      operator=( PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT &\n      operator=( VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT &\n      setImageCompressionControlSwapchain( VULKAN_HPP_NAMESPACE::Bool32 imageCompressionControlSwapchain_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageCompressionControlSwapchain = imageCompressionControlSwapchain_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, imageCompressionControlSwapchain );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( imageCompressionControlSwapchain == rhs.imageCompressionControlSwapchain );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                            = StructureType::ePhysicalDeviceImageCompressionControlSwapchainFeaturesEXT;\n    void *                              pNext                            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        imageCompressionControlSwapchain = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceImageCompressionControlSwapchainFeaturesEXT>\n  {\n    using Type = PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT;\n  };\n\n  struct PhysicalDeviceImageDrmFormatModifierInfoEXT\n  {\n    using NativeType = VkPhysicalDeviceImageDrmFormatModifierInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceImageDrmFormatModifierInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceImageDrmFormatModifierInfoEXT( uint64_t                          drmFormatModifier_     = {},\n                                                   VULKAN_HPP_NAMESPACE::SharingMode sharingMode_           = VULKAN_HPP_NAMESPACE::SharingMode::eExclusive,\n                                                   uint32_t                          queueFamilyIndexCount_ = {},\n                                                   const uint32_t *                  pQueueFamilyIndices_   = {},\n                                                   const void *                      pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , drmFormatModifier{ drmFormatModifier_ }\n      , sharingMode{ sharingMode_ }\n      , queueFamilyIndexCount{ queueFamilyIndexCount_ }\n      , pQueueFamilyIndices{ pQueueFamilyIndices_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImageDrmFormatModifierInfoEXT( PhysicalDeviceImageDrmFormatModifierInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceImageDrmFormatModifierInfoEXT( VkPhysicalDeviceImageDrmFormatModifierInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceImageDrmFormatModifierInfoEXT( *reinterpret_cast<PhysicalDeviceImageDrmFormatModifierInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PhysicalDeviceImageDrmFormatModifierInfoEXT( uint64_t                                                              drmFormatModifier_,\n                                                 VULKAN_HPP_NAMESPACE::SharingMode                                     sharingMode_,\n                                                 VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & queueFamilyIndices_,\n                                                 const void *                                                          pNext_ = nullptr )\n      : pNext( pNext_ )\n      , drmFormatModifier( drmFormatModifier_ )\n      , sharingMode( sharingMode_ )\n      , queueFamilyIndexCount( static_cast<uint32_t>( queueFamilyIndices_.size() ) )\n      , pQueueFamilyIndices( queueFamilyIndices_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PhysicalDeviceImageDrmFormatModifierInfoEXT & operator=( PhysicalDeviceImageDrmFormatModifierInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceImageDrmFormatModifierInfoEXT & operator=( VkPhysicalDeviceImageDrmFormatModifierInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageDrmFormatModifierInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageDrmFormatModifierInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageDrmFormatModifierInfoEXT & setDrmFormatModifier( uint64_t drmFormatModifier_ ) VULKAN_HPP_NOEXCEPT\n    {\n      drmFormatModifier = drmFormatModifier_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageDrmFormatModifierInfoEXT & setSharingMode( VULKAN_HPP_NAMESPACE::SharingMode sharingMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sharingMode = sharingMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageDrmFormatModifierInfoEXT & setQueueFamilyIndexCount( uint32_t queueFamilyIndexCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queueFamilyIndexCount = queueFamilyIndexCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageDrmFormatModifierInfoEXT & setPQueueFamilyIndices( const uint32_t * pQueueFamilyIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pQueueFamilyIndices = pQueueFamilyIndices_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PhysicalDeviceImageDrmFormatModifierInfoEXT &\n      setQueueFamilyIndices( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & queueFamilyIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queueFamilyIndexCount = static_cast<uint32_t>( queueFamilyIndices_.size() );\n      pQueueFamilyIndices   = queueFamilyIndices_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceImageDrmFormatModifierInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceImageDrmFormatModifierInfoEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceImageDrmFormatModifierInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceImageDrmFormatModifierInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint64_t const &,\n               VULKAN_HPP_NAMESPACE::SharingMode const &,\n               uint32_t const &,\n               const uint32_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, drmFormatModifier, sharingMode, queueFamilyIndexCount, pQueueFamilyIndices );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceImageDrmFormatModifierInfoEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceImageDrmFormatModifierInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( drmFormatModifier == rhs.drmFormatModifier ) && ( sharingMode == rhs.sharingMode ) &&\n             ( queueFamilyIndexCount == rhs.queueFamilyIndexCount ) && ( pQueueFamilyIndices == rhs.pQueueFamilyIndices );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceImageDrmFormatModifierInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                 = StructureType::ePhysicalDeviceImageDrmFormatModifierInfoEXT;\n    const void *                        pNext                 = {};\n    uint64_t                            drmFormatModifier     = {};\n    VULKAN_HPP_NAMESPACE::SharingMode   sharingMode           = VULKAN_HPP_NAMESPACE::SharingMode::eExclusive;\n    uint32_t                            queueFamilyIndexCount = {};\n    const uint32_t *                    pQueueFamilyIndices   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceImageDrmFormatModifierInfoEXT>\n  {\n    using Type = PhysicalDeviceImageDrmFormatModifierInfoEXT;\n  };\n\n  struct PhysicalDeviceImageFormatInfo2\n  {\n    using NativeType = VkPhysicalDeviceImageFormatInfo2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceImageFormatInfo2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImageFormatInfo2( VULKAN_HPP_NAMESPACE::Format           format_ = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                                         VULKAN_HPP_NAMESPACE::ImageType        type_   = VULKAN_HPP_NAMESPACE::ImageType::e1D,\n                                                         VULKAN_HPP_NAMESPACE::ImageTiling      tiling_ = VULKAN_HPP_NAMESPACE::ImageTiling::eOptimal,\n                                                         VULKAN_HPP_NAMESPACE::ImageUsageFlags  usage_  = {},\n                                                         VULKAN_HPP_NAMESPACE::ImageCreateFlags flags_  = {},\n                                                         const void *                           pNext_  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , format{ format_ }\n      , type{ type_ }\n      , tiling{ tiling_ }\n      , usage{ usage_ }\n      , flags{ flags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImageFormatInfo2( PhysicalDeviceImageFormatInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceImageFormatInfo2( VkPhysicalDeviceImageFormatInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceImageFormatInfo2( *reinterpret_cast<PhysicalDeviceImageFormatInfo2 const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceImageFormatInfo2 & operator=( PhysicalDeviceImageFormatInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceImageFormatInfo2 & operator=( VkPhysicalDeviceImageFormatInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageFormatInfo2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageFormatInfo2 & setFormat( VULKAN_HPP_NAMESPACE::Format format_ ) VULKAN_HPP_NOEXCEPT\n    {\n      format = format_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageFormatInfo2 & setType( VULKAN_HPP_NAMESPACE::ImageType type_ ) VULKAN_HPP_NOEXCEPT\n    {\n      type = type_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageFormatInfo2 & setTiling( VULKAN_HPP_NAMESPACE::ImageTiling tiling_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tiling = tiling_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageFormatInfo2 & setUsage( VULKAN_HPP_NAMESPACE::ImageUsageFlags usage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      usage = usage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageFormatInfo2 & setFlags( VULKAN_HPP_NAMESPACE::ImageCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceImageFormatInfo2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceImageFormatInfo2 *>( this );\n    }\n\n    operator VkPhysicalDeviceImageFormatInfo2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceImageFormatInfo2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::ImageType const &,\n               VULKAN_HPP_NAMESPACE::ImageTiling const &,\n               VULKAN_HPP_NAMESPACE::ImageUsageFlags const &,\n               VULKAN_HPP_NAMESPACE::ImageCreateFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, format, type, tiling, usage, flags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceImageFormatInfo2 const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceImageFormatInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( format == rhs.format ) && ( type == rhs.type ) && ( tiling == rhs.tiling ) &&\n             ( usage == rhs.usage ) && ( flags == rhs.flags );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceImageFormatInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType  = StructureType::ePhysicalDeviceImageFormatInfo2;\n    const void *                           pNext  = {};\n    VULKAN_HPP_NAMESPACE::Format           format = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::ImageType        type   = VULKAN_HPP_NAMESPACE::ImageType::e1D;\n    VULKAN_HPP_NAMESPACE::ImageTiling      tiling = VULKAN_HPP_NAMESPACE::ImageTiling::eOptimal;\n    VULKAN_HPP_NAMESPACE::ImageUsageFlags  usage  = {};\n    VULKAN_HPP_NAMESPACE::ImageCreateFlags flags  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceImageFormatInfo2>\n  {\n    using Type = PhysicalDeviceImageFormatInfo2;\n  };\n\n  using PhysicalDeviceImageFormatInfo2KHR = PhysicalDeviceImageFormatInfo2;\n\n  struct PhysicalDeviceImageProcessing2FeaturesQCOM\n  {\n    using NativeType = VkPhysicalDeviceImageProcessing2FeaturesQCOM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceImageProcessing2FeaturesQCOM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImageProcessing2FeaturesQCOM( VULKAN_HPP_NAMESPACE::Bool32 textureBlockMatch2_ = {},\n                                                                     void *                       pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , textureBlockMatch2{ textureBlockMatch2_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImageProcessing2FeaturesQCOM( PhysicalDeviceImageProcessing2FeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceImageProcessing2FeaturesQCOM( VkPhysicalDeviceImageProcessing2FeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceImageProcessing2FeaturesQCOM( *reinterpret_cast<PhysicalDeviceImageProcessing2FeaturesQCOM const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceImageProcessing2FeaturesQCOM & operator=( PhysicalDeviceImageProcessing2FeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceImageProcessing2FeaturesQCOM & operator=( VkPhysicalDeviceImageProcessing2FeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessing2FeaturesQCOM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageProcessing2FeaturesQCOM & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageProcessing2FeaturesQCOM &\n      setTextureBlockMatch2( VULKAN_HPP_NAMESPACE::Bool32 textureBlockMatch2_ ) VULKAN_HPP_NOEXCEPT\n    {\n      textureBlockMatch2 = textureBlockMatch2_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceImageProcessing2FeaturesQCOM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceImageProcessing2FeaturesQCOM *>( this );\n    }\n\n    operator VkPhysicalDeviceImageProcessing2FeaturesQCOM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceImageProcessing2FeaturesQCOM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, textureBlockMatch2 );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceImageProcessing2FeaturesQCOM const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceImageProcessing2FeaturesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( textureBlockMatch2 == rhs.textureBlockMatch2 );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceImageProcessing2FeaturesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType              = StructureType::ePhysicalDeviceImageProcessing2FeaturesQCOM;\n    void *                              pNext              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        textureBlockMatch2 = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceImageProcessing2FeaturesQCOM>\n  {\n    using Type = PhysicalDeviceImageProcessing2FeaturesQCOM;\n  };\n\n  struct PhysicalDeviceImageProcessing2PropertiesQCOM\n  {\n    using NativeType = VkPhysicalDeviceImageProcessing2PropertiesQCOM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceImageProcessing2PropertiesQCOM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImageProcessing2PropertiesQCOM( VULKAN_HPP_NAMESPACE::Extent2D maxBlockMatchWindow_ = {},\n                                                                       void *                         pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxBlockMatchWindow{ maxBlockMatchWindow_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImageProcessing2PropertiesQCOM( PhysicalDeviceImageProcessing2PropertiesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceImageProcessing2PropertiesQCOM( VkPhysicalDeviceImageProcessing2PropertiesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceImageProcessing2PropertiesQCOM( *reinterpret_cast<PhysicalDeviceImageProcessing2PropertiesQCOM const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceImageProcessing2PropertiesQCOM & operator=( PhysicalDeviceImageProcessing2PropertiesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceImageProcessing2PropertiesQCOM & operator=( VkPhysicalDeviceImageProcessing2PropertiesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessing2PropertiesQCOM const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceImageProcessing2PropertiesQCOM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceImageProcessing2PropertiesQCOM *>( this );\n    }\n\n    operator VkPhysicalDeviceImageProcessing2PropertiesQCOM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceImageProcessing2PropertiesQCOM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Extent2D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxBlockMatchWindow );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceImageProcessing2PropertiesQCOM const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceImageProcessing2PropertiesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxBlockMatchWindow == rhs.maxBlockMatchWindow );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceImageProcessing2PropertiesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType               = StructureType::ePhysicalDeviceImageProcessing2PropertiesQCOM;\n    void *                              pNext               = {};\n    VULKAN_HPP_NAMESPACE::Extent2D      maxBlockMatchWindow = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceImageProcessing2PropertiesQCOM>\n  {\n    using Type = PhysicalDeviceImageProcessing2PropertiesQCOM;\n  };\n\n  struct PhysicalDeviceImageProcessingFeaturesQCOM\n  {\n    using NativeType = VkPhysicalDeviceImageProcessingFeaturesQCOM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceImageProcessingFeaturesQCOM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImageProcessingFeaturesQCOM( VULKAN_HPP_NAMESPACE::Bool32 textureSampleWeighted_ = {},\n                                                                    VULKAN_HPP_NAMESPACE::Bool32 textureBoxFilter_      = {},\n                                                                    VULKAN_HPP_NAMESPACE::Bool32 textureBlockMatch_     = {},\n                                                                    void *                       pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , textureSampleWeighted{ textureSampleWeighted_ }\n      , textureBoxFilter{ textureBoxFilter_ }\n      , textureBlockMatch{ textureBlockMatch_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImageProcessingFeaturesQCOM( PhysicalDeviceImageProcessingFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceImageProcessingFeaturesQCOM( VkPhysicalDeviceImageProcessingFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceImageProcessingFeaturesQCOM( *reinterpret_cast<PhysicalDeviceImageProcessingFeaturesQCOM const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceImageProcessingFeaturesQCOM & operator=( PhysicalDeviceImageProcessingFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceImageProcessingFeaturesQCOM & operator=( VkPhysicalDeviceImageProcessingFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessingFeaturesQCOM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageProcessingFeaturesQCOM & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageProcessingFeaturesQCOM &\n      setTextureSampleWeighted( VULKAN_HPP_NAMESPACE::Bool32 textureSampleWeighted_ ) VULKAN_HPP_NOEXCEPT\n    {\n      textureSampleWeighted = textureSampleWeighted_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageProcessingFeaturesQCOM &\n      setTextureBoxFilter( VULKAN_HPP_NAMESPACE::Bool32 textureBoxFilter_ ) VULKAN_HPP_NOEXCEPT\n    {\n      textureBoxFilter = textureBoxFilter_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageProcessingFeaturesQCOM &\n      setTextureBlockMatch( VULKAN_HPP_NAMESPACE::Bool32 textureBlockMatch_ ) VULKAN_HPP_NOEXCEPT\n    {\n      textureBlockMatch = textureBlockMatch_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceImageProcessingFeaturesQCOM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceImageProcessingFeaturesQCOM *>( this );\n    }\n\n    operator VkPhysicalDeviceImageProcessingFeaturesQCOM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceImageProcessingFeaturesQCOM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, textureSampleWeighted, textureBoxFilter, textureBlockMatch );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceImageProcessingFeaturesQCOM const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceImageProcessingFeaturesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( textureSampleWeighted == rhs.textureSampleWeighted ) &&\n             ( textureBoxFilter == rhs.textureBoxFilter ) && ( textureBlockMatch == rhs.textureBlockMatch );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceImageProcessingFeaturesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                 = StructureType::ePhysicalDeviceImageProcessingFeaturesQCOM;\n    void *                              pNext                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        textureSampleWeighted = {};\n    VULKAN_HPP_NAMESPACE::Bool32        textureBoxFilter      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        textureBlockMatch     = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceImageProcessingFeaturesQCOM>\n  {\n    using Type = PhysicalDeviceImageProcessingFeaturesQCOM;\n  };\n\n  struct PhysicalDeviceImageProcessingPropertiesQCOM\n  {\n    using NativeType = VkPhysicalDeviceImageProcessingPropertiesQCOM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceImageProcessingPropertiesQCOM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImageProcessingPropertiesQCOM( uint32_t                       maxWeightFilterPhases_    = {},\n                                                                      VULKAN_HPP_NAMESPACE::Extent2D maxWeightFilterDimension_ = {},\n                                                                      VULKAN_HPP_NAMESPACE::Extent2D maxBlockMatchRegion_      = {},\n                                                                      VULKAN_HPP_NAMESPACE::Extent2D maxBoxFilterBlockSize_    = {},\n                                                                      void *                         pNext_                    = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxWeightFilterPhases{ maxWeightFilterPhases_ }\n      , maxWeightFilterDimension{ maxWeightFilterDimension_ }\n      , maxBlockMatchRegion{ maxBlockMatchRegion_ }\n      , maxBoxFilterBlockSize{ maxBoxFilterBlockSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImageProcessingPropertiesQCOM( PhysicalDeviceImageProcessingPropertiesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceImageProcessingPropertiesQCOM( VkPhysicalDeviceImageProcessingPropertiesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceImageProcessingPropertiesQCOM( *reinterpret_cast<PhysicalDeviceImageProcessingPropertiesQCOM const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceImageProcessingPropertiesQCOM & operator=( PhysicalDeviceImageProcessingPropertiesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceImageProcessingPropertiesQCOM & operator=( VkPhysicalDeviceImageProcessingPropertiesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageProcessingPropertiesQCOM const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceImageProcessingPropertiesQCOM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceImageProcessingPropertiesQCOM *>( this );\n    }\n\n    operator VkPhysicalDeviceImageProcessingPropertiesQCOM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceImageProcessingPropertiesQCOM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxWeightFilterPhases, maxWeightFilterDimension, maxBlockMatchRegion, maxBoxFilterBlockSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceImageProcessingPropertiesQCOM const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceImageProcessingPropertiesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxWeightFilterPhases == rhs.maxWeightFilterPhases ) &&\n             ( maxWeightFilterDimension == rhs.maxWeightFilterDimension ) && ( maxBlockMatchRegion == rhs.maxBlockMatchRegion ) &&\n             ( maxBoxFilterBlockSize == rhs.maxBoxFilterBlockSize );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceImageProcessingPropertiesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                    = StructureType::ePhysicalDeviceImageProcessingPropertiesQCOM;\n    void *                              pNext                    = {};\n    uint32_t                            maxWeightFilterPhases    = {};\n    VULKAN_HPP_NAMESPACE::Extent2D      maxWeightFilterDimension = {};\n    VULKAN_HPP_NAMESPACE::Extent2D      maxBlockMatchRegion      = {};\n    VULKAN_HPP_NAMESPACE::Extent2D      maxBoxFilterBlockSize    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceImageProcessingPropertiesQCOM>\n  {\n    using Type = PhysicalDeviceImageProcessingPropertiesQCOM;\n  };\n\n  struct PhysicalDeviceImageRobustnessFeatures\n  {\n    using NativeType = VkPhysicalDeviceImageRobustnessFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceImageRobustnessFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImageRobustnessFeatures( VULKAN_HPP_NAMESPACE::Bool32 robustImageAccess_ = {},\n                                                                void *                       pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , robustImageAccess{ robustImageAccess_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImageRobustnessFeatures( PhysicalDeviceImageRobustnessFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceImageRobustnessFeatures( VkPhysicalDeviceImageRobustnessFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceImageRobustnessFeatures( *reinterpret_cast<PhysicalDeviceImageRobustnessFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceImageRobustnessFeatures & operator=( PhysicalDeviceImageRobustnessFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceImageRobustnessFeatures & operator=( VkPhysicalDeviceImageRobustnessFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageRobustnessFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageRobustnessFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageRobustnessFeatures & setRobustImageAccess( VULKAN_HPP_NAMESPACE::Bool32 robustImageAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      robustImageAccess = robustImageAccess_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceImageRobustnessFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceImageRobustnessFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceImageRobustnessFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceImageRobustnessFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, robustImageAccess );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceImageRobustnessFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceImageRobustnessFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( robustImageAccess == rhs.robustImageAccess );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceImageRobustnessFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType             = StructureType::ePhysicalDeviceImageRobustnessFeatures;\n    void *                              pNext             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        robustImageAccess = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceImageRobustnessFeatures>\n  {\n    using Type = PhysicalDeviceImageRobustnessFeatures;\n  };\n\n  using PhysicalDeviceImageRobustnessFeaturesEXT = PhysicalDeviceImageRobustnessFeatures;\n\n  struct PhysicalDeviceImageSlicedViewOf3DFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceImageSlicedViewOf3DFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImageSlicedViewOf3DFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 imageSlicedViewOf3D_ = {},\n                                                                       void *                       pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , imageSlicedViewOf3D{ imageSlicedViewOf3D_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImageSlicedViewOf3DFeaturesEXT( PhysicalDeviceImageSlicedViewOf3DFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceImageSlicedViewOf3DFeaturesEXT( VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceImageSlicedViewOf3DFeaturesEXT( *reinterpret_cast<PhysicalDeviceImageSlicedViewOf3DFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceImageSlicedViewOf3DFeaturesEXT & operator=( PhysicalDeviceImageSlicedViewOf3DFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceImageSlicedViewOf3DFeaturesEXT & operator=( VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageSlicedViewOf3DFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageSlicedViewOf3DFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageSlicedViewOf3DFeaturesEXT &\n      setImageSlicedViewOf3D( VULKAN_HPP_NAMESPACE::Bool32 imageSlicedViewOf3D_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageSlicedViewOf3D = imageSlicedViewOf3D_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceImageSlicedViewOf3DFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, imageSlicedViewOf3D );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceImageSlicedViewOf3DFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceImageSlicedViewOf3DFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( imageSlicedViewOf3D == rhs.imageSlicedViewOf3D );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceImageSlicedViewOf3DFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType               = StructureType::ePhysicalDeviceImageSlicedViewOf3DFeaturesEXT;\n    void *                              pNext               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        imageSlicedViewOf3D = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceImageSlicedViewOf3DFeaturesEXT>\n  {\n    using Type = PhysicalDeviceImageSlicedViewOf3DFeaturesEXT;\n  };\n\n  struct PhysicalDeviceImageViewImageFormatInfoEXT\n  {\n    using NativeType = VkPhysicalDeviceImageViewImageFormatInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceImageViewImageFormatInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceImageViewImageFormatInfoEXT( VULKAN_HPP_NAMESPACE::ImageViewType imageViewType_ = VULKAN_HPP_NAMESPACE::ImageViewType::e1D,\n                                                 void *                              pNext_         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , imageViewType{ imageViewType_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImageViewImageFormatInfoEXT( PhysicalDeviceImageViewImageFormatInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceImageViewImageFormatInfoEXT( VkPhysicalDeviceImageViewImageFormatInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceImageViewImageFormatInfoEXT( *reinterpret_cast<PhysicalDeviceImageViewImageFormatInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceImageViewImageFormatInfoEXT & operator=( PhysicalDeviceImageViewImageFormatInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceImageViewImageFormatInfoEXT & operator=( VkPhysicalDeviceImageViewImageFormatInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageViewImageFormatInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageViewImageFormatInfoEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageViewImageFormatInfoEXT &\n      setImageViewType( VULKAN_HPP_NAMESPACE::ImageViewType imageViewType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageViewType = imageViewType_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceImageViewImageFormatInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceImageViewImageFormatInfoEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceImageViewImageFormatInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceImageViewImageFormatInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::ImageViewType const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, imageViewType );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceImageViewImageFormatInfoEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceImageViewImageFormatInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( imageViewType == rhs.imageViewType );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceImageViewImageFormatInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType         = StructureType::ePhysicalDeviceImageViewImageFormatInfoEXT;\n    void *                              pNext         = {};\n    VULKAN_HPP_NAMESPACE::ImageViewType imageViewType = VULKAN_HPP_NAMESPACE::ImageViewType::e1D;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceImageViewImageFormatInfoEXT>\n  {\n    using Type = PhysicalDeviceImageViewImageFormatInfoEXT;\n  };\n\n  struct PhysicalDeviceImageViewMinLodFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceImageViewMinLodFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceImageViewMinLodFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImageViewMinLodFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 minLod_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , minLod{ minLod_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImageViewMinLodFeaturesEXT( PhysicalDeviceImageViewMinLodFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceImageViewMinLodFeaturesEXT( VkPhysicalDeviceImageViewMinLodFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceImageViewMinLodFeaturesEXT( *reinterpret_cast<PhysicalDeviceImageViewMinLodFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceImageViewMinLodFeaturesEXT & operator=( PhysicalDeviceImageViewMinLodFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceImageViewMinLodFeaturesEXT & operator=( VkPhysicalDeviceImageViewMinLodFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageViewMinLodFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageViewMinLodFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImageViewMinLodFeaturesEXT & setMinLod( VULKAN_HPP_NAMESPACE::Bool32 minLod_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minLod = minLod_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceImageViewMinLodFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceImageViewMinLodFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceImageViewMinLodFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceImageViewMinLodFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, minLod );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceImageViewMinLodFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceImageViewMinLodFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( minLod == rhs.minLod );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceImageViewMinLodFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType  = StructureType::ePhysicalDeviceImageViewMinLodFeaturesEXT;\n    void *                              pNext  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        minLod = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceImageViewMinLodFeaturesEXT>\n  {\n    using Type = PhysicalDeviceImageViewMinLodFeaturesEXT;\n  };\n\n  struct PhysicalDeviceImagelessFramebufferFeatures\n  {\n    using NativeType = VkPhysicalDeviceImagelessFramebufferFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceImagelessFramebufferFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImagelessFramebufferFeatures( VULKAN_HPP_NAMESPACE::Bool32 imagelessFramebuffer_ = {},\n                                                                     void *                       pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , imagelessFramebuffer{ imagelessFramebuffer_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceImagelessFramebufferFeatures( PhysicalDeviceImagelessFramebufferFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceImagelessFramebufferFeatures( VkPhysicalDeviceImagelessFramebufferFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceImagelessFramebufferFeatures( *reinterpret_cast<PhysicalDeviceImagelessFramebufferFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceImagelessFramebufferFeatures & operator=( PhysicalDeviceImagelessFramebufferFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceImagelessFramebufferFeatures & operator=( VkPhysicalDeviceImagelessFramebufferFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceImagelessFramebufferFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImagelessFramebufferFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceImagelessFramebufferFeatures &\n      setImagelessFramebuffer( VULKAN_HPP_NAMESPACE::Bool32 imagelessFramebuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imagelessFramebuffer = imagelessFramebuffer_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceImagelessFramebufferFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceImagelessFramebufferFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceImagelessFramebufferFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceImagelessFramebufferFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, imagelessFramebuffer );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceImagelessFramebufferFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceImagelessFramebufferFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( imagelessFramebuffer == rhs.imagelessFramebuffer );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceImagelessFramebufferFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                = StructureType::ePhysicalDeviceImagelessFramebufferFeatures;\n    void *                              pNext                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        imagelessFramebuffer = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceImagelessFramebufferFeatures>\n  {\n    using Type = PhysicalDeviceImagelessFramebufferFeatures;\n  };\n\n  using PhysicalDeviceImagelessFramebufferFeaturesKHR = PhysicalDeviceImagelessFramebufferFeatures;\n\n  struct PhysicalDeviceIndexTypeUint8Features\n  {\n    using NativeType = VkPhysicalDeviceIndexTypeUint8Features;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceIndexTypeUint8Features;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceIndexTypeUint8Features( VULKAN_HPP_NAMESPACE::Bool32 indexTypeUint8_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , indexTypeUint8{ indexTypeUint8_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceIndexTypeUint8Features( PhysicalDeviceIndexTypeUint8Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceIndexTypeUint8Features( VkPhysicalDeviceIndexTypeUint8Features const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceIndexTypeUint8Features( *reinterpret_cast<PhysicalDeviceIndexTypeUint8Features const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceIndexTypeUint8Features & operator=( PhysicalDeviceIndexTypeUint8Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceIndexTypeUint8Features & operator=( VkPhysicalDeviceIndexTypeUint8Features const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceIndexTypeUint8Features const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceIndexTypeUint8Features & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceIndexTypeUint8Features & setIndexTypeUint8( VULKAN_HPP_NAMESPACE::Bool32 indexTypeUint8_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexTypeUint8 = indexTypeUint8_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceIndexTypeUint8Features const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceIndexTypeUint8Features *>( this );\n    }\n\n    operator VkPhysicalDeviceIndexTypeUint8Features &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceIndexTypeUint8Features *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, indexTypeUint8 );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceIndexTypeUint8Features const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceIndexTypeUint8Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( indexTypeUint8 == rhs.indexTypeUint8 );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceIndexTypeUint8Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::ePhysicalDeviceIndexTypeUint8Features;\n    void *                              pNext          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        indexTypeUint8 = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceIndexTypeUint8Features>\n  {\n    using Type = PhysicalDeviceIndexTypeUint8Features;\n  };\n\n  using PhysicalDeviceIndexTypeUint8FeaturesEXT = PhysicalDeviceIndexTypeUint8Features;\n  using PhysicalDeviceIndexTypeUint8FeaturesKHR = PhysicalDeviceIndexTypeUint8Features;\n\n  struct PhysicalDeviceInheritedViewportScissorFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceInheritedViewportScissorFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceInheritedViewportScissorFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceInheritedViewportScissorFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 inheritedViewportScissor2D_ = {},\n                                                                           void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , inheritedViewportScissor2D{ inheritedViewportScissor2D_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceInheritedViewportScissorFeaturesNV( PhysicalDeviceInheritedViewportScissorFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceInheritedViewportScissorFeaturesNV( VkPhysicalDeviceInheritedViewportScissorFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceInheritedViewportScissorFeaturesNV( *reinterpret_cast<PhysicalDeviceInheritedViewportScissorFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceInheritedViewportScissorFeaturesNV & operator=( PhysicalDeviceInheritedViewportScissorFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceInheritedViewportScissorFeaturesNV & operator=( VkPhysicalDeviceInheritedViewportScissorFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceInheritedViewportScissorFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceInheritedViewportScissorFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceInheritedViewportScissorFeaturesNV &\n      setInheritedViewportScissor2D( VULKAN_HPP_NAMESPACE::Bool32 inheritedViewportScissor2D_ ) VULKAN_HPP_NOEXCEPT\n    {\n      inheritedViewportScissor2D = inheritedViewportScissor2D_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceInheritedViewportScissorFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceInheritedViewportScissorFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceInheritedViewportScissorFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceInheritedViewportScissorFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, inheritedViewportScissor2D );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceInheritedViewportScissorFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceInheritedViewportScissorFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( inheritedViewportScissor2D == rhs.inheritedViewportScissor2D );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceInheritedViewportScissorFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                      = StructureType::ePhysicalDeviceInheritedViewportScissorFeaturesNV;\n    void *                              pNext                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        inheritedViewportScissor2D = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceInheritedViewportScissorFeaturesNV>\n  {\n    using Type = PhysicalDeviceInheritedViewportScissorFeaturesNV;\n  };\n\n  struct PhysicalDeviceInlineUniformBlockFeatures\n  {\n    using NativeType = VkPhysicalDeviceInlineUniformBlockFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceInlineUniformBlockFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceInlineUniformBlockFeatures( VULKAN_HPP_NAMESPACE::Bool32 inlineUniformBlock_                                 = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingInlineUniformBlockUpdateAfterBind_ = {},\n                                                                   void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , inlineUniformBlock{ inlineUniformBlock_ }\n      , descriptorBindingInlineUniformBlockUpdateAfterBind{ descriptorBindingInlineUniformBlockUpdateAfterBind_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceInlineUniformBlockFeatures( PhysicalDeviceInlineUniformBlockFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceInlineUniformBlockFeatures( VkPhysicalDeviceInlineUniformBlockFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceInlineUniformBlockFeatures( *reinterpret_cast<PhysicalDeviceInlineUniformBlockFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceInlineUniformBlockFeatures & operator=( PhysicalDeviceInlineUniformBlockFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceInlineUniformBlockFeatures & operator=( VkPhysicalDeviceInlineUniformBlockFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceInlineUniformBlockFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceInlineUniformBlockFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceInlineUniformBlockFeatures &\n      setInlineUniformBlock( VULKAN_HPP_NAMESPACE::Bool32 inlineUniformBlock_ ) VULKAN_HPP_NOEXCEPT\n    {\n      inlineUniformBlock = inlineUniformBlock_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceInlineUniformBlockFeatures & setDescriptorBindingInlineUniformBlockUpdateAfterBind(\n      VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingInlineUniformBlockUpdateAfterBind_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBindingInlineUniformBlockUpdateAfterBind = descriptorBindingInlineUniformBlockUpdateAfterBind_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceInlineUniformBlockFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceInlineUniformBlockFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceInlineUniformBlockFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, inlineUniformBlock, descriptorBindingInlineUniformBlockUpdateAfterBind );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceInlineUniformBlockFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceInlineUniformBlockFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( inlineUniformBlock == rhs.inlineUniformBlock ) &&\n             ( descriptorBindingInlineUniformBlockUpdateAfterBind == rhs.descriptorBindingInlineUniformBlockUpdateAfterBind );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceInlineUniformBlockFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                              = StructureType::ePhysicalDeviceInlineUniformBlockFeatures;\n    void *                              pNext                                              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        inlineUniformBlock                                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBindingInlineUniformBlockUpdateAfterBind = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceInlineUniformBlockFeatures>\n  {\n    using Type = PhysicalDeviceInlineUniformBlockFeatures;\n  };\n\n  using PhysicalDeviceInlineUniformBlockFeaturesEXT = PhysicalDeviceInlineUniformBlockFeatures;\n\n  struct PhysicalDeviceInlineUniformBlockProperties\n  {\n    using NativeType = VkPhysicalDeviceInlineUniformBlockProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceInlineUniformBlockProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceInlineUniformBlockProperties( uint32_t maxInlineUniformBlockSize_                               = {},\n                                                                     uint32_t maxPerStageDescriptorInlineUniformBlocks_                = {},\n                                                                     uint32_t maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks_ = {},\n                                                                     uint32_t maxDescriptorSetInlineUniformBlocks_                     = {},\n                                                                     uint32_t maxDescriptorSetUpdateAfterBindInlineUniformBlocks_      = {},\n                                                                     void *   pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxInlineUniformBlockSize{ maxInlineUniformBlockSize_ }\n      , maxPerStageDescriptorInlineUniformBlocks{ maxPerStageDescriptorInlineUniformBlocks_ }\n      , maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks{ maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks_ }\n      , maxDescriptorSetInlineUniformBlocks{ maxDescriptorSetInlineUniformBlocks_ }\n      , maxDescriptorSetUpdateAfterBindInlineUniformBlocks{ maxDescriptorSetUpdateAfterBindInlineUniformBlocks_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceInlineUniformBlockProperties( PhysicalDeviceInlineUniformBlockProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceInlineUniformBlockProperties( VkPhysicalDeviceInlineUniformBlockProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceInlineUniformBlockProperties( *reinterpret_cast<PhysicalDeviceInlineUniformBlockProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceInlineUniformBlockProperties & operator=( PhysicalDeviceInlineUniformBlockProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceInlineUniformBlockProperties & operator=( VkPhysicalDeviceInlineUniformBlockProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceInlineUniformBlockProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceInlineUniformBlockProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockProperties *>( this );\n    }\n\n    operator VkPhysicalDeviceInlineUniformBlockProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceInlineUniformBlockProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       maxInlineUniformBlockSize,\n                       maxPerStageDescriptorInlineUniformBlocks,\n                       maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks,\n                       maxDescriptorSetInlineUniformBlocks,\n                       maxDescriptorSetUpdateAfterBindInlineUniformBlocks );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceInlineUniformBlockProperties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceInlineUniformBlockProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxInlineUniformBlockSize == rhs.maxInlineUniformBlockSize ) &&\n             ( maxPerStageDescriptorInlineUniformBlocks == rhs.maxPerStageDescriptorInlineUniformBlocks ) &&\n             ( maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks == rhs.maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks ) &&\n             ( maxDescriptorSetInlineUniformBlocks == rhs.maxDescriptorSetInlineUniformBlocks ) &&\n             ( maxDescriptorSetUpdateAfterBindInlineUniformBlocks == rhs.maxDescriptorSetUpdateAfterBindInlineUniformBlocks );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceInlineUniformBlockProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                                   = StructureType::ePhysicalDeviceInlineUniformBlockProperties;\n    void *                              pNext                                                   = {};\n    uint32_t                            maxInlineUniformBlockSize                               = {};\n    uint32_t                            maxPerStageDescriptorInlineUniformBlocks                = {};\n    uint32_t                            maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks = {};\n    uint32_t                            maxDescriptorSetInlineUniformBlocks                     = {};\n    uint32_t                            maxDescriptorSetUpdateAfterBindInlineUniformBlocks      = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceInlineUniformBlockProperties>\n  {\n    using Type = PhysicalDeviceInlineUniformBlockProperties;\n  };\n\n  using PhysicalDeviceInlineUniformBlockPropertiesEXT = PhysicalDeviceInlineUniformBlockProperties;\n\n  struct PhysicalDeviceInvocationMaskFeaturesHUAWEI\n  {\n    using NativeType = VkPhysicalDeviceInvocationMaskFeaturesHUAWEI;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceInvocationMaskFeaturesHUAWEI;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceInvocationMaskFeaturesHUAWEI( VULKAN_HPP_NAMESPACE::Bool32 invocationMask_ = {},\n                                                                     void *                       pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , invocationMask{ invocationMask_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceInvocationMaskFeaturesHUAWEI( PhysicalDeviceInvocationMaskFeaturesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceInvocationMaskFeaturesHUAWEI( VkPhysicalDeviceInvocationMaskFeaturesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceInvocationMaskFeaturesHUAWEI( *reinterpret_cast<PhysicalDeviceInvocationMaskFeaturesHUAWEI const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceInvocationMaskFeaturesHUAWEI & operator=( PhysicalDeviceInvocationMaskFeaturesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceInvocationMaskFeaturesHUAWEI & operator=( VkPhysicalDeviceInvocationMaskFeaturesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceInvocationMaskFeaturesHUAWEI const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceInvocationMaskFeaturesHUAWEI & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceInvocationMaskFeaturesHUAWEI & setInvocationMask( VULKAN_HPP_NAMESPACE::Bool32 invocationMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      invocationMask = invocationMask_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceInvocationMaskFeaturesHUAWEI const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceInvocationMaskFeaturesHUAWEI *>( this );\n    }\n\n    operator VkPhysicalDeviceInvocationMaskFeaturesHUAWEI &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceInvocationMaskFeaturesHUAWEI *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, invocationMask );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceInvocationMaskFeaturesHUAWEI const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceInvocationMaskFeaturesHUAWEI const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( invocationMask == rhs.invocationMask );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceInvocationMaskFeaturesHUAWEI const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::ePhysicalDeviceInvocationMaskFeaturesHUAWEI;\n    void *                              pNext          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        invocationMask = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceInvocationMaskFeaturesHUAWEI>\n  {\n    using Type = PhysicalDeviceInvocationMaskFeaturesHUAWEI;\n  };\n\n  struct PhysicalDeviceLayeredApiPropertiesKHR\n  {\n    using NativeType = VkPhysicalDeviceLayeredApiPropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceLayeredApiPropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLayeredApiPropertiesKHR(\n      uint32_t                                                   vendorID_   = {},\n      uint32_t                                                   deviceID_   = {},\n      VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiKHR          layeredAPI_ = VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiKHR::eVulkan,\n      std::array<char, VK_MAX_PHYSICAL_DEVICE_NAME_SIZE> const & deviceName_ = {},\n      void *                                                     pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , vendorID{ vendorID_ }\n      , deviceID{ deviceID_ }\n      , layeredAPI{ layeredAPI_ }\n      , deviceName{ deviceName_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLayeredApiPropertiesKHR( PhysicalDeviceLayeredApiPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceLayeredApiPropertiesKHR( VkPhysicalDeviceLayeredApiPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceLayeredApiPropertiesKHR( *reinterpret_cast<PhysicalDeviceLayeredApiPropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceLayeredApiPropertiesKHR & operator=( PhysicalDeviceLayeredApiPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceLayeredApiPropertiesKHR & operator=( VkPhysicalDeviceLayeredApiPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiPropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceLayeredApiPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceLayeredApiPropertiesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceLayeredApiPropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceLayeredApiPropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiKHR const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_PHYSICAL_DEVICE_NAME_SIZE> const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, vendorID, deviceID, layeredAPI, deviceName );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceLayeredApiPropertiesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceLayeredApiPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( vendorID == rhs.vendorID ) && ( deviceID == rhs.deviceID ) &&\n             ( layeredAPI == rhs.layeredAPI ) && ( deviceName == rhs.deviceName );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceLayeredApiPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                          sType      = StructureType::ePhysicalDeviceLayeredApiPropertiesKHR;\n    void *                                                                       pNext      = {};\n    uint32_t                                                                     vendorID   = {};\n    uint32_t                                                                     deviceID   = {};\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiKHR                            layeredAPI = VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiKHR::eVulkan;\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_PHYSICAL_DEVICE_NAME_SIZE> deviceName = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceLayeredApiPropertiesKHR>\n  {\n    using Type = PhysicalDeviceLayeredApiPropertiesKHR;\n  };\n\n  struct PhysicalDeviceLayeredApiPropertiesListKHR\n  {\n    using NativeType = VkPhysicalDeviceLayeredApiPropertiesListKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceLayeredApiPropertiesListKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLayeredApiPropertiesListKHR( uint32_t                                                      layeredApiCount_ = {},\n                                                                       VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiPropertiesKHR * pLayeredApis_    = {},\n                                                                       void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , layeredApiCount{ layeredApiCount_ }\n      , pLayeredApis{ pLayeredApis_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLayeredApiPropertiesListKHR( PhysicalDeviceLayeredApiPropertiesListKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceLayeredApiPropertiesListKHR( VkPhysicalDeviceLayeredApiPropertiesListKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceLayeredApiPropertiesListKHR( *reinterpret_cast<PhysicalDeviceLayeredApiPropertiesListKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PhysicalDeviceLayeredApiPropertiesListKHR(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiPropertiesKHR> const & layeredApis_, void * pNext_ = nullptr )\n      : pNext( pNext_ ), layeredApiCount( static_cast<uint32_t>( layeredApis_.size() ) ), pLayeredApis( layeredApis_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PhysicalDeviceLayeredApiPropertiesListKHR & operator=( PhysicalDeviceLayeredApiPropertiesListKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceLayeredApiPropertiesListKHR & operator=( VkPhysicalDeviceLayeredApiPropertiesListKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiPropertiesListKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLayeredApiPropertiesListKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLayeredApiPropertiesListKHR & setLayeredApiCount( uint32_t layeredApiCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layeredApiCount = layeredApiCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLayeredApiPropertiesListKHR &\n      setPLayeredApis( VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiPropertiesKHR * pLayeredApis_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pLayeredApis = pLayeredApis_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PhysicalDeviceLayeredApiPropertiesListKHR & setLayeredApis(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiPropertiesKHR> const & layeredApis_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layeredApiCount = static_cast<uint32_t>( layeredApis_.size() );\n      pLayeredApis    = layeredApis_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceLayeredApiPropertiesListKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceLayeredApiPropertiesListKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceLayeredApiPropertiesListKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceLayeredApiPropertiesListKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiPropertiesKHR * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, layeredApiCount, pLayeredApis );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceLayeredApiPropertiesListKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceLayeredApiPropertiesListKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( layeredApiCount == rhs.layeredApiCount ) && ( pLayeredApis == rhs.pLayeredApis );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceLayeredApiPropertiesListKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                           sType           = StructureType::ePhysicalDeviceLayeredApiPropertiesListKHR;\n    void *                                                        pNext           = {};\n    uint32_t                                                      layeredApiCount = {};\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiPropertiesKHR * pLayeredApis    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceLayeredApiPropertiesListKHR>\n  {\n    using Type = PhysicalDeviceLayeredApiPropertiesListKHR;\n  };\n\n  struct PhysicalDeviceLimits\n  {\n    using NativeType = VkPhysicalDeviceLimits;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLimits( uint32_t                               maxImageDimension1D_                             = {},\n                                                  uint32_t                               maxImageDimension2D_                             = {},\n                                                  uint32_t                               maxImageDimension3D_                             = {},\n                                                  uint32_t                               maxImageDimensionCube_                           = {},\n                                                  uint32_t                               maxImageArrayLayers_                             = {},\n                                                  uint32_t                               maxTexelBufferElements_                          = {},\n                                                  uint32_t                               maxUniformBufferRange_                           = {},\n                                                  uint32_t                               maxStorageBufferRange_                           = {},\n                                                  uint32_t                               maxPushConstantsSize_                            = {},\n                                                  uint32_t                               maxMemoryAllocationCount_                        = {},\n                                                  uint32_t                               maxSamplerAllocationCount_                       = {},\n                                                  VULKAN_HPP_NAMESPACE::DeviceSize       bufferImageGranularity_                          = {},\n                                                  VULKAN_HPP_NAMESPACE::DeviceSize       sparseAddressSpaceSize_                          = {},\n                                                  uint32_t                               maxBoundDescriptorSets_                          = {},\n                                                  uint32_t                               maxPerStageDescriptorSamplers_                   = {},\n                                                  uint32_t                               maxPerStageDescriptorUniformBuffers_             = {},\n                                                  uint32_t                               maxPerStageDescriptorStorageBuffers_             = {},\n                                                  uint32_t                               maxPerStageDescriptorSampledImages_              = {},\n                                                  uint32_t                               maxPerStageDescriptorStorageImages_              = {},\n                                                  uint32_t                               maxPerStageDescriptorInputAttachments_           = {},\n                                                  uint32_t                               maxPerStageResources_                            = {},\n                                                  uint32_t                               maxDescriptorSetSamplers_                        = {},\n                                                  uint32_t                               maxDescriptorSetUniformBuffers_                  = {},\n                                                  uint32_t                               maxDescriptorSetUniformBuffersDynamic_           = {},\n                                                  uint32_t                               maxDescriptorSetStorageBuffers_                  = {},\n                                                  uint32_t                               maxDescriptorSetStorageBuffersDynamic_           = {},\n                                                  uint32_t                               maxDescriptorSetSampledImages_                   = {},\n                                                  uint32_t                               maxDescriptorSetStorageImages_                   = {},\n                                                  uint32_t                               maxDescriptorSetInputAttachments_                = {},\n                                                  uint32_t                               maxVertexInputAttributes_                        = {},\n                                                  uint32_t                               maxVertexInputBindings_                          = {},\n                                                  uint32_t                               maxVertexInputAttributeOffset_                   = {},\n                                                  uint32_t                               maxVertexInputBindingStride_                     = {},\n                                                  uint32_t                               maxVertexOutputComponents_                       = {},\n                                                  uint32_t                               maxTessellationGenerationLevel_                  = {},\n                                                  uint32_t                               maxTessellationPatchSize_                        = {},\n                                                  uint32_t                               maxTessellationControlPerVertexInputComponents_  = {},\n                                                  uint32_t                               maxTessellationControlPerVertexOutputComponents_ = {},\n                                                  uint32_t                               maxTessellationControlPerPatchOutputComponents_  = {},\n                                                  uint32_t                               maxTessellationControlTotalOutputComponents_     = {},\n                                                  uint32_t                               maxTessellationEvaluationInputComponents_        = {},\n                                                  uint32_t                               maxTessellationEvaluationOutputComponents_       = {},\n                                                  uint32_t                               maxGeometryShaderInvocations_                    = {},\n                                                  uint32_t                               maxGeometryInputComponents_                      = {},\n                                                  uint32_t                               maxGeometryOutputComponents_                     = {},\n                                                  uint32_t                               maxGeometryOutputVertices_                       = {},\n                                                  uint32_t                               maxGeometryTotalOutputComponents_                = {},\n                                                  uint32_t                               maxFragmentInputComponents_                      = {},\n                                                  uint32_t                               maxFragmentOutputAttachments_                    = {},\n                                                  uint32_t                               maxFragmentDualSrcAttachments_                   = {},\n                                                  uint32_t                               maxFragmentCombinedOutputResources_              = {},\n                                                  uint32_t                               maxComputeSharedMemorySize_                      = {},\n                                                  std::array<uint32_t, 3> const &        maxComputeWorkGroupCount_                        = {},\n                                                  uint32_t                               maxComputeWorkGroupInvocations_                  = {},\n                                                  std::array<uint32_t, 3> const &        maxComputeWorkGroupSize_                         = {},\n                                                  uint32_t                               subPixelPrecisionBits_                           = {},\n                                                  uint32_t                               subTexelPrecisionBits_                           = {},\n                                                  uint32_t                               mipmapPrecisionBits_                             = {},\n                                                  uint32_t                               maxDrawIndexedIndexValue_                        = {},\n                                                  uint32_t                               maxDrawIndirectCount_                            = {},\n                                                  float                                  maxSamplerLodBias_                               = {},\n                                                  float                                  maxSamplerAnisotropy_                            = {},\n                                                  uint32_t                               maxViewports_                                    = {},\n                                                  std::array<uint32_t, 2> const &        maxViewportDimensions_                           = {},\n                                                  std::array<float, 2> const &           viewportBoundsRange_                             = {},\n                                                  uint32_t                               viewportSubPixelBits_                            = {},\n                                                  size_t                                 minMemoryMapAlignment_                           = {},\n                                                  VULKAN_HPP_NAMESPACE::DeviceSize       minTexelBufferOffsetAlignment_                   = {},\n                                                  VULKAN_HPP_NAMESPACE::DeviceSize       minUniformBufferOffsetAlignment_                 = {},\n                                                  VULKAN_HPP_NAMESPACE::DeviceSize       minStorageBufferOffsetAlignment_                 = {},\n                                                  int32_t                                minTexelOffset_                                  = {},\n                                                  uint32_t                               maxTexelOffset_                                  = {},\n                                                  int32_t                                minTexelGatherOffset_                            = {},\n                                                  uint32_t                               maxTexelGatherOffset_                            = {},\n                                                  float                                  minInterpolationOffset_                          = {},\n                                                  float                                  maxInterpolationOffset_                          = {},\n                                                  uint32_t                               subPixelInterpolationOffsetBits_                 = {},\n                                                  uint32_t                               maxFramebufferWidth_                             = {},\n                                                  uint32_t                               maxFramebufferHeight_                            = {},\n                                                  uint32_t                               maxFramebufferLayers_                            = {},\n                                                  VULKAN_HPP_NAMESPACE::SampleCountFlags framebufferColorSampleCounts_                    = {},\n                                                  VULKAN_HPP_NAMESPACE::SampleCountFlags framebufferDepthSampleCounts_                    = {},\n                                                  VULKAN_HPP_NAMESPACE::SampleCountFlags framebufferStencilSampleCounts_                  = {},\n                                                  VULKAN_HPP_NAMESPACE::SampleCountFlags framebufferNoAttachmentsSampleCounts_            = {},\n                                                  uint32_t                               maxColorAttachments_                             = {},\n                                                  VULKAN_HPP_NAMESPACE::SampleCountFlags sampledImageColorSampleCounts_                   = {},\n                                                  VULKAN_HPP_NAMESPACE::SampleCountFlags sampledImageIntegerSampleCounts_                 = {},\n                                                  VULKAN_HPP_NAMESPACE::SampleCountFlags sampledImageDepthSampleCounts_                   = {},\n                                                  VULKAN_HPP_NAMESPACE::SampleCountFlags sampledImageStencilSampleCounts_                 = {},\n                                                  VULKAN_HPP_NAMESPACE::SampleCountFlags storageImageSampleCounts_                        = {},\n                                                  uint32_t                               maxSampleMaskWords_                              = {},\n                                                  VULKAN_HPP_NAMESPACE::Bool32           timestampComputeAndGraphics_                     = {},\n                                                  float                                  timestampPeriod_                                 = {},\n                                                  uint32_t                               maxClipDistances_                                = {},\n                                                  uint32_t                               maxCullDistances_                                = {},\n                                                  uint32_t                               maxCombinedClipAndCullDistances_                 = {},\n                                                  uint32_t                               discreteQueuePriorities_                         = {},\n                                                  std::array<float, 2> const &           pointSizeRange_                                  = {},\n                                                  std::array<float, 2> const &           lineWidthRange_                                  = {},\n                                                  float                                  pointSizeGranularity_                            = {},\n                                                  float                                  lineWidthGranularity_                            = {},\n                                                  VULKAN_HPP_NAMESPACE::Bool32           strictLines_                                     = {},\n                                                  VULKAN_HPP_NAMESPACE::Bool32           standardSampleLocations_                         = {},\n                                                  VULKAN_HPP_NAMESPACE::DeviceSize       optimalBufferCopyOffsetAlignment_                = {},\n                                                  VULKAN_HPP_NAMESPACE::DeviceSize       optimalBufferCopyRowPitchAlignment_              = {},\n                                                  VULKAN_HPP_NAMESPACE::DeviceSize       nonCoherentAtomSize_ = {} ) VULKAN_HPP_NOEXCEPT\n      : maxImageDimension1D{ maxImageDimension1D_ }\n      , maxImageDimension2D{ maxImageDimension2D_ }\n      , maxImageDimension3D{ maxImageDimension3D_ }\n      , maxImageDimensionCube{ maxImageDimensionCube_ }\n      , maxImageArrayLayers{ maxImageArrayLayers_ }\n      , maxTexelBufferElements{ maxTexelBufferElements_ }\n      , maxUniformBufferRange{ maxUniformBufferRange_ }\n      , maxStorageBufferRange{ maxStorageBufferRange_ }\n      , maxPushConstantsSize{ maxPushConstantsSize_ }\n      , maxMemoryAllocationCount{ maxMemoryAllocationCount_ }\n      , maxSamplerAllocationCount{ maxSamplerAllocationCount_ }\n      , bufferImageGranularity{ bufferImageGranularity_ }\n      , sparseAddressSpaceSize{ sparseAddressSpaceSize_ }\n      , maxBoundDescriptorSets{ maxBoundDescriptorSets_ }\n      , maxPerStageDescriptorSamplers{ maxPerStageDescriptorSamplers_ }\n      , maxPerStageDescriptorUniformBuffers{ maxPerStageDescriptorUniformBuffers_ }\n      , maxPerStageDescriptorStorageBuffers{ maxPerStageDescriptorStorageBuffers_ }\n      , maxPerStageDescriptorSampledImages{ maxPerStageDescriptorSampledImages_ }\n      , maxPerStageDescriptorStorageImages{ maxPerStageDescriptorStorageImages_ }\n      , maxPerStageDescriptorInputAttachments{ maxPerStageDescriptorInputAttachments_ }\n      , maxPerStageResources{ maxPerStageResources_ }\n      , maxDescriptorSetSamplers{ maxDescriptorSetSamplers_ }\n      , maxDescriptorSetUniformBuffers{ maxDescriptorSetUniformBuffers_ }\n      , maxDescriptorSetUniformBuffersDynamic{ maxDescriptorSetUniformBuffersDynamic_ }\n      , maxDescriptorSetStorageBuffers{ maxDescriptorSetStorageBuffers_ }\n      , maxDescriptorSetStorageBuffersDynamic{ maxDescriptorSetStorageBuffersDynamic_ }\n      , maxDescriptorSetSampledImages{ maxDescriptorSetSampledImages_ }\n      , maxDescriptorSetStorageImages{ maxDescriptorSetStorageImages_ }\n      , maxDescriptorSetInputAttachments{ maxDescriptorSetInputAttachments_ }\n      , maxVertexInputAttributes{ maxVertexInputAttributes_ }\n      , maxVertexInputBindings{ maxVertexInputBindings_ }\n      , maxVertexInputAttributeOffset{ maxVertexInputAttributeOffset_ }\n      , maxVertexInputBindingStride{ maxVertexInputBindingStride_ }\n      , maxVertexOutputComponents{ maxVertexOutputComponents_ }\n      , maxTessellationGenerationLevel{ maxTessellationGenerationLevel_ }\n      , maxTessellationPatchSize{ maxTessellationPatchSize_ }\n      , maxTessellationControlPerVertexInputComponents{ maxTessellationControlPerVertexInputComponents_ }\n      , maxTessellationControlPerVertexOutputComponents{ maxTessellationControlPerVertexOutputComponents_ }\n      , maxTessellationControlPerPatchOutputComponents{ maxTessellationControlPerPatchOutputComponents_ }\n      , maxTessellationControlTotalOutputComponents{ maxTessellationControlTotalOutputComponents_ }\n      , maxTessellationEvaluationInputComponents{ maxTessellationEvaluationInputComponents_ }\n      , maxTessellationEvaluationOutputComponents{ maxTessellationEvaluationOutputComponents_ }\n      , maxGeometryShaderInvocations{ maxGeometryShaderInvocations_ }\n      , maxGeometryInputComponents{ maxGeometryInputComponents_ }\n      , maxGeometryOutputComponents{ maxGeometryOutputComponents_ }\n      , maxGeometryOutputVertices{ maxGeometryOutputVertices_ }\n      , maxGeometryTotalOutputComponents{ maxGeometryTotalOutputComponents_ }\n      , maxFragmentInputComponents{ maxFragmentInputComponents_ }\n      , maxFragmentOutputAttachments{ maxFragmentOutputAttachments_ }\n      , maxFragmentDualSrcAttachments{ maxFragmentDualSrcAttachments_ }\n      , maxFragmentCombinedOutputResources{ maxFragmentCombinedOutputResources_ }\n      , maxComputeSharedMemorySize{ maxComputeSharedMemorySize_ }\n      , maxComputeWorkGroupCount{ maxComputeWorkGroupCount_ }\n      , maxComputeWorkGroupInvocations{ maxComputeWorkGroupInvocations_ }\n      , maxComputeWorkGroupSize{ maxComputeWorkGroupSize_ }\n      , subPixelPrecisionBits{ subPixelPrecisionBits_ }\n      , subTexelPrecisionBits{ subTexelPrecisionBits_ }\n      , mipmapPrecisionBits{ mipmapPrecisionBits_ }\n      , maxDrawIndexedIndexValue{ maxDrawIndexedIndexValue_ }\n      , maxDrawIndirectCount{ maxDrawIndirectCount_ }\n      , maxSamplerLodBias{ maxSamplerLodBias_ }\n      , maxSamplerAnisotropy{ maxSamplerAnisotropy_ }\n      , maxViewports{ maxViewports_ }\n      , maxViewportDimensions{ maxViewportDimensions_ }\n      , viewportBoundsRange{ viewportBoundsRange_ }\n      , viewportSubPixelBits{ viewportSubPixelBits_ }\n      , minMemoryMapAlignment{ minMemoryMapAlignment_ }\n      , minTexelBufferOffsetAlignment{ minTexelBufferOffsetAlignment_ }\n      , minUniformBufferOffsetAlignment{ minUniformBufferOffsetAlignment_ }\n      , minStorageBufferOffsetAlignment{ minStorageBufferOffsetAlignment_ }\n      , minTexelOffset{ minTexelOffset_ }\n      , maxTexelOffset{ maxTexelOffset_ }\n      , minTexelGatherOffset{ minTexelGatherOffset_ }\n      , maxTexelGatherOffset{ maxTexelGatherOffset_ }\n      , minInterpolationOffset{ minInterpolationOffset_ }\n      , maxInterpolationOffset{ maxInterpolationOffset_ }\n      , subPixelInterpolationOffsetBits{ subPixelInterpolationOffsetBits_ }\n      , maxFramebufferWidth{ maxFramebufferWidth_ }\n      , maxFramebufferHeight{ maxFramebufferHeight_ }\n      , maxFramebufferLayers{ maxFramebufferLayers_ }\n      , framebufferColorSampleCounts{ framebufferColorSampleCounts_ }\n      , framebufferDepthSampleCounts{ framebufferDepthSampleCounts_ }\n      , framebufferStencilSampleCounts{ framebufferStencilSampleCounts_ }\n      , framebufferNoAttachmentsSampleCounts{ framebufferNoAttachmentsSampleCounts_ }\n      , maxColorAttachments{ maxColorAttachments_ }\n      , sampledImageColorSampleCounts{ sampledImageColorSampleCounts_ }\n      , sampledImageIntegerSampleCounts{ sampledImageIntegerSampleCounts_ }\n      , sampledImageDepthSampleCounts{ sampledImageDepthSampleCounts_ }\n      , sampledImageStencilSampleCounts{ sampledImageStencilSampleCounts_ }\n      , storageImageSampleCounts{ storageImageSampleCounts_ }\n      , maxSampleMaskWords{ maxSampleMaskWords_ }\n      , timestampComputeAndGraphics{ timestampComputeAndGraphics_ }\n      , timestampPeriod{ timestampPeriod_ }\n      , maxClipDistances{ maxClipDistances_ }\n      , maxCullDistances{ maxCullDistances_ }\n      , maxCombinedClipAndCullDistances{ maxCombinedClipAndCullDistances_ }\n      , discreteQueuePriorities{ discreteQueuePriorities_ }\n      , pointSizeRange{ pointSizeRange_ }\n      , lineWidthRange{ lineWidthRange_ }\n      , pointSizeGranularity{ pointSizeGranularity_ }\n      , lineWidthGranularity{ lineWidthGranularity_ }\n      , strictLines{ strictLines_ }\n      , standardSampleLocations{ standardSampleLocations_ }\n      , optimalBufferCopyOffsetAlignment{ optimalBufferCopyOffsetAlignment_ }\n      , optimalBufferCopyRowPitchAlignment{ optimalBufferCopyRowPitchAlignment_ }\n      , nonCoherentAtomSize{ nonCoherentAtomSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLimits( PhysicalDeviceLimits const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceLimits( VkPhysicalDeviceLimits const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceLimits( *reinterpret_cast<PhysicalDeviceLimits const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceLimits & operator=( PhysicalDeviceLimits const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceLimits & operator=( VkPhysicalDeviceLimits const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceLimits const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceLimits const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceLimits *>( this );\n    }\n\n    operator VkPhysicalDeviceLimits &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceLimits *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               float const &,\n               float const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 2> const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<float, 2> const &,\n               uint32_t const &,\n               size_t const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               int32_t const &,\n               uint32_t const &,\n               int32_t const &,\n               uint32_t const &,\n               float const &,\n               float const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlags const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlags const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlags const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlags const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlags const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlags const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlags const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlags const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlags const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               float const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<float, 2> const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<float, 2> const &,\n               float const &,\n               float const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( maxImageDimension1D,\n                       maxImageDimension2D,\n                       maxImageDimension3D,\n                       maxImageDimensionCube,\n                       maxImageArrayLayers,\n                       maxTexelBufferElements,\n                       maxUniformBufferRange,\n                       maxStorageBufferRange,\n                       maxPushConstantsSize,\n                       maxMemoryAllocationCount,\n                       maxSamplerAllocationCount,\n                       bufferImageGranularity,\n                       sparseAddressSpaceSize,\n                       maxBoundDescriptorSets,\n                       maxPerStageDescriptorSamplers,\n                       maxPerStageDescriptorUniformBuffers,\n                       maxPerStageDescriptorStorageBuffers,\n                       maxPerStageDescriptorSampledImages,\n                       maxPerStageDescriptorStorageImages,\n                       maxPerStageDescriptorInputAttachments,\n                       maxPerStageResources,\n                       maxDescriptorSetSamplers,\n                       maxDescriptorSetUniformBuffers,\n                       maxDescriptorSetUniformBuffersDynamic,\n                       maxDescriptorSetStorageBuffers,\n                       maxDescriptorSetStorageBuffersDynamic,\n                       maxDescriptorSetSampledImages,\n                       maxDescriptorSetStorageImages,\n                       maxDescriptorSetInputAttachments,\n                       maxVertexInputAttributes,\n                       maxVertexInputBindings,\n                       maxVertexInputAttributeOffset,\n                       maxVertexInputBindingStride,\n                       maxVertexOutputComponents,\n                       maxTessellationGenerationLevel,\n                       maxTessellationPatchSize,\n                       maxTessellationControlPerVertexInputComponents,\n                       maxTessellationControlPerVertexOutputComponents,\n                       maxTessellationControlPerPatchOutputComponents,\n                       maxTessellationControlTotalOutputComponents,\n                       maxTessellationEvaluationInputComponents,\n                       maxTessellationEvaluationOutputComponents,\n                       maxGeometryShaderInvocations,\n                       maxGeometryInputComponents,\n                       maxGeometryOutputComponents,\n                       maxGeometryOutputVertices,\n                       maxGeometryTotalOutputComponents,\n                       maxFragmentInputComponents,\n                       maxFragmentOutputAttachments,\n                       maxFragmentDualSrcAttachments,\n                       maxFragmentCombinedOutputResources,\n                       maxComputeSharedMemorySize,\n                       maxComputeWorkGroupCount,\n                       maxComputeWorkGroupInvocations,\n                       maxComputeWorkGroupSize,\n                       subPixelPrecisionBits,\n                       subTexelPrecisionBits,\n                       mipmapPrecisionBits,\n                       maxDrawIndexedIndexValue,\n                       maxDrawIndirectCount,\n                       maxSamplerLodBias,\n                       maxSamplerAnisotropy,\n                       maxViewports,\n                       maxViewportDimensions,\n                       viewportBoundsRange,\n                       viewportSubPixelBits,\n                       minMemoryMapAlignment,\n                       minTexelBufferOffsetAlignment,\n                       minUniformBufferOffsetAlignment,\n                       minStorageBufferOffsetAlignment,\n                       minTexelOffset,\n                       maxTexelOffset,\n                       minTexelGatherOffset,\n                       maxTexelGatherOffset,\n                       minInterpolationOffset,\n                       maxInterpolationOffset,\n                       subPixelInterpolationOffsetBits,\n                       maxFramebufferWidth,\n                       maxFramebufferHeight,\n                       maxFramebufferLayers,\n                       framebufferColorSampleCounts,\n                       framebufferDepthSampleCounts,\n                       framebufferStencilSampleCounts,\n                       framebufferNoAttachmentsSampleCounts,\n                       maxColorAttachments,\n                       sampledImageColorSampleCounts,\n                       sampledImageIntegerSampleCounts,\n                       sampledImageDepthSampleCounts,\n                       sampledImageStencilSampleCounts,\n                       storageImageSampleCounts,\n                       maxSampleMaskWords,\n                       timestampComputeAndGraphics,\n                       timestampPeriod,\n                       maxClipDistances,\n                       maxCullDistances,\n                       maxCombinedClipAndCullDistances,\n                       discreteQueuePriorities,\n                       pointSizeRange,\n                       lineWidthRange,\n                       pointSizeGranularity,\n                       lineWidthGranularity,\n                       strictLines,\n                       standardSampleLocations,\n                       optimalBufferCopyOffsetAlignment,\n                       optimalBufferCopyRowPitchAlignment,\n                       nonCoherentAtomSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceLimits const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceLimits const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( maxImageDimension1D == rhs.maxImageDimension1D ) && ( maxImageDimension2D == rhs.maxImageDimension2D ) &&\n             ( maxImageDimension3D == rhs.maxImageDimension3D ) && ( maxImageDimensionCube == rhs.maxImageDimensionCube ) &&\n             ( maxImageArrayLayers == rhs.maxImageArrayLayers ) && ( maxTexelBufferElements == rhs.maxTexelBufferElements ) &&\n             ( maxUniformBufferRange == rhs.maxUniformBufferRange ) && ( maxStorageBufferRange == rhs.maxStorageBufferRange ) &&\n             ( maxPushConstantsSize == rhs.maxPushConstantsSize ) && ( maxMemoryAllocationCount == rhs.maxMemoryAllocationCount ) &&\n             ( maxSamplerAllocationCount == rhs.maxSamplerAllocationCount ) && ( bufferImageGranularity == rhs.bufferImageGranularity ) &&\n             ( sparseAddressSpaceSize == rhs.sparseAddressSpaceSize ) && ( maxBoundDescriptorSets == rhs.maxBoundDescriptorSets ) &&\n             ( maxPerStageDescriptorSamplers == rhs.maxPerStageDescriptorSamplers ) &&\n             ( maxPerStageDescriptorUniformBuffers == rhs.maxPerStageDescriptorUniformBuffers ) &&\n             ( maxPerStageDescriptorStorageBuffers == rhs.maxPerStageDescriptorStorageBuffers ) &&\n             ( maxPerStageDescriptorSampledImages == rhs.maxPerStageDescriptorSampledImages ) &&\n             ( maxPerStageDescriptorStorageImages == rhs.maxPerStageDescriptorStorageImages ) &&\n             ( maxPerStageDescriptorInputAttachments == rhs.maxPerStageDescriptorInputAttachments ) && ( maxPerStageResources == rhs.maxPerStageResources ) &&\n             ( maxDescriptorSetSamplers == rhs.maxDescriptorSetSamplers ) && ( maxDescriptorSetUniformBuffers == rhs.maxDescriptorSetUniformBuffers ) &&\n             ( maxDescriptorSetUniformBuffersDynamic == rhs.maxDescriptorSetUniformBuffersDynamic ) &&\n             ( maxDescriptorSetStorageBuffers == rhs.maxDescriptorSetStorageBuffers ) &&\n             ( maxDescriptorSetStorageBuffersDynamic == rhs.maxDescriptorSetStorageBuffersDynamic ) &&\n             ( maxDescriptorSetSampledImages == rhs.maxDescriptorSetSampledImages ) && ( maxDescriptorSetStorageImages == rhs.maxDescriptorSetStorageImages ) &&\n             ( maxDescriptorSetInputAttachments == rhs.maxDescriptorSetInputAttachments ) && ( maxVertexInputAttributes == rhs.maxVertexInputAttributes ) &&\n             ( maxVertexInputBindings == rhs.maxVertexInputBindings ) && ( maxVertexInputAttributeOffset == rhs.maxVertexInputAttributeOffset ) &&\n             ( maxVertexInputBindingStride == rhs.maxVertexInputBindingStride ) && ( maxVertexOutputComponents == rhs.maxVertexOutputComponents ) &&\n             ( maxTessellationGenerationLevel == rhs.maxTessellationGenerationLevel ) && ( maxTessellationPatchSize == rhs.maxTessellationPatchSize ) &&\n             ( maxTessellationControlPerVertexInputComponents == rhs.maxTessellationControlPerVertexInputComponents ) &&\n             ( maxTessellationControlPerVertexOutputComponents == rhs.maxTessellationControlPerVertexOutputComponents ) &&\n             ( maxTessellationControlPerPatchOutputComponents == rhs.maxTessellationControlPerPatchOutputComponents ) &&\n             ( maxTessellationControlTotalOutputComponents == rhs.maxTessellationControlTotalOutputComponents ) &&\n             ( maxTessellationEvaluationInputComponents == rhs.maxTessellationEvaluationInputComponents ) &&\n             ( maxTessellationEvaluationOutputComponents == rhs.maxTessellationEvaluationOutputComponents ) &&\n             ( maxGeometryShaderInvocations == rhs.maxGeometryShaderInvocations ) && ( maxGeometryInputComponents == rhs.maxGeometryInputComponents ) &&\n             ( maxGeometryOutputComponents == rhs.maxGeometryOutputComponents ) && ( maxGeometryOutputVertices == rhs.maxGeometryOutputVertices ) &&\n             ( maxGeometryTotalOutputComponents == rhs.maxGeometryTotalOutputComponents ) && ( maxFragmentInputComponents == rhs.maxFragmentInputComponents ) &&\n             ( maxFragmentOutputAttachments == rhs.maxFragmentOutputAttachments ) && ( maxFragmentDualSrcAttachments == rhs.maxFragmentDualSrcAttachments ) &&\n             ( maxFragmentCombinedOutputResources == rhs.maxFragmentCombinedOutputResources ) &&\n             ( maxComputeSharedMemorySize == rhs.maxComputeSharedMemorySize ) && ( maxComputeWorkGroupCount == rhs.maxComputeWorkGroupCount ) &&\n             ( maxComputeWorkGroupInvocations == rhs.maxComputeWorkGroupInvocations ) && ( maxComputeWorkGroupSize == rhs.maxComputeWorkGroupSize ) &&\n             ( subPixelPrecisionBits == rhs.subPixelPrecisionBits ) && ( subTexelPrecisionBits == rhs.subTexelPrecisionBits ) &&\n             ( mipmapPrecisionBits == rhs.mipmapPrecisionBits ) && ( maxDrawIndexedIndexValue == rhs.maxDrawIndexedIndexValue ) &&\n             ( maxDrawIndirectCount == rhs.maxDrawIndirectCount ) && ( maxSamplerLodBias == rhs.maxSamplerLodBias ) &&\n             ( maxSamplerAnisotropy == rhs.maxSamplerAnisotropy ) && ( maxViewports == rhs.maxViewports ) &&\n             ( maxViewportDimensions == rhs.maxViewportDimensions ) && ( viewportBoundsRange == rhs.viewportBoundsRange ) &&\n             ( viewportSubPixelBits == rhs.viewportSubPixelBits ) && ( minMemoryMapAlignment == rhs.minMemoryMapAlignment ) &&\n             ( minTexelBufferOffsetAlignment == rhs.minTexelBufferOffsetAlignment ) &&\n             ( minUniformBufferOffsetAlignment == rhs.minUniformBufferOffsetAlignment ) &&\n             ( minStorageBufferOffsetAlignment == rhs.minStorageBufferOffsetAlignment ) && ( minTexelOffset == rhs.minTexelOffset ) &&\n             ( maxTexelOffset == rhs.maxTexelOffset ) && ( minTexelGatherOffset == rhs.minTexelGatherOffset ) &&\n             ( maxTexelGatherOffset == rhs.maxTexelGatherOffset ) && ( minInterpolationOffset == rhs.minInterpolationOffset ) &&\n             ( maxInterpolationOffset == rhs.maxInterpolationOffset ) && ( subPixelInterpolationOffsetBits == rhs.subPixelInterpolationOffsetBits ) &&\n             ( maxFramebufferWidth == rhs.maxFramebufferWidth ) && ( maxFramebufferHeight == rhs.maxFramebufferHeight ) &&\n             ( maxFramebufferLayers == rhs.maxFramebufferLayers ) && ( framebufferColorSampleCounts == rhs.framebufferColorSampleCounts ) &&\n             ( framebufferDepthSampleCounts == rhs.framebufferDepthSampleCounts ) && ( framebufferStencilSampleCounts == rhs.framebufferStencilSampleCounts ) &&\n             ( framebufferNoAttachmentsSampleCounts == rhs.framebufferNoAttachmentsSampleCounts ) && ( maxColorAttachments == rhs.maxColorAttachments ) &&\n             ( sampledImageColorSampleCounts == rhs.sampledImageColorSampleCounts ) &&\n             ( sampledImageIntegerSampleCounts == rhs.sampledImageIntegerSampleCounts ) &&\n             ( sampledImageDepthSampleCounts == rhs.sampledImageDepthSampleCounts ) &&\n             ( sampledImageStencilSampleCounts == rhs.sampledImageStencilSampleCounts ) && ( storageImageSampleCounts == rhs.storageImageSampleCounts ) &&\n             ( maxSampleMaskWords == rhs.maxSampleMaskWords ) && ( timestampComputeAndGraphics == rhs.timestampComputeAndGraphics ) &&\n             ( timestampPeriod == rhs.timestampPeriod ) && ( maxClipDistances == rhs.maxClipDistances ) && ( maxCullDistances == rhs.maxCullDistances ) &&\n             ( maxCombinedClipAndCullDistances == rhs.maxCombinedClipAndCullDistances ) && ( discreteQueuePriorities == rhs.discreteQueuePriorities ) &&\n             ( pointSizeRange == rhs.pointSizeRange ) && ( lineWidthRange == rhs.lineWidthRange ) && ( pointSizeGranularity == rhs.pointSizeGranularity ) &&\n             ( lineWidthGranularity == rhs.lineWidthGranularity ) && ( strictLines == rhs.strictLines ) &&\n             ( standardSampleLocations == rhs.standardSampleLocations ) && ( optimalBufferCopyOffsetAlignment == rhs.optimalBufferCopyOffsetAlignment ) &&\n             ( optimalBufferCopyRowPitchAlignment == rhs.optimalBufferCopyRowPitchAlignment ) && ( nonCoherentAtomSize == rhs.nonCoherentAtomSize );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceLimits const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                                          maxImageDimension1D                             = {};\n    uint32_t                                          maxImageDimension2D                             = {};\n    uint32_t                                          maxImageDimension3D                             = {};\n    uint32_t                                          maxImageDimensionCube                           = {};\n    uint32_t                                          maxImageArrayLayers                             = {};\n    uint32_t                                          maxTexelBufferElements                          = {};\n    uint32_t                                          maxUniformBufferRange                           = {};\n    uint32_t                                          maxStorageBufferRange                           = {};\n    uint32_t                                          maxPushConstantsSize                            = {};\n    uint32_t                                          maxMemoryAllocationCount                        = {};\n    uint32_t                                          maxSamplerAllocationCount                       = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                  bufferImageGranularity                          = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                  sparseAddressSpaceSize                          = {};\n    uint32_t                                          maxBoundDescriptorSets                          = {};\n    uint32_t                                          maxPerStageDescriptorSamplers                   = {};\n    uint32_t                                          maxPerStageDescriptorUniformBuffers             = {};\n    uint32_t                                          maxPerStageDescriptorStorageBuffers             = {};\n    uint32_t                                          maxPerStageDescriptorSampledImages              = {};\n    uint32_t                                          maxPerStageDescriptorStorageImages              = {};\n    uint32_t                                          maxPerStageDescriptorInputAttachments           = {};\n    uint32_t                                          maxPerStageResources                            = {};\n    uint32_t                                          maxDescriptorSetSamplers                        = {};\n    uint32_t                                          maxDescriptorSetUniformBuffers                  = {};\n    uint32_t                                          maxDescriptorSetUniformBuffersDynamic           = {};\n    uint32_t                                          maxDescriptorSetStorageBuffers                  = {};\n    uint32_t                                          maxDescriptorSetStorageBuffersDynamic           = {};\n    uint32_t                                          maxDescriptorSetSampledImages                   = {};\n    uint32_t                                          maxDescriptorSetStorageImages                   = {};\n    uint32_t                                          maxDescriptorSetInputAttachments                = {};\n    uint32_t                                          maxVertexInputAttributes                        = {};\n    uint32_t                                          maxVertexInputBindings                          = {};\n    uint32_t                                          maxVertexInputAttributeOffset                   = {};\n    uint32_t                                          maxVertexInputBindingStride                     = {};\n    uint32_t                                          maxVertexOutputComponents                       = {};\n    uint32_t                                          maxTessellationGenerationLevel                  = {};\n    uint32_t                                          maxTessellationPatchSize                        = {};\n    uint32_t                                          maxTessellationControlPerVertexInputComponents  = {};\n    uint32_t                                          maxTessellationControlPerVertexOutputComponents = {};\n    uint32_t                                          maxTessellationControlPerPatchOutputComponents  = {};\n    uint32_t                                          maxTessellationControlTotalOutputComponents     = {};\n    uint32_t                                          maxTessellationEvaluationInputComponents        = {};\n    uint32_t                                          maxTessellationEvaluationOutputComponents       = {};\n    uint32_t                                          maxGeometryShaderInvocations                    = {};\n    uint32_t                                          maxGeometryInputComponents                      = {};\n    uint32_t                                          maxGeometryOutputComponents                     = {};\n    uint32_t                                          maxGeometryOutputVertices                       = {};\n    uint32_t                                          maxGeometryTotalOutputComponents                = {};\n    uint32_t                                          maxFragmentInputComponents                      = {};\n    uint32_t                                          maxFragmentOutputAttachments                    = {};\n    uint32_t                                          maxFragmentDualSrcAttachments                   = {};\n    uint32_t                                          maxFragmentCombinedOutputResources              = {};\n    uint32_t                                          maxComputeSharedMemorySize                      = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> maxComputeWorkGroupCount                        = {};\n    uint32_t                                          maxComputeWorkGroupInvocations                  = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> maxComputeWorkGroupSize                         = {};\n    uint32_t                                          subPixelPrecisionBits                           = {};\n    uint32_t                                          subTexelPrecisionBits                           = {};\n    uint32_t                                          mipmapPrecisionBits                             = {};\n    uint32_t                                          maxDrawIndexedIndexValue                        = {};\n    uint32_t                                          maxDrawIndirectCount                            = {};\n    float                                             maxSamplerLodBias                               = {};\n    float                                             maxSamplerAnisotropy                            = {};\n    uint32_t                                          maxViewports                                    = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 2> maxViewportDimensions                           = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<float, 2>    viewportBoundsRange                             = {};\n    uint32_t                                          viewportSubPixelBits                            = {};\n    size_t                                            minMemoryMapAlignment                           = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                  minTexelBufferOffsetAlignment                   = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                  minUniformBufferOffsetAlignment                 = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                  minStorageBufferOffsetAlignment                 = {};\n    int32_t                                           minTexelOffset                                  = {};\n    uint32_t                                          maxTexelOffset                                  = {};\n    int32_t                                           minTexelGatherOffset                            = {};\n    uint32_t                                          maxTexelGatherOffset                            = {};\n    float                                             minInterpolationOffset                          = {};\n    float                                             maxInterpolationOffset                          = {};\n    uint32_t                                          subPixelInterpolationOffsetBits                 = {};\n    uint32_t                                          maxFramebufferWidth                             = {};\n    uint32_t                                          maxFramebufferHeight                            = {};\n    uint32_t                                          maxFramebufferLayers                            = {};\n    VULKAN_HPP_NAMESPACE::SampleCountFlags            framebufferColorSampleCounts                    = {};\n    VULKAN_HPP_NAMESPACE::SampleCountFlags            framebufferDepthSampleCounts                    = {};\n    VULKAN_HPP_NAMESPACE::SampleCountFlags            framebufferStencilSampleCounts                  = {};\n    VULKAN_HPP_NAMESPACE::SampleCountFlags            framebufferNoAttachmentsSampleCounts            = {};\n    uint32_t                                          maxColorAttachments                             = {};\n    VULKAN_HPP_NAMESPACE::SampleCountFlags            sampledImageColorSampleCounts                   = {};\n    VULKAN_HPP_NAMESPACE::SampleCountFlags            sampledImageIntegerSampleCounts                 = {};\n    VULKAN_HPP_NAMESPACE::SampleCountFlags            sampledImageDepthSampleCounts                   = {};\n    VULKAN_HPP_NAMESPACE::SampleCountFlags            sampledImageStencilSampleCounts                 = {};\n    VULKAN_HPP_NAMESPACE::SampleCountFlags            storageImageSampleCounts                        = {};\n    uint32_t                                          maxSampleMaskWords                              = {};\n    VULKAN_HPP_NAMESPACE::Bool32                      timestampComputeAndGraphics                     = {};\n    float                                             timestampPeriod                                 = {};\n    uint32_t                                          maxClipDistances                                = {};\n    uint32_t                                          maxCullDistances                                = {};\n    uint32_t                                          maxCombinedClipAndCullDistances                 = {};\n    uint32_t                                          discreteQueuePriorities                         = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<float, 2>    pointSizeRange                                  = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<float, 2>    lineWidthRange                                  = {};\n    float                                             pointSizeGranularity                            = {};\n    float                                             lineWidthGranularity                            = {};\n    VULKAN_HPP_NAMESPACE::Bool32                      strictLines                                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32                      standardSampleLocations                         = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                  optimalBufferCopyOffsetAlignment                = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                  optimalBufferCopyRowPitchAlignment              = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                  nonCoherentAtomSize                             = {};\n  };\n\n  struct PhysicalDeviceSparseProperties\n  {\n    using NativeType = VkPhysicalDeviceSparseProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSparseProperties( VULKAN_HPP_NAMESPACE::Bool32 residencyStandard2DBlockShape_            = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 residencyStandard2DMultisampleBlockShape_ = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 residencyStandard3DBlockShape_            = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 residencyAlignedMipSize_                  = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 residencyNonResidentStrict_               = {} ) VULKAN_HPP_NOEXCEPT\n      : residencyStandard2DBlockShape{ residencyStandard2DBlockShape_ }\n      , residencyStandard2DMultisampleBlockShape{ residencyStandard2DMultisampleBlockShape_ }\n      , residencyStandard3DBlockShape{ residencyStandard3DBlockShape_ }\n      , residencyAlignedMipSize{ residencyAlignedMipSize_ }\n      , residencyNonResidentStrict{ residencyNonResidentStrict_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSparseProperties( PhysicalDeviceSparseProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceSparseProperties( VkPhysicalDeviceSparseProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceSparseProperties( *reinterpret_cast<PhysicalDeviceSparseProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceSparseProperties & operator=( PhysicalDeviceSparseProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceSparseProperties & operator=( VkPhysicalDeviceSparseProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceSparseProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceSparseProperties *>( this );\n    }\n\n    operator VkPhysicalDeviceSparseProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceSparseProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( residencyStandard2DBlockShape,\n                       residencyStandard2DMultisampleBlockShape,\n                       residencyStandard3DBlockShape,\n                       residencyAlignedMipSize,\n                       residencyNonResidentStrict );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceSparseProperties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceSparseProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( residencyStandard2DBlockShape == rhs.residencyStandard2DBlockShape ) &&\n             ( residencyStandard2DMultisampleBlockShape == rhs.residencyStandard2DMultisampleBlockShape ) &&\n             ( residencyStandard3DBlockShape == rhs.residencyStandard3DBlockShape ) && ( residencyAlignedMipSize == rhs.residencyAlignedMipSize ) &&\n             ( residencyNonResidentStrict == rhs.residencyNonResidentStrict );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceSparseProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::Bool32 residencyStandard2DBlockShape            = {};\n    VULKAN_HPP_NAMESPACE::Bool32 residencyStandard2DMultisampleBlockShape = {};\n    VULKAN_HPP_NAMESPACE::Bool32 residencyStandard3DBlockShape            = {};\n    VULKAN_HPP_NAMESPACE::Bool32 residencyAlignedMipSize                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32 residencyNonResidentStrict               = {};\n  };\n\n  struct PhysicalDeviceProperties\n  {\n    using NativeType = VkPhysicalDeviceProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceProperties( uint32_t                                 apiVersion_    = {},\n                                                      uint32_t                                 driverVersion_ = {},\n                                                      uint32_t                                 vendorID_      = {},\n                                                      uint32_t                                 deviceID_      = {},\n                                                      VULKAN_HPP_NAMESPACE::PhysicalDeviceType deviceType_ = VULKAN_HPP_NAMESPACE::PhysicalDeviceType::eOther,\n                                                      std::array<char, VK_MAX_PHYSICAL_DEVICE_NAME_SIZE> const & deviceName_        = {},\n                                                      std::array<uint8_t, VK_UUID_SIZE> const &                  pipelineCacheUUID_ = {},\n                                                      VULKAN_HPP_NAMESPACE::PhysicalDeviceLimits                 limits_            = {},\n                                                      VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseProperties       sparseProperties_  = {} ) VULKAN_HPP_NOEXCEPT\n      : apiVersion{ apiVersion_ }\n      , driverVersion{ driverVersion_ }\n      , vendorID{ vendorID_ }\n      , deviceID{ deviceID_ }\n      , deviceType{ deviceType_ }\n      , deviceName{ deviceName_ }\n      , pipelineCacheUUID{ pipelineCacheUUID_ }\n      , limits{ limits_ }\n      , sparseProperties{ sparseProperties_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceProperties( PhysicalDeviceProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceProperties( VkPhysicalDeviceProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceProperties( *reinterpret_cast<PhysicalDeviceProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceProperties & operator=( PhysicalDeviceProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceProperties & operator=( VkPhysicalDeviceProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceProperties *>( this );\n    }\n\n    operator VkPhysicalDeviceProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::PhysicalDeviceType const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_PHYSICAL_DEVICE_NAME_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::PhysicalDeviceLimits const &,\n               VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseProperties const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( apiVersion, driverVersion, vendorID, deviceID, deviceType, deviceName, pipelineCacheUUID, limits, sparseProperties );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::partial_ordering operator<=>( PhysicalDeviceProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = apiVersion <=> rhs.apiVersion; cmp != 0 )\n        return cmp;\n      if ( auto cmp = driverVersion <=> rhs.driverVersion; cmp != 0 )\n        return cmp;\n      if ( auto cmp = vendorID <=> rhs.vendorID; cmp != 0 )\n        return cmp;\n      if ( auto cmp = deviceID <=> rhs.deviceID; cmp != 0 )\n        return cmp;\n      if ( auto cmp = deviceType <=> rhs.deviceType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = strcmp( deviceName, rhs.deviceName ); cmp != 0 )\n        return ( cmp < 0 ) ? std::partial_ordering::less : std::partial_ordering::greater;\n      if ( auto cmp = pipelineCacheUUID <=> rhs.pipelineCacheUUID; cmp != 0 )\n        return cmp;\n      if ( auto cmp = limits <=> rhs.limits; cmp != 0 )\n        return cmp;\n      if ( auto cmp = sparseProperties <=> rhs.sparseProperties; cmp != 0 )\n        return cmp;\n\n      return std::partial_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( PhysicalDeviceProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( apiVersion == rhs.apiVersion ) && ( driverVersion == rhs.driverVersion ) && ( vendorID == rhs.vendorID ) && ( deviceID == rhs.deviceID ) &&\n             ( deviceType == rhs.deviceType ) && ( strcmp( deviceName, rhs.deviceName ) == 0 ) && ( pipelineCacheUUID == rhs.pipelineCacheUUID ) &&\n             ( limits == rhs.limits ) && ( sparseProperties == rhs.sparseProperties );\n    }\n\n    bool operator!=( PhysicalDeviceProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    uint32_t                                                                     apiVersion        = {};\n    uint32_t                                                                     driverVersion     = {};\n    uint32_t                                                                     vendorID          = {};\n    uint32_t                                                                     deviceID          = {};\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceType                                     deviceType        = VULKAN_HPP_NAMESPACE::PhysicalDeviceType::eOther;\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_PHYSICAL_DEVICE_NAME_SIZE> deviceName        = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE>                  pipelineCacheUUID = {};\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceLimits                                   limits            = {};\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseProperties                         sparseProperties  = {};\n  };\n\n  struct PhysicalDeviceProperties2\n  {\n    using NativeType = VkPhysicalDeviceProperties2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceProperties2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceProperties2( VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties properties_ = {},\n                                                       void *                                         pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , properties{ properties_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceProperties2( PhysicalDeviceProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceProperties2( VkPhysicalDeviceProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceProperties2( *reinterpret_cast<PhysicalDeviceProperties2 const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceProperties2 & operator=( PhysicalDeviceProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceProperties2 & operator=( VkPhysicalDeviceProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceProperties2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceProperties2 *>( this );\n    }\n\n    operator VkPhysicalDeviceProperties2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceProperties2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, properties );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceProperties2 const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceProperties2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( properties == rhs.properties );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceProperties2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType            sType      = StructureType::ePhysicalDeviceProperties2;\n    void *                                         pNext      = {};\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties properties = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceProperties2>\n  {\n    using Type = PhysicalDeviceProperties2;\n  };\n\n  using PhysicalDeviceProperties2KHR = PhysicalDeviceProperties2;\n\n  struct PhysicalDeviceLayeredApiVulkanPropertiesKHR\n  {\n    using NativeType = VkPhysicalDeviceLayeredApiVulkanPropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceLayeredApiVulkanPropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLayeredApiVulkanPropertiesKHR( VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 properties_ = {},\n                                                                         void *                                          pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , properties{ properties_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14\n      PhysicalDeviceLayeredApiVulkanPropertiesKHR( PhysicalDeviceLayeredApiVulkanPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceLayeredApiVulkanPropertiesKHR( VkPhysicalDeviceLayeredApiVulkanPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceLayeredApiVulkanPropertiesKHR( *reinterpret_cast<PhysicalDeviceLayeredApiVulkanPropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceLayeredApiVulkanPropertiesKHR & operator=( PhysicalDeviceLayeredApiVulkanPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceLayeredApiVulkanPropertiesKHR & operator=( VkPhysicalDeviceLayeredApiVulkanPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredApiVulkanPropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceLayeredApiVulkanPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceLayeredApiVulkanPropertiesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceLayeredApiVulkanPropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceLayeredApiVulkanPropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, properties );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceLayeredApiVulkanPropertiesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceLayeredApiVulkanPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( properties == rhs.properties );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceLayeredApiVulkanPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType             sType      = StructureType::ePhysicalDeviceLayeredApiVulkanPropertiesKHR;\n    void *                                          pNext      = {};\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 properties = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceLayeredApiVulkanPropertiesKHR>\n  {\n    using Type = PhysicalDeviceLayeredApiVulkanPropertiesKHR;\n  };\n\n  struct PhysicalDeviceLayeredDriverPropertiesMSFT\n  {\n    using NativeType = VkPhysicalDeviceLayeredDriverPropertiesMSFT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceLayeredDriverPropertiesMSFT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceLayeredDriverPropertiesMSFT(\n      VULKAN_HPP_NAMESPACE::LayeredDriverUnderlyingApiMSFT underlyingAPI_ = VULKAN_HPP_NAMESPACE::LayeredDriverUnderlyingApiMSFT::eNone,\n      void *                                               pNext_         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , underlyingAPI{ underlyingAPI_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceLayeredDriverPropertiesMSFT( PhysicalDeviceLayeredDriverPropertiesMSFT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceLayeredDriverPropertiesMSFT( VkPhysicalDeviceLayeredDriverPropertiesMSFT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceLayeredDriverPropertiesMSFT( *reinterpret_cast<PhysicalDeviceLayeredDriverPropertiesMSFT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceLayeredDriverPropertiesMSFT & operator=( PhysicalDeviceLayeredDriverPropertiesMSFT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceLayeredDriverPropertiesMSFT & operator=( VkPhysicalDeviceLayeredDriverPropertiesMSFT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceLayeredDriverPropertiesMSFT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceLayeredDriverPropertiesMSFT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceLayeredDriverPropertiesMSFT *>( this );\n    }\n\n    operator VkPhysicalDeviceLayeredDriverPropertiesMSFT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceLayeredDriverPropertiesMSFT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::LayeredDriverUnderlyingApiMSFT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, underlyingAPI );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceLayeredDriverPropertiesMSFT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceLayeredDriverPropertiesMSFT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( underlyingAPI == rhs.underlyingAPI );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceLayeredDriverPropertiesMSFT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                  sType         = StructureType::ePhysicalDeviceLayeredDriverPropertiesMSFT;\n    void *                                               pNext         = {};\n    VULKAN_HPP_NAMESPACE::LayeredDriverUnderlyingApiMSFT underlyingAPI = VULKAN_HPP_NAMESPACE::LayeredDriverUnderlyingApiMSFT::eNone;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceLayeredDriverPropertiesMSFT>\n  {\n    using Type = PhysicalDeviceLayeredDriverPropertiesMSFT;\n  };\n\n  struct PhysicalDeviceLegacyDitheringFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceLegacyDitheringFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceLegacyDitheringFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceLegacyDitheringFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 legacyDithering_ = {},\n                                                                   void *                       pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , legacyDithering{ legacyDithering_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceLegacyDitheringFeaturesEXT( PhysicalDeviceLegacyDitheringFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceLegacyDitheringFeaturesEXT( VkPhysicalDeviceLegacyDitheringFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceLegacyDitheringFeaturesEXT( *reinterpret_cast<PhysicalDeviceLegacyDitheringFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceLegacyDitheringFeaturesEXT & operator=( PhysicalDeviceLegacyDitheringFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceLegacyDitheringFeaturesEXT & operator=( VkPhysicalDeviceLegacyDitheringFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceLegacyDitheringFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLegacyDitheringFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLegacyDitheringFeaturesEXT & setLegacyDithering( VULKAN_HPP_NAMESPACE::Bool32 legacyDithering_ ) VULKAN_HPP_NOEXCEPT\n    {\n      legacyDithering = legacyDithering_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceLegacyDitheringFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceLegacyDitheringFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceLegacyDitheringFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceLegacyDitheringFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, legacyDithering );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceLegacyDitheringFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceLegacyDitheringFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( legacyDithering == rhs.legacyDithering );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceLegacyDitheringFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType           = StructureType::ePhysicalDeviceLegacyDitheringFeaturesEXT;\n    void *                              pNext           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        legacyDithering = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceLegacyDitheringFeaturesEXT>\n  {\n    using Type = PhysicalDeviceLegacyDitheringFeaturesEXT;\n  };\n\n  struct PhysicalDeviceLegacyVertexAttributesFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceLegacyVertexAttributesFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceLegacyVertexAttributesFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 legacyVertexAttributes_ = {},\n                                                                          void *                       pNext_                  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , legacyVertexAttributes{ legacyVertexAttributes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceLegacyVertexAttributesFeaturesEXT( PhysicalDeviceLegacyVertexAttributesFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceLegacyVertexAttributesFeaturesEXT( VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceLegacyVertexAttributesFeaturesEXT( *reinterpret_cast<PhysicalDeviceLegacyVertexAttributesFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceLegacyVertexAttributesFeaturesEXT & operator=( PhysicalDeviceLegacyVertexAttributesFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceLegacyVertexAttributesFeaturesEXT & operator=( VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceLegacyVertexAttributesFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLegacyVertexAttributesFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLegacyVertexAttributesFeaturesEXT &\n      setLegacyVertexAttributes( VULKAN_HPP_NAMESPACE::Bool32 legacyVertexAttributes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      legacyVertexAttributes = legacyVertexAttributes_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceLegacyVertexAttributesFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, legacyVertexAttributes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceLegacyVertexAttributesFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceLegacyVertexAttributesFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( legacyVertexAttributes == rhs.legacyVertexAttributes );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceLegacyVertexAttributesFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                  = StructureType::ePhysicalDeviceLegacyVertexAttributesFeaturesEXT;\n    void *                              pNext                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        legacyVertexAttributes = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceLegacyVertexAttributesFeaturesEXT>\n  {\n    using Type = PhysicalDeviceLegacyVertexAttributesFeaturesEXT;\n  };\n\n  struct PhysicalDeviceLegacyVertexAttributesPropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceLegacyVertexAttributesPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceLegacyVertexAttributesPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceLegacyVertexAttributesPropertiesEXT( VULKAN_HPP_NAMESPACE::Bool32 nativeUnalignedPerformance_ = {},\n                                                                            void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , nativeUnalignedPerformance{ nativeUnalignedPerformance_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceLegacyVertexAttributesPropertiesEXT( PhysicalDeviceLegacyVertexAttributesPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceLegacyVertexAttributesPropertiesEXT( VkPhysicalDeviceLegacyVertexAttributesPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceLegacyVertexAttributesPropertiesEXT( *reinterpret_cast<PhysicalDeviceLegacyVertexAttributesPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceLegacyVertexAttributesPropertiesEXT &\n      operator=( PhysicalDeviceLegacyVertexAttributesPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceLegacyVertexAttributesPropertiesEXT & operator=( VkPhysicalDeviceLegacyVertexAttributesPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceLegacyVertexAttributesPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLegacyVertexAttributesPropertiesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLegacyVertexAttributesPropertiesEXT &\n      setNativeUnalignedPerformance( VULKAN_HPP_NAMESPACE::Bool32 nativeUnalignedPerformance_ ) VULKAN_HPP_NOEXCEPT\n    {\n      nativeUnalignedPerformance = nativeUnalignedPerformance_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceLegacyVertexAttributesPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceLegacyVertexAttributesPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceLegacyVertexAttributesPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceLegacyVertexAttributesPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, nativeUnalignedPerformance );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceLegacyVertexAttributesPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceLegacyVertexAttributesPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( nativeUnalignedPerformance == rhs.nativeUnalignedPerformance );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceLegacyVertexAttributesPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                      = StructureType::ePhysicalDeviceLegacyVertexAttributesPropertiesEXT;\n    void *                              pNext                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        nativeUnalignedPerformance = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceLegacyVertexAttributesPropertiesEXT>\n  {\n    using Type = PhysicalDeviceLegacyVertexAttributesPropertiesEXT;\n  };\n\n  struct PhysicalDeviceLineRasterizationFeatures\n  {\n    using NativeType = VkPhysicalDeviceLineRasterizationFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceLineRasterizationFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceLineRasterizationFeatures( VULKAN_HPP_NAMESPACE::Bool32 rectangularLines_         = {},\n                                                                  VULKAN_HPP_NAMESPACE::Bool32 bresenhamLines_           = {},\n                                                                  VULKAN_HPP_NAMESPACE::Bool32 smoothLines_              = {},\n                                                                  VULKAN_HPP_NAMESPACE::Bool32 stippledRectangularLines_ = {},\n                                                                  VULKAN_HPP_NAMESPACE::Bool32 stippledBresenhamLines_   = {},\n                                                                  VULKAN_HPP_NAMESPACE::Bool32 stippledSmoothLines_      = {},\n                                                                  void *                       pNext_                    = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , rectangularLines{ rectangularLines_ }\n      , bresenhamLines{ bresenhamLines_ }\n      , smoothLines{ smoothLines_ }\n      , stippledRectangularLines{ stippledRectangularLines_ }\n      , stippledBresenhamLines{ stippledBresenhamLines_ }\n      , stippledSmoothLines{ stippledSmoothLines_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceLineRasterizationFeatures( PhysicalDeviceLineRasterizationFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceLineRasterizationFeatures( VkPhysicalDeviceLineRasterizationFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceLineRasterizationFeatures( *reinterpret_cast<PhysicalDeviceLineRasterizationFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceLineRasterizationFeatures & operator=( PhysicalDeviceLineRasterizationFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceLineRasterizationFeatures & operator=( VkPhysicalDeviceLineRasterizationFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceLineRasterizationFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLineRasterizationFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLineRasterizationFeatures & setRectangularLines( VULKAN_HPP_NAMESPACE::Bool32 rectangularLines_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rectangularLines = rectangularLines_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLineRasterizationFeatures & setBresenhamLines( VULKAN_HPP_NAMESPACE::Bool32 bresenhamLines_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bresenhamLines = bresenhamLines_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLineRasterizationFeatures & setSmoothLines( VULKAN_HPP_NAMESPACE::Bool32 smoothLines_ ) VULKAN_HPP_NOEXCEPT\n    {\n      smoothLines = smoothLines_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLineRasterizationFeatures &\n      setStippledRectangularLines( VULKAN_HPP_NAMESPACE::Bool32 stippledRectangularLines_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stippledRectangularLines = stippledRectangularLines_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLineRasterizationFeatures &\n      setStippledBresenhamLines( VULKAN_HPP_NAMESPACE::Bool32 stippledBresenhamLines_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stippledBresenhamLines = stippledBresenhamLines_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLineRasterizationFeatures &\n      setStippledSmoothLines( VULKAN_HPP_NAMESPACE::Bool32 stippledSmoothLines_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stippledSmoothLines = stippledSmoothLines_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceLineRasterizationFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceLineRasterizationFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceLineRasterizationFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceLineRasterizationFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, rectangularLines, bresenhamLines, smoothLines, stippledRectangularLines, stippledBresenhamLines, stippledSmoothLines );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceLineRasterizationFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceLineRasterizationFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( rectangularLines == rhs.rectangularLines ) && ( bresenhamLines == rhs.bresenhamLines ) &&\n             ( smoothLines == rhs.smoothLines ) && ( stippledRectangularLines == rhs.stippledRectangularLines ) &&\n             ( stippledBresenhamLines == rhs.stippledBresenhamLines ) && ( stippledSmoothLines == rhs.stippledSmoothLines );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceLineRasterizationFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                    = StructureType::ePhysicalDeviceLineRasterizationFeatures;\n    void *                              pNext                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        rectangularLines         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        bresenhamLines           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        smoothLines              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        stippledRectangularLines = {};\n    VULKAN_HPP_NAMESPACE::Bool32        stippledBresenhamLines   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        stippledSmoothLines      = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceLineRasterizationFeatures>\n  {\n    using Type = PhysicalDeviceLineRasterizationFeatures;\n  };\n\n  using PhysicalDeviceLineRasterizationFeaturesEXT = PhysicalDeviceLineRasterizationFeatures;\n  using PhysicalDeviceLineRasterizationFeaturesKHR = PhysicalDeviceLineRasterizationFeatures;\n\n  struct PhysicalDeviceLineRasterizationProperties\n  {\n    using NativeType = VkPhysicalDeviceLineRasterizationProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceLineRasterizationProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceLineRasterizationProperties( uint32_t lineSubPixelPrecisionBits_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , lineSubPixelPrecisionBits{ lineSubPixelPrecisionBits_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceLineRasterizationProperties( PhysicalDeviceLineRasterizationProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceLineRasterizationProperties( VkPhysicalDeviceLineRasterizationProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceLineRasterizationProperties( *reinterpret_cast<PhysicalDeviceLineRasterizationProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceLineRasterizationProperties & operator=( PhysicalDeviceLineRasterizationProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceLineRasterizationProperties & operator=( VkPhysicalDeviceLineRasterizationProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceLineRasterizationProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceLineRasterizationProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceLineRasterizationProperties *>( this );\n    }\n\n    operator VkPhysicalDeviceLineRasterizationProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceLineRasterizationProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, lineSubPixelPrecisionBits );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceLineRasterizationProperties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceLineRasterizationProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( lineSubPixelPrecisionBits == rhs.lineSubPixelPrecisionBits );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceLineRasterizationProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                     = StructureType::ePhysicalDeviceLineRasterizationProperties;\n    void *                              pNext                     = {};\n    uint32_t                            lineSubPixelPrecisionBits = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceLineRasterizationProperties>\n  {\n    using Type = PhysicalDeviceLineRasterizationProperties;\n  };\n\n  using PhysicalDeviceLineRasterizationPropertiesEXT = PhysicalDeviceLineRasterizationProperties;\n  using PhysicalDeviceLineRasterizationPropertiesKHR = PhysicalDeviceLineRasterizationProperties;\n\n  struct PhysicalDeviceLinearColorAttachmentFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceLinearColorAttachmentFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceLinearColorAttachmentFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceLinearColorAttachmentFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 linearColorAttachment_ = {},\n                                                                        void *                       pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , linearColorAttachment{ linearColorAttachment_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceLinearColorAttachmentFeaturesNV( PhysicalDeviceLinearColorAttachmentFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceLinearColorAttachmentFeaturesNV( VkPhysicalDeviceLinearColorAttachmentFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceLinearColorAttachmentFeaturesNV( *reinterpret_cast<PhysicalDeviceLinearColorAttachmentFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceLinearColorAttachmentFeaturesNV & operator=( PhysicalDeviceLinearColorAttachmentFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceLinearColorAttachmentFeaturesNV & operator=( VkPhysicalDeviceLinearColorAttachmentFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceLinearColorAttachmentFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLinearColorAttachmentFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceLinearColorAttachmentFeaturesNV &\n      setLinearColorAttachment( VULKAN_HPP_NAMESPACE::Bool32 linearColorAttachment_ ) VULKAN_HPP_NOEXCEPT\n    {\n      linearColorAttachment = linearColorAttachment_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceLinearColorAttachmentFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceLinearColorAttachmentFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceLinearColorAttachmentFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceLinearColorAttachmentFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, linearColorAttachment );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceLinearColorAttachmentFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceLinearColorAttachmentFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( linearColorAttachment == rhs.linearColorAttachment );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceLinearColorAttachmentFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                 = StructureType::ePhysicalDeviceLinearColorAttachmentFeaturesNV;\n    void *                              pNext                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        linearColorAttachment = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceLinearColorAttachmentFeaturesNV>\n  {\n    using Type = PhysicalDeviceLinearColorAttachmentFeaturesNV;\n  };\n\n  struct PhysicalDeviceMaintenance3Properties\n  {\n    using NativeType = VkPhysicalDeviceMaintenance3Properties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMaintenance3Properties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMaintenance3Properties( uint32_t                         maxPerSetDescriptors_    = {},\n                                                               VULKAN_HPP_NAMESPACE::DeviceSize maxMemoryAllocationSize_ = {},\n                                                               void *                           pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxPerSetDescriptors{ maxPerSetDescriptors_ }\n      , maxMemoryAllocationSize{ maxMemoryAllocationSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMaintenance3Properties( PhysicalDeviceMaintenance3Properties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMaintenance3Properties( VkPhysicalDeviceMaintenance3Properties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMaintenance3Properties( *reinterpret_cast<PhysicalDeviceMaintenance3Properties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMaintenance3Properties & operator=( PhysicalDeviceMaintenance3Properties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMaintenance3Properties & operator=( VkPhysicalDeviceMaintenance3Properties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance3Properties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceMaintenance3Properties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMaintenance3Properties *>( this );\n    }\n\n    operator VkPhysicalDeviceMaintenance3Properties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMaintenance3Properties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &, VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxPerSetDescriptors, maxMemoryAllocationSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMaintenance3Properties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMaintenance3Properties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxPerSetDescriptors == rhs.maxPerSetDescriptors ) &&\n             ( maxMemoryAllocationSize == rhs.maxMemoryAllocationSize );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMaintenance3Properties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                   = StructureType::ePhysicalDeviceMaintenance3Properties;\n    void *                              pNext                   = {};\n    uint32_t                            maxPerSetDescriptors    = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    maxMemoryAllocationSize = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMaintenance3Properties>\n  {\n    using Type = PhysicalDeviceMaintenance3Properties;\n  };\n\n  using PhysicalDeviceMaintenance3PropertiesKHR = PhysicalDeviceMaintenance3Properties;\n\n  struct PhysicalDeviceMaintenance4Features\n  {\n    using NativeType = VkPhysicalDeviceMaintenance4Features;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMaintenance4Features;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMaintenance4Features( VULKAN_HPP_NAMESPACE::Bool32 maintenance4_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maintenance4{ maintenance4_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMaintenance4Features( PhysicalDeviceMaintenance4Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMaintenance4Features( VkPhysicalDeviceMaintenance4Features const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMaintenance4Features( *reinterpret_cast<PhysicalDeviceMaintenance4Features const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMaintenance4Features & operator=( PhysicalDeviceMaintenance4Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMaintenance4Features & operator=( VkPhysicalDeviceMaintenance4Features const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance4Features const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMaintenance4Features & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMaintenance4Features & setMaintenance4( VULKAN_HPP_NAMESPACE::Bool32 maintenance4_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maintenance4 = maintenance4_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceMaintenance4Features const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMaintenance4Features *>( this );\n    }\n\n    operator VkPhysicalDeviceMaintenance4Features &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMaintenance4Features *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maintenance4 );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMaintenance4Features const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMaintenance4Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maintenance4 == rhs.maintenance4 );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMaintenance4Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType        = StructureType::ePhysicalDeviceMaintenance4Features;\n    void *                              pNext        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        maintenance4 = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMaintenance4Features>\n  {\n    using Type = PhysicalDeviceMaintenance4Features;\n  };\n\n  using PhysicalDeviceMaintenance4FeaturesKHR = PhysicalDeviceMaintenance4Features;\n\n  struct PhysicalDeviceMaintenance4Properties\n  {\n    using NativeType = VkPhysicalDeviceMaintenance4Properties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMaintenance4Properties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMaintenance4Properties( VULKAN_HPP_NAMESPACE::DeviceSize maxBufferSize_ = {},\n                                                               void *                           pNext_         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxBufferSize{ maxBufferSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMaintenance4Properties( PhysicalDeviceMaintenance4Properties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMaintenance4Properties( VkPhysicalDeviceMaintenance4Properties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMaintenance4Properties( *reinterpret_cast<PhysicalDeviceMaintenance4Properties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMaintenance4Properties & operator=( PhysicalDeviceMaintenance4Properties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMaintenance4Properties & operator=( VkPhysicalDeviceMaintenance4Properties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance4Properties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceMaintenance4Properties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMaintenance4Properties *>( this );\n    }\n\n    operator VkPhysicalDeviceMaintenance4Properties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMaintenance4Properties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxBufferSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMaintenance4Properties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMaintenance4Properties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxBufferSize == rhs.maxBufferSize );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMaintenance4Properties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType         = StructureType::ePhysicalDeviceMaintenance4Properties;\n    void *                              pNext         = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    maxBufferSize = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMaintenance4Properties>\n  {\n    using Type = PhysicalDeviceMaintenance4Properties;\n  };\n\n  using PhysicalDeviceMaintenance4PropertiesKHR = PhysicalDeviceMaintenance4Properties;\n\n  struct PhysicalDeviceMaintenance5Features\n  {\n    using NativeType = VkPhysicalDeviceMaintenance5Features;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMaintenance5Features;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMaintenance5Features( VULKAN_HPP_NAMESPACE::Bool32 maintenance5_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maintenance5{ maintenance5_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMaintenance5Features( PhysicalDeviceMaintenance5Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMaintenance5Features( VkPhysicalDeviceMaintenance5Features const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMaintenance5Features( *reinterpret_cast<PhysicalDeviceMaintenance5Features const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMaintenance5Features & operator=( PhysicalDeviceMaintenance5Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMaintenance5Features & operator=( VkPhysicalDeviceMaintenance5Features const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance5Features const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMaintenance5Features & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMaintenance5Features & setMaintenance5( VULKAN_HPP_NAMESPACE::Bool32 maintenance5_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maintenance5 = maintenance5_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceMaintenance5Features const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMaintenance5Features *>( this );\n    }\n\n    operator VkPhysicalDeviceMaintenance5Features &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMaintenance5Features *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maintenance5 );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMaintenance5Features const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMaintenance5Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maintenance5 == rhs.maintenance5 );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMaintenance5Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType        = StructureType::ePhysicalDeviceMaintenance5Features;\n    void *                              pNext        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        maintenance5 = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMaintenance5Features>\n  {\n    using Type = PhysicalDeviceMaintenance5Features;\n  };\n\n  using PhysicalDeviceMaintenance5FeaturesKHR = PhysicalDeviceMaintenance5Features;\n\n  struct PhysicalDeviceMaintenance5Properties\n  {\n    using NativeType = VkPhysicalDeviceMaintenance5Properties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMaintenance5Properties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMaintenance5Properties( VULKAN_HPP_NAMESPACE::Bool32 earlyFragmentMultisampleCoverageAfterSampleCounting_ = {},\n                                                               VULKAN_HPP_NAMESPACE::Bool32 earlyFragmentSampleMaskTestBeforeSampleCounting_     = {},\n                                                               VULKAN_HPP_NAMESPACE::Bool32 depthStencilSwizzleOneSupport_                       = {},\n                                                               VULKAN_HPP_NAMESPACE::Bool32 polygonModePointSize_                                = {},\n                                                               VULKAN_HPP_NAMESPACE::Bool32 nonStrictSinglePixelWideLinesUseParallelogram_       = {},\n                                                               VULKAN_HPP_NAMESPACE::Bool32 nonStrictWideLinesUseParallelogram_                  = {},\n                                                               void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , earlyFragmentMultisampleCoverageAfterSampleCounting{ earlyFragmentMultisampleCoverageAfterSampleCounting_ }\n      , earlyFragmentSampleMaskTestBeforeSampleCounting{ earlyFragmentSampleMaskTestBeforeSampleCounting_ }\n      , depthStencilSwizzleOneSupport{ depthStencilSwizzleOneSupport_ }\n      , polygonModePointSize{ polygonModePointSize_ }\n      , nonStrictSinglePixelWideLinesUseParallelogram{ nonStrictSinglePixelWideLinesUseParallelogram_ }\n      , nonStrictWideLinesUseParallelogram{ nonStrictWideLinesUseParallelogram_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMaintenance5Properties( PhysicalDeviceMaintenance5Properties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMaintenance5Properties( VkPhysicalDeviceMaintenance5Properties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMaintenance5Properties( *reinterpret_cast<PhysicalDeviceMaintenance5Properties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMaintenance5Properties & operator=( PhysicalDeviceMaintenance5Properties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMaintenance5Properties & operator=( VkPhysicalDeviceMaintenance5Properties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance5Properties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceMaintenance5Properties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMaintenance5Properties *>( this );\n    }\n\n    operator VkPhysicalDeviceMaintenance5Properties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMaintenance5Properties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       earlyFragmentMultisampleCoverageAfterSampleCounting,\n                       earlyFragmentSampleMaskTestBeforeSampleCounting,\n                       depthStencilSwizzleOneSupport,\n                       polygonModePointSize,\n                       nonStrictSinglePixelWideLinesUseParallelogram,\n                       nonStrictWideLinesUseParallelogram );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMaintenance5Properties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMaintenance5Properties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) &&\n             ( earlyFragmentMultisampleCoverageAfterSampleCounting == rhs.earlyFragmentMultisampleCoverageAfterSampleCounting ) &&\n             ( earlyFragmentSampleMaskTestBeforeSampleCounting == rhs.earlyFragmentSampleMaskTestBeforeSampleCounting ) &&\n             ( depthStencilSwizzleOneSupport == rhs.depthStencilSwizzleOneSupport ) && ( polygonModePointSize == rhs.polygonModePointSize ) &&\n             ( nonStrictSinglePixelWideLinesUseParallelogram == rhs.nonStrictSinglePixelWideLinesUseParallelogram ) &&\n             ( nonStrictWideLinesUseParallelogram == rhs.nonStrictWideLinesUseParallelogram );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMaintenance5Properties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                               = StructureType::ePhysicalDeviceMaintenance5Properties;\n    void *                              pNext                                               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        earlyFragmentMultisampleCoverageAfterSampleCounting = {};\n    VULKAN_HPP_NAMESPACE::Bool32        earlyFragmentSampleMaskTestBeforeSampleCounting     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        depthStencilSwizzleOneSupport                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        polygonModePointSize                                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        nonStrictSinglePixelWideLinesUseParallelogram       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        nonStrictWideLinesUseParallelogram                  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMaintenance5Properties>\n  {\n    using Type = PhysicalDeviceMaintenance5Properties;\n  };\n\n  using PhysicalDeviceMaintenance5PropertiesKHR = PhysicalDeviceMaintenance5Properties;\n\n  struct PhysicalDeviceMaintenance6Features\n  {\n    using NativeType = VkPhysicalDeviceMaintenance6Features;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMaintenance6Features;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMaintenance6Features( VULKAN_HPP_NAMESPACE::Bool32 maintenance6_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maintenance6{ maintenance6_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMaintenance6Features( PhysicalDeviceMaintenance6Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMaintenance6Features( VkPhysicalDeviceMaintenance6Features const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMaintenance6Features( *reinterpret_cast<PhysicalDeviceMaintenance6Features const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMaintenance6Features & operator=( PhysicalDeviceMaintenance6Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMaintenance6Features & operator=( VkPhysicalDeviceMaintenance6Features const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance6Features const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMaintenance6Features & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMaintenance6Features & setMaintenance6( VULKAN_HPP_NAMESPACE::Bool32 maintenance6_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maintenance6 = maintenance6_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceMaintenance6Features const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMaintenance6Features *>( this );\n    }\n\n    operator VkPhysicalDeviceMaintenance6Features &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMaintenance6Features *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maintenance6 );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMaintenance6Features const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMaintenance6Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maintenance6 == rhs.maintenance6 );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMaintenance6Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType        = StructureType::ePhysicalDeviceMaintenance6Features;\n    void *                              pNext        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        maintenance6 = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMaintenance6Features>\n  {\n    using Type = PhysicalDeviceMaintenance6Features;\n  };\n\n  using PhysicalDeviceMaintenance6FeaturesKHR = PhysicalDeviceMaintenance6Features;\n\n  struct PhysicalDeviceMaintenance6Properties\n  {\n    using NativeType = VkPhysicalDeviceMaintenance6Properties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMaintenance6Properties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMaintenance6Properties( VULKAN_HPP_NAMESPACE::Bool32 blockTexelViewCompatibleMultipleLayers_ = {},\n                                                               uint32_t                     maxCombinedImageSamplerDescriptorCount_ = {},\n                                                               VULKAN_HPP_NAMESPACE::Bool32 fragmentShadingRateClampCombinerInputs_ = {},\n                                                               void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , blockTexelViewCompatibleMultipleLayers{ blockTexelViewCompatibleMultipleLayers_ }\n      , maxCombinedImageSamplerDescriptorCount{ maxCombinedImageSamplerDescriptorCount_ }\n      , fragmentShadingRateClampCombinerInputs{ fragmentShadingRateClampCombinerInputs_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMaintenance6Properties( PhysicalDeviceMaintenance6Properties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMaintenance6Properties( VkPhysicalDeviceMaintenance6Properties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMaintenance6Properties( *reinterpret_cast<PhysicalDeviceMaintenance6Properties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMaintenance6Properties & operator=( PhysicalDeviceMaintenance6Properties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMaintenance6Properties & operator=( VkPhysicalDeviceMaintenance6Properties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance6Properties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceMaintenance6Properties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMaintenance6Properties *>( this );\n    }\n\n    operator VkPhysicalDeviceMaintenance6Properties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMaintenance6Properties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, blockTexelViewCompatibleMultipleLayers, maxCombinedImageSamplerDescriptorCount, fragmentShadingRateClampCombinerInputs );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMaintenance6Properties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMaintenance6Properties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( blockTexelViewCompatibleMultipleLayers == rhs.blockTexelViewCompatibleMultipleLayers ) &&\n             ( maxCombinedImageSamplerDescriptorCount == rhs.maxCombinedImageSamplerDescriptorCount ) &&\n             ( fragmentShadingRateClampCombinerInputs == rhs.fragmentShadingRateClampCombinerInputs );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMaintenance6Properties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                  = StructureType::ePhysicalDeviceMaintenance6Properties;\n    void *                              pNext                                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        blockTexelViewCompatibleMultipleLayers = {};\n    uint32_t                            maxCombinedImageSamplerDescriptorCount = {};\n    VULKAN_HPP_NAMESPACE::Bool32        fragmentShadingRateClampCombinerInputs = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMaintenance6Properties>\n  {\n    using Type = PhysicalDeviceMaintenance6Properties;\n  };\n\n  using PhysicalDeviceMaintenance6PropertiesKHR = PhysicalDeviceMaintenance6Properties;\n\n  struct PhysicalDeviceMaintenance7FeaturesKHR\n  {\n    using NativeType = VkPhysicalDeviceMaintenance7FeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMaintenance7FeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMaintenance7FeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 maintenance7_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maintenance7{ maintenance7_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMaintenance7FeaturesKHR( PhysicalDeviceMaintenance7FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMaintenance7FeaturesKHR( VkPhysicalDeviceMaintenance7FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMaintenance7FeaturesKHR( *reinterpret_cast<PhysicalDeviceMaintenance7FeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMaintenance7FeaturesKHR & operator=( PhysicalDeviceMaintenance7FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMaintenance7FeaturesKHR & operator=( VkPhysicalDeviceMaintenance7FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance7FeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMaintenance7FeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMaintenance7FeaturesKHR & setMaintenance7( VULKAN_HPP_NAMESPACE::Bool32 maintenance7_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maintenance7 = maintenance7_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceMaintenance7FeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMaintenance7FeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceMaintenance7FeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMaintenance7FeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maintenance7 );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMaintenance7FeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMaintenance7FeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maintenance7 == rhs.maintenance7 );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMaintenance7FeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType        = StructureType::ePhysicalDeviceMaintenance7FeaturesKHR;\n    void *                              pNext        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        maintenance7 = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMaintenance7FeaturesKHR>\n  {\n    using Type = PhysicalDeviceMaintenance7FeaturesKHR;\n  };\n\n  struct PhysicalDeviceMaintenance7PropertiesKHR\n  {\n    using NativeType = VkPhysicalDeviceMaintenance7PropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMaintenance7PropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMaintenance7PropertiesKHR( VULKAN_HPP_NAMESPACE::Bool32 robustFragmentShadingRateAttachmentAccess_                 = {},\n                                                                  VULKAN_HPP_NAMESPACE::Bool32 separateDepthStencilAttachmentAccess_                      = {},\n                                                                  uint32_t                     maxDescriptorSetTotalUniformBuffersDynamic_                = {},\n                                                                  uint32_t                     maxDescriptorSetTotalStorageBuffersDynamic_                = {},\n                                                                  uint32_t                     maxDescriptorSetTotalBuffersDynamic_                       = {},\n                                                                  uint32_t                     maxDescriptorSetUpdateAfterBindTotalUniformBuffersDynamic_ = {},\n                                                                  uint32_t                     maxDescriptorSetUpdateAfterBindTotalStorageBuffersDynamic_ = {},\n                                                                  uint32_t                     maxDescriptorSetUpdateAfterBindTotalBuffersDynamic_        = {},\n                                                                  void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , robustFragmentShadingRateAttachmentAccess{ robustFragmentShadingRateAttachmentAccess_ }\n      , separateDepthStencilAttachmentAccess{ separateDepthStencilAttachmentAccess_ }\n      , maxDescriptorSetTotalUniformBuffersDynamic{ maxDescriptorSetTotalUniformBuffersDynamic_ }\n      , maxDescriptorSetTotalStorageBuffersDynamic{ maxDescriptorSetTotalStorageBuffersDynamic_ }\n      , maxDescriptorSetTotalBuffersDynamic{ maxDescriptorSetTotalBuffersDynamic_ }\n      , maxDescriptorSetUpdateAfterBindTotalUniformBuffersDynamic{ maxDescriptorSetUpdateAfterBindTotalUniformBuffersDynamic_ }\n      , maxDescriptorSetUpdateAfterBindTotalStorageBuffersDynamic{ maxDescriptorSetUpdateAfterBindTotalStorageBuffersDynamic_ }\n      , maxDescriptorSetUpdateAfterBindTotalBuffersDynamic{ maxDescriptorSetUpdateAfterBindTotalBuffersDynamic_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMaintenance7PropertiesKHR( PhysicalDeviceMaintenance7PropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMaintenance7PropertiesKHR( VkPhysicalDeviceMaintenance7PropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMaintenance7PropertiesKHR( *reinterpret_cast<PhysicalDeviceMaintenance7PropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMaintenance7PropertiesKHR & operator=( PhysicalDeviceMaintenance7PropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMaintenance7PropertiesKHR & operator=( VkPhysicalDeviceMaintenance7PropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance7PropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceMaintenance7PropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMaintenance7PropertiesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceMaintenance7PropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMaintenance7PropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       robustFragmentShadingRateAttachmentAccess,\n                       separateDepthStencilAttachmentAccess,\n                       maxDescriptorSetTotalUniformBuffersDynamic,\n                       maxDescriptorSetTotalStorageBuffersDynamic,\n                       maxDescriptorSetTotalBuffersDynamic,\n                       maxDescriptorSetUpdateAfterBindTotalUniformBuffersDynamic,\n                       maxDescriptorSetUpdateAfterBindTotalStorageBuffersDynamic,\n                       maxDescriptorSetUpdateAfterBindTotalBuffersDynamic );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMaintenance7PropertiesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMaintenance7PropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) &&\n             ( robustFragmentShadingRateAttachmentAccess == rhs.robustFragmentShadingRateAttachmentAccess ) &&\n             ( separateDepthStencilAttachmentAccess == rhs.separateDepthStencilAttachmentAccess ) &&\n             ( maxDescriptorSetTotalUniformBuffersDynamic == rhs.maxDescriptorSetTotalUniformBuffersDynamic ) &&\n             ( maxDescriptorSetTotalStorageBuffersDynamic == rhs.maxDescriptorSetTotalStorageBuffersDynamic ) &&\n             ( maxDescriptorSetTotalBuffersDynamic == rhs.maxDescriptorSetTotalBuffersDynamic ) &&\n             ( maxDescriptorSetUpdateAfterBindTotalUniformBuffersDynamic == rhs.maxDescriptorSetUpdateAfterBindTotalUniformBuffersDynamic ) &&\n             ( maxDescriptorSetUpdateAfterBindTotalStorageBuffersDynamic == rhs.maxDescriptorSetUpdateAfterBindTotalStorageBuffersDynamic ) &&\n             ( maxDescriptorSetUpdateAfterBindTotalBuffersDynamic == rhs.maxDescriptorSetUpdateAfterBindTotalBuffersDynamic );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMaintenance7PropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                                     = StructureType::ePhysicalDeviceMaintenance7PropertiesKHR;\n    void *                              pNext                                                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        robustFragmentShadingRateAttachmentAccess                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        separateDepthStencilAttachmentAccess                      = {};\n    uint32_t                            maxDescriptorSetTotalUniformBuffersDynamic                = {};\n    uint32_t                            maxDescriptorSetTotalStorageBuffersDynamic                = {};\n    uint32_t                            maxDescriptorSetTotalBuffersDynamic                       = {};\n    uint32_t                            maxDescriptorSetUpdateAfterBindTotalUniformBuffersDynamic = {};\n    uint32_t                            maxDescriptorSetUpdateAfterBindTotalStorageBuffersDynamic = {};\n    uint32_t                            maxDescriptorSetUpdateAfterBindTotalBuffersDynamic        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMaintenance7PropertiesKHR>\n  {\n    using Type = PhysicalDeviceMaintenance7PropertiesKHR;\n  };\n\n  struct PhysicalDeviceMaintenance8FeaturesKHR\n  {\n    using NativeType = VkPhysicalDeviceMaintenance8FeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMaintenance8FeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMaintenance8FeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 maintenance8_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maintenance8{ maintenance8_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMaintenance8FeaturesKHR( PhysicalDeviceMaintenance8FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMaintenance8FeaturesKHR( VkPhysicalDeviceMaintenance8FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMaintenance8FeaturesKHR( *reinterpret_cast<PhysicalDeviceMaintenance8FeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMaintenance8FeaturesKHR & operator=( PhysicalDeviceMaintenance8FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMaintenance8FeaturesKHR & operator=( VkPhysicalDeviceMaintenance8FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance8FeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMaintenance8FeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMaintenance8FeaturesKHR & setMaintenance8( VULKAN_HPP_NAMESPACE::Bool32 maintenance8_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maintenance8 = maintenance8_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceMaintenance8FeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMaintenance8FeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceMaintenance8FeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMaintenance8FeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maintenance8 );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMaintenance8FeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMaintenance8FeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maintenance8 == rhs.maintenance8 );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMaintenance8FeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType        = StructureType::ePhysicalDeviceMaintenance8FeaturesKHR;\n    void *                              pNext        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        maintenance8 = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMaintenance8FeaturesKHR>\n  {\n    using Type = PhysicalDeviceMaintenance8FeaturesKHR;\n  };\n\n  struct PhysicalDeviceMapMemoryPlacedFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceMapMemoryPlacedFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMapMemoryPlacedFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMapMemoryPlacedFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 memoryMapPlaced_      = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 memoryMapRangePlaced_ = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 memoryUnmapReserve_   = {},\n                                                                   void *                       pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , memoryMapPlaced{ memoryMapPlaced_ }\n      , memoryMapRangePlaced{ memoryMapRangePlaced_ }\n      , memoryUnmapReserve{ memoryUnmapReserve_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMapMemoryPlacedFeaturesEXT( PhysicalDeviceMapMemoryPlacedFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMapMemoryPlacedFeaturesEXT( VkPhysicalDeviceMapMemoryPlacedFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMapMemoryPlacedFeaturesEXT( *reinterpret_cast<PhysicalDeviceMapMemoryPlacedFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMapMemoryPlacedFeaturesEXT & operator=( PhysicalDeviceMapMemoryPlacedFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMapMemoryPlacedFeaturesEXT & operator=( VkPhysicalDeviceMapMemoryPlacedFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMapMemoryPlacedFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMapMemoryPlacedFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMapMemoryPlacedFeaturesEXT & setMemoryMapPlaced( VULKAN_HPP_NAMESPACE::Bool32 memoryMapPlaced_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memoryMapPlaced = memoryMapPlaced_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMapMemoryPlacedFeaturesEXT &\n      setMemoryMapRangePlaced( VULKAN_HPP_NAMESPACE::Bool32 memoryMapRangePlaced_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memoryMapRangePlaced = memoryMapRangePlaced_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMapMemoryPlacedFeaturesEXT &\n      setMemoryUnmapReserve( VULKAN_HPP_NAMESPACE::Bool32 memoryUnmapReserve_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memoryUnmapReserve = memoryUnmapReserve_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceMapMemoryPlacedFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMapMemoryPlacedFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceMapMemoryPlacedFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMapMemoryPlacedFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, memoryMapPlaced, memoryMapRangePlaced, memoryUnmapReserve );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMapMemoryPlacedFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMapMemoryPlacedFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memoryMapPlaced == rhs.memoryMapPlaced ) &&\n             ( memoryMapRangePlaced == rhs.memoryMapRangePlaced ) && ( memoryUnmapReserve == rhs.memoryUnmapReserve );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMapMemoryPlacedFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                = StructureType::ePhysicalDeviceMapMemoryPlacedFeaturesEXT;\n    void *                              pNext                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        memoryMapPlaced      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        memoryMapRangePlaced = {};\n    VULKAN_HPP_NAMESPACE::Bool32        memoryUnmapReserve   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMapMemoryPlacedFeaturesEXT>\n  {\n    using Type = PhysicalDeviceMapMemoryPlacedFeaturesEXT;\n  };\n\n  struct PhysicalDeviceMapMemoryPlacedPropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceMapMemoryPlacedPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMapMemoryPlacedPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMapMemoryPlacedPropertiesEXT( VULKAN_HPP_NAMESPACE::DeviceSize minPlacedMemoryMapAlignment_ = {},\n                                                                     void *                           pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , minPlacedMemoryMapAlignment{ minPlacedMemoryMapAlignment_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMapMemoryPlacedPropertiesEXT( PhysicalDeviceMapMemoryPlacedPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMapMemoryPlacedPropertiesEXT( VkPhysicalDeviceMapMemoryPlacedPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMapMemoryPlacedPropertiesEXT( *reinterpret_cast<PhysicalDeviceMapMemoryPlacedPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMapMemoryPlacedPropertiesEXT & operator=( PhysicalDeviceMapMemoryPlacedPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMapMemoryPlacedPropertiesEXT & operator=( VkPhysicalDeviceMapMemoryPlacedPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMapMemoryPlacedPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceMapMemoryPlacedPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMapMemoryPlacedPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceMapMemoryPlacedPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMapMemoryPlacedPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, minPlacedMemoryMapAlignment );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMapMemoryPlacedPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMapMemoryPlacedPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( minPlacedMemoryMapAlignment == rhs.minPlacedMemoryMapAlignment );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMapMemoryPlacedPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                       = StructureType::ePhysicalDeviceMapMemoryPlacedPropertiesEXT;\n    void *                              pNext                       = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    minPlacedMemoryMapAlignment = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMapMemoryPlacedPropertiesEXT>\n  {\n    using Type = PhysicalDeviceMapMemoryPlacedPropertiesEXT;\n  };\n\n  struct PhysicalDeviceMemoryBudgetPropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceMemoryBudgetPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMemoryBudgetPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMemoryBudgetPropertiesEXT( std::array<VULKAN_HPP_NAMESPACE::DeviceSize, VK_MAX_MEMORY_HEAPS> const & heapBudget_ = {},\n                                                                     std::array<VULKAN_HPP_NAMESPACE::DeviceSize, VK_MAX_MEMORY_HEAPS> const & heapUsage_  = {},\n                                                                     void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , heapBudget{ heapBudget_ }\n      , heapUsage{ heapUsage_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMemoryBudgetPropertiesEXT( PhysicalDeviceMemoryBudgetPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMemoryBudgetPropertiesEXT( VkPhysicalDeviceMemoryBudgetPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMemoryBudgetPropertiesEXT( *reinterpret_cast<PhysicalDeviceMemoryBudgetPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMemoryBudgetPropertiesEXT & operator=( PhysicalDeviceMemoryBudgetPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMemoryBudgetPropertiesEXT & operator=( VkPhysicalDeviceMemoryBudgetPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryBudgetPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceMemoryBudgetPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMemoryBudgetPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceMemoryBudgetPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMemoryBudgetPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::DeviceSize, VK_MAX_MEMORY_HEAPS> const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::DeviceSize, VK_MAX_MEMORY_HEAPS> const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, heapBudget, heapUsage );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMemoryBudgetPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMemoryBudgetPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( heapBudget == rhs.heapBudget ) && ( heapUsage == rhs.heapUsage );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMemoryBudgetPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                                         sType = StructureType::ePhysicalDeviceMemoryBudgetPropertiesEXT;\n    void *                                                                                      pNext = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::DeviceSize, VK_MAX_MEMORY_HEAPS> heapBudget = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::DeviceSize, VK_MAX_MEMORY_HEAPS> heapUsage  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMemoryBudgetPropertiesEXT>\n  {\n    using Type = PhysicalDeviceMemoryBudgetPropertiesEXT;\n  };\n\n  struct PhysicalDeviceMemoryDecompressionFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceMemoryDecompressionFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMemoryDecompressionFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMemoryDecompressionFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 memoryDecompression_ = {},\n                                                                      void *                       pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , memoryDecompression{ memoryDecompression_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMemoryDecompressionFeaturesNV( PhysicalDeviceMemoryDecompressionFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMemoryDecompressionFeaturesNV( VkPhysicalDeviceMemoryDecompressionFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMemoryDecompressionFeaturesNV( *reinterpret_cast<PhysicalDeviceMemoryDecompressionFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMemoryDecompressionFeaturesNV & operator=( PhysicalDeviceMemoryDecompressionFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMemoryDecompressionFeaturesNV & operator=( VkPhysicalDeviceMemoryDecompressionFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryDecompressionFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMemoryDecompressionFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMemoryDecompressionFeaturesNV &\n      setMemoryDecompression( VULKAN_HPP_NAMESPACE::Bool32 memoryDecompression_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memoryDecompression = memoryDecompression_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceMemoryDecompressionFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMemoryDecompressionFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceMemoryDecompressionFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMemoryDecompressionFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, memoryDecompression );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMemoryDecompressionFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMemoryDecompressionFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memoryDecompression == rhs.memoryDecompression );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMemoryDecompressionFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType               = StructureType::ePhysicalDeviceMemoryDecompressionFeaturesNV;\n    void *                              pNext               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        memoryDecompression = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMemoryDecompressionFeaturesNV>\n  {\n    using Type = PhysicalDeviceMemoryDecompressionFeaturesNV;\n  };\n\n  struct PhysicalDeviceMemoryDecompressionPropertiesNV\n  {\n    using NativeType = VkPhysicalDeviceMemoryDecompressionPropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMemoryDecompressionPropertiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMemoryDecompressionPropertiesNV( VULKAN_HPP_NAMESPACE::MemoryDecompressionMethodFlagsNV decompressionMethods_ = {},\n                                                                        uint64_t maxDecompressionIndirectCount_                                      = {},\n                                                                        void *   pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , decompressionMethods{ decompressionMethods_ }\n      , maxDecompressionIndirectCount{ maxDecompressionIndirectCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceMemoryDecompressionPropertiesNV( PhysicalDeviceMemoryDecompressionPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMemoryDecompressionPropertiesNV( VkPhysicalDeviceMemoryDecompressionPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMemoryDecompressionPropertiesNV( *reinterpret_cast<PhysicalDeviceMemoryDecompressionPropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMemoryDecompressionPropertiesNV & operator=( PhysicalDeviceMemoryDecompressionPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMemoryDecompressionPropertiesNV & operator=( VkPhysicalDeviceMemoryDecompressionPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryDecompressionPropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceMemoryDecompressionPropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMemoryDecompressionPropertiesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceMemoryDecompressionPropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMemoryDecompressionPropertiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::MemoryDecompressionMethodFlagsNV const &, uint64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, decompressionMethods, maxDecompressionIndirectCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMemoryDecompressionPropertiesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMemoryDecompressionPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( decompressionMethods == rhs.decompressionMethods ) &&\n             ( maxDecompressionIndirectCount == rhs.maxDecompressionIndirectCount );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMemoryDecompressionPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType                         = StructureType::ePhysicalDeviceMemoryDecompressionPropertiesNV;\n    void *                                                 pNext                         = {};\n    VULKAN_HPP_NAMESPACE::MemoryDecompressionMethodFlagsNV decompressionMethods          = {};\n    uint64_t                                               maxDecompressionIndirectCount = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMemoryDecompressionPropertiesNV>\n  {\n    using Type = PhysicalDeviceMemoryDecompressionPropertiesNV;\n  };\n\n  struct PhysicalDeviceMemoryPriorityFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceMemoryPriorityFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMemoryPriorityFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMemoryPriorityFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 memoryPriority_ = {},\n                                                                  void *                       pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , memoryPriority{ memoryPriority_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMemoryPriorityFeaturesEXT( PhysicalDeviceMemoryPriorityFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMemoryPriorityFeaturesEXT( VkPhysicalDeviceMemoryPriorityFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMemoryPriorityFeaturesEXT( *reinterpret_cast<PhysicalDeviceMemoryPriorityFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMemoryPriorityFeaturesEXT & operator=( PhysicalDeviceMemoryPriorityFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMemoryPriorityFeaturesEXT & operator=( VkPhysicalDeviceMemoryPriorityFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryPriorityFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMemoryPriorityFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMemoryPriorityFeaturesEXT & setMemoryPriority( VULKAN_HPP_NAMESPACE::Bool32 memoryPriority_ ) VULKAN_HPP_NOEXCEPT\n    {\n      memoryPriority = memoryPriority_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceMemoryPriorityFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMemoryPriorityFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceMemoryPriorityFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMemoryPriorityFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, memoryPriority );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMemoryPriorityFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMemoryPriorityFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memoryPriority == rhs.memoryPriority );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMemoryPriorityFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::ePhysicalDeviceMemoryPriorityFeaturesEXT;\n    void *                              pNext          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        memoryPriority = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMemoryPriorityFeaturesEXT>\n  {\n    using Type = PhysicalDeviceMemoryPriorityFeaturesEXT;\n  };\n\n  struct PhysicalDeviceMemoryProperties\n  {\n    using NativeType = VkPhysicalDeviceMemoryProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14\n      PhysicalDeviceMemoryProperties( uint32_t                                                                  memoryTypeCount_ = {},\n                                      std::array<VULKAN_HPP_NAMESPACE::MemoryType, VK_MAX_MEMORY_TYPES> const & memoryTypes_     = {},\n                                      uint32_t                                                                  memoryHeapCount_ = {},\n                                      std::array<VULKAN_HPP_NAMESPACE::MemoryHeap, VK_MAX_MEMORY_HEAPS> const & memoryHeaps_     = {} ) VULKAN_HPP_NOEXCEPT\n      : memoryTypeCount{ memoryTypeCount_ }\n      , memoryTypes{ memoryTypes_ }\n      , memoryHeapCount{ memoryHeapCount_ }\n      , memoryHeaps{ memoryHeaps_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMemoryProperties( PhysicalDeviceMemoryProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMemoryProperties( VkPhysicalDeviceMemoryProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMemoryProperties( *reinterpret_cast<PhysicalDeviceMemoryProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMemoryProperties & operator=( PhysicalDeviceMemoryProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMemoryProperties & operator=( VkPhysicalDeviceMemoryProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceMemoryProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMemoryProperties *>( this );\n    }\n\n    operator VkPhysicalDeviceMemoryProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMemoryProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::MemoryType, VK_MAX_MEMORY_TYPES> const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::MemoryHeap, VK_MAX_MEMORY_HEAPS> const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( memoryTypeCount, memoryTypes, memoryHeapCount, memoryHeaps );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( PhysicalDeviceMemoryProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = memoryTypeCount <=> rhs.memoryTypeCount; cmp != 0 )\n        return cmp;\n      for ( size_t i = 0; i < memoryTypeCount; ++i )\n      {\n        if ( auto cmp = memoryTypes[i] <=> rhs.memoryTypes[i]; cmp != 0 )\n          return cmp;\n      }\n      if ( auto cmp = memoryHeapCount <=> rhs.memoryHeapCount; cmp != 0 )\n        return cmp;\n      for ( size_t i = 0; i < memoryHeapCount; ++i )\n      {\n        if ( auto cmp = memoryHeaps[i] <=> rhs.memoryHeaps[i]; cmp != 0 )\n          return cmp;\n      }\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( PhysicalDeviceMemoryProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( memoryTypeCount == rhs.memoryTypeCount ) &&\n             ( memcmp( memoryTypes, rhs.memoryTypes, memoryTypeCount * sizeof( VULKAN_HPP_NAMESPACE::MemoryType ) ) == 0 ) &&\n             ( memoryHeapCount == rhs.memoryHeapCount ) &&\n             ( memcmp( memoryHeaps, rhs.memoryHeaps, memoryHeapCount * sizeof( VULKAN_HPP_NAMESPACE::MemoryHeap ) ) == 0 );\n    }\n\n    bool operator!=( PhysicalDeviceMemoryProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    uint32_t                                                                                    memoryTypeCount = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::MemoryType, VK_MAX_MEMORY_TYPES> memoryTypes     = {};\n    uint32_t                                                                                    memoryHeapCount = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::MemoryHeap, VK_MAX_MEMORY_HEAPS> memoryHeaps     = {};\n  };\n\n  struct PhysicalDeviceMemoryProperties2\n  {\n    using NativeType = VkPhysicalDeviceMemoryProperties2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMemoryProperties2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMemoryProperties2( VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties memoryProperties_ = {},\n                                                             void *                                               pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , memoryProperties{ memoryProperties_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMemoryProperties2( PhysicalDeviceMemoryProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMemoryProperties2( VkPhysicalDeviceMemoryProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMemoryProperties2( *reinterpret_cast<PhysicalDeviceMemoryProperties2 const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMemoryProperties2 & operator=( PhysicalDeviceMemoryProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMemoryProperties2 & operator=( VkPhysicalDeviceMemoryProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceMemoryProperties2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMemoryProperties2 *>( this );\n    }\n\n    operator VkPhysicalDeviceMemoryProperties2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMemoryProperties2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, memoryProperties );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMemoryProperties2 const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMemoryProperties2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memoryProperties == rhs.memoryProperties );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMemoryProperties2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                  sType            = StructureType::ePhysicalDeviceMemoryProperties2;\n    void *                                               pNext            = {};\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties memoryProperties = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMemoryProperties2>\n  {\n    using Type = PhysicalDeviceMemoryProperties2;\n  };\n\n  using PhysicalDeviceMemoryProperties2KHR = PhysicalDeviceMemoryProperties2;\n\n  struct PhysicalDeviceMeshShaderFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceMeshShaderFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMeshShaderFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMeshShaderFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 taskShader_                             = {},\n                                                              VULKAN_HPP_NAMESPACE::Bool32 meshShader_                             = {},\n                                                              VULKAN_HPP_NAMESPACE::Bool32 multiviewMeshShader_                    = {},\n                                                              VULKAN_HPP_NAMESPACE::Bool32 primitiveFragmentShadingRateMeshShader_ = {},\n                                                              VULKAN_HPP_NAMESPACE::Bool32 meshShaderQueries_                      = {},\n                                                              void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , taskShader{ taskShader_ }\n      , meshShader{ meshShader_ }\n      , multiviewMeshShader{ multiviewMeshShader_ }\n      , primitiveFragmentShadingRateMeshShader{ primitiveFragmentShadingRateMeshShader_ }\n      , meshShaderQueries{ meshShaderQueries_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMeshShaderFeaturesEXT( PhysicalDeviceMeshShaderFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMeshShaderFeaturesEXT( VkPhysicalDeviceMeshShaderFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMeshShaderFeaturesEXT( *reinterpret_cast<PhysicalDeviceMeshShaderFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMeshShaderFeaturesEXT & operator=( PhysicalDeviceMeshShaderFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMeshShaderFeaturesEXT & operator=( VkPhysicalDeviceMeshShaderFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMeshShaderFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMeshShaderFeaturesEXT & setTaskShader( VULKAN_HPP_NAMESPACE::Bool32 taskShader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      taskShader = taskShader_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMeshShaderFeaturesEXT & setMeshShader( VULKAN_HPP_NAMESPACE::Bool32 meshShader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      meshShader = meshShader_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMeshShaderFeaturesEXT &\n      setMultiviewMeshShader( VULKAN_HPP_NAMESPACE::Bool32 multiviewMeshShader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      multiviewMeshShader = multiviewMeshShader_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMeshShaderFeaturesEXT &\n      setPrimitiveFragmentShadingRateMeshShader( VULKAN_HPP_NAMESPACE::Bool32 primitiveFragmentShadingRateMeshShader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      primitiveFragmentShadingRateMeshShader = primitiveFragmentShadingRateMeshShader_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMeshShaderFeaturesEXT & setMeshShaderQueries( VULKAN_HPP_NAMESPACE::Bool32 meshShaderQueries_ ) VULKAN_HPP_NOEXCEPT\n    {\n      meshShaderQueries = meshShaderQueries_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceMeshShaderFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMeshShaderFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceMeshShaderFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMeshShaderFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, taskShader, meshShader, multiviewMeshShader, primitiveFragmentShadingRateMeshShader, meshShaderQueries );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMeshShaderFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMeshShaderFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( taskShader == rhs.taskShader ) && ( meshShader == rhs.meshShader ) &&\n             ( multiviewMeshShader == rhs.multiviewMeshShader ) && ( primitiveFragmentShadingRateMeshShader == rhs.primitiveFragmentShadingRateMeshShader ) &&\n             ( meshShaderQueries == rhs.meshShaderQueries );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMeshShaderFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                  = StructureType::ePhysicalDeviceMeshShaderFeaturesEXT;\n    void *                              pNext                                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        taskShader                             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        meshShader                             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        multiviewMeshShader                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        primitiveFragmentShadingRateMeshShader = {};\n    VULKAN_HPP_NAMESPACE::Bool32        meshShaderQueries                      = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMeshShaderFeaturesEXT>\n  {\n    using Type = PhysicalDeviceMeshShaderFeaturesEXT;\n  };\n\n  struct PhysicalDeviceMeshShaderFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceMeshShaderFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMeshShaderFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMeshShaderFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 taskShader_ = {},\n                                                             VULKAN_HPP_NAMESPACE::Bool32 meshShader_ = {},\n                                                             void *                       pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , taskShader{ taskShader_ }\n      , meshShader{ meshShader_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMeshShaderFeaturesNV( PhysicalDeviceMeshShaderFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMeshShaderFeaturesNV( VkPhysicalDeviceMeshShaderFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMeshShaderFeaturesNV( *reinterpret_cast<PhysicalDeviceMeshShaderFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMeshShaderFeaturesNV & operator=( PhysicalDeviceMeshShaderFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMeshShaderFeaturesNV & operator=( VkPhysicalDeviceMeshShaderFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMeshShaderFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMeshShaderFeaturesNV & setTaskShader( VULKAN_HPP_NAMESPACE::Bool32 taskShader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      taskShader = taskShader_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMeshShaderFeaturesNV & setMeshShader( VULKAN_HPP_NAMESPACE::Bool32 meshShader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      meshShader = meshShader_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceMeshShaderFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMeshShaderFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceMeshShaderFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMeshShaderFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, taskShader, meshShader );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMeshShaderFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMeshShaderFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( taskShader == rhs.taskShader ) && ( meshShader == rhs.meshShader );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMeshShaderFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType      = StructureType::ePhysicalDeviceMeshShaderFeaturesNV;\n    void *                              pNext      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        taskShader = {};\n    VULKAN_HPP_NAMESPACE::Bool32        meshShader = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMeshShaderFeaturesNV>\n  {\n    using Type = PhysicalDeviceMeshShaderFeaturesNV;\n  };\n\n  struct PhysicalDeviceMeshShaderPropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceMeshShaderPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMeshShaderPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMeshShaderPropertiesEXT( uint32_t                        maxTaskWorkGroupTotalCount_            = {},\n                                                                   std::array<uint32_t, 3> const & maxTaskWorkGroupCount_                 = {},\n                                                                   uint32_t                        maxTaskWorkGroupInvocations_           = {},\n                                                                   std::array<uint32_t, 3> const & maxTaskWorkGroupSize_                  = {},\n                                                                   uint32_t                        maxTaskPayloadSize_                    = {},\n                                                                   uint32_t                        maxTaskSharedMemorySize_               = {},\n                                                                   uint32_t                        maxTaskPayloadAndSharedMemorySize_     = {},\n                                                                   uint32_t                        maxMeshWorkGroupTotalCount_            = {},\n                                                                   std::array<uint32_t, 3> const & maxMeshWorkGroupCount_                 = {},\n                                                                   uint32_t                        maxMeshWorkGroupInvocations_           = {},\n                                                                   std::array<uint32_t, 3> const & maxMeshWorkGroupSize_                  = {},\n                                                                   uint32_t                        maxMeshSharedMemorySize_               = {},\n                                                                   uint32_t                        maxMeshPayloadAndSharedMemorySize_     = {},\n                                                                   uint32_t                        maxMeshOutputMemorySize_               = {},\n                                                                   uint32_t                        maxMeshPayloadAndOutputMemorySize_     = {},\n                                                                   uint32_t                        maxMeshOutputComponents_               = {},\n                                                                   uint32_t                        maxMeshOutputVertices_                 = {},\n                                                                   uint32_t                        maxMeshOutputPrimitives_               = {},\n                                                                   uint32_t                        maxMeshOutputLayers_                   = {},\n                                                                   uint32_t                        maxMeshMultiviewViewCount_             = {},\n                                                                   uint32_t                        meshOutputPerVertexGranularity_        = {},\n                                                                   uint32_t                        meshOutputPerPrimitiveGranularity_     = {},\n                                                                   uint32_t                        maxPreferredTaskWorkGroupInvocations_  = {},\n                                                                   uint32_t                        maxPreferredMeshWorkGroupInvocations_  = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32    prefersLocalInvocationVertexOutput_    = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32    prefersLocalInvocationPrimitiveOutput_ = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32    prefersCompactVertexOutput_            = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32    prefersCompactPrimitiveOutput_         = {},\n                                                                   void *                          pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxTaskWorkGroupTotalCount{ maxTaskWorkGroupTotalCount_ }\n      , maxTaskWorkGroupCount{ maxTaskWorkGroupCount_ }\n      , maxTaskWorkGroupInvocations{ maxTaskWorkGroupInvocations_ }\n      , maxTaskWorkGroupSize{ maxTaskWorkGroupSize_ }\n      , maxTaskPayloadSize{ maxTaskPayloadSize_ }\n      , maxTaskSharedMemorySize{ maxTaskSharedMemorySize_ }\n      , maxTaskPayloadAndSharedMemorySize{ maxTaskPayloadAndSharedMemorySize_ }\n      , maxMeshWorkGroupTotalCount{ maxMeshWorkGroupTotalCount_ }\n      , maxMeshWorkGroupCount{ maxMeshWorkGroupCount_ }\n      , maxMeshWorkGroupInvocations{ maxMeshWorkGroupInvocations_ }\n      , maxMeshWorkGroupSize{ maxMeshWorkGroupSize_ }\n      , maxMeshSharedMemorySize{ maxMeshSharedMemorySize_ }\n      , maxMeshPayloadAndSharedMemorySize{ maxMeshPayloadAndSharedMemorySize_ }\n      , maxMeshOutputMemorySize{ maxMeshOutputMemorySize_ }\n      , maxMeshPayloadAndOutputMemorySize{ maxMeshPayloadAndOutputMemorySize_ }\n      , maxMeshOutputComponents{ maxMeshOutputComponents_ }\n      , maxMeshOutputVertices{ maxMeshOutputVertices_ }\n      , maxMeshOutputPrimitives{ maxMeshOutputPrimitives_ }\n      , maxMeshOutputLayers{ maxMeshOutputLayers_ }\n      , maxMeshMultiviewViewCount{ maxMeshMultiviewViewCount_ }\n      , meshOutputPerVertexGranularity{ meshOutputPerVertexGranularity_ }\n      , meshOutputPerPrimitiveGranularity{ meshOutputPerPrimitiveGranularity_ }\n      , maxPreferredTaskWorkGroupInvocations{ maxPreferredTaskWorkGroupInvocations_ }\n      , maxPreferredMeshWorkGroupInvocations{ maxPreferredMeshWorkGroupInvocations_ }\n      , prefersLocalInvocationVertexOutput{ prefersLocalInvocationVertexOutput_ }\n      , prefersLocalInvocationPrimitiveOutput{ prefersLocalInvocationPrimitiveOutput_ }\n      , prefersCompactVertexOutput{ prefersCompactVertexOutput_ }\n      , prefersCompactPrimitiveOutput{ prefersCompactPrimitiveOutput_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMeshShaderPropertiesEXT( PhysicalDeviceMeshShaderPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMeshShaderPropertiesEXT( VkPhysicalDeviceMeshShaderPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMeshShaderPropertiesEXT( *reinterpret_cast<PhysicalDeviceMeshShaderPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMeshShaderPropertiesEXT & operator=( PhysicalDeviceMeshShaderPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMeshShaderPropertiesEXT & operator=( VkPhysicalDeviceMeshShaderPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceMeshShaderPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMeshShaderPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceMeshShaderPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMeshShaderPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       maxTaskWorkGroupTotalCount,\n                       maxTaskWorkGroupCount,\n                       maxTaskWorkGroupInvocations,\n                       maxTaskWorkGroupSize,\n                       maxTaskPayloadSize,\n                       maxTaskSharedMemorySize,\n                       maxTaskPayloadAndSharedMemorySize,\n                       maxMeshWorkGroupTotalCount,\n                       maxMeshWorkGroupCount,\n                       maxMeshWorkGroupInvocations,\n                       maxMeshWorkGroupSize,\n                       maxMeshSharedMemorySize,\n                       maxMeshPayloadAndSharedMemorySize,\n                       maxMeshOutputMemorySize,\n                       maxMeshPayloadAndOutputMemorySize,\n                       maxMeshOutputComponents,\n                       maxMeshOutputVertices,\n                       maxMeshOutputPrimitives,\n                       maxMeshOutputLayers,\n                       maxMeshMultiviewViewCount,\n                       meshOutputPerVertexGranularity,\n                       meshOutputPerPrimitiveGranularity,\n                       maxPreferredTaskWorkGroupInvocations,\n                       maxPreferredMeshWorkGroupInvocations,\n                       prefersLocalInvocationVertexOutput,\n                       prefersLocalInvocationPrimitiveOutput,\n                       prefersCompactVertexOutput,\n                       prefersCompactPrimitiveOutput );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMeshShaderPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMeshShaderPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxTaskWorkGroupTotalCount == rhs.maxTaskWorkGroupTotalCount ) &&\n             ( maxTaskWorkGroupCount == rhs.maxTaskWorkGroupCount ) && ( maxTaskWorkGroupInvocations == rhs.maxTaskWorkGroupInvocations ) &&\n             ( maxTaskWorkGroupSize == rhs.maxTaskWorkGroupSize ) && ( maxTaskPayloadSize == rhs.maxTaskPayloadSize ) &&\n             ( maxTaskSharedMemorySize == rhs.maxTaskSharedMemorySize ) && ( maxTaskPayloadAndSharedMemorySize == rhs.maxTaskPayloadAndSharedMemorySize ) &&\n             ( maxMeshWorkGroupTotalCount == rhs.maxMeshWorkGroupTotalCount ) && ( maxMeshWorkGroupCount == rhs.maxMeshWorkGroupCount ) &&\n             ( maxMeshWorkGroupInvocations == rhs.maxMeshWorkGroupInvocations ) && ( maxMeshWorkGroupSize == rhs.maxMeshWorkGroupSize ) &&\n             ( maxMeshSharedMemorySize == rhs.maxMeshSharedMemorySize ) && ( maxMeshPayloadAndSharedMemorySize == rhs.maxMeshPayloadAndSharedMemorySize ) &&\n             ( maxMeshOutputMemorySize == rhs.maxMeshOutputMemorySize ) && ( maxMeshPayloadAndOutputMemorySize == rhs.maxMeshPayloadAndOutputMemorySize ) &&\n             ( maxMeshOutputComponents == rhs.maxMeshOutputComponents ) && ( maxMeshOutputVertices == rhs.maxMeshOutputVertices ) &&\n             ( maxMeshOutputPrimitives == rhs.maxMeshOutputPrimitives ) && ( maxMeshOutputLayers == rhs.maxMeshOutputLayers ) &&\n             ( maxMeshMultiviewViewCount == rhs.maxMeshMultiviewViewCount ) && ( meshOutputPerVertexGranularity == rhs.meshOutputPerVertexGranularity ) &&\n             ( meshOutputPerPrimitiveGranularity == rhs.meshOutputPerPrimitiveGranularity ) &&\n             ( maxPreferredTaskWorkGroupInvocations == rhs.maxPreferredTaskWorkGroupInvocations ) &&\n             ( maxPreferredMeshWorkGroupInvocations == rhs.maxPreferredMeshWorkGroupInvocations ) &&\n             ( prefersLocalInvocationVertexOutput == rhs.prefersLocalInvocationVertexOutput ) &&\n             ( prefersLocalInvocationPrimitiveOutput == rhs.prefersLocalInvocationPrimitiveOutput ) &&\n             ( prefersCompactVertexOutput == rhs.prefersCompactVertexOutput ) && ( prefersCompactPrimitiveOutput == rhs.prefersCompactPrimitiveOutput );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMeshShaderPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType                                 = StructureType::ePhysicalDeviceMeshShaderPropertiesEXT;\n    void *                                            pNext                                 = {};\n    uint32_t                                          maxTaskWorkGroupTotalCount            = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> maxTaskWorkGroupCount                 = {};\n    uint32_t                                          maxTaskWorkGroupInvocations           = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> maxTaskWorkGroupSize                  = {};\n    uint32_t                                          maxTaskPayloadSize                    = {};\n    uint32_t                                          maxTaskSharedMemorySize               = {};\n    uint32_t                                          maxTaskPayloadAndSharedMemorySize     = {};\n    uint32_t                                          maxMeshWorkGroupTotalCount            = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> maxMeshWorkGroupCount                 = {};\n    uint32_t                                          maxMeshWorkGroupInvocations           = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> maxMeshWorkGroupSize                  = {};\n    uint32_t                                          maxMeshSharedMemorySize               = {};\n    uint32_t                                          maxMeshPayloadAndSharedMemorySize     = {};\n    uint32_t                                          maxMeshOutputMemorySize               = {};\n    uint32_t                                          maxMeshPayloadAndOutputMemorySize     = {};\n    uint32_t                                          maxMeshOutputComponents               = {};\n    uint32_t                                          maxMeshOutputVertices                 = {};\n    uint32_t                                          maxMeshOutputPrimitives               = {};\n    uint32_t                                          maxMeshOutputLayers                   = {};\n    uint32_t                                          maxMeshMultiviewViewCount             = {};\n    uint32_t                                          meshOutputPerVertexGranularity        = {};\n    uint32_t                                          meshOutputPerPrimitiveGranularity     = {};\n    uint32_t                                          maxPreferredTaskWorkGroupInvocations  = {};\n    uint32_t                                          maxPreferredMeshWorkGroupInvocations  = {};\n    VULKAN_HPP_NAMESPACE::Bool32                      prefersLocalInvocationVertexOutput    = {};\n    VULKAN_HPP_NAMESPACE::Bool32                      prefersLocalInvocationPrimitiveOutput = {};\n    VULKAN_HPP_NAMESPACE::Bool32                      prefersCompactVertexOutput            = {};\n    VULKAN_HPP_NAMESPACE::Bool32                      prefersCompactPrimitiveOutput         = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMeshShaderPropertiesEXT>\n  {\n    using Type = PhysicalDeviceMeshShaderPropertiesEXT;\n  };\n\n  struct PhysicalDeviceMeshShaderPropertiesNV\n  {\n    using NativeType = VkPhysicalDeviceMeshShaderPropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMeshShaderPropertiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMeshShaderPropertiesNV( uint32_t                        maxDrawMeshTasksCount_             = {},\n                                                                  uint32_t                        maxTaskWorkGroupInvocations_       = {},\n                                                                  std::array<uint32_t, 3> const & maxTaskWorkGroupSize_              = {},\n                                                                  uint32_t                        maxTaskTotalMemorySize_            = {},\n                                                                  uint32_t                        maxTaskOutputCount_                = {},\n                                                                  uint32_t                        maxMeshWorkGroupInvocations_       = {},\n                                                                  std::array<uint32_t, 3> const & maxMeshWorkGroupSize_              = {},\n                                                                  uint32_t                        maxMeshTotalMemorySize_            = {},\n                                                                  uint32_t                        maxMeshOutputVertices_             = {},\n                                                                  uint32_t                        maxMeshOutputPrimitives_           = {},\n                                                                  uint32_t                        maxMeshMultiviewViewCount_         = {},\n                                                                  uint32_t                        meshOutputPerVertexGranularity_    = {},\n                                                                  uint32_t                        meshOutputPerPrimitiveGranularity_ = {},\n                                                                  void *                          pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxDrawMeshTasksCount{ maxDrawMeshTasksCount_ }\n      , maxTaskWorkGroupInvocations{ maxTaskWorkGroupInvocations_ }\n      , maxTaskWorkGroupSize{ maxTaskWorkGroupSize_ }\n      , maxTaskTotalMemorySize{ maxTaskTotalMemorySize_ }\n      , maxTaskOutputCount{ maxTaskOutputCount_ }\n      , maxMeshWorkGroupInvocations{ maxMeshWorkGroupInvocations_ }\n      , maxMeshWorkGroupSize{ maxMeshWorkGroupSize_ }\n      , maxMeshTotalMemorySize{ maxMeshTotalMemorySize_ }\n      , maxMeshOutputVertices{ maxMeshOutputVertices_ }\n      , maxMeshOutputPrimitives{ maxMeshOutputPrimitives_ }\n      , maxMeshMultiviewViewCount{ maxMeshMultiviewViewCount_ }\n      , meshOutputPerVertexGranularity{ meshOutputPerVertexGranularity_ }\n      , meshOutputPerPrimitiveGranularity{ meshOutputPerPrimitiveGranularity_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMeshShaderPropertiesNV( PhysicalDeviceMeshShaderPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMeshShaderPropertiesNV( VkPhysicalDeviceMeshShaderPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMeshShaderPropertiesNV( *reinterpret_cast<PhysicalDeviceMeshShaderPropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMeshShaderPropertiesNV & operator=( PhysicalDeviceMeshShaderPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMeshShaderPropertiesNV & operator=( VkPhysicalDeviceMeshShaderPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderPropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceMeshShaderPropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMeshShaderPropertiesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceMeshShaderPropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMeshShaderPropertiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       maxDrawMeshTasksCount,\n                       maxTaskWorkGroupInvocations,\n                       maxTaskWorkGroupSize,\n                       maxTaskTotalMemorySize,\n                       maxTaskOutputCount,\n                       maxMeshWorkGroupInvocations,\n                       maxMeshWorkGroupSize,\n                       maxMeshTotalMemorySize,\n                       maxMeshOutputVertices,\n                       maxMeshOutputPrimitives,\n                       maxMeshMultiviewViewCount,\n                       meshOutputPerVertexGranularity,\n                       meshOutputPerPrimitiveGranularity );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMeshShaderPropertiesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMeshShaderPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxDrawMeshTasksCount == rhs.maxDrawMeshTasksCount ) &&\n             ( maxTaskWorkGroupInvocations == rhs.maxTaskWorkGroupInvocations ) && ( maxTaskWorkGroupSize == rhs.maxTaskWorkGroupSize ) &&\n             ( maxTaskTotalMemorySize == rhs.maxTaskTotalMemorySize ) && ( maxTaskOutputCount == rhs.maxTaskOutputCount ) &&\n             ( maxMeshWorkGroupInvocations == rhs.maxMeshWorkGroupInvocations ) && ( maxMeshWorkGroupSize == rhs.maxMeshWorkGroupSize ) &&\n             ( maxMeshTotalMemorySize == rhs.maxMeshTotalMemorySize ) && ( maxMeshOutputVertices == rhs.maxMeshOutputVertices ) &&\n             ( maxMeshOutputPrimitives == rhs.maxMeshOutputPrimitives ) && ( maxMeshMultiviewViewCount == rhs.maxMeshMultiviewViewCount ) &&\n             ( meshOutputPerVertexGranularity == rhs.meshOutputPerVertexGranularity ) &&\n             ( meshOutputPerPrimitiveGranularity == rhs.meshOutputPerPrimitiveGranularity );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMeshShaderPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType                             = StructureType::ePhysicalDeviceMeshShaderPropertiesNV;\n    void *                                            pNext                             = {};\n    uint32_t                                          maxDrawMeshTasksCount             = {};\n    uint32_t                                          maxTaskWorkGroupInvocations       = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> maxTaskWorkGroupSize              = {};\n    uint32_t                                          maxTaskTotalMemorySize            = {};\n    uint32_t                                          maxTaskOutputCount                = {};\n    uint32_t                                          maxMeshWorkGroupInvocations       = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> maxMeshWorkGroupSize              = {};\n    uint32_t                                          maxMeshTotalMemorySize            = {};\n    uint32_t                                          maxMeshOutputVertices             = {};\n    uint32_t                                          maxMeshOutputPrimitives           = {};\n    uint32_t                                          maxMeshMultiviewViewCount         = {};\n    uint32_t                                          meshOutputPerVertexGranularity    = {};\n    uint32_t                                          meshOutputPerPrimitiveGranularity = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMeshShaderPropertiesNV>\n  {\n    using Type = PhysicalDeviceMeshShaderPropertiesNV;\n  };\n\n  struct PhysicalDeviceMultiDrawFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceMultiDrawFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMultiDrawFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMultiDrawFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 multiDraw_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , multiDraw{ multiDraw_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMultiDrawFeaturesEXT( PhysicalDeviceMultiDrawFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMultiDrawFeaturesEXT( VkPhysicalDeviceMultiDrawFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMultiDrawFeaturesEXT( *reinterpret_cast<PhysicalDeviceMultiDrawFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMultiDrawFeaturesEXT & operator=( PhysicalDeviceMultiDrawFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMultiDrawFeaturesEXT & operator=( VkPhysicalDeviceMultiDrawFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiDrawFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMultiDrawFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMultiDrawFeaturesEXT & setMultiDraw( VULKAN_HPP_NAMESPACE::Bool32 multiDraw_ ) VULKAN_HPP_NOEXCEPT\n    {\n      multiDraw = multiDraw_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceMultiDrawFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMultiDrawFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceMultiDrawFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMultiDrawFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, multiDraw );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMultiDrawFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMultiDrawFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( multiDraw == rhs.multiDraw );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMultiDrawFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType     = StructureType::ePhysicalDeviceMultiDrawFeaturesEXT;\n    void *                              pNext     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        multiDraw = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMultiDrawFeaturesEXT>\n  {\n    using Type = PhysicalDeviceMultiDrawFeaturesEXT;\n  };\n\n  struct PhysicalDeviceMultiDrawPropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceMultiDrawPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMultiDrawPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMultiDrawPropertiesEXT( uint32_t maxMultiDrawCount_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxMultiDrawCount{ maxMultiDrawCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMultiDrawPropertiesEXT( PhysicalDeviceMultiDrawPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMultiDrawPropertiesEXT( VkPhysicalDeviceMultiDrawPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMultiDrawPropertiesEXT( *reinterpret_cast<PhysicalDeviceMultiDrawPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMultiDrawPropertiesEXT & operator=( PhysicalDeviceMultiDrawPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMultiDrawPropertiesEXT & operator=( VkPhysicalDeviceMultiDrawPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiDrawPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceMultiDrawPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMultiDrawPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceMultiDrawPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMultiDrawPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxMultiDrawCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMultiDrawPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMultiDrawPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxMultiDrawCount == rhs.maxMultiDrawCount );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMultiDrawPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType             = StructureType::ePhysicalDeviceMultiDrawPropertiesEXT;\n    void *                              pNext             = {};\n    uint32_t                            maxMultiDrawCount = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMultiDrawPropertiesEXT>\n  {\n    using Type = PhysicalDeviceMultiDrawPropertiesEXT;\n  };\n\n  struct PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 multisampledRenderToSingleSampled_ = {},\n                                                                                     void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , multisampledRenderToSingleSampled{ multisampledRenderToSingleSampled_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT( PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT const & rhs )\n      VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT( VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT(\n          *reinterpret_cast<PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT &\n      operator=( PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT &\n      operator=( VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT &\n      setMultisampledRenderToSingleSampled( VULKAN_HPP_NAMESPACE::Bool32 multisampledRenderToSingleSampled_ ) VULKAN_HPP_NOEXCEPT\n    {\n      multisampledRenderToSingleSampled = multisampledRenderToSingleSampled_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, multisampledRenderToSingleSampled );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( multisampledRenderToSingleSampled == rhs.multisampledRenderToSingleSampled );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                             = StructureType::ePhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT;\n    void *                              pNext                             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        multisampledRenderToSingleSampled = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT>\n  {\n    using Type = PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT;\n  };\n\n  struct PhysicalDeviceMultiviewFeatures\n  {\n    using NativeType = VkPhysicalDeviceMultiviewFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMultiviewFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMultiviewFeatures( VULKAN_HPP_NAMESPACE::Bool32 multiview_                   = {},\n                                                          VULKAN_HPP_NAMESPACE::Bool32 multiviewGeometryShader_     = {},\n                                                          VULKAN_HPP_NAMESPACE::Bool32 multiviewTessellationShader_ = {},\n                                                          void *                       pNext_                       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , multiview{ multiview_ }\n      , multiviewGeometryShader{ multiviewGeometryShader_ }\n      , multiviewTessellationShader{ multiviewTessellationShader_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMultiviewFeatures( PhysicalDeviceMultiviewFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMultiviewFeatures( VkPhysicalDeviceMultiviewFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMultiviewFeatures( *reinterpret_cast<PhysicalDeviceMultiviewFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMultiviewFeatures & operator=( PhysicalDeviceMultiviewFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMultiviewFeatures & operator=( VkPhysicalDeviceMultiviewFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMultiviewFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMultiviewFeatures & setMultiview( VULKAN_HPP_NAMESPACE::Bool32 multiview_ ) VULKAN_HPP_NOEXCEPT\n    {\n      multiview = multiview_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMultiviewFeatures &\n      setMultiviewGeometryShader( VULKAN_HPP_NAMESPACE::Bool32 multiviewGeometryShader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      multiviewGeometryShader = multiviewGeometryShader_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMultiviewFeatures &\n      setMultiviewTessellationShader( VULKAN_HPP_NAMESPACE::Bool32 multiviewTessellationShader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      multiviewTessellationShader = multiviewTessellationShader_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceMultiviewFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMultiviewFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceMultiviewFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMultiviewFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, multiview, multiviewGeometryShader, multiviewTessellationShader );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMultiviewFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMultiviewFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( multiview == rhs.multiview ) && ( multiviewGeometryShader == rhs.multiviewGeometryShader ) &&\n             ( multiviewTessellationShader == rhs.multiviewTessellationShader );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMultiviewFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                       = StructureType::ePhysicalDeviceMultiviewFeatures;\n    void *                              pNext                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        multiview                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        multiviewGeometryShader     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        multiviewTessellationShader = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMultiviewFeatures>\n  {\n    using Type = PhysicalDeviceMultiviewFeatures;\n  };\n\n  using PhysicalDeviceMultiviewFeaturesKHR = PhysicalDeviceMultiviewFeatures;\n\n  struct PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX\n  {\n    using NativeType = VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMultiviewPerViewAttributesPropertiesNVX;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX( VULKAN_HPP_NAMESPACE::Bool32 perViewPositionAllComponents_ = {},\n                                                                                void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , perViewPositionAllComponents{ perViewPositionAllComponents_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX( PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX( VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX( *reinterpret_cast<PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX &\n      operator=( PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX & operator=( VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX *>( this );\n    }\n\n    operator VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, perViewPositionAllComponents );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( perViewPositionAllComponents == rhs.perViewPositionAllComponents );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                        = StructureType::ePhysicalDeviceMultiviewPerViewAttributesPropertiesNVX;\n    void *                              pNext                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        perViewPositionAllComponents = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMultiviewPerViewAttributesPropertiesNVX>\n  {\n    using Type = PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX;\n  };\n\n  struct PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM\n  {\n    using NativeType = VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM( VULKAN_HPP_NAMESPACE::Bool32 multiviewPerViewRenderAreas_ = {},\n                                                                                void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , multiviewPerViewRenderAreas{ multiviewPerViewRenderAreas_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM( PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM( VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM( *reinterpret_cast<PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM &\n      operator=( PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM & operator=( VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM &\n      setMultiviewPerViewRenderAreas( VULKAN_HPP_NAMESPACE::Bool32 multiviewPerViewRenderAreas_ ) VULKAN_HPP_NOEXCEPT\n    {\n      multiviewPerViewRenderAreas = multiviewPerViewRenderAreas_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM *>( this );\n    }\n\n    operator VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, multiviewPerViewRenderAreas );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( multiviewPerViewRenderAreas == rhs.multiviewPerViewRenderAreas );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                       = StructureType::ePhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM;\n    void *                              pNext                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        multiviewPerViewRenderAreas = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM>\n  {\n    using Type = PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM;\n  };\n\n  struct PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM\n  {\n    using NativeType = VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM( VULKAN_HPP_NAMESPACE::Bool32 multiviewPerViewViewports_ = {},\n                                                                              void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , multiviewPerViewViewports{ multiviewPerViewViewports_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM( PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM( VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM( *reinterpret_cast<PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM &\n      operator=( PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM & operator=( VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM &\n      setMultiviewPerViewViewports( VULKAN_HPP_NAMESPACE::Bool32 multiviewPerViewViewports_ ) VULKAN_HPP_NOEXCEPT\n    {\n      multiviewPerViewViewports = multiviewPerViewViewports_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM *>( this );\n    }\n\n    operator VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, multiviewPerViewViewports );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( multiviewPerViewViewports == rhs.multiviewPerViewViewports );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                     = StructureType::ePhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM;\n    void *                              pNext                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        multiviewPerViewViewports = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM>\n  {\n    using Type = PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM;\n  };\n\n  struct PhysicalDeviceMultiviewProperties\n  {\n    using NativeType = VkPhysicalDeviceMultiviewProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMultiviewProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMultiviewProperties( uint32_t maxMultiviewViewCount_     = {},\n                                                            uint32_t maxMultiviewInstanceIndex_ = {},\n                                                            void *   pNext_                     = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxMultiviewViewCount{ maxMultiviewViewCount_ }\n      , maxMultiviewInstanceIndex{ maxMultiviewInstanceIndex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMultiviewProperties( PhysicalDeviceMultiviewProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMultiviewProperties( VkPhysicalDeviceMultiviewProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMultiviewProperties( *reinterpret_cast<PhysicalDeviceMultiviewProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMultiviewProperties & operator=( PhysicalDeviceMultiviewProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMultiviewProperties & operator=( VkPhysicalDeviceMultiviewProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceMultiviewProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMultiviewProperties *>( this );\n    }\n\n    operator VkPhysicalDeviceMultiviewProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMultiviewProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxMultiviewViewCount, maxMultiviewInstanceIndex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMultiviewProperties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMultiviewProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxMultiviewViewCount == rhs.maxMultiviewViewCount ) &&\n             ( maxMultiviewInstanceIndex == rhs.maxMultiviewInstanceIndex );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMultiviewProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                     = StructureType::ePhysicalDeviceMultiviewProperties;\n    void *                              pNext                     = {};\n    uint32_t                            maxMultiviewViewCount     = {};\n    uint32_t                            maxMultiviewInstanceIndex = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMultiviewProperties>\n  {\n    using Type = PhysicalDeviceMultiviewProperties;\n  };\n\n  using PhysicalDeviceMultiviewPropertiesKHR = PhysicalDeviceMultiviewProperties;\n\n  struct PhysicalDeviceMutableDescriptorTypeFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceMutableDescriptorTypeFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceMutableDescriptorTypeFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 mutableDescriptorType_ = {},\n                                                                         void *                       pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , mutableDescriptorType{ mutableDescriptorType_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceMutableDescriptorTypeFeaturesEXT( PhysicalDeviceMutableDescriptorTypeFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceMutableDescriptorTypeFeaturesEXT( VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceMutableDescriptorTypeFeaturesEXT( *reinterpret_cast<PhysicalDeviceMutableDescriptorTypeFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceMutableDescriptorTypeFeaturesEXT & operator=( PhysicalDeviceMutableDescriptorTypeFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceMutableDescriptorTypeFeaturesEXT & operator=( VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceMutableDescriptorTypeFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMutableDescriptorTypeFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceMutableDescriptorTypeFeaturesEXT &\n      setMutableDescriptorType( VULKAN_HPP_NAMESPACE::Bool32 mutableDescriptorType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mutableDescriptorType = mutableDescriptorType_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, mutableDescriptorType );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceMutableDescriptorTypeFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceMutableDescriptorTypeFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( mutableDescriptorType == rhs.mutableDescriptorType );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceMutableDescriptorTypeFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                 = StructureType::ePhysicalDeviceMutableDescriptorTypeFeaturesEXT;\n    void *                              pNext                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        mutableDescriptorType = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceMutableDescriptorTypeFeaturesEXT>\n  {\n    using Type = PhysicalDeviceMutableDescriptorTypeFeaturesEXT;\n  };\n\n  using PhysicalDeviceMutableDescriptorTypeFeaturesVALVE = PhysicalDeviceMutableDescriptorTypeFeaturesEXT;\n\n  struct PhysicalDeviceNestedCommandBufferFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceNestedCommandBufferFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceNestedCommandBufferFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceNestedCommandBufferFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 nestedCommandBuffer_                = {},\n                                                                       VULKAN_HPP_NAMESPACE::Bool32 nestedCommandBufferRendering_       = {},\n                                                                       VULKAN_HPP_NAMESPACE::Bool32 nestedCommandBufferSimultaneousUse_ = {},\n                                                                       void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , nestedCommandBuffer{ nestedCommandBuffer_ }\n      , nestedCommandBufferRendering{ nestedCommandBufferRendering_ }\n      , nestedCommandBufferSimultaneousUse{ nestedCommandBufferSimultaneousUse_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceNestedCommandBufferFeaturesEXT( PhysicalDeviceNestedCommandBufferFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceNestedCommandBufferFeaturesEXT( VkPhysicalDeviceNestedCommandBufferFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceNestedCommandBufferFeaturesEXT( *reinterpret_cast<PhysicalDeviceNestedCommandBufferFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceNestedCommandBufferFeaturesEXT & operator=( PhysicalDeviceNestedCommandBufferFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceNestedCommandBufferFeaturesEXT & operator=( VkPhysicalDeviceNestedCommandBufferFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceNestedCommandBufferFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceNestedCommandBufferFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceNestedCommandBufferFeaturesEXT &\n      setNestedCommandBuffer( VULKAN_HPP_NAMESPACE::Bool32 nestedCommandBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      nestedCommandBuffer = nestedCommandBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceNestedCommandBufferFeaturesEXT &\n      setNestedCommandBufferRendering( VULKAN_HPP_NAMESPACE::Bool32 nestedCommandBufferRendering_ ) VULKAN_HPP_NOEXCEPT\n    {\n      nestedCommandBufferRendering = nestedCommandBufferRendering_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceNestedCommandBufferFeaturesEXT &\n      setNestedCommandBufferSimultaneousUse( VULKAN_HPP_NAMESPACE::Bool32 nestedCommandBufferSimultaneousUse_ ) VULKAN_HPP_NOEXCEPT\n    {\n      nestedCommandBufferSimultaneousUse = nestedCommandBufferSimultaneousUse_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceNestedCommandBufferFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceNestedCommandBufferFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceNestedCommandBufferFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceNestedCommandBufferFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, nestedCommandBuffer, nestedCommandBufferRendering, nestedCommandBufferSimultaneousUse );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceNestedCommandBufferFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceNestedCommandBufferFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( nestedCommandBuffer == rhs.nestedCommandBuffer ) &&\n             ( nestedCommandBufferRendering == rhs.nestedCommandBufferRendering ) &&\n             ( nestedCommandBufferSimultaneousUse == rhs.nestedCommandBufferSimultaneousUse );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceNestedCommandBufferFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                              = StructureType::ePhysicalDeviceNestedCommandBufferFeaturesEXT;\n    void *                              pNext                              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        nestedCommandBuffer                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        nestedCommandBufferRendering       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        nestedCommandBufferSimultaneousUse = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceNestedCommandBufferFeaturesEXT>\n  {\n    using Type = PhysicalDeviceNestedCommandBufferFeaturesEXT;\n  };\n\n  struct PhysicalDeviceNestedCommandBufferPropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceNestedCommandBufferPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceNestedCommandBufferPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceNestedCommandBufferPropertiesEXT( uint32_t maxCommandBufferNestingLevel_ = {},\n                                                                         void *   pNext_                        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxCommandBufferNestingLevel{ maxCommandBufferNestingLevel_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceNestedCommandBufferPropertiesEXT( PhysicalDeviceNestedCommandBufferPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceNestedCommandBufferPropertiesEXT( VkPhysicalDeviceNestedCommandBufferPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceNestedCommandBufferPropertiesEXT( *reinterpret_cast<PhysicalDeviceNestedCommandBufferPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceNestedCommandBufferPropertiesEXT & operator=( PhysicalDeviceNestedCommandBufferPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceNestedCommandBufferPropertiesEXT & operator=( VkPhysicalDeviceNestedCommandBufferPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceNestedCommandBufferPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceNestedCommandBufferPropertiesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceNestedCommandBufferPropertiesEXT &\n      setMaxCommandBufferNestingLevel( uint32_t maxCommandBufferNestingLevel_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxCommandBufferNestingLevel = maxCommandBufferNestingLevel_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceNestedCommandBufferPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceNestedCommandBufferPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceNestedCommandBufferPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceNestedCommandBufferPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxCommandBufferNestingLevel );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceNestedCommandBufferPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceNestedCommandBufferPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxCommandBufferNestingLevel == rhs.maxCommandBufferNestingLevel );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceNestedCommandBufferPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                        = StructureType::ePhysicalDeviceNestedCommandBufferPropertiesEXT;\n    void *                              pNext                        = {};\n    uint32_t                            maxCommandBufferNestingLevel = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceNestedCommandBufferPropertiesEXT>\n  {\n    using Type = PhysicalDeviceNestedCommandBufferPropertiesEXT;\n  };\n\n  struct PhysicalDeviceNonSeamlessCubeMapFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceNonSeamlessCubeMapFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceNonSeamlessCubeMapFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 nonSeamlessCubeMap_ = {},\n                                                                      void *                       pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , nonSeamlessCubeMap{ nonSeamlessCubeMap_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceNonSeamlessCubeMapFeaturesEXT( PhysicalDeviceNonSeamlessCubeMapFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceNonSeamlessCubeMapFeaturesEXT( VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceNonSeamlessCubeMapFeaturesEXT( *reinterpret_cast<PhysicalDeviceNonSeamlessCubeMapFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceNonSeamlessCubeMapFeaturesEXT & operator=( PhysicalDeviceNonSeamlessCubeMapFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceNonSeamlessCubeMapFeaturesEXT & operator=( VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceNonSeamlessCubeMapFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceNonSeamlessCubeMapFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceNonSeamlessCubeMapFeaturesEXT &\n      setNonSeamlessCubeMap( VULKAN_HPP_NAMESPACE::Bool32 nonSeamlessCubeMap_ ) VULKAN_HPP_NOEXCEPT\n    {\n      nonSeamlessCubeMap = nonSeamlessCubeMap_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, nonSeamlessCubeMap );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceNonSeamlessCubeMapFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceNonSeamlessCubeMapFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( nonSeamlessCubeMap == rhs.nonSeamlessCubeMap );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceNonSeamlessCubeMapFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType              = StructureType::ePhysicalDeviceNonSeamlessCubeMapFeaturesEXT;\n    void *                              pNext              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        nonSeamlessCubeMap = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceNonSeamlessCubeMapFeaturesEXT>\n  {\n    using Type = PhysicalDeviceNonSeamlessCubeMapFeaturesEXT;\n  };\n\n  struct PhysicalDeviceOpacityMicromapFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceOpacityMicromapFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceOpacityMicromapFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceOpacityMicromapFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 micromap_              = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 micromapCaptureReplay_ = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 micromapHostCommands_  = {},\n                                                                   void *                       pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , micromap{ micromap_ }\n      , micromapCaptureReplay{ micromapCaptureReplay_ }\n      , micromapHostCommands{ micromapHostCommands_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceOpacityMicromapFeaturesEXT( PhysicalDeviceOpacityMicromapFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceOpacityMicromapFeaturesEXT( VkPhysicalDeviceOpacityMicromapFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceOpacityMicromapFeaturesEXT( *reinterpret_cast<PhysicalDeviceOpacityMicromapFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceOpacityMicromapFeaturesEXT & operator=( PhysicalDeviceOpacityMicromapFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceOpacityMicromapFeaturesEXT & operator=( VkPhysicalDeviceOpacityMicromapFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceOpacityMicromapFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceOpacityMicromapFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceOpacityMicromapFeaturesEXT & setMicromap( VULKAN_HPP_NAMESPACE::Bool32 micromap_ ) VULKAN_HPP_NOEXCEPT\n    {\n      micromap = micromap_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceOpacityMicromapFeaturesEXT &\n      setMicromapCaptureReplay( VULKAN_HPP_NAMESPACE::Bool32 micromapCaptureReplay_ ) VULKAN_HPP_NOEXCEPT\n    {\n      micromapCaptureReplay = micromapCaptureReplay_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceOpacityMicromapFeaturesEXT &\n      setMicromapHostCommands( VULKAN_HPP_NAMESPACE::Bool32 micromapHostCommands_ ) VULKAN_HPP_NOEXCEPT\n    {\n      micromapHostCommands = micromapHostCommands_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceOpacityMicromapFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceOpacityMicromapFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceOpacityMicromapFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceOpacityMicromapFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, micromap, micromapCaptureReplay, micromapHostCommands );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceOpacityMicromapFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceOpacityMicromapFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( micromap == rhs.micromap ) && ( micromapCaptureReplay == rhs.micromapCaptureReplay ) &&\n             ( micromapHostCommands == rhs.micromapHostCommands );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceOpacityMicromapFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                 = StructureType::ePhysicalDeviceOpacityMicromapFeaturesEXT;\n    void *                              pNext                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        micromap              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        micromapCaptureReplay = {};\n    VULKAN_HPP_NAMESPACE::Bool32        micromapHostCommands  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceOpacityMicromapFeaturesEXT>\n  {\n    using Type = PhysicalDeviceOpacityMicromapFeaturesEXT;\n  };\n\n  struct PhysicalDeviceOpacityMicromapPropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceOpacityMicromapPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceOpacityMicromapPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceOpacityMicromapPropertiesEXT( uint32_t maxOpacity2StateSubdivisionLevel_ = {},\n                                                                     uint32_t maxOpacity4StateSubdivisionLevel_ = {},\n                                                                     void *   pNext_                            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxOpacity2StateSubdivisionLevel{ maxOpacity2StateSubdivisionLevel_ }\n      , maxOpacity4StateSubdivisionLevel{ maxOpacity4StateSubdivisionLevel_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceOpacityMicromapPropertiesEXT( PhysicalDeviceOpacityMicromapPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceOpacityMicromapPropertiesEXT( VkPhysicalDeviceOpacityMicromapPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceOpacityMicromapPropertiesEXT( *reinterpret_cast<PhysicalDeviceOpacityMicromapPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceOpacityMicromapPropertiesEXT & operator=( PhysicalDeviceOpacityMicromapPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceOpacityMicromapPropertiesEXT & operator=( VkPhysicalDeviceOpacityMicromapPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceOpacityMicromapPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceOpacityMicromapPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceOpacityMicromapPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceOpacityMicromapPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceOpacityMicromapPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxOpacity2StateSubdivisionLevel, maxOpacity4StateSubdivisionLevel );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceOpacityMicromapPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceOpacityMicromapPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxOpacity2StateSubdivisionLevel == rhs.maxOpacity2StateSubdivisionLevel ) &&\n             ( maxOpacity4StateSubdivisionLevel == rhs.maxOpacity4StateSubdivisionLevel );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceOpacityMicromapPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                            = StructureType::ePhysicalDeviceOpacityMicromapPropertiesEXT;\n    void *                              pNext                            = {};\n    uint32_t                            maxOpacity2StateSubdivisionLevel = {};\n    uint32_t                            maxOpacity4StateSubdivisionLevel = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceOpacityMicromapPropertiesEXT>\n  {\n    using Type = PhysicalDeviceOpacityMicromapPropertiesEXT;\n  };\n\n  struct PhysicalDeviceOpticalFlowFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceOpticalFlowFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceOpticalFlowFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceOpticalFlowFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 opticalFlow_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , opticalFlow{ opticalFlow_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceOpticalFlowFeaturesNV( PhysicalDeviceOpticalFlowFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceOpticalFlowFeaturesNV( VkPhysicalDeviceOpticalFlowFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceOpticalFlowFeaturesNV( *reinterpret_cast<PhysicalDeviceOpticalFlowFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceOpticalFlowFeaturesNV & operator=( PhysicalDeviceOpticalFlowFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceOpticalFlowFeaturesNV & operator=( VkPhysicalDeviceOpticalFlowFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceOpticalFlowFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceOpticalFlowFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceOpticalFlowFeaturesNV & setOpticalFlow( VULKAN_HPP_NAMESPACE::Bool32 opticalFlow_ ) VULKAN_HPP_NOEXCEPT\n    {\n      opticalFlow = opticalFlow_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceOpticalFlowFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceOpticalFlowFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceOpticalFlowFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceOpticalFlowFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, opticalFlow );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceOpticalFlowFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceOpticalFlowFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( opticalFlow == rhs.opticalFlow );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceOpticalFlowFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType       = StructureType::ePhysicalDeviceOpticalFlowFeaturesNV;\n    void *                              pNext       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        opticalFlow = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceOpticalFlowFeaturesNV>\n  {\n    using Type = PhysicalDeviceOpticalFlowFeaturesNV;\n  };\n\n  struct PhysicalDeviceOpticalFlowPropertiesNV\n  {\n    using NativeType = VkPhysicalDeviceOpticalFlowPropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceOpticalFlowPropertiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceOpticalFlowPropertiesNV( VULKAN_HPP_NAMESPACE::OpticalFlowGridSizeFlagsNV supportedOutputGridSizes_   = {},\n                                                                VULKAN_HPP_NAMESPACE::OpticalFlowGridSizeFlagsNV supportedHintGridSizes_     = {},\n                                                                VULKAN_HPP_NAMESPACE::Bool32                     hintSupported_              = {},\n                                                                VULKAN_HPP_NAMESPACE::Bool32                     costSupported_              = {},\n                                                                VULKAN_HPP_NAMESPACE::Bool32                     bidirectionalFlowSupported_ = {},\n                                                                VULKAN_HPP_NAMESPACE::Bool32                     globalFlowSupported_        = {},\n                                                                uint32_t                                         minWidth_                   = {},\n                                                                uint32_t                                         minHeight_                  = {},\n                                                                uint32_t                                         maxWidth_                   = {},\n                                                                uint32_t                                         maxHeight_                  = {},\n                                                                uint32_t                                         maxNumRegionsOfInterest_    = {},\n                                                                void *                                           pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , supportedOutputGridSizes{ supportedOutputGridSizes_ }\n      , supportedHintGridSizes{ supportedHintGridSizes_ }\n      , hintSupported{ hintSupported_ }\n      , costSupported{ costSupported_ }\n      , bidirectionalFlowSupported{ bidirectionalFlowSupported_ }\n      , globalFlowSupported{ globalFlowSupported_ }\n      , minWidth{ minWidth_ }\n      , minHeight{ minHeight_ }\n      , maxWidth{ maxWidth_ }\n      , maxHeight{ maxHeight_ }\n      , maxNumRegionsOfInterest{ maxNumRegionsOfInterest_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceOpticalFlowPropertiesNV( PhysicalDeviceOpticalFlowPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceOpticalFlowPropertiesNV( VkPhysicalDeviceOpticalFlowPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceOpticalFlowPropertiesNV( *reinterpret_cast<PhysicalDeviceOpticalFlowPropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceOpticalFlowPropertiesNV & operator=( PhysicalDeviceOpticalFlowPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceOpticalFlowPropertiesNV & operator=( VkPhysicalDeviceOpticalFlowPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceOpticalFlowPropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceOpticalFlowPropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceOpticalFlowPropertiesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceOpticalFlowPropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceOpticalFlowPropertiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::OpticalFlowGridSizeFlagsNV const &,\n               VULKAN_HPP_NAMESPACE::OpticalFlowGridSizeFlagsNV const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       supportedOutputGridSizes,\n                       supportedHintGridSizes,\n                       hintSupported,\n                       costSupported,\n                       bidirectionalFlowSupported,\n                       globalFlowSupported,\n                       minWidth,\n                       minHeight,\n                       maxWidth,\n                       maxHeight,\n                       maxNumRegionsOfInterest );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceOpticalFlowPropertiesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceOpticalFlowPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( supportedOutputGridSizes == rhs.supportedOutputGridSizes ) &&\n             ( supportedHintGridSizes == rhs.supportedHintGridSizes ) && ( hintSupported == rhs.hintSupported ) && ( costSupported == rhs.costSupported ) &&\n             ( bidirectionalFlowSupported == rhs.bidirectionalFlowSupported ) && ( globalFlowSupported == rhs.globalFlowSupported ) &&\n             ( minWidth == rhs.minWidth ) && ( minHeight == rhs.minHeight ) && ( maxWidth == rhs.maxWidth ) && ( maxHeight == rhs.maxHeight ) &&\n             ( maxNumRegionsOfInterest == rhs.maxNumRegionsOfInterest );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceOpticalFlowPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType              sType                      = StructureType::ePhysicalDeviceOpticalFlowPropertiesNV;\n    void *                                           pNext                      = {};\n    VULKAN_HPP_NAMESPACE::OpticalFlowGridSizeFlagsNV supportedOutputGridSizes   = {};\n    VULKAN_HPP_NAMESPACE::OpticalFlowGridSizeFlagsNV supportedHintGridSizes     = {};\n    VULKAN_HPP_NAMESPACE::Bool32                     hintSupported              = {};\n    VULKAN_HPP_NAMESPACE::Bool32                     costSupported              = {};\n    VULKAN_HPP_NAMESPACE::Bool32                     bidirectionalFlowSupported = {};\n    VULKAN_HPP_NAMESPACE::Bool32                     globalFlowSupported        = {};\n    uint32_t                                         minWidth                   = {};\n    uint32_t                                         minHeight                  = {};\n    uint32_t                                         maxWidth                   = {};\n    uint32_t                                         maxHeight                  = {};\n    uint32_t                                         maxNumRegionsOfInterest    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceOpticalFlowPropertiesNV>\n  {\n    using Type = PhysicalDeviceOpticalFlowPropertiesNV;\n  };\n\n  struct PhysicalDevicePCIBusInfoPropertiesEXT\n  {\n    using NativeType = VkPhysicalDevicePCIBusInfoPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePciBusInfoPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePCIBusInfoPropertiesEXT(\n      uint32_t pciDomain_ = {}, uint32_t pciBus_ = {}, uint32_t pciDevice_ = {}, uint32_t pciFunction_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pciDomain{ pciDomain_ }\n      , pciBus{ pciBus_ }\n      , pciDevice{ pciDevice_ }\n      , pciFunction{ pciFunction_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePCIBusInfoPropertiesEXT( PhysicalDevicePCIBusInfoPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePCIBusInfoPropertiesEXT( VkPhysicalDevicePCIBusInfoPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePCIBusInfoPropertiesEXT( *reinterpret_cast<PhysicalDevicePCIBusInfoPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePCIBusInfoPropertiesEXT & operator=( PhysicalDevicePCIBusInfoPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePCIBusInfoPropertiesEXT & operator=( VkPhysicalDevicePCIBusInfoPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePCIBusInfoPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDevicePCIBusInfoPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePCIBusInfoPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDevicePCIBusInfoPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePCIBusInfoPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &, uint32_t const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pciDomain, pciBus, pciDevice, pciFunction );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePCIBusInfoPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePCIBusInfoPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pciDomain == rhs.pciDomain ) && ( pciBus == rhs.pciBus ) && ( pciDevice == rhs.pciDevice ) &&\n             ( pciFunction == rhs.pciFunction );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePCIBusInfoPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType       = StructureType::ePhysicalDevicePciBusInfoPropertiesEXT;\n    void *                              pNext       = {};\n    uint32_t                            pciDomain   = {};\n    uint32_t                            pciBus      = {};\n    uint32_t                            pciDevice   = {};\n    uint32_t                            pciFunction = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePciBusInfoPropertiesEXT>\n  {\n    using Type = PhysicalDevicePCIBusInfoPropertiesEXT;\n  };\n\n  struct PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT\n  {\n    using NativeType = VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePageableDeviceLocalMemoryFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 pageableDeviceLocalMemory_ = {},\n                                                                             void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pageableDeviceLocalMemory{ pageableDeviceLocalMemory_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT( PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT( VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT( *reinterpret_cast<PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT &\n      operator=( PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT & operator=( VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT &\n      setPageableDeviceLocalMemory( VULKAN_HPP_NAMESPACE::Bool32 pageableDeviceLocalMemory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pageableDeviceLocalMemory = pageableDeviceLocalMemory_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pageableDeviceLocalMemory );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pageableDeviceLocalMemory == rhs.pageableDeviceLocalMemory );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                     = StructureType::ePhysicalDevicePageableDeviceLocalMemoryFeaturesEXT;\n    void *                              pNext                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        pageableDeviceLocalMemory = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePageableDeviceLocalMemoryFeaturesEXT>\n  {\n    using Type = PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT;\n  };\n\n  struct PhysicalDevicePartitionedAccelerationStructureFeaturesNV\n  {\n    using NativeType = VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePartitionedAccelerationStructureFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePartitionedAccelerationStructureFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 partitionedAccelerationStructure_ = {},\n                                                                                   void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , partitionedAccelerationStructure{ partitionedAccelerationStructure_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePartitionedAccelerationStructureFeaturesNV( PhysicalDevicePartitionedAccelerationStructureFeaturesNV const & rhs )\n      VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePartitionedAccelerationStructureFeaturesNV( VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePartitionedAccelerationStructureFeaturesNV( *reinterpret_cast<PhysicalDevicePartitionedAccelerationStructureFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePartitionedAccelerationStructureFeaturesNV &\n      operator=( PhysicalDevicePartitionedAccelerationStructureFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePartitionedAccelerationStructureFeaturesNV &\n      operator=( VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePartitionedAccelerationStructureFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePartitionedAccelerationStructureFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePartitionedAccelerationStructureFeaturesNV &\n      setPartitionedAccelerationStructure( VULKAN_HPP_NAMESPACE::Bool32 partitionedAccelerationStructure_ ) VULKAN_HPP_NOEXCEPT\n    {\n      partitionedAccelerationStructure = partitionedAccelerationStructure_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePartitionedAccelerationStructureFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, partitionedAccelerationStructure );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePartitionedAccelerationStructureFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePartitionedAccelerationStructureFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( partitionedAccelerationStructure == rhs.partitionedAccelerationStructure );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePartitionedAccelerationStructureFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                            = StructureType::ePhysicalDevicePartitionedAccelerationStructureFeaturesNV;\n    void *                              pNext                            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        partitionedAccelerationStructure = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePartitionedAccelerationStructureFeaturesNV>\n  {\n    using Type = PhysicalDevicePartitionedAccelerationStructureFeaturesNV;\n  };\n\n  struct PhysicalDevicePartitionedAccelerationStructurePropertiesNV\n  {\n    using NativeType = VkPhysicalDevicePartitionedAccelerationStructurePropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePartitionedAccelerationStructurePropertiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePartitionedAccelerationStructurePropertiesNV( uint32_t maxPartitionCount_ = {},\n                                                                                     void *   pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxPartitionCount{ maxPartitionCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePartitionedAccelerationStructurePropertiesNV( PhysicalDevicePartitionedAccelerationStructurePropertiesNV const & rhs )\n      VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePartitionedAccelerationStructurePropertiesNV( VkPhysicalDevicePartitionedAccelerationStructurePropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePartitionedAccelerationStructurePropertiesNV(\n          *reinterpret_cast<PhysicalDevicePartitionedAccelerationStructurePropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePartitionedAccelerationStructurePropertiesNV &\n      operator=( PhysicalDevicePartitionedAccelerationStructurePropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePartitionedAccelerationStructurePropertiesNV &\n      operator=( VkPhysicalDevicePartitionedAccelerationStructurePropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePartitionedAccelerationStructurePropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDevicePartitionedAccelerationStructurePropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePartitionedAccelerationStructurePropertiesNV *>( this );\n    }\n\n    operator VkPhysicalDevicePartitionedAccelerationStructurePropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePartitionedAccelerationStructurePropertiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxPartitionCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePartitionedAccelerationStructurePropertiesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePartitionedAccelerationStructurePropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxPartitionCount == rhs.maxPartitionCount );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePartitionedAccelerationStructurePropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType             = StructureType::ePhysicalDevicePartitionedAccelerationStructurePropertiesNV;\n    void *                              pNext             = {};\n    uint32_t                            maxPartitionCount = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePartitionedAccelerationStructurePropertiesNV>\n  {\n    using Type = PhysicalDevicePartitionedAccelerationStructurePropertiesNV;\n  };\n\n  struct PhysicalDevicePerStageDescriptorSetFeaturesNV\n  {\n    using NativeType = VkPhysicalDevicePerStageDescriptorSetFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePerStageDescriptorSetFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePerStageDescriptorSetFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 perStageDescriptorSet_ = {},\n                                                                        VULKAN_HPP_NAMESPACE::Bool32 dynamicPipelineLayout_ = {},\n                                                                        void *                       pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , perStageDescriptorSet{ perStageDescriptorSet_ }\n      , dynamicPipelineLayout{ dynamicPipelineLayout_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDevicePerStageDescriptorSetFeaturesNV( PhysicalDevicePerStageDescriptorSetFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePerStageDescriptorSetFeaturesNV( VkPhysicalDevicePerStageDescriptorSetFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePerStageDescriptorSetFeaturesNV( *reinterpret_cast<PhysicalDevicePerStageDescriptorSetFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePerStageDescriptorSetFeaturesNV & operator=( PhysicalDevicePerStageDescriptorSetFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePerStageDescriptorSetFeaturesNV & operator=( VkPhysicalDevicePerStageDescriptorSetFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePerStageDescriptorSetFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePerStageDescriptorSetFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePerStageDescriptorSetFeaturesNV &\n      setPerStageDescriptorSet( VULKAN_HPP_NAMESPACE::Bool32 perStageDescriptorSet_ ) VULKAN_HPP_NOEXCEPT\n    {\n      perStageDescriptorSet = perStageDescriptorSet_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePerStageDescriptorSetFeaturesNV &\n      setDynamicPipelineLayout( VULKAN_HPP_NAMESPACE::Bool32 dynamicPipelineLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dynamicPipelineLayout = dynamicPipelineLayout_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevicePerStageDescriptorSetFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePerStageDescriptorSetFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDevicePerStageDescriptorSetFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePerStageDescriptorSetFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, perStageDescriptorSet, dynamicPipelineLayout );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePerStageDescriptorSetFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePerStageDescriptorSetFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( perStageDescriptorSet == rhs.perStageDescriptorSet ) &&\n             ( dynamicPipelineLayout == rhs.dynamicPipelineLayout );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePerStageDescriptorSetFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                 = StructureType::ePhysicalDevicePerStageDescriptorSetFeaturesNV;\n    void *                              pNext                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        perStageDescriptorSet = {};\n    VULKAN_HPP_NAMESPACE::Bool32        dynamicPipelineLayout = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePerStageDescriptorSetFeaturesNV>\n  {\n    using Type = PhysicalDevicePerStageDescriptorSetFeaturesNV;\n  };\n\n  struct PhysicalDevicePerformanceQueryFeaturesKHR\n  {\n    using NativeType = VkPhysicalDevicePerformanceQueryFeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePerformanceQueryFeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePerformanceQueryFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 performanceCounterQueryPools_         = {},\n                                                                    VULKAN_HPP_NAMESPACE::Bool32 performanceCounterMultipleQueryPools_ = {},\n                                                                    void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , performanceCounterQueryPools{ performanceCounterQueryPools_ }\n      , performanceCounterMultipleQueryPools{ performanceCounterMultipleQueryPools_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePerformanceQueryFeaturesKHR( PhysicalDevicePerformanceQueryFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePerformanceQueryFeaturesKHR( VkPhysicalDevicePerformanceQueryFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePerformanceQueryFeaturesKHR( *reinterpret_cast<PhysicalDevicePerformanceQueryFeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePerformanceQueryFeaturesKHR & operator=( PhysicalDevicePerformanceQueryFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePerformanceQueryFeaturesKHR & operator=( VkPhysicalDevicePerformanceQueryFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePerformanceQueryFeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePerformanceQueryFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePerformanceQueryFeaturesKHR &\n      setPerformanceCounterQueryPools( VULKAN_HPP_NAMESPACE::Bool32 performanceCounterQueryPools_ ) VULKAN_HPP_NOEXCEPT\n    {\n      performanceCounterQueryPools = performanceCounterQueryPools_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePerformanceQueryFeaturesKHR &\n      setPerformanceCounterMultipleQueryPools( VULKAN_HPP_NAMESPACE::Bool32 performanceCounterMultipleQueryPools_ ) VULKAN_HPP_NOEXCEPT\n    {\n      performanceCounterMultipleQueryPools = performanceCounterMultipleQueryPools_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevicePerformanceQueryFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePerformanceQueryFeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDevicePerformanceQueryFeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePerformanceQueryFeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, performanceCounterQueryPools, performanceCounterMultipleQueryPools );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePerformanceQueryFeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePerformanceQueryFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( performanceCounterQueryPools == rhs.performanceCounterQueryPools ) &&\n             ( performanceCounterMultipleQueryPools == rhs.performanceCounterMultipleQueryPools );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePerformanceQueryFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                = StructureType::ePhysicalDevicePerformanceQueryFeaturesKHR;\n    void *                              pNext                                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        performanceCounterQueryPools         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        performanceCounterMultipleQueryPools = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePerformanceQueryFeaturesKHR>\n  {\n    using Type = PhysicalDevicePerformanceQueryFeaturesKHR;\n  };\n\n  struct PhysicalDevicePerformanceQueryPropertiesKHR\n  {\n    using NativeType = VkPhysicalDevicePerformanceQueryPropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePerformanceQueryPropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePerformanceQueryPropertiesKHR( VULKAN_HPP_NAMESPACE::Bool32 allowCommandBufferQueryCopies_ = {},\n                                                                      void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , allowCommandBufferQueryCopies{ allowCommandBufferQueryCopies_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePerformanceQueryPropertiesKHR( PhysicalDevicePerformanceQueryPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePerformanceQueryPropertiesKHR( VkPhysicalDevicePerformanceQueryPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePerformanceQueryPropertiesKHR( *reinterpret_cast<PhysicalDevicePerformanceQueryPropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePerformanceQueryPropertiesKHR & operator=( PhysicalDevicePerformanceQueryPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePerformanceQueryPropertiesKHR & operator=( VkPhysicalDevicePerformanceQueryPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePerformanceQueryPropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDevicePerformanceQueryPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePerformanceQueryPropertiesKHR *>( this );\n    }\n\n    operator VkPhysicalDevicePerformanceQueryPropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePerformanceQueryPropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, allowCommandBufferQueryCopies );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePerformanceQueryPropertiesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePerformanceQueryPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( allowCommandBufferQueryCopies == rhs.allowCommandBufferQueryCopies );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePerformanceQueryPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                         = StructureType::ePhysicalDevicePerformanceQueryPropertiesKHR;\n    void *                              pNext                         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        allowCommandBufferQueryCopies = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePerformanceQueryPropertiesKHR>\n  {\n    using Type = PhysicalDevicePerformanceQueryPropertiesKHR;\n  };\n\n  struct PhysicalDevicePipelineBinaryFeaturesKHR\n  {\n    using NativeType = VkPhysicalDevicePipelineBinaryFeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePipelineBinaryFeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePipelineBinaryFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 pipelineBinaries_ = {},\n                                                                  void *                       pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pipelineBinaries{ pipelineBinaries_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePipelineBinaryFeaturesKHR( PhysicalDevicePipelineBinaryFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePipelineBinaryFeaturesKHR( VkPhysicalDevicePipelineBinaryFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePipelineBinaryFeaturesKHR( *reinterpret_cast<PhysicalDevicePipelineBinaryFeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePipelineBinaryFeaturesKHR & operator=( PhysicalDevicePipelineBinaryFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePipelineBinaryFeaturesKHR & operator=( VkPhysicalDevicePipelineBinaryFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineBinaryFeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePipelineBinaryFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePipelineBinaryFeaturesKHR & setPipelineBinaries( VULKAN_HPP_NAMESPACE::Bool32 pipelineBinaries_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineBinaries = pipelineBinaries_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevicePipelineBinaryFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePipelineBinaryFeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDevicePipelineBinaryFeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePipelineBinaryFeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pipelineBinaries );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePipelineBinaryFeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePipelineBinaryFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pipelineBinaries == rhs.pipelineBinaries );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePipelineBinaryFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType            = StructureType::ePhysicalDevicePipelineBinaryFeaturesKHR;\n    void *                              pNext            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        pipelineBinaries = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePipelineBinaryFeaturesKHR>\n  {\n    using Type = PhysicalDevicePipelineBinaryFeaturesKHR;\n  };\n\n  struct PhysicalDevicePipelineBinaryPropertiesKHR\n  {\n    using NativeType = VkPhysicalDevicePipelineBinaryPropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePipelineBinaryPropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePipelineBinaryPropertiesKHR( VULKAN_HPP_NAMESPACE::Bool32 pipelineBinaryInternalCache_            = {},\n                                                                    VULKAN_HPP_NAMESPACE::Bool32 pipelineBinaryInternalCacheControl_     = {},\n                                                                    VULKAN_HPP_NAMESPACE::Bool32 pipelineBinaryPrefersInternalCache_     = {},\n                                                                    VULKAN_HPP_NAMESPACE::Bool32 pipelineBinaryPrecompiledInternalCache_ = {},\n                                                                    VULKAN_HPP_NAMESPACE::Bool32 pipelineBinaryCompressedData_           = {},\n                                                                    void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pipelineBinaryInternalCache{ pipelineBinaryInternalCache_ }\n      , pipelineBinaryInternalCacheControl{ pipelineBinaryInternalCacheControl_ }\n      , pipelineBinaryPrefersInternalCache{ pipelineBinaryPrefersInternalCache_ }\n      , pipelineBinaryPrecompiledInternalCache{ pipelineBinaryPrecompiledInternalCache_ }\n      , pipelineBinaryCompressedData{ pipelineBinaryCompressedData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePipelineBinaryPropertiesKHR( PhysicalDevicePipelineBinaryPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePipelineBinaryPropertiesKHR( VkPhysicalDevicePipelineBinaryPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePipelineBinaryPropertiesKHR( *reinterpret_cast<PhysicalDevicePipelineBinaryPropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePipelineBinaryPropertiesKHR & operator=( PhysicalDevicePipelineBinaryPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePipelineBinaryPropertiesKHR & operator=( VkPhysicalDevicePipelineBinaryPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineBinaryPropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePipelineBinaryPropertiesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePipelineBinaryPropertiesKHR &\n      setPipelineBinaryInternalCache( VULKAN_HPP_NAMESPACE::Bool32 pipelineBinaryInternalCache_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineBinaryInternalCache = pipelineBinaryInternalCache_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePipelineBinaryPropertiesKHR &\n      setPipelineBinaryInternalCacheControl( VULKAN_HPP_NAMESPACE::Bool32 pipelineBinaryInternalCacheControl_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineBinaryInternalCacheControl = pipelineBinaryInternalCacheControl_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePipelineBinaryPropertiesKHR &\n      setPipelineBinaryPrefersInternalCache( VULKAN_HPP_NAMESPACE::Bool32 pipelineBinaryPrefersInternalCache_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineBinaryPrefersInternalCache = pipelineBinaryPrefersInternalCache_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePipelineBinaryPropertiesKHR &\n      setPipelineBinaryPrecompiledInternalCache( VULKAN_HPP_NAMESPACE::Bool32 pipelineBinaryPrecompiledInternalCache_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineBinaryPrecompiledInternalCache = pipelineBinaryPrecompiledInternalCache_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePipelineBinaryPropertiesKHR &\n      setPipelineBinaryCompressedData( VULKAN_HPP_NAMESPACE::Bool32 pipelineBinaryCompressedData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineBinaryCompressedData = pipelineBinaryCompressedData_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevicePipelineBinaryPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePipelineBinaryPropertiesKHR *>( this );\n    }\n\n    operator VkPhysicalDevicePipelineBinaryPropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePipelineBinaryPropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       pipelineBinaryInternalCache,\n                       pipelineBinaryInternalCacheControl,\n                       pipelineBinaryPrefersInternalCache,\n                       pipelineBinaryPrecompiledInternalCache,\n                       pipelineBinaryCompressedData );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePipelineBinaryPropertiesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePipelineBinaryPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pipelineBinaryInternalCache == rhs.pipelineBinaryInternalCache ) &&\n             ( pipelineBinaryInternalCacheControl == rhs.pipelineBinaryInternalCacheControl ) &&\n             ( pipelineBinaryPrefersInternalCache == rhs.pipelineBinaryPrefersInternalCache ) &&\n             ( pipelineBinaryPrecompiledInternalCache == rhs.pipelineBinaryPrecompiledInternalCache ) &&\n             ( pipelineBinaryCompressedData == rhs.pipelineBinaryCompressedData );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePipelineBinaryPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                  = StructureType::ePhysicalDevicePipelineBinaryPropertiesKHR;\n    void *                              pNext                                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        pipelineBinaryInternalCache            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        pipelineBinaryInternalCacheControl     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        pipelineBinaryPrefersInternalCache     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        pipelineBinaryPrecompiledInternalCache = {};\n    VULKAN_HPP_NAMESPACE::Bool32        pipelineBinaryCompressedData           = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePipelineBinaryPropertiesKHR>\n  {\n    using Type = PhysicalDevicePipelineBinaryPropertiesKHR;\n  };\n\n  struct PhysicalDevicePipelineCreationCacheControlFeatures\n  {\n    using NativeType = VkPhysicalDevicePipelineCreationCacheControlFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePipelineCreationCacheControlFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePipelineCreationCacheControlFeatures( VULKAN_HPP_NAMESPACE::Bool32 pipelineCreationCacheControl_ = {},\n                                                                             void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pipelineCreationCacheControl{ pipelineCreationCacheControl_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDevicePipelineCreationCacheControlFeatures( PhysicalDevicePipelineCreationCacheControlFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePipelineCreationCacheControlFeatures( VkPhysicalDevicePipelineCreationCacheControlFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePipelineCreationCacheControlFeatures( *reinterpret_cast<PhysicalDevicePipelineCreationCacheControlFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePipelineCreationCacheControlFeatures &\n      operator=( PhysicalDevicePipelineCreationCacheControlFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePipelineCreationCacheControlFeatures & operator=( VkPhysicalDevicePipelineCreationCacheControlFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineCreationCacheControlFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePipelineCreationCacheControlFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePipelineCreationCacheControlFeatures &\n      setPipelineCreationCacheControl( VULKAN_HPP_NAMESPACE::Bool32 pipelineCreationCacheControl_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineCreationCacheControl = pipelineCreationCacheControl_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevicePipelineCreationCacheControlFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePipelineCreationCacheControlFeatures *>( this );\n    }\n\n    operator VkPhysicalDevicePipelineCreationCacheControlFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePipelineCreationCacheControlFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pipelineCreationCacheControl );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePipelineCreationCacheControlFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePipelineCreationCacheControlFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pipelineCreationCacheControl == rhs.pipelineCreationCacheControl );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePipelineCreationCacheControlFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                        = StructureType::ePhysicalDevicePipelineCreationCacheControlFeatures;\n    void *                              pNext                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        pipelineCreationCacheControl = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePipelineCreationCacheControlFeatures>\n  {\n    using Type = PhysicalDevicePipelineCreationCacheControlFeatures;\n  };\n\n  using PhysicalDevicePipelineCreationCacheControlFeaturesEXT = PhysicalDevicePipelineCreationCacheControlFeatures;\n\n  struct PhysicalDevicePipelineExecutablePropertiesFeaturesKHR\n  {\n    using NativeType = VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePipelineExecutablePropertiesFeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePipelineExecutablePropertiesFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 pipelineExecutableInfo_ = {},\n                                                                                void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pipelineExecutableInfo{ pipelineExecutableInfo_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDevicePipelineExecutablePropertiesFeaturesKHR( PhysicalDevicePipelineExecutablePropertiesFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePipelineExecutablePropertiesFeaturesKHR( VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePipelineExecutablePropertiesFeaturesKHR( *reinterpret_cast<PhysicalDevicePipelineExecutablePropertiesFeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePipelineExecutablePropertiesFeaturesKHR &\n      operator=( PhysicalDevicePipelineExecutablePropertiesFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePipelineExecutablePropertiesFeaturesKHR & operator=( VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineExecutablePropertiesFeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePipelineExecutablePropertiesFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePipelineExecutablePropertiesFeaturesKHR &\n      setPipelineExecutableInfo( VULKAN_HPP_NAMESPACE::Bool32 pipelineExecutableInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineExecutableInfo = pipelineExecutableInfo_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pipelineExecutableInfo );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePipelineExecutablePropertiesFeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePipelineExecutablePropertiesFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pipelineExecutableInfo == rhs.pipelineExecutableInfo );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePipelineExecutablePropertiesFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                  = StructureType::ePhysicalDevicePipelineExecutablePropertiesFeaturesKHR;\n    void *                              pNext                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        pipelineExecutableInfo = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePipelineExecutablePropertiesFeaturesKHR>\n  {\n    using Type = PhysicalDevicePipelineExecutablePropertiesFeaturesKHR;\n  };\n\n  struct PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT\n  {\n    using NativeType = VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 pipelineLibraryGroupHandles_ = {},\n                                                                               void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pipelineLibraryGroupHandles{ pipelineLibraryGroupHandles_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT( PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT( VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT( *reinterpret_cast<PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT &\n      operator=( PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT & operator=( VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT &\n      setPipelineLibraryGroupHandles( VULKAN_HPP_NAMESPACE::Bool32 pipelineLibraryGroupHandles_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineLibraryGroupHandles = pipelineLibraryGroupHandles_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pipelineLibraryGroupHandles );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pipelineLibraryGroupHandles == rhs.pipelineLibraryGroupHandles );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                       = StructureType::ePhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT;\n    void *                              pNext                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        pipelineLibraryGroupHandles = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT>\n  {\n    using Type = PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT;\n  };\n\n  struct PhysicalDevicePipelineOpacityMicromapFeaturesARM\n  {\n    using NativeType = VkPhysicalDevicePipelineOpacityMicromapFeaturesARM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePipelineOpacityMicromapFeaturesARM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePipelineOpacityMicromapFeaturesARM( VULKAN_HPP_NAMESPACE::Bool32 pipelineOpacityMicromap_ = {},\n                                                                           void *                       pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pipelineOpacityMicromap{ pipelineOpacityMicromap_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDevicePipelineOpacityMicromapFeaturesARM( PhysicalDevicePipelineOpacityMicromapFeaturesARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePipelineOpacityMicromapFeaturesARM( VkPhysicalDevicePipelineOpacityMicromapFeaturesARM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePipelineOpacityMicromapFeaturesARM( *reinterpret_cast<PhysicalDevicePipelineOpacityMicromapFeaturesARM const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePipelineOpacityMicromapFeaturesARM & operator=( PhysicalDevicePipelineOpacityMicromapFeaturesARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePipelineOpacityMicromapFeaturesARM & operator=( VkPhysicalDevicePipelineOpacityMicromapFeaturesARM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineOpacityMicromapFeaturesARM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePipelineOpacityMicromapFeaturesARM & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePipelineOpacityMicromapFeaturesARM &\n      setPipelineOpacityMicromap( VULKAN_HPP_NAMESPACE::Bool32 pipelineOpacityMicromap_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineOpacityMicromap = pipelineOpacityMicromap_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevicePipelineOpacityMicromapFeaturesARM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePipelineOpacityMicromapFeaturesARM *>( this );\n    }\n\n    operator VkPhysicalDevicePipelineOpacityMicromapFeaturesARM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePipelineOpacityMicromapFeaturesARM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pipelineOpacityMicromap );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePipelineOpacityMicromapFeaturesARM const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePipelineOpacityMicromapFeaturesARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pipelineOpacityMicromap == rhs.pipelineOpacityMicromap );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePipelineOpacityMicromapFeaturesARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                   = StructureType::ePhysicalDevicePipelineOpacityMicromapFeaturesARM;\n    void *                              pNext                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        pipelineOpacityMicromap = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePipelineOpacityMicromapFeaturesARM>\n  {\n    using Type = PhysicalDevicePipelineOpacityMicromapFeaturesARM;\n  };\n\n  struct PhysicalDevicePipelinePropertiesFeaturesEXT\n  {\n    using NativeType = VkPhysicalDevicePipelinePropertiesFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePipelinePropertiesFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePipelinePropertiesFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 pipelinePropertiesIdentifier_ = {},\n                                                                      void *                       pNext_                        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pipelinePropertiesIdentifier{ pipelinePropertiesIdentifier_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePipelinePropertiesFeaturesEXT( PhysicalDevicePipelinePropertiesFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePipelinePropertiesFeaturesEXT( VkPhysicalDevicePipelinePropertiesFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePipelinePropertiesFeaturesEXT( *reinterpret_cast<PhysicalDevicePipelinePropertiesFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePipelinePropertiesFeaturesEXT & operator=( PhysicalDevicePipelinePropertiesFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePipelinePropertiesFeaturesEXT & operator=( VkPhysicalDevicePipelinePropertiesFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelinePropertiesFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePipelinePropertiesFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePipelinePropertiesFeaturesEXT &\n      setPipelinePropertiesIdentifier( VULKAN_HPP_NAMESPACE::Bool32 pipelinePropertiesIdentifier_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelinePropertiesIdentifier = pipelinePropertiesIdentifier_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevicePipelinePropertiesFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePipelinePropertiesFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDevicePipelinePropertiesFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePipelinePropertiesFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pipelinePropertiesIdentifier );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePipelinePropertiesFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePipelinePropertiesFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pipelinePropertiesIdentifier == rhs.pipelinePropertiesIdentifier );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePipelinePropertiesFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                        = StructureType::ePhysicalDevicePipelinePropertiesFeaturesEXT;\n    void *                              pNext                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        pipelinePropertiesIdentifier = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePipelinePropertiesFeaturesEXT>\n  {\n    using Type = PhysicalDevicePipelinePropertiesFeaturesEXT;\n  };\n\n  struct PhysicalDevicePipelineProtectedAccessFeatures\n  {\n    using NativeType = VkPhysicalDevicePipelineProtectedAccessFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePipelineProtectedAccessFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePipelineProtectedAccessFeatures( VULKAN_HPP_NAMESPACE::Bool32 pipelineProtectedAccess_ = {},\n                                                                        void *                       pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pipelineProtectedAccess{ pipelineProtectedAccess_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDevicePipelineProtectedAccessFeatures( PhysicalDevicePipelineProtectedAccessFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePipelineProtectedAccessFeatures( VkPhysicalDevicePipelineProtectedAccessFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePipelineProtectedAccessFeatures( *reinterpret_cast<PhysicalDevicePipelineProtectedAccessFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePipelineProtectedAccessFeatures & operator=( PhysicalDevicePipelineProtectedAccessFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePipelineProtectedAccessFeatures & operator=( VkPhysicalDevicePipelineProtectedAccessFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineProtectedAccessFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePipelineProtectedAccessFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePipelineProtectedAccessFeatures &\n      setPipelineProtectedAccess( VULKAN_HPP_NAMESPACE::Bool32 pipelineProtectedAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineProtectedAccess = pipelineProtectedAccess_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevicePipelineProtectedAccessFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePipelineProtectedAccessFeatures *>( this );\n    }\n\n    operator VkPhysicalDevicePipelineProtectedAccessFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePipelineProtectedAccessFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pipelineProtectedAccess );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePipelineProtectedAccessFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePipelineProtectedAccessFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pipelineProtectedAccess == rhs.pipelineProtectedAccess );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePipelineProtectedAccessFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                   = StructureType::ePhysicalDevicePipelineProtectedAccessFeatures;\n    void *                              pNext                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        pipelineProtectedAccess = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePipelineProtectedAccessFeatures>\n  {\n    using Type = PhysicalDevicePipelineProtectedAccessFeatures;\n  };\n\n  using PhysicalDevicePipelineProtectedAccessFeaturesEXT = PhysicalDevicePipelineProtectedAccessFeatures;\n\n  struct PhysicalDevicePipelineRobustnessFeatures\n  {\n    using NativeType = VkPhysicalDevicePipelineRobustnessFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePipelineRobustnessFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePipelineRobustnessFeatures( VULKAN_HPP_NAMESPACE::Bool32 pipelineRobustness_ = {},\n                                                                   void *                       pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pipelineRobustness{ pipelineRobustness_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePipelineRobustnessFeatures( PhysicalDevicePipelineRobustnessFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePipelineRobustnessFeatures( VkPhysicalDevicePipelineRobustnessFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePipelineRobustnessFeatures( *reinterpret_cast<PhysicalDevicePipelineRobustnessFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePipelineRobustnessFeatures & operator=( PhysicalDevicePipelineRobustnessFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePipelineRobustnessFeatures & operator=( VkPhysicalDevicePipelineRobustnessFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineRobustnessFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePipelineRobustnessFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePipelineRobustnessFeatures &\n      setPipelineRobustness( VULKAN_HPP_NAMESPACE::Bool32 pipelineRobustness_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineRobustness = pipelineRobustness_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevicePipelineRobustnessFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePipelineRobustnessFeatures *>( this );\n    }\n\n    operator VkPhysicalDevicePipelineRobustnessFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePipelineRobustnessFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pipelineRobustness );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePipelineRobustnessFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePipelineRobustnessFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pipelineRobustness == rhs.pipelineRobustness );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePipelineRobustnessFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType              = StructureType::ePhysicalDevicePipelineRobustnessFeatures;\n    void *                              pNext              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        pipelineRobustness = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePipelineRobustnessFeatures>\n  {\n    using Type = PhysicalDevicePipelineRobustnessFeatures;\n  };\n\n  using PhysicalDevicePipelineRobustnessFeaturesEXT = PhysicalDevicePipelineRobustnessFeatures;\n\n  struct PhysicalDevicePipelineRobustnessProperties\n  {\n    using NativeType = VkPhysicalDevicePipelineRobustnessProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePipelineRobustnessProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePipelineRobustnessProperties(\n      VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior defaultRobustnessStorageBuffers_ =\n        VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior::eDeviceDefault,\n      VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior defaultRobustnessUniformBuffers_ =\n        VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior::eDeviceDefault,\n      VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior defaultRobustnessVertexInputs_ =\n        VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior::eDeviceDefault,\n      VULKAN_HPP_NAMESPACE::PipelineRobustnessImageBehavior defaultRobustnessImages_ = VULKAN_HPP_NAMESPACE::PipelineRobustnessImageBehavior::eDeviceDefault,\n      void *                                                pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , defaultRobustnessStorageBuffers{ defaultRobustnessStorageBuffers_ }\n      , defaultRobustnessUniformBuffers{ defaultRobustnessUniformBuffers_ }\n      , defaultRobustnessVertexInputs{ defaultRobustnessVertexInputs_ }\n      , defaultRobustnessImages{ defaultRobustnessImages_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePipelineRobustnessProperties( PhysicalDevicePipelineRobustnessProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePipelineRobustnessProperties( VkPhysicalDevicePipelineRobustnessProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePipelineRobustnessProperties( *reinterpret_cast<PhysicalDevicePipelineRobustnessProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePipelineRobustnessProperties & operator=( PhysicalDevicePipelineRobustnessProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePipelineRobustnessProperties & operator=( VkPhysicalDevicePipelineRobustnessProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineRobustnessProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDevicePipelineRobustnessProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePipelineRobustnessProperties *>( this );\n    }\n\n    operator VkPhysicalDevicePipelineRobustnessProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePipelineRobustnessProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior const &,\n               VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior const &,\n               VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior const &,\n               VULKAN_HPP_NAMESPACE::PipelineRobustnessImageBehavior const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, defaultRobustnessStorageBuffers, defaultRobustnessUniformBuffers, defaultRobustnessVertexInputs, defaultRobustnessImages );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePipelineRobustnessProperties const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePipelineRobustnessProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( defaultRobustnessStorageBuffers == rhs.defaultRobustnessStorageBuffers ) &&\n             ( defaultRobustnessUniformBuffers == rhs.defaultRobustnessUniformBuffers ) &&\n             ( defaultRobustnessVertexInputs == rhs.defaultRobustnessVertexInputs ) && ( defaultRobustnessImages == rhs.defaultRobustnessImages );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePipelineRobustnessProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType = StructureType::ePhysicalDevicePipelineRobustnessProperties;\n    void *                                                 pNext = {};\n    VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior defaultRobustnessStorageBuffers =\n      VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior::eDeviceDefault;\n    VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior defaultRobustnessUniformBuffers =\n      VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior::eDeviceDefault;\n    VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior defaultRobustnessVertexInputs =\n      VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior::eDeviceDefault;\n    VULKAN_HPP_NAMESPACE::PipelineRobustnessImageBehavior defaultRobustnessImages = VULKAN_HPP_NAMESPACE::PipelineRobustnessImageBehavior::eDeviceDefault;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePipelineRobustnessProperties>\n  {\n    using Type = PhysicalDevicePipelineRobustnessProperties;\n  };\n\n  using PhysicalDevicePipelineRobustnessPropertiesEXT = PhysicalDevicePipelineRobustnessProperties;\n\n  struct PhysicalDevicePointClippingProperties\n  {\n    using NativeType = VkPhysicalDevicePointClippingProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePointClippingProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePointClippingProperties(\n      VULKAN_HPP_NAMESPACE::PointClippingBehavior pointClippingBehavior_ = VULKAN_HPP_NAMESPACE::PointClippingBehavior::eAllClipPlanes,\n      void *                                      pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pointClippingBehavior{ pointClippingBehavior_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePointClippingProperties( PhysicalDevicePointClippingProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePointClippingProperties( VkPhysicalDevicePointClippingProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePointClippingProperties( *reinterpret_cast<PhysicalDevicePointClippingProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePointClippingProperties & operator=( PhysicalDevicePointClippingProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePointClippingProperties & operator=( VkPhysicalDevicePointClippingProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePointClippingProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDevicePointClippingProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePointClippingProperties *>( this );\n    }\n\n    operator VkPhysicalDevicePointClippingProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePointClippingProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::PointClippingBehavior const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pointClippingBehavior );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePointClippingProperties const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePointClippingProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pointClippingBehavior == rhs.pointClippingBehavior );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePointClippingProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType         sType                 = StructureType::ePhysicalDevicePointClippingProperties;\n    void *                                      pNext                 = {};\n    VULKAN_HPP_NAMESPACE::PointClippingBehavior pointClippingBehavior = VULKAN_HPP_NAMESPACE::PointClippingBehavior::eAllClipPlanes;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePointClippingProperties>\n  {\n    using Type = PhysicalDevicePointClippingProperties;\n  };\n\n  using PhysicalDevicePointClippingPropertiesKHR = PhysicalDevicePointClippingProperties;\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  struct PhysicalDevicePortabilitySubsetFeaturesKHR\n  {\n    using NativeType = VkPhysicalDevicePortabilitySubsetFeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePortabilitySubsetFeaturesKHR;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePortabilitySubsetFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 constantAlphaColorBlendFactors_         = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 events_                                 = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 imageViewFormatReinterpretation_        = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 imageViewFormatSwizzle_                 = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 imageView2DOn3DImage_                   = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 multisampleArrayImage_                  = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 mutableComparisonSamplers_              = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 pointPolygons_                          = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 samplerMipLodBias_                      = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 separateStencilMaskRef_                 = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 shaderSampleRateInterpolationFunctions_ = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 tessellationIsolines_                   = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 tessellationPointMode_                  = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 triangleFans_                           = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 vertexAttributeAccessBeyondStride_      = {},\n                                                                     void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , constantAlphaColorBlendFactors{ constantAlphaColorBlendFactors_ }\n      , events{ events_ }\n      , imageViewFormatReinterpretation{ imageViewFormatReinterpretation_ }\n      , imageViewFormatSwizzle{ imageViewFormatSwizzle_ }\n      , imageView2DOn3DImage{ imageView2DOn3DImage_ }\n      , multisampleArrayImage{ multisampleArrayImage_ }\n      , mutableComparisonSamplers{ mutableComparisonSamplers_ }\n      , pointPolygons{ pointPolygons_ }\n      , samplerMipLodBias{ samplerMipLodBias_ }\n      , separateStencilMaskRef{ separateStencilMaskRef_ }\n      , shaderSampleRateInterpolationFunctions{ shaderSampleRateInterpolationFunctions_ }\n      , tessellationIsolines{ tessellationIsolines_ }\n      , tessellationPointMode{ tessellationPointMode_ }\n      , triangleFans{ triangleFans_ }\n      , vertexAttributeAccessBeyondStride{ vertexAttributeAccessBeyondStride_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePortabilitySubsetFeaturesKHR( PhysicalDevicePortabilitySubsetFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePortabilitySubsetFeaturesKHR( VkPhysicalDevicePortabilitySubsetFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePortabilitySubsetFeaturesKHR( *reinterpret_cast<PhysicalDevicePortabilitySubsetFeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePortabilitySubsetFeaturesKHR & operator=( PhysicalDevicePortabilitySubsetFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePortabilitySubsetFeaturesKHR & operator=( VkPhysicalDevicePortabilitySubsetFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePortabilitySubsetFeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePortabilitySubsetFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePortabilitySubsetFeaturesKHR &\n      setConstantAlphaColorBlendFactors( VULKAN_HPP_NAMESPACE::Bool32 constantAlphaColorBlendFactors_ ) VULKAN_HPP_NOEXCEPT\n    {\n      constantAlphaColorBlendFactors = constantAlphaColorBlendFactors_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePortabilitySubsetFeaturesKHR & setEvents( VULKAN_HPP_NAMESPACE::Bool32 events_ ) VULKAN_HPP_NOEXCEPT\n    {\n      events = events_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePortabilitySubsetFeaturesKHR &\n      setImageViewFormatReinterpretation( VULKAN_HPP_NAMESPACE::Bool32 imageViewFormatReinterpretation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageViewFormatReinterpretation = imageViewFormatReinterpretation_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePortabilitySubsetFeaturesKHR &\n      setImageViewFormatSwizzle( VULKAN_HPP_NAMESPACE::Bool32 imageViewFormatSwizzle_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageViewFormatSwizzle = imageViewFormatSwizzle_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePortabilitySubsetFeaturesKHR &\n      setImageView2DOn3DImage( VULKAN_HPP_NAMESPACE::Bool32 imageView2DOn3DImage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageView2DOn3DImage = imageView2DOn3DImage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePortabilitySubsetFeaturesKHR &\n      setMultisampleArrayImage( VULKAN_HPP_NAMESPACE::Bool32 multisampleArrayImage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      multisampleArrayImage = multisampleArrayImage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePortabilitySubsetFeaturesKHR &\n      setMutableComparisonSamplers( VULKAN_HPP_NAMESPACE::Bool32 mutableComparisonSamplers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mutableComparisonSamplers = mutableComparisonSamplers_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePortabilitySubsetFeaturesKHR & setPointPolygons( VULKAN_HPP_NAMESPACE::Bool32 pointPolygons_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pointPolygons = pointPolygons_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePortabilitySubsetFeaturesKHR &\n      setSamplerMipLodBias( VULKAN_HPP_NAMESPACE::Bool32 samplerMipLodBias_ ) VULKAN_HPP_NOEXCEPT\n    {\n      samplerMipLodBias = samplerMipLodBias_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePortabilitySubsetFeaturesKHR &\n      setSeparateStencilMaskRef( VULKAN_HPP_NAMESPACE::Bool32 separateStencilMaskRef_ ) VULKAN_HPP_NOEXCEPT\n    {\n      separateStencilMaskRef = separateStencilMaskRef_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePortabilitySubsetFeaturesKHR &\n      setShaderSampleRateInterpolationFunctions( VULKAN_HPP_NAMESPACE::Bool32 shaderSampleRateInterpolationFunctions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSampleRateInterpolationFunctions = shaderSampleRateInterpolationFunctions_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePortabilitySubsetFeaturesKHR &\n      setTessellationIsolines( VULKAN_HPP_NAMESPACE::Bool32 tessellationIsolines_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tessellationIsolines = tessellationIsolines_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePortabilitySubsetFeaturesKHR &\n      setTessellationPointMode( VULKAN_HPP_NAMESPACE::Bool32 tessellationPointMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tessellationPointMode = tessellationPointMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePortabilitySubsetFeaturesKHR & setTriangleFans( VULKAN_HPP_NAMESPACE::Bool32 triangleFans_ ) VULKAN_HPP_NOEXCEPT\n    {\n      triangleFans = triangleFans_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePortabilitySubsetFeaturesKHR &\n      setVertexAttributeAccessBeyondStride( VULKAN_HPP_NAMESPACE::Bool32 vertexAttributeAccessBeyondStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexAttributeAccessBeyondStride = vertexAttributeAccessBeyondStride_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevicePortabilitySubsetFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePortabilitySubsetFeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDevicePortabilitySubsetFeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePortabilitySubsetFeaturesKHR *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       constantAlphaColorBlendFactors,\n                       events,\n                       imageViewFormatReinterpretation,\n                       imageViewFormatSwizzle,\n                       imageView2DOn3DImage,\n                       multisampleArrayImage,\n                       mutableComparisonSamplers,\n                       pointPolygons,\n                       samplerMipLodBias,\n                       separateStencilMaskRef,\n                       shaderSampleRateInterpolationFunctions,\n                       tessellationIsolines,\n                       tessellationPointMode,\n                       triangleFans,\n                       vertexAttributeAccessBeyondStride );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePortabilitySubsetFeaturesKHR const & ) const = default;\n#  else\n    bool operator==( PhysicalDevicePortabilitySubsetFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( constantAlphaColorBlendFactors == rhs.constantAlphaColorBlendFactors ) &&\n             ( events == rhs.events ) && ( imageViewFormatReinterpretation == rhs.imageViewFormatReinterpretation ) &&\n             ( imageViewFormatSwizzle == rhs.imageViewFormatSwizzle ) && ( imageView2DOn3DImage == rhs.imageView2DOn3DImage ) &&\n             ( multisampleArrayImage == rhs.multisampleArrayImage ) && ( mutableComparisonSamplers == rhs.mutableComparisonSamplers ) &&\n             ( pointPolygons == rhs.pointPolygons ) && ( samplerMipLodBias == rhs.samplerMipLodBias ) &&\n             ( separateStencilMaskRef == rhs.separateStencilMaskRef ) &&\n             ( shaderSampleRateInterpolationFunctions == rhs.shaderSampleRateInterpolationFunctions ) && ( tessellationIsolines == rhs.tessellationIsolines ) &&\n             ( tessellationPointMode == rhs.tessellationPointMode ) && ( triangleFans == rhs.triangleFans ) &&\n             ( vertexAttributeAccessBeyondStride == rhs.vertexAttributeAccessBeyondStride );\n#    endif\n    }\n\n    bool operator!=( PhysicalDevicePortabilitySubsetFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                  = StructureType::ePhysicalDevicePortabilitySubsetFeaturesKHR;\n    void *                              pNext                                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        constantAlphaColorBlendFactors         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        events                                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        imageViewFormatReinterpretation        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        imageViewFormatSwizzle                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        imageView2DOn3DImage                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        multisampleArrayImage                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        mutableComparisonSamplers              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        pointPolygons                          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        samplerMipLodBias                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        separateStencilMaskRef                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSampleRateInterpolationFunctions = {};\n    VULKAN_HPP_NAMESPACE::Bool32        tessellationIsolines                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        tessellationPointMode                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        triangleFans                           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        vertexAttributeAccessBeyondStride      = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePortabilitySubsetFeaturesKHR>\n  {\n    using Type = PhysicalDevicePortabilitySubsetFeaturesKHR;\n  };\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  struct PhysicalDevicePortabilitySubsetPropertiesKHR\n  {\n    using NativeType = VkPhysicalDevicePortabilitySubsetPropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePortabilitySubsetPropertiesKHR;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePortabilitySubsetPropertiesKHR( uint32_t minVertexInputBindingStrideAlignment_ = {},\n                                                                       void *   pNext_                                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , minVertexInputBindingStrideAlignment{ minVertexInputBindingStrideAlignment_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePortabilitySubsetPropertiesKHR( PhysicalDevicePortabilitySubsetPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePortabilitySubsetPropertiesKHR( VkPhysicalDevicePortabilitySubsetPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePortabilitySubsetPropertiesKHR( *reinterpret_cast<PhysicalDevicePortabilitySubsetPropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePortabilitySubsetPropertiesKHR & operator=( PhysicalDevicePortabilitySubsetPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePortabilitySubsetPropertiesKHR & operator=( VkPhysicalDevicePortabilitySubsetPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePortabilitySubsetPropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePortabilitySubsetPropertiesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePortabilitySubsetPropertiesKHR &\n      setMinVertexInputBindingStrideAlignment( uint32_t minVertexInputBindingStrideAlignment_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minVertexInputBindingStrideAlignment = minVertexInputBindingStrideAlignment_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevicePortabilitySubsetPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePortabilitySubsetPropertiesKHR *>( this );\n    }\n\n    operator VkPhysicalDevicePortabilitySubsetPropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePortabilitySubsetPropertiesKHR *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, minVertexInputBindingStrideAlignment );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePortabilitySubsetPropertiesKHR const & ) const = default;\n#  else\n    bool operator==( PhysicalDevicePortabilitySubsetPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( minVertexInputBindingStrideAlignment == rhs.minVertexInputBindingStrideAlignment );\n#    endif\n    }\n\n    bool operator!=( PhysicalDevicePortabilitySubsetPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                = StructureType::ePhysicalDevicePortabilitySubsetPropertiesKHR;\n    void *                              pNext                                = {};\n    uint32_t                            minVertexInputBindingStrideAlignment = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePortabilitySubsetPropertiesKHR>\n  {\n    using Type = PhysicalDevicePortabilitySubsetPropertiesKHR;\n  };\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  struct PhysicalDevicePresentBarrierFeaturesNV\n  {\n    using NativeType = VkPhysicalDevicePresentBarrierFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePresentBarrierFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePresentBarrierFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 presentBarrier_ = {},\n                                                                 void *                       pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , presentBarrier{ presentBarrier_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePresentBarrierFeaturesNV( PhysicalDevicePresentBarrierFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePresentBarrierFeaturesNV( VkPhysicalDevicePresentBarrierFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePresentBarrierFeaturesNV( *reinterpret_cast<PhysicalDevicePresentBarrierFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePresentBarrierFeaturesNV & operator=( PhysicalDevicePresentBarrierFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePresentBarrierFeaturesNV & operator=( VkPhysicalDevicePresentBarrierFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePresentBarrierFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePresentBarrierFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePresentBarrierFeaturesNV & setPresentBarrier( VULKAN_HPP_NAMESPACE::Bool32 presentBarrier_ ) VULKAN_HPP_NOEXCEPT\n    {\n      presentBarrier = presentBarrier_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevicePresentBarrierFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePresentBarrierFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDevicePresentBarrierFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePresentBarrierFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, presentBarrier );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePresentBarrierFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePresentBarrierFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( presentBarrier == rhs.presentBarrier );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePresentBarrierFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::ePhysicalDevicePresentBarrierFeaturesNV;\n    void *                              pNext          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        presentBarrier = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePresentBarrierFeaturesNV>\n  {\n    using Type = PhysicalDevicePresentBarrierFeaturesNV;\n  };\n\n  struct PhysicalDevicePresentIdFeaturesKHR\n  {\n    using NativeType = VkPhysicalDevicePresentIdFeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePresentIdFeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePresentIdFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 presentId_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , presentId{ presentId_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePresentIdFeaturesKHR( PhysicalDevicePresentIdFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePresentIdFeaturesKHR( VkPhysicalDevicePresentIdFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePresentIdFeaturesKHR( *reinterpret_cast<PhysicalDevicePresentIdFeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePresentIdFeaturesKHR & operator=( PhysicalDevicePresentIdFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePresentIdFeaturesKHR & operator=( VkPhysicalDevicePresentIdFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePresentIdFeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePresentIdFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePresentIdFeaturesKHR & setPresentId( VULKAN_HPP_NAMESPACE::Bool32 presentId_ ) VULKAN_HPP_NOEXCEPT\n    {\n      presentId = presentId_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevicePresentIdFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePresentIdFeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDevicePresentIdFeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePresentIdFeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, presentId );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePresentIdFeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePresentIdFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( presentId == rhs.presentId );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePresentIdFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType     = StructureType::ePhysicalDevicePresentIdFeaturesKHR;\n    void *                              pNext     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        presentId = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePresentIdFeaturesKHR>\n  {\n    using Type = PhysicalDevicePresentIdFeaturesKHR;\n  };\n\n  struct PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT\n  {\n    using NativeType = VkPhysicalDevicePresentModeFifoLatestReadyFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePresentModeFifoLatestReadyFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 presentModeFifoLatestReady_ = {},\n                                                                              void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , presentModeFifoLatestReady{ presentModeFifoLatestReady_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT( PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT( VkPhysicalDevicePresentModeFifoLatestReadyFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT( *reinterpret_cast<PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT &\n      operator=( PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT & operator=( VkPhysicalDevicePresentModeFifoLatestReadyFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT &\n      setPresentModeFifoLatestReady( VULKAN_HPP_NAMESPACE::Bool32 presentModeFifoLatestReady_ ) VULKAN_HPP_NOEXCEPT\n    {\n      presentModeFifoLatestReady = presentModeFifoLatestReady_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevicePresentModeFifoLatestReadyFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePresentModeFifoLatestReadyFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDevicePresentModeFifoLatestReadyFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePresentModeFifoLatestReadyFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, presentModeFifoLatestReady );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( presentModeFifoLatestReady == rhs.presentModeFifoLatestReady );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                      = StructureType::ePhysicalDevicePresentModeFifoLatestReadyFeaturesEXT;\n    void *                              pNext                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        presentModeFifoLatestReady = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePresentModeFifoLatestReadyFeaturesEXT>\n  {\n    using Type = PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT;\n  };\n\n  struct PhysicalDevicePresentWaitFeaturesKHR\n  {\n    using NativeType = VkPhysicalDevicePresentWaitFeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePresentWaitFeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePresentWaitFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 presentWait_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , presentWait{ presentWait_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePresentWaitFeaturesKHR( PhysicalDevicePresentWaitFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePresentWaitFeaturesKHR( VkPhysicalDevicePresentWaitFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePresentWaitFeaturesKHR( *reinterpret_cast<PhysicalDevicePresentWaitFeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePresentWaitFeaturesKHR & operator=( PhysicalDevicePresentWaitFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePresentWaitFeaturesKHR & operator=( VkPhysicalDevicePresentWaitFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePresentWaitFeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePresentWaitFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePresentWaitFeaturesKHR & setPresentWait( VULKAN_HPP_NAMESPACE::Bool32 presentWait_ ) VULKAN_HPP_NOEXCEPT\n    {\n      presentWait = presentWait_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevicePresentWaitFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePresentWaitFeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDevicePresentWaitFeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePresentWaitFeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, presentWait );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePresentWaitFeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePresentWaitFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( presentWait == rhs.presentWait );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePresentWaitFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType       = StructureType::ePhysicalDevicePresentWaitFeaturesKHR;\n    void *                              pNext       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        presentWait = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePresentWaitFeaturesKHR>\n  {\n    using Type = PhysicalDevicePresentWaitFeaturesKHR;\n  };\n\n  struct PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT\n  {\n    using NativeType = VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePrimitiveTopologyListRestartFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 primitiveTopologyListRestart_      = {},\n                                                                                VULKAN_HPP_NAMESPACE::Bool32 primitiveTopologyPatchListRestart_ = {},\n                                                                                void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , primitiveTopologyListRestart{ primitiveTopologyListRestart_ }\n      , primitiveTopologyPatchListRestart{ primitiveTopologyPatchListRestart_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT( PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT( VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT( *reinterpret_cast<PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT &\n      operator=( PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT & operator=( VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT &\n      setPrimitiveTopologyListRestart( VULKAN_HPP_NAMESPACE::Bool32 primitiveTopologyListRestart_ ) VULKAN_HPP_NOEXCEPT\n    {\n      primitiveTopologyListRestart = primitiveTopologyListRestart_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT &\n      setPrimitiveTopologyPatchListRestart( VULKAN_HPP_NAMESPACE::Bool32 primitiveTopologyPatchListRestart_ ) VULKAN_HPP_NOEXCEPT\n    {\n      primitiveTopologyPatchListRestart = primitiveTopologyPatchListRestart_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, primitiveTopologyListRestart, primitiveTopologyPatchListRestart );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( primitiveTopologyListRestart == rhs.primitiveTopologyListRestart ) &&\n             ( primitiveTopologyPatchListRestart == rhs.primitiveTopologyPatchListRestart );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                             = StructureType::ePhysicalDevicePrimitiveTopologyListRestartFeaturesEXT;\n    void *                              pNext                             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        primitiveTopologyListRestart      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        primitiveTopologyPatchListRestart = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePrimitiveTopologyListRestartFeaturesEXT>\n  {\n    using Type = PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT;\n  };\n\n  struct PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT\n  {\n    using NativeType = VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePrimitivesGeneratedQueryFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 primitivesGeneratedQuery_                      = {},\n                                                                            VULKAN_HPP_NAMESPACE::Bool32 primitivesGeneratedQueryWithRasterizerDiscard_ = {},\n                                                                            VULKAN_HPP_NAMESPACE::Bool32 primitivesGeneratedQueryWithNonZeroStreams_    = {},\n                                                                            void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , primitivesGeneratedQuery{ primitivesGeneratedQuery_ }\n      , primitivesGeneratedQueryWithRasterizerDiscard{ primitivesGeneratedQueryWithRasterizerDiscard_ }\n      , primitivesGeneratedQueryWithNonZeroStreams{ primitivesGeneratedQueryWithNonZeroStreams_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT( PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT( VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT( *reinterpret_cast<PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT &\n      operator=( PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT & operator=( VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT &\n      setPrimitivesGeneratedQuery( VULKAN_HPP_NAMESPACE::Bool32 primitivesGeneratedQuery_ ) VULKAN_HPP_NOEXCEPT\n    {\n      primitivesGeneratedQuery = primitivesGeneratedQuery_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT &\n      setPrimitivesGeneratedQueryWithRasterizerDiscard( VULKAN_HPP_NAMESPACE::Bool32 primitivesGeneratedQueryWithRasterizerDiscard_ ) VULKAN_HPP_NOEXCEPT\n    {\n      primitivesGeneratedQueryWithRasterizerDiscard = primitivesGeneratedQueryWithRasterizerDiscard_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT &\n      setPrimitivesGeneratedQueryWithNonZeroStreams( VULKAN_HPP_NAMESPACE::Bool32 primitivesGeneratedQueryWithNonZeroStreams_ ) VULKAN_HPP_NOEXCEPT\n    {\n      primitivesGeneratedQueryWithNonZeroStreams = primitivesGeneratedQueryWithNonZeroStreams_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, primitivesGeneratedQuery, primitivesGeneratedQueryWithRasterizerDiscard, primitivesGeneratedQueryWithNonZeroStreams );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( primitivesGeneratedQuery == rhs.primitivesGeneratedQuery ) &&\n             ( primitivesGeneratedQueryWithRasterizerDiscard == rhs.primitivesGeneratedQueryWithRasterizerDiscard ) &&\n             ( primitivesGeneratedQueryWithNonZeroStreams == rhs.primitivesGeneratedQueryWithNonZeroStreams );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                         = StructureType::ePhysicalDevicePrimitivesGeneratedQueryFeaturesEXT;\n    void *                              pNext                                         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        primitivesGeneratedQuery                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        primitivesGeneratedQueryWithRasterizerDiscard = {};\n    VULKAN_HPP_NAMESPACE::Bool32        primitivesGeneratedQueryWithNonZeroStreams    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePrimitivesGeneratedQueryFeaturesEXT>\n  {\n    using Type = PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT;\n  };\n\n  struct PhysicalDevicePrivateDataFeatures\n  {\n    using NativeType = VkPhysicalDevicePrivateDataFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePrivateDataFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePrivateDataFeatures( VULKAN_HPP_NAMESPACE::Bool32 privateData_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , privateData{ privateData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePrivateDataFeatures( PhysicalDevicePrivateDataFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePrivateDataFeatures( VkPhysicalDevicePrivateDataFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePrivateDataFeatures( *reinterpret_cast<PhysicalDevicePrivateDataFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePrivateDataFeatures & operator=( PhysicalDevicePrivateDataFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePrivateDataFeatures & operator=( VkPhysicalDevicePrivateDataFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePrivateDataFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePrivateDataFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePrivateDataFeatures & setPrivateData( VULKAN_HPP_NAMESPACE::Bool32 privateData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      privateData = privateData_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDevicePrivateDataFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePrivateDataFeatures *>( this );\n    }\n\n    operator VkPhysicalDevicePrivateDataFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePrivateDataFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, privateData );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePrivateDataFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePrivateDataFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( privateData == rhs.privateData );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePrivateDataFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType       = StructureType::ePhysicalDevicePrivateDataFeatures;\n    void *                              pNext       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        privateData = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePrivateDataFeatures>\n  {\n    using Type = PhysicalDevicePrivateDataFeatures;\n  };\n\n  using PhysicalDevicePrivateDataFeaturesEXT = PhysicalDevicePrivateDataFeatures;\n\n  struct PhysicalDeviceProtectedMemoryFeatures\n  {\n    using NativeType = VkPhysicalDeviceProtectedMemoryFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceProtectedMemoryFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceProtectedMemoryFeatures( VULKAN_HPP_NAMESPACE::Bool32 protectedMemory_ = {},\n                                                                void *                       pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , protectedMemory{ protectedMemory_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceProtectedMemoryFeatures( PhysicalDeviceProtectedMemoryFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceProtectedMemoryFeatures( VkPhysicalDeviceProtectedMemoryFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceProtectedMemoryFeatures( *reinterpret_cast<PhysicalDeviceProtectedMemoryFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceProtectedMemoryFeatures & operator=( PhysicalDeviceProtectedMemoryFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceProtectedMemoryFeatures & operator=( VkPhysicalDeviceProtectedMemoryFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceProtectedMemoryFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceProtectedMemoryFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceProtectedMemoryFeatures & setProtectedMemory( VULKAN_HPP_NAMESPACE::Bool32 protectedMemory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      protectedMemory = protectedMemory_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceProtectedMemoryFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceProtectedMemoryFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceProtectedMemoryFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceProtectedMemoryFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, protectedMemory );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceProtectedMemoryFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceProtectedMemoryFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( protectedMemory == rhs.protectedMemory );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceProtectedMemoryFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType           = StructureType::ePhysicalDeviceProtectedMemoryFeatures;\n    void *                              pNext           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        protectedMemory = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceProtectedMemoryFeatures>\n  {\n    using Type = PhysicalDeviceProtectedMemoryFeatures;\n  };\n\n  struct PhysicalDeviceProtectedMemoryProperties\n  {\n    using NativeType = VkPhysicalDeviceProtectedMemoryProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceProtectedMemoryProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceProtectedMemoryProperties( VULKAN_HPP_NAMESPACE::Bool32 protectedNoFault_ = {},\n                                                                  void *                       pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , protectedNoFault{ protectedNoFault_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceProtectedMemoryProperties( PhysicalDeviceProtectedMemoryProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceProtectedMemoryProperties( VkPhysicalDeviceProtectedMemoryProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceProtectedMemoryProperties( *reinterpret_cast<PhysicalDeviceProtectedMemoryProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceProtectedMemoryProperties & operator=( PhysicalDeviceProtectedMemoryProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceProtectedMemoryProperties & operator=( VkPhysicalDeviceProtectedMemoryProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceProtectedMemoryProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceProtectedMemoryProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceProtectedMemoryProperties *>( this );\n    }\n\n    operator VkPhysicalDeviceProtectedMemoryProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceProtectedMemoryProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, protectedNoFault );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceProtectedMemoryProperties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceProtectedMemoryProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( protectedNoFault == rhs.protectedNoFault );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceProtectedMemoryProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType            = StructureType::ePhysicalDeviceProtectedMemoryProperties;\n    void *                              pNext            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        protectedNoFault = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceProtectedMemoryProperties>\n  {\n    using Type = PhysicalDeviceProtectedMemoryProperties;\n  };\n\n  struct PhysicalDeviceProvokingVertexFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceProvokingVertexFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceProvokingVertexFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceProvokingVertexFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 provokingVertexLast_                       = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 transformFeedbackPreservesProvokingVertex_ = {},\n                                                                   void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , provokingVertexLast{ provokingVertexLast_ }\n      , transformFeedbackPreservesProvokingVertex{ transformFeedbackPreservesProvokingVertex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceProvokingVertexFeaturesEXT( PhysicalDeviceProvokingVertexFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceProvokingVertexFeaturesEXT( VkPhysicalDeviceProvokingVertexFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceProvokingVertexFeaturesEXT( *reinterpret_cast<PhysicalDeviceProvokingVertexFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceProvokingVertexFeaturesEXT & operator=( PhysicalDeviceProvokingVertexFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceProvokingVertexFeaturesEXT & operator=( VkPhysicalDeviceProvokingVertexFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceProvokingVertexFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceProvokingVertexFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceProvokingVertexFeaturesEXT &\n      setProvokingVertexLast( VULKAN_HPP_NAMESPACE::Bool32 provokingVertexLast_ ) VULKAN_HPP_NOEXCEPT\n    {\n      provokingVertexLast = provokingVertexLast_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceProvokingVertexFeaturesEXT &\n      setTransformFeedbackPreservesProvokingVertex( VULKAN_HPP_NAMESPACE::Bool32 transformFeedbackPreservesProvokingVertex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      transformFeedbackPreservesProvokingVertex = transformFeedbackPreservesProvokingVertex_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceProvokingVertexFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceProvokingVertexFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceProvokingVertexFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceProvokingVertexFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, provokingVertexLast, transformFeedbackPreservesProvokingVertex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceProvokingVertexFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceProvokingVertexFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( provokingVertexLast == rhs.provokingVertexLast ) &&\n             ( transformFeedbackPreservesProvokingVertex == rhs.transformFeedbackPreservesProvokingVertex );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceProvokingVertexFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                     = StructureType::ePhysicalDeviceProvokingVertexFeaturesEXT;\n    void *                              pNext                                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        provokingVertexLast                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        transformFeedbackPreservesProvokingVertex = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceProvokingVertexFeaturesEXT>\n  {\n    using Type = PhysicalDeviceProvokingVertexFeaturesEXT;\n  };\n\n  struct PhysicalDeviceProvokingVertexPropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceProvokingVertexPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceProvokingVertexPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceProvokingVertexPropertiesEXT( VULKAN_HPP_NAMESPACE::Bool32 provokingVertexModePerPipeline_                       = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 transformFeedbackPreservesTriangleFanProvokingVertex_ = {},\n                                                                     void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , provokingVertexModePerPipeline{ provokingVertexModePerPipeline_ }\n      , transformFeedbackPreservesTriangleFanProvokingVertex{ transformFeedbackPreservesTriangleFanProvokingVertex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceProvokingVertexPropertiesEXT( PhysicalDeviceProvokingVertexPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceProvokingVertexPropertiesEXT( VkPhysicalDeviceProvokingVertexPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceProvokingVertexPropertiesEXT( *reinterpret_cast<PhysicalDeviceProvokingVertexPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceProvokingVertexPropertiesEXT & operator=( PhysicalDeviceProvokingVertexPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceProvokingVertexPropertiesEXT & operator=( VkPhysicalDeviceProvokingVertexPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceProvokingVertexPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceProvokingVertexPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceProvokingVertexPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceProvokingVertexPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceProvokingVertexPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, provokingVertexModePerPipeline, transformFeedbackPreservesTriangleFanProvokingVertex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceProvokingVertexPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceProvokingVertexPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( provokingVertexModePerPipeline == rhs.provokingVertexModePerPipeline ) &&\n             ( transformFeedbackPreservesTriangleFanProvokingVertex == rhs.transformFeedbackPreservesTriangleFanProvokingVertex );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceProvokingVertexPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                                = StructureType::ePhysicalDeviceProvokingVertexPropertiesEXT;\n    void *                              pNext                                                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        provokingVertexModePerPipeline                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        transformFeedbackPreservesTriangleFanProvokingVertex = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceProvokingVertexPropertiesEXT>\n  {\n    using Type = PhysicalDeviceProvokingVertexPropertiesEXT;\n  };\n\n  struct PhysicalDevicePushDescriptorProperties\n  {\n    using NativeType = VkPhysicalDevicePushDescriptorProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDevicePushDescriptorProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePushDescriptorProperties( uint32_t maxPushDescriptors_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxPushDescriptors{ maxPushDescriptors_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDevicePushDescriptorProperties( PhysicalDevicePushDescriptorProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDevicePushDescriptorProperties( VkPhysicalDevicePushDescriptorProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDevicePushDescriptorProperties( *reinterpret_cast<PhysicalDevicePushDescriptorProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDevicePushDescriptorProperties & operator=( PhysicalDevicePushDescriptorProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDevicePushDescriptorProperties & operator=( VkPhysicalDevicePushDescriptorProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePushDescriptorProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDevicePushDescriptorProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDevicePushDescriptorProperties *>( this );\n    }\n\n    operator VkPhysicalDevicePushDescriptorProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDevicePushDescriptorProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxPushDescriptors );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDevicePushDescriptorProperties const & ) const = default;\n#else\n    bool operator==( PhysicalDevicePushDescriptorProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxPushDescriptors == rhs.maxPushDescriptors );\n#  endif\n    }\n\n    bool operator!=( PhysicalDevicePushDescriptorProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType              = StructureType::ePhysicalDevicePushDescriptorProperties;\n    void *                              pNext              = {};\n    uint32_t                            maxPushDescriptors = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDevicePushDescriptorProperties>\n  {\n    using Type = PhysicalDevicePushDescriptorProperties;\n  };\n\n  using PhysicalDevicePushDescriptorPropertiesKHR = PhysicalDevicePushDescriptorProperties;\n\n  struct PhysicalDeviceRGBA10X6FormatsFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceRgba10X6FormatsFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRGBA10X6FormatsFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 formatRgba10x6WithoutYCbCrSampler_ = {},\n                                                                   void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , formatRgba10x6WithoutYCbCrSampler{ formatRgba10x6WithoutYCbCrSampler_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRGBA10X6FormatsFeaturesEXT( PhysicalDeviceRGBA10X6FormatsFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceRGBA10X6FormatsFeaturesEXT( VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceRGBA10X6FormatsFeaturesEXT( *reinterpret_cast<PhysicalDeviceRGBA10X6FormatsFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceRGBA10X6FormatsFeaturesEXT & operator=( PhysicalDeviceRGBA10X6FormatsFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceRGBA10X6FormatsFeaturesEXT & operator=( VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceRGBA10X6FormatsFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRGBA10X6FormatsFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRGBA10X6FormatsFeaturesEXT &\n      setFormatRgba10x6WithoutYCbCrSampler( VULKAN_HPP_NAMESPACE::Bool32 formatRgba10x6WithoutYCbCrSampler_ ) VULKAN_HPP_NOEXCEPT\n    {\n      formatRgba10x6WithoutYCbCrSampler = formatRgba10x6WithoutYCbCrSampler_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, formatRgba10x6WithoutYCbCrSampler );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceRGBA10X6FormatsFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceRGBA10X6FormatsFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( formatRgba10x6WithoutYCbCrSampler == rhs.formatRgba10x6WithoutYCbCrSampler );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceRGBA10X6FormatsFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                             = StructureType::ePhysicalDeviceRgba10X6FormatsFeaturesEXT;\n    void *                              pNext                             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        formatRgba10x6WithoutYCbCrSampler = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceRgba10X6FormatsFeaturesEXT>\n  {\n    using Type = PhysicalDeviceRGBA10X6FormatsFeaturesEXT;\n  };\n\n  struct PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 rasterizationOrderColorAttachmentAccess_   = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 rasterizationOrderDepthAttachmentAccess_   = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 rasterizationOrderStencilAttachmentAccess_ = {},\n                                                                   void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , rasterizationOrderColorAttachmentAccess{ rasterizationOrderColorAttachmentAccess_ }\n      , rasterizationOrderDepthAttachmentAccess{ rasterizationOrderDepthAttachmentAccess_ }\n      , rasterizationOrderStencilAttachmentAccess{ rasterizationOrderStencilAttachmentAccess_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT( PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT const & rhs )\n      VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT( VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT(\n          *reinterpret_cast<PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT &\n      operator=( PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT &\n      operator=( VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT &\n      setRasterizationOrderColorAttachmentAccess( VULKAN_HPP_NAMESPACE::Bool32 rasterizationOrderColorAttachmentAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rasterizationOrderColorAttachmentAccess = rasterizationOrderColorAttachmentAccess_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT &\n      setRasterizationOrderDepthAttachmentAccess( VULKAN_HPP_NAMESPACE::Bool32 rasterizationOrderDepthAttachmentAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rasterizationOrderDepthAttachmentAccess = rasterizationOrderDepthAttachmentAccess_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT &\n      setRasterizationOrderStencilAttachmentAccess( VULKAN_HPP_NAMESPACE::Bool32 rasterizationOrderStencilAttachmentAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rasterizationOrderStencilAttachmentAccess = rasterizationOrderStencilAttachmentAccess_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie(\n        sType, pNext, rasterizationOrderColorAttachmentAccess, rasterizationOrderDepthAttachmentAccess, rasterizationOrderStencilAttachmentAccess );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( rasterizationOrderColorAttachmentAccess == rhs.rasterizationOrderColorAttachmentAccess ) &&\n             ( rasterizationOrderDepthAttachmentAccess == rhs.rasterizationOrderDepthAttachmentAccess ) &&\n             ( rasterizationOrderStencilAttachmentAccess == rhs.rasterizationOrderStencilAttachmentAccess );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                     = StructureType::ePhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT;\n    void *                              pNext                                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        rasterizationOrderColorAttachmentAccess   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        rasterizationOrderDepthAttachmentAccess   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        rasterizationOrderStencilAttachmentAccess = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT>\n  {\n    using Type = PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT;\n  };\n\n  using PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM = PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT;\n\n  struct PhysicalDeviceRawAccessChainsFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceRawAccessChainsFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceRawAccessChainsFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRawAccessChainsFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 shaderRawAccessChains_ = {},\n                                                                  void *                       pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderRawAccessChains{ shaderRawAccessChains_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRawAccessChainsFeaturesNV( PhysicalDeviceRawAccessChainsFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceRawAccessChainsFeaturesNV( VkPhysicalDeviceRawAccessChainsFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceRawAccessChainsFeaturesNV( *reinterpret_cast<PhysicalDeviceRawAccessChainsFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceRawAccessChainsFeaturesNV & operator=( PhysicalDeviceRawAccessChainsFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceRawAccessChainsFeaturesNV & operator=( VkPhysicalDeviceRawAccessChainsFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceRawAccessChainsFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRawAccessChainsFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRawAccessChainsFeaturesNV &\n      setShaderRawAccessChains( VULKAN_HPP_NAMESPACE::Bool32 shaderRawAccessChains_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderRawAccessChains = shaderRawAccessChains_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceRawAccessChainsFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceRawAccessChainsFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceRawAccessChainsFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceRawAccessChainsFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderRawAccessChains );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceRawAccessChainsFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceRawAccessChainsFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderRawAccessChains == rhs.shaderRawAccessChains );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceRawAccessChainsFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                 = StructureType::ePhysicalDeviceRawAccessChainsFeaturesNV;\n    void *                              pNext                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderRawAccessChains = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceRawAccessChainsFeaturesNV>\n  {\n    using Type = PhysicalDeviceRawAccessChainsFeaturesNV;\n  };\n\n  struct PhysicalDeviceRayQueryFeaturesKHR\n  {\n    using NativeType = VkPhysicalDeviceRayQueryFeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceRayQueryFeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRayQueryFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 rayQuery_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , rayQuery{ rayQuery_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRayQueryFeaturesKHR( PhysicalDeviceRayQueryFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceRayQueryFeaturesKHR( VkPhysicalDeviceRayQueryFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceRayQueryFeaturesKHR( *reinterpret_cast<PhysicalDeviceRayQueryFeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceRayQueryFeaturesKHR & operator=( PhysicalDeviceRayQueryFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceRayQueryFeaturesKHR & operator=( VkPhysicalDeviceRayQueryFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayQueryFeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRayQueryFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRayQueryFeaturesKHR & setRayQuery( VULKAN_HPP_NAMESPACE::Bool32 rayQuery_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rayQuery = rayQuery_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceRayQueryFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceRayQueryFeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceRayQueryFeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceRayQueryFeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, rayQuery );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceRayQueryFeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceRayQueryFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( rayQuery == rhs.rayQuery );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceRayQueryFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType    = StructureType::ePhysicalDeviceRayQueryFeaturesKHR;\n    void *                              pNext    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        rayQuery = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceRayQueryFeaturesKHR>\n  {\n    using Type = PhysicalDeviceRayQueryFeaturesKHR;\n  };\n\n  struct PhysicalDeviceRayTracingInvocationReorderFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceRayTracingInvocationReorderFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRayTracingInvocationReorderFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 rayTracingInvocationReorder_ = {},\n                                                                              void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , rayTracingInvocationReorder{ rayTracingInvocationReorder_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceRayTracingInvocationReorderFeaturesNV( PhysicalDeviceRayTracingInvocationReorderFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceRayTracingInvocationReorderFeaturesNV( VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceRayTracingInvocationReorderFeaturesNV( *reinterpret_cast<PhysicalDeviceRayTracingInvocationReorderFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceRayTracingInvocationReorderFeaturesNV &\n      operator=( PhysicalDeviceRayTracingInvocationReorderFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceRayTracingInvocationReorderFeaturesNV & operator=( VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingInvocationReorderFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRayTracingInvocationReorderFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRayTracingInvocationReorderFeaturesNV &\n      setRayTracingInvocationReorder( VULKAN_HPP_NAMESPACE::Bool32 rayTracingInvocationReorder_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rayTracingInvocationReorder = rayTracingInvocationReorder_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, rayTracingInvocationReorder );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceRayTracingInvocationReorderFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceRayTracingInvocationReorderFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( rayTracingInvocationReorder == rhs.rayTracingInvocationReorder );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceRayTracingInvocationReorderFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                       = StructureType::ePhysicalDeviceRayTracingInvocationReorderFeaturesNV;\n    void *                              pNext                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        rayTracingInvocationReorder = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceRayTracingInvocationReorderFeaturesNV>\n  {\n    using Type = PhysicalDeviceRayTracingInvocationReorderFeaturesNV;\n  };\n\n  struct PhysicalDeviceRayTracingInvocationReorderPropertiesNV\n  {\n    using NativeType = VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceRayTracingInvocationReorderPropertiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRayTracingInvocationReorderPropertiesNV(\n      VULKAN_HPP_NAMESPACE::RayTracingInvocationReorderModeNV rayTracingInvocationReorderReorderingHint_ =\n        VULKAN_HPP_NAMESPACE::RayTracingInvocationReorderModeNV::eNone,\n      void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , rayTracingInvocationReorderReorderingHint{ rayTracingInvocationReorderReorderingHint_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceRayTracingInvocationReorderPropertiesNV( PhysicalDeviceRayTracingInvocationReorderPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceRayTracingInvocationReorderPropertiesNV( VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceRayTracingInvocationReorderPropertiesNV( *reinterpret_cast<PhysicalDeviceRayTracingInvocationReorderPropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceRayTracingInvocationReorderPropertiesNV &\n      operator=( PhysicalDeviceRayTracingInvocationReorderPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceRayTracingInvocationReorderPropertiesNV & operator=( VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingInvocationReorderPropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::RayTracingInvocationReorderModeNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, rayTracingInvocationReorderReorderingHint );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceRayTracingInvocationReorderPropertiesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceRayTracingInvocationReorderPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( rayTracingInvocationReorderReorderingHint == rhs.rayTracingInvocationReorderReorderingHint );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceRayTracingInvocationReorderPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                     sType = StructureType::ePhysicalDeviceRayTracingInvocationReorderPropertiesNV;\n    void *                                                  pNext = {};\n    VULKAN_HPP_NAMESPACE::RayTracingInvocationReorderModeNV rayTracingInvocationReorderReorderingHint =\n      VULKAN_HPP_NAMESPACE::RayTracingInvocationReorderModeNV::eNone;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceRayTracingInvocationReorderPropertiesNV>\n  {\n    using Type = PhysicalDeviceRayTracingInvocationReorderPropertiesNV;\n  };\n\n  struct PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 spheres_            = {},\n                                                                               VULKAN_HPP_NAMESPACE::Bool32 linearSweptSpheres_ = {},\n                                                                               void *                       pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , spheres{ spheres_ }\n      , linearSweptSpheres{ linearSweptSpheres_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV( PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV( VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV( *reinterpret_cast<PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV &\n      operator=( PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV & operator=( VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV & setSpheres( VULKAN_HPP_NAMESPACE::Bool32 spheres_ ) VULKAN_HPP_NOEXCEPT\n    {\n      spheres = spheres_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV &\n      setLinearSweptSpheres( VULKAN_HPP_NAMESPACE::Bool32 linearSweptSpheres_ ) VULKAN_HPP_NOEXCEPT\n    {\n      linearSweptSpheres = linearSweptSpheres_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, spheres, linearSweptSpheres );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( spheres == rhs.spheres ) && ( linearSweptSpheres == rhs.linearSweptSpheres );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType              = StructureType::ePhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV;\n    void *                              pNext              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        spheres            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        linearSweptSpheres = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV>\n  {\n    using Type = PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV;\n  };\n\n  struct PhysicalDeviceRayTracingMaintenance1FeaturesKHR\n  {\n    using NativeType = VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceRayTracingMaintenance1FeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRayTracingMaintenance1FeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 rayTracingMaintenance1_               = {},\n                                                                          VULKAN_HPP_NAMESPACE::Bool32 rayTracingPipelineTraceRaysIndirect2_ = {},\n                                                                          void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , rayTracingMaintenance1{ rayTracingMaintenance1_ }\n      , rayTracingPipelineTraceRaysIndirect2{ rayTracingPipelineTraceRaysIndirect2_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceRayTracingMaintenance1FeaturesKHR( PhysicalDeviceRayTracingMaintenance1FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceRayTracingMaintenance1FeaturesKHR( VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceRayTracingMaintenance1FeaturesKHR( *reinterpret_cast<PhysicalDeviceRayTracingMaintenance1FeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceRayTracingMaintenance1FeaturesKHR & operator=( PhysicalDeviceRayTracingMaintenance1FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceRayTracingMaintenance1FeaturesKHR & operator=( VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingMaintenance1FeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRayTracingMaintenance1FeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRayTracingMaintenance1FeaturesKHR &\n      setRayTracingMaintenance1( VULKAN_HPP_NAMESPACE::Bool32 rayTracingMaintenance1_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rayTracingMaintenance1 = rayTracingMaintenance1_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRayTracingMaintenance1FeaturesKHR &\n      setRayTracingPipelineTraceRaysIndirect2( VULKAN_HPP_NAMESPACE::Bool32 rayTracingPipelineTraceRaysIndirect2_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rayTracingPipelineTraceRaysIndirect2 = rayTracingPipelineTraceRaysIndirect2_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, rayTracingMaintenance1, rayTracingPipelineTraceRaysIndirect2 );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceRayTracingMaintenance1FeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceRayTracingMaintenance1FeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( rayTracingMaintenance1 == rhs.rayTracingMaintenance1 ) &&\n             ( rayTracingPipelineTraceRaysIndirect2 == rhs.rayTracingPipelineTraceRaysIndirect2 );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceRayTracingMaintenance1FeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                = StructureType::ePhysicalDeviceRayTracingMaintenance1FeaturesKHR;\n    void *                              pNext                                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        rayTracingMaintenance1               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        rayTracingPipelineTraceRaysIndirect2 = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceRayTracingMaintenance1FeaturesKHR>\n  {\n    using Type = PhysicalDeviceRayTracingMaintenance1FeaturesKHR;\n  };\n\n  struct PhysicalDeviceRayTracingMotionBlurFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceRayTracingMotionBlurFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceRayTracingMotionBlurFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRayTracingMotionBlurFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 rayTracingMotionBlur_                          = {},\n                                                                       VULKAN_HPP_NAMESPACE::Bool32 rayTracingMotionBlurPipelineTraceRaysIndirect_ = {},\n                                                                       void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , rayTracingMotionBlur{ rayTracingMotionBlur_ }\n      , rayTracingMotionBlurPipelineTraceRaysIndirect{ rayTracingMotionBlurPipelineTraceRaysIndirect_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRayTracingMotionBlurFeaturesNV( PhysicalDeviceRayTracingMotionBlurFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceRayTracingMotionBlurFeaturesNV( VkPhysicalDeviceRayTracingMotionBlurFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceRayTracingMotionBlurFeaturesNV( *reinterpret_cast<PhysicalDeviceRayTracingMotionBlurFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceRayTracingMotionBlurFeaturesNV & operator=( PhysicalDeviceRayTracingMotionBlurFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceRayTracingMotionBlurFeaturesNV & operator=( VkPhysicalDeviceRayTracingMotionBlurFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingMotionBlurFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRayTracingMotionBlurFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRayTracingMotionBlurFeaturesNV &\n      setRayTracingMotionBlur( VULKAN_HPP_NAMESPACE::Bool32 rayTracingMotionBlur_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rayTracingMotionBlur = rayTracingMotionBlur_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRayTracingMotionBlurFeaturesNV &\n      setRayTracingMotionBlurPipelineTraceRaysIndirect( VULKAN_HPP_NAMESPACE::Bool32 rayTracingMotionBlurPipelineTraceRaysIndirect_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rayTracingMotionBlurPipelineTraceRaysIndirect = rayTracingMotionBlurPipelineTraceRaysIndirect_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceRayTracingMotionBlurFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceRayTracingMotionBlurFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceRayTracingMotionBlurFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceRayTracingMotionBlurFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, rayTracingMotionBlur, rayTracingMotionBlurPipelineTraceRaysIndirect );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceRayTracingMotionBlurFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceRayTracingMotionBlurFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( rayTracingMotionBlur == rhs.rayTracingMotionBlur ) &&\n             ( rayTracingMotionBlurPipelineTraceRaysIndirect == rhs.rayTracingMotionBlurPipelineTraceRaysIndirect );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceRayTracingMotionBlurFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                         = StructureType::ePhysicalDeviceRayTracingMotionBlurFeaturesNV;\n    void *                              pNext                                         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        rayTracingMotionBlur                          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        rayTracingMotionBlurPipelineTraceRaysIndirect = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceRayTracingMotionBlurFeaturesNV>\n  {\n    using Type = PhysicalDeviceRayTracingMotionBlurFeaturesNV;\n  };\n\n  struct PhysicalDeviceRayTracingPipelineFeaturesKHR\n  {\n    using NativeType = VkPhysicalDeviceRayTracingPipelineFeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceRayTracingPipelineFeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRayTracingPipelineFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 rayTracingPipeline_                                    = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32 rayTracingPipelineShaderGroupHandleCaptureReplay_      = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32 rayTracingPipelineShaderGroupHandleCaptureReplayMixed_ = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32 rayTracingPipelineTraceRaysIndirect_                   = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32 rayTraversalPrimitiveCulling_                          = {},\n                                                                      void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , rayTracingPipeline{ rayTracingPipeline_ }\n      , rayTracingPipelineShaderGroupHandleCaptureReplay{ rayTracingPipelineShaderGroupHandleCaptureReplay_ }\n      , rayTracingPipelineShaderGroupHandleCaptureReplayMixed{ rayTracingPipelineShaderGroupHandleCaptureReplayMixed_ }\n      , rayTracingPipelineTraceRaysIndirect{ rayTracingPipelineTraceRaysIndirect_ }\n      , rayTraversalPrimitiveCulling{ rayTraversalPrimitiveCulling_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRayTracingPipelineFeaturesKHR( PhysicalDeviceRayTracingPipelineFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceRayTracingPipelineFeaturesKHR( VkPhysicalDeviceRayTracingPipelineFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceRayTracingPipelineFeaturesKHR( *reinterpret_cast<PhysicalDeviceRayTracingPipelineFeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceRayTracingPipelineFeaturesKHR & operator=( PhysicalDeviceRayTracingPipelineFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceRayTracingPipelineFeaturesKHR & operator=( VkPhysicalDeviceRayTracingPipelineFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPipelineFeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRayTracingPipelineFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRayTracingPipelineFeaturesKHR &\n      setRayTracingPipeline( VULKAN_HPP_NAMESPACE::Bool32 rayTracingPipeline_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rayTracingPipeline = rayTracingPipeline_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRayTracingPipelineFeaturesKHR &\n      setRayTracingPipelineShaderGroupHandleCaptureReplay( VULKAN_HPP_NAMESPACE::Bool32 rayTracingPipelineShaderGroupHandleCaptureReplay_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rayTracingPipelineShaderGroupHandleCaptureReplay = rayTracingPipelineShaderGroupHandleCaptureReplay_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRayTracingPipelineFeaturesKHR & setRayTracingPipelineShaderGroupHandleCaptureReplayMixed(\n      VULKAN_HPP_NAMESPACE::Bool32 rayTracingPipelineShaderGroupHandleCaptureReplayMixed_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rayTracingPipelineShaderGroupHandleCaptureReplayMixed = rayTracingPipelineShaderGroupHandleCaptureReplayMixed_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRayTracingPipelineFeaturesKHR &\n      setRayTracingPipelineTraceRaysIndirect( VULKAN_HPP_NAMESPACE::Bool32 rayTracingPipelineTraceRaysIndirect_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rayTracingPipelineTraceRaysIndirect = rayTracingPipelineTraceRaysIndirect_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRayTracingPipelineFeaturesKHR &\n      setRayTraversalPrimitiveCulling( VULKAN_HPP_NAMESPACE::Bool32 rayTraversalPrimitiveCulling_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rayTraversalPrimitiveCulling = rayTraversalPrimitiveCulling_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceRayTracingPipelineFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceRayTracingPipelineFeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceRayTracingPipelineFeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceRayTracingPipelineFeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       rayTracingPipeline,\n                       rayTracingPipelineShaderGroupHandleCaptureReplay,\n                       rayTracingPipelineShaderGroupHandleCaptureReplayMixed,\n                       rayTracingPipelineTraceRaysIndirect,\n                       rayTraversalPrimitiveCulling );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceRayTracingPipelineFeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceRayTracingPipelineFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( rayTracingPipeline == rhs.rayTracingPipeline ) &&\n             ( rayTracingPipelineShaderGroupHandleCaptureReplay == rhs.rayTracingPipelineShaderGroupHandleCaptureReplay ) &&\n             ( rayTracingPipelineShaderGroupHandleCaptureReplayMixed == rhs.rayTracingPipelineShaderGroupHandleCaptureReplayMixed ) &&\n             ( rayTracingPipelineTraceRaysIndirect == rhs.rayTracingPipelineTraceRaysIndirect ) &&\n             ( rayTraversalPrimitiveCulling == rhs.rayTraversalPrimitiveCulling );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceRayTracingPipelineFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                                 = StructureType::ePhysicalDeviceRayTracingPipelineFeaturesKHR;\n    void *                              pNext                                                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        rayTracingPipeline                                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        rayTracingPipelineShaderGroupHandleCaptureReplay      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        rayTracingPipelineShaderGroupHandleCaptureReplayMixed = {};\n    VULKAN_HPP_NAMESPACE::Bool32        rayTracingPipelineTraceRaysIndirect                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        rayTraversalPrimitiveCulling                          = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceRayTracingPipelineFeaturesKHR>\n  {\n    using Type = PhysicalDeviceRayTracingPipelineFeaturesKHR;\n  };\n\n  struct PhysicalDeviceRayTracingPipelinePropertiesKHR\n  {\n    using NativeType = VkPhysicalDeviceRayTracingPipelinePropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceRayTracingPipelinePropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRayTracingPipelinePropertiesKHR( uint32_t shaderGroupHandleSize_              = {},\n                                                                        uint32_t maxRayRecursionDepth_               = {},\n                                                                        uint32_t maxShaderGroupStride_               = {},\n                                                                        uint32_t shaderGroupBaseAlignment_           = {},\n                                                                        uint32_t shaderGroupHandleCaptureReplaySize_ = {},\n                                                                        uint32_t maxRayDispatchInvocationCount_      = {},\n                                                                        uint32_t shaderGroupHandleAlignment_         = {},\n                                                                        uint32_t maxRayHitAttributeSize_             = {},\n                                                                        void *   pNext_                              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderGroupHandleSize{ shaderGroupHandleSize_ }\n      , maxRayRecursionDepth{ maxRayRecursionDepth_ }\n      , maxShaderGroupStride{ maxShaderGroupStride_ }\n      , shaderGroupBaseAlignment{ shaderGroupBaseAlignment_ }\n      , shaderGroupHandleCaptureReplaySize{ shaderGroupHandleCaptureReplaySize_ }\n      , maxRayDispatchInvocationCount{ maxRayDispatchInvocationCount_ }\n      , shaderGroupHandleAlignment{ shaderGroupHandleAlignment_ }\n      , maxRayHitAttributeSize{ maxRayHitAttributeSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceRayTracingPipelinePropertiesKHR( PhysicalDeviceRayTracingPipelinePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceRayTracingPipelinePropertiesKHR( VkPhysicalDeviceRayTracingPipelinePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceRayTracingPipelinePropertiesKHR( *reinterpret_cast<PhysicalDeviceRayTracingPipelinePropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceRayTracingPipelinePropertiesKHR & operator=( PhysicalDeviceRayTracingPipelinePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceRayTracingPipelinePropertiesKHR & operator=( VkPhysicalDeviceRayTracingPipelinePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPipelinePropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceRayTracingPipelinePropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceRayTracingPipelinePropertiesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceRayTracingPipelinePropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceRayTracingPipelinePropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       shaderGroupHandleSize,\n                       maxRayRecursionDepth,\n                       maxShaderGroupStride,\n                       shaderGroupBaseAlignment,\n                       shaderGroupHandleCaptureReplaySize,\n                       maxRayDispatchInvocationCount,\n                       shaderGroupHandleAlignment,\n                       maxRayHitAttributeSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceRayTracingPipelinePropertiesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceRayTracingPipelinePropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderGroupHandleSize == rhs.shaderGroupHandleSize ) &&\n             ( maxRayRecursionDepth == rhs.maxRayRecursionDepth ) && ( maxShaderGroupStride == rhs.maxShaderGroupStride ) &&\n             ( shaderGroupBaseAlignment == rhs.shaderGroupBaseAlignment ) && ( shaderGroupHandleCaptureReplaySize == rhs.shaderGroupHandleCaptureReplaySize ) &&\n             ( maxRayDispatchInvocationCount == rhs.maxRayDispatchInvocationCount ) && ( shaderGroupHandleAlignment == rhs.shaderGroupHandleAlignment ) &&\n             ( maxRayHitAttributeSize == rhs.maxRayHitAttributeSize );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceRayTracingPipelinePropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                              = StructureType::ePhysicalDeviceRayTracingPipelinePropertiesKHR;\n    void *                              pNext                              = {};\n    uint32_t                            shaderGroupHandleSize              = {};\n    uint32_t                            maxRayRecursionDepth               = {};\n    uint32_t                            maxShaderGroupStride               = {};\n    uint32_t                            shaderGroupBaseAlignment           = {};\n    uint32_t                            shaderGroupHandleCaptureReplaySize = {};\n    uint32_t                            maxRayDispatchInvocationCount      = {};\n    uint32_t                            shaderGroupHandleAlignment         = {};\n    uint32_t                            maxRayHitAttributeSize             = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceRayTracingPipelinePropertiesKHR>\n  {\n    using Type = PhysicalDeviceRayTracingPipelinePropertiesKHR;\n  };\n\n  struct PhysicalDeviceRayTracingPositionFetchFeaturesKHR\n  {\n    using NativeType = VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceRayTracingPositionFetchFeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRayTracingPositionFetchFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 rayTracingPositionFetch_ = {},\n                                                                           void *                       pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , rayTracingPositionFetch{ rayTracingPositionFetch_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceRayTracingPositionFetchFeaturesKHR( PhysicalDeviceRayTracingPositionFetchFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceRayTracingPositionFetchFeaturesKHR( VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceRayTracingPositionFetchFeaturesKHR( *reinterpret_cast<PhysicalDeviceRayTracingPositionFetchFeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceRayTracingPositionFetchFeaturesKHR & operator=( PhysicalDeviceRayTracingPositionFetchFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceRayTracingPositionFetchFeaturesKHR & operator=( VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPositionFetchFeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRayTracingPositionFetchFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRayTracingPositionFetchFeaturesKHR &\n      setRayTracingPositionFetch( VULKAN_HPP_NAMESPACE::Bool32 rayTracingPositionFetch_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rayTracingPositionFetch = rayTracingPositionFetch_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceRayTracingPositionFetchFeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, rayTracingPositionFetch );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceRayTracingPositionFetchFeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceRayTracingPositionFetchFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( rayTracingPositionFetch == rhs.rayTracingPositionFetch );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceRayTracingPositionFetchFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                   = StructureType::ePhysicalDeviceRayTracingPositionFetchFeaturesKHR;\n    void *                              pNext                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        rayTracingPositionFetch = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceRayTracingPositionFetchFeaturesKHR>\n  {\n    using Type = PhysicalDeviceRayTracingPositionFetchFeaturesKHR;\n  };\n\n  struct PhysicalDeviceRayTracingPropertiesNV\n  {\n    using NativeType = VkPhysicalDeviceRayTracingPropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceRayTracingPropertiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRayTracingPropertiesNV( uint32_t shaderGroupHandleSize_                  = {},\n                                                               uint32_t maxRecursionDepth_                      = {},\n                                                               uint32_t maxShaderGroupStride_                   = {},\n                                                               uint32_t shaderGroupBaseAlignment_               = {},\n                                                               uint64_t maxGeometryCount_                       = {},\n                                                               uint64_t maxInstanceCount_                       = {},\n                                                               uint64_t maxTriangleCount_                       = {},\n                                                               uint32_t maxDescriptorSetAccelerationStructures_ = {},\n                                                               void *   pNext_                                  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderGroupHandleSize{ shaderGroupHandleSize_ }\n      , maxRecursionDepth{ maxRecursionDepth_ }\n      , maxShaderGroupStride{ maxShaderGroupStride_ }\n      , shaderGroupBaseAlignment{ shaderGroupBaseAlignment_ }\n      , maxGeometryCount{ maxGeometryCount_ }\n      , maxInstanceCount{ maxInstanceCount_ }\n      , maxTriangleCount{ maxTriangleCount_ }\n      , maxDescriptorSetAccelerationStructures{ maxDescriptorSetAccelerationStructures_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRayTracingPropertiesNV( PhysicalDeviceRayTracingPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceRayTracingPropertiesNV( VkPhysicalDeviceRayTracingPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceRayTracingPropertiesNV( *reinterpret_cast<PhysicalDeviceRayTracingPropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceRayTracingPropertiesNV & operator=( PhysicalDeviceRayTracingPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceRayTracingPropertiesNV & operator=( VkPhysicalDeviceRayTracingPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceRayTracingPropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceRayTracingPropertiesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceRayTracingPropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceRayTracingPropertiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint64_t const &,\n               uint64_t const &,\n               uint64_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       shaderGroupHandleSize,\n                       maxRecursionDepth,\n                       maxShaderGroupStride,\n                       shaderGroupBaseAlignment,\n                       maxGeometryCount,\n                       maxInstanceCount,\n                       maxTriangleCount,\n                       maxDescriptorSetAccelerationStructures );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceRayTracingPropertiesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceRayTracingPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderGroupHandleSize == rhs.shaderGroupHandleSize ) &&\n             ( maxRecursionDepth == rhs.maxRecursionDepth ) && ( maxShaderGroupStride == rhs.maxShaderGroupStride ) &&\n             ( shaderGroupBaseAlignment == rhs.shaderGroupBaseAlignment ) && ( maxGeometryCount == rhs.maxGeometryCount ) &&\n             ( maxInstanceCount == rhs.maxInstanceCount ) && ( maxTriangleCount == rhs.maxTriangleCount ) &&\n             ( maxDescriptorSetAccelerationStructures == rhs.maxDescriptorSetAccelerationStructures );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceRayTracingPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                  = StructureType::ePhysicalDeviceRayTracingPropertiesNV;\n    void *                              pNext                                  = {};\n    uint32_t                            shaderGroupHandleSize                  = {};\n    uint32_t                            maxRecursionDepth                      = {};\n    uint32_t                            maxShaderGroupStride                   = {};\n    uint32_t                            shaderGroupBaseAlignment               = {};\n    uint64_t                            maxGeometryCount                       = {};\n    uint64_t                            maxInstanceCount                       = {};\n    uint64_t                            maxTriangleCount                       = {};\n    uint32_t                            maxDescriptorSetAccelerationStructures = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceRayTracingPropertiesNV>\n  {\n    using Type = PhysicalDeviceRayTracingPropertiesNV;\n  };\n\n  struct PhysicalDeviceRayTracingValidationFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceRayTracingValidationFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceRayTracingValidationFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRayTracingValidationFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 rayTracingValidation_ = {},\n                                                                       void *                       pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , rayTracingValidation{ rayTracingValidation_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRayTracingValidationFeaturesNV( PhysicalDeviceRayTracingValidationFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceRayTracingValidationFeaturesNV( VkPhysicalDeviceRayTracingValidationFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceRayTracingValidationFeaturesNV( *reinterpret_cast<PhysicalDeviceRayTracingValidationFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceRayTracingValidationFeaturesNV & operator=( PhysicalDeviceRayTracingValidationFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceRayTracingValidationFeaturesNV & operator=( VkPhysicalDeviceRayTracingValidationFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingValidationFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRayTracingValidationFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRayTracingValidationFeaturesNV &\n      setRayTracingValidation( VULKAN_HPP_NAMESPACE::Bool32 rayTracingValidation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rayTracingValidation = rayTracingValidation_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceRayTracingValidationFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceRayTracingValidationFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceRayTracingValidationFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceRayTracingValidationFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, rayTracingValidation );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceRayTracingValidationFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceRayTracingValidationFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( rayTracingValidation == rhs.rayTracingValidation );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceRayTracingValidationFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                = StructureType::ePhysicalDeviceRayTracingValidationFeaturesNV;\n    void *                              pNext                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        rayTracingValidation = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceRayTracingValidationFeaturesNV>\n  {\n    using Type = PhysicalDeviceRayTracingValidationFeaturesNV;\n  };\n\n  struct PhysicalDeviceRelaxedLineRasterizationFeaturesIMG\n  {\n    using NativeType = VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceRelaxedLineRasterizationFeaturesIMG;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRelaxedLineRasterizationFeaturesIMG( VULKAN_HPP_NAMESPACE::Bool32 relaxedLineRasterization_ = {},\n                                                                            void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , relaxedLineRasterization{ relaxedLineRasterization_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceRelaxedLineRasterizationFeaturesIMG( PhysicalDeviceRelaxedLineRasterizationFeaturesIMG const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceRelaxedLineRasterizationFeaturesIMG( VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceRelaxedLineRasterizationFeaturesIMG( *reinterpret_cast<PhysicalDeviceRelaxedLineRasterizationFeaturesIMG const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceRelaxedLineRasterizationFeaturesIMG &\n      operator=( PhysicalDeviceRelaxedLineRasterizationFeaturesIMG const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceRelaxedLineRasterizationFeaturesIMG & operator=( VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceRelaxedLineRasterizationFeaturesIMG const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRelaxedLineRasterizationFeaturesIMG & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRelaxedLineRasterizationFeaturesIMG &\n      setRelaxedLineRasterization( VULKAN_HPP_NAMESPACE::Bool32 relaxedLineRasterization_ ) VULKAN_HPP_NOEXCEPT\n    {\n      relaxedLineRasterization = relaxedLineRasterization_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG *>( this );\n    }\n\n    operator VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, relaxedLineRasterization );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceRelaxedLineRasterizationFeaturesIMG const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceRelaxedLineRasterizationFeaturesIMG const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( relaxedLineRasterization == rhs.relaxedLineRasterization );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceRelaxedLineRasterizationFeaturesIMG const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                    = StructureType::ePhysicalDeviceRelaxedLineRasterizationFeaturesIMG;\n    void *                              pNext                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        relaxedLineRasterization = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceRelaxedLineRasterizationFeaturesIMG>\n  {\n    using Type = PhysicalDeviceRelaxedLineRasterizationFeaturesIMG;\n  };\n\n  struct PhysicalDeviceRenderPassStripedFeaturesARM\n  {\n    using NativeType = VkPhysicalDeviceRenderPassStripedFeaturesARM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceRenderPassStripedFeaturesARM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRenderPassStripedFeaturesARM( VULKAN_HPP_NAMESPACE::Bool32 renderPassStriped_ = {},\n                                                                     void *                       pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , renderPassStriped{ renderPassStriped_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRenderPassStripedFeaturesARM( PhysicalDeviceRenderPassStripedFeaturesARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceRenderPassStripedFeaturesARM( VkPhysicalDeviceRenderPassStripedFeaturesARM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceRenderPassStripedFeaturesARM( *reinterpret_cast<PhysicalDeviceRenderPassStripedFeaturesARM const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceRenderPassStripedFeaturesARM & operator=( PhysicalDeviceRenderPassStripedFeaturesARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceRenderPassStripedFeaturesARM & operator=( VkPhysicalDeviceRenderPassStripedFeaturesARM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceRenderPassStripedFeaturesARM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRenderPassStripedFeaturesARM & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRenderPassStripedFeaturesARM &\n      setRenderPassStriped( VULKAN_HPP_NAMESPACE::Bool32 renderPassStriped_ ) VULKAN_HPP_NOEXCEPT\n    {\n      renderPassStriped = renderPassStriped_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceRenderPassStripedFeaturesARM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceRenderPassStripedFeaturesARM *>( this );\n    }\n\n    operator VkPhysicalDeviceRenderPassStripedFeaturesARM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceRenderPassStripedFeaturesARM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, renderPassStriped );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceRenderPassStripedFeaturesARM const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceRenderPassStripedFeaturesARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( renderPassStriped == rhs.renderPassStriped );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceRenderPassStripedFeaturesARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType             = StructureType::ePhysicalDeviceRenderPassStripedFeaturesARM;\n    void *                              pNext             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        renderPassStriped = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceRenderPassStripedFeaturesARM>\n  {\n    using Type = PhysicalDeviceRenderPassStripedFeaturesARM;\n  };\n\n  struct PhysicalDeviceRenderPassStripedPropertiesARM\n  {\n    using NativeType = VkPhysicalDeviceRenderPassStripedPropertiesARM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceRenderPassStripedPropertiesARM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRenderPassStripedPropertiesARM( VULKAN_HPP_NAMESPACE::Extent2D renderPassStripeGranularity_ = {},\n                                                                       uint32_t                       maxRenderPassStripes_        = {},\n                                                                       void *                         pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , renderPassStripeGranularity{ renderPassStripeGranularity_ }\n      , maxRenderPassStripes{ maxRenderPassStripes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRenderPassStripedPropertiesARM( PhysicalDeviceRenderPassStripedPropertiesARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceRenderPassStripedPropertiesARM( VkPhysicalDeviceRenderPassStripedPropertiesARM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceRenderPassStripedPropertiesARM( *reinterpret_cast<PhysicalDeviceRenderPassStripedPropertiesARM const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceRenderPassStripedPropertiesARM & operator=( PhysicalDeviceRenderPassStripedPropertiesARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceRenderPassStripedPropertiesARM & operator=( VkPhysicalDeviceRenderPassStripedPropertiesARM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceRenderPassStripedPropertiesARM const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceRenderPassStripedPropertiesARM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceRenderPassStripedPropertiesARM *>( this );\n    }\n\n    operator VkPhysicalDeviceRenderPassStripedPropertiesARM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceRenderPassStripedPropertiesARM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Extent2D const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, renderPassStripeGranularity, maxRenderPassStripes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceRenderPassStripedPropertiesARM const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceRenderPassStripedPropertiesARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( renderPassStripeGranularity == rhs.renderPassStripeGranularity ) &&\n             ( maxRenderPassStripes == rhs.maxRenderPassStripes );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceRenderPassStripedPropertiesARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                       = StructureType::ePhysicalDeviceRenderPassStripedPropertiesARM;\n    void *                              pNext                       = {};\n    VULKAN_HPP_NAMESPACE::Extent2D      renderPassStripeGranularity = {};\n    uint32_t                            maxRenderPassStripes        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceRenderPassStripedPropertiesARM>\n  {\n    using Type = PhysicalDeviceRenderPassStripedPropertiesARM;\n  };\n\n  struct PhysicalDeviceRepresentativeFragmentTestFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceRepresentativeFragmentTestFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRepresentativeFragmentTestFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 representativeFragmentTest_ = {},\n                                                                             void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , representativeFragmentTest{ representativeFragmentTest_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceRepresentativeFragmentTestFeaturesNV( PhysicalDeviceRepresentativeFragmentTestFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceRepresentativeFragmentTestFeaturesNV( VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceRepresentativeFragmentTestFeaturesNV( *reinterpret_cast<PhysicalDeviceRepresentativeFragmentTestFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceRepresentativeFragmentTestFeaturesNV &\n      operator=( PhysicalDeviceRepresentativeFragmentTestFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceRepresentativeFragmentTestFeaturesNV & operator=( VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceRepresentativeFragmentTestFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRepresentativeFragmentTestFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRepresentativeFragmentTestFeaturesNV &\n      setRepresentativeFragmentTest( VULKAN_HPP_NAMESPACE::Bool32 representativeFragmentTest_ ) VULKAN_HPP_NOEXCEPT\n    {\n      representativeFragmentTest = representativeFragmentTest_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, representativeFragmentTest );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceRepresentativeFragmentTestFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceRepresentativeFragmentTestFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( representativeFragmentTest == rhs.representativeFragmentTest );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceRepresentativeFragmentTestFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                      = StructureType::ePhysicalDeviceRepresentativeFragmentTestFeaturesNV;\n    void *                              pNext                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        representativeFragmentTest = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceRepresentativeFragmentTestFeaturesNV>\n  {\n    using Type = PhysicalDeviceRepresentativeFragmentTestFeaturesNV;\n  };\n\n  struct PhysicalDeviceRobustness2FeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceRobustness2FeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceRobustness2FeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRobustness2FeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 robustBufferAccess2_ = {},\n                                                               VULKAN_HPP_NAMESPACE::Bool32 robustImageAccess2_  = {},\n                                                               VULKAN_HPP_NAMESPACE::Bool32 nullDescriptor_      = {},\n                                                               void *                       pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , robustBufferAccess2{ robustBufferAccess2_ }\n      , robustImageAccess2{ robustImageAccess2_ }\n      , nullDescriptor{ nullDescriptor_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRobustness2FeaturesEXT( PhysicalDeviceRobustness2FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceRobustness2FeaturesEXT( VkPhysicalDeviceRobustness2FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceRobustness2FeaturesEXT( *reinterpret_cast<PhysicalDeviceRobustness2FeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceRobustness2FeaturesEXT & operator=( PhysicalDeviceRobustness2FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceRobustness2FeaturesEXT & operator=( VkPhysicalDeviceRobustness2FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceRobustness2FeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRobustness2FeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRobustness2FeaturesEXT &\n      setRobustBufferAccess2( VULKAN_HPP_NAMESPACE::Bool32 robustBufferAccess2_ ) VULKAN_HPP_NOEXCEPT\n    {\n      robustBufferAccess2 = robustBufferAccess2_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRobustness2FeaturesEXT & setRobustImageAccess2( VULKAN_HPP_NAMESPACE::Bool32 robustImageAccess2_ ) VULKAN_HPP_NOEXCEPT\n    {\n      robustImageAccess2 = robustImageAccess2_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceRobustness2FeaturesEXT & setNullDescriptor( VULKAN_HPP_NAMESPACE::Bool32 nullDescriptor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      nullDescriptor = nullDescriptor_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceRobustness2FeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceRobustness2FeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceRobustness2FeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceRobustness2FeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, robustBufferAccess2, robustImageAccess2, nullDescriptor );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceRobustness2FeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceRobustness2FeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( robustBufferAccess2 == rhs.robustBufferAccess2 ) &&\n             ( robustImageAccess2 == rhs.robustImageAccess2 ) && ( nullDescriptor == rhs.nullDescriptor );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceRobustness2FeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType               = StructureType::ePhysicalDeviceRobustness2FeaturesEXT;\n    void *                              pNext               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        robustBufferAccess2 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        robustImageAccess2  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        nullDescriptor      = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceRobustness2FeaturesEXT>\n  {\n    using Type = PhysicalDeviceRobustness2FeaturesEXT;\n  };\n\n  struct PhysicalDeviceRobustness2PropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceRobustness2PropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceRobustness2PropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRobustness2PropertiesEXT( VULKAN_HPP_NAMESPACE::DeviceSize robustStorageBufferAccessSizeAlignment_ = {},\n                                                                 VULKAN_HPP_NAMESPACE::DeviceSize robustUniformBufferAccessSizeAlignment_ = {},\n                                                                 void *                           pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , robustStorageBufferAccessSizeAlignment{ robustStorageBufferAccessSizeAlignment_ }\n      , robustUniformBufferAccessSizeAlignment{ robustUniformBufferAccessSizeAlignment_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceRobustness2PropertiesEXT( PhysicalDeviceRobustness2PropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceRobustness2PropertiesEXT( VkPhysicalDeviceRobustness2PropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceRobustness2PropertiesEXT( *reinterpret_cast<PhysicalDeviceRobustness2PropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceRobustness2PropertiesEXT & operator=( PhysicalDeviceRobustness2PropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceRobustness2PropertiesEXT & operator=( VkPhysicalDeviceRobustness2PropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceRobustness2PropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceRobustness2PropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceRobustness2PropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceRobustness2PropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceRobustness2PropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::DeviceSize const &, VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, robustStorageBufferAccessSizeAlignment, robustUniformBufferAccessSizeAlignment );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceRobustness2PropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceRobustness2PropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( robustStorageBufferAccessSizeAlignment == rhs.robustStorageBufferAccessSizeAlignment ) &&\n             ( robustUniformBufferAccessSizeAlignment == rhs.robustUniformBufferAccessSizeAlignment );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceRobustness2PropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                  = StructureType::ePhysicalDeviceRobustness2PropertiesEXT;\n    void *                              pNext                                  = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    robustStorageBufferAccessSizeAlignment = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    robustUniformBufferAccessSizeAlignment = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceRobustness2PropertiesEXT>\n  {\n    using Type = PhysicalDeviceRobustness2PropertiesEXT;\n  };\n\n  struct PhysicalDeviceSampleLocationsPropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceSampleLocationsPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceSampleLocationsPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSampleLocationsPropertiesEXT( VULKAN_HPP_NAMESPACE::SampleCountFlags sampleLocationSampleCounts_    = {},\n                                                                        VULKAN_HPP_NAMESPACE::Extent2D         maxSampleLocationGridSize_     = {},\n                                                                        std::array<float, 2> const &           sampleLocationCoordinateRange_ = {},\n                                                                        uint32_t                               sampleLocationSubPixelBits_    = {},\n                                                                        VULKAN_HPP_NAMESPACE::Bool32           variableSampleLocations_       = {},\n                                                                        void *                                 pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , sampleLocationSampleCounts{ sampleLocationSampleCounts_ }\n      , maxSampleLocationGridSize{ maxSampleLocationGridSize_ }\n      , sampleLocationCoordinateRange{ sampleLocationCoordinateRange_ }\n      , sampleLocationSubPixelBits{ sampleLocationSubPixelBits_ }\n      , variableSampleLocations{ variableSampleLocations_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSampleLocationsPropertiesEXT( PhysicalDeviceSampleLocationsPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceSampleLocationsPropertiesEXT( VkPhysicalDeviceSampleLocationsPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceSampleLocationsPropertiesEXT( *reinterpret_cast<PhysicalDeviceSampleLocationsPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceSampleLocationsPropertiesEXT & operator=( PhysicalDeviceSampleLocationsPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceSampleLocationsPropertiesEXT & operator=( VkPhysicalDeviceSampleLocationsPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceSampleLocationsPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceSampleLocationsPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceSampleLocationsPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceSampleLocationsPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceSampleLocationsPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlags const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<float, 2> const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       sampleLocationSampleCounts,\n                       maxSampleLocationGridSize,\n                       sampleLocationCoordinateRange,\n                       sampleLocationSubPixelBits,\n                       variableSampleLocations );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceSampleLocationsPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceSampleLocationsPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( sampleLocationSampleCounts == rhs.sampleLocationSampleCounts ) &&\n             ( maxSampleLocationGridSize == rhs.maxSampleLocationGridSize ) && ( sampleLocationCoordinateRange == rhs.sampleLocationCoordinateRange ) &&\n             ( sampleLocationSubPixelBits == rhs.sampleLocationSubPixelBits ) && ( variableSampleLocations == rhs.variableSampleLocations );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceSampleLocationsPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType            sType                         = StructureType::ePhysicalDeviceSampleLocationsPropertiesEXT;\n    void *                                         pNext                         = {};\n    VULKAN_HPP_NAMESPACE::SampleCountFlags         sampleLocationSampleCounts    = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                 maxSampleLocationGridSize     = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<float, 2> sampleLocationCoordinateRange = {};\n    uint32_t                                       sampleLocationSubPixelBits    = {};\n    VULKAN_HPP_NAMESPACE::Bool32                   variableSampleLocations       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceSampleLocationsPropertiesEXT>\n  {\n    using Type = PhysicalDeviceSampleLocationsPropertiesEXT;\n  };\n\n  struct PhysicalDeviceSamplerFilterMinmaxProperties\n  {\n    using NativeType = VkPhysicalDeviceSamplerFilterMinmaxProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceSamplerFilterMinmaxProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSamplerFilterMinmaxProperties( VULKAN_HPP_NAMESPACE::Bool32 filterMinmaxSingleComponentFormats_ = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32 filterMinmaxImageComponentMapping_  = {},\n                                                                      void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , filterMinmaxSingleComponentFormats{ filterMinmaxSingleComponentFormats_ }\n      , filterMinmaxImageComponentMapping{ filterMinmaxImageComponentMapping_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSamplerFilterMinmaxProperties( PhysicalDeviceSamplerFilterMinmaxProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceSamplerFilterMinmaxProperties( VkPhysicalDeviceSamplerFilterMinmaxProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceSamplerFilterMinmaxProperties( *reinterpret_cast<PhysicalDeviceSamplerFilterMinmaxProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceSamplerFilterMinmaxProperties & operator=( PhysicalDeviceSamplerFilterMinmaxProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceSamplerFilterMinmaxProperties & operator=( VkPhysicalDeviceSamplerFilterMinmaxProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceSamplerFilterMinmaxProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceSamplerFilterMinmaxProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceSamplerFilterMinmaxProperties *>( this );\n    }\n\n    operator VkPhysicalDeviceSamplerFilterMinmaxProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceSamplerFilterMinmaxProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, filterMinmaxSingleComponentFormats, filterMinmaxImageComponentMapping );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceSamplerFilterMinmaxProperties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceSamplerFilterMinmaxProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( filterMinmaxSingleComponentFormats == rhs.filterMinmaxSingleComponentFormats ) &&\n             ( filterMinmaxImageComponentMapping == rhs.filterMinmaxImageComponentMapping );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceSamplerFilterMinmaxProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                              = StructureType::ePhysicalDeviceSamplerFilterMinmaxProperties;\n    void *                              pNext                              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        filterMinmaxSingleComponentFormats = {};\n    VULKAN_HPP_NAMESPACE::Bool32        filterMinmaxImageComponentMapping  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceSamplerFilterMinmaxProperties>\n  {\n    using Type = PhysicalDeviceSamplerFilterMinmaxProperties;\n  };\n\n  using PhysicalDeviceSamplerFilterMinmaxPropertiesEXT = PhysicalDeviceSamplerFilterMinmaxProperties;\n\n  struct PhysicalDeviceSamplerYcbcrConversionFeatures\n  {\n    using NativeType = VkPhysicalDeviceSamplerYcbcrConversionFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceSamplerYcbcrConversionFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSamplerYcbcrConversionFeatures( VULKAN_HPP_NAMESPACE::Bool32 samplerYcbcrConversion_ = {},\n                                                                       void *                       pNext_                  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , samplerYcbcrConversion{ samplerYcbcrConversion_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSamplerYcbcrConversionFeatures( PhysicalDeviceSamplerYcbcrConversionFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceSamplerYcbcrConversionFeatures( VkPhysicalDeviceSamplerYcbcrConversionFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceSamplerYcbcrConversionFeatures( *reinterpret_cast<PhysicalDeviceSamplerYcbcrConversionFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceSamplerYcbcrConversionFeatures & operator=( PhysicalDeviceSamplerYcbcrConversionFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceSamplerYcbcrConversionFeatures & operator=( VkPhysicalDeviceSamplerYcbcrConversionFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceSamplerYcbcrConversionFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSamplerYcbcrConversionFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSamplerYcbcrConversionFeatures &\n      setSamplerYcbcrConversion( VULKAN_HPP_NAMESPACE::Bool32 samplerYcbcrConversion_ ) VULKAN_HPP_NOEXCEPT\n    {\n      samplerYcbcrConversion = samplerYcbcrConversion_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceSamplerYcbcrConversionFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceSamplerYcbcrConversionFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceSamplerYcbcrConversionFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceSamplerYcbcrConversionFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, samplerYcbcrConversion );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceSamplerYcbcrConversionFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceSamplerYcbcrConversionFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( samplerYcbcrConversion == rhs.samplerYcbcrConversion );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceSamplerYcbcrConversionFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                  = StructureType::ePhysicalDeviceSamplerYcbcrConversionFeatures;\n    void *                              pNext                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        samplerYcbcrConversion = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceSamplerYcbcrConversionFeatures>\n  {\n    using Type = PhysicalDeviceSamplerYcbcrConversionFeatures;\n  };\n\n  using PhysicalDeviceSamplerYcbcrConversionFeaturesKHR = PhysicalDeviceSamplerYcbcrConversionFeatures;\n\n  struct PhysicalDeviceScalarBlockLayoutFeatures\n  {\n    using NativeType = VkPhysicalDeviceScalarBlockLayoutFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceScalarBlockLayoutFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceScalarBlockLayoutFeatures( VULKAN_HPP_NAMESPACE::Bool32 scalarBlockLayout_ = {},\n                                                                  void *                       pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , scalarBlockLayout{ scalarBlockLayout_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceScalarBlockLayoutFeatures( PhysicalDeviceScalarBlockLayoutFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceScalarBlockLayoutFeatures( VkPhysicalDeviceScalarBlockLayoutFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceScalarBlockLayoutFeatures( *reinterpret_cast<PhysicalDeviceScalarBlockLayoutFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceScalarBlockLayoutFeatures & operator=( PhysicalDeviceScalarBlockLayoutFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceScalarBlockLayoutFeatures & operator=( VkPhysicalDeviceScalarBlockLayoutFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceScalarBlockLayoutFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceScalarBlockLayoutFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceScalarBlockLayoutFeatures &\n      setScalarBlockLayout( VULKAN_HPP_NAMESPACE::Bool32 scalarBlockLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      scalarBlockLayout = scalarBlockLayout_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceScalarBlockLayoutFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceScalarBlockLayoutFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceScalarBlockLayoutFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceScalarBlockLayoutFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, scalarBlockLayout );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceScalarBlockLayoutFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceScalarBlockLayoutFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( scalarBlockLayout == rhs.scalarBlockLayout );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceScalarBlockLayoutFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType             = StructureType::ePhysicalDeviceScalarBlockLayoutFeatures;\n    void *                              pNext             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        scalarBlockLayout = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceScalarBlockLayoutFeatures>\n  {\n    using Type = PhysicalDeviceScalarBlockLayoutFeatures;\n  };\n\n  using PhysicalDeviceScalarBlockLayoutFeaturesEXT = PhysicalDeviceScalarBlockLayoutFeatures;\n\n  struct PhysicalDeviceSchedulingControlsFeaturesARM\n  {\n    using NativeType = VkPhysicalDeviceSchedulingControlsFeaturesARM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceSchedulingControlsFeaturesARM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSchedulingControlsFeaturesARM( VULKAN_HPP_NAMESPACE::Bool32 schedulingControls_ = {},\n                                                                      void *                       pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , schedulingControls{ schedulingControls_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSchedulingControlsFeaturesARM( PhysicalDeviceSchedulingControlsFeaturesARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceSchedulingControlsFeaturesARM( VkPhysicalDeviceSchedulingControlsFeaturesARM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceSchedulingControlsFeaturesARM( *reinterpret_cast<PhysicalDeviceSchedulingControlsFeaturesARM const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceSchedulingControlsFeaturesARM & operator=( PhysicalDeviceSchedulingControlsFeaturesARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceSchedulingControlsFeaturesARM & operator=( VkPhysicalDeviceSchedulingControlsFeaturesARM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceSchedulingControlsFeaturesARM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSchedulingControlsFeaturesARM & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSchedulingControlsFeaturesARM &\n      setSchedulingControls( VULKAN_HPP_NAMESPACE::Bool32 schedulingControls_ ) VULKAN_HPP_NOEXCEPT\n    {\n      schedulingControls = schedulingControls_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceSchedulingControlsFeaturesARM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceSchedulingControlsFeaturesARM *>( this );\n    }\n\n    operator VkPhysicalDeviceSchedulingControlsFeaturesARM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceSchedulingControlsFeaturesARM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, schedulingControls );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceSchedulingControlsFeaturesARM const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceSchedulingControlsFeaturesARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( schedulingControls == rhs.schedulingControls );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceSchedulingControlsFeaturesARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType              = StructureType::ePhysicalDeviceSchedulingControlsFeaturesARM;\n    void *                              pNext              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        schedulingControls = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceSchedulingControlsFeaturesARM>\n  {\n    using Type = PhysicalDeviceSchedulingControlsFeaturesARM;\n  };\n\n  struct PhysicalDeviceSchedulingControlsPropertiesARM\n  {\n    using NativeType = VkPhysicalDeviceSchedulingControlsPropertiesARM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceSchedulingControlsPropertiesARM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceSchedulingControlsPropertiesARM( VULKAN_HPP_NAMESPACE::PhysicalDeviceSchedulingControlsFlagsARM schedulingControlsFlags_ = {},\n                                                     void *                                                         pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , schedulingControlsFlags{ schedulingControlsFlags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceSchedulingControlsPropertiesARM( PhysicalDeviceSchedulingControlsPropertiesARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceSchedulingControlsPropertiesARM( VkPhysicalDeviceSchedulingControlsPropertiesARM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceSchedulingControlsPropertiesARM( *reinterpret_cast<PhysicalDeviceSchedulingControlsPropertiesARM const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceSchedulingControlsPropertiesARM & operator=( PhysicalDeviceSchedulingControlsPropertiesARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceSchedulingControlsPropertiesARM & operator=( VkPhysicalDeviceSchedulingControlsPropertiesARM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceSchedulingControlsPropertiesARM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSchedulingControlsPropertiesARM & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSchedulingControlsPropertiesARM &\n      setSchedulingControlsFlags( VULKAN_HPP_NAMESPACE::PhysicalDeviceSchedulingControlsFlagsARM schedulingControlsFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      schedulingControlsFlags = schedulingControlsFlags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceSchedulingControlsPropertiesARM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceSchedulingControlsPropertiesARM *>( this );\n    }\n\n    operator VkPhysicalDeviceSchedulingControlsPropertiesARM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceSchedulingControlsPropertiesARM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::PhysicalDeviceSchedulingControlsFlagsARM const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, schedulingControlsFlags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceSchedulingControlsPropertiesARM const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceSchedulingControlsPropertiesARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( schedulingControlsFlags == rhs.schedulingControlsFlags );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceSchedulingControlsPropertiesARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                            sType                   = StructureType::ePhysicalDeviceSchedulingControlsPropertiesARM;\n    void *                                                         pNext                   = {};\n    VULKAN_HPP_NAMESPACE::PhysicalDeviceSchedulingControlsFlagsARM schedulingControlsFlags = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceSchedulingControlsPropertiesARM>\n  {\n    using Type = PhysicalDeviceSchedulingControlsPropertiesARM;\n  };\n\n  struct PhysicalDeviceSeparateDepthStencilLayoutsFeatures\n  {\n    using NativeType = VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceSeparateDepthStencilLayoutsFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSeparateDepthStencilLayoutsFeatures( VULKAN_HPP_NAMESPACE::Bool32 separateDepthStencilLayouts_ = {},\n                                                                            void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , separateDepthStencilLayouts{ separateDepthStencilLayouts_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceSeparateDepthStencilLayoutsFeatures( PhysicalDeviceSeparateDepthStencilLayoutsFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceSeparateDepthStencilLayoutsFeatures( VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceSeparateDepthStencilLayoutsFeatures( *reinterpret_cast<PhysicalDeviceSeparateDepthStencilLayoutsFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceSeparateDepthStencilLayoutsFeatures &\n      operator=( PhysicalDeviceSeparateDepthStencilLayoutsFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceSeparateDepthStencilLayoutsFeatures & operator=( VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceSeparateDepthStencilLayoutsFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSeparateDepthStencilLayoutsFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSeparateDepthStencilLayoutsFeatures &\n      setSeparateDepthStencilLayouts( VULKAN_HPP_NAMESPACE::Bool32 separateDepthStencilLayouts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      separateDepthStencilLayouts = separateDepthStencilLayouts_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, separateDepthStencilLayouts );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceSeparateDepthStencilLayoutsFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceSeparateDepthStencilLayoutsFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( separateDepthStencilLayouts == rhs.separateDepthStencilLayouts );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceSeparateDepthStencilLayoutsFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                       = StructureType::ePhysicalDeviceSeparateDepthStencilLayoutsFeatures;\n    void *                              pNext                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        separateDepthStencilLayouts = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceSeparateDepthStencilLayoutsFeatures>\n  {\n    using Type = PhysicalDeviceSeparateDepthStencilLayoutsFeatures;\n  };\n\n  using PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR = PhysicalDeviceSeparateDepthStencilLayoutsFeatures;\n\n  struct PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderAtomicFloat16VectorFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 shaderFloat16VectorAtomics_ = {},\n                                                                            void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderFloat16VectorAtomics{ shaderFloat16VectorAtomics_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV( PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV( VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV( *reinterpret_cast<PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV &\n      operator=( PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV & operator=( VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV &\n      setShaderFloat16VectorAtomics( VULKAN_HPP_NAMESPACE::Bool32 shaderFloat16VectorAtomics_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderFloat16VectorAtomics = shaderFloat16VectorAtomics_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderAtomicFloat16VectorFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderFloat16VectorAtomics );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderFloat16VectorAtomics == rhs.shaderFloat16VectorAtomics );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                      = StructureType::ePhysicalDeviceShaderAtomicFloat16VectorFeaturesNV;\n    void *                              pNext                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderFloat16VectorAtomics = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderAtomicFloat16VectorFeaturesNV>\n  {\n    using Type = PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV;\n  };\n\n  struct PhysicalDeviceShaderAtomicFloat2FeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderAtomicFloat2FeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderAtomicFloat2FeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat16Atomics_      = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat16AtomicAdd_    = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat16AtomicMinMax_ = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat32AtomicMinMax_ = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat64AtomicMinMax_ = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat16Atomics_      = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat16AtomicAdd_    = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat16AtomicMinMax_ = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat32AtomicMinMax_ = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat64AtomicMinMax_ = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32 shaderImageFloat32AtomicMinMax_  = {},\n                                                                      VULKAN_HPP_NAMESPACE::Bool32 sparseImageFloat32AtomicMinMax_  = {},\n                                                                      void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderBufferFloat16Atomics{ shaderBufferFloat16Atomics_ }\n      , shaderBufferFloat16AtomicAdd{ shaderBufferFloat16AtomicAdd_ }\n      , shaderBufferFloat16AtomicMinMax{ shaderBufferFloat16AtomicMinMax_ }\n      , shaderBufferFloat32AtomicMinMax{ shaderBufferFloat32AtomicMinMax_ }\n      , shaderBufferFloat64AtomicMinMax{ shaderBufferFloat64AtomicMinMax_ }\n      , shaderSharedFloat16Atomics{ shaderSharedFloat16Atomics_ }\n      , shaderSharedFloat16AtomicAdd{ shaderSharedFloat16AtomicAdd_ }\n      , shaderSharedFloat16AtomicMinMax{ shaderSharedFloat16AtomicMinMax_ }\n      , shaderSharedFloat32AtomicMinMax{ shaderSharedFloat32AtomicMinMax_ }\n      , shaderSharedFloat64AtomicMinMax{ shaderSharedFloat64AtomicMinMax_ }\n      , shaderImageFloat32AtomicMinMax{ shaderImageFloat32AtomicMinMax_ }\n      , sparseImageFloat32AtomicMinMax{ sparseImageFloat32AtomicMinMax_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderAtomicFloat2FeaturesEXT( PhysicalDeviceShaderAtomicFloat2FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderAtomicFloat2FeaturesEXT( VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderAtomicFloat2FeaturesEXT( *reinterpret_cast<PhysicalDeviceShaderAtomicFloat2FeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderAtomicFloat2FeaturesEXT & operator=( PhysicalDeviceShaderAtomicFloat2FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderAtomicFloat2FeaturesEXT & operator=( VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicFloat2FeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloat2FeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloat2FeaturesEXT &\n      setShaderBufferFloat16Atomics( VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat16Atomics_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderBufferFloat16Atomics = shaderBufferFloat16Atomics_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloat2FeaturesEXT &\n      setShaderBufferFloat16AtomicAdd( VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat16AtomicAdd_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderBufferFloat16AtomicAdd = shaderBufferFloat16AtomicAdd_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloat2FeaturesEXT &\n      setShaderBufferFloat16AtomicMinMax( VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat16AtomicMinMax_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderBufferFloat16AtomicMinMax = shaderBufferFloat16AtomicMinMax_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloat2FeaturesEXT &\n      setShaderBufferFloat32AtomicMinMax( VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat32AtomicMinMax_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderBufferFloat32AtomicMinMax = shaderBufferFloat32AtomicMinMax_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloat2FeaturesEXT &\n      setShaderBufferFloat64AtomicMinMax( VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat64AtomicMinMax_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderBufferFloat64AtomicMinMax = shaderBufferFloat64AtomicMinMax_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloat2FeaturesEXT &\n      setShaderSharedFloat16Atomics( VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat16Atomics_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSharedFloat16Atomics = shaderSharedFloat16Atomics_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloat2FeaturesEXT &\n      setShaderSharedFloat16AtomicAdd( VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat16AtomicAdd_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSharedFloat16AtomicAdd = shaderSharedFloat16AtomicAdd_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloat2FeaturesEXT &\n      setShaderSharedFloat16AtomicMinMax( VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat16AtomicMinMax_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSharedFloat16AtomicMinMax = shaderSharedFloat16AtomicMinMax_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloat2FeaturesEXT &\n      setShaderSharedFloat32AtomicMinMax( VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat32AtomicMinMax_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSharedFloat32AtomicMinMax = shaderSharedFloat32AtomicMinMax_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloat2FeaturesEXT &\n      setShaderSharedFloat64AtomicMinMax( VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat64AtomicMinMax_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSharedFloat64AtomicMinMax = shaderSharedFloat64AtomicMinMax_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloat2FeaturesEXT &\n      setShaderImageFloat32AtomicMinMax( VULKAN_HPP_NAMESPACE::Bool32 shaderImageFloat32AtomicMinMax_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderImageFloat32AtomicMinMax = shaderImageFloat32AtomicMinMax_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloat2FeaturesEXT &\n      setSparseImageFloat32AtomicMinMax( VULKAN_HPP_NAMESPACE::Bool32 sparseImageFloat32AtomicMinMax_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sparseImageFloat32AtomicMinMax = sparseImageFloat32AtomicMinMax_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       shaderBufferFloat16Atomics,\n                       shaderBufferFloat16AtomicAdd,\n                       shaderBufferFloat16AtomicMinMax,\n                       shaderBufferFloat32AtomicMinMax,\n                       shaderBufferFloat64AtomicMinMax,\n                       shaderSharedFloat16Atomics,\n                       shaderSharedFloat16AtomicAdd,\n                       shaderSharedFloat16AtomicMinMax,\n                       shaderSharedFloat32AtomicMinMax,\n                       shaderSharedFloat64AtomicMinMax,\n                       shaderImageFloat32AtomicMinMax,\n                       sparseImageFloat32AtomicMinMax );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderAtomicFloat2FeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderAtomicFloat2FeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderBufferFloat16Atomics == rhs.shaderBufferFloat16Atomics ) &&\n             ( shaderBufferFloat16AtomicAdd == rhs.shaderBufferFloat16AtomicAdd ) &&\n             ( shaderBufferFloat16AtomicMinMax == rhs.shaderBufferFloat16AtomicMinMax ) &&\n             ( shaderBufferFloat32AtomicMinMax == rhs.shaderBufferFloat32AtomicMinMax ) &&\n             ( shaderBufferFloat64AtomicMinMax == rhs.shaderBufferFloat64AtomicMinMax ) && ( shaderSharedFloat16Atomics == rhs.shaderSharedFloat16Atomics ) &&\n             ( shaderSharedFloat16AtomicAdd == rhs.shaderSharedFloat16AtomicAdd ) &&\n             ( shaderSharedFloat16AtomicMinMax == rhs.shaderSharedFloat16AtomicMinMax ) &&\n             ( shaderSharedFloat32AtomicMinMax == rhs.shaderSharedFloat32AtomicMinMax ) &&\n             ( shaderSharedFloat64AtomicMinMax == rhs.shaderSharedFloat64AtomicMinMax ) &&\n             ( shaderImageFloat32AtomicMinMax == rhs.shaderImageFloat32AtomicMinMax ) &&\n             ( sparseImageFloat32AtomicMinMax == rhs.sparseImageFloat32AtomicMinMax );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderAtomicFloat2FeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                           = StructureType::ePhysicalDeviceShaderAtomicFloat2FeaturesEXT;\n    void *                              pNext                           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderBufferFloat16Atomics      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderBufferFloat16AtomicAdd    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderBufferFloat16AtomicMinMax = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderBufferFloat32AtomicMinMax = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderBufferFloat64AtomicMinMax = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSharedFloat16Atomics      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSharedFloat16AtomicAdd    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSharedFloat16AtomicMinMax = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSharedFloat32AtomicMinMax = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSharedFloat64AtomicMinMax = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderImageFloat32AtomicMinMax  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        sparseImageFloat32AtomicMinMax  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderAtomicFloat2FeaturesEXT>\n  {\n    using Type = PhysicalDeviceShaderAtomicFloat2FeaturesEXT;\n  };\n\n  struct PhysicalDeviceShaderAtomicFloatFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceShaderAtomicFloatFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderAtomicFloatFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderAtomicFloatFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat32Atomics_   = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat32AtomicAdd_ = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat64Atomics_   = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat64AtomicAdd_ = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat32Atomics_   = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat32AtomicAdd_ = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat64Atomics_   = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat64AtomicAdd_ = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 shaderImageFloat32Atomics_    = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 shaderImageFloat32AtomicAdd_  = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 sparseImageFloat32Atomics_    = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 sparseImageFloat32AtomicAdd_  = {},\n                                                                     void *                       pNext_                        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderBufferFloat32Atomics{ shaderBufferFloat32Atomics_ }\n      , shaderBufferFloat32AtomicAdd{ shaderBufferFloat32AtomicAdd_ }\n      , shaderBufferFloat64Atomics{ shaderBufferFloat64Atomics_ }\n      , shaderBufferFloat64AtomicAdd{ shaderBufferFloat64AtomicAdd_ }\n      , shaderSharedFloat32Atomics{ shaderSharedFloat32Atomics_ }\n      , shaderSharedFloat32AtomicAdd{ shaderSharedFloat32AtomicAdd_ }\n      , shaderSharedFloat64Atomics{ shaderSharedFloat64Atomics_ }\n      , shaderSharedFloat64AtomicAdd{ shaderSharedFloat64AtomicAdd_ }\n      , shaderImageFloat32Atomics{ shaderImageFloat32Atomics_ }\n      , shaderImageFloat32AtomicAdd{ shaderImageFloat32AtomicAdd_ }\n      , sparseImageFloat32Atomics{ sparseImageFloat32Atomics_ }\n      , sparseImageFloat32AtomicAdd{ sparseImageFloat32AtomicAdd_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderAtomicFloatFeaturesEXT( PhysicalDeviceShaderAtomicFloatFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderAtomicFloatFeaturesEXT( VkPhysicalDeviceShaderAtomicFloatFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderAtomicFloatFeaturesEXT( *reinterpret_cast<PhysicalDeviceShaderAtomicFloatFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderAtomicFloatFeaturesEXT & operator=( PhysicalDeviceShaderAtomicFloatFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderAtomicFloatFeaturesEXT & operator=( VkPhysicalDeviceShaderAtomicFloatFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicFloatFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloatFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloatFeaturesEXT &\n      setShaderBufferFloat32Atomics( VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat32Atomics_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderBufferFloat32Atomics = shaderBufferFloat32Atomics_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloatFeaturesEXT &\n      setShaderBufferFloat32AtomicAdd( VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat32AtomicAdd_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderBufferFloat32AtomicAdd = shaderBufferFloat32AtomicAdd_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloatFeaturesEXT &\n      setShaderBufferFloat64Atomics( VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat64Atomics_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderBufferFloat64Atomics = shaderBufferFloat64Atomics_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloatFeaturesEXT &\n      setShaderBufferFloat64AtomicAdd( VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat64AtomicAdd_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderBufferFloat64AtomicAdd = shaderBufferFloat64AtomicAdd_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloatFeaturesEXT &\n      setShaderSharedFloat32Atomics( VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat32Atomics_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSharedFloat32Atomics = shaderSharedFloat32Atomics_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloatFeaturesEXT &\n      setShaderSharedFloat32AtomicAdd( VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat32AtomicAdd_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSharedFloat32AtomicAdd = shaderSharedFloat32AtomicAdd_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloatFeaturesEXT &\n      setShaderSharedFloat64Atomics( VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat64Atomics_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSharedFloat64Atomics = shaderSharedFloat64Atomics_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloatFeaturesEXT &\n      setShaderSharedFloat64AtomicAdd( VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat64AtomicAdd_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSharedFloat64AtomicAdd = shaderSharedFloat64AtomicAdd_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloatFeaturesEXT &\n      setShaderImageFloat32Atomics( VULKAN_HPP_NAMESPACE::Bool32 shaderImageFloat32Atomics_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderImageFloat32Atomics = shaderImageFloat32Atomics_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloatFeaturesEXT &\n      setShaderImageFloat32AtomicAdd( VULKAN_HPP_NAMESPACE::Bool32 shaderImageFloat32AtomicAdd_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderImageFloat32AtomicAdd = shaderImageFloat32AtomicAdd_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloatFeaturesEXT &\n      setSparseImageFloat32Atomics( VULKAN_HPP_NAMESPACE::Bool32 sparseImageFloat32Atomics_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sparseImageFloat32Atomics = sparseImageFloat32Atomics_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloatFeaturesEXT &\n      setSparseImageFloat32AtomicAdd( VULKAN_HPP_NAMESPACE::Bool32 sparseImageFloat32AtomicAdd_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sparseImageFloat32AtomicAdd = sparseImageFloat32AtomicAdd_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderAtomicFloatFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderAtomicFloatFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       shaderBufferFloat32Atomics,\n                       shaderBufferFloat32AtomicAdd,\n                       shaderBufferFloat64Atomics,\n                       shaderBufferFloat64AtomicAdd,\n                       shaderSharedFloat32Atomics,\n                       shaderSharedFloat32AtomicAdd,\n                       shaderSharedFloat64Atomics,\n                       shaderSharedFloat64AtomicAdd,\n                       shaderImageFloat32Atomics,\n                       shaderImageFloat32AtomicAdd,\n                       sparseImageFloat32Atomics,\n                       sparseImageFloat32AtomicAdd );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderAtomicFloatFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderAtomicFloatFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderBufferFloat32Atomics == rhs.shaderBufferFloat32Atomics ) &&\n             ( shaderBufferFloat32AtomicAdd == rhs.shaderBufferFloat32AtomicAdd ) && ( shaderBufferFloat64Atomics == rhs.shaderBufferFloat64Atomics ) &&\n             ( shaderBufferFloat64AtomicAdd == rhs.shaderBufferFloat64AtomicAdd ) && ( shaderSharedFloat32Atomics == rhs.shaderSharedFloat32Atomics ) &&\n             ( shaderSharedFloat32AtomicAdd == rhs.shaderSharedFloat32AtomicAdd ) && ( shaderSharedFloat64Atomics == rhs.shaderSharedFloat64Atomics ) &&\n             ( shaderSharedFloat64AtomicAdd == rhs.shaderSharedFloat64AtomicAdd ) && ( shaderImageFloat32Atomics == rhs.shaderImageFloat32Atomics ) &&\n             ( shaderImageFloat32AtomicAdd == rhs.shaderImageFloat32AtomicAdd ) && ( sparseImageFloat32Atomics == rhs.sparseImageFloat32Atomics ) &&\n             ( sparseImageFloat32AtomicAdd == rhs.sparseImageFloat32AtomicAdd );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderAtomicFloatFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                        = StructureType::ePhysicalDeviceShaderAtomicFloatFeaturesEXT;\n    void *                              pNext                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderBufferFloat32Atomics   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderBufferFloat32AtomicAdd = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderBufferFloat64Atomics   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderBufferFloat64AtomicAdd = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSharedFloat32Atomics   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSharedFloat32AtomicAdd = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSharedFloat64Atomics   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSharedFloat64AtomicAdd = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderImageFloat32Atomics    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderImageFloat32AtomicAdd  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        sparseImageFloat32Atomics    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        sparseImageFloat32AtomicAdd  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderAtomicFloatFeaturesEXT>\n  {\n    using Type = PhysicalDeviceShaderAtomicFloatFeaturesEXT;\n  };\n\n  struct PhysicalDeviceShaderAtomicInt64Features\n  {\n    using NativeType = VkPhysicalDeviceShaderAtomicInt64Features;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderAtomicInt64Features;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderAtomicInt64Features( VULKAN_HPP_NAMESPACE::Bool32 shaderBufferInt64Atomics_ = {},\n                                                                  VULKAN_HPP_NAMESPACE::Bool32 shaderSharedInt64Atomics_ = {},\n                                                                  void *                       pNext_                    = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderBufferInt64Atomics{ shaderBufferInt64Atomics_ }\n      , shaderSharedInt64Atomics{ shaderSharedInt64Atomics_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderAtomicInt64Features( PhysicalDeviceShaderAtomicInt64Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderAtomicInt64Features( VkPhysicalDeviceShaderAtomicInt64Features const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderAtomicInt64Features( *reinterpret_cast<PhysicalDeviceShaderAtomicInt64Features const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderAtomicInt64Features & operator=( PhysicalDeviceShaderAtomicInt64Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderAtomicInt64Features & operator=( VkPhysicalDeviceShaderAtomicInt64Features const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicInt64Features const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicInt64Features & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicInt64Features &\n      setShaderBufferInt64Atomics( VULKAN_HPP_NAMESPACE::Bool32 shaderBufferInt64Atomics_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderBufferInt64Atomics = shaderBufferInt64Atomics_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicInt64Features &\n      setShaderSharedInt64Atomics( VULKAN_HPP_NAMESPACE::Bool32 shaderSharedInt64Atomics_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSharedInt64Atomics = shaderSharedInt64Atomics_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderAtomicInt64Features const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderAtomicInt64Features *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderAtomicInt64Features &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderAtomicInt64Features *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderBufferInt64Atomics, shaderSharedInt64Atomics );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderAtomicInt64Features const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderAtomicInt64Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderBufferInt64Atomics == rhs.shaderBufferInt64Atomics ) &&\n             ( shaderSharedInt64Atomics == rhs.shaderSharedInt64Atomics );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderAtomicInt64Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                    = StructureType::ePhysicalDeviceShaderAtomicInt64Features;\n    void *                              pNext                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderBufferInt64Atomics = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSharedInt64Atomics = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderAtomicInt64Features>\n  {\n    using Type = PhysicalDeviceShaderAtomicInt64Features;\n  };\n\n  using PhysicalDeviceShaderAtomicInt64FeaturesKHR = PhysicalDeviceShaderAtomicInt64Features;\n\n  struct PhysicalDeviceShaderClockFeaturesKHR\n  {\n    using NativeType = VkPhysicalDeviceShaderClockFeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderClockFeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderClockFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 shaderSubgroupClock_ = {},\n                                                               VULKAN_HPP_NAMESPACE::Bool32 shaderDeviceClock_   = {},\n                                                               void *                       pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderSubgroupClock{ shaderSubgroupClock_ }\n      , shaderDeviceClock{ shaderDeviceClock_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderClockFeaturesKHR( PhysicalDeviceShaderClockFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderClockFeaturesKHR( VkPhysicalDeviceShaderClockFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderClockFeaturesKHR( *reinterpret_cast<PhysicalDeviceShaderClockFeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderClockFeaturesKHR & operator=( PhysicalDeviceShaderClockFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderClockFeaturesKHR & operator=( VkPhysicalDeviceShaderClockFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderClockFeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderClockFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderClockFeaturesKHR &\n      setShaderSubgroupClock( VULKAN_HPP_NAMESPACE::Bool32 shaderSubgroupClock_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSubgroupClock = shaderSubgroupClock_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderClockFeaturesKHR & setShaderDeviceClock( VULKAN_HPP_NAMESPACE::Bool32 shaderDeviceClock_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderDeviceClock = shaderDeviceClock_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderClockFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderClockFeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderClockFeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderClockFeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderSubgroupClock, shaderDeviceClock );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderClockFeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderClockFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderSubgroupClock == rhs.shaderSubgroupClock ) &&\n             ( shaderDeviceClock == rhs.shaderDeviceClock );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderClockFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType               = StructureType::ePhysicalDeviceShaderClockFeaturesKHR;\n    void *                              pNext               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSubgroupClock = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderDeviceClock   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderClockFeaturesKHR>\n  {\n    using Type = PhysicalDeviceShaderClockFeaturesKHR;\n  };\n\n  struct PhysicalDeviceShaderCoreBuiltinsFeaturesARM\n  {\n    using NativeType = VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderCoreBuiltinsFeaturesARM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderCoreBuiltinsFeaturesARM( VULKAN_HPP_NAMESPACE::Bool32 shaderCoreBuiltins_ = {},\n                                                                      void *                       pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderCoreBuiltins{ shaderCoreBuiltins_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderCoreBuiltinsFeaturesARM( PhysicalDeviceShaderCoreBuiltinsFeaturesARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderCoreBuiltinsFeaturesARM( VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderCoreBuiltinsFeaturesARM( *reinterpret_cast<PhysicalDeviceShaderCoreBuiltinsFeaturesARM const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderCoreBuiltinsFeaturesARM & operator=( PhysicalDeviceShaderCoreBuiltinsFeaturesARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderCoreBuiltinsFeaturesARM & operator=( VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCoreBuiltinsFeaturesARM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderCoreBuiltinsFeaturesARM & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderCoreBuiltinsFeaturesARM &\n      setShaderCoreBuiltins( VULKAN_HPP_NAMESPACE::Bool32 shaderCoreBuiltins_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderCoreBuiltins = shaderCoreBuiltins_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderCoreBuiltinsFeaturesARM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderCoreBuiltins );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderCoreBuiltinsFeaturesARM const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderCoreBuiltinsFeaturesARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderCoreBuiltins == rhs.shaderCoreBuiltins );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderCoreBuiltinsFeaturesARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType              = StructureType::ePhysicalDeviceShaderCoreBuiltinsFeaturesARM;\n    void *                              pNext              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderCoreBuiltins = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderCoreBuiltinsFeaturesARM>\n  {\n    using Type = PhysicalDeviceShaderCoreBuiltinsFeaturesARM;\n  };\n\n  struct PhysicalDeviceShaderCoreBuiltinsPropertiesARM\n  {\n    using NativeType = VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderCoreBuiltinsPropertiesARM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderCoreBuiltinsPropertiesARM( uint64_t shaderCoreMask_     = {},\n                                                                        uint32_t shaderCoreCount_    = {},\n                                                                        uint32_t shaderWarpsPerCore_ = {},\n                                                                        void *   pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderCoreMask{ shaderCoreMask_ }\n      , shaderCoreCount{ shaderCoreCount_ }\n      , shaderWarpsPerCore{ shaderWarpsPerCore_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceShaderCoreBuiltinsPropertiesARM( PhysicalDeviceShaderCoreBuiltinsPropertiesARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderCoreBuiltinsPropertiesARM( VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderCoreBuiltinsPropertiesARM( *reinterpret_cast<PhysicalDeviceShaderCoreBuiltinsPropertiesARM const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderCoreBuiltinsPropertiesARM & operator=( PhysicalDeviceShaderCoreBuiltinsPropertiesARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderCoreBuiltinsPropertiesARM & operator=( VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCoreBuiltinsPropertiesARM const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderCoreBuiltinsPropertiesARM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint64_t const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderCoreMask, shaderCoreCount, shaderWarpsPerCore );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderCoreBuiltinsPropertiesARM const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderCoreBuiltinsPropertiesARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderCoreMask == rhs.shaderCoreMask ) && ( shaderCoreCount == rhs.shaderCoreCount ) &&\n             ( shaderWarpsPerCore == rhs.shaderWarpsPerCore );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderCoreBuiltinsPropertiesARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType              = StructureType::ePhysicalDeviceShaderCoreBuiltinsPropertiesARM;\n    void *                              pNext              = {};\n    uint64_t                            shaderCoreMask     = {};\n    uint32_t                            shaderCoreCount    = {};\n    uint32_t                            shaderWarpsPerCore = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderCoreBuiltinsPropertiesARM>\n  {\n    using Type = PhysicalDeviceShaderCoreBuiltinsPropertiesARM;\n  };\n\n  struct PhysicalDeviceShaderCoreProperties2AMD\n  {\n    using NativeType = VkPhysicalDeviceShaderCoreProperties2AMD;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderCoreProperties2AMD;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderCoreProperties2AMD( VULKAN_HPP_NAMESPACE::ShaderCorePropertiesFlagsAMD shaderCoreFeatures_     = {},\n                                                                 uint32_t                                           activeComputeUnitCount_ = {},\n                                                                 void *                                             pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderCoreFeatures{ shaderCoreFeatures_ }\n      , activeComputeUnitCount{ activeComputeUnitCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderCoreProperties2AMD( PhysicalDeviceShaderCoreProperties2AMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderCoreProperties2AMD( VkPhysicalDeviceShaderCoreProperties2AMD const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderCoreProperties2AMD( *reinterpret_cast<PhysicalDeviceShaderCoreProperties2AMD const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderCoreProperties2AMD & operator=( PhysicalDeviceShaderCoreProperties2AMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderCoreProperties2AMD & operator=( VkPhysicalDeviceShaderCoreProperties2AMD const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCoreProperties2AMD const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceShaderCoreProperties2AMD const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderCoreProperties2AMD *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderCoreProperties2AMD &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderCoreProperties2AMD *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::ShaderCorePropertiesFlagsAMD const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderCoreFeatures, activeComputeUnitCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderCoreProperties2AMD const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderCoreProperties2AMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderCoreFeatures == rhs.shaderCoreFeatures ) &&\n             ( activeComputeUnitCount == rhs.activeComputeUnitCount );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderCoreProperties2AMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                sType                  = StructureType::ePhysicalDeviceShaderCoreProperties2AMD;\n    void *                                             pNext                  = {};\n    VULKAN_HPP_NAMESPACE::ShaderCorePropertiesFlagsAMD shaderCoreFeatures     = {};\n    uint32_t                                           activeComputeUnitCount = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderCoreProperties2AMD>\n  {\n    using Type = PhysicalDeviceShaderCoreProperties2AMD;\n  };\n\n  struct PhysicalDeviceShaderCorePropertiesAMD\n  {\n    using NativeType = VkPhysicalDeviceShaderCorePropertiesAMD;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderCorePropertiesAMD;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderCorePropertiesAMD( uint32_t shaderEngineCount_          = {},\n                                                                uint32_t shaderArraysPerEngineCount_ = {},\n                                                                uint32_t computeUnitsPerShaderArray_ = {},\n                                                                uint32_t simdPerComputeUnit_         = {},\n                                                                uint32_t wavefrontsPerSimd_          = {},\n                                                                uint32_t wavefrontSize_              = {},\n                                                                uint32_t sgprsPerSimd_               = {},\n                                                                uint32_t minSgprAllocation_          = {},\n                                                                uint32_t maxSgprAllocation_          = {},\n                                                                uint32_t sgprAllocationGranularity_  = {},\n                                                                uint32_t vgprsPerSimd_               = {},\n                                                                uint32_t minVgprAllocation_          = {},\n                                                                uint32_t maxVgprAllocation_          = {},\n                                                                uint32_t vgprAllocationGranularity_  = {},\n                                                                void *   pNext_                      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderEngineCount{ shaderEngineCount_ }\n      , shaderArraysPerEngineCount{ shaderArraysPerEngineCount_ }\n      , computeUnitsPerShaderArray{ computeUnitsPerShaderArray_ }\n      , simdPerComputeUnit{ simdPerComputeUnit_ }\n      , wavefrontsPerSimd{ wavefrontsPerSimd_ }\n      , wavefrontSize{ wavefrontSize_ }\n      , sgprsPerSimd{ sgprsPerSimd_ }\n      , minSgprAllocation{ minSgprAllocation_ }\n      , maxSgprAllocation{ maxSgprAllocation_ }\n      , sgprAllocationGranularity{ sgprAllocationGranularity_ }\n      , vgprsPerSimd{ vgprsPerSimd_ }\n      , minVgprAllocation{ minVgprAllocation_ }\n      , maxVgprAllocation{ maxVgprAllocation_ }\n      , vgprAllocationGranularity{ vgprAllocationGranularity_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderCorePropertiesAMD( PhysicalDeviceShaderCorePropertiesAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderCorePropertiesAMD( VkPhysicalDeviceShaderCorePropertiesAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderCorePropertiesAMD( *reinterpret_cast<PhysicalDeviceShaderCorePropertiesAMD const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderCorePropertiesAMD & operator=( PhysicalDeviceShaderCorePropertiesAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderCorePropertiesAMD & operator=( VkPhysicalDeviceShaderCorePropertiesAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCorePropertiesAMD const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceShaderCorePropertiesAMD const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderCorePropertiesAMD *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderCorePropertiesAMD &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderCorePropertiesAMD *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       shaderEngineCount,\n                       shaderArraysPerEngineCount,\n                       computeUnitsPerShaderArray,\n                       simdPerComputeUnit,\n                       wavefrontsPerSimd,\n                       wavefrontSize,\n                       sgprsPerSimd,\n                       minSgprAllocation,\n                       maxSgprAllocation,\n                       sgprAllocationGranularity,\n                       vgprsPerSimd,\n                       minVgprAllocation,\n                       maxVgprAllocation,\n                       vgprAllocationGranularity );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderCorePropertiesAMD const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderCorePropertiesAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderEngineCount == rhs.shaderEngineCount ) &&\n             ( shaderArraysPerEngineCount == rhs.shaderArraysPerEngineCount ) && ( computeUnitsPerShaderArray == rhs.computeUnitsPerShaderArray ) &&\n             ( simdPerComputeUnit == rhs.simdPerComputeUnit ) && ( wavefrontsPerSimd == rhs.wavefrontsPerSimd ) && ( wavefrontSize == rhs.wavefrontSize ) &&\n             ( sgprsPerSimd == rhs.sgprsPerSimd ) && ( minSgprAllocation == rhs.minSgprAllocation ) && ( maxSgprAllocation == rhs.maxSgprAllocation ) &&\n             ( sgprAllocationGranularity == rhs.sgprAllocationGranularity ) && ( vgprsPerSimd == rhs.vgprsPerSimd ) &&\n             ( minVgprAllocation == rhs.minVgprAllocation ) && ( maxVgprAllocation == rhs.maxVgprAllocation ) &&\n             ( vgprAllocationGranularity == rhs.vgprAllocationGranularity );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderCorePropertiesAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                      = StructureType::ePhysicalDeviceShaderCorePropertiesAMD;\n    void *                              pNext                      = {};\n    uint32_t                            shaderEngineCount          = {};\n    uint32_t                            shaderArraysPerEngineCount = {};\n    uint32_t                            computeUnitsPerShaderArray = {};\n    uint32_t                            simdPerComputeUnit         = {};\n    uint32_t                            wavefrontsPerSimd          = {};\n    uint32_t                            wavefrontSize              = {};\n    uint32_t                            sgprsPerSimd               = {};\n    uint32_t                            minSgprAllocation          = {};\n    uint32_t                            maxSgprAllocation          = {};\n    uint32_t                            sgprAllocationGranularity  = {};\n    uint32_t                            vgprsPerSimd               = {};\n    uint32_t                            minVgprAllocation          = {};\n    uint32_t                            maxVgprAllocation          = {};\n    uint32_t                            vgprAllocationGranularity  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderCorePropertiesAMD>\n  {\n    using Type = PhysicalDeviceShaderCorePropertiesAMD;\n  };\n\n  struct PhysicalDeviceShaderCorePropertiesARM\n  {\n    using NativeType = VkPhysicalDeviceShaderCorePropertiesARM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderCorePropertiesARM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderCorePropertiesARM( uint32_t pixelRate_ = {},\n                                                                uint32_t texelRate_ = {},\n                                                                uint32_t fmaRate_   = {},\n                                                                void *   pNext_     = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pixelRate{ pixelRate_ }\n      , texelRate{ texelRate_ }\n      , fmaRate{ fmaRate_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderCorePropertiesARM( PhysicalDeviceShaderCorePropertiesARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderCorePropertiesARM( VkPhysicalDeviceShaderCorePropertiesARM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderCorePropertiesARM( *reinterpret_cast<PhysicalDeviceShaderCorePropertiesARM const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderCorePropertiesARM & operator=( PhysicalDeviceShaderCorePropertiesARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderCorePropertiesARM & operator=( VkPhysicalDeviceShaderCorePropertiesARM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCorePropertiesARM const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceShaderCorePropertiesARM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderCorePropertiesARM *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderCorePropertiesARM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderCorePropertiesARM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pixelRate, texelRate, fmaRate );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderCorePropertiesARM const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderCorePropertiesARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pixelRate == rhs.pixelRate ) && ( texelRate == rhs.texelRate ) && ( fmaRate == rhs.fmaRate );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderCorePropertiesARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType     = StructureType::ePhysicalDeviceShaderCorePropertiesARM;\n    void *                              pNext     = {};\n    uint32_t                            pixelRate = {};\n    uint32_t                            texelRate = {};\n    uint32_t                            fmaRate   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderCorePropertiesARM>\n  {\n    using Type = PhysicalDeviceShaderCorePropertiesARM;\n  };\n\n  struct PhysicalDeviceShaderDemoteToHelperInvocationFeatures\n  {\n    using NativeType = VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderDemoteToHelperInvocationFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderDemoteToHelperInvocationFeatures( VULKAN_HPP_NAMESPACE::Bool32 shaderDemoteToHelperInvocation_ = {},\n                                                                               void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderDemoteToHelperInvocation{ shaderDemoteToHelperInvocation_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceShaderDemoteToHelperInvocationFeatures( PhysicalDeviceShaderDemoteToHelperInvocationFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderDemoteToHelperInvocationFeatures( VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderDemoteToHelperInvocationFeatures( *reinterpret_cast<PhysicalDeviceShaderDemoteToHelperInvocationFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderDemoteToHelperInvocationFeatures &\n      operator=( PhysicalDeviceShaderDemoteToHelperInvocationFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderDemoteToHelperInvocationFeatures & operator=( VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderDemoteToHelperInvocationFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderDemoteToHelperInvocationFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderDemoteToHelperInvocationFeatures &\n      setShaderDemoteToHelperInvocation( VULKAN_HPP_NAMESPACE::Bool32 shaderDemoteToHelperInvocation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderDemoteToHelperInvocation = shaderDemoteToHelperInvocation_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderDemoteToHelperInvocation );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderDemoteToHelperInvocationFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderDemoteToHelperInvocationFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderDemoteToHelperInvocation == rhs.shaderDemoteToHelperInvocation );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderDemoteToHelperInvocationFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                          = StructureType::ePhysicalDeviceShaderDemoteToHelperInvocationFeatures;\n    void *                              pNext                          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderDemoteToHelperInvocation = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderDemoteToHelperInvocationFeatures>\n  {\n    using Type = PhysicalDeviceShaderDemoteToHelperInvocationFeatures;\n  };\n\n  using PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT = PhysicalDeviceShaderDemoteToHelperInvocationFeatures;\n\n  struct PhysicalDeviceShaderDrawParametersFeatures\n  {\n    using NativeType = VkPhysicalDeviceShaderDrawParametersFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderDrawParametersFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderDrawParametersFeatures( VULKAN_HPP_NAMESPACE::Bool32 shaderDrawParameters_ = {},\n                                                                     void *                       pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderDrawParameters{ shaderDrawParameters_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderDrawParametersFeatures( PhysicalDeviceShaderDrawParametersFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderDrawParametersFeatures( VkPhysicalDeviceShaderDrawParametersFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderDrawParametersFeatures( *reinterpret_cast<PhysicalDeviceShaderDrawParametersFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderDrawParametersFeatures & operator=( PhysicalDeviceShaderDrawParametersFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderDrawParametersFeatures & operator=( VkPhysicalDeviceShaderDrawParametersFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderDrawParametersFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderDrawParametersFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderDrawParametersFeatures &\n      setShaderDrawParameters( VULKAN_HPP_NAMESPACE::Bool32 shaderDrawParameters_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderDrawParameters = shaderDrawParameters_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderDrawParametersFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderDrawParametersFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderDrawParametersFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderDrawParametersFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderDrawParameters );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderDrawParametersFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderDrawParametersFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderDrawParameters == rhs.shaderDrawParameters );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderDrawParametersFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                = StructureType::ePhysicalDeviceShaderDrawParametersFeatures;\n    void *                              pNext                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderDrawParameters = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderDrawParametersFeatures>\n  {\n    using Type = PhysicalDeviceShaderDrawParametersFeatures;\n  };\n\n  using PhysicalDeviceShaderDrawParameterFeatures = PhysicalDeviceShaderDrawParametersFeatures;\n\n  struct PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD\n  {\n    using NativeType = VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD( VULKAN_HPP_NAMESPACE::Bool32 shaderEarlyAndLateFragmentTests_ = {},\n                                                                                   void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderEarlyAndLateFragmentTests{ shaderEarlyAndLateFragmentTests_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD( PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD const & rhs )\n      VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD( VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD( *reinterpret_cast<PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD &\n      operator=( PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD &\n      operator=( VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD &\n      setShaderEarlyAndLateFragmentTests( VULKAN_HPP_NAMESPACE::Bool32 shaderEarlyAndLateFragmentTests_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderEarlyAndLateFragmentTests = shaderEarlyAndLateFragmentTests_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderEarlyAndLateFragmentTests );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderEarlyAndLateFragmentTests == rhs.shaderEarlyAndLateFragmentTests );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                           = StructureType::ePhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD;\n    void *                              pNext                           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderEarlyAndLateFragmentTests = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD>\n  {\n    using Type = PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD;\n  };\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  struct PhysicalDeviceShaderEnqueueFeaturesAMDX\n  {\n    using NativeType = VkPhysicalDeviceShaderEnqueueFeaturesAMDX;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderEnqueueFeaturesAMDX;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderEnqueueFeaturesAMDX( VULKAN_HPP_NAMESPACE::Bool32 shaderEnqueue_     = {},\n                                                                  VULKAN_HPP_NAMESPACE::Bool32 shaderMeshEnqueue_ = {},\n                                                                  void *                       pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderEnqueue{ shaderEnqueue_ }\n      , shaderMeshEnqueue{ shaderMeshEnqueue_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderEnqueueFeaturesAMDX( PhysicalDeviceShaderEnqueueFeaturesAMDX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderEnqueueFeaturesAMDX( VkPhysicalDeviceShaderEnqueueFeaturesAMDX const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderEnqueueFeaturesAMDX( *reinterpret_cast<PhysicalDeviceShaderEnqueueFeaturesAMDX const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderEnqueueFeaturesAMDX & operator=( PhysicalDeviceShaderEnqueueFeaturesAMDX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderEnqueueFeaturesAMDX & operator=( VkPhysicalDeviceShaderEnqueueFeaturesAMDX const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderEnqueueFeaturesAMDX const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderEnqueueFeaturesAMDX & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderEnqueueFeaturesAMDX & setShaderEnqueue( VULKAN_HPP_NAMESPACE::Bool32 shaderEnqueue_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderEnqueue = shaderEnqueue_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderEnqueueFeaturesAMDX &\n      setShaderMeshEnqueue( VULKAN_HPP_NAMESPACE::Bool32 shaderMeshEnqueue_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderMeshEnqueue = shaderMeshEnqueue_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderEnqueueFeaturesAMDX const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderEnqueueFeaturesAMDX *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderEnqueueFeaturesAMDX &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderEnqueueFeaturesAMDX *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderEnqueue, shaderMeshEnqueue );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderEnqueueFeaturesAMDX const & ) const = default;\n#  else\n    bool operator==( PhysicalDeviceShaderEnqueueFeaturesAMDX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderEnqueue == rhs.shaderEnqueue ) && ( shaderMeshEnqueue == rhs.shaderMeshEnqueue );\n#    endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderEnqueueFeaturesAMDX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType             = StructureType::ePhysicalDeviceShaderEnqueueFeaturesAMDX;\n    void *                              pNext             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderEnqueue     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderMeshEnqueue = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderEnqueueFeaturesAMDX>\n  {\n    using Type = PhysicalDeviceShaderEnqueueFeaturesAMDX;\n  };\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  struct PhysicalDeviceShaderEnqueuePropertiesAMDX\n  {\n    using NativeType = VkPhysicalDeviceShaderEnqueuePropertiesAMDX;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderEnqueuePropertiesAMDX;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderEnqueuePropertiesAMDX( uint32_t                        maxExecutionGraphDepth_                 = {},\n                                                                       uint32_t                        maxExecutionGraphShaderOutputNodes_     = {},\n                                                                       uint32_t                        maxExecutionGraphShaderPayloadSize_     = {},\n                                                                       uint32_t                        maxExecutionGraphShaderPayloadCount_    = {},\n                                                                       uint32_t                        executionGraphDispatchAddressAlignment_ = {},\n                                                                       std::array<uint32_t, 3> const & maxExecutionGraphWorkgroupCount_        = {},\n                                                                       uint32_t                        maxExecutionGraphWorkgroups_            = {},\n                                                                       void *                          pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxExecutionGraphDepth{ maxExecutionGraphDepth_ }\n      , maxExecutionGraphShaderOutputNodes{ maxExecutionGraphShaderOutputNodes_ }\n      , maxExecutionGraphShaderPayloadSize{ maxExecutionGraphShaderPayloadSize_ }\n      , maxExecutionGraphShaderPayloadCount{ maxExecutionGraphShaderPayloadCount_ }\n      , executionGraphDispatchAddressAlignment{ executionGraphDispatchAddressAlignment_ }\n      , maxExecutionGraphWorkgroupCount{ maxExecutionGraphWorkgroupCount_ }\n      , maxExecutionGraphWorkgroups{ maxExecutionGraphWorkgroups_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderEnqueuePropertiesAMDX( PhysicalDeviceShaderEnqueuePropertiesAMDX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderEnqueuePropertiesAMDX( VkPhysicalDeviceShaderEnqueuePropertiesAMDX const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderEnqueuePropertiesAMDX( *reinterpret_cast<PhysicalDeviceShaderEnqueuePropertiesAMDX const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderEnqueuePropertiesAMDX & operator=( PhysicalDeviceShaderEnqueuePropertiesAMDX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderEnqueuePropertiesAMDX & operator=( VkPhysicalDeviceShaderEnqueuePropertiesAMDX const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderEnqueuePropertiesAMDX const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderEnqueuePropertiesAMDX & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderEnqueuePropertiesAMDX & setMaxExecutionGraphDepth( uint32_t maxExecutionGraphDepth_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxExecutionGraphDepth = maxExecutionGraphDepth_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderEnqueuePropertiesAMDX &\n      setMaxExecutionGraphShaderOutputNodes( uint32_t maxExecutionGraphShaderOutputNodes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxExecutionGraphShaderOutputNodes = maxExecutionGraphShaderOutputNodes_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderEnqueuePropertiesAMDX &\n      setMaxExecutionGraphShaderPayloadSize( uint32_t maxExecutionGraphShaderPayloadSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxExecutionGraphShaderPayloadSize = maxExecutionGraphShaderPayloadSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderEnqueuePropertiesAMDX &\n      setMaxExecutionGraphShaderPayloadCount( uint32_t maxExecutionGraphShaderPayloadCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxExecutionGraphShaderPayloadCount = maxExecutionGraphShaderPayloadCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderEnqueuePropertiesAMDX &\n      setExecutionGraphDispatchAddressAlignment( uint32_t executionGraphDispatchAddressAlignment_ ) VULKAN_HPP_NOEXCEPT\n    {\n      executionGraphDispatchAddressAlignment = executionGraphDispatchAddressAlignment_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderEnqueuePropertiesAMDX &\n      setMaxExecutionGraphWorkgroupCount( std::array<uint32_t, 3> maxExecutionGraphWorkgroupCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxExecutionGraphWorkgroupCount = maxExecutionGraphWorkgroupCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderEnqueuePropertiesAMDX &\n      setMaxExecutionGraphWorkgroups( uint32_t maxExecutionGraphWorkgroups_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxExecutionGraphWorkgroups = maxExecutionGraphWorkgroups_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderEnqueuePropertiesAMDX const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderEnqueuePropertiesAMDX *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderEnqueuePropertiesAMDX &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderEnqueuePropertiesAMDX *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> const &,\n               uint32_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       maxExecutionGraphDepth,\n                       maxExecutionGraphShaderOutputNodes,\n                       maxExecutionGraphShaderPayloadSize,\n                       maxExecutionGraphShaderPayloadCount,\n                       executionGraphDispatchAddressAlignment,\n                       maxExecutionGraphWorkgroupCount,\n                       maxExecutionGraphWorkgroups );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderEnqueuePropertiesAMDX const & ) const = default;\n#  else\n    bool operator==( PhysicalDeviceShaderEnqueuePropertiesAMDX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxExecutionGraphDepth == rhs.maxExecutionGraphDepth ) &&\n             ( maxExecutionGraphShaderOutputNodes == rhs.maxExecutionGraphShaderOutputNodes ) &&\n             ( maxExecutionGraphShaderPayloadSize == rhs.maxExecutionGraphShaderPayloadSize ) &&\n             ( maxExecutionGraphShaderPayloadCount == rhs.maxExecutionGraphShaderPayloadCount ) &&\n             ( executionGraphDispatchAddressAlignment == rhs.executionGraphDispatchAddressAlignment ) &&\n             ( maxExecutionGraphWorkgroupCount == rhs.maxExecutionGraphWorkgroupCount ) && ( maxExecutionGraphWorkgroups == rhs.maxExecutionGraphWorkgroups );\n#    endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderEnqueuePropertiesAMDX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType                                  = StructureType::ePhysicalDeviceShaderEnqueuePropertiesAMDX;\n    void *                                            pNext                                  = {};\n    uint32_t                                          maxExecutionGraphDepth                 = {};\n    uint32_t                                          maxExecutionGraphShaderOutputNodes     = {};\n    uint32_t                                          maxExecutionGraphShaderPayloadSize     = {};\n    uint32_t                                          maxExecutionGraphShaderPayloadCount    = {};\n    uint32_t                                          executionGraphDispatchAddressAlignment = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> maxExecutionGraphWorkgroupCount        = {};\n    uint32_t                                          maxExecutionGraphWorkgroups            = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderEnqueuePropertiesAMDX>\n  {\n    using Type = PhysicalDeviceShaderEnqueuePropertiesAMDX;\n  };\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  struct PhysicalDeviceShaderExpectAssumeFeatures\n  {\n    using NativeType = VkPhysicalDeviceShaderExpectAssumeFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderExpectAssumeFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderExpectAssumeFeatures( VULKAN_HPP_NAMESPACE::Bool32 shaderExpectAssume_ = {},\n                                                                   void *                       pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderExpectAssume{ shaderExpectAssume_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderExpectAssumeFeatures( PhysicalDeviceShaderExpectAssumeFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderExpectAssumeFeatures( VkPhysicalDeviceShaderExpectAssumeFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderExpectAssumeFeatures( *reinterpret_cast<PhysicalDeviceShaderExpectAssumeFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderExpectAssumeFeatures & operator=( PhysicalDeviceShaderExpectAssumeFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderExpectAssumeFeatures & operator=( VkPhysicalDeviceShaderExpectAssumeFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderExpectAssumeFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderExpectAssumeFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderExpectAssumeFeatures &\n      setShaderExpectAssume( VULKAN_HPP_NAMESPACE::Bool32 shaderExpectAssume_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderExpectAssume = shaderExpectAssume_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderExpectAssumeFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderExpectAssumeFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderExpectAssumeFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderExpectAssumeFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderExpectAssume );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderExpectAssumeFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderExpectAssumeFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderExpectAssume == rhs.shaderExpectAssume );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderExpectAssumeFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType              = StructureType::ePhysicalDeviceShaderExpectAssumeFeatures;\n    void *                              pNext              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderExpectAssume = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderExpectAssumeFeatures>\n  {\n    using Type = PhysicalDeviceShaderExpectAssumeFeatures;\n  };\n\n  using PhysicalDeviceShaderExpectAssumeFeaturesKHR = PhysicalDeviceShaderExpectAssumeFeatures;\n\n  struct PhysicalDeviceShaderFloat16Int8Features\n  {\n    using NativeType = VkPhysicalDeviceShaderFloat16Int8Features;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderFloat16Int8Features;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderFloat16Int8Features( VULKAN_HPP_NAMESPACE::Bool32 shaderFloat16_ = {},\n                                                                  VULKAN_HPP_NAMESPACE::Bool32 shaderInt8_    = {},\n                                                                  void *                       pNext_         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderFloat16{ shaderFloat16_ }\n      , shaderInt8{ shaderInt8_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderFloat16Int8Features( PhysicalDeviceShaderFloat16Int8Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderFloat16Int8Features( VkPhysicalDeviceShaderFloat16Int8Features const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderFloat16Int8Features( *reinterpret_cast<PhysicalDeviceShaderFloat16Int8Features const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderFloat16Int8Features & operator=( PhysicalDeviceShaderFloat16Int8Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderFloat16Int8Features & operator=( VkPhysicalDeviceShaderFloat16Int8Features const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderFloat16Int8Features const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderFloat16Int8Features & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderFloat16Int8Features & setShaderFloat16( VULKAN_HPP_NAMESPACE::Bool32 shaderFloat16_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderFloat16 = shaderFloat16_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderFloat16Int8Features & setShaderInt8( VULKAN_HPP_NAMESPACE::Bool32 shaderInt8_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderInt8 = shaderInt8_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderFloat16Int8Features const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderFloat16Int8Features *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderFloat16Int8Features &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderFloat16Int8Features *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderFloat16, shaderInt8 );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderFloat16Int8Features const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderFloat16Int8Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderFloat16 == rhs.shaderFloat16 ) && ( shaderInt8 == rhs.shaderInt8 );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderFloat16Int8Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType         = StructureType::ePhysicalDeviceShaderFloat16Int8Features;\n    void *                              pNext         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderFloat16 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderInt8    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderFloat16Int8Features>\n  {\n    using Type = PhysicalDeviceShaderFloat16Int8Features;\n  };\n\n  using PhysicalDeviceFloat16Int8FeaturesKHR       = PhysicalDeviceShaderFloat16Int8Features;\n  using PhysicalDeviceShaderFloat16Int8FeaturesKHR = PhysicalDeviceShaderFloat16Int8Features;\n\n  struct PhysicalDeviceShaderFloatControls2Features\n  {\n    using NativeType = VkPhysicalDeviceShaderFloatControls2Features;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderFloatControls2Features;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderFloatControls2Features( VULKAN_HPP_NAMESPACE::Bool32 shaderFloatControls2_ = {},\n                                                                     void *                       pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderFloatControls2{ shaderFloatControls2_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderFloatControls2Features( PhysicalDeviceShaderFloatControls2Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderFloatControls2Features( VkPhysicalDeviceShaderFloatControls2Features const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderFloatControls2Features( *reinterpret_cast<PhysicalDeviceShaderFloatControls2Features const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderFloatControls2Features & operator=( PhysicalDeviceShaderFloatControls2Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderFloatControls2Features & operator=( VkPhysicalDeviceShaderFloatControls2Features const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderFloatControls2Features const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderFloatControls2Features & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderFloatControls2Features &\n      setShaderFloatControls2( VULKAN_HPP_NAMESPACE::Bool32 shaderFloatControls2_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderFloatControls2 = shaderFloatControls2_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderFloatControls2Features const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderFloatControls2Features *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderFloatControls2Features &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderFloatControls2Features *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderFloatControls2 );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderFloatControls2Features const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderFloatControls2Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderFloatControls2 == rhs.shaderFloatControls2 );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderFloatControls2Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                = StructureType::ePhysicalDeviceShaderFloatControls2Features;\n    void *                              pNext                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderFloatControls2 = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderFloatControls2Features>\n  {\n    using Type = PhysicalDeviceShaderFloatControls2Features;\n  };\n\n  using PhysicalDeviceShaderFloatControls2FeaturesKHR = PhysicalDeviceShaderFloatControls2Features;\n\n  struct PhysicalDeviceShaderImageAtomicInt64FeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderImageAtomicInt64FeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderImageAtomicInt64FeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 shaderImageInt64Atomics_ = {},\n                                                                          VULKAN_HPP_NAMESPACE::Bool32 sparseImageInt64Atomics_ = {},\n                                                                          void *                       pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderImageInt64Atomics{ shaderImageInt64Atomics_ }\n      , sparseImageInt64Atomics{ sparseImageInt64Atomics_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceShaderImageAtomicInt64FeaturesEXT( PhysicalDeviceShaderImageAtomicInt64FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderImageAtomicInt64FeaturesEXT( VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderImageAtomicInt64FeaturesEXT( *reinterpret_cast<PhysicalDeviceShaderImageAtomicInt64FeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderImageAtomicInt64FeaturesEXT & operator=( PhysicalDeviceShaderImageAtomicInt64FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderImageAtomicInt64FeaturesEXT & operator=( VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderImageAtomicInt64FeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderImageAtomicInt64FeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderImageAtomicInt64FeaturesEXT &\n      setShaderImageInt64Atomics( VULKAN_HPP_NAMESPACE::Bool32 shaderImageInt64Atomics_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderImageInt64Atomics = shaderImageInt64Atomics_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderImageAtomicInt64FeaturesEXT &\n      setSparseImageInt64Atomics( VULKAN_HPP_NAMESPACE::Bool32 sparseImageInt64Atomics_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sparseImageInt64Atomics = sparseImageInt64Atomics_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderImageInt64Atomics, sparseImageInt64Atomics );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderImageAtomicInt64FeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderImageAtomicInt64FeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderImageInt64Atomics == rhs.shaderImageInt64Atomics ) &&\n             ( sparseImageInt64Atomics == rhs.sparseImageInt64Atomics );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderImageAtomicInt64FeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                   = StructureType::ePhysicalDeviceShaderImageAtomicInt64FeaturesEXT;\n    void *                              pNext                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderImageInt64Atomics = {};\n    VULKAN_HPP_NAMESPACE::Bool32        sparseImageInt64Atomics = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderImageAtomicInt64FeaturesEXT>\n  {\n    using Type = PhysicalDeviceShaderImageAtomicInt64FeaturesEXT;\n  };\n\n  struct PhysicalDeviceShaderImageFootprintFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceShaderImageFootprintFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderImageFootprintFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderImageFootprintFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 imageFootprint_ = {},\n                                                                       void *                       pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , imageFootprint{ imageFootprint_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderImageFootprintFeaturesNV( PhysicalDeviceShaderImageFootprintFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderImageFootprintFeaturesNV( VkPhysicalDeviceShaderImageFootprintFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderImageFootprintFeaturesNV( *reinterpret_cast<PhysicalDeviceShaderImageFootprintFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderImageFootprintFeaturesNV & operator=( PhysicalDeviceShaderImageFootprintFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderImageFootprintFeaturesNV & operator=( VkPhysicalDeviceShaderImageFootprintFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderImageFootprintFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderImageFootprintFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderImageFootprintFeaturesNV & setImageFootprint( VULKAN_HPP_NAMESPACE::Bool32 imageFootprint_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageFootprint = imageFootprint_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderImageFootprintFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderImageFootprintFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderImageFootprintFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderImageFootprintFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, imageFootprint );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderImageFootprintFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderImageFootprintFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( imageFootprint == rhs.imageFootprint );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderImageFootprintFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::ePhysicalDeviceShaderImageFootprintFeaturesNV;\n    void *                              pNext          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        imageFootprint = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderImageFootprintFeaturesNV>\n  {\n    using Type = PhysicalDeviceShaderImageFootprintFeaturesNV;\n  };\n\n  struct PhysicalDeviceShaderIntegerDotProductFeatures\n  {\n    using NativeType = VkPhysicalDeviceShaderIntegerDotProductFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderIntegerDotProductFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderIntegerDotProductFeatures( VULKAN_HPP_NAMESPACE::Bool32 shaderIntegerDotProduct_ = {},\n                                                                        void *                       pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderIntegerDotProduct{ shaderIntegerDotProduct_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceShaderIntegerDotProductFeatures( PhysicalDeviceShaderIntegerDotProductFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderIntegerDotProductFeatures( VkPhysicalDeviceShaderIntegerDotProductFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderIntegerDotProductFeatures( *reinterpret_cast<PhysicalDeviceShaderIntegerDotProductFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderIntegerDotProductFeatures & operator=( PhysicalDeviceShaderIntegerDotProductFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderIntegerDotProductFeatures & operator=( VkPhysicalDeviceShaderIntegerDotProductFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerDotProductFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderIntegerDotProductFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderIntegerDotProductFeatures &\n      setShaderIntegerDotProduct( VULKAN_HPP_NAMESPACE::Bool32 shaderIntegerDotProduct_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderIntegerDotProduct = shaderIntegerDotProduct_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderIntegerDotProductFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderIntegerDotProductFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderIntegerDotProductFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderIntegerDotProduct );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderIntegerDotProductFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderIntegerDotProductFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderIntegerDotProduct == rhs.shaderIntegerDotProduct );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderIntegerDotProductFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                   = StructureType::ePhysicalDeviceShaderIntegerDotProductFeatures;\n    void *                              pNext                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderIntegerDotProduct = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderIntegerDotProductFeatures>\n  {\n    using Type = PhysicalDeviceShaderIntegerDotProductFeatures;\n  };\n\n  using PhysicalDeviceShaderIntegerDotProductFeaturesKHR = PhysicalDeviceShaderIntegerDotProductFeatures;\n\n  struct PhysicalDeviceShaderIntegerDotProductProperties\n  {\n    using NativeType = VkPhysicalDeviceShaderIntegerDotProductProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderIntegerDotProductProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderIntegerDotProductProperties(\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct8BitUnsignedAccelerated_                                      = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct8BitSignedAccelerated_                                        = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct8BitMixedSignednessAccelerated_                               = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct4x8BitPackedUnsignedAccelerated_                              = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct4x8BitPackedSignedAccelerated_                                = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct4x8BitPackedMixedSignednessAccelerated_                       = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct16BitUnsignedAccelerated_                                     = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct16BitSignedAccelerated_                                       = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct16BitMixedSignednessAccelerated_                              = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct32BitUnsignedAccelerated_                                     = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct32BitSignedAccelerated_                                       = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct32BitMixedSignednessAccelerated_                              = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct64BitUnsignedAccelerated_                                     = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct64BitSignedAccelerated_                                       = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct64BitMixedSignednessAccelerated_                              = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating8BitUnsignedAccelerated_                = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating8BitSignedAccelerated_                  = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated_         = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated_        = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated_          = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated_ = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating16BitUnsignedAccelerated_               = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating16BitSignedAccelerated_                 = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated_        = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating32BitUnsignedAccelerated_               = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating32BitSignedAccelerated_                 = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated_        = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating64BitUnsignedAccelerated_               = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating64BitSignedAccelerated_                 = {},\n      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated_        = {},\n      void *                       pNext_                                                                         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , integerDotProduct8BitUnsignedAccelerated{ integerDotProduct8BitUnsignedAccelerated_ }\n      , integerDotProduct8BitSignedAccelerated{ integerDotProduct8BitSignedAccelerated_ }\n      , integerDotProduct8BitMixedSignednessAccelerated{ integerDotProduct8BitMixedSignednessAccelerated_ }\n      , integerDotProduct4x8BitPackedUnsignedAccelerated{ integerDotProduct4x8BitPackedUnsignedAccelerated_ }\n      , integerDotProduct4x8BitPackedSignedAccelerated{ integerDotProduct4x8BitPackedSignedAccelerated_ }\n      , integerDotProduct4x8BitPackedMixedSignednessAccelerated{ integerDotProduct4x8BitPackedMixedSignednessAccelerated_ }\n      , integerDotProduct16BitUnsignedAccelerated{ integerDotProduct16BitUnsignedAccelerated_ }\n      , integerDotProduct16BitSignedAccelerated{ integerDotProduct16BitSignedAccelerated_ }\n      , integerDotProduct16BitMixedSignednessAccelerated{ integerDotProduct16BitMixedSignednessAccelerated_ }\n      , integerDotProduct32BitUnsignedAccelerated{ integerDotProduct32BitUnsignedAccelerated_ }\n      , integerDotProduct32BitSignedAccelerated{ integerDotProduct32BitSignedAccelerated_ }\n      , integerDotProduct32BitMixedSignednessAccelerated{ integerDotProduct32BitMixedSignednessAccelerated_ }\n      , integerDotProduct64BitUnsignedAccelerated{ integerDotProduct64BitUnsignedAccelerated_ }\n      , integerDotProduct64BitSignedAccelerated{ integerDotProduct64BitSignedAccelerated_ }\n      , integerDotProduct64BitMixedSignednessAccelerated{ integerDotProduct64BitMixedSignednessAccelerated_ }\n      , integerDotProductAccumulatingSaturating8BitUnsignedAccelerated{ integerDotProductAccumulatingSaturating8BitUnsignedAccelerated_ }\n      , integerDotProductAccumulatingSaturating8BitSignedAccelerated{ integerDotProductAccumulatingSaturating8BitSignedAccelerated_ }\n      , integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated{ integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated_ }\n      , integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated{ integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated_ }\n      , integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated{ integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated_ }\n      , integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated{ integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated_ }\n      , integerDotProductAccumulatingSaturating16BitUnsignedAccelerated{ integerDotProductAccumulatingSaturating16BitUnsignedAccelerated_ }\n      , integerDotProductAccumulatingSaturating16BitSignedAccelerated{ integerDotProductAccumulatingSaturating16BitSignedAccelerated_ }\n      , integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated{ integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated_ }\n      , integerDotProductAccumulatingSaturating32BitUnsignedAccelerated{ integerDotProductAccumulatingSaturating32BitUnsignedAccelerated_ }\n      , integerDotProductAccumulatingSaturating32BitSignedAccelerated{ integerDotProductAccumulatingSaturating32BitSignedAccelerated_ }\n      , integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated{ integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated_ }\n      , integerDotProductAccumulatingSaturating64BitUnsignedAccelerated{ integerDotProductAccumulatingSaturating64BitUnsignedAccelerated_ }\n      , integerDotProductAccumulatingSaturating64BitSignedAccelerated{ integerDotProductAccumulatingSaturating64BitSignedAccelerated_ }\n      , integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated{ integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceShaderIntegerDotProductProperties( PhysicalDeviceShaderIntegerDotProductProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderIntegerDotProductProperties( VkPhysicalDeviceShaderIntegerDotProductProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderIntegerDotProductProperties( *reinterpret_cast<PhysicalDeviceShaderIntegerDotProductProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderIntegerDotProductProperties & operator=( PhysicalDeviceShaderIntegerDotProductProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderIntegerDotProductProperties & operator=( VkPhysicalDeviceShaderIntegerDotProductProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerDotProductProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceShaderIntegerDotProductProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderIntegerDotProductProperties *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderIntegerDotProductProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       integerDotProduct8BitUnsignedAccelerated,\n                       integerDotProduct8BitSignedAccelerated,\n                       integerDotProduct8BitMixedSignednessAccelerated,\n                       integerDotProduct4x8BitPackedUnsignedAccelerated,\n                       integerDotProduct4x8BitPackedSignedAccelerated,\n                       integerDotProduct4x8BitPackedMixedSignednessAccelerated,\n                       integerDotProduct16BitUnsignedAccelerated,\n                       integerDotProduct16BitSignedAccelerated,\n                       integerDotProduct16BitMixedSignednessAccelerated,\n                       integerDotProduct32BitUnsignedAccelerated,\n                       integerDotProduct32BitSignedAccelerated,\n                       integerDotProduct32BitMixedSignednessAccelerated,\n                       integerDotProduct64BitUnsignedAccelerated,\n                       integerDotProduct64BitSignedAccelerated,\n                       integerDotProduct64BitMixedSignednessAccelerated,\n                       integerDotProductAccumulatingSaturating8BitUnsignedAccelerated,\n                       integerDotProductAccumulatingSaturating8BitSignedAccelerated,\n                       integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated,\n                       integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated,\n                       integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated,\n                       integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated,\n                       integerDotProductAccumulatingSaturating16BitUnsignedAccelerated,\n                       integerDotProductAccumulatingSaturating16BitSignedAccelerated,\n                       integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated,\n                       integerDotProductAccumulatingSaturating32BitUnsignedAccelerated,\n                       integerDotProductAccumulatingSaturating32BitSignedAccelerated,\n                       integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated,\n                       integerDotProductAccumulatingSaturating64BitUnsignedAccelerated,\n                       integerDotProductAccumulatingSaturating64BitSignedAccelerated,\n                       integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderIntegerDotProductProperties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderIntegerDotProductProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( integerDotProduct8BitUnsignedAccelerated == rhs.integerDotProduct8BitUnsignedAccelerated ) &&\n             ( integerDotProduct8BitSignedAccelerated == rhs.integerDotProduct8BitSignedAccelerated ) &&\n             ( integerDotProduct8BitMixedSignednessAccelerated == rhs.integerDotProduct8BitMixedSignednessAccelerated ) &&\n             ( integerDotProduct4x8BitPackedUnsignedAccelerated == rhs.integerDotProduct4x8BitPackedUnsignedAccelerated ) &&\n             ( integerDotProduct4x8BitPackedSignedAccelerated == rhs.integerDotProduct4x8BitPackedSignedAccelerated ) &&\n             ( integerDotProduct4x8BitPackedMixedSignednessAccelerated == rhs.integerDotProduct4x8BitPackedMixedSignednessAccelerated ) &&\n             ( integerDotProduct16BitUnsignedAccelerated == rhs.integerDotProduct16BitUnsignedAccelerated ) &&\n             ( integerDotProduct16BitSignedAccelerated == rhs.integerDotProduct16BitSignedAccelerated ) &&\n             ( integerDotProduct16BitMixedSignednessAccelerated == rhs.integerDotProduct16BitMixedSignednessAccelerated ) &&\n             ( integerDotProduct32BitUnsignedAccelerated == rhs.integerDotProduct32BitUnsignedAccelerated ) &&\n             ( integerDotProduct32BitSignedAccelerated == rhs.integerDotProduct32BitSignedAccelerated ) &&\n             ( integerDotProduct32BitMixedSignednessAccelerated == rhs.integerDotProduct32BitMixedSignednessAccelerated ) &&\n             ( integerDotProduct64BitUnsignedAccelerated == rhs.integerDotProduct64BitUnsignedAccelerated ) &&\n             ( integerDotProduct64BitSignedAccelerated == rhs.integerDotProduct64BitSignedAccelerated ) &&\n             ( integerDotProduct64BitMixedSignednessAccelerated == rhs.integerDotProduct64BitMixedSignednessAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating8BitUnsignedAccelerated == rhs.integerDotProductAccumulatingSaturating8BitUnsignedAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating8BitSignedAccelerated == rhs.integerDotProductAccumulatingSaturating8BitSignedAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated ==\n               rhs.integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated ==\n               rhs.integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated ==\n               rhs.integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated ==\n               rhs.integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating16BitUnsignedAccelerated == rhs.integerDotProductAccumulatingSaturating16BitUnsignedAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating16BitSignedAccelerated == rhs.integerDotProductAccumulatingSaturating16BitSignedAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated ==\n               rhs.integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating32BitUnsignedAccelerated == rhs.integerDotProductAccumulatingSaturating32BitUnsignedAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating32BitSignedAccelerated == rhs.integerDotProductAccumulatingSaturating32BitSignedAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated ==\n               rhs.integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating64BitUnsignedAccelerated == rhs.integerDotProductAccumulatingSaturating64BitUnsignedAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating64BitSignedAccelerated == rhs.integerDotProductAccumulatingSaturating64BitSignedAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated ==\n               rhs.integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderIntegerDotProductProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                            = StructureType::ePhysicalDeviceShaderIntegerDotProductProperties;\n    void *                              pNext                                            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct8BitUnsignedAccelerated         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct8BitSignedAccelerated           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct8BitMixedSignednessAccelerated  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct4x8BitPackedUnsignedAccelerated = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct4x8BitPackedSignedAccelerated   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct4x8BitPackedMixedSignednessAccelerated                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct16BitUnsignedAccelerated                                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct16BitSignedAccelerated                                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct16BitMixedSignednessAccelerated                              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct32BitUnsignedAccelerated                                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct32BitSignedAccelerated                                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct32BitMixedSignednessAccelerated                              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct64BitUnsignedAccelerated                                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct64BitSignedAccelerated                                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct64BitMixedSignednessAccelerated                              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProductAccumulatingSaturating8BitUnsignedAccelerated                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProductAccumulatingSaturating8BitSignedAccelerated                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProductAccumulatingSaturating16BitUnsignedAccelerated               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProductAccumulatingSaturating16BitSignedAccelerated                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProductAccumulatingSaturating32BitUnsignedAccelerated               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProductAccumulatingSaturating32BitSignedAccelerated                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProductAccumulatingSaturating64BitUnsignedAccelerated               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProductAccumulatingSaturating64BitSignedAccelerated                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderIntegerDotProductProperties>\n  {\n    using Type = PhysicalDeviceShaderIntegerDotProductProperties;\n  };\n\n  using PhysicalDeviceShaderIntegerDotProductPropertiesKHR = PhysicalDeviceShaderIntegerDotProductProperties;\n\n  struct PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL\n  {\n    using NativeType = VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderIntegerFunctions2FeaturesINTEL;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL( VULKAN_HPP_NAMESPACE::Bool32 shaderIntegerFunctions2_ = {},\n                                                                             void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderIntegerFunctions2{ shaderIntegerFunctions2_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL( PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL( VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL( *reinterpret_cast<PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL &\n      operator=( PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL & operator=( VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL &\n      setShaderIntegerFunctions2( VULKAN_HPP_NAMESPACE::Bool32 shaderIntegerFunctions2_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderIntegerFunctions2 = shaderIntegerFunctions2_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderIntegerFunctions2 );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderIntegerFunctions2 == rhs.shaderIntegerFunctions2 );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                   = StructureType::ePhysicalDeviceShaderIntegerFunctions2FeaturesINTEL;\n    void *                              pNext                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderIntegerFunctions2 = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderIntegerFunctions2FeaturesINTEL>\n  {\n    using Type = PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL;\n  };\n\n  struct PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR\n  {\n    using NativeType = VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderMaximalReconvergenceFeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 shaderMaximalReconvergence_ = {},\n                                                                              void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderMaximalReconvergence{ shaderMaximalReconvergence_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR( PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR( VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR( *reinterpret_cast<PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR &\n      operator=( PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR & operator=( VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR &\n      setShaderMaximalReconvergence( VULKAN_HPP_NAMESPACE::Bool32 shaderMaximalReconvergence_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderMaximalReconvergence = shaderMaximalReconvergence_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderMaximalReconvergence );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderMaximalReconvergence == rhs.shaderMaximalReconvergence );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                      = StructureType::ePhysicalDeviceShaderMaximalReconvergenceFeaturesKHR;\n    void *                              pNext                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderMaximalReconvergence = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderMaximalReconvergenceFeaturesKHR>\n  {\n    using Type = PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR;\n  };\n\n  struct PhysicalDeviceShaderModuleIdentifierFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderModuleIdentifierFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderModuleIdentifierFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 shaderModuleIdentifier_ = {},\n                                                                          void *                       pNext_                  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderModuleIdentifier{ shaderModuleIdentifier_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceShaderModuleIdentifierFeaturesEXT( PhysicalDeviceShaderModuleIdentifierFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderModuleIdentifierFeaturesEXT( VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderModuleIdentifierFeaturesEXT( *reinterpret_cast<PhysicalDeviceShaderModuleIdentifierFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderModuleIdentifierFeaturesEXT & operator=( PhysicalDeviceShaderModuleIdentifierFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderModuleIdentifierFeaturesEXT & operator=( VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderModuleIdentifierFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderModuleIdentifierFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderModuleIdentifierFeaturesEXT &\n      setShaderModuleIdentifier( VULKAN_HPP_NAMESPACE::Bool32 shaderModuleIdentifier_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderModuleIdentifier = shaderModuleIdentifier_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderModuleIdentifier );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderModuleIdentifierFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderModuleIdentifierFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderModuleIdentifier == rhs.shaderModuleIdentifier );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderModuleIdentifierFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                  = StructureType::ePhysicalDeviceShaderModuleIdentifierFeaturesEXT;\n    void *                              pNext                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderModuleIdentifier = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderModuleIdentifierFeaturesEXT>\n  {\n    using Type = PhysicalDeviceShaderModuleIdentifierFeaturesEXT;\n  };\n\n  struct PhysicalDeviceShaderModuleIdentifierPropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderModuleIdentifierPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14\n      PhysicalDeviceShaderModuleIdentifierPropertiesEXT( std::array<uint8_t, VK_UUID_SIZE> const & shaderModuleIdentifierAlgorithmUUID_ = {},\n                                                         void *                                    pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderModuleIdentifierAlgorithmUUID{ shaderModuleIdentifierAlgorithmUUID_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14\n      PhysicalDeviceShaderModuleIdentifierPropertiesEXT( PhysicalDeviceShaderModuleIdentifierPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderModuleIdentifierPropertiesEXT( VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderModuleIdentifierPropertiesEXT( *reinterpret_cast<PhysicalDeviceShaderModuleIdentifierPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderModuleIdentifierPropertiesEXT &\n      operator=( PhysicalDeviceShaderModuleIdentifierPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderModuleIdentifierPropertiesEXT & operator=( VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderModuleIdentifierPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderModuleIdentifierAlgorithmUUID );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderModuleIdentifierPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderModuleIdentifierPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderModuleIdentifierAlgorithmUUID == rhs.shaderModuleIdentifierAlgorithmUUID );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderModuleIdentifierPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                         sType = StructureType::ePhysicalDeviceShaderModuleIdentifierPropertiesEXT;\n    void *                                                      pNext = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> shaderModuleIdentifierAlgorithmUUID = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderModuleIdentifierPropertiesEXT>\n  {\n    using Type = PhysicalDeviceShaderModuleIdentifierPropertiesEXT;\n  };\n\n  struct PhysicalDeviceShaderObjectFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceShaderObjectFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderObjectFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderObjectFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 shaderObject_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderObject{ shaderObject_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderObjectFeaturesEXT( PhysicalDeviceShaderObjectFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderObjectFeaturesEXT( VkPhysicalDeviceShaderObjectFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderObjectFeaturesEXT( *reinterpret_cast<PhysicalDeviceShaderObjectFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderObjectFeaturesEXT & operator=( PhysicalDeviceShaderObjectFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderObjectFeaturesEXT & operator=( VkPhysicalDeviceShaderObjectFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderObjectFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderObjectFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderObjectFeaturesEXT & setShaderObject( VULKAN_HPP_NAMESPACE::Bool32 shaderObject_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderObject = shaderObject_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderObjectFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderObjectFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderObjectFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderObjectFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderObject );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderObjectFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderObjectFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderObject == rhs.shaderObject );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderObjectFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType        = StructureType::ePhysicalDeviceShaderObjectFeaturesEXT;\n    void *                              pNext        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderObject = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderObjectFeaturesEXT>\n  {\n    using Type = PhysicalDeviceShaderObjectFeaturesEXT;\n  };\n\n  struct PhysicalDeviceShaderObjectPropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceShaderObjectPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderObjectPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderObjectPropertiesEXT( std::array<uint8_t, VK_UUID_SIZE> const & shaderBinaryUUID_    = {},\n                                                                     uint32_t                                  shaderBinaryVersion_ = {},\n                                                                     void *                                    pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderBinaryUUID{ shaderBinaryUUID_ }\n      , shaderBinaryVersion{ shaderBinaryVersion_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderObjectPropertiesEXT( PhysicalDeviceShaderObjectPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderObjectPropertiesEXT( VkPhysicalDeviceShaderObjectPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderObjectPropertiesEXT( *reinterpret_cast<PhysicalDeviceShaderObjectPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderObjectPropertiesEXT & operator=( PhysicalDeviceShaderObjectPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderObjectPropertiesEXT & operator=( VkPhysicalDeviceShaderObjectPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderObjectPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceShaderObjectPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderObjectPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderObjectPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderObjectPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::\n      tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderBinaryUUID, shaderBinaryVersion );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderObjectPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderObjectPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderBinaryUUID == rhs.shaderBinaryUUID ) &&\n             ( shaderBinaryVersion == rhs.shaderBinaryVersion );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderObjectPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                         sType               = StructureType::ePhysicalDeviceShaderObjectPropertiesEXT;\n    void *                                                      pNext               = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> shaderBinaryUUID    = {};\n    uint32_t                                                    shaderBinaryVersion = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderObjectPropertiesEXT>\n  {\n    using Type = PhysicalDeviceShaderObjectPropertiesEXT;\n  };\n\n  struct PhysicalDeviceShaderQuadControlFeaturesKHR\n  {\n    using NativeType = VkPhysicalDeviceShaderQuadControlFeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderQuadControlFeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderQuadControlFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 shaderQuadControl_ = {},\n                                                                     void *                       pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderQuadControl{ shaderQuadControl_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderQuadControlFeaturesKHR( PhysicalDeviceShaderQuadControlFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderQuadControlFeaturesKHR( VkPhysicalDeviceShaderQuadControlFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderQuadControlFeaturesKHR( *reinterpret_cast<PhysicalDeviceShaderQuadControlFeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderQuadControlFeaturesKHR & operator=( PhysicalDeviceShaderQuadControlFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderQuadControlFeaturesKHR & operator=( VkPhysicalDeviceShaderQuadControlFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderQuadControlFeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderQuadControlFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderQuadControlFeaturesKHR &\n      setShaderQuadControl( VULKAN_HPP_NAMESPACE::Bool32 shaderQuadControl_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderQuadControl = shaderQuadControl_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderQuadControlFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderQuadControlFeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderQuadControlFeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderQuadControlFeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderQuadControl );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderQuadControlFeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderQuadControlFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderQuadControl == rhs.shaderQuadControl );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderQuadControlFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType             = StructureType::ePhysicalDeviceShaderQuadControlFeaturesKHR;\n    void *                              pNext             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderQuadControl = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderQuadControlFeaturesKHR>\n  {\n    using Type = PhysicalDeviceShaderQuadControlFeaturesKHR;\n  };\n\n  struct PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR\n  {\n    using NativeType = VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 shaderRelaxedExtendedInstruction_ = {},\n                                                                                    void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderRelaxedExtendedInstruction{ shaderRelaxedExtendedInstruction_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR( PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR const & rhs )\n      VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR( VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR(\n          *reinterpret_cast<PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR &\n      operator=( PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR &\n      operator=( VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR &\n      setShaderRelaxedExtendedInstruction( VULKAN_HPP_NAMESPACE::Bool32 shaderRelaxedExtendedInstruction_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderRelaxedExtendedInstruction = shaderRelaxedExtendedInstruction_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderRelaxedExtendedInstruction );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderRelaxedExtendedInstruction == rhs.shaderRelaxedExtendedInstruction );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                            = StructureType::ePhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR;\n    void *                              pNext                            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderRelaxedExtendedInstruction = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR>\n  {\n    using Type = PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR;\n  };\n\n  struct PhysicalDeviceShaderReplicatedCompositesFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderReplicatedCompositesFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderReplicatedCompositesFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 shaderReplicatedComposites_ = {},\n                                                                              void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderReplicatedComposites{ shaderReplicatedComposites_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceShaderReplicatedCompositesFeaturesEXT( PhysicalDeviceShaderReplicatedCompositesFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderReplicatedCompositesFeaturesEXT( VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderReplicatedCompositesFeaturesEXT( *reinterpret_cast<PhysicalDeviceShaderReplicatedCompositesFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderReplicatedCompositesFeaturesEXT &\n      operator=( PhysicalDeviceShaderReplicatedCompositesFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderReplicatedCompositesFeaturesEXT & operator=( VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderReplicatedCompositesFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderReplicatedCompositesFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderReplicatedCompositesFeaturesEXT &\n      setShaderReplicatedComposites( VULKAN_HPP_NAMESPACE::Bool32 shaderReplicatedComposites_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderReplicatedComposites = shaderReplicatedComposites_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderReplicatedComposites );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderReplicatedCompositesFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderReplicatedCompositesFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderReplicatedComposites == rhs.shaderReplicatedComposites );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderReplicatedCompositesFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                      = StructureType::ePhysicalDeviceShaderReplicatedCompositesFeaturesEXT;\n    void *                              pNext                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderReplicatedComposites = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderReplicatedCompositesFeaturesEXT>\n  {\n    using Type = PhysicalDeviceShaderReplicatedCompositesFeaturesEXT;\n  };\n\n  struct PhysicalDeviceShaderSMBuiltinsFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceShaderSMBuiltinsFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderSmBuiltinsFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderSMBuiltinsFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 shaderSMBuiltins_ = {},\n                                                                   void *                       pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderSMBuiltins{ shaderSMBuiltins_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderSMBuiltinsFeaturesNV( PhysicalDeviceShaderSMBuiltinsFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderSMBuiltinsFeaturesNV( VkPhysicalDeviceShaderSMBuiltinsFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderSMBuiltinsFeaturesNV( *reinterpret_cast<PhysicalDeviceShaderSMBuiltinsFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderSMBuiltinsFeaturesNV & operator=( PhysicalDeviceShaderSMBuiltinsFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderSMBuiltinsFeaturesNV & operator=( VkPhysicalDeviceShaderSMBuiltinsFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSMBuiltinsFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderSMBuiltinsFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderSMBuiltinsFeaturesNV & setShaderSMBuiltins( VULKAN_HPP_NAMESPACE::Bool32 shaderSMBuiltins_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSMBuiltins = shaderSMBuiltins_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderSMBuiltinsFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderSMBuiltinsFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderSMBuiltins );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderSMBuiltinsFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderSMBuiltinsFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderSMBuiltins == rhs.shaderSMBuiltins );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderSMBuiltinsFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType            = StructureType::ePhysicalDeviceShaderSmBuiltinsFeaturesNV;\n    void *                              pNext            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSMBuiltins = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderSmBuiltinsFeaturesNV>\n  {\n    using Type = PhysicalDeviceShaderSMBuiltinsFeaturesNV;\n  };\n\n  struct PhysicalDeviceShaderSMBuiltinsPropertiesNV\n  {\n    using NativeType = VkPhysicalDeviceShaderSMBuiltinsPropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderSmBuiltinsPropertiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceShaderSMBuiltinsPropertiesNV( uint32_t shaderSMCount_ = {}, uint32_t shaderWarpsPerSM_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderSMCount{ shaderSMCount_ }\n      , shaderWarpsPerSM{ shaderWarpsPerSM_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderSMBuiltinsPropertiesNV( PhysicalDeviceShaderSMBuiltinsPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderSMBuiltinsPropertiesNV( VkPhysicalDeviceShaderSMBuiltinsPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderSMBuiltinsPropertiesNV( *reinterpret_cast<PhysicalDeviceShaderSMBuiltinsPropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderSMBuiltinsPropertiesNV & operator=( PhysicalDeviceShaderSMBuiltinsPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderSMBuiltinsPropertiesNV & operator=( VkPhysicalDeviceShaderSMBuiltinsPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSMBuiltinsPropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceShaderSMBuiltinsPropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderSMBuiltinsPropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsPropertiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderSMCount, shaderWarpsPerSM );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderSMBuiltinsPropertiesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderSMBuiltinsPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderSMCount == rhs.shaderSMCount ) && ( shaderWarpsPerSM == rhs.shaderWarpsPerSM );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderSMBuiltinsPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType            = StructureType::ePhysicalDeviceShaderSmBuiltinsPropertiesNV;\n    void *                              pNext            = {};\n    uint32_t                            shaderSMCount    = {};\n    uint32_t                            shaderWarpsPerSM = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderSmBuiltinsPropertiesNV>\n  {\n    using Type = PhysicalDeviceShaderSMBuiltinsPropertiesNV;\n  };\n\n  struct PhysicalDeviceShaderSubgroupExtendedTypesFeatures\n  {\n    using NativeType = VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderSubgroupExtendedTypesFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderSubgroupExtendedTypesFeatures( VULKAN_HPP_NAMESPACE::Bool32 shaderSubgroupExtendedTypes_ = {},\n                                                                            void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderSubgroupExtendedTypes{ shaderSubgroupExtendedTypes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceShaderSubgroupExtendedTypesFeatures( PhysicalDeviceShaderSubgroupExtendedTypesFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderSubgroupExtendedTypesFeatures( VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderSubgroupExtendedTypesFeatures( *reinterpret_cast<PhysicalDeviceShaderSubgroupExtendedTypesFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderSubgroupExtendedTypesFeatures &\n      operator=( PhysicalDeviceShaderSubgroupExtendedTypesFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderSubgroupExtendedTypesFeatures & operator=( VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSubgroupExtendedTypesFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderSubgroupExtendedTypesFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderSubgroupExtendedTypesFeatures &\n      setShaderSubgroupExtendedTypes( VULKAN_HPP_NAMESPACE::Bool32 shaderSubgroupExtendedTypes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSubgroupExtendedTypes = shaderSubgroupExtendedTypes_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderSubgroupExtendedTypes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderSubgroupExtendedTypesFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderSubgroupExtendedTypesFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderSubgroupExtendedTypes == rhs.shaderSubgroupExtendedTypes );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderSubgroupExtendedTypesFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                       = StructureType::ePhysicalDeviceShaderSubgroupExtendedTypesFeatures;\n    void *                              pNext                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSubgroupExtendedTypes = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderSubgroupExtendedTypesFeatures>\n  {\n    using Type = PhysicalDeviceShaderSubgroupExtendedTypesFeatures;\n  };\n\n  using PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR = PhysicalDeviceShaderSubgroupExtendedTypesFeatures;\n\n  struct PhysicalDeviceShaderSubgroupRotateFeatures\n  {\n    using NativeType = VkPhysicalDeviceShaderSubgroupRotateFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderSubgroupRotateFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderSubgroupRotateFeatures( VULKAN_HPP_NAMESPACE::Bool32 shaderSubgroupRotate_          = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 shaderSubgroupRotateClustered_ = {},\n                                                                     void *                       pNext_                         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderSubgroupRotate{ shaderSubgroupRotate_ }\n      , shaderSubgroupRotateClustered{ shaderSubgroupRotateClustered_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderSubgroupRotateFeatures( PhysicalDeviceShaderSubgroupRotateFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderSubgroupRotateFeatures( VkPhysicalDeviceShaderSubgroupRotateFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderSubgroupRotateFeatures( *reinterpret_cast<PhysicalDeviceShaderSubgroupRotateFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderSubgroupRotateFeatures & operator=( PhysicalDeviceShaderSubgroupRotateFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderSubgroupRotateFeatures & operator=( VkPhysicalDeviceShaderSubgroupRotateFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSubgroupRotateFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderSubgroupRotateFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderSubgroupRotateFeatures &\n      setShaderSubgroupRotate( VULKAN_HPP_NAMESPACE::Bool32 shaderSubgroupRotate_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSubgroupRotate = shaderSubgroupRotate_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderSubgroupRotateFeatures &\n      setShaderSubgroupRotateClustered( VULKAN_HPP_NAMESPACE::Bool32 shaderSubgroupRotateClustered_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSubgroupRotateClustered = shaderSubgroupRotateClustered_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderSubgroupRotateFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderSubgroupRotateFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderSubgroupRotateFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderSubgroupRotateFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderSubgroupRotate, shaderSubgroupRotateClustered );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderSubgroupRotateFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderSubgroupRotateFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderSubgroupRotate == rhs.shaderSubgroupRotate ) &&\n             ( shaderSubgroupRotateClustered == rhs.shaderSubgroupRotateClustered );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderSubgroupRotateFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                         = StructureType::ePhysicalDeviceShaderSubgroupRotateFeatures;\n    void *                              pNext                         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSubgroupRotate          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSubgroupRotateClustered = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderSubgroupRotateFeatures>\n  {\n    using Type = PhysicalDeviceShaderSubgroupRotateFeatures;\n  };\n\n  using PhysicalDeviceShaderSubgroupRotateFeaturesKHR = PhysicalDeviceShaderSubgroupRotateFeatures;\n\n  struct PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR\n  {\n    using NativeType = VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 shaderSubgroupUniformControlFlow_ = {},\n                                                                                    void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderSubgroupUniformControlFlow{ shaderSubgroupUniformControlFlow_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR( PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR const & rhs )\n      VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR( VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(\n          *reinterpret_cast<PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR &\n      operator=( PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR &\n      operator=( VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR &\n      setShaderSubgroupUniformControlFlow( VULKAN_HPP_NAMESPACE::Bool32 shaderSubgroupUniformControlFlow_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSubgroupUniformControlFlow = shaderSubgroupUniformControlFlow_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderSubgroupUniformControlFlow );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderSubgroupUniformControlFlow == rhs.shaderSubgroupUniformControlFlow );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                            = StructureType::ePhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR;\n    void *                              pNext                            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSubgroupUniformControlFlow = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR>\n  {\n    using Type = PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR;\n  };\n\n  struct PhysicalDeviceShaderTerminateInvocationFeatures\n  {\n    using NativeType = VkPhysicalDeviceShaderTerminateInvocationFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderTerminateInvocationFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderTerminateInvocationFeatures( VULKAN_HPP_NAMESPACE::Bool32 shaderTerminateInvocation_ = {},\n                                                                          void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderTerminateInvocation{ shaderTerminateInvocation_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceShaderTerminateInvocationFeatures( PhysicalDeviceShaderTerminateInvocationFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderTerminateInvocationFeatures( VkPhysicalDeviceShaderTerminateInvocationFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderTerminateInvocationFeatures( *reinterpret_cast<PhysicalDeviceShaderTerminateInvocationFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderTerminateInvocationFeatures & operator=( PhysicalDeviceShaderTerminateInvocationFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderTerminateInvocationFeatures & operator=( VkPhysicalDeviceShaderTerminateInvocationFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderTerminateInvocationFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderTerminateInvocationFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderTerminateInvocationFeatures &\n      setShaderTerminateInvocation( VULKAN_HPP_NAMESPACE::Bool32 shaderTerminateInvocation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderTerminateInvocation = shaderTerminateInvocation_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderTerminateInvocationFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderTerminateInvocationFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderTerminateInvocationFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderTerminateInvocationFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderTerminateInvocation );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderTerminateInvocationFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderTerminateInvocationFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderTerminateInvocation == rhs.shaderTerminateInvocation );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderTerminateInvocationFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                     = StructureType::ePhysicalDeviceShaderTerminateInvocationFeatures;\n    void *                              pNext                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderTerminateInvocation = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderTerminateInvocationFeatures>\n  {\n    using Type = PhysicalDeviceShaderTerminateInvocationFeatures;\n  };\n\n  using PhysicalDeviceShaderTerminateInvocationFeaturesKHR = PhysicalDeviceShaderTerminateInvocationFeatures;\n\n  struct PhysicalDeviceShaderTileImageFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceShaderTileImageFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderTileImageFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderTileImageFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 shaderTileImageColorReadAccess_   = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 shaderTileImageDepthReadAccess_   = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 shaderTileImageStencilReadAccess_ = {},\n                                                                   void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderTileImageColorReadAccess{ shaderTileImageColorReadAccess_ }\n      , shaderTileImageDepthReadAccess{ shaderTileImageDepthReadAccess_ }\n      , shaderTileImageStencilReadAccess{ shaderTileImageStencilReadAccess_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderTileImageFeaturesEXT( PhysicalDeviceShaderTileImageFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderTileImageFeaturesEXT( VkPhysicalDeviceShaderTileImageFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderTileImageFeaturesEXT( *reinterpret_cast<PhysicalDeviceShaderTileImageFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderTileImageFeaturesEXT & operator=( PhysicalDeviceShaderTileImageFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderTileImageFeaturesEXT & operator=( VkPhysicalDeviceShaderTileImageFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderTileImageFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderTileImageFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderTileImageFeaturesEXT &\n      setShaderTileImageColorReadAccess( VULKAN_HPP_NAMESPACE::Bool32 shaderTileImageColorReadAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderTileImageColorReadAccess = shaderTileImageColorReadAccess_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderTileImageFeaturesEXT &\n      setShaderTileImageDepthReadAccess( VULKAN_HPP_NAMESPACE::Bool32 shaderTileImageDepthReadAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderTileImageDepthReadAccess = shaderTileImageDepthReadAccess_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderTileImageFeaturesEXT &\n      setShaderTileImageStencilReadAccess( VULKAN_HPP_NAMESPACE::Bool32 shaderTileImageStencilReadAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderTileImageStencilReadAccess = shaderTileImageStencilReadAccess_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShaderTileImageFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderTileImageFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderTileImageFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderTileImageFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderTileImageColorReadAccess, shaderTileImageDepthReadAccess, shaderTileImageStencilReadAccess );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderTileImageFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderTileImageFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderTileImageColorReadAccess == rhs.shaderTileImageColorReadAccess ) &&\n             ( shaderTileImageDepthReadAccess == rhs.shaderTileImageDepthReadAccess ) &&\n             ( shaderTileImageStencilReadAccess == rhs.shaderTileImageStencilReadAccess );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderTileImageFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                            = StructureType::ePhysicalDeviceShaderTileImageFeaturesEXT;\n    void *                              pNext                            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderTileImageColorReadAccess   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderTileImageDepthReadAccess   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderTileImageStencilReadAccess = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderTileImageFeaturesEXT>\n  {\n    using Type = PhysicalDeviceShaderTileImageFeaturesEXT;\n  };\n\n  struct PhysicalDeviceShaderTileImagePropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceShaderTileImagePropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShaderTileImagePropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderTileImagePropertiesEXT( VULKAN_HPP_NAMESPACE::Bool32 shaderTileImageCoherentReadAccelerated_           = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 shaderTileImageReadSampleFromPixelRateInvocation_ = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 shaderTileImageReadFromHelperInvocation_          = {},\n                                                                     void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderTileImageCoherentReadAccelerated{ shaderTileImageCoherentReadAccelerated_ }\n      , shaderTileImageReadSampleFromPixelRateInvocation{ shaderTileImageReadSampleFromPixelRateInvocation_ }\n      , shaderTileImageReadFromHelperInvocation{ shaderTileImageReadFromHelperInvocation_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderTileImagePropertiesEXT( PhysicalDeviceShaderTileImagePropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShaderTileImagePropertiesEXT( VkPhysicalDeviceShaderTileImagePropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShaderTileImagePropertiesEXT( *reinterpret_cast<PhysicalDeviceShaderTileImagePropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShaderTileImagePropertiesEXT & operator=( PhysicalDeviceShaderTileImagePropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShaderTileImagePropertiesEXT & operator=( VkPhysicalDeviceShaderTileImagePropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderTileImagePropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceShaderTileImagePropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShaderTileImagePropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceShaderTileImagePropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShaderTileImagePropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie(\n        sType, pNext, shaderTileImageCoherentReadAccelerated, shaderTileImageReadSampleFromPixelRateInvocation, shaderTileImageReadFromHelperInvocation );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShaderTileImagePropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShaderTileImagePropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderTileImageCoherentReadAccelerated == rhs.shaderTileImageCoherentReadAccelerated ) &&\n             ( shaderTileImageReadSampleFromPixelRateInvocation == rhs.shaderTileImageReadSampleFromPixelRateInvocation ) &&\n             ( shaderTileImageReadFromHelperInvocation == rhs.shaderTileImageReadFromHelperInvocation );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShaderTileImagePropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                            = StructureType::ePhysicalDeviceShaderTileImagePropertiesEXT;\n    void *                              pNext                                            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderTileImageCoherentReadAccelerated           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderTileImageReadSampleFromPixelRateInvocation = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderTileImageReadFromHelperInvocation          = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderTileImagePropertiesEXT>\n  {\n    using Type = PhysicalDeviceShaderTileImagePropertiesEXT;\n  };\n\n  struct PhysicalDeviceShadingRateImageFeaturesNV\n  {\n    using NativeType = VkPhysicalDeviceShadingRateImageFeaturesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShadingRateImageFeaturesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShadingRateImageFeaturesNV( VULKAN_HPP_NAMESPACE::Bool32 shadingRateImage_             = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32 shadingRateCoarseSampleOrder_ = {},\n                                                                   void *                       pNext_                        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shadingRateImage{ shadingRateImage_ }\n      , shadingRateCoarseSampleOrder{ shadingRateCoarseSampleOrder_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShadingRateImageFeaturesNV( PhysicalDeviceShadingRateImageFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShadingRateImageFeaturesNV( VkPhysicalDeviceShadingRateImageFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShadingRateImageFeaturesNV( *reinterpret_cast<PhysicalDeviceShadingRateImageFeaturesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShadingRateImageFeaturesNV & operator=( PhysicalDeviceShadingRateImageFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShadingRateImageFeaturesNV & operator=( VkPhysicalDeviceShadingRateImageFeaturesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShadingRateImageFeaturesNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShadingRateImageFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShadingRateImageFeaturesNV & setShadingRateImage( VULKAN_HPP_NAMESPACE::Bool32 shadingRateImage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shadingRateImage = shadingRateImage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShadingRateImageFeaturesNV &\n      setShadingRateCoarseSampleOrder( VULKAN_HPP_NAMESPACE::Bool32 shadingRateCoarseSampleOrder_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shadingRateCoarseSampleOrder = shadingRateCoarseSampleOrder_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceShadingRateImageFeaturesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShadingRateImageFeaturesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceShadingRateImageFeaturesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShadingRateImageFeaturesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shadingRateImage, shadingRateCoarseSampleOrder );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShadingRateImageFeaturesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShadingRateImageFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shadingRateImage == rhs.shadingRateImage ) &&\n             ( shadingRateCoarseSampleOrder == rhs.shadingRateCoarseSampleOrder );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShadingRateImageFeaturesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                        = StructureType::ePhysicalDeviceShadingRateImageFeaturesNV;\n    void *                              pNext                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shadingRateImage             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shadingRateCoarseSampleOrder = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShadingRateImageFeaturesNV>\n  {\n    using Type = PhysicalDeviceShadingRateImageFeaturesNV;\n  };\n\n  struct PhysicalDeviceShadingRateImagePropertiesNV\n  {\n    using NativeType = VkPhysicalDeviceShadingRateImagePropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceShadingRateImagePropertiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShadingRateImagePropertiesNV( VULKAN_HPP_NAMESPACE::Extent2D shadingRateTexelSize_        = {},\n                                                                     uint32_t                       shadingRatePaletteSize_      = {},\n                                                                     uint32_t                       shadingRateMaxCoarseSamples_ = {},\n                                                                     void *                         pNext_                       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shadingRateTexelSize{ shadingRateTexelSize_ }\n      , shadingRatePaletteSize{ shadingRatePaletteSize_ }\n      , shadingRateMaxCoarseSamples{ shadingRateMaxCoarseSamples_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceShadingRateImagePropertiesNV( PhysicalDeviceShadingRateImagePropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceShadingRateImagePropertiesNV( VkPhysicalDeviceShadingRateImagePropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceShadingRateImagePropertiesNV( *reinterpret_cast<PhysicalDeviceShadingRateImagePropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceShadingRateImagePropertiesNV & operator=( PhysicalDeviceShadingRateImagePropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceShadingRateImagePropertiesNV & operator=( VkPhysicalDeviceShadingRateImagePropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShadingRateImagePropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceShadingRateImagePropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceShadingRateImagePropertiesNV *>( this );\n    }\n\n    operator VkPhysicalDeviceShadingRateImagePropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceShadingRateImagePropertiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Extent2D const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shadingRateTexelSize, shadingRatePaletteSize, shadingRateMaxCoarseSamples );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceShadingRateImagePropertiesNV const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceShadingRateImagePropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shadingRateTexelSize == rhs.shadingRateTexelSize ) &&\n             ( shadingRatePaletteSize == rhs.shadingRatePaletteSize ) && ( shadingRateMaxCoarseSamples == rhs.shadingRateMaxCoarseSamples );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceShadingRateImagePropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                       = StructureType::ePhysicalDeviceShadingRateImagePropertiesNV;\n    void *                              pNext                       = {};\n    VULKAN_HPP_NAMESPACE::Extent2D      shadingRateTexelSize        = {};\n    uint32_t                            shadingRatePaletteSize      = {};\n    uint32_t                            shadingRateMaxCoarseSamples = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceShadingRateImagePropertiesNV>\n  {\n    using Type = PhysicalDeviceShadingRateImagePropertiesNV;\n  };\n\n  struct PhysicalDeviceSparseImageFormatInfo2\n  {\n    using NativeType = VkPhysicalDeviceSparseImageFormatInfo2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceSparseImageFormatInfo2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceSparseImageFormatInfo2( VULKAN_HPP_NAMESPACE::Format              format_  = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                            VULKAN_HPP_NAMESPACE::ImageType           type_    = VULKAN_HPP_NAMESPACE::ImageType::e1D,\n                                            VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples_ = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1,\n                                            VULKAN_HPP_NAMESPACE::ImageUsageFlags     usage_   = {},\n                                            VULKAN_HPP_NAMESPACE::ImageTiling         tiling_  = VULKAN_HPP_NAMESPACE::ImageTiling::eOptimal,\n                                            const void *                              pNext_   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , format{ format_ }\n      , type{ type_ }\n      , samples{ samples_ }\n      , usage{ usage_ }\n      , tiling{ tiling_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSparseImageFormatInfo2( PhysicalDeviceSparseImageFormatInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceSparseImageFormatInfo2( VkPhysicalDeviceSparseImageFormatInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceSparseImageFormatInfo2( *reinterpret_cast<PhysicalDeviceSparseImageFormatInfo2 const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceSparseImageFormatInfo2 & operator=( PhysicalDeviceSparseImageFormatInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceSparseImageFormatInfo2 & operator=( VkPhysicalDeviceSparseImageFormatInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSparseImageFormatInfo2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSparseImageFormatInfo2 & setFormat( VULKAN_HPP_NAMESPACE::Format format_ ) VULKAN_HPP_NOEXCEPT\n    {\n      format = format_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSparseImageFormatInfo2 & setType( VULKAN_HPP_NAMESPACE::ImageType type_ ) VULKAN_HPP_NOEXCEPT\n    {\n      type = type_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSparseImageFormatInfo2 & setSamples( VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples_ ) VULKAN_HPP_NOEXCEPT\n    {\n      samples = samples_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSparseImageFormatInfo2 & setUsage( VULKAN_HPP_NAMESPACE::ImageUsageFlags usage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      usage = usage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSparseImageFormatInfo2 & setTiling( VULKAN_HPP_NAMESPACE::ImageTiling tiling_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tiling = tiling_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceSparseImageFormatInfo2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceSparseImageFormatInfo2 *>( this );\n    }\n\n    operator VkPhysicalDeviceSparseImageFormatInfo2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceSparseImageFormatInfo2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::ImageType const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlagBits const &,\n               VULKAN_HPP_NAMESPACE::ImageUsageFlags const &,\n               VULKAN_HPP_NAMESPACE::ImageTiling const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, format, type, samples, usage, tiling );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceSparseImageFormatInfo2 const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceSparseImageFormatInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( format == rhs.format ) && ( type == rhs.type ) && ( samples == rhs.samples ) &&\n             ( usage == rhs.usage ) && ( tiling == rhs.tiling );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceSparseImageFormatInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType   = StructureType::ePhysicalDeviceSparseImageFormatInfo2;\n    const void *                              pNext   = {};\n    VULKAN_HPP_NAMESPACE::Format              format  = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::ImageType           type    = VULKAN_HPP_NAMESPACE::ImageType::e1D;\n    VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples = VULKAN_HPP_NAMESPACE::SampleCountFlagBits::e1;\n    VULKAN_HPP_NAMESPACE::ImageUsageFlags     usage   = {};\n    VULKAN_HPP_NAMESPACE::ImageTiling         tiling  = VULKAN_HPP_NAMESPACE::ImageTiling::eOptimal;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceSparseImageFormatInfo2>\n  {\n    using Type = PhysicalDeviceSparseImageFormatInfo2;\n  };\n\n  using PhysicalDeviceSparseImageFormatInfo2KHR = PhysicalDeviceSparseImageFormatInfo2;\n\n  struct PhysicalDeviceSubgroupProperties\n  {\n    using NativeType = VkPhysicalDeviceSubgroupProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceSubgroupProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSubgroupProperties( uint32_t                                   subgroupSize_              = {},\n                                                           VULKAN_HPP_NAMESPACE::ShaderStageFlags     supportedStages_           = {},\n                                                           VULKAN_HPP_NAMESPACE::SubgroupFeatureFlags supportedOperations_       = {},\n                                                           VULKAN_HPP_NAMESPACE::Bool32               quadOperationsInAllStages_ = {},\n                                                           void *                                     pNext_                     = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , subgroupSize{ subgroupSize_ }\n      , supportedStages{ supportedStages_ }\n      , supportedOperations{ supportedOperations_ }\n      , quadOperationsInAllStages{ quadOperationsInAllStages_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSubgroupProperties( PhysicalDeviceSubgroupProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceSubgroupProperties( VkPhysicalDeviceSubgroupProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceSubgroupProperties( *reinterpret_cast<PhysicalDeviceSubgroupProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceSubgroupProperties & operator=( PhysicalDeviceSubgroupProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceSubgroupProperties & operator=( VkPhysicalDeviceSubgroupProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceSubgroupProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceSubgroupProperties *>( this );\n    }\n\n    operator VkPhysicalDeviceSubgroupProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceSubgroupProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ShaderStageFlags const &,\n               VULKAN_HPP_NAMESPACE::SubgroupFeatureFlags const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, subgroupSize, supportedStages, supportedOperations, quadOperationsInAllStages );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceSubgroupProperties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceSubgroupProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( subgroupSize == rhs.subgroupSize ) && ( supportedStages == rhs.supportedStages ) &&\n             ( supportedOperations == rhs.supportedOperations ) && ( quadOperationsInAllStages == rhs.quadOperationsInAllStages );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceSubgroupProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType        sType                     = StructureType::ePhysicalDeviceSubgroupProperties;\n    void *                                     pNext                     = {};\n    uint32_t                                   subgroupSize              = {};\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags     supportedStages           = {};\n    VULKAN_HPP_NAMESPACE::SubgroupFeatureFlags supportedOperations       = {};\n    VULKAN_HPP_NAMESPACE::Bool32               quadOperationsInAllStages = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceSubgroupProperties>\n  {\n    using Type = PhysicalDeviceSubgroupProperties;\n  };\n\n  struct PhysicalDeviceSubgroupSizeControlFeatures\n  {\n    using NativeType = VkPhysicalDeviceSubgroupSizeControlFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceSubgroupSizeControlFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSubgroupSizeControlFeatures( VULKAN_HPP_NAMESPACE::Bool32 subgroupSizeControl_  = {},\n                                                                    VULKAN_HPP_NAMESPACE::Bool32 computeFullSubgroups_ = {},\n                                                                    void *                       pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , subgroupSizeControl{ subgroupSizeControl_ }\n      , computeFullSubgroups{ computeFullSubgroups_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSubgroupSizeControlFeatures( PhysicalDeviceSubgroupSizeControlFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceSubgroupSizeControlFeatures( VkPhysicalDeviceSubgroupSizeControlFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceSubgroupSizeControlFeatures( *reinterpret_cast<PhysicalDeviceSubgroupSizeControlFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceSubgroupSizeControlFeatures & operator=( PhysicalDeviceSubgroupSizeControlFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceSubgroupSizeControlFeatures & operator=( VkPhysicalDeviceSubgroupSizeControlFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupSizeControlFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSubgroupSizeControlFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSubgroupSizeControlFeatures &\n      setSubgroupSizeControl( VULKAN_HPP_NAMESPACE::Bool32 subgroupSizeControl_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subgroupSizeControl = subgroupSizeControl_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSubgroupSizeControlFeatures &\n      setComputeFullSubgroups( VULKAN_HPP_NAMESPACE::Bool32 computeFullSubgroups_ ) VULKAN_HPP_NOEXCEPT\n    {\n      computeFullSubgroups = computeFullSubgroups_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceSubgroupSizeControlFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceSubgroupSizeControlFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, subgroupSizeControl, computeFullSubgroups );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceSubgroupSizeControlFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceSubgroupSizeControlFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( subgroupSizeControl == rhs.subgroupSizeControl ) &&\n             ( computeFullSubgroups == rhs.computeFullSubgroups );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceSubgroupSizeControlFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                = StructureType::ePhysicalDeviceSubgroupSizeControlFeatures;\n    void *                              pNext                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        subgroupSizeControl  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        computeFullSubgroups = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceSubgroupSizeControlFeatures>\n  {\n    using Type = PhysicalDeviceSubgroupSizeControlFeatures;\n  };\n\n  using PhysicalDeviceSubgroupSizeControlFeaturesEXT = PhysicalDeviceSubgroupSizeControlFeatures;\n\n  struct PhysicalDeviceSubgroupSizeControlProperties\n  {\n    using NativeType = VkPhysicalDeviceSubgroupSizeControlProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceSubgroupSizeControlProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSubgroupSizeControlProperties( uint32_t                               minSubgroupSize_              = {},\n                                                                      uint32_t                               maxSubgroupSize_              = {},\n                                                                      uint32_t                               maxComputeWorkgroupSubgroups_ = {},\n                                                                      VULKAN_HPP_NAMESPACE::ShaderStageFlags requiredSubgroupSizeStages_   = {},\n                                                                      void *                                 pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , minSubgroupSize{ minSubgroupSize_ }\n      , maxSubgroupSize{ maxSubgroupSize_ }\n      , maxComputeWorkgroupSubgroups{ maxComputeWorkgroupSubgroups_ }\n      , requiredSubgroupSizeStages{ requiredSubgroupSizeStages_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSubgroupSizeControlProperties( PhysicalDeviceSubgroupSizeControlProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceSubgroupSizeControlProperties( VkPhysicalDeviceSubgroupSizeControlProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceSubgroupSizeControlProperties( *reinterpret_cast<PhysicalDeviceSubgroupSizeControlProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceSubgroupSizeControlProperties & operator=( PhysicalDeviceSubgroupSizeControlProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceSubgroupSizeControlProperties & operator=( VkPhysicalDeviceSubgroupSizeControlProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupSizeControlProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceSubgroupSizeControlProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlProperties *>( this );\n    }\n\n    operator VkPhysicalDeviceSubgroupSizeControlProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ShaderStageFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, minSubgroupSize, maxSubgroupSize, maxComputeWorkgroupSubgroups, requiredSubgroupSizeStages );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceSubgroupSizeControlProperties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceSubgroupSizeControlProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( minSubgroupSize == rhs.minSubgroupSize ) && ( maxSubgroupSize == rhs.maxSubgroupSize ) &&\n             ( maxComputeWorkgroupSubgroups == rhs.maxComputeWorkgroupSubgroups ) && ( requiredSubgroupSizeStages == rhs.requiredSubgroupSizeStages );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceSubgroupSizeControlProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType                        = StructureType::ePhysicalDeviceSubgroupSizeControlProperties;\n    void *                                 pNext                        = {};\n    uint32_t                               minSubgroupSize              = {};\n    uint32_t                               maxSubgroupSize              = {};\n    uint32_t                               maxComputeWorkgroupSubgroups = {};\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags requiredSubgroupSizeStages   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceSubgroupSizeControlProperties>\n  {\n    using Type = PhysicalDeviceSubgroupSizeControlProperties;\n  };\n\n  using PhysicalDeviceSubgroupSizeControlPropertiesEXT = PhysicalDeviceSubgroupSizeControlProperties;\n\n  struct PhysicalDeviceSubpassMergeFeedbackFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceSubpassMergeFeedbackFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSubpassMergeFeedbackFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 subpassMergeFeedback_ = {},\n                                                                        void *                       pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , subpassMergeFeedback{ subpassMergeFeedback_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceSubpassMergeFeedbackFeaturesEXT( PhysicalDeviceSubpassMergeFeedbackFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceSubpassMergeFeedbackFeaturesEXT( VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceSubpassMergeFeedbackFeaturesEXT( *reinterpret_cast<PhysicalDeviceSubpassMergeFeedbackFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceSubpassMergeFeedbackFeaturesEXT & operator=( PhysicalDeviceSubpassMergeFeedbackFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceSubpassMergeFeedbackFeaturesEXT & operator=( VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubpassMergeFeedbackFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSubpassMergeFeedbackFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSubpassMergeFeedbackFeaturesEXT &\n      setSubpassMergeFeedback( VULKAN_HPP_NAMESPACE::Bool32 subpassMergeFeedback_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subpassMergeFeedback = subpassMergeFeedback_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, subpassMergeFeedback );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceSubpassMergeFeedbackFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceSubpassMergeFeedbackFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( subpassMergeFeedback == rhs.subpassMergeFeedback );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceSubpassMergeFeedbackFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                = StructureType::ePhysicalDeviceSubpassMergeFeedbackFeaturesEXT;\n    void *                              pNext                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        subpassMergeFeedback = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceSubpassMergeFeedbackFeaturesEXT>\n  {\n    using Type = PhysicalDeviceSubpassMergeFeedbackFeaturesEXT;\n  };\n\n  struct PhysicalDeviceSubpassShadingFeaturesHUAWEI\n  {\n    using NativeType = VkPhysicalDeviceSubpassShadingFeaturesHUAWEI;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceSubpassShadingFeaturesHUAWEI;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSubpassShadingFeaturesHUAWEI( VULKAN_HPP_NAMESPACE::Bool32 subpassShading_ = {},\n                                                                     void *                       pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , subpassShading{ subpassShading_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSubpassShadingFeaturesHUAWEI( PhysicalDeviceSubpassShadingFeaturesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceSubpassShadingFeaturesHUAWEI( VkPhysicalDeviceSubpassShadingFeaturesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceSubpassShadingFeaturesHUAWEI( *reinterpret_cast<PhysicalDeviceSubpassShadingFeaturesHUAWEI const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceSubpassShadingFeaturesHUAWEI & operator=( PhysicalDeviceSubpassShadingFeaturesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceSubpassShadingFeaturesHUAWEI & operator=( VkPhysicalDeviceSubpassShadingFeaturesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubpassShadingFeaturesHUAWEI const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSubpassShadingFeaturesHUAWEI & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSubpassShadingFeaturesHUAWEI & setSubpassShading( VULKAN_HPP_NAMESPACE::Bool32 subpassShading_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subpassShading = subpassShading_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceSubpassShadingFeaturesHUAWEI const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceSubpassShadingFeaturesHUAWEI *>( this );\n    }\n\n    operator VkPhysicalDeviceSubpassShadingFeaturesHUAWEI &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceSubpassShadingFeaturesHUAWEI *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, subpassShading );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceSubpassShadingFeaturesHUAWEI const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceSubpassShadingFeaturesHUAWEI const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( subpassShading == rhs.subpassShading );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceSubpassShadingFeaturesHUAWEI const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::ePhysicalDeviceSubpassShadingFeaturesHUAWEI;\n    void *                              pNext          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        subpassShading = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceSubpassShadingFeaturesHUAWEI>\n  {\n    using Type = PhysicalDeviceSubpassShadingFeaturesHUAWEI;\n  };\n\n  struct PhysicalDeviceSubpassShadingPropertiesHUAWEI\n  {\n    using NativeType = VkPhysicalDeviceSubpassShadingPropertiesHUAWEI;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceSubpassShadingPropertiesHUAWEI;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSubpassShadingPropertiesHUAWEI( uint32_t maxSubpassShadingWorkgroupSizeAspectRatio_ = {},\n                                                                       void *   pNext_                                     = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxSubpassShadingWorkgroupSizeAspectRatio{ maxSubpassShadingWorkgroupSizeAspectRatio_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSubpassShadingPropertiesHUAWEI( PhysicalDeviceSubpassShadingPropertiesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceSubpassShadingPropertiesHUAWEI( VkPhysicalDeviceSubpassShadingPropertiesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceSubpassShadingPropertiesHUAWEI( *reinterpret_cast<PhysicalDeviceSubpassShadingPropertiesHUAWEI const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceSubpassShadingPropertiesHUAWEI & operator=( PhysicalDeviceSubpassShadingPropertiesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceSubpassShadingPropertiesHUAWEI & operator=( VkPhysicalDeviceSubpassShadingPropertiesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubpassShadingPropertiesHUAWEI const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceSubpassShadingPropertiesHUAWEI const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceSubpassShadingPropertiesHUAWEI *>( this );\n    }\n\n    operator VkPhysicalDeviceSubpassShadingPropertiesHUAWEI &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceSubpassShadingPropertiesHUAWEI *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxSubpassShadingWorkgroupSizeAspectRatio );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceSubpassShadingPropertiesHUAWEI const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceSubpassShadingPropertiesHUAWEI const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxSubpassShadingWorkgroupSizeAspectRatio == rhs.maxSubpassShadingWorkgroupSizeAspectRatio );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceSubpassShadingPropertiesHUAWEI const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                     = StructureType::ePhysicalDeviceSubpassShadingPropertiesHUAWEI;\n    void *                              pNext                                     = {};\n    uint32_t                            maxSubpassShadingWorkgroupSizeAspectRatio = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceSubpassShadingPropertiesHUAWEI>\n  {\n    using Type = PhysicalDeviceSubpassShadingPropertiesHUAWEI;\n  };\n\n  struct PhysicalDeviceSurfaceInfo2KHR\n  {\n    using NativeType = VkPhysicalDeviceSurfaceInfo2KHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceSurfaceInfo2KHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSurfaceInfo2KHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , surface{ surface_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSurfaceInfo2KHR( PhysicalDeviceSurfaceInfo2KHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceSurfaceInfo2KHR( VkPhysicalDeviceSurfaceInfo2KHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceSurfaceInfo2KHR( *reinterpret_cast<PhysicalDeviceSurfaceInfo2KHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceSurfaceInfo2KHR & operator=( PhysicalDeviceSurfaceInfo2KHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceSurfaceInfo2KHR & operator=( VkPhysicalDeviceSurfaceInfo2KHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSurfaceInfo2KHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSurfaceInfo2KHR & setSurface( VULKAN_HPP_NAMESPACE::SurfaceKHR surface_ ) VULKAN_HPP_NOEXCEPT\n    {\n      surface = surface_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceSurfaceInfo2KHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( this );\n    }\n\n    operator VkPhysicalDeviceSurfaceInfo2KHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceSurfaceInfo2KHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::SurfaceKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, surface );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceSurfaceInfo2KHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceSurfaceInfo2KHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( surface == rhs.surface );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceSurfaceInfo2KHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType   = StructureType::ePhysicalDeviceSurfaceInfo2KHR;\n    const void *                        pNext   = {};\n    VULKAN_HPP_NAMESPACE::SurfaceKHR    surface = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceSurfaceInfo2KHR>\n  {\n    using Type = PhysicalDeviceSurfaceInfo2KHR;\n  };\n\n  struct PhysicalDeviceSwapchainMaintenance1FeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceSwapchainMaintenance1FeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSwapchainMaintenance1FeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 swapchainMaintenance1_ = {},\n                                                                         void *                       pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , swapchainMaintenance1{ swapchainMaintenance1_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceSwapchainMaintenance1FeaturesEXT( PhysicalDeviceSwapchainMaintenance1FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceSwapchainMaintenance1FeaturesEXT( VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceSwapchainMaintenance1FeaturesEXT( *reinterpret_cast<PhysicalDeviceSwapchainMaintenance1FeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceSwapchainMaintenance1FeaturesEXT & operator=( PhysicalDeviceSwapchainMaintenance1FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceSwapchainMaintenance1FeaturesEXT & operator=( VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceSwapchainMaintenance1FeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSwapchainMaintenance1FeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSwapchainMaintenance1FeaturesEXT &\n      setSwapchainMaintenance1( VULKAN_HPP_NAMESPACE::Bool32 swapchainMaintenance1_ ) VULKAN_HPP_NOEXCEPT\n    {\n      swapchainMaintenance1 = swapchainMaintenance1_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, swapchainMaintenance1 );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceSwapchainMaintenance1FeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceSwapchainMaintenance1FeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( swapchainMaintenance1 == rhs.swapchainMaintenance1 );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceSwapchainMaintenance1FeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                 = StructureType::ePhysicalDeviceSwapchainMaintenance1FeaturesEXT;\n    void *                              pNext                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        swapchainMaintenance1 = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceSwapchainMaintenance1FeaturesEXT>\n  {\n    using Type = PhysicalDeviceSwapchainMaintenance1FeaturesEXT;\n  };\n\n  struct PhysicalDeviceSynchronization2Features\n  {\n    using NativeType = VkPhysicalDeviceSynchronization2Features;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceSynchronization2Features;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSynchronization2Features( VULKAN_HPP_NAMESPACE::Bool32 synchronization2_ = {},\n                                                                 void *                       pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , synchronization2{ synchronization2_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceSynchronization2Features( PhysicalDeviceSynchronization2Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceSynchronization2Features( VkPhysicalDeviceSynchronization2Features const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceSynchronization2Features( *reinterpret_cast<PhysicalDeviceSynchronization2Features const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceSynchronization2Features & operator=( PhysicalDeviceSynchronization2Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceSynchronization2Features & operator=( VkPhysicalDeviceSynchronization2Features const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceSynchronization2Features const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSynchronization2Features & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceSynchronization2Features & setSynchronization2( VULKAN_HPP_NAMESPACE::Bool32 synchronization2_ ) VULKAN_HPP_NOEXCEPT\n    {\n      synchronization2 = synchronization2_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceSynchronization2Features const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceSynchronization2Features *>( this );\n    }\n\n    operator VkPhysicalDeviceSynchronization2Features &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceSynchronization2Features *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, synchronization2 );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceSynchronization2Features const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceSynchronization2Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( synchronization2 == rhs.synchronization2 );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceSynchronization2Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType            = StructureType::ePhysicalDeviceSynchronization2Features;\n    void *                              pNext            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        synchronization2 = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceSynchronization2Features>\n  {\n    using Type = PhysicalDeviceSynchronization2Features;\n  };\n\n  using PhysicalDeviceSynchronization2FeaturesKHR = PhysicalDeviceSynchronization2Features;\n\n  struct PhysicalDeviceTexelBufferAlignmentFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceTexelBufferAlignmentFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceTexelBufferAlignmentFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 texelBufferAlignment_ = {},\n                                                                        void *                       pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , texelBufferAlignment{ texelBufferAlignment_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceTexelBufferAlignmentFeaturesEXT( PhysicalDeviceTexelBufferAlignmentFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceTexelBufferAlignmentFeaturesEXT( VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceTexelBufferAlignmentFeaturesEXT( *reinterpret_cast<PhysicalDeviceTexelBufferAlignmentFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceTexelBufferAlignmentFeaturesEXT & operator=( PhysicalDeviceTexelBufferAlignmentFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceTexelBufferAlignmentFeaturesEXT & operator=( VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceTexelBufferAlignmentFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceTexelBufferAlignmentFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceTexelBufferAlignmentFeaturesEXT &\n      setTexelBufferAlignment( VULKAN_HPP_NAMESPACE::Bool32 texelBufferAlignment_ ) VULKAN_HPP_NOEXCEPT\n    {\n      texelBufferAlignment = texelBufferAlignment_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, texelBufferAlignment );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceTexelBufferAlignmentFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceTexelBufferAlignmentFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( texelBufferAlignment == rhs.texelBufferAlignment );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceTexelBufferAlignmentFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                = StructureType::ePhysicalDeviceTexelBufferAlignmentFeaturesEXT;\n    void *                              pNext                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        texelBufferAlignment = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceTexelBufferAlignmentFeaturesEXT>\n  {\n    using Type = PhysicalDeviceTexelBufferAlignmentFeaturesEXT;\n  };\n\n  struct PhysicalDeviceTexelBufferAlignmentProperties\n  {\n    using NativeType = VkPhysicalDeviceTexelBufferAlignmentProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceTexelBufferAlignmentProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceTexelBufferAlignmentProperties( VULKAN_HPP_NAMESPACE::DeviceSize storageTexelBufferOffsetAlignmentBytes_       = {},\n                                                                       VULKAN_HPP_NAMESPACE::Bool32     storageTexelBufferOffsetSingleTexelAlignment_ = {},\n                                                                       VULKAN_HPP_NAMESPACE::DeviceSize uniformTexelBufferOffsetAlignmentBytes_       = {},\n                                                                       VULKAN_HPP_NAMESPACE::Bool32     uniformTexelBufferOffsetSingleTexelAlignment_ = {},\n                                                                       void *                           pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , storageTexelBufferOffsetAlignmentBytes{ storageTexelBufferOffsetAlignmentBytes_ }\n      , storageTexelBufferOffsetSingleTexelAlignment{ storageTexelBufferOffsetSingleTexelAlignment_ }\n      , uniformTexelBufferOffsetAlignmentBytes{ uniformTexelBufferOffsetAlignmentBytes_ }\n      , uniformTexelBufferOffsetSingleTexelAlignment{ uniformTexelBufferOffsetSingleTexelAlignment_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceTexelBufferAlignmentProperties( PhysicalDeviceTexelBufferAlignmentProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceTexelBufferAlignmentProperties( VkPhysicalDeviceTexelBufferAlignmentProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceTexelBufferAlignmentProperties( *reinterpret_cast<PhysicalDeviceTexelBufferAlignmentProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceTexelBufferAlignmentProperties & operator=( PhysicalDeviceTexelBufferAlignmentProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceTexelBufferAlignmentProperties & operator=( VkPhysicalDeviceTexelBufferAlignmentProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceTexelBufferAlignmentProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceTexelBufferAlignmentProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentProperties *>( this );\n    }\n\n    operator VkPhysicalDeviceTexelBufferAlignmentProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       storageTexelBufferOffsetAlignmentBytes,\n                       storageTexelBufferOffsetSingleTexelAlignment,\n                       uniformTexelBufferOffsetAlignmentBytes,\n                       uniformTexelBufferOffsetSingleTexelAlignment );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceTexelBufferAlignmentProperties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceTexelBufferAlignmentProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( storageTexelBufferOffsetAlignmentBytes == rhs.storageTexelBufferOffsetAlignmentBytes ) &&\n             ( storageTexelBufferOffsetSingleTexelAlignment == rhs.storageTexelBufferOffsetSingleTexelAlignment ) &&\n             ( uniformTexelBufferOffsetAlignmentBytes == rhs.uniformTexelBufferOffsetAlignmentBytes ) &&\n             ( uniformTexelBufferOffsetSingleTexelAlignment == rhs.uniformTexelBufferOffsetSingleTexelAlignment );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceTexelBufferAlignmentProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                        = StructureType::ePhysicalDeviceTexelBufferAlignmentProperties;\n    void *                              pNext                                        = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    storageTexelBufferOffsetAlignmentBytes       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        storageTexelBufferOffsetSingleTexelAlignment = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    uniformTexelBufferOffsetAlignmentBytes       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        uniformTexelBufferOffsetSingleTexelAlignment = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceTexelBufferAlignmentProperties>\n  {\n    using Type = PhysicalDeviceTexelBufferAlignmentProperties;\n  };\n\n  using PhysicalDeviceTexelBufferAlignmentPropertiesEXT = PhysicalDeviceTexelBufferAlignmentProperties;\n\n  struct PhysicalDeviceTextureCompressionASTCHDRFeatures\n  {\n    using NativeType = VkPhysicalDeviceTextureCompressionASTCHDRFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceTextureCompressionAstcHdrFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceTextureCompressionASTCHDRFeatures( VULKAN_HPP_NAMESPACE::Bool32 textureCompressionASTC_HDR_ = {},\n                                                                          void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , textureCompressionASTC_HDR{ textureCompressionASTC_HDR_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceTextureCompressionASTCHDRFeatures( PhysicalDeviceTextureCompressionASTCHDRFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceTextureCompressionASTCHDRFeatures( VkPhysicalDeviceTextureCompressionASTCHDRFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceTextureCompressionASTCHDRFeatures( *reinterpret_cast<PhysicalDeviceTextureCompressionASTCHDRFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceTextureCompressionASTCHDRFeatures & operator=( PhysicalDeviceTextureCompressionASTCHDRFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceTextureCompressionASTCHDRFeatures & operator=( VkPhysicalDeviceTextureCompressionASTCHDRFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceTextureCompressionASTCHDRFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceTextureCompressionASTCHDRFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceTextureCompressionASTCHDRFeatures &\n      setTextureCompressionASTC_HDR( VULKAN_HPP_NAMESPACE::Bool32 textureCompressionASTC_HDR_ ) VULKAN_HPP_NOEXCEPT\n    {\n      textureCompressionASTC_HDR = textureCompressionASTC_HDR_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceTextureCompressionASTCHDRFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceTextureCompressionASTCHDRFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceTextureCompressionASTCHDRFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceTextureCompressionASTCHDRFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, textureCompressionASTC_HDR );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceTextureCompressionASTCHDRFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceTextureCompressionASTCHDRFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( textureCompressionASTC_HDR == rhs.textureCompressionASTC_HDR );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceTextureCompressionASTCHDRFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                      = StructureType::ePhysicalDeviceTextureCompressionAstcHdrFeatures;\n    void *                              pNext                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        textureCompressionASTC_HDR = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceTextureCompressionAstcHdrFeatures>\n  {\n    using Type = PhysicalDeviceTextureCompressionASTCHDRFeatures;\n  };\n\n  using PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT = PhysicalDeviceTextureCompressionASTCHDRFeatures;\n\n  struct PhysicalDeviceTilePropertiesFeaturesQCOM\n  {\n    using NativeType = VkPhysicalDeviceTilePropertiesFeaturesQCOM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceTilePropertiesFeaturesQCOM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceTilePropertiesFeaturesQCOM( VULKAN_HPP_NAMESPACE::Bool32 tileProperties_ = {},\n                                                                   void *                       pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , tileProperties{ tileProperties_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceTilePropertiesFeaturesQCOM( PhysicalDeviceTilePropertiesFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceTilePropertiesFeaturesQCOM( VkPhysicalDeviceTilePropertiesFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceTilePropertiesFeaturesQCOM( *reinterpret_cast<PhysicalDeviceTilePropertiesFeaturesQCOM const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceTilePropertiesFeaturesQCOM & operator=( PhysicalDeviceTilePropertiesFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceTilePropertiesFeaturesQCOM & operator=( VkPhysicalDeviceTilePropertiesFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceTilePropertiesFeaturesQCOM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceTilePropertiesFeaturesQCOM & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceTilePropertiesFeaturesQCOM & setTileProperties( VULKAN_HPP_NAMESPACE::Bool32 tileProperties_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tileProperties = tileProperties_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceTilePropertiesFeaturesQCOM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceTilePropertiesFeaturesQCOM *>( this );\n    }\n\n    operator VkPhysicalDeviceTilePropertiesFeaturesQCOM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceTilePropertiesFeaturesQCOM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, tileProperties );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceTilePropertiesFeaturesQCOM const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceTilePropertiesFeaturesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( tileProperties == rhs.tileProperties );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceTilePropertiesFeaturesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::ePhysicalDeviceTilePropertiesFeaturesQCOM;\n    void *                              pNext          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        tileProperties = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceTilePropertiesFeaturesQCOM>\n  {\n    using Type = PhysicalDeviceTilePropertiesFeaturesQCOM;\n  };\n\n  struct PhysicalDeviceTimelineSemaphoreFeatures\n  {\n    using NativeType = VkPhysicalDeviceTimelineSemaphoreFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceTimelineSemaphoreFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceTimelineSemaphoreFeatures( VULKAN_HPP_NAMESPACE::Bool32 timelineSemaphore_ = {},\n                                                                  void *                       pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , timelineSemaphore{ timelineSemaphore_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceTimelineSemaphoreFeatures( PhysicalDeviceTimelineSemaphoreFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceTimelineSemaphoreFeatures( VkPhysicalDeviceTimelineSemaphoreFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceTimelineSemaphoreFeatures( *reinterpret_cast<PhysicalDeviceTimelineSemaphoreFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceTimelineSemaphoreFeatures & operator=( PhysicalDeviceTimelineSemaphoreFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceTimelineSemaphoreFeatures & operator=( VkPhysicalDeviceTimelineSemaphoreFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceTimelineSemaphoreFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceTimelineSemaphoreFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceTimelineSemaphoreFeatures &\n      setTimelineSemaphore( VULKAN_HPP_NAMESPACE::Bool32 timelineSemaphore_ ) VULKAN_HPP_NOEXCEPT\n    {\n      timelineSemaphore = timelineSemaphore_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceTimelineSemaphoreFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceTimelineSemaphoreFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, timelineSemaphore );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceTimelineSemaphoreFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceTimelineSemaphoreFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( timelineSemaphore == rhs.timelineSemaphore );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceTimelineSemaphoreFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType             = StructureType::ePhysicalDeviceTimelineSemaphoreFeatures;\n    void *                              pNext             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        timelineSemaphore = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceTimelineSemaphoreFeatures>\n  {\n    using Type = PhysicalDeviceTimelineSemaphoreFeatures;\n  };\n\n  using PhysicalDeviceTimelineSemaphoreFeaturesKHR = PhysicalDeviceTimelineSemaphoreFeatures;\n\n  struct PhysicalDeviceTimelineSemaphoreProperties\n  {\n    using NativeType = VkPhysicalDeviceTimelineSemaphoreProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceTimelineSemaphoreProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceTimelineSemaphoreProperties( uint64_t maxTimelineSemaphoreValueDifference_ = {},\n                                                                    void *   pNext_                               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxTimelineSemaphoreValueDifference{ maxTimelineSemaphoreValueDifference_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceTimelineSemaphoreProperties( PhysicalDeviceTimelineSemaphoreProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceTimelineSemaphoreProperties( VkPhysicalDeviceTimelineSemaphoreProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceTimelineSemaphoreProperties( *reinterpret_cast<PhysicalDeviceTimelineSemaphoreProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceTimelineSemaphoreProperties & operator=( PhysicalDeviceTimelineSemaphoreProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceTimelineSemaphoreProperties & operator=( VkPhysicalDeviceTimelineSemaphoreProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceTimelineSemaphoreProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceTimelineSemaphoreProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreProperties *>( this );\n    }\n\n    operator VkPhysicalDeviceTimelineSemaphoreProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxTimelineSemaphoreValueDifference );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceTimelineSemaphoreProperties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceTimelineSemaphoreProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxTimelineSemaphoreValueDifference == rhs.maxTimelineSemaphoreValueDifference );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceTimelineSemaphoreProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                               = StructureType::ePhysicalDeviceTimelineSemaphoreProperties;\n    void *                              pNext                               = {};\n    uint64_t                            maxTimelineSemaphoreValueDifference = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceTimelineSemaphoreProperties>\n  {\n    using Type = PhysicalDeviceTimelineSemaphoreProperties;\n  };\n\n  using PhysicalDeviceTimelineSemaphorePropertiesKHR = PhysicalDeviceTimelineSemaphoreProperties;\n\n  struct PhysicalDeviceToolProperties\n  {\n    using NativeType = VkPhysicalDeviceToolProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceToolProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceToolProperties( std::array<char, VK_MAX_EXTENSION_NAME_SIZE> const & name_        = {},\n                                                          std::array<char, VK_MAX_EXTENSION_NAME_SIZE> const & version_     = {},\n                                                          VULKAN_HPP_NAMESPACE::ToolPurposeFlags               purposes_    = {},\n                                                          std::array<char, VK_MAX_DESCRIPTION_SIZE> const &    description_ = {},\n                                                          std::array<char, VK_MAX_EXTENSION_NAME_SIZE> const & layer_       = {},\n                                                          void *                                               pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , name{ name_ }\n      , version{ version_ }\n      , purposes{ purposes_ }\n      , description{ description_ }\n      , layer{ layer_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceToolProperties( PhysicalDeviceToolProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceToolProperties( VkPhysicalDeviceToolProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceToolProperties( *reinterpret_cast<PhysicalDeviceToolProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceToolProperties & operator=( PhysicalDeviceToolProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceToolProperties & operator=( VkPhysicalDeviceToolProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceToolProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceToolProperties *>( this );\n    }\n\n    operator VkPhysicalDeviceToolProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceToolProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_EXTENSION_NAME_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_EXTENSION_NAME_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::ToolPurposeFlags const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_EXTENSION_NAME_SIZE> const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, name, version, purposes, description, layer );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( PhysicalDeviceToolProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = strcmp( name, rhs.name ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = strcmp( version, rhs.version ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = purposes <=> rhs.purposes; cmp != 0 )\n        return cmp;\n      if ( auto cmp = strcmp( description, rhs.description ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = strcmp( layer, rhs.layer ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( PhysicalDeviceToolProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( strcmp( name, rhs.name ) == 0 ) && ( strcmp( version, rhs.version ) == 0 ) &&\n             ( purposes == rhs.purposes ) && ( strcmp( description, rhs.description ) == 0 ) && ( strcmp( layer, rhs.layer ) == 0 );\n    }\n\n    bool operator!=( PhysicalDeviceToolProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                    sType       = StructureType::ePhysicalDeviceToolProperties;\n    void *                                                                 pNext       = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_EXTENSION_NAME_SIZE> name        = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_EXTENSION_NAME_SIZE> version     = {};\n    VULKAN_HPP_NAMESPACE::ToolPurposeFlags                                 purposes    = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE>    description = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_EXTENSION_NAME_SIZE> layer       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceToolProperties>\n  {\n    using Type = PhysicalDeviceToolProperties;\n  };\n\n  using PhysicalDeviceToolPropertiesEXT = PhysicalDeviceToolProperties;\n\n  struct PhysicalDeviceTransformFeedbackFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceTransformFeedbackFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceTransformFeedbackFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceTransformFeedbackFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 transformFeedback_ = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 geometryStreams_   = {},\n                                                                     void *                       pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , transformFeedback{ transformFeedback_ }\n      , geometryStreams{ geometryStreams_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceTransformFeedbackFeaturesEXT( PhysicalDeviceTransformFeedbackFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceTransformFeedbackFeaturesEXT( VkPhysicalDeviceTransformFeedbackFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceTransformFeedbackFeaturesEXT( *reinterpret_cast<PhysicalDeviceTransformFeedbackFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceTransformFeedbackFeaturesEXT & operator=( PhysicalDeviceTransformFeedbackFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceTransformFeedbackFeaturesEXT & operator=( VkPhysicalDeviceTransformFeedbackFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceTransformFeedbackFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceTransformFeedbackFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceTransformFeedbackFeaturesEXT &\n      setTransformFeedback( VULKAN_HPP_NAMESPACE::Bool32 transformFeedback_ ) VULKAN_HPP_NOEXCEPT\n    {\n      transformFeedback = transformFeedback_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceTransformFeedbackFeaturesEXT & setGeometryStreams( VULKAN_HPP_NAMESPACE::Bool32 geometryStreams_ ) VULKAN_HPP_NOEXCEPT\n    {\n      geometryStreams = geometryStreams_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceTransformFeedbackFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceTransformFeedbackFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceTransformFeedbackFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceTransformFeedbackFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, transformFeedback, geometryStreams );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceTransformFeedbackFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceTransformFeedbackFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( transformFeedback == rhs.transformFeedback ) && ( geometryStreams == rhs.geometryStreams );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceTransformFeedbackFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType             = StructureType::ePhysicalDeviceTransformFeedbackFeaturesEXT;\n    void *                              pNext             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        transformFeedback = {};\n    VULKAN_HPP_NAMESPACE::Bool32        geometryStreams   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceTransformFeedbackFeaturesEXT>\n  {\n    using Type = PhysicalDeviceTransformFeedbackFeaturesEXT;\n  };\n\n  struct PhysicalDeviceTransformFeedbackPropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceTransformFeedbackPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceTransformFeedbackPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceTransformFeedbackPropertiesEXT( uint32_t                         maxTransformFeedbackStreams_                = {},\n                                                                       uint32_t                         maxTransformFeedbackBuffers_                = {},\n                                                                       VULKAN_HPP_NAMESPACE::DeviceSize maxTransformFeedbackBufferSize_             = {},\n                                                                       uint32_t                         maxTransformFeedbackStreamDataSize_         = {},\n                                                                       uint32_t                         maxTransformFeedbackBufferDataSize_         = {},\n                                                                       uint32_t                         maxTransformFeedbackBufferDataStride_       = {},\n                                                                       VULKAN_HPP_NAMESPACE::Bool32     transformFeedbackQueries_                   = {},\n                                                                       VULKAN_HPP_NAMESPACE::Bool32     transformFeedbackStreamsLinesTriangles_     = {},\n                                                                       VULKAN_HPP_NAMESPACE::Bool32     transformFeedbackRasterizationStreamSelect_ = {},\n                                                                       VULKAN_HPP_NAMESPACE::Bool32     transformFeedbackDraw_                      = {},\n                                                                       void *                           pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxTransformFeedbackStreams{ maxTransformFeedbackStreams_ }\n      , maxTransformFeedbackBuffers{ maxTransformFeedbackBuffers_ }\n      , maxTransformFeedbackBufferSize{ maxTransformFeedbackBufferSize_ }\n      , maxTransformFeedbackStreamDataSize{ maxTransformFeedbackStreamDataSize_ }\n      , maxTransformFeedbackBufferDataSize{ maxTransformFeedbackBufferDataSize_ }\n      , maxTransformFeedbackBufferDataStride{ maxTransformFeedbackBufferDataStride_ }\n      , transformFeedbackQueries{ transformFeedbackQueries_ }\n      , transformFeedbackStreamsLinesTriangles{ transformFeedbackStreamsLinesTriangles_ }\n      , transformFeedbackRasterizationStreamSelect{ transformFeedbackRasterizationStreamSelect_ }\n      , transformFeedbackDraw{ transformFeedbackDraw_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceTransformFeedbackPropertiesEXT( PhysicalDeviceTransformFeedbackPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceTransformFeedbackPropertiesEXT( VkPhysicalDeviceTransformFeedbackPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceTransformFeedbackPropertiesEXT( *reinterpret_cast<PhysicalDeviceTransformFeedbackPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceTransformFeedbackPropertiesEXT & operator=( PhysicalDeviceTransformFeedbackPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceTransformFeedbackPropertiesEXT & operator=( VkPhysicalDeviceTransformFeedbackPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceTransformFeedbackPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceTransformFeedbackPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceTransformFeedbackPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceTransformFeedbackPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceTransformFeedbackPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       maxTransformFeedbackStreams,\n                       maxTransformFeedbackBuffers,\n                       maxTransformFeedbackBufferSize,\n                       maxTransformFeedbackStreamDataSize,\n                       maxTransformFeedbackBufferDataSize,\n                       maxTransformFeedbackBufferDataStride,\n                       transformFeedbackQueries,\n                       transformFeedbackStreamsLinesTriangles,\n                       transformFeedbackRasterizationStreamSelect,\n                       transformFeedbackDraw );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceTransformFeedbackPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceTransformFeedbackPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxTransformFeedbackStreams == rhs.maxTransformFeedbackStreams ) &&\n             ( maxTransformFeedbackBuffers == rhs.maxTransformFeedbackBuffers ) && ( maxTransformFeedbackBufferSize == rhs.maxTransformFeedbackBufferSize ) &&\n             ( maxTransformFeedbackStreamDataSize == rhs.maxTransformFeedbackStreamDataSize ) &&\n             ( maxTransformFeedbackBufferDataSize == rhs.maxTransformFeedbackBufferDataSize ) &&\n             ( maxTransformFeedbackBufferDataStride == rhs.maxTransformFeedbackBufferDataStride ) &&\n             ( transformFeedbackQueries == rhs.transformFeedbackQueries ) &&\n             ( transformFeedbackStreamsLinesTriangles == rhs.transformFeedbackStreamsLinesTriangles ) &&\n             ( transformFeedbackRasterizationStreamSelect == rhs.transformFeedbackRasterizationStreamSelect ) &&\n             ( transformFeedbackDraw == rhs.transformFeedbackDraw );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceTransformFeedbackPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                      = StructureType::ePhysicalDeviceTransformFeedbackPropertiesEXT;\n    void *                              pNext                                      = {};\n    uint32_t                            maxTransformFeedbackStreams                = {};\n    uint32_t                            maxTransformFeedbackBuffers                = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    maxTransformFeedbackBufferSize             = {};\n    uint32_t                            maxTransformFeedbackStreamDataSize         = {};\n    uint32_t                            maxTransformFeedbackBufferDataSize         = {};\n    uint32_t                            maxTransformFeedbackBufferDataStride       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        transformFeedbackQueries                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        transformFeedbackStreamsLinesTriangles     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        transformFeedbackRasterizationStreamSelect = {};\n    VULKAN_HPP_NAMESPACE::Bool32        transformFeedbackDraw                      = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceTransformFeedbackPropertiesEXT>\n  {\n    using Type = PhysicalDeviceTransformFeedbackPropertiesEXT;\n  };\n\n  struct PhysicalDeviceUniformBufferStandardLayoutFeatures\n  {\n    using NativeType = VkPhysicalDeviceUniformBufferStandardLayoutFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceUniformBufferStandardLayoutFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceUniformBufferStandardLayoutFeatures( VULKAN_HPP_NAMESPACE::Bool32 uniformBufferStandardLayout_ = {},\n                                                                            void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , uniformBufferStandardLayout{ uniformBufferStandardLayout_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceUniformBufferStandardLayoutFeatures( PhysicalDeviceUniformBufferStandardLayoutFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceUniformBufferStandardLayoutFeatures( VkPhysicalDeviceUniformBufferStandardLayoutFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceUniformBufferStandardLayoutFeatures( *reinterpret_cast<PhysicalDeviceUniformBufferStandardLayoutFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceUniformBufferStandardLayoutFeatures &\n      operator=( PhysicalDeviceUniformBufferStandardLayoutFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceUniformBufferStandardLayoutFeatures & operator=( VkPhysicalDeviceUniformBufferStandardLayoutFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceUniformBufferStandardLayoutFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceUniformBufferStandardLayoutFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceUniformBufferStandardLayoutFeatures &\n      setUniformBufferStandardLayout( VULKAN_HPP_NAMESPACE::Bool32 uniformBufferStandardLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      uniformBufferStandardLayout = uniformBufferStandardLayout_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceUniformBufferStandardLayoutFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceUniformBufferStandardLayoutFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceUniformBufferStandardLayoutFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceUniformBufferStandardLayoutFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, uniformBufferStandardLayout );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceUniformBufferStandardLayoutFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceUniformBufferStandardLayoutFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( uniformBufferStandardLayout == rhs.uniformBufferStandardLayout );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceUniformBufferStandardLayoutFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                       = StructureType::ePhysicalDeviceUniformBufferStandardLayoutFeatures;\n    void *                              pNext                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        uniformBufferStandardLayout = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceUniformBufferStandardLayoutFeatures>\n  {\n    using Type = PhysicalDeviceUniformBufferStandardLayoutFeatures;\n  };\n\n  using PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR = PhysicalDeviceUniformBufferStandardLayoutFeatures;\n\n  struct PhysicalDeviceVariablePointersFeatures\n  {\n    using NativeType = VkPhysicalDeviceVariablePointersFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceVariablePointersFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVariablePointersFeatures( VULKAN_HPP_NAMESPACE::Bool32 variablePointersStorageBuffer_ = {},\n                                                                 VULKAN_HPP_NAMESPACE::Bool32 variablePointers_              = {},\n                                                                 void *                       pNext_                         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , variablePointersStorageBuffer{ variablePointersStorageBuffer_ }\n      , variablePointers{ variablePointers_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVariablePointersFeatures( PhysicalDeviceVariablePointersFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceVariablePointersFeatures( VkPhysicalDeviceVariablePointersFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceVariablePointersFeatures( *reinterpret_cast<PhysicalDeviceVariablePointersFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceVariablePointersFeatures & operator=( PhysicalDeviceVariablePointersFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceVariablePointersFeatures & operator=( VkPhysicalDeviceVariablePointersFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceVariablePointersFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVariablePointersFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVariablePointersFeatures &\n      setVariablePointersStorageBuffer( VULKAN_HPP_NAMESPACE::Bool32 variablePointersStorageBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      variablePointersStorageBuffer = variablePointersStorageBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVariablePointersFeatures & setVariablePointers( VULKAN_HPP_NAMESPACE::Bool32 variablePointers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      variablePointers = variablePointers_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceVariablePointersFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceVariablePointersFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceVariablePointersFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceVariablePointersFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, variablePointersStorageBuffer, variablePointers );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceVariablePointersFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceVariablePointersFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( variablePointersStorageBuffer == rhs.variablePointersStorageBuffer ) &&\n             ( variablePointers == rhs.variablePointers );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceVariablePointersFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                         = StructureType::ePhysicalDeviceVariablePointersFeatures;\n    void *                              pNext                         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        variablePointersStorageBuffer = {};\n    VULKAN_HPP_NAMESPACE::Bool32        variablePointers              = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceVariablePointersFeatures>\n  {\n    using Type = PhysicalDeviceVariablePointersFeatures;\n  };\n\n  using PhysicalDeviceVariablePointerFeatures     = PhysicalDeviceVariablePointersFeatures;\n  using PhysicalDeviceVariablePointerFeaturesKHR  = PhysicalDeviceVariablePointersFeatures;\n  using PhysicalDeviceVariablePointersFeaturesKHR = PhysicalDeviceVariablePointersFeatures;\n\n  struct PhysicalDeviceVertexAttributeDivisorFeatures\n  {\n    using NativeType = VkPhysicalDeviceVertexAttributeDivisorFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceVertexAttributeDivisorFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVertexAttributeDivisorFeatures( VULKAN_HPP_NAMESPACE::Bool32 vertexAttributeInstanceRateDivisor_     = {},\n                                                                       VULKAN_HPP_NAMESPACE::Bool32 vertexAttributeInstanceRateZeroDivisor_ = {},\n                                                                       void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , vertexAttributeInstanceRateDivisor{ vertexAttributeInstanceRateDivisor_ }\n      , vertexAttributeInstanceRateZeroDivisor{ vertexAttributeInstanceRateZeroDivisor_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVertexAttributeDivisorFeatures( PhysicalDeviceVertexAttributeDivisorFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceVertexAttributeDivisorFeatures( VkPhysicalDeviceVertexAttributeDivisorFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceVertexAttributeDivisorFeatures( *reinterpret_cast<PhysicalDeviceVertexAttributeDivisorFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceVertexAttributeDivisorFeatures & operator=( PhysicalDeviceVertexAttributeDivisorFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceVertexAttributeDivisorFeatures & operator=( VkPhysicalDeviceVertexAttributeDivisorFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeDivisorFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVertexAttributeDivisorFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVertexAttributeDivisorFeatures &\n      setVertexAttributeInstanceRateDivisor( VULKAN_HPP_NAMESPACE::Bool32 vertexAttributeInstanceRateDivisor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexAttributeInstanceRateDivisor = vertexAttributeInstanceRateDivisor_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVertexAttributeDivisorFeatures &\n      setVertexAttributeInstanceRateZeroDivisor( VULKAN_HPP_NAMESPACE::Bool32 vertexAttributeInstanceRateZeroDivisor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexAttributeInstanceRateZeroDivisor = vertexAttributeInstanceRateZeroDivisor_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceVertexAttributeDivisorFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceVertexAttributeDivisorFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, vertexAttributeInstanceRateDivisor, vertexAttributeInstanceRateZeroDivisor );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceVertexAttributeDivisorFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceVertexAttributeDivisorFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( vertexAttributeInstanceRateDivisor == rhs.vertexAttributeInstanceRateDivisor ) &&\n             ( vertexAttributeInstanceRateZeroDivisor == rhs.vertexAttributeInstanceRateZeroDivisor );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceVertexAttributeDivisorFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                  = StructureType::ePhysicalDeviceVertexAttributeDivisorFeatures;\n    void *                              pNext                                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        vertexAttributeInstanceRateDivisor     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        vertexAttributeInstanceRateZeroDivisor = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceVertexAttributeDivisorFeatures>\n  {\n    using Type = PhysicalDeviceVertexAttributeDivisorFeatures;\n  };\n\n  using PhysicalDeviceVertexAttributeDivisorFeaturesEXT = PhysicalDeviceVertexAttributeDivisorFeatures;\n  using PhysicalDeviceVertexAttributeDivisorFeaturesKHR = PhysicalDeviceVertexAttributeDivisorFeatures;\n\n  struct PhysicalDeviceVertexAttributeDivisorProperties\n  {\n    using NativeType = VkPhysicalDeviceVertexAttributeDivisorProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceVertexAttributeDivisorProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVertexAttributeDivisorProperties( uint32_t                     maxVertexAttribDivisor_       = {},\n                                                                         VULKAN_HPP_NAMESPACE::Bool32 supportsNonZeroFirstInstance_ = {},\n                                                                         void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxVertexAttribDivisor{ maxVertexAttribDivisor_ }\n      , supportsNonZeroFirstInstance{ supportsNonZeroFirstInstance_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceVertexAttributeDivisorProperties( PhysicalDeviceVertexAttributeDivisorProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceVertexAttributeDivisorProperties( VkPhysicalDeviceVertexAttributeDivisorProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceVertexAttributeDivisorProperties( *reinterpret_cast<PhysicalDeviceVertexAttributeDivisorProperties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceVertexAttributeDivisorProperties & operator=( PhysicalDeviceVertexAttributeDivisorProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceVertexAttributeDivisorProperties & operator=( VkPhysicalDeviceVertexAttributeDivisorProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeDivisorProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceVertexAttributeDivisorProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorProperties *>( this );\n    }\n\n    operator VkPhysicalDeviceVertexAttributeDivisorProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxVertexAttribDivisor, supportsNonZeroFirstInstance );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceVertexAttributeDivisorProperties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceVertexAttributeDivisorProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxVertexAttribDivisor == rhs.maxVertexAttribDivisor ) &&\n             ( supportsNonZeroFirstInstance == rhs.supportsNonZeroFirstInstance );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceVertexAttributeDivisorProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                        = StructureType::ePhysicalDeviceVertexAttributeDivisorProperties;\n    void *                              pNext                        = {};\n    uint32_t                            maxVertexAttribDivisor       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        supportsNonZeroFirstInstance = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceVertexAttributeDivisorProperties>\n  {\n    using Type = PhysicalDeviceVertexAttributeDivisorProperties;\n  };\n\n  using PhysicalDeviceVertexAttributeDivisorPropertiesKHR = PhysicalDeviceVertexAttributeDivisorProperties;\n\n  struct PhysicalDeviceVertexAttributeDivisorPropertiesEXT\n  {\n    using NativeType = VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceVertexAttributeDivisorPropertiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVertexAttributeDivisorPropertiesEXT( uint32_t maxVertexAttribDivisor_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxVertexAttribDivisor{ maxVertexAttribDivisor_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceVertexAttributeDivisorPropertiesEXT( PhysicalDeviceVertexAttributeDivisorPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceVertexAttributeDivisorPropertiesEXT( VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceVertexAttributeDivisorPropertiesEXT( *reinterpret_cast<PhysicalDeviceVertexAttributeDivisorPropertiesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceVertexAttributeDivisorPropertiesEXT &\n      operator=( PhysicalDeviceVertexAttributeDivisorPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceVertexAttributeDivisorPropertiesEXT & operator=( VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeDivisorPropertiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxVertexAttribDivisor );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceVertexAttributeDivisorPropertiesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceVertexAttributeDivisorPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxVertexAttribDivisor == rhs.maxVertexAttribDivisor );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceVertexAttributeDivisorPropertiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                  = StructureType::ePhysicalDeviceVertexAttributeDivisorPropertiesEXT;\n    void *                              pNext                  = {};\n    uint32_t                            maxVertexAttribDivisor = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceVertexAttributeDivisorPropertiesEXT>\n  {\n    using Type = PhysicalDeviceVertexAttributeDivisorPropertiesEXT;\n  };\n\n  struct PhysicalDeviceVertexAttributeRobustnessFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceVertexAttributeRobustnessFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVertexAttributeRobustnessFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 vertexAttributeRobustness_ = {},\n                                                                             void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , vertexAttributeRobustness{ vertexAttributeRobustness_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceVertexAttributeRobustnessFeaturesEXT( PhysicalDeviceVertexAttributeRobustnessFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceVertexAttributeRobustnessFeaturesEXT( VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceVertexAttributeRobustnessFeaturesEXT( *reinterpret_cast<PhysicalDeviceVertexAttributeRobustnessFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceVertexAttributeRobustnessFeaturesEXT &\n      operator=( PhysicalDeviceVertexAttributeRobustnessFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceVertexAttributeRobustnessFeaturesEXT & operator=( VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeRobustnessFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVertexAttributeRobustnessFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVertexAttributeRobustnessFeaturesEXT &\n      setVertexAttributeRobustness( VULKAN_HPP_NAMESPACE::Bool32 vertexAttributeRobustness_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexAttributeRobustness = vertexAttributeRobustness_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, vertexAttributeRobustness );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceVertexAttributeRobustnessFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceVertexAttributeRobustnessFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( vertexAttributeRobustness == rhs.vertexAttributeRobustness );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceVertexAttributeRobustnessFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                     = StructureType::ePhysicalDeviceVertexAttributeRobustnessFeaturesEXT;\n    void *                              pNext                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        vertexAttributeRobustness = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceVertexAttributeRobustnessFeaturesEXT>\n  {\n    using Type = PhysicalDeviceVertexAttributeRobustnessFeaturesEXT;\n  };\n\n  struct PhysicalDeviceVertexInputDynamicStateFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceVertexInputDynamicStateFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVertexInputDynamicStateFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 vertexInputDynamicState_ = {},\n                                                                           void *                       pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , vertexInputDynamicState{ vertexInputDynamicState_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceVertexInputDynamicStateFeaturesEXT( PhysicalDeviceVertexInputDynamicStateFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceVertexInputDynamicStateFeaturesEXT( VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceVertexInputDynamicStateFeaturesEXT( *reinterpret_cast<PhysicalDeviceVertexInputDynamicStateFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceVertexInputDynamicStateFeaturesEXT & operator=( PhysicalDeviceVertexInputDynamicStateFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceVertexInputDynamicStateFeaturesEXT & operator=( VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexInputDynamicStateFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVertexInputDynamicStateFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVertexInputDynamicStateFeaturesEXT &\n      setVertexInputDynamicState( VULKAN_HPP_NAMESPACE::Bool32 vertexInputDynamicState_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexInputDynamicState = vertexInputDynamicState_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, vertexInputDynamicState );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceVertexInputDynamicStateFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceVertexInputDynamicStateFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( vertexInputDynamicState == rhs.vertexInputDynamicState );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceVertexInputDynamicStateFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                   = StructureType::ePhysicalDeviceVertexInputDynamicStateFeaturesEXT;\n    void *                              pNext                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        vertexInputDynamicState = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceVertexInputDynamicStateFeaturesEXT>\n  {\n    using Type = PhysicalDeviceVertexInputDynamicStateFeaturesEXT;\n  };\n\n  struct PhysicalDeviceVideoEncodeAV1FeaturesKHR\n  {\n    using NativeType = VkPhysicalDeviceVideoEncodeAV1FeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceVideoEncodeAv1FeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVideoEncodeAV1FeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 videoEncodeAV1_ = {},\n                                                                  void *                       pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , videoEncodeAV1{ videoEncodeAV1_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVideoEncodeAV1FeaturesKHR( PhysicalDeviceVideoEncodeAV1FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceVideoEncodeAV1FeaturesKHR( VkPhysicalDeviceVideoEncodeAV1FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceVideoEncodeAV1FeaturesKHR( *reinterpret_cast<PhysicalDeviceVideoEncodeAV1FeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceVideoEncodeAV1FeaturesKHR & operator=( PhysicalDeviceVideoEncodeAV1FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceVideoEncodeAV1FeaturesKHR & operator=( VkPhysicalDeviceVideoEncodeAV1FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeAV1FeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVideoEncodeAV1FeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVideoEncodeAV1FeaturesKHR & setVideoEncodeAV1( VULKAN_HPP_NAMESPACE::Bool32 videoEncodeAV1_ ) VULKAN_HPP_NOEXCEPT\n    {\n      videoEncodeAV1 = videoEncodeAV1_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceVideoEncodeAV1FeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceVideoEncodeAV1FeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceVideoEncodeAV1FeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceVideoEncodeAV1FeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, videoEncodeAV1 );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceVideoEncodeAV1FeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceVideoEncodeAV1FeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( videoEncodeAV1 == rhs.videoEncodeAV1 );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceVideoEncodeAV1FeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::ePhysicalDeviceVideoEncodeAv1FeaturesKHR;\n    void *                              pNext          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        videoEncodeAV1 = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceVideoEncodeAv1FeaturesKHR>\n  {\n    using Type = PhysicalDeviceVideoEncodeAV1FeaturesKHR;\n  };\n\n  struct VideoProfileInfoKHR\n  {\n    using NativeType = VkVideoProfileInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoProfileInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoProfileInfoKHR(\n      VULKAN_HPP_NAMESPACE::VideoCodecOperationFlagBitsKHR videoCodecOperation_ = VULKAN_HPP_NAMESPACE::VideoCodecOperationFlagBitsKHR::eNone,\n      VULKAN_HPP_NAMESPACE::VideoChromaSubsamplingFlagsKHR chromaSubsampling_   = {},\n      VULKAN_HPP_NAMESPACE::VideoComponentBitDepthFlagsKHR lumaBitDepth_        = {},\n      VULKAN_HPP_NAMESPACE::VideoComponentBitDepthFlagsKHR chromaBitDepth_      = {},\n      const void *                                         pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , videoCodecOperation{ videoCodecOperation_ }\n      , chromaSubsampling{ chromaSubsampling_ }\n      , lumaBitDepth{ lumaBitDepth_ }\n      , chromaBitDepth{ chromaBitDepth_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoProfileInfoKHR( VideoProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoProfileInfoKHR( VkVideoProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT : VideoProfileInfoKHR( *reinterpret_cast<VideoProfileInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoProfileInfoKHR & operator=( VideoProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoProfileInfoKHR & operator=( VkVideoProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoProfileInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoProfileInfoKHR &\n      setVideoCodecOperation( VULKAN_HPP_NAMESPACE::VideoCodecOperationFlagBitsKHR videoCodecOperation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      videoCodecOperation = videoCodecOperation_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoProfileInfoKHR &\n      setChromaSubsampling( VULKAN_HPP_NAMESPACE::VideoChromaSubsamplingFlagsKHR chromaSubsampling_ ) VULKAN_HPP_NOEXCEPT\n    {\n      chromaSubsampling = chromaSubsampling_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoProfileInfoKHR & setLumaBitDepth( VULKAN_HPP_NAMESPACE::VideoComponentBitDepthFlagsKHR lumaBitDepth_ ) VULKAN_HPP_NOEXCEPT\n    {\n      lumaBitDepth = lumaBitDepth_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoProfileInfoKHR & setChromaBitDepth( VULKAN_HPP_NAMESPACE::VideoComponentBitDepthFlagsKHR chromaBitDepth_ ) VULKAN_HPP_NOEXCEPT\n    {\n      chromaBitDepth = chromaBitDepth_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoProfileInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoProfileInfoKHR *>( this );\n    }\n\n    operator VkVideoProfileInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoProfileInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::VideoCodecOperationFlagBitsKHR const &,\n               VULKAN_HPP_NAMESPACE::VideoChromaSubsamplingFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::VideoComponentBitDepthFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::VideoComponentBitDepthFlagsKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, videoCodecOperation, chromaSubsampling, lumaBitDepth, chromaBitDepth );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoProfileInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoProfileInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( videoCodecOperation == rhs.videoCodecOperation ) &&\n             ( chromaSubsampling == rhs.chromaSubsampling ) && ( lumaBitDepth == rhs.lumaBitDepth ) && ( chromaBitDepth == rhs.chromaBitDepth );\n#  endif\n    }\n\n    bool operator!=( VideoProfileInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                  sType               = StructureType::eVideoProfileInfoKHR;\n    const void *                                         pNext               = {};\n    VULKAN_HPP_NAMESPACE::VideoCodecOperationFlagBitsKHR videoCodecOperation = VULKAN_HPP_NAMESPACE::VideoCodecOperationFlagBitsKHR::eNone;\n    VULKAN_HPP_NAMESPACE::VideoChromaSubsamplingFlagsKHR chromaSubsampling   = {};\n    VULKAN_HPP_NAMESPACE::VideoComponentBitDepthFlagsKHR lumaBitDepth        = {};\n    VULKAN_HPP_NAMESPACE::VideoComponentBitDepthFlagsKHR chromaBitDepth      = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoProfileInfoKHR>\n  {\n    using Type = VideoProfileInfoKHR;\n  };\n\n  struct PhysicalDeviceVideoEncodeQualityLevelInfoKHR\n  {\n    using NativeType = VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceVideoEncodeQualityLevelInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVideoEncodeQualityLevelInfoKHR( const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR * pVideoProfile_ = {},\n                                                                       uint32_t                                          qualityLevel_  = {},\n                                                                       const void *                                      pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pVideoProfile{ pVideoProfile_ }\n      , qualityLevel{ qualityLevel_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVideoEncodeQualityLevelInfoKHR( PhysicalDeviceVideoEncodeQualityLevelInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceVideoEncodeQualityLevelInfoKHR( VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceVideoEncodeQualityLevelInfoKHR( *reinterpret_cast<PhysicalDeviceVideoEncodeQualityLevelInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceVideoEncodeQualityLevelInfoKHR & operator=( PhysicalDeviceVideoEncodeQualityLevelInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceVideoEncodeQualityLevelInfoKHR & operator=( VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeQualityLevelInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVideoEncodeQualityLevelInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVideoEncodeQualityLevelInfoKHR &\n      setPVideoProfile( const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR * pVideoProfile_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pVideoProfile = pVideoProfile_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVideoEncodeQualityLevelInfoKHR & setQualityLevel( uint32_t qualityLevel_ ) VULKAN_HPP_NOEXCEPT\n    {\n      qualityLevel = qualityLevel_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pVideoProfile, qualityLevel );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceVideoEncodeQualityLevelInfoKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceVideoEncodeQualityLevelInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pVideoProfile == rhs.pVideoProfile ) && ( qualityLevel == rhs.qualityLevel );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceVideoEncodeQualityLevelInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType         = StructureType::ePhysicalDeviceVideoEncodeQualityLevelInfoKHR;\n    const void *                                      pNext         = {};\n    const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR * pVideoProfile = {};\n    uint32_t                                          qualityLevel  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceVideoEncodeQualityLevelInfoKHR>\n  {\n    using Type = PhysicalDeviceVideoEncodeQualityLevelInfoKHR;\n  };\n\n  struct PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR\n  {\n    using NativeType = VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 videoEncodeQuantizationMap_ = {},\n                                                                              void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , videoEncodeQuantizationMap{ videoEncodeQuantizationMap_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR( PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR( VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR( *reinterpret_cast<PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR &\n      operator=( PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR & operator=( VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR &\n      setVideoEncodeQuantizationMap( VULKAN_HPP_NAMESPACE::Bool32 videoEncodeQuantizationMap_ ) VULKAN_HPP_NOEXCEPT\n    {\n      videoEncodeQuantizationMap = videoEncodeQuantizationMap_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, videoEncodeQuantizationMap );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( videoEncodeQuantizationMap == rhs.videoEncodeQuantizationMap );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                      = StructureType::ePhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR;\n    void *                              pNext                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        videoEncodeQuantizationMap = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR>\n  {\n    using Type = PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR;\n  };\n\n  struct PhysicalDeviceVideoFormatInfoKHR\n  {\n    using NativeType = VkPhysicalDeviceVideoFormatInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceVideoFormatInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVideoFormatInfoKHR( VULKAN_HPP_NAMESPACE::ImageUsageFlags imageUsage_ = {},\n                                                           const void *                          pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , imageUsage{ imageUsage_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVideoFormatInfoKHR( PhysicalDeviceVideoFormatInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceVideoFormatInfoKHR( VkPhysicalDeviceVideoFormatInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceVideoFormatInfoKHR( *reinterpret_cast<PhysicalDeviceVideoFormatInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceVideoFormatInfoKHR & operator=( PhysicalDeviceVideoFormatInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceVideoFormatInfoKHR & operator=( VkPhysicalDeviceVideoFormatInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVideoFormatInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVideoFormatInfoKHR & setImageUsage( VULKAN_HPP_NAMESPACE::ImageUsageFlags imageUsage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageUsage = imageUsage_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceVideoFormatInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceVideoFormatInfoKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceVideoFormatInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceVideoFormatInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ImageUsageFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, imageUsage );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceVideoFormatInfoKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceVideoFormatInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( imageUsage == rhs.imageUsage );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceVideoFormatInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType   sType      = StructureType::ePhysicalDeviceVideoFormatInfoKHR;\n    const void *                          pNext      = {};\n    VULKAN_HPP_NAMESPACE::ImageUsageFlags imageUsage = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceVideoFormatInfoKHR>\n  {\n    using Type = PhysicalDeviceVideoFormatInfoKHR;\n  };\n\n  struct PhysicalDeviceVideoMaintenance1FeaturesKHR\n  {\n    using NativeType = VkPhysicalDeviceVideoMaintenance1FeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceVideoMaintenance1FeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVideoMaintenance1FeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 videoMaintenance1_ = {},\n                                                                     void *                       pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , videoMaintenance1{ videoMaintenance1_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVideoMaintenance1FeaturesKHR( PhysicalDeviceVideoMaintenance1FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceVideoMaintenance1FeaturesKHR( VkPhysicalDeviceVideoMaintenance1FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceVideoMaintenance1FeaturesKHR( *reinterpret_cast<PhysicalDeviceVideoMaintenance1FeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceVideoMaintenance1FeaturesKHR & operator=( PhysicalDeviceVideoMaintenance1FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceVideoMaintenance1FeaturesKHR & operator=( VkPhysicalDeviceVideoMaintenance1FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoMaintenance1FeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVideoMaintenance1FeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVideoMaintenance1FeaturesKHR &\n      setVideoMaintenance1( VULKAN_HPP_NAMESPACE::Bool32 videoMaintenance1_ ) VULKAN_HPP_NOEXCEPT\n    {\n      videoMaintenance1 = videoMaintenance1_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceVideoMaintenance1FeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceVideoMaintenance1FeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceVideoMaintenance1FeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceVideoMaintenance1FeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, videoMaintenance1 );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceVideoMaintenance1FeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceVideoMaintenance1FeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( videoMaintenance1 == rhs.videoMaintenance1 );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceVideoMaintenance1FeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType             = StructureType::ePhysicalDeviceVideoMaintenance1FeaturesKHR;\n    void *                              pNext             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        videoMaintenance1 = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceVideoMaintenance1FeaturesKHR>\n  {\n    using Type = PhysicalDeviceVideoMaintenance1FeaturesKHR;\n  };\n\n  struct PhysicalDeviceVideoMaintenance2FeaturesKHR\n  {\n    using NativeType = VkPhysicalDeviceVideoMaintenance2FeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceVideoMaintenance2FeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVideoMaintenance2FeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 videoMaintenance2_ = {},\n                                                                     void *                       pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , videoMaintenance2{ videoMaintenance2_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVideoMaintenance2FeaturesKHR( PhysicalDeviceVideoMaintenance2FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceVideoMaintenance2FeaturesKHR( VkPhysicalDeviceVideoMaintenance2FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceVideoMaintenance2FeaturesKHR( *reinterpret_cast<PhysicalDeviceVideoMaintenance2FeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceVideoMaintenance2FeaturesKHR & operator=( PhysicalDeviceVideoMaintenance2FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceVideoMaintenance2FeaturesKHR & operator=( VkPhysicalDeviceVideoMaintenance2FeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoMaintenance2FeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVideoMaintenance2FeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVideoMaintenance2FeaturesKHR &\n      setVideoMaintenance2( VULKAN_HPP_NAMESPACE::Bool32 videoMaintenance2_ ) VULKAN_HPP_NOEXCEPT\n    {\n      videoMaintenance2 = videoMaintenance2_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceVideoMaintenance2FeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceVideoMaintenance2FeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceVideoMaintenance2FeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceVideoMaintenance2FeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, videoMaintenance2 );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceVideoMaintenance2FeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceVideoMaintenance2FeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( videoMaintenance2 == rhs.videoMaintenance2 );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceVideoMaintenance2FeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType             = StructureType::ePhysicalDeviceVideoMaintenance2FeaturesKHR;\n    void *                              pNext             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        videoMaintenance2 = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceVideoMaintenance2FeaturesKHR>\n  {\n    using Type = PhysicalDeviceVideoMaintenance2FeaturesKHR;\n  };\n\n  struct PhysicalDeviceVulkan11Features\n  {\n    using NativeType = VkPhysicalDeviceVulkan11Features;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceVulkan11Features;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVulkan11Features( VULKAN_HPP_NAMESPACE::Bool32 storageBuffer16BitAccess_           = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 uniformAndStorageBuffer16BitAccess_ = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 storagePushConstant16_              = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 storageInputOutput16_               = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 multiview_                          = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 multiviewGeometryShader_            = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 multiviewTessellationShader_        = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 variablePointersStorageBuffer_      = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 variablePointers_                   = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 protectedMemory_                    = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 samplerYcbcrConversion_             = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderDrawParameters_               = {},\n                                                         void *                       pNext_                              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , storageBuffer16BitAccess{ storageBuffer16BitAccess_ }\n      , uniformAndStorageBuffer16BitAccess{ uniformAndStorageBuffer16BitAccess_ }\n      , storagePushConstant16{ storagePushConstant16_ }\n      , storageInputOutput16{ storageInputOutput16_ }\n      , multiview{ multiview_ }\n      , multiviewGeometryShader{ multiviewGeometryShader_ }\n      , multiviewTessellationShader{ multiviewTessellationShader_ }\n      , variablePointersStorageBuffer{ variablePointersStorageBuffer_ }\n      , variablePointers{ variablePointers_ }\n      , protectedMemory{ protectedMemory_ }\n      , samplerYcbcrConversion{ samplerYcbcrConversion_ }\n      , shaderDrawParameters{ shaderDrawParameters_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVulkan11Features( PhysicalDeviceVulkan11Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceVulkan11Features( VkPhysicalDeviceVulkan11Features const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceVulkan11Features( *reinterpret_cast<PhysicalDeviceVulkan11Features const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceVulkan11Features & operator=( PhysicalDeviceVulkan11Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceVulkan11Features & operator=( VkPhysicalDeviceVulkan11Features const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan11Features const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan11Features & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan11Features &\n      setStorageBuffer16BitAccess( VULKAN_HPP_NAMESPACE::Bool32 storageBuffer16BitAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      storageBuffer16BitAccess = storageBuffer16BitAccess_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan11Features &\n      setUniformAndStorageBuffer16BitAccess( VULKAN_HPP_NAMESPACE::Bool32 uniformAndStorageBuffer16BitAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      uniformAndStorageBuffer16BitAccess = uniformAndStorageBuffer16BitAccess_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan11Features & setStoragePushConstant16( VULKAN_HPP_NAMESPACE::Bool32 storagePushConstant16_ ) VULKAN_HPP_NOEXCEPT\n    {\n      storagePushConstant16 = storagePushConstant16_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan11Features & setStorageInputOutput16( VULKAN_HPP_NAMESPACE::Bool32 storageInputOutput16_ ) VULKAN_HPP_NOEXCEPT\n    {\n      storageInputOutput16 = storageInputOutput16_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan11Features & setMultiview( VULKAN_HPP_NAMESPACE::Bool32 multiview_ ) VULKAN_HPP_NOEXCEPT\n    {\n      multiview = multiview_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan11Features &\n      setMultiviewGeometryShader( VULKAN_HPP_NAMESPACE::Bool32 multiviewGeometryShader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      multiviewGeometryShader = multiviewGeometryShader_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan11Features &\n      setMultiviewTessellationShader( VULKAN_HPP_NAMESPACE::Bool32 multiviewTessellationShader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      multiviewTessellationShader = multiviewTessellationShader_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan11Features &\n      setVariablePointersStorageBuffer( VULKAN_HPP_NAMESPACE::Bool32 variablePointersStorageBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      variablePointersStorageBuffer = variablePointersStorageBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan11Features & setVariablePointers( VULKAN_HPP_NAMESPACE::Bool32 variablePointers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      variablePointers = variablePointers_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan11Features & setProtectedMemory( VULKAN_HPP_NAMESPACE::Bool32 protectedMemory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      protectedMemory = protectedMemory_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan11Features &\n      setSamplerYcbcrConversion( VULKAN_HPP_NAMESPACE::Bool32 samplerYcbcrConversion_ ) VULKAN_HPP_NOEXCEPT\n    {\n      samplerYcbcrConversion = samplerYcbcrConversion_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan11Features & setShaderDrawParameters( VULKAN_HPP_NAMESPACE::Bool32 shaderDrawParameters_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderDrawParameters = shaderDrawParameters_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceVulkan11Features const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceVulkan11Features *>( this );\n    }\n\n    operator VkPhysicalDeviceVulkan11Features &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceVulkan11Features *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       storageBuffer16BitAccess,\n                       uniformAndStorageBuffer16BitAccess,\n                       storagePushConstant16,\n                       storageInputOutput16,\n                       multiview,\n                       multiviewGeometryShader,\n                       multiviewTessellationShader,\n                       variablePointersStorageBuffer,\n                       variablePointers,\n                       protectedMemory,\n                       samplerYcbcrConversion,\n                       shaderDrawParameters );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceVulkan11Features const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceVulkan11Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( storageBuffer16BitAccess == rhs.storageBuffer16BitAccess ) &&\n             ( uniformAndStorageBuffer16BitAccess == rhs.uniformAndStorageBuffer16BitAccess ) && ( storagePushConstant16 == rhs.storagePushConstant16 ) &&\n             ( storageInputOutput16 == rhs.storageInputOutput16 ) && ( multiview == rhs.multiview ) &&\n             ( multiviewGeometryShader == rhs.multiviewGeometryShader ) && ( multiviewTessellationShader == rhs.multiviewTessellationShader ) &&\n             ( variablePointersStorageBuffer == rhs.variablePointersStorageBuffer ) && ( variablePointers == rhs.variablePointers ) &&\n             ( protectedMemory == rhs.protectedMemory ) && ( samplerYcbcrConversion == rhs.samplerYcbcrConversion ) &&\n             ( shaderDrawParameters == rhs.shaderDrawParameters );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceVulkan11Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                              = StructureType::ePhysicalDeviceVulkan11Features;\n    void *                              pNext                              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        storageBuffer16BitAccess           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        uniformAndStorageBuffer16BitAccess = {};\n    VULKAN_HPP_NAMESPACE::Bool32        storagePushConstant16              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        storageInputOutput16               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        multiview                          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        multiviewGeometryShader            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        multiviewTessellationShader        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        variablePointersStorageBuffer      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        variablePointers                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        protectedMemory                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        samplerYcbcrConversion             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderDrawParameters               = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceVulkan11Features>\n  {\n    using Type = PhysicalDeviceVulkan11Features;\n  };\n\n  struct PhysicalDeviceVulkan11Properties\n  {\n    using NativeType = VkPhysicalDeviceVulkan11Properties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceVulkan11Properties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan11Properties(\n      std::array<uint8_t, VK_UUID_SIZE> const &   deviceUUID_                        = {},\n      std::array<uint8_t, VK_UUID_SIZE> const &   driverUUID_                        = {},\n      std::array<uint8_t, VK_LUID_SIZE> const &   deviceLUID_                        = {},\n      uint32_t                                    deviceNodeMask_                    = {},\n      VULKAN_HPP_NAMESPACE::Bool32                deviceLUIDValid_                   = {},\n      uint32_t                                    subgroupSize_                      = {},\n      VULKAN_HPP_NAMESPACE::ShaderStageFlags      subgroupSupportedStages_           = {},\n      VULKAN_HPP_NAMESPACE::SubgroupFeatureFlags  subgroupSupportedOperations_       = {},\n      VULKAN_HPP_NAMESPACE::Bool32                subgroupQuadOperationsInAllStages_ = {},\n      VULKAN_HPP_NAMESPACE::PointClippingBehavior pointClippingBehavior_             = VULKAN_HPP_NAMESPACE::PointClippingBehavior::eAllClipPlanes,\n      uint32_t                                    maxMultiviewViewCount_             = {},\n      uint32_t                                    maxMultiviewInstanceIndex_         = {},\n      VULKAN_HPP_NAMESPACE::Bool32                protectedNoFault_                  = {},\n      uint32_t                                    maxPerSetDescriptors_              = {},\n      VULKAN_HPP_NAMESPACE::DeviceSize            maxMemoryAllocationSize_           = {},\n      void *                                      pNext_                             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , deviceUUID{ deviceUUID_ }\n      , driverUUID{ driverUUID_ }\n      , deviceLUID{ deviceLUID_ }\n      , deviceNodeMask{ deviceNodeMask_ }\n      , deviceLUIDValid{ deviceLUIDValid_ }\n      , subgroupSize{ subgroupSize_ }\n      , subgroupSupportedStages{ subgroupSupportedStages_ }\n      , subgroupSupportedOperations{ subgroupSupportedOperations_ }\n      , subgroupQuadOperationsInAllStages{ subgroupQuadOperationsInAllStages_ }\n      , pointClippingBehavior{ pointClippingBehavior_ }\n      , maxMultiviewViewCount{ maxMultiviewViewCount_ }\n      , maxMultiviewInstanceIndex{ maxMultiviewInstanceIndex_ }\n      , protectedNoFault{ protectedNoFault_ }\n      , maxPerSetDescriptors{ maxPerSetDescriptors_ }\n      , maxMemoryAllocationSize{ maxMemoryAllocationSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan11Properties( PhysicalDeviceVulkan11Properties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceVulkan11Properties( VkPhysicalDeviceVulkan11Properties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceVulkan11Properties( *reinterpret_cast<PhysicalDeviceVulkan11Properties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceVulkan11Properties & operator=( PhysicalDeviceVulkan11Properties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceVulkan11Properties & operator=( VkPhysicalDeviceVulkan11Properties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan11Properties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceVulkan11Properties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceVulkan11Properties *>( this );\n    }\n\n    operator VkPhysicalDeviceVulkan11Properties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceVulkan11Properties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_LUID_SIZE> const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ShaderStageFlags const &,\n               VULKAN_HPP_NAMESPACE::SubgroupFeatureFlags const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::PointClippingBehavior const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       deviceUUID,\n                       driverUUID,\n                       deviceLUID,\n                       deviceNodeMask,\n                       deviceLUIDValid,\n                       subgroupSize,\n                       subgroupSupportedStages,\n                       subgroupSupportedOperations,\n                       subgroupQuadOperationsInAllStages,\n                       pointClippingBehavior,\n                       maxMultiviewViewCount,\n                       maxMultiviewInstanceIndex,\n                       protectedNoFault,\n                       maxPerSetDescriptors,\n                       maxMemoryAllocationSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceVulkan11Properties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceVulkan11Properties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( deviceUUID == rhs.deviceUUID ) && ( driverUUID == rhs.driverUUID ) &&\n             ( deviceLUID == rhs.deviceLUID ) && ( deviceNodeMask == rhs.deviceNodeMask ) && ( deviceLUIDValid == rhs.deviceLUIDValid ) &&\n             ( subgroupSize == rhs.subgroupSize ) && ( subgroupSupportedStages == rhs.subgroupSupportedStages ) &&\n             ( subgroupSupportedOperations == rhs.subgroupSupportedOperations ) &&\n             ( subgroupQuadOperationsInAllStages == rhs.subgroupQuadOperationsInAllStages ) && ( pointClippingBehavior == rhs.pointClippingBehavior ) &&\n             ( maxMultiviewViewCount == rhs.maxMultiviewViewCount ) && ( maxMultiviewInstanceIndex == rhs.maxMultiviewInstanceIndex ) &&\n             ( protectedNoFault == rhs.protectedNoFault ) && ( maxPerSetDescriptors == rhs.maxPerSetDescriptors ) &&\n             ( maxMemoryAllocationSize == rhs.maxMemoryAllocationSize );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceVulkan11Properties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                         sType                             = StructureType::ePhysicalDeviceVulkan11Properties;\n    void *                                                      pNext                             = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> deviceUUID                        = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> driverUUID                        = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_LUID_SIZE> deviceLUID                        = {};\n    uint32_t                                                    deviceNodeMask                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32                                deviceLUIDValid                   = {};\n    uint32_t                                                    subgroupSize                      = {};\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags                      subgroupSupportedStages           = {};\n    VULKAN_HPP_NAMESPACE::SubgroupFeatureFlags                  subgroupSupportedOperations       = {};\n    VULKAN_HPP_NAMESPACE::Bool32                                subgroupQuadOperationsInAllStages = {};\n    VULKAN_HPP_NAMESPACE::PointClippingBehavior                 pointClippingBehavior             = VULKAN_HPP_NAMESPACE::PointClippingBehavior::eAllClipPlanes;\n    uint32_t                                                    maxMultiviewViewCount             = {};\n    uint32_t                                                    maxMultiviewInstanceIndex         = {};\n    VULKAN_HPP_NAMESPACE::Bool32                                protectedNoFault                  = {};\n    uint32_t                                                    maxPerSetDescriptors              = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                            maxMemoryAllocationSize           = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceVulkan11Properties>\n  {\n    using Type = PhysicalDeviceVulkan11Properties;\n  };\n\n  struct PhysicalDeviceVulkan12Features\n  {\n    using NativeType = VkPhysicalDeviceVulkan12Features;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceVulkan12Features;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVulkan12Features( VULKAN_HPP_NAMESPACE::Bool32 samplerMirrorClampToEdge_                           = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 drawIndirectCount_                                  = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 storageBuffer8BitAccess_                            = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 uniformAndStorageBuffer8BitAccess_                  = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 storagePushConstant8_                               = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderBufferInt64Atomics_                           = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderSharedInt64Atomics_                           = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderFloat16_                                      = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderInt8_                                         = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 descriptorIndexing_                                 = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderInputAttachmentArrayDynamicIndexing_          = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderUniformTexelBufferArrayDynamicIndexing_       = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderStorageTexelBufferArrayDynamicIndexing_       = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderUniformBufferArrayNonUniformIndexing_         = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderSampledImageArrayNonUniformIndexing_          = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderStorageBufferArrayNonUniformIndexing_         = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderStorageImageArrayNonUniformIndexing_          = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderInputAttachmentArrayNonUniformIndexing_       = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderUniformTexelBufferArrayNonUniformIndexing_    = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderStorageTexelBufferArrayNonUniformIndexing_    = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingUniformBufferUpdateAfterBind_      = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingSampledImageUpdateAfterBind_       = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingStorageImageUpdateAfterBind_       = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingStorageBufferUpdateAfterBind_      = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingUniformTexelBufferUpdateAfterBind_ = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingStorageTexelBufferUpdateAfterBind_ = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingUpdateUnusedWhilePending_          = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingPartiallyBound_                    = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingVariableDescriptorCount_           = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 runtimeDescriptorArray_                             = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 samplerFilterMinmax_                                = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 scalarBlockLayout_                                  = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 imagelessFramebuffer_                               = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 uniformBufferStandardLayout_                        = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderSubgroupExtendedTypes_                        = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 separateDepthStencilLayouts_                        = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 hostQueryReset_                                     = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 timelineSemaphore_                                  = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 bufferDeviceAddress_                                = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 bufferDeviceAddressCaptureReplay_                   = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 bufferDeviceAddressMultiDevice_                     = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 vulkanMemoryModel_                                  = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 vulkanMemoryModelDeviceScope_                       = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 vulkanMemoryModelAvailabilityVisibilityChains_      = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderOutputViewportIndex_                          = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderOutputLayer_                                  = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 subgroupBroadcastDynamicId_                         = {},\n                                                         void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , samplerMirrorClampToEdge{ samplerMirrorClampToEdge_ }\n      , drawIndirectCount{ drawIndirectCount_ }\n      , storageBuffer8BitAccess{ storageBuffer8BitAccess_ }\n      , uniformAndStorageBuffer8BitAccess{ uniformAndStorageBuffer8BitAccess_ }\n      , storagePushConstant8{ storagePushConstant8_ }\n      , shaderBufferInt64Atomics{ shaderBufferInt64Atomics_ }\n      , shaderSharedInt64Atomics{ shaderSharedInt64Atomics_ }\n      , shaderFloat16{ shaderFloat16_ }\n      , shaderInt8{ shaderInt8_ }\n      , descriptorIndexing{ descriptorIndexing_ }\n      , shaderInputAttachmentArrayDynamicIndexing{ shaderInputAttachmentArrayDynamicIndexing_ }\n      , shaderUniformTexelBufferArrayDynamicIndexing{ shaderUniformTexelBufferArrayDynamicIndexing_ }\n      , shaderStorageTexelBufferArrayDynamicIndexing{ shaderStorageTexelBufferArrayDynamicIndexing_ }\n      , shaderUniformBufferArrayNonUniformIndexing{ shaderUniformBufferArrayNonUniformIndexing_ }\n      , shaderSampledImageArrayNonUniformIndexing{ shaderSampledImageArrayNonUniformIndexing_ }\n      , shaderStorageBufferArrayNonUniformIndexing{ shaderStorageBufferArrayNonUniformIndexing_ }\n      , shaderStorageImageArrayNonUniformIndexing{ shaderStorageImageArrayNonUniformIndexing_ }\n      , shaderInputAttachmentArrayNonUniformIndexing{ shaderInputAttachmentArrayNonUniformIndexing_ }\n      , shaderUniformTexelBufferArrayNonUniformIndexing{ shaderUniformTexelBufferArrayNonUniformIndexing_ }\n      , shaderStorageTexelBufferArrayNonUniformIndexing{ shaderStorageTexelBufferArrayNonUniformIndexing_ }\n      , descriptorBindingUniformBufferUpdateAfterBind{ descriptorBindingUniformBufferUpdateAfterBind_ }\n      , descriptorBindingSampledImageUpdateAfterBind{ descriptorBindingSampledImageUpdateAfterBind_ }\n      , descriptorBindingStorageImageUpdateAfterBind{ descriptorBindingStorageImageUpdateAfterBind_ }\n      , descriptorBindingStorageBufferUpdateAfterBind{ descriptorBindingStorageBufferUpdateAfterBind_ }\n      , descriptorBindingUniformTexelBufferUpdateAfterBind{ descriptorBindingUniformTexelBufferUpdateAfterBind_ }\n      , descriptorBindingStorageTexelBufferUpdateAfterBind{ descriptorBindingStorageTexelBufferUpdateAfterBind_ }\n      , descriptorBindingUpdateUnusedWhilePending{ descriptorBindingUpdateUnusedWhilePending_ }\n      , descriptorBindingPartiallyBound{ descriptorBindingPartiallyBound_ }\n      , descriptorBindingVariableDescriptorCount{ descriptorBindingVariableDescriptorCount_ }\n      , runtimeDescriptorArray{ runtimeDescriptorArray_ }\n      , samplerFilterMinmax{ samplerFilterMinmax_ }\n      , scalarBlockLayout{ scalarBlockLayout_ }\n      , imagelessFramebuffer{ imagelessFramebuffer_ }\n      , uniformBufferStandardLayout{ uniformBufferStandardLayout_ }\n      , shaderSubgroupExtendedTypes{ shaderSubgroupExtendedTypes_ }\n      , separateDepthStencilLayouts{ separateDepthStencilLayouts_ }\n      , hostQueryReset{ hostQueryReset_ }\n      , timelineSemaphore{ timelineSemaphore_ }\n      , bufferDeviceAddress{ bufferDeviceAddress_ }\n      , bufferDeviceAddressCaptureReplay{ bufferDeviceAddressCaptureReplay_ }\n      , bufferDeviceAddressMultiDevice{ bufferDeviceAddressMultiDevice_ }\n      , vulkanMemoryModel{ vulkanMemoryModel_ }\n      , vulkanMemoryModelDeviceScope{ vulkanMemoryModelDeviceScope_ }\n      , vulkanMemoryModelAvailabilityVisibilityChains{ vulkanMemoryModelAvailabilityVisibilityChains_ }\n      , shaderOutputViewportIndex{ shaderOutputViewportIndex_ }\n      , shaderOutputLayer{ shaderOutputLayer_ }\n      , subgroupBroadcastDynamicId{ subgroupBroadcastDynamicId_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVulkan12Features( PhysicalDeviceVulkan12Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceVulkan12Features( VkPhysicalDeviceVulkan12Features const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceVulkan12Features( *reinterpret_cast<PhysicalDeviceVulkan12Features const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceVulkan12Features & operator=( PhysicalDeviceVulkan12Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceVulkan12Features & operator=( VkPhysicalDeviceVulkan12Features const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan12Features const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setSamplerMirrorClampToEdge( VULKAN_HPP_NAMESPACE::Bool32 samplerMirrorClampToEdge_ ) VULKAN_HPP_NOEXCEPT\n    {\n      samplerMirrorClampToEdge = samplerMirrorClampToEdge_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features & setDrawIndirectCount( VULKAN_HPP_NAMESPACE::Bool32 drawIndirectCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      drawIndirectCount = drawIndirectCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setStorageBuffer8BitAccess( VULKAN_HPP_NAMESPACE::Bool32 storageBuffer8BitAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      storageBuffer8BitAccess = storageBuffer8BitAccess_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setUniformAndStorageBuffer8BitAccess( VULKAN_HPP_NAMESPACE::Bool32 uniformAndStorageBuffer8BitAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      uniformAndStorageBuffer8BitAccess = uniformAndStorageBuffer8BitAccess_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features & setStoragePushConstant8( VULKAN_HPP_NAMESPACE::Bool32 storagePushConstant8_ ) VULKAN_HPP_NOEXCEPT\n    {\n      storagePushConstant8 = storagePushConstant8_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setShaderBufferInt64Atomics( VULKAN_HPP_NAMESPACE::Bool32 shaderBufferInt64Atomics_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderBufferInt64Atomics = shaderBufferInt64Atomics_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setShaderSharedInt64Atomics( VULKAN_HPP_NAMESPACE::Bool32 shaderSharedInt64Atomics_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSharedInt64Atomics = shaderSharedInt64Atomics_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features & setShaderFloat16( VULKAN_HPP_NAMESPACE::Bool32 shaderFloat16_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderFloat16 = shaderFloat16_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features & setShaderInt8( VULKAN_HPP_NAMESPACE::Bool32 shaderInt8_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderInt8 = shaderInt8_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features & setDescriptorIndexing( VULKAN_HPP_NAMESPACE::Bool32 descriptorIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorIndexing = descriptorIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setShaderInputAttachmentArrayDynamicIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderInputAttachmentArrayDynamicIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderInputAttachmentArrayDynamicIndexing = shaderInputAttachmentArrayDynamicIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setShaderUniformTexelBufferArrayDynamicIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderUniformTexelBufferArrayDynamicIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderUniformTexelBufferArrayDynamicIndexing = shaderUniformTexelBufferArrayDynamicIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setShaderStorageTexelBufferArrayDynamicIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderStorageTexelBufferArrayDynamicIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderStorageTexelBufferArrayDynamicIndexing = shaderStorageTexelBufferArrayDynamicIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setShaderUniformBufferArrayNonUniformIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderUniformBufferArrayNonUniformIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderUniformBufferArrayNonUniformIndexing = shaderUniformBufferArrayNonUniformIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setShaderSampledImageArrayNonUniformIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderSampledImageArrayNonUniformIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSampledImageArrayNonUniformIndexing = shaderSampledImageArrayNonUniformIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setShaderStorageBufferArrayNonUniformIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderStorageBufferArrayNonUniformIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderStorageBufferArrayNonUniformIndexing = shaderStorageBufferArrayNonUniformIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setShaderStorageImageArrayNonUniformIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderStorageImageArrayNonUniformIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderStorageImageArrayNonUniformIndexing = shaderStorageImageArrayNonUniformIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setShaderInputAttachmentArrayNonUniformIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderInputAttachmentArrayNonUniformIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderInputAttachmentArrayNonUniformIndexing = shaderInputAttachmentArrayNonUniformIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setShaderUniformTexelBufferArrayNonUniformIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderUniformTexelBufferArrayNonUniformIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderUniformTexelBufferArrayNonUniformIndexing = shaderUniformTexelBufferArrayNonUniformIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setShaderStorageTexelBufferArrayNonUniformIndexing( VULKAN_HPP_NAMESPACE::Bool32 shaderStorageTexelBufferArrayNonUniformIndexing_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderStorageTexelBufferArrayNonUniformIndexing = shaderStorageTexelBufferArrayNonUniformIndexing_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setDescriptorBindingUniformBufferUpdateAfterBind( VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingUniformBufferUpdateAfterBind_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBindingUniformBufferUpdateAfterBind = descriptorBindingUniformBufferUpdateAfterBind_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setDescriptorBindingSampledImageUpdateAfterBind( VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingSampledImageUpdateAfterBind_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBindingSampledImageUpdateAfterBind = descriptorBindingSampledImageUpdateAfterBind_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setDescriptorBindingStorageImageUpdateAfterBind( VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingStorageImageUpdateAfterBind_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBindingStorageImageUpdateAfterBind = descriptorBindingStorageImageUpdateAfterBind_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setDescriptorBindingStorageBufferUpdateAfterBind( VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingStorageBufferUpdateAfterBind_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBindingStorageBufferUpdateAfterBind = descriptorBindingStorageBufferUpdateAfterBind_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features & setDescriptorBindingUniformTexelBufferUpdateAfterBind(\n      VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingUniformTexelBufferUpdateAfterBind_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBindingUniformTexelBufferUpdateAfterBind = descriptorBindingUniformTexelBufferUpdateAfterBind_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features & setDescriptorBindingStorageTexelBufferUpdateAfterBind(\n      VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingStorageTexelBufferUpdateAfterBind_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBindingStorageTexelBufferUpdateAfterBind = descriptorBindingStorageTexelBufferUpdateAfterBind_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setDescriptorBindingUpdateUnusedWhilePending( VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingUpdateUnusedWhilePending_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBindingUpdateUnusedWhilePending = descriptorBindingUpdateUnusedWhilePending_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setDescriptorBindingPartiallyBound( VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingPartiallyBound_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBindingPartiallyBound = descriptorBindingPartiallyBound_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setDescriptorBindingVariableDescriptorCount( VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingVariableDescriptorCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBindingVariableDescriptorCount = descriptorBindingVariableDescriptorCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setRuntimeDescriptorArray( VULKAN_HPP_NAMESPACE::Bool32 runtimeDescriptorArray_ ) VULKAN_HPP_NOEXCEPT\n    {\n      runtimeDescriptorArray = runtimeDescriptorArray_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features & setSamplerFilterMinmax( VULKAN_HPP_NAMESPACE::Bool32 samplerFilterMinmax_ ) VULKAN_HPP_NOEXCEPT\n    {\n      samplerFilterMinmax = samplerFilterMinmax_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features & setScalarBlockLayout( VULKAN_HPP_NAMESPACE::Bool32 scalarBlockLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      scalarBlockLayout = scalarBlockLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features & setImagelessFramebuffer( VULKAN_HPP_NAMESPACE::Bool32 imagelessFramebuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imagelessFramebuffer = imagelessFramebuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setUniformBufferStandardLayout( VULKAN_HPP_NAMESPACE::Bool32 uniformBufferStandardLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      uniformBufferStandardLayout = uniformBufferStandardLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setShaderSubgroupExtendedTypes( VULKAN_HPP_NAMESPACE::Bool32 shaderSubgroupExtendedTypes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSubgroupExtendedTypes = shaderSubgroupExtendedTypes_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setSeparateDepthStencilLayouts( VULKAN_HPP_NAMESPACE::Bool32 separateDepthStencilLayouts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      separateDepthStencilLayouts = separateDepthStencilLayouts_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features & setHostQueryReset( VULKAN_HPP_NAMESPACE::Bool32 hostQueryReset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      hostQueryReset = hostQueryReset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features & setTimelineSemaphore( VULKAN_HPP_NAMESPACE::Bool32 timelineSemaphore_ ) VULKAN_HPP_NOEXCEPT\n    {\n      timelineSemaphore = timelineSemaphore_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features & setBufferDeviceAddress( VULKAN_HPP_NAMESPACE::Bool32 bufferDeviceAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferDeviceAddress = bufferDeviceAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setBufferDeviceAddressCaptureReplay( VULKAN_HPP_NAMESPACE::Bool32 bufferDeviceAddressCaptureReplay_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferDeviceAddressCaptureReplay = bufferDeviceAddressCaptureReplay_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setBufferDeviceAddressMultiDevice( VULKAN_HPP_NAMESPACE::Bool32 bufferDeviceAddressMultiDevice_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bufferDeviceAddressMultiDevice = bufferDeviceAddressMultiDevice_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features & setVulkanMemoryModel( VULKAN_HPP_NAMESPACE::Bool32 vulkanMemoryModel_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vulkanMemoryModel = vulkanMemoryModel_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setVulkanMemoryModelDeviceScope( VULKAN_HPP_NAMESPACE::Bool32 vulkanMemoryModelDeviceScope_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vulkanMemoryModelDeviceScope = vulkanMemoryModelDeviceScope_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setVulkanMemoryModelAvailabilityVisibilityChains( VULKAN_HPP_NAMESPACE::Bool32 vulkanMemoryModelAvailabilityVisibilityChains_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vulkanMemoryModelAvailabilityVisibilityChains = vulkanMemoryModelAvailabilityVisibilityChains_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setShaderOutputViewportIndex( VULKAN_HPP_NAMESPACE::Bool32 shaderOutputViewportIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderOutputViewportIndex = shaderOutputViewportIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features & setShaderOutputLayer( VULKAN_HPP_NAMESPACE::Bool32 shaderOutputLayer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderOutputLayer = shaderOutputLayer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Features &\n      setSubgroupBroadcastDynamicId( VULKAN_HPP_NAMESPACE::Bool32 subgroupBroadcastDynamicId_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subgroupBroadcastDynamicId = subgroupBroadcastDynamicId_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceVulkan12Features const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceVulkan12Features *>( this );\n    }\n\n    operator VkPhysicalDeviceVulkan12Features &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceVulkan12Features *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       samplerMirrorClampToEdge,\n                       drawIndirectCount,\n                       storageBuffer8BitAccess,\n                       uniformAndStorageBuffer8BitAccess,\n                       storagePushConstant8,\n                       shaderBufferInt64Atomics,\n                       shaderSharedInt64Atomics,\n                       shaderFloat16,\n                       shaderInt8,\n                       descriptorIndexing,\n                       shaderInputAttachmentArrayDynamicIndexing,\n                       shaderUniformTexelBufferArrayDynamicIndexing,\n                       shaderStorageTexelBufferArrayDynamicIndexing,\n                       shaderUniformBufferArrayNonUniformIndexing,\n                       shaderSampledImageArrayNonUniformIndexing,\n                       shaderStorageBufferArrayNonUniformIndexing,\n                       shaderStorageImageArrayNonUniformIndexing,\n                       shaderInputAttachmentArrayNonUniformIndexing,\n                       shaderUniformTexelBufferArrayNonUniformIndexing,\n                       shaderStorageTexelBufferArrayNonUniformIndexing,\n                       descriptorBindingUniformBufferUpdateAfterBind,\n                       descriptorBindingSampledImageUpdateAfterBind,\n                       descriptorBindingStorageImageUpdateAfterBind,\n                       descriptorBindingStorageBufferUpdateAfterBind,\n                       descriptorBindingUniformTexelBufferUpdateAfterBind,\n                       descriptorBindingStorageTexelBufferUpdateAfterBind,\n                       descriptorBindingUpdateUnusedWhilePending,\n                       descriptorBindingPartiallyBound,\n                       descriptorBindingVariableDescriptorCount,\n                       runtimeDescriptorArray,\n                       samplerFilterMinmax,\n                       scalarBlockLayout,\n                       imagelessFramebuffer,\n                       uniformBufferStandardLayout,\n                       shaderSubgroupExtendedTypes,\n                       separateDepthStencilLayouts,\n                       hostQueryReset,\n                       timelineSemaphore,\n                       bufferDeviceAddress,\n                       bufferDeviceAddressCaptureReplay,\n                       bufferDeviceAddressMultiDevice,\n                       vulkanMemoryModel,\n                       vulkanMemoryModelDeviceScope,\n                       vulkanMemoryModelAvailabilityVisibilityChains,\n                       shaderOutputViewportIndex,\n                       shaderOutputLayer,\n                       subgroupBroadcastDynamicId );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceVulkan12Features const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceVulkan12Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( samplerMirrorClampToEdge == rhs.samplerMirrorClampToEdge ) &&\n             ( drawIndirectCount == rhs.drawIndirectCount ) && ( storageBuffer8BitAccess == rhs.storageBuffer8BitAccess ) &&\n             ( uniformAndStorageBuffer8BitAccess == rhs.uniformAndStorageBuffer8BitAccess ) && ( storagePushConstant8 == rhs.storagePushConstant8 ) &&\n             ( shaderBufferInt64Atomics == rhs.shaderBufferInt64Atomics ) && ( shaderSharedInt64Atomics == rhs.shaderSharedInt64Atomics ) &&\n             ( shaderFloat16 == rhs.shaderFloat16 ) && ( shaderInt8 == rhs.shaderInt8 ) && ( descriptorIndexing == rhs.descriptorIndexing ) &&\n             ( shaderInputAttachmentArrayDynamicIndexing == rhs.shaderInputAttachmentArrayDynamicIndexing ) &&\n             ( shaderUniformTexelBufferArrayDynamicIndexing == rhs.shaderUniformTexelBufferArrayDynamicIndexing ) &&\n             ( shaderStorageTexelBufferArrayDynamicIndexing == rhs.shaderStorageTexelBufferArrayDynamicIndexing ) &&\n             ( shaderUniformBufferArrayNonUniformIndexing == rhs.shaderUniformBufferArrayNonUniformIndexing ) &&\n             ( shaderSampledImageArrayNonUniformIndexing == rhs.shaderSampledImageArrayNonUniformIndexing ) &&\n             ( shaderStorageBufferArrayNonUniformIndexing == rhs.shaderStorageBufferArrayNonUniformIndexing ) &&\n             ( shaderStorageImageArrayNonUniformIndexing == rhs.shaderStorageImageArrayNonUniformIndexing ) &&\n             ( shaderInputAttachmentArrayNonUniformIndexing == rhs.shaderInputAttachmentArrayNonUniformIndexing ) &&\n             ( shaderUniformTexelBufferArrayNonUniformIndexing == rhs.shaderUniformTexelBufferArrayNonUniformIndexing ) &&\n             ( shaderStorageTexelBufferArrayNonUniformIndexing == rhs.shaderStorageTexelBufferArrayNonUniformIndexing ) &&\n             ( descriptorBindingUniformBufferUpdateAfterBind == rhs.descriptorBindingUniformBufferUpdateAfterBind ) &&\n             ( descriptorBindingSampledImageUpdateAfterBind == rhs.descriptorBindingSampledImageUpdateAfterBind ) &&\n             ( descriptorBindingStorageImageUpdateAfterBind == rhs.descriptorBindingStorageImageUpdateAfterBind ) &&\n             ( descriptorBindingStorageBufferUpdateAfterBind == rhs.descriptorBindingStorageBufferUpdateAfterBind ) &&\n             ( descriptorBindingUniformTexelBufferUpdateAfterBind == rhs.descriptorBindingUniformTexelBufferUpdateAfterBind ) &&\n             ( descriptorBindingStorageTexelBufferUpdateAfterBind == rhs.descriptorBindingStorageTexelBufferUpdateAfterBind ) &&\n             ( descriptorBindingUpdateUnusedWhilePending == rhs.descriptorBindingUpdateUnusedWhilePending ) &&\n             ( descriptorBindingPartiallyBound == rhs.descriptorBindingPartiallyBound ) &&\n             ( descriptorBindingVariableDescriptorCount == rhs.descriptorBindingVariableDescriptorCount ) &&\n             ( runtimeDescriptorArray == rhs.runtimeDescriptorArray ) && ( samplerFilterMinmax == rhs.samplerFilterMinmax ) &&\n             ( scalarBlockLayout == rhs.scalarBlockLayout ) && ( imagelessFramebuffer == rhs.imagelessFramebuffer ) &&\n             ( uniformBufferStandardLayout == rhs.uniformBufferStandardLayout ) && ( shaderSubgroupExtendedTypes == rhs.shaderSubgroupExtendedTypes ) &&\n             ( separateDepthStencilLayouts == rhs.separateDepthStencilLayouts ) && ( hostQueryReset == rhs.hostQueryReset ) &&\n             ( timelineSemaphore == rhs.timelineSemaphore ) && ( bufferDeviceAddress == rhs.bufferDeviceAddress ) &&\n             ( bufferDeviceAddressCaptureReplay == rhs.bufferDeviceAddressCaptureReplay ) &&\n             ( bufferDeviceAddressMultiDevice == rhs.bufferDeviceAddressMultiDevice ) && ( vulkanMemoryModel == rhs.vulkanMemoryModel ) &&\n             ( vulkanMemoryModelDeviceScope == rhs.vulkanMemoryModelDeviceScope ) &&\n             ( vulkanMemoryModelAvailabilityVisibilityChains == rhs.vulkanMemoryModelAvailabilityVisibilityChains ) &&\n             ( shaderOutputViewportIndex == rhs.shaderOutputViewportIndex ) && ( shaderOutputLayer == rhs.shaderOutputLayer ) &&\n             ( subgroupBroadcastDynamicId == rhs.subgroupBroadcastDynamicId );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceVulkan12Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                              = StructureType::ePhysicalDeviceVulkan12Features;\n    void *                              pNext                                              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        samplerMirrorClampToEdge                           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        drawIndirectCount                                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        storageBuffer8BitAccess                            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        uniformAndStorageBuffer8BitAccess                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        storagePushConstant8                               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderBufferInt64Atomics                           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSharedInt64Atomics                           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderFloat16                                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderInt8                                         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorIndexing                                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderInputAttachmentArrayDynamicIndexing          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderUniformTexelBufferArrayDynamicIndexing       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderStorageTexelBufferArrayDynamicIndexing       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderUniformBufferArrayNonUniformIndexing         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSampledImageArrayNonUniformIndexing          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderStorageBufferArrayNonUniformIndexing         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderStorageImageArrayNonUniformIndexing          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderInputAttachmentArrayNonUniformIndexing       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderUniformTexelBufferArrayNonUniformIndexing    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderStorageTexelBufferArrayNonUniformIndexing    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBindingUniformBufferUpdateAfterBind      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBindingSampledImageUpdateAfterBind       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBindingStorageImageUpdateAfterBind       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBindingStorageBufferUpdateAfterBind      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBindingUniformTexelBufferUpdateAfterBind = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBindingStorageTexelBufferUpdateAfterBind = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBindingUpdateUnusedWhilePending          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBindingPartiallyBound                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBindingVariableDescriptorCount           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        runtimeDescriptorArray                             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        samplerFilterMinmax                                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        scalarBlockLayout                                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        imagelessFramebuffer                               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        uniformBufferStandardLayout                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSubgroupExtendedTypes                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        separateDepthStencilLayouts                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        hostQueryReset                                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        timelineSemaphore                                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        bufferDeviceAddress                                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        bufferDeviceAddressCaptureReplay                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        bufferDeviceAddressMultiDevice                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        vulkanMemoryModel                                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        vulkanMemoryModelDeviceScope                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        vulkanMemoryModelAvailabilityVisibilityChains      = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderOutputViewportIndex                          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderOutputLayer                                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        subgroupBroadcastDynamicId                         = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceVulkan12Features>\n  {\n    using Type = PhysicalDeviceVulkan12Features;\n  };\n\n  struct PhysicalDeviceVulkan12Properties\n  {\n    using NativeType = VkPhysicalDeviceVulkan12Properties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceVulkan12Properties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Properties(\n      VULKAN_HPP_NAMESPACE::DriverId                        driverID_                   = VULKAN_HPP_NAMESPACE::DriverId::eAmdProprietary,\n      std::array<char, VK_MAX_DRIVER_NAME_SIZE> const &     driverName_                 = {},\n      std::array<char, VK_MAX_DRIVER_INFO_SIZE> const &     driverInfo_                 = {},\n      VULKAN_HPP_NAMESPACE::ConformanceVersion              conformanceVersion_         = {},\n      VULKAN_HPP_NAMESPACE::ShaderFloatControlsIndependence denormBehaviorIndependence_ = VULKAN_HPP_NAMESPACE::ShaderFloatControlsIndependence::e32BitOnly,\n      VULKAN_HPP_NAMESPACE::ShaderFloatControlsIndependence roundingModeIndependence_   = VULKAN_HPP_NAMESPACE::ShaderFloatControlsIndependence::e32BitOnly,\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderSignedZeroInfNanPreserveFloat16_                = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderSignedZeroInfNanPreserveFloat32_                = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderSignedZeroInfNanPreserveFloat64_                = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormPreserveFloat16_                          = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormPreserveFloat32_                          = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormPreserveFloat64_                          = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormFlushToZeroFloat16_                       = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormFlushToZeroFloat32_                       = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormFlushToZeroFloat64_                       = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTEFloat16_                         = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTEFloat32_                         = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTEFloat64_                         = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTZFloat16_                         = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTZFloat32_                         = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTZFloat64_                         = {},\n      uint32_t                                              maxUpdateAfterBindDescriptorsInAllPools_              = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderUniformBufferArrayNonUniformIndexingNative_     = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderSampledImageArrayNonUniformIndexingNative_      = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderStorageBufferArrayNonUniformIndexingNative_     = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderStorageImageArrayNonUniformIndexingNative_      = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          shaderInputAttachmentArrayNonUniformIndexingNative_   = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          robustBufferAccessUpdateAfterBind_                    = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          quadDivergentImplicitLod_                             = {},\n      uint32_t                                              maxPerStageDescriptorUpdateAfterBindSamplers_         = {},\n      uint32_t                                              maxPerStageDescriptorUpdateAfterBindUniformBuffers_   = {},\n      uint32_t                                              maxPerStageDescriptorUpdateAfterBindStorageBuffers_   = {},\n      uint32_t                                              maxPerStageDescriptorUpdateAfterBindSampledImages_    = {},\n      uint32_t                                              maxPerStageDescriptorUpdateAfterBindStorageImages_    = {},\n      uint32_t                                              maxPerStageDescriptorUpdateAfterBindInputAttachments_ = {},\n      uint32_t                                              maxPerStageUpdateAfterBindResources_                  = {},\n      uint32_t                                              maxDescriptorSetUpdateAfterBindSamplers_              = {},\n      uint32_t                                              maxDescriptorSetUpdateAfterBindUniformBuffers_        = {},\n      uint32_t                                              maxDescriptorSetUpdateAfterBindUniformBuffersDynamic_ = {},\n      uint32_t                                              maxDescriptorSetUpdateAfterBindStorageBuffers_        = {},\n      uint32_t                                              maxDescriptorSetUpdateAfterBindStorageBuffersDynamic_ = {},\n      uint32_t                                              maxDescriptorSetUpdateAfterBindSampledImages_         = {},\n      uint32_t                                              maxDescriptorSetUpdateAfterBindStorageImages_         = {},\n      uint32_t                                              maxDescriptorSetUpdateAfterBindInputAttachments_      = {},\n      VULKAN_HPP_NAMESPACE::ResolveModeFlags                supportedDepthResolveModes_                           = {},\n      VULKAN_HPP_NAMESPACE::ResolveModeFlags                supportedStencilResolveModes_                         = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          independentResolveNone_                               = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          independentResolve_                                   = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          filterMinmaxSingleComponentFormats_                   = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          filterMinmaxImageComponentMapping_                    = {},\n      uint64_t                                              maxTimelineSemaphoreValueDifference_                  = {},\n      VULKAN_HPP_NAMESPACE::SampleCountFlags                framebufferIntegerColorSampleCounts_                  = {},\n      void *                                                pNext_                                                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , driverID{ driverID_ }\n      , driverName{ driverName_ }\n      , driverInfo{ driverInfo_ }\n      , conformanceVersion{ conformanceVersion_ }\n      , denormBehaviorIndependence{ denormBehaviorIndependence_ }\n      , roundingModeIndependence{ roundingModeIndependence_ }\n      , shaderSignedZeroInfNanPreserveFloat16{ shaderSignedZeroInfNanPreserveFloat16_ }\n      , shaderSignedZeroInfNanPreserveFloat32{ shaderSignedZeroInfNanPreserveFloat32_ }\n      , shaderSignedZeroInfNanPreserveFloat64{ shaderSignedZeroInfNanPreserveFloat64_ }\n      , shaderDenormPreserveFloat16{ shaderDenormPreserveFloat16_ }\n      , shaderDenormPreserveFloat32{ shaderDenormPreserveFloat32_ }\n      , shaderDenormPreserveFloat64{ shaderDenormPreserveFloat64_ }\n      , shaderDenormFlushToZeroFloat16{ shaderDenormFlushToZeroFloat16_ }\n      , shaderDenormFlushToZeroFloat32{ shaderDenormFlushToZeroFloat32_ }\n      , shaderDenormFlushToZeroFloat64{ shaderDenormFlushToZeroFloat64_ }\n      , shaderRoundingModeRTEFloat16{ shaderRoundingModeRTEFloat16_ }\n      , shaderRoundingModeRTEFloat32{ shaderRoundingModeRTEFloat32_ }\n      , shaderRoundingModeRTEFloat64{ shaderRoundingModeRTEFloat64_ }\n      , shaderRoundingModeRTZFloat16{ shaderRoundingModeRTZFloat16_ }\n      , shaderRoundingModeRTZFloat32{ shaderRoundingModeRTZFloat32_ }\n      , shaderRoundingModeRTZFloat64{ shaderRoundingModeRTZFloat64_ }\n      , maxUpdateAfterBindDescriptorsInAllPools{ maxUpdateAfterBindDescriptorsInAllPools_ }\n      , shaderUniformBufferArrayNonUniformIndexingNative{ shaderUniformBufferArrayNonUniformIndexingNative_ }\n      , shaderSampledImageArrayNonUniformIndexingNative{ shaderSampledImageArrayNonUniformIndexingNative_ }\n      , shaderStorageBufferArrayNonUniformIndexingNative{ shaderStorageBufferArrayNonUniformIndexingNative_ }\n      , shaderStorageImageArrayNonUniformIndexingNative{ shaderStorageImageArrayNonUniformIndexingNative_ }\n      , shaderInputAttachmentArrayNonUniformIndexingNative{ shaderInputAttachmentArrayNonUniformIndexingNative_ }\n      , robustBufferAccessUpdateAfterBind{ robustBufferAccessUpdateAfterBind_ }\n      , quadDivergentImplicitLod{ quadDivergentImplicitLod_ }\n      , maxPerStageDescriptorUpdateAfterBindSamplers{ maxPerStageDescriptorUpdateAfterBindSamplers_ }\n      , maxPerStageDescriptorUpdateAfterBindUniformBuffers{ maxPerStageDescriptorUpdateAfterBindUniformBuffers_ }\n      , maxPerStageDescriptorUpdateAfterBindStorageBuffers{ maxPerStageDescriptorUpdateAfterBindStorageBuffers_ }\n      , maxPerStageDescriptorUpdateAfterBindSampledImages{ maxPerStageDescriptorUpdateAfterBindSampledImages_ }\n      , maxPerStageDescriptorUpdateAfterBindStorageImages{ maxPerStageDescriptorUpdateAfterBindStorageImages_ }\n      , maxPerStageDescriptorUpdateAfterBindInputAttachments{ maxPerStageDescriptorUpdateAfterBindInputAttachments_ }\n      , maxPerStageUpdateAfterBindResources{ maxPerStageUpdateAfterBindResources_ }\n      , maxDescriptorSetUpdateAfterBindSamplers{ maxDescriptorSetUpdateAfterBindSamplers_ }\n      , maxDescriptorSetUpdateAfterBindUniformBuffers{ maxDescriptorSetUpdateAfterBindUniformBuffers_ }\n      , maxDescriptorSetUpdateAfterBindUniformBuffersDynamic{ maxDescriptorSetUpdateAfterBindUniformBuffersDynamic_ }\n      , maxDescriptorSetUpdateAfterBindStorageBuffers{ maxDescriptorSetUpdateAfterBindStorageBuffers_ }\n      , maxDescriptorSetUpdateAfterBindStorageBuffersDynamic{ maxDescriptorSetUpdateAfterBindStorageBuffersDynamic_ }\n      , maxDescriptorSetUpdateAfterBindSampledImages{ maxDescriptorSetUpdateAfterBindSampledImages_ }\n      , maxDescriptorSetUpdateAfterBindStorageImages{ maxDescriptorSetUpdateAfterBindStorageImages_ }\n      , maxDescriptorSetUpdateAfterBindInputAttachments{ maxDescriptorSetUpdateAfterBindInputAttachments_ }\n      , supportedDepthResolveModes{ supportedDepthResolveModes_ }\n      , supportedStencilResolveModes{ supportedStencilResolveModes_ }\n      , independentResolveNone{ independentResolveNone_ }\n      , independentResolve{ independentResolve_ }\n      , filterMinmaxSingleComponentFormats{ filterMinmaxSingleComponentFormats_ }\n      , filterMinmaxImageComponentMapping{ filterMinmaxImageComponentMapping_ }\n      , maxTimelineSemaphoreValueDifference{ maxTimelineSemaphoreValueDifference_ }\n      , framebufferIntegerColorSampleCounts{ framebufferIntegerColorSampleCounts_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan12Properties( PhysicalDeviceVulkan12Properties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceVulkan12Properties( VkPhysicalDeviceVulkan12Properties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceVulkan12Properties( *reinterpret_cast<PhysicalDeviceVulkan12Properties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceVulkan12Properties & operator=( PhysicalDeviceVulkan12Properties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceVulkan12Properties & operator=( VkPhysicalDeviceVulkan12Properties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan12Properties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceVulkan12Properties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceVulkan12Properties *>( this );\n    }\n\n    operator VkPhysicalDeviceVulkan12Properties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceVulkan12Properties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::DriverId const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DRIVER_NAME_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DRIVER_INFO_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::ConformanceVersion const &,\n               VULKAN_HPP_NAMESPACE::ShaderFloatControlsIndependence const &,\n               VULKAN_HPP_NAMESPACE::ShaderFloatControlsIndependence const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ResolveModeFlags const &,\n               VULKAN_HPP_NAMESPACE::ResolveModeFlags const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint64_t const &,\n               VULKAN_HPP_NAMESPACE::SampleCountFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       driverID,\n                       driverName,\n                       driverInfo,\n                       conformanceVersion,\n                       denormBehaviorIndependence,\n                       roundingModeIndependence,\n                       shaderSignedZeroInfNanPreserveFloat16,\n                       shaderSignedZeroInfNanPreserveFloat32,\n                       shaderSignedZeroInfNanPreserveFloat64,\n                       shaderDenormPreserveFloat16,\n                       shaderDenormPreserveFloat32,\n                       shaderDenormPreserveFloat64,\n                       shaderDenormFlushToZeroFloat16,\n                       shaderDenormFlushToZeroFloat32,\n                       shaderDenormFlushToZeroFloat64,\n                       shaderRoundingModeRTEFloat16,\n                       shaderRoundingModeRTEFloat32,\n                       shaderRoundingModeRTEFloat64,\n                       shaderRoundingModeRTZFloat16,\n                       shaderRoundingModeRTZFloat32,\n                       shaderRoundingModeRTZFloat64,\n                       maxUpdateAfterBindDescriptorsInAllPools,\n                       shaderUniformBufferArrayNonUniformIndexingNative,\n                       shaderSampledImageArrayNonUniformIndexingNative,\n                       shaderStorageBufferArrayNonUniformIndexingNative,\n                       shaderStorageImageArrayNonUniformIndexingNative,\n                       shaderInputAttachmentArrayNonUniformIndexingNative,\n                       robustBufferAccessUpdateAfterBind,\n                       quadDivergentImplicitLod,\n                       maxPerStageDescriptorUpdateAfterBindSamplers,\n                       maxPerStageDescriptorUpdateAfterBindUniformBuffers,\n                       maxPerStageDescriptorUpdateAfterBindStorageBuffers,\n                       maxPerStageDescriptorUpdateAfterBindSampledImages,\n                       maxPerStageDescriptorUpdateAfterBindStorageImages,\n                       maxPerStageDescriptorUpdateAfterBindInputAttachments,\n                       maxPerStageUpdateAfterBindResources,\n                       maxDescriptorSetUpdateAfterBindSamplers,\n                       maxDescriptorSetUpdateAfterBindUniformBuffers,\n                       maxDescriptorSetUpdateAfterBindUniformBuffersDynamic,\n                       maxDescriptorSetUpdateAfterBindStorageBuffers,\n                       maxDescriptorSetUpdateAfterBindStorageBuffersDynamic,\n                       maxDescriptorSetUpdateAfterBindSampledImages,\n                       maxDescriptorSetUpdateAfterBindStorageImages,\n                       maxDescriptorSetUpdateAfterBindInputAttachments,\n                       supportedDepthResolveModes,\n                       supportedStencilResolveModes,\n                       independentResolveNone,\n                       independentResolve,\n                       filterMinmaxSingleComponentFormats,\n                       filterMinmaxImageComponentMapping,\n                       maxTimelineSemaphoreValueDifference,\n                       framebufferIntegerColorSampleCounts );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( PhysicalDeviceVulkan12Properties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = driverID <=> rhs.driverID; cmp != 0 )\n        return cmp;\n      if ( auto cmp = strcmp( driverName, rhs.driverName ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = strcmp( driverInfo, rhs.driverInfo ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = conformanceVersion <=> rhs.conformanceVersion; cmp != 0 )\n        return cmp;\n      if ( auto cmp = denormBehaviorIndependence <=> rhs.denormBehaviorIndependence; cmp != 0 )\n        return cmp;\n      if ( auto cmp = roundingModeIndependence <=> rhs.roundingModeIndependence; cmp != 0 )\n        return cmp;\n      if ( auto cmp = shaderSignedZeroInfNanPreserveFloat16 <=> rhs.shaderSignedZeroInfNanPreserveFloat16; cmp != 0 )\n        return cmp;\n      if ( auto cmp = shaderSignedZeroInfNanPreserveFloat32 <=> rhs.shaderSignedZeroInfNanPreserveFloat32; cmp != 0 )\n        return cmp;\n      if ( auto cmp = shaderSignedZeroInfNanPreserveFloat64 <=> rhs.shaderSignedZeroInfNanPreserveFloat64; cmp != 0 )\n        return cmp;\n      if ( auto cmp = shaderDenormPreserveFloat16 <=> rhs.shaderDenormPreserveFloat16; cmp != 0 )\n        return cmp;\n      if ( auto cmp = shaderDenormPreserveFloat32 <=> rhs.shaderDenormPreserveFloat32; cmp != 0 )\n        return cmp;\n      if ( auto cmp = shaderDenormPreserveFloat64 <=> rhs.shaderDenormPreserveFloat64; cmp != 0 )\n        return cmp;\n      if ( auto cmp = shaderDenormFlushToZeroFloat16 <=> rhs.shaderDenormFlushToZeroFloat16; cmp != 0 )\n        return cmp;\n      if ( auto cmp = shaderDenormFlushToZeroFloat32 <=> rhs.shaderDenormFlushToZeroFloat32; cmp != 0 )\n        return cmp;\n      if ( auto cmp = shaderDenormFlushToZeroFloat64 <=> rhs.shaderDenormFlushToZeroFloat64; cmp != 0 )\n        return cmp;\n      if ( auto cmp = shaderRoundingModeRTEFloat16 <=> rhs.shaderRoundingModeRTEFloat16; cmp != 0 )\n        return cmp;\n      if ( auto cmp = shaderRoundingModeRTEFloat32 <=> rhs.shaderRoundingModeRTEFloat32; cmp != 0 )\n        return cmp;\n      if ( auto cmp = shaderRoundingModeRTEFloat64 <=> rhs.shaderRoundingModeRTEFloat64; cmp != 0 )\n        return cmp;\n      if ( auto cmp = shaderRoundingModeRTZFloat16 <=> rhs.shaderRoundingModeRTZFloat16; cmp != 0 )\n        return cmp;\n      if ( auto cmp = shaderRoundingModeRTZFloat32 <=> rhs.shaderRoundingModeRTZFloat32; cmp != 0 )\n        return cmp;\n      if ( auto cmp = shaderRoundingModeRTZFloat64 <=> rhs.shaderRoundingModeRTZFloat64; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxUpdateAfterBindDescriptorsInAllPools <=> rhs.maxUpdateAfterBindDescriptorsInAllPools; cmp != 0 )\n        return cmp;\n      if ( auto cmp = shaderUniformBufferArrayNonUniformIndexingNative <=> rhs.shaderUniformBufferArrayNonUniformIndexingNative; cmp != 0 )\n        return cmp;\n      if ( auto cmp = shaderSampledImageArrayNonUniformIndexingNative <=> rhs.shaderSampledImageArrayNonUniformIndexingNative; cmp != 0 )\n        return cmp;\n      if ( auto cmp = shaderStorageBufferArrayNonUniformIndexingNative <=> rhs.shaderStorageBufferArrayNonUniformIndexingNative; cmp != 0 )\n        return cmp;\n      if ( auto cmp = shaderStorageImageArrayNonUniformIndexingNative <=> rhs.shaderStorageImageArrayNonUniformIndexingNative; cmp != 0 )\n        return cmp;\n      if ( auto cmp = shaderInputAttachmentArrayNonUniformIndexingNative <=> rhs.shaderInputAttachmentArrayNonUniformIndexingNative; cmp != 0 )\n        return cmp;\n      if ( auto cmp = robustBufferAccessUpdateAfterBind <=> rhs.robustBufferAccessUpdateAfterBind; cmp != 0 )\n        return cmp;\n      if ( auto cmp = quadDivergentImplicitLod <=> rhs.quadDivergentImplicitLod; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxPerStageDescriptorUpdateAfterBindSamplers <=> rhs.maxPerStageDescriptorUpdateAfterBindSamplers; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxPerStageDescriptorUpdateAfterBindUniformBuffers <=> rhs.maxPerStageDescriptorUpdateAfterBindUniformBuffers; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxPerStageDescriptorUpdateAfterBindStorageBuffers <=> rhs.maxPerStageDescriptorUpdateAfterBindStorageBuffers; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxPerStageDescriptorUpdateAfterBindSampledImages <=> rhs.maxPerStageDescriptorUpdateAfterBindSampledImages; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxPerStageDescriptorUpdateAfterBindStorageImages <=> rhs.maxPerStageDescriptorUpdateAfterBindStorageImages; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxPerStageDescriptorUpdateAfterBindInputAttachments <=> rhs.maxPerStageDescriptorUpdateAfterBindInputAttachments; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxPerStageUpdateAfterBindResources <=> rhs.maxPerStageUpdateAfterBindResources; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxDescriptorSetUpdateAfterBindSamplers <=> rhs.maxDescriptorSetUpdateAfterBindSamplers; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxDescriptorSetUpdateAfterBindUniformBuffers <=> rhs.maxDescriptorSetUpdateAfterBindUniformBuffers; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxDescriptorSetUpdateAfterBindUniformBuffersDynamic <=> rhs.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxDescriptorSetUpdateAfterBindStorageBuffers <=> rhs.maxDescriptorSetUpdateAfterBindStorageBuffers; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxDescriptorSetUpdateAfterBindStorageBuffersDynamic <=> rhs.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxDescriptorSetUpdateAfterBindSampledImages <=> rhs.maxDescriptorSetUpdateAfterBindSampledImages; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxDescriptorSetUpdateAfterBindStorageImages <=> rhs.maxDescriptorSetUpdateAfterBindStorageImages; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxDescriptorSetUpdateAfterBindInputAttachments <=> rhs.maxDescriptorSetUpdateAfterBindInputAttachments; cmp != 0 )\n        return cmp;\n      if ( auto cmp = supportedDepthResolveModes <=> rhs.supportedDepthResolveModes; cmp != 0 )\n        return cmp;\n      if ( auto cmp = supportedStencilResolveModes <=> rhs.supportedStencilResolveModes; cmp != 0 )\n        return cmp;\n      if ( auto cmp = independentResolveNone <=> rhs.independentResolveNone; cmp != 0 )\n        return cmp;\n      if ( auto cmp = independentResolve <=> rhs.independentResolve; cmp != 0 )\n        return cmp;\n      if ( auto cmp = filterMinmaxSingleComponentFormats <=> rhs.filterMinmaxSingleComponentFormats; cmp != 0 )\n        return cmp;\n      if ( auto cmp = filterMinmaxImageComponentMapping <=> rhs.filterMinmaxImageComponentMapping; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxTimelineSemaphoreValueDifference <=> rhs.maxTimelineSemaphoreValueDifference; cmp != 0 )\n        return cmp;\n      if ( auto cmp = framebufferIntegerColorSampleCounts <=> rhs.framebufferIntegerColorSampleCounts; cmp != 0 )\n        return cmp;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( PhysicalDeviceVulkan12Properties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( driverID == rhs.driverID ) && ( strcmp( driverName, rhs.driverName ) == 0 ) &&\n             ( strcmp( driverInfo, rhs.driverInfo ) == 0 ) && ( conformanceVersion == rhs.conformanceVersion ) &&\n             ( denormBehaviorIndependence == rhs.denormBehaviorIndependence ) && ( roundingModeIndependence == rhs.roundingModeIndependence ) &&\n             ( shaderSignedZeroInfNanPreserveFloat16 == rhs.shaderSignedZeroInfNanPreserveFloat16 ) &&\n             ( shaderSignedZeroInfNanPreserveFloat32 == rhs.shaderSignedZeroInfNanPreserveFloat32 ) &&\n             ( shaderSignedZeroInfNanPreserveFloat64 == rhs.shaderSignedZeroInfNanPreserveFloat64 ) &&\n             ( shaderDenormPreserveFloat16 == rhs.shaderDenormPreserveFloat16 ) && ( shaderDenormPreserveFloat32 == rhs.shaderDenormPreserveFloat32 ) &&\n             ( shaderDenormPreserveFloat64 == rhs.shaderDenormPreserveFloat64 ) && ( shaderDenormFlushToZeroFloat16 == rhs.shaderDenormFlushToZeroFloat16 ) &&\n             ( shaderDenormFlushToZeroFloat32 == rhs.shaderDenormFlushToZeroFloat32 ) &&\n             ( shaderDenormFlushToZeroFloat64 == rhs.shaderDenormFlushToZeroFloat64 ) && ( shaderRoundingModeRTEFloat16 == rhs.shaderRoundingModeRTEFloat16 ) &&\n             ( shaderRoundingModeRTEFloat32 == rhs.shaderRoundingModeRTEFloat32 ) && ( shaderRoundingModeRTEFloat64 == rhs.shaderRoundingModeRTEFloat64 ) &&\n             ( shaderRoundingModeRTZFloat16 == rhs.shaderRoundingModeRTZFloat16 ) && ( shaderRoundingModeRTZFloat32 == rhs.shaderRoundingModeRTZFloat32 ) &&\n             ( shaderRoundingModeRTZFloat64 == rhs.shaderRoundingModeRTZFloat64 ) &&\n             ( maxUpdateAfterBindDescriptorsInAllPools == rhs.maxUpdateAfterBindDescriptorsInAllPools ) &&\n             ( shaderUniformBufferArrayNonUniformIndexingNative == rhs.shaderUniformBufferArrayNonUniformIndexingNative ) &&\n             ( shaderSampledImageArrayNonUniformIndexingNative == rhs.shaderSampledImageArrayNonUniformIndexingNative ) &&\n             ( shaderStorageBufferArrayNonUniformIndexingNative == rhs.shaderStorageBufferArrayNonUniformIndexingNative ) &&\n             ( shaderStorageImageArrayNonUniformIndexingNative == rhs.shaderStorageImageArrayNonUniformIndexingNative ) &&\n             ( shaderInputAttachmentArrayNonUniformIndexingNative == rhs.shaderInputAttachmentArrayNonUniformIndexingNative ) &&\n             ( robustBufferAccessUpdateAfterBind == rhs.robustBufferAccessUpdateAfterBind ) && ( quadDivergentImplicitLod == rhs.quadDivergentImplicitLod ) &&\n             ( maxPerStageDescriptorUpdateAfterBindSamplers == rhs.maxPerStageDescriptorUpdateAfterBindSamplers ) &&\n             ( maxPerStageDescriptorUpdateAfterBindUniformBuffers == rhs.maxPerStageDescriptorUpdateAfterBindUniformBuffers ) &&\n             ( maxPerStageDescriptorUpdateAfterBindStorageBuffers == rhs.maxPerStageDescriptorUpdateAfterBindStorageBuffers ) &&\n             ( maxPerStageDescriptorUpdateAfterBindSampledImages == rhs.maxPerStageDescriptorUpdateAfterBindSampledImages ) &&\n             ( maxPerStageDescriptorUpdateAfterBindStorageImages == rhs.maxPerStageDescriptorUpdateAfterBindStorageImages ) &&\n             ( maxPerStageDescriptorUpdateAfterBindInputAttachments == rhs.maxPerStageDescriptorUpdateAfterBindInputAttachments ) &&\n             ( maxPerStageUpdateAfterBindResources == rhs.maxPerStageUpdateAfterBindResources ) &&\n             ( maxDescriptorSetUpdateAfterBindSamplers == rhs.maxDescriptorSetUpdateAfterBindSamplers ) &&\n             ( maxDescriptorSetUpdateAfterBindUniformBuffers == rhs.maxDescriptorSetUpdateAfterBindUniformBuffers ) &&\n             ( maxDescriptorSetUpdateAfterBindUniformBuffersDynamic == rhs.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic ) &&\n             ( maxDescriptorSetUpdateAfterBindStorageBuffers == rhs.maxDescriptorSetUpdateAfterBindStorageBuffers ) &&\n             ( maxDescriptorSetUpdateAfterBindStorageBuffersDynamic == rhs.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic ) &&\n             ( maxDescriptorSetUpdateAfterBindSampledImages == rhs.maxDescriptorSetUpdateAfterBindSampledImages ) &&\n             ( maxDescriptorSetUpdateAfterBindStorageImages == rhs.maxDescriptorSetUpdateAfterBindStorageImages ) &&\n             ( maxDescriptorSetUpdateAfterBindInputAttachments == rhs.maxDescriptorSetUpdateAfterBindInputAttachments ) &&\n             ( supportedDepthResolveModes == rhs.supportedDepthResolveModes ) && ( supportedStencilResolveModes == rhs.supportedStencilResolveModes ) &&\n             ( independentResolveNone == rhs.independentResolveNone ) && ( independentResolve == rhs.independentResolve ) &&\n             ( filterMinmaxSingleComponentFormats == rhs.filterMinmaxSingleComponentFormats ) &&\n             ( filterMinmaxImageComponentMapping == rhs.filterMinmaxImageComponentMapping ) &&\n             ( maxTimelineSemaphoreValueDifference == rhs.maxTimelineSemaphoreValueDifference ) &&\n             ( framebufferIntegerColorSampleCounts == rhs.framebufferIntegerColorSampleCounts );\n    }\n\n    bool operator!=( PhysicalDeviceVulkan12Properties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                 sType              = StructureType::ePhysicalDeviceVulkan12Properties;\n    void *                                                              pNext              = {};\n    VULKAN_HPP_NAMESPACE::DriverId                                      driverID           = VULKAN_HPP_NAMESPACE::DriverId::eAmdProprietary;\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DRIVER_NAME_SIZE> driverName         = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DRIVER_INFO_SIZE> driverInfo         = {};\n    VULKAN_HPP_NAMESPACE::ConformanceVersion                            conformanceVersion = {};\n    VULKAN_HPP_NAMESPACE::ShaderFloatControlsIndependence denormBehaviorIndependence       = VULKAN_HPP_NAMESPACE::ShaderFloatControlsIndependence::e32BitOnly;\n    VULKAN_HPP_NAMESPACE::ShaderFloatControlsIndependence roundingModeIndependence         = VULKAN_HPP_NAMESPACE::ShaderFloatControlsIndependence::e32BitOnly;\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderSignedZeroInfNanPreserveFloat16                = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderSignedZeroInfNanPreserveFloat32                = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderSignedZeroInfNanPreserveFloat64                = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormPreserveFloat16                          = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormPreserveFloat32                          = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormPreserveFloat64                          = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormFlushToZeroFloat16                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormFlushToZeroFloat32                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderDenormFlushToZeroFloat64                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTEFloat16                         = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTEFloat32                         = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTEFloat64                         = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTZFloat16                         = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTZFloat32                         = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderRoundingModeRTZFloat64                         = {};\n    uint32_t                                              maxUpdateAfterBindDescriptorsInAllPools              = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderUniformBufferArrayNonUniformIndexingNative     = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderSampledImageArrayNonUniformIndexingNative      = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderStorageBufferArrayNonUniformIndexingNative     = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderStorageImageArrayNonUniformIndexingNative      = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          shaderInputAttachmentArrayNonUniformIndexingNative   = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          robustBufferAccessUpdateAfterBind                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          quadDivergentImplicitLod                             = {};\n    uint32_t                                              maxPerStageDescriptorUpdateAfterBindSamplers         = {};\n    uint32_t                                              maxPerStageDescriptorUpdateAfterBindUniformBuffers   = {};\n    uint32_t                                              maxPerStageDescriptorUpdateAfterBindStorageBuffers   = {};\n    uint32_t                                              maxPerStageDescriptorUpdateAfterBindSampledImages    = {};\n    uint32_t                                              maxPerStageDescriptorUpdateAfterBindStorageImages    = {};\n    uint32_t                                              maxPerStageDescriptorUpdateAfterBindInputAttachments = {};\n    uint32_t                                              maxPerStageUpdateAfterBindResources                  = {};\n    uint32_t                                              maxDescriptorSetUpdateAfterBindSamplers              = {};\n    uint32_t                                              maxDescriptorSetUpdateAfterBindUniformBuffers        = {};\n    uint32_t                                              maxDescriptorSetUpdateAfterBindUniformBuffersDynamic = {};\n    uint32_t                                              maxDescriptorSetUpdateAfterBindStorageBuffers        = {};\n    uint32_t                                              maxDescriptorSetUpdateAfterBindStorageBuffersDynamic = {};\n    uint32_t                                              maxDescriptorSetUpdateAfterBindSampledImages         = {};\n    uint32_t                                              maxDescriptorSetUpdateAfterBindStorageImages         = {};\n    uint32_t                                              maxDescriptorSetUpdateAfterBindInputAttachments      = {};\n    VULKAN_HPP_NAMESPACE::ResolveModeFlags                supportedDepthResolveModes                           = {};\n    VULKAN_HPP_NAMESPACE::ResolveModeFlags                supportedStencilResolveModes                         = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          independentResolveNone                               = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          independentResolve                                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          filterMinmaxSingleComponentFormats                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32                          filterMinmaxImageComponentMapping                    = {};\n    uint64_t                                              maxTimelineSemaphoreValueDifference                  = {};\n    VULKAN_HPP_NAMESPACE::SampleCountFlags                framebufferIntegerColorSampleCounts                  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceVulkan12Properties>\n  {\n    using Type = PhysicalDeviceVulkan12Properties;\n  };\n\n  struct PhysicalDeviceVulkan13Features\n  {\n    using NativeType = VkPhysicalDeviceVulkan13Features;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceVulkan13Features;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVulkan13Features( VULKAN_HPP_NAMESPACE::Bool32 robustImageAccess_                                  = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 inlineUniformBlock_                                 = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingInlineUniformBlockUpdateAfterBind_ = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 pipelineCreationCacheControl_                       = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 privateData_                                        = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderDemoteToHelperInvocation_                     = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderTerminateInvocation_                          = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 subgroupSizeControl_                                = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 computeFullSubgroups_                               = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 synchronization2_                                   = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 textureCompressionASTC_HDR_                         = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderZeroInitializeWorkgroupMemory_                = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 dynamicRendering_                                   = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderIntegerDotProduct_                            = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 maintenance4_                                       = {},\n                                                         void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , robustImageAccess{ robustImageAccess_ }\n      , inlineUniformBlock{ inlineUniformBlock_ }\n      , descriptorBindingInlineUniformBlockUpdateAfterBind{ descriptorBindingInlineUniformBlockUpdateAfterBind_ }\n      , pipelineCreationCacheControl{ pipelineCreationCacheControl_ }\n      , privateData{ privateData_ }\n      , shaderDemoteToHelperInvocation{ shaderDemoteToHelperInvocation_ }\n      , shaderTerminateInvocation{ shaderTerminateInvocation_ }\n      , subgroupSizeControl{ subgroupSizeControl_ }\n      , computeFullSubgroups{ computeFullSubgroups_ }\n      , synchronization2{ synchronization2_ }\n      , textureCompressionASTC_HDR{ textureCompressionASTC_HDR_ }\n      , shaderZeroInitializeWorkgroupMemory{ shaderZeroInitializeWorkgroupMemory_ }\n      , dynamicRendering{ dynamicRendering_ }\n      , shaderIntegerDotProduct{ shaderIntegerDotProduct_ }\n      , maintenance4{ maintenance4_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVulkan13Features( PhysicalDeviceVulkan13Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceVulkan13Features( VkPhysicalDeviceVulkan13Features const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceVulkan13Features( *reinterpret_cast<PhysicalDeviceVulkan13Features const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceVulkan13Features & operator=( PhysicalDeviceVulkan13Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceVulkan13Features & operator=( VkPhysicalDeviceVulkan13Features const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan13Features const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan13Features & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan13Features & setRobustImageAccess( VULKAN_HPP_NAMESPACE::Bool32 robustImageAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      robustImageAccess = robustImageAccess_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan13Features & setInlineUniformBlock( VULKAN_HPP_NAMESPACE::Bool32 inlineUniformBlock_ ) VULKAN_HPP_NOEXCEPT\n    {\n      inlineUniformBlock = inlineUniformBlock_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan13Features & setDescriptorBindingInlineUniformBlockUpdateAfterBind(\n      VULKAN_HPP_NAMESPACE::Bool32 descriptorBindingInlineUniformBlockUpdateAfterBind_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorBindingInlineUniformBlockUpdateAfterBind = descriptorBindingInlineUniformBlockUpdateAfterBind_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan13Features &\n      setPipelineCreationCacheControl( VULKAN_HPP_NAMESPACE::Bool32 pipelineCreationCacheControl_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineCreationCacheControl = pipelineCreationCacheControl_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan13Features & setPrivateData( VULKAN_HPP_NAMESPACE::Bool32 privateData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      privateData = privateData_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan13Features &\n      setShaderDemoteToHelperInvocation( VULKAN_HPP_NAMESPACE::Bool32 shaderDemoteToHelperInvocation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderDemoteToHelperInvocation = shaderDemoteToHelperInvocation_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan13Features &\n      setShaderTerminateInvocation( VULKAN_HPP_NAMESPACE::Bool32 shaderTerminateInvocation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderTerminateInvocation = shaderTerminateInvocation_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan13Features & setSubgroupSizeControl( VULKAN_HPP_NAMESPACE::Bool32 subgroupSizeControl_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subgroupSizeControl = subgroupSizeControl_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan13Features & setComputeFullSubgroups( VULKAN_HPP_NAMESPACE::Bool32 computeFullSubgroups_ ) VULKAN_HPP_NOEXCEPT\n    {\n      computeFullSubgroups = computeFullSubgroups_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan13Features & setSynchronization2( VULKAN_HPP_NAMESPACE::Bool32 synchronization2_ ) VULKAN_HPP_NOEXCEPT\n    {\n      synchronization2 = synchronization2_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan13Features &\n      setTextureCompressionASTC_HDR( VULKAN_HPP_NAMESPACE::Bool32 textureCompressionASTC_HDR_ ) VULKAN_HPP_NOEXCEPT\n    {\n      textureCompressionASTC_HDR = textureCompressionASTC_HDR_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan13Features &\n      setShaderZeroInitializeWorkgroupMemory( VULKAN_HPP_NAMESPACE::Bool32 shaderZeroInitializeWorkgroupMemory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderZeroInitializeWorkgroupMemory = shaderZeroInitializeWorkgroupMemory_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan13Features & setDynamicRendering( VULKAN_HPP_NAMESPACE::Bool32 dynamicRendering_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dynamicRendering = dynamicRendering_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan13Features &\n      setShaderIntegerDotProduct( VULKAN_HPP_NAMESPACE::Bool32 shaderIntegerDotProduct_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderIntegerDotProduct = shaderIntegerDotProduct_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan13Features & setMaintenance4( VULKAN_HPP_NAMESPACE::Bool32 maintenance4_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maintenance4 = maintenance4_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceVulkan13Features const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceVulkan13Features *>( this );\n    }\n\n    operator VkPhysicalDeviceVulkan13Features &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceVulkan13Features *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       robustImageAccess,\n                       inlineUniformBlock,\n                       descriptorBindingInlineUniformBlockUpdateAfterBind,\n                       pipelineCreationCacheControl,\n                       privateData,\n                       shaderDemoteToHelperInvocation,\n                       shaderTerminateInvocation,\n                       subgroupSizeControl,\n                       computeFullSubgroups,\n                       synchronization2,\n                       textureCompressionASTC_HDR,\n                       shaderZeroInitializeWorkgroupMemory,\n                       dynamicRendering,\n                       shaderIntegerDotProduct,\n                       maintenance4 );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceVulkan13Features const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceVulkan13Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( robustImageAccess == rhs.robustImageAccess ) &&\n             ( inlineUniformBlock == rhs.inlineUniformBlock ) &&\n             ( descriptorBindingInlineUniformBlockUpdateAfterBind == rhs.descriptorBindingInlineUniformBlockUpdateAfterBind ) &&\n             ( pipelineCreationCacheControl == rhs.pipelineCreationCacheControl ) && ( privateData == rhs.privateData ) &&\n             ( shaderDemoteToHelperInvocation == rhs.shaderDemoteToHelperInvocation ) && ( shaderTerminateInvocation == rhs.shaderTerminateInvocation ) &&\n             ( subgroupSizeControl == rhs.subgroupSizeControl ) && ( computeFullSubgroups == rhs.computeFullSubgroups ) &&\n             ( synchronization2 == rhs.synchronization2 ) && ( textureCompressionASTC_HDR == rhs.textureCompressionASTC_HDR ) &&\n             ( shaderZeroInitializeWorkgroupMemory == rhs.shaderZeroInitializeWorkgroupMemory ) && ( dynamicRendering == rhs.dynamicRendering ) &&\n             ( shaderIntegerDotProduct == rhs.shaderIntegerDotProduct ) && ( maintenance4 == rhs.maintenance4 );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceVulkan13Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                              = StructureType::ePhysicalDeviceVulkan13Features;\n    void *                              pNext                                              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        robustImageAccess                                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        inlineUniformBlock                                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        descriptorBindingInlineUniformBlockUpdateAfterBind = {};\n    VULKAN_HPP_NAMESPACE::Bool32        pipelineCreationCacheControl                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        privateData                                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderDemoteToHelperInvocation                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderTerminateInvocation                          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        subgroupSizeControl                                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        computeFullSubgroups                               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        synchronization2                                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        textureCompressionASTC_HDR                         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderZeroInitializeWorkgroupMemory                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        dynamicRendering                                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderIntegerDotProduct                            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        maintenance4                                       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceVulkan13Features>\n  {\n    using Type = PhysicalDeviceVulkan13Features;\n  };\n\n  struct PhysicalDeviceVulkan13Properties\n  {\n    using NativeType = VkPhysicalDeviceVulkan13Properties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceVulkan13Properties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceVulkan13Properties( uint32_t                               minSubgroupSize_                                                         = {},\n                                        uint32_t                               maxSubgroupSize_                                                         = {},\n                                        uint32_t                               maxComputeWorkgroupSubgroups_                                            = {},\n                                        VULKAN_HPP_NAMESPACE::ShaderStageFlags requiredSubgroupSizeStages_                                              = {},\n                                        uint32_t                               maxInlineUniformBlockSize_                                               = {},\n                                        uint32_t                               maxPerStageDescriptorInlineUniformBlocks_                                = {},\n                                        uint32_t                               maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks_                 = {},\n                                        uint32_t                               maxDescriptorSetInlineUniformBlocks_                                     = {},\n                                        uint32_t                               maxDescriptorSetUpdateAfterBindInlineUniformBlocks_                      = {},\n                                        uint32_t                               maxInlineUniformTotalSize_                                               = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct8BitUnsignedAccelerated_                                = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct8BitSignedAccelerated_                                  = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct8BitMixedSignednessAccelerated_                         = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct4x8BitPackedUnsignedAccelerated_                        = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct4x8BitPackedSignedAccelerated_                          = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct4x8BitPackedMixedSignednessAccelerated_                 = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct16BitUnsignedAccelerated_                               = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct16BitSignedAccelerated_                                 = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct16BitMixedSignednessAccelerated_                        = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct32BitUnsignedAccelerated_                               = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct32BitSignedAccelerated_                                 = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct32BitMixedSignednessAccelerated_                        = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct64BitUnsignedAccelerated_                               = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct64BitSignedAccelerated_                                 = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct64BitMixedSignednessAccelerated_                        = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32           integerDotProductAccumulatingSaturating8BitUnsignedAccelerated_          = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32           integerDotProductAccumulatingSaturating8BitSignedAccelerated_            = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32           integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated_   = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32           integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated_  = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32           integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated_    = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32     integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated_ = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32     integerDotProductAccumulatingSaturating16BitUnsignedAccelerated_               = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32     integerDotProductAccumulatingSaturating16BitSignedAccelerated_                 = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32     integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated_        = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32     integerDotProductAccumulatingSaturating32BitUnsignedAccelerated_               = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32     integerDotProductAccumulatingSaturating32BitSignedAccelerated_                 = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32     integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated_        = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32     integerDotProductAccumulatingSaturating64BitUnsignedAccelerated_               = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32     integerDotProductAccumulatingSaturating64BitSignedAccelerated_                 = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32     integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated_        = {},\n                                        VULKAN_HPP_NAMESPACE::DeviceSize storageTexelBufferOffsetAlignmentBytes_                                        = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32     storageTexelBufferOffsetSingleTexelAlignment_                                  = {},\n                                        VULKAN_HPP_NAMESPACE::DeviceSize uniformTexelBufferOffsetAlignmentBytes_                                        = {},\n                                        VULKAN_HPP_NAMESPACE::Bool32     uniformTexelBufferOffsetSingleTexelAlignment_                                  = {},\n                                        VULKAN_HPP_NAMESPACE::DeviceSize maxBufferSize_                                                                 = {},\n                                        void *                           pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , minSubgroupSize{ minSubgroupSize_ }\n      , maxSubgroupSize{ maxSubgroupSize_ }\n      , maxComputeWorkgroupSubgroups{ maxComputeWorkgroupSubgroups_ }\n      , requiredSubgroupSizeStages{ requiredSubgroupSizeStages_ }\n      , maxInlineUniformBlockSize{ maxInlineUniformBlockSize_ }\n      , maxPerStageDescriptorInlineUniformBlocks{ maxPerStageDescriptorInlineUniformBlocks_ }\n      , maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks{ maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks_ }\n      , maxDescriptorSetInlineUniformBlocks{ maxDescriptorSetInlineUniformBlocks_ }\n      , maxDescriptorSetUpdateAfterBindInlineUniformBlocks{ maxDescriptorSetUpdateAfterBindInlineUniformBlocks_ }\n      , maxInlineUniformTotalSize{ maxInlineUniformTotalSize_ }\n      , integerDotProduct8BitUnsignedAccelerated{ integerDotProduct8BitUnsignedAccelerated_ }\n      , integerDotProduct8BitSignedAccelerated{ integerDotProduct8BitSignedAccelerated_ }\n      , integerDotProduct8BitMixedSignednessAccelerated{ integerDotProduct8BitMixedSignednessAccelerated_ }\n      , integerDotProduct4x8BitPackedUnsignedAccelerated{ integerDotProduct4x8BitPackedUnsignedAccelerated_ }\n      , integerDotProduct4x8BitPackedSignedAccelerated{ integerDotProduct4x8BitPackedSignedAccelerated_ }\n      , integerDotProduct4x8BitPackedMixedSignednessAccelerated{ integerDotProduct4x8BitPackedMixedSignednessAccelerated_ }\n      , integerDotProduct16BitUnsignedAccelerated{ integerDotProduct16BitUnsignedAccelerated_ }\n      , integerDotProduct16BitSignedAccelerated{ integerDotProduct16BitSignedAccelerated_ }\n      , integerDotProduct16BitMixedSignednessAccelerated{ integerDotProduct16BitMixedSignednessAccelerated_ }\n      , integerDotProduct32BitUnsignedAccelerated{ integerDotProduct32BitUnsignedAccelerated_ }\n      , integerDotProduct32BitSignedAccelerated{ integerDotProduct32BitSignedAccelerated_ }\n      , integerDotProduct32BitMixedSignednessAccelerated{ integerDotProduct32BitMixedSignednessAccelerated_ }\n      , integerDotProduct64BitUnsignedAccelerated{ integerDotProduct64BitUnsignedAccelerated_ }\n      , integerDotProduct64BitSignedAccelerated{ integerDotProduct64BitSignedAccelerated_ }\n      , integerDotProduct64BitMixedSignednessAccelerated{ integerDotProduct64BitMixedSignednessAccelerated_ }\n      , integerDotProductAccumulatingSaturating8BitUnsignedAccelerated{ integerDotProductAccumulatingSaturating8BitUnsignedAccelerated_ }\n      , integerDotProductAccumulatingSaturating8BitSignedAccelerated{ integerDotProductAccumulatingSaturating8BitSignedAccelerated_ }\n      , integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated{ integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated_ }\n      , integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated{ integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated_ }\n      , integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated{ integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated_ }\n      , integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated{ integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated_ }\n      , integerDotProductAccumulatingSaturating16BitUnsignedAccelerated{ integerDotProductAccumulatingSaturating16BitUnsignedAccelerated_ }\n      , integerDotProductAccumulatingSaturating16BitSignedAccelerated{ integerDotProductAccumulatingSaturating16BitSignedAccelerated_ }\n      , integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated{ integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated_ }\n      , integerDotProductAccumulatingSaturating32BitUnsignedAccelerated{ integerDotProductAccumulatingSaturating32BitUnsignedAccelerated_ }\n      , integerDotProductAccumulatingSaturating32BitSignedAccelerated{ integerDotProductAccumulatingSaturating32BitSignedAccelerated_ }\n      , integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated{ integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated_ }\n      , integerDotProductAccumulatingSaturating64BitUnsignedAccelerated{ integerDotProductAccumulatingSaturating64BitUnsignedAccelerated_ }\n      , integerDotProductAccumulatingSaturating64BitSignedAccelerated{ integerDotProductAccumulatingSaturating64BitSignedAccelerated_ }\n      , integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated{ integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated_ }\n      , storageTexelBufferOffsetAlignmentBytes{ storageTexelBufferOffsetAlignmentBytes_ }\n      , storageTexelBufferOffsetSingleTexelAlignment{ storageTexelBufferOffsetSingleTexelAlignment_ }\n      , uniformTexelBufferOffsetAlignmentBytes{ uniformTexelBufferOffsetAlignmentBytes_ }\n      , uniformTexelBufferOffsetSingleTexelAlignment{ uniformTexelBufferOffsetSingleTexelAlignment_ }\n      , maxBufferSize{ maxBufferSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVulkan13Properties( PhysicalDeviceVulkan13Properties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceVulkan13Properties( VkPhysicalDeviceVulkan13Properties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceVulkan13Properties( *reinterpret_cast<PhysicalDeviceVulkan13Properties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceVulkan13Properties & operator=( PhysicalDeviceVulkan13Properties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceVulkan13Properties & operator=( VkPhysicalDeviceVulkan13Properties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan13Properties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceVulkan13Properties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceVulkan13Properties *>( this );\n    }\n\n    operator VkPhysicalDeviceVulkan13Properties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceVulkan13Properties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ShaderStageFlags const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       minSubgroupSize,\n                       maxSubgroupSize,\n                       maxComputeWorkgroupSubgroups,\n                       requiredSubgroupSizeStages,\n                       maxInlineUniformBlockSize,\n                       maxPerStageDescriptorInlineUniformBlocks,\n                       maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks,\n                       maxDescriptorSetInlineUniformBlocks,\n                       maxDescriptorSetUpdateAfterBindInlineUniformBlocks,\n                       maxInlineUniformTotalSize,\n                       integerDotProduct8BitUnsignedAccelerated,\n                       integerDotProduct8BitSignedAccelerated,\n                       integerDotProduct8BitMixedSignednessAccelerated,\n                       integerDotProduct4x8BitPackedUnsignedAccelerated,\n                       integerDotProduct4x8BitPackedSignedAccelerated,\n                       integerDotProduct4x8BitPackedMixedSignednessAccelerated,\n                       integerDotProduct16BitUnsignedAccelerated,\n                       integerDotProduct16BitSignedAccelerated,\n                       integerDotProduct16BitMixedSignednessAccelerated,\n                       integerDotProduct32BitUnsignedAccelerated,\n                       integerDotProduct32BitSignedAccelerated,\n                       integerDotProduct32BitMixedSignednessAccelerated,\n                       integerDotProduct64BitUnsignedAccelerated,\n                       integerDotProduct64BitSignedAccelerated,\n                       integerDotProduct64BitMixedSignednessAccelerated,\n                       integerDotProductAccumulatingSaturating8BitUnsignedAccelerated,\n                       integerDotProductAccumulatingSaturating8BitSignedAccelerated,\n                       integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated,\n                       integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated,\n                       integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated,\n                       integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated,\n                       integerDotProductAccumulatingSaturating16BitUnsignedAccelerated,\n                       integerDotProductAccumulatingSaturating16BitSignedAccelerated,\n                       integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated,\n                       integerDotProductAccumulatingSaturating32BitUnsignedAccelerated,\n                       integerDotProductAccumulatingSaturating32BitSignedAccelerated,\n                       integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated,\n                       integerDotProductAccumulatingSaturating64BitUnsignedAccelerated,\n                       integerDotProductAccumulatingSaturating64BitSignedAccelerated,\n                       integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated,\n                       storageTexelBufferOffsetAlignmentBytes,\n                       storageTexelBufferOffsetSingleTexelAlignment,\n                       uniformTexelBufferOffsetAlignmentBytes,\n                       uniformTexelBufferOffsetSingleTexelAlignment,\n                       maxBufferSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceVulkan13Properties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceVulkan13Properties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( minSubgroupSize == rhs.minSubgroupSize ) && ( maxSubgroupSize == rhs.maxSubgroupSize ) &&\n             ( maxComputeWorkgroupSubgroups == rhs.maxComputeWorkgroupSubgroups ) && ( requiredSubgroupSizeStages == rhs.requiredSubgroupSizeStages ) &&\n             ( maxInlineUniformBlockSize == rhs.maxInlineUniformBlockSize ) &&\n             ( maxPerStageDescriptorInlineUniformBlocks == rhs.maxPerStageDescriptorInlineUniformBlocks ) &&\n             ( maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks == rhs.maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks ) &&\n             ( maxDescriptorSetInlineUniformBlocks == rhs.maxDescriptorSetInlineUniformBlocks ) &&\n             ( maxDescriptorSetUpdateAfterBindInlineUniformBlocks == rhs.maxDescriptorSetUpdateAfterBindInlineUniformBlocks ) &&\n             ( maxInlineUniformTotalSize == rhs.maxInlineUniformTotalSize ) &&\n             ( integerDotProduct8BitUnsignedAccelerated == rhs.integerDotProduct8BitUnsignedAccelerated ) &&\n             ( integerDotProduct8BitSignedAccelerated == rhs.integerDotProduct8BitSignedAccelerated ) &&\n             ( integerDotProduct8BitMixedSignednessAccelerated == rhs.integerDotProduct8BitMixedSignednessAccelerated ) &&\n             ( integerDotProduct4x8BitPackedUnsignedAccelerated == rhs.integerDotProduct4x8BitPackedUnsignedAccelerated ) &&\n             ( integerDotProduct4x8BitPackedSignedAccelerated == rhs.integerDotProduct4x8BitPackedSignedAccelerated ) &&\n             ( integerDotProduct4x8BitPackedMixedSignednessAccelerated == rhs.integerDotProduct4x8BitPackedMixedSignednessAccelerated ) &&\n             ( integerDotProduct16BitUnsignedAccelerated == rhs.integerDotProduct16BitUnsignedAccelerated ) &&\n             ( integerDotProduct16BitSignedAccelerated == rhs.integerDotProduct16BitSignedAccelerated ) &&\n             ( integerDotProduct16BitMixedSignednessAccelerated == rhs.integerDotProduct16BitMixedSignednessAccelerated ) &&\n             ( integerDotProduct32BitUnsignedAccelerated == rhs.integerDotProduct32BitUnsignedAccelerated ) &&\n             ( integerDotProduct32BitSignedAccelerated == rhs.integerDotProduct32BitSignedAccelerated ) &&\n             ( integerDotProduct32BitMixedSignednessAccelerated == rhs.integerDotProduct32BitMixedSignednessAccelerated ) &&\n             ( integerDotProduct64BitUnsignedAccelerated == rhs.integerDotProduct64BitUnsignedAccelerated ) &&\n             ( integerDotProduct64BitSignedAccelerated == rhs.integerDotProduct64BitSignedAccelerated ) &&\n             ( integerDotProduct64BitMixedSignednessAccelerated == rhs.integerDotProduct64BitMixedSignednessAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating8BitUnsignedAccelerated == rhs.integerDotProductAccumulatingSaturating8BitUnsignedAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating8BitSignedAccelerated == rhs.integerDotProductAccumulatingSaturating8BitSignedAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated ==\n               rhs.integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated ==\n               rhs.integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated ==\n               rhs.integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated ==\n               rhs.integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating16BitUnsignedAccelerated == rhs.integerDotProductAccumulatingSaturating16BitUnsignedAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating16BitSignedAccelerated == rhs.integerDotProductAccumulatingSaturating16BitSignedAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated ==\n               rhs.integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating32BitUnsignedAccelerated == rhs.integerDotProductAccumulatingSaturating32BitUnsignedAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating32BitSignedAccelerated == rhs.integerDotProductAccumulatingSaturating32BitSignedAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated ==\n               rhs.integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating64BitUnsignedAccelerated == rhs.integerDotProductAccumulatingSaturating64BitUnsignedAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating64BitSignedAccelerated == rhs.integerDotProductAccumulatingSaturating64BitSignedAccelerated ) &&\n             ( integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated ==\n               rhs.integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated ) &&\n             ( storageTexelBufferOffsetAlignmentBytes == rhs.storageTexelBufferOffsetAlignmentBytes ) &&\n             ( storageTexelBufferOffsetSingleTexelAlignment == rhs.storageTexelBufferOffsetSingleTexelAlignment ) &&\n             ( uniformTexelBufferOffsetAlignmentBytes == rhs.uniformTexelBufferOffsetAlignmentBytes ) &&\n             ( uniformTexelBufferOffsetSingleTexelAlignment == rhs.uniformTexelBufferOffsetSingleTexelAlignment ) && ( maxBufferSize == rhs.maxBufferSize );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceVulkan13Properties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType                                                          = StructureType::ePhysicalDeviceVulkan13Properties;\n    void *                                 pNext                                                          = {};\n    uint32_t                               minSubgroupSize                                                = {};\n    uint32_t                               maxSubgroupSize                                                = {};\n    uint32_t                               maxComputeWorkgroupSubgroups                                   = {};\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags requiredSubgroupSizeStages                                     = {};\n    uint32_t                               maxInlineUniformBlockSize                                      = {};\n    uint32_t                               maxPerStageDescriptorInlineUniformBlocks                       = {};\n    uint32_t                               maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks        = {};\n    uint32_t                               maxDescriptorSetInlineUniformBlocks                            = {};\n    uint32_t                               maxDescriptorSetUpdateAfterBindInlineUniformBlocks             = {};\n    uint32_t                               maxInlineUniformTotalSize                                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct8BitUnsignedAccelerated                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct8BitSignedAccelerated                         = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct8BitMixedSignednessAccelerated                = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct4x8BitPackedUnsignedAccelerated               = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct4x8BitPackedSignedAccelerated                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct4x8BitPackedMixedSignednessAccelerated        = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct16BitUnsignedAccelerated                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct16BitSignedAccelerated                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct16BitMixedSignednessAccelerated               = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct32BitUnsignedAccelerated                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct32BitSignedAccelerated                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct32BitMixedSignednessAccelerated               = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct64BitUnsignedAccelerated                      = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct64BitSignedAccelerated                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProduct64BitMixedSignednessAccelerated               = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProductAccumulatingSaturating8BitUnsignedAccelerated = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProductAccumulatingSaturating8BitSignedAccelerated   = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated         = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated        = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated          = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProductAccumulatingSaturating16BitUnsignedAccelerated               = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProductAccumulatingSaturating16BitSignedAccelerated                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated        = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProductAccumulatingSaturating32BitUnsignedAccelerated               = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProductAccumulatingSaturating32BitSignedAccelerated                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated        = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProductAccumulatingSaturating64BitUnsignedAccelerated               = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProductAccumulatingSaturating64BitSignedAccelerated                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32           integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated        = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize       storageTexelBufferOffsetAlignmentBytes                                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32           storageTexelBufferOffsetSingleTexelAlignment                                  = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize       uniformTexelBufferOffsetAlignmentBytes                                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32           uniformTexelBufferOffsetSingleTexelAlignment                                  = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize       maxBufferSize                                                                 = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceVulkan13Properties>\n  {\n    using Type = PhysicalDeviceVulkan13Properties;\n  };\n\n  struct PhysicalDeviceVulkan14Features\n  {\n    using NativeType = VkPhysicalDeviceVulkan14Features;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceVulkan14Features;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVulkan14Features( VULKAN_HPP_NAMESPACE::Bool32 globalPriorityQuery_                    = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderSubgroupRotate_                   = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderSubgroupRotateClustered_          = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderFloatControls2_                   = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 shaderExpectAssume_                     = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 rectangularLines_                       = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 bresenhamLines_                         = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 smoothLines_                            = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 stippledRectangularLines_               = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 stippledBresenhamLines_                 = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 stippledSmoothLines_                    = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 vertexAttributeInstanceRateDivisor_     = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 vertexAttributeInstanceRateZeroDivisor_ = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 indexTypeUint8_                         = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 dynamicRenderingLocalRead_              = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 maintenance5_                           = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 maintenance6_                           = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 pipelineProtectedAccess_                = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 pipelineRobustness_                     = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 hostImageCopy_                          = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32 pushDescriptor_                         = {},\n                                                         void *                       pNext_                                  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , globalPriorityQuery{ globalPriorityQuery_ }\n      , shaderSubgroupRotate{ shaderSubgroupRotate_ }\n      , shaderSubgroupRotateClustered{ shaderSubgroupRotateClustered_ }\n      , shaderFloatControls2{ shaderFloatControls2_ }\n      , shaderExpectAssume{ shaderExpectAssume_ }\n      , rectangularLines{ rectangularLines_ }\n      , bresenhamLines{ bresenhamLines_ }\n      , smoothLines{ smoothLines_ }\n      , stippledRectangularLines{ stippledRectangularLines_ }\n      , stippledBresenhamLines{ stippledBresenhamLines_ }\n      , stippledSmoothLines{ stippledSmoothLines_ }\n      , vertexAttributeInstanceRateDivisor{ vertexAttributeInstanceRateDivisor_ }\n      , vertexAttributeInstanceRateZeroDivisor{ vertexAttributeInstanceRateZeroDivisor_ }\n      , indexTypeUint8{ indexTypeUint8_ }\n      , dynamicRenderingLocalRead{ dynamicRenderingLocalRead_ }\n      , maintenance5{ maintenance5_ }\n      , maintenance6{ maintenance6_ }\n      , pipelineProtectedAccess{ pipelineProtectedAccess_ }\n      , pipelineRobustness{ pipelineRobustness_ }\n      , hostImageCopy{ hostImageCopy_ }\n      , pushDescriptor{ pushDescriptor_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVulkan14Features( PhysicalDeviceVulkan14Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceVulkan14Features( VkPhysicalDeviceVulkan14Features const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceVulkan14Features( *reinterpret_cast<PhysicalDeviceVulkan14Features const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceVulkan14Features & operator=( PhysicalDeviceVulkan14Features const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceVulkan14Features & operator=( VkPhysicalDeviceVulkan14Features const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan14Features const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Features & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Features & setGlobalPriorityQuery( VULKAN_HPP_NAMESPACE::Bool32 globalPriorityQuery_ ) VULKAN_HPP_NOEXCEPT\n    {\n      globalPriorityQuery = globalPriorityQuery_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Features & setShaderSubgroupRotate( VULKAN_HPP_NAMESPACE::Bool32 shaderSubgroupRotate_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSubgroupRotate = shaderSubgroupRotate_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Features &\n      setShaderSubgroupRotateClustered( VULKAN_HPP_NAMESPACE::Bool32 shaderSubgroupRotateClustered_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderSubgroupRotateClustered = shaderSubgroupRotateClustered_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Features & setShaderFloatControls2( VULKAN_HPP_NAMESPACE::Bool32 shaderFloatControls2_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderFloatControls2 = shaderFloatControls2_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Features & setShaderExpectAssume( VULKAN_HPP_NAMESPACE::Bool32 shaderExpectAssume_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderExpectAssume = shaderExpectAssume_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Features & setRectangularLines( VULKAN_HPP_NAMESPACE::Bool32 rectangularLines_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rectangularLines = rectangularLines_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Features & setBresenhamLines( VULKAN_HPP_NAMESPACE::Bool32 bresenhamLines_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bresenhamLines = bresenhamLines_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Features & setSmoothLines( VULKAN_HPP_NAMESPACE::Bool32 smoothLines_ ) VULKAN_HPP_NOEXCEPT\n    {\n      smoothLines = smoothLines_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Features &\n      setStippledRectangularLines( VULKAN_HPP_NAMESPACE::Bool32 stippledRectangularLines_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stippledRectangularLines = stippledRectangularLines_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Features &\n      setStippledBresenhamLines( VULKAN_HPP_NAMESPACE::Bool32 stippledBresenhamLines_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stippledBresenhamLines = stippledBresenhamLines_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Features & setStippledSmoothLines( VULKAN_HPP_NAMESPACE::Bool32 stippledSmoothLines_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stippledSmoothLines = stippledSmoothLines_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Features &\n      setVertexAttributeInstanceRateDivisor( VULKAN_HPP_NAMESPACE::Bool32 vertexAttributeInstanceRateDivisor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexAttributeInstanceRateDivisor = vertexAttributeInstanceRateDivisor_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Features &\n      setVertexAttributeInstanceRateZeroDivisor( VULKAN_HPP_NAMESPACE::Bool32 vertexAttributeInstanceRateZeroDivisor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexAttributeInstanceRateZeroDivisor = vertexAttributeInstanceRateZeroDivisor_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Features & setIndexTypeUint8( VULKAN_HPP_NAMESPACE::Bool32 indexTypeUint8_ ) VULKAN_HPP_NOEXCEPT\n    {\n      indexTypeUint8 = indexTypeUint8_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Features &\n      setDynamicRenderingLocalRead( VULKAN_HPP_NAMESPACE::Bool32 dynamicRenderingLocalRead_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dynamicRenderingLocalRead = dynamicRenderingLocalRead_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Features & setMaintenance5( VULKAN_HPP_NAMESPACE::Bool32 maintenance5_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maintenance5 = maintenance5_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Features & setMaintenance6( VULKAN_HPP_NAMESPACE::Bool32 maintenance6_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maintenance6 = maintenance6_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Features &\n      setPipelineProtectedAccess( VULKAN_HPP_NAMESPACE::Bool32 pipelineProtectedAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineProtectedAccess = pipelineProtectedAccess_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Features & setPipelineRobustness( VULKAN_HPP_NAMESPACE::Bool32 pipelineRobustness_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineRobustness = pipelineRobustness_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Features & setHostImageCopy( VULKAN_HPP_NAMESPACE::Bool32 hostImageCopy_ ) VULKAN_HPP_NOEXCEPT\n    {\n      hostImageCopy = hostImageCopy_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Features & setPushDescriptor( VULKAN_HPP_NAMESPACE::Bool32 pushDescriptor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pushDescriptor = pushDescriptor_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceVulkan14Features const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceVulkan14Features *>( this );\n    }\n\n    operator VkPhysicalDeviceVulkan14Features &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceVulkan14Features *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       globalPriorityQuery,\n                       shaderSubgroupRotate,\n                       shaderSubgroupRotateClustered,\n                       shaderFloatControls2,\n                       shaderExpectAssume,\n                       rectangularLines,\n                       bresenhamLines,\n                       smoothLines,\n                       stippledRectangularLines,\n                       stippledBresenhamLines,\n                       stippledSmoothLines,\n                       vertexAttributeInstanceRateDivisor,\n                       vertexAttributeInstanceRateZeroDivisor,\n                       indexTypeUint8,\n                       dynamicRenderingLocalRead,\n                       maintenance5,\n                       maintenance6,\n                       pipelineProtectedAccess,\n                       pipelineRobustness,\n                       hostImageCopy,\n                       pushDescriptor );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceVulkan14Features const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceVulkan14Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( globalPriorityQuery == rhs.globalPriorityQuery ) &&\n             ( shaderSubgroupRotate == rhs.shaderSubgroupRotate ) && ( shaderSubgroupRotateClustered == rhs.shaderSubgroupRotateClustered ) &&\n             ( shaderFloatControls2 == rhs.shaderFloatControls2 ) && ( shaderExpectAssume == rhs.shaderExpectAssume ) &&\n             ( rectangularLines == rhs.rectangularLines ) && ( bresenhamLines == rhs.bresenhamLines ) && ( smoothLines == rhs.smoothLines ) &&\n             ( stippledRectangularLines == rhs.stippledRectangularLines ) && ( stippledBresenhamLines == rhs.stippledBresenhamLines ) &&\n             ( stippledSmoothLines == rhs.stippledSmoothLines ) && ( vertexAttributeInstanceRateDivisor == rhs.vertexAttributeInstanceRateDivisor ) &&\n             ( vertexAttributeInstanceRateZeroDivisor == rhs.vertexAttributeInstanceRateZeroDivisor ) && ( indexTypeUint8 == rhs.indexTypeUint8 ) &&\n             ( dynamicRenderingLocalRead == rhs.dynamicRenderingLocalRead ) && ( maintenance5 == rhs.maintenance5 ) && ( maintenance6 == rhs.maintenance6 ) &&\n             ( pipelineProtectedAccess == rhs.pipelineProtectedAccess ) && ( pipelineRobustness == rhs.pipelineRobustness ) &&\n             ( hostImageCopy == rhs.hostImageCopy ) && ( pushDescriptor == rhs.pushDescriptor );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceVulkan14Features const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                  = StructureType::ePhysicalDeviceVulkan14Features;\n    void *                              pNext                                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        globalPriorityQuery                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSubgroupRotate                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderSubgroupRotateClustered          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderFloatControls2                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderExpectAssume                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        rectangularLines                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        bresenhamLines                         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        smoothLines                            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        stippledRectangularLines               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        stippledBresenhamLines                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        stippledSmoothLines                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        vertexAttributeInstanceRateDivisor     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        vertexAttributeInstanceRateZeroDivisor = {};\n    VULKAN_HPP_NAMESPACE::Bool32        indexTypeUint8                         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        dynamicRenderingLocalRead              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        maintenance5                           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        maintenance6                           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        pipelineProtectedAccess                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        pipelineRobustness                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32        hostImageCopy                          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        pushDescriptor                         = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceVulkan14Features>\n  {\n    using Type = PhysicalDeviceVulkan14Features;\n  };\n\n  struct PhysicalDeviceVulkan14Properties\n  {\n    using NativeType = VkPhysicalDeviceVulkan14Properties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceVulkan14Properties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Properties(\n      uint32_t                                               lineSubPixelPrecisionBits_                           = {},\n      uint32_t                                               maxVertexAttribDivisor_                              = {},\n      VULKAN_HPP_NAMESPACE::Bool32                           supportsNonZeroFirstInstance_                        = {},\n      uint32_t                                               maxPushDescriptors_                                  = {},\n      VULKAN_HPP_NAMESPACE::Bool32                           dynamicRenderingLocalReadDepthStencilAttachments_    = {},\n      VULKAN_HPP_NAMESPACE::Bool32                           dynamicRenderingLocalReadMultisampledAttachments_    = {},\n      VULKAN_HPP_NAMESPACE::Bool32                           earlyFragmentMultisampleCoverageAfterSampleCounting_ = {},\n      VULKAN_HPP_NAMESPACE::Bool32                           earlyFragmentSampleMaskTestBeforeSampleCounting_     = {},\n      VULKAN_HPP_NAMESPACE::Bool32                           depthStencilSwizzleOneSupport_                       = {},\n      VULKAN_HPP_NAMESPACE::Bool32                           polygonModePointSize_                                = {},\n      VULKAN_HPP_NAMESPACE::Bool32                           nonStrictSinglePixelWideLinesUseParallelogram_       = {},\n      VULKAN_HPP_NAMESPACE::Bool32                           nonStrictWideLinesUseParallelogram_                  = {},\n      VULKAN_HPP_NAMESPACE::Bool32                           blockTexelViewCompatibleMultipleLayers_              = {},\n      uint32_t                                               maxCombinedImageSamplerDescriptorCount_              = {},\n      VULKAN_HPP_NAMESPACE::Bool32                           fragmentShadingRateClampCombinerInputs_              = {},\n      VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior defaultRobustnessStorageBuffers_ =\n        VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior::eDeviceDefault,\n      VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior defaultRobustnessUniformBuffers_ =\n        VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior::eDeviceDefault,\n      VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior defaultRobustnessVertexInputs_ =\n        VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior::eDeviceDefault,\n      VULKAN_HPP_NAMESPACE::PipelineRobustnessImageBehavior defaultRobustnessImages_ = VULKAN_HPP_NAMESPACE::PipelineRobustnessImageBehavior::eDeviceDefault,\n      uint32_t                                              copySrcLayoutCount_      = {},\n      VULKAN_HPP_NAMESPACE::ImageLayout *                   pCopySrcLayouts_         = {},\n      uint32_t                                              copyDstLayoutCount_      = {},\n      VULKAN_HPP_NAMESPACE::ImageLayout *                   pCopyDstLayouts_         = {},\n      std::array<uint8_t, VK_UUID_SIZE> const &             optimalTilingLayoutUUID_ = {},\n      VULKAN_HPP_NAMESPACE::Bool32                          identicalMemoryTypeRequirements_ = {},\n      void *                                                pNext_                           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , lineSubPixelPrecisionBits{ lineSubPixelPrecisionBits_ }\n      , maxVertexAttribDivisor{ maxVertexAttribDivisor_ }\n      , supportsNonZeroFirstInstance{ supportsNonZeroFirstInstance_ }\n      , maxPushDescriptors{ maxPushDescriptors_ }\n      , dynamicRenderingLocalReadDepthStencilAttachments{ dynamicRenderingLocalReadDepthStencilAttachments_ }\n      , dynamicRenderingLocalReadMultisampledAttachments{ dynamicRenderingLocalReadMultisampledAttachments_ }\n      , earlyFragmentMultisampleCoverageAfterSampleCounting{ earlyFragmentMultisampleCoverageAfterSampleCounting_ }\n      , earlyFragmentSampleMaskTestBeforeSampleCounting{ earlyFragmentSampleMaskTestBeforeSampleCounting_ }\n      , depthStencilSwizzleOneSupport{ depthStencilSwizzleOneSupport_ }\n      , polygonModePointSize{ polygonModePointSize_ }\n      , nonStrictSinglePixelWideLinesUseParallelogram{ nonStrictSinglePixelWideLinesUseParallelogram_ }\n      , nonStrictWideLinesUseParallelogram{ nonStrictWideLinesUseParallelogram_ }\n      , blockTexelViewCompatibleMultipleLayers{ blockTexelViewCompatibleMultipleLayers_ }\n      , maxCombinedImageSamplerDescriptorCount{ maxCombinedImageSamplerDescriptorCount_ }\n      , fragmentShadingRateClampCombinerInputs{ fragmentShadingRateClampCombinerInputs_ }\n      , defaultRobustnessStorageBuffers{ defaultRobustnessStorageBuffers_ }\n      , defaultRobustnessUniformBuffers{ defaultRobustnessUniformBuffers_ }\n      , defaultRobustnessVertexInputs{ defaultRobustnessVertexInputs_ }\n      , defaultRobustnessImages{ defaultRobustnessImages_ }\n      , copySrcLayoutCount{ copySrcLayoutCount_ }\n      , pCopySrcLayouts{ pCopySrcLayouts_ }\n      , copyDstLayoutCount{ copyDstLayoutCount_ }\n      , pCopyDstLayouts{ pCopyDstLayouts_ }\n      , optimalTilingLayoutUUID{ optimalTilingLayoutUUID_ }\n      , identicalMemoryTypeRequirements{ identicalMemoryTypeRequirements_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkan14Properties( PhysicalDeviceVulkan14Properties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceVulkan14Properties( VkPhysicalDeviceVulkan14Properties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceVulkan14Properties( *reinterpret_cast<PhysicalDeviceVulkan14Properties const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceVulkan14Properties & operator=( PhysicalDeviceVulkan14Properties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceVulkan14Properties & operator=( VkPhysicalDeviceVulkan14Properties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan14Properties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPhysicalDeviceVulkan14Properties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceVulkan14Properties *>( this );\n    }\n\n    operator VkPhysicalDeviceVulkan14Properties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceVulkan14Properties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior const &,\n               VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior const &,\n               VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior const &,\n               VULKAN_HPP_NAMESPACE::PipelineRobustnessImageBehavior const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout * const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout * const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       lineSubPixelPrecisionBits,\n                       maxVertexAttribDivisor,\n                       supportsNonZeroFirstInstance,\n                       maxPushDescriptors,\n                       dynamicRenderingLocalReadDepthStencilAttachments,\n                       dynamicRenderingLocalReadMultisampledAttachments,\n                       earlyFragmentMultisampleCoverageAfterSampleCounting,\n                       earlyFragmentSampleMaskTestBeforeSampleCounting,\n                       depthStencilSwizzleOneSupport,\n                       polygonModePointSize,\n                       nonStrictSinglePixelWideLinesUseParallelogram,\n                       nonStrictWideLinesUseParallelogram,\n                       blockTexelViewCompatibleMultipleLayers,\n                       maxCombinedImageSamplerDescriptorCount,\n                       fragmentShadingRateClampCombinerInputs,\n                       defaultRobustnessStorageBuffers,\n                       defaultRobustnessUniformBuffers,\n                       defaultRobustnessVertexInputs,\n                       defaultRobustnessImages,\n                       copySrcLayoutCount,\n                       pCopySrcLayouts,\n                       copyDstLayoutCount,\n                       pCopyDstLayouts,\n                       optimalTilingLayoutUUID,\n                       identicalMemoryTypeRequirements );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceVulkan14Properties const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceVulkan14Properties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( lineSubPixelPrecisionBits == rhs.lineSubPixelPrecisionBits ) &&\n             ( maxVertexAttribDivisor == rhs.maxVertexAttribDivisor ) && ( supportsNonZeroFirstInstance == rhs.supportsNonZeroFirstInstance ) &&\n             ( maxPushDescriptors == rhs.maxPushDescriptors ) &&\n             ( dynamicRenderingLocalReadDepthStencilAttachments == rhs.dynamicRenderingLocalReadDepthStencilAttachments ) &&\n             ( dynamicRenderingLocalReadMultisampledAttachments == rhs.dynamicRenderingLocalReadMultisampledAttachments ) &&\n             ( earlyFragmentMultisampleCoverageAfterSampleCounting == rhs.earlyFragmentMultisampleCoverageAfterSampleCounting ) &&\n             ( earlyFragmentSampleMaskTestBeforeSampleCounting == rhs.earlyFragmentSampleMaskTestBeforeSampleCounting ) &&\n             ( depthStencilSwizzleOneSupport == rhs.depthStencilSwizzleOneSupport ) && ( polygonModePointSize == rhs.polygonModePointSize ) &&\n             ( nonStrictSinglePixelWideLinesUseParallelogram == rhs.nonStrictSinglePixelWideLinesUseParallelogram ) &&\n             ( nonStrictWideLinesUseParallelogram == rhs.nonStrictWideLinesUseParallelogram ) &&\n             ( blockTexelViewCompatibleMultipleLayers == rhs.blockTexelViewCompatibleMultipleLayers ) &&\n             ( maxCombinedImageSamplerDescriptorCount == rhs.maxCombinedImageSamplerDescriptorCount ) &&\n             ( fragmentShadingRateClampCombinerInputs == rhs.fragmentShadingRateClampCombinerInputs ) &&\n             ( defaultRobustnessStorageBuffers == rhs.defaultRobustnessStorageBuffers ) &&\n             ( defaultRobustnessUniformBuffers == rhs.defaultRobustnessUniformBuffers ) &&\n             ( defaultRobustnessVertexInputs == rhs.defaultRobustnessVertexInputs ) && ( defaultRobustnessImages == rhs.defaultRobustnessImages ) &&\n             ( copySrcLayoutCount == rhs.copySrcLayoutCount ) && ( pCopySrcLayouts == rhs.pCopySrcLayouts ) &&\n             ( copyDstLayoutCount == rhs.copyDstLayoutCount ) && ( pCopyDstLayouts == rhs.pCopyDstLayouts ) &&\n             ( optimalTilingLayoutUUID == rhs.optimalTilingLayoutUUID ) && ( identicalMemoryTypeRequirements == rhs.identicalMemoryTypeRequirements );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceVulkan14Properties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType                                            = StructureType::ePhysicalDeviceVulkan14Properties;\n    void *                                                 pNext                                            = {};\n    uint32_t                                               lineSubPixelPrecisionBits                        = {};\n    uint32_t                                               maxVertexAttribDivisor                           = {};\n    VULKAN_HPP_NAMESPACE::Bool32                           supportsNonZeroFirstInstance                     = {};\n    uint32_t                                               maxPushDescriptors                               = {};\n    VULKAN_HPP_NAMESPACE::Bool32                           dynamicRenderingLocalReadDepthStencilAttachments = {};\n    VULKAN_HPP_NAMESPACE::Bool32                           dynamicRenderingLocalReadMultisampledAttachments = {};\n    VULKAN_HPP_NAMESPACE::Bool32                           earlyFragmentMultisampleCoverageAfterSampleCounting = {};\n    VULKAN_HPP_NAMESPACE::Bool32                           earlyFragmentSampleMaskTestBeforeSampleCounting     = {};\n    VULKAN_HPP_NAMESPACE::Bool32                           depthStencilSwizzleOneSupport                       = {};\n    VULKAN_HPP_NAMESPACE::Bool32                           polygonModePointSize                                = {};\n    VULKAN_HPP_NAMESPACE::Bool32                           nonStrictSinglePixelWideLinesUseParallelogram       = {};\n    VULKAN_HPP_NAMESPACE::Bool32                           nonStrictWideLinesUseParallelogram                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32                           blockTexelViewCompatibleMultipleLayers              = {};\n    uint32_t                                               maxCombinedImageSamplerDescriptorCount              = {};\n    VULKAN_HPP_NAMESPACE::Bool32                           fragmentShadingRateClampCombinerInputs              = {};\n    VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior defaultRobustnessStorageBuffers =\n      VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior::eDeviceDefault;\n    VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior defaultRobustnessUniformBuffers =\n      VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior::eDeviceDefault;\n    VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior defaultRobustnessVertexInputs =\n      VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior::eDeviceDefault;\n    VULKAN_HPP_NAMESPACE::PipelineRobustnessImageBehavior       defaultRobustnessImages = VULKAN_HPP_NAMESPACE::PipelineRobustnessImageBehavior::eDeviceDefault;\n    uint32_t                                                    copySrcLayoutCount      = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout *                         pCopySrcLayouts         = {};\n    uint32_t                                                    copyDstLayoutCount      = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout *                         pCopyDstLayouts         = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> optimalTilingLayoutUUID = {};\n    VULKAN_HPP_NAMESPACE::Bool32                                identicalMemoryTypeRequirements = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceVulkan14Properties>\n  {\n    using Type = PhysicalDeviceVulkan14Properties;\n  };\n\n  struct PhysicalDeviceVulkanMemoryModelFeatures\n  {\n    using NativeType = VkPhysicalDeviceVulkanMemoryModelFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceVulkanMemoryModelFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVulkanMemoryModelFeatures( VULKAN_HPP_NAMESPACE::Bool32 vulkanMemoryModel_                             = {},\n                                                                  VULKAN_HPP_NAMESPACE::Bool32 vulkanMemoryModelDeviceScope_                  = {},\n                                                                  VULKAN_HPP_NAMESPACE::Bool32 vulkanMemoryModelAvailabilityVisibilityChains_ = {},\n                                                                  void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , vulkanMemoryModel{ vulkanMemoryModel_ }\n      , vulkanMemoryModelDeviceScope{ vulkanMemoryModelDeviceScope_ }\n      , vulkanMemoryModelAvailabilityVisibilityChains{ vulkanMemoryModelAvailabilityVisibilityChains_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceVulkanMemoryModelFeatures( PhysicalDeviceVulkanMemoryModelFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceVulkanMemoryModelFeatures( VkPhysicalDeviceVulkanMemoryModelFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceVulkanMemoryModelFeatures( *reinterpret_cast<PhysicalDeviceVulkanMemoryModelFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceVulkanMemoryModelFeatures & operator=( PhysicalDeviceVulkanMemoryModelFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceVulkanMemoryModelFeatures & operator=( VkPhysicalDeviceVulkanMemoryModelFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkanMemoryModelFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkanMemoryModelFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkanMemoryModelFeatures &\n      setVulkanMemoryModel( VULKAN_HPP_NAMESPACE::Bool32 vulkanMemoryModel_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vulkanMemoryModel = vulkanMemoryModel_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkanMemoryModelFeatures &\n      setVulkanMemoryModelDeviceScope( VULKAN_HPP_NAMESPACE::Bool32 vulkanMemoryModelDeviceScope_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vulkanMemoryModelDeviceScope = vulkanMemoryModelDeviceScope_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceVulkanMemoryModelFeatures &\n      setVulkanMemoryModelAvailabilityVisibilityChains( VULKAN_HPP_NAMESPACE::Bool32 vulkanMemoryModelAvailabilityVisibilityChains_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vulkanMemoryModelAvailabilityVisibilityChains = vulkanMemoryModelAvailabilityVisibilityChains_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceVulkanMemoryModelFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceVulkanMemoryModelFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceVulkanMemoryModelFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceVulkanMemoryModelFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, vulkanMemoryModel, vulkanMemoryModelDeviceScope, vulkanMemoryModelAvailabilityVisibilityChains );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceVulkanMemoryModelFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceVulkanMemoryModelFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( vulkanMemoryModel == rhs.vulkanMemoryModel ) &&\n             ( vulkanMemoryModelDeviceScope == rhs.vulkanMemoryModelDeviceScope ) &&\n             ( vulkanMemoryModelAvailabilityVisibilityChains == rhs.vulkanMemoryModelAvailabilityVisibilityChains );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceVulkanMemoryModelFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                         = StructureType::ePhysicalDeviceVulkanMemoryModelFeatures;\n    void *                              pNext                                         = {};\n    VULKAN_HPP_NAMESPACE::Bool32        vulkanMemoryModel                             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        vulkanMemoryModelDeviceScope                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        vulkanMemoryModelAvailabilityVisibilityChains = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceVulkanMemoryModelFeatures>\n  {\n    using Type = PhysicalDeviceVulkanMemoryModelFeatures;\n  };\n\n  using PhysicalDeviceVulkanMemoryModelFeaturesKHR = PhysicalDeviceVulkanMemoryModelFeatures;\n\n  struct PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR\n  {\n    using NativeType = VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 workgroupMemoryExplicitLayout_                  = {},\n                                                              VULKAN_HPP_NAMESPACE::Bool32 workgroupMemoryExplicitLayoutScalarBlockLayout_ = {},\n                                                              VULKAN_HPP_NAMESPACE::Bool32 workgroupMemoryExplicitLayout8BitAccess_        = {},\n                                                              VULKAN_HPP_NAMESPACE::Bool32 workgroupMemoryExplicitLayout16BitAccess_       = {},\n                                                              void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , workgroupMemoryExplicitLayout{ workgroupMemoryExplicitLayout_ }\n      , workgroupMemoryExplicitLayoutScalarBlockLayout{ workgroupMemoryExplicitLayoutScalarBlockLayout_ }\n      , workgroupMemoryExplicitLayout8BitAccess{ workgroupMemoryExplicitLayout8BitAccess_ }\n      , workgroupMemoryExplicitLayout16BitAccess{ workgroupMemoryExplicitLayout16BitAccess_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR( PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR const & rhs )\n      VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR( VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR( *reinterpret_cast<PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR &\n      operator=( PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR &\n      operator=( VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR &\n      setWorkgroupMemoryExplicitLayout( VULKAN_HPP_NAMESPACE::Bool32 workgroupMemoryExplicitLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      workgroupMemoryExplicitLayout = workgroupMemoryExplicitLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR &\n      setWorkgroupMemoryExplicitLayoutScalarBlockLayout( VULKAN_HPP_NAMESPACE::Bool32 workgroupMemoryExplicitLayoutScalarBlockLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      workgroupMemoryExplicitLayoutScalarBlockLayout = workgroupMemoryExplicitLayoutScalarBlockLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR &\n      setWorkgroupMemoryExplicitLayout8BitAccess( VULKAN_HPP_NAMESPACE::Bool32 workgroupMemoryExplicitLayout8BitAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      workgroupMemoryExplicitLayout8BitAccess = workgroupMemoryExplicitLayout8BitAccess_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR &\n      setWorkgroupMemoryExplicitLayout16BitAccess( VULKAN_HPP_NAMESPACE::Bool32 workgroupMemoryExplicitLayout16BitAccess_ ) VULKAN_HPP_NOEXCEPT\n    {\n      workgroupMemoryExplicitLayout16BitAccess = workgroupMemoryExplicitLayout16BitAccess_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR *>( this );\n    }\n\n    operator VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       workgroupMemoryExplicitLayout,\n                       workgroupMemoryExplicitLayoutScalarBlockLayout,\n                       workgroupMemoryExplicitLayout8BitAccess,\n                       workgroupMemoryExplicitLayout16BitAccess );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( workgroupMemoryExplicitLayout == rhs.workgroupMemoryExplicitLayout ) &&\n             ( workgroupMemoryExplicitLayoutScalarBlockLayout == rhs.workgroupMemoryExplicitLayoutScalarBlockLayout ) &&\n             ( workgroupMemoryExplicitLayout8BitAccess == rhs.workgroupMemoryExplicitLayout8BitAccess ) &&\n             ( workgroupMemoryExplicitLayout16BitAccess == rhs.workgroupMemoryExplicitLayout16BitAccess );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                                          = StructureType::ePhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR;\n    void *                              pNext                                          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        workgroupMemoryExplicitLayout                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32        workgroupMemoryExplicitLayoutScalarBlockLayout = {};\n    VULKAN_HPP_NAMESPACE::Bool32        workgroupMemoryExplicitLayout8BitAccess        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        workgroupMemoryExplicitLayout16BitAccess       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR>\n  {\n    using Type = PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR;\n  };\n\n  struct PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 ycbcr2plane444Formats_ = {},\n                                                                         void *                       pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , ycbcr2plane444Formats{ ycbcr2plane444Formats_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT( PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT( VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT( *reinterpret_cast<PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT & operator=( PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT & operator=( VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT &\n      setYcbcr2plane444Formats( VULKAN_HPP_NAMESPACE::Bool32 ycbcr2plane444Formats_ ) VULKAN_HPP_NOEXCEPT\n    {\n      ycbcr2plane444Formats = ycbcr2plane444Formats_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, ycbcr2plane444Formats );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( ycbcr2plane444Formats == rhs.ycbcr2plane444Formats );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                 = StructureType::ePhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT;\n    void *                              pNext                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        ycbcr2plane444Formats = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT>\n  {\n    using Type = PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT;\n  };\n\n  struct PhysicalDeviceYcbcrDegammaFeaturesQCOM\n  {\n    using NativeType = VkPhysicalDeviceYcbcrDegammaFeaturesQCOM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceYcbcrDegammaFeaturesQCOM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceYcbcrDegammaFeaturesQCOM( VULKAN_HPP_NAMESPACE::Bool32 ycbcrDegamma_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , ycbcrDegamma{ ycbcrDegamma_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceYcbcrDegammaFeaturesQCOM( PhysicalDeviceYcbcrDegammaFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceYcbcrDegammaFeaturesQCOM( VkPhysicalDeviceYcbcrDegammaFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceYcbcrDegammaFeaturesQCOM( *reinterpret_cast<PhysicalDeviceYcbcrDegammaFeaturesQCOM const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceYcbcrDegammaFeaturesQCOM & operator=( PhysicalDeviceYcbcrDegammaFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceYcbcrDegammaFeaturesQCOM & operator=( VkPhysicalDeviceYcbcrDegammaFeaturesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceYcbcrDegammaFeaturesQCOM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceYcbcrDegammaFeaturesQCOM & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceYcbcrDegammaFeaturesQCOM & setYcbcrDegamma( VULKAN_HPP_NAMESPACE::Bool32 ycbcrDegamma_ ) VULKAN_HPP_NOEXCEPT\n    {\n      ycbcrDegamma = ycbcrDegamma_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceYcbcrDegammaFeaturesQCOM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceYcbcrDegammaFeaturesQCOM *>( this );\n    }\n\n    operator VkPhysicalDeviceYcbcrDegammaFeaturesQCOM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceYcbcrDegammaFeaturesQCOM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, ycbcrDegamma );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceYcbcrDegammaFeaturesQCOM const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceYcbcrDegammaFeaturesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( ycbcrDegamma == rhs.ycbcrDegamma );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceYcbcrDegammaFeaturesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType        = StructureType::ePhysicalDeviceYcbcrDegammaFeaturesQCOM;\n    void *                              pNext        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        ycbcrDegamma = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceYcbcrDegammaFeaturesQCOM>\n  {\n    using Type = PhysicalDeviceYcbcrDegammaFeaturesQCOM;\n  };\n\n  struct PhysicalDeviceYcbcrImageArraysFeaturesEXT\n  {\n    using NativeType = VkPhysicalDeviceYcbcrImageArraysFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceYcbcrImageArraysFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceYcbcrImageArraysFeaturesEXT( VULKAN_HPP_NAMESPACE::Bool32 ycbcrImageArrays_ = {},\n                                                                    void *                       pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , ycbcrImageArrays{ ycbcrImageArrays_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceYcbcrImageArraysFeaturesEXT( PhysicalDeviceYcbcrImageArraysFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceYcbcrImageArraysFeaturesEXT( VkPhysicalDeviceYcbcrImageArraysFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceYcbcrImageArraysFeaturesEXT( *reinterpret_cast<PhysicalDeviceYcbcrImageArraysFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceYcbcrImageArraysFeaturesEXT & operator=( PhysicalDeviceYcbcrImageArraysFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceYcbcrImageArraysFeaturesEXT & operator=( VkPhysicalDeviceYcbcrImageArraysFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceYcbcrImageArraysFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceYcbcrImageArraysFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceYcbcrImageArraysFeaturesEXT &\n      setYcbcrImageArrays( VULKAN_HPP_NAMESPACE::Bool32 ycbcrImageArrays_ ) VULKAN_HPP_NOEXCEPT\n    {\n      ycbcrImageArrays = ycbcrImageArrays_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceYcbcrImageArraysFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT *>( this );\n    }\n\n    operator VkPhysicalDeviceYcbcrImageArraysFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, ycbcrImageArrays );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceYcbcrImageArraysFeaturesEXT const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceYcbcrImageArraysFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( ycbcrImageArrays == rhs.ycbcrImageArrays );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceYcbcrImageArraysFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType            = StructureType::ePhysicalDeviceYcbcrImageArraysFeaturesEXT;\n    void *                              pNext            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        ycbcrImageArrays = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceYcbcrImageArraysFeaturesEXT>\n  {\n    using Type = PhysicalDeviceYcbcrImageArraysFeaturesEXT;\n  };\n\n  struct PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures\n  {\n    using NativeType = VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePhysicalDeviceZeroInitializeWorkgroupMemoryFeatures;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures( VULKAN_HPP_NAMESPACE::Bool32 shaderZeroInitializeWorkgroupMemory_ = {},\n                                                                              void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shaderZeroInitializeWorkgroupMemory{ shaderZeroInitializeWorkgroupMemory_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures( PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures( VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures( *reinterpret_cast<PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures const *>( &rhs ) )\n    {\n    }\n\n    PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures &\n      operator=( PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures & operator=( VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures &\n      setShaderZeroInitializeWorkgroupMemory( VULKAN_HPP_NAMESPACE::Bool32 shaderZeroInitializeWorkgroupMemory_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shaderZeroInitializeWorkgroupMemory = shaderZeroInitializeWorkgroupMemory_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures *>( this );\n    }\n\n    operator VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shaderZeroInitializeWorkgroupMemory );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures const & ) const = default;\n#else\n    bool operator==( PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shaderZeroInitializeWorkgroupMemory == rhs.shaderZeroInitializeWorkgroupMemory );\n#  endif\n    }\n\n    bool operator!=( PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                               = StructureType::ePhysicalDeviceZeroInitializeWorkgroupMemoryFeatures;\n    void *                              pNext                               = {};\n    VULKAN_HPP_NAMESPACE::Bool32        shaderZeroInitializeWorkgroupMemory = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePhysicalDeviceZeroInitializeWorkgroupMemoryFeatures>\n  {\n    using Type = PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures;\n  };\n\n  using PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR = PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures;\n\n  struct PipelineBinaryKeyKHR\n  {\n    using NativeType = VkPipelineBinaryKeyKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineBinaryKeyKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryKeyKHR( uint32_t                                                         keySize_ = {},\n                                                  std::array<uint8_t, VK_MAX_PIPELINE_BINARY_KEY_SIZE_KHR> const & key_     = {},\n                                                  void *                                                           pNext_   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , keySize{ keySize_ }\n      , key{ key_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryKeyKHR( PipelineBinaryKeyKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineBinaryKeyKHR( VkPipelineBinaryKeyKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineBinaryKeyKHR( *reinterpret_cast<PipelineBinaryKeyKHR const *>( &rhs ) )\n    {\n    }\n\n    PipelineBinaryKeyKHR & operator=( PipelineBinaryKeyKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineBinaryKeyKHR & operator=( VkPipelineBinaryKeyKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryKeyKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryKeyKHR & setKeySize( uint32_t keySize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      keySize = keySize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryKeyKHR & setKey( std::array<uint8_t, VK_MAX_PIPELINE_BINARY_KEY_SIZE_KHR> key_ ) VULKAN_HPP_NOEXCEPT\n    {\n      key = key_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineBinaryKeyKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineBinaryKeyKHR *>( this );\n    }\n\n    operator VkPipelineBinaryKeyKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineBinaryKeyKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_MAX_PIPELINE_BINARY_KEY_SIZE_KHR> const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, keySize, key );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineBinaryKeyKHR const & ) const = default;\n#else\n    bool operator==( PipelineBinaryKeyKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( keySize == rhs.keySize ) && ( key == rhs.key );\n#  endif\n    }\n\n    bool operator!=( PipelineBinaryKeyKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                                sType   = StructureType::ePipelineBinaryKeyKHR;\n    void *                                                                             pNext   = {};\n    uint32_t                                                                           keySize = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_MAX_PIPELINE_BINARY_KEY_SIZE_KHR> key     = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineBinaryKeyKHR>\n  {\n    using Type = PipelineBinaryKeyKHR;\n  };\n\n  struct PipelineBinaryDataKHR\n  {\n    using NativeType = VkPipelineBinaryDataKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineBinaryDataKHR( size_t dataSize_ = {}, void * pData_ = {} ) VULKAN_HPP_NOEXCEPT\n      : dataSize{ dataSize_ }\n      , pData{ pData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineBinaryDataKHR( PipelineBinaryDataKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineBinaryDataKHR( VkPipelineBinaryDataKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineBinaryDataKHR( *reinterpret_cast<PipelineBinaryDataKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    PipelineBinaryDataKHR( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<T> const & data_ ) : dataSize( data_.size() * sizeof( T ) ), pData( data_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PipelineBinaryDataKHR & operator=( PipelineBinaryDataKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineBinaryDataKHR & operator=( VkPipelineBinaryDataKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineBinaryDataKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryDataKHR & setDataSize( size_t dataSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dataSize = dataSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryDataKHR & setPData( void * pData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pData = pData_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    PipelineBinaryDataKHR & setData( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<T> const & data_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dataSize = data_.size() * sizeof( T );\n      pData    = data_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineBinaryDataKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineBinaryDataKHR *>( this );\n    }\n\n    operator VkPipelineBinaryDataKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineBinaryDataKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<size_t const &, void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( dataSize, pData );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineBinaryDataKHR const & ) const = default;\n#else\n    bool operator==( PipelineBinaryDataKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( dataSize == rhs.dataSize ) && ( pData == rhs.pData );\n#  endif\n    }\n\n    bool operator!=( PipelineBinaryDataKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    size_t dataSize = {};\n    void * pData    = {};\n  };\n\n  struct PipelineBinaryKeysAndDataKHR\n  {\n    using NativeType = VkPipelineBinaryKeysAndDataKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryKeysAndDataKHR( uint32_t                                            binaryCount_         = {},\n                                                          const VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR *  pPipelineBinaryKeys_ = {},\n                                                          const VULKAN_HPP_NAMESPACE::PipelineBinaryDataKHR * pPipelineBinaryData_ = {} ) VULKAN_HPP_NOEXCEPT\n      : binaryCount{ binaryCount_ }\n      , pPipelineBinaryKeys{ pPipelineBinaryKeys_ }\n      , pPipelineBinaryData{ pPipelineBinaryData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryKeysAndDataKHR( PipelineBinaryKeysAndDataKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineBinaryKeysAndDataKHR( VkPipelineBinaryKeysAndDataKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineBinaryKeysAndDataKHR( *reinterpret_cast<PipelineBinaryKeysAndDataKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineBinaryKeysAndDataKHR(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR> const &  pipelineBinaryKeys_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineBinaryDataKHR> const & pipelineBinaryData_ = {} )\n      : binaryCount( static_cast<uint32_t>( pipelineBinaryKeys_.size() ) )\n      , pPipelineBinaryKeys( pipelineBinaryKeys_.data() )\n      , pPipelineBinaryData( pipelineBinaryData_.data() )\n    {\n#    ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( pipelineBinaryKeys_.size() == pipelineBinaryData_.size() );\n#    else\n      if ( pipelineBinaryKeys_.size() != pipelineBinaryData_.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING\n                          \"::PipelineBinaryKeysAndDataKHR::PipelineBinaryKeysAndDataKHR: pipelineBinaryKeys_.size() != pipelineBinaryData_.size()\" );\n      }\n#    endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PipelineBinaryKeysAndDataKHR & operator=( PipelineBinaryKeysAndDataKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineBinaryKeysAndDataKHR & operator=( VkPipelineBinaryKeysAndDataKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineBinaryKeysAndDataKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryKeysAndDataKHR & setBinaryCount( uint32_t binaryCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      binaryCount = binaryCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryKeysAndDataKHR &\n      setPPipelineBinaryKeys( const VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR * pPipelineBinaryKeys_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPipelineBinaryKeys = pPipelineBinaryKeys_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineBinaryKeysAndDataKHR & setPipelineBinaryKeys(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR> const & pipelineBinaryKeys_ ) VULKAN_HPP_NOEXCEPT\n    {\n      binaryCount         = static_cast<uint32_t>( pipelineBinaryKeys_.size() );\n      pPipelineBinaryKeys = pipelineBinaryKeys_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryKeysAndDataKHR &\n      setPPipelineBinaryData( const VULKAN_HPP_NAMESPACE::PipelineBinaryDataKHR * pPipelineBinaryData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPipelineBinaryData = pPipelineBinaryData_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineBinaryKeysAndDataKHR & setPipelineBinaryData(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineBinaryDataKHR> const & pipelineBinaryData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      binaryCount         = static_cast<uint32_t>( pipelineBinaryData_.size() );\n      pPipelineBinaryData = pipelineBinaryData_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineBinaryKeysAndDataKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineBinaryKeysAndDataKHR *>( this );\n    }\n\n    operator VkPipelineBinaryKeysAndDataKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineBinaryKeysAndDataKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, const VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR * const &, const VULKAN_HPP_NAMESPACE::PipelineBinaryDataKHR * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( binaryCount, pPipelineBinaryKeys, pPipelineBinaryData );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineBinaryKeysAndDataKHR const & ) const = default;\n#else\n    bool operator==( PipelineBinaryKeysAndDataKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( binaryCount == rhs.binaryCount ) && ( pPipelineBinaryKeys == rhs.pPipelineBinaryKeys ) && ( pPipelineBinaryData == rhs.pPipelineBinaryData );\n#  endif\n    }\n\n    bool operator!=( PipelineBinaryKeysAndDataKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                                            binaryCount         = {};\n    const VULKAN_HPP_NAMESPACE::PipelineBinaryKeyKHR *  pPipelineBinaryKeys = {};\n    const VULKAN_HPP_NAMESPACE::PipelineBinaryDataKHR * pPipelineBinaryData = {};\n  };\n\n  struct PipelineCreateInfoKHR\n  {\n    using NativeType = VkPipelineCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineCreateInfoKHR( void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT : pNext{ pNext_ } {}\n\n    VULKAN_HPP_CONSTEXPR PipelineCreateInfoKHR( PipelineCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineCreateInfoKHR( VkPipelineCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineCreateInfoKHR( *reinterpret_cast<PipelineCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    PipelineCreateInfoKHR & operator=( PipelineCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineCreateInfoKHR & operator=( VkPipelineCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineCreateInfoKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineCreateInfoKHR *>( this );\n    }\n\n    operator VkPipelineCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( PipelineCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext );\n#  endif\n    }\n\n    bool operator!=( PipelineCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType = StructureType::ePipelineCreateInfoKHR;\n    void *                              pNext = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineCreateInfoKHR>\n  {\n    using Type = PipelineCreateInfoKHR;\n  };\n\n  struct PipelineBinaryCreateInfoKHR\n  {\n    using NativeType = VkPipelineBinaryCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineBinaryCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryCreateInfoKHR( const VULKAN_HPP_NAMESPACE::PipelineBinaryKeysAndDataKHR * pKeysAndDataInfo_    = {},\n                                                         VULKAN_HPP_NAMESPACE::Pipeline                             pipeline_            = {},\n                                                         const VULKAN_HPP_NAMESPACE::PipelineCreateInfoKHR *        pPipelineCreateInfo_ = {},\n                                                         const void *                                               pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pKeysAndDataInfo{ pKeysAndDataInfo_ }\n      , pipeline{ pipeline_ }\n      , pPipelineCreateInfo{ pPipelineCreateInfo_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryCreateInfoKHR( PipelineBinaryCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineBinaryCreateInfoKHR( VkPipelineBinaryCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineBinaryCreateInfoKHR( *reinterpret_cast<PipelineBinaryCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    PipelineBinaryCreateInfoKHR & operator=( PipelineBinaryCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineBinaryCreateInfoKHR & operator=( VkPipelineBinaryCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineBinaryCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryCreateInfoKHR &\n      setPKeysAndDataInfo( const VULKAN_HPP_NAMESPACE::PipelineBinaryKeysAndDataKHR * pKeysAndDataInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pKeysAndDataInfo = pKeysAndDataInfo_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryCreateInfoKHR & setPipeline( VULKAN_HPP_NAMESPACE::Pipeline pipeline_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipeline = pipeline_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryCreateInfoKHR &\n      setPPipelineCreateInfo( const VULKAN_HPP_NAMESPACE::PipelineCreateInfoKHR * pPipelineCreateInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPipelineCreateInfo = pPipelineCreateInfo_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineBinaryCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineBinaryCreateInfoKHR *>( this );\n    }\n\n    operator VkPipelineBinaryCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineBinaryCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               const VULKAN_HPP_NAMESPACE::PipelineBinaryKeysAndDataKHR * const &,\n               VULKAN_HPP_NAMESPACE::Pipeline const &,\n               const VULKAN_HPP_NAMESPACE::PipelineCreateInfoKHR * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pKeysAndDataInfo, pipeline, pPipelineCreateInfo );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineBinaryCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( PipelineBinaryCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pKeysAndDataInfo == rhs.pKeysAndDataInfo ) && ( pipeline == rhs.pipeline ) &&\n             ( pPipelineCreateInfo == rhs.pPipelineCreateInfo );\n#  endif\n    }\n\n    bool operator!=( PipelineBinaryCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                        sType               = StructureType::ePipelineBinaryCreateInfoKHR;\n    const void *                                               pNext               = {};\n    const VULKAN_HPP_NAMESPACE::PipelineBinaryKeysAndDataKHR * pKeysAndDataInfo    = {};\n    VULKAN_HPP_NAMESPACE::Pipeline                             pipeline            = {};\n    const VULKAN_HPP_NAMESPACE::PipelineCreateInfoKHR *        pPipelineCreateInfo = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineBinaryCreateInfoKHR>\n  {\n    using Type = PipelineBinaryCreateInfoKHR;\n  };\n\n  struct PipelineBinaryDataInfoKHR\n  {\n    using NativeType = VkPipelineBinaryDataInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineBinaryDataInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineBinaryDataInfoKHR( VULKAN_HPP_NAMESPACE::PipelineBinaryKHR pipelineBinary_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pipelineBinary{ pipelineBinary_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineBinaryDataInfoKHR( PipelineBinaryDataInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineBinaryDataInfoKHR( VkPipelineBinaryDataInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineBinaryDataInfoKHR( *reinterpret_cast<PipelineBinaryDataInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    PipelineBinaryDataInfoKHR & operator=( PipelineBinaryDataInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineBinaryDataInfoKHR & operator=( VkPipelineBinaryDataInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineBinaryDataInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryDataInfoKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryDataInfoKHR & setPipelineBinary( VULKAN_HPP_NAMESPACE::PipelineBinaryKHR pipelineBinary_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineBinary = pipelineBinary_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineBinaryDataInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineBinaryDataInfoKHR *>( this );\n    }\n\n    operator VkPipelineBinaryDataInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineBinaryDataInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::PipelineBinaryKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pipelineBinary );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineBinaryDataInfoKHR const & ) const = default;\n#else\n    bool operator==( PipelineBinaryDataInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pipelineBinary == rhs.pipelineBinary );\n#  endif\n    }\n\n    bool operator!=( PipelineBinaryDataInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType     sType          = StructureType::ePipelineBinaryDataInfoKHR;\n    void *                                  pNext          = {};\n    VULKAN_HPP_NAMESPACE::PipelineBinaryKHR pipelineBinary = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineBinaryDataInfoKHR>\n  {\n    using Type = PipelineBinaryDataInfoKHR;\n  };\n\n  struct PipelineBinaryHandlesInfoKHR\n  {\n    using NativeType = VkPipelineBinaryHandlesInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineBinaryHandlesInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineBinaryHandlesInfoKHR( uint32_t                                  pipelineBinaryCount_ = {},\n                                                       VULKAN_HPP_NAMESPACE::PipelineBinaryKHR * pPipelineBinaries_   = {},\n                                                       const void *                              pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pipelineBinaryCount{ pipelineBinaryCount_ }\n      , pPipelineBinaries{ pPipelineBinaries_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineBinaryHandlesInfoKHR( PipelineBinaryHandlesInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineBinaryHandlesInfoKHR( VkPipelineBinaryHandlesInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineBinaryHandlesInfoKHR( *reinterpret_cast<PipelineBinaryHandlesInfoKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineBinaryHandlesInfoKHR( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR> const & pipelineBinaries_,\n                                  const void *                                                                                   pNext_ = nullptr )\n      : pNext( pNext_ ), pipelineBinaryCount( static_cast<uint32_t>( pipelineBinaries_.size() ) ), pPipelineBinaries( pipelineBinaries_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PipelineBinaryHandlesInfoKHR & operator=( PipelineBinaryHandlesInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineBinaryHandlesInfoKHR & operator=( VkPipelineBinaryHandlesInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineBinaryHandlesInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryHandlesInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryHandlesInfoKHR & setPipelineBinaryCount( uint32_t pipelineBinaryCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineBinaryCount = pipelineBinaryCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryHandlesInfoKHR &\n      setPPipelineBinaries( VULKAN_HPP_NAMESPACE::PipelineBinaryKHR * pPipelineBinaries_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPipelineBinaries = pPipelineBinaries_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineBinaryHandlesInfoKHR & setPipelineBinaries(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<VULKAN_HPP_NAMESPACE::PipelineBinaryKHR> const & pipelineBinaries_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineBinaryCount = static_cast<uint32_t>( pipelineBinaries_.size() );\n      pPipelineBinaries   = pipelineBinaries_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineBinaryHandlesInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineBinaryHandlesInfoKHR *>( this );\n    }\n\n    operator VkPipelineBinaryHandlesInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineBinaryHandlesInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, VULKAN_HPP_NAMESPACE::PipelineBinaryKHR * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pipelineBinaryCount, pPipelineBinaries );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineBinaryHandlesInfoKHR const & ) const = default;\n#else\n    bool operator==( PipelineBinaryHandlesInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pipelineBinaryCount == rhs.pipelineBinaryCount ) &&\n             ( pPipelineBinaries == rhs.pPipelineBinaries );\n#  endif\n    }\n\n    bool operator!=( PipelineBinaryHandlesInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType               = StructureType::ePipelineBinaryHandlesInfoKHR;\n    const void *                              pNext               = {};\n    uint32_t                                  pipelineBinaryCount = {};\n    VULKAN_HPP_NAMESPACE::PipelineBinaryKHR * pPipelineBinaries   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineBinaryHandlesInfoKHR>\n  {\n    using Type = PipelineBinaryHandlesInfoKHR;\n  };\n\n  struct PipelineBinaryInfoKHR\n  {\n    using NativeType = VkPipelineBinaryInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineBinaryInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineBinaryInfoKHR( uint32_t                                        binaryCount_       = {},\n                                                const VULKAN_HPP_NAMESPACE::PipelineBinaryKHR * pPipelineBinaries_ = {},\n                                                const void *                                    pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , binaryCount{ binaryCount_ }\n      , pPipelineBinaries{ pPipelineBinaries_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineBinaryInfoKHR( PipelineBinaryInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineBinaryInfoKHR( VkPipelineBinaryInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineBinaryInfoKHR( *reinterpret_cast<PipelineBinaryInfoKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineBinaryInfoKHR( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineBinaryKHR> const & pipelineBinaries_,\n                           const void *                                                                                         pNext_ = nullptr )\n      : pNext( pNext_ ), binaryCount( static_cast<uint32_t>( pipelineBinaries_.size() ) ), pPipelineBinaries( pipelineBinaries_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PipelineBinaryInfoKHR & operator=( PipelineBinaryInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineBinaryInfoKHR & operator=( VkPipelineBinaryInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineBinaryInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryInfoKHR & setBinaryCount( uint32_t binaryCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      binaryCount = binaryCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineBinaryInfoKHR &\n      setPPipelineBinaries( const VULKAN_HPP_NAMESPACE::PipelineBinaryKHR * pPipelineBinaries_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPipelineBinaries = pPipelineBinaries_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineBinaryInfoKHR & setPipelineBinaries(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineBinaryKHR> const & pipelineBinaries_ ) VULKAN_HPP_NOEXCEPT\n    {\n      binaryCount       = static_cast<uint32_t>( pipelineBinaries_.size() );\n      pPipelineBinaries = pipelineBinaries_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineBinaryInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineBinaryInfoKHR *>( this );\n    }\n\n    operator VkPipelineBinaryInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineBinaryInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::PipelineBinaryKHR * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, binaryCount, pPipelineBinaries );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineBinaryInfoKHR const & ) const = default;\n#else\n    bool operator==( PipelineBinaryInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( binaryCount == rhs.binaryCount ) && ( pPipelineBinaries == rhs.pPipelineBinaries );\n#  endif\n    }\n\n    bool operator!=( PipelineBinaryInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType             sType             = StructureType::ePipelineBinaryInfoKHR;\n    const void *                                    pNext             = {};\n    uint32_t                                        binaryCount       = {};\n    const VULKAN_HPP_NAMESPACE::PipelineBinaryKHR * pPipelineBinaries = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineBinaryInfoKHR>\n  {\n    using Type = PipelineBinaryInfoKHR;\n  };\n\n  struct PipelineCacheCreateInfo\n  {\n    using NativeType = VkPipelineCacheCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineCacheCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineCacheCreateInfo( VULKAN_HPP_NAMESPACE::PipelineCacheCreateFlags flags_           = {},\n                                                  size_t                                         initialDataSize_ = {},\n                                                  const void *                                   pInitialData_    = {},\n                                                  const void *                                   pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , initialDataSize{ initialDataSize_ }\n      , pInitialData{ pInitialData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineCacheCreateInfo( PipelineCacheCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineCacheCreateInfo( VkPipelineCacheCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineCacheCreateInfo( *reinterpret_cast<PipelineCacheCreateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    PipelineCacheCreateInfo( VULKAN_HPP_NAMESPACE::PipelineCacheCreateFlags                 flags_,\n                             VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & initialData_,\n                             const void *                                                   pNext_ = nullptr )\n      : pNext( pNext_ ), flags( flags_ ), initialDataSize( initialData_.size() * sizeof( T ) ), pInitialData( initialData_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PipelineCacheCreateInfo & operator=( PipelineCacheCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineCacheCreateInfo & operator=( VkPipelineCacheCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineCacheCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineCacheCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineCacheCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::PipelineCacheCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineCacheCreateInfo & setInitialDataSize( size_t initialDataSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      initialDataSize = initialDataSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineCacheCreateInfo & setPInitialData( const void * pInitialData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pInitialData = pInitialData_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    PipelineCacheCreateInfo & setInitialData( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & initialData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      initialDataSize = initialData_.size() * sizeof( T );\n      pInitialData    = initialData_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineCacheCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineCacheCreateInfo *>( this );\n    }\n\n    operator VkPipelineCacheCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineCacheCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineCacheCreateFlags const &,\n               size_t const &,\n               const void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, initialDataSize, pInitialData );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineCacheCreateInfo const & ) const = default;\n#else\n    bool operator==( PipelineCacheCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( initialDataSize == rhs.initialDataSize ) &&\n             ( pInitialData == rhs.pInitialData );\n#  endif\n    }\n\n    bool operator!=( PipelineCacheCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType            sType           = StructureType::ePipelineCacheCreateInfo;\n    const void *                                   pNext           = {};\n    VULKAN_HPP_NAMESPACE::PipelineCacheCreateFlags flags           = {};\n    size_t                                         initialDataSize = {};\n    const void *                                   pInitialData    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineCacheCreateInfo>\n  {\n    using Type = PipelineCacheCreateInfo;\n  };\n\n  struct PipelineCacheHeaderVersionOne\n  {\n    using NativeType = VkPipelineCacheHeaderVersionOne;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14\n      PipelineCacheHeaderVersionOne( uint32_t                                         headerSize_    = {},\n                                     VULKAN_HPP_NAMESPACE::PipelineCacheHeaderVersion headerVersion_ = VULKAN_HPP_NAMESPACE::PipelineCacheHeaderVersion::eOne,\n                                     uint32_t                                         vendorID_      = {},\n                                     uint32_t                                         deviceID_      = {},\n                                     std::array<uint8_t, VK_UUID_SIZE> const &        pipelineCacheUUID_ = {} ) VULKAN_HPP_NOEXCEPT\n      : headerSize{ headerSize_ }\n      , headerVersion{ headerVersion_ }\n      , vendorID{ vendorID_ }\n      , deviceID{ deviceID_ }\n      , pipelineCacheUUID{ pipelineCacheUUID_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineCacheHeaderVersionOne( PipelineCacheHeaderVersionOne const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineCacheHeaderVersionOne( VkPipelineCacheHeaderVersionOne const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineCacheHeaderVersionOne( *reinterpret_cast<PipelineCacheHeaderVersionOne const *>( &rhs ) )\n    {\n    }\n\n    PipelineCacheHeaderVersionOne & operator=( PipelineCacheHeaderVersionOne const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineCacheHeaderVersionOne & operator=( VkPipelineCacheHeaderVersionOne const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineCacheHeaderVersionOne const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineCacheHeaderVersionOne & setHeaderSize( uint32_t headerSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      headerSize = headerSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineCacheHeaderVersionOne &\n      setHeaderVersion( VULKAN_HPP_NAMESPACE::PipelineCacheHeaderVersion headerVersion_ ) VULKAN_HPP_NOEXCEPT\n    {\n      headerVersion = headerVersion_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineCacheHeaderVersionOne & setVendorID( uint32_t vendorID_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vendorID = vendorID_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineCacheHeaderVersionOne & setDeviceID( uint32_t deviceID_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceID = deviceID_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineCacheHeaderVersionOne & setPipelineCacheUUID( std::array<uint8_t, VK_UUID_SIZE> pipelineCacheUUID_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineCacheUUID = pipelineCacheUUID_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineCacheHeaderVersionOne const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineCacheHeaderVersionOne *>( this );\n    }\n\n    operator VkPipelineCacheHeaderVersionOne &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineCacheHeaderVersionOne *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &,\n               VULKAN_HPP_NAMESPACE::PipelineCacheHeaderVersion const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( headerSize, headerVersion, vendorID, deviceID, pipelineCacheUUID );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineCacheHeaderVersionOne const & ) const = default;\n#else\n    bool operator==( PipelineCacheHeaderVersionOne const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( headerSize == rhs.headerSize ) && ( headerVersion == rhs.headerVersion ) && ( vendorID == rhs.vendorID ) && ( deviceID == rhs.deviceID ) &&\n             ( pipelineCacheUUID == rhs.pipelineCacheUUID );\n#  endif\n    }\n\n    bool operator!=( PipelineCacheHeaderVersionOne const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                                                    headerSize        = {};\n    VULKAN_HPP_NAMESPACE::PipelineCacheHeaderVersion            headerVersion     = VULKAN_HPP_NAMESPACE::PipelineCacheHeaderVersion::eOne;\n    uint32_t                                                    vendorID          = {};\n    uint32_t                                                    deviceID          = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> pipelineCacheUUID = {};\n  };\n\n  struct PipelineColorBlendAdvancedStateCreateInfoEXT\n  {\n    using NativeType = VkPipelineColorBlendAdvancedStateCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineColorBlendAdvancedStateCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      PipelineColorBlendAdvancedStateCreateInfoEXT( VULKAN_HPP_NAMESPACE::Bool32          srcPremultiplied_ = {},\n                                                    VULKAN_HPP_NAMESPACE::Bool32          dstPremultiplied_ = {},\n                                                    VULKAN_HPP_NAMESPACE::BlendOverlapEXT blendOverlap_ = VULKAN_HPP_NAMESPACE::BlendOverlapEXT::eUncorrelated,\n                                                    const void *                          pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , srcPremultiplied{ srcPremultiplied_ }\n      , dstPremultiplied{ dstPremultiplied_ }\n      , blendOverlap{ blendOverlap_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineColorBlendAdvancedStateCreateInfoEXT( PipelineColorBlendAdvancedStateCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineColorBlendAdvancedStateCreateInfoEXT( VkPipelineColorBlendAdvancedStateCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineColorBlendAdvancedStateCreateInfoEXT( *reinterpret_cast<PipelineColorBlendAdvancedStateCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    PipelineColorBlendAdvancedStateCreateInfoEXT & operator=( PipelineColorBlendAdvancedStateCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineColorBlendAdvancedStateCreateInfoEXT & operator=( VkPipelineColorBlendAdvancedStateCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineColorBlendAdvancedStateCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorBlendAdvancedStateCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorBlendAdvancedStateCreateInfoEXT &\n      setSrcPremultiplied( VULKAN_HPP_NAMESPACE::Bool32 srcPremultiplied_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcPremultiplied = srcPremultiplied_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorBlendAdvancedStateCreateInfoEXT &\n      setDstPremultiplied( VULKAN_HPP_NAMESPACE::Bool32 dstPremultiplied_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstPremultiplied = dstPremultiplied_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorBlendAdvancedStateCreateInfoEXT &\n      setBlendOverlap( VULKAN_HPP_NAMESPACE::BlendOverlapEXT blendOverlap_ ) VULKAN_HPP_NOEXCEPT\n    {\n      blendOverlap = blendOverlap_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineColorBlendAdvancedStateCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineColorBlendAdvancedStateCreateInfoEXT *>( this );\n    }\n\n    operator VkPipelineColorBlendAdvancedStateCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineColorBlendAdvancedStateCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::BlendOverlapEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, srcPremultiplied, dstPremultiplied, blendOverlap );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineColorBlendAdvancedStateCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( PipelineColorBlendAdvancedStateCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( srcPremultiplied == rhs.srcPremultiplied ) && ( dstPremultiplied == rhs.dstPremultiplied ) &&\n             ( blendOverlap == rhs.blendOverlap );\n#  endif\n    }\n\n    bool operator!=( PipelineColorBlendAdvancedStateCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType   sType            = StructureType::ePipelineColorBlendAdvancedStateCreateInfoEXT;\n    const void *                          pNext            = {};\n    VULKAN_HPP_NAMESPACE::Bool32          srcPremultiplied = {};\n    VULKAN_HPP_NAMESPACE::Bool32          dstPremultiplied = {};\n    VULKAN_HPP_NAMESPACE::BlendOverlapEXT blendOverlap     = VULKAN_HPP_NAMESPACE::BlendOverlapEXT::eUncorrelated;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineColorBlendAdvancedStateCreateInfoEXT>\n  {\n    using Type = PipelineColorBlendAdvancedStateCreateInfoEXT;\n  };\n\n  struct PipelineColorWriteCreateInfoEXT\n  {\n    using NativeType = VkPipelineColorWriteCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineColorWriteCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineColorWriteCreateInfoEXT( uint32_t                             attachmentCount_    = {},\n                                                          const VULKAN_HPP_NAMESPACE::Bool32 * pColorWriteEnables_ = {},\n                                                          const void *                         pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , attachmentCount{ attachmentCount_ }\n      , pColorWriteEnables{ pColorWriteEnables_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineColorWriteCreateInfoEXT( PipelineColorWriteCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineColorWriteCreateInfoEXT( VkPipelineColorWriteCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineColorWriteCreateInfoEXT( *reinterpret_cast<PipelineColorWriteCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineColorWriteCreateInfoEXT( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Bool32> const & colorWriteEnables_,\n                                     const void *                                                                              pNext_ = nullptr )\n      : pNext( pNext_ ), attachmentCount( static_cast<uint32_t>( colorWriteEnables_.size() ) ), pColorWriteEnables( colorWriteEnables_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PipelineColorWriteCreateInfoEXT & operator=( PipelineColorWriteCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineColorWriteCreateInfoEXT & operator=( VkPipelineColorWriteCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineColorWriteCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorWriteCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorWriteCreateInfoEXT & setAttachmentCount( uint32_t attachmentCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      attachmentCount = attachmentCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineColorWriteCreateInfoEXT &\n      setPColorWriteEnables( const VULKAN_HPP_NAMESPACE::Bool32 * pColorWriteEnables_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pColorWriteEnables = pColorWriteEnables_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineColorWriteCreateInfoEXT &\n      setColorWriteEnables( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Bool32> const & colorWriteEnables_ ) VULKAN_HPP_NOEXCEPT\n    {\n      attachmentCount    = static_cast<uint32_t>( colorWriteEnables_.size() );\n      pColorWriteEnables = colorWriteEnables_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineColorWriteCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineColorWriteCreateInfoEXT *>( this );\n    }\n\n    operator VkPipelineColorWriteCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineColorWriteCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::Bool32 * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, attachmentCount, pColorWriteEnables );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineColorWriteCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( PipelineColorWriteCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( attachmentCount == rhs.attachmentCount ) && ( pColorWriteEnables == rhs.pColorWriteEnables );\n#  endif\n    }\n\n    bool operator!=( PipelineColorWriteCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType  sType              = StructureType::ePipelineColorWriteCreateInfoEXT;\n    const void *                         pNext              = {};\n    uint32_t                             attachmentCount    = {};\n    const VULKAN_HPP_NAMESPACE::Bool32 * pColorWriteEnables = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineColorWriteCreateInfoEXT>\n  {\n    using Type = PipelineColorWriteCreateInfoEXT;\n  };\n\n  struct PipelineCompilerControlCreateInfoAMD\n  {\n    using NativeType = VkPipelineCompilerControlCreateInfoAMD;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineCompilerControlCreateInfoAMD;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineCompilerControlCreateInfoAMD( VULKAN_HPP_NAMESPACE::PipelineCompilerControlFlagsAMD compilerControlFlags_ = {},\n                                                               const void *                                          pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , compilerControlFlags{ compilerControlFlags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineCompilerControlCreateInfoAMD( PipelineCompilerControlCreateInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineCompilerControlCreateInfoAMD( VkPipelineCompilerControlCreateInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineCompilerControlCreateInfoAMD( *reinterpret_cast<PipelineCompilerControlCreateInfoAMD const *>( &rhs ) )\n    {\n    }\n\n    PipelineCompilerControlCreateInfoAMD & operator=( PipelineCompilerControlCreateInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineCompilerControlCreateInfoAMD & operator=( VkPipelineCompilerControlCreateInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineCompilerControlCreateInfoAMD const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineCompilerControlCreateInfoAMD & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineCompilerControlCreateInfoAMD &\n      setCompilerControlFlags( VULKAN_HPP_NAMESPACE::PipelineCompilerControlFlagsAMD compilerControlFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      compilerControlFlags = compilerControlFlags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineCompilerControlCreateInfoAMD const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineCompilerControlCreateInfoAMD *>( this );\n    }\n\n    operator VkPipelineCompilerControlCreateInfoAMD &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineCompilerControlCreateInfoAMD *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::PipelineCompilerControlFlagsAMD const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, compilerControlFlags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineCompilerControlCreateInfoAMD const & ) const = default;\n#else\n    bool operator==( PipelineCompilerControlCreateInfoAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( compilerControlFlags == rhs.compilerControlFlags );\n#  endif\n    }\n\n    bool operator!=( PipelineCompilerControlCreateInfoAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                   sType                = StructureType::ePipelineCompilerControlCreateInfoAMD;\n    const void *                                          pNext                = {};\n    VULKAN_HPP_NAMESPACE::PipelineCompilerControlFlagsAMD compilerControlFlags = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineCompilerControlCreateInfoAMD>\n  {\n    using Type = PipelineCompilerControlCreateInfoAMD;\n  };\n\n  struct PipelineCoverageModulationStateCreateInfoNV\n  {\n    using NativeType = VkPipelineCoverageModulationStateCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineCoverageModulationStateCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineCoverageModulationStateCreateInfoNV(\n      VULKAN_HPP_NAMESPACE::PipelineCoverageModulationStateCreateFlagsNV flags_                         = {},\n      VULKAN_HPP_NAMESPACE::CoverageModulationModeNV                     coverageModulationMode_        = VULKAN_HPP_NAMESPACE::CoverageModulationModeNV::eNone,\n      VULKAN_HPP_NAMESPACE::Bool32                                       coverageModulationTableEnable_ = {},\n      uint32_t                                                           coverageModulationTableCount_  = {},\n      const float *                                                      pCoverageModulationTable_      = {},\n      const void *                                                       pNext_                         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , coverageModulationMode{ coverageModulationMode_ }\n      , coverageModulationTableEnable{ coverageModulationTableEnable_ }\n      , coverageModulationTableCount{ coverageModulationTableCount_ }\n      , pCoverageModulationTable{ pCoverageModulationTable_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineCoverageModulationStateCreateInfoNV( PipelineCoverageModulationStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineCoverageModulationStateCreateInfoNV( VkPipelineCoverageModulationStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineCoverageModulationStateCreateInfoNV( *reinterpret_cast<PipelineCoverageModulationStateCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineCoverageModulationStateCreateInfoNV( VULKAN_HPP_NAMESPACE::PipelineCoverageModulationStateCreateFlagsNV flags_,\n                                                 VULKAN_HPP_NAMESPACE::CoverageModulationModeNV                     coverageModulationMode_,\n                                                 VULKAN_HPP_NAMESPACE::Bool32                                       coverageModulationTableEnable_,\n                                                 VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const float> const & coverageModulationTable_,\n                                                 const void *                                                       pNext_ = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , coverageModulationMode( coverageModulationMode_ )\n      , coverageModulationTableEnable( coverageModulationTableEnable_ )\n      , coverageModulationTableCount( static_cast<uint32_t>( coverageModulationTable_.size() ) )\n      , pCoverageModulationTable( coverageModulationTable_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PipelineCoverageModulationStateCreateInfoNV & operator=( PipelineCoverageModulationStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineCoverageModulationStateCreateInfoNV & operator=( VkPipelineCoverageModulationStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineCoverageModulationStateCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineCoverageModulationStateCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineCoverageModulationStateCreateInfoNV &\n      setFlags( VULKAN_HPP_NAMESPACE::PipelineCoverageModulationStateCreateFlagsNV flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineCoverageModulationStateCreateInfoNV &\n      setCoverageModulationMode( VULKAN_HPP_NAMESPACE::CoverageModulationModeNV coverageModulationMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      coverageModulationMode = coverageModulationMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineCoverageModulationStateCreateInfoNV &\n      setCoverageModulationTableEnable( VULKAN_HPP_NAMESPACE::Bool32 coverageModulationTableEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      coverageModulationTableEnable = coverageModulationTableEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineCoverageModulationStateCreateInfoNV &\n      setCoverageModulationTableCount( uint32_t coverageModulationTableCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      coverageModulationTableCount = coverageModulationTableCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineCoverageModulationStateCreateInfoNV &\n      setPCoverageModulationTable( const float * pCoverageModulationTable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pCoverageModulationTable = pCoverageModulationTable_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineCoverageModulationStateCreateInfoNV &\n      setCoverageModulationTable( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const float> const & coverageModulationTable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      coverageModulationTableCount = static_cast<uint32_t>( coverageModulationTable_.size() );\n      pCoverageModulationTable     = coverageModulationTable_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineCoverageModulationStateCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineCoverageModulationStateCreateInfoNV *>( this );\n    }\n\n    operator VkPipelineCoverageModulationStateCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineCoverageModulationStateCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineCoverageModulationStateCreateFlagsNV const &,\n               VULKAN_HPP_NAMESPACE::CoverageModulationModeNV const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &,\n               const float * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, coverageModulationMode, coverageModulationTableEnable, coverageModulationTableCount, pCoverageModulationTable );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineCoverageModulationStateCreateInfoNV const & ) const = default;\n#else\n    bool operator==( PipelineCoverageModulationStateCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( coverageModulationMode == rhs.coverageModulationMode ) &&\n             ( coverageModulationTableEnable == rhs.coverageModulationTableEnable ) && ( coverageModulationTableCount == rhs.coverageModulationTableCount ) &&\n             ( pCoverageModulationTable == rhs.pCoverageModulationTable );\n#  endif\n    }\n\n    bool operator!=( PipelineCoverageModulationStateCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                sType                  = StructureType::ePipelineCoverageModulationStateCreateInfoNV;\n    const void *                                                       pNext                  = {};\n    VULKAN_HPP_NAMESPACE::PipelineCoverageModulationStateCreateFlagsNV flags                  = {};\n    VULKAN_HPP_NAMESPACE::CoverageModulationModeNV                     coverageModulationMode = VULKAN_HPP_NAMESPACE::CoverageModulationModeNV::eNone;\n    VULKAN_HPP_NAMESPACE::Bool32                                       coverageModulationTableEnable = {};\n    uint32_t                                                           coverageModulationTableCount  = {};\n    const float *                                                      pCoverageModulationTable      = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineCoverageModulationStateCreateInfoNV>\n  {\n    using Type = PipelineCoverageModulationStateCreateInfoNV;\n  };\n\n  struct PipelineCoverageReductionStateCreateInfoNV\n  {\n    using NativeType = VkPipelineCoverageReductionStateCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineCoverageReductionStateCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineCoverageReductionStateCreateInfoNV(\n      VULKAN_HPP_NAMESPACE::PipelineCoverageReductionStateCreateFlagsNV flags_                 = {},\n      VULKAN_HPP_NAMESPACE::CoverageReductionModeNV                     coverageReductionMode_ = VULKAN_HPP_NAMESPACE::CoverageReductionModeNV::eMerge,\n      const void *                                                      pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , coverageReductionMode{ coverageReductionMode_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineCoverageReductionStateCreateInfoNV( PipelineCoverageReductionStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineCoverageReductionStateCreateInfoNV( VkPipelineCoverageReductionStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineCoverageReductionStateCreateInfoNV( *reinterpret_cast<PipelineCoverageReductionStateCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n    PipelineCoverageReductionStateCreateInfoNV & operator=( PipelineCoverageReductionStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineCoverageReductionStateCreateInfoNV & operator=( VkPipelineCoverageReductionStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineCoverageReductionStateCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineCoverageReductionStateCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineCoverageReductionStateCreateInfoNV &\n      setFlags( VULKAN_HPP_NAMESPACE::PipelineCoverageReductionStateCreateFlagsNV flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineCoverageReductionStateCreateInfoNV &\n      setCoverageReductionMode( VULKAN_HPP_NAMESPACE::CoverageReductionModeNV coverageReductionMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      coverageReductionMode = coverageReductionMode_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineCoverageReductionStateCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineCoverageReductionStateCreateInfoNV *>( this );\n    }\n\n    operator VkPipelineCoverageReductionStateCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineCoverageReductionStateCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineCoverageReductionStateCreateFlagsNV const &,\n               VULKAN_HPP_NAMESPACE::CoverageReductionModeNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, coverageReductionMode );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineCoverageReductionStateCreateInfoNV const & ) const = default;\n#else\n    bool operator==( PipelineCoverageReductionStateCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( coverageReductionMode == rhs.coverageReductionMode );\n#  endif\n    }\n\n    bool operator!=( PipelineCoverageReductionStateCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                               sType                 = StructureType::ePipelineCoverageReductionStateCreateInfoNV;\n    const void *                                                      pNext                 = {};\n    VULKAN_HPP_NAMESPACE::PipelineCoverageReductionStateCreateFlagsNV flags                 = {};\n    VULKAN_HPP_NAMESPACE::CoverageReductionModeNV                     coverageReductionMode = VULKAN_HPP_NAMESPACE::CoverageReductionModeNV::eMerge;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineCoverageReductionStateCreateInfoNV>\n  {\n    using Type = PipelineCoverageReductionStateCreateInfoNV;\n  };\n\n  struct PipelineCoverageToColorStateCreateInfoNV\n  {\n    using NativeType = VkPipelineCoverageToColorStateCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineCoverageToColorStateCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineCoverageToColorStateCreateInfoNV( VULKAN_HPP_NAMESPACE::PipelineCoverageToColorStateCreateFlagsNV flags_                 = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32                                    coverageToColorEnable_ = {},\n                                                                   uint32_t     coverageToColorLocation_                                                  = {},\n                                                                   const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , coverageToColorEnable{ coverageToColorEnable_ }\n      , coverageToColorLocation{ coverageToColorLocation_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineCoverageToColorStateCreateInfoNV( PipelineCoverageToColorStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineCoverageToColorStateCreateInfoNV( VkPipelineCoverageToColorStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineCoverageToColorStateCreateInfoNV( *reinterpret_cast<PipelineCoverageToColorStateCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n    PipelineCoverageToColorStateCreateInfoNV & operator=( PipelineCoverageToColorStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineCoverageToColorStateCreateInfoNV & operator=( VkPipelineCoverageToColorStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineCoverageToColorStateCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineCoverageToColorStateCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineCoverageToColorStateCreateInfoNV &\n      setFlags( VULKAN_HPP_NAMESPACE::PipelineCoverageToColorStateCreateFlagsNV flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineCoverageToColorStateCreateInfoNV &\n      setCoverageToColorEnable( VULKAN_HPP_NAMESPACE::Bool32 coverageToColorEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      coverageToColorEnable = coverageToColorEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineCoverageToColorStateCreateInfoNV & setCoverageToColorLocation( uint32_t coverageToColorLocation_ ) VULKAN_HPP_NOEXCEPT\n    {\n      coverageToColorLocation = coverageToColorLocation_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineCoverageToColorStateCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineCoverageToColorStateCreateInfoNV *>( this );\n    }\n\n    operator VkPipelineCoverageToColorStateCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineCoverageToColorStateCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineCoverageToColorStateCreateFlagsNV const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, coverageToColorEnable, coverageToColorLocation );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineCoverageToColorStateCreateInfoNV const & ) const = default;\n#else\n    bool operator==( PipelineCoverageToColorStateCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( coverageToColorEnable == rhs.coverageToColorEnable ) &&\n             ( coverageToColorLocation == rhs.coverageToColorLocation );\n#  endif\n    }\n\n    bool operator!=( PipelineCoverageToColorStateCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                             sType                   = StructureType::ePipelineCoverageToColorStateCreateInfoNV;\n    const void *                                                    pNext                   = {};\n    VULKAN_HPP_NAMESPACE::PipelineCoverageToColorStateCreateFlagsNV flags                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32                                    coverageToColorEnable   = {};\n    uint32_t                                                        coverageToColorLocation = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineCoverageToColorStateCreateInfoNV>\n  {\n    using Type = PipelineCoverageToColorStateCreateInfoNV;\n  };\n\n  struct PipelineCreateFlags2CreateInfo\n  {\n    using NativeType = VkPipelineCreateFlags2CreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineCreateFlags2CreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineCreateFlags2CreateInfo( VULKAN_HPP_NAMESPACE::PipelineCreateFlags2 flags_ = {},\n                                                         const void *                               pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineCreateFlags2CreateInfo( PipelineCreateFlags2CreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineCreateFlags2CreateInfo( VkPipelineCreateFlags2CreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineCreateFlags2CreateInfo( *reinterpret_cast<PipelineCreateFlags2CreateInfo const *>( &rhs ) )\n    {\n    }\n\n    PipelineCreateFlags2CreateInfo & operator=( PipelineCreateFlags2CreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineCreateFlags2CreateInfo & operator=( VkPipelineCreateFlags2CreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineCreateFlags2CreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineCreateFlags2CreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineCreateFlags2CreateInfo & setFlags( VULKAN_HPP_NAMESPACE::PipelineCreateFlags2 flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineCreateFlags2CreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineCreateFlags2CreateInfo *>( this );\n    }\n\n    operator VkPipelineCreateFlags2CreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineCreateFlags2CreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::PipelineCreateFlags2 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineCreateFlags2CreateInfo const & ) const = default;\n#else\n    bool operator==( PipelineCreateFlags2CreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags );\n#  endif\n    }\n\n    bool operator!=( PipelineCreateFlags2CreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType        sType = StructureType::ePipelineCreateFlags2CreateInfo;\n    const void *                               pNext = {};\n    VULKAN_HPP_NAMESPACE::PipelineCreateFlags2 flags = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineCreateFlags2CreateInfo>\n  {\n    using Type = PipelineCreateFlags2CreateInfo;\n  };\n\n  using PipelineCreateFlags2CreateInfoKHR = PipelineCreateFlags2CreateInfo;\n\n  struct PipelineCreationFeedback\n  {\n    using NativeType = VkPipelineCreationFeedback;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineCreationFeedback( VULKAN_HPP_NAMESPACE::PipelineCreationFeedbackFlags flags_    = {},\n                                                   uint64_t                                            duration_ = {} ) VULKAN_HPP_NOEXCEPT\n      : flags{ flags_ }\n      , duration{ duration_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineCreationFeedback( PipelineCreationFeedback const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineCreationFeedback( VkPipelineCreationFeedback const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineCreationFeedback( *reinterpret_cast<PipelineCreationFeedback const *>( &rhs ) )\n    {\n    }\n\n    PipelineCreationFeedback & operator=( PipelineCreationFeedback const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineCreationFeedback & operator=( VkPipelineCreationFeedback const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineCreationFeedback const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPipelineCreationFeedback const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineCreationFeedback *>( this );\n    }\n\n    operator VkPipelineCreationFeedback &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineCreationFeedback *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::PipelineCreationFeedbackFlags const &, uint64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( flags, duration );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineCreationFeedback const & ) const = default;\n#else\n    bool operator==( PipelineCreationFeedback const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( flags == rhs.flags ) && ( duration == rhs.duration );\n#  endif\n    }\n\n    bool operator!=( PipelineCreationFeedback const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::PipelineCreationFeedbackFlags flags    = {};\n    uint64_t                                            duration = {};\n  };\n\n  using PipelineCreationFeedbackEXT = PipelineCreationFeedback;\n\n  struct PipelineCreationFeedbackCreateInfo\n  {\n    using NativeType = VkPipelineCreationFeedbackCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineCreationFeedbackCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineCreationFeedbackCreateInfo( VULKAN_HPP_NAMESPACE::PipelineCreationFeedback * pPipelineCreationFeedback_          = {},\n                                                             uint32_t                                         pipelineStageCreationFeedbackCount_ = {},\n                                                             VULKAN_HPP_NAMESPACE::PipelineCreationFeedback * pPipelineStageCreationFeedbacks_    = {},\n                                                             const void *                                     pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pPipelineCreationFeedback{ pPipelineCreationFeedback_ }\n      , pipelineStageCreationFeedbackCount{ pipelineStageCreationFeedbackCount_ }\n      , pPipelineStageCreationFeedbacks{ pPipelineStageCreationFeedbacks_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineCreationFeedbackCreateInfo( PipelineCreationFeedbackCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineCreationFeedbackCreateInfo( VkPipelineCreationFeedbackCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineCreationFeedbackCreateInfo( *reinterpret_cast<PipelineCreationFeedbackCreateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineCreationFeedbackCreateInfo(\n      VULKAN_HPP_NAMESPACE::PipelineCreationFeedback *                                                      pPipelineCreationFeedback_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<VULKAN_HPP_NAMESPACE::PipelineCreationFeedback> const & pipelineStageCreationFeedbacks_,\n      const void *                                                                                          pNext_ = nullptr )\n      : pNext( pNext_ )\n      , pPipelineCreationFeedback( pPipelineCreationFeedback_ )\n      , pipelineStageCreationFeedbackCount( static_cast<uint32_t>( pipelineStageCreationFeedbacks_.size() ) )\n      , pPipelineStageCreationFeedbacks( pipelineStageCreationFeedbacks_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PipelineCreationFeedbackCreateInfo & operator=( PipelineCreationFeedbackCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineCreationFeedbackCreateInfo & operator=( VkPipelineCreationFeedbackCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineCreationFeedbackCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineCreationFeedbackCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineCreationFeedbackCreateInfo &\n      setPPipelineCreationFeedback( VULKAN_HPP_NAMESPACE::PipelineCreationFeedback * pPipelineCreationFeedback_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPipelineCreationFeedback = pPipelineCreationFeedback_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineCreationFeedbackCreateInfo &\n      setPipelineStageCreationFeedbackCount( uint32_t pipelineStageCreationFeedbackCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineStageCreationFeedbackCount = pipelineStageCreationFeedbackCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineCreationFeedbackCreateInfo &\n      setPPipelineStageCreationFeedbacks( VULKAN_HPP_NAMESPACE::PipelineCreationFeedback * pPipelineStageCreationFeedbacks_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPipelineStageCreationFeedbacks = pPipelineStageCreationFeedbacks_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineCreationFeedbackCreateInfo & setPipelineStageCreationFeedbacks(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<VULKAN_HPP_NAMESPACE::PipelineCreationFeedback> const & pipelineStageCreationFeedbacks_ )\n      VULKAN_HPP_NOEXCEPT\n    {\n      pipelineStageCreationFeedbackCount = static_cast<uint32_t>( pipelineStageCreationFeedbacks_.size() );\n      pPipelineStageCreationFeedbacks    = pipelineStageCreationFeedbacks_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineCreationFeedbackCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineCreationFeedbackCreateInfo *>( this );\n    }\n\n    operator VkPipelineCreationFeedbackCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineCreationFeedbackCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineCreationFeedback * const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::PipelineCreationFeedback * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pPipelineCreationFeedback, pipelineStageCreationFeedbackCount, pPipelineStageCreationFeedbacks );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineCreationFeedbackCreateInfo const & ) const = default;\n#else\n    bool operator==( PipelineCreationFeedbackCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pPipelineCreationFeedback == rhs.pPipelineCreationFeedback ) &&\n             ( pipelineStageCreationFeedbackCount == rhs.pipelineStageCreationFeedbackCount ) &&\n             ( pPipelineStageCreationFeedbacks == rhs.pPipelineStageCreationFeedbacks );\n#  endif\n    }\n\n    bool operator!=( PipelineCreationFeedbackCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType              sType                              = StructureType::ePipelineCreationFeedbackCreateInfo;\n    const void *                                     pNext                              = {};\n    VULKAN_HPP_NAMESPACE::PipelineCreationFeedback * pPipelineCreationFeedback          = {};\n    uint32_t                                         pipelineStageCreationFeedbackCount = {};\n    VULKAN_HPP_NAMESPACE::PipelineCreationFeedback * pPipelineStageCreationFeedbacks    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineCreationFeedbackCreateInfo>\n  {\n    using Type = PipelineCreationFeedbackCreateInfo;\n  };\n\n  using PipelineCreationFeedbackCreateInfoEXT = PipelineCreationFeedbackCreateInfo;\n\n  struct PipelineDiscardRectangleStateCreateInfoEXT\n  {\n    using NativeType = VkPipelineDiscardRectangleStateCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineDiscardRectangleStateCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineDiscardRectangleStateCreateInfoEXT(\n      VULKAN_HPP_NAMESPACE::PipelineDiscardRectangleStateCreateFlagsEXT flags_                 = {},\n      VULKAN_HPP_NAMESPACE::DiscardRectangleModeEXT                     discardRectangleMode_  = VULKAN_HPP_NAMESPACE::DiscardRectangleModeEXT::eInclusive,\n      uint32_t                                                          discardRectangleCount_ = {},\n      const VULKAN_HPP_NAMESPACE::Rect2D *                              pDiscardRectangles_    = {},\n      const void *                                                      pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , discardRectangleMode{ discardRectangleMode_ }\n      , discardRectangleCount{ discardRectangleCount_ }\n      , pDiscardRectangles{ pDiscardRectangles_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineDiscardRectangleStateCreateInfoEXT( PipelineDiscardRectangleStateCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineDiscardRectangleStateCreateInfoEXT( VkPipelineDiscardRectangleStateCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineDiscardRectangleStateCreateInfoEXT( *reinterpret_cast<PipelineDiscardRectangleStateCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineDiscardRectangleStateCreateInfoEXT( VULKAN_HPP_NAMESPACE::PipelineDiscardRectangleStateCreateFlagsEXT                         flags_,\n                                                VULKAN_HPP_NAMESPACE::DiscardRectangleModeEXT                                             discardRectangleMode_,\n                                                VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Rect2D> const & discardRectangles_,\n                                                const void *                                                                              pNext_ = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , discardRectangleMode( discardRectangleMode_ )\n      , discardRectangleCount( static_cast<uint32_t>( discardRectangles_.size() ) )\n      , pDiscardRectangles( discardRectangles_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PipelineDiscardRectangleStateCreateInfoEXT & operator=( PipelineDiscardRectangleStateCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineDiscardRectangleStateCreateInfoEXT & operator=( VkPipelineDiscardRectangleStateCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineDiscardRectangleStateCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineDiscardRectangleStateCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineDiscardRectangleStateCreateInfoEXT &\n      setFlags( VULKAN_HPP_NAMESPACE::PipelineDiscardRectangleStateCreateFlagsEXT flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineDiscardRectangleStateCreateInfoEXT &\n      setDiscardRectangleMode( VULKAN_HPP_NAMESPACE::DiscardRectangleModeEXT discardRectangleMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      discardRectangleMode = discardRectangleMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineDiscardRectangleStateCreateInfoEXT & setDiscardRectangleCount( uint32_t discardRectangleCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      discardRectangleCount = discardRectangleCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineDiscardRectangleStateCreateInfoEXT &\n      setPDiscardRectangles( const VULKAN_HPP_NAMESPACE::Rect2D * pDiscardRectangles_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDiscardRectangles = pDiscardRectangles_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineDiscardRectangleStateCreateInfoEXT &\n      setDiscardRectangles( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Rect2D> const & discardRectangles_ ) VULKAN_HPP_NOEXCEPT\n    {\n      discardRectangleCount = static_cast<uint32_t>( discardRectangles_.size() );\n      pDiscardRectangles    = discardRectangles_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineDiscardRectangleStateCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineDiscardRectangleStateCreateInfoEXT *>( this );\n    }\n\n    operator VkPipelineDiscardRectangleStateCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineDiscardRectangleStateCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineDiscardRectangleStateCreateFlagsEXT const &,\n               VULKAN_HPP_NAMESPACE::DiscardRectangleModeEXT const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::Rect2D * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, discardRectangleMode, discardRectangleCount, pDiscardRectangles );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineDiscardRectangleStateCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( PipelineDiscardRectangleStateCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( discardRectangleMode == rhs.discardRectangleMode ) &&\n             ( discardRectangleCount == rhs.discardRectangleCount ) && ( pDiscardRectangles == rhs.pDiscardRectangles );\n#  endif\n    }\n\n    bool operator!=( PipelineDiscardRectangleStateCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                               sType                 = StructureType::ePipelineDiscardRectangleStateCreateInfoEXT;\n    const void *                                                      pNext                 = {};\n    VULKAN_HPP_NAMESPACE::PipelineDiscardRectangleStateCreateFlagsEXT flags                 = {};\n    VULKAN_HPP_NAMESPACE::DiscardRectangleModeEXT                     discardRectangleMode  = VULKAN_HPP_NAMESPACE::DiscardRectangleModeEXT::eInclusive;\n    uint32_t                                                          discardRectangleCount = {};\n    const VULKAN_HPP_NAMESPACE::Rect2D *                              pDiscardRectangles    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineDiscardRectangleStateCreateInfoEXT>\n  {\n    using Type = PipelineDiscardRectangleStateCreateInfoEXT;\n  };\n\n  struct PipelineExecutableInfoKHR\n  {\n    using NativeType = VkPipelineExecutableInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineExecutableInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineExecutableInfoKHR( VULKAN_HPP_NAMESPACE::Pipeline pipeline_        = {},\n                                                    uint32_t                       executableIndex_ = {},\n                                                    const void *                   pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pipeline{ pipeline_ }\n      , executableIndex{ executableIndex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineExecutableInfoKHR( PipelineExecutableInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineExecutableInfoKHR( VkPipelineExecutableInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineExecutableInfoKHR( *reinterpret_cast<PipelineExecutableInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    PipelineExecutableInfoKHR & operator=( PipelineExecutableInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineExecutableInfoKHR & operator=( VkPipelineExecutableInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineExecutableInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineExecutableInfoKHR & setPipeline( VULKAN_HPP_NAMESPACE::Pipeline pipeline_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipeline = pipeline_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineExecutableInfoKHR & setExecutableIndex( uint32_t executableIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      executableIndex = executableIndex_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineExecutableInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineExecutableInfoKHR *>( this );\n    }\n\n    operator VkPipelineExecutableInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineExecutableInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Pipeline const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pipeline, executableIndex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineExecutableInfoKHR const & ) const = default;\n#else\n    bool operator==( PipelineExecutableInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pipeline == rhs.pipeline ) && ( executableIndex == rhs.executableIndex );\n#  endif\n    }\n\n    bool operator!=( PipelineExecutableInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType           = StructureType::ePipelineExecutableInfoKHR;\n    const void *                        pNext           = {};\n    VULKAN_HPP_NAMESPACE::Pipeline      pipeline        = {};\n    uint32_t                            executableIndex = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineExecutableInfoKHR>\n  {\n    using Type = PipelineExecutableInfoKHR;\n  };\n\n  struct PipelineExecutableInternalRepresentationKHR\n  {\n    using NativeType = VkPipelineExecutableInternalRepresentationKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineExecutableInternalRepresentationKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineExecutableInternalRepresentationKHR( std::array<char, VK_MAX_DESCRIPTION_SIZE> const & name_        = {},\n                                                                         std::array<char, VK_MAX_DESCRIPTION_SIZE> const & description_ = {},\n                                                                         VULKAN_HPP_NAMESPACE::Bool32                      isText_      = {},\n                                                                         size_t                                            dataSize_    = {},\n                                                                         void *                                            pData_       = {},\n                                                                         void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , name{ name_ }\n      , description{ description_ }\n      , isText{ isText_ }\n      , dataSize{ dataSize_ }\n      , pData{ pData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14\n      PipelineExecutableInternalRepresentationKHR( PipelineExecutableInternalRepresentationKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineExecutableInternalRepresentationKHR( VkPipelineExecutableInternalRepresentationKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineExecutableInternalRepresentationKHR( *reinterpret_cast<PipelineExecutableInternalRepresentationKHR const *>( &rhs ) )\n    {\n    }\n\n    PipelineExecutableInternalRepresentationKHR & operator=( PipelineExecutableInternalRepresentationKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineExecutableInternalRepresentationKHR & operator=( VkPipelineExecutableInternalRepresentationKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPipelineExecutableInternalRepresentationKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineExecutableInternalRepresentationKHR *>( this );\n    }\n\n    operator VkPipelineExecutableInternalRepresentationKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineExecutableInternalRepresentationKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               size_t const &,\n               void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, name, description, isText, dataSize, pData );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( PipelineExecutableInternalRepresentationKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = strcmp( name, rhs.name ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = strcmp( description, rhs.description ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = isText <=> rhs.isText; cmp != 0 )\n        return cmp;\n      if ( auto cmp = dataSize <=> rhs.dataSize; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pData <=> rhs.pData; cmp != 0 )\n        return cmp;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( PipelineExecutableInternalRepresentationKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( strcmp( name, rhs.name ) == 0 ) && ( strcmp( description, rhs.description ) == 0 ) &&\n             ( isText == rhs.isText ) && ( dataSize == rhs.dataSize ) && ( pData == rhs.pData );\n    }\n\n    bool operator!=( PipelineExecutableInternalRepresentationKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                 sType       = StructureType::ePipelineExecutableInternalRepresentationKHR;\n    void *                                                              pNext       = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> name        = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> description = {};\n    VULKAN_HPP_NAMESPACE::Bool32                                        isText      = {};\n    size_t                                                              dataSize    = {};\n    void *                                                              pData       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineExecutableInternalRepresentationKHR>\n  {\n    using Type = PipelineExecutableInternalRepresentationKHR;\n  };\n\n  struct PipelineExecutablePropertiesKHR\n  {\n    using NativeType = VkPipelineExecutablePropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineExecutablePropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineExecutablePropertiesKHR( VULKAN_HPP_NAMESPACE::ShaderStageFlags            stages_       = {},\n                                                             std::array<char, VK_MAX_DESCRIPTION_SIZE> const & name_         = {},\n                                                             std::array<char, VK_MAX_DESCRIPTION_SIZE> const & description_  = {},\n                                                             uint32_t                                          subgroupSize_ = {},\n                                                             void *                                            pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stages{ stages_ }\n      , name{ name_ }\n      , description{ description_ }\n      , subgroupSize{ subgroupSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineExecutablePropertiesKHR( PipelineExecutablePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineExecutablePropertiesKHR( VkPipelineExecutablePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineExecutablePropertiesKHR( *reinterpret_cast<PipelineExecutablePropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    PipelineExecutablePropertiesKHR & operator=( PipelineExecutablePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineExecutablePropertiesKHR & operator=( VkPipelineExecutablePropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPipelineExecutablePropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineExecutablePropertiesKHR *>( this );\n    }\n\n    operator VkPipelineExecutablePropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineExecutablePropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::ShaderStageFlags const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stages, name, description, subgroupSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( PipelineExecutablePropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = stages <=> rhs.stages; cmp != 0 )\n        return cmp;\n      if ( auto cmp = strcmp( name, rhs.name ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = strcmp( description, rhs.description ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = subgroupSize <=> rhs.subgroupSize; cmp != 0 )\n        return cmp;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( PipelineExecutablePropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( stages == rhs.stages ) && ( strcmp( name, rhs.name ) == 0 ) &&\n             ( strcmp( description, rhs.description ) == 0 ) && ( subgroupSize == rhs.subgroupSize );\n    }\n\n    bool operator!=( PipelineExecutablePropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                 sType        = StructureType::ePipelineExecutablePropertiesKHR;\n    void *                                                              pNext        = {};\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags                              stages       = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> name         = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> description  = {};\n    uint32_t                                                            subgroupSize = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineExecutablePropertiesKHR>\n  {\n    using Type = PipelineExecutablePropertiesKHR;\n  };\n\n  union PipelineExecutableStatisticValueKHR\n  {\n    using NativeType = VkPipelineExecutableStatisticValueKHR;\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineExecutableStatisticValueKHR( VULKAN_HPP_NAMESPACE::Bool32 b32_ = {} ) : b32( b32_ ) {}\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineExecutableStatisticValueKHR( int64_t i64_ ) : i64( i64_ ) {}\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineExecutableStatisticValueKHR( uint64_t u64_ ) : u64( u64_ ) {}\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineExecutableStatisticValueKHR( double f64_ ) : f64( f64_ ) {}\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_UNION_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineExecutableStatisticValueKHR & setB32( VULKAN_HPP_NAMESPACE::Bool32 b32_ ) VULKAN_HPP_NOEXCEPT\n    {\n      b32 = b32_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineExecutableStatisticValueKHR & setI64( int64_t i64_ ) VULKAN_HPP_NOEXCEPT\n    {\n      i64 = i64_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineExecutableStatisticValueKHR & setU64( uint64_t u64_ ) VULKAN_HPP_NOEXCEPT\n    {\n      u64 = u64_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineExecutableStatisticValueKHR & setF64( double f64_ ) VULKAN_HPP_NOEXCEPT\n    {\n      f64 = f64_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineExecutableStatisticValueKHR const &() const\n    {\n      return *reinterpret_cast<const VkPipelineExecutableStatisticValueKHR *>( this );\n    }\n\n    operator VkPipelineExecutableStatisticValueKHR &()\n    {\n      return *reinterpret_cast<VkPipelineExecutableStatisticValueKHR *>( this );\n    }\n\n#ifdef VULKAN_HPP_HAS_UNRESTRICTED_UNIONS\n    VULKAN_HPP_NAMESPACE::Bool32 b32;\n    int64_t                      i64;\n    uint64_t                     u64;\n    double                       f64;\n#else\n    VkBool32 b32;\n    int64_t  i64;\n    uint64_t u64;\n    double   f64;\n#endif /*VULKAN_HPP_HAS_UNRESTRICTED_UNIONS*/\n  };\n\n  struct PipelineExecutableStatisticKHR\n  {\n    using NativeType = VkPipelineExecutableStatisticKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineExecutableStatisticKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineExecutableStatisticKHR(\n      std::array<char, VK_MAX_DESCRIPTION_SIZE> const &          name_        = {},\n      std::array<char, VK_MAX_DESCRIPTION_SIZE> const &          description_ = {},\n      VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticFormatKHR format_      = VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticFormatKHR::eBool32,\n      VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticValueKHR  value_       = {},\n      void *                                                     pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , name{ name_ }\n      , description{ description_ }\n      , format{ format_ }\n      , value{ value_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineExecutableStatisticKHR( PipelineExecutableStatisticKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineExecutableStatisticKHR( VkPipelineExecutableStatisticKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineExecutableStatisticKHR( *reinterpret_cast<PipelineExecutableStatisticKHR const *>( &rhs ) )\n    {\n    }\n\n    PipelineExecutableStatisticKHR & operator=( PipelineExecutableStatisticKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineExecutableStatisticKHR & operator=( VkPipelineExecutableStatisticKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPipelineExecutableStatisticKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineExecutableStatisticKHR *>( this );\n    }\n\n    operator VkPipelineExecutableStatisticKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineExecutableStatisticKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> const &,\n               VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticFormatKHR const &,\n               VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticValueKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, name, description, format, value );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                 sType       = StructureType::ePipelineExecutableStatisticKHR;\n    void *                                                              pNext       = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> name        = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> description = {};\n    VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticFormatKHR          format      = VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticFormatKHR::eBool32;\n    VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticValueKHR           value       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineExecutableStatisticKHR>\n  {\n    using Type = PipelineExecutableStatisticKHR;\n  };\n\n  struct PipelineFragmentShadingRateEnumStateCreateInfoNV\n  {\n    using NativeType = VkPipelineFragmentShadingRateEnumStateCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineFragmentShadingRateEnumStateCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineFragmentShadingRateEnumStateCreateInfoNV(\n      VULKAN_HPP_NAMESPACE::FragmentShadingRateTypeNV shadingRateType_ = VULKAN_HPP_NAMESPACE::FragmentShadingRateTypeNV::eFragmentSize,\n      VULKAN_HPP_NAMESPACE::FragmentShadingRateNV     shadingRate_     = VULKAN_HPP_NAMESPACE::FragmentShadingRateNV::e1InvocationPerPixel,\n      std::array<VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR, 2> const &\n        combinerOps_ = { { VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR::eKeep, VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR::eKeep } },\n      const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shadingRateType{ shadingRateType_ }\n      , shadingRate{ shadingRate_ }\n      , combinerOps{ combinerOps_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14\n      PipelineFragmentShadingRateEnumStateCreateInfoNV( PipelineFragmentShadingRateEnumStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineFragmentShadingRateEnumStateCreateInfoNV( VkPipelineFragmentShadingRateEnumStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineFragmentShadingRateEnumStateCreateInfoNV( *reinterpret_cast<PipelineFragmentShadingRateEnumStateCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n    PipelineFragmentShadingRateEnumStateCreateInfoNV & operator=( PipelineFragmentShadingRateEnumStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineFragmentShadingRateEnumStateCreateInfoNV & operator=( VkPipelineFragmentShadingRateEnumStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineFragmentShadingRateEnumStateCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineFragmentShadingRateEnumStateCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineFragmentShadingRateEnumStateCreateInfoNV &\n      setShadingRateType( VULKAN_HPP_NAMESPACE::FragmentShadingRateTypeNV shadingRateType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shadingRateType = shadingRateType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineFragmentShadingRateEnumStateCreateInfoNV &\n      setShadingRate( VULKAN_HPP_NAMESPACE::FragmentShadingRateNV shadingRate_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shadingRate = shadingRate_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineFragmentShadingRateEnumStateCreateInfoNV &\n      setCombinerOps( std::array<VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR, 2> combinerOps_ ) VULKAN_HPP_NOEXCEPT\n    {\n      combinerOps = combinerOps_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineFragmentShadingRateEnumStateCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineFragmentShadingRateEnumStateCreateInfoNV *>( this );\n    }\n\n    operator VkPipelineFragmentShadingRateEnumStateCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineFragmentShadingRateEnumStateCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::FragmentShadingRateTypeNV const &,\n               VULKAN_HPP_NAMESPACE::FragmentShadingRateNV const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR, 2> const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shadingRateType, shadingRate, combinerOps );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineFragmentShadingRateEnumStateCreateInfoNV const & ) const = default;\n#else\n    bool     operator==( PipelineFragmentShadingRateEnumStateCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shadingRateType == rhs.shadingRateType ) && ( shadingRate == rhs.shadingRate ) &&\n             ( combinerOps == rhs.combinerOps );\n#  endif\n    }\n\n    bool operator!=( PipelineFragmentShadingRateEnumStateCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType             sType           = StructureType::ePipelineFragmentShadingRateEnumStateCreateInfoNV;\n    const void *                                    pNext           = {};\n    VULKAN_HPP_NAMESPACE::FragmentShadingRateTypeNV shadingRateType = VULKAN_HPP_NAMESPACE::FragmentShadingRateTypeNV::eFragmentSize;\n    VULKAN_HPP_NAMESPACE::FragmentShadingRateNV     shadingRate     = VULKAN_HPP_NAMESPACE::FragmentShadingRateNV::e1InvocationPerPixel;\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR, 2> combinerOps = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineFragmentShadingRateEnumStateCreateInfoNV>\n  {\n    using Type = PipelineFragmentShadingRateEnumStateCreateInfoNV;\n  };\n\n  struct PipelineFragmentShadingRateStateCreateInfoKHR\n  {\n    using NativeType = VkPipelineFragmentShadingRateStateCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineFragmentShadingRateStateCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineFragmentShadingRateStateCreateInfoKHR(\n      VULKAN_HPP_NAMESPACE::Extent2D fragmentSize_ = {},\n      std::array<VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR, 2> const &\n        combinerOps_ = { { VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR::eKeep, VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR::eKeep } },\n      const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , fragmentSize{ fragmentSize_ }\n      , combinerOps{ combinerOps_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14\n      PipelineFragmentShadingRateStateCreateInfoKHR( PipelineFragmentShadingRateStateCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineFragmentShadingRateStateCreateInfoKHR( VkPipelineFragmentShadingRateStateCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineFragmentShadingRateStateCreateInfoKHR( *reinterpret_cast<PipelineFragmentShadingRateStateCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    PipelineFragmentShadingRateStateCreateInfoKHR & operator=( PipelineFragmentShadingRateStateCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineFragmentShadingRateStateCreateInfoKHR & operator=( VkPipelineFragmentShadingRateStateCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineFragmentShadingRateStateCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineFragmentShadingRateStateCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineFragmentShadingRateStateCreateInfoKHR &\n      setFragmentSize( VULKAN_HPP_NAMESPACE::Extent2D const & fragmentSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fragmentSize = fragmentSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineFragmentShadingRateStateCreateInfoKHR &\n      setCombinerOps( std::array<VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR, 2> combinerOps_ ) VULKAN_HPP_NOEXCEPT\n    {\n      combinerOps = combinerOps_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineFragmentShadingRateStateCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineFragmentShadingRateStateCreateInfoKHR *>( this );\n    }\n\n    operator VkPipelineFragmentShadingRateStateCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineFragmentShadingRateStateCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR, 2> const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, fragmentSize, combinerOps );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineFragmentShadingRateStateCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( PipelineFragmentShadingRateStateCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( fragmentSize == rhs.fragmentSize ) && ( combinerOps == rhs.combinerOps );\n#  endif\n    }\n\n    bool operator!=( PipelineFragmentShadingRateStateCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType        = StructureType::ePipelineFragmentShadingRateStateCreateInfoKHR;\n    const void *                        pNext        = {};\n    VULKAN_HPP_NAMESPACE::Extent2D      fragmentSize = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR, 2> combinerOps = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineFragmentShadingRateStateCreateInfoKHR>\n  {\n    using Type = PipelineFragmentShadingRateStateCreateInfoKHR;\n  };\n\n  struct PipelineIndirectDeviceAddressInfoNV\n  {\n    using NativeType = VkPipelineIndirectDeviceAddressInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineIndirectDeviceAddressInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      PipelineIndirectDeviceAddressInfoNV( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint_ = VULKAN_HPP_NAMESPACE::PipelineBindPoint::eGraphics,\n                                           VULKAN_HPP_NAMESPACE::Pipeline          pipeline_          = {},\n                                           const void *                            pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pipelineBindPoint{ pipelineBindPoint_ }\n      , pipeline{ pipeline_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineIndirectDeviceAddressInfoNV( PipelineIndirectDeviceAddressInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineIndirectDeviceAddressInfoNV( VkPipelineIndirectDeviceAddressInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineIndirectDeviceAddressInfoNV( *reinterpret_cast<PipelineIndirectDeviceAddressInfoNV const *>( &rhs ) )\n    {\n    }\n\n    PipelineIndirectDeviceAddressInfoNV & operator=( PipelineIndirectDeviceAddressInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineIndirectDeviceAddressInfoNV & operator=( VkPipelineIndirectDeviceAddressInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineIndirectDeviceAddressInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineIndirectDeviceAddressInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineIndirectDeviceAddressInfoNV &\n      setPipelineBindPoint( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineBindPoint = pipelineBindPoint_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineIndirectDeviceAddressInfoNV & setPipeline( VULKAN_HPP_NAMESPACE::Pipeline pipeline_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipeline = pipeline_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineIndirectDeviceAddressInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineIndirectDeviceAddressInfoNV *>( this );\n    }\n\n    operator VkPipelineIndirectDeviceAddressInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineIndirectDeviceAddressInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineBindPoint const &,\n               VULKAN_HPP_NAMESPACE::Pipeline const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pipelineBindPoint, pipeline );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineIndirectDeviceAddressInfoNV const & ) const = default;\n#else\n    bool operator==( PipelineIndirectDeviceAddressInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pipelineBindPoint == rhs.pipelineBindPoint ) && ( pipeline == rhs.pipeline );\n#  endif\n    }\n\n    bool operator!=( PipelineIndirectDeviceAddressInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType     sType             = StructureType::ePipelineIndirectDeviceAddressInfoNV;\n    const void *                            pNext             = {};\n    VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint = VULKAN_HPP_NAMESPACE::PipelineBindPoint::eGraphics;\n    VULKAN_HPP_NAMESPACE::Pipeline          pipeline          = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineIndirectDeviceAddressInfoNV>\n  {\n    using Type = PipelineIndirectDeviceAddressInfoNV;\n  };\n\n  struct PipelineInfoKHR\n  {\n    using NativeType = VkPipelineInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineInfoKHR( VULKAN_HPP_NAMESPACE::Pipeline pipeline_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pipeline{ pipeline_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineInfoKHR( PipelineInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineInfoKHR( VkPipelineInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT : PipelineInfoKHR( *reinterpret_cast<PipelineInfoKHR const *>( &rhs ) ) {}\n\n    PipelineInfoKHR & operator=( PipelineInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineInfoKHR & operator=( VkPipelineInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineInfoKHR & setPipeline( VULKAN_HPP_NAMESPACE::Pipeline pipeline_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipeline = pipeline_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineInfoKHR *>( this );\n    }\n\n    operator VkPipelineInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Pipeline const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pipeline );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineInfoKHR const & ) const = default;\n#else\n    bool operator==( PipelineInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pipeline == rhs.pipeline );\n#  endif\n    }\n\n    bool operator!=( PipelineInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType    = StructureType::ePipelineInfoKHR;\n    const void *                        pNext    = {};\n    VULKAN_HPP_NAMESPACE::Pipeline      pipeline = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineInfoKHR>\n  {\n    using Type = PipelineInfoKHR;\n  };\n\n  using PipelineInfoEXT = PipelineInfoKHR;\n\n  struct PipelineLayoutCreateInfo\n  {\n    using NativeType = VkPipelineLayoutCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineLayoutCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineLayoutCreateInfo( VULKAN_HPP_NAMESPACE::PipelineLayoutCreateFlags   flags_                  = {},\n                                                   uint32_t                                          setLayoutCount_         = {},\n                                                   const VULKAN_HPP_NAMESPACE::DescriptorSetLayout * pSetLayouts_            = {},\n                                                   uint32_t                                          pushConstantRangeCount_ = {},\n                                                   const VULKAN_HPP_NAMESPACE::PushConstantRange *   pPushConstantRanges_    = {},\n                                                   const void *                                      pNext_                  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , setLayoutCount{ setLayoutCount_ }\n      , pSetLayouts{ pSetLayouts_ }\n      , pushConstantRangeCount{ pushConstantRangeCount_ }\n      , pPushConstantRanges{ pPushConstantRanges_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineLayoutCreateInfo( PipelineLayoutCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineLayoutCreateInfo( VkPipelineLayoutCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineLayoutCreateInfo( *reinterpret_cast<PipelineLayoutCreateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineLayoutCreateInfo( VULKAN_HPP_NAMESPACE::PipelineLayoutCreateFlags                                                        flags_,\n                              VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorSetLayout> const & setLayouts_,\n                              VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PushConstantRange> const &   pushConstantRanges_ = {},\n                              const void *                                                                                           pNext_ = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , setLayoutCount( static_cast<uint32_t>( setLayouts_.size() ) )\n      , pSetLayouts( setLayouts_.data() )\n      , pushConstantRangeCount( static_cast<uint32_t>( pushConstantRanges_.size() ) )\n      , pPushConstantRanges( pushConstantRanges_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PipelineLayoutCreateInfo & operator=( PipelineLayoutCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineLayoutCreateInfo & operator=( VkPipelineLayoutCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineLayoutCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineLayoutCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineLayoutCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::PipelineLayoutCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineLayoutCreateInfo & setSetLayoutCount( uint32_t setLayoutCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      setLayoutCount = setLayoutCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineLayoutCreateInfo & setPSetLayouts( const VULKAN_HPP_NAMESPACE::DescriptorSetLayout * pSetLayouts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSetLayouts = pSetLayouts_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineLayoutCreateInfo &\n      setSetLayouts( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorSetLayout> const & setLayouts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      setLayoutCount = static_cast<uint32_t>( setLayouts_.size() );\n      pSetLayouts    = setLayouts_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineLayoutCreateInfo & setPushConstantRangeCount( uint32_t pushConstantRangeCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pushConstantRangeCount = pushConstantRangeCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineLayoutCreateInfo &\n      setPPushConstantRanges( const VULKAN_HPP_NAMESPACE::PushConstantRange * pPushConstantRanges_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPushConstantRanges = pPushConstantRanges_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineLayoutCreateInfo & setPushConstantRanges(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PushConstantRange> const & pushConstantRanges_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pushConstantRangeCount = static_cast<uint32_t>( pushConstantRanges_.size() );\n      pPushConstantRanges    = pushConstantRanges_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineLayoutCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineLayoutCreateInfo *>( this );\n    }\n\n    operator VkPipelineLayoutCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineLayoutCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineLayoutCreateFlags const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::DescriptorSetLayout * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::PushConstantRange * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, setLayoutCount, pSetLayouts, pushConstantRangeCount, pPushConstantRanges );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineLayoutCreateInfo const & ) const = default;\n#else\n    bool operator==( PipelineLayoutCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( setLayoutCount == rhs.setLayoutCount ) &&\n             ( pSetLayouts == rhs.pSetLayouts ) && ( pushConstantRangeCount == rhs.pushConstantRangeCount ) &&\n             ( pPushConstantRanges == rhs.pPushConstantRanges );\n#  endif\n    }\n\n    bool operator!=( PipelineLayoutCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType                  = StructureType::ePipelineLayoutCreateInfo;\n    const void *                                      pNext                  = {};\n    VULKAN_HPP_NAMESPACE::PipelineLayoutCreateFlags   flags                  = {};\n    uint32_t                                          setLayoutCount         = {};\n    const VULKAN_HPP_NAMESPACE::DescriptorSetLayout * pSetLayouts            = {};\n    uint32_t                                          pushConstantRangeCount = {};\n    const VULKAN_HPP_NAMESPACE::PushConstantRange *   pPushConstantRanges    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineLayoutCreateInfo>\n  {\n    using Type = PipelineLayoutCreateInfo;\n  };\n\n  struct PipelinePropertiesIdentifierEXT\n  {\n    using NativeType = VkPipelinePropertiesIdentifierEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelinePropertiesIdentifierEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 PipelinePropertiesIdentifierEXT( std::array<uint8_t, VK_UUID_SIZE> const & pipelineIdentifier_ = {},\n                                                             void *                                    pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pipelineIdentifier{ pipelineIdentifier_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelinePropertiesIdentifierEXT( PipelinePropertiesIdentifierEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelinePropertiesIdentifierEXT( VkPipelinePropertiesIdentifierEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelinePropertiesIdentifierEXT( *reinterpret_cast<PipelinePropertiesIdentifierEXT const *>( &rhs ) )\n    {\n    }\n\n    PipelinePropertiesIdentifierEXT & operator=( PipelinePropertiesIdentifierEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelinePropertiesIdentifierEXT & operator=( VkPipelinePropertiesIdentifierEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelinePropertiesIdentifierEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPipelinePropertiesIdentifierEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelinePropertiesIdentifierEXT *>( this );\n    }\n\n    operator VkPipelinePropertiesIdentifierEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelinePropertiesIdentifierEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pipelineIdentifier );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelinePropertiesIdentifierEXT const & ) const = default;\n#else\n    bool operator==( PipelinePropertiesIdentifierEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pipelineIdentifier == rhs.pipelineIdentifier );\n#  endif\n    }\n\n    bool operator!=( PipelinePropertiesIdentifierEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                         sType              = StructureType::ePipelinePropertiesIdentifierEXT;\n    void *                                                      pNext              = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_UUID_SIZE> pipelineIdentifier = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelinePropertiesIdentifierEXT>\n  {\n    using Type = PipelinePropertiesIdentifierEXT;\n  };\n\n  struct PipelineRasterizationConservativeStateCreateInfoEXT\n  {\n    using NativeType = VkPipelineRasterizationConservativeStateCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineRasterizationConservativeStateCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineRasterizationConservativeStateCreateInfoEXT(\n      VULKAN_HPP_NAMESPACE::PipelineRasterizationConservativeStateCreateFlagsEXT flags_     = {},\n      VULKAN_HPP_NAMESPACE::ConservativeRasterizationModeEXT conservativeRasterizationMode_ = VULKAN_HPP_NAMESPACE::ConservativeRasterizationModeEXT::eDisabled,\n      float                                                  extraPrimitiveOverestimationSize_ = {},\n      const void *                                           pNext_                            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , conservativeRasterizationMode{ conservativeRasterizationMode_ }\n      , extraPrimitiveOverestimationSize{ extraPrimitiveOverestimationSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PipelineRasterizationConservativeStateCreateInfoEXT( PipelineRasterizationConservativeStateCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineRasterizationConservativeStateCreateInfoEXT( VkPipelineRasterizationConservativeStateCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineRasterizationConservativeStateCreateInfoEXT( *reinterpret_cast<PipelineRasterizationConservativeStateCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    PipelineRasterizationConservativeStateCreateInfoEXT &\n      operator=( PipelineRasterizationConservativeStateCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineRasterizationConservativeStateCreateInfoEXT & operator=( VkPipelineRasterizationConservativeStateCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineRasterizationConservativeStateCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationConservativeStateCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationConservativeStateCreateInfoEXT &\n      setFlags( VULKAN_HPP_NAMESPACE::PipelineRasterizationConservativeStateCreateFlagsEXT flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationConservativeStateCreateInfoEXT &\n      setConservativeRasterizationMode( VULKAN_HPP_NAMESPACE::ConservativeRasterizationModeEXT conservativeRasterizationMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      conservativeRasterizationMode = conservativeRasterizationMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationConservativeStateCreateInfoEXT &\n      setExtraPrimitiveOverestimationSize( float extraPrimitiveOverestimationSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extraPrimitiveOverestimationSize = extraPrimitiveOverestimationSize_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineRasterizationConservativeStateCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineRasterizationConservativeStateCreateInfoEXT *>( this );\n    }\n\n    operator VkPipelineRasterizationConservativeStateCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineRasterizationConservativeStateCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineRasterizationConservativeStateCreateFlagsEXT const &,\n               VULKAN_HPP_NAMESPACE::ConservativeRasterizationModeEXT const &,\n               float const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, conservativeRasterizationMode, extraPrimitiveOverestimationSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineRasterizationConservativeStateCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( PipelineRasterizationConservativeStateCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) &&\n             ( conservativeRasterizationMode == rhs.conservativeRasterizationMode ) &&\n             ( extraPrimitiveOverestimationSize == rhs.extraPrimitiveOverestimationSize );\n#  endif\n    }\n\n    bool operator!=( PipelineRasterizationConservativeStateCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                        sType     = StructureType::ePipelineRasterizationConservativeStateCreateInfoEXT;\n    const void *                                                               pNext     = {};\n    VULKAN_HPP_NAMESPACE::PipelineRasterizationConservativeStateCreateFlagsEXT flags     = {};\n    VULKAN_HPP_NAMESPACE::ConservativeRasterizationModeEXT conservativeRasterizationMode = VULKAN_HPP_NAMESPACE::ConservativeRasterizationModeEXT::eDisabled;\n    float                                                  extraPrimitiveOverestimationSize = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineRasterizationConservativeStateCreateInfoEXT>\n  {\n    using Type = PipelineRasterizationConservativeStateCreateInfoEXT;\n  };\n\n  struct PipelineRasterizationDepthClipStateCreateInfoEXT\n  {\n    using NativeType = VkPipelineRasterizationDepthClipStateCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineRasterizationDepthClipStateCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineRasterizationDepthClipStateCreateInfoEXT( VULKAN_HPP_NAMESPACE::PipelineRasterizationDepthClipStateCreateFlagsEXT flags_ = {},\n                                                                           VULKAN_HPP_NAMESPACE::Bool32 depthClipEnable_                                  = {},\n                                                                           const void *                 pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , depthClipEnable{ depthClipEnable_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PipelineRasterizationDepthClipStateCreateInfoEXT( PipelineRasterizationDepthClipStateCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineRasterizationDepthClipStateCreateInfoEXT( VkPipelineRasterizationDepthClipStateCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineRasterizationDepthClipStateCreateInfoEXT( *reinterpret_cast<PipelineRasterizationDepthClipStateCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    PipelineRasterizationDepthClipStateCreateInfoEXT & operator=( PipelineRasterizationDepthClipStateCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineRasterizationDepthClipStateCreateInfoEXT & operator=( VkPipelineRasterizationDepthClipStateCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineRasterizationDepthClipStateCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationDepthClipStateCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationDepthClipStateCreateInfoEXT &\n      setFlags( VULKAN_HPP_NAMESPACE::PipelineRasterizationDepthClipStateCreateFlagsEXT flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationDepthClipStateCreateInfoEXT &\n      setDepthClipEnable( VULKAN_HPP_NAMESPACE::Bool32 depthClipEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthClipEnable = depthClipEnable_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineRasterizationDepthClipStateCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineRasterizationDepthClipStateCreateInfoEXT *>( this );\n    }\n\n    operator VkPipelineRasterizationDepthClipStateCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineRasterizationDepthClipStateCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineRasterizationDepthClipStateCreateFlagsEXT const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, depthClipEnable );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineRasterizationDepthClipStateCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( PipelineRasterizationDepthClipStateCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( depthClipEnable == rhs.depthClipEnable );\n#  endif\n    }\n\n    bool operator!=( PipelineRasterizationDepthClipStateCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                     sType           = StructureType::ePipelineRasterizationDepthClipStateCreateInfoEXT;\n    const void *                                                            pNext           = {};\n    VULKAN_HPP_NAMESPACE::PipelineRasterizationDepthClipStateCreateFlagsEXT flags           = {};\n    VULKAN_HPP_NAMESPACE::Bool32                                            depthClipEnable = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineRasterizationDepthClipStateCreateInfoEXT>\n  {\n    using Type = PipelineRasterizationDepthClipStateCreateInfoEXT;\n  };\n\n  struct PipelineRasterizationLineStateCreateInfo\n  {\n    using NativeType = VkPipelineRasterizationLineStateCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineRasterizationLineStateCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineRasterizationLineStateCreateInfo(\n      VULKAN_HPP_NAMESPACE::LineRasterizationMode lineRasterizationMode_ = VULKAN_HPP_NAMESPACE::LineRasterizationMode::eDefault,\n      VULKAN_HPP_NAMESPACE::Bool32                stippledLineEnable_    = {},\n      uint32_t                                    lineStippleFactor_     = {},\n      uint16_t                                    lineStipplePattern_    = {},\n      const void *                                pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , lineRasterizationMode{ lineRasterizationMode_ }\n      , stippledLineEnable{ stippledLineEnable_ }\n      , lineStippleFactor{ lineStippleFactor_ }\n      , lineStipplePattern{ lineStipplePattern_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineRasterizationLineStateCreateInfo( PipelineRasterizationLineStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineRasterizationLineStateCreateInfo( VkPipelineRasterizationLineStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineRasterizationLineStateCreateInfo( *reinterpret_cast<PipelineRasterizationLineStateCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    PipelineRasterizationLineStateCreateInfo & operator=( PipelineRasterizationLineStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineRasterizationLineStateCreateInfo & operator=( VkPipelineRasterizationLineStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineRasterizationLineStateCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationLineStateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationLineStateCreateInfo &\n      setLineRasterizationMode( VULKAN_HPP_NAMESPACE::LineRasterizationMode lineRasterizationMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      lineRasterizationMode = lineRasterizationMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationLineStateCreateInfo &\n      setStippledLineEnable( VULKAN_HPP_NAMESPACE::Bool32 stippledLineEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stippledLineEnable = stippledLineEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationLineStateCreateInfo & setLineStippleFactor( uint32_t lineStippleFactor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      lineStippleFactor = lineStippleFactor_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationLineStateCreateInfo & setLineStipplePattern( uint16_t lineStipplePattern_ ) VULKAN_HPP_NOEXCEPT\n    {\n      lineStipplePattern = lineStipplePattern_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineRasterizationLineStateCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineRasterizationLineStateCreateInfo *>( this );\n    }\n\n    operator VkPipelineRasterizationLineStateCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineRasterizationLineStateCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::LineRasterizationMode const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &,\n               uint16_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, lineRasterizationMode, stippledLineEnable, lineStippleFactor, lineStipplePattern );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineRasterizationLineStateCreateInfo const & ) const = default;\n#else\n    bool operator==( PipelineRasterizationLineStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( lineRasterizationMode == rhs.lineRasterizationMode ) &&\n             ( stippledLineEnable == rhs.stippledLineEnable ) && ( lineStippleFactor == rhs.lineStippleFactor ) &&\n             ( lineStipplePattern == rhs.lineStipplePattern );\n#  endif\n    }\n\n    bool operator!=( PipelineRasterizationLineStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType         sType                 = StructureType::ePipelineRasterizationLineStateCreateInfo;\n    const void *                                pNext                 = {};\n    VULKAN_HPP_NAMESPACE::LineRasterizationMode lineRasterizationMode = VULKAN_HPP_NAMESPACE::LineRasterizationMode::eDefault;\n    VULKAN_HPP_NAMESPACE::Bool32                stippledLineEnable    = {};\n    uint32_t                                    lineStippleFactor     = {};\n    uint16_t                                    lineStipplePattern    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineRasterizationLineStateCreateInfo>\n  {\n    using Type = PipelineRasterizationLineStateCreateInfo;\n  };\n\n  using PipelineRasterizationLineStateCreateInfoEXT = PipelineRasterizationLineStateCreateInfo;\n  using PipelineRasterizationLineStateCreateInfoKHR = PipelineRasterizationLineStateCreateInfo;\n\n  struct PipelineRasterizationProvokingVertexStateCreateInfoEXT\n  {\n    using NativeType = VkPipelineRasterizationProvokingVertexStateCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineRasterizationProvokingVertexStateCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineRasterizationProvokingVertexStateCreateInfoEXT(\n      VULKAN_HPP_NAMESPACE::ProvokingVertexModeEXT provokingVertexMode_ = VULKAN_HPP_NAMESPACE::ProvokingVertexModeEXT::eFirstVertex,\n      const void *                                 pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , provokingVertexMode{ provokingVertexMode_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineRasterizationProvokingVertexStateCreateInfoEXT( PipelineRasterizationProvokingVertexStateCreateInfoEXT const & rhs )\n      VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineRasterizationProvokingVertexStateCreateInfoEXT( VkPipelineRasterizationProvokingVertexStateCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineRasterizationProvokingVertexStateCreateInfoEXT( *reinterpret_cast<PipelineRasterizationProvokingVertexStateCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    PipelineRasterizationProvokingVertexStateCreateInfoEXT &\n      operator=( PipelineRasterizationProvokingVertexStateCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineRasterizationProvokingVertexStateCreateInfoEXT &\n      operator=( VkPipelineRasterizationProvokingVertexStateCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineRasterizationProvokingVertexStateCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationProvokingVertexStateCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationProvokingVertexStateCreateInfoEXT &\n      setProvokingVertexMode( VULKAN_HPP_NAMESPACE::ProvokingVertexModeEXT provokingVertexMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      provokingVertexMode = provokingVertexMode_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineRasterizationProvokingVertexStateCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT *>( this );\n    }\n\n    operator VkPipelineRasterizationProvokingVertexStateCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineRasterizationProvokingVertexStateCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ProvokingVertexModeEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, provokingVertexMode );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineRasterizationProvokingVertexStateCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( PipelineRasterizationProvokingVertexStateCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( provokingVertexMode == rhs.provokingVertexMode );\n#  endif\n    }\n\n    bool operator!=( PipelineRasterizationProvokingVertexStateCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType               = StructureType::ePipelineRasterizationProvokingVertexStateCreateInfoEXT;\n    const void *                                 pNext               = {};\n    VULKAN_HPP_NAMESPACE::ProvokingVertexModeEXT provokingVertexMode = VULKAN_HPP_NAMESPACE::ProvokingVertexModeEXT::eFirstVertex;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineRasterizationProvokingVertexStateCreateInfoEXT>\n  {\n    using Type = PipelineRasterizationProvokingVertexStateCreateInfoEXT;\n  };\n\n  struct PipelineRasterizationStateRasterizationOrderAMD\n  {\n    using NativeType = VkPipelineRasterizationStateRasterizationOrderAMD;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineRasterizationStateRasterizationOrderAMD;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineRasterizationStateRasterizationOrderAMD(\n      VULKAN_HPP_NAMESPACE::RasterizationOrderAMD rasterizationOrder_ = VULKAN_HPP_NAMESPACE::RasterizationOrderAMD::eStrict,\n      const void *                                pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , rasterizationOrder{ rasterizationOrder_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PipelineRasterizationStateRasterizationOrderAMD( PipelineRasterizationStateRasterizationOrderAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineRasterizationStateRasterizationOrderAMD( VkPipelineRasterizationStateRasterizationOrderAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineRasterizationStateRasterizationOrderAMD( *reinterpret_cast<PipelineRasterizationStateRasterizationOrderAMD const *>( &rhs ) )\n    {\n    }\n\n    PipelineRasterizationStateRasterizationOrderAMD & operator=( PipelineRasterizationStateRasterizationOrderAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineRasterizationStateRasterizationOrderAMD & operator=( VkPipelineRasterizationStateRasterizationOrderAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineRasterizationStateRasterizationOrderAMD const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationStateRasterizationOrderAMD & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationStateRasterizationOrderAMD &\n      setRasterizationOrder( VULKAN_HPP_NAMESPACE::RasterizationOrderAMD rasterizationOrder_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rasterizationOrder = rasterizationOrder_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineRasterizationStateRasterizationOrderAMD const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineRasterizationStateRasterizationOrderAMD *>( this );\n    }\n\n    operator VkPipelineRasterizationStateRasterizationOrderAMD &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineRasterizationStateRasterizationOrderAMD *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::RasterizationOrderAMD const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, rasterizationOrder );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineRasterizationStateRasterizationOrderAMD const & ) const = default;\n#else\n    bool operator==( PipelineRasterizationStateRasterizationOrderAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( rasterizationOrder == rhs.rasterizationOrder );\n#  endif\n    }\n\n    bool operator!=( PipelineRasterizationStateRasterizationOrderAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType         sType              = StructureType::ePipelineRasterizationStateRasterizationOrderAMD;\n    const void *                                pNext              = {};\n    VULKAN_HPP_NAMESPACE::RasterizationOrderAMD rasterizationOrder = VULKAN_HPP_NAMESPACE::RasterizationOrderAMD::eStrict;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineRasterizationStateRasterizationOrderAMD>\n  {\n    using Type = PipelineRasterizationStateRasterizationOrderAMD;\n  };\n\n  struct PipelineRasterizationStateStreamCreateInfoEXT\n  {\n    using NativeType = VkPipelineRasterizationStateStreamCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineRasterizationStateStreamCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineRasterizationStateStreamCreateInfoEXT( VULKAN_HPP_NAMESPACE::PipelineRasterizationStateStreamCreateFlagsEXT flags_ = {},\n                                                                        uint32_t     rasterizationStream_                                           = {},\n                                                                        const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , rasterizationStream{ rasterizationStream_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PipelineRasterizationStateStreamCreateInfoEXT( PipelineRasterizationStateStreamCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineRasterizationStateStreamCreateInfoEXT( VkPipelineRasterizationStateStreamCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineRasterizationStateStreamCreateInfoEXT( *reinterpret_cast<PipelineRasterizationStateStreamCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    PipelineRasterizationStateStreamCreateInfoEXT & operator=( PipelineRasterizationStateStreamCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineRasterizationStateStreamCreateInfoEXT & operator=( VkPipelineRasterizationStateStreamCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineRasterizationStateStreamCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationStateStreamCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationStateStreamCreateInfoEXT &\n      setFlags( VULKAN_HPP_NAMESPACE::PipelineRasterizationStateStreamCreateFlagsEXT flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRasterizationStateStreamCreateInfoEXT & setRasterizationStream( uint32_t rasterizationStream_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rasterizationStream = rasterizationStream_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineRasterizationStateStreamCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineRasterizationStateStreamCreateInfoEXT *>( this );\n    }\n\n    operator VkPipelineRasterizationStateStreamCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineRasterizationStateStreamCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineRasterizationStateStreamCreateFlagsEXT const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, rasterizationStream );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineRasterizationStateStreamCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( PipelineRasterizationStateStreamCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( rasterizationStream == rhs.rasterizationStream );\n#  endif\n    }\n\n    bool operator!=( PipelineRasterizationStateStreamCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                  sType               = StructureType::ePipelineRasterizationStateStreamCreateInfoEXT;\n    const void *                                                         pNext               = {};\n    VULKAN_HPP_NAMESPACE::PipelineRasterizationStateStreamCreateFlagsEXT flags               = {};\n    uint32_t                                                             rasterizationStream = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineRasterizationStateStreamCreateInfoEXT>\n  {\n    using Type = PipelineRasterizationStateStreamCreateInfoEXT;\n  };\n\n  struct PipelineRenderingCreateInfo\n  {\n    using NativeType = VkPipelineRenderingCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineRenderingCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineRenderingCreateInfo( uint32_t                             viewMask_                = {},\n                                                      uint32_t                             colorAttachmentCount_    = {},\n                                                      const VULKAN_HPP_NAMESPACE::Format * pColorAttachmentFormats_ = {},\n                                                      VULKAN_HPP_NAMESPACE::Format         depthAttachmentFormat_   = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                                      VULKAN_HPP_NAMESPACE::Format         stencilAttachmentFormat_ = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                                      const void *                         pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , viewMask{ viewMask_ }\n      , colorAttachmentCount{ colorAttachmentCount_ }\n      , pColorAttachmentFormats{ pColorAttachmentFormats_ }\n      , depthAttachmentFormat{ depthAttachmentFormat_ }\n      , stencilAttachmentFormat{ stencilAttachmentFormat_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineRenderingCreateInfo( PipelineRenderingCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineRenderingCreateInfo( VkPipelineRenderingCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineRenderingCreateInfo( *reinterpret_cast<PipelineRenderingCreateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineRenderingCreateInfo( uint32_t                                                                                  viewMask_,\n                                 VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Format> const & colorAttachmentFormats_,\n                                 VULKAN_HPP_NAMESPACE::Format depthAttachmentFormat_   = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                 VULKAN_HPP_NAMESPACE::Format stencilAttachmentFormat_ = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                 const void *                 pNext_                   = nullptr )\n      : pNext( pNext_ )\n      , viewMask( viewMask_ )\n      , colorAttachmentCount( static_cast<uint32_t>( colorAttachmentFormats_.size() ) )\n      , pColorAttachmentFormats( colorAttachmentFormats_.data() )\n      , depthAttachmentFormat( depthAttachmentFormat_ )\n      , stencilAttachmentFormat( stencilAttachmentFormat_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PipelineRenderingCreateInfo & operator=( PipelineRenderingCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineRenderingCreateInfo & operator=( VkPipelineRenderingCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineRenderingCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineRenderingCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRenderingCreateInfo & setViewMask( uint32_t viewMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      viewMask = viewMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRenderingCreateInfo & setColorAttachmentCount( uint32_t colorAttachmentCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorAttachmentCount = colorAttachmentCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRenderingCreateInfo &\n      setPColorAttachmentFormats( const VULKAN_HPP_NAMESPACE::Format * pColorAttachmentFormats_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pColorAttachmentFormats = pColorAttachmentFormats_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineRenderingCreateInfo & setColorAttachmentFormats(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Format> const & colorAttachmentFormats_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorAttachmentCount    = static_cast<uint32_t>( colorAttachmentFormats_.size() );\n      pColorAttachmentFormats = colorAttachmentFormats_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRenderingCreateInfo & setDepthAttachmentFormat( VULKAN_HPP_NAMESPACE::Format depthAttachmentFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthAttachmentFormat = depthAttachmentFormat_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRenderingCreateInfo &\n      setStencilAttachmentFormat( VULKAN_HPP_NAMESPACE::Format stencilAttachmentFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stencilAttachmentFormat = stencilAttachmentFormat_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineRenderingCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineRenderingCreateInfo *>( this );\n    }\n\n    operator VkPipelineRenderingCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineRenderingCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::Format * const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::Format const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, viewMask, colorAttachmentCount, pColorAttachmentFormats, depthAttachmentFormat, stencilAttachmentFormat );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineRenderingCreateInfo const & ) const = default;\n#else\n    bool operator==( PipelineRenderingCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( viewMask == rhs.viewMask ) && ( colorAttachmentCount == rhs.colorAttachmentCount ) &&\n             ( pColorAttachmentFormats == rhs.pColorAttachmentFormats ) && ( depthAttachmentFormat == rhs.depthAttachmentFormat ) &&\n             ( stencilAttachmentFormat == rhs.stencilAttachmentFormat );\n#  endif\n    }\n\n    bool operator!=( PipelineRenderingCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType  sType                   = StructureType::ePipelineRenderingCreateInfo;\n    const void *                         pNext                   = {};\n    uint32_t                             viewMask                = {};\n    uint32_t                             colorAttachmentCount    = {};\n    const VULKAN_HPP_NAMESPACE::Format * pColorAttachmentFormats = {};\n    VULKAN_HPP_NAMESPACE::Format         depthAttachmentFormat   = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::Format         stencilAttachmentFormat = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineRenderingCreateInfo>\n  {\n    using Type = PipelineRenderingCreateInfo;\n  };\n\n  using PipelineRenderingCreateInfoKHR = PipelineRenderingCreateInfo;\n\n  struct PipelineRepresentativeFragmentTestStateCreateInfoNV\n  {\n    using NativeType = VkPipelineRepresentativeFragmentTestStateCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineRepresentativeFragmentTestStateCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineRepresentativeFragmentTestStateCreateInfoNV( VULKAN_HPP_NAMESPACE::Bool32 representativeFragmentTestEnable_ = {},\n                                                                              const void *                 pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , representativeFragmentTestEnable{ representativeFragmentTestEnable_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PipelineRepresentativeFragmentTestStateCreateInfoNV( PipelineRepresentativeFragmentTestStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineRepresentativeFragmentTestStateCreateInfoNV( VkPipelineRepresentativeFragmentTestStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineRepresentativeFragmentTestStateCreateInfoNV( *reinterpret_cast<PipelineRepresentativeFragmentTestStateCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n    PipelineRepresentativeFragmentTestStateCreateInfoNV &\n      operator=( PipelineRepresentativeFragmentTestStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineRepresentativeFragmentTestStateCreateInfoNV & operator=( VkPipelineRepresentativeFragmentTestStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineRepresentativeFragmentTestStateCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineRepresentativeFragmentTestStateCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRepresentativeFragmentTestStateCreateInfoNV &\n      setRepresentativeFragmentTestEnable( VULKAN_HPP_NAMESPACE::Bool32 representativeFragmentTestEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      representativeFragmentTestEnable = representativeFragmentTestEnable_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineRepresentativeFragmentTestStateCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineRepresentativeFragmentTestStateCreateInfoNV *>( this );\n    }\n\n    operator VkPipelineRepresentativeFragmentTestStateCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineRepresentativeFragmentTestStateCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, representativeFragmentTestEnable );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineRepresentativeFragmentTestStateCreateInfoNV const & ) const = default;\n#else\n    bool operator==( PipelineRepresentativeFragmentTestStateCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( representativeFragmentTestEnable == rhs.representativeFragmentTestEnable );\n#  endif\n    }\n\n    bool operator!=( PipelineRepresentativeFragmentTestStateCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                            = StructureType::ePipelineRepresentativeFragmentTestStateCreateInfoNV;\n    const void *                        pNext                            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        representativeFragmentTestEnable = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineRepresentativeFragmentTestStateCreateInfoNV>\n  {\n    using Type = PipelineRepresentativeFragmentTestStateCreateInfoNV;\n  };\n\n  struct PipelineRobustnessCreateInfo\n  {\n    using NativeType = VkPipelineRobustnessCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineRobustnessCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineRobustnessCreateInfo(\n      VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior storageBuffers_ = VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior::eDeviceDefault,\n      VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior uniformBuffers_ = VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior::eDeviceDefault,\n      VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior vertexInputs_   = VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior::eDeviceDefault,\n      VULKAN_HPP_NAMESPACE::PipelineRobustnessImageBehavior  images_         = VULKAN_HPP_NAMESPACE::PipelineRobustnessImageBehavior::eDeviceDefault,\n      const void *                                           pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , storageBuffers{ storageBuffers_ }\n      , uniformBuffers{ uniformBuffers_ }\n      , vertexInputs{ vertexInputs_ }\n      , images{ images_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineRobustnessCreateInfo( PipelineRobustnessCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineRobustnessCreateInfo( VkPipelineRobustnessCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineRobustnessCreateInfo( *reinterpret_cast<PipelineRobustnessCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    PipelineRobustnessCreateInfo & operator=( PipelineRobustnessCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineRobustnessCreateInfo & operator=( VkPipelineRobustnessCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineRobustnessCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineRobustnessCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRobustnessCreateInfo &\n      setStorageBuffers( VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior storageBuffers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      storageBuffers = storageBuffers_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRobustnessCreateInfo &\n      setUniformBuffers( VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior uniformBuffers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      uniformBuffers = uniformBuffers_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRobustnessCreateInfo &\n      setVertexInputs( VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior vertexInputs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexInputs = vertexInputs_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineRobustnessCreateInfo & setImages( VULKAN_HPP_NAMESPACE::PipelineRobustnessImageBehavior images_ ) VULKAN_HPP_NOEXCEPT\n    {\n      images = images_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineRobustnessCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineRobustnessCreateInfo *>( this );\n    }\n\n    operator VkPipelineRobustnessCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineRobustnessCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior const &,\n               VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior const &,\n               VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior const &,\n               VULKAN_HPP_NAMESPACE::PipelineRobustnessImageBehavior const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, storageBuffers, uniformBuffers, vertexInputs, images );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineRobustnessCreateInfo const & ) const = default;\n#else\n    bool operator==( PipelineRobustnessCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( storageBuffers == rhs.storageBuffers ) && ( uniformBuffers == rhs.uniformBuffers ) &&\n             ( vertexInputs == rhs.vertexInputs ) && ( images == rhs.images );\n#  endif\n    }\n\n    bool operator!=( PipelineRobustnessCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType          = StructureType::ePipelineRobustnessCreateInfo;\n    const void *                                           pNext          = {};\n    VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior storageBuffers = VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior::eDeviceDefault;\n    VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior uniformBuffers = VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior::eDeviceDefault;\n    VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior vertexInputs   = VULKAN_HPP_NAMESPACE::PipelineRobustnessBufferBehavior::eDeviceDefault;\n    VULKAN_HPP_NAMESPACE::PipelineRobustnessImageBehavior  images         = VULKAN_HPP_NAMESPACE::PipelineRobustnessImageBehavior::eDeviceDefault;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineRobustnessCreateInfo>\n  {\n    using Type = PipelineRobustnessCreateInfo;\n  };\n\n  using PipelineRobustnessCreateInfoEXT = PipelineRobustnessCreateInfo;\n\n  struct PipelineSampleLocationsStateCreateInfoEXT\n  {\n    using NativeType = VkPipelineSampleLocationsStateCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineSampleLocationsStateCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineSampleLocationsStateCreateInfoEXT( VULKAN_HPP_NAMESPACE::Bool32                 sampleLocationsEnable_ = {},\n                                                                    VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT sampleLocationsInfo_   = {},\n                                                                    const void *                                 pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , sampleLocationsEnable{ sampleLocationsEnable_ }\n      , sampleLocationsInfo{ sampleLocationsInfo_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineSampleLocationsStateCreateInfoEXT( PipelineSampleLocationsStateCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineSampleLocationsStateCreateInfoEXT( VkPipelineSampleLocationsStateCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineSampleLocationsStateCreateInfoEXT( *reinterpret_cast<PipelineSampleLocationsStateCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    PipelineSampleLocationsStateCreateInfoEXT & operator=( PipelineSampleLocationsStateCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineSampleLocationsStateCreateInfoEXT & operator=( VkPipelineSampleLocationsStateCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineSampleLocationsStateCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineSampleLocationsStateCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineSampleLocationsStateCreateInfoEXT &\n      setSampleLocationsEnable( VULKAN_HPP_NAMESPACE::Bool32 sampleLocationsEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sampleLocationsEnable = sampleLocationsEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineSampleLocationsStateCreateInfoEXT &\n      setSampleLocationsInfo( VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT const & sampleLocationsInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sampleLocationsInfo = sampleLocationsInfo_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineSampleLocationsStateCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineSampleLocationsStateCreateInfoEXT *>( this );\n    }\n\n    operator VkPipelineSampleLocationsStateCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineSampleLocationsStateCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, sampleLocationsEnable, sampleLocationsInfo );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineSampleLocationsStateCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( PipelineSampleLocationsStateCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( sampleLocationsEnable == rhs.sampleLocationsEnable ) &&\n             ( sampleLocationsInfo == rhs.sampleLocationsInfo );\n#  endif\n    }\n\n    bool operator!=( PipelineSampleLocationsStateCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType                 = StructureType::ePipelineSampleLocationsStateCreateInfoEXT;\n    const void *                                 pNext                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32                 sampleLocationsEnable = {};\n    VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT sampleLocationsInfo   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineSampleLocationsStateCreateInfoEXT>\n  {\n    using Type = PipelineSampleLocationsStateCreateInfoEXT;\n  };\n\n  struct PipelineShaderStageModuleIdentifierCreateInfoEXT\n  {\n    using NativeType = VkPipelineShaderStageModuleIdentifierCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineShaderStageModuleIdentifierCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineShaderStageModuleIdentifierCreateInfoEXT( uint32_t        identifierSize_ = {},\n                                                                           const uint8_t * pIdentifier_    = {},\n                                                                           const void *    pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , identifierSize{ identifierSize_ }\n      , pIdentifier{ pIdentifier_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PipelineShaderStageModuleIdentifierCreateInfoEXT( PipelineShaderStageModuleIdentifierCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineShaderStageModuleIdentifierCreateInfoEXT( VkPipelineShaderStageModuleIdentifierCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineShaderStageModuleIdentifierCreateInfoEXT( *reinterpret_cast<PipelineShaderStageModuleIdentifierCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineShaderStageModuleIdentifierCreateInfoEXT( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint8_t> const & identifier_,\n                                                      const void *                                                         pNext_ = nullptr )\n      : pNext( pNext_ ), identifierSize( static_cast<uint32_t>( identifier_.size() ) ), pIdentifier( identifier_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PipelineShaderStageModuleIdentifierCreateInfoEXT & operator=( PipelineShaderStageModuleIdentifierCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineShaderStageModuleIdentifierCreateInfoEXT & operator=( VkPipelineShaderStageModuleIdentifierCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineShaderStageModuleIdentifierCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineShaderStageModuleIdentifierCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineShaderStageModuleIdentifierCreateInfoEXT & setIdentifierSize( uint32_t identifierSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      identifierSize = identifierSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineShaderStageModuleIdentifierCreateInfoEXT & setPIdentifier( const uint8_t * pIdentifier_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pIdentifier = pIdentifier_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineShaderStageModuleIdentifierCreateInfoEXT &\n      setIdentifier( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint8_t> const & identifier_ ) VULKAN_HPP_NOEXCEPT\n    {\n      identifierSize = static_cast<uint32_t>( identifier_.size() );\n      pIdentifier    = identifier_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineShaderStageModuleIdentifierCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineShaderStageModuleIdentifierCreateInfoEXT *>( this );\n    }\n\n    operator VkPipelineShaderStageModuleIdentifierCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineShaderStageModuleIdentifierCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const uint8_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, identifierSize, pIdentifier );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineShaderStageModuleIdentifierCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( PipelineShaderStageModuleIdentifierCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( identifierSize == rhs.identifierSize ) && ( pIdentifier == rhs.pIdentifier );\n#  endif\n    }\n\n    bool operator!=( PipelineShaderStageModuleIdentifierCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::ePipelineShaderStageModuleIdentifierCreateInfoEXT;\n    const void *                        pNext          = {};\n    uint32_t                            identifierSize = {};\n    const uint8_t *                     pIdentifier    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineShaderStageModuleIdentifierCreateInfoEXT>\n  {\n    using Type = PipelineShaderStageModuleIdentifierCreateInfoEXT;\n  };\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  struct PipelineShaderStageNodeCreateInfoAMDX\n  {\n    using NativeType = VkPipelineShaderStageNodeCreateInfoAMDX;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineShaderStageNodeCreateInfoAMDX;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      PipelineShaderStageNodeCreateInfoAMDX( const char * pName_ = {}, uint32_t index_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pName{ pName_ }\n      , index{ index_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineShaderStageNodeCreateInfoAMDX( PipelineShaderStageNodeCreateInfoAMDX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineShaderStageNodeCreateInfoAMDX( VkPipelineShaderStageNodeCreateInfoAMDX const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineShaderStageNodeCreateInfoAMDX( *reinterpret_cast<PipelineShaderStageNodeCreateInfoAMDX const *>( &rhs ) )\n    {\n    }\n\n    PipelineShaderStageNodeCreateInfoAMDX & operator=( PipelineShaderStageNodeCreateInfoAMDX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineShaderStageNodeCreateInfoAMDX & operator=( VkPipelineShaderStageNodeCreateInfoAMDX const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineShaderStageNodeCreateInfoAMDX const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineShaderStageNodeCreateInfoAMDX & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineShaderStageNodeCreateInfoAMDX & setPName( const char * pName_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pName = pName_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineShaderStageNodeCreateInfoAMDX & setIndex( uint32_t index_ ) VULKAN_HPP_NOEXCEPT\n    {\n      index = index_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineShaderStageNodeCreateInfoAMDX const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineShaderStageNodeCreateInfoAMDX *>( this );\n    }\n\n    operator VkPipelineShaderStageNodeCreateInfoAMDX &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineShaderStageNodeCreateInfoAMDX *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, const char * const &, uint32_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pName, index );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( PipelineShaderStageNodeCreateInfoAMDX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( pName != rhs.pName )\n        if ( auto cmp = strcmp( pName, rhs.pName ); cmp != 0 )\n          return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = index <=> rhs.index; cmp != 0 )\n        return cmp;\n\n      return std::strong_ordering::equivalent;\n    }\n#  endif\n\n    bool operator==( PipelineShaderStageNodeCreateInfoAMDX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( ( pName == rhs.pName ) || ( strcmp( pName, rhs.pName ) == 0 ) ) && ( index == rhs.index );\n    }\n\n    bool operator!=( PipelineShaderStageNodeCreateInfoAMDX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType = StructureType::ePipelineShaderStageNodeCreateInfoAMDX;\n    const void *                        pNext = {};\n    const char *                        pName = {};\n    uint32_t                            index = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineShaderStageNodeCreateInfoAMDX>\n  {\n    using Type = PipelineShaderStageNodeCreateInfoAMDX;\n  };\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  struct PipelineShaderStageRequiredSubgroupSizeCreateInfo\n  {\n    using NativeType = VkPipelineShaderStageRequiredSubgroupSizeCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineShaderStageRequiredSubgroupSizeCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineShaderStageRequiredSubgroupSizeCreateInfo( uint32_t requiredSubgroupSize_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , requiredSubgroupSize{ requiredSubgroupSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PipelineShaderStageRequiredSubgroupSizeCreateInfo( PipelineShaderStageRequiredSubgroupSizeCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineShaderStageRequiredSubgroupSizeCreateInfo( VkPipelineShaderStageRequiredSubgroupSizeCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineShaderStageRequiredSubgroupSizeCreateInfo( *reinterpret_cast<PipelineShaderStageRequiredSubgroupSizeCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    PipelineShaderStageRequiredSubgroupSizeCreateInfo &\n      operator=( PipelineShaderStageRequiredSubgroupSizeCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineShaderStageRequiredSubgroupSizeCreateInfo & operator=( VkPipelineShaderStageRequiredSubgroupSizeCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineShaderStageRequiredSubgroupSizeCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n    operator VkPipelineShaderStageRequiredSubgroupSizeCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineShaderStageRequiredSubgroupSizeCreateInfo *>( this );\n    }\n\n    operator VkPipelineShaderStageRequiredSubgroupSizeCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineShaderStageRequiredSubgroupSizeCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, requiredSubgroupSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineShaderStageRequiredSubgroupSizeCreateInfo const & ) const = default;\n#else\n    bool operator==( PipelineShaderStageRequiredSubgroupSizeCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( requiredSubgroupSize == rhs.requiredSubgroupSize );\n#  endif\n    }\n\n    bool operator!=( PipelineShaderStageRequiredSubgroupSizeCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                = StructureType::ePipelineShaderStageRequiredSubgroupSizeCreateInfo;\n    void *                              pNext                = {};\n    uint32_t                            requiredSubgroupSize = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineShaderStageRequiredSubgroupSizeCreateInfo>\n  {\n    using Type = PipelineShaderStageRequiredSubgroupSizeCreateInfo;\n  };\n\n  using PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT = PipelineShaderStageRequiredSubgroupSizeCreateInfo;\n  using ShaderRequiredSubgroupSizeCreateInfoEXT              = PipelineShaderStageRequiredSubgroupSizeCreateInfo;\n\n  struct PipelineTessellationDomainOriginStateCreateInfo\n  {\n    using NativeType = VkPipelineTessellationDomainOriginStateCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineTessellationDomainOriginStateCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineTessellationDomainOriginStateCreateInfo(\n      VULKAN_HPP_NAMESPACE::TessellationDomainOrigin domainOrigin_ = VULKAN_HPP_NAMESPACE::TessellationDomainOrigin::eUpperLeft,\n      const void *                                   pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , domainOrigin{ domainOrigin_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PipelineTessellationDomainOriginStateCreateInfo( PipelineTessellationDomainOriginStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineTessellationDomainOriginStateCreateInfo( VkPipelineTessellationDomainOriginStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineTessellationDomainOriginStateCreateInfo( *reinterpret_cast<PipelineTessellationDomainOriginStateCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    PipelineTessellationDomainOriginStateCreateInfo & operator=( PipelineTessellationDomainOriginStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineTessellationDomainOriginStateCreateInfo & operator=( VkPipelineTessellationDomainOriginStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineTessellationDomainOriginStateCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineTessellationDomainOriginStateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineTessellationDomainOriginStateCreateInfo &\n      setDomainOrigin( VULKAN_HPP_NAMESPACE::TessellationDomainOrigin domainOrigin_ ) VULKAN_HPP_NOEXCEPT\n    {\n      domainOrigin = domainOrigin_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineTessellationDomainOriginStateCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineTessellationDomainOriginStateCreateInfo *>( this );\n    }\n\n    operator VkPipelineTessellationDomainOriginStateCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineTessellationDomainOriginStateCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::TessellationDomainOrigin const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, domainOrigin );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineTessellationDomainOriginStateCreateInfo const & ) const = default;\n#else\n    bool operator==( PipelineTessellationDomainOriginStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( domainOrigin == rhs.domainOrigin );\n#  endif\n    }\n\n    bool operator!=( PipelineTessellationDomainOriginStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType            sType        = StructureType::ePipelineTessellationDomainOriginStateCreateInfo;\n    const void *                                   pNext        = {};\n    VULKAN_HPP_NAMESPACE::TessellationDomainOrigin domainOrigin = VULKAN_HPP_NAMESPACE::TessellationDomainOrigin::eUpperLeft;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineTessellationDomainOriginStateCreateInfo>\n  {\n    using Type = PipelineTessellationDomainOriginStateCreateInfo;\n  };\n\n  using PipelineTessellationDomainOriginStateCreateInfoKHR = PipelineTessellationDomainOriginStateCreateInfo;\n\n  struct VertexInputBindingDivisorDescription\n  {\n    using NativeType = VkVertexInputBindingDivisorDescription;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VertexInputBindingDivisorDescription( uint32_t binding_ = {}, uint32_t divisor_ = {} ) VULKAN_HPP_NOEXCEPT\n      : binding{ binding_ }\n      , divisor{ divisor_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VertexInputBindingDivisorDescription( VertexInputBindingDivisorDescription const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VertexInputBindingDivisorDescription( VkVertexInputBindingDivisorDescription const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VertexInputBindingDivisorDescription( *reinterpret_cast<VertexInputBindingDivisorDescription const *>( &rhs ) )\n    {\n    }\n\n    VertexInputBindingDivisorDescription & operator=( VertexInputBindingDivisorDescription const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VertexInputBindingDivisorDescription & operator=( VkVertexInputBindingDivisorDescription const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VertexInputBindingDivisorDescription const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VertexInputBindingDivisorDescription & setBinding( uint32_t binding_ ) VULKAN_HPP_NOEXCEPT\n    {\n      binding = binding_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VertexInputBindingDivisorDescription & setDivisor( uint32_t divisor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      divisor = divisor_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVertexInputBindingDivisorDescription const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVertexInputBindingDivisorDescription *>( this );\n    }\n\n    operator VkVertexInputBindingDivisorDescription &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVertexInputBindingDivisorDescription *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( binding, divisor );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VertexInputBindingDivisorDescription const & ) const = default;\n#else\n    bool operator==( VertexInputBindingDivisorDescription const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( binding == rhs.binding ) && ( divisor == rhs.divisor );\n#  endif\n    }\n\n    bool operator!=( VertexInputBindingDivisorDescription const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t binding = {};\n    uint32_t divisor = {};\n  };\n\n  using VertexInputBindingDivisorDescriptionEXT = VertexInputBindingDivisorDescription;\n  using VertexInputBindingDivisorDescriptionKHR = VertexInputBindingDivisorDescription;\n\n  struct PipelineVertexInputDivisorStateCreateInfo\n  {\n    using NativeType = VkPipelineVertexInputDivisorStateCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineVertexInputDivisorStateCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      PipelineVertexInputDivisorStateCreateInfo( uint32_t                                                           vertexBindingDivisorCount_ = {},\n                                                 const VULKAN_HPP_NAMESPACE::VertexInputBindingDivisorDescription * pVertexBindingDivisors_    = {},\n                                                 const void *                                                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , vertexBindingDivisorCount{ vertexBindingDivisorCount_ }\n      , pVertexBindingDivisors{ pVertexBindingDivisors_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineVertexInputDivisorStateCreateInfo( PipelineVertexInputDivisorStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineVertexInputDivisorStateCreateInfo( VkPipelineVertexInputDivisorStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineVertexInputDivisorStateCreateInfo( *reinterpret_cast<PipelineVertexInputDivisorStateCreateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineVertexInputDivisorStateCreateInfo(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VertexInputBindingDivisorDescription> const & vertexBindingDivisors_,\n      const void *                                                                                                            pNext_ = nullptr )\n      : pNext( pNext_ )\n      , vertexBindingDivisorCount( static_cast<uint32_t>( vertexBindingDivisors_.size() ) )\n      , pVertexBindingDivisors( vertexBindingDivisors_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PipelineVertexInputDivisorStateCreateInfo & operator=( PipelineVertexInputDivisorStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineVertexInputDivisorStateCreateInfo & operator=( VkPipelineVertexInputDivisorStateCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineVertexInputDivisorStateCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineVertexInputDivisorStateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineVertexInputDivisorStateCreateInfo & setVertexBindingDivisorCount( uint32_t vertexBindingDivisorCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      vertexBindingDivisorCount = vertexBindingDivisorCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineVertexInputDivisorStateCreateInfo &\n      setPVertexBindingDivisors( const VULKAN_HPP_NAMESPACE::VertexInputBindingDivisorDescription * pVertexBindingDivisors_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pVertexBindingDivisors = pVertexBindingDivisors_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineVertexInputDivisorStateCreateInfo & setVertexBindingDivisors(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VertexInputBindingDivisorDescription> const & vertexBindingDivisors_ )\n      VULKAN_HPP_NOEXCEPT\n    {\n      vertexBindingDivisorCount = static_cast<uint32_t>( vertexBindingDivisors_.size() );\n      pVertexBindingDivisors    = vertexBindingDivisors_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineVertexInputDivisorStateCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineVertexInputDivisorStateCreateInfo *>( this );\n    }\n\n    operator VkPipelineVertexInputDivisorStateCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineVertexInputDivisorStateCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::VertexInputBindingDivisorDescription * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, vertexBindingDivisorCount, pVertexBindingDivisors );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineVertexInputDivisorStateCreateInfo const & ) const = default;\n#else\n    bool operator==( PipelineVertexInputDivisorStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( vertexBindingDivisorCount == rhs.vertexBindingDivisorCount ) &&\n             ( pVertexBindingDivisors == rhs.pVertexBindingDivisors );\n#  endif\n    }\n\n    bool operator!=( PipelineVertexInputDivisorStateCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                sType                     = StructureType::ePipelineVertexInputDivisorStateCreateInfo;\n    const void *                                                       pNext                     = {};\n    uint32_t                                                           vertexBindingDivisorCount = {};\n    const VULKAN_HPP_NAMESPACE::VertexInputBindingDivisorDescription * pVertexBindingDivisors    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineVertexInputDivisorStateCreateInfo>\n  {\n    using Type = PipelineVertexInputDivisorStateCreateInfo;\n  };\n\n  using PipelineVertexInputDivisorStateCreateInfoEXT = PipelineVertexInputDivisorStateCreateInfo;\n  using PipelineVertexInputDivisorStateCreateInfoKHR = PipelineVertexInputDivisorStateCreateInfo;\n\n  struct PipelineViewportCoarseSampleOrderStateCreateInfoNV\n  {\n    using NativeType = VkPipelineViewportCoarseSampleOrderStateCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineViewportCoarseSampleOrderStateCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineViewportCoarseSampleOrderStateCreateInfoNV(\n      VULKAN_HPP_NAMESPACE::CoarseSampleOrderTypeNV           sampleOrderType_        = VULKAN_HPP_NAMESPACE::CoarseSampleOrderTypeNV::eDefault,\n      uint32_t                                                customSampleOrderCount_ = {},\n      const VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV * pCustomSampleOrders_    = {},\n      const void *                                            pNext_                  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , sampleOrderType{ sampleOrderType_ }\n      , customSampleOrderCount{ customSampleOrderCount_ }\n      , pCustomSampleOrders{ pCustomSampleOrders_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PipelineViewportCoarseSampleOrderStateCreateInfoNV( PipelineViewportCoarseSampleOrderStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineViewportCoarseSampleOrderStateCreateInfoNV( VkPipelineViewportCoarseSampleOrderStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineViewportCoarseSampleOrderStateCreateInfoNV( *reinterpret_cast<PipelineViewportCoarseSampleOrderStateCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineViewportCoarseSampleOrderStateCreateInfoNV(\n      VULKAN_HPP_NAMESPACE::CoarseSampleOrderTypeNV                                                                sampleOrderType_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV> const & customSampleOrders_,\n      const void *                                                                                                 pNext_ = nullptr )\n      : pNext( pNext_ )\n      , sampleOrderType( sampleOrderType_ )\n      , customSampleOrderCount( static_cast<uint32_t>( customSampleOrders_.size() ) )\n      , pCustomSampleOrders( customSampleOrders_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PipelineViewportCoarseSampleOrderStateCreateInfoNV &\n      operator=( PipelineViewportCoarseSampleOrderStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineViewportCoarseSampleOrderStateCreateInfoNV & operator=( VkPipelineViewportCoarseSampleOrderStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineViewportCoarseSampleOrderStateCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportCoarseSampleOrderStateCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportCoarseSampleOrderStateCreateInfoNV &\n      setSampleOrderType( VULKAN_HPP_NAMESPACE::CoarseSampleOrderTypeNV sampleOrderType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sampleOrderType = sampleOrderType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportCoarseSampleOrderStateCreateInfoNV &\n      setCustomSampleOrderCount( uint32_t customSampleOrderCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      customSampleOrderCount = customSampleOrderCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportCoarseSampleOrderStateCreateInfoNV &\n      setPCustomSampleOrders( const VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV * pCustomSampleOrders_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pCustomSampleOrders = pCustomSampleOrders_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineViewportCoarseSampleOrderStateCreateInfoNV & setCustomSampleOrders(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV> const & customSampleOrders_ ) VULKAN_HPP_NOEXCEPT\n    {\n      customSampleOrderCount = static_cast<uint32_t>( customSampleOrders_.size() );\n      pCustomSampleOrders    = customSampleOrders_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineViewportCoarseSampleOrderStateCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV *>( this );\n    }\n\n    operator VkPipelineViewportCoarseSampleOrderStateCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineViewportCoarseSampleOrderStateCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::CoarseSampleOrderTypeNV const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, sampleOrderType, customSampleOrderCount, pCustomSampleOrders );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineViewportCoarseSampleOrderStateCreateInfoNV const & ) const = default;\n#else\n    bool operator==( PipelineViewportCoarseSampleOrderStateCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( sampleOrderType == rhs.sampleOrderType ) &&\n             ( customSampleOrderCount == rhs.customSampleOrderCount ) && ( pCustomSampleOrders == rhs.pCustomSampleOrders );\n#  endif\n    }\n\n    bool operator!=( PipelineViewportCoarseSampleOrderStateCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                     sType                  = StructureType::ePipelineViewportCoarseSampleOrderStateCreateInfoNV;\n    const void *                                            pNext                  = {};\n    VULKAN_HPP_NAMESPACE::CoarseSampleOrderTypeNV           sampleOrderType        = VULKAN_HPP_NAMESPACE::CoarseSampleOrderTypeNV::eDefault;\n    uint32_t                                                customSampleOrderCount = {};\n    const VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV * pCustomSampleOrders    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineViewportCoarseSampleOrderStateCreateInfoNV>\n  {\n    using Type = PipelineViewportCoarseSampleOrderStateCreateInfoNV;\n  };\n\n  struct PipelineViewportDepthClampControlCreateInfoEXT\n  {\n    using NativeType = VkPipelineViewportDepthClampControlCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineViewportDepthClampControlCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineViewportDepthClampControlCreateInfoEXT(\n      VULKAN_HPP_NAMESPACE::DepthClampModeEXT          depthClampMode_   = VULKAN_HPP_NAMESPACE::DepthClampModeEXT::eViewportRange,\n      const VULKAN_HPP_NAMESPACE::DepthClampRangeEXT * pDepthClampRange_ = {},\n      const void *                                     pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , depthClampMode{ depthClampMode_ }\n      , pDepthClampRange{ pDepthClampRange_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PipelineViewportDepthClampControlCreateInfoEXT( PipelineViewportDepthClampControlCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineViewportDepthClampControlCreateInfoEXT( VkPipelineViewportDepthClampControlCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineViewportDepthClampControlCreateInfoEXT( *reinterpret_cast<PipelineViewportDepthClampControlCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    PipelineViewportDepthClampControlCreateInfoEXT & operator=( PipelineViewportDepthClampControlCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineViewportDepthClampControlCreateInfoEXT & operator=( VkPipelineViewportDepthClampControlCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineViewportDepthClampControlCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportDepthClampControlCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportDepthClampControlCreateInfoEXT &\n      setDepthClampMode( VULKAN_HPP_NAMESPACE::DepthClampModeEXT depthClampMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthClampMode = depthClampMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportDepthClampControlCreateInfoEXT &\n      setPDepthClampRange( const VULKAN_HPP_NAMESPACE::DepthClampRangeEXT * pDepthClampRange_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDepthClampRange = pDepthClampRange_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineViewportDepthClampControlCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineViewportDepthClampControlCreateInfoEXT *>( this );\n    }\n\n    operator VkPipelineViewportDepthClampControlCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineViewportDepthClampControlCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DepthClampModeEXT const &,\n               const VULKAN_HPP_NAMESPACE::DepthClampRangeEXT * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, depthClampMode, pDepthClampRange );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineViewportDepthClampControlCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( PipelineViewportDepthClampControlCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( depthClampMode == rhs.depthClampMode ) && ( pDepthClampRange == rhs.pDepthClampRange );\n#  endif\n    }\n\n    bool operator!=( PipelineViewportDepthClampControlCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType              sType            = StructureType::ePipelineViewportDepthClampControlCreateInfoEXT;\n    const void *                                     pNext            = {};\n    VULKAN_HPP_NAMESPACE::DepthClampModeEXT          depthClampMode   = VULKAN_HPP_NAMESPACE::DepthClampModeEXT::eViewportRange;\n    const VULKAN_HPP_NAMESPACE::DepthClampRangeEXT * pDepthClampRange = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineViewportDepthClampControlCreateInfoEXT>\n  {\n    using Type = PipelineViewportDepthClampControlCreateInfoEXT;\n  };\n\n  struct PipelineViewportDepthClipControlCreateInfoEXT\n  {\n    using NativeType = VkPipelineViewportDepthClipControlCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineViewportDepthClipControlCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineViewportDepthClipControlCreateInfoEXT( VULKAN_HPP_NAMESPACE::Bool32 negativeOneToOne_ = {},\n                                                                        const void *                 pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , negativeOneToOne{ negativeOneToOne_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PipelineViewportDepthClipControlCreateInfoEXT( PipelineViewportDepthClipControlCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineViewportDepthClipControlCreateInfoEXT( VkPipelineViewportDepthClipControlCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineViewportDepthClipControlCreateInfoEXT( *reinterpret_cast<PipelineViewportDepthClipControlCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    PipelineViewportDepthClipControlCreateInfoEXT & operator=( PipelineViewportDepthClipControlCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineViewportDepthClipControlCreateInfoEXT & operator=( VkPipelineViewportDepthClipControlCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineViewportDepthClipControlCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportDepthClipControlCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportDepthClipControlCreateInfoEXT &\n      setNegativeOneToOne( VULKAN_HPP_NAMESPACE::Bool32 negativeOneToOne_ ) VULKAN_HPP_NOEXCEPT\n    {\n      negativeOneToOne = negativeOneToOne_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineViewportDepthClipControlCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineViewportDepthClipControlCreateInfoEXT *>( this );\n    }\n\n    operator VkPipelineViewportDepthClipControlCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineViewportDepthClipControlCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, negativeOneToOne );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineViewportDepthClipControlCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( PipelineViewportDepthClipControlCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( negativeOneToOne == rhs.negativeOneToOne );\n#  endif\n    }\n\n    bool operator!=( PipelineViewportDepthClipControlCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType            = StructureType::ePipelineViewportDepthClipControlCreateInfoEXT;\n    const void *                        pNext            = {};\n    VULKAN_HPP_NAMESPACE::Bool32        negativeOneToOne = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineViewportDepthClipControlCreateInfoEXT>\n  {\n    using Type = PipelineViewportDepthClipControlCreateInfoEXT;\n  };\n\n  struct PipelineViewportExclusiveScissorStateCreateInfoNV\n  {\n    using NativeType = VkPipelineViewportExclusiveScissorStateCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineViewportExclusiveScissorStateCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineViewportExclusiveScissorStateCreateInfoNV( uint32_t                             exclusiveScissorCount_ = {},\n                                                                            const VULKAN_HPP_NAMESPACE::Rect2D * pExclusiveScissors_    = {},\n                                                                            const void *                         pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , exclusiveScissorCount{ exclusiveScissorCount_ }\n      , pExclusiveScissors{ pExclusiveScissors_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PipelineViewportExclusiveScissorStateCreateInfoNV( PipelineViewportExclusiveScissorStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineViewportExclusiveScissorStateCreateInfoNV( VkPipelineViewportExclusiveScissorStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineViewportExclusiveScissorStateCreateInfoNV( *reinterpret_cast<PipelineViewportExclusiveScissorStateCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineViewportExclusiveScissorStateCreateInfoNV(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Rect2D> const & exclusiveScissors_, const void * pNext_ = nullptr )\n      : pNext( pNext_ ), exclusiveScissorCount( static_cast<uint32_t>( exclusiveScissors_.size() ) ), pExclusiveScissors( exclusiveScissors_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PipelineViewportExclusiveScissorStateCreateInfoNV &\n      operator=( PipelineViewportExclusiveScissorStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineViewportExclusiveScissorStateCreateInfoNV & operator=( VkPipelineViewportExclusiveScissorStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineViewportExclusiveScissorStateCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportExclusiveScissorStateCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportExclusiveScissorStateCreateInfoNV & setExclusiveScissorCount( uint32_t exclusiveScissorCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      exclusiveScissorCount = exclusiveScissorCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportExclusiveScissorStateCreateInfoNV &\n      setPExclusiveScissors( const VULKAN_HPP_NAMESPACE::Rect2D * pExclusiveScissors_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pExclusiveScissors = pExclusiveScissors_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineViewportExclusiveScissorStateCreateInfoNV &\n      setExclusiveScissors( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Rect2D> const & exclusiveScissors_ ) VULKAN_HPP_NOEXCEPT\n    {\n      exclusiveScissorCount = static_cast<uint32_t>( exclusiveScissors_.size() );\n      pExclusiveScissors    = exclusiveScissors_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineViewportExclusiveScissorStateCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineViewportExclusiveScissorStateCreateInfoNV *>( this );\n    }\n\n    operator VkPipelineViewportExclusiveScissorStateCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineViewportExclusiveScissorStateCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::Rect2D * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, exclusiveScissorCount, pExclusiveScissors );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineViewportExclusiveScissorStateCreateInfoNV const & ) const = default;\n#else\n    bool operator==( PipelineViewportExclusiveScissorStateCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( exclusiveScissorCount == rhs.exclusiveScissorCount ) &&\n             ( pExclusiveScissors == rhs.pExclusiveScissors );\n#  endif\n    }\n\n    bool operator!=( PipelineViewportExclusiveScissorStateCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType  sType                 = StructureType::ePipelineViewportExclusiveScissorStateCreateInfoNV;\n    const void *                         pNext                 = {};\n    uint32_t                             exclusiveScissorCount = {};\n    const VULKAN_HPP_NAMESPACE::Rect2D * pExclusiveScissors    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineViewportExclusiveScissorStateCreateInfoNV>\n  {\n    using Type = PipelineViewportExclusiveScissorStateCreateInfoNV;\n  };\n\n  struct ShadingRatePaletteNV\n  {\n    using NativeType = VkShadingRatePaletteNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ShadingRatePaletteNV( uint32_t                                                shadingRatePaletteEntryCount_ = {},\n                                               const VULKAN_HPP_NAMESPACE::ShadingRatePaletteEntryNV * pShadingRatePaletteEntries_   = {} ) VULKAN_HPP_NOEXCEPT\n      : shadingRatePaletteEntryCount{ shadingRatePaletteEntryCount_ }\n      , pShadingRatePaletteEntries{ pShadingRatePaletteEntries_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ShadingRatePaletteNV( ShadingRatePaletteNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ShadingRatePaletteNV( VkShadingRatePaletteNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ShadingRatePaletteNV( *reinterpret_cast<ShadingRatePaletteNV const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ShadingRatePaletteNV(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ShadingRatePaletteEntryNV> const & shadingRatePaletteEntries_ )\n      : shadingRatePaletteEntryCount( static_cast<uint32_t>( shadingRatePaletteEntries_.size() ) )\n      , pShadingRatePaletteEntries( shadingRatePaletteEntries_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    ShadingRatePaletteNV & operator=( ShadingRatePaletteNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ShadingRatePaletteNV & operator=( VkShadingRatePaletteNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ShadingRatePaletteNV & setShadingRatePaletteEntryCount( uint32_t shadingRatePaletteEntryCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shadingRatePaletteEntryCount = shadingRatePaletteEntryCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ShadingRatePaletteNV &\n      setPShadingRatePaletteEntries( const VULKAN_HPP_NAMESPACE::ShadingRatePaletteEntryNV * pShadingRatePaletteEntries_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pShadingRatePaletteEntries = pShadingRatePaletteEntries_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ShadingRatePaletteNV & setShadingRatePaletteEntries(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ShadingRatePaletteEntryNV> const & shadingRatePaletteEntries_ )\n      VULKAN_HPP_NOEXCEPT\n    {\n      shadingRatePaletteEntryCount = static_cast<uint32_t>( shadingRatePaletteEntries_.size() );\n      pShadingRatePaletteEntries   = shadingRatePaletteEntries_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkShadingRatePaletteNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkShadingRatePaletteNV *>( this );\n    }\n\n    operator VkShadingRatePaletteNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkShadingRatePaletteNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, const VULKAN_HPP_NAMESPACE::ShadingRatePaletteEntryNV * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( shadingRatePaletteEntryCount, pShadingRatePaletteEntries );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ShadingRatePaletteNV const & ) const = default;\n#else\n    bool operator==( ShadingRatePaletteNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( shadingRatePaletteEntryCount == rhs.shadingRatePaletteEntryCount ) && ( pShadingRatePaletteEntries == rhs.pShadingRatePaletteEntries );\n#  endif\n    }\n\n    bool operator!=( ShadingRatePaletteNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                                                shadingRatePaletteEntryCount = {};\n    const VULKAN_HPP_NAMESPACE::ShadingRatePaletteEntryNV * pShadingRatePaletteEntries   = {};\n  };\n\n  struct PipelineViewportShadingRateImageStateCreateInfoNV\n  {\n    using NativeType = VkPipelineViewportShadingRateImageStateCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineViewportShadingRateImageStateCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineViewportShadingRateImageStateCreateInfoNV( VULKAN_HPP_NAMESPACE::Bool32                       shadingRateImageEnable_ = {},\n                                                                            uint32_t                                           viewportCount_          = {},\n                                                                            const VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV * pShadingRatePalettes_   = {},\n                                                                            const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , shadingRateImageEnable{ shadingRateImageEnable_ }\n      , viewportCount{ viewportCount_ }\n      , pShadingRatePalettes{ pShadingRatePalettes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      PipelineViewportShadingRateImageStateCreateInfoNV( PipelineViewportShadingRateImageStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineViewportShadingRateImageStateCreateInfoNV( VkPipelineViewportShadingRateImageStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineViewportShadingRateImageStateCreateInfoNV( *reinterpret_cast<PipelineViewportShadingRateImageStateCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineViewportShadingRateImageStateCreateInfoNV(\n      VULKAN_HPP_NAMESPACE::Bool32                                                                            shadingRateImageEnable_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV> const & shadingRatePalettes_,\n      const void *                                                                                            pNext_ = nullptr )\n      : pNext( pNext_ )\n      , shadingRateImageEnable( shadingRateImageEnable_ )\n      , viewportCount( static_cast<uint32_t>( shadingRatePalettes_.size() ) )\n      , pShadingRatePalettes( shadingRatePalettes_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PipelineViewportShadingRateImageStateCreateInfoNV &\n      operator=( PipelineViewportShadingRateImageStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineViewportShadingRateImageStateCreateInfoNV & operator=( VkPipelineViewportShadingRateImageStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineViewportShadingRateImageStateCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportShadingRateImageStateCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportShadingRateImageStateCreateInfoNV &\n      setShadingRateImageEnable( VULKAN_HPP_NAMESPACE::Bool32 shadingRateImageEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shadingRateImageEnable = shadingRateImageEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportShadingRateImageStateCreateInfoNV & setViewportCount( uint32_t viewportCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      viewportCount = viewportCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportShadingRateImageStateCreateInfoNV &\n      setPShadingRatePalettes( const VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV * pShadingRatePalettes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pShadingRatePalettes = pShadingRatePalettes_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineViewportShadingRateImageStateCreateInfoNV & setShadingRatePalettes(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV> const & shadingRatePalettes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      viewportCount        = static_cast<uint32_t>( shadingRatePalettes_.size() );\n      pShadingRatePalettes = shadingRatePalettes_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineViewportShadingRateImageStateCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineViewportShadingRateImageStateCreateInfoNV *>( this );\n    }\n\n    operator VkPipelineViewportShadingRateImageStateCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineViewportShadingRateImageStateCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, shadingRateImageEnable, viewportCount, pShadingRatePalettes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineViewportShadingRateImageStateCreateInfoNV const & ) const = default;\n#else\n    bool operator==( PipelineViewportShadingRateImageStateCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( shadingRateImageEnable == rhs.shadingRateImageEnable ) &&\n             ( viewportCount == rhs.viewportCount ) && ( pShadingRatePalettes == rhs.pShadingRatePalettes );\n#  endif\n    }\n\n    bool operator!=( PipelineViewportShadingRateImageStateCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                sType                  = StructureType::ePipelineViewportShadingRateImageStateCreateInfoNV;\n    const void *                                       pNext                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32                       shadingRateImageEnable = {};\n    uint32_t                                           viewportCount          = {};\n    const VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV * pShadingRatePalettes   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineViewportShadingRateImageStateCreateInfoNV>\n  {\n    using Type = PipelineViewportShadingRateImageStateCreateInfoNV;\n  };\n\n  struct ViewportSwizzleNV\n  {\n    using NativeType = VkViewportSwizzleNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ViewportSwizzleNV(\n      VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV x_ = VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV::ePositiveX,\n      VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV y_ = VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV::ePositiveX,\n      VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV z_ = VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV::ePositiveX,\n      VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV w_ = VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV::ePositiveX ) VULKAN_HPP_NOEXCEPT\n      : x{ x_ }\n      , y{ y_ }\n      , z{ z_ }\n      , w{ w_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ViewportSwizzleNV( ViewportSwizzleNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ViewportSwizzleNV( VkViewportSwizzleNV const & rhs ) VULKAN_HPP_NOEXCEPT : ViewportSwizzleNV( *reinterpret_cast<ViewportSwizzleNV const *>( &rhs ) ) {}\n\n    ViewportSwizzleNV & operator=( ViewportSwizzleNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ViewportSwizzleNV & operator=( VkViewportSwizzleNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ViewportSwizzleNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ViewportSwizzleNV & setX( VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV x_ ) VULKAN_HPP_NOEXCEPT\n    {\n      x = x_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ViewportSwizzleNV & setY( VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV y_ ) VULKAN_HPP_NOEXCEPT\n    {\n      y = y_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ViewportSwizzleNV & setZ( VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV z_ ) VULKAN_HPP_NOEXCEPT\n    {\n      z = z_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ViewportSwizzleNV & setW( VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV w_ ) VULKAN_HPP_NOEXCEPT\n    {\n      w = w_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkViewportSwizzleNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkViewportSwizzleNV *>( this );\n    }\n\n    operator VkViewportSwizzleNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkViewportSwizzleNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV const &,\n               VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV const &,\n               VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV const &,\n               VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( x, y, z, w );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ViewportSwizzleNV const & ) const = default;\n#else\n    bool operator==( ViewportSwizzleNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( x == rhs.x ) && ( y == rhs.y ) && ( z == rhs.z ) && ( w == rhs.w );\n#  endif\n    }\n\n    bool operator!=( ViewportSwizzleNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV x = VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV::ePositiveX;\n    VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV y = VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV::ePositiveX;\n    VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV z = VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV::ePositiveX;\n    VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV w = VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV::ePositiveX;\n  };\n\n  struct PipelineViewportSwizzleStateCreateInfoNV\n  {\n    using NativeType = VkPipelineViewportSwizzleStateCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineViewportSwizzleStateCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineViewportSwizzleStateCreateInfoNV( VULKAN_HPP_NAMESPACE::PipelineViewportSwizzleStateCreateFlagsNV flags_             = {},\n                                                                   uint32_t                                                        viewportCount_     = {},\n                                                                   const VULKAN_HPP_NAMESPACE::ViewportSwizzleNV *                 pViewportSwizzles_ = {},\n                                                                   const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , viewportCount{ viewportCount_ }\n      , pViewportSwizzles{ pViewportSwizzles_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineViewportSwizzleStateCreateInfoNV( PipelineViewportSwizzleStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineViewportSwizzleStateCreateInfoNV( VkPipelineViewportSwizzleStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineViewportSwizzleStateCreateInfoNV( *reinterpret_cast<PipelineViewportSwizzleStateCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineViewportSwizzleStateCreateInfoNV(\n      VULKAN_HPP_NAMESPACE::PipelineViewportSwizzleStateCreateFlagsNV                                      flags_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ViewportSwizzleNV> const & viewportSwizzles_,\n      const void *                                                                                         pNext_ = nullptr )\n      : pNext( pNext_ ), flags( flags_ ), viewportCount( static_cast<uint32_t>( viewportSwizzles_.size() ) ), pViewportSwizzles( viewportSwizzles_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PipelineViewportSwizzleStateCreateInfoNV & operator=( PipelineViewportSwizzleStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineViewportSwizzleStateCreateInfoNV & operator=( VkPipelineViewportSwizzleStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineViewportSwizzleStateCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportSwizzleStateCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportSwizzleStateCreateInfoNV &\n      setFlags( VULKAN_HPP_NAMESPACE::PipelineViewportSwizzleStateCreateFlagsNV flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportSwizzleStateCreateInfoNV & setViewportCount( uint32_t viewportCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      viewportCount = viewportCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportSwizzleStateCreateInfoNV &\n      setPViewportSwizzles( const VULKAN_HPP_NAMESPACE::ViewportSwizzleNV * pViewportSwizzles_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pViewportSwizzles = pViewportSwizzles_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineViewportSwizzleStateCreateInfoNV & setViewportSwizzles(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ViewportSwizzleNV> const & viewportSwizzles_ ) VULKAN_HPP_NOEXCEPT\n    {\n      viewportCount     = static_cast<uint32_t>( viewportSwizzles_.size() );\n      pViewportSwizzles = viewportSwizzles_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineViewportSwizzleStateCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineViewportSwizzleStateCreateInfoNV *>( this );\n    }\n\n    operator VkPipelineViewportSwizzleStateCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineViewportSwizzleStateCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineViewportSwizzleStateCreateFlagsNV const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::ViewportSwizzleNV * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, viewportCount, pViewportSwizzles );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineViewportSwizzleStateCreateInfoNV const & ) const = default;\n#else\n    bool operator==( PipelineViewportSwizzleStateCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( viewportCount == rhs.viewportCount ) &&\n             ( pViewportSwizzles == rhs.pViewportSwizzles );\n#  endif\n    }\n\n    bool operator!=( PipelineViewportSwizzleStateCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                             sType             = StructureType::ePipelineViewportSwizzleStateCreateInfoNV;\n    const void *                                                    pNext             = {};\n    VULKAN_HPP_NAMESPACE::PipelineViewportSwizzleStateCreateFlagsNV flags             = {};\n    uint32_t                                                        viewportCount     = {};\n    const VULKAN_HPP_NAMESPACE::ViewportSwizzleNV *                 pViewportSwizzles = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineViewportSwizzleStateCreateInfoNV>\n  {\n    using Type = PipelineViewportSwizzleStateCreateInfoNV;\n  };\n\n  struct ViewportWScalingNV\n  {\n    using NativeType = VkViewportWScalingNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ViewportWScalingNV( float xcoeff_ = {}, float ycoeff_ = {} ) VULKAN_HPP_NOEXCEPT\n      : xcoeff{ xcoeff_ }\n      , ycoeff{ ycoeff_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ViewportWScalingNV( ViewportWScalingNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ViewportWScalingNV( VkViewportWScalingNV const & rhs ) VULKAN_HPP_NOEXCEPT : ViewportWScalingNV( *reinterpret_cast<ViewportWScalingNV const *>( &rhs ) ) {}\n\n    ViewportWScalingNV & operator=( ViewportWScalingNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ViewportWScalingNV & operator=( VkViewportWScalingNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ViewportWScalingNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ViewportWScalingNV & setXcoeff( float xcoeff_ ) VULKAN_HPP_NOEXCEPT\n    {\n      xcoeff = xcoeff_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ViewportWScalingNV & setYcoeff( float ycoeff_ ) VULKAN_HPP_NOEXCEPT\n    {\n      ycoeff = ycoeff_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkViewportWScalingNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkViewportWScalingNV *>( this );\n    }\n\n    operator VkViewportWScalingNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkViewportWScalingNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<float const &, float const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( xcoeff, ycoeff );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ViewportWScalingNV const & ) const = default;\n#else\n    bool operator==( ViewportWScalingNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( xcoeff == rhs.xcoeff ) && ( ycoeff == rhs.ycoeff );\n#  endif\n    }\n\n    bool operator!=( ViewportWScalingNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    float xcoeff = {};\n    float ycoeff = {};\n  };\n\n  struct PipelineViewportWScalingStateCreateInfoNV\n  {\n    using NativeType = VkPipelineViewportWScalingStateCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePipelineViewportWScalingStateCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PipelineViewportWScalingStateCreateInfoNV( VULKAN_HPP_NAMESPACE::Bool32                     viewportWScalingEnable_ = {},\n                                                                    uint32_t                                         viewportCount_          = {},\n                                                                    const VULKAN_HPP_NAMESPACE::ViewportWScalingNV * pViewportWScalings_     = {},\n                                                                    const void *                                     pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , viewportWScalingEnable{ viewportWScalingEnable_ }\n      , viewportCount{ viewportCount_ }\n      , pViewportWScalings{ pViewportWScalings_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PipelineViewportWScalingStateCreateInfoNV( PipelineViewportWScalingStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PipelineViewportWScalingStateCreateInfoNV( VkPipelineViewportWScalingStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PipelineViewportWScalingStateCreateInfoNV( *reinterpret_cast<PipelineViewportWScalingStateCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineViewportWScalingStateCreateInfoNV(\n      VULKAN_HPP_NAMESPACE::Bool32                                                                          viewportWScalingEnable_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ViewportWScalingNV> const & viewportWScalings_,\n      const void *                                                                                          pNext_ = nullptr )\n      : pNext( pNext_ )\n      , viewportWScalingEnable( viewportWScalingEnable_ )\n      , viewportCount( static_cast<uint32_t>( viewportWScalings_.size() ) )\n      , pViewportWScalings( viewportWScalings_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PipelineViewportWScalingStateCreateInfoNV & operator=( PipelineViewportWScalingStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PipelineViewportWScalingStateCreateInfoNV & operator=( VkPipelineViewportWScalingStateCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PipelineViewportWScalingStateCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportWScalingStateCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportWScalingStateCreateInfoNV &\n      setViewportWScalingEnable( VULKAN_HPP_NAMESPACE::Bool32 viewportWScalingEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      viewportWScalingEnable = viewportWScalingEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportWScalingStateCreateInfoNV & setViewportCount( uint32_t viewportCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      viewportCount = viewportCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PipelineViewportWScalingStateCreateInfoNV &\n      setPViewportWScalings( const VULKAN_HPP_NAMESPACE::ViewportWScalingNV * pViewportWScalings_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pViewportWScalings = pViewportWScalings_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PipelineViewportWScalingStateCreateInfoNV & setViewportWScalings(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ViewportWScalingNV> const & viewportWScalings_ ) VULKAN_HPP_NOEXCEPT\n    {\n      viewportCount      = static_cast<uint32_t>( viewportWScalings_.size() );\n      pViewportWScalings = viewportWScalings_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPipelineViewportWScalingStateCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPipelineViewportWScalingStateCreateInfoNV *>( this );\n    }\n\n    operator VkPipelineViewportWScalingStateCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPipelineViewportWScalingStateCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::ViewportWScalingNV * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, viewportWScalingEnable, viewportCount, pViewportWScalings );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PipelineViewportWScalingStateCreateInfoNV const & ) const = default;\n#else\n    bool operator==( PipelineViewportWScalingStateCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( viewportWScalingEnable == rhs.viewportWScalingEnable ) &&\n             ( viewportCount == rhs.viewportCount ) && ( pViewportWScalings == rhs.pViewportWScalings );\n#  endif\n    }\n\n    bool operator!=( PipelineViewportWScalingStateCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType              sType                  = StructureType::ePipelineViewportWScalingStateCreateInfoNV;\n    const void *                                     pNext                  = {};\n    VULKAN_HPP_NAMESPACE::Bool32                     viewportWScalingEnable = {};\n    uint32_t                                         viewportCount          = {};\n    const VULKAN_HPP_NAMESPACE::ViewportWScalingNV * pViewportWScalings     = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePipelineViewportWScalingStateCreateInfoNV>\n  {\n    using Type = PipelineViewportWScalingStateCreateInfoNV;\n  };\n\n#if defined( VK_USE_PLATFORM_GGP )\n  struct PresentFrameTokenGGP\n  {\n    using NativeType = VkPresentFrameTokenGGP;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePresentFrameTokenGGP;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PresentFrameTokenGGP( GgpFrameToken frameToken_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , frameToken{ frameToken_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PresentFrameTokenGGP( PresentFrameTokenGGP const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PresentFrameTokenGGP( VkPresentFrameTokenGGP const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PresentFrameTokenGGP( *reinterpret_cast<PresentFrameTokenGGP const *>( &rhs ) )\n    {\n    }\n\n    PresentFrameTokenGGP & operator=( PresentFrameTokenGGP const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PresentFrameTokenGGP & operator=( VkPresentFrameTokenGGP const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PresentFrameTokenGGP const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PresentFrameTokenGGP & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PresentFrameTokenGGP & setFrameToken( GgpFrameToken frameToken_ ) VULKAN_HPP_NOEXCEPT\n    {\n      frameToken = frameToken_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPresentFrameTokenGGP const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPresentFrameTokenGGP *>( this );\n    }\n\n    operator VkPresentFrameTokenGGP &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPresentFrameTokenGGP *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, GgpFrameToken const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, frameToken );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( PresentFrameTokenGGP const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = memcmp( &frameToken, &rhs.frameToken, sizeof( GgpFrameToken ) ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#  endif\n\n    bool operator==( PresentFrameTokenGGP const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memcmp( &frameToken, &rhs.frameToken, sizeof( GgpFrameToken ) ) == 0 );\n    }\n\n    bool operator!=( PresentFrameTokenGGP const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType      = StructureType::ePresentFrameTokenGGP;\n    const void *                        pNext      = {};\n    GgpFrameToken                       frameToken = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePresentFrameTokenGGP>\n  {\n    using Type = PresentFrameTokenGGP;\n  };\n#endif /*VK_USE_PLATFORM_GGP*/\n\n  struct PresentIdKHR\n  {\n    using NativeType = VkPresentIdKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePresentIdKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PresentIdKHR( uint32_t swapchainCount_ = {}, const uint64_t * pPresentIds_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , swapchainCount{ swapchainCount_ }\n      , pPresentIds{ pPresentIds_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PresentIdKHR( PresentIdKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PresentIdKHR( VkPresentIdKHR const & rhs ) VULKAN_HPP_NOEXCEPT : PresentIdKHR( *reinterpret_cast<PresentIdKHR const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PresentIdKHR( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & presentIds_, const void * pNext_ = nullptr )\n      : pNext( pNext_ ), swapchainCount( static_cast<uint32_t>( presentIds_.size() ) ), pPresentIds( presentIds_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PresentIdKHR & operator=( PresentIdKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PresentIdKHR & operator=( VkPresentIdKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PresentIdKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PresentIdKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PresentIdKHR & setSwapchainCount( uint32_t swapchainCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      swapchainCount = swapchainCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PresentIdKHR & setPPresentIds( const uint64_t * pPresentIds_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPresentIds = pPresentIds_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PresentIdKHR & setPresentIds( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & presentIds_ ) VULKAN_HPP_NOEXCEPT\n    {\n      swapchainCount = static_cast<uint32_t>( presentIds_.size() );\n      pPresentIds    = presentIds_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPresentIdKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPresentIdKHR *>( this );\n    }\n\n    operator VkPresentIdKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPresentIdKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const uint64_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, swapchainCount, pPresentIds );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PresentIdKHR const & ) const = default;\n#else\n    bool operator==( PresentIdKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( swapchainCount == rhs.swapchainCount ) && ( pPresentIds == rhs.pPresentIds );\n#  endif\n    }\n\n    bool operator!=( PresentIdKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::ePresentIdKHR;\n    const void *                        pNext          = {};\n    uint32_t                            swapchainCount = {};\n    const uint64_t *                    pPresentIds    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePresentIdKHR>\n  {\n    using Type = PresentIdKHR;\n  };\n\n  struct PresentInfoKHR\n  {\n    using NativeType = VkPresentInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePresentInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PresentInfoKHR( uint32_t                                   waitSemaphoreCount_ = {},\n                                         const VULKAN_HPP_NAMESPACE::Semaphore *    pWaitSemaphores_    = {},\n                                         uint32_t                                   swapchainCount_     = {},\n                                         const VULKAN_HPP_NAMESPACE::SwapchainKHR * pSwapchains_        = {},\n                                         const uint32_t *                           pImageIndices_      = {},\n                                         VULKAN_HPP_NAMESPACE::Result *             pResults_           = {},\n                                         const void *                               pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , waitSemaphoreCount{ waitSemaphoreCount_ }\n      , pWaitSemaphores{ pWaitSemaphores_ }\n      , swapchainCount{ swapchainCount_ }\n      , pSwapchains{ pSwapchains_ }\n      , pImageIndices{ pImageIndices_ }\n      , pResults{ pResults_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PresentInfoKHR( PresentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PresentInfoKHR( VkPresentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT : PresentInfoKHR( *reinterpret_cast<PresentInfoKHR const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PresentInfoKHR( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Semaphore> const &    waitSemaphores_,\n                    VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SwapchainKHR> const & swapchains_   = {},\n                    VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const &                           imageIndices_ = {},\n                    VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<VULKAN_HPP_NAMESPACE::Result> const &             results_      = {},\n                    const void *                                                                                    pNext_        = nullptr )\n      : pNext( pNext_ )\n      , waitSemaphoreCount( static_cast<uint32_t>( waitSemaphores_.size() ) )\n      , pWaitSemaphores( waitSemaphores_.data() )\n      , swapchainCount( static_cast<uint32_t>( swapchains_.size() ) )\n      , pSwapchains( swapchains_.data() )\n      , pImageIndices( imageIndices_.data() )\n      , pResults( results_.data() )\n    {\n#    ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( swapchains_.size() == imageIndices_.size() );\n      VULKAN_HPP_ASSERT( results_.empty() || ( swapchains_.size() == results_.size() ) );\n      VULKAN_HPP_ASSERT( results_.empty() || ( imageIndices_.size() == results_.size() ) );\n#    else\n      if ( swapchains_.size() != imageIndices_.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::PresentInfoKHR::PresentInfoKHR: swapchains_.size() != imageIndices_.size()\" );\n      }\n      if ( !results_.empty() && ( swapchains_.size() != results_.size() ) )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::PresentInfoKHR::PresentInfoKHR: !results_.empty() && ( swapchains_.size() != results_.size() )\" );\n      }\n      if ( !results_.empty() && ( imageIndices_.size() != results_.size() ) )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::PresentInfoKHR::PresentInfoKHR: !results_.empty() && ( imageIndices_.size() != results_.size() )\" );\n      }\n#    endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PresentInfoKHR & operator=( PresentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PresentInfoKHR & operator=( VkPresentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PresentInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PresentInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PresentInfoKHR & setWaitSemaphoreCount( uint32_t waitSemaphoreCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      waitSemaphoreCount = waitSemaphoreCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PresentInfoKHR & setPWaitSemaphores( const VULKAN_HPP_NAMESPACE::Semaphore * pWaitSemaphores_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pWaitSemaphores = pWaitSemaphores_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PresentInfoKHR &\n      setWaitSemaphores( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Semaphore> const & waitSemaphores_ ) VULKAN_HPP_NOEXCEPT\n    {\n      waitSemaphoreCount = static_cast<uint32_t>( waitSemaphores_.size() );\n      pWaitSemaphores    = waitSemaphores_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 PresentInfoKHR & setSwapchainCount( uint32_t swapchainCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      swapchainCount = swapchainCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PresentInfoKHR & setPSwapchains( const VULKAN_HPP_NAMESPACE::SwapchainKHR * pSwapchains_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSwapchains = pSwapchains_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PresentInfoKHR &\n      setSwapchains( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SwapchainKHR> const & swapchains_ ) VULKAN_HPP_NOEXCEPT\n    {\n      swapchainCount = static_cast<uint32_t>( swapchains_.size() );\n      pSwapchains    = swapchains_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 PresentInfoKHR & setPImageIndices( const uint32_t * pImageIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pImageIndices = pImageIndices_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PresentInfoKHR & setImageIndices( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & imageIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      swapchainCount = static_cast<uint32_t>( imageIndices_.size() );\n      pImageIndices  = imageIndices_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 PresentInfoKHR & setPResults( VULKAN_HPP_NAMESPACE::Result * pResults_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pResults = pResults_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PresentInfoKHR & setResults( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<VULKAN_HPP_NAMESPACE::Result> const & results_ ) VULKAN_HPP_NOEXCEPT\n    {\n      swapchainCount = static_cast<uint32_t>( results_.size() );\n      pResults       = results_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPresentInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPresentInfoKHR *>( this );\n    }\n\n    operator VkPresentInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPresentInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::Semaphore * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::SwapchainKHR * const &,\n               const uint32_t * const &,\n               VULKAN_HPP_NAMESPACE::Result * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, waitSemaphoreCount, pWaitSemaphores, swapchainCount, pSwapchains, pImageIndices, pResults );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PresentInfoKHR const & ) const = default;\n#else\n    bool operator==( PresentInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( waitSemaphoreCount == rhs.waitSemaphoreCount ) &&\n             ( pWaitSemaphores == rhs.pWaitSemaphores ) && ( swapchainCount == rhs.swapchainCount ) && ( pSwapchains == rhs.pSwapchains ) &&\n             ( pImageIndices == rhs.pImageIndices ) && ( pResults == rhs.pResults );\n#  endif\n    }\n\n    bool operator!=( PresentInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType        sType              = StructureType::ePresentInfoKHR;\n    const void *                               pNext              = {};\n    uint32_t                                   waitSemaphoreCount = {};\n    const VULKAN_HPP_NAMESPACE::Semaphore *    pWaitSemaphores    = {};\n    uint32_t                                   swapchainCount     = {};\n    const VULKAN_HPP_NAMESPACE::SwapchainKHR * pSwapchains        = {};\n    const uint32_t *                           pImageIndices      = {};\n    VULKAN_HPP_NAMESPACE::Result *             pResults           = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePresentInfoKHR>\n  {\n    using Type = PresentInfoKHR;\n  };\n\n  struct RectLayerKHR\n  {\n    using NativeType = VkRectLayerKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      RectLayerKHR( VULKAN_HPP_NAMESPACE::Offset2D offset_ = {}, VULKAN_HPP_NAMESPACE::Extent2D extent_ = {}, uint32_t layer_ = {} ) VULKAN_HPP_NOEXCEPT\n      : offset{ offset_ }\n      , extent{ extent_ }\n      , layer{ layer_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RectLayerKHR( RectLayerKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RectLayerKHR( VkRectLayerKHR const & rhs ) VULKAN_HPP_NOEXCEPT : RectLayerKHR( *reinterpret_cast<RectLayerKHR const *>( &rhs ) ) {}\n\n    explicit RectLayerKHR( Rect2D const & rect2D, uint32_t layer_ = {} ) : offset( rect2D.offset ), extent( rect2D.extent ), layer( layer_ ) {}\n\n    RectLayerKHR & operator=( RectLayerKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RectLayerKHR & operator=( VkRectLayerKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RectLayerKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RectLayerKHR & setOffset( VULKAN_HPP_NAMESPACE::Offset2D const & offset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      offset = offset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RectLayerKHR & setExtent( VULKAN_HPP_NAMESPACE::Extent2D const & extent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      extent = extent_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RectLayerKHR & setLayer( uint32_t layer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layer = layer_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRectLayerKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRectLayerKHR *>( this );\n    }\n\n    operator VkRectLayerKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRectLayerKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::Offset2D const &, VULKAN_HPP_NAMESPACE::Extent2D const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( offset, extent, layer );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RectLayerKHR const & ) const = default;\n#else\n    bool operator==( RectLayerKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( offset == rhs.offset ) && ( extent == rhs.extent ) && ( layer == rhs.layer );\n#  endif\n    }\n\n    bool operator!=( RectLayerKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::Offset2D offset = {};\n    VULKAN_HPP_NAMESPACE::Extent2D extent = {};\n    uint32_t                       layer  = {};\n  };\n\n  struct PresentRegionKHR\n  {\n    using NativeType = VkPresentRegionKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PresentRegionKHR( uint32_t rectangleCount_ = {}, const VULKAN_HPP_NAMESPACE::RectLayerKHR * pRectangles_ = {} ) VULKAN_HPP_NOEXCEPT\n      : rectangleCount{ rectangleCount_ }\n      , pRectangles{ pRectangles_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PresentRegionKHR( PresentRegionKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PresentRegionKHR( VkPresentRegionKHR const & rhs ) VULKAN_HPP_NOEXCEPT : PresentRegionKHR( *reinterpret_cast<PresentRegionKHR const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PresentRegionKHR( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::RectLayerKHR> const & rectangles_ )\n      : rectangleCount( static_cast<uint32_t>( rectangles_.size() ) ), pRectangles( rectangles_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PresentRegionKHR & operator=( PresentRegionKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PresentRegionKHR & operator=( VkPresentRegionKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PresentRegionKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PresentRegionKHR & setRectangleCount( uint32_t rectangleCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rectangleCount = rectangleCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PresentRegionKHR & setPRectangles( const VULKAN_HPP_NAMESPACE::RectLayerKHR * pRectangles_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pRectangles = pRectangles_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PresentRegionKHR &\n      setRectangles( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::RectLayerKHR> const & rectangles_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rectangleCount = static_cast<uint32_t>( rectangles_.size() );\n      pRectangles    = rectangles_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPresentRegionKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPresentRegionKHR *>( this );\n    }\n\n    operator VkPresentRegionKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPresentRegionKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, const VULKAN_HPP_NAMESPACE::RectLayerKHR * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( rectangleCount, pRectangles );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PresentRegionKHR const & ) const = default;\n#else\n    bool operator==( PresentRegionKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( rectangleCount == rhs.rectangleCount ) && ( pRectangles == rhs.pRectangles );\n#  endif\n    }\n\n    bool operator!=( PresentRegionKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                                   rectangleCount = {};\n    const VULKAN_HPP_NAMESPACE::RectLayerKHR * pRectangles    = {};\n  };\n\n  struct PresentRegionsKHR\n  {\n    using NativeType = VkPresentRegionsKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePresentRegionsKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PresentRegionsKHR( uint32_t                                       swapchainCount_ = {},\n                                            const VULKAN_HPP_NAMESPACE::PresentRegionKHR * pRegions_       = {},\n                                            const void *                                   pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , swapchainCount{ swapchainCount_ }\n      , pRegions{ pRegions_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PresentRegionsKHR( PresentRegionsKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PresentRegionsKHR( VkPresentRegionsKHR const & rhs ) VULKAN_HPP_NOEXCEPT : PresentRegionsKHR( *reinterpret_cast<PresentRegionsKHR const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PresentRegionsKHR( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PresentRegionKHR> const & regions_,\n                       const void *                                                                                        pNext_ = nullptr )\n      : pNext( pNext_ ), swapchainCount( static_cast<uint32_t>( regions_.size() ) ), pRegions( regions_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PresentRegionsKHR & operator=( PresentRegionsKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PresentRegionsKHR & operator=( VkPresentRegionsKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PresentRegionsKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PresentRegionsKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PresentRegionsKHR & setSwapchainCount( uint32_t swapchainCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      swapchainCount = swapchainCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PresentRegionsKHR & setPRegions( const VULKAN_HPP_NAMESPACE::PresentRegionKHR * pRegions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pRegions = pRegions_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PresentRegionsKHR &\n      setRegions( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PresentRegionKHR> const & regions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      swapchainCount = static_cast<uint32_t>( regions_.size() );\n      pRegions       = regions_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPresentRegionsKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPresentRegionsKHR *>( this );\n    }\n\n    operator VkPresentRegionsKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPresentRegionsKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::PresentRegionKHR * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, swapchainCount, pRegions );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PresentRegionsKHR const & ) const = default;\n#else\n    bool operator==( PresentRegionsKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( swapchainCount == rhs.swapchainCount ) && ( pRegions == rhs.pRegions );\n#  endif\n    }\n\n    bool operator!=( PresentRegionsKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType            sType          = StructureType::ePresentRegionsKHR;\n    const void *                                   pNext          = {};\n    uint32_t                                       swapchainCount = {};\n    const VULKAN_HPP_NAMESPACE::PresentRegionKHR * pRegions       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePresentRegionsKHR>\n  {\n    using Type = PresentRegionsKHR;\n  };\n\n  struct PresentTimeGOOGLE\n  {\n    using NativeType = VkPresentTimeGOOGLE;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PresentTimeGOOGLE( uint32_t presentID_ = {}, uint64_t desiredPresentTime_ = {} ) VULKAN_HPP_NOEXCEPT\n      : presentID{ presentID_ }\n      , desiredPresentTime{ desiredPresentTime_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PresentTimeGOOGLE( PresentTimeGOOGLE const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PresentTimeGOOGLE( VkPresentTimeGOOGLE const & rhs ) VULKAN_HPP_NOEXCEPT : PresentTimeGOOGLE( *reinterpret_cast<PresentTimeGOOGLE const *>( &rhs ) ) {}\n\n    PresentTimeGOOGLE & operator=( PresentTimeGOOGLE const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PresentTimeGOOGLE & operator=( VkPresentTimeGOOGLE const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PresentTimeGOOGLE const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PresentTimeGOOGLE & setPresentID( uint32_t presentID_ ) VULKAN_HPP_NOEXCEPT\n    {\n      presentID = presentID_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PresentTimeGOOGLE & setDesiredPresentTime( uint64_t desiredPresentTime_ ) VULKAN_HPP_NOEXCEPT\n    {\n      desiredPresentTime = desiredPresentTime_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPresentTimeGOOGLE const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPresentTimeGOOGLE *>( this );\n    }\n\n    operator VkPresentTimeGOOGLE &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPresentTimeGOOGLE *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( presentID, desiredPresentTime );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PresentTimeGOOGLE const & ) const = default;\n#else\n    bool operator==( PresentTimeGOOGLE const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( presentID == rhs.presentID ) && ( desiredPresentTime == rhs.desiredPresentTime );\n#  endif\n    }\n\n    bool operator!=( PresentTimeGOOGLE const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t presentID          = {};\n    uint64_t desiredPresentTime = {};\n  };\n\n  struct PresentTimesInfoGOOGLE\n  {\n    using NativeType = VkPresentTimesInfoGOOGLE;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePresentTimesInfoGOOGLE;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PresentTimesInfoGOOGLE( uint32_t                                        swapchainCount_ = {},\n                                                 const VULKAN_HPP_NAMESPACE::PresentTimeGOOGLE * pTimes_         = {},\n                                                 const void *                                    pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , swapchainCount{ swapchainCount_ }\n      , pTimes{ pTimes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PresentTimesInfoGOOGLE( PresentTimesInfoGOOGLE const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PresentTimesInfoGOOGLE( VkPresentTimesInfoGOOGLE const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PresentTimesInfoGOOGLE( *reinterpret_cast<PresentTimesInfoGOOGLE const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PresentTimesInfoGOOGLE( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PresentTimeGOOGLE> const & times_,\n                            const void *                                                                                         pNext_ = nullptr )\n      : pNext( pNext_ ), swapchainCount( static_cast<uint32_t>( times_.size() ) ), pTimes( times_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PresentTimesInfoGOOGLE & operator=( PresentTimesInfoGOOGLE const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PresentTimesInfoGOOGLE & operator=( VkPresentTimesInfoGOOGLE const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PresentTimesInfoGOOGLE const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PresentTimesInfoGOOGLE & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PresentTimesInfoGOOGLE & setSwapchainCount( uint32_t swapchainCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      swapchainCount = swapchainCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PresentTimesInfoGOOGLE & setPTimes( const VULKAN_HPP_NAMESPACE::PresentTimeGOOGLE * pTimes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pTimes = pTimes_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PresentTimesInfoGOOGLE &\n      setTimes( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PresentTimeGOOGLE> const & times_ ) VULKAN_HPP_NOEXCEPT\n    {\n      swapchainCount = static_cast<uint32_t>( times_.size() );\n      pTimes         = times_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPresentTimesInfoGOOGLE const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPresentTimesInfoGOOGLE *>( this );\n    }\n\n    operator VkPresentTimesInfoGOOGLE &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPresentTimesInfoGOOGLE *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::PresentTimeGOOGLE * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, swapchainCount, pTimes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PresentTimesInfoGOOGLE const & ) const = default;\n#else\n    bool operator==( PresentTimesInfoGOOGLE const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( swapchainCount == rhs.swapchainCount ) && ( pTimes == rhs.pTimes );\n#  endif\n    }\n\n    bool operator!=( PresentTimesInfoGOOGLE const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType             sType          = StructureType::ePresentTimesInfoGOOGLE;\n    const void *                                    pNext          = {};\n    uint32_t                                        swapchainCount = {};\n    const VULKAN_HPP_NAMESPACE::PresentTimeGOOGLE * pTimes         = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePresentTimesInfoGOOGLE>\n  {\n    using Type = PresentTimesInfoGOOGLE;\n  };\n\n  struct PrivateDataSlotCreateInfo\n  {\n    using NativeType = VkPrivateDataSlotCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePrivateDataSlotCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PrivateDataSlotCreateInfo( VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateFlags flags_ = {},\n                                                    const void *                                     pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PrivateDataSlotCreateInfo( PrivateDataSlotCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PrivateDataSlotCreateInfo( VkPrivateDataSlotCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PrivateDataSlotCreateInfo( *reinterpret_cast<PrivateDataSlotCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    PrivateDataSlotCreateInfo & operator=( PrivateDataSlotCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PrivateDataSlotCreateInfo & operator=( VkPrivateDataSlotCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PrivateDataSlotCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PrivateDataSlotCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPrivateDataSlotCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPrivateDataSlotCreateInfo *>( this );\n    }\n\n    operator VkPrivateDataSlotCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPrivateDataSlotCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PrivateDataSlotCreateInfo const & ) const = default;\n#else\n    bool operator==( PrivateDataSlotCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags );\n#  endif\n    }\n\n    bool operator!=( PrivateDataSlotCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType              sType = StructureType::ePrivateDataSlotCreateInfo;\n    const void *                                     pNext = {};\n    VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateFlags flags = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePrivateDataSlotCreateInfo>\n  {\n    using Type = PrivateDataSlotCreateInfo;\n  };\n\n  using PrivateDataSlotCreateInfoEXT = PrivateDataSlotCreateInfo;\n\n  struct ProtectedSubmitInfo\n  {\n    using NativeType = VkProtectedSubmitInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eProtectedSubmitInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ProtectedSubmitInfo( VULKAN_HPP_NAMESPACE::Bool32 protectedSubmit_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , protectedSubmit{ protectedSubmit_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ProtectedSubmitInfo( ProtectedSubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ProtectedSubmitInfo( VkProtectedSubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT : ProtectedSubmitInfo( *reinterpret_cast<ProtectedSubmitInfo const *>( &rhs ) )\n    {\n    }\n\n    ProtectedSubmitInfo & operator=( ProtectedSubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ProtectedSubmitInfo & operator=( VkProtectedSubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ProtectedSubmitInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ProtectedSubmitInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ProtectedSubmitInfo & setProtectedSubmit( VULKAN_HPP_NAMESPACE::Bool32 protectedSubmit_ ) VULKAN_HPP_NOEXCEPT\n    {\n      protectedSubmit = protectedSubmit_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkProtectedSubmitInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkProtectedSubmitInfo *>( this );\n    }\n\n    operator VkProtectedSubmitInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkProtectedSubmitInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, protectedSubmit );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ProtectedSubmitInfo const & ) const = default;\n#else\n    bool operator==( ProtectedSubmitInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( protectedSubmit == rhs.protectedSubmit );\n#  endif\n    }\n\n    bool operator!=( ProtectedSubmitInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType           = StructureType::eProtectedSubmitInfo;\n    const void *                        pNext           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        protectedSubmit = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eProtectedSubmitInfo>\n  {\n    using Type = ProtectedSubmitInfo;\n  };\n\n  struct PushConstantsInfo\n  {\n    using NativeType = VkPushConstantsInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePushConstantsInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PushConstantsInfo( VULKAN_HPP_NAMESPACE::PipelineLayout   layout_     = {},\n                                            VULKAN_HPP_NAMESPACE::ShaderStageFlags stageFlags_ = {},\n                                            uint32_t                               offset_     = {},\n                                            uint32_t                               size_       = {},\n                                            const void *                           pValues_    = {},\n                                            const void *                           pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , layout{ layout_ }\n      , stageFlags{ stageFlags_ }\n      , offset{ offset_ }\n      , size{ size_ }\n      , pValues{ pValues_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PushConstantsInfo( PushConstantsInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PushConstantsInfo( VkPushConstantsInfo const & rhs ) VULKAN_HPP_NOEXCEPT : PushConstantsInfo( *reinterpret_cast<PushConstantsInfo const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    PushConstantsInfo( VULKAN_HPP_NAMESPACE::PipelineLayout                           layout_,\n                       VULKAN_HPP_NAMESPACE::ShaderStageFlags                         stageFlags_,\n                       uint32_t                                                       offset_,\n                       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & values_,\n                       const void *                                                   pNext_ = nullptr )\n      : pNext( pNext_ )\n      , layout( layout_ )\n      , stageFlags( stageFlags_ )\n      , offset( offset_ )\n      , size( static_cast<uint32_t>( values_.size() * sizeof( T ) ) )\n      , pValues( values_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PushConstantsInfo & operator=( PushConstantsInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PushConstantsInfo & operator=( VkPushConstantsInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PushConstantsInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PushConstantsInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PushConstantsInfo & setLayout( VULKAN_HPP_NAMESPACE::PipelineLayout layout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layout = layout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PushConstantsInfo & setStageFlags( VULKAN_HPP_NAMESPACE::ShaderStageFlags stageFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stageFlags = stageFlags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PushConstantsInfo & setOffset( uint32_t offset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      offset = offset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PushConstantsInfo & setSize( uint32_t size_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size = size_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PushConstantsInfo & setPValues( const void * pValues_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pValues = pValues_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    PushConstantsInfo & setValues( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & values_ ) VULKAN_HPP_NOEXCEPT\n    {\n      size    = static_cast<uint32_t>( values_.size() * sizeof( T ) );\n      pValues = values_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPushConstantsInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPushConstantsInfo *>( this );\n    }\n\n    operator VkPushConstantsInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPushConstantsInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineLayout const &,\n               VULKAN_HPP_NAMESPACE::ShaderStageFlags const &,\n               uint32_t const &,\n               uint32_t const &,\n               const void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, layout, stageFlags, offset, size, pValues );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PushConstantsInfo const & ) const = default;\n#else\n    bool operator==( PushConstantsInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( layout == rhs.layout ) && ( stageFlags == rhs.stageFlags ) && ( offset == rhs.offset ) &&\n             ( size == rhs.size ) && ( pValues == rhs.pValues );\n#  endif\n    }\n\n    bool operator!=( PushConstantsInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType      = StructureType::ePushConstantsInfo;\n    const void *                           pNext      = {};\n    VULKAN_HPP_NAMESPACE::PipelineLayout   layout     = {};\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags stageFlags = {};\n    uint32_t                               offset     = {};\n    uint32_t                               size       = {};\n    const void *                           pValues    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePushConstantsInfo>\n  {\n    using Type = PushConstantsInfo;\n  };\n\n  using PushConstantsInfoKHR = PushConstantsInfo;\n\n  struct WriteDescriptorSet\n  {\n    using NativeType = VkWriteDescriptorSet;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eWriteDescriptorSet;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR WriteDescriptorSet( VULKAN_HPP_NAMESPACE::DescriptorSet               dstSet_          = {},\n                                             uint32_t                                          dstBinding_      = {},\n                                             uint32_t                                          dstArrayElement_ = {},\n                                             uint32_t                                          descriptorCount_ = {},\n                                             VULKAN_HPP_NAMESPACE::DescriptorType              descriptorType_ = VULKAN_HPP_NAMESPACE::DescriptorType::eSampler,\n                                             const VULKAN_HPP_NAMESPACE::DescriptorImageInfo * pImageInfo_     = {},\n                                             const VULKAN_HPP_NAMESPACE::DescriptorBufferInfo * pBufferInfo_   = {},\n                                             const VULKAN_HPP_NAMESPACE::BufferView *           pTexelBufferView_ = {},\n                                             const void *                                       pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , dstSet{ dstSet_ }\n      , dstBinding{ dstBinding_ }\n      , dstArrayElement{ dstArrayElement_ }\n      , descriptorCount{ descriptorCount_ }\n      , descriptorType{ descriptorType_ }\n      , pImageInfo{ pImageInfo_ }\n      , pBufferInfo{ pBufferInfo_ }\n      , pTexelBufferView{ pTexelBufferView_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR WriteDescriptorSet( WriteDescriptorSet const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    WriteDescriptorSet( VkWriteDescriptorSet const & rhs ) VULKAN_HPP_NOEXCEPT : WriteDescriptorSet( *reinterpret_cast<WriteDescriptorSet const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    WriteDescriptorSet( VULKAN_HPP_NAMESPACE::DescriptorSet                                                                     dstSet_,\n                        uint32_t                                                                                                dstBinding_,\n                        uint32_t                                                                                                dstArrayElement_,\n                        VULKAN_HPP_NAMESPACE::DescriptorType                                                                    descriptorType_,\n                        VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorImageInfo> const &  imageInfo_,\n                        VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorBufferInfo> const & bufferInfo_      = {},\n                        VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::BufferView> const &           texelBufferView_ = {},\n                        const void *                                                                                            pNext_           = nullptr )\n      : pNext( pNext_ )\n      , dstSet( dstSet_ )\n      , dstBinding( dstBinding_ )\n      , dstArrayElement( dstArrayElement_ )\n      , descriptorCount( static_cast<uint32_t>( !imageInfo_.empty()    ? imageInfo_.size()\n                                                : !bufferInfo_.empty() ? bufferInfo_.size()\n                                                                       : texelBufferView_.size() ) )\n      , descriptorType( descriptorType_ )\n      , pImageInfo( imageInfo_.data() )\n      , pBufferInfo( bufferInfo_.data() )\n      , pTexelBufferView( texelBufferView_.data() )\n    {\n#    ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( ( !imageInfo_.empty() + !bufferInfo_.empty() + !texelBufferView_.empty() ) <= 1 );\n#    else\n      if ( 1 < ( !imageInfo_.empty() + !bufferInfo_.empty() + !texelBufferView_.empty() ) )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING\n                          \"::WriteDescriptorSet::WriteDescriptorSet: 1 < ( !imageInfo_.empty() + !bufferInfo_.empty() + !texelBufferView_.empty() )\" );\n      }\n#    endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    WriteDescriptorSet & operator=( WriteDescriptorSet const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    WriteDescriptorSet & operator=( VkWriteDescriptorSet const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::WriteDescriptorSet const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 WriteDescriptorSet & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 WriteDescriptorSet & setDstSet( VULKAN_HPP_NAMESPACE::DescriptorSet dstSet_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstSet = dstSet_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 WriteDescriptorSet & setDstBinding( uint32_t dstBinding_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstBinding = dstBinding_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 WriteDescriptorSet & setDstArrayElement( uint32_t dstArrayElement_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstArrayElement = dstArrayElement_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 WriteDescriptorSet & setDescriptorCount( uint32_t descriptorCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorCount = descriptorCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 WriteDescriptorSet & setDescriptorType( VULKAN_HPP_NAMESPACE::DescriptorType descriptorType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorType = descriptorType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 WriteDescriptorSet & setPImageInfo( const VULKAN_HPP_NAMESPACE::DescriptorImageInfo * pImageInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pImageInfo = pImageInfo_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    WriteDescriptorSet &\n      setImageInfo( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorImageInfo> const & imageInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorCount = static_cast<uint32_t>( imageInfo_.size() );\n      pImageInfo      = imageInfo_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 WriteDescriptorSet & setPBufferInfo( const VULKAN_HPP_NAMESPACE::DescriptorBufferInfo * pBufferInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pBufferInfo = pBufferInfo_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    WriteDescriptorSet &\n      setBufferInfo( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorBufferInfo> const & bufferInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorCount = static_cast<uint32_t>( bufferInfo_.size() );\n      pBufferInfo     = bufferInfo_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 WriteDescriptorSet & setPTexelBufferView( const VULKAN_HPP_NAMESPACE::BufferView * pTexelBufferView_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pTexelBufferView = pTexelBufferView_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    WriteDescriptorSet &\n      setTexelBufferView( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::BufferView> const & texelBufferView_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorCount  = static_cast<uint32_t>( texelBufferView_.size() );\n      pTexelBufferView = texelBufferView_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkWriteDescriptorSet const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkWriteDescriptorSet *>( this );\n    }\n\n    operator VkWriteDescriptorSet &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkWriteDescriptorSet *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DescriptorSet const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::DescriptorType const &,\n               const VULKAN_HPP_NAMESPACE::DescriptorImageInfo * const &,\n               const VULKAN_HPP_NAMESPACE::DescriptorBufferInfo * const &,\n               const VULKAN_HPP_NAMESPACE::BufferView * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, dstSet, dstBinding, dstArrayElement, descriptorCount, descriptorType, pImageInfo, pBufferInfo, pTexelBufferView );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( WriteDescriptorSet const & ) const = default;\n#else\n    bool operator==( WriteDescriptorSet const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( dstSet == rhs.dstSet ) && ( dstBinding == rhs.dstBinding ) &&\n             ( dstArrayElement == rhs.dstArrayElement ) && ( descriptorCount == rhs.descriptorCount ) && ( descriptorType == rhs.descriptorType ) &&\n             ( pImageInfo == rhs.pImageInfo ) && ( pBufferInfo == rhs.pBufferInfo ) && ( pTexelBufferView == rhs.pTexelBufferView );\n#  endif\n    }\n\n    bool operator!=( WriteDescriptorSet const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                sType            = StructureType::eWriteDescriptorSet;\n    const void *                                       pNext            = {};\n    VULKAN_HPP_NAMESPACE::DescriptorSet                dstSet           = {};\n    uint32_t                                           dstBinding       = {};\n    uint32_t                                           dstArrayElement  = {};\n    uint32_t                                           descriptorCount  = {};\n    VULKAN_HPP_NAMESPACE::DescriptorType               descriptorType   = VULKAN_HPP_NAMESPACE::DescriptorType::eSampler;\n    const VULKAN_HPP_NAMESPACE::DescriptorImageInfo *  pImageInfo       = {};\n    const VULKAN_HPP_NAMESPACE::DescriptorBufferInfo * pBufferInfo      = {};\n    const VULKAN_HPP_NAMESPACE::BufferView *           pTexelBufferView = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eWriteDescriptorSet>\n  {\n    using Type = WriteDescriptorSet;\n  };\n\n  struct PushDescriptorSetInfo\n  {\n    using NativeType = VkPushDescriptorSetInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePushDescriptorSetInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PushDescriptorSetInfo( VULKAN_HPP_NAMESPACE::ShaderStageFlags           stageFlags_           = {},\n                                                VULKAN_HPP_NAMESPACE::PipelineLayout             layout_               = {},\n                                                uint32_t                                         set_                  = {},\n                                                uint32_t                                         descriptorWriteCount_ = {},\n                                                const VULKAN_HPP_NAMESPACE::WriteDescriptorSet * pDescriptorWrites_    = {},\n                                                const void *                                     pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stageFlags{ stageFlags_ }\n      , layout{ layout_ }\n      , set{ set_ }\n      , descriptorWriteCount{ descriptorWriteCount_ }\n      , pDescriptorWrites{ pDescriptorWrites_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PushDescriptorSetInfo( PushDescriptorSetInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PushDescriptorSetInfo( VkPushDescriptorSetInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PushDescriptorSetInfo( *reinterpret_cast<PushDescriptorSetInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PushDescriptorSetInfo( VULKAN_HPP_NAMESPACE::ShaderStageFlags                                                                stageFlags_,\n                           VULKAN_HPP_NAMESPACE::PipelineLayout                                                                  layout_,\n                           uint32_t                                                                                              set_,\n                           VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::WriteDescriptorSet> const & descriptorWrites_,\n                           const void *                                                                                          pNext_ = nullptr )\n      : pNext( pNext_ )\n      , stageFlags( stageFlags_ )\n      , layout( layout_ )\n      , set( set_ )\n      , descriptorWriteCount( static_cast<uint32_t>( descriptorWrites_.size() ) )\n      , pDescriptorWrites( descriptorWrites_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    PushDescriptorSetInfo & operator=( PushDescriptorSetInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PushDescriptorSetInfo & operator=( VkPushDescriptorSetInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PushDescriptorSetInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PushDescriptorSetInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PushDescriptorSetInfo & setStageFlags( VULKAN_HPP_NAMESPACE::ShaderStageFlags stageFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stageFlags = stageFlags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PushDescriptorSetInfo & setLayout( VULKAN_HPP_NAMESPACE::PipelineLayout layout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layout = layout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PushDescriptorSetInfo & setSet( uint32_t set_ ) VULKAN_HPP_NOEXCEPT\n    {\n      set = set_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PushDescriptorSetInfo & setDescriptorWriteCount( uint32_t descriptorWriteCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorWriteCount = descriptorWriteCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PushDescriptorSetInfo &\n      setPDescriptorWrites( const VULKAN_HPP_NAMESPACE::WriteDescriptorSet * pDescriptorWrites_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDescriptorWrites = pDescriptorWrites_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    PushDescriptorSetInfo & setDescriptorWrites(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::WriteDescriptorSet> const & descriptorWrites_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorWriteCount = static_cast<uint32_t>( descriptorWrites_.size() );\n      pDescriptorWrites    = descriptorWrites_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPushDescriptorSetInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPushDescriptorSetInfo *>( this );\n    }\n\n    operator VkPushDescriptorSetInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPushDescriptorSetInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ShaderStageFlags const &,\n               VULKAN_HPP_NAMESPACE::PipelineLayout const &,\n               uint32_t const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::WriteDescriptorSet * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stageFlags, layout, set, descriptorWriteCount, pDescriptorWrites );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PushDescriptorSetInfo const & ) const = default;\n#else\n    bool operator==( PushDescriptorSetInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( stageFlags == rhs.stageFlags ) && ( layout == rhs.layout ) && ( set == rhs.set ) &&\n             ( descriptorWriteCount == rhs.descriptorWriteCount ) && ( pDescriptorWrites == rhs.pDescriptorWrites );\n#  endif\n    }\n\n    bool operator!=( PushDescriptorSetInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType              sType                = StructureType::ePushDescriptorSetInfo;\n    const void *                                     pNext                = {};\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags           stageFlags           = {};\n    VULKAN_HPP_NAMESPACE::PipelineLayout             layout               = {};\n    uint32_t                                         set                  = {};\n    uint32_t                                         descriptorWriteCount = {};\n    const VULKAN_HPP_NAMESPACE::WriteDescriptorSet * pDescriptorWrites    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePushDescriptorSetInfo>\n  {\n    using Type = PushDescriptorSetInfo;\n  };\n\n  using PushDescriptorSetInfoKHR = PushDescriptorSetInfo;\n\n  struct PushDescriptorSetWithTemplateInfo\n  {\n    using NativeType = VkPushDescriptorSetWithTemplateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::ePushDescriptorSetWithTemplateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR PushDescriptorSetWithTemplateInfo( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate_ = {},\n                                                            VULKAN_HPP_NAMESPACE::PipelineLayout           layout_                   = {},\n                                                            uint32_t                                       set_                      = {},\n                                                            const void *                                   pData_                    = {},\n                                                            const void *                                   pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , descriptorUpdateTemplate{ descriptorUpdateTemplate_ }\n      , layout{ layout_ }\n      , set{ set_ }\n      , pData{ pData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR PushDescriptorSetWithTemplateInfo( PushDescriptorSetWithTemplateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    PushDescriptorSetWithTemplateInfo( VkPushDescriptorSetWithTemplateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : PushDescriptorSetWithTemplateInfo( *reinterpret_cast<PushDescriptorSetWithTemplateInfo const *>( &rhs ) )\n    {\n    }\n\n    PushDescriptorSetWithTemplateInfo & operator=( PushDescriptorSetWithTemplateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    PushDescriptorSetWithTemplateInfo & operator=( VkPushDescriptorSetWithTemplateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PushDescriptorSetWithTemplateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 PushDescriptorSetWithTemplateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PushDescriptorSetWithTemplateInfo &\n      setDescriptorUpdateTemplate( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate_ ) VULKAN_HPP_NOEXCEPT\n    {\n      descriptorUpdateTemplate = descriptorUpdateTemplate_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PushDescriptorSetWithTemplateInfo & setLayout( VULKAN_HPP_NAMESPACE::PipelineLayout layout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layout = layout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PushDescriptorSetWithTemplateInfo & setSet( uint32_t set_ ) VULKAN_HPP_NOEXCEPT\n    {\n      set = set_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 PushDescriptorSetWithTemplateInfo & setPData( const void * pData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pData = pData_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkPushDescriptorSetWithTemplateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkPushDescriptorSetWithTemplateInfo *>( this );\n    }\n\n    operator VkPushDescriptorSetWithTemplateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkPushDescriptorSetWithTemplateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate const &,\n               VULKAN_HPP_NAMESPACE::PipelineLayout const &,\n               uint32_t const &,\n               const void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, descriptorUpdateTemplate, layout, set, pData );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( PushDescriptorSetWithTemplateInfo const & ) const = default;\n#else\n    bool operator==( PushDescriptorSetWithTemplateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( descriptorUpdateTemplate == rhs.descriptorUpdateTemplate ) && ( layout == rhs.layout ) &&\n             ( set == rhs.set ) && ( pData == rhs.pData );\n#  endif\n    }\n\n    bool operator!=( PushDescriptorSetWithTemplateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType            sType                    = StructureType::ePushDescriptorSetWithTemplateInfo;\n    const void *                                   pNext                    = {};\n    VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate = {};\n    VULKAN_HPP_NAMESPACE::PipelineLayout           layout                   = {};\n    uint32_t                                       set                      = {};\n    const void *                                   pData                    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::ePushDescriptorSetWithTemplateInfo>\n  {\n    using Type = PushDescriptorSetWithTemplateInfo;\n  };\n\n  using PushDescriptorSetWithTemplateInfoKHR = PushDescriptorSetWithTemplateInfo;\n\n  struct QueryLowLatencySupportNV\n  {\n    using NativeType = VkQueryLowLatencySupportNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eQueryLowLatencySupportNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR QueryLowLatencySupportNV( void * pQueriedLowLatencyData_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pQueriedLowLatencyData{ pQueriedLowLatencyData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR QueryLowLatencySupportNV( QueryLowLatencySupportNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    QueryLowLatencySupportNV( VkQueryLowLatencySupportNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : QueryLowLatencySupportNV( *reinterpret_cast<QueryLowLatencySupportNV const *>( &rhs ) )\n    {\n    }\n\n    QueryLowLatencySupportNV & operator=( QueryLowLatencySupportNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    QueryLowLatencySupportNV & operator=( VkQueryLowLatencySupportNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::QueryLowLatencySupportNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 QueryLowLatencySupportNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 QueryLowLatencySupportNV & setPQueriedLowLatencyData( void * pQueriedLowLatencyData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pQueriedLowLatencyData = pQueriedLowLatencyData_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkQueryLowLatencySupportNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkQueryLowLatencySupportNV *>( this );\n    }\n\n    operator VkQueryLowLatencySupportNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkQueryLowLatencySupportNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pQueriedLowLatencyData );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( QueryLowLatencySupportNV const & ) const = default;\n#else\n    bool operator==( QueryLowLatencySupportNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pQueriedLowLatencyData == rhs.pQueriedLowLatencyData );\n#  endif\n    }\n\n    bool operator!=( QueryLowLatencySupportNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                  = StructureType::eQueryLowLatencySupportNV;\n    const void *                        pNext                  = {};\n    void *                              pQueriedLowLatencyData = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eQueryLowLatencySupportNV>\n  {\n    using Type = QueryLowLatencySupportNV;\n  };\n\n  struct QueryPoolCreateInfo\n  {\n    using NativeType = VkQueryPoolCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eQueryPoolCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR QueryPoolCreateInfo( VULKAN_HPP_NAMESPACE::QueryPoolCreateFlags        flags_      = {},\n                                              VULKAN_HPP_NAMESPACE::QueryType                   queryType_  = VULKAN_HPP_NAMESPACE::QueryType::eOcclusion,\n                                              uint32_t                                          queryCount_ = {},\n                                              VULKAN_HPP_NAMESPACE::QueryPipelineStatisticFlags pipelineStatistics_ = {},\n                                              const void *                                      pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , queryType{ queryType_ }\n      , queryCount{ queryCount_ }\n      , pipelineStatistics{ pipelineStatistics_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR QueryPoolCreateInfo( QueryPoolCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    QueryPoolCreateInfo( VkQueryPoolCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT : QueryPoolCreateInfo( *reinterpret_cast<QueryPoolCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    QueryPoolCreateInfo & operator=( QueryPoolCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    QueryPoolCreateInfo & operator=( VkQueryPoolCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::QueryPoolCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 QueryPoolCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 QueryPoolCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::QueryPoolCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 QueryPoolCreateInfo & setQueryType( VULKAN_HPP_NAMESPACE::QueryType queryType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queryType = queryType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 QueryPoolCreateInfo & setQueryCount( uint32_t queryCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queryCount = queryCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 QueryPoolCreateInfo &\n      setPipelineStatistics( VULKAN_HPP_NAMESPACE::QueryPipelineStatisticFlags pipelineStatistics_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineStatistics = pipelineStatistics_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkQueryPoolCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkQueryPoolCreateInfo *>( this );\n    }\n\n    operator VkQueryPoolCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkQueryPoolCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::QueryPoolCreateFlags const &,\n               VULKAN_HPP_NAMESPACE::QueryType const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::QueryPipelineStatisticFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, queryType, queryCount, pipelineStatistics );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( QueryPoolCreateInfo const & ) const = default;\n#else\n    bool operator==( QueryPoolCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( queryType == rhs.queryType ) && ( queryCount == rhs.queryCount ) &&\n             ( pipelineStatistics == rhs.pipelineStatistics );\n#  endif\n    }\n\n    bool operator!=( QueryPoolCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType              = StructureType::eQueryPoolCreateInfo;\n    const void *                                      pNext              = {};\n    VULKAN_HPP_NAMESPACE::QueryPoolCreateFlags        flags              = {};\n    VULKAN_HPP_NAMESPACE::QueryType                   queryType          = VULKAN_HPP_NAMESPACE::QueryType::eOcclusion;\n    uint32_t                                          queryCount         = {};\n    VULKAN_HPP_NAMESPACE::QueryPipelineStatisticFlags pipelineStatistics = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eQueryPoolCreateInfo>\n  {\n    using Type = QueryPoolCreateInfo;\n  };\n\n  struct QueryPoolPerformanceCreateInfoKHR\n  {\n    using NativeType = VkQueryPoolPerformanceCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eQueryPoolPerformanceCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR QueryPoolPerformanceCreateInfoKHR( uint32_t         queueFamilyIndex_  = {},\n                                                            uint32_t         counterIndexCount_ = {},\n                                                            const uint32_t * pCounterIndices_   = {},\n                                                            const void *     pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , queueFamilyIndex{ queueFamilyIndex_ }\n      , counterIndexCount{ counterIndexCount_ }\n      , pCounterIndices{ pCounterIndices_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR QueryPoolPerformanceCreateInfoKHR( QueryPoolPerformanceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    QueryPoolPerformanceCreateInfoKHR( VkQueryPoolPerformanceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : QueryPoolPerformanceCreateInfoKHR( *reinterpret_cast<QueryPoolPerformanceCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    QueryPoolPerformanceCreateInfoKHR( uint32_t                                                              queueFamilyIndex_,\n                                       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & counterIndices_,\n                                       const void *                                                          pNext_ = nullptr )\n      : pNext( pNext_ )\n      , queueFamilyIndex( queueFamilyIndex_ )\n      , counterIndexCount( static_cast<uint32_t>( counterIndices_.size() ) )\n      , pCounterIndices( counterIndices_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    QueryPoolPerformanceCreateInfoKHR & operator=( QueryPoolPerformanceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    QueryPoolPerformanceCreateInfoKHR & operator=( VkQueryPoolPerformanceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::QueryPoolPerformanceCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 QueryPoolPerformanceCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 QueryPoolPerformanceCreateInfoKHR & setQueueFamilyIndex( uint32_t queueFamilyIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queueFamilyIndex = queueFamilyIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 QueryPoolPerformanceCreateInfoKHR & setCounterIndexCount( uint32_t counterIndexCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      counterIndexCount = counterIndexCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 QueryPoolPerformanceCreateInfoKHR & setPCounterIndices( const uint32_t * pCounterIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pCounterIndices = pCounterIndices_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    QueryPoolPerformanceCreateInfoKHR &\n      setCounterIndices( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & counterIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      counterIndexCount = static_cast<uint32_t>( counterIndices_.size() );\n      pCounterIndices   = counterIndices_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkQueryPoolPerformanceCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkQueryPoolPerformanceCreateInfoKHR *>( this );\n    }\n\n    operator VkQueryPoolPerformanceCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkQueryPoolPerformanceCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, uint32_t const &, const uint32_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, queueFamilyIndex, counterIndexCount, pCounterIndices );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( QueryPoolPerformanceCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( QueryPoolPerformanceCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( queueFamilyIndex == rhs.queueFamilyIndex ) &&\n             ( counterIndexCount == rhs.counterIndexCount ) && ( pCounterIndices == rhs.pCounterIndices );\n#  endif\n    }\n\n    bool operator!=( QueryPoolPerformanceCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType             = StructureType::eQueryPoolPerformanceCreateInfoKHR;\n    const void *                        pNext             = {};\n    uint32_t                            queueFamilyIndex  = {};\n    uint32_t                            counterIndexCount = {};\n    const uint32_t *                    pCounterIndices   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eQueryPoolPerformanceCreateInfoKHR>\n  {\n    using Type = QueryPoolPerformanceCreateInfoKHR;\n  };\n\n  struct QueryPoolPerformanceQueryCreateInfoINTEL\n  {\n    using NativeType = VkQueryPoolPerformanceQueryCreateInfoINTEL;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eQueryPoolPerformanceQueryCreateInfoINTEL;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR QueryPoolPerformanceQueryCreateInfoINTEL(\n      VULKAN_HPP_NAMESPACE::QueryPoolSamplingModeINTEL performanceCountersSampling_ = VULKAN_HPP_NAMESPACE::QueryPoolSamplingModeINTEL::eManual,\n      const void *                                     pNext_                       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , performanceCountersSampling{ performanceCountersSampling_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR QueryPoolPerformanceQueryCreateInfoINTEL( QueryPoolPerformanceQueryCreateInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    QueryPoolPerformanceQueryCreateInfoINTEL( VkQueryPoolPerformanceQueryCreateInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT\n      : QueryPoolPerformanceQueryCreateInfoINTEL( *reinterpret_cast<QueryPoolPerformanceQueryCreateInfoINTEL const *>( &rhs ) )\n    {\n    }\n\n    QueryPoolPerformanceQueryCreateInfoINTEL & operator=( QueryPoolPerformanceQueryCreateInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    QueryPoolPerformanceQueryCreateInfoINTEL & operator=( VkQueryPoolPerformanceQueryCreateInfoINTEL const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::QueryPoolPerformanceQueryCreateInfoINTEL const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 QueryPoolPerformanceQueryCreateInfoINTEL & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 QueryPoolPerformanceQueryCreateInfoINTEL &\n      setPerformanceCountersSampling( VULKAN_HPP_NAMESPACE::QueryPoolSamplingModeINTEL performanceCountersSampling_ ) VULKAN_HPP_NOEXCEPT\n    {\n      performanceCountersSampling = performanceCountersSampling_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkQueryPoolPerformanceQueryCreateInfoINTEL const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkQueryPoolPerformanceQueryCreateInfoINTEL *>( this );\n    }\n\n    operator VkQueryPoolPerformanceQueryCreateInfoINTEL &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkQueryPoolPerformanceQueryCreateInfoINTEL *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::QueryPoolSamplingModeINTEL const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, performanceCountersSampling );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( QueryPoolPerformanceQueryCreateInfoINTEL const & ) const = default;\n#else\n    bool operator==( QueryPoolPerformanceQueryCreateInfoINTEL const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( performanceCountersSampling == rhs.performanceCountersSampling );\n#  endif\n    }\n\n    bool operator!=( QueryPoolPerformanceQueryCreateInfoINTEL const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType              sType                       = StructureType::eQueryPoolPerformanceQueryCreateInfoINTEL;\n    const void *                                     pNext                       = {};\n    VULKAN_HPP_NAMESPACE::QueryPoolSamplingModeINTEL performanceCountersSampling = VULKAN_HPP_NAMESPACE::QueryPoolSamplingModeINTEL::eManual;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eQueryPoolPerformanceQueryCreateInfoINTEL>\n  {\n    using Type = QueryPoolPerformanceQueryCreateInfoINTEL;\n  };\n\n  using QueryPoolCreateInfoINTEL = QueryPoolPerformanceQueryCreateInfoINTEL;\n\n  struct QueryPoolVideoEncodeFeedbackCreateInfoKHR\n  {\n    using NativeType = VkQueryPoolVideoEncodeFeedbackCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eQueryPoolVideoEncodeFeedbackCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR QueryPoolVideoEncodeFeedbackCreateInfoKHR( VULKAN_HPP_NAMESPACE::VideoEncodeFeedbackFlagsKHR encodeFeedbackFlags_ = {},\n                                                                    const void *                                      pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , encodeFeedbackFlags{ encodeFeedbackFlags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR QueryPoolVideoEncodeFeedbackCreateInfoKHR( QueryPoolVideoEncodeFeedbackCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    QueryPoolVideoEncodeFeedbackCreateInfoKHR( VkQueryPoolVideoEncodeFeedbackCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : QueryPoolVideoEncodeFeedbackCreateInfoKHR( *reinterpret_cast<QueryPoolVideoEncodeFeedbackCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    QueryPoolVideoEncodeFeedbackCreateInfoKHR & operator=( QueryPoolVideoEncodeFeedbackCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    QueryPoolVideoEncodeFeedbackCreateInfoKHR & operator=( VkQueryPoolVideoEncodeFeedbackCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::QueryPoolVideoEncodeFeedbackCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 QueryPoolVideoEncodeFeedbackCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 QueryPoolVideoEncodeFeedbackCreateInfoKHR &\n      setEncodeFeedbackFlags( VULKAN_HPP_NAMESPACE::VideoEncodeFeedbackFlagsKHR encodeFeedbackFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      encodeFeedbackFlags = encodeFeedbackFlags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkQueryPoolVideoEncodeFeedbackCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkQueryPoolVideoEncodeFeedbackCreateInfoKHR *>( this );\n    }\n\n    operator VkQueryPoolVideoEncodeFeedbackCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkQueryPoolVideoEncodeFeedbackCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::VideoEncodeFeedbackFlagsKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, encodeFeedbackFlags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( QueryPoolVideoEncodeFeedbackCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( QueryPoolVideoEncodeFeedbackCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( encodeFeedbackFlags == rhs.encodeFeedbackFlags );\n#  endif\n    }\n\n    bool operator!=( QueryPoolVideoEncodeFeedbackCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType               = StructureType::eQueryPoolVideoEncodeFeedbackCreateInfoKHR;\n    const void *                                      pNext               = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeFeedbackFlagsKHR encodeFeedbackFlags = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eQueryPoolVideoEncodeFeedbackCreateInfoKHR>\n  {\n    using Type = QueryPoolVideoEncodeFeedbackCreateInfoKHR;\n  };\n\n  struct QueueFamilyCheckpointProperties2NV\n  {\n    using NativeType = VkQueueFamilyCheckpointProperties2NV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eQueueFamilyCheckpointProperties2NV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR QueueFamilyCheckpointProperties2NV( VULKAN_HPP_NAMESPACE::PipelineStageFlags2 checkpointExecutionStageMask_ = {},\n                                                             void *                                    pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , checkpointExecutionStageMask{ checkpointExecutionStageMask_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR QueueFamilyCheckpointProperties2NV( QueueFamilyCheckpointProperties2NV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    QueueFamilyCheckpointProperties2NV( VkQueueFamilyCheckpointProperties2NV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : QueueFamilyCheckpointProperties2NV( *reinterpret_cast<QueueFamilyCheckpointProperties2NV const *>( &rhs ) )\n    {\n    }\n\n    QueueFamilyCheckpointProperties2NV & operator=( QueueFamilyCheckpointProperties2NV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    QueueFamilyCheckpointProperties2NV & operator=( VkQueueFamilyCheckpointProperties2NV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::QueueFamilyCheckpointProperties2NV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkQueueFamilyCheckpointProperties2NV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkQueueFamilyCheckpointProperties2NV *>( this );\n    }\n\n    operator VkQueueFamilyCheckpointProperties2NV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkQueueFamilyCheckpointProperties2NV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::PipelineStageFlags2 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, checkpointExecutionStageMask );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( QueueFamilyCheckpointProperties2NV const & ) const = default;\n#else\n    bool operator==( QueueFamilyCheckpointProperties2NV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( checkpointExecutionStageMask == rhs.checkpointExecutionStageMask );\n#  endif\n    }\n\n    bool operator!=( QueueFamilyCheckpointProperties2NV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType                        = StructureType::eQueueFamilyCheckpointProperties2NV;\n    void *                                    pNext                        = {};\n    VULKAN_HPP_NAMESPACE::PipelineStageFlags2 checkpointExecutionStageMask = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eQueueFamilyCheckpointProperties2NV>\n  {\n    using Type = QueueFamilyCheckpointProperties2NV;\n  };\n\n  struct QueueFamilyCheckpointPropertiesNV\n  {\n    using NativeType = VkQueueFamilyCheckpointPropertiesNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eQueueFamilyCheckpointPropertiesNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR QueueFamilyCheckpointPropertiesNV( VULKAN_HPP_NAMESPACE::PipelineStageFlags checkpointExecutionStageMask_ = {},\n                                                            void *                                   pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , checkpointExecutionStageMask{ checkpointExecutionStageMask_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR QueueFamilyCheckpointPropertiesNV( QueueFamilyCheckpointPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    QueueFamilyCheckpointPropertiesNV( VkQueueFamilyCheckpointPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : QueueFamilyCheckpointPropertiesNV( *reinterpret_cast<QueueFamilyCheckpointPropertiesNV const *>( &rhs ) )\n    {\n    }\n\n    QueueFamilyCheckpointPropertiesNV & operator=( QueueFamilyCheckpointPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    QueueFamilyCheckpointPropertiesNV & operator=( VkQueueFamilyCheckpointPropertiesNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::QueueFamilyCheckpointPropertiesNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkQueueFamilyCheckpointPropertiesNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkQueueFamilyCheckpointPropertiesNV *>( this );\n    }\n\n    operator VkQueueFamilyCheckpointPropertiesNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkQueueFamilyCheckpointPropertiesNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::PipelineStageFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, checkpointExecutionStageMask );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( QueueFamilyCheckpointPropertiesNV const & ) const = default;\n#else\n    bool operator==( QueueFamilyCheckpointPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( checkpointExecutionStageMask == rhs.checkpointExecutionStageMask );\n#  endif\n    }\n\n    bool operator!=( QueueFamilyCheckpointPropertiesNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType      sType                        = StructureType::eQueueFamilyCheckpointPropertiesNV;\n    void *                                   pNext                        = {};\n    VULKAN_HPP_NAMESPACE::PipelineStageFlags checkpointExecutionStageMask = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eQueueFamilyCheckpointPropertiesNV>\n  {\n    using Type = QueueFamilyCheckpointPropertiesNV;\n  };\n\n  struct QueueFamilyGlobalPriorityProperties\n  {\n    using NativeType = VkQueueFamilyGlobalPriorityProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eQueueFamilyGlobalPriorityProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 QueueFamilyGlobalPriorityProperties( uint32_t priorityCount_ = {},\n                                                                 std::array<VULKAN_HPP_NAMESPACE::QueueGlobalPriority, VK_MAX_GLOBAL_PRIORITY_SIZE> const &\n                                                                        priorities_ = { { VULKAN_HPP_NAMESPACE::QueueGlobalPriority::eLow,\n                                                                                          VULKAN_HPP_NAMESPACE::QueueGlobalPriority::eLow,\n                                                                                          VULKAN_HPP_NAMESPACE::QueueGlobalPriority::eLow,\n                                                                                          VULKAN_HPP_NAMESPACE::QueueGlobalPriority::eLow,\n                                                                                          VULKAN_HPP_NAMESPACE::QueueGlobalPriority::eLow,\n                                                                                          VULKAN_HPP_NAMESPACE::QueueGlobalPriority::eLow,\n                                                                                          VULKAN_HPP_NAMESPACE::QueueGlobalPriority::eLow,\n                                                                                          VULKAN_HPP_NAMESPACE::QueueGlobalPriority::eLow,\n                                                                                          VULKAN_HPP_NAMESPACE::QueueGlobalPriority::eLow,\n                                                                                          VULKAN_HPP_NAMESPACE::QueueGlobalPriority::eLow,\n                                                                                          VULKAN_HPP_NAMESPACE::QueueGlobalPriority::eLow,\n                                                                                          VULKAN_HPP_NAMESPACE::QueueGlobalPriority::eLow,\n                                                                                          VULKAN_HPP_NAMESPACE::QueueGlobalPriority::eLow,\n                                                                                          VULKAN_HPP_NAMESPACE::QueueGlobalPriority::eLow,\n                                                                                          VULKAN_HPP_NAMESPACE::QueueGlobalPriority::eLow,\n                                                                                          VULKAN_HPP_NAMESPACE::QueueGlobalPriority::eLow } },\n                                                                 void * pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , priorityCount{ priorityCount_ }\n      , priorities{ priorities_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 QueueFamilyGlobalPriorityProperties( QueueFamilyGlobalPriorityProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    QueueFamilyGlobalPriorityProperties( VkQueueFamilyGlobalPriorityProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : QueueFamilyGlobalPriorityProperties( *reinterpret_cast<QueueFamilyGlobalPriorityProperties const *>( &rhs ) )\n    {\n    }\n\n    QueueFamilyGlobalPriorityProperties & operator=( QueueFamilyGlobalPriorityProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    QueueFamilyGlobalPriorityProperties & operator=( VkQueueFamilyGlobalPriorityProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::QueueFamilyGlobalPriorityProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkQueueFamilyGlobalPriorityProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkQueueFamilyGlobalPriorityProperties *>( this );\n    }\n\n    operator VkQueueFamilyGlobalPriorityProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkQueueFamilyGlobalPriorityProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::QueueGlobalPriority, VK_MAX_GLOBAL_PRIORITY_SIZE> const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, priorityCount, priorities );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( QueueFamilyGlobalPriorityProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = priorityCount <=> rhs.priorityCount; cmp != 0 )\n        return cmp;\n      for ( size_t i = 0; i < priorityCount; ++i )\n      {\n        if ( auto cmp = priorities[i] <=> rhs.priorities[i]; cmp != 0 )\n          return cmp;\n      }\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( QueueFamilyGlobalPriorityProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( priorityCount == rhs.priorityCount ) &&\n             ( memcmp( priorities, rhs.priorities, priorityCount * sizeof( VULKAN_HPP_NAMESPACE::QueueGlobalPriority ) ) == 0 );\n    }\n\n    bool operator!=( QueueFamilyGlobalPriorityProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType         = StructureType::eQueueFamilyGlobalPriorityProperties;\n    void *                              pNext         = {};\n    uint32_t                            priorityCount = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<VULKAN_HPP_NAMESPACE::QueueGlobalPriority, VK_MAX_GLOBAL_PRIORITY_SIZE> priorities = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eQueueFamilyGlobalPriorityProperties>\n  {\n    using Type = QueueFamilyGlobalPriorityProperties;\n  };\n\n  using QueueFamilyGlobalPriorityPropertiesEXT = QueueFamilyGlobalPriorityProperties;\n  using QueueFamilyGlobalPriorityPropertiesKHR = QueueFamilyGlobalPriorityProperties;\n\n  struct QueueFamilyProperties\n  {\n    using NativeType = VkQueueFamilyProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR QueueFamilyProperties( VULKAN_HPP_NAMESPACE::QueueFlags queueFlags_                  = {},\n                                                uint32_t                         queueCount_                  = {},\n                                                uint32_t                         timestampValidBits_          = {},\n                                                VULKAN_HPP_NAMESPACE::Extent3D   minImageTransferGranularity_ = {} ) VULKAN_HPP_NOEXCEPT\n      : queueFlags{ queueFlags_ }\n      , queueCount{ queueCount_ }\n      , timestampValidBits{ timestampValidBits_ }\n      , minImageTransferGranularity{ minImageTransferGranularity_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR QueueFamilyProperties( QueueFamilyProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    QueueFamilyProperties( VkQueueFamilyProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : QueueFamilyProperties( *reinterpret_cast<QueueFamilyProperties const *>( &rhs ) )\n    {\n    }\n\n    QueueFamilyProperties & operator=( QueueFamilyProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    QueueFamilyProperties & operator=( VkQueueFamilyProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::QueueFamilyProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkQueueFamilyProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkQueueFamilyProperties *>( this );\n    }\n\n    operator VkQueueFamilyProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkQueueFamilyProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::QueueFlags const &, uint32_t const &, uint32_t const &, VULKAN_HPP_NAMESPACE::Extent3D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( queueFlags, queueCount, timestampValidBits, minImageTransferGranularity );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( QueueFamilyProperties const & ) const = default;\n#else\n    bool operator==( QueueFamilyProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( queueFlags == rhs.queueFlags ) && ( queueCount == rhs.queueCount ) && ( timestampValidBits == rhs.timestampValidBits ) &&\n             ( minImageTransferGranularity == rhs.minImageTransferGranularity );\n#  endif\n    }\n\n    bool operator!=( QueueFamilyProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::QueueFlags queueFlags                  = {};\n    uint32_t                         queueCount                  = {};\n    uint32_t                         timestampValidBits          = {};\n    VULKAN_HPP_NAMESPACE::Extent3D   minImageTransferGranularity = {};\n  };\n\n  struct QueueFamilyProperties2\n  {\n    using NativeType = VkQueueFamilyProperties2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eQueueFamilyProperties2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR QueueFamilyProperties2( VULKAN_HPP_NAMESPACE::QueueFamilyProperties queueFamilyProperties_ = {},\n                                                 void *                                      pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , queueFamilyProperties{ queueFamilyProperties_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR QueueFamilyProperties2( QueueFamilyProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    QueueFamilyProperties2( VkQueueFamilyProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT\n      : QueueFamilyProperties2( *reinterpret_cast<QueueFamilyProperties2 const *>( &rhs ) )\n    {\n    }\n\n    QueueFamilyProperties2 & operator=( QueueFamilyProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    QueueFamilyProperties2 & operator=( VkQueueFamilyProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2 const *>( &rhs );\n      return *this;\n    }\n\n    operator VkQueueFamilyProperties2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkQueueFamilyProperties2 *>( this );\n    }\n\n    operator VkQueueFamilyProperties2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkQueueFamilyProperties2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::QueueFamilyProperties const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, queueFamilyProperties );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( QueueFamilyProperties2 const & ) const = default;\n#else\n    bool operator==( QueueFamilyProperties2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( queueFamilyProperties == rhs.queueFamilyProperties );\n#  endif\n    }\n\n    bool operator!=( QueueFamilyProperties2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType         sType                 = StructureType::eQueueFamilyProperties2;\n    void *                                      pNext                 = {};\n    VULKAN_HPP_NAMESPACE::QueueFamilyProperties queueFamilyProperties = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eQueueFamilyProperties2>\n  {\n    using Type = QueueFamilyProperties2;\n  };\n\n  using QueueFamilyProperties2KHR = QueueFamilyProperties2;\n\n  struct QueueFamilyQueryResultStatusPropertiesKHR\n  {\n    using NativeType = VkQueueFamilyQueryResultStatusPropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eQueueFamilyQueryResultStatusPropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR QueueFamilyQueryResultStatusPropertiesKHR( VULKAN_HPP_NAMESPACE::Bool32 queryResultStatusSupport_ = {},\n                                                                    void *                       pNext_                    = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , queryResultStatusSupport{ queryResultStatusSupport_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR QueueFamilyQueryResultStatusPropertiesKHR( QueueFamilyQueryResultStatusPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    QueueFamilyQueryResultStatusPropertiesKHR( VkQueueFamilyQueryResultStatusPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : QueueFamilyQueryResultStatusPropertiesKHR( *reinterpret_cast<QueueFamilyQueryResultStatusPropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    QueueFamilyQueryResultStatusPropertiesKHR & operator=( QueueFamilyQueryResultStatusPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    QueueFamilyQueryResultStatusPropertiesKHR & operator=( VkQueueFamilyQueryResultStatusPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::QueueFamilyQueryResultStatusPropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkQueueFamilyQueryResultStatusPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkQueueFamilyQueryResultStatusPropertiesKHR *>( this );\n    }\n\n    operator VkQueueFamilyQueryResultStatusPropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkQueueFamilyQueryResultStatusPropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, queryResultStatusSupport );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( QueueFamilyQueryResultStatusPropertiesKHR const & ) const = default;\n#else\n    bool operator==( QueueFamilyQueryResultStatusPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( queryResultStatusSupport == rhs.queryResultStatusSupport );\n#  endif\n    }\n\n    bool operator!=( QueueFamilyQueryResultStatusPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                    = StructureType::eQueueFamilyQueryResultStatusPropertiesKHR;\n    void *                              pNext                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        queryResultStatusSupport = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eQueueFamilyQueryResultStatusPropertiesKHR>\n  {\n    using Type = QueueFamilyQueryResultStatusPropertiesKHR;\n  };\n\n  struct QueueFamilyVideoPropertiesKHR\n  {\n    using NativeType = VkQueueFamilyVideoPropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eQueueFamilyVideoPropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR QueueFamilyVideoPropertiesKHR( VULKAN_HPP_NAMESPACE::VideoCodecOperationFlagsKHR videoCodecOperations_ = {},\n                                                        void *                                            pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , videoCodecOperations{ videoCodecOperations_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR QueueFamilyVideoPropertiesKHR( QueueFamilyVideoPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    QueueFamilyVideoPropertiesKHR( VkQueueFamilyVideoPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : QueueFamilyVideoPropertiesKHR( *reinterpret_cast<QueueFamilyVideoPropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    QueueFamilyVideoPropertiesKHR & operator=( QueueFamilyVideoPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    QueueFamilyVideoPropertiesKHR & operator=( VkQueueFamilyVideoPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::QueueFamilyVideoPropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkQueueFamilyVideoPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkQueueFamilyVideoPropertiesKHR *>( this );\n    }\n\n    operator VkQueueFamilyVideoPropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkQueueFamilyVideoPropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::VideoCodecOperationFlagsKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, videoCodecOperations );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( QueueFamilyVideoPropertiesKHR const & ) const = default;\n#else\n    bool operator==( QueueFamilyVideoPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( videoCodecOperations == rhs.videoCodecOperations );\n#  endif\n    }\n\n    bool operator!=( QueueFamilyVideoPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType                = StructureType::eQueueFamilyVideoPropertiesKHR;\n    void *                                            pNext                = {};\n    VULKAN_HPP_NAMESPACE::VideoCodecOperationFlagsKHR videoCodecOperations = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eQueueFamilyVideoPropertiesKHR>\n  {\n    using Type = QueueFamilyVideoPropertiesKHR;\n  };\n\n  struct RayTracingPipelineClusterAccelerationStructureCreateInfoNV\n  {\n    using NativeType = VkRayTracingPipelineClusterAccelerationStructureCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRayTracingPipelineClusterAccelerationStructureCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR RayTracingPipelineClusterAccelerationStructureCreateInfoNV( VULKAN_HPP_NAMESPACE::Bool32 allowClusterAccelerationStructure_ = {},\n                                                                                     void *                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , allowClusterAccelerationStructure{ allowClusterAccelerationStructure_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RayTracingPipelineClusterAccelerationStructureCreateInfoNV( RayTracingPipelineClusterAccelerationStructureCreateInfoNV const & rhs )\n      VULKAN_HPP_NOEXCEPT = default;\n\n    RayTracingPipelineClusterAccelerationStructureCreateInfoNV( VkRayTracingPipelineClusterAccelerationStructureCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RayTracingPipelineClusterAccelerationStructureCreateInfoNV(\n          *reinterpret_cast<RayTracingPipelineClusterAccelerationStructureCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n    RayTracingPipelineClusterAccelerationStructureCreateInfoNV &\n      operator=( RayTracingPipelineClusterAccelerationStructureCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RayTracingPipelineClusterAccelerationStructureCreateInfoNV &\n      operator=( VkRayTracingPipelineClusterAccelerationStructureCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RayTracingPipelineClusterAccelerationStructureCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineClusterAccelerationStructureCreateInfoNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineClusterAccelerationStructureCreateInfoNV &\n      setAllowClusterAccelerationStructure( VULKAN_HPP_NAMESPACE::Bool32 allowClusterAccelerationStructure_ ) VULKAN_HPP_NOEXCEPT\n    {\n      allowClusterAccelerationStructure = allowClusterAccelerationStructure_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRayTracingPipelineClusterAccelerationStructureCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRayTracingPipelineClusterAccelerationStructureCreateInfoNV *>( this );\n    }\n\n    operator VkRayTracingPipelineClusterAccelerationStructureCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRayTracingPipelineClusterAccelerationStructureCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, allowClusterAccelerationStructure );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RayTracingPipelineClusterAccelerationStructureCreateInfoNV const & ) const = default;\n#else\n    bool operator==( RayTracingPipelineClusterAccelerationStructureCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( allowClusterAccelerationStructure == rhs.allowClusterAccelerationStructure );\n#  endif\n    }\n\n    bool operator!=( RayTracingPipelineClusterAccelerationStructureCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                             = StructureType::eRayTracingPipelineClusterAccelerationStructureCreateInfoNV;\n    void *                              pNext                             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        allowClusterAccelerationStructure = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRayTracingPipelineClusterAccelerationStructureCreateInfoNV>\n  {\n    using Type = RayTracingPipelineClusterAccelerationStructureCreateInfoNV;\n  };\n\n  struct RayTracingShaderGroupCreateInfoKHR\n  {\n    using NativeType = VkRayTracingShaderGroupCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRayTracingShaderGroupCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR RayTracingShaderGroupCreateInfoKHR(\n      VULKAN_HPP_NAMESPACE::RayTracingShaderGroupTypeKHR type_                            = VULKAN_HPP_NAMESPACE::RayTracingShaderGroupTypeKHR::eGeneral,\n      uint32_t                                           generalShader_                   = VULKAN_HPP_NAMESPACE::ShaderUnusedKHR,\n      uint32_t                                           closestHitShader_                = VULKAN_HPP_NAMESPACE::ShaderUnusedKHR,\n      uint32_t                                           anyHitShader_                    = VULKAN_HPP_NAMESPACE::ShaderUnusedKHR,\n      uint32_t                                           intersectionShader_              = VULKAN_HPP_NAMESPACE::ShaderUnusedKHR,\n      const void *                                       pShaderGroupCaptureReplayHandle_ = {},\n      const void *                                       pNext_                           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , type{ type_ }\n      , generalShader{ generalShader_ }\n      , closestHitShader{ closestHitShader_ }\n      , anyHitShader{ anyHitShader_ }\n      , intersectionShader{ intersectionShader_ }\n      , pShaderGroupCaptureReplayHandle{ pShaderGroupCaptureReplayHandle_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RayTracingShaderGroupCreateInfoKHR( RayTracingShaderGroupCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RayTracingShaderGroupCreateInfoKHR( VkRayTracingShaderGroupCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RayTracingShaderGroupCreateInfoKHR( *reinterpret_cast<RayTracingShaderGroupCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    RayTracingShaderGroupCreateInfoKHR & operator=( RayTracingShaderGroupCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RayTracingShaderGroupCreateInfoKHR & operator=( VkRayTracingShaderGroupCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RayTracingShaderGroupCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingShaderGroupCreateInfoKHR & setType( VULKAN_HPP_NAMESPACE::RayTracingShaderGroupTypeKHR type_ ) VULKAN_HPP_NOEXCEPT\n    {\n      type = type_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingShaderGroupCreateInfoKHR & setGeneralShader( uint32_t generalShader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      generalShader = generalShader_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingShaderGroupCreateInfoKHR & setClosestHitShader( uint32_t closestHitShader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      closestHitShader = closestHitShader_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingShaderGroupCreateInfoKHR & setAnyHitShader( uint32_t anyHitShader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      anyHitShader = anyHitShader_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingShaderGroupCreateInfoKHR & setIntersectionShader( uint32_t intersectionShader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      intersectionShader = intersectionShader_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingShaderGroupCreateInfoKHR &\n      setPShaderGroupCaptureReplayHandle( const void * pShaderGroupCaptureReplayHandle_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pShaderGroupCaptureReplayHandle = pShaderGroupCaptureReplayHandle_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRayTracingShaderGroupCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRayTracingShaderGroupCreateInfoKHR *>( this );\n    }\n\n    operator VkRayTracingShaderGroupCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRayTracingShaderGroupCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::RayTracingShaderGroupTypeKHR const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               const void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, type, generalShader, closestHitShader, anyHitShader, intersectionShader, pShaderGroupCaptureReplayHandle );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RayTracingShaderGroupCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( RayTracingShaderGroupCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( type == rhs.type ) && ( generalShader == rhs.generalShader ) &&\n             ( closestHitShader == rhs.closestHitShader ) && ( anyHitShader == rhs.anyHitShader ) && ( intersectionShader == rhs.intersectionShader ) &&\n             ( pShaderGroupCaptureReplayHandle == rhs.pShaderGroupCaptureReplayHandle );\n#  endif\n    }\n\n    bool operator!=( RayTracingShaderGroupCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                sType                           = StructureType::eRayTracingShaderGroupCreateInfoKHR;\n    const void *                                       pNext                           = {};\n    VULKAN_HPP_NAMESPACE::RayTracingShaderGroupTypeKHR type                            = VULKAN_HPP_NAMESPACE::RayTracingShaderGroupTypeKHR::eGeneral;\n    uint32_t                                           generalShader                   = VULKAN_HPP_NAMESPACE::ShaderUnusedKHR;\n    uint32_t                                           closestHitShader                = VULKAN_HPP_NAMESPACE::ShaderUnusedKHR;\n    uint32_t                                           anyHitShader                    = VULKAN_HPP_NAMESPACE::ShaderUnusedKHR;\n    uint32_t                                           intersectionShader              = VULKAN_HPP_NAMESPACE::ShaderUnusedKHR;\n    const void *                                       pShaderGroupCaptureReplayHandle = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRayTracingShaderGroupCreateInfoKHR>\n  {\n    using Type = RayTracingShaderGroupCreateInfoKHR;\n  };\n\n  struct RayTracingPipelineInterfaceCreateInfoKHR\n  {\n    using NativeType = VkRayTracingPipelineInterfaceCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRayTracingPipelineInterfaceCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR RayTracingPipelineInterfaceCreateInfoKHR( uint32_t     maxPipelineRayPayloadSize_      = {},\n                                                                   uint32_t     maxPipelineRayHitAttributeSize_ = {},\n                                                                   const void * pNext_                          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxPipelineRayPayloadSize{ maxPipelineRayPayloadSize_ }\n      , maxPipelineRayHitAttributeSize{ maxPipelineRayHitAttributeSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RayTracingPipelineInterfaceCreateInfoKHR( RayTracingPipelineInterfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RayTracingPipelineInterfaceCreateInfoKHR( VkRayTracingPipelineInterfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RayTracingPipelineInterfaceCreateInfoKHR( *reinterpret_cast<RayTracingPipelineInterfaceCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    RayTracingPipelineInterfaceCreateInfoKHR & operator=( RayTracingPipelineInterfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RayTracingPipelineInterfaceCreateInfoKHR & operator=( VkRayTracingPipelineInterfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RayTracingPipelineInterfaceCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineInterfaceCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineInterfaceCreateInfoKHR & setMaxPipelineRayPayloadSize( uint32_t maxPipelineRayPayloadSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxPipelineRayPayloadSize = maxPipelineRayPayloadSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineInterfaceCreateInfoKHR &\n      setMaxPipelineRayHitAttributeSize( uint32_t maxPipelineRayHitAttributeSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxPipelineRayHitAttributeSize = maxPipelineRayHitAttributeSize_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRayTracingPipelineInterfaceCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRayTracingPipelineInterfaceCreateInfoKHR *>( this );\n    }\n\n    operator VkRayTracingPipelineInterfaceCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRayTracingPipelineInterfaceCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxPipelineRayPayloadSize, maxPipelineRayHitAttributeSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RayTracingPipelineInterfaceCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( RayTracingPipelineInterfaceCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxPipelineRayPayloadSize == rhs.maxPipelineRayPayloadSize ) &&\n             ( maxPipelineRayHitAttributeSize == rhs.maxPipelineRayHitAttributeSize );\n#  endif\n    }\n\n    bool operator!=( RayTracingPipelineInterfaceCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                          = StructureType::eRayTracingPipelineInterfaceCreateInfoKHR;\n    const void *                        pNext                          = {};\n    uint32_t                            maxPipelineRayPayloadSize      = {};\n    uint32_t                            maxPipelineRayHitAttributeSize = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRayTracingPipelineInterfaceCreateInfoKHR>\n  {\n    using Type = RayTracingPipelineInterfaceCreateInfoKHR;\n  };\n\n  struct RayTracingPipelineCreateInfoKHR\n  {\n    using NativeType = VkRayTracingPipelineCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRayTracingPipelineCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR RayTracingPipelineCreateInfoKHR( VULKAN_HPP_NAMESPACE::PipelineCreateFlags                        flags_                        = {},\n                                                          uint32_t                                                         stageCount_                   = {},\n                                                          const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo *      pStages_                      = {},\n                                                          uint32_t                                                         groupCount_                   = {},\n                                                          const VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoKHR * pGroups_                      = {},\n                                                          uint32_t                                                         maxPipelineRayRecursionDepth_ = {},\n                                                          const VULKAN_HPP_NAMESPACE::PipelineLibraryCreateInfoKHR *       pLibraryInfo_                 = {},\n                                                          const VULKAN_HPP_NAMESPACE::RayTracingPipelineInterfaceCreateInfoKHR * pLibraryInterface_      = {},\n                                                          const VULKAN_HPP_NAMESPACE::PipelineDynamicStateCreateInfo *           pDynamicState_          = {},\n                                                          VULKAN_HPP_NAMESPACE::PipelineLayout                                   layout_                 = {},\n                                                          VULKAN_HPP_NAMESPACE::Pipeline                                         basePipelineHandle_     = {},\n                                                          int32_t                                                                basePipelineIndex_      = {},\n                                                          const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , stageCount{ stageCount_ }\n      , pStages{ pStages_ }\n      , groupCount{ groupCount_ }\n      , pGroups{ pGroups_ }\n      , maxPipelineRayRecursionDepth{ maxPipelineRayRecursionDepth_ }\n      , pLibraryInfo{ pLibraryInfo_ }\n      , pLibraryInterface{ pLibraryInterface_ }\n      , pDynamicState{ pDynamicState_ }\n      , layout{ layout_ }\n      , basePipelineHandle{ basePipelineHandle_ }\n      , basePipelineIndex{ basePipelineIndex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RayTracingPipelineCreateInfoKHR( RayTracingPipelineCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RayTracingPipelineCreateInfoKHR( VkRayTracingPipelineCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RayTracingPipelineCreateInfoKHR( *reinterpret_cast<RayTracingPipelineCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RayTracingPipelineCreateInfoKHR(\n      VULKAN_HPP_NAMESPACE::PipelineCreateFlags                                                                             flags_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo> const &      stages_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoKHR> const & groups_                       = {},\n      uint32_t                                                                                                              maxPipelineRayRecursionDepth_ = {},\n      const VULKAN_HPP_NAMESPACE::PipelineLibraryCreateInfoKHR *                                                            pLibraryInfo_                 = {},\n      const VULKAN_HPP_NAMESPACE::RayTracingPipelineInterfaceCreateInfoKHR *                                                pLibraryInterface_            = {},\n      const VULKAN_HPP_NAMESPACE::PipelineDynamicStateCreateInfo *                                                          pDynamicState_                = {},\n      VULKAN_HPP_NAMESPACE::PipelineLayout                                                                                  layout_                       = {},\n      VULKAN_HPP_NAMESPACE::Pipeline                                                                                        basePipelineHandle_           = {},\n      int32_t                                                                                                               basePipelineIndex_            = {},\n      const void *                                                                                                          pNext_ = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , stageCount( static_cast<uint32_t>( stages_.size() ) )\n      , pStages( stages_.data() )\n      , groupCount( static_cast<uint32_t>( groups_.size() ) )\n      , pGroups( groups_.data() )\n      , maxPipelineRayRecursionDepth( maxPipelineRayRecursionDepth_ )\n      , pLibraryInfo( pLibraryInfo_ )\n      , pLibraryInterface( pLibraryInterface_ )\n      , pDynamicState( pDynamicState_ )\n      , layout( layout_ )\n      , basePipelineHandle( basePipelineHandle_ )\n      , basePipelineIndex( basePipelineIndex_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    RayTracingPipelineCreateInfoKHR & operator=( RayTracingPipelineCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RayTracingPipelineCreateInfoKHR & operator=( VkRayTracingPipelineCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineCreateInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::PipelineCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineCreateInfoKHR & setStageCount( uint32_t stageCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stageCount = stageCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineCreateInfoKHR &\n      setPStages( const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo * pStages_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStages = pStages_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RayTracingPipelineCreateInfoKHR &\n      setStages( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo> const & stages_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stageCount = static_cast<uint32_t>( stages_.size() );\n      pStages    = stages_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineCreateInfoKHR & setGroupCount( uint32_t groupCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      groupCount = groupCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineCreateInfoKHR &\n      setPGroups( const VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoKHR * pGroups_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pGroups = pGroups_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RayTracingPipelineCreateInfoKHR & setGroups(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoKHR> const & groups_ ) VULKAN_HPP_NOEXCEPT\n    {\n      groupCount = static_cast<uint32_t>( groups_.size() );\n      pGroups    = groups_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineCreateInfoKHR & setMaxPipelineRayRecursionDepth( uint32_t maxPipelineRayRecursionDepth_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxPipelineRayRecursionDepth = maxPipelineRayRecursionDepth_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineCreateInfoKHR &\n      setPLibraryInfo( const VULKAN_HPP_NAMESPACE::PipelineLibraryCreateInfoKHR * pLibraryInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pLibraryInfo = pLibraryInfo_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineCreateInfoKHR &\n      setPLibraryInterface( const VULKAN_HPP_NAMESPACE::RayTracingPipelineInterfaceCreateInfoKHR * pLibraryInterface_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pLibraryInterface = pLibraryInterface_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineCreateInfoKHR &\n      setPDynamicState( const VULKAN_HPP_NAMESPACE::PipelineDynamicStateCreateInfo * pDynamicState_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDynamicState = pDynamicState_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineCreateInfoKHR & setLayout( VULKAN_HPP_NAMESPACE::PipelineLayout layout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layout = layout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineCreateInfoKHR & setBasePipelineHandle( VULKAN_HPP_NAMESPACE::Pipeline basePipelineHandle_ ) VULKAN_HPP_NOEXCEPT\n    {\n      basePipelineHandle = basePipelineHandle_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineCreateInfoKHR & setBasePipelineIndex( int32_t basePipelineIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      basePipelineIndex = basePipelineIndex_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRayTracingPipelineCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRayTracingPipelineCreateInfoKHR *>( this );\n    }\n\n    operator VkRayTracingPipelineCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRayTracingPipelineCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineCreateFlags const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoKHR * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::PipelineLibraryCreateInfoKHR * const &,\n               const VULKAN_HPP_NAMESPACE::RayTracingPipelineInterfaceCreateInfoKHR * const &,\n               const VULKAN_HPP_NAMESPACE::PipelineDynamicStateCreateInfo * const &,\n               VULKAN_HPP_NAMESPACE::PipelineLayout const &,\n               VULKAN_HPP_NAMESPACE::Pipeline const &,\n               int32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       flags,\n                       stageCount,\n                       pStages,\n                       groupCount,\n                       pGroups,\n                       maxPipelineRayRecursionDepth,\n                       pLibraryInfo,\n                       pLibraryInterface,\n                       pDynamicState,\n                       layout,\n                       basePipelineHandle,\n                       basePipelineIndex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RayTracingPipelineCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( RayTracingPipelineCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( stageCount == rhs.stageCount ) && ( pStages == rhs.pStages ) &&\n             ( groupCount == rhs.groupCount ) && ( pGroups == rhs.pGroups ) && ( maxPipelineRayRecursionDepth == rhs.maxPipelineRayRecursionDepth ) &&\n             ( pLibraryInfo == rhs.pLibraryInfo ) && ( pLibraryInterface == rhs.pLibraryInterface ) && ( pDynamicState == rhs.pDynamicState ) &&\n             ( layout == rhs.layout ) && ( basePipelineHandle == rhs.basePipelineHandle ) && ( basePipelineIndex == rhs.basePipelineIndex );\n#  endif\n    }\n\n    bool operator!=( RayTracingPipelineCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                    sType                        = StructureType::eRayTracingPipelineCreateInfoKHR;\n    const void *                                                           pNext                        = {};\n    VULKAN_HPP_NAMESPACE::PipelineCreateFlags                              flags                        = {};\n    uint32_t                                                               stageCount                   = {};\n    const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo *            pStages                      = {};\n    uint32_t                                                               groupCount                   = {};\n    const VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoKHR *       pGroups                      = {};\n    uint32_t                                                               maxPipelineRayRecursionDepth = {};\n    const VULKAN_HPP_NAMESPACE::PipelineLibraryCreateInfoKHR *             pLibraryInfo                 = {};\n    const VULKAN_HPP_NAMESPACE::RayTracingPipelineInterfaceCreateInfoKHR * pLibraryInterface            = {};\n    const VULKAN_HPP_NAMESPACE::PipelineDynamicStateCreateInfo *           pDynamicState                = {};\n    VULKAN_HPP_NAMESPACE::PipelineLayout                                   layout                       = {};\n    VULKAN_HPP_NAMESPACE::Pipeline                                         basePipelineHandle           = {};\n    int32_t                                                                basePipelineIndex            = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRayTracingPipelineCreateInfoKHR>\n  {\n    using Type = RayTracingPipelineCreateInfoKHR;\n  };\n\n  struct RayTracingShaderGroupCreateInfoNV\n  {\n    using NativeType = VkRayTracingShaderGroupCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRayTracingShaderGroupCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR RayTracingShaderGroupCreateInfoNV(\n      VULKAN_HPP_NAMESPACE::RayTracingShaderGroupTypeKHR type_               = VULKAN_HPP_NAMESPACE::RayTracingShaderGroupTypeKHR::eGeneral,\n      uint32_t                                           generalShader_      = VULKAN_HPP_NAMESPACE::ShaderUnusedNV,\n      uint32_t                                           closestHitShader_   = VULKAN_HPP_NAMESPACE::ShaderUnusedNV,\n      uint32_t                                           anyHitShader_       = VULKAN_HPP_NAMESPACE::ShaderUnusedNV,\n      uint32_t                                           intersectionShader_ = VULKAN_HPP_NAMESPACE::ShaderUnusedNV,\n      const void *                                       pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , type{ type_ }\n      , generalShader{ generalShader_ }\n      , closestHitShader{ closestHitShader_ }\n      , anyHitShader{ anyHitShader_ }\n      , intersectionShader{ intersectionShader_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RayTracingShaderGroupCreateInfoNV( RayTracingShaderGroupCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RayTracingShaderGroupCreateInfoNV( VkRayTracingShaderGroupCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RayTracingShaderGroupCreateInfoNV( *reinterpret_cast<RayTracingShaderGroupCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n    RayTracingShaderGroupCreateInfoNV & operator=( RayTracingShaderGroupCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RayTracingShaderGroupCreateInfoNV & operator=( VkRayTracingShaderGroupCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RayTracingShaderGroupCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingShaderGroupCreateInfoNV & setType( VULKAN_HPP_NAMESPACE::RayTracingShaderGroupTypeKHR type_ ) VULKAN_HPP_NOEXCEPT\n    {\n      type = type_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingShaderGroupCreateInfoNV & setGeneralShader( uint32_t generalShader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      generalShader = generalShader_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingShaderGroupCreateInfoNV & setClosestHitShader( uint32_t closestHitShader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      closestHitShader = closestHitShader_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingShaderGroupCreateInfoNV & setAnyHitShader( uint32_t anyHitShader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      anyHitShader = anyHitShader_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingShaderGroupCreateInfoNV & setIntersectionShader( uint32_t intersectionShader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      intersectionShader = intersectionShader_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRayTracingShaderGroupCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRayTracingShaderGroupCreateInfoNV *>( this );\n    }\n\n    operator VkRayTracingShaderGroupCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRayTracingShaderGroupCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::RayTracingShaderGroupTypeKHR const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, type, generalShader, closestHitShader, anyHitShader, intersectionShader );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RayTracingShaderGroupCreateInfoNV const & ) const = default;\n#else\n    bool operator==( RayTracingShaderGroupCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( type == rhs.type ) && ( generalShader == rhs.generalShader ) &&\n             ( closestHitShader == rhs.closestHitShader ) && ( anyHitShader == rhs.anyHitShader ) && ( intersectionShader == rhs.intersectionShader );\n#  endif\n    }\n\n    bool operator!=( RayTracingShaderGroupCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                sType              = StructureType::eRayTracingShaderGroupCreateInfoNV;\n    const void *                                       pNext              = {};\n    VULKAN_HPP_NAMESPACE::RayTracingShaderGroupTypeKHR type               = VULKAN_HPP_NAMESPACE::RayTracingShaderGroupTypeKHR::eGeneral;\n    uint32_t                                           generalShader      = VULKAN_HPP_NAMESPACE::ShaderUnusedNV;\n    uint32_t                                           closestHitShader   = VULKAN_HPP_NAMESPACE::ShaderUnusedNV;\n    uint32_t                                           anyHitShader       = VULKAN_HPP_NAMESPACE::ShaderUnusedNV;\n    uint32_t                                           intersectionShader = VULKAN_HPP_NAMESPACE::ShaderUnusedNV;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRayTracingShaderGroupCreateInfoNV>\n  {\n    using Type = RayTracingShaderGroupCreateInfoNV;\n  };\n\n  struct RayTracingPipelineCreateInfoNV\n  {\n    using NativeType = VkRayTracingPipelineCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRayTracingPipelineCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR RayTracingPipelineCreateInfoNV( VULKAN_HPP_NAMESPACE::PipelineCreateFlags                       flags_              = {},\n                                                         uint32_t                                                        stageCount_         = {},\n                                                         const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo *     pStages_            = {},\n                                                         uint32_t                                                        groupCount_         = {},\n                                                         const VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoNV * pGroups_            = {},\n                                                         uint32_t                                                        maxRecursionDepth_  = {},\n                                                         VULKAN_HPP_NAMESPACE::PipelineLayout                            layout_             = {},\n                                                         VULKAN_HPP_NAMESPACE::Pipeline                                  basePipelineHandle_ = {},\n                                                         int32_t                                                         basePipelineIndex_  = {},\n                                                         const void *                                                    pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , stageCount{ stageCount_ }\n      , pStages{ pStages_ }\n      , groupCount{ groupCount_ }\n      , pGroups{ pGroups_ }\n      , maxRecursionDepth{ maxRecursionDepth_ }\n      , layout{ layout_ }\n      , basePipelineHandle{ basePipelineHandle_ }\n      , basePipelineIndex{ basePipelineIndex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RayTracingPipelineCreateInfoNV( RayTracingPipelineCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RayTracingPipelineCreateInfoNV( VkRayTracingPipelineCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RayTracingPipelineCreateInfoNV( *reinterpret_cast<RayTracingPipelineCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RayTracingPipelineCreateInfoNV(\n      VULKAN_HPP_NAMESPACE::PipelineCreateFlags                                                                            flags_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo> const &     stages_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoNV> const & groups_             = {},\n      uint32_t                                                                                                             maxRecursionDepth_  = {},\n      VULKAN_HPP_NAMESPACE::PipelineLayout                                                                                 layout_             = {},\n      VULKAN_HPP_NAMESPACE::Pipeline                                                                                       basePipelineHandle_ = {},\n      int32_t                                                                                                              basePipelineIndex_  = {},\n      const void *                                                                                                         pNext_              = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , stageCount( static_cast<uint32_t>( stages_.size() ) )\n      , pStages( stages_.data() )\n      , groupCount( static_cast<uint32_t>( groups_.size() ) )\n      , pGroups( groups_.data() )\n      , maxRecursionDepth( maxRecursionDepth_ )\n      , layout( layout_ )\n      , basePipelineHandle( basePipelineHandle_ )\n      , basePipelineIndex( basePipelineIndex_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    RayTracingPipelineCreateInfoNV & operator=( RayTracingPipelineCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RayTracingPipelineCreateInfoNV & operator=( VkRayTracingPipelineCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineCreateInfoNV & setFlags( VULKAN_HPP_NAMESPACE::PipelineCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineCreateInfoNV & setStageCount( uint32_t stageCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stageCount = stageCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineCreateInfoNV &\n      setPStages( const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo * pStages_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStages = pStages_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RayTracingPipelineCreateInfoNV &\n      setStages( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo> const & stages_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stageCount = static_cast<uint32_t>( stages_.size() );\n      pStages    = stages_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineCreateInfoNV & setGroupCount( uint32_t groupCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      groupCount = groupCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineCreateInfoNV &\n      setPGroups( const VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoNV * pGroups_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pGroups = pGroups_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RayTracingPipelineCreateInfoNV & setGroups(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoNV> const & groups_ ) VULKAN_HPP_NOEXCEPT\n    {\n      groupCount = static_cast<uint32_t>( groups_.size() );\n      pGroups    = groups_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineCreateInfoNV & setMaxRecursionDepth( uint32_t maxRecursionDepth_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxRecursionDepth = maxRecursionDepth_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineCreateInfoNV & setLayout( VULKAN_HPP_NAMESPACE::PipelineLayout layout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layout = layout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineCreateInfoNV & setBasePipelineHandle( VULKAN_HPP_NAMESPACE::Pipeline basePipelineHandle_ ) VULKAN_HPP_NOEXCEPT\n    {\n      basePipelineHandle = basePipelineHandle_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RayTracingPipelineCreateInfoNV & setBasePipelineIndex( int32_t basePipelineIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      basePipelineIndex = basePipelineIndex_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRayTracingPipelineCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRayTracingPipelineCreateInfoNV *>( this );\n    }\n\n    operator VkRayTracingPipelineCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRayTracingPipelineCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PipelineCreateFlags const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoNV * const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::PipelineLayout const &,\n               VULKAN_HPP_NAMESPACE::Pipeline const &,\n               int32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, stageCount, pStages, groupCount, pGroups, maxRecursionDepth, layout, basePipelineHandle, basePipelineIndex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RayTracingPipelineCreateInfoNV const & ) const = default;\n#else\n    bool operator==( RayTracingPipelineCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( stageCount == rhs.stageCount ) && ( pStages == rhs.pStages ) &&\n             ( groupCount == rhs.groupCount ) && ( pGroups == rhs.pGroups ) && ( maxRecursionDepth == rhs.maxRecursionDepth ) && ( layout == rhs.layout ) &&\n             ( basePipelineHandle == rhs.basePipelineHandle ) && ( basePipelineIndex == rhs.basePipelineIndex );\n#  endif\n    }\n\n    bool operator!=( RayTracingPipelineCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                             sType              = StructureType::eRayTracingPipelineCreateInfoNV;\n    const void *                                                    pNext              = {};\n    VULKAN_HPP_NAMESPACE::PipelineCreateFlags                       flags              = {};\n    uint32_t                                                        stageCount         = {};\n    const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo *     pStages            = {};\n    uint32_t                                                        groupCount         = {};\n    const VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoNV * pGroups            = {};\n    uint32_t                                                        maxRecursionDepth  = {};\n    VULKAN_HPP_NAMESPACE::PipelineLayout                            layout             = {};\n    VULKAN_HPP_NAMESPACE::Pipeline                                  basePipelineHandle = {};\n    int32_t                                                         basePipelineIndex  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRayTracingPipelineCreateInfoNV>\n  {\n    using Type = RayTracingPipelineCreateInfoNV;\n  };\n\n  struct RefreshCycleDurationGOOGLE\n  {\n    using NativeType = VkRefreshCycleDurationGOOGLE;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR RefreshCycleDurationGOOGLE( uint64_t refreshDuration_ = {} ) VULKAN_HPP_NOEXCEPT : refreshDuration{ refreshDuration_ } {}\n\n    VULKAN_HPP_CONSTEXPR RefreshCycleDurationGOOGLE( RefreshCycleDurationGOOGLE const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RefreshCycleDurationGOOGLE( VkRefreshCycleDurationGOOGLE const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RefreshCycleDurationGOOGLE( *reinterpret_cast<RefreshCycleDurationGOOGLE const *>( &rhs ) )\n    {\n    }\n\n    RefreshCycleDurationGOOGLE & operator=( RefreshCycleDurationGOOGLE const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RefreshCycleDurationGOOGLE & operator=( VkRefreshCycleDurationGOOGLE const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RefreshCycleDurationGOOGLE const *>( &rhs );\n      return *this;\n    }\n\n    operator VkRefreshCycleDurationGOOGLE const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRefreshCycleDurationGOOGLE *>( this );\n    }\n\n    operator VkRefreshCycleDurationGOOGLE &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRefreshCycleDurationGOOGLE *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( refreshDuration );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RefreshCycleDurationGOOGLE const & ) const = default;\n#else\n    bool operator==( RefreshCycleDurationGOOGLE const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( refreshDuration == rhs.refreshDuration );\n#  endif\n    }\n\n    bool operator!=( RefreshCycleDurationGOOGLE const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint64_t refreshDuration = {};\n  };\n\n  struct ReleaseCapturedPipelineDataInfoKHR\n  {\n    using NativeType = VkReleaseCapturedPipelineDataInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eReleaseCapturedPipelineDataInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ReleaseCapturedPipelineDataInfoKHR( VULKAN_HPP_NAMESPACE::Pipeline pipeline_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pipeline{ pipeline_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ReleaseCapturedPipelineDataInfoKHR( ReleaseCapturedPipelineDataInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ReleaseCapturedPipelineDataInfoKHR( VkReleaseCapturedPipelineDataInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ReleaseCapturedPipelineDataInfoKHR( *reinterpret_cast<ReleaseCapturedPipelineDataInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    ReleaseCapturedPipelineDataInfoKHR & operator=( ReleaseCapturedPipelineDataInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ReleaseCapturedPipelineDataInfoKHR & operator=( VkReleaseCapturedPipelineDataInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ReleaseCapturedPipelineDataInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ReleaseCapturedPipelineDataInfoKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ReleaseCapturedPipelineDataInfoKHR & setPipeline( VULKAN_HPP_NAMESPACE::Pipeline pipeline_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipeline = pipeline_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkReleaseCapturedPipelineDataInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkReleaseCapturedPipelineDataInfoKHR *>( this );\n    }\n\n    operator VkReleaseCapturedPipelineDataInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkReleaseCapturedPipelineDataInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Pipeline const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pipeline );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ReleaseCapturedPipelineDataInfoKHR const & ) const = default;\n#else\n    bool operator==( ReleaseCapturedPipelineDataInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pipeline == rhs.pipeline );\n#  endif\n    }\n\n    bool operator!=( ReleaseCapturedPipelineDataInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType    = StructureType::eReleaseCapturedPipelineDataInfoKHR;\n    void *                              pNext    = {};\n    VULKAN_HPP_NAMESPACE::Pipeline      pipeline = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eReleaseCapturedPipelineDataInfoKHR>\n  {\n    using Type = ReleaseCapturedPipelineDataInfoKHR;\n  };\n\n  struct ReleaseSwapchainImagesInfoEXT\n  {\n    using NativeType = VkReleaseSwapchainImagesInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eReleaseSwapchainImagesInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ReleaseSwapchainImagesInfoEXT( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain_       = {},\n                                                        uint32_t                           imageIndexCount_ = {},\n                                                        const uint32_t *                   pImageIndices_   = {},\n                                                        const void *                       pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , swapchain{ swapchain_ }\n      , imageIndexCount{ imageIndexCount_ }\n      , pImageIndices{ pImageIndices_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ReleaseSwapchainImagesInfoEXT( ReleaseSwapchainImagesInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ReleaseSwapchainImagesInfoEXT( VkReleaseSwapchainImagesInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ReleaseSwapchainImagesInfoEXT( *reinterpret_cast<ReleaseSwapchainImagesInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ReleaseSwapchainImagesInfoEXT( VULKAN_HPP_NAMESPACE::SwapchainKHR                                    swapchain_,\n                                   VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & imageIndices_,\n                                   const void *                                                          pNext_ = nullptr )\n      : pNext( pNext_ ), swapchain( swapchain_ ), imageIndexCount( static_cast<uint32_t>( imageIndices_.size() ) ), pImageIndices( imageIndices_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    ReleaseSwapchainImagesInfoEXT & operator=( ReleaseSwapchainImagesInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ReleaseSwapchainImagesInfoEXT & operator=( VkReleaseSwapchainImagesInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ReleaseSwapchainImagesInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ReleaseSwapchainImagesInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ReleaseSwapchainImagesInfoEXT & setSwapchain( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain_ ) VULKAN_HPP_NOEXCEPT\n    {\n      swapchain = swapchain_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ReleaseSwapchainImagesInfoEXT & setImageIndexCount( uint32_t imageIndexCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageIndexCount = imageIndexCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ReleaseSwapchainImagesInfoEXT & setPImageIndices( const uint32_t * pImageIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pImageIndices = pImageIndices_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ReleaseSwapchainImagesInfoEXT & setImageIndices( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & imageIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageIndexCount = static_cast<uint32_t>( imageIndices_.size() );\n      pImageIndices   = imageIndices_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkReleaseSwapchainImagesInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkReleaseSwapchainImagesInfoEXT *>( this );\n    }\n\n    operator VkReleaseSwapchainImagesInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkReleaseSwapchainImagesInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::SwapchainKHR const &,\n               uint32_t const &,\n               const uint32_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, swapchain, imageIndexCount, pImageIndices );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ReleaseSwapchainImagesInfoEXT const & ) const = default;\n#else\n    bool operator==( ReleaseSwapchainImagesInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( swapchain == rhs.swapchain ) && ( imageIndexCount == rhs.imageIndexCount ) &&\n             ( pImageIndices == rhs.pImageIndices );\n#  endif\n    }\n\n    bool operator!=( ReleaseSwapchainImagesInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType           = StructureType::eReleaseSwapchainImagesInfoEXT;\n    const void *                        pNext           = {};\n    VULKAN_HPP_NAMESPACE::SwapchainKHR  swapchain       = {};\n    uint32_t                            imageIndexCount = {};\n    const uint32_t *                    pImageIndices   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eReleaseSwapchainImagesInfoEXT>\n  {\n    using Type = ReleaseSwapchainImagesInfoEXT;\n  };\n\n  struct RenderPassAttachmentBeginInfo\n  {\n    using NativeType = VkRenderPassAttachmentBeginInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRenderPassAttachmentBeginInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR RenderPassAttachmentBeginInfo( uint32_t                                attachmentCount_ = {},\n                                                        const VULKAN_HPP_NAMESPACE::ImageView * pAttachments_    = {},\n                                                        const void *                            pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , attachmentCount{ attachmentCount_ }\n      , pAttachments{ pAttachments_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RenderPassAttachmentBeginInfo( RenderPassAttachmentBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderPassAttachmentBeginInfo( VkRenderPassAttachmentBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RenderPassAttachmentBeginInfo( *reinterpret_cast<RenderPassAttachmentBeginInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassAttachmentBeginInfo( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageView> const & attachments_,\n                                   const void *                                                                                 pNext_ = nullptr )\n      : pNext( pNext_ ), attachmentCount( static_cast<uint32_t>( attachments_.size() ) ), pAttachments( attachments_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    RenderPassAttachmentBeginInfo & operator=( RenderPassAttachmentBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderPassAttachmentBeginInfo & operator=( VkRenderPassAttachmentBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderPassAttachmentBeginInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RenderPassAttachmentBeginInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassAttachmentBeginInfo & setAttachmentCount( uint32_t attachmentCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      attachmentCount = attachmentCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassAttachmentBeginInfo & setPAttachments( const VULKAN_HPP_NAMESPACE::ImageView * pAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pAttachments = pAttachments_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassAttachmentBeginInfo &\n      setAttachments( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageView> const & attachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      attachmentCount = static_cast<uint32_t>( attachments_.size() );\n      pAttachments    = attachments_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRenderPassAttachmentBeginInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderPassAttachmentBeginInfo *>( this );\n    }\n\n    operator VkRenderPassAttachmentBeginInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderPassAttachmentBeginInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::ImageView * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, attachmentCount, pAttachments );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RenderPassAttachmentBeginInfo const & ) const = default;\n#else\n    bool operator==( RenderPassAttachmentBeginInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( attachmentCount == rhs.attachmentCount ) && ( pAttachments == rhs.pAttachments );\n#  endif\n    }\n\n    bool operator!=( RenderPassAttachmentBeginInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType     sType           = StructureType::eRenderPassAttachmentBeginInfo;\n    const void *                            pNext           = {};\n    uint32_t                                attachmentCount = {};\n    const VULKAN_HPP_NAMESPACE::ImageView * pAttachments    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRenderPassAttachmentBeginInfo>\n  {\n    using Type = RenderPassAttachmentBeginInfo;\n  };\n\n  using RenderPassAttachmentBeginInfoKHR = RenderPassAttachmentBeginInfo;\n\n  struct RenderPassBeginInfo\n  {\n    using NativeType = VkRenderPassBeginInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRenderPassBeginInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 RenderPassBeginInfo( VULKAN_HPP_NAMESPACE::RenderPass         renderPass_      = {},\n                                                 VULKAN_HPP_NAMESPACE::Framebuffer        framebuffer_     = {},\n                                                 VULKAN_HPP_NAMESPACE::Rect2D             renderArea_      = {},\n                                                 uint32_t                                 clearValueCount_ = {},\n                                                 const VULKAN_HPP_NAMESPACE::ClearValue * pClearValues_    = {},\n                                                 const void *                             pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , renderPass{ renderPass_ }\n      , framebuffer{ framebuffer_ }\n      , renderArea{ renderArea_ }\n      , clearValueCount{ clearValueCount_ }\n      , pClearValues{ pClearValues_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassBeginInfo( RenderPassBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderPassBeginInfo( VkRenderPassBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT : RenderPassBeginInfo( *reinterpret_cast<RenderPassBeginInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassBeginInfo( VULKAN_HPP_NAMESPACE::RenderPass                                                              renderPass_,\n                         VULKAN_HPP_NAMESPACE::Framebuffer                                                             framebuffer_,\n                         VULKAN_HPP_NAMESPACE::Rect2D                                                                  renderArea_,\n                         VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ClearValue> const & clearValues_,\n                         const void *                                                                                  pNext_ = nullptr )\n      : pNext( pNext_ )\n      , renderPass( renderPass_ )\n      , framebuffer( framebuffer_ )\n      , renderArea( renderArea_ )\n      , clearValueCount( static_cast<uint32_t>( clearValues_.size() ) )\n      , pClearValues( clearValues_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    RenderPassBeginInfo & operator=( RenderPassBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderPassBeginInfo & operator=( VkRenderPassBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderPassBeginInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RenderPassBeginInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassBeginInfo & setRenderPass( VULKAN_HPP_NAMESPACE::RenderPass renderPass_ ) VULKAN_HPP_NOEXCEPT\n    {\n      renderPass = renderPass_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassBeginInfo & setFramebuffer( VULKAN_HPP_NAMESPACE::Framebuffer framebuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      framebuffer = framebuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassBeginInfo & setRenderArea( VULKAN_HPP_NAMESPACE::Rect2D const & renderArea_ ) VULKAN_HPP_NOEXCEPT\n    {\n      renderArea = renderArea_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassBeginInfo & setClearValueCount( uint32_t clearValueCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      clearValueCount = clearValueCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassBeginInfo & setPClearValues( const VULKAN_HPP_NAMESPACE::ClearValue * pClearValues_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pClearValues = pClearValues_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassBeginInfo &\n      setClearValues( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ClearValue> const & clearValues_ ) VULKAN_HPP_NOEXCEPT\n    {\n      clearValueCount = static_cast<uint32_t>( clearValues_.size() );\n      pClearValues    = clearValues_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRenderPassBeginInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderPassBeginInfo *>( this );\n    }\n\n    operator VkRenderPassBeginInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderPassBeginInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::RenderPass const &,\n               VULKAN_HPP_NAMESPACE::Framebuffer const &,\n               VULKAN_HPP_NAMESPACE::Rect2D const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::ClearValue * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, renderPass, framebuffer, renderArea, clearValueCount, pClearValues );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RenderPassBeginInfo const & ) const = default;\n#else\n    bool operator==( RenderPassBeginInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( renderPass == rhs.renderPass ) && ( framebuffer == rhs.framebuffer ) &&\n             ( renderArea == rhs.renderArea ) && ( clearValueCount == rhs.clearValueCount ) && ( pClearValues == rhs.pClearValues );\n#  endif\n    }\n\n    bool operator!=( RenderPassBeginInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType      sType           = StructureType::eRenderPassBeginInfo;\n    const void *                             pNext           = {};\n    VULKAN_HPP_NAMESPACE::RenderPass         renderPass      = {};\n    VULKAN_HPP_NAMESPACE::Framebuffer        framebuffer     = {};\n    VULKAN_HPP_NAMESPACE::Rect2D             renderArea      = {};\n    uint32_t                                 clearValueCount = {};\n    const VULKAN_HPP_NAMESPACE::ClearValue * pClearValues    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRenderPassBeginInfo>\n  {\n    using Type = RenderPassBeginInfo;\n  };\n\n  struct SubpassDescription\n  {\n    using NativeType = VkSubpassDescription;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SubpassDescription( VULKAN_HPP_NAMESPACE::SubpassDescriptionFlags flags_          = {},\n                                             VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint_    = VULKAN_HPP_NAMESPACE::PipelineBindPoint::eGraphics,\n                                             uint32_t                                inputAttachmentCount_ = {},\n                                             const VULKAN_HPP_NAMESPACE::AttachmentReference * pInputAttachments_       = {},\n                                             uint32_t                                          colorAttachmentCount_    = {},\n                                             const VULKAN_HPP_NAMESPACE::AttachmentReference * pColorAttachments_       = {},\n                                             const VULKAN_HPP_NAMESPACE::AttachmentReference * pResolveAttachments_     = {},\n                                             const VULKAN_HPP_NAMESPACE::AttachmentReference * pDepthStencilAttachment_ = {},\n                                             uint32_t                                          preserveAttachmentCount_ = {},\n                                             const uint32_t *                                  pPreserveAttachments_    = {} ) VULKAN_HPP_NOEXCEPT\n      : flags{ flags_ }\n      , pipelineBindPoint{ pipelineBindPoint_ }\n      , inputAttachmentCount{ inputAttachmentCount_ }\n      , pInputAttachments{ pInputAttachments_ }\n      , colorAttachmentCount{ colorAttachmentCount_ }\n      , pColorAttachments{ pColorAttachments_ }\n      , pResolveAttachments{ pResolveAttachments_ }\n      , pDepthStencilAttachment{ pDepthStencilAttachment_ }\n      , preserveAttachmentCount{ preserveAttachmentCount_ }\n      , pPreserveAttachments{ pPreserveAttachments_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SubpassDescription( SubpassDescription const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SubpassDescription( VkSubpassDescription const & rhs ) VULKAN_HPP_NOEXCEPT : SubpassDescription( *reinterpret_cast<SubpassDescription const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SubpassDescription( VULKAN_HPP_NAMESPACE::SubpassDescriptionFlags                                                          flags_,\n                        VULKAN_HPP_NAMESPACE::PipelineBindPoint                                                                pipelineBindPoint_,\n                        VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentReference> const & inputAttachments_,\n                        VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentReference> const & colorAttachments_        = {},\n                        VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentReference> const & resolveAttachments_      = {},\n                        const VULKAN_HPP_NAMESPACE::AttachmentReference *                                                      pDepthStencilAttachment_ = {},\n                        VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const &                                  preserveAttachments_     = {} )\n      : flags( flags_ )\n      , pipelineBindPoint( pipelineBindPoint_ )\n      , inputAttachmentCount( static_cast<uint32_t>( inputAttachments_.size() ) )\n      , pInputAttachments( inputAttachments_.data() )\n      , colorAttachmentCount( static_cast<uint32_t>( colorAttachments_.size() ) )\n      , pColorAttachments( colorAttachments_.data() )\n      , pResolveAttachments( resolveAttachments_.data() )\n      , pDepthStencilAttachment( pDepthStencilAttachment_ )\n      , preserveAttachmentCount( static_cast<uint32_t>( preserveAttachments_.size() ) )\n      , pPreserveAttachments( preserveAttachments_.data() )\n    {\n#    ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( resolveAttachments_.empty() || ( colorAttachments_.size() == resolveAttachments_.size() ) );\n#    else\n      if ( !resolveAttachments_.empty() && ( colorAttachments_.size() != resolveAttachments_.size() ) )\n      {\n        throw LogicError(\n          VULKAN_HPP_NAMESPACE_STRING\n          \"::SubpassDescription::SubpassDescription: !resolveAttachments_.empty() && ( colorAttachments_.size() != resolveAttachments_.size() )\" );\n      }\n#    endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    SubpassDescription & operator=( SubpassDescription const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SubpassDescription & operator=( VkSubpassDescription const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SubpassDescription const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescription & setFlags( VULKAN_HPP_NAMESPACE::SubpassDescriptionFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescription & setPipelineBindPoint( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineBindPoint = pipelineBindPoint_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescription & setInputAttachmentCount( uint32_t inputAttachmentCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      inputAttachmentCount = inputAttachmentCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescription &\n      setPInputAttachments( const VULKAN_HPP_NAMESPACE::AttachmentReference * pInputAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pInputAttachments = pInputAttachments_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SubpassDescription & setInputAttachments(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentReference> const & inputAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      inputAttachmentCount = static_cast<uint32_t>( inputAttachments_.size() );\n      pInputAttachments    = inputAttachments_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescription & setColorAttachmentCount( uint32_t colorAttachmentCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorAttachmentCount = colorAttachmentCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescription &\n      setPColorAttachments( const VULKAN_HPP_NAMESPACE::AttachmentReference * pColorAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pColorAttachments = pColorAttachments_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SubpassDescription & setColorAttachments(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentReference> const & colorAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorAttachmentCount = static_cast<uint32_t>( colorAttachments_.size() );\n      pColorAttachments    = colorAttachments_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescription &\n      setPResolveAttachments( const VULKAN_HPP_NAMESPACE::AttachmentReference * pResolveAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pResolveAttachments = pResolveAttachments_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SubpassDescription & setResolveAttachments(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentReference> const & resolveAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorAttachmentCount = static_cast<uint32_t>( resolveAttachments_.size() );\n      pResolveAttachments  = resolveAttachments_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescription &\n      setPDepthStencilAttachment( const VULKAN_HPP_NAMESPACE::AttachmentReference * pDepthStencilAttachment_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDepthStencilAttachment = pDepthStencilAttachment_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescription & setPreserveAttachmentCount( uint32_t preserveAttachmentCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      preserveAttachmentCount = preserveAttachmentCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescription & setPPreserveAttachments( const uint32_t * pPreserveAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPreserveAttachments = pPreserveAttachments_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SubpassDescription &\n      setPreserveAttachments( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & preserveAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      preserveAttachmentCount = static_cast<uint32_t>( preserveAttachments_.size() );\n      pPreserveAttachments    = preserveAttachments_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSubpassDescription const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSubpassDescription *>( this );\n    }\n\n    operator VkSubpassDescription &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSubpassDescription *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::SubpassDescriptionFlags const &,\n               VULKAN_HPP_NAMESPACE::PipelineBindPoint const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::AttachmentReference * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::AttachmentReference * const &,\n               const VULKAN_HPP_NAMESPACE::AttachmentReference * const &,\n               const VULKAN_HPP_NAMESPACE::AttachmentReference * const &,\n               uint32_t const &,\n               const uint32_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( flags,\n                       pipelineBindPoint,\n                       inputAttachmentCount,\n                       pInputAttachments,\n                       colorAttachmentCount,\n                       pColorAttachments,\n                       pResolveAttachments,\n                       pDepthStencilAttachment,\n                       preserveAttachmentCount,\n                       pPreserveAttachments );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SubpassDescription const & ) const = default;\n#else\n    bool operator==( SubpassDescription const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( flags == rhs.flags ) && ( pipelineBindPoint == rhs.pipelineBindPoint ) && ( inputAttachmentCount == rhs.inputAttachmentCount ) &&\n             ( pInputAttachments == rhs.pInputAttachments ) && ( colorAttachmentCount == rhs.colorAttachmentCount ) &&\n             ( pColorAttachments == rhs.pColorAttachments ) && ( pResolveAttachments == rhs.pResolveAttachments ) &&\n             ( pDepthStencilAttachment == rhs.pDepthStencilAttachment ) && ( preserveAttachmentCount == rhs.preserveAttachmentCount ) &&\n             ( pPreserveAttachments == rhs.pPreserveAttachments );\n#  endif\n    }\n\n    bool operator!=( SubpassDescription const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::SubpassDescriptionFlags     flags                   = {};\n    VULKAN_HPP_NAMESPACE::PipelineBindPoint           pipelineBindPoint       = VULKAN_HPP_NAMESPACE::PipelineBindPoint::eGraphics;\n    uint32_t                                          inputAttachmentCount    = {};\n    const VULKAN_HPP_NAMESPACE::AttachmentReference * pInputAttachments       = {};\n    uint32_t                                          colorAttachmentCount    = {};\n    const VULKAN_HPP_NAMESPACE::AttachmentReference * pColorAttachments       = {};\n    const VULKAN_HPP_NAMESPACE::AttachmentReference * pResolveAttachments     = {};\n    const VULKAN_HPP_NAMESPACE::AttachmentReference * pDepthStencilAttachment = {};\n    uint32_t                                          preserveAttachmentCount = {};\n    const uint32_t *                                  pPreserveAttachments    = {};\n  };\n\n  struct SubpassDependency\n  {\n    using NativeType = VkSubpassDependency;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SubpassDependency( uint32_t                                 srcSubpass_      = {},\n                                            uint32_t                                 dstSubpass_      = {},\n                                            VULKAN_HPP_NAMESPACE::PipelineStageFlags srcStageMask_    = {},\n                                            VULKAN_HPP_NAMESPACE::PipelineStageFlags dstStageMask_    = {},\n                                            VULKAN_HPP_NAMESPACE::AccessFlags        srcAccessMask_   = {},\n                                            VULKAN_HPP_NAMESPACE::AccessFlags        dstAccessMask_   = {},\n                                            VULKAN_HPP_NAMESPACE::DependencyFlags    dependencyFlags_ = {} ) VULKAN_HPP_NOEXCEPT\n      : srcSubpass{ srcSubpass_ }\n      , dstSubpass{ dstSubpass_ }\n      , srcStageMask{ srcStageMask_ }\n      , dstStageMask{ dstStageMask_ }\n      , srcAccessMask{ srcAccessMask_ }\n      , dstAccessMask{ dstAccessMask_ }\n      , dependencyFlags{ dependencyFlags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SubpassDependency( SubpassDependency const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SubpassDependency( VkSubpassDependency const & rhs ) VULKAN_HPP_NOEXCEPT : SubpassDependency( *reinterpret_cast<SubpassDependency const *>( &rhs ) ) {}\n\n    SubpassDependency & operator=( SubpassDependency const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SubpassDependency & operator=( VkSubpassDependency const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SubpassDependency const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SubpassDependency & setSrcSubpass( uint32_t srcSubpass_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcSubpass = srcSubpass_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDependency & setDstSubpass( uint32_t dstSubpass_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstSubpass = dstSubpass_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDependency & setSrcStageMask( VULKAN_HPP_NAMESPACE::PipelineStageFlags srcStageMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcStageMask = srcStageMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDependency & setDstStageMask( VULKAN_HPP_NAMESPACE::PipelineStageFlags dstStageMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstStageMask = dstStageMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDependency & setSrcAccessMask( VULKAN_HPP_NAMESPACE::AccessFlags srcAccessMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcAccessMask = srcAccessMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDependency & setDstAccessMask( VULKAN_HPP_NAMESPACE::AccessFlags dstAccessMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstAccessMask = dstAccessMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDependency & setDependencyFlags( VULKAN_HPP_NAMESPACE::DependencyFlags dependencyFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dependencyFlags = dependencyFlags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSubpassDependency const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSubpassDependency *>( this );\n    }\n\n    operator VkSubpassDependency &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSubpassDependency *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::PipelineStageFlags const &,\n               VULKAN_HPP_NAMESPACE::PipelineStageFlags const &,\n               VULKAN_HPP_NAMESPACE::AccessFlags const &,\n               VULKAN_HPP_NAMESPACE::AccessFlags const &,\n               VULKAN_HPP_NAMESPACE::DependencyFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( srcSubpass, dstSubpass, srcStageMask, dstStageMask, srcAccessMask, dstAccessMask, dependencyFlags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SubpassDependency const & ) const = default;\n#else\n    bool operator==( SubpassDependency const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( srcSubpass == rhs.srcSubpass ) && ( dstSubpass == rhs.dstSubpass ) && ( srcStageMask == rhs.srcStageMask ) &&\n             ( dstStageMask == rhs.dstStageMask ) && ( srcAccessMask == rhs.srcAccessMask ) && ( dstAccessMask == rhs.dstAccessMask ) &&\n             ( dependencyFlags == rhs.dependencyFlags );\n#  endif\n    }\n\n    bool operator!=( SubpassDependency const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                                 srcSubpass      = {};\n    uint32_t                                 dstSubpass      = {};\n    VULKAN_HPP_NAMESPACE::PipelineStageFlags srcStageMask    = {};\n    VULKAN_HPP_NAMESPACE::PipelineStageFlags dstStageMask    = {};\n    VULKAN_HPP_NAMESPACE::AccessFlags        srcAccessMask   = {};\n    VULKAN_HPP_NAMESPACE::AccessFlags        dstAccessMask   = {};\n    VULKAN_HPP_NAMESPACE::DependencyFlags    dependencyFlags = {};\n  };\n\n  struct RenderPassCreateInfo\n  {\n    using NativeType = VkRenderPassCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRenderPassCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR RenderPassCreateInfo( VULKAN_HPP_NAMESPACE::RenderPassCreateFlags         flags_           = {},\n                                               uint32_t                                            attachmentCount_ = {},\n                                               const VULKAN_HPP_NAMESPACE::AttachmentDescription * pAttachments_    = {},\n                                               uint32_t                                            subpassCount_    = {},\n                                               const VULKAN_HPP_NAMESPACE::SubpassDescription *    pSubpasses_      = {},\n                                               uint32_t                                            dependencyCount_ = {},\n                                               const VULKAN_HPP_NAMESPACE::SubpassDependency *     pDependencies_   = {},\n                                               const void *                                        pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , attachmentCount{ attachmentCount_ }\n      , pAttachments{ pAttachments_ }\n      , subpassCount{ subpassCount_ }\n      , pSubpasses{ pSubpasses_ }\n      , dependencyCount{ dependencyCount_ }\n      , pDependencies{ pDependencies_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RenderPassCreateInfo( RenderPassCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderPassCreateInfo( VkRenderPassCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RenderPassCreateInfo( *reinterpret_cast<RenderPassCreateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassCreateInfo( VULKAN_HPP_NAMESPACE::RenderPassCreateFlags                                                              flags_,\n                          VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentDescription> const & attachments_,\n                          VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SubpassDescription> const &    subpasses_    = {},\n                          VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SubpassDependency> const &     dependencies_ = {},\n                          const void *                                                                                             pNext_        = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , attachmentCount( static_cast<uint32_t>( attachments_.size() ) )\n      , pAttachments( attachments_.data() )\n      , subpassCount( static_cast<uint32_t>( subpasses_.size() ) )\n      , pSubpasses( subpasses_.data() )\n      , dependencyCount( static_cast<uint32_t>( dependencies_.size() ) )\n      , pDependencies( dependencies_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    RenderPassCreateInfo & operator=( RenderPassCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderPassCreateInfo & operator=( VkRenderPassCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderPassCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RenderPassCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::RenderPassCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassCreateInfo & setAttachmentCount( uint32_t attachmentCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      attachmentCount = attachmentCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassCreateInfo & setPAttachments( const VULKAN_HPP_NAMESPACE::AttachmentDescription * pAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pAttachments = pAttachments_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassCreateInfo & setAttachments(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentDescription> const & attachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      attachmentCount = static_cast<uint32_t>( attachments_.size() );\n      pAttachments    = attachments_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassCreateInfo & setSubpassCount( uint32_t subpassCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subpassCount = subpassCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassCreateInfo & setPSubpasses( const VULKAN_HPP_NAMESPACE::SubpassDescription * pSubpasses_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSubpasses = pSubpasses_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassCreateInfo &\n      setSubpasses( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SubpassDescription> const & subpasses_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subpassCount = static_cast<uint32_t>( subpasses_.size() );\n      pSubpasses   = subpasses_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassCreateInfo & setDependencyCount( uint32_t dependencyCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dependencyCount = dependencyCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassCreateInfo & setPDependencies( const VULKAN_HPP_NAMESPACE::SubpassDependency * pDependencies_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDependencies = pDependencies_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassCreateInfo &\n      setDependencies( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SubpassDependency> const & dependencies_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dependencyCount = static_cast<uint32_t>( dependencies_.size() );\n      pDependencies   = dependencies_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRenderPassCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderPassCreateInfo *>( this );\n    }\n\n    operator VkRenderPassCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderPassCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::RenderPassCreateFlags const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::AttachmentDescription * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::SubpassDescription * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::SubpassDependency * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, attachmentCount, pAttachments, subpassCount, pSubpasses, dependencyCount, pDependencies );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RenderPassCreateInfo const & ) const = default;\n#else\n    bool operator==( RenderPassCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( attachmentCount == rhs.attachmentCount ) &&\n             ( pAttachments == rhs.pAttachments ) && ( subpassCount == rhs.subpassCount ) && ( pSubpasses == rhs.pSubpasses ) &&\n             ( dependencyCount == rhs.dependencyCount ) && ( pDependencies == rhs.pDependencies );\n#  endif\n    }\n\n    bool operator!=( RenderPassCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                 sType           = StructureType::eRenderPassCreateInfo;\n    const void *                                        pNext           = {};\n    VULKAN_HPP_NAMESPACE::RenderPassCreateFlags         flags           = {};\n    uint32_t                                            attachmentCount = {};\n    const VULKAN_HPP_NAMESPACE::AttachmentDescription * pAttachments    = {};\n    uint32_t                                            subpassCount    = {};\n    const VULKAN_HPP_NAMESPACE::SubpassDescription *    pSubpasses      = {};\n    uint32_t                                            dependencyCount = {};\n    const VULKAN_HPP_NAMESPACE::SubpassDependency *     pDependencies   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRenderPassCreateInfo>\n  {\n    using Type = RenderPassCreateInfo;\n  };\n\n  struct SubpassDescription2\n  {\n    using NativeType = VkSubpassDescription2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSubpassDescription2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SubpassDescription2( VULKAN_HPP_NAMESPACE::SubpassDescriptionFlags flags_       = {},\n                                              VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint_ = VULKAN_HPP_NAMESPACE::PipelineBindPoint::eGraphics,\n                                              uint32_t                                viewMask_          = {},\n                                              uint32_t                                inputAttachmentCount_               = {},\n                                              const VULKAN_HPP_NAMESPACE::AttachmentReference2 * pInputAttachments_       = {},\n                                              uint32_t                                           colorAttachmentCount_    = {},\n                                              const VULKAN_HPP_NAMESPACE::AttachmentReference2 * pColorAttachments_       = {},\n                                              const VULKAN_HPP_NAMESPACE::AttachmentReference2 * pResolveAttachments_     = {},\n                                              const VULKAN_HPP_NAMESPACE::AttachmentReference2 * pDepthStencilAttachment_ = {},\n                                              uint32_t                                           preserveAttachmentCount_ = {},\n                                              const uint32_t *                                   pPreserveAttachments_    = {},\n                                              const void *                                       pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , pipelineBindPoint{ pipelineBindPoint_ }\n      , viewMask{ viewMask_ }\n      , inputAttachmentCount{ inputAttachmentCount_ }\n      , pInputAttachments{ pInputAttachments_ }\n      , colorAttachmentCount{ colorAttachmentCount_ }\n      , pColorAttachments{ pColorAttachments_ }\n      , pResolveAttachments{ pResolveAttachments_ }\n      , pDepthStencilAttachment{ pDepthStencilAttachment_ }\n      , preserveAttachmentCount{ preserveAttachmentCount_ }\n      , pPreserveAttachments{ pPreserveAttachments_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SubpassDescription2( SubpassDescription2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SubpassDescription2( VkSubpassDescription2 const & rhs ) VULKAN_HPP_NOEXCEPT : SubpassDescription2( *reinterpret_cast<SubpassDescription2 const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SubpassDescription2( VULKAN_HPP_NAMESPACE::SubpassDescriptionFlags                                                           flags_,\n                         VULKAN_HPP_NAMESPACE::PipelineBindPoint                                                                 pipelineBindPoint_,\n                         uint32_t                                                                                                viewMask_,\n                         VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentReference2> const & inputAttachments_,\n                         VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentReference2> const & colorAttachments_        = {},\n                         VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentReference2> const & resolveAttachments_      = {},\n                         const VULKAN_HPP_NAMESPACE::AttachmentReference2 *                                                      pDepthStencilAttachment_ = {},\n                         VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const &                                   preserveAttachments_     = {},\n                         const void *                                                                                            pNext_ = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , pipelineBindPoint( pipelineBindPoint_ )\n      , viewMask( viewMask_ )\n      , inputAttachmentCount( static_cast<uint32_t>( inputAttachments_.size() ) )\n      , pInputAttachments( inputAttachments_.data() )\n      , colorAttachmentCount( static_cast<uint32_t>( colorAttachments_.size() ) )\n      , pColorAttachments( colorAttachments_.data() )\n      , pResolveAttachments( resolveAttachments_.data() )\n      , pDepthStencilAttachment( pDepthStencilAttachment_ )\n      , preserveAttachmentCount( static_cast<uint32_t>( preserveAttachments_.size() ) )\n      , pPreserveAttachments( preserveAttachments_.data() )\n    {\n#    ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( resolveAttachments_.empty() || ( colorAttachments_.size() == resolveAttachments_.size() ) );\n#    else\n      if ( !resolveAttachments_.empty() && ( colorAttachments_.size() != resolveAttachments_.size() ) )\n      {\n        throw LogicError(\n          VULKAN_HPP_NAMESPACE_STRING\n          \"::SubpassDescription2::SubpassDescription2: !resolveAttachments_.empty() && ( colorAttachments_.size() != resolveAttachments_.size() )\" );\n      }\n#    endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    SubpassDescription2 & operator=( SubpassDescription2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SubpassDescription2 & operator=( VkSubpassDescription2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SubpassDescription2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescription2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescription2 & setFlags( VULKAN_HPP_NAMESPACE::SubpassDescriptionFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescription2 & setPipelineBindPoint( VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipelineBindPoint = pipelineBindPoint_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescription2 & setViewMask( uint32_t viewMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      viewMask = viewMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescription2 & setInputAttachmentCount( uint32_t inputAttachmentCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      inputAttachmentCount = inputAttachmentCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescription2 &\n      setPInputAttachments( const VULKAN_HPP_NAMESPACE::AttachmentReference2 * pInputAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pInputAttachments = pInputAttachments_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SubpassDescription2 & setInputAttachments(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentReference2> const & inputAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      inputAttachmentCount = static_cast<uint32_t>( inputAttachments_.size() );\n      pInputAttachments    = inputAttachments_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescription2 & setColorAttachmentCount( uint32_t colorAttachmentCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorAttachmentCount = colorAttachmentCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescription2 &\n      setPColorAttachments( const VULKAN_HPP_NAMESPACE::AttachmentReference2 * pColorAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pColorAttachments = pColorAttachments_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SubpassDescription2 & setColorAttachments(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentReference2> const & colorAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorAttachmentCount = static_cast<uint32_t>( colorAttachments_.size() );\n      pColorAttachments    = colorAttachments_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescription2 &\n      setPResolveAttachments( const VULKAN_HPP_NAMESPACE::AttachmentReference2 * pResolveAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pResolveAttachments = pResolveAttachments_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SubpassDescription2 & setResolveAttachments(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentReference2> const & resolveAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorAttachmentCount = static_cast<uint32_t>( resolveAttachments_.size() );\n      pResolveAttachments  = resolveAttachments_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescription2 &\n      setPDepthStencilAttachment( const VULKAN_HPP_NAMESPACE::AttachmentReference2 * pDepthStencilAttachment_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDepthStencilAttachment = pDepthStencilAttachment_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescription2 & setPreserveAttachmentCount( uint32_t preserveAttachmentCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      preserveAttachmentCount = preserveAttachmentCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescription2 & setPPreserveAttachments( const uint32_t * pPreserveAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPreserveAttachments = pPreserveAttachments_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SubpassDescription2 &\n      setPreserveAttachments( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & preserveAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      preserveAttachmentCount = static_cast<uint32_t>( preserveAttachments_.size() );\n      pPreserveAttachments    = preserveAttachments_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSubpassDescription2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSubpassDescription2 *>( this );\n    }\n\n    operator VkSubpassDescription2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSubpassDescription2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::SubpassDescriptionFlags const &,\n               VULKAN_HPP_NAMESPACE::PipelineBindPoint const &,\n               uint32_t const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::AttachmentReference2 * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::AttachmentReference2 * const &,\n               const VULKAN_HPP_NAMESPACE::AttachmentReference2 * const &,\n               const VULKAN_HPP_NAMESPACE::AttachmentReference2 * const &,\n               uint32_t const &,\n               const uint32_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       flags,\n                       pipelineBindPoint,\n                       viewMask,\n                       inputAttachmentCount,\n                       pInputAttachments,\n                       colorAttachmentCount,\n                       pColorAttachments,\n                       pResolveAttachments,\n                       pDepthStencilAttachment,\n                       preserveAttachmentCount,\n                       pPreserveAttachments );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SubpassDescription2 const & ) const = default;\n#else\n    bool operator==( SubpassDescription2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( pipelineBindPoint == rhs.pipelineBindPoint ) &&\n             ( viewMask == rhs.viewMask ) && ( inputAttachmentCount == rhs.inputAttachmentCount ) && ( pInputAttachments == rhs.pInputAttachments ) &&\n             ( colorAttachmentCount == rhs.colorAttachmentCount ) && ( pColorAttachments == rhs.pColorAttachments ) &&\n             ( pResolveAttachments == rhs.pResolveAttachments ) && ( pDepthStencilAttachment == rhs.pDepthStencilAttachment ) &&\n             ( preserveAttachmentCount == rhs.preserveAttachmentCount ) && ( pPreserveAttachments == rhs.pPreserveAttachments );\n#  endif\n    }\n\n    bool operator!=( SubpassDescription2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                sType                   = StructureType::eSubpassDescription2;\n    const void *                                       pNext                   = {};\n    VULKAN_HPP_NAMESPACE::SubpassDescriptionFlags      flags                   = {};\n    VULKAN_HPP_NAMESPACE::PipelineBindPoint            pipelineBindPoint       = VULKAN_HPP_NAMESPACE::PipelineBindPoint::eGraphics;\n    uint32_t                                           viewMask                = {};\n    uint32_t                                           inputAttachmentCount    = {};\n    const VULKAN_HPP_NAMESPACE::AttachmentReference2 * pInputAttachments       = {};\n    uint32_t                                           colorAttachmentCount    = {};\n    const VULKAN_HPP_NAMESPACE::AttachmentReference2 * pColorAttachments       = {};\n    const VULKAN_HPP_NAMESPACE::AttachmentReference2 * pResolveAttachments     = {};\n    const VULKAN_HPP_NAMESPACE::AttachmentReference2 * pDepthStencilAttachment = {};\n    uint32_t                                           preserveAttachmentCount = {};\n    const uint32_t *                                   pPreserveAttachments    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSubpassDescription2>\n  {\n    using Type = SubpassDescription2;\n  };\n\n  using SubpassDescription2KHR = SubpassDescription2;\n\n  struct SubpassDependency2\n  {\n    using NativeType = VkSubpassDependency2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSubpassDependency2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SubpassDependency2( uint32_t                                 srcSubpass_      = {},\n                                             uint32_t                                 dstSubpass_      = {},\n                                             VULKAN_HPP_NAMESPACE::PipelineStageFlags srcStageMask_    = {},\n                                             VULKAN_HPP_NAMESPACE::PipelineStageFlags dstStageMask_    = {},\n                                             VULKAN_HPP_NAMESPACE::AccessFlags        srcAccessMask_   = {},\n                                             VULKAN_HPP_NAMESPACE::AccessFlags        dstAccessMask_   = {},\n                                             VULKAN_HPP_NAMESPACE::DependencyFlags    dependencyFlags_ = {},\n                                             int32_t                                  viewOffset_      = {},\n                                             const void *                             pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , srcSubpass{ srcSubpass_ }\n      , dstSubpass{ dstSubpass_ }\n      , srcStageMask{ srcStageMask_ }\n      , dstStageMask{ dstStageMask_ }\n      , srcAccessMask{ srcAccessMask_ }\n      , dstAccessMask{ dstAccessMask_ }\n      , dependencyFlags{ dependencyFlags_ }\n      , viewOffset{ viewOffset_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SubpassDependency2( SubpassDependency2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SubpassDependency2( VkSubpassDependency2 const & rhs ) VULKAN_HPP_NOEXCEPT : SubpassDependency2( *reinterpret_cast<SubpassDependency2 const *>( &rhs ) ) {}\n\n    SubpassDependency2 & operator=( SubpassDependency2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SubpassDependency2 & operator=( VkSubpassDependency2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SubpassDependency2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SubpassDependency2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDependency2 & setSrcSubpass( uint32_t srcSubpass_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcSubpass = srcSubpass_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDependency2 & setDstSubpass( uint32_t dstSubpass_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstSubpass = dstSubpass_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDependency2 & setSrcStageMask( VULKAN_HPP_NAMESPACE::PipelineStageFlags srcStageMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcStageMask = srcStageMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDependency2 & setDstStageMask( VULKAN_HPP_NAMESPACE::PipelineStageFlags dstStageMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstStageMask = dstStageMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDependency2 & setSrcAccessMask( VULKAN_HPP_NAMESPACE::AccessFlags srcAccessMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcAccessMask = srcAccessMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDependency2 & setDstAccessMask( VULKAN_HPP_NAMESPACE::AccessFlags dstAccessMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstAccessMask = dstAccessMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDependency2 & setDependencyFlags( VULKAN_HPP_NAMESPACE::DependencyFlags dependencyFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dependencyFlags = dependencyFlags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDependency2 & setViewOffset( int32_t viewOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      viewOffset = viewOffset_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSubpassDependency2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSubpassDependency2 *>( this );\n    }\n\n    operator VkSubpassDependency2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSubpassDependency2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::PipelineStageFlags const &,\n               VULKAN_HPP_NAMESPACE::PipelineStageFlags const &,\n               VULKAN_HPP_NAMESPACE::AccessFlags const &,\n               VULKAN_HPP_NAMESPACE::AccessFlags const &,\n               VULKAN_HPP_NAMESPACE::DependencyFlags const &,\n               int32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, srcSubpass, dstSubpass, srcStageMask, dstStageMask, srcAccessMask, dstAccessMask, dependencyFlags, viewOffset );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SubpassDependency2 const & ) const = default;\n#else\n    bool operator==( SubpassDependency2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( srcSubpass == rhs.srcSubpass ) && ( dstSubpass == rhs.dstSubpass ) &&\n             ( srcStageMask == rhs.srcStageMask ) && ( dstStageMask == rhs.dstStageMask ) && ( srcAccessMask == rhs.srcAccessMask ) &&\n             ( dstAccessMask == rhs.dstAccessMask ) && ( dependencyFlags == rhs.dependencyFlags ) && ( viewOffset == rhs.viewOffset );\n#  endif\n    }\n\n    bool operator!=( SubpassDependency2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType      sType           = StructureType::eSubpassDependency2;\n    const void *                             pNext           = {};\n    uint32_t                                 srcSubpass      = {};\n    uint32_t                                 dstSubpass      = {};\n    VULKAN_HPP_NAMESPACE::PipelineStageFlags srcStageMask    = {};\n    VULKAN_HPP_NAMESPACE::PipelineStageFlags dstStageMask    = {};\n    VULKAN_HPP_NAMESPACE::AccessFlags        srcAccessMask   = {};\n    VULKAN_HPP_NAMESPACE::AccessFlags        dstAccessMask   = {};\n    VULKAN_HPP_NAMESPACE::DependencyFlags    dependencyFlags = {};\n    int32_t                                  viewOffset      = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSubpassDependency2>\n  {\n    using Type = SubpassDependency2;\n  };\n\n  using SubpassDependency2KHR = SubpassDependency2;\n\n  struct RenderPassCreateInfo2\n  {\n    using NativeType = VkRenderPassCreateInfo2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRenderPassCreateInfo2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR RenderPassCreateInfo2( VULKAN_HPP_NAMESPACE::RenderPassCreateFlags          flags_                   = {},\n                                                uint32_t                                             attachmentCount_         = {},\n                                                const VULKAN_HPP_NAMESPACE::AttachmentDescription2 * pAttachments_            = {},\n                                                uint32_t                                             subpassCount_            = {},\n                                                const VULKAN_HPP_NAMESPACE::SubpassDescription2 *    pSubpasses_              = {},\n                                                uint32_t                                             dependencyCount_         = {},\n                                                const VULKAN_HPP_NAMESPACE::SubpassDependency2 *     pDependencies_           = {},\n                                                uint32_t                                             correlatedViewMaskCount_ = {},\n                                                const uint32_t *                                     pCorrelatedViewMasks_    = {},\n                                                const void *                                         pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , attachmentCount{ attachmentCount_ }\n      , pAttachments{ pAttachments_ }\n      , subpassCount{ subpassCount_ }\n      , pSubpasses{ pSubpasses_ }\n      , dependencyCount{ dependencyCount_ }\n      , pDependencies{ pDependencies_ }\n      , correlatedViewMaskCount{ correlatedViewMaskCount_ }\n      , pCorrelatedViewMasks{ pCorrelatedViewMasks_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RenderPassCreateInfo2( RenderPassCreateInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderPassCreateInfo2( VkRenderPassCreateInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RenderPassCreateInfo2( *reinterpret_cast<RenderPassCreateInfo2 const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassCreateInfo2( VULKAN_HPP_NAMESPACE::RenderPassCreateFlags                                                               flags_,\n                           VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentDescription2> const & attachments_,\n                           VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SubpassDescription2> const &    subpasses_           = {},\n                           VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SubpassDependency2> const &     dependencies_        = {},\n                           VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const &                                     correlatedViewMasks_ = {},\n                           const void *                                                                                              pNext_ = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , attachmentCount( static_cast<uint32_t>( attachments_.size() ) )\n      , pAttachments( attachments_.data() )\n      , subpassCount( static_cast<uint32_t>( subpasses_.size() ) )\n      , pSubpasses( subpasses_.data() )\n      , dependencyCount( static_cast<uint32_t>( dependencies_.size() ) )\n      , pDependencies( dependencies_.data() )\n      , correlatedViewMaskCount( static_cast<uint32_t>( correlatedViewMasks_.size() ) )\n      , pCorrelatedViewMasks( correlatedViewMasks_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    RenderPassCreateInfo2 & operator=( RenderPassCreateInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderPassCreateInfo2 & operator=( VkRenderPassCreateInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RenderPassCreateInfo2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassCreateInfo2 & setFlags( VULKAN_HPP_NAMESPACE::RenderPassCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassCreateInfo2 & setAttachmentCount( uint32_t attachmentCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      attachmentCount = attachmentCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassCreateInfo2 & setPAttachments( const VULKAN_HPP_NAMESPACE::AttachmentDescription2 * pAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pAttachments = pAttachments_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassCreateInfo2 & setAttachments(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentDescription2> const & attachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      attachmentCount = static_cast<uint32_t>( attachments_.size() );\n      pAttachments    = attachments_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassCreateInfo2 & setSubpassCount( uint32_t subpassCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subpassCount = subpassCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassCreateInfo2 & setPSubpasses( const VULKAN_HPP_NAMESPACE::SubpassDescription2 * pSubpasses_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSubpasses = pSubpasses_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassCreateInfo2 &\n      setSubpasses( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SubpassDescription2> const & subpasses_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subpassCount = static_cast<uint32_t>( subpasses_.size() );\n      pSubpasses   = subpasses_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassCreateInfo2 & setDependencyCount( uint32_t dependencyCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dependencyCount = dependencyCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassCreateInfo2 & setPDependencies( const VULKAN_HPP_NAMESPACE::SubpassDependency2 * pDependencies_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDependencies = pDependencies_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassCreateInfo2 &\n      setDependencies( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SubpassDependency2> const & dependencies_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dependencyCount = static_cast<uint32_t>( dependencies_.size() );\n      pDependencies   = dependencies_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassCreateInfo2 & setCorrelatedViewMaskCount( uint32_t correlatedViewMaskCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      correlatedViewMaskCount = correlatedViewMaskCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassCreateInfo2 & setPCorrelatedViewMasks( const uint32_t * pCorrelatedViewMasks_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pCorrelatedViewMasks = pCorrelatedViewMasks_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassCreateInfo2 &\n      setCorrelatedViewMasks( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & correlatedViewMasks_ ) VULKAN_HPP_NOEXCEPT\n    {\n      correlatedViewMaskCount = static_cast<uint32_t>( correlatedViewMasks_.size() );\n      pCorrelatedViewMasks    = correlatedViewMasks_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRenderPassCreateInfo2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderPassCreateInfo2 *>( this );\n    }\n\n    operator VkRenderPassCreateInfo2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderPassCreateInfo2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::RenderPassCreateFlags const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::AttachmentDescription2 * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::SubpassDescription2 * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::SubpassDependency2 * const &,\n               uint32_t const &,\n               const uint32_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       flags,\n                       attachmentCount,\n                       pAttachments,\n                       subpassCount,\n                       pSubpasses,\n                       dependencyCount,\n                       pDependencies,\n                       correlatedViewMaskCount,\n                       pCorrelatedViewMasks );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RenderPassCreateInfo2 const & ) const = default;\n#else\n    bool operator==( RenderPassCreateInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( attachmentCount == rhs.attachmentCount ) &&\n             ( pAttachments == rhs.pAttachments ) && ( subpassCount == rhs.subpassCount ) && ( pSubpasses == rhs.pSubpasses ) &&\n             ( dependencyCount == rhs.dependencyCount ) && ( pDependencies == rhs.pDependencies ) &&\n             ( correlatedViewMaskCount == rhs.correlatedViewMaskCount ) && ( pCorrelatedViewMasks == rhs.pCorrelatedViewMasks );\n#  endif\n    }\n\n    bool operator!=( RenderPassCreateInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                  sType                   = StructureType::eRenderPassCreateInfo2;\n    const void *                                         pNext                   = {};\n    VULKAN_HPP_NAMESPACE::RenderPassCreateFlags          flags                   = {};\n    uint32_t                                             attachmentCount         = {};\n    const VULKAN_HPP_NAMESPACE::AttachmentDescription2 * pAttachments            = {};\n    uint32_t                                             subpassCount            = {};\n    const VULKAN_HPP_NAMESPACE::SubpassDescription2 *    pSubpasses              = {};\n    uint32_t                                             dependencyCount         = {};\n    const VULKAN_HPP_NAMESPACE::SubpassDependency2 *     pDependencies           = {};\n    uint32_t                                             correlatedViewMaskCount = {};\n    const uint32_t *                                     pCorrelatedViewMasks    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRenderPassCreateInfo2>\n  {\n    using Type = RenderPassCreateInfo2;\n  };\n\n  using RenderPassCreateInfo2KHR = RenderPassCreateInfo2;\n\n  struct RenderPassCreationControlEXT\n  {\n    using NativeType = VkRenderPassCreationControlEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRenderPassCreationControlEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR RenderPassCreationControlEXT( VULKAN_HPP_NAMESPACE::Bool32 disallowMerging_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , disallowMerging{ disallowMerging_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RenderPassCreationControlEXT( RenderPassCreationControlEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderPassCreationControlEXT( VkRenderPassCreationControlEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RenderPassCreationControlEXT( *reinterpret_cast<RenderPassCreationControlEXT const *>( &rhs ) )\n    {\n    }\n\n    RenderPassCreationControlEXT & operator=( RenderPassCreationControlEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderPassCreationControlEXT & operator=( VkRenderPassCreationControlEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderPassCreationControlEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RenderPassCreationControlEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassCreationControlEXT & setDisallowMerging( VULKAN_HPP_NAMESPACE::Bool32 disallowMerging_ ) VULKAN_HPP_NOEXCEPT\n    {\n      disallowMerging = disallowMerging_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRenderPassCreationControlEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderPassCreationControlEXT *>( this );\n    }\n\n    operator VkRenderPassCreationControlEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderPassCreationControlEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, disallowMerging );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RenderPassCreationControlEXT const & ) const = default;\n#else\n    bool operator==( RenderPassCreationControlEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( disallowMerging == rhs.disallowMerging );\n#  endif\n    }\n\n    bool operator!=( RenderPassCreationControlEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType           = StructureType::eRenderPassCreationControlEXT;\n    const void *                        pNext           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        disallowMerging = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRenderPassCreationControlEXT>\n  {\n    using Type = RenderPassCreationControlEXT;\n  };\n\n  struct RenderPassCreationFeedbackInfoEXT\n  {\n    using NativeType = VkRenderPassCreationFeedbackInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR RenderPassCreationFeedbackInfoEXT( uint32_t postMergeSubpassCount_ = {} ) VULKAN_HPP_NOEXCEPT\n      : postMergeSubpassCount{ postMergeSubpassCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RenderPassCreationFeedbackInfoEXT( RenderPassCreationFeedbackInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderPassCreationFeedbackInfoEXT( VkRenderPassCreationFeedbackInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RenderPassCreationFeedbackInfoEXT( *reinterpret_cast<RenderPassCreationFeedbackInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    RenderPassCreationFeedbackInfoEXT & operator=( RenderPassCreationFeedbackInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderPassCreationFeedbackInfoEXT & operator=( VkRenderPassCreationFeedbackInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderPassCreationFeedbackInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkRenderPassCreationFeedbackInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderPassCreationFeedbackInfoEXT *>( this );\n    }\n\n    operator VkRenderPassCreationFeedbackInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderPassCreationFeedbackInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( postMergeSubpassCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RenderPassCreationFeedbackInfoEXT const & ) const = default;\n#else\n    bool operator==( RenderPassCreationFeedbackInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( postMergeSubpassCount == rhs.postMergeSubpassCount );\n#  endif\n    }\n\n    bool operator!=( RenderPassCreationFeedbackInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t postMergeSubpassCount = {};\n  };\n\n  struct RenderPassCreationFeedbackCreateInfoEXT\n  {\n    using NativeType = VkRenderPassCreationFeedbackCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRenderPassCreationFeedbackCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR RenderPassCreationFeedbackCreateInfoEXT( VULKAN_HPP_NAMESPACE::RenderPassCreationFeedbackInfoEXT * pRenderPassFeedback_ = {},\n                                                                  const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pRenderPassFeedback{ pRenderPassFeedback_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RenderPassCreationFeedbackCreateInfoEXT( RenderPassCreationFeedbackCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderPassCreationFeedbackCreateInfoEXT( VkRenderPassCreationFeedbackCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RenderPassCreationFeedbackCreateInfoEXT( *reinterpret_cast<RenderPassCreationFeedbackCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    RenderPassCreationFeedbackCreateInfoEXT & operator=( RenderPassCreationFeedbackCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderPassCreationFeedbackCreateInfoEXT & operator=( VkRenderPassCreationFeedbackCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderPassCreationFeedbackCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RenderPassCreationFeedbackCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassCreationFeedbackCreateInfoEXT &\n      setPRenderPassFeedback( VULKAN_HPP_NAMESPACE::RenderPassCreationFeedbackInfoEXT * pRenderPassFeedback_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pRenderPassFeedback = pRenderPassFeedback_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRenderPassCreationFeedbackCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderPassCreationFeedbackCreateInfoEXT *>( this );\n    }\n\n    operator VkRenderPassCreationFeedbackCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderPassCreationFeedbackCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::RenderPassCreationFeedbackInfoEXT * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pRenderPassFeedback );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RenderPassCreationFeedbackCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( RenderPassCreationFeedbackCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pRenderPassFeedback == rhs.pRenderPassFeedback );\n#  endif\n    }\n\n    bool operator!=( RenderPassCreationFeedbackCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                       sType               = StructureType::eRenderPassCreationFeedbackCreateInfoEXT;\n    const void *                                              pNext               = {};\n    VULKAN_HPP_NAMESPACE::RenderPassCreationFeedbackInfoEXT * pRenderPassFeedback = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRenderPassCreationFeedbackCreateInfoEXT>\n  {\n    using Type = RenderPassCreationFeedbackCreateInfoEXT;\n  };\n\n  struct RenderPassFragmentDensityMapCreateInfoEXT\n  {\n    using NativeType = VkRenderPassFragmentDensityMapCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRenderPassFragmentDensityMapCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR RenderPassFragmentDensityMapCreateInfoEXT( VULKAN_HPP_NAMESPACE::AttachmentReference fragmentDensityMapAttachment_ = {},\n                                                                    const void *                              pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , fragmentDensityMapAttachment{ fragmentDensityMapAttachment_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RenderPassFragmentDensityMapCreateInfoEXT( RenderPassFragmentDensityMapCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderPassFragmentDensityMapCreateInfoEXT( VkRenderPassFragmentDensityMapCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RenderPassFragmentDensityMapCreateInfoEXT( *reinterpret_cast<RenderPassFragmentDensityMapCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    RenderPassFragmentDensityMapCreateInfoEXT & operator=( RenderPassFragmentDensityMapCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderPassFragmentDensityMapCreateInfoEXT & operator=( VkRenderPassFragmentDensityMapCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderPassFragmentDensityMapCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RenderPassFragmentDensityMapCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassFragmentDensityMapCreateInfoEXT &\n      setFragmentDensityMapAttachment( VULKAN_HPP_NAMESPACE::AttachmentReference const & fragmentDensityMapAttachment_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fragmentDensityMapAttachment = fragmentDensityMapAttachment_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRenderPassFragmentDensityMapCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderPassFragmentDensityMapCreateInfoEXT *>( this );\n    }\n\n    operator VkRenderPassFragmentDensityMapCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::AttachmentReference const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, fragmentDensityMapAttachment );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RenderPassFragmentDensityMapCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( RenderPassFragmentDensityMapCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( fragmentDensityMapAttachment == rhs.fragmentDensityMapAttachment );\n#  endif\n    }\n\n    bool operator!=( RenderPassFragmentDensityMapCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType                        = StructureType::eRenderPassFragmentDensityMapCreateInfoEXT;\n    const void *                              pNext                        = {};\n    VULKAN_HPP_NAMESPACE::AttachmentReference fragmentDensityMapAttachment = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRenderPassFragmentDensityMapCreateInfoEXT>\n  {\n    using Type = RenderPassFragmentDensityMapCreateInfoEXT;\n  };\n\n  struct RenderPassInputAttachmentAspectCreateInfo\n  {\n    using NativeType = VkRenderPassInputAttachmentAspectCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRenderPassInputAttachmentAspectCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR RenderPassInputAttachmentAspectCreateInfo( uint32_t                                                     aspectReferenceCount_ = {},\n                                                                    const VULKAN_HPP_NAMESPACE::InputAttachmentAspectReference * pAspectReferences_    = {},\n                                                                    const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , aspectReferenceCount{ aspectReferenceCount_ }\n      , pAspectReferences{ pAspectReferences_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RenderPassInputAttachmentAspectCreateInfo( RenderPassInputAttachmentAspectCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderPassInputAttachmentAspectCreateInfo( VkRenderPassInputAttachmentAspectCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RenderPassInputAttachmentAspectCreateInfo( *reinterpret_cast<RenderPassInputAttachmentAspectCreateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassInputAttachmentAspectCreateInfo(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::InputAttachmentAspectReference> const & aspectReferences_,\n      const void *                                                                                                      pNext_ = nullptr )\n      : pNext( pNext_ ), aspectReferenceCount( static_cast<uint32_t>( aspectReferences_.size() ) ), pAspectReferences( aspectReferences_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    RenderPassInputAttachmentAspectCreateInfo & operator=( RenderPassInputAttachmentAspectCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderPassInputAttachmentAspectCreateInfo & operator=( VkRenderPassInputAttachmentAspectCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderPassInputAttachmentAspectCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RenderPassInputAttachmentAspectCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassInputAttachmentAspectCreateInfo & setAspectReferenceCount( uint32_t aspectReferenceCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      aspectReferenceCount = aspectReferenceCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassInputAttachmentAspectCreateInfo &\n      setPAspectReferences( const VULKAN_HPP_NAMESPACE::InputAttachmentAspectReference * pAspectReferences_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pAspectReferences = pAspectReferences_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassInputAttachmentAspectCreateInfo & setAspectReferences(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::InputAttachmentAspectReference> const & aspectReferences_ ) VULKAN_HPP_NOEXCEPT\n    {\n      aspectReferenceCount = static_cast<uint32_t>( aspectReferences_.size() );\n      pAspectReferences    = aspectReferences_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRenderPassInputAttachmentAspectCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderPassInputAttachmentAspectCreateInfo *>( this );\n    }\n\n    operator VkRenderPassInputAttachmentAspectCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderPassInputAttachmentAspectCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::InputAttachmentAspectReference * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, aspectReferenceCount, pAspectReferences );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RenderPassInputAttachmentAspectCreateInfo const & ) const = default;\n#else\n    bool operator==( RenderPassInputAttachmentAspectCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( aspectReferenceCount == rhs.aspectReferenceCount ) &&\n             ( pAspectReferences == rhs.pAspectReferences );\n#  endif\n    }\n\n    bool operator!=( RenderPassInputAttachmentAspectCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                          sType                = StructureType::eRenderPassInputAttachmentAspectCreateInfo;\n    const void *                                                 pNext                = {};\n    uint32_t                                                     aspectReferenceCount = {};\n    const VULKAN_HPP_NAMESPACE::InputAttachmentAspectReference * pAspectReferences    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRenderPassInputAttachmentAspectCreateInfo>\n  {\n    using Type = RenderPassInputAttachmentAspectCreateInfo;\n  };\n\n  using RenderPassInputAttachmentAspectCreateInfoKHR = RenderPassInputAttachmentAspectCreateInfo;\n\n  struct RenderPassMultiviewCreateInfo\n  {\n    using NativeType = VkRenderPassMultiviewCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRenderPassMultiviewCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR RenderPassMultiviewCreateInfo( uint32_t         subpassCount_         = {},\n                                                        const uint32_t * pViewMasks_           = {},\n                                                        uint32_t         dependencyCount_      = {},\n                                                        const int32_t *  pViewOffsets_         = {},\n                                                        uint32_t         correlationMaskCount_ = {},\n                                                        const uint32_t * pCorrelationMasks_    = {},\n                                                        const void *     pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , subpassCount{ subpassCount_ }\n      , pViewMasks{ pViewMasks_ }\n      , dependencyCount{ dependencyCount_ }\n      , pViewOffsets{ pViewOffsets_ }\n      , correlationMaskCount{ correlationMaskCount_ }\n      , pCorrelationMasks{ pCorrelationMasks_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RenderPassMultiviewCreateInfo( RenderPassMultiviewCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderPassMultiviewCreateInfo( VkRenderPassMultiviewCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RenderPassMultiviewCreateInfo( *reinterpret_cast<RenderPassMultiviewCreateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassMultiviewCreateInfo( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & viewMasks_,\n                                   VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const int32_t> const &  viewOffsets_      = {},\n                                   VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & correlationMasks_ = {},\n                                   const void *                                                          pNext_            = nullptr )\n      : pNext( pNext_ )\n      , subpassCount( static_cast<uint32_t>( viewMasks_.size() ) )\n      , pViewMasks( viewMasks_.data() )\n      , dependencyCount( static_cast<uint32_t>( viewOffsets_.size() ) )\n      , pViewOffsets( viewOffsets_.data() )\n      , correlationMaskCount( static_cast<uint32_t>( correlationMasks_.size() ) )\n      , pCorrelationMasks( correlationMasks_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    RenderPassMultiviewCreateInfo & operator=( RenderPassMultiviewCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderPassMultiviewCreateInfo & operator=( VkRenderPassMultiviewCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderPassMultiviewCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RenderPassMultiviewCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassMultiviewCreateInfo & setSubpassCount( uint32_t subpassCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subpassCount = subpassCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassMultiviewCreateInfo & setPViewMasks( const uint32_t * pViewMasks_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pViewMasks = pViewMasks_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassMultiviewCreateInfo & setViewMasks( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & viewMasks_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subpassCount = static_cast<uint32_t>( viewMasks_.size() );\n      pViewMasks   = viewMasks_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassMultiviewCreateInfo & setDependencyCount( uint32_t dependencyCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dependencyCount = dependencyCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassMultiviewCreateInfo & setPViewOffsets( const int32_t * pViewOffsets_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pViewOffsets = pViewOffsets_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassMultiviewCreateInfo & setViewOffsets( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const int32_t> const & viewOffsets_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dependencyCount = static_cast<uint32_t>( viewOffsets_.size() );\n      pViewOffsets    = viewOffsets_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassMultiviewCreateInfo & setCorrelationMaskCount( uint32_t correlationMaskCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      correlationMaskCount = correlationMaskCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassMultiviewCreateInfo & setPCorrelationMasks( const uint32_t * pCorrelationMasks_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pCorrelationMasks = pCorrelationMasks_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassMultiviewCreateInfo &\n      setCorrelationMasks( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & correlationMasks_ ) VULKAN_HPP_NOEXCEPT\n    {\n      correlationMaskCount = static_cast<uint32_t>( correlationMasks_.size() );\n      pCorrelationMasks    = correlationMasks_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRenderPassMultiviewCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderPassMultiviewCreateInfo *>( this );\n    }\n\n    operator VkRenderPassMultiviewCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderPassMultiviewCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const uint32_t * const &,\n               uint32_t const &,\n               const int32_t * const &,\n               uint32_t const &,\n               const uint32_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, subpassCount, pViewMasks, dependencyCount, pViewOffsets, correlationMaskCount, pCorrelationMasks );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RenderPassMultiviewCreateInfo const & ) const = default;\n#else\n    bool operator==( RenderPassMultiviewCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( subpassCount == rhs.subpassCount ) && ( pViewMasks == rhs.pViewMasks ) &&\n             ( dependencyCount == rhs.dependencyCount ) && ( pViewOffsets == rhs.pViewOffsets ) && ( correlationMaskCount == rhs.correlationMaskCount ) &&\n             ( pCorrelationMasks == rhs.pCorrelationMasks );\n#  endif\n    }\n\n    bool operator!=( RenderPassMultiviewCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                = StructureType::eRenderPassMultiviewCreateInfo;\n    const void *                        pNext                = {};\n    uint32_t                            subpassCount         = {};\n    const uint32_t *                    pViewMasks           = {};\n    uint32_t                            dependencyCount      = {};\n    const int32_t *                     pViewOffsets         = {};\n    uint32_t                            correlationMaskCount = {};\n    const uint32_t *                    pCorrelationMasks    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRenderPassMultiviewCreateInfo>\n  {\n    using Type = RenderPassMultiviewCreateInfo;\n  };\n\n  using RenderPassMultiviewCreateInfoKHR = RenderPassMultiviewCreateInfo;\n\n  struct SubpassSampleLocationsEXT\n  {\n    using NativeType = VkSubpassSampleLocationsEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SubpassSampleLocationsEXT( uint32_t                                     subpassIndex_        = {},\n                                                    VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT sampleLocationsInfo_ = {} ) VULKAN_HPP_NOEXCEPT\n      : subpassIndex{ subpassIndex_ }\n      , sampleLocationsInfo{ sampleLocationsInfo_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SubpassSampleLocationsEXT( SubpassSampleLocationsEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SubpassSampleLocationsEXT( VkSubpassSampleLocationsEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SubpassSampleLocationsEXT( *reinterpret_cast<SubpassSampleLocationsEXT const *>( &rhs ) )\n    {\n    }\n\n    SubpassSampleLocationsEXT & operator=( SubpassSampleLocationsEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SubpassSampleLocationsEXT & operator=( VkSubpassSampleLocationsEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SubpassSampleLocationsEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SubpassSampleLocationsEXT & setSubpassIndex( uint32_t subpassIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subpassIndex = subpassIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassSampleLocationsEXT &\n      setSampleLocationsInfo( VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT const & sampleLocationsInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sampleLocationsInfo = sampleLocationsInfo_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSubpassSampleLocationsEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSubpassSampleLocationsEXT *>( this );\n    }\n\n    operator VkSubpassSampleLocationsEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSubpassSampleLocationsEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( subpassIndex, sampleLocationsInfo );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SubpassSampleLocationsEXT const & ) const = default;\n#else\n    bool operator==( SubpassSampleLocationsEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( subpassIndex == rhs.subpassIndex ) && ( sampleLocationsInfo == rhs.sampleLocationsInfo );\n#  endif\n    }\n\n    bool operator!=( SubpassSampleLocationsEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                                     subpassIndex        = {};\n    VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT sampleLocationsInfo = {};\n  };\n\n  struct RenderPassSampleLocationsBeginInfoEXT\n  {\n    using NativeType = VkRenderPassSampleLocationsBeginInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRenderPassSampleLocationsBeginInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      RenderPassSampleLocationsBeginInfoEXT( uint32_t                                                   attachmentInitialSampleLocationsCount_ = {},\n                                             const VULKAN_HPP_NAMESPACE::AttachmentSampleLocationsEXT * pAttachmentInitialSampleLocations_     = {},\n                                             uint32_t                                                   postSubpassSampleLocationsCount_       = {},\n                                             const VULKAN_HPP_NAMESPACE::SubpassSampleLocationsEXT *    pPostSubpassSampleLocations_           = {},\n                                             const void *                                               pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , attachmentInitialSampleLocationsCount{ attachmentInitialSampleLocationsCount_ }\n      , pAttachmentInitialSampleLocations{ pAttachmentInitialSampleLocations_ }\n      , postSubpassSampleLocationsCount{ postSubpassSampleLocationsCount_ }\n      , pPostSubpassSampleLocations{ pPostSubpassSampleLocations_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RenderPassSampleLocationsBeginInfoEXT( RenderPassSampleLocationsBeginInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderPassSampleLocationsBeginInfoEXT( VkRenderPassSampleLocationsBeginInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RenderPassSampleLocationsBeginInfoEXT( *reinterpret_cast<RenderPassSampleLocationsBeginInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassSampleLocationsBeginInfoEXT(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentSampleLocationsEXT> const & attachmentInitialSampleLocations_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SubpassSampleLocationsEXT> const &    postSubpassSampleLocations_ = {},\n      const void *                                                                                                    pNext_                      = nullptr )\n      : pNext( pNext_ )\n      , attachmentInitialSampleLocationsCount( static_cast<uint32_t>( attachmentInitialSampleLocations_.size() ) )\n      , pAttachmentInitialSampleLocations( attachmentInitialSampleLocations_.data() )\n      , postSubpassSampleLocationsCount( static_cast<uint32_t>( postSubpassSampleLocations_.size() ) )\n      , pPostSubpassSampleLocations( postSubpassSampleLocations_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    RenderPassSampleLocationsBeginInfoEXT & operator=( RenderPassSampleLocationsBeginInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderPassSampleLocationsBeginInfoEXT & operator=( VkRenderPassSampleLocationsBeginInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderPassSampleLocationsBeginInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RenderPassSampleLocationsBeginInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassSampleLocationsBeginInfoEXT &\n      setAttachmentInitialSampleLocationsCount( uint32_t attachmentInitialSampleLocationsCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      attachmentInitialSampleLocationsCount = attachmentInitialSampleLocationsCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassSampleLocationsBeginInfoEXT &\n      setPAttachmentInitialSampleLocations( const VULKAN_HPP_NAMESPACE::AttachmentSampleLocationsEXT * pAttachmentInitialSampleLocations_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pAttachmentInitialSampleLocations = pAttachmentInitialSampleLocations_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassSampleLocationsBeginInfoEXT & setAttachmentInitialSampleLocations(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentSampleLocationsEXT> const & attachmentInitialSampleLocations_ )\n      VULKAN_HPP_NOEXCEPT\n    {\n      attachmentInitialSampleLocationsCount = static_cast<uint32_t>( attachmentInitialSampleLocations_.size() );\n      pAttachmentInitialSampleLocations     = attachmentInitialSampleLocations_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassSampleLocationsBeginInfoEXT &\n      setPostSubpassSampleLocationsCount( uint32_t postSubpassSampleLocationsCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      postSubpassSampleLocationsCount = postSubpassSampleLocationsCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassSampleLocationsBeginInfoEXT &\n      setPPostSubpassSampleLocations( const VULKAN_HPP_NAMESPACE::SubpassSampleLocationsEXT * pPostSubpassSampleLocations_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPostSubpassSampleLocations = pPostSubpassSampleLocations_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassSampleLocationsBeginInfoEXT & setPostSubpassSampleLocations(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SubpassSampleLocationsEXT> const & postSubpassSampleLocations_ )\n      VULKAN_HPP_NOEXCEPT\n    {\n      postSubpassSampleLocationsCount = static_cast<uint32_t>( postSubpassSampleLocations_.size() );\n      pPostSubpassSampleLocations     = postSubpassSampleLocations_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRenderPassSampleLocationsBeginInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderPassSampleLocationsBeginInfoEXT *>( this );\n    }\n\n    operator VkRenderPassSampleLocationsBeginInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderPassSampleLocationsBeginInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::AttachmentSampleLocationsEXT * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::SubpassSampleLocationsEXT * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie(\n        sType, pNext, attachmentInitialSampleLocationsCount, pAttachmentInitialSampleLocations, postSubpassSampleLocationsCount, pPostSubpassSampleLocations );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RenderPassSampleLocationsBeginInfoEXT const & ) const = default;\n#else\n    bool operator==( RenderPassSampleLocationsBeginInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( attachmentInitialSampleLocationsCount == rhs.attachmentInitialSampleLocationsCount ) &&\n             ( pAttachmentInitialSampleLocations == rhs.pAttachmentInitialSampleLocations ) &&\n             ( postSubpassSampleLocationsCount == rhs.postSubpassSampleLocationsCount ) && ( pPostSubpassSampleLocations == rhs.pPostSubpassSampleLocations );\n#  endif\n    }\n\n    bool operator!=( RenderPassSampleLocationsBeginInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                        sType                                 = StructureType::eRenderPassSampleLocationsBeginInfoEXT;\n    const void *                                               pNext                                 = {};\n    uint32_t                                                   attachmentInitialSampleLocationsCount = {};\n    const VULKAN_HPP_NAMESPACE::AttachmentSampleLocationsEXT * pAttachmentInitialSampleLocations     = {};\n    uint32_t                                                   postSubpassSampleLocationsCount       = {};\n    const VULKAN_HPP_NAMESPACE::SubpassSampleLocationsEXT *    pPostSubpassSampleLocations           = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRenderPassSampleLocationsBeginInfoEXT>\n  {\n    using Type = RenderPassSampleLocationsBeginInfoEXT;\n  };\n\n  struct RenderPassStripeInfoARM\n  {\n    using NativeType = VkRenderPassStripeInfoARM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRenderPassStripeInfoARM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR RenderPassStripeInfoARM( VULKAN_HPP_NAMESPACE::Rect2D stripeArea_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stripeArea{ stripeArea_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RenderPassStripeInfoARM( RenderPassStripeInfoARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderPassStripeInfoARM( VkRenderPassStripeInfoARM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RenderPassStripeInfoARM( *reinterpret_cast<RenderPassStripeInfoARM const *>( &rhs ) )\n    {\n    }\n\n    RenderPassStripeInfoARM & operator=( RenderPassStripeInfoARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderPassStripeInfoARM & operator=( VkRenderPassStripeInfoARM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderPassStripeInfoARM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RenderPassStripeInfoARM & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassStripeInfoARM & setStripeArea( VULKAN_HPP_NAMESPACE::Rect2D const & stripeArea_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stripeArea = stripeArea_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRenderPassStripeInfoARM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderPassStripeInfoARM *>( this );\n    }\n\n    operator VkRenderPassStripeInfoARM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderPassStripeInfoARM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Rect2D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stripeArea );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RenderPassStripeInfoARM const & ) const = default;\n#else\n    bool operator==( RenderPassStripeInfoARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( stripeArea == rhs.stripeArea );\n#  endif\n    }\n\n    bool operator!=( RenderPassStripeInfoARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType      = StructureType::eRenderPassStripeInfoARM;\n    const void *                        pNext      = {};\n    VULKAN_HPP_NAMESPACE::Rect2D        stripeArea = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRenderPassStripeInfoARM>\n  {\n    using Type = RenderPassStripeInfoARM;\n  };\n\n  struct RenderPassStripeBeginInfoARM\n  {\n    using NativeType = VkRenderPassStripeBeginInfoARM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRenderPassStripeBeginInfoARM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR RenderPassStripeBeginInfoARM( uint32_t                                              stripeInfoCount_ = {},\n                                                       const VULKAN_HPP_NAMESPACE::RenderPassStripeInfoARM * pStripeInfos_    = {},\n                                                       const void *                                          pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stripeInfoCount{ stripeInfoCount_ }\n      , pStripeInfos{ pStripeInfos_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RenderPassStripeBeginInfoARM( RenderPassStripeBeginInfoARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderPassStripeBeginInfoARM( VkRenderPassStripeBeginInfoARM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RenderPassStripeBeginInfoARM( *reinterpret_cast<RenderPassStripeBeginInfoARM const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassStripeBeginInfoARM( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::RenderPassStripeInfoARM> const & stripeInfos_,\n                                  const void *                                                                                               pNext_ = nullptr )\n      : pNext( pNext_ ), stripeInfoCount( static_cast<uint32_t>( stripeInfos_.size() ) ), pStripeInfos( stripeInfos_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    RenderPassStripeBeginInfoARM & operator=( RenderPassStripeBeginInfoARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderPassStripeBeginInfoARM & operator=( VkRenderPassStripeBeginInfoARM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderPassStripeBeginInfoARM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RenderPassStripeBeginInfoARM & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassStripeBeginInfoARM & setStripeInfoCount( uint32_t stripeInfoCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stripeInfoCount = stripeInfoCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassStripeBeginInfoARM &\n      setPStripeInfos( const VULKAN_HPP_NAMESPACE::RenderPassStripeInfoARM * pStripeInfos_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStripeInfos = pStripeInfos_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassStripeBeginInfoARM & setStripeInfos(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::RenderPassStripeInfoARM> const & stripeInfos_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stripeInfoCount = static_cast<uint32_t>( stripeInfos_.size() );\n      pStripeInfos    = stripeInfos_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRenderPassStripeBeginInfoARM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderPassStripeBeginInfoARM *>( this );\n    }\n\n    operator VkRenderPassStripeBeginInfoARM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderPassStripeBeginInfoARM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::\n      tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::RenderPassStripeInfoARM * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stripeInfoCount, pStripeInfos );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RenderPassStripeBeginInfoARM const & ) const = default;\n#else\n    bool operator==( RenderPassStripeBeginInfoARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( stripeInfoCount == rhs.stripeInfoCount ) && ( pStripeInfos == rhs.pStripeInfos );\n#  endif\n    }\n\n    bool operator!=( RenderPassStripeBeginInfoARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                   sType           = StructureType::eRenderPassStripeBeginInfoARM;\n    const void *                                          pNext           = {};\n    uint32_t                                              stripeInfoCount = {};\n    const VULKAN_HPP_NAMESPACE::RenderPassStripeInfoARM * pStripeInfos    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRenderPassStripeBeginInfoARM>\n  {\n    using Type = RenderPassStripeBeginInfoARM;\n  };\n\n  struct SemaphoreSubmitInfo\n  {\n    using NativeType = VkSemaphoreSubmitInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSemaphoreSubmitInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SemaphoreSubmitInfo( VULKAN_HPP_NAMESPACE::Semaphore           semaphore_   = {},\n                                              uint64_t                                  value_       = {},\n                                              VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stageMask_   = {},\n                                              uint32_t                                  deviceIndex_ = {},\n                                              const void *                              pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , semaphore{ semaphore_ }\n      , value{ value_ }\n      , stageMask{ stageMask_ }\n      , deviceIndex{ deviceIndex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SemaphoreSubmitInfo( SemaphoreSubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SemaphoreSubmitInfo( VkSemaphoreSubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT : SemaphoreSubmitInfo( *reinterpret_cast<SemaphoreSubmitInfo const *>( &rhs ) )\n    {\n    }\n\n    SemaphoreSubmitInfo & operator=( SemaphoreSubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SemaphoreSubmitInfo & operator=( VkSemaphoreSubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreSubmitInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreSubmitInfo & setSemaphore( VULKAN_HPP_NAMESPACE::Semaphore semaphore_ ) VULKAN_HPP_NOEXCEPT\n    {\n      semaphore = semaphore_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreSubmitInfo & setValue( uint64_t value_ ) VULKAN_HPP_NOEXCEPT\n    {\n      value = value_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreSubmitInfo & setStageMask( VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stageMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stageMask = stageMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreSubmitInfo & setDeviceIndex( uint32_t deviceIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      deviceIndex = deviceIndex_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSemaphoreSubmitInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSemaphoreSubmitInfo *>( this );\n    }\n\n    operator VkSemaphoreSubmitInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSemaphoreSubmitInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Semaphore const &,\n               uint64_t const &,\n               VULKAN_HPP_NAMESPACE::PipelineStageFlags2 const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, semaphore, value, stageMask, deviceIndex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SemaphoreSubmitInfo const & ) const = default;\n#else\n    bool operator==( SemaphoreSubmitInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( semaphore == rhs.semaphore ) && ( value == rhs.value ) && ( stageMask == rhs.stageMask ) &&\n             ( deviceIndex == rhs.deviceIndex );\n#  endif\n    }\n\n    bool operator!=( SemaphoreSubmitInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType       = StructureType::eSemaphoreSubmitInfo;\n    const void *                              pNext       = {};\n    VULKAN_HPP_NAMESPACE::Semaphore           semaphore   = {};\n    uint64_t                                  value       = {};\n    VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stageMask   = {};\n    uint32_t                                  deviceIndex = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSemaphoreSubmitInfo>\n  {\n    using Type = SemaphoreSubmitInfo;\n  };\n\n  using SemaphoreSubmitInfoKHR = SemaphoreSubmitInfo;\n\n  struct RenderPassStripeSubmitInfoARM\n  {\n    using NativeType = VkRenderPassStripeSubmitInfoARM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRenderPassStripeSubmitInfoARM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR RenderPassStripeSubmitInfoARM( uint32_t                                          stripeSemaphoreInfoCount_ = {},\n                                                        const VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo * pStripeSemaphoreInfos_    = {},\n                                                        const void *                                      pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stripeSemaphoreInfoCount{ stripeSemaphoreInfoCount_ }\n      , pStripeSemaphoreInfos{ pStripeSemaphoreInfos_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RenderPassStripeSubmitInfoARM( RenderPassStripeSubmitInfoARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderPassStripeSubmitInfoARM( VkRenderPassStripeSubmitInfoARM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RenderPassStripeSubmitInfoARM( *reinterpret_cast<RenderPassStripeSubmitInfoARM const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassStripeSubmitInfoARM( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo> const & stripeSemaphoreInfos_,\n                                   const void *                                                                                           pNext_ = nullptr )\n      : pNext( pNext_ )\n      , stripeSemaphoreInfoCount( static_cast<uint32_t>( stripeSemaphoreInfos_.size() ) )\n      , pStripeSemaphoreInfos( stripeSemaphoreInfos_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    RenderPassStripeSubmitInfoARM & operator=( RenderPassStripeSubmitInfoARM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderPassStripeSubmitInfoARM & operator=( VkRenderPassStripeSubmitInfoARM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderPassStripeSubmitInfoARM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RenderPassStripeSubmitInfoARM & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassStripeSubmitInfoARM & setStripeSemaphoreInfoCount( uint32_t stripeSemaphoreInfoCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stripeSemaphoreInfoCount = stripeSemaphoreInfoCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassStripeSubmitInfoARM &\n      setPStripeSemaphoreInfos( const VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo * pStripeSemaphoreInfos_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStripeSemaphoreInfos = pStripeSemaphoreInfos_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderPassStripeSubmitInfoARM & setStripeSemaphoreInfos(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo> const & stripeSemaphoreInfos_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stripeSemaphoreInfoCount = static_cast<uint32_t>( stripeSemaphoreInfos_.size() );\n      pStripeSemaphoreInfos    = stripeSemaphoreInfos_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRenderPassStripeSubmitInfoARM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderPassStripeSubmitInfoARM *>( this );\n    }\n\n    operator VkRenderPassStripeSubmitInfoARM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderPassStripeSubmitInfoARM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stripeSemaphoreInfoCount, pStripeSemaphoreInfos );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RenderPassStripeSubmitInfoARM const & ) const = default;\n#else\n    bool operator==( RenderPassStripeSubmitInfoARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( stripeSemaphoreInfoCount == rhs.stripeSemaphoreInfoCount ) &&\n             ( pStripeSemaphoreInfos == rhs.pStripeSemaphoreInfos );\n#  endif\n    }\n\n    bool operator!=( RenderPassStripeSubmitInfoARM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType                    = StructureType::eRenderPassStripeSubmitInfoARM;\n    const void *                                      pNext                    = {};\n    uint32_t                                          stripeSemaphoreInfoCount = {};\n    const VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo * pStripeSemaphoreInfos    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRenderPassStripeSubmitInfoARM>\n  {\n    using Type = RenderPassStripeSubmitInfoARM;\n  };\n\n  struct RenderPassSubpassFeedbackInfoEXT\n  {\n    using NativeType = VkRenderPassSubpassFeedbackInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14\n      RenderPassSubpassFeedbackInfoEXT( VULKAN_HPP_NAMESPACE::SubpassMergeStatusEXT subpassMergeStatus_ = VULKAN_HPP_NAMESPACE::SubpassMergeStatusEXT::eMerged,\n                                        std::array<char, VK_MAX_DESCRIPTION_SIZE> const & description_  = {},\n                                        uint32_t                                          postMergeIndex_ = {} ) VULKAN_HPP_NOEXCEPT\n      : subpassMergeStatus{ subpassMergeStatus_ }\n      , description{ description_ }\n      , postMergeIndex{ postMergeIndex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassSubpassFeedbackInfoEXT( RenderPassSubpassFeedbackInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderPassSubpassFeedbackInfoEXT( VkRenderPassSubpassFeedbackInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RenderPassSubpassFeedbackInfoEXT( *reinterpret_cast<RenderPassSubpassFeedbackInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    RenderPassSubpassFeedbackInfoEXT & operator=( RenderPassSubpassFeedbackInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderPassSubpassFeedbackInfoEXT & operator=( VkRenderPassSubpassFeedbackInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderPassSubpassFeedbackInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkRenderPassSubpassFeedbackInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderPassSubpassFeedbackInfoEXT *>( this );\n    }\n\n    operator VkRenderPassSubpassFeedbackInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderPassSubpassFeedbackInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::\n      tuple<VULKAN_HPP_NAMESPACE::SubpassMergeStatusEXT const &, VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( subpassMergeStatus, description, postMergeIndex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( RenderPassSubpassFeedbackInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = subpassMergeStatus <=> rhs.subpassMergeStatus; cmp != 0 )\n        return cmp;\n      if ( auto cmp = strcmp( description, rhs.description ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = postMergeIndex <=> rhs.postMergeIndex; cmp != 0 )\n        return cmp;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( RenderPassSubpassFeedbackInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( subpassMergeStatus == rhs.subpassMergeStatus ) && ( strcmp( description, rhs.description ) == 0 ) && ( postMergeIndex == rhs.postMergeIndex );\n    }\n\n    bool operator!=( RenderPassSubpassFeedbackInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::SubpassMergeStatusEXT                         subpassMergeStatus = VULKAN_HPP_NAMESPACE::SubpassMergeStatusEXT::eMerged;\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<char, VK_MAX_DESCRIPTION_SIZE> description        = {};\n    uint32_t                                                            postMergeIndex     = {};\n  };\n\n  struct RenderPassSubpassFeedbackCreateInfoEXT\n  {\n    using NativeType = VkRenderPassSubpassFeedbackCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRenderPassSubpassFeedbackCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 RenderPassSubpassFeedbackCreateInfoEXT( VULKAN_HPP_NAMESPACE::RenderPassSubpassFeedbackInfoEXT * pSubpassFeedback_ = {},\n                                                                    const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pSubpassFeedback{ pSubpassFeedback_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassSubpassFeedbackCreateInfoEXT( RenderPassSubpassFeedbackCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderPassSubpassFeedbackCreateInfoEXT( VkRenderPassSubpassFeedbackCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RenderPassSubpassFeedbackCreateInfoEXT( *reinterpret_cast<RenderPassSubpassFeedbackCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    RenderPassSubpassFeedbackCreateInfoEXT & operator=( RenderPassSubpassFeedbackCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderPassSubpassFeedbackCreateInfoEXT & operator=( VkRenderPassSubpassFeedbackCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderPassSubpassFeedbackCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RenderPassSubpassFeedbackCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassSubpassFeedbackCreateInfoEXT &\n      setPSubpassFeedback( VULKAN_HPP_NAMESPACE::RenderPassSubpassFeedbackInfoEXT * pSubpassFeedback_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSubpassFeedback = pSubpassFeedback_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRenderPassSubpassFeedbackCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderPassSubpassFeedbackCreateInfoEXT *>( this );\n    }\n\n    operator VkRenderPassSubpassFeedbackCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderPassSubpassFeedbackCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::RenderPassSubpassFeedbackInfoEXT * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pSubpassFeedback );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RenderPassSubpassFeedbackCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( RenderPassSubpassFeedbackCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pSubpassFeedback == rhs.pSubpassFeedback );\n#  endif\n    }\n\n    bool operator!=( RenderPassSubpassFeedbackCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                      sType            = StructureType::eRenderPassSubpassFeedbackCreateInfoEXT;\n    const void *                                             pNext            = {};\n    VULKAN_HPP_NAMESPACE::RenderPassSubpassFeedbackInfoEXT * pSubpassFeedback = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRenderPassSubpassFeedbackCreateInfoEXT>\n  {\n    using Type = RenderPassSubpassFeedbackCreateInfoEXT;\n  };\n\n  struct RenderPassTransformBeginInfoQCOM\n  {\n    using NativeType = VkRenderPassTransformBeginInfoQCOM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRenderPassTransformBeginInfoQCOM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR RenderPassTransformBeginInfoQCOM(\n      VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR transform_ = VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR::eIdentity,\n      void *                                            pNext_     = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , transform{ transform_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RenderPassTransformBeginInfoQCOM( RenderPassTransformBeginInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderPassTransformBeginInfoQCOM( VkRenderPassTransformBeginInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RenderPassTransformBeginInfoQCOM( *reinterpret_cast<RenderPassTransformBeginInfoQCOM const *>( &rhs ) )\n    {\n    }\n\n    RenderPassTransformBeginInfoQCOM & operator=( RenderPassTransformBeginInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderPassTransformBeginInfoQCOM & operator=( VkRenderPassTransformBeginInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderPassTransformBeginInfoQCOM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RenderPassTransformBeginInfoQCOM & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderPassTransformBeginInfoQCOM & setTransform( VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR transform_ ) VULKAN_HPP_NOEXCEPT\n    {\n      transform = transform_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRenderPassTransformBeginInfoQCOM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderPassTransformBeginInfoQCOM *>( this );\n    }\n\n    operator VkRenderPassTransformBeginInfoQCOM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderPassTransformBeginInfoQCOM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, transform );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RenderPassTransformBeginInfoQCOM const & ) const = default;\n#else\n    bool operator==( RenderPassTransformBeginInfoQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( transform == rhs.transform );\n#  endif\n    }\n\n    bool operator!=( RenderPassTransformBeginInfoQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType     = StructureType::eRenderPassTransformBeginInfoQCOM;\n    void *                                            pNext     = {};\n    VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR transform = VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR::eIdentity;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRenderPassTransformBeginInfoQCOM>\n  {\n    using Type = RenderPassTransformBeginInfoQCOM;\n  };\n\n  struct RenderingAreaInfo\n  {\n    using NativeType = VkRenderingAreaInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRenderingAreaInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR RenderingAreaInfo( uint32_t                             viewMask_                = {},\n                                            uint32_t                             colorAttachmentCount_    = {},\n                                            const VULKAN_HPP_NAMESPACE::Format * pColorAttachmentFormats_ = {},\n                                            VULKAN_HPP_NAMESPACE::Format         depthAttachmentFormat_   = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                            VULKAN_HPP_NAMESPACE::Format         stencilAttachmentFormat_ = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                            const void *                         pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , viewMask{ viewMask_ }\n      , colorAttachmentCount{ colorAttachmentCount_ }\n      , pColorAttachmentFormats{ pColorAttachmentFormats_ }\n      , depthAttachmentFormat{ depthAttachmentFormat_ }\n      , stencilAttachmentFormat{ stencilAttachmentFormat_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RenderingAreaInfo( RenderingAreaInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderingAreaInfo( VkRenderingAreaInfo const & rhs ) VULKAN_HPP_NOEXCEPT : RenderingAreaInfo( *reinterpret_cast<RenderingAreaInfo const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderingAreaInfo( uint32_t                                                                                  viewMask_,\n                       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Format> const & colorAttachmentFormats_,\n                       VULKAN_HPP_NAMESPACE::Format depthAttachmentFormat_   = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                       VULKAN_HPP_NAMESPACE::Format stencilAttachmentFormat_ = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                       const void *                 pNext_                   = nullptr )\n      : pNext( pNext_ )\n      , viewMask( viewMask_ )\n      , colorAttachmentCount( static_cast<uint32_t>( colorAttachmentFormats_.size() ) )\n      , pColorAttachmentFormats( colorAttachmentFormats_.data() )\n      , depthAttachmentFormat( depthAttachmentFormat_ )\n      , stencilAttachmentFormat( stencilAttachmentFormat_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    RenderingAreaInfo & operator=( RenderingAreaInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderingAreaInfo & operator=( VkRenderingAreaInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderingAreaInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RenderingAreaInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingAreaInfo & setViewMask( uint32_t viewMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      viewMask = viewMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingAreaInfo & setColorAttachmentCount( uint32_t colorAttachmentCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorAttachmentCount = colorAttachmentCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingAreaInfo & setPColorAttachmentFormats( const VULKAN_HPP_NAMESPACE::Format * pColorAttachmentFormats_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pColorAttachmentFormats = pColorAttachmentFormats_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderingAreaInfo & setColorAttachmentFormats(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Format> const & colorAttachmentFormats_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorAttachmentCount    = static_cast<uint32_t>( colorAttachmentFormats_.size() );\n      pColorAttachmentFormats = colorAttachmentFormats_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingAreaInfo & setDepthAttachmentFormat( VULKAN_HPP_NAMESPACE::Format depthAttachmentFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthAttachmentFormat = depthAttachmentFormat_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingAreaInfo & setStencilAttachmentFormat( VULKAN_HPP_NAMESPACE::Format stencilAttachmentFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stencilAttachmentFormat = stencilAttachmentFormat_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRenderingAreaInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderingAreaInfo *>( this );\n    }\n\n    operator VkRenderingAreaInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderingAreaInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::Format * const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::Format const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, viewMask, colorAttachmentCount, pColorAttachmentFormats, depthAttachmentFormat, stencilAttachmentFormat );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RenderingAreaInfo const & ) const = default;\n#else\n    bool operator==( RenderingAreaInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( viewMask == rhs.viewMask ) && ( colorAttachmentCount == rhs.colorAttachmentCount ) &&\n             ( pColorAttachmentFormats == rhs.pColorAttachmentFormats ) && ( depthAttachmentFormat == rhs.depthAttachmentFormat ) &&\n             ( stencilAttachmentFormat == rhs.stencilAttachmentFormat );\n#  endif\n    }\n\n    bool operator!=( RenderingAreaInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType  sType                   = StructureType::eRenderingAreaInfo;\n    const void *                         pNext                   = {};\n    uint32_t                             viewMask                = {};\n    uint32_t                             colorAttachmentCount    = {};\n    const VULKAN_HPP_NAMESPACE::Format * pColorAttachmentFormats = {};\n    VULKAN_HPP_NAMESPACE::Format         depthAttachmentFormat   = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::Format         stencilAttachmentFormat = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRenderingAreaInfo>\n  {\n    using Type = RenderingAreaInfo;\n  };\n\n  using RenderingAreaInfoKHR = RenderingAreaInfo;\n\n  struct RenderingAttachmentInfo\n  {\n    using NativeType = VkRenderingAttachmentInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRenderingAttachmentInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 RenderingAttachmentInfo( VULKAN_HPP_NAMESPACE::ImageView           imageView_   = {},\n                                                     VULKAN_HPP_NAMESPACE::ImageLayout         imageLayout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                                     VULKAN_HPP_NAMESPACE::ResolveModeFlagBits resolveMode_ = VULKAN_HPP_NAMESPACE::ResolveModeFlagBits::eNone,\n                                                     VULKAN_HPP_NAMESPACE::ImageView           resolveImageView_ = {},\n                                                     VULKAN_HPP_NAMESPACE::ImageLayout      resolveImageLayout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                                     VULKAN_HPP_NAMESPACE::AttachmentLoadOp loadOp_             = VULKAN_HPP_NAMESPACE::AttachmentLoadOp::eLoad,\n                                                     VULKAN_HPP_NAMESPACE::AttachmentStoreOp storeOp_    = VULKAN_HPP_NAMESPACE::AttachmentStoreOp::eStore,\n                                                     VULKAN_HPP_NAMESPACE::ClearValue        clearValue_ = {},\n                                                     const void *                            pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , imageView{ imageView_ }\n      , imageLayout{ imageLayout_ }\n      , resolveMode{ resolveMode_ }\n      , resolveImageView{ resolveImageView_ }\n      , resolveImageLayout{ resolveImageLayout_ }\n      , loadOp{ loadOp_ }\n      , storeOp{ storeOp_ }\n      , clearValue{ clearValue_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingAttachmentInfo( RenderingAttachmentInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderingAttachmentInfo( VkRenderingAttachmentInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RenderingAttachmentInfo( *reinterpret_cast<RenderingAttachmentInfo const *>( &rhs ) )\n    {\n    }\n\n    RenderingAttachmentInfo & operator=( RenderingAttachmentInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderingAttachmentInfo & operator=( VkRenderingAttachmentInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderingAttachmentInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RenderingAttachmentInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingAttachmentInfo & setImageView( VULKAN_HPP_NAMESPACE::ImageView imageView_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageView = imageView_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingAttachmentInfo & setImageLayout( VULKAN_HPP_NAMESPACE::ImageLayout imageLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageLayout = imageLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingAttachmentInfo & setResolveMode( VULKAN_HPP_NAMESPACE::ResolveModeFlagBits resolveMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      resolveMode = resolveMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingAttachmentInfo & setResolveImageView( VULKAN_HPP_NAMESPACE::ImageView resolveImageView_ ) VULKAN_HPP_NOEXCEPT\n    {\n      resolveImageView = resolveImageView_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingAttachmentInfo & setResolveImageLayout( VULKAN_HPP_NAMESPACE::ImageLayout resolveImageLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      resolveImageLayout = resolveImageLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingAttachmentInfo & setLoadOp( VULKAN_HPP_NAMESPACE::AttachmentLoadOp loadOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      loadOp = loadOp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingAttachmentInfo & setStoreOp( VULKAN_HPP_NAMESPACE::AttachmentStoreOp storeOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      storeOp = storeOp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingAttachmentInfo & setClearValue( VULKAN_HPP_NAMESPACE::ClearValue const & clearValue_ ) VULKAN_HPP_NOEXCEPT\n    {\n      clearValue = clearValue_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRenderingAttachmentInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderingAttachmentInfo *>( this );\n    }\n\n    operator VkRenderingAttachmentInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderingAttachmentInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ImageView const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               VULKAN_HPP_NAMESPACE::ResolveModeFlagBits const &,\n               VULKAN_HPP_NAMESPACE::ImageView const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               VULKAN_HPP_NAMESPACE::AttachmentLoadOp const &,\n               VULKAN_HPP_NAMESPACE::AttachmentStoreOp const &,\n               VULKAN_HPP_NAMESPACE::ClearValue const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, imageView, imageLayout, resolveMode, resolveImageView, resolveImageLayout, loadOp, storeOp, clearValue );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType       sType              = StructureType::eRenderingAttachmentInfo;\n    const void *                              pNext              = {};\n    VULKAN_HPP_NAMESPACE::ImageView           imageView          = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout         imageLayout        = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    VULKAN_HPP_NAMESPACE::ResolveModeFlagBits resolveMode        = VULKAN_HPP_NAMESPACE::ResolveModeFlagBits::eNone;\n    VULKAN_HPP_NAMESPACE::ImageView           resolveImageView   = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout         resolveImageLayout = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    VULKAN_HPP_NAMESPACE::AttachmentLoadOp    loadOp             = VULKAN_HPP_NAMESPACE::AttachmentLoadOp::eLoad;\n    VULKAN_HPP_NAMESPACE::AttachmentStoreOp   storeOp            = VULKAN_HPP_NAMESPACE::AttachmentStoreOp::eStore;\n    VULKAN_HPP_NAMESPACE::ClearValue          clearValue         = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRenderingAttachmentInfo>\n  {\n    using Type = RenderingAttachmentInfo;\n  };\n\n  using RenderingAttachmentInfoKHR = RenderingAttachmentInfo;\n\n  struct RenderingAttachmentLocationInfo\n  {\n    using NativeType = VkRenderingAttachmentLocationInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRenderingAttachmentLocationInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR RenderingAttachmentLocationInfo( uint32_t         colorAttachmentCount_      = {},\n                                                          const uint32_t * pColorAttachmentLocations_ = {},\n                                                          const void *     pNext_                     = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , colorAttachmentCount{ colorAttachmentCount_ }\n      , pColorAttachmentLocations{ pColorAttachmentLocations_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RenderingAttachmentLocationInfo( RenderingAttachmentLocationInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderingAttachmentLocationInfo( VkRenderingAttachmentLocationInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RenderingAttachmentLocationInfo( *reinterpret_cast<RenderingAttachmentLocationInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderingAttachmentLocationInfo( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & colorAttachmentLocations_,\n                                     const void *                                                          pNext_ = nullptr )\n      : pNext( pNext_ )\n      , colorAttachmentCount( static_cast<uint32_t>( colorAttachmentLocations_.size() ) )\n      , pColorAttachmentLocations( colorAttachmentLocations_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    RenderingAttachmentLocationInfo & operator=( RenderingAttachmentLocationInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderingAttachmentLocationInfo & operator=( VkRenderingAttachmentLocationInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderingAttachmentLocationInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RenderingAttachmentLocationInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingAttachmentLocationInfo & setColorAttachmentCount( uint32_t colorAttachmentCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorAttachmentCount = colorAttachmentCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingAttachmentLocationInfo & setPColorAttachmentLocations( const uint32_t * pColorAttachmentLocations_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pColorAttachmentLocations = pColorAttachmentLocations_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderingAttachmentLocationInfo &\n      setColorAttachmentLocations( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & colorAttachmentLocations_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorAttachmentCount      = static_cast<uint32_t>( colorAttachmentLocations_.size() );\n      pColorAttachmentLocations = colorAttachmentLocations_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRenderingAttachmentLocationInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderingAttachmentLocationInfo *>( this );\n    }\n\n    operator VkRenderingAttachmentLocationInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderingAttachmentLocationInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const uint32_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, colorAttachmentCount, pColorAttachmentLocations );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RenderingAttachmentLocationInfo const & ) const = default;\n#else\n    bool operator==( RenderingAttachmentLocationInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( colorAttachmentCount == rhs.colorAttachmentCount ) &&\n             ( pColorAttachmentLocations == rhs.pColorAttachmentLocations );\n#  endif\n    }\n\n    bool operator!=( RenderingAttachmentLocationInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                     = StructureType::eRenderingAttachmentLocationInfo;\n    const void *                        pNext                     = {};\n    uint32_t                            colorAttachmentCount      = {};\n    const uint32_t *                    pColorAttachmentLocations = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRenderingAttachmentLocationInfo>\n  {\n    using Type = RenderingAttachmentLocationInfo;\n  };\n\n  using RenderingAttachmentLocationInfoKHR = RenderingAttachmentLocationInfo;\n\n  struct RenderingFragmentDensityMapAttachmentInfoEXT\n  {\n    using NativeType = VkRenderingFragmentDensityMapAttachmentInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRenderingFragmentDensityMapAttachmentInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      RenderingFragmentDensityMapAttachmentInfoEXT( VULKAN_HPP_NAMESPACE::ImageView   imageView_   = {},\n                                                    VULKAN_HPP_NAMESPACE::ImageLayout imageLayout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                                    const void *                      pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , imageView{ imageView_ }\n      , imageLayout{ imageLayout_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RenderingFragmentDensityMapAttachmentInfoEXT( RenderingFragmentDensityMapAttachmentInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderingFragmentDensityMapAttachmentInfoEXT( VkRenderingFragmentDensityMapAttachmentInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RenderingFragmentDensityMapAttachmentInfoEXT( *reinterpret_cast<RenderingFragmentDensityMapAttachmentInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    RenderingFragmentDensityMapAttachmentInfoEXT & operator=( RenderingFragmentDensityMapAttachmentInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderingFragmentDensityMapAttachmentInfoEXT & operator=( VkRenderingFragmentDensityMapAttachmentInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderingFragmentDensityMapAttachmentInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RenderingFragmentDensityMapAttachmentInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingFragmentDensityMapAttachmentInfoEXT & setImageView( VULKAN_HPP_NAMESPACE::ImageView imageView_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageView = imageView_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingFragmentDensityMapAttachmentInfoEXT & setImageLayout( VULKAN_HPP_NAMESPACE::ImageLayout imageLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageLayout = imageLayout_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRenderingFragmentDensityMapAttachmentInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderingFragmentDensityMapAttachmentInfoEXT *>( this );\n    }\n\n    operator VkRenderingFragmentDensityMapAttachmentInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderingFragmentDensityMapAttachmentInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ImageView const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, imageView, imageLayout );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RenderingFragmentDensityMapAttachmentInfoEXT const & ) const = default;\n#else\n    bool operator==( RenderingFragmentDensityMapAttachmentInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( imageView == rhs.imageView ) && ( imageLayout == rhs.imageLayout );\n#  endif\n    }\n\n    bool operator!=( RenderingFragmentDensityMapAttachmentInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType       = StructureType::eRenderingFragmentDensityMapAttachmentInfoEXT;\n    const void *                        pNext       = {};\n    VULKAN_HPP_NAMESPACE::ImageView     imageView   = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout   imageLayout = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRenderingFragmentDensityMapAttachmentInfoEXT>\n  {\n    using Type = RenderingFragmentDensityMapAttachmentInfoEXT;\n  };\n\n  struct RenderingFragmentShadingRateAttachmentInfoKHR\n  {\n    using NativeType = VkRenderingFragmentShadingRateAttachmentInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRenderingFragmentShadingRateAttachmentInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      RenderingFragmentShadingRateAttachmentInfoKHR( VULKAN_HPP_NAMESPACE::ImageView   imageView_   = {},\n                                                     VULKAN_HPP_NAMESPACE::ImageLayout imageLayout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                                     VULKAN_HPP_NAMESPACE::Extent2D    shadingRateAttachmentTexelSize_ = {},\n                                                     const void *                      pNext_                          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , imageView{ imageView_ }\n      , imageLayout{ imageLayout_ }\n      , shadingRateAttachmentTexelSize{ shadingRateAttachmentTexelSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      RenderingFragmentShadingRateAttachmentInfoKHR( RenderingFragmentShadingRateAttachmentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderingFragmentShadingRateAttachmentInfoKHR( VkRenderingFragmentShadingRateAttachmentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RenderingFragmentShadingRateAttachmentInfoKHR( *reinterpret_cast<RenderingFragmentShadingRateAttachmentInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    RenderingFragmentShadingRateAttachmentInfoKHR & operator=( RenderingFragmentShadingRateAttachmentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderingFragmentShadingRateAttachmentInfoKHR & operator=( VkRenderingFragmentShadingRateAttachmentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderingFragmentShadingRateAttachmentInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RenderingFragmentShadingRateAttachmentInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingFragmentShadingRateAttachmentInfoKHR & setImageView( VULKAN_HPP_NAMESPACE::ImageView imageView_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageView = imageView_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingFragmentShadingRateAttachmentInfoKHR & setImageLayout( VULKAN_HPP_NAMESPACE::ImageLayout imageLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageLayout = imageLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingFragmentShadingRateAttachmentInfoKHR &\n      setShadingRateAttachmentTexelSize( VULKAN_HPP_NAMESPACE::Extent2D const & shadingRateAttachmentTexelSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shadingRateAttachmentTexelSize = shadingRateAttachmentTexelSize_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRenderingFragmentShadingRateAttachmentInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderingFragmentShadingRateAttachmentInfoKHR *>( this );\n    }\n\n    operator VkRenderingFragmentShadingRateAttachmentInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderingFragmentShadingRateAttachmentInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ImageView const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, imageView, imageLayout, shadingRateAttachmentTexelSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RenderingFragmentShadingRateAttachmentInfoKHR const & ) const = default;\n#else\n    bool operator==( RenderingFragmentShadingRateAttachmentInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( imageView == rhs.imageView ) && ( imageLayout == rhs.imageLayout ) &&\n             ( shadingRateAttachmentTexelSize == rhs.shadingRateAttachmentTexelSize );\n#  endif\n    }\n\n    bool operator!=( RenderingFragmentShadingRateAttachmentInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                          = StructureType::eRenderingFragmentShadingRateAttachmentInfoKHR;\n    const void *                        pNext                          = {};\n    VULKAN_HPP_NAMESPACE::ImageView     imageView                      = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout   imageLayout                    = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    VULKAN_HPP_NAMESPACE::Extent2D      shadingRateAttachmentTexelSize = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRenderingFragmentShadingRateAttachmentInfoKHR>\n  {\n    using Type = RenderingFragmentShadingRateAttachmentInfoKHR;\n  };\n\n  struct RenderingInfo\n  {\n    using NativeType = VkRenderingInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRenderingInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 RenderingInfo( VULKAN_HPP_NAMESPACE::RenderingFlags                  flags_                = {},\n                                           VULKAN_HPP_NAMESPACE::Rect2D                          renderArea_           = {},\n                                           uint32_t                                              layerCount_           = {},\n                                           uint32_t                                              viewMask_             = {},\n                                           uint32_t                                              colorAttachmentCount_ = {},\n                                           const VULKAN_HPP_NAMESPACE::RenderingAttachmentInfo * pColorAttachments_    = {},\n                                           const VULKAN_HPP_NAMESPACE::RenderingAttachmentInfo * pDepthAttachment_     = {},\n                                           const VULKAN_HPP_NAMESPACE::RenderingAttachmentInfo * pStencilAttachment_   = {},\n                                           const void *                                          pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , renderArea{ renderArea_ }\n      , layerCount{ layerCount_ }\n      , viewMask{ viewMask_ }\n      , colorAttachmentCount{ colorAttachmentCount_ }\n      , pColorAttachments{ pColorAttachments_ }\n      , pDepthAttachment{ pDepthAttachment_ }\n      , pStencilAttachment{ pStencilAttachment_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingInfo( RenderingInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderingInfo( VkRenderingInfo const & rhs ) VULKAN_HPP_NOEXCEPT : RenderingInfo( *reinterpret_cast<RenderingInfo const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderingInfo( VULKAN_HPP_NAMESPACE::RenderingFlags                                                                       flags_,\n                   VULKAN_HPP_NAMESPACE::Rect2D                                                                               renderArea_,\n                   uint32_t                                                                                                   layerCount_,\n                   uint32_t                                                                                                   viewMask_,\n                   VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::RenderingAttachmentInfo> const & colorAttachments_,\n                   const VULKAN_HPP_NAMESPACE::RenderingAttachmentInfo *                                                      pDepthAttachment_   = {},\n                   const VULKAN_HPP_NAMESPACE::RenderingAttachmentInfo *                                                      pStencilAttachment_ = {},\n                   const void *                                                                                               pNext_              = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , renderArea( renderArea_ )\n      , layerCount( layerCount_ )\n      , viewMask( viewMask_ )\n      , colorAttachmentCount( static_cast<uint32_t>( colorAttachments_.size() ) )\n      , pColorAttachments( colorAttachments_.data() )\n      , pDepthAttachment( pDepthAttachment_ )\n      , pStencilAttachment( pStencilAttachment_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    RenderingInfo & operator=( RenderingInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderingInfo & operator=( VkRenderingInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderingInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RenderingInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingInfo & setFlags( VULKAN_HPP_NAMESPACE::RenderingFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingInfo & setRenderArea( VULKAN_HPP_NAMESPACE::Rect2D const & renderArea_ ) VULKAN_HPP_NOEXCEPT\n    {\n      renderArea = renderArea_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingInfo & setLayerCount( uint32_t layerCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layerCount = layerCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingInfo & setViewMask( uint32_t viewMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      viewMask = viewMask_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingInfo & setColorAttachmentCount( uint32_t colorAttachmentCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorAttachmentCount = colorAttachmentCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingInfo & setPColorAttachments( const VULKAN_HPP_NAMESPACE::RenderingAttachmentInfo * pColorAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pColorAttachments = pColorAttachments_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderingInfo & setColorAttachments(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::RenderingAttachmentInfo> const & colorAttachments_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorAttachmentCount = static_cast<uint32_t>( colorAttachments_.size() );\n      pColorAttachments    = colorAttachments_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingInfo & setPDepthAttachment( const VULKAN_HPP_NAMESPACE::RenderingAttachmentInfo * pDepthAttachment_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDepthAttachment = pDepthAttachment_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingInfo &\n      setPStencilAttachment( const VULKAN_HPP_NAMESPACE::RenderingAttachmentInfo * pStencilAttachment_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStencilAttachment = pStencilAttachment_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRenderingInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderingInfo *>( this );\n    }\n\n    operator VkRenderingInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderingInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::RenderingFlags const &,\n               VULKAN_HPP_NAMESPACE::Rect2D const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::RenderingAttachmentInfo * const &,\n               const VULKAN_HPP_NAMESPACE::RenderingAttachmentInfo * const &,\n               const VULKAN_HPP_NAMESPACE::RenderingAttachmentInfo * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, renderArea, layerCount, viewMask, colorAttachmentCount, pColorAttachments, pDepthAttachment, pStencilAttachment );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RenderingInfo const & ) const = default;\n#else\n    bool operator==( RenderingInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( renderArea == rhs.renderArea ) &&\n             ( layerCount == rhs.layerCount ) && ( viewMask == rhs.viewMask ) && ( colorAttachmentCount == rhs.colorAttachmentCount ) &&\n             ( pColorAttachments == rhs.pColorAttachments ) && ( pDepthAttachment == rhs.pDepthAttachment ) && ( pStencilAttachment == rhs.pStencilAttachment );\n#  endif\n    }\n\n    bool operator!=( RenderingInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                   sType                = StructureType::eRenderingInfo;\n    const void *                                          pNext                = {};\n    VULKAN_HPP_NAMESPACE::RenderingFlags                  flags                = {};\n    VULKAN_HPP_NAMESPACE::Rect2D                          renderArea           = {};\n    uint32_t                                              layerCount           = {};\n    uint32_t                                              viewMask             = {};\n    uint32_t                                              colorAttachmentCount = {};\n    const VULKAN_HPP_NAMESPACE::RenderingAttachmentInfo * pColorAttachments    = {};\n    const VULKAN_HPP_NAMESPACE::RenderingAttachmentInfo * pDepthAttachment     = {};\n    const VULKAN_HPP_NAMESPACE::RenderingAttachmentInfo * pStencilAttachment   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRenderingInfo>\n  {\n    using Type = RenderingInfo;\n  };\n\n  using RenderingInfoKHR = RenderingInfo;\n\n  struct RenderingInputAttachmentIndexInfo\n  {\n    using NativeType = VkRenderingInputAttachmentIndexInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eRenderingInputAttachmentIndexInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR RenderingInputAttachmentIndexInfo( uint32_t         colorAttachmentCount_         = {},\n                                                            const uint32_t * pColorAttachmentInputIndices_ = {},\n                                                            const uint32_t * pDepthInputAttachmentIndex_   = {},\n                                                            const uint32_t * pStencilInputAttachmentIndex_ = {},\n                                                            const void *     pNext_                        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , colorAttachmentCount{ colorAttachmentCount_ }\n      , pColorAttachmentInputIndices{ pColorAttachmentInputIndices_ }\n      , pDepthInputAttachmentIndex{ pDepthInputAttachmentIndex_ }\n      , pStencilInputAttachmentIndex{ pStencilInputAttachmentIndex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR RenderingInputAttachmentIndexInfo( RenderingInputAttachmentIndexInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    RenderingInputAttachmentIndexInfo( VkRenderingInputAttachmentIndexInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : RenderingInputAttachmentIndexInfo( *reinterpret_cast<RenderingInputAttachmentIndexInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderingInputAttachmentIndexInfo( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & colorAttachmentInputIndices_,\n                                       const uint32_t *                                                      pDepthInputAttachmentIndex_   = {},\n                                       const uint32_t *                                                      pStencilInputAttachmentIndex_ = {},\n                                       const void *                                                          pNext_                        = nullptr )\n      : pNext( pNext_ )\n      , colorAttachmentCount( static_cast<uint32_t>( colorAttachmentInputIndices_.size() ) )\n      , pColorAttachmentInputIndices( colorAttachmentInputIndices_.data() )\n      , pDepthInputAttachmentIndex( pDepthInputAttachmentIndex_ )\n      , pStencilInputAttachmentIndex( pStencilInputAttachmentIndex_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    RenderingInputAttachmentIndexInfo & operator=( RenderingInputAttachmentIndexInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    RenderingInputAttachmentIndexInfo & operator=( VkRenderingInputAttachmentIndexInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::RenderingInputAttachmentIndexInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 RenderingInputAttachmentIndexInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingInputAttachmentIndexInfo & setColorAttachmentCount( uint32_t colorAttachmentCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorAttachmentCount = colorAttachmentCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingInputAttachmentIndexInfo &\n      setPColorAttachmentInputIndices( const uint32_t * pColorAttachmentInputIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pColorAttachmentInputIndices = pColorAttachmentInputIndices_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    RenderingInputAttachmentIndexInfo &\n      setColorAttachmentInputIndices( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & colorAttachmentInputIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      colorAttachmentCount         = static_cast<uint32_t>( colorAttachmentInputIndices_.size() );\n      pColorAttachmentInputIndices = colorAttachmentInputIndices_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingInputAttachmentIndexInfo &\n      setPDepthInputAttachmentIndex( const uint32_t * pDepthInputAttachmentIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDepthInputAttachmentIndex = pDepthInputAttachmentIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 RenderingInputAttachmentIndexInfo &\n      setPStencilInputAttachmentIndex( const uint32_t * pStencilInputAttachmentIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStencilInputAttachmentIndex = pStencilInputAttachmentIndex_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkRenderingInputAttachmentIndexInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkRenderingInputAttachmentIndexInfo *>( this );\n    }\n\n    operator VkRenderingInputAttachmentIndexInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkRenderingInputAttachmentIndexInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const uint32_t * const &,\n               const uint32_t * const &,\n               const uint32_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, colorAttachmentCount, pColorAttachmentInputIndices, pDepthInputAttachmentIndex, pStencilInputAttachmentIndex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( RenderingInputAttachmentIndexInfo const & ) const = default;\n#else\n    bool operator==( RenderingInputAttachmentIndexInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( colorAttachmentCount == rhs.colorAttachmentCount ) &&\n             ( pColorAttachmentInputIndices == rhs.pColorAttachmentInputIndices ) && ( pDepthInputAttachmentIndex == rhs.pDepthInputAttachmentIndex ) &&\n             ( pStencilInputAttachmentIndex == rhs.pStencilInputAttachmentIndex );\n#  endif\n    }\n\n    bool operator!=( RenderingInputAttachmentIndexInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                        = StructureType::eRenderingInputAttachmentIndexInfo;\n    const void *                        pNext                        = {};\n    uint32_t                            colorAttachmentCount         = {};\n    const uint32_t *                    pColorAttachmentInputIndices = {};\n    const uint32_t *                    pDepthInputAttachmentIndex   = {};\n    const uint32_t *                    pStencilInputAttachmentIndex = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eRenderingInputAttachmentIndexInfo>\n  {\n    using Type = RenderingInputAttachmentIndexInfo;\n  };\n\n  using RenderingInputAttachmentIndexInfoKHR = RenderingInputAttachmentIndexInfo;\n\n  struct ResolveImageInfo2\n  {\n    using NativeType = VkResolveImageInfo2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eResolveImageInfo2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ResolveImageInfo2( VULKAN_HPP_NAMESPACE::Image                 srcImage_       = {},\n                                            VULKAN_HPP_NAMESPACE::ImageLayout           srcImageLayout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                            VULKAN_HPP_NAMESPACE::Image                 dstImage_       = {},\n                                            VULKAN_HPP_NAMESPACE::ImageLayout           dstImageLayout_ = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined,\n                                            uint32_t                                    regionCount_    = {},\n                                            const VULKAN_HPP_NAMESPACE::ImageResolve2 * pRegions_       = {},\n                                            const void *                                pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , srcImage{ srcImage_ }\n      , srcImageLayout{ srcImageLayout_ }\n      , dstImage{ dstImage_ }\n      , dstImageLayout{ dstImageLayout_ }\n      , regionCount{ regionCount_ }\n      , pRegions{ pRegions_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ResolveImageInfo2( ResolveImageInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ResolveImageInfo2( VkResolveImageInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT : ResolveImageInfo2( *reinterpret_cast<ResolveImageInfo2 const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ResolveImageInfo2( VULKAN_HPP_NAMESPACE::Image                                                                      srcImage_,\n                       VULKAN_HPP_NAMESPACE::ImageLayout                                                                srcImageLayout_,\n                       VULKAN_HPP_NAMESPACE::Image                                                                      dstImage_,\n                       VULKAN_HPP_NAMESPACE::ImageLayout                                                                dstImageLayout_,\n                       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageResolve2> const & regions_,\n                       const void *                                                                                     pNext_ = nullptr )\n      : pNext( pNext_ )\n      , srcImage( srcImage_ )\n      , srcImageLayout( srcImageLayout_ )\n      , dstImage( dstImage_ )\n      , dstImageLayout( dstImageLayout_ )\n      , regionCount( static_cast<uint32_t>( regions_.size() ) )\n      , pRegions( regions_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    ResolveImageInfo2 & operator=( ResolveImageInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ResolveImageInfo2 & operator=( VkResolveImageInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ResolveImageInfo2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ResolveImageInfo2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ResolveImageInfo2 & setSrcImage( VULKAN_HPP_NAMESPACE::Image srcImage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcImage = srcImage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ResolveImageInfo2 & setSrcImageLayout( VULKAN_HPP_NAMESPACE::ImageLayout srcImageLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcImageLayout = srcImageLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ResolveImageInfo2 & setDstImage( VULKAN_HPP_NAMESPACE::Image dstImage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstImage = dstImage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ResolveImageInfo2 & setDstImageLayout( VULKAN_HPP_NAMESPACE::ImageLayout dstImageLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstImageLayout = dstImageLayout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ResolveImageInfo2 & setRegionCount( uint32_t regionCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      regionCount = regionCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ResolveImageInfo2 & setPRegions( const VULKAN_HPP_NAMESPACE::ImageResolve2 * pRegions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pRegions = pRegions_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ResolveImageInfo2 &\n      setRegions( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageResolve2> const & regions_ ) VULKAN_HPP_NOEXCEPT\n    {\n      regionCount = static_cast<uint32_t>( regions_.size() );\n      pRegions    = regions_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkResolveImageInfo2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkResolveImageInfo2 *>( this );\n    }\n\n    operator VkResolveImageInfo2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkResolveImageInfo2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Image const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               VULKAN_HPP_NAMESPACE::Image const &,\n               VULKAN_HPP_NAMESPACE::ImageLayout const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::ImageResolve2 * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ResolveImageInfo2 const & ) const = default;\n#else\n    bool operator==( ResolveImageInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( srcImage == rhs.srcImage ) && ( srcImageLayout == rhs.srcImageLayout ) &&\n             ( dstImage == rhs.dstImage ) && ( dstImageLayout == rhs.dstImageLayout ) && ( regionCount == rhs.regionCount ) && ( pRegions == rhs.pRegions );\n#  endif\n    }\n\n    bool operator!=( ResolveImageInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType         sType          = StructureType::eResolveImageInfo2;\n    const void *                                pNext          = {};\n    VULKAN_HPP_NAMESPACE::Image                 srcImage       = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout           srcImageLayout = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    VULKAN_HPP_NAMESPACE::Image                 dstImage       = {};\n    VULKAN_HPP_NAMESPACE::ImageLayout           dstImageLayout = VULKAN_HPP_NAMESPACE::ImageLayout::eUndefined;\n    uint32_t                                    regionCount    = {};\n    const VULKAN_HPP_NAMESPACE::ImageResolve2 * pRegions       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eResolveImageInfo2>\n  {\n    using Type = ResolveImageInfo2;\n  };\n\n  using ResolveImageInfo2KHR = ResolveImageInfo2;\n\n  struct SamplerBlockMatchWindowCreateInfoQCOM\n  {\n    using NativeType = VkSamplerBlockMatchWindowCreateInfoQCOM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSamplerBlockMatchWindowCreateInfoQCOM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SamplerBlockMatchWindowCreateInfoQCOM(\n      VULKAN_HPP_NAMESPACE::Extent2D                        windowExtent_      = {},\n      VULKAN_HPP_NAMESPACE::BlockMatchWindowCompareModeQCOM windowCompareMode_ = VULKAN_HPP_NAMESPACE::BlockMatchWindowCompareModeQCOM::eMin,\n      const void *                                          pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , windowExtent{ windowExtent_ }\n      , windowCompareMode{ windowCompareMode_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SamplerBlockMatchWindowCreateInfoQCOM( SamplerBlockMatchWindowCreateInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SamplerBlockMatchWindowCreateInfoQCOM( VkSamplerBlockMatchWindowCreateInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SamplerBlockMatchWindowCreateInfoQCOM( *reinterpret_cast<SamplerBlockMatchWindowCreateInfoQCOM const *>( &rhs ) )\n    {\n    }\n\n    SamplerBlockMatchWindowCreateInfoQCOM & operator=( SamplerBlockMatchWindowCreateInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SamplerBlockMatchWindowCreateInfoQCOM & operator=( VkSamplerBlockMatchWindowCreateInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SamplerBlockMatchWindowCreateInfoQCOM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SamplerBlockMatchWindowCreateInfoQCOM & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerBlockMatchWindowCreateInfoQCOM & setWindowExtent( VULKAN_HPP_NAMESPACE::Extent2D const & windowExtent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      windowExtent = windowExtent_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerBlockMatchWindowCreateInfoQCOM &\n      setWindowCompareMode( VULKAN_HPP_NAMESPACE::BlockMatchWindowCompareModeQCOM windowCompareMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      windowCompareMode = windowCompareMode_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSamplerBlockMatchWindowCreateInfoQCOM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSamplerBlockMatchWindowCreateInfoQCOM *>( this );\n    }\n\n    operator VkSamplerBlockMatchWindowCreateInfoQCOM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSamplerBlockMatchWindowCreateInfoQCOM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::BlockMatchWindowCompareModeQCOM const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, windowExtent, windowCompareMode );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SamplerBlockMatchWindowCreateInfoQCOM const & ) const = default;\n#else\n    bool operator==( SamplerBlockMatchWindowCreateInfoQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( windowExtent == rhs.windowExtent ) && ( windowCompareMode == rhs.windowCompareMode );\n#  endif\n    }\n\n    bool operator!=( SamplerBlockMatchWindowCreateInfoQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                   sType             = StructureType::eSamplerBlockMatchWindowCreateInfoQCOM;\n    const void *                                          pNext             = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                        windowExtent      = {};\n    VULKAN_HPP_NAMESPACE::BlockMatchWindowCompareModeQCOM windowCompareMode = VULKAN_HPP_NAMESPACE::BlockMatchWindowCompareModeQCOM::eMin;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSamplerBlockMatchWindowCreateInfoQCOM>\n  {\n    using Type = SamplerBlockMatchWindowCreateInfoQCOM;\n  };\n\n  struct SamplerBorderColorComponentMappingCreateInfoEXT\n  {\n    using NativeType = VkSamplerBorderColorComponentMappingCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSamplerBorderColorComponentMappingCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SamplerBorderColorComponentMappingCreateInfoEXT( VULKAN_HPP_NAMESPACE::ComponentMapping components_ = {},\n                                                                          VULKAN_HPP_NAMESPACE::Bool32           srgb_       = {},\n                                                                          const void *                           pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , components{ components_ }\n      , srgb{ srgb_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      SamplerBorderColorComponentMappingCreateInfoEXT( SamplerBorderColorComponentMappingCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SamplerBorderColorComponentMappingCreateInfoEXT( VkSamplerBorderColorComponentMappingCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SamplerBorderColorComponentMappingCreateInfoEXT( *reinterpret_cast<SamplerBorderColorComponentMappingCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    SamplerBorderColorComponentMappingCreateInfoEXT & operator=( SamplerBorderColorComponentMappingCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SamplerBorderColorComponentMappingCreateInfoEXT & operator=( VkSamplerBorderColorComponentMappingCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SamplerBorderColorComponentMappingCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SamplerBorderColorComponentMappingCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerBorderColorComponentMappingCreateInfoEXT &\n      setComponents( VULKAN_HPP_NAMESPACE::ComponentMapping const & components_ ) VULKAN_HPP_NOEXCEPT\n    {\n      components = components_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerBorderColorComponentMappingCreateInfoEXT & setSrgb( VULKAN_HPP_NAMESPACE::Bool32 srgb_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srgb = srgb_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSamplerBorderColorComponentMappingCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSamplerBorderColorComponentMappingCreateInfoEXT *>( this );\n    }\n\n    operator VkSamplerBorderColorComponentMappingCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSamplerBorderColorComponentMappingCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ComponentMapping const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, components, srgb );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SamplerBorderColorComponentMappingCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( SamplerBorderColorComponentMappingCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( components == rhs.components ) && ( srgb == rhs.srgb );\n#  endif\n    }\n\n    bool operator!=( SamplerBorderColorComponentMappingCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType      = StructureType::eSamplerBorderColorComponentMappingCreateInfoEXT;\n    const void *                           pNext      = {};\n    VULKAN_HPP_NAMESPACE::ComponentMapping components = {};\n    VULKAN_HPP_NAMESPACE::Bool32           srgb       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSamplerBorderColorComponentMappingCreateInfoEXT>\n  {\n    using Type = SamplerBorderColorComponentMappingCreateInfoEXT;\n  };\n\n  struct SamplerCaptureDescriptorDataInfoEXT\n  {\n    using NativeType = VkSamplerCaptureDescriptorDataInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSamplerCaptureDescriptorDataInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SamplerCaptureDescriptorDataInfoEXT( VULKAN_HPP_NAMESPACE::Sampler sampler_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , sampler{ sampler_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SamplerCaptureDescriptorDataInfoEXT( SamplerCaptureDescriptorDataInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SamplerCaptureDescriptorDataInfoEXT( VkSamplerCaptureDescriptorDataInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SamplerCaptureDescriptorDataInfoEXT( *reinterpret_cast<SamplerCaptureDescriptorDataInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    SamplerCaptureDescriptorDataInfoEXT & operator=( SamplerCaptureDescriptorDataInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SamplerCaptureDescriptorDataInfoEXT & operator=( VkSamplerCaptureDescriptorDataInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SamplerCaptureDescriptorDataInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SamplerCaptureDescriptorDataInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerCaptureDescriptorDataInfoEXT & setSampler( VULKAN_HPP_NAMESPACE::Sampler sampler_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sampler = sampler_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSamplerCaptureDescriptorDataInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSamplerCaptureDescriptorDataInfoEXT *>( this );\n    }\n\n    operator VkSamplerCaptureDescriptorDataInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSamplerCaptureDescriptorDataInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Sampler const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, sampler );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SamplerCaptureDescriptorDataInfoEXT const & ) const = default;\n#else\n    bool operator==( SamplerCaptureDescriptorDataInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( sampler == rhs.sampler );\n#  endif\n    }\n\n    bool operator!=( SamplerCaptureDescriptorDataInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType   = StructureType::eSamplerCaptureDescriptorDataInfoEXT;\n    const void *                        pNext   = {};\n    VULKAN_HPP_NAMESPACE::Sampler       sampler = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSamplerCaptureDescriptorDataInfoEXT>\n  {\n    using Type = SamplerCaptureDescriptorDataInfoEXT;\n  };\n\n  struct SamplerCreateInfo\n  {\n    using NativeType = VkSamplerCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSamplerCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SamplerCreateInfo( VULKAN_HPP_NAMESPACE::SamplerCreateFlags flags_            = {},\n                                            VULKAN_HPP_NAMESPACE::Filter             magFilter_        = VULKAN_HPP_NAMESPACE::Filter::eNearest,\n                                            VULKAN_HPP_NAMESPACE::Filter             minFilter_        = VULKAN_HPP_NAMESPACE::Filter::eNearest,\n                                            VULKAN_HPP_NAMESPACE::SamplerMipmapMode  mipmapMode_       = VULKAN_HPP_NAMESPACE::SamplerMipmapMode::eNearest,\n                                            VULKAN_HPP_NAMESPACE::SamplerAddressMode addressModeU_     = VULKAN_HPP_NAMESPACE::SamplerAddressMode::eRepeat,\n                                            VULKAN_HPP_NAMESPACE::SamplerAddressMode addressModeV_     = VULKAN_HPP_NAMESPACE::SamplerAddressMode::eRepeat,\n                                            VULKAN_HPP_NAMESPACE::SamplerAddressMode addressModeW_     = VULKAN_HPP_NAMESPACE::SamplerAddressMode::eRepeat,\n                                            float                                    mipLodBias_       = {},\n                                            VULKAN_HPP_NAMESPACE::Bool32             anisotropyEnable_ = {},\n                                            float                                    maxAnisotropy_    = {},\n                                            VULKAN_HPP_NAMESPACE::Bool32             compareEnable_    = {},\n                                            VULKAN_HPP_NAMESPACE::CompareOp          compareOp_        = VULKAN_HPP_NAMESPACE::CompareOp::eNever,\n                                            float                                    minLod_           = {},\n                                            float                                    maxLod_           = {},\n                                            VULKAN_HPP_NAMESPACE::BorderColor        borderColor_ = VULKAN_HPP_NAMESPACE::BorderColor::eFloatTransparentBlack,\n                                            VULKAN_HPP_NAMESPACE::Bool32             unnormalizedCoordinates_ = {},\n                                            const void *                             pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , magFilter{ magFilter_ }\n      , minFilter{ minFilter_ }\n      , mipmapMode{ mipmapMode_ }\n      , addressModeU{ addressModeU_ }\n      , addressModeV{ addressModeV_ }\n      , addressModeW{ addressModeW_ }\n      , mipLodBias{ mipLodBias_ }\n      , anisotropyEnable{ anisotropyEnable_ }\n      , maxAnisotropy{ maxAnisotropy_ }\n      , compareEnable{ compareEnable_ }\n      , compareOp{ compareOp_ }\n      , minLod{ minLod_ }\n      , maxLod{ maxLod_ }\n      , borderColor{ borderColor_ }\n      , unnormalizedCoordinates{ unnormalizedCoordinates_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SamplerCreateInfo( SamplerCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SamplerCreateInfo( VkSamplerCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT : SamplerCreateInfo( *reinterpret_cast<SamplerCreateInfo const *>( &rhs ) ) {}\n\n    SamplerCreateInfo & operator=( SamplerCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SamplerCreateInfo & operator=( VkSamplerCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SamplerCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SamplerCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::SamplerCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerCreateInfo & setMagFilter( VULKAN_HPP_NAMESPACE::Filter magFilter_ ) VULKAN_HPP_NOEXCEPT\n    {\n      magFilter = magFilter_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerCreateInfo & setMinFilter( VULKAN_HPP_NAMESPACE::Filter minFilter_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minFilter = minFilter_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerCreateInfo & setMipmapMode( VULKAN_HPP_NAMESPACE::SamplerMipmapMode mipmapMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mipmapMode = mipmapMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerCreateInfo & setAddressModeU( VULKAN_HPP_NAMESPACE::SamplerAddressMode addressModeU_ ) VULKAN_HPP_NOEXCEPT\n    {\n      addressModeU = addressModeU_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerCreateInfo & setAddressModeV( VULKAN_HPP_NAMESPACE::SamplerAddressMode addressModeV_ ) VULKAN_HPP_NOEXCEPT\n    {\n      addressModeV = addressModeV_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerCreateInfo & setAddressModeW( VULKAN_HPP_NAMESPACE::SamplerAddressMode addressModeW_ ) VULKAN_HPP_NOEXCEPT\n    {\n      addressModeW = addressModeW_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerCreateInfo & setMipLodBias( float mipLodBias_ ) VULKAN_HPP_NOEXCEPT\n    {\n      mipLodBias = mipLodBias_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerCreateInfo & setAnisotropyEnable( VULKAN_HPP_NAMESPACE::Bool32 anisotropyEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      anisotropyEnable = anisotropyEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerCreateInfo & setMaxAnisotropy( float maxAnisotropy_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxAnisotropy = maxAnisotropy_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerCreateInfo & setCompareEnable( VULKAN_HPP_NAMESPACE::Bool32 compareEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      compareEnable = compareEnable_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerCreateInfo & setCompareOp( VULKAN_HPP_NAMESPACE::CompareOp compareOp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      compareOp = compareOp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerCreateInfo & setMinLod( float minLod_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minLod = minLod_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerCreateInfo & setMaxLod( float maxLod_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxLod = maxLod_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerCreateInfo & setBorderColor( VULKAN_HPP_NAMESPACE::BorderColor borderColor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      borderColor = borderColor_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerCreateInfo & setUnnormalizedCoordinates( VULKAN_HPP_NAMESPACE::Bool32 unnormalizedCoordinates_ ) VULKAN_HPP_NOEXCEPT\n    {\n      unnormalizedCoordinates = unnormalizedCoordinates_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSamplerCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSamplerCreateInfo *>( this );\n    }\n\n    operator VkSamplerCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSamplerCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::SamplerCreateFlags const &,\n               VULKAN_HPP_NAMESPACE::Filter const &,\n               VULKAN_HPP_NAMESPACE::Filter const &,\n               VULKAN_HPP_NAMESPACE::SamplerMipmapMode const &,\n               VULKAN_HPP_NAMESPACE::SamplerAddressMode const &,\n               VULKAN_HPP_NAMESPACE::SamplerAddressMode const &,\n               VULKAN_HPP_NAMESPACE::SamplerAddressMode const &,\n               float const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               float const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::CompareOp const &,\n               float const &,\n               float const &,\n               VULKAN_HPP_NAMESPACE::BorderColor const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       flags,\n                       magFilter,\n                       minFilter,\n                       mipmapMode,\n                       addressModeU,\n                       addressModeV,\n                       addressModeW,\n                       mipLodBias,\n                       anisotropyEnable,\n                       maxAnisotropy,\n                       compareEnable,\n                       compareOp,\n                       minLod,\n                       maxLod,\n                       borderColor,\n                       unnormalizedCoordinates );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SamplerCreateInfo const & ) const = default;\n#else\n    bool operator==( SamplerCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( magFilter == rhs.magFilter ) && ( minFilter == rhs.minFilter ) &&\n             ( mipmapMode == rhs.mipmapMode ) && ( addressModeU == rhs.addressModeU ) && ( addressModeV == rhs.addressModeV ) &&\n             ( addressModeW == rhs.addressModeW ) && ( mipLodBias == rhs.mipLodBias ) && ( anisotropyEnable == rhs.anisotropyEnable ) &&\n             ( maxAnisotropy == rhs.maxAnisotropy ) && ( compareEnable == rhs.compareEnable ) && ( compareOp == rhs.compareOp ) && ( minLod == rhs.minLod ) &&\n             ( maxLod == rhs.maxLod ) && ( borderColor == rhs.borderColor ) && ( unnormalizedCoordinates == rhs.unnormalizedCoordinates );\n#  endif\n    }\n\n    bool operator!=( SamplerCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType      sType                   = StructureType::eSamplerCreateInfo;\n    const void *                             pNext                   = {};\n    VULKAN_HPP_NAMESPACE::SamplerCreateFlags flags                   = {};\n    VULKAN_HPP_NAMESPACE::Filter             magFilter               = VULKAN_HPP_NAMESPACE::Filter::eNearest;\n    VULKAN_HPP_NAMESPACE::Filter             minFilter               = VULKAN_HPP_NAMESPACE::Filter::eNearest;\n    VULKAN_HPP_NAMESPACE::SamplerMipmapMode  mipmapMode              = VULKAN_HPP_NAMESPACE::SamplerMipmapMode::eNearest;\n    VULKAN_HPP_NAMESPACE::SamplerAddressMode addressModeU            = VULKAN_HPP_NAMESPACE::SamplerAddressMode::eRepeat;\n    VULKAN_HPP_NAMESPACE::SamplerAddressMode addressModeV            = VULKAN_HPP_NAMESPACE::SamplerAddressMode::eRepeat;\n    VULKAN_HPP_NAMESPACE::SamplerAddressMode addressModeW            = VULKAN_HPP_NAMESPACE::SamplerAddressMode::eRepeat;\n    float                                    mipLodBias              = {};\n    VULKAN_HPP_NAMESPACE::Bool32             anisotropyEnable        = {};\n    float                                    maxAnisotropy           = {};\n    VULKAN_HPP_NAMESPACE::Bool32             compareEnable           = {};\n    VULKAN_HPP_NAMESPACE::CompareOp          compareOp               = VULKAN_HPP_NAMESPACE::CompareOp::eNever;\n    float                                    minLod                  = {};\n    float                                    maxLod                  = {};\n    VULKAN_HPP_NAMESPACE::BorderColor        borderColor             = VULKAN_HPP_NAMESPACE::BorderColor::eFloatTransparentBlack;\n    VULKAN_HPP_NAMESPACE::Bool32             unnormalizedCoordinates = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSamplerCreateInfo>\n  {\n    using Type = SamplerCreateInfo;\n  };\n\n  struct SamplerCubicWeightsCreateInfoQCOM\n  {\n    using NativeType = VkSamplerCubicWeightsCreateInfoQCOM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSamplerCubicWeightsCreateInfoQCOM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      SamplerCubicWeightsCreateInfoQCOM( VULKAN_HPP_NAMESPACE::CubicFilterWeightsQCOM cubicWeights_ = VULKAN_HPP_NAMESPACE::CubicFilterWeightsQCOM::eCatmullRom,\n                                         const void *                                 pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , cubicWeights{ cubicWeights_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SamplerCubicWeightsCreateInfoQCOM( SamplerCubicWeightsCreateInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SamplerCubicWeightsCreateInfoQCOM( VkSamplerCubicWeightsCreateInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SamplerCubicWeightsCreateInfoQCOM( *reinterpret_cast<SamplerCubicWeightsCreateInfoQCOM const *>( &rhs ) )\n    {\n    }\n\n    SamplerCubicWeightsCreateInfoQCOM & operator=( SamplerCubicWeightsCreateInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SamplerCubicWeightsCreateInfoQCOM & operator=( VkSamplerCubicWeightsCreateInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SamplerCubicWeightsCreateInfoQCOM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SamplerCubicWeightsCreateInfoQCOM & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerCubicWeightsCreateInfoQCOM &\n      setCubicWeights( VULKAN_HPP_NAMESPACE::CubicFilterWeightsQCOM cubicWeights_ ) VULKAN_HPP_NOEXCEPT\n    {\n      cubicWeights = cubicWeights_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSamplerCubicWeightsCreateInfoQCOM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSamplerCubicWeightsCreateInfoQCOM *>( this );\n    }\n\n    operator VkSamplerCubicWeightsCreateInfoQCOM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSamplerCubicWeightsCreateInfoQCOM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::CubicFilterWeightsQCOM const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, cubicWeights );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SamplerCubicWeightsCreateInfoQCOM const & ) const = default;\n#else\n    bool operator==( SamplerCubicWeightsCreateInfoQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( cubicWeights == rhs.cubicWeights );\n#  endif\n    }\n\n    bool operator!=( SamplerCubicWeightsCreateInfoQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType        = StructureType::eSamplerCubicWeightsCreateInfoQCOM;\n    const void *                                 pNext        = {};\n    VULKAN_HPP_NAMESPACE::CubicFilterWeightsQCOM cubicWeights = VULKAN_HPP_NAMESPACE::CubicFilterWeightsQCOM::eCatmullRom;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSamplerCubicWeightsCreateInfoQCOM>\n  {\n    using Type = SamplerCubicWeightsCreateInfoQCOM;\n  };\n\n  struct SamplerCustomBorderColorCreateInfoEXT\n  {\n    using NativeType = VkSamplerCustomBorderColorCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSamplerCustomBorderColorCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 SamplerCustomBorderColorCreateInfoEXT( VULKAN_HPP_NAMESPACE::ClearColorValue customBorderColor_ = {},\n                                                                   VULKAN_HPP_NAMESPACE::Format          format_ = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                                                   const void *                          pNext_  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , customBorderColor{ customBorderColor_ }\n      , format{ format_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerCustomBorderColorCreateInfoEXT( SamplerCustomBorderColorCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SamplerCustomBorderColorCreateInfoEXT( VkSamplerCustomBorderColorCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SamplerCustomBorderColorCreateInfoEXT( *reinterpret_cast<SamplerCustomBorderColorCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    SamplerCustomBorderColorCreateInfoEXT & operator=( SamplerCustomBorderColorCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SamplerCustomBorderColorCreateInfoEXT & operator=( VkSamplerCustomBorderColorCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SamplerCustomBorderColorCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SamplerCustomBorderColorCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerCustomBorderColorCreateInfoEXT &\n      setCustomBorderColor( VULKAN_HPP_NAMESPACE::ClearColorValue const & customBorderColor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      customBorderColor = customBorderColor_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerCustomBorderColorCreateInfoEXT & setFormat( VULKAN_HPP_NAMESPACE::Format format_ ) VULKAN_HPP_NOEXCEPT\n    {\n      format = format_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSamplerCustomBorderColorCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSamplerCustomBorderColorCreateInfoEXT *>( this );\n    }\n\n    operator VkSamplerCustomBorderColorCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSamplerCustomBorderColorCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ClearColorValue const &,\n               VULKAN_HPP_NAMESPACE::Format const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, customBorderColor, format );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType   sType             = StructureType::eSamplerCustomBorderColorCreateInfoEXT;\n    const void *                          pNext             = {};\n    VULKAN_HPP_NAMESPACE::ClearColorValue customBorderColor = {};\n    VULKAN_HPP_NAMESPACE::Format          format            = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSamplerCustomBorderColorCreateInfoEXT>\n  {\n    using Type = SamplerCustomBorderColorCreateInfoEXT;\n  };\n\n  struct SamplerReductionModeCreateInfo\n  {\n    using NativeType = VkSamplerReductionModeCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSamplerReductionModeCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      SamplerReductionModeCreateInfo( VULKAN_HPP_NAMESPACE::SamplerReductionMode reductionMode_ = VULKAN_HPP_NAMESPACE::SamplerReductionMode::eWeightedAverage,\n                                      const void *                               pNext_         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , reductionMode{ reductionMode_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SamplerReductionModeCreateInfo( SamplerReductionModeCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SamplerReductionModeCreateInfo( VkSamplerReductionModeCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SamplerReductionModeCreateInfo( *reinterpret_cast<SamplerReductionModeCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    SamplerReductionModeCreateInfo & operator=( SamplerReductionModeCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SamplerReductionModeCreateInfo & operator=( VkSamplerReductionModeCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SamplerReductionModeCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SamplerReductionModeCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerReductionModeCreateInfo & setReductionMode( VULKAN_HPP_NAMESPACE::SamplerReductionMode reductionMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      reductionMode = reductionMode_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSamplerReductionModeCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSamplerReductionModeCreateInfo *>( this );\n    }\n\n    operator VkSamplerReductionModeCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSamplerReductionModeCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::SamplerReductionMode const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, reductionMode );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SamplerReductionModeCreateInfo const & ) const = default;\n#else\n    bool operator==( SamplerReductionModeCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( reductionMode == rhs.reductionMode );\n#  endif\n    }\n\n    bool operator!=( SamplerReductionModeCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType        sType         = StructureType::eSamplerReductionModeCreateInfo;\n    const void *                               pNext         = {};\n    VULKAN_HPP_NAMESPACE::SamplerReductionMode reductionMode = VULKAN_HPP_NAMESPACE::SamplerReductionMode::eWeightedAverage;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSamplerReductionModeCreateInfo>\n  {\n    using Type = SamplerReductionModeCreateInfo;\n  };\n\n  using SamplerReductionModeCreateInfoEXT = SamplerReductionModeCreateInfo;\n\n  struct SamplerYcbcrConversionCreateInfo\n  {\n    using NativeType = VkSamplerYcbcrConversionCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSamplerYcbcrConversionCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SamplerYcbcrConversionCreateInfo(\n      VULKAN_HPP_NAMESPACE::Format                      format_                      = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n      VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion ycbcrModel_                  = VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion::eRgbIdentity,\n      VULKAN_HPP_NAMESPACE::SamplerYcbcrRange           ycbcrRange_                  = VULKAN_HPP_NAMESPACE::SamplerYcbcrRange::eItuFull,\n      VULKAN_HPP_NAMESPACE::ComponentMapping            components_                  = {},\n      VULKAN_HPP_NAMESPACE::ChromaLocation              xChromaOffset_               = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven,\n      VULKAN_HPP_NAMESPACE::ChromaLocation              yChromaOffset_               = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven,\n      VULKAN_HPP_NAMESPACE::Filter                      chromaFilter_                = VULKAN_HPP_NAMESPACE::Filter::eNearest,\n      VULKAN_HPP_NAMESPACE::Bool32                      forceExplicitReconstruction_ = {},\n      const void *                                      pNext_                       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , format{ format_ }\n      , ycbcrModel{ ycbcrModel_ }\n      , ycbcrRange{ ycbcrRange_ }\n      , components{ components_ }\n      , xChromaOffset{ xChromaOffset_ }\n      , yChromaOffset{ yChromaOffset_ }\n      , chromaFilter{ chromaFilter_ }\n      , forceExplicitReconstruction{ forceExplicitReconstruction_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SamplerYcbcrConversionCreateInfo( SamplerYcbcrConversionCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SamplerYcbcrConversionCreateInfo( VkSamplerYcbcrConversionCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SamplerYcbcrConversionCreateInfo( *reinterpret_cast<SamplerYcbcrConversionCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    SamplerYcbcrConversionCreateInfo & operator=( SamplerYcbcrConversionCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SamplerYcbcrConversionCreateInfo & operator=( VkSamplerYcbcrConversionCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SamplerYcbcrConversionCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerYcbcrConversionCreateInfo & setFormat( VULKAN_HPP_NAMESPACE::Format format_ ) VULKAN_HPP_NOEXCEPT\n    {\n      format = format_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerYcbcrConversionCreateInfo &\n      setYcbcrModel( VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion ycbcrModel_ ) VULKAN_HPP_NOEXCEPT\n    {\n      ycbcrModel = ycbcrModel_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerYcbcrConversionCreateInfo & setYcbcrRange( VULKAN_HPP_NAMESPACE::SamplerYcbcrRange ycbcrRange_ ) VULKAN_HPP_NOEXCEPT\n    {\n      ycbcrRange = ycbcrRange_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerYcbcrConversionCreateInfo & setComponents( VULKAN_HPP_NAMESPACE::ComponentMapping const & components_ ) VULKAN_HPP_NOEXCEPT\n    {\n      components = components_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerYcbcrConversionCreateInfo & setXChromaOffset( VULKAN_HPP_NAMESPACE::ChromaLocation xChromaOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      xChromaOffset = xChromaOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerYcbcrConversionCreateInfo & setYChromaOffset( VULKAN_HPP_NAMESPACE::ChromaLocation yChromaOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      yChromaOffset = yChromaOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerYcbcrConversionCreateInfo & setChromaFilter( VULKAN_HPP_NAMESPACE::Filter chromaFilter_ ) VULKAN_HPP_NOEXCEPT\n    {\n      chromaFilter = chromaFilter_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerYcbcrConversionCreateInfo &\n      setForceExplicitReconstruction( VULKAN_HPP_NAMESPACE::Bool32 forceExplicitReconstruction_ ) VULKAN_HPP_NOEXCEPT\n    {\n      forceExplicitReconstruction = forceExplicitReconstruction_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSamplerYcbcrConversionCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSamplerYcbcrConversionCreateInfo *>( this );\n    }\n\n    operator VkSamplerYcbcrConversionCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSamplerYcbcrConversionCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion const &,\n               VULKAN_HPP_NAMESPACE::SamplerYcbcrRange const &,\n               VULKAN_HPP_NAMESPACE::ComponentMapping const &,\n               VULKAN_HPP_NAMESPACE::ChromaLocation const &,\n               VULKAN_HPP_NAMESPACE::ChromaLocation const &,\n               VULKAN_HPP_NAMESPACE::Filter const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, format, ycbcrModel, ycbcrRange, components, xChromaOffset, yChromaOffset, chromaFilter, forceExplicitReconstruction );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SamplerYcbcrConversionCreateInfo const & ) const = default;\n#else\n    bool operator==( SamplerYcbcrConversionCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( format == rhs.format ) && ( ycbcrModel == rhs.ycbcrModel ) &&\n             ( ycbcrRange == rhs.ycbcrRange ) && ( components == rhs.components ) && ( xChromaOffset == rhs.xChromaOffset ) &&\n             ( yChromaOffset == rhs.yChromaOffset ) && ( chromaFilter == rhs.chromaFilter ) &&\n             ( forceExplicitReconstruction == rhs.forceExplicitReconstruction );\n#  endif\n    }\n\n    bool operator!=( SamplerYcbcrConversionCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType                       = StructureType::eSamplerYcbcrConversionCreateInfo;\n    const void *                                      pNext                       = {};\n    VULKAN_HPP_NAMESPACE::Format                      format                      = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion ycbcrModel                  = VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion::eRgbIdentity;\n    VULKAN_HPP_NAMESPACE::SamplerYcbcrRange           ycbcrRange                  = VULKAN_HPP_NAMESPACE::SamplerYcbcrRange::eItuFull;\n    VULKAN_HPP_NAMESPACE::ComponentMapping            components                  = {};\n    VULKAN_HPP_NAMESPACE::ChromaLocation              xChromaOffset               = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven;\n    VULKAN_HPP_NAMESPACE::ChromaLocation              yChromaOffset               = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven;\n    VULKAN_HPP_NAMESPACE::Filter                      chromaFilter                = VULKAN_HPP_NAMESPACE::Filter::eNearest;\n    VULKAN_HPP_NAMESPACE::Bool32                      forceExplicitReconstruction = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSamplerYcbcrConversionCreateInfo>\n  {\n    using Type = SamplerYcbcrConversionCreateInfo;\n  };\n\n  using SamplerYcbcrConversionCreateInfoKHR = SamplerYcbcrConversionCreateInfo;\n\n  struct SamplerYcbcrConversionImageFormatProperties\n  {\n    using NativeType = VkSamplerYcbcrConversionImageFormatProperties;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSamplerYcbcrConversionImageFormatProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SamplerYcbcrConversionImageFormatProperties( uint32_t combinedImageSamplerDescriptorCount_ = {},\n                                                                      void *   pNext_                               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , combinedImageSamplerDescriptorCount{ combinedImageSamplerDescriptorCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SamplerYcbcrConversionImageFormatProperties( SamplerYcbcrConversionImageFormatProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SamplerYcbcrConversionImageFormatProperties( VkSamplerYcbcrConversionImageFormatProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SamplerYcbcrConversionImageFormatProperties( *reinterpret_cast<SamplerYcbcrConversionImageFormatProperties const *>( &rhs ) )\n    {\n    }\n\n    SamplerYcbcrConversionImageFormatProperties & operator=( SamplerYcbcrConversionImageFormatProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SamplerYcbcrConversionImageFormatProperties & operator=( VkSamplerYcbcrConversionImageFormatProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionImageFormatProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkSamplerYcbcrConversionImageFormatProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSamplerYcbcrConversionImageFormatProperties *>( this );\n    }\n\n    operator VkSamplerYcbcrConversionImageFormatProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSamplerYcbcrConversionImageFormatProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, combinedImageSamplerDescriptorCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SamplerYcbcrConversionImageFormatProperties const & ) const = default;\n#else\n    bool operator==( SamplerYcbcrConversionImageFormatProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( combinedImageSamplerDescriptorCount == rhs.combinedImageSamplerDescriptorCount );\n#  endif\n    }\n\n    bool operator!=( SamplerYcbcrConversionImageFormatProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                               = StructureType::eSamplerYcbcrConversionImageFormatProperties;\n    void *                              pNext                               = {};\n    uint32_t                            combinedImageSamplerDescriptorCount = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSamplerYcbcrConversionImageFormatProperties>\n  {\n    using Type = SamplerYcbcrConversionImageFormatProperties;\n  };\n\n  using SamplerYcbcrConversionImageFormatPropertiesKHR = SamplerYcbcrConversionImageFormatProperties;\n\n  struct SamplerYcbcrConversionInfo\n  {\n    using NativeType = VkSamplerYcbcrConversionInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSamplerYcbcrConversionInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SamplerYcbcrConversionInfo( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion conversion_ = {},\n                                                     const void *                                 pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , conversion{ conversion_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SamplerYcbcrConversionInfo( SamplerYcbcrConversionInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SamplerYcbcrConversionInfo( VkSamplerYcbcrConversionInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SamplerYcbcrConversionInfo( *reinterpret_cast<SamplerYcbcrConversionInfo const *>( &rhs ) )\n    {\n    }\n\n    SamplerYcbcrConversionInfo & operator=( SamplerYcbcrConversionInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SamplerYcbcrConversionInfo & operator=( VkSamplerYcbcrConversionInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SamplerYcbcrConversionInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerYcbcrConversionInfo & setConversion( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion conversion_ ) VULKAN_HPP_NOEXCEPT\n    {\n      conversion = conversion_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSamplerYcbcrConversionInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSamplerYcbcrConversionInfo *>( this );\n    }\n\n    operator VkSamplerYcbcrConversionInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSamplerYcbcrConversionInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, conversion );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SamplerYcbcrConversionInfo const & ) const = default;\n#else\n    bool operator==( SamplerYcbcrConversionInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( conversion == rhs.conversion );\n#  endif\n    }\n\n    bool operator!=( SamplerYcbcrConversionInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType      = StructureType::eSamplerYcbcrConversionInfo;\n    const void *                                 pNext      = {};\n    VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion conversion = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSamplerYcbcrConversionInfo>\n  {\n    using Type = SamplerYcbcrConversionInfo;\n  };\n\n  using SamplerYcbcrConversionInfoKHR = SamplerYcbcrConversionInfo;\n\n  struct SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM\n  {\n    using NativeType = VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM( VULKAN_HPP_NAMESPACE::Bool32 enableYDegamma_    = {},\n                                                                           VULKAN_HPP_NAMESPACE::Bool32 enableCbCrDegamma_ = {},\n                                                                           void *                       pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , enableYDegamma{ enableYDegamma_ }\n      , enableCbCrDegamma{ enableCbCrDegamma_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM( SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM( VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM( *reinterpret_cast<SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM const *>( &rhs ) )\n    {\n    }\n\n    SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM & operator=( SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM & operator=( VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM &\n      setEnableYDegamma( VULKAN_HPP_NAMESPACE::Bool32 enableYDegamma_ ) VULKAN_HPP_NOEXCEPT\n    {\n      enableYDegamma = enableYDegamma_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM &\n      setEnableCbCrDegamma( VULKAN_HPP_NAMESPACE::Bool32 enableCbCrDegamma_ ) VULKAN_HPP_NOEXCEPT\n    {\n      enableCbCrDegamma = enableCbCrDegamma_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM *>( this );\n    }\n\n    operator VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, enableYDegamma, enableCbCrDegamma );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM const & ) const = default;\n#else\n    bool operator==( SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( enableYDegamma == rhs.enableYDegamma ) && ( enableCbCrDegamma == rhs.enableCbCrDegamma );\n#  endif\n    }\n\n    bool operator!=( SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType             = StructureType::eSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM;\n    void *                              pNext             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        enableYDegamma    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        enableCbCrDegamma = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM>\n  {\n    using Type = SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM;\n  };\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n  struct ScreenBufferFormatPropertiesQNX\n  {\n    using NativeType = VkScreenBufferFormatPropertiesQNX;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eScreenBufferFormatPropertiesQNX;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ScreenBufferFormatPropertiesQNX(\n      VULKAN_HPP_NAMESPACE::Format                      format_                           = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n      uint64_t                                          externalFormat_                   = {},\n      uint64_t                                          screenUsage_                      = {},\n      VULKAN_HPP_NAMESPACE::FormatFeatureFlags          formatFeatures_                   = {},\n      VULKAN_HPP_NAMESPACE::ComponentMapping            samplerYcbcrConversionComponents_ = {},\n      VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion suggestedYcbcrModel_              = VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion::eRgbIdentity,\n      VULKAN_HPP_NAMESPACE::SamplerYcbcrRange           suggestedYcbcrRange_              = VULKAN_HPP_NAMESPACE::SamplerYcbcrRange::eItuFull,\n      VULKAN_HPP_NAMESPACE::ChromaLocation              suggestedXChromaOffset_           = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven,\n      VULKAN_HPP_NAMESPACE::ChromaLocation              suggestedYChromaOffset_           = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven,\n      void *                                            pNext_                            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , format{ format_ }\n      , externalFormat{ externalFormat_ }\n      , screenUsage{ screenUsage_ }\n      , formatFeatures{ formatFeatures_ }\n      , samplerYcbcrConversionComponents{ samplerYcbcrConversionComponents_ }\n      , suggestedYcbcrModel{ suggestedYcbcrModel_ }\n      , suggestedYcbcrRange{ suggestedYcbcrRange_ }\n      , suggestedXChromaOffset{ suggestedXChromaOffset_ }\n      , suggestedYChromaOffset{ suggestedYChromaOffset_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ScreenBufferFormatPropertiesQNX( ScreenBufferFormatPropertiesQNX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ScreenBufferFormatPropertiesQNX( VkScreenBufferFormatPropertiesQNX const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ScreenBufferFormatPropertiesQNX( *reinterpret_cast<ScreenBufferFormatPropertiesQNX const *>( &rhs ) )\n    {\n    }\n\n    ScreenBufferFormatPropertiesQNX & operator=( ScreenBufferFormatPropertiesQNX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ScreenBufferFormatPropertiesQNX & operator=( VkScreenBufferFormatPropertiesQNX const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ScreenBufferFormatPropertiesQNX const *>( &rhs );\n      return *this;\n    }\n\n    operator VkScreenBufferFormatPropertiesQNX const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkScreenBufferFormatPropertiesQNX *>( this );\n    }\n\n    operator VkScreenBufferFormatPropertiesQNX &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkScreenBufferFormatPropertiesQNX *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               uint64_t const &,\n               uint64_t const &,\n               VULKAN_HPP_NAMESPACE::FormatFeatureFlags const &,\n               VULKAN_HPP_NAMESPACE::ComponentMapping const &,\n               VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion const &,\n               VULKAN_HPP_NAMESPACE::SamplerYcbcrRange const &,\n               VULKAN_HPP_NAMESPACE::ChromaLocation const &,\n               VULKAN_HPP_NAMESPACE::ChromaLocation const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       format,\n                       externalFormat,\n                       screenUsage,\n                       formatFeatures,\n                       samplerYcbcrConversionComponents,\n                       suggestedYcbcrModel,\n                       suggestedYcbcrRange,\n                       suggestedXChromaOffset,\n                       suggestedYChromaOffset );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ScreenBufferFormatPropertiesQNX const & ) const = default;\n#  else\n    bool operator==( ScreenBufferFormatPropertiesQNX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( format == rhs.format ) && ( externalFormat == rhs.externalFormat ) &&\n             ( screenUsage == rhs.screenUsage ) && ( formatFeatures == rhs.formatFeatures ) &&\n             ( samplerYcbcrConversionComponents == rhs.samplerYcbcrConversionComponents ) && ( suggestedYcbcrModel == rhs.suggestedYcbcrModel ) &&\n             ( suggestedYcbcrRange == rhs.suggestedYcbcrRange ) && ( suggestedXChromaOffset == rhs.suggestedXChromaOffset ) &&\n             ( suggestedYChromaOffset == rhs.suggestedYChromaOffset );\n#    endif\n    }\n\n    bool operator!=( ScreenBufferFormatPropertiesQNX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType                            = StructureType::eScreenBufferFormatPropertiesQNX;\n    void *                                            pNext                            = {};\n    VULKAN_HPP_NAMESPACE::Format                      format                           = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    uint64_t                                          externalFormat                   = {};\n    uint64_t                                          screenUsage                      = {};\n    VULKAN_HPP_NAMESPACE::FormatFeatureFlags          formatFeatures                   = {};\n    VULKAN_HPP_NAMESPACE::ComponentMapping            samplerYcbcrConversionComponents = {};\n    VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion suggestedYcbcrModel              = VULKAN_HPP_NAMESPACE::SamplerYcbcrModelConversion::eRgbIdentity;\n    VULKAN_HPP_NAMESPACE::SamplerYcbcrRange           suggestedYcbcrRange              = VULKAN_HPP_NAMESPACE::SamplerYcbcrRange::eItuFull;\n    VULKAN_HPP_NAMESPACE::ChromaLocation              suggestedXChromaOffset           = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven;\n    VULKAN_HPP_NAMESPACE::ChromaLocation              suggestedYChromaOffset           = VULKAN_HPP_NAMESPACE::ChromaLocation::eCositedEven;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eScreenBufferFormatPropertiesQNX>\n  {\n    using Type = ScreenBufferFormatPropertiesQNX;\n  };\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n  struct ScreenBufferPropertiesQNX\n  {\n    using NativeType = VkScreenBufferPropertiesQNX;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eScreenBufferPropertiesQNX;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ScreenBufferPropertiesQNX( VULKAN_HPP_NAMESPACE::DeviceSize allocationSize_ = {},\n                                                    uint32_t                         memoryTypeBits_ = {},\n                                                    void *                           pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , allocationSize{ allocationSize_ }\n      , memoryTypeBits{ memoryTypeBits_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ScreenBufferPropertiesQNX( ScreenBufferPropertiesQNX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ScreenBufferPropertiesQNX( VkScreenBufferPropertiesQNX const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ScreenBufferPropertiesQNX( *reinterpret_cast<ScreenBufferPropertiesQNX const *>( &rhs ) )\n    {\n    }\n\n    ScreenBufferPropertiesQNX & operator=( ScreenBufferPropertiesQNX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ScreenBufferPropertiesQNX & operator=( VkScreenBufferPropertiesQNX const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ScreenBufferPropertiesQNX const *>( &rhs );\n      return *this;\n    }\n\n    operator VkScreenBufferPropertiesQNX const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkScreenBufferPropertiesQNX *>( this );\n    }\n\n    operator VkScreenBufferPropertiesQNX &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkScreenBufferPropertiesQNX *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::DeviceSize const &, uint32_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, allocationSize, memoryTypeBits );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ScreenBufferPropertiesQNX const & ) const = default;\n#  else\n    bool operator==( ScreenBufferPropertiesQNX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( allocationSize == rhs.allocationSize ) && ( memoryTypeBits == rhs.memoryTypeBits );\n#    endif\n    }\n\n    bool operator!=( ScreenBufferPropertiesQNX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::eScreenBufferPropertiesQNX;\n    void *                              pNext          = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    allocationSize = {};\n    uint32_t                            memoryTypeBits = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eScreenBufferPropertiesQNX>\n  {\n    using Type = ScreenBufferPropertiesQNX;\n  };\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n  struct ScreenSurfaceCreateInfoQNX\n  {\n    using NativeType = VkScreenSurfaceCreateInfoQNX;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eScreenSurfaceCreateInfoQNX;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ScreenSurfaceCreateInfoQNX( VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateFlagsQNX flags_   = {},\n                                                     struct _screen_context *                          context_ = {},\n                                                     struct _screen_window *                           window_  = {},\n                                                     const void *                                      pNext_   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , context{ context_ }\n      , window{ window_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ScreenSurfaceCreateInfoQNX( ScreenSurfaceCreateInfoQNX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ScreenSurfaceCreateInfoQNX( VkScreenSurfaceCreateInfoQNX const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ScreenSurfaceCreateInfoQNX( *reinterpret_cast<ScreenSurfaceCreateInfoQNX const *>( &rhs ) )\n    {\n    }\n\n    ScreenSurfaceCreateInfoQNX & operator=( ScreenSurfaceCreateInfoQNX const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ScreenSurfaceCreateInfoQNX & operator=( VkScreenSurfaceCreateInfoQNX const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateInfoQNX const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ScreenSurfaceCreateInfoQNX & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ScreenSurfaceCreateInfoQNX & setFlags( VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateFlagsQNX flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ScreenSurfaceCreateInfoQNX & setContext( struct _screen_context * context_ ) VULKAN_HPP_NOEXCEPT\n    {\n      context = context_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ScreenSurfaceCreateInfoQNX & setWindow( struct _screen_window * window_ ) VULKAN_HPP_NOEXCEPT\n    {\n      window = window_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkScreenSurfaceCreateInfoQNX const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkScreenSurfaceCreateInfoQNX *>( this );\n    }\n\n    operator VkScreenSurfaceCreateInfoQNX &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkScreenSurfaceCreateInfoQNX *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateFlagsQNX const &,\n               struct _screen_context * const &,\n               struct _screen_window * const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, context, window );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ScreenSurfaceCreateInfoQNX const & ) const = default;\n#  else\n    bool operator==( ScreenSurfaceCreateInfoQNX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( context == rhs.context ) && ( window == rhs.window );\n#    endif\n    }\n\n    bool operator!=( ScreenSurfaceCreateInfoQNX const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType   = StructureType::eScreenSurfaceCreateInfoQNX;\n    const void *                                      pNext   = {};\n    VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateFlagsQNX flags   = {};\n    struct _screen_context *                          context = {};\n    struct _screen_window *                           window  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eScreenSurfaceCreateInfoQNX>\n  {\n    using Type = ScreenSurfaceCreateInfoQNX;\n  };\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n  struct SemaphoreCreateInfo\n  {\n    using NativeType = VkSemaphoreCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSemaphoreCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SemaphoreCreateInfo( VULKAN_HPP_NAMESPACE::SemaphoreCreateFlags flags_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SemaphoreCreateInfo( SemaphoreCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SemaphoreCreateInfo( VkSemaphoreCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT : SemaphoreCreateInfo( *reinterpret_cast<SemaphoreCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    SemaphoreCreateInfo & operator=( SemaphoreCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SemaphoreCreateInfo & operator=( VkSemaphoreCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SemaphoreCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::SemaphoreCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSemaphoreCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSemaphoreCreateInfo *>( this );\n    }\n\n    operator VkSemaphoreCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSemaphoreCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::SemaphoreCreateFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SemaphoreCreateInfo const & ) const = default;\n#else\n    bool operator==( SemaphoreCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags );\n#  endif\n    }\n\n    bool operator!=( SemaphoreCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType        sType = StructureType::eSemaphoreCreateInfo;\n    const void *                               pNext = {};\n    VULKAN_HPP_NAMESPACE::SemaphoreCreateFlags flags = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSemaphoreCreateInfo>\n  {\n    using Type = SemaphoreCreateInfo;\n  };\n\n  struct SemaphoreGetFdInfoKHR\n  {\n    using NativeType = VkSemaphoreGetFdInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSemaphoreGetFdInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SemaphoreGetFdInfoKHR(\n      VULKAN_HPP_NAMESPACE::Semaphore                           semaphore_  = {},\n      VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits handleType_ = VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits::eOpaqueFd,\n      const void *                                              pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , semaphore{ semaphore_ }\n      , handleType{ handleType_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SemaphoreGetFdInfoKHR( SemaphoreGetFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SemaphoreGetFdInfoKHR( VkSemaphoreGetFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SemaphoreGetFdInfoKHR( *reinterpret_cast<SemaphoreGetFdInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    SemaphoreGetFdInfoKHR & operator=( SemaphoreGetFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SemaphoreGetFdInfoKHR & operator=( VkSemaphoreGetFdInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SemaphoreGetFdInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreGetFdInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreGetFdInfoKHR & setSemaphore( VULKAN_HPP_NAMESPACE::Semaphore semaphore_ ) VULKAN_HPP_NOEXCEPT\n    {\n      semaphore = semaphore_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreGetFdInfoKHR & setHandleType( VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSemaphoreGetFdInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSemaphoreGetFdInfoKHR *>( this );\n    }\n\n    operator VkSemaphoreGetFdInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSemaphoreGetFdInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Semaphore const &,\n               VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, semaphore, handleType );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SemaphoreGetFdInfoKHR const & ) const = default;\n#else\n    bool operator==( SemaphoreGetFdInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( semaphore == rhs.semaphore ) && ( handleType == rhs.handleType );\n#  endif\n    }\n\n    bool operator!=( SemaphoreGetFdInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                       sType      = StructureType::eSemaphoreGetFdInfoKHR;\n    const void *                                              pNext      = {};\n    VULKAN_HPP_NAMESPACE::Semaphore                           semaphore  = {};\n    VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits handleType = VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits::eOpaqueFd;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSemaphoreGetFdInfoKHR>\n  {\n    using Type = SemaphoreGetFdInfoKHR;\n  };\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  struct SemaphoreGetWin32HandleInfoKHR\n  {\n    using NativeType = VkSemaphoreGetWin32HandleInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSemaphoreGetWin32HandleInfoKHR;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SemaphoreGetWin32HandleInfoKHR(\n      VULKAN_HPP_NAMESPACE::Semaphore                           semaphore_  = {},\n      VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits handleType_ = VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits::eOpaqueFd,\n      const void *                                              pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , semaphore{ semaphore_ }\n      , handleType{ handleType_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SemaphoreGetWin32HandleInfoKHR( SemaphoreGetWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SemaphoreGetWin32HandleInfoKHR( VkSemaphoreGetWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SemaphoreGetWin32HandleInfoKHR( *reinterpret_cast<SemaphoreGetWin32HandleInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    SemaphoreGetWin32HandleInfoKHR & operator=( SemaphoreGetWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SemaphoreGetWin32HandleInfoKHR & operator=( VkSemaphoreGetWin32HandleInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SemaphoreGetWin32HandleInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreGetWin32HandleInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreGetWin32HandleInfoKHR & setSemaphore( VULKAN_HPP_NAMESPACE::Semaphore semaphore_ ) VULKAN_HPP_NOEXCEPT\n    {\n      semaphore = semaphore_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreGetWin32HandleInfoKHR &\n      setHandleType( VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSemaphoreGetWin32HandleInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSemaphoreGetWin32HandleInfoKHR *>( this );\n    }\n\n    operator VkSemaphoreGetWin32HandleInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSemaphoreGetWin32HandleInfoKHR *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Semaphore const &,\n               VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, semaphore, handleType );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SemaphoreGetWin32HandleInfoKHR const & ) const = default;\n#  else\n    bool operator==( SemaphoreGetWin32HandleInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( semaphore == rhs.semaphore ) && ( handleType == rhs.handleType );\n#    endif\n    }\n\n    bool operator!=( SemaphoreGetWin32HandleInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                       sType      = StructureType::eSemaphoreGetWin32HandleInfoKHR;\n    const void *                                              pNext      = {};\n    VULKAN_HPP_NAMESPACE::Semaphore                           semaphore  = {};\n    VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits handleType = VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits::eOpaqueFd;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSemaphoreGetWin32HandleInfoKHR>\n  {\n    using Type = SemaphoreGetWin32HandleInfoKHR;\n  };\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  struct SemaphoreGetZirconHandleInfoFUCHSIA\n  {\n    using NativeType = VkSemaphoreGetZirconHandleInfoFUCHSIA;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSemaphoreGetZirconHandleInfoFUCHSIA;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SemaphoreGetZirconHandleInfoFUCHSIA(\n      VULKAN_HPP_NAMESPACE::Semaphore                           semaphore_  = {},\n      VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits handleType_ = VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits::eOpaqueFd,\n      const void *                                              pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , semaphore{ semaphore_ }\n      , handleType{ handleType_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SemaphoreGetZirconHandleInfoFUCHSIA( SemaphoreGetZirconHandleInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SemaphoreGetZirconHandleInfoFUCHSIA( VkSemaphoreGetZirconHandleInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SemaphoreGetZirconHandleInfoFUCHSIA( *reinterpret_cast<SemaphoreGetZirconHandleInfoFUCHSIA const *>( &rhs ) )\n    {\n    }\n\n    SemaphoreGetZirconHandleInfoFUCHSIA & operator=( SemaphoreGetZirconHandleInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SemaphoreGetZirconHandleInfoFUCHSIA & operator=( VkSemaphoreGetZirconHandleInfoFUCHSIA const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SemaphoreGetZirconHandleInfoFUCHSIA const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreGetZirconHandleInfoFUCHSIA & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreGetZirconHandleInfoFUCHSIA & setSemaphore( VULKAN_HPP_NAMESPACE::Semaphore semaphore_ ) VULKAN_HPP_NOEXCEPT\n    {\n      semaphore = semaphore_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreGetZirconHandleInfoFUCHSIA &\n      setHandleType( VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits handleType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      handleType = handleType_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSemaphoreGetZirconHandleInfoFUCHSIA const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSemaphoreGetZirconHandleInfoFUCHSIA *>( this );\n    }\n\n    operator VkSemaphoreGetZirconHandleInfoFUCHSIA &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSemaphoreGetZirconHandleInfoFUCHSIA *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Semaphore const &,\n               VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, semaphore, handleType );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SemaphoreGetZirconHandleInfoFUCHSIA const & ) const = default;\n#  else\n    bool operator==( SemaphoreGetZirconHandleInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( semaphore == rhs.semaphore ) && ( handleType == rhs.handleType );\n#    endif\n    }\n\n    bool operator!=( SemaphoreGetZirconHandleInfoFUCHSIA const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                       sType      = StructureType::eSemaphoreGetZirconHandleInfoFUCHSIA;\n    const void *                                              pNext      = {};\n    VULKAN_HPP_NAMESPACE::Semaphore                           semaphore  = {};\n    VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits handleType = VULKAN_HPP_NAMESPACE::ExternalSemaphoreHandleTypeFlagBits::eOpaqueFd;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSemaphoreGetZirconHandleInfoFUCHSIA>\n  {\n    using Type = SemaphoreGetZirconHandleInfoFUCHSIA;\n  };\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  struct SemaphoreSignalInfo\n  {\n    using NativeType = VkSemaphoreSignalInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSemaphoreSignalInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      SemaphoreSignalInfo( VULKAN_HPP_NAMESPACE::Semaphore semaphore_ = {}, uint64_t value_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , semaphore{ semaphore_ }\n      , value{ value_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SemaphoreSignalInfo( SemaphoreSignalInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SemaphoreSignalInfo( VkSemaphoreSignalInfo const & rhs ) VULKAN_HPP_NOEXCEPT : SemaphoreSignalInfo( *reinterpret_cast<SemaphoreSignalInfo const *>( &rhs ) )\n    {\n    }\n\n    SemaphoreSignalInfo & operator=( SemaphoreSignalInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SemaphoreSignalInfo & operator=( VkSemaphoreSignalInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreSignalInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreSignalInfo & setSemaphore( VULKAN_HPP_NAMESPACE::Semaphore semaphore_ ) VULKAN_HPP_NOEXCEPT\n    {\n      semaphore = semaphore_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreSignalInfo & setValue( uint64_t value_ ) VULKAN_HPP_NOEXCEPT\n    {\n      value = value_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSemaphoreSignalInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSemaphoreSignalInfo *>( this );\n    }\n\n    operator VkSemaphoreSignalInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSemaphoreSignalInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Semaphore const &, uint64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, semaphore, value );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SemaphoreSignalInfo const & ) const = default;\n#else\n    bool operator==( SemaphoreSignalInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( semaphore == rhs.semaphore ) && ( value == rhs.value );\n#  endif\n    }\n\n    bool operator!=( SemaphoreSignalInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType     = StructureType::eSemaphoreSignalInfo;\n    const void *                        pNext     = {};\n    VULKAN_HPP_NAMESPACE::Semaphore     semaphore = {};\n    uint64_t                            value     = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSemaphoreSignalInfo>\n  {\n    using Type = SemaphoreSignalInfo;\n  };\n\n  using SemaphoreSignalInfoKHR = SemaphoreSignalInfo;\n\n  struct SemaphoreTypeCreateInfo\n  {\n    using NativeType = VkSemaphoreTypeCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSemaphoreTypeCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SemaphoreTypeCreateInfo( VULKAN_HPP_NAMESPACE::SemaphoreType semaphoreType_ = VULKAN_HPP_NAMESPACE::SemaphoreType::eBinary,\n                                                  uint64_t                            initialValue_  = {},\n                                                  const void *                        pNext_         = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , semaphoreType{ semaphoreType_ }\n      , initialValue{ initialValue_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SemaphoreTypeCreateInfo( SemaphoreTypeCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SemaphoreTypeCreateInfo( VkSemaphoreTypeCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SemaphoreTypeCreateInfo( *reinterpret_cast<SemaphoreTypeCreateInfo const *>( &rhs ) )\n    {\n    }\n\n    SemaphoreTypeCreateInfo & operator=( SemaphoreTypeCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SemaphoreTypeCreateInfo & operator=( VkSemaphoreTypeCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SemaphoreTypeCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreTypeCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreTypeCreateInfo & setSemaphoreType( VULKAN_HPP_NAMESPACE::SemaphoreType semaphoreType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      semaphoreType = semaphoreType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreTypeCreateInfo & setInitialValue( uint64_t initialValue_ ) VULKAN_HPP_NOEXCEPT\n    {\n      initialValue = initialValue_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSemaphoreTypeCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSemaphoreTypeCreateInfo *>( this );\n    }\n\n    operator VkSemaphoreTypeCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSemaphoreTypeCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::SemaphoreType const &, uint64_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, semaphoreType, initialValue );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SemaphoreTypeCreateInfo const & ) const = default;\n#else\n    bool operator==( SemaphoreTypeCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( semaphoreType == rhs.semaphoreType ) && ( initialValue == rhs.initialValue );\n#  endif\n    }\n\n    bool operator!=( SemaphoreTypeCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType         = StructureType::eSemaphoreTypeCreateInfo;\n    const void *                        pNext         = {};\n    VULKAN_HPP_NAMESPACE::SemaphoreType semaphoreType = VULKAN_HPP_NAMESPACE::SemaphoreType::eBinary;\n    uint64_t                            initialValue  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSemaphoreTypeCreateInfo>\n  {\n    using Type = SemaphoreTypeCreateInfo;\n  };\n\n  using SemaphoreTypeCreateInfoKHR = SemaphoreTypeCreateInfo;\n\n  struct SemaphoreWaitInfo\n  {\n    using NativeType = VkSemaphoreWaitInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSemaphoreWaitInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SemaphoreWaitInfo( VULKAN_HPP_NAMESPACE::SemaphoreWaitFlags flags_          = {},\n                                            uint32_t                                 semaphoreCount_ = {},\n                                            const VULKAN_HPP_NAMESPACE::Semaphore *  pSemaphores_    = {},\n                                            const uint64_t *                         pValues_        = {},\n                                            const void *                             pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , semaphoreCount{ semaphoreCount_ }\n      , pSemaphores{ pSemaphores_ }\n      , pValues{ pValues_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SemaphoreWaitInfo( SemaphoreWaitInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SemaphoreWaitInfo( VkSemaphoreWaitInfo const & rhs ) VULKAN_HPP_NOEXCEPT : SemaphoreWaitInfo( *reinterpret_cast<SemaphoreWaitInfo const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SemaphoreWaitInfo( VULKAN_HPP_NAMESPACE::SemaphoreWaitFlags                                                     flags_,\n                       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Semaphore> const & semaphores_,\n                       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const &                        values_ = {},\n                       const void *                                                                                 pNext_  = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , semaphoreCount( static_cast<uint32_t>( semaphores_.size() ) )\n      , pSemaphores( semaphores_.data() )\n      , pValues( values_.data() )\n    {\n#    ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( semaphores_.size() == values_.size() );\n#    else\n      if ( semaphores_.size() != values_.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::SemaphoreWaitInfo::SemaphoreWaitInfo: semaphores_.size() != values_.size()\" );\n      }\n#    endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    SemaphoreWaitInfo & operator=( SemaphoreWaitInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SemaphoreWaitInfo & operator=( VkSemaphoreWaitInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreWaitInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreWaitInfo & setFlags( VULKAN_HPP_NAMESPACE::SemaphoreWaitFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreWaitInfo & setSemaphoreCount( uint32_t semaphoreCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      semaphoreCount = semaphoreCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreWaitInfo & setPSemaphores( const VULKAN_HPP_NAMESPACE::Semaphore * pSemaphores_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSemaphores = pSemaphores_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SemaphoreWaitInfo &\n      setSemaphores( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Semaphore> const & semaphores_ ) VULKAN_HPP_NOEXCEPT\n    {\n      semaphoreCount = static_cast<uint32_t>( semaphores_.size() );\n      pSemaphores    = semaphores_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 SemaphoreWaitInfo & setPValues( const uint64_t * pValues_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pValues = pValues_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SemaphoreWaitInfo & setValues( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & values_ ) VULKAN_HPP_NOEXCEPT\n    {\n      semaphoreCount = static_cast<uint32_t>( values_.size() );\n      pValues        = values_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSemaphoreWaitInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSemaphoreWaitInfo *>( this );\n    }\n\n    operator VkSemaphoreWaitInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSemaphoreWaitInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::SemaphoreWaitFlags const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::Semaphore * const &,\n               const uint64_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, semaphoreCount, pSemaphores, pValues );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SemaphoreWaitInfo const & ) const = default;\n#else\n    bool operator==( SemaphoreWaitInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( semaphoreCount == rhs.semaphoreCount ) &&\n             ( pSemaphores == rhs.pSemaphores ) && ( pValues == rhs.pValues );\n#  endif\n    }\n\n    bool operator!=( SemaphoreWaitInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType      sType          = StructureType::eSemaphoreWaitInfo;\n    const void *                             pNext          = {};\n    VULKAN_HPP_NAMESPACE::SemaphoreWaitFlags flags          = {};\n    uint32_t                                 semaphoreCount = {};\n    const VULKAN_HPP_NAMESPACE::Semaphore *  pSemaphores    = {};\n    const uint64_t *                         pValues        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSemaphoreWaitInfo>\n  {\n    using Type = SemaphoreWaitInfo;\n  };\n\n  using SemaphoreWaitInfoKHR = SemaphoreWaitInfo;\n\n  struct SetDescriptorBufferOffsetsInfoEXT\n  {\n    using NativeType = VkSetDescriptorBufferOffsetsInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSetDescriptorBufferOffsetsInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SetDescriptorBufferOffsetsInfoEXT( VULKAN_HPP_NAMESPACE::ShaderStageFlags   stageFlags_     = {},\n                                                            VULKAN_HPP_NAMESPACE::PipelineLayout     layout_         = {},\n                                                            uint32_t                                 firstSet_       = {},\n                                                            uint32_t                                 setCount_       = {},\n                                                            const uint32_t *                         pBufferIndices_ = {},\n                                                            const VULKAN_HPP_NAMESPACE::DeviceSize * pOffsets_       = {},\n                                                            const void *                             pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stageFlags{ stageFlags_ }\n      , layout{ layout_ }\n      , firstSet{ firstSet_ }\n      , setCount{ setCount_ }\n      , pBufferIndices{ pBufferIndices_ }\n      , pOffsets{ pOffsets_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SetDescriptorBufferOffsetsInfoEXT( SetDescriptorBufferOffsetsInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SetDescriptorBufferOffsetsInfoEXT( VkSetDescriptorBufferOffsetsInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SetDescriptorBufferOffsetsInfoEXT( *reinterpret_cast<SetDescriptorBufferOffsetsInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SetDescriptorBufferOffsetsInfoEXT( VULKAN_HPP_NAMESPACE::ShaderStageFlags                                                        stageFlags_,\n                                       VULKAN_HPP_NAMESPACE::PipelineLayout                                                          layout_,\n                                       uint32_t                                                                                      firstSet_,\n                                       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const &                         bufferIndices_,\n                                       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DeviceSize> const & offsets_ = {},\n                                       const void *                                                                                  pNext_   = nullptr )\n      : pNext( pNext_ )\n      , stageFlags( stageFlags_ )\n      , layout( layout_ )\n      , firstSet( firstSet_ )\n      , setCount( static_cast<uint32_t>( bufferIndices_.size() ) )\n      , pBufferIndices( bufferIndices_.data() )\n      , pOffsets( offsets_.data() )\n    {\n#    ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( bufferIndices_.size() == offsets_.size() );\n#    else\n      if ( bufferIndices_.size() != offsets_.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING\n                          \"::SetDescriptorBufferOffsetsInfoEXT::SetDescriptorBufferOffsetsInfoEXT: bufferIndices_.size() != offsets_.size()\" );\n      }\n#    endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    SetDescriptorBufferOffsetsInfoEXT & operator=( SetDescriptorBufferOffsetsInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SetDescriptorBufferOffsetsInfoEXT & operator=( VkSetDescriptorBufferOffsetsInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SetDescriptorBufferOffsetsInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SetDescriptorBufferOffsetsInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SetDescriptorBufferOffsetsInfoEXT & setStageFlags( VULKAN_HPP_NAMESPACE::ShaderStageFlags stageFlags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stageFlags = stageFlags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SetDescriptorBufferOffsetsInfoEXT & setLayout( VULKAN_HPP_NAMESPACE::PipelineLayout layout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layout = layout_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SetDescriptorBufferOffsetsInfoEXT & setFirstSet( uint32_t firstSet_ ) VULKAN_HPP_NOEXCEPT\n    {\n      firstSet = firstSet_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SetDescriptorBufferOffsetsInfoEXT & setSetCount( uint32_t setCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      setCount = setCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SetDescriptorBufferOffsetsInfoEXT & setPBufferIndices( const uint32_t * pBufferIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pBufferIndices = pBufferIndices_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SetDescriptorBufferOffsetsInfoEXT &\n      setBufferIndices( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & bufferIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      setCount       = static_cast<uint32_t>( bufferIndices_.size() );\n      pBufferIndices = bufferIndices_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 SetDescriptorBufferOffsetsInfoEXT & setPOffsets( const VULKAN_HPP_NAMESPACE::DeviceSize * pOffsets_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pOffsets = pOffsets_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SetDescriptorBufferOffsetsInfoEXT &\n      setOffsets( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DeviceSize> const & offsets_ ) VULKAN_HPP_NOEXCEPT\n    {\n      setCount = static_cast<uint32_t>( offsets_.size() );\n      pOffsets = offsets_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSetDescriptorBufferOffsetsInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSetDescriptorBufferOffsetsInfoEXT *>( this );\n    }\n\n    operator VkSetDescriptorBufferOffsetsInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSetDescriptorBufferOffsetsInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ShaderStageFlags const &,\n               VULKAN_HPP_NAMESPACE::PipelineLayout const &,\n               uint32_t const &,\n               uint32_t const &,\n               const uint32_t * const &,\n               const VULKAN_HPP_NAMESPACE::DeviceSize * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stageFlags, layout, firstSet, setCount, pBufferIndices, pOffsets );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SetDescriptorBufferOffsetsInfoEXT const & ) const = default;\n#else\n    bool operator==( SetDescriptorBufferOffsetsInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( stageFlags == rhs.stageFlags ) && ( layout == rhs.layout ) && ( firstSet == rhs.firstSet ) &&\n             ( setCount == rhs.setCount ) && ( pBufferIndices == rhs.pBufferIndices ) && ( pOffsets == rhs.pOffsets );\n#  endif\n    }\n\n    bool operator!=( SetDescriptorBufferOffsetsInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType      sType          = StructureType::eSetDescriptorBufferOffsetsInfoEXT;\n    const void *                             pNext          = {};\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags   stageFlags     = {};\n    VULKAN_HPP_NAMESPACE::PipelineLayout     layout         = {};\n    uint32_t                                 firstSet       = {};\n    uint32_t                                 setCount       = {};\n    const uint32_t *                         pBufferIndices = {};\n    const VULKAN_HPP_NAMESPACE::DeviceSize * pOffsets       = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSetDescriptorBufferOffsetsInfoEXT>\n  {\n    using Type = SetDescriptorBufferOffsetsInfoEXT;\n  };\n\n  struct SetLatencyMarkerInfoNV\n  {\n    using NativeType = VkSetLatencyMarkerInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSetLatencyMarkerInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SetLatencyMarkerInfoNV( uint64_t                              presentID_ = {},\n                                                 VULKAN_HPP_NAMESPACE::LatencyMarkerNV marker_    = VULKAN_HPP_NAMESPACE::LatencyMarkerNV::eSimulationStart,\n                                                 const void *                          pNext_     = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , presentID{ presentID_ }\n      , marker{ marker_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SetLatencyMarkerInfoNV( SetLatencyMarkerInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SetLatencyMarkerInfoNV( VkSetLatencyMarkerInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SetLatencyMarkerInfoNV( *reinterpret_cast<SetLatencyMarkerInfoNV const *>( &rhs ) )\n    {\n    }\n\n    SetLatencyMarkerInfoNV & operator=( SetLatencyMarkerInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SetLatencyMarkerInfoNV & operator=( VkSetLatencyMarkerInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SetLatencyMarkerInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SetLatencyMarkerInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SetLatencyMarkerInfoNV & setPresentID( uint64_t presentID_ ) VULKAN_HPP_NOEXCEPT\n    {\n      presentID = presentID_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SetLatencyMarkerInfoNV & setMarker( VULKAN_HPP_NAMESPACE::LatencyMarkerNV marker_ ) VULKAN_HPP_NOEXCEPT\n    {\n      marker = marker_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSetLatencyMarkerInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSetLatencyMarkerInfoNV *>( this );\n    }\n\n    operator VkSetLatencyMarkerInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSetLatencyMarkerInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint64_t const &, VULKAN_HPP_NAMESPACE::LatencyMarkerNV const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, presentID, marker );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SetLatencyMarkerInfoNV const & ) const = default;\n#else\n    bool operator==( SetLatencyMarkerInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( presentID == rhs.presentID ) && ( marker == rhs.marker );\n#  endif\n    }\n\n    bool operator!=( SetLatencyMarkerInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType   sType     = StructureType::eSetLatencyMarkerInfoNV;\n    const void *                          pNext     = {};\n    uint64_t                              presentID = {};\n    VULKAN_HPP_NAMESPACE::LatencyMarkerNV marker    = VULKAN_HPP_NAMESPACE::LatencyMarkerNV::eSimulationStart;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSetLatencyMarkerInfoNV>\n  {\n    using Type = SetLatencyMarkerInfoNV;\n  };\n\n  struct SetStateFlagsIndirectCommandNV\n  {\n    using NativeType = VkSetStateFlagsIndirectCommandNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SetStateFlagsIndirectCommandNV( uint32_t data_ = {} ) VULKAN_HPP_NOEXCEPT : data{ data_ } {}\n\n    VULKAN_HPP_CONSTEXPR SetStateFlagsIndirectCommandNV( SetStateFlagsIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SetStateFlagsIndirectCommandNV( VkSetStateFlagsIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SetStateFlagsIndirectCommandNV( *reinterpret_cast<SetStateFlagsIndirectCommandNV const *>( &rhs ) )\n    {\n    }\n\n    SetStateFlagsIndirectCommandNV & operator=( SetStateFlagsIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SetStateFlagsIndirectCommandNV & operator=( VkSetStateFlagsIndirectCommandNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SetStateFlagsIndirectCommandNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SetStateFlagsIndirectCommandNV & setData( uint32_t data_ ) VULKAN_HPP_NOEXCEPT\n    {\n      data = data_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSetStateFlagsIndirectCommandNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSetStateFlagsIndirectCommandNV *>( this );\n    }\n\n    operator VkSetStateFlagsIndirectCommandNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSetStateFlagsIndirectCommandNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( data );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SetStateFlagsIndirectCommandNV const & ) const = default;\n#else\n    bool operator==( SetStateFlagsIndirectCommandNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( data == rhs.data );\n#  endif\n    }\n\n    bool operator!=( SetStateFlagsIndirectCommandNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t data = {};\n  };\n\n  struct ShaderCreateInfoEXT\n  {\n    using NativeType = VkShaderCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eShaderCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ShaderCreateInfoEXT( VULKAN_HPP_NAMESPACE::ShaderCreateFlagsEXT        flags_     = {},\n                                              VULKAN_HPP_NAMESPACE::ShaderStageFlagBits         stage_     = VULKAN_HPP_NAMESPACE::ShaderStageFlagBits::eVertex,\n                                              VULKAN_HPP_NAMESPACE::ShaderStageFlags            nextStage_ = {},\n                                              VULKAN_HPP_NAMESPACE::ShaderCodeTypeEXT           codeType_  = VULKAN_HPP_NAMESPACE::ShaderCodeTypeEXT::eBinary,\n                                              size_t                                            codeSize_  = {},\n                                              const void *                                      pCode_     = {},\n                                              const char *                                      pName_     = {},\n                                              uint32_t                                          setLayoutCount_         = {},\n                                              const VULKAN_HPP_NAMESPACE::DescriptorSetLayout * pSetLayouts_            = {},\n                                              uint32_t                                          pushConstantRangeCount_ = {},\n                                              const VULKAN_HPP_NAMESPACE::PushConstantRange *   pPushConstantRanges_    = {},\n                                              const VULKAN_HPP_NAMESPACE::SpecializationInfo *  pSpecializationInfo_    = {},\n                                              const void *                                      pNext_                  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , stage{ stage_ }\n      , nextStage{ nextStage_ }\n      , codeType{ codeType_ }\n      , codeSize{ codeSize_ }\n      , pCode{ pCode_ }\n      , pName{ pName_ }\n      , setLayoutCount{ setLayoutCount_ }\n      , pSetLayouts{ pSetLayouts_ }\n      , pushConstantRangeCount{ pushConstantRangeCount_ }\n      , pPushConstantRanges{ pPushConstantRanges_ }\n      , pSpecializationInfo{ pSpecializationInfo_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ShaderCreateInfoEXT( ShaderCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ShaderCreateInfoEXT( VkShaderCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT : ShaderCreateInfoEXT( *reinterpret_cast<ShaderCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    ShaderCreateInfoEXT( VULKAN_HPP_NAMESPACE::ShaderCreateFlagsEXT                                                             flags_,\n                         VULKAN_HPP_NAMESPACE::ShaderStageFlagBits                                                              stage_,\n                         VULKAN_HPP_NAMESPACE::ShaderStageFlags                                                                 nextStage_,\n                         VULKAN_HPP_NAMESPACE::ShaderCodeTypeEXT                                                                codeType_,\n                         VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const &                                         code_,\n                         const char *                                                                                           pName_               = {},\n                         VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorSetLayout> const & setLayouts_          = {},\n                         VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PushConstantRange> const &   pushConstantRanges_  = {},\n                         const VULKAN_HPP_NAMESPACE::SpecializationInfo *                                                       pSpecializationInfo_ = {},\n                         const void *                                                                                           pNext_               = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , stage( stage_ )\n      , nextStage( nextStage_ )\n      , codeType( codeType_ )\n      , codeSize( code_.size() * sizeof( T ) )\n      , pCode( code_.data() )\n      , pName( pName_ )\n      , setLayoutCount( static_cast<uint32_t>( setLayouts_.size() ) )\n      , pSetLayouts( setLayouts_.data() )\n      , pushConstantRangeCount( static_cast<uint32_t>( pushConstantRanges_.size() ) )\n      , pPushConstantRanges( pushConstantRanges_.data() )\n      , pSpecializationInfo( pSpecializationInfo_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    ShaderCreateInfoEXT & operator=( ShaderCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ShaderCreateInfoEXT & operator=( VkShaderCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ShaderCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ShaderCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ShaderCreateInfoEXT & setFlags( VULKAN_HPP_NAMESPACE::ShaderCreateFlagsEXT flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ShaderCreateInfoEXT & setStage( VULKAN_HPP_NAMESPACE::ShaderStageFlagBits stage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stage = stage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ShaderCreateInfoEXT & setNextStage( VULKAN_HPP_NAMESPACE::ShaderStageFlags nextStage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      nextStage = nextStage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ShaderCreateInfoEXT & setCodeType( VULKAN_HPP_NAMESPACE::ShaderCodeTypeEXT codeType_ ) VULKAN_HPP_NOEXCEPT\n    {\n      codeType = codeType_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ShaderCreateInfoEXT & setCodeSize( size_t codeSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      codeSize = codeSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ShaderCreateInfoEXT & setPCode( const void * pCode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pCode = pCode_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    ShaderCreateInfoEXT & setCode( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & code_ ) VULKAN_HPP_NOEXCEPT\n    {\n      codeSize = code_.size() * sizeof( T );\n      pCode    = code_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 ShaderCreateInfoEXT & setPName( const char * pName_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pName = pName_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ShaderCreateInfoEXT & setSetLayoutCount( uint32_t setLayoutCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      setLayoutCount = setLayoutCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ShaderCreateInfoEXT & setPSetLayouts( const VULKAN_HPP_NAMESPACE::DescriptorSetLayout * pSetLayouts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSetLayouts = pSetLayouts_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ShaderCreateInfoEXT &\n      setSetLayouts( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorSetLayout> const & setLayouts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      setLayoutCount = static_cast<uint32_t>( setLayouts_.size() );\n      pSetLayouts    = setLayouts_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 ShaderCreateInfoEXT & setPushConstantRangeCount( uint32_t pushConstantRangeCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pushConstantRangeCount = pushConstantRangeCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ShaderCreateInfoEXT &\n      setPPushConstantRanges( const VULKAN_HPP_NAMESPACE::PushConstantRange * pPushConstantRanges_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPushConstantRanges = pPushConstantRanges_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ShaderCreateInfoEXT & setPushConstantRanges(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PushConstantRange> const & pushConstantRanges_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pushConstantRangeCount = static_cast<uint32_t>( pushConstantRanges_.size() );\n      pPushConstantRanges    = pushConstantRanges_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 ShaderCreateInfoEXT &\n      setPSpecializationInfo( const VULKAN_HPP_NAMESPACE::SpecializationInfo * pSpecializationInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSpecializationInfo = pSpecializationInfo_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkShaderCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkShaderCreateInfoEXT *>( this );\n    }\n\n    operator VkShaderCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkShaderCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ShaderCreateFlagsEXT const &,\n               VULKAN_HPP_NAMESPACE::ShaderStageFlagBits const &,\n               VULKAN_HPP_NAMESPACE::ShaderStageFlags const &,\n               VULKAN_HPP_NAMESPACE::ShaderCodeTypeEXT const &,\n               size_t const &,\n               const void * const &,\n               const char * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::DescriptorSetLayout * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::PushConstantRange * const &,\n               const VULKAN_HPP_NAMESPACE::SpecializationInfo * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       flags,\n                       stage,\n                       nextStage,\n                       codeType,\n                       codeSize,\n                       pCode,\n                       pName,\n                       setLayoutCount,\n                       pSetLayouts,\n                       pushConstantRangeCount,\n                       pPushConstantRanges,\n                       pSpecializationInfo );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( ShaderCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = flags <=> rhs.flags; cmp != 0 )\n        return cmp;\n      if ( auto cmp = stage <=> rhs.stage; cmp != 0 )\n        return cmp;\n      if ( auto cmp = nextStage <=> rhs.nextStage; cmp != 0 )\n        return cmp;\n      if ( auto cmp = codeType <=> rhs.codeType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = codeSize <=> rhs.codeSize; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pCode <=> rhs.pCode; cmp != 0 )\n        return cmp;\n      if ( pName != rhs.pName )\n        if ( auto cmp = strcmp( pName, rhs.pName ); cmp != 0 )\n          return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = setLayoutCount <=> rhs.setLayoutCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pSetLayouts <=> rhs.pSetLayouts; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pushConstantRangeCount <=> rhs.pushConstantRangeCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pPushConstantRanges <=> rhs.pPushConstantRanges; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pSpecializationInfo <=> rhs.pSpecializationInfo; cmp != 0 )\n        return cmp;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( ShaderCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( stage == rhs.stage ) && ( nextStage == rhs.nextStage ) &&\n             ( codeType == rhs.codeType ) && ( codeSize == rhs.codeSize ) && ( pCode == rhs.pCode ) &&\n             ( ( pName == rhs.pName ) || ( strcmp( pName, rhs.pName ) == 0 ) ) && ( setLayoutCount == rhs.setLayoutCount ) &&\n             ( pSetLayouts == rhs.pSetLayouts ) && ( pushConstantRangeCount == rhs.pushConstantRangeCount ) &&\n             ( pPushConstantRanges == rhs.pPushConstantRanges ) && ( pSpecializationInfo == rhs.pSpecializationInfo );\n    }\n\n    bool operator!=( ShaderCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType                  = StructureType::eShaderCreateInfoEXT;\n    const void *                                      pNext                  = {};\n    VULKAN_HPP_NAMESPACE::ShaderCreateFlagsEXT        flags                  = {};\n    VULKAN_HPP_NAMESPACE::ShaderStageFlagBits         stage                  = VULKAN_HPP_NAMESPACE::ShaderStageFlagBits::eVertex;\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags            nextStage              = {};\n    VULKAN_HPP_NAMESPACE::ShaderCodeTypeEXT           codeType               = VULKAN_HPP_NAMESPACE::ShaderCodeTypeEXT::eBinary;\n    size_t                                            codeSize               = {};\n    const void *                                      pCode                  = {};\n    const char *                                      pName                  = {};\n    uint32_t                                          setLayoutCount         = {};\n    const VULKAN_HPP_NAMESPACE::DescriptorSetLayout * pSetLayouts            = {};\n    uint32_t                                          pushConstantRangeCount = {};\n    const VULKAN_HPP_NAMESPACE::PushConstantRange *   pPushConstantRanges    = {};\n    const VULKAN_HPP_NAMESPACE::SpecializationInfo *  pSpecializationInfo    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eShaderCreateInfoEXT>\n  {\n    using Type = ShaderCreateInfoEXT;\n  };\n\n  struct ShaderModuleCreateInfo\n  {\n    using NativeType = VkShaderModuleCreateInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eShaderModuleCreateInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ShaderModuleCreateInfo( VULKAN_HPP_NAMESPACE::ShaderModuleCreateFlags flags_    = {},\n                                                 size_t                                        codeSize_ = {},\n                                                 const uint32_t *                              pCode_    = {},\n                                                 const void *                                  pNext_    = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , codeSize{ codeSize_ }\n      , pCode{ pCode_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ShaderModuleCreateInfo( ShaderModuleCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ShaderModuleCreateInfo( VkShaderModuleCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ShaderModuleCreateInfo( *reinterpret_cast<ShaderModuleCreateInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ShaderModuleCreateInfo( VULKAN_HPP_NAMESPACE::ShaderModuleCreateFlags                         flags_,\n                            VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & code_,\n                            const void *                                                          pNext_ = nullptr )\n      : pNext( pNext_ ), flags( flags_ ), codeSize( code_.size() * 4 ), pCode( code_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    ShaderModuleCreateInfo & operator=( ShaderModuleCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ShaderModuleCreateInfo & operator=( VkShaderModuleCreateInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ShaderModuleCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ShaderModuleCreateInfo & setFlags( VULKAN_HPP_NAMESPACE::ShaderModuleCreateFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ShaderModuleCreateInfo & setCodeSize( size_t codeSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      codeSize = codeSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ShaderModuleCreateInfo & setPCode( const uint32_t * pCode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pCode = pCode_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ShaderModuleCreateInfo & setCode( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & code_ ) VULKAN_HPP_NOEXCEPT\n    {\n      codeSize = code_.size() * 4;\n      pCode    = code_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkShaderModuleCreateInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkShaderModuleCreateInfo *>( this );\n    }\n\n    operator VkShaderModuleCreateInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkShaderModuleCreateInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ShaderModuleCreateFlags const &,\n               size_t const &,\n               const uint32_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, codeSize, pCode );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ShaderModuleCreateInfo const & ) const = default;\n#else\n    bool operator==( ShaderModuleCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( codeSize == rhs.codeSize ) && ( pCode == rhs.pCode );\n#  endif\n    }\n\n    bool operator!=( ShaderModuleCreateInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType           sType    = StructureType::eShaderModuleCreateInfo;\n    const void *                                  pNext    = {};\n    VULKAN_HPP_NAMESPACE::ShaderModuleCreateFlags flags    = {};\n    size_t                                        codeSize = {};\n    const uint32_t *                              pCode    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eShaderModuleCreateInfo>\n  {\n    using Type = ShaderModuleCreateInfo;\n  };\n\n  struct ShaderModuleIdentifierEXT\n  {\n    using NativeType = VkShaderModuleIdentifierEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eShaderModuleIdentifierEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 ShaderModuleIdentifierEXT( uint32_t                                                              identifierSize_ = {},\n                                                       std::array<uint8_t, VK_MAX_SHADER_MODULE_IDENTIFIER_SIZE_EXT> const & identifier_     = {},\n                                                       void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , identifierSize{ identifierSize_ }\n      , identifier{ identifier_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ShaderModuleIdentifierEXT( ShaderModuleIdentifierEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ShaderModuleIdentifierEXT( VkShaderModuleIdentifierEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ShaderModuleIdentifierEXT( *reinterpret_cast<ShaderModuleIdentifierEXT const *>( &rhs ) )\n    {\n    }\n\n    ShaderModuleIdentifierEXT & operator=( ShaderModuleIdentifierEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ShaderModuleIdentifierEXT & operator=( VkShaderModuleIdentifierEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ShaderModuleIdentifierEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkShaderModuleIdentifierEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkShaderModuleIdentifierEXT *>( this );\n    }\n\n    operator VkShaderModuleIdentifierEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkShaderModuleIdentifierEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_MAX_SHADER_MODULE_IDENTIFIER_SIZE_EXT> const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, identifierSize, identifier );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( ShaderModuleIdentifierEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = identifierSize <=> rhs.identifierSize; cmp != 0 )\n        return cmp;\n      for ( size_t i = 0; i < identifierSize; ++i )\n      {\n        if ( auto cmp = identifier[i] <=> rhs.identifier[i]; cmp != 0 )\n          return cmp;\n      }\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( ShaderModuleIdentifierEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( identifierSize == rhs.identifierSize ) &&\n             ( memcmp( identifier, rhs.identifier, identifierSize * sizeof( uint8_t ) ) == 0 );\n    }\n\n    bool operator!=( ShaderModuleIdentifierEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                                     sType          = StructureType::eShaderModuleIdentifierEXT;\n    void *                                                                                  pNext          = {};\n    uint32_t                                                                                identifierSize = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, VK_MAX_SHADER_MODULE_IDENTIFIER_SIZE_EXT> identifier     = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eShaderModuleIdentifierEXT>\n  {\n    using Type = ShaderModuleIdentifierEXT;\n  };\n\n  struct ShaderModuleValidationCacheCreateInfoEXT\n  {\n    using NativeType = VkShaderModuleValidationCacheCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eShaderModuleValidationCacheCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ShaderModuleValidationCacheCreateInfoEXT( VULKAN_HPP_NAMESPACE::ValidationCacheEXT validationCache_ = {},\n                                                                   const void *                             pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , validationCache{ validationCache_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ShaderModuleValidationCacheCreateInfoEXT( ShaderModuleValidationCacheCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ShaderModuleValidationCacheCreateInfoEXT( VkShaderModuleValidationCacheCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ShaderModuleValidationCacheCreateInfoEXT( *reinterpret_cast<ShaderModuleValidationCacheCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    ShaderModuleValidationCacheCreateInfoEXT & operator=( ShaderModuleValidationCacheCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ShaderModuleValidationCacheCreateInfoEXT & operator=( VkShaderModuleValidationCacheCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ShaderModuleValidationCacheCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ShaderModuleValidationCacheCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ShaderModuleValidationCacheCreateInfoEXT &\n      setValidationCache( VULKAN_HPP_NAMESPACE::ValidationCacheEXT validationCache_ ) VULKAN_HPP_NOEXCEPT\n    {\n      validationCache = validationCache_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkShaderModuleValidationCacheCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkShaderModuleValidationCacheCreateInfoEXT *>( this );\n    }\n\n    operator VkShaderModuleValidationCacheCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkShaderModuleValidationCacheCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ValidationCacheEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, validationCache );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ShaderModuleValidationCacheCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( ShaderModuleValidationCacheCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( validationCache == rhs.validationCache );\n#  endif\n    }\n\n    bool operator!=( ShaderModuleValidationCacheCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType      sType           = StructureType::eShaderModuleValidationCacheCreateInfoEXT;\n    const void *                             pNext           = {};\n    VULKAN_HPP_NAMESPACE::ValidationCacheEXT validationCache = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eShaderModuleValidationCacheCreateInfoEXT>\n  {\n    using Type = ShaderModuleValidationCacheCreateInfoEXT;\n  };\n\n  struct ShaderResourceUsageAMD\n  {\n    using NativeType = VkShaderResourceUsageAMD;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ShaderResourceUsageAMD( uint32_t numUsedVgprs_             = {},\n                                                 uint32_t numUsedSgprs_             = {},\n                                                 uint32_t ldsSizePerLocalWorkGroup_ = {},\n                                                 size_t   ldsUsageSizeInBytes_      = {},\n                                                 size_t   scratchMemUsageInBytes_   = {} ) VULKAN_HPP_NOEXCEPT\n      : numUsedVgprs{ numUsedVgprs_ }\n      , numUsedSgprs{ numUsedSgprs_ }\n      , ldsSizePerLocalWorkGroup{ ldsSizePerLocalWorkGroup_ }\n      , ldsUsageSizeInBytes{ ldsUsageSizeInBytes_ }\n      , scratchMemUsageInBytes{ scratchMemUsageInBytes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ShaderResourceUsageAMD( ShaderResourceUsageAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ShaderResourceUsageAMD( VkShaderResourceUsageAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ShaderResourceUsageAMD( *reinterpret_cast<ShaderResourceUsageAMD const *>( &rhs ) )\n    {\n    }\n\n    ShaderResourceUsageAMD & operator=( ShaderResourceUsageAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ShaderResourceUsageAMD & operator=( VkShaderResourceUsageAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ShaderResourceUsageAMD const *>( &rhs );\n      return *this;\n    }\n\n    operator VkShaderResourceUsageAMD const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkShaderResourceUsageAMD *>( this );\n    }\n\n    operator VkShaderResourceUsageAMD &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkShaderResourceUsageAMD *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &, uint32_t const &, size_t const &, size_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( numUsedVgprs, numUsedSgprs, ldsSizePerLocalWorkGroup, ldsUsageSizeInBytes, scratchMemUsageInBytes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ShaderResourceUsageAMD const & ) const = default;\n#else\n    bool operator==( ShaderResourceUsageAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( numUsedVgprs == rhs.numUsedVgprs ) && ( numUsedSgprs == rhs.numUsedSgprs ) && ( ldsSizePerLocalWorkGroup == rhs.ldsSizePerLocalWorkGroup ) &&\n             ( ldsUsageSizeInBytes == rhs.ldsUsageSizeInBytes ) && ( scratchMemUsageInBytes == rhs.scratchMemUsageInBytes );\n#  endif\n    }\n\n    bool operator!=( ShaderResourceUsageAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t numUsedVgprs             = {};\n    uint32_t numUsedSgprs             = {};\n    uint32_t ldsSizePerLocalWorkGroup = {};\n    size_t   ldsUsageSizeInBytes      = {};\n    size_t   scratchMemUsageInBytes   = {};\n  };\n\n  struct ShaderStatisticsInfoAMD\n  {\n    using NativeType = VkShaderStatisticsInfoAMD;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 ShaderStatisticsInfoAMD( VULKAN_HPP_NAMESPACE::ShaderStageFlags       shaderStageMask_      = {},\n                                                     VULKAN_HPP_NAMESPACE::ShaderResourceUsageAMD resourceUsage_        = {},\n                                                     uint32_t                                     numPhysicalVgprs_     = {},\n                                                     uint32_t                                     numPhysicalSgprs_     = {},\n                                                     uint32_t                                     numAvailableVgprs_    = {},\n                                                     uint32_t                                     numAvailableSgprs_    = {},\n                                                     std::array<uint32_t, 3> const &              computeWorkGroupSize_ = {} ) VULKAN_HPP_NOEXCEPT\n      : shaderStageMask{ shaderStageMask_ }\n      , resourceUsage{ resourceUsage_ }\n      , numPhysicalVgprs{ numPhysicalVgprs_ }\n      , numPhysicalSgprs{ numPhysicalSgprs_ }\n      , numAvailableVgprs{ numAvailableVgprs_ }\n      , numAvailableSgprs{ numAvailableSgprs_ }\n      , computeWorkGroupSize{ computeWorkGroupSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ShaderStatisticsInfoAMD( ShaderStatisticsInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ShaderStatisticsInfoAMD( VkShaderStatisticsInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ShaderStatisticsInfoAMD( *reinterpret_cast<ShaderStatisticsInfoAMD const *>( &rhs ) )\n    {\n    }\n\n    ShaderStatisticsInfoAMD & operator=( ShaderStatisticsInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ShaderStatisticsInfoAMD & operator=( VkShaderStatisticsInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ShaderStatisticsInfoAMD const *>( &rhs );\n      return *this;\n    }\n\n    operator VkShaderStatisticsInfoAMD const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkShaderStatisticsInfoAMD *>( this );\n    }\n\n    operator VkShaderStatisticsInfoAMD &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkShaderStatisticsInfoAMD *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::ShaderStageFlags const &,\n               VULKAN_HPP_NAMESPACE::ShaderResourceUsageAMD const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( shaderStageMask, resourceUsage, numPhysicalVgprs, numPhysicalSgprs, numAvailableVgprs, numAvailableSgprs, computeWorkGroupSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ShaderStatisticsInfoAMD const & ) const = default;\n#else\n    bool operator==( ShaderStatisticsInfoAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( shaderStageMask == rhs.shaderStageMask ) && ( resourceUsage == rhs.resourceUsage ) && ( numPhysicalVgprs == rhs.numPhysicalVgprs ) &&\n             ( numPhysicalSgprs == rhs.numPhysicalSgprs ) && ( numAvailableVgprs == rhs.numAvailableVgprs ) && ( numAvailableSgprs == rhs.numAvailableSgprs ) &&\n             ( computeWorkGroupSize == rhs.computeWorkGroupSize );\n#  endif\n    }\n\n    bool operator!=( ShaderStatisticsInfoAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::ShaderStageFlags            shaderStageMask      = {};\n    VULKAN_HPP_NAMESPACE::ShaderResourceUsageAMD      resourceUsage        = {};\n    uint32_t                                          numPhysicalVgprs     = {};\n    uint32_t                                          numPhysicalSgprs     = {};\n    uint32_t                                          numAvailableVgprs    = {};\n    uint32_t                                          numAvailableSgprs    = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, 3> computeWorkGroupSize = {};\n  };\n\n  struct SharedPresentSurfaceCapabilitiesKHR\n  {\n    using NativeType = VkSharedPresentSurfaceCapabilitiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSharedPresentSurfaceCapabilitiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SharedPresentSurfaceCapabilitiesKHR( VULKAN_HPP_NAMESPACE::ImageUsageFlags sharedPresentSupportedUsageFlags_ = {},\n                                                              void *                                pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , sharedPresentSupportedUsageFlags{ sharedPresentSupportedUsageFlags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SharedPresentSurfaceCapabilitiesKHR( SharedPresentSurfaceCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SharedPresentSurfaceCapabilitiesKHR( VkSharedPresentSurfaceCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SharedPresentSurfaceCapabilitiesKHR( *reinterpret_cast<SharedPresentSurfaceCapabilitiesKHR const *>( &rhs ) )\n    {\n    }\n\n    SharedPresentSurfaceCapabilitiesKHR & operator=( SharedPresentSurfaceCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SharedPresentSurfaceCapabilitiesKHR & operator=( VkSharedPresentSurfaceCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SharedPresentSurfaceCapabilitiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkSharedPresentSurfaceCapabilitiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSharedPresentSurfaceCapabilitiesKHR *>( this );\n    }\n\n    operator VkSharedPresentSurfaceCapabilitiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSharedPresentSurfaceCapabilitiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::ImageUsageFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, sharedPresentSupportedUsageFlags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SharedPresentSurfaceCapabilitiesKHR const & ) const = default;\n#else\n    bool operator==( SharedPresentSurfaceCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( sharedPresentSupportedUsageFlags == rhs.sharedPresentSupportedUsageFlags );\n#  endif\n    }\n\n    bool operator!=( SharedPresentSurfaceCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType   sType                            = StructureType::eSharedPresentSurfaceCapabilitiesKHR;\n    void *                                pNext                            = {};\n    VULKAN_HPP_NAMESPACE::ImageUsageFlags sharedPresentSupportedUsageFlags = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSharedPresentSurfaceCapabilitiesKHR>\n  {\n    using Type = SharedPresentSurfaceCapabilitiesKHR;\n  };\n\n  struct SparseImageFormatProperties\n  {\n    using NativeType = VkSparseImageFormatProperties;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SparseImageFormatProperties( VULKAN_HPP_NAMESPACE::ImageAspectFlags       aspectMask_       = {},\n                                                      VULKAN_HPP_NAMESPACE::Extent3D               imageGranularity_ = {},\n                                                      VULKAN_HPP_NAMESPACE::SparseImageFormatFlags flags_            = {} ) VULKAN_HPP_NOEXCEPT\n      : aspectMask{ aspectMask_ }\n      , imageGranularity{ imageGranularity_ }\n      , flags{ flags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SparseImageFormatProperties( SparseImageFormatProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SparseImageFormatProperties( VkSparseImageFormatProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SparseImageFormatProperties( *reinterpret_cast<SparseImageFormatProperties const *>( &rhs ) )\n    {\n    }\n\n    SparseImageFormatProperties & operator=( SparseImageFormatProperties const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SparseImageFormatProperties & operator=( VkSparseImageFormatProperties const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties const *>( &rhs );\n      return *this;\n    }\n\n    operator VkSparseImageFormatProperties const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSparseImageFormatProperties *>( this );\n    }\n\n    operator VkSparseImageFormatProperties &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSparseImageFormatProperties *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::ImageAspectFlags const &, VULKAN_HPP_NAMESPACE::Extent3D const &, VULKAN_HPP_NAMESPACE::SparseImageFormatFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( aspectMask, imageGranularity, flags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SparseImageFormatProperties const & ) const = default;\n#else\n    bool operator==( SparseImageFormatProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( aspectMask == rhs.aspectMask ) && ( imageGranularity == rhs.imageGranularity ) && ( flags == rhs.flags );\n#  endif\n    }\n\n    bool operator!=( SparseImageFormatProperties const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::ImageAspectFlags       aspectMask       = {};\n    VULKAN_HPP_NAMESPACE::Extent3D               imageGranularity = {};\n    VULKAN_HPP_NAMESPACE::SparseImageFormatFlags flags            = {};\n  };\n\n  struct SparseImageFormatProperties2\n  {\n    using NativeType = VkSparseImageFormatProperties2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSparseImageFormatProperties2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SparseImageFormatProperties2( VULKAN_HPP_NAMESPACE::SparseImageFormatProperties properties_ = {},\n                                                       void *                                            pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , properties{ properties_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SparseImageFormatProperties2( SparseImageFormatProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SparseImageFormatProperties2( VkSparseImageFormatProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SparseImageFormatProperties2( *reinterpret_cast<SparseImageFormatProperties2 const *>( &rhs ) )\n    {\n    }\n\n    SparseImageFormatProperties2 & operator=( SparseImageFormatProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SparseImageFormatProperties2 & operator=( VkSparseImageFormatProperties2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2 const *>( &rhs );\n      return *this;\n    }\n\n    operator VkSparseImageFormatProperties2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSparseImageFormatProperties2 *>( this );\n    }\n\n    operator VkSparseImageFormatProperties2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSparseImageFormatProperties2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::SparseImageFormatProperties const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, properties );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SparseImageFormatProperties2 const & ) const = default;\n#else\n    bool operator==( SparseImageFormatProperties2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( properties == rhs.properties );\n#  endif\n    }\n\n    bool operator!=( SparseImageFormatProperties2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType      = StructureType::eSparseImageFormatProperties2;\n    void *                                            pNext      = {};\n    VULKAN_HPP_NAMESPACE::SparseImageFormatProperties properties = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSparseImageFormatProperties2>\n  {\n    using Type = SparseImageFormatProperties2;\n  };\n\n  using SparseImageFormatProperties2KHR = SparseImageFormatProperties2;\n\n  struct SparseImageMemoryRequirements\n  {\n    using NativeType = VkSparseImageMemoryRequirements;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SparseImageMemoryRequirements( VULKAN_HPP_NAMESPACE::SparseImageFormatProperties formatProperties_     = {},\n                                                        uint32_t                                          imageMipTailFirstLod_ = {},\n                                                        VULKAN_HPP_NAMESPACE::DeviceSize                  imageMipTailSize_     = {},\n                                                        VULKAN_HPP_NAMESPACE::DeviceSize                  imageMipTailOffset_   = {},\n                                                        VULKAN_HPP_NAMESPACE::DeviceSize                  imageMipTailStride_   = {} ) VULKAN_HPP_NOEXCEPT\n      : formatProperties{ formatProperties_ }\n      , imageMipTailFirstLod{ imageMipTailFirstLod_ }\n      , imageMipTailSize{ imageMipTailSize_ }\n      , imageMipTailOffset{ imageMipTailOffset_ }\n      , imageMipTailStride{ imageMipTailStride_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SparseImageMemoryRequirements( SparseImageMemoryRequirements const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SparseImageMemoryRequirements( VkSparseImageMemoryRequirements const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SparseImageMemoryRequirements( *reinterpret_cast<SparseImageMemoryRequirements const *>( &rhs ) )\n    {\n    }\n\n    SparseImageMemoryRequirements & operator=( SparseImageMemoryRequirements const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SparseImageMemoryRequirements & operator=( VkSparseImageMemoryRequirements const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements const *>( &rhs );\n      return *this;\n    }\n\n    operator VkSparseImageMemoryRequirements const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSparseImageMemoryRequirements *>( this );\n    }\n\n    operator VkSparseImageMemoryRequirements &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSparseImageMemoryRequirements *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( formatProperties, imageMipTailFirstLod, imageMipTailSize, imageMipTailOffset, imageMipTailStride );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SparseImageMemoryRequirements const & ) const = default;\n#else\n    bool operator==( SparseImageMemoryRequirements const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( formatProperties == rhs.formatProperties ) && ( imageMipTailFirstLod == rhs.imageMipTailFirstLod ) &&\n             ( imageMipTailSize == rhs.imageMipTailSize ) && ( imageMipTailOffset == rhs.imageMipTailOffset ) &&\n             ( imageMipTailStride == rhs.imageMipTailStride );\n#  endif\n    }\n\n    bool operator!=( SparseImageMemoryRequirements const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::SparseImageFormatProperties formatProperties     = {};\n    uint32_t                                          imageMipTailFirstLod = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                  imageMipTailSize     = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                  imageMipTailOffset   = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                  imageMipTailStride   = {};\n  };\n\n  struct SparseImageMemoryRequirements2\n  {\n    using NativeType = VkSparseImageMemoryRequirements2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSparseImageMemoryRequirements2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SparseImageMemoryRequirements2( VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements memoryRequirements_ = {},\n                                                         void *                                              pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , memoryRequirements{ memoryRequirements_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SparseImageMemoryRequirements2( SparseImageMemoryRequirements2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SparseImageMemoryRequirements2( VkSparseImageMemoryRequirements2 const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SparseImageMemoryRequirements2( *reinterpret_cast<SparseImageMemoryRequirements2 const *>( &rhs ) )\n    {\n    }\n\n    SparseImageMemoryRequirements2 & operator=( SparseImageMemoryRequirements2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SparseImageMemoryRequirements2 & operator=( VkSparseImageMemoryRequirements2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2 const *>( &rhs );\n      return *this;\n    }\n\n    operator VkSparseImageMemoryRequirements2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSparseImageMemoryRequirements2 *>( this );\n    }\n\n    operator VkSparseImageMemoryRequirements2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSparseImageMemoryRequirements2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, memoryRequirements );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SparseImageMemoryRequirements2 const & ) const = default;\n#else\n    bool operator==( SparseImageMemoryRequirements2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memoryRequirements == rhs.memoryRequirements );\n#  endif\n    }\n\n    bool operator!=( SparseImageMemoryRequirements2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                 sType              = StructureType::eSparseImageMemoryRequirements2;\n    void *                                              pNext              = {};\n    VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements memoryRequirements = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSparseImageMemoryRequirements2>\n  {\n    using Type = SparseImageMemoryRequirements2;\n  };\n\n  using SparseImageMemoryRequirements2KHR = SparseImageMemoryRequirements2;\n\n#if defined( VK_USE_PLATFORM_GGP )\n  struct StreamDescriptorSurfaceCreateInfoGGP\n  {\n    using NativeType = VkStreamDescriptorSurfaceCreateInfoGGP;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eStreamDescriptorSurfaceCreateInfoGGP;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR StreamDescriptorSurfaceCreateInfoGGP( VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateFlagsGGP flags_            = {},\n                                                               GgpStreamDescriptor                                         streamDescriptor_ = {},\n                                                               const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , streamDescriptor{ streamDescriptor_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR StreamDescriptorSurfaceCreateInfoGGP( StreamDescriptorSurfaceCreateInfoGGP const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    StreamDescriptorSurfaceCreateInfoGGP( VkStreamDescriptorSurfaceCreateInfoGGP const & rhs ) VULKAN_HPP_NOEXCEPT\n      : StreamDescriptorSurfaceCreateInfoGGP( *reinterpret_cast<StreamDescriptorSurfaceCreateInfoGGP const *>( &rhs ) )\n    {\n    }\n\n    StreamDescriptorSurfaceCreateInfoGGP & operator=( StreamDescriptorSurfaceCreateInfoGGP const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    StreamDescriptorSurfaceCreateInfoGGP & operator=( VkStreamDescriptorSurfaceCreateInfoGGP const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateInfoGGP const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 StreamDescriptorSurfaceCreateInfoGGP & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 StreamDescriptorSurfaceCreateInfoGGP &\n      setFlags( VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateFlagsGGP flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 StreamDescriptorSurfaceCreateInfoGGP & setStreamDescriptor( GgpStreamDescriptor streamDescriptor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      streamDescriptor = streamDescriptor_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkStreamDescriptorSurfaceCreateInfoGGP const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkStreamDescriptorSurfaceCreateInfoGGP *>( this );\n    }\n\n    operator VkStreamDescriptorSurfaceCreateInfoGGP &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkStreamDescriptorSurfaceCreateInfoGGP *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateFlagsGGP const &,\n               GgpStreamDescriptor const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, streamDescriptor );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( StreamDescriptorSurfaceCreateInfoGGP const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = flags <=> rhs.flags; cmp != 0 )\n        return cmp;\n      if ( auto cmp = memcmp( &streamDescriptor, &rhs.streamDescriptor, sizeof( GgpStreamDescriptor ) ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#  endif\n\n    bool operator==( StreamDescriptorSurfaceCreateInfoGGP const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) &&\n             ( memcmp( &streamDescriptor, &rhs.streamDescriptor, sizeof( GgpStreamDescriptor ) ) == 0 );\n    }\n\n    bool operator!=( StreamDescriptorSurfaceCreateInfoGGP const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                         sType            = StructureType::eStreamDescriptorSurfaceCreateInfoGGP;\n    const void *                                                pNext            = {};\n    VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateFlagsGGP flags            = {};\n    GgpStreamDescriptor                                         streamDescriptor = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eStreamDescriptorSurfaceCreateInfoGGP>\n  {\n    using Type = StreamDescriptorSurfaceCreateInfoGGP;\n  };\n#endif /*VK_USE_PLATFORM_GGP*/\n\n  struct SubmitInfo\n  {\n    using NativeType = VkSubmitInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSubmitInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SubmitInfo( uint32_t                                         waitSemaphoreCount_   = {},\n                                     const VULKAN_HPP_NAMESPACE::Semaphore *          pWaitSemaphores_      = {},\n                                     const VULKAN_HPP_NAMESPACE::PipelineStageFlags * pWaitDstStageMask_    = {},\n                                     uint32_t                                         commandBufferCount_   = {},\n                                     const VULKAN_HPP_NAMESPACE::CommandBuffer *      pCommandBuffers_      = {},\n                                     uint32_t                                         signalSemaphoreCount_ = {},\n                                     const VULKAN_HPP_NAMESPACE::Semaphore *          pSignalSemaphores_    = {},\n                                     const void *                                     pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , waitSemaphoreCount{ waitSemaphoreCount_ }\n      , pWaitSemaphores{ pWaitSemaphores_ }\n      , pWaitDstStageMask{ pWaitDstStageMask_ }\n      , commandBufferCount{ commandBufferCount_ }\n      , pCommandBuffers{ pCommandBuffers_ }\n      , signalSemaphoreCount{ signalSemaphoreCount_ }\n      , pSignalSemaphores{ pSignalSemaphores_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SubmitInfo( SubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SubmitInfo( VkSubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT : SubmitInfo( *reinterpret_cast<SubmitInfo const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SubmitInfo( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Semaphore> const &          waitSemaphores_,\n                VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineStageFlags> const & waitDstStageMask_ = {},\n                VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::CommandBuffer> const &      commandBuffers_   = {},\n                VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Semaphore> const &          signalSemaphores_ = {},\n                const void *                                                                                          pNext_            = nullptr )\n      : pNext( pNext_ )\n      , waitSemaphoreCount( static_cast<uint32_t>( waitSemaphores_.size() ) )\n      , pWaitSemaphores( waitSemaphores_.data() )\n      , pWaitDstStageMask( waitDstStageMask_.data() )\n      , commandBufferCount( static_cast<uint32_t>( commandBuffers_.size() ) )\n      , pCommandBuffers( commandBuffers_.data() )\n      , signalSemaphoreCount( static_cast<uint32_t>( signalSemaphores_.size() ) )\n      , pSignalSemaphores( signalSemaphores_.data() )\n    {\n#    ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( waitSemaphores_.size() == waitDstStageMask_.size() );\n#    else\n      if ( waitSemaphores_.size() != waitDstStageMask_.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING \"::SubmitInfo::SubmitInfo: waitSemaphores_.size() != waitDstStageMask_.size()\" );\n      }\n#    endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    SubmitInfo & operator=( SubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SubmitInfo & operator=( VkSubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SubmitInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SubmitInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubmitInfo & setWaitSemaphoreCount( uint32_t waitSemaphoreCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      waitSemaphoreCount = waitSemaphoreCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubmitInfo & setPWaitSemaphores( const VULKAN_HPP_NAMESPACE::Semaphore * pWaitSemaphores_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pWaitSemaphores = pWaitSemaphores_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SubmitInfo &\n      setWaitSemaphores( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Semaphore> const & waitSemaphores_ ) VULKAN_HPP_NOEXCEPT\n    {\n      waitSemaphoreCount = static_cast<uint32_t>( waitSemaphores_.size() );\n      pWaitSemaphores    = waitSemaphores_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 SubmitInfo & setPWaitDstStageMask( const VULKAN_HPP_NAMESPACE::PipelineStageFlags * pWaitDstStageMask_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pWaitDstStageMask = pWaitDstStageMask_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SubmitInfo & setWaitDstStageMask( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineStageFlags> const & waitDstStageMask_ )\n      VULKAN_HPP_NOEXCEPT\n    {\n      waitSemaphoreCount = static_cast<uint32_t>( waitDstStageMask_.size() );\n      pWaitDstStageMask  = waitDstStageMask_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 SubmitInfo & setCommandBufferCount( uint32_t commandBufferCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      commandBufferCount = commandBufferCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubmitInfo & setPCommandBuffers( const VULKAN_HPP_NAMESPACE::CommandBuffer * pCommandBuffers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pCommandBuffers = pCommandBuffers_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SubmitInfo &\n      setCommandBuffers( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::CommandBuffer> const & commandBuffers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      commandBufferCount = static_cast<uint32_t>( commandBuffers_.size() );\n      pCommandBuffers    = commandBuffers_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 SubmitInfo & setSignalSemaphoreCount( uint32_t signalSemaphoreCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      signalSemaphoreCount = signalSemaphoreCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubmitInfo & setPSignalSemaphores( const VULKAN_HPP_NAMESPACE::Semaphore * pSignalSemaphores_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSignalSemaphores = pSignalSemaphores_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SubmitInfo &\n      setSignalSemaphores( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Semaphore> const & signalSemaphores_ ) VULKAN_HPP_NOEXCEPT\n    {\n      signalSemaphoreCount = static_cast<uint32_t>( signalSemaphores_.size() );\n      pSignalSemaphores    = signalSemaphores_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSubmitInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSubmitInfo *>( this );\n    }\n\n    operator VkSubmitInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSubmitInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::Semaphore * const &,\n               const VULKAN_HPP_NAMESPACE::PipelineStageFlags * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::CommandBuffer * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::Semaphore * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie(\n        sType, pNext, waitSemaphoreCount, pWaitSemaphores, pWaitDstStageMask, commandBufferCount, pCommandBuffers, signalSemaphoreCount, pSignalSemaphores );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SubmitInfo const & ) const = default;\n#else\n    bool operator==( SubmitInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( waitSemaphoreCount == rhs.waitSemaphoreCount ) &&\n             ( pWaitSemaphores == rhs.pWaitSemaphores ) && ( pWaitDstStageMask == rhs.pWaitDstStageMask ) && ( commandBufferCount == rhs.commandBufferCount ) &&\n             ( pCommandBuffers == rhs.pCommandBuffers ) && ( signalSemaphoreCount == rhs.signalSemaphoreCount ) &&\n             ( pSignalSemaphores == rhs.pSignalSemaphores );\n#  endif\n    }\n\n    bool operator!=( SubmitInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType              sType                = StructureType::eSubmitInfo;\n    const void *                                     pNext                = {};\n    uint32_t                                         waitSemaphoreCount   = {};\n    const VULKAN_HPP_NAMESPACE::Semaphore *          pWaitSemaphores      = {};\n    const VULKAN_HPP_NAMESPACE::PipelineStageFlags * pWaitDstStageMask    = {};\n    uint32_t                                         commandBufferCount   = {};\n    const VULKAN_HPP_NAMESPACE::CommandBuffer *      pCommandBuffers      = {};\n    uint32_t                                         signalSemaphoreCount = {};\n    const VULKAN_HPP_NAMESPACE::Semaphore *          pSignalSemaphores    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSubmitInfo>\n  {\n    using Type = SubmitInfo;\n  };\n\n  struct SubmitInfo2\n  {\n    using NativeType = VkSubmitInfo2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSubmitInfo2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SubmitInfo2( VULKAN_HPP_NAMESPACE::SubmitFlags                     flags_                    = {},\n                                      uint32_t                                              waitSemaphoreInfoCount_   = {},\n                                      const VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo *     pWaitSemaphoreInfos_      = {},\n                                      uint32_t                                              commandBufferInfoCount_   = {},\n                                      const VULKAN_HPP_NAMESPACE::CommandBufferSubmitInfo * pCommandBufferInfos_      = {},\n                                      uint32_t                                              signalSemaphoreInfoCount_ = {},\n                                      const VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo *     pSignalSemaphoreInfos_    = {},\n                                      const void *                                          pNext_                    = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , waitSemaphoreInfoCount{ waitSemaphoreInfoCount_ }\n      , pWaitSemaphoreInfos{ pWaitSemaphoreInfos_ }\n      , commandBufferInfoCount{ commandBufferInfoCount_ }\n      , pCommandBufferInfos{ pCommandBufferInfos_ }\n      , signalSemaphoreInfoCount{ signalSemaphoreInfoCount_ }\n      , pSignalSemaphoreInfos{ pSignalSemaphoreInfos_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SubmitInfo2( SubmitInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SubmitInfo2( VkSubmitInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT : SubmitInfo2( *reinterpret_cast<SubmitInfo2 const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SubmitInfo2( VULKAN_HPP_NAMESPACE::SubmitFlags                                                                          flags_,\n                 VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo> const &     waitSemaphoreInfos_,\n                 VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::CommandBufferSubmitInfo> const & commandBufferInfos_   = {},\n                 VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo> const &     signalSemaphoreInfos_ = {},\n                 const void *                                                                                               pNext_                = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , waitSemaphoreInfoCount( static_cast<uint32_t>( waitSemaphoreInfos_.size() ) )\n      , pWaitSemaphoreInfos( waitSemaphoreInfos_.data() )\n      , commandBufferInfoCount( static_cast<uint32_t>( commandBufferInfos_.size() ) )\n      , pCommandBufferInfos( commandBufferInfos_.data() )\n      , signalSemaphoreInfoCount( static_cast<uint32_t>( signalSemaphoreInfos_.size() ) )\n      , pSignalSemaphoreInfos( signalSemaphoreInfos_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    SubmitInfo2 & operator=( SubmitInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SubmitInfo2 & operator=( VkSubmitInfo2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SubmitInfo2 const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SubmitInfo2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubmitInfo2 & setFlags( VULKAN_HPP_NAMESPACE::SubmitFlags flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubmitInfo2 & setWaitSemaphoreInfoCount( uint32_t waitSemaphoreInfoCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      waitSemaphoreInfoCount = waitSemaphoreInfoCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubmitInfo2 & setPWaitSemaphoreInfos( const VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo * pWaitSemaphoreInfos_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pWaitSemaphoreInfos = pWaitSemaphoreInfos_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SubmitInfo2 & setWaitSemaphoreInfos(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo> const & waitSemaphoreInfos_ ) VULKAN_HPP_NOEXCEPT\n    {\n      waitSemaphoreInfoCount = static_cast<uint32_t>( waitSemaphoreInfos_.size() );\n      pWaitSemaphoreInfos    = waitSemaphoreInfos_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 SubmitInfo2 & setCommandBufferInfoCount( uint32_t commandBufferInfoCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      commandBufferInfoCount = commandBufferInfoCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubmitInfo2 &\n      setPCommandBufferInfos( const VULKAN_HPP_NAMESPACE::CommandBufferSubmitInfo * pCommandBufferInfos_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pCommandBufferInfos = pCommandBufferInfos_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SubmitInfo2 & setCommandBufferInfos(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::CommandBufferSubmitInfo> const & commandBufferInfos_ ) VULKAN_HPP_NOEXCEPT\n    {\n      commandBufferInfoCount = static_cast<uint32_t>( commandBufferInfos_.size() );\n      pCommandBufferInfos    = commandBufferInfos_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 SubmitInfo2 & setSignalSemaphoreInfoCount( uint32_t signalSemaphoreInfoCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      signalSemaphoreInfoCount = signalSemaphoreInfoCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubmitInfo2 &\n      setPSignalSemaphoreInfos( const VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo * pSignalSemaphoreInfos_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSignalSemaphoreInfos = pSignalSemaphoreInfos_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SubmitInfo2 & setSignalSemaphoreInfos(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo> const & signalSemaphoreInfos_ ) VULKAN_HPP_NOEXCEPT\n    {\n      signalSemaphoreInfoCount = static_cast<uint32_t>( signalSemaphoreInfos_.size() );\n      pSignalSemaphoreInfos    = signalSemaphoreInfos_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSubmitInfo2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSubmitInfo2 *>( this );\n    }\n\n    operator VkSubmitInfo2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSubmitInfo2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::SubmitFlags const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::CommandBufferSubmitInfo * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       flags,\n                       waitSemaphoreInfoCount,\n                       pWaitSemaphoreInfos,\n                       commandBufferInfoCount,\n                       pCommandBufferInfos,\n                       signalSemaphoreInfoCount,\n                       pSignalSemaphoreInfos );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SubmitInfo2 const & ) const = default;\n#else\n    bool operator==( SubmitInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( waitSemaphoreInfoCount == rhs.waitSemaphoreInfoCount ) &&\n             ( pWaitSemaphoreInfos == rhs.pWaitSemaphoreInfos ) && ( commandBufferInfoCount == rhs.commandBufferInfoCount ) &&\n             ( pCommandBufferInfos == rhs.pCommandBufferInfos ) && ( signalSemaphoreInfoCount == rhs.signalSemaphoreInfoCount ) &&\n             ( pSignalSemaphoreInfos == rhs.pSignalSemaphoreInfos );\n#  endif\n    }\n\n    bool operator!=( SubmitInfo2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                   sType                    = StructureType::eSubmitInfo2;\n    const void *                                          pNext                    = {};\n    VULKAN_HPP_NAMESPACE::SubmitFlags                     flags                    = {};\n    uint32_t                                              waitSemaphoreInfoCount   = {};\n    const VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo *     pWaitSemaphoreInfos      = {};\n    uint32_t                                              commandBufferInfoCount   = {};\n    const VULKAN_HPP_NAMESPACE::CommandBufferSubmitInfo * pCommandBufferInfos      = {};\n    uint32_t                                              signalSemaphoreInfoCount = {};\n    const VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo *     pSignalSemaphoreInfos    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSubmitInfo2>\n  {\n    using Type = SubmitInfo2;\n  };\n\n  using SubmitInfo2KHR = SubmitInfo2;\n\n  struct SubpassBeginInfo\n  {\n    using NativeType = VkSubpassBeginInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSubpassBeginInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SubpassBeginInfo( VULKAN_HPP_NAMESPACE::SubpassContents contents_ = VULKAN_HPP_NAMESPACE::SubpassContents::eInline,\n                                           const void *                          pNext_    = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , contents{ contents_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SubpassBeginInfo( SubpassBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SubpassBeginInfo( VkSubpassBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT : SubpassBeginInfo( *reinterpret_cast<SubpassBeginInfo const *>( &rhs ) ) {}\n\n    SubpassBeginInfo & operator=( SubpassBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SubpassBeginInfo & operator=( VkSubpassBeginInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SubpassBeginInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SubpassBeginInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassBeginInfo & setContents( VULKAN_HPP_NAMESPACE::SubpassContents contents_ ) VULKAN_HPP_NOEXCEPT\n    {\n      contents = contents_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSubpassBeginInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSubpassBeginInfo *>( this );\n    }\n\n    operator VkSubpassBeginInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSubpassBeginInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::SubpassContents const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, contents );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SubpassBeginInfo const & ) const = default;\n#else\n    bool operator==( SubpassBeginInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( contents == rhs.contents );\n#  endif\n    }\n\n    bool operator!=( SubpassBeginInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType   sType    = StructureType::eSubpassBeginInfo;\n    const void *                          pNext    = {};\n    VULKAN_HPP_NAMESPACE::SubpassContents contents = VULKAN_HPP_NAMESPACE::SubpassContents::eInline;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSubpassBeginInfo>\n  {\n    using Type = SubpassBeginInfo;\n  };\n\n  using SubpassBeginInfoKHR = SubpassBeginInfo;\n\n  struct SubpassDescriptionDepthStencilResolve\n  {\n    using NativeType = VkSubpassDescriptionDepthStencilResolve;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSubpassDescriptionDepthStencilResolve;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      SubpassDescriptionDepthStencilResolve( VULKAN_HPP_NAMESPACE::ResolveModeFlagBits depthResolveMode_   = VULKAN_HPP_NAMESPACE::ResolveModeFlagBits::eNone,\n                                             VULKAN_HPP_NAMESPACE::ResolveModeFlagBits stencilResolveMode_ = VULKAN_HPP_NAMESPACE::ResolveModeFlagBits::eNone,\n                                             const VULKAN_HPP_NAMESPACE::AttachmentReference2 * pDepthStencilResolveAttachment_ = {},\n                                             const void *                                       pNext_                          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , depthResolveMode{ depthResolveMode_ }\n      , stencilResolveMode{ stencilResolveMode_ }\n      , pDepthStencilResolveAttachment{ pDepthStencilResolveAttachment_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SubpassDescriptionDepthStencilResolve( SubpassDescriptionDepthStencilResolve const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SubpassDescriptionDepthStencilResolve( VkSubpassDescriptionDepthStencilResolve const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SubpassDescriptionDepthStencilResolve( *reinterpret_cast<SubpassDescriptionDepthStencilResolve const *>( &rhs ) )\n    {\n    }\n\n    SubpassDescriptionDepthStencilResolve & operator=( SubpassDescriptionDepthStencilResolve const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SubpassDescriptionDepthStencilResolve & operator=( VkSubpassDescriptionDepthStencilResolve const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SubpassDescriptionDepthStencilResolve const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescriptionDepthStencilResolve & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescriptionDepthStencilResolve &\n      setDepthResolveMode( VULKAN_HPP_NAMESPACE::ResolveModeFlagBits depthResolveMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depthResolveMode = depthResolveMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescriptionDepthStencilResolve &\n      setStencilResolveMode( VULKAN_HPP_NAMESPACE::ResolveModeFlagBits stencilResolveMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stencilResolveMode = stencilResolveMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassDescriptionDepthStencilResolve &\n      setPDepthStencilResolveAttachment( const VULKAN_HPP_NAMESPACE::AttachmentReference2 * pDepthStencilResolveAttachment_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDepthStencilResolveAttachment = pDepthStencilResolveAttachment_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSubpassDescriptionDepthStencilResolve const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSubpassDescriptionDepthStencilResolve *>( this );\n    }\n\n    operator VkSubpassDescriptionDepthStencilResolve &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSubpassDescriptionDepthStencilResolve *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ResolveModeFlagBits const &,\n               VULKAN_HPP_NAMESPACE::ResolveModeFlagBits const &,\n               const VULKAN_HPP_NAMESPACE::AttachmentReference2 * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, depthResolveMode, stencilResolveMode, pDepthStencilResolveAttachment );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SubpassDescriptionDepthStencilResolve const & ) const = default;\n#else\n    bool operator==( SubpassDescriptionDepthStencilResolve const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( depthResolveMode == rhs.depthResolveMode ) &&\n             ( stencilResolveMode == rhs.stencilResolveMode ) && ( pDepthStencilResolveAttachment == rhs.pDepthStencilResolveAttachment );\n#  endif\n    }\n\n    bool operator!=( SubpassDescriptionDepthStencilResolve const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                sType                          = StructureType::eSubpassDescriptionDepthStencilResolve;\n    const void *                                       pNext                          = {};\n    VULKAN_HPP_NAMESPACE::ResolveModeFlagBits          depthResolveMode               = VULKAN_HPP_NAMESPACE::ResolveModeFlagBits::eNone;\n    VULKAN_HPP_NAMESPACE::ResolveModeFlagBits          stencilResolveMode             = VULKAN_HPP_NAMESPACE::ResolveModeFlagBits::eNone;\n    const VULKAN_HPP_NAMESPACE::AttachmentReference2 * pDepthStencilResolveAttachment = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSubpassDescriptionDepthStencilResolve>\n  {\n    using Type = SubpassDescriptionDepthStencilResolve;\n  };\n\n  using SubpassDescriptionDepthStencilResolveKHR = SubpassDescriptionDepthStencilResolve;\n\n  struct SubpassEndInfo\n  {\n    using NativeType = VkSubpassEndInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSubpassEndInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SubpassEndInfo( const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT : pNext{ pNext_ } {}\n\n    VULKAN_HPP_CONSTEXPR SubpassEndInfo( SubpassEndInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SubpassEndInfo( VkSubpassEndInfo const & rhs ) VULKAN_HPP_NOEXCEPT : SubpassEndInfo( *reinterpret_cast<SubpassEndInfo const *>( &rhs ) ) {}\n\n    SubpassEndInfo & operator=( SubpassEndInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SubpassEndInfo & operator=( VkSubpassEndInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SubpassEndInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SubpassEndInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSubpassEndInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSubpassEndInfo *>( this );\n    }\n\n    operator VkSubpassEndInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSubpassEndInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SubpassEndInfo const & ) const = default;\n#else\n    bool operator==( SubpassEndInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext );\n#  endif\n    }\n\n    bool operator!=( SubpassEndInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType = StructureType::eSubpassEndInfo;\n    const void *                        pNext = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSubpassEndInfo>\n  {\n    using Type = SubpassEndInfo;\n  };\n\n  using SubpassEndInfoKHR = SubpassEndInfo;\n\n  struct SubpassFragmentDensityMapOffsetEndInfoQCOM\n  {\n    using NativeType = VkSubpassFragmentDensityMapOffsetEndInfoQCOM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSubpassFragmentDensityMapOffsetEndInfoQCOM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SubpassFragmentDensityMapOffsetEndInfoQCOM( uint32_t                               fragmentDensityOffsetCount_ = {},\n                                                                     const VULKAN_HPP_NAMESPACE::Offset2D * pFragmentDensityOffsets_    = {},\n                                                                     const void *                           pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , fragmentDensityOffsetCount{ fragmentDensityOffsetCount_ }\n      , pFragmentDensityOffsets{ pFragmentDensityOffsets_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SubpassFragmentDensityMapOffsetEndInfoQCOM( SubpassFragmentDensityMapOffsetEndInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SubpassFragmentDensityMapOffsetEndInfoQCOM( VkSubpassFragmentDensityMapOffsetEndInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SubpassFragmentDensityMapOffsetEndInfoQCOM( *reinterpret_cast<SubpassFragmentDensityMapOffsetEndInfoQCOM const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SubpassFragmentDensityMapOffsetEndInfoQCOM(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Offset2D> const & fragmentDensityOffsets_, const void * pNext_ = nullptr )\n      : pNext( pNext_ )\n      , fragmentDensityOffsetCount( static_cast<uint32_t>( fragmentDensityOffsets_.size() ) )\n      , pFragmentDensityOffsets( fragmentDensityOffsets_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    SubpassFragmentDensityMapOffsetEndInfoQCOM & operator=( SubpassFragmentDensityMapOffsetEndInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SubpassFragmentDensityMapOffsetEndInfoQCOM & operator=( VkSubpassFragmentDensityMapOffsetEndInfoQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SubpassFragmentDensityMapOffsetEndInfoQCOM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SubpassFragmentDensityMapOffsetEndInfoQCOM & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassFragmentDensityMapOffsetEndInfoQCOM &\n      setFragmentDensityOffsetCount( uint32_t fragmentDensityOffsetCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fragmentDensityOffsetCount = fragmentDensityOffsetCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassFragmentDensityMapOffsetEndInfoQCOM &\n      setPFragmentDensityOffsets( const VULKAN_HPP_NAMESPACE::Offset2D * pFragmentDensityOffsets_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pFragmentDensityOffsets = pFragmentDensityOffsets_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SubpassFragmentDensityMapOffsetEndInfoQCOM & setFragmentDensityOffsets(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Offset2D> const & fragmentDensityOffsets_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fragmentDensityOffsetCount = static_cast<uint32_t>( fragmentDensityOffsets_.size() );\n      pFragmentDensityOffsets    = fragmentDensityOffsets_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSubpassFragmentDensityMapOffsetEndInfoQCOM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSubpassFragmentDensityMapOffsetEndInfoQCOM *>( this );\n    }\n\n    operator VkSubpassFragmentDensityMapOffsetEndInfoQCOM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSubpassFragmentDensityMapOffsetEndInfoQCOM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::Offset2D * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, fragmentDensityOffsetCount, pFragmentDensityOffsets );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SubpassFragmentDensityMapOffsetEndInfoQCOM const & ) const = default;\n#else\n    bool operator==( SubpassFragmentDensityMapOffsetEndInfoQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( fragmentDensityOffsetCount == rhs.fragmentDensityOffsetCount ) &&\n             ( pFragmentDensityOffsets == rhs.pFragmentDensityOffsets );\n#  endif\n    }\n\n    bool operator!=( SubpassFragmentDensityMapOffsetEndInfoQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType                      = StructureType::eSubpassFragmentDensityMapOffsetEndInfoQCOM;\n    const void *                           pNext                      = {};\n    uint32_t                               fragmentDensityOffsetCount = {};\n    const VULKAN_HPP_NAMESPACE::Offset2D * pFragmentDensityOffsets    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSubpassFragmentDensityMapOffsetEndInfoQCOM>\n  {\n    using Type = SubpassFragmentDensityMapOffsetEndInfoQCOM;\n  };\n\n  struct SubpassResolvePerformanceQueryEXT\n  {\n    using NativeType = VkSubpassResolvePerformanceQueryEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSubpassResolvePerformanceQueryEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SubpassResolvePerformanceQueryEXT( VULKAN_HPP_NAMESPACE::Bool32 optimal_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , optimal{ optimal_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SubpassResolvePerformanceQueryEXT( SubpassResolvePerformanceQueryEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SubpassResolvePerformanceQueryEXT( VkSubpassResolvePerformanceQueryEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SubpassResolvePerformanceQueryEXT( *reinterpret_cast<SubpassResolvePerformanceQueryEXT const *>( &rhs ) )\n    {\n    }\n\n    SubpassResolvePerformanceQueryEXT & operator=( SubpassResolvePerformanceQueryEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SubpassResolvePerformanceQueryEXT & operator=( VkSubpassResolvePerformanceQueryEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SubpassResolvePerformanceQueryEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkSubpassResolvePerformanceQueryEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSubpassResolvePerformanceQueryEXT *>( this );\n    }\n\n    operator VkSubpassResolvePerformanceQueryEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSubpassResolvePerformanceQueryEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, optimal );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SubpassResolvePerformanceQueryEXT const & ) const = default;\n#else\n    bool operator==( SubpassResolvePerformanceQueryEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( optimal == rhs.optimal );\n#  endif\n    }\n\n    bool operator!=( SubpassResolvePerformanceQueryEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType   = StructureType::eSubpassResolvePerformanceQueryEXT;\n    void *                              pNext   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        optimal = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSubpassResolvePerformanceQueryEXT>\n  {\n    using Type = SubpassResolvePerformanceQueryEXT;\n  };\n\n  struct SubpassShadingPipelineCreateInfoHUAWEI\n  {\n    using NativeType = VkSubpassShadingPipelineCreateInfoHUAWEI;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSubpassShadingPipelineCreateInfoHUAWEI;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SubpassShadingPipelineCreateInfoHUAWEI( VULKAN_HPP_NAMESPACE::RenderPass renderPass_ = {},\n                                                                 uint32_t                         subpass_    = {},\n                                                                 void *                           pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , renderPass{ renderPass_ }\n      , subpass{ subpass_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SubpassShadingPipelineCreateInfoHUAWEI( SubpassShadingPipelineCreateInfoHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SubpassShadingPipelineCreateInfoHUAWEI( VkSubpassShadingPipelineCreateInfoHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SubpassShadingPipelineCreateInfoHUAWEI( *reinterpret_cast<SubpassShadingPipelineCreateInfoHUAWEI const *>( &rhs ) )\n    {\n    }\n\n    SubpassShadingPipelineCreateInfoHUAWEI & operator=( SubpassShadingPipelineCreateInfoHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SubpassShadingPipelineCreateInfoHUAWEI & operator=( VkSubpassShadingPipelineCreateInfoHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SubpassShadingPipelineCreateInfoHUAWEI const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SubpassShadingPipelineCreateInfoHUAWEI & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassShadingPipelineCreateInfoHUAWEI & setRenderPass( VULKAN_HPP_NAMESPACE::RenderPass renderPass_ ) VULKAN_HPP_NOEXCEPT\n    {\n      renderPass = renderPass_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SubpassShadingPipelineCreateInfoHUAWEI & setSubpass( uint32_t subpass_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subpass = subpass_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSubpassShadingPipelineCreateInfoHUAWEI const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSubpassShadingPipelineCreateInfoHUAWEI *>( this );\n    }\n\n    operator VkSubpassShadingPipelineCreateInfoHUAWEI &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSubpassShadingPipelineCreateInfoHUAWEI *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::RenderPass const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, renderPass, subpass );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SubpassShadingPipelineCreateInfoHUAWEI const & ) const = default;\n#else\n    bool operator==( SubpassShadingPipelineCreateInfoHUAWEI const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( renderPass == rhs.renderPass ) && ( subpass == rhs.subpass );\n#  endif\n    }\n\n    bool operator!=( SubpassShadingPipelineCreateInfoHUAWEI const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType      = StructureType::eSubpassShadingPipelineCreateInfoHUAWEI;\n    void *                              pNext      = {};\n    VULKAN_HPP_NAMESPACE::RenderPass    renderPass = {};\n    uint32_t                            subpass    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSubpassShadingPipelineCreateInfoHUAWEI>\n  {\n    using Type = SubpassShadingPipelineCreateInfoHUAWEI;\n  };\n\n  struct SubresourceHostMemcpySize\n  {\n    using NativeType = VkSubresourceHostMemcpySize;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSubresourceHostMemcpySize;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SubresourceHostMemcpySize( VULKAN_HPP_NAMESPACE::DeviceSize size_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , size{ size_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SubresourceHostMemcpySize( SubresourceHostMemcpySize const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SubresourceHostMemcpySize( VkSubresourceHostMemcpySize const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SubresourceHostMemcpySize( *reinterpret_cast<SubresourceHostMemcpySize const *>( &rhs ) )\n    {\n    }\n\n    SubresourceHostMemcpySize & operator=( SubresourceHostMemcpySize const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SubresourceHostMemcpySize & operator=( VkSubresourceHostMemcpySize const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SubresourceHostMemcpySize const *>( &rhs );\n      return *this;\n    }\n\n    operator VkSubresourceHostMemcpySize const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSubresourceHostMemcpySize *>( this );\n    }\n\n    operator VkSubresourceHostMemcpySize &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSubresourceHostMemcpySize *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::DeviceSize const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, size );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SubresourceHostMemcpySize const & ) const = default;\n#else\n    bool operator==( SubresourceHostMemcpySize const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( size == rhs.size );\n#  endif\n    }\n\n    bool operator!=( SubresourceHostMemcpySize const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType = StructureType::eSubresourceHostMemcpySize;\n    void *                              pNext = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    size  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSubresourceHostMemcpySize>\n  {\n    using Type = SubresourceHostMemcpySize;\n  };\n\n  using SubresourceHostMemcpySizeEXT = SubresourceHostMemcpySize;\n\n  struct SubresourceLayout2\n  {\n    using NativeType = VkSubresourceLayout2;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSubresourceLayout2;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SubresourceLayout2( VULKAN_HPP_NAMESPACE::SubresourceLayout subresourceLayout_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , subresourceLayout{ subresourceLayout_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SubresourceLayout2( SubresourceLayout2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SubresourceLayout2( VkSubresourceLayout2 const & rhs ) VULKAN_HPP_NOEXCEPT : SubresourceLayout2( *reinterpret_cast<SubresourceLayout2 const *>( &rhs ) ) {}\n\n    SubresourceLayout2 & operator=( SubresourceLayout2 const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SubresourceLayout2 & operator=( VkSubresourceLayout2 const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SubresourceLayout2 const *>( &rhs );\n      return *this;\n    }\n\n    operator VkSubresourceLayout2 const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSubresourceLayout2 *>( this );\n    }\n\n    operator VkSubresourceLayout2 &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSubresourceLayout2 *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::SubresourceLayout const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, subresourceLayout );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SubresourceLayout2 const & ) const = default;\n#else\n    bool operator==( SubresourceLayout2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( subresourceLayout == rhs.subresourceLayout );\n#  endif\n    }\n\n    bool operator!=( SubresourceLayout2 const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType     sType             = StructureType::eSubresourceLayout2;\n    void *                                  pNext             = {};\n    VULKAN_HPP_NAMESPACE::SubresourceLayout subresourceLayout = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSubresourceLayout2>\n  {\n    using Type = SubresourceLayout2;\n  };\n\n  using SubresourceLayout2EXT = SubresourceLayout2;\n  using SubresourceLayout2KHR = SubresourceLayout2;\n\n  struct SurfaceCapabilities2EXT\n  {\n    using NativeType = VkSurfaceCapabilities2EXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSurfaceCapabilities2EXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SurfaceCapabilities2EXT(\n      uint32_t                                          minImageCount_            = {},\n      uint32_t                                          maxImageCount_            = {},\n      VULKAN_HPP_NAMESPACE::Extent2D                    currentExtent_            = {},\n      VULKAN_HPP_NAMESPACE::Extent2D                    minImageExtent_           = {},\n      VULKAN_HPP_NAMESPACE::Extent2D                    maxImageExtent_           = {},\n      uint32_t                                          maxImageArrayLayers_      = {},\n      VULKAN_HPP_NAMESPACE::SurfaceTransformFlagsKHR    supportedTransforms_      = {},\n      VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR currentTransform_         = VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR::eIdentity,\n      VULKAN_HPP_NAMESPACE::CompositeAlphaFlagsKHR      supportedCompositeAlpha_  = {},\n      VULKAN_HPP_NAMESPACE::ImageUsageFlags             supportedUsageFlags_      = {},\n      VULKAN_HPP_NAMESPACE::SurfaceCounterFlagsEXT      supportedSurfaceCounters_ = {},\n      void *                                            pNext_                    = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , minImageCount{ minImageCount_ }\n      , maxImageCount{ maxImageCount_ }\n      , currentExtent{ currentExtent_ }\n      , minImageExtent{ minImageExtent_ }\n      , maxImageExtent{ maxImageExtent_ }\n      , maxImageArrayLayers{ maxImageArrayLayers_ }\n      , supportedTransforms{ supportedTransforms_ }\n      , currentTransform{ currentTransform_ }\n      , supportedCompositeAlpha{ supportedCompositeAlpha_ }\n      , supportedUsageFlags{ supportedUsageFlags_ }\n      , supportedSurfaceCounters{ supportedSurfaceCounters_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SurfaceCapabilities2EXT( SurfaceCapabilities2EXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SurfaceCapabilities2EXT( VkSurfaceCapabilities2EXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SurfaceCapabilities2EXT( *reinterpret_cast<SurfaceCapabilities2EXT const *>( &rhs ) )\n    {\n    }\n\n    SurfaceCapabilities2EXT & operator=( SurfaceCapabilities2EXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SurfaceCapabilities2EXT & operator=( VkSurfaceCapabilities2EXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SurfaceCapabilities2EXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkSurfaceCapabilities2EXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSurfaceCapabilities2EXT *>( this );\n    }\n\n    operator VkSurfaceCapabilities2EXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSurfaceCapabilities2EXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::SurfaceTransformFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR const &,\n               VULKAN_HPP_NAMESPACE::CompositeAlphaFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::ImageUsageFlags const &,\n               VULKAN_HPP_NAMESPACE::SurfaceCounterFlagsEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       minImageCount,\n                       maxImageCount,\n                       currentExtent,\n                       minImageExtent,\n                       maxImageExtent,\n                       maxImageArrayLayers,\n                       supportedTransforms,\n                       currentTransform,\n                       supportedCompositeAlpha,\n                       supportedUsageFlags,\n                       supportedSurfaceCounters );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SurfaceCapabilities2EXT const & ) const = default;\n#else\n    bool operator==( SurfaceCapabilities2EXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( minImageCount == rhs.minImageCount ) && ( maxImageCount == rhs.maxImageCount ) &&\n             ( currentExtent == rhs.currentExtent ) && ( minImageExtent == rhs.minImageExtent ) && ( maxImageExtent == rhs.maxImageExtent ) &&\n             ( maxImageArrayLayers == rhs.maxImageArrayLayers ) && ( supportedTransforms == rhs.supportedTransforms ) &&\n             ( currentTransform == rhs.currentTransform ) && ( supportedCompositeAlpha == rhs.supportedCompositeAlpha ) &&\n             ( supportedUsageFlags == rhs.supportedUsageFlags ) && ( supportedSurfaceCounters == rhs.supportedSurfaceCounters );\n#  endif\n    }\n\n    bool operator!=( SurfaceCapabilities2EXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType                    = StructureType::eSurfaceCapabilities2EXT;\n    void *                                            pNext                    = {};\n    uint32_t                                          minImageCount            = {};\n    uint32_t                                          maxImageCount            = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                    currentExtent            = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                    minImageExtent           = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                    maxImageExtent           = {};\n    uint32_t                                          maxImageArrayLayers      = {};\n    VULKAN_HPP_NAMESPACE::SurfaceTransformFlagsKHR    supportedTransforms      = {};\n    VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR currentTransform         = VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR::eIdentity;\n    VULKAN_HPP_NAMESPACE::CompositeAlphaFlagsKHR      supportedCompositeAlpha  = {};\n    VULKAN_HPP_NAMESPACE::ImageUsageFlags             supportedUsageFlags      = {};\n    VULKAN_HPP_NAMESPACE::SurfaceCounterFlagsEXT      supportedSurfaceCounters = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSurfaceCapabilities2EXT>\n  {\n    using Type = SurfaceCapabilities2EXT;\n  };\n\n  struct SurfaceCapabilitiesKHR\n  {\n    using NativeType = VkSurfaceCapabilitiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SurfaceCapabilitiesKHR(\n      uint32_t                                          minImageCount_           = {},\n      uint32_t                                          maxImageCount_           = {},\n      VULKAN_HPP_NAMESPACE::Extent2D                    currentExtent_           = {},\n      VULKAN_HPP_NAMESPACE::Extent2D                    minImageExtent_          = {},\n      VULKAN_HPP_NAMESPACE::Extent2D                    maxImageExtent_          = {},\n      uint32_t                                          maxImageArrayLayers_     = {},\n      VULKAN_HPP_NAMESPACE::SurfaceTransformFlagsKHR    supportedTransforms_     = {},\n      VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR currentTransform_        = VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR::eIdentity,\n      VULKAN_HPP_NAMESPACE::CompositeAlphaFlagsKHR      supportedCompositeAlpha_ = {},\n      VULKAN_HPP_NAMESPACE::ImageUsageFlags             supportedUsageFlags_     = {} ) VULKAN_HPP_NOEXCEPT\n      : minImageCount{ minImageCount_ }\n      , maxImageCount{ maxImageCount_ }\n      , currentExtent{ currentExtent_ }\n      , minImageExtent{ minImageExtent_ }\n      , maxImageExtent{ maxImageExtent_ }\n      , maxImageArrayLayers{ maxImageArrayLayers_ }\n      , supportedTransforms{ supportedTransforms_ }\n      , currentTransform{ currentTransform_ }\n      , supportedCompositeAlpha{ supportedCompositeAlpha_ }\n      , supportedUsageFlags{ supportedUsageFlags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SurfaceCapabilitiesKHR( SurfaceCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SurfaceCapabilitiesKHR( VkSurfaceCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SurfaceCapabilitiesKHR( *reinterpret_cast<SurfaceCapabilitiesKHR const *>( &rhs ) )\n    {\n    }\n\n    SurfaceCapabilitiesKHR & operator=( SurfaceCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SurfaceCapabilitiesKHR & operator=( VkSurfaceCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkSurfaceCapabilitiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSurfaceCapabilitiesKHR *>( this );\n    }\n\n    operator VkSurfaceCapabilitiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSurfaceCapabilitiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::SurfaceTransformFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR const &,\n               VULKAN_HPP_NAMESPACE::CompositeAlphaFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::ImageUsageFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( minImageCount,\n                       maxImageCount,\n                       currentExtent,\n                       minImageExtent,\n                       maxImageExtent,\n                       maxImageArrayLayers,\n                       supportedTransforms,\n                       currentTransform,\n                       supportedCompositeAlpha,\n                       supportedUsageFlags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SurfaceCapabilitiesKHR const & ) const = default;\n#else\n    bool operator==( SurfaceCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( minImageCount == rhs.minImageCount ) && ( maxImageCount == rhs.maxImageCount ) && ( currentExtent == rhs.currentExtent ) &&\n             ( minImageExtent == rhs.minImageExtent ) && ( maxImageExtent == rhs.maxImageExtent ) && ( maxImageArrayLayers == rhs.maxImageArrayLayers ) &&\n             ( supportedTransforms == rhs.supportedTransforms ) && ( currentTransform == rhs.currentTransform ) &&\n             ( supportedCompositeAlpha == rhs.supportedCompositeAlpha ) && ( supportedUsageFlags == rhs.supportedUsageFlags );\n#  endif\n    }\n\n    bool operator!=( SurfaceCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t                                          minImageCount           = {};\n    uint32_t                                          maxImageCount           = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                    currentExtent           = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                    minImageExtent          = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                    maxImageExtent          = {};\n    uint32_t                                          maxImageArrayLayers     = {};\n    VULKAN_HPP_NAMESPACE::SurfaceTransformFlagsKHR    supportedTransforms     = {};\n    VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR currentTransform        = VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR::eIdentity;\n    VULKAN_HPP_NAMESPACE::CompositeAlphaFlagsKHR      supportedCompositeAlpha = {};\n    VULKAN_HPP_NAMESPACE::ImageUsageFlags             supportedUsageFlags     = {};\n  };\n\n  struct SurfaceCapabilities2KHR\n  {\n    using NativeType = VkSurfaceCapabilities2KHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSurfaceCapabilities2KHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SurfaceCapabilities2KHR( VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR surfaceCapabilities_ = {},\n                                                  void *                                       pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , surfaceCapabilities{ surfaceCapabilities_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SurfaceCapabilities2KHR( SurfaceCapabilities2KHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SurfaceCapabilities2KHR( VkSurfaceCapabilities2KHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SurfaceCapabilities2KHR( *reinterpret_cast<SurfaceCapabilities2KHR const *>( &rhs ) )\n    {\n    }\n\n    SurfaceCapabilities2KHR & operator=( SurfaceCapabilities2KHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SurfaceCapabilities2KHR & operator=( VkSurfaceCapabilities2KHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkSurfaceCapabilities2KHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSurfaceCapabilities2KHR *>( this );\n    }\n\n    operator VkSurfaceCapabilities2KHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSurfaceCapabilities2KHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, surfaceCapabilities );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SurfaceCapabilities2KHR const & ) const = default;\n#else\n    bool operator==( SurfaceCapabilities2KHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( surfaceCapabilities == rhs.surfaceCapabilities );\n#  endif\n    }\n\n    bool operator!=( SurfaceCapabilities2KHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType               = StructureType::eSurfaceCapabilities2KHR;\n    void *                                       pNext               = {};\n    VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR surfaceCapabilities = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSurfaceCapabilities2KHR>\n  {\n    using Type = SurfaceCapabilities2KHR;\n  };\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  struct SurfaceCapabilitiesFullScreenExclusiveEXT\n  {\n    using NativeType = VkSurfaceCapabilitiesFullScreenExclusiveEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSurfaceCapabilitiesFullScreenExclusiveEXT;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SurfaceCapabilitiesFullScreenExclusiveEXT( VULKAN_HPP_NAMESPACE::Bool32 fullScreenExclusiveSupported_ = {},\n                                                                    void *                       pNext_                        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , fullScreenExclusiveSupported{ fullScreenExclusiveSupported_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SurfaceCapabilitiesFullScreenExclusiveEXT( SurfaceCapabilitiesFullScreenExclusiveEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SurfaceCapabilitiesFullScreenExclusiveEXT( VkSurfaceCapabilitiesFullScreenExclusiveEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SurfaceCapabilitiesFullScreenExclusiveEXT( *reinterpret_cast<SurfaceCapabilitiesFullScreenExclusiveEXT const *>( &rhs ) )\n    {\n    }\n\n    SurfaceCapabilitiesFullScreenExclusiveEXT & operator=( SurfaceCapabilitiesFullScreenExclusiveEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SurfaceCapabilitiesFullScreenExclusiveEXT & operator=( VkSurfaceCapabilitiesFullScreenExclusiveEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesFullScreenExclusiveEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkSurfaceCapabilitiesFullScreenExclusiveEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSurfaceCapabilitiesFullScreenExclusiveEXT *>( this );\n    }\n\n    operator VkSurfaceCapabilitiesFullScreenExclusiveEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSurfaceCapabilitiesFullScreenExclusiveEXT *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, fullScreenExclusiveSupported );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SurfaceCapabilitiesFullScreenExclusiveEXT const & ) const = default;\n#  else\n    bool operator==( SurfaceCapabilitiesFullScreenExclusiveEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( fullScreenExclusiveSupported == rhs.fullScreenExclusiveSupported );\n#    endif\n    }\n\n    bool operator!=( SurfaceCapabilitiesFullScreenExclusiveEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                        = StructureType::eSurfaceCapabilitiesFullScreenExclusiveEXT;\n    void *                              pNext                        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        fullScreenExclusiveSupported = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSurfaceCapabilitiesFullScreenExclusiveEXT>\n  {\n    using Type = SurfaceCapabilitiesFullScreenExclusiveEXT;\n  };\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  struct SurfaceCapabilitiesPresentBarrierNV\n  {\n    using NativeType = VkSurfaceCapabilitiesPresentBarrierNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSurfaceCapabilitiesPresentBarrierNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SurfaceCapabilitiesPresentBarrierNV( VULKAN_HPP_NAMESPACE::Bool32 presentBarrierSupported_ = {},\n                                                              void *                       pNext_                   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , presentBarrierSupported{ presentBarrierSupported_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SurfaceCapabilitiesPresentBarrierNV( SurfaceCapabilitiesPresentBarrierNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SurfaceCapabilitiesPresentBarrierNV( VkSurfaceCapabilitiesPresentBarrierNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SurfaceCapabilitiesPresentBarrierNV( *reinterpret_cast<SurfaceCapabilitiesPresentBarrierNV const *>( &rhs ) )\n    {\n    }\n\n    SurfaceCapabilitiesPresentBarrierNV & operator=( SurfaceCapabilitiesPresentBarrierNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SurfaceCapabilitiesPresentBarrierNV & operator=( VkSurfaceCapabilitiesPresentBarrierNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesPresentBarrierNV const *>( &rhs );\n      return *this;\n    }\n\n    operator VkSurfaceCapabilitiesPresentBarrierNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSurfaceCapabilitiesPresentBarrierNV *>( this );\n    }\n\n    operator VkSurfaceCapabilitiesPresentBarrierNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSurfaceCapabilitiesPresentBarrierNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, presentBarrierSupported );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SurfaceCapabilitiesPresentBarrierNV const & ) const = default;\n#else\n    bool operator==( SurfaceCapabilitiesPresentBarrierNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( presentBarrierSupported == rhs.presentBarrierSupported );\n#  endif\n    }\n\n    bool operator!=( SurfaceCapabilitiesPresentBarrierNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                   = StructureType::eSurfaceCapabilitiesPresentBarrierNV;\n    void *                              pNext                   = {};\n    VULKAN_HPP_NAMESPACE::Bool32        presentBarrierSupported = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSurfaceCapabilitiesPresentBarrierNV>\n  {\n    using Type = SurfaceCapabilitiesPresentBarrierNV;\n  };\n\n  struct SurfaceFormatKHR\n  {\n    using NativeType = VkSurfaceFormatKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      SurfaceFormatKHR( VULKAN_HPP_NAMESPACE::Format        format_     = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                        VULKAN_HPP_NAMESPACE::ColorSpaceKHR colorSpace_ = VULKAN_HPP_NAMESPACE::ColorSpaceKHR::eSrgbNonlinear ) VULKAN_HPP_NOEXCEPT\n      : format{ format_ }\n      , colorSpace{ colorSpace_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SurfaceFormatKHR( SurfaceFormatKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SurfaceFormatKHR( VkSurfaceFormatKHR const & rhs ) VULKAN_HPP_NOEXCEPT : SurfaceFormatKHR( *reinterpret_cast<SurfaceFormatKHR const *>( &rhs ) ) {}\n\n    SurfaceFormatKHR & operator=( SurfaceFormatKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SurfaceFormatKHR & operator=( VkSurfaceFormatKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SurfaceFormatKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkSurfaceFormatKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSurfaceFormatKHR *>( this );\n    }\n\n    operator VkSurfaceFormatKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSurfaceFormatKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::Format const &, VULKAN_HPP_NAMESPACE::ColorSpaceKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( format, colorSpace );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SurfaceFormatKHR const & ) const = default;\n#else\n    bool operator==( SurfaceFormatKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( format == rhs.format ) && ( colorSpace == rhs.colorSpace );\n#  endif\n    }\n\n    bool operator!=( SurfaceFormatKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::Format        format     = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::ColorSpaceKHR colorSpace = VULKAN_HPP_NAMESPACE::ColorSpaceKHR::eSrgbNonlinear;\n  };\n\n  struct SurfaceFormat2KHR\n  {\n    using NativeType = VkSurfaceFormat2KHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSurfaceFormat2KHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SurfaceFormat2KHR( VULKAN_HPP_NAMESPACE::SurfaceFormatKHR surfaceFormat_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , surfaceFormat{ surfaceFormat_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SurfaceFormat2KHR( SurfaceFormat2KHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SurfaceFormat2KHR( VkSurfaceFormat2KHR const & rhs ) VULKAN_HPP_NOEXCEPT : SurfaceFormat2KHR( *reinterpret_cast<SurfaceFormat2KHR const *>( &rhs ) ) {}\n\n    SurfaceFormat2KHR & operator=( SurfaceFormat2KHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SurfaceFormat2KHR & operator=( VkSurfaceFormat2KHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkSurfaceFormat2KHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSurfaceFormat2KHR *>( this );\n    }\n\n    operator VkSurfaceFormat2KHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSurfaceFormat2KHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::SurfaceFormatKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, surfaceFormat );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SurfaceFormat2KHR const & ) const = default;\n#else\n    bool operator==( SurfaceFormat2KHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( surfaceFormat == rhs.surfaceFormat );\n#  endif\n    }\n\n    bool operator!=( SurfaceFormat2KHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType         = StructureType::eSurfaceFormat2KHR;\n    void *                                 pNext         = {};\n    VULKAN_HPP_NAMESPACE::SurfaceFormatKHR surfaceFormat = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSurfaceFormat2KHR>\n  {\n    using Type = SurfaceFormat2KHR;\n  };\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  struct SurfaceFullScreenExclusiveInfoEXT\n  {\n    using NativeType = VkSurfaceFullScreenExclusiveInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSurfaceFullScreenExclusiveInfoEXT;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SurfaceFullScreenExclusiveInfoEXT(\n      VULKAN_HPP_NAMESPACE::FullScreenExclusiveEXT fullScreenExclusive_ = VULKAN_HPP_NAMESPACE::FullScreenExclusiveEXT::eDefault,\n      void *                                       pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , fullScreenExclusive{ fullScreenExclusive_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SurfaceFullScreenExclusiveInfoEXT( SurfaceFullScreenExclusiveInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SurfaceFullScreenExclusiveInfoEXT( VkSurfaceFullScreenExclusiveInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SurfaceFullScreenExclusiveInfoEXT( *reinterpret_cast<SurfaceFullScreenExclusiveInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    SurfaceFullScreenExclusiveInfoEXT & operator=( SurfaceFullScreenExclusiveInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SurfaceFullScreenExclusiveInfoEXT & operator=( VkSurfaceFullScreenExclusiveInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SurfaceFullScreenExclusiveInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SurfaceFullScreenExclusiveInfoEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SurfaceFullScreenExclusiveInfoEXT &\n      setFullScreenExclusive( VULKAN_HPP_NAMESPACE::FullScreenExclusiveEXT fullScreenExclusive_ ) VULKAN_HPP_NOEXCEPT\n    {\n      fullScreenExclusive = fullScreenExclusive_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSurfaceFullScreenExclusiveInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSurfaceFullScreenExclusiveInfoEXT *>( this );\n    }\n\n    operator VkSurfaceFullScreenExclusiveInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSurfaceFullScreenExclusiveInfoEXT *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::FullScreenExclusiveEXT const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, fullScreenExclusive );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SurfaceFullScreenExclusiveInfoEXT const & ) const = default;\n#  else\n    bool operator==( SurfaceFullScreenExclusiveInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( fullScreenExclusive == rhs.fullScreenExclusive );\n#    endif\n    }\n\n    bool operator!=( SurfaceFullScreenExclusiveInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType               = StructureType::eSurfaceFullScreenExclusiveInfoEXT;\n    void *                                       pNext               = {};\n    VULKAN_HPP_NAMESPACE::FullScreenExclusiveEXT fullScreenExclusive = VULKAN_HPP_NAMESPACE::FullScreenExclusiveEXT::eDefault;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSurfaceFullScreenExclusiveInfoEXT>\n  {\n    using Type = SurfaceFullScreenExclusiveInfoEXT;\n  };\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  struct SurfaceFullScreenExclusiveWin32InfoEXT\n  {\n    using NativeType = VkSurfaceFullScreenExclusiveWin32InfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSurfaceFullScreenExclusiveWin32InfoEXT;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SurfaceFullScreenExclusiveWin32InfoEXT( HMONITOR hmonitor_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , hmonitor{ hmonitor_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SurfaceFullScreenExclusiveWin32InfoEXT( SurfaceFullScreenExclusiveWin32InfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SurfaceFullScreenExclusiveWin32InfoEXT( VkSurfaceFullScreenExclusiveWin32InfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SurfaceFullScreenExclusiveWin32InfoEXT( *reinterpret_cast<SurfaceFullScreenExclusiveWin32InfoEXT const *>( &rhs ) )\n    {\n    }\n\n    SurfaceFullScreenExclusiveWin32InfoEXT & operator=( SurfaceFullScreenExclusiveWin32InfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SurfaceFullScreenExclusiveWin32InfoEXT & operator=( VkSurfaceFullScreenExclusiveWin32InfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SurfaceFullScreenExclusiveWin32InfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SurfaceFullScreenExclusiveWin32InfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SurfaceFullScreenExclusiveWin32InfoEXT & setHmonitor( HMONITOR hmonitor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      hmonitor = hmonitor_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSurfaceFullScreenExclusiveWin32InfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSurfaceFullScreenExclusiveWin32InfoEXT *>( this );\n    }\n\n    operator VkSurfaceFullScreenExclusiveWin32InfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSurfaceFullScreenExclusiveWin32InfoEXT *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, HMONITOR const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, hmonitor );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SurfaceFullScreenExclusiveWin32InfoEXT const & ) const = default;\n#  else\n    bool operator==( SurfaceFullScreenExclusiveWin32InfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( hmonitor == rhs.hmonitor );\n#    endif\n    }\n\n    bool operator!=( SurfaceFullScreenExclusiveWin32InfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType    = StructureType::eSurfaceFullScreenExclusiveWin32InfoEXT;\n    const void *                        pNext    = {};\n    HMONITOR                            hmonitor = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSurfaceFullScreenExclusiveWin32InfoEXT>\n  {\n    using Type = SurfaceFullScreenExclusiveWin32InfoEXT;\n  };\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  struct SurfacePresentModeCompatibilityEXT\n  {\n    using NativeType = VkSurfacePresentModeCompatibilityEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSurfacePresentModeCompatibilityEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SurfacePresentModeCompatibilityEXT( uint32_t                               presentModeCount_ = {},\n                                                             VULKAN_HPP_NAMESPACE::PresentModeKHR * pPresentModes_    = {},\n                                                             void *                                 pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , presentModeCount{ presentModeCount_ }\n      , pPresentModes{ pPresentModes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SurfacePresentModeCompatibilityEXT( SurfacePresentModeCompatibilityEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SurfacePresentModeCompatibilityEXT( VkSurfacePresentModeCompatibilityEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SurfacePresentModeCompatibilityEXT( *reinterpret_cast<SurfacePresentModeCompatibilityEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SurfacePresentModeCompatibilityEXT( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<VULKAN_HPP_NAMESPACE::PresentModeKHR> const & presentModes_,\n                                        void *                                                                                      pNext_ = nullptr )\n      : pNext( pNext_ ), presentModeCount( static_cast<uint32_t>( presentModes_.size() ) ), pPresentModes( presentModes_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    SurfacePresentModeCompatibilityEXT & operator=( SurfacePresentModeCompatibilityEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SurfacePresentModeCompatibilityEXT & operator=( VkSurfacePresentModeCompatibilityEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SurfacePresentModeCompatibilityEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SurfacePresentModeCompatibilityEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SurfacePresentModeCompatibilityEXT & setPresentModeCount( uint32_t presentModeCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      presentModeCount = presentModeCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SurfacePresentModeCompatibilityEXT & setPPresentModes( VULKAN_HPP_NAMESPACE::PresentModeKHR * pPresentModes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPresentModes = pPresentModes_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SurfacePresentModeCompatibilityEXT &\n      setPresentModes( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<VULKAN_HPP_NAMESPACE::PresentModeKHR> const & presentModes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      presentModeCount = static_cast<uint32_t>( presentModes_.size() );\n      pPresentModes    = presentModes_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSurfacePresentModeCompatibilityEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSurfacePresentModeCompatibilityEXT *>( this );\n    }\n\n    operator VkSurfacePresentModeCompatibilityEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSurfacePresentModeCompatibilityEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &, VULKAN_HPP_NAMESPACE::PresentModeKHR * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, presentModeCount, pPresentModes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SurfacePresentModeCompatibilityEXT const & ) const = default;\n#else\n    bool operator==( SurfacePresentModeCompatibilityEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( presentModeCount == rhs.presentModeCount ) && ( pPresentModes == rhs.pPresentModes );\n#  endif\n    }\n\n    bool operator!=( SurfacePresentModeCompatibilityEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType            = StructureType::eSurfacePresentModeCompatibilityEXT;\n    void *                                 pNext            = {};\n    uint32_t                               presentModeCount = {};\n    VULKAN_HPP_NAMESPACE::PresentModeKHR * pPresentModes    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSurfacePresentModeCompatibilityEXT>\n  {\n    using Type = SurfacePresentModeCompatibilityEXT;\n  };\n\n  struct SurfacePresentModeEXT\n  {\n    using NativeType = VkSurfacePresentModeEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSurfacePresentModeEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SurfacePresentModeEXT( VULKAN_HPP_NAMESPACE::PresentModeKHR presentMode_ = VULKAN_HPP_NAMESPACE::PresentModeKHR::eImmediate,\n                                                void *                               pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , presentMode{ presentMode_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SurfacePresentModeEXT( SurfacePresentModeEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SurfacePresentModeEXT( VkSurfacePresentModeEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SurfacePresentModeEXT( *reinterpret_cast<SurfacePresentModeEXT const *>( &rhs ) )\n    {\n    }\n\n    SurfacePresentModeEXT & operator=( SurfacePresentModeEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SurfacePresentModeEXT & operator=( VkSurfacePresentModeEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SurfacePresentModeEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SurfacePresentModeEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SurfacePresentModeEXT & setPresentMode( VULKAN_HPP_NAMESPACE::PresentModeKHR presentMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      presentMode = presentMode_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSurfacePresentModeEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSurfacePresentModeEXT *>( this );\n    }\n\n    operator VkSurfacePresentModeEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSurfacePresentModeEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::PresentModeKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, presentMode );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SurfacePresentModeEXT const & ) const = default;\n#else\n    bool operator==( SurfacePresentModeEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( presentMode == rhs.presentMode );\n#  endif\n    }\n\n    bool operator!=( SurfacePresentModeEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType  sType       = StructureType::eSurfacePresentModeEXT;\n    void *                               pNext       = {};\n    VULKAN_HPP_NAMESPACE::PresentModeKHR presentMode = VULKAN_HPP_NAMESPACE::PresentModeKHR::eImmediate;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSurfacePresentModeEXT>\n  {\n    using Type = SurfacePresentModeEXT;\n  };\n\n  struct SurfacePresentScalingCapabilitiesEXT\n  {\n    using NativeType = VkSurfacePresentScalingCapabilitiesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSurfacePresentScalingCapabilitiesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SurfacePresentScalingCapabilitiesEXT( VULKAN_HPP_NAMESPACE::PresentScalingFlagsEXT supportedPresentScaling_  = {},\n                                                               VULKAN_HPP_NAMESPACE::PresentGravityFlagsEXT supportedPresentGravityX_ = {},\n                                                               VULKAN_HPP_NAMESPACE::PresentGravityFlagsEXT supportedPresentGravityY_ = {},\n                                                               VULKAN_HPP_NAMESPACE::Extent2D               minScaledImageExtent_     = {},\n                                                               VULKAN_HPP_NAMESPACE::Extent2D               maxScaledImageExtent_     = {},\n                                                               void *                                       pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , supportedPresentScaling{ supportedPresentScaling_ }\n      , supportedPresentGravityX{ supportedPresentGravityX_ }\n      , supportedPresentGravityY{ supportedPresentGravityY_ }\n      , minScaledImageExtent{ minScaledImageExtent_ }\n      , maxScaledImageExtent{ maxScaledImageExtent_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SurfacePresentScalingCapabilitiesEXT( SurfacePresentScalingCapabilitiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SurfacePresentScalingCapabilitiesEXT( VkSurfacePresentScalingCapabilitiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SurfacePresentScalingCapabilitiesEXT( *reinterpret_cast<SurfacePresentScalingCapabilitiesEXT const *>( &rhs ) )\n    {\n    }\n\n    SurfacePresentScalingCapabilitiesEXT & operator=( SurfacePresentScalingCapabilitiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SurfacePresentScalingCapabilitiesEXT & operator=( VkSurfacePresentScalingCapabilitiesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SurfacePresentScalingCapabilitiesEXT const *>( &rhs );\n      return *this;\n    }\n\n    operator VkSurfacePresentScalingCapabilitiesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSurfacePresentScalingCapabilitiesEXT *>( this );\n    }\n\n    operator VkSurfacePresentScalingCapabilitiesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSurfacePresentScalingCapabilitiesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::PresentScalingFlagsEXT const &,\n               VULKAN_HPP_NAMESPACE::PresentGravityFlagsEXT const &,\n               VULKAN_HPP_NAMESPACE::PresentGravityFlagsEXT const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, supportedPresentScaling, supportedPresentGravityX, supportedPresentGravityY, minScaledImageExtent, maxScaledImageExtent );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SurfacePresentScalingCapabilitiesEXT const & ) const = default;\n#else\n    bool operator==( SurfacePresentScalingCapabilitiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( supportedPresentScaling == rhs.supportedPresentScaling ) &&\n             ( supportedPresentGravityX == rhs.supportedPresentGravityX ) && ( supportedPresentGravityY == rhs.supportedPresentGravityY ) &&\n             ( minScaledImageExtent == rhs.minScaledImageExtent ) && ( maxScaledImageExtent == rhs.maxScaledImageExtent );\n#  endif\n    }\n\n    bool operator!=( SurfacePresentScalingCapabilitiesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType                    = StructureType::eSurfacePresentScalingCapabilitiesEXT;\n    void *                                       pNext                    = {};\n    VULKAN_HPP_NAMESPACE::PresentScalingFlagsEXT supportedPresentScaling  = {};\n    VULKAN_HPP_NAMESPACE::PresentGravityFlagsEXT supportedPresentGravityX = {};\n    VULKAN_HPP_NAMESPACE::PresentGravityFlagsEXT supportedPresentGravityY = {};\n    VULKAN_HPP_NAMESPACE::Extent2D               minScaledImageExtent     = {};\n    VULKAN_HPP_NAMESPACE::Extent2D               maxScaledImageExtent     = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSurfacePresentScalingCapabilitiesEXT>\n  {\n    using Type = SurfacePresentScalingCapabilitiesEXT;\n  };\n\n  struct SurfaceProtectedCapabilitiesKHR\n  {\n    using NativeType = VkSurfaceProtectedCapabilitiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSurfaceProtectedCapabilitiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SurfaceProtectedCapabilitiesKHR( VULKAN_HPP_NAMESPACE::Bool32 supportsProtected_ = {},\n                                                          const void *                 pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , supportsProtected{ supportsProtected_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SurfaceProtectedCapabilitiesKHR( SurfaceProtectedCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SurfaceProtectedCapabilitiesKHR( VkSurfaceProtectedCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SurfaceProtectedCapabilitiesKHR( *reinterpret_cast<SurfaceProtectedCapabilitiesKHR const *>( &rhs ) )\n    {\n    }\n\n    SurfaceProtectedCapabilitiesKHR & operator=( SurfaceProtectedCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SurfaceProtectedCapabilitiesKHR & operator=( VkSurfaceProtectedCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SurfaceProtectedCapabilitiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkSurfaceProtectedCapabilitiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSurfaceProtectedCapabilitiesKHR *>( this );\n    }\n\n    operator VkSurfaceProtectedCapabilitiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSurfaceProtectedCapabilitiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, supportsProtected );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SurfaceProtectedCapabilitiesKHR const & ) const = default;\n#else\n    bool operator==( SurfaceProtectedCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( supportsProtected == rhs.supportsProtected );\n#  endif\n    }\n\n    bool operator!=( SurfaceProtectedCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType             = StructureType::eSurfaceProtectedCapabilitiesKHR;\n    const void *                        pNext             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        supportsProtected = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSurfaceProtectedCapabilitiesKHR>\n  {\n    using Type = SurfaceProtectedCapabilitiesKHR;\n  };\n\n  struct SwapchainCounterCreateInfoEXT\n  {\n    using NativeType = VkSwapchainCounterCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSwapchainCounterCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SwapchainCounterCreateInfoEXT( VULKAN_HPP_NAMESPACE::SurfaceCounterFlagsEXT surfaceCounters_ = {},\n                                                        const void *                                 pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , surfaceCounters{ surfaceCounters_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SwapchainCounterCreateInfoEXT( SwapchainCounterCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SwapchainCounterCreateInfoEXT( VkSwapchainCounterCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SwapchainCounterCreateInfoEXT( *reinterpret_cast<SwapchainCounterCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    SwapchainCounterCreateInfoEXT & operator=( SwapchainCounterCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SwapchainCounterCreateInfoEXT & operator=( VkSwapchainCounterCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SwapchainCounterCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SwapchainCounterCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainCounterCreateInfoEXT &\n      setSurfaceCounters( VULKAN_HPP_NAMESPACE::SurfaceCounterFlagsEXT surfaceCounters_ ) VULKAN_HPP_NOEXCEPT\n    {\n      surfaceCounters = surfaceCounters_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSwapchainCounterCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSwapchainCounterCreateInfoEXT *>( this );\n    }\n\n    operator VkSwapchainCounterCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSwapchainCounterCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::SurfaceCounterFlagsEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, surfaceCounters );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SwapchainCounterCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( SwapchainCounterCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( surfaceCounters == rhs.surfaceCounters );\n#  endif\n    }\n\n    bool operator!=( SwapchainCounterCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType           = StructureType::eSwapchainCounterCreateInfoEXT;\n    const void *                                 pNext           = {};\n    VULKAN_HPP_NAMESPACE::SurfaceCounterFlagsEXT surfaceCounters = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSwapchainCounterCreateInfoEXT>\n  {\n    using Type = SwapchainCounterCreateInfoEXT;\n  };\n\n  struct SwapchainCreateInfoKHR\n  {\n    using NativeType = VkSwapchainCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSwapchainCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      SwapchainCreateInfoKHR( VULKAN_HPP_NAMESPACE::SwapchainCreateFlagsKHR     flags_                 = {},\n                              VULKAN_HPP_NAMESPACE::SurfaceKHR                  surface_               = {},\n                              uint32_t                                          minImageCount_         = {},\n                              VULKAN_HPP_NAMESPACE::Format                      imageFormat_           = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                              VULKAN_HPP_NAMESPACE::ColorSpaceKHR               imageColorSpace_       = VULKAN_HPP_NAMESPACE::ColorSpaceKHR::eSrgbNonlinear,\n                              VULKAN_HPP_NAMESPACE::Extent2D                    imageExtent_           = {},\n                              uint32_t                                          imageArrayLayers_      = {},\n                              VULKAN_HPP_NAMESPACE::ImageUsageFlags             imageUsage_            = {},\n                              VULKAN_HPP_NAMESPACE::SharingMode                 imageSharingMode_      = VULKAN_HPP_NAMESPACE::SharingMode::eExclusive,\n                              uint32_t                                          queueFamilyIndexCount_ = {},\n                              const uint32_t *                                  pQueueFamilyIndices_   = {},\n                              VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR preTransform_   = VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR::eIdentity,\n                              VULKAN_HPP_NAMESPACE::CompositeAlphaFlagBitsKHR   compositeAlpha_ = VULKAN_HPP_NAMESPACE::CompositeAlphaFlagBitsKHR::eOpaque,\n                              VULKAN_HPP_NAMESPACE::PresentModeKHR              presentMode_    = VULKAN_HPP_NAMESPACE::PresentModeKHR::eImmediate,\n                              VULKAN_HPP_NAMESPACE::Bool32                      clipped_        = {},\n                              VULKAN_HPP_NAMESPACE::SwapchainKHR                oldSwapchain_   = {},\n                              const void *                                      pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , surface{ surface_ }\n      , minImageCount{ minImageCount_ }\n      , imageFormat{ imageFormat_ }\n      , imageColorSpace{ imageColorSpace_ }\n      , imageExtent{ imageExtent_ }\n      , imageArrayLayers{ imageArrayLayers_ }\n      , imageUsage{ imageUsage_ }\n      , imageSharingMode{ imageSharingMode_ }\n      , queueFamilyIndexCount{ queueFamilyIndexCount_ }\n      , pQueueFamilyIndices{ pQueueFamilyIndices_ }\n      , preTransform{ preTransform_ }\n      , compositeAlpha{ compositeAlpha_ }\n      , presentMode{ presentMode_ }\n      , clipped{ clipped_ }\n      , oldSwapchain{ oldSwapchain_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SwapchainCreateInfoKHR( SwapchainCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SwapchainCreateInfoKHR( VkSwapchainCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SwapchainCreateInfoKHR( *reinterpret_cast<SwapchainCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SwapchainCreateInfoKHR( VULKAN_HPP_NAMESPACE::SwapchainCreateFlagsKHR                         flags_,\n                            VULKAN_HPP_NAMESPACE::SurfaceKHR                                      surface_,\n                            uint32_t                                                              minImageCount_,\n                            VULKAN_HPP_NAMESPACE::Format                                          imageFormat_,\n                            VULKAN_HPP_NAMESPACE::ColorSpaceKHR                                   imageColorSpace_,\n                            VULKAN_HPP_NAMESPACE::Extent2D                                        imageExtent_,\n                            uint32_t                                                              imageArrayLayers_,\n                            VULKAN_HPP_NAMESPACE::ImageUsageFlags                                 imageUsage_,\n                            VULKAN_HPP_NAMESPACE::SharingMode                                     imageSharingMode_,\n                            VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & queueFamilyIndices_,\n                            VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR preTransform_   = VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR::eIdentity,\n                            VULKAN_HPP_NAMESPACE::CompositeAlphaFlagBitsKHR   compositeAlpha_ = VULKAN_HPP_NAMESPACE::CompositeAlphaFlagBitsKHR::eOpaque,\n                            VULKAN_HPP_NAMESPACE::PresentModeKHR              presentMode_    = VULKAN_HPP_NAMESPACE::PresentModeKHR::eImmediate,\n                            VULKAN_HPP_NAMESPACE::Bool32                      clipped_        = {},\n                            VULKAN_HPP_NAMESPACE::SwapchainKHR                oldSwapchain_   = {},\n                            const void *                                      pNext_          = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , surface( surface_ )\n      , minImageCount( minImageCount_ )\n      , imageFormat( imageFormat_ )\n      , imageColorSpace( imageColorSpace_ )\n      , imageExtent( imageExtent_ )\n      , imageArrayLayers( imageArrayLayers_ )\n      , imageUsage( imageUsage_ )\n      , imageSharingMode( imageSharingMode_ )\n      , queueFamilyIndexCount( static_cast<uint32_t>( queueFamilyIndices_.size() ) )\n      , pQueueFamilyIndices( queueFamilyIndices_.data() )\n      , preTransform( preTransform_ )\n      , compositeAlpha( compositeAlpha_ )\n      , presentMode( presentMode_ )\n      , clipped( clipped_ )\n      , oldSwapchain( oldSwapchain_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    SwapchainCreateInfoKHR & operator=( SwapchainCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SwapchainCreateInfoKHR & operator=( VkSwapchainCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SwapchainCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainCreateInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::SwapchainCreateFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainCreateInfoKHR & setSurface( VULKAN_HPP_NAMESPACE::SurfaceKHR surface_ ) VULKAN_HPP_NOEXCEPT\n    {\n      surface = surface_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainCreateInfoKHR & setMinImageCount( uint32_t minImageCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minImageCount = minImageCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainCreateInfoKHR & setImageFormat( VULKAN_HPP_NAMESPACE::Format imageFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageFormat = imageFormat_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainCreateInfoKHR & setImageColorSpace( VULKAN_HPP_NAMESPACE::ColorSpaceKHR imageColorSpace_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageColorSpace = imageColorSpace_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainCreateInfoKHR & setImageExtent( VULKAN_HPP_NAMESPACE::Extent2D const & imageExtent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageExtent = imageExtent_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainCreateInfoKHR & setImageArrayLayers( uint32_t imageArrayLayers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageArrayLayers = imageArrayLayers_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainCreateInfoKHR & setImageUsage( VULKAN_HPP_NAMESPACE::ImageUsageFlags imageUsage_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageUsage = imageUsage_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainCreateInfoKHR & setImageSharingMode( VULKAN_HPP_NAMESPACE::SharingMode imageSharingMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageSharingMode = imageSharingMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainCreateInfoKHR & setQueueFamilyIndexCount( uint32_t queueFamilyIndexCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queueFamilyIndexCount = queueFamilyIndexCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainCreateInfoKHR & setPQueueFamilyIndices( const uint32_t * pQueueFamilyIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pQueueFamilyIndices = pQueueFamilyIndices_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SwapchainCreateInfoKHR &\n      setQueueFamilyIndices( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & queueFamilyIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queueFamilyIndexCount = static_cast<uint32_t>( queueFamilyIndices_.size() );\n      pQueueFamilyIndices   = queueFamilyIndices_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainCreateInfoKHR & setPreTransform( VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR preTransform_ ) VULKAN_HPP_NOEXCEPT\n    {\n      preTransform = preTransform_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainCreateInfoKHR & setCompositeAlpha( VULKAN_HPP_NAMESPACE::CompositeAlphaFlagBitsKHR compositeAlpha_ ) VULKAN_HPP_NOEXCEPT\n    {\n      compositeAlpha = compositeAlpha_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainCreateInfoKHR & setPresentMode( VULKAN_HPP_NAMESPACE::PresentModeKHR presentMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      presentMode = presentMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainCreateInfoKHR & setClipped( VULKAN_HPP_NAMESPACE::Bool32 clipped_ ) VULKAN_HPP_NOEXCEPT\n    {\n      clipped = clipped_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainCreateInfoKHR & setOldSwapchain( VULKAN_HPP_NAMESPACE::SwapchainKHR oldSwapchain_ ) VULKAN_HPP_NOEXCEPT\n    {\n      oldSwapchain = oldSwapchain_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSwapchainCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSwapchainCreateInfoKHR *>( this );\n    }\n\n    operator VkSwapchainCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSwapchainCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::SwapchainCreateFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::SurfaceKHR const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::ColorSpaceKHR const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ImageUsageFlags const &,\n               VULKAN_HPP_NAMESPACE::SharingMode const &,\n               uint32_t const &,\n               const uint32_t * const &,\n               VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR const &,\n               VULKAN_HPP_NAMESPACE::CompositeAlphaFlagBitsKHR const &,\n               VULKAN_HPP_NAMESPACE::PresentModeKHR const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::SwapchainKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       flags,\n                       surface,\n                       minImageCount,\n                       imageFormat,\n                       imageColorSpace,\n                       imageExtent,\n                       imageArrayLayers,\n                       imageUsage,\n                       imageSharingMode,\n                       queueFamilyIndexCount,\n                       pQueueFamilyIndices,\n                       preTransform,\n                       compositeAlpha,\n                       presentMode,\n                       clipped,\n                       oldSwapchain );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SwapchainCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( SwapchainCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( surface == rhs.surface ) &&\n             ( minImageCount == rhs.minImageCount ) && ( imageFormat == rhs.imageFormat ) && ( imageColorSpace == rhs.imageColorSpace ) &&\n             ( imageExtent == rhs.imageExtent ) && ( imageArrayLayers == rhs.imageArrayLayers ) && ( imageUsage == rhs.imageUsage ) &&\n             ( imageSharingMode == rhs.imageSharingMode ) && ( queueFamilyIndexCount == rhs.queueFamilyIndexCount ) &&\n             ( pQueueFamilyIndices == rhs.pQueueFamilyIndices ) && ( preTransform == rhs.preTransform ) && ( compositeAlpha == rhs.compositeAlpha ) &&\n             ( presentMode == rhs.presentMode ) && ( clipped == rhs.clipped ) && ( oldSwapchain == rhs.oldSwapchain );\n#  endif\n    }\n\n    bool operator!=( SwapchainCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType                 = StructureType::eSwapchainCreateInfoKHR;\n    const void *                                      pNext                 = {};\n    VULKAN_HPP_NAMESPACE::SwapchainCreateFlagsKHR     flags                 = {};\n    VULKAN_HPP_NAMESPACE::SurfaceKHR                  surface               = {};\n    uint32_t                                          minImageCount         = {};\n    VULKAN_HPP_NAMESPACE::Format                      imageFormat           = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::ColorSpaceKHR               imageColorSpace       = VULKAN_HPP_NAMESPACE::ColorSpaceKHR::eSrgbNonlinear;\n    VULKAN_HPP_NAMESPACE::Extent2D                    imageExtent           = {};\n    uint32_t                                          imageArrayLayers      = {};\n    VULKAN_HPP_NAMESPACE::ImageUsageFlags             imageUsage            = {};\n    VULKAN_HPP_NAMESPACE::SharingMode                 imageSharingMode      = VULKAN_HPP_NAMESPACE::SharingMode::eExclusive;\n    uint32_t                                          queueFamilyIndexCount = {};\n    const uint32_t *                                  pQueueFamilyIndices   = {};\n    VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR preTransform          = VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR::eIdentity;\n    VULKAN_HPP_NAMESPACE::CompositeAlphaFlagBitsKHR   compositeAlpha        = VULKAN_HPP_NAMESPACE::CompositeAlphaFlagBitsKHR::eOpaque;\n    VULKAN_HPP_NAMESPACE::PresentModeKHR              presentMode           = VULKAN_HPP_NAMESPACE::PresentModeKHR::eImmediate;\n    VULKAN_HPP_NAMESPACE::Bool32                      clipped               = {};\n    VULKAN_HPP_NAMESPACE::SwapchainKHR                oldSwapchain          = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSwapchainCreateInfoKHR>\n  {\n    using Type = SwapchainCreateInfoKHR;\n  };\n\n  struct SwapchainDisplayNativeHdrCreateInfoAMD\n  {\n    using NativeType = VkSwapchainDisplayNativeHdrCreateInfoAMD;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSwapchainDisplayNativeHdrCreateInfoAMD;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SwapchainDisplayNativeHdrCreateInfoAMD( VULKAN_HPP_NAMESPACE::Bool32 localDimmingEnable_ = {},\n                                                                 const void *                 pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , localDimmingEnable{ localDimmingEnable_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SwapchainDisplayNativeHdrCreateInfoAMD( SwapchainDisplayNativeHdrCreateInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SwapchainDisplayNativeHdrCreateInfoAMD( VkSwapchainDisplayNativeHdrCreateInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SwapchainDisplayNativeHdrCreateInfoAMD( *reinterpret_cast<SwapchainDisplayNativeHdrCreateInfoAMD const *>( &rhs ) )\n    {\n    }\n\n    SwapchainDisplayNativeHdrCreateInfoAMD & operator=( SwapchainDisplayNativeHdrCreateInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SwapchainDisplayNativeHdrCreateInfoAMD & operator=( VkSwapchainDisplayNativeHdrCreateInfoAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SwapchainDisplayNativeHdrCreateInfoAMD const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SwapchainDisplayNativeHdrCreateInfoAMD & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainDisplayNativeHdrCreateInfoAMD &\n      setLocalDimmingEnable( VULKAN_HPP_NAMESPACE::Bool32 localDimmingEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      localDimmingEnable = localDimmingEnable_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSwapchainDisplayNativeHdrCreateInfoAMD const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSwapchainDisplayNativeHdrCreateInfoAMD *>( this );\n    }\n\n    operator VkSwapchainDisplayNativeHdrCreateInfoAMD &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSwapchainDisplayNativeHdrCreateInfoAMD *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, localDimmingEnable );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SwapchainDisplayNativeHdrCreateInfoAMD const & ) const = default;\n#else\n    bool operator==( SwapchainDisplayNativeHdrCreateInfoAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( localDimmingEnable == rhs.localDimmingEnable );\n#  endif\n    }\n\n    bool operator!=( SwapchainDisplayNativeHdrCreateInfoAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType              = StructureType::eSwapchainDisplayNativeHdrCreateInfoAMD;\n    const void *                        pNext              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        localDimmingEnable = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSwapchainDisplayNativeHdrCreateInfoAMD>\n  {\n    using Type = SwapchainDisplayNativeHdrCreateInfoAMD;\n  };\n\n  struct SwapchainLatencyCreateInfoNV\n  {\n    using NativeType = VkSwapchainLatencyCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSwapchainLatencyCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SwapchainLatencyCreateInfoNV( VULKAN_HPP_NAMESPACE::Bool32 latencyModeEnable_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , latencyModeEnable{ latencyModeEnable_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SwapchainLatencyCreateInfoNV( SwapchainLatencyCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SwapchainLatencyCreateInfoNV( VkSwapchainLatencyCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SwapchainLatencyCreateInfoNV( *reinterpret_cast<SwapchainLatencyCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n    SwapchainLatencyCreateInfoNV & operator=( SwapchainLatencyCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SwapchainLatencyCreateInfoNV & operator=( VkSwapchainLatencyCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SwapchainLatencyCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SwapchainLatencyCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainLatencyCreateInfoNV & setLatencyModeEnable( VULKAN_HPP_NAMESPACE::Bool32 latencyModeEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      latencyModeEnable = latencyModeEnable_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSwapchainLatencyCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSwapchainLatencyCreateInfoNV *>( this );\n    }\n\n    operator VkSwapchainLatencyCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSwapchainLatencyCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, latencyModeEnable );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SwapchainLatencyCreateInfoNV const & ) const = default;\n#else\n    bool operator==( SwapchainLatencyCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( latencyModeEnable == rhs.latencyModeEnable );\n#  endif\n    }\n\n    bool operator!=( SwapchainLatencyCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType             = StructureType::eSwapchainLatencyCreateInfoNV;\n    const void *                        pNext             = {};\n    VULKAN_HPP_NAMESPACE::Bool32        latencyModeEnable = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSwapchainLatencyCreateInfoNV>\n  {\n    using Type = SwapchainLatencyCreateInfoNV;\n  };\n\n  struct SwapchainPresentBarrierCreateInfoNV\n  {\n    using NativeType = VkSwapchainPresentBarrierCreateInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSwapchainPresentBarrierCreateInfoNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SwapchainPresentBarrierCreateInfoNV( VULKAN_HPP_NAMESPACE::Bool32 presentBarrierEnable_ = {},\n                                                              void *                       pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , presentBarrierEnable{ presentBarrierEnable_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SwapchainPresentBarrierCreateInfoNV( SwapchainPresentBarrierCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SwapchainPresentBarrierCreateInfoNV( VkSwapchainPresentBarrierCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SwapchainPresentBarrierCreateInfoNV( *reinterpret_cast<SwapchainPresentBarrierCreateInfoNV const *>( &rhs ) )\n    {\n    }\n\n    SwapchainPresentBarrierCreateInfoNV & operator=( SwapchainPresentBarrierCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SwapchainPresentBarrierCreateInfoNV & operator=( VkSwapchainPresentBarrierCreateInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SwapchainPresentBarrierCreateInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SwapchainPresentBarrierCreateInfoNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainPresentBarrierCreateInfoNV &\n      setPresentBarrierEnable( VULKAN_HPP_NAMESPACE::Bool32 presentBarrierEnable_ ) VULKAN_HPP_NOEXCEPT\n    {\n      presentBarrierEnable = presentBarrierEnable_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSwapchainPresentBarrierCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSwapchainPresentBarrierCreateInfoNV *>( this );\n    }\n\n    operator VkSwapchainPresentBarrierCreateInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSwapchainPresentBarrierCreateInfoNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, presentBarrierEnable );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SwapchainPresentBarrierCreateInfoNV const & ) const = default;\n#else\n    bool operator==( SwapchainPresentBarrierCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( presentBarrierEnable == rhs.presentBarrierEnable );\n#  endif\n    }\n\n    bool operator!=( SwapchainPresentBarrierCreateInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                = StructureType::eSwapchainPresentBarrierCreateInfoNV;\n    void *                              pNext                = {};\n    VULKAN_HPP_NAMESPACE::Bool32        presentBarrierEnable = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSwapchainPresentBarrierCreateInfoNV>\n  {\n    using Type = SwapchainPresentBarrierCreateInfoNV;\n  };\n\n  struct SwapchainPresentFenceInfoEXT\n  {\n    using NativeType = VkSwapchainPresentFenceInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSwapchainPresentFenceInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SwapchainPresentFenceInfoEXT( uint32_t                            swapchainCount_ = {},\n                                                       const VULKAN_HPP_NAMESPACE::Fence * pFences_        = {},\n                                                       const void *                        pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , swapchainCount{ swapchainCount_ }\n      , pFences{ pFences_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SwapchainPresentFenceInfoEXT( SwapchainPresentFenceInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SwapchainPresentFenceInfoEXT( VkSwapchainPresentFenceInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SwapchainPresentFenceInfoEXT( *reinterpret_cast<SwapchainPresentFenceInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SwapchainPresentFenceInfoEXT( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Fence> const & fences_,\n                                  const void *                                                                             pNext_ = nullptr )\n      : pNext( pNext_ ), swapchainCount( static_cast<uint32_t>( fences_.size() ) ), pFences( fences_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    SwapchainPresentFenceInfoEXT & operator=( SwapchainPresentFenceInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SwapchainPresentFenceInfoEXT & operator=( VkSwapchainPresentFenceInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SwapchainPresentFenceInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SwapchainPresentFenceInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainPresentFenceInfoEXT & setSwapchainCount( uint32_t swapchainCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      swapchainCount = swapchainCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainPresentFenceInfoEXT & setPFences( const VULKAN_HPP_NAMESPACE::Fence * pFences_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pFences = pFences_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SwapchainPresentFenceInfoEXT &\n      setFences( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Fence> const & fences_ ) VULKAN_HPP_NOEXCEPT\n    {\n      swapchainCount = static_cast<uint32_t>( fences_.size() );\n      pFences        = fences_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSwapchainPresentFenceInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSwapchainPresentFenceInfoEXT *>( this );\n    }\n\n    operator VkSwapchainPresentFenceInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSwapchainPresentFenceInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::Fence * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, swapchainCount, pFences );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SwapchainPresentFenceInfoEXT const & ) const = default;\n#else\n    bool operator==( SwapchainPresentFenceInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( swapchainCount == rhs.swapchainCount ) && ( pFences == rhs.pFences );\n#  endif\n    }\n\n    bool operator!=( SwapchainPresentFenceInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::eSwapchainPresentFenceInfoEXT;\n    const void *                        pNext          = {};\n    uint32_t                            swapchainCount = {};\n    const VULKAN_HPP_NAMESPACE::Fence * pFences        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSwapchainPresentFenceInfoEXT>\n  {\n    using Type = SwapchainPresentFenceInfoEXT;\n  };\n\n  struct SwapchainPresentModeInfoEXT\n  {\n    using NativeType = VkSwapchainPresentModeInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSwapchainPresentModeInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SwapchainPresentModeInfoEXT( uint32_t                                     swapchainCount_ = {},\n                                                      const VULKAN_HPP_NAMESPACE::PresentModeKHR * pPresentModes_  = {},\n                                                      const void *                                 pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , swapchainCount{ swapchainCount_ }\n      , pPresentModes{ pPresentModes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SwapchainPresentModeInfoEXT( SwapchainPresentModeInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SwapchainPresentModeInfoEXT( VkSwapchainPresentModeInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SwapchainPresentModeInfoEXT( *reinterpret_cast<SwapchainPresentModeInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SwapchainPresentModeInfoEXT( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PresentModeKHR> const & presentModes_,\n                                 const void *                                                                                      pNext_ = nullptr )\n      : pNext( pNext_ ), swapchainCount( static_cast<uint32_t>( presentModes_.size() ) ), pPresentModes( presentModes_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    SwapchainPresentModeInfoEXT & operator=( SwapchainPresentModeInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SwapchainPresentModeInfoEXT & operator=( VkSwapchainPresentModeInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SwapchainPresentModeInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SwapchainPresentModeInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainPresentModeInfoEXT & setSwapchainCount( uint32_t swapchainCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      swapchainCount = swapchainCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainPresentModeInfoEXT & setPPresentModes( const VULKAN_HPP_NAMESPACE::PresentModeKHR * pPresentModes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPresentModes = pPresentModes_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SwapchainPresentModeInfoEXT &\n      setPresentModes( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PresentModeKHR> const & presentModes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      swapchainCount = static_cast<uint32_t>( presentModes_.size() );\n      pPresentModes  = presentModes_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSwapchainPresentModeInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSwapchainPresentModeInfoEXT *>( this );\n    }\n\n    operator VkSwapchainPresentModeInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSwapchainPresentModeInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::PresentModeKHR * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, swapchainCount, pPresentModes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SwapchainPresentModeInfoEXT const & ) const = default;\n#else\n    bool operator==( SwapchainPresentModeInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( swapchainCount == rhs.swapchainCount ) && ( pPresentModes == rhs.pPresentModes );\n#  endif\n    }\n\n    bool operator!=( SwapchainPresentModeInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType          = StructureType::eSwapchainPresentModeInfoEXT;\n    const void *                                 pNext          = {};\n    uint32_t                                     swapchainCount = {};\n    const VULKAN_HPP_NAMESPACE::PresentModeKHR * pPresentModes  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSwapchainPresentModeInfoEXT>\n  {\n    using Type = SwapchainPresentModeInfoEXT;\n  };\n\n  struct SwapchainPresentModesCreateInfoEXT\n  {\n    using NativeType = VkSwapchainPresentModesCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSwapchainPresentModesCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SwapchainPresentModesCreateInfoEXT( uint32_t                                     presentModeCount_ = {},\n                                                             const VULKAN_HPP_NAMESPACE::PresentModeKHR * pPresentModes_    = {},\n                                                             const void *                                 pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , presentModeCount{ presentModeCount_ }\n      , pPresentModes{ pPresentModes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SwapchainPresentModesCreateInfoEXT( SwapchainPresentModesCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SwapchainPresentModesCreateInfoEXT( VkSwapchainPresentModesCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SwapchainPresentModesCreateInfoEXT( *reinterpret_cast<SwapchainPresentModesCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SwapchainPresentModesCreateInfoEXT( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PresentModeKHR> const & presentModes_,\n                                        const void *                                                                                      pNext_ = nullptr )\n      : pNext( pNext_ ), presentModeCount( static_cast<uint32_t>( presentModes_.size() ) ), pPresentModes( presentModes_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    SwapchainPresentModesCreateInfoEXT & operator=( SwapchainPresentModesCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SwapchainPresentModesCreateInfoEXT & operator=( VkSwapchainPresentModesCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SwapchainPresentModesCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SwapchainPresentModesCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainPresentModesCreateInfoEXT & setPresentModeCount( uint32_t presentModeCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      presentModeCount = presentModeCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainPresentModesCreateInfoEXT &\n      setPPresentModes( const VULKAN_HPP_NAMESPACE::PresentModeKHR * pPresentModes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPresentModes = pPresentModes_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    SwapchainPresentModesCreateInfoEXT &\n      setPresentModes( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PresentModeKHR> const & presentModes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      presentModeCount = static_cast<uint32_t>( presentModes_.size() );\n      pPresentModes    = presentModes_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSwapchainPresentModesCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSwapchainPresentModesCreateInfoEXT *>( this );\n    }\n\n    operator VkSwapchainPresentModesCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSwapchainPresentModesCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::PresentModeKHR * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, presentModeCount, pPresentModes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SwapchainPresentModesCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( SwapchainPresentModesCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( presentModeCount == rhs.presentModeCount ) && ( pPresentModes == rhs.pPresentModes );\n#  endif\n    }\n\n    bool operator!=( SwapchainPresentModesCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType            = StructureType::eSwapchainPresentModesCreateInfoEXT;\n    const void *                                 pNext            = {};\n    uint32_t                                     presentModeCount = {};\n    const VULKAN_HPP_NAMESPACE::PresentModeKHR * pPresentModes    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSwapchainPresentModesCreateInfoEXT>\n  {\n    using Type = SwapchainPresentModesCreateInfoEXT;\n  };\n\n  struct SwapchainPresentScalingCreateInfoEXT\n  {\n    using NativeType = VkSwapchainPresentScalingCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eSwapchainPresentScalingCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR SwapchainPresentScalingCreateInfoEXT( VULKAN_HPP_NAMESPACE::PresentScalingFlagsEXT scalingBehavior_ = {},\n                                                               VULKAN_HPP_NAMESPACE::PresentGravityFlagsEXT presentGravityX_ = {},\n                                                               VULKAN_HPP_NAMESPACE::PresentGravityFlagsEXT presentGravityY_ = {},\n                                                               const void *                                 pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , scalingBehavior{ scalingBehavior_ }\n      , presentGravityX{ presentGravityX_ }\n      , presentGravityY{ presentGravityY_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR SwapchainPresentScalingCreateInfoEXT( SwapchainPresentScalingCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    SwapchainPresentScalingCreateInfoEXT( VkSwapchainPresentScalingCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : SwapchainPresentScalingCreateInfoEXT( *reinterpret_cast<SwapchainPresentScalingCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n    SwapchainPresentScalingCreateInfoEXT & operator=( SwapchainPresentScalingCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    SwapchainPresentScalingCreateInfoEXT & operator=( VkSwapchainPresentScalingCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::SwapchainPresentScalingCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 SwapchainPresentScalingCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainPresentScalingCreateInfoEXT &\n      setScalingBehavior( VULKAN_HPP_NAMESPACE::PresentScalingFlagsEXT scalingBehavior_ ) VULKAN_HPP_NOEXCEPT\n    {\n      scalingBehavior = scalingBehavior_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainPresentScalingCreateInfoEXT &\n      setPresentGravityX( VULKAN_HPP_NAMESPACE::PresentGravityFlagsEXT presentGravityX_ ) VULKAN_HPP_NOEXCEPT\n    {\n      presentGravityX = presentGravityX_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 SwapchainPresentScalingCreateInfoEXT &\n      setPresentGravityY( VULKAN_HPP_NAMESPACE::PresentGravityFlagsEXT presentGravityY_ ) VULKAN_HPP_NOEXCEPT\n    {\n      presentGravityY = presentGravityY_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkSwapchainPresentScalingCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkSwapchainPresentScalingCreateInfoEXT *>( this );\n    }\n\n    operator VkSwapchainPresentScalingCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkSwapchainPresentScalingCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::PresentScalingFlagsEXT const &,\n               VULKAN_HPP_NAMESPACE::PresentGravityFlagsEXT const &,\n               VULKAN_HPP_NAMESPACE::PresentGravityFlagsEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, scalingBehavior, presentGravityX, presentGravityY );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( SwapchainPresentScalingCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( SwapchainPresentScalingCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( scalingBehavior == rhs.scalingBehavior ) && ( presentGravityX == rhs.presentGravityX ) &&\n             ( presentGravityY == rhs.presentGravityY );\n#  endif\n    }\n\n    bool operator!=( SwapchainPresentScalingCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType           = StructureType::eSwapchainPresentScalingCreateInfoEXT;\n    const void *                                 pNext           = {};\n    VULKAN_HPP_NAMESPACE::PresentScalingFlagsEXT scalingBehavior = {};\n    VULKAN_HPP_NAMESPACE::PresentGravityFlagsEXT presentGravityX = {};\n    VULKAN_HPP_NAMESPACE::PresentGravityFlagsEXT presentGravityY = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eSwapchainPresentScalingCreateInfoEXT>\n  {\n    using Type = SwapchainPresentScalingCreateInfoEXT;\n  };\n\n  struct TextureLODGatherFormatPropertiesAMD\n  {\n    using NativeType = VkTextureLODGatherFormatPropertiesAMD;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eTextureLodGatherFormatPropertiesAMD;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR TextureLODGatherFormatPropertiesAMD( VULKAN_HPP_NAMESPACE::Bool32 supportsTextureGatherLODBiasAMD_ = {},\n                                                              void *                       pNext_                           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , supportsTextureGatherLODBiasAMD{ supportsTextureGatherLODBiasAMD_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR TextureLODGatherFormatPropertiesAMD( TextureLODGatherFormatPropertiesAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    TextureLODGatherFormatPropertiesAMD( VkTextureLODGatherFormatPropertiesAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n      : TextureLODGatherFormatPropertiesAMD( *reinterpret_cast<TextureLODGatherFormatPropertiesAMD const *>( &rhs ) )\n    {\n    }\n\n    TextureLODGatherFormatPropertiesAMD & operator=( TextureLODGatherFormatPropertiesAMD const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    TextureLODGatherFormatPropertiesAMD & operator=( VkTextureLODGatherFormatPropertiesAMD const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::TextureLODGatherFormatPropertiesAMD const *>( &rhs );\n      return *this;\n    }\n\n    operator VkTextureLODGatherFormatPropertiesAMD const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkTextureLODGatherFormatPropertiesAMD *>( this );\n    }\n\n    operator VkTextureLODGatherFormatPropertiesAMD &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkTextureLODGatherFormatPropertiesAMD *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, supportsTextureGatherLODBiasAMD );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( TextureLODGatherFormatPropertiesAMD const & ) const = default;\n#else\n    bool operator==( TextureLODGatherFormatPropertiesAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( supportsTextureGatherLODBiasAMD == rhs.supportsTextureGatherLODBiasAMD );\n#  endif\n    }\n\n    bool operator!=( TextureLODGatherFormatPropertiesAMD const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                           = StructureType::eTextureLodGatherFormatPropertiesAMD;\n    void *                              pNext                           = {};\n    VULKAN_HPP_NAMESPACE::Bool32        supportsTextureGatherLODBiasAMD = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eTextureLodGatherFormatPropertiesAMD>\n  {\n    using Type = TextureLODGatherFormatPropertiesAMD;\n  };\n\n  struct TilePropertiesQCOM\n  {\n    using NativeType = VkTilePropertiesQCOM;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eTilePropertiesQCOM;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR TilePropertiesQCOM( VULKAN_HPP_NAMESPACE::Extent3D tileSize_  = {},\n                                             VULKAN_HPP_NAMESPACE::Extent2D apronSize_ = {},\n                                             VULKAN_HPP_NAMESPACE::Offset2D origin_    = {},\n                                             void *                         pNext_     = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , tileSize{ tileSize_ }\n      , apronSize{ apronSize_ }\n      , origin{ origin_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR TilePropertiesQCOM( TilePropertiesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    TilePropertiesQCOM( VkTilePropertiesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT : TilePropertiesQCOM( *reinterpret_cast<TilePropertiesQCOM const *>( &rhs ) ) {}\n\n    TilePropertiesQCOM & operator=( TilePropertiesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    TilePropertiesQCOM & operator=( VkTilePropertiesQCOM const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::TilePropertiesQCOM const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 TilePropertiesQCOM & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 TilePropertiesQCOM & setTileSize( VULKAN_HPP_NAMESPACE::Extent3D const & tileSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tileSize = tileSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 TilePropertiesQCOM & setApronSize( VULKAN_HPP_NAMESPACE::Extent2D const & apronSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      apronSize = apronSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 TilePropertiesQCOM & setOrigin( VULKAN_HPP_NAMESPACE::Offset2D const & origin_ ) VULKAN_HPP_NOEXCEPT\n    {\n      origin = origin_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkTilePropertiesQCOM const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkTilePropertiesQCOM *>( this );\n    }\n\n    operator VkTilePropertiesQCOM &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkTilePropertiesQCOM *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Extent3D const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::Offset2D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, tileSize, apronSize, origin );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( TilePropertiesQCOM const & ) const = default;\n#else\n    bool operator==( TilePropertiesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( tileSize == rhs.tileSize ) && ( apronSize == rhs.apronSize ) && ( origin == rhs.origin );\n#  endif\n    }\n\n    bool operator!=( TilePropertiesQCOM const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType     = StructureType::eTilePropertiesQCOM;\n    void *                              pNext     = {};\n    VULKAN_HPP_NAMESPACE::Extent3D      tileSize  = {};\n    VULKAN_HPP_NAMESPACE::Extent2D      apronSize = {};\n    VULKAN_HPP_NAMESPACE::Offset2D      origin    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eTilePropertiesQCOM>\n  {\n    using Type = TilePropertiesQCOM;\n  };\n\n  struct TimelineSemaphoreSubmitInfo\n  {\n    using NativeType = VkTimelineSemaphoreSubmitInfo;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eTimelineSemaphoreSubmitInfo;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR TimelineSemaphoreSubmitInfo( uint32_t         waitSemaphoreValueCount_   = {},\n                                                      const uint64_t * pWaitSemaphoreValues_      = {},\n                                                      uint32_t         signalSemaphoreValueCount_ = {},\n                                                      const uint64_t * pSignalSemaphoreValues_    = {},\n                                                      const void *     pNext_                     = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , waitSemaphoreValueCount{ waitSemaphoreValueCount_ }\n      , pWaitSemaphoreValues{ pWaitSemaphoreValues_ }\n      , signalSemaphoreValueCount{ signalSemaphoreValueCount_ }\n      , pSignalSemaphoreValues{ pSignalSemaphoreValues_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR TimelineSemaphoreSubmitInfo( TimelineSemaphoreSubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    TimelineSemaphoreSubmitInfo( VkTimelineSemaphoreSubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n      : TimelineSemaphoreSubmitInfo( *reinterpret_cast<TimelineSemaphoreSubmitInfo const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    TimelineSemaphoreSubmitInfo( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & waitSemaphoreValues_,\n                                 VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & signalSemaphoreValues_ = {},\n                                 const void *                                                          pNext_                 = nullptr )\n      : pNext( pNext_ )\n      , waitSemaphoreValueCount( static_cast<uint32_t>( waitSemaphoreValues_.size() ) )\n      , pWaitSemaphoreValues( waitSemaphoreValues_.data() )\n      , signalSemaphoreValueCount( static_cast<uint32_t>( signalSemaphoreValues_.size() ) )\n      , pSignalSemaphoreValues( signalSemaphoreValues_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    TimelineSemaphoreSubmitInfo & operator=( TimelineSemaphoreSubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    TimelineSemaphoreSubmitInfo & operator=( VkTimelineSemaphoreSubmitInfo const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::TimelineSemaphoreSubmitInfo const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 TimelineSemaphoreSubmitInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 TimelineSemaphoreSubmitInfo & setWaitSemaphoreValueCount( uint32_t waitSemaphoreValueCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      waitSemaphoreValueCount = waitSemaphoreValueCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 TimelineSemaphoreSubmitInfo & setPWaitSemaphoreValues( const uint64_t * pWaitSemaphoreValues_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pWaitSemaphoreValues = pWaitSemaphoreValues_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    TimelineSemaphoreSubmitInfo &\n      setWaitSemaphoreValues( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & waitSemaphoreValues_ ) VULKAN_HPP_NOEXCEPT\n    {\n      waitSemaphoreValueCount = static_cast<uint32_t>( waitSemaphoreValues_.size() );\n      pWaitSemaphoreValues    = waitSemaphoreValues_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 TimelineSemaphoreSubmitInfo & setSignalSemaphoreValueCount( uint32_t signalSemaphoreValueCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      signalSemaphoreValueCount = signalSemaphoreValueCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 TimelineSemaphoreSubmitInfo & setPSignalSemaphoreValues( const uint64_t * pSignalSemaphoreValues_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSignalSemaphoreValues = pSignalSemaphoreValues_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    TimelineSemaphoreSubmitInfo &\n      setSignalSemaphoreValues( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & signalSemaphoreValues_ ) VULKAN_HPP_NOEXCEPT\n    {\n      signalSemaphoreValueCount = static_cast<uint32_t>( signalSemaphoreValues_.size() );\n      pSignalSemaphoreValues    = signalSemaphoreValues_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkTimelineSemaphoreSubmitInfo const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkTimelineSemaphoreSubmitInfo *>( this );\n    }\n\n    operator VkTimelineSemaphoreSubmitInfo &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkTimelineSemaphoreSubmitInfo *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const uint64_t * const &,\n               uint32_t const &,\n               const uint64_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, waitSemaphoreValueCount, pWaitSemaphoreValues, signalSemaphoreValueCount, pSignalSemaphoreValues );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( TimelineSemaphoreSubmitInfo const & ) const = default;\n#else\n    bool operator==( TimelineSemaphoreSubmitInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( waitSemaphoreValueCount == rhs.waitSemaphoreValueCount ) &&\n             ( pWaitSemaphoreValues == rhs.pWaitSemaphoreValues ) && ( signalSemaphoreValueCount == rhs.signalSemaphoreValueCount ) &&\n             ( pSignalSemaphoreValues == rhs.pSignalSemaphoreValues );\n#  endif\n    }\n\n    bool operator!=( TimelineSemaphoreSubmitInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                     = StructureType::eTimelineSemaphoreSubmitInfo;\n    const void *                        pNext                     = {};\n    uint32_t                            waitSemaphoreValueCount   = {};\n    const uint64_t *                    pWaitSemaphoreValues      = {};\n    uint32_t                            signalSemaphoreValueCount = {};\n    const uint64_t *                    pSignalSemaphoreValues    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eTimelineSemaphoreSubmitInfo>\n  {\n    using Type = TimelineSemaphoreSubmitInfo;\n  };\n\n  using TimelineSemaphoreSubmitInfoKHR = TimelineSemaphoreSubmitInfo;\n\n  struct TraceRaysIndirectCommand2KHR\n  {\n    using NativeType = VkTraceRaysIndirectCommand2KHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR TraceRaysIndirectCommand2KHR( VULKAN_HPP_NAMESPACE::DeviceAddress raygenShaderRecordAddress_         = {},\n                                                       VULKAN_HPP_NAMESPACE::DeviceSize    raygenShaderRecordSize_            = {},\n                                                       VULKAN_HPP_NAMESPACE::DeviceAddress missShaderBindingTableAddress_     = {},\n                                                       VULKAN_HPP_NAMESPACE::DeviceSize    missShaderBindingTableSize_        = {},\n                                                       VULKAN_HPP_NAMESPACE::DeviceSize    missShaderBindingTableStride_      = {},\n                                                       VULKAN_HPP_NAMESPACE::DeviceAddress hitShaderBindingTableAddress_      = {},\n                                                       VULKAN_HPP_NAMESPACE::DeviceSize    hitShaderBindingTableSize_         = {},\n                                                       VULKAN_HPP_NAMESPACE::DeviceSize    hitShaderBindingTableStride_       = {},\n                                                       VULKAN_HPP_NAMESPACE::DeviceAddress callableShaderBindingTableAddress_ = {},\n                                                       VULKAN_HPP_NAMESPACE::DeviceSize    callableShaderBindingTableSize_    = {},\n                                                       VULKAN_HPP_NAMESPACE::DeviceSize    callableShaderBindingTableStride_  = {},\n                                                       uint32_t                            width_                             = {},\n                                                       uint32_t                            height_                            = {},\n                                                       uint32_t                            depth_                             = {} ) VULKAN_HPP_NOEXCEPT\n      : raygenShaderRecordAddress{ raygenShaderRecordAddress_ }\n      , raygenShaderRecordSize{ raygenShaderRecordSize_ }\n      , missShaderBindingTableAddress{ missShaderBindingTableAddress_ }\n      , missShaderBindingTableSize{ missShaderBindingTableSize_ }\n      , missShaderBindingTableStride{ missShaderBindingTableStride_ }\n      , hitShaderBindingTableAddress{ hitShaderBindingTableAddress_ }\n      , hitShaderBindingTableSize{ hitShaderBindingTableSize_ }\n      , hitShaderBindingTableStride{ hitShaderBindingTableStride_ }\n      , callableShaderBindingTableAddress{ callableShaderBindingTableAddress_ }\n      , callableShaderBindingTableSize{ callableShaderBindingTableSize_ }\n      , callableShaderBindingTableStride{ callableShaderBindingTableStride_ }\n      , width{ width_ }\n      , height{ height_ }\n      , depth{ depth_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR TraceRaysIndirectCommand2KHR( TraceRaysIndirectCommand2KHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    TraceRaysIndirectCommand2KHR( VkTraceRaysIndirectCommand2KHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : TraceRaysIndirectCommand2KHR( *reinterpret_cast<TraceRaysIndirectCommand2KHR const *>( &rhs ) )\n    {\n    }\n\n    TraceRaysIndirectCommand2KHR & operator=( TraceRaysIndirectCommand2KHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    TraceRaysIndirectCommand2KHR & operator=( VkTraceRaysIndirectCommand2KHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::TraceRaysIndirectCommand2KHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 TraceRaysIndirectCommand2KHR &\n      setRaygenShaderRecordAddress( VULKAN_HPP_NAMESPACE::DeviceAddress raygenShaderRecordAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      raygenShaderRecordAddress = raygenShaderRecordAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 TraceRaysIndirectCommand2KHR &\n      setRaygenShaderRecordSize( VULKAN_HPP_NAMESPACE::DeviceSize raygenShaderRecordSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      raygenShaderRecordSize = raygenShaderRecordSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 TraceRaysIndirectCommand2KHR &\n      setMissShaderBindingTableAddress( VULKAN_HPP_NAMESPACE::DeviceAddress missShaderBindingTableAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      missShaderBindingTableAddress = missShaderBindingTableAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 TraceRaysIndirectCommand2KHR &\n      setMissShaderBindingTableSize( VULKAN_HPP_NAMESPACE::DeviceSize missShaderBindingTableSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      missShaderBindingTableSize = missShaderBindingTableSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 TraceRaysIndirectCommand2KHR &\n      setMissShaderBindingTableStride( VULKAN_HPP_NAMESPACE::DeviceSize missShaderBindingTableStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      missShaderBindingTableStride = missShaderBindingTableStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 TraceRaysIndirectCommand2KHR &\n      setHitShaderBindingTableAddress( VULKAN_HPP_NAMESPACE::DeviceAddress hitShaderBindingTableAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      hitShaderBindingTableAddress = hitShaderBindingTableAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 TraceRaysIndirectCommand2KHR &\n      setHitShaderBindingTableSize( VULKAN_HPP_NAMESPACE::DeviceSize hitShaderBindingTableSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      hitShaderBindingTableSize = hitShaderBindingTableSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 TraceRaysIndirectCommand2KHR &\n      setHitShaderBindingTableStride( VULKAN_HPP_NAMESPACE::DeviceSize hitShaderBindingTableStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      hitShaderBindingTableStride = hitShaderBindingTableStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 TraceRaysIndirectCommand2KHR &\n      setCallableShaderBindingTableAddress( VULKAN_HPP_NAMESPACE::DeviceAddress callableShaderBindingTableAddress_ ) VULKAN_HPP_NOEXCEPT\n    {\n      callableShaderBindingTableAddress = callableShaderBindingTableAddress_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 TraceRaysIndirectCommand2KHR &\n      setCallableShaderBindingTableSize( VULKAN_HPP_NAMESPACE::DeviceSize callableShaderBindingTableSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      callableShaderBindingTableSize = callableShaderBindingTableSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 TraceRaysIndirectCommand2KHR &\n      setCallableShaderBindingTableStride( VULKAN_HPP_NAMESPACE::DeviceSize callableShaderBindingTableStride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      callableShaderBindingTableStride = callableShaderBindingTableStride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 TraceRaysIndirectCommand2KHR & setWidth( uint32_t width_ ) VULKAN_HPP_NOEXCEPT\n    {\n      width = width_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 TraceRaysIndirectCommand2KHR & setHeight( uint32_t height_ ) VULKAN_HPP_NOEXCEPT\n    {\n      height = height_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 TraceRaysIndirectCommand2KHR & setDepth( uint32_t depth_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depth = depth_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkTraceRaysIndirectCommand2KHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkTraceRaysIndirectCommand2KHR *>( this );\n    }\n\n    operator VkTraceRaysIndirectCommand2KHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkTraceRaysIndirectCommand2KHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceAddress const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( raygenShaderRecordAddress,\n                       raygenShaderRecordSize,\n                       missShaderBindingTableAddress,\n                       missShaderBindingTableSize,\n                       missShaderBindingTableStride,\n                       hitShaderBindingTableAddress,\n                       hitShaderBindingTableSize,\n                       hitShaderBindingTableStride,\n                       callableShaderBindingTableAddress,\n                       callableShaderBindingTableSize,\n                       callableShaderBindingTableStride,\n                       width,\n                       height,\n                       depth );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( TraceRaysIndirectCommand2KHR const & ) const = default;\n#else\n    bool operator==( TraceRaysIndirectCommand2KHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( raygenShaderRecordAddress == rhs.raygenShaderRecordAddress ) && ( raygenShaderRecordSize == rhs.raygenShaderRecordSize ) &&\n             ( missShaderBindingTableAddress == rhs.missShaderBindingTableAddress ) && ( missShaderBindingTableSize == rhs.missShaderBindingTableSize ) &&\n             ( missShaderBindingTableStride == rhs.missShaderBindingTableStride ) && ( hitShaderBindingTableAddress == rhs.hitShaderBindingTableAddress ) &&\n             ( hitShaderBindingTableSize == rhs.hitShaderBindingTableSize ) && ( hitShaderBindingTableStride == rhs.hitShaderBindingTableStride ) &&\n             ( callableShaderBindingTableAddress == rhs.callableShaderBindingTableAddress ) &&\n             ( callableShaderBindingTableSize == rhs.callableShaderBindingTableSize ) &&\n             ( callableShaderBindingTableStride == rhs.callableShaderBindingTableStride ) && ( width == rhs.width ) && ( height == rhs.height ) &&\n             ( depth == rhs.depth );\n#  endif\n    }\n\n    bool operator!=( TraceRaysIndirectCommand2KHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::DeviceAddress raygenShaderRecordAddress         = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    raygenShaderRecordSize            = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress missShaderBindingTableAddress     = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    missShaderBindingTableSize        = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    missShaderBindingTableStride      = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress hitShaderBindingTableAddress      = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    hitShaderBindingTableSize         = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    hitShaderBindingTableStride       = {};\n    VULKAN_HPP_NAMESPACE::DeviceAddress callableShaderBindingTableAddress = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    callableShaderBindingTableSize    = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize    callableShaderBindingTableStride  = {};\n    uint32_t                            width                             = {};\n    uint32_t                            height                            = {};\n    uint32_t                            depth                             = {};\n  };\n\n  struct TraceRaysIndirectCommandKHR\n  {\n    using NativeType = VkTraceRaysIndirectCommandKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR TraceRaysIndirectCommandKHR( uint32_t width_ = {}, uint32_t height_ = {}, uint32_t depth_ = {} ) VULKAN_HPP_NOEXCEPT\n      : width{ width_ }\n      , height{ height_ }\n      , depth{ depth_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR TraceRaysIndirectCommandKHR( TraceRaysIndirectCommandKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    TraceRaysIndirectCommandKHR( VkTraceRaysIndirectCommandKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : TraceRaysIndirectCommandKHR( *reinterpret_cast<TraceRaysIndirectCommandKHR const *>( &rhs ) )\n    {\n    }\n\n    explicit TraceRaysIndirectCommandKHR( Extent2D const & extent2D, uint32_t depth_ = {} )\n      : width( extent2D.width ), height( extent2D.height ), depth( depth_ )\n    {\n    }\n\n    TraceRaysIndirectCommandKHR & operator=( TraceRaysIndirectCommandKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    TraceRaysIndirectCommandKHR & operator=( VkTraceRaysIndirectCommandKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::TraceRaysIndirectCommandKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 TraceRaysIndirectCommandKHR & setWidth( uint32_t width_ ) VULKAN_HPP_NOEXCEPT\n    {\n      width = width_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 TraceRaysIndirectCommandKHR & setHeight( uint32_t height_ ) VULKAN_HPP_NOEXCEPT\n    {\n      height = height_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 TraceRaysIndirectCommandKHR & setDepth( uint32_t depth_ ) VULKAN_HPP_NOEXCEPT\n    {\n      depth = depth_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkTraceRaysIndirectCommandKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkTraceRaysIndirectCommandKHR *>( this );\n    }\n\n    operator VkTraceRaysIndirectCommandKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkTraceRaysIndirectCommandKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( width, height, depth );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( TraceRaysIndirectCommandKHR const & ) const = default;\n#else\n    bool operator==( TraceRaysIndirectCommandKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( width == rhs.width ) && ( height == rhs.height ) && ( depth == rhs.depth );\n#  endif\n    }\n\n    bool operator!=( TraceRaysIndirectCommandKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t width  = {};\n    uint32_t height = {};\n    uint32_t depth  = {};\n  };\n\n  struct ValidationCacheCreateInfoEXT\n  {\n    using NativeType = VkValidationCacheCreateInfoEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eValidationCacheCreateInfoEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ValidationCacheCreateInfoEXT( VULKAN_HPP_NAMESPACE::ValidationCacheCreateFlagsEXT flags_           = {},\n                                                       size_t                                              initialDataSize_ = {},\n                                                       const void *                                        pInitialData_    = {},\n                                                       const void *                                        pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , initialDataSize{ initialDataSize_ }\n      , pInitialData{ pInitialData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ValidationCacheCreateInfoEXT( ValidationCacheCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ValidationCacheCreateInfoEXT( VkValidationCacheCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ValidationCacheCreateInfoEXT( *reinterpret_cast<ValidationCacheCreateInfoEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    ValidationCacheCreateInfoEXT( VULKAN_HPP_NAMESPACE::ValidationCacheCreateFlagsEXT            flags_,\n                                  VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & initialData_,\n                                  const void *                                                   pNext_ = nullptr )\n      : pNext( pNext_ ), flags( flags_ ), initialDataSize( initialData_.size() * sizeof( T ) ), pInitialData( initialData_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    ValidationCacheCreateInfoEXT & operator=( ValidationCacheCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ValidationCacheCreateInfoEXT & operator=( VkValidationCacheCreateInfoEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ValidationCacheCreateInfoEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ValidationCacheCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ValidationCacheCreateInfoEXT & setFlags( VULKAN_HPP_NAMESPACE::ValidationCacheCreateFlagsEXT flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ValidationCacheCreateInfoEXT & setInitialDataSize( size_t initialDataSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      initialDataSize = initialDataSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ValidationCacheCreateInfoEXT & setPInitialData( const void * pInitialData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pInitialData = pInitialData_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    ValidationCacheCreateInfoEXT & setInitialData( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & initialData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      initialDataSize = initialData_.size() * sizeof( T );\n      pInitialData    = initialData_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkValidationCacheCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkValidationCacheCreateInfoEXT *>( this );\n    }\n\n    operator VkValidationCacheCreateInfoEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkValidationCacheCreateInfoEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::ValidationCacheCreateFlagsEXT const &,\n               size_t const &,\n               const void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, initialDataSize, pInitialData );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ValidationCacheCreateInfoEXT const & ) const = default;\n#else\n    bool operator==( ValidationCacheCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( initialDataSize == rhs.initialDataSize ) &&\n             ( pInitialData == rhs.pInitialData );\n#  endif\n    }\n\n    bool operator!=( ValidationCacheCreateInfoEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                 sType           = StructureType::eValidationCacheCreateInfoEXT;\n    const void *                                        pNext           = {};\n    VULKAN_HPP_NAMESPACE::ValidationCacheCreateFlagsEXT flags           = {};\n    size_t                                              initialDataSize = {};\n    const void *                                        pInitialData    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eValidationCacheCreateInfoEXT>\n  {\n    using Type = ValidationCacheCreateInfoEXT;\n  };\n\n  struct ValidationFeaturesEXT\n  {\n    using NativeType = VkValidationFeaturesEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eValidationFeaturesEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ValidationFeaturesEXT( uint32_t                                                  enabledValidationFeatureCount_  = {},\n                                                const VULKAN_HPP_NAMESPACE::ValidationFeatureEnableEXT *  pEnabledValidationFeatures_     = {},\n                                                uint32_t                                                  disabledValidationFeatureCount_ = {},\n                                                const VULKAN_HPP_NAMESPACE::ValidationFeatureDisableEXT * pDisabledValidationFeatures_    = {},\n                                                const void *                                              pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , enabledValidationFeatureCount{ enabledValidationFeatureCount_ }\n      , pEnabledValidationFeatures{ pEnabledValidationFeatures_ }\n      , disabledValidationFeatureCount{ disabledValidationFeatureCount_ }\n      , pDisabledValidationFeatures{ pDisabledValidationFeatures_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ValidationFeaturesEXT( ValidationFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ValidationFeaturesEXT( VkValidationFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ValidationFeaturesEXT( *reinterpret_cast<ValidationFeaturesEXT const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ValidationFeaturesEXT(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ValidationFeatureEnableEXT> const &  enabledValidationFeatures_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ValidationFeatureDisableEXT> const & disabledValidationFeatures_ = {},\n      const void *                                                                                                   pNext_                      = nullptr )\n      : pNext( pNext_ )\n      , enabledValidationFeatureCount( static_cast<uint32_t>( enabledValidationFeatures_.size() ) )\n      , pEnabledValidationFeatures( enabledValidationFeatures_.data() )\n      , disabledValidationFeatureCount( static_cast<uint32_t>( disabledValidationFeatures_.size() ) )\n      , pDisabledValidationFeatures( disabledValidationFeatures_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    ValidationFeaturesEXT & operator=( ValidationFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ValidationFeaturesEXT & operator=( VkValidationFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ValidationFeaturesEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ValidationFeaturesEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ValidationFeaturesEXT & setEnabledValidationFeatureCount( uint32_t enabledValidationFeatureCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      enabledValidationFeatureCount = enabledValidationFeatureCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ValidationFeaturesEXT &\n      setPEnabledValidationFeatures( const VULKAN_HPP_NAMESPACE::ValidationFeatureEnableEXT * pEnabledValidationFeatures_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pEnabledValidationFeatures = pEnabledValidationFeatures_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ValidationFeaturesEXT & setEnabledValidationFeatures(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ValidationFeatureEnableEXT> const & enabledValidationFeatures_ )\n      VULKAN_HPP_NOEXCEPT\n    {\n      enabledValidationFeatureCount = static_cast<uint32_t>( enabledValidationFeatures_.size() );\n      pEnabledValidationFeatures    = enabledValidationFeatures_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 ValidationFeaturesEXT & setDisabledValidationFeatureCount( uint32_t disabledValidationFeatureCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      disabledValidationFeatureCount = disabledValidationFeatureCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ValidationFeaturesEXT &\n      setPDisabledValidationFeatures( const VULKAN_HPP_NAMESPACE::ValidationFeatureDisableEXT * pDisabledValidationFeatures_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDisabledValidationFeatures = pDisabledValidationFeatures_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ValidationFeaturesEXT & setDisabledValidationFeatures(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ValidationFeatureDisableEXT> const & disabledValidationFeatures_ )\n      VULKAN_HPP_NOEXCEPT\n    {\n      disabledValidationFeatureCount = static_cast<uint32_t>( disabledValidationFeatures_.size() );\n      pDisabledValidationFeatures    = disabledValidationFeatures_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkValidationFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkValidationFeaturesEXT *>( this );\n    }\n\n    operator VkValidationFeaturesEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkValidationFeaturesEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::ValidationFeatureEnableEXT * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::ValidationFeatureDisableEXT * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, enabledValidationFeatureCount, pEnabledValidationFeatures, disabledValidationFeatureCount, pDisabledValidationFeatures );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ValidationFeaturesEXT const & ) const = default;\n#else\n    bool operator==( ValidationFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( enabledValidationFeatureCount == rhs.enabledValidationFeatureCount ) &&\n             ( pEnabledValidationFeatures == rhs.pEnabledValidationFeatures ) && ( disabledValidationFeatureCount == rhs.disabledValidationFeatureCount ) &&\n             ( pDisabledValidationFeatures == rhs.pDisabledValidationFeatures );\n#  endif\n    }\n\n    bool operator!=( ValidationFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                       sType                          = StructureType::eValidationFeaturesEXT;\n    const void *                                              pNext                          = {};\n    uint32_t                                                  enabledValidationFeatureCount  = {};\n    const VULKAN_HPP_NAMESPACE::ValidationFeatureEnableEXT *  pEnabledValidationFeatures     = {};\n    uint32_t                                                  disabledValidationFeatureCount = {};\n    const VULKAN_HPP_NAMESPACE::ValidationFeatureDisableEXT * pDisabledValidationFeatures    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eValidationFeaturesEXT>\n  {\n    using Type = ValidationFeaturesEXT;\n  };\n\n  struct ValidationFlagsEXT\n  {\n    using NativeType = VkValidationFlagsEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eValidationFlagsEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR ValidationFlagsEXT( uint32_t                                         disabledValidationCheckCount_ = {},\n                                             const VULKAN_HPP_NAMESPACE::ValidationCheckEXT * pDisabledValidationChecks_    = {},\n                                             const void *                                     pNext_                        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , disabledValidationCheckCount{ disabledValidationCheckCount_ }\n      , pDisabledValidationChecks{ pDisabledValidationChecks_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ValidationFlagsEXT( ValidationFlagsEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ValidationFlagsEXT( VkValidationFlagsEXT const & rhs ) VULKAN_HPP_NOEXCEPT : ValidationFlagsEXT( *reinterpret_cast<ValidationFlagsEXT const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ValidationFlagsEXT( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ValidationCheckEXT> const & disabledValidationChecks_,\n                        const void *                                                                                          pNext_ = nullptr )\n      : pNext( pNext_ )\n      , disabledValidationCheckCount( static_cast<uint32_t>( disabledValidationChecks_.size() ) )\n      , pDisabledValidationChecks( disabledValidationChecks_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    ValidationFlagsEXT & operator=( ValidationFlagsEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ValidationFlagsEXT & operator=( VkValidationFlagsEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ValidationFlagsEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ValidationFlagsEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ValidationFlagsEXT & setDisabledValidationCheckCount( uint32_t disabledValidationCheckCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      disabledValidationCheckCount = disabledValidationCheckCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ValidationFlagsEXT &\n      setPDisabledValidationChecks( const VULKAN_HPP_NAMESPACE::ValidationCheckEXT * pDisabledValidationChecks_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pDisabledValidationChecks = pDisabledValidationChecks_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    ValidationFlagsEXT & setDisabledValidationChecks(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ValidationCheckEXT> const & disabledValidationChecks_ ) VULKAN_HPP_NOEXCEPT\n    {\n      disabledValidationCheckCount = static_cast<uint32_t>( disabledValidationChecks_.size() );\n      pDisabledValidationChecks    = disabledValidationChecks_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkValidationFlagsEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkValidationFlagsEXT *>( this );\n    }\n\n    operator VkValidationFlagsEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkValidationFlagsEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::ValidationCheckEXT * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, disabledValidationCheckCount, pDisabledValidationChecks );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ValidationFlagsEXT const & ) const = default;\n#else\n    bool operator==( ValidationFlagsEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( disabledValidationCheckCount == rhs.disabledValidationCheckCount ) &&\n             ( pDisabledValidationChecks == rhs.pDisabledValidationChecks );\n#  endif\n    }\n\n    bool operator!=( ValidationFlagsEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType              sType                        = StructureType::eValidationFlagsEXT;\n    const void *                                     pNext                        = {};\n    uint32_t                                         disabledValidationCheckCount = {};\n    const VULKAN_HPP_NAMESPACE::ValidationCheckEXT * pDisabledValidationChecks    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eValidationFlagsEXT>\n  {\n    using Type = ValidationFlagsEXT;\n  };\n\n  struct VertexInputAttributeDescription2EXT\n  {\n    using NativeType = VkVertexInputAttributeDescription2EXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVertexInputAttributeDescription2EXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VertexInputAttributeDescription2EXT( uint32_t                     location_ = {},\n                                                              uint32_t                     binding_  = {},\n                                                              VULKAN_HPP_NAMESPACE::Format format_   = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                                              uint32_t                     offset_   = {},\n                                                              void *                       pNext_    = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , location{ location_ }\n      , binding{ binding_ }\n      , format{ format_ }\n      , offset{ offset_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VertexInputAttributeDescription2EXT( VertexInputAttributeDescription2EXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VertexInputAttributeDescription2EXT( VkVertexInputAttributeDescription2EXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VertexInputAttributeDescription2EXT( *reinterpret_cast<VertexInputAttributeDescription2EXT const *>( &rhs ) )\n    {\n    }\n\n    VertexInputAttributeDescription2EXT & operator=( VertexInputAttributeDescription2EXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VertexInputAttributeDescription2EXT & operator=( VkVertexInputAttributeDescription2EXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription2EXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VertexInputAttributeDescription2EXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VertexInputAttributeDescription2EXT & setLocation( uint32_t location_ ) VULKAN_HPP_NOEXCEPT\n    {\n      location = location_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VertexInputAttributeDescription2EXT & setBinding( uint32_t binding_ ) VULKAN_HPP_NOEXCEPT\n    {\n      binding = binding_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VertexInputAttributeDescription2EXT & setFormat( VULKAN_HPP_NAMESPACE::Format format_ ) VULKAN_HPP_NOEXCEPT\n    {\n      format = format_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VertexInputAttributeDescription2EXT & setOffset( uint32_t offset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      offset = offset_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVertexInputAttributeDescription2EXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVertexInputAttributeDescription2EXT *>( this );\n    }\n\n    operator VkVertexInputAttributeDescription2EXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVertexInputAttributeDescription2EXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, location, binding, format, offset );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VertexInputAttributeDescription2EXT const & ) const = default;\n#else\n    bool operator==( VertexInputAttributeDescription2EXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( location == rhs.location ) && ( binding == rhs.binding ) && ( format == rhs.format ) &&\n             ( offset == rhs.offset );\n#  endif\n    }\n\n    bool operator!=( VertexInputAttributeDescription2EXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType    = StructureType::eVertexInputAttributeDescription2EXT;\n    void *                              pNext    = {};\n    uint32_t                            location = {};\n    uint32_t                            binding  = {};\n    VULKAN_HPP_NAMESPACE::Format        format   = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    uint32_t                            offset   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVertexInputAttributeDescription2EXT>\n  {\n    using Type = VertexInputAttributeDescription2EXT;\n  };\n\n  struct VertexInputBindingDescription2EXT\n  {\n    using NativeType = VkVertexInputBindingDescription2EXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVertexInputBindingDescription2EXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VertexInputBindingDescription2EXT( uint32_t                              binding_   = {},\n                                                            uint32_t                              stride_    = {},\n                                                            VULKAN_HPP_NAMESPACE::VertexInputRate inputRate_ = VULKAN_HPP_NAMESPACE::VertexInputRate::eVertex,\n                                                            uint32_t                              divisor_   = {},\n                                                            void *                                pNext_     = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , binding{ binding_ }\n      , stride{ stride_ }\n      , inputRate{ inputRate_ }\n      , divisor{ divisor_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VertexInputBindingDescription2EXT( VertexInputBindingDescription2EXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VertexInputBindingDescription2EXT( VkVertexInputBindingDescription2EXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VertexInputBindingDescription2EXT( *reinterpret_cast<VertexInputBindingDescription2EXT const *>( &rhs ) )\n    {\n    }\n\n    VertexInputBindingDescription2EXT & operator=( VertexInputBindingDescription2EXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VertexInputBindingDescription2EXT & operator=( VkVertexInputBindingDescription2EXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VertexInputBindingDescription2EXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VertexInputBindingDescription2EXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VertexInputBindingDescription2EXT & setBinding( uint32_t binding_ ) VULKAN_HPP_NOEXCEPT\n    {\n      binding = binding_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VertexInputBindingDescription2EXT & setStride( uint32_t stride_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stride = stride_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VertexInputBindingDescription2EXT & setInputRate( VULKAN_HPP_NAMESPACE::VertexInputRate inputRate_ ) VULKAN_HPP_NOEXCEPT\n    {\n      inputRate = inputRate_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VertexInputBindingDescription2EXT & setDivisor( uint32_t divisor_ ) VULKAN_HPP_NOEXCEPT\n    {\n      divisor = divisor_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVertexInputBindingDescription2EXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVertexInputBindingDescription2EXT *>( this );\n    }\n\n    operator VkVertexInputBindingDescription2EXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVertexInputBindingDescription2EXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::VertexInputRate const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, binding, stride, inputRate, divisor );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VertexInputBindingDescription2EXT const & ) const = default;\n#else\n    bool operator==( VertexInputBindingDescription2EXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( binding == rhs.binding ) && ( stride == rhs.stride ) && ( inputRate == rhs.inputRate ) &&\n             ( divisor == rhs.divisor );\n#  endif\n    }\n\n    bool operator!=( VertexInputBindingDescription2EXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType   sType     = StructureType::eVertexInputBindingDescription2EXT;\n    void *                                pNext     = {};\n    uint32_t                              binding   = {};\n    uint32_t                              stride    = {};\n    VULKAN_HPP_NAMESPACE::VertexInputRate inputRate = VULKAN_HPP_NAMESPACE::VertexInputRate::eVertex;\n    uint32_t                              divisor   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVertexInputBindingDescription2EXT>\n  {\n    using Type = VertexInputBindingDescription2EXT;\n  };\n\n#if defined( VK_USE_PLATFORM_VI_NN )\n  struct ViSurfaceCreateInfoNN\n  {\n    using NativeType = VkViSurfaceCreateInfoNN;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eViSurfaceCreateInfoNN;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      ViSurfaceCreateInfoNN( VULKAN_HPP_NAMESPACE::ViSurfaceCreateFlagsNN flags_ = {}, void * window_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , window{ window_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR ViSurfaceCreateInfoNN( ViSurfaceCreateInfoNN const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    ViSurfaceCreateInfoNN( VkViSurfaceCreateInfoNN const & rhs ) VULKAN_HPP_NOEXCEPT\n      : ViSurfaceCreateInfoNN( *reinterpret_cast<ViSurfaceCreateInfoNN const *>( &rhs ) )\n    {\n    }\n\n    ViSurfaceCreateInfoNN & operator=( ViSurfaceCreateInfoNN const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    ViSurfaceCreateInfoNN & operator=( VkViSurfaceCreateInfoNN const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::ViSurfaceCreateInfoNN const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 ViSurfaceCreateInfoNN & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ViSurfaceCreateInfoNN & setFlags( VULKAN_HPP_NAMESPACE::ViSurfaceCreateFlagsNN flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 ViSurfaceCreateInfoNN & setWindow( void * window_ ) VULKAN_HPP_NOEXCEPT\n    {\n      window = window_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkViSurfaceCreateInfoNN const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkViSurfaceCreateInfoNN *>( this );\n    }\n\n    operator VkViSurfaceCreateInfoNN &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkViSurfaceCreateInfoNN *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ViSurfaceCreateFlagsNN const &, void * const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, window );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( ViSurfaceCreateInfoNN const & ) const = default;\n#  else\n    bool operator==( ViSurfaceCreateInfoNN const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( window == rhs.window );\n#    endif\n    }\n\n    bool operator!=( ViSurfaceCreateInfoNN const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType  = StructureType::eViSurfaceCreateInfoNN;\n    const void *                                 pNext  = {};\n    VULKAN_HPP_NAMESPACE::ViSurfaceCreateFlagsNN flags  = {};\n    void *                                       window = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eViSurfaceCreateInfoNN>\n  {\n    using Type = ViSurfaceCreateInfoNN;\n  };\n#endif /*VK_USE_PLATFORM_VI_NN*/\n\n  struct VideoPictureResourceInfoKHR\n  {\n    using NativeType = VkVideoPictureResourceInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoPictureResourceInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoPictureResourceInfoKHR( VULKAN_HPP_NAMESPACE::Offset2D  codedOffset_      = {},\n                                                      VULKAN_HPP_NAMESPACE::Extent2D  codedExtent_      = {},\n                                                      uint32_t                        baseArrayLayer_   = {},\n                                                      VULKAN_HPP_NAMESPACE::ImageView imageViewBinding_ = {},\n                                                      const void *                    pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , codedOffset{ codedOffset_ }\n      , codedExtent{ codedExtent_ }\n      , baseArrayLayer{ baseArrayLayer_ }\n      , imageViewBinding{ imageViewBinding_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoPictureResourceInfoKHR( VideoPictureResourceInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoPictureResourceInfoKHR( VkVideoPictureResourceInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoPictureResourceInfoKHR( *reinterpret_cast<VideoPictureResourceInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoPictureResourceInfoKHR & operator=( VideoPictureResourceInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoPictureResourceInfoKHR & operator=( VkVideoPictureResourceInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoPictureResourceInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoPictureResourceInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoPictureResourceInfoKHR & setCodedOffset( VULKAN_HPP_NAMESPACE::Offset2D const & codedOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      codedOffset = codedOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoPictureResourceInfoKHR & setCodedExtent( VULKAN_HPP_NAMESPACE::Extent2D const & codedExtent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      codedExtent = codedExtent_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoPictureResourceInfoKHR & setBaseArrayLayer( uint32_t baseArrayLayer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      baseArrayLayer = baseArrayLayer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoPictureResourceInfoKHR & setImageViewBinding( VULKAN_HPP_NAMESPACE::ImageView imageViewBinding_ ) VULKAN_HPP_NOEXCEPT\n    {\n      imageViewBinding = imageViewBinding_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoPictureResourceInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoPictureResourceInfoKHR *>( this );\n    }\n\n    operator VkVideoPictureResourceInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoPictureResourceInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Offset2D const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ImageView const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, codedOffset, codedExtent, baseArrayLayer, imageViewBinding );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoPictureResourceInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoPictureResourceInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( codedOffset == rhs.codedOffset ) && ( codedExtent == rhs.codedExtent ) &&\n             ( baseArrayLayer == rhs.baseArrayLayer ) && ( imageViewBinding == rhs.imageViewBinding );\n#  endif\n    }\n\n    bool operator!=( VideoPictureResourceInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType            = StructureType::eVideoPictureResourceInfoKHR;\n    const void *                        pNext            = {};\n    VULKAN_HPP_NAMESPACE::Offset2D      codedOffset      = {};\n    VULKAN_HPP_NAMESPACE::Extent2D      codedExtent      = {};\n    uint32_t                            baseArrayLayer   = {};\n    VULKAN_HPP_NAMESPACE::ImageView     imageViewBinding = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoPictureResourceInfoKHR>\n  {\n    using Type = VideoPictureResourceInfoKHR;\n  };\n\n  struct VideoReferenceSlotInfoKHR\n  {\n    using NativeType = VkVideoReferenceSlotInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoReferenceSlotInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoReferenceSlotInfoKHR( int32_t                                                   slotIndex_        = {},\n                                                    const VULKAN_HPP_NAMESPACE::VideoPictureResourceInfoKHR * pPictureResource_ = {},\n                                                    const void *                                              pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , slotIndex{ slotIndex_ }\n      , pPictureResource{ pPictureResource_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoReferenceSlotInfoKHR( VideoReferenceSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoReferenceSlotInfoKHR( VkVideoReferenceSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoReferenceSlotInfoKHR( *reinterpret_cast<VideoReferenceSlotInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoReferenceSlotInfoKHR & operator=( VideoReferenceSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoReferenceSlotInfoKHR & operator=( VkVideoReferenceSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoReferenceSlotInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoReferenceSlotInfoKHR & setSlotIndex( int32_t slotIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      slotIndex = slotIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoReferenceSlotInfoKHR &\n      setPPictureResource( const VULKAN_HPP_NAMESPACE::VideoPictureResourceInfoKHR * pPictureResource_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pPictureResource = pPictureResource_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoReferenceSlotInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoReferenceSlotInfoKHR *>( this );\n    }\n\n    operator VkVideoReferenceSlotInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoReferenceSlotInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               int32_t const &,\n               const VULKAN_HPP_NAMESPACE::VideoPictureResourceInfoKHR * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, slotIndex, pPictureResource );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoReferenceSlotInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoReferenceSlotInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( slotIndex == rhs.slotIndex ) && ( pPictureResource == rhs.pPictureResource );\n#  endif\n    }\n\n    bool operator!=( VideoReferenceSlotInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                       sType            = StructureType::eVideoReferenceSlotInfoKHR;\n    const void *                                              pNext            = {};\n    int32_t                                                   slotIndex        = {};\n    const VULKAN_HPP_NAMESPACE::VideoPictureResourceInfoKHR * pPictureResource = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoReferenceSlotInfoKHR>\n  {\n    using Type = VideoReferenceSlotInfoKHR;\n  };\n\n  struct VideoBeginCodingInfoKHR\n  {\n    using NativeType = VkVideoBeginCodingInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoBeginCodingInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoBeginCodingInfoKHR( VULKAN_HPP_NAMESPACE::VideoBeginCodingFlagsKHR          flags_                  = {},\n                                                  VULKAN_HPP_NAMESPACE::VideoSessionKHR                   videoSession_           = {},\n                                                  VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR         videoSessionParameters_ = {},\n                                                  uint32_t                                                referenceSlotCount_     = {},\n                                                  const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR * pReferenceSlots_        = {},\n                                                  const void *                                            pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , videoSession{ videoSession_ }\n      , videoSessionParameters{ videoSessionParameters_ }\n      , referenceSlotCount{ referenceSlotCount_ }\n      , pReferenceSlots{ pReferenceSlots_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoBeginCodingInfoKHR( VideoBeginCodingInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoBeginCodingInfoKHR( VkVideoBeginCodingInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoBeginCodingInfoKHR( *reinterpret_cast<VideoBeginCodingInfoKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoBeginCodingInfoKHR( VULKAN_HPP_NAMESPACE::VideoBeginCodingFlagsKHR  flags_,\n                             VULKAN_HPP_NAMESPACE::VideoSessionKHR           videoSession_,\n                             VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR videoSessionParameters_,\n                             VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR> const & referenceSlots_,\n                             const void *                                                                                                 pNext_ = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , videoSession( videoSession_ )\n      , videoSessionParameters( videoSessionParameters_ )\n      , referenceSlotCount( static_cast<uint32_t>( referenceSlots_.size() ) )\n      , pReferenceSlots( referenceSlots_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VideoBeginCodingInfoKHR & operator=( VideoBeginCodingInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoBeginCodingInfoKHR & operator=( VkVideoBeginCodingInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoBeginCodingInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoBeginCodingInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoBeginCodingInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::VideoBeginCodingFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoBeginCodingInfoKHR & setVideoSession( VULKAN_HPP_NAMESPACE::VideoSessionKHR videoSession_ ) VULKAN_HPP_NOEXCEPT\n    {\n      videoSession = videoSession_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoBeginCodingInfoKHR &\n      setVideoSessionParameters( VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR videoSessionParameters_ ) VULKAN_HPP_NOEXCEPT\n    {\n      videoSessionParameters = videoSessionParameters_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoBeginCodingInfoKHR & setReferenceSlotCount( uint32_t referenceSlotCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      referenceSlotCount = referenceSlotCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoBeginCodingInfoKHR &\n      setPReferenceSlots( const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR * pReferenceSlots_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pReferenceSlots = pReferenceSlots_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoBeginCodingInfoKHR & setReferenceSlots(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR> const & referenceSlots_ ) VULKAN_HPP_NOEXCEPT\n    {\n      referenceSlotCount = static_cast<uint32_t>( referenceSlots_.size() );\n      pReferenceSlots    = referenceSlots_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoBeginCodingInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoBeginCodingInfoKHR *>( this );\n    }\n\n    operator VkVideoBeginCodingInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoBeginCodingInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::VideoBeginCodingFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::VideoSessionKHR const &,\n               VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, videoSession, videoSessionParameters, referenceSlotCount, pReferenceSlots );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoBeginCodingInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoBeginCodingInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( videoSession == rhs.videoSession ) &&\n             ( videoSessionParameters == rhs.videoSessionParameters ) && ( referenceSlotCount == rhs.referenceSlotCount ) &&\n             ( pReferenceSlots == rhs.pReferenceSlots );\n#  endif\n    }\n\n    bool operator!=( VideoBeginCodingInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                     sType                  = StructureType::eVideoBeginCodingInfoKHR;\n    const void *                                            pNext                  = {};\n    VULKAN_HPP_NAMESPACE::VideoBeginCodingFlagsKHR          flags                  = {};\n    VULKAN_HPP_NAMESPACE::VideoSessionKHR                   videoSession           = {};\n    VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR         videoSessionParameters = {};\n    uint32_t                                                referenceSlotCount     = {};\n    const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR * pReferenceSlots        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoBeginCodingInfoKHR>\n  {\n    using Type = VideoBeginCodingInfoKHR;\n  };\n\n  struct VideoCapabilitiesKHR\n  {\n    using NativeType = VkVideoCapabilitiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoCapabilitiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 VideoCapabilitiesKHR( VULKAN_HPP_NAMESPACE::VideoCapabilityFlagsKHR flags_                             = {},\n                                                  VULKAN_HPP_NAMESPACE::DeviceSize              minBitstreamBufferOffsetAlignment_ = {},\n                                                  VULKAN_HPP_NAMESPACE::DeviceSize              minBitstreamBufferSizeAlignment_   = {},\n                                                  VULKAN_HPP_NAMESPACE::Extent2D                pictureAccessGranularity_          = {},\n                                                  VULKAN_HPP_NAMESPACE::Extent2D                minCodedExtent_                    = {},\n                                                  VULKAN_HPP_NAMESPACE::Extent2D                maxCodedExtent_                    = {},\n                                                  uint32_t                                      maxDpbSlots_                       = {},\n                                                  uint32_t                                      maxActiveReferencePictures_        = {},\n                                                  VULKAN_HPP_NAMESPACE::ExtensionProperties     stdHeaderVersion_                  = {},\n                                                  void *                                        pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , minBitstreamBufferOffsetAlignment{ minBitstreamBufferOffsetAlignment_ }\n      , minBitstreamBufferSizeAlignment{ minBitstreamBufferSizeAlignment_ }\n      , pictureAccessGranularity{ pictureAccessGranularity_ }\n      , minCodedExtent{ minCodedExtent_ }\n      , maxCodedExtent{ maxCodedExtent_ }\n      , maxDpbSlots{ maxDpbSlots_ }\n      , maxActiveReferencePictures{ maxActiveReferencePictures_ }\n      , stdHeaderVersion{ stdHeaderVersion_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoCapabilitiesKHR( VideoCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoCapabilitiesKHR( VkVideoCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoCapabilitiesKHR( *reinterpret_cast<VideoCapabilitiesKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoCapabilitiesKHR & operator=( VideoCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoCapabilitiesKHR & operator=( VkVideoCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoCapabilitiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoCapabilitiesKHR *>( this );\n    }\n\n    operator VkVideoCapabilitiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoCapabilitiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::VideoCapabilityFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::ExtensionProperties const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       flags,\n                       minBitstreamBufferOffsetAlignment,\n                       minBitstreamBufferSizeAlignment,\n                       pictureAccessGranularity,\n                       minCodedExtent,\n                       maxCodedExtent,\n                       maxDpbSlots,\n                       maxActiveReferencePictures,\n                       stdHeaderVersion );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoCapabilitiesKHR const & ) const = default;\n#else\n    bool operator==( VideoCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) &&\n             ( minBitstreamBufferOffsetAlignment == rhs.minBitstreamBufferOffsetAlignment ) &&\n             ( minBitstreamBufferSizeAlignment == rhs.minBitstreamBufferSizeAlignment ) && ( pictureAccessGranularity == rhs.pictureAccessGranularity ) &&\n             ( minCodedExtent == rhs.minCodedExtent ) && ( maxCodedExtent == rhs.maxCodedExtent ) && ( maxDpbSlots == rhs.maxDpbSlots ) &&\n             ( maxActiveReferencePictures == rhs.maxActiveReferencePictures ) && ( stdHeaderVersion == rhs.stdHeaderVersion );\n#  endif\n    }\n\n    bool operator!=( VideoCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType           sType                             = StructureType::eVideoCapabilitiesKHR;\n    void *                                        pNext                             = {};\n    VULKAN_HPP_NAMESPACE::VideoCapabilityFlagsKHR flags                             = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize              minBitstreamBufferOffsetAlignment = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize              minBitstreamBufferSizeAlignment   = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                pictureAccessGranularity          = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                minCodedExtent                    = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                maxCodedExtent                    = {};\n    uint32_t                                      maxDpbSlots                       = {};\n    uint32_t                                      maxActiveReferencePictures        = {};\n    VULKAN_HPP_NAMESPACE::ExtensionProperties     stdHeaderVersion                  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoCapabilitiesKHR>\n  {\n    using Type = VideoCapabilitiesKHR;\n  };\n\n  struct VideoCodingControlInfoKHR\n  {\n    using NativeType = VkVideoCodingControlInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoCodingControlInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoCodingControlInfoKHR( VULKAN_HPP_NAMESPACE::VideoCodingControlFlagsKHR flags_ = {},\n                                                    const void *                                     pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoCodingControlInfoKHR( VideoCodingControlInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoCodingControlInfoKHR( VkVideoCodingControlInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoCodingControlInfoKHR( *reinterpret_cast<VideoCodingControlInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoCodingControlInfoKHR & operator=( VideoCodingControlInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoCodingControlInfoKHR & operator=( VkVideoCodingControlInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoCodingControlInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoCodingControlInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoCodingControlInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::VideoCodingControlFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoCodingControlInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoCodingControlInfoKHR *>( this );\n    }\n\n    operator VkVideoCodingControlInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoCodingControlInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::VideoCodingControlFlagsKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoCodingControlInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoCodingControlInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags );\n#  endif\n    }\n\n    bool operator!=( VideoCodingControlInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType              sType = StructureType::eVideoCodingControlInfoKHR;\n    const void *                                     pNext = {};\n    VULKAN_HPP_NAMESPACE::VideoCodingControlFlagsKHR flags = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoCodingControlInfoKHR>\n  {\n    using Type = VideoCodingControlInfoKHR;\n  };\n\n  struct VideoDecodeAV1CapabilitiesKHR\n  {\n    using NativeType = VkVideoDecodeAV1CapabilitiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoDecodeAv1CapabilitiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoDecodeAV1CapabilitiesKHR( StdVideoAV1Level maxLevel_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxLevel{ maxLevel_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoDecodeAV1CapabilitiesKHR( VideoDecodeAV1CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoDecodeAV1CapabilitiesKHR( VkVideoDecodeAV1CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoDecodeAV1CapabilitiesKHR( *reinterpret_cast<VideoDecodeAV1CapabilitiesKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoDecodeAV1CapabilitiesKHR & operator=( VideoDecodeAV1CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoDecodeAV1CapabilitiesKHR & operator=( VkVideoDecodeAV1CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoDecodeAV1CapabilitiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoDecodeAV1CapabilitiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoDecodeAV1CapabilitiesKHR *>( this );\n    }\n\n    operator VkVideoDecodeAV1CapabilitiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoDecodeAV1CapabilitiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, StdVideoAV1Level const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxLevel );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( VideoDecodeAV1CapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = memcmp( &maxLevel, &rhs.maxLevel, sizeof( StdVideoAV1Level ) ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( VideoDecodeAV1CapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memcmp( &maxLevel, &rhs.maxLevel, sizeof( StdVideoAV1Level ) ) == 0 );\n    }\n\n    bool operator!=( VideoDecodeAV1CapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType    = StructureType::eVideoDecodeAv1CapabilitiesKHR;\n    void *                              pNext    = {};\n    StdVideoAV1Level                    maxLevel = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoDecodeAv1CapabilitiesKHR>\n  {\n    using Type = VideoDecodeAV1CapabilitiesKHR;\n  };\n\n  struct VideoDecodeAV1DpbSlotInfoKHR\n  {\n    using NativeType = VkVideoDecodeAV1DpbSlotInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoDecodeAv1DpbSlotInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoDecodeAV1DpbSlotInfoKHR( const StdVideoDecodeAV1ReferenceInfo * pStdReferenceInfo_ = {},\n                                                       const void *                           pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pStdReferenceInfo{ pStdReferenceInfo_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoDecodeAV1DpbSlotInfoKHR( VideoDecodeAV1DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoDecodeAV1DpbSlotInfoKHR( VkVideoDecodeAV1DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoDecodeAV1DpbSlotInfoKHR( *reinterpret_cast<VideoDecodeAV1DpbSlotInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoDecodeAV1DpbSlotInfoKHR & operator=( VideoDecodeAV1DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoDecodeAV1DpbSlotInfoKHR & operator=( VkVideoDecodeAV1DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoDecodeAV1DpbSlotInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeAV1DpbSlotInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeAV1DpbSlotInfoKHR & setPStdReferenceInfo( const StdVideoDecodeAV1ReferenceInfo * pStdReferenceInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdReferenceInfo = pStdReferenceInfo_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoDecodeAV1DpbSlotInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoDecodeAV1DpbSlotInfoKHR *>( this );\n    }\n\n    operator VkVideoDecodeAV1DpbSlotInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoDecodeAV1DpbSlotInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, const StdVideoDecodeAV1ReferenceInfo * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pStdReferenceInfo );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoDecodeAV1DpbSlotInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoDecodeAV1DpbSlotInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pStdReferenceInfo == rhs.pStdReferenceInfo );\n#  endif\n    }\n\n    bool operator!=( VideoDecodeAV1DpbSlotInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType             = StructureType::eVideoDecodeAv1DpbSlotInfoKHR;\n    const void *                           pNext             = {};\n    const StdVideoDecodeAV1ReferenceInfo * pStdReferenceInfo = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoDecodeAv1DpbSlotInfoKHR>\n  {\n    using Type = VideoDecodeAV1DpbSlotInfoKHR;\n  };\n\n  struct VideoDecodeAV1InlineSessionParametersInfoKHR\n  {\n    using NativeType = VkVideoDecodeAV1InlineSessionParametersInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoDecodeAv1InlineSessionParametersInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoDecodeAV1InlineSessionParametersInfoKHR( const StdVideoAV1SequenceHeader * pStdSequenceHeader_ = {},\n                                                                       const void *                      pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pStdSequenceHeader{ pStdSequenceHeader_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoDecodeAV1InlineSessionParametersInfoKHR( VideoDecodeAV1InlineSessionParametersInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoDecodeAV1InlineSessionParametersInfoKHR( VkVideoDecodeAV1InlineSessionParametersInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoDecodeAV1InlineSessionParametersInfoKHR( *reinterpret_cast<VideoDecodeAV1InlineSessionParametersInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoDecodeAV1InlineSessionParametersInfoKHR & operator=( VideoDecodeAV1InlineSessionParametersInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoDecodeAV1InlineSessionParametersInfoKHR & operator=( VkVideoDecodeAV1InlineSessionParametersInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoDecodeAV1InlineSessionParametersInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeAV1InlineSessionParametersInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeAV1InlineSessionParametersInfoKHR &\n      setPStdSequenceHeader( const StdVideoAV1SequenceHeader * pStdSequenceHeader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdSequenceHeader = pStdSequenceHeader_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoDecodeAV1InlineSessionParametersInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoDecodeAV1InlineSessionParametersInfoKHR *>( this );\n    }\n\n    operator VkVideoDecodeAV1InlineSessionParametersInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoDecodeAV1InlineSessionParametersInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, const StdVideoAV1SequenceHeader * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pStdSequenceHeader );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoDecodeAV1InlineSessionParametersInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoDecodeAV1InlineSessionParametersInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pStdSequenceHeader == rhs.pStdSequenceHeader );\n#  endif\n    }\n\n    bool operator!=( VideoDecodeAV1InlineSessionParametersInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType              = StructureType::eVideoDecodeAv1InlineSessionParametersInfoKHR;\n    const void *                        pNext              = {};\n    const StdVideoAV1SequenceHeader *   pStdSequenceHeader = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoDecodeAv1InlineSessionParametersInfoKHR>\n  {\n    using Type = VideoDecodeAV1InlineSessionParametersInfoKHR;\n  };\n\n  struct VideoDecodeAV1PictureInfoKHR\n  {\n    using NativeType = VkVideoDecodeAV1PictureInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoDecodeAv1PictureInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeAV1PictureInfoKHR( const StdVideoDecodeAV1PictureInfo *                                   pStdPictureInfo_          = {},\n                                                          std::array<int32_t, VK_MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR> const & referenceNameSlotIndices_ = {},\n                                                          uint32_t                                                               frameHeaderOffset_        = {},\n                                                          uint32_t                                                               tileCount_                = {},\n                                                          const uint32_t *                                                       pTileOffsets_             = {},\n                                                          const uint32_t *                                                       pTileSizes_               = {},\n                                                          const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pStdPictureInfo{ pStdPictureInfo_ }\n      , referenceNameSlotIndices{ referenceNameSlotIndices_ }\n      , frameHeaderOffset{ frameHeaderOffset_ }\n      , tileCount{ tileCount_ }\n      , pTileOffsets{ pTileOffsets_ }\n      , pTileSizes{ pTileSizes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeAV1PictureInfoKHR( VideoDecodeAV1PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoDecodeAV1PictureInfoKHR( VkVideoDecodeAV1PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoDecodeAV1PictureInfoKHR( *reinterpret_cast<VideoDecodeAV1PictureInfoKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoDecodeAV1PictureInfoKHR( const StdVideoDecodeAV1PictureInfo *                                   pStdPictureInfo_,\n                                  std::array<int32_t, VK_MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR> const & referenceNameSlotIndices_,\n                                  uint32_t                                                               frameHeaderOffset_,\n                                  VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const &  tileOffsets_,\n                                  VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const &  tileSizes_ = {},\n                                  const void *                                                           pNext_     = nullptr )\n      : pNext( pNext_ )\n      , pStdPictureInfo( pStdPictureInfo_ )\n      , referenceNameSlotIndices( referenceNameSlotIndices_ )\n      , frameHeaderOffset( frameHeaderOffset_ )\n      , tileCount( static_cast<uint32_t>( tileOffsets_.size() ) )\n      , pTileOffsets( tileOffsets_.data() )\n      , pTileSizes( tileSizes_.data() )\n    {\n#    ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( tileOffsets_.size() == tileSizes_.size() );\n#    else\n      if ( tileOffsets_.size() != tileSizes_.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING\n                          \"::VideoDecodeAV1PictureInfoKHR::VideoDecodeAV1PictureInfoKHR: tileOffsets_.size() != tileSizes_.size()\" );\n      }\n#    endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VideoDecodeAV1PictureInfoKHR & operator=( VideoDecodeAV1PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoDecodeAV1PictureInfoKHR & operator=( VkVideoDecodeAV1PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoDecodeAV1PictureInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeAV1PictureInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeAV1PictureInfoKHR & setPStdPictureInfo( const StdVideoDecodeAV1PictureInfo * pStdPictureInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdPictureInfo = pStdPictureInfo_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeAV1PictureInfoKHR &\n      setReferenceNameSlotIndices( std::array<int32_t, VK_MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR> referenceNameSlotIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      referenceNameSlotIndices = referenceNameSlotIndices_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeAV1PictureInfoKHR & setFrameHeaderOffset( uint32_t frameHeaderOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      frameHeaderOffset = frameHeaderOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeAV1PictureInfoKHR & setTileCount( uint32_t tileCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tileCount = tileCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeAV1PictureInfoKHR & setPTileOffsets( const uint32_t * pTileOffsets_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pTileOffsets = pTileOffsets_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoDecodeAV1PictureInfoKHR & setTileOffsets( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & tileOffsets_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tileCount    = static_cast<uint32_t>( tileOffsets_.size() );\n      pTileOffsets = tileOffsets_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeAV1PictureInfoKHR & setPTileSizes( const uint32_t * pTileSizes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pTileSizes = pTileSizes_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoDecodeAV1PictureInfoKHR & setTileSizes( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & tileSizes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tileCount  = static_cast<uint32_t>( tileSizes_.size() );\n      pTileSizes = tileSizes_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoDecodeAV1PictureInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoDecodeAV1PictureInfoKHR *>( this );\n    }\n\n    operator VkVideoDecodeAV1PictureInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoDecodeAV1PictureInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               const StdVideoDecodeAV1PictureInfo * const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int32_t, VK_MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR> const &,\n               uint32_t const &,\n               uint32_t const &,\n               const uint32_t * const &,\n               const uint32_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pStdPictureInfo, referenceNameSlotIndices, frameHeaderOffset, tileCount, pTileOffsets, pTileSizes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoDecodeAV1PictureInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoDecodeAV1PictureInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pStdPictureInfo == rhs.pStdPictureInfo ) &&\n             ( referenceNameSlotIndices == rhs.referenceNameSlotIndices ) && ( frameHeaderOffset == rhs.frameHeaderOffset ) && ( tileCount == rhs.tileCount ) &&\n             ( pTileOffsets == rhs.pTileOffsets ) && ( pTileSizes == rhs.pTileSizes );\n#  endif\n    }\n\n    bool operator!=( VideoDecodeAV1PictureInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                                      sType           = StructureType::eVideoDecodeAv1PictureInfoKHR;\n    const void *                                                                             pNext           = {};\n    const StdVideoDecodeAV1PictureInfo *                                                     pStdPictureInfo = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int32_t, VK_MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR> referenceNameSlotIndices = {};\n    uint32_t                                                                                 frameHeaderOffset        = {};\n    uint32_t                                                                                 tileCount                = {};\n    const uint32_t *                                                                         pTileOffsets             = {};\n    const uint32_t *                                                                         pTileSizes               = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoDecodeAv1PictureInfoKHR>\n  {\n    using Type = VideoDecodeAV1PictureInfoKHR;\n  };\n\n  struct VideoDecodeAV1ProfileInfoKHR\n  {\n    using NativeType = VkVideoDecodeAV1ProfileInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoDecodeAv1ProfileInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoDecodeAV1ProfileInfoKHR( StdVideoAV1Profile           stdProfile_       = {},\n                                                       VULKAN_HPP_NAMESPACE::Bool32 filmGrainSupport_ = {},\n                                                       const void *                 pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stdProfile{ stdProfile_ }\n      , filmGrainSupport{ filmGrainSupport_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoDecodeAV1ProfileInfoKHR( VideoDecodeAV1ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoDecodeAV1ProfileInfoKHR( VkVideoDecodeAV1ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoDecodeAV1ProfileInfoKHR( *reinterpret_cast<VideoDecodeAV1ProfileInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoDecodeAV1ProfileInfoKHR & operator=( VideoDecodeAV1ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoDecodeAV1ProfileInfoKHR & operator=( VkVideoDecodeAV1ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoDecodeAV1ProfileInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeAV1ProfileInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeAV1ProfileInfoKHR & setStdProfile( StdVideoAV1Profile stdProfile_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdProfile = stdProfile_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeAV1ProfileInfoKHR & setFilmGrainSupport( VULKAN_HPP_NAMESPACE::Bool32 filmGrainSupport_ ) VULKAN_HPP_NOEXCEPT\n    {\n      filmGrainSupport = filmGrainSupport_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoDecodeAV1ProfileInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoDecodeAV1ProfileInfoKHR *>( this );\n    }\n\n    operator VkVideoDecodeAV1ProfileInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoDecodeAV1ProfileInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, StdVideoAV1Profile const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stdProfile, filmGrainSupport );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( VideoDecodeAV1ProfileInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = memcmp( &stdProfile, &rhs.stdProfile, sizeof( StdVideoAV1Profile ) ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = filmGrainSupport <=> rhs.filmGrainSupport; cmp != 0 )\n        return cmp;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( VideoDecodeAV1ProfileInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memcmp( &stdProfile, &rhs.stdProfile, sizeof( StdVideoAV1Profile ) ) == 0 ) &&\n             ( filmGrainSupport == rhs.filmGrainSupport );\n    }\n\n    bool operator!=( VideoDecodeAV1ProfileInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType            = StructureType::eVideoDecodeAv1ProfileInfoKHR;\n    const void *                        pNext            = {};\n    StdVideoAV1Profile                  stdProfile       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        filmGrainSupport = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoDecodeAv1ProfileInfoKHR>\n  {\n    using Type = VideoDecodeAV1ProfileInfoKHR;\n  };\n\n  struct VideoDecodeAV1SessionParametersCreateInfoKHR\n  {\n    using NativeType = VkVideoDecodeAV1SessionParametersCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoDecodeAv1SessionParametersCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoDecodeAV1SessionParametersCreateInfoKHR( const StdVideoAV1SequenceHeader * pStdSequenceHeader_ = {},\n                                                                       const void *                      pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pStdSequenceHeader{ pStdSequenceHeader_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoDecodeAV1SessionParametersCreateInfoKHR( VideoDecodeAV1SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoDecodeAV1SessionParametersCreateInfoKHR( VkVideoDecodeAV1SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoDecodeAV1SessionParametersCreateInfoKHR( *reinterpret_cast<VideoDecodeAV1SessionParametersCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoDecodeAV1SessionParametersCreateInfoKHR & operator=( VideoDecodeAV1SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoDecodeAV1SessionParametersCreateInfoKHR & operator=( VkVideoDecodeAV1SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoDecodeAV1SessionParametersCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeAV1SessionParametersCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeAV1SessionParametersCreateInfoKHR &\n      setPStdSequenceHeader( const StdVideoAV1SequenceHeader * pStdSequenceHeader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdSequenceHeader = pStdSequenceHeader_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoDecodeAV1SessionParametersCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoDecodeAV1SessionParametersCreateInfoKHR *>( this );\n    }\n\n    operator VkVideoDecodeAV1SessionParametersCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoDecodeAV1SessionParametersCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, const StdVideoAV1SequenceHeader * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pStdSequenceHeader );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoDecodeAV1SessionParametersCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoDecodeAV1SessionParametersCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pStdSequenceHeader == rhs.pStdSequenceHeader );\n#  endif\n    }\n\n    bool operator!=( VideoDecodeAV1SessionParametersCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType              = StructureType::eVideoDecodeAv1SessionParametersCreateInfoKHR;\n    const void *                        pNext              = {};\n    const StdVideoAV1SequenceHeader *   pStdSequenceHeader = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoDecodeAv1SessionParametersCreateInfoKHR>\n  {\n    using Type = VideoDecodeAV1SessionParametersCreateInfoKHR;\n  };\n\n  struct VideoDecodeCapabilitiesKHR\n  {\n    using NativeType = VkVideoDecodeCapabilitiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoDecodeCapabilitiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoDecodeCapabilitiesKHR( VULKAN_HPP_NAMESPACE::VideoDecodeCapabilityFlagsKHR flags_ = {},\n                                                     void *                                              pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoDecodeCapabilitiesKHR( VideoDecodeCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoDecodeCapabilitiesKHR( VkVideoDecodeCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoDecodeCapabilitiesKHR( *reinterpret_cast<VideoDecodeCapabilitiesKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoDecodeCapabilitiesKHR & operator=( VideoDecodeCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoDecodeCapabilitiesKHR & operator=( VkVideoDecodeCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoDecodeCapabilitiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoDecodeCapabilitiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoDecodeCapabilitiesKHR *>( this );\n    }\n\n    operator VkVideoDecodeCapabilitiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoDecodeCapabilitiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::VideoDecodeCapabilityFlagsKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoDecodeCapabilitiesKHR const & ) const = default;\n#else\n    bool operator==( VideoDecodeCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags );\n#  endif\n    }\n\n    bool operator!=( VideoDecodeCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                 sType = StructureType::eVideoDecodeCapabilitiesKHR;\n    void *                                              pNext = {};\n    VULKAN_HPP_NAMESPACE::VideoDecodeCapabilityFlagsKHR flags = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoDecodeCapabilitiesKHR>\n  {\n    using Type = VideoDecodeCapabilitiesKHR;\n  };\n\n  struct VideoDecodeH264CapabilitiesKHR\n  {\n    using NativeType = VkVideoDecodeH264CapabilitiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoDecodeH264CapabilitiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoDecodeH264CapabilitiesKHR( StdVideoH264LevelIdc           maxLevelIdc_            = {},\n                                                         VULKAN_HPP_NAMESPACE::Offset2D fieldOffsetGranularity_ = {},\n                                                         void *                         pNext_                  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxLevelIdc{ maxLevelIdc_ }\n      , fieldOffsetGranularity{ fieldOffsetGranularity_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoDecodeH264CapabilitiesKHR( VideoDecodeH264CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoDecodeH264CapabilitiesKHR( VkVideoDecodeH264CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoDecodeH264CapabilitiesKHR( *reinterpret_cast<VideoDecodeH264CapabilitiesKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoDecodeH264CapabilitiesKHR & operator=( VideoDecodeH264CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoDecodeH264CapabilitiesKHR & operator=( VkVideoDecodeH264CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoDecodeH264CapabilitiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoDecodeH264CapabilitiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoDecodeH264CapabilitiesKHR *>( this );\n    }\n\n    operator VkVideoDecodeH264CapabilitiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoDecodeH264CapabilitiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, StdVideoH264LevelIdc const &, VULKAN_HPP_NAMESPACE::Offset2D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxLevelIdc, fieldOffsetGranularity );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( VideoDecodeH264CapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = memcmp( &maxLevelIdc, &rhs.maxLevelIdc, sizeof( StdVideoH264LevelIdc ) ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = fieldOffsetGranularity <=> rhs.fieldOffsetGranularity; cmp != 0 )\n        return cmp;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( VideoDecodeH264CapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memcmp( &maxLevelIdc, &rhs.maxLevelIdc, sizeof( StdVideoH264LevelIdc ) ) == 0 ) &&\n             ( fieldOffsetGranularity == rhs.fieldOffsetGranularity );\n    }\n\n    bool operator!=( VideoDecodeH264CapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                  = StructureType::eVideoDecodeH264CapabilitiesKHR;\n    void *                              pNext                  = {};\n    StdVideoH264LevelIdc                maxLevelIdc            = {};\n    VULKAN_HPP_NAMESPACE::Offset2D      fieldOffsetGranularity = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoDecodeH264CapabilitiesKHR>\n  {\n    using Type = VideoDecodeH264CapabilitiesKHR;\n  };\n\n  struct VideoDecodeH264DpbSlotInfoKHR\n  {\n    using NativeType = VkVideoDecodeH264DpbSlotInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoDecodeH264DpbSlotInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoDecodeH264DpbSlotInfoKHR( const StdVideoDecodeH264ReferenceInfo * pStdReferenceInfo_ = {},\n                                                        const void *                            pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pStdReferenceInfo{ pStdReferenceInfo_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoDecodeH264DpbSlotInfoKHR( VideoDecodeH264DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoDecodeH264DpbSlotInfoKHR( VkVideoDecodeH264DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoDecodeH264DpbSlotInfoKHR( *reinterpret_cast<VideoDecodeH264DpbSlotInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoDecodeH264DpbSlotInfoKHR & operator=( VideoDecodeH264DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoDecodeH264DpbSlotInfoKHR & operator=( VkVideoDecodeH264DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoDecodeH264DpbSlotInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH264DpbSlotInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH264DpbSlotInfoKHR &\n      setPStdReferenceInfo( const StdVideoDecodeH264ReferenceInfo * pStdReferenceInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdReferenceInfo = pStdReferenceInfo_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoDecodeH264DpbSlotInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoDecodeH264DpbSlotInfoKHR *>( this );\n    }\n\n    operator VkVideoDecodeH264DpbSlotInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoDecodeH264DpbSlotInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, const StdVideoDecodeH264ReferenceInfo * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pStdReferenceInfo );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoDecodeH264DpbSlotInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoDecodeH264DpbSlotInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pStdReferenceInfo == rhs.pStdReferenceInfo );\n#  endif\n    }\n\n    bool operator!=( VideoDecodeH264DpbSlotInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType     sType             = StructureType::eVideoDecodeH264DpbSlotInfoKHR;\n    const void *                            pNext             = {};\n    const StdVideoDecodeH264ReferenceInfo * pStdReferenceInfo = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoDecodeH264DpbSlotInfoKHR>\n  {\n    using Type = VideoDecodeH264DpbSlotInfoKHR;\n  };\n\n  struct VideoDecodeH264InlineSessionParametersInfoKHR\n  {\n    using NativeType = VkVideoDecodeH264InlineSessionParametersInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoDecodeH264InlineSessionParametersInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoDecodeH264InlineSessionParametersInfoKHR( const StdVideoH264SequenceParameterSet * pStdSPS_ = {},\n                                                                        const StdVideoH264PictureParameterSet *  pStdPPS_ = {},\n                                                                        const void *                             pNext_   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pStdSPS{ pStdSPS_ }\n      , pStdPPS{ pStdPPS_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      VideoDecodeH264InlineSessionParametersInfoKHR( VideoDecodeH264InlineSessionParametersInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoDecodeH264InlineSessionParametersInfoKHR( VkVideoDecodeH264InlineSessionParametersInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoDecodeH264InlineSessionParametersInfoKHR( *reinterpret_cast<VideoDecodeH264InlineSessionParametersInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoDecodeH264InlineSessionParametersInfoKHR & operator=( VideoDecodeH264InlineSessionParametersInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoDecodeH264InlineSessionParametersInfoKHR & operator=( VkVideoDecodeH264InlineSessionParametersInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoDecodeH264InlineSessionParametersInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH264InlineSessionParametersInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH264InlineSessionParametersInfoKHR & setPStdSPS( const StdVideoH264SequenceParameterSet * pStdSPS_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdSPS = pStdSPS_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH264InlineSessionParametersInfoKHR & setPStdPPS( const StdVideoH264PictureParameterSet * pStdPPS_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdPPS = pStdPPS_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoDecodeH264InlineSessionParametersInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoDecodeH264InlineSessionParametersInfoKHR *>( this );\n    }\n\n    operator VkVideoDecodeH264InlineSessionParametersInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoDecodeH264InlineSessionParametersInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               const StdVideoH264SequenceParameterSet * const &,\n               const StdVideoH264PictureParameterSet * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pStdSPS, pStdPPS );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoDecodeH264InlineSessionParametersInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoDecodeH264InlineSessionParametersInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pStdSPS == rhs.pStdSPS ) && ( pStdPPS == rhs.pStdPPS );\n#  endif\n    }\n\n    bool operator!=( VideoDecodeH264InlineSessionParametersInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType      sType   = StructureType::eVideoDecodeH264InlineSessionParametersInfoKHR;\n    const void *                             pNext   = {};\n    const StdVideoH264SequenceParameterSet * pStdSPS = {};\n    const StdVideoH264PictureParameterSet *  pStdPPS = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoDecodeH264InlineSessionParametersInfoKHR>\n  {\n    using Type = VideoDecodeH264InlineSessionParametersInfoKHR;\n  };\n\n  struct VideoDecodeH264PictureInfoKHR\n  {\n    using NativeType = VkVideoDecodeH264PictureInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoDecodeH264PictureInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoDecodeH264PictureInfoKHR( const StdVideoDecodeH264PictureInfo * pStdPictureInfo_ = {},\n                                                        uint32_t                              sliceCount_      = {},\n                                                        const uint32_t *                      pSliceOffsets_   = {},\n                                                        const void *                          pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pStdPictureInfo{ pStdPictureInfo_ }\n      , sliceCount{ sliceCount_ }\n      , pSliceOffsets{ pSliceOffsets_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoDecodeH264PictureInfoKHR( VideoDecodeH264PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoDecodeH264PictureInfoKHR( VkVideoDecodeH264PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoDecodeH264PictureInfoKHR( *reinterpret_cast<VideoDecodeH264PictureInfoKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoDecodeH264PictureInfoKHR( const StdVideoDecodeH264PictureInfo *                                 pStdPictureInfo_,\n                                   VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & sliceOffsets_,\n                                   const void *                                                          pNext_ = nullptr )\n      : pNext( pNext_ ), pStdPictureInfo( pStdPictureInfo_ ), sliceCount( static_cast<uint32_t>( sliceOffsets_.size() ) ), pSliceOffsets( sliceOffsets_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VideoDecodeH264PictureInfoKHR & operator=( VideoDecodeH264PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoDecodeH264PictureInfoKHR & operator=( VkVideoDecodeH264PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoDecodeH264PictureInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH264PictureInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH264PictureInfoKHR & setPStdPictureInfo( const StdVideoDecodeH264PictureInfo * pStdPictureInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdPictureInfo = pStdPictureInfo_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH264PictureInfoKHR & setSliceCount( uint32_t sliceCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sliceCount = sliceCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH264PictureInfoKHR & setPSliceOffsets( const uint32_t * pSliceOffsets_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSliceOffsets = pSliceOffsets_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoDecodeH264PictureInfoKHR & setSliceOffsets( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & sliceOffsets_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sliceCount    = static_cast<uint32_t>( sliceOffsets_.size() );\n      pSliceOffsets = sliceOffsets_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoDecodeH264PictureInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoDecodeH264PictureInfoKHR *>( this );\n    }\n\n    operator VkVideoDecodeH264PictureInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoDecodeH264PictureInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               const StdVideoDecodeH264PictureInfo * const &,\n               uint32_t const &,\n               const uint32_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pStdPictureInfo, sliceCount, pSliceOffsets );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoDecodeH264PictureInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoDecodeH264PictureInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pStdPictureInfo == rhs.pStdPictureInfo ) && ( sliceCount == rhs.sliceCount ) &&\n             ( pSliceOffsets == rhs.pSliceOffsets );\n#  endif\n    }\n\n    bool operator!=( VideoDecodeH264PictureInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType   sType           = StructureType::eVideoDecodeH264PictureInfoKHR;\n    const void *                          pNext           = {};\n    const StdVideoDecodeH264PictureInfo * pStdPictureInfo = {};\n    uint32_t                              sliceCount      = {};\n    const uint32_t *                      pSliceOffsets   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoDecodeH264PictureInfoKHR>\n  {\n    using Type = VideoDecodeH264PictureInfoKHR;\n  };\n\n  struct VideoDecodeH264ProfileInfoKHR\n  {\n    using NativeType = VkVideoDecodeH264ProfileInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoDecodeH264ProfileInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoDecodeH264ProfileInfoKHR( StdVideoH264ProfileIdc                                        stdProfileIdc_ = {},\n                                                        VULKAN_HPP_NAMESPACE::VideoDecodeH264PictureLayoutFlagBitsKHR pictureLayout_ =\n                                                          VULKAN_HPP_NAMESPACE::VideoDecodeH264PictureLayoutFlagBitsKHR::eProgressive,\n                                                        const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stdProfileIdc{ stdProfileIdc_ }\n      , pictureLayout{ pictureLayout_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoDecodeH264ProfileInfoKHR( VideoDecodeH264ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoDecodeH264ProfileInfoKHR( VkVideoDecodeH264ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoDecodeH264ProfileInfoKHR( *reinterpret_cast<VideoDecodeH264ProfileInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoDecodeH264ProfileInfoKHR & operator=( VideoDecodeH264ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoDecodeH264ProfileInfoKHR & operator=( VkVideoDecodeH264ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoDecodeH264ProfileInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH264ProfileInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH264ProfileInfoKHR & setStdProfileIdc( StdVideoH264ProfileIdc stdProfileIdc_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdProfileIdc = stdProfileIdc_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH264ProfileInfoKHR &\n      setPictureLayout( VULKAN_HPP_NAMESPACE::VideoDecodeH264PictureLayoutFlagBitsKHR pictureLayout_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pictureLayout = pictureLayout_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoDecodeH264ProfileInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoDecodeH264ProfileInfoKHR *>( this );\n    }\n\n    operator VkVideoDecodeH264ProfileInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoDecodeH264ProfileInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               StdVideoH264ProfileIdc const &,\n               VULKAN_HPP_NAMESPACE::VideoDecodeH264PictureLayoutFlagBitsKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stdProfileIdc, pictureLayout );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( VideoDecodeH264ProfileInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = memcmp( &stdProfileIdc, &rhs.stdProfileIdc, sizeof( StdVideoH264ProfileIdc ) ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = pictureLayout <=> rhs.pictureLayout; cmp != 0 )\n        return cmp;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( VideoDecodeH264ProfileInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memcmp( &stdProfileIdc, &rhs.stdProfileIdc, sizeof( StdVideoH264ProfileIdc ) ) == 0 ) &&\n             ( pictureLayout == rhs.pictureLayout );\n    }\n\n    bool operator!=( VideoDecodeH264ProfileInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                           sType         = StructureType::eVideoDecodeH264ProfileInfoKHR;\n    const void *                                                  pNext         = {};\n    StdVideoH264ProfileIdc                                        stdProfileIdc = {};\n    VULKAN_HPP_NAMESPACE::VideoDecodeH264PictureLayoutFlagBitsKHR pictureLayout = VULKAN_HPP_NAMESPACE::VideoDecodeH264PictureLayoutFlagBitsKHR::eProgressive;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoDecodeH264ProfileInfoKHR>\n  {\n    using Type = VideoDecodeH264ProfileInfoKHR;\n  };\n\n  struct VideoDecodeH264SessionParametersAddInfoKHR\n  {\n    using NativeType = VkVideoDecodeH264SessionParametersAddInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoDecodeH264SessionParametersAddInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoDecodeH264SessionParametersAddInfoKHR( uint32_t                                 stdSPSCount_ = {},\n                                                                     const StdVideoH264SequenceParameterSet * pStdSPSs_    = {},\n                                                                     uint32_t                                 stdPPSCount_ = {},\n                                                                     const StdVideoH264PictureParameterSet *  pStdPPSs_    = {},\n                                                                     const void *                             pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stdSPSCount{ stdSPSCount_ }\n      , pStdSPSs{ pStdSPSs_ }\n      , stdPPSCount{ stdPPSCount_ }\n      , pStdPPSs{ pStdPPSs_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoDecodeH264SessionParametersAddInfoKHR( VideoDecodeH264SessionParametersAddInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoDecodeH264SessionParametersAddInfoKHR( VkVideoDecodeH264SessionParametersAddInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoDecodeH264SessionParametersAddInfoKHR( *reinterpret_cast<VideoDecodeH264SessionParametersAddInfoKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoDecodeH264SessionParametersAddInfoKHR( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH264SequenceParameterSet> const & stdSPSs_,\n                                                VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH264PictureParameterSet> const &  stdPPSs_ = {},\n                                                const void *                                                                                  pNext_ = nullptr )\n      : pNext( pNext_ )\n      , stdSPSCount( static_cast<uint32_t>( stdSPSs_.size() ) )\n      , pStdSPSs( stdSPSs_.data() )\n      , stdPPSCount( static_cast<uint32_t>( stdPPSs_.size() ) )\n      , pStdPPSs( stdPPSs_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VideoDecodeH264SessionParametersAddInfoKHR & operator=( VideoDecodeH264SessionParametersAddInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoDecodeH264SessionParametersAddInfoKHR & operator=( VkVideoDecodeH264SessionParametersAddInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoDecodeH264SessionParametersAddInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH264SessionParametersAddInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH264SessionParametersAddInfoKHR & setStdSPSCount( uint32_t stdSPSCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdSPSCount = stdSPSCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH264SessionParametersAddInfoKHR & setPStdSPSs( const StdVideoH264SequenceParameterSet * pStdSPSs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdSPSs = pStdSPSs_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoDecodeH264SessionParametersAddInfoKHR &\n      setStdSPSs( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH264SequenceParameterSet> const & stdSPSs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdSPSCount = static_cast<uint32_t>( stdSPSs_.size() );\n      pStdSPSs    = stdSPSs_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH264SessionParametersAddInfoKHR & setStdPPSCount( uint32_t stdPPSCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdPPSCount = stdPPSCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH264SessionParametersAddInfoKHR & setPStdPPSs( const StdVideoH264PictureParameterSet * pStdPPSs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdPPSs = pStdPPSs_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoDecodeH264SessionParametersAddInfoKHR &\n      setStdPPSs( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH264PictureParameterSet> const & stdPPSs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdPPSCount = static_cast<uint32_t>( stdPPSs_.size() );\n      pStdPPSs    = stdPPSs_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoDecodeH264SessionParametersAddInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoDecodeH264SessionParametersAddInfoKHR *>( this );\n    }\n\n    operator VkVideoDecodeH264SessionParametersAddInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoDecodeH264SessionParametersAddInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const StdVideoH264SequenceParameterSet * const &,\n               uint32_t const &,\n               const StdVideoH264PictureParameterSet * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stdSPSCount, pStdSPSs, stdPPSCount, pStdPPSs );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoDecodeH264SessionParametersAddInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoDecodeH264SessionParametersAddInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( stdSPSCount == rhs.stdSPSCount ) && ( pStdSPSs == rhs.pStdSPSs ) &&\n             ( stdPPSCount == rhs.stdPPSCount ) && ( pStdPPSs == rhs.pStdPPSs );\n#  endif\n    }\n\n    bool operator!=( VideoDecodeH264SessionParametersAddInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType      sType       = StructureType::eVideoDecodeH264SessionParametersAddInfoKHR;\n    const void *                             pNext       = {};\n    uint32_t                                 stdSPSCount = {};\n    const StdVideoH264SequenceParameterSet * pStdSPSs    = {};\n    uint32_t                                 stdPPSCount = {};\n    const StdVideoH264PictureParameterSet *  pStdPPSs    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoDecodeH264SessionParametersAddInfoKHR>\n  {\n    using Type = VideoDecodeH264SessionParametersAddInfoKHR;\n  };\n\n  struct VideoDecodeH264SessionParametersCreateInfoKHR\n  {\n    using NativeType = VkVideoDecodeH264SessionParametersCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoDecodeH264SessionParametersCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      VideoDecodeH264SessionParametersCreateInfoKHR( uint32_t                                                                 maxStdSPSCount_     = {},\n                                                     uint32_t                                                                 maxStdPPSCount_     = {},\n                                                     const VULKAN_HPP_NAMESPACE::VideoDecodeH264SessionParametersAddInfoKHR * pParametersAddInfo_ = {},\n                                                     const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxStdSPSCount{ maxStdSPSCount_ }\n      , maxStdPPSCount{ maxStdPPSCount_ }\n      , pParametersAddInfo{ pParametersAddInfo_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      VideoDecodeH264SessionParametersCreateInfoKHR( VideoDecodeH264SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoDecodeH264SessionParametersCreateInfoKHR( VkVideoDecodeH264SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoDecodeH264SessionParametersCreateInfoKHR( *reinterpret_cast<VideoDecodeH264SessionParametersCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoDecodeH264SessionParametersCreateInfoKHR & operator=( VideoDecodeH264SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoDecodeH264SessionParametersCreateInfoKHR & operator=( VkVideoDecodeH264SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoDecodeH264SessionParametersCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH264SessionParametersCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH264SessionParametersCreateInfoKHR & setMaxStdSPSCount( uint32_t maxStdSPSCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxStdSPSCount = maxStdSPSCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH264SessionParametersCreateInfoKHR & setMaxStdPPSCount( uint32_t maxStdPPSCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxStdPPSCount = maxStdPPSCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH264SessionParametersCreateInfoKHR &\n      setPParametersAddInfo( const VULKAN_HPP_NAMESPACE::VideoDecodeH264SessionParametersAddInfoKHR * pParametersAddInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pParametersAddInfo = pParametersAddInfo_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoDecodeH264SessionParametersCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoDecodeH264SessionParametersCreateInfoKHR *>( this );\n    }\n\n    operator VkVideoDecodeH264SessionParametersCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoDecodeH264SessionParametersCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::VideoDecodeH264SessionParametersAddInfoKHR * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxStdSPSCount, maxStdPPSCount, pParametersAddInfo );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoDecodeH264SessionParametersCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoDecodeH264SessionParametersCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxStdSPSCount == rhs.maxStdSPSCount ) && ( maxStdPPSCount == rhs.maxStdPPSCount ) &&\n             ( pParametersAddInfo == rhs.pParametersAddInfo );\n#  endif\n    }\n\n    bool operator!=( VideoDecodeH264SessionParametersCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                      sType              = StructureType::eVideoDecodeH264SessionParametersCreateInfoKHR;\n    const void *                                                             pNext              = {};\n    uint32_t                                                                 maxStdSPSCount     = {};\n    uint32_t                                                                 maxStdPPSCount     = {};\n    const VULKAN_HPP_NAMESPACE::VideoDecodeH264SessionParametersAddInfoKHR * pParametersAddInfo = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoDecodeH264SessionParametersCreateInfoKHR>\n  {\n    using Type = VideoDecodeH264SessionParametersCreateInfoKHR;\n  };\n\n  struct VideoDecodeH265CapabilitiesKHR\n  {\n    using NativeType = VkVideoDecodeH265CapabilitiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoDecodeH265CapabilitiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoDecodeH265CapabilitiesKHR( StdVideoH265LevelIdc maxLevelIdc_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxLevelIdc{ maxLevelIdc_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoDecodeH265CapabilitiesKHR( VideoDecodeH265CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoDecodeH265CapabilitiesKHR( VkVideoDecodeH265CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoDecodeH265CapabilitiesKHR( *reinterpret_cast<VideoDecodeH265CapabilitiesKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoDecodeH265CapabilitiesKHR & operator=( VideoDecodeH265CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoDecodeH265CapabilitiesKHR & operator=( VkVideoDecodeH265CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoDecodeH265CapabilitiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoDecodeH265CapabilitiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoDecodeH265CapabilitiesKHR *>( this );\n    }\n\n    operator VkVideoDecodeH265CapabilitiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoDecodeH265CapabilitiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, StdVideoH265LevelIdc const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxLevelIdc );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( VideoDecodeH265CapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = memcmp( &maxLevelIdc, &rhs.maxLevelIdc, sizeof( StdVideoH265LevelIdc ) ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( VideoDecodeH265CapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memcmp( &maxLevelIdc, &rhs.maxLevelIdc, sizeof( StdVideoH265LevelIdc ) ) == 0 );\n    }\n\n    bool operator!=( VideoDecodeH265CapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType       = StructureType::eVideoDecodeH265CapabilitiesKHR;\n    void *                              pNext       = {};\n    StdVideoH265LevelIdc                maxLevelIdc = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoDecodeH265CapabilitiesKHR>\n  {\n    using Type = VideoDecodeH265CapabilitiesKHR;\n  };\n\n  struct VideoDecodeH265DpbSlotInfoKHR\n  {\n    using NativeType = VkVideoDecodeH265DpbSlotInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoDecodeH265DpbSlotInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoDecodeH265DpbSlotInfoKHR( const StdVideoDecodeH265ReferenceInfo * pStdReferenceInfo_ = {},\n                                                        const void *                            pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pStdReferenceInfo{ pStdReferenceInfo_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoDecodeH265DpbSlotInfoKHR( VideoDecodeH265DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoDecodeH265DpbSlotInfoKHR( VkVideoDecodeH265DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoDecodeH265DpbSlotInfoKHR( *reinterpret_cast<VideoDecodeH265DpbSlotInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoDecodeH265DpbSlotInfoKHR & operator=( VideoDecodeH265DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoDecodeH265DpbSlotInfoKHR & operator=( VkVideoDecodeH265DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoDecodeH265DpbSlotInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265DpbSlotInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265DpbSlotInfoKHR &\n      setPStdReferenceInfo( const StdVideoDecodeH265ReferenceInfo * pStdReferenceInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdReferenceInfo = pStdReferenceInfo_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoDecodeH265DpbSlotInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoDecodeH265DpbSlotInfoKHR *>( this );\n    }\n\n    operator VkVideoDecodeH265DpbSlotInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoDecodeH265DpbSlotInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, const StdVideoDecodeH265ReferenceInfo * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pStdReferenceInfo );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoDecodeH265DpbSlotInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoDecodeH265DpbSlotInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pStdReferenceInfo == rhs.pStdReferenceInfo );\n#  endif\n    }\n\n    bool operator!=( VideoDecodeH265DpbSlotInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType     sType             = StructureType::eVideoDecodeH265DpbSlotInfoKHR;\n    const void *                            pNext             = {};\n    const StdVideoDecodeH265ReferenceInfo * pStdReferenceInfo = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoDecodeH265DpbSlotInfoKHR>\n  {\n    using Type = VideoDecodeH265DpbSlotInfoKHR;\n  };\n\n  struct VideoDecodeH265InlineSessionParametersInfoKHR\n  {\n    using NativeType = VkVideoDecodeH265InlineSessionParametersInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoDecodeH265InlineSessionParametersInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoDecodeH265InlineSessionParametersInfoKHR( const StdVideoH265VideoParameterSet *    pStdVPS_ = {},\n                                                                        const StdVideoH265SequenceParameterSet * pStdSPS_ = {},\n                                                                        const StdVideoH265PictureParameterSet *  pStdPPS_ = {},\n                                                                        const void *                             pNext_   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pStdVPS{ pStdVPS_ }\n      , pStdSPS{ pStdSPS_ }\n      , pStdPPS{ pStdPPS_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      VideoDecodeH265InlineSessionParametersInfoKHR( VideoDecodeH265InlineSessionParametersInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoDecodeH265InlineSessionParametersInfoKHR( VkVideoDecodeH265InlineSessionParametersInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoDecodeH265InlineSessionParametersInfoKHR( *reinterpret_cast<VideoDecodeH265InlineSessionParametersInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoDecodeH265InlineSessionParametersInfoKHR & operator=( VideoDecodeH265InlineSessionParametersInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoDecodeH265InlineSessionParametersInfoKHR & operator=( VkVideoDecodeH265InlineSessionParametersInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoDecodeH265InlineSessionParametersInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265InlineSessionParametersInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265InlineSessionParametersInfoKHR & setPStdVPS( const StdVideoH265VideoParameterSet * pStdVPS_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdVPS = pStdVPS_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265InlineSessionParametersInfoKHR & setPStdSPS( const StdVideoH265SequenceParameterSet * pStdSPS_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdSPS = pStdSPS_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265InlineSessionParametersInfoKHR & setPStdPPS( const StdVideoH265PictureParameterSet * pStdPPS_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdPPS = pStdPPS_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoDecodeH265InlineSessionParametersInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoDecodeH265InlineSessionParametersInfoKHR *>( this );\n    }\n\n    operator VkVideoDecodeH265InlineSessionParametersInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoDecodeH265InlineSessionParametersInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               const StdVideoH265VideoParameterSet * const &,\n               const StdVideoH265SequenceParameterSet * const &,\n               const StdVideoH265PictureParameterSet * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pStdVPS, pStdSPS, pStdPPS );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoDecodeH265InlineSessionParametersInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoDecodeH265InlineSessionParametersInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pStdVPS == rhs.pStdVPS ) && ( pStdSPS == rhs.pStdSPS ) && ( pStdPPS == rhs.pStdPPS );\n#  endif\n    }\n\n    bool operator!=( VideoDecodeH265InlineSessionParametersInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType      sType   = StructureType::eVideoDecodeH265InlineSessionParametersInfoKHR;\n    const void *                             pNext   = {};\n    const StdVideoH265VideoParameterSet *    pStdVPS = {};\n    const StdVideoH265SequenceParameterSet * pStdSPS = {};\n    const StdVideoH265PictureParameterSet *  pStdPPS = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoDecodeH265InlineSessionParametersInfoKHR>\n  {\n    using Type = VideoDecodeH265InlineSessionParametersInfoKHR;\n  };\n\n  struct VideoDecodeH265PictureInfoKHR\n  {\n    using NativeType = VkVideoDecodeH265PictureInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoDecodeH265PictureInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoDecodeH265PictureInfoKHR( const StdVideoDecodeH265PictureInfo * pStdPictureInfo_      = {},\n                                                        uint32_t                              sliceSegmentCount_    = {},\n                                                        const uint32_t *                      pSliceSegmentOffsets_ = {},\n                                                        const void *                          pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pStdPictureInfo{ pStdPictureInfo_ }\n      , sliceSegmentCount{ sliceSegmentCount_ }\n      , pSliceSegmentOffsets{ pSliceSegmentOffsets_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoDecodeH265PictureInfoKHR( VideoDecodeH265PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoDecodeH265PictureInfoKHR( VkVideoDecodeH265PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoDecodeH265PictureInfoKHR( *reinterpret_cast<VideoDecodeH265PictureInfoKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoDecodeH265PictureInfoKHR( const StdVideoDecodeH265PictureInfo *                                 pStdPictureInfo_,\n                                   VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & sliceSegmentOffsets_,\n                                   const void *                                                          pNext_ = nullptr )\n      : pNext( pNext_ )\n      , pStdPictureInfo( pStdPictureInfo_ )\n      , sliceSegmentCount( static_cast<uint32_t>( sliceSegmentOffsets_.size() ) )\n      , pSliceSegmentOffsets( sliceSegmentOffsets_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VideoDecodeH265PictureInfoKHR & operator=( VideoDecodeH265PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoDecodeH265PictureInfoKHR & operator=( VkVideoDecodeH265PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoDecodeH265PictureInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265PictureInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265PictureInfoKHR & setPStdPictureInfo( const StdVideoDecodeH265PictureInfo * pStdPictureInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdPictureInfo = pStdPictureInfo_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265PictureInfoKHR & setSliceSegmentCount( uint32_t sliceSegmentCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sliceSegmentCount = sliceSegmentCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265PictureInfoKHR & setPSliceSegmentOffsets( const uint32_t * pSliceSegmentOffsets_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSliceSegmentOffsets = pSliceSegmentOffsets_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoDecodeH265PictureInfoKHR &\n      setSliceSegmentOffsets( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & sliceSegmentOffsets_ ) VULKAN_HPP_NOEXCEPT\n    {\n      sliceSegmentCount    = static_cast<uint32_t>( sliceSegmentOffsets_.size() );\n      pSliceSegmentOffsets = sliceSegmentOffsets_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoDecodeH265PictureInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoDecodeH265PictureInfoKHR *>( this );\n    }\n\n    operator VkVideoDecodeH265PictureInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoDecodeH265PictureInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               const StdVideoDecodeH265PictureInfo * const &,\n               uint32_t const &,\n               const uint32_t * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pStdPictureInfo, sliceSegmentCount, pSliceSegmentOffsets );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoDecodeH265PictureInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoDecodeH265PictureInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pStdPictureInfo == rhs.pStdPictureInfo ) && ( sliceSegmentCount == rhs.sliceSegmentCount ) &&\n             ( pSliceSegmentOffsets == rhs.pSliceSegmentOffsets );\n#  endif\n    }\n\n    bool operator!=( VideoDecodeH265PictureInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType   sType                = StructureType::eVideoDecodeH265PictureInfoKHR;\n    const void *                          pNext                = {};\n    const StdVideoDecodeH265PictureInfo * pStdPictureInfo      = {};\n    uint32_t                              sliceSegmentCount    = {};\n    const uint32_t *                      pSliceSegmentOffsets = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoDecodeH265PictureInfoKHR>\n  {\n    using Type = VideoDecodeH265PictureInfoKHR;\n  };\n\n  struct VideoDecodeH265ProfileInfoKHR\n  {\n    using NativeType = VkVideoDecodeH265ProfileInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoDecodeH265ProfileInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoDecodeH265ProfileInfoKHR( StdVideoH265ProfileIdc stdProfileIdc_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stdProfileIdc{ stdProfileIdc_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoDecodeH265ProfileInfoKHR( VideoDecodeH265ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoDecodeH265ProfileInfoKHR( VkVideoDecodeH265ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoDecodeH265ProfileInfoKHR( *reinterpret_cast<VideoDecodeH265ProfileInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoDecodeH265ProfileInfoKHR & operator=( VideoDecodeH265ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoDecodeH265ProfileInfoKHR & operator=( VkVideoDecodeH265ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoDecodeH265ProfileInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265ProfileInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265ProfileInfoKHR & setStdProfileIdc( StdVideoH265ProfileIdc stdProfileIdc_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdProfileIdc = stdProfileIdc_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoDecodeH265ProfileInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoDecodeH265ProfileInfoKHR *>( this );\n    }\n\n    operator VkVideoDecodeH265ProfileInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoDecodeH265ProfileInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, StdVideoH265ProfileIdc const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stdProfileIdc );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( VideoDecodeH265ProfileInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = memcmp( &stdProfileIdc, &rhs.stdProfileIdc, sizeof( StdVideoH265ProfileIdc ) ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( VideoDecodeH265ProfileInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memcmp( &stdProfileIdc, &rhs.stdProfileIdc, sizeof( StdVideoH265ProfileIdc ) ) == 0 );\n    }\n\n    bool operator!=( VideoDecodeH265ProfileInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType         = StructureType::eVideoDecodeH265ProfileInfoKHR;\n    const void *                        pNext         = {};\n    StdVideoH265ProfileIdc              stdProfileIdc = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoDecodeH265ProfileInfoKHR>\n  {\n    using Type = VideoDecodeH265ProfileInfoKHR;\n  };\n\n  struct VideoDecodeH265SessionParametersAddInfoKHR\n  {\n    using NativeType = VkVideoDecodeH265SessionParametersAddInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoDecodeH265SessionParametersAddInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoDecodeH265SessionParametersAddInfoKHR( uint32_t                                 stdVPSCount_ = {},\n                                                                     const StdVideoH265VideoParameterSet *    pStdVPSs_    = {},\n                                                                     uint32_t                                 stdSPSCount_ = {},\n                                                                     const StdVideoH265SequenceParameterSet * pStdSPSs_    = {},\n                                                                     uint32_t                                 stdPPSCount_ = {},\n                                                                     const StdVideoH265PictureParameterSet *  pStdPPSs_    = {},\n                                                                     const void *                             pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stdVPSCount{ stdVPSCount_ }\n      , pStdVPSs{ pStdVPSs_ }\n      , stdSPSCount{ stdSPSCount_ }\n      , pStdSPSs{ pStdSPSs_ }\n      , stdPPSCount{ stdPPSCount_ }\n      , pStdPPSs{ pStdPPSs_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoDecodeH265SessionParametersAddInfoKHR( VideoDecodeH265SessionParametersAddInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoDecodeH265SessionParametersAddInfoKHR( VkVideoDecodeH265SessionParametersAddInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoDecodeH265SessionParametersAddInfoKHR( *reinterpret_cast<VideoDecodeH265SessionParametersAddInfoKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoDecodeH265SessionParametersAddInfoKHR( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH265VideoParameterSet> const &    stdVPSs_,\n                                                VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH265SequenceParameterSet> const & stdSPSs_ = {},\n                                                VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH265PictureParameterSet> const &  stdPPSs_ = {},\n                                                const void *                                                                                  pNext_ = nullptr )\n      : pNext( pNext_ )\n      , stdVPSCount( static_cast<uint32_t>( stdVPSs_.size() ) )\n      , pStdVPSs( stdVPSs_.data() )\n      , stdSPSCount( static_cast<uint32_t>( stdSPSs_.size() ) )\n      , pStdSPSs( stdSPSs_.data() )\n      , stdPPSCount( static_cast<uint32_t>( stdPPSs_.size() ) )\n      , pStdPPSs( stdPPSs_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VideoDecodeH265SessionParametersAddInfoKHR & operator=( VideoDecodeH265SessionParametersAddInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoDecodeH265SessionParametersAddInfoKHR & operator=( VkVideoDecodeH265SessionParametersAddInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoDecodeH265SessionParametersAddInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265SessionParametersAddInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265SessionParametersAddInfoKHR & setStdVPSCount( uint32_t stdVPSCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdVPSCount = stdVPSCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265SessionParametersAddInfoKHR & setPStdVPSs( const StdVideoH265VideoParameterSet * pStdVPSs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdVPSs = pStdVPSs_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoDecodeH265SessionParametersAddInfoKHR &\n      setStdVPSs( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH265VideoParameterSet> const & stdVPSs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdVPSCount = static_cast<uint32_t>( stdVPSs_.size() );\n      pStdVPSs    = stdVPSs_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265SessionParametersAddInfoKHR & setStdSPSCount( uint32_t stdSPSCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdSPSCount = stdSPSCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265SessionParametersAddInfoKHR & setPStdSPSs( const StdVideoH265SequenceParameterSet * pStdSPSs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdSPSs = pStdSPSs_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoDecodeH265SessionParametersAddInfoKHR &\n      setStdSPSs( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH265SequenceParameterSet> const & stdSPSs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdSPSCount = static_cast<uint32_t>( stdSPSs_.size() );\n      pStdSPSs    = stdSPSs_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265SessionParametersAddInfoKHR & setStdPPSCount( uint32_t stdPPSCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdPPSCount = stdPPSCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265SessionParametersAddInfoKHR & setPStdPPSs( const StdVideoH265PictureParameterSet * pStdPPSs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdPPSs = pStdPPSs_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoDecodeH265SessionParametersAddInfoKHR &\n      setStdPPSs( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH265PictureParameterSet> const & stdPPSs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdPPSCount = static_cast<uint32_t>( stdPPSs_.size() );\n      pStdPPSs    = stdPPSs_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoDecodeH265SessionParametersAddInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoDecodeH265SessionParametersAddInfoKHR *>( this );\n    }\n\n    operator VkVideoDecodeH265SessionParametersAddInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoDecodeH265SessionParametersAddInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const StdVideoH265VideoParameterSet * const &,\n               uint32_t const &,\n               const StdVideoH265SequenceParameterSet * const &,\n               uint32_t const &,\n               const StdVideoH265PictureParameterSet * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stdVPSCount, pStdVPSs, stdSPSCount, pStdSPSs, stdPPSCount, pStdPPSs );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoDecodeH265SessionParametersAddInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoDecodeH265SessionParametersAddInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( stdVPSCount == rhs.stdVPSCount ) && ( pStdVPSs == rhs.pStdVPSs ) &&\n             ( stdSPSCount == rhs.stdSPSCount ) && ( pStdSPSs == rhs.pStdSPSs ) && ( stdPPSCount == rhs.stdPPSCount ) && ( pStdPPSs == rhs.pStdPPSs );\n#  endif\n    }\n\n    bool operator!=( VideoDecodeH265SessionParametersAddInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType      sType       = StructureType::eVideoDecodeH265SessionParametersAddInfoKHR;\n    const void *                             pNext       = {};\n    uint32_t                                 stdVPSCount = {};\n    const StdVideoH265VideoParameterSet *    pStdVPSs    = {};\n    uint32_t                                 stdSPSCount = {};\n    const StdVideoH265SequenceParameterSet * pStdSPSs    = {};\n    uint32_t                                 stdPPSCount = {};\n    const StdVideoH265PictureParameterSet *  pStdPPSs    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoDecodeH265SessionParametersAddInfoKHR>\n  {\n    using Type = VideoDecodeH265SessionParametersAddInfoKHR;\n  };\n\n  struct VideoDecodeH265SessionParametersCreateInfoKHR\n  {\n    using NativeType = VkVideoDecodeH265SessionParametersCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoDecodeH265SessionParametersCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      VideoDecodeH265SessionParametersCreateInfoKHR( uint32_t                                                                 maxStdVPSCount_     = {},\n                                                     uint32_t                                                                 maxStdSPSCount_     = {},\n                                                     uint32_t                                                                 maxStdPPSCount_     = {},\n                                                     const VULKAN_HPP_NAMESPACE::VideoDecodeH265SessionParametersAddInfoKHR * pParametersAddInfo_ = {},\n                                                     const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxStdVPSCount{ maxStdVPSCount_ }\n      , maxStdSPSCount{ maxStdSPSCount_ }\n      , maxStdPPSCount{ maxStdPPSCount_ }\n      , pParametersAddInfo{ pParametersAddInfo_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      VideoDecodeH265SessionParametersCreateInfoKHR( VideoDecodeH265SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoDecodeH265SessionParametersCreateInfoKHR( VkVideoDecodeH265SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoDecodeH265SessionParametersCreateInfoKHR( *reinterpret_cast<VideoDecodeH265SessionParametersCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoDecodeH265SessionParametersCreateInfoKHR & operator=( VideoDecodeH265SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoDecodeH265SessionParametersCreateInfoKHR & operator=( VkVideoDecodeH265SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoDecodeH265SessionParametersCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265SessionParametersCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265SessionParametersCreateInfoKHR & setMaxStdVPSCount( uint32_t maxStdVPSCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxStdVPSCount = maxStdVPSCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265SessionParametersCreateInfoKHR & setMaxStdSPSCount( uint32_t maxStdSPSCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxStdSPSCount = maxStdSPSCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265SessionParametersCreateInfoKHR & setMaxStdPPSCount( uint32_t maxStdPPSCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxStdPPSCount = maxStdPPSCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeH265SessionParametersCreateInfoKHR &\n      setPParametersAddInfo( const VULKAN_HPP_NAMESPACE::VideoDecodeH265SessionParametersAddInfoKHR * pParametersAddInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pParametersAddInfo = pParametersAddInfo_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoDecodeH265SessionParametersCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoDecodeH265SessionParametersCreateInfoKHR *>( this );\n    }\n\n    operator VkVideoDecodeH265SessionParametersCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoDecodeH265SessionParametersCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::VideoDecodeH265SessionParametersAddInfoKHR * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxStdVPSCount, maxStdSPSCount, maxStdPPSCount, pParametersAddInfo );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoDecodeH265SessionParametersCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoDecodeH265SessionParametersCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxStdVPSCount == rhs.maxStdVPSCount ) && ( maxStdSPSCount == rhs.maxStdSPSCount ) &&\n             ( maxStdPPSCount == rhs.maxStdPPSCount ) && ( pParametersAddInfo == rhs.pParametersAddInfo );\n#  endif\n    }\n\n    bool operator!=( VideoDecodeH265SessionParametersCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                      sType              = StructureType::eVideoDecodeH265SessionParametersCreateInfoKHR;\n    const void *                                                             pNext              = {};\n    uint32_t                                                                 maxStdVPSCount     = {};\n    uint32_t                                                                 maxStdSPSCount     = {};\n    uint32_t                                                                 maxStdPPSCount     = {};\n    const VULKAN_HPP_NAMESPACE::VideoDecodeH265SessionParametersAddInfoKHR * pParametersAddInfo = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoDecodeH265SessionParametersCreateInfoKHR>\n  {\n    using Type = VideoDecodeH265SessionParametersCreateInfoKHR;\n  };\n\n  struct VideoDecodeInfoKHR\n  {\n    using NativeType = VkVideoDecodeInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoDecodeInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoDecodeInfoKHR( VULKAN_HPP_NAMESPACE::VideoDecodeFlagsKHR               flags_               = {},\n                                             VULKAN_HPP_NAMESPACE::Buffer                            srcBuffer_           = {},\n                                             VULKAN_HPP_NAMESPACE::DeviceSize                        srcBufferOffset_     = {},\n                                             VULKAN_HPP_NAMESPACE::DeviceSize                        srcBufferRange_      = {},\n                                             VULKAN_HPP_NAMESPACE::VideoPictureResourceInfoKHR       dstPictureResource_  = {},\n                                             const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR * pSetupReferenceSlot_ = {},\n                                             uint32_t                                                referenceSlotCount_  = {},\n                                             const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR * pReferenceSlots_     = {},\n                                             const void *                                            pNext_               = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , srcBuffer{ srcBuffer_ }\n      , srcBufferOffset{ srcBufferOffset_ }\n      , srcBufferRange{ srcBufferRange_ }\n      , dstPictureResource{ dstPictureResource_ }\n      , pSetupReferenceSlot{ pSetupReferenceSlot_ }\n      , referenceSlotCount{ referenceSlotCount_ }\n      , pReferenceSlots{ pReferenceSlots_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoDecodeInfoKHR( VideoDecodeInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoDecodeInfoKHR( VkVideoDecodeInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT : VideoDecodeInfoKHR( *reinterpret_cast<VideoDecodeInfoKHR const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoDecodeInfoKHR( VULKAN_HPP_NAMESPACE::VideoDecodeFlagsKHR                                                                    flags_,\n                        VULKAN_HPP_NAMESPACE::Buffer                                                                                 srcBuffer_,\n                        VULKAN_HPP_NAMESPACE::DeviceSize                                                                             srcBufferOffset_,\n                        VULKAN_HPP_NAMESPACE::DeviceSize                                                                             srcBufferRange_,\n                        VULKAN_HPP_NAMESPACE::VideoPictureResourceInfoKHR                                                            dstPictureResource_,\n                        const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR *                                                      pSetupReferenceSlot_,\n                        VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR> const & referenceSlots_,\n                        const void *                                                                                                 pNext_ = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , srcBuffer( srcBuffer_ )\n      , srcBufferOffset( srcBufferOffset_ )\n      , srcBufferRange( srcBufferRange_ )\n      , dstPictureResource( dstPictureResource_ )\n      , pSetupReferenceSlot( pSetupReferenceSlot_ )\n      , referenceSlotCount( static_cast<uint32_t>( referenceSlots_.size() ) )\n      , pReferenceSlots( referenceSlots_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VideoDecodeInfoKHR & operator=( VideoDecodeInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoDecodeInfoKHR & operator=( VkVideoDecodeInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoDecodeInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::VideoDecodeFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeInfoKHR & setSrcBuffer( VULKAN_HPP_NAMESPACE::Buffer srcBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcBuffer = srcBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeInfoKHR & setSrcBufferOffset( VULKAN_HPP_NAMESPACE::DeviceSize srcBufferOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcBufferOffset = srcBufferOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeInfoKHR & setSrcBufferRange( VULKAN_HPP_NAMESPACE::DeviceSize srcBufferRange_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcBufferRange = srcBufferRange_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeInfoKHR &\n      setDstPictureResource( VULKAN_HPP_NAMESPACE::VideoPictureResourceInfoKHR const & dstPictureResource_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstPictureResource = dstPictureResource_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeInfoKHR &\n      setPSetupReferenceSlot( const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR * pSetupReferenceSlot_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSetupReferenceSlot = pSetupReferenceSlot_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeInfoKHR & setReferenceSlotCount( uint32_t referenceSlotCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      referenceSlotCount = referenceSlotCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeInfoKHR &\n      setPReferenceSlots( const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR * pReferenceSlots_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pReferenceSlots = pReferenceSlots_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoDecodeInfoKHR & setReferenceSlots(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR> const & referenceSlots_ ) VULKAN_HPP_NOEXCEPT\n    {\n      referenceSlotCount = static_cast<uint32_t>( referenceSlots_.size() );\n      pReferenceSlots    = referenceSlots_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoDecodeInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoDecodeInfoKHR *>( this );\n    }\n\n    operator VkVideoDecodeInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoDecodeInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::VideoDecodeFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::Buffer const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::VideoPictureResourceInfoKHR const &,\n               const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie(\n        sType, pNext, flags, srcBuffer, srcBufferOffset, srcBufferRange, dstPictureResource, pSetupReferenceSlot, referenceSlotCount, pReferenceSlots );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoDecodeInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoDecodeInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( srcBuffer == rhs.srcBuffer ) &&\n             ( srcBufferOffset == rhs.srcBufferOffset ) && ( srcBufferRange == rhs.srcBufferRange ) && ( dstPictureResource == rhs.dstPictureResource ) &&\n             ( pSetupReferenceSlot == rhs.pSetupReferenceSlot ) && ( referenceSlotCount == rhs.referenceSlotCount ) &&\n             ( pReferenceSlots == rhs.pReferenceSlots );\n#  endif\n    }\n\n    bool operator!=( VideoDecodeInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                     sType               = StructureType::eVideoDecodeInfoKHR;\n    const void *                                            pNext               = {};\n    VULKAN_HPP_NAMESPACE::VideoDecodeFlagsKHR               flags               = {};\n    VULKAN_HPP_NAMESPACE::Buffer                            srcBuffer           = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                        srcBufferOffset     = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                        srcBufferRange      = {};\n    VULKAN_HPP_NAMESPACE::VideoPictureResourceInfoKHR       dstPictureResource  = {};\n    const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR * pSetupReferenceSlot = {};\n    uint32_t                                                referenceSlotCount  = {};\n    const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR * pReferenceSlots     = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoDecodeInfoKHR>\n  {\n    using Type = VideoDecodeInfoKHR;\n  };\n\n  struct VideoDecodeUsageInfoKHR\n  {\n    using NativeType = VkVideoDecodeUsageInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoDecodeUsageInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoDecodeUsageInfoKHR( VULKAN_HPP_NAMESPACE::VideoDecodeUsageFlagsKHR videoUsageHints_ = {},\n                                                  const void *                                   pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , videoUsageHints{ videoUsageHints_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoDecodeUsageInfoKHR( VideoDecodeUsageInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoDecodeUsageInfoKHR( VkVideoDecodeUsageInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoDecodeUsageInfoKHR( *reinterpret_cast<VideoDecodeUsageInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoDecodeUsageInfoKHR & operator=( VideoDecodeUsageInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoDecodeUsageInfoKHR & operator=( VkVideoDecodeUsageInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoDecodeUsageInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeUsageInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoDecodeUsageInfoKHR & setVideoUsageHints( VULKAN_HPP_NAMESPACE::VideoDecodeUsageFlagsKHR videoUsageHints_ ) VULKAN_HPP_NOEXCEPT\n    {\n      videoUsageHints = videoUsageHints_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoDecodeUsageInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoDecodeUsageInfoKHR *>( this );\n    }\n\n    operator VkVideoDecodeUsageInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoDecodeUsageInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::VideoDecodeUsageFlagsKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, videoUsageHints );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoDecodeUsageInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoDecodeUsageInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( videoUsageHints == rhs.videoUsageHints );\n#  endif\n    }\n\n    bool operator!=( VideoDecodeUsageInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType            sType           = StructureType::eVideoDecodeUsageInfoKHR;\n    const void *                                   pNext           = {};\n    VULKAN_HPP_NAMESPACE::VideoDecodeUsageFlagsKHR videoUsageHints = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoDecodeUsageInfoKHR>\n  {\n    using Type = VideoDecodeUsageInfoKHR;\n  };\n\n  struct VideoEncodeAV1CapabilitiesKHR\n  {\n    using NativeType = VkVideoEncodeAV1CapabilitiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeAv1CapabilitiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeAV1CapabilitiesKHR( VULKAN_HPP_NAMESPACE::VideoEncodeAV1CapabilityFlagsKHR     flags_                              = {},\n                                                        StdVideoAV1Level                                           maxLevel_                           = {},\n                                                        VULKAN_HPP_NAMESPACE::Extent2D                             codedPictureAlignment_              = {},\n                                                        VULKAN_HPP_NAMESPACE::Extent2D                             maxTiles_                           = {},\n                                                        VULKAN_HPP_NAMESPACE::Extent2D                             minTileSize_                        = {},\n                                                        VULKAN_HPP_NAMESPACE::Extent2D                             maxTileSize_                        = {},\n                                                        VULKAN_HPP_NAMESPACE::VideoEncodeAV1SuperblockSizeFlagsKHR superblockSizes_                    = {},\n                                                        uint32_t                                                   maxSingleReferenceCount_            = {},\n                                                        uint32_t                                                   singleReferenceNameMask_            = {},\n                                                        uint32_t                                        maxUnidirectionalCompoundReferenceCount_       = {},\n                                                        uint32_t                                        maxUnidirectionalCompoundGroup1ReferenceCount_ = {},\n                                                        uint32_t                                        unidirectionalCompoundReferenceNameMask_       = {},\n                                                        uint32_t                                        maxBidirectionalCompoundReferenceCount_        = {},\n                                                        uint32_t                                        maxBidirectionalCompoundGroup1ReferenceCount_  = {},\n                                                        uint32_t                                        maxBidirectionalCompoundGroup2ReferenceCount_  = {},\n                                                        uint32_t                                        bidirectionalCompoundReferenceNameMask_        = {},\n                                                        uint32_t                                        maxTemporalLayerCount_                         = {},\n                                                        uint32_t                                        maxSpatialLayerCount_                          = {},\n                                                        uint32_t                                        maxOperatingPoints_                            = {},\n                                                        uint32_t                                        minQIndex_                                     = {},\n                                                        uint32_t                                        maxQIndex_                                     = {},\n                                                        VULKAN_HPP_NAMESPACE::Bool32                    prefersGopRemainingFrames_                     = {},\n                                                        VULKAN_HPP_NAMESPACE::Bool32                    requiresGopRemainingFrames_                    = {},\n                                                        VULKAN_HPP_NAMESPACE::VideoEncodeAV1StdFlagsKHR stdSyntaxFlags_                                = {},\n                                                        void *                                          pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , maxLevel{ maxLevel_ }\n      , codedPictureAlignment{ codedPictureAlignment_ }\n      , maxTiles{ maxTiles_ }\n      , minTileSize{ minTileSize_ }\n      , maxTileSize{ maxTileSize_ }\n      , superblockSizes{ superblockSizes_ }\n      , maxSingleReferenceCount{ maxSingleReferenceCount_ }\n      , singleReferenceNameMask{ singleReferenceNameMask_ }\n      , maxUnidirectionalCompoundReferenceCount{ maxUnidirectionalCompoundReferenceCount_ }\n      , maxUnidirectionalCompoundGroup1ReferenceCount{ maxUnidirectionalCompoundGroup1ReferenceCount_ }\n      , unidirectionalCompoundReferenceNameMask{ unidirectionalCompoundReferenceNameMask_ }\n      , maxBidirectionalCompoundReferenceCount{ maxBidirectionalCompoundReferenceCount_ }\n      , maxBidirectionalCompoundGroup1ReferenceCount{ maxBidirectionalCompoundGroup1ReferenceCount_ }\n      , maxBidirectionalCompoundGroup2ReferenceCount{ maxBidirectionalCompoundGroup2ReferenceCount_ }\n      , bidirectionalCompoundReferenceNameMask{ bidirectionalCompoundReferenceNameMask_ }\n      , maxTemporalLayerCount{ maxTemporalLayerCount_ }\n      , maxSpatialLayerCount{ maxSpatialLayerCount_ }\n      , maxOperatingPoints{ maxOperatingPoints_ }\n      , minQIndex{ minQIndex_ }\n      , maxQIndex{ maxQIndex_ }\n      , prefersGopRemainingFrames{ prefersGopRemainingFrames_ }\n      , requiresGopRemainingFrames{ requiresGopRemainingFrames_ }\n      , stdSyntaxFlags{ stdSyntaxFlags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeAV1CapabilitiesKHR( VideoEncodeAV1CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeAV1CapabilitiesKHR( VkVideoEncodeAV1CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeAV1CapabilitiesKHR( *reinterpret_cast<VideoEncodeAV1CapabilitiesKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeAV1CapabilitiesKHR & operator=( VideoEncodeAV1CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeAV1CapabilitiesKHR & operator=( VkVideoEncodeAV1CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeAV1CapabilitiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoEncodeAV1CapabilitiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeAV1CapabilitiesKHR *>( this );\n    }\n\n    operator VkVideoEncodeAV1CapabilitiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeAV1CapabilitiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeAV1CapabilityFlagsKHR const &,\n               StdVideoAV1Level const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeAV1SuperblockSizeFlagsKHR const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeAV1StdFlagsKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       flags,\n                       maxLevel,\n                       codedPictureAlignment,\n                       maxTiles,\n                       minTileSize,\n                       maxTileSize,\n                       superblockSizes,\n                       maxSingleReferenceCount,\n                       singleReferenceNameMask,\n                       maxUnidirectionalCompoundReferenceCount,\n                       maxUnidirectionalCompoundGroup1ReferenceCount,\n                       unidirectionalCompoundReferenceNameMask,\n                       maxBidirectionalCompoundReferenceCount,\n                       maxBidirectionalCompoundGroup1ReferenceCount,\n                       maxBidirectionalCompoundGroup2ReferenceCount,\n                       bidirectionalCompoundReferenceNameMask,\n                       maxTemporalLayerCount,\n                       maxSpatialLayerCount,\n                       maxOperatingPoints,\n                       minQIndex,\n                       maxQIndex,\n                       prefersGopRemainingFrames,\n                       requiresGopRemainingFrames,\n                       stdSyntaxFlags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( VideoEncodeAV1CapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = flags <=> rhs.flags; cmp != 0 )\n        return cmp;\n      if ( auto cmp = memcmp( &maxLevel, &rhs.maxLevel, sizeof( StdVideoAV1Level ) ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = codedPictureAlignment <=> rhs.codedPictureAlignment; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxTiles <=> rhs.maxTiles; cmp != 0 )\n        return cmp;\n      if ( auto cmp = minTileSize <=> rhs.minTileSize; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxTileSize <=> rhs.maxTileSize; cmp != 0 )\n        return cmp;\n      if ( auto cmp = superblockSizes <=> rhs.superblockSizes; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxSingleReferenceCount <=> rhs.maxSingleReferenceCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = singleReferenceNameMask <=> rhs.singleReferenceNameMask; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxUnidirectionalCompoundReferenceCount <=> rhs.maxUnidirectionalCompoundReferenceCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxUnidirectionalCompoundGroup1ReferenceCount <=> rhs.maxUnidirectionalCompoundGroup1ReferenceCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = unidirectionalCompoundReferenceNameMask <=> rhs.unidirectionalCompoundReferenceNameMask; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxBidirectionalCompoundReferenceCount <=> rhs.maxBidirectionalCompoundReferenceCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxBidirectionalCompoundGroup1ReferenceCount <=> rhs.maxBidirectionalCompoundGroup1ReferenceCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxBidirectionalCompoundGroup2ReferenceCount <=> rhs.maxBidirectionalCompoundGroup2ReferenceCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = bidirectionalCompoundReferenceNameMask <=> rhs.bidirectionalCompoundReferenceNameMask; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxTemporalLayerCount <=> rhs.maxTemporalLayerCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxSpatialLayerCount <=> rhs.maxSpatialLayerCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxOperatingPoints <=> rhs.maxOperatingPoints; cmp != 0 )\n        return cmp;\n      if ( auto cmp = minQIndex <=> rhs.minQIndex; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxQIndex <=> rhs.maxQIndex; cmp != 0 )\n        return cmp;\n      if ( auto cmp = prefersGopRemainingFrames <=> rhs.prefersGopRemainingFrames; cmp != 0 )\n        return cmp;\n      if ( auto cmp = requiresGopRemainingFrames <=> rhs.requiresGopRemainingFrames; cmp != 0 )\n        return cmp;\n      if ( auto cmp = stdSyntaxFlags <=> rhs.stdSyntaxFlags; cmp != 0 )\n        return cmp;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( VideoEncodeAV1CapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) &&\n             ( memcmp( &maxLevel, &rhs.maxLevel, sizeof( StdVideoAV1Level ) ) == 0 ) && ( codedPictureAlignment == rhs.codedPictureAlignment ) &&\n             ( maxTiles == rhs.maxTiles ) && ( minTileSize == rhs.minTileSize ) && ( maxTileSize == rhs.maxTileSize ) &&\n             ( superblockSizes == rhs.superblockSizes ) && ( maxSingleReferenceCount == rhs.maxSingleReferenceCount ) &&\n             ( singleReferenceNameMask == rhs.singleReferenceNameMask ) &&\n             ( maxUnidirectionalCompoundReferenceCount == rhs.maxUnidirectionalCompoundReferenceCount ) &&\n             ( maxUnidirectionalCompoundGroup1ReferenceCount == rhs.maxUnidirectionalCompoundGroup1ReferenceCount ) &&\n             ( unidirectionalCompoundReferenceNameMask == rhs.unidirectionalCompoundReferenceNameMask ) &&\n             ( maxBidirectionalCompoundReferenceCount == rhs.maxBidirectionalCompoundReferenceCount ) &&\n             ( maxBidirectionalCompoundGroup1ReferenceCount == rhs.maxBidirectionalCompoundGroup1ReferenceCount ) &&\n             ( maxBidirectionalCompoundGroup2ReferenceCount == rhs.maxBidirectionalCompoundGroup2ReferenceCount ) &&\n             ( bidirectionalCompoundReferenceNameMask == rhs.bidirectionalCompoundReferenceNameMask ) &&\n             ( maxTemporalLayerCount == rhs.maxTemporalLayerCount ) && ( maxSpatialLayerCount == rhs.maxSpatialLayerCount ) &&\n             ( maxOperatingPoints == rhs.maxOperatingPoints ) && ( minQIndex == rhs.minQIndex ) && ( maxQIndex == rhs.maxQIndex ) &&\n             ( prefersGopRemainingFrames == rhs.prefersGopRemainingFrames ) && ( requiresGopRemainingFrames == rhs.requiresGopRemainingFrames ) &&\n             ( stdSyntaxFlags == rhs.stdSyntaxFlags );\n    }\n\n    bool operator!=( VideoEncodeAV1CapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                        sType                                         = StructureType::eVideoEncodeAv1CapabilitiesKHR;\n    void *                                                     pNext                                         = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeAV1CapabilityFlagsKHR     flags                                         = {};\n    StdVideoAV1Level                                           maxLevel                                      = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                             codedPictureAlignment                         = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                             maxTiles                                      = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                             minTileSize                                   = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                             maxTileSize                                   = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeAV1SuperblockSizeFlagsKHR superblockSizes                               = {};\n    uint32_t                                                   maxSingleReferenceCount                       = {};\n    uint32_t                                                   singleReferenceNameMask                       = {};\n    uint32_t                                                   maxUnidirectionalCompoundReferenceCount       = {};\n    uint32_t                                                   maxUnidirectionalCompoundGroup1ReferenceCount = {};\n    uint32_t                                                   unidirectionalCompoundReferenceNameMask       = {};\n    uint32_t                                                   maxBidirectionalCompoundReferenceCount        = {};\n    uint32_t                                                   maxBidirectionalCompoundGroup1ReferenceCount  = {};\n    uint32_t                                                   maxBidirectionalCompoundGroup2ReferenceCount  = {};\n    uint32_t                                                   bidirectionalCompoundReferenceNameMask        = {};\n    uint32_t                                                   maxTemporalLayerCount                         = {};\n    uint32_t                                                   maxSpatialLayerCount                          = {};\n    uint32_t                                                   maxOperatingPoints                            = {};\n    uint32_t                                                   minQIndex                                     = {};\n    uint32_t                                                   maxQIndex                                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32                               prefersGopRemainingFrames                     = {};\n    VULKAN_HPP_NAMESPACE::Bool32                               requiresGopRemainingFrames                    = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeAV1StdFlagsKHR            stdSyntaxFlags                                = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeAv1CapabilitiesKHR>\n  {\n    using Type = VideoEncodeAV1CapabilitiesKHR;\n  };\n\n  struct VideoEncodeAV1DpbSlotInfoKHR\n  {\n    using NativeType = VkVideoEncodeAV1DpbSlotInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeAv1DpbSlotInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeAV1DpbSlotInfoKHR( const StdVideoEncodeAV1ReferenceInfo * pStdReferenceInfo_ = {},\n                                                       const void *                           pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pStdReferenceInfo{ pStdReferenceInfo_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeAV1DpbSlotInfoKHR( VideoEncodeAV1DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeAV1DpbSlotInfoKHR( VkVideoEncodeAV1DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeAV1DpbSlotInfoKHR( *reinterpret_cast<VideoEncodeAV1DpbSlotInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeAV1DpbSlotInfoKHR & operator=( VideoEncodeAV1DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeAV1DpbSlotInfoKHR & operator=( VkVideoEncodeAV1DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeAV1DpbSlotInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1DpbSlotInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1DpbSlotInfoKHR & setPStdReferenceInfo( const StdVideoEncodeAV1ReferenceInfo * pStdReferenceInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdReferenceInfo = pStdReferenceInfo_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeAV1DpbSlotInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeAV1DpbSlotInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeAV1DpbSlotInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeAV1DpbSlotInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, const StdVideoEncodeAV1ReferenceInfo * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pStdReferenceInfo );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeAV1DpbSlotInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeAV1DpbSlotInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pStdReferenceInfo == rhs.pStdReferenceInfo );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeAV1DpbSlotInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType             = StructureType::eVideoEncodeAv1DpbSlotInfoKHR;\n    const void *                           pNext             = {};\n    const StdVideoEncodeAV1ReferenceInfo * pStdReferenceInfo = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeAv1DpbSlotInfoKHR>\n  {\n    using Type = VideoEncodeAV1DpbSlotInfoKHR;\n  };\n\n  struct VideoEncodeAV1FrameSizeKHR\n  {\n    using NativeType = VkVideoEncodeAV1FrameSizeKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      VideoEncodeAV1FrameSizeKHR( uint32_t intraFrameSize_ = {}, uint32_t predictiveFrameSize_ = {}, uint32_t bipredictiveFrameSize_ = {} ) VULKAN_HPP_NOEXCEPT\n      : intraFrameSize{ intraFrameSize_ }\n      , predictiveFrameSize{ predictiveFrameSize_ }\n      , bipredictiveFrameSize{ bipredictiveFrameSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeAV1FrameSizeKHR( VideoEncodeAV1FrameSizeKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeAV1FrameSizeKHR( VkVideoEncodeAV1FrameSizeKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeAV1FrameSizeKHR( *reinterpret_cast<VideoEncodeAV1FrameSizeKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeAV1FrameSizeKHR & operator=( VideoEncodeAV1FrameSizeKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeAV1FrameSizeKHR & operator=( VkVideoEncodeAV1FrameSizeKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeAV1FrameSizeKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1FrameSizeKHR & setIntraFrameSize( uint32_t intraFrameSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      intraFrameSize = intraFrameSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1FrameSizeKHR & setPredictiveFrameSize( uint32_t predictiveFrameSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      predictiveFrameSize = predictiveFrameSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1FrameSizeKHR & setBipredictiveFrameSize( uint32_t bipredictiveFrameSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bipredictiveFrameSize = bipredictiveFrameSize_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeAV1FrameSizeKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeAV1FrameSizeKHR *>( this );\n    }\n\n    operator VkVideoEncodeAV1FrameSizeKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeAV1FrameSizeKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( intraFrameSize, predictiveFrameSize, bipredictiveFrameSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeAV1FrameSizeKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeAV1FrameSizeKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( intraFrameSize == rhs.intraFrameSize ) && ( predictiveFrameSize == rhs.predictiveFrameSize ) &&\n             ( bipredictiveFrameSize == rhs.bipredictiveFrameSize );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeAV1FrameSizeKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t intraFrameSize        = {};\n    uint32_t predictiveFrameSize   = {};\n    uint32_t bipredictiveFrameSize = {};\n  };\n\n  struct VideoEncodeAV1GopRemainingFrameInfoKHR\n  {\n    using NativeType = VkVideoEncodeAV1GopRemainingFrameInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeAv1GopRemainingFrameInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeAV1GopRemainingFrameInfoKHR( VULKAN_HPP_NAMESPACE::Bool32 useGopRemainingFrames_    = {},\n                                                                 uint32_t                     gopRemainingIntra_        = {},\n                                                                 uint32_t                     gopRemainingPredictive_   = {},\n                                                                 uint32_t                     gopRemainingBipredictive_ = {},\n                                                                 const void *                 pNext_                    = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , useGopRemainingFrames{ useGopRemainingFrames_ }\n      , gopRemainingIntra{ gopRemainingIntra_ }\n      , gopRemainingPredictive{ gopRemainingPredictive_ }\n      , gopRemainingBipredictive{ gopRemainingBipredictive_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeAV1GopRemainingFrameInfoKHR( VideoEncodeAV1GopRemainingFrameInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeAV1GopRemainingFrameInfoKHR( VkVideoEncodeAV1GopRemainingFrameInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeAV1GopRemainingFrameInfoKHR( *reinterpret_cast<VideoEncodeAV1GopRemainingFrameInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeAV1GopRemainingFrameInfoKHR & operator=( VideoEncodeAV1GopRemainingFrameInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeAV1GopRemainingFrameInfoKHR & operator=( VkVideoEncodeAV1GopRemainingFrameInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeAV1GopRemainingFrameInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1GopRemainingFrameInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1GopRemainingFrameInfoKHR &\n      setUseGopRemainingFrames( VULKAN_HPP_NAMESPACE::Bool32 useGopRemainingFrames_ ) VULKAN_HPP_NOEXCEPT\n    {\n      useGopRemainingFrames = useGopRemainingFrames_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1GopRemainingFrameInfoKHR & setGopRemainingIntra( uint32_t gopRemainingIntra_ ) VULKAN_HPP_NOEXCEPT\n    {\n      gopRemainingIntra = gopRemainingIntra_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1GopRemainingFrameInfoKHR & setGopRemainingPredictive( uint32_t gopRemainingPredictive_ ) VULKAN_HPP_NOEXCEPT\n    {\n      gopRemainingPredictive = gopRemainingPredictive_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1GopRemainingFrameInfoKHR & setGopRemainingBipredictive( uint32_t gopRemainingBipredictive_ ) VULKAN_HPP_NOEXCEPT\n    {\n      gopRemainingBipredictive = gopRemainingBipredictive_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeAV1GopRemainingFrameInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeAV1GopRemainingFrameInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeAV1GopRemainingFrameInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeAV1GopRemainingFrameInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, useGopRemainingFrames, gopRemainingIntra, gopRemainingPredictive, gopRemainingBipredictive );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeAV1GopRemainingFrameInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeAV1GopRemainingFrameInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( useGopRemainingFrames == rhs.useGopRemainingFrames ) &&\n             ( gopRemainingIntra == rhs.gopRemainingIntra ) && ( gopRemainingPredictive == rhs.gopRemainingPredictive ) &&\n             ( gopRemainingBipredictive == rhs.gopRemainingBipredictive );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeAV1GopRemainingFrameInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                    = StructureType::eVideoEncodeAv1GopRemainingFrameInfoKHR;\n    const void *                        pNext                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32        useGopRemainingFrames    = {};\n    uint32_t                            gopRemainingIntra        = {};\n    uint32_t                            gopRemainingPredictive   = {};\n    uint32_t                            gopRemainingBipredictive = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeAv1GopRemainingFrameInfoKHR>\n  {\n    using Type = VideoEncodeAV1GopRemainingFrameInfoKHR;\n  };\n\n  struct VideoEncodeAV1PictureInfoKHR\n  {\n    using NativeType = VkVideoEncodeAV1PictureInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeAv1PictureInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1PictureInfoKHR(\n      VULKAN_HPP_NAMESPACE::VideoEncodeAV1PredictionModeKHR   predictionMode_   = VULKAN_HPP_NAMESPACE::VideoEncodeAV1PredictionModeKHR::eIntraOnly,\n      VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlGroupKHR rateControlGroup_ = VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlGroupKHR::eIntra,\n      uint32_t                                                constantQIndex_   = {},\n      const StdVideoEncodeAV1PictureInfo *                    pStdPictureInfo_  = {},\n      std::array<int32_t, VK_MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR> const & referenceNameSlotIndices_   = {},\n      VULKAN_HPP_NAMESPACE::Bool32                                           primaryReferenceCdfOnly_    = {},\n      VULKAN_HPP_NAMESPACE::Bool32                                           generateObuExtensionHeader_ = {},\n      const void *                                                           pNext_                      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , predictionMode{ predictionMode_ }\n      , rateControlGroup{ rateControlGroup_ }\n      , constantQIndex{ constantQIndex_ }\n      , pStdPictureInfo{ pStdPictureInfo_ }\n      , referenceNameSlotIndices{ referenceNameSlotIndices_ }\n      , primaryReferenceCdfOnly{ primaryReferenceCdfOnly_ }\n      , generateObuExtensionHeader{ generateObuExtensionHeader_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1PictureInfoKHR( VideoEncodeAV1PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeAV1PictureInfoKHR( VkVideoEncodeAV1PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeAV1PictureInfoKHR( *reinterpret_cast<VideoEncodeAV1PictureInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeAV1PictureInfoKHR & operator=( VideoEncodeAV1PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeAV1PictureInfoKHR & operator=( VkVideoEncodeAV1PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeAV1PictureInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1PictureInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1PictureInfoKHR &\n      setPredictionMode( VULKAN_HPP_NAMESPACE::VideoEncodeAV1PredictionModeKHR predictionMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      predictionMode = predictionMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1PictureInfoKHR &\n      setRateControlGroup( VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlGroupKHR rateControlGroup_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rateControlGroup = rateControlGroup_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1PictureInfoKHR & setConstantQIndex( uint32_t constantQIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      constantQIndex = constantQIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1PictureInfoKHR & setPStdPictureInfo( const StdVideoEncodeAV1PictureInfo * pStdPictureInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdPictureInfo = pStdPictureInfo_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1PictureInfoKHR &\n      setReferenceNameSlotIndices( std::array<int32_t, VK_MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR> referenceNameSlotIndices_ ) VULKAN_HPP_NOEXCEPT\n    {\n      referenceNameSlotIndices = referenceNameSlotIndices_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1PictureInfoKHR &\n      setPrimaryReferenceCdfOnly( VULKAN_HPP_NAMESPACE::Bool32 primaryReferenceCdfOnly_ ) VULKAN_HPP_NOEXCEPT\n    {\n      primaryReferenceCdfOnly = primaryReferenceCdfOnly_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1PictureInfoKHR &\n      setGenerateObuExtensionHeader( VULKAN_HPP_NAMESPACE::Bool32 generateObuExtensionHeader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      generateObuExtensionHeader = generateObuExtensionHeader_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeAV1PictureInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeAV1PictureInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeAV1PictureInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeAV1PictureInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeAV1PredictionModeKHR const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlGroupKHR const &,\n               uint32_t const &,\n               const StdVideoEncodeAV1PictureInfo * const &,\n               VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int32_t, VK_MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR> const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       predictionMode,\n                       rateControlGroup,\n                       constantQIndex,\n                       pStdPictureInfo,\n                       referenceNameSlotIndices,\n                       primaryReferenceCdfOnly,\n                       generateObuExtensionHeader );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeAV1PictureInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeAV1PictureInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( predictionMode == rhs.predictionMode ) && ( rateControlGroup == rhs.rateControlGroup ) &&\n             ( constantQIndex == rhs.constantQIndex ) && ( pStdPictureInfo == rhs.pStdPictureInfo ) &&\n             ( referenceNameSlotIndices == rhs.referenceNameSlotIndices ) && ( primaryReferenceCdfOnly == rhs.primaryReferenceCdfOnly ) &&\n             ( generateObuExtensionHeader == rhs.generateObuExtensionHeader );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeAV1PictureInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                     sType            = StructureType::eVideoEncodeAv1PictureInfoKHR;\n    const void *                                            pNext            = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeAV1PredictionModeKHR   predictionMode   = VULKAN_HPP_NAMESPACE::VideoEncodeAV1PredictionModeKHR::eIntraOnly;\n    VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlGroupKHR rateControlGroup = VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlGroupKHR::eIntra;\n    uint32_t                                                constantQIndex   = {};\n    const StdVideoEncodeAV1PictureInfo *                    pStdPictureInfo  = {};\n    VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int32_t, VK_MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR> referenceNameSlotIndices   = {};\n    VULKAN_HPP_NAMESPACE::Bool32                                                             primaryReferenceCdfOnly    = {};\n    VULKAN_HPP_NAMESPACE::Bool32                                                             generateObuExtensionHeader = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeAv1PictureInfoKHR>\n  {\n    using Type = VideoEncodeAV1PictureInfoKHR;\n  };\n\n  struct VideoEncodeAV1ProfileInfoKHR\n  {\n    using NativeType = VkVideoEncodeAV1ProfileInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeAv1ProfileInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeAV1ProfileInfoKHR( StdVideoAV1Profile stdProfile_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stdProfile{ stdProfile_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeAV1ProfileInfoKHR( VideoEncodeAV1ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeAV1ProfileInfoKHR( VkVideoEncodeAV1ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeAV1ProfileInfoKHR( *reinterpret_cast<VideoEncodeAV1ProfileInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeAV1ProfileInfoKHR & operator=( VideoEncodeAV1ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeAV1ProfileInfoKHR & operator=( VkVideoEncodeAV1ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeAV1ProfileInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1ProfileInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1ProfileInfoKHR & setStdProfile( StdVideoAV1Profile stdProfile_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdProfile = stdProfile_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeAV1ProfileInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeAV1ProfileInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeAV1ProfileInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeAV1ProfileInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, StdVideoAV1Profile const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stdProfile );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( VideoEncodeAV1ProfileInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = memcmp( &stdProfile, &rhs.stdProfile, sizeof( StdVideoAV1Profile ) ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( VideoEncodeAV1ProfileInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memcmp( &stdProfile, &rhs.stdProfile, sizeof( StdVideoAV1Profile ) ) == 0 );\n    }\n\n    bool operator!=( VideoEncodeAV1ProfileInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType      = StructureType::eVideoEncodeAv1ProfileInfoKHR;\n    const void *                        pNext      = {};\n    StdVideoAV1Profile                  stdProfile = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeAv1ProfileInfoKHR>\n  {\n    using Type = VideoEncodeAV1ProfileInfoKHR;\n  };\n\n  struct VideoEncodeAV1QIndexKHR\n  {\n    using NativeType = VkVideoEncodeAV1QIndexKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      VideoEncodeAV1QIndexKHR( uint32_t intraQIndex_ = {}, uint32_t predictiveQIndex_ = {}, uint32_t bipredictiveQIndex_ = {} ) VULKAN_HPP_NOEXCEPT\n      : intraQIndex{ intraQIndex_ }\n      , predictiveQIndex{ predictiveQIndex_ }\n      , bipredictiveQIndex{ bipredictiveQIndex_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeAV1QIndexKHR( VideoEncodeAV1QIndexKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeAV1QIndexKHR( VkVideoEncodeAV1QIndexKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeAV1QIndexKHR( *reinterpret_cast<VideoEncodeAV1QIndexKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeAV1QIndexKHR & operator=( VideoEncodeAV1QIndexKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeAV1QIndexKHR & operator=( VkVideoEncodeAV1QIndexKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeAV1QIndexKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1QIndexKHR & setIntraQIndex( uint32_t intraQIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      intraQIndex = intraQIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1QIndexKHR & setPredictiveQIndex( uint32_t predictiveQIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      predictiveQIndex = predictiveQIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1QIndexKHR & setBipredictiveQIndex( uint32_t bipredictiveQIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      bipredictiveQIndex = bipredictiveQIndex_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeAV1QIndexKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeAV1QIndexKHR *>( this );\n    }\n\n    operator VkVideoEncodeAV1QIndexKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeAV1QIndexKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( intraQIndex, predictiveQIndex, bipredictiveQIndex );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeAV1QIndexKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeAV1QIndexKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( intraQIndex == rhs.intraQIndex ) && ( predictiveQIndex == rhs.predictiveQIndex ) && ( bipredictiveQIndex == rhs.bipredictiveQIndex );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeAV1QIndexKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t intraQIndex        = {};\n    uint32_t predictiveQIndex   = {};\n    uint32_t bipredictiveQIndex = {};\n  };\n\n  struct VideoEncodeAV1QualityLevelPropertiesKHR\n  {\n    using NativeType = VkVideoEncodeAV1QualityLevelPropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeAv1QualityLevelPropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeAV1QualityLevelPropertiesKHR( VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlFlagsKHR preferredRateControlFlags_ = {},\n                                                                  uint32_t                                                preferredGopFrameCount_    = {},\n                                                                  uint32_t                                                preferredKeyFramePeriod_   = {},\n                                                                  uint32_t preferredConsecutiveBipredictiveFrameCount_                               = {},\n                                                                  uint32_t preferredTemporalLayerCount_                                              = {},\n                                                                  VULKAN_HPP_NAMESPACE::VideoEncodeAV1QIndexKHR preferredConstantQIndex_             = {},\n                                                                  uint32_t                                      preferredMaxSingleReferenceCount_    = {},\n                                                                  uint32_t                                      preferredSingleReferenceNameMask_    = {},\n                                                                  uint32_t preferredMaxUnidirectionalCompoundReferenceCount_                         = {},\n                                                                  uint32_t preferredMaxUnidirectionalCompoundGroup1ReferenceCount_                   = {},\n                                                                  uint32_t preferredUnidirectionalCompoundReferenceNameMask_                         = {},\n                                                                  uint32_t preferredMaxBidirectionalCompoundReferenceCount_                          = {},\n                                                                  uint32_t preferredMaxBidirectionalCompoundGroup1ReferenceCount_                    = {},\n                                                                  uint32_t preferredMaxBidirectionalCompoundGroup2ReferenceCount_                    = {},\n                                                                  uint32_t preferredBidirectionalCompoundReferenceNameMask_                          = {},\n                                                                  void *   pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , preferredRateControlFlags{ preferredRateControlFlags_ }\n      , preferredGopFrameCount{ preferredGopFrameCount_ }\n      , preferredKeyFramePeriod{ preferredKeyFramePeriod_ }\n      , preferredConsecutiveBipredictiveFrameCount{ preferredConsecutiveBipredictiveFrameCount_ }\n      , preferredTemporalLayerCount{ preferredTemporalLayerCount_ }\n      , preferredConstantQIndex{ preferredConstantQIndex_ }\n      , preferredMaxSingleReferenceCount{ preferredMaxSingleReferenceCount_ }\n      , preferredSingleReferenceNameMask{ preferredSingleReferenceNameMask_ }\n      , preferredMaxUnidirectionalCompoundReferenceCount{ preferredMaxUnidirectionalCompoundReferenceCount_ }\n      , preferredMaxUnidirectionalCompoundGroup1ReferenceCount{ preferredMaxUnidirectionalCompoundGroup1ReferenceCount_ }\n      , preferredUnidirectionalCompoundReferenceNameMask{ preferredUnidirectionalCompoundReferenceNameMask_ }\n      , preferredMaxBidirectionalCompoundReferenceCount{ preferredMaxBidirectionalCompoundReferenceCount_ }\n      , preferredMaxBidirectionalCompoundGroup1ReferenceCount{ preferredMaxBidirectionalCompoundGroup1ReferenceCount_ }\n      , preferredMaxBidirectionalCompoundGroup2ReferenceCount{ preferredMaxBidirectionalCompoundGroup2ReferenceCount_ }\n      , preferredBidirectionalCompoundReferenceNameMask{ preferredBidirectionalCompoundReferenceNameMask_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeAV1QualityLevelPropertiesKHR( VideoEncodeAV1QualityLevelPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeAV1QualityLevelPropertiesKHR( VkVideoEncodeAV1QualityLevelPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeAV1QualityLevelPropertiesKHR( *reinterpret_cast<VideoEncodeAV1QualityLevelPropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeAV1QualityLevelPropertiesKHR & operator=( VideoEncodeAV1QualityLevelPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeAV1QualityLevelPropertiesKHR & operator=( VkVideoEncodeAV1QualityLevelPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeAV1QualityLevelPropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoEncodeAV1QualityLevelPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeAV1QualityLevelPropertiesKHR *>( this );\n    }\n\n    operator VkVideoEncodeAV1QualityLevelPropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeAV1QualityLevelPropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlFlagsKHR const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeAV1QIndexKHR const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       preferredRateControlFlags,\n                       preferredGopFrameCount,\n                       preferredKeyFramePeriod,\n                       preferredConsecutiveBipredictiveFrameCount,\n                       preferredTemporalLayerCount,\n                       preferredConstantQIndex,\n                       preferredMaxSingleReferenceCount,\n                       preferredSingleReferenceNameMask,\n                       preferredMaxUnidirectionalCompoundReferenceCount,\n                       preferredMaxUnidirectionalCompoundGroup1ReferenceCount,\n                       preferredUnidirectionalCompoundReferenceNameMask,\n                       preferredMaxBidirectionalCompoundReferenceCount,\n                       preferredMaxBidirectionalCompoundGroup1ReferenceCount,\n                       preferredMaxBidirectionalCompoundGroup2ReferenceCount,\n                       preferredBidirectionalCompoundReferenceNameMask );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeAV1QualityLevelPropertiesKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeAV1QualityLevelPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( preferredRateControlFlags == rhs.preferredRateControlFlags ) &&\n             ( preferredGopFrameCount == rhs.preferredGopFrameCount ) && ( preferredKeyFramePeriod == rhs.preferredKeyFramePeriod ) &&\n             ( preferredConsecutiveBipredictiveFrameCount == rhs.preferredConsecutiveBipredictiveFrameCount ) &&\n             ( preferredTemporalLayerCount == rhs.preferredTemporalLayerCount ) && ( preferredConstantQIndex == rhs.preferredConstantQIndex ) &&\n             ( preferredMaxSingleReferenceCount == rhs.preferredMaxSingleReferenceCount ) &&\n             ( preferredSingleReferenceNameMask == rhs.preferredSingleReferenceNameMask ) &&\n             ( preferredMaxUnidirectionalCompoundReferenceCount == rhs.preferredMaxUnidirectionalCompoundReferenceCount ) &&\n             ( preferredMaxUnidirectionalCompoundGroup1ReferenceCount == rhs.preferredMaxUnidirectionalCompoundGroup1ReferenceCount ) &&\n             ( preferredUnidirectionalCompoundReferenceNameMask == rhs.preferredUnidirectionalCompoundReferenceNameMask ) &&\n             ( preferredMaxBidirectionalCompoundReferenceCount == rhs.preferredMaxBidirectionalCompoundReferenceCount ) &&\n             ( preferredMaxBidirectionalCompoundGroup1ReferenceCount == rhs.preferredMaxBidirectionalCompoundGroup1ReferenceCount ) &&\n             ( preferredMaxBidirectionalCompoundGroup2ReferenceCount == rhs.preferredMaxBidirectionalCompoundGroup2ReferenceCount ) &&\n             ( preferredBidirectionalCompoundReferenceNameMask == rhs.preferredBidirectionalCompoundReferenceNameMask );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeAV1QualityLevelPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                     sType                     = StructureType::eVideoEncodeAv1QualityLevelPropertiesKHR;\n    void *                                                  pNext                     = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlFlagsKHR preferredRateControlFlags = {};\n    uint32_t                                                preferredGopFrameCount    = {};\n    uint32_t                                                preferredKeyFramePeriod   = {};\n    uint32_t                                                preferredConsecutiveBipredictiveFrameCount             = {};\n    uint32_t                                                preferredTemporalLayerCount                            = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeAV1QIndexKHR           preferredConstantQIndex                                = {};\n    uint32_t                                                preferredMaxSingleReferenceCount                       = {};\n    uint32_t                                                preferredSingleReferenceNameMask                       = {};\n    uint32_t                                                preferredMaxUnidirectionalCompoundReferenceCount       = {};\n    uint32_t                                                preferredMaxUnidirectionalCompoundGroup1ReferenceCount = {};\n    uint32_t                                                preferredUnidirectionalCompoundReferenceNameMask       = {};\n    uint32_t                                                preferredMaxBidirectionalCompoundReferenceCount        = {};\n    uint32_t                                                preferredMaxBidirectionalCompoundGroup1ReferenceCount  = {};\n    uint32_t                                                preferredMaxBidirectionalCompoundGroup2ReferenceCount  = {};\n    uint32_t                                                preferredBidirectionalCompoundReferenceNameMask        = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeAv1QualityLevelPropertiesKHR>\n  {\n    using Type = VideoEncodeAV1QualityLevelPropertiesKHR;\n  };\n\n  struct VideoEncodeAV1QuantizationMapCapabilitiesKHR\n  {\n    using NativeType = VkVideoEncodeAV1QuantizationMapCapabilitiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeAv1QuantizationMapCapabilitiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      VideoEncodeAV1QuantizationMapCapabilitiesKHR( int32_t minQIndexDelta_ = {}, int32_t maxQIndexDelta_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , minQIndexDelta{ minQIndexDelta_ }\n      , maxQIndexDelta{ maxQIndexDelta_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeAV1QuantizationMapCapabilitiesKHR( VideoEncodeAV1QuantizationMapCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeAV1QuantizationMapCapabilitiesKHR( VkVideoEncodeAV1QuantizationMapCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeAV1QuantizationMapCapabilitiesKHR( *reinterpret_cast<VideoEncodeAV1QuantizationMapCapabilitiesKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeAV1QuantizationMapCapabilitiesKHR & operator=( VideoEncodeAV1QuantizationMapCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeAV1QuantizationMapCapabilitiesKHR & operator=( VkVideoEncodeAV1QuantizationMapCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeAV1QuantizationMapCapabilitiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoEncodeAV1QuantizationMapCapabilitiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeAV1QuantizationMapCapabilitiesKHR *>( this );\n    }\n\n    operator VkVideoEncodeAV1QuantizationMapCapabilitiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeAV1QuantizationMapCapabilitiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, int32_t const &, int32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, minQIndexDelta, maxQIndexDelta );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeAV1QuantizationMapCapabilitiesKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeAV1QuantizationMapCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( minQIndexDelta == rhs.minQIndexDelta ) && ( maxQIndexDelta == rhs.maxQIndexDelta );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeAV1QuantizationMapCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::eVideoEncodeAv1QuantizationMapCapabilitiesKHR;\n    void *                              pNext          = {};\n    int32_t                             minQIndexDelta = {};\n    int32_t                             maxQIndexDelta = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeAv1QuantizationMapCapabilitiesKHR>\n  {\n    using Type = VideoEncodeAV1QuantizationMapCapabilitiesKHR;\n  };\n\n  struct VideoEncodeAV1RateControlInfoKHR\n  {\n    using NativeType = VkVideoEncodeAV1RateControlInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeAv1RateControlInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeAV1RateControlInfoKHR( VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlFlagsKHR flags_                             = {},\n                                                           uint32_t                                                gopFrameCount_                     = {},\n                                                           uint32_t                                                keyFramePeriod_                    = {},\n                                                           uint32_t                                                consecutiveBipredictiveFrameCount_ = {},\n                                                           uint32_t                                                temporalLayerCount_                = {},\n                                                           const void *                                            pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , gopFrameCount{ gopFrameCount_ }\n      , keyFramePeriod{ keyFramePeriod_ }\n      , consecutiveBipredictiveFrameCount{ consecutiveBipredictiveFrameCount_ }\n      , temporalLayerCount{ temporalLayerCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeAV1RateControlInfoKHR( VideoEncodeAV1RateControlInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeAV1RateControlInfoKHR( VkVideoEncodeAV1RateControlInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeAV1RateControlInfoKHR( *reinterpret_cast<VideoEncodeAV1RateControlInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeAV1RateControlInfoKHR & operator=( VideoEncodeAV1RateControlInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeAV1RateControlInfoKHR & operator=( VkVideoEncodeAV1RateControlInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1RateControlInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1RateControlInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1RateControlInfoKHR & setGopFrameCount( uint32_t gopFrameCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      gopFrameCount = gopFrameCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1RateControlInfoKHR & setKeyFramePeriod( uint32_t keyFramePeriod_ ) VULKAN_HPP_NOEXCEPT\n    {\n      keyFramePeriod = keyFramePeriod_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1RateControlInfoKHR &\n      setConsecutiveBipredictiveFrameCount( uint32_t consecutiveBipredictiveFrameCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      consecutiveBipredictiveFrameCount = consecutiveBipredictiveFrameCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1RateControlInfoKHR & setTemporalLayerCount( uint32_t temporalLayerCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      temporalLayerCount = temporalLayerCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeAV1RateControlInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeAV1RateControlInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeAV1RateControlInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeAV1RateControlInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlFlagsKHR const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, gopFrameCount, keyFramePeriod, consecutiveBipredictiveFrameCount, temporalLayerCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeAV1RateControlInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeAV1RateControlInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( gopFrameCount == rhs.gopFrameCount ) &&\n             ( keyFramePeriod == rhs.keyFramePeriod ) && ( consecutiveBipredictiveFrameCount == rhs.consecutiveBipredictiveFrameCount ) &&\n             ( temporalLayerCount == rhs.temporalLayerCount );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeAV1RateControlInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                     sType                             = StructureType::eVideoEncodeAv1RateControlInfoKHR;\n    const void *                                            pNext                             = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlFlagsKHR flags                             = {};\n    uint32_t                                                gopFrameCount                     = {};\n    uint32_t                                                keyFramePeriod                    = {};\n    uint32_t                                                consecutiveBipredictiveFrameCount = {};\n    uint32_t                                                temporalLayerCount                = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeAv1RateControlInfoKHR>\n  {\n    using Type = VideoEncodeAV1RateControlInfoKHR;\n  };\n\n  struct VideoEncodeAV1RateControlLayerInfoKHR\n  {\n    using NativeType = VkVideoEncodeAV1RateControlLayerInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeAv1RateControlLayerInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeAV1RateControlLayerInfoKHR( VULKAN_HPP_NAMESPACE::Bool32                     useMinQIndex_    = {},\n                                                                VULKAN_HPP_NAMESPACE::VideoEncodeAV1QIndexKHR    minQIndex_       = {},\n                                                                VULKAN_HPP_NAMESPACE::Bool32                     useMaxQIndex_    = {},\n                                                                VULKAN_HPP_NAMESPACE::VideoEncodeAV1QIndexKHR    maxQIndex_       = {},\n                                                                VULKAN_HPP_NAMESPACE::Bool32                     useMaxFrameSize_ = {},\n                                                                VULKAN_HPP_NAMESPACE::VideoEncodeAV1FrameSizeKHR maxFrameSize_    = {},\n                                                                const void *                                     pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , useMinQIndex{ useMinQIndex_ }\n      , minQIndex{ minQIndex_ }\n      , useMaxQIndex{ useMaxQIndex_ }\n      , maxQIndex{ maxQIndex_ }\n      , useMaxFrameSize{ useMaxFrameSize_ }\n      , maxFrameSize{ maxFrameSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeAV1RateControlLayerInfoKHR( VideoEncodeAV1RateControlLayerInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeAV1RateControlLayerInfoKHR( VkVideoEncodeAV1RateControlLayerInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeAV1RateControlLayerInfoKHR( *reinterpret_cast<VideoEncodeAV1RateControlLayerInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeAV1RateControlLayerInfoKHR & operator=( VideoEncodeAV1RateControlLayerInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeAV1RateControlLayerInfoKHR & operator=( VkVideoEncodeAV1RateControlLayerInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeAV1RateControlLayerInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1RateControlLayerInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1RateControlLayerInfoKHR & setUseMinQIndex( VULKAN_HPP_NAMESPACE::Bool32 useMinQIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      useMinQIndex = useMinQIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1RateControlLayerInfoKHR &\n      setMinQIndex( VULKAN_HPP_NAMESPACE::VideoEncodeAV1QIndexKHR const & minQIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minQIndex = minQIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1RateControlLayerInfoKHR & setUseMaxQIndex( VULKAN_HPP_NAMESPACE::Bool32 useMaxQIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      useMaxQIndex = useMaxQIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1RateControlLayerInfoKHR &\n      setMaxQIndex( VULKAN_HPP_NAMESPACE::VideoEncodeAV1QIndexKHR const & maxQIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxQIndex = maxQIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1RateControlLayerInfoKHR & setUseMaxFrameSize( VULKAN_HPP_NAMESPACE::Bool32 useMaxFrameSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      useMaxFrameSize = useMaxFrameSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1RateControlLayerInfoKHR &\n      setMaxFrameSize( VULKAN_HPP_NAMESPACE::VideoEncodeAV1FrameSizeKHR const & maxFrameSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxFrameSize = maxFrameSize_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeAV1RateControlLayerInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeAV1RateControlLayerInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeAV1RateControlLayerInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeAV1RateControlLayerInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeAV1QIndexKHR const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeAV1QIndexKHR const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeAV1FrameSizeKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, useMinQIndex, minQIndex, useMaxQIndex, maxQIndex, useMaxFrameSize, maxFrameSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeAV1RateControlLayerInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeAV1RateControlLayerInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( useMinQIndex == rhs.useMinQIndex ) && ( minQIndex == rhs.minQIndex ) &&\n             ( useMaxQIndex == rhs.useMaxQIndex ) && ( maxQIndex == rhs.maxQIndex ) && ( useMaxFrameSize == rhs.useMaxFrameSize ) &&\n             ( maxFrameSize == rhs.maxFrameSize );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeAV1RateControlLayerInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType              sType           = StructureType::eVideoEncodeAv1RateControlLayerInfoKHR;\n    const void *                                     pNext           = {};\n    VULKAN_HPP_NAMESPACE::Bool32                     useMinQIndex    = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeAV1QIndexKHR    minQIndex       = {};\n    VULKAN_HPP_NAMESPACE::Bool32                     useMaxQIndex    = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeAV1QIndexKHR    maxQIndex       = {};\n    VULKAN_HPP_NAMESPACE::Bool32                     useMaxFrameSize = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeAV1FrameSizeKHR maxFrameSize    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeAv1RateControlLayerInfoKHR>\n  {\n    using Type = VideoEncodeAV1RateControlLayerInfoKHR;\n  };\n\n  struct VideoEncodeAV1SessionCreateInfoKHR\n  {\n    using NativeType = VkVideoEncodeAV1SessionCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeAv1SessionCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeAV1SessionCreateInfoKHR( VULKAN_HPP_NAMESPACE::Bool32 useMaxLevel_ = {},\n                                                             StdVideoAV1Level             maxLevel_    = {},\n                                                             const void *                 pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , useMaxLevel{ useMaxLevel_ }\n      , maxLevel{ maxLevel_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeAV1SessionCreateInfoKHR( VideoEncodeAV1SessionCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeAV1SessionCreateInfoKHR( VkVideoEncodeAV1SessionCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeAV1SessionCreateInfoKHR( *reinterpret_cast<VideoEncodeAV1SessionCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeAV1SessionCreateInfoKHR & operator=( VideoEncodeAV1SessionCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeAV1SessionCreateInfoKHR & operator=( VkVideoEncodeAV1SessionCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeAV1SessionCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1SessionCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1SessionCreateInfoKHR & setUseMaxLevel( VULKAN_HPP_NAMESPACE::Bool32 useMaxLevel_ ) VULKAN_HPP_NOEXCEPT\n    {\n      useMaxLevel = useMaxLevel_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1SessionCreateInfoKHR & setMaxLevel( StdVideoAV1Level maxLevel_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxLevel = maxLevel_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeAV1SessionCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeAV1SessionCreateInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeAV1SessionCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeAV1SessionCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, StdVideoAV1Level const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, useMaxLevel, maxLevel );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( VideoEncodeAV1SessionCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = useMaxLevel <=> rhs.useMaxLevel; cmp != 0 )\n        return cmp;\n      if ( auto cmp = memcmp( &maxLevel, &rhs.maxLevel, sizeof( StdVideoAV1Level ) ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( VideoEncodeAV1SessionCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( useMaxLevel == rhs.useMaxLevel ) &&\n             ( memcmp( &maxLevel, &rhs.maxLevel, sizeof( StdVideoAV1Level ) ) == 0 );\n    }\n\n    bool operator!=( VideoEncodeAV1SessionCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType       = StructureType::eVideoEncodeAv1SessionCreateInfoKHR;\n    const void *                        pNext       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        useMaxLevel = {};\n    StdVideoAV1Level                    maxLevel    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeAv1SessionCreateInfoKHR>\n  {\n    using Type = VideoEncodeAV1SessionCreateInfoKHR;\n  };\n\n  struct VideoEncodeAV1SessionParametersCreateInfoKHR\n  {\n    using NativeType = VkVideoEncodeAV1SessionParametersCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeAv1SessionParametersCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeAV1SessionParametersCreateInfoKHR( const StdVideoAV1SequenceHeader *           pStdSequenceHeader_     = {},\n                                                                       const StdVideoEncodeAV1DecoderModelInfo *   pStdDecoderModelInfo_   = {},\n                                                                       uint32_t                                    stdOperatingPointCount_ = {},\n                                                                       const StdVideoEncodeAV1OperatingPointInfo * pStdOperatingPoints_    = {},\n                                                                       const void *                                pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pStdSequenceHeader{ pStdSequenceHeader_ }\n      , pStdDecoderModelInfo{ pStdDecoderModelInfo_ }\n      , stdOperatingPointCount{ stdOperatingPointCount_ }\n      , pStdOperatingPoints{ pStdOperatingPoints_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeAV1SessionParametersCreateInfoKHR( VideoEncodeAV1SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeAV1SessionParametersCreateInfoKHR( VkVideoEncodeAV1SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeAV1SessionParametersCreateInfoKHR( *reinterpret_cast<VideoEncodeAV1SessionParametersCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoEncodeAV1SessionParametersCreateInfoKHR(\n      const StdVideoAV1SequenceHeader *                                                                pStdSequenceHeader_,\n      const StdVideoEncodeAV1DecoderModelInfo *                                                        pStdDecoderModelInfo_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoEncodeAV1OperatingPointInfo> const & stdOperatingPoints_,\n      const void *                                                                                     pNext_ = nullptr )\n      : pNext( pNext_ )\n      , pStdSequenceHeader( pStdSequenceHeader_ )\n      , pStdDecoderModelInfo( pStdDecoderModelInfo_ )\n      , stdOperatingPointCount( static_cast<uint32_t>( stdOperatingPoints_.size() ) )\n      , pStdOperatingPoints( stdOperatingPoints_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VideoEncodeAV1SessionParametersCreateInfoKHR & operator=( VideoEncodeAV1SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeAV1SessionParametersCreateInfoKHR & operator=( VkVideoEncodeAV1SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeAV1SessionParametersCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1SessionParametersCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1SessionParametersCreateInfoKHR &\n      setPStdSequenceHeader( const StdVideoAV1SequenceHeader * pStdSequenceHeader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdSequenceHeader = pStdSequenceHeader_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1SessionParametersCreateInfoKHR &\n      setPStdDecoderModelInfo( const StdVideoEncodeAV1DecoderModelInfo * pStdDecoderModelInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdDecoderModelInfo = pStdDecoderModelInfo_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1SessionParametersCreateInfoKHR & setStdOperatingPointCount( uint32_t stdOperatingPointCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdOperatingPointCount = stdOperatingPointCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeAV1SessionParametersCreateInfoKHR &\n      setPStdOperatingPoints( const StdVideoEncodeAV1OperatingPointInfo * pStdOperatingPoints_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdOperatingPoints = pStdOperatingPoints_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoEncodeAV1SessionParametersCreateInfoKHR & setStdOperatingPoints(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoEncodeAV1OperatingPointInfo> const & stdOperatingPoints_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdOperatingPointCount = static_cast<uint32_t>( stdOperatingPoints_.size() );\n      pStdOperatingPoints    = stdOperatingPoints_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeAV1SessionParametersCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeAV1SessionParametersCreateInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeAV1SessionParametersCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeAV1SessionParametersCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               const StdVideoAV1SequenceHeader * const &,\n               const StdVideoEncodeAV1DecoderModelInfo * const &,\n               uint32_t const &,\n               const StdVideoEncodeAV1OperatingPointInfo * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pStdSequenceHeader, pStdDecoderModelInfo, stdOperatingPointCount, pStdOperatingPoints );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeAV1SessionParametersCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeAV1SessionParametersCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pStdSequenceHeader == rhs.pStdSequenceHeader ) &&\n             ( pStdDecoderModelInfo == rhs.pStdDecoderModelInfo ) && ( stdOperatingPointCount == rhs.stdOperatingPointCount ) &&\n             ( pStdOperatingPoints == rhs.pStdOperatingPoints );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeAV1SessionParametersCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType         sType                  = StructureType::eVideoEncodeAv1SessionParametersCreateInfoKHR;\n    const void *                                pNext                  = {};\n    const StdVideoAV1SequenceHeader *           pStdSequenceHeader     = {};\n    const StdVideoEncodeAV1DecoderModelInfo *   pStdDecoderModelInfo   = {};\n    uint32_t                                    stdOperatingPointCount = {};\n    const StdVideoEncodeAV1OperatingPointInfo * pStdOperatingPoints    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeAv1SessionParametersCreateInfoKHR>\n  {\n    using Type = VideoEncodeAV1SessionParametersCreateInfoKHR;\n  };\n\n  struct VideoEncodeCapabilitiesKHR\n  {\n    using NativeType = VkVideoEncodeCapabilitiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeCapabilitiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeCapabilitiesKHR( VULKAN_HPP_NAMESPACE::VideoEncodeCapabilityFlagsKHR      flags_                         = {},\n                                                     VULKAN_HPP_NAMESPACE::VideoEncodeRateControlModeFlagsKHR rateControlModes_              = {},\n                                                     uint32_t                                                 maxRateControlLayers_          = {},\n                                                     uint64_t                                                 maxBitrate_                    = {},\n                                                     uint32_t                                                 maxQualityLevels_              = {},\n                                                     VULKAN_HPP_NAMESPACE::Extent2D                           encodeInputPictureGranularity_ = {},\n                                                     VULKAN_HPP_NAMESPACE::VideoEncodeFeedbackFlagsKHR        supportedEncodeFeedbackFlags_  = {},\n                                                     void *                                                   pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , rateControlModes{ rateControlModes_ }\n      , maxRateControlLayers{ maxRateControlLayers_ }\n      , maxBitrate{ maxBitrate_ }\n      , maxQualityLevels{ maxQualityLevels_ }\n      , encodeInputPictureGranularity{ encodeInputPictureGranularity_ }\n      , supportedEncodeFeedbackFlags{ supportedEncodeFeedbackFlags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeCapabilitiesKHR( VideoEncodeCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeCapabilitiesKHR( VkVideoEncodeCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeCapabilitiesKHR( *reinterpret_cast<VideoEncodeCapabilitiesKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeCapabilitiesKHR & operator=( VideoEncodeCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeCapabilitiesKHR & operator=( VkVideoEncodeCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeCapabilitiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoEncodeCapabilitiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeCapabilitiesKHR *>( this );\n    }\n\n    operator VkVideoEncodeCapabilitiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeCapabilitiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeCapabilityFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeRateControlModeFlagsKHR const &,\n               uint32_t const &,\n               uint64_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeFeedbackFlagsKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       flags,\n                       rateControlModes,\n                       maxRateControlLayers,\n                       maxBitrate,\n                       maxQualityLevels,\n                       encodeInputPictureGranularity,\n                       supportedEncodeFeedbackFlags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeCapabilitiesKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( rateControlModes == rhs.rateControlModes ) &&\n             ( maxRateControlLayers == rhs.maxRateControlLayers ) && ( maxBitrate == rhs.maxBitrate ) && ( maxQualityLevels == rhs.maxQualityLevels ) &&\n             ( encodeInputPictureGranularity == rhs.encodeInputPictureGranularity ) && ( supportedEncodeFeedbackFlags == rhs.supportedEncodeFeedbackFlags );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                      sType                         = StructureType::eVideoEncodeCapabilitiesKHR;\n    void *                                                   pNext                         = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeCapabilityFlagsKHR      flags                         = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeRateControlModeFlagsKHR rateControlModes              = {};\n    uint32_t                                                 maxRateControlLayers          = {};\n    uint64_t                                                 maxBitrate                    = {};\n    uint32_t                                                 maxQualityLevels              = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                           encodeInputPictureGranularity = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeFeedbackFlagsKHR        supportedEncodeFeedbackFlags  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeCapabilitiesKHR>\n  {\n    using Type = VideoEncodeCapabilitiesKHR;\n  };\n\n  struct VideoEncodeH264CapabilitiesKHR\n  {\n    using NativeType = VkVideoEncodeH264CapabilitiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH264CapabilitiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264CapabilitiesKHR( VULKAN_HPP_NAMESPACE::VideoEncodeH264CapabilityFlagsKHR flags_                            = {},\n                                                         StdVideoH264LevelIdc                                    maxLevelIdc_                      = {},\n                                                         uint32_t                                                maxSliceCount_                    = {},\n                                                         uint32_t                                                maxPPictureL0ReferenceCount_      = {},\n                                                         uint32_t                                                maxBPictureL0ReferenceCount_      = {},\n                                                         uint32_t                                                maxL1ReferenceCount_              = {},\n                                                         uint32_t                                                maxTemporalLayerCount_            = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32                            expectDyadicTemporalLayerPattern_ = {},\n                                                         int32_t                                                 minQp_                            = {},\n                                                         int32_t                                                 maxQp_                            = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32                            prefersGopRemainingFrames_        = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32                            requiresGopRemainingFrames_       = {},\n                                                         VULKAN_HPP_NAMESPACE::VideoEncodeH264StdFlagsKHR        stdSyntaxFlags_                   = {},\n                                                         void *                                                  pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , maxLevelIdc{ maxLevelIdc_ }\n      , maxSliceCount{ maxSliceCount_ }\n      , maxPPictureL0ReferenceCount{ maxPPictureL0ReferenceCount_ }\n      , maxBPictureL0ReferenceCount{ maxBPictureL0ReferenceCount_ }\n      , maxL1ReferenceCount{ maxL1ReferenceCount_ }\n      , maxTemporalLayerCount{ maxTemporalLayerCount_ }\n      , expectDyadicTemporalLayerPattern{ expectDyadicTemporalLayerPattern_ }\n      , minQp{ minQp_ }\n      , maxQp{ maxQp_ }\n      , prefersGopRemainingFrames{ prefersGopRemainingFrames_ }\n      , requiresGopRemainingFrames{ requiresGopRemainingFrames_ }\n      , stdSyntaxFlags{ stdSyntaxFlags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264CapabilitiesKHR( VideoEncodeH264CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH264CapabilitiesKHR( VkVideoEncodeH264CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH264CapabilitiesKHR( *reinterpret_cast<VideoEncodeH264CapabilitiesKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH264CapabilitiesKHR & operator=( VideoEncodeH264CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH264CapabilitiesKHR & operator=( VkVideoEncodeH264CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH264CapabilitiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoEncodeH264CapabilitiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH264CapabilitiesKHR *>( this );\n    }\n\n    operator VkVideoEncodeH264CapabilitiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH264CapabilitiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeH264CapabilityFlagsKHR const &,\n               StdVideoH264LevelIdc const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               int32_t const &,\n               int32_t const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeH264StdFlagsKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       flags,\n                       maxLevelIdc,\n                       maxSliceCount,\n                       maxPPictureL0ReferenceCount,\n                       maxBPictureL0ReferenceCount,\n                       maxL1ReferenceCount,\n                       maxTemporalLayerCount,\n                       expectDyadicTemporalLayerPattern,\n                       minQp,\n                       maxQp,\n                       prefersGopRemainingFrames,\n                       requiresGopRemainingFrames,\n                       stdSyntaxFlags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( VideoEncodeH264CapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = flags <=> rhs.flags; cmp != 0 )\n        return cmp;\n      if ( auto cmp = memcmp( &maxLevelIdc, &rhs.maxLevelIdc, sizeof( StdVideoH264LevelIdc ) ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = maxSliceCount <=> rhs.maxSliceCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxPPictureL0ReferenceCount <=> rhs.maxPPictureL0ReferenceCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxBPictureL0ReferenceCount <=> rhs.maxBPictureL0ReferenceCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxL1ReferenceCount <=> rhs.maxL1ReferenceCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxTemporalLayerCount <=> rhs.maxTemporalLayerCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = expectDyadicTemporalLayerPattern <=> rhs.expectDyadicTemporalLayerPattern; cmp != 0 )\n        return cmp;\n      if ( auto cmp = minQp <=> rhs.minQp; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxQp <=> rhs.maxQp; cmp != 0 )\n        return cmp;\n      if ( auto cmp = prefersGopRemainingFrames <=> rhs.prefersGopRemainingFrames; cmp != 0 )\n        return cmp;\n      if ( auto cmp = requiresGopRemainingFrames <=> rhs.requiresGopRemainingFrames; cmp != 0 )\n        return cmp;\n      if ( auto cmp = stdSyntaxFlags <=> rhs.stdSyntaxFlags; cmp != 0 )\n        return cmp;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( VideoEncodeH264CapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) &&\n             ( memcmp( &maxLevelIdc, &rhs.maxLevelIdc, sizeof( StdVideoH264LevelIdc ) ) == 0 ) && ( maxSliceCount == rhs.maxSliceCount ) &&\n             ( maxPPictureL0ReferenceCount == rhs.maxPPictureL0ReferenceCount ) && ( maxBPictureL0ReferenceCount == rhs.maxBPictureL0ReferenceCount ) &&\n             ( maxL1ReferenceCount == rhs.maxL1ReferenceCount ) && ( maxTemporalLayerCount == rhs.maxTemporalLayerCount ) &&\n             ( expectDyadicTemporalLayerPattern == rhs.expectDyadicTemporalLayerPattern ) && ( minQp == rhs.minQp ) && ( maxQp == rhs.maxQp ) &&\n             ( prefersGopRemainingFrames == rhs.prefersGopRemainingFrames ) && ( requiresGopRemainingFrames == rhs.requiresGopRemainingFrames ) &&\n             ( stdSyntaxFlags == rhs.stdSyntaxFlags );\n    }\n\n    bool operator!=( VideoEncodeH264CapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                     sType                            = StructureType::eVideoEncodeH264CapabilitiesKHR;\n    void *                                                  pNext                            = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeH264CapabilityFlagsKHR flags                            = {};\n    StdVideoH264LevelIdc                                    maxLevelIdc                      = {};\n    uint32_t                                                maxSliceCount                    = {};\n    uint32_t                                                maxPPictureL0ReferenceCount      = {};\n    uint32_t                                                maxBPictureL0ReferenceCount      = {};\n    uint32_t                                                maxL1ReferenceCount              = {};\n    uint32_t                                                maxTemporalLayerCount            = {};\n    VULKAN_HPP_NAMESPACE::Bool32                            expectDyadicTemporalLayerPattern = {};\n    int32_t                                                 minQp                            = {};\n    int32_t                                                 maxQp                            = {};\n    VULKAN_HPP_NAMESPACE::Bool32                            prefersGopRemainingFrames        = {};\n    VULKAN_HPP_NAMESPACE::Bool32                            requiresGopRemainingFrames       = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeH264StdFlagsKHR        stdSyntaxFlags                   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH264CapabilitiesKHR>\n  {\n    using Type = VideoEncodeH264CapabilitiesKHR;\n  };\n\n  struct VideoEncodeH264DpbSlotInfoKHR\n  {\n    using NativeType = VkVideoEncodeH264DpbSlotInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH264DpbSlotInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264DpbSlotInfoKHR( const StdVideoEncodeH264ReferenceInfo * pStdReferenceInfo_ = {},\n                                                        const void *                            pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pStdReferenceInfo{ pStdReferenceInfo_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264DpbSlotInfoKHR( VideoEncodeH264DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH264DpbSlotInfoKHR( VkVideoEncodeH264DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH264DpbSlotInfoKHR( *reinterpret_cast<VideoEncodeH264DpbSlotInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH264DpbSlotInfoKHR & operator=( VideoEncodeH264DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH264DpbSlotInfoKHR & operator=( VkVideoEncodeH264DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH264DpbSlotInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264DpbSlotInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264DpbSlotInfoKHR &\n      setPStdReferenceInfo( const StdVideoEncodeH264ReferenceInfo * pStdReferenceInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdReferenceInfo = pStdReferenceInfo_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH264DpbSlotInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH264DpbSlotInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH264DpbSlotInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH264DpbSlotInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, const StdVideoEncodeH264ReferenceInfo * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pStdReferenceInfo );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH264DpbSlotInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH264DpbSlotInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pStdReferenceInfo == rhs.pStdReferenceInfo );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH264DpbSlotInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType     sType             = StructureType::eVideoEncodeH264DpbSlotInfoKHR;\n    const void *                            pNext             = {};\n    const StdVideoEncodeH264ReferenceInfo * pStdReferenceInfo = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH264DpbSlotInfoKHR>\n  {\n    using Type = VideoEncodeH264DpbSlotInfoKHR;\n  };\n\n  struct VideoEncodeH264FrameSizeKHR\n  {\n    using NativeType = VkVideoEncodeH264FrameSizeKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264FrameSizeKHR( uint32_t frameISize_ = {}, uint32_t framePSize_ = {}, uint32_t frameBSize_ = {} ) VULKAN_HPP_NOEXCEPT\n      : frameISize{ frameISize_ }\n      , framePSize{ framePSize_ }\n      , frameBSize{ frameBSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264FrameSizeKHR( VideoEncodeH264FrameSizeKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH264FrameSizeKHR( VkVideoEncodeH264FrameSizeKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH264FrameSizeKHR( *reinterpret_cast<VideoEncodeH264FrameSizeKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH264FrameSizeKHR & operator=( VideoEncodeH264FrameSizeKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH264FrameSizeKHR & operator=( VkVideoEncodeH264FrameSizeKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH264FrameSizeKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264FrameSizeKHR & setFrameISize( uint32_t frameISize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      frameISize = frameISize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264FrameSizeKHR & setFramePSize( uint32_t framePSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      framePSize = framePSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264FrameSizeKHR & setFrameBSize( uint32_t frameBSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      frameBSize = frameBSize_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH264FrameSizeKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH264FrameSizeKHR *>( this );\n    }\n\n    operator VkVideoEncodeH264FrameSizeKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH264FrameSizeKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( frameISize, framePSize, frameBSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH264FrameSizeKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH264FrameSizeKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( frameISize == rhs.frameISize ) && ( framePSize == rhs.framePSize ) && ( frameBSize == rhs.frameBSize );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH264FrameSizeKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t frameISize = {};\n    uint32_t framePSize = {};\n    uint32_t frameBSize = {};\n  };\n\n  struct VideoEncodeH264GopRemainingFrameInfoKHR\n  {\n    using NativeType = VkVideoEncodeH264GopRemainingFrameInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH264GopRemainingFrameInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264GopRemainingFrameInfoKHR( VULKAN_HPP_NAMESPACE::Bool32 useGopRemainingFrames_ = {},\n                                                                  uint32_t                     gopRemainingI_         = {},\n                                                                  uint32_t                     gopRemainingP_         = {},\n                                                                  uint32_t                     gopRemainingB_         = {},\n                                                                  const void *                 pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , useGopRemainingFrames{ useGopRemainingFrames_ }\n      , gopRemainingI{ gopRemainingI_ }\n      , gopRemainingP{ gopRemainingP_ }\n      , gopRemainingB{ gopRemainingB_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264GopRemainingFrameInfoKHR( VideoEncodeH264GopRemainingFrameInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH264GopRemainingFrameInfoKHR( VkVideoEncodeH264GopRemainingFrameInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH264GopRemainingFrameInfoKHR( *reinterpret_cast<VideoEncodeH264GopRemainingFrameInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH264GopRemainingFrameInfoKHR & operator=( VideoEncodeH264GopRemainingFrameInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH264GopRemainingFrameInfoKHR & operator=( VkVideoEncodeH264GopRemainingFrameInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH264GopRemainingFrameInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264GopRemainingFrameInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264GopRemainingFrameInfoKHR &\n      setUseGopRemainingFrames( VULKAN_HPP_NAMESPACE::Bool32 useGopRemainingFrames_ ) VULKAN_HPP_NOEXCEPT\n    {\n      useGopRemainingFrames = useGopRemainingFrames_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264GopRemainingFrameInfoKHR & setGopRemainingI( uint32_t gopRemainingI_ ) VULKAN_HPP_NOEXCEPT\n    {\n      gopRemainingI = gopRemainingI_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264GopRemainingFrameInfoKHR & setGopRemainingP( uint32_t gopRemainingP_ ) VULKAN_HPP_NOEXCEPT\n    {\n      gopRemainingP = gopRemainingP_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264GopRemainingFrameInfoKHR & setGopRemainingB( uint32_t gopRemainingB_ ) VULKAN_HPP_NOEXCEPT\n    {\n      gopRemainingB = gopRemainingB_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH264GopRemainingFrameInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH264GopRemainingFrameInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH264GopRemainingFrameInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH264GopRemainingFrameInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, useGopRemainingFrames, gopRemainingI, gopRemainingP, gopRemainingB );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH264GopRemainingFrameInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH264GopRemainingFrameInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( useGopRemainingFrames == rhs.useGopRemainingFrames ) &&\n             ( gopRemainingI == rhs.gopRemainingI ) && ( gopRemainingP == rhs.gopRemainingP ) && ( gopRemainingB == rhs.gopRemainingB );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH264GopRemainingFrameInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                 = StructureType::eVideoEncodeH264GopRemainingFrameInfoKHR;\n    const void *                        pNext                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        useGopRemainingFrames = {};\n    uint32_t                            gopRemainingI         = {};\n    uint32_t                            gopRemainingP         = {};\n    uint32_t                            gopRemainingB         = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH264GopRemainingFrameInfoKHR>\n  {\n    using Type = VideoEncodeH264GopRemainingFrameInfoKHR;\n  };\n\n  struct VideoEncodeH264NaluSliceInfoKHR\n  {\n    using NativeType = VkVideoEncodeH264NaluSliceInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH264NaluSliceInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264NaluSliceInfoKHR( int32_t                               constantQp_      = {},\n                                                          const StdVideoEncodeH264SliceHeader * pStdSliceHeader_ = {},\n                                                          const void *                          pNext_           = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , constantQp{ constantQp_ }\n      , pStdSliceHeader{ pStdSliceHeader_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264NaluSliceInfoKHR( VideoEncodeH264NaluSliceInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH264NaluSliceInfoKHR( VkVideoEncodeH264NaluSliceInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH264NaluSliceInfoKHR( *reinterpret_cast<VideoEncodeH264NaluSliceInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH264NaluSliceInfoKHR & operator=( VideoEncodeH264NaluSliceInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH264NaluSliceInfoKHR & operator=( VkVideoEncodeH264NaluSliceInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH264NaluSliceInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264NaluSliceInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264NaluSliceInfoKHR & setConstantQp( int32_t constantQp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      constantQp = constantQp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264NaluSliceInfoKHR & setPStdSliceHeader( const StdVideoEncodeH264SliceHeader * pStdSliceHeader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdSliceHeader = pStdSliceHeader_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH264NaluSliceInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH264NaluSliceInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH264NaluSliceInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH264NaluSliceInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, int32_t const &, const StdVideoEncodeH264SliceHeader * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, constantQp, pStdSliceHeader );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH264NaluSliceInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH264NaluSliceInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( constantQp == rhs.constantQp ) && ( pStdSliceHeader == rhs.pStdSliceHeader );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH264NaluSliceInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType   sType           = StructureType::eVideoEncodeH264NaluSliceInfoKHR;\n    const void *                          pNext           = {};\n    int32_t                               constantQp      = {};\n    const StdVideoEncodeH264SliceHeader * pStdSliceHeader = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH264NaluSliceInfoKHR>\n  {\n    using Type = VideoEncodeH264NaluSliceInfoKHR;\n  };\n\n  struct VideoEncodeH264PictureInfoKHR\n  {\n    using NativeType = VkVideoEncodeH264PictureInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH264PictureInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264PictureInfoKHR( uint32_t                                                      naluSliceEntryCount_ = {},\n                                                        const VULKAN_HPP_NAMESPACE::VideoEncodeH264NaluSliceInfoKHR * pNaluSliceEntries_   = {},\n                                                        const StdVideoEncodeH264PictureInfo *                         pStdPictureInfo_     = {},\n                                                        VULKAN_HPP_NAMESPACE::Bool32                                  generatePrefixNalu_  = {},\n                                                        const void *                                                  pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , naluSliceEntryCount{ naluSliceEntryCount_ }\n      , pNaluSliceEntries{ pNaluSliceEntries_ }\n      , pStdPictureInfo{ pStdPictureInfo_ }\n      , generatePrefixNalu{ generatePrefixNalu_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264PictureInfoKHR( VideoEncodeH264PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH264PictureInfoKHR( VkVideoEncodeH264PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH264PictureInfoKHR( *reinterpret_cast<VideoEncodeH264PictureInfoKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoEncodeH264PictureInfoKHR(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VideoEncodeH264NaluSliceInfoKHR> const & naluSliceEntries_,\n      const StdVideoEncodeH264PictureInfo *                                                                              pStdPictureInfo_    = {},\n      VULKAN_HPP_NAMESPACE::Bool32                                                                                       generatePrefixNalu_ = {},\n      const void *                                                                                                       pNext_              = nullptr )\n      : pNext( pNext_ )\n      , naluSliceEntryCount( static_cast<uint32_t>( naluSliceEntries_.size() ) )\n      , pNaluSliceEntries( naluSliceEntries_.data() )\n      , pStdPictureInfo( pStdPictureInfo_ )\n      , generatePrefixNalu( generatePrefixNalu_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VideoEncodeH264PictureInfoKHR & operator=( VideoEncodeH264PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH264PictureInfoKHR & operator=( VkVideoEncodeH264PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH264PictureInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264PictureInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264PictureInfoKHR & setNaluSliceEntryCount( uint32_t naluSliceEntryCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      naluSliceEntryCount = naluSliceEntryCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264PictureInfoKHR &\n      setPNaluSliceEntries( const VULKAN_HPP_NAMESPACE::VideoEncodeH264NaluSliceInfoKHR * pNaluSliceEntries_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNaluSliceEntries = pNaluSliceEntries_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoEncodeH264PictureInfoKHR & setNaluSliceEntries(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VideoEncodeH264NaluSliceInfoKHR> const & naluSliceEntries_ ) VULKAN_HPP_NOEXCEPT\n    {\n      naluSliceEntryCount = static_cast<uint32_t>( naluSliceEntries_.size() );\n      pNaluSliceEntries   = naluSliceEntries_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264PictureInfoKHR & setPStdPictureInfo( const StdVideoEncodeH264PictureInfo * pStdPictureInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdPictureInfo = pStdPictureInfo_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264PictureInfoKHR & setGeneratePrefixNalu( VULKAN_HPP_NAMESPACE::Bool32 generatePrefixNalu_ ) VULKAN_HPP_NOEXCEPT\n    {\n      generatePrefixNalu = generatePrefixNalu_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH264PictureInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH264PictureInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH264PictureInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH264PictureInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::VideoEncodeH264NaluSliceInfoKHR * const &,\n               const StdVideoEncodeH264PictureInfo * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, naluSliceEntryCount, pNaluSliceEntries, pStdPictureInfo, generatePrefixNalu );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH264PictureInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH264PictureInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( naluSliceEntryCount == rhs.naluSliceEntryCount ) &&\n             ( pNaluSliceEntries == rhs.pNaluSliceEntries ) && ( pStdPictureInfo == rhs.pStdPictureInfo ) && ( generatePrefixNalu == rhs.generatePrefixNalu );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH264PictureInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                           sType               = StructureType::eVideoEncodeH264PictureInfoKHR;\n    const void *                                                  pNext               = {};\n    uint32_t                                                      naluSliceEntryCount = {};\n    const VULKAN_HPP_NAMESPACE::VideoEncodeH264NaluSliceInfoKHR * pNaluSliceEntries   = {};\n    const StdVideoEncodeH264PictureInfo *                         pStdPictureInfo     = {};\n    VULKAN_HPP_NAMESPACE::Bool32                                  generatePrefixNalu  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH264PictureInfoKHR>\n  {\n    using Type = VideoEncodeH264PictureInfoKHR;\n  };\n\n  struct VideoEncodeH264ProfileInfoKHR\n  {\n    using NativeType = VkVideoEncodeH264ProfileInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH264ProfileInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264ProfileInfoKHR( StdVideoH264ProfileIdc stdProfileIdc_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stdProfileIdc{ stdProfileIdc_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264ProfileInfoKHR( VideoEncodeH264ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH264ProfileInfoKHR( VkVideoEncodeH264ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH264ProfileInfoKHR( *reinterpret_cast<VideoEncodeH264ProfileInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH264ProfileInfoKHR & operator=( VideoEncodeH264ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH264ProfileInfoKHR & operator=( VkVideoEncodeH264ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH264ProfileInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264ProfileInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264ProfileInfoKHR & setStdProfileIdc( StdVideoH264ProfileIdc stdProfileIdc_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdProfileIdc = stdProfileIdc_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH264ProfileInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH264ProfileInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH264ProfileInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH264ProfileInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, StdVideoH264ProfileIdc const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stdProfileIdc );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( VideoEncodeH264ProfileInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = memcmp( &stdProfileIdc, &rhs.stdProfileIdc, sizeof( StdVideoH264ProfileIdc ) ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( VideoEncodeH264ProfileInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memcmp( &stdProfileIdc, &rhs.stdProfileIdc, sizeof( StdVideoH264ProfileIdc ) ) == 0 );\n    }\n\n    bool operator!=( VideoEncodeH264ProfileInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType         = StructureType::eVideoEncodeH264ProfileInfoKHR;\n    const void *                        pNext         = {};\n    StdVideoH264ProfileIdc              stdProfileIdc = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH264ProfileInfoKHR>\n  {\n    using Type = VideoEncodeH264ProfileInfoKHR;\n  };\n\n  struct VideoEncodeH264QpKHR\n  {\n    using NativeType = VkVideoEncodeH264QpKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264QpKHR( int32_t qpI_ = {}, int32_t qpP_ = {}, int32_t qpB_ = {} ) VULKAN_HPP_NOEXCEPT\n      : qpI{ qpI_ }\n      , qpP{ qpP_ }\n      , qpB{ qpB_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264QpKHR( VideoEncodeH264QpKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH264QpKHR( VkVideoEncodeH264QpKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH264QpKHR( *reinterpret_cast<VideoEncodeH264QpKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH264QpKHR & operator=( VideoEncodeH264QpKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH264QpKHR & operator=( VkVideoEncodeH264QpKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH264QpKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264QpKHR & setQpI( int32_t qpI_ ) VULKAN_HPP_NOEXCEPT\n    {\n      qpI = qpI_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264QpKHR & setQpP( int32_t qpP_ ) VULKAN_HPP_NOEXCEPT\n    {\n      qpP = qpP_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264QpKHR & setQpB( int32_t qpB_ ) VULKAN_HPP_NOEXCEPT\n    {\n      qpB = qpB_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH264QpKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH264QpKHR *>( this );\n    }\n\n    operator VkVideoEncodeH264QpKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH264QpKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<int32_t const &, int32_t const &, int32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( qpI, qpP, qpB );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH264QpKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH264QpKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( qpI == rhs.qpI ) && ( qpP == rhs.qpP ) && ( qpB == rhs.qpB );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH264QpKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    int32_t qpI = {};\n    int32_t qpP = {};\n    int32_t qpB = {};\n  };\n\n  struct VideoEncodeH264QualityLevelPropertiesKHR\n  {\n    using NativeType = VkVideoEncodeH264QualityLevelPropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH264QualityLevelPropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264QualityLevelPropertiesKHR( VULKAN_HPP_NAMESPACE::VideoEncodeH264RateControlFlagsKHR preferredRateControlFlags_ = {},\n                                                                   uint32_t                                                 preferredGopFrameCount_    = {},\n                                                                   uint32_t                                                 preferredIdrPeriod_        = {},\n                                                                   uint32_t                                   preferredConsecutiveBFrameCount_         = {},\n                                                                   uint32_t                                   preferredTemporalLayerCount_             = {},\n                                                                   VULKAN_HPP_NAMESPACE::VideoEncodeH264QpKHR preferredConstantQp_                     = {},\n                                                                   uint32_t                                   preferredMaxL0ReferenceCount_            = {},\n                                                                   uint32_t                                   preferredMaxL1ReferenceCount_            = {},\n                                                                   VULKAN_HPP_NAMESPACE::Bool32               preferredStdEntropyCodingModeFlag_       = {},\n                                                                   void *                                     pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , preferredRateControlFlags{ preferredRateControlFlags_ }\n      , preferredGopFrameCount{ preferredGopFrameCount_ }\n      , preferredIdrPeriod{ preferredIdrPeriod_ }\n      , preferredConsecutiveBFrameCount{ preferredConsecutiveBFrameCount_ }\n      , preferredTemporalLayerCount{ preferredTemporalLayerCount_ }\n      , preferredConstantQp{ preferredConstantQp_ }\n      , preferredMaxL0ReferenceCount{ preferredMaxL0ReferenceCount_ }\n      , preferredMaxL1ReferenceCount{ preferredMaxL1ReferenceCount_ }\n      , preferredStdEntropyCodingModeFlag{ preferredStdEntropyCodingModeFlag_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264QualityLevelPropertiesKHR( VideoEncodeH264QualityLevelPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH264QualityLevelPropertiesKHR( VkVideoEncodeH264QualityLevelPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH264QualityLevelPropertiesKHR( *reinterpret_cast<VideoEncodeH264QualityLevelPropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH264QualityLevelPropertiesKHR & operator=( VideoEncodeH264QualityLevelPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH264QualityLevelPropertiesKHR & operator=( VkVideoEncodeH264QualityLevelPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH264QualityLevelPropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoEncodeH264QualityLevelPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH264QualityLevelPropertiesKHR *>( this );\n    }\n\n    operator VkVideoEncodeH264QualityLevelPropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH264QualityLevelPropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeH264RateControlFlagsKHR const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeH264QpKHR const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       preferredRateControlFlags,\n                       preferredGopFrameCount,\n                       preferredIdrPeriod,\n                       preferredConsecutiveBFrameCount,\n                       preferredTemporalLayerCount,\n                       preferredConstantQp,\n                       preferredMaxL0ReferenceCount,\n                       preferredMaxL1ReferenceCount,\n                       preferredStdEntropyCodingModeFlag );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH264QualityLevelPropertiesKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH264QualityLevelPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( preferredRateControlFlags == rhs.preferredRateControlFlags ) &&\n             ( preferredGopFrameCount == rhs.preferredGopFrameCount ) && ( preferredIdrPeriod == rhs.preferredIdrPeriod ) &&\n             ( preferredConsecutiveBFrameCount == rhs.preferredConsecutiveBFrameCount ) && ( preferredTemporalLayerCount == rhs.preferredTemporalLayerCount ) &&\n             ( preferredConstantQp == rhs.preferredConstantQp ) && ( preferredMaxL0ReferenceCount == rhs.preferredMaxL0ReferenceCount ) &&\n             ( preferredMaxL1ReferenceCount == rhs.preferredMaxL1ReferenceCount ) &&\n             ( preferredStdEntropyCodingModeFlag == rhs.preferredStdEntropyCodingModeFlag );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH264QualityLevelPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                      sType                             = StructureType::eVideoEncodeH264QualityLevelPropertiesKHR;\n    void *                                                   pNext                             = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeH264RateControlFlagsKHR preferredRateControlFlags         = {};\n    uint32_t                                                 preferredGopFrameCount            = {};\n    uint32_t                                                 preferredIdrPeriod                = {};\n    uint32_t                                                 preferredConsecutiveBFrameCount   = {};\n    uint32_t                                                 preferredTemporalLayerCount       = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeH264QpKHR               preferredConstantQp               = {};\n    uint32_t                                                 preferredMaxL0ReferenceCount      = {};\n    uint32_t                                                 preferredMaxL1ReferenceCount      = {};\n    VULKAN_HPP_NAMESPACE::Bool32                             preferredStdEntropyCodingModeFlag = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH264QualityLevelPropertiesKHR>\n  {\n    using Type = VideoEncodeH264QualityLevelPropertiesKHR;\n  };\n\n  struct VideoEncodeH264QuantizationMapCapabilitiesKHR\n  {\n    using NativeType = VkVideoEncodeH264QuantizationMapCapabilitiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH264QuantizationMapCapabilitiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      VideoEncodeH264QuantizationMapCapabilitiesKHR( int32_t minQpDelta_ = {}, int32_t maxQpDelta_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , minQpDelta{ minQpDelta_ }\n      , maxQpDelta{ maxQpDelta_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      VideoEncodeH264QuantizationMapCapabilitiesKHR( VideoEncodeH264QuantizationMapCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH264QuantizationMapCapabilitiesKHR( VkVideoEncodeH264QuantizationMapCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH264QuantizationMapCapabilitiesKHR( *reinterpret_cast<VideoEncodeH264QuantizationMapCapabilitiesKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH264QuantizationMapCapabilitiesKHR & operator=( VideoEncodeH264QuantizationMapCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH264QuantizationMapCapabilitiesKHR & operator=( VkVideoEncodeH264QuantizationMapCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH264QuantizationMapCapabilitiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoEncodeH264QuantizationMapCapabilitiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH264QuantizationMapCapabilitiesKHR *>( this );\n    }\n\n    operator VkVideoEncodeH264QuantizationMapCapabilitiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH264QuantizationMapCapabilitiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, int32_t const &, int32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, minQpDelta, maxQpDelta );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH264QuantizationMapCapabilitiesKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH264QuantizationMapCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( minQpDelta == rhs.minQpDelta ) && ( maxQpDelta == rhs.maxQpDelta );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH264QuantizationMapCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType      = StructureType::eVideoEncodeH264QuantizationMapCapabilitiesKHR;\n    void *                              pNext      = {};\n    int32_t                             minQpDelta = {};\n    int32_t                             maxQpDelta = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH264QuantizationMapCapabilitiesKHR>\n  {\n    using Type = VideoEncodeH264QuantizationMapCapabilitiesKHR;\n  };\n\n  struct VideoEncodeH264RateControlInfoKHR\n  {\n    using NativeType = VkVideoEncodeH264RateControlInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH264RateControlInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264RateControlInfoKHR( VULKAN_HPP_NAMESPACE::VideoEncodeH264RateControlFlagsKHR flags_                  = {},\n                                                            uint32_t                                                 gopFrameCount_          = {},\n                                                            uint32_t                                                 idrPeriod_              = {},\n                                                            uint32_t                                                 consecutiveBFrameCount_ = {},\n                                                            uint32_t                                                 temporalLayerCount_     = {},\n                                                            const void *                                             pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , gopFrameCount{ gopFrameCount_ }\n      , idrPeriod{ idrPeriod_ }\n      , consecutiveBFrameCount{ consecutiveBFrameCount_ }\n      , temporalLayerCount{ temporalLayerCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264RateControlInfoKHR( VideoEncodeH264RateControlInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH264RateControlInfoKHR( VkVideoEncodeH264RateControlInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH264RateControlInfoKHR( *reinterpret_cast<VideoEncodeH264RateControlInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH264RateControlInfoKHR & operator=( VideoEncodeH264RateControlInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH264RateControlInfoKHR & operator=( VkVideoEncodeH264RateControlInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH264RateControlInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264RateControlInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264RateControlInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::VideoEncodeH264RateControlFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264RateControlInfoKHR & setGopFrameCount( uint32_t gopFrameCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      gopFrameCount = gopFrameCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264RateControlInfoKHR & setIdrPeriod( uint32_t idrPeriod_ ) VULKAN_HPP_NOEXCEPT\n    {\n      idrPeriod = idrPeriod_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264RateControlInfoKHR & setConsecutiveBFrameCount( uint32_t consecutiveBFrameCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      consecutiveBFrameCount = consecutiveBFrameCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264RateControlInfoKHR & setTemporalLayerCount( uint32_t temporalLayerCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      temporalLayerCount = temporalLayerCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH264RateControlInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH264RateControlInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH264RateControlInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH264RateControlInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeH264RateControlFlagsKHR const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, gopFrameCount, idrPeriod, consecutiveBFrameCount, temporalLayerCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH264RateControlInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH264RateControlInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( gopFrameCount == rhs.gopFrameCount ) &&\n             ( idrPeriod == rhs.idrPeriod ) && ( consecutiveBFrameCount == rhs.consecutiveBFrameCount ) && ( temporalLayerCount == rhs.temporalLayerCount );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH264RateControlInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                      sType                  = StructureType::eVideoEncodeH264RateControlInfoKHR;\n    const void *                                             pNext                  = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeH264RateControlFlagsKHR flags                  = {};\n    uint32_t                                                 gopFrameCount          = {};\n    uint32_t                                                 idrPeriod              = {};\n    uint32_t                                                 consecutiveBFrameCount = {};\n    uint32_t                                                 temporalLayerCount     = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH264RateControlInfoKHR>\n  {\n    using Type = VideoEncodeH264RateControlInfoKHR;\n  };\n\n  struct VideoEncodeH264RateControlLayerInfoKHR\n  {\n    using NativeType = VkVideoEncodeH264RateControlLayerInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH264RateControlLayerInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264RateControlLayerInfoKHR( VULKAN_HPP_NAMESPACE::Bool32                      useMinQp_        = {},\n                                                                 VULKAN_HPP_NAMESPACE::VideoEncodeH264QpKHR        minQp_           = {},\n                                                                 VULKAN_HPP_NAMESPACE::Bool32                      useMaxQp_        = {},\n                                                                 VULKAN_HPP_NAMESPACE::VideoEncodeH264QpKHR        maxQp_           = {},\n                                                                 VULKAN_HPP_NAMESPACE::Bool32                      useMaxFrameSize_ = {},\n                                                                 VULKAN_HPP_NAMESPACE::VideoEncodeH264FrameSizeKHR maxFrameSize_    = {},\n                                                                 const void *                                      pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , useMinQp{ useMinQp_ }\n      , minQp{ minQp_ }\n      , useMaxQp{ useMaxQp_ }\n      , maxQp{ maxQp_ }\n      , useMaxFrameSize{ useMaxFrameSize_ }\n      , maxFrameSize{ maxFrameSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264RateControlLayerInfoKHR( VideoEncodeH264RateControlLayerInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH264RateControlLayerInfoKHR( VkVideoEncodeH264RateControlLayerInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH264RateControlLayerInfoKHR( *reinterpret_cast<VideoEncodeH264RateControlLayerInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH264RateControlLayerInfoKHR & operator=( VideoEncodeH264RateControlLayerInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH264RateControlLayerInfoKHR & operator=( VkVideoEncodeH264RateControlLayerInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH264RateControlLayerInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264RateControlLayerInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264RateControlLayerInfoKHR & setUseMinQp( VULKAN_HPP_NAMESPACE::Bool32 useMinQp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      useMinQp = useMinQp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264RateControlLayerInfoKHR & setMinQp( VULKAN_HPP_NAMESPACE::VideoEncodeH264QpKHR const & minQp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minQp = minQp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264RateControlLayerInfoKHR & setUseMaxQp( VULKAN_HPP_NAMESPACE::Bool32 useMaxQp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      useMaxQp = useMaxQp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264RateControlLayerInfoKHR & setMaxQp( VULKAN_HPP_NAMESPACE::VideoEncodeH264QpKHR const & maxQp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxQp = maxQp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264RateControlLayerInfoKHR & setUseMaxFrameSize( VULKAN_HPP_NAMESPACE::Bool32 useMaxFrameSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      useMaxFrameSize = useMaxFrameSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264RateControlLayerInfoKHR &\n      setMaxFrameSize( VULKAN_HPP_NAMESPACE::VideoEncodeH264FrameSizeKHR const & maxFrameSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxFrameSize = maxFrameSize_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH264RateControlLayerInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH264RateControlLayerInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH264RateControlLayerInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH264RateControlLayerInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeH264QpKHR const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeH264QpKHR const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeH264FrameSizeKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, useMinQp, minQp, useMaxQp, maxQp, useMaxFrameSize, maxFrameSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH264RateControlLayerInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH264RateControlLayerInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( useMinQp == rhs.useMinQp ) && ( minQp == rhs.minQp ) && ( useMaxQp == rhs.useMaxQp ) &&\n             ( maxQp == rhs.maxQp ) && ( useMaxFrameSize == rhs.useMaxFrameSize ) && ( maxFrameSize == rhs.maxFrameSize );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH264RateControlLayerInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType           = StructureType::eVideoEncodeH264RateControlLayerInfoKHR;\n    const void *                                      pNext           = {};\n    VULKAN_HPP_NAMESPACE::Bool32                      useMinQp        = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeH264QpKHR        minQp           = {};\n    VULKAN_HPP_NAMESPACE::Bool32                      useMaxQp        = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeH264QpKHR        maxQp           = {};\n    VULKAN_HPP_NAMESPACE::Bool32                      useMaxFrameSize = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeH264FrameSizeKHR maxFrameSize    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH264RateControlLayerInfoKHR>\n  {\n    using Type = VideoEncodeH264RateControlLayerInfoKHR;\n  };\n\n  struct VideoEncodeH264SessionCreateInfoKHR\n  {\n    using NativeType = VkVideoEncodeH264SessionCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH264SessionCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264SessionCreateInfoKHR( VULKAN_HPP_NAMESPACE::Bool32 useMaxLevelIdc_ = {},\n                                                              StdVideoH264LevelIdc         maxLevelIdc_    = {},\n                                                              const void *                 pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , useMaxLevelIdc{ useMaxLevelIdc_ }\n      , maxLevelIdc{ maxLevelIdc_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264SessionCreateInfoKHR( VideoEncodeH264SessionCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH264SessionCreateInfoKHR( VkVideoEncodeH264SessionCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH264SessionCreateInfoKHR( *reinterpret_cast<VideoEncodeH264SessionCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH264SessionCreateInfoKHR & operator=( VideoEncodeH264SessionCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH264SessionCreateInfoKHR & operator=( VkVideoEncodeH264SessionCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264SessionCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264SessionCreateInfoKHR & setUseMaxLevelIdc( VULKAN_HPP_NAMESPACE::Bool32 useMaxLevelIdc_ ) VULKAN_HPP_NOEXCEPT\n    {\n      useMaxLevelIdc = useMaxLevelIdc_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264SessionCreateInfoKHR & setMaxLevelIdc( StdVideoH264LevelIdc maxLevelIdc_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxLevelIdc = maxLevelIdc_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH264SessionCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH264SessionCreateInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH264SessionCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH264SessionCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, StdVideoH264LevelIdc const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, useMaxLevelIdc, maxLevelIdc );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( VideoEncodeH264SessionCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = useMaxLevelIdc <=> rhs.useMaxLevelIdc; cmp != 0 )\n        return cmp;\n      if ( auto cmp = memcmp( &maxLevelIdc, &rhs.maxLevelIdc, sizeof( StdVideoH264LevelIdc ) ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( VideoEncodeH264SessionCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( useMaxLevelIdc == rhs.useMaxLevelIdc ) &&\n             ( memcmp( &maxLevelIdc, &rhs.maxLevelIdc, sizeof( StdVideoH264LevelIdc ) ) == 0 );\n    }\n\n    bool operator!=( VideoEncodeH264SessionCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::eVideoEncodeH264SessionCreateInfoKHR;\n    const void *                        pNext          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        useMaxLevelIdc = {};\n    StdVideoH264LevelIdc                maxLevelIdc    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH264SessionCreateInfoKHR>\n  {\n    using Type = VideoEncodeH264SessionCreateInfoKHR;\n  };\n\n  struct VideoEncodeH264SessionParametersAddInfoKHR\n  {\n    using NativeType = VkVideoEncodeH264SessionParametersAddInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH264SessionParametersAddInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264SessionParametersAddInfoKHR( uint32_t                                 stdSPSCount_ = {},\n                                                                     const StdVideoH264SequenceParameterSet * pStdSPSs_    = {},\n                                                                     uint32_t                                 stdPPSCount_ = {},\n                                                                     const StdVideoH264PictureParameterSet *  pStdPPSs_    = {},\n                                                                     const void *                             pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stdSPSCount{ stdSPSCount_ }\n      , pStdSPSs{ pStdSPSs_ }\n      , stdPPSCount{ stdPPSCount_ }\n      , pStdPPSs{ pStdPPSs_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264SessionParametersAddInfoKHR( VideoEncodeH264SessionParametersAddInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH264SessionParametersAddInfoKHR( VkVideoEncodeH264SessionParametersAddInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH264SessionParametersAddInfoKHR( *reinterpret_cast<VideoEncodeH264SessionParametersAddInfoKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoEncodeH264SessionParametersAddInfoKHR( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH264SequenceParameterSet> const & stdSPSs_,\n                                                VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH264PictureParameterSet> const &  stdPPSs_ = {},\n                                                const void *                                                                                  pNext_ = nullptr )\n      : pNext( pNext_ )\n      , stdSPSCount( static_cast<uint32_t>( stdSPSs_.size() ) )\n      , pStdSPSs( stdSPSs_.data() )\n      , stdPPSCount( static_cast<uint32_t>( stdPPSs_.size() ) )\n      , pStdPPSs( stdPPSs_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VideoEncodeH264SessionParametersAddInfoKHR & operator=( VideoEncodeH264SessionParametersAddInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH264SessionParametersAddInfoKHR & operator=( VkVideoEncodeH264SessionParametersAddInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersAddInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264SessionParametersAddInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264SessionParametersAddInfoKHR & setStdSPSCount( uint32_t stdSPSCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdSPSCount = stdSPSCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264SessionParametersAddInfoKHR & setPStdSPSs( const StdVideoH264SequenceParameterSet * pStdSPSs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdSPSs = pStdSPSs_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoEncodeH264SessionParametersAddInfoKHR &\n      setStdSPSs( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH264SequenceParameterSet> const & stdSPSs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdSPSCount = static_cast<uint32_t>( stdSPSs_.size() );\n      pStdSPSs    = stdSPSs_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264SessionParametersAddInfoKHR & setStdPPSCount( uint32_t stdPPSCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdPPSCount = stdPPSCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264SessionParametersAddInfoKHR & setPStdPPSs( const StdVideoH264PictureParameterSet * pStdPPSs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdPPSs = pStdPPSs_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoEncodeH264SessionParametersAddInfoKHR &\n      setStdPPSs( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH264PictureParameterSet> const & stdPPSs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdPPSCount = static_cast<uint32_t>( stdPPSs_.size() );\n      pStdPPSs    = stdPPSs_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH264SessionParametersAddInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH264SessionParametersAddInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH264SessionParametersAddInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH264SessionParametersAddInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const StdVideoH264SequenceParameterSet * const &,\n               uint32_t const &,\n               const StdVideoH264PictureParameterSet * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stdSPSCount, pStdSPSs, stdPPSCount, pStdPPSs );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH264SessionParametersAddInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH264SessionParametersAddInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( stdSPSCount == rhs.stdSPSCount ) && ( pStdSPSs == rhs.pStdSPSs ) &&\n             ( stdPPSCount == rhs.stdPPSCount ) && ( pStdPPSs == rhs.pStdPPSs );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH264SessionParametersAddInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType      sType       = StructureType::eVideoEncodeH264SessionParametersAddInfoKHR;\n    const void *                             pNext       = {};\n    uint32_t                                 stdSPSCount = {};\n    const StdVideoH264SequenceParameterSet * pStdSPSs    = {};\n    uint32_t                                 stdPPSCount = {};\n    const StdVideoH264PictureParameterSet *  pStdPPSs    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH264SessionParametersAddInfoKHR>\n  {\n    using Type = VideoEncodeH264SessionParametersAddInfoKHR;\n  };\n\n  struct VideoEncodeH264SessionParametersCreateInfoKHR\n  {\n    using NativeType = VkVideoEncodeH264SessionParametersCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH264SessionParametersCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      VideoEncodeH264SessionParametersCreateInfoKHR( uint32_t                                                                 maxStdSPSCount_     = {},\n                                                     uint32_t                                                                 maxStdPPSCount_     = {},\n                                                     const VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersAddInfoKHR * pParametersAddInfo_ = {},\n                                                     const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxStdSPSCount{ maxStdSPSCount_ }\n      , maxStdPPSCount{ maxStdPPSCount_ }\n      , pParametersAddInfo{ pParametersAddInfo_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      VideoEncodeH264SessionParametersCreateInfoKHR( VideoEncodeH264SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH264SessionParametersCreateInfoKHR( VkVideoEncodeH264SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH264SessionParametersCreateInfoKHR( *reinterpret_cast<VideoEncodeH264SessionParametersCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH264SessionParametersCreateInfoKHR & operator=( VideoEncodeH264SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH264SessionParametersCreateInfoKHR & operator=( VkVideoEncodeH264SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264SessionParametersCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264SessionParametersCreateInfoKHR & setMaxStdSPSCount( uint32_t maxStdSPSCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxStdSPSCount = maxStdSPSCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264SessionParametersCreateInfoKHR & setMaxStdPPSCount( uint32_t maxStdPPSCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxStdPPSCount = maxStdPPSCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264SessionParametersCreateInfoKHR &\n      setPParametersAddInfo( const VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersAddInfoKHR * pParametersAddInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pParametersAddInfo = pParametersAddInfo_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH264SessionParametersCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH264SessionParametersCreateInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH264SessionParametersCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH264SessionParametersCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersAddInfoKHR * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxStdSPSCount, maxStdPPSCount, pParametersAddInfo );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH264SessionParametersCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH264SessionParametersCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxStdSPSCount == rhs.maxStdSPSCount ) && ( maxStdPPSCount == rhs.maxStdPPSCount ) &&\n             ( pParametersAddInfo == rhs.pParametersAddInfo );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH264SessionParametersCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                      sType              = StructureType::eVideoEncodeH264SessionParametersCreateInfoKHR;\n    const void *                                                             pNext              = {};\n    uint32_t                                                                 maxStdSPSCount     = {};\n    uint32_t                                                                 maxStdPPSCount     = {};\n    const VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersAddInfoKHR * pParametersAddInfo = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH264SessionParametersCreateInfoKHR>\n  {\n    using Type = VideoEncodeH264SessionParametersCreateInfoKHR;\n  };\n\n  struct VideoEncodeH264SessionParametersFeedbackInfoKHR\n  {\n    using NativeType = VkVideoEncodeH264SessionParametersFeedbackInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH264SessionParametersFeedbackInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264SessionParametersFeedbackInfoKHR( VULKAN_HPP_NAMESPACE::Bool32 hasStdSPSOverrides_ = {},\n                                                                          VULKAN_HPP_NAMESPACE::Bool32 hasStdPPSOverrides_ = {},\n                                                                          void *                       pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , hasStdSPSOverrides{ hasStdSPSOverrides_ }\n      , hasStdPPSOverrides{ hasStdPPSOverrides_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      VideoEncodeH264SessionParametersFeedbackInfoKHR( VideoEncodeH264SessionParametersFeedbackInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH264SessionParametersFeedbackInfoKHR( VkVideoEncodeH264SessionParametersFeedbackInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH264SessionParametersFeedbackInfoKHR( *reinterpret_cast<VideoEncodeH264SessionParametersFeedbackInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH264SessionParametersFeedbackInfoKHR & operator=( VideoEncodeH264SessionParametersFeedbackInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH264SessionParametersFeedbackInfoKHR & operator=( VkVideoEncodeH264SessionParametersFeedbackInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersFeedbackInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoEncodeH264SessionParametersFeedbackInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH264SessionParametersFeedbackInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH264SessionParametersFeedbackInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH264SessionParametersFeedbackInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, hasStdSPSOverrides, hasStdPPSOverrides );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH264SessionParametersFeedbackInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH264SessionParametersFeedbackInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( hasStdSPSOverrides == rhs.hasStdSPSOverrides ) &&\n             ( hasStdPPSOverrides == rhs.hasStdPPSOverrides );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH264SessionParametersFeedbackInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType              = StructureType::eVideoEncodeH264SessionParametersFeedbackInfoKHR;\n    void *                              pNext              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        hasStdSPSOverrides = {};\n    VULKAN_HPP_NAMESPACE::Bool32        hasStdPPSOverrides = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH264SessionParametersFeedbackInfoKHR>\n  {\n    using Type = VideoEncodeH264SessionParametersFeedbackInfoKHR;\n  };\n\n  struct VideoEncodeH264SessionParametersGetInfoKHR\n  {\n    using NativeType = VkVideoEncodeH264SessionParametersGetInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH264SessionParametersGetInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264SessionParametersGetInfoKHR( VULKAN_HPP_NAMESPACE::Bool32 writeStdSPS_ = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 writeStdPPS_ = {},\n                                                                     uint32_t                     stdSPSId_    = {},\n                                                                     uint32_t                     stdPPSId_    = {},\n                                                                     const void *                 pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , writeStdSPS{ writeStdSPS_ }\n      , writeStdPPS{ writeStdPPS_ }\n      , stdSPSId{ stdSPSId_ }\n      , stdPPSId{ stdPPSId_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH264SessionParametersGetInfoKHR( VideoEncodeH264SessionParametersGetInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH264SessionParametersGetInfoKHR( VkVideoEncodeH264SessionParametersGetInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH264SessionParametersGetInfoKHR( *reinterpret_cast<VideoEncodeH264SessionParametersGetInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH264SessionParametersGetInfoKHR & operator=( VideoEncodeH264SessionParametersGetInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH264SessionParametersGetInfoKHR & operator=( VkVideoEncodeH264SessionParametersGetInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersGetInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264SessionParametersGetInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264SessionParametersGetInfoKHR & setWriteStdSPS( VULKAN_HPP_NAMESPACE::Bool32 writeStdSPS_ ) VULKAN_HPP_NOEXCEPT\n    {\n      writeStdSPS = writeStdSPS_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264SessionParametersGetInfoKHR & setWriteStdPPS( VULKAN_HPP_NAMESPACE::Bool32 writeStdPPS_ ) VULKAN_HPP_NOEXCEPT\n    {\n      writeStdPPS = writeStdPPS_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264SessionParametersGetInfoKHR & setStdSPSId( uint32_t stdSPSId_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdSPSId = stdSPSId_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264SessionParametersGetInfoKHR & setStdPPSId( uint32_t stdPPSId_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdPPSId = stdPPSId_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH264SessionParametersGetInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH264SessionParametersGetInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH264SessionParametersGetInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH264SessionParametersGetInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, writeStdSPS, writeStdPPS, stdSPSId, stdPPSId );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH264SessionParametersGetInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH264SessionParametersGetInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( writeStdSPS == rhs.writeStdSPS ) && ( writeStdPPS == rhs.writeStdPPS ) &&\n             ( stdSPSId == rhs.stdSPSId ) && ( stdPPSId == rhs.stdPPSId );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH264SessionParametersGetInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType       = StructureType::eVideoEncodeH264SessionParametersGetInfoKHR;\n    const void *                        pNext       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        writeStdSPS = {};\n    VULKAN_HPP_NAMESPACE::Bool32        writeStdPPS = {};\n    uint32_t                            stdSPSId    = {};\n    uint32_t                            stdPPSId    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH264SessionParametersGetInfoKHR>\n  {\n    using Type = VideoEncodeH264SessionParametersGetInfoKHR;\n  };\n\n  struct VideoEncodeH265CapabilitiesKHR\n  {\n    using NativeType = VkVideoEncodeH265CapabilitiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH265CapabilitiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265CapabilitiesKHR( VULKAN_HPP_NAMESPACE::VideoEncodeH265CapabilityFlagsKHR         flags_                       = {},\n                                                         StdVideoH265LevelIdc                                            maxLevelIdc_                 = {},\n                                                         uint32_t                                                        maxSliceSegmentCount_        = {},\n                                                         VULKAN_HPP_NAMESPACE::Extent2D                                  maxTiles_                    = {},\n                                                         VULKAN_HPP_NAMESPACE::VideoEncodeH265CtbSizeFlagsKHR            ctbSizes_                    = {},\n                                                         VULKAN_HPP_NAMESPACE::VideoEncodeH265TransformBlockSizeFlagsKHR transformBlockSizes_         = {},\n                                                         uint32_t                                                        maxPPictureL0ReferenceCount_ = {},\n                                                         uint32_t                                                        maxBPictureL0ReferenceCount_ = {},\n                                                         uint32_t                                                        maxL1ReferenceCount_         = {},\n                                                         uint32_t                                                        maxSubLayerCount_            = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32                     expectDyadicTemporalSubLayerPattern_        = {},\n                                                         int32_t                                          minQp_                                      = {},\n                                                         int32_t                                          maxQp_                                      = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32                     prefersGopRemainingFrames_                  = {},\n                                                         VULKAN_HPP_NAMESPACE::Bool32                     requiresGopRemainingFrames_                 = {},\n                                                         VULKAN_HPP_NAMESPACE::VideoEncodeH265StdFlagsKHR stdSyntaxFlags_                             = {},\n                                                         void *                                           pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , maxLevelIdc{ maxLevelIdc_ }\n      , maxSliceSegmentCount{ maxSliceSegmentCount_ }\n      , maxTiles{ maxTiles_ }\n      , ctbSizes{ ctbSizes_ }\n      , transformBlockSizes{ transformBlockSizes_ }\n      , maxPPictureL0ReferenceCount{ maxPPictureL0ReferenceCount_ }\n      , maxBPictureL0ReferenceCount{ maxBPictureL0ReferenceCount_ }\n      , maxL1ReferenceCount{ maxL1ReferenceCount_ }\n      , maxSubLayerCount{ maxSubLayerCount_ }\n      , expectDyadicTemporalSubLayerPattern{ expectDyadicTemporalSubLayerPattern_ }\n      , minQp{ minQp_ }\n      , maxQp{ maxQp_ }\n      , prefersGopRemainingFrames{ prefersGopRemainingFrames_ }\n      , requiresGopRemainingFrames{ requiresGopRemainingFrames_ }\n      , stdSyntaxFlags{ stdSyntaxFlags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265CapabilitiesKHR( VideoEncodeH265CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH265CapabilitiesKHR( VkVideoEncodeH265CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH265CapabilitiesKHR( *reinterpret_cast<VideoEncodeH265CapabilitiesKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH265CapabilitiesKHR & operator=( VideoEncodeH265CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH265CapabilitiesKHR & operator=( VkVideoEncodeH265CapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH265CapabilitiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoEncodeH265CapabilitiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH265CapabilitiesKHR *>( this );\n    }\n\n    operator VkVideoEncodeH265CapabilitiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH265CapabilitiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeH265CapabilityFlagsKHR const &,\n               StdVideoH265LevelIdc const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeH265CtbSizeFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeH265TransformBlockSizeFlagsKHR const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               int32_t const &,\n               int32_t const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeH265StdFlagsKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       flags,\n                       maxLevelIdc,\n                       maxSliceSegmentCount,\n                       maxTiles,\n                       ctbSizes,\n                       transformBlockSizes,\n                       maxPPictureL0ReferenceCount,\n                       maxBPictureL0ReferenceCount,\n                       maxL1ReferenceCount,\n                       maxSubLayerCount,\n                       expectDyadicTemporalSubLayerPattern,\n                       minQp,\n                       maxQp,\n                       prefersGopRemainingFrames,\n                       requiresGopRemainingFrames,\n                       stdSyntaxFlags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( VideoEncodeH265CapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = flags <=> rhs.flags; cmp != 0 )\n        return cmp;\n      if ( auto cmp = memcmp( &maxLevelIdc, &rhs.maxLevelIdc, sizeof( StdVideoH265LevelIdc ) ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n      if ( auto cmp = maxSliceSegmentCount <=> rhs.maxSliceSegmentCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxTiles <=> rhs.maxTiles; cmp != 0 )\n        return cmp;\n      if ( auto cmp = ctbSizes <=> rhs.ctbSizes; cmp != 0 )\n        return cmp;\n      if ( auto cmp = transformBlockSizes <=> rhs.transformBlockSizes; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxPPictureL0ReferenceCount <=> rhs.maxPPictureL0ReferenceCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxBPictureL0ReferenceCount <=> rhs.maxBPictureL0ReferenceCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxL1ReferenceCount <=> rhs.maxL1ReferenceCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxSubLayerCount <=> rhs.maxSubLayerCount; cmp != 0 )\n        return cmp;\n      if ( auto cmp = expectDyadicTemporalSubLayerPattern <=> rhs.expectDyadicTemporalSubLayerPattern; cmp != 0 )\n        return cmp;\n      if ( auto cmp = minQp <=> rhs.minQp; cmp != 0 )\n        return cmp;\n      if ( auto cmp = maxQp <=> rhs.maxQp; cmp != 0 )\n        return cmp;\n      if ( auto cmp = prefersGopRemainingFrames <=> rhs.prefersGopRemainingFrames; cmp != 0 )\n        return cmp;\n      if ( auto cmp = requiresGopRemainingFrames <=> rhs.requiresGopRemainingFrames; cmp != 0 )\n        return cmp;\n      if ( auto cmp = stdSyntaxFlags <=> rhs.stdSyntaxFlags; cmp != 0 )\n        return cmp;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( VideoEncodeH265CapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) &&\n             ( memcmp( &maxLevelIdc, &rhs.maxLevelIdc, sizeof( StdVideoH265LevelIdc ) ) == 0 ) && ( maxSliceSegmentCount == rhs.maxSliceSegmentCount ) &&\n             ( maxTiles == rhs.maxTiles ) && ( ctbSizes == rhs.ctbSizes ) && ( transformBlockSizes == rhs.transformBlockSizes ) &&\n             ( maxPPictureL0ReferenceCount == rhs.maxPPictureL0ReferenceCount ) && ( maxBPictureL0ReferenceCount == rhs.maxBPictureL0ReferenceCount ) &&\n             ( maxL1ReferenceCount == rhs.maxL1ReferenceCount ) && ( maxSubLayerCount == rhs.maxSubLayerCount ) &&\n             ( expectDyadicTemporalSubLayerPattern == rhs.expectDyadicTemporalSubLayerPattern ) && ( minQp == rhs.minQp ) && ( maxQp == rhs.maxQp ) &&\n             ( prefersGopRemainingFrames == rhs.prefersGopRemainingFrames ) && ( requiresGopRemainingFrames == rhs.requiresGopRemainingFrames ) &&\n             ( stdSyntaxFlags == rhs.stdSyntaxFlags );\n    }\n\n    bool operator!=( VideoEncodeH265CapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                             sType                               = StructureType::eVideoEncodeH265CapabilitiesKHR;\n    void *                                                          pNext                               = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeH265CapabilityFlagsKHR         flags                               = {};\n    StdVideoH265LevelIdc                                            maxLevelIdc                         = {};\n    uint32_t                                                        maxSliceSegmentCount                = {};\n    VULKAN_HPP_NAMESPACE::Extent2D                                  maxTiles                            = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeH265CtbSizeFlagsKHR            ctbSizes                            = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeH265TransformBlockSizeFlagsKHR transformBlockSizes                 = {};\n    uint32_t                                                        maxPPictureL0ReferenceCount         = {};\n    uint32_t                                                        maxBPictureL0ReferenceCount         = {};\n    uint32_t                                                        maxL1ReferenceCount                 = {};\n    uint32_t                                                        maxSubLayerCount                    = {};\n    VULKAN_HPP_NAMESPACE::Bool32                                    expectDyadicTemporalSubLayerPattern = {};\n    int32_t                                                         minQp                               = {};\n    int32_t                                                         maxQp                               = {};\n    VULKAN_HPP_NAMESPACE::Bool32                                    prefersGopRemainingFrames           = {};\n    VULKAN_HPP_NAMESPACE::Bool32                                    requiresGopRemainingFrames          = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeH265StdFlagsKHR                stdSyntaxFlags                      = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH265CapabilitiesKHR>\n  {\n    using Type = VideoEncodeH265CapabilitiesKHR;\n  };\n\n  struct VideoEncodeH265DpbSlotInfoKHR\n  {\n    using NativeType = VkVideoEncodeH265DpbSlotInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH265DpbSlotInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265DpbSlotInfoKHR( const StdVideoEncodeH265ReferenceInfo * pStdReferenceInfo_ = {},\n                                                        const void *                            pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , pStdReferenceInfo{ pStdReferenceInfo_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265DpbSlotInfoKHR( VideoEncodeH265DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH265DpbSlotInfoKHR( VkVideoEncodeH265DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH265DpbSlotInfoKHR( *reinterpret_cast<VideoEncodeH265DpbSlotInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH265DpbSlotInfoKHR & operator=( VideoEncodeH265DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH265DpbSlotInfoKHR & operator=( VkVideoEncodeH265DpbSlotInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH265DpbSlotInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265DpbSlotInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265DpbSlotInfoKHR &\n      setPStdReferenceInfo( const StdVideoEncodeH265ReferenceInfo * pStdReferenceInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdReferenceInfo = pStdReferenceInfo_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH265DpbSlotInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH265DpbSlotInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH265DpbSlotInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH265DpbSlotInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, const StdVideoEncodeH265ReferenceInfo * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, pStdReferenceInfo );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH265DpbSlotInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH265DpbSlotInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( pStdReferenceInfo == rhs.pStdReferenceInfo );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH265DpbSlotInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType     sType             = StructureType::eVideoEncodeH265DpbSlotInfoKHR;\n    const void *                            pNext             = {};\n    const StdVideoEncodeH265ReferenceInfo * pStdReferenceInfo = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH265DpbSlotInfoKHR>\n  {\n    using Type = VideoEncodeH265DpbSlotInfoKHR;\n  };\n\n  struct VideoEncodeH265FrameSizeKHR\n  {\n    using NativeType = VkVideoEncodeH265FrameSizeKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265FrameSizeKHR( uint32_t frameISize_ = {}, uint32_t framePSize_ = {}, uint32_t frameBSize_ = {} ) VULKAN_HPP_NOEXCEPT\n      : frameISize{ frameISize_ }\n      , framePSize{ framePSize_ }\n      , frameBSize{ frameBSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265FrameSizeKHR( VideoEncodeH265FrameSizeKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH265FrameSizeKHR( VkVideoEncodeH265FrameSizeKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH265FrameSizeKHR( *reinterpret_cast<VideoEncodeH265FrameSizeKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH265FrameSizeKHR & operator=( VideoEncodeH265FrameSizeKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH265FrameSizeKHR & operator=( VkVideoEncodeH265FrameSizeKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH265FrameSizeKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265FrameSizeKHR & setFrameISize( uint32_t frameISize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      frameISize = frameISize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265FrameSizeKHR & setFramePSize( uint32_t framePSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      framePSize = framePSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265FrameSizeKHR & setFrameBSize( uint32_t frameBSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      frameBSize = frameBSize_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH265FrameSizeKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH265FrameSizeKHR *>( this );\n    }\n\n    operator VkVideoEncodeH265FrameSizeKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH265FrameSizeKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<uint32_t const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( frameISize, framePSize, frameBSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH265FrameSizeKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH265FrameSizeKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( frameISize == rhs.frameISize ) && ( framePSize == rhs.framePSize ) && ( frameBSize == rhs.frameBSize );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH265FrameSizeKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    uint32_t frameISize = {};\n    uint32_t framePSize = {};\n    uint32_t frameBSize = {};\n  };\n\n  struct VideoEncodeH265GopRemainingFrameInfoKHR\n  {\n    using NativeType = VkVideoEncodeH265GopRemainingFrameInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH265GopRemainingFrameInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265GopRemainingFrameInfoKHR( VULKAN_HPP_NAMESPACE::Bool32 useGopRemainingFrames_ = {},\n                                                                  uint32_t                     gopRemainingI_         = {},\n                                                                  uint32_t                     gopRemainingP_         = {},\n                                                                  uint32_t                     gopRemainingB_         = {},\n                                                                  const void *                 pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , useGopRemainingFrames{ useGopRemainingFrames_ }\n      , gopRemainingI{ gopRemainingI_ }\n      , gopRemainingP{ gopRemainingP_ }\n      , gopRemainingB{ gopRemainingB_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265GopRemainingFrameInfoKHR( VideoEncodeH265GopRemainingFrameInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH265GopRemainingFrameInfoKHR( VkVideoEncodeH265GopRemainingFrameInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH265GopRemainingFrameInfoKHR( *reinterpret_cast<VideoEncodeH265GopRemainingFrameInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH265GopRemainingFrameInfoKHR & operator=( VideoEncodeH265GopRemainingFrameInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH265GopRemainingFrameInfoKHR & operator=( VkVideoEncodeH265GopRemainingFrameInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH265GopRemainingFrameInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265GopRemainingFrameInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265GopRemainingFrameInfoKHR &\n      setUseGopRemainingFrames( VULKAN_HPP_NAMESPACE::Bool32 useGopRemainingFrames_ ) VULKAN_HPP_NOEXCEPT\n    {\n      useGopRemainingFrames = useGopRemainingFrames_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265GopRemainingFrameInfoKHR & setGopRemainingI( uint32_t gopRemainingI_ ) VULKAN_HPP_NOEXCEPT\n    {\n      gopRemainingI = gopRemainingI_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265GopRemainingFrameInfoKHR & setGopRemainingP( uint32_t gopRemainingP_ ) VULKAN_HPP_NOEXCEPT\n    {\n      gopRemainingP = gopRemainingP_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265GopRemainingFrameInfoKHR & setGopRemainingB( uint32_t gopRemainingB_ ) VULKAN_HPP_NOEXCEPT\n    {\n      gopRemainingB = gopRemainingB_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH265GopRemainingFrameInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH265GopRemainingFrameInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH265GopRemainingFrameInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH265GopRemainingFrameInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, useGopRemainingFrames, gopRemainingI, gopRemainingP, gopRemainingB );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH265GopRemainingFrameInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH265GopRemainingFrameInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( useGopRemainingFrames == rhs.useGopRemainingFrames ) &&\n             ( gopRemainingI == rhs.gopRemainingI ) && ( gopRemainingP == rhs.gopRemainingP ) && ( gopRemainingB == rhs.gopRemainingB );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH265GopRemainingFrameInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                 = StructureType::eVideoEncodeH265GopRemainingFrameInfoKHR;\n    const void *                        pNext                 = {};\n    VULKAN_HPP_NAMESPACE::Bool32        useGopRemainingFrames = {};\n    uint32_t                            gopRemainingI         = {};\n    uint32_t                            gopRemainingP         = {};\n    uint32_t                            gopRemainingB         = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH265GopRemainingFrameInfoKHR>\n  {\n    using Type = VideoEncodeH265GopRemainingFrameInfoKHR;\n  };\n\n  struct VideoEncodeH265NaluSliceSegmentInfoKHR\n  {\n    using NativeType = VkVideoEncodeH265NaluSliceSegmentInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH265NaluSliceSegmentInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265NaluSliceSegmentInfoKHR( int32_t                                      constantQp_             = {},\n                                                                 const StdVideoEncodeH265SliceSegmentHeader * pStdSliceSegmentHeader_ = {},\n                                                                 const void *                                 pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , constantQp{ constantQp_ }\n      , pStdSliceSegmentHeader{ pStdSliceSegmentHeader_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265NaluSliceSegmentInfoKHR( VideoEncodeH265NaluSliceSegmentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH265NaluSliceSegmentInfoKHR( VkVideoEncodeH265NaluSliceSegmentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH265NaluSliceSegmentInfoKHR( *reinterpret_cast<VideoEncodeH265NaluSliceSegmentInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH265NaluSliceSegmentInfoKHR & operator=( VideoEncodeH265NaluSliceSegmentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH265NaluSliceSegmentInfoKHR & operator=( VkVideoEncodeH265NaluSliceSegmentInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH265NaluSliceSegmentInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265NaluSliceSegmentInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265NaluSliceSegmentInfoKHR & setConstantQp( int32_t constantQp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      constantQp = constantQp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265NaluSliceSegmentInfoKHR &\n      setPStdSliceSegmentHeader( const StdVideoEncodeH265SliceSegmentHeader * pStdSliceSegmentHeader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdSliceSegmentHeader = pStdSliceSegmentHeader_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH265NaluSliceSegmentInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH265NaluSliceSegmentInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH265NaluSliceSegmentInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH265NaluSliceSegmentInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, int32_t const &, const StdVideoEncodeH265SliceSegmentHeader * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, constantQp, pStdSliceSegmentHeader );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH265NaluSliceSegmentInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH265NaluSliceSegmentInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( constantQp == rhs.constantQp ) && ( pStdSliceSegmentHeader == rhs.pStdSliceSegmentHeader );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH265NaluSliceSegmentInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType                  = StructureType::eVideoEncodeH265NaluSliceSegmentInfoKHR;\n    const void *                                 pNext                  = {};\n    int32_t                                      constantQp             = {};\n    const StdVideoEncodeH265SliceSegmentHeader * pStdSliceSegmentHeader = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH265NaluSliceSegmentInfoKHR>\n  {\n    using Type = VideoEncodeH265NaluSliceSegmentInfoKHR;\n  };\n\n  struct VideoEncodeH265PictureInfoKHR\n  {\n    using NativeType = VkVideoEncodeH265PictureInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH265PictureInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265PictureInfoKHR( uint32_t                                                             naluSliceSegmentEntryCount_ = {},\n                                                        const VULKAN_HPP_NAMESPACE::VideoEncodeH265NaluSliceSegmentInfoKHR * pNaluSliceSegmentEntries_   = {},\n                                                        const StdVideoEncodeH265PictureInfo *                                pStdPictureInfo_            = {},\n                                                        const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , naluSliceSegmentEntryCount{ naluSliceSegmentEntryCount_ }\n      , pNaluSliceSegmentEntries{ pNaluSliceSegmentEntries_ }\n      , pStdPictureInfo{ pStdPictureInfo_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265PictureInfoKHR( VideoEncodeH265PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH265PictureInfoKHR( VkVideoEncodeH265PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH265PictureInfoKHR( *reinterpret_cast<VideoEncodeH265PictureInfoKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoEncodeH265PictureInfoKHR(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VideoEncodeH265NaluSliceSegmentInfoKHR> const & naluSliceSegmentEntries_,\n      const StdVideoEncodeH265PictureInfo *                                                                                     pStdPictureInfo_ = {},\n      const void *                                                                                                              pNext_           = nullptr )\n      : pNext( pNext_ )\n      , naluSliceSegmentEntryCount( static_cast<uint32_t>( naluSliceSegmentEntries_.size() ) )\n      , pNaluSliceSegmentEntries( naluSliceSegmentEntries_.data() )\n      , pStdPictureInfo( pStdPictureInfo_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VideoEncodeH265PictureInfoKHR & operator=( VideoEncodeH265PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH265PictureInfoKHR & operator=( VkVideoEncodeH265PictureInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH265PictureInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265PictureInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265PictureInfoKHR & setNaluSliceSegmentEntryCount( uint32_t naluSliceSegmentEntryCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      naluSliceSegmentEntryCount = naluSliceSegmentEntryCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265PictureInfoKHR &\n      setPNaluSliceSegmentEntries( const VULKAN_HPP_NAMESPACE::VideoEncodeH265NaluSliceSegmentInfoKHR * pNaluSliceSegmentEntries_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNaluSliceSegmentEntries = pNaluSliceSegmentEntries_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoEncodeH265PictureInfoKHR & setNaluSliceSegmentEntries(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VideoEncodeH265NaluSliceSegmentInfoKHR> const & naluSliceSegmentEntries_ )\n      VULKAN_HPP_NOEXCEPT\n    {\n      naluSliceSegmentEntryCount = static_cast<uint32_t>( naluSliceSegmentEntries_.size() );\n      pNaluSliceSegmentEntries   = naluSliceSegmentEntries_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265PictureInfoKHR & setPStdPictureInfo( const StdVideoEncodeH265PictureInfo * pStdPictureInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdPictureInfo = pStdPictureInfo_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH265PictureInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH265PictureInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH265PictureInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH265PictureInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::VideoEncodeH265NaluSliceSegmentInfoKHR * const &,\n               const StdVideoEncodeH265PictureInfo * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, naluSliceSegmentEntryCount, pNaluSliceSegmentEntries, pStdPictureInfo );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH265PictureInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH265PictureInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( naluSliceSegmentEntryCount == rhs.naluSliceSegmentEntryCount ) &&\n             ( pNaluSliceSegmentEntries == rhs.pNaluSliceSegmentEntries ) && ( pStdPictureInfo == rhs.pStdPictureInfo );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH265PictureInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                  sType                      = StructureType::eVideoEncodeH265PictureInfoKHR;\n    const void *                                                         pNext                      = {};\n    uint32_t                                                             naluSliceSegmentEntryCount = {};\n    const VULKAN_HPP_NAMESPACE::VideoEncodeH265NaluSliceSegmentInfoKHR * pNaluSliceSegmentEntries   = {};\n    const StdVideoEncodeH265PictureInfo *                                pStdPictureInfo            = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH265PictureInfoKHR>\n  {\n    using Type = VideoEncodeH265PictureInfoKHR;\n  };\n\n  struct VideoEncodeH265ProfileInfoKHR\n  {\n    using NativeType = VkVideoEncodeH265ProfileInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH265ProfileInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265ProfileInfoKHR( StdVideoH265ProfileIdc stdProfileIdc_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stdProfileIdc{ stdProfileIdc_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265ProfileInfoKHR( VideoEncodeH265ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH265ProfileInfoKHR( VkVideoEncodeH265ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH265ProfileInfoKHR( *reinterpret_cast<VideoEncodeH265ProfileInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH265ProfileInfoKHR & operator=( VideoEncodeH265ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH265ProfileInfoKHR & operator=( VkVideoEncodeH265ProfileInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH265ProfileInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265ProfileInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265ProfileInfoKHR & setStdProfileIdc( StdVideoH265ProfileIdc stdProfileIdc_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdProfileIdc = stdProfileIdc_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH265ProfileInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH265ProfileInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH265ProfileInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH265ProfileInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, StdVideoH265ProfileIdc const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stdProfileIdc );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( VideoEncodeH265ProfileInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = memcmp( &stdProfileIdc, &rhs.stdProfileIdc, sizeof( StdVideoH265ProfileIdc ) ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( VideoEncodeH265ProfileInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memcmp( &stdProfileIdc, &rhs.stdProfileIdc, sizeof( StdVideoH265ProfileIdc ) ) == 0 );\n    }\n\n    bool operator!=( VideoEncodeH265ProfileInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType         = StructureType::eVideoEncodeH265ProfileInfoKHR;\n    const void *                        pNext         = {};\n    StdVideoH265ProfileIdc              stdProfileIdc = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH265ProfileInfoKHR>\n  {\n    using Type = VideoEncodeH265ProfileInfoKHR;\n  };\n\n  struct VideoEncodeH265QpKHR\n  {\n    using NativeType = VkVideoEncodeH265QpKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265QpKHR( int32_t qpI_ = {}, int32_t qpP_ = {}, int32_t qpB_ = {} ) VULKAN_HPP_NOEXCEPT\n      : qpI{ qpI_ }\n      , qpP{ qpP_ }\n      , qpB{ qpB_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265QpKHR( VideoEncodeH265QpKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH265QpKHR( VkVideoEncodeH265QpKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH265QpKHR( *reinterpret_cast<VideoEncodeH265QpKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH265QpKHR & operator=( VideoEncodeH265QpKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH265QpKHR & operator=( VkVideoEncodeH265QpKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH265QpKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265QpKHR & setQpI( int32_t qpI_ ) VULKAN_HPP_NOEXCEPT\n    {\n      qpI = qpI_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265QpKHR & setQpP( int32_t qpP_ ) VULKAN_HPP_NOEXCEPT\n    {\n      qpP = qpP_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265QpKHR & setQpB( int32_t qpB_ ) VULKAN_HPP_NOEXCEPT\n    {\n      qpB = qpB_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH265QpKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH265QpKHR *>( this );\n    }\n\n    operator VkVideoEncodeH265QpKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH265QpKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<int32_t const &, int32_t const &, int32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( qpI, qpP, qpB );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH265QpKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH265QpKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( qpI == rhs.qpI ) && ( qpP == rhs.qpP ) && ( qpB == rhs.qpB );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH265QpKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    int32_t qpI = {};\n    int32_t qpP = {};\n    int32_t qpB = {};\n  };\n\n  struct VideoEncodeH265QualityLevelPropertiesKHR\n  {\n    using NativeType = VkVideoEncodeH265QualityLevelPropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH265QualityLevelPropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265QualityLevelPropertiesKHR( VULKAN_HPP_NAMESPACE::VideoEncodeH265RateControlFlagsKHR preferredRateControlFlags_ = {},\n                                                                   uint32_t                                                 preferredGopFrameCount_    = {},\n                                                                   uint32_t                                                 preferredIdrPeriod_        = {},\n                                                                   uint32_t                                   preferredConsecutiveBFrameCount_         = {},\n                                                                   uint32_t                                   preferredSubLayerCount_                  = {},\n                                                                   VULKAN_HPP_NAMESPACE::VideoEncodeH265QpKHR preferredConstantQp_                     = {},\n                                                                   uint32_t                                   preferredMaxL0ReferenceCount_            = {},\n                                                                   uint32_t                                   preferredMaxL1ReferenceCount_            = {},\n                                                                   void *                                     pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , preferredRateControlFlags{ preferredRateControlFlags_ }\n      , preferredGopFrameCount{ preferredGopFrameCount_ }\n      , preferredIdrPeriod{ preferredIdrPeriod_ }\n      , preferredConsecutiveBFrameCount{ preferredConsecutiveBFrameCount_ }\n      , preferredSubLayerCount{ preferredSubLayerCount_ }\n      , preferredConstantQp{ preferredConstantQp_ }\n      , preferredMaxL0ReferenceCount{ preferredMaxL0ReferenceCount_ }\n      , preferredMaxL1ReferenceCount{ preferredMaxL1ReferenceCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265QualityLevelPropertiesKHR( VideoEncodeH265QualityLevelPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH265QualityLevelPropertiesKHR( VkVideoEncodeH265QualityLevelPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH265QualityLevelPropertiesKHR( *reinterpret_cast<VideoEncodeH265QualityLevelPropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH265QualityLevelPropertiesKHR & operator=( VideoEncodeH265QualityLevelPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH265QualityLevelPropertiesKHR & operator=( VkVideoEncodeH265QualityLevelPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH265QualityLevelPropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoEncodeH265QualityLevelPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH265QualityLevelPropertiesKHR *>( this );\n    }\n\n    operator VkVideoEncodeH265QualityLevelPropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH265QualityLevelPropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeH265RateControlFlagsKHR const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeH265QpKHR const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       preferredRateControlFlags,\n                       preferredGopFrameCount,\n                       preferredIdrPeriod,\n                       preferredConsecutiveBFrameCount,\n                       preferredSubLayerCount,\n                       preferredConstantQp,\n                       preferredMaxL0ReferenceCount,\n                       preferredMaxL1ReferenceCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH265QualityLevelPropertiesKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH265QualityLevelPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( preferredRateControlFlags == rhs.preferredRateControlFlags ) &&\n             ( preferredGopFrameCount == rhs.preferredGopFrameCount ) && ( preferredIdrPeriod == rhs.preferredIdrPeriod ) &&\n             ( preferredConsecutiveBFrameCount == rhs.preferredConsecutiveBFrameCount ) && ( preferredSubLayerCount == rhs.preferredSubLayerCount ) &&\n             ( preferredConstantQp == rhs.preferredConstantQp ) && ( preferredMaxL0ReferenceCount == rhs.preferredMaxL0ReferenceCount ) &&\n             ( preferredMaxL1ReferenceCount == rhs.preferredMaxL1ReferenceCount );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH265QualityLevelPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                      sType                           = StructureType::eVideoEncodeH265QualityLevelPropertiesKHR;\n    void *                                                   pNext                           = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeH265RateControlFlagsKHR preferredRateControlFlags       = {};\n    uint32_t                                                 preferredGopFrameCount          = {};\n    uint32_t                                                 preferredIdrPeriod              = {};\n    uint32_t                                                 preferredConsecutiveBFrameCount = {};\n    uint32_t                                                 preferredSubLayerCount          = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeH265QpKHR               preferredConstantQp             = {};\n    uint32_t                                                 preferredMaxL0ReferenceCount    = {};\n    uint32_t                                                 preferredMaxL1ReferenceCount    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH265QualityLevelPropertiesKHR>\n  {\n    using Type = VideoEncodeH265QualityLevelPropertiesKHR;\n  };\n\n  struct VideoEncodeH265QuantizationMapCapabilitiesKHR\n  {\n    using NativeType = VkVideoEncodeH265QuantizationMapCapabilitiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH265QuantizationMapCapabilitiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      VideoEncodeH265QuantizationMapCapabilitiesKHR( int32_t minQpDelta_ = {}, int32_t maxQpDelta_ = {}, void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , minQpDelta{ minQpDelta_ }\n      , maxQpDelta{ maxQpDelta_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      VideoEncodeH265QuantizationMapCapabilitiesKHR( VideoEncodeH265QuantizationMapCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH265QuantizationMapCapabilitiesKHR( VkVideoEncodeH265QuantizationMapCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH265QuantizationMapCapabilitiesKHR( *reinterpret_cast<VideoEncodeH265QuantizationMapCapabilitiesKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH265QuantizationMapCapabilitiesKHR & operator=( VideoEncodeH265QuantizationMapCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH265QuantizationMapCapabilitiesKHR & operator=( VkVideoEncodeH265QuantizationMapCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH265QuantizationMapCapabilitiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoEncodeH265QuantizationMapCapabilitiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH265QuantizationMapCapabilitiesKHR *>( this );\n    }\n\n    operator VkVideoEncodeH265QuantizationMapCapabilitiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH265QuantizationMapCapabilitiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, int32_t const &, int32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, minQpDelta, maxQpDelta );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH265QuantizationMapCapabilitiesKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH265QuantizationMapCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( minQpDelta == rhs.minQpDelta ) && ( maxQpDelta == rhs.maxQpDelta );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH265QuantizationMapCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType      = StructureType::eVideoEncodeH265QuantizationMapCapabilitiesKHR;\n    void *                              pNext      = {};\n    int32_t                             minQpDelta = {};\n    int32_t                             maxQpDelta = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH265QuantizationMapCapabilitiesKHR>\n  {\n    using Type = VideoEncodeH265QuantizationMapCapabilitiesKHR;\n  };\n\n  struct VideoEncodeH265RateControlInfoKHR\n  {\n    using NativeType = VkVideoEncodeH265RateControlInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH265RateControlInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265RateControlInfoKHR( VULKAN_HPP_NAMESPACE::VideoEncodeH265RateControlFlagsKHR flags_                  = {},\n                                                            uint32_t                                                 gopFrameCount_          = {},\n                                                            uint32_t                                                 idrPeriod_              = {},\n                                                            uint32_t                                                 consecutiveBFrameCount_ = {},\n                                                            uint32_t                                                 subLayerCount_          = {},\n                                                            const void *                                             pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , gopFrameCount{ gopFrameCount_ }\n      , idrPeriod{ idrPeriod_ }\n      , consecutiveBFrameCount{ consecutiveBFrameCount_ }\n      , subLayerCount{ subLayerCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265RateControlInfoKHR( VideoEncodeH265RateControlInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH265RateControlInfoKHR( VkVideoEncodeH265RateControlInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH265RateControlInfoKHR( *reinterpret_cast<VideoEncodeH265RateControlInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH265RateControlInfoKHR & operator=( VideoEncodeH265RateControlInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH265RateControlInfoKHR & operator=( VkVideoEncodeH265RateControlInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH265RateControlInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265RateControlInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265RateControlInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::VideoEncodeH265RateControlFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265RateControlInfoKHR & setGopFrameCount( uint32_t gopFrameCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      gopFrameCount = gopFrameCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265RateControlInfoKHR & setIdrPeriod( uint32_t idrPeriod_ ) VULKAN_HPP_NOEXCEPT\n    {\n      idrPeriod = idrPeriod_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265RateControlInfoKHR & setConsecutiveBFrameCount( uint32_t consecutiveBFrameCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      consecutiveBFrameCount = consecutiveBFrameCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265RateControlInfoKHR & setSubLayerCount( uint32_t subLayerCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      subLayerCount = subLayerCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH265RateControlInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH265RateControlInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH265RateControlInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH265RateControlInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeH265RateControlFlagsKHR const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, gopFrameCount, idrPeriod, consecutiveBFrameCount, subLayerCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH265RateControlInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH265RateControlInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( gopFrameCount == rhs.gopFrameCount ) &&\n             ( idrPeriod == rhs.idrPeriod ) && ( consecutiveBFrameCount == rhs.consecutiveBFrameCount ) && ( subLayerCount == rhs.subLayerCount );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH265RateControlInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                      sType                  = StructureType::eVideoEncodeH265RateControlInfoKHR;\n    const void *                                             pNext                  = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeH265RateControlFlagsKHR flags                  = {};\n    uint32_t                                                 gopFrameCount          = {};\n    uint32_t                                                 idrPeriod              = {};\n    uint32_t                                                 consecutiveBFrameCount = {};\n    uint32_t                                                 subLayerCount          = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH265RateControlInfoKHR>\n  {\n    using Type = VideoEncodeH265RateControlInfoKHR;\n  };\n\n  struct VideoEncodeH265RateControlLayerInfoKHR\n  {\n    using NativeType = VkVideoEncodeH265RateControlLayerInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH265RateControlLayerInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265RateControlLayerInfoKHR( VULKAN_HPP_NAMESPACE::Bool32                      useMinQp_        = {},\n                                                                 VULKAN_HPP_NAMESPACE::VideoEncodeH265QpKHR        minQp_           = {},\n                                                                 VULKAN_HPP_NAMESPACE::Bool32                      useMaxQp_        = {},\n                                                                 VULKAN_HPP_NAMESPACE::VideoEncodeH265QpKHR        maxQp_           = {},\n                                                                 VULKAN_HPP_NAMESPACE::Bool32                      useMaxFrameSize_ = {},\n                                                                 VULKAN_HPP_NAMESPACE::VideoEncodeH265FrameSizeKHR maxFrameSize_    = {},\n                                                                 const void *                                      pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , useMinQp{ useMinQp_ }\n      , minQp{ minQp_ }\n      , useMaxQp{ useMaxQp_ }\n      , maxQp{ maxQp_ }\n      , useMaxFrameSize{ useMaxFrameSize_ }\n      , maxFrameSize{ maxFrameSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265RateControlLayerInfoKHR( VideoEncodeH265RateControlLayerInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH265RateControlLayerInfoKHR( VkVideoEncodeH265RateControlLayerInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH265RateControlLayerInfoKHR( *reinterpret_cast<VideoEncodeH265RateControlLayerInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH265RateControlLayerInfoKHR & operator=( VideoEncodeH265RateControlLayerInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH265RateControlLayerInfoKHR & operator=( VkVideoEncodeH265RateControlLayerInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH265RateControlLayerInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265RateControlLayerInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265RateControlLayerInfoKHR & setUseMinQp( VULKAN_HPP_NAMESPACE::Bool32 useMinQp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      useMinQp = useMinQp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265RateControlLayerInfoKHR & setMinQp( VULKAN_HPP_NAMESPACE::VideoEncodeH265QpKHR const & minQp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      minQp = minQp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265RateControlLayerInfoKHR & setUseMaxQp( VULKAN_HPP_NAMESPACE::Bool32 useMaxQp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      useMaxQp = useMaxQp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265RateControlLayerInfoKHR & setMaxQp( VULKAN_HPP_NAMESPACE::VideoEncodeH265QpKHR const & maxQp_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxQp = maxQp_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265RateControlLayerInfoKHR & setUseMaxFrameSize( VULKAN_HPP_NAMESPACE::Bool32 useMaxFrameSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      useMaxFrameSize = useMaxFrameSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265RateControlLayerInfoKHR &\n      setMaxFrameSize( VULKAN_HPP_NAMESPACE::VideoEncodeH265FrameSizeKHR const & maxFrameSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxFrameSize = maxFrameSize_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH265RateControlLayerInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH265RateControlLayerInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH265RateControlLayerInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH265RateControlLayerInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeH265QpKHR const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeH265QpKHR const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeH265FrameSizeKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, useMinQp, minQp, useMaxQp, maxQp, useMaxFrameSize, maxFrameSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH265RateControlLayerInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH265RateControlLayerInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( useMinQp == rhs.useMinQp ) && ( minQp == rhs.minQp ) && ( useMaxQp == rhs.useMaxQp ) &&\n             ( maxQp == rhs.maxQp ) && ( useMaxFrameSize == rhs.useMaxFrameSize ) && ( maxFrameSize == rhs.maxFrameSize );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH265RateControlLayerInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType           = StructureType::eVideoEncodeH265RateControlLayerInfoKHR;\n    const void *                                      pNext           = {};\n    VULKAN_HPP_NAMESPACE::Bool32                      useMinQp        = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeH265QpKHR        minQp           = {};\n    VULKAN_HPP_NAMESPACE::Bool32                      useMaxQp        = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeH265QpKHR        maxQp           = {};\n    VULKAN_HPP_NAMESPACE::Bool32                      useMaxFrameSize = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeH265FrameSizeKHR maxFrameSize    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH265RateControlLayerInfoKHR>\n  {\n    using Type = VideoEncodeH265RateControlLayerInfoKHR;\n  };\n\n  struct VideoEncodeH265SessionCreateInfoKHR\n  {\n    using NativeType = VkVideoEncodeH265SessionCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH265SessionCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265SessionCreateInfoKHR( VULKAN_HPP_NAMESPACE::Bool32 useMaxLevelIdc_ = {},\n                                                              StdVideoH265LevelIdc         maxLevelIdc_    = {},\n                                                              const void *                 pNext_          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , useMaxLevelIdc{ useMaxLevelIdc_ }\n      , maxLevelIdc{ maxLevelIdc_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265SessionCreateInfoKHR( VideoEncodeH265SessionCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH265SessionCreateInfoKHR( VkVideoEncodeH265SessionCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH265SessionCreateInfoKHR( *reinterpret_cast<VideoEncodeH265SessionCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH265SessionCreateInfoKHR & operator=( VideoEncodeH265SessionCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH265SessionCreateInfoKHR & operator=( VkVideoEncodeH265SessionCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265SessionCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265SessionCreateInfoKHR & setUseMaxLevelIdc( VULKAN_HPP_NAMESPACE::Bool32 useMaxLevelIdc_ ) VULKAN_HPP_NOEXCEPT\n    {\n      useMaxLevelIdc = useMaxLevelIdc_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265SessionCreateInfoKHR & setMaxLevelIdc( StdVideoH265LevelIdc maxLevelIdc_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxLevelIdc = maxLevelIdc_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH265SessionCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH265SessionCreateInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH265SessionCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH265SessionCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &, StdVideoH265LevelIdc const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, useMaxLevelIdc, maxLevelIdc );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( VideoEncodeH265SessionCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = useMaxLevelIdc <=> rhs.useMaxLevelIdc; cmp != 0 )\n        return cmp;\n      if ( auto cmp = memcmp( &maxLevelIdc, &rhs.maxLevelIdc, sizeof( StdVideoH265LevelIdc ) ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#endif\n\n    bool operator==( VideoEncodeH265SessionCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( useMaxLevelIdc == rhs.useMaxLevelIdc ) &&\n             ( memcmp( &maxLevelIdc, &rhs.maxLevelIdc, sizeof( StdVideoH265LevelIdc ) ) == 0 );\n    }\n\n    bool operator!=( VideoEncodeH265SessionCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::eVideoEncodeH265SessionCreateInfoKHR;\n    const void *                        pNext          = {};\n    VULKAN_HPP_NAMESPACE::Bool32        useMaxLevelIdc = {};\n    StdVideoH265LevelIdc                maxLevelIdc    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH265SessionCreateInfoKHR>\n  {\n    using Type = VideoEncodeH265SessionCreateInfoKHR;\n  };\n\n  struct VideoEncodeH265SessionParametersAddInfoKHR\n  {\n    using NativeType = VkVideoEncodeH265SessionParametersAddInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH265SessionParametersAddInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265SessionParametersAddInfoKHR( uint32_t                                 stdVPSCount_ = {},\n                                                                     const StdVideoH265VideoParameterSet *    pStdVPSs_    = {},\n                                                                     uint32_t                                 stdSPSCount_ = {},\n                                                                     const StdVideoH265SequenceParameterSet * pStdSPSs_    = {},\n                                                                     uint32_t                                 stdPPSCount_ = {},\n                                                                     const StdVideoH265PictureParameterSet *  pStdPPSs_    = {},\n                                                                     const void *                             pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , stdVPSCount{ stdVPSCount_ }\n      , pStdVPSs{ pStdVPSs_ }\n      , stdSPSCount{ stdSPSCount_ }\n      , pStdSPSs{ pStdSPSs_ }\n      , stdPPSCount{ stdPPSCount_ }\n      , pStdPPSs{ pStdPPSs_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265SessionParametersAddInfoKHR( VideoEncodeH265SessionParametersAddInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH265SessionParametersAddInfoKHR( VkVideoEncodeH265SessionParametersAddInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH265SessionParametersAddInfoKHR( *reinterpret_cast<VideoEncodeH265SessionParametersAddInfoKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoEncodeH265SessionParametersAddInfoKHR( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH265VideoParameterSet> const &    stdVPSs_,\n                                                VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH265SequenceParameterSet> const & stdSPSs_ = {},\n                                                VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH265PictureParameterSet> const &  stdPPSs_ = {},\n                                                const void *                                                                                  pNext_ = nullptr )\n      : pNext( pNext_ )\n      , stdVPSCount( static_cast<uint32_t>( stdVPSs_.size() ) )\n      , pStdVPSs( stdVPSs_.data() )\n      , stdSPSCount( static_cast<uint32_t>( stdSPSs_.size() ) )\n      , pStdSPSs( stdSPSs_.data() )\n      , stdPPSCount( static_cast<uint32_t>( stdPPSs_.size() ) )\n      , pStdPPSs( stdPPSs_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VideoEncodeH265SessionParametersAddInfoKHR & operator=( VideoEncodeH265SessionParametersAddInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH265SessionParametersAddInfoKHR & operator=( VkVideoEncodeH265SessionParametersAddInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersAddInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265SessionParametersAddInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265SessionParametersAddInfoKHR & setStdVPSCount( uint32_t stdVPSCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdVPSCount = stdVPSCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265SessionParametersAddInfoKHR & setPStdVPSs( const StdVideoH265VideoParameterSet * pStdVPSs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdVPSs = pStdVPSs_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoEncodeH265SessionParametersAddInfoKHR &\n      setStdVPSs( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH265VideoParameterSet> const & stdVPSs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdVPSCount = static_cast<uint32_t>( stdVPSs_.size() );\n      pStdVPSs    = stdVPSs_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265SessionParametersAddInfoKHR & setStdSPSCount( uint32_t stdSPSCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdSPSCount = stdSPSCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265SessionParametersAddInfoKHR & setPStdSPSs( const StdVideoH265SequenceParameterSet * pStdSPSs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdSPSs = pStdSPSs_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoEncodeH265SessionParametersAddInfoKHR &\n      setStdSPSs( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH265SequenceParameterSet> const & stdSPSs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdSPSCount = static_cast<uint32_t>( stdSPSs_.size() );\n      pStdSPSs    = stdSPSs_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265SessionParametersAddInfoKHR & setStdPPSCount( uint32_t stdPPSCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdPPSCount = stdPPSCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265SessionParametersAddInfoKHR & setPStdPPSs( const StdVideoH265PictureParameterSet * pStdPPSs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdPPSs = pStdPPSs_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoEncodeH265SessionParametersAddInfoKHR &\n      setStdPPSs( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH265PictureParameterSet> const & stdPPSs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdPPSCount = static_cast<uint32_t>( stdPPSs_.size() );\n      pStdPPSs    = stdPPSs_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH265SessionParametersAddInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH265SessionParametersAddInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH265SessionParametersAddInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH265SessionParametersAddInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const StdVideoH265VideoParameterSet * const &,\n               uint32_t const &,\n               const StdVideoH265SequenceParameterSet * const &,\n               uint32_t const &,\n               const StdVideoH265PictureParameterSet * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, stdVPSCount, pStdVPSs, stdSPSCount, pStdSPSs, stdPPSCount, pStdPPSs );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH265SessionParametersAddInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH265SessionParametersAddInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( stdVPSCount == rhs.stdVPSCount ) && ( pStdVPSs == rhs.pStdVPSs ) &&\n             ( stdSPSCount == rhs.stdSPSCount ) && ( pStdSPSs == rhs.pStdSPSs ) && ( stdPPSCount == rhs.stdPPSCount ) && ( pStdPPSs == rhs.pStdPPSs );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH265SessionParametersAddInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType      sType       = StructureType::eVideoEncodeH265SessionParametersAddInfoKHR;\n    const void *                             pNext       = {};\n    uint32_t                                 stdVPSCount = {};\n    const StdVideoH265VideoParameterSet *    pStdVPSs    = {};\n    uint32_t                                 stdSPSCount = {};\n    const StdVideoH265SequenceParameterSet * pStdSPSs    = {};\n    uint32_t                                 stdPPSCount = {};\n    const StdVideoH265PictureParameterSet *  pStdPPSs    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH265SessionParametersAddInfoKHR>\n  {\n    using Type = VideoEncodeH265SessionParametersAddInfoKHR;\n  };\n\n  struct VideoEncodeH265SessionParametersCreateInfoKHR\n  {\n    using NativeType = VkVideoEncodeH265SessionParametersCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH265SessionParametersCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      VideoEncodeH265SessionParametersCreateInfoKHR( uint32_t                                                                 maxStdVPSCount_     = {},\n                                                     uint32_t                                                                 maxStdSPSCount_     = {},\n                                                     uint32_t                                                                 maxStdPPSCount_     = {},\n                                                     const VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersAddInfoKHR * pParametersAddInfo_ = {},\n                                                     const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxStdVPSCount{ maxStdVPSCount_ }\n      , maxStdSPSCount{ maxStdSPSCount_ }\n      , maxStdPPSCount{ maxStdPPSCount_ }\n      , pParametersAddInfo{ pParametersAddInfo_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      VideoEncodeH265SessionParametersCreateInfoKHR( VideoEncodeH265SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH265SessionParametersCreateInfoKHR( VkVideoEncodeH265SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH265SessionParametersCreateInfoKHR( *reinterpret_cast<VideoEncodeH265SessionParametersCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH265SessionParametersCreateInfoKHR & operator=( VideoEncodeH265SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH265SessionParametersCreateInfoKHR & operator=( VkVideoEncodeH265SessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265SessionParametersCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265SessionParametersCreateInfoKHR & setMaxStdVPSCount( uint32_t maxStdVPSCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxStdVPSCount = maxStdVPSCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265SessionParametersCreateInfoKHR & setMaxStdSPSCount( uint32_t maxStdSPSCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxStdSPSCount = maxStdSPSCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265SessionParametersCreateInfoKHR & setMaxStdPPSCount( uint32_t maxStdPPSCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxStdPPSCount = maxStdPPSCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265SessionParametersCreateInfoKHR &\n      setPParametersAddInfo( const VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersAddInfoKHR * pParametersAddInfo_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pParametersAddInfo = pParametersAddInfo_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH265SessionParametersCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH265SessionParametersCreateInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH265SessionParametersCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH265SessionParametersCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersAddInfoKHR * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxStdVPSCount, maxStdSPSCount, maxStdPPSCount, pParametersAddInfo );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH265SessionParametersCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH265SessionParametersCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxStdVPSCount == rhs.maxStdVPSCount ) && ( maxStdSPSCount == rhs.maxStdSPSCount ) &&\n             ( maxStdPPSCount == rhs.maxStdPPSCount ) && ( pParametersAddInfo == rhs.pParametersAddInfo );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH265SessionParametersCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                                      sType              = StructureType::eVideoEncodeH265SessionParametersCreateInfoKHR;\n    const void *                                                             pNext              = {};\n    uint32_t                                                                 maxStdVPSCount     = {};\n    uint32_t                                                                 maxStdSPSCount     = {};\n    uint32_t                                                                 maxStdPPSCount     = {};\n    const VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersAddInfoKHR * pParametersAddInfo = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH265SessionParametersCreateInfoKHR>\n  {\n    using Type = VideoEncodeH265SessionParametersCreateInfoKHR;\n  };\n\n  struct VideoEncodeH265SessionParametersFeedbackInfoKHR\n  {\n    using NativeType = VkVideoEncodeH265SessionParametersFeedbackInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH265SessionParametersFeedbackInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265SessionParametersFeedbackInfoKHR( VULKAN_HPP_NAMESPACE::Bool32 hasStdVPSOverrides_ = {},\n                                                                          VULKAN_HPP_NAMESPACE::Bool32 hasStdSPSOverrides_ = {},\n                                                                          VULKAN_HPP_NAMESPACE::Bool32 hasStdPPSOverrides_ = {},\n                                                                          void *                       pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , hasStdVPSOverrides{ hasStdVPSOverrides_ }\n      , hasStdSPSOverrides{ hasStdSPSOverrides_ }\n      , hasStdPPSOverrides{ hasStdPPSOverrides_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      VideoEncodeH265SessionParametersFeedbackInfoKHR( VideoEncodeH265SessionParametersFeedbackInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH265SessionParametersFeedbackInfoKHR( VkVideoEncodeH265SessionParametersFeedbackInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH265SessionParametersFeedbackInfoKHR( *reinterpret_cast<VideoEncodeH265SessionParametersFeedbackInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH265SessionParametersFeedbackInfoKHR & operator=( VideoEncodeH265SessionParametersFeedbackInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH265SessionParametersFeedbackInfoKHR & operator=( VkVideoEncodeH265SessionParametersFeedbackInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersFeedbackInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoEncodeH265SessionParametersFeedbackInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH265SessionParametersFeedbackInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH265SessionParametersFeedbackInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH265SessionParametersFeedbackInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, hasStdVPSOverrides, hasStdSPSOverrides, hasStdPPSOverrides );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH265SessionParametersFeedbackInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH265SessionParametersFeedbackInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( hasStdVPSOverrides == rhs.hasStdVPSOverrides ) &&\n             ( hasStdSPSOverrides == rhs.hasStdSPSOverrides ) && ( hasStdPPSOverrides == rhs.hasStdPPSOverrides );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH265SessionParametersFeedbackInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType              = StructureType::eVideoEncodeH265SessionParametersFeedbackInfoKHR;\n    void *                              pNext              = {};\n    VULKAN_HPP_NAMESPACE::Bool32        hasStdVPSOverrides = {};\n    VULKAN_HPP_NAMESPACE::Bool32        hasStdSPSOverrides = {};\n    VULKAN_HPP_NAMESPACE::Bool32        hasStdPPSOverrides = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH265SessionParametersFeedbackInfoKHR>\n  {\n    using Type = VideoEncodeH265SessionParametersFeedbackInfoKHR;\n  };\n\n  struct VideoEncodeH265SessionParametersGetInfoKHR\n  {\n    using NativeType = VkVideoEncodeH265SessionParametersGetInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeH265SessionParametersGetInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265SessionParametersGetInfoKHR( VULKAN_HPP_NAMESPACE::Bool32 writeStdVPS_ = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 writeStdSPS_ = {},\n                                                                     VULKAN_HPP_NAMESPACE::Bool32 writeStdPPS_ = {},\n                                                                     uint32_t                     stdVPSId_    = {},\n                                                                     uint32_t                     stdSPSId_    = {},\n                                                                     uint32_t                     stdPPSId_    = {},\n                                                                     const void *                 pNext_       = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , writeStdVPS{ writeStdVPS_ }\n      , writeStdSPS{ writeStdSPS_ }\n      , writeStdPPS{ writeStdPPS_ }\n      , stdVPSId{ stdVPSId_ }\n      , stdSPSId{ stdSPSId_ }\n      , stdPPSId{ stdPPSId_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeH265SessionParametersGetInfoKHR( VideoEncodeH265SessionParametersGetInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeH265SessionParametersGetInfoKHR( VkVideoEncodeH265SessionParametersGetInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeH265SessionParametersGetInfoKHR( *reinterpret_cast<VideoEncodeH265SessionParametersGetInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeH265SessionParametersGetInfoKHR & operator=( VideoEncodeH265SessionParametersGetInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeH265SessionParametersGetInfoKHR & operator=( VkVideoEncodeH265SessionParametersGetInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersGetInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265SessionParametersGetInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265SessionParametersGetInfoKHR & setWriteStdVPS( VULKAN_HPP_NAMESPACE::Bool32 writeStdVPS_ ) VULKAN_HPP_NOEXCEPT\n    {\n      writeStdVPS = writeStdVPS_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265SessionParametersGetInfoKHR & setWriteStdSPS( VULKAN_HPP_NAMESPACE::Bool32 writeStdSPS_ ) VULKAN_HPP_NOEXCEPT\n    {\n      writeStdSPS = writeStdSPS_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265SessionParametersGetInfoKHR & setWriteStdPPS( VULKAN_HPP_NAMESPACE::Bool32 writeStdPPS_ ) VULKAN_HPP_NOEXCEPT\n    {\n      writeStdPPS = writeStdPPS_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265SessionParametersGetInfoKHR & setStdVPSId( uint32_t stdVPSId_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdVPSId = stdVPSId_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265SessionParametersGetInfoKHR & setStdSPSId( uint32_t stdSPSId_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdSPSId = stdSPSId_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeH265SessionParametersGetInfoKHR & setStdPPSId( uint32_t stdPPSId_ ) VULKAN_HPP_NOEXCEPT\n    {\n      stdPPSId = stdPPSId_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeH265SessionParametersGetInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeH265SessionParametersGetInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeH265SessionParametersGetInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeH265SessionParametersGetInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               VULKAN_HPP_NAMESPACE::Bool32 const &,\n               uint32_t const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, writeStdVPS, writeStdSPS, writeStdPPS, stdVPSId, stdSPSId, stdPPSId );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeH265SessionParametersGetInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeH265SessionParametersGetInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( writeStdVPS == rhs.writeStdVPS ) && ( writeStdSPS == rhs.writeStdSPS ) &&\n             ( writeStdPPS == rhs.writeStdPPS ) && ( stdVPSId == rhs.stdVPSId ) && ( stdSPSId == rhs.stdSPSId ) && ( stdPPSId == rhs.stdPPSId );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeH265SessionParametersGetInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType       = StructureType::eVideoEncodeH265SessionParametersGetInfoKHR;\n    const void *                        pNext       = {};\n    VULKAN_HPP_NAMESPACE::Bool32        writeStdVPS = {};\n    VULKAN_HPP_NAMESPACE::Bool32        writeStdSPS = {};\n    VULKAN_HPP_NAMESPACE::Bool32        writeStdPPS = {};\n    uint32_t                            stdVPSId    = {};\n    uint32_t                            stdSPSId    = {};\n    uint32_t                            stdPPSId    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeH265SessionParametersGetInfoKHR>\n  {\n    using Type = VideoEncodeH265SessionParametersGetInfoKHR;\n  };\n\n  struct VideoEncodeInfoKHR\n  {\n    using NativeType = VkVideoEncodeInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeInfoKHR( VULKAN_HPP_NAMESPACE::VideoEncodeFlagsKHR               flags_                           = {},\n                                             VULKAN_HPP_NAMESPACE::Buffer                            dstBuffer_                       = {},\n                                             VULKAN_HPP_NAMESPACE::DeviceSize                        dstBufferOffset_                 = {},\n                                             VULKAN_HPP_NAMESPACE::DeviceSize                        dstBufferRange_                  = {},\n                                             VULKAN_HPP_NAMESPACE::VideoPictureResourceInfoKHR       srcPictureResource_              = {},\n                                             const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR * pSetupReferenceSlot_             = {},\n                                             uint32_t                                                referenceSlotCount_              = {},\n                                             const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR * pReferenceSlots_                 = {},\n                                             uint32_t                                                precedingExternallyEncodedBytes_ = {},\n                                             const void *                                            pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , dstBuffer{ dstBuffer_ }\n      , dstBufferOffset{ dstBufferOffset_ }\n      , dstBufferRange{ dstBufferRange_ }\n      , srcPictureResource{ srcPictureResource_ }\n      , pSetupReferenceSlot{ pSetupReferenceSlot_ }\n      , referenceSlotCount{ referenceSlotCount_ }\n      , pReferenceSlots{ pReferenceSlots_ }\n      , precedingExternallyEncodedBytes{ precedingExternallyEncodedBytes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeInfoKHR( VideoEncodeInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeInfoKHR( VkVideoEncodeInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT : VideoEncodeInfoKHR( *reinterpret_cast<VideoEncodeInfoKHR const *>( &rhs ) ) {}\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoEncodeInfoKHR( VULKAN_HPP_NAMESPACE::VideoEncodeFlagsKHR                                                                    flags_,\n                        VULKAN_HPP_NAMESPACE::Buffer                                                                                 dstBuffer_,\n                        VULKAN_HPP_NAMESPACE::DeviceSize                                                                             dstBufferOffset_,\n                        VULKAN_HPP_NAMESPACE::DeviceSize                                                                             dstBufferRange_,\n                        VULKAN_HPP_NAMESPACE::VideoPictureResourceInfoKHR                                                            srcPictureResource_,\n                        const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR *                                                      pSetupReferenceSlot_,\n                        VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR> const & referenceSlots_,\n                        uint32_t     precedingExternallyEncodedBytes_ = {},\n                        const void * pNext_                           = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , dstBuffer( dstBuffer_ )\n      , dstBufferOffset( dstBufferOffset_ )\n      , dstBufferRange( dstBufferRange_ )\n      , srcPictureResource( srcPictureResource_ )\n      , pSetupReferenceSlot( pSetupReferenceSlot_ )\n      , referenceSlotCount( static_cast<uint32_t>( referenceSlots_.size() ) )\n      , pReferenceSlots( referenceSlots_.data() )\n      , precedingExternallyEncodedBytes( precedingExternallyEncodedBytes_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VideoEncodeInfoKHR & operator=( VideoEncodeInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeInfoKHR & operator=( VkVideoEncodeInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::VideoEncodeFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeInfoKHR & setDstBuffer( VULKAN_HPP_NAMESPACE::Buffer dstBuffer_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstBuffer = dstBuffer_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeInfoKHR & setDstBufferOffset( VULKAN_HPP_NAMESPACE::DeviceSize dstBufferOffset_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstBufferOffset = dstBufferOffset_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeInfoKHR & setDstBufferRange( VULKAN_HPP_NAMESPACE::DeviceSize dstBufferRange_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dstBufferRange = dstBufferRange_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeInfoKHR &\n      setSrcPictureResource( VULKAN_HPP_NAMESPACE::VideoPictureResourceInfoKHR const & srcPictureResource_ ) VULKAN_HPP_NOEXCEPT\n    {\n      srcPictureResource = srcPictureResource_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeInfoKHR &\n      setPSetupReferenceSlot( const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR * pSetupReferenceSlot_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pSetupReferenceSlot = pSetupReferenceSlot_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeInfoKHR & setReferenceSlotCount( uint32_t referenceSlotCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      referenceSlotCount = referenceSlotCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeInfoKHR &\n      setPReferenceSlots( const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR * pReferenceSlots_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pReferenceSlots = pReferenceSlots_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoEncodeInfoKHR & setReferenceSlots(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR> const & referenceSlots_ ) VULKAN_HPP_NOEXCEPT\n    {\n      referenceSlotCount = static_cast<uint32_t>( referenceSlots_.size() );\n      pReferenceSlots    = referenceSlots_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeInfoKHR & setPrecedingExternallyEncodedBytes( uint32_t precedingExternallyEncodedBytes_ ) VULKAN_HPP_NOEXCEPT\n    {\n      precedingExternallyEncodedBytes = precedingExternallyEncodedBytes_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::Buffer const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::DeviceSize const &,\n               VULKAN_HPP_NAMESPACE::VideoPictureResourceInfoKHR const &,\n               const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR * const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       flags,\n                       dstBuffer,\n                       dstBufferOffset,\n                       dstBufferRange,\n                       srcPictureResource,\n                       pSetupReferenceSlot,\n                       referenceSlotCount,\n                       pReferenceSlots,\n                       precedingExternallyEncodedBytes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( dstBuffer == rhs.dstBuffer ) &&\n             ( dstBufferOffset == rhs.dstBufferOffset ) && ( dstBufferRange == rhs.dstBufferRange ) && ( srcPictureResource == rhs.srcPictureResource ) &&\n             ( pSetupReferenceSlot == rhs.pSetupReferenceSlot ) && ( referenceSlotCount == rhs.referenceSlotCount ) &&\n             ( pReferenceSlots == rhs.pReferenceSlots ) && ( precedingExternallyEncodedBytes == rhs.precedingExternallyEncodedBytes );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                     sType                           = StructureType::eVideoEncodeInfoKHR;\n    const void *                                            pNext                           = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeFlagsKHR               flags                           = {};\n    VULKAN_HPP_NAMESPACE::Buffer                            dstBuffer                       = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                        dstBufferOffset                 = {};\n    VULKAN_HPP_NAMESPACE::DeviceSize                        dstBufferRange                  = {};\n    VULKAN_HPP_NAMESPACE::VideoPictureResourceInfoKHR       srcPictureResource              = {};\n    const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR * pSetupReferenceSlot             = {};\n    uint32_t                                                referenceSlotCount              = {};\n    const VULKAN_HPP_NAMESPACE::VideoReferenceSlotInfoKHR * pReferenceSlots                 = {};\n    uint32_t                                                precedingExternallyEncodedBytes = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeInfoKHR>\n  {\n    using Type = VideoEncodeInfoKHR;\n  };\n\n  struct VideoEncodeQualityLevelInfoKHR\n  {\n    using NativeType = VkVideoEncodeQualityLevelInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeQualityLevelInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeQualityLevelInfoKHR( uint32_t qualityLevel_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , qualityLevel{ qualityLevel_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeQualityLevelInfoKHR( VideoEncodeQualityLevelInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeQualityLevelInfoKHR( VkVideoEncodeQualityLevelInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeQualityLevelInfoKHR( *reinterpret_cast<VideoEncodeQualityLevelInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeQualityLevelInfoKHR & operator=( VideoEncodeQualityLevelInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeQualityLevelInfoKHR & operator=( VkVideoEncodeQualityLevelInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeQualityLevelInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeQualityLevelInfoKHR & setQualityLevel( uint32_t qualityLevel_ ) VULKAN_HPP_NOEXCEPT\n    {\n      qualityLevel = qualityLevel_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeQualityLevelInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeQualityLevelInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeQualityLevelInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeQualityLevelInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, qualityLevel );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeQualityLevelInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeQualityLevelInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( qualityLevel == rhs.qualityLevel );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeQualityLevelInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType        = StructureType::eVideoEncodeQualityLevelInfoKHR;\n    const void *                        pNext        = {};\n    uint32_t                            qualityLevel = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeQualityLevelInfoKHR>\n  {\n    using Type = VideoEncodeQualityLevelInfoKHR;\n  };\n\n  struct VideoEncodeQualityLevelPropertiesKHR\n  {\n    using NativeType = VkVideoEncodeQualityLevelPropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeQualityLevelPropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeQualityLevelPropertiesKHR( VULKAN_HPP_NAMESPACE::VideoEncodeRateControlModeFlagBitsKHR preferredRateControlMode_ =\n                                                                 VULKAN_HPP_NAMESPACE::VideoEncodeRateControlModeFlagBitsKHR::eDefault,\n                                                               uint32_t preferredRateControlLayerCount_ = {},\n                                                               void *   pNext_                          = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , preferredRateControlMode{ preferredRateControlMode_ }\n      , preferredRateControlLayerCount{ preferredRateControlLayerCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeQualityLevelPropertiesKHR( VideoEncodeQualityLevelPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeQualityLevelPropertiesKHR( VkVideoEncodeQualityLevelPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeQualityLevelPropertiesKHR( *reinterpret_cast<VideoEncodeQualityLevelPropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeQualityLevelPropertiesKHR & operator=( VideoEncodeQualityLevelPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeQualityLevelPropertiesKHR & operator=( VkVideoEncodeQualityLevelPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeQualityLevelPropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoEncodeQualityLevelPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeQualityLevelPropertiesKHR *>( this );\n    }\n\n    operator VkVideoEncodeQualityLevelPropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeQualityLevelPropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::\n      tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::VideoEncodeRateControlModeFlagBitsKHR const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, preferredRateControlMode, preferredRateControlLayerCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeQualityLevelPropertiesKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeQualityLevelPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( preferredRateControlMode == rhs.preferredRateControlMode ) &&\n             ( preferredRateControlLayerCount == rhs.preferredRateControlLayerCount );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeQualityLevelPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                         sType = StructureType::eVideoEncodeQualityLevelPropertiesKHR;\n    void *                                                      pNext = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeRateControlModeFlagBitsKHR preferredRateControlMode =\n      VULKAN_HPP_NAMESPACE::VideoEncodeRateControlModeFlagBitsKHR::eDefault;\n    uint32_t preferredRateControlLayerCount = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeQualityLevelPropertiesKHR>\n  {\n    using Type = VideoEncodeQualityLevelPropertiesKHR;\n  };\n\n  struct VideoEncodeQuantizationMapCapabilitiesKHR\n  {\n    using NativeType = VkVideoEncodeQuantizationMapCapabilitiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeQuantizationMapCapabilitiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeQuantizationMapCapabilitiesKHR( VULKAN_HPP_NAMESPACE::Extent2D maxQuantizationMapExtent_ = {},\n                                                                    void *                         pNext_                    = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , maxQuantizationMapExtent{ maxQuantizationMapExtent_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeQuantizationMapCapabilitiesKHR( VideoEncodeQuantizationMapCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeQuantizationMapCapabilitiesKHR( VkVideoEncodeQuantizationMapCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeQuantizationMapCapabilitiesKHR( *reinterpret_cast<VideoEncodeQuantizationMapCapabilitiesKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeQuantizationMapCapabilitiesKHR & operator=( VideoEncodeQuantizationMapCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeQuantizationMapCapabilitiesKHR & operator=( VkVideoEncodeQuantizationMapCapabilitiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeQuantizationMapCapabilitiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoEncodeQuantizationMapCapabilitiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeQuantizationMapCapabilitiesKHR *>( this );\n    }\n\n    operator VkVideoEncodeQuantizationMapCapabilitiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeQuantizationMapCapabilitiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Extent2D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, maxQuantizationMapExtent );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeQuantizationMapCapabilitiesKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeQuantizationMapCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( maxQuantizationMapExtent == rhs.maxQuantizationMapExtent );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeQuantizationMapCapabilitiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                    = StructureType::eVideoEncodeQuantizationMapCapabilitiesKHR;\n    void *                              pNext                    = {};\n    VULKAN_HPP_NAMESPACE::Extent2D      maxQuantizationMapExtent = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeQuantizationMapCapabilitiesKHR>\n  {\n    using Type = VideoEncodeQuantizationMapCapabilitiesKHR;\n  };\n\n  struct VideoEncodeQuantizationMapInfoKHR\n  {\n    using NativeType = VkVideoEncodeQuantizationMapInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeQuantizationMapInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeQuantizationMapInfoKHR( VULKAN_HPP_NAMESPACE::ImageView quantizationMap_       = {},\n                                                            VULKAN_HPP_NAMESPACE::Extent2D  quantizationMapExtent_ = {},\n                                                            const void *                    pNext_                 = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , quantizationMap{ quantizationMap_ }\n      , quantizationMapExtent{ quantizationMapExtent_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeQuantizationMapInfoKHR( VideoEncodeQuantizationMapInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeQuantizationMapInfoKHR( VkVideoEncodeQuantizationMapInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeQuantizationMapInfoKHR( *reinterpret_cast<VideoEncodeQuantizationMapInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeQuantizationMapInfoKHR & operator=( VideoEncodeQuantizationMapInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeQuantizationMapInfoKHR & operator=( VkVideoEncodeQuantizationMapInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeQuantizationMapInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeQuantizationMapInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeQuantizationMapInfoKHR & setQuantizationMap( VULKAN_HPP_NAMESPACE::ImageView quantizationMap_ ) VULKAN_HPP_NOEXCEPT\n    {\n      quantizationMap = quantizationMap_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeQuantizationMapInfoKHR &\n      setQuantizationMapExtent( VULKAN_HPP_NAMESPACE::Extent2D const & quantizationMapExtent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      quantizationMapExtent = quantizationMapExtent_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeQuantizationMapInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeQuantizationMapInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeQuantizationMapInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeQuantizationMapInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::\n      tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::ImageView const &, VULKAN_HPP_NAMESPACE::Extent2D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, quantizationMap, quantizationMapExtent );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeQuantizationMapInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeQuantizationMapInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( quantizationMap == rhs.quantizationMap ) &&\n             ( quantizationMapExtent == rhs.quantizationMapExtent );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeQuantizationMapInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                 = StructureType::eVideoEncodeQuantizationMapInfoKHR;\n    const void *                        pNext                 = {};\n    VULKAN_HPP_NAMESPACE::ImageView     quantizationMap       = {};\n    VULKAN_HPP_NAMESPACE::Extent2D      quantizationMapExtent = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeQuantizationMapInfoKHR>\n  {\n    using Type = VideoEncodeQuantizationMapInfoKHR;\n  };\n\n  struct VideoEncodeQuantizationMapSessionParametersCreateInfoKHR\n  {\n    using NativeType = VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeQuantizationMapSessionParametersCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeQuantizationMapSessionParametersCreateInfoKHR( VULKAN_HPP_NAMESPACE::Extent2D quantizationMapTexelSize_ = {},\n                                                                                   const void *                   pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , quantizationMapTexelSize{ quantizationMapTexelSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeQuantizationMapSessionParametersCreateInfoKHR( VideoEncodeQuantizationMapSessionParametersCreateInfoKHR const & rhs )\n      VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeQuantizationMapSessionParametersCreateInfoKHR( VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeQuantizationMapSessionParametersCreateInfoKHR( *reinterpret_cast<VideoEncodeQuantizationMapSessionParametersCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeQuantizationMapSessionParametersCreateInfoKHR &\n      operator=( VideoEncodeQuantizationMapSessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeQuantizationMapSessionParametersCreateInfoKHR &\n      operator=( VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeQuantizationMapSessionParametersCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeQuantizationMapSessionParametersCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeQuantizationMapSessionParametersCreateInfoKHR &\n      setQuantizationMapTexelSize( VULKAN_HPP_NAMESPACE::Extent2D const & quantizationMapTexelSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      quantizationMapTexelSize = quantizationMapTexelSize_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::Extent2D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, quantizationMapTexelSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeQuantizationMapSessionParametersCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeQuantizationMapSessionParametersCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( quantizationMapTexelSize == rhs.quantizationMapTexelSize );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeQuantizationMapSessionParametersCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                    = StructureType::eVideoEncodeQuantizationMapSessionParametersCreateInfoKHR;\n    const void *                        pNext                    = {};\n    VULKAN_HPP_NAMESPACE::Extent2D      quantizationMapTexelSize = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeQuantizationMapSessionParametersCreateInfoKHR>\n  {\n    using Type = VideoEncodeQuantizationMapSessionParametersCreateInfoKHR;\n  };\n\n  struct VideoEncodeRateControlLayerInfoKHR\n  {\n    using NativeType = VkVideoEncodeRateControlLayerInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeRateControlLayerInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeRateControlLayerInfoKHR( uint64_t     averageBitrate_       = {},\n                                                             uint64_t     maxBitrate_           = {},\n                                                             uint32_t     frameRateNumerator_   = {},\n                                                             uint32_t     frameRateDenominator_ = {},\n                                                             const void * pNext_                = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , averageBitrate{ averageBitrate_ }\n      , maxBitrate{ maxBitrate_ }\n      , frameRateNumerator{ frameRateNumerator_ }\n      , frameRateDenominator{ frameRateDenominator_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeRateControlLayerInfoKHR( VideoEncodeRateControlLayerInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeRateControlLayerInfoKHR( VkVideoEncodeRateControlLayerInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeRateControlLayerInfoKHR( *reinterpret_cast<VideoEncodeRateControlLayerInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeRateControlLayerInfoKHR & operator=( VideoEncodeRateControlLayerInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeRateControlLayerInfoKHR & operator=( VkVideoEncodeRateControlLayerInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeRateControlLayerInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeRateControlLayerInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeRateControlLayerInfoKHR & setAverageBitrate( uint64_t averageBitrate_ ) VULKAN_HPP_NOEXCEPT\n    {\n      averageBitrate = averageBitrate_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeRateControlLayerInfoKHR & setMaxBitrate( uint64_t maxBitrate_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxBitrate = maxBitrate_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeRateControlLayerInfoKHR & setFrameRateNumerator( uint32_t frameRateNumerator_ ) VULKAN_HPP_NOEXCEPT\n    {\n      frameRateNumerator = frameRateNumerator_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeRateControlLayerInfoKHR & setFrameRateDenominator( uint32_t frameRateDenominator_ ) VULKAN_HPP_NOEXCEPT\n    {\n      frameRateDenominator = frameRateDenominator_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeRateControlLayerInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeRateControlLayerInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeRateControlLayerInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeRateControlLayerInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint64_t const &, uint64_t const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, averageBitrate, maxBitrate, frameRateNumerator, frameRateDenominator );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeRateControlLayerInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeRateControlLayerInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( averageBitrate == rhs.averageBitrate ) && ( maxBitrate == rhs.maxBitrate ) &&\n             ( frameRateNumerator == rhs.frameRateNumerator ) && ( frameRateDenominator == rhs.frameRateDenominator );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeRateControlLayerInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                = StructureType::eVideoEncodeRateControlLayerInfoKHR;\n    const void *                        pNext                = {};\n    uint64_t                            averageBitrate       = {};\n    uint64_t                            maxBitrate           = {};\n    uint32_t                            frameRateNumerator   = {};\n    uint32_t                            frameRateDenominator = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeRateControlLayerInfoKHR>\n  {\n    using Type = VideoEncodeRateControlLayerInfoKHR;\n  };\n\n  struct VideoEncodeRateControlInfoKHR\n  {\n    using NativeType = VkVideoEncodeRateControlInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeRateControlInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeRateControlInfoKHR(\n      VULKAN_HPP_NAMESPACE::VideoEncodeRateControlFlagsKHR             flags_           = {},\n      VULKAN_HPP_NAMESPACE::VideoEncodeRateControlModeFlagBitsKHR      rateControlMode_ = VULKAN_HPP_NAMESPACE::VideoEncodeRateControlModeFlagBitsKHR::eDefault,\n      uint32_t                                                         layerCount_      = {},\n      const VULKAN_HPP_NAMESPACE::VideoEncodeRateControlLayerInfoKHR * pLayers_         = {},\n      uint32_t                                                         virtualBufferSizeInMs_        = {},\n      uint32_t                                                         initialVirtualBufferSizeInMs_ = {},\n      const void *                                                     pNext_                        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , rateControlMode{ rateControlMode_ }\n      , layerCount{ layerCount_ }\n      , pLayers{ pLayers_ }\n      , virtualBufferSizeInMs{ virtualBufferSizeInMs_ }\n      , initialVirtualBufferSizeInMs{ initialVirtualBufferSizeInMs_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeRateControlInfoKHR( VideoEncodeRateControlInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeRateControlInfoKHR( VkVideoEncodeRateControlInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeRateControlInfoKHR( *reinterpret_cast<VideoEncodeRateControlInfoKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoEncodeRateControlInfoKHR(\n      VULKAN_HPP_NAMESPACE::VideoEncodeRateControlFlagsKHR                                                                  flags_,\n      VULKAN_HPP_NAMESPACE::VideoEncodeRateControlModeFlagBitsKHR                                                           rateControlMode_,\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VideoEncodeRateControlLayerInfoKHR> const & layers_,\n      uint32_t                                                                                                              virtualBufferSizeInMs_        = {},\n      uint32_t                                                                                                              initialVirtualBufferSizeInMs_ = {},\n      const void *                                                                                                          pNext_ = nullptr )\n      : pNext( pNext_ )\n      , flags( flags_ )\n      , rateControlMode( rateControlMode_ )\n      , layerCount( static_cast<uint32_t>( layers_.size() ) )\n      , pLayers( layers_.data() )\n      , virtualBufferSizeInMs( virtualBufferSizeInMs_ )\n      , initialVirtualBufferSizeInMs( initialVirtualBufferSizeInMs_ )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VideoEncodeRateControlInfoKHR & operator=( VideoEncodeRateControlInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeRateControlInfoKHR & operator=( VkVideoEncodeRateControlInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeRateControlInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeRateControlInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeRateControlInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::VideoEncodeRateControlFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeRateControlInfoKHR &\n      setRateControlMode( VULKAN_HPP_NAMESPACE::VideoEncodeRateControlModeFlagBitsKHR rateControlMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      rateControlMode = rateControlMode_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeRateControlInfoKHR & setLayerCount( uint32_t layerCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layerCount = layerCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeRateControlInfoKHR &\n      setPLayers( const VULKAN_HPP_NAMESPACE::VideoEncodeRateControlLayerInfoKHR * pLayers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pLayers = pLayers_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoEncodeRateControlInfoKHR & setLayers(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VideoEncodeRateControlLayerInfoKHR> const & layers_ ) VULKAN_HPP_NOEXCEPT\n    {\n      layerCount = static_cast<uint32_t>( layers_.size() );\n      pLayers    = layers_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeRateControlInfoKHR & setVirtualBufferSizeInMs( uint32_t virtualBufferSizeInMs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      virtualBufferSizeInMs = virtualBufferSizeInMs_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeRateControlInfoKHR & setInitialVirtualBufferSizeInMs( uint32_t initialVirtualBufferSizeInMs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      initialVirtualBufferSizeInMs = initialVirtualBufferSizeInMs_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeRateControlInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeRateControlInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeRateControlInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeRateControlInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeRateControlFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeRateControlModeFlagBitsKHR const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::VideoEncodeRateControlLayerInfoKHR * const &,\n               uint32_t const &,\n               uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, rateControlMode, layerCount, pLayers, virtualBufferSizeInMs, initialVirtualBufferSizeInMs );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeRateControlInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeRateControlInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( rateControlMode == rhs.rateControlMode ) &&\n             ( layerCount == rhs.layerCount ) && ( pLayers == rhs.pLayers ) && ( virtualBufferSizeInMs == rhs.virtualBufferSizeInMs ) &&\n             ( initialVirtualBufferSizeInMs == rhs.initialVirtualBufferSizeInMs );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeRateControlInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                              sType           = StructureType::eVideoEncodeRateControlInfoKHR;\n    const void *                                                     pNext           = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeRateControlFlagsKHR             flags           = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeRateControlModeFlagBitsKHR      rateControlMode = VULKAN_HPP_NAMESPACE::VideoEncodeRateControlModeFlagBitsKHR::eDefault;\n    uint32_t                                                         layerCount      = {};\n    const VULKAN_HPP_NAMESPACE::VideoEncodeRateControlLayerInfoKHR * pLayers         = {};\n    uint32_t                                                         virtualBufferSizeInMs        = {};\n    uint32_t                                                         initialVirtualBufferSizeInMs = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeRateControlInfoKHR>\n  {\n    using Type = VideoEncodeRateControlInfoKHR;\n  };\n\n  struct VideoEncodeSessionParametersFeedbackInfoKHR\n  {\n    using NativeType = VkVideoEncodeSessionParametersFeedbackInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeSessionParametersFeedbackInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeSessionParametersFeedbackInfoKHR( VULKAN_HPP_NAMESPACE::Bool32 hasOverrides_ = {},\n                                                                      void *                       pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , hasOverrides{ hasOverrides_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeSessionParametersFeedbackInfoKHR( VideoEncodeSessionParametersFeedbackInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeSessionParametersFeedbackInfoKHR( VkVideoEncodeSessionParametersFeedbackInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeSessionParametersFeedbackInfoKHR( *reinterpret_cast<VideoEncodeSessionParametersFeedbackInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeSessionParametersFeedbackInfoKHR & operator=( VideoEncodeSessionParametersFeedbackInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeSessionParametersFeedbackInfoKHR & operator=( VkVideoEncodeSessionParametersFeedbackInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersFeedbackInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoEncodeSessionParametersFeedbackInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeSessionParametersFeedbackInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeSessionParametersFeedbackInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeSessionParametersFeedbackInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Bool32 const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, hasOverrides );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeSessionParametersFeedbackInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeSessionParametersFeedbackInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( hasOverrides == rhs.hasOverrides );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeSessionParametersFeedbackInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType        = StructureType::eVideoEncodeSessionParametersFeedbackInfoKHR;\n    void *                              pNext        = {};\n    VULKAN_HPP_NAMESPACE::Bool32        hasOverrides = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeSessionParametersFeedbackInfoKHR>\n  {\n    using Type = VideoEncodeSessionParametersFeedbackInfoKHR;\n  };\n\n  struct VideoEncodeSessionParametersGetInfoKHR\n  {\n    using NativeType = VkVideoEncodeSessionParametersGetInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeSessionParametersGetInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEncodeSessionParametersGetInfoKHR( VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR videoSessionParameters_ = {},\n                                                                 const void *                                    pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , videoSessionParameters{ videoSessionParameters_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeSessionParametersGetInfoKHR( VideoEncodeSessionParametersGetInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeSessionParametersGetInfoKHR( VkVideoEncodeSessionParametersGetInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeSessionParametersGetInfoKHR( *reinterpret_cast<VideoEncodeSessionParametersGetInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeSessionParametersGetInfoKHR & operator=( VideoEncodeSessionParametersGetInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeSessionParametersGetInfoKHR & operator=( VkVideoEncodeSessionParametersGetInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeSessionParametersGetInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeSessionParametersGetInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeSessionParametersGetInfoKHR &\n      setVideoSessionParameters( VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR videoSessionParameters_ ) VULKAN_HPP_NOEXCEPT\n    {\n      videoSessionParameters = videoSessionParameters_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeSessionParametersGetInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeSessionParametersGetInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeSessionParametersGetInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeSessionParametersGetInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, videoSessionParameters );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeSessionParametersGetInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeSessionParametersGetInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( videoSessionParameters == rhs.videoSessionParameters );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeSessionParametersGetInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType             sType                  = StructureType::eVideoEncodeSessionParametersGetInfoKHR;\n    const void *                                    pNext                  = {};\n    VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR videoSessionParameters = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeSessionParametersGetInfoKHR>\n  {\n    using Type = VideoEncodeSessionParametersGetInfoKHR;\n  };\n\n  struct VideoEncodeUsageInfoKHR\n  {\n    using NativeType = VkVideoEncodeUsageInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEncodeUsageInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      VideoEncodeUsageInfoKHR( VULKAN_HPP_NAMESPACE::VideoEncodeUsageFlagsKHR   videoUsageHints_   = {},\n                               VULKAN_HPP_NAMESPACE::VideoEncodeContentFlagsKHR videoContentHints_ = {},\n                               VULKAN_HPP_NAMESPACE::VideoEncodeTuningModeKHR   tuningMode_        = VULKAN_HPP_NAMESPACE::VideoEncodeTuningModeKHR::eDefault,\n                               const void *                                     pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , videoUsageHints{ videoUsageHints_ }\n      , videoContentHints{ videoContentHints_ }\n      , tuningMode{ tuningMode_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEncodeUsageInfoKHR( VideoEncodeUsageInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEncodeUsageInfoKHR( VkVideoEncodeUsageInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEncodeUsageInfoKHR( *reinterpret_cast<VideoEncodeUsageInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEncodeUsageInfoKHR & operator=( VideoEncodeUsageInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEncodeUsageInfoKHR & operator=( VkVideoEncodeUsageInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEncodeUsageInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeUsageInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeUsageInfoKHR & setVideoUsageHints( VULKAN_HPP_NAMESPACE::VideoEncodeUsageFlagsKHR videoUsageHints_ ) VULKAN_HPP_NOEXCEPT\n    {\n      videoUsageHints = videoUsageHints_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeUsageInfoKHR &\n      setVideoContentHints( VULKAN_HPP_NAMESPACE::VideoEncodeContentFlagsKHR videoContentHints_ ) VULKAN_HPP_NOEXCEPT\n    {\n      videoContentHints = videoContentHints_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEncodeUsageInfoKHR & setTuningMode( VULKAN_HPP_NAMESPACE::VideoEncodeTuningModeKHR tuningMode_ ) VULKAN_HPP_NOEXCEPT\n    {\n      tuningMode = tuningMode_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEncodeUsageInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEncodeUsageInfoKHR *>( this );\n    }\n\n    operator VkVideoEncodeUsageInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEncodeUsageInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeUsageFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeContentFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::VideoEncodeTuningModeKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, videoUsageHints, videoContentHints, tuningMode );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEncodeUsageInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEncodeUsageInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( videoUsageHints == rhs.videoUsageHints ) && ( videoContentHints == rhs.videoContentHints ) &&\n             ( tuningMode == rhs.tuningMode );\n#  endif\n    }\n\n    bool operator!=( VideoEncodeUsageInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType              sType             = StructureType::eVideoEncodeUsageInfoKHR;\n    const void *                                     pNext             = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeUsageFlagsKHR   videoUsageHints   = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeContentFlagsKHR videoContentHints = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeTuningModeKHR   tuningMode        = VULKAN_HPP_NAMESPACE::VideoEncodeTuningModeKHR::eDefault;\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEncodeUsageInfoKHR>\n  {\n    using Type = VideoEncodeUsageInfoKHR;\n  };\n\n  struct VideoEndCodingInfoKHR\n  {\n    using NativeType = VkVideoEndCodingInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoEndCodingInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoEndCodingInfoKHR( VULKAN_HPP_NAMESPACE::VideoEndCodingFlagsKHR flags_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoEndCodingInfoKHR( VideoEndCodingInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoEndCodingInfoKHR( VkVideoEndCodingInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoEndCodingInfoKHR( *reinterpret_cast<VideoEndCodingInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoEndCodingInfoKHR & operator=( VideoEndCodingInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoEndCodingInfoKHR & operator=( VkVideoEndCodingInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoEndCodingInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoEndCodingInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoEndCodingInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::VideoEndCodingFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoEndCodingInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoEndCodingInfoKHR *>( this );\n    }\n\n    operator VkVideoEndCodingInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoEndCodingInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::VideoEndCodingFlagsKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoEndCodingInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoEndCodingInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags );\n#  endif\n    }\n\n    bool operator!=( VideoEndCodingInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType          sType = StructureType::eVideoEndCodingInfoKHR;\n    const void *                                 pNext = {};\n    VULKAN_HPP_NAMESPACE::VideoEndCodingFlagsKHR flags = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoEndCodingInfoKHR>\n  {\n    using Type = VideoEndCodingInfoKHR;\n  };\n\n  struct VideoFormatAV1QuantizationMapPropertiesKHR\n  {\n    using NativeType = VkVideoFormatAV1QuantizationMapPropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoFormatAv1QuantizationMapPropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoFormatAV1QuantizationMapPropertiesKHR( VULKAN_HPP_NAMESPACE::VideoEncodeAV1SuperblockSizeFlagsKHR compatibleSuperblockSizes_ = {},\n                                                                     void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , compatibleSuperblockSizes{ compatibleSuperblockSizes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoFormatAV1QuantizationMapPropertiesKHR( VideoFormatAV1QuantizationMapPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoFormatAV1QuantizationMapPropertiesKHR( VkVideoFormatAV1QuantizationMapPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoFormatAV1QuantizationMapPropertiesKHR( *reinterpret_cast<VideoFormatAV1QuantizationMapPropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoFormatAV1QuantizationMapPropertiesKHR & operator=( VideoFormatAV1QuantizationMapPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoFormatAV1QuantizationMapPropertiesKHR & operator=( VkVideoFormatAV1QuantizationMapPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoFormatAV1QuantizationMapPropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoFormatAV1QuantizationMapPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoFormatAV1QuantizationMapPropertiesKHR *>( this );\n    }\n\n    operator VkVideoFormatAV1QuantizationMapPropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoFormatAV1QuantizationMapPropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::VideoEncodeAV1SuperblockSizeFlagsKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, compatibleSuperblockSizes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoFormatAV1QuantizationMapPropertiesKHR const & ) const = default;\n#else\n    bool operator==( VideoFormatAV1QuantizationMapPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( compatibleSuperblockSizes == rhs.compatibleSuperblockSizes );\n#  endif\n    }\n\n    bool operator!=( VideoFormatAV1QuantizationMapPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                        sType                     = StructureType::eVideoFormatAv1QuantizationMapPropertiesKHR;\n    void *                                                     pNext                     = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeAV1SuperblockSizeFlagsKHR compatibleSuperblockSizes = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoFormatAv1QuantizationMapPropertiesKHR>\n  {\n    using Type = VideoFormatAV1QuantizationMapPropertiesKHR;\n  };\n\n  struct VideoFormatH265QuantizationMapPropertiesKHR\n  {\n    using NativeType = VkVideoFormatH265QuantizationMapPropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoFormatH265QuantizationMapPropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoFormatH265QuantizationMapPropertiesKHR( VULKAN_HPP_NAMESPACE::VideoEncodeH265CtbSizeFlagsKHR compatibleCtbSizes_ = {},\n                                                                      void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , compatibleCtbSizes{ compatibleCtbSizes_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoFormatH265QuantizationMapPropertiesKHR( VideoFormatH265QuantizationMapPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoFormatH265QuantizationMapPropertiesKHR( VkVideoFormatH265QuantizationMapPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoFormatH265QuantizationMapPropertiesKHR( *reinterpret_cast<VideoFormatH265QuantizationMapPropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoFormatH265QuantizationMapPropertiesKHR & operator=( VideoFormatH265QuantizationMapPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoFormatH265QuantizationMapPropertiesKHR & operator=( VkVideoFormatH265QuantizationMapPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoFormatH265QuantizationMapPropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoFormatH265QuantizationMapPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoFormatH265QuantizationMapPropertiesKHR *>( this );\n    }\n\n    operator VkVideoFormatH265QuantizationMapPropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoFormatH265QuantizationMapPropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::VideoEncodeH265CtbSizeFlagsKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, compatibleCtbSizes );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoFormatH265QuantizationMapPropertiesKHR const & ) const = default;\n#else\n    bool operator==( VideoFormatH265QuantizationMapPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( compatibleCtbSizes == rhs.compatibleCtbSizes );\n#  endif\n    }\n\n    bool operator!=( VideoFormatH265QuantizationMapPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                  sType              = StructureType::eVideoFormatH265QuantizationMapPropertiesKHR;\n    void *                                               pNext              = {};\n    VULKAN_HPP_NAMESPACE::VideoEncodeH265CtbSizeFlagsKHR compatibleCtbSizes = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoFormatH265QuantizationMapPropertiesKHR>\n  {\n    using Type = VideoFormatH265QuantizationMapPropertiesKHR;\n  };\n\n  struct VideoFormatPropertiesKHR\n  {\n    using NativeType = VkVideoFormatPropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoFormatPropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoFormatPropertiesKHR( VULKAN_HPP_NAMESPACE::Format           format_           = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                                   VULKAN_HPP_NAMESPACE::ComponentMapping componentMapping_ = {},\n                                                   VULKAN_HPP_NAMESPACE::ImageCreateFlags imageCreateFlags_ = {},\n                                                   VULKAN_HPP_NAMESPACE::ImageType        imageType_        = VULKAN_HPP_NAMESPACE::ImageType::e1D,\n                                                   VULKAN_HPP_NAMESPACE::ImageTiling      imageTiling_      = VULKAN_HPP_NAMESPACE::ImageTiling::eOptimal,\n                                                   VULKAN_HPP_NAMESPACE::ImageUsageFlags  imageUsageFlags_  = {},\n                                                   void *                                 pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , format{ format_ }\n      , componentMapping{ componentMapping_ }\n      , imageCreateFlags{ imageCreateFlags_ }\n      , imageType{ imageType_ }\n      , imageTiling{ imageTiling_ }\n      , imageUsageFlags{ imageUsageFlags_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoFormatPropertiesKHR( VideoFormatPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoFormatPropertiesKHR( VkVideoFormatPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoFormatPropertiesKHR( *reinterpret_cast<VideoFormatPropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoFormatPropertiesKHR & operator=( VideoFormatPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoFormatPropertiesKHR & operator=( VkVideoFormatPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoFormatPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoFormatPropertiesKHR *>( this );\n    }\n\n    operator VkVideoFormatPropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoFormatPropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               void * const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::ComponentMapping const &,\n               VULKAN_HPP_NAMESPACE::ImageCreateFlags const &,\n               VULKAN_HPP_NAMESPACE::ImageType const &,\n               VULKAN_HPP_NAMESPACE::ImageTiling const &,\n               VULKAN_HPP_NAMESPACE::ImageUsageFlags const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, format, componentMapping, imageCreateFlags, imageType, imageTiling, imageUsageFlags );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoFormatPropertiesKHR const & ) const = default;\n#else\n    bool operator==( VideoFormatPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( format == rhs.format ) && ( componentMapping == rhs.componentMapping ) &&\n             ( imageCreateFlags == rhs.imageCreateFlags ) && ( imageType == rhs.imageType ) && ( imageTiling == rhs.imageTiling ) &&\n             ( imageUsageFlags == rhs.imageUsageFlags );\n#  endif\n    }\n\n    bool operator!=( VideoFormatPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType    sType            = StructureType::eVideoFormatPropertiesKHR;\n    void *                                 pNext            = {};\n    VULKAN_HPP_NAMESPACE::Format           format           = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::ComponentMapping componentMapping = {};\n    VULKAN_HPP_NAMESPACE::ImageCreateFlags imageCreateFlags = {};\n    VULKAN_HPP_NAMESPACE::ImageType        imageType        = VULKAN_HPP_NAMESPACE::ImageType::e1D;\n    VULKAN_HPP_NAMESPACE::ImageTiling      imageTiling      = VULKAN_HPP_NAMESPACE::ImageTiling::eOptimal;\n    VULKAN_HPP_NAMESPACE::ImageUsageFlags  imageUsageFlags  = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoFormatPropertiesKHR>\n  {\n    using Type = VideoFormatPropertiesKHR;\n  };\n\n  struct VideoFormatQuantizationMapPropertiesKHR\n  {\n    using NativeType = VkVideoFormatQuantizationMapPropertiesKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoFormatQuantizationMapPropertiesKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoFormatQuantizationMapPropertiesKHR( VULKAN_HPP_NAMESPACE::Extent2D quantizationMapTexelSize_ = {},\n                                                                  void *                         pNext_                    = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , quantizationMapTexelSize{ quantizationMapTexelSize_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoFormatQuantizationMapPropertiesKHR( VideoFormatQuantizationMapPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoFormatQuantizationMapPropertiesKHR( VkVideoFormatQuantizationMapPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoFormatQuantizationMapPropertiesKHR( *reinterpret_cast<VideoFormatQuantizationMapPropertiesKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoFormatQuantizationMapPropertiesKHR & operator=( VideoFormatQuantizationMapPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoFormatQuantizationMapPropertiesKHR & operator=( VkVideoFormatQuantizationMapPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoFormatQuantizationMapPropertiesKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoFormatQuantizationMapPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoFormatQuantizationMapPropertiesKHR *>( this );\n    }\n\n    operator VkVideoFormatQuantizationMapPropertiesKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoFormatQuantizationMapPropertiesKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, VULKAN_HPP_NAMESPACE::Extent2D const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, quantizationMapTexelSize );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoFormatQuantizationMapPropertiesKHR const & ) const = default;\n#else\n    bool operator==( VideoFormatQuantizationMapPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( quantizationMapTexelSize == rhs.quantizationMapTexelSize );\n#  endif\n    }\n\n    bool operator!=( VideoFormatQuantizationMapPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType                    = StructureType::eVideoFormatQuantizationMapPropertiesKHR;\n    void *                              pNext                    = {};\n    VULKAN_HPP_NAMESPACE::Extent2D      quantizationMapTexelSize = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoFormatQuantizationMapPropertiesKHR>\n  {\n    using Type = VideoFormatQuantizationMapPropertiesKHR;\n  };\n\n  struct VideoInlineQueryInfoKHR\n  {\n    using NativeType = VkVideoInlineQueryInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoInlineQueryInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoInlineQueryInfoKHR( VULKAN_HPP_NAMESPACE::QueryPool queryPool_  = {},\n                                                  uint32_t                        firstQuery_ = {},\n                                                  uint32_t                        queryCount_ = {},\n                                                  const void *                    pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , queryPool{ queryPool_ }\n      , firstQuery{ firstQuery_ }\n      , queryCount{ queryCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoInlineQueryInfoKHR( VideoInlineQueryInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoInlineQueryInfoKHR( VkVideoInlineQueryInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoInlineQueryInfoKHR( *reinterpret_cast<VideoInlineQueryInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoInlineQueryInfoKHR & operator=( VideoInlineQueryInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoInlineQueryInfoKHR & operator=( VkVideoInlineQueryInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoInlineQueryInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoInlineQueryInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoInlineQueryInfoKHR & setQueryPool( VULKAN_HPP_NAMESPACE::QueryPool queryPool_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queryPool = queryPool_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoInlineQueryInfoKHR & setFirstQuery( uint32_t firstQuery_ ) VULKAN_HPP_NOEXCEPT\n    {\n      firstQuery = firstQuery_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoInlineQueryInfoKHR & setQueryCount( uint32_t queryCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queryCount = queryCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoInlineQueryInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoInlineQueryInfoKHR *>( this );\n    }\n\n    operator VkVideoInlineQueryInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoInlineQueryInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, VULKAN_HPP_NAMESPACE::QueryPool const &, uint32_t const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, queryPool, firstQuery, queryCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoInlineQueryInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoInlineQueryInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( queryPool == rhs.queryPool ) && ( firstQuery == rhs.firstQuery ) &&\n             ( queryCount == rhs.queryCount );\n#  endif\n    }\n\n    bool operator!=( VideoInlineQueryInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType      = StructureType::eVideoInlineQueryInfoKHR;\n    const void *                        pNext      = {};\n    VULKAN_HPP_NAMESPACE::QueryPool     queryPool  = {};\n    uint32_t                            firstQuery = {};\n    uint32_t                            queryCount = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoInlineQueryInfoKHR>\n  {\n    using Type = VideoInlineQueryInfoKHR;\n  };\n\n  struct VideoProfileListInfoKHR\n  {\n    using NativeType = VkVideoProfileListInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoProfileListInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoProfileListInfoKHR( uint32_t                                          profileCount_ = {},\n                                                  const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR * pProfiles_    = {},\n                                                  const void *                                      pNext_        = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , profileCount{ profileCount_ }\n      , pProfiles{ pProfiles_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoProfileListInfoKHR( VideoProfileListInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoProfileListInfoKHR( VkVideoProfileListInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoProfileListInfoKHR( *reinterpret_cast<VideoProfileListInfoKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoProfileListInfoKHR( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR> const & profiles_,\n                             const void *                                                                                           pNext_ = nullptr )\n      : pNext( pNext_ ), profileCount( static_cast<uint32_t>( profiles_.size() ) ), pProfiles( profiles_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VideoProfileListInfoKHR & operator=( VideoProfileListInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoProfileListInfoKHR & operator=( VkVideoProfileListInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoProfileListInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoProfileListInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoProfileListInfoKHR & setProfileCount( uint32_t profileCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      profileCount = profileCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoProfileListInfoKHR & setPProfiles( const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR * pProfiles_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pProfiles = pProfiles_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    VideoProfileListInfoKHR &\n      setProfiles( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR> const & profiles_ ) VULKAN_HPP_NOEXCEPT\n    {\n      profileCount = static_cast<uint32_t>( profiles_.size() );\n      pProfiles    = profiles_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoProfileListInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoProfileListInfoKHR *>( this );\n    }\n\n    operator VkVideoProfileListInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoProfileListInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, profileCount, pProfiles );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoProfileListInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoProfileListInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( profileCount == rhs.profileCount ) && ( pProfiles == rhs.pProfiles );\n#  endif\n    }\n\n    bool operator!=( VideoProfileListInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType        = StructureType::eVideoProfileListInfoKHR;\n    const void *                                      pNext        = {};\n    uint32_t                                          profileCount = {};\n    const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR * pProfiles    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoProfileListInfoKHR>\n  {\n    using Type = VideoProfileListInfoKHR;\n  };\n\n  struct VideoSessionCreateInfoKHR\n  {\n    using NativeType = VkVideoSessionCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoSessionCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR_14 VideoSessionCreateInfoKHR( uint32_t                                          queueFamilyIndex_ = {},\n                                                       VULKAN_HPP_NAMESPACE::VideoSessionCreateFlagsKHR  flags_            = {},\n                                                       const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR * pVideoProfile_    = {},\n                                                       VULKAN_HPP_NAMESPACE::Format   pictureFormat_              = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                                       VULKAN_HPP_NAMESPACE::Extent2D maxCodedExtent_             = {},\n                                                       VULKAN_HPP_NAMESPACE::Format   referencePictureFormat_     = VULKAN_HPP_NAMESPACE::Format::eUndefined,\n                                                       uint32_t                       maxDpbSlots_                = {},\n                                                       uint32_t                       maxActiveReferencePictures_ = {},\n                                                       const VULKAN_HPP_NAMESPACE::ExtensionProperties * pStdHeaderVersion_ = {},\n                                                       const void *                                      pNext_             = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , queueFamilyIndex{ queueFamilyIndex_ }\n      , flags{ flags_ }\n      , pVideoProfile{ pVideoProfile_ }\n      , pictureFormat{ pictureFormat_ }\n      , maxCodedExtent{ maxCodedExtent_ }\n      , referencePictureFormat{ referencePictureFormat_ }\n      , maxDpbSlots{ maxDpbSlots_ }\n      , maxActiveReferencePictures{ maxActiveReferencePictures_ }\n      , pStdHeaderVersion{ pStdHeaderVersion_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoSessionCreateInfoKHR( VideoSessionCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoSessionCreateInfoKHR( VkVideoSessionCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoSessionCreateInfoKHR( *reinterpret_cast<VideoSessionCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoSessionCreateInfoKHR & operator=( VideoSessionCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoSessionCreateInfoKHR & operator=( VkVideoSessionCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoSessionCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoSessionCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoSessionCreateInfoKHR & setQueueFamilyIndex( uint32_t queueFamilyIndex_ ) VULKAN_HPP_NOEXCEPT\n    {\n      queueFamilyIndex = queueFamilyIndex_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoSessionCreateInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::VideoSessionCreateFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoSessionCreateInfoKHR & setPVideoProfile( const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR * pVideoProfile_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pVideoProfile = pVideoProfile_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoSessionCreateInfoKHR & setPictureFormat( VULKAN_HPP_NAMESPACE::Format pictureFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pictureFormat = pictureFormat_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoSessionCreateInfoKHR & setMaxCodedExtent( VULKAN_HPP_NAMESPACE::Extent2D const & maxCodedExtent_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxCodedExtent = maxCodedExtent_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoSessionCreateInfoKHR & setReferencePictureFormat( VULKAN_HPP_NAMESPACE::Format referencePictureFormat_ ) VULKAN_HPP_NOEXCEPT\n    {\n      referencePictureFormat = referencePictureFormat_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoSessionCreateInfoKHR & setMaxDpbSlots( uint32_t maxDpbSlots_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxDpbSlots = maxDpbSlots_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoSessionCreateInfoKHR & setMaxActiveReferencePictures( uint32_t maxActiveReferencePictures_ ) VULKAN_HPP_NOEXCEPT\n    {\n      maxActiveReferencePictures = maxActiveReferencePictures_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoSessionCreateInfoKHR &\n      setPStdHeaderVersion( const VULKAN_HPP_NAMESPACE::ExtensionProperties * pStdHeaderVersion_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pStdHeaderVersion = pStdHeaderVersion_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoSessionCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoSessionCreateInfoKHR *>( this );\n    }\n\n    operator VkVideoSessionCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoSessionCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               VULKAN_HPP_NAMESPACE::VideoSessionCreateFlagsKHR const &,\n               const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR * const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               VULKAN_HPP_NAMESPACE::Extent2D const &,\n               VULKAN_HPP_NAMESPACE::Format const &,\n               uint32_t const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::ExtensionProperties * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType,\n                       pNext,\n                       queueFamilyIndex,\n                       flags,\n                       pVideoProfile,\n                       pictureFormat,\n                       maxCodedExtent,\n                       referencePictureFormat,\n                       maxDpbSlots,\n                       maxActiveReferencePictures,\n                       pStdHeaderVersion );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoSessionCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoSessionCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( queueFamilyIndex == rhs.queueFamilyIndex ) && ( flags == rhs.flags ) &&\n             ( pVideoProfile == rhs.pVideoProfile ) && ( pictureFormat == rhs.pictureFormat ) && ( maxCodedExtent == rhs.maxCodedExtent ) &&\n             ( referencePictureFormat == rhs.referencePictureFormat ) && ( maxDpbSlots == rhs.maxDpbSlots ) &&\n             ( maxActiveReferencePictures == rhs.maxActiveReferencePictures ) && ( pStdHeaderVersion == rhs.pStdHeaderVersion );\n#  endif\n    }\n\n    bool operator!=( VideoSessionCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType               sType                      = StructureType::eVideoSessionCreateInfoKHR;\n    const void *                                      pNext                      = {};\n    uint32_t                                          queueFamilyIndex           = {};\n    VULKAN_HPP_NAMESPACE::VideoSessionCreateFlagsKHR  flags                      = {};\n    const VULKAN_HPP_NAMESPACE::VideoProfileInfoKHR * pVideoProfile              = {};\n    VULKAN_HPP_NAMESPACE::Format                      pictureFormat              = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    VULKAN_HPP_NAMESPACE::Extent2D                    maxCodedExtent             = {};\n    VULKAN_HPP_NAMESPACE::Format                      referencePictureFormat     = VULKAN_HPP_NAMESPACE::Format::eUndefined;\n    uint32_t                                          maxDpbSlots                = {};\n    uint32_t                                          maxActiveReferencePictures = {};\n    const VULKAN_HPP_NAMESPACE::ExtensionProperties * pStdHeaderVersion          = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoSessionCreateInfoKHR>\n  {\n    using Type = VideoSessionCreateInfoKHR;\n  };\n\n  struct VideoSessionMemoryRequirementsKHR\n  {\n    using NativeType = VkVideoSessionMemoryRequirementsKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoSessionMemoryRequirementsKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoSessionMemoryRequirementsKHR( uint32_t                                 memoryBindIndex_    = {},\n                                                            VULKAN_HPP_NAMESPACE::MemoryRequirements memoryRequirements_ = {},\n                                                            void *                                   pNext_              = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , memoryBindIndex{ memoryBindIndex_ }\n      , memoryRequirements{ memoryRequirements_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoSessionMemoryRequirementsKHR( VideoSessionMemoryRequirementsKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoSessionMemoryRequirementsKHR( VkVideoSessionMemoryRequirementsKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoSessionMemoryRequirementsKHR( *reinterpret_cast<VideoSessionMemoryRequirementsKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoSessionMemoryRequirementsKHR & operator=( VideoSessionMemoryRequirementsKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoSessionMemoryRequirementsKHR & operator=( VkVideoSessionMemoryRequirementsKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoSessionMemoryRequirementsKHR const *>( &rhs );\n      return *this;\n    }\n\n    operator VkVideoSessionMemoryRequirementsKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoSessionMemoryRequirementsKHR *>( this );\n    }\n\n    operator VkVideoSessionMemoryRequirementsKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoSessionMemoryRequirementsKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &, VULKAN_HPP_NAMESPACE::MemoryRequirements const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, memoryBindIndex, memoryRequirements );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoSessionMemoryRequirementsKHR const & ) const = default;\n#else\n    bool operator==( VideoSessionMemoryRequirementsKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( memoryBindIndex == rhs.memoryBindIndex ) && ( memoryRequirements == rhs.memoryRequirements );\n#  endif\n    }\n\n    bool operator!=( VideoSessionMemoryRequirementsKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType      sType              = StructureType::eVideoSessionMemoryRequirementsKHR;\n    void *                                   pNext              = {};\n    uint32_t                                 memoryBindIndex    = {};\n    VULKAN_HPP_NAMESPACE::MemoryRequirements memoryRequirements = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoSessionMemoryRequirementsKHR>\n  {\n    using Type = VideoSessionMemoryRequirementsKHR;\n  };\n\n  struct VideoSessionParametersCreateInfoKHR\n  {\n    using NativeType = VkVideoSessionParametersCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoSessionParametersCreateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoSessionParametersCreateInfoKHR( VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateFlagsKHR flags_                          = {},\n                                                              VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR            videoSessionParametersTemplate_ = {},\n                                                              VULKAN_HPP_NAMESPACE::VideoSessionKHR                      videoSession_                   = {},\n                                                              const void *                                               pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , videoSessionParametersTemplate{ videoSessionParametersTemplate_ }\n      , videoSession{ videoSession_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoSessionParametersCreateInfoKHR( VideoSessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoSessionParametersCreateInfoKHR( VkVideoSessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoSessionParametersCreateInfoKHR( *reinterpret_cast<VideoSessionParametersCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoSessionParametersCreateInfoKHR & operator=( VideoSessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoSessionParametersCreateInfoKHR & operator=( VkVideoSessionParametersCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoSessionParametersCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoSessionParametersCreateInfoKHR &\n      setFlags( VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoSessionParametersCreateInfoKHR &\n      setVideoSessionParametersTemplate( VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR videoSessionParametersTemplate_ ) VULKAN_HPP_NOEXCEPT\n    {\n      videoSessionParametersTemplate = videoSessionParametersTemplate_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoSessionParametersCreateInfoKHR & setVideoSession( VULKAN_HPP_NAMESPACE::VideoSessionKHR videoSession_ ) VULKAN_HPP_NOEXCEPT\n    {\n      videoSession = videoSession_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoSessionParametersCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoSessionParametersCreateInfoKHR *>( this );\n    }\n\n    operator VkVideoSessionParametersCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoSessionParametersCreateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateFlagsKHR const &,\n               VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR const &,\n               VULKAN_HPP_NAMESPACE::VideoSessionKHR const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, videoSessionParametersTemplate, videoSession );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoSessionParametersCreateInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoSessionParametersCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) &&\n             ( videoSessionParametersTemplate == rhs.videoSessionParametersTemplate ) && ( videoSession == rhs.videoSession );\n#  endif\n    }\n\n    bool operator!=( VideoSessionParametersCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                        sType                          = StructureType::eVideoSessionParametersCreateInfoKHR;\n    const void *                                               pNext                          = {};\n    VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateFlagsKHR flags                          = {};\n    VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR            videoSessionParametersTemplate = {};\n    VULKAN_HPP_NAMESPACE::VideoSessionKHR                      videoSession                   = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoSessionParametersCreateInfoKHR>\n  {\n    using Type = VideoSessionParametersCreateInfoKHR;\n  };\n\n  struct VideoSessionParametersUpdateInfoKHR\n  {\n    using NativeType = VkVideoSessionParametersUpdateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eVideoSessionParametersUpdateInfoKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR VideoSessionParametersUpdateInfoKHR( uint32_t updateSequenceCount_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , updateSequenceCount{ updateSequenceCount_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR VideoSessionParametersUpdateInfoKHR( VideoSessionParametersUpdateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    VideoSessionParametersUpdateInfoKHR( VkVideoSessionParametersUpdateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : VideoSessionParametersUpdateInfoKHR( *reinterpret_cast<VideoSessionParametersUpdateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    VideoSessionParametersUpdateInfoKHR & operator=( VideoSessionParametersUpdateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    VideoSessionParametersUpdateInfoKHR & operator=( VkVideoSessionParametersUpdateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::VideoSessionParametersUpdateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 VideoSessionParametersUpdateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 VideoSessionParametersUpdateInfoKHR & setUpdateSequenceCount( uint32_t updateSequenceCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      updateSequenceCount = updateSequenceCount_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkVideoSessionParametersUpdateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkVideoSessionParametersUpdateInfoKHR *>( this );\n    }\n\n    operator VkVideoSessionParametersUpdateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkVideoSessionParametersUpdateInfoKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, updateSequenceCount );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( VideoSessionParametersUpdateInfoKHR const & ) const = default;\n#else\n    bool operator==( VideoSessionParametersUpdateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( updateSequenceCount == rhs.updateSequenceCount );\n#  endif\n    }\n\n    bool operator!=( VideoSessionParametersUpdateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType               = StructureType::eVideoSessionParametersUpdateInfoKHR;\n    const void *                        pNext               = {};\n    uint32_t                            updateSequenceCount = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eVideoSessionParametersUpdateInfoKHR>\n  {\n    using Type = VideoSessionParametersUpdateInfoKHR;\n  };\n\n#if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n  struct WaylandSurfaceCreateInfoKHR\n  {\n    using NativeType = VkWaylandSurfaceCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eWaylandSurfaceCreateInfoKHR;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR WaylandSurfaceCreateInfoKHR( VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateFlagsKHR flags_   = {},\n                                                      struct wl_display *                                display_ = {},\n                                                      struct wl_surface *                                surface_ = {},\n                                                      const void *                                       pNext_   = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , display{ display_ }\n      , surface{ surface_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR WaylandSurfaceCreateInfoKHR( WaylandSurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    WaylandSurfaceCreateInfoKHR( VkWaylandSurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : WaylandSurfaceCreateInfoKHR( *reinterpret_cast<WaylandSurfaceCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    WaylandSurfaceCreateInfoKHR & operator=( WaylandSurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    WaylandSurfaceCreateInfoKHR & operator=( VkWaylandSurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 WaylandSurfaceCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 WaylandSurfaceCreateInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 WaylandSurfaceCreateInfoKHR & setDisplay( struct wl_display * display_ ) VULKAN_HPP_NOEXCEPT\n    {\n      display = display_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 WaylandSurfaceCreateInfoKHR & setSurface( struct wl_surface * surface_ ) VULKAN_HPP_NOEXCEPT\n    {\n      surface = surface_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkWaylandSurfaceCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkWaylandSurfaceCreateInfoKHR *>( this );\n    }\n\n    operator VkWaylandSurfaceCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkWaylandSurfaceCreateInfoKHR *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateFlagsKHR const &,\n               struct wl_display * const &,\n               struct wl_surface * const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, display, surface );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( WaylandSurfaceCreateInfoKHR const & ) const = default;\n#  else\n    bool operator==( WaylandSurfaceCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( display == rhs.display ) && ( surface == rhs.surface );\n#    endif\n    }\n\n    bool operator!=( WaylandSurfaceCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                sType   = StructureType::eWaylandSurfaceCreateInfoKHR;\n    const void *                                       pNext   = {};\n    VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateFlagsKHR flags   = {};\n    struct wl_display *                                display = {};\n    struct wl_surface *                                surface = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eWaylandSurfaceCreateInfoKHR>\n  {\n    using Type = WaylandSurfaceCreateInfoKHR;\n  };\n#endif /*VK_USE_PLATFORM_WAYLAND_KHR*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  struct Win32KeyedMutexAcquireReleaseInfoKHR\n  {\n    using NativeType = VkWin32KeyedMutexAcquireReleaseInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eWin32KeyedMutexAcquireReleaseInfoKHR;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR Win32KeyedMutexAcquireReleaseInfoKHR( uint32_t                                   acquireCount_     = {},\n                                                               const VULKAN_HPP_NAMESPACE::DeviceMemory * pAcquireSyncs_    = {},\n                                                               const uint64_t *                           pAcquireKeys_     = {},\n                                                               const uint32_t *                           pAcquireTimeouts_ = {},\n                                                               uint32_t                                   releaseCount_     = {},\n                                                               const VULKAN_HPP_NAMESPACE::DeviceMemory * pReleaseSyncs_    = {},\n                                                               const uint64_t *                           pReleaseKeys_     = {},\n                                                               const void *                               pNext_            = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , acquireCount{ acquireCount_ }\n      , pAcquireSyncs{ pAcquireSyncs_ }\n      , pAcquireKeys{ pAcquireKeys_ }\n      , pAcquireTimeouts{ pAcquireTimeouts_ }\n      , releaseCount{ releaseCount_ }\n      , pReleaseSyncs{ pReleaseSyncs_ }\n      , pReleaseKeys{ pReleaseKeys_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR Win32KeyedMutexAcquireReleaseInfoKHR( Win32KeyedMutexAcquireReleaseInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    Win32KeyedMutexAcquireReleaseInfoKHR( VkWin32KeyedMutexAcquireReleaseInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : Win32KeyedMutexAcquireReleaseInfoKHR( *reinterpret_cast<Win32KeyedMutexAcquireReleaseInfoKHR const *>( &rhs ) )\n    {\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    Win32KeyedMutexAcquireReleaseInfoKHR( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DeviceMemory> const & acquireSyncs_,\n                                          VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const &                           acquireKeys_     = {},\n                                          VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const &                           acquireTimeouts_ = {},\n                                          VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DeviceMemory> const & releaseSyncs_    = {},\n                                          VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const &                           releaseKeys_     = {},\n                                          const void *                                                                                    pNext_ = nullptr )\n      : pNext( pNext_ )\n      , acquireCount( static_cast<uint32_t>( acquireSyncs_.size() ) )\n      , pAcquireSyncs( acquireSyncs_.data() )\n      , pAcquireKeys( acquireKeys_.data() )\n      , pAcquireTimeouts( acquireTimeouts_.data() )\n      , releaseCount( static_cast<uint32_t>( releaseSyncs_.size() ) )\n      , pReleaseSyncs( releaseSyncs_.data() )\n      , pReleaseKeys( releaseKeys_.data() )\n    {\n#      ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( acquireSyncs_.size() == acquireKeys_.size() );\n      VULKAN_HPP_ASSERT( acquireSyncs_.size() == acquireTimeouts_.size() );\n      VULKAN_HPP_ASSERT( acquireKeys_.size() == acquireTimeouts_.size() );\n#      else\n      if ( acquireSyncs_.size() != acquireKeys_.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING\n                          \"::Win32KeyedMutexAcquireReleaseInfoKHR::Win32KeyedMutexAcquireReleaseInfoKHR: acquireSyncs_.size() != acquireKeys_.size()\" );\n      }\n      if ( acquireSyncs_.size() != acquireTimeouts_.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING\n                          \"::Win32KeyedMutexAcquireReleaseInfoKHR::Win32KeyedMutexAcquireReleaseInfoKHR: acquireSyncs_.size() != acquireTimeouts_.size()\" );\n      }\n      if ( acquireKeys_.size() != acquireTimeouts_.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING\n                          \"::Win32KeyedMutexAcquireReleaseInfoKHR::Win32KeyedMutexAcquireReleaseInfoKHR: acquireKeys_.size() != acquireTimeouts_.size()\" );\n      }\n#      endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n#      ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( releaseSyncs_.size() == releaseKeys_.size() );\n#      else\n      if ( releaseSyncs_.size() != releaseKeys_.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING\n                          \"::Win32KeyedMutexAcquireReleaseInfoKHR::Win32KeyedMutexAcquireReleaseInfoKHR: releaseSyncs_.size() != releaseKeys_.size()\" );\n      }\n#      endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    Win32KeyedMutexAcquireReleaseInfoKHR & operator=( Win32KeyedMutexAcquireReleaseInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    Win32KeyedMutexAcquireReleaseInfoKHR & operator=( VkWin32KeyedMutexAcquireReleaseInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::Win32KeyedMutexAcquireReleaseInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 Win32KeyedMutexAcquireReleaseInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 Win32KeyedMutexAcquireReleaseInfoKHR & setAcquireCount( uint32_t acquireCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      acquireCount = acquireCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 Win32KeyedMutexAcquireReleaseInfoKHR &\n      setPAcquireSyncs( const VULKAN_HPP_NAMESPACE::DeviceMemory * pAcquireSyncs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pAcquireSyncs = pAcquireSyncs_;\n      return *this;\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    Win32KeyedMutexAcquireReleaseInfoKHR &\n      setAcquireSyncs( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DeviceMemory> const & acquireSyncs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      acquireCount  = static_cast<uint32_t>( acquireSyncs_.size() );\n      pAcquireSyncs = acquireSyncs_.data();\n      return *this;\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 Win32KeyedMutexAcquireReleaseInfoKHR & setPAcquireKeys( const uint64_t * pAcquireKeys_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pAcquireKeys = pAcquireKeys_;\n      return *this;\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    Win32KeyedMutexAcquireReleaseInfoKHR &\n      setAcquireKeys( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & acquireKeys_ ) VULKAN_HPP_NOEXCEPT\n    {\n      acquireCount = static_cast<uint32_t>( acquireKeys_.size() );\n      pAcquireKeys = acquireKeys_.data();\n      return *this;\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 Win32KeyedMutexAcquireReleaseInfoKHR & setPAcquireTimeouts( const uint32_t * pAcquireTimeouts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pAcquireTimeouts = pAcquireTimeouts_;\n      return *this;\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    Win32KeyedMutexAcquireReleaseInfoKHR &\n      setAcquireTimeouts( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & acquireTimeouts_ ) VULKAN_HPP_NOEXCEPT\n    {\n      acquireCount     = static_cast<uint32_t>( acquireTimeouts_.size() );\n      pAcquireTimeouts = acquireTimeouts_.data();\n      return *this;\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 Win32KeyedMutexAcquireReleaseInfoKHR & setReleaseCount( uint32_t releaseCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      releaseCount = releaseCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 Win32KeyedMutexAcquireReleaseInfoKHR &\n      setPReleaseSyncs( const VULKAN_HPP_NAMESPACE::DeviceMemory * pReleaseSyncs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pReleaseSyncs = pReleaseSyncs_;\n      return *this;\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    Win32KeyedMutexAcquireReleaseInfoKHR &\n      setReleaseSyncs( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DeviceMemory> const & releaseSyncs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      releaseCount  = static_cast<uint32_t>( releaseSyncs_.size() );\n      pReleaseSyncs = releaseSyncs_.data();\n      return *this;\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 Win32KeyedMutexAcquireReleaseInfoKHR & setPReleaseKeys( const uint64_t * pReleaseKeys_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pReleaseKeys = pReleaseKeys_;\n      return *this;\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    Win32KeyedMutexAcquireReleaseInfoKHR &\n      setReleaseKeys( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & releaseKeys_ ) VULKAN_HPP_NOEXCEPT\n    {\n      releaseCount = static_cast<uint32_t>( releaseKeys_.size() );\n      pReleaseKeys = releaseKeys_.data();\n      return *this;\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#  endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkWin32KeyedMutexAcquireReleaseInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoKHR *>( this );\n    }\n\n    operator VkWin32KeyedMutexAcquireReleaseInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoKHR *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::DeviceMemory * const &,\n               const uint64_t * const &,\n               const uint32_t * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::DeviceMemory * const &,\n               const uint64_t * const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, acquireCount, pAcquireSyncs, pAcquireKeys, pAcquireTimeouts, releaseCount, pReleaseSyncs, pReleaseKeys );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( Win32KeyedMutexAcquireReleaseInfoKHR const & ) const = default;\n#  else\n    bool operator==( Win32KeyedMutexAcquireReleaseInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( acquireCount == rhs.acquireCount ) && ( pAcquireSyncs == rhs.pAcquireSyncs ) &&\n             ( pAcquireKeys == rhs.pAcquireKeys ) && ( pAcquireTimeouts == rhs.pAcquireTimeouts ) && ( releaseCount == rhs.releaseCount ) &&\n             ( pReleaseSyncs == rhs.pReleaseSyncs ) && ( pReleaseKeys == rhs.pReleaseKeys );\n#    endif\n    }\n\n    bool operator!=( Win32KeyedMutexAcquireReleaseInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType        sType            = StructureType::eWin32KeyedMutexAcquireReleaseInfoKHR;\n    const void *                               pNext            = {};\n    uint32_t                                   acquireCount     = {};\n    const VULKAN_HPP_NAMESPACE::DeviceMemory * pAcquireSyncs    = {};\n    const uint64_t *                           pAcquireKeys     = {};\n    const uint32_t *                           pAcquireTimeouts = {};\n    uint32_t                                   releaseCount     = {};\n    const VULKAN_HPP_NAMESPACE::DeviceMemory * pReleaseSyncs    = {};\n    const uint64_t *                           pReleaseKeys     = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eWin32KeyedMutexAcquireReleaseInfoKHR>\n  {\n    using Type = Win32KeyedMutexAcquireReleaseInfoKHR;\n  };\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  struct Win32KeyedMutexAcquireReleaseInfoNV\n  {\n    using NativeType = VkWin32KeyedMutexAcquireReleaseInfoNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eWin32KeyedMutexAcquireReleaseInfoNV;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR Win32KeyedMutexAcquireReleaseInfoNV( uint32_t                                   acquireCount_                = {},\n                                                              const VULKAN_HPP_NAMESPACE::DeviceMemory * pAcquireSyncs_               = {},\n                                                              const uint64_t *                           pAcquireKeys_                = {},\n                                                              const uint32_t *                           pAcquireTimeoutMilliseconds_ = {},\n                                                              uint32_t                                   releaseCount_                = {},\n                                                              const VULKAN_HPP_NAMESPACE::DeviceMemory * pReleaseSyncs_               = {},\n                                                              const uint64_t *                           pReleaseKeys_                = {},\n                                                              const void *                               pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , acquireCount{ acquireCount_ }\n      , pAcquireSyncs{ pAcquireSyncs_ }\n      , pAcquireKeys{ pAcquireKeys_ }\n      , pAcquireTimeoutMilliseconds{ pAcquireTimeoutMilliseconds_ }\n      , releaseCount{ releaseCount_ }\n      , pReleaseSyncs{ pReleaseSyncs_ }\n      , pReleaseKeys{ pReleaseKeys_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR Win32KeyedMutexAcquireReleaseInfoNV( Win32KeyedMutexAcquireReleaseInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    Win32KeyedMutexAcquireReleaseInfoNV( VkWin32KeyedMutexAcquireReleaseInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : Win32KeyedMutexAcquireReleaseInfoNV( *reinterpret_cast<Win32KeyedMutexAcquireReleaseInfoNV const *>( &rhs ) )\n    {\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    Win32KeyedMutexAcquireReleaseInfoNV( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DeviceMemory> const & acquireSyncs_,\n                                         VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const &                           acquireKeys_  = {},\n                                         VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & acquireTimeoutMilliseconds_             = {},\n                                         VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DeviceMemory> const & releaseSyncs_ = {},\n                                         VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const &                           releaseKeys_  = {},\n                                         const void *                                                                                    pNext_ = nullptr )\n      : pNext( pNext_ )\n      , acquireCount( static_cast<uint32_t>( acquireSyncs_.size() ) )\n      , pAcquireSyncs( acquireSyncs_.data() )\n      , pAcquireKeys( acquireKeys_.data() )\n      , pAcquireTimeoutMilliseconds( acquireTimeoutMilliseconds_.data() )\n      , releaseCount( static_cast<uint32_t>( releaseSyncs_.size() ) )\n      , pReleaseSyncs( releaseSyncs_.data() )\n      , pReleaseKeys( releaseKeys_.data() )\n    {\n#      ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( acquireSyncs_.size() == acquireKeys_.size() );\n      VULKAN_HPP_ASSERT( acquireSyncs_.size() == acquireTimeoutMilliseconds_.size() );\n      VULKAN_HPP_ASSERT( acquireKeys_.size() == acquireTimeoutMilliseconds_.size() );\n#      else\n      if ( acquireSyncs_.size() != acquireKeys_.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING\n                          \"::Win32KeyedMutexAcquireReleaseInfoNV::Win32KeyedMutexAcquireReleaseInfoNV: acquireSyncs_.size() != acquireKeys_.size()\" );\n      }\n      if ( acquireSyncs_.size() != acquireTimeoutMilliseconds_.size() )\n      {\n        throw LogicError(\n          VULKAN_HPP_NAMESPACE_STRING\n          \"::Win32KeyedMutexAcquireReleaseInfoNV::Win32KeyedMutexAcquireReleaseInfoNV: acquireSyncs_.size() != acquireTimeoutMilliseconds_.size()\" );\n      }\n      if ( acquireKeys_.size() != acquireTimeoutMilliseconds_.size() )\n      {\n        throw LogicError(\n          VULKAN_HPP_NAMESPACE_STRING\n          \"::Win32KeyedMutexAcquireReleaseInfoNV::Win32KeyedMutexAcquireReleaseInfoNV: acquireKeys_.size() != acquireTimeoutMilliseconds_.size()\" );\n      }\n#      endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n\n#      ifdef VULKAN_HPP_NO_EXCEPTIONS\n      VULKAN_HPP_ASSERT( releaseSyncs_.size() == releaseKeys_.size() );\n#      else\n      if ( releaseSyncs_.size() != releaseKeys_.size() )\n      {\n        throw LogicError( VULKAN_HPP_NAMESPACE_STRING\n                          \"::Win32KeyedMutexAcquireReleaseInfoNV::Win32KeyedMutexAcquireReleaseInfoNV: releaseSyncs_.size() != releaseKeys_.size()\" );\n      }\n#      endif /*VULKAN_HPP_NO_EXCEPTIONS*/\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    Win32KeyedMutexAcquireReleaseInfoNV & operator=( Win32KeyedMutexAcquireReleaseInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    Win32KeyedMutexAcquireReleaseInfoNV & operator=( VkWin32KeyedMutexAcquireReleaseInfoNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::Win32KeyedMutexAcquireReleaseInfoNV const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 Win32KeyedMutexAcquireReleaseInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 Win32KeyedMutexAcquireReleaseInfoNV & setAcquireCount( uint32_t acquireCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      acquireCount = acquireCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 Win32KeyedMutexAcquireReleaseInfoNV &\n      setPAcquireSyncs( const VULKAN_HPP_NAMESPACE::DeviceMemory * pAcquireSyncs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pAcquireSyncs = pAcquireSyncs_;\n      return *this;\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    Win32KeyedMutexAcquireReleaseInfoNV &\n      setAcquireSyncs( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DeviceMemory> const & acquireSyncs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      acquireCount  = static_cast<uint32_t>( acquireSyncs_.size() );\n      pAcquireSyncs = acquireSyncs_.data();\n      return *this;\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 Win32KeyedMutexAcquireReleaseInfoNV & setPAcquireKeys( const uint64_t * pAcquireKeys_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pAcquireKeys = pAcquireKeys_;\n      return *this;\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    Win32KeyedMutexAcquireReleaseInfoNV &\n      setAcquireKeys( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & acquireKeys_ ) VULKAN_HPP_NOEXCEPT\n    {\n      acquireCount = static_cast<uint32_t>( acquireKeys_.size() );\n      pAcquireKeys = acquireKeys_.data();\n      return *this;\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 Win32KeyedMutexAcquireReleaseInfoNV &\n      setPAcquireTimeoutMilliseconds( const uint32_t * pAcquireTimeoutMilliseconds_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pAcquireTimeoutMilliseconds = pAcquireTimeoutMilliseconds_;\n      return *this;\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    Win32KeyedMutexAcquireReleaseInfoNV &\n      setAcquireTimeoutMilliseconds( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & acquireTimeoutMilliseconds_ ) VULKAN_HPP_NOEXCEPT\n    {\n      acquireCount                = static_cast<uint32_t>( acquireTimeoutMilliseconds_.size() );\n      pAcquireTimeoutMilliseconds = acquireTimeoutMilliseconds_.data();\n      return *this;\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 Win32KeyedMutexAcquireReleaseInfoNV & setReleaseCount( uint32_t releaseCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      releaseCount = releaseCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 Win32KeyedMutexAcquireReleaseInfoNV &\n      setPReleaseSyncs( const VULKAN_HPP_NAMESPACE::DeviceMemory * pReleaseSyncs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pReleaseSyncs = pReleaseSyncs_;\n      return *this;\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    Win32KeyedMutexAcquireReleaseInfoNV &\n      setReleaseSyncs( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DeviceMemory> const & releaseSyncs_ ) VULKAN_HPP_NOEXCEPT\n    {\n      releaseCount  = static_cast<uint32_t>( releaseSyncs_.size() );\n      pReleaseSyncs = releaseSyncs_.data();\n      return *this;\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    VULKAN_HPP_CONSTEXPR_14 Win32KeyedMutexAcquireReleaseInfoNV & setPReleaseKeys( const uint64_t * pReleaseKeys_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pReleaseKeys = pReleaseKeys_;\n      return *this;\n    }\n\n#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    Win32KeyedMutexAcquireReleaseInfoNV &\n      setReleaseKeys( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & releaseKeys_ ) VULKAN_HPP_NOEXCEPT\n    {\n      releaseCount = static_cast<uint32_t>( releaseKeys_.size() );\n      pReleaseKeys = releaseKeys_.data();\n      return *this;\n    }\n#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#  endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkWin32KeyedMutexAcquireReleaseInfoNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoNV *>( this );\n    }\n\n    operator VkWin32KeyedMutexAcquireReleaseInfoNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoNV *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::DeviceMemory * const &,\n               const uint64_t * const &,\n               const uint32_t * const &,\n               uint32_t const &,\n               const VULKAN_HPP_NAMESPACE::DeviceMemory * const &,\n               const uint64_t * const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, acquireCount, pAcquireSyncs, pAcquireKeys, pAcquireTimeoutMilliseconds, releaseCount, pReleaseSyncs, pReleaseKeys );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( Win32KeyedMutexAcquireReleaseInfoNV const & ) const = default;\n#  else\n    bool operator==( Win32KeyedMutexAcquireReleaseInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( acquireCount == rhs.acquireCount ) && ( pAcquireSyncs == rhs.pAcquireSyncs ) &&\n             ( pAcquireKeys == rhs.pAcquireKeys ) && ( pAcquireTimeoutMilliseconds == rhs.pAcquireTimeoutMilliseconds ) &&\n             ( releaseCount == rhs.releaseCount ) && ( pReleaseSyncs == rhs.pReleaseSyncs ) && ( pReleaseKeys == rhs.pReleaseKeys );\n#    endif\n    }\n\n    bool operator!=( Win32KeyedMutexAcquireReleaseInfoNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType        sType                       = StructureType::eWin32KeyedMutexAcquireReleaseInfoNV;\n    const void *                               pNext                       = {};\n    uint32_t                                   acquireCount                = {};\n    const VULKAN_HPP_NAMESPACE::DeviceMemory * pAcquireSyncs               = {};\n    const uint64_t *                           pAcquireKeys                = {};\n    const uint32_t *                           pAcquireTimeoutMilliseconds = {};\n    uint32_t                                   releaseCount                = {};\n    const VULKAN_HPP_NAMESPACE::DeviceMemory * pReleaseSyncs               = {};\n    const uint64_t *                           pReleaseKeys                = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eWin32KeyedMutexAcquireReleaseInfoNV>\n  {\n    using Type = Win32KeyedMutexAcquireReleaseInfoNV;\n  };\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  struct Win32SurfaceCreateInfoKHR\n  {\n    using NativeType = VkWin32SurfaceCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eWin32SurfaceCreateInfoKHR;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR Win32SurfaceCreateInfoKHR( VULKAN_HPP_NAMESPACE::Win32SurfaceCreateFlagsKHR flags_     = {},\n                                                    HINSTANCE                                        hinstance_ = {},\n                                                    HWND                                             hwnd_      = {},\n                                                    const void *                                     pNext_     = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , hinstance{ hinstance_ }\n      , hwnd{ hwnd_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR Win32SurfaceCreateInfoKHR( Win32SurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    Win32SurfaceCreateInfoKHR( VkWin32SurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : Win32SurfaceCreateInfoKHR( *reinterpret_cast<Win32SurfaceCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    Win32SurfaceCreateInfoKHR & operator=( Win32SurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    Win32SurfaceCreateInfoKHR & operator=( VkWin32SurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::Win32SurfaceCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 Win32SurfaceCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 Win32SurfaceCreateInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::Win32SurfaceCreateFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 Win32SurfaceCreateInfoKHR & setHinstance( HINSTANCE hinstance_ ) VULKAN_HPP_NOEXCEPT\n    {\n      hinstance = hinstance_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 Win32SurfaceCreateInfoKHR & setHwnd( HWND hwnd_ ) VULKAN_HPP_NOEXCEPT\n    {\n      hwnd = hwnd_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkWin32SurfaceCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkWin32SurfaceCreateInfoKHR *>( this );\n    }\n\n    operator VkWin32SurfaceCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkWin32SurfaceCreateInfoKHR *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::Win32SurfaceCreateFlagsKHR const &,\n               HINSTANCE const &,\n               HWND const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, hinstance, hwnd );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( Win32SurfaceCreateInfoKHR const & ) const = default;\n#  else\n    bool operator==( Win32SurfaceCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#    if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#    else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( hinstance == rhs.hinstance ) && ( hwnd == rhs.hwnd );\n#    endif\n    }\n\n    bool operator!=( Win32SurfaceCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#  endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType              sType     = StructureType::eWin32SurfaceCreateInfoKHR;\n    const void *                                     pNext     = {};\n    VULKAN_HPP_NAMESPACE::Win32SurfaceCreateFlagsKHR flags     = {};\n    HINSTANCE                                        hinstance = {};\n    HWND                                             hwnd      = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eWin32SurfaceCreateInfoKHR>\n  {\n    using Type = Win32SurfaceCreateInfoKHR;\n  };\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  struct WriteDescriptorSetAccelerationStructureKHR\n  {\n    using NativeType = VkWriteDescriptorSetAccelerationStructureKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eWriteDescriptorSetAccelerationStructureKHR;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR WriteDescriptorSetAccelerationStructureKHR( uint32_t                                               accelerationStructureCount_ = {},\n                                                                     const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR * pAccelerationStructures_    = {},\n                                                                     const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , accelerationStructureCount{ accelerationStructureCount_ }\n      , pAccelerationStructures{ pAccelerationStructures_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR WriteDescriptorSetAccelerationStructureKHR( WriteDescriptorSetAccelerationStructureKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    WriteDescriptorSetAccelerationStructureKHR( VkWriteDescriptorSetAccelerationStructureKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : WriteDescriptorSetAccelerationStructureKHR( *reinterpret_cast<WriteDescriptorSetAccelerationStructureKHR const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    WriteDescriptorSetAccelerationStructureKHR(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR> const & accelerationStructures_,\n      const void *                                                                                                pNext_ = nullptr )\n      : pNext( pNext_ )\n      , accelerationStructureCount( static_cast<uint32_t>( accelerationStructures_.size() ) )\n      , pAccelerationStructures( accelerationStructures_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    WriteDescriptorSetAccelerationStructureKHR & operator=( WriteDescriptorSetAccelerationStructureKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    WriteDescriptorSetAccelerationStructureKHR & operator=( VkWriteDescriptorSetAccelerationStructureKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::WriteDescriptorSetAccelerationStructureKHR const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 WriteDescriptorSetAccelerationStructureKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 WriteDescriptorSetAccelerationStructureKHR &\n      setAccelerationStructureCount( uint32_t accelerationStructureCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      accelerationStructureCount = accelerationStructureCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 WriteDescriptorSetAccelerationStructureKHR &\n      setPAccelerationStructures( const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR * pAccelerationStructures_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pAccelerationStructures = pAccelerationStructures_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    WriteDescriptorSetAccelerationStructureKHR & setAccelerationStructures(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR> const & accelerationStructures_ ) VULKAN_HPP_NOEXCEPT\n    {\n      accelerationStructureCount = static_cast<uint32_t>( accelerationStructures_.size() );\n      pAccelerationStructures    = accelerationStructures_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkWriteDescriptorSetAccelerationStructureKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureKHR *>( this );\n    }\n\n    operator VkWriteDescriptorSetAccelerationStructureKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkWriteDescriptorSetAccelerationStructureKHR *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::\n      tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, accelerationStructureCount, pAccelerationStructures );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( WriteDescriptorSetAccelerationStructureKHR const & ) const = default;\n#else\n    bool operator==( WriteDescriptorSetAccelerationStructureKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( accelerationStructureCount == rhs.accelerationStructureCount ) &&\n             ( pAccelerationStructures == rhs.pAccelerationStructures );\n#  endif\n    }\n\n    bool operator!=( WriteDescriptorSetAccelerationStructureKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                    sType                      = StructureType::eWriteDescriptorSetAccelerationStructureKHR;\n    const void *                                           pNext                      = {};\n    uint32_t                                               accelerationStructureCount = {};\n    const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR * pAccelerationStructures    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eWriteDescriptorSetAccelerationStructureKHR>\n  {\n    using Type = WriteDescriptorSetAccelerationStructureKHR;\n  };\n\n  struct WriteDescriptorSetAccelerationStructureNV\n  {\n    using NativeType = VkWriteDescriptorSetAccelerationStructureNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eWriteDescriptorSetAccelerationStructureNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR WriteDescriptorSetAccelerationStructureNV( uint32_t                                              accelerationStructureCount_ = {},\n                                                                    const VULKAN_HPP_NAMESPACE::AccelerationStructureNV * pAccelerationStructures_    = {},\n                                                                    const void *                                          pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , accelerationStructureCount{ accelerationStructureCount_ }\n      , pAccelerationStructures{ pAccelerationStructures_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR WriteDescriptorSetAccelerationStructureNV( WriteDescriptorSetAccelerationStructureNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    WriteDescriptorSetAccelerationStructureNV( VkWriteDescriptorSetAccelerationStructureNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : WriteDescriptorSetAccelerationStructureNV( *reinterpret_cast<WriteDescriptorSetAccelerationStructureNV const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    WriteDescriptorSetAccelerationStructureNV(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AccelerationStructureNV> const & accelerationStructures_,\n      const void *                                                                                               pNext_ = nullptr )\n      : pNext( pNext_ )\n      , accelerationStructureCount( static_cast<uint32_t>( accelerationStructures_.size() ) )\n      , pAccelerationStructures( accelerationStructures_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    WriteDescriptorSetAccelerationStructureNV & operator=( WriteDescriptorSetAccelerationStructureNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    WriteDescriptorSetAccelerationStructureNV & operator=( VkWriteDescriptorSetAccelerationStructureNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::WriteDescriptorSetAccelerationStructureNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 WriteDescriptorSetAccelerationStructureNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 WriteDescriptorSetAccelerationStructureNV &\n      setAccelerationStructureCount( uint32_t accelerationStructureCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      accelerationStructureCount = accelerationStructureCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 WriteDescriptorSetAccelerationStructureNV &\n      setPAccelerationStructures( const VULKAN_HPP_NAMESPACE::AccelerationStructureNV * pAccelerationStructures_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pAccelerationStructures = pAccelerationStructures_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    WriteDescriptorSetAccelerationStructureNV & setAccelerationStructures(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AccelerationStructureNV> const & accelerationStructures_ ) VULKAN_HPP_NOEXCEPT\n    {\n      accelerationStructureCount = static_cast<uint32_t>( accelerationStructures_.size() );\n      pAccelerationStructures    = accelerationStructures_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkWriteDescriptorSetAccelerationStructureNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureNV *>( this );\n    }\n\n    operator VkWriteDescriptorSetAccelerationStructureNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkWriteDescriptorSetAccelerationStructureNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::\n      tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::AccelerationStructureNV * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, accelerationStructureCount, pAccelerationStructures );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( WriteDescriptorSetAccelerationStructureNV const & ) const = default;\n#else\n    bool operator==( WriteDescriptorSetAccelerationStructureNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( accelerationStructureCount == rhs.accelerationStructureCount ) &&\n             ( pAccelerationStructures == rhs.pAccelerationStructures );\n#  endif\n    }\n\n    bool operator!=( WriteDescriptorSetAccelerationStructureNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType                   sType                      = StructureType::eWriteDescriptorSetAccelerationStructureNV;\n    const void *                                          pNext                      = {};\n    uint32_t                                              accelerationStructureCount = {};\n    const VULKAN_HPP_NAMESPACE::AccelerationStructureNV * pAccelerationStructures    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eWriteDescriptorSetAccelerationStructureNV>\n  {\n    using Type = WriteDescriptorSetAccelerationStructureNV;\n  };\n\n  struct WriteDescriptorSetInlineUniformBlock\n  {\n    using NativeType = VkWriteDescriptorSetInlineUniformBlock;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eWriteDescriptorSetInlineUniformBlock;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR\n      WriteDescriptorSetInlineUniformBlock( uint32_t dataSize_ = {}, const void * pData_ = {}, const void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , dataSize{ dataSize_ }\n      , pData{ pData_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR WriteDescriptorSetInlineUniformBlock( WriteDescriptorSetInlineUniformBlock const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    WriteDescriptorSetInlineUniformBlock( VkWriteDescriptorSetInlineUniformBlock const & rhs ) VULKAN_HPP_NOEXCEPT\n      : WriteDescriptorSetInlineUniformBlock( *reinterpret_cast<WriteDescriptorSetInlineUniformBlock const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    WriteDescriptorSetInlineUniformBlock( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & data_, const void * pNext_ = nullptr )\n      : pNext( pNext_ ), dataSize( static_cast<uint32_t>( data_.size() * sizeof( T ) ) ), pData( data_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    WriteDescriptorSetInlineUniformBlock & operator=( WriteDescriptorSetInlineUniformBlock const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    WriteDescriptorSetInlineUniformBlock & operator=( VkWriteDescriptorSetInlineUniformBlock const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::WriteDescriptorSetInlineUniformBlock const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 WriteDescriptorSetInlineUniformBlock & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 WriteDescriptorSetInlineUniformBlock & setDataSize( uint32_t dataSize_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dataSize = dataSize_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 WriteDescriptorSetInlineUniformBlock & setPData( const void * pData_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pData = pData_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    template <typename T>\n    WriteDescriptorSetInlineUniformBlock & setData( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & data_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dataSize = static_cast<uint32_t>( data_.size() * sizeof( T ) );\n      pData    = data_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkWriteDescriptorSetInlineUniformBlock const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkWriteDescriptorSetInlineUniformBlock *>( this );\n    }\n\n    operator VkWriteDescriptorSetInlineUniformBlock &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkWriteDescriptorSetInlineUniformBlock *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, const void * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, dataSize, pData );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( WriteDescriptorSetInlineUniformBlock const & ) const = default;\n#else\n    bool operator==( WriteDescriptorSetInlineUniformBlock const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( dataSize == rhs.dataSize ) && ( pData == rhs.pData );\n#  endif\n    }\n\n    bool operator!=( WriteDescriptorSetInlineUniformBlock const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType    = StructureType::eWriteDescriptorSetInlineUniformBlock;\n    const void *                        pNext    = {};\n    uint32_t                            dataSize = {};\n    const void *                        pData    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eWriteDescriptorSetInlineUniformBlock>\n  {\n    using Type = WriteDescriptorSetInlineUniformBlock;\n  };\n\n  using WriteDescriptorSetInlineUniformBlockEXT = WriteDescriptorSetInlineUniformBlock;\n\n  struct WriteDescriptorSetPartitionedAccelerationStructureNV\n  {\n    using NativeType = VkWriteDescriptorSetPartitionedAccelerationStructureNV;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eWriteDescriptorSetPartitionedAccelerationStructureNV;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR WriteDescriptorSetPartitionedAccelerationStructureNV( uint32_t                                    accelerationStructureCount_ = {},\n                                                                               const VULKAN_HPP_NAMESPACE::DeviceAddress * pAccelerationStructures_    = {},\n                                                                               void * pNext_ = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , accelerationStructureCount{ accelerationStructureCount_ }\n      , pAccelerationStructures{ pAccelerationStructures_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR\n      WriteDescriptorSetPartitionedAccelerationStructureNV( WriteDescriptorSetPartitionedAccelerationStructureNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    WriteDescriptorSetPartitionedAccelerationStructureNV( VkWriteDescriptorSetPartitionedAccelerationStructureNV const & rhs ) VULKAN_HPP_NOEXCEPT\n      : WriteDescriptorSetPartitionedAccelerationStructureNV( *reinterpret_cast<WriteDescriptorSetPartitionedAccelerationStructureNV const *>( &rhs ) )\n    {\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    WriteDescriptorSetPartitionedAccelerationStructureNV(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DeviceAddress> const & accelerationStructures_, void * pNext_ = nullptr )\n      : pNext( pNext_ )\n      , accelerationStructureCount( static_cast<uint32_t>( accelerationStructures_.size() ) )\n      , pAccelerationStructures( accelerationStructures_.data() )\n    {\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n\n    WriteDescriptorSetPartitionedAccelerationStructureNV &\n      operator=( WriteDescriptorSetPartitionedAccelerationStructureNV const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    WriteDescriptorSetPartitionedAccelerationStructureNV & operator=( VkWriteDescriptorSetPartitionedAccelerationStructureNV const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::WriteDescriptorSetPartitionedAccelerationStructureNV const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 WriteDescriptorSetPartitionedAccelerationStructureNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 WriteDescriptorSetPartitionedAccelerationStructureNV &\n      setAccelerationStructureCount( uint32_t accelerationStructureCount_ ) VULKAN_HPP_NOEXCEPT\n    {\n      accelerationStructureCount = accelerationStructureCount_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 WriteDescriptorSetPartitionedAccelerationStructureNV &\n      setPAccelerationStructures( const VULKAN_HPP_NAMESPACE::DeviceAddress * pAccelerationStructures_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pAccelerationStructures = pAccelerationStructures_;\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )\n    WriteDescriptorSetPartitionedAccelerationStructureNV & setAccelerationStructures(\n      VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DeviceAddress> const & accelerationStructures_ ) VULKAN_HPP_NOEXCEPT\n    {\n      accelerationStructureCount = static_cast<uint32_t>( accelerationStructures_.size() );\n      pAccelerationStructures    = accelerationStructures_.data();\n      return *this;\n    }\n#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/\n#endif   /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkWriteDescriptorSetPartitionedAccelerationStructureNV const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkWriteDescriptorSetPartitionedAccelerationStructureNV *>( this );\n    }\n\n    operator VkWriteDescriptorSetPartitionedAccelerationStructureNV &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkWriteDescriptorSetPartitionedAccelerationStructureNV *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, void * const &, uint32_t const &, const VULKAN_HPP_NAMESPACE::DeviceAddress * const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, accelerationStructureCount, pAccelerationStructures );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( WriteDescriptorSetPartitionedAccelerationStructureNV const & ) const = default;\n#else\n    bool operator==( WriteDescriptorSetPartitionedAccelerationStructureNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( accelerationStructureCount == rhs.accelerationStructureCount ) &&\n             ( pAccelerationStructures == rhs.pAccelerationStructures );\n#  endif\n    }\n\n    bool operator!=( WriteDescriptorSetPartitionedAccelerationStructureNV const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType         sType                      = StructureType::eWriteDescriptorSetPartitionedAccelerationStructureNV;\n    void *                                      pNext                      = {};\n    uint32_t                                    accelerationStructureCount = {};\n    const VULKAN_HPP_NAMESPACE::DeviceAddress * pAccelerationStructures    = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eWriteDescriptorSetPartitionedAccelerationStructureNV>\n  {\n    using Type = WriteDescriptorSetPartitionedAccelerationStructureNV;\n  };\n\n  struct WriteIndirectExecutionSetPipelineEXT\n  {\n    using NativeType = VkWriteIndirectExecutionSetPipelineEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eWriteIndirectExecutionSetPipelineEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR WriteIndirectExecutionSetPipelineEXT( uint32_t                       index_    = {},\n                                                               VULKAN_HPP_NAMESPACE::Pipeline pipeline_ = {},\n                                                               const void *                   pNext_    = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , index{ index_ }\n      , pipeline{ pipeline_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR WriteIndirectExecutionSetPipelineEXT( WriteIndirectExecutionSetPipelineEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    WriteIndirectExecutionSetPipelineEXT( VkWriteIndirectExecutionSetPipelineEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : WriteIndirectExecutionSetPipelineEXT( *reinterpret_cast<WriteIndirectExecutionSetPipelineEXT const *>( &rhs ) )\n    {\n    }\n\n    WriteIndirectExecutionSetPipelineEXT & operator=( WriteIndirectExecutionSetPipelineEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    WriteIndirectExecutionSetPipelineEXT & operator=( VkWriteIndirectExecutionSetPipelineEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetPipelineEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 WriteIndirectExecutionSetPipelineEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 WriteIndirectExecutionSetPipelineEXT & setIndex( uint32_t index_ ) VULKAN_HPP_NOEXCEPT\n    {\n      index = index_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 WriteIndirectExecutionSetPipelineEXT & setPipeline( VULKAN_HPP_NAMESPACE::Pipeline pipeline_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pipeline = pipeline_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkWriteIndirectExecutionSetPipelineEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkWriteIndirectExecutionSetPipelineEXT *>( this );\n    }\n\n    operator VkWriteIndirectExecutionSetPipelineEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkWriteIndirectExecutionSetPipelineEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, VULKAN_HPP_NAMESPACE::Pipeline const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, index, pipeline );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( WriteIndirectExecutionSetPipelineEXT const & ) const = default;\n#else\n    bool operator==( WriteIndirectExecutionSetPipelineEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( index == rhs.index ) && ( pipeline == rhs.pipeline );\n#  endif\n    }\n\n    bool operator!=( WriteIndirectExecutionSetPipelineEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType    = StructureType::eWriteIndirectExecutionSetPipelineEXT;\n    const void *                        pNext    = {};\n    uint32_t                            index    = {};\n    VULKAN_HPP_NAMESPACE::Pipeline      pipeline = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eWriteIndirectExecutionSetPipelineEXT>\n  {\n    using Type = WriteIndirectExecutionSetPipelineEXT;\n  };\n\n  struct WriteIndirectExecutionSetShaderEXT\n  {\n    using NativeType = VkWriteIndirectExecutionSetShaderEXT;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eWriteIndirectExecutionSetShaderEXT;\n\n#if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR WriteIndirectExecutionSetShaderEXT( uint32_t                        index_  = {},\n                                                             VULKAN_HPP_NAMESPACE::ShaderEXT shader_ = {},\n                                                             const void *                    pNext_  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , index{ index_ }\n      , shader{ shader_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR WriteIndirectExecutionSetShaderEXT( WriteIndirectExecutionSetShaderEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    WriteIndirectExecutionSetShaderEXT( VkWriteIndirectExecutionSetShaderEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n      : WriteIndirectExecutionSetShaderEXT( *reinterpret_cast<WriteIndirectExecutionSetShaderEXT const *>( &rhs ) )\n    {\n    }\n\n    WriteIndirectExecutionSetShaderEXT & operator=( WriteIndirectExecutionSetShaderEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    WriteIndirectExecutionSetShaderEXT & operator=( VkWriteIndirectExecutionSetShaderEXT const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::WriteIndirectExecutionSetShaderEXT const *>( &rhs );\n      return *this;\n    }\n\n#if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 WriteIndirectExecutionSetShaderEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 WriteIndirectExecutionSetShaderEXT & setIndex( uint32_t index_ ) VULKAN_HPP_NOEXCEPT\n    {\n      index = index_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 WriteIndirectExecutionSetShaderEXT & setShader( VULKAN_HPP_NAMESPACE::ShaderEXT shader_ ) VULKAN_HPP_NOEXCEPT\n    {\n      shader = shader_;\n      return *this;\n    }\n#endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkWriteIndirectExecutionSetShaderEXT const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkWriteIndirectExecutionSetShaderEXT *>( this );\n    }\n\n    operator VkWriteIndirectExecutionSetShaderEXT &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkWriteIndirectExecutionSetShaderEXT *>( this );\n    }\n\n#if defined( VULKAN_HPP_USE_REFLECT )\n#  if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#  else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &, const void * const &, uint32_t const &, VULKAN_HPP_NAMESPACE::ShaderEXT const &>\n#  endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, index, shader );\n    }\n#endif\n\n#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    auto operator<=>( WriteIndirectExecutionSetShaderEXT const & ) const = default;\n#else\n    bool operator==( WriteIndirectExecutionSetShaderEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n#  if defined( VULKAN_HPP_USE_REFLECT )\n      return this->reflect() == rhs.reflect();\n#  else\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( index == rhs.index ) && ( shader == rhs.shader );\n#  endif\n    }\n\n    bool operator!=( WriteIndirectExecutionSetShaderEXT const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n#endif\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType sType  = StructureType::eWriteIndirectExecutionSetShaderEXT;\n    const void *                        pNext  = {};\n    uint32_t                            index  = {};\n    VULKAN_HPP_NAMESPACE::ShaderEXT     shader = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eWriteIndirectExecutionSetShaderEXT>\n  {\n    using Type = WriteIndirectExecutionSetShaderEXT;\n  };\n\n#if defined( VK_USE_PLATFORM_XCB_KHR )\n  struct XcbSurfaceCreateInfoKHR\n  {\n    using NativeType = VkXcbSurfaceCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eXcbSurfaceCreateInfoKHR;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR XcbSurfaceCreateInfoKHR( VULKAN_HPP_NAMESPACE::XcbSurfaceCreateFlagsKHR flags_      = {},\n                                                  xcb_connection_t *                             connection_ = {},\n                                                  xcb_window_t                                   window_     = {},\n                                                  const void *                                   pNext_      = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , connection{ connection_ }\n      , window{ window_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR XcbSurfaceCreateInfoKHR( XcbSurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    XcbSurfaceCreateInfoKHR( VkXcbSurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : XcbSurfaceCreateInfoKHR( *reinterpret_cast<XcbSurfaceCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    XcbSurfaceCreateInfoKHR & operator=( XcbSurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    XcbSurfaceCreateInfoKHR & operator=( VkXcbSurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::XcbSurfaceCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 XcbSurfaceCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 XcbSurfaceCreateInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::XcbSurfaceCreateFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 XcbSurfaceCreateInfoKHR & setConnection( xcb_connection_t * connection_ ) VULKAN_HPP_NOEXCEPT\n    {\n      connection = connection_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 XcbSurfaceCreateInfoKHR & setWindow( xcb_window_t window_ ) VULKAN_HPP_NOEXCEPT\n    {\n      window = window_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkXcbSurfaceCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkXcbSurfaceCreateInfoKHR *>( this );\n    }\n\n    operator VkXcbSurfaceCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkXcbSurfaceCreateInfoKHR *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::XcbSurfaceCreateFlagsKHR const &,\n               xcb_connection_t * const &,\n               xcb_window_t const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, connection, window );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( XcbSurfaceCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = flags <=> rhs.flags; cmp != 0 )\n        return cmp;\n      if ( auto cmp = connection <=> rhs.connection; cmp != 0 )\n        return cmp;\n      if ( auto cmp = memcmp( &window, &rhs.window, sizeof( xcb_window_t ) ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#  endif\n\n    bool operator==( XcbSurfaceCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( connection == rhs.connection ) &&\n             ( memcmp( &window, &rhs.window, sizeof( xcb_window_t ) ) == 0 );\n    }\n\n    bool operator!=( XcbSurfaceCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType            sType      = StructureType::eXcbSurfaceCreateInfoKHR;\n    const void *                                   pNext      = {};\n    VULKAN_HPP_NAMESPACE::XcbSurfaceCreateFlagsKHR flags      = {};\n    xcb_connection_t *                             connection = {};\n    xcb_window_t                                   window     = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eXcbSurfaceCreateInfoKHR>\n  {\n    using Type = XcbSurfaceCreateInfoKHR;\n  };\n#endif /*VK_USE_PLATFORM_XCB_KHR*/\n\n#if defined( VK_USE_PLATFORM_XLIB_KHR )\n  struct XlibSurfaceCreateInfoKHR\n  {\n    using NativeType = VkXlibSurfaceCreateInfoKHR;\n\n    static const bool                                  allowDuplicate = false;\n    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType  = StructureType::eXlibSurfaceCreateInfoKHR;\n\n#  if !defined( VULKAN_HPP_NO_CONSTRUCTORS ) && !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )\n    VULKAN_HPP_CONSTEXPR XlibSurfaceCreateInfoKHR( VULKAN_HPP_NAMESPACE::XlibSurfaceCreateFlagsKHR flags_  = {},\n                                                   Display *                                       dpy_    = {},\n                                                   Window                                          window_ = {},\n                                                   const void *                                    pNext_  = nullptr ) VULKAN_HPP_NOEXCEPT\n      : pNext{ pNext_ }\n      , flags{ flags_ }\n      , dpy{ dpy_ }\n      , window{ window_ }\n    {\n    }\n\n    VULKAN_HPP_CONSTEXPR XlibSurfaceCreateInfoKHR( XlibSurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n\n    XlibSurfaceCreateInfoKHR( VkXlibSurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n      : XlibSurfaceCreateInfoKHR( *reinterpret_cast<XlibSurfaceCreateInfoKHR const *>( &rhs ) )\n    {\n    }\n\n    XlibSurfaceCreateInfoKHR & operator=( XlibSurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;\n#  endif /*VULKAN_HPP_NO_CONSTRUCTORS*/\n\n    XlibSurfaceCreateInfoKHR & operator=( VkXlibSurfaceCreateInfoKHR const & rhs ) VULKAN_HPP_NOEXCEPT\n    {\n      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::XlibSurfaceCreateInfoKHR const *>( &rhs );\n      return *this;\n    }\n\n#  if !defined( VULKAN_HPP_NO_SETTERS ) && !defined( VULKAN_HPP_NO_STRUCT_SETTERS )\n    VULKAN_HPP_CONSTEXPR_14 XlibSurfaceCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT\n    {\n      pNext = pNext_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 XlibSurfaceCreateInfoKHR & setFlags( VULKAN_HPP_NAMESPACE::XlibSurfaceCreateFlagsKHR flags_ ) VULKAN_HPP_NOEXCEPT\n    {\n      flags = flags_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 XlibSurfaceCreateInfoKHR & setDpy( Display * dpy_ ) VULKAN_HPP_NOEXCEPT\n    {\n      dpy = dpy_;\n      return *this;\n    }\n\n    VULKAN_HPP_CONSTEXPR_14 XlibSurfaceCreateInfoKHR & setWindow( Window window_ ) VULKAN_HPP_NOEXCEPT\n    {\n      window = window_;\n      return *this;\n    }\n#  endif /*VULKAN_HPP_NO_SETTERS*/\n\n    operator VkXlibSurfaceCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<const VkXlibSurfaceCreateInfoKHR *>( this );\n    }\n\n    operator VkXlibSurfaceCreateInfoKHR &() VULKAN_HPP_NOEXCEPT\n    {\n      return *reinterpret_cast<VkXlibSurfaceCreateInfoKHR *>( this );\n    }\n\n#  if defined( VULKAN_HPP_USE_REFLECT )\n#    if 14 <= VULKAN_HPP_CPP_VERSION\n    auto\n#    else\n    std::tuple<VULKAN_HPP_NAMESPACE::StructureType const &,\n               const void * const &,\n               VULKAN_HPP_NAMESPACE::XlibSurfaceCreateFlagsKHR const &,\n               Display * const &,\n               Window const &>\n#    endif\n      reflect() const VULKAN_HPP_NOEXCEPT\n    {\n      return std::tie( sType, pNext, flags, dpy, window );\n    }\n#  endif\n\n#  if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )\n    std::strong_ordering operator<=>( XlibSurfaceCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      if ( auto cmp = sType <=> rhs.sType; cmp != 0 )\n        return cmp;\n      if ( auto cmp = pNext <=> rhs.pNext; cmp != 0 )\n        return cmp;\n      if ( auto cmp = flags <=> rhs.flags; cmp != 0 )\n        return cmp;\n      if ( auto cmp = dpy <=> rhs.dpy; cmp != 0 )\n        return cmp;\n      if ( auto cmp = memcmp( &window, &rhs.window, sizeof( Window ) ); cmp != 0 )\n        return ( cmp < 0 ) ? std::strong_ordering::less : std::strong_ordering::greater;\n\n      return std::strong_ordering::equivalent;\n    }\n#  endif\n\n    bool operator==( XlibSurfaceCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( flags == rhs.flags ) && ( dpy == rhs.dpy ) &&\n             ( memcmp( &window, &rhs.window, sizeof( Window ) ) == 0 );\n    }\n\n    bool operator!=( XlibSurfaceCreateInfoKHR const & rhs ) const VULKAN_HPP_NOEXCEPT\n    {\n      return !operator==( rhs );\n    }\n\n  public:\n    VULKAN_HPP_NAMESPACE::StructureType             sType  = StructureType::eXlibSurfaceCreateInfoKHR;\n    const void *                                    pNext  = {};\n    VULKAN_HPP_NAMESPACE::XlibSurfaceCreateFlagsKHR flags  = {};\n    Display *                                       dpy    = {};\n    Window                                          window = {};\n  };\n\n  template <>\n  struct CppType<StructureType, StructureType::eXlibSurfaceCreateInfoKHR>\n  {\n    using Type = XlibSurfaceCreateInfoKHR;\n  };\n#endif /*VK_USE_PLATFORM_XLIB_KHR*/\n\n}  // namespace VULKAN_HPP_NAMESPACE\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_to_string.hpp",
    "content": "// Copyright 2015-2025 The Khronos Group Inc.\n//\n// SPDX-License-Identifier: Apache-2.0 OR MIT\n//\n\n// This header is generated from the Khronos Vulkan XML API Registry.\n\n#ifndef VULKAN_TO_STRING_HPP\n#define VULKAN_TO_STRING_HPP\n\n#include <vulkan/vulkan.hpp>\n\n// ignore warnings on using deprecated enum values in this header\n#if defined( __clang__ ) || defined( __GNUC__ )\n#  pragma GCC diagnostic push\n#  pragma GCC diagnostic ignored \"-Wdeprecated-declarations\"\n#elif defined( _MSC_VER )\n#  pragma warning( push )\n#  pragma warning( disable : 4996 )\n#endif\n\n#if defined( VULKAN_HPP_ENABLE_STD_MODULE ) && defined( VULKAN_HPP_STD_MODULE )\nimport VULKAN_HPP_STD_MODULE;\n#else\n#  if __cpp_lib_format\n#    include <format>  // std::format\n#  else\n#    include <sstream>  // std::stringstream\n#  endif\n#endif\n\nnamespace VULKAN_HPP_NAMESPACE\n{\n\n  //==========================\n  //=== BITMASKs to_string ===\n  //==========================\n\n  //=== VK_VERSION_1_0 ===\n\n  VULKAN_HPP_INLINE std::string to_string( FormatFeatureFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & FormatFeatureFlagBits::eSampledImage )\n      result += \"SampledImage | \";\n    if ( value & FormatFeatureFlagBits::eStorageImage )\n      result += \"StorageImage | \";\n    if ( value & FormatFeatureFlagBits::eStorageImageAtomic )\n      result += \"StorageImageAtomic | \";\n    if ( value & FormatFeatureFlagBits::eUniformTexelBuffer )\n      result += \"UniformTexelBuffer | \";\n    if ( value & FormatFeatureFlagBits::eStorageTexelBuffer )\n      result += \"StorageTexelBuffer | \";\n    if ( value & FormatFeatureFlagBits::eStorageTexelBufferAtomic )\n      result += \"StorageTexelBufferAtomic | \";\n    if ( value & FormatFeatureFlagBits::eVertexBuffer )\n      result += \"VertexBuffer | \";\n    if ( value & FormatFeatureFlagBits::eColorAttachment )\n      result += \"ColorAttachment | \";\n    if ( value & FormatFeatureFlagBits::eColorAttachmentBlend )\n      result += \"ColorAttachmentBlend | \";\n    if ( value & FormatFeatureFlagBits::eDepthStencilAttachment )\n      result += \"DepthStencilAttachment | \";\n    if ( value & FormatFeatureFlagBits::eBlitSrc )\n      result += \"BlitSrc | \";\n    if ( value & FormatFeatureFlagBits::eBlitDst )\n      result += \"BlitDst | \";\n    if ( value & FormatFeatureFlagBits::eSampledImageFilterLinear )\n      result += \"SampledImageFilterLinear | \";\n    if ( value & FormatFeatureFlagBits::eTransferSrc )\n      result += \"TransferSrc | \";\n    if ( value & FormatFeatureFlagBits::eTransferDst )\n      result += \"TransferDst | \";\n    if ( value & FormatFeatureFlagBits::eMidpointChromaSamples )\n      result += \"MidpointChromaSamples | \";\n    if ( value & FormatFeatureFlagBits::eSampledImageYcbcrConversionLinearFilter )\n      result += \"SampledImageYcbcrConversionLinearFilter | \";\n    if ( value & FormatFeatureFlagBits::eSampledImageYcbcrConversionSeparateReconstructionFilter )\n      result += \"SampledImageYcbcrConversionSeparateReconstructionFilter | \";\n    if ( value & FormatFeatureFlagBits::eSampledImageYcbcrConversionChromaReconstructionExplicit )\n      result += \"SampledImageYcbcrConversionChromaReconstructionExplicit | \";\n    if ( value & FormatFeatureFlagBits::eSampledImageYcbcrConversionChromaReconstructionExplicitForceable )\n      result += \"SampledImageYcbcrConversionChromaReconstructionExplicitForceable | \";\n    if ( value & FormatFeatureFlagBits::eDisjoint )\n      result += \"Disjoint | \";\n    if ( value & FormatFeatureFlagBits::eCositedChromaSamples )\n      result += \"CositedChromaSamples | \";\n    if ( value & FormatFeatureFlagBits::eSampledImageFilterMinmax )\n      result += \"SampledImageFilterMinmax | \";\n    if ( value & FormatFeatureFlagBits::eVideoDecodeOutputKHR )\n      result += \"VideoDecodeOutputKHR | \";\n    if ( value & FormatFeatureFlagBits::eVideoDecodeDpbKHR )\n      result += \"VideoDecodeDpbKHR | \";\n    if ( value & FormatFeatureFlagBits::eAccelerationStructureVertexBufferKHR )\n      result += \"AccelerationStructureVertexBufferKHR | \";\n    if ( value & FormatFeatureFlagBits::eSampledImageFilterCubicEXT )\n      result += \"SampledImageFilterCubicEXT | \";\n    if ( value & FormatFeatureFlagBits::eFragmentDensityMapEXT )\n      result += \"FragmentDensityMapEXT | \";\n    if ( value & FormatFeatureFlagBits::eFragmentShadingRateAttachmentKHR )\n      result += \"FragmentShadingRateAttachmentKHR | \";\n    if ( value & FormatFeatureFlagBits::eVideoEncodeInputKHR )\n      result += \"VideoEncodeInputKHR | \";\n    if ( value & FormatFeatureFlagBits::eVideoEncodeDpbKHR )\n      result += \"VideoEncodeDpbKHR | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ImageCreateFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & ImageCreateFlagBits::eSparseBinding )\n      result += \"SparseBinding | \";\n    if ( value & ImageCreateFlagBits::eSparseResidency )\n      result += \"SparseResidency | \";\n    if ( value & ImageCreateFlagBits::eSparseAliased )\n      result += \"SparseAliased | \";\n    if ( value & ImageCreateFlagBits::eMutableFormat )\n      result += \"MutableFormat | \";\n    if ( value & ImageCreateFlagBits::eCubeCompatible )\n      result += \"CubeCompatible | \";\n    if ( value & ImageCreateFlagBits::eAlias )\n      result += \"Alias | \";\n    if ( value & ImageCreateFlagBits::eSplitInstanceBindRegions )\n      result += \"SplitInstanceBindRegions | \";\n    if ( value & ImageCreateFlagBits::e2DArrayCompatible )\n      result += \"2DArrayCompatible | \";\n    if ( value & ImageCreateFlagBits::eBlockTexelViewCompatible )\n      result += \"BlockTexelViewCompatible | \";\n    if ( value & ImageCreateFlagBits::eExtendedUsage )\n      result += \"ExtendedUsage | \";\n    if ( value & ImageCreateFlagBits::eProtected )\n      result += \"Protected | \";\n    if ( value & ImageCreateFlagBits::eDisjoint )\n      result += \"Disjoint | \";\n    if ( value & ImageCreateFlagBits::eCornerSampledNV )\n      result += \"CornerSampledNV | \";\n    if ( value & ImageCreateFlagBits::eSampleLocationsCompatibleDepthEXT )\n      result += \"SampleLocationsCompatibleDepthEXT | \";\n    if ( value & ImageCreateFlagBits::eSubsampledEXT )\n      result += \"SubsampledEXT | \";\n    if ( value & ImageCreateFlagBits::eDescriptorBufferCaptureReplayEXT )\n      result += \"DescriptorBufferCaptureReplayEXT | \";\n    if ( value & ImageCreateFlagBits::eMultisampledRenderToSingleSampledEXT )\n      result += \"MultisampledRenderToSingleSampledEXT | \";\n    if ( value & ImageCreateFlagBits::e2DViewCompatibleEXT )\n      result += \"2DViewCompatibleEXT | \";\n    if ( value & ImageCreateFlagBits::eFragmentDensityMapOffsetQCOM )\n      result += \"FragmentDensityMapOffsetQCOM | \";\n    if ( value & ImageCreateFlagBits::eVideoProfileIndependentKHR )\n      result += \"VideoProfileIndependentKHR | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ImageUsageFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & ImageUsageFlagBits::eTransferSrc )\n      result += \"TransferSrc | \";\n    if ( value & ImageUsageFlagBits::eTransferDst )\n      result += \"TransferDst | \";\n    if ( value & ImageUsageFlagBits::eSampled )\n      result += \"Sampled | \";\n    if ( value & ImageUsageFlagBits::eStorage )\n      result += \"Storage | \";\n    if ( value & ImageUsageFlagBits::eColorAttachment )\n      result += \"ColorAttachment | \";\n    if ( value & ImageUsageFlagBits::eDepthStencilAttachment )\n      result += \"DepthStencilAttachment | \";\n    if ( value & ImageUsageFlagBits::eTransientAttachment )\n      result += \"TransientAttachment | \";\n    if ( value & ImageUsageFlagBits::eInputAttachment )\n      result += \"InputAttachment | \";\n    if ( value & ImageUsageFlagBits::eHostTransfer )\n      result += \"HostTransfer | \";\n    if ( value & ImageUsageFlagBits::eVideoDecodeDstKHR )\n      result += \"VideoDecodeDstKHR | \";\n    if ( value & ImageUsageFlagBits::eVideoDecodeSrcKHR )\n      result += \"VideoDecodeSrcKHR | \";\n    if ( value & ImageUsageFlagBits::eVideoDecodeDpbKHR )\n      result += \"VideoDecodeDpbKHR | \";\n    if ( value & ImageUsageFlagBits::eFragmentDensityMapEXT )\n      result += \"FragmentDensityMapEXT | \";\n    if ( value & ImageUsageFlagBits::eFragmentShadingRateAttachmentKHR )\n      result += \"FragmentShadingRateAttachmentKHR | \";\n    if ( value & ImageUsageFlagBits::eVideoEncodeDstKHR )\n      result += \"VideoEncodeDstKHR | \";\n    if ( value & ImageUsageFlagBits::eVideoEncodeSrcKHR )\n      result += \"VideoEncodeSrcKHR | \";\n    if ( value & ImageUsageFlagBits::eVideoEncodeDpbKHR )\n      result += \"VideoEncodeDpbKHR | \";\n    if ( value & ImageUsageFlagBits::eAttachmentFeedbackLoopEXT )\n      result += \"AttachmentFeedbackLoopEXT | \";\n    if ( value & ImageUsageFlagBits::eInvocationMaskHUAWEI )\n      result += \"InvocationMaskHUAWEI | \";\n    if ( value & ImageUsageFlagBits::eSampleWeightQCOM )\n      result += \"SampleWeightQCOM | \";\n    if ( value & ImageUsageFlagBits::eSampleBlockMatchQCOM )\n      result += \"SampleBlockMatchQCOM | \";\n    if ( value & ImageUsageFlagBits::eVideoEncodeQuantizationDeltaMapKHR )\n      result += \"VideoEncodeQuantizationDeltaMapKHR | \";\n    if ( value & ImageUsageFlagBits::eVideoEncodeEmphasisMapKHR )\n      result += \"VideoEncodeEmphasisMapKHR | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( InstanceCreateFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & InstanceCreateFlagBits::eEnumeratePortabilityKHR )\n      result += \"EnumeratePortabilityKHR | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( MemoryHeapFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & MemoryHeapFlagBits::eDeviceLocal )\n      result += \"DeviceLocal | \";\n    if ( value & MemoryHeapFlagBits::eMultiInstance )\n      result += \"MultiInstance | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( MemoryPropertyFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & MemoryPropertyFlagBits::eDeviceLocal )\n      result += \"DeviceLocal | \";\n    if ( value & MemoryPropertyFlagBits::eHostVisible )\n      result += \"HostVisible | \";\n    if ( value & MemoryPropertyFlagBits::eHostCoherent )\n      result += \"HostCoherent | \";\n    if ( value & MemoryPropertyFlagBits::eHostCached )\n      result += \"HostCached | \";\n    if ( value & MemoryPropertyFlagBits::eLazilyAllocated )\n      result += \"LazilyAllocated | \";\n    if ( value & MemoryPropertyFlagBits::eProtected )\n      result += \"Protected | \";\n    if ( value & MemoryPropertyFlagBits::eDeviceCoherentAMD )\n      result += \"DeviceCoherentAMD | \";\n    if ( value & MemoryPropertyFlagBits::eDeviceUncachedAMD )\n      result += \"DeviceUncachedAMD | \";\n    if ( value & MemoryPropertyFlagBits::eRdmaCapableNV )\n      result += \"RdmaCapableNV | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( QueueFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & QueueFlagBits::eGraphics )\n      result += \"Graphics | \";\n    if ( value & QueueFlagBits::eCompute )\n      result += \"Compute | \";\n    if ( value & QueueFlagBits::eTransfer )\n      result += \"Transfer | \";\n    if ( value & QueueFlagBits::eSparseBinding )\n      result += \"SparseBinding | \";\n    if ( value & QueueFlagBits::eProtected )\n      result += \"Protected | \";\n    if ( value & QueueFlagBits::eVideoDecodeKHR )\n      result += \"VideoDecodeKHR | \";\n    if ( value & QueueFlagBits::eVideoEncodeKHR )\n      result += \"VideoEncodeKHR | \";\n    if ( value & QueueFlagBits::eOpticalFlowNV )\n      result += \"OpticalFlowNV | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SampleCountFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & SampleCountFlagBits::e1 )\n      result += \"1 | \";\n    if ( value & SampleCountFlagBits::e2 )\n      result += \"2 | \";\n    if ( value & SampleCountFlagBits::e4 )\n      result += \"4 | \";\n    if ( value & SampleCountFlagBits::e8 )\n      result += \"8 | \";\n    if ( value & SampleCountFlagBits::e16 )\n      result += \"16 | \";\n    if ( value & SampleCountFlagBits::e32 )\n      result += \"32 | \";\n    if ( value & SampleCountFlagBits::e64 )\n      result += \"64 | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DeviceCreateFlags )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DeviceQueueCreateFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & DeviceQueueCreateFlagBits::eProtected )\n      result += \"Protected | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineStageFlags value )\n  {\n    if ( !value )\n      return \"None\";\n\n    std::string result;\n    if ( value & PipelineStageFlagBits::eTopOfPipe )\n      result += \"TopOfPipe | \";\n    if ( value & PipelineStageFlagBits::eDrawIndirect )\n      result += \"DrawIndirect | \";\n    if ( value & PipelineStageFlagBits::eVertexInput )\n      result += \"VertexInput | \";\n    if ( value & PipelineStageFlagBits::eVertexShader )\n      result += \"VertexShader | \";\n    if ( value & PipelineStageFlagBits::eTessellationControlShader )\n      result += \"TessellationControlShader | \";\n    if ( value & PipelineStageFlagBits::eTessellationEvaluationShader )\n      result += \"TessellationEvaluationShader | \";\n    if ( value & PipelineStageFlagBits::eGeometryShader )\n      result += \"GeometryShader | \";\n    if ( value & PipelineStageFlagBits::eFragmentShader )\n      result += \"FragmentShader | \";\n    if ( value & PipelineStageFlagBits::eEarlyFragmentTests )\n      result += \"EarlyFragmentTests | \";\n    if ( value & PipelineStageFlagBits::eLateFragmentTests )\n      result += \"LateFragmentTests | \";\n    if ( value & PipelineStageFlagBits::eColorAttachmentOutput )\n      result += \"ColorAttachmentOutput | \";\n    if ( value & PipelineStageFlagBits::eComputeShader )\n      result += \"ComputeShader | \";\n    if ( value & PipelineStageFlagBits::eTransfer )\n      result += \"Transfer | \";\n    if ( value & PipelineStageFlagBits::eBottomOfPipe )\n      result += \"BottomOfPipe | \";\n    if ( value & PipelineStageFlagBits::eHost )\n      result += \"Host | \";\n    if ( value & PipelineStageFlagBits::eAllGraphics )\n      result += \"AllGraphics | \";\n    if ( value & PipelineStageFlagBits::eAllCommands )\n      result += \"AllCommands | \";\n    if ( value & PipelineStageFlagBits::eTransformFeedbackEXT )\n      result += \"TransformFeedbackEXT | \";\n    if ( value & PipelineStageFlagBits::eConditionalRenderingEXT )\n      result += \"ConditionalRenderingEXT | \";\n    if ( value & PipelineStageFlagBits::eAccelerationStructureBuildKHR )\n      result += \"AccelerationStructureBuildKHR | \";\n    if ( value & PipelineStageFlagBits::eRayTracingShaderKHR )\n      result += \"RayTracingShaderKHR | \";\n    if ( value & PipelineStageFlagBits::eFragmentDensityProcessEXT )\n      result += \"FragmentDensityProcessEXT | \";\n    if ( value & PipelineStageFlagBits::eFragmentShadingRateAttachmentKHR )\n      result += \"FragmentShadingRateAttachmentKHR | \";\n    if ( value & PipelineStageFlagBits::eCommandPreprocessNV )\n      result += \"CommandPreprocessNV | \";\n    if ( value & PipelineStageFlagBits::eTaskShaderEXT )\n      result += \"TaskShaderEXT | \";\n    if ( value & PipelineStageFlagBits::eMeshShaderEXT )\n      result += \"MeshShaderEXT | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( MemoryMapFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & MemoryMapFlagBits::ePlacedEXT )\n      result += \"PlacedEXT | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ImageAspectFlags value )\n  {\n    if ( !value )\n      return \"None\";\n\n    std::string result;\n    if ( value & ImageAspectFlagBits::eColor )\n      result += \"Color | \";\n    if ( value & ImageAspectFlagBits::eDepth )\n      result += \"Depth | \";\n    if ( value & ImageAspectFlagBits::eStencil )\n      result += \"Stencil | \";\n    if ( value & ImageAspectFlagBits::eMetadata )\n      result += \"Metadata | \";\n    if ( value & ImageAspectFlagBits::ePlane0 )\n      result += \"Plane0 | \";\n    if ( value & ImageAspectFlagBits::ePlane1 )\n      result += \"Plane1 | \";\n    if ( value & ImageAspectFlagBits::ePlane2 )\n      result += \"Plane2 | \";\n    if ( value & ImageAspectFlagBits::eMemoryPlane0EXT )\n      result += \"MemoryPlane0EXT | \";\n    if ( value & ImageAspectFlagBits::eMemoryPlane1EXT )\n      result += \"MemoryPlane1EXT | \";\n    if ( value & ImageAspectFlagBits::eMemoryPlane2EXT )\n      result += \"MemoryPlane2EXT | \";\n    if ( value & ImageAspectFlagBits::eMemoryPlane3EXT )\n      result += \"MemoryPlane3EXT | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SparseImageFormatFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & SparseImageFormatFlagBits::eSingleMiptail )\n      result += \"SingleMiptail | \";\n    if ( value & SparseImageFormatFlagBits::eAlignedMipSize )\n      result += \"AlignedMipSize | \";\n    if ( value & SparseImageFormatFlagBits::eNonstandardBlockSize )\n      result += \"NonstandardBlockSize | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SparseMemoryBindFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & SparseMemoryBindFlagBits::eMetadata )\n      result += \"Metadata | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( FenceCreateFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & FenceCreateFlagBits::eSignaled )\n      result += \"Signaled | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SemaphoreCreateFlags )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( EventCreateFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & EventCreateFlagBits::eDeviceOnly )\n      result += \"DeviceOnly | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( QueryPipelineStatisticFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & QueryPipelineStatisticFlagBits::eInputAssemblyVertices )\n      result += \"InputAssemblyVertices | \";\n    if ( value & QueryPipelineStatisticFlagBits::eInputAssemblyPrimitives )\n      result += \"InputAssemblyPrimitives | \";\n    if ( value & QueryPipelineStatisticFlagBits::eVertexShaderInvocations )\n      result += \"VertexShaderInvocations | \";\n    if ( value & QueryPipelineStatisticFlagBits::eGeometryShaderInvocations )\n      result += \"GeometryShaderInvocations | \";\n    if ( value & QueryPipelineStatisticFlagBits::eGeometryShaderPrimitives )\n      result += \"GeometryShaderPrimitives | \";\n    if ( value & QueryPipelineStatisticFlagBits::eClippingInvocations )\n      result += \"ClippingInvocations | \";\n    if ( value & QueryPipelineStatisticFlagBits::eClippingPrimitives )\n      result += \"ClippingPrimitives | \";\n    if ( value & QueryPipelineStatisticFlagBits::eFragmentShaderInvocations )\n      result += \"FragmentShaderInvocations | \";\n    if ( value & QueryPipelineStatisticFlagBits::eTessellationControlShaderPatches )\n      result += \"TessellationControlShaderPatches | \";\n    if ( value & QueryPipelineStatisticFlagBits::eTessellationEvaluationShaderInvocations )\n      result += \"TessellationEvaluationShaderInvocations | \";\n    if ( value & QueryPipelineStatisticFlagBits::eComputeShaderInvocations )\n      result += \"ComputeShaderInvocations | \";\n    if ( value & QueryPipelineStatisticFlagBits::eTaskShaderInvocationsEXT )\n      result += \"TaskShaderInvocationsEXT | \";\n    if ( value & QueryPipelineStatisticFlagBits::eMeshShaderInvocationsEXT )\n      result += \"MeshShaderInvocationsEXT | \";\n    if ( value & QueryPipelineStatisticFlagBits::eClusterCullingShaderInvocationsHUAWEI )\n      result += \"ClusterCullingShaderInvocationsHUAWEI | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( QueryPoolCreateFlags )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( QueryResultFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & QueryResultFlagBits::e64 )\n      result += \"64 | \";\n    if ( value & QueryResultFlagBits::eWait )\n      result += \"Wait | \";\n    if ( value & QueryResultFlagBits::eWithAvailability )\n      result += \"WithAvailability | \";\n    if ( value & QueryResultFlagBits::ePartial )\n      result += \"Partial | \";\n    if ( value & QueryResultFlagBits::eWithStatusKHR )\n      result += \"WithStatusKHR | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( BufferCreateFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & BufferCreateFlagBits::eSparseBinding )\n      result += \"SparseBinding | \";\n    if ( value & BufferCreateFlagBits::eSparseResidency )\n      result += \"SparseResidency | \";\n    if ( value & BufferCreateFlagBits::eSparseAliased )\n      result += \"SparseAliased | \";\n    if ( value & BufferCreateFlagBits::eProtected )\n      result += \"Protected | \";\n    if ( value & BufferCreateFlagBits::eDeviceAddressCaptureReplay )\n      result += \"DeviceAddressCaptureReplay | \";\n    if ( value & BufferCreateFlagBits::eDescriptorBufferCaptureReplayEXT )\n      result += \"DescriptorBufferCaptureReplayEXT | \";\n    if ( value & BufferCreateFlagBits::eVideoProfileIndependentKHR )\n      result += \"VideoProfileIndependentKHR | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( BufferUsageFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & BufferUsageFlagBits::eTransferSrc )\n      result += \"TransferSrc | \";\n    if ( value & BufferUsageFlagBits::eTransferDst )\n      result += \"TransferDst | \";\n    if ( value & BufferUsageFlagBits::eUniformTexelBuffer )\n      result += \"UniformTexelBuffer | \";\n    if ( value & BufferUsageFlagBits::eStorageTexelBuffer )\n      result += \"StorageTexelBuffer | \";\n    if ( value & BufferUsageFlagBits::eUniformBuffer )\n      result += \"UniformBuffer | \";\n    if ( value & BufferUsageFlagBits::eStorageBuffer )\n      result += \"StorageBuffer | \";\n    if ( value & BufferUsageFlagBits::eIndexBuffer )\n      result += \"IndexBuffer | \";\n    if ( value & BufferUsageFlagBits::eVertexBuffer )\n      result += \"VertexBuffer | \";\n    if ( value & BufferUsageFlagBits::eIndirectBuffer )\n      result += \"IndirectBuffer | \";\n    if ( value & BufferUsageFlagBits::eShaderDeviceAddress )\n      result += \"ShaderDeviceAddress | \";\n    if ( value & BufferUsageFlagBits::eVideoDecodeSrcKHR )\n      result += \"VideoDecodeSrcKHR | \";\n    if ( value & BufferUsageFlagBits::eVideoDecodeDstKHR )\n      result += \"VideoDecodeDstKHR | \";\n    if ( value & BufferUsageFlagBits::eTransformFeedbackBufferEXT )\n      result += \"TransformFeedbackBufferEXT | \";\n    if ( value & BufferUsageFlagBits::eTransformFeedbackCounterBufferEXT )\n      result += \"TransformFeedbackCounterBufferEXT | \";\n    if ( value & BufferUsageFlagBits::eConditionalRenderingEXT )\n      result += \"ConditionalRenderingEXT | \";\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n    if ( value & BufferUsageFlagBits::eExecutionGraphScratchAMDX )\n      result += \"ExecutionGraphScratchAMDX | \";\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n    if ( value & BufferUsageFlagBits::eAccelerationStructureBuildInputReadOnlyKHR )\n      result += \"AccelerationStructureBuildInputReadOnlyKHR | \";\n    if ( value & BufferUsageFlagBits::eAccelerationStructureStorageKHR )\n      result += \"AccelerationStructureStorageKHR | \";\n    if ( value & BufferUsageFlagBits::eShaderBindingTableKHR )\n      result += \"ShaderBindingTableKHR | \";\n    if ( value & BufferUsageFlagBits::eVideoEncodeDstKHR )\n      result += \"VideoEncodeDstKHR | \";\n    if ( value & BufferUsageFlagBits::eVideoEncodeSrcKHR )\n      result += \"VideoEncodeSrcKHR | \";\n    if ( value & BufferUsageFlagBits::eSamplerDescriptorBufferEXT )\n      result += \"SamplerDescriptorBufferEXT | \";\n    if ( value & BufferUsageFlagBits::eResourceDescriptorBufferEXT )\n      result += \"ResourceDescriptorBufferEXT | \";\n    if ( value & BufferUsageFlagBits::ePushDescriptorsDescriptorBufferEXT )\n      result += \"PushDescriptorsDescriptorBufferEXT | \";\n    if ( value & BufferUsageFlagBits::eMicromapBuildInputReadOnlyEXT )\n      result += \"MicromapBuildInputReadOnlyEXT | \";\n    if ( value & BufferUsageFlagBits::eMicromapStorageEXT )\n      result += \"MicromapStorageEXT | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( BufferViewCreateFlags )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ImageViewCreateFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & ImageViewCreateFlagBits::eFragmentDensityMapDynamicEXT )\n      result += \"FragmentDensityMapDynamicEXT | \";\n    if ( value & ImageViewCreateFlagBits::eDescriptorBufferCaptureReplayEXT )\n      result += \"DescriptorBufferCaptureReplayEXT | \";\n    if ( value & ImageViewCreateFlagBits::eFragmentDensityMapDeferredEXT )\n      result += \"FragmentDensityMapDeferredEXT | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ShaderModuleCreateFlags )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineCacheCreateFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & PipelineCacheCreateFlagBits::eExternallySynchronized )\n      result += \"ExternallySynchronized | \";\n    if ( value & PipelineCacheCreateFlagBits::eInternallySynchronizedMergeKHR )\n      result += \"InternallySynchronizedMergeKHR | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ColorComponentFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & ColorComponentFlagBits::eR )\n      result += \"R | \";\n    if ( value & ColorComponentFlagBits::eG )\n      result += \"G | \";\n    if ( value & ColorComponentFlagBits::eB )\n      result += \"B | \";\n    if ( value & ColorComponentFlagBits::eA )\n      result += \"A | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( CullModeFlags value )\n  {\n    if ( !value )\n      return \"None\";\n\n    std::string result;\n    if ( value & CullModeFlagBits::eFront )\n      result += \"Front | \";\n    if ( value & CullModeFlagBits::eBack )\n      result += \"Back | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineColorBlendStateCreateFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & PipelineColorBlendStateCreateFlagBits::eRasterizationOrderAttachmentAccessEXT )\n      result += \"RasterizationOrderAttachmentAccessEXT | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineCreateFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & PipelineCreateFlagBits::eDisableOptimization )\n      result += \"DisableOptimization | \";\n    if ( value & PipelineCreateFlagBits::eAllowDerivatives )\n      result += \"AllowDerivatives | \";\n    if ( value & PipelineCreateFlagBits::eDerivative )\n      result += \"Derivative | \";\n    if ( value & PipelineCreateFlagBits::eViewIndexFromDeviceIndex )\n      result += \"ViewIndexFromDeviceIndex | \";\n    if ( value & PipelineCreateFlagBits::eDispatchBase )\n      result += \"DispatchBase | \";\n    if ( value & PipelineCreateFlagBits::eFailOnPipelineCompileRequired )\n      result += \"FailOnPipelineCompileRequired | \";\n    if ( value & PipelineCreateFlagBits::eEarlyReturnOnFailure )\n      result += \"EarlyReturnOnFailure | \";\n    if ( value & PipelineCreateFlagBits::eNoProtectedAccess )\n      result += \"NoProtectedAccess | \";\n    if ( value & PipelineCreateFlagBits::eProtectedAccessOnly )\n      result += \"ProtectedAccessOnly | \";\n    if ( value & PipelineCreateFlagBits::eRayTracingNoNullAnyHitShadersKHR )\n      result += \"RayTracingNoNullAnyHitShadersKHR | \";\n    if ( value & PipelineCreateFlagBits::eRayTracingNoNullClosestHitShadersKHR )\n      result += \"RayTracingNoNullClosestHitShadersKHR | \";\n    if ( value & PipelineCreateFlagBits::eRayTracingNoNullMissShadersKHR )\n      result += \"RayTracingNoNullMissShadersKHR | \";\n    if ( value & PipelineCreateFlagBits::eRayTracingNoNullIntersectionShadersKHR )\n      result += \"RayTracingNoNullIntersectionShadersKHR | \";\n    if ( value & PipelineCreateFlagBits::eRayTracingSkipTrianglesKHR )\n      result += \"RayTracingSkipTrianglesKHR | \";\n    if ( value & PipelineCreateFlagBits::eRayTracingSkipAabbsKHR )\n      result += \"RayTracingSkipAabbsKHR | \";\n    if ( value & PipelineCreateFlagBits::eRayTracingShaderGroupHandleCaptureReplayKHR )\n      result += \"RayTracingShaderGroupHandleCaptureReplayKHR | \";\n    if ( value & PipelineCreateFlagBits::eDeferCompileNV )\n      result += \"DeferCompileNV | \";\n    if ( value & PipelineCreateFlagBits::eRenderingFragmentDensityMapAttachmentEXT )\n      result += \"RenderingFragmentDensityMapAttachmentEXT | \";\n    if ( value & PipelineCreateFlagBits::eRenderingFragmentShadingRateAttachmentKHR )\n      result += \"RenderingFragmentShadingRateAttachmentKHR | \";\n    if ( value & PipelineCreateFlagBits::eCaptureStatisticsKHR )\n      result += \"CaptureStatisticsKHR | \";\n    if ( value & PipelineCreateFlagBits::eCaptureInternalRepresentationsKHR )\n      result += \"CaptureInternalRepresentationsKHR | \";\n    if ( value & PipelineCreateFlagBits::eIndirectBindableNV )\n      result += \"IndirectBindableNV | \";\n    if ( value & PipelineCreateFlagBits::eLibraryKHR )\n      result += \"LibraryKHR | \";\n    if ( value & PipelineCreateFlagBits::eDescriptorBufferEXT )\n      result += \"DescriptorBufferEXT | \";\n    if ( value & PipelineCreateFlagBits::eRetainLinkTimeOptimizationInfoEXT )\n      result += \"RetainLinkTimeOptimizationInfoEXT | \";\n    if ( value & PipelineCreateFlagBits::eLinkTimeOptimizationEXT )\n      result += \"LinkTimeOptimizationEXT | \";\n    if ( value & PipelineCreateFlagBits::eRayTracingAllowMotionNV )\n      result += \"RayTracingAllowMotionNV | \";\n    if ( value & PipelineCreateFlagBits::eColorAttachmentFeedbackLoopEXT )\n      result += \"ColorAttachmentFeedbackLoopEXT | \";\n    if ( value & PipelineCreateFlagBits::eDepthStencilAttachmentFeedbackLoopEXT )\n      result += \"DepthStencilAttachmentFeedbackLoopEXT | \";\n    if ( value & PipelineCreateFlagBits::eRayTracingOpacityMicromapEXT )\n      result += \"RayTracingOpacityMicromapEXT | \";\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n    if ( value & PipelineCreateFlagBits::eRayTracingDisplacementMicromapNV )\n      result += \"RayTracingDisplacementMicromapNV | \";\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineDepthStencilStateCreateFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & PipelineDepthStencilStateCreateFlagBits::eRasterizationOrderAttachmentDepthAccessEXT )\n      result += \"RasterizationOrderAttachmentDepthAccessEXT | \";\n    if ( value & PipelineDepthStencilStateCreateFlagBits::eRasterizationOrderAttachmentStencilAccessEXT )\n      result += \"RasterizationOrderAttachmentStencilAccessEXT | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineDynamicStateCreateFlags )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineInputAssemblyStateCreateFlags )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineLayoutCreateFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & PipelineLayoutCreateFlagBits::eIndependentSetsEXT )\n      result += \"IndependentSetsEXT | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineMultisampleStateCreateFlags )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineRasterizationStateCreateFlags )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineShaderStageCreateFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & PipelineShaderStageCreateFlagBits::eAllowVaryingSubgroupSize )\n      result += \"AllowVaryingSubgroupSize | \";\n    if ( value & PipelineShaderStageCreateFlagBits::eRequireFullSubgroups )\n      result += \"RequireFullSubgroups | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineTessellationStateCreateFlags )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineVertexInputStateCreateFlags )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineViewportStateCreateFlags )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ShaderStageFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & ShaderStageFlagBits::eVertex )\n      result += \"Vertex | \";\n    if ( value & ShaderStageFlagBits::eTessellationControl )\n      result += \"TessellationControl | \";\n    if ( value & ShaderStageFlagBits::eTessellationEvaluation )\n      result += \"TessellationEvaluation | \";\n    if ( value & ShaderStageFlagBits::eGeometry )\n      result += \"Geometry | \";\n    if ( value & ShaderStageFlagBits::eFragment )\n      result += \"Fragment | \";\n    if ( value & ShaderStageFlagBits::eCompute )\n      result += \"Compute | \";\n    if ( value & ShaderStageFlagBits::eRaygenKHR )\n      result += \"RaygenKHR | \";\n    if ( value & ShaderStageFlagBits::eAnyHitKHR )\n      result += \"AnyHitKHR | \";\n    if ( value & ShaderStageFlagBits::eClosestHitKHR )\n      result += \"ClosestHitKHR | \";\n    if ( value & ShaderStageFlagBits::eMissKHR )\n      result += \"MissKHR | \";\n    if ( value & ShaderStageFlagBits::eIntersectionKHR )\n      result += \"IntersectionKHR | \";\n    if ( value & ShaderStageFlagBits::eCallableKHR )\n      result += \"CallableKHR | \";\n    if ( value & ShaderStageFlagBits::eTaskEXT )\n      result += \"TaskEXT | \";\n    if ( value & ShaderStageFlagBits::eMeshEXT )\n      result += \"MeshEXT | \";\n    if ( value & ShaderStageFlagBits::eSubpassShadingHUAWEI )\n      result += \"SubpassShadingHUAWEI | \";\n    if ( value & ShaderStageFlagBits::eClusterCullingHUAWEI )\n      result += \"ClusterCullingHUAWEI | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SamplerCreateFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & SamplerCreateFlagBits::eSubsampledEXT )\n      result += \"SubsampledEXT | \";\n    if ( value & SamplerCreateFlagBits::eSubsampledCoarseReconstructionEXT )\n      result += \"SubsampledCoarseReconstructionEXT | \";\n    if ( value & SamplerCreateFlagBits::eDescriptorBufferCaptureReplayEXT )\n      result += \"DescriptorBufferCaptureReplayEXT | \";\n    if ( value & SamplerCreateFlagBits::eNonSeamlessCubeMapEXT )\n      result += \"NonSeamlessCubeMapEXT | \";\n    if ( value & SamplerCreateFlagBits::eImageProcessingQCOM )\n      result += \"ImageProcessingQCOM | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DescriptorPoolCreateFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & DescriptorPoolCreateFlagBits::eFreeDescriptorSet )\n      result += \"FreeDescriptorSet | \";\n    if ( value & DescriptorPoolCreateFlagBits::eUpdateAfterBind )\n      result += \"UpdateAfterBind | \";\n    if ( value & DescriptorPoolCreateFlagBits::eHostOnlyEXT )\n      result += \"HostOnlyEXT | \";\n    if ( value & DescriptorPoolCreateFlagBits::eAllowOverallocationSetsNV )\n      result += \"AllowOverallocationSetsNV | \";\n    if ( value & DescriptorPoolCreateFlagBits::eAllowOverallocationPoolsNV )\n      result += \"AllowOverallocationPoolsNV | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DescriptorPoolResetFlags )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DescriptorSetLayoutCreateFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & DescriptorSetLayoutCreateFlagBits::eUpdateAfterBindPool )\n      result += \"UpdateAfterBindPool | \";\n    if ( value & DescriptorSetLayoutCreateFlagBits::ePushDescriptor )\n      result += \"PushDescriptor | \";\n    if ( value & DescriptorSetLayoutCreateFlagBits::eDescriptorBufferEXT )\n      result += \"DescriptorBufferEXT | \";\n    if ( value & DescriptorSetLayoutCreateFlagBits::eEmbeddedImmutableSamplersEXT )\n      result += \"EmbeddedImmutableSamplersEXT | \";\n    if ( value & DescriptorSetLayoutCreateFlagBits::eIndirectBindableNV )\n      result += \"IndirectBindableNV | \";\n    if ( value & DescriptorSetLayoutCreateFlagBits::eHostOnlyPoolEXT )\n      result += \"HostOnlyPoolEXT | \";\n    if ( value & DescriptorSetLayoutCreateFlagBits::ePerStageNV )\n      result += \"PerStageNV | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( AccessFlags value )\n  {\n    if ( !value )\n      return \"None\";\n\n    std::string result;\n    if ( value & AccessFlagBits::eIndirectCommandRead )\n      result += \"IndirectCommandRead | \";\n    if ( value & AccessFlagBits::eIndexRead )\n      result += \"IndexRead | \";\n    if ( value & AccessFlagBits::eVertexAttributeRead )\n      result += \"VertexAttributeRead | \";\n    if ( value & AccessFlagBits::eUniformRead )\n      result += \"UniformRead | \";\n    if ( value & AccessFlagBits::eInputAttachmentRead )\n      result += \"InputAttachmentRead | \";\n    if ( value & AccessFlagBits::eShaderRead )\n      result += \"ShaderRead | \";\n    if ( value & AccessFlagBits::eShaderWrite )\n      result += \"ShaderWrite | \";\n    if ( value & AccessFlagBits::eColorAttachmentRead )\n      result += \"ColorAttachmentRead | \";\n    if ( value & AccessFlagBits::eColorAttachmentWrite )\n      result += \"ColorAttachmentWrite | \";\n    if ( value & AccessFlagBits::eDepthStencilAttachmentRead )\n      result += \"DepthStencilAttachmentRead | \";\n    if ( value & AccessFlagBits::eDepthStencilAttachmentWrite )\n      result += \"DepthStencilAttachmentWrite | \";\n    if ( value & AccessFlagBits::eTransferRead )\n      result += \"TransferRead | \";\n    if ( value & AccessFlagBits::eTransferWrite )\n      result += \"TransferWrite | \";\n    if ( value & AccessFlagBits::eHostRead )\n      result += \"HostRead | \";\n    if ( value & AccessFlagBits::eHostWrite )\n      result += \"HostWrite | \";\n    if ( value & AccessFlagBits::eMemoryRead )\n      result += \"MemoryRead | \";\n    if ( value & AccessFlagBits::eMemoryWrite )\n      result += \"MemoryWrite | \";\n    if ( value & AccessFlagBits::eTransformFeedbackWriteEXT )\n      result += \"TransformFeedbackWriteEXT | \";\n    if ( value & AccessFlagBits::eTransformFeedbackCounterReadEXT )\n      result += \"TransformFeedbackCounterReadEXT | \";\n    if ( value & AccessFlagBits::eTransformFeedbackCounterWriteEXT )\n      result += \"TransformFeedbackCounterWriteEXT | \";\n    if ( value & AccessFlagBits::eConditionalRenderingReadEXT )\n      result += \"ConditionalRenderingReadEXT | \";\n    if ( value & AccessFlagBits::eColorAttachmentReadNoncoherentEXT )\n      result += \"ColorAttachmentReadNoncoherentEXT | \";\n    if ( value & AccessFlagBits::eAccelerationStructureReadKHR )\n      result += \"AccelerationStructureReadKHR | \";\n    if ( value & AccessFlagBits::eAccelerationStructureWriteKHR )\n      result += \"AccelerationStructureWriteKHR | \";\n    if ( value & AccessFlagBits::eFragmentDensityMapReadEXT )\n      result += \"FragmentDensityMapReadEXT | \";\n    if ( value & AccessFlagBits::eFragmentShadingRateAttachmentReadKHR )\n      result += \"FragmentShadingRateAttachmentReadKHR | \";\n    if ( value & AccessFlagBits::eCommandPreprocessReadNV )\n      result += \"CommandPreprocessReadNV | \";\n    if ( value & AccessFlagBits::eCommandPreprocessWriteNV )\n      result += \"CommandPreprocessWriteNV | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( AttachmentDescriptionFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & AttachmentDescriptionFlagBits::eMayAlias )\n      result += \"MayAlias | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DependencyFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & DependencyFlagBits::eByRegion )\n      result += \"ByRegion | \";\n    if ( value & DependencyFlagBits::eDeviceGroup )\n      result += \"DeviceGroup | \";\n    if ( value & DependencyFlagBits::eViewLocal )\n      result += \"ViewLocal | \";\n    if ( value & DependencyFlagBits::eFeedbackLoopEXT )\n      result += \"FeedbackLoopEXT | \";\n    if ( value & DependencyFlagBits::eQueueFamilyOwnershipTransferUseAllStagesKHR )\n      result += \"QueueFamilyOwnershipTransferUseAllStagesKHR | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( FramebufferCreateFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & FramebufferCreateFlagBits::eImageless )\n      result += \"Imageless | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( RenderPassCreateFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & RenderPassCreateFlagBits::eTransformQCOM )\n      result += \"TransformQCOM | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SubpassDescriptionFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & SubpassDescriptionFlagBits::ePerViewAttributesNVX )\n      result += \"PerViewAttributesNVX | \";\n    if ( value & SubpassDescriptionFlagBits::ePerViewPositionXOnlyNVX )\n      result += \"PerViewPositionXOnlyNVX | \";\n    if ( value & SubpassDescriptionFlagBits::eFragmentRegionQCOM )\n      result += \"FragmentRegionQCOM | \";\n    if ( value & SubpassDescriptionFlagBits::eShaderResolveQCOM )\n      result += \"ShaderResolveQCOM | \";\n    if ( value & SubpassDescriptionFlagBits::eRasterizationOrderAttachmentColorAccessEXT )\n      result += \"RasterizationOrderAttachmentColorAccessEXT | \";\n    if ( value & SubpassDescriptionFlagBits::eRasterizationOrderAttachmentDepthAccessEXT )\n      result += \"RasterizationOrderAttachmentDepthAccessEXT | \";\n    if ( value & SubpassDescriptionFlagBits::eRasterizationOrderAttachmentStencilAccessEXT )\n      result += \"RasterizationOrderAttachmentStencilAccessEXT | \";\n    if ( value & SubpassDescriptionFlagBits::eEnableLegacyDitheringEXT )\n      result += \"EnableLegacyDitheringEXT | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( CommandPoolCreateFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & CommandPoolCreateFlagBits::eTransient )\n      result += \"Transient | \";\n    if ( value & CommandPoolCreateFlagBits::eResetCommandBuffer )\n      result += \"ResetCommandBuffer | \";\n    if ( value & CommandPoolCreateFlagBits::eProtected )\n      result += \"Protected | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( CommandPoolResetFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & CommandPoolResetFlagBits::eReleaseResources )\n      result += \"ReleaseResources | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( CommandBufferResetFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & CommandBufferResetFlagBits::eReleaseResources )\n      result += \"ReleaseResources | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( CommandBufferUsageFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & CommandBufferUsageFlagBits::eOneTimeSubmit )\n      result += \"OneTimeSubmit | \";\n    if ( value & CommandBufferUsageFlagBits::eRenderPassContinue )\n      result += \"RenderPassContinue | \";\n    if ( value & CommandBufferUsageFlagBits::eSimultaneousUse )\n      result += \"SimultaneousUse | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( QueryControlFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & QueryControlFlagBits::ePrecise )\n      result += \"Precise | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( StencilFaceFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & StencilFaceFlagBits::eFront )\n      result += \"Front | \";\n    if ( value & StencilFaceFlagBits::eBack )\n      result += \"Back | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_VERSION_1_1 ===\n\n  VULKAN_HPP_INLINE std::string to_string( SubgroupFeatureFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & SubgroupFeatureFlagBits::eBasic )\n      result += \"Basic | \";\n    if ( value & SubgroupFeatureFlagBits::eVote )\n      result += \"Vote | \";\n    if ( value & SubgroupFeatureFlagBits::eArithmetic )\n      result += \"Arithmetic | \";\n    if ( value & SubgroupFeatureFlagBits::eBallot )\n      result += \"Ballot | \";\n    if ( value & SubgroupFeatureFlagBits::eShuffle )\n      result += \"Shuffle | \";\n    if ( value & SubgroupFeatureFlagBits::eShuffleRelative )\n      result += \"ShuffleRelative | \";\n    if ( value & SubgroupFeatureFlagBits::eClustered )\n      result += \"Clustered | \";\n    if ( value & SubgroupFeatureFlagBits::eQuad )\n      result += \"Quad | \";\n    if ( value & SubgroupFeatureFlagBits::eRotate )\n      result += \"Rotate | \";\n    if ( value & SubgroupFeatureFlagBits::eRotateClustered )\n      result += \"RotateClustered | \";\n    if ( value & SubgroupFeatureFlagBits::ePartitionedNV )\n      result += \"PartitionedNV | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PeerMemoryFeatureFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & PeerMemoryFeatureFlagBits::eCopySrc )\n      result += \"CopySrc | \";\n    if ( value & PeerMemoryFeatureFlagBits::eCopyDst )\n      result += \"CopyDst | \";\n    if ( value & PeerMemoryFeatureFlagBits::eGenericSrc )\n      result += \"GenericSrc | \";\n    if ( value & PeerMemoryFeatureFlagBits::eGenericDst )\n      result += \"GenericDst | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( MemoryAllocateFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & MemoryAllocateFlagBits::eDeviceMask )\n      result += \"DeviceMask | \";\n    if ( value & MemoryAllocateFlagBits::eDeviceAddress )\n      result += \"DeviceAddress | \";\n    if ( value & MemoryAllocateFlagBits::eDeviceAddressCaptureReplay )\n      result += \"DeviceAddressCaptureReplay | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( CommandPoolTrimFlags )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DescriptorUpdateTemplateCreateFlags )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ExternalMemoryHandleTypeFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & ExternalMemoryHandleTypeFlagBits::eOpaqueFd )\n      result += \"OpaqueFd | \";\n    if ( value & ExternalMemoryHandleTypeFlagBits::eOpaqueWin32 )\n      result += \"OpaqueWin32 | \";\n    if ( value & ExternalMemoryHandleTypeFlagBits::eOpaqueWin32Kmt )\n      result += \"OpaqueWin32Kmt | \";\n    if ( value & ExternalMemoryHandleTypeFlagBits::eD3D11Texture )\n      result += \"D3D11Texture | \";\n    if ( value & ExternalMemoryHandleTypeFlagBits::eD3D11TextureKmt )\n      result += \"D3D11TextureKmt | \";\n    if ( value & ExternalMemoryHandleTypeFlagBits::eD3D12Heap )\n      result += \"D3D12Heap | \";\n    if ( value & ExternalMemoryHandleTypeFlagBits::eD3D12Resource )\n      result += \"D3D12Resource | \";\n    if ( value & ExternalMemoryHandleTypeFlagBits::eDmaBufEXT )\n      result += \"DmaBufEXT | \";\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n    if ( value & ExternalMemoryHandleTypeFlagBits::eAndroidHardwareBufferANDROID )\n      result += \"AndroidHardwareBufferANDROID | \";\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n    if ( value & ExternalMemoryHandleTypeFlagBits::eHostAllocationEXT )\n      result += \"HostAllocationEXT | \";\n    if ( value & ExternalMemoryHandleTypeFlagBits::eHostMappedForeignMemoryEXT )\n      result += \"HostMappedForeignMemoryEXT | \";\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n    if ( value & ExternalMemoryHandleTypeFlagBits::eZirconVmoFUCHSIA )\n      result += \"ZirconVmoFUCHSIA | \";\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n    if ( value & ExternalMemoryHandleTypeFlagBits::eRdmaAddressNV )\n      result += \"RdmaAddressNV | \";\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n    if ( value & ExternalMemoryHandleTypeFlagBits::eScreenBufferQNX )\n      result += \"ScreenBufferQNX | \";\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n    if ( value & ExternalMemoryHandleTypeFlagBits::eMtlbufferEXT )\n      result += \"MtlbufferEXT | \";\n    if ( value & ExternalMemoryHandleTypeFlagBits::eMtltextureEXT )\n      result += \"MtltextureEXT | \";\n    if ( value & ExternalMemoryHandleTypeFlagBits::eMtlheapEXT )\n      result += \"MtlheapEXT | \";\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ExternalMemoryFeatureFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & ExternalMemoryFeatureFlagBits::eDedicatedOnly )\n      result += \"DedicatedOnly | \";\n    if ( value & ExternalMemoryFeatureFlagBits::eExportable )\n      result += \"Exportable | \";\n    if ( value & ExternalMemoryFeatureFlagBits::eImportable )\n      result += \"Importable | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ExternalFenceHandleTypeFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & ExternalFenceHandleTypeFlagBits::eOpaqueFd )\n      result += \"OpaqueFd | \";\n    if ( value & ExternalFenceHandleTypeFlagBits::eOpaqueWin32 )\n      result += \"OpaqueWin32 | \";\n    if ( value & ExternalFenceHandleTypeFlagBits::eOpaqueWin32Kmt )\n      result += \"OpaqueWin32Kmt | \";\n    if ( value & ExternalFenceHandleTypeFlagBits::eSyncFd )\n      result += \"SyncFd | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ExternalFenceFeatureFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & ExternalFenceFeatureFlagBits::eExportable )\n      result += \"Exportable | \";\n    if ( value & ExternalFenceFeatureFlagBits::eImportable )\n      result += \"Importable | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( FenceImportFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & FenceImportFlagBits::eTemporary )\n      result += \"Temporary | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SemaphoreImportFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & SemaphoreImportFlagBits::eTemporary )\n      result += \"Temporary | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ExternalSemaphoreHandleTypeFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & ExternalSemaphoreHandleTypeFlagBits::eOpaqueFd )\n      result += \"OpaqueFd | \";\n    if ( value & ExternalSemaphoreHandleTypeFlagBits::eOpaqueWin32 )\n      result += \"OpaqueWin32 | \";\n    if ( value & ExternalSemaphoreHandleTypeFlagBits::eOpaqueWin32Kmt )\n      result += \"OpaqueWin32Kmt | \";\n    if ( value & ExternalSemaphoreHandleTypeFlagBits::eD3D12Fence )\n      result += \"D3D12Fence | \";\n    if ( value & ExternalSemaphoreHandleTypeFlagBits::eSyncFd )\n      result += \"SyncFd | \";\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n    if ( value & ExternalSemaphoreHandleTypeFlagBits::eZirconEventFUCHSIA )\n      result += \"ZirconEventFUCHSIA | \";\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ExternalSemaphoreFeatureFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & ExternalSemaphoreFeatureFlagBits::eExportable )\n      result += \"Exportable | \";\n    if ( value & ExternalSemaphoreFeatureFlagBits::eImportable )\n      result += \"Importable | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_VERSION_1_2 ===\n\n  VULKAN_HPP_INLINE std::string to_string( DescriptorBindingFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & DescriptorBindingFlagBits::eUpdateAfterBind )\n      result += \"UpdateAfterBind | \";\n    if ( value & DescriptorBindingFlagBits::eUpdateUnusedWhilePending )\n      result += \"UpdateUnusedWhilePending | \";\n    if ( value & DescriptorBindingFlagBits::ePartiallyBound )\n      result += \"PartiallyBound | \";\n    if ( value & DescriptorBindingFlagBits::eVariableDescriptorCount )\n      result += \"VariableDescriptorCount | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ResolveModeFlags value )\n  {\n    if ( !value )\n      return \"None\";\n\n    std::string result;\n    if ( value & ResolveModeFlagBits::eSampleZero )\n      result += \"SampleZero | \";\n    if ( value & ResolveModeFlagBits::eAverage )\n      result += \"Average | \";\n    if ( value & ResolveModeFlagBits::eMin )\n      result += \"Min | \";\n    if ( value & ResolveModeFlagBits::eMax )\n      result += \"Max | \";\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n    if ( value & ResolveModeFlagBits::eExternalFormatDownsampleANDROID )\n      result += \"ExternalFormatDownsampleANDROID | \";\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SemaphoreWaitFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & SemaphoreWaitFlagBits::eAny )\n      result += \"Any | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_VERSION_1_3 ===\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineCreationFeedbackFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & PipelineCreationFeedbackFlagBits::eValid )\n      result += \"Valid | \";\n    if ( value & PipelineCreationFeedbackFlagBits::eApplicationPipelineCacheHit )\n      result += \"ApplicationPipelineCacheHit | \";\n    if ( value & PipelineCreationFeedbackFlagBits::eBasePipelineAcceleration )\n      result += \"BasePipelineAcceleration | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ToolPurposeFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & ToolPurposeFlagBits::eValidation )\n      result += \"Validation | \";\n    if ( value & ToolPurposeFlagBits::eProfiling )\n      result += \"Profiling | \";\n    if ( value & ToolPurposeFlagBits::eTracing )\n      result += \"Tracing | \";\n    if ( value & ToolPurposeFlagBits::eAdditionalFeatures )\n      result += \"AdditionalFeatures | \";\n    if ( value & ToolPurposeFlagBits::eModifyingFeatures )\n      result += \"ModifyingFeatures | \";\n    if ( value & ToolPurposeFlagBits::eDebugReportingEXT )\n      result += \"DebugReportingEXT | \";\n    if ( value & ToolPurposeFlagBits::eDebugMarkersEXT )\n      result += \"DebugMarkersEXT | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PrivateDataSlotCreateFlags )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineStageFlags2 value )\n  {\n    if ( !value )\n      return \"None\";\n\n    std::string result;\n    if ( value & PipelineStageFlagBits2::eTopOfPipe )\n      result += \"TopOfPipe | \";\n    if ( value & PipelineStageFlagBits2::eDrawIndirect )\n      result += \"DrawIndirect | \";\n    if ( value & PipelineStageFlagBits2::eVertexInput )\n      result += \"VertexInput | \";\n    if ( value & PipelineStageFlagBits2::eVertexShader )\n      result += \"VertexShader | \";\n    if ( value & PipelineStageFlagBits2::eTessellationControlShader )\n      result += \"TessellationControlShader | \";\n    if ( value & PipelineStageFlagBits2::eTessellationEvaluationShader )\n      result += \"TessellationEvaluationShader | \";\n    if ( value & PipelineStageFlagBits2::eGeometryShader )\n      result += \"GeometryShader | \";\n    if ( value & PipelineStageFlagBits2::eFragmentShader )\n      result += \"FragmentShader | \";\n    if ( value & PipelineStageFlagBits2::eEarlyFragmentTests )\n      result += \"EarlyFragmentTests | \";\n    if ( value & PipelineStageFlagBits2::eLateFragmentTests )\n      result += \"LateFragmentTests | \";\n    if ( value & PipelineStageFlagBits2::eColorAttachmentOutput )\n      result += \"ColorAttachmentOutput | \";\n    if ( value & PipelineStageFlagBits2::eComputeShader )\n      result += \"ComputeShader | \";\n    if ( value & PipelineStageFlagBits2::eAllTransfer )\n      result += \"AllTransfer | \";\n    if ( value & PipelineStageFlagBits2::eBottomOfPipe )\n      result += \"BottomOfPipe | \";\n    if ( value & PipelineStageFlagBits2::eHost )\n      result += \"Host | \";\n    if ( value & PipelineStageFlagBits2::eAllGraphics )\n      result += \"AllGraphics | \";\n    if ( value & PipelineStageFlagBits2::eAllCommands )\n      result += \"AllCommands | \";\n    if ( value & PipelineStageFlagBits2::eCopy )\n      result += \"Copy | \";\n    if ( value & PipelineStageFlagBits2::eResolve )\n      result += \"Resolve | \";\n    if ( value & PipelineStageFlagBits2::eBlit )\n      result += \"Blit | \";\n    if ( value & PipelineStageFlagBits2::eClear )\n      result += \"Clear | \";\n    if ( value & PipelineStageFlagBits2::eIndexInput )\n      result += \"IndexInput | \";\n    if ( value & PipelineStageFlagBits2::eVertexAttributeInput )\n      result += \"VertexAttributeInput | \";\n    if ( value & PipelineStageFlagBits2::ePreRasterizationShaders )\n      result += \"PreRasterizationShaders | \";\n    if ( value & PipelineStageFlagBits2::eVideoDecodeKHR )\n      result += \"VideoDecodeKHR | \";\n    if ( value & PipelineStageFlagBits2::eVideoEncodeKHR )\n      result += \"VideoEncodeKHR | \";\n    if ( value & PipelineStageFlagBits2::eTransformFeedbackEXT )\n      result += \"TransformFeedbackEXT | \";\n    if ( value & PipelineStageFlagBits2::eConditionalRenderingEXT )\n      result += \"ConditionalRenderingEXT | \";\n    if ( value & PipelineStageFlagBits2::eCommandPreprocessNV )\n      result += \"CommandPreprocessNV | \";\n    if ( value & PipelineStageFlagBits2::eFragmentShadingRateAttachmentKHR )\n      result += \"FragmentShadingRateAttachmentKHR | \";\n    if ( value & PipelineStageFlagBits2::eAccelerationStructureBuildKHR )\n      result += \"AccelerationStructureBuildKHR | \";\n    if ( value & PipelineStageFlagBits2::eRayTracingShaderKHR )\n      result += \"RayTracingShaderKHR | \";\n    if ( value & PipelineStageFlagBits2::eFragmentDensityProcessEXT )\n      result += \"FragmentDensityProcessEXT | \";\n    if ( value & PipelineStageFlagBits2::eTaskShaderEXT )\n      result += \"TaskShaderEXT | \";\n    if ( value & PipelineStageFlagBits2::eMeshShaderEXT )\n      result += \"MeshShaderEXT | \";\n    if ( value & PipelineStageFlagBits2::eSubpassShaderHUAWEI )\n      result += \"SubpassShaderHUAWEI | \";\n    if ( value & PipelineStageFlagBits2::eInvocationMaskHUAWEI )\n      result += \"InvocationMaskHUAWEI | \";\n    if ( value & PipelineStageFlagBits2::eAccelerationStructureCopyKHR )\n      result += \"AccelerationStructureCopyKHR | \";\n    if ( value & PipelineStageFlagBits2::eMicromapBuildEXT )\n      result += \"MicromapBuildEXT | \";\n    if ( value & PipelineStageFlagBits2::eClusterCullingShaderHUAWEI )\n      result += \"ClusterCullingShaderHUAWEI | \";\n    if ( value & PipelineStageFlagBits2::eOpticalFlowNV )\n      result += \"OpticalFlowNV | \";\n    if ( value & PipelineStageFlagBits2::eConvertCooperativeVectorMatrixNV )\n      result += \"ConvertCooperativeVectorMatrixNV | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( AccessFlags2 value )\n  {\n    if ( !value )\n      return \"None\";\n\n    std::string result;\n    if ( value & AccessFlagBits2::eIndirectCommandRead )\n      result += \"IndirectCommandRead | \";\n    if ( value & AccessFlagBits2::eIndexRead )\n      result += \"IndexRead | \";\n    if ( value & AccessFlagBits2::eVertexAttributeRead )\n      result += \"VertexAttributeRead | \";\n    if ( value & AccessFlagBits2::eUniformRead )\n      result += \"UniformRead | \";\n    if ( value & AccessFlagBits2::eInputAttachmentRead )\n      result += \"InputAttachmentRead | \";\n    if ( value & AccessFlagBits2::eShaderRead )\n      result += \"ShaderRead | \";\n    if ( value & AccessFlagBits2::eShaderWrite )\n      result += \"ShaderWrite | \";\n    if ( value & AccessFlagBits2::eColorAttachmentRead )\n      result += \"ColorAttachmentRead | \";\n    if ( value & AccessFlagBits2::eColorAttachmentWrite )\n      result += \"ColorAttachmentWrite | \";\n    if ( value & AccessFlagBits2::eDepthStencilAttachmentRead )\n      result += \"DepthStencilAttachmentRead | \";\n    if ( value & AccessFlagBits2::eDepthStencilAttachmentWrite )\n      result += \"DepthStencilAttachmentWrite | \";\n    if ( value & AccessFlagBits2::eTransferRead )\n      result += \"TransferRead | \";\n    if ( value & AccessFlagBits2::eTransferWrite )\n      result += \"TransferWrite | \";\n    if ( value & AccessFlagBits2::eHostRead )\n      result += \"HostRead | \";\n    if ( value & AccessFlagBits2::eHostWrite )\n      result += \"HostWrite | \";\n    if ( value & AccessFlagBits2::eMemoryRead )\n      result += \"MemoryRead | \";\n    if ( value & AccessFlagBits2::eMemoryWrite )\n      result += \"MemoryWrite | \";\n    if ( value & AccessFlagBits2::eShaderSampledRead )\n      result += \"ShaderSampledRead | \";\n    if ( value & AccessFlagBits2::eShaderStorageRead )\n      result += \"ShaderStorageRead | \";\n    if ( value & AccessFlagBits2::eShaderStorageWrite )\n      result += \"ShaderStorageWrite | \";\n    if ( value & AccessFlagBits2::eVideoDecodeReadKHR )\n      result += \"VideoDecodeReadKHR | \";\n    if ( value & AccessFlagBits2::eVideoDecodeWriteKHR )\n      result += \"VideoDecodeWriteKHR | \";\n    if ( value & AccessFlagBits2::eVideoEncodeReadKHR )\n      result += \"VideoEncodeReadKHR | \";\n    if ( value & AccessFlagBits2::eVideoEncodeWriteKHR )\n      result += \"VideoEncodeWriteKHR | \";\n    if ( value & AccessFlagBits2::eTransformFeedbackWriteEXT )\n      result += \"TransformFeedbackWriteEXT | \";\n    if ( value & AccessFlagBits2::eTransformFeedbackCounterReadEXT )\n      result += \"TransformFeedbackCounterReadEXT | \";\n    if ( value & AccessFlagBits2::eTransformFeedbackCounterWriteEXT )\n      result += \"TransformFeedbackCounterWriteEXT | \";\n    if ( value & AccessFlagBits2::eConditionalRenderingReadEXT )\n      result += \"ConditionalRenderingReadEXT | \";\n    if ( value & AccessFlagBits2::eCommandPreprocessReadNV )\n      result += \"CommandPreprocessReadNV | \";\n    if ( value & AccessFlagBits2::eCommandPreprocessWriteNV )\n      result += \"CommandPreprocessWriteNV | \";\n    if ( value & AccessFlagBits2::eFragmentShadingRateAttachmentReadKHR )\n      result += \"FragmentShadingRateAttachmentReadKHR | \";\n    if ( value & AccessFlagBits2::eAccelerationStructureReadKHR )\n      result += \"AccelerationStructureReadKHR | \";\n    if ( value & AccessFlagBits2::eAccelerationStructureWriteKHR )\n      result += \"AccelerationStructureWriteKHR | \";\n    if ( value & AccessFlagBits2::eFragmentDensityMapReadEXT )\n      result += \"FragmentDensityMapReadEXT | \";\n    if ( value & AccessFlagBits2::eColorAttachmentReadNoncoherentEXT )\n      result += \"ColorAttachmentReadNoncoherentEXT | \";\n    if ( value & AccessFlagBits2::eDescriptorBufferReadEXT )\n      result += \"DescriptorBufferReadEXT | \";\n    if ( value & AccessFlagBits2::eInvocationMaskReadHUAWEI )\n      result += \"InvocationMaskReadHUAWEI | \";\n    if ( value & AccessFlagBits2::eShaderBindingTableReadKHR )\n      result += \"ShaderBindingTableReadKHR | \";\n    if ( value & AccessFlagBits2::eMicromapReadEXT )\n      result += \"MicromapReadEXT | \";\n    if ( value & AccessFlagBits2::eMicromapWriteEXT )\n      result += \"MicromapWriteEXT | \";\n    if ( value & AccessFlagBits2::eOpticalFlowReadNV )\n      result += \"OpticalFlowReadNV | \";\n    if ( value & AccessFlagBits2::eOpticalFlowWriteNV )\n      result += \"OpticalFlowWriteNV | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SubmitFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & SubmitFlagBits::eProtected )\n      result += \"Protected | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( RenderingFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & RenderingFlagBits::eContentsSecondaryCommandBuffers )\n      result += \"ContentsSecondaryCommandBuffers | \";\n    if ( value & RenderingFlagBits::eSuspending )\n      result += \"Suspending | \";\n    if ( value & RenderingFlagBits::eResuming )\n      result += \"Resuming | \";\n    if ( value & RenderingFlagBits::eEnableLegacyDitheringEXT )\n      result += \"EnableLegacyDitheringEXT | \";\n    if ( value & RenderingFlagBits::eContentsInlineKHR )\n      result += \"ContentsInlineKHR | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( FormatFeatureFlags2 value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & FormatFeatureFlagBits2::eSampledImage )\n      result += \"SampledImage | \";\n    if ( value & FormatFeatureFlagBits2::eStorageImage )\n      result += \"StorageImage | \";\n    if ( value & FormatFeatureFlagBits2::eStorageImageAtomic )\n      result += \"StorageImageAtomic | \";\n    if ( value & FormatFeatureFlagBits2::eUniformTexelBuffer )\n      result += \"UniformTexelBuffer | \";\n    if ( value & FormatFeatureFlagBits2::eStorageTexelBuffer )\n      result += \"StorageTexelBuffer | \";\n    if ( value & FormatFeatureFlagBits2::eStorageTexelBufferAtomic )\n      result += \"StorageTexelBufferAtomic | \";\n    if ( value & FormatFeatureFlagBits2::eVertexBuffer )\n      result += \"VertexBuffer | \";\n    if ( value & FormatFeatureFlagBits2::eColorAttachment )\n      result += \"ColorAttachment | \";\n    if ( value & FormatFeatureFlagBits2::eColorAttachmentBlend )\n      result += \"ColorAttachmentBlend | \";\n    if ( value & FormatFeatureFlagBits2::eDepthStencilAttachment )\n      result += \"DepthStencilAttachment | \";\n    if ( value & FormatFeatureFlagBits2::eBlitSrc )\n      result += \"BlitSrc | \";\n    if ( value & FormatFeatureFlagBits2::eBlitDst )\n      result += \"BlitDst | \";\n    if ( value & FormatFeatureFlagBits2::eSampledImageFilterLinear )\n      result += \"SampledImageFilterLinear | \";\n    if ( value & FormatFeatureFlagBits2::eTransferSrc )\n      result += \"TransferSrc | \";\n    if ( value & FormatFeatureFlagBits2::eTransferDst )\n      result += \"TransferDst | \";\n    if ( value & FormatFeatureFlagBits2::eSampledImageFilterMinmax )\n      result += \"SampledImageFilterMinmax | \";\n    if ( value & FormatFeatureFlagBits2::eMidpointChromaSamples )\n      result += \"MidpointChromaSamples | \";\n    if ( value & FormatFeatureFlagBits2::eSampledImageYcbcrConversionLinearFilter )\n      result += \"SampledImageYcbcrConversionLinearFilter | \";\n    if ( value & FormatFeatureFlagBits2::eSampledImageYcbcrConversionSeparateReconstructionFilter )\n      result += \"SampledImageYcbcrConversionSeparateReconstructionFilter | \";\n    if ( value & FormatFeatureFlagBits2::eSampledImageYcbcrConversionChromaReconstructionExplicit )\n      result += \"SampledImageYcbcrConversionChromaReconstructionExplicit | \";\n    if ( value & FormatFeatureFlagBits2::eSampledImageYcbcrConversionChromaReconstructionExplicitForceable )\n      result += \"SampledImageYcbcrConversionChromaReconstructionExplicitForceable | \";\n    if ( value & FormatFeatureFlagBits2::eDisjoint )\n      result += \"Disjoint | \";\n    if ( value & FormatFeatureFlagBits2::eCositedChromaSamples )\n      result += \"CositedChromaSamples | \";\n    if ( value & FormatFeatureFlagBits2::eStorageReadWithoutFormat )\n      result += \"StorageReadWithoutFormat | \";\n    if ( value & FormatFeatureFlagBits2::eStorageWriteWithoutFormat )\n      result += \"StorageWriteWithoutFormat | \";\n    if ( value & FormatFeatureFlagBits2::eSampledImageDepthComparison )\n      result += \"SampledImageDepthComparison | \";\n    if ( value & FormatFeatureFlagBits2::eSampledImageFilterCubic )\n      result += \"SampledImageFilterCubic | \";\n    if ( value & FormatFeatureFlagBits2::eHostImageTransfer )\n      result += \"HostImageTransfer | \";\n    if ( value & FormatFeatureFlagBits2::eVideoDecodeOutputKHR )\n      result += \"VideoDecodeOutputKHR | \";\n    if ( value & FormatFeatureFlagBits2::eVideoDecodeDpbKHR )\n      result += \"VideoDecodeDpbKHR | \";\n    if ( value & FormatFeatureFlagBits2::eAccelerationStructureVertexBufferKHR )\n      result += \"AccelerationStructureVertexBufferKHR | \";\n    if ( value & FormatFeatureFlagBits2::eFragmentDensityMapEXT )\n      result += \"FragmentDensityMapEXT | \";\n    if ( value & FormatFeatureFlagBits2::eFragmentShadingRateAttachmentKHR )\n      result += \"FragmentShadingRateAttachmentKHR | \";\n    if ( value & FormatFeatureFlagBits2::eVideoEncodeInputKHR )\n      result += \"VideoEncodeInputKHR | \";\n    if ( value & FormatFeatureFlagBits2::eVideoEncodeDpbKHR )\n      result += \"VideoEncodeDpbKHR | \";\n    if ( value & FormatFeatureFlagBits2::eAccelerationStructureRadiusBufferNV )\n      result += \"AccelerationStructureRadiusBufferNV | \";\n    if ( value & FormatFeatureFlagBits2::eLinearColorAttachmentNV )\n      result += \"LinearColorAttachmentNV | \";\n    if ( value & FormatFeatureFlagBits2::eWeightImageQCOM )\n      result += \"WeightImageQCOM | \";\n    if ( value & FormatFeatureFlagBits2::eWeightSampledImageQCOM )\n      result += \"WeightSampledImageQCOM | \";\n    if ( value & FormatFeatureFlagBits2::eBlockMatchingQCOM )\n      result += \"BlockMatchingQCOM | \";\n    if ( value & FormatFeatureFlagBits2::eBoxFilterSampledQCOM )\n      result += \"BoxFilterSampledQCOM | \";\n    if ( value & FormatFeatureFlagBits2::eOpticalFlowImageNV )\n      result += \"OpticalFlowImageNV | \";\n    if ( value & FormatFeatureFlagBits2::eOpticalFlowVectorNV )\n      result += \"OpticalFlowVectorNV | \";\n    if ( value & FormatFeatureFlagBits2::eOpticalFlowCostNV )\n      result += \"OpticalFlowCostNV | \";\n    if ( value & FormatFeatureFlagBits2::eVideoEncodeQuantizationDeltaMapKHR )\n      result += \"VideoEncodeQuantizationDeltaMapKHR | \";\n    if ( value & FormatFeatureFlagBits2::eVideoEncodeEmphasisMapKHR )\n      result += \"VideoEncodeEmphasisMapKHR | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_VERSION_1_4 ===\n\n  VULKAN_HPP_INLINE std::string to_string( MemoryUnmapFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & MemoryUnmapFlagBits::eReserveEXT )\n      result += \"ReserveEXT | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineCreateFlags2 value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & PipelineCreateFlagBits2::eDisableOptimization )\n      result += \"DisableOptimization | \";\n    if ( value & PipelineCreateFlagBits2::eAllowDerivatives )\n      result += \"AllowDerivatives | \";\n    if ( value & PipelineCreateFlagBits2::eDerivative )\n      result += \"Derivative | \";\n    if ( value & PipelineCreateFlagBits2::eViewIndexFromDeviceIndex )\n      result += \"ViewIndexFromDeviceIndex | \";\n    if ( value & PipelineCreateFlagBits2::eDispatchBase )\n      result += \"DispatchBase | \";\n    if ( value & PipelineCreateFlagBits2::eFailOnPipelineCompileRequired )\n      result += \"FailOnPipelineCompileRequired | \";\n    if ( value & PipelineCreateFlagBits2::eEarlyReturnOnFailure )\n      result += \"EarlyReturnOnFailure | \";\n    if ( value & PipelineCreateFlagBits2::eNoProtectedAccess )\n      result += \"NoProtectedAccess | \";\n    if ( value & PipelineCreateFlagBits2::eProtectedAccessOnly )\n      result += \"ProtectedAccessOnly | \";\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n    if ( value & PipelineCreateFlagBits2::eExecutionGraphAMDX )\n      result += \"ExecutionGraphAMDX | \";\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n    if ( value & PipelineCreateFlagBits2::eRayTracingAllowSpheresAndLinearSweptSpheresNV )\n      result += \"RayTracingAllowSpheresAndLinearSweptSpheresNV | \";\n    if ( value & PipelineCreateFlagBits2::eEnableLegacyDitheringEXT )\n      result += \"EnableLegacyDitheringEXT | \";\n    if ( value & PipelineCreateFlagBits2::eDeferCompileNV )\n      result += \"DeferCompileNV | \";\n    if ( value & PipelineCreateFlagBits2::eCaptureStatisticsKHR )\n      result += \"CaptureStatisticsKHR | \";\n    if ( value & PipelineCreateFlagBits2::eCaptureInternalRepresentationsKHR )\n      result += \"CaptureInternalRepresentationsKHR | \";\n    if ( value & PipelineCreateFlagBits2::eLinkTimeOptimizationEXT )\n      result += \"LinkTimeOptimizationEXT | \";\n    if ( value & PipelineCreateFlagBits2::eRetainLinkTimeOptimizationInfoEXT )\n      result += \"RetainLinkTimeOptimizationInfoEXT | \";\n    if ( value & PipelineCreateFlagBits2::eLibraryKHR )\n      result += \"LibraryKHR | \";\n    if ( value & PipelineCreateFlagBits2::eRayTracingSkipTrianglesKHR )\n      result += \"RayTracingSkipTrianglesKHR | \";\n    if ( value & PipelineCreateFlagBits2::eRayTracingSkipAabbsKHR )\n      result += \"RayTracingSkipAabbsKHR | \";\n    if ( value & PipelineCreateFlagBits2::eRayTracingNoNullAnyHitShadersKHR )\n      result += \"RayTracingNoNullAnyHitShadersKHR | \";\n    if ( value & PipelineCreateFlagBits2::eRayTracingNoNullClosestHitShadersKHR )\n      result += \"RayTracingNoNullClosestHitShadersKHR | \";\n    if ( value & PipelineCreateFlagBits2::eRayTracingNoNullMissShadersKHR )\n      result += \"RayTracingNoNullMissShadersKHR | \";\n    if ( value & PipelineCreateFlagBits2::eRayTracingNoNullIntersectionShadersKHR )\n      result += \"RayTracingNoNullIntersectionShadersKHR | \";\n    if ( value & PipelineCreateFlagBits2::eRayTracingShaderGroupHandleCaptureReplayKHR )\n      result += \"RayTracingShaderGroupHandleCaptureReplayKHR | \";\n    if ( value & PipelineCreateFlagBits2::eIndirectBindableNV )\n      result += \"IndirectBindableNV | \";\n    if ( value & PipelineCreateFlagBits2::eRayTracingAllowMotionNV )\n      result += \"RayTracingAllowMotionNV | \";\n    if ( value & PipelineCreateFlagBits2::eRenderingFragmentShadingRateAttachmentKHR )\n      result += \"RenderingFragmentShadingRateAttachmentKHR | \";\n    if ( value & PipelineCreateFlagBits2::eRenderingFragmentDensityMapAttachmentEXT )\n      result += \"RenderingFragmentDensityMapAttachmentEXT | \";\n    if ( value & PipelineCreateFlagBits2::eRayTracingOpacityMicromapEXT )\n      result += \"RayTracingOpacityMicromapEXT | \";\n    if ( value & PipelineCreateFlagBits2::eColorAttachmentFeedbackLoopEXT )\n      result += \"ColorAttachmentFeedbackLoopEXT | \";\n    if ( value & PipelineCreateFlagBits2::eDepthStencilAttachmentFeedbackLoopEXT )\n      result += \"DepthStencilAttachmentFeedbackLoopEXT | \";\n    if ( value & PipelineCreateFlagBits2::eRayTracingDisplacementMicromapNV )\n      result += \"RayTracingDisplacementMicromapNV | \";\n    if ( value & PipelineCreateFlagBits2::eDescriptorBufferEXT )\n      result += \"DescriptorBufferEXT | \";\n    if ( value & PipelineCreateFlagBits2::eDisallowOpacityMicromapARM )\n      result += \"DisallowOpacityMicromapARM | \";\n    if ( value & PipelineCreateFlagBits2::eCaptureDataKHR )\n      result += \"CaptureDataKHR | \";\n    if ( value & PipelineCreateFlagBits2::eIndirectBindableEXT )\n      result += \"IndirectBindableEXT | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( BufferUsageFlags2 value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & BufferUsageFlagBits2::eTransferSrc )\n      result += \"TransferSrc | \";\n    if ( value & BufferUsageFlagBits2::eTransferDst )\n      result += \"TransferDst | \";\n    if ( value & BufferUsageFlagBits2::eUniformTexelBuffer )\n      result += \"UniformTexelBuffer | \";\n    if ( value & BufferUsageFlagBits2::eStorageTexelBuffer )\n      result += \"StorageTexelBuffer | \";\n    if ( value & BufferUsageFlagBits2::eUniformBuffer )\n      result += \"UniformBuffer | \";\n    if ( value & BufferUsageFlagBits2::eStorageBuffer )\n      result += \"StorageBuffer | \";\n    if ( value & BufferUsageFlagBits2::eIndexBuffer )\n      result += \"IndexBuffer | \";\n    if ( value & BufferUsageFlagBits2::eVertexBuffer )\n      result += \"VertexBuffer | \";\n    if ( value & BufferUsageFlagBits2::eIndirectBuffer )\n      result += \"IndirectBuffer | \";\n    if ( value & BufferUsageFlagBits2::eShaderDeviceAddress )\n      result += \"ShaderDeviceAddress | \";\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n    if ( value & BufferUsageFlagBits2::eExecutionGraphScratchAMDX )\n      result += \"ExecutionGraphScratchAMDX | \";\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n    if ( value & BufferUsageFlagBits2::eConditionalRenderingEXT )\n      result += \"ConditionalRenderingEXT | \";\n    if ( value & BufferUsageFlagBits2::eShaderBindingTableKHR )\n      result += \"ShaderBindingTableKHR | \";\n    if ( value & BufferUsageFlagBits2::eTransformFeedbackBufferEXT )\n      result += \"TransformFeedbackBufferEXT | \";\n    if ( value & BufferUsageFlagBits2::eTransformFeedbackCounterBufferEXT )\n      result += \"TransformFeedbackCounterBufferEXT | \";\n    if ( value & BufferUsageFlagBits2::eVideoDecodeSrcKHR )\n      result += \"VideoDecodeSrcKHR | \";\n    if ( value & BufferUsageFlagBits2::eVideoDecodeDstKHR )\n      result += \"VideoDecodeDstKHR | \";\n    if ( value & BufferUsageFlagBits2::eVideoEncodeDstKHR )\n      result += \"VideoEncodeDstKHR | \";\n    if ( value & BufferUsageFlagBits2::eVideoEncodeSrcKHR )\n      result += \"VideoEncodeSrcKHR | \";\n    if ( value & BufferUsageFlagBits2::eAccelerationStructureBuildInputReadOnlyKHR )\n      result += \"AccelerationStructureBuildInputReadOnlyKHR | \";\n    if ( value & BufferUsageFlagBits2::eAccelerationStructureStorageKHR )\n      result += \"AccelerationStructureStorageKHR | \";\n    if ( value & BufferUsageFlagBits2::eSamplerDescriptorBufferEXT )\n      result += \"SamplerDescriptorBufferEXT | \";\n    if ( value & BufferUsageFlagBits2::eResourceDescriptorBufferEXT )\n      result += \"ResourceDescriptorBufferEXT | \";\n    if ( value & BufferUsageFlagBits2::ePushDescriptorsDescriptorBufferEXT )\n      result += \"PushDescriptorsDescriptorBufferEXT | \";\n    if ( value & BufferUsageFlagBits2::eMicromapBuildInputReadOnlyEXT )\n      result += \"MicromapBuildInputReadOnlyEXT | \";\n    if ( value & BufferUsageFlagBits2::eMicromapStorageEXT )\n      result += \"MicromapStorageEXT | \";\n    if ( value & BufferUsageFlagBits2::ePreprocessBufferEXT )\n      result += \"PreprocessBufferEXT | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( HostImageCopyFlags value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & HostImageCopyFlagBits::eMemcpy )\n      result += \"Memcpy | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_KHR_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( CompositeAlphaFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & CompositeAlphaFlagBitsKHR::eOpaque )\n      result += \"Opaque | \";\n    if ( value & CompositeAlphaFlagBitsKHR::ePreMultiplied )\n      result += \"PreMultiplied | \";\n    if ( value & CompositeAlphaFlagBitsKHR::ePostMultiplied )\n      result += \"PostMultiplied | \";\n    if ( value & CompositeAlphaFlagBitsKHR::eInherit )\n      result += \"Inherit | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_KHR_swapchain ===\n\n  VULKAN_HPP_INLINE std::string to_string( SwapchainCreateFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & SwapchainCreateFlagBitsKHR::eSplitInstanceBindRegions )\n      result += \"SplitInstanceBindRegions | \";\n    if ( value & SwapchainCreateFlagBitsKHR::eProtected )\n      result += \"Protected | \";\n    if ( value & SwapchainCreateFlagBitsKHR::eMutableFormat )\n      result += \"MutableFormat | \";\n    if ( value & SwapchainCreateFlagBitsKHR::eDeferredMemoryAllocationEXT )\n      result += \"DeferredMemoryAllocationEXT | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DeviceGroupPresentModeFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & DeviceGroupPresentModeFlagBitsKHR::eLocal )\n      result += \"Local | \";\n    if ( value & DeviceGroupPresentModeFlagBitsKHR::eRemote )\n      result += \"Remote | \";\n    if ( value & DeviceGroupPresentModeFlagBitsKHR::eSum )\n      result += \"Sum | \";\n    if ( value & DeviceGroupPresentModeFlagBitsKHR::eLocalMultiDevice )\n      result += \"LocalMultiDevice | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_KHR_display ===\n\n  VULKAN_HPP_INLINE std::string to_string( DisplayModeCreateFlagsKHR )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DisplayPlaneAlphaFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & DisplayPlaneAlphaFlagBitsKHR::eOpaque )\n      result += \"Opaque | \";\n    if ( value & DisplayPlaneAlphaFlagBitsKHR::eGlobal )\n      result += \"Global | \";\n    if ( value & DisplayPlaneAlphaFlagBitsKHR::ePerPixel )\n      result += \"PerPixel | \";\n    if ( value & DisplayPlaneAlphaFlagBitsKHR::ePerPixelPremultiplied )\n      result += \"PerPixelPremultiplied | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DisplaySurfaceCreateFlagsKHR )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SurfaceTransformFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & SurfaceTransformFlagBitsKHR::eIdentity )\n      result += \"Identity | \";\n    if ( value & SurfaceTransformFlagBitsKHR::eRotate90 )\n      result += \"Rotate90 | \";\n    if ( value & SurfaceTransformFlagBitsKHR::eRotate180 )\n      result += \"Rotate180 | \";\n    if ( value & SurfaceTransformFlagBitsKHR::eRotate270 )\n      result += \"Rotate270 | \";\n    if ( value & SurfaceTransformFlagBitsKHR::eHorizontalMirror )\n      result += \"HorizontalMirror | \";\n    if ( value & SurfaceTransformFlagBitsKHR::eHorizontalMirrorRotate90 )\n      result += \"HorizontalMirrorRotate90 | \";\n    if ( value & SurfaceTransformFlagBitsKHR::eHorizontalMirrorRotate180 )\n      result += \"HorizontalMirrorRotate180 | \";\n    if ( value & SurfaceTransformFlagBitsKHR::eHorizontalMirrorRotate270 )\n      result += \"HorizontalMirrorRotate270 | \";\n    if ( value & SurfaceTransformFlagBitsKHR::eInherit )\n      result += \"Inherit | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n#if defined( VK_USE_PLATFORM_XLIB_KHR )\n  //=== VK_KHR_xlib_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( XlibSurfaceCreateFlagsKHR )\n  {\n    return \"{}\";\n  }\n#endif /*VK_USE_PLATFORM_XLIB_KHR*/\n\n#if defined( VK_USE_PLATFORM_XCB_KHR )\n  //=== VK_KHR_xcb_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( XcbSurfaceCreateFlagsKHR )\n  {\n    return \"{}\";\n  }\n#endif /*VK_USE_PLATFORM_XCB_KHR*/\n\n#if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n  //=== VK_KHR_wayland_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( WaylandSurfaceCreateFlagsKHR )\n  {\n    return \"{}\";\n  }\n#endif /*VK_USE_PLATFORM_WAYLAND_KHR*/\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  //=== VK_KHR_android_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( AndroidSurfaceCreateFlagsKHR )\n  {\n    return \"{}\";\n  }\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_KHR_win32_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( Win32SurfaceCreateFlagsKHR )\n  {\n    return \"{}\";\n  }\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_EXT_debug_report ===\n\n  VULKAN_HPP_INLINE std::string to_string( DebugReportFlagsEXT value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & DebugReportFlagBitsEXT::eInformation )\n      result += \"Information | \";\n    if ( value & DebugReportFlagBitsEXT::eWarning )\n      result += \"Warning | \";\n    if ( value & DebugReportFlagBitsEXT::ePerformanceWarning )\n      result += \"PerformanceWarning | \";\n    if ( value & DebugReportFlagBitsEXT::eError )\n      result += \"Error | \";\n    if ( value & DebugReportFlagBitsEXT::eDebug )\n      result += \"Debug | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_KHR_video_queue ===\n\n  VULKAN_HPP_INLINE std::string to_string( VideoCodecOperationFlagsKHR value )\n  {\n    if ( !value )\n      return \"None\";\n\n    std::string result;\n    if ( value & VideoCodecOperationFlagBitsKHR::eEncodeH264 )\n      result += \"EncodeH264 | \";\n    if ( value & VideoCodecOperationFlagBitsKHR::eEncodeH265 )\n      result += \"EncodeH265 | \";\n    if ( value & VideoCodecOperationFlagBitsKHR::eDecodeH264 )\n      result += \"DecodeH264 | \";\n    if ( value & VideoCodecOperationFlagBitsKHR::eDecodeH265 )\n      result += \"DecodeH265 | \";\n    if ( value & VideoCodecOperationFlagBitsKHR::eDecodeAv1 )\n      result += \"DecodeAv1 | \";\n    if ( value & VideoCodecOperationFlagBitsKHR::eEncodeAv1 )\n      result += \"EncodeAv1 | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoChromaSubsamplingFlagsKHR value )\n  {\n    if ( !value )\n      return \"Invalid\";\n\n    std::string result;\n    if ( value & VideoChromaSubsamplingFlagBitsKHR::eMonochrome )\n      result += \"Monochrome | \";\n    if ( value & VideoChromaSubsamplingFlagBitsKHR::e420 )\n      result += \"420 | \";\n    if ( value & VideoChromaSubsamplingFlagBitsKHR::e422 )\n      result += \"422 | \";\n    if ( value & VideoChromaSubsamplingFlagBitsKHR::e444 )\n      result += \"444 | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoComponentBitDepthFlagsKHR value )\n  {\n    if ( !value )\n      return \"Invalid\";\n\n    std::string result;\n    if ( value & VideoComponentBitDepthFlagBitsKHR::e8 )\n      result += \"8 | \";\n    if ( value & VideoComponentBitDepthFlagBitsKHR::e10 )\n      result += \"10 | \";\n    if ( value & VideoComponentBitDepthFlagBitsKHR::e12 )\n      result += \"12 | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoCapabilityFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & VideoCapabilityFlagBitsKHR::eProtectedContent )\n      result += \"ProtectedContent | \";\n    if ( value & VideoCapabilityFlagBitsKHR::eSeparateReferenceImages )\n      result += \"SeparateReferenceImages | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoSessionCreateFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & VideoSessionCreateFlagBitsKHR::eProtectedContent )\n      result += \"ProtectedContent | \";\n    if ( value & VideoSessionCreateFlagBitsKHR::eAllowEncodeParameterOptimizations )\n      result += \"AllowEncodeParameterOptimizations | \";\n    if ( value & VideoSessionCreateFlagBitsKHR::eInlineQueries )\n      result += \"InlineQueries | \";\n    if ( value & VideoSessionCreateFlagBitsKHR::eAllowEncodeQuantizationDeltaMap )\n      result += \"AllowEncodeQuantizationDeltaMap | \";\n    if ( value & VideoSessionCreateFlagBitsKHR::eAllowEncodeEmphasisMap )\n      result += \"AllowEncodeEmphasisMap | \";\n    if ( value & VideoSessionCreateFlagBitsKHR::eInlineSessionParameters )\n      result += \"InlineSessionParameters | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoSessionParametersCreateFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & VideoSessionParametersCreateFlagBitsKHR::eQuantizationMapCompatible )\n      result += \"QuantizationMapCompatible | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoBeginCodingFlagsKHR )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEndCodingFlagsKHR )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoCodingControlFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & VideoCodingControlFlagBitsKHR::eReset )\n      result += \"Reset | \";\n    if ( value & VideoCodingControlFlagBitsKHR::eEncodeRateControl )\n      result += \"EncodeRateControl | \";\n    if ( value & VideoCodingControlFlagBitsKHR::eEncodeQualityLevel )\n      result += \"EncodeQualityLevel | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_KHR_video_decode_queue ===\n\n  VULKAN_HPP_INLINE std::string to_string( VideoDecodeCapabilityFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & VideoDecodeCapabilityFlagBitsKHR::eDpbAndOutputCoincide )\n      result += \"DpbAndOutputCoincide | \";\n    if ( value & VideoDecodeCapabilityFlagBitsKHR::eDpbAndOutputDistinct )\n      result += \"DpbAndOutputDistinct | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoDecodeUsageFlagsKHR value )\n  {\n    if ( !value )\n      return \"Default\";\n\n    std::string result;\n    if ( value & VideoDecodeUsageFlagBitsKHR::eTranscoding )\n      result += \"Transcoding | \";\n    if ( value & VideoDecodeUsageFlagBitsKHR::eOffline )\n      result += \"Offline | \";\n    if ( value & VideoDecodeUsageFlagBitsKHR::eStreaming )\n      result += \"Streaming | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoDecodeFlagsKHR )\n  {\n    return \"{}\";\n  }\n\n  //=== VK_EXT_transform_feedback ===\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineRasterizationStateStreamCreateFlagsEXT )\n  {\n    return \"{}\";\n  }\n\n  //=== VK_KHR_video_encode_h264 ===\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeH264CapabilityFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & VideoEncodeH264CapabilityFlagBitsKHR::eHrdCompliance )\n      result += \"HrdCompliance | \";\n    if ( value & VideoEncodeH264CapabilityFlagBitsKHR::ePredictionWeightTableGenerated )\n      result += \"PredictionWeightTableGenerated | \";\n    if ( value & VideoEncodeH264CapabilityFlagBitsKHR::eRowUnalignedSlice )\n      result += \"RowUnalignedSlice | \";\n    if ( value & VideoEncodeH264CapabilityFlagBitsKHR::eDifferentSliceType )\n      result += \"DifferentSliceType | \";\n    if ( value & VideoEncodeH264CapabilityFlagBitsKHR::eBFrameInL0List )\n      result += \"BFrameInL0List | \";\n    if ( value & VideoEncodeH264CapabilityFlagBitsKHR::eBFrameInL1List )\n      result += \"BFrameInL1List | \";\n    if ( value & VideoEncodeH264CapabilityFlagBitsKHR::ePerPictureTypeMinMaxQp )\n      result += \"PerPictureTypeMinMaxQp | \";\n    if ( value & VideoEncodeH264CapabilityFlagBitsKHR::ePerSliceConstantQp )\n      result += \"PerSliceConstantQp | \";\n    if ( value & VideoEncodeH264CapabilityFlagBitsKHR::eGeneratePrefixNalu )\n      result += \"GeneratePrefixNalu | \";\n    if ( value & VideoEncodeH264CapabilityFlagBitsKHR::eMbQpDiffWraparound )\n      result += \"MbQpDiffWraparound | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeH264StdFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & VideoEncodeH264StdFlagBitsKHR::eSeparateColorPlaneFlagSet )\n      result += \"SeparateColorPlaneFlagSet | \";\n    if ( value & VideoEncodeH264StdFlagBitsKHR::eQpprimeYZeroTransformBypassFlagSet )\n      result += \"QpprimeYZeroTransformBypassFlagSet | \";\n    if ( value & VideoEncodeH264StdFlagBitsKHR::eScalingMatrixPresentFlagSet )\n      result += \"ScalingMatrixPresentFlagSet | \";\n    if ( value & VideoEncodeH264StdFlagBitsKHR::eChromaQpIndexOffset )\n      result += \"ChromaQpIndexOffset | \";\n    if ( value & VideoEncodeH264StdFlagBitsKHR::eSecondChromaQpIndexOffset )\n      result += \"SecondChromaQpIndexOffset | \";\n    if ( value & VideoEncodeH264StdFlagBitsKHR::ePicInitQpMinus26 )\n      result += \"PicInitQpMinus26 | \";\n    if ( value & VideoEncodeH264StdFlagBitsKHR::eWeightedPredFlagSet )\n      result += \"WeightedPredFlagSet | \";\n    if ( value & VideoEncodeH264StdFlagBitsKHR::eWeightedBipredIdcExplicit )\n      result += \"WeightedBipredIdcExplicit | \";\n    if ( value & VideoEncodeH264StdFlagBitsKHR::eWeightedBipredIdcImplicit )\n      result += \"WeightedBipredIdcImplicit | \";\n    if ( value & VideoEncodeH264StdFlagBitsKHR::eTransform8X8ModeFlagSet )\n      result += \"Transform8X8ModeFlagSet | \";\n    if ( value & VideoEncodeH264StdFlagBitsKHR::eDirectSpatialMvPredFlagUnset )\n      result += \"DirectSpatialMvPredFlagUnset | \";\n    if ( value & VideoEncodeH264StdFlagBitsKHR::eEntropyCodingModeFlagUnset )\n      result += \"EntropyCodingModeFlagUnset | \";\n    if ( value & VideoEncodeH264StdFlagBitsKHR::eEntropyCodingModeFlagSet )\n      result += \"EntropyCodingModeFlagSet | \";\n    if ( value & VideoEncodeH264StdFlagBitsKHR::eDirect8X8InferenceFlagUnset )\n      result += \"Direct8X8InferenceFlagUnset | \";\n    if ( value & VideoEncodeH264StdFlagBitsKHR::eConstrainedIntraPredFlagSet )\n      result += \"ConstrainedIntraPredFlagSet | \";\n    if ( value & VideoEncodeH264StdFlagBitsKHR::eDeblockingFilterDisabled )\n      result += \"DeblockingFilterDisabled | \";\n    if ( value & VideoEncodeH264StdFlagBitsKHR::eDeblockingFilterEnabled )\n      result += \"DeblockingFilterEnabled | \";\n    if ( value & VideoEncodeH264StdFlagBitsKHR::eDeblockingFilterPartial )\n      result += \"DeblockingFilterPartial | \";\n    if ( value & VideoEncodeH264StdFlagBitsKHR::eSliceQpDelta )\n      result += \"SliceQpDelta | \";\n    if ( value & VideoEncodeH264StdFlagBitsKHR::eDifferentSliceQpDelta )\n      result += \"DifferentSliceQpDelta | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeH264RateControlFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & VideoEncodeH264RateControlFlagBitsKHR::eAttemptHrdCompliance )\n      result += \"AttemptHrdCompliance | \";\n    if ( value & VideoEncodeH264RateControlFlagBitsKHR::eRegularGop )\n      result += \"RegularGop | \";\n    if ( value & VideoEncodeH264RateControlFlagBitsKHR::eReferencePatternFlat )\n      result += \"ReferencePatternFlat | \";\n    if ( value & VideoEncodeH264RateControlFlagBitsKHR::eReferencePatternDyadic )\n      result += \"ReferencePatternDyadic | \";\n    if ( value & VideoEncodeH264RateControlFlagBitsKHR::eTemporalLayerPatternDyadic )\n      result += \"TemporalLayerPatternDyadic | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_KHR_video_encode_h265 ===\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeH265CapabilityFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & VideoEncodeH265CapabilityFlagBitsKHR::eHrdCompliance )\n      result += \"HrdCompliance | \";\n    if ( value & VideoEncodeH265CapabilityFlagBitsKHR::ePredictionWeightTableGenerated )\n      result += \"PredictionWeightTableGenerated | \";\n    if ( value & VideoEncodeH265CapabilityFlagBitsKHR::eRowUnalignedSliceSegment )\n      result += \"RowUnalignedSliceSegment | \";\n    if ( value & VideoEncodeH265CapabilityFlagBitsKHR::eDifferentSliceSegmentType )\n      result += \"DifferentSliceSegmentType | \";\n    if ( value & VideoEncodeH265CapabilityFlagBitsKHR::eBFrameInL0List )\n      result += \"BFrameInL0List | \";\n    if ( value & VideoEncodeH265CapabilityFlagBitsKHR::eBFrameInL1List )\n      result += \"BFrameInL1List | \";\n    if ( value & VideoEncodeH265CapabilityFlagBitsKHR::ePerPictureTypeMinMaxQp )\n      result += \"PerPictureTypeMinMaxQp | \";\n    if ( value & VideoEncodeH265CapabilityFlagBitsKHR::ePerSliceSegmentConstantQp )\n      result += \"PerSliceSegmentConstantQp | \";\n    if ( value & VideoEncodeH265CapabilityFlagBitsKHR::eMultipleTilesPerSliceSegment )\n      result += \"MultipleTilesPerSliceSegment | \";\n    if ( value & VideoEncodeH265CapabilityFlagBitsKHR::eMultipleSliceSegmentsPerTile )\n      result += \"MultipleSliceSegmentsPerTile | \";\n    if ( value & VideoEncodeH265CapabilityFlagBitsKHR::eCuQpDiffWraparound )\n      result += \"CuQpDiffWraparound | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeH265StdFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & VideoEncodeH265StdFlagBitsKHR::eSeparateColorPlaneFlagSet )\n      result += \"SeparateColorPlaneFlagSet | \";\n    if ( value & VideoEncodeH265StdFlagBitsKHR::eSampleAdaptiveOffsetEnabledFlagSet )\n      result += \"SampleAdaptiveOffsetEnabledFlagSet | \";\n    if ( value & VideoEncodeH265StdFlagBitsKHR::eScalingListDataPresentFlagSet )\n      result += \"ScalingListDataPresentFlagSet | \";\n    if ( value & VideoEncodeH265StdFlagBitsKHR::ePcmEnabledFlagSet )\n      result += \"PcmEnabledFlagSet | \";\n    if ( value & VideoEncodeH265StdFlagBitsKHR::eSpsTemporalMvpEnabledFlagSet )\n      result += \"SpsTemporalMvpEnabledFlagSet | \";\n    if ( value & VideoEncodeH265StdFlagBitsKHR::eInitQpMinus26 )\n      result += \"InitQpMinus26 | \";\n    if ( value & VideoEncodeH265StdFlagBitsKHR::eWeightedPredFlagSet )\n      result += \"WeightedPredFlagSet | \";\n    if ( value & VideoEncodeH265StdFlagBitsKHR::eWeightedBipredFlagSet )\n      result += \"WeightedBipredFlagSet | \";\n    if ( value & VideoEncodeH265StdFlagBitsKHR::eLog2ParallelMergeLevelMinus2 )\n      result += \"Log2ParallelMergeLevelMinus2 | \";\n    if ( value & VideoEncodeH265StdFlagBitsKHR::eSignDataHidingEnabledFlagSet )\n      result += \"SignDataHidingEnabledFlagSet | \";\n    if ( value & VideoEncodeH265StdFlagBitsKHR::eTransformSkipEnabledFlagSet )\n      result += \"TransformSkipEnabledFlagSet | \";\n    if ( value & VideoEncodeH265StdFlagBitsKHR::eTransformSkipEnabledFlagUnset )\n      result += \"TransformSkipEnabledFlagUnset | \";\n    if ( value & VideoEncodeH265StdFlagBitsKHR::ePpsSliceChromaQpOffsetsPresentFlagSet )\n      result += \"PpsSliceChromaQpOffsetsPresentFlagSet | \";\n    if ( value & VideoEncodeH265StdFlagBitsKHR::eTransquantBypassEnabledFlagSet )\n      result += \"TransquantBypassEnabledFlagSet | \";\n    if ( value & VideoEncodeH265StdFlagBitsKHR::eConstrainedIntraPredFlagSet )\n      result += \"ConstrainedIntraPredFlagSet | \";\n    if ( value & VideoEncodeH265StdFlagBitsKHR::eEntropyCodingSyncEnabledFlagSet )\n      result += \"EntropyCodingSyncEnabledFlagSet | \";\n    if ( value & VideoEncodeH265StdFlagBitsKHR::eDeblockingFilterOverrideEnabledFlagSet )\n      result += \"DeblockingFilterOverrideEnabledFlagSet | \";\n    if ( value & VideoEncodeH265StdFlagBitsKHR::eDependentSliceSegmentsEnabledFlagSet )\n      result += \"DependentSliceSegmentsEnabledFlagSet | \";\n    if ( value & VideoEncodeH265StdFlagBitsKHR::eDependentSliceSegmentFlagSet )\n      result += \"DependentSliceSegmentFlagSet | \";\n    if ( value & VideoEncodeH265StdFlagBitsKHR::eSliceQpDelta )\n      result += \"SliceQpDelta | \";\n    if ( value & VideoEncodeH265StdFlagBitsKHR::eDifferentSliceQpDelta )\n      result += \"DifferentSliceQpDelta | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeH265CtbSizeFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & VideoEncodeH265CtbSizeFlagBitsKHR::e16 )\n      result += \"16 | \";\n    if ( value & VideoEncodeH265CtbSizeFlagBitsKHR::e32 )\n      result += \"32 | \";\n    if ( value & VideoEncodeH265CtbSizeFlagBitsKHR::e64 )\n      result += \"64 | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeH265TransformBlockSizeFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & VideoEncodeH265TransformBlockSizeFlagBitsKHR::e4 )\n      result += \"4 | \";\n    if ( value & VideoEncodeH265TransformBlockSizeFlagBitsKHR::e8 )\n      result += \"8 | \";\n    if ( value & VideoEncodeH265TransformBlockSizeFlagBitsKHR::e16 )\n      result += \"16 | \";\n    if ( value & VideoEncodeH265TransformBlockSizeFlagBitsKHR::e32 )\n      result += \"32 | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeH265RateControlFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & VideoEncodeH265RateControlFlagBitsKHR::eAttemptHrdCompliance )\n      result += \"AttemptHrdCompliance | \";\n    if ( value & VideoEncodeH265RateControlFlagBitsKHR::eRegularGop )\n      result += \"RegularGop | \";\n    if ( value & VideoEncodeH265RateControlFlagBitsKHR::eReferencePatternFlat )\n      result += \"ReferencePatternFlat | \";\n    if ( value & VideoEncodeH265RateControlFlagBitsKHR::eReferencePatternDyadic )\n      result += \"ReferencePatternDyadic | \";\n    if ( value & VideoEncodeH265RateControlFlagBitsKHR::eTemporalSubLayerPatternDyadic )\n      result += \"TemporalSubLayerPatternDyadic | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_KHR_video_decode_h264 ===\n\n  VULKAN_HPP_INLINE std::string to_string( VideoDecodeH264PictureLayoutFlagsKHR value )\n  {\n    if ( !value )\n      return \"Progressive\";\n\n    std::string result;\n    if ( value & VideoDecodeH264PictureLayoutFlagBitsKHR::eInterlacedInterleavedLines )\n      result += \"InterlacedInterleavedLines | \";\n    if ( value & VideoDecodeH264PictureLayoutFlagBitsKHR::eInterlacedSeparatePlanes )\n      result += \"InterlacedSeparatePlanes | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n#if defined( VK_USE_PLATFORM_GGP )\n  //=== VK_GGP_stream_descriptor_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( StreamDescriptorSurfaceCreateFlagsGGP )\n  {\n    return \"{}\";\n  }\n#endif /*VK_USE_PLATFORM_GGP*/\n\n  //=== VK_NV_external_memory_capabilities ===\n\n  VULKAN_HPP_INLINE std::string to_string( ExternalMemoryHandleTypeFlagsNV value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & ExternalMemoryHandleTypeFlagBitsNV::eOpaqueWin32 )\n      result += \"OpaqueWin32 | \";\n    if ( value & ExternalMemoryHandleTypeFlagBitsNV::eOpaqueWin32Kmt )\n      result += \"OpaqueWin32Kmt | \";\n    if ( value & ExternalMemoryHandleTypeFlagBitsNV::eD3D11Image )\n      result += \"D3D11Image | \";\n    if ( value & ExternalMemoryHandleTypeFlagBitsNV::eD3D11ImageKmt )\n      result += \"D3D11ImageKmt | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ExternalMemoryFeatureFlagsNV value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & ExternalMemoryFeatureFlagBitsNV::eDedicatedOnly )\n      result += \"DedicatedOnly | \";\n    if ( value & ExternalMemoryFeatureFlagBitsNV::eExportable )\n      result += \"Exportable | \";\n    if ( value & ExternalMemoryFeatureFlagBitsNV::eImportable )\n      result += \"Importable | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n#if defined( VK_USE_PLATFORM_VI_NN )\n  //=== VK_NN_vi_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( ViSurfaceCreateFlagsNN )\n  {\n    return \"{}\";\n  }\n#endif /*VK_USE_PLATFORM_VI_NN*/\n\n  //=== VK_EXT_conditional_rendering ===\n\n  VULKAN_HPP_INLINE std::string to_string( ConditionalRenderingFlagsEXT value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & ConditionalRenderingFlagBitsEXT::eInverted )\n      result += \"Inverted | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_EXT_display_surface_counter ===\n\n  VULKAN_HPP_INLINE std::string to_string( SurfaceCounterFlagsEXT value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & SurfaceCounterFlagBitsEXT::eVblank )\n      result += \"Vblank | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_NV_viewport_swizzle ===\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineViewportSwizzleStateCreateFlagsNV )\n  {\n    return \"{}\";\n  }\n\n  //=== VK_EXT_discard_rectangles ===\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineDiscardRectangleStateCreateFlagsEXT )\n  {\n    return \"{}\";\n  }\n\n  //=== VK_EXT_conservative_rasterization ===\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineRasterizationConservativeStateCreateFlagsEXT )\n  {\n    return \"{}\";\n  }\n\n  //=== VK_EXT_depth_clip_enable ===\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineRasterizationDepthClipStateCreateFlagsEXT )\n  {\n    return \"{}\";\n  }\n\n  //=== VK_KHR_performance_query ===\n\n  VULKAN_HPP_INLINE std::string to_string( PerformanceCounterDescriptionFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & PerformanceCounterDescriptionFlagBitsKHR::ePerformanceImpacting )\n      result += \"PerformanceImpacting | \";\n    if ( value & PerformanceCounterDescriptionFlagBitsKHR::eConcurrentlyImpacted )\n      result += \"ConcurrentlyImpacted | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( AcquireProfilingLockFlagsKHR )\n  {\n    return \"{}\";\n  }\n\n#if defined( VK_USE_PLATFORM_IOS_MVK )\n  //=== VK_MVK_ios_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( IOSSurfaceCreateFlagsMVK )\n  {\n    return \"{}\";\n  }\n#endif /*VK_USE_PLATFORM_IOS_MVK*/\n\n#if defined( VK_USE_PLATFORM_MACOS_MVK )\n  //=== VK_MVK_macos_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( MacOSSurfaceCreateFlagsMVK )\n  {\n    return \"{}\";\n  }\n#endif /*VK_USE_PLATFORM_MACOS_MVK*/\n\n  //=== VK_EXT_debug_utils ===\n\n  VULKAN_HPP_INLINE std::string to_string( DebugUtilsMessageSeverityFlagsEXT value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & DebugUtilsMessageSeverityFlagBitsEXT::eVerbose )\n      result += \"Verbose | \";\n    if ( value & DebugUtilsMessageSeverityFlagBitsEXT::eInfo )\n      result += \"Info | \";\n    if ( value & DebugUtilsMessageSeverityFlagBitsEXT::eWarning )\n      result += \"Warning | \";\n    if ( value & DebugUtilsMessageSeverityFlagBitsEXT::eError )\n      result += \"Error | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DebugUtilsMessageTypeFlagsEXT value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & DebugUtilsMessageTypeFlagBitsEXT::eGeneral )\n      result += \"General | \";\n    if ( value & DebugUtilsMessageTypeFlagBitsEXT::eValidation )\n      result += \"Validation | \";\n    if ( value & DebugUtilsMessageTypeFlagBitsEXT::ePerformance )\n      result += \"Performance | \";\n    if ( value & DebugUtilsMessageTypeFlagBitsEXT::eDeviceAddressBinding )\n      result += \"DeviceAddressBinding | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DebugUtilsMessengerCallbackDataFlagsEXT )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DebugUtilsMessengerCreateFlagsEXT )\n  {\n    return \"{}\";\n  }\n\n  //=== VK_NV_fragment_coverage_to_color ===\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineCoverageToColorStateCreateFlagsNV )\n  {\n    return \"{}\";\n  }\n\n  //=== VK_KHR_acceleration_structure ===\n\n  VULKAN_HPP_INLINE std::string to_string( GeometryFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & GeometryFlagBitsKHR::eOpaque )\n      result += \"Opaque | \";\n    if ( value & GeometryFlagBitsKHR::eNoDuplicateAnyHitInvocation )\n      result += \"NoDuplicateAnyHitInvocation | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( GeometryInstanceFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & GeometryInstanceFlagBitsKHR::eTriangleFacingCullDisable )\n      result += \"TriangleFacingCullDisable | \";\n    if ( value & GeometryInstanceFlagBitsKHR::eTriangleFlipFacing )\n      result += \"TriangleFlipFacing | \";\n    if ( value & GeometryInstanceFlagBitsKHR::eForceOpaque )\n      result += \"ForceOpaque | \";\n    if ( value & GeometryInstanceFlagBitsKHR::eForceNoOpaque )\n      result += \"ForceNoOpaque | \";\n    if ( value & GeometryInstanceFlagBitsKHR::eForceOpacityMicromap2StateEXT )\n      result += \"ForceOpacityMicromap2StateEXT | \";\n    if ( value & GeometryInstanceFlagBitsKHR::eDisableOpacityMicromapsEXT )\n      result += \"DisableOpacityMicromapsEXT | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( BuildAccelerationStructureFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & BuildAccelerationStructureFlagBitsKHR::eAllowUpdate )\n      result += \"AllowUpdate | \";\n    if ( value & BuildAccelerationStructureFlagBitsKHR::eAllowCompaction )\n      result += \"AllowCompaction | \";\n    if ( value & BuildAccelerationStructureFlagBitsKHR::ePreferFastTrace )\n      result += \"PreferFastTrace | \";\n    if ( value & BuildAccelerationStructureFlagBitsKHR::ePreferFastBuild )\n      result += \"PreferFastBuild | \";\n    if ( value & BuildAccelerationStructureFlagBitsKHR::eLowMemory )\n      result += \"LowMemory | \";\n    if ( value & BuildAccelerationStructureFlagBitsKHR::eMotionNV )\n      result += \"MotionNV | \";\n    if ( value & BuildAccelerationStructureFlagBitsKHR::eAllowOpacityMicromapUpdateEXT )\n      result += \"AllowOpacityMicromapUpdateEXT | \";\n    if ( value & BuildAccelerationStructureFlagBitsKHR::eAllowDisableOpacityMicromapsEXT )\n      result += \"AllowDisableOpacityMicromapsEXT | \";\n    if ( value & BuildAccelerationStructureFlagBitsKHR::eAllowOpacityMicromapDataUpdateEXT )\n      result += \"AllowOpacityMicromapDataUpdateEXT | \";\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n    if ( value & BuildAccelerationStructureFlagBitsKHR::eAllowDisplacementMicromapUpdateNV )\n      result += \"AllowDisplacementMicromapUpdateNV | \";\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n    if ( value & BuildAccelerationStructureFlagBitsKHR::eAllowDataAccess )\n      result += \"AllowDataAccess | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( AccelerationStructureCreateFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & AccelerationStructureCreateFlagBitsKHR::eDeviceAddressCaptureReplay )\n      result += \"DeviceAddressCaptureReplay | \";\n    if ( value & AccelerationStructureCreateFlagBitsKHR::eDescriptorBufferCaptureReplayEXT )\n      result += \"DescriptorBufferCaptureReplayEXT | \";\n    if ( value & AccelerationStructureCreateFlagBitsKHR::eMotionNV )\n      result += \"MotionNV | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_NV_framebuffer_mixed_samples ===\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineCoverageModulationStateCreateFlagsNV )\n  {\n    return \"{}\";\n  }\n\n  //=== VK_EXT_validation_cache ===\n\n  VULKAN_HPP_INLINE std::string to_string( ValidationCacheCreateFlagsEXT )\n  {\n    return \"{}\";\n  }\n\n  //=== VK_AMD_pipeline_compiler_control ===\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineCompilerControlFlagsAMD )\n  {\n    return \"{}\";\n  }\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_imagepipe_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( ImagePipeSurfaceCreateFlagsFUCHSIA )\n  {\n    return \"{}\";\n  }\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  //=== VK_EXT_metal_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( MetalSurfaceCreateFlagsEXT )\n  {\n    return \"{}\";\n  }\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n  //=== VK_AMD_shader_core_properties2 ===\n\n  VULKAN_HPP_INLINE std::string to_string( ShaderCorePropertiesFlagsAMD )\n  {\n    return \"{}\";\n  }\n\n  //=== VK_NV_coverage_reduction_mode ===\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineCoverageReductionStateCreateFlagsNV )\n  {\n    return \"{}\";\n  }\n\n  //=== VK_EXT_headless_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( HeadlessSurfaceCreateFlagsEXT )\n  {\n    return \"{}\";\n  }\n\n  //=== VK_EXT_surface_maintenance1 ===\n\n  VULKAN_HPP_INLINE std::string to_string( PresentScalingFlagsEXT value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & PresentScalingFlagBitsEXT::eOneToOne )\n      result += \"OneToOne | \";\n    if ( value & PresentScalingFlagBitsEXT::eAspectRatioStretch )\n      result += \"AspectRatioStretch | \";\n    if ( value & PresentScalingFlagBitsEXT::eStretch )\n      result += \"Stretch | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PresentGravityFlagsEXT value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & PresentGravityFlagBitsEXT::eMin )\n      result += \"Min | \";\n    if ( value & PresentGravityFlagBitsEXT::eMax )\n      result += \"Max | \";\n    if ( value & PresentGravityFlagBitsEXT::eCentered )\n      result += \"Centered | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_NV_device_generated_commands ===\n\n  VULKAN_HPP_INLINE std::string to_string( IndirectStateFlagsNV value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & IndirectStateFlagBitsNV::eFlagFrontface )\n      result += \"FlagFrontface | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( IndirectCommandsLayoutUsageFlagsNV value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & IndirectCommandsLayoutUsageFlagBitsNV::eExplicitPreprocess )\n      result += \"ExplicitPreprocess | \";\n    if ( value & IndirectCommandsLayoutUsageFlagBitsNV::eIndexedSequences )\n      result += \"IndexedSequences | \";\n    if ( value & IndirectCommandsLayoutUsageFlagBitsNV::eUnorderedSequences )\n      result += \"UnorderedSequences | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_EXT_device_memory_report ===\n\n  VULKAN_HPP_INLINE std::string to_string( DeviceMemoryReportFlagsEXT )\n  {\n    return \"{}\";\n  }\n\n  //=== VK_KHR_video_encode_queue ===\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & VideoEncodeFlagBitsKHR::eWithQuantizationDeltaMap )\n      result += \"WithQuantizationDeltaMap | \";\n    if ( value & VideoEncodeFlagBitsKHR::eWithEmphasisMap )\n      result += \"WithEmphasisMap | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeCapabilityFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & VideoEncodeCapabilityFlagBitsKHR::ePrecedingExternallyEncodedBytes )\n      result += \"PrecedingExternallyEncodedBytes | \";\n    if ( value & VideoEncodeCapabilityFlagBitsKHR::eInsufficientBitstreamBufferRangeDetection )\n      result += \"InsufficientBitstreamBufferRangeDetection | \";\n    if ( value & VideoEncodeCapabilityFlagBitsKHR::eQuantizationDeltaMap )\n      result += \"QuantizationDeltaMap | \";\n    if ( value & VideoEncodeCapabilityFlagBitsKHR::eEmphasisMap )\n      result += \"EmphasisMap | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeFeedbackFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & VideoEncodeFeedbackFlagBitsKHR::eBitstreamBufferOffset )\n      result += \"BitstreamBufferOffset | \";\n    if ( value & VideoEncodeFeedbackFlagBitsKHR::eBitstreamBytesWritten )\n      result += \"BitstreamBytesWritten | \";\n    if ( value & VideoEncodeFeedbackFlagBitsKHR::eBitstreamHasOverrides )\n      result += \"BitstreamHasOverrides | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeUsageFlagsKHR value )\n  {\n    if ( !value )\n      return \"Default\";\n\n    std::string result;\n    if ( value & VideoEncodeUsageFlagBitsKHR::eTranscoding )\n      result += \"Transcoding | \";\n    if ( value & VideoEncodeUsageFlagBitsKHR::eStreaming )\n      result += \"Streaming | \";\n    if ( value & VideoEncodeUsageFlagBitsKHR::eRecording )\n      result += \"Recording | \";\n    if ( value & VideoEncodeUsageFlagBitsKHR::eConferencing )\n      result += \"Conferencing | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeContentFlagsKHR value )\n  {\n    if ( !value )\n      return \"Default\";\n\n    std::string result;\n    if ( value & VideoEncodeContentFlagBitsKHR::eCamera )\n      result += \"Camera | \";\n    if ( value & VideoEncodeContentFlagBitsKHR::eDesktop )\n      result += \"Desktop | \";\n    if ( value & VideoEncodeContentFlagBitsKHR::eRendered )\n      result += \"Rendered | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeRateControlFlagsKHR )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeRateControlModeFlagsKHR value )\n  {\n    if ( !value )\n      return \"Default\";\n\n    std::string result;\n    if ( value & VideoEncodeRateControlModeFlagBitsKHR::eDisabled )\n      result += \"Disabled | \";\n    if ( value & VideoEncodeRateControlModeFlagBitsKHR::eCbr )\n      result += \"Cbr | \";\n    if ( value & VideoEncodeRateControlModeFlagBitsKHR::eVbr )\n      result += \"Vbr | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_NV_device_diagnostics_config ===\n\n  VULKAN_HPP_INLINE std::string to_string( DeviceDiagnosticsConfigFlagsNV value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & DeviceDiagnosticsConfigFlagBitsNV::eEnableShaderDebugInfo )\n      result += \"EnableShaderDebugInfo | \";\n    if ( value & DeviceDiagnosticsConfigFlagBitsNV::eEnableResourceTracking )\n      result += \"EnableResourceTracking | \";\n    if ( value & DeviceDiagnosticsConfigFlagBitsNV::eEnableAutomaticCheckpoints )\n      result += \"EnableAutomaticCheckpoints | \";\n    if ( value & DeviceDiagnosticsConfigFlagBitsNV::eEnableShaderErrorReporting )\n      result += \"EnableShaderErrorReporting | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  //=== VK_EXT_metal_objects ===\n\n  VULKAN_HPP_INLINE std::string to_string( ExportMetalObjectTypeFlagsEXT value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & ExportMetalObjectTypeFlagBitsEXT::eMetalDevice )\n      result += \"MetalDevice | \";\n    if ( value & ExportMetalObjectTypeFlagBitsEXT::eMetalCommandQueue )\n      result += \"MetalCommandQueue | \";\n    if ( value & ExportMetalObjectTypeFlagBitsEXT::eMetalBuffer )\n      result += \"MetalBuffer | \";\n    if ( value & ExportMetalObjectTypeFlagBitsEXT::eMetalTexture )\n      result += \"MetalTexture | \";\n    if ( value & ExportMetalObjectTypeFlagBitsEXT::eMetalIosurface )\n      result += \"MetalIosurface | \";\n    if ( value & ExportMetalObjectTypeFlagBitsEXT::eMetalSharedEvent )\n      result += \"MetalSharedEvent | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n  //=== VK_EXT_graphics_pipeline_library ===\n\n  VULKAN_HPP_INLINE std::string to_string( GraphicsPipelineLibraryFlagsEXT value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & GraphicsPipelineLibraryFlagBitsEXT::eVertexInputInterface )\n      result += \"VertexInputInterface | \";\n    if ( value & GraphicsPipelineLibraryFlagBitsEXT::ePreRasterizationShaders )\n      result += \"PreRasterizationShaders | \";\n    if ( value & GraphicsPipelineLibraryFlagBitsEXT::eFragmentShader )\n      result += \"FragmentShader | \";\n    if ( value & GraphicsPipelineLibraryFlagBitsEXT::eFragmentOutputInterface )\n      result += \"FragmentOutputInterface | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_NV_ray_tracing_motion_blur ===\n\n  VULKAN_HPP_INLINE std::string to_string( AccelerationStructureMotionInfoFlagsNV )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( AccelerationStructureMotionInstanceFlagsNV )\n  {\n    return \"{}\";\n  }\n\n  //=== VK_EXT_image_compression_control ===\n\n  VULKAN_HPP_INLINE std::string to_string( ImageCompressionFlagsEXT value )\n  {\n    if ( !value )\n      return \"Default\";\n\n    std::string result;\n    if ( value & ImageCompressionFlagBitsEXT::eFixedRateDefault )\n      result += \"FixedRateDefault | \";\n    if ( value & ImageCompressionFlagBitsEXT::eFixedRateExplicit )\n      result += \"FixedRateExplicit | \";\n    if ( value & ImageCompressionFlagBitsEXT::eDisabled )\n      result += \"Disabled | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ImageCompressionFixedRateFlagsEXT value )\n  {\n    if ( !value )\n      return \"None\";\n\n    std::string result;\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e1Bpc )\n      result += \"1Bpc | \";\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e2Bpc )\n      result += \"2Bpc | \";\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e3Bpc )\n      result += \"3Bpc | \";\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e4Bpc )\n      result += \"4Bpc | \";\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e5Bpc )\n      result += \"5Bpc | \";\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e6Bpc )\n      result += \"6Bpc | \";\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e7Bpc )\n      result += \"7Bpc | \";\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e8Bpc )\n      result += \"8Bpc | \";\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e9Bpc )\n      result += \"9Bpc | \";\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e10Bpc )\n      result += \"10Bpc | \";\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e11Bpc )\n      result += \"11Bpc | \";\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e12Bpc )\n      result += \"12Bpc | \";\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e13Bpc )\n      result += \"13Bpc | \";\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e14Bpc )\n      result += \"14Bpc | \";\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e15Bpc )\n      result += \"15Bpc | \";\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e16Bpc )\n      result += \"16Bpc | \";\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e17Bpc )\n      result += \"17Bpc | \";\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e18Bpc )\n      result += \"18Bpc | \";\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e19Bpc )\n      result += \"19Bpc | \";\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e20Bpc )\n      result += \"20Bpc | \";\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e21Bpc )\n      result += \"21Bpc | \";\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e22Bpc )\n      result += \"22Bpc | \";\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e23Bpc )\n      result += \"23Bpc | \";\n    if ( value & ImageCompressionFixedRateFlagBitsEXT::e24Bpc )\n      result += \"24Bpc | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n  //=== VK_EXT_directfb_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( DirectFBSurfaceCreateFlagsEXT )\n  {\n    return \"{}\";\n  }\n#endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n\n  //=== VK_EXT_device_address_binding_report ===\n\n  VULKAN_HPP_INLINE std::string to_string( DeviceAddressBindingFlagsEXT value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & DeviceAddressBindingFlagBitsEXT::eInternalObject )\n      result += \"InternalObject | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_buffer_collection ===\n\n  VULKAN_HPP_INLINE std::string to_string( ImageFormatConstraintsFlagsFUCHSIA )\n  {\n    return \"{}\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ImageConstraintsInfoFlagsFUCHSIA value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & ImageConstraintsInfoFlagBitsFUCHSIA::eCpuReadRarely )\n      result += \"CpuReadRarely | \";\n    if ( value & ImageConstraintsInfoFlagBitsFUCHSIA::eCpuReadOften )\n      result += \"CpuReadOften | \";\n    if ( value & ImageConstraintsInfoFlagBitsFUCHSIA::eCpuWriteRarely )\n      result += \"CpuWriteRarely | \";\n    if ( value & ImageConstraintsInfoFlagBitsFUCHSIA::eCpuWriteOften )\n      result += \"CpuWriteOften | \";\n    if ( value & ImageConstraintsInfoFlagBitsFUCHSIA::eProtectedOptional )\n      result += \"ProtectedOptional | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  //=== VK_EXT_frame_boundary ===\n\n  VULKAN_HPP_INLINE std::string to_string( FrameBoundaryFlagsEXT value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & FrameBoundaryFlagBitsEXT::eFrameEnd )\n      result += \"FrameEnd | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n  //=== VK_QNX_screen_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( ScreenSurfaceCreateFlagsQNX )\n  {\n    return \"{}\";\n  }\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n  //=== VK_EXT_opacity_micromap ===\n\n  VULKAN_HPP_INLINE std::string to_string( BuildMicromapFlagsEXT value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & BuildMicromapFlagBitsEXT::ePreferFastTrace )\n      result += \"PreferFastTrace | \";\n    if ( value & BuildMicromapFlagBitsEXT::ePreferFastBuild )\n      result += \"PreferFastBuild | \";\n    if ( value & BuildMicromapFlagBitsEXT::eAllowCompaction )\n      result += \"AllowCompaction | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( MicromapCreateFlagsEXT value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & MicromapCreateFlagBitsEXT::eDeviceAddressCaptureReplay )\n      result += \"DeviceAddressCaptureReplay | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_ARM_scheduling_controls ===\n\n  VULKAN_HPP_INLINE std::string to_string( PhysicalDeviceSchedulingControlsFlagsARM value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & PhysicalDeviceSchedulingControlsFlagBitsARM::eShaderCoreCount )\n      result += \"ShaderCoreCount | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_NV_memory_decompression ===\n\n  VULKAN_HPP_INLINE std::string to_string( MemoryDecompressionMethodFlagsNV value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & MemoryDecompressionMethodFlagBitsNV::eGdeflate10 )\n      result += \"Gdeflate10 | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_LUNARG_direct_driver_loading ===\n\n  VULKAN_HPP_INLINE std::string to_string( DirectDriverLoadingFlagsLUNARG )\n  {\n    return \"{}\";\n  }\n\n  //=== VK_NV_optical_flow ===\n\n  VULKAN_HPP_INLINE std::string to_string( OpticalFlowUsageFlagsNV value )\n  {\n    if ( !value )\n      return \"Unknown\";\n\n    std::string result;\n    if ( value & OpticalFlowUsageFlagBitsNV::eInput )\n      result += \"Input | \";\n    if ( value & OpticalFlowUsageFlagBitsNV::eOutput )\n      result += \"Output | \";\n    if ( value & OpticalFlowUsageFlagBitsNV::eHint )\n      result += \"Hint | \";\n    if ( value & OpticalFlowUsageFlagBitsNV::eCost )\n      result += \"Cost | \";\n    if ( value & OpticalFlowUsageFlagBitsNV::eGlobalFlow )\n      result += \"GlobalFlow | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( OpticalFlowGridSizeFlagsNV value )\n  {\n    if ( !value )\n      return \"Unknown\";\n\n    std::string result;\n    if ( value & OpticalFlowGridSizeFlagBitsNV::e1X1 )\n      result += \"1X1 | \";\n    if ( value & OpticalFlowGridSizeFlagBitsNV::e2X2 )\n      result += \"2X2 | \";\n    if ( value & OpticalFlowGridSizeFlagBitsNV::e4X4 )\n      result += \"4X4 | \";\n    if ( value & OpticalFlowGridSizeFlagBitsNV::e8X8 )\n      result += \"8X8 | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( OpticalFlowSessionCreateFlagsNV value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & OpticalFlowSessionCreateFlagBitsNV::eEnableHint )\n      result += \"EnableHint | \";\n    if ( value & OpticalFlowSessionCreateFlagBitsNV::eEnableCost )\n      result += \"EnableCost | \";\n    if ( value & OpticalFlowSessionCreateFlagBitsNV::eEnableGlobalFlow )\n      result += \"EnableGlobalFlow | \";\n    if ( value & OpticalFlowSessionCreateFlagBitsNV::eAllowRegions )\n      result += \"AllowRegions | \";\n    if ( value & OpticalFlowSessionCreateFlagBitsNV::eBothDirections )\n      result += \"BothDirections | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( OpticalFlowExecuteFlagsNV value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & OpticalFlowExecuteFlagBitsNV::eDisableTemporalHints )\n      result += \"DisableTemporalHints | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_EXT_shader_object ===\n\n  VULKAN_HPP_INLINE std::string to_string( ShaderCreateFlagsEXT value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & ShaderCreateFlagBitsEXT::eLinkStage )\n      result += \"LinkStage | \";\n    if ( value & ShaderCreateFlagBitsEXT::eAllowVaryingSubgroupSize )\n      result += \"AllowVaryingSubgroupSize | \";\n    if ( value & ShaderCreateFlagBitsEXT::eRequireFullSubgroups )\n      result += \"RequireFullSubgroups | \";\n    if ( value & ShaderCreateFlagBitsEXT::eNoTaskShader )\n      result += \"NoTaskShader | \";\n    if ( value & ShaderCreateFlagBitsEXT::eDispatchBase )\n      result += \"DispatchBase | \";\n    if ( value & ShaderCreateFlagBitsEXT::eFragmentShadingRateAttachment )\n      result += \"FragmentShadingRateAttachment | \";\n    if ( value & ShaderCreateFlagBitsEXT::eFragmentDensityMapAttachment )\n      result += \"FragmentDensityMapAttachment | \";\n    if ( value & ShaderCreateFlagBitsEXT::eIndirectBindable )\n      result += \"IndirectBindable | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_KHR_video_encode_av1 ===\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeAV1CapabilityFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & VideoEncodeAV1CapabilityFlagBitsKHR::ePerRateControlGroupMinMaxQIndex )\n      result += \"PerRateControlGroupMinMaxQIndex | \";\n    if ( value & VideoEncodeAV1CapabilityFlagBitsKHR::eGenerateObuExtensionHeader )\n      result += \"GenerateObuExtensionHeader | \";\n    if ( value & VideoEncodeAV1CapabilityFlagBitsKHR::ePrimaryReferenceCdfOnly )\n      result += \"PrimaryReferenceCdfOnly | \";\n    if ( value & VideoEncodeAV1CapabilityFlagBitsKHR::eFrameSizeOverride )\n      result += \"FrameSizeOverride | \";\n    if ( value & VideoEncodeAV1CapabilityFlagBitsKHR::eMotionVectorScaling )\n      result += \"MotionVectorScaling | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeAV1StdFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & VideoEncodeAV1StdFlagBitsKHR::eUniformTileSpacingFlagSet )\n      result += \"UniformTileSpacingFlagSet | \";\n    if ( value & VideoEncodeAV1StdFlagBitsKHR::eSkipModePresentUnset )\n      result += \"SkipModePresentUnset | \";\n    if ( value & VideoEncodeAV1StdFlagBitsKHR::ePrimaryRefFrame )\n      result += \"PrimaryRefFrame | \";\n    if ( value & VideoEncodeAV1StdFlagBitsKHR::eDeltaQ )\n      result += \"DeltaQ | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeAV1SuperblockSizeFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & VideoEncodeAV1SuperblockSizeFlagBitsKHR::e64 )\n      result += \"64 | \";\n    if ( value & VideoEncodeAV1SuperblockSizeFlagBitsKHR::e128 )\n      result += \"128 | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeAV1RateControlFlagsKHR value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & VideoEncodeAV1RateControlFlagBitsKHR::eRegularGop )\n      result += \"RegularGop | \";\n    if ( value & VideoEncodeAV1RateControlFlagBitsKHR::eTemporalLayerPatternDyadic )\n      result += \"TemporalLayerPatternDyadic | \";\n    if ( value & VideoEncodeAV1RateControlFlagBitsKHR::eReferencePatternFlat )\n      result += \"ReferencePatternFlat | \";\n    if ( value & VideoEncodeAV1RateControlFlagBitsKHR::eReferencePatternDyadic )\n      result += \"ReferencePatternDyadic | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_NV_cluster_acceleration_structure ===\n\n  VULKAN_HPP_INLINE std::string to_string( ClusterAccelerationStructureClusterFlagsNV value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & ClusterAccelerationStructureClusterFlagBitsNV::eAllowDisableOpacityMicromaps )\n      result += \"AllowDisableOpacityMicromaps | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ClusterAccelerationStructureGeometryFlagsNV value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & ClusterAccelerationStructureGeometryFlagBitsNV::eCullDisable )\n      result += \"CullDisable | \";\n    if ( value & ClusterAccelerationStructureGeometryFlagBitsNV::eNoDuplicateAnyhitInvocation )\n      result += \"NoDuplicateAnyhitInvocation | \";\n    if ( value & ClusterAccelerationStructureGeometryFlagBitsNV::eOpaque )\n      result += \"Opaque | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ClusterAccelerationStructureAddressResolutionFlagsNV value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & ClusterAccelerationStructureAddressResolutionFlagBitsNV::eIndirectedDstImplicitData )\n      result += \"IndirectedDstImplicitData | \";\n    if ( value & ClusterAccelerationStructureAddressResolutionFlagBitsNV::eIndirectedScratchData )\n      result += \"IndirectedScratchData | \";\n    if ( value & ClusterAccelerationStructureAddressResolutionFlagBitsNV::eIndirectedDstAddressArray )\n      result += \"IndirectedDstAddressArray | \";\n    if ( value & ClusterAccelerationStructureAddressResolutionFlagBitsNV::eIndirectedDstSizesArray )\n      result += \"IndirectedDstSizesArray | \";\n    if ( value & ClusterAccelerationStructureAddressResolutionFlagBitsNV::eIndirectedSrcInfosArray )\n      result += \"IndirectedSrcInfosArray | \";\n    if ( value & ClusterAccelerationStructureAddressResolutionFlagBitsNV::eIndirectedSrcInfosCount )\n      result += \"IndirectedSrcInfosCount | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ClusterAccelerationStructureIndexFormatFlagsNV value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & ClusterAccelerationStructureIndexFormatFlagBitsNV::e8 )\n      result += \"8 | \";\n    if ( value & ClusterAccelerationStructureIndexFormatFlagBitsNV::e16 )\n      result += \"16 | \";\n    if ( value & ClusterAccelerationStructureIndexFormatFlagBitsNV::e32 )\n      result += \"32 | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_NV_partitioned_acceleration_structure ===\n\n  VULKAN_HPP_INLINE std::string to_string( PartitionedAccelerationStructureInstanceFlagsNV value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & PartitionedAccelerationStructureInstanceFlagBitsNV::eFlagTriangleFacingCullDisable )\n      result += \"FlagTriangleFacingCullDisable | \";\n    if ( value & PartitionedAccelerationStructureInstanceFlagBitsNV::eFlagTriangleFlipFacing )\n      result += \"FlagTriangleFlipFacing | \";\n    if ( value & PartitionedAccelerationStructureInstanceFlagBitsNV::eFlagForceOpaque )\n      result += \"FlagForceOpaque | \";\n    if ( value & PartitionedAccelerationStructureInstanceFlagBitsNV::eFlagForceNoOpaque )\n      result += \"FlagForceNoOpaque | \";\n    if ( value & PartitionedAccelerationStructureInstanceFlagBitsNV::eFlagEnableExplicitBoundingBox )\n      result += \"FlagEnableExplicitBoundingBox | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_EXT_device_generated_commands ===\n\n  VULKAN_HPP_INLINE std::string to_string( IndirectCommandsLayoutUsageFlagsEXT value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & IndirectCommandsLayoutUsageFlagBitsEXT::eExplicitPreprocess )\n      result += \"ExplicitPreprocess | \";\n    if ( value & IndirectCommandsLayoutUsageFlagBitsEXT::eUnorderedSequences )\n      result += \"UnorderedSequences | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( IndirectCommandsInputModeFlagsEXT value )\n  {\n    if ( !value )\n      return \"{}\";\n\n    std::string result;\n    if ( value & IndirectCommandsInputModeFlagBitsEXT::eVulkanIndexBuffer )\n      result += \"VulkanIndexBuffer | \";\n    if ( value & IndirectCommandsInputModeFlagBitsEXT::eDxgiIndexBuffer )\n      result += \"DxgiIndexBuffer | \";\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=== VK_KHR_maintenance8 ===\n\n  VULKAN_HPP_INLINE std::string to_string( AccessFlags3KHR value )\n  {\n    if ( !value )\n      return \"None\";\n\n    std::string result;\n\n    return \"{ \" + result.substr( 0, result.size() - 3 ) + \" }\";\n  }\n\n  //=======================\n  //=== ENUMs to_string ===\n  //=======================\n\n  VULKAN_HPP_INLINE std::string toHexString( uint32_t value )\n  {\n#if __cpp_lib_format\n    return std::format( \"{:x}\", value );\n#else\n    std::stringstream stream;\n    stream << std::hex << value;\n    return stream.str();\n#endif\n  }\n\n  //=== VK_VERSION_1_0 ===\n\n  VULKAN_HPP_INLINE std::string to_string( Result value )\n  {\n    switch ( value )\n    {\n      case Result::eSuccess: return \"Success\";\n      case Result::eNotReady: return \"NotReady\";\n      case Result::eTimeout: return \"Timeout\";\n      case Result::eEventSet: return \"EventSet\";\n      case Result::eEventReset: return \"EventReset\";\n      case Result::eIncomplete: return \"Incomplete\";\n      case Result::eErrorOutOfHostMemory: return \"ErrorOutOfHostMemory\";\n      case Result::eErrorOutOfDeviceMemory: return \"ErrorOutOfDeviceMemory\";\n      case Result::eErrorInitializationFailed: return \"ErrorInitializationFailed\";\n      case Result::eErrorDeviceLost: return \"ErrorDeviceLost\";\n      case Result::eErrorMemoryMapFailed: return \"ErrorMemoryMapFailed\";\n      case Result::eErrorLayerNotPresent: return \"ErrorLayerNotPresent\";\n      case Result::eErrorExtensionNotPresent: return \"ErrorExtensionNotPresent\";\n      case Result::eErrorFeatureNotPresent: return \"ErrorFeatureNotPresent\";\n      case Result::eErrorIncompatibleDriver: return \"ErrorIncompatibleDriver\";\n      case Result::eErrorTooManyObjects: return \"ErrorTooManyObjects\";\n      case Result::eErrorFormatNotSupported: return \"ErrorFormatNotSupported\";\n      case Result::eErrorFragmentedPool: return \"ErrorFragmentedPool\";\n      case Result::eErrorUnknown: return \"ErrorUnknown\";\n      case Result::eErrorOutOfPoolMemory: return \"ErrorOutOfPoolMemory\";\n      case Result::eErrorInvalidExternalHandle: return \"ErrorInvalidExternalHandle\";\n      case Result::eErrorFragmentation: return \"ErrorFragmentation\";\n      case Result::eErrorInvalidOpaqueCaptureAddress: return \"ErrorInvalidOpaqueCaptureAddress\";\n      case Result::ePipelineCompileRequired: return \"PipelineCompileRequired\";\n      case Result::eErrorNotPermitted: return \"ErrorNotPermitted\";\n      case Result::eErrorSurfaceLostKHR: return \"ErrorSurfaceLostKHR\";\n      case Result::eErrorNativeWindowInUseKHR: return \"ErrorNativeWindowInUseKHR\";\n      case Result::eSuboptimalKHR: return \"SuboptimalKHR\";\n      case Result::eErrorOutOfDateKHR: return \"ErrorOutOfDateKHR\";\n      case Result::eErrorIncompatibleDisplayKHR: return \"ErrorIncompatibleDisplayKHR\";\n      case Result::eErrorValidationFailedEXT: return \"ErrorValidationFailedEXT\";\n      case Result::eErrorInvalidShaderNV: return \"ErrorInvalidShaderNV\";\n      case Result::eErrorImageUsageNotSupportedKHR: return \"ErrorImageUsageNotSupportedKHR\";\n      case Result::eErrorVideoPictureLayoutNotSupportedKHR: return \"ErrorVideoPictureLayoutNotSupportedKHR\";\n      case Result::eErrorVideoProfileOperationNotSupportedKHR: return \"ErrorVideoProfileOperationNotSupportedKHR\";\n      case Result::eErrorVideoProfileFormatNotSupportedKHR: return \"ErrorVideoProfileFormatNotSupportedKHR\";\n      case Result::eErrorVideoProfileCodecNotSupportedKHR: return \"ErrorVideoProfileCodecNotSupportedKHR\";\n      case Result::eErrorVideoStdVersionNotSupportedKHR: return \"ErrorVideoStdVersionNotSupportedKHR\";\n      case Result::eErrorInvalidDrmFormatModifierPlaneLayoutEXT: return \"ErrorInvalidDrmFormatModifierPlaneLayoutEXT\";\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      case Result::eErrorFullScreenExclusiveModeLostEXT: return \"ErrorFullScreenExclusiveModeLostEXT\";\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      case Result::eThreadIdleKHR: return \"ThreadIdleKHR\";\n      case Result::eThreadDoneKHR: return \"ThreadDoneKHR\";\n      case Result::eOperationDeferredKHR: return \"OperationDeferredKHR\";\n      case Result::eOperationNotDeferredKHR: return \"OperationNotDeferredKHR\";\n      case Result::eErrorInvalidVideoStdParametersKHR: return \"ErrorInvalidVideoStdParametersKHR\";\n      case Result::eErrorCompressionExhaustedEXT: return \"ErrorCompressionExhaustedEXT\";\n      case Result::eIncompatibleShaderBinaryEXT: return \"IncompatibleShaderBinaryEXT\";\n      case Result::ePipelineBinaryMissingKHR: return \"PipelineBinaryMissingKHR\";\n      case Result::eErrorNotEnoughSpaceKHR: return \"ErrorNotEnoughSpaceKHR\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( StructureType value )\n  {\n    switch ( value )\n    {\n      case StructureType::eApplicationInfo: return \"ApplicationInfo\";\n      case StructureType::eInstanceCreateInfo: return \"InstanceCreateInfo\";\n      case StructureType::eDeviceQueueCreateInfo: return \"DeviceQueueCreateInfo\";\n      case StructureType::eDeviceCreateInfo: return \"DeviceCreateInfo\";\n      case StructureType::eSubmitInfo: return \"SubmitInfo\";\n      case StructureType::eMemoryAllocateInfo: return \"MemoryAllocateInfo\";\n      case StructureType::eMappedMemoryRange: return \"MappedMemoryRange\";\n      case StructureType::eBindSparseInfo: return \"BindSparseInfo\";\n      case StructureType::eFenceCreateInfo: return \"FenceCreateInfo\";\n      case StructureType::eSemaphoreCreateInfo: return \"SemaphoreCreateInfo\";\n      case StructureType::eEventCreateInfo: return \"EventCreateInfo\";\n      case StructureType::eQueryPoolCreateInfo: return \"QueryPoolCreateInfo\";\n      case StructureType::eBufferCreateInfo: return \"BufferCreateInfo\";\n      case StructureType::eBufferViewCreateInfo: return \"BufferViewCreateInfo\";\n      case StructureType::eImageCreateInfo: return \"ImageCreateInfo\";\n      case StructureType::eImageViewCreateInfo: return \"ImageViewCreateInfo\";\n      case StructureType::eShaderModuleCreateInfo: return \"ShaderModuleCreateInfo\";\n      case StructureType::ePipelineCacheCreateInfo: return \"PipelineCacheCreateInfo\";\n      case StructureType::ePipelineShaderStageCreateInfo: return \"PipelineShaderStageCreateInfo\";\n      case StructureType::ePipelineVertexInputStateCreateInfo: return \"PipelineVertexInputStateCreateInfo\";\n      case StructureType::ePipelineInputAssemblyStateCreateInfo: return \"PipelineInputAssemblyStateCreateInfo\";\n      case StructureType::ePipelineTessellationStateCreateInfo: return \"PipelineTessellationStateCreateInfo\";\n      case StructureType::ePipelineViewportStateCreateInfo: return \"PipelineViewportStateCreateInfo\";\n      case StructureType::ePipelineRasterizationStateCreateInfo: return \"PipelineRasterizationStateCreateInfo\";\n      case StructureType::ePipelineMultisampleStateCreateInfo: return \"PipelineMultisampleStateCreateInfo\";\n      case StructureType::ePipelineDepthStencilStateCreateInfo: return \"PipelineDepthStencilStateCreateInfo\";\n      case StructureType::ePipelineColorBlendStateCreateInfo: return \"PipelineColorBlendStateCreateInfo\";\n      case StructureType::ePipelineDynamicStateCreateInfo: return \"PipelineDynamicStateCreateInfo\";\n      case StructureType::eGraphicsPipelineCreateInfo: return \"GraphicsPipelineCreateInfo\";\n      case StructureType::eComputePipelineCreateInfo: return \"ComputePipelineCreateInfo\";\n      case StructureType::ePipelineLayoutCreateInfo: return \"PipelineLayoutCreateInfo\";\n      case StructureType::eSamplerCreateInfo: return \"SamplerCreateInfo\";\n      case StructureType::eDescriptorSetLayoutCreateInfo: return \"DescriptorSetLayoutCreateInfo\";\n      case StructureType::eDescriptorPoolCreateInfo: return \"DescriptorPoolCreateInfo\";\n      case StructureType::eDescriptorSetAllocateInfo: return \"DescriptorSetAllocateInfo\";\n      case StructureType::eWriteDescriptorSet: return \"WriteDescriptorSet\";\n      case StructureType::eCopyDescriptorSet: return \"CopyDescriptorSet\";\n      case StructureType::eFramebufferCreateInfo: return \"FramebufferCreateInfo\";\n      case StructureType::eRenderPassCreateInfo: return \"RenderPassCreateInfo\";\n      case StructureType::eCommandPoolCreateInfo: return \"CommandPoolCreateInfo\";\n      case StructureType::eCommandBufferAllocateInfo: return \"CommandBufferAllocateInfo\";\n      case StructureType::eCommandBufferInheritanceInfo: return \"CommandBufferInheritanceInfo\";\n      case StructureType::eCommandBufferBeginInfo: return \"CommandBufferBeginInfo\";\n      case StructureType::eRenderPassBeginInfo: return \"RenderPassBeginInfo\";\n      case StructureType::eBufferMemoryBarrier: return \"BufferMemoryBarrier\";\n      case StructureType::eImageMemoryBarrier: return \"ImageMemoryBarrier\";\n      case StructureType::eMemoryBarrier: return \"MemoryBarrier\";\n      case StructureType::eLoaderInstanceCreateInfo: return \"LoaderInstanceCreateInfo\";\n      case StructureType::eLoaderDeviceCreateInfo: return \"LoaderDeviceCreateInfo\";\n      case StructureType::ePhysicalDeviceSubgroupProperties: return \"PhysicalDeviceSubgroupProperties\";\n      case StructureType::eBindBufferMemoryInfo: return \"BindBufferMemoryInfo\";\n      case StructureType::eBindImageMemoryInfo: return \"BindImageMemoryInfo\";\n      case StructureType::ePhysicalDevice16BitStorageFeatures: return \"PhysicalDevice16BitStorageFeatures\";\n      case StructureType::eMemoryDedicatedRequirements: return \"MemoryDedicatedRequirements\";\n      case StructureType::eMemoryDedicatedAllocateInfo: return \"MemoryDedicatedAllocateInfo\";\n      case StructureType::eMemoryAllocateFlagsInfo: return \"MemoryAllocateFlagsInfo\";\n      case StructureType::eDeviceGroupRenderPassBeginInfo: return \"DeviceGroupRenderPassBeginInfo\";\n      case StructureType::eDeviceGroupCommandBufferBeginInfo: return \"DeviceGroupCommandBufferBeginInfo\";\n      case StructureType::eDeviceGroupSubmitInfo: return \"DeviceGroupSubmitInfo\";\n      case StructureType::eDeviceGroupBindSparseInfo: return \"DeviceGroupBindSparseInfo\";\n      case StructureType::eBindBufferMemoryDeviceGroupInfo: return \"BindBufferMemoryDeviceGroupInfo\";\n      case StructureType::eBindImageMemoryDeviceGroupInfo: return \"BindImageMemoryDeviceGroupInfo\";\n      case StructureType::ePhysicalDeviceGroupProperties: return \"PhysicalDeviceGroupProperties\";\n      case StructureType::eDeviceGroupDeviceCreateInfo: return \"DeviceGroupDeviceCreateInfo\";\n      case StructureType::eBufferMemoryRequirementsInfo2: return \"BufferMemoryRequirementsInfo2\";\n      case StructureType::eImageMemoryRequirementsInfo2: return \"ImageMemoryRequirementsInfo2\";\n      case StructureType::eImageSparseMemoryRequirementsInfo2: return \"ImageSparseMemoryRequirementsInfo2\";\n      case StructureType::eMemoryRequirements2: return \"MemoryRequirements2\";\n      case StructureType::eSparseImageMemoryRequirements2: return \"SparseImageMemoryRequirements2\";\n      case StructureType::ePhysicalDeviceFeatures2: return \"PhysicalDeviceFeatures2\";\n      case StructureType::ePhysicalDeviceProperties2: return \"PhysicalDeviceProperties2\";\n      case StructureType::eFormatProperties2: return \"FormatProperties2\";\n      case StructureType::eImageFormatProperties2: return \"ImageFormatProperties2\";\n      case StructureType::ePhysicalDeviceImageFormatInfo2: return \"PhysicalDeviceImageFormatInfo2\";\n      case StructureType::eQueueFamilyProperties2: return \"QueueFamilyProperties2\";\n      case StructureType::ePhysicalDeviceMemoryProperties2: return \"PhysicalDeviceMemoryProperties2\";\n      case StructureType::eSparseImageFormatProperties2: return \"SparseImageFormatProperties2\";\n      case StructureType::ePhysicalDeviceSparseImageFormatInfo2: return \"PhysicalDeviceSparseImageFormatInfo2\";\n      case StructureType::ePhysicalDevicePointClippingProperties: return \"PhysicalDevicePointClippingProperties\";\n      case StructureType::eRenderPassInputAttachmentAspectCreateInfo: return \"RenderPassInputAttachmentAspectCreateInfo\";\n      case StructureType::eImageViewUsageCreateInfo: return \"ImageViewUsageCreateInfo\";\n      case StructureType::ePipelineTessellationDomainOriginStateCreateInfo: return \"PipelineTessellationDomainOriginStateCreateInfo\";\n      case StructureType::eRenderPassMultiviewCreateInfo: return \"RenderPassMultiviewCreateInfo\";\n      case StructureType::ePhysicalDeviceMultiviewFeatures: return \"PhysicalDeviceMultiviewFeatures\";\n      case StructureType::ePhysicalDeviceMultiviewProperties: return \"PhysicalDeviceMultiviewProperties\";\n      case StructureType::ePhysicalDeviceVariablePointersFeatures: return \"PhysicalDeviceVariablePointersFeatures\";\n      case StructureType::eProtectedSubmitInfo: return \"ProtectedSubmitInfo\";\n      case StructureType::ePhysicalDeviceProtectedMemoryFeatures: return \"PhysicalDeviceProtectedMemoryFeatures\";\n      case StructureType::ePhysicalDeviceProtectedMemoryProperties: return \"PhysicalDeviceProtectedMemoryProperties\";\n      case StructureType::eDeviceQueueInfo2: return \"DeviceQueueInfo2\";\n      case StructureType::eSamplerYcbcrConversionCreateInfo: return \"SamplerYcbcrConversionCreateInfo\";\n      case StructureType::eSamplerYcbcrConversionInfo: return \"SamplerYcbcrConversionInfo\";\n      case StructureType::eBindImagePlaneMemoryInfo: return \"BindImagePlaneMemoryInfo\";\n      case StructureType::eImagePlaneMemoryRequirementsInfo: return \"ImagePlaneMemoryRequirementsInfo\";\n      case StructureType::ePhysicalDeviceSamplerYcbcrConversionFeatures: return \"PhysicalDeviceSamplerYcbcrConversionFeatures\";\n      case StructureType::eSamplerYcbcrConversionImageFormatProperties: return \"SamplerYcbcrConversionImageFormatProperties\";\n      case StructureType::eDescriptorUpdateTemplateCreateInfo: return \"DescriptorUpdateTemplateCreateInfo\";\n      case StructureType::ePhysicalDeviceExternalImageFormatInfo: return \"PhysicalDeviceExternalImageFormatInfo\";\n      case StructureType::eExternalImageFormatProperties: return \"ExternalImageFormatProperties\";\n      case StructureType::ePhysicalDeviceExternalBufferInfo: return \"PhysicalDeviceExternalBufferInfo\";\n      case StructureType::eExternalBufferProperties: return \"ExternalBufferProperties\";\n      case StructureType::ePhysicalDeviceIdProperties: return \"PhysicalDeviceIdProperties\";\n      case StructureType::eExternalMemoryBufferCreateInfo: return \"ExternalMemoryBufferCreateInfo\";\n      case StructureType::eExternalMemoryImageCreateInfo: return \"ExternalMemoryImageCreateInfo\";\n      case StructureType::eExportMemoryAllocateInfo: return \"ExportMemoryAllocateInfo\";\n      case StructureType::ePhysicalDeviceExternalFenceInfo: return \"PhysicalDeviceExternalFenceInfo\";\n      case StructureType::eExternalFenceProperties: return \"ExternalFenceProperties\";\n      case StructureType::eExportFenceCreateInfo: return \"ExportFenceCreateInfo\";\n      case StructureType::eExportSemaphoreCreateInfo: return \"ExportSemaphoreCreateInfo\";\n      case StructureType::ePhysicalDeviceExternalSemaphoreInfo: return \"PhysicalDeviceExternalSemaphoreInfo\";\n      case StructureType::eExternalSemaphoreProperties: return \"ExternalSemaphoreProperties\";\n      case StructureType::ePhysicalDeviceMaintenance3Properties: return \"PhysicalDeviceMaintenance3Properties\";\n      case StructureType::eDescriptorSetLayoutSupport: return \"DescriptorSetLayoutSupport\";\n      case StructureType::ePhysicalDeviceShaderDrawParametersFeatures: return \"PhysicalDeviceShaderDrawParametersFeatures\";\n      case StructureType::ePhysicalDeviceVulkan11Features: return \"PhysicalDeviceVulkan11Features\";\n      case StructureType::ePhysicalDeviceVulkan11Properties: return \"PhysicalDeviceVulkan11Properties\";\n      case StructureType::ePhysicalDeviceVulkan12Features: return \"PhysicalDeviceVulkan12Features\";\n      case StructureType::ePhysicalDeviceVulkan12Properties: return \"PhysicalDeviceVulkan12Properties\";\n      case StructureType::eImageFormatListCreateInfo: return \"ImageFormatListCreateInfo\";\n      case StructureType::eAttachmentDescription2: return \"AttachmentDescription2\";\n      case StructureType::eAttachmentReference2: return \"AttachmentReference2\";\n      case StructureType::eSubpassDescription2: return \"SubpassDescription2\";\n      case StructureType::eSubpassDependency2: return \"SubpassDependency2\";\n      case StructureType::eRenderPassCreateInfo2: return \"RenderPassCreateInfo2\";\n      case StructureType::eSubpassBeginInfo: return \"SubpassBeginInfo\";\n      case StructureType::eSubpassEndInfo: return \"SubpassEndInfo\";\n      case StructureType::ePhysicalDevice8BitStorageFeatures: return \"PhysicalDevice8BitStorageFeatures\";\n      case StructureType::ePhysicalDeviceDriverProperties: return \"PhysicalDeviceDriverProperties\";\n      case StructureType::ePhysicalDeviceShaderAtomicInt64Features: return \"PhysicalDeviceShaderAtomicInt64Features\";\n      case StructureType::ePhysicalDeviceShaderFloat16Int8Features: return \"PhysicalDeviceShaderFloat16Int8Features\";\n      case StructureType::ePhysicalDeviceFloatControlsProperties: return \"PhysicalDeviceFloatControlsProperties\";\n      case StructureType::eDescriptorSetLayoutBindingFlagsCreateInfo: return \"DescriptorSetLayoutBindingFlagsCreateInfo\";\n      case StructureType::ePhysicalDeviceDescriptorIndexingFeatures: return \"PhysicalDeviceDescriptorIndexingFeatures\";\n      case StructureType::ePhysicalDeviceDescriptorIndexingProperties: return \"PhysicalDeviceDescriptorIndexingProperties\";\n      case StructureType::eDescriptorSetVariableDescriptorCountAllocateInfo: return \"DescriptorSetVariableDescriptorCountAllocateInfo\";\n      case StructureType::eDescriptorSetVariableDescriptorCountLayoutSupport: return \"DescriptorSetVariableDescriptorCountLayoutSupport\";\n      case StructureType::ePhysicalDeviceDepthStencilResolveProperties: return \"PhysicalDeviceDepthStencilResolveProperties\";\n      case StructureType::eSubpassDescriptionDepthStencilResolve: return \"SubpassDescriptionDepthStencilResolve\";\n      case StructureType::ePhysicalDeviceScalarBlockLayoutFeatures: return \"PhysicalDeviceScalarBlockLayoutFeatures\";\n      case StructureType::eImageStencilUsageCreateInfo: return \"ImageStencilUsageCreateInfo\";\n      case StructureType::ePhysicalDeviceSamplerFilterMinmaxProperties: return \"PhysicalDeviceSamplerFilterMinmaxProperties\";\n      case StructureType::eSamplerReductionModeCreateInfo: return \"SamplerReductionModeCreateInfo\";\n      case StructureType::ePhysicalDeviceVulkanMemoryModelFeatures: return \"PhysicalDeviceVulkanMemoryModelFeatures\";\n      case StructureType::ePhysicalDeviceImagelessFramebufferFeatures: return \"PhysicalDeviceImagelessFramebufferFeatures\";\n      case StructureType::eFramebufferAttachmentsCreateInfo: return \"FramebufferAttachmentsCreateInfo\";\n      case StructureType::eFramebufferAttachmentImageInfo: return \"FramebufferAttachmentImageInfo\";\n      case StructureType::eRenderPassAttachmentBeginInfo: return \"RenderPassAttachmentBeginInfo\";\n      case StructureType::ePhysicalDeviceUniformBufferStandardLayoutFeatures: return \"PhysicalDeviceUniformBufferStandardLayoutFeatures\";\n      case StructureType::ePhysicalDeviceShaderSubgroupExtendedTypesFeatures: return \"PhysicalDeviceShaderSubgroupExtendedTypesFeatures\";\n      case StructureType::ePhysicalDeviceSeparateDepthStencilLayoutsFeatures: return \"PhysicalDeviceSeparateDepthStencilLayoutsFeatures\";\n      case StructureType::eAttachmentReferenceStencilLayout: return \"AttachmentReferenceStencilLayout\";\n      case StructureType::eAttachmentDescriptionStencilLayout: return \"AttachmentDescriptionStencilLayout\";\n      case StructureType::ePhysicalDeviceHostQueryResetFeatures: return \"PhysicalDeviceHostQueryResetFeatures\";\n      case StructureType::ePhysicalDeviceTimelineSemaphoreFeatures: return \"PhysicalDeviceTimelineSemaphoreFeatures\";\n      case StructureType::ePhysicalDeviceTimelineSemaphoreProperties: return \"PhysicalDeviceTimelineSemaphoreProperties\";\n      case StructureType::eSemaphoreTypeCreateInfo: return \"SemaphoreTypeCreateInfo\";\n      case StructureType::eTimelineSemaphoreSubmitInfo: return \"TimelineSemaphoreSubmitInfo\";\n      case StructureType::eSemaphoreWaitInfo: return \"SemaphoreWaitInfo\";\n      case StructureType::eSemaphoreSignalInfo: return \"SemaphoreSignalInfo\";\n      case StructureType::ePhysicalDeviceBufferDeviceAddressFeatures: return \"PhysicalDeviceBufferDeviceAddressFeatures\";\n      case StructureType::eBufferDeviceAddressInfo: return \"BufferDeviceAddressInfo\";\n      case StructureType::eBufferOpaqueCaptureAddressCreateInfo: return \"BufferOpaqueCaptureAddressCreateInfo\";\n      case StructureType::eMemoryOpaqueCaptureAddressAllocateInfo: return \"MemoryOpaqueCaptureAddressAllocateInfo\";\n      case StructureType::eDeviceMemoryOpaqueCaptureAddressInfo: return \"DeviceMemoryOpaqueCaptureAddressInfo\";\n      case StructureType::ePhysicalDeviceVulkan13Features: return \"PhysicalDeviceVulkan13Features\";\n      case StructureType::ePhysicalDeviceVulkan13Properties: return \"PhysicalDeviceVulkan13Properties\";\n      case StructureType::ePipelineCreationFeedbackCreateInfo: return \"PipelineCreationFeedbackCreateInfo\";\n      case StructureType::ePhysicalDeviceShaderTerminateInvocationFeatures: return \"PhysicalDeviceShaderTerminateInvocationFeatures\";\n      case StructureType::ePhysicalDeviceToolProperties: return \"PhysicalDeviceToolProperties\";\n      case StructureType::ePhysicalDeviceShaderDemoteToHelperInvocationFeatures: return \"PhysicalDeviceShaderDemoteToHelperInvocationFeatures\";\n      case StructureType::ePhysicalDevicePrivateDataFeatures: return \"PhysicalDevicePrivateDataFeatures\";\n      case StructureType::eDevicePrivateDataCreateInfo: return \"DevicePrivateDataCreateInfo\";\n      case StructureType::ePrivateDataSlotCreateInfo: return \"PrivateDataSlotCreateInfo\";\n      case StructureType::ePhysicalDevicePipelineCreationCacheControlFeatures: return \"PhysicalDevicePipelineCreationCacheControlFeatures\";\n      case StructureType::eMemoryBarrier2: return \"MemoryBarrier2\";\n      case StructureType::eBufferMemoryBarrier2: return \"BufferMemoryBarrier2\";\n      case StructureType::eImageMemoryBarrier2: return \"ImageMemoryBarrier2\";\n      case StructureType::eDependencyInfo: return \"DependencyInfo\";\n      case StructureType::eSubmitInfo2: return \"SubmitInfo2\";\n      case StructureType::eSemaphoreSubmitInfo: return \"SemaphoreSubmitInfo\";\n      case StructureType::eCommandBufferSubmitInfo: return \"CommandBufferSubmitInfo\";\n      case StructureType::ePhysicalDeviceSynchronization2Features: return \"PhysicalDeviceSynchronization2Features\";\n      case StructureType::ePhysicalDeviceZeroInitializeWorkgroupMemoryFeatures: return \"PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures\";\n      case StructureType::ePhysicalDeviceImageRobustnessFeatures: return \"PhysicalDeviceImageRobustnessFeatures\";\n      case StructureType::eCopyBufferInfo2: return \"CopyBufferInfo2\";\n      case StructureType::eCopyImageInfo2: return \"CopyImageInfo2\";\n      case StructureType::eCopyBufferToImageInfo2: return \"CopyBufferToImageInfo2\";\n      case StructureType::eCopyImageToBufferInfo2: return \"CopyImageToBufferInfo2\";\n      case StructureType::eBlitImageInfo2: return \"BlitImageInfo2\";\n      case StructureType::eResolveImageInfo2: return \"ResolveImageInfo2\";\n      case StructureType::eBufferCopy2: return \"BufferCopy2\";\n      case StructureType::eImageCopy2: return \"ImageCopy2\";\n      case StructureType::eImageBlit2: return \"ImageBlit2\";\n      case StructureType::eBufferImageCopy2: return \"BufferImageCopy2\";\n      case StructureType::eImageResolve2: return \"ImageResolve2\";\n      case StructureType::ePhysicalDeviceSubgroupSizeControlProperties: return \"PhysicalDeviceSubgroupSizeControlProperties\";\n      case StructureType::ePipelineShaderStageRequiredSubgroupSizeCreateInfo: return \"PipelineShaderStageRequiredSubgroupSizeCreateInfo\";\n      case StructureType::ePhysicalDeviceSubgroupSizeControlFeatures: return \"PhysicalDeviceSubgroupSizeControlFeatures\";\n      case StructureType::ePhysicalDeviceInlineUniformBlockFeatures: return \"PhysicalDeviceInlineUniformBlockFeatures\";\n      case StructureType::ePhysicalDeviceInlineUniformBlockProperties: return \"PhysicalDeviceInlineUniformBlockProperties\";\n      case StructureType::eWriteDescriptorSetInlineUniformBlock: return \"WriteDescriptorSetInlineUniformBlock\";\n      case StructureType::eDescriptorPoolInlineUniformBlockCreateInfo: return \"DescriptorPoolInlineUniformBlockCreateInfo\";\n      case StructureType::ePhysicalDeviceTextureCompressionAstcHdrFeatures: return \"PhysicalDeviceTextureCompressionAstcHdrFeatures\";\n      case StructureType::eRenderingInfo: return \"RenderingInfo\";\n      case StructureType::eRenderingAttachmentInfo: return \"RenderingAttachmentInfo\";\n      case StructureType::ePipelineRenderingCreateInfo: return \"PipelineRenderingCreateInfo\";\n      case StructureType::ePhysicalDeviceDynamicRenderingFeatures: return \"PhysicalDeviceDynamicRenderingFeatures\";\n      case StructureType::eCommandBufferInheritanceRenderingInfo: return \"CommandBufferInheritanceRenderingInfo\";\n      case StructureType::ePhysicalDeviceShaderIntegerDotProductFeatures: return \"PhysicalDeviceShaderIntegerDotProductFeatures\";\n      case StructureType::ePhysicalDeviceShaderIntegerDotProductProperties: return \"PhysicalDeviceShaderIntegerDotProductProperties\";\n      case StructureType::ePhysicalDeviceTexelBufferAlignmentProperties: return \"PhysicalDeviceTexelBufferAlignmentProperties\";\n      case StructureType::eFormatProperties3: return \"FormatProperties3\";\n      case StructureType::ePhysicalDeviceMaintenance4Features: return \"PhysicalDeviceMaintenance4Features\";\n      case StructureType::ePhysicalDeviceMaintenance4Properties: return \"PhysicalDeviceMaintenance4Properties\";\n      case StructureType::eDeviceBufferMemoryRequirements: return \"DeviceBufferMemoryRequirements\";\n      case StructureType::eDeviceImageMemoryRequirements: return \"DeviceImageMemoryRequirements\";\n      case StructureType::ePhysicalDeviceVulkan14Features: return \"PhysicalDeviceVulkan14Features\";\n      case StructureType::ePhysicalDeviceVulkan14Properties: return \"PhysicalDeviceVulkan14Properties\";\n      case StructureType::eDeviceQueueGlobalPriorityCreateInfo: return \"DeviceQueueGlobalPriorityCreateInfo\";\n      case StructureType::ePhysicalDeviceGlobalPriorityQueryFeatures: return \"PhysicalDeviceGlobalPriorityQueryFeatures\";\n      case StructureType::eQueueFamilyGlobalPriorityProperties: return \"QueueFamilyGlobalPriorityProperties\";\n      case StructureType::ePhysicalDeviceShaderSubgroupRotateFeatures: return \"PhysicalDeviceShaderSubgroupRotateFeatures\";\n      case StructureType::ePhysicalDeviceShaderFloatControls2Features: return \"PhysicalDeviceShaderFloatControls2Features\";\n      case StructureType::ePhysicalDeviceShaderExpectAssumeFeatures: return \"PhysicalDeviceShaderExpectAssumeFeatures\";\n      case StructureType::ePhysicalDeviceLineRasterizationFeatures: return \"PhysicalDeviceLineRasterizationFeatures\";\n      case StructureType::ePipelineRasterizationLineStateCreateInfo: return \"PipelineRasterizationLineStateCreateInfo\";\n      case StructureType::ePhysicalDeviceLineRasterizationProperties: return \"PhysicalDeviceLineRasterizationProperties\";\n      case StructureType::ePhysicalDeviceVertexAttributeDivisorProperties: return \"PhysicalDeviceVertexAttributeDivisorProperties\";\n      case StructureType::ePipelineVertexInputDivisorStateCreateInfo: return \"PipelineVertexInputDivisorStateCreateInfo\";\n      case StructureType::ePhysicalDeviceVertexAttributeDivisorFeatures: return \"PhysicalDeviceVertexAttributeDivisorFeatures\";\n      case StructureType::ePhysicalDeviceIndexTypeUint8Features: return \"PhysicalDeviceIndexTypeUint8Features\";\n      case StructureType::eMemoryMapInfo: return \"MemoryMapInfo\";\n      case StructureType::eMemoryUnmapInfo: return \"MemoryUnmapInfo\";\n      case StructureType::ePhysicalDeviceMaintenance5Features: return \"PhysicalDeviceMaintenance5Features\";\n      case StructureType::ePhysicalDeviceMaintenance5Properties: return \"PhysicalDeviceMaintenance5Properties\";\n      case StructureType::eRenderingAreaInfo: return \"RenderingAreaInfo\";\n      case StructureType::eDeviceImageSubresourceInfo: return \"DeviceImageSubresourceInfo\";\n      case StructureType::eSubresourceLayout2: return \"SubresourceLayout2\";\n      case StructureType::eImageSubresource2: return \"ImageSubresource2\";\n      case StructureType::ePipelineCreateFlags2CreateInfo: return \"PipelineCreateFlags2CreateInfo\";\n      case StructureType::eBufferUsageFlags2CreateInfo: return \"BufferUsageFlags2CreateInfo\";\n      case StructureType::ePhysicalDevicePushDescriptorProperties: return \"PhysicalDevicePushDescriptorProperties\";\n      case StructureType::ePhysicalDeviceDynamicRenderingLocalReadFeatures: return \"PhysicalDeviceDynamicRenderingLocalReadFeatures\";\n      case StructureType::eRenderingAttachmentLocationInfo: return \"RenderingAttachmentLocationInfo\";\n      case StructureType::eRenderingInputAttachmentIndexInfo: return \"RenderingInputAttachmentIndexInfo\";\n      case StructureType::ePhysicalDeviceMaintenance6Features: return \"PhysicalDeviceMaintenance6Features\";\n      case StructureType::ePhysicalDeviceMaintenance6Properties: return \"PhysicalDeviceMaintenance6Properties\";\n      case StructureType::eBindMemoryStatus: return \"BindMemoryStatus\";\n      case StructureType::eBindDescriptorSetsInfo: return \"BindDescriptorSetsInfo\";\n      case StructureType::ePushConstantsInfo: return \"PushConstantsInfo\";\n      case StructureType::ePushDescriptorSetInfo: return \"PushDescriptorSetInfo\";\n      case StructureType::ePushDescriptorSetWithTemplateInfo: return \"PushDescriptorSetWithTemplateInfo\";\n      case StructureType::ePhysicalDevicePipelineProtectedAccessFeatures: return \"PhysicalDevicePipelineProtectedAccessFeatures\";\n      case StructureType::ePipelineRobustnessCreateInfo: return \"PipelineRobustnessCreateInfo\";\n      case StructureType::ePhysicalDevicePipelineRobustnessFeatures: return \"PhysicalDevicePipelineRobustnessFeatures\";\n      case StructureType::ePhysicalDevicePipelineRobustnessProperties: return \"PhysicalDevicePipelineRobustnessProperties\";\n      case StructureType::ePhysicalDeviceHostImageCopyFeatures: return \"PhysicalDeviceHostImageCopyFeatures\";\n      case StructureType::ePhysicalDeviceHostImageCopyProperties: return \"PhysicalDeviceHostImageCopyProperties\";\n      case StructureType::eMemoryToImageCopy: return \"MemoryToImageCopy\";\n      case StructureType::eImageToMemoryCopy: return \"ImageToMemoryCopy\";\n      case StructureType::eCopyImageToMemoryInfo: return \"CopyImageToMemoryInfo\";\n      case StructureType::eCopyMemoryToImageInfo: return \"CopyMemoryToImageInfo\";\n      case StructureType::eHostImageLayoutTransitionInfo: return \"HostImageLayoutTransitionInfo\";\n      case StructureType::eCopyImageToImageInfo: return \"CopyImageToImageInfo\";\n      case StructureType::eSubresourceHostMemcpySize: return \"SubresourceHostMemcpySize\";\n      case StructureType::eHostImageCopyDevicePerformanceQuery: return \"HostImageCopyDevicePerformanceQuery\";\n      case StructureType::eSwapchainCreateInfoKHR: return \"SwapchainCreateInfoKHR\";\n      case StructureType::ePresentInfoKHR: return \"PresentInfoKHR\";\n      case StructureType::eDeviceGroupPresentCapabilitiesKHR: return \"DeviceGroupPresentCapabilitiesKHR\";\n      case StructureType::eImageSwapchainCreateInfoKHR: return \"ImageSwapchainCreateInfoKHR\";\n      case StructureType::eBindImageMemorySwapchainInfoKHR: return \"BindImageMemorySwapchainInfoKHR\";\n      case StructureType::eAcquireNextImageInfoKHR: return \"AcquireNextImageInfoKHR\";\n      case StructureType::eDeviceGroupPresentInfoKHR: return \"DeviceGroupPresentInfoKHR\";\n      case StructureType::eDeviceGroupSwapchainCreateInfoKHR: return \"DeviceGroupSwapchainCreateInfoKHR\";\n      case StructureType::eDisplayModeCreateInfoKHR: return \"DisplayModeCreateInfoKHR\";\n      case StructureType::eDisplaySurfaceCreateInfoKHR: return \"DisplaySurfaceCreateInfoKHR\";\n      case StructureType::eDisplayPresentInfoKHR: return \"DisplayPresentInfoKHR\";\n#if defined( VK_USE_PLATFORM_XLIB_KHR )\n      case StructureType::eXlibSurfaceCreateInfoKHR: return \"XlibSurfaceCreateInfoKHR\";\n#endif /*VK_USE_PLATFORM_XLIB_KHR*/\n#if defined( VK_USE_PLATFORM_XCB_KHR )\n      case StructureType::eXcbSurfaceCreateInfoKHR: return \"XcbSurfaceCreateInfoKHR\";\n#endif /*VK_USE_PLATFORM_XCB_KHR*/\n#if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n      case StructureType::eWaylandSurfaceCreateInfoKHR: return \"WaylandSurfaceCreateInfoKHR\";\n#endif /*VK_USE_PLATFORM_WAYLAND_KHR*/\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n      case StructureType::eAndroidSurfaceCreateInfoKHR: return \"AndroidSurfaceCreateInfoKHR\";\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      case StructureType::eWin32SurfaceCreateInfoKHR: return \"Win32SurfaceCreateInfoKHR\";\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      case StructureType::eDebugReportCallbackCreateInfoEXT: return \"DebugReportCallbackCreateInfoEXT\";\n      case StructureType::ePipelineRasterizationStateRasterizationOrderAMD: return \"PipelineRasterizationStateRasterizationOrderAMD\";\n      case StructureType::eDebugMarkerObjectNameInfoEXT: return \"DebugMarkerObjectNameInfoEXT\";\n      case StructureType::eDebugMarkerObjectTagInfoEXT: return \"DebugMarkerObjectTagInfoEXT\";\n      case StructureType::eDebugMarkerMarkerInfoEXT: return \"DebugMarkerMarkerInfoEXT\";\n      case StructureType::eVideoProfileInfoKHR: return \"VideoProfileInfoKHR\";\n      case StructureType::eVideoCapabilitiesKHR: return \"VideoCapabilitiesKHR\";\n      case StructureType::eVideoPictureResourceInfoKHR: return \"VideoPictureResourceInfoKHR\";\n      case StructureType::eVideoSessionMemoryRequirementsKHR: return \"VideoSessionMemoryRequirementsKHR\";\n      case StructureType::eBindVideoSessionMemoryInfoKHR: return \"BindVideoSessionMemoryInfoKHR\";\n      case StructureType::eVideoSessionCreateInfoKHR: return \"VideoSessionCreateInfoKHR\";\n      case StructureType::eVideoSessionParametersCreateInfoKHR: return \"VideoSessionParametersCreateInfoKHR\";\n      case StructureType::eVideoSessionParametersUpdateInfoKHR: return \"VideoSessionParametersUpdateInfoKHR\";\n      case StructureType::eVideoBeginCodingInfoKHR: return \"VideoBeginCodingInfoKHR\";\n      case StructureType::eVideoEndCodingInfoKHR: return \"VideoEndCodingInfoKHR\";\n      case StructureType::eVideoCodingControlInfoKHR: return \"VideoCodingControlInfoKHR\";\n      case StructureType::eVideoReferenceSlotInfoKHR: return \"VideoReferenceSlotInfoKHR\";\n      case StructureType::eQueueFamilyVideoPropertiesKHR: return \"QueueFamilyVideoPropertiesKHR\";\n      case StructureType::eVideoProfileListInfoKHR: return \"VideoProfileListInfoKHR\";\n      case StructureType::ePhysicalDeviceVideoFormatInfoKHR: return \"PhysicalDeviceVideoFormatInfoKHR\";\n      case StructureType::eVideoFormatPropertiesKHR: return \"VideoFormatPropertiesKHR\";\n      case StructureType::eQueueFamilyQueryResultStatusPropertiesKHR: return \"QueueFamilyQueryResultStatusPropertiesKHR\";\n      case StructureType::eVideoDecodeInfoKHR: return \"VideoDecodeInfoKHR\";\n      case StructureType::eVideoDecodeCapabilitiesKHR: return \"VideoDecodeCapabilitiesKHR\";\n      case StructureType::eVideoDecodeUsageInfoKHR: return \"VideoDecodeUsageInfoKHR\";\n      case StructureType::eDedicatedAllocationImageCreateInfoNV: return \"DedicatedAllocationImageCreateInfoNV\";\n      case StructureType::eDedicatedAllocationBufferCreateInfoNV: return \"DedicatedAllocationBufferCreateInfoNV\";\n      case StructureType::eDedicatedAllocationMemoryAllocateInfoNV: return \"DedicatedAllocationMemoryAllocateInfoNV\";\n      case StructureType::ePhysicalDeviceTransformFeedbackFeaturesEXT: return \"PhysicalDeviceTransformFeedbackFeaturesEXT\";\n      case StructureType::ePhysicalDeviceTransformFeedbackPropertiesEXT: return \"PhysicalDeviceTransformFeedbackPropertiesEXT\";\n      case StructureType::ePipelineRasterizationStateStreamCreateInfoEXT: return \"PipelineRasterizationStateStreamCreateInfoEXT\";\n      case StructureType::eCuModuleCreateInfoNVX: return \"CuModuleCreateInfoNVX\";\n      case StructureType::eCuFunctionCreateInfoNVX: return \"CuFunctionCreateInfoNVX\";\n      case StructureType::eCuLaunchInfoNVX: return \"CuLaunchInfoNVX\";\n      case StructureType::eCuModuleTexturingModeCreateInfoNVX: return \"CuModuleTexturingModeCreateInfoNVX\";\n      case StructureType::eImageViewHandleInfoNVX: return \"ImageViewHandleInfoNVX\";\n      case StructureType::eImageViewAddressPropertiesNVX: return \"ImageViewAddressPropertiesNVX\";\n      case StructureType::eVideoEncodeH264CapabilitiesKHR: return \"VideoEncodeH264CapabilitiesKHR\";\n      case StructureType::eVideoEncodeH264SessionParametersCreateInfoKHR: return \"VideoEncodeH264SessionParametersCreateInfoKHR\";\n      case StructureType::eVideoEncodeH264SessionParametersAddInfoKHR: return \"VideoEncodeH264SessionParametersAddInfoKHR\";\n      case StructureType::eVideoEncodeH264PictureInfoKHR: return \"VideoEncodeH264PictureInfoKHR\";\n      case StructureType::eVideoEncodeH264DpbSlotInfoKHR: return \"VideoEncodeH264DpbSlotInfoKHR\";\n      case StructureType::eVideoEncodeH264NaluSliceInfoKHR: return \"VideoEncodeH264NaluSliceInfoKHR\";\n      case StructureType::eVideoEncodeH264GopRemainingFrameInfoKHR: return \"VideoEncodeH264GopRemainingFrameInfoKHR\";\n      case StructureType::eVideoEncodeH264ProfileInfoKHR: return \"VideoEncodeH264ProfileInfoKHR\";\n      case StructureType::eVideoEncodeH264RateControlInfoKHR: return \"VideoEncodeH264RateControlInfoKHR\";\n      case StructureType::eVideoEncodeH264RateControlLayerInfoKHR: return \"VideoEncodeH264RateControlLayerInfoKHR\";\n      case StructureType::eVideoEncodeH264SessionCreateInfoKHR: return \"VideoEncodeH264SessionCreateInfoKHR\";\n      case StructureType::eVideoEncodeH264QualityLevelPropertiesKHR: return \"VideoEncodeH264QualityLevelPropertiesKHR\";\n      case StructureType::eVideoEncodeH264SessionParametersGetInfoKHR: return \"VideoEncodeH264SessionParametersGetInfoKHR\";\n      case StructureType::eVideoEncodeH264SessionParametersFeedbackInfoKHR: return \"VideoEncodeH264SessionParametersFeedbackInfoKHR\";\n      case StructureType::eVideoEncodeH265CapabilitiesKHR: return \"VideoEncodeH265CapabilitiesKHR\";\n      case StructureType::eVideoEncodeH265SessionParametersCreateInfoKHR: return \"VideoEncodeH265SessionParametersCreateInfoKHR\";\n      case StructureType::eVideoEncodeH265SessionParametersAddInfoKHR: return \"VideoEncodeH265SessionParametersAddInfoKHR\";\n      case StructureType::eVideoEncodeH265PictureInfoKHR: return \"VideoEncodeH265PictureInfoKHR\";\n      case StructureType::eVideoEncodeH265DpbSlotInfoKHR: return \"VideoEncodeH265DpbSlotInfoKHR\";\n      case StructureType::eVideoEncodeH265NaluSliceSegmentInfoKHR: return \"VideoEncodeH265NaluSliceSegmentInfoKHR\";\n      case StructureType::eVideoEncodeH265GopRemainingFrameInfoKHR: return \"VideoEncodeH265GopRemainingFrameInfoKHR\";\n      case StructureType::eVideoEncodeH265ProfileInfoKHR: return \"VideoEncodeH265ProfileInfoKHR\";\n      case StructureType::eVideoEncodeH265RateControlInfoKHR: return \"VideoEncodeH265RateControlInfoKHR\";\n      case StructureType::eVideoEncodeH265RateControlLayerInfoKHR: return \"VideoEncodeH265RateControlLayerInfoKHR\";\n      case StructureType::eVideoEncodeH265SessionCreateInfoKHR: return \"VideoEncodeH265SessionCreateInfoKHR\";\n      case StructureType::eVideoEncodeH265QualityLevelPropertiesKHR: return \"VideoEncodeH265QualityLevelPropertiesKHR\";\n      case StructureType::eVideoEncodeH265SessionParametersGetInfoKHR: return \"VideoEncodeH265SessionParametersGetInfoKHR\";\n      case StructureType::eVideoEncodeH265SessionParametersFeedbackInfoKHR: return \"VideoEncodeH265SessionParametersFeedbackInfoKHR\";\n      case StructureType::eVideoDecodeH264CapabilitiesKHR: return \"VideoDecodeH264CapabilitiesKHR\";\n      case StructureType::eVideoDecodeH264PictureInfoKHR: return \"VideoDecodeH264PictureInfoKHR\";\n      case StructureType::eVideoDecodeH264ProfileInfoKHR: return \"VideoDecodeH264ProfileInfoKHR\";\n      case StructureType::eVideoDecodeH264SessionParametersCreateInfoKHR: return \"VideoDecodeH264SessionParametersCreateInfoKHR\";\n      case StructureType::eVideoDecodeH264SessionParametersAddInfoKHR: return \"VideoDecodeH264SessionParametersAddInfoKHR\";\n      case StructureType::eVideoDecodeH264DpbSlotInfoKHR: return \"VideoDecodeH264DpbSlotInfoKHR\";\n      case StructureType::eTextureLodGatherFormatPropertiesAMD: return \"TextureLodGatherFormatPropertiesAMD\";\n#if defined( VK_USE_PLATFORM_GGP )\n      case StructureType::eStreamDescriptorSurfaceCreateInfoGGP: return \"StreamDescriptorSurfaceCreateInfoGGP\";\n#endif /*VK_USE_PLATFORM_GGP*/\n      case StructureType::ePhysicalDeviceCornerSampledImageFeaturesNV: return \"PhysicalDeviceCornerSampledImageFeaturesNV\";\n      case StructureType::eExternalMemoryImageCreateInfoNV: return \"ExternalMemoryImageCreateInfoNV\";\n      case StructureType::eExportMemoryAllocateInfoNV: return \"ExportMemoryAllocateInfoNV\";\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      case StructureType::eImportMemoryWin32HandleInfoNV: return \"ImportMemoryWin32HandleInfoNV\";\n      case StructureType::eExportMemoryWin32HandleInfoNV: return \"ExportMemoryWin32HandleInfoNV\";\n      case StructureType::eWin32KeyedMutexAcquireReleaseInfoNV: return \"Win32KeyedMutexAcquireReleaseInfoNV\";\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      case StructureType::eValidationFlagsEXT: return \"ValidationFlagsEXT\";\n#if defined( VK_USE_PLATFORM_VI_NN )\n      case StructureType::eViSurfaceCreateInfoNN: return \"ViSurfaceCreateInfoNN\";\n#endif /*VK_USE_PLATFORM_VI_NN*/\n      case StructureType::eImageViewAstcDecodeModeEXT: return \"ImageViewAstcDecodeModeEXT\";\n      case StructureType::ePhysicalDeviceAstcDecodeFeaturesEXT: return \"PhysicalDeviceAstcDecodeFeaturesEXT\";\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      case StructureType::eImportMemoryWin32HandleInfoKHR: return \"ImportMemoryWin32HandleInfoKHR\";\n      case StructureType::eExportMemoryWin32HandleInfoKHR: return \"ExportMemoryWin32HandleInfoKHR\";\n      case StructureType::eMemoryWin32HandlePropertiesKHR: return \"MemoryWin32HandlePropertiesKHR\";\n      case StructureType::eMemoryGetWin32HandleInfoKHR: return \"MemoryGetWin32HandleInfoKHR\";\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      case StructureType::eImportMemoryFdInfoKHR: return \"ImportMemoryFdInfoKHR\";\n      case StructureType::eMemoryFdPropertiesKHR: return \"MemoryFdPropertiesKHR\";\n      case StructureType::eMemoryGetFdInfoKHR: return \"MemoryGetFdInfoKHR\";\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      case StructureType::eWin32KeyedMutexAcquireReleaseInfoKHR: return \"Win32KeyedMutexAcquireReleaseInfoKHR\";\n      case StructureType::eImportSemaphoreWin32HandleInfoKHR: return \"ImportSemaphoreWin32HandleInfoKHR\";\n      case StructureType::eExportSemaphoreWin32HandleInfoKHR: return \"ExportSemaphoreWin32HandleInfoKHR\";\n      case StructureType::eD3D12FenceSubmitInfoKHR: return \"D3D12FenceSubmitInfoKHR\";\n      case StructureType::eSemaphoreGetWin32HandleInfoKHR: return \"SemaphoreGetWin32HandleInfoKHR\";\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      case StructureType::eImportSemaphoreFdInfoKHR: return \"ImportSemaphoreFdInfoKHR\";\n      case StructureType::eSemaphoreGetFdInfoKHR: return \"SemaphoreGetFdInfoKHR\";\n      case StructureType::eCommandBufferInheritanceConditionalRenderingInfoEXT: return \"CommandBufferInheritanceConditionalRenderingInfoEXT\";\n      case StructureType::ePhysicalDeviceConditionalRenderingFeaturesEXT: return \"PhysicalDeviceConditionalRenderingFeaturesEXT\";\n      case StructureType::eConditionalRenderingBeginInfoEXT: return \"ConditionalRenderingBeginInfoEXT\";\n      case StructureType::ePresentRegionsKHR: return \"PresentRegionsKHR\";\n      case StructureType::ePipelineViewportWScalingStateCreateInfoNV: return \"PipelineViewportWScalingStateCreateInfoNV\";\n      case StructureType::eSurfaceCapabilities2EXT: return \"SurfaceCapabilities2EXT\";\n      case StructureType::eDisplayPowerInfoEXT: return \"DisplayPowerInfoEXT\";\n      case StructureType::eDeviceEventInfoEXT: return \"DeviceEventInfoEXT\";\n      case StructureType::eDisplayEventInfoEXT: return \"DisplayEventInfoEXT\";\n      case StructureType::eSwapchainCounterCreateInfoEXT: return \"SwapchainCounterCreateInfoEXT\";\n      case StructureType::ePresentTimesInfoGOOGLE: return \"PresentTimesInfoGOOGLE\";\n      case StructureType::ePhysicalDeviceMultiviewPerViewAttributesPropertiesNVX: return \"PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX\";\n      case StructureType::eMultiviewPerViewAttributesInfoNVX: return \"MultiviewPerViewAttributesInfoNVX\";\n      case StructureType::ePipelineViewportSwizzleStateCreateInfoNV: return \"PipelineViewportSwizzleStateCreateInfoNV\";\n      case StructureType::ePhysicalDeviceDiscardRectanglePropertiesEXT: return \"PhysicalDeviceDiscardRectanglePropertiesEXT\";\n      case StructureType::ePipelineDiscardRectangleStateCreateInfoEXT: return \"PipelineDiscardRectangleStateCreateInfoEXT\";\n      case StructureType::ePhysicalDeviceConservativeRasterizationPropertiesEXT: return \"PhysicalDeviceConservativeRasterizationPropertiesEXT\";\n      case StructureType::ePipelineRasterizationConservativeStateCreateInfoEXT: return \"PipelineRasterizationConservativeStateCreateInfoEXT\";\n      case StructureType::ePhysicalDeviceDepthClipEnableFeaturesEXT: return \"PhysicalDeviceDepthClipEnableFeaturesEXT\";\n      case StructureType::ePipelineRasterizationDepthClipStateCreateInfoEXT: return \"PipelineRasterizationDepthClipStateCreateInfoEXT\";\n      case StructureType::eHdrMetadataEXT: return \"HdrMetadataEXT\";\n      case StructureType::ePhysicalDeviceRelaxedLineRasterizationFeaturesIMG: return \"PhysicalDeviceRelaxedLineRasterizationFeaturesIMG\";\n      case StructureType::eSharedPresentSurfaceCapabilitiesKHR: return \"SharedPresentSurfaceCapabilitiesKHR\";\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      case StructureType::eImportFenceWin32HandleInfoKHR: return \"ImportFenceWin32HandleInfoKHR\";\n      case StructureType::eExportFenceWin32HandleInfoKHR: return \"ExportFenceWin32HandleInfoKHR\";\n      case StructureType::eFenceGetWin32HandleInfoKHR: return \"FenceGetWin32HandleInfoKHR\";\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      case StructureType::eImportFenceFdInfoKHR: return \"ImportFenceFdInfoKHR\";\n      case StructureType::eFenceGetFdInfoKHR: return \"FenceGetFdInfoKHR\";\n      case StructureType::ePhysicalDevicePerformanceQueryFeaturesKHR: return \"PhysicalDevicePerformanceQueryFeaturesKHR\";\n      case StructureType::ePhysicalDevicePerformanceQueryPropertiesKHR: return \"PhysicalDevicePerformanceQueryPropertiesKHR\";\n      case StructureType::eQueryPoolPerformanceCreateInfoKHR: return \"QueryPoolPerformanceCreateInfoKHR\";\n      case StructureType::ePerformanceQuerySubmitInfoKHR: return \"PerformanceQuerySubmitInfoKHR\";\n      case StructureType::eAcquireProfilingLockInfoKHR: return \"AcquireProfilingLockInfoKHR\";\n      case StructureType::ePerformanceCounterKHR: return \"PerformanceCounterKHR\";\n      case StructureType::ePerformanceCounterDescriptionKHR: return \"PerformanceCounterDescriptionKHR\";\n      case StructureType::ePhysicalDeviceSurfaceInfo2KHR: return \"PhysicalDeviceSurfaceInfo2KHR\";\n      case StructureType::eSurfaceCapabilities2KHR: return \"SurfaceCapabilities2KHR\";\n      case StructureType::eSurfaceFormat2KHR: return \"SurfaceFormat2KHR\";\n      case StructureType::eDisplayProperties2KHR: return \"DisplayProperties2KHR\";\n      case StructureType::eDisplayPlaneProperties2KHR: return \"DisplayPlaneProperties2KHR\";\n      case StructureType::eDisplayModeProperties2KHR: return \"DisplayModeProperties2KHR\";\n      case StructureType::eDisplayPlaneInfo2KHR: return \"DisplayPlaneInfo2KHR\";\n      case StructureType::eDisplayPlaneCapabilities2KHR: return \"DisplayPlaneCapabilities2KHR\";\n#if defined( VK_USE_PLATFORM_IOS_MVK )\n      case StructureType::eIosSurfaceCreateInfoMVK: return \"IosSurfaceCreateInfoMVK\";\n#endif /*VK_USE_PLATFORM_IOS_MVK*/\n#if defined( VK_USE_PLATFORM_MACOS_MVK )\n      case StructureType::eMacosSurfaceCreateInfoMVK: return \"MacosSurfaceCreateInfoMVK\";\n#endif /*VK_USE_PLATFORM_MACOS_MVK*/\n      case StructureType::eDebugUtilsObjectNameInfoEXT: return \"DebugUtilsObjectNameInfoEXT\";\n      case StructureType::eDebugUtilsObjectTagInfoEXT: return \"DebugUtilsObjectTagInfoEXT\";\n      case StructureType::eDebugUtilsLabelEXT: return \"DebugUtilsLabelEXT\";\n      case StructureType::eDebugUtilsMessengerCallbackDataEXT: return \"DebugUtilsMessengerCallbackDataEXT\";\n      case StructureType::eDebugUtilsMessengerCreateInfoEXT: return \"DebugUtilsMessengerCreateInfoEXT\";\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n      case StructureType::eAndroidHardwareBufferUsageANDROID: return \"AndroidHardwareBufferUsageANDROID\";\n      case StructureType::eAndroidHardwareBufferPropertiesANDROID: return \"AndroidHardwareBufferPropertiesANDROID\";\n      case StructureType::eAndroidHardwareBufferFormatPropertiesANDROID: return \"AndroidHardwareBufferFormatPropertiesANDROID\";\n      case StructureType::eImportAndroidHardwareBufferInfoANDROID: return \"ImportAndroidHardwareBufferInfoANDROID\";\n      case StructureType::eMemoryGetAndroidHardwareBufferInfoANDROID: return \"MemoryGetAndroidHardwareBufferInfoANDROID\";\n      case StructureType::eExternalFormatANDROID: return \"ExternalFormatANDROID\";\n      case StructureType::eAndroidHardwareBufferFormatProperties2ANDROID: return \"AndroidHardwareBufferFormatProperties2ANDROID\";\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      case StructureType::ePhysicalDeviceShaderEnqueueFeaturesAMDX: return \"PhysicalDeviceShaderEnqueueFeaturesAMDX\";\n      case StructureType::ePhysicalDeviceShaderEnqueuePropertiesAMDX: return \"PhysicalDeviceShaderEnqueuePropertiesAMDX\";\n      case StructureType::eExecutionGraphPipelineScratchSizeAMDX: return \"ExecutionGraphPipelineScratchSizeAMDX\";\n      case StructureType::eExecutionGraphPipelineCreateInfoAMDX: return \"ExecutionGraphPipelineCreateInfoAMDX\";\n      case StructureType::ePipelineShaderStageNodeCreateInfoAMDX: return \"PipelineShaderStageNodeCreateInfoAMDX\";\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n      case StructureType::eAttachmentSampleCountInfoAMD: return \"AttachmentSampleCountInfoAMD\";\n      case StructureType::eSampleLocationsInfoEXT: return \"SampleLocationsInfoEXT\";\n      case StructureType::eRenderPassSampleLocationsBeginInfoEXT: return \"RenderPassSampleLocationsBeginInfoEXT\";\n      case StructureType::ePipelineSampleLocationsStateCreateInfoEXT: return \"PipelineSampleLocationsStateCreateInfoEXT\";\n      case StructureType::ePhysicalDeviceSampleLocationsPropertiesEXT: return \"PhysicalDeviceSampleLocationsPropertiesEXT\";\n      case StructureType::eMultisamplePropertiesEXT: return \"MultisamplePropertiesEXT\";\n      case StructureType::ePhysicalDeviceBlendOperationAdvancedFeaturesEXT: return \"PhysicalDeviceBlendOperationAdvancedFeaturesEXT\";\n      case StructureType::ePhysicalDeviceBlendOperationAdvancedPropertiesEXT: return \"PhysicalDeviceBlendOperationAdvancedPropertiesEXT\";\n      case StructureType::ePipelineColorBlendAdvancedStateCreateInfoEXT: return \"PipelineColorBlendAdvancedStateCreateInfoEXT\";\n      case StructureType::ePipelineCoverageToColorStateCreateInfoNV: return \"PipelineCoverageToColorStateCreateInfoNV\";\n      case StructureType::eWriteDescriptorSetAccelerationStructureKHR: return \"WriteDescriptorSetAccelerationStructureKHR\";\n      case StructureType::eAccelerationStructureBuildGeometryInfoKHR: return \"AccelerationStructureBuildGeometryInfoKHR\";\n      case StructureType::eAccelerationStructureDeviceAddressInfoKHR: return \"AccelerationStructureDeviceAddressInfoKHR\";\n      case StructureType::eAccelerationStructureGeometryAabbsDataKHR: return \"AccelerationStructureGeometryAabbsDataKHR\";\n      case StructureType::eAccelerationStructureGeometryInstancesDataKHR: return \"AccelerationStructureGeometryInstancesDataKHR\";\n      case StructureType::eAccelerationStructureGeometryTrianglesDataKHR: return \"AccelerationStructureGeometryTrianglesDataKHR\";\n      case StructureType::eAccelerationStructureGeometryKHR: return \"AccelerationStructureGeometryKHR\";\n      case StructureType::eAccelerationStructureVersionInfoKHR: return \"AccelerationStructureVersionInfoKHR\";\n      case StructureType::eCopyAccelerationStructureInfoKHR: return \"CopyAccelerationStructureInfoKHR\";\n      case StructureType::eCopyAccelerationStructureToMemoryInfoKHR: return \"CopyAccelerationStructureToMemoryInfoKHR\";\n      case StructureType::eCopyMemoryToAccelerationStructureInfoKHR: return \"CopyMemoryToAccelerationStructureInfoKHR\";\n      case StructureType::ePhysicalDeviceAccelerationStructureFeaturesKHR: return \"PhysicalDeviceAccelerationStructureFeaturesKHR\";\n      case StructureType::ePhysicalDeviceAccelerationStructurePropertiesKHR: return \"PhysicalDeviceAccelerationStructurePropertiesKHR\";\n      case StructureType::eAccelerationStructureCreateInfoKHR: return \"AccelerationStructureCreateInfoKHR\";\n      case StructureType::eAccelerationStructureBuildSizesInfoKHR: return \"AccelerationStructureBuildSizesInfoKHR\";\n      case StructureType::ePhysicalDeviceRayTracingPipelineFeaturesKHR: return \"PhysicalDeviceRayTracingPipelineFeaturesKHR\";\n      case StructureType::ePhysicalDeviceRayTracingPipelinePropertiesKHR: return \"PhysicalDeviceRayTracingPipelinePropertiesKHR\";\n      case StructureType::eRayTracingPipelineCreateInfoKHR: return \"RayTracingPipelineCreateInfoKHR\";\n      case StructureType::eRayTracingShaderGroupCreateInfoKHR: return \"RayTracingShaderGroupCreateInfoKHR\";\n      case StructureType::eRayTracingPipelineInterfaceCreateInfoKHR: return \"RayTracingPipelineInterfaceCreateInfoKHR\";\n      case StructureType::ePhysicalDeviceRayQueryFeaturesKHR: return \"PhysicalDeviceRayQueryFeaturesKHR\";\n      case StructureType::ePipelineCoverageModulationStateCreateInfoNV: return \"PipelineCoverageModulationStateCreateInfoNV\";\n      case StructureType::ePhysicalDeviceShaderSmBuiltinsFeaturesNV: return \"PhysicalDeviceShaderSmBuiltinsFeaturesNV\";\n      case StructureType::ePhysicalDeviceShaderSmBuiltinsPropertiesNV: return \"PhysicalDeviceShaderSmBuiltinsPropertiesNV\";\n      case StructureType::eDrmFormatModifierPropertiesListEXT: return \"DrmFormatModifierPropertiesListEXT\";\n      case StructureType::ePhysicalDeviceImageDrmFormatModifierInfoEXT: return \"PhysicalDeviceImageDrmFormatModifierInfoEXT\";\n      case StructureType::eImageDrmFormatModifierListCreateInfoEXT: return \"ImageDrmFormatModifierListCreateInfoEXT\";\n      case StructureType::eImageDrmFormatModifierExplicitCreateInfoEXT: return \"ImageDrmFormatModifierExplicitCreateInfoEXT\";\n      case StructureType::eImageDrmFormatModifierPropertiesEXT: return \"ImageDrmFormatModifierPropertiesEXT\";\n      case StructureType::eDrmFormatModifierPropertiesList2EXT: return \"DrmFormatModifierPropertiesList2EXT\";\n      case StructureType::eValidationCacheCreateInfoEXT: return \"ValidationCacheCreateInfoEXT\";\n      case StructureType::eShaderModuleValidationCacheCreateInfoEXT: return \"ShaderModuleValidationCacheCreateInfoEXT\";\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      case StructureType::ePhysicalDevicePortabilitySubsetFeaturesKHR: return \"PhysicalDevicePortabilitySubsetFeaturesKHR\";\n      case StructureType::ePhysicalDevicePortabilitySubsetPropertiesKHR: return \"PhysicalDevicePortabilitySubsetPropertiesKHR\";\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n      case StructureType::ePipelineViewportShadingRateImageStateCreateInfoNV: return \"PipelineViewportShadingRateImageStateCreateInfoNV\";\n      case StructureType::ePhysicalDeviceShadingRateImageFeaturesNV: return \"PhysicalDeviceShadingRateImageFeaturesNV\";\n      case StructureType::ePhysicalDeviceShadingRateImagePropertiesNV: return \"PhysicalDeviceShadingRateImagePropertiesNV\";\n      case StructureType::ePipelineViewportCoarseSampleOrderStateCreateInfoNV: return \"PipelineViewportCoarseSampleOrderStateCreateInfoNV\";\n      case StructureType::eRayTracingPipelineCreateInfoNV: return \"RayTracingPipelineCreateInfoNV\";\n      case StructureType::eAccelerationStructureCreateInfoNV: return \"AccelerationStructureCreateInfoNV\";\n      case StructureType::eGeometryNV: return \"GeometryNV\";\n      case StructureType::eGeometryTrianglesNV: return \"GeometryTrianglesNV\";\n      case StructureType::eGeometryAabbNV: return \"GeometryAabbNV\";\n      case StructureType::eBindAccelerationStructureMemoryInfoNV: return \"BindAccelerationStructureMemoryInfoNV\";\n      case StructureType::eWriteDescriptorSetAccelerationStructureNV: return \"WriteDescriptorSetAccelerationStructureNV\";\n      case StructureType::eAccelerationStructureMemoryRequirementsInfoNV: return \"AccelerationStructureMemoryRequirementsInfoNV\";\n      case StructureType::ePhysicalDeviceRayTracingPropertiesNV: return \"PhysicalDeviceRayTracingPropertiesNV\";\n      case StructureType::eRayTracingShaderGroupCreateInfoNV: return \"RayTracingShaderGroupCreateInfoNV\";\n      case StructureType::eAccelerationStructureInfoNV: return \"AccelerationStructureInfoNV\";\n      case StructureType::ePhysicalDeviceRepresentativeFragmentTestFeaturesNV: return \"PhysicalDeviceRepresentativeFragmentTestFeaturesNV\";\n      case StructureType::ePipelineRepresentativeFragmentTestStateCreateInfoNV: return \"PipelineRepresentativeFragmentTestStateCreateInfoNV\";\n      case StructureType::ePhysicalDeviceImageViewImageFormatInfoEXT: return \"PhysicalDeviceImageViewImageFormatInfoEXT\";\n      case StructureType::eFilterCubicImageViewImageFormatPropertiesEXT: return \"FilterCubicImageViewImageFormatPropertiesEXT\";\n      case StructureType::eImportMemoryHostPointerInfoEXT: return \"ImportMemoryHostPointerInfoEXT\";\n      case StructureType::eMemoryHostPointerPropertiesEXT: return \"MemoryHostPointerPropertiesEXT\";\n      case StructureType::ePhysicalDeviceExternalMemoryHostPropertiesEXT: return \"PhysicalDeviceExternalMemoryHostPropertiesEXT\";\n      case StructureType::ePhysicalDeviceShaderClockFeaturesKHR: return \"PhysicalDeviceShaderClockFeaturesKHR\";\n      case StructureType::ePipelineCompilerControlCreateInfoAMD: return \"PipelineCompilerControlCreateInfoAMD\";\n      case StructureType::ePhysicalDeviceShaderCorePropertiesAMD: return \"PhysicalDeviceShaderCorePropertiesAMD\";\n      case StructureType::eVideoDecodeH265CapabilitiesKHR: return \"VideoDecodeH265CapabilitiesKHR\";\n      case StructureType::eVideoDecodeH265SessionParametersCreateInfoKHR: return \"VideoDecodeH265SessionParametersCreateInfoKHR\";\n      case StructureType::eVideoDecodeH265SessionParametersAddInfoKHR: return \"VideoDecodeH265SessionParametersAddInfoKHR\";\n      case StructureType::eVideoDecodeH265ProfileInfoKHR: return \"VideoDecodeH265ProfileInfoKHR\";\n      case StructureType::eVideoDecodeH265PictureInfoKHR: return \"VideoDecodeH265PictureInfoKHR\";\n      case StructureType::eVideoDecodeH265DpbSlotInfoKHR: return \"VideoDecodeH265DpbSlotInfoKHR\";\n      case StructureType::eDeviceMemoryOverallocationCreateInfoAMD: return \"DeviceMemoryOverallocationCreateInfoAMD\";\n      case StructureType::ePhysicalDeviceVertexAttributeDivisorPropertiesEXT: return \"PhysicalDeviceVertexAttributeDivisorPropertiesEXT\";\n#if defined( VK_USE_PLATFORM_GGP )\n      case StructureType::ePresentFrameTokenGGP: return \"PresentFrameTokenGGP\";\n#endif /*VK_USE_PLATFORM_GGP*/\n      case StructureType::ePhysicalDeviceMeshShaderFeaturesNV: return \"PhysicalDeviceMeshShaderFeaturesNV\";\n      case StructureType::ePhysicalDeviceMeshShaderPropertiesNV: return \"PhysicalDeviceMeshShaderPropertiesNV\";\n      case StructureType::ePhysicalDeviceShaderImageFootprintFeaturesNV: return \"PhysicalDeviceShaderImageFootprintFeaturesNV\";\n      case StructureType::ePipelineViewportExclusiveScissorStateCreateInfoNV: return \"PipelineViewportExclusiveScissorStateCreateInfoNV\";\n      case StructureType::ePhysicalDeviceExclusiveScissorFeaturesNV: return \"PhysicalDeviceExclusiveScissorFeaturesNV\";\n      case StructureType::eCheckpointDataNV: return \"CheckpointDataNV\";\n      case StructureType::eQueueFamilyCheckpointPropertiesNV: return \"QueueFamilyCheckpointPropertiesNV\";\n      case StructureType::eQueueFamilyCheckpointProperties2NV: return \"QueueFamilyCheckpointProperties2NV\";\n      case StructureType::eCheckpointData2NV: return \"CheckpointData2NV\";\n      case StructureType::ePhysicalDeviceShaderIntegerFunctions2FeaturesINTEL: return \"PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL\";\n      case StructureType::eQueryPoolPerformanceQueryCreateInfoINTEL: return \"QueryPoolPerformanceQueryCreateInfoINTEL\";\n      case StructureType::eInitializePerformanceApiInfoINTEL: return \"InitializePerformanceApiInfoINTEL\";\n      case StructureType::ePerformanceMarkerInfoINTEL: return \"PerformanceMarkerInfoINTEL\";\n      case StructureType::ePerformanceStreamMarkerInfoINTEL: return \"PerformanceStreamMarkerInfoINTEL\";\n      case StructureType::ePerformanceOverrideInfoINTEL: return \"PerformanceOverrideInfoINTEL\";\n      case StructureType::ePerformanceConfigurationAcquireInfoINTEL: return \"PerformanceConfigurationAcquireInfoINTEL\";\n      case StructureType::ePhysicalDevicePciBusInfoPropertiesEXT: return \"PhysicalDevicePciBusInfoPropertiesEXT\";\n      case StructureType::eDisplayNativeHdrSurfaceCapabilitiesAMD: return \"DisplayNativeHdrSurfaceCapabilitiesAMD\";\n      case StructureType::eSwapchainDisplayNativeHdrCreateInfoAMD: return \"SwapchainDisplayNativeHdrCreateInfoAMD\";\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n      case StructureType::eImagepipeSurfaceCreateInfoFUCHSIA: return \"ImagepipeSurfaceCreateInfoFUCHSIA\";\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n      case StructureType::eMetalSurfaceCreateInfoEXT: return \"MetalSurfaceCreateInfoEXT\";\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n      case StructureType::ePhysicalDeviceFragmentDensityMapFeaturesEXT: return \"PhysicalDeviceFragmentDensityMapFeaturesEXT\";\n      case StructureType::ePhysicalDeviceFragmentDensityMapPropertiesEXT: return \"PhysicalDeviceFragmentDensityMapPropertiesEXT\";\n      case StructureType::eRenderPassFragmentDensityMapCreateInfoEXT: return \"RenderPassFragmentDensityMapCreateInfoEXT\";\n      case StructureType::eRenderingFragmentDensityMapAttachmentInfoEXT: return \"RenderingFragmentDensityMapAttachmentInfoEXT\";\n      case StructureType::eFragmentShadingRateAttachmentInfoKHR: return \"FragmentShadingRateAttachmentInfoKHR\";\n      case StructureType::ePipelineFragmentShadingRateStateCreateInfoKHR: return \"PipelineFragmentShadingRateStateCreateInfoKHR\";\n      case StructureType::ePhysicalDeviceFragmentShadingRatePropertiesKHR: return \"PhysicalDeviceFragmentShadingRatePropertiesKHR\";\n      case StructureType::ePhysicalDeviceFragmentShadingRateFeaturesKHR: return \"PhysicalDeviceFragmentShadingRateFeaturesKHR\";\n      case StructureType::ePhysicalDeviceFragmentShadingRateKHR: return \"PhysicalDeviceFragmentShadingRateKHR\";\n      case StructureType::eRenderingFragmentShadingRateAttachmentInfoKHR: return \"RenderingFragmentShadingRateAttachmentInfoKHR\";\n      case StructureType::ePhysicalDeviceShaderCoreProperties2AMD: return \"PhysicalDeviceShaderCoreProperties2AMD\";\n      case StructureType::ePhysicalDeviceCoherentMemoryFeaturesAMD: return \"PhysicalDeviceCoherentMemoryFeaturesAMD\";\n      case StructureType::ePhysicalDeviceShaderImageAtomicInt64FeaturesEXT: return \"PhysicalDeviceShaderImageAtomicInt64FeaturesEXT\";\n      case StructureType::ePhysicalDeviceShaderQuadControlFeaturesKHR: return \"PhysicalDeviceShaderQuadControlFeaturesKHR\";\n      case StructureType::ePhysicalDeviceMemoryBudgetPropertiesEXT: return \"PhysicalDeviceMemoryBudgetPropertiesEXT\";\n      case StructureType::ePhysicalDeviceMemoryPriorityFeaturesEXT: return \"PhysicalDeviceMemoryPriorityFeaturesEXT\";\n      case StructureType::eMemoryPriorityAllocateInfoEXT: return \"MemoryPriorityAllocateInfoEXT\";\n      case StructureType::eSurfaceProtectedCapabilitiesKHR: return \"SurfaceProtectedCapabilitiesKHR\";\n      case StructureType::ePhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV: return \"PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV\";\n      case StructureType::ePhysicalDeviceBufferDeviceAddressFeaturesEXT: return \"PhysicalDeviceBufferDeviceAddressFeaturesEXT\";\n      case StructureType::eBufferDeviceAddressCreateInfoEXT: return \"BufferDeviceAddressCreateInfoEXT\";\n      case StructureType::eValidationFeaturesEXT: return \"ValidationFeaturesEXT\";\n      case StructureType::ePhysicalDevicePresentWaitFeaturesKHR: return \"PhysicalDevicePresentWaitFeaturesKHR\";\n      case StructureType::ePhysicalDeviceCooperativeMatrixFeaturesNV: return \"PhysicalDeviceCooperativeMatrixFeaturesNV\";\n      case StructureType::eCooperativeMatrixPropertiesNV: return \"CooperativeMatrixPropertiesNV\";\n      case StructureType::ePhysicalDeviceCooperativeMatrixPropertiesNV: return \"PhysicalDeviceCooperativeMatrixPropertiesNV\";\n      case StructureType::ePhysicalDeviceCoverageReductionModeFeaturesNV: return \"PhysicalDeviceCoverageReductionModeFeaturesNV\";\n      case StructureType::ePipelineCoverageReductionStateCreateInfoNV: return \"PipelineCoverageReductionStateCreateInfoNV\";\n      case StructureType::eFramebufferMixedSamplesCombinationNV: return \"FramebufferMixedSamplesCombinationNV\";\n      case StructureType::ePhysicalDeviceFragmentShaderInterlockFeaturesEXT: return \"PhysicalDeviceFragmentShaderInterlockFeaturesEXT\";\n      case StructureType::ePhysicalDeviceYcbcrImageArraysFeaturesEXT: return \"PhysicalDeviceYcbcrImageArraysFeaturesEXT\";\n      case StructureType::ePhysicalDeviceProvokingVertexFeaturesEXT: return \"PhysicalDeviceProvokingVertexFeaturesEXT\";\n      case StructureType::ePipelineRasterizationProvokingVertexStateCreateInfoEXT: return \"PipelineRasterizationProvokingVertexStateCreateInfoEXT\";\n      case StructureType::ePhysicalDeviceProvokingVertexPropertiesEXT: return \"PhysicalDeviceProvokingVertexPropertiesEXT\";\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n      case StructureType::eSurfaceFullScreenExclusiveInfoEXT: return \"SurfaceFullScreenExclusiveInfoEXT\";\n      case StructureType::eSurfaceCapabilitiesFullScreenExclusiveEXT: return \"SurfaceCapabilitiesFullScreenExclusiveEXT\";\n      case StructureType::eSurfaceFullScreenExclusiveWin32InfoEXT: return \"SurfaceFullScreenExclusiveWin32InfoEXT\";\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n      case StructureType::eHeadlessSurfaceCreateInfoEXT: return \"HeadlessSurfaceCreateInfoEXT\";\n      case StructureType::ePhysicalDeviceShaderAtomicFloatFeaturesEXT: return \"PhysicalDeviceShaderAtomicFloatFeaturesEXT\";\n      case StructureType::ePhysicalDeviceExtendedDynamicStateFeaturesEXT: return \"PhysicalDeviceExtendedDynamicStateFeaturesEXT\";\n      case StructureType::ePhysicalDevicePipelineExecutablePropertiesFeaturesKHR: return \"PhysicalDevicePipelineExecutablePropertiesFeaturesKHR\";\n      case StructureType::ePipelineInfoKHR: return \"PipelineInfoKHR\";\n      case StructureType::ePipelineExecutablePropertiesKHR: return \"PipelineExecutablePropertiesKHR\";\n      case StructureType::ePipelineExecutableInfoKHR: return \"PipelineExecutableInfoKHR\";\n      case StructureType::ePipelineExecutableStatisticKHR: return \"PipelineExecutableStatisticKHR\";\n      case StructureType::ePipelineExecutableInternalRepresentationKHR: return \"PipelineExecutableInternalRepresentationKHR\";\n      case StructureType::ePhysicalDeviceMapMemoryPlacedFeaturesEXT: return \"PhysicalDeviceMapMemoryPlacedFeaturesEXT\";\n      case StructureType::ePhysicalDeviceMapMemoryPlacedPropertiesEXT: return \"PhysicalDeviceMapMemoryPlacedPropertiesEXT\";\n      case StructureType::eMemoryMapPlacedInfoEXT: return \"MemoryMapPlacedInfoEXT\";\n      case StructureType::ePhysicalDeviceShaderAtomicFloat2FeaturesEXT: return \"PhysicalDeviceShaderAtomicFloat2FeaturesEXT\";\n      case StructureType::eSurfacePresentModeEXT: return \"SurfacePresentModeEXT\";\n      case StructureType::eSurfacePresentScalingCapabilitiesEXT: return \"SurfacePresentScalingCapabilitiesEXT\";\n      case StructureType::eSurfacePresentModeCompatibilityEXT: return \"SurfacePresentModeCompatibilityEXT\";\n      case StructureType::ePhysicalDeviceSwapchainMaintenance1FeaturesEXT: return \"PhysicalDeviceSwapchainMaintenance1FeaturesEXT\";\n      case StructureType::eSwapchainPresentFenceInfoEXT: return \"SwapchainPresentFenceInfoEXT\";\n      case StructureType::eSwapchainPresentModesCreateInfoEXT: return \"SwapchainPresentModesCreateInfoEXT\";\n      case StructureType::eSwapchainPresentModeInfoEXT: return \"SwapchainPresentModeInfoEXT\";\n      case StructureType::eSwapchainPresentScalingCreateInfoEXT: return \"SwapchainPresentScalingCreateInfoEXT\";\n      case StructureType::eReleaseSwapchainImagesInfoEXT: return \"ReleaseSwapchainImagesInfoEXT\";\n      case StructureType::ePhysicalDeviceDeviceGeneratedCommandsPropertiesNV: return \"PhysicalDeviceDeviceGeneratedCommandsPropertiesNV\";\n      case StructureType::eGraphicsShaderGroupCreateInfoNV: return \"GraphicsShaderGroupCreateInfoNV\";\n      case StructureType::eGraphicsPipelineShaderGroupsCreateInfoNV: return \"GraphicsPipelineShaderGroupsCreateInfoNV\";\n      case StructureType::eIndirectCommandsLayoutTokenNV: return \"IndirectCommandsLayoutTokenNV\";\n      case StructureType::eIndirectCommandsLayoutCreateInfoNV: return \"IndirectCommandsLayoutCreateInfoNV\";\n      case StructureType::eGeneratedCommandsInfoNV: return \"GeneratedCommandsInfoNV\";\n      case StructureType::eGeneratedCommandsMemoryRequirementsInfoNV: return \"GeneratedCommandsMemoryRequirementsInfoNV\";\n      case StructureType::ePhysicalDeviceDeviceGeneratedCommandsFeaturesNV: return \"PhysicalDeviceDeviceGeneratedCommandsFeaturesNV\";\n      case StructureType::ePhysicalDeviceInheritedViewportScissorFeaturesNV: return \"PhysicalDeviceInheritedViewportScissorFeaturesNV\";\n      case StructureType::eCommandBufferInheritanceViewportScissorInfoNV: return \"CommandBufferInheritanceViewportScissorInfoNV\";\n      case StructureType::ePhysicalDeviceTexelBufferAlignmentFeaturesEXT: return \"PhysicalDeviceTexelBufferAlignmentFeaturesEXT\";\n      case StructureType::eCommandBufferInheritanceRenderPassTransformInfoQCOM: return \"CommandBufferInheritanceRenderPassTransformInfoQCOM\";\n      case StructureType::eRenderPassTransformBeginInfoQCOM: return \"RenderPassTransformBeginInfoQCOM\";\n      case StructureType::ePhysicalDeviceDepthBiasControlFeaturesEXT: return \"PhysicalDeviceDepthBiasControlFeaturesEXT\";\n      case StructureType::eDepthBiasInfoEXT: return \"DepthBiasInfoEXT\";\n      case StructureType::eDepthBiasRepresentationInfoEXT: return \"DepthBiasRepresentationInfoEXT\";\n      case StructureType::ePhysicalDeviceDeviceMemoryReportFeaturesEXT: return \"PhysicalDeviceDeviceMemoryReportFeaturesEXT\";\n      case StructureType::eDeviceDeviceMemoryReportCreateInfoEXT: return \"DeviceDeviceMemoryReportCreateInfoEXT\";\n      case StructureType::eDeviceMemoryReportCallbackDataEXT: return \"DeviceMemoryReportCallbackDataEXT\";\n      case StructureType::ePhysicalDeviceRobustness2FeaturesEXT: return \"PhysicalDeviceRobustness2FeaturesEXT\";\n      case StructureType::ePhysicalDeviceRobustness2PropertiesEXT: return \"PhysicalDeviceRobustness2PropertiesEXT\";\n      case StructureType::eSamplerCustomBorderColorCreateInfoEXT: return \"SamplerCustomBorderColorCreateInfoEXT\";\n      case StructureType::ePhysicalDeviceCustomBorderColorPropertiesEXT: return \"PhysicalDeviceCustomBorderColorPropertiesEXT\";\n      case StructureType::ePhysicalDeviceCustomBorderColorFeaturesEXT: return \"PhysicalDeviceCustomBorderColorFeaturesEXT\";\n      case StructureType::ePipelineLibraryCreateInfoKHR: return \"PipelineLibraryCreateInfoKHR\";\n      case StructureType::ePhysicalDevicePresentBarrierFeaturesNV: return \"PhysicalDevicePresentBarrierFeaturesNV\";\n      case StructureType::eSurfaceCapabilitiesPresentBarrierNV: return \"SurfaceCapabilitiesPresentBarrierNV\";\n      case StructureType::eSwapchainPresentBarrierCreateInfoNV: return \"SwapchainPresentBarrierCreateInfoNV\";\n      case StructureType::ePresentIdKHR: return \"PresentIdKHR\";\n      case StructureType::ePhysicalDevicePresentIdFeaturesKHR: return \"PhysicalDevicePresentIdFeaturesKHR\";\n      case StructureType::eVideoEncodeInfoKHR: return \"VideoEncodeInfoKHR\";\n      case StructureType::eVideoEncodeRateControlInfoKHR: return \"VideoEncodeRateControlInfoKHR\";\n      case StructureType::eVideoEncodeRateControlLayerInfoKHR: return \"VideoEncodeRateControlLayerInfoKHR\";\n      case StructureType::eVideoEncodeCapabilitiesKHR: return \"VideoEncodeCapabilitiesKHR\";\n      case StructureType::eVideoEncodeUsageInfoKHR: return \"VideoEncodeUsageInfoKHR\";\n      case StructureType::eQueryPoolVideoEncodeFeedbackCreateInfoKHR: return \"QueryPoolVideoEncodeFeedbackCreateInfoKHR\";\n      case StructureType::ePhysicalDeviceVideoEncodeQualityLevelInfoKHR: return \"PhysicalDeviceVideoEncodeQualityLevelInfoKHR\";\n      case StructureType::eVideoEncodeQualityLevelPropertiesKHR: return \"VideoEncodeQualityLevelPropertiesKHR\";\n      case StructureType::eVideoEncodeQualityLevelInfoKHR: return \"VideoEncodeQualityLevelInfoKHR\";\n      case StructureType::eVideoEncodeSessionParametersGetInfoKHR: return \"VideoEncodeSessionParametersGetInfoKHR\";\n      case StructureType::eVideoEncodeSessionParametersFeedbackInfoKHR: return \"VideoEncodeSessionParametersFeedbackInfoKHR\";\n      case StructureType::ePhysicalDeviceDiagnosticsConfigFeaturesNV: return \"PhysicalDeviceDiagnosticsConfigFeaturesNV\";\n      case StructureType::eDeviceDiagnosticsConfigCreateInfoNV: return \"DeviceDiagnosticsConfigCreateInfoNV\";\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      case StructureType::eCudaModuleCreateInfoNV: return \"CudaModuleCreateInfoNV\";\n      case StructureType::eCudaFunctionCreateInfoNV: return \"CudaFunctionCreateInfoNV\";\n      case StructureType::eCudaLaunchInfoNV: return \"CudaLaunchInfoNV\";\n      case StructureType::ePhysicalDeviceCudaKernelLaunchFeaturesNV: return \"PhysicalDeviceCudaKernelLaunchFeaturesNV\";\n      case StructureType::ePhysicalDeviceCudaKernelLaunchPropertiesNV: return \"PhysicalDeviceCudaKernelLaunchPropertiesNV\";\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n      case StructureType::eQueryLowLatencySupportNV: return \"QueryLowLatencySupportNV\";\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n      case StructureType::eExportMetalObjectCreateInfoEXT: return \"ExportMetalObjectCreateInfoEXT\";\n      case StructureType::eExportMetalObjectsInfoEXT: return \"ExportMetalObjectsInfoEXT\";\n      case StructureType::eExportMetalDeviceInfoEXT: return \"ExportMetalDeviceInfoEXT\";\n      case StructureType::eExportMetalCommandQueueInfoEXT: return \"ExportMetalCommandQueueInfoEXT\";\n      case StructureType::eExportMetalBufferInfoEXT: return \"ExportMetalBufferInfoEXT\";\n      case StructureType::eImportMetalBufferInfoEXT: return \"ImportMetalBufferInfoEXT\";\n      case StructureType::eExportMetalTextureInfoEXT: return \"ExportMetalTextureInfoEXT\";\n      case StructureType::eImportMetalTextureInfoEXT: return \"ImportMetalTextureInfoEXT\";\n      case StructureType::eExportMetalIoSurfaceInfoEXT: return \"ExportMetalIoSurfaceInfoEXT\";\n      case StructureType::eImportMetalIoSurfaceInfoEXT: return \"ImportMetalIoSurfaceInfoEXT\";\n      case StructureType::eExportMetalSharedEventInfoEXT: return \"ExportMetalSharedEventInfoEXT\";\n      case StructureType::eImportMetalSharedEventInfoEXT: return \"ImportMetalSharedEventInfoEXT\";\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n      case StructureType::ePhysicalDeviceDescriptorBufferPropertiesEXT: return \"PhysicalDeviceDescriptorBufferPropertiesEXT\";\n      case StructureType::ePhysicalDeviceDescriptorBufferDensityMapPropertiesEXT: return \"PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT\";\n      case StructureType::ePhysicalDeviceDescriptorBufferFeaturesEXT: return \"PhysicalDeviceDescriptorBufferFeaturesEXT\";\n      case StructureType::eDescriptorAddressInfoEXT: return \"DescriptorAddressInfoEXT\";\n      case StructureType::eDescriptorGetInfoEXT: return \"DescriptorGetInfoEXT\";\n      case StructureType::eBufferCaptureDescriptorDataInfoEXT: return \"BufferCaptureDescriptorDataInfoEXT\";\n      case StructureType::eImageCaptureDescriptorDataInfoEXT: return \"ImageCaptureDescriptorDataInfoEXT\";\n      case StructureType::eImageViewCaptureDescriptorDataInfoEXT: return \"ImageViewCaptureDescriptorDataInfoEXT\";\n      case StructureType::eSamplerCaptureDescriptorDataInfoEXT: return \"SamplerCaptureDescriptorDataInfoEXT\";\n      case StructureType::eOpaqueCaptureDescriptorDataCreateInfoEXT: return \"OpaqueCaptureDescriptorDataCreateInfoEXT\";\n      case StructureType::eDescriptorBufferBindingInfoEXT: return \"DescriptorBufferBindingInfoEXT\";\n      case StructureType::eDescriptorBufferBindingPushDescriptorBufferHandleEXT: return \"DescriptorBufferBindingPushDescriptorBufferHandleEXT\";\n      case StructureType::eAccelerationStructureCaptureDescriptorDataInfoEXT: return \"AccelerationStructureCaptureDescriptorDataInfoEXT\";\n      case StructureType::ePhysicalDeviceGraphicsPipelineLibraryFeaturesEXT: return \"PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT\";\n      case StructureType::ePhysicalDeviceGraphicsPipelineLibraryPropertiesEXT: return \"PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT\";\n      case StructureType::eGraphicsPipelineLibraryCreateInfoEXT: return \"GraphicsPipelineLibraryCreateInfoEXT\";\n      case StructureType::ePhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD: return \"PhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD\";\n      case StructureType::ePhysicalDeviceFragmentShaderBarycentricFeaturesKHR: return \"PhysicalDeviceFragmentShaderBarycentricFeaturesKHR\";\n      case StructureType::ePhysicalDeviceFragmentShaderBarycentricPropertiesKHR: return \"PhysicalDeviceFragmentShaderBarycentricPropertiesKHR\";\n      case StructureType::ePhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR: return \"PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR\";\n      case StructureType::ePhysicalDeviceFragmentShadingRateEnumsPropertiesNV: return \"PhysicalDeviceFragmentShadingRateEnumsPropertiesNV\";\n      case StructureType::ePhysicalDeviceFragmentShadingRateEnumsFeaturesNV: return \"PhysicalDeviceFragmentShadingRateEnumsFeaturesNV\";\n      case StructureType::ePipelineFragmentShadingRateEnumStateCreateInfoNV: return \"PipelineFragmentShadingRateEnumStateCreateInfoNV\";\n      case StructureType::eAccelerationStructureGeometryMotionTrianglesDataNV: return \"AccelerationStructureGeometryMotionTrianglesDataNV\";\n      case StructureType::ePhysicalDeviceRayTracingMotionBlurFeaturesNV: return \"PhysicalDeviceRayTracingMotionBlurFeaturesNV\";\n      case StructureType::eAccelerationStructureMotionInfoNV: return \"AccelerationStructureMotionInfoNV\";\n      case StructureType::ePhysicalDeviceMeshShaderFeaturesEXT: return \"PhysicalDeviceMeshShaderFeaturesEXT\";\n      case StructureType::ePhysicalDeviceMeshShaderPropertiesEXT: return \"PhysicalDeviceMeshShaderPropertiesEXT\";\n      case StructureType::ePhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT: return \"PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT\";\n      case StructureType::ePhysicalDeviceFragmentDensityMap2FeaturesEXT: return \"PhysicalDeviceFragmentDensityMap2FeaturesEXT\";\n      case StructureType::ePhysicalDeviceFragmentDensityMap2PropertiesEXT: return \"PhysicalDeviceFragmentDensityMap2PropertiesEXT\";\n      case StructureType::eCopyCommandTransformInfoQCOM: return \"CopyCommandTransformInfoQCOM\";\n      case StructureType::ePhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR: return \"PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR\";\n      case StructureType::ePhysicalDeviceImageCompressionControlFeaturesEXT: return \"PhysicalDeviceImageCompressionControlFeaturesEXT\";\n      case StructureType::eImageCompressionControlEXT: return \"ImageCompressionControlEXT\";\n      case StructureType::eImageCompressionPropertiesEXT: return \"ImageCompressionPropertiesEXT\";\n      case StructureType::ePhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT: return \"PhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT\";\n      case StructureType::ePhysicalDevice4444FormatsFeaturesEXT: return \"PhysicalDevice4444FormatsFeaturesEXT\";\n      case StructureType::ePhysicalDeviceFaultFeaturesEXT: return \"PhysicalDeviceFaultFeaturesEXT\";\n      case StructureType::eDeviceFaultCountsEXT: return \"DeviceFaultCountsEXT\";\n      case StructureType::eDeviceFaultInfoEXT: return \"DeviceFaultInfoEXT\";\n      case StructureType::ePhysicalDeviceRgba10X6FormatsFeaturesEXT: return \"PhysicalDeviceRgba10X6FormatsFeaturesEXT\";\n#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n      case StructureType::eDirectfbSurfaceCreateInfoEXT: return \"DirectfbSurfaceCreateInfoEXT\";\n#endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n      case StructureType::ePhysicalDeviceVertexInputDynamicStateFeaturesEXT: return \"PhysicalDeviceVertexInputDynamicStateFeaturesEXT\";\n      case StructureType::eVertexInputBindingDescription2EXT: return \"VertexInputBindingDescription2EXT\";\n      case StructureType::eVertexInputAttributeDescription2EXT: return \"VertexInputAttributeDescription2EXT\";\n      case StructureType::ePhysicalDeviceDrmPropertiesEXT: return \"PhysicalDeviceDrmPropertiesEXT\";\n      case StructureType::ePhysicalDeviceAddressBindingReportFeaturesEXT: return \"PhysicalDeviceAddressBindingReportFeaturesEXT\";\n      case StructureType::eDeviceAddressBindingCallbackDataEXT: return \"DeviceAddressBindingCallbackDataEXT\";\n      case StructureType::ePhysicalDeviceDepthClipControlFeaturesEXT: return \"PhysicalDeviceDepthClipControlFeaturesEXT\";\n      case StructureType::ePipelineViewportDepthClipControlCreateInfoEXT: return \"PipelineViewportDepthClipControlCreateInfoEXT\";\n      case StructureType::ePhysicalDevicePrimitiveTopologyListRestartFeaturesEXT: return \"PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT\";\n      case StructureType::ePhysicalDevicePresentModeFifoLatestReadyFeaturesEXT: return \"PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT\";\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n      case StructureType::eImportMemoryZirconHandleInfoFUCHSIA: return \"ImportMemoryZirconHandleInfoFUCHSIA\";\n      case StructureType::eMemoryZirconHandlePropertiesFUCHSIA: return \"MemoryZirconHandlePropertiesFUCHSIA\";\n      case StructureType::eMemoryGetZirconHandleInfoFUCHSIA: return \"MemoryGetZirconHandleInfoFUCHSIA\";\n      case StructureType::eImportSemaphoreZirconHandleInfoFUCHSIA: return \"ImportSemaphoreZirconHandleInfoFUCHSIA\";\n      case StructureType::eSemaphoreGetZirconHandleInfoFUCHSIA: return \"SemaphoreGetZirconHandleInfoFUCHSIA\";\n      case StructureType::eBufferCollectionCreateInfoFUCHSIA: return \"BufferCollectionCreateInfoFUCHSIA\";\n      case StructureType::eImportMemoryBufferCollectionFUCHSIA: return \"ImportMemoryBufferCollectionFUCHSIA\";\n      case StructureType::eBufferCollectionImageCreateInfoFUCHSIA: return \"BufferCollectionImageCreateInfoFUCHSIA\";\n      case StructureType::eBufferCollectionPropertiesFUCHSIA: return \"BufferCollectionPropertiesFUCHSIA\";\n      case StructureType::eBufferConstraintsInfoFUCHSIA: return \"BufferConstraintsInfoFUCHSIA\";\n      case StructureType::eBufferCollectionBufferCreateInfoFUCHSIA: return \"BufferCollectionBufferCreateInfoFUCHSIA\";\n      case StructureType::eImageConstraintsInfoFUCHSIA: return \"ImageConstraintsInfoFUCHSIA\";\n      case StructureType::eImageFormatConstraintsInfoFUCHSIA: return \"ImageFormatConstraintsInfoFUCHSIA\";\n      case StructureType::eSysmemColorSpaceFUCHSIA: return \"SysmemColorSpaceFUCHSIA\";\n      case StructureType::eBufferCollectionConstraintsInfoFUCHSIA: return \"BufferCollectionConstraintsInfoFUCHSIA\";\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n      case StructureType::eSubpassShadingPipelineCreateInfoHUAWEI: return \"SubpassShadingPipelineCreateInfoHUAWEI\";\n      case StructureType::ePhysicalDeviceSubpassShadingFeaturesHUAWEI: return \"PhysicalDeviceSubpassShadingFeaturesHUAWEI\";\n      case StructureType::ePhysicalDeviceSubpassShadingPropertiesHUAWEI: return \"PhysicalDeviceSubpassShadingPropertiesHUAWEI\";\n      case StructureType::ePhysicalDeviceInvocationMaskFeaturesHUAWEI: return \"PhysicalDeviceInvocationMaskFeaturesHUAWEI\";\n      case StructureType::eMemoryGetRemoteAddressInfoNV: return \"MemoryGetRemoteAddressInfoNV\";\n      case StructureType::ePhysicalDeviceExternalMemoryRdmaFeaturesNV: return \"PhysicalDeviceExternalMemoryRdmaFeaturesNV\";\n      case StructureType::ePipelinePropertiesIdentifierEXT: return \"PipelinePropertiesIdentifierEXT\";\n      case StructureType::ePhysicalDevicePipelinePropertiesFeaturesEXT: return \"PhysicalDevicePipelinePropertiesFeaturesEXT\";\n      case StructureType::ePhysicalDeviceFrameBoundaryFeaturesEXT: return \"PhysicalDeviceFrameBoundaryFeaturesEXT\";\n      case StructureType::eFrameBoundaryEXT: return \"FrameBoundaryEXT\";\n      case StructureType::ePhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT: return \"PhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT\";\n      case StructureType::eSubpassResolvePerformanceQueryEXT: return \"SubpassResolvePerformanceQueryEXT\";\n      case StructureType::eMultisampledRenderToSingleSampledInfoEXT: return \"MultisampledRenderToSingleSampledInfoEXT\";\n      case StructureType::ePhysicalDeviceExtendedDynamicState2FeaturesEXT: return \"PhysicalDeviceExtendedDynamicState2FeaturesEXT\";\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n      case StructureType::eScreenSurfaceCreateInfoQNX: return \"ScreenSurfaceCreateInfoQNX\";\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n      case StructureType::ePhysicalDeviceColorWriteEnableFeaturesEXT: return \"PhysicalDeviceColorWriteEnableFeaturesEXT\";\n      case StructureType::ePipelineColorWriteCreateInfoEXT: return \"PipelineColorWriteCreateInfoEXT\";\n      case StructureType::ePhysicalDevicePrimitivesGeneratedQueryFeaturesEXT: return \"PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT\";\n      case StructureType::ePhysicalDeviceRayTracingMaintenance1FeaturesKHR: return \"PhysicalDeviceRayTracingMaintenance1FeaturesKHR\";\n      case StructureType::ePhysicalDeviceImageViewMinLodFeaturesEXT: return \"PhysicalDeviceImageViewMinLodFeaturesEXT\";\n      case StructureType::eImageViewMinLodCreateInfoEXT: return \"ImageViewMinLodCreateInfoEXT\";\n      case StructureType::ePhysicalDeviceMultiDrawFeaturesEXT: return \"PhysicalDeviceMultiDrawFeaturesEXT\";\n      case StructureType::ePhysicalDeviceMultiDrawPropertiesEXT: return \"PhysicalDeviceMultiDrawPropertiesEXT\";\n      case StructureType::ePhysicalDeviceImage2DViewOf3DFeaturesEXT: return \"PhysicalDeviceImage2DViewOf3DFeaturesEXT\";\n      case StructureType::ePhysicalDeviceShaderTileImageFeaturesEXT: return \"PhysicalDeviceShaderTileImageFeaturesEXT\";\n      case StructureType::ePhysicalDeviceShaderTileImagePropertiesEXT: return \"PhysicalDeviceShaderTileImagePropertiesEXT\";\n      case StructureType::eMicromapBuildInfoEXT: return \"MicromapBuildInfoEXT\";\n      case StructureType::eMicromapVersionInfoEXT: return \"MicromapVersionInfoEXT\";\n      case StructureType::eCopyMicromapInfoEXT: return \"CopyMicromapInfoEXT\";\n      case StructureType::eCopyMicromapToMemoryInfoEXT: return \"CopyMicromapToMemoryInfoEXT\";\n      case StructureType::eCopyMemoryToMicromapInfoEXT: return \"CopyMemoryToMicromapInfoEXT\";\n      case StructureType::ePhysicalDeviceOpacityMicromapFeaturesEXT: return \"PhysicalDeviceOpacityMicromapFeaturesEXT\";\n      case StructureType::ePhysicalDeviceOpacityMicromapPropertiesEXT: return \"PhysicalDeviceOpacityMicromapPropertiesEXT\";\n      case StructureType::eMicromapCreateInfoEXT: return \"MicromapCreateInfoEXT\";\n      case StructureType::eMicromapBuildSizesInfoEXT: return \"MicromapBuildSizesInfoEXT\";\n      case StructureType::eAccelerationStructureTrianglesOpacityMicromapEXT: return \"AccelerationStructureTrianglesOpacityMicromapEXT\";\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      case StructureType::ePhysicalDeviceDisplacementMicromapFeaturesNV: return \"PhysicalDeviceDisplacementMicromapFeaturesNV\";\n      case StructureType::ePhysicalDeviceDisplacementMicromapPropertiesNV: return \"PhysicalDeviceDisplacementMicromapPropertiesNV\";\n      case StructureType::eAccelerationStructureTrianglesDisplacementMicromapNV: return \"AccelerationStructureTrianglesDisplacementMicromapNV\";\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n      case StructureType::ePhysicalDeviceClusterCullingShaderFeaturesHUAWEI: return \"PhysicalDeviceClusterCullingShaderFeaturesHUAWEI\";\n      case StructureType::ePhysicalDeviceClusterCullingShaderPropertiesHUAWEI: return \"PhysicalDeviceClusterCullingShaderPropertiesHUAWEI\";\n      case StructureType::ePhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI: return \"PhysicalDeviceClusterCullingShaderVrsFeaturesHUAWEI\";\n      case StructureType::ePhysicalDeviceBorderColorSwizzleFeaturesEXT: return \"PhysicalDeviceBorderColorSwizzleFeaturesEXT\";\n      case StructureType::eSamplerBorderColorComponentMappingCreateInfoEXT: return \"SamplerBorderColorComponentMappingCreateInfoEXT\";\n      case StructureType::ePhysicalDevicePageableDeviceLocalMemoryFeaturesEXT: return \"PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT\";\n      case StructureType::ePhysicalDeviceShaderCorePropertiesARM: return \"PhysicalDeviceShaderCorePropertiesARM\";\n      case StructureType::eDeviceQueueShaderCoreControlCreateInfoARM: return \"DeviceQueueShaderCoreControlCreateInfoARM\";\n      case StructureType::ePhysicalDeviceSchedulingControlsFeaturesARM: return \"PhysicalDeviceSchedulingControlsFeaturesARM\";\n      case StructureType::ePhysicalDeviceSchedulingControlsPropertiesARM: return \"PhysicalDeviceSchedulingControlsPropertiesARM\";\n      case StructureType::ePhysicalDeviceImageSlicedViewOf3DFeaturesEXT: return \"PhysicalDeviceImageSlicedViewOf3DFeaturesEXT\";\n      case StructureType::eImageViewSlicedCreateInfoEXT: return \"ImageViewSlicedCreateInfoEXT\";\n      case StructureType::ePhysicalDeviceDescriptorSetHostMappingFeaturesVALVE: return \"PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE\";\n      case StructureType::eDescriptorSetBindingReferenceVALVE: return \"DescriptorSetBindingReferenceVALVE\";\n      case StructureType::eDescriptorSetLayoutHostMappingInfoVALVE: return \"DescriptorSetLayoutHostMappingInfoVALVE\";\n      case StructureType::ePhysicalDeviceNonSeamlessCubeMapFeaturesEXT: return \"PhysicalDeviceNonSeamlessCubeMapFeaturesEXT\";\n      case StructureType::ePhysicalDeviceRenderPassStripedFeaturesARM: return \"PhysicalDeviceRenderPassStripedFeaturesARM\";\n      case StructureType::ePhysicalDeviceRenderPassStripedPropertiesARM: return \"PhysicalDeviceRenderPassStripedPropertiesARM\";\n      case StructureType::eRenderPassStripeBeginInfoARM: return \"RenderPassStripeBeginInfoARM\";\n      case StructureType::eRenderPassStripeInfoARM: return \"RenderPassStripeInfoARM\";\n      case StructureType::eRenderPassStripeSubmitInfoARM: return \"RenderPassStripeSubmitInfoARM\";\n      case StructureType::ePhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM: return \"PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM\";\n      case StructureType::ePhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM: return \"PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM\";\n      case StructureType::eSubpassFragmentDensityMapOffsetEndInfoQCOM: return \"SubpassFragmentDensityMapOffsetEndInfoQCOM\";\n      case StructureType::ePhysicalDeviceCopyMemoryIndirectFeaturesNV: return \"PhysicalDeviceCopyMemoryIndirectFeaturesNV\";\n      case StructureType::ePhysicalDeviceCopyMemoryIndirectPropertiesNV: return \"PhysicalDeviceCopyMemoryIndirectPropertiesNV\";\n      case StructureType::ePhysicalDeviceMemoryDecompressionFeaturesNV: return \"PhysicalDeviceMemoryDecompressionFeaturesNV\";\n      case StructureType::ePhysicalDeviceMemoryDecompressionPropertiesNV: return \"PhysicalDeviceMemoryDecompressionPropertiesNV\";\n      case StructureType::ePhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV: return \"PhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV\";\n      case StructureType::eComputePipelineIndirectBufferInfoNV: return \"ComputePipelineIndirectBufferInfoNV\";\n      case StructureType::ePipelineIndirectDeviceAddressInfoNV: return \"PipelineIndirectDeviceAddressInfoNV\";\n      case StructureType::ePhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV: return \"PhysicalDeviceRayTracingLinearSweptSpheresFeaturesNV\";\n      case StructureType::eAccelerationStructureGeometryLinearSweptSpheresDataNV: return \"AccelerationStructureGeometryLinearSweptSpheresDataNV\";\n      case StructureType::eAccelerationStructureGeometrySpheresDataNV: return \"AccelerationStructureGeometrySpheresDataNV\";\n      case StructureType::ePhysicalDeviceLinearColorAttachmentFeaturesNV: return \"PhysicalDeviceLinearColorAttachmentFeaturesNV\";\n      case StructureType::ePhysicalDeviceShaderMaximalReconvergenceFeaturesKHR: return \"PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR\";\n      case StructureType::ePhysicalDeviceImageCompressionControlSwapchainFeaturesEXT: return \"PhysicalDeviceImageCompressionControlSwapchainFeaturesEXT\";\n      case StructureType::ePhysicalDeviceImageProcessingFeaturesQCOM: return \"PhysicalDeviceImageProcessingFeaturesQCOM\";\n      case StructureType::ePhysicalDeviceImageProcessingPropertiesQCOM: return \"PhysicalDeviceImageProcessingPropertiesQCOM\";\n      case StructureType::eImageViewSampleWeightCreateInfoQCOM: return \"ImageViewSampleWeightCreateInfoQCOM\";\n      case StructureType::ePhysicalDeviceNestedCommandBufferFeaturesEXT: return \"PhysicalDeviceNestedCommandBufferFeaturesEXT\";\n      case StructureType::ePhysicalDeviceNestedCommandBufferPropertiesEXT: return \"PhysicalDeviceNestedCommandBufferPropertiesEXT\";\n      case StructureType::eExternalMemoryAcquireUnmodifiedEXT: return \"ExternalMemoryAcquireUnmodifiedEXT\";\n      case StructureType::ePhysicalDeviceExtendedDynamicState3FeaturesEXT: return \"PhysicalDeviceExtendedDynamicState3FeaturesEXT\";\n      case StructureType::ePhysicalDeviceExtendedDynamicState3PropertiesEXT: return \"PhysicalDeviceExtendedDynamicState3PropertiesEXT\";\n      case StructureType::ePhysicalDeviceSubpassMergeFeedbackFeaturesEXT: return \"PhysicalDeviceSubpassMergeFeedbackFeaturesEXT\";\n      case StructureType::eRenderPassCreationControlEXT: return \"RenderPassCreationControlEXT\";\n      case StructureType::eRenderPassCreationFeedbackCreateInfoEXT: return \"RenderPassCreationFeedbackCreateInfoEXT\";\n      case StructureType::eRenderPassSubpassFeedbackCreateInfoEXT: return \"RenderPassSubpassFeedbackCreateInfoEXT\";\n      case StructureType::eDirectDriverLoadingInfoLUNARG: return \"DirectDriverLoadingInfoLUNARG\";\n      case StructureType::eDirectDriverLoadingListLUNARG: return \"DirectDriverLoadingListLUNARG\";\n      case StructureType::ePhysicalDeviceShaderModuleIdentifierFeaturesEXT: return \"PhysicalDeviceShaderModuleIdentifierFeaturesEXT\";\n      case StructureType::ePhysicalDeviceShaderModuleIdentifierPropertiesEXT: return \"PhysicalDeviceShaderModuleIdentifierPropertiesEXT\";\n      case StructureType::ePipelineShaderStageModuleIdentifierCreateInfoEXT: return \"PipelineShaderStageModuleIdentifierCreateInfoEXT\";\n      case StructureType::eShaderModuleIdentifierEXT: return \"ShaderModuleIdentifierEXT\";\n      case StructureType::ePhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT: return \"PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT\";\n      case StructureType::ePhysicalDeviceOpticalFlowFeaturesNV: return \"PhysicalDeviceOpticalFlowFeaturesNV\";\n      case StructureType::ePhysicalDeviceOpticalFlowPropertiesNV: return \"PhysicalDeviceOpticalFlowPropertiesNV\";\n      case StructureType::eOpticalFlowImageFormatInfoNV: return \"OpticalFlowImageFormatInfoNV\";\n      case StructureType::eOpticalFlowImageFormatPropertiesNV: return \"OpticalFlowImageFormatPropertiesNV\";\n      case StructureType::eOpticalFlowSessionCreateInfoNV: return \"OpticalFlowSessionCreateInfoNV\";\n      case StructureType::eOpticalFlowExecuteInfoNV: return \"OpticalFlowExecuteInfoNV\";\n      case StructureType::eOpticalFlowSessionCreatePrivateDataInfoNV: return \"OpticalFlowSessionCreatePrivateDataInfoNV\";\n      case StructureType::ePhysicalDeviceLegacyDitheringFeaturesEXT: return \"PhysicalDeviceLegacyDitheringFeaturesEXT\";\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n      case StructureType::ePhysicalDeviceExternalFormatResolveFeaturesANDROID: return \"PhysicalDeviceExternalFormatResolveFeaturesANDROID\";\n      case StructureType::ePhysicalDeviceExternalFormatResolvePropertiesANDROID: return \"PhysicalDeviceExternalFormatResolvePropertiesANDROID\";\n      case StructureType::eAndroidHardwareBufferFormatResolvePropertiesANDROID: return \"AndroidHardwareBufferFormatResolvePropertiesANDROID\";\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n      case StructureType::ePhysicalDeviceAntiLagFeaturesAMD: return \"PhysicalDeviceAntiLagFeaturesAMD\";\n      case StructureType::eAntiLagDataAMD: return \"AntiLagDataAMD\";\n      case StructureType::eAntiLagPresentationInfoAMD: return \"AntiLagPresentationInfoAMD\";\n      case StructureType::ePhysicalDeviceRayTracingPositionFetchFeaturesKHR: return \"PhysicalDeviceRayTracingPositionFetchFeaturesKHR\";\n      case StructureType::ePhysicalDeviceShaderObjectFeaturesEXT: return \"PhysicalDeviceShaderObjectFeaturesEXT\";\n      case StructureType::ePhysicalDeviceShaderObjectPropertiesEXT: return \"PhysicalDeviceShaderObjectPropertiesEXT\";\n      case StructureType::eShaderCreateInfoEXT: return \"ShaderCreateInfoEXT\";\n      case StructureType::ePhysicalDevicePipelineBinaryFeaturesKHR: return \"PhysicalDevicePipelineBinaryFeaturesKHR\";\n      case StructureType::ePipelineBinaryCreateInfoKHR: return \"PipelineBinaryCreateInfoKHR\";\n      case StructureType::ePipelineBinaryInfoKHR: return \"PipelineBinaryInfoKHR\";\n      case StructureType::ePipelineBinaryKeyKHR: return \"PipelineBinaryKeyKHR\";\n      case StructureType::ePhysicalDevicePipelineBinaryPropertiesKHR: return \"PhysicalDevicePipelineBinaryPropertiesKHR\";\n      case StructureType::eReleaseCapturedPipelineDataInfoKHR: return \"ReleaseCapturedPipelineDataInfoKHR\";\n      case StructureType::ePipelineBinaryDataInfoKHR: return \"PipelineBinaryDataInfoKHR\";\n      case StructureType::ePipelineCreateInfoKHR: return \"PipelineCreateInfoKHR\";\n      case StructureType::eDevicePipelineBinaryInternalCacheControlKHR: return \"DevicePipelineBinaryInternalCacheControlKHR\";\n      case StructureType::ePipelineBinaryHandlesInfoKHR: return \"PipelineBinaryHandlesInfoKHR\";\n      case StructureType::ePhysicalDeviceTilePropertiesFeaturesQCOM: return \"PhysicalDeviceTilePropertiesFeaturesQCOM\";\n      case StructureType::eTilePropertiesQCOM: return \"TilePropertiesQCOM\";\n      case StructureType::ePhysicalDeviceAmigoProfilingFeaturesSEC: return \"PhysicalDeviceAmigoProfilingFeaturesSEC\";\n      case StructureType::eAmigoProfilingSubmitInfoSEC: return \"AmigoProfilingSubmitInfoSEC\";\n      case StructureType::ePhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM: return \"PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM\";\n      case StructureType::ePhysicalDeviceRayTracingInvocationReorderFeaturesNV: return \"PhysicalDeviceRayTracingInvocationReorderFeaturesNV\";\n      case StructureType::ePhysicalDeviceRayTracingInvocationReorderPropertiesNV: return \"PhysicalDeviceRayTracingInvocationReorderPropertiesNV\";\n      case StructureType::ePhysicalDeviceCooperativeVectorFeaturesNV: return \"PhysicalDeviceCooperativeVectorFeaturesNV\";\n      case StructureType::ePhysicalDeviceCooperativeVectorPropertiesNV: return \"PhysicalDeviceCooperativeVectorPropertiesNV\";\n      case StructureType::eCooperativeVectorPropertiesNV: return \"CooperativeVectorPropertiesNV\";\n      case StructureType::eConvertCooperativeVectorMatrixInfoNV: return \"ConvertCooperativeVectorMatrixInfoNV\";\n      case StructureType::ePhysicalDeviceExtendedSparseAddressSpaceFeaturesNV: return \"PhysicalDeviceExtendedSparseAddressSpaceFeaturesNV\";\n      case StructureType::ePhysicalDeviceExtendedSparseAddressSpacePropertiesNV: return \"PhysicalDeviceExtendedSparseAddressSpacePropertiesNV\";\n      case StructureType::ePhysicalDeviceMutableDescriptorTypeFeaturesEXT: return \"PhysicalDeviceMutableDescriptorTypeFeaturesEXT\";\n      case StructureType::eMutableDescriptorTypeCreateInfoEXT: return \"MutableDescriptorTypeCreateInfoEXT\";\n      case StructureType::ePhysicalDeviceLegacyVertexAttributesFeaturesEXT: return \"PhysicalDeviceLegacyVertexAttributesFeaturesEXT\";\n      case StructureType::ePhysicalDeviceLegacyVertexAttributesPropertiesEXT: return \"PhysicalDeviceLegacyVertexAttributesPropertiesEXT\";\n      case StructureType::eLayerSettingsCreateInfoEXT: return \"LayerSettingsCreateInfoEXT\";\n      case StructureType::ePhysicalDeviceShaderCoreBuiltinsFeaturesARM: return \"PhysicalDeviceShaderCoreBuiltinsFeaturesARM\";\n      case StructureType::ePhysicalDeviceShaderCoreBuiltinsPropertiesARM: return \"PhysicalDeviceShaderCoreBuiltinsPropertiesARM\";\n      case StructureType::ePhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT: return \"PhysicalDevicePipelineLibraryGroupHandlesFeaturesEXT\";\n      case StructureType::ePhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT: return \"PhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT\";\n      case StructureType::eLatencySleepModeInfoNV: return \"LatencySleepModeInfoNV\";\n      case StructureType::eLatencySleepInfoNV: return \"LatencySleepInfoNV\";\n      case StructureType::eSetLatencyMarkerInfoNV: return \"SetLatencyMarkerInfoNV\";\n      case StructureType::eGetLatencyMarkerInfoNV: return \"GetLatencyMarkerInfoNV\";\n      case StructureType::eLatencyTimingsFrameReportNV: return \"LatencyTimingsFrameReportNV\";\n      case StructureType::eLatencySubmissionPresentIdNV: return \"LatencySubmissionPresentIdNV\";\n      case StructureType::eOutOfBandQueueTypeInfoNV: return \"OutOfBandQueueTypeInfoNV\";\n      case StructureType::eSwapchainLatencyCreateInfoNV: return \"SwapchainLatencyCreateInfoNV\";\n      case StructureType::eLatencySurfaceCapabilitiesNV: return \"LatencySurfaceCapabilitiesNV\";\n      case StructureType::ePhysicalDeviceCooperativeMatrixFeaturesKHR: return \"PhysicalDeviceCooperativeMatrixFeaturesKHR\";\n      case StructureType::eCooperativeMatrixPropertiesKHR: return \"CooperativeMatrixPropertiesKHR\";\n      case StructureType::ePhysicalDeviceCooperativeMatrixPropertiesKHR: return \"PhysicalDeviceCooperativeMatrixPropertiesKHR\";\n      case StructureType::ePhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM: return \"PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM\";\n      case StructureType::eMultiviewPerViewRenderAreasRenderPassBeginInfoQCOM: return \"MultiviewPerViewRenderAreasRenderPassBeginInfoQCOM\";\n      case StructureType::ePhysicalDeviceComputeShaderDerivativesFeaturesKHR: return \"PhysicalDeviceComputeShaderDerivativesFeaturesKHR\";\n      case StructureType::ePhysicalDeviceComputeShaderDerivativesPropertiesKHR: return \"PhysicalDeviceComputeShaderDerivativesPropertiesKHR\";\n      case StructureType::eVideoDecodeAv1CapabilitiesKHR: return \"VideoDecodeAv1CapabilitiesKHR\";\n      case StructureType::eVideoDecodeAv1PictureInfoKHR: return \"VideoDecodeAv1PictureInfoKHR\";\n      case StructureType::eVideoDecodeAv1ProfileInfoKHR: return \"VideoDecodeAv1ProfileInfoKHR\";\n      case StructureType::eVideoDecodeAv1SessionParametersCreateInfoKHR: return \"VideoDecodeAv1SessionParametersCreateInfoKHR\";\n      case StructureType::eVideoDecodeAv1DpbSlotInfoKHR: return \"VideoDecodeAv1DpbSlotInfoKHR\";\n      case StructureType::eVideoEncodeAv1CapabilitiesKHR: return \"VideoEncodeAv1CapabilitiesKHR\";\n      case StructureType::eVideoEncodeAv1SessionParametersCreateInfoKHR: return \"VideoEncodeAv1SessionParametersCreateInfoKHR\";\n      case StructureType::eVideoEncodeAv1PictureInfoKHR: return \"VideoEncodeAv1PictureInfoKHR\";\n      case StructureType::eVideoEncodeAv1DpbSlotInfoKHR: return \"VideoEncodeAv1DpbSlotInfoKHR\";\n      case StructureType::ePhysicalDeviceVideoEncodeAv1FeaturesKHR: return \"PhysicalDeviceVideoEncodeAv1FeaturesKHR\";\n      case StructureType::eVideoEncodeAv1ProfileInfoKHR: return \"VideoEncodeAv1ProfileInfoKHR\";\n      case StructureType::eVideoEncodeAv1RateControlInfoKHR: return \"VideoEncodeAv1RateControlInfoKHR\";\n      case StructureType::eVideoEncodeAv1RateControlLayerInfoKHR: return \"VideoEncodeAv1RateControlLayerInfoKHR\";\n      case StructureType::eVideoEncodeAv1QualityLevelPropertiesKHR: return \"VideoEncodeAv1QualityLevelPropertiesKHR\";\n      case StructureType::eVideoEncodeAv1SessionCreateInfoKHR: return \"VideoEncodeAv1SessionCreateInfoKHR\";\n      case StructureType::eVideoEncodeAv1GopRemainingFrameInfoKHR: return \"VideoEncodeAv1GopRemainingFrameInfoKHR\";\n      case StructureType::ePhysicalDeviceVideoMaintenance1FeaturesKHR: return \"PhysicalDeviceVideoMaintenance1FeaturesKHR\";\n      case StructureType::eVideoInlineQueryInfoKHR: return \"VideoInlineQueryInfoKHR\";\n      case StructureType::ePhysicalDevicePerStageDescriptorSetFeaturesNV: return \"PhysicalDevicePerStageDescriptorSetFeaturesNV\";\n      case StructureType::ePhysicalDeviceImageProcessing2FeaturesQCOM: return \"PhysicalDeviceImageProcessing2FeaturesQCOM\";\n      case StructureType::ePhysicalDeviceImageProcessing2PropertiesQCOM: return \"PhysicalDeviceImageProcessing2PropertiesQCOM\";\n      case StructureType::eSamplerBlockMatchWindowCreateInfoQCOM: return \"SamplerBlockMatchWindowCreateInfoQCOM\";\n      case StructureType::eSamplerCubicWeightsCreateInfoQCOM: return \"SamplerCubicWeightsCreateInfoQCOM\";\n      case StructureType::ePhysicalDeviceCubicWeightsFeaturesQCOM: return \"PhysicalDeviceCubicWeightsFeaturesQCOM\";\n      case StructureType::eBlitImageCubicWeightsInfoQCOM: return \"BlitImageCubicWeightsInfoQCOM\";\n      case StructureType::ePhysicalDeviceYcbcrDegammaFeaturesQCOM: return \"PhysicalDeviceYcbcrDegammaFeaturesQCOM\";\n      case StructureType::eSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM: return \"SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM\";\n      case StructureType::ePhysicalDeviceCubicClampFeaturesQCOM: return \"PhysicalDeviceCubicClampFeaturesQCOM\";\n      case StructureType::ePhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT: return \"PhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT\";\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n      case StructureType::eScreenBufferPropertiesQNX: return \"ScreenBufferPropertiesQNX\";\n      case StructureType::eScreenBufferFormatPropertiesQNX: return \"ScreenBufferFormatPropertiesQNX\";\n      case StructureType::eImportScreenBufferInfoQNX: return \"ImportScreenBufferInfoQNX\";\n      case StructureType::eExternalFormatQNX: return \"ExternalFormatQNX\";\n      case StructureType::ePhysicalDeviceExternalMemoryScreenBufferFeaturesQNX: return \"PhysicalDeviceExternalMemoryScreenBufferFeaturesQNX\";\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n      case StructureType::ePhysicalDeviceLayeredDriverPropertiesMSFT: return \"PhysicalDeviceLayeredDriverPropertiesMSFT\";\n      case StructureType::eCalibratedTimestampInfoKHR: return \"CalibratedTimestampInfoKHR\";\n      case StructureType::eSetDescriptorBufferOffsetsInfoEXT: return \"SetDescriptorBufferOffsetsInfoEXT\";\n      case StructureType::eBindDescriptorBufferEmbeddedSamplersInfoEXT: return \"BindDescriptorBufferEmbeddedSamplersInfoEXT\";\n      case StructureType::ePhysicalDeviceDescriptorPoolOverallocationFeaturesNV: return \"PhysicalDeviceDescriptorPoolOverallocationFeaturesNV\";\n      case StructureType::eDisplaySurfaceStereoCreateInfoNV: return \"DisplaySurfaceStereoCreateInfoNV\";\n      case StructureType::eDisplayModeStereoPropertiesNV: return \"DisplayModeStereoPropertiesNV\";\n      case StructureType::eVideoEncodeQuantizationMapCapabilitiesKHR: return \"VideoEncodeQuantizationMapCapabilitiesKHR\";\n      case StructureType::eVideoFormatQuantizationMapPropertiesKHR: return \"VideoFormatQuantizationMapPropertiesKHR\";\n      case StructureType::eVideoEncodeQuantizationMapInfoKHR: return \"VideoEncodeQuantizationMapInfoKHR\";\n      case StructureType::eVideoEncodeQuantizationMapSessionParametersCreateInfoKHR: return \"VideoEncodeQuantizationMapSessionParametersCreateInfoKHR\";\n      case StructureType::ePhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR: return \"PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR\";\n      case StructureType::eVideoEncodeH264QuantizationMapCapabilitiesKHR: return \"VideoEncodeH264QuantizationMapCapabilitiesKHR\";\n      case StructureType::eVideoEncodeH265QuantizationMapCapabilitiesKHR: return \"VideoEncodeH265QuantizationMapCapabilitiesKHR\";\n      case StructureType::eVideoFormatH265QuantizationMapPropertiesKHR: return \"VideoFormatH265QuantizationMapPropertiesKHR\";\n      case StructureType::eVideoEncodeAv1QuantizationMapCapabilitiesKHR: return \"VideoEncodeAv1QuantizationMapCapabilitiesKHR\";\n      case StructureType::eVideoFormatAv1QuantizationMapPropertiesKHR: return \"VideoFormatAv1QuantizationMapPropertiesKHR\";\n      case StructureType::ePhysicalDeviceRawAccessChainsFeaturesNV: return \"PhysicalDeviceRawAccessChainsFeaturesNV\";\n      case StructureType::ePhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR: return \"PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR\";\n      case StructureType::ePhysicalDeviceCommandBufferInheritanceFeaturesNV: return \"PhysicalDeviceCommandBufferInheritanceFeaturesNV\";\n      case StructureType::ePhysicalDeviceMaintenance7FeaturesKHR: return \"PhysicalDeviceMaintenance7FeaturesKHR\";\n      case StructureType::ePhysicalDeviceMaintenance7PropertiesKHR: return \"PhysicalDeviceMaintenance7PropertiesKHR\";\n      case StructureType::ePhysicalDeviceLayeredApiPropertiesListKHR: return \"PhysicalDeviceLayeredApiPropertiesListKHR\";\n      case StructureType::ePhysicalDeviceLayeredApiPropertiesKHR: return \"PhysicalDeviceLayeredApiPropertiesKHR\";\n      case StructureType::ePhysicalDeviceLayeredApiVulkanPropertiesKHR: return \"PhysicalDeviceLayeredApiVulkanPropertiesKHR\";\n      case StructureType::ePhysicalDeviceShaderAtomicFloat16VectorFeaturesNV: return \"PhysicalDeviceShaderAtomicFloat16VectorFeaturesNV\";\n      case StructureType::ePhysicalDeviceShaderReplicatedCompositesFeaturesEXT: return \"PhysicalDeviceShaderReplicatedCompositesFeaturesEXT\";\n      case StructureType::ePhysicalDeviceRayTracingValidationFeaturesNV: return \"PhysicalDeviceRayTracingValidationFeaturesNV\";\n      case StructureType::ePhysicalDeviceClusterAccelerationStructureFeaturesNV: return \"PhysicalDeviceClusterAccelerationStructureFeaturesNV\";\n      case StructureType::ePhysicalDeviceClusterAccelerationStructurePropertiesNV: return \"PhysicalDeviceClusterAccelerationStructurePropertiesNV\";\n      case StructureType::eClusterAccelerationStructureClustersBottomLevelInputNV: return \"ClusterAccelerationStructureClustersBottomLevelInputNV\";\n      case StructureType::eClusterAccelerationStructureTriangleClusterInputNV: return \"ClusterAccelerationStructureTriangleClusterInputNV\";\n      case StructureType::eClusterAccelerationStructureMoveObjectsInputNV: return \"ClusterAccelerationStructureMoveObjectsInputNV\";\n      case StructureType::eClusterAccelerationStructureInputInfoNV: return \"ClusterAccelerationStructureInputInfoNV\";\n      case StructureType::eClusterAccelerationStructureCommandsInfoNV: return \"ClusterAccelerationStructureCommandsInfoNV\";\n      case StructureType::eRayTracingPipelineClusterAccelerationStructureCreateInfoNV: return \"RayTracingPipelineClusterAccelerationStructureCreateInfoNV\";\n      case StructureType::ePhysicalDevicePartitionedAccelerationStructureFeaturesNV: return \"PhysicalDevicePartitionedAccelerationStructureFeaturesNV\";\n      case StructureType::ePhysicalDevicePartitionedAccelerationStructurePropertiesNV: return \"PhysicalDevicePartitionedAccelerationStructurePropertiesNV\";\n      case StructureType::eWriteDescriptorSetPartitionedAccelerationStructureNV: return \"WriteDescriptorSetPartitionedAccelerationStructureNV\";\n      case StructureType::ePartitionedAccelerationStructureInstancesInputNV: return \"PartitionedAccelerationStructureInstancesInputNV\";\n      case StructureType::eBuildPartitionedAccelerationStructureInfoNV: return \"BuildPartitionedAccelerationStructureInfoNV\";\n      case StructureType::ePartitionedAccelerationStructureFlagsNV: return \"PartitionedAccelerationStructureFlagsNV\";\n      case StructureType::ePhysicalDeviceDeviceGeneratedCommandsFeaturesEXT: return \"PhysicalDeviceDeviceGeneratedCommandsFeaturesEXT\";\n      case StructureType::ePhysicalDeviceDeviceGeneratedCommandsPropertiesEXT: return \"PhysicalDeviceDeviceGeneratedCommandsPropertiesEXT\";\n      case StructureType::eGeneratedCommandsMemoryRequirementsInfoEXT: return \"GeneratedCommandsMemoryRequirementsInfoEXT\";\n      case StructureType::eIndirectExecutionSetCreateInfoEXT: return \"IndirectExecutionSetCreateInfoEXT\";\n      case StructureType::eGeneratedCommandsInfoEXT: return \"GeneratedCommandsInfoEXT\";\n      case StructureType::eIndirectCommandsLayoutCreateInfoEXT: return \"IndirectCommandsLayoutCreateInfoEXT\";\n      case StructureType::eIndirectCommandsLayoutTokenEXT: return \"IndirectCommandsLayoutTokenEXT\";\n      case StructureType::eWriteIndirectExecutionSetPipelineEXT: return \"WriteIndirectExecutionSetPipelineEXT\";\n      case StructureType::eWriteIndirectExecutionSetShaderEXT: return \"WriteIndirectExecutionSetShaderEXT\";\n      case StructureType::eIndirectExecutionSetPipelineInfoEXT: return \"IndirectExecutionSetPipelineInfoEXT\";\n      case StructureType::eIndirectExecutionSetShaderInfoEXT: return \"IndirectExecutionSetShaderInfoEXT\";\n      case StructureType::eIndirectExecutionSetShaderLayoutInfoEXT: return \"IndirectExecutionSetShaderLayoutInfoEXT\";\n      case StructureType::eGeneratedCommandsPipelineInfoEXT: return \"GeneratedCommandsPipelineInfoEXT\";\n      case StructureType::eGeneratedCommandsShaderInfoEXT: return \"GeneratedCommandsShaderInfoEXT\";\n      case StructureType::ePhysicalDeviceMaintenance8FeaturesKHR: return \"PhysicalDeviceMaintenance8FeaturesKHR\";\n      case StructureType::eMemoryBarrierAccessFlags3KHR: return \"MemoryBarrierAccessFlags3KHR\";\n      case StructureType::ePhysicalDeviceImageAlignmentControlFeaturesMESA: return \"PhysicalDeviceImageAlignmentControlFeaturesMESA\";\n      case StructureType::ePhysicalDeviceImageAlignmentControlPropertiesMESA: return \"PhysicalDeviceImageAlignmentControlPropertiesMESA\";\n      case StructureType::eImageAlignmentControlCreateInfoMESA: return \"ImageAlignmentControlCreateInfoMESA\";\n      case StructureType::ePhysicalDeviceDepthClampControlFeaturesEXT: return \"PhysicalDeviceDepthClampControlFeaturesEXT\";\n      case StructureType::ePipelineViewportDepthClampControlCreateInfoEXT: return \"PipelineViewportDepthClampControlCreateInfoEXT\";\n      case StructureType::ePhysicalDeviceVideoMaintenance2FeaturesKHR: return \"PhysicalDeviceVideoMaintenance2FeaturesKHR\";\n      case StructureType::eVideoDecodeH264InlineSessionParametersInfoKHR: return \"VideoDecodeH264InlineSessionParametersInfoKHR\";\n      case StructureType::eVideoDecodeH265InlineSessionParametersInfoKHR: return \"VideoDecodeH265InlineSessionParametersInfoKHR\";\n      case StructureType::eVideoDecodeAv1InlineSessionParametersInfoKHR: return \"VideoDecodeAv1InlineSessionParametersInfoKHR\";\n      case StructureType::ePhysicalDeviceHdrVividFeaturesHUAWEI: return \"PhysicalDeviceHdrVividFeaturesHUAWEI\";\n      case StructureType::eHdrVividDynamicMetadataHUAWEI: return \"HdrVividDynamicMetadataHUAWEI\";\n      case StructureType::ePhysicalDeviceCooperativeMatrix2FeaturesNV: return \"PhysicalDeviceCooperativeMatrix2FeaturesNV\";\n      case StructureType::eCooperativeMatrixFlexibleDimensionsPropertiesNV: return \"CooperativeMatrixFlexibleDimensionsPropertiesNV\";\n      case StructureType::ePhysicalDeviceCooperativeMatrix2PropertiesNV: return \"PhysicalDeviceCooperativeMatrix2PropertiesNV\";\n      case StructureType::ePhysicalDevicePipelineOpacityMicromapFeaturesARM: return \"PhysicalDevicePipelineOpacityMicromapFeaturesARM\";\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n      case StructureType::eImportMemoryMetalHandleInfoEXT: return \"ImportMemoryMetalHandleInfoEXT\";\n      case StructureType::eMemoryMetalHandlePropertiesEXT: return \"MemoryMetalHandlePropertiesEXT\";\n      case StructureType::eMemoryGetMetalHandleInfoEXT: return \"MemoryGetMetalHandleInfoEXT\";\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n      case StructureType::ePhysicalDeviceDepthClampZeroOneFeaturesKHR: return \"PhysicalDeviceDepthClampZeroOneFeaturesKHR\";\n      case StructureType::ePhysicalDeviceVertexAttributeRobustnessFeaturesEXT: return \"PhysicalDeviceVertexAttributeRobustnessFeaturesEXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineCacheHeaderVersion value )\n  {\n    switch ( value )\n    {\n      case PipelineCacheHeaderVersion::eOne: return \"One\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ObjectType value )\n  {\n    switch ( value )\n    {\n      case ObjectType::eUnknown: return \"Unknown\";\n      case ObjectType::eInstance: return \"Instance\";\n      case ObjectType::ePhysicalDevice: return \"PhysicalDevice\";\n      case ObjectType::eDevice: return \"Device\";\n      case ObjectType::eQueue: return \"Queue\";\n      case ObjectType::eSemaphore: return \"Semaphore\";\n      case ObjectType::eCommandBuffer: return \"CommandBuffer\";\n      case ObjectType::eFence: return \"Fence\";\n      case ObjectType::eDeviceMemory: return \"DeviceMemory\";\n      case ObjectType::eBuffer: return \"Buffer\";\n      case ObjectType::eImage: return \"Image\";\n      case ObjectType::eEvent: return \"Event\";\n      case ObjectType::eQueryPool: return \"QueryPool\";\n      case ObjectType::eBufferView: return \"BufferView\";\n      case ObjectType::eImageView: return \"ImageView\";\n      case ObjectType::eShaderModule: return \"ShaderModule\";\n      case ObjectType::ePipelineCache: return \"PipelineCache\";\n      case ObjectType::ePipelineLayout: return \"PipelineLayout\";\n      case ObjectType::eRenderPass: return \"RenderPass\";\n      case ObjectType::ePipeline: return \"Pipeline\";\n      case ObjectType::eDescriptorSetLayout: return \"DescriptorSetLayout\";\n      case ObjectType::eSampler: return \"Sampler\";\n      case ObjectType::eDescriptorPool: return \"DescriptorPool\";\n      case ObjectType::eDescriptorSet: return \"DescriptorSet\";\n      case ObjectType::eFramebuffer: return \"Framebuffer\";\n      case ObjectType::eCommandPool: return \"CommandPool\";\n      case ObjectType::eSamplerYcbcrConversion: return \"SamplerYcbcrConversion\";\n      case ObjectType::eDescriptorUpdateTemplate: return \"DescriptorUpdateTemplate\";\n      case ObjectType::ePrivateDataSlot: return \"PrivateDataSlot\";\n      case ObjectType::eSurfaceKHR: return \"SurfaceKHR\";\n      case ObjectType::eSwapchainKHR: return \"SwapchainKHR\";\n      case ObjectType::eDisplayKHR: return \"DisplayKHR\";\n      case ObjectType::eDisplayModeKHR: return \"DisplayModeKHR\";\n      case ObjectType::eDebugReportCallbackEXT: return \"DebugReportCallbackEXT\";\n      case ObjectType::eVideoSessionKHR: return \"VideoSessionKHR\";\n      case ObjectType::eVideoSessionParametersKHR: return \"VideoSessionParametersKHR\";\n      case ObjectType::eCuModuleNVX: return \"CuModuleNVX\";\n      case ObjectType::eCuFunctionNVX: return \"CuFunctionNVX\";\n      case ObjectType::eDebugUtilsMessengerEXT: return \"DebugUtilsMessengerEXT\";\n      case ObjectType::eAccelerationStructureKHR: return \"AccelerationStructureKHR\";\n      case ObjectType::eValidationCacheEXT: return \"ValidationCacheEXT\";\n      case ObjectType::eAccelerationStructureNV: return \"AccelerationStructureNV\";\n      case ObjectType::ePerformanceConfigurationINTEL: return \"PerformanceConfigurationINTEL\";\n      case ObjectType::eDeferredOperationKHR: return \"DeferredOperationKHR\";\n      case ObjectType::eIndirectCommandsLayoutNV: return \"IndirectCommandsLayoutNV\";\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      case ObjectType::eCudaModuleNV: return \"CudaModuleNV\";\n      case ObjectType::eCudaFunctionNV: return \"CudaFunctionNV\";\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n      case ObjectType::eBufferCollectionFUCHSIA: return \"BufferCollectionFUCHSIA\";\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n      case ObjectType::eMicromapEXT: return \"MicromapEXT\";\n      case ObjectType::eOpticalFlowSessionNV: return \"OpticalFlowSessionNV\";\n      case ObjectType::eShaderEXT: return \"ShaderEXT\";\n      case ObjectType::ePipelineBinaryKHR: return \"PipelineBinaryKHR\";\n      case ObjectType::eIndirectCommandsLayoutEXT: return \"IndirectCommandsLayoutEXT\";\n      case ObjectType::eIndirectExecutionSetEXT: return \"IndirectExecutionSetEXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VendorId value )\n  {\n    switch ( value )\n    {\n      case VendorId::eKhronos: return \"Khronos\";\n      case VendorId::eVIV: return \"VIV\";\n      case VendorId::eVSI: return \"VSI\";\n      case VendorId::eKazan: return \"Kazan\";\n      case VendorId::eCodeplay: return \"Codeplay\";\n      case VendorId::eMESA: return \"MESA\";\n      case VendorId::ePocl: return \"Pocl\";\n      case VendorId::eMobileye: return \"Mobileye\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( Format value )\n  {\n    switch ( value )\n    {\n      case Format::eUndefined: return \"Undefined\";\n      case Format::eR4G4UnormPack8: return \"R4G4UnormPack8\";\n      case Format::eR4G4B4A4UnormPack16: return \"R4G4B4A4UnormPack16\";\n      case Format::eB4G4R4A4UnormPack16: return \"B4G4R4A4UnormPack16\";\n      case Format::eR5G6B5UnormPack16: return \"R5G6B5UnormPack16\";\n      case Format::eB5G6R5UnormPack16: return \"B5G6R5UnormPack16\";\n      case Format::eR5G5B5A1UnormPack16: return \"R5G5B5A1UnormPack16\";\n      case Format::eB5G5R5A1UnormPack16: return \"B5G5R5A1UnormPack16\";\n      case Format::eA1R5G5B5UnormPack16: return \"A1R5G5B5UnormPack16\";\n      case Format::eR8Unorm: return \"R8Unorm\";\n      case Format::eR8Snorm: return \"R8Snorm\";\n      case Format::eR8Uscaled: return \"R8Uscaled\";\n      case Format::eR8Sscaled: return \"R8Sscaled\";\n      case Format::eR8Uint: return \"R8Uint\";\n      case Format::eR8Sint: return \"R8Sint\";\n      case Format::eR8Srgb: return \"R8Srgb\";\n      case Format::eR8G8Unorm: return \"R8G8Unorm\";\n      case Format::eR8G8Snorm: return \"R8G8Snorm\";\n      case Format::eR8G8Uscaled: return \"R8G8Uscaled\";\n      case Format::eR8G8Sscaled: return \"R8G8Sscaled\";\n      case Format::eR8G8Uint: return \"R8G8Uint\";\n      case Format::eR8G8Sint: return \"R8G8Sint\";\n      case Format::eR8G8Srgb: return \"R8G8Srgb\";\n      case Format::eR8G8B8Unorm: return \"R8G8B8Unorm\";\n      case Format::eR8G8B8Snorm: return \"R8G8B8Snorm\";\n      case Format::eR8G8B8Uscaled: return \"R8G8B8Uscaled\";\n      case Format::eR8G8B8Sscaled: return \"R8G8B8Sscaled\";\n      case Format::eR8G8B8Uint: return \"R8G8B8Uint\";\n      case Format::eR8G8B8Sint: return \"R8G8B8Sint\";\n      case Format::eR8G8B8Srgb: return \"R8G8B8Srgb\";\n      case Format::eB8G8R8Unorm: return \"B8G8R8Unorm\";\n      case Format::eB8G8R8Snorm: return \"B8G8R8Snorm\";\n      case Format::eB8G8R8Uscaled: return \"B8G8R8Uscaled\";\n      case Format::eB8G8R8Sscaled: return \"B8G8R8Sscaled\";\n      case Format::eB8G8R8Uint: return \"B8G8R8Uint\";\n      case Format::eB8G8R8Sint: return \"B8G8R8Sint\";\n      case Format::eB8G8R8Srgb: return \"B8G8R8Srgb\";\n      case Format::eR8G8B8A8Unorm: return \"R8G8B8A8Unorm\";\n      case Format::eR8G8B8A8Snorm: return \"R8G8B8A8Snorm\";\n      case Format::eR8G8B8A8Uscaled: return \"R8G8B8A8Uscaled\";\n      case Format::eR8G8B8A8Sscaled: return \"R8G8B8A8Sscaled\";\n      case Format::eR8G8B8A8Uint: return \"R8G8B8A8Uint\";\n      case Format::eR8G8B8A8Sint: return \"R8G8B8A8Sint\";\n      case Format::eR8G8B8A8Srgb: return \"R8G8B8A8Srgb\";\n      case Format::eB8G8R8A8Unorm: return \"B8G8R8A8Unorm\";\n      case Format::eB8G8R8A8Snorm: return \"B8G8R8A8Snorm\";\n      case Format::eB8G8R8A8Uscaled: return \"B8G8R8A8Uscaled\";\n      case Format::eB8G8R8A8Sscaled: return \"B8G8R8A8Sscaled\";\n      case Format::eB8G8R8A8Uint: return \"B8G8R8A8Uint\";\n      case Format::eB8G8R8A8Sint: return \"B8G8R8A8Sint\";\n      case Format::eB8G8R8A8Srgb: return \"B8G8R8A8Srgb\";\n      case Format::eA8B8G8R8UnormPack32: return \"A8B8G8R8UnormPack32\";\n      case Format::eA8B8G8R8SnormPack32: return \"A8B8G8R8SnormPack32\";\n      case Format::eA8B8G8R8UscaledPack32: return \"A8B8G8R8UscaledPack32\";\n      case Format::eA8B8G8R8SscaledPack32: return \"A8B8G8R8SscaledPack32\";\n      case Format::eA8B8G8R8UintPack32: return \"A8B8G8R8UintPack32\";\n      case Format::eA8B8G8R8SintPack32: return \"A8B8G8R8SintPack32\";\n      case Format::eA8B8G8R8SrgbPack32: return \"A8B8G8R8SrgbPack32\";\n      case Format::eA2R10G10B10UnormPack32: return \"A2R10G10B10UnormPack32\";\n      case Format::eA2R10G10B10SnormPack32: return \"A2R10G10B10SnormPack32\";\n      case Format::eA2R10G10B10UscaledPack32: return \"A2R10G10B10UscaledPack32\";\n      case Format::eA2R10G10B10SscaledPack32: return \"A2R10G10B10SscaledPack32\";\n      case Format::eA2R10G10B10UintPack32: return \"A2R10G10B10UintPack32\";\n      case Format::eA2R10G10B10SintPack32: return \"A2R10G10B10SintPack32\";\n      case Format::eA2B10G10R10UnormPack32: return \"A2B10G10R10UnormPack32\";\n      case Format::eA2B10G10R10SnormPack32: return \"A2B10G10R10SnormPack32\";\n      case Format::eA2B10G10R10UscaledPack32: return \"A2B10G10R10UscaledPack32\";\n      case Format::eA2B10G10R10SscaledPack32: return \"A2B10G10R10SscaledPack32\";\n      case Format::eA2B10G10R10UintPack32: return \"A2B10G10R10UintPack32\";\n      case Format::eA2B10G10R10SintPack32: return \"A2B10G10R10SintPack32\";\n      case Format::eR16Unorm: return \"R16Unorm\";\n      case Format::eR16Snorm: return \"R16Snorm\";\n      case Format::eR16Uscaled: return \"R16Uscaled\";\n      case Format::eR16Sscaled: return \"R16Sscaled\";\n      case Format::eR16Uint: return \"R16Uint\";\n      case Format::eR16Sint: return \"R16Sint\";\n      case Format::eR16Sfloat: return \"R16Sfloat\";\n      case Format::eR16G16Unorm: return \"R16G16Unorm\";\n      case Format::eR16G16Snorm: return \"R16G16Snorm\";\n      case Format::eR16G16Uscaled: return \"R16G16Uscaled\";\n      case Format::eR16G16Sscaled: return \"R16G16Sscaled\";\n      case Format::eR16G16Uint: return \"R16G16Uint\";\n      case Format::eR16G16Sint: return \"R16G16Sint\";\n      case Format::eR16G16Sfloat: return \"R16G16Sfloat\";\n      case Format::eR16G16B16Unorm: return \"R16G16B16Unorm\";\n      case Format::eR16G16B16Snorm: return \"R16G16B16Snorm\";\n      case Format::eR16G16B16Uscaled: return \"R16G16B16Uscaled\";\n      case Format::eR16G16B16Sscaled: return \"R16G16B16Sscaled\";\n      case Format::eR16G16B16Uint: return \"R16G16B16Uint\";\n      case Format::eR16G16B16Sint: return \"R16G16B16Sint\";\n      case Format::eR16G16B16Sfloat: return \"R16G16B16Sfloat\";\n      case Format::eR16G16B16A16Unorm: return \"R16G16B16A16Unorm\";\n      case Format::eR16G16B16A16Snorm: return \"R16G16B16A16Snorm\";\n      case Format::eR16G16B16A16Uscaled: return \"R16G16B16A16Uscaled\";\n      case Format::eR16G16B16A16Sscaled: return \"R16G16B16A16Sscaled\";\n      case Format::eR16G16B16A16Uint: return \"R16G16B16A16Uint\";\n      case Format::eR16G16B16A16Sint: return \"R16G16B16A16Sint\";\n      case Format::eR16G16B16A16Sfloat: return \"R16G16B16A16Sfloat\";\n      case Format::eR32Uint: return \"R32Uint\";\n      case Format::eR32Sint: return \"R32Sint\";\n      case Format::eR32Sfloat: return \"R32Sfloat\";\n      case Format::eR32G32Uint: return \"R32G32Uint\";\n      case Format::eR32G32Sint: return \"R32G32Sint\";\n      case Format::eR32G32Sfloat: return \"R32G32Sfloat\";\n      case Format::eR32G32B32Uint: return \"R32G32B32Uint\";\n      case Format::eR32G32B32Sint: return \"R32G32B32Sint\";\n      case Format::eR32G32B32Sfloat: return \"R32G32B32Sfloat\";\n      case Format::eR32G32B32A32Uint: return \"R32G32B32A32Uint\";\n      case Format::eR32G32B32A32Sint: return \"R32G32B32A32Sint\";\n      case Format::eR32G32B32A32Sfloat: return \"R32G32B32A32Sfloat\";\n      case Format::eR64Uint: return \"R64Uint\";\n      case Format::eR64Sint: return \"R64Sint\";\n      case Format::eR64Sfloat: return \"R64Sfloat\";\n      case Format::eR64G64Uint: return \"R64G64Uint\";\n      case Format::eR64G64Sint: return \"R64G64Sint\";\n      case Format::eR64G64Sfloat: return \"R64G64Sfloat\";\n      case Format::eR64G64B64Uint: return \"R64G64B64Uint\";\n      case Format::eR64G64B64Sint: return \"R64G64B64Sint\";\n      case Format::eR64G64B64Sfloat: return \"R64G64B64Sfloat\";\n      case Format::eR64G64B64A64Uint: return \"R64G64B64A64Uint\";\n      case Format::eR64G64B64A64Sint: return \"R64G64B64A64Sint\";\n      case Format::eR64G64B64A64Sfloat: return \"R64G64B64A64Sfloat\";\n      case Format::eB10G11R11UfloatPack32: return \"B10G11R11UfloatPack32\";\n      case Format::eE5B9G9R9UfloatPack32: return \"E5B9G9R9UfloatPack32\";\n      case Format::eD16Unorm: return \"D16Unorm\";\n      case Format::eX8D24UnormPack32: return \"X8D24UnormPack32\";\n      case Format::eD32Sfloat: return \"D32Sfloat\";\n      case Format::eS8Uint: return \"S8Uint\";\n      case Format::eD16UnormS8Uint: return \"D16UnormS8Uint\";\n      case Format::eD24UnormS8Uint: return \"D24UnormS8Uint\";\n      case Format::eD32SfloatS8Uint: return \"D32SfloatS8Uint\";\n      case Format::eBc1RgbUnormBlock: return \"Bc1RgbUnormBlock\";\n      case Format::eBc1RgbSrgbBlock: return \"Bc1RgbSrgbBlock\";\n      case Format::eBc1RgbaUnormBlock: return \"Bc1RgbaUnormBlock\";\n      case Format::eBc1RgbaSrgbBlock: return \"Bc1RgbaSrgbBlock\";\n      case Format::eBc2UnormBlock: return \"Bc2UnormBlock\";\n      case Format::eBc2SrgbBlock: return \"Bc2SrgbBlock\";\n      case Format::eBc3UnormBlock: return \"Bc3UnormBlock\";\n      case Format::eBc3SrgbBlock: return \"Bc3SrgbBlock\";\n      case Format::eBc4UnormBlock: return \"Bc4UnormBlock\";\n      case Format::eBc4SnormBlock: return \"Bc4SnormBlock\";\n      case Format::eBc5UnormBlock: return \"Bc5UnormBlock\";\n      case Format::eBc5SnormBlock: return \"Bc5SnormBlock\";\n      case Format::eBc6HUfloatBlock: return \"Bc6HUfloatBlock\";\n      case Format::eBc6HSfloatBlock: return \"Bc6HSfloatBlock\";\n      case Format::eBc7UnormBlock: return \"Bc7UnormBlock\";\n      case Format::eBc7SrgbBlock: return \"Bc7SrgbBlock\";\n      case Format::eEtc2R8G8B8UnormBlock: return \"Etc2R8G8B8UnormBlock\";\n      case Format::eEtc2R8G8B8SrgbBlock: return \"Etc2R8G8B8SrgbBlock\";\n      case Format::eEtc2R8G8B8A1UnormBlock: return \"Etc2R8G8B8A1UnormBlock\";\n      case Format::eEtc2R8G8B8A1SrgbBlock: return \"Etc2R8G8B8A1SrgbBlock\";\n      case Format::eEtc2R8G8B8A8UnormBlock: return \"Etc2R8G8B8A8UnormBlock\";\n      case Format::eEtc2R8G8B8A8SrgbBlock: return \"Etc2R8G8B8A8SrgbBlock\";\n      case Format::eEacR11UnormBlock: return \"EacR11UnormBlock\";\n      case Format::eEacR11SnormBlock: return \"EacR11SnormBlock\";\n      case Format::eEacR11G11UnormBlock: return \"EacR11G11UnormBlock\";\n      case Format::eEacR11G11SnormBlock: return \"EacR11G11SnormBlock\";\n      case Format::eAstc4x4UnormBlock: return \"Astc4x4UnormBlock\";\n      case Format::eAstc4x4SrgbBlock: return \"Astc4x4SrgbBlock\";\n      case Format::eAstc5x4UnormBlock: return \"Astc5x4UnormBlock\";\n      case Format::eAstc5x4SrgbBlock: return \"Astc5x4SrgbBlock\";\n      case Format::eAstc5x5UnormBlock: return \"Astc5x5UnormBlock\";\n      case Format::eAstc5x5SrgbBlock: return \"Astc5x5SrgbBlock\";\n      case Format::eAstc6x5UnormBlock: return \"Astc6x5UnormBlock\";\n      case Format::eAstc6x5SrgbBlock: return \"Astc6x5SrgbBlock\";\n      case Format::eAstc6x6UnormBlock: return \"Astc6x6UnormBlock\";\n      case Format::eAstc6x6SrgbBlock: return \"Astc6x6SrgbBlock\";\n      case Format::eAstc8x5UnormBlock: return \"Astc8x5UnormBlock\";\n      case Format::eAstc8x5SrgbBlock: return \"Astc8x5SrgbBlock\";\n      case Format::eAstc8x6UnormBlock: return \"Astc8x6UnormBlock\";\n      case Format::eAstc8x6SrgbBlock: return \"Astc8x6SrgbBlock\";\n      case Format::eAstc8x8UnormBlock: return \"Astc8x8UnormBlock\";\n      case Format::eAstc8x8SrgbBlock: return \"Astc8x8SrgbBlock\";\n      case Format::eAstc10x5UnormBlock: return \"Astc10x5UnormBlock\";\n      case Format::eAstc10x5SrgbBlock: return \"Astc10x5SrgbBlock\";\n      case Format::eAstc10x6UnormBlock: return \"Astc10x6UnormBlock\";\n      case Format::eAstc10x6SrgbBlock: return \"Astc10x6SrgbBlock\";\n      case Format::eAstc10x8UnormBlock: return \"Astc10x8UnormBlock\";\n      case Format::eAstc10x8SrgbBlock: return \"Astc10x8SrgbBlock\";\n      case Format::eAstc10x10UnormBlock: return \"Astc10x10UnormBlock\";\n      case Format::eAstc10x10SrgbBlock: return \"Astc10x10SrgbBlock\";\n      case Format::eAstc12x10UnormBlock: return \"Astc12x10UnormBlock\";\n      case Format::eAstc12x10SrgbBlock: return \"Astc12x10SrgbBlock\";\n      case Format::eAstc12x12UnormBlock: return \"Astc12x12UnormBlock\";\n      case Format::eAstc12x12SrgbBlock: return \"Astc12x12SrgbBlock\";\n      case Format::eG8B8G8R8422Unorm: return \"G8B8G8R8422Unorm\";\n      case Format::eB8G8R8G8422Unorm: return \"B8G8R8G8422Unorm\";\n      case Format::eG8B8R83Plane420Unorm: return \"G8B8R83Plane420Unorm\";\n      case Format::eG8B8R82Plane420Unorm: return \"G8B8R82Plane420Unorm\";\n      case Format::eG8B8R83Plane422Unorm: return \"G8B8R83Plane422Unorm\";\n      case Format::eG8B8R82Plane422Unorm: return \"G8B8R82Plane422Unorm\";\n      case Format::eG8B8R83Plane444Unorm: return \"G8B8R83Plane444Unorm\";\n      case Format::eR10X6UnormPack16: return \"R10X6UnormPack16\";\n      case Format::eR10X6G10X6Unorm2Pack16: return \"R10X6G10X6Unorm2Pack16\";\n      case Format::eR10X6G10X6B10X6A10X6Unorm4Pack16: return \"R10X6G10X6B10X6A10X6Unorm4Pack16\";\n      case Format::eG10X6B10X6G10X6R10X6422Unorm4Pack16: return \"G10X6B10X6G10X6R10X6422Unorm4Pack16\";\n      case Format::eB10X6G10X6R10X6G10X6422Unorm4Pack16: return \"B10X6G10X6R10X6G10X6422Unorm4Pack16\";\n      case Format::eG10X6B10X6R10X63Plane420Unorm3Pack16: return \"G10X6B10X6R10X63Plane420Unorm3Pack16\";\n      case Format::eG10X6B10X6R10X62Plane420Unorm3Pack16: return \"G10X6B10X6R10X62Plane420Unorm3Pack16\";\n      case Format::eG10X6B10X6R10X63Plane422Unorm3Pack16: return \"G10X6B10X6R10X63Plane422Unorm3Pack16\";\n      case Format::eG10X6B10X6R10X62Plane422Unorm3Pack16: return \"G10X6B10X6R10X62Plane422Unorm3Pack16\";\n      case Format::eG10X6B10X6R10X63Plane444Unorm3Pack16: return \"G10X6B10X6R10X63Plane444Unorm3Pack16\";\n      case Format::eR12X4UnormPack16: return \"R12X4UnormPack16\";\n      case Format::eR12X4G12X4Unorm2Pack16: return \"R12X4G12X4Unorm2Pack16\";\n      case Format::eR12X4G12X4B12X4A12X4Unorm4Pack16: return \"R12X4G12X4B12X4A12X4Unorm4Pack16\";\n      case Format::eG12X4B12X4G12X4R12X4422Unorm4Pack16: return \"G12X4B12X4G12X4R12X4422Unorm4Pack16\";\n      case Format::eB12X4G12X4R12X4G12X4422Unorm4Pack16: return \"B12X4G12X4R12X4G12X4422Unorm4Pack16\";\n      case Format::eG12X4B12X4R12X43Plane420Unorm3Pack16: return \"G12X4B12X4R12X43Plane420Unorm3Pack16\";\n      case Format::eG12X4B12X4R12X42Plane420Unorm3Pack16: return \"G12X4B12X4R12X42Plane420Unorm3Pack16\";\n      case Format::eG12X4B12X4R12X43Plane422Unorm3Pack16: return \"G12X4B12X4R12X43Plane422Unorm3Pack16\";\n      case Format::eG12X4B12X4R12X42Plane422Unorm3Pack16: return \"G12X4B12X4R12X42Plane422Unorm3Pack16\";\n      case Format::eG12X4B12X4R12X43Plane444Unorm3Pack16: return \"G12X4B12X4R12X43Plane444Unorm3Pack16\";\n      case Format::eG16B16G16R16422Unorm: return \"G16B16G16R16422Unorm\";\n      case Format::eB16G16R16G16422Unorm: return \"B16G16R16G16422Unorm\";\n      case Format::eG16B16R163Plane420Unorm: return \"G16B16R163Plane420Unorm\";\n      case Format::eG16B16R162Plane420Unorm: return \"G16B16R162Plane420Unorm\";\n      case Format::eG16B16R163Plane422Unorm: return \"G16B16R163Plane422Unorm\";\n      case Format::eG16B16R162Plane422Unorm: return \"G16B16R162Plane422Unorm\";\n      case Format::eG16B16R163Plane444Unorm: return \"G16B16R163Plane444Unorm\";\n      case Format::eG8B8R82Plane444Unorm: return \"G8B8R82Plane444Unorm\";\n      case Format::eG10X6B10X6R10X62Plane444Unorm3Pack16: return \"G10X6B10X6R10X62Plane444Unorm3Pack16\";\n      case Format::eG12X4B12X4R12X42Plane444Unorm3Pack16: return \"G12X4B12X4R12X42Plane444Unorm3Pack16\";\n      case Format::eG16B16R162Plane444Unorm: return \"G16B16R162Plane444Unorm\";\n      case Format::eA4R4G4B4UnormPack16: return \"A4R4G4B4UnormPack16\";\n      case Format::eA4B4G4R4UnormPack16: return \"A4B4G4R4UnormPack16\";\n      case Format::eAstc4x4SfloatBlock: return \"Astc4x4SfloatBlock\";\n      case Format::eAstc5x4SfloatBlock: return \"Astc5x4SfloatBlock\";\n      case Format::eAstc5x5SfloatBlock: return \"Astc5x5SfloatBlock\";\n      case Format::eAstc6x5SfloatBlock: return \"Astc6x5SfloatBlock\";\n      case Format::eAstc6x6SfloatBlock: return \"Astc6x6SfloatBlock\";\n      case Format::eAstc8x5SfloatBlock: return \"Astc8x5SfloatBlock\";\n      case Format::eAstc8x6SfloatBlock: return \"Astc8x6SfloatBlock\";\n      case Format::eAstc8x8SfloatBlock: return \"Astc8x8SfloatBlock\";\n      case Format::eAstc10x5SfloatBlock: return \"Astc10x5SfloatBlock\";\n      case Format::eAstc10x6SfloatBlock: return \"Astc10x6SfloatBlock\";\n      case Format::eAstc10x8SfloatBlock: return \"Astc10x8SfloatBlock\";\n      case Format::eAstc10x10SfloatBlock: return \"Astc10x10SfloatBlock\";\n      case Format::eAstc12x10SfloatBlock: return \"Astc12x10SfloatBlock\";\n      case Format::eAstc12x12SfloatBlock: return \"Astc12x12SfloatBlock\";\n      case Format::eA1B5G5R5UnormPack16: return \"A1B5G5R5UnormPack16\";\n      case Format::eA8Unorm: return \"A8Unorm\";\n      case Format::ePvrtc12BppUnormBlockIMG: return \"Pvrtc12BppUnormBlockIMG\";\n      case Format::ePvrtc14BppUnormBlockIMG: return \"Pvrtc14BppUnormBlockIMG\";\n      case Format::ePvrtc22BppUnormBlockIMG: return \"Pvrtc22BppUnormBlockIMG\";\n      case Format::ePvrtc24BppUnormBlockIMG: return \"Pvrtc24BppUnormBlockIMG\";\n      case Format::ePvrtc12BppSrgbBlockIMG: return \"Pvrtc12BppSrgbBlockIMG\";\n      case Format::ePvrtc14BppSrgbBlockIMG: return \"Pvrtc14BppSrgbBlockIMG\";\n      case Format::ePvrtc22BppSrgbBlockIMG: return \"Pvrtc22BppSrgbBlockIMG\";\n      case Format::ePvrtc24BppSrgbBlockIMG: return \"Pvrtc24BppSrgbBlockIMG\";\n      case Format::eR16G16Sfixed5NV: return \"R16G16Sfixed5NV\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( FormatFeatureFlagBits value )\n  {\n    switch ( value )\n    {\n      case FormatFeatureFlagBits::eSampledImage: return \"SampledImage\";\n      case FormatFeatureFlagBits::eStorageImage: return \"StorageImage\";\n      case FormatFeatureFlagBits::eStorageImageAtomic: return \"StorageImageAtomic\";\n      case FormatFeatureFlagBits::eUniformTexelBuffer: return \"UniformTexelBuffer\";\n      case FormatFeatureFlagBits::eStorageTexelBuffer: return \"StorageTexelBuffer\";\n      case FormatFeatureFlagBits::eStorageTexelBufferAtomic: return \"StorageTexelBufferAtomic\";\n      case FormatFeatureFlagBits::eVertexBuffer: return \"VertexBuffer\";\n      case FormatFeatureFlagBits::eColorAttachment: return \"ColorAttachment\";\n      case FormatFeatureFlagBits::eColorAttachmentBlend: return \"ColorAttachmentBlend\";\n      case FormatFeatureFlagBits::eDepthStencilAttachment: return \"DepthStencilAttachment\";\n      case FormatFeatureFlagBits::eBlitSrc: return \"BlitSrc\";\n      case FormatFeatureFlagBits::eBlitDst: return \"BlitDst\";\n      case FormatFeatureFlagBits::eSampledImageFilterLinear: return \"SampledImageFilterLinear\";\n      case FormatFeatureFlagBits::eTransferSrc: return \"TransferSrc\";\n      case FormatFeatureFlagBits::eTransferDst: return \"TransferDst\";\n      case FormatFeatureFlagBits::eMidpointChromaSamples: return \"MidpointChromaSamples\";\n      case FormatFeatureFlagBits::eSampledImageYcbcrConversionLinearFilter: return \"SampledImageYcbcrConversionLinearFilter\";\n      case FormatFeatureFlagBits::eSampledImageYcbcrConversionSeparateReconstructionFilter: return \"SampledImageYcbcrConversionSeparateReconstructionFilter\";\n      case FormatFeatureFlagBits::eSampledImageYcbcrConversionChromaReconstructionExplicit: return \"SampledImageYcbcrConversionChromaReconstructionExplicit\";\n      case FormatFeatureFlagBits::eSampledImageYcbcrConversionChromaReconstructionExplicitForceable:\n        return \"SampledImageYcbcrConversionChromaReconstructionExplicitForceable\";\n      case FormatFeatureFlagBits::eDisjoint: return \"Disjoint\";\n      case FormatFeatureFlagBits::eCositedChromaSamples: return \"CositedChromaSamples\";\n      case FormatFeatureFlagBits::eSampledImageFilterMinmax: return \"SampledImageFilterMinmax\";\n      case FormatFeatureFlagBits::eVideoDecodeOutputKHR: return \"VideoDecodeOutputKHR\";\n      case FormatFeatureFlagBits::eVideoDecodeDpbKHR: return \"VideoDecodeDpbKHR\";\n      case FormatFeatureFlagBits::eAccelerationStructureVertexBufferKHR: return \"AccelerationStructureVertexBufferKHR\";\n      case FormatFeatureFlagBits::eSampledImageFilterCubicEXT: return \"SampledImageFilterCubicEXT\";\n      case FormatFeatureFlagBits::eFragmentDensityMapEXT: return \"FragmentDensityMapEXT\";\n      case FormatFeatureFlagBits::eFragmentShadingRateAttachmentKHR: return \"FragmentShadingRateAttachmentKHR\";\n      case FormatFeatureFlagBits::eVideoEncodeInputKHR: return \"VideoEncodeInputKHR\";\n      case FormatFeatureFlagBits::eVideoEncodeDpbKHR: return \"VideoEncodeDpbKHR\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ImageCreateFlagBits value )\n  {\n    switch ( value )\n    {\n      case ImageCreateFlagBits::eSparseBinding: return \"SparseBinding\";\n      case ImageCreateFlagBits::eSparseResidency: return \"SparseResidency\";\n      case ImageCreateFlagBits::eSparseAliased: return \"SparseAliased\";\n      case ImageCreateFlagBits::eMutableFormat: return \"MutableFormat\";\n      case ImageCreateFlagBits::eCubeCompatible: return \"CubeCompatible\";\n      case ImageCreateFlagBits::eAlias: return \"Alias\";\n      case ImageCreateFlagBits::eSplitInstanceBindRegions: return \"SplitInstanceBindRegions\";\n      case ImageCreateFlagBits::e2DArrayCompatible: return \"2DArrayCompatible\";\n      case ImageCreateFlagBits::eBlockTexelViewCompatible: return \"BlockTexelViewCompatible\";\n      case ImageCreateFlagBits::eExtendedUsage: return \"ExtendedUsage\";\n      case ImageCreateFlagBits::eProtected: return \"Protected\";\n      case ImageCreateFlagBits::eDisjoint: return \"Disjoint\";\n      case ImageCreateFlagBits::eCornerSampledNV: return \"CornerSampledNV\";\n      case ImageCreateFlagBits::eSampleLocationsCompatibleDepthEXT: return \"SampleLocationsCompatibleDepthEXT\";\n      case ImageCreateFlagBits::eSubsampledEXT: return \"SubsampledEXT\";\n      case ImageCreateFlagBits::eDescriptorBufferCaptureReplayEXT: return \"DescriptorBufferCaptureReplayEXT\";\n      case ImageCreateFlagBits::eMultisampledRenderToSingleSampledEXT: return \"MultisampledRenderToSingleSampledEXT\";\n      case ImageCreateFlagBits::e2DViewCompatibleEXT: return \"2DViewCompatibleEXT\";\n      case ImageCreateFlagBits::eFragmentDensityMapOffsetQCOM: return \"FragmentDensityMapOffsetQCOM\";\n      case ImageCreateFlagBits::eVideoProfileIndependentKHR: return \"VideoProfileIndependentKHR\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ImageTiling value )\n  {\n    switch ( value )\n    {\n      case ImageTiling::eOptimal: return \"Optimal\";\n      case ImageTiling::eLinear: return \"Linear\";\n      case ImageTiling::eDrmFormatModifierEXT: return \"DrmFormatModifierEXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ImageType value )\n  {\n    switch ( value )\n    {\n      case ImageType::e1D: return \"1D\";\n      case ImageType::e2D: return \"2D\";\n      case ImageType::e3D: return \"3D\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ImageUsageFlagBits value )\n  {\n    switch ( value )\n    {\n      case ImageUsageFlagBits::eTransferSrc: return \"TransferSrc\";\n      case ImageUsageFlagBits::eTransferDst: return \"TransferDst\";\n      case ImageUsageFlagBits::eSampled: return \"Sampled\";\n      case ImageUsageFlagBits::eStorage: return \"Storage\";\n      case ImageUsageFlagBits::eColorAttachment: return \"ColorAttachment\";\n      case ImageUsageFlagBits::eDepthStencilAttachment: return \"DepthStencilAttachment\";\n      case ImageUsageFlagBits::eTransientAttachment: return \"TransientAttachment\";\n      case ImageUsageFlagBits::eInputAttachment: return \"InputAttachment\";\n      case ImageUsageFlagBits::eHostTransfer: return \"HostTransfer\";\n      case ImageUsageFlagBits::eVideoDecodeDstKHR: return \"VideoDecodeDstKHR\";\n      case ImageUsageFlagBits::eVideoDecodeSrcKHR: return \"VideoDecodeSrcKHR\";\n      case ImageUsageFlagBits::eVideoDecodeDpbKHR: return \"VideoDecodeDpbKHR\";\n      case ImageUsageFlagBits::eFragmentDensityMapEXT: return \"FragmentDensityMapEXT\";\n      case ImageUsageFlagBits::eFragmentShadingRateAttachmentKHR: return \"FragmentShadingRateAttachmentKHR\";\n      case ImageUsageFlagBits::eVideoEncodeDstKHR: return \"VideoEncodeDstKHR\";\n      case ImageUsageFlagBits::eVideoEncodeSrcKHR: return \"VideoEncodeSrcKHR\";\n      case ImageUsageFlagBits::eVideoEncodeDpbKHR: return \"VideoEncodeDpbKHR\";\n      case ImageUsageFlagBits::eAttachmentFeedbackLoopEXT: return \"AttachmentFeedbackLoopEXT\";\n      case ImageUsageFlagBits::eInvocationMaskHUAWEI: return \"InvocationMaskHUAWEI\";\n      case ImageUsageFlagBits::eSampleWeightQCOM: return \"SampleWeightQCOM\";\n      case ImageUsageFlagBits::eSampleBlockMatchQCOM: return \"SampleBlockMatchQCOM\";\n      case ImageUsageFlagBits::eVideoEncodeQuantizationDeltaMapKHR: return \"VideoEncodeQuantizationDeltaMapKHR\";\n      case ImageUsageFlagBits::eVideoEncodeEmphasisMapKHR: return \"VideoEncodeEmphasisMapKHR\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( InstanceCreateFlagBits value )\n  {\n    switch ( value )\n    {\n      case InstanceCreateFlagBits::eEnumeratePortabilityKHR: return \"EnumeratePortabilityKHR\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( InternalAllocationType value )\n  {\n    switch ( value )\n    {\n      case InternalAllocationType::eExecutable: return \"Executable\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( MemoryHeapFlagBits value )\n  {\n    switch ( value )\n    {\n      case MemoryHeapFlagBits::eDeviceLocal: return \"DeviceLocal\";\n      case MemoryHeapFlagBits::eMultiInstance: return \"MultiInstance\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( MemoryPropertyFlagBits value )\n  {\n    switch ( value )\n    {\n      case MemoryPropertyFlagBits::eDeviceLocal: return \"DeviceLocal\";\n      case MemoryPropertyFlagBits::eHostVisible: return \"HostVisible\";\n      case MemoryPropertyFlagBits::eHostCoherent: return \"HostCoherent\";\n      case MemoryPropertyFlagBits::eHostCached: return \"HostCached\";\n      case MemoryPropertyFlagBits::eLazilyAllocated: return \"LazilyAllocated\";\n      case MemoryPropertyFlagBits::eProtected: return \"Protected\";\n      case MemoryPropertyFlagBits::eDeviceCoherentAMD: return \"DeviceCoherentAMD\";\n      case MemoryPropertyFlagBits::eDeviceUncachedAMD: return \"DeviceUncachedAMD\";\n      case MemoryPropertyFlagBits::eRdmaCapableNV: return \"RdmaCapableNV\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PhysicalDeviceType value )\n  {\n    switch ( value )\n    {\n      case PhysicalDeviceType::eOther: return \"Other\";\n      case PhysicalDeviceType::eIntegratedGpu: return \"IntegratedGpu\";\n      case PhysicalDeviceType::eDiscreteGpu: return \"DiscreteGpu\";\n      case PhysicalDeviceType::eVirtualGpu: return \"VirtualGpu\";\n      case PhysicalDeviceType::eCpu: return \"Cpu\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( QueueFlagBits value )\n  {\n    switch ( value )\n    {\n      case QueueFlagBits::eGraphics: return \"Graphics\";\n      case QueueFlagBits::eCompute: return \"Compute\";\n      case QueueFlagBits::eTransfer: return \"Transfer\";\n      case QueueFlagBits::eSparseBinding: return \"SparseBinding\";\n      case QueueFlagBits::eProtected: return \"Protected\";\n      case QueueFlagBits::eVideoDecodeKHR: return \"VideoDecodeKHR\";\n      case QueueFlagBits::eVideoEncodeKHR: return \"VideoEncodeKHR\";\n      case QueueFlagBits::eOpticalFlowNV: return \"OpticalFlowNV\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SampleCountFlagBits value )\n  {\n    switch ( value )\n    {\n      case SampleCountFlagBits::e1: return \"1\";\n      case SampleCountFlagBits::e2: return \"2\";\n      case SampleCountFlagBits::e4: return \"4\";\n      case SampleCountFlagBits::e8: return \"8\";\n      case SampleCountFlagBits::e16: return \"16\";\n      case SampleCountFlagBits::e32: return \"32\";\n      case SampleCountFlagBits::e64: return \"64\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SystemAllocationScope value )\n  {\n    switch ( value )\n    {\n      case SystemAllocationScope::eCommand: return \"Command\";\n      case SystemAllocationScope::eObject: return \"Object\";\n      case SystemAllocationScope::eCache: return \"Cache\";\n      case SystemAllocationScope::eDevice: return \"Device\";\n      case SystemAllocationScope::eInstance: return \"Instance\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DeviceCreateFlagBits )\n  {\n    return \"(void)\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DeviceQueueCreateFlagBits value )\n  {\n    switch ( value )\n    {\n      case DeviceQueueCreateFlagBits::eProtected: return \"Protected\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineStageFlagBits value )\n  {\n    switch ( value )\n    {\n      case PipelineStageFlagBits::eTopOfPipe: return \"TopOfPipe\";\n      case PipelineStageFlagBits::eDrawIndirect: return \"DrawIndirect\";\n      case PipelineStageFlagBits::eVertexInput: return \"VertexInput\";\n      case PipelineStageFlagBits::eVertexShader: return \"VertexShader\";\n      case PipelineStageFlagBits::eTessellationControlShader: return \"TessellationControlShader\";\n      case PipelineStageFlagBits::eTessellationEvaluationShader: return \"TessellationEvaluationShader\";\n      case PipelineStageFlagBits::eGeometryShader: return \"GeometryShader\";\n      case PipelineStageFlagBits::eFragmentShader: return \"FragmentShader\";\n      case PipelineStageFlagBits::eEarlyFragmentTests: return \"EarlyFragmentTests\";\n      case PipelineStageFlagBits::eLateFragmentTests: return \"LateFragmentTests\";\n      case PipelineStageFlagBits::eColorAttachmentOutput: return \"ColorAttachmentOutput\";\n      case PipelineStageFlagBits::eComputeShader: return \"ComputeShader\";\n      case PipelineStageFlagBits::eTransfer: return \"Transfer\";\n      case PipelineStageFlagBits::eBottomOfPipe: return \"BottomOfPipe\";\n      case PipelineStageFlagBits::eHost: return \"Host\";\n      case PipelineStageFlagBits::eAllGraphics: return \"AllGraphics\";\n      case PipelineStageFlagBits::eAllCommands: return \"AllCommands\";\n      case PipelineStageFlagBits::eNone: return \"None\";\n      case PipelineStageFlagBits::eTransformFeedbackEXT: return \"TransformFeedbackEXT\";\n      case PipelineStageFlagBits::eConditionalRenderingEXT: return \"ConditionalRenderingEXT\";\n      case PipelineStageFlagBits::eAccelerationStructureBuildKHR: return \"AccelerationStructureBuildKHR\";\n      case PipelineStageFlagBits::eRayTracingShaderKHR: return \"RayTracingShaderKHR\";\n      case PipelineStageFlagBits::eFragmentDensityProcessEXT: return \"FragmentDensityProcessEXT\";\n      case PipelineStageFlagBits::eFragmentShadingRateAttachmentKHR: return \"FragmentShadingRateAttachmentKHR\";\n      case PipelineStageFlagBits::eCommandPreprocessNV: return \"CommandPreprocessNV\";\n      case PipelineStageFlagBits::eTaskShaderEXT: return \"TaskShaderEXT\";\n      case PipelineStageFlagBits::eMeshShaderEXT: return \"MeshShaderEXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( MemoryMapFlagBits value )\n  {\n    switch ( value )\n    {\n      case MemoryMapFlagBits::ePlacedEXT: return \"PlacedEXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ImageAspectFlagBits value )\n  {\n    switch ( value )\n    {\n      case ImageAspectFlagBits::eColor: return \"Color\";\n      case ImageAspectFlagBits::eDepth: return \"Depth\";\n      case ImageAspectFlagBits::eStencil: return \"Stencil\";\n      case ImageAspectFlagBits::eMetadata: return \"Metadata\";\n      case ImageAspectFlagBits::ePlane0: return \"Plane0\";\n      case ImageAspectFlagBits::ePlane1: return \"Plane1\";\n      case ImageAspectFlagBits::ePlane2: return \"Plane2\";\n      case ImageAspectFlagBits::eNone: return \"None\";\n      case ImageAspectFlagBits::eMemoryPlane0EXT: return \"MemoryPlane0EXT\";\n      case ImageAspectFlagBits::eMemoryPlane1EXT: return \"MemoryPlane1EXT\";\n      case ImageAspectFlagBits::eMemoryPlane2EXT: return \"MemoryPlane2EXT\";\n      case ImageAspectFlagBits::eMemoryPlane3EXT: return \"MemoryPlane3EXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SparseImageFormatFlagBits value )\n  {\n    switch ( value )\n    {\n      case SparseImageFormatFlagBits::eSingleMiptail: return \"SingleMiptail\";\n      case SparseImageFormatFlagBits::eAlignedMipSize: return \"AlignedMipSize\";\n      case SparseImageFormatFlagBits::eNonstandardBlockSize: return \"NonstandardBlockSize\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SparseMemoryBindFlagBits value )\n  {\n    switch ( value )\n    {\n      case SparseMemoryBindFlagBits::eMetadata: return \"Metadata\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( FenceCreateFlagBits value )\n  {\n    switch ( value )\n    {\n      case FenceCreateFlagBits::eSignaled: return \"Signaled\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SemaphoreCreateFlagBits )\n  {\n    return \"(void)\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( EventCreateFlagBits value )\n  {\n    switch ( value )\n    {\n      case EventCreateFlagBits::eDeviceOnly: return \"DeviceOnly\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( QueryPipelineStatisticFlagBits value )\n  {\n    switch ( value )\n    {\n      case QueryPipelineStatisticFlagBits::eInputAssemblyVertices: return \"InputAssemblyVertices\";\n      case QueryPipelineStatisticFlagBits::eInputAssemblyPrimitives: return \"InputAssemblyPrimitives\";\n      case QueryPipelineStatisticFlagBits::eVertexShaderInvocations: return \"VertexShaderInvocations\";\n      case QueryPipelineStatisticFlagBits::eGeometryShaderInvocations: return \"GeometryShaderInvocations\";\n      case QueryPipelineStatisticFlagBits::eGeometryShaderPrimitives: return \"GeometryShaderPrimitives\";\n      case QueryPipelineStatisticFlagBits::eClippingInvocations: return \"ClippingInvocations\";\n      case QueryPipelineStatisticFlagBits::eClippingPrimitives: return \"ClippingPrimitives\";\n      case QueryPipelineStatisticFlagBits::eFragmentShaderInvocations: return \"FragmentShaderInvocations\";\n      case QueryPipelineStatisticFlagBits::eTessellationControlShaderPatches: return \"TessellationControlShaderPatches\";\n      case QueryPipelineStatisticFlagBits::eTessellationEvaluationShaderInvocations: return \"TessellationEvaluationShaderInvocations\";\n      case QueryPipelineStatisticFlagBits::eComputeShaderInvocations: return \"ComputeShaderInvocations\";\n      case QueryPipelineStatisticFlagBits::eTaskShaderInvocationsEXT: return \"TaskShaderInvocationsEXT\";\n      case QueryPipelineStatisticFlagBits::eMeshShaderInvocationsEXT: return \"MeshShaderInvocationsEXT\";\n      case QueryPipelineStatisticFlagBits::eClusterCullingShaderInvocationsHUAWEI: return \"ClusterCullingShaderInvocationsHUAWEI\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( QueryResultFlagBits value )\n  {\n    switch ( value )\n    {\n      case QueryResultFlagBits::e64: return \"64\";\n      case QueryResultFlagBits::eWait: return \"Wait\";\n      case QueryResultFlagBits::eWithAvailability: return \"WithAvailability\";\n      case QueryResultFlagBits::ePartial: return \"Partial\";\n      case QueryResultFlagBits::eWithStatusKHR: return \"WithStatusKHR\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( QueryType value )\n  {\n    switch ( value )\n    {\n      case QueryType::eOcclusion: return \"Occlusion\";\n      case QueryType::ePipelineStatistics: return \"PipelineStatistics\";\n      case QueryType::eTimestamp: return \"Timestamp\";\n      case QueryType::eResultStatusOnlyKHR: return \"ResultStatusOnlyKHR\";\n      case QueryType::eTransformFeedbackStreamEXT: return \"TransformFeedbackStreamEXT\";\n      case QueryType::ePerformanceQueryKHR: return \"PerformanceQueryKHR\";\n      case QueryType::eAccelerationStructureCompactedSizeKHR: return \"AccelerationStructureCompactedSizeKHR\";\n      case QueryType::eAccelerationStructureSerializationSizeKHR: return \"AccelerationStructureSerializationSizeKHR\";\n      case QueryType::eAccelerationStructureCompactedSizeNV: return \"AccelerationStructureCompactedSizeNV\";\n      case QueryType::ePerformanceQueryINTEL: return \"PerformanceQueryINTEL\";\n      case QueryType::eVideoEncodeFeedbackKHR: return \"VideoEncodeFeedbackKHR\";\n      case QueryType::eMeshPrimitivesGeneratedEXT: return \"MeshPrimitivesGeneratedEXT\";\n      case QueryType::ePrimitivesGeneratedEXT: return \"PrimitivesGeneratedEXT\";\n      case QueryType::eAccelerationStructureSerializationBottomLevelPointersKHR: return \"AccelerationStructureSerializationBottomLevelPointersKHR\";\n      case QueryType::eAccelerationStructureSizeKHR: return \"AccelerationStructureSizeKHR\";\n      case QueryType::eMicromapSerializationSizeEXT: return \"MicromapSerializationSizeEXT\";\n      case QueryType::eMicromapCompactedSizeEXT: return \"MicromapCompactedSizeEXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( QueryPoolCreateFlagBits )\n  {\n    return \"(void)\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( BufferCreateFlagBits value )\n  {\n    switch ( value )\n    {\n      case BufferCreateFlagBits::eSparseBinding: return \"SparseBinding\";\n      case BufferCreateFlagBits::eSparseResidency: return \"SparseResidency\";\n      case BufferCreateFlagBits::eSparseAliased: return \"SparseAliased\";\n      case BufferCreateFlagBits::eProtected: return \"Protected\";\n      case BufferCreateFlagBits::eDeviceAddressCaptureReplay: return \"DeviceAddressCaptureReplay\";\n      case BufferCreateFlagBits::eDescriptorBufferCaptureReplayEXT: return \"DescriptorBufferCaptureReplayEXT\";\n      case BufferCreateFlagBits::eVideoProfileIndependentKHR: return \"VideoProfileIndependentKHR\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( BufferUsageFlagBits value )\n  {\n    switch ( value )\n    {\n      case BufferUsageFlagBits::eTransferSrc: return \"TransferSrc\";\n      case BufferUsageFlagBits::eTransferDst: return \"TransferDst\";\n      case BufferUsageFlagBits::eUniformTexelBuffer: return \"UniformTexelBuffer\";\n      case BufferUsageFlagBits::eStorageTexelBuffer: return \"StorageTexelBuffer\";\n      case BufferUsageFlagBits::eUniformBuffer: return \"UniformBuffer\";\n      case BufferUsageFlagBits::eStorageBuffer: return \"StorageBuffer\";\n      case BufferUsageFlagBits::eIndexBuffer: return \"IndexBuffer\";\n      case BufferUsageFlagBits::eVertexBuffer: return \"VertexBuffer\";\n      case BufferUsageFlagBits::eIndirectBuffer: return \"IndirectBuffer\";\n      case BufferUsageFlagBits::eShaderDeviceAddress: return \"ShaderDeviceAddress\";\n      case BufferUsageFlagBits::eVideoDecodeSrcKHR: return \"VideoDecodeSrcKHR\";\n      case BufferUsageFlagBits::eVideoDecodeDstKHR: return \"VideoDecodeDstKHR\";\n      case BufferUsageFlagBits::eTransformFeedbackBufferEXT: return \"TransformFeedbackBufferEXT\";\n      case BufferUsageFlagBits::eTransformFeedbackCounterBufferEXT: return \"TransformFeedbackCounterBufferEXT\";\n      case BufferUsageFlagBits::eConditionalRenderingEXT: return \"ConditionalRenderingEXT\";\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      case BufferUsageFlagBits::eExecutionGraphScratchAMDX: return \"ExecutionGraphScratchAMDX\";\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n      case BufferUsageFlagBits::eAccelerationStructureBuildInputReadOnlyKHR: return \"AccelerationStructureBuildInputReadOnlyKHR\";\n      case BufferUsageFlagBits::eAccelerationStructureStorageKHR: return \"AccelerationStructureStorageKHR\";\n      case BufferUsageFlagBits::eShaderBindingTableKHR: return \"ShaderBindingTableKHR\";\n      case BufferUsageFlagBits::eVideoEncodeDstKHR: return \"VideoEncodeDstKHR\";\n      case BufferUsageFlagBits::eVideoEncodeSrcKHR: return \"VideoEncodeSrcKHR\";\n      case BufferUsageFlagBits::eSamplerDescriptorBufferEXT: return \"SamplerDescriptorBufferEXT\";\n      case BufferUsageFlagBits::eResourceDescriptorBufferEXT: return \"ResourceDescriptorBufferEXT\";\n      case BufferUsageFlagBits::ePushDescriptorsDescriptorBufferEXT: return \"PushDescriptorsDescriptorBufferEXT\";\n      case BufferUsageFlagBits::eMicromapBuildInputReadOnlyEXT: return \"MicromapBuildInputReadOnlyEXT\";\n      case BufferUsageFlagBits::eMicromapStorageEXT: return \"MicromapStorageEXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SharingMode value )\n  {\n    switch ( value )\n    {\n      case SharingMode::eExclusive: return \"Exclusive\";\n      case SharingMode::eConcurrent: return \"Concurrent\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( BufferViewCreateFlagBits )\n  {\n    return \"(void)\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ImageLayout value )\n  {\n    switch ( value )\n    {\n      case ImageLayout::eUndefined: return \"Undefined\";\n      case ImageLayout::eGeneral: return \"General\";\n      case ImageLayout::eColorAttachmentOptimal: return \"ColorAttachmentOptimal\";\n      case ImageLayout::eDepthStencilAttachmentOptimal: return \"DepthStencilAttachmentOptimal\";\n      case ImageLayout::eDepthStencilReadOnlyOptimal: return \"DepthStencilReadOnlyOptimal\";\n      case ImageLayout::eShaderReadOnlyOptimal: return \"ShaderReadOnlyOptimal\";\n      case ImageLayout::eTransferSrcOptimal: return \"TransferSrcOptimal\";\n      case ImageLayout::eTransferDstOptimal: return \"TransferDstOptimal\";\n      case ImageLayout::ePreinitialized: return \"Preinitialized\";\n      case ImageLayout::eDepthReadOnlyStencilAttachmentOptimal: return \"DepthReadOnlyStencilAttachmentOptimal\";\n      case ImageLayout::eDepthAttachmentStencilReadOnlyOptimal: return \"DepthAttachmentStencilReadOnlyOptimal\";\n      case ImageLayout::eDepthAttachmentOptimal: return \"DepthAttachmentOptimal\";\n      case ImageLayout::eDepthReadOnlyOptimal: return \"DepthReadOnlyOptimal\";\n      case ImageLayout::eStencilAttachmentOptimal: return \"StencilAttachmentOptimal\";\n      case ImageLayout::eStencilReadOnlyOptimal: return \"StencilReadOnlyOptimal\";\n      case ImageLayout::eReadOnlyOptimal: return \"ReadOnlyOptimal\";\n      case ImageLayout::eAttachmentOptimal: return \"AttachmentOptimal\";\n      case ImageLayout::eRenderingLocalRead: return \"RenderingLocalRead\";\n      case ImageLayout::ePresentSrcKHR: return \"PresentSrcKHR\";\n      case ImageLayout::eVideoDecodeDstKHR: return \"VideoDecodeDstKHR\";\n      case ImageLayout::eVideoDecodeSrcKHR: return \"VideoDecodeSrcKHR\";\n      case ImageLayout::eVideoDecodeDpbKHR: return \"VideoDecodeDpbKHR\";\n      case ImageLayout::eSharedPresentKHR: return \"SharedPresentKHR\";\n      case ImageLayout::eFragmentDensityMapOptimalEXT: return \"FragmentDensityMapOptimalEXT\";\n      case ImageLayout::eFragmentShadingRateAttachmentOptimalKHR: return \"FragmentShadingRateAttachmentOptimalKHR\";\n      case ImageLayout::eVideoEncodeDstKHR: return \"VideoEncodeDstKHR\";\n      case ImageLayout::eVideoEncodeSrcKHR: return \"VideoEncodeSrcKHR\";\n      case ImageLayout::eVideoEncodeDpbKHR: return \"VideoEncodeDpbKHR\";\n      case ImageLayout::eAttachmentFeedbackLoopOptimalEXT: return \"AttachmentFeedbackLoopOptimalEXT\";\n      case ImageLayout::eVideoEncodeQuantizationMapKHR: return \"VideoEncodeQuantizationMapKHR\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ComponentSwizzle value )\n  {\n    switch ( value )\n    {\n      case ComponentSwizzle::eIdentity: return \"Identity\";\n      case ComponentSwizzle::eZero: return \"Zero\";\n      case ComponentSwizzle::eOne: return \"One\";\n      case ComponentSwizzle::eR: return \"R\";\n      case ComponentSwizzle::eG: return \"G\";\n      case ComponentSwizzle::eB: return \"B\";\n      case ComponentSwizzle::eA: return \"A\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ImageViewCreateFlagBits value )\n  {\n    switch ( value )\n    {\n      case ImageViewCreateFlagBits::eFragmentDensityMapDynamicEXT: return \"FragmentDensityMapDynamicEXT\";\n      case ImageViewCreateFlagBits::eDescriptorBufferCaptureReplayEXT: return \"DescriptorBufferCaptureReplayEXT\";\n      case ImageViewCreateFlagBits::eFragmentDensityMapDeferredEXT: return \"FragmentDensityMapDeferredEXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ImageViewType value )\n  {\n    switch ( value )\n    {\n      case ImageViewType::e1D: return \"1D\";\n      case ImageViewType::e2D: return \"2D\";\n      case ImageViewType::e3D: return \"3D\";\n      case ImageViewType::eCube: return \"Cube\";\n      case ImageViewType::e1DArray: return \"1DArray\";\n      case ImageViewType::e2DArray: return \"2DArray\";\n      case ImageViewType::eCubeArray: return \"CubeArray\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ShaderModuleCreateFlagBits )\n  {\n    return \"(void)\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineCacheCreateFlagBits value )\n  {\n    switch ( value )\n    {\n      case PipelineCacheCreateFlagBits::eExternallySynchronized: return \"ExternallySynchronized\";\n      case PipelineCacheCreateFlagBits::eInternallySynchronizedMergeKHR: return \"InternallySynchronizedMergeKHR\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( BlendFactor value )\n  {\n    switch ( value )\n    {\n      case BlendFactor::eZero: return \"Zero\";\n      case BlendFactor::eOne: return \"One\";\n      case BlendFactor::eSrcColor: return \"SrcColor\";\n      case BlendFactor::eOneMinusSrcColor: return \"OneMinusSrcColor\";\n      case BlendFactor::eDstColor: return \"DstColor\";\n      case BlendFactor::eOneMinusDstColor: return \"OneMinusDstColor\";\n      case BlendFactor::eSrcAlpha: return \"SrcAlpha\";\n      case BlendFactor::eOneMinusSrcAlpha: return \"OneMinusSrcAlpha\";\n      case BlendFactor::eDstAlpha: return \"DstAlpha\";\n      case BlendFactor::eOneMinusDstAlpha: return \"OneMinusDstAlpha\";\n      case BlendFactor::eConstantColor: return \"ConstantColor\";\n      case BlendFactor::eOneMinusConstantColor: return \"OneMinusConstantColor\";\n      case BlendFactor::eConstantAlpha: return \"ConstantAlpha\";\n      case BlendFactor::eOneMinusConstantAlpha: return \"OneMinusConstantAlpha\";\n      case BlendFactor::eSrcAlphaSaturate: return \"SrcAlphaSaturate\";\n      case BlendFactor::eSrc1Color: return \"Src1Color\";\n      case BlendFactor::eOneMinusSrc1Color: return \"OneMinusSrc1Color\";\n      case BlendFactor::eSrc1Alpha: return \"Src1Alpha\";\n      case BlendFactor::eOneMinusSrc1Alpha: return \"OneMinusSrc1Alpha\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( BlendOp value )\n  {\n    switch ( value )\n    {\n      case BlendOp::eAdd: return \"Add\";\n      case BlendOp::eSubtract: return \"Subtract\";\n      case BlendOp::eReverseSubtract: return \"ReverseSubtract\";\n      case BlendOp::eMin: return \"Min\";\n      case BlendOp::eMax: return \"Max\";\n      case BlendOp::eZeroEXT: return \"ZeroEXT\";\n      case BlendOp::eSrcEXT: return \"SrcEXT\";\n      case BlendOp::eDstEXT: return \"DstEXT\";\n      case BlendOp::eSrcOverEXT: return \"SrcOverEXT\";\n      case BlendOp::eDstOverEXT: return \"DstOverEXT\";\n      case BlendOp::eSrcInEXT: return \"SrcInEXT\";\n      case BlendOp::eDstInEXT: return \"DstInEXT\";\n      case BlendOp::eSrcOutEXT: return \"SrcOutEXT\";\n      case BlendOp::eDstOutEXT: return \"DstOutEXT\";\n      case BlendOp::eSrcAtopEXT: return \"SrcAtopEXT\";\n      case BlendOp::eDstAtopEXT: return \"DstAtopEXT\";\n      case BlendOp::eXorEXT: return \"XorEXT\";\n      case BlendOp::eMultiplyEXT: return \"MultiplyEXT\";\n      case BlendOp::eScreenEXT: return \"ScreenEXT\";\n      case BlendOp::eOverlayEXT: return \"OverlayEXT\";\n      case BlendOp::eDarkenEXT: return \"DarkenEXT\";\n      case BlendOp::eLightenEXT: return \"LightenEXT\";\n      case BlendOp::eColordodgeEXT: return \"ColordodgeEXT\";\n      case BlendOp::eColorburnEXT: return \"ColorburnEXT\";\n      case BlendOp::eHardlightEXT: return \"HardlightEXT\";\n      case BlendOp::eSoftlightEXT: return \"SoftlightEXT\";\n      case BlendOp::eDifferenceEXT: return \"DifferenceEXT\";\n      case BlendOp::eExclusionEXT: return \"ExclusionEXT\";\n      case BlendOp::eInvertEXT: return \"InvertEXT\";\n      case BlendOp::eInvertRgbEXT: return \"InvertRgbEXT\";\n      case BlendOp::eLineardodgeEXT: return \"LineardodgeEXT\";\n      case BlendOp::eLinearburnEXT: return \"LinearburnEXT\";\n      case BlendOp::eVividlightEXT: return \"VividlightEXT\";\n      case BlendOp::eLinearlightEXT: return \"LinearlightEXT\";\n      case BlendOp::ePinlightEXT: return \"PinlightEXT\";\n      case BlendOp::eHardmixEXT: return \"HardmixEXT\";\n      case BlendOp::eHslHueEXT: return \"HslHueEXT\";\n      case BlendOp::eHslSaturationEXT: return \"HslSaturationEXT\";\n      case BlendOp::eHslColorEXT: return \"HslColorEXT\";\n      case BlendOp::eHslLuminosityEXT: return \"HslLuminosityEXT\";\n      case BlendOp::ePlusEXT: return \"PlusEXT\";\n      case BlendOp::ePlusClampedEXT: return \"PlusClampedEXT\";\n      case BlendOp::ePlusClampedAlphaEXT: return \"PlusClampedAlphaEXT\";\n      case BlendOp::ePlusDarkerEXT: return \"PlusDarkerEXT\";\n      case BlendOp::eMinusEXT: return \"MinusEXT\";\n      case BlendOp::eMinusClampedEXT: return \"MinusClampedEXT\";\n      case BlendOp::eContrastEXT: return \"ContrastEXT\";\n      case BlendOp::eInvertOvgEXT: return \"InvertOvgEXT\";\n      case BlendOp::eRedEXT: return \"RedEXT\";\n      case BlendOp::eGreenEXT: return \"GreenEXT\";\n      case BlendOp::eBlueEXT: return \"BlueEXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ColorComponentFlagBits value )\n  {\n    switch ( value )\n    {\n      case ColorComponentFlagBits::eR: return \"R\";\n      case ColorComponentFlagBits::eG: return \"G\";\n      case ColorComponentFlagBits::eB: return \"B\";\n      case ColorComponentFlagBits::eA: return \"A\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( CompareOp value )\n  {\n    switch ( value )\n    {\n      case CompareOp::eNever: return \"Never\";\n      case CompareOp::eLess: return \"Less\";\n      case CompareOp::eEqual: return \"Equal\";\n      case CompareOp::eLessOrEqual: return \"LessOrEqual\";\n      case CompareOp::eGreater: return \"Greater\";\n      case CompareOp::eNotEqual: return \"NotEqual\";\n      case CompareOp::eGreaterOrEqual: return \"GreaterOrEqual\";\n      case CompareOp::eAlways: return \"Always\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( CullModeFlagBits value )\n  {\n    switch ( value )\n    {\n      case CullModeFlagBits::eNone: return \"None\";\n      case CullModeFlagBits::eFront: return \"Front\";\n      case CullModeFlagBits::eBack: return \"Back\";\n      case CullModeFlagBits::eFrontAndBack: return \"FrontAndBack\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DynamicState value )\n  {\n    switch ( value )\n    {\n      case DynamicState::eViewport: return \"Viewport\";\n      case DynamicState::eScissor: return \"Scissor\";\n      case DynamicState::eLineWidth: return \"LineWidth\";\n      case DynamicState::eDepthBias: return \"DepthBias\";\n      case DynamicState::eBlendConstants: return \"BlendConstants\";\n      case DynamicState::eDepthBounds: return \"DepthBounds\";\n      case DynamicState::eStencilCompareMask: return \"StencilCompareMask\";\n      case DynamicState::eStencilWriteMask: return \"StencilWriteMask\";\n      case DynamicState::eStencilReference: return \"StencilReference\";\n      case DynamicState::eCullMode: return \"CullMode\";\n      case DynamicState::eFrontFace: return \"FrontFace\";\n      case DynamicState::ePrimitiveTopology: return \"PrimitiveTopology\";\n      case DynamicState::eViewportWithCount: return \"ViewportWithCount\";\n      case DynamicState::eScissorWithCount: return \"ScissorWithCount\";\n      case DynamicState::eVertexInputBindingStride: return \"VertexInputBindingStride\";\n      case DynamicState::eDepthTestEnable: return \"DepthTestEnable\";\n      case DynamicState::eDepthWriteEnable: return \"DepthWriteEnable\";\n      case DynamicState::eDepthCompareOp: return \"DepthCompareOp\";\n      case DynamicState::eDepthBoundsTestEnable: return \"DepthBoundsTestEnable\";\n      case DynamicState::eStencilTestEnable: return \"StencilTestEnable\";\n      case DynamicState::eStencilOp: return \"StencilOp\";\n      case DynamicState::eRasterizerDiscardEnable: return \"RasterizerDiscardEnable\";\n      case DynamicState::eDepthBiasEnable: return \"DepthBiasEnable\";\n      case DynamicState::ePrimitiveRestartEnable: return \"PrimitiveRestartEnable\";\n      case DynamicState::eLineStipple: return \"LineStipple\";\n      case DynamicState::eViewportWScalingNV: return \"ViewportWScalingNV\";\n      case DynamicState::eDiscardRectangleEXT: return \"DiscardRectangleEXT\";\n      case DynamicState::eDiscardRectangleEnableEXT: return \"DiscardRectangleEnableEXT\";\n      case DynamicState::eDiscardRectangleModeEXT: return \"DiscardRectangleModeEXT\";\n      case DynamicState::eSampleLocationsEXT: return \"SampleLocationsEXT\";\n      case DynamicState::eRayTracingPipelineStackSizeKHR: return \"RayTracingPipelineStackSizeKHR\";\n      case DynamicState::eViewportShadingRatePaletteNV: return \"ViewportShadingRatePaletteNV\";\n      case DynamicState::eViewportCoarseSampleOrderNV: return \"ViewportCoarseSampleOrderNV\";\n      case DynamicState::eExclusiveScissorEnableNV: return \"ExclusiveScissorEnableNV\";\n      case DynamicState::eExclusiveScissorNV: return \"ExclusiveScissorNV\";\n      case DynamicState::eFragmentShadingRateKHR: return \"FragmentShadingRateKHR\";\n      case DynamicState::eVertexInputEXT: return \"VertexInputEXT\";\n      case DynamicState::ePatchControlPointsEXT: return \"PatchControlPointsEXT\";\n      case DynamicState::eLogicOpEXT: return \"LogicOpEXT\";\n      case DynamicState::eColorWriteEnableEXT: return \"ColorWriteEnableEXT\";\n      case DynamicState::eDepthClampEnableEXT: return \"DepthClampEnableEXT\";\n      case DynamicState::ePolygonModeEXT: return \"PolygonModeEXT\";\n      case DynamicState::eRasterizationSamplesEXT: return \"RasterizationSamplesEXT\";\n      case DynamicState::eSampleMaskEXT: return \"SampleMaskEXT\";\n      case DynamicState::eAlphaToCoverageEnableEXT: return \"AlphaToCoverageEnableEXT\";\n      case DynamicState::eAlphaToOneEnableEXT: return \"AlphaToOneEnableEXT\";\n      case DynamicState::eLogicOpEnableEXT: return \"LogicOpEnableEXT\";\n      case DynamicState::eColorBlendEnableEXT: return \"ColorBlendEnableEXT\";\n      case DynamicState::eColorBlendEquationEXT: return \"ColorBlendEquationEXT\";\n      case DynamicState::eColorWriteMaskEXT: return \"ColorWriteMaskEXT\";\n      case DynamicState::eTessellationDomainOriginEXT: return \"TessellationDomainOriginEXT\";\n      case DynamicState::eRasterizationStreamEXT: return \"RasterizationStreamEXT\";\n      case DynamicState::eConservativeRasterizationModeEXT: return \"ConservativeRasterizationModeEXT\";\n      case DynamicState::eExtraPrimitiveOverestimationSizeEXT: return \"ExtraPrimitiveOverestimationSizeEXT\";\n      case DynamicState::eDepthClipEnableEXT: return \"DepthClipEnableEXT\";\n      case DynamicState::eSampleLocationsEnableEXT: return \"SampleLocationsEnableEXT\";\n      case DynamicState::eColorBlendAdvancedEXT: return \"ColorBlendAdvancedEXT\";\n      case DynamicState::eProvokingVertexModeEXT: return \"ProvokingVertexModeEXT\";\n      case DynamicState::eLineRasterizationModeEXT: return \"LineRasterizationModeEXT\";\n      case DynamicState::eLineStippleEnableEXT: return \"LineStippleEnableEXT\";\n      case DynamicState::eDepthClipNegativeOneToOneEXT: return \"DepthClipNegativeOneToOneEXT\";\n      case DynamicState::eViewportWScalingEnableNV: return \"ViewportWScalingEnableNV\";\n      case DynamicState::eViewportSwizzleNV: return \"ViewportSwizzleNV\";\n      case DynamicState::eCoverageToColorEnableNV: return \"CoverageToColorEnableNV\";\n      case DynamicState::eCoverageToColorLocationNV: return \"CoverageToColorLocationNV\";\n      case DynamicState::eCoverageModulationModeNV: return \"CoverageModulationModeNV\";\n      case DynamicState::eCoverageModulationTableEnableNV: return \"CoverageModulationTableEnableNV\";\n      case DynamicState::eCoverageModulationTableNV: return \"CoverageModulationTableNV\";\n      case DynamicState::eShadingRateImageEnableNV: return \"ShadingRateImageEnableNV\";\n      case DynamicState::eRepresentativeFragmentTestEnableNV: return \"RepresentativeFragmentTestEnableNV\";\n      case DynamicState::eCoverageReductionModeNV: return \"CoverageReductionModeNV\";\n      case DynamicState::eAttachmentFeedbackLoopEnableEXT: return \"AttachmentFeedbackLoopEnableEXT\";\n      case DynamicState::eDepthClampRangeEXT: return \"DepthClampRangeEXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( FrontFace value )\n  {\n    switch ( value )\n    {\n      case FrontFace::eCounterClockwise: return \"CounterClockwise\";\n      case FrontFace::eClockwise: return \"Clockwise\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( LogicOp value )\n  {\n    switch ( value )\n    {\n      case LogicOp::eClear: return \"Clear\";\n      case LogicOp::eAnd: return \"And\";\n      case LogicOp::eAndReverse: return \"AndReverse\";\n      case LogicOp::eCopy: return \"Copy\";\n      case LogicOp::eAndInverted: return \"AndInverted\";\n      case LogicOp::eNoOp: return \"NoOp\";\n      case LogicOp::eXor: return \"Xor\";\n      case LogicOp::eOr: return \"Or\";\n      case LogicOp::eNor: return \"Nor\";\n      case LogicOp::eEquivalent: return \"Equivalent\";\n      case LogicOp::eInvert: return \"Invert\";\n      case LogicOp::eOrReverse: return \"OrReverse\";\n      case LogicOp::eCopyInverted: return \"CopyInverted\";\n      case LogicOp::eOrInverted: return \"OrInverted\";\n      case LogicOp::eNand: return \"Nand\";\n      case LogicOp::eSet: return \"Set\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineCreateFlagBits value )\n  {\n    switch ( value )\n    {\n      case PipelineCreateFlagBits::eDisableOptimization: return \"DisableOptimization\";\n      case PipelineCreateFlagBits::eAllowDerivatives: return \"AllowDerivatives\";\n      case PipelineCreateFlagBits::eDerivative: return \"Derivative\";\n      case PipelineCreateFlagBits::eViewIndexFromDeviceIndex: return \"ViewIndexFromDeviceIndex\";\n      case PipelineCreateFlagBits::eDispatchBase: return \"DispatchBase\";\n      case PipelineCreateFlagBits::eFailOnPipelineCompileRequired: return \"FailOnPipelineCompileRequired\";\n      case PipelineCreateFlagBits::eEarlyReturnOnFailure: return \"EarlyReturnOnFailure\";\n      case PipelineCreateFlagBits::eNoProtectedAccess: return \"NoProtectedAccess\";\n      case PipelineCreateFlagBits::eProtectedAccessOnly: return \"ProtectedAccessOnly\";\n      case PipelineCreateFlagBits::eRayTracingNoNullAnyHitShadersKHR: return \"RayTracingNoNullAnyHitShadersKHR\";\n      case PipelineCreateFlagBits::eRayTracingNoNullClosestHitShadersKHR: return \"RayTracingNoNullClosestHitShadersKHR\";\n      case PipelineCreateFlagBits::eRayTracingNoNullMissShadersKHR: return \"RayTracingNoNullMissShadersKHR\";\n      case PipelineCreateFlagBits::eRayTracingNoNullIntersectionShadersKHR: return \"RayTracingNoNullIntersectionShadersKHR\";\n      case PipelineCreateFlagBits::eRayTracingSkipTrianglesKHR: return \"RayTracingSkipTrianglesKHR\";\n      case PipelineCreateFlagBits::eRayTracingSkipAabbsKHR: return \"RayTracingSkipAabbsKHR\";\n      case PipelineCreateFlagBits::eRayTracingShaderGroupHandleCaptureReplayKHR: return \"RayTracingShaderGroupHandleCaptureReplayKHR\";\n      case PipelineCreateFlagBits::eDeferCompileNV: return \"DeferCompileNV\";\n      case PipelineCreateFlagBits::eRenderingFragmentDensityMapAttachmentEXT: return \"RenderingFragmentDensityMapAttachmentEXT\";\n      case PipelineCreateFlagBits::eRenderingFragmentShadingRateAttachmentKHR: return \"RenderingFragmentShadingRateAttachmentKHR\";\n      case PipelineCreateFlagBits::eCaptureStatisticsKHR: return \"CaptureStatisticsKHR\";\n      case PipelineCreateFlagBits::eCaptureInternalRepresentationsKHR: return \"CaptureInternalRepresentationsKHR\";\n      case PipelineCreateFlagBits::eIndirectBindableNV: return \"IndirectBindableNV\";\n      case PipelineCreateFlagBits::eLibraryKHR: return \"LibraryKHR\";\n      case PipelineCreateFlagBits::eDescriptorBufferEXT: return \"DescriptorBufferEXT\";\n      case PipelineCreateFlagBits::eRetainLinkTimeOptimizationInfoEXT: return \"RetainLinkTimeOptimizationInfoEXT\";\n      case PipelineCreateFlagBits::eLinkTimeOptimizationEXT: return \"LinkTimeOptimizationEXT\";\n      case PipelineCreateFlagBits::eRayTracingAllowMotionNV: return \"RayTracingAllowMotionNV\";\n      case PipelineCreateFlagBits::eColorAttachmentFeedbackLoopEXT: return \"ColorAttachmentFeedbackLoopEXT\";\n      case PipelineCreateFlagBits::eDepthStencilAttachmentFeedbackLoopEXT: return \"DepthStencilAttachmentFeedbackLoopEXT\";\n      case PipelineCreateFlagBits::eRayTracingOpacityMicromapEXT: return \"RayTracingOpacityMicromapEXT\";\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      case PipelineCreateFlagBits::eRayTracingDisplacementMicromapNV: return \"RayTracingDisplacementMicromapNV\";\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineShaderStageCreateFlagBits value )\n  {\n    switch ( value )\n    {\n      case PipelineShaderStageCreateFlagBits::eAllowVaryingSubgroupSize: return \"AllowVaryingSubgroupSize\";\n      case PipelineShaderStageCreateFlagBits::eRequireFullSubgroups: return \"RequireFullSubgroups\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PolygonMode value )\n  {\n    switch ( value )\n    {\n      case PolygonMode::eFill: return \"Fill\";\n      case PolygonMode::eLine: return \"Line\";\n      case PolygonMode::ePoint: return \"Point\";\n      case PolygonMode::eFillRectangleNV: return \"FillRectangleNV\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PrimitiveTopology value )\n  {\n    switch ( value )\n    {\n      case PrimitiveTopology::ePointList: return \"PointList\";\n      case PrimitiveTopology::eLineList: return \"LineList\";\n      case PrimitiveTopology::eLineStrip: return \"LineStrip\";\n      case PrimitiveTopology::eTriangleList: return \"TriangleList\";\n      case PrimitiveTopology::eTriangleStrip: return \"TriangleStrip\";\n      case PrimitiveTopology::eTriangleFan: return \"TriangleFan\";\n      case PrimitiveTopology::eLineListWithAdjacency: return \"LineListWithAdjacency\";\n      case PrimitiveTopology::eLineStripWithAdjacency: return \"LineStripWithAdjacency\";\n      case PrimitiveTopology::eTriangleListWithAdjacency: return \"TriangleListWithAdjacency\";\n      case PrimitiveTopology::eTriangleStripWithAdjacency: return \"TriangleStripWithAdjacency\";\n      case PrimitiveTopology::ePatchList: return \"PatchList\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ShaderStageFlagBits value )\n  {\n    switch ( value )\n    {\n      case ShaderStageFlagBits::eVertex: return \"Vertex\";\n      case ShaderStageFlagBits::eTessellationControl: return \"TessellationControl\";\n      case ShaderStageFlagBits::eTessellationEvaluation: return \"TessellationEvaluation\";\n      case ShaderStageFlagBits::eGeometry: return \"Geometry\";\n      case ShaderStageFlagBits::eFragment: return \"Fragment\";\n      case ShaderStageFlagBits::eCompute: return \"Compute\";\n      case ShaderStageFlagBits::eAllGraphics: return \"AllGraphics\";\n      case ShaderStageFlagBits::eAll: return \"All\";\n      case ShaderStageFlagBits::eRaygenKHR: return \"RaygenKHR\";\n      case ShaderStageFlagBits::eAnyHitKHR: return \"AnyHitKHR\";\n      case ShaderStageFlagBits::eClosestHitKHR: return \"ClosestHitKHR\";\n      case ShaderStageFlagBits::eMissKHR: return \"MissKHR\";\n      case ShaderStageFlagBits::eIntersectionKHR: return \"IntersectionKHR\";\n      case ShaderStageFlagBits::eCallableKHR: return \"CallableKHR\";\n      case ShaderStageFlagBits::eTaskEXT: return \"TaskEXT\";\n      case ShaderStageFlagBits::eMeshEXT: return \"MeshEXT\";\n      case ShaderStageFlagBits::eSubpassShadingHUAWEI: return \"SubpassShadingHUAWEI\";\n      case ShaderStageFlagBits::eClusterCullingHUAWEI: return \"ClusterCullingHUAWEI\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( StencilOp value )\n  {\n    switch ( value )\n    {\n      case StencilOp::eKeep: return \"Keep\";\n      case StencilOp::eZero: return \"Zero\";\n      case StencilOp::eReplace: return \"Replace\";\n      case StencilOp::eIncrementAndClamp: return \"IncrementAndClamp\";\n      case StencilOp::eDecrementAndClamp: return \"DecrementAndClamp\";\n      case StencilOp::eInvert: return \"Invert\";\n      case StencilOp::eIncrementAndWrap: return \"IncrementAndWrap\";\n      case StencilOp::eDecrementAndWrap: return \"DecrementAndWrap\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VertexInputRate value )\n  {\n    switch ( value )\n    {\n      case VertexInputRate::eVertex: return \"Vertex\";\n      case VertexInputRate::eInstance: return \"Instance\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineColorBlendStateCreateFlagBits value )\n  {\n    switch ( value )\n    {\n      case PipelineColorBlendStateCreateFlagBits::eRasterizationOrderAttachmentAccessEXT: return \"RasterizationOrderAttachmentAccessEXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineDepthStencilStateCreateFlagBits value )\n  {\n    switch ( value )\n    {\n      case PipelineDepthStencilStateCreateFlagBits::eRasterizationOrderAttachmentDepthAccessEXT: return \"RasterizationOrderAttachmentDepthAccessEXT\";\n      case PipelineDepthStencilStateCreateFlagBits::eRasterizationOrderAttachmentStencilAccessEXT: return \"RasterizationOrderAttachmentStencilAccessEXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineDynamicStateCreateFlagBits )\n  {\n    return \"(void)\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineInputAssemblyStateCreateFlagBits )\n  {\n    return \"(void)\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineLayoutCreateFlagBits value )\n  {\n    switch ( value )\n    {\n      case PipelineLayoutCreateFlagBits::eIndependentSetsEXT: return \"IndependentSetsEXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineMultisampleStateCreateFlagBits )\n  {\n    return \"(void)\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineRasterizationStateCreateFlagBits )\n  {\n    return \"(void)\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineTessellationStateCreateFlagBits )\n  {\n    return \"(void)\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineVertexInputStateCreateFlagBits )\n  {\n    return \"(void)\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineViewportStateCreateFlagBits )\n  {\n    return \"(void)\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( BorderColor value )\n  {\n    switch ( value )\n    {\n      case BorderColor::eFloatTransparentBlack: return \"FloatTransparentBlack\";\n      case BorderColor::eIntTransparentBlack: return \"IntTransparentBlack\";\n      case BorderColor::eFloatOpaqueBlack: return \"FloatOpaqueBlack\";\n      case BorderColor::eIntOpaqueBlack: return \"IntOpaqueBlack\";\n      case BorderColor::eFloatOpaqueWhite: return \"FloatOpaqueWhite\";\n      case BorderColor::eIntOpaqueWhite: return \"IntOpaqueWhite\";\n      case BorderColor::eFloatCustomEXT: return \"FloatCustomEXT\";\n      case BorderColor::eIntCustomEXT: return \"IntCustomEXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( Filter value )\n  {\n    switch ( value )\n    {\n      case Filter::eNearest: return \"Nearest\";\n      case Filter::eLinear: return \"Linear\";\n      case Filter::eCubicEXT: return \"CubicEXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SamplerAddressMode value )\n  {\n    switch ( value )\n    {\n      case SamplerAddressMode::eRepeat: return \"Repeat\";\n      case SamplerAddressMode::eMirroredRepeat: return \"MirroredRepeat\";\n      case SamplerAddressMode::eClampToEdge: return \"ClampToEdge\";\n      case SamplerAddressMode::eClampToBorder: return \"ClampToBorder\";\n      case SamplerAddressMode::eMirrorClampToEdge: return \"MirrorClampToEdge\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SamplerCreateFlagBits value )\n  {\n    switch ( value )\n    {\n      case SamplerCreateFlagBits::eSubsampledEXT: return \"SubsampledEXT\";\n      case SamplerCreateFlagBits::eSubsampledCoarseReconstructionEXT: return \"SubsampledCoarseReconstructionEXT\";\n      case SamplerCreateFlagBits::eDescriptorBufferCaptureReplayEXT: return \"DescriptorBufferCaptureReplayEXT\";\n      case SamplerCreateFlagBits::eNonSeamlessCubeMapEXT: return \"NonSeamlessCubeMapEXT\";\n      case SamplerCreateFlagBits::eImageProcessingQCOM: return \"ImageProcessingQCOM\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SamplerMipmapMode value )\n  {\n    switch ( value )\n    {\n      case SamplerMipmapMode::eNearest: return \"Nearest\";\n      case SamplerMipmapMode::eLinear: return \"Linear\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DescriptorPoolCreateFlagBits value )\n  {\n    switch ( value )\n    {\n      case DescriptorPoolCreateFlagBits::eFreeDescriptorSet: return \"FreeDescriptorSet\";\n      case DescriptorPoolCreateFlagBits::eUpdateAfterBind: return \"UpdateAfterBind\";\n      case DescriptorPoolCreateFlagBits::eHostOnlyEXT: return \"HostOnlyEXT\";\n      case DescriptorPoolCreateFlagBits::eAllowOverallocationSetsNV: return \"AllowOverallocationSetsNV\";\n      case DescriptorPoolCreateFlagBits::eAllowOverallocationPoolsNV: return \"AllowOverallocationPoolsNV\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DescriptorSetLayoutCreateFlagBits value )\n  {\n    switch ( value )\n    {\n      case DescriptorSetLayoutCreateFlagBits::eUpdateAfterBindPool: return \"UpdateAfterBindPool\";\n      case DescriptorSetLayoutCreateFlagBits::ePushDescriptor: return \"PushDescriptor\";\n      case DescriptorSetLayoutCreateFlagBits::eDescriptorBufferEXT: return \"DescriptorBufferEXT\";\n      case DescriptorSetLayoutCreateFlagBits::eEmbeddedImmutableSamplersEXT: return \"EmbeddedImmutableSamplersEXT\";\n      case DescriptorSetLayoutCreateFlagBits::eIndirectBindableNV: return \"IndirectBindableNV\";\n      case DescriptorSetLayoutCreateFlagBits::eHostOnlyPoolEXT: return \"HostOnlyPoolEXT\";\n      case DescriptorSetLayoutCreateFlagBits::ePerStageNV: return \"PerStageNV\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DescriptorType value )\n  {\n    switch ( value )\n    {\n      case DescriptorType::eSampler: return \"Sampler\";\n      case DescriptorType::eCombinedImageSampler: return \"CombinedImageSampler\";\n      case DescriptorType::eSampledImage: return \"SampledImage\";\n      case DescriptorType::eStorageImage: return \"StorageImage\";\n      case DescriptorType::eUniformTexelBuffer: return \"UniformTexelBuffer\";\n      case DescriptorType::eStorageTexelBuffer: return \"StorageTexelBuffer\";\n      case DescriptorType::eUniformBuffer: return \"UniformBuffer\";\n      case DescriptorType::eStorageBuffer: return \"StorageBuffer\";\n      case DescriptorType::eUniformBufferDynamic: return \"UniformBufferDynamic\";\n      case DescriptorType::eStorageBufferDynamic: return \"StorageBufferDynamic\";\n      case DescriptorType::eInputAttachment: return \"InputAttachment\";\n      case DescriptorType::eInlineUniformBlock: return \"InlineUniformBlock\";\n      case DescriptorType::eAccelerationStructureKHR: return \"AccelerationStructureKHR\";\n      case DescriptorType::eAccelerationStructureNV: return \"AccelerationStructureNV\";\n      case DescriptorType::eSampleWeightImageQCOM: return \"SampleWeightImageQCOM\";\n      case DescriptorType::eBlockMatchImageQCOM: return \"BlockMatchImageQCOM\";\n      case DescriptorType::eMutableEXT: return \"MutableEXT\";\n      case DescriptorType::ePartitionedAccelerationStructureNV: return \"PartitionedAccelerationStructureNV\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DescriptorPoolResetFlagBits )\n  {\n    return \"(void)\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( AccessFlagBits value )\n  {\n    switch ( value )\n    {\n      case AccessFlagBits::eIndirectCommandRead: return \"IndirectCommandRead\";\n      case AccessFlagBits::eIndexRead: return \"IndexRead\";\n      case AccessFlagBits::eVertexAttributeRead: return \"VertexAttributeRead\";\n      case AccessFlagBits::eUniformRead: return \"UniformRead\";\n      case AccessFlagBits::eInputAttachmentRead: return \"InputAttachmentRead\";\n      case AccessFlagBits::eShaderRead: return \"ShaderRead\";\n      case AccessFlagBits::eShaderWrite: return \"ShaderWrite\";\n      case AccessFlagBits::eColorAttachmentRead: return \"ColorAttachmentRead\";\n      case AccessFlagBits::eColorAttachmentWrite: return \"ColorAttachmentWrite\";\n      case AccessFlagBits::eDepthStencilAttachmentRead: return \"DepthStencilAttachmentRead\";\n      case AccessFlagBits::eDepthStencilAttachmentWrite: return \"DepthStencilAttachmentWrite\";\n      case AccessFlagBits::eTransferRead: return \"TransferRead\";\n      case AccessFlagBits::eTransferWrite: return \"TransferWrite\";\n      case AccessFlagBits::eHostRead: return \"HostRead\";\n      case AccessFlagBits::eHostWrite: return \"HostWrite\";\n      case AccessFlagBits::eMemoryRead: return \"MemoryRead\";\n      case AccessFlagBits::eMemoryWrite: return \"MemoryWrite\";\n      case AccessFlagBits::eNone: return \"None\";\n      case AccessFlagBits::eTransformFeedbackWriteEXT: return \"TransformFeedbackWriteEXT\";\n      case AccessFlagBits::eTransformFeedbackCounterReadEXT: return \"TransformFeedbackCounterReadEXT\";\n      case AccessFlagBits::eTransformFeedbackCounterWriteEXT: return \"TransformFeedbackCounterWriteEXT\";\n      case AccessFlagBits::eConditionalRenderingReadEXT: return \"ConditionalRenderingReadEXT\";\n      case AccessFlagBits::eColorAttachmentReadNoncoherentEXT: return \"ColorAttachmentReadNoncoherentEXT\";\n      case AccessFlagBits::eAccelerationStructureReadKHR: return \"AccelerationStructureReadKHR\";\n      case AccessFlagBits::eAccelerationStructureWriteKHR: return \"AccelerationStructureWriteKHR\";\n      case AccessFlagBits::eFragmentDensityMapReadEXT: return \"FragmentDensityMapReadEXT\";\n      case AccessFlagBits::eFragmentShadingRateAttachmentReadKHR: return \"FragmentShadingRateAttachmentReadKHR\";\n      case AccessFlagBits::eCommandPreprocessReadNV: return \"CommandPreprocessReadNV\";\n      case AccessFlagBits::eCommandPreprocessWriteNV: return \"CommandPreprocessWriteNV\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( AttachmentDescriptionFlagBits value )\n  {\n    switch ( value )\n    {\n      case AttachmentDescriptionFlagBits::eMayAlias: return \"MayAlias\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( AttachmentLoadOp value )\n  {\n    switch ( value )\n    {\n      case AttachmentLoadOp::eLoad: return \"Load\";\n      case AttachmentLoadOp::eClear: return \"Clear\";\n      case AttachmentLoadOp::eDontCare: return \"DontCare\";\n      case AttachmentLoadOp::eNone: return \"None\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( AttachmentStoreOp value )\n  {\n    switch ( value )\n    {\n      case AttachmentStoreOp::eStore: return \"Store\";\n      case AttachmentStoreOp::eDontCare: return \"DontCare\";\n      case AttachmentStoreOp::eNone: return \"None\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DependencyFlagBits value )\n  {\n    switch ( value )\n    {\n      case DependencyFlagBits::eByRegion: return \"ByRegion\";\n      case DependencyFlagBits::eDeviceGroup: return \"DeviceGroup\";\n      case DependencyFlagBits::eViewLocal: return \"ViewLocal\";\n      case DependencyFlagBits::eFeedbackLoopEXT: return \"FeedbackLoopEXT\";\n      case DependencyFlagBits::eQueueFamilyOwnershipTransferUseAllStagesKHR: return \"QueueFamilyOwnershipTransferUseAllStagesKHR\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( FramebufferCreateFlagBits value )\n  {\n    switch ( value )\n    {\n      case FramebufferCreateFlagBits::eImageless: return \"Imageless\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineBindPoint value )\n  {\n    switch ( value )\n    {\n      case PipelineBindPoint::eGraphics: return \"Graphics\";\n      case PipelineBindPoint::eCompute: return \"Compute\";\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      case PipelineBindPoint::eExecutionGraphAMDX: return \"ExecutionGraphAMDX\";\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n      case PipelineBindPoint::eRayTracingKHR: return \"RayTracingKHR\";\n      case PipelineBindPoint::eSubpassShadingHUAWEI: return \"SubpassShadingHUAWEI\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( RenderPassCreateFlagBits value )\n  {\n    switch ( value )\n    {\n      case RenderPassCreateFlagBits::eTransformQCOM: return \"TransformQCOM\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SubpassDescriptionFlagBits value )\n  {\n    switch ( value )\n    {\n      case SubpassDescriptionFlagBits::ePerViewAttributesNVX: return \"PerViewAttributesNVX\";\n      case SubpassDescriptionFlagBits::ePerViewPositionXOnlyNVX: return \"PerViewPositionXOnlyNVX\";\n      case SubpassDescriptionFlagBits::eFragmentRegionQCOM: return \"FragmentRegionQCOM\";\n      case SubpassDescriptionFlagBits::eShaderResolveQCOM: return \"ShaderResolveQCOM\";\n      case SubpassDescriptionFlagBits::eRasterizationOrderAttachmentColorAccessEXT: return \"RasterizationOrderAttachmentColorAccessEXT\";\n      case SubpassDescriptionFlagBits::eRasterizationOrderAttachmentDepthAccessEXT: return \"RasterizationOrderAttachmentDepthAccessEXT\";\n      case SubpassDescriptionFlagBits::eRasterizationOrderAttachmentStencilAccessEXT: return \"RasterizationOrderAttachmentStencilAccessEXT\";\n      case SubpassDescriptionFlagBits::eEnableLegacyDitheringEXT: return \"EnableLegacyDitheringEXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( CommandPoolCreateFlagBits value )\n  {\n    switch ( value )\n    {\n      case CommandPoolCreateFlagBits::eTransient: return \"Transient\";\n      case CommandPoolCreateFlagBits::eResetCommandBuffer: return \"ResetCommandBuffer\";\n      case CommandPoolCreateFlagBits::eProtected: return \"Protected\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( CommandPoolResetFlagBits value )\n  {\n    switch ( value )\n    {\n      case CommandPoolResetFlagBits::eReleaseResources: return \"ReleaseResources\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( CommandBufferLevel value )\n  {\n    switch ( value )\n    {\n      case CommandBufferLevel::ePrimary: return \"Primary\";\n      case CommandBufferLevel::eSecondary: return \"Secondary\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( CommandBufferResetFlagBits value )\n  {\n    switch ( value )\n    {\n      case CommandBufferResetFlagBits::eReleaseResources: return \"ReleaseResources\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( CommandBufferUsageFlagBits value )\n  {\n    switch ( value )\n    {\n      case CommandBufferUsageFlagBits::eOneTimeSubmit: return \"OneTimeSubmit\";\n      case CommandBufferUsageFlagBits::eRenderPassContinue: return \"RenderPassContinue\";\n      case CommandBufferUsageFlagBits::eSimultaneousUse: return \"SimultaneousUse\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( QueryControlFlagBits value )\n  {\n    switch ( value )\n    {\n      case QueryControlFlagBits::ePrecise: return \"Precise\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( IndexType value )\n  {\n    switch ( value )\n    {\n      case IndexType::eUint16: return \"Uint16\";\n      case IndexType::eUint32: return \"Uint32\";\n      case IndexType::eUint8: return \"Uint8\";\n      case IndexType::eNoneKHR: return \"NoneKHR\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( StencilFaceFlagBits value )\n  {\n    switch ( value )\n    {\n      case StencilFaceFlagBits::eFront: return \"Front\";\n      case StencilFaceFlagBits::eBack: return \"Back\";\n      case StencilFaceFlagBits::eFrontAndBack: return \"FrontAndBack\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SubpassContents value )\n  {\n    switch ( value )\n    {\n      case SubpassContents::eInline: return \"Inline\";\n      case SubpassContents::eSecondaryCommandBuffers: return \"SecondaryCommandBuffers\";\n      case SubpassContents::eInlineAndSecondaryCommandBuffersKHR: return \"InlineAndSecondaryCommandBuffersKHR\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_VERSION_1_1 ===\n\n  VULKAN_HPP_INLINE std::string to_string( SubgroupFeatureFlagBits value )\n  {\n    switch ( value )\n    {\n      case SubgroupFeatureFlagBits::eBasic: return \"Basic\";\n      case SubgroupFeatureFlagBits::eVote: return \"Vote\";\n      case SubgroupFeatureFlagBits::eArithmetic: return \"Arithmetic\";\n      case SubgroupFeatureFlagBits::eBallot: return \"Ballot\";\n      case SubgroupFeatureFlagBits::eShuffle: return \"Shuffle\";\n      case SubgroupFeatureFlagBits::eShuffleRelative: return \"ShuffleRelative\";\n      case SubgroupFeatureFlagBits::eClustered: return \"Clustered\";\n      case SubgroupFeatureFlagBits::eQuad: return \"Quad\";\n      case SubgroupFeatureFlagBits::eRotate: return \"Rotate\";\n      case SubgroupFeatureFlagBits::eRotateClustered: return \"RotateClustered\";\n      case SubgroupFeatureFlagBits::ePartitionedNV: return \"PartitionedNV\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PeerMemoryFeatureFlagBits value )\n  {\n    switch ( value )\n    {\n      case PeerMemoryFeatureFlagBits::eCopySrc: return \"CopySrc\";\n      case PeerMemoryFeatureFlagBits::eCopyDst: return \"CopyDst\";\n      case PeerMemoryFeatureFlagBits::eGenericSrc: return \"GenericSrc\";\n      case PeerMemoryFeatureFlagBits::eGenericDst: return \"GenericDst\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( MemoryAllocateFlagBits value )\n  {\n    switch ( value )\n    {\n      case MemoryAllocateFlagBits::eDeviceMask: return \"DeviceMask\";\n      case MemoryAllocateFlagBits::eDeviceAddress: return \"DeviceAddress\";\n      case MemoryAllocateFlagBits::eDeviceAddressCaptureReplay: return \"DeviceAddressCaptureReplay\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( CommandPoolTrimFlagBits )\n  {\n    return \"(void)\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PointClippingBehavior value )\n  {\n    switch ( value )\n    {\n      case PointClippingBehavior::eAllClipPlanes: return \"AllClipPlanes\";\n      case PointClippingBehavior::eUserClipPlanesOnly: return \"UserClipPlanesOnly\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( TessellationDomainOrigin value )\n  {\n    switch ( value )\n    {\n      case TessellationDomainOrigin::eUpperLeft: return \"UpperLeft\";\n      case TessellationDomainOrigin::eLowerLeft: return \"LowerLeft\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SamplerYcbcrModelConversion value )\n  {\n    switch ( value )\n    {\n      case SamplerYcbcrModelConversion::eRgbIdentity: return \"RgbIdentity\";\n      case SamplerYcbcrModelConversion::eYcbcrIdentity: return \"YcbcrIdentity\";\n      case SamplerYcbcrModelConversion::eYcbcr709: return \"Ycbcr709\";\n      case SamplerYcbcrModelConversion::eYcbcr601: return \"Ycbcr601\";\n      case SamplerYcbcrModelConversion::eYcbcr2020: return \"Ycbcr2020\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SamplerYcbcrRange value )\n  {\n    switch ( value )\n    {\n      case SamplerYcbcrRange::eItuFull: return \"ItuFull\";\n      case SamplerYcbcrRange::eItuNarrow: return \"ItuNarrow\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ChromaLocation value )\n  {\n    switch ( value )\n    {\n      case ChromaLocation::eCositedEven: return \"CositedEven\";\n      case ChromaLocation::eMidpoint: return \"Midpoint\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DescriptorUpdateTemplateType value )\n  {\n    switch ( value )\n    {\n      case DescriptorUpdateTemplateType::eDescriptorSet: return \"DescriptorSet\";\n      case DescriptorUpdateTemplateType::ePushDescriptors: return \"PushDescriptors\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DescriptorUpdateTemplateCreateFlagBits )\n  {\n    return \"(void)\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ExternalMemoryHandleTypeFlagBits value )\n  {\n    switch ( value )\n    {\n      case ExternalMemoryHandleTypeFlagBits::eOpaqueFd: return \"OpaqueFd\";\n      case ExternalMemoryHandleTypeFlagBits::eOpaqueWin32: return \"OpaqueWin32\";\n      case ExternalMemoryHandleTypeFlagBits::eOpaqueWin32Kmt: return \"OpaqueWin32Kmt\";\n      case ExternalMemoryHandleTypeFlagBits::eD3D11Texture: return \"D3D11Texture\";\n      case ExternalMemoryHandleTypeFlagBits::eD3D11TextureKmt: return \"D3D11TextureKmt\";\n      case ExternalMemoryHandleTypeFlagBits::eD3D12Heap: return \"D3D12Heap\";\n      case ExternalMemoryHandleTypeFlagBits::eD3D12Resource: return \"D3D12Resource\";\n      case ExternalMemoryHandleTypeFlagBits::eDmaBufEXT: return \"DmaBufEXT\";\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n      case ExternalMemoryHandleTypeFlagBits::eAndroidHardwareBufferANDROID: return \"AndroidHardwareBufferANDROID\";\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n      case ExternalMemoryHandleTypeFlagBits::eHostAllocationEXT: return \"HostAllocationEXT\";\n      case ExternalMemoryHandleTypeFlagBits::eHostMappedForeignMemoryEXT: return \"HostMappedForeignMemoryEXT\";\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n      case ExternalMemoryHandleTypeFlagBits::eZirconVmoFUCHSIA: return \"ZirconVmoFUCHSIA\";\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n      case ExternalMemoryHandleTypeFlagBits::eRdmaAddressNV: return \"RdmaAddressNV\";\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n      case ExternalMemoryHandleTypeFlagBits::eScreenBufferQNX: return \"ScreenBufferQNX\";\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n      case ExternalMemoryHandleTypeFlagBits::eMtlbufferEXT: return \"MtlbufferEXT\";\n      case ExternalMemoryHandleTypeFlagBits::eMtltextureEXT: return \"MtltextureEXT\";\n      case ExternalMemoryHandleTypeFlagBits::eMtlheapEXT: return \"MtlheapEXT\";\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ExternalMemoryFeatureFlagBits value )\n  {\n    switch ( value )\n    {\n      case ExternalMemoryFeatureFlagBits::eDedicatedOnly: return \"DedicatedOnly\";\n      case ExternalMemoryFeatureFlagBits::eExportable: return \"Exportable\";\n      case ExternalMemoryFeatureFlagBits::eImportable: return \"Importable\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ExternalFenceHandleTypeFlagBits value )\n  {\n    switch ( value )\n    {\n      case ExternalFenceHandleTypeFlagBits::eOpaqueFd: return \"OpaqueFd\";\n      case ExternalFenceHandleTypeFlagBits::eOpaqueWin32: return \"OpaqueWin32\";\n      case ExternalFenceHandleTypeFlagBits::eOpaqueWin32Kmt: return \"OpaqueWin32Kmt\";\n      case ExternalFenceHandleTypeFlagBits::eSyncFd: return \"SyncFd\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ExternalFenceFeatureFlagBits value )\n  {\n    switch ( value )\n    {\n      case ExternalFenceFeatureFlagBits::eExportable: return \"Exportable\";\n      case ExternalFenceFeatureFlagBits::eImportable: return \"Importable\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( FenceImportFlagBits value )\n  {\n    switch ( value )\n    {\n      case FenceImportFlagBits::eTemporary: return \"Temporary\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SemaphoreImportFlagBits value )\n  {\n    switch ( value )\n    {\n      case SemaphoreImportFlagBits::eTemporary: return \"Temporary\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ExternalSemaphoreHandleTypeFlagBits value )\n  {\n    switch ( value )\n    {\n      case ExternalSemaphoreHandleTypeFlagBits::eOpaqueFd: return \"OpaqueFd\";\n      case ExternalSemaphoreHandleTypeFlagBits::eOpaqueWin32: return \"OpaqueWin32\";\n      case ExternalSemaphoreHandleTypeFlagBits::eOpaqueWin32Kmt: return \"OpaqueWin32Kmt\";\n      case ExternalSemaphoreHandleTypeFlagBits::eD3D12Fence: return \"D3D12Fence\";\n      case ExternalSemaphoreHandleTypeFlagBits::eSyncFd: return \"SyncFd\";\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n      case ExternalSemaphoreHandleTypeFlagBits::eZirconEventFUCHSIA: return \"ZirconEventFUCHSIA\";\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ExternalSemaphoreFeatureFlagBits value )\n  {\n    switch ( value )\n    {\n      case ExternalSemaphoreFeatureFlagBits::eExportable: return \"Exportable\";\n      case ExternalSemaphoreFeatureFlagBits::eImportable: return \"Importable\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_VERSION_1_2 ===\n\n  VULKAN_HPP_INLINE std::string to_string( DriverId value )\n  {\n    switch ( value )\n    {\n      case DriverId::eAmdProprietary: return \"AmdProprietary\";\n      case DriverId::eAmdOpenSource: return \"AmdOpenSource\";\n      case DriverId::eMesaRadv: return \"MesaRadv\";\n      case DriverId::eNvidiaProprietary: return \"NvidiaProprietary\";\n      case DriverId::eIntelProprietaryWindows: return \"IntelProprietaryWindows\";\n      case DriverId::eIntelOpenSourceMESA: return \"IntelOpenSourceMESA\";\n      case DriverId::eImaginationProprietary: return \"ImaginationProprietary\";\n      case DriverId::eQualcommProprietary: return \"QualcommProprietary\";\n      case DriverId::eArmProprietary: return \"ArmProprietary\";\n      case DriverId::eGoogleSwiftshader: return \"GoogleSwiftshader\";\n      case DriverId::eGgpProprietary: return \"GgpProprietary\";\n      case DriverId::eBroadcomProprietary: return \"BroadcomProprietary\";\n      case DriverId::eMesaLlvmpipe: return \"MesaLlvmpipe\";\n      case DriverId::eMoltenvk: return \"Moltenvk\";\n      case DriverId::eCoreaviProprietary: return \"CoreaviProprietary\";\n      case DriverId::eJuiceProprietary: return \"JuiceProprietary\";\n      case DriverId::eVerisiliconProprietary: return \"VerisiliconProprietary\";\n      case DriverId::eMesaTurnip: return \"MesaTurnip\";\n      case DriverId::eMesaV3Dv: return \"MesaV3Dv\";\n      case DriverId::eMesaPanvk: return \"MesaPanvk\";\n      case DriverId::eSamsungProprietary: return \"SamsungProprietary\";\n      case DriverId::eMesaVenus: return \"MesaVenus\";\n      case DriverId::eMesaDozen: return \"MesaDozen\";\n      case DriverId::eMesaNvk: return \"MesaNvk\";\n      case DriverId::eImaginationOpenSourceMESA: return \"ImaginationOpenSourceMESA\";\n      case DriverId::eMesaHoneykrisp: return \"MesaHoneykrisp\";\n      case DriverId::eVulkanScEmulationOnVulkan: return \"VulkanScEmulationOnVulkan\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ShaderFloatControlsIndependence value )\n  {\n    switch ( value )\n    {\n      case ShaderFloatControlsIndependence::e32BitOnly: return \"32BitOnly\";\n      case ShaderFloatControlsIndependence::eAll: return \"All\";\n      case ShaderFloatControlsIndependence::eNone: return \"None\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DescriptorBindingFlagBits value )\n  {\n    switch ( value )\n    {\n      case DescriptorBindingFlagBits::eUpdateAfterBind: return \"UpdateAfterBind\";\n      case DescriptorBindingFlagBits::eUpdateUnusedWhilePending: return \"UpdateUnusedWhilePending\";\n      case DescriptorBindingFlagBits::ePartiallyBound: return \"PartiallyBound\";\n      case DescriptorBindingFlagBits::eVariableDescriptorCount: return \"VariableDescriptorCount\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ResolveModeFlagBits value )\n  {\n    switch ( value )\n    {\n      case ResolveModeFlagBits::eNone: return \"None\";\n      case ResolveModeFlagBits::eSampleZero: return \"SampleZero\";\n      case ResolveModeFlagBits::eAverage: return \"Average\";\n      case ResolveModeFlagBits::eMin: return \"Min\";\n      case ResolveModeFlagBits::eMax: return \"Max\";\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n      case ResolveModeFlagBits::eExternalFormatDownsampleANDROID: return \"ExternalFormatDownsampleANDROID\";\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SamplerReductionMode value )\n  {\n    switch ( value )\n    {\n      case SamplerReductionMode::eWeightedAverage: return \"WeightedAverage\";\n      case SamplerReductionMode::eMin: return \"Min\";\n      case SamplerReductionMode::eMax: return \"Max\";\n      case SamplerReductionMode::eWeightedAverageRangeclampQCOM: return \"WeightedAverageRangeclampQCOM\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SemaphoreType value )\n  {\n    switch ( value )\n    {\n      case SemaphoreType::eBinary: return \"Binary\";\n      case SemaphoreType::eTimeline: return \"Timeline\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SemaphoreWaitFlagBits value )\n  {\n    switch ( value )\n    {\n      case SemaphoreWaitFlagBits::eAny: return \"Any\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_VERSION_1_3 ===\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineCreationFeedbackFlagBits value )\n  {\n    switch ( value )\n    {\n      case PipelineCreationFeedbackFlagBits::eValid: return \"Valid\";\n      case PipelineCreationFeedbackFlagBits::eApplicationPipelineCacheHit: return \"ApplicationPipelineCacheHit\";\n      case PipelineCreationFeedbackFlagBits::eBasePipelineAcceleration: return \"BasePipelineAcceleration\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ToolPurposeFlagBits value )\n  {\n    switch ( value )\n    {\n      case ToolPurposeFlagBits::eValidation: return \"Validation\";\n      case ToolPurposeFlagBits::eProfiling: return \"Profiling\";\n      case ToolPurposeFlagBits::eTracing: return \"Tracing\";\n      case ToolPurposeFlagBits::eAdditionalFeatures: return \"AdditionalFeatures\";\n      case ToolPurposeFlagBits::eModifyingFeatures: return \"ModifyingFeatures\";\n      case ToolPurposeFlagBits::eDebugReportingEXT: return \"DebugReportingEXT\";\n      case ToolPurposeFlagBits::eDebugMarkersEXT: return \"DebugMarkersEXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PrivateDataSlotCreateFlagBits )\n  {\n    return \"(void)\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineStageFlagBits2 value )\n  {\n    switch ( value )\n    {\n      case PipelineStageFlagBits2::eNone: return \"None\";\n      case PipelineStageFlagBits2::eTopOfPipe: return \"TopOfPipe\";\n      case PipelineStageFlagBits2::eDrawIndirect: return \"DrawIndirect\";\n      case PipelineStageFlagBits2::eVertexInput: return \"VertexInput\";\n      case PipelineStageFlagBits2::eVertexShader: return \"VertexShader\";\n      case PipelineStageFlagBits2::eTessellationControlShader: return \"TessellationControlShader\";\n      case PipelineStageFlagBits2::eTessellationEvaluationShader: return \"TessellationEvaluationShader\";\n      case PipelineStageFlagBits2::eGeometryShader: return \"GeometryShader\";\n      case PipelineStageFlagBits2::eFragmentShader: return \"FragmentShader\";\n      case PipelineStageFlagBits2::eEarlyFragmentTests: return \"EarlyFragmentTests\";\n      case PipelineStageFlagBits2::eLateFragmentTests: return \"LateFragmentTests\";\n      case PipelineStageFlagBits2::eColorAttachmentOutput: return \"ColorAttachmentOutput\";\n      case PipelineStageFlagBits2::eComputeShader: return \"ComputeShader\";\n      case PipelineStageFlagBits2::eAllTransfer: return \"AllTransfer\";\n      case PipelineStageFlagBits2::eBottomOfPipe: return \"BottomOfPipe\";\n      case PipelineStageFlagBits2::eHost: return \"Host\";\n      case PipelineStageFlagBits2::eAllGraphics: return \"AllGraphics\";\n      case PipelineStageFlagBits2::eAllCommands: return \"AllCommands\";\n      case PipelineStageFlagBits2::eCopy: return \"Copy\";\n      case PipelineStageFlagBits2::eResolve: return \"Resolve\";\n      case PipelineStageFlagBits2::eBlit: return \"Blit\";\n      case PipelineStageFlagBits2::eClear: return \"Clear\";\n      case PipelineStageFlagBits2::eIndexInput: return \"IndexInput\";\n      case PipelineStageFlagBits2::eVertexAttributeInput: return \"VertexAttributeInput\";\n      case PipelineStageFlagBits2::ePreRasterizationShaders: return \"PreRasterizationShaders\";\n      case PipelineStageFlagBits2::eVideoDecodeKHR: return \"VideoDecodeKHR\";\n      case PipelineStageFlagBits2::eVideoEncodeKHR: return \"VideoEncodeKHR\";\n      case PipelineStageFlagBits2::eTransformFeedbackEXT: return \"TransformFeedbackEXT\";\n      case PipelineStageFlagBits2::eConditionalRenderingEXT: return \"ConditionalRenderingEXT\";\n      case PipelineStageFlagBits2::eCommandPreprocessNV: return \"CommandPreprocessNV\";\n      case PipelineStageFlagBits2::eFragmentShadingRateAttachmentKHR: return \"FragmentShadingRateAttachmentKHR\";\n      case PipelineStageFlagBits2::eAccelerationStructureBuildKHR: return \"AccelerationStructureBuildKHR\";\n      case PipelineStageFlagBits2::eRayTracingShaderKHR: return \"RayTracingShaderKHR\";\n      case PipelineStageFlagBits2::eFragmentDensityProcessEXT: return \"FragmentDensityProcessEXT\";\n      case PipelineStageFlagBits2::eTaskShaderEXT: return \"TaskShaderEXT\";\n      case PipelineStageFlagBits2::eMeshShaderEXT: return \"MeshShaderEXT\";\n      case PipelineStageFlagBits2::eSubpassShaderHUAWEI: return \"SubpassShaderHUAWEI\";\n      case PipelineStageFlagBits2::eInvocationMaskHUAWEI: return \"InvocationMaskHUAWEI\";\n      case PipelineStageFlagBits2::eAccelerationStructureCopyKHR: return \"AccelerationStructureCopyKHR\";\n      case PipelineStageFlagBits2::eMicromapBuildEXT: return \"MicromapBuildEXT\";\n      case PipelineStageFlagBits2::eClusterCullingShaderHUAWEI: return \"ClusterCullingShaderHUAWEI\";\n      case PipelineStageFlagBits2::eOpticalFlowNV: return \"OpticalFlowNV\";\n      case PipelineStageFlagBits2::eConvertCooperativeVectorMatrixNV: return \"ConvertCooperativeVectorMatrixNV\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( AccessFlagBits2 value )\n  {\n    switch ( value )\n    {\n      case AccessFlagBits2::eNone: return \"None\";\n      case AccessFlagBits2::eIndirectCommandRead: return \"IndirectCommandRead\";\n      case AccessFlagBits2::eIndexRead: return \"IndexRead\";\n      case AccessFlagBits2::eVertexAttributeRead: return \"VertexAttributeRead\";\n      case AccessFlagBits2::eUniformRead: return \"UniformRead\";\n      case AccessFlagBits2::eInputAttachmentRead: return \"InputAttachmentRead\";\n      case AccessFlagBits2::eShaderRead: return \"ShaderRead\";\n      case AccessFlagBits2::eShaderWrite: return \"ShaderWrite\";\n      case AccessFlagBits2::eColorAttachmentRead: return \"ColorAttachmentRead\";\n      case AccessFlagBits2::eColorAttachmentWrite: return \"ColorAttachmentWrite\";\n      case AccessFlagBits2::eDepthStencilAttachmentRead: return \"DepthStencilAttachmentRead\";\n      case AccessFlagBits2::eDepthStencilAttachmentWrite: return \"DepthStencilAttachmentWrite\";\n      case AccessFlagBits2::eTransferRead: return \"TransferRead\";\n      case AccessFlagBits2::eTransferWrite: return \"TransferWrite\";\n      case AccessFlagBits2::eHostRead: return \"HostRead\";\n      case AccessFlagBits2::eHostWrite: return \"HostWrite\";\n      case AccessFlagBits2::eMemoryRead: return \"MemoryRead\";\n      case AccessFlagBits2::eMemoryWrite: return \"MemoryWrite\";\n      case AccessFlagBits2::eShaderSampledRead: return \"ShaderSampledRead\";\n      case AccessFlagBits2::eShaderStorageRead: return \"ShaderStorageRead\";\n      case AccessFlagBits2::eShaderStorageWrite: return \"ShaderStorageWrite\";\n      case AccessFlagBits2::eVideoDecodeReadKHR: return \"VideoDecodeReadKHR\";\n      case AccessFlagBits2::eVideoDecodeWriteKHR: return \"VideoDecodeWriteKHR\";\n      case AccessFlagBits2::eVideoEncodeReadKHR: return \"VideoEncodeReadKHR\";\n      case AccessFlagBits2::eVideoEncodeWriteKHR: return \"VideoEncodeWriteKHR\";\n      case AccessFlagBits2::eTransformFeedbackWriteEXT: return \"TransformFeedbackWriteEXT\";\n      case AccessFlagBits2::eTransformFeedbackCounterReadEXT: return \"TransformFeedbackCounterReadEXT\";\n      case AccessFlagBits2::eTransformFeedbackCounterWriteEXT: return \"TransformFeedbackCounterWriteEXT\";\n      case AccessFlagBits2::eConditionalRenderingReadEXT: return \"ConditionalRenderingReadEXT\";\n      case AccessFlagBits2::eCommandPreprocessReadNV: return \"CommandPreprocessReadNV\";\n      case AccessFlagBits2::eCommandPreprocessWriteNV: return \"CommandPreprocessWriteNV\";\n      case AccessFlagBits2::eFragmentShadingRateAttachmentReadKHR: return \"FragmentShadingRateAttachmentReadKHR\";\n      case AccessFlagBits2::eAccelerationStructureReadKHR: return \"AccelerationStructureReadKHR\";\n      case AccessFlagBits2::eAccelerationStructureWriteKHR: return \"AccelerationStructureWriteKHR\";\n      case AccessFlagBits2::eFragmentDensityMapReadEXT: return \"FragmentDensityMapReadEXT\";\n      case AccessFlagBits2::eColorAttachmentReadNoncoherentEXT: return \"ColorAttachmentReadNoncoherentEXT\";\n      case AccessFlagBits2::eDescriptorBufferReadEXT: return \"DescriptorBufferReadEXT\";\n      case AccessFlagBits2::eInvocationMaskReadHUAWEI: return \"InvocationMaskReadHUAWEI\";\n      case AccessFlagBits2::eShaderBindingTableReadKHR: return \"ShaderBindingTableReadKHR\";\n      case AccessFlagBits2::eMicromapReadEXT: return \"MicromapReadEXT\";\n      case AccessFlagBits2::eMicromapWriteEXT: return \"MicromapWriteEXT\";\n      case AccessFlagBits2::eOpticalFlowReadNV: return \"OpticalFlowReadNV\";\n      case AccessFlagBits2::eOpticalFlowWriteNV: return \"OpticalFlowWriteNV\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( SubmitFlagBits value )\n  {\n    switch ( value )\n    {\n      case SubmitFlagBits::eProtected: return \"Protected\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( RenderingFlagBits value )\n  {\n    switch ( value )\n    {\n      case RenderingFlagBits::eContentsSecondaryCommandBuffers: return \"ContentsSecondaryCommandBuffers\";\n      case RenderingFlagBits::eSuspending: return \"Suspending\";\n      case RenderingFlagBits::eResuming: return \"Resuming\";\n      case RenderingFlagBits::eEnableLegacyDitheringEXT: return \"EnableLegacyDitheringEXT\";\n      case RenderingFlagBits::eContentsInlineKHR: return \"ContentsInlineKHR\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( FormatFeatureFlagBits2 value )\n  {\n    switch ( value )\n    {\n      case FormatFeatureFlagBits2::eSampledImage: return \"SampledImage\";\n      case FormatFeatureFlagBits2::eStorageImage: return \"StorageImage\";\n      case FormatFeatureFlagBits2::eStorageImageAtomic: return \"StorageImageAtomic\";\n      case FormatFeatureFlagBits2::eUniformTexelBuffer: return \"UniformTexelBuffer\";\n      case FormatFeatureFlagBits2::eStorageTexelBuffer: return \"StorageTexelBuffer\";\n      case FormatFeatureFlagBits2::eStorageTexelBufferAtomic: return \"StorageTexelBufferAtomic\";\n      case FormatFeatureFlagBits2::eVertexBuffer: return \"VertexBuffer\";\n      case FormatFeatureFlagBits2::eColorAttachment: return \"ColorAttachment\";\n      case FormatFeatureFlagBits2::eColorAttachmentBlend: return \"ColorAttachmentBlend\";\n      case FormatFeatureFlagBits2::eDepthStencilAttachment: return \"DepthStencilAttachment\";\n      case FormatFeatureFlagBits2::eBlitSrc: return \"BlitSrc\";\n      case FormatFeatureFlagBits2::eBlitDst: return \"BlitDst\";\n      case FormatFeatureFlagBits2::eSampledImageFilterLinear: return \"SampledImageFilterLinear\";\n      case FormatFeatureFlagBits2::eTransferSrc: return \"TransferSrc\";\n      case FormatFeatureFlagBits2::eTransferDst: return \"TransferDst\";\n      case FormatFeatureFlagBits2::eSampledImageFilterMinmax: return \"SampledImageFilterMinmax\";\n      case FormatFeatureFlagBits2::eMidpointChromaSamples: return \"MidpointChromaSamples\";\n      case FormatFeatureFlagBits2::eSampledImageYcbcrConversionLinearFilter: return \"SampledImageYcbcrConversionLinearFilter\";\n      case FormatFeatureFlagBits2::eSampledImageYcbcrConversionSeparateReconstructionFilter: return \"SampledImageYcbcrConversionSeparateReconstructionFilter\";\n      case FormatFeatureFlagBits2::eSampledImageYcbcrConversionChromaReconstructionExplicit: return \"SampledImageYcbcrConversionChromaReconstructionExplicit\";\n      case FormatFeatureFlagBits2::eSampledImageYcbcrConversionChromaReconstructionExplicitForceable:\n        return \"SampledImageYcbcrConversionChromaReconstructionExplicitForceable\";\n      case FormatFeatureFlagBits2::eDisjoint: return \"Disjoint\";\n      case FormatFeatureFlagBits2::eCositedChromaSamples: return \"CositedChromaSamples\";\n      case FormatFeatureFlagBits2::eStorageReadWithoutFormat: return \"StorageReadWithoutFormat\";\n      case FormatFeatureFlagBits2::eStorageWriteWithoutFormat: return \"StorageWriteWithoutFormat\";\n      case FormatFeatureFlagBits2::eSampledImageDepthComparison: return \"SampledImageDepthComparison\";\n      case FormatFeatureFlagBits2::eSampledImageFilterCubic: return \"SampledImageFilterCubic\";\n      case FormatFeatureFlagBits2::eHostImageTransfer: return \"HostImageTransfer\";\n      case FormatFeatureFlagBits2::eVideoDecodeOutputKHR: return \"VideoDecodeOutputKHR\";\n      case FormatFeatureFlagBits2::eVideoDecodeDpbKHR: return \"VideoDecodeDpbKHR\";\n      case FormatFeatureFlagBits2::eAccelerationStructureVertexBufferKHR: return \"AccelerationStructureVertexBufferKHR\";\n      case FormatFeatureFlagBits2::eFragmentDensityMapEXT: return \"FragmentDensityMapEXT\";\n      case FormatFeatureFlagBits2::eFragmentShadingRateAttachmentKHR: return \"FragmentShadingRateAttachmentKHR\";\n      case FormatFeatureFlagBits2::eVideoEncodeInputKHR: return \"VideoEncodeInputKHR\";\n      case FormatFeatureFlagBits2::eVideoEncodeDpbKHR: return \"VideoEncodeDpbKHR\";\n      case FormatFeatureFlagBits2::eAccelerationStructureRadiusBufferNV: return \"AccelerationStructureRadiusBufferNV\";\n      case FormatFeatureFlagBits2::eLinearColorAttachmentNV: return \"LinearColorAttachmentNV\";\n      case FormatFeatureFlagBits2::eWeightImageQCOM: return \"WeightImageQCOM\";\n      case FormatFeatureFlagBits2::eWeightSampledImageQCOM: return \"WeightSampledImageQCOM\";\n      case FormatFeatureFlagBits2::eBlockMatchingQCOM: return \"BlockMatchingQCOM\";\n      case FormatFeatureFlagBits2::eBoxFilterSampledQCOM: return \"BoxFilterSampledQCOM\";\n      case FormatFeatureFlagBits2::eOpticalFlowImageNV: return \"OpticalFlowImageNV\";\n      case FormatFeatureFlagBits2::eOpticalFlowVectorNV: return \"OpticalFlowVectorNV\";\n      case FormatFeatureFlagBits2::eOpticalFlowCostNV: return \"OpticalFlowCostNV\";\n      case FormatFeatureFlagBits2::eVideoEncodeQuantizationDeltaMapKHR: return \"VideoEncodeQuantizationDeltaMapKHR\";\n      case FormatFeatureFlagBits2::eVideoEncodeEmphasisMapKHR: return \"VideoEncodeEmphasisMapKHR\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_VERSION_1_4 ===\n\n  VULKAN_HPP_INLINE std::string to_string( QueueGlobalPriority value )\n  {\n    switch ( value )\n    {\n      case QueueGlobalPriority::eLow: return \"Low\";\n      case QueueGlobalPriority::eMedium: return \"Medium\";\n      case QueueGlobalPriority::eHigh: return \"High\";\n      case QueueGlobalPriority::eRealtime: return \"Realtime\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( LineRasterizationMode value )\n  {\n    switch ( value )\n    {\n      case LineRasterizationMode::eDefault: return \"Default\";\n      case LineRasterizationMode::eRectangular: return \"Rectangular\";\n      case LineRasterizationMode::eBresenham: return \"Bresenham\";\n      case LineRasterizationMode::eRectangularSmooth: return \"RectangularSmooth\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( MemoryUnmapFlagBits value )\n  {\n    switch ( value )\n    {\n      case MemoryUnmapFlagBits::eReserveEXT: return \"ReserveEXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineCreateFlagBits2 value )\n  {\n    switch ( value )\n    {\n      case PipelineCreateFlagBits2::eDisableOptimization: return \"DisableOptimization\";\n      case PipelineCreateFlagBits2::eAllowDerivatives: return \"AllowDerivatives\";\n      case PipelineCreateFlagBits2::eDerivative: return \"Derivative\";\n      case PipelineCreateFlagBits2::eViewIndexFromDeviceIndex: return \"ViewIndexFromDeviceIndex\";\n      case PipelineCreateFlagBits2::eDispatchBase: return \"DispatchBase\";\n      case PipelineCreateFlagBits2::eFailOnPipelineCompileRequired: return \"FailOnPipelineCompileRequired\";\n      case PipelineCreateFlagBits2::eEarlyReturnOnFailure: return \"EarlyReturnOnFailure\";\n      case PipelineCreateFlagBits2::eNoProtectedAccess: return \"NoProtectedAccess\";\n      case PipelineCreateFlagBits2::eProtectedAccessOnly: return \"ProtectedAccessOnly\";\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      case PipelineCreateFlagBits2::eExecutionGraphAMDX: return \"ExecutionGraphAMDX\";\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n      case PipelineCreateFlagBits2::eRayTracingAllowSpheresAndLinearSweptSpheresNV: return \"RayTracingAllowSpheresAndLinearSweptSpheresNV\";\n      case PipelineCreateFlagBits2::eEnableLegacyDitheringEXT: return \"EnableLegacyDitheringEXT\";\n      case PipelineCreateFlagBits2::eDeferCompileNV: return \"DeferCompileNV\";\n      case PipelineCreateFlagBits2::eCaptureStatisticsKHR: return \"CaptureStatisticsKHR\";\n      case PipelineCreateFlagBits2::eCaptureInternalRepresentationsKHR: return \"CaptureInternalRepresentationsKHR\";\n      case PipelineCreateFlagBits2::eLinkTimeOptimizationEXT: return \"LinkTimeOptimizationEXT\";\n      case PipelineCreateFlagBits2::eRetainLinkTimeOptimizationInfoEXT: return \"RetainLinkTimeOptimizationInfoEXT\";\n      case PipelineCreateFlagBits2::eLibraryKHR: return \"LibraryKHR\";\n      case PipelineCreateFlagBits2::eRayTracingSkipTrianglesKHR: return \"RayTracingSkipTrianglesKHR\";\n      case PipelineCreateFlagBits2::eRayTracingSkipAabbsKHR: return \"RayTracingSkipAabbsKHR\";\n      case PipelineCreateFlagBits2::eRayTracingNoNullAnyHitShadersKHR: return \"RayTracingNoNullAnyHitShadersKHR\";\n      case PipelineCreateFlagBits2::eRayTracingNoNullClosestHitShadersKHR: return \"RayTracingNoNullClosestHitShadersKHR\";\n      case PipelineCreateFlagBits2::eRayTracingNoNullMissShadersKHR: return \"RayTracingNoNullMissShadersKHR\";\n      case PipelineCreateFlagBits2::eRayTracingNoNullIntersectionShadersKHR: return \"RayTracingNoNullIntersectionShadersKHR\";\n      case PipelineCreateFlagBits2::eRayTracingShaderGroupHandleCaptureReplayKHR: return \"RayTracingShaderGroupHandleCaptureReplayKHR\";\n      case PipelineCreateFlagBits2::eIndirectBindableNV: return \"IndirectBindableNV\";\n      case PipelineCreateFlagBits2::eRayTracingAllowMotionNV: return \"RayTracingAllowMotionNV\";\n      case PipelineCreateFlagBits2::eRenderingFragmentShadingRateAttachmentKHR: return \"RenderingFragmentShadingRateAttachmentKHR\";\n      case PipelineCreateFlagBits2::eRenderingFragmentDensityMapAttachmentEXT: return \"RenderingFragmentDensityMapAttachmentEXT\";\n      case PipelineCreateFlagBits2::eRayTracingOpacityMicromapEXT: return \"RayTracingOpacityMicromapEXT\";\n      case PipelineCreateFlagBits2::eColorAttachmentFeedbackLoopEXT: return \"ColorAttachmentFeedbackLoopEXT\";\n      case PipelineCreateFlagBits2::eDepthStencilAttachmentFeedbackLoopEXT: return \"DepthStencilAttachmentFeedbackLoopEXT\";\n      case PipelineCreateFlagBits2::eRayTracingDisplacementMicromapNV: return \"RayTracingDisplacementMicromapNV\";\n      case PipelineCreateFlagBits2::eDescriptorBufferEXT: return \"DescriptorBufferEXT\";\n      case PipelineCreateFlagBits2::eDisallowOpacityMicromapARM: return \"DisallowOpacityMicromapARM\";\n      case PipelineCreateFlagBits2::eCaptureDataKHR: return \"CaptureDataKHR\";\n      case PipelineCreateFlagBits2::eIndirectBindableEXT: return \"IndirectBindableEXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( BufferUsageFlagBits2 value )\n  {\n    switch ( value )\n    {\n      case BufferUsageFlagBits2::eTransferSrc: return \"TransferSrc\";\n      case BufferUsageFlagBits2::eTransferDst: return \"TransferDst\";\n      case BufferUsageFlagBits2::eUniformTexelBuffer: return \"UniformTexelBuffer\";\n      case BufferUsageFlagBits2::eStorageTexelBuffer: return \"StorageTexelBuffer\";\n      case BufferUsageFlagBits2::eUniformBuffer: return \"UniformBuffer\";\n      case BufferUsageFlagBits2::eStorageBuffer: return \"StorageBuffer\";\n      case BufferUsageFlagBits2::eIndexBuffer: return \"IndexBuffer\";\n      case BufferUsageFlagBits2::eVertexBuffer: return \"VertexBuffer\";\n      case BufferUsageFlagBits2::eIndirectBuffer: return \"IndirectBuffer\";\n      case BufferUsageFlagBits2::eShaderDeviceAddress: return \"ShaderDeviceAddress\";\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      case BufferUsageFlagBits2::eExecutionGraphScratchAMDX: return \"ExecutionGraphScratchAMDX\";\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n      case BufferUsageFlagBits2::eConditionalRenderingEXT: return \"ConditionalRenderingEXT\";\n      case BufferUsageFlagBits2::eShaderBindingTableKHR: return \"ShaderBindingTableKHR\";\n      case BufferUsageFlagBits2::eTransformFeedbackBufferEXT: return \"TransformFeedbackBufferEXT\";\n      case BufferUsageFlagBits2::eTransformFeedbackCounterBufferEXT: return \"TransformFeedbackCounterBufferEXT\";\n      case BufferUsageFlagBits2::eVideoDecodeSrcKHR: return \"VideoDecodeSrcKHR\";\n      case BufferUsageFlagBits2::eVideoDecodeDstKHR: return \"VideoDecodeDstKHR\";\n      case BufferUsageFlagBits2::eVideoEncodeDstKHR: return \"VideoEncodeDstKHR\";\n      case BufferUsageFlagBits2::eVideoEncodeSrcKHR: return \"VideoEncodeSrcKHR\";\n      case BufferUsageFlagBits2::eAccelerationStructureBuildInputReadOnlyKHR: return \"AccelerationStructureBuildInputReadOnlyKHR\";\n      case BufferUsageFlagBits2::eAccelerationStructureStorageKHR: return \"AccelerationStructureStorageKHR\";\n      case BufferUsageFlagBits2::eSamplerDescriptorBufferEXT: return \"SamplerDescriptorBufferEXT\";\n      case BufferUsageFlagBits2::eResourceDescriptorBufferEXT: return \"ResourceDescriptorBufferEXT\";\n      case BufferUsageFlagBits2::ePushDescriptorsDescriptorBufferEXT: return \"PushDescriptorsDescriptorBufferEXT\";\n      case BufferUsageFlagBits2::eMicromapBuildInputReadOnlyEXT: return \"MicromapBuildInputReadOnlyEXT\";\n      case BufferUsageFlagBits2::eMicromapStorageEXT: return \"MicromapStorageEXT\";\n      case BufferUsageFlagBits2::ePreprocessBufferEXT: return \"PreprocessBufferEXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineRobustnessBufferBehavior value )\n  {\n    switch ( value )\n    {\n      case PipelineRobustnessBufferBehavior::eDeviceDefault: return \"DeviceDefault\";\n      case PipelineRobustnessBufferBehavior::eDisabled: return \"Disabled\";\n      case PipelineRobustnessBufferBehavior::eRobustBufferAccess: return \"RobustBufferAccess\";\n      case PipelineRobustnessBufferBehavior::eRobustBufferAccess2: return \"RobustBufferAccess2\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineRobustnessImageBehavior value )\n  {\n    switch ( value )\n    {\n      case PipelineRobustnessImageBehavior::eDeviceDefault: return \"DeviceDefault\";\n      case PipelineRobustnessImageBehavior::eDisabled: return \"Disabled\";\n      case PipelineRobustnessImageBehavior::eRobustImageAccess: return \"RobustImageAccess\";\n      case PipelineRobustnessImageBehavior::eRobustImageAccess2: return \"RobustImageAccess2\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( HostImageCopyFlagBits value )\n  {\n    switch ( value )\n    {\n      case HostImageCopyFlagBits::eMemcpy: return \"Memcpy\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_KHR_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( SurfaceTransformFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case SurfaceTransformFlagBitsKHR::eIdentity: return \"Identity\";\n      case SurfaceTransformFlagBitsKHR::eRotate90: return \"Rotate90\";\n      case SurfaceTransformFlagBitsKHR::eRotate180: return \"Rotate180\";\n      case SurfaceTransformFlagBitsKHR::eRotate270: return \"Rotate270\";\n      case SurfaceTransformFlagBitsKHR::eHorizontalMirror: return \"HorizontalMirror\";\n      case SurfaceTransformFlagBitsKHR::eHorizontalMirrorRotate90: return \"HorizontalMirrorRotate90\";\n      case SurfaceTransformFlagBitsKHR::eHorizontalMirrorRotate180: return \"HorizontalMirrorRotate180\";\n      case SurfaceTransformFlagBitsKHR::eHorizontalMirrorRotate270: return \"HorizontalMirrorRotate270\";\n      case SurfaceTransformFlagBitsKHR::eInherit: return \"Inherit\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PresentModeKHR value )\n  {\n    switch ( value )\n    {\n      case PresentModeKHR::eImmediate: return \"Immediate\";\n      case PresentModeKHR::eMailbox: return \"Mailbox\";\n      case PresentModeKHR::eFifo: return \"Fifo\";\n      case PresentModeKHR::eFifoRelaxed: return \"FifoRelaxed\";\n      case PresentModeKHR::eSharedDemandRefresh: return \"SharedDemandRefresh\";\n      case PresentModeKHR::eSharedContinuousRefresh: return \"SharedContinuousRefresh\";\n      case PresentModeKHR::eFifoLatestReadyEXT: return \"FifoLatestReadyEXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ColorSpaceKHR value )\n  {\n    switch ( value )\n    {\n      case ColorSpaceKHR::eSrgbNonlinear: return \"SrgbNonlinear\";\n      case ColorSpaceKHR::eDisplayP3NonlinearEXT: return \"DisplayP3NonlinearEXT\";\n      case ColorSpaceKHR::eExtendedSrgbLinearEXT: return \"ExtendedSrgbLinearEXT\";\n      case ColorSpaceKHR::eDisplayP3LinearEXT: return \"DisplayP3LinearEXT\";\n      case ColorSpaceKHR::eDciP3NonlinearEXT: return \"DciP3NonlinearEXT\";\n      case ColorSpaceKHR::eBt709LinearEXT: return \"Bt709LinearEXT\";\n      case ColorSpaceKHR::eBt709NonlinearEXT: return \"Bt709NonlinearEXT\";\n      case ColorSpaceKHR::eBt2020LinearEXT: return \"Bt2020LinearEXT\";\n      case ColorSpaceKHR::eHdr10St2084EXT: return \"Hdr10St2084EXT\";\n      case ColorSpaceKHR::eDolbyvisionEXT: return \"DolbyvisionEXT\";\n      case ColorSpaceKHR::eHdr10HlgEXT: return \"Hdr10HlgEXT\";\n      case ColorSpaceKHR::eAdobergbLinearEXT: return \"AdobergbLinearEXT\";\n      case ColorSpaceKHR::eAdobergbNonlinearEXT: return \"AdobergbNonlinearEXT\";\n      case ColorSpaceKHR::ePassThroughEXT: return \"PassThroughEXT\";\n      case ColorSpaceKHR::eExtendedSrgbNonlinearEXT: return \"ExtendedSrgbNonlinearEXT\";\n      case ColorSpaceKHR::eDisplayNativeAMD: return \"DisplayNativeAMD\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( CompositeAlphaFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case CompositeAlphaFlagBitsKHR::eOpaque: return \"Opaque\";\n      case CompositeAlphaFlagBitsKHR::ePreMultiplied: return \"PreMultiplied\";\n      case CompositeAlphaFlagBitsKHR::ePostMultiplied: return \"PostMultiplied\";\n      case CompositeAlphaFlagBitsKHR::eInherit: return \"Inherit\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_KHR_swapchain ===\n\n  VULKAN_HPP_INLINE std::string to_string( SwapchainCreateFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case SwapchainCreateFlagBitsKHR::eSplitInstanceBindRegions: return \"SplitInstanceBindRegions\";\n      case SwapchainCreateFlagBitsKHR::eProtected: return \"Protected\";\n      case SwapchainCreateFlagBitsKHR::eMutableFormat: return \"MutableFormat\";\n      case SwapchainCreateFlagBitsKHR::eDeferredMemoryAllocationEXT: return \"DeferredMemoryAllocationEXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DeviceGroupPresentModeFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case DeviceGroupPresentModeFlagBitsKHR::eLocal: return \"Local\";\n      case DeviceGroupPresentModeFlagBitsKHR::eRemote: return \"Remote\";\n      case DeviceGroupPresentModeFlagBitsKHR::eSum: return \"Sum\";\n      case DeviceGroupPresentModeFlagBitsKHR::eLocalMultiDevice: return \"LocalMultiDevice\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_KHR_display ===\n\n  VULKAN_HPP_INLINE std::string to_string( DisplayPlaneAlphaFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case DisplayPlaneAlphaFlagBitsKHR::eOpaque: return \"Opaque\";\n      case DisplayPlaneAlphaFlagBitsKHR::eGlobal: return \"Global\";\n      case DisplayPlaneAlphaFlagBitsKHR::ePerPixel: return \"PerPixel\";\n      case DisplayPlaneAlphaFlagBitsKHR::ePerPixelPremultiplied: return \"PerPixelPremultiplied\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DisplayModeCreateFlagBitsKHR )\n  {\n    return \"(void)\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DisplaySurfaceCreateFlagBitsKHR )\n  {\n    return \"(void)\";\n  }\n\n#if defined( VK_USE_PLATFORM_XLIB_KHR )\n  //=== VK_KHR_xlib_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( XlibSurfaceCreateFlagBitsKHR )\n  {\n    return \"(void)\";\n  }\n#endif /*VK_USE_PLATFORM_XLIB_KHR*/\n\n#if defined( VK_USE_PLATFORM_XCB_KHR )\n  //=== VK_KHR_xcb_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( XcbSurfaceCreateFlagBitsKHR )\n  {\n    return \"(void)\";\n  }\n#endif /*VK_USE_PLATFORM_XCB_KHR*/\n\n#if defined( VK_USE_PLATFORM_WAYLAND_KHR )\n  //=== VK_KHR_wayland_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( WaylandSurfaceCreateFlagBitsKHR )\n  {\n    return \"(void)\";\n  }\n#endif /*VK_USE_PLATFORM_WAYLAND_KHR*/\n\n#if defined( VK_USE_PLATFORM_ANDROID_KHR )\n  //=== VK_KHR_android_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( AndroidSurfaceCreateFlagBitsKHR )\n  {\n    return \"(void)\";\n  }\n#endif /*VK_USE_PLATFORM_ANDROID_KHR*/\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_KHR_win32_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( Win32SurfaceCreateFlagBitsKHR )\n  {\n    return \"(void)\";\n  }\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_EXT_debug_report ===\n\n  VULKAN_HPP_INLINE std::string to_string( DebugReportFlagBitsEXT value )\n  {\n    switch ( value )\n    {\n      case DebugReportFlagBitsEXT::eInformation: return \"Information\";\n      case DebugReportFlagBitsEXT::eWarning: return \"Warning\";\n      case DebugReportFlagBitsEXT::ePerformanceWarning: return \"PerformanceWarning\";\n      case DebugReportFlagBitsEXT::eError: return \"Error\";\n      case DebugReportFlagBitsEXT::eDebug: return \"Debug\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DebugReportObjectTypeEXT value )\n  {\n    switch ( value )\n    {\n      case DebugReportObjectTypeEXT::eUnknown: return \"Unknown\";\n      case DebugReportObjectTypeEXT::eInstance: return \"Instance\";\n      case DebugReportObjectTypeEXT::ePhysicalDevice: return \"PhysicalDevice\";\n      case DebugReportObjectTypeEXT::eDevice: return \"Device\";\n      case DebugReportObjectTypeEXT::eQueue: return \"Queue\";\n      case DebugReportObjectTypeEXT::eSemaphore: return \"Semaphore\";\n      case DebugReportObjectTypeEXT::eCommandBuffer: return \"CommandBuffer\";\n      case DebugReportObjectTypeEXT::eFence: return \"Fence\";\n      case DebugReportObjectTypeEXT::eDeviceMemory: return \"DeviceMemory\";\n      case DebugReportObjectTypeEXT::eBuffer: return \"Buffer\";\n      case DebugReportObjectTypeEXT::eImage: return \"Image\";\n      case DebugReportObjectTypeEXT::eEvent: return \"Event\";\n      case DebugReportObjectTypeEXT::eQueryPool: return \"QueryPool\";\n      case DebugReportObjectTypeEXT::eBufferView: return \"BufferView\";\n      case DebugReportObjectTypeEXT::eImageView: return \"ImageView\";\n      case DebugReportObjectTypeEXT::eShaderModule: return \"ShaderModule\";\n      case DebugReportObjectTypeEXT::ePipelineCache: return \"PipelineCache\";\n      case DebugReportObjectTypeEXT::ePipelineLayout: return \"PipelineLayout\";\n      case DebugReportObjectTypeEXT::eRenderPass: return \"RenderPass\";\n      case DebugReportObjectTypeEXT::ePipeline: return \"Pipeline\";\n      case DebugReportObjectTypeEXT::eDescriptorSetLayout: return \"DescriptorSetLayout\";\n      case DebugReportObjectTypeEXT::eSampler: return \"Sampler\";\n      case DebugReportObjectTypeEXT::eDescriptorPool: return \"DescriptorPool\";\n      case DebugReportObjectTypeEXT::eDescriptorSet: return \"DescriptorSet\";\n      case DebugReportObjectTypeEXT::eFramebuffer: return \"Framebuffer\";\n      case DebugReportObjectTypeEXT::eCommandPool: return \"CommandPool\";\n      case DebugReportObjectTypeEXT::eSurfaceKHR: return \"SurfaceKHR\";\n      case DebugReportObjectTypeEXT::eSwapchainKHR: return \"SwapchainKHR\";\n      case DebugReportObjectTypeEXT::eDebugReportCallbackEXT: return \"DebugReportCallbackEXT\";\n      case DebugReportObjectTypeEXT::eDisplayKHR: return \"DisplayKHR\";\n      case DebugReportObjectTypeEXT::eDisplayModeKHR: return \"DisplayModeKHR\";\n      case DebugReportObjectTypeEXT::eValidationCacheEXT: return \"ValidationCacheEXT\";\n      case DebugReportObjectTypeEXT::eSamplerYcbcrConversion: return \"SamplerYcbcrConversion\";\n      case DebugReportObjectTypeEXT::eDescriptorUpdateTemplate: return \"DescriptorUpdateTemplate\";\n      case DebugReportObjectTypeEXT::eCuModuleNVX: return \"CuModuleNVX\";\n      case DebugReportObjectTypeEXT::eCuFunctionNVX: return \"CuFunctionNVX\";\n      case DebugReportObjectTypeEXT::eAccelerationStructureKHR: return \"AccelerationStructureKHR\";\n      case DebugReportObjectTypeEXT::eAccelerationStructureNV: return \"AccelerationStructureNV\";\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      case DebugReportObjectTypeEXT::eCudaModuleNV: return \"CudaModuleNV\";\n      case DebugReportObjectTypeEXT::eCudaFunctionNV: return \"CudaFunctionNV\";\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n      case DebugReportObjectTypeEXT::eBufferCollectionFUCHSIA: return \"BufferCollectionFUCHSIA\";\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_AMD_rasterization_order ===\n\n  VULKAN_HPP_INLINE std::string to_string( RasterizationOrderAMD value )\n  {\n    switch ( value )\n    {\n      case RasterizationOrderAMD::eStrict: return \"Strict\";\n      case RasterizationOrderAMD::eRelaxed: return \"Relaxed\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_KHR_video_queue ===\n\n  VULKAN_HPP_INLINE std::string to_string( VideoCodecOperationFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoCodecOperationFlagBitsKHR::eNone: return \"None\";\n      case VideoCodecOperationFlagBitsKHR::eEncodeH264: return \"EncodeH264\";\n      case VideoCodecOperationFlagBitsKHR::eEncodeH265: return \"EncodeH265\";\n      case VideoCodecOperationFlagBitsKHR::eDecodeH264: return \"DecodeH264\";\n      case VideoCodecOperationFlagBitsKHR::eDecodeH265: return \"DecodeH265\";\n      case VideoCodecOperationFlagBitsKHR::eDecodeAv1: return \"DecodeAv1\";\n      case VideoCodecOperationFlagBitsKHR::eEncodeAv1: return \"EncodeAv1\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoChromaSubsamplingFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoChromaSubsamplingFlagBitsKHR::eInvalid: return \"Invalid\";\n      case VideoChromaSubsamplingFlagBitsKHR::eMonochrome: return \"Monochrome\";\n      case VideoChromaSubsamplingFlagBitsKHR::e420: return \"420\";\n      case VideoChromaSubsamplingFlagBitsKHR::e422: return \"422\";\n      case VideoChromaSubsamplingFlagBitsKHR::e444: return \"444\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoComponentBitDepthFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoComponentBitDepthFlagBitsKHR::eInvalid: return \"Invalid\";\n      case VideoComponentBitDepthFlagBitsKHR::e8: return \"8\";\n      case VideoComponentBitDepthFlagBitsKHR::e10: return \"10\";\n      case VideoComponentBitDepthFlagBitsKHR::e12: return \"12\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoCapabilityFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoCapabilityFlagBitsKHR::eProtectedContent: return \"ProtectedContent\";\n      case VideoCapabilityFlagBitsKHR::eSeparateReferenceImages: return \"SeparateReferenceImages\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoSessionCreateFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoSessionCreateFlagBitsKHR::eProtectedContent: return \"ProtectedContent\";\n      case VideoSessionCreateFlagBitsKHR::eAllowEncodeParameterOptimizations: return \"AllowEncodeParameterOptimizations\";\n      case VideoSessionCreateFlagBitsKHR::eInlineQueries: return \"InlineQueries\";\n      case VideoSessionCreateFlagBitsKHR::eAllowEncodeQuantizationDeltaMap: return \"AllowEncodeQuantizationDeltaMap\";\n      case VideoSessionCreateFlagBitsKHR::eAllowEncodeEmphasisMap: return \"AllowEncodeEmphasisMap\";\n      case VideoSessionCreateFlagBitsKHR::eInlineSessionParameters: return \"InlineSessionParameters\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoCodingControlFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoCodingControlFlagBitsKHR::eReset: return \"Reset\";\n      case VideoCodingControlFlagBitsKHR::eEncodeRateControl: return \"EncodeRateControl\";\n      case VideoCodingControlFlagBitsKHR::eEncodeQualityLevel: return \"EncodeQualityLevel\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( QueryResultStatusKHR value )\n  {\n    switch ( value )\n    {\n      case QueryResultStatusKHR::eError: return \"Error\";\n      case QueryResultStatusKHR::eNotReady: return \"NotReady\";\n      case QueryResultStatusKHR::eComplete: return \"Complete\";\n      case QueryResultStatusKHR::eInsufficientBitstreamBufferRange: return \"InsufficientBitstreamBufferRange\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoSessionParametersCreateFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoSessionParametersCreateFlagBitsKHR::eQuantizationMapCompatible: return \"QuantizationMapCompatible\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoBeginCodingFlagBitsKHR )\n  {\n    return \"(void)\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEndCodingFlagBitsKHR )\n  {\n    return \"(void)\";\n  }\n\n  //=== VK_KHR_video_decode_queue ===\n\n  VULKAN_HPP_INLINE std::string to_string( VideoDecodeCapabilityFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoDecodeCapabilityFlagBitsKHR::eDpbAndOutputCoincide: return \"DpbAndOutputCoincide\";\n      case VideoDecodeCapabilityFlagBitsKHR::eDpbAndOutputDistinct: return \"DpbAndOutputDistinct\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoDecodeUsageFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoDecodeUsageFlagBitsKHR::eDefault: return \"Default\";\n      case VideoDecodeUsageFlagBitsKHR::eTranscoding: return \"Transcoding\";\n      case VideoDecodeUsageFlagBitsKHR::eOffline: return \"Offline\";\n      case VideoDecodeUsageFlagBitsKHR::eStreaming: return \"Streaming\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoDecodeFlagBitsKHR )\n  {\n    return \"(void)\";\n  }\n\n  //=== VK_EXT_transform_feedback ===\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineRasterizationStateStreamCreateFlagBitsEXT )\n  {\n    return \"(void)\";\n  }\n\n  //=== VK_KHR_video_encode_h264 ===\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeH264CapabilityFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoEncodeH264CapabilityFlagBitsKHR::eHrdCompliance: return \"HrdCompliance\";\n      case VideoEncodeH264CapabilityFlagBitsKHR::ePredictionWeightTableGenerated: return \"PredictionWeightTableGenerated\";\n      case VideoEncodeH264CapabilityFlagBitsKHR::eRowUnalignedSlice: return \"RowUnalignedSlice\";\n      case VideoEncodeH264CapabilityFlagBitsKHR::eDifferentSliceType: return \"DifferentSliceType\";\n      case VideoEncodeH264CapabilityFlagBitsKHR::eBFrameInL0List: return \"BFrameInL0List\";\n      case VideoEncodeH264CapabilityFlagBitsKHR::eBFrameInL1List: return \"BFrameInL1List\";\n      case VideoEncodeH264CapabilityFlagBitsKHR::ePerPictureTypeMinMaxQp: return \"PerPictureTypeMinMaxQp\";\n      case VideoEncodeH264CapabilityFlagBitsKHR::ePerSliceConstantQp: return \"PerSliceConstantQp\";\n      case VideoEncodeH264CapabilityFlagBitsKHR::eGeneratePrefixNalu: return \"GeneratePrefixNalu\";\n      case VideoEncodeH264CapabilityFlagBitsKHR::eMbQpDiffWraparound: return \"MbQpDiffWraparound\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeH264StdFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoEncodeH264StdFlagBitsKHR::eSeparateColorPlaneFlagSet: return \"SeparateColorPlaneFlagSet\";\n      case VideoEncodeH264StdFlagBitsKHR::eQpprimeYZeroTransformBypassFlagSet: return \"QpprimeYZeroTransformBypassFlagSet\";\n      case VideoEncodeH264StdFlagBitsKHR::eScalingMatrixPresentFlagSet: return \"ScalingMatrixPresentFlagSet\";\n      case VideoEncodeH264StdFlagBitsKHR::eChromaQpIndexOffset: return \"ChromaQpIndexOffset\";\n      case VideoEncodeH264StdFlagBitsKHR::eSecondChromaQpIndexOffset: return \"SecondChromaQpIndexOffset\";\n      case VideoEncodeH264StdFlagBitsKHR::ePicInitQpMinus26: return \"PicInitQpMinus26\";\n      case VideoEncodeH264StdFlagBitsKHR::eWeightedPredFlagSet: return \"WeightedPredFlagSet\";\n      case VideoEncodeH264StdFlagBitsKHR::eWeightedBipredIdcExplicit: return \"WeightedBipredIdcExplicit\";\n      case VideoEncodeH264StdFlagBitsKHR::eWeightedBipredIdcImplicit: return \"WeightedBipredIdcImplicit\";\n      case VideoEncodeH264StdFlagBitsKHR::eTransform8X8ModeFlagSet: return \"Transform8X8ModeFlagSet\";\n      case VideoEncodeH264StdFlagBitsKHR::eDirectSpatialMvPredFlagUnset: return \"DirectSpatialMvPredFlagUnset\";\n      case VideoEncodeH264StdFlagBitsKHR::eEntropyCodingModeFlagUnset: return \"EntropyCodingModeFlagUnset\";\n      case VideoEncodeH264StdFlagBitsKHR::eEntropyCodingModeFlagSet: return \"EntropyCodingModeFlagSet\";\n      case VideoEncodeH264StdFlagBitsKHR::eDirect8X8InferenceFlagUnset: return \"Direct8X8InferenceFlagUnset\";\n      case VideoEncodeH264StdFlagBitsKHR::eConstrainedIntraPredFlagSet: return \"ConstrainedIntraPredFlagSet\";\n      case VideoEncodeH264StdFlagBitsKHR::eDeblockingFilterDisabled: return \"DeblockingFilterDisabled\";\n      case VideoEncodeH264StdFlagBitsKHR::eDeblockingFilterEnabled: return \"DeblockingFilterEnabled\";\n      case VideoEncodeH264StdFlagBitsKHR::eDeblockingFilterPartial: return \"DeblockingFilterPartial\";\n      case VideoEncodeH264StdFlagBitsKHR::eSliceQpDelta: return \"SliceQpDelta\";\n      case VideoEncodeH264StdFlagBitsKHR::eDifferentSliceQpDelta: return \"DifferentSliceQpDelta\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeH264RateControlFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoEncodeH264RateControlFlagBitsKHR::eAttemptHrdCompliance: return \"AttemptHrdCompliance\";\n      case VideoEncodeH264RateControlFlagBitsKHR::eRegularGop: return \"RegularGop\";\n      case VideoEncodeH264RateControlFlagBitsKHR::eReferencePatternFlat: return \"ReferencePatternFlat\";\n      case VideoEncodeH264RateControlFlagBitsKHR::eReferencePatternDyadic: return \"ReferencePatternDyadic\";\n      case VideoEncodeH264RateControlFlagBitsKHR::eTemporalLayerPatternDyadic: return \"TemporalLayerPatternDyadic\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_KHR_video_encode_h265 ===\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeH265CapabilityFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoEncodeH265CapabilityFlagBitsKHR::eHrdCompliance: return \"HrdCompliance\";\n      case VideoEncodeH265CapabilityFlagBitsKHR::ePredictionWeightTableGenerated: return \"PredictionWeightTableGenerated\";\n      case VideoEncodeH265CapabilityFlagBitsKHR::eRowUnalignedSliceSegment: return \"RowUnalignedSliceSegment\";\n      case VideoEncodeH265CapabilityFlagBitsKHR::eDifferentSliceSegmentType: return \"DifferentSliceSegmentType\";\n      case VideoEncodeH265CapabilityFlagBitsKHR::eBFrameInL0List: return \"BFrameInL0List\";\n      case VideoEncodeH265CapabilityFlagBitsKHR::eBFrameInL1List: return \"BFrameInL1List\";\n      case VideoEncodeH265CapabilityFlagBitsKHR::ePerPictureTypeMinMaxQp: return \"PerPictureTypeMinMaxQp\";\n      case VideoEncodeH265CapabilityFlagBitsKHR::ePerSliceSegmentConstantQp: return \"PerSliceSegmentConstantQp\";\n      case VideoEncodeH265CapabilityFlagBitsKHR::eMultipleTilesPerSliceSegment: return \"MultipleTilesPerSliceSegment\";\n      case VideoEncodeH265CapabilityFlagBitsKHR::eMultipleSliceSegmentsPerTile: return \"MultipleSliceSegmentsPerTile\";\n      case VideoEncodeH265CapabilityFlagBitsKHR::eCuQpDiffWraparound: return \"CuQpDiffWraparound\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeH265StdFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoEncodeH265StdFlagBitsKHR::eSeparateColorPlaneFlagSet: return \"SeparateColorPlaneFlagSet\";\n      case VideoEncodeH265StdFlagBitsKHR::eSampleAdaptiveOffsetEnabledFlagSet: return \"SampleAdaptiveOffsetEnabledFlagSet\";\n      case VideoEncodeH265StdFlagBitsKHR::eScalingListDataPresentFlagSet: return \"ScalingListDataPresentFlagSet\";\n      case VideoEncodeH265StdFlagBitsKHR::ePcmEnabledFlagSet: return \"PcmEnabledFlagSet\";\n      case VideoEncodeH265StdFlagBitsKHR::eSpsTemporalMvpEnabledFlagSet: return \"SpsTemporalMvpEnabledFlagSet\";\n      case VideoEncodeH265StdFlagBitsKHR::eInitQpMinus26: return \"InitQpMinus26\";\n      case VideoEncodeH265StdFlagBitsKHR::eWeightedPredFlagSet: return \"WeightedPredFlagSet\";\n      case VideoEncodeH265StdFlagBitsKHR::eWeightedBipredFlagSet: return \"WeightedBipredFlagSet\";\n      case VideoEncodeH265StdFlagBitsKHR::eLog2ParallelMergeLevelMinus2: return \"Log2ParallelMergeLevelMinus2\";\n      case VideoEncodeH265StdFlagBitsKHR::eSignDataHidingEnabledFlagSet: return \"SignDataHidingEnabledFlagSet\";\n      case VideoEncodeH265StdFlagBitsKHR::eTransformSkipEnabledFlagSet: return \"TransformSkipEnabledFlagSet\";\n      case VideoEncodeH265StdFlagBitsKHR::eTransformSkipEnabledFlagUnset: return \"TransformSkipEnabledFlagUnset\";\n      case VideoEncodeH265StdFlagBitsKHR::ePpsSliceChromaQpOffsetsPresentFlagSet: return \"PpsSliceChromaQpOffsetsPresentFlagSet\";\n      case VideoEncodeH265StdFlagBitsKHR::eTransquantBypassEnabledFlagSet: return \"TransquantBypassEnabledFlagSet\";\n      case VideoEncodeH265StdFlagBitsKHR::eConstrainedIntraPredFlagSet: return \"ConstrainedIntraPredFlagSet\";\n      case VideoEncodeH265StdFlagBitsKHR::eEntropyCodingSyncEnabledFlagSet: return \"EntropyCodingSyncEnabledFlagSet\";\n      case VideoEncodeH265StdFlagBitsKHR::eDeblockingFilterOverrideEnabledFlagSet: return \"DeblockingFilterOverrideEnabledFlagSet\";\n      case VideoEncodeH265StdFlagBitsKHR::eDependentSliceSegmentsEnabledFlagSet: return \"DependentSliceSegmentsEnabledFlagSet\";\n      case VideoEncodeH265StdFlagBitsKHR::eDependentSliceSegmentFlagSet: return \"DependentSliceSegmentFlagSet\";\n      case VideoEncodeH265StdFlagBitsKHR::eSliceQpDelta: return \"SliceQpDelta\";\n      case VideoEncodeH265StdFlagBitsKHR::eDifferentSliceQpDelta: return \"DifferentSliceQpDelta\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeH265CtbSizeFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoEncodeH265CtbSizeFlagBitsKHR::e16: return \"16\";\n      case VideoEncodeH265CtbSizeFlagBitsKHR::e32: return \"32\";\n      case VideoEncodeH265CtbSizeFlagBitsKHR::e64: return \"64\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeH265TransformBlockSizeFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoEncodeH265TransformBlockSizeFlagBitsKHR::e4: return \"4\";\n      case VideoEncodeH265TransformBlockSizeFlagBitsKHR::e8: return \"8\";\n      case VideoEncodeH265TransformBlockSizeFlagBitsKHR::e16: return \"16\";\n      case VideoEncodeH265TransformBlockSizeFlagBitsKHR::e32: return \"32\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeH265RateControlFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoEncodeH265RateControlFlagBitsKHR::eAttemptHrdCompliance: return \"AttemptHrdCompliance\";\n      case VideoEncodeH265RateControlFlagBitsKHR::eRegularGop: return \"RegularGop\";\n      case VideoEncodeH265RateControlFlagBitsKHR::eReferencePatternFlat: return \"ReferencePatternFlat\";\n      case VideoEncodeH265RateControlFlagBitsKHR::eReferencePatternDyadic: return \"ReferencePatternDyadic\";\n      case VideoEncodeH265RateControlFlagBitsKHR::eTemporalSubLayerPatternDyadic: return \"TemporalSubLayerPatternDyadic\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_KHR_video_decode_h264 ===\n\n  VULKAN_HPP_INLINE std::string to_string( VideoDecodeH264PictureLayoutFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoDecodeH264PictureLayoutFlagBitsKHR::eProgressive: return \"Progressive\";\n      case VideoDecodeH264PictureLayoutFlagBitsKHR::eInterlacedInterleavedLines: return \"InterlacedInterleavedLines\";\n      case VideoDecodeH264PictureLayoutFlagBitsKHR::eInterlacedSeparatePlanes: return \"InterlacedSeparatePlanes\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_AMD_shader_info ===\n\n  VULKAN_HPP_INLINE std::string to_string( ShaderInfoTypeAMD value )\n  {\n    switch ( value )\n    {\n      case ShaderInfoTypeAMD::eStatistics: return \"Statistics\";\n      case ShaderInfoTypeAMD::eBinary: return \"Binary\";\n      case ShaderInfoTypeAMD::eDisassembly: return \"Disassembly\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n#if defined( VK_USE_PLATFORM_GGP )\n  //=== VK_GGP_stream_descriptor_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( StreamDescriptorSurfaceCreateFlagBitsGGP )\n  {\n    return \"(void)\";\n  }\n#endif /*VK_USE_PLATFORM_GGP*/\n\n  //=== VK_NV_external_memory_capabilities ===\n\n  VULKAN_HPP_INLINE std::string to_string( ExternalMemoryHandleTypeFlagBitsNV value )\n  {\n    switch ( value )\n    {\n      case ExternalMemoryHandleTypeFlagBitsNV::eOpaqueWin32: return \"OpaqueWin32\";\n      case ExternalMemoryHandleTypeFlagBitsNV::eOpaqueWin32Kmt: return \"OpaqueWin32Kmt\";\n      case ExternalMemoryHandleTypeFlagBitsNV::eD3D11Image: return \"D3D11Image\";\n      case ExternalMemoryHandleTypeFlagBitsNV::eD3D11ImageKmt: return \"D3D11ImageKmt\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ExternalMemoryFeatureFlagBitsNV value )\n  {\n    switch ( value )\n    {\n      case ExternalMemoryFeatureFlagBitsNV::eDedicatedOnly: return \"DedicatedOnly\";\n      case ExternalMemoryFeatureFlagBitsNV::eExportable: return \"Exportable\";\n      case ExternalMemoryFeatureFlagBitsNV::eImportable: return \"Importable\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_EXT_validation_flags ===\n\n  VULKAN_HPP_INLINE std::string to_string( ValidationCheckEXT value )\n  {\n    switch ( value )\n    {\n      case ValidationCheckEXT::eAll: return \"All\";\n      case ValidationCheckEXT::eShaders: return \"Shaders\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n#if defined( VK_USE_PLATFORM_VI_NN )\n  //=== VK_NN_vi_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( ViSurfaceCreateFlagBitsNN )\n  {\n    return \"(void)\";\n  }\n#endif /*VK_USE_PLATFORM_VI_NN*/\n\n  //=== VK_EXT_conditional_rendering ===\n\n  VULKAN_HPP_INLINE std::string to_string( ConditionalRenderingFlagBitsEXT value )\n  {\n    switch ( value )\n    {\n      case ConditionalRenderingFlagBitsEXT::eInverted: return \"Inverted\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_EXT_display_surface_counter ===\n\n  VULKAN_HPP_INLINE std::string to_string( SurfaceCounterFlagBitsEXT value )\n  {\n    switch ( value )\n    {\n      case SurfaceCounterFlagBitsEXT::eVblank: return \"Vblank\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_EXT_display_control ===\n\n  VULKAN_HPP_INLINE std::string to_string( DisplayPowerStateEXT value )\n  {\n    switch ( value )\n    {\n      case DisplayPowerStateEXT::eOff: return \"Off\";\n      case DisplayPowerStateEXT::eSuspend: return \"Suspend\";\n      case DisplayPowerStateEXT::eOn: return \"On\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DeviceEventTypeEXT value )\n  {\n    switch ( value )\n    {\n      case DeviceEventTypeEXT::eDisplayHotplug: return \"DisplayHotplug\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DisplayEventTypeEXT value )\n  {\n    switch ( value )\n    {\n      case DisplayEventTypeEXT::eFirstPixelOut: return \"FirstPixelOut\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_NV_viewport_swizzle ===\n\n  VULKAN_HPP_INLINE std::string to_string( ViewportCoordinateSwizzleNV value )\n  {\n    switch ( value )\n    {\n      case ViewportCoordinateSwizzleNV::ePositiveX: return \"PositiveX\";\n      case ViewportCoordinateSwizzleNV::eNegativeX: return \"NegativeX\";\n      case ViewportCoordinateSwizzleNV::ePositiveY: return \"PositiveY\";\n      case ViewportCoordinateSwizzleNV::eNegativeY: return \"NegativeY\";\n      case ViewportCoordinateSwizzleNV::ePositiveZ: return \"PositiveZ\";\n      case ViewportCoordinateSwizzleNV::eNegativeZ: return \"NegativeZ\";\n      case ViewportCoordinateSwizzleNV::ePositiveW: return \"PositiveW\";\n      case ViewportCoordinateSwizzleNV::eNegativeW: return \"NegativeW\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineViewportSwizzleStateCreateFlagBitsNV )\n  {\n    return \"(void)\";\n  }\n\n  //=== VK_EXT_discard_rectangles ===\n\n  VULKAN_HPP_INLINE std::string to_string( DiscardRectangleModeEXT value )\n  {\n    switch ( value )\n    {\n      case DiscardRectangleModeEXT::eInclusive: return \"Inclusive\";\n      case DiscardRectangleModeEXT::eExclusive: return \"Exclusive\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineDiscardRectangleStateCreateFlagBitsEXT )\n  {\n    return \"(void)\";\n  }\n\n  //=== VK_EXT_conservative_rasterization ===\n\n  VULKAN_HPP_INLINE std::string to_string( ConservativeRasterizationModeEXT value )\n  {\n    switch ( value )\n    {\n      case ConservativeRasterizationModeEXT::eDisabled: return \"Disabled\";\n      case ConservativeRasterizationModeEXT::eOverestimate: return \"Overestimate\";\n      case ConservativeRasterizationModeEXT::eUnderestimate: return \"Underestimate\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineRasterizationConservativeStateCreateFlagBitsEXT )\n  {\n    return \"(void)\";\n  }\n\n  //=== VK_EXT_depth_clip_enable ===\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineRasterizationDepthClipStateCreateFlagBitsEXT )\n  {\n    return \"(void)\";\n  }\n\n  //=== VK_KHR_performance_query ===\n\n  VULKAN_HPP_INLINE std::string to_string( PerformanceCounterDescriptionFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case PerformanceCounterDescriptionFlagBitsKHR::ePerformanceImpacting: return \"PerformanceImpacting\";\n      case PerformanceCounterDescriptionFlagBitsKHR::eConcurrentlyImpacted: return \"ConcurrentlyImpacted\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PerformanceCounterScopeKHR value )\n  {\n    switch ( value )\n    {\n      case PerformanceCounterScopeKHR::eCommandBuffer: return \"CommandBuffer\";\n      case PerformanceCounterScopeKHR::eRenderPass: return \"RenderPass\";\n      case PerformanceCounterScopeKHR::eCommand: return \"Command\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PerformanceCounterStorageKHR value )\n  {\n    switch ( value )\n    {\n      case PerformanceCounterStorageKHR::eInt32: return \"Int32\";\n      case PerformanceCounterStorageKHR::eInt64: return \"Int64\";\n      case PerformanceCounterStorageKHR::eUint32: return \"Uint32\";\n      case PerformanceCounterStorageKHR::eUint64: return \"Uint64\";\n      case PerformanceCounterStorageKHR::eFloat32: return \"Float32\";\n      case PerformanceCounterStorageKHR::eFloat64: return \"Float64\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PerformanceCounterUnitKHR value )\n  {\n    switch ( value )\n    {\n      case PerformanceCounterUnitKHR::eGeneric: return \"Generic\";\n      case PerformanceCounterUnitKHR::ePercentage: return \"Percentage\";\n      case PerformanceCounterUnitKHR::eNanoseconds: return \"Nanoseconds\";\n      case PerformanceCounterUnitKHR::eBytes: return \"Bytes\";\n      case PerformanceCounterUnitKHR::eBytesPerSecond: return \"BytesPerSecond\";\n      case PerformanceCounterUnitKHR::eKelvin: return \"Kelvin\";\n      case PerformanceCounterUnitKHR::eWatts: return \"Watts\";\n      case PerformanceCounterUnitKHR::eVolts: return \"Volts\";\n      case PerformanceCounterUnitKHR::eAmps: return \"Amps\";\n      case PerformanceCounterUnitKHR::eHertz: return \"Hertz\";\n      case PerformanceCounterUnitKHR::eCycles: return \"Cycles\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( AcquireProfilingLockFlagBitsKHR )\n  {\n    return \"(void)\";\n  }\n\n#if defined( VK_USE_PLATFORM_IOS_MVK )\n  //=== VK_MVK_ios_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( IOSSurfaceCreateFlagBitsMVK )\n  {\n    return \"(void)\";\n  }\n#endif /*VK_USE_PLATFORM_IOS_MVK*/\n\n#if defined( VK_USE_PLATFORM_MACOS_MVK )\n  //=== VK_MVK_macos_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( MacOSSurfaceCreateFlagBitsMVK )\n  {\n    return \"(void)\";\n  }\n#endif /*VK_USE_PLATFORM_MACOS_MVK*/\n\n  //=== VK_EXT_debug_utils ===\n\n  VULKAN_HPP_INLINE std::string to_string( DebugUtilsMessageSeverityFlagBitsEXT value )\n  {\n    switch ( value )\n    {\n      case DebugUtilsMessageSeverityFlagBitsEXT::eVerbose: return \"Verbose\";\n      case DebugUtilsMessageSeverityFlagBitsEXT::eInfo: return \"Info\";\n      case DebugUtilsMessageSeverityFlagBitsEXT::eWarning: return \"Warning\";\n      case DebugUtilsMessageSeverityFlagBitsEXT::eError: return \"Error\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DebugUtilsMessageTypeFlagBitsEXT value )\n  {\n    switch ( value )\n    {\n      case DebugUtilsMessageTypeFlagBitsEXT::eGeneral: return \"General\";\n      case DebugUtilsMessageTypeFlagBitsEXT::eValidation: return \"Validation\";\n      case DebugUtilsMessageTypeFlagBitsEXT::ePerformance: return \"Performance\";\n      case DebugUtilsMessageTypeFlagBitsEXT::eDeviceAddressBinding: return \"DeviceAddressBinding\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DebugUtilsMessengerCallbackDataFlagBitsEXT )\n  {\n    return \"(void)\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DebugUtilsMessengerCreateFlagBitsEXT )\n  {\n    return \"(void)\";\n  }\n\n  //=== VK_EXT_blend_operation_advanced ===\n\n  VULKAN_HPP_INLINE std::string to_string( BlendOverlapEXT value )\n  {\n    switch ( value )\n    {\n      case BlendOverlapEXT::eUncorrelated: return \"Uncorrelated\";\n      case BlendOverlapEXT::eDisjoint: return \"Disjoint\";\n      case BlendOverlapEXT::eConjoint: return \"Conjoint\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_NV_fragment_coverage_to_color ===\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineCoverageToColorStateCreateFlagBitsNV )\n  {\n    return \"(void)\";\n  }\n\n  //=== VK_KHR_acceleration_structure ===\n\n  VULKAN_HPP_INLINE std::string to_string( AccelerationStructureTypeKHR value )\n  {\n    switch ( value )\n    {\n      case AccelerationStructureTypeKHR::eTopLevel: return \"TopLevel\";\n      case AccelerationStructureTypeKHR::eBottomLevel: return \"BottomLevel\";\n      case AccelerationStructureTypeKHR::eGeneric: return \"Generic\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( AccelerationStructureBuildTypeKHR value )\n  {\n    switch ( value )\n    {\n      case AccelerationStructureBuildTypeKHR::eHost: return \"Host\";\n      case AccelerationStructureBuildTypeKHR::eDevice: return \"Device\";\n      case AccelerationStructureBuildTypeKHR::eHostOrDevice: return \"HostOrDevice\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( GeometryFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case GeometryFlagBitsKHR::eOpaque: return \"Opaque\";\n      case GeometryFlagBitsKHR::eNoDuplicateAnyHitInvocation: return \"NoDuplicateAnyHitInvocation\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( GeometryInstanceFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case GeometryInstanceFlagBitsKHR::eTriangleFacingCullDisable: return \"TriangleFacingCullDisable\";\n      case GeometryInstanceFlagBitsKHR::eTriangleFlipFacing: return \"TriangleFlipFacing\";\n      case GeometryInstanceFlagBitsKHR::eForceOpaque: return \"ForceOpaque\";\n      case GeometryInstanceFlagBitsKHR::eForceNoOpaque: return \"ForceNoOpaque\";\n      case GeometryInstanceFlagBitsKHR::eForceOpacityMicromap2StateEXT: return \"ForceOpacityMicromap2StateEXT\";\n      case GeometryInstanceFlagBitsKHR::eDisableOpacityMicromapsEXT: return \"DisableOpacityMicromapsEXT\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( BuildAccelerationStructureFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case BuildAccelerationStructureFlagBitsKHR::eAllowUpdate: return \"AllowUpdate\";\n      case BuildAccelerationStructureFlagBitsKHR::eAllowCompaction: return \"AllowCompaction\";\n      case BuildAccelerationStructureFlagBitsKHR::ePreferFastTrace: return \"PreferFastTrace\";\n      case BuildAccelerationStructureFlagBitsKHR::ePreferFastBuild: return \"PreferFastBuild\";\n      case BuildAccelerationStructureFlagBitsKHR::eLowMemory: return \"LowMemory\";\n      case BuildAccelerationStructureFlagBitsKHR::eMotionNV: return \"MotionNV\";\n      case BuildAccelerationStructureFlagBitsKHR::eAllowOpacityMicromapUpdateEXT: return \"AllowOpacityMicromapUpdateEXT\";\n      case BuildAccelerationStructureFlagBitsKHR::eAllowDisableOpacityMicromapsEXT: return \"AllowDisableOpacityMicromapsEXT\";\n      case BuildAccelerationStructureFlagBitsKHR::eAllowOpacityMicromapDataUpdateEXT: return \"AllowOpacityMicromapDataUpdateEXT\";\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      case BuildAccelerationStructureFlagBitsKHR::eAllowDisplacementMicromapUpdateNV: return \"AllowDisplacementMicromapUpdateNV\";\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n      case BuildAccelerationStructureFlagBitsKHR::eAllowDataAccess: return \"AllowDataAccess\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( CopyAccelerationStructureModeKHR value )\n  {\n    switch ( value )\n    {\n      case CopyAccelerationStructureModeKHR::eClone: return \"Clone\";\n      case CopyAccelerationStructureModeKHR::eCompact: return \"Compact\";\n      case CopyAccelerationStructureModeKHR::eSerialize: return \"Serialize\";\n      case CopyAccelerationStructureModeKHR::eDeserialize: return \"Deserialize\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( GeometryTypeKHR value )\n  {\n    switch ( value )\n    {\n      case GeometryTypeKHR::eTriangles: return \"Triangles\";\n      case GeometryTypeKHR::eAabbs: return \"Aabbs\";\n      case GeometryTypeKHR::eInstances: return \"Instances\";\n      case GeometryTypeKHR::eSpheresNV: return \"SpheresNV\";\n      case GeometryTypeKHR::eLinearSweptSpheresNV: return \"LinearSweptSpheresNV\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( AccelerationStructureCompatibilityKHR value )\n  {\n    switch ( value )\n    {\n      case AccelerationStructureCompatibilityKHR::eCompatible: return \"Compatible\";\n      case AccelerationStructureCompatibilityKHR::eIncompatible: return \"Incompatible\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( AccelerationStructureCreateFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case AccelerationStructureCreateFlagBitsKHR::eDeviceAddressCaptureReplay: return \"DeviceAddressCaptureReplay\";\n      case AccelerationStructureCreateFlagBitsKHR::eDescriptorBufferCaptureReplayEXT: return \"DescriptorBufferCaptureReplayEXT\";\n      case AccelerationStructureCreateFlagBitsKHR::eMotionNV: return \"MotionNV\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( BuildAccelerationStructureModeKHR value )\n  {\n    switch ( value )\n    {\n      case BuildAccelerationStructureModeKHR::eBuild: return \"Build\";\n      case BuildAccelerationStructureModeKHR::eUpdate: return \"Update\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_KHR_ray_tracing_pipeline ===\n\n  VULKAN_HPP_INLINE std::string to_string( RayTracingShaderGroupTypeKHR value )\n  {\n    switch ( value )\n    {\n      case RayTracingShaderGroupTypeKHR::eGeneral: return \"General\";\n      case RayTracingShaderGroupTypeKHR::eTrianglesHitGroup: return \"TrianglesHitGroup\";\n      case RayTracingShaderGroupTypeKHR::eProceduralHitGroup: return \"ProceduralHitGroup\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ShaderGroupShaderKHR value )\n  {\n    switch ( value )\n    {\n      case ShaderGroupShaderKHR::eGeneral: return \"General\";\n      case ShaderGroupShaderKHR::eClosestHit: return \"ClosestHit\";\n      case ShaderGroupShaderKHR::eAnyHit: return \"AnyHit\";\n      case ShaderGroupShaderKHR::eIntersection: return \"Intersection\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_NV_framebuffer_mixed_samples ===\n\n  VULKAN_HPP_INLINE std::string to_string( CoverageModulationModeNV value )\n  {\n    switch ( value )\n    {\n      case CoverageModulationModeNV::eNone: return \"None\";\n      case CoverageModulationModeNV::eRgb: return \"Rgb\";\n      case CoverageModulationModeNV::eAlpha: return \"Alpha\";\n      case CoverageModulationModeNV::eRgba: return \"Rgba\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineCoverageModulationStateCreateFlagBitsNV )\n  {\n    return \"(void)\";\n  }\n\n  //=== VK_EXT_validation_cache ===\n\n  VULKAN_HPP_INLINE std::string to_string( ValidationCacheHeaderVersionEXT value )\n  {\n    switch ( value )\n    {\n      case ValidationCacheHeaderVersionEXT::eOne: return \"One\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ValidationCacheCreateFlagBitsEXT )\n  {\n    return \"(void)\";\n  }\n\n  //=== VK_NV_shading_rate_image ===\n\n  VULKAN_HPP_INLINE std::string to_string( ShadingRatePaletteEntryNV value )\n  {\n    switch ( value )\n    {\n      case ShadingRatePaletteEntryNV::eNoInvocations: return \"NoInvocations\";\n      case ShadingRatePaletteEntryNV::e16InvocationsPerPixel: return \"16InvocationsPerPixel\";\n      case ShadingRatePaletteEntryNV::e8InvocationsPerPixel: return \"8InvocationsPerPixel\";\n      case ShadingRatePaletteEntryNV::e4InvocationsPerPixel: return \"4InvocationsPerPixel\";\n      case ShadingRatePaletteEntryNV::e2InvocationsPerPixel: return \"2InvocationsPerPixel\";\n      case ShadingRatePaletteEntryNV::e1InvocationPerPixel: return \"1InvocationPerPixel\";\n      case ShadingRatePaletteEntryNV::e1InvocationPer2X1Pixels: return \"1InvocationPer2X1Pixels\";\n      case ShadingRatePaletteEntryNV::e1InvocationPer1X2Pixels: return \"1InvocationPer1X2Pixels\";\n      case ShadingRatePaletteEntryNV::e1InvocationPer2X2Pixels: return \"1InvocationPer2X2Pixels\";\n      case ShadingRatePaletteEntryNV::e1InvocationPer4X2Pixels: return \"1InvocationPer4X2Pixels\";\n      case ShadingRatePaletteEntryNV::e1InvocationPer2X4Pixels: return \"1InvocationPer2X4Pixels\";\n      case ShadingRatePaletteEntryNV::e1InvocationPer4X4Pixels: return \"1InvocationPer4X4Pixels\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( CoarseSampleOrderTypeNV value )\n  {\n    switch ( value )\n    {\n      case CoarseSampleOrderTypeNV::eDefault: return \"Default\";\n      case CoarseSampleOrderTypeNV::eCustom: return \"Custom\";\n      case CoarseSampleOrderTypeNV::ePixelMajor: return \"PixelMajor\";\n      case CoarseSampleOrderTypeNV::eSampleMajor: return \"SampleMajor\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_NV_ray_tracing ===\n\n  VULKAN_HPP_INLINE std::string to_string( AccelerationStructureMemoryRequirementsTypeNV value )\n  {\n    switch ( value )\n    {\n      case AccelerationStructureMemoryRequirementsTypeNV::eObject: return \"Object\";\n      case AccelerationStructureMemoryRequirementsTypeNV::eBuildScratch: return \"BuildScratch\";\n      case AccelerationStructureMemoryRequirementsTypeNV::eUpdateScratch: return \"UpdateScratch\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_AMD_pipeline_compiler_control ===\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineCompilerControlFlagBitsAMD )\n  {\n    return \"(void)\";\n  }\n\n  //=== VK_AMD_memory_overallocation_behavior ===\n\n  VULKAN_HPP_INLINE std::string to_string( MemoryOverallocationBehaviorAMD value )\n  {\n    switch ( value )\n    {\n      case MemoryOverallocationBehaviorAMD::eDefault: return \"Default\";\n      case MemoryOverallocationBehaviorAMD::eAllowed: return \"Allowed\";\n      case MemoryOverallocationBehaviorAMD::eDisallowed: return \"Disallowed\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_INTEL_performance_query ===\n\n  VULKAN_HPP_INLINE std::string to_string( PerformanceConfigurationTypeINTEL value )\n  {\n    switch ( value )\n    {\n      case PerformanceConfigurationTypeINTEL::eCommandQueueMetricsDiscoveryActivated: return \"CommandQueueMetricsDiscoveryActivated\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( QueryPoolSamplingModeINTEL value )\n  {\n    switch ( value )\n    {\n      case QueryPoolSamplingModeINTEL::eManual: return \"Manual\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PerformanceOverrideTypeINTEL value )\n  {\n    switch ( value )\n    {\n      case PerformanceOverrideTypeINTEL::eNullHardware: return \"NullHardware\";\n      case PerformanceOverrideTypeINTEL::eFlushGpuCaches: return \"FlushGpuCaches\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PerformanceParameterTypeINTEL value )\n  {\n    switch ( value )\n    {\n      case PerformanceParameterTypeINTEL::eHwCountersSupported: return \"HwCountersSupported\";\n      case PerformanceParameterTypeINTEL::eStreamMarkerValidBits: return \"StreamMarkerValidBits\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PerformanceValueTypeINTEL value )\n  {\n    switch ( value )\n    {\n      case PerformanceValueTypeINTEL::eUint32: return \"Uint32\";\n      case PerformanceValueTypeINTEL::eUint64: return \"Uint64\";\n      case PerformanceValueTypeINTEL::eFloat: return \"Float\";\n      case PerformanceValueTypeINTEL::eBool: return \"Bool\";\n      case PerformanceValueTypeINTEL::eString: return \"String\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_imagepipe_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( ImagePipeSurfaceCreateFlagBitsFUCHSIA )\n  {\n    return \"(void)\";\n  }\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  //=== VK_EXT_metal_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( MetalSurfaceCreateFlagBitsEXT )\n  {\n    return \"(void)\";\n  }\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n  //=== VK_KHR_fragment_shading_rate ===\n\n  VULKAN_HPP_INLINE std::string to_string( FragmentShadingRateCombinerOpKHR value )\n  {\n    switch ( value )\n    {\n      case FragmentShadingRateCombinerOpKHR::eKeep: return \"Keep\";\n      case FragmentShadingRateCombinerOpKHR::eReplace: return \"Replace\";\n      case FragmentShadingRateCombinerOpKHR::eMin: return \"Min\";\n      case FragmentShadingRateCombinerOpKHR::eMax: return \"Max\";\n      case FragmentShadingRateCombinerOpKHR::eMul: return \"Mul\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_AMD_shader_core_properties2 ===\n\n  VULKAN_HPP_INLINE std::string to_string( ShaderCorePropertiesFlagBitsAMD )\n  {\n    return \"(void)\";\n  }\n\n  //=== VK_EXT_validation_features ===\n\n  VULKAN_HPP_INLINE std::string to_string( ValidationFeatureEnableEXT value )\n  {\n    switch ( value )\n    {\n      case ValidationFeatureEnableEXT::eGpuAssisted: return \"GpuAssisted\";\n      case ValidationFeatureEnableEXT::eGpuAssistedReserveBindingSlot: return \"GpuAssistedReserveBindingSlot\";\n      case ValidationFeatureEnableEXT::eBestPractices: return \"BestPractices\";\n      case ValidationFeatureEnableEXT::eDebugPrintf: return \"DebugPrintf\";\n      case ValidationFeatureEnableEXT::eSynchronizationValidation: return \"SynchronizationValidation\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ValidationFeatureDisableEXT value )\n  {\n    switch ( value )\n    {\n      case ValidationFeatureDisableEXT::eAll: return \"All\";\n      case ValidationFeatureDisableEXT::eShaders: return \"Shaders\";\n      case ValidationFeatureDisableEXT::eThreadSafety: return \"ThreadSafety\";\n      case ValidationFeatureDisableEXT::eApiParameters: return \"ApiParameters\";\n      case ValidationFeatureDisableEXT::eObjectLifetimes: return \"ObjectLifetimes\";\n      case ValidationFeatureDisableEXT::eCoreChecks: return \"CoreChecks\";\n      case ValidationFeatureDisableEXT::eUniqueHandles: return \"UniqueHandles\";\n      case ValidationFeatureDisableEXT::eShaderValidationCache: return \"ShaderValidationCache\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_NV_coverage_reduction_mode ===\n\n  VULKAN_HPP_INLINE std::string to_string( CoverageReductionModeNV value )\n  {\n    switch ( value )\n    {\n      case CoverageReductionModeNV::eMerge: return \"Merge\";\n      case CoverageReductionModeNV::eTruncate: return \"Truncate\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineCoverageReductionStateCreateFlagBitsNV )\n  {\n    return \"(void)\";\n  }\n\n  //=== VK_EXT_provoking_vertex ===\n\n  VULKAN_HPP_INLINE std::string to_string( ProvokingVertexModeEXT value )\n  {\n    switch ( value )\n    {\n      case ProvokingVertexModeEXT::eFirstVertex: return \"FirstVertex\";\n      case ProvokingVertexModeEXT::eLastVertex: return \"LastVertex\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n#if defined( VK_USE_PLATFORM_WIN32_KHR )\n  //=== VK_EXT_full_screen_exclusive ===\n\n  VULKAN_HPP_INLINE std::string to_string( FullScreenExclusiveEXT value )\n  {\n    switch ( value )\n    {\n      case FullScreenExclusiveEXT::eDefault: return \"Default\";\n      case FullScreenExclusiveEXT::eAllowed: return \"Allowed\";\n      case FullScreenExclusiveEXT::eDisallowed: return \"Disallowed\";\n      case FullScreenExclusiveEXT::eApplicationControlled: return \"ApplicationControlled\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n#endif /*VK_USE_PLATFORM_WIN32_KHR*/\n\n  //=== VK_EXT_headless_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( HeadlessSurfaceCreateFlagBitsEXT )\n  {\n    return \"(void)\";\n  }\n\n  //=== VK_KHR_pipeline_executable_properties ===\n\n  VULKAN_HPP_INLINE std::string to_string( PipelineExecutableStatisticFormatKHR value )\n  {\n    switch ( value )\n    {\n      case PipelineExecutableStatisticFormatKHR::eBool32: return \"Bool32\";\n      case PipelineExecutableStatisticFormatKHR::eInt64: return \"Int64\";\n      case PipelineExecutableStatisticFormatKHR::eUint64: return \"Uint64\";\n      case PipelineExecutableStatisticFormatKHR::eFloat64: return \"Float64\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_EXT_surface_maintenance1 ===\n\n  VULKAN_HPP_INLINE std::string to_string( PresentScalingFlagBitsEXT value )\n  {\n    switch ( value )\n    {\n      case PresentScalingFlagBitsEXT::eOneToOne: return \"OneToOne\";\n      case PresentScalingFlagBitsEXT::eAspectRatioStretch: return \"AspectRatioStretch\";\n      case PresentScalingFlagBitsEXT::eStretch: return \"Stretch\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PresentGravityFlagBitsEXT value )\n  {\n    switch ( value )\n    {\n      case PresentGravityFlagBitsEXT::eMin: return \"Min\";\n      case PresentGravityFlagBitsEXT::eMax: return \"Max\";\n      case PresentGravityFlagBitsEXT::eCentered: return \"Centered\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_NV_device_generated_commands ===\n\n  VULKAN_HPP_INLINE std::string to_string( IndirectStateFlagBitsNV value )\n  {\n    switch ( value )\n    {\n      case IndirectStateFlagBitsNV::eFlagFrontface: return \"FlagFrontface\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( IndirectCommandsTokenTypeNV value )\n  {\n    switch ( value )\n    {\n      case IndirectCommandsTokenTypeNV::eShaderGroup: return \"ShaderGroup\";\n      case IndirectCommandsTokenTypeNV::eStateFlags: return \"StateFlags\";\n      case IndirectCommandsTokenTypeNV::eIndexBuffer: return \"IndexBuffer\";\n      case IndirectCommandsTokenTypeNV::eVertexBuffer: return \"VertexBuffer\";\n      case IndirectCommandsTokenTypeNV::ePushConstant: return \"PushConstant\";\n      case IndirectCommandsTokenTypeNV::eDrawIndexed: return \"DrawIndexed\";\n      case IndirectCommandsTokenTypeNV::eDraw: return \"Draw\";\n      case IndirectCommandsTokenTypeNV::eDrawTasks: return \"DrawTasks\";\n      case IndirectCommandsTokenTypeNV::eDrawMeshTasks: return \"DrawMeshTasks\";\n      case IndirectCommandsTokenTypeNV::ePipeline: return \"Pipeline\";\n      case IndirectCommandsTokenTypeNV::eDispatch: return \"Dispatch\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( IndirectCommandsLayoutUsageFlagBitsNV value )\n  {\n    switch ( value )\n    {\n      case IndirectCommandsLayoutUsageFlagBitsNV::eExplicitPreprocess: return \"ExplicitPreprocess\";\n      case IndirectCommandsLayoutUsageFlagBitsNV::eIndexedSequences: return \"IndexedSequences\";\n      case IndirectCommandsLayoutUsageFlagBitsNV::eUnorderedSequences: return \"UnorderedSequences\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_EXT_depth_bias_control ===\n\n  VULKAN_HPP_INLINE std::string to_string( DepthBiasRepresentationEXT value )\n  {\n    switch ( value )\n    {\n      case DepthBiasRepresentationEXT::eLeastRepresentableValueFormat: return \"LeastRepresentableValueFormat\";\n      case DepthBiasRepresentationEXT::eLeastRepresentableValueForceUnorm: return \"LeastRepresentableValueForceUnorm\";\n      case DepthBiasRepresentationEXT::eFloat: return \"Float\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_EXT_device_memory_report ===\n\n  VULKAN_HPP_INLINE std::string to_string( DeviceMemoryReportEventTypeEXT value )\n  {\n    switch ( value )\n    {\n      case DeviceMemoryReportEventTypeEXT::eAllocate: return \"Allocate\";\n      case DeviceMemoryReportEventTypeEXT::eFree: return \"Free\";\n      case DeviceMemoryReportEventTypeEXT::eImport: return \"Import\";\n      case DeviceMemoryReportEventTypeEXT::eUnimport: return \"Unimport\";\n      case DeviceMemoryReportEventTypeEXT::eAllocationFailed: return \"AllocationFailed\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DeviceMemoryReportFlagBitsEXT )\n  {\n    return \"(void)\";\n  }\n\n  //=== VK_KHR_video_encode_queue ===\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeCapabilityFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoEncodeCapabilityFlagBitsKHR::ePrecedingExternallyEncodedBytes: return \"PrecedingExternallyEncodedBytes\";\n      case VideoEncodeCapabilityFlagBitsKHR::eInsufficientBitstreamBufferRangeDetection: return \"InsufficientBitstreamBufferRangeDetection\";\n      case VideoEncodeCapabilityFlagBitsKHR::eQuantizationDeltaMap: return \"QuantizationDeltaMap\";\n      case VideoEncodeCapabilityFlagBitsKHR::eEmphasisMap: return \"EmphasisMap\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeFeedbackFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoEncodeFeedbackFlagBitsKHR::eBitstreamBufferOffset: return \"BitstreamBufferOffset\";\n      case VideoEncodeFeedbackFlagBitsKHR::eBitstreamBytesWritten: return \"BitstreamBytesWritten\";\n      case VideoEncodeFeedbackFlagBitsKHR::eBitstreamHasOverrides: return \"BitstreamHasOverrides\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeUsageFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoEncodeUsageFlagBitsKHR::eDefault: return \"Default\";\n      case VideoEncodeUsageFlagBitsKHR::eTranscoding: return \"Transcoding\";\n      case VideoEncodeUsageFlagBitsKHR::eStreaming: return \"Streaming\";\n      case VideoEncodeUsageFlagBitsKHR::eRecording: return \"Recording\";\n      case VideoEncodeUsageFlagBitsKHR::eConferencing: return \"Conferencing\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeContentFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoEncodeContentFlagBitsKHR::eDefault: return \"Default\";\n      case VideoEncodeContentFlagBitsKHR::eCamera: return \"Camera\";\n      case VideoEncodeContentFlagBitsKHR::eDesktop: return \"Desktop\";\n      case VideoEncodeContentFlagBitsKHR::eRendered: return \"Rendered\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeTuningModeKHR value )\n  {\n    switch ( value )\n    {\n      case VideoEncodeTuningModeKHR::eDefault: return \"Default\";\n      case VideoEncodeTuningModeKHR::eHighQuality: return \"HighQuality\";\n      case VideoEncodeTuningModeKHR::eLowLatency: return \"LowLatency\";\n      case VideoEncodeTuningModeKHR::eUltraLowLatency: return \"UltraLowLatency\";\n      case VideoEncodeTuningModeKHR::eLossless: return \"Lossless\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeRateControlModeFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoEncodeRateControlModeFlagBitsKHR::eDefault: return \"Default\";\n      case VideoEncodeRateControlModeFlagBitsKHR::eDisabled: return \"Disabled\";\n      case VideoEncodeRateControlModeFlagBitsKHR::eCbr: return \"Cbr\";\n      case VideoEncodeRateControlModeFlagBitsKHR::eVbr: return \"Vbr\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoEncodeFlagBitsKHR::eWithQuantizationDeltaMap: return \"WithQuantizationDeltaMap\";\n      case VideoEncodeFlagBitsKHR::eWithEmphasisMap: return \"WithEmphasisMap\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeRateControlFlagBitsKHR )\n  {\n    return \"(void)\";\n  }\n\n  //=== VK_NV_device_diagnostics_config ===\n\n  VULKAN_HPP_INLINE std::string to_string( DeviceDiagnosticsConfigFlagBitsNV value )\n  {\n    switch ( value )\n    {\n      case DeviceDiagnosticsConfigFlagBitsNV::eEnableShaderDebugInfo: return \"EnableShaderDebugInfo\";\n      case DeviceDiagnosticsConfigFlagBitsNV::eEnableResourceTracking: return \"EnableResourceTracking\";\n      case DeviceDiagnosticsConfigFlagBitsNV::eEnableAutomaticCheckpoints: return \"EnableAutomaticCheckpoints\";\n      case DeviceDiagnosticsConfigFlagBitsNV::eEnableShaderErrorReporting: return \"EnableShaderErrorReporting\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n#if defined( VK_USE_PLATFORM_METAL_EXT )\n  //=== VK_EXT_metal_objects ===\n\n  VULKAN_HPP_INLINE std::string to_string( ExportMetalObjectTypeFlagBitsEXT value )\n  {\n    switch ( value )\n    {\n      case ExportMetalObjectTypeFlagBitsEXT::eMetalDevice: return \"MetalDevice\";\n      case ExportMetalObjectTypeFlagBitsEXT::eMetalCommandQueue: return \"MetalCommandQueue\";\n      case ExportMetalObjectTypeFlagBitsEXT::eMetalBuffer: return \"MetalBuffer\";\n      case ExportMetalObjectTypeFlagBitsEXT::eMetalTexture: return \"MetalTexture\";\n      case ExportMetalObjectTypeFlagBitsEXT::eMetalIosurface: return \"MetalIosurface\";\n      case ExportMetalObjectTypeFlagBitsEXT::eMetalSharedEvent: return \"MetalSharedEvent\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n#endif /*VK_USE_PLATFORM_METAL_EXT*/\n\n  //=== VK_EXT_graphics_pipeline_library ===\n\n  VULKAN_HPP_INLINE std::string to_string( GraphicsPipelineLibraryFlagBitsEXT value )\n  {\n    switch ( value )\n    {\n      case GraphicsPipelineLibraryFlagBitsEXT::eVertexInputInterface: return \"VertexInputInterface\";\n      case GraphicsPipelineLibraryFlagBitsEXT::ePreRasterizationShaders: return \"PreRasterizationShaders\";\n      case GraphicsPipelineLibraryFlagBitsEXT::eFragmentShader: return \"FragmentShader\";\n      case GraphicsPipelineLibraryFlagBitsEXT::eFragmentOutputInterface: return \"FragmentOutputInterface\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_NV_fragment_shading_rate_enums ===\n\n  VULKAN_HPP_INLINE std::string to_string( FragmentShadingRateNV value )\n  {\n    switch ( value )\n    {\n      case FragmentShadingRateNV::e1InvocationPerPixel: return \"1InvocationPerPixel\";\n      case FragmentShadingRateNV::e1InvocationPer1X2Pixels: return \"1InvocationPer1X2Pixels\";\n      case FragmentShadingRateNV::e1InvocationPer2X1Pixels: return \"1InvocationPer2X1Pixels\";\n      case FragmentShadingRateNV::e1InvocationPer2X2Pixels: return \"1InvocationPer2X2Pixels\";\n      case FragmentShadingRateNV::e1InvocationPer2X4Pixels: return \"1InvocationPer2X4Pixels\";\n      case FragmentShadingRateNV::e1InvocationPer4X2Pixels: return \"1InvocationPer4X2Pixels\";\n      case FragmentShadingRateNV::e1InvocationPer4X4Pixels: return \"1InvocationPer4X4Pixels\";\n      case FragmentShadingRateNV::e2InvocationsPerPixel: return \"2InvocationsPerPixel\";\n      case FragmentShadingRateNV::e4InvocationsPerPixel: return \"4InvocationsPerPixel\";\n      case FragmentShadingRateNV::e8InvocationsPerPixel: return \"8InvocationsPerPixel\";\n      case FragmentShadingRateNV::e16InvocationsPerPixel: return \"16InvocationsPerPixel\";\n      case FragmentShadingRateNV::eNoInvocations: return \"NoInvocations\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( FragmentShadingRateTypeNV value )\n  {\n    switch ( value )\n    {\n      case FragmentShadingRateTypeNV::eFragmentSize: return \"FragmentSize\";\n      case FragmentShadingRateTypeNV::eEnums: return \"Enums\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_NV_ray_tracing_motion_blur ===\n\n  VULKAN_HPP_INLINE std::string to_string( AccelerationStructureMotionInstanceTypeNV value )\n  {\n    switch ( value )\n    {\n      case AccelerationStructureMotionInstanceTypeNV::eStatic: return \"Static\";\n      case AccelerationStructureMotionInstanceTypeNV::eMatrixMotion: return \"MatrixMotion\";\n      case AccelerationStructureMotionInstanceTypeNV::eSrtMotion: return \"SrtMotion\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( AccelerationStructureMotionInfoFlagBitsNV )\n  {\n    return \"(void)\";\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( AccelerationStructureMotionInstanceFlagBitsNV )\n  {\n    return \"(void)\";\n  }\n\n  //=== VK_EXT_image_compression_control ===\n\n  VULKAN_HPP_INLINE std::string to_string( ImageCompressionFlagBitsEXT value )\n  {\n    switch ( value )\n    {\n      case ImageCompressionFlagBitsEXT::eDefault: return \"Default\";\n      case ImageCompressionFlagBitsEXT::eFixedRateDefault: return \"FixedRateDefault\";\n      case ImageCompressionFlagBitsEXT::eFixedRateExplicit: return \"FixedRateExplicit\";\n      case ImageCompressionFlagBitsEXT::eDisabled: return \"Disabled\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ImageCompressionFixedRateFlagBitsEXT value )\n  {\n    switch ( value )\n    {\n      case ImageCompressionFixedRateFlagBitsEXT::eNone: return \"None\";\n      case ImageCompressionFixedRateFlagBitsEXT::e1Bpc: return \"1Bpc\";\n      case ImageCompressionFixedRateFlagBitsEXT::e2Bpc: return \"2Bpc\";\n      case ImageCompressionFixedRateFlagBitsEXT::e3Bpc: return \"3Bpc\";\n      case ImageCompressionFixedRateFlagBitsEXT::e4Bpc: return \"4Bpc\";\n      case ImageCompressionFixedRateFlagBitsEXT::e5Bpc: return \"5Bpc\";\n      case ImageCompressionFixedRateFlagBitsEXT::e6Bpc: return \"6Bpc\";\n      case ImageCompressionFixedRateFlagBitsEXT::e7Bpc: return \"7Bpc\";\n      case ImageCompressionFixedRateFlagBitsEXT::e8Bpc: return \"8Bpc\";\n      case ImageCompressionFixedRateFlagBitsEXT::e9Bpc: return \"9Bpc\";\n      case ImageCompressionFixedRateFlagBitsEXT::e10Bpc: return \"10Bpc\";\n      case ImageCompressionFixedRateFlagBitsEXT::e11Bpc: return \"11Bpc\";\n      case ImageCompressionFixedRateFlagBitsEXT::e12Bpc: return \"12Bpc\";\n      case ImageCompressionFixedRateFlagBitsEXT::e13Bpc: return \"13Bpc\";\n      case ImageCompressionFixedRateFlagBitsEXT::e14Bpc: return \"14Bpc\";\n      case ImageCompressionFixedRateFlagBitsEXT::e15Bpc: return \"15Bpc\";\n      case ImageCompressionFixedRateFlagBitsEXT::e16Bpc: return \"16Bpc\";\n      case ImageCompressionFixedRateFlagBitsEXT::e17Bpc: return \"17Bpc\";\n      case ImageCompressionFixedRateFlagBitsEXT::e18Bpc: return \"18Bpc\";\n      case ImageCompressionFixedRateFlagBitsEXT::e19Bpc: return \"19Bpc\";\n      case ImageCompressionFixedRateFlagBitsEXT::e20Bpc: return \"20Bpc\";\n      case ImageCompressionFixedRateFlagBitsEXT::e21Bpc: return \"21Bpc\";\n      case ImageCompressionFixedRateFlagBitsEXT::e22Bpc: return \"22Bpc\";\n      case ImageCompressionFixedRateFlagBitsEXT::e23Bpc: return \"23Bpc\";\n      case ImageCompressionFixedRateFlagBitsEXT::e24Bpc: return \"24Bpc\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_EXT_device_fault ===\n\n  VULKAN_HPP_INLINE std::string to_string( DeviceFaultAddressTypeEXT value )\n  {\n    switch ( value )\n    {\n      case DeviceFaultAddressTypeEXT::eNone: return \"None\";\n      case DeviceFaultAddressTypeEXT::eReadInvalid: return \"ReadInvalid\";\n      case DeviceFaultAddressTypeEXT::eWriteInvalid: return \"WriteInvalid\";\n      case DeviceFaultAddressTypeEXT::eExecuteInvalid: return \"ExecuteInvalid\";\n      case DeviceFaultAddressTypeEXT::eInstructionPointerUnknown: return \"InstructionPointerUnknown\";\n      case DeviceFaultAddressTypeEXT::eInstructionPointerInvalid: return \"InstructionPointerInvalid\";\n      case DeviceFaultAddressTypeEXT::eInstructionPointerFault: return \"InstructionPointerFault\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DeviceFaultVendorBinaryHeaderVersionEXT value )\n  {\n    switch ( value )\n    {\n      case DeviceFaultVendorBinaryHeaderVersionEXT::eOne: return \"One\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )\n  //=== VK_EXT_directfb_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( DirectFBSurfaceCreateFlagBitsEXT )\n  {\n    return \"(void)\";\n  }\n#endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/\n\n  //=== VK_EXT_device_address_binding_report ===\n\n  VULKAN_HPP_INLINE std::string to_string( DeviceAddressBindingFlagBitsEXT value )\n  {\n    switch ( value )\n    {\n      case DeviceAddressBindingFlagBitsEXT::eInternalObject: return \"InternalObject\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DeviceAddressBindingTypeEXT value )\n  {\n    switch ( value )\n    {\n      case DeviceAddressBindingTypeEXT::eBind: return \"Bind\";\n      case DeviceAddressBindingTypeEXT::eUnbind: return \"Unbind\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n#if defined( VK_USE_PLATFORM_FUCHSIA )\n  //=== VK_FUCHSIA_buffer_collection ===\n\n  VULKAN_HPP_INLINE std::string to_string( ImageConstraintsInfoFlagBitsFUCHSIA value )\n  {\n    switch ( value )\n    {\n      case ImageConstraintsInfoFlagBitsFUCHSIA::eCpuReadRarely: return \"CpuReadRarely\";\n      case ImageConstraintsInfoFlagBitsFUCHSIA::eCpuReadOften: return \"CpuReadOften\";\n      case ImageConstraintsInfoFlagBitsFUCHSIA::eCpuWriteRarely: return \"CpuWriteRarely\";\n      case ImageConstraintsInfoFlagBitsFUCHSIA::eCpuWriteOften: return \"CpuWriteOften\";\n      case ImageConstraintsInfoFlagBitsFUCHSIA::eProtectedOptional: return \"ProtectedOptional\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ImageFormatConstraintsFlagBitsFUCHSIA )\n  {\n    return \"(void)\";\n  }\n#endif /*VK_USE_PLATFORM_FUCHSIA*/\n\n  //=== VK_EXT_frame_boundary ===\n\n  VULKAN_HPP_INLINE std::string to_string( FrameBoundaryFlagBitsEXT value )\n  {\n    switch ( value )\n    {\n      case FrameBoundaryFlagBitsEXT::eFrameEnd: return \"FrameEnd\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n#if defined( VK_USE_PLATFORM_SCREEN_QNX )\n  //=== VK_QNX_screen_surface ===\n\n  VULKAN_HPP_INLINE std::string to_string( ScreenSurfaceCreateFlagBitsQNX )\n  {\n    return \"(void)\";\n  }\n#endif /*VK_USE_PLATFORM_SCREEN_QNX*/\n\n  //=== VK_EXT_opacity_micromap ===\n\n  VULKAN_HPP_INLINE std::string to_string( MicromapTypeEXT value )\n  {\n    switch ( value )\n    {\n      case MicromapTypeEXT::eOpacityMicromap: return \"OpacityMicromap\";\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n      case MicromapTypeEXT::eDisplacementMicromapNV: return \"DisplacementMicromapNV\";\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( BuildMicromapFlagBitsEXT value )\n  {\n    switch ( value )\n    {\n      case BuildMicromapFlagBitsEXT::ePreferFastTrace: return \"PreferFastTrace\";\n      case BuildMicromapFlagBitsEXT::ePreferFastBuild: return \"PreferFastBuild\";\n      case BuildMicromapFlagBitsEXT::eAllowCompaction: return \"AllowCompaction\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( CopyMicromapModeEXT value )\n  {\n    switch ( value )\n    {\n      case CopyMicromapModeEXT::eClone: return \"Clone\";\n      case CopyMicromapModeEXT::eSerialize: return \"Serialize\";\n      case CopyMicromapModeEXT::eDeserialize: return \"Deserialize\";\n      case CopyMicromapModeEXT::eCompact: return \"Compact\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( MicromapCreateFlagBitsEXT value )\n  {\n    switch ( value )\n    {\n      case MicromapCreateFlagBitsEXT::eDeviceAddressCaptureReplay: return \"DeviceAddressCaptureReplay\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( BuildMicromapModeEXT value )\n  {\n    switch ( value )\n    {\n      case BuildMicromapModeEXT::eBuild: return \"Build\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( OpacityMicromapFormatEXT value )\n  {\n    switch ( value )\n    {\n      case OpacityMicromapFormatEXT::e2State: return \"2State\";\n      case OpacityMicromapFormatEXT::e4State: return \"4State\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( OpacityMicromapSpecialIndexEXT value )\n  {\n    switch ( value )\n    {\n      case OpacityMicromapSpecialIndexEXT::eFullyTransparent: return \"FullyTransparent\";\n      case OpacityMicromapSpecialIndexEXT::eFullyOpaque: return \"FullyOpaque\";\n      case OpacityMicromapSpecialIndexEXT::eFullyUnknownTransparent: return \"FullyUnknownTransparent\";\n      case OpacityMicromapSpecialIndexEXT::eFullyUnknownOpaque: return \"FullyUnknownOpaque\";\n      case OpacityMicromapSpecialIndexEXT::eClusterGeometryDisableOpacityMicromapNV: return \"ClusterGeometryDisableOpacityMicromapNV\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n#if defined( VK_ENABLE_BETA_EXTENSIONS )\n  //=== VK_NV_displacement_micromap ===\n\n  VULKAN_HPP_INLINE std::string to_string( DisplacementMicromapFormatNV value )\n  {\n    switch ( value )\n    {\n      case DisplacementMicromapFormatNV::e64Triangles64Bytes: return \"64Triangles64Bytes\";\n      case DisplacementMicromapFormatNV::e256Triangles128Bytes: return \"256Triangles128Bytes\";\n      case DisplacementMicromapFormatNV::e1024Triangles128Bytes: return \"1024Triangles128Bytes\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n#endif /*VK_ENABLE_BETA_EXTENSIONS*/\n\n  //=== VK_ARM_scheduling_controls ===\n\n  VULKAN_HPP_INLINE std::string to_string( PhysicalDeviceSchedulingControlsFlagBitsARM value )\n  {\n    switch ( value )\n    {\n      case PhysicalDeviceSchedulingControlsFlagBitsARM::eShaderCoreCount: return \"ShaderCoreCount\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_NV_memory_decompression ===\n\n  VULKAN_HPP_INLINE std::string to_string( MemoryDecompressionMethodFlagBitsNV value )\n  {\n    switch ( value )\n    {\n      case MemoryDecompressionMethodFlagBitsNV::eGdeflate10: return \"Gdeflate10\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_NV_ray_tracing_linear_swept_spheres ===\n\n  VULKAN_HPP_INLINE std::string to_string( RayTracingLssIndexingModeNV value )\n  {\n    switch ( value )\n    {\n      case RayTracingLssIndexingModeNV::eList: return \"List\";\n      case RayTracingLssIndexingModeNV::eSuccessive: return \"Successive\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( RayTracingLssPrimitiveEndCapsModeNV value )\n  {\n    switch ( value )\n    {\n      case RayTracingLssPrimitiveEndCapsModeNV::eNone: return \"None\";\n      case RayTracingLssPrimitiveEndCapsModeNV::eChained: return \"Chained\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_EXT_subpass_merge_feedback ===\n\n  VULKAN_HPP_INLINE std::string to_string( SubpassMergeStatusEXT value )\n  {\n    switch ( value )\n    {\n      case SubpassMergeStatusEXT::eMerged: return \"Merged\";\n      case SubpassMergeStatusEXT::eDisallowed: return \"Disallowed\";\n      case SubpassMergeStatusEXT::eNotMergedSideEffects: return \"NotMergedSideEffects\";\n      case SubpassMergeStatusEXT::eNotMergedSamplesMismatch: return \"NotMergedSamplesMismatch\";\n      case SubpassMergeStatusEXT::eNotMergedViewsMismatch: return \"NotMergedViewsMismatch\";\n      case SubpassMergeStatusEXT::eNotMergedAliasing: return \"NotMergedAliasing\";\n      case SubpassMergeStatusEXT::eNotMergedDependencies: return \"NotMergedDependencies\";\n      case SubpassMergeStatusEXT::eNotMergedIncompatibleInputAttachment: return \"NotMergedIncompatibleInputAttachment\";\n      case SubpassMergeStatusEXT::eNotMergedTooManyAttachments: return \"NotMergedTooManyAttachments\";\n      case SubpassMergeStatusEXT::eNotMergedInsufficientStorage: return \"NotMergedInsufficientStorage\";\n      case SubpassMergeStatusEXT::eNotMergedDepthStencilCount: return \"NotMergedDepthStencilCount\";\n      case SubpassMergeStatusEXT::eNotMergedResolveAttachmentReuse: return \"NotMergedResolveAttachmentReuse\";\n      case SubpassMergeStatusEXT::eNotMergedSingleSubpass: return \"NotMergedSingleSubpass\";\n      case SubpassMergeStatusEXT::eNotMergedUnspecified: return \"NotMergedUnspecified\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_LUNARG_direct_driver_loading ===\n\n  VULKAN_HPP_INLINE std::string to_string( DirectDriverLoadingModeLUNARG value )\n  {\n    switch ( value )\n    {\n      case DirectDriverLoadingModeLUNARG::eExclusive: return \"Exclusive\";\n      case DirectDriverLoadingModeLUNARG::eInclusive: return \"Inclusive\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( DirectDriverLoadingFlagBitsLUNARG )\n  {\n    return \"(void)\";\n  }\n\n  //=== VK_NV_optical_flow ===\n\n  VULKAN_HPP_INLINE std::string to_string( OpticalFlowUsageFlagBitsNV value )\n  {\n    switch ( value )\n    {\n      case OpticalFlowUsageFlagBitsNV::eUnknown: return \"Unknown\";\n      case OpticalFlowUsageFlagBitsNV::eInput: return \"Input\";\n      case OpticalFlowUsageFlagBitsNV::eOutput: return \"Output\";\n      case OpticalFlowUsageFlagBitsNV::eHint: return \"Hint\";\n      case OpticalFlowUsageFlagBitsNV::eCost: return \"Cost\";\n      case OpticalFlowUsageFlagBitsNV::eGlobalFlow: return \"GlobalFlow\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( OpticalFlowGridSizeFlagBitsNV value )\n  {\n    switch ( value )\n    {\n      case OpticalFlowGridSizeFlagBitsNV::eUnknown: return \"Unknown\";\n      case OpticalFlowGridSizeFlagBitsNV::e1X1: return \"1X1\";\n      case OpticalFlowGridSizeFlagBitsNV::e2X2: return \"2X2\";\n      case OpticalFlowGridSizeFlagBitsNV::e4X4: return \"4X4\";\n      case OpticalFlowGridSizeFlagBitsNV::e8X8: return \"8X8\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( OpticalFlowPerformanceLevelNV value )\n  {\n    switch ( value )\n    {\n      case OpticalFlowPerformanceLevelNV::eUnknown: return \"Unknown\";\n      case OpticalFlowPerformanceLevelNV::eSlow: return \"Slow\";\n      case OpticalFlowPerformanceLevelNV::eMedium: return \"Medium\";\n      case OpticalFlowPerformanceLevelNV::eFast: return \"Fast\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( OpticalFlowSessionBindingPointNV value )\n  {\n    switch ( value )\n    {\n      case OpticalFlowSessionBindingPointNV::eUnknown: return \"Unknown\";\n      case OpticalFlowSessionBindingPointNV::eInput: return \"Input\";\n      case OpticalFlowSessionBindingPointNV::eReference: return \"Reference\";\n      case OpticalFlowSessionBindingPointNV::eHint: return \"Hint\";\n      case OpticalFlowSessionBindingPointNV::eFlowVector: return \"FlowVector\";\n      case OpticalFlowSessionBindingPointNV::eBackwardFlowVector: return \"BackwardFlowVector\";\n      case OpticalFlowSessionBindingPointNV::eCost: return \"Cost\";\n      case OpticalFlowSessionBindingPointNV::eBackwardCost: return \"BackwardCost\";\n      case OpticalFlowSessionBindingPointNV::eGlobalFlow: return \"GlobalFlow\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( OpticalFlowSessionCreateFlagBitsNV value )\n  {\n    switch ( value )\n    {\n      case OpticalFlowSessionCreateFlagBitsNV::eEnableHint: return \"EnableHint\";\n      case OpticalFlowSessionCreateFlagBitsNV::eEnableCost: return \"EnableCost\";\n      case OpticalFlowSessionCreateFlagBitsNV::eEnableGlobalFlow: return \"EnableGlobalFlow\";\n      case OpticalFlowSessionCreateFlagBitsNV::eAllowRegions: return \"AllowRegions\";\n      case OpticalFlowSessionCreateFlagBitsNV::eBothDirections: return \"BothDirections\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( OpticalFlowExecuteFlagBitsNV value )\n  {\n    switch ( value )\n    {\n      case OpticalFlowExecuteFlagBitsNV::eDisableTemporalHints: return \"DisableTemporalHints\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_AMD_anti_lag ===\n\n  VULKAN_HPP_INLINE std::string to_string( AntiLagModeAMD value )\n  {\n    switch ( value )\n    {\n      case AntiLagModeAMD::eDriverControl: return \"DriverControl\";\n      case AntiLagModeAMD::eOn: return \"On\";\n      case AntiLagModeAMD::eOff: return \"Off\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( AntiLagStageAMD value )\n  {\n    switch ( value )\n    {\n      case AntiLagStageAMD::eInput: return \"Input\";\n      case AntiLagStageAMD::ePresent: return \"Present\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_EXT_shader_object ===\n\n  VULKAN_HPP_INLINE std::string to_string( ShaderCreateFlagBitsEXT value )\n  {\n    switch ( value )\n    {\n      case ShaderCreateFlagBitsEXT::eLinkStage: return \"LinkStage\";\n      case ShaderCreateFlagBitsEXT::eAllowVaryingSubgroupSize: return \"AllowVaryingSubgroupSize\";\n      case ShaderCreateFlagBitsEXT::eRequireFullSubgroups: return \"RequireFullSubgroups\";\n      case ShaderCreateFlagBitsEXT::eNoTaskShader: return \"NoTaskShader\";\n      case ShaderCreateFlagBitsEXT::eDispatchBase: return \"DispatchBase\";\n      case ShaderCreateFlagBitsEXT::eFragmentShadingRateAttachment: return \"FragmentShadingRateAttachment\";\n      case ShaderCreateFlagBitsEXT::eFragmentDensityMapAttachment: return \"FragmentDensityMapAttachment\";\n      case ShaderCreateFlagBitsEXT::eIndirectBindable: return \"IndirectBindable\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ShaderCodeTypeEXT value )\n  {\n    switch ( value )\n    {\n      case ShaderCodeTypeEXT::eBinary: return \"Binary\";\n      case ShaderCodeTypeEXT::eSpirv: return \"Spirv\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_NV_ray_tracing_invocation_reorder ===\n\n  VULKAN_HPP_INLINE std::string to_string( RayTracingInvocationReorderModeNV value )\n  {\n    switch ( value )\n    {\n      case RayTracingInvocationReorderModeNV::eNone: return \"None\";\n      case RayTracingInvocationReorderModeNV::eReorder: return \"Reorder\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_NV_cooperative_vector ===\n\n  VULKAN_HPP_INLINE std::string to_string( CooperativeVectorMatrixLayoutNV value )\n  {\n    switch ( value )\n    {\n      case CooperativeVectorMatrixLayoutNV::eRowMajor: return \"RowMajor\";\n      case CooperativeVectorMatrixLayoutNV::eColumnMajor: return \"ColumnMajor\";\n      case CooperativeVectorMatrixLayoutNV::eInferencingOptimal: return \"InferencingOptimal\";\n      case CooperativeVectorMatrixLayoutNV::eTrainingOptimal: return \"TrainingOptimal\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ComponentTypeKHR value )\n  {\n    switch ( value )\n    {\n      case ComponentTypeKHR::eFloat16: return \"Float16\";\n      case ComponentTypeKHR::eFloat32: return \"Float32\";\n      case ComponentTypeKHR::eFloat64: return \"Float64\";\n      case ComponentTypeKHR::eSint8: return \"Sint8\";\n      case ComponentTypeKHR::eSint16: return \"Sint16\";\n      case ComponentTypeKHR::eSint32: return \"Sint32\";\n      case ComponentTypeKHR::eSint64: return \"Sint64\";\n      case ComponentTypeKHR::eUint8: return \"Uint8\";\n      case ComponentTypeKHR::eUint16: return \"Uint16\";\n      case ComponentTypeKHR::eUint32: return \"Uint32\";\n      case ComponentTypeKHR::eUint64: return \"Uint64\";\n      case ComponentTypeKHR::eSint8PackedNV: return \"Sint8PackedNV\";\n      case ComponentTypeKHR::eUint8PackedNV: return \"Uint8PackedNV\";\n      case ComponentTypeKHR::eFloatE4M3NV: return \"FloatE4M3NV\";\n      case ComponentTypeKHR::eFloatE5M2NV: return \"FloatE5M2NV\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_EXT_layer_settings ===\n\n  VULKAN_HPP_INLINE std::string to_string( LayerSettingTypeEXT value )\n  {\n    switch ( value )\n    {\n      case LayerSettingTypeEXT::eBool32: return \"Bool32\";\n      case LayerSettingTypeEXT::eInt32: return \"Int32\";\n      case LayerSettingTypeEXT::eInt64: return \"Int64\";\n      case LayerSettingTypeEXT::eUint32: return \"Uint32\";\n      case LayerSettingTypeEXT::eUint64: return \"Uint64\";\n      case LayerSettingTypeEXT::eFloat32: return \"Float32\";\n      case LayerSettingTypeEXT::eFloat64: return \"Float64\";\n      case LayerSettingTypeEXT::eString: return \"String\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_NV_low_latency2 ===\n\n  VULKAN_HPP_INLINE std::string to_string( LatencyMarkerNV value )\n  {\n    switch ( value )\n    {\n      case LatencyMarkerNV::eSimulationStart: return \"SimulationStart\";\n      case LatencyMarkerNV::eSimulationEnd: return \"SimulationEnd\";\n      case LatencyMarkerNV::eRendersubmitStart: return \"RendersubmitStart\";\n      case LatencyMarkerNV::eRendersubmitEnd: return \"RendersubmitEnd\";\n      case LatencyMarkerNV::ePresentStart: return \"PresentStart\";\n      case LatencyMarkerNV::ePresentEnd: return \"PresentEnd\";\n      case LatencyMarkerNV::eInputSample: return \"InputSample\";\n      case LatencyMarkerNV::eTriggerFlash: return \"TriggerFlash\";\n      case LatencyMarkerNV::eOutOfBandRendersubmitStart: return \"OutOfBandRendersubmitStart\";\n      case LatencyMarkerNV::eOutOfBandRendersubmitEnd: return \"OutOfBandRendersubmitEnd\";\n      case LatencyMarkerNV::eOutOfBandPresentStart: return \"OutOfBandPresentStart\";\n      case LatencyMarkerNV::eOutOfBandPresentEnd: return \"OutOfBandPresentEnd\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( OutOfBandQueueTypeNV value )\n  {\n    switch ( value )\n    {\n      case OutOfBandQueueTypeNV::eRender: return \"Render\";\n      case OutOfBandQueueTypeNV::ePresent: return \"Present\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_KHR_cooperative_matrix ===\n\n  VULKAN_HPP_INLINE std::string to_string( ScopeKHR value )\n  {\n    switch ( value )\n    {\n      case ScopeKHR::eDevice: return \"Device\";\n      case ScopeKHR::eWorkgroup: return \"Workgroup\";\n      case ScopeKHR::eSubgroup: return \"Subgroup\";\n      case ScopeKHR::eQueueFamily: return \"QueueFamily\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_KHR_video_encode_av1 ===\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeAV1PredictionModeKHR value )\n  {\n    switch ( value )\n    {\n      case VideoEncodeAV1PredictionModeKHR::eIntraOnly: return \"IntraOnly\";\n      case VideoEncodeAV1PredictionModeKHR::eSingleReference: return \"SingleReference\";\n      case VideoEncodeAV1PredictionModeKHR::eUnidirectionalCompound: return \"UnidirectionalCompound\";\n      case VideoEncodeAV1PredictionModeKHR::eBidirectionalCompound: return \"BidirectionalCompound\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeAV1RateControlGroupKHR value )\n  {\n    switch ( value )\n    {\n      case VideoEncodeAV1RateControlGroupKHR::eIntra: return \"Intra\";\n      case VideoEncodeAV1RateControlGroupKHR::ePredictive: return \"Predictive\";\n      case VideoEncodeAV1RateControlGroupKHR::eBipredictive: return \"Bipredictive\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeAV1CapabilityFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoEncodeAV1CapabilityFlagBitsKHR::ePerRateControlGroupMinMaxQIndex: return \"PerRateControlGroupMinMaxQIndex\";\n      case VideoEncodeAV1CapabilityFlagBitsKHR::eGenerateObuExtensionHeader: return \"GenerateObuExtensionHeader\";\n      case VideoEncodeAV1CapabilityFlagBitsKHR::ePrimaryReferenceCdfOnly: return \"PrimaryReferenceCdfOnly\";\n      case VideoEncodeAV1CapabilityFlagBitsKHR::eFrameSizeOverride: return \"FrameSizeOverride\";\n      case VideoEncodeAV1CapabilityFlagBitsKHR::eMotionVectorScaling: return \"MotionVectorScaling\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeAV1StdFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoEncodeAV1StdFlagBitsKHR::eUniformTileSpacingFlagSet: return \"UniformTileSpacingFlagSet\";\n      case VideoEncodeAV1StdFlagBitsKHR::eSkipModePresentUnset: return \"SkipModePresentUnset\";\n      case VideoEncodeAV1StdFlagBitsKHR::ePrimaryRefFrame: return \"PrimaryRefFrame\";\n      case VideoEncodeAV1StdFlagBitsKHR::eDeltaQ: return \"DeltaQ\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeAV1SuperblockSizeFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoEncodeAV1SuperblockSizeFlagBitsKHR::e64: return \"64\";\n      case VideoEncodeAV1SuperblockSizeFlagBitsKHR::e128: return \"128\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( VideoEncodeAV1RateControlFlagBitsKHR value )\n  {\n    switch ( value )\n    {\n      case VideoEncodeAV1RateControlFlagBitsKHR::eRegularGop: return \"RegularGop\";\n      case VideoEncodeAV1RateControlFlagBitsKHR::eTemporalLayerPatternDyadic: return \"TemporalLayerPatternDyadic\";\n      case VideoEncodeAV1RateControlFlagBitsKHR::eReferencePatternFlat: return \"ReferencePatternFlat\";\n      case VideoEncodeAV1RateControlFlagBitsKHR::eReferencePatternDyadic: return \"ReferencePatternDyadic\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_QCOM_image_processing2 ===\n\n  VULKAN_HPP_INLINE std::string to_string( BlockMatchWindowCompareModeQCOM value )\n  {\n    switch ( value )\n    {\n      case BlockMatchWindowCompareModeQCOM::eMin: return \"Min\";\n      case BlockMatchWindowCompareModeQCOM::eMax: return \"Max\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_QCOM_filter_cubic_weights ===\n\n  VULKAN_HPP_INLINE std::string to_string( CubicFilterWeightsQCOM value )\n  {\n    switch ( value )\n    {\n      case CubicFilterWeightsQCOM::eCatmullRom: return \"CatmullRom\";\n      case CubicFilterWeightsQCOM::eZeroTangentCardinal: return \"ZeroTangentCardinal\";\n      case CubicFilterWeightsQCOM::eBSpline: return \"BSpline\";\n      case CubicFilterWeightsQCOM::eMitchellNetravali: return \"MitchellNetravali\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_MSFT_layered_driver ===\n\n  VULKAN_HPP_INLINE std::string to_string( LayeredDriverUnderlyingApiMSFT value )\n  {\n    switch ( value )\n    {\n      case LayeredDriverUnderlyingApiMSFT::eNone: return \"None\";\n      case LayeredDriverUnderlyingApiMSFT::eD3D12: return \"D3D12\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_KHR_calibrated_timestamps ===\n\n  VULKAN_HPP_INLINE std::string to_string( TimeDomainKHR value )\n  {\n    switch ( value )\n    {\n      case TimeDomainKHR::eDevice: return \"Device\";\n      case TimeDomainKHR::eClockMonotonic: return \"ClockMonotonic\";\n      case TimeDomainKHR::eClockMonotonicRaw: return \"ClockMonotonicRaw\";\n      case TimeDomainKHR::eQueryPerformanceCounter: return \"QueryPerformanceCounter\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_NV_display_stereo ===\n\n  VULKAN_HPP_INLINE std::string to_string( DisplaySurfaceStereoTypeNV value )\n  {\n    switch ( value )\n    {\n      case DisplaySurfaceStereoTypeNV::eNone: return \"None\";\n      case DisplaySurfaceStereoTypeNV::eOnboardDin: return \"OnboardDin\";\n      case DisplaySurfaceStereoTypeNV::eHdmi3D: return \"Hdmi3D\";\n      case DisplaySurfaceStereoTypeNV::eInbandDisplayport: return \"InbandDisplayport\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_KHR_maintenance7 ===\n\n  VULKAN_HPP_INLINE std::string to_string( PhysicalDeviceLayeredApiKHR value )\n  {\n    switch ( value )\n    {\n      case PhysicalDeviceLayeredApiKHR::eVulkan: return \"Vulkan\";\n      case PhysicalDeviceLayeredApiKHR::eD3D12: return \"D3D12\";\n      case PhysicalDeviceLayeredApiKHR::eMetal: return \"Metal\";\n      case PhysicalDeviceLayeredApiKHR::eOpengl: return \"Opengl\";\n      case PhysicalDeviceLayeredApiKHR::eOpengles: return \"Opengles\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_NV_cluster_acceleration_structure ===\n\n  VULKAN_HPP_INLINE std::string to_string( ClusterAccelerationStructureClusterFlagBitsNV value )\n  {\n    switch ( value )\n    {\n      case ClusterAccelerationStructureClusterFlagBitsNV::eAllowDisableOpacityMicromaps: return \"AllowDisableOpacityMicromaps\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ClusterAccelerationStructureGeometryFlagBitsNV value )\n  {\n    switch ( value )\n    {\n      case ClusterAccelerationStructureGeometryFlagBitsNV::eCullDisable: return \"CullDisable\";\n      case ClusterAccelerationStructureGeometryFlagBitsNV::eNoDuplicateAnyhitInvocation: return \"NoDuplicateAnyhitInvocation\";\n      case ClusterAccelerationStructureGeometryFlagBitsNV::eOpaque: return \"Opaque\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ClusterAccelerationStructureAddressResolutionFlagBitsNV value )\n  {\n    switch ( value )\n    {\n      case ClusterAccelerationStructureAddressResolutionFlagBitsNV::eIndirectedDstImplicitData: return \"IndirectedDstImplicitData\";\n      case ClusterAccelerationStructureAddressResolutionFlagBitsNV::eIndirectedScratchData: return \"IndirectedScratchData\";\n      case ClusterAccelerationStructureAddressResolutionFlagBitsNV::eIndirectedDstAddressArray: return \"IndirectedDstAddressArray\";\n      case ClusterAccelerationStructureAddressResolutionFlagBitsNV::eIndirectedDstSizesArray: return \"IndirectedDstSizesArray\";\n      case ClusterAccelerationStructureAddressResolutionFlagBitsNV::eIndirectedSrcInfosArray: return \"IndirectedSrcInfosArray\";\n      case ClusterAccelerationStructureAddressResolutionFlagBitsNV::eIndirectedSrcInfosCount: return \"IndirectedSrcInfosCount\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ClusterAccelerationStructureIndexFormatFlagBitsNV value )\n  {\n    switch ( value )\n    {\n      case ClusterAccelerationStructureIndexFormatFlagBitsNV::e8: return \"8\";\n      case ClusterAccelerationStructureIndexFormatFlagBitsNV::e16: return \"16\";\n      case ClusterAccelerationStructureIndexFormatFlagBitsNV::e32: return \"32\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ClusterAccelerationStructureTypeNV value )\n  {\n    switch ( value )\n    {\n      case ClusterAccelerationStructureTypeNV::eClustersBottomLevel: return \"ClustersBottomLevel\";\n      case ClusterAccelerationStructureTypeNV::eTriangleCluster: return \"TriangleCluster\";\n      case ClusterAccelerationStructureTypeNV::eTriangleClusterTemplate: return \"TriangleClusterTemplate\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ClusterAccelerationStructureOpTypeNV value )\n  {\n    switch ( value )\n    {\n      case ClusterAccelerationStructureOpTypeNV::eMoveObjects: return \"MoveObjects\";\n      case ClusterAccelerationStructureOpTypeNV::eBuildClustersBottomLevel: return \"BuildClustersBottomLevel\";\n      case ClusterAccelerationStructureOpTypeNV::eBuildTriangleCluster: return \"BuildTriangleCluster\";\n      case ClusterAccelerationStructureOpTypeNV::eBuildTriangleClusterTemplate: return \"BuildTriangleClusterTemplate\";\n      case ClusterAccelerationStructureOpTypeNV::eInstantiateTriangleCluster: return \"InstantiateTriangleCluster\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( ClusterAccelerationStructureOpModeNV value )\n  {\n    switch ( value )\n    {\n      case ClusterAccelerationStructureOpModeNV::eImplicitDestinations: return \"ImplicitDestinations\";\n      case ClusterAccelerationStructureOpModeNV::eExplicitDestinations: return \"ExplicitDestinations\";\n      case ClusterAccelerationStructureOpModeNV::eComputeSizes: return \"ComputeSizes\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_NV_partitioned_acceleration_structure ===\n\n  VULKAN_HPP_INLINE std::string to_string( PartitionedAccelerationStructureOpTypeNV value )\n  {\n    switch ( value )\n    {\n      case PartitionedAccelerationStructureOpTypeNV::eWriteInstance: return \"WriteInstance\";\n      case PartitionedAccelerationStructureOpTypeNV::eUpdateInstance: return \"UpdateInstance\";\n      case PartitionedAccelerationStructureOpTypeNV::eWritePartitionTranslation: return \"WritePartitionTranslation\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( PartitionedAccelerationStructureInstanceFlagBitsNV value )\n  {\n    switch ( value )\n    {\n      case PartitionedAccelerationStructureInstanceFlagBitsNV::eFlagTriangleFacingCullDisable: return \"FlagTriangleFacingCullDisable\";\n      case PartitionedAccelerationStructureInstanceFlagBitsNV::eFlagTriangleFlipFacing: return \"FlagTriangleFlipFacing\";\n      case PartitionedAccelerationStructureInstanceFlagBitsNV::eFlagForceOpaque: return \"FlagForceOpaque\";\n      case PartitionedAccelerationStructureInstanceFlagBitsNV::eFlagForceNoOpaque: return \"FlagForceNoOpaque\";\n      case PartitionedAccelerationStructureInstanceFlagBitsNV::eFlagEnableExplicitBoundingBox: return \"FlagEnableExplicitBoundingBox\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_EXT_device_generated_commands ===\n\n  VULKAN_HPP_INLINE std::string to_string( IndirectCommandsTokenTypeEXT value )\n  {\n    switch ( value )\n    {\n      case IndirectCommandsTokenTypeEXT::eExecutionSet: return \"ExecutionSet\";\n      case IndirectCommandsTokenTypeEXT::ePushConstant: return \"PushConstant\";\n      case IndirectCommandsTokenTypeEXT::eSequenceIndex: return \"SequenceIndex\";\n      case IndirectCommandsTokenTypeEXT::eIndexBuffer: return \"IndexBuffer\";\n      case IndirectCommandsTokenTypeEXT::eVertexBuffer: return \"VertexBuffer\";\n      case IndirectCommandsTokenTypeEXT::eDrawIndexed: return \"DrawIndexed\";\n      case IndirectCommandsTokenTypeEXT::eDraw: return \"Draw\";\n      case IndirectCommandsTokenTypeEXT::eDrawIndexedCount: return \"DrawIndexedCount\";\n      case IndirectCommandsTokenTypeEXT::eDrawCount: return \"DrawCount\";\n      case IndirectCommandsTokenTypeEXT::eDispatch: return \"Dispatch\";\n      case IndirectCommandsTokenTypeEXT::eDrawMeshTasksNV: return \"DrawMeshTasksNV\";\n      case IndirectCommandsTokenTypeEXT::eDrawMeshTasksCountNV: return \"DrawMeshTasksCountNV\";\n      case IndirectCommandsTokenTypeEXT::eDrawMeshTasks: return \"DrawMeshTasks\";\n      case IndirectCommandsTokenTypeEXT::eDrawMeshTasksCount: return \"DrawMeshTasksCount\";\n      case IndirectCommandsTokenTypeEXT::eTraceRays2: return \"TraceRays2\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( IndirectExecutionSetInfoTypeEXT value )\n  {\n    switch ( value )\n    {\n      case IndirectExecutionSetInfoTypeEXT::ePipelines: return \"Pipelines\";\n      case IndirectExecutionSetInfoTypeEXT::eShaderObjects: return \"ShaderObjects\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( IndirectCommandsLayoutUsageFlagBitsEXT value )\n  {\n    switch ( value )\n    {\n      case IndirectCommandsLayoutUsageFlagBitsEXT::eExplicitPreprocess: return \"ExplicitPreprocess\";\n      case IndirectCommandsLayoutUsageFlagBitsEXT::eUnorderedSequences: return \"UnorderedSequences\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  VULKAN_HPP_INLINE std::string to_string( IndirectCommandsInputModeFlagBitsEXT value )\n  {\n    switch ( value )\n    {\n      case IndirectCommandsInputModeFlagBitsEXT::eVulkanIndexBuffer: return \"VulkanIndexBuffer\";\n      case IndirectCommandsInputModeFlagBitsEXT::eDxgiIndexBuffer: return \"DxgiIndexBuffer\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_KHR_maintenance8 ===\n\n  VULKAN_HPP_INLINE std::string to_string( AccessFlagBits3KHR value )\n  {\n    switch ( value )\n    {\n      case AccessFlagBits3KHR::eNone: return \"None\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n  //=== VK_EXT_depth_clamp_control ===\n\n  VULKAN_HPP_INLINE std::string to_string( DepthClampModeEXT value )\n  {\n    switch ( value )\n    {\n      case DepthClampModeEXT::eViewportRange: return \"ViewportRange\";\n      case DepthClampModeEXT::eUserDefinedRange: return \"UserDefinedRange\";\n      default: return \"invalid ( \" + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + \" )\";\n    }\n  }\n\n}  // namespace VULKAN_HPP_NAMESPACE\n\n#if defined( __clang__ ) || defined( __GNUC__ )\n#  pragma GCC diagnostic pop\n#elif defined( _MSC_VER )\n#  pragma warning( pop )\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_vi.h",
    "content": "#ifndef VULKAN_VI_H_\n#define VULKAN_VI_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// VK_NN_vi_surface is a preprocessor guard. Do not pass it to API calls.\n#define VK_NN_vi_surface 1\n#define VK_NN_VI_SURFACE_SPEC_VERSION     1\n#define VK_NN_VI_SURFACE_EXTENSION_NAME   \"VK_NN_vi_surface\"\ntypedef VkFlags VkViSurfaceCreateFlagsNN;\ntypedef struct VkViSurfaceCreateInfoNN {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkViSurfaceCreateFlagsNN    flags;\n    void*                       window;\n} VkViSurfaceCreateInfoNN;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateViSurfaceNN)(VkInstance instance, const VkViSurfaceCreateInfoNN* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateViSurfaceNN(\n    VkInstance                                  instance,\n    const VkViSurfaceCreateInfoNN*              pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSurfaceKHR*                               pSurface);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_video.hpp",
    "content": "// Copyright 2021-2025 The Khronos Group Inc.\n// SPDX-License-Identifier: Apache-2.0 OR MIT\n//\n\n// This header is generated from the Khronos Vulkan XML API Registry.\n\n#ifndef VULKAN_VIDEO_HPP\n#define VULKAN_VIDEO_HPP\n\n// clang-format off\n#include <vulkan/vulkan.hpp>\n// clang-format on\n\n#include <vk_video/vulkan_video_codec_av1std.h>\n#include <vk_video/vulkan_video_codec_av1std_decode.h>\n#if ( 301 < VK_HEADER_VERSION )\n#  include <vk_video/vulkan_video_codec_av1std_encode.h>\n#endif\n#include <vk_video/vulkan_video_codec_h264std.h>\n#include <vk_video/vulkan_video_codec_h264std_decode.h>\n#include <vk_video/vulkan_video_codec_h264std_encode.h>\n#include <vk_video/vulkan_video_codec_h265std.h>\n#include <vk_video/vulkan_video_codec_h265std_decode.h>\n#include <vk_video/vulkan_video_codec_h265std_encode.h>\n#include <vk_video/vulkan_video_codecs_common.h>\n\n#if !defined( VULKAN_HPP_VIDEO_NAMESPACE )\n#  define VULKAN_HPP_VIDEO_NAMESPACE video\n#endif\n\nnamespace VULKAN_HPP_NAMESPACE\n{\n  namespace VULKAN_HPP_VIDEO_NAMESPACE\n  {\n\n    //=============\n    //=== ENUMs ===\n    //=============\n\n    //=== vulkan_video_codec_h264std ===\n\n    enum class H264ChromaFormatIdc\n    {\n      eMonochrome = STD_VIDEO_H264_CHROMA_FORMAT_IDC_MONOCHROME,\n      e420        = STD_VIDEO_H264_CHROMA_FORMAT_IDC_420,\n      e422        = STD_VIDEO_H264_CHROMA_FORMAT_IDC_422,\n      e444        = STD_VIDEO_H264_CHROMA_FORMAT_IDC_444,\n      eInvalid    = STD_VIDEO_H264_CHROMA_FORMAT_IDC_INVALID\n    };\n\n    enum class H264ProfileIdc\n    {\n      eBaseline          = STD_VIDEO_H264_PROFILE_IDC_BASELINE,\n      eMain              = STD_VIDEO_H264_PROFILE_IDC_MAIN,\n      eHigh              = STD_VIDEO_H264_PROFILE_IDC_HIGH,\n      eHigh444Predictive = STD_VIDEO_H264_PROFILE_IDC_HIGH_444_PREDICTIVE,\n      eInvalid           = STD_VIDEO_H264_PROFILE_IDC_INVALID\n    };\n\n    enum class H264LevelIdc\n    {\n      e1_0     = STD_VIDEO_H264_LEVEL_IDC_1_0,\n      e1_1     = STD_VIDEO_H264_LEVEL_IDC_1_1,\n      e1_2     = STD_VIDEO_H264_LEVEL_IDC_1_2,\n      e1_3     = STD_VIDEO_H264_LEVEL_IDC_1_3,\n      e2_0     = STD_VIDEO_H264_LEVEL_IDC_2_0,\n      e2_1     = STD_VIDEO_H264_LEVEL_IDC_2_1,\n      e2_2     = STD_VIDEO_H264_LEVEL_IDC_2_2,\n      e3_0     = STD_VIDEO_H264_LEVEL_IDC_3_0,\n      e3_1     = STD_VIDEO_H264_LEVEL_IDC_3_1,\n      e3_2     = STD_VIDEO_H264_LEVEL_IDC_3_2,\n      e4_0     = STD_VIDEO_H264_LEVEL_IDC_4_0,\n      e4_1     = STD_VIDEO_H264_LEVEL_IDC_4_1,\n      e4_2     = STD_VIDEO_H264_LEVEL_IDC_4_2,\n      e5_0     = STD_VIDEO_H264_LEVEL_IDC_5_0,\n      e5_1     = STD_VIDEO_H264_LEVEL_IDC_5_1,\n      e5_2     = STD_VIDEO_H264_LEVEL_IDC_5_2,\n      e6_0     = STD_VIDEO_H264_LEVEL_IDC_6_0,\n      e6_1     = STD_VIDEO_H264_LEVEL_IDC_6_1,\n      e6_2     = STD_VIDEO_H264_LEVEL_IDC_6_2,\n      eInvalid = STD_VIDEO_H264_LEVEL_IDC_INVALID\n    };\n\n    enum class H264PocType\n    {\n      e0       = STD_VIDEO_H264_POC_TYPE_0,\n      e1       = STD_VIDEO_H264_POC_TYPE_1,\n      e2       = STD_VIDEO_H264_POC_TYPE_2,\n      eInvalid = STD_VIDEO_H264_POC_TYPE_INVALID\n    };\n\n    enum class H264AspectRatioIdc\n    {\n      eUnspecified = STD_VIDEO_H264_ASPECT_RATIO_IDC_UNSPECIFIED,\n      eSquare      = STD_VIDEO_H264_ASPECT_RATIO_IDC_SQUARE,\n      e12_11       = STD_VIDEO_H264_ASPECT_RATIO_IDC_12_11,\n      e10_11       = STD_VIDEO_H264_ASPECT_RATIO_IDC_10_11,\n      e16_11       = STD_VIDEO_H264_ASPECT_RATIO_IDC_16_11,\n      e40_33       = STD_VIDEO_H264_ASPECT_RATIO_IDC_40_33,\n      e24_11       = STD_VIDEO_H264_ASPECT_RATIO_IDC_24_11,\n      e20_11       = STD_VIDEO_H264_ASPECT_RATIO_IDC_20_11,\n      e32_11       = STD_VIDEO_H264_ASPECT_RATIO_IDC_32_11,\n      e80_33       = STD_VIDEO_H264_ASPECT_RATIO_IDC_80_33,\n      e18_11       = STD_VIDEO_H264_ASPECT_RATIO_IDC_18_11,\n      e15_11       = STD_VIDEO_H264_ASPECT_RATIO_IDC_15_11,\n      e64_33       = STD_VIDEO_H264_ASPECT_RATIO_IDC_64_33,\n      e160_99      = STD_VIDEO_H264_ASPECT_RATIO_IDC_160_99,\n      e4_3         = STD_VIDEO_H264_ASPECT_RATIO_IDC_4_3,\n      e3_2         = STD_VIDEO_H264_ASPECT_RATIO_IDC_3_2,\n      e2_1         = STD_VIDEO_H264_ASPECT_RATIO_IDC_2_1,\n      eExtendedSar = STD_VIDEO_H264_ASPECT_RATIO_IDC_EXTENDED_SAR,\n      eInvalid     = STD_VIDEO_H264_ASPECT_RATIO_IDC_INVALID\n    };\n\n    enum class H264WeightedBipredIdc\n    {\n      eDefault  = STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_DEFAULT,\n      eExplicit = STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_EXPLICIT,\n      eImplicit = STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_IMPLICIT,\n      eInvalid  = STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_INVALID\n    };\n\n    enum class H264ModificationOfPicNumsIdc\n    {\n      eShortTermSubtract = STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_SHORT_TERM_SUBTRACT,\n      eShortTermAdd      = STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_SHORT_TERM_ADD,\n      eLongTerm          = STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_LONG_TERM,\n      eEnd               = STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_END,\n      eInvalid           = STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_INVALID\n    };\n\n    enum class H264MemMgmtControlOp\n    {\n      eEnd                   = STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_END,\n      eUnmarkShortTerm       = STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_UNMARK_SHORT_TERM,\n      eUnmarkLongTerm        = STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_UNMARK_LONG_TERM,\n      eMarkLongTerm          = STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_MARK_LONG_TERM,\n      eSetMaxLongTermIndex   = STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_SET_MAX_LONG_TERM_INDEX,\n      eUnmarkAll             = STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_UNMARK_ALL,\n      eMarkCurrentAsLongTerm = STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_MARK_CURRENT_AS_LONG_TERM,\n      eInvalid               = STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_INVALID\n    };\n\n    enum class H264CabacInitIdc\n    {\n      e0       = STD_VIDEO_H264_CABAC_INIT_IDC_0,\n      e1       = STD_VIDEO_H264_CABAC_INIT_IDC_1,\n      e2       = STD_VIDEO_H264_CABAC_INIT_IDC_2,\n      eInvalid = STD_VIDEO_H264_CABAC_INIT_IDC_INVALID\n    };\n\n    enum class H264DisableDeblockingFilterIdc\n    {\n      eDisabled = STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_DISABLED,\n      eEnabled  = STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_ENABLED,\n      ePartial  = STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_PARTIAL,\n      eInvalid  = STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_INVALID\n    };\n\n    enum class H264SliceType\n    {\n      eP       = STD_VIDEO_H264_SLICE_TYPE_P,\n      eB       = STD_VIDEO_H264_SLICE_TYPE_B,\n      eI       = STD_VIDEO_H264_SLICE_TYPE_I,\n      eInvalid = STD_VIDEO_H264_SLICE_TYPE_INVALID\n    };\n\n    enum class H264PictureType\n    {\n      eP       = STD_VIDEO_H264_PICTURE_TYPE_P,\n      eB       = STD_VIDEO_H264_PICTURE_TYPE_B,\n      eI       = STD_VIDEO_H264_PICTURE_TYPE_I,\n      eIdr     = STD_VIDEO_H264_PICTURE_TYPE_IDR,\n      eInvalid = STD_VIDEO_H264_PICTURE_TYPE_INVALID\n    };\n\n    enum class H264NonVclNaluType\n    {\n      eSps           = STD_VIDEO_H264_NON_VCL_NALU_TYPE_SPS,\n      ePps           = STD_VIDEO_H264_NON_VCL_NALU_TYPE_PPS,\n      eAud           = STD_VIDEO_H264_NON_VCL_NALU_TYPE_AUD,\n      ePrefix        = STD_VIDEO_H264_NON_VCL_NALU_TYPE_PREFIX,\n      eEndOfSequence = STD_VIDEO_H264_NON_VCL_NALU_TYPE_END_OF_SEQUENCE,\n      eEndOfStream   = STD_VIDEO_H264_NON_VCL_NALU_TYPE_END_OF_STREAM,\n      ePrecoded      = STD_VIDEO_H264_NON_VCL_NALU_TYPE_PRECODED,\n      eInvalid       = STD_VIDEO_H264_NON_VCL_NALU_TYPE_INVALID\n    };\n\n    //=== vulkan_video_codec_h264std_decode ===\n\n    enum class DecodeH264FieldOrderCount\n    {\n      eTop     = STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_TOP,\n      eBottom  = STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_BOTTOM,\n      eInvalid = STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_INVALID\n    };\n\n    //=== vulkan_video_codec_h265std ===\n\n    enum class H265ChromaFormatIdc\n    {\n      eMonochrome = STD_VIDEO_H265_CHROMA_FORMAT_IDC_MONOCHROME,\n      e420        = STD_VIDEO_H265_CHROMA_FORMAT_IDC_420,\n      e422        = STD_VIDEO_H265_CHROMA_FORMAT_IDC_422,\n      e444        = STD_VIDEO_H265_CHROMA_FORMAT_IDC_444,\n      eInvalid    = STD_VIDEO_H265_CHROMA_FORMAT_IDC_INVALID\n    };\n\n    enum class H265ProfileIdc\n    {\n      eMain                  = STD_VIDEO_H265_PROFILE_IDC_MAIN,\n      eMain10                = STD_VIDEO_H265_PROFILE_IDC_MAIN_10,\n      eMainStillPicture      = STD_VIDEO_H265_PROFILE_IDC_MAIN_STILL_PICTURE,\n      eFormatRangeExtensions = STD_VIDEO_H265_PROFILE_IDC_FORMAT_RANGE_EXTENSIONS,\n      eSccExtensions         = STD_VIDEO_H265_PROFILE_IDC_SCC_EXTENSIONS,\n      eInvalid               = STD_VIDEO_H265_PROFILE_IDC_INVALID\n    };\n\n    enum class H265LevelIdc\n    {\n      e1_0     = STD_VIDEO_H265_LEVEL_IDC_1_0,\n      e2_0     = STD_VIDEO_H265_LEVEL_IDC_2_0,\n      e2_1     = STD_VIDEO_H265_LEVEL_IDC_2_1,\n      e3_0     = STD_VIDEO_H265_LEVEL_IDC_3_0,\n      e3_1     = STD_VIDEO_H265_LEVEL_IDC_3_1,\n      e4_0     = STD_VIDEO_H265_LEVEL_IDC_4_0,\n      e4_1     = STD_VIDEO_H265_LEVEL_IDC_4_1,\n      e5_0     = STD_VIDEO_H265_LEVEL_IDC_5_0,\n      e5_1     = STD_VIDEO_H265_LEVEL_IDC_5_1,\n      e5_2     = STD_VIDEO_H265_LEVEL_IDC_5_2,\n      e6_0     = STD_VIDEO_H265_LEVEL_IDC_6_0,\n      e6_1     = STD_VIDEO_H265_LEVEL_IDC_6_1,\n      e6_2     = STD_VIDEO_H265_LEVEL_IDC_6_2,\n      eInvalid = STD_VIDEO_H265_LEVEL_IDC_INVALID\n    };\n\n    enum class H265SliceType\n    {\n      eB       = STD_VIDEO_H265_SLICE_TYPE_B,\n      eP       = STD_VIDEO_H265_SLICE_TYPE_P,\n      eI       = STD_VIDEO_H265_SLICE_TYPE_I,\n      eInvalid = STD_VIDEO_H265_SLICE_TYPE_INVALID\n    };\n\n    enum class H265PictureType\n    {\n      eP       = STD_VIDEO_H265_PICTURE_TYPE_P,\n      eB       = STD_VIDEO_H265_PICTURE_TYPE_B,\n      eI       = STD_VIDEO_H265_PICTURE_TYPE_I,\n      eIdr     = STD_VIDEO_H265_PICTURE_TYPE_IDR,\n      eInvalid = STD_VIDEO_H265_PICTURE_TYPE_INVALID\n    };\n\n    enum class H265AspectRatioIdc\n    {\n      eUnspecified = STD_VIDEO_H265_ASPECT_RATIO_IDC_UNSPECIFIED,\n      eSquare      = STD_VIDEO_H265_ASPECT_RATIO_IDC_SQUARE,\n      e12_11       = STD_VIDEO_H265_ASPECT_RATIO_IDC_12_11,\n      e10_11       = STD_VIDEO_H265_ASPECT_RATIO_IDC_10_11,\n      e16_11       = STD_VIDEO_H265_ASPECT_RATIO_IDC_16_11,\n      e40_33       = STD_VIDEO_H265_ASPECT_RATIO_IDC_40_33,\n      e24_11       = STD_VIDEO_H265_ASPECT_RATIO_IDC_24_11,\n      e20_11       = STD_VIDEO_H265_ASPECT_RATIO_IDC_20_11,\n      e32_11       = STD_VIDEO_H265_ASPECT_RATIO_IDC_32_11,\n      e80_33       = STD_VIDEO_H265_ASPECT_RATIO_IDC_80_33,\n      e18_11       = STD_VIDEO_H265_ASPECT_RATIO_IDC_18_11,\n      e15_11       = STD_VIDEO_H265_ASPECT_RATIO_IDC_15_11,\n      e64_33       = STD_VIDEO_H265_ASPECT_RATIO_IDC_64_33,\n      e160_99      = STD_VIDEO_H265_ASPECT_RATIO_IDC_160_99,\n      e4_3         = STD_VIDEO_H265_ASPECT_RATIO_IDC_4_3,\n      e3_2         = STD_VIDEO_H265_ASPECT_RATIO_IDC_3_2,\n      e2_1         = STD_VIDEO_H265_ASPECT_RATIO_IDC_2_1,\n      eExtendedSar = STD_VIDEO_H265_ASPECT_RATIO_IDC_EXTENDED_SAR,\n      eInvalid     = STD_VIDEO_H265_ASPECT_RATIO_IDC_INVALID\n    };\n\n    //=== vulkan_video_codec_av1std ===\n\n    enum class AV1Profile\n    {\n      eMain         = STD_VIDEO_AV1_PROFILE_MAIN,\n      eHigh         = STD_VIDEO_AV1_PROFILE_HIGH,\n      eProfessional = STD_VIDEO_AV1_PROFILE_PROFESSIONAL,\n      eInvalid      = STD_VIDEO_AV1_PROFILE_INVALID\n    };\n\n    enum class AV1Level\n    {\n      e2_0     = STD_VIDEO_AV1_LEVEL_2_0,\n      e2_1     = STD_VIDEO_AV1_LEVEL_2_1,\n      e2_2     = STD_VIDEO_AV1_LEVEL_2_2,\n      e2_3     = STD_VIDEO_AV1_LEVEL_2_3,\n      e3_0     = STD_VIDEO_AV1_LEVEL_3_0,\n      e3_1     = STD_VIDEO_AV1_LEVEL_3_1,\n      e3_2     = STD_VIDEO_AV1_LEVEL_3_2,\n      e3_3     = STD_VIDEO_AV1_LEVEL_3_3,\n      e4_0     = STD_VIDEO_AV1_LEVEL_4_0,\n      e4_1     = STD_VIDEO_AV1_LEVEL_4_1,\n      e4_2     = STD_VIDEO_AV1_LEVEL_4_2,\n      e4_3     = STD_VIDEO_AV1_LEVEL_4_3,\n      e5_0     = STD_VIDEO_AV1_LEVEL_5_0,\n      e5_1     = STD_VIDEO_AV1_LEVEL_5_1,\n      e5_2     = STD_VIDEO_AV1_LEVEL_5_2,\n      e5_3     = STD_VIDEO_AV1_LEVEL_5_3,\n      e6_0     = STD_VIDEO_AV1_LEVEL_6_0,\n      e6_1     = STD_VIDEO_AV1_LEVEL_6_1,\n      e6_2     = STD_VIDEO_AV1_LEVEL_6_2,\n      e6_3     = STD_VIDEO_AV1_LEVEL_6_3,\n      e7_0     = STD_VIDEO_AV1_LEVEL_7_0,\n      e7_1     = STD_VIDEO_AV1_LEVEL_7_1,\n      e7_2     = STD_VIDEO_AV1_LEVEL_7_2,\n      e7_3     = STD_VIDEO_AV1_LEVEL_7_3,\n      eInvalid = STD_VIDEO_AV1_LEVEL_INVALID\n    };\n\n    enum class AV1FrameType\n    {\n      eKey       = STD_VIDEO_AV1_FRAME_TYPE_KEY,\n      eInter     = STD_VIDEO_AV1_FRAME_TYPE_INTER,\n      eIntraOnly = STD_VIDEO_AV1_FRAME_TYPE_INTRA_ONLY,\n      eSwitch    = STD_VIDEO_AV1_FRAME_TYPE_SWITCH,\n      eInvalid   = STD_VIDEO_AV1_FRAME_TYPE_INVALID\n    };\n\n    enum class AV1ReferenceName\n    {\n      eIntraFrame   = STD_VIDEO_AV1_REFERENCE_NAME_INTRA_FRAME,\n      eLastFrame    = STD_VIDEO_AV1_REFERENCE_NAME_LAST_FRAME,\n      eLast2Frame   = STD_VIDEO_AV1_REFERENCE_NAME_LAST2_FRAME,\n      eLast3Frame   = STD_VIDEO_AV1_REFERENCE_NAME_LAST3_FRAME,\n      eGoldenFrame  = STD_VIDEO_AV1_REFERENCE_NAME_GOLDEN_FRAME,\n      eBwdrefFrame  = STD_VIDEO_AV1_REFERENCE_NAME_BWDREF_FRAME,\n      eAltref2Frame = STD_VIDEO_AV1_REFERENCE_NAME_ALTREF2_FRAME,\n      eAltrefFrame  = STD_VIDEO_AV1_REFERENCE_NAME_ALTREF_FRAME,\n      eInvalid      = STD_VIDEO_AV1_REFERENCE_NAME_INVALID\n    };\n\n    enum class AV1InterpolationFilter\n    {\n      eEighttap       = STD_VIDEO_AV1_INTERPOLATION_FILTER_EIGHTTAP,\n      eEighttapSmooth = STD_VIDEO_AV1_INTERPOLATION_FILTER_EIGHTTAP_SMOOTH,\n      eEighttapSharp  = STD_VIDEO_AV1_INTERPOLATION_FILTER_EIGHTTAP_SHARP,\n      eBilinear       = STD_VIDEO_AV1_INTERPOLATION_FILTER_BILINEAR,\n      eSwitchable     = STD_VIDEO_AV1_INTERPOLATION_FILTER_SWITCHABLE,\n      eInvalid        = STD_VIDEO_AV1_INTERPOLATION_FILTER_INVALID\n    };\n\n    enum class AV1TxMode\n    {\n      eOnly4X4 = STD_VIDEO_AV1_TX_MODE_ONLY_4X4,\n      eLargest = STD_VIDEO_AV1_TX_MODE_LARGEST,\n      eSelect  = STD_VIDEO_AV1_TX_MODE_SELECT,\n      eInvalid = STD_VIDEO_AV1_TX_MODE_INVALID\n    };\n\n    enum class AV1FrameRestorationType\n    {\n      eNone       = STD_VIDEO_AV1_FRAME_RESTORATION_TYPE_NONE,\n      eWiener     = STD_VIDEO_AV1_FRAME_RESTORATION_TYPE_WIENER,\n      eSgrproj    = STD_VIDEO_AV1_FRAME_RESTORATION_TYPE_SGRPROJ,\n      eSwitchable = STD_VIDEO_AV1_FRAME_RESTORATION_TYPE_SWITCHABLE,\n      eInvalid    = STD_VIDEO_AV1_FRAME_RESTORATION_TYPE_INVALID\n    };\n\n    enum class AV1ColorPrimaries\n    {\n      eBt709       = STD_VIDEO_AV1_COLOR_PRIMARIES_BT_709,\n      eUnspecified = STD_VIDEO_AV1_COLOR_PRIMARIES_UNSPECIFIED,\n      eBtUnspecified VULKAN_HPP_DEPRECATED_17( \"eBtUnspecified is deprecated, eUnspecified should be used instead.\" ) =\n        STD_VIDEO_AV1_COLOR_PRIMARIES_BT_UNSPECIFIED,\n      eBt470M      = STD_VIDEO_AV1_COLOR_PRIMARIES_BT_470_M,\n      eBt470BG     = STD_VIDEO_AV1_COLOR_PRIMARIES_BT_470_B_G,\n      eBt601       = STD_VIDEO_AV1_COLOR_PRIMARIES_BT_601,\n      eSmpte240    = STD_VIDEO_AV1_COLOR_PRIMARIES_SMPTE_240,\n      eGenericFilm = STD_VIDEO_AV1_COLOR_PRIMARIES_GENERIC_FILM,\n      eBt2020      = STD_VIDEO_AV1_COLOR_PRIMARIES_BT_2020,\n      eXyz         = STD_VIDEO_AV1_COLOR_PRIMARIES_XYZ,\n      eSmpte431    = STD_VIDEO_AV1_COLOR_PRIMARIES_SMPTE_431,\n      eSmpte432    = STD_VIDEO_AV1_COLOR_PRIMARIES_SMPTE_432,\n      eEbu3213     = STD_VIDEO_AV1_COLOR_PRIMARIES_EBU_3213,\n      eInvalid     = STD_VIDEO_AV1_COLOR_PRIMARIES_INVALID\n    };\n\n    enum class AV1TransferCharacteristics\n    {\n      eReserved0    = STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_RESERVED_0,\n      eBt709        = STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_BT_709,\n      eUnspecified  = STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_UNSPECIFIED,\n      eReserved3    = STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_RESERVED_3,\n      eBt470M       = STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_BT_470_M,\n      eBt470BG      = STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_BT_470_B_G,\n      eBt601        = STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_BT_601,\n      eSmpte240     = STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_SMPTE_240,\n      eLinear       = STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_LINEAR,\n      eLog100       = STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_LOG_100,\n      eLog100Sqrt10 = STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_LOG_100_SQRT10,\n      eIec61966     = STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_IEC_61966,\n      eBt1361       = STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_BT_1361,\n      eSrgb         = STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_SRGB,\n      eBt2020_10Bit = STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_BT_2020_10_BIT,\n      eBt2020_12Bit = STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_BT_2020_12_BIT,\n      eSmpte2084    = STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_SMPTE_2084,\n      eSmpte428     = STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_SMPTE_428,\n      eHlg          = STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_HLG,\n      eInvalid      = STD_VIDEO_AV1_TRANSFER_CHARACTERISTICS_INVALID\n    };\n\n    enum class AV1MatrixCoefficients\n    {\n      eIdentity    = STD_VIDEO_AV1_MATRIX_COEFFICIENTS_IDENTITY,\n      eBt709       = STD_VIDEO_AV1_MATRIX_COEFFICIENTS_BT_709,\n      eUnspecified = STD_VIDEO_AV1_MATRIX_COEFFICIENTS_UNSPECIFIED,\n      eReserved3   = STD_VIDEO_AV1_MATRIX_COEFFICIENTS_RESERVED_3,\n      eFcc         = STD_VIDEO_AV1_MATRIX_COEFFICIENTS_FCC,\n      eBt470BG     = STD_VIDEO_AV1_MATRIX_COEFFICIENTS_BT_470_B_G,\n      eBt601       = STD_VIDEO_AV1_MATRIX_COEFFICIENTS_BT_601,\n      eSmpte240    = STD_VIDEO_AV1_MATRIX_COEFFICIENTS_SMPTE_240,\n      eSmpteYcgco  = STD_VIDEO_AV1_MATRIX_COEFFICIENTS_SMPTE_YCGCO,\n      eBt2020Ncl   = STD_VIDEO_AV1_MATRIX_COEFFICIENTS_BT_2020_NCL,\n      eBt2020Cl    = STD_VIDEO_AV1_MATRIX_COEFFICIENTS_BT_2020_CL,\n      eSmpte2085   = STD_VIDEO_AV1_MATRIX_COEFFICIENTS_SMPTE_2085,\n      eChromatNcl  = STD_VIDEO_AV1_MATRIX_COEFFICIENTS_CHROMAT_NCL,\n      eChromatCl   = STD_VIDEO_AV1_MATRIX_COEFFICIENTS_CHROMAT_CL,\n      eIctcp       = STD_VIDEO_AV1_MATRIX_COEFFICIENTS_ICTCP,\n      eInvalid     = STD_VIDEO_AV1_MATRIX_COEFFICIENTS_INVALID\n    };\n\n    enum class AV1ChromaSamplePosition\n    {\n      eUnknown   = STD_VIDEO_AV1_CHROMA_SAMPLE_POSITION_UNKNOWN,\n      eVertical  = STD_VIDEO_AV1_CHROMA_SAMPLE_POSITION_VERTICAL,\n      eColocated = STD_VIDEO_AV1_CHROMA_SAMPLE_POSITION_COLOCATED,\n      eReserved  = STD_VIDEO_AV1_CHROMA_SAMPLE_POSITION_RESERVED,\n      eInvalid   = STD_VIDEO_AV1_CHROMA_SAMPLE_POSITION_INVALID\n    };\n\n    //===============\n    //=== STRUCTS ===\n    //===============\n\n    //=== vulkan_video_codec_h264std ===\n\n    struct H264SpsVuiFlags\n    {\n      using NativeType = StdVideoH264SpsVuiFlags;\n\n      operator StdVideoH264SpsVuiFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH264SpsVuiFlags *>( this );\n      }\n\n      operator StdVideoH264SpsVuiFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH264SpsVuiFlags *>( this );\n      }\n\n      bool operator==( H264SpsVuiFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( aspect_ratio_info_present_flag == rhs.aspect_ratio_info_present_flag ) && ( overscan_info_present_flag == rhs.overscan_info_present_flag ) &&\n               ( overscan_appropriate_flag == rhs.overscan_appropriate_flag ) && ( video_signal_type_present_flag == rhs.video_signal_type_present_flag ) &&\n               ( video_full_range_flag == rhs.video_full_range_flag ) && ( color_description_present_flag == rhs.color_description_present_flag ) &&\n               ( chroma_loc_info_present_flag == rhs.chroma_loc_info_present_flag ) && ( timing_info_present_flag == rhs.timing_info_present_flag ) &&\n               ( fixed_frame_rate_flag == rhs.fixed_frame_rate_flag ) && ( bitstream_restriction_flag == rhs.bitstream_restriction_flag ) &&\n               ( nal_hrd_parameters_present_flag == rhs.nal_hrd_parameters_present_flag ) &&\n               ( vcl_hrd_parameters_present_flag == rhs.vcl_hrd_parameters_present_flag );\n      }\n\n      bool operator!=( H264SpsVuiFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t aspect_ratio_info_present_flag  : 1;\n      uint32_t overscan_info_present_flag      : 1;\n      uint32_t overscan_appropriate_flag       : 1;\n      uint32_t video_signal_type_present_flag  : 1;\n      uint32_t video_full_range_flag           : 1;\n      uint32_t color_description_present_flag  : 1;\n      uint32_t chroma_loc_info_present_flag    : 1;\n      uint32_t timing_info_present_flag        : 1;\n      uint32_t fixed_frame_rate_flag           : 1;\n      uint32_t bitstream_restriction_flag      : 1;\n      uint32_t nal_hrd_parameters_present_flag : 1;\n      uint32_t vcl_hrd_parameters_present_flag : 1;\n    };\n\n    struct H264HrdParameters\n    {\n      using NativeType = StdVideoH264HrdParameters;\n\n      operator StdVideoH264HrdParameters const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH264HrdParameters *>( this );\n      }\n\n      operator StdVideoH264HrdParameters &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH264HrdParameters *>( this );\n      }\n\n      bool operator==( H264HrdParameters const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( cpb_cnt_minus1 == rhs.cpb_cnt_minus1 ) && ( bit_rate_scale == rhs.bit_rate_scale ) && ( cpb_size_scale == rhs.cpb_size_scale ) &&\n               ( reserved1 == rhs.reserved1 ) && ( bit_rate_value_minus1 == rhs.bit_rate_value_minus1 ) &&\n               ( cpb_size_value_minus1 == rhs.cpb_size_value_minus1 ) && ( cbr_flag == rhs.cbr_flag ) &&\n               ( initial_cpb_removal_delay_length_minus1 == rhs.initial_cpb_removal_delay_length_minus1 ) &&\n               ( cpb_removal_delay_length_minus1 == rhs.cpb_removal_delay_length_minus1 ) &&\n               ( dpb_output_delay_length_minus1 == rhs.dpb_output_delay_length_minus1 ) && ( time_offset_length == rhs.time_offset_length );\n      }\n\n      bool operator!=( H264HrdParameters const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint8_t                                                                          cpb_cnt_minus1                          = {};\n      uint8_t                                                                          bit_rate_scale                          = {};\n      uint8_t                                                                          cpb_size_scale                          = {};\n      uint8_t                                                                          reserved1                               = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, STD_VIDEO_H264_CPB_CNT_LIST_SIZE> bit_rate_value_minus1                   = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, STD_VIDEO_H264_CPB_CNT_LIST_SIZE> cpb_size_value_minus1                   = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H264_CPB_CNT_LIST_SIZE>  cbr_flag                                = {};\n      uint32_t                                                                         initial_cpb_removal_delay_length_minus1 = {};\n      uint32_t                                                                         cpb_removal_delay_length_minus1         = {};\n      uint32_t                                                                         dpb_output_delay_length_minus1          = {};\n      uint32_t                                                                         time_offset_length                      = {};\n    };\n\n    struct H264SequenceParameterSetVui\n    {\n      using NativeType = StdVideoH264SequenceParameterSetVui;\n\n      operator StdVideoH264SequenceParameterSetVui const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH264SequenceParameterSetVui *>( this );\n      }\n\n      operator StdVideoH264SequenceParameterSetVui &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH264SequenceParameterSetVui *>( this );\n      }\n\n      bool operator==( H264SequenceParameterSetVui const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( aspect_ratio_idc == rhs.aspect_ratio_idc ) && ( sar_width == rhs.sar_width ) && ( sar_height == rhs.sar_height ) &&\n               ( video_format == rhs.video_format ) && ( colour_primaries == rhs.colour_primaries ) &&\n               ( transfer_characteristics == rhs.transfer_characteristics ) && ( matrix_coefficients == rhs.matrix_coefficients ) &&\n               ( num_units_in_tick == rhs.num_units_in_tick ) && ( time_scale == rhs.time_scale ) && ( max_num_reorder_frames == rhs.max_num_reorder_frames ) &&\n               ( max_dec_frame_buffering == rhs.max_dec_frame_buffering ) && ( chroma_sample_loc_type_top_field == rhs.chroma_sample_loc_type_top_field ) &&\n               ( chroma_sample_loc_type_bottom_field == rhs.chroma_sample_loc_type_bottom_field ) && ( reserved1 == rhs.reserved1 ) &&\n               ( pHrdParameters == rhs.pHrdParameters );\n      }\n\n      bool operator!=( H264SequenceParameterSetVui const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264SpsVuiFlags    flags = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264AspectRatioIdc aspect_ratio_idc =\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264AspectRatioIdc::eUnspecified;\n      uint16_t                                                                    sar_width                           = {};\n      uint16_t                                                                    sar_height                          = {};\n      uint8_t                                                                     video_format                        = {};\n      uint8_t                                                                     colour_primaries                    = {};\n      uint8_t                                                                     transfer_characteristics            = {};\n      uint8_t                                                                     matrix_coefficients                 = {};\n      uint32_t                                                                    num_units_in_tick                   = {};\n      uint32_t                                                                    time_scale                          = {};\n      uint8_t                                                                     max_num_reorder_frames              = {};\n      uint8_t                                                                     max_dec_frame_buffering             = {};\n      uint8_t                                                                     chroma_sample_loc_type_top_field    = {};\n      uint8_t                                                                     chroma_sample_loc_type_bottom_field = {};\n      uint32_t                                                                    reserved1                           = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264HrdParameters * pHrdParameters                      = {};\n    };\n\n    struct H264SpsFlags\n    {\n      using NativeType = StdVideoH264SpsFlags;\n\n      operator StdVideoH264SpsFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH264SpsFlags *>( this );\n      }\n\n      operator StdVideoH264SpsFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH264SpsFlags *>( this );\n      }\n\n      bool operator==( H264SpsFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( constraint_set0_flag == rhs.constraint_set0_flag ) && ( constraint_set1_flag == rhs.constraint_set1_flag ) &&\n               ( constraint_set2_flag == rhs.constraint_set2_flag ) && ( constraint_set3_flag == rhs.constraint_set3_flag ) &&\n               ( constraint_set4_flag == rhs.constraint_set4_flag ) && ( constraint_set5_flag == rhs.constraint_set5_flag ) &&\n               ( direct_8x8_inference_flag == rhs.direct_8x8_inference_flag ) && ( mb_adaptive_frame_field_flag == rhs.mb_adaptive_frame_field_flag ) &&\n               ( frame_mbs_only_flag == rhs.frame_mbs_only_flag ) && ( delta_pic_order_always_zero_flag == rhs.delta_pic_order_always_zero_flag ) &&\n               ( separate_colour_plane_flag == rhs.separate_colour_plane_flag ) &&\n               ( gaps_in_frame_num_value_allowed_flag == rhs.gaps_in_frame_num_value_allowed_flag ) &&\n               ( qpprime_y_zero_transform_bypass_flag == rhs.qpprime_y_zero_transform_bypass_flag ) && ( frame_cropping_flag == rhs.frame_cropping_flag ) &&\n               ( seq_scaling_matrix_present_flag == rhs.seq_scaling_matrix_present_flag ) && ( vui_parameters_present_flag == rhs.vui_parameters_present_flag );\n      }\n\n      bool operator!=( H264SpsFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t constraint_set0_flag                 : 1;\n      uint32_t constraint_set1_flag                 : 1;\n      uint32_t constraint_set2_flag                 : 1;\n      uint32_t constraint_set3_flag                 : 1;\n      uint32_t constraint_set4_flag                 : 1;\n      uint32_t constraint_set5_flag                 : 1;\n      uint32_t direct_8x8_inference_flag            : 1;\n      uint32_t mb_adaptive_frame_field_flag         : 1;\n      uint32_t frame_mbs_only_flag                  : 1;\n      uint32_t delta_pic_order_always_zero_flag     : 1;\n      uint32_t separate_colour_plane_flag           : 1;\n      uint32_t gaps_in_frame_num_value_allowed_flag : 1;\n      uint32_t qpprime_y_zero_transform_bypass_flag : 1;\n      uint32_t frame_cropping_flag                  : 1;\n      uint32_t seq_scaling_matrix_present_flag      : 1;\n      uint32_t vui_parameters_present_flag          : 1;\n    };\n\n    struct H264ScalingLists\n    {\n      using NativeType = StdVideoH264ScalingLists;\n\n      operator StdVideoH264ScalingLists const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH264ScalingLists *>( this );\n      }\n\n      operator StdVideoH264ScalingLists &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH264ScalingLists *>( this );\n      }\n\n      bool operator==( H264ScalingLists const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( scaling_list_present_mask == rhs.scaling_list_present_mask ) && ( use_default_scaling_matrix_mask == rhs.use_default_scaling_matrix_mask ) &&\n               ( ScalingList4x4 == rhs.ScalingList4x4 ) && ( ScalingList8x8 == rhs.ScalingList8x8 );\n      }\n\n      bool operator!=( H264ScalingLists const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint16_t scaling_list_present_mask       = {};\n      uint16_t use_default_scaling_matrix_mask = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<uint8_t, STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS, STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS>\n        ScalingList4x4 = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<uint8_t, STD_VIDEO_H264_SCALING_LIST_8X8_NUM_LISTS, STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS>\n        ScalingList8x8 = {};\n    };\n\n    struct H264SequenceParameterSet\n    {\n      using NativeType = StdVideoH264SequenceParameterSet;\n\n      operator StdVideoH264SequenceParameterSet const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH264SequenceParameterSet *>( this );\n      }\n\n      operator StdVideoH264SequenceParameterSet &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH264SequenceParameterSet *>( this );\n      }\n\n      bool operator==( H264SequenceParameterSet const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( profile_idc == rhs.profile_idc ) && ( level_idc == rhs.level_idc ) &&\n               ( chroma_format_idc == rhs.chroma_format_idc ) && ( seq_parameter_set_id == rhs.seq_parameter_set_id ) &&\n               ( bit_depth_luma_minus8 == rhs.bit_depth_luma_minus8 ) && ( bit_depth_chroma_minus8 == rhs.bit_depth_chroma_minus8 ) &&\n               ( log2_max_frame_num_minus4 == rhs.log2_max_frame_num_minus4 ) && ( pic_order_cnt_type == rhs.pic_order_cnt_type ) &&\n               ( offset_for_non_ref_pic == rhs.offset_for_non_ref_pic ) && ( offset_for_top_to_bottom_field == rhs.offset_for_top_to_bottom_field ) &&\n               ( log2_max_pic_order_cnt_lsb_minus4 == rhs.log2_max_pic_order_cnt_lsb_minus4 ) &&\n               ( num_ref_frames_in_pic_order_cnt_cycle == rhs.num_ref_frames_in_pic_order_cnt_cycle ) && ( max_num_ref_frames == rhs.max_num_ref_frames ) &&\n               ( reserved1 == rhs.reserved1 ) && ( pic_width_in_mbs_minus1 == rhs.pic_width_in_mbs_minus1 ) &&\n               ( pic_height_in_map_units_minus1 == rhs.pic_height_in_map_units_minus1 ) && ( frame_crop_left_offset == rhs.frame_crop_left_offset ) &&\n               ( frame_crop_right_offset == rhs.frame_crop_right_offset ) && ( frame_crop_top_offset == rhs.frame_crop_top_offset ) &&\n               ( frame_crop_bottom_offset == rhs.frame_crop_bottom_offset ) && ( reserved2 == rhs.reserved2 ) &&\n               ( pOffsetForRefFrame == rhs.pOffsetForRefFrame ) && ( pScalingLists == rhs.pScalingLists ) &&\n               ( pSequenceParameterSetVui == rhs.pSequenceParameterSetVui );\n      }\n\n      bool operator!=( H264SequenceParameterSet const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264SpsFlags   flags = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264ProfileIdc profile_idc =\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264ProfileIdc::eBaseline;\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264LevelIdc        level_idc = VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264LevelIdc::e1_0;\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264ChromaFormatIdc chroma_format_idc =\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264ChromaFormatIdc::eMonochrome;\n      uint8_t                                                       seq_parameter_set_id      = {};\n      uint8_t                                                       bit_depth_luma_minus8     = {};\n      uint8_t                                                       bit_depth_chroma_minus8   = {};\n      uint8_t                                                       log2_max_frame_num_minus4 = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264PocType pic_order_cnt_type     = VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264PocType::e0;\n      int32_t                                                       offset_for_non_ref_pic = {};\n      int32_t                                                       offset_for_top_to_bottom_field                   = {};\n      uint8_t                                                       log2_max_pic_order_cnt_lsb_minus4                = {};\n      uint8_t                                                       num_ref_frames_in_pic_order_cnt_cycle            = {};\n      uint8_t                                                       max_num_ref_frames                               = {};\n      uint8_t                                                       reserved1                                        = {};\n      uint32_t                                                      pic_width_in_mbs_minus1                          = {};\n      uint32_t                                                      pic_height_in_map_units_minus1                   = {};\n      uint32_t                                                      frame_crop_left_offset                           = {};\n      uint32_t                                                      frame_crop_right_offset                          = {};\n      uint32_t                                                      frame_crop_top_offset                            = {};\n      uint32_t                                                      frame_crop_bottom_offset                         = {};\n      uint32_t                                                      reserved2                                        = {};\n      const int32_t *                                               pOffsetForRefFrame                               = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264ScalingLists *            pScalingLists            = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264SequenceParameterSetVui * pSequenceParameterSetVui = {};\n    };\n\n    struct H264PpsFlags\n    {\n      using NativeType = StdVideoH264PpsFlags;\n\n      operator StdVideoH264PpsFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH264PpsFlags *>( this );\n      }\n\n      operator StdVideoH264PpsFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH264PpsFlags *>( this );\n      }\n\n      bool operator==( H264PpsFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( transform_8x8_mode_flag == rhs.transform_8x8_mode_flag ) && ( redundant_pic_cnt_present_flag == rhs.redundant_pic_cnt_present_flag ) &&\n               ( constrained_intra_pred_flag == rhs.constrained_intra_pred_flag ) &&\n               ( deblocking_filter_control_present_flag == rhs.deblocking_filter_control_present_flag ) && ( weighted_pred_flag == rhs.weighted_pred_flag ) &&\n               ( bottom_field_pic_order_in_frame_present_flag == rhs.bottom_field_pic_order_in_frame_present_flag ) &&\n               ( entropy_coding_mode_flag == rhs.entropy_coding_mode_flag ) && ( pic_scaling_matrix_present_flag == rhs.pic_scaling_matrix_present_flag );\n      }\n\n      bool operator!=( H264PpsFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t transform_8x8_mode_flag                      : 1;\n      uint32_t redundant_pic_cnt_present_flag               : 1;\n      uint32_t constrained_intra_pred_flag                  : 1;\n      uint32_t deblocking_filter_control_present_flag       : 1;\n      uint32_t weighted_pred_flag                           : 1;\n      uint32_t bottom_field_pic_order_in_frame_present_flag : 1;\n      uint32_t entropy_coding_mode_flag                     : 1;\n      uint32_t pic_scaling_matrix_present_flag              : 1;\n    };\n\n    struct H264PictureParameterSet\n    {\n      using NativeType = StdVideoH264PictureParameterSet;\n\n      operator StdVideoH264PictureParameterSet const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH264PictureParameterSet *>( this );\n      }\n\n      operator StdVideoH264PictureParameterSet &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH264PictureParameterSet *>( this );\n      }\n\n      bool operator==( H264PictureParameterSet const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( seq_parameter_set_id == rhs.seq_parameter_set_id ) && ( pic_parameter_set_id == rhs.pic_parameter_set_id ) &&\n               ( num_ref_idx_l0_default_active_minus1 == rhs.num_ref_idx_l0_default_active_minus1 ) &&\n               ( num_ref_idx_l1_default_active_minus1 == rhs.num_ref_idx_l1_default_active_minus1 ) && ( weighted_bipred_idc == rhs.weighted_bipred_idc ) &&\n               ( pic_init_qp_minus26 == rhs.pic_init_qp_minus26 ) && ( pic_init_qs_minus26 == rhs.pic_init_qs_minus26 ) &&\n               ( chroma_qp_index_offset == rhs.chroma_qp_index_offset ) && ( second_chroma_qp_index_offset == rhs.second_chroma_qp_index_offset ) &&\n               ( pScalingLists == rhs.pScalingLists );\n      }\n\n      bool operator!=( H264PictureParameterSet const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264PpsFlags          flags                                = {};\n      uint8_t                                                                 seq_parameter_set_id                 = {};\n      uint8_t                                                                 pic_parameter_set_id                 = {};\n      uint8_t                                                                 num_ref_idx_l0_default_active_minus1 = {};\n      uint8_t                                                                 num_ref_idx_l1_default_active_minus1 = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264WeightedBipredIdc weighted_bipred_idc =\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264WeightedBipredIdc::eDefault;\n      int8_t                                                                     pic_init_qp_minus26           = {};\n      int8_t                                                                     pic_init_qs_minus26           = {};\n      int8_t                                                                     chroma_qp_index_offset        = {};\n      int8_t                                                                     second_chroma_qp_index_offset = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264ScalingLists * pScalingLists                 = {};\n    };\n\n    //=== vulkan_video_codec_h264std_decode ===\n\n    struct DecodeH264PictureInfoFlags\n    {\n      using NativeType = StdVideoDecodeH264PictureInfoFlags;\n\n      operator StdVideoDecodeH264PictureInfoFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoDecodeH264PictureInfoFlags *>( this );\n      }\n\n      operator StdVideoDecodeH264PictureInfoFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoDecodeH264PictureInfoFlags *>( this );\n      }\n\n      bool operator==( DecodeH264PictureInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( field_pic_flag == rhs.field_pic_flag ) && ( is_intra == rhs.is_intra ) && ( IdrPicFlag == rhs.IdrPicFlag ) &&\n               ( bottom_field_flag == rhs.bottom_field_flag ) && ( is_reference == rhs.is_reference ) &&\n               ( complementary_field_pair == rhs.complementary_field_pair );\n      }\n\n      bool operator!=( DecodeH264PictureInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t field_pic_flag           : 1;\n      uint32_t is_intra                 : 1;\n      uint32_t IdrPicFlag               : 1;\n      uint32_t bottom_field_flag        : 1;\n      uint32_t is_reference             : 1;\n      uint32_t complementary_field_pair : 1;\n    };\n\n    struct DecodeH264PictureInfo\n    {\n      using NativeType = StdVideoDecodeH264PictureInfo;\n\n      operator StdVideoDecodeH264PictureInfo const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoDecodeH264PictureInfo *>( this );\n      }\n\n      operator StdVideoDecodeH264PictureInfo &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoDecodeH264PictureInfo *>( this );\n      }\n\n      bool operator==( DecodeH264PictureInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( seq_parameter_set_id == rhs.seq_parameter_set_id ) && ( pic_parameter_set_id == rhs.pic_parameter_set_id ) &&\n               ( reserved1 == rhs.reserved1 ) && ( reserved2 == rhs.reserved2 ) && ( frame_num == rhs.frame_num ) && ( idr_pic_id == rhs.idr_pic_id ) &&\n               ( PicOrderCnt == rhs.PicOrderCnt );\n      }\n\n      bool operator!=( DecodeH264PictureInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::DecodeH264PictureInfoFlags                     flags                = {};\n      uint8_t                                                                                          seq_parameter_set_id = {};\n      uint8_t                                                                                          pic_parameter_set_id = {};\n      uint8_t                                                                                          reserved1            = {};\n      uint8_t                                                                                          reserved2            = {};\n      uint16_t                                                                                         frame_num            = {};\n      uint16_t                                                                                         idr_pic_id           = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int32_t, STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE> PicOrderCnt          = {};\n    };\n\n    struct DecodeH264ReferenceInfoFlags\n    {\n      using NativeType = StdVideoDecodeH264ReferenceInfoFlags;\n\n      operator StdVideoDecodeH264ReferenceInfoFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoDecodeH264ReferenceInfoFlags *>( this );\n      }\n\n      operator StdVideoDecodeH264ReferenceInfoFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoDecodeH264ReferenceInfoFlags *>( this );\n      }\n\n      bool operator==( DecodeH264ReferenceInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( top_field_flag == rhs.top_field_flag ) && ( bottom_field_flag == rhs.bottom_field_flag ) &&\n               ( used_for_long_term_reference == rhs.used_for_long_term_reference ) && ( is_non_existing == rhs.is_non_existing );\n      }\n\n      bool operator!=( DecodeH264ReferenceInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t top_field_flag               : 1;\n      uint32_t bottom_field_flag            : 1;\n      uint32_t used_for_long_term_reference : 1;\n      uint32_t is_non_existing              : 1;\n    };\n\n    struct DecodeH264ReferenceInfo\n    {\n      using NativeType = StdVideoDecodeH264ReferenceInfo;\n\n      operator StdVideoDecodeH264ReferenceInfo const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoDecodeH264ReferenceInfo *>( this );\n      }\n\n      operator StdVideoDecodeH264ReferenceInfo &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoDecodeH264ReferenceInfo *>( this );\n      }\n\n      bool operator==( DecodeH264ReferenceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( FrameNum == rhs.FrameNum ) && ( reserved == rhs.reserved ) && ( PicOrderCnt == rhs.PicOrderCnt );\n      }\n\n      bool operator!=( DecodeH264ReferenceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::DecodeH264ReferenceInfoFlags                   flags       = {};\n      uint16_t                                                                                         FrameNum    = {};\n      uint16_t                                                                                         reserved    = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int32_t, STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE> PicOrderCnt = {};\n    };\n\n    //=== vulkan_video_codec_h264std_encode ===\n\n    struct EncodeH264WeightTableFlags\n    {\n      using NativeType = StdVideoEncodeH264WeightTableFlags;\n\n      operator StdVideoEncodeH264WeightTableFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeH264WeightTableFlags *>( this );\n      }\n\n      operator StdVideoEncodeH264WeightTableFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeH264WeightTableFlags *>( this );\n      }\n\n      bool operator==( EncodeH264WeightTableFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( luma_weight_l0_flag == rhs.luma_weight_l0_flag ) && ( chroma_weight_l0_flag == rhs.chroma_weight_l0_flag ) &&\n               ( luma_weight_l1_flag == rhs.luma_weight_l1_flag ) && ( chroma_weight_l1_flag == rhs.chroma_weight_l1_flag );\n      }\n\n      bool operator!=( EncodeH264WeightTableFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t luma_weight_l0_flag   = {};\n      uint32_t chroma_weight_l0_flag = {};\n      uint32_t luma_weight_l1_flag   = {};\n      uint32_t chroma_weight_l1_flag = {};\n    };\n\n    struct EncodeH264WeightTable\n    {\n      using NativeType = StdVideoEncodeH264WeightTable;\n\n      operator StdVideoEncodeH264WeightTable const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeH264WeightTable *>( this );\n      }\n\n      operator StdVideoEncodeH264WeightTable &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeH264WeightTable *>( this );\n      }\n\n      bool operator==( EncodeH264WeightTable const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( luma_log2_weight_denom == rhs.luma_log2_weight_denom ) &&\n               ( chroma_log2_weight_denom == rhs.chroma_log2_weight_denom ) && ( luma_weight_l0 == rhs.luma_weight_l0 ) &&\n               ( luma_offset_l0 == rhs.luma_offset_l0 ) && ( chroma_weight_l0 == rhs.chroma_weight_l0 ) && ( chroma_offset_l0 == rhs.chroma_offset_l0 ) &&\n               ( luma_weight_l1 == rhs.luma_weight_l1 ) && ( luma_offset_l1 == rhs.luma_offset_l1 ) && ( chroma_weight_l1 == rhs.chroma_weight_l1 ) &&\n               ( chroma_offset_l1 == rhs.chroma_offset_l1 );\n      }\n\n      bool operator!=( EncodeH264WeightTable const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH264WeightTableFlags                                    flags                    = {};\n      uint8_t                                                                                                         luma_log2_weight_denom   = {};\n      uint8_t                                                                                                         chroma_log2_weight_denom = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_H264_MAX_NUM_LIST_REF>                                   luma_weight_l0           = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_H264_MAX_NUM_LIST_REF>                                   luma_offset_l0           = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<int8_t, STD_VIDEO_H264_MAX_NUM_LIST_REF, STD_VIDEO_H264_MAX_CHROMA_PLANES> chroma_weight_l0         = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<int8_t, STD_VIDEO_H264_MAX_NUM_LIST_REF, STD_VIDEO_H264_MAX_CHROMA_PLANES> chroma_offset_l0         = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_H264_MAX_NUM_LIST_REF>                                   luma_weight_l1           = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_H264_MAX_NUM_LIST_REF>                                   luma_offset_l1           = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<int8_t, STD_VIDEO_H264_MAX_NUM_LIST_REF, STD_VIDEO_H264_MAX_CHROMA_PLANES> chroma_weight_l1         = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<int8_t, STD_VIDEO_H264_MAX_NUM_LIST_REF, STD_VIDEO_H264_MAX_CHROMA_PLANES> chroma_offset_l1         = {};\n    };\n\n    struct EncodeH264SliceHeaderFlags\n    {\n      using NativeType = StdVideoEncodeH264SliceHeaderFlags;\n\n      operator StdVideoEncodeH264SliceHeaderFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeH264SliceHeaderFlags *>( this );\n      }\n\n      operator StdVideoEncodeH264SliceHeaderFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeH264SliceHeaderFlags *>( this );\n      }\n\n      bool operator==( EncodeH264SliceHeaderFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( direct_spatial_mv_pred_flag == rhs.direct_spatial_mv_pred_flag ) &&\n               ( num_ref_idx_active_override_flag == rhs.num_ref_idx_active_override_flag ) && ( reserved == rhs.reserved );\n      }\n\n      bool operator!=( EncodeH264SliceHeaderFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t direct_spatial_mv_pred_flag      : 1;\n      uint32_t num_ref_idx_active_override_flag : 1;\n      uint32_t reserved                         : 30;\n    };\n\n    struct EncodeH264PictureInfoFlags\n    {\n      using NativeType = StdVideoEncodeH264PictureInfoFlags;\n\n      operator StdVideoEncodeH264PictureInfoFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeH264PictureInfoFlags *>( this );\n      }\n\n      operator StdVideoEncodeH264PictureInfoFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeH264PictureInfoFlags *>( this );\n      }\n\n      bool operator==( EncodeH264PictureInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( IdrPicFlag == rhs.IdrPicFlag ) && ( is_reference == rhs.is_reference ) &&\n               ( no_output_of_prior_pics_flag == rhs.no_output_of_prior_pics_flag ) && ( long_term_reference_flag == rhs.long_term_reference_flag ) &&\n               ( adaptive_ref_pic_marking_mode_flag == rhs.adaptive_ref_pic_marking_mode_flag ) && ( reserved == rhs.reserved );\n      }\n\n      bool operator!=( EncodeH264PictureInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t IdrPicFlag                         : 1;\n      uint32_t is_reference                       : 1;\n      uint32_t no_output_of_prior_pics_flag       : 1;\n      uint32_t long_term_reference_flag           : 1;\n      uint32_t adaptive_ref_pic_marking_mode_flag : 1;\n      uint32_t reserved                           : 27;\n    };\n\n    struct EncodeH264ReferenceInfoFlags\n    {\n      using NativeType = StdVideoEncodeH264ReferenceInfoFlags;\n\n      operator StdVideoEncodeH264ReferenceInfoFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeH264ReferenceInfoFlags *>( this );\n      }\n\n      operator StdVideoEncodeH264ReferenceInfoFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeH264ReferenceInfoFlags *>( this );\n      }\n\n      bool operator==( EncodeH264ReferenceInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( used_for_long_term_reference == rhs.used_for_long_term_reference ) && ( reserved == rhs.reserved );\n      }\n\n      bool operator!=( EncodeH264ReferenceInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t used_for_long_term_reference : 1;\n      uint32_t reserved                     : 31;\n    };\n\n    struct EncodeH264ReferenceListsInfoFlags\n    {\n      using NativeType = StdVideoEncodeH264ReferenceListsInfoFlags;\n\n      operator StdVideoEncodeH264ReferenceListsInfoFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeH264ReferenceListsInfoFlags *>( this );\n      }\n\n      operator StdVideoEncodeH264ReferenceListsInfoFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeH264ReferenceListsInfoFlags *>( this );\n      }\n\n      bool operator==( EncodeH264ReferenceListsInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( ref_pic_list_modification_flag_l0 == rhs.ref_pic_list_modification_flag_l0 ) &&\n               ( ref_pic_list_modification_flag_l1 == rhs.ref_pic_list_modification_flag_l1 ) && ( reserved == rhs.reserved );\n      }\n\n      bool operator!=( EncodeH264ReferenceListsInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t ref_pic_list_modification_flag_l0 : 1;\n      uint32_t ref_pic_list_modification_flag_l1 : 1;\n      uint32_t reserved                          : 30;\n    };\n\n    struct EncodeH264RefListModEntry\n    {\n      using NativeType = StdVideoEncodeH264RefListModEntry;\n\n      operator StdVideoEncodeH264RefListModEntry const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeH264RefListModEntry *>( this );\n      }\n\n      operator StdVideoEncodeH264RefListModEntry &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeH264RefListModEntry *>( this );\n      }\n\n      bool operator==( EncodeH264RefListModEntry const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( modification_of_pic_nums_idc == rhs.modification_of_pic_nums_idc ) && ( abs_diff_pic_num_minus1 == rhs.abs_diff_pic_num_minus1 ) &&\n               ( long_term_pic_num == rhs.long_term_pic_num );\n      }\n\n      bool operator!=( EncodeH264RefListModEntry const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264ModificationOfPicNumsIdc modification_of_pic_nums_idc =\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264ModificationOfPicNumsIdc::eShortTermSubtract;\n      uint16_t abs_diff_pic_num_minus1 = {};\n      uint16_t long_term_pic_num       = {};\n    };\n\n    struct EncodeH264RefPicMarkingEntry\n    {\n      using NativeType = StdVideoEncodeH264RefPicMarkingEntry;\n\n      operator StdVideoEncodeH264RefPicMarkingEntry const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeH264RefPicMarkingEntry *>( this );\n      }\n\n      operator StdVideoEncodeH264RefPicMarkingEntry &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeH264RefPicMarkingEntry *>( this );\n      }\n\n      bool operator==( EncodeH264RefPicMarkingEntry const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( memory_management_control_operation == rhs.memory_management_control_operation ) &&\n               ( difference_of_pic_nums_minus1 == rhs.difference_of_pic_nums_minus1 ) && ( long_term_pic_num == rhs.long_term_pic_num ) &&\n               ( long_term_frame_idx == rhs.long_term_frame_idx ) && ( max_long_term_frame_idx_plus1 == rhs.max_long_term_frame_idx_plus1 );\n      }\n\n      bool operator!=( EncodeH264RefPicMarkingEntry const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264MemMgmtControlOp memory_management_control_operation =\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264MemMgmtControlOp::eEnd;\n      uint16_t difference_of_pic_nums_minus1 = {};\n      uint16_t long_term_pic_num             = {};\n      uint16_t long_term_frame_idx           = {};\n      uint16_t max_long_term_frame_idx_plus1 = {};\n    };\n\n    struct EncodeH264ReferenceListsInfo\n    {\n      using NativeType = StdVideoEncodeH264ReferenceListsInfo;\n\n      operator StdVideoEncodeH264ReferenceListsInfo const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeH264ReferenceListsInfo *>( this );\n      }\n\n      operator StdVideoEncodeH264ReferenceListsInfo &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeH264ReferenceListsInfo *>( this );\n      }\n\n      bool operator==( EncodeH264ReferenceListsInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( num_ref_idx_l0_active_minus1 == rhs.num_ref_idx_l0_active_minus1 ) &&\n               ( num_ref_idx_l1_active_minus1 == rhs.num_ref_idx_l1_active_minus1 ) && ( RefPicList0 == rhs.RefPicList0 ) &&\n               ( RefPicList1 == rhs.RefPicList1 ) && ( refList0ModOpCount == rhs.refList0ModOpCount ) && ( refList1ModOpCount == rhs.refList1ModOpCount ) &&\n               ( refPicMarkingOpCount == rhs.refPicMarkingOpCount ) && ( reserved1 == rhs.reserved1 ) &&\n               ( pRefList0ModOperations == rhs.pRefList0ModOperations ) && ( pRefList1ModOperations == rhs.pRefList1ModOperations ) &&\n               ( pRefPicMarkingOperations == rhs.pRefPicMarkingOperations );\n      }\n\n      bool operator!=( EncodeH264ReferenceListsInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH264ReferenceListsInfoFlags    flags                        = {};\n      uint8_t                                                                                num_ref_idx_l0_active_minus1 = {};\n      uint8_t                                                                                num_ref_idx_l1_active_minus1 = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H264_MAX_NUM_LIST_REF>         RefPicList0                  = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H264_MAX_NUM_LIST_REF>         RefPicList1                  = {};\n      uint8_t                                                                                refList0ModOpCount           = {};\n      uint8_t                                                                                refList1ModOpCount           = {};\n      uint8_t                                                                                refPicMarkingOpCount         = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, 7>                                       reserved1                    = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH264RefListModEntry *    pRefList0ModOperations       = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH264RefListModEntry *    pRefList1ModOperations       = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH264RefPicMarkingEntry * pRefPicMarkingOperations     = {};\n    };\n\n    struct EncodeH264PictureInfo\n    {\n      using NativeType = StdVideoEncodeH264PictureInfo;\n\n      operator StdVideoEncodeH264PictureInfo const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeH264PictureInfo *>( this );\n      }\n\n      operator StdVideoEncodeH264PictureInfo &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeH264PictureInfo *>( this );\n      }\n\n      bool operator==( EncodeH264PictureInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( seq_parameter_set_id == rhs.seq_parameter_set_id ) && ( pic_parameter_set_id == rhs.pic_parameter_set_id ) &&\n               ( idr_pic_id == rhs.idr_pic_id ) && ( primary_pic_type == rhs.primary_pic_type ) && ( frame_num == rhs.frame_num ) &&\n               ( PicOrderCnt == rhs.PicOrderCnt ) && ( temporal_id == rhs.temporal_id ) && ( reserved1 == rhs.reserved1 ) && ( pRefLists == rhs.pRefLists );\n      }\n\n      bool operator!=( EncodeH264PictureInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH264PictureInfoFlags flags                = {};\n      uint8_t                                                                      seq_parameter_set_id = {};\n      uint8_t                                                                      pic_parameter_set_id = {};\n      uint16_t                                                                     idr_pic_id           = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264PictureType            primary_pic_type =\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264PictureType::eP;\n      uint32_t                                                                               frame_num   = {};\n      int32_t                                                                                PicOrderCnt = {};\n      uint8_t                                                                                temporal_id = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, 3>                                       reserved1   = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH264ReferenceListsInfo * pRefLists   = {};\n    };\n\n    struct EncodeH264ReferenceInfo\n    {\n      using NativeType = StdVideoEncodeH264ReferenceInfo;\n\n      operator StdVideoEncodeH264ReferenceInfo const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeH264ReferenceInfo *>( this );\n      }\n\n      operator StdVideoEncodeH264ReferenceInfo &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeH264ReferenceInfo *>( this );\n      }\n\n      bool operator==( EncodeH264ReferenceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( primary_pic_type == rhs.primary_pic_type ) && ( FrameNum == rhs.FrameNum ) && ( PicOrderCnt == rhs.PicOrderCnt ) &&\n               ( long_term_pic_num == rhs.long_term_pic_num ) && ( long_term_frame_idx == rhs.long_term_frame_idx ) && ( temporal_id == rhs.temporal_id );\n      }\n\n      bool operator!=( EncodeH264ReferenceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH264ReferenceInfoFlags flags = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264PictureType              primary_pic_type =\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264PictureType::eP;\n      uint32_t FrameNum            = {};\n      int32_t  PicOrderCnt         = {};\n      uint16_t long_term_pic_num   = {};\n      uint16_t long_term_frame_idx = {};\n      uint8_t  temporal_id         = {};\n    };\n\n    struct EncodeH264SliceHeader\n    {\n      using NativeType = StdVideoEncodeH264SliceHeader;\n\n      operator StdVideoEncodeH264SliceHeader const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeH264SliceHeader *>( this );\n      }\n\n      operator StdVideoEncodeH264SliceHeader &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeH264SliceHeader *>( this );\n      }\n\n      bool operator==( EncodeH264SliceHeader const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( first_mb_in_slice == rhs.first_mb_in_slice ) && ( slice_type == rhs.slice_type ) &&\n               ( slice_alpha_c0_offset_div2 == rhs.slice_alpha_c0_offset_div2 ) && ( slice_beta_offset_div2 == rhs.slice_beta_offset_div2 ) &&\n               ( slice_qp_delta == rhs.slice_qp_delta ) && ( reserved1 == rhs.reserved1 ) && ( cabac_init_idc == rhs.cabac_init_idc ) &&\n               ( disable_deblocking_filter_idc == rhs.disable_deblocking_filter_idc ) && ( pWeightTable == rhs.pWeightTable );\n      }\n\n      bool operator!=( EncodeH264SliceHeader const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH264SliceHeaderFlags flags             = {};\n      uint32_t                                                                     first_mb_in_slice = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264SliceType    slice_type = VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264SliceType::eP;\n      int8_t                                                             slice_alpha_c0_offset_div2 = {};\n      int8_t                                                             slice_beta_offset_div2     = {};\n      int8_t                                                             slice_qp_delta             = {};\n      uint8_t                                                            reserved1                  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264CabacInitIdc cabac_init_idc =\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264CabacInitIdc::e0;\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264DisableDeblockingFilterIdc disable_deblocking_filter_idc =\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264DisableDeblockingFilterIdc::eDisabled;\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH264WeightTable * pWeightTable = {};\n    };\n\n    //=== vulkan_video_codec_h265std ===\n\n    struct H265DecPicBufMgr\n    {\n      using NativeType = StdVideoH265DecPicBufMgr;\n\n      operator StdVideoH265DecPicBufMgr const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH265DecPicBufMgr *>( this );\n      }\n\n      operator StdVideoH265DecPicBufMgr &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH265DecPicBufMgr *>( this );\n      }\n\n      bool operator==( H265DecPicBufMgr const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( max_latency_increase_plus1 == rhs.max_latency_increase_plus1 ) && ( max_dec_pic_buffering_minus1 == rhs.max_dec_pic_buffering_minus1 ) &&\n               ( max_num_reorder_pics == rhs.max_num_reorder_pics );\n      }\n\n      bool operator!=( H265DecPicBufMgr const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, STD_VIDEO_H265_SUBLAYERS_LIST_SIZE> max_latency_increase_plus1   = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_SUBLAYERS_LIST_SIZE>  max_dec_pic_buffering_minus1 = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_SUBLAYERS_LIST_SIZE>  max_num_reorder_pics         = {};\n    };\n\n    struct H265SubLayerHrdParameters\n    {\n      using NativeType = StdVideoH265SubLayerHrdParameters;\n\n      operator StdVideoH265SubLayerHrdParameters const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH265SubLayerHrdParameters *>( this );\n      }\n\n      operator StdVideoH265SubLayerHrdParameters &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH265SubLayerHrdParameters *>( this );\n      }\n\n      bool operator==( H265SubLayerHrdParameters const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( bit_rate_value_minus1 == rhs.bit_rate_value_minus1 ) && ( cpb_size_value_minus1 == rhs.cpb_size_value_minus1 ) &&\n               ( cpb_size_du_value_minus1 == rhs.cpb_size_du_value_minus1 ) && ( bit_rate_du_value_minus1 == rhs.bit_rate_du_value_minus1 ) &&\n               ( cbr_flag == rhs.cbr_flag );\n      }\n\n      bool operator!=( H265SubLayerHrdParameters const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, STD_VIDEO_H265_CPB_CNT_LIST_SIZE> bit_rate_value_minus1    = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, STD_VIDEO_H265_CPB_CNT_LIST_SIZE> cpb_size_value_minus1    = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, STD_VIDEO_H265_CPB_CNT_LIST_SIZE> cpb_size_du_value_minus1 = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, STD_VIDEO_H265_CPB_CNT_LIST_SIZE> bit_rate_du_value_minus1 = {};\n      uint32_t                                                                         cbr_flag                 = {};\n    };\n\n    struct H265HrdFlags\n    {\n      using NativeType = StdVideoH265HrdFlags;\n\n      operator StdVideoH265HrdFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH265HrdFlags *>( this );\n      }\n\n      operator StdVideoH265HrdFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH265HrdFlags *>( this );\n      }\n\n      bool operator==( H265HrdFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( nal_hrd_parameters_present_flag == rhs.nal_hrd_parameters_present_flag ) &&\n               ( vcl_hrd_parameters_present_flag == rhs.vcl_hrd_parameters_present_flag ) &&\n               ( sub_pic_hrd_params_present_flag == rhs.sub_pic_hrd_params_present_flag ) &&\n               ( sub_pic_cpb_params_in_pic_timing_sei_flag == rhs.sub_pic_cpb_params_in_pic_timing_sei_flag ) &&\n               ( fixed_pic_rate_general_flag == rhs.fixed_pic_rate_general_flag ) && ( fixed_pic_rate_within_cvs_flag == rhs.fixed_pic_rate_within_cvs_flag ) &&\n               ( low_delay_hrd_flag == rhs.low_delay_hrd_flag );\n      }\n\n      bool operator!=( H265HrdFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t nal_hrd_parameters_present_flag           : 1;\n      uint32_t vcl_hrd_parameters_present_flag           : 1;\n      uint32_t sub_pic_hrd_params_present_flag           : 1;\n      uint32_t sub_pic_cpb_params_in_pic_timing_sei_flag : 1;\n      uint32_t fixed_pic_rate_general_flag               : 8;\n      uint32_t fixed_pic_rate_within_cvs_flag            : 8;\n      uint32_t low_delay_hrd_flag                        : 8;\n    };\n\n    struct H265HrdParameters\n    {\n      using NativeType = StdVideoH265HrdParameters;\n\n      operator StdVideoH265HrdParameters const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH265HrdParameters *>( this );\n      }\n\n      operator StdVideoH265HrdParameters &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH265HrdParameters *>( this );\n      }\n\n      bool operator==( H265HrdParameters const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( tick_divisor_minus2 == rhs.tick_divisor_minus2 ) &&\n               ( du_cpb_removal_delay_increment_length_minus1 == rhs.du_cpb_removal_delay_increment_length_minus1 ) &&\n               ( dpb_output_delay_du_length_minus1 == rhs.dpb_output_delay_du_length_minus1 ) && ( bit_rate_scale == rhs.bit_rate_scale ) &&\n               ( cpb_size_scale == rhs.cpb_size_scale ) && ( cpb_size_du_scale == rhs.cpb_size_du_scale ) &&\n               ( initial_cpb_removal_delay_length_minus1 == rhs.initial_cpb_removal_delay_length_minus1 ) &&\n               ( au_cpb_removal_delay_length_minus1 == rhs.au_cpb_removal_delay_length_minus1 ) &&\n               ( dpb_output_delay_length_minus1 == rhs.dpb_output_delay_length_minus1 ) && ( cpb_cnt_minus1 == rhs.cpb_cnt_minus1 ) &&\n               ( elemental_duration_in_tc_minus1 == rhs.elemental_duration_in_tc_minus1 ) && ( reserved == rhs.reserved ) &&\n               ( pSubLayerHrdParametersNal == rhs.pSubLayerHrdParametersNal ) && ( pSubLayerHrdParametersVcl == rhs.pSubLayerHrdParametersVcl );\n      }\n\n      bool operator!=( H265HrdParameters const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265HrdFlags                      flags                                        = {};\n      uint8_t                                                                             tick_divisor_minus2                          = {};\n      uint8_t                                                                             du_cpb_removal_delay_increment_length_minus1 = {};\n      uint8_t                                                                             dpb_output_delay_du_length_minus1            = {};\n      uint8_t                                                                             bit_rate_scale                               = {};\n      uint8_t                                                                             cpb_size_scale                               = {};\n      uint8_t                                                                             cpb_size_du_scale                            = {};\n      uint8_t                                                                             initial_cpb_removal_delay_length_minus1      = {};\n      uint8_t                                                                             au_cpb_removal_delay_length_minus1           = {};\n      uint8_t                                                                             dpb_output_delay_length_minus1               = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_SUBLAYERS_LIST_SIZE>   cpb_cnt_minus1                               = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint16_t, STD_VIDEO_H265_SUBLAYERS_LIST_SIZE>  elemental_duration_in_tc_minus1              = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint16_t, 3>                                   reserved                                     = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265SubLayerHrdParameters * pSubLayerHrdParametersNal                    = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265SubLayerHrdParameters * pSubLayerHrdParametersVcl                    = {};\n    };\n\n    struct H265VpsFlags\n    {\n      using NativeType = StdVideoH265VpsFlags;\n\n      operator StdVideoH265VpsFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH265VpsFlags *>( this );\n      }\n\n      operator StdVideoH265VpsFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH265VpsFlags *>( this );\n      }\n\n      bool operator==( H265VpsFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( vps_temporal_id_nesting_flag == rhs.vps_temporal_id_nesting_flag ) &&\n               ( vps_sub_layer_ordering_info_present_flag == rhs.vps_sub_layer_ordering_info_present_flag ) &&\n               ( vps_timing_info_present_flag == rhs.vps_timing_info_present_flag ) &&\n               ( vps_poc_proportional_to_timing_flag == rhs.vps_poc_proportional_to_timing_flag );\n      }\n\n      bool operator!=( H265VpsFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t vps_temporal_id_nesting_flag             : 1;\n      uint32_t vps_sub_layer_ordering_info_present_flag : 1;\n      uint32_t vps_timing_info_present_flag             : 1;\n      uint32_t vps_poc_proportional_to_timing_flag      : 1;\n    };\n\n    struct H265ProfileTierLevelFlags\n    {\n      using NativeType = StdVideoH265ProfileTierLevelFlags;\n\n      operator StdVideoH265ProfileTierLevelFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH265ProfileTierLevelFlags *>( this );\n      }\n\n      operator StdVideoH265ProfileTierLevelFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH265ProfileTierLevelFlags *>( this );\n      }\n\n      bool operator==( H265ProfileTierLevelFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( general_tier_flag == rhs.general_tier_flag ) && ( general_progressive_source_flag == rhs.general_progressive_source_flag ) &&\n               ( general_interlaced_source_flag == rhs.general_interlaced_source_flag ) &&\n               ( general_non_packed_constraint_flag == rhs.general_non_packed_constraint_flag ) &&\n               ( general_frame_only_constraint_flag == rhs.general_frame_only_constraint_flag );\n      }\n\n      bool operator!=( H265ProfileTierLevelFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t general_tier_flag                  : 1;\n      uint32_t general_progressive_source_flag    : 1;\n      uint32_t general_interlaced_source_flag     : 1;\n      uint32_t general_non_packed_constraint_flag : 1;\n      uint32_t general_frame_only_constraint_flag : 1;\n    };\n\n    struct H265ProfileTierLevel\n    {\n      using NativeType = StdVideoH265ProfileTierLevel;\n\n      operator StdVideoH265ProfileTierLevel const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH265ProfileTierLevel *>( this );\n      }\n\n      operator StdVideoH265ProfileTierLevel &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH265ProfileTierLevel *>( this );\n      }\n\n      bool operator==( H265ProfileTierLevel const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( general_profile_idc == rhs.general_profile_idc ) && ( general_level_idc == rhs.general_level_idc );\n      }\n\n      bool operator!=( H265ProfileTierLevel const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ProfileTierLevelFlags flags = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ProfileIdc            general_profile_idc =\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ProfileIdc::eMain;\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265LevelIdc general_level_idc = VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265LevelIdc::e1_0;\n    };\n\n    struct H265VideoParameterSet\n    {\n      using NativeType = StdVideoH265VideoParameterSet;\n\n      operator StdVideoH265VideoParameterSet const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH265VideoParameterSet *>( this );\n      }\n\n      operator StdVideoH265VideoParameterSet &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH265VideoParameterSet *>( this );\n      }\n\n      bool operator==( H265VideoParameterSet const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( vps_video_parameter_set_id == rhs.vps_video_parameter_set_id ) &&\n               ( vps_max_sub_layers_minus1 == rhs.vps_max_sub_layers_minus1 ) && ( reserved1 == rhs.reserved1 ) && ( reserved2 == rhs.reserved2 ) &&\n               ( vps_num_units_in_tick == rhs.vps_num_units_in_tick ) && ( vps_time_scale == rhs.vps_time_scale ) &&\n               ( vps_num_ticks_poc_diff_one_minus1 == rhs.vps_num_ticks_poc_diff_one_minus1 ) && ( reserved3 == rhs.reserved3 ) &&\n               ( pDecPicBufMgr == rhs.pDecPicBufMgr ) && ( pHrdParameters == rhs.pHrdParameters ) && ( pProfileTierLevel == rhs.pProfileTierLevel );\n      }\n\n      bool operator!=( H265VideoParameterSet const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265VpsFlags                 flags                             = {};\n      uint8_t                                                                        vps_video_parameter_set_id        = {};\n      uint8_t                                                                        vps_max_sub_layers_minus1         = {};\n      uint8_t                                                                        reserved1                         = {};\n      uint8_t                                                                        reserved2                         = {};\n      uint32_t                                                                       vps_num_units_in_tick             = {};\n      uint32_t                                                                       vps_time_scale                    = {};\n      uint32_t                                                                       vps_num_ticks_poc_diff_one_minus1 = {};\n      uint32_t                                                                       reserved3                         = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265DecPicBufMgr *     pDecPicBufMgr                     = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265HrdParameters *    pHrdParameters                    = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ProfileTierLevel * pProfileTierLevel                 = {};\n    };\n\n    struct H265ScalingLists\n    {\n      using NativeType = StdVideoH265ScalingLists;\n\n      operator StdVideoH265ScalingLists const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH265ScalingLists *>( this );\n      }\n\n      operator StdVideoH265ScalingLists &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH265ScalingLists *>( this );\n      }\n\n      bool operator==( H265ScalingLists const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( ScalingList4x4 == rhs.ScalingList4x4 ) && ( ScalingList8x8 == rhs.ScalingList8x8 ) && ( ScalingList16x16 == rhs.ScalingList16x16 ) &&\n               ( ScalingList32x32 == rhs.ScalingList32x32 ) && ( ScalingListDCCoef16x16 == rhs.ScalingListDCCoef16x16 ) &&\n               ( ScalingListDCCoef32x32 == rhs.ScalingListDCCoef32x32 );\n      }\n\n      bool operator!=( H265ScalingLists const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<uint8_t, STD_VIDEO_H265_SCALING_LIST_4X4_NUM_LISTS, STD_VIDEO_H265_SCALING_LIST_4X4_NUM_ELEMENTS>\n        ScalingList4x4 = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<uint8_t, STD_VIDEO_H265_SCALING_LIST_8X8_NUM_LISTS, STD_VIDEO_H265_SCALING_LIST_8X8_NUM_ELEMENTS>\n        ScalingList8x8 = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<uint8_t, STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS, STD_VIDEO_H265_SCALING_LIST_16X16_NUM_ELEMENTS>\n        ScalingList16x16 = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<uint8_t, STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS, STD_VIDEO_H265_SCALING_LIST_32X32_NUM_ELEMENTS>\n                                                                                                 ScalingList32x32       = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS> ScalingListDCCoef16x16 = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS> ScalingListDCCoef32x32 = {};\n    };\n\n    struct H265SpsVuiFlags\n    {\n      using NativeType = StdVideoH265SpsVuiFlags;\n\n      operator StdVideoH265SpsVuiFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH265SpsVuiFlags *>( this );\n      }\n\n      operator StdVideoH265SpsVuiFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH265SpsVuiFlags *>( this );\n      }\n\n      bool operator==( H265SpsVuiFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( aspect_ratio_info_present_flag == rhs.aspect_ratio_info_present_flag ) && ( overscan_info_present_flag == rhs.overscan_info_present_flag ) &&\n               ( overscan_appropriate_flag == rhs.overscan_appropriate_flag ) && ( video_signal_type_present_flag == rhs.video_signal_type_present_flag ) &&\n               ( video_full_range_flag == rhs.video_full_range_flag ) && ( colour_description_present_flag == rhs.colour_description_present_flag ) &&\n               ( chroma_loc_info_present_flag == rhs.chroma_loc_info_present_flag ) &&\n               ( neutral_chroma_indication_flag == rhs.neutral_chroma_indication_flag ) && ( field_seq_flag == rhs.field_seq_flag ) &&\n               ( frame_field_info_present_flag == rhs.frame_field_info_present_flag ) && ( default_display_window_flag == rhs.default_display_window_flag ) &&\n               ( vui_timing_info_present_flag == rhs.vui_timing_info_present_flag ) &&\n               ( vui_poc_proportional_to_timing_flag == rhs.vui_poc_proportional_to_timing_flag ) &&\n               ( vui_hrd_parameters_present_flag == rhs.vui_hrd_parameters_present_flag ) && ( bitstream_restriction_flag == rhs.bitstream_restriction_flag ) &&\n               ( tiles_fixed_structure_flag == rhs.tiles_fixed_structure_flag ) &&\n               ( motion_vectors_over_pic_boundaries_flag == rhs.motion_vectors_over_pic_boundaries_flag ) &&\n               ( restricted_ref_pic_lists_flag == rhs.restricted_ref_pic_lists_flag );\n      }\n\n      bool operator!=( H265SpsVuiFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t aspect_ratio_info_present_flag          : 1;\n      uint32_t overscan_info_present_flag              : 1;\n      uint32_t overscan_appropriate_flag               : 1;\n      uint32_t video_signal_type_present_flag          : 1;\n      uint32_t video_full_range_flag                   : 1;\n      uint32_t colour_description_present_flag         : 1;\n      uint32_t chroma_loc_info_present_flag            : 1;\n      uint32_t neutral_chroma_indication_flag          : 1;\n      uint32_t field_seq_flag                          : 1;\n      uint32_t frame_field_info_present_flag           : 1;\n      uint32_t default_display_window_flag             : 1;\n      uint32_t vui_timing_info_present_flag            : 1;\n      uint32_t vui_poc_proportional_to_timing_flag     : 1;\n      uint32_t vui_hrd_parameters_present_flag         : 1;\n      uint32_t bitstream_restriction_flag              : 1;\n      uint32_t tiles_fixed_structure_flag              : 1;\n      uint32_t motion_vectors_over_pic_boundaries_flag : 1;\n      uint32_t restricted_ref_pic_lists_flag           : 1;\n    };\n\n    struct H265SequenceParameterSetVui\n    {\n      using NativeType = StdVideoH265SequenceParameterSetVui;\n\n      operator StdVideoH265SequenceParameterSetVui const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH265SequenceParameterSetVui *>( this );\n      }\n\n      operator StdVideoH265SequenceParameterSetVui &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH265SequenceParameterSetVui *>( this );\n      }\n\n      bool operator==( H265SequenceParameterSetVui const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( aspect_ratio_idc == rhs.aspect_ratio_idc ) && ( sar_width == rhs.sar_width ) && ( sar_height == rhs.sar_height ) &&\n               ( video_format == rhs.video_format ) && ( colour_primaries == rhs.colour_primaries ) &&\n               ( transfer_characteristics == rhs.transfer_characteristics ) && ( matrix_coeffs == rhs.matrix_coeffs ) &&\n               ( chroma_sample_loc_type_top_field == rhs.chroma_sample_loc_type_top_field ) &&\n               ( chroma_sample_loc_type_bottom_field == rhs.chroma_sample_loc_type_bottom_field ) && ( reserved1 == rhs.reserved1 ) &&\n               ( reserved2 == rhs.reserved2 ) && ( def_disp_win_left_offset == rhs.def_disp_win_left_offset ) &&\n               ( def_disp_win_right_offset == rhs.def_disp_win_right_offset ) && ( def_disp_win_top_offset == rhs.def_disp_win_top_offset ) &&\n               ( def_disp_win_bottom_offset == rhs.def_disp_win_bottom_offset ) && ( vui_num_units_in_tick == rhs.vui_num_units_in_tick ) &&\n               ( vui_time_scale == rhs.vui_time_scale ) && ( vui_num_ticks_poc_diff_one_minus1 == rhs.vui_num_ticks_poc_diff_one_minus1 ) &&\n               ( min_spatial_segmentation_idc == rhs.min_spatial_segmentation_idc ) && ( reserved3 == rhs.reserved3 ) &&\n               ( max_bytes_per_pic_denom == rhs.max_bytes_per_pic_denom ) && ( max_bits_per_min_cu_denom == rhs.max_bits_per_min_cu_denom ) &&\n               ( log2_max_mv_length_horizontal == rhs.log2_max_mv_length_horizontal ) && ( log2_max_mv_length_vertical == rhs.log2_max_mv_length_vertical ) &&\n               ( pHrdParameters == rhs.pHrdParameters );\n      }\n\n      bool operator!=( H265SequenceParameterSetVui const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265SpsVuiFlags    flags = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265AspectRatioIdc aspect_ratio_idc =\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265AspectRatioIdc::eUnspecified;\n      uint16_t                                                                    sar_width                           = {};\n      uint16_t                                                                    sar_height                          = {};\n      uint8_t                                                                     video_format                        = {};\n      uint8_t                                                                     colour_primaries                    = {};\n      uint8_t                                                                     transfer_characteristics            = {};\n      uint8_t                                                                     matrix_coeffs                       = {};\n      uint8_t                                                                     chroma_sample_loc_type_top_field    = {};\n      uint8_t                                                                     chroma_sample_loc_type_bottom_field = {};\n      uint8_t                                                                     reserved1                           = {};\n      uint8_t                                                                     reserved2                           = {};\n      uint16_t                                                                    def_disp_win_left_offset            = {};\n      uint16_t                                                                    def_disp_win_right_offset           = {};\n      uint16_t                                                                    def_disp_win_top_offset             = {};\n      uint16_t                                                                    def_disp_win_bottom_offset          = {};\n      uint32_t                                                                    vui_num_units_in_tick               = {};\n      uint32_t                                                                    vui_time_scale                      = {};\n      uint32_t                                                                    vui_num_ticks_poc_diff_one_minus1   = {};\n      uint16_t                                                                    min_spatial_segmentation_idc        = {};\n      uint16_t                                                                    reserved3                           = {};\n      uint8_t                                                                     max_bytes_per_pic_denom             = {};\n      uint8_t                                                                     max_bits_per_min_cu_denom           = {};\n      uint8_t                                                                     log2_max_mv_length_horizontal       = {};\n      uint8_t                                                                     log2_max_mv_length_vertical         = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265HrdParameters * pHrdParameters                      = {};\n    };\n\n    struct H265PredictorPaletteEntries\n    {\n      using NativeType = StdVideoH265PredictorPaletteEntries;\n\n      operator StdVideoH265PredictorPaletteEntries const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH265PredictorPaletteEntries *>( this );\n      }\n\n      operator StdVideoH265PredictorPaletteEntries &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH265PredictorPaletteEntries *>( this );\n      }\n\n      bool operator==( H265PredictorPaletteEntries const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( PredictorPaletteEntries == rhs.PredictorPaletteEntries );\n      }\n\n      bool operator!=( H265PredictorPaletteEntries const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::\n        ArrayWrapper2D<uint16_t, STD_VIDEO_H265_PREDICTOR_PALETTE_COMPONENTS_LIST_SIZE, STD_VIDEO_H265_PREDICTOR_PALETTE_COMP_ENTRIES_LIST_SIZE>\n          PredictorPaletteEntries = {};\n    };\n\n    struct H265SpsFlags\n    {\n      using NativeType = StdVideoH265SpsFlags;\n\n      operator StdVideoH265SpsFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH265SpsFlags *>( this );\n      }\n\n      operator StdVideoH265SpsFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH265SpsFlags *>( this );\n      }\n\n      bool operator==( H265SpsFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( sps_temporal_id_nesting_flag == rhs.sps_temporal_id_nesting_flag ) && ( separate_colour_plane_flag == rhs.separate_colour_plane_flag ) &&\n               ( conformance_window_flag == rhs.conformance_window_flag ) &&\n               ( sps_sub_layer_ordering_info_present_flag == rhs.sps_sub_layer_ordering_info_present_flag ) &&\n               ( scaling_list_enabled_flag == rhs.scaling_list_enabled_flag ) &&\n               ( sps_scaling_list_data_present_flag == rhs.sps_scaling_list_data_present_flag ) && ( amp_enabled_flag == rhs.amp_enabled_flag ) &&\n               ( sample_adaptive_offset_enabled_flag == rhs.sample_adaptive_offset_enabled_flag ) && ( pcm_enabled_flag == rhs.pcm_enabled_flag ) &&\n               ( pcm_loop_filter_disabled_flag == rhs.pcm_loop_filter_disabled_flag ) &&\n               ( long_term_ref_pics_present_flag == rhs.long_term_ref_pics_present_flag ) &&\n               ( sps_temporal_mvp_enabled_flag == rhs.sps_temporal_mvp_enabled_flag ) &&\n               ( strong_intra_smoothing_enabled_flag == rhs.strong_intra_smoothing_enabled_flag ) &&\n               ( vui_parameters_present_flag == rhs.vui_parameters_present_flag ) && ( sps_extension_present_flag == rhs.sps_extension_present_flag ) &&\n               ( sps_range_extension_flag == rhs.sps_range_extension_flag ) &&\n               ( transform_skip_rotation_enabled_flag == rhs.transform_skip_rotation_enabled_flag ) &&\n               ( transform_skip_context_enabled_flag == rhs.transform_skip_context_enabled_flag ) &&\n               ( implicit_rdpcm_enabled_flag == rhs.implicit_rdpcm_enabled_flag ) && ( explicit_rdpcm_enabled_flag == rhs.explicit_rdpcm_enabled_flag ) &&\n               ( extended_precision_processing_flag == rhs.extended_precision_processing_flag ) &&\n               ( intra_smoothing_disabled_flag == rhs.intra_smoothing_disabled_flag ) &&\n               ( high_precision_offsets_enabled_flag == rhs.high_precision_offsets_enabled_flag ) &&\n               ( persistent_rice_adaptation_enabled_flag == rhs.persistent_rice_adaptation_enabled_flag ) &&\n               ( cabac_bypass_alignment_enabled_flag == rhs.cabac_bypass_alignment_enabled_flag ) && ( sps_scc_extension_flag == rhs.sps_scc_extension_flag ) &&\n               ( sps_curr_pic_ref_enabled_flag == rhs.sps_curr_pic_ref_enabled_flag ) && ( palette_mode_enabled_flag == rhs.palette_mode_enabled_flag ) &&\n               ( sps_palette_predictor_initializers_present_flag == rhs.sps_palette_predictor_initializers_present_flag ) &&\n               ( intra_boundary_filtering_disabled_flag == rhs.intra_boundary_filtering_disabled_flag );\n      }\n\n      bool operator!=( H265SpsFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t sps_temporal_id_nesting_flag                    : 1;\n      uint32_t separate_colour_plane_flag                      : 1;\n      uint32_t conformance_window_flag                         : 1;\n      uint32_t sps_sub_layer_ordering_info_present_flag        : 1;\n      uint32_t scaling_list_enabled_flag                       : 1;\n      uint32_t sps_scaling_list_data_present_flag              : 1;\n      uint32_t amp_enabled_flag                                : 1;\n      uint32_t sample_adaptive_offset_enabled_flag             : 1;\n      uint32_t pcm_enabled_flag                                : 1;\n      uint32_t pcm_loop_filter_disabled_flag                   : 1;\n      uint32_t long_term_ref_pics_present_flag                 : 1;\n      uint32_t sps_temporal_mvp_enabled_flag                   : 1;\n      uint32_t strong_intra_smoothing_enabled_flag             : 1;\n      uint32_t vui_parameters_present_flag                     : 1;\n      uint32_t sps_extension_present_flag                      : 1;\n      uint32_t sps_range_extension_flag                        : 1;\n      uint32_t transform_skip_rotation_enabled_flag            : 1;\n      uint32_t transform_skip_context_enabled_flag             : 1;\n      uint32_t implicit_rdpcm_enabled_flag                     : 1;\n      uint32_t explicit_rdpcm_enabled_flag                     : 1;\n      uint32_t extended_precision_processing_flag              : 1;\n      uint32_t intra_smoothing_disabled_flag                   : 1;\n      uint32_t high_precision_offsets_enabled_flag             : 1;\n      uint32_t persistent_rice_adaptation_enabled_flag         : 1;\n      uint32_t cabac_bypass_alignment_enabled_flag             : 1;\n      uint32_t sps_scc_extension_flag                          : 1;\n      uint32_t sps_curr_pic_ref_enabled_flag                   : 1;\n      uint32_t palette_mode_enabled_flag                       : 1;\n      uint32_t sps_palette_predictor_initializers_present_flag : 1;\n      uint32_t intra_boundary_filtering_disabled_flag          : 1;\n    };\n\n    struct H265ShortTermRefPicSetFlags\n    {\n      using NativeType = StdVideoH265ShortTermRefPicSetFlags;\n\n      operator StdVideoH265ShortTermRefPicSetFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH265ShortTermRefPicSetFlags *>( this );\n      }\n\n      operator StdVideoH265ShortTermRefPicSetFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH265ShortTermRefPicSetFlags *>( this );\n      }\n\n      bool operator==( H265ShortTermRefPicSetFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( inter_ref_pic_set_prediction_flag == rhs.inter_ref_pic_set_prediction_flag ) && ( delta_rps_sign == rhs.delta_rps_sign );\n      }\n\n      bool operator!=( H265ShortTermRefPicSetFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t inter_ref_pic_set_prediction_flag : 1;\n      uint32_t delta_rps_sign                    : 1;\n    };\n\n    struct H265ShortTermRefPicSet\n    {\n      using NativeType = StdVideoH265ShortTermRefPicSet;\n\n      operator StdVideoH265ShortTermRefPicSet const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH265ShortTermRefPicSet *>( this );\n      }\n\n      operator StdVideoH265ShortTermRefPicSet &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH265ShortTermRefPicSet *>( this );\n      }\n\n      bool operator==( H265ShortTermRefPicSet const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( delta_idx_minus1 == rhs.delta_idx_minus1 ) && ( use_delta_flag == rhs.use_delta_flag ) &&\n               ( abs_delta_rps_minus1 == rhs.abs_delta_rps_minus1 ) && ( used_by_curr_pic_flag == rhs.used_by_curr_pic_flag ) &&\n               ( used_by_curr_pic_s0_flag == rhs.used_by_curr_pic_s0_flag ) && ( used_by_curr_pic_s1_flag == rhs.used_by_curr_pic_s1_flag ) &&\n               ( reserved1 == rhs.reserved1 ) && ( reserved2 == rhs.reserved2 ) && ( reserved3 == rhs.reserved3 ) &&\n               ( num_negative_pics == rhs.num_negative_pics ) && ( num_positive_pics == rhs.num_positive_pics ) &&\n               ( delta_poc_s0_minus1 == rhs.delta_poc_s0_minus1 ) && ( delta_poc_s1_minus1 == rhs.delta_poc_s1_minus1 );\n      }\n\n      bool operator!=( H265ShortTermRefPicSet const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ShortTermRefPicSetFlags flags                    = {};\n      uint32_t                                                                      delta_idx_minus1         = {};\n      uint16_t                                                                      use_delta_flag           = {};\n      uint16_t                                                                      abs_delta_rps_minus1     = {};\n      uint16_t                                                                      used_by_curr_pic_flag    = {};\n      uint16_t                                                                      used_by_curr_pic_s0_flag = {};\n      uint16_t                                                                      used_by_curr_pic_s1_flag = {};\n      uint16_t                                                                      reserved1                = {};\n      uint8_t                                                                       reserved2                = {};\n      uint8_t                                                                       reserved3                = {};\n      uint8_t                                                                       num_negative_pics        = {};\n      uint8_t                                                                       num_positive_pics        = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint16_t, STD_VIDEO_H265_MAX_DPB_SIZE>   delta_poc_s0_minus1      = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint16_t, STD_VIDEO_H265_MAX_DPB_SIZE>   delta_poc_s1_minus1      = {};\n    };\n\n    struct H265LongTermRefPicsSps\n    {\n      using NativeType = StdVideoH265LongTermRefPicsSps;\n\n      operator StdVideoH265LongTermRefPicsSps const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH265LongTermRefPicsSps *>( this );\n      }\n\n      operator StdVideoH265LongTermRefPicsSps &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH265LongTermRefPicsSps *>( this );\n      }\n\n      bool operator==( H265LongTermRefPicsSps const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( used_by_curr_pic_lt_sps_flag == rhs.used_by_curr_pic_lt_sps_flag ) && ( lt_ref_pic_poc_lsb_sps == rhs.lt_ref_pic_poc_lsb_sps );\n      }\n\n      bool operator!=( H265LongTermRefPicsSps const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t                                                                                  used_by_curr_pic_lt_sps_flag = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, STD_VIDEO_H265_MAX_LONG_TERM_REF_PICS_SPS> lt_ref_pic_poc_lsb_sps       = {};\n    };\n\n    struct H265SequenceParameterSet\n    {\n      using NativeType = StdVideoH265SequenceParameterSet;\n\n      operator StdVideoH265SequenceParameterSet const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH265SequenceParameterSet *>( this );\n      }\n\n      operator StdVideoH265SequenceParameterSet &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH265SequenceParameterSet *>( this );\n      }\n\n      bool operator==( H265SequenceParameterSet const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( chroma_format_idc == rhs.chroma_format_idc ) && ( pic_width_in_luma_samples == rhs.pic_width_in_luma_samples ) &&\n               ( pic_height_in_luma_samples == rhs.pic_height_in_luma_samples ) && ( sps_video_parameter_set_id == rhs.sps_video_parameter_set_id ) &&\n               ( sps_max_sub_layers_minus1 == rhs.sps_max_sub_layers_minus1 ) && ( sps_seq_parameter_set_id == rhs.sps_seq_parameter_set_id ) &&\n               ( bit_depth_luma_minus8 == rhs.bit_depth_luma_minus8 ) && ( bit_depth_chroma_minus8 == rhs.bit_depth_chroma_minus8 ) &&\n               ( log2_max_pic_order_cnt_lsb_minus4 == rhs.log2_max_pic_order_cnt_lsb_minus4 ) &&\n               ( log2_min_luma_coding_block_size_minus3 == rhs.log2_min_luma_coding_block_size_minus3 ) &&\n               ( log2_diff_max_min_luma_coding_block_size == rhs.log2_diff_max_min_luma_coding_block_size ) &&\n               ( log2_min_luma_transform_block_size_minus2 == rhs.log2_min_luma_transform_block_size_minus2 ) &&\n               ( log2_diff_max_min_luma_transform_block_size == rhs.log2_diff_max_min_luma_transform_block_size ) &&\n               ( max_transform_hierarchy_depth_inter == rhs.max_transform_hierarchy_depth_inter ) &&\n               ( max_transform_hierarchy_depth_intra == rhs.max_transform_hierarchy_depth_intra ) &&\n               ( num_short_term_ref_pic_sets == rhs.num_short_term_ref_pic_sets ) && ( num_long_term_ref_pics_sps == rhs.num_long_term_ref_pics_sps ) &&\n               ( pcm_sample_bit_depth_luma_minus1 == rhs.pcm_sample_bit_depth_luma_minus1 ) &&\n               ( pcm_sample_bit_depth_chroma_minus1 == rhs.pcm_sample_bit_depth_chroma_minus1 ) &&\n               ( log2_min_pcm_luma_coding_block_size_minus3 == rhs.log2_min_pcm_luma_coding_block_size_minus3 ) &&\n               ( log2_diff_max_min_pcm_luma_coding_block_size == rhs.log2_diff_max_min_pcm_luma_coding_block_size ) && ( reserved1 == rhs.reserved1 ) &&\n               ( reserved2 == rhs.reserved2 ) && ( palette_max_size == rhs.palette_max_size ) &&\n               ( delta_palette_max_predictor_size == rhs.delta_palette_max_predictor_size ) &&\n               ( motion_vector_resolution_control_idc == rhs.motion_vector_resolution_control_idc ) &&\n               ( sps_num_palette_predictor_initializers_minus1 == rhs.sps_num_palette_predictor_initializers_minus1 ) &&\n               ( conf_win_left_offset == rhs.conf_win_left_offset ) && ( conf_win_right_offset == rhs.conf_win_right_offset ) &&\n               ( conf_win_top_offset == rhs.conf_win_top_offset ) && ( conf_win_bottom_offset == rhs.conf_win_bottom_offset ) &&\n               ( pProfileTierLevel == rhs.pProfileTierLevel ) && ( pDecPicBufMgr == rhs.pDecPicBufMgr ) && ( pScalingLists == rhs.pScalingLists ) &&\n               ( pShortTermRefPicSet == rhs.pShortTermRefPicSet ) && ( pLongTermRefPicsSps == rhs.pLongTermRefPicsSps ) &&\n               ( pSequenceParameterSetVui == rhs.pSequenceParameterSetVui ) && ( pPredictorPaletteEntries == rhs.pPredictorPaletteEntries );\n      }\n\n      bool operator!=( H265SequenceParameterSet const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265SpsFlags        flags = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ChromaFormatIdc chroma_format_idc =\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ChromaFormatIdc::eMonochrome;\n      uint32_t                                                                              pic_width_in_luma_samples                     = {};\n      uint32_t                                                                              pic_height_in_luma_samples                    = {};\n      uint8_t                                                                               sps_video_parameter_set_id                    = {};\n      uint8_t                                                                               sps_max_sub_layers_minus1                     = {};\n      uint8_t                                                                               sps_seq_parameter_set_id                      = {};\n      uint8_t                                                                               bit_depth_luma_minus8                         = {};\n      uint8_t                                                                               bit_depth_chroma_minus8                       = {};\n      uint8_t                                                                               log2_max_pic_order_cnt_lsb_minus4             = {};\n      uint8_t                                                                               log2_min_luma_coding_block_size_minus3        = {};\n      uint8_t                                                                               log2_diff_max_min_luma_coding_block_size      = {};\n      uint8_t                                                                               log2_min_luma_transform_block_size_minus2     = {};\n      uint8_t                                                                               log2_diff_max_min_luma_transform_block_size   = {};\n      uint8_t                                                                               max_transform_hierarchy_depth_inter           = {};\n      uint8_t                                                                               max_transform_hierarchy_depth_intra           = {};\n      uint8_t                                                                               num_short_term_ref_pic_sets                   = {};\n      uint8_t                                                                               num_long_term_ref_pics_sps                    = {};\n      uint8_t                                                                               pcm_sample_bit_depth_luma_minus1              = {};\n      uint8_t                                                                               pcm_sample_bit_depth_chroma_minus1            = {};\n      uint8_t                                                                               log2_min_pcm_luma_coding_block_size_minus3    = {};\n      uint8_t                                                                               log2_diff_max_min_pcm_luma_coding_block_size  = {};\n      uint8_t                                                                               reserved1                                     = {};\n      uint8_t                                                                               reserved2                                     = {};\n      uint8_t                                                                               palette_max_size                              = {};\n      uint8_t                                                                               delta_palette_max_predictor_size              = {};\n      uint8_t                                                                               motion_vector_resolution_control_idc          = {};\n      uint8_t                                                                               sps_num_palette_predictor_initializers_minus1 = {};\n      uint32_t                                                                              conf_win_left_offset                          = {};\n      uint32_t                                                                              conf_win_right_offset                         = {};\n      uint32_t                                                                              conf_win_top_offset                           = {};\n      uint32_t                                                                              conf_win_bottom_offset                        = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ProfileTierLevel *        pProfileTierLevel                             = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265DecPicBufMgr *            pDecPicBufMgr                                 = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ScalingLists *            pScalingLists                                 = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ShortTermRefPicSet *      pShortTermRefPicSet                           = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265LongTermRefPicsSps *      pLongTermRefPicsSps                           = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265SequenceParameterSetVui * pSequenceParameterSetVui                      = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265PredictorPaletteEntries * pPredictorPaletteEntries                      = {};\n    };\n\n    struct H265PpsFlags\n    {\n      using NativeType = StdVideoH265PpsFlags;\n\n      operator StdVideoH265PpsFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH265PpsFlags *>( this );\n      }\n\n      operator StdVideoH265PpsFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH265PpsFlags *>( this );\n      }\n\n      bool operator==( H265PpsFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( dependent_slice_segments_enabled_flag == rhs.dependent_slice_segments_enabled_flag ) &&\n               ( output_flag_present_flag == rhs.output_flag_present_flag ) && ( sign_data_hiding_enabled_flag == rhs.sign_data_hiding_enabled_flag ) &&\n               ( cabac_init_present_flag == rhs.cabac_init_present_flag ) && ( constrained_intra_pred_flag == rhs.constrained_intra_pred_flag ) &&\n               ( transform_skip_enabled_flag == rhs.transform_skip_enabled_flag ) && ( cu_qp_delta_enabled_flag == rhs.cu_qp_delta_enabled_flag ) &&\n               ( pps_slice_chroma_qp_offsets_present_flag == rhs.pps_slice_chroma_qp_offsets_present_flag ) &&\n               ( weighted_pred_flag == rhs.weighted_pred_flag ) && ( weighted_bipred_flag == rhs.weighted_bipred_flag ) &&\n               ( transquant_bypass_enabled_flag == rhs.transquant_bypass_enabled_flag ) && ( tiles_enabled_flag == rhs.tiles_enabled_flag ) &&\n               ( entropy_coding_sync_enabled_flag == rhs.entropy_coding_sync_enabled_flag ) && ( uniform_spacing_flag == rhs.uniform_spacing_flag ) &&\n               ( loop_filter_across_tiles_enabled_flag == rhs.loop_filter_across_tiles_enabled_flag ) &&\n               ( pps_loop_filter_across_slices_enabled_flag == rhs.pps_loop_filter_across_slices_enabled_flag ) &&\n               ( deblocking_filter_control_present_flag == rhs.deblocking_filter_control_present_flag ) &&\n               ( deblocking_filter_override_enabled_flag == rhs.deblocking_filter_override_enabled_flag ) &&\n               ( pps_deblocking_filter_disabled_flag == rhs.pps_deblocking_filter_disabled_flag ) &&\n               ( pps_scaling_list_data_present_flag == rhs.pps_scaling_list_data_present_flag ) &&\n               ( lists_modification_present_flag == rhs.lists_modification_present_flag ) &&\n               ( slice_segment_header_extension_present_flag == rhs.slice_segment_header_extension_present_flag ) &&\n               ( pps_extension_present_flag == rhs.pps_extension_present_flag ) &&\n               ( cross_component_prediction_enabled_flag == rhs.cross_component_prediction_enabled_flag ) &&\n               ( chroma_qp_offset_list_enabled_flag == rhs.chroma_qp_offset_list_enabled_flag ) &&\n               ( pps_curr_pic_ref_enabled_flag == rhs.pps_curr_pic_ref_enabled_flag ) &&\n               ( residual_adaptive_colour_transform_enabled_flag == rhs.residual_adaptive_colour_transform_enabled_flag ) &&\n               ( pps_slice_act_qp_offsets_present_flag == rhs.pps_slice_act_qp_offsets_present_flag ) &&\n               ( pps_palette_predictor_initializers_present_flag == rhs.pps_palette_predictor_initializers_present_flag ) &&\n               ( monochrome_palette_flag == rhs.monochrome_palette_flag ) && ( pps_range_extension_flag == rhs.pps_range_extension_flag );\n      }\n\n      bool operator!=( H265PpsFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t dependent_slice_segments_enabled_flag           : 1;\n      uint32_t output_flag_present_flag                        : 1;\n      uint32_t sign_data_hiding_enabled_flag                   : 1;\n      uint32_t cabac_init_present_flag                         : 1;\n      uint32_t constrained_intra_pred_flag                     : 1;\n      uint32_t transform_skip_enabled_flag                     : 1;\n      uint32_t cu_qp_delta_enabled_flag                        : 1;\n      uint32_t pps_slice_chroma_qp_offsets_present_flag        : 1;\n      uint32_t weighted_pred_flag                              : 1;\n      uint32_t weighted_bipred_flag                            : 1;\n      uint32_t transquant_bypass_enabled_flag                  : 1;\n      uint32_t tiles_enabled_flag                              : 1;\n      uint32_t entropy_coding_sync_enabled_flag                : 1;\n      uint32_t uniform_spacing_flag                            : 1;\n      uint32_t loop_filter_across_tiles_enabled_flag           : 1;\n      uint32_t pps_loop_filter_across_slices_enabled_flag      : 1;\n      uint32_t deblocking_filter_control_present_flag          : 1;\n      uint32_t deblocking_filter_override_enabled_flag         : 1;\n      uint32_t pps_deblocking_filter_disabled_flag             : 1;\n      uint32_t pps_scaling_list_data_present_flag              : 1;\n      uint32_t lists_modification_present_flag                 : 1;\n      uint32_t slice_segment_header_extension_present_flag     : 1;\n      uint32_t pps_extension_present_flag                      : 1;\n      uint32_t cross_component_prediction_enabled_flag         : 1;\n      uint32_t chroma_qp_offset_list_enabled_flag              : 1;\n      uint32_t pps_curr_pic_ref_enabled_flag                   : 1;\n      uint32_t residual_adaptive_colour_transform_enabled_flag : 1;\n      uint32_t pps_slice_act_qp_offsets_present_flag           : 1;\n      uint32_t pps_palette_predictor_initializers_present_flag : 1;\n      uint32_t monochrome_palette_flag                         : 1;\n      uint32_t pps_range_extension_flag                        : 1;\n    };\n\n    struct H265PictureParameterSet\n    {\n      using NativeType = StdVideoH265PictureParameterSet;\n\n      operator StdVideoH265PictureParameterSet const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoH265PictureParameterSet *>( this );\n      }\n\n      operator StdVideoH265PictureParameterSet &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoH265PictureParameterSet *>( this );\n      }\n\n      bool operator==( H265PictureParameterSet const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( pps_pic_parameter_set_id == rhs.pps_pic_parameter_set_id ) &&\n               ( pps_seq_parameter_set_id == rhs.pps_seq_parameter_set_id ) && ( sps_video_parameter_set_id == rhs.sps_video_parameter_set_id ) &&\n               ( num_extra_slice_header_bits == rhs.num_extra_slice_header_bits ) &&\n               ( num_ref_idx_l0_default_active_minus1 == rhs.num_ref_idx_l0_default_active_minus1 ) &&\n               ( num_ref_idx_l1_default_active_minus1 == rhs.num_ref_idx_l1_default_active_minus1 ) && ( init_qp_minus26 == rhs.init_qp_minus26 ) &&\n               ( diff_cu_qp_delta_depth == rhs.diff_cu_qp_delta_depth ) && ( pps_cb_qp_offset == rhs.pps_cb_qp_offset ) &&\n               ( pps_cr_qp_offset == rhs.pps_cr_qp_offset ) && ( pps_beta_offset_div2 == rhs.pps_beta_offset_div2 ) &&\n               ( pps_tc_offset_div2 == rhs.pps_tc_offset_div2 ) && ( log2_parallel_merge_level_minus2 == rhs.log2_parallel_merge_level_minus2 ) &&\n               ( log2_max_transform_skip_block_size_minus2 == rhs.log2_max_transform_skip_block_size_minus2 ) &&\n               ( diff_cu_chroma_qp_offset_depth == rhs.diff_cu_chroma_qp_offset_depth ) &&\n               ( chroma_qp_offset_list_len_minus1 == rhs.chroma_qp_offset_list_len_minus1 ) && ( cb_qp_offset_list == rhs.cb_qp_offset_list ) &&\n               ( cr_qp_offset_list == rhs.cr_qp_offset_list ) && ( log2_sao_offset_scale_luma == rhs.log2_sao_offset_scale_luma ) &&\n               ( log2_sao_offset_scale_chroma == rhs.log2_sao_offset_scale_chroma ) && ( pps_act_y_qp_offset_plus5 == rhs.pps_act_y_qp_offset_plus5 ) &&\n               ( pps_act_cb_qp_offset_plus5 == rhs.pps_act_cb_qp_offset_plus5 ) && ( pps_act_cr_qp_offset_plus3 == rhs.pps_act_cr_qp_offset_plus3 ) &&\n               ( pps_num_palette_predictor_initializers == rhs.pps_num_palette_predictor_initializers ) &&\n               ( luma_bit_depth_entry_minus8 == rhs.luma_bit_depth_entry_minus8 ) && ( chroma_bit_depth_entry_minus8 == rhs.chroma_bit_depth_entry_minus8 ) &&\n               ( num_tile_columns_minus1 == rhs.num_tile_columns_minus1 ) && ( num_tile_rows_minus1 == rhs.num_tile_rows_minus1 ) &&\n               ( reserved1 == rhs.reserved1 ) && ( reserved2 == rhs.reserved2 ) && ( column_width_minus1 == rhs.column_width_minus1 ) &&\n               ( row_height_minus1 == rhs.row_height_minus1 ) && ( reserved3 == rhs.reserved3 ) && ( pScalingLists == rhs.pScalingLists ) &&\n               ( pPredictorPaletteEntries == rhs.pPredictorPaletteEntries );\n      }\n\n      bool operator!=( H265PictureParameterSet const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265PpsFlags                                      flags                                     = {};\n      uint8_t                                                                                             pps_pic_parameter_set_id                  = {};\n      uint8_t                                                                                             pps_seq_parameter_set_id                  = {};\n      uint8_t                                                                                             sps_video_parameter_set_id                = {};\n      uint8_t                                                                                             num_extra_slice_header_bits               = {};\n      uint8_t                                                                                             num_ref_idx_l0_default_active_minus1      = {};\n      uint8_t                                                                                             num_ref_idx_l1_default_active_minus1      = {};\n      int8_t                                                                                              init_qp_minus26                           = {};\n      uint8_t                                                                                             diff_cu_qp_delta_depth                    = {};\n      int8_t                                                                                              pps_cb_qp_offset                          = {};\n      int8_t                                                                                              pps_cr_qp_offset                          = {};\n      int8_t                                                                                              pps_beta_offset_div2                      = {};\n      int8_t                                                                                              pps_tc_offset_div2                        = {};\n      uint8_t                                                                                             log2_parallel_merge_level_minus2          = {};\n      uint8_t                                                                                             log2_max_transform_skip_block_size_minus2 = {};\n      uint8_t                                                                                             diff_cu_chroma_qp_offset_depth            = {};\n      uint8_t                                                                                             chroma_qp_offset_list_len_minus1          = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_H265_CHROMA_QP_OFFSET_LIST_SIZE>             cb_qp_offset_list                         = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_H265_CHROMA_QP_OFFSET_LIST_SIZE>             cr_qp_offset_list                         = {};\n      uint8_t                                                                                             log2_sao_offset_scale_luma                = {};\n      uint8_t                                                                                             log2_sao_offset_scale_chroma              = {};\n      int8_t                                                                                              pps_act_y_qp_offset_plus5                 = {};\n      int8_t                                                                                              pps_act_cb_qp_offset_plus5                = {};\n      int8_t                                                                                              pps_act_cr_qp_offset_plus3                = {};\n      uint8_t                                                                                             pps_num_palette_predictor_initializers    = {};\n      uint8_t                                                                                             luma_bit_depth_entry_minus8               = {};\n      uint8_t                                                                                             chroma_bit_depth_entry_minus8             = {};\n      uint8_t                                                                                             num_tile_columns_minus1                   = {};\n      uint8_t                                                                                             num_tile_rows_minus1                      = {};\n      uint8_t                                                                                             reserved1                                 = {};\n      uint8_t                                                                                             reserved2                                 = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint16_t, STD_VIDEO_H265_CHROMA_QP_OFFSET_TILE_COLS_LIST_SIZE> column_width_minus1                       = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint16_t, STD_VIDEO_H265_CHROMA_QP_OFFSET_TILE_ROWS_LIST_SIZE> row_height_minus1                         = {};\n      uint32_t                                                                                            reserved3                                 = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ScalingLists *                          pScalingLists                             = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265PredictorPaletteEntries *               pPredictorPaletteEntries                  = {};\n    };\n\n    //=== vulkan_video_codec_h265std_decode ===\n\n    struct DecodeH265PictureInfoFlags\n    {\n      using NativeType = StdVideoDecodeH265PictureInfoFlags;\n\n      operator StdVideoDecodeH265PictureInfoFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoDecodeH265PictureInfoFlags *>( this );\n      }\n\n      operator StdVideoDecodeH265PictureInfoFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoDecodeH265PictureInfoFlags *>( this );\n      }\n\n      bool operator==( DecodeH265PictureInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( IrapPicFlag == rhs.IrapPicFlag ) && ( IdrPicFlag == rhs.IdrPicFlag ) && ( IsReference == rhs.IsReference ) &&\n               ( short_term_ref_pic_set_sps_flag == rhs.short_term_ref_pic_set_sps_flag );\n      }\n\n      bool operator!=( DecodeH265PictureInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t IrapPicFlag                     : 1;\n      uint32_t IdrPicFlag                      : 1;\n      uint32_t IsReference                     : 1;\n      uint32_t short_term_ref_pic_set_sps_flag : 1;\n    };\n\n    struct DecodeH265PictureInfo\n    {\n      using NativeType = StdVideoDecodeH265PictureInfo;\n\n      operator StdVideoDecodeH265PictureInfo const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoDecodeH265PictureInfo *>( this );\n      }\n\n      operator StdVideoDecodeH265PictureInfo &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoDecodeH265PictureInfo *>( this );\n      }\n\n      bool operator==( DecodeH265PictureInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( sps_video_parameter_set_id == rhs.sps_video_parameter_set_id ) &&\n               ( pps_seq_parameter_set_id == rhs.pps_seq_parameter_set_id ) && ( pps_pic_parameter_set_id == rhs.pps_pic_parameter_set_id ) &&\n               ( NumDeltaPocsOfRefRpsIdx == rhs.NumDeltaPocsOfRefRpsIdx ) && ( PicOrderCntVal == rhs.PicOrderCntVal ) &&\n               ( NumBitsForSTRefPicSetInSlice == rhs.NumBitsForSTRefPicSetInSlice ) && ( reserved == rhs.reserved ) &&\n               ( RefPicSetStCurrBefore == rhs.RefPicSetStCurrBefore ) && ( RefPicSetStCurrAfter == rhs.RefPicSetStCurrAfter ) &&\n               ( RefPicSetLtCurr == rhs.RefPicSetLtCurr );\n      }\n\n      bool operator!=( DecodeH265PictureInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::DecodeH265PictureInfoFlags               flags                        = {};\n      uint8_t                                                                                    sps_video_parameter_set_id   = {};\n      uint8_t                                                                                    pps_seq_parameter_set_id     = {};\n      uint8_t                                                                                    pps_pic_parameter_set_id     = {};\n      uint8_t                                                                                    NumDeltaPocsOfRefRpsIdx      = {};\n      int32_t                                                                                    PicOrderCntVal               = {};\n      uint16_t                                                                                   NumBitsForSTRefPicSetInSlice = {};\n      uint16_t                                                                                   reserved                     = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_DECODE_H265_REF_PIC_SET_LIST_SIZE> RefPicSetStCurrBefore        = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_DECODE_H265_REF_PIC_SET_LIST_SIZE> RefPicSetStCurrAfter         = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_DECODE_H265_REF_PIC_SET_LIST_SIZE> RefPicSetLtCurr              = {};\n    };\n\n    struct DecodeH265ReferenceInfoFlags\n    {\n      using NativeType = StdVideoDecodeH265ReferenceInfoFlags;\n\n      operator StdVideoDecodeH265ReferenceInfoFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoDecodeH265ReferenceInfoFlags *>( this );\n      }\n\n      operator StdVideoDecodeH265ReferenceInfoFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoDecodeH265ReferenceInfoFlags *>( this );\n      }\n\n      bool operator==( DecodeH265ReferenceInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( used_for_long_term_reference == rhs.used_for_long_term_reference ) && ( unused_for_reference == rhs.unused_for_reference );\n      }\n\n      bool operator!=( DecodeH265ReferenceInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t used_for_long_term_reference : 1;\n      uint32_t unused_for_reference         : 1;\n    };\n\n    struct DecodeH265ReferenceInfo\n    {\n      using NativeType = StdVideoDecodeH265ReferenceInfo;\n\n      operator StdVideoDecodeH265ReferenceInfo const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoDecodeH265ReferenceInfo *>( this );\n      }\n\n      operator StdVideoDecodeH265ReferenceInfo &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoDecodeH265ReferenceInfo *>( this );\n      }\n\n      bool operator==( DecodeH265ReferenceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( PicOrderCntVal == rhs.PicOrderCntVal );\n      }\n\n      bool operator!=( DecodeH265ReferenceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::DecodeH265ReferenceInfoFlags flags          = {};\n      int32_t                                                                        PicOrderCntVal = {};\n    };\n\n    //=== vulkan_video_codec_h265std_encode ===\n\n    struct EncodeH265WeightTableFlags\n    {\n      using NativeType = StdVideoEncodeH265WeightTableFlags;\n\n      operator StdVideoEncodeH265WeightTableFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeH265WeightTableFlags *>( this );\n      }\n\n      operator StdVideoEncodeH265WeightTableFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeH265WeightTableFlags *>( this );\n      }\n\n      bool operator==( EncodeH265WeightTableFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( luma_weight_l0_flag == rhs.luma_weight_l0_flag ) && ( chroma_weight_l0_flag == rhs.chroma_weight_l0_flag ) &&\n               ( luma_weight_l1_flag == rhs.luma_weight_l1_flag ) && ( chroma_weight_l1_flag == rhs.chroma_weight_l1_flag );\n      }\n\n      bool operator!=( EncodeH265WeightTableFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint16_t luma_weight_l0_flag   = {};\n      uint16_t chroma_weight_l0_flag = {};\n      uint16_t luma_weight_l1_flag   = {};\n      uint16_t chroma_weight_l1_flag = {};\n    };\n\n    struct EncodeH265WeightTable\n    {\n      using NativeType = StdVideoEncodeH265WeightTable;\n\n      operator StdVideoEncodeH265WeightTable const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeH265WeightTable *>( this );\n      }\n\n      operator StdVideoEncodeH265WeightTable &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeH265WeightTable *>( this );\n      }\n\n      bool operator==( EncodeH265WeightTable const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( luma_log2_weight_denom == rhs.luma_log2_weight_denom ) &&\n               ( delta_chroma_log2_weight_denom == rhs.delta_chroma_log2_weight_denom ) && ( delta_luma_weight_l0 == rhs.delta_luma_weight_l0 ) &&\n               ( luma_offset_l0 == rhs.luma_offset_l0 ) && ( delta_chroma_weight_l0 == rhs.delta_chroma_weight_l0 ) &&\n               ( delta_chroma_offset_l0 == rhs.delta_chroma_offset_l0 ) && ( delta_luma_weight_l1 == rhs.delta_luma_weight_l1 ) &&\n               ( luma_offset_l1 == rhs.luma_offset_l1 ) && ( delta_chroma_weight_l1 == rhs.delta_chroma_weight_l1 ) &&\n               ( delta_chroma_offset_l1 == rhs.delta_chroma_offset_l1 );\n      }\n\n      bool operator!=( EncodeH265WeightTable const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH265WeightTableFlags                                    flags                          = {};\n      uint8_t                                                                                                         luma_log2_weight_denom         = {};\n      int8_t                                                                                                          delta_chroma_log2_weight_denom = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF>                                   delta_luma_weight_l0           = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF>                                   luma_offset_l0                 = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<int8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF, STD_VIDEO_H265_MAX_CHROMA_PLANES> delta_chroma_weight_l0         = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<int8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF, STD_VIDEO_H265_MAX_CHROMA_PLANES> delta_chroma_offset_l0         = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF>                                   delta_luma_weight_l1           = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF>                                   luma_offset_l1                 = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<int8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF, STD_VIDEO_H265_MAX_CHROMA_PLANES> delta_chroma_weight_l1         = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<int8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF, STD_VIDEO_H265_MAX_CHROMA_PLANES> delta_chroma_offset_l1         = {};\n    };\n\n    struct EncodeH265SliceSegmentHeaderFlags\n    {\n      using NativeType = StdVideoEncodeH265SliceSegmentHeaderFlags;\n\n      operator StdVideoEncodeH265SliceSegmentHeaderFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeH265SliceSegmentHeaderFlags *>( this );\n      }\n\n      operator StdVideoEncodeH265SliceSegmentHeaderFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeH265SliceSegmentHeaderFlags *>( this );\n      }\n\n      bool operator==( EncodeH265SliceSegmentHeaderFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( first_slice_segment_in_pic_flag == rhs.first_slice_segment_in_pic_flag ) &&\n               ( dependent_slice_segment_flag == rhs.dependent_slice_segment_flag ) && ( slice_sao_luma_flag == rhs.slice_sao_luma_flag ) &&\n               ( slice_sao_chroma_flag == rhs.slice_sao_chroma_flag ) && ( num_ref_idx_active_override_flag == rhs.num_ref_idx_active_override_flag ) &&\n               ( mvd_l1_zero_flag == rhs.mvd_l1_zero_flag ) && ( cabac_init_flag == rhs.cabac_init_flag ) &&\n               ( cu_chroma_qp_offset_enabled_flag == rhs.cu_chroma_qp_offset_enabled_flag ) &&\n               ( deblocking_filter_override_flag == rhs.deblocking_filter_override_flag ) &&\n               ( slice_deblocking_filter_disabled_flag == rhs.slice_deblocking_filter_disabled_flag ) &&\n               ( collocated_from_l0_flag == rhs.collocated_from_l0_flag ) &&\n               ( slice_loop_filter_across_slices_enabled_flag == rhs.slice_loop_filter_across_slices_enabled_flag ) && ( reserved == rhs.reserved );\n      }\n\n      bool operator!=( EncodeH265SliceSegmentHeaderFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t first_slice_segment_in_pic_flag              : 1;\n      uint32_t dependent_slice_segment_flag                 : 1;\n      uint32_t slice_sao_luma_flag                          : 1;\n      uint32_t slice_sao_chroma_flag                        : 1;\n      uint32_t num_ref_idx_active_override_flag             : 1;\n      uint32_t mvd_l1_zero_flag                             : 1;\n      uint32_t cabac_init_flag                              : 1;\n      uint32_t cu_chroma_qp_offset_enabled_flag             : 1;\n      uint32_t deblocking_filter_override_flag              : 1;\n      uint32_t slice_deblocking_filter_disabled_flag        : 1;\n      uint32_t collocated_from_l0_flag                      : 1;\n      uint32_t slice_loop_filter_across_slices_enabled_flag : 1;\n      uint32_t reserved                                     : 20;\n    };\n\n    struct EncodeH265SliceSegmentHeader\n    {\n      using NativeType = StdVideoEncodeH265SliceSegmentHeader;\n\n      operator StdVideoEncodeH265SliceSegmentHeader const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeH265SliceSegmentHeader *>( this );\n      }\n\n      operator StdVideoEncodeH265SliceSegmentHeader &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeH265SliceSegmentHeader *>( this );\n      }\n\n      bool operator==( EncodeH265SliceSegmentHeader const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( slice_type == rhs.slice_type ) && ( slice_segment_address == rhs.slice_segment_address ) &&\n               ( collocated_ref_idx == rhs.collocated_ref_idx ) && ( MaxNumMergeCand == rhs.MaxNumMergeCand ) &&\n               ( slice_cb_qp_offset == rhs.slice_cb_qp_offset ) && ( slice_cr_qp_offset == rhs.slice_cr_qp_offset ) &&\n               ( slice_beta_offset_div2 == rhs.slice_beta_offset_div2 ) && ( slice_tc_offset_div2 == rhs.slice_tc_offset_div2 ) &&\n               ( slice_act_y_qp_offset == rhs.slice_act_y_qp_offset ) && ( slice_act_cb_qp_offset == rhs.slice_act_cb_qp_offset ) &&\n               ( slice_act_cr_qp_offset == rhs.slice_act_cr_qp_offset ) && ( slice_qp_delta == rhs.slice_qp_delta ) && ( reserved1 == rhs.reserved1 ) &&\n               ( pWeightTable == rhs.pWeightTable );\n      }\n\n      bool operator!=( EncodeH265SliceSegmentHeader const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH265SliceSegmentHeaderFlags flags = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265SliceType slice_type = VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265SliceType::eB;\n      uint32_t                                                        slice_segment_address        = {};\n      uint8_t                                                         collocated_ref_idx           = {};\n      uint8_t                                                         MaxNumMergeCand              = {};\n      int8_t                                                          slice_cb_qp_offset           = {};\n      int8_t                                                          slice_cr_qp_offset           = {};\n      int8_t                                                          slice_beta_offset_div2       = {};\n      int8_t                                                          slice_tc_offset_div2         = {};\n      int8_t                                                          slice_act_y_qp_offset        = {};\n      int8_t                                                          slice_act_cb_qp_offset       = {};\n      int8_t                                                          slice_act_cr_qp_offset       = {};\n      int8_t                                                          slice_qp_delta               = {};\n      uint16_t                                                        reserved1                    = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH265WeightTable * pWeightTable = {};\n    };\n\n    struct EncodeH265ReferenceListsInfoFlags\n    {\n      using NativeType = StdVideoEncodeH265ReferenceListsInfoFlags;\n\n      operator StdVideoEncodeH265ReferenceListsInfoFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeH265ReferenceListsInfoFlags *>( this );\n      }\n\n      operator StdVideoEncodeH265ReferenceListsInfoFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeH265ReferenceListsInfoFlags *>( this );\n      }\n\n      bool operator==( EncodeH265ReferenceListsInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( ref_pic_list_modification_flag_l0 == rhs.ref_pic_list_modification_flag_l0 ) &&\n               ( ref_pic_list_modification_flag_l1 == rhs.ref_pic_list_modification_flag_l1 ) && ( reserved == rhs.reserved );\n      }\n\n      bool operator!=( EncodeH265ReferenceListsInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t ref_pic_list_modification_flag_l0 : 1;\n      uint32_t ref_pic_list_modification_flag_l1 : 1;\n      uint32_t reserved                          : 30;\n    };\n\n    struct EncodeH265ReferenceListsInfo\n    {\n      using NativeType = StdVideoEncodeH265ReferenceListsInfo;\n\n      operator StdVideoEncodeH265ReferenceListsInfo const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeH265ReferenceListsInfo *>( this );\n      }\n\n      operator StdVideoEncodeH265ReferenceListsInfo &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeH265ReferenceListsInfo *>( this );\n      }\n\n      bool operator==( EncodeH265ReferenceListsInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( num_ref_idx_l0_active_minus1 == rhs.num_ref_idx_l0_active_minus1 ) &&\n               ( num_ref_idx_l1_active_minus1 == rhs.num_ref_idx_l1_active_minus1 ) && ( RefPicList0 == rhs.RefPicList0 ) &&\n               ( RefPicList1 == rhs.RefPicList1 ) && ( list_entry_l0 == rhs.list_entry_l0 ) && ( list_entry_l1 == rhs.list_entry_l1 );\n      }\n\n      bool operator!=( EncodeH265ReferenceListsInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH265ReferenceListsInfoFlags flags                        = {};\n      uint8_t                                                                             num_ref_idx_l0_active_minus1 = {};\n      uint8_t                                                                             num_ref_idx_l1_active_minus1 = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF>      RefPicList0                  = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF>      RefPicList1                  = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF>      list_entry_l0                = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF>      list_entry_l1                = {};\n    };\n\n    struct EncodeH265PictureInfoFlags\n    {\n      using NativeType = StdVideoEncodeH265PictureInfoFlags;\n\n      operator StdVideoEncodeH265PictureInfoFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeH265PictureInfoFlags *>( this );\n      }\n\n      operator StdVideoEncodeH265PictureInfoFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeH265PictureInfoFlags *>( this );\n      }\n\n      bool operator==( EncodeH265PictureInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( is_reference == rhs.is_reference ) && ( IrapPicFlag == rhs.IrapPicFlag ) &&\n               ( used_for_long_term_reference == rhs.used_for_long_term_reference ) && ( discardable_flag == rhs.discardable_flag ) &&\n               ( cross_layer_bla_flag == rhs.cross_layer_bla_flag ) && ( pic_output_flag == rhs.pic_output_flag ) &&\n               ( no_output_of_prior_pics_flag == rhs.no_output_of_prior_pics_flag ) &&\n               ( short_term_ref_pic_set_sps_flag == rhs.short_term_ref_pic_set_sps_flag ) &&\n               ( slice_temporal_mvp_enabled_flag == rhs.slice_temporal_mvp_enabled_flag ) && ( reserved == rhs.reserved );\n      }\n\n      bool operator!=( EncodeH265PictureInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t is_reference                    : 1;\n      uint32_t IrapPicFlag                     : 1;\n      uint32_t used_for_long_term_reference    : 1;\n      uint32_t discardable_flag                : 1;\n      uint32_t cross_layer_bla_flag            : 1;\n      uint32_t pic_output_flag                 : 1;\n      uint32_t no_output_of_prior_pics_flag    : 1;\n      uint32_t short_term_ref_pic_set_sps_flag : 1;\n      uint32_t slice_temporal_mvp_enabled_flag : 1;\n      uint32_t reserved                        : 23;\n    };\n\n    struct EncodeH265LongTermRefPics\n    {\n      using NativeType = StdVideoEncodeH265LongTermRefPics;\n\n      operator StdVideoEncodeH265LongTermRefPics const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeH265LongTermRefPics *>( this );\n      }\n\n      operator StdVideoEncodeH265LongTermRefPics &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeH265LongTermRefPics *>( this );\n      }\n\n      bool operator==( EncodeH265LongTermRefPics const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( num_long_term_sps == rhs.num_long_term_sps ) && ( num_long_term_pics == rhs.num_long_term_pics ) && ( lt_idx_sps == rhs.lt_idx_sps ) &&\n               ( poc_lsb_lt == rhs.poc_lsb_lt ) && ( used_by_curr_pic_lt_flag == rhs.used_by_curr_pic_lt_flag ) &&\n               ( delta_poc_msb_present_flag == rhs.delta_poc_msb_present_flag ) && ( delta_poc_msb_cycle_lt == rhs.delta_poc_msb_cycle_lt );\n      }\n\n      bool operator!=( EncodeH265LongTermRefPics const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint8_t                                                                                  num_long_term_sps          = {};\n      uint8_t                                                                                  num_long_term_pics         = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_MAX_LONG_TERM_REF_PICS_SPS> lt_idx_sps                 = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_MAX_LONG_TERM_PICS>         poc_lsb_lt                 = {};\n      uint16_t                                                                                 used_by_curr_pic_lt_flag   = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_MAX_DELTA_POC>              delta_poc_msb_present_flag = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_MAX_DELTA_POC>              delta_poc_msb_cycle_lt     = {};\n    };\n\n    struct EncodeH265PictureInfo\n    {\n      using NativeType = StdVideoEncodeH265PictureInfo;\n\n      operator StdVideoEncodeH265PictureInfo const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeH265PictureInfo *>( this );\n      }\n\n      operator StdVideoEncodeH265PictureInfo &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeH265PictureInfo *>( this );\n      }\n\n      bool operator==( EncodeH265PictureInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( pic_type == rhs.pic_type ) && ( sps_video_parameter_set_id == rhs.sps_video_parameter_set_id ) &&\n               ( pps_seq_parameter_set_id == rhs.pps_seq_parameter_set_id ) && ( pps_pic_parameter_set_id == rhs.pps_pic_parameter_set_id ) &&\n               ( short_term_ref_pic_set_idx == rhs.short_term_ref_pic_set_idx ) && ( PicOrderCntVal == rhs.PicOrderCntVal ) &&\n               ( TemporalId == rhs.TemporalId ) && ( reserved1 == rhs.reserved1 ) && ( pRefLists == rhs.pRefLists ) &&\n               ( pShortTermRefPicSet == rhs.pShortTermRefPicSet ) && ( pLongTermRefPics == rhs.pLongTermRefPics );\n      }\n\n      bool operator!=( EncodeH265PictureInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH265PictureInfoFlags flags = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265PictureType pic_type = VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265PictureType::eP;\n      uint8_t                                                           sps_video_parameter_set_id               = {};\n      uint8_t                                                           pps_seq_parameter_set_id                 = {};\n      uint8_t                                                           pps_pic_parameter_set_id                 = {};\n      uint8_t                                                           short_term_ref_pic_set_idx               = {};\n      int32_t                                                           PicOrderCntVal                           = {};\n      uint8_t                                                           TemporalId                               = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, 7>                  reserved1                                = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH265ReferenceListsInfo * pRefLists           = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ShortTermRefPicSet *       pShortTermRefPicSet = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH265LongTermRefPics *    pLongTermRefPics    = {};\n    };\n\n    struct EncodeH265ReferenceInfoFlags\n    {\n      using NativeType = StdVideoEncodeH265ReferenceInfoFlags;\n\n      operator StdVideoEncodeH265ReferenceInfoFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeH265ReferenceInfoFlags *>( this );\n      }\n\n      operator StdVideoEncodeH265ReferenceInfoFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeH265ReferenceInfoFlags *>( this );\n      }\n\n      bool operator==( EncodeH265ReferenceInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( used_for_long_term_reference == rhs.used_for_long_term_reference ) && ( unused_for_reference == rhs.unused_for_reference ) &&\n               ( reserved == rhs.reserved );\n      }\n\n      bool operator!=( EncodeH265ReferenceInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t used_for_long_term_reference : 1;\n      uint32_t unused_for_reference         : 1;\n      uint32_t reserved                     : 30;\n    };\n\n    struct EncodeH265ReferenceInfo\n    {\n      using NativeType = StdVideoEncodeH265ReferenceInfo;\n\n      operator StdVideoEncodeH265ReferenceInfo const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeH265ReferenceInfo *>( this );\n      }\n\n      operator StdVideoEncodeH265ReferenceInfo &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeH265ReferenceInfo *>( this );\n      }\n\n      bool operator==( EncodeH265ReferenceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( pic_type == rhs.pic_type ) && ( PicOrderCntVal == rhs.PicOrderCntVal ) && ( TemporalId == rhs.TemporalId );\n      }\n\n      bool operator!=( EncodeH265ReferenceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH265ReferenceInfoFlags flags = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265PictureType pic_type       = VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265PictureType::eP;\n      int32_t                                                           PicOrderCntVal = {};\n      uint8_t                                                           TemporalId     = {};\n    };\n\n    //=== vulkan_video_codec_av1std ===\n\n    struct AV1ColorConfigFlags\n    {\n      using NativeType = StdVideoAV1ColorConfigFlags;\n\n      operator StdVideoAV1ColorConfigFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoAV1ColorConfigFlags *>( this );\n      }\n\n      operator StdVideoAV1ColorConfigFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoAV1ColorConfigFlags *>( this );\n      }\n\n      bool operator==( AV1ColorConfigFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( mono_chrome == rhs.mono_chrome ) && ( color_range == rhs.color_range ) && ( separate_uv_delta_q == rhs.separate_uv_delta_q ) &&\n               ( color_description_present_flag == rhs.color_description_present_flag ) && ( reserved == rhs.reserved );\n      }\n\n      bool operator!=( AV1ColorConfigFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t mono_chrome                    : 1;\n      uint32_t color_range                    : 1;\n      uint32_t separate_uv_delta_q            : 1;\n      uint32_t color_description_present_flag : 1;\n      uint32_t reserved                       : 28;\n    };\n\n    struct AV1ColorConfig\n    {\n      using NativeType = StdVideoAV1ColorConfig;\n\n      operator StdVideoAV1ColorConfig const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoAV1ColorConfig *>( this );\n      }\n\n      operator StdVideoAV1ColorConfig &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoAV1ColorConfig *>( this );\n      }\n\n      bool operator==( AV1ColorConfig const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( BitDepth == rhs.BitDepth ) && ( subsampling_x == rhs.subsampling_x ) && ( subsampling_y == rhs.subsampling_y ) &&\n               ( reserved1 == rhs.reserved1 ) && ( color_primaries == rhs.color_primaries ) && ( transfer_characteristics == rhs.transfer_characteristics ) &&\n               ( matrix_coefficients == rhs.matrix_coefficients ) && ( chroma_sample_position == rhs.chroma_sample_position );\n      }\n\n      bool operator!=( AV1ColorConfig const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1ColorConfigFlags flags         = {};\n      uint8_t                                                               BitDepth      = {};\n      uint8_t                                                               subsampling_x = {};\n      uint8_t                                                               subsampling_y = {};\n      uint8_t                                                               reserved1     = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1ColorPrimaries   color_primaries =\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1ColorPrimaries::eBt709;\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1TransferCharacteristics transfer_characteristics =\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1TransferCharacteristics::eReserved0;\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1MatrixCoefficients matrix_coefficients =\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1MatrixCoefficients::eIdentity;\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1ChromaSamplePosition chroma_sample_position =\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1ChromaSamplePosition::eUnknown;\n    };\n\n    struct AV1TimingInfoFlags\n    {\n      using NativeType = StdVideoAV1TimingInfoFlags;\n\n      operator StdVideoAV1TimingInfoFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoAV1TimingInfoFlags *>( this );\n      }\n\n      operator StdVideoAV1TimingInfoFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoAV1TimingInfoFlags *>( this );\n      }\n\n      bool operator==( AV1TimingInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( equal_picture_interval == rhs.equal_picture_interval ) && ( reserved == rhs.reserved );\n      }\n\n      bool operator!=( AV1TimingInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t equal_picture_interval : 1;\n      uint32_t reserved               : 31;\n    };\n\n    struct AV1TimingInfo\n    {\n      using NativeType = StdVideoAV1TimingInfo;\n\n      operator StdVideoAV1TimingInfo const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoAV1TimingInfo *>( this );\n      }\n\n      operator StdVideoAV1TimingInfo &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoAV1TimingInfo *>( this );\n      }\n\n      bool operator==( AV1TimingInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( num_units_in_display_tick == rhs.num_units_in_display_tick ) && ( time_scale == rhs.time_scale ) &&\n               ( num_ticks_per_picture_minus_1 == rhs.num_ticks_per_picture_minus_1 );\n      }\n\n      bool operator!=( AV1TimingInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1TimingInfoFlags flags                         = {};\n      uint32_t                                                             num_units_in_display_tick     = {};\n      uint32_t                                                             time_scale                    = {};\n      uint32_t                                                             num_ticks_per_picture_minus_1 = {};\n    };\n\n    struct AV1LoopFilterFlags\n    {\n      using NativeType = StdVideoAV1LoopFilterFlags;\n\n      operator StdVideoAV1LoopFilterFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoAV1LoopFilterFlags *>( this );\n      }\n\n      operator StdVideoAV1LoopFilterFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoAV1LoopFilterFlags *>( this );\n      }\n\n      bool operator==( AV1LoopFilterFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( loop_filter_delta_enabled == rhs.loop_filter_delta_enabled ) && ( loop_filter_delta_update == rhs.loop_filter_delta_update ) &&\n               ( reserved == rhs.reserved );\n      }\n\n      bool operator!=( AV1LoopFilterFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t loop_filter_delta_enabled : 1;\n      uint32_t loop_filter_delta_update  : 1;\n      uint32_t reserved                  : 30;\n    };\n\n    struct AV1LoopFilter\n    {\n      using NativeType = StdVideoAV1LoopFilter;\n\n      operator StdVideoAV1LoopFilter const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoAV1LoopFilter *>( this );\n      }\n\n      operator StdVideoAV1LoopFilter &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoAV1LoopFilter *>( this );\n      }\n\n      bool operator==( AV1LoopFilter const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( loop_filter_level == rhs.loop_filter_level ) && ( loop_filter_sharpness == rhs.loop_filter_sharpness ) &&\n               ( update_ref_delta == rhs.update_ref_delta ) && ( loop_filter_ref_deltas == rhs.loop_filter_ref_deltas ) &&\n               ( update_mode_delta == rhs.update_mode_delta ) && ( loop_filter_mode_deltas == rhs.loop_filter_mode_deltas );\n      }\n\n      bool operator!=( AV1LoopFilter const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1LoopFilterFlags                   flags                   = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_AV1_MAX_LOOP_FILTER_STRENGTHS> loop_filter_level       = {};\n      uint8_t                                                                                loop_filter_sharpness   = {};\n      uint8_t                                                                                update_ref_delta        = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_AV1_TOTAL_REFS_PER_FRAME>       loop_filter_ref_deltas  = {};\n      uint8_t                                                                                update_mode_delta       = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_AV1_LOOP_FILTER_ADJUSTMENTS>    loop_filter_mode_deltas = {};\n    };\n\n    struct AV1QuantizationFlags\n    {\n      using NativeType = StdVideoAV1QuantizationFlags;\n\n      operator StdVideoAV1QuantizationFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoAV1QuantizationFlags *>( this );\n      }\n\n      operator StdVideoAV1QuantizationFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoAV1QuantizationFlags *>( this );\n      }\n\n      bool operator==( AV1QuantizationFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( using_qmatrix == rhs.using_qmatrix ) && ( diff_uv_delta == rhs.diff_uv_delta ) && ( reserved == rhs.reserved );\n      }\n\n      bool operator!=( AV1QuantizationFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t using_qmatrix : 1;\n      uint32_t diff_uv_delta : 1;\n      uint32_t reserved      : 30;\n    };\n\n    struct AV1Quantization\n    {\n      using NativeType = StdVideoAV1Quantization;\n\n      operator StdVideoAV1Quantization const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoAV1Quantization *>( this );\n      }\n\n      operator StdVideoAV1Quantization &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoAV1Quantization *>( this );\n      }\n\n      bool operator==( AV1Quantization const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( base_q_idx == rhs.base_q_idx ) && ( DeltaQYDc == rhs.DeltaQYDc ) && ( DeltaQUDc == rhs.DeltaQUDc ) &&\n               ( DeltaQUAc == rhs.DeltaQUAc ) && ( DeltaQVDc == rhs.DeltaQVDc ) && ( DeltaQVAc == rhs.DeltaQVAc ) && ( qm_y == rhs.qm_y ) &&\n               ( qm_u == rhs.qm_u ) && ( qm_v == rhs.qm_v );\n      }\n\n      bool operator!=( AV1Quantization const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1QuantizationFlags flags      = {};\n      uint8_t                                                                base_q_idx = {};\n      int8_t                                                                 DeltaQYDc  = {};\n      int8_t                                                                 DeltaQUDc  = {};\n      int8_t                                                                 DeltaQUAc  = {};\n      int8_t                                                                 DeltaQVDc  = {};\n      int8_t                                                                 DeltaQVAc  = {};\n      uint8_t                                                                qm_y       = {};\n      uint8_t                                                                qm_u       = {};\n      uint8_t                                                                qm_v       = {};\n    };\n\n    struct AV1Segmentation\n    {\n      using NativeType = StdVideoAV1Segmentation;\n\n      operator StdVideoAV1Segmentation const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoAV1Segmentation *>( this );\n      }\n\n      operator StdVideoAV1Segmentation &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoAV1Segmentation *>( this );\n      }\n\n      bool operator==( AV1Segmentation const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( FeatureEnabled == rhs.FeatureEnabled ) && ( FeatureData == rhs.FeatureData );\n      }\n\n      bool operator!=( AV1Segmentation const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_AV1_MAX_SEGMENTS>                            FeatureEnabled = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<int16_t, STD_VIDEO_AV1_MAX_SEGMENTS, STD_VIDEO_AV1_SEG_LVL_MAX> FeatureData    = {};\n    };\n\n    struct AV1TileInfoFlags\n    {\n      using NativeType = StdVideoAV1TileInfoFlags;\n\n      operator StdVideoAV1TileInfoFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoAV1TileInfoFlags *>( this );\n      }\n\n      operator StdVideoAV1TileInfoFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoAV1TileInfoFlags *>( this );\n      }\n\n      bool operator==( AV1TileInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( uniform_tile_spacing_flag == rhs.uniform_tile_spacing_flag ) && ( reserved == rhs.reserved );\n      }\n\n      bool operator!=( AV1TileInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t uniform_tile_spacing_flag : 1;\n      uint32_t reserved                  : 31;\n    };\n\n    struct AV1TileInfo\n    {\n      using NativeType = StdVideoAV1TileInfo;\n\n      operator StdVideoAV1TileInfo const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoAV1TileInfo *>( this );\n      }\n\n      operator StdVideoAV1TileInfo &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoAV1TileInfo *>( this );\n      }\n\n      bool operator==( AV1TileInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( TileCols == rhs.TileCols ) && ( TileRows == rhs.TileRows ) &&\n               ( context_update_tile_id == rhs.context_update_tile_id ) && ( tile_size_bytes_minus_1 == rhs.tile_size_bytes_minus_1 ) &&\n               ( reserved1 == rhs.reserved1 ) && ( pMiColStarts == rhs.pMiColStarts ) && ( pMiRowStarts == rhs.pMiRowStarts ) &&\n               ( pWidthInSbsMinus1 == rhs.pWidthInSbsMinus1 ) && ( pHeightInSbsMinus1 == rhs.pHeightInSbsMinus1 );\n      }\n\n      bool operator!=( AV1TileInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1TileInfoFlags flags                   = {};\n      uint8_t                                                            TileCols                = {};\n      uint8_t                                                            TileRows                = {};\n      uint16_t                                                           context_update_tile_id  = {};\n      uint8_t                                                            tile_size_bytes_minus_1 = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, 7>                   reserved1               = {};\n      const uint16_t *                                                   pMiColStarts            = {};\n      const uint16_t *                                                   pMiRowStarts            = {};\n      const uint16_t *                                                   pWidthInSbsMinus1       = {};\n      const uint16_t *                                                   pHeightInSbsMinus1      = {};\n    };\n\n    struct AV1CDEF\n    {\n      using NativeType = StdVideoAV1CDEF;\n\n      operator StdVideoAV1CDEF const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoAV1CDEF *>( this );\n      }\n\n      operator StdVideoAV1CDEF &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoAV1CDEF *>( this );\n      }\n\n      bool operator==( AV1CDEF const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( cdef_damping_minus_3 == rhs.cdef_damping_minus_3 ) && ( cdef_bits == rhs.cdef_bits ) && ( cdef_y_pri_strength == rhs.cdef_y_pri_strength ) &&\n               ( cdef_y_sec_strength == rhs.cdef_y_sec_strength ) && ( cdef_uv_pri_strength == rhs.cdef_uv_pri_strength ) &&\n               ( cdef_uv_sec_strength == rhs.cdef_uv_sec_strength );\n      }\n\n      bool operator!=( AV1CDEF const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint8_t                                                                                cdef_damping_minus_3 = {};\n      uint8_t                                                                                cdef_bits            = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_AV1_MAX_CDEF_FILTER_STRENGTHS> cdef_y_pri_strength  = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_AV1_MAX_CDEF_FILTER_STRENGTHS> cdef_y_sec_strength  = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_AV1_MAX_CDEF_FILTER_STRENGTHS> cdef_uv_pri_strength = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_AV1_MAX_CDEF_FILTER_STRENGTHS> cdef_uv_sec_strength = {};\n    };\n\n    struct AV1LoopRestoration\n    {\n      using NativeType = StdVideoAV1LoopRestoration;\n\n      operator StdVideoAV1LoopRestoration const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoAV1LoopRestoration *>( this );\n      }\n\n      operator StdVideoAV1LoopRestoration &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoAV1LoopRestoration *>( this );\n      }\n\n      bool operator==( AV1LoopRestoration const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( FrameRestorationType == rhs.FrameRestorationType ) && ( LoopRestorationSize == rhs.LoopRestorationSize );\n      }\n\n      bool operator!=( AV1LoopRestoration const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<StdVideoAV1FrameRestorationType, STD_VIDEO_AV1_MAX_NUM_PLANES> FrameRestorationType = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint16_t, STD_VIDEO_AV1_MAX_NUM_PLANES>                        LoopRestorationSize  = {};\n    };\n\n    struct AV1GlobalMotion\n    {\n      using NativeType = StdVideoAV1GlobalMotion;\n\n      operator StdVideoAV1GlobalMotion const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoAV1GlobalMotion *>( this );\n      }\n\n      operator StdVideoAV1GlobalMotion &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoAV1GlobalMotion *>( this );\n      }\n\n      bool operator==( AV1GlobalMotion const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( GmType == rhs.GmType ) && ( gm_params == rhs.gm_params );\n      }\n\n      bool operator!=( AV1GlobalMotion const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_AV1_NUM_REF_FRAMES>                                     GmType    = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<int32_t, STD_VIDEO_AV1_NUM_REF_FRAMES, STD_VIDEO_AV1_GLOBAL_MOTION_PARAMS> gm_params = {};\n    };\n\n    struct AV1FilmGrainFlags\n    {\n      using NativeType = StdVideoAV1FilmGrainFlags;\n\n      operator StdVideoAV1FilmGrainFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoAV1FilmGrainFlags *>( this );\n      }\n\n      operator StdVideoAV1FilmGrainFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoAV1FilmGrainFlags *>( this );\n      }\n\n      bool operator==( AV1FilmGrainFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( chroma_scaling_from_luma == rhs.chroma_scaling_from_luma ) && ( overlap_flag == rhs.overlap_flag ) &&\n               ( clip_to_restricted_range == rhs.clip_to_restricted_range ) && ( update_grain == rhs.update_grain ) && ( reserved == rhs.reserved );\n      }\n\n      bool operator!=( AV1FilmGrainFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t chroma_scaling_from_luma : 1;\n      uint32_t overlap_flag             : 1;\n      uint32_t clip_to_restricted_range : 1;\n      uint32_t update_grain             : 1;\n      uint32_t reserved                 : 28;\n    };\n\n    struct AV1FilmGrain\n    {\n      using NativeType = StdVideoAV1FilmGrain;\n\n      operator StdVideoAV1FilmGrain const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoAV1FilmGrain *>( this );\n      }\n\n      operator StdVideoAV1FilmGrain &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoAV1FilmGrain *>( this );\n      }\n\n      bool operator==( AV1FilmGrain const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( grain_scaling_minus_8 == rhs.grain_scaling_minus_8 ) && ( ar_coeff_lag == rhs.ar_coeff_lag ) &&\n               ( ar_coeff_shift_minus_6 == rhs.ar_coeff_shift_minus_6 ) && ( grain_scale_shift == rhs.grain_scale_shift ) && ( grain_seed == rhs.grain_seed ) &&\n               ( film_grain_params_ref_idx == rhs.film_grain_params_ref_idx ) && ( num_y_points == rhs.num_y_points ) &&\n               ( point_y_value == rhs.point_y_value ) && ( point_y_scaling == rhs.point_y_scaling ) && ( num_cb_points == rhs.num_cb_points ) &&\n               ( point_cb_value == rhs.point_cb_value ) && ( point_cb_scaling == rhs.point_cb_scaling ) && ( num_cr_points == rhs.num_cr_points ) &&\n               ( point_cr_value == rhs.point_cr_value ) && ( point_cr_scaling == rhs.point_cr_scaling ) &&\n               ( ar_coeffs_y_plus_128 == rhs.ar_coeffs_y_plus_128 ) && ( ar_coeffs_cb_plus_128 == rhs.ar_coeffs_cb_plus_128 ) &&\n               ( ar_coeffs_cr_plus_128 == rhs.ar_coeffs_cr_plus_128 ) && ( cb_mult == rhs.cb_mult ) && ( cb_luma_mult == rhs.cb_luma_mult ) &&\n               ( cb_offset == rhs.cb_offset ) && ( cr_mult == rhs.cr_mult ) && ( cr_luma_mult == rhs.cr_luma_mult ) && ( cr_offset == rhs.cr_offset );\n      }\n\n      bool operator!=( AV1FilmGrain const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1FilmGrainFlags            flags                     = {};\n      uint8_t                                                                        grain_scaling_minus_8     = {};\n      uint8_t                                                                        ar_coeff_lag              = {};\n      uint8_t                                                                        ar_coeff_shift_minus_6    = {};\n      uint8_t                                                                        grain_scale_shift         = {};\n      uint16_t                                                                       grain_seed                = {};\n      uint8_t                                                                        film_grain_params_ref_idx = {};\n      uint8_t                                                                        num_y_points              = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_AV1_MAX_NUM_Y_POINTS>  point_y_value             = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_AV1_MAX_NUM_Y_POINTS>  point_y_scaling           = {};\n      uint8_t                                                                        num_cb_points             = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_AV1_MAX_NUM_CB_POINTS> point_cb_value            = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_AV1_MAX_NUM_CB_POINTS> point_cb_scaling          = {};\n      uint8_t                                                                        num_cr_points             = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_AV1_MAX_NUM_CR_POINTS> point_cr_value            = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_AV1_MAX_NUM_CR_POINTS> point_cr_scaling          = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_AV1_MAX_NUM_POS_LUMA>   ar_coeffs_y_plus_128      = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_AV1_MAX_NUM_POS_CHROMA> ar_coeffs_cb_plus_128     = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_AV1_MAX_NUM_POS_CHROMA> ar_coeffs_cr_plus_128     = {};\n      uint8_t                                                                        cb_mult                   = {};\n      uint8_t                                                                        cb_luma_mult              = {};\n      uint16_t                                                                       cb_offset                 = {};\n      uint8_t                                                                        cr_mult                   = {};\n      uint8_t                                                                        cr_luma_mult              = {};\n      uint16_t                                                                       cr_offset                 = {};\n    };\n\n    struct AV1SequenceHeaderFlags\n    {\n      using NativeType = StdVideoAV1SequenceHeaderFlags;\n\n      operator StdVideoAV1SequenceHeaderFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoAV1SequenceHeaderFlags *>( this );\n      }\n\n      operator StdVideoAV1SequenceHeaderFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoAV1SequenceHeaderFlags *>( this );\n      }\n\n      bool operator==( AV1SequenceHeaderFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( still_picture == rhs.still_picture ) && ( reduced_still_picture_header == rhs.reduced_still_picture_header ) &&\n               ( use_128x128_superblock == rhs.use_128x128_superblock ) && ( enable_filter_intra == rhs.enable_filter_intra ) &&\n               ( enable_intra_edge_filter == rhs.enable_intra_edge_filter ) && ( enable_interintra_compound == rhs.enable_interintra_compound ) &&\n               ( enable_masked_compound == rhs.enable_masked_compound ) && ( enable_warped_motion == rhs.enable_warped_motion ) &&\n               ( enable_dual_filter == rhs.enable_dual_filter ) && ( enable_order_hint == rhs.enable_order_hint ) &&\n               ( enable_jnt_comp == rhs.enable_jnt_comp ) && ( enable_ref_frame_mvs == rhs.enable_ref_frame_mvs ) &&\n               ( frame_id_numbers_present_flag == rhs.frame_id_numbers_present_flag ) && ( enable_superres == rhs.enable_superres ) &&\n               ( enable_cdef == rhs.enable_cdef ) && ( enable_restoration == rhs.enable_restoration ) &&\n               ( film_grain_params_present == rhs.film_grain_params_present ) && ( timing_info_present_flag == rhs.timing_info_present_flag ) &&\n               ( initial_display_delay_present_flag == rhs.initial_display_delay_present_flag ) && ( reserved == rhs.reserved );\n      }\n\n      bool operator!=( AV1SequenceHeaderFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t still_picture                      : 1;\n      uint32_t reduced_still_picture_header       : 1;\n      uint32_t use_128x128_superblock             : 1;\n      uint32_t enable_filter_intra                : 1;\n      uint32_t enable_intra_edge_filter           : 1;\n      uint32_t enable_interintra_compound         : 1;\n      uint32_t enable_masked_compound             : 1;\n      uint32_t enable_warped_motion               : 1;\n      uint32_t enable_dual_filter                 : 1;\n      uint32_t enable_order_hint                  : 1;\n      uint32_t enable_jnt_comp                    : 1;\n      uint32_t enable_ref_frame_mvs               : 1;\n      uint32_t frame_id_numbers_present_flag      : 1;\n      uint32_t enable_superres                    : 1;\n      uint32_t enable_cdef                        : 1;\n      uint32_t enable_restoration                 : 1;\n      uint32_t film_grain_params_present          : 1;\n      uint32_t timing_info_present_flag           : 1;\n      uint32_t initial_display_delay_present_flag : 1;\n      uint32_t reserved                           : 13;\n    };\n\n    struct AV1SequenceHeader\n    {\n      using NativeType = StdVideoAV1SequenceHeader;\n\n      operator StdVideoAV1SequenceHeader const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoAV1SequenceHeader *>( this );\n      }\n\n      operator StdVideoAV1SequenceHeader &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoAV1SequenceHeader *>( this );\n      }\n\n      bool operator==( AV1SequenceHeader const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( seq_profile == rhs.seq_profile ) && ( frame_width_bits_minus_1 == rhs.frame_width_bits_minus_1 ) &&\n               ( frame_height_bits_minus_1 == rhs.frame_height_bits_minus_1 ) && ( max_frame_width_minus_1 == rhs.max_frame_width_minus_1 ) &&\n               ( max_frame_height_minus_1 == rhs.max_frame_height_minus_1 ) && ( delta_frame_id_length_minus_2 == rhs.delta_frame_id_length_minus_2 ) &&\n               ( additional_frame_id_length_minus_1 == rhs.additional_frame_id_length_minus_1 ) && ( order_hint_bits_minus_1 == rhs.order_hint_bits_minus_1 ) &&\n               ( seq_force_integer_mv == rhs.seq_force_integer_mv ) && ( seq_force_screen_content_tools == rhs.seq_force_screen_content_tools ) &&\n               ( reserved1 == rhs.reserved1 ) && ( pColorConfig == rhs.pColorConfig ) && ( pTimingInfo == rhs.pTimingInfo );\n      }\n\n      bool operator!=( AV1SequenceHeader const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1SequenceHeaderFlags flags = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1Profile seq_profile       = VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1Profile::eMain;\n      uint8_t                                                      frame_width_bits_minus_1           = {};\n      uint8_t                                                      frame_height_bits_minus_1          = {};\n      uint16_t                                                     max_frame_width_minus_1            = {};\n      uint16_t                                                     max_frame_height_minus_1           = {};\n      uint8_t                                                      delta_frame_id_length_minus_2      = {};\n      uint8_t                                                      additional_frame_id_length_minus_1 = {};\n      uint8_t                                                      order_hint_bits_minus_1            = {};\n      uint8_t                                                      seq_force_integer_mv               = {};\n      uint8_t                                                      seq_force_screen_content_tools     = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, 5>             reserved1                          = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1ColorConfig * pColorConfig           = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1TimingInfo *  pTimingInfo            = {};\n    };\n\n    //=== vulkan_video_codec_av1std_decode ===\n\n    struct DecodeAV1PictureInfoFlags\n    {\n      using NativeType = StdVideoDecodeAV1PictureInfoFlags;\n\n      operator StdVideoDecodeAV1PictureInfoFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoDecodeAV1PictureInfoFlags *>( this );\n      }\n\n      operator StdVideoDecodeAV1PictureInfoFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoDecodeAV1PictureInfoFlags *>( this );\n      }\n\n      bool operator==( DecodeAV1PictureInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( error_resilient_mode == rhs.error_resilient_mode ) && ( disable_cdf_update == rhs.disable_cdf_update ) &&\n               ( use_superres == rhs.use_superres ) && ( render_and_frame_size_different == rhs.render_and_frame_size_different ) &&\n               ( allow_screen_content_tools == rhs.allow_screen_content_tools ) && ( is_filter_switchable == rhs.is_filter_switchable ) &&\n               ( force_integer_mv == rhs.force_integer_mv ) && ( frame_size_override_flag == rhs.frame_size_override_flag ) &&\n               ( buffer_removal_time_present_flag == rhs.buffer_removal_time_present_flag ) && ( allow_intrabc == rhs.allow_intrabc ) &&\n               ( frame_refs_short_signaling == rhs.frame_refs_short_signaling ) && ( allow_high_precision_mv == rhs.allow_high_precision_mv ) &&\n               ( is_motion_mode_switchable == rhs.is_motion_mode_switchable ) && ( use_ref_frame_mvs == rhs.use_ref_frame_mvs ) &&\n               ( disable_frame_end_update_cdf == rhs.disable_frame_end_update_cdf ) && ( allow_warped_motion == rhs.allow_warped_motion ) &&\n               ( reduced_tx_set == rhs.reduced_tx_set ) && ( reference_select == rhs.reference_select ) && ( skip_mode_present == rhs.skip_mode_present ) &&\n               ( delta_q_present == rhs.delta_q_present ) && ( delta_lf_present == rhs.delta_lf_present ) && ( delta_lf_multi == rhs.delta_lf_multi ) &&\n               ( segmentation_enabled == rhs.segmentation_enabled ) && ( segmentation_update_map == rhs.segmentation_update_map ) &&\n               ( segmentation_temporal_update == rhs.segmentation_temporal_update ) && ( segmentation_update_data == rhs.segmentation_update_data ) &&\n               ( UsesLr == rhs.UsesLr ) && ( usesChromaLr == rhs.usesChromaLr ) && ( apply_grain == rhs.apply_grain ) && ( reserved == rhs.reserved );\n      }\n\n      bool operator!=( DecodeAV1PictureInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t error_resilient_mode             : 1;\n      uint32_t disable_cdf_update               : 1;\n      uint32_t use_superres                     : 1;\n      uint32_t render_and_frame_size_different  : 1;\n      uint32_t allow_screen_content_tools       : 1;\n      uint32_t is_filter_switchable             : 1;\n      uint32_t force_integer_mv                 : 1;\n      uint32_t frame_size_override_flag         : 1;\n      uint32_t buffer_removal_time_present_flag : 1;\n      uint32_t allow_intrabc                    : 1;\n      uint32_t frame_refs_short_signaling       : 1;\n      uint32_t allow_high_precision_mv          : 1;\n      uint32_t is_motion_mode_switchable        : 1;\n      uint32_t use_ref_frame_mvs                : 1;\n      uint32_t disable_frame_end_update_cdf     : 1;\n      uint32_t allow_warped_motion              : 1;\n      uint32_t reduced_tx_set                   : 1;\n      uint32_t reference_select                 : 1;\n      uint32_t skip_mode_present                : 1;\n      uint32_t delta_q_present                  : 1;\n      uint32_t delta_lf_present                 : 1;\n      uint32_t delta_lf_multi                   : 1;\n      uint32_t segmentation_enabled             : 1;\n      uint32_t segmentation_update_map          : 1;\n      uint32_t segmentation_temporal_update     : 1;\n      uint32_t segmentation_update_data         : 1;\n      uint32_t UsesLr                           : 1;\n      uint32_t usesChromaLr                     : 1;\n      uint32_t apply_grain                      : 1;\n      uint32_t reserved                         : 3;\n    };\n\n    struct DecodeAV1PictureInfo\n    {\n      using NativeType = StdVideoDecodeAV1PictureInfo;\n\n      operator StdVideoDecodeAV1PictureInfo const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoDecodeAV1PictureInfo *>( this );\n      }\n\n      operator StdVideoDecodeAV1PictureInfo &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoDecodeAV1PictureInfo *>( this );\n      }\n\n      bool operator==( DecodeAV1PictureInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( frame_type == rhs.frame_type ) && ( current_frame_id == rhs.current_frame_id ) && ( OrderHint == rhs.OrderHint ) &&\n               ( primary_ref_frame == rhs.primary_ref_frame ) && ( refresh_frame_flags == rhs.refresh_frame_flags ) && ( reserved1 == rhs.reserved1 ) &&\n               ( interpolation_filter == rhs.interpolation_filter ) && ( TxMode == rhs.TxMode ) && ( delta_q_res == rhs.delta_q_res ) &&\n               ( delta_lf_res == rhs.delta_lf_res ) && ( SkipModeFrame == rhs.SkipModeFrame ) && ( coded_denom == rhs.coded_denom ) &&\n               ( reserved2 == rhs.reserved2 ) && ( OrderHints == rhs.OrderHints ) && ( expectedFrameId == rhs.expectedFrameId ) &&\n               ( pTileInfo == rhs.pTileInfo ) && ( pQuantization == rhs.pQuantization ) && ( pSegmentation == rhs.pSegmentation ) &&\n               ( pLoopFilter == rhs.pLoopFilter ) && ( pCDEF == rhs.pCDEF ) && ( pLoopRestoration == rhs.pLoopRestoration ) &&\n               ( pGlobalMotion == rhs.pGlobalMotion ) && ( pFilmGrain == rhs.pFilmGrain );\n      }\n\n      bool operator!=( DecodeAV1PictureInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::DecodeAV1PictureInfoFlags flags  = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1FrameType frame_type          = VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1FrameType::eKey;\n      uint32_t                                                       current_frame_id    = {};\n      uint8_t                                                        OrderHint           = {};\n      uint8_t                                                        primary_ref_frame   = {};\n      uint8_t                                                        refresh_frame_flags = {};\n      uint8_t                                                        reserved1           = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1InterpolationFilter interpolation_filter =\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1InterpolationFilter::eEighttap;\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1TxMode TxMode       = VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1TxMode::eOnly4X4;\n      uint8_t                                                     delta_q_res  = {};\n      uint8_t                                                     delta_lf_res = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_AV1_SKIP_MODE_FRAMES> SkipModeFrame    = {};\n      uint8_t                                                                       coded_denom      = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, 3>                              reserved2        = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_AV1_NUM_REF_FRAMES>   OrderHints       = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, STD_VIDEO_AV1_NUM_REF_FRAMES>  expectedFrameId  = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1TileInfo *         pTileInfo        = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1Quantization *     pQuantization    = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1Segmentation *     pSegmentation    = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1LoopFilter *       pLoopFilter      = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1CDEF *             pCDEF            = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1LoopRestoration *  pLoopRestoration = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1GlobalMotion *     pGlobalMotion    = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1FilmGrain *        pFilmGrain       = {};\n    };\n\n    struct DecodeAV1ReferenceInfoFlags\n    {\n      using NativeType = StdVideoDecodeAV1ReferenceInfoFlags;\n\n      operator StdVideoDecodeAV1ReferenceInfoFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoDecodeAV1ReferenceInfoFlags *>( this );\n      }\n\n      operator StdVideoDecodeAV1ReferenceInfoFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoDecodeAV1ReferenceInfoFlags *>( this );\n      }\n\n      bool operator==( DecodeAV1ReferenceInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( disable_frame_end_update_cdf == rhs.disable_frame_end_update_cdf ) && ( segmentation_enabled == rhs.segmentation_enabled ) &&\n               ( reserved == rhs.reserved );\n      }\n\n      bool operator!=( DecodeAV1ReferenceInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t disable_frame_end_update_cdf : 1;\n      uint32_t segmentation_enabled         : 1;\n      uint32_t reserved                     : 30;\n    };\n\n    struct DecodeAV1ReferenceInfo\n    {\n      using NativeType = StdVideoDecodeAV1ReferenceInfo;\n\n      operator StdVideoDecodeAV1ReferenceInfo const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoDecodeAV1ReferenceInfo *>( this );\n      }\n\n      operator StdVideoDecodeAV1ReferenceInfo &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoDecodeAV1ReferenceInfo *>( this );\n      }\n\n      bool operator==( DecodeAV1ReferenceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( frame_type == rhs.frame_type ) && ( RefFrameSignBias == rhs.RefFrameSignBias ) && ( OrderHint == rhs.OrderHint ) &&\n               ( SavedOrderHints == rhs.SavedOrderHints );\n      }\n\n      bool operator!=( DecodeAV1ReferenceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::DecodeAV1ReferenceInfoFlags flags            = {};\n      uint8_t                                                                       frame_type       = {};\n      uint8_t                                                                       RefFrameSignBias = {};\n      uint8_t                                                                       OrderHint        = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_AV1_NUM_REF_FRAMES>   SavedOrderHints  = {};\n    };\n\n    //=== vulkan_video_codec_av1std_encode ===\n\n    struct EncodeAV1DecoderModelInfo\n    {\n      using NativeType = StdVideoEncodeAV1DecoderModelInfo;\n\n      operator StdVideoEncodeAV1DecoderModelInfo const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeAV1DecoderModelInfo *>( this );\n      }\n\n      operator StdVideoEncodeAV1DecoderModelInfo &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeAV1DecoderModelInfo *>( this );\n      }\n\n      bool operator==( EncodeAV1DecoderModelInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( buffer_delay_length_minus_1 == rhs.buffer_delay_length_minus_1 ) &&\n               ( buffer_removal_time_length_minus_1 == rhs.buffer_removal_time_length_minus_1 ) &&\n               ( frame_presentation_time_length_minus_1 == rhs.frame_presentation_time_length_minus_1 ) && ( reserved1 == rhs.reserved1 ) &&\n               ( num_units_in_decoding_tick == rhs.num_units_in_decoding_tick );\n      }\n\n      bool operator!=( EncodeAV1DecoderModelInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint8_t  buffer_delay_length_minus_1            = {};\n      uint8_t  buffer_removal_time_length_minus_1     = {};\n      uint8_t  frame_presentation_time_length_minus_1 = {};\n      uint8_t  reserved1                              = {};\n      uint32_t num_units_in_decoding_tick             = {};\n    };\n\n    struct EncodeAV1ExtensionHeader\n    {\n      using NativeType = StdVideoEncodeAV1ExtensionHeader;\n\n      operator StdVideoEncodeAV1ExtensionHeader const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeAV1ExtensionHeader *>( this );\n      }\n\n      operator StdVideoEncodeAV1ExtensionHeader &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeAV1ExtensionHeader *>( this );\n      }\n\n      bool operator==( EncodeAV1ExtensionHeader const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( temporal_id == rhs.temporal_id ) && ( spatial_id == rhs.spatial_id );\n      }\n\n      bool operator!=( EncodeAV1ExtensionHeader const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint8_t temporal_id = {};\n      uint8_t spatial_id  = {};\n    };\n\n    struct EncodeAV1OperatingPointInfoFlags\n    {\n      using NativeType = StdVideoEncodeAV1OperatingPointInfoFlags;\n\n      operator StdVideoEncodeAV1OperatingPointInfoFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeAV1OperatingPointInfoFlags *>( this );\n      }\n\n      operator StdVideoEncodeAV1OperatingPointInfoFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeAV1OperatingPointInfoFlags *>( this );\n      }\n\n      bool operator==( EncodeAV1OperatingPointInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( decoder_model_present_for_this_op == rhs.decoder_model_present_for_this_op ) && ( low_delay_mode_flag == rhs.low_delay_mode_flag ) &&\n               ( initial_display_delay_present_for_this_op == rhs.initial_display_delay_present_for_this_op ) && ( reserved == rhs.reserved );\n      }\n\n      bool operator!=( EncodeAV1OperatingPointInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t decoder_model_present_for_this_op         : 1;\n      uint32_t low_delay_mode_flag                       : 1;\n      uint32_t initial_display_delay_present_for_this_op : 1;\n      uint32_t reserved                                  : 29;\n    };\n\n    struct EncodeAV1OperatingPointInfo\n    {\n      using NativeType = StdVideoEncodeAV1OperatingPointInfo;\n\n      operator StdVideoEncodeAV1OperatingPointInfo const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeAV1OperatingPointInfo *>( this );\n      }\n\n      operator StdVideoEncodeAV1OperatingPointInfo &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeAV1OperatingPointInfo *>( this );\n      }\n\n      bool operator==( EncodeAV1OperatingPointInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( operating_point_idc == rhs.operating_point_idc ) && ( seq_level_idx == rhs.seq_level_idx ) &&\n               ( seq_tier == rhs.seq_tier ) && ( decoder_buffer_delay == rhs.decoder_buffer_delay ) && ( encoder_buffer_delay == rhs.encoder_buffer_delay ) &&\n               ( initial_display_delay_minus_1 == rhs.initial_display_delay_minus_1 );\n      }\n\n      bool operator!=( EncodeAV1OperatingPointInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeAV1OperatingPointInfoFlags flags                         = {};\n      uint16_t                                                                           operating_point_idc           = {};\n      uint8_t                                                                            seq_level_idx                 = {};\n      uint8_t                                                                            seq_tier                      = {};\n      uint32_t                                                                           decoder_buffer_delay          = {};\n      uint32_t                                                                           encoder_buffer_delay          = {};\n      uint8_t                                                                            initial_display_delay_minus_1 = {};\n    };\n\n    struct EncodeAV1PictureInfoFlags\n    {\n      using NativeType = StdVideoEncodeAV1PictureInfoFlags;\n\n      operator StdVideoEncodeAV1PictureInfoFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeAV1PictureInfoFlags *>( this );\n      }\n\n      operator StdVideoEncodeAV1PictureInfoFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeAV1PictureInfoFlags *>( this );\n      }\n\n      bool operator==( EncodeAV1PictureInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( error_resilient_mode == rhs.error_resilient_mode ) && ( disable_cdf_update == rhs.disable_cdf_update ) &&\n               ( use_superres == rhs.use_superres ) && ( render_and_frame_size_different == rhs.render_and_frame_size_different ) &&\n               ( allow_screen_content_tools == rhs.allow_screen_content_tools ) && ( is_filter_switchable == rhs.is_filter_switchable ) &&\n               ( force_integer_mv == rhs.force_integer_mv ) && ( frame_size_override_flag == rhs.frame_size_override_flag ) &&\n               ( buffer_removal_time_present_flag == rhs.buffer_removal_time_present_flag ) && ( allow_intrabc == rhs.allow_intrabc ) &&\n               ( frame_refs_short_signaling == rhs.frame_refs_short_signaling ) && ( allow_high_precision_mv == rhs.allow_high_precision_mv ) &&\n               ( is_motion_mode_switchable == rhs.is_motion_mode_switchable ) && ( use_ref_frame_mvs == rhs.use_ref_frame_mvs ) &&\n               ( disable_frame_end_update_cdf == rhs.disable_frame_end_update_cdf ) && ( allow_warped_motion == rhs.allow_warped_motion ) &&\n               ( reduced_tx_set == rhs.reduced_tx_set ) && ( skip_mode_present == rhs.skip_mode_present ) && ( delta_q_present == rhs.delta_q_present ) &&\n               ( delta_lf_present == rhs.delta_lf_present ) && ( delta_lf_multi == rhs.delta_lf_multi ) &&\n               ( segmentation_enabled == rhs.segmentation_enabled ) && ( segmentation_update_map == rhs.segmentation_update_map ) &&\n               ( segmentation_temporal_update == rhs.segmentation_temporal_update ) && ( segmentation_update_data == rhs.segmentation_update_data ) &&\n               ( UsesLr == rhs.UsesLr ) && ( usesChromaLr == rhs.usesChromaLr ) && ( show_frame == rhs.show_frame ) &&\n               ( showable_frame == rhs.showable_frame ) && ( reserved == rhs.reserved );\n      }\n\n      bool operator!=( EncodeAV1PictureInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t error_resilient_mode             : 1;\n      uint32_t disable_cdf_update               : 1;\n      uint32_t use_superres                     : 1;\n      uint32_t render_and_frame_size_different  : 1;\n      uint32_t allow_screen_content_tools       : 1;\n      uint32_t is_filter_switchable             : 1;\n      uint32_t force_integer_mv                 : 1;\n      uint32_t frame_size_override_flag         : 1;\n      uint32_t buffer_removal_time_present_flag : 1;\n      uint32_t allow_intrabc                    : 1;\n      uint32_t frame_refs_short_signaling       : 1;\n      uint32_t allow_high_precision_mv          : 1;\n      uint32_t is_motion_mode_switchable        : 1;\n      uint32_t use_ref_frame_mvs                : 1;\n      uint32_t disable_frame_end_update_cdf     : 1;\n      uint32_t allow_warped_motion              : 1;\n      uint32_t reduced_tx_set                   : 1;\n      uint32_t skip_mode_present                : 1;\n      uint32_t delta_q_present                  : 1;\n      uint32_t delta_lf_present                 : 1;\n      uint32_t delta_lf_multi                   : 1;\n      uint32_t segmentation_enabled             : 1;\n      uint32_t segmentation_update_map          : 1;\n      uint32_t segmentation_temporal_update     : 1;\n      uint32_t segmentation_update_data         : 1;\n      uint32_t UsesLr                           : 1;\n      uint32_t usesChromaLr                     : 1;\n      uint32_t show_frame                       : 1;\n      uint32_t showable_frame                   : 1;\n      uint32_t reserved                         : 3;\n    };\n\n    struct EncodeAV1PictureInfo\n    {\n      using NativeType = StdVideoEncodeAV1PictureInfo;\n\n      operator StdVideoEncodeAV1PictureInfo const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeAV1PictureInfo *>( this );\n      }\n\n      operator StdVideoEncodeAV1PictureInfo &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeAV1PictureInfo *>( this );\n      }\n\n      bool operator==( EncodeAV1PictureInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( frame_type == rhs.frame_type ) && ( frame_presentation_time == rhs.frame_presentation_time ) &&\n               ( current_frame_id == rhs.current_frame_id ) && ( order_hint == rhs.order_hint ) && ( primary_ref_frame == rhs.primary_ref_frame ) &&\n               ( refresh_frame_flags == rhs.refresh_frame_flags ) && ( coded_denom == rhs.coded_denom ) &&\n               ( render_width_minus_1 == rhs.render_width_minus_1 ) && ( render_height_minus_1 == rhs.render_height_minus_1 ) &&\n               ( interpolation_filter == rhs.interpolation_filter ) && ( TxMode == rhs.TxMode ) && ( delta_q_res == rhs.delta_q_res ) &&\n               ( delta_lf_res == rhs.delta_lf_res ) && ( ref_order_hint == rhs.ref_order_hint ) && ( ref_frame_idx == rhs.ref_frame_idx ) &&\n               ( reserved1 == rhs.reserved1 ) && ( delta_frame_id_minus_1 == rhs.delta_frame_id_minus_1 ) && ( pTileInfo == rhs.pTileInfo ) &&\n               ( pQuantization == rhs.pQuantization ) && ( pSegmentation == rhs.pSegmentation ) && ( pLoopFilter == rhs.pLoopFilter ) &&\n               ( pCDEF == rhs.pCDEF ) && ( pLoopRestoration == rhs.pLoopRestoration ) && ( pGlobalMotion == rhs.pGlobalMotion ) &&\n               ( pExtensionHeader == rhs.pExtensionHeader ) && ( pBufferRemovalTimes == rhs.pBufferRemovalTimes );\n      }\n\n      bool operator!=( EncodeAV1PictureInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeAV1PictureInfoFlags flags = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1FrameType frame_type         = VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1FrameType::eKey;\n      uint32_t                                                       frame_presentation_time = {};\n      uint32_t                                                       current_frame_id        = {};\n      uint8_t                                                        order_hint              = {};\n      uint8_t                                                        primary_ref_frame       = {};\n      uint8_t                                                        refresh_frame_flags     = {};\n      uint8_t                                                        coded_denom             = {};\n      uint16_t                                                       render_width_minus_1    = {};\n      uint16_t                                                       render_height_minus_1   = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1InterpolationFilter interpolation_filter =\n        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1InterpolationFilter::eEighttap;\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1TxMode TxMode       = VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1TxMode::eOnly4X4;\n      uint8_t                                                     delta_q_res  = {};\n      uint8_t                                                     delta_lf_res = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_AV1_NUM_REF_FRAMES>        ref_order_hint         = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_AV1_REFS_PER_FRAME>         ref_frame_idx          = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, 3>                                   reserved1              = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, STD_VIDEO_AV1_REFS_PER_FRAME>       delta_frame_id_minus_1 = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1TileInfo *              pTileInfo              = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1Quantization *          pQuantization          = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1Segmentation *          pSegmentation          = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1LoopFilter *            pLoopFilter            = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1CDEF *                  pCDEF                  = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1LoopRestoration *       pLoopRestoration       = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1GlobalMotion *          pGlobalMotion          = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeAV1ExtensionHeader * pExtensionHeader       = {};\n      const uint32_t *                                                                   pBufferRemovalTimes    = {};\n    };\n\n    struct EncodeAV1ReferenceInfoFlags\n    {\n      using NativeType = StdVideoEncodeAV1ReferenceInfoFlags;\n\n      operator StdVideoEncodeAV1ReferenceInfoFlags const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeAV1ReferenceInfoFlags *>( this );\n      }\n\n      operator StdVideoEncodeAV1ReferenceInfoFlags &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeAV1ReferenceInfoFlags *>( this );\n      }\n\n      bool operator==( EncodeAV1ReferenceInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( disable_frame_end_update_cdf == rhs.disable_frame_end_update_cdf ) && ( segmentation_enabled == rhs.segmentation_enabled ) &&\n               ( reserved == rhs.reserved );\n      }\n\n      bool operator!=( EncodeAV1ReferenceInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      uint32_t disable_frame_end_update_cdf : 1;\n      uint32_t segmentation_enabled         : 1;\n      uint32_t reserved                     : 30;\n    };\n\n    struct EncodeAV1ReferenceInfo\n    {\n      using NativeType = StdVideoEncodeAV1ReferenceInfo;\n\n      operator StdVideoEncodeAV1ReferenceInfo const &() const VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<const StdVideoEncodeAV1ReferenceInfo *>( this );\n      }\n\n      operator StdVideoEncodeAV1ReferenceInfo &() VULKAN_HPP_NOEXCEPT\n      {\n        return *reinterpret_cast<StdVideoEncodeAV1ReferenceInfo *>( this );\n      }\n\n      bool operator==( EncodeAV1ReferenceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return ( flags == rhs.flags ) && ( RefFrameId == rhs.RefFrameId ) && ( frame_type == rhs.frame_type ) && ( OrderHint == rhs.OrderHint ) &&\n               ( reserved1 == rhs.reserved1 ) && ( pExtensionHeader == rhs.pExtensionHeader );\n      }\n\n      bool operator!=( EncodeAV1ReferenceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT\n      {\n        return !operator==( rhs );\n      }\n\n    public:\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeAV1ReferenceInfoFlags flags      = {};\n      uint32_t                                                                      RefFrameId = {};\n      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1FrameType frame_type = VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::AV1FrameType::eKey;\n      uint8_t                                                        OrderHint  = {};\n      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, 3>               reserved1  = {};\n      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeAV1ExtensionHeader * pExtensionHeader = {};\n    };\n\n  }  // namespace VULKAN_HPP_VIDEO_NAMESPACE\n}  // namespace VULKAN_HPP_NAMESPACE\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_wayland.h",
    "content": "#ifndef VULKAN_WAYLAND_H_\n#define VULKAN_WAYLAND_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// VK_KHR_wayland_surface is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_wayland_surface 1\n#define VK_KHR_WAYLAND_SURFACE_SPEC_VERSION 6\n#define VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME \"VK_KHR_wayland_surface\"\ntypedef VkFlags VkWaylandSurfaceCreateFlagsKHR;\ntypedef struct VkWaylandSurfaceCreateInfoKHR {\n    VkStructureType                   sType;\n    const void*                       pNext;\n    VkWaylandSurfaceCreateFlagsKHR    flags;\n    struct wl_display*                display;\n    struct wl_surface*                surface;\n} VkWaylandSurfaceCreateInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateWaylandSurfaceKHR)(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);\ntypedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, struct wl_display* display);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateWaylandSurfaceKHR(\n    VkInstance                                  instance,\n    const VkWaylandSurfaceCreateInfoKHR*        pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSurfaceKHR*                               pSurface);\n\nVKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWaylandPresentationSupportKHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t                                    queueFamilyIndex,\n    struct wl_display*                          display);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_win32.h",
    "content": "#ifndef VULKAN_WIN32_H_\n#define VULKAN_WIN32_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// VK_KHR_win32_surface is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_win32_surface 1\n#define VK_KHR_WIN32_SURFACE_SPEC_VERSION 6\n#define VK_KHR_WIN32_SURFACE_EXTENSION_NAME \"VK_KHR_win32_surface\"\ntypedef VkFlags VkWin32SurfaceCreateFlagsKHR;\ntypedef struct VkWin32SurfaceCreateInfoKHR {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    VkWin32SurfaceCreateFlagsKHR    flags;\n    HINSTANCE                       hinstance;\n    HWND                            hwnd;\n} VkWin32SurfaceCreateInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateWin32SurfaceKHR)(VkInstance instance, const VkWin32SurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);\ntypedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateWin32SurfaceKHR(\n    VkInstance                                  instance,\n    const VkWin32SurfaceCreateInfoKHR*          pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSurfaceKHR*                               pSurface);\n\nVKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWin32PresentationSupportKHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t                                    queueFamilyIndex);\n#endif\n\n\n// VK_KHR_external_memory_win32 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_external_memory_win32 1\n#define VK_KHR_EXTERNAL_MEMORY_WIN32_SPEC_VERSION 1\n#define VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME \"VK_KHR_external_memory_win32\"\ntypedef struct VkImportMemoryWin32HandleInfoKHR {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkExternalMemoryHandleTypeFlagBits    handleType;\n    HANDLE                                handle;\n    LPCWSTR                               name;\n} VkImportMemoryWin32HandleInfoKHR;\n\ntypedef struct VkExportMemoryWin32HandleInfoKHR {\n    VkStructureType               sType;\n    const void*                   pNext;\n    const SECURITY_ATTRIBUTES*    pAttributes;\n    DWORD                         dwAccess;\n    LPCWSTR                       name;\n} VkExportMemoryWin32HandleInfoKHR;\n\ntypedef struct VkMemoryWin32HandlePropertiesKHR {\n    VkStructureType    sType;\n    void*              pNext;\n    uint32_t           memoryTypeBits;\n} VkMemoryWin32HandlePropertiesKHR;\n\ntypedef struct VkMemoryGetWin32HandleInfoKHR {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkDeviceMemory                        memory;\n    VkExternalMemoryHandleTypeFlagBits    handleType;\n} VkMemoryGetWin32HandleInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetMemoryWin32HandleKHR)(VkDevice device, const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetMemoryWin32HandlePropertiesKHR)(VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, HANDLE handle, VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryWin32HandleKHR(\n    VkDevice                                    device,\n    const VkMemoryGetWin32HandleInfoKHR*        pGetWin32HandleInfo,\n    HANDLE*                                     pHandle);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryWin32HandlePropertiesKHR(\n    VkDevice                                    device,\n    VkExternalMemoryHandleTypeFlagBits          handleType,\n    HANDLE                                      handle,\n    VkMemoryWin32HandlePropertiesKHR*           pMemoryWin32HandleProperties);\n#endif\n\n\n// VK_KHR_win32_keyed_mutex is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_win32_keyed_mutex 1\n#define VK_KHR_WIN32_KEYED_MUTEX_SPEC_VERSION 1\n#define VK_KHR_WIN32_KEYED_MUTEX_EXTENSION_NAME \"VK_KHR_win32_keyed_mutex\"\ntypedef struct VkWin32KeyedMutexAcquireReleaseInfoKHR {\n    VkStructureType          sType;\n    const void*              pNext;\n    uint32_t                 acquireCount;\n    const VkDeviceMemory*    pAcquireSyncs;\n    const uint64_t*          pAcquireKeys;\n    const uint32_t*          pAcquireTimeouts;\n    uint32_t                 releaseCount;\n    const VkDeviceMemory*    pReleaseSyncs;\n    const uint64_t*          pReleaseKeys;\n} VkWin32KeyedMutexAcquireReleaseInfoKHR;\n\n\n\n// VK_KHR_external_semaphore_win32 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_external_semaphore_win32 1\n#define VK_KHR_EXTERNAL_SEMAPHORE_WIN32_SPEC_VERSION 1\n#define VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME \"VK_KHR_external_semaphore_win32\"\ntypedef struct VkImportSemaphoreWin32HandleInfoKHR {\n    VkStructureType                          sType;\n    const void*                              pNext;\n    VkSemaphore                              semaphore;\n    VkSemaphoreImportFlags                   flags;\n    VkExternalSemaphoreHandleTypeFlagBits    handleType;\n    HANDLE                                   handle;\n    LPCWSTR                                  name;\n} VkImportSemaphoreWin32HandleInfoKHR;\n\ntypedef struct VkExportSemaphoreWin32HandleInfoKHR {\n    VkStructureType               sType;\n    const void*                   pNext;\n    const SECURITY_ATTRIBUTES*    pAttributes;\n    DWORD                         dwAccess;\n    LPCWSTR                       name;\n} VkExportSemaphoreWin32HandleInfoKHR;\n\ntypedef struct VkD3D12FenceSubmitInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           waitSemaphoreValuesCount;\n    const uint64_t*    pWaitSemaphoreValues;\n    uint32_t           signalSemaphoreValuesCount;\n    const uint64_t*    pSignalSemaphoreValues;\n} VkD3D12FenceSubmitInfoKHR;\n\ntypedef struct VkSemaphoreGetWin32HandleInfoKHR {\n    VkStructureType                          sType;\n    const void*                              pNext;\n    VkSemaphore                              semaphore;\n    VkExternalSemaphoreHandleTypeFlagBits    handleType;\n} VkSemaphoreGetWin32HandleInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkImportSemaphoreWin32HandleKHR)(VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetSemaphoreWin32HandleKHR)(VkDevice device, const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkImportSemaphoreWin32HandleKHR(\n    VkDevice                                    device,\n    const VkImportSemaphoreWin32HandleInfoKHR*  pImportSemaphoreWin32HandleInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreWin32HandleKHR(\n    VkDevice                                    device,\n    const VkSemaphoreGetWin32HandleInfoKHR*     pGetWin32HandleInfo,\n    HANDLE*                                     pHandle);\n#endif\n\n\n// VK_KHR_external_fence_win32 is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_external_fence_win32 1\n#define VK_KHR_EXTERNAL_FENCE_WIN32_SPEC_VERSION 1\n#define VK_KHR_EXTERNAL_FENCE_WIN32_EXTENSION_NAME \"VK_KHR_external_fence_win32\"\ntypedef struct VkImportFenceWin32HandleInfoKHR {\n    VkStructureType                      sType;\n    const void*                          pNext;\n    VkFence                              fence;\n    VkFenceImportFlags                   flags;\n    VkExternalFenceHandleTypeFlagBits    handleType;\n    HANDLE                               handle;\n    LPCWSTR                              name;\n} VkImportFenceWin32HandleInfoKHR;\n\ntypedef struct VkExportFenceWin32HandleInfoKHR {\n    VkStructureType               sType;\n    const void*                   pNext;\n    const SECURITY_ATTRIBUTES*    pAttributes;\n    DWORD                         dwAccess;\n    LPCWSTR                       name;\n} VkExportFenceWin32HandleInfoKHR;\n\ntypedef struct VkFenceGetWin32HandleInfoKHR {\n    VkStructureType                      sType;\n    const void*                          pNext;\n    VkFence                              fence;\n    VkExternalFenceHandleTypeFlagBits    handleType;\n} VkFenceGetWin32HandleInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkImportFenceWin32HandleKHR)(VkDevice device, const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetFenceWin32HandleKHR)(VkDevice device, const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkImportFenceWin32HandleKHR(\n    VkDevice                                    device,\n    const VkImportFenceWin32HandleInfoKHR*      pImportFenceWin32HandleInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetFenceWin32HandleKHR(\n    VkDevice                                    device,\n    const VkFenceGetWin32HandleInfoKHR*         pGetWin32HandleInfo,\n    HANDLE*                                     pHandle);\n#endif\n\n\n// VK_NV_external_memory_win32 is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_external_memory_win32 1\n#define VK_NV_EXTERNAL_MEMORY_WIN32_SPEC_VERSION 1\n#define VK_NV_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME \"VK_NV_external_memory_win32\"\ntypedef struct VkImportMemoryWin32HandleInfoNV {\n    VkStructureType                      sType;\n    const void*                          pNext;\n    VkExternalMemoryHandleTypeFlagsNV    handleType;\n    HANDLE                               handle;\n} VkImportMemoryWin32HandleInfoNV;\n\ntypedef struct VkExportMemoryWin32HandleInfoNV {\n    VkStructureType               sType;\n    const void*                   pNext;\n    const SECURITY_ATTRIBUTES*    pAttributes;\n    DWORD                         dwAccess;\n} VkExportMemoryWin32HandleInfoNV;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetMemoryWin32HandleNV)(VkDevice device, VkDeviceMemory memory, VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE* pHandle);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryWin32HandleNV(\n    VkDevice                                    device,\n    VkDeviceMemory                              memory,\n    VkExternalMemoryHandleTypeFlagsNV           handleType,\n    HANDLE*                                     pHandle);\n#endif\n\n\n// VK_NV_win32_keyed_mutex is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_win32_keyed_mutex 1\n#define VK_NV_WIN32_KEYED_MUTEX_SPEC_VERSION 2\n#define VK_NV_WIN32_KEYED_MUTEX_EXTENSION_NAME \"VK_NV_win32_keyed_mutex\"\ntypedef struct VkWin32KeyedMutexAcquireReleaseInfoNV {\n    VkStructureType          sType;\n    const void*              pNext;\n    uint32_t                 acquireCount;\n    const VkDeviceMemory*    pAcquireSyncs;\n    const uint64_t*          pAcquireKeys;\n    const uint32_t*          pAcquireTimeoutMilliseconds;\n    uint32_t                 releaseCount;\n    const VkDeviceMemory*    pReleaseSyncs;\n    const uint64_t*          pReleaseKeys;\n} VkWin32KeyedMutexAcquireReleaseInfoNV;\n\n\n\n// VK_EXT_full_screen_exclusive is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_full_screen_exclusive 1\n#define VK_EXT_FULL_SCREEN_EXCLUSIVE_SPEC_VERSION 4\n#define VK_EXT_FULL_SCREEN_EXCLUSIVE_EXTENSION_NAME \"VK_EXT_full_screen_exclusive\"\n\ntypedef enum VkFullScreenExclusiveEXT {\n    VK_FULL_SCREEN_EXCLUSIVE_DEFAULT_EXT = 0,\n    VK_FULL_SCREEN_EXCLUSIVE_ALLOWED_EXT = 1,\n    VK_FULL_SCREEN_EXCLUSIVE_DISALLOWED_EXT = 2,\n    VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT = 3,\n    VK_FULL_SCREEN_EXCLUSIVE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkFullScreenExclusiveEXT;\ntypedef struct VkSurfaceFullScreenExclusiveInfoEXT {\n    VkStructureType             sType;\n    void*                       pNext;\n    VkFullScreenExclusiveEXT    fullScreenExclusive;\n} VkSurfaceFullScreenExclusiveInfoEXT;\n\ntypedef struct VkSurfaceCapabilitiesFullScreenExclusiveEXT {\n    VkStructureType    sType;\n    void*              pNext;\n    VkBool32           fullScreenExclusiveSupported;\n} VkSurfaceCapabilitiesFullScreenExclusiveEXT;\n\ntypedef struct VkSurfaceFullScreenExclusiveWin32InfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    HMONITOR           hmonitor;\n} VkSurfaceFullScreenExclusiveWin32InfoEXT;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, uint32_t* pPresentModeCount, VkPresentModeKHR* pPresentModes);\ntypedef VkResult (VKAPI_PTR *PFN_vkAcquireFullScreenExclusiveModeEXT)(VkDevice device, VkSwapchainKHR swapchain);\ntypedef VkResult (VKAPI_PTR *PFN_vkReleaseFullScreenExclusiveModeEXT)(VkDevice device, VkSwapchainKHR swapchain);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetDeviceGroupSurfacePresentModes2EXT)(VkDevice device, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, VkDeviceGroupPresentModeFlagsKHR* pModes);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfacePresentModes2EXT(\n    VkPhysicalDevice                            physicalDevice,\n    const VkPhysicalDeviceSurfaceInfo2KHR*      pSurfaceInfo,\n    uint32_t*                                   pPresentModeCount,\n    VkPresentModeKHR*                           pPresentModes);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkAcquireFullScreenExclusiveModeEXT(\n    VkDevice                                    device,\n    VkSwapchainKHR                              swapchain);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkReleaseFullScreenExclusiveModeEXT(\n    VkDevice                                    device,\n    VkSwapchainKHR                              swapchain);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceGroupSurfacePresentModes2EXT(\n    VkDevice                                    device,\n    const VkPhysicalDeviceSurfaceInfo2KHR*      pSurfaceInfo,\n    VkDeviceGroupPresentModeFlagsKHR*           pModes);\n#endif\n\n\n// VK_NV_acquire_winrt_display is a preprocessor guard. Do not pass it to API calls.\n#define VK_NV_acquire_winrt_display 1\n#define VK_NV_ACQUIRE_WINRT_DISPLAY_SPEC_VERSION 1\n#define VK_NV_ACQUIRE_WINRT_DISPLAY_EXTENSION_NAME \"VK_NV_acquire_winrt_display\"\ntypedef VkResult (VKAPI_PTR *PFN_vkAcquireWinrtDisplayNV)(VkPhysicalDevice physicalDevice, VkDisplayKHR display);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetWinrtDisplayNV)(VkPhysicalDevice physicalDevice, uint32_t deviceRelativeId, VkDisplayKHR* pDisplay);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkAcquireWinrtDisplayNV(\n    VkPhysicalDevice                            physicalDevice,\n    VkDisplayKHR                                display);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetWinrtDisplayNV(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t                                    deviceRelativeId,\n    VkDisplayKHR*                               pDisplay);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_xcb.h",
    "content": "#ifndef VULKAN_XCB_H_\n#define VULKAN_XCB_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// VK_KHR_xcb_surface is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_xcb_surface 1\n#define VK_KHR_XCB_SURFACE_SPEC_VERSION   6\n#define VK_KHR_XCB_SURFACE_EXTENSION_NAME \"VK_KHR_xcb_surface\"\ntypedef VkFlags VkXcbSurfaceCreateFlagsKHR;\ntypedef struct VkXcbSurfaceCreateInfoKHR {\n    VkStructureType               sType;\n    const void*                   pNext;\n    VkXcbSurfaceCreateFlagsKHR    flags;\n    xcb_connection_t*             connection;\n    xcb_window_t                  window;\n} VkXcbSurfaceCreateInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateXcbSurfaceKHR)(VkInstance instance, const VkXcbSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);\ntypedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, xcb_connection_t* connection, xcb_visualid_t visual_id);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateXcbSurfaceKHR(\n    VkInstance                                  instance,\n    const VkXcbSurfaceCreateInfoKHR*            pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSurfaceKHR*                               pSurface);\n\nVKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXcbPresentationSupportKHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t                                    queueFamilyIndex,\n    xcb_connection_t*                           connection,\n    xcb_visualid_t                              visual_id);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_xlib.h",
    "content": "#ifndef VULKAN_XLIB_H_\n#define VULKAN_XLIB_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// VK_KHR_xlib_surface is a preprocessor guard. Do not pass it to API calls.\n#define VK_KHR_xlib_surface 1\n#define VK_KHR_XLIB_SURFACE_SPEC_VERSION  6\n#define VK_KHR_XLIB_SURFACE_EXTENSION_NAME \"VK_KHR_xlib_surface\"\ntypedef VkFlags VkXlibSurfaceCreateFlagsKHR;\ntypedef struct VkXlibSurfaceCreateInfoKHR {\n    VkStructureType                sType;\n    const void*                    pNext;\n    VkXlibSurfaceCreateFlagsKHR    flags;\n    Display*                       dpy;\n    Window                         window;\n} VkXlibSurfaceCreateInfoKHR;\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateXlibSurfaceKHR)(VkInstance instance, const VkXlibSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);\ntypedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, Display* dpy, VisualID visualID);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateXlibSurfaceKHR(\n    VkInstance                                  instance,\n    const VkXlibSurfaceCreateInfoKHR*           pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSurfaceKHR*                               pSurface);\n\nVKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXlibPresentationSupportKHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t                                    queueFamilyIndex,\n    Display*                                    dpy,\n    VisualID                                    visualID);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/vulkanheaders/vulkan_xlib_xrandr.h",
    "content": "#ifndef VULKAN_XLIB_XRANDR_H_\n#define VULKAN_XLIB_XRANDR_H_ 1\n\n/*\n** Copyright 2015-2025 The Khronos Group Inc.\n**\n** SPDX-License-Identifier: Apache-2.0\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n// VK_EXT_acquire_xlib_display is a preprocessor guard. Do not pass it to API calls.\n#define VK_EXT_acquire_xlib_display 1\n#define VK_EXT_ACQUIRE_XLIB_DISPLAY_SPEC_VERSION 1\n#define VK_EXT_ACQUIRE_XLIB_DISPLAY_EXTENSION_NAME \"VK_EXT_acquire_xlib_display\"\ntypedef VkResult (VKAPI_PTR *PFN_vkAcquireXlibDisplayEXT)(VkPhysicalDevice physicalDevice, Display* dpy, VkDisplayKHR display);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetRandROutputDisplayEXT)(VkPhysicalDevice physicalDevice, Display* dpy, RROutput rrOutput, VkDisplayKHR* pDisplay);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkAcquireXlibDisplayEXT(\n    VkPhysicalDevice                            physicalDevice,\n    Display*                                    dpy,\n    VkDisplayKHR                                display);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetRandROutputDisplayEXT(\n    VkPhysicalDevice                            physicalDevice,\n    Display*                                    dpy,\n    RROutput                                    rrOutput,\n    VkDisplayKHR*                               pDisplay);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/libraries/xxHash/xxhash.c",
    "content": "/*\n*  xxHash - Fast Hash algorithm\n*  Copyright (C) 2012-2016, Yann Collet\n*\n*  BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)\n*\n*  Redistribution and use in source and binary forms, with or without\n*  modification, are permitted provided that the following conditions are\n*  met:\n*\n*  * Redistributions of source code must retain the above copyright\n*  notice, this list of conditions and the following disclaimer.\n*  * Redistributions in binary form must reproduce the above\n*  copyright notice, this list of conditions and the following disclaimer\n*  in the documentation and/or other materials provided with the\n*  distribution.\n*\n*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n*  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n*  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n*  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n*  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n*  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n*  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n*  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n*  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n*  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n*  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*\n*  You can contact the author at :\n*  - xxHash homepage: http://www.xxhash.com\n*  - xxHash source repository : https://github.com/Cyan4973/xxHash\n*/\n\n\n/* *************************************\n*  Tuning parameters\n***************************************/\n/*!XXH_FORCE_MEMORY_ACCESS :\n * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable.\n * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal.\n * The below switch allow to select different access method for improved performance.\n * Method 0 (default) : use `memcpy()`. Safe and portable.\n * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable).\n *            This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`.\n * Method 2 : direct access. This method doesn't depend on compiler but violate C standard.\n *            It can generate buggy code on targets which do not support unaligned memory accesses.\n *            But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6)\n * See http://stackoverflow.com/a/32095106/646947 for details.\n * Prefer these methods in priority order (0 > 1 > 2)\n */\n#ifndef XXH_FORCE_MEMORY_ACCESS   /* can be defined externally, on command line for example */\n#  if defined(__GNUC__) && ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) )\n#    define XXH_FORCE_MEMORY_ACCESS 2\n#  elif defined(__INTEL_COMPILER) || \\\n  (defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) ))\n#    define XXH_FORCE_MEMORY_ACCESS 1\n#  endif\n#endif\n\n/*!XXH_ACCEPT_NULL_INPUT_POINTER :\n * If the input pointer is a null pointer, xxHash default behavior is to trigger a memory access error, since it is a bad pointer.\n * When this option is enabled, xxHash output for null input pointers will be the same as a null-length input.\n * By default, this option is disabled. To enable it, uncomment below define :\n */\n/* #define XXH_ACCEPT_NULL_INPUT_POINTER 1 */\n\n/*!XXH_FORCE_NATIVE_FORMAT :\n * By default, xxHash library provides endian-independent Hash values, based on little-endian convention.\n * Results are therefore identical for little-endian and big-endian CPU.\n * This comes at a performance cost for big-endian CPU, since some swapping is required to emulate little-endian format.\n * Should endian-independence be of no importance for your application, you may set the #define below to 1,\n * to improve speed for Big-endian CPU.\n * This option has no impact on Little_Endian CPU.\n */\n#ifndef XXH_FORCE_NATIVE_FORMAT   /* can be defined externally */\n#  define XXH_FORCE_NATIVE_FORMAT 0\n#endif\n\n/*!XXH_FORCE_ALIGN_CHECK :\n * This is a minor performance trick, only useful with lots of very small keys.\n * It means : check for aligned/unaligned input.\n * The check costs one initial branch per hash; set to 0 when the input data\n * is guaranteed to be aligned.\n */\n#ifndef XXH_FORCE_ALIGN_CHECK /* can be defined externally */\n#  if defined(__i386) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64)\n#    define XXH_FORCE_ALIGN_CHECK 0\n#  else\n#    define XXH_FORCE_ALIGN_CHECK 1\n#  endif\n#endif\n\n\n/* *************************************\n*  Includes & Memory related functions\n***************************************/\n/*! Modify the local functions below should you wish to use some other memory routines\n*   for malloc(), free() */\n#include <stdlib.h>\nstatic void* XXH_malloc(size_t s) { return malloc(s); }\nstatic void  XXH_free  (void* p)  { free(p); }\n/*! and for memcpy() */\n#include <string.h>\nstatic void* XXH_memcpy(void* dest, const void* src, size_t size) { return memcpy(dest,src,size); }\n\n#define XXH_STATIC_LINKING_ONLY\n#include \"xxhash.h\"\n\n\n/* *************************************\n*  Compiler Specific Options\n***************************************/\n#ifdef _MSC_VER    /* Visual Studio */\n#  pragma warning(disable : 4127)      /* disable: C4127: conditional expression is constant */\n#  define FORCE_INLINE static __forceinline\n#else\n#  if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L   /* C99 */\n#    ifdef __GNUC__\n#      define FORCE_INLINE static inline __attribute__((always_inline))\n#    else\n#      define FORCE_INLINE static inline\n#    endif\n#  else\n#    define FORCE_INLINE static\n#  endif /* __STDC_VERSION__ */\n#endif\n\n\n/* *************************************\n*  Basic Types\n***************************************/\n#ifndef MEM_MODULE\n# if !defined (__VMS) && (defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )\n#   include <stdint.h>\n    typedef uint8_t  BYTE;\n    typedef uint16_t U16;\n    typedef uint32_t U32;\n    typedef  int32_t S32;\n# else\n    typedef unsigned char      BYTE;\n    typedef unsigned short     U16;\n    typedef unsigned int       U32;\n    typedef   signed int       S32;\n# endif\n#endif\n\n#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2))\n\n/* Force direct memory access. Only works on CPU which support unaligned memory access in hardware */\nstatic U32 XXH_read32(const void* memPtr) { return *(const U32*) memPtr; }\n\n#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1))\n\n/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */\n/* currently only defined for gcc and icc */\ntypedef union { U32 u32; } __attribute__((packed)) unalign;\nstatic U32 XXH_read32(const void* ptr) { return ((const unalign*)ptr)->u32; }\n\n#else\n\n/* portable and safe solution. Generally efficient.\n * see : http://stackoverflow.com/a/32095106/646947\n */\nstatic U32 XXH_read32(const void* memPtr)\n{\n    U32 val;\n    memcpy(&val, memPtr, sizeof(val));\n    return val;\n}\n\n#endif   /* XXH_FORCE_DIRECT_MEMORY_ACCESS */\n\n\n/* ****************************************\n*  Compiler-specific Functions and Macros\n******************************************/\n#define XXH_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)\n\n/* Note : although _rotl exists for minGW (GCC under windows), performance seems poor */\n#if defined(_MSC_VER)\n#  define XXH_rotl32(x,r) _rotl(x,r)\n#  define XXH_rotl64(x,r) _rotl64(x,r)\n#else\n#  define XXH_rotl32(x,r) ((x << r) | (x >> (32 - r)))\n#  define XXH_rotl64(x,r) ((x << r) | (x >> (64 - r)))\n#endif\n\n#if defined(_MSC_VER)     /* Visual Studio */\n#  define XXH_swap32 _byteswap_ulong\n#elif XXH_GCC_VERSION >= 403\n#  define XXH_swap32 __builtin_bswap32\n#else\nstatic U32 XXH_swap32 (U32 x)\n{\n    return  ((x << 24) & 0xff000000 ) |\n            ((x <<  8) & 0x00ff0000 ) |\n            ((x >>  8) & 0x0000ff00 ) |\n            ((x >> 24) & 0x000000ff );\n}\n#endif\n\n\n/* *************************************\n*  Architecture Macros\n***************************************/\ntypedef enum { XXH_bigEndian=0, XXH_littleEndian=1 } XXH_endianess;\n\n/* XXH_CPU_LITTLE_ENDIAN can be defined externally, for example on the compiler command line */\n#ifndef XXH_CPU_LITTLE_ENDIAN\n    static const int g_one = 1;\n#   define XXH_CPU_LITTLE_ENDIAN   (*(const char*)(&g_one))\n#endif\n\n\n/* ***************************\n*  Memory reads\n*****************************/\ntypedef enum { XXH_aligned, XXH_unaligned } XXH_alignment;\n\nFORCE_INLINE U32 XXH_readLE32_align(const void* ptr, XXH_endianess endian, XXH_alignment align)\n{\n    if (align==XXH_unaligned)\n        return endian==XXH_littleEndian ? XXH_read32(ptr) : XXH_swap32(XXH_read32(ptr));\n    else\n        return endian==XXH_littleEndian ? *(const U32*)ptr : XXH_swap32(*(const U32*)ptr);\n}\n\nFORCE_INLINE U32 XXH_readLE32(const void* ptr, XXH_endianess endian)\n{\n    return XXH_readLE32_align(ptr, endian, XXH_unaligned);\n}\n\nstatic U32 XXH_readBE32(const void* ptr)\n{\n    return XXH_CPU_LITTLE_ENDIAN ? XXH_swap32(XXH_read32(ptr)) : XXH_read32(ptr);\n}\n\n\n/* *************************************\n*  Macros\n***************************************/\n#define XXH_STATIC_ASSERT(c)   { enum { XXH_static_assert = 1/(int)(!!(c)) }; }    /* use only *after* variable declarations */\nXXH_PUBLIC_API unsigned XXH_versionNumber (void) { return XXH_VERSION_NUMBER; }\n\n\n/* *******************************************************************\n*  32-bits hash functions\n*********************************************************************/\nstatic const U32 PRIME32_1 = 2654435761U;\nstatic const U32 PRIME32_2 = 2246822519U;\nstatic const U32 PRIME32_3 = 3266489917U;\nstatic const U32 PRIME32_4 =  668265263U;\nstatic const U32 PRIME32_5 =  374761393U;\n\nstatic U32 XXH32_round(U32 seed, U32 input)\n{\n    seed += input * PRIME32_2;\n    seed  = XXH_rotl32(seed, 13);\n    seed *= PRIME32_1;\n    return seed;\n}\n\nFORCE_INLINE U32 XXH32_endian_align(const void* input, size_t len, U32 seed, XXH_endianess endian, XXH_alignment align)\n{\n    const BYTE* p = (const BYTE*)input;\n    const BYTE* bEnd = p + len;\n    U32 h32;\n#define XXH_get32bits(p) XXH_readLE32_align(p, endian, align)\n\n#ifdef XXH_ACCEPT_NULL_INPUT_POINTER\n    if (p==NULL) {\n        len=0;\n        bEnd=p=(const BYTE*)(size_t)16;\n    }\n#endif\n\n    if (len>=16) {\n        const BYTE* const limit = bEnd - 16;\n        U32 v1 = seed + PRIME32_1 + PRIME32_2;\n        U32 v2 = seed + PRIME32_2;\n        U32 v3 = seed + 0;\n        U32 v4 = seed - PRIME32_1;\n\n        do {\n            v1 = XXH32_round(v1, XXH_get32bits(p)); p+=4;\n            v2 = XXH32_round(v2, XXH_get32bits(p)); p+=4;\n            v3 = XXH32_round(v3, XXH_get32bits(p)); p+=4;\n            v4 = XXH32_round(v4, XXH_get32bits(p)); p+=4;\n        } while (p<=limit);\n\n        h32 = XXH_rotl32(v1, 1) + XXH_rotl32(v2, 7) + XXH_rotl32(v3, 12) + XXH_rotl32(v4, 18);\n    } else {\n        h32  = seed + PRIME32_5;\n    }\n\n    h32 += (U32) len;\n\n    while (p+4<=bEnd) {\n        h32 += XXH_get32bits(p) * PRIME32_3;\n        h32  = XXH_rotl32(h32, 17) * PRIME32_4 ;\n        p+=4;\n    }\n\n    while (p<bEnd) {\n        h32 += (*p) * PRIME32_5;\n        h32 = XXH_rotl32(h32, 11) * PRIME32_1 ;\n        p++;\n    }\n\n    h32 ^= h32 >> 15;\n    h32 *= PRIME32_2;\n    h32 ^= h32 >> 13;\n    h32 *= PRIME32_3;\n    h32 ^= h32 >> 16;\n\n    return h32;\n}\n\n\nXXH_PUBLIC_API unsigned int XXH32 (const void* input, size_t len, unsigned int seed)\n{\n#if 0\n    /* Simple version, good for code maintenance, but unfortunately slow for small inputs */\n    XXH32_state_t state;\n    XXH32_reset(&state, seed);\n    XXH32_update(&state, input, len);\n    return XXH32_digest(&state);\n#else\n    XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;\n\n    if (XXH_FORCE_ALIGN_CHECK) {\n        if ((((size_t)input) & 3) == 0) {   /* Input is 4-bytes aligned, leverage the speed benefit */\n            if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)\n                return XXH32_endian_align(input, len, seed, XXH_littleEndian, XXH_aligned);\n            else\n                return XXH32_endian_align(input, len, seed, XXH_bigEndian, XXH_aligned);\n    }   }\n\n    if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)\n        return XXH32_endian_align(input, len, seed, XXH_littleEndian, XXH_unaligned);\n    else\n        return XXH32_endian_align(input, len, seed, XXH_bigEndian, XXH_unaligned);\n#endif\n}\n\n\n\n/*======   Hash streaming   ======*/\n\nXXH_PUBLIC_API XXH32_state_t* XXH32_createState(void)\n{\n    return (XXH32_state_t*)XXH_malloc(sizeof(XXH32_state_t));\n}\nXXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr)\n{\n    XXH_free(statePtr);\n    return XXH_OK;\n}\n\nXXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dstState, const XXH32_state_t* srcState)\n{\n    memcpy(dstState, srcState, sizeof(*dstState));\n}\n\nXXH_PUBLIC_API XXH_errorcode XXH32_reset(XXH32_state_t* statePtr, unsigned int seed)\n{\n    XXH32_state_t state;   /* using a local state to memcpy() in order to avoid strict-aliasing warnings */\n    memset(&state, 0, sizeof(state)-4);   /* do not write into reserved, for future removal */\n    state.v1 = seed + PRIME32_1 + PRIME32_2;\n    state.v2 = seed + PRIME32_2;\n    state.v3 = seed + 0;\n    state.v4 = seed - PRIME32_1;\n    memcpy(statePtr, &state, sizeof(state));\n    return XXH_OK;\n}\n\n\nFORCE_INLINE XXH_errorcode XXH32_update_endian (XXH32_state_t* state, const void* input, size_t len, XXH_endianess endian)\n{\n    const BYTE* p = (const BYTE*)input;\n    const BYTE* const bEnd = p + len;\n\n#ifdef XXH_ACCEPT_NULL_INPUT_POINTER\n    if (input==NULL) return XXH_ERROR;\n#endif\n\n    state->total_len_32 += (unsigned)len;\n    state->large_len |= (len>=16) | (state->total_len_32>=16);\n\n    if (state->memsize + len < 16)  {   /* fill in tmp buffer */\n        XXH_memcpy((BYTE*)(state->mem32) + state->memsize, input, len);\n        state->memsize += (unsigned)len;\n        return XXH_OK;\n    }\n\n    if (state->memsize) {   /* some data left from previous update */\n        XXH_memcpy((BYTE*)(state->mem32) + state->memsize, input, 16-state->memsize);\n        {   const U32* p32 = state->mem32;\n            state->v1 = XXH32_round(state->v1, XXH_readLE32(p32, endian)); p32++;\n            state->v2 = XXH32_round(state->v2, XXH_readLE32(p32, endian)); p32++;\n            state->v3 = XXH32_round(state->v3, XXH_readLE32(p32, endian)); p32++;\n            state->v4 = XXH32_round(state->v4, XXH_readLE32(p32, endian)); p32++;\n        }\n        p += 16-state->memsize;\n        state->memsize = 0;\n    }\n\n    if (p <= bEnd-16) {\n        const BYTE* const limit = bEnd - 16;\n        U32 v1 = state->v1;\n        U32 v2 = state->v2;\n        U32 v3 = state->v3;\n        U32 v4 = state->v4;\n\n        do {\n            v1 = XXH32_round(v1, XXH_readLE32(p, endian)); p+=4;\n            v2 = XXH32_round(v2, XXH_readLE32(p, endian)); p+=4;\n            v3 = XXH32_round(v3, XXH_readLE32(p, endian)); p+=4;\n            v4 = XXH32_round(v4, XXH_readLE32(p, endian)); p+=4;\n        } while (p<=limit);\n\n        state->v1 = v1;\n        state->v2 = v2;\n        state->v3 = v3;\n        state->v4 = v4;\n    }\n\n    if (p < bEnd) {\n        XXH_memcpy(state->mem32, p, (size_t)(bEnd-p));\n        state->memsize = (unsigned)(bEnd-p);\n    }\n\n    return XXH_OK;\n}\n\nXXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* state_in, const void* input, size_t len)\n{\n    XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;\n\n    if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)\n        return XXH32_update_endian(state_in, input, len, XXH_littleEndian);\n    else\n        return XXH32_update_endian(state_in, input, len, XXH_bigEndian);\n}\n\n\n\nFORCE_INLINE U32 XXH32_digest_endian (const XXH32_state_t* state, XXH_endianess endian)\n{\n    const BYTE * p = (const BYTE*)state->mem32;\n    const BYTE* const bEnd = (const BYTE*)(state->mem32) + state->memsize;\n    U32 h32;\n\n    if (state->large_len) {\n        h32 = XXH_rotl32(state->v1, 1) + XXH_rotl32(state->v2, 7) + XXH_rotl32(state->v3, 12) + XXH_rotl32(state->v4, 18);\n    } else {\n        h32 = state->v3 /* == seed */ + PRIME32_5;\n    }\n\n    h32 += state->total_len_32;\n\n    while (p+4<=bEnd) {\n        h32 += XXH_readLE32(p, endian) * PRIME32_3;\n        h32  = XXH_rotl32(h32, 17) * PRIME32_4;\n        p+=4;\n    }\n\n    while (p<bEnd) {\n        h32 += (*p) * PRIME32_5;\n        h32  = XXH_rotl32(h32, 11) * PRIME32_1;\n        p++;\n    }\n\n    h32 ^= h32 >> 15;\n    h32 *= PRIME32_2;\n    h32 ^= h32 >> 13;\n    h32 *= PRIME32_3;\n    h32 ^= h32 >> 16;\n\n    return h32;\n}\n\n\nXXH_PUBLIC_API unsigned int XXH32_digest (const XXH32_state_t* state_in)\n{\n    XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;\n\n    if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)\n        return XXH32_digest_endian(state_in, XXH_littleEndian);\n    else\n        return XXH32_digest_endian(state_in, XXH_bigEndian);\n}\n\n\n/*======   Canonical representation   ======*/\n\n/*! Default XXH result types are basic unsigned 32 and 64 bits.\n*   The canonical representation follows human-readable write convention, aka big-endian (large digits first).\n*   These functions allow transformation of hash result into and from its canonical format.\n*   This way, hash values can be written into a file or buffer, and remain comparable across different systems and programs.\n*/\n\nXXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash)\n{\n    XXH_STATIC_ASSERT(sizeof(XXH32_canonical_t) == sizeof(XXH32_hash_t));\n    if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap32(hash);\n    memcpy(dst, &hash, sizeof(*dst));\n}\n\nXXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src)\n{\n    return XXH_readBE32(src);\n}\n\n\n#ifndef XXH_NO_LONG_LONG\n\n/* *******************************************************************\n*  64-bits hash functions\n*********************************************************************/\n\n/*======   Memory access   ======*/\n\n#ifndef MEM_MODULE\n# define MEM_MODULE\n# if !defined (__VMS) && (defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )\n#   include <stdint.h>\n    typedef uint64_t U64;\n# else\n    typedef unsigned long long U64;   /* if your compiler doesn't support unsigned long long, replace by another 64-bit type here. Note that xxhash.h will also need to be updated. */\n# endif\n#endif\n\n\n#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2))\n\n/* Force direct memory access. Only works on CPU which support unaligned memory access in hardware */\nstatic U64 XXH_read64(const void* memPtr) { return *(const U64*) memPtr; }\n\n#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1))\n\n/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */\n/* currently only defined for gcc and icc */\ntypedef union { U32 u32; U64 u64; } __attribute__((packed)) unalign64;\nstatic U64 XXH_read64(const void* ptr) { return ((const unalign64*)ptr)->u64; }\n\n#else\n\n/* portable and safe solution. Generally efficient.\n * see : http://stackoverflow.com/a/32095106/646947\n */\n\nstatic U64 XXH_read64(const void* memPtr)\n{\n    U64 val;\n    memcpy(&val, memPtr, sizeof(val));\n    return val;\n}\n\n#endif   /* XXH_FORCE_DIRECT_MEMORY_ACCESS */\n\n#if defined(_MSC_VER)     /* Visual Studio */\n#  define XXH_swap64 _byteswap_uint64\n#elif XXH_GCC_VERSION >= 403\n#  define XXH_swap64 __builtin_bswap64\n#else\nstatic U64 XXH_swap64 (U64 x)\n{\n    return  ((x << 56) & 0xff00000000000000ULL) |\n            ((x << 40) & 0x00ff000000000000ULL) |\n            ((x << 24) & 0x0000ff0000000000ULL) |\n            ((x << 8)  & 0x000000ff00000000ULL) |\n            ((x >> 8)  & 0x00000000ff000000ULL) |\n            ((x >> 24) & 0x0000000000ff0000ULL) |\n            ((x >> 40) & 0x000000000000ff00ULL) |\n            ((x >> 56) & 0x00000000000000ffULL);\n}\n#endif\n\nFORCE_INLINE U64 XXH_readLE64_align(const void* ptr, XXH_endianess endian, XXH_alignment align)\n{\n    if (align==XXH_unaligned)\n        return endian==XXH_littleEndian ? XXH_read64(ptr) : XXH_swap64(XXH_read64(ptr));\n    else\n        return endian==XXH_littleEndian ? *(const U64*)ptr : XXH_swap64(*(const U64*)ptr);\n}\n\nFORCE_INLINE U64 XXH_readLE64(const void* ptr, XXH_endianess endian)\n{\n    return XXH_readLE64_align(ptr, endian, XXH_unaligned);\n}\n\nstatic U64 XXH_readBE64(const void* ptr)\n{\n    return XXH_CPU_LITTLE_ENDIAN ? XXH_swap64(XXH_read64(ptr)) : XXH_read64(ptr);\n}\n\n\n/*======   xxh64   ======*/\n\nstatic const U64 PRIME64_1 = 11400714785074694791ULL;\nstatic const U64 PRIME64_2 = 14029467366897019727ULL;\nstatic const U64 PRIME64_3 =  1609587929392839161ULL;\nstatic const U64 PRIME64_4 =  9650029242287828579ULL;\nstatic const U64 PRIME64_5 =  2870177450012600261ULL;\n\nstatic U64 XXH64_round(U64 acc, U64 input)\n{\n    acc += input * PRIME64_2;\n    acc  = XXH_rotl64(acc, 31);\n    acc *= PRIME64_1;\n    return acc;\n}\n\nstatic U64 XXH64_mergeRound(U64 acc, U64 val)\n{\n    val  = XXH64_round(0, val);\n    acc ^= val;\n    acc  = acc * PRIME64_1 + PRIME64_4;\n    return acc;\n}\n\nFORCE_INLINE U64 XXH64_endian_align(const void* input, size_t len, U64 seed, XXH_endianess endian, XXH_alignment align)\n{\n    const BYTE* p = (const BYTE*)input;\n    const BYTE* bEnd = p + len;\n    U64 h64;\n#define XXH_get64bits(p) XXH_readLE64_align(p, endian, align)\n\n#ifdef XXH_ACCEPT_NULL_INPUT_POINTER\n    if (p==NULL) {\n        len=0;\n        bEnd=p=(const BYTE*)(size_t)32;\n    }\n#endif\n\n    if (len>=32) {\n        const BYTE* const limit = bEnd - 32;\n        U64 v1 = seed + PRIME64_1 + PRIME64_2;\n        U64 v2 = seed + PRIME64_2;\n        U64 v3 = seed + 0;\n        U64 v4 = seed - PRIME64_1;\n\n        do {\n            v1 = XXH64_round(v1, XXH_get64bits(p)); p+=8;\n            v2 = XXH64_round(v2, XXH_get64bits(p)); p+=8;\n            v3 = XXH64_round(v3, XXH_get64bits(p)); p+=8;\n            v4 = XXH64_round(v4, XXH_get64bits(p)); p+=8;\n        } while (p<=limit);\n\n        h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18);\n        h64 = XXH64_mergeRound(h64, v1);\n        h64 = XXH64_mergeRound(h64, v2);\n        h64 = XXH64_mergeRound(h64, v3);\n        h64 = XXH64_mergeRound(h64, v4);\n\n    } else {\n        h64  = seed + PRIME64_5;\n    }\n\n    h64 += (U64) len;\n\n    while (p+8<=bEnd) {\n        U64 const k1 = XXH64_round(0, XXH_get64bits(p));\n        h64 ^= k1;\n        h64  = XXH_rotl64(h64,27) * PRIME64_1 + PRIME64_4;\n        p+=8;\n    }\n\n    if (p+4<=bEnd) {\n        h64 ^= (U64)(XXH_get32bits(p)) * PRIME64_1;\n        h64 = XXH_rotl64(h64, 23) * PRIME64_2 + PRIME64_3;\n        p+=4;\n    }\n\n    while (p<bEnd) {\n        h64 ^= (*p) * PRIME64_5;\n        h64 = XXH_rotl64(h64, 11) * PRIME64_1;\n        p++;\n    }\n\n    h64 ^= h64 >> 33;\n    h64 *= PRIME64_2;\n    h64 ^= h64 >> 29;\n    h64 *= PRIME64_3;\n    h64 ^= h64 >> 32;\n\n    return h64;\n}\n\n\nXXH_PUBLIC_API unsigned long long XXH64 (const void* input, size_t len, unsigned long long seed)\n{\n#if 0\n    /* Simple version, good for code maintenance, but unfortunately slow for small inputs */\n    XXH64_state_t state;\n    XXH64_reset(&state, seed);\n    XXH64_update(&state, input, len);\n    return XXH64_digest(&state);\n#else\n    XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;\n\n    if (XXH_FORCE_ALIGN_CHECK) {\n        if ((((size_t)input) & 7)==0) {  /* Input is aligned, let's leverage the speed advantage */\n            if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)\n                return XXH64_endian_align(input, len, seed, XXH_littleEndian, XXH_aligned);\n            else\n                return XXH64_endian_align(input, len, seed, XXH_bigEndian, XXH_aligned);\n    }   }\n\n    if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)\n        return XXH64_endian_align(input, len, seed, XXH_littleEndian, XXH_unaligned);\n    else\n        return XXH64_endian_align(input, len, seed, XXH_bigEndian, XXH_unaligned);\n#endif\n}\n\n/*======   Hash Streaming   ======*/\n\nXXH_PUBLIC_API XXH64_state_t* XXH64_createState(void)\n{\n    return (XXH64_state_t*)XXH_malloc(sizeof(XXH64_state_t));\n}\nXXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr)\n{\n    XXH_free(statePtr);\n    return XXH_OK;\n}\n\nXXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* dstState, const XXH64_state_t* srcState)\n{\n    memcpy(dstState, srcState, sizeof(*dstState));\n}\n\nXXH_PUBLIC_API XXH_errorcode XXH64_reset(XXH64_state_t* statePtr, unsigned long long seed)\n{\n    XXH64_state_t state;   /* using a local state to memcpy() in order to avoid strict-aliasing warnings */\n    memset(&state, 0, sizeof(state)-8);   /* do not write into reserved, for future removal */\n    state.v1 = seed + PRIME64_1 + PRIME64_2;\n    state.v2 = seed + PRIME64_2;\n    state.v3 = seed + 0;\n    state.v4 = seed - PRIME64_1;\n    memcpy(statePtr, &state, sizeof(state));\n    return XXH_OK;\n}\n\nFORCE_INLINE XXH_errorcode XXH64_update_endian (XXH64_state_t* state, const void* input, size_t len, XXH_endianess endian)\n{\n    const BYTE* p = (const BYTE*)input;\n    const BYTE* const bEnd = p + len;\n\n#ifdef XXH_ACCEPT_NULL_INPUT_POINTER\n    if (input==NULL) return XXH_ERROR;\n#endif\n\n    state->total_len += len;\n\n    if (state->memsize + len < 32) {  /* fill in tmp buffer */\n        XXH_memcpy(((BYTE*)state->mem64) + state->memsize, input, len);\n        state->memsize += (U32)len;\n        return XXH_OK;\n    }\n\n    if (state->memsize) {   /* tmp buffer is full */\n        XXH_memcpy(((BYTE*)state->mem64) + state->memsize, input, 32-state->memsize);\n        state->v1 = XXH64_round(state->v1, XXH_readLE64(state->mem64+0, endian));\n        state->v2 = XXH64_round(state->v2, XXH_readLE64(state->mem64+1, endian));\n        state->v3 = XXH64_round(state->v3, XXH_readLE64(state->mem64+2, endian));\n        state->v4 = XXH64_round(state->v4, XXH_readLE64(state->mem64+3, endian));\n        p += 32-state->memsize;\n        state->memsize = 0;\n    }\n\n    if (p+32 <= bEnd) {\n        const BYTE* const limit = bEnd - 32;\n        U64 v1 = state->v1;\n        U64 v2 = state->v2;\n        U64 v3 = state->v3;\n        U64 v4 = state->v4;\n\n        do {\n            v1 = XXH64_round(v1, XXH_readLE64(p, endian)); p+=8;\n            v2 = XXH64_round(v2, XXH_readLE64(p, endian)); p+=8;\n            v3 = XXH64_round(v3, XXH_readLE64(p, endian)); p+=8;\n            v4 = XXH64_round(v4, XXH_readLE64(p, endian)); p+=8;\n        } while (p<=limit);\n\n        state->v1 = v1;\n        state->v2 = v2;\n        state->v3 = v3;\n        state->v4 = v4;\n    }\n\n    if (p < bEnd) {\n        XXH_memcpy(state->mem64, p, (size_t)(bEnd-p));\n        state->memsize = (unsigned)(bEnd-p);\n    }\n\n    return XXH_OK;\n}\n\nXXH_PUBLIC_API XXH_errorcode XXH64_update (XXH64_state_t* state_in, const void* input, size_t len)\n{\n    XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;\n\n    if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)\n        return XXH64_update_endian(state_in, input, len, XXH_littleEndian);\n    else\n        return XXH64_update_endian(state_in, input, len, XXH_bigEndian);\n}\n\nFORCE_INLINE U64 XXH64_digest_endian (const XXH64_state_t* state, XXH_endianess endian)\n{\n    const BYTE * p = (const BYTE*)state->mem64;\n    const BYTE* const bEnd = (const BYTE*)state->mem64 + state->memsize;\n    U64 h64;\n\n    if (state->total_len >= 32) {\n        U64 const v1 = state->v1;\n        U64 const v2 = state->v2;\n        U64 const v3 = state->v3;\n        U64 const v4 = state->v4;\n\n        h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18);\n        h64 = XXH64_mergeRound(h64, v1);\n        h64 = XXH64_mergeRound(h64, v2);\n        h64 = XXH64_mergeRound(h64, v3);\n        h64 = XXH64_mergeRound(h64, v4);\n    } else {\n        h64  = state->v3 + PRIME64_5;\n    }\n\n    h64 += (U64) state->total_len;\n\n    while (p+8<=bEnd) {\n        U64 const k1 = XXH64_round(0, XXH_readLE64(p, endian));\n        h64 ^= k1;\n        h64  = XXH_rotl64(h64,27) * PRIME64_1 + PRIME64_4;\n        p+=8;\n    }\n\n    if (p+4<=bEnd) {\n        h64 ^= (U64)(XXH_readLE32(p, endian)) * PRIME64_1;\n        h64  = XXH_rotl64(h64, 23) * PRIME64_2 + PRIME64_3;\n        p+=4;\n    }\n\n    while (p<bEnd) {\n        h64 ^= (*p) * PRIME64_5;\n        h64  = XXH_rotl64(h64, 11) * PRIME64_1;\n        p++;\n    }\n\n    h64 ^= h64 >> 33;\n    h64 *= PRIME64_2;\n    h64 ^= h64 >> 29;\n    h64 *= PRIME64_3;\n    h64 ^= h64 >> 32;\n\n    return h64;\n}\n\nXXH_PUBLIC_API unsigned long long XXH64_digest (const XXH64_state_t* state_in)\n{\n    XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;\n\n    if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)\n        return XXH64_digest_endian(state_in, XXH_littleEndian);\n    else\n        return XXH64_digest_endian(state_in, XXH_bigEndian);\n}\n\n\n/*====== Canonical representation   ======*/\n\nXXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash)\n{\n    XXH_STATIC_ASSERT(sizeof(XXH64_canonical_t) == sizeof(XXH64_hash_t));\n    if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap64(hash);\n    memcpy(dst, &hash, sizeof(*dst));\n}\n\nXXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src)\n{\n    return XXH_readBE64(src);\n}\n\n#endif  /* XXH_NO_LONG_LONG */\n"
  },
  {
    "path": "src/libraries/xxHash/xxhash.h",
    "content": "/*\n   xxHash - Extremely Fast Hash algorithm\n   Header File\n   Copyright (C) 2012-2016, Yann Collet.\n\n   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)\n\n   Redistribution and use in source and binary forms, with or without\n   modification, are permitted provided that the following conditions are\n   met:\n\n       * Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n       * Redistributions in binary form must reproduce the above\n   copyright notice, this list of conditions and the following disclaimer\n   in the documentation and/or other materials provided with the\n   distribution.\n\n   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n   \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n   You can contact the author at :\n   - xxHash source repository : https://github.com/Cyan4973/xxHash\n*/\n\n/* Notice extracted from xxHash homepage :\n\nxxHash is an extremely fast Hash algorithm, running at RAM speed limits.\nIt also successfully passes all tests from the SMHasher suite.\n\nComparison (single thread, Windows Seven 32 bits, using SMHasher on a Core 2 Duo @3GHz)\n\nName            Speed       Q.Score   Author\nxxHash          5.4 GB/s     10\nCrapWow         3.2 GB/s      2       Andrew\nMumurHash 3a    2.7 GB/s     10       Austin Appleby\nSpookyHash      2.0 GB/s     10       Bob Jenkins\nSBox            1.4 GB/s      9       Bret Mulvey\nLookup3         1.2 GB/s      9       Bob Jenkins\nSuperFastHash   1.2 GB/s      1       Paul Hsieh\nCityHash64      1.05 GB/s    10       Pike & Alakuijala\nFNV             0.55 GB/s     5       Fowler, Noll, Vo\nCRC32           0.43 GB/s     9\nMD5-32          0.33 GB/s    10       Ronald L. Rivest\nSHA1-32         0.28 GB/s    10\n\nQ.Score is a measure of quality of the hash function.\nIt depends on successfully passing SMHasher test set.\n10 is a perfect score.\n\nA 64-bits version, named XXH64, is available since r35.\nIt offers much better speed, but for 64-bits applications only.\nName     Speed on 64 bits    Speed on 32 bits\nXXH64       13.8 GB/s            1.9 GB/s\nXXH32        6.8 GB/s            6.0 GB/s\n*/\n\n#ifndef XXHASH_H_5627135585666179\n#define XXHASH_H_5627135585666179 1\n\n#if defined (__cplusplus)\nextern \"C\" {\n#endif\n\n\n/* ****************************\n*  Definitions\n******************************/\n#include <stddef.h>   /* size_t */\ntypedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode;\n\n\n/* ****************************\n*  API modifier\n******************************/\n/** XXH_PRIVATE_API\n*   This is useful to include xxhash functions in `static` mode\n*   in order to inline them, and remove their symbol from the public list.\n*   Methodology :\n*     #define XXH_PRIVATE_API\n*     #include \"xxhash.h\"\n*   `xxhash.c` is automatically included.\n*   It's not useful to compile and link it as a separate module.\n*/\n#ifdef XXH_PRIVATE_API\n#  ifndef XXH_STATIC_LINKING_ONLY\n#    define XXH_STATIC_LINKING_ONLY\n#  endif\n#  if defined(__GNUC__)\n#    define XXH_PUBLIC_API static __inline __attribute__((unused))\n#  elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)\n#    define XXH_PUBLIC_API static inline\n#  elif defined(_MSC_VER)\n#    define XXH_PUBLIC_API static __inline\n#  else\n#    define XXH_PUBLIC_API static   /* this version may generate warnings for unused static functions; disable the relevant warning */\n#  endif\n#else\n#  define XXH_PUBLIC_API   /* do nothing */\n#endif /* XXH_PRIVATE_API */\n\n/*!XXH_NAMESPACE, aka Namespace Emulation :\n\nIf you want to include _and expose_ xxHash functions from within your own library,\nbut also want to avoid symbol collisions with other libraries which may also include xxHash,\n\nyou can use XXH_NAMESPACE, to automatically prefix any public symbol from xxhash library\nwith the value of XXH_NAMESPACE (therefore, avoid NULL and numeric values).\n\nNote that no change is required within the calling program as long as it includes `xxhash.h` :\nregular symbol name will be automatically translated by this header.\n*/\n#ifdef XXH_NAMESPACE\n#  define XXH_CAT(A,B) A##B\n#  define XXH_NAME2(A,B) XXH_CAT(A,B)\n#  define XXH_versionNumber XXH_NAME2(XXH_NAMESPACE, XXH_versionNumber)\n#  define XXH32 XXH_NAME2(XXH_NAMESPACE, XXH32)\n#  define XXH32_createState XXH_NAME2(XXH_NAMESPACE, XXH32_createState)\n#  define XXH32_freeState XXH_NAME2(XXH_NAMESPACE, XXH32_freeState)\n#  define XXH32_reset XXH_NAME2(XXH_NAMESPACE, XXH32_reset)\n#  define XXH32_update XXH_NAME2(XXH_NAMESPACE, XXH32_update)\n#  define XXH32_digest XXH_NAME2(XXH_NAMESPACE, XXH32_digest)\n#  define XXH32_copyState XXH_NAME2(XXH_NAMESPACE, XXH32_copyState)\n#  define XXH32_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH32_canonicalFromHash)\n#  define XXH32_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH32_hashFromCanonical)\n#  define XXH64 XXH_NAME2(XXH_NAMESPACE, XXH64)\n#  define XXH64_createState XXH_NAME2(XXH_NAMESPACE, XXH64_createState)\n#  define XXH64_freeState XXH_NAME2(XXH_NAMESPACE, XXH64_freeState)\n#  define XXH64_reset XXH_NAME2(XXH_NAMESPACE, XXH64_reset)\n#  define XXH64_update XXH_NAME2(XXH_NAMESPACE, XXH64_update)\n#  define XXH64_digest XXH_NAME2(XXH_NAMESPACE, XXH64_digest)\n#  define XXH64_copyState XXH_NAME2(XXH_NAMESPACE, XXH64_copyState)\n#  define XXH64_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH64_canonicalFromHash)\n#  define XXH64_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH64_hashFromCanonical)\n#endif\n\n\n/* *************************************\n*  Version\n***************************************/\n#define XXH_VERSION_MAJOR    0\n#define XXH_VERSION_MINOR    6\n#define XXH_VERSION_RELEASE  2\n#define XXH_VERSION_NUMBER  (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE)\nXXH_PUBLIC_API unsigned XXH_versionNumber (void);\n\n\n/*-**********************************************************************\n*  32-bits hash\n************************************************************************/\ntypedef unsigned int XXH32_hash_t;\n\n/*! XXH32() :\n    Calculate the 32-bits hash of sequence \"length\" bytes stored at memory address \"input\".\n    The memory between input & input+length must be valid (allocated and read-accessible).\n    \"seed\" can be used to alter the result predictably.\n    Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark) : 5.4 GB/s */\nXXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t length, unsigned int seed);\n\n/*======   Streaming   ======*/\ntypedef struct XXH32_state_s XXH32_state_t;   /* incomplete type */\nXXH_PUBLIC_API XXH32_state_t* XXH32_createState(void);\nXXH_PUBLIC_API XXH_errorcode  XXH32_freeState(XXH32_state_t* statePtr);\nXXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dst_state, const XXH32_state_t* src_state);\n\nXXH_PUBLIC_API XXH_errorcode XXH32_reset  (XXH32_state_t* statePtr, unsigned int seed);\nXXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* statePtr, const void* input, size_t length);\nXXH_PUBLIC_API XXH32_hash_t  XXH32_digest (const XXH32_state_t* statePtr);\n\n/*\nThese functions generate the xxHash of an input provided in multiple segments.\nNote that, for small input, they are slower than single-call functions, due to state management.\nFor small input, prefer `XXH32()` and `XXH64()` .\n\nXXH state must first be allocated, using XXH*_createState() .\n\nStart a new hash by initializing state with a seed, using XXH*_reset().\n\nThen, feed the hash state by calling XXH*_update() as many times as necessary.\nObviously, input must be allocated and read accessible.\nThe function returns an error code, with 0 meaning OK, and any other value meaning there is an error.\n\nFinally, a hash value can be produced anytime, by using XXH*_digest().\nThis function returns the nn-bits hash as an int or long long.\n\nIt's still possible to continue inserting input into the hash state after a digest,\nand generate some new hashes later on, by calling again XXH*_digest().\n\nWhen done, free XXH state space if it was allocated dynamically.\n*/\n\n/*======   Canonical representation   ======*/\n\ntypedef struct { unsigned char digest[4]; } XXH32_canonical_t;\nXXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash);\nXXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src);\n\n/* Default result type for XXH functions are primitive unsigned 32 and 64 bits.\n*  The canonical representation uses human-readable write convention, aka big-endian (large digits first).\n*  These functions allow transformation of hash result into and from its canonical format.\n*  This way, hash values can be written into a file / memory, and remain comparable on different systems and programs.\n*/\n\n\n#ifndef XXH_NO_LONG_LONG\n/*-**********************************************************************\n*  64-bits hash\n************************************************************************/\ntypedef unsigned long long XXH64_hash_t;\n\n/*! XXH64() :\n    Calculate the 64-bits hash of sequence of length \"len\" stored at memory address \"input\".\n    \"seed\" can be used to alter the result predictably.\n    This function runs faster on 64-bits systems, but slower on 32-bits systems (see benchmark).\n*/\nXXH_PUBLIC_API XXH64_hash_t XXH64 (const void* input, size_t length, unsigned long long seed);\n\n/*======   Streaming   ======*/\ntypedef struct XXH64_state_s XXH64_state_t;   /* incomplete type */\nXXH_PUBLIC_API XXH64_state_t* XXH64_createState(void);\nXXH_PUBLIC_API XXH_errorcode  XXH64_freeState(XXH64_state_t* statePtr);\nXXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* dst_state, const XXH64_state_t* src_state);\n\nXXH_PUBLIC_API XXH_errorcode XXH64_reset  (XXH64_state_t* statePtr, unsigned long long seed);\nXXH_PUBLIC_API XXH_errorcode XXH64_update (XXH64_state_t* statePtr, const void* input, size_t length);\nXXH_PUBLIC_API XXH64_hash_t  XXH64_digest (const XXH64_state_t* statePtr);\n\n/*======   Canonical representation   ======*/\ntypedef struct { unsigned char digest[8]; } XXH64_canonical_t;\nXXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash);\nXXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src);\n#endif  /* XXH_NO_LONG_LONG */\n\n\n#ifdef XXH_STATIC_LINKING_ONLY\n\n/* ================================================================================================\n   This section contains definitions which are not guaranteed to remain stable.\n   They may change in future versions, becoming incompatible with a different version of the library.\n   They shall only be used with static linking.\n   Never use these definitions in association with dynamic linking !\n=================================================================================================== */\n\n/* These definitions are only meant to make possible\n   static allocation of XXH state, on stack or in a struct for example.\n   Never use members directly. */\n\nstruct XXH32_state_s {\n   unsigned total_len_32;\n   unsigned large_len;\n   unsigned v1;\n   unsigned v2;\n   unsigned v3;\n   unsigned v4;\n   unsigned mem32[4];   /* buffer defined as U32 for alignment */\n   unsigned memsize;\n   unsigned reserved;   /* never read nor write, will be removed in a future version */\n};   /* typedef'd to XXH32_state_t */\n\n#ifndef XXH_NO_LONG_LONG   /* remove 64-bits support */\nstruct XXH64_state_s {\n   unsigned long long total_len;\n   unsigned long long v1;\n   unsigned long long v2;\n   unsigned long long v3;\n   unsigned long long v4;\n   unsigned long long mem64[4];   /* buffer defined as U64 for alignment */\n   unsigned memsize;\n   unsigned reserved[2];          /* never read nor write, will be removed in a future version */\n};   /* typedef'd to XXH64_state_t */\n#endif\n\n#ifdef XXH_PRIVATE_API\n#  include \"xxhash.c\"   /* include xxhash function bodies as `static`, for inlining */\n#endif\n\n#endif /* XXH_STATIC_LINKING_ONLY */\n\n\n#if defined (__cplusplus)\n}\n#endif\n\n#endif /* XXHASH_H_5627135585666179 */\n"
  },
  {
    "path": "src/love.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"common/version.h\"\n#include \"common/runtime.h\"\n#include \"common/Variant.h\"\n#include \"modules/love/love.h\"\n\n#include <SDL3/SDL.h>\n\n#ifdef LOVE_BUILD_EXE\n\n#include <SDL3/SDL_main.h>\n\n// Lua\nextern \"C\" {\n\t#include <lua.h>\n\t#include <lualib.h>\n\t#include <lauxlib.h>\n}\n\n#ifdef LOVE_WINDOWS\n#define WIN32_LEAN_AND_MEAN\n#include <windows.h>\n#endif // LOVE_WINDOWS\n\n#ifdef LOVE_MACOS\n#include \"common/macos.h\"\n#include <unistd.h>\n#endif // LOVE_MACOS\n\n#ifdef LOVE_IOS\n#include \"common/ios.h\"\n#endif\n\n#ifdef LOVE_WINDOWS\nextern \"C\"\n{\n\n// Prefer the higher performance GPU on Windows systems that use nvidia Optimus.\n// http://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolicies.pdf\n// TODO: Re-evaluate in the future when the average integrated GPU in Optimus\n// systems is less mediocre?\nLOVE_EXPORT DWORD NvOptimusEnablement = 1;\n\n// Same with AMD GPUs.\n// https://community.amd.com/thread/169965\nLOVE_EXPORT DWORD AmdPowerXpressRequestHighPerformance = 1;\n}\n#endif // LOVE_WINDOWS\n\n#ifdef LOVE_LEGENDARY_APP_ARGV_HACK\n\n#include <vector>\n\n// Explicitly instantiate std::vector<std::string> to work around linker issues\n// with libc++ when symbols are hidden-by-default.\n// https://stackoverflow.com/a/48273604\ntemplate class std::vector<std::string>;\n\nstatic void get_app_arguments(int argc, char **argv, int &new_argc, char **&new_argv)\n{\n\tstd::vector<std::string> temp_argv;\n\tfor (int i = 0; i < argc; i++)\n\t{\n\t\t// Don't copy -psn_xxx argument from argv.\n\t\tif (i == 0 || strncmp(argv[i], \"-psn_\", 5) != 0)\n\t\t\ttemp_argv.push_back(std::string(argv[i]));\n\t}\n\n\t// If it exists, add the love file in love.app/Contents/Resources/ to argv.\n\tstd::string loveResourcesPath;\n\tbool fused = true;\n#if defined(LOVE_MACOS)\n\tloveResourcesPath = love::macos::getLoveInResources();\n#elif defined(LOVE_IOS)\n\tloveResourcesPath = love::ios::getLoveInResources(fused);\n#endif\n\tif (!loveResourcesPath.empty())\n\t{\n\t\tstd::vector<std::string>::iterator it = temp_argv.begin();\n\t\tit = temp_argv.insert(it + 1, loveResourcesPath);\n\n\t\t// Run in pseudo-fused mode.\n\t\tif (fused)\n\t\t\ttemp_argv.insert(it + 1, std::string(\"--fused\"));\n\t}\n#ifdef LOVE_MACOS\n\telse\n\t{\n\t\t// Check for a drop file string, if the app wasn't launched in a\n\t\t// terminal. Checking for the terminal is a pretty big hack, but works\n\t\t// around an issue where OS X will switch Spaces if the terminal\n\t\t// launching love is in its own full-screen Space.\n\t\tif (!isatty(STDIN_FILENO))\n\t\t{\n\t\t\t// Static to keep the same value after love.event.equit(\"restart\").\n\t\t\tstatic std::string dropfilestr = love::macos::checkDropEvents();\n\t\t\tif (!dropfilestr.empty())\n\t\t\t\ttemp_argv.insert(temp_argv.begin() + 1, dropfilestr);\n\t\t}\n\t}\n#endif\n\n\t// Copy temp argv vector to new argv array.\n\tnew_argc = (int) temp_argv.size();\n\tnew_argv = new char *[new_argc+1];\n\n\tfor (int i = 0; i < new_argc; i++)\n\t{\n\t\tnew_argv[i] = new char[temp_argv[i].length() + 1];\n\t\tstrcpy(new_argv[i], temp_argv[i].c_str());\n\t}\n\n\tnew_argv[new_argc] = NULL;\n}\n\n#endif // LOVE_LEGENDARY_APP_ARGV_HACK\n\nstatic int love_preload(lua_State *L, lua_CFunction f, const char *name)\n{\n\tlua_getglobal(L, \"package\");\n\tlua_getfield(L, -1, \"preload\");\n\tlua_pushcfunction(L, f);\n\tlua_setfield(L, -2, name);\n\tlua_pop(L, 2);\n\treturn 0;\n}\n\nenum DoneAction\n{\n\tDONE_QUIT,\n\tDONE_RESTART,\n};\n\nstatic void print_usage()\n{\n    // when editing this message, change it at boot.lua too\n    printf(\"LOVE is an *awesome* framework you can use to make 2D games in Lua\\n\"\n        \"https://love2d.org\\n\"\n        \"\\n\"\n        \"usage:\\n\"\n        \"    love --version                  prints LOVE version and quits\\n\"\n        \"    love --help                     prints this message and quits\\n\"\n        \"    love path/to/gamedir            runs the game from the given directory which contains a main.lua file\\n\"\n        \"    love path/to/packagedgame.love  runs the packaged game from the provided .love file\\n\"\n        \"    love path/to/file.lua           runs the game from the given .lua file\\n\"\n        );\n}\n\nstatic DoneAction runlove(int argc, char **argv, int &retval, love::Variant &restartvalue)\n{\n\t// Oh, you just want the version? Okay!\n\tif (argc > 1 && strcmp(argv[1], \"--version\") == 0)\n\t{\n#ifdef LOVE_LEGENDARY_CONSOLE_IO_HACK\n\t\tconst char *err = nullptr;\n\t\tlove_openConsole(err);\n#endif\n\t\tprintf(\"LOVE %s (%s)\\n\", love_version(), love_codename());\n\t\tretval = 0;\n\t\treturn DONE_QUIT;\n\t}\n\n\tif (argc > 1 && strcmp(argv[1], \"--help\") == 0)\n\t{\n\t\tprint_usage();\n\t\tretval = 0;\n\t\treturn DONE_QUIT;\n\t}\n\n\t// Create the virtual machine.\n\tlua_State *L = luaL_newstate();\n\tluaL_openlibs(L);\n\n\t// LuaJIT-specific setup needs to be done as early as possible - before\n\t// get_app_arguments because that loads external library code. This is also\n\t// loaded inside love's Lua threads. Note that it doesn't use the love table.\n\tlove_preload(L, luaopen_love_jitsetup, \"love.jitsetup\");\n\tlua_getglobal(L, \"require\");\n\tlua_pushstring(L, \"love.jitsetup\");\n\tlua_call(L, 1, 0);\n\n#ifdef LOVE_LEGENDARY_APP_ARGV_HACK\n\tint hack_argc = 0;\n\tchar **hack_argv = nullptr;\n\tget_app_arguments(argc, argv, hack_argc, hack_argv);\n\targc = hack_argc;\n\targv = hack_argv;\n#endif // LOVE_LEGENDARY_APP_ARGV_HACK\n\n\t// Add love to package.preload for easy requiring.\n\tlove_preload(L, luaopen_love, \"love\");\n\n\t// Add command line arguments to global arg (like stand-alone Lua).\n\t{\n\t\tlua_newtable(L);\n\n\t\tif (argc > 0)\n\t\t{\n\t\t\tlua_pushstring(L, argv[0]);\n\t\t\tlua_rawseti(L, -2, -2);\n\t\t}\n\n\t\tlua_pushstring(L, \"embedded boot.lua\");\n\t\tlua_rawseti(L, -2, -1);\n\n\t\tfor (int i = 1; i < argc; i++)\n\t\t{\n\t\t\tlua_pushstring(L, argv[i]);\n\t\t\tlua_rawseti(L, -2, i);\n\t\t}\n\n\t\tlua_setglobal(L, \"arg\");\n\t}\n\n\t// require \"love\"\n\tlua_getglobal(L, \"require\");\n\tlua_pushstring(L, \"love\");\n\tlua_call(L, 1, 1); // leave the returned table on the stack.\n\n\t// Add love._exe = true.\n\t// This indicates that we're running the standalone version of love, and not\n\t// the library version.\n\t{\n\t\tlua_pushboolean(L, 1);\n\t\tlua_setfield(L, -2, \"_exe\");\n\t}\n\n\t// Set love.restart = restartvalue, and clear restartvalue.\n\tlove::luax_pushvariant(L, restartvalue);\n\tlua_setfield(L, -2, \"restart\");\n\trestartvalue = love::Variant();\n\n\t// Pop the love table returned by require \"love\".\n\tlua_pop(L, 1);\n\n\t// require \"love.boot\" (preloaded when love was required.)\n\tlua_getglobal(L, \"require\");\n\tlua_pushstring(L, \"love.boot\");\n\tlua_call(L, 1, 1);\n\n\t// Turn the returned boot function into a coroutine and call it until done.\n\tlua_newthread(L);\n\tlua_pushvalue(L, -2);\n\tint stackpos = lua_gettop(L);\n\tint nres;\n\twhile (love::luax_resume(L, 0, &nres) == LUA_YIELD)\n#if LUA_VERSION_NUM >= 504\n\t\tlua_pop(L, nres);\n#else\n\t\tlua_pop(L, lua_gettop(L) - stackpos);\n#endif\n\n\tretval = 0;\n\tDoneAction done = DONE_QUIT;\n\n\t// if love.boot() returns \"restart\", we'll start up again after closing this\n\t// Lua state.\n\tint retidx = stackpos;\n\tif (!lua_isnoneornil(L, retidx))\n\t{\n\t\tif (lua_type(L, retidx) == LUA_TSTRING && strcmp(lua_tostring(L, retidx), \"restart\") == 0)\n\t\t\tdone = DONE_RESTART;\n\t\tif (lua_isnumber(L, retidx))\n\t\t\tretval = (int) lua_tonumber(L, retidx);\n\n\t\t// Disallow userdata (love objects) from being referenced by the restart\n\t\t// value.\n\t\tif (retidx < lua_gettop(L))\n\t\t\trestartvalue = love::luax_checkvariant(L, retidx + 1, false);\n\t}\n\n\tlua_close(L);\n\n#if defined(LOVE_LEGENDARY_APP_ARGV_HACK) && !defined(LOVE_IOS)\n\tif (hack_argv)\n\t{\n\t\tfor (int i = 0; i<hack_argc; ++i)\n\t\t\tdelete [] hack_argv[i];\n\t\tdelete [] hack_argv;\n\t}\n#endif // LOVE_LEGENDARY_APP_ARGV_HACK\n\n\treturn done;\n}\n\nint main(int argc, char **argv)\n{\n\tif (strcmp(LOVE_VERSION_STRING, love_version()) != 0)\n\t{\n\t\tprintf(\"Version mismatch detected!\\nLOVE binary is version %s\\n\"\n\t\t\t   \"LOVE library is version %s\\n\", LOVE_VERSION_STRING, love_version());\n\t\treturn 1;\n\t}\n\n\tint retval = 0;\n\tDoneAction done = DONE_QUIT;\n\tlove::Variant restartvalue;\n\n\tdo\n\t{\n\t\tdone = runlove(argc, argv, retval, restartvalue);\n\n#ifdef LOVE_IOS\n\t\t// on iOS we should never programmatically exit the app, so we'll just\n\t\t// \"restart\" when that is attempted. Games which use threads might cause\n\t\t// some issues if the threads aren't cleaned up properly...\n\t\tdone = DONE_RESTART;\n#endif\n\t} while (done != DONE_QUIT);\n\n#ifdef LOVE_ANDROID\n\tSDL_Quit();\n#endif\n\n\treturn retval;\n}\n\n#endif // LOVE_BUILD_EXE\n"
  },
  {
    "path": "src/modules/audio/Audio.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Audio.h\"\n#include \"common/config.h\"\n\n#if defined(LOVE_IOS)\n#include \"common/ios.h\"\n#elif defined(LOVE_ANDROID)\n#include \"common/android.h\"\n#endif\n\nnamespace love\n{\nnamespace audio\n{\n\nstatic bool requestRecPermission = false;\n\nvoid setRequestRecordingPermission(bool rec)\n{\n\trequestRecPermission = rec;\n}\n\nbool getRequestRecordingPermission()\n{\n\treturn requestRecPermission;\n}\n\nbool hasRecordingPermission()\n{\n#if defined(LOVE_ANDROID)\n\treturn love::android::hasRecordingPermission();\n#else\n\t// Always available(?)\n\treturn true;\n#endif\n}\n\nvoid requestRecordingPermission()\n{\n#ifdef LOVE_ANDROID\n\tlove::android::requestRecordingPermission();\n#endif\n}\n\nvoid showRecordingPermissionMissingDialog()\n{\n#ifdef LOVE_ANDROID\n\tlove::android::showRecordingPermissionMissingDialog();\n#endif\n}\n\nAudio::Audio(const char *name)\n\t: Module(M_AUDIO, name)\n{}\n\nbool Audio::setMixWithSystem(bool mix)\n{\n#ifdef LOVE_IOS\n\treturn love::ios::setAudioMixWithOthers(mix);\n#else\n\tLOVE_UNUSED(mix);\n\treturn false;\n#endif\n}\n\nvoid Audio::setPlaybackDevice(const char */*name*/)\n{\n\tthrow love::Exception(\"Re-setting output device is not supported.\");\n}\n\nStringMap<Audio::DistanceModel, Audio::DISTANCE_MAX_ENUM>::Entry Audio::distanceModelEntries[] =\n{\n\t{\"none\", Audio::DISTANCE_NONE},\n\t{\"inverse\", Audio::DISTANCE_INVERSE},\n\t{\"inverseclamped\", Audio::DISTANCE_INVERSE_CLAMPED},\n\t{\"linear\", Audio::DISTANCE_LINEAR},\n\t{\"linearclamped\", Audio::DISTANCE_LINEAR_CLAMPED},\n\t{\"exponent\", Audio::DISTANCE_EXPONENT},\n\t{\"exponentclamped\", Audio::DISTANCE_EXPONENT_CLAMPED}\n};\n\nStringMap<Audio::DistanceModel, Audio::DISTANCE_MAX_ENUM> Audio::distanceModels(Audio::distanceModelEntries, sizeof(Audio::distanceModelEntries));\n\nbool Audio::getConstant(const char *in, DistanceModel &out)\n{\n\treturn distanceModels.find(in, out);\n}\n\nbool Audio::getConstant(DistanceModel in, const char  *&out)\n{\n\treturn distanceModels.find(in, out);\n}\n\nstd::vector<std::string> Audio::getConstants(DistanceModel)\n{\n\treturn distanceModels.getNames();\n}\n\n} // audio\n} // love\n"
  },
  {
    "path": "src/modules/audio/Audio.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_AUDIO_AUDIO_H\n#define LOVE_AUDIO_AUDIO_H\n\n// STL\n#include <vector>\n\n// LOVE\n#include \"common/Module.h\"\n#include \"common/StringMap.h\"\n#include \"Source.h\"\n#include \"Effect.h\"\n#include \"RecordingDevice.h\"\n\nnamespace love\n{\n\nnamespace sound\n{\n\nclass Decoder;\nclass SoundData;\n\n} // sound\n\nnamespace audio\n{\n\n/*\n * In some platforms (notably Android), recording from mic\n * requires user permission. This function sets whetever to\n * request the permission later or not.\n */\nvoid setRequestRecordingPermission(bool rec);\n\n/*\n * Gets whetever recording permission will be requested.\n */\nbool getRequestRecordingPermission();\n\n/*\n * Gets whetever recording permission is granted.\n */\nbool hasRecordingPermission();\n\n/*\n * Request recording permission. This is blocking function.\n */\nvoid requestRecordingPermission();\n\n/*\n * In case recording permission is not granted, this\n * function shows the dialog about the recording permission.\n */\nvoid showRecordingPermissionMissingDialog();\n\n/**\n * The Audio module is responsible for playing back raw sound samples.\n **/\nclass Audio : public Module\n{\npublic:\n\n\t/**\n\t * Attenuation by distance.\n\t */\n\tenum DistanceModel\n\t{\n\t\tDISTANCE_NONE,\n\t\tDISTANCE_INVERSE,\n\t\tDISTANCE_INVERSE_CLAMPED,\n\t\tDISTANCE_LINEAR,\n\t\tDISTANCE_LINEAR_CLAMPED,\n\t\tDISTANCE_EXPONENT,\n\t\tDISTANCE_EXPONENT_CLAMPED,\n\t\tDISTANCE_MAX_ENUM\n\t};\n\n\tstatic bool getConstant(const char *in, DistanceModel &out);\n\tstatic bool getConstant(DistanceModel in, const char  *&out);\n\tstatic std::vector<std::string> getConstants(DistanceModel);\n\n\tvirtual ~Audio() {}\n\n\tvirtual Source *newSource(love::sound::Decoder *decoder) = 0;\n\tvirtual Source *newSource(love::sound::SoundData *soundData) = 0;\n\tvirtual Source *newSource(int sampleRate, int bitDepth, int channels, int buffers) = 0;\n\n\t/**\n\t * Gets the current number of simultaneous playing sources.\n\t * @return The current number of simultaneous playing sources.\n\t **/\n\tvirtual int getActiveSourceCount() const = 0;\n\n\t/**\n\t * Gets the maximum supported number of simultaneous playing sources.\n\t * @return The maximum supported number of simultaneous playing sources.\n\t **/\n\tvirtual int getMaxSources() const = 0;\n\n\t/**\n\t * Play the specified Source.\n\t * @param source The Source to play.\n\t **/\n\tvirtual bool play(Source *source) = 0;\n\n\t/**\n\t * Play the specified Sources.\n\t * @param sources The Sources to play.\n\t **/\n\tvirtual bool play(const std::vector<Source*> &sources) = 0;\n\n\t/**\n\t * Stops playback on the specified source.\n\t * @param source The source on which to stop the playback.\n\t **/\n\tvirtual void stop(Source *source) = 0;\n\n\t/**\n\t * Stops playback on the specified sources.\n\t * @param sources The sources on which to stop the playback.\n\t **/\n\tvirtual void stop(const std::vector<Source*> &sources) = 0;\n\n\t/**\n\t * Stops all playing audio.\n\t **/\n\tvirtual void stop() = 0;\n\n\t/**\n\t * Pauses playback on the specified source.\n\t * @param source The source on which to pause the playback.\n\t **/\n\tvirtual void pause(Source *source) = 0;\n\n\t/**\n\t * Pauses playback on the specified sources.\n\t * @param sources The sources on which to pause the playback.\n\t **/\n\tvirtual void pause(const std::vector<Source*> &sources) = 0;\n\n\t/**\n\t * Pauses all audio.\n\t **/\n\tvirtual std::vector<Source*> pause() = 0;\n\n\t/**\n\t * Sets the master volume, where 0.0f is min (off) and 1.0f is max.\n\t * @param volume The new master volume.\n\t **/\n\tvirtual void setVolume(float volume) = 0;\n\n\t/**\n\t * Gets the master volume.\n\t * @return The current master volume.\n\t **/\n\tvirtual float getVolume() const = 0;\n\n\t/**\n\t * Gets the position of the listener.\n\t * @param v A float array of size 3 containing (x,y,z) in that order.\n\t **/\n\tvirtual void getPosition(float *v) const = 0;\n\n\t/**\n\t * Sets the position of the listener.\n\t * @param v A float array of size 3 containing [x,y,z] in that order.\n\t **/\n\tvirtual void setPosition(float *v) = 0;\n\n\t/**\n\t * Gets the orientation of the listener.\n\t * @param v A float array of size 6 containing [x,y,z] for the forward\n\t * vector, followed by [x,y,z] for the up vector.\n\t **/\n\tvirtual void getOrientation(float *v) const = 0;\n\n\t/**\n\t * Sets the orientation of the listener.\n\t * @param v A float array of size 6 containing [x,y,z] for the forward\n\t * vector, followed by [x,y,z] for the up vector.\n\t **/\n\tvirtual void setOrientation(float *v) = 0;\n\n\t/**\n\t * Gets the velocity of the listener.\n\t * @param v A float array of size 3 containing [x,y,z] in that order.\n\t **/\n\tvirtual void getVelocity(float *v) const = 0;\n\n\t/**\n\t * Sets the velocity of the listener.\n\t * @param v A float array of size 3 containing [x,y,z] in that order.\n\t **/\n\tvirtual void setVelocity(float *v) = 0;\n\n\tvirtual void setDopplerScale(float scale) = 0;\n\tvirtual float getDopplerScale() const = 0;\n\t//virtual void setMeter(float scale) = 0;\n\t//virtual float getMeter() const = 0;\n\t/**\n\t * @return Reference to a vector of pointers to recording devices. May be empty.\n\t **/\n\tvirtual const std::vector<RecordingDevice*> &getRecordingDevices() = 0;\n\n\t/**\n\t * Gets the distance model used for attenuation.\n\t * @return Distance model.\n\t */\n\tvirtual DistanceModel getDistanceModel() const = 0;\n\n\t/**\n\t * Sets the distance model used for attenuation.\n\t * @param distanceModel Distance model.\n\t */\n\tvirtual void setDistanceModel(DistanceModel distanceModel) = 0;\n\n\t/**\n\t * Sets scene EFX effect.\n\t * @param name Effect name to use.\n\t * @param fxparams Effect description table.\n\t * @return true if successful, false otherwise.\n\t */\n\tvirtual bool setEffect(const char *name, std::map<Effect::Parameter, float> &params) = 0;\n\n\t/**\n\t * Removes scene EFX effect.\n\t * @param name Effect name to clear.\n\t * @return true if successful, false otherwise.\n\t */\n\tvirtual bool unsetEffect(const char *name) = 0;\n\n\t/**\n\t * Gets scene EFX effect.\n\t * @param name Effect name to get data from.\n\t * @param fxparams Effect description table.\n\t * @return true if effect was present, false otherwise.\n\t */\n\tvirtual bool getEffect(const char *name, std::map<Effect::Parameter, float> &params) = 0;\n\n\t/**\n\t * Gets list of EFX effect names.\n\t * @param list List of EFX names to fill.\n\t * @return true if effect was present, false otherwise.\n\t */\n\tvirtual bool getActiveEffects(std::vector<std::string> &list) const = 0;\n\n\t/**\n\t * Gets maximum number of scene EFX effects.\n\t * @return number of effects.\n\t */\n\tvirtual int getMaxSceneEffects() const = 0;\n\n\t/**\n\t * Gets maximum number of source EFX effects.\n\t * @return number of effects.\n\t */\n\tvirtual int getMaxSourceEffects() const = 0;\n\n\t/**\n\t * Gets EFX (or analog) availability.\n\t * @return true if supported.\n\t */\n\tvirtual bool isEFXsupported() const = 0;\n\n\tvirtual bool setOutputSpatialization(bool enable, const char *filter = nullptr) = 0;\n\tvirtual bool getOutputSpatialization(const char *&filter) const = 0;\n\tvirtual void getOutputSpatializationFilters(std::vector<std::string> &list) const = 0;\n\n\t/**\n\t * Sets whether audio from other apps mixes with love.audio or is muted,\n\t * on supported platforms.\n\t **/\n\tstatic bool setMixWithSystem(bool mix);\n\n\t/**\n\t * Pause/resume audio context\n\t */\n\tvirtual void pauseContext() = 0;\n\tvirtual void resumeContext() = 0;\n\n\t/**\n\t * Get current playback device name.\n\t */\n\tvirtual std::string getPlaybackDevice() = 0;\n\n\t/**\n\t * Retrieve list of available playback devices.\n\t */\n\tvirtual void getPlaybackDevices(std::vector<std::string> &list) = 0;\n\n\t/**\n\t * Set the current playback device to specified device name.\n\t */\n\tvirtual void setPlaybackDevice(const char *name);\n\nprotected:\n\n\tAudio(const char *name);\n\nprivate:\n\n\tstatic StringMap<DistanceModel, DISTANCE_MAX_ENUM>::Entry distanceModelEntries[];\n\tstatic StringMap<DistanceModel, DISTANCE_MAX_ENUM> distanceModels;\n}; // Audio\n\n} // audio\n} // love\n\n#endif // LOVE_AUDIO_AUDIO_H\n"
  },
  {
    "path": "src/modules/audio/Effect.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Effect.h\"\n\nnamespace love\n{\nnamespace audio\n{\n\nEffect::Effect()\n{\n}\n\nEffect::~Effect()\n{\n}\n\nEffect::Type Effect::getType() const\n{\n\treturn type;\n}\n\nbool Effect::getConstant(const char *in, Type &out)\n{\n\treturn types.find(in, out);\n}\n\nbool Effect::getConstant(Type in, const char *&out)\n{\n\treturn types.find(in, out);\n}\n\nstd::vector<std::string> Effect::getConstants(Type)\n{\n\treturn types.getNames();\n}\n\n/*\nbool Effect::getConstant(const char *in, Phoneme &out)\n{\n\treturn phonemes.find(in, out);\n}\n\nbool Effect::getConstant(Phoneme in, const char *&out)\n{\n\treturn phonemes.find(in, out);\n}\n*/\nbool Effect::getConstant(const char *in, Waveform &out)\n{\n\treturn waveforms.find(in, out);\n}\n\nbool Effect::getConstant(Waveform in, const char *&out)\n{\n\treturn waveforms.find(in, out);\n}\n/*\nbool Effect::getConstant(const char *in, Direction &out)\n{\n\treturn directions.find(in, out);\n}\n\nbool Effect::getConstant(Direction in, const char *&out)\n{\n\treturn directions.find(in, out);\n}\n*/\nbool Effect::getConstant(const char *in, Parameter &out, Type t)\n{\n\treturn parameterNames[t].find(in, out);\n}\n\nbool Effect::getConstant(Parameter in, const char *&out, Type t)\n{\n\treturn parameterNames[t].find(in, out);\n}\n\nEffect::ParameterType Effect::getParameterType(Effect::Parameter in)\n{\n\treturn parameterTypes[in];\n}\n\nStringMap<Effect::Type, Effect::TYPE_MAX_ENUM>::Entry Effect::typeEntries[] =\n{\n\t{\"reverb\", Effect::TYPE_REVERB},\n\t{\"chorus\", Effect::TYPE_CHORUS},\n\t{\"distortion\", Effect::TYPE_DISTORTION},\n\t{\"echo\", Effect::TYPE_ECHO},\n\t{\"flanger\", Effect::TYPE_FLANGER},\n\t//{\"frequencyshifter\", Effect::TYPE_FREQSHIFTER},\n\t//{\"vocalmorpher\", Effect::TYPE_MORPHER},\n\t//{\"pitchshifter\", Effect::TYPE_PITCHSHIFTER},\n\t{\"ringmodulator\", Effect::TYPE_MODULATOR},\n\t//{\"autowah\", Effect::TYPE_AUTOWAH},\n\t{\"compressor\", Effect::TYPE_COMPRESSOR},\n\t{\"equalizer\", Effect::TYPE_EQUALIZER},\n};\n\nStringMap<Effect::Type, Effect::TYPE_MAX_ENUM> Effect::types(Effect::typeEntries, sizeof(Effect::typeEntries));\n\nStringMap<Effect::Waveform, Effect::WAVE_MAX_ENUM>::Entry Effect::waveformEntries[] =\n{\n\t{\"sine\", Effect::WAVE_SINE},\n\t{\"triangle\", Effect::WAVE_TRIANGLE},\n\t{\"sawtooth\", Effect::WAVE_SAWTOOTH},\n\t{\"square\", Effect::WAVE_SQUARE},\n};\n\nStringMap<Effect::Waveform, Effect::WAVE_MAX_ENUM> Effect::waveforms(Effect::waveformEntries, sizeof(Effect::waveformEntries));\n\n/*\nStringMap<Effect::Direction, Effect::DIR_MAX_ENUM>::Entry Effect::directionEntries[] =\n{\n\t{\"up\", Effect::DIR_UP},\n\t{\"down\", Effect::DIR_DOWN},\n\t{\"none\", Effect::DIR_NONE},\n};\n\nStringMap<Effect::Direction, Effect::DIR_MAX_ENUM> Effect::directions(Effect::directionEntries, sizeof(Effect::directionEntries));\n\nStringMap<Effect::Phoneme, Effect::PHONEME_MAX_ENUM>::Entry Effect::phonemeEntries[] =\n{\n\t{\"a\", Effect::PHONEME_A},\n\t{\"e\", Effect::PHONEME_E},\n\t{\"i\", Effect::PHONEME_I},\n\t{\"o\", Effect::PHONEME_O},\n\t{\"u\", Effect::PHONEME_U},\n\t{\"aa\", Effect::PHONEME_AA},\n\t{\"ae\", Effect::PHONEME_AE},\n\t{\"ah\", Effect::PHONEME_AH},\n\t{\"ao\", Effect::PHONEME_AO},\n\t{\"eh\", Effect::PHONEME_EH},\n\t{\"er\", Effect::PHONEME_ER},\n\t{\"ih\", Effect::PHONEME_IH},\n\t{\"iy\", Effect::PHONEME_IY},\n\t{\"uh\", Effect::PHONEME_UH},\n\t{\"uw\", Effect::PHONEME_UW},\n\t{\"b\", Effect::PHONEME_B},\n\t{\"d\", Effect::PHONEME_D},\n\t{\"f\", Effect::PHONEME_F},\n\t{\"g\", Effect::PHONEME_G},\n\t{\"j\", Effect::PHONEME_J},\n\t{\"k\", Effect::PHONEME_K},\n\t{\"l\", Effect::PHONEME_L},\n\t{\"m\", Effect::PHONEME_M},\n\t{\"n\", Effect::PHONEME_N},\n\t{\"p\", Effect::PHONEME_P},\n\t{\"r\", Effect::PHONEME_R},\n\t{\"s\", Effect::PHONEME_S},\n\t{\"t\", Effect::PHONEME_T},\n\t{\"v\", Effect::PHONEME_V},\n\t{\"z\", Effect::PHONEME_Z},\n};\n\nStringMap<Effect::Phoneme, Effect::PHONEME_MAX_ENUM> Effect::phonemes(Effect::phonemeEntries, sizeof(Effect::phonemeEntries));\n*/\n\n#define StringMap LazierAndSlowerButEasilyArrayableStringMap\n\nstd::vector<StringMap<Effect::Parameter>::Entry> Effect::basicParameters =\n{\n\t{\"type\", Effect::EFFECT_TYPE},\n\t{\"volume\", Effect::EFFECT_VOLUME}\n};\n\nstd::vector<StringMap<Effect::Parameter>::Entry> Effect::reverbParameters =\n{\n\t{\"gain\", Effect::REVERB_GAIN},\n\t{\"highgain\", Effect::REVERB_HFGAIN},\n\t{\"density\", Effect::REVERB_DENSITY},\n\t{\"diffusion\", Effect::REVERB_DIFFUSION},\n\t{\"decaytime\", Effect::REVERB_DECAY},\n\t{\"decayhighratio\", Effect::REVERB_HFDECAY},\n\t{\"earlygain\", Effect::REVERB_EARLYGAIN},\n\t{\"earlydelay\", Effect::REVERB_EARLYDELAY},\n\t{\"lategain\", Effect::REVERB_LATEGAIN},\n\t{\"latedelay\", Effect::REVERB_LATEDELAY},\n\t{\"roomrolloff\", Effect::REVERB_ROLLOFF},\n\t{\"airabsorption\", Effect::REVERB_AIRHFGAIN},\n\t{\"highlimit\", Effect::REVERB_HFLIMITER}\n};\n\nstd::vector<StringMap<Effect::Parameter>::Entry> Effect::chorusParameters =\n{\n\t{\"waveform\", Effect::CHORUS_WAVEFORM},\n\t{\"phase\", Effect::CHORUS_PHASE},\n\t{\"rate\", Effect::CHORUS_RATE},\n\t{\"depth\", Effect::CHORUS_DEPTH},\n\t{\"feedback\", Effect::CHORUS_FEEDBACK},\n\t{\"delay\", Effect::CHORUS_DELAY}\n};\n\nstd::vector<StringMap<Effect::Parameter>::Entry> Effect::distortionParameters =\n{\n\t{\"gain\", Effect::DISTORTION_GAIN},\n\t{\"edge\", Effect::DISTORTION_EDGE},\n\t{\"lowcut\", Effect::DISTORTION_LOWCUT},\n\t{\"center\", Effect::DISTORTION_EQCENTER},\n\t{\"bandwidth\", Effect::DISTORTION_EQBAND}\n};\n\nstd::vector<StringMap<Effect::Parameter>::Entry> Effect::echoParameters =\n{\n\t{\"delay\", Effect::ECHO_DELAY},\n\t{\"tapdelay\", Effect::ECHO_LRDELAY},\n\t{\"damping\", Effect::ECHO_DAMPING},\n\t{\"feedback\", Effect::ECHO_FEEDBACK},\n\t{\"spread\", Effect::ECHO_SPREAD}\n};\n\nstd::vector<StringMap<Effect::Parameter>::Entry> Effect::flangerParameters =\n{\n\t{\"waveform\", Effect::FLANGER_WAVEFORM},\n\t{\"phase\", Effect::FLANGER_PHASE},\n\t{\"rate\", Effect::FLANGER_RATE},\n\t{\"depth\", Effect::FLANGER_DEPTH},\n\t{\"feedback\", Effect::FLANGER_FEEDBACK},\n\t{\"delay\", Effect::FLANGER_DELAY}\n};\n/*\nstd::vector<StringMap<Effect::Parameter>::Entry> Effect::freqshifterParameters =\n{\n\t{\"frequency\", Effect::FREQSHIFTER_FREQ},\n\t{\"leftdirection\", Effect::FREQSHIFTER_LEFTDIR},\n\t{\"rightdirection\", Effect::FREQSHIFTER_RIGHTDIR}\n};\n\nstd::vector<StringMap<Effect::Parameter>::Entry> Effect::morpherParameters =\n{\n\t{\"waveform\", Effect::MORPHER_WAVEFORM},\n\t{\"rate\", Effect::MORPHER_RATE},\n\t{\"phonemea\", Effect::MORPHER_PHONEMEA},\n\t{\"phonemeb\", Effect::MORPHER_PHONEMEB},\n\t{\"tunea\", Effect::MORPHER_COARSEA},\n\t{\"tuneb\", Effect::MORPHER_COARSEB}\n}\n;\nstd::vector<StringMap<Effect::Parameter>::Entry> Effect::pitchshifterParameters =\n{\n\t{\"pitch\", Effect::PITCHSHIFTER_PITCH}\n};\n*/\nstd::vector<StringMap<Effect::Parameter>::Entry> Effect::modulatorParameters =\n{\n\t{\"waveform\", Effect::MODULATOR_WAVEFORM},\n\t{\"frequency\", Effect::MODULATOR_FREQ},\n\t{\"highcut\", Effect::MODULATOR_HIGHCUT}\n};\n/*\nstd::vector<StringMap<Effect::Parameter>::Entry> Effect::autowahParameters =\n{\n\t{\"attack\", Effect::AUTOWAH_ATTACK},\n\t{\"release\", Effect::AUTOWAH_RELEASE},\n\t{\"resonance\", Effect::AUTOWAH_RESONANCE},\n\t{\"peakgain\", Effect::AUTOWAH_PEAKGAIN}\n};\n*/\nstd::vector<StringMap<Effect::Parameter>::Entry> Effect::compressorParameters =\n{\n\t{\"enable\", Effect::COMPRESSOR_ENABLE}\n};\n\nstd::vector<StringMap<Effect::Parameter>::Entry> Effect::equalizerParameters =\n{\n\t{\"lowgain\", Effect::EQUALIZER_LOWGAIN},\n\t{\"lowcut\", Effect::EQUALIZER_LOWCUT},\n\t{\"lowmidgain\", Effect::EQUALIZER_MID1GAIN},\n\t{\"lowmidfrequency\", Effect::EQUALIZER_MID1FREQ},\n\t{\"lowmidbandwidth\", Effect::EQUALIZER_MID1BAND},\n\t{\"highmidgain\", Effect::EQUALIZER_MID2GAIN},\n\t{\"highmidfrequency\", Effect::EQUALIZER_MID2FREQ},\n\t{\"highmidbandwidth\", Effect::EQUALIZER_MID2BAND},\n\t{\"highgain\", Effect::EQUALIZER_HIGHGAIN},\n\t{\"highcut\", Effect::EQUALIZER_HIGHCUT}\n};\n\nstd::map<Effect::Type, StringMap<Effect::Parameter>> Effect::parameterNames =\n{\n\t{Effect::TYPE_BASIC, Effect::basicParameters},\n\t{Effect::TYPE_REVERB, Effect::reverbParameters},\n\t{Effect::TYPE_CHORUS, Effect::chorusParameters},\n\t{Effect::TYPE_DISTORTION, Effect::distortionParameters},\n\t{Effect::TYPE_ECHO, Effect::echoParameters},\n\t{Effect::TYPE_FLANGER, Effect::flangerParameters},\n\t//{Effect::TYPE_FREQSHIFTER, Effect::freqshifterParameters},\n\t//{Effect::TYPE_MORPHER, Effect::morpherbParameters},\n\t//{Effect::TYPE_PITCHSHIFTER, Effect::pitchshifterParameters},\n\t{Effect::TYPE_MODULATOR, Effect::modulatorParameters},\n\t//{Effect::TYPE_AUTOWAH, Effect::autowahParameters},\n\t{Effect::TYPE_COMPRESSOR, Effect::compressorParameters},\n\t{Effect::TYPE_EQUALIZER, Effect::equalizerParameters}\n};\n#undef StringMap\n\nstd::map<Effect::Parameter, Effect::ParameterType> Effect::parameterTypes =\n{\n\t{Effect::EFFECT_TYPE, Effect::PARAM_TYPE},\n\t{Effect::EFFECT_VOLUME, Effect::PARAM_FLOAT},\n\n\t{Effect::REVERB_GAIN, Effect::PARAM_FLOAT},\n\t{Effect::REVERB_HFGAIN, Effect::PARAM_FLOAT},\n\t{Effect::REVERB_DENSITY, Effect::PARAM_FLOAT},\n\t{Effect::REVERB_DIFFUSION, Effect::PARAM_FLOAT},\n\t{Effect::REVERB_DECAY, Effect::PARAM_FLOAT},\n\t{Effect::REVERB_HFDECAY, Effect::PARAM_FLOAT},\n\t{Effect::REVERB_EARLYGAIN, Effect::PARAM_FLOAT},\n\t{Effect::REVERB_EARLYDELAY, Effect::PARAM_FLOAT},\n\t{Effect::REVERB_LATEGAIN, Effect::PARAM_FLOAT},\n\t{Effect::REVERB_LATEDELAY, Effect::PARAM_FLOAT},\n\t{Effect::REVERB_ROLLOFF, Effect::PARAM_FLOAT},\n\t{Effect::REVERB_AIRHFGAIN, Effect::PARAM_FLOAT},\n\t{Effect::REVERB_HFLIMITER, Effect::PARAM_BOOL},\n\n\t{Effect::CHORUS_WAVEFORM, Effect::PARAM_WAVEFORM},\n\t{Effect::CHORUS_PHASE, Effect::PARAM_FLOAT},\n\t{Effect::CHORUS_RATE, Effect::PARAM_FLOAT},\n\t{Effect::CHORUS_DEPTH, Effect::PARAM_FLOAT},\n\t{Effect::CHORUS_FEEDBACK, Effect::PARAM_FLOAT},\n\t{Effect::CHORUS_DELAY, Effect::PARAM_FLOAT},\n\n\t{Effect::DISTORTION_GAIN, Effect::PARAM_FLOAT},\n\t{Effect::DISTORTION_EDGE, Effect::PARAM_FLOAT},\n\t{Effect::DISTORTION_LOWCUT, Effect::PARAM_FLOAT},\n\t{Effect::DISTORTION_EQCENTER, Effect::PARAM_FLOAT},\n\t{Effect::DISTORTION_EQBAND, Effect::PARAM_FLOAT},\n\n\t{Effect::ECHO_DELAY, Effect::PARAM_FLOAT},\n\t{Effect::ECHO_LRDELAY, Effect::PARAM_FLOAT},\n\t{Effect::ECHO_DAMPING, Effect::PARAM_FLOAT},\n\t{Effect::ECHO_FEEDBACK, Effect::PARAM_FLOAT},\n\t{Effect::ECHO_SPREAD, Effect::PARAM_FLOAT},\n\n\t{Effect::FLANGER_WAVEFORM, Effect::PARAM_WAVEFORM},\n\t{Effect::FLANGER_PHASE, Effect::PARAM_FLOAT},\n\t{Effect::FLANGER_RATE, Effect::PARAM_FLOAT},\n\t{Effect::FLANGER_DEPTH, Effect::PARAM_FLOAT},\n\t{Effect::FLANGER_FEEDBACK, Effect::PARAM_FLOAT},\n\t{Effect::FLANGER_DELAY, Effect::PARAM_FLOAT},\n/*\n\t{Effect::FREQSHIFTER_FREQ, Effect::PARAM_FLOAT},\n\t{Effect::FREQSHIFTER_LEFTDIR, Effect::PARAM_DIRECTION},\n\t{Effect::FREQSHIFTER_RIGHTDIR, Effect::PARAM_DIRECTION},\n\n\t{Effect::MORPHER_WAVEFORM, Effect::PARAM_WAVEFORM},\n\t{Effect::MORPHER_RATE, Effect::PARAM_FLOAT},\n\t{Effect::MORPHER_PHONEMEA, Effect::PARAM_PHONEME},\n\t{Effect::MORPHER_PHONEMEB, Effect::PARAM_PHONEME},\n\t{Effect::MORPHER_TUNEA, Effect::PARAM_FLOAT},\n\t{Effect::MORPHER_TUNEB, Effect::PARAM_FLOAT},\n\n\t{Effect::PITCHSHIFTER_PITCH, Effect::PARAM_FLOAT},\n*/\n\t{Effect::MODULATOR_WAVEFORM, Effect::PARAM_WAVEFORM},\n\t{Effect::MODULATOR_FREQ, Effect::PARAM_FLOAT},\n\t{Effect::MODULATOR_HIGHCUT, Effect::PARAM_FLOAT},\n/*\n\t{Effect::AUTOWAH_ATTACK, Effect::PARAM_FLOAT},\n\t{Effect::AUTOWAH_RELEASE, Effect::PARAM_FLOAT},\n\t{Effect::AUTOWAH_RESONANCE, Effect::PARAM_FLOAT},\n\t{Effect::AUTOWAH_PEAKGAIN, Effect::PARAM_FLOAT},\n*/\n\t{Effect::COMPRESSOR_ENABLE, Effect::PARAM_BOOL},\n\n\t{Effect::EQUALIZER_LOWGAIN, Effect::PARAM_FLOAT},\n\t{Effect::EQUALIZER_LOWCUT, Effect::PARAM_FLOAT},\n\t{Effect::EQUALIZER_MID1GAIN, Effect::PARAM_FLOAT},\n\t{Effect::EQUALIZER_MID1FREQ, Effect::PARAM_FLOAT},\n\t{Effect::EQUALIZER_MID1BAND, Effect::PARAM_FLOAT},\n\t{Effect::EQUALIZER_MID2GAIN, Effect::PARAM_FLOAT},\n\t{Effect::EQUALIZER_MID2FREQ, Effect::PARAM_FLOAT},\n\t{Effect::EQUALIZER_MID2BAND, Effect::PARAM_FLOAT},\n\t{Effect::EQUALIZER_HIGHGAIN, Effect::PARAM_FLOAT},\n\t{Effect::EQUALIZER_HIGHCUT, Effect::PARAM_FLOAT}\n};\n\n} //audio\n} //love\n"
  },
  {
    "path": "src/modules/audio/Effect.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_AUDIO_EFFECTS_H\n#define LOVE_AUDIO_EFFECTS_H\n\n#include \"common/Object.h\"\n#include \"common/StringMap.h\"\n#include <map>\n#include <vector>\n\ntemplate<typename T>\nclass LazierAndSlowerButEasilyArrayableStringMap\n{\npublic:\n\tstruct Entry\n\t{\n\t\tconst char *key;\n\t\tT value;\n\t};\n\tLazierAndSlowerButEasilyArrayableStringMap()\n\t{\n\t}\n\n\tLazierAndSlowerButEasilyArrayableStringMap(const std::vector<Entry> &entries)\n\t{\n\t\tfor (auto entry : entries)\n\t\t{\n\t\t\tforward[entry.key] = entry.value;\n\t\t\treverse[entry.value] = entry.key;\n\t\t}\n\t}\n\n\tbool find(const char *key, T &t)\n\t{\n\t\tif (forward.find(key) == forward.end())\n\t\t\treturn false;\n\t\tt = forward[key];\n\t\treturn true;\n\t}\n\n\tbool find(T key, const char *&str)\n\t{\n\t\tif (reverse.find(key) == reverse.end())\n\t\t\treturn false;\n\t\tstr = reverse[key];\n\t\treturn true;\n\t}\n\nprivate:\n\tstd::map<std::string, T> forward;\n\tstd::map<T, const char*> reverse;\n};\n\nnamespace love\n{\nnamespace audio\n{\n\nclass Effect\n{\npublic:\n\tenum Type\n\t{\n\t\tTYPE_BASIC, //not a real type\n\t\tTYPE_REVERB,\n\t\tTYPE_CHORUS,\n\t\tTYPE_DISTORTION,\n\t\tTYPE_ECHO,\n\t\tTYPE_FLANGER,\n\t\t//TYPE_FREQSHIFTER,\n\t\t//TYPE_MORPHER,\n\t\t//TYPE_PITCHSHIFTER,\n\t\tTYPE_MODULATOR,\n\t\t//TYPE_AUTOWAH,\n\t\tTYPE_COMPRESSOR,\n\t\tTYPE_EQUALIZER,\n\t\tTYPE_MAX_ENUM\n\t};\n\n\tenum Parameter\n\t{\n\t\tEFFECT_TYPE,\n\t\tEFFECT_VOLUME,\n\n\t\tREVERB_GAIN,\n\t\tREVERB_HFGAIN,\n\t\tREVERB_DENSITY,\n\t\tREVERB_DIFFUSION,\n\t\tREVERB_DECAY,\n\t\tREVERB_HFDECAY,\n\t\tREVERB_EARLYGAIN,\n\t\tREVERB_EARLYDELAY,\n\t\tREVERB_LATEGAIN,\n\t\tREVERB_LATEDELAY,\n\t\tREVERB_ROLLOFF,\n\t\tREVERB_AIRHFGAIN,\n\t\tREVERB_HFLIMITER,\n\n\t\tCHORUS_WAVEFORM,\n\t\tCHORUS_PHASE,\n\t\tCHORUS_RATE,\n\t\tCHORUS_DEPTH,\n\t\tCHORUS_FEEDBACK,\n\t\tCHORUS_DELAY,\n\n\t\tDISTORTION_GAIN,\n\t\tDISTORTION_EDGE,\n\t\tDISTORTION_LOWCUT,\n\t\tDISTORTION_EQCENTER,\n\t\tDISTORTION_EQBAND,\n\n\t\tECHO_DELAY,\n\t\tECHO_LRDELAY,\n\t\tECHO_DAMPING,\n\t\tECHO_FEEDBACK,\n\t\tECHO_SPREAD,\n\n\t\tFLANGER_WAVEFORM,\n\t\tFLANGER_PHASE,\n\t\tFLANGER_RATE,\n\t\tFLANGER_DEPTH,\n\t\tFLANGER_FEEDBACK,\n\t\tFLANGER_DELAY,\n/*\n\t\tFREQSHIFTER_FREQ,\n\t\tFREQSHIFTER_LEFTDIR,\n\t\tFREQSHIFTER_RIGHTDIR,\n\n\t\tMORPHER_WAVEFORM,\n\t\tMORPHER_RATE,\n\t\tMORPHER_PHONEMEA,\n\t\tMORPHER_PHONEMEB,\n\t\tMORPHER_TUNEA,\n\t\tMORPHER_TUNEB,\n\n\t\tPITCHSHIFTER_PITCH,\n*/\n\t\tMODULATOR_WAVEFORM,\n\t\tMODULATOR_FREQ,\n\t\tMODULATOR_HIGHCUT,\n/*\n\t\tAUTOWAH_ATTACK,\n\t\tAUTOWAH_RELEASE,\n\t\tAUTOWAH_RESONANCE,\n\t\tAUTOWAH_PEAKGAIN,\n*/\n\t\tCOMPRESSOR_ENABLE,\n\n\t\tEQUALIZER_LOWGAIN,\n\t\tEQUALIZER_LOWCUT,\n\t\tEQUALIZER_MID1GAIN,\n\t\tEQUALIZER_MID1FREQ,\n\t\tEQUALIZER_MID1BAND,\n\t\tEQUALIZER_MID2GAIN,\n\t\tEQUALIZER_MID2FREQ,\n\t\tEQUALIZER_MID2BAND,\n\t\tEQUALIZER_HIGHGAIN,\n\t\tEQUALIZER_HIGHCUT,\n\n\t\tEFFECT_MAX_ENUM\n\t};\n\n\tenum ParameterType\n\t{\n\t\tPARAM_TYPE,\n\t\tPARAM_FLOAT,\n\t\tPARAM_BOOL,\n\t\tPARAM_WAVEFORM,\n\t\t//PARAM_DIRECTION,\n\t\t//PARAM_PHONEME,\n\t\tPARAM_MAX_ENUM\n\t};\n\n\tenum Waveform\n\t{\n\t\tWAVE_SINE,\n\t\tWAVE_TRIANGLE,\n\t\tWAVE_SAWTOOTH,\n\t\tWAVE_SQUARE,\n\t\tWAVE_MAX_ENUM\n\t};\n\t/*\n\tenum Direction\n\t{\n\t\tDIR_NONE,\n\t\tDIR_UP,\n\t\tDIR_DOWN,\n\t\tDIR_MAX_ENUM\n\t};\n\n\tenum Phoneme\n\t{\n\t\tPHONEME_A,\n\t\tPHONEME_E,\n\t\tPHONEME_I,\n\t\tPHONEME_O,\n\t\tPHONEME_U,\n\t\tPHONEME_AA,\n\t\tPHONEME_AE,\n\t\tPHONEME_AH,\n\t\tPHONEME_AO,\n\t\tPHONEME_EH,\n\t\tPHONEME_ER,\n\t\tPHONEME_IH,\n\t\tPHONEME_IY,\n\t\tPHONEME_UH,\n\t\tPHONEME_UW,\n\t\tPHONEME_B,\n\t\tPHONEME_D,\n\t\tPHONEME_F,\n\t\tPHONEME_G,\n\t\tPHONEME_J,\n\t\tPHONEME_K,\n\t\tPHONEME_L,\n\t\tPHONEME_M,\n\t\tPHONEME_N,\n\t\tPHONEME_P,\n\t\tPHONEME_R,\n\t\tPHONEME_S,\n\t\tPHONEME_T,\n\t\tPHONEME_V,\n\t\tPHONEME_Z,\n\t\tPHONEME_MAX_ENUM\n\t};\n\t*/\n\n\tEffect();\n\tvirtual ~Effect();\n\tType getType() const;\n\n\tstatic bool getConstant(const char *in, Type &out);\n\tstatic bool getConstant(Type in, const char *&out);\n\tstatic std::vector<std::string> getConstants(Type);\n\tstatic bool getConstant(const char *in, Waveform &out);\n\tstatic bool getConstant(Waveform in, const char *&out);\n\t//static bool getConstant(const char *in, Direction &out);\n\t//static bool getConstant(Direction in, const char *&out);\n\t//static bool getConstant(const char *in, Phoneme &out);\n\t//static bool getConstant(Phoneme in, const char *&out);\n\tstatic bool getConstant(const char *in, Parameter &out, Type t);\n\tstatic bool getConstant(Parameter in, const char *&out, Type t);\n\tstatic ParameterType getParameterType(Parameter in);\n\nprotected:\n\tType type;\n\nprivate:\n\tstatic StringMap<Type, TYPE_MAX_ENUM>::Entry typeEntries[];\n\tstatic StringMap<Type, TYPE_MAX_ENUM> types;\n\tstatic StringMap<Waveform, WAVE_MAX_ENUM>::Entry waveformEntries[];\n\tstatic StringMap<Waveform, WAVE_MAX_ENUM> waveforms;\n\t//static StringMap<Direction, DIR_MAX_ENUM>::Entry directionEntries[];\n\t//static StringMap<Direction, DIR_MAX_ENUM> directions;\n\t//static StringMap<Phoneme, PHONEME_MAX_ENUM>::Entry phonemeEntries[];\n\t//static StringMap<Phoneme, PHONEME_MAX_ENUM> phonemes;\n#define StringMap LazierAndSlowerButEasilyArrayableStringMap\n\tstatic std::vector<StringMap<Effect::Parameter>::Entry> basicParameters;\n\tstatic std::vector<StringMap<Effect::Parameter>::Entry> reverbParameters;\n\tstatic std::vector<StringMap<Effect::Parameter>::Entry> chorusParameters;\n\tstatic std::vector<StringMap<Effect::Parameter>::Entry> distortionParameters;\n\tstatic std::vector<StringMap<Effect::Parameter>::Entry> echoParameters;\n\tstatic std::vector<StringMap<Effect::Parameter>::Entry> flangerParameters;\n\t//static std::vector<StringMap<Effect::Parameter>::Entry> freqshifterParameters;\n\t//static std::vector<StringMap<Effect::Parameter>::Entry> morpherParameters;\n\t//static std::vector<StringMap<Effect::Parameter>::Entry> pitchshifterParameters;\n\tstatic std::vector<StringMap<Effect::Parameter>::Entry> modulatorParameters;\n\t//static std::vector<StringMap<Effect::Parameter>::Entry> autowahParameters;\n\tstatic std::vector<StringMap<Effect::Parameter>::Entry> compressorParameters;\n\tstatic std::vector<StringMap<Effect::Parameter>::Entry> equalizerParameters;\n\tstatic std::map<Type, StringMap<Parameter>> parameterNames;\n#undef StringMap\n\tstatic std::map<Parameter, ParameterType> parameterTypes;\n\n};\n\n} //audio\n} //love\n\n#endif //LOVE_AUDIO_EFFECTS_H\n"
  },
  {
    "path": "src/modules/audio/Filter.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Filter.h\"\n\nnamespace love\n{\nnamespace audio\n{\n\nFilter::Filter()\n{\n}\n\nFilter::~Filter()\n{\n}\n\nFilter::Type Filter::getType() const\n{\n\treturn type;\n}\n\nbool Filter::getConstant(const char *in, Type &out)\n{\n\treturn types.find(in, out);\n}\n\nbool Filter::getConstant(Type in, const char *&out)\n{\n\treturn types.find(in, out);\n}\n\nstd::vector<std::string> Filter::getConstants(Type)\n{\n\treturn types.getNames();\n}\n\nbool Filter::getConstant(const char *in, Parameter &out, Type t)\n{\n\treturn parameterNames[t].find(in, out);\n}\n\nbool Filter::getConstant(Parameter in, const char *&out, Type t)\n{\n\treturn parameterNames[t].find(in, out);\n}\n\nFilter::ParameterType Filter::getParameterType(Parameter in)\n{\n\treturn parameterTypes[in];\n}\n\nStringMap<Filter::Type, Filter::TYPE_MAX_ENUM>::Entry Filter::typeEntries[] =\n{\n\t{\"lowpass\", Filter::TYPE_LOWPASS},\n\t{\"highpass\", Filter::TYPE_HIGHPASS},\n\t{\"bandpass\", Filter::TYPE_BANDPASS},\n};\n\nStringMap<Filter::Type, Filter::TYPE_MAX_ENUM> Filter::types(Filter::typeEntries, sizeof(Filter::typeEntries));\n\n#define StringMap LazierAndSlowerButEasilyArrayableStringMap2\nstd::vector<StringMap<Filter::Parameter>::Entry> Filter::basicParameters =\n{\n\t{\"type\", Filter::FILTER_TYPE},\n\t{\"volume\", Filter::FILTER_VOLUME}\n};\n\nstd::vector<StringMap<Filter::Parameter>::Entry> Filter::lowpassParameters =\n{\n\t{\"highgain\", Filter::FILTER_HIGHGAIN}\n};\n\nstd::vector<StringMap<Filter::Parameter>::Entry> Filter::highpassParameters =\n{\n\t{\"lowgain\", Filter::FILTER_LOWGAIN}\n};\n\nstd::vector<StringMap<Filter::Parameter>::Entry> Filter::bandpassParameters =\n{\n\t{\"lowgain\", Filter::FILTER_LOWGAIN},\n\t{\"highgain\", Filter::FILTER_HIGHGAIN}\n};\n\nstd::map<Filter::Type, StringMap<Filter::Parameter>> Filter::parameterNames =\n{\n\t{Filter::TYPE_BASIC, Filter::basicParameters},\n\t{Filter::TYPE_LOWPASS, Filter::lowpassParameters},\n\t{Filter::TYPE_HIGHPASS, Filter::highpassParameters},\n\t{Filter::TYPE_BANDPASS, Filter::bandpassParameters},\n};\n#undef StringMap\n\nstd::map<Filter::Parameter, Filter::ParameterType> Filter::parameterTypes =\n{\n\t{Filter::FILTER_TYPE, Filter::PARAM_TYPE},\n\t{Filter::FILTER_VOLUME, Filter::PARAM_FLOAT},\n\t{Filter::FILTER_LOWGAIN, Filter::PARAM_FLOAT},\n\t{Filter::FILTER_HIGHGAIN, Filter::PARAM_FLOAT}\n};\n\n} //audio\n} //love\n"
  },
  {
    "path": "src/modules/audio/Filter.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_AUDIO_FILTERS_H\n#define LOVE_AUDIO_FILTERS_H\n\n#include \"common/Object.h\"\n#include \"common/StringMap.h\"\n#include <map>\n\ntemplate<typename T>\nclass LazierAndSlowerButEasilyArrayableStringMap2\n{\npublic:\n\tstruct Entry\n\t{\n\t\tconst char *key;\n\t\tT value;\n\t};\n\tLazierAndSlowerButEasilyArrayableStringMap2()\n\t{\n\t}\n\n\tLazierAndSlowerButEasilyArrayableStringMap2(const std::vector<Entry> &entries)\n\t{\n\t\tfor (auto entry : entries)\n\t\t{\n\t\t\tforward[entry.key] = entry.value;\n\t\t\treverse[entry.value] = entry.key;\n\t\t}\n\t}\n\n\tbool find(const char *key, T &t)\n\t{\n\t\tif (forward.find(key) == forward.end())\n\t\t\treturn false;\n\t\tt = forward[key];\n\t\treturn true;\n\t}\n\n\tbool find(T key, const char *&str)\n\t{\n\t\tif (reverse.find(key) == reverse.end())\n\t\t\treturn false;\n\t\tstr = reverse[key];\n\t\treturn true;\n\t}\n\nprivate:\n\tstd::map<std::string, T> forward;\n\tstd::map<T, const char*> reverse;\n};\n\nnamespace love\n{\nnamespace audio\n{\n\nclass Filter\n{\npublic:\n\tenum Type\n\t{\n\t\tTYPE_BASIC,\n\t\tTYPE_LOWPASS,\n\t\tTYPE_HIGHPASS,\n\t\tTYPE_BANDPASS,\n\t\tTYPE_MAX_ENUM\n\t};\n\n\tenum Parameter\n\t{\n\t\tFILTER_TYPE,\n\t\tFILTER_VOLUME,\n\n\t\tFILTER_LOWGAIN,\n\t\tFILTER_HIGHGAIN,\n\n\t\tFILTER_MAX_ENUM\n\t};\n\n\tenum ParameterType\n\t{\n\t\tPARAM_TYPE,\n\t\tPARAM_FLOAT,\n\t\tPARAM_MAX_ENUM\n\t};\n\n\tFilter();\n\tvirtual ~Filter();\n\tType getType() const;\n\n\tstatic bool getConstant(const char *in, Type &out);\n\tstatic bool getConstant(Type in, const char *&out);\n\tstatic std::vector<std::string> getConstants(Type);\n\tstatic bool getConstant(const char *in, Parameter &out, Type t);\n\tstatic bool getConstant(Parameter in, const char *&out, Type t);\n\tstatic ParameterType getParameterType(Parameter in);\n\nprotected:\n\tType type;\n\nprivate:\n\tstatic StringMap<Type, TYPE_MAX_ENUM>::Entry typeEntries[];\n\tstatic StringMap<Type, TYPE_MAX_ENUM> types;\n#define StringMap LazierAndSlowerButEasilyArrayableStringMap2\n\tstatic std::vector<StringMap<Filter::Parameter>::Entry> basicParameters;\n\tstatic std::vector<StringMap<Filter::Parameter>::Entry> lowpassParameters;\n\tstatic std::vector<StringMap<Filter::Parameter>::Entry> highpassParameters;\n\tstatic std::vector<StringMap<Filter::Parameter>::Entry> bandpassParameters;\n\tstatic std::map<Type, StringMap<Parameter>> parameterNames;\n#undef StringMap\n\tstatic std::map<Parameter, ParameterType> parameterTypes;\n};\n\n} //audio\n} //love\n\n#endif //LOVE_AUDIO_FILTERS_H\n"
  },
  {
    "path": "src/modules/audio/RecordingDevice.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"RecordingDevice.h\"\n\nnamespace love\n{\nnamespace audio\n{\n\nlove::Type RecordingDevice::type(\"RecordingDevice\", &Object::type);\n\nRecordingDevice::RecordingDevice()\n{\n}\n\nRecordingDevice::~RecordingDevice()\n{\n}\n\n} //audio\n} //love\n"
  },
  {
    "path": "src/modules/audio/RecordingDevice.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_AUDIO_RECORDING_DEVICE_H\n#define LOVE_AUDIO_RECORDING_DEVICE_H\n\n#include \"common/Object.h\"\n#include \"sound/SoundData.h\"\n\n#include <string>\n\nnamespace love\n{\nnamespace audio\n{\n\nclass RecordingDevice : public love::Object\n{\npublic:\n\n\tstatic love::Type type;\n\n\tstatic const int DEFAULT_SAMPLES = 8192;\n\tstatic const int DEFAULT_SAMPLE_RATE = 8000;\n\tstatic const int DEFAULT_BIT_DEPTH = 16;\n\tstatic const int DEFAULT_CHANNELS = 1;\n\n\tRecordingDevice();\n\tvirtual ~RecordingDevice();\n\n\t/**\n\t * Begins audio input recording process.\n\t * @param samples Number of samples to buffer.\n\t * @param sampleRate Desired sample rate.\n\t * @param bitDepth Desired bit depth (8 or 16).\n\t * @param channels Desired number of channels. \n\t * @return True if recording started successfully.\n\t **/\n\tvirtual bool start(int samples, int sampleRate, int bitDepth, int channels) = 0;\n\n\t/** \n\t * Stops audio input recording.\n\t **/\n\tvirtual void stop() = 0;\n\n\t/**\n\t * Retreives recorded data. \n\t * @return SoundData containing data obtained from recording device.\n\t **/\n\tvirtual love::sound::SoundData *getData() = 0;\n\n\t/**\n\t * @return C string device name.\n\t **/ \n\tvirtual const char *getName() const = 0;\n\n\t/**\n\t * @return Number of samples currently recorded.\n\t **/\n\tvirtual int getSampleCount() const = 0;\n\n\t/**\n\t * Gets the maximum number of samples that will be buffered, as set by start().\n\t **/\n\tvirtual int getMaxSamples() const = 0;\n\n\t/**\n\t * @return Sample rate for recording.\n\t **/\n\tvirtual int getSampleRate() const = 0;\n\n\t/**\n\t * @return Bit depth for recording.\n\t **/\n\tvirtual int getBitDepth() const = 0;\n\n\t/**\n\t * @return Number of channels for recording.\n\t **/\n\tvirtual int getChannelCount() const = 0;\n\n\t/**\n\t * @return True if currently recording.\n\t **/\n\tvirtual bool isRecording() const = 0;\n\n}; //RecordingDevice\n\n} //audio\n} //love\n\n#endif //LOVE_AUDIO_RECORDING_DEVICE_H\n"
  },
  {
    "path": "src/modules/audio/Source.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Source.h\"\n\nnamespace love\n{\nnamespace audio\n{\n\nlove::Type Source::type(\"Source\", &Object::type);\n\nSource::Source(Type sourceType)\n\t: sourceType(sourceType)\n{\n}\n\nSource::~Source()\n{\n}\n\nSource::Type Source::getType() const\n{\n\treturn sourceType;\n}\n\nbool Source::getConstant(const char *in, Type &out)\n{\n\treturn types.find(in, out);\n}\n\nbool Source::getConstant(Type in, const char  *&out)\n{\n\treturn types.find(in, out);\n}\n\nstd::vector<std::string> Source::getConstants(Type)\n{\n\treturn types.getNames();\n}\n\nbool Source::getConstant(const char *in, Unit &out)\n{\n\treturn units.find(in, out);\n}\n\nbool Source::getConstant(Unit in, const char  *&out)\n{\n\treturn units.find(in, out);\n}\n\nstd::vector<std::string> Source::getConstants(Unit)\n{\n\treturn units.getNames();\n}\n\nStringMap<Source::Type, Source::TYPE_MAX_ENUM>::Entry Source::typeEntries[] =\n{\n\t{\"static\", Source::TYPE_STATIC},\n\t{\"stream\", Source::TYPE_STREAM},\n\t{\"queue\",  Source::TYPE_QUEUE},\n};\n\nStringMap<Source::Type, Source::TYPE_MAX_ENUM> Source::types(Source::typeEntries, sizeof(Source::typeEntries));\n\nStringMap<Source::Unit, Source::UNIT_MAX_ENUM>::Entry Source::unitEntries[] =\n{\n\t{\"seconds\", Source::UNIT_SECONDS},\n\t{\"samples\", Source::UNIT_SAMPLES},\n};\n\nStringMap<Source::Unit, Source::UNIT_MAX_ENUM> Source::units(Source::unitEntries, sizeof(Source::unitEntries));\n\n} // audio\n} // love\n"
  },
  {
    "path": "src/modules/audio/Source.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_AUDIO_SOURCE_H\n#define LOVE_AUDIO_SOURCE_H\n\n// LOVE\n#include \"common/Object.h\"\n#include \"common/StringMap.h\"\n#include \"Filter.h\"\n\n#include <vector>\n\nnamespace love\n{\nnamespace audio\n{\n\nclass Source : public Object\n{\npublic:\n\n\tstatic love::Type type;\n\n\tenum Type\n\t{\n\t\tTYPE_STATIC,\n\t\tTYPE_STREAM,\n\t\tTYPE_QUEUE,\n\t\tTYPE_MAX_ENUM\n\t};\n\n\tenum Unit\n\t{\n\t\tUNIT_SECONDS,\n\t\tUNIT_SAMPLES,\n\t\tUNIT_MAX_ENUM\n\t};\n\n\tSource(Type type);\n\tvirtual ~Source();\n\n\tvirtual Source *clone() = 0;\n\n\tvirtual bool play() = 0;\n\tvirtual void stop() = 0;\n\tvirtual void pause() = 0;\n\tvirtual bool isPlaying() const = 0;\n\tvirtual bool isFinished() const = 0;\n\tvirtual bool update() = 0;\n\n\tvirtual void setPitch(float pitch) = 0;\n\tvirtual float getPitch() const = 0;\n\n\tvirtual void setVolume(float volume) = 0;\n\tvirtual float getVolume() const = 0;\n\n\tvirtual void seek(double offset, Unit unit) = 0;\n\tvirtual double tell(Unit unit) = 0;\n\tvirtual double getDuration(Unit unit) = 0;\n\n\t// all float * v must be of size 3\n\tvirtual void setPosition(float *v) = 0;\n\tvirtual void getPosition(float *v) const = 0;\n\tvirtual void setVelocity(float *v) = 0;\n\tvirtual void getVelocity(float *v) const = 0;\n\tvirtual void setDirection(float *v) = 0;\n\tvirtual void getDirection(float *v) const = 0;\n\n\tvirtual void setCone(float innerAngle, float outerAngle, float outerVolume, float outerHighGain) = 0;\n\tvirtual void getCone(float &innerAngle, float &outerAngle, float &outerVolume, float &outerHighGain) const = 0;\n\n\tvirtual void setRelative(bool enable) = 0;\n\tvirtual bool isRelative() const = 0;\n\n\tvirtual void setLooping(bool looping) = 0;\n\tvirtual bool isLooping() const = 0;\n\n\tvirtual void setMinVolume(float volume) = 0;\n\tvirtual float getMinVolume() const = 0;\n\tvirtual void setMaxVolume(float volume) = 0;\n\tvirtual float getMaxVolume() const = 0;\n\n\tvirtual void setReferenceDistance(float distance) = 0;\n\tvirtual float getReferenceDistance() const = 0;\n\tvirtual void setRolloffFactor(float factor) = 0;\n\tvirtual float getRolloffFactor() const = 0;\n\tvirtual void setMaxDistance(float distance) = 0;\n\tvirtual float getMaxDistance() const = 0;\n\tvirtual void setAirAbsorptionFactor(float factor) = 0;\n\tvirtual float getAirAbsorptionFactor() const = 0;\n\n\tvirtual int getChannelCount() const = 0;\n\n\tvirtual bool setFilter(const std::map<Filter::Parameter, float> &params) = 0;\n\tvirtual bool setFilter() = 0;\n\tvirtual bool getFilter(std::map<Filter::Parameter, float> &params) = 0;\n\n\tvirtual bool setEffect(const char *effect) = 0;\n\tvirtual bool setEffect(const char *effect, const std::map<Filter::Parameter, float> &params) = 0;\n\tvirtual bool unsetEffect(const char *effect) = 0;\n\tvirtual bool getEffect(const char *effect, std::map<Filter::Parameter, float> &params) = 0;\n\tvirtual bool getActiveEffects(std::vector<std::string> &list) const = 0;\n\n\tvirtual int getFreeBufferCount() const = 0;\n\tvirtual bool queue(void *data, size_t length, int dataSampleRate, int dataBitDepth, int dataChannels) = 0;\n\n\tvirtual Type getType() const;\n\n\tstatic bool getConstant(const char *in, Type &out);\n\tstatic bool getConstant(Type in, const char  *&out);\n\tstatic std::vector<std::string> getConstants(Type);\n\tstatic bool getConstant(const char *in, Unit &out);\n\tstatic bool getConstant(Unit in, const char  *&out);\n\tstatic std::vector<std::string> getConstants(Unit);\n\nprotected:\n\n\tType sourceType;\n\nprivate:\n\n\tstatic StringMap<Type, TYPE_MAX_ENUM>::Entry typeEntries[];\n\tstatic StringMap<Type, TYPE_MAX_ENUM> types;\n\tstatic StringMap<Unit, UNIT_MAX_ENUM>::Entry unitEntries[];\n\tstatic StringMap<Unit, UNIT_MAX_ENUM> units;\n\n}; // Source\n\n} // audio\n} // love\n\n#endif // LOVE_AUDIO_SOURCE_H\n"
  },
  {
    "path": "src/modules/audio/null/Audio.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Audio.h\"\n\nnamespace love\n{\nnamespace audio\n{\nnamespace null\n{\n\nAudio::Audio()\n\t: love::audio::Audio(\"love.audio.null\")\n\t, distanceModel(DISTANCE_NONE)\n{\n}\n\nAudio::~Audio()\n{\n}\n\nlove::audio::Source *Audio::newSource(love::sound::Decoder *)\n{\n\treturn new Source();\n}\n\nlove::audio::Source *Audio::newSource(love::sound::SoundData *)\n{\n\treturn new Source();\n}\n\nlove::audio::Source *Audio::newSource(int, int, int, int)\n{\n\treturn new Source();\n}\n\nint Audio::getActiveSourceCount() const\n{\n\treturn 0;\n}\n\nint Audio::getMaxSources() const\n{\n\treturn 0;\n}\n\nbool Audio::play(love::audio::Source *)\n{\n\treturn false;\n}\n\nbool Audio::play(const std::vector<love::audio::Source*>&)\n{\n\treturn false;\n}\n\nvoid Audio::stop(love::audio::Source *)\n{\n}\n\nvoid Audio::stop(const std::vector<love::audio::Source*>&)\n{\n}\n\nvoid Audio::stop()\n{\n}\n\nvoid Audio::pause(love::audio::Source *)\n{\n}\n\nvoid Audio::pause(const std::vector<love::audio::Source*>&)\n{\n}\n\nstd::vector<love::audio::Source*> Audio::pause()\n{\n\treturn {};\n}\n\nvoid Audio::setVolume(float volume)\n{\n\tthis->volume = volume;\n}\n\nfloat Audio::getVolume() const\n{\n\treturn volume;\n}\n\nvoid Audio::getPosition(float *) const\n{\n}\n\nvoid Audio::setPosition(float *)\n{\n}\n\nvoid Audio::getOrientation(float *) const\n{\n}\n\nvoid Audio::setOrientation(float *)\n{\n}\n\nvoid Audio::getVelocity(float *) const\n{\n}\n\nvoid Audio::setVelocity(float *)\n{\n}\n\nvoid Audio::setDopplerScale(float)\n{\n}\n\nfloat Audio::getDopplerScale() const\n{\n\treturn 1.0f;\n}\n/*\nvoid setMeter(float)\n{\n}\n\nfloat getMeter() const\n{\n\treturn 1.0f;\n}\n*/\nconst std::vector<love::audio::RecordingDevice*> &Audio::getRecordingDevices()\n{\n\treturn capture;\n}\n\nAudio::DistanceModel Audio::getDistanceModel() const\n{\n\treturn this->distanceModel;\n}\n\nvoid Audio::setDistanceModel(DistanceModel distanceModel)\n{\n\tthis->distanceModel = distanceModel;\n}\n\nbool Audio::setEffect(const char *, std::map<Effect::Parameter, float> &)\n{\n\treturn false;\n}\n\nbool Audio::unsetEffect(const char *)\n{\n\treturn false;\n}\n\nbool Audio::getEffect(const char *, std::map<Effect::Parameter, float> &)\n{\n\treturn false;\n}\n\nbool Audio::getActiveEffects(std::vector<std::string> &) const\n{\n\treturn false;\n}\n\nint Audio::getMaxSceneEffects() const\n{\n\treturn 0;\n}\n\nint Audio::getMaxSourceEffects() const\n{\n\treturn 0;\n}\n\nbool Audio::isEFXsupported() const\n{\n\treturn false;\n}\n\nbool Audio::setOutputSpatialization(bool, const char *)\n{\n\treturn false;\n}\n\nbool Audio::getOutputSpatialization(const char *&filter) const\n{\n\tfilter = nullptr;\n\treturn false;\n}\n\nvoid Audio::getOutputSpatializationFilters(std::vector<std::string> &) const\n{\n}\n\nvoid Audio::pauseContext()\n{\n}\n\nvoid Audio::resumeContext()\n{\n}\n\nstd::string Audio::getPlaybackDevice()\n{\n\treturn \"\";\n}\n\nvoid Audio::getPlaybackDevices(std::vector<std::string> &/*list*/)\n{\n}\n\n\n} // null\n} // audio\n} // love\n"
  },
  {
    "path": "src/modules/audio/null/Audio.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_AUDIO_NULL_AUDIO_H\n#define LOVE_AUDIO_NULL_AUDIO_H\n\n// LOVE\n#include \"audio/Audio.h\"\n\n#include \"RecordingDevice.h\"\n#include \"Source.h\"\n\nnamespace love\n{\nnamespace audio\n{\nnamespace null\n{\n\nclass Audio : public love::audio::Audio\n{\npublic:\n\n\tAudio();\n\tvirtual ~Audio();\n\n\t// Implements Audio.\n\tlove::audio::Source *newSource(love::sound::Decoder *decoder) override;\n\tlove::audio::Source *newSource(love::sound::SoundData *soundData) override;\n\tlove::audio::Source *newSource(int sampleRate, int bitDepth, int channels, int buffers) override;\n\tint getActiveSourceCount() const override;\n\tint getMaxSources() const override;\n\tbool play(love::audio::Source *source) override;\n\tbool play(const std::vector<love::audio::Source*> &sources) override;\n\tvoid stop(love::audio::Source *source) override;\n\tvoid stop(const std::vector<love::audio::Source*> &sources) override;\n\tvoid stop() override;\n\tvoid pause(love::audio::Source *source) override;\n\tvoid pause(const std::vector<love::audio::Source*> &sources) override;\n\tstd::vector<love::audio::Source*> pause() override;\n\tvoid setVolume(float volume) override;\n\tfloat getVolume() const override;\n\n\tvoid getPosition(float *v) const override;\n\tvoid setPosition(float *v) override;\n\tvoid getOrientation(float *v) const override;\n\tvoid setOrientation(float *v) override;\n\tvoid getVelocity(float *v) const override;\n\tvoid setVelocity(float *v) override;\n\n\tvoid setDopplerScale(float scale) override;\n\tfloat getDopplerScale() const override;\n\t//void setMeter(float scale);\n\t//float getMeter() const;\n\n\tconst std::vector<love::audio::RecordingDevice*> &getRecordingDevices() override;\n\n\tDistanceModel getDistanceModel() const override;\n\tvoid setDistanceModel(DistanceModel distanceModel) override;\n\n\tbool setEffect(const char *, std::map<Effect::Parameter, float> &params) override;\n\tbool unsetEffect(const char *) override;\n\tbool getEffect(const char *, std::map<Effect::Parameter, float> &params) override;\n\tbool getActiveEffects(std::vector<std::string> &list) const override;\n\tint getMaxSceneEffects() const override;\n\tint getMaxSourceEffects() const override;\n\tbool isEFXsupported() const override;\n\n\tbool setOutputSpatialization(bool enable, const char *filter = nullptr) override;\n\tbool getOutputSpatialization(const char *&filter) const override;\n\tvoid getOutputSpatializationFilters(std::vector<std::string> &list) const override;\n\n\tvoid pauseContext() override;\n\tvoid resumeContext() override;\n\n\tstd::string getPlaybackDevice() override;\n\tvoid getPlaybackDevices(std::vector<std::string> &list) override;\n\nprivate:\n\tfloat volume;\n\tDistanceModel distanceModel;\n\tstd::vector<love::audio::RecordingDevice*> capture;\n\n}; // Audio\n\n} // null\n} // audio\n} // love\n\n#endif // LOVE_AUDIO_NULL_AUDIO_H\n"
  },
  {
    "path": "src/modules/audio/null/RecordingDevice.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"RecordingDevice.h\"\n#include \"Audio.h\"\n\nnamespace love\n{\nnamespace audio\n{\nnamespace null\n{\n\nconst char *RecordingDevice::name = \"null\";\n\nRecordingDevice::RecordingDevice(const char *)\n{\n}\n\nRecordingDevice::~RecordingDevice()\n{\n}\n\nbool RecordingDevice::start(int, int, int, int)\n{\n\treturn false;\n}\n\nvoid RecordingDevice::stop()\n{\n}\n\nlove::sound::SoundData *RecordingDevice::getData()\n{\n\treturn nullptr;\n}\n\nint RecordingDevice::getSampleCount() const\n{\n\treturn 0;\n}\n\nint RecordingDevice::getMaxSamples() const\n{\n\treturn 0;\n}\n\nint RecordingDevice::getSampleRate() const\n{\n\treturn 0;\n}\n\nint RecordingDevice::getBitDepth() const\n{\n\treturn 0;\n}\n\nint RecordingDevice::getChannelCount() const\n{\n\treturn 0;\n}\n\nconst char *RecordingDevice::getName() const\n{\n\treturn name;\n}\n\nbool RecordingDevice::isRecording() const\n{\n\treturn false;\n}\n\n} //null\n} //audio\n} //love\n"
  },
  {
    "path": "src/modules/audio/null/RecordingDevice.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_AUDIO_NULL_RECORDING_DEVICE_H\n#define LOVE_AUDIO_NULL_RECORDING_DEVICE_H\n\n#include \"audio/RecordingDevice.h\"\n#include \"sound/SoundData.h\"\n\nnamespace love\n{\nnamespace audio\n{\nnamespace null\n{\n\nclass RecordingDevice : public love::audio::RecordingDevice\n{\npublic:\n\tRecordingDevice(const char *name);\n\tvirtual ~RecordingDevice();\n\tvirtual bool start(int samples, int sampleRate, int bitDepth, int channels);\n\tvirtual void stop();\n\tvirtual love::sound::SoundData *getData();\n\tvirtual const char *getName() const;\n\tvirtual int getMaxSamples() const;\n\tvirtual int getSampleCount() const;\n\tvirtual int getSampleRate() const;\n\tvirtual int getBitDepth() const;\n\tvirtual int getChannelCount() const;\n\tvirtual bool isRecording() const;\n\nprivate:\n\tstatic const char *name;\n}; //RecordingDevice\n\n} //null\n} //audio\n} //love\n\n#endif //LOVE_AUDIO_NULL_RECORDING_DEVICE_H\n"
  },
  {
    "path": "src/modules/audio/null/Source.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Source.h\"\n\nnamespace love\n{\nnamespace audio\n{\nnamespace null\n{\n\nSource::Source()\n\t: love::audio::Source(Source::TYPE_STATIC)\n{\n}\n\nSource::~Source()\n{\n}\n\nlove::audio::Source *Source::clone()\n{\n\tthis->retain();\n\treturn this;\n}\n\nbool Source::play()\n{\n\treturn false;\n}\n\nvoid Source::stop()\n{\n}\n\nvoid Source::pause()\n{\n}\n\nbool Source::isPlaying() const\n{\n\treturn false;\n}\n\nbool Source::isFinished() const\n{\n\treturn true;\n}\n\nbool Source::update()\n{\n\treturn false;\n}\n\nvoid Source::setPitch(float pitch)\n{\n\tthis->pitch = pitch;\n}\n\nfloat Source::getPitch() const\n{\n\treturn pitch;\n}\n\nvoid Source::setVolume(float volume)\n{\n\tthis->volume = volume;\n}\n\nfloat Source::getVolume() const\n{\n\treturn volume;\n}\n\nvoid Source::seek(double, Source::Unit)\n{\n}\n\ndouble Source::tell(Source::Unit)\n{\n\treturn 0.0f;\n}\n\ndouble Source::getDuration(Unit)\n{\n\treturn -1.0f;\n}\n\nvoid Source::setPosition(float *)\n{\n}\n\nvoid Source::getPosition(float *) const\n{\n}\n\nvoid Source::setVelocity(float *)\n{\n}\n\nvoid Source::getVelocity(float *) const\n{\n}\n\nvoid Source::setDirection(float *)\n{\n}\n\nvoid Source::getDirection(float *) const\n{\n}\n\nvoid Source::setCone(float innerAngle, float outerAngle, float outerVolume, float outerHighGain)\n{\n\tconeInnerAngle = innerAngle;\n\tconeOuterAngle = outerAngle;\n\tconeOuterVolume = outerVolume;\n\tconeOuterHighGain = outerHighGain;\n}\n\nvoid Source::getCone(float &innerAngle, float &outerAngle, float &outerVolume, float &outerHighGain) const\n{\n\tinnerAngle = coneInnerAngle;\n\touterAngle = coneOuterAngle;\n\touterVolume = coneOuterVolume;\n\touterHighGain = coneOuterHighGain;\n}\n\nvoid Source::setRelative(bool enable)\n{\n\trelative = enable;\n}\n\nbool Source::isRelative() const\n{\n\treturn relative;\n}\n\nvoid Source::setLooping(bool looping)\n{\n\tthis->looping = looping;\n}\n\nbool Source::isLooping() const\n{\n\treturn looping;\n}\n\nvoid Source::setMinVolume(float volume)\n{\n\tthis->minVolume = volume;\n}\n\nfloat Source::getMinVolume() const\n{\n\treturn this->minVolume;\n}\n\nvoid Source::setMaxVolume(float volume)\n{\n\tthis->maxVolume = volume;\n}\n\nfloat Source::getMaxVolume() const\n{\n\treturn this->maxVolume;\n}\n\nvoid Source::setReferenceDistance(float distance)\n{\n\tthis->referenceDistance = distance;\n}\n\nfloat Source::getReferenceDistance() const\n{\n\treturn this->referenceDistance;\n}\n\nvoid Source::setRolloffFactor(float factor)\n{\n\tthis->rolloffFactor = factor;\n}\n\nfloat Source::getRolloffFactor() const\n{\n\treturn this->rolloffFactor;\n}\n\nvoid Source::setMaxDistance(float distance)\n{\n\tthis->maxDistance = distance;\n}\n\nfloat Source::getMaxDistance() const\n{\n\treturn this->maxDistance;\n}\n\nvoid Source::setAirAbsorptionFactor(float factor)\n{\n\tabsorptionFactor = factor;\n}\n\nfloat Source::getAirAbsorptionFactor() const\n{\n\treturn absorptionFactor;\n}\n\nint Source::getChannelCount() const\n{\n\treturn 2;\n}\n\nint Source::getFreeBufferCount() const\n{\n\treturn 0;\n}\n\nbool Source::queue(void *, size_t, int, int, int)\n{\n\treturn false;\n}\n\nbool Source::setFilter(const std::map<Filter::Parameter, float> &)\n{\n\treturn false;\n}\n\nbool Source::setFilter()\n{\n\treturn false;\n}\n\nbool Source::getFilter(std::map<Filter::Parameter, float> &)\n{\n\treturn false;\n}\n\nbool Source::setEffect(const char *)\n{\n\treturn false;\n}\n\nbool Source::setEffect(const char *, const std::map<Filter::Parameter, float> &)\n{\n\treturn false;\n}\n\nbool Source::unsetEffect(const char *)\n{\n\treturn false;\n}\n\nbool Source::getEffect(const char *, std::map<Filter::Parameter, float> &)\n{\n\treturn false;\n}\n\nbool Source::getActiveEffects(std::vector<std::string> &) const\n{\n\treturn false;\n}\n\n} // null\n} // audio\n} // love\n"
  },
  {
    "path": "src/modules/audio/null/Source.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_AUDIO_NULL_SOURCE_H\n#define LOVE_AUDIO_NULL_SOURCE_H\n\n// LOVE\n#include \"common/math.h\"\n#include \"common/Object.h\"\n#include \"audio/Source.h\"\n#include \"audio/Filter.h\"\n\n// STL\n#include <limits>\n\nnamespace love\n{\nnamespace audio\n{\nnamespace null\n{\n\nclass Source : public love::audio::Source\n{\npublic:\n\tSource();\n\tvirtual ~Source();\n\n\tvirtual love::audio::Source *clone();\n\tvirtual bool play();\n\tvirtual void stop();\n\tvirtual void pause();\n\tvirtual bool isPlaying() const;\n\tvirtual bool isFinished() const;\n\tvirtual bool update();\n\tvirtual void setPitch(float pitch);\n\tvirtual float getPitch() const;\n\tvirtual void setVolume(float volume);\n\tvirtual float getVolume() const;\n\tvirtual void seek(double offset, Unit unit);\n\tvirtual double tell(Unit unit);\n\tvirtual double getDuration(Unit unit);\n\tvirtual void setPosition(float *v);\n\tvirtual void getPosition(float *v) const;\n\tvirtual void setVelocity(float *v);\n\tvirtual void getVelocity(float *v) const;\n\tvirtual void setDirection(float *v);\n\tvirtual void getDirection(float *v) const;\n\tvirtual void setCone(float innerAngle, float outerAngle, float outerVolume, float outerHighGain);\n\tvirtual void getCone(float &innerAngle, float &outerAngle, float &outerVolume, float &outerHighGain) const;\n\tvirtual void setRelative(bool enable);\n\tvirtual bool isRelative() const;\n\tvoid setLooping(bool looping);\n\tbool isLooping() const;\n\tvirtual void setMinVolume(float volume);\n\tvirtual float getMinVolume() const;\n\tvirtual void setMaxVolume(float volume);\n\tvirtual float getMaxVolume() const;\n\tvirtual void setReferenceDistance(float distance);\n\tvirtual float getReferenceDistance() const;\n\tvirtual void setRolloffFactor(float factor);\n\tvirtual float getRolloffFactor() const;\n\tvirtual void setMaxDistance(float distance);\n\tvirtual float getMaxDistance() const;\n\tvirtual void setAirAbsorptionFactor(float factor);\n\tvirtual float getAirAbsorptionFactor() const;\n\tvirtual int getChannelCount() const;\n\n\tvirtual int getFreeBufferCount() const;\n\tvirtual bool queue(void *data, size_t length, int dataSampleRate, int dataBitDepth, int dataChannels);\n\n\tvirtual bool setFilter(const std::map<Filter::Parameter, float> &params);\n\tvirtual bool setFilter();\n\tvirtual bool getFilter(std::map<Filter::Parameter, float> &params);\n\n\tvirtual bool setEffect(const char *effect);\n\tvirtual bool setEffect(const char *effect, const std::map<Filter::Parameter, float> &params);\n\tvirtual bool unsetEffect(const char *effect);\n\tvirtual bool getEffect(const char *effect, std::map<Filter::Parameter, float> &params);\n\tvirtual bool getActiveEffects(std::vector<std::string> &list) const;\n\nprivate:\n\n\tfloat pitch = 1.0f;\n\tfloat volume = 1.0f;\n\tfloat coneInnerAngle = LOVE_TORAD(360.0f);\n\tfloat coneOuterAngle = LOVE_TORAD(360.0f);\n\tfloat coneOuterVolume = 0.0f;\n\tfloat coneOuterHighGain = 1.0f;\n\tbool relative = false;\n\tbool looping = false;\n\tfloat minVolume = 0.0f;\n\tfloat maxVolume = 1.0f;\n\tfloat referenceDistance = 1.0f;\n\tfloat rolloffFactor = 1.0f;\n\tfloat maxDistance = std::numeric_limits<float>::max();\n\tfloat absorptionFactor = 0.0f;\n\n}; // Source\n\n} // null\n} // audio\n} // love\n\n#endif // LOVE_AUDIO_NULL_SOURCE_H\n"
  },
  {
    "path": "src/modules/audio/openal/Audio.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Audio.h\"\n#include \"common/delay.h\"\n#include \"RecordingDevice.h\"\n#include \"sound/Decoder.h\"\n\n#include <cstdlib>\n#include <iostream>\n\n#ifdef LOVE_IOS\n#include \"common/ios.h\"\n#endif\n\nnamespace love\n{\nnamespace audio\n{\nnamespace openal\n{\n\nAudio::PoolThread::PoolThread(Pool *pool)\n\t: pool(pool)\n\t, finish(false)\n{\n\tthreadName = \"AudioPool\";\n}\n\nAudio::PoolThread::~PoolThread()\n{\n}\n\n\nvoid Audio::PoolThread::threadFunction()\n{\n\twhile (true)\n\t{\n\t\t{\n\t\t\tthread::Lock lock(mutex);\n\t\t\tif (finish)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tpool->update();\n\t\tsleep(5);\n\t}\n}\n\nvoid Audio::PoolThread::setFinish()\n{\n\tthread::Lock lock(mutex);\n\tfinish = true;\n}\n\nALenum Audio::getFormat(int bitDepth, int channels)\n{\n\tif (bitDepth != 8 && bitDepth != 16)\n\t\treturn AL_NONE;\n\n\tif (channels == 1)\n\t\treturn bitDepth == 8 ? AL_FORMAT_MONO8 : AL_FORMAT_MONO16;\n\telse if (channels == 2)\n\t\treturn bitDepth == 8 ? AL_FORMAT_STEREO8 : AL_FORMAT_STEREO16;\n#ifdef AL_EXT_MCFORMATS\n\telse if (alIsExtensionPresent(\"AL_EXT_MCFORMATS\"))\n\t{\n\t\tif (channels == 6)\n\t\t\treturn bitDepth == 8 ? AL_FORMAT_51CHN8 : AL_FORMAT_51CHN16;\n\t\telse if (channels == 8)\n\t\t\treturn bitDepth == 8 ? AL_FORMAT_71CHN8 : AL_FORMAT_71CHN16;\n\t}\n#endif\n\treturn AL_NONE;\n}\n\nstatic const char *getDeviceSpecifier(ALCdevice *device)\n{\n#ifndef ALC_ALL_DEVICES_SPECIFIER\n\tconstexpr ALCenum ALC_ALL_DEVICES_SPECIFIER = 0x1013;\n#endif\n\tstatic ALCenum deviceEnum = alcIsExtensionPresent(nullptr, \"ALC_ENUMERATE_ALL_EXT\") == ALC_TRUE\n\t\t? ALC_ALL_DEVICES_SPECIFIER\n\t\t: ALC_DEVICE_SPECIFIER;\n\n\treturn alcGetString(device, deviceEnum);\n}\n\nAudio::Audio()\n\t: love::audio::Audio(\"love.audio.openal\")\n\t, device(nullptr)\n\t, context(nullptr)\n\t, pool(nullptr)\n\t, poolThread(nullptr)\n\t, distanceModel(DISTANCE_INVERSE_CLAMPED)\n{\n\t// Before opening new device, check if recording\n\t// is requested.\n\tif (getRequestRecordingPermission())\n\t{\n\t\tif (!hasRecordingPermission())\n\t\t\t// Request recording permission on some OSes.\n\t\t\trequestRecordingPermission();\n\t}\n\n\t{\n#if defined(LOVE_LINUX)\n\t\t// Temporarly block signals, as the thread inherits this mask\n\t\tlove::thread::ScopedDisableSignals disableSignals;\n#endif\n\n\t\t// Passing null for default device.\n\t\tdevice = alcOpenDevice(nullptr);\n\n\t\tif (device == nullptr)\n\t\t\tthrow love::Exception(\"Could not open device.\");\n\n\t\thasHRTFExtension = alcIsExtensionPresent(device, \"ALC_SOFT_HRTF\") == AL_TRUE;\n\n\t\tstd::vector<ALint> attribs = computeContextAttribs();\n\n\t\tcontext = alcCreateContext(device, attribs.data());\n\n\t\tif (context == nullptr)\n\t\t\tthrow love::Exception(\"Could not create context: %s\", alcGetString(device, alcGetError(device)));\n\n\t\tif (!alcMakeContextCurrent(context))\n\t\t\tthrow love::Exception(\"Could not make context current: %s\", alcGetString(device, alcGetError(device)));\n\t}\n\n#ifdef ALC_EXT_EFX\n\tinitializeEFX();\n\n\talcGetIntegerv(device, ALC_MAX_AUXILIARY_SENDS, 1, &MAX_SOURCE_EFFECTS);\n\n\talGetError();\n\tif (alGenAuxiliaryEffectSlots)\n\t{\n\t\tfor (int i = 0; i < MAX_SCENE_EFFECTS; i++)\n\t\t{\n\t\t\tALuint slot;\n\t\t\talGenAuxiliaryEffectSlots(1, &slot);\n\t\t\tif (alGetError() == AL_NO_ERROR)\n\t\t\t\tslotlist.push(slot);\n\t\t\telse\n\t\t\t{\n\t\t\t\tMAX_SCENE_EFFECTS = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t\tMAX_SCENE_EFFECTS = MAX_SOURCE_EFFECTS = 0;\n#else\n\tMAX_SCENE_EFFECTS = MAX_SOURCE_EFFECTS = 0;\n#endif\n\n\ttry\n\t{\n\t\tpool = new Pool(device);\n\t}\n\tcatch (love::Exception &)\n\t{\n\t\tfor (auto c : capture)\n\t\t\tdelete c;\n\n#ifdef ALC_EXT_EFX\n\t\tif (alDeleteAuxiliaryEffectSlots)\n\t\t{\n\t\t\twhile (!slotlist.empty())\n\t\t\t{\n\t\t\t\talDeleteAuxiliaryEffectSlots(1, &slotlist.top());\n\t\t\t\tslotlist.pop();\n\t\t\t}\n\t\t}\n#endif\n\n\t\talcMakeContextCurrent(nullptr);\n\t\talcDestroyContext(context);\n\t\talcCloseDevice(device);\n\t\tthrow;\n\t}\n\n\tpoolThread = new PoolThread(pool);\n\tpoolThread->start();\n\t\n#ifdef LOVE_IOS\n\tlove::ios::initAudioSessionInterruptionHandler();\n#endif\n\n#ifdef LOVE_ANDROID\n\tbool hasPauseDeviceExt = alcIsExtensionPresent(device, \"ALC_SOFT_pause_device\") == ALC_TRUE;\n\talcDevicePauseSOFT = hasPauseDeviceExt\n\t\t? (LPALCDEVICEPAUSESOFT) alcGetProcAddress(device, \"alcDevicePauseSOFT\")\n\t\t: nullptr;\n\talcDeviceResumeSOFT = hasPauseDeviceExt\n\t\t? (LPALCDEVICERESUMESOFT) alcGetProcAddress(device, \"alcDeviceResumeSOFT\")\n\t\t: nullptr;\n#endif\n}\n\nAudio::~Audio()\n{\n#ifdef LOVE_IOS\n\tlove::ios::destroyAudioSessionInterruptionHandler();\n#endif\n\tpoolThread->setFinish();\n\tpoolThread->wait();\n\n\tdelete poolThread;\n\tdelete pool;\n\n\tfor (auto c : capture)\n\t\tdelete c;\n\n#ifdef ALC_EXT_EFX\n\tfor (auto e : effectmap)\n\t{\n\t\tdelete e.second.effect;\n\t\tslotlist.push(e.second.slot);\n\t}\n\n\tif (alDeleteAuxiliaryEffectSlots)\n\t{\n\t\twhile (!slotlist.empty())\n\t\t{\n\t\t\talDeleteAuxiliaryEffectSlots(1, &slotlist.top());\n\t\t\tslotlist.pop();\n\t\t}\n\t}\n#endif\n\talcMakeContextCurrent(nullptr);\n\talcDestroyContext(context);\n\talcCloseDevice(device);\n}\n\nstd::vector<ALint> Audio::computeContextAttribs()\n{\n\tstd::vector<ALint> attribs;\n\n#ifdef ALC_EXT_EFX\n\tattribs.push_back(ALC_MAX_AUXILIARY_SENDS);\n\tattribs.push_back(MAX_REQUESTED_SOURCE_EFFECTS);\n#endif\n\n#ifdef ALC_SOFT_HRTF\n\tif (hasHRTFExtension)\n\t{\n\t\tattribs.push_back(ALC_HRTF_SOFT);\n\t\tattribs.push_back(requestEnableHRTF ? AL_TRUE : AL_FALSE);\n\t\tif (!requestedHRTFFilter.empty())\n\t\t{\n\t\t\tstd::vector<std::string> filters;\n\t\t\tgetOutputSpatializationFilters(filters);\n\n\t\t\tfor (size_t i = 0; i < filters.size(); i++)\n\t\t\t{\n\t\t\t\tif (filters[i] == requestedHRTFFilter)\n\t\t\t\t{\n\t\t\t\t\tattribs.push_back(ALC_HRTF_ID_SOFT);\n\t\t\t\t\tattribs.push_back((int)i);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n#endif\n\n\tattribs.push_back(0);\n\tattribs.push_back(0);\n\n\treturn attribs;\n}\n\nlove::audio::Source *Audio::newSource(love::sound::Decoder *decoder)\n{\n\treturn new Source(pool, decoder);\n}\n\nlove::audio::Source *Audio::newSource(love::sound::SoundData *soundData)\n{\n\treturn new Source(pool, soundData);\n}\n\nlove::audio::Source *Audio::newSource(int sampleRate, int bitDepth, int channels, int buffers)\n{\n\treturn new Source(pool, sampleRate, bitDepth, channels, buffers);\n}\n\nint Audio::getActiveSourceCount() const\n{\n\treturn pool->getActiveSourceCount();\n}\n\nint Audio::getMaxSources() const\n{\n\treturn pool->getMaxSources();\n}\n\nbool Audio::play(love::audio::Source *source)\n{\n\treturn source->play();\n}\n\nbool Audio::play(const std::vector<love::audio::Source*> &sources)\n{\n\treturn Source::play(sources);\n}\n\nvoid Audio::stop(love::audio::Source *source)\n{\n\tsource->stop();\n}\n\nvoid Audio::stop(const std::vector<love::audio::Source*> &sources)\n{\n\treturn Source::stop(sources);\n}\n\nvoid Audio::stop()\n{\n\treturn Source::stop(pool);\n}\n\nvoid Audio::pause(love::audio::Source *source)\n{\n\tsource->pause();\n}\n\nvoid Audio::pause(const std::vector<love::audio::Source*> &sources)\n{\n\treturn Source::pause(sources);\n}\n\nstd::vector<love::audio::Source*> Audio::pause()\n{\n\treturn Source::pause(pool);\n}\n\nvoid Audio::pauseContext()\n{\n#ifdef LOVE_ANDROID\n\tif (alcDevicePauseSOFT)\n\t\talcDevicePauseSOFT(device);\n\telse\n\t{\n\t\t// This is extremely rare case since we're using OpenAL-soft\n\t\t// in Android and the ALC_SOFT_pause_device has been supported\n\t\t// since 1.16\n\t\tfor (auto &src: pausedSources)\n\t\t\tsrc->release();\n\t\tpausedSources = pause();\n\t\tfor (auto &src: pausedSources)\n\t\t\tsrc->retain();\n\t}\n#else\n\talcMakeContextCurrent(nullptr);\n#endif\n}\n\nvoid Audio::resumeContext()\n{\n#ifdef LOVE_ANDROID\n\tif (alcDeviceResumeSOFT)\n\t\talcDeviceResumeSOFT(device);\n\telse\n\t{\n\t\t// Again, this is rare case\n\t\tplay(pausedSources);\n\t\tfor (auto &src: pausedSources)\n\t\t\tsrc->release();\n\t\tpausedSources.resize(0);\n\t}\n#else\n\tif (context && alcGetCurrentContext() != context)\n\t\talcMakeContextCurrent(context);\n#endif\n}\n\nstd::string Audio::getPlaybackDevice()\n{\n\tconst char *dev = getDeviceSpecifier(device);\n\n\tif (dev == nullptr)\n\t\tthrow Exception(\"Failed to get current device: %s\", alcGetString(device, alcGetError(device)));\n\n\treturn dev;\n}\n\nvoid Audio::getPlaybackDevices(std::vector<std::string> &list)\n{\n\tconst char *devices = getDeviceSpecifier(nullptr);\n\n\tif (devices == nullptr)\n\t\tthrow Exception(\"Failed to enumerate devices: %s\", alcGetString(nullptr, alcGetError(nullptr)));\n\n\tfor (const char *device = devices; *device; device++)\n\t{\n\t\tlist.emplace_back(device);\n\t\tdevice += list.back().length();\n\t}\n}\n\nvoid Audio::setPlaybackDevice(const char *name)\n{\n#ifndef ALC_SOFT_reopen_device\n\ttypedef ALCboolean (ALC_APIENTRY*LPALCREOPENDEVICESOFT)(ALCdevice *device,\n\t\tconst ALCchar *deviceName, const ALCint *attribs);\n#endif\n\tstatic LPALCREOPENDEVICESOFT alcReopenDeviceSOFT = alcIsExtensionPresent(device, \"ALC_SOFT_reopen_device\") == ALC_TRUE\n\t\t? (LPALCREOPENDEVICESOFT) alcGetProcAddress(device, \"alcReopenDeviceSOFT\")\n\t\t: nullptr;\n\n\tif (alcReopenDeviceSOFT == nullptr)\n\t{\n\t\t// Default implementation throws exception. To make\n\t\t// error message consistent, call the base class.\n\t\tlove::audio::Audio::setPlaybackDevice(name);\n\t\treturn;\n\t}\n\n\tstd::vector<ALint> attribs = computeContextAttribs();\n\n\tif (alcReopenDeviceSOFT(device, (const ALCchar *) name, attribs.data()) == ALC_FALSE)\n\t\tthrow love::Exception(\"Cannot set output device: %s\", alcGetString(device, alcGetError(device)));\n}\n\nvoid Audio::setVolume(float volume)\n{\n\talListenerf(AL_GAIN, volume);\n}\n\nfloat Audio::getVolume() const\n{\n\tALfloat volume;\n\talGetListenerf(AL_GAIN, &volume);\n\treturn volume;\n}\n\nvoid Audio::getPosition(float *v) const\n{\n\talGetListenerfv(AL_POSITION, v);\n}\n\nvoid Audio::setPosition(float *v)\n{\n\talListenerfv(AL_POSITION, v);\n}\n\nvoid Audio::getOrientation(float *v) const\n{\n\talGetListenerfv(AL_ORIENTATION, v);\n}\n\nvoid Audio::setOrientation(float *v)\n{\n\talListenerfv(AL_ORIENTATION, v);\n}\n\nvoid Audio::getVelocity(float *v) const\n{\n\talGetListenerfv(AL_VELOCITY, v);\n}\n\nvoid Audio::setVelocity(float *v)\n{\n\talListenerfv(AL_VELOCITY, v);\n}\n\nvoid Audio::setDopplerScale(float scale)\n{\n\tif (scale >= 0.0f)\n\t\talDopplerFactor(scale);\n}\n\nfloat Audio::getDopplerScale() const\n{\n\treturn alGetFloat(AL_DOPPLER_FACTOR);\n}\n/*\nvoid Audio::setMeter(float scale)\n{\n\tif (scale >= 0.0f)\n\t{\n\t\tmetersPerUnit = scale;\n#ifdef ALC_EXT_EFX\n\t\talListenerf(AL_METERS_PER_UNIT, scale);\n#endif\n\t}\n}\n\nfloat Audio::getMeter() const\n{\n\treturn metersPerUnit;\n}\n*/\nAudio::DistanceModel Audio::getDistanceModel() const\n{\n\treturn distanceModel;\n}\n\nvoid Audio::setDistanceModel(DistanceModel distanceModel)\n{\n\tthis->distanceModel = distanceModel;\n\n\tswitch (distanceModel)\n\t{\n\tcase DISTANCE_NONE:\n\t\talDistanceModel(AL_NONE);\n\t\tbreak;\n\n\tcase DISTANCE_INVERSE:\n\t\talDistanceModel(AL_INVERSE_DISTANCE);\n\t\tbreak;\n\n\tcase DISTANCE_INVERSE_CLAMPED:\n\t\talDistanceModel(AL_INVERSE_DISTANCE_CLAMPED);\n\t\tbreak;\n\n\tcase DISTANCE_LINEAR:\n\t\talDistanceModel(AL_LINEAR_DISTANCE);\n\t\tbreak;\n\n\tcase DISTANCE_LINEAR_CLAMPED:\n\t\talDistanceModel(AL_LINEAR_DISTANCE_CLAMPED);\n\t\tbreak;\n\n\tcase DISTANCE_EXPONENT:\n\t\talDistanceModel(AL_EXPONENT_DISTANCE);\n\t\tbreak;\n\n\tcase DISTANCE_EXPONENT_CLAMPED:\n\t\talDistanceModel(AL_EXPONENT_DISTANCE_CLAMPED);\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nconst std::vector<love::audio::RecordingDevice*> &Audio::getRecordingDevices()\n{\n\tstd::vector<std::string> devnames;\n\tstd::vector<love::audio::RecordingDevice*> devices;\n\n\t// If recording permission is not granted, inform user about it\n\t// and return empty list.\n\tif (!hasRecordingPermission() && getRequestRecordingPermission())\n\t{\n\t\tshowRecordingPermissionMissingDialog();\n\t\tcapture.clear();\n\t\treturn capture;\n\t}\n\n\tstd::string defaultname(alcGetString(NULL, ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER));\n\n\t//no device name obtained from AL, fallback to reading from device\n\tif (defaultname.length() == 0)\n\t{\n\t\t//use some safe basic parameters - 8 kHz, 8 bits, 1 channel\n\t\tALCdevice *defaultdevice = alcCaptureOpenDevice(NULL, 8000, AL_FORMAT_MONO8, 1024);\n\t\tif (alGetError() == AL_NO_ERROR)\n\t\t{\n\t\t\tdefaultname = alcGetString(defaultdevice, ALC_CAPTURE_DEVICE_SPECIFIER);\n\t\t\talcCaptureCloseDevice(defaultdevice);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//failed to open default recording device - bail, return empty list\n\t\t\tcapture.clear();\n\t\t\treturn capture;\n\t\t}\n\t}\n\n\tdevnames.reserve(capture.size());\n\tdevnames.push_back(defaultname);\n\n\t//find devices name list\n\tconst ALCchar *devstr = alcGetString(NULL, ALC_CAPTURE_DEVICE_SPECIFIER);\n\tsize_t offset = 0;\n\twhile (true)\n\t{\n\t\tif (devstr[offset] == '\\0')\n\t\t\tbreak;\n\t\tstd::string str((ALCchar*)&devstr[offset]);\n\t\tif (str != defaultname)\n\t\t\tdevnames.push_back(str);\n\t\toffset += str.length() + 1;\n\t}\n\n\tdevices.reserve(devnames.size());\n\t//build ordered list of devices\n\tfor (int i = 0; i < (int) devnames.size(); i++)\n\t{\n\t\tdevices.push_back(nullptr);\n\t\tauto d = devices.end() - 1;\n\n\t\tfor (auto c : capture)\n\t\t\tif (devnames[i] == c->getName())\n\t\t\t\t*d = c;\n\n\t\tif (*d == nullptr)\n\t\t\t*d = new RecordingDevice(devnames[i].c_str());\n\t\telse\n\t\t\t(*d)->retain();\n\t}\n\n\tfor (auto c : capture)\n\t\tc->release();\n\tcapture.clear();\n\tcapture.reserve(devices.size());\n\n\t//this needs to be executed in specific order\n\tfor (unsigned int i = 0; i < devnames.size(); i++)\n\t\tcapture.push_back(devices[i]);\n\n\treturn capture;\n}\n\nbool Audio::setEffect(const char *name, std::map<Effect::Parameter, float> &params)\n{\n\tEffect *effect;\n\tALuint slot;\n\n\tauto iter = effectmap.find(name);\n\tif (iter == effectmap.end())\n\t{\n\t\t//new effect needed but no more slots\n\t\tif (effectmap.size() >= (unsigned int)MAX_SCENE_EFFECTS)\n\t\t\treturn false;\n\n\t\teffect = new Effect();\n\t\tslot = slotlist.top();\n\t\tslotlist.pop();\n\n\t\teffectmap[name] = {effect, slot};\n\t}\n\telse\n\t{\n\t\teffect = iter->second.effect;\n\t\tslot = iter->second.slot;\n\t}\n\n\tbool result = effect->setParams(params);\n\n#ifdef ALC_EXT_EFX\n\tif (alAuxiliaryEffectSloti)\n\t{\n\t\tif (result)\n\t\t{\n\t\t\tauto iter = params.find(Effect::EFFECT_VOLUME);\n\t\t\tif (iter != params.end())\n\t\t\t\talAuxiliaryEffectSlotf(slot, AL_EFFECTSLOT_GAIN, iter->second);\n\t\t\talAuxiliaryEffectSloti(slot, AL_EFFECTSLOT_EFFECT, effect->getEffect());\n\t\t}\n\t\telse\n\t\t\talAuxiliaryEffectSloti(slot, AL_EFFECTSLOT_EFFECT, AL_EFFECT_NULL);\n\t\talGetError();\n\t}\n#endif\n\n\treturn result;\n}\n\nbool Audio::unsetEffect(const char *name)\n{\n\tauto iter = effectmap.find(name);\n\tif (iter == effectmap.end())\n\t\treturn false;\n\n\tEffect *effect = iter->second.effect;\n\tALuint slot = iter->second.slot;\n\n#ifdef ALC_EXT_EFX\n\tif (alAuxiliaryEffectSloti)\n\t\talAuxiliaryEffectSloti(slot, AL_EFFECTSLOT_EFFECT, AL_EFFECT_NULL);\n#endif\n\n\tdelete effect;\n\teffectmap.erase(iter);\n\tslotlist.push(slot);\n\treturn true;\n}\n\nbool Audio::getEffect(const char *name, std::map<Effect::Parameter, float> &params)\n{\n\tauto iter = effectmap.find(name);\n\tif (iter == effectmap.end())\n\t\treturn false;\n\n\tparams = iter->second.effect->getParams();\n\n\treturn true;\n}\n\nbool Audio::getActiveEffects(std::vector<std::string> &list) const\n{\n\tif (effectmap.empty())\n\t\treturn false;\n\n\tlist.reserve(effectmap.size());\n\tfor (auto i : effectmap)\n\t\tlist.push_back(i.first);\n\n\treturn true;\n}\n\nint Audio::getMaxSceneEffects() const\n{\n\treturn MAX_SCENE_EFFECTS;\n}\n\nint Audio::getMaxSourceEffects() const\n{\n\treturn MAX_SOURCE_EFFECTS;\n}\n\nbool Audio::isEFXsupported() const\n{\n#ifdef ALC_EXT_EFX\n\treturn (alGenEffects != nullptr);\n#else\n\treturn false;\n#endif\n}\n\nbool Audio::setOutputSpatialization(bool enable, const char *filter)\n{\n\trequestEnableHRTF = enable;\n\tif (filter != nullptr)\n\t\trequestedHRTFFilter = filter;\n\telse\n\t\trequestedHRTFFilter.clear();\n\n#ifdef ALC_SOFT_HRTF\n\tif (hasHRTFExtension)\n\t{\n\t\tstatic auto alcResetDeviceSOFT = (LPALCRESETDEVICESOFT)alcGetProcAddress(device, \"alcResetDeviceSOFT\");\n\t\tif (alcResetDeviceSOFT == nullptr)\n\t\t\treturn false;\n\n\t\tstd::vector<ALint> attribs = computeContextAttribs();\n\t\treturn alcResetDeviceSOFT(device, attribs.data()) != AL_FALSE;\n\t}\n#endif\n\n\treturn false;\n}\n\nbool Audio::getOutputSpatialization(const char *&filter) const\n{\n#ifdef ALC_SOFT_HRTF\n\tif (hasHRTFExtension)\n\t{\n\t\tALCint enabled = 0;\n\t\talcGetIntegerv(device, ALC_HRTF_SOFT, 1, &enabled);\n\t\tif (enabled != 0)\n\t\t\tfilter = alcGetString(device, ALC_HRTF_SPECIFIER_SOFT);\n\t\telse\n\t\t\tfilter = nullptr;\n\t\treturn enabled != 0;\n\t}\n#endif\n\n\tfilter = nullptr;\n\treturn false;\n}\n\nvoid Audio::getOutputSpatializationFilters(std::vector<std::string> &list) const\n{\n#ifdef ALC_SOFT_HRTF\n\tif (!hasHRTFExtension)\n\t\treturn;\n\n\tstatic auto alcGetStringiSOFT = (LPALCGETSTRINGISOFT)alcGetProcAddress(device, \"alcGetStringiSOFT\");\n\tif (alcGetStringiSOFT == nullptr)\n\t\treturn;\n\n\tALCint count = 0;\n\talcGetIntegerv(device, ALC_NUM_HRTF_SPECIFIERS_SOFT, 1, &count);\n\tfor (int i = 0; i < count; i++)\n\t{\n\t\tconst char *specifier = alcGetStringiSOFT(device, ALC_HRTF_SPECIFIER_SOFT, i);\n\t\tif (specifier != nullptr)\n\t\t\tlist.push_back(specifier);\n\t}\n#else\n\tLOVE_UNUSED(list);\n#endif\n}\n\nbool Audio::getEffectID(const char *name, ALuint &id)\n{\n\tauto iter = effectmap.find(name);\n\tif (iter == effectmap.end())\n\t\treturn false;\n\n\tid = iter->second.slot;\n\treturn true;\n}\n\n#ifdef ALC_EXT_EFX\nLPALGENEFFECTS alGenEffects = nullptr;\nLPALDELETEEFFECTS alDeleteEffects = nullptr;\nLPALISEFFECT alIsEffect = nullptr;\nLPALEFFECTI alEffecti = nullptr;\nLPALEFFECTIV alEffectiv = nullptr;\nLPALEFFECTF alEffectf = nullptr;\nLPALEFFECTFV alEffectfv = nullptr;\nLPALGETEFFECTI alGetEffecti = nullptr;\nLPALGETEFFECTIV alGetEffectiv = nullptr;\nLPALGETEFFECTF alGetEffectf = nullptr;\nLPALGETEFFECTFV alGetEffectfv = nullptr;\nLPALGENFILTERS alGenFilters = nullptr;\nLPALDELETEFILTERS alDeleteFilters = nullptr;\nLPALISFILTER alIsFilter = nullptr;\nLPALFILTERI alFilteri = nullptr;\nLPALFILTERIV alFilteriv = nullptr;\nLPALFILTERF alFilterf = nullptr;\nLPALFILTERFV alFilterfv = nullptr;\nLPALGETFILTERI alGetFilteri = nullptr;\nLPALGETFILTERIV alGetFilteriv = nullptr;\nLPALGETFILTERF alGetFilterf = nullptr;\nLPALGETFILTERFV alGetFilterfv = nullptr;\nLPALGENAUXILIARYEFFECTSLOTS alGenAuxiliaryEffectSlots = nullptr;\nLPALDELETEAUXILIARYEFFECTSLOTS alDeleteAuxiliaryEffectSlots = nullptr;\nLPALISAUXILIARYEFFECTSLOT alIsAuxiliaryEffectSlot = nullptr;\nLPALAUXILIARYEFFECTSLOTI alAuxiliaryEffectSloti = nullptr;\nLPALAUXILIARYEFFECTSLOTIV alAuxiliaryEffectSlotiv = nullptr;\nLPALAUXILIARYEFFECTSLOTF alAuxiliaryEffectSlotf = nullptr;\nLPALAUXILIARYEFFECTSLOTFV alAuxiliaryEffectSlotfv = nullptr;\nLPALGETAUXILIARYEFFECTSLOTI alGetAuxiliaryEffectSloti = nullptr;\nLPALGETAUXILIARYEFFECTSLOTIV alGetAuxiliaryEffectSlotiv = nullptr;\nLPALGETAUXILIARYEFFECTSLOTF alGetAuxiliaryEffectSlotf = nullptr;\nLPALGETAUXILIARYEFFECTSLOTFV alGetAuxiliaryEffectSlotfv = nullptr;\n#endif\n\nvoid Audio::initializeEFX()\n{\n#ifdef ALC_EXT_EFX\n\tif (alcIsExtensionPresent(device, \"ALC_EXT_EFX\") == AL_FALSE)\n\t\treturn;\n\n\talGenEffects = (LPALGENEFFECTS)alGetProcAddress(\"alGenEffects\");\n\talDeleteEffects = (LPALDELETEEFFECTS)alGetProcAddress(\"alDeleteEffects\");\n\talIsEffect = (LPALISEFFECT)alGetProcAddress(\"alIsEffect\");\n\talEffecti = (LPALEFFECTI)alGetProcAddress(\"alEffecti\");\n\talEffectiv = (LPALEFFECTIV)alGetProcAddress(\"alEffectiv\");\n\talEffectf = (LPALEFFECTF)alGetProcAddress(\"alEffectf\");\n\talEffectfv = (LPALEFFECTFV)alGetProcAddress(\"alEffectfv\");\n\talGetEffecti = (LPALGETEFFECTI)alGetProcAddress(\"alGetEffecti\");\n\talGetEffectiv = (LPALGETEFFECTIV)alGetProcAddress(\"alGetEffectiv\");\n\talGetEffectf = (LPALGETEFFECTF)alGetProcAddress(\"alGetEffectf\");\n\talGetEffectfv = (LPALGETEFFECTFV)alGetProcAddress(\"alGetEffectfv\");\n\talGenFilters = (LPALGENFILTERS)alGetProcAddress(\"alGenFilters\");\n\talDeleteFilters = (LPALDELETEFILTERS)alGetProcAddress(\"alDeleteFilters\");\n\talIsFilter = (LPALISFILTER)alGetProcAddress(\"alIsFilter\");\n\talFilteri = (LPALFILTERI)alGetProcAddress(\"alFilteri\");\n\talFilteriv = (LPALFILTERIV)alGetProcAddress(\"alFilteriv\");\n\talFilterf = (LPALFILTERF)alGetProcAddress(\"alFilterf\");\n\talFilterfv = (LPALFILTERFV)alGetProcAddress(\"alFilterfv\");\n\talGetFilteri = (LPALGETFILTERI)alGetProcAddress(\"alGetFilteri\");\n\talGetFilteriv = (LPALGETFILTERIV)alGetProcAddress(\"alGetFilteriv\");\n\talGetFilterf = (LPALGETFILTERF)alGetProcAddress(\"alGetFilterf\");\n\talGetFilterfv = (LPALGETFILTERFV)alGetProcAddress(\"alGetFilterfv\");\n\talGenAuxiliaryEffectSlots = (LPALGENAUXILIARYEFFECTSLOTS)alGetProcAddress(\"alGenAuxiliaryEffectSlots\");\n\talDeleteAuxiliaryEffectSlots = (LPALDELETEAUXILIARYEFFECTSLOTS)alGetProcAddress(\"alDeleteAuxiliaryEffectSlots\");\n\talIsAuxiliaryEffectSlot = (LPALISAUXILIARYEFFECTSLOT)alGetProcAddress(\"alIsAuxiliaryEffectSlot\");\n\talAuxiliaryEffectSloti = (LPALAUXILIARYEFFECTSLOTI)alGetProcAddress(\"alAuxiliaryEffectSloti\");\n\talAuxiliaryEffectSlotiv = (LPALAUXILIARYEFFECTSLOTIV)alGetProcAddress(\"alAuxiliaryEffectSlotiv\");\n\talAuxiliaryEffectSlotf = (LPALAUXILIARYEFFECTSLOTF)alGetProcAddress(\"alAuxiliaryEffectSlotf\");\n\talAuxiliaryEffectSlotfv = (LPALAUXILIARYEFFECTSLOTFV)alGetProcAddress(\"alAuxiliaryEffectSlotfv\");\n\talGetAuxiliaryEffectSloti = (LPALGETAUXILIARYEFFECTSLOTI)alGetProcAddress(\"alGetAuxiliaryEffectSloti\");\n\talGetAuxiliaryEffectSlotiv = (LPALGETAUXILIARYEFFECTSLOTIV)alGetProcAddress(\"alGetAuxiliaryEffectSlotiv\");\n\talGetAuxiliaryEffectSlotf = (LPALGETAUXILIARYEFFECTSLOTF)alGetProcAddress(\"alGetAuxiliaryEffectSlotf\");\n\talGetAuxiliaryEffectSlotfv = (LPALGETAUXILIARYEFFECTSLOTFV)alGetProcAddress(\"alGetAuxiliaryEffectSlotfv\");\n\n\t//failed to initialize functions, revert to nullptr\n\tif (!alGenEffects || !alDeleteEffects || !alIsEffect ||\n\t\t!alGenFilters || !alDeleteFilters || !alIsFilter ||\n\t\t!alGenAuxiliaryEffectSlots || !alDeleteAuxiliaryEffectSlots || !alIsAuxiliaryEffectSlot ||\n\t\t!alEffecti || !alEffectiv || !alEffectf || !alEffectfv ||\n\t\t!alGetEffecti || !alGetEffectiv || !alGetEffectf || !alGetEffectfv ||\n\t\t!alFilteri || !alFilteriv || !alFilterf || !alFilterfv ||\n\t\t!alGetFilteri || !alGetFilteriv || !alGetFilterf || !alGetFilterfv ||\n\t\t!alAuxiliaryEffectSloti || !alAuxiliaryEffectSlotiv || !alAuxiliaryEffectSlotf || !alAuxiliaryEffectSlotfv ||\n\t\t!alGetAuxiliaryEffectSloti || !alGetAuxiliaryEffectSlotiv || !alGetAuxiliaryEffectSlotf || !alGetAuxiliaryEffectSlotfv)\n\t{\n\t\talGenEffects = nullptr; alDeleteEffects = nullptr; alIsEffect = nullptr;\n\t\talEffecti = nullptr; alEffectiv = nullptr; alEffectf = nullptr; alEffectfv = nullptr;\n\t\talGetEffecti = nullptr; alGetEffectiv = nullptr; alGetEffectf = nullptr; alGetEffectfv = nullptr;\n\t\talGenFilters = nullptr; alDeleteFilters = nullptr; alIsFilter = nullptr;\n\t\talFilteri = nullptr; alFilteriv = nullptr; alFilterf = nullptr; alFilterfv = nullptr;\n\t\talGetFilteri = nullptr; alGetFilteriv = nullptr; alGetFilterf = nullptr; alGetFilterfv = nullptr;\n\t\talGenAuxiliaryEffectSlots = nullptr; alDeleteAuxiliaryEffectSlots = nullptr; alIsAuxiliaryEffectSlot = nullptr;\n\t\talAuxiliaryEffectSloti = nullptr; alAuxiliaryEffectSlotiv = nullptr;\n\t\talAuxiliaryEffectSlotf = nullptr; alAuxiliaryEffectSlotfv = nullptr;\n\t\talGetAuxiliaryEffectSloti = nullptr; alGetAuxiliaryEffectSlotiv = nullptr;\n\t\talGetAuxiliaryEffectSlotf = nullptr; alGetAuxiliaryEffectSlotfv = nullptr;\n\t}\n\n#endif\n}\n\n} // openal\n} // audio\n} // love\n"
  },
  {
    "path": "src/modules/audio/openal/Audio.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_AUDIO_OPENAL_AUDIO_H\n#define LOVE_AUDIO_OPENAL_AUDIO_H\n\n// STD\n#include <queue>\n#include <map>\n#include <vector>\n#include <stack>\n#include <cmath>\n\n// LOVE\n#include \"audio/Audio.h\"\n#include \"audio/RecordingDevice.h\"\n#include \"audio/Filter.h\"\n#include \"common/config.h\"\n#include \"sound/SoundData.h\"\n\n#include \"Source.h\"\n#include \"Effect.h\"\n#include \"Pool.h\"\n#include \"thread/threads.h\"\n\n// OpenAL\n#ifdef LOVE_APPLE_USE_FRAMEWORKS // Frameworks have different include paths.\n#ifdef LOVE_IOS\n#include <OpenAL/alc.h>\n#include <OpenAL/al.h>\n#else\n#include <OpenAL-Soft/alc.h>\n#include <OpenAL-Soft/al.h>\n#endif\n#else\n#include <alc.h>\n#include <al.h>\n#include <alext.h>\n#endif\n\nnamespace love\n{\nnamespace audio\n{\nnamespace openal\n{\n\nclass Audio : public love::audio::Audio\n{\npublic:\n\n\tAudio();\n\t~Audio();\n\n\t/**\n\t * Gets the OpenAL format identifier based on number of\n\t * channels and bits.\n\t * @param channels.\n\t * @param bitDepth Either 8-bit samples, or 16-bit samples.\n\t * @return One of AL_FORMAT_*, or AL_NONE if unsupported format.\n\t **/\n\tstatic ALenum getFormat(int bitDepth, int channels);\n\n\t// Implements Audio.\n\tlove::audio::Source *newSource(love::sound::Decoder *decoder) override;\n\tlove::audio::Source *newSource(love::sound::SoundData *soundData) override;\n\tlove::audio::Source *newSource(int sampleRate, int bitDepth, int channels, int buffers) override;\n\tint getActiveSourceCount() const override;\n\tint getMaxSources() const override;\n\tbool play(love::audio::Source *source) override;\n\tbool play(const std::vector<love::audio::Source*> &sources) override;\n\tvoid stop(love::audio::Source *source) override;\n\tvoid stop(const std::vector<love::audio::Source*> &sources) override;\n\tvoid stop() override;\n\tvoid pause(love::audio::Source *source) override;\n\tvoid pause(const std::vector<love::audio::Source*> &sources) override;\n\tstd::vector<love::audio::Source*> pause() override;\n\tvoid pauseContext() override;\n\tvoid resumeContext() override;\n\tvoid setVolume(float volume) override;\n\tfloat getVolume() const override;\n\n\tvoid getPosition(float *v) const override;\n\tvoid setPosition(float *v) override;\n\tvoid getOrientation(float *v) const override;\n\tvoid setOrientation(float *v) override;\n\tvoid getVelocity(float *v) const override;\n\tvoid setVelocity(float *v) override;\n\n\tvoid setDopplerScale(float scale) override;\n\tfloat getDopplerScale() const override;\n\t//void setMeter(float scale);\n\t//float getMeter() const;\n\n\tconst std::vector<love::audio::RecordingDevice*> &getRecordingDevices() override;\n\n\tDistanceModel getDistanceModel() const override;\n\tvoid setDistanceModel(DistanceModel distanceModel) override;\n\n\tbool setEffect(const char *name, std::map<Effect::Parameter, float> &params) override;\n\tbool unsetEffect(const char *name) override;\n\tbool getEffect(const char *name, std::map<Effect::Parameter, float> &params) override;\n\tbool getActiveEffects(std::vector<std::string> &list) const override;\n\tint getMaxSceneEffects() const override;\n\tint getMaxSourceEffects() const override;\n\tbool isEFXsupported() const override;\n\n\tbool setOutputSpatialization(bool enable, const char *filter = nullptr) override;\n\tbool getOutputSpatialization(const char *&filter) const override;\n\tvoid getOutputSpatializationFilters(std::vector<std::string> &list) const override;\n\n\tbool getEffectID(const char *name, ALuint &id);\n\n\tstd::string getPlaybackDevice() override;\n\tvoid getPlaybackDevices(std::vector<std::string> &list) override;\n\tvoid setPlaybackDevice(const char *name) override;\n\nprivate:\n\n\tstd::vector<ALint> computeContextAttribs();\n\tvoid initializeEFX();\n\n\t// The OpenAL device.\n\tALCdevice *device;\n\n\t// The OpenAL capture devices.\n\tstd::vector<love::audio::RecordingDevice*> capture;\n\n\t// The OpenAL context.\n\tALCcontext *context;\n\n\t// The OpenAL effects\n\tstruct EffectMapStorage\n\t{\n\t\tEffect *effect;\n\t\tALuint slot;\n\t};\n\tstd::map<std::string, struct EffectMapStorage> effectmap;\n\tstd::stack<ALuint> slotlist;\n\tint MAX_SCENE_EFFECTS = 64;\n\tint MAX_REQUESTED_SOURCE_EFFECTS = 64;\n\tint MAX_SOURCE_EFFECTS = 0;\n\n\t// Disable HRTF output by default.\n\tbool requestEnableHRTF = false;\n\tstd::string requestedHRTFFilter;\n\n\t// The Pool.\n\tPool *pool;\n\n\tclass PoolThread: public thread::Threadable\n\t{\n\tprotected:\n\t\tPool *pool;\n\n\t\t// Set this to true when the thread should finish.\n\t\t// Main thread will write to this value, and PoolThread\n\t\t// will read from it.\n\t\tvolatile bool finish;\n\n\t\t// finish lock\n\t\tlove::thread::MutexRef mutex;\n\n\tpublic:\n\t\tPoolThread(Pool *pool);\n\t\tvirtual ~PoolThread();\n\t\tvoid setFinish();\n\t\tvoid threadFunction();\n\t};\n\n\tPoolThread *poolThread;\n\n\tDistanceModel distanceModel;\n\t//float metersPerUnit = 1.0;\n\n\tbool hasHRTFExtension = false;\n\n#ifdef LOVE_ANDROID\n#\tifndef ALC_SOFT_pause_device\n\ttypedef void (ALC_APIENTRY*LPALCDEVICEPAUSESOFT)(ALCdevice *device);\n\ttypedef void (ALC_APIENTRY*LPALCDEVICERESUMESOFT)(ALCdevice *device);\n#\tendif\n\tLPALCDEVICEPAUSESOFT alcDevicePauseSOFT;\n\tLPALCDEVICERESUMESOFT alcDeviceResumeSOFT;\n\tstd::vector<love::audio::Source*> pausedSources;\n#endif\n}; // Audio\n\n#ifdef ALC_EXT_EFX\n // Effect objects\nextern LPALGENEFFECTS alGenEffects;\nextern LPALDELETEEFFECTS alDeleteEffects;\nextern LPALISEFFECT alIsEffect;\nextern LPALEFFECTI alEffecti;\nextern LPALEFFECTIV alEffectiv;\nextern LPALEFFECTF alEffectf;\nextern LPALEFFECTFV alEffectfv;\nextern LPALGETEFFECTI alGetEffecti;\nextern LPALGETEFFECTIV alGetEffectiv;\nextern LPALGETEFFECTF alGetEffectf;\nextern LPALGETEFFECTFV alGetEffectfv;\n\n//Filter objects\nextern LPALGENFILTERS alGenFilters;\nextern LPALDELETEFILTERS alDeleteFilters;\nextern LPALISFILTER alIsFilter;\nextern LPALFILTERI alFilteri;\nextern LPALFILTERIV alFilteriv;\nextern LPALFILTERF alFilterf;\nextern LPALFILTERFV alFilterfv;\nextern LPALGETFILTERI alGetFilteri;\nextern LPALGETFILTERIV alGetFilteriv;\nextern LPALGETFILTERF alGetFilterf;\nextern LPALGETFILTERFV alGetFilterfv;\n\n// Auxiliary slot object\nextern LPALGENAUXILIARYEFFECTSLOTS alGenAuxiliaryEffectSlots;\nextern LPALDELETEAUXILIARYEFFECTSLOTS alDeleteAuxiliaryEffectSlots;\nextern LPALISAUXILIARYEFFECTSLOT alIsAuxiliaryEffectSlot;\nextern LPALAUXILIARYEFFECTSLOTI alAuxiliaryEffectSloti;\nextern LPALAUXILIARYEFFECTSLOTIV alAuxiliaryEffectSlotiv;\nextern LPALAUXILIARYEFFECTSLOTF alAuxiliaryEffectSlotf;\nextern LPALAUXILIARYEFFECTSLOTFV alAuxiliaryEffectSlotfv;\nextern LPALGETAUXILIARYEFFECTSLOTI alGetAuxiliaryEffectSloti;\nextern LPALGETAUXILIARYEFFECTSLOTIV alGetAuxiliaryEffectSlotiv;\nextern LPALGETAUXILIARYEFFECTSLOTF alGetAuxiliaryEffectSlotf;\nextern LPALGETAUXILIARYEFFECTSLOTFV alGetAuxiliaryEffectSlotfv;\n#endif\n\n} // openal\n} // audio\n} // love\n\n#endif // LOVE_AUDIO_OPENAL_AUDIO_H\n"
  },
  {
    "path": "src/modules/audio/openal/Effect.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Effect.h\"\n#include \"common/Exception.h\"\n\n#include <cmath>\n#include <iostream>\n\nnamespace love\n{\nnamespace audio\n{\nnamespace openal\n{\n\n//base class\nEffect::Effect()\n{\n\tgenerateEffect();\n}\n\nEffect::Effect(const Effect &s)\n\t: Effect()\n{\n\tsetParams(s.getParams());\n}\n\nEffect::~Effect()\n{\n\tdeleteEffect();\n}\n\nEffect *Effect::clone()\n{\n\treturn new Effect(*this);\n}\n\nbool Effect::generateEffect()\n{\n#ifdef ALC_EXT_EFX\n\tif (!alGenEffects)\n\t\treturn false;\n\n\tif (effect != AL_EFFECT_NULL)\n\t\treturn true;\n\n\talGenEffects(1, &effect);\n\tif (alGetError() != AL_NO_ERROR)\n\t\tthrow love::Exception(\"Failed to create sound Effect.\");\n\n\treturn true;\n#else\n\treturn false;\n#endif\n}\n\nvoid Effect::deleteEffect()\n{\n#ifdef ALC_EXT_EFX\n\tif (effect != AL_EFFECT_NULL)\n\t\talDeleteEffects(1, &effect);\n#endif\n\teffect = AL_EFFECT_NULL;\n}\n\nALuint Effect::getEffect() const\n{\n\treturn effect;\n}\n\nbool Effect::setParams(const std::map<Parameter, float> &params)\n{\n\tthis->params = params;\n\ttype = (Type)(int) this->params[EFFECT_TYPE];\n\n\tif (!generateEffect())\n\t\treturn false;\n\n#ifdef ALC_EXT_EFX\n\t//parameter table without EFFECT_TYPE entry is illegal\n\tswitch (type)\n\t{\n\tcase TYPE_REVERB:\n\t\talEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_REVERB);\n\t\tbreak;\n\tcase TYPE_CHORUS:\n\t\talEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_CHORUS);\n\t\tbreak;\n\tcase TYPE_DISTORTION:\n\t\talEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_DISTORTION);\n\t\tbreak;\n\tcase TYPE_ECHO:\n\t\talEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_ECHO);\n\t\tbreak;\n\tcase TYPE_FLANGER:\n\t\talEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_FLANGER);\n\t\tbreak;\n/*\n\tcase TYPE_FREQSHIFTER:\n\t\talEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_FREQUENCY_SHIFTER);\n\t\tbreak;\n\tcase TYPE_MORPHER:\n\t\talEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_VOCAL_MORPHER);\n\t\tbreak;\n\tcase TYPE_PITCHSHIFTER:\n\t\talEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_PITCH_SHIFTER);\n\t\tbreak;\n*/\n\tcase TYPE_MODULATOR:\n\t\talEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_RING_MODULATOR);\n\t\tbreak;\n/*\n\tcase TYPE_AUTOWAH:\n\t\talEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_AUTOWAH);\n\t\tbreak;\n*/\n\tcase TYPE_COMPRESSOR:\n\t\talEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_COMPRESSOR);\n\t\tbreak;\n\tcase TYPE_EQUALIZER:\n\t\talEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_EQUALIZER);\n\t\tbreak;\n\tcase TYPE_BASIC:\n\tcase TYPE_MAX_ENUM:\n\t\tbreak;\n\t}\n\n\t//failed to make effect specific type - not supported etc.\n\tif (alGetError() != AL_NO_ERROR)\n\t{\n\t\tdeleteEffect();\n\t\treturn false;\n\t}\n\n#define clampf(v,l,h) fmax(fmin((v),(h)),(l))\n#define PARAMSTR(i,e,v) effect,AL_##e##_##v,clampf(getValue(i,AL_##e##_DEFAULT_##v),AL_##e##_MIN_##v,AL_##e##_MAX_##v)\n\tswitch (type)\n\t{\n\tcase TYPE_REVERB:\n\t{\n\t\talEffectf(PARAMSTR(REVERB_GAIN,REVERB,GAIN));\n\t\talEffectf(PARAMSTR(REVERB_HFGAIN,REVERB,GAINHF));\n\t\talEffectf(PARAMSTR(REVERB_DENSITY,REVERB,DENSITY));\n\t\talEffectf(PARAMSTR(REVERB_DIFFUSION,REVERB,DIFFUSION));\n\t\talEffectf(PARAMSTR(REVERB_DECAY,REVERB,DECAY_TIME));\n\t\talEffectf(PARAMSTR(REVERB_HFDECAY,REVERB,DECAY_HFRATIO));\n\t\talEffectf(PARAMSTR(REVERB_EARLYGAIN,REVERB,REFLECTIONS_GAIN));\n\t\talEffectf(PARAMSTR(REVERB_EARLYDELAY,REVERB,REFLECTIONS_DELAY));\n\t\talEffectf(PARAMSTR(REVERB_LATEGAIN,REVERB,LATE_REVERB_GAIN));\n\t\talEffectf(PARAMSTR(REVERB_LATEDELAY,REVERB,LATE_REVERB_DELAY));;\n\t\talEffectf(PARAMSTR(REVERB_ROLLOFF,REVERB,ROOM_ROLLOFF_FACTOR));\n\t\talEffectf(PARAMSTR(REVERB_AIRHFGAIN,REVERB,AIR_ABSORPTION_GAINHF));\n\t\talEffecti(effect, AL_REVERB_DECAY_HFLIMIT, getValue(REVERB_HFLIMITER, 0));\n\t\tbreak;\n\t}\n\tcase TYPE_CHORUS:\n\t{\n\t\tWaveform wave = static_cast<Waveform>(getValue(CHORUS_WAVEFORM, static_cast<int>(WAVE_MAX_ENUM)));\n\t\tif (wave == WAVE_SINE)\n\t\t\talEffecti(effect, AL_CHORUS_WAVEFORM, AL_CHORUS_WAVEFORM_SINUSOID);\n\t\telse if (wave == WAVE_TRIANGLE)\n\t\t\talEffecti(effect, AL_CHORUS_WAVEFORM, AL_CHORUS_WAVEFORM_TRIANGLE);\n\t\telse\n\t\t\talEffecti(effect, AL_CHORUS_WAVEFORM, AL_CHORUS_DEFAULT_WAVEFORM);\n\n\t\talEffecti(PARAMSTR(CHORUS_PHASE,CHORUS,PHASE));\n\t\talEffectf(PARAMSTR(CHORUS_RATE,CHORUS,RATE));\n\t\talEffectf(PARAMSTR(CHORUS_DEPTH,CHORUS,DEPTH));\n\t\talEffectf(PARAMSTR(CHORUS_FEEDBACK,CHORUS,FEEDBACK));\n\t\talEffectf(PARAMSTR(CHORUS_DELAY,CHORUS,DELAY));\n\t\tbreak;\n\t}\n\tcase TYPE_DISTORTION:\n\t\talEffectf(PARAMSTR(DISTORTION_GAIN,DISTORTION,GAIN));\n\t\talEffectf(PARAMSTR(DISTORTION_EDGE,DISTORTION,EDGE));\n\t\talEffectf(PARAMSTR(DISTORTION_LOWCUT,DISTORTION,LOWPASS_CUTOFF));\n\t\talEffectf(PARAMSTR(DISTORTION_EQCENTER,DISTORTION,EQCENTER));\n\t\talEffectf(PARAMSTR(DISTORTION_EQBAND,DISTORTION,EQBANDWIDTH));\n\t\tbreak;\n\n\tcase TYPE_ECHO:\n\t\talEffectf(PARAMSTR(ECHO_DELAY,ECHO,DELAY));\n\t\talEffectf(PARAMSTR(ECHO_LRDELAY,ECHO,LRDELAY));\n\t\talEffectf(PARAMSTR(ECHO_DAMPING,ECHO,DAMPING));\n\t\talEffectf(PARAMSTR(ECHO_FEEDBACK,ECHO,FEEDBACK));\n\t\talEffectf(PARAMSTR(ECHO_SPREAD,ECHO,SPREAD));\n\t\tbreak;\n\n\tcase TYPE_FLANGER:\n\t{\n\t\tWaveform wave = static_cast<Waveform>(getValue(FLANGER_WAVEFORM, static_cast<int>(WAVE_MAX_ENUM)));\n\t\tif (wave == WAVE_SINE)\n\t\t\talEffecti(effect, AL_FLANGER_WAVEFORM, AL_FLANGER_WAVEFORM_SINUSOID);\n\t\telse if (wave == WAVE_TRIANGLE)\n\t\t\talEffecti(effect, AL_FLANGER_WAVEFORM, AL_FLANGER_WAVEFORM_TRIANGLE);\n\t\telse\n\t\t\talEffecti(effect, AL_FLANGER_WAVEFORM, AL_FLANGER_DEFAULT_WAVEFORM);\n\n\t\talEffecti(PARAMSTR(FLANGER_PHASE,FLANGER,PHASE));\n\t\talEffectf(PARAMSTR(FLANGER_RATE,FLANGER,RATE));\n\t\talEffectf(PARAMSTR(FLANGER_DEPTH,FLANGER,DEPTH));\n\t\talEffectf(PARAMSTR(FLANGER_FEEDBACK,FLANGER,FEEDBACK));\n\t\talEffectf(PARAMSTR(FLANGER_DELAY,FLANGER,DELAY));\n\t\tbreak;\n\t}\n/*\n\tcase TYPE_FREQSHIFTER:\n\t{\n\t\talEffectf(PARAMSTR(FREQSHIFTER_FREQ,FREQUENCY_SHIFTER,FREQUENCY));\n\n\t\tDirection dir = static_cast<Direction>(getValue(FREQSHIFTER_LEFTDIR, static_cast<int>(DIR_MAX_ENUM)));\n\t\tif (dir == DIR_NONE)\n\t\t\talEffecti(effect, AL_FREQUENCY_SHIFTER_LEFT_DIRECTION, AL_FREQUENCY_SHIFTER_DIRECTION_OFF);\n\t\telse if(dir == DIR_UP)\n\t\t\talEffecti(effect, AL_FREQUENCY_SHIFTER_LEFT_DIRECTION, AL_FREQUENCY_SHIFTER_DIRECTION_UP);\n\t\telse if(dir == DIR_DOWN)\n\t\t\talEffecti(effect, AL_FREQUENCY_SHIFTER_LEFT_DIRECTION, AL_FREQUENCY_SHIFTER_DIRECTION_DOWN);\n\t\telse\n\t\t\talEffecti(effect, AL_FREQUENCY_SHIFTER_LEFT_DIRECTION, AL_FREQUENCY_SHIFTER_DEFAULT_LEFT_DIRECTION);\n\n\t\tdir = static_cast<Direction>(getValue(FREQSHIFTER_RIGHTDIR, static_cast<int>(DIR_MAX_ENUM)));\n\t\tif (dir == DIR_NONE)\n\t\t\talEffecti(effect, AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION, AL_FREQUENCY_SHIFTER_DIRECTION_OFF);\n\t\telse if(dir == DIR_UP)\n\t\t\talEffecti(effect, AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION, AL_FREQUENCY_SHIFTER_DIRECTION_UP);\n\t\telse if(dir == DIR_DOWN)\n\t\t\talEffecti(effect, AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION, AL_FREQUENCY_SHIFTER_DIRECTION_DOWN);\n\t\telse\n\t\t\talEffecti(effect, AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION, AL_FREQUENCY_SHIFTER_DEFAULT_RIGHT_DIRECTION);\n\t\tbreak;\n\t}\n\tcase TYPE_MORPHER:\n\t{\n\t\tWaveform wave = static_cast<Waveform>(getValue(MORPHER_WAVEFORM, static_cast<int>(WAVE_MAX_ENUM)));\n\t\tif (wave == WAVE_SINE)\n\t\t\talEffecti(effect, AL_VOCAL_MORPHER_WAVEFORM, AL_VOCAL_MORPHER_WAVEFORM_SINUSOID);\n\t\telse if (wave == WAVE_TRIANGLE)\n\t\t\talEffecti(effect, AL_VOCAL_MORPHER_WAVEFORM, AL_VOCAL_MORPHER_WAVEFORM_TRIANGLE);\n\t\telse if (wave == WAVE_SAWTOOTH)\n\t\t\talEffecti(effect, AL_VOCAL_MORPHER_WAVEFORM, AL_VOCAL_MORPHER_WAVEFORM_SAWTOOTH);\n\t\telse\n\t\t\talEffecti(effect, AL_VOCAL_MORPHER_WAVEFORM, AL_VOCAL_MORPHER_DEFAULT_WAVEFORM);\n\n\t\tPhoneme phoneme = static_cast<Phoneme>(getValue(MORPHER_PHONEMEA, static_cast<int>(PHONEME_MAX_ENUM)));\n\t\tif (phoneme == PHONEME_MAX_ENUM)\n\t\t\talEffecti(effect, AL_VOCAL_MORPHER_PHONEMEA, AL_VOCAL_MORPHER_DEFAULT_PHONEMEA);\n\t\telse\n\t\t\talEffecti(effect, AL_VOCAL_MORPHER_PHONEMEA, phonemeMap[phoneme]);\n\n\t\tphoneme = static_cast<Phoneme>(getValue(MORPHER_PHONEMEB, static_cast<int>(PHONEME_MAX_ENUM)));\n\t\tif (phoneme == PHONEME_MAX_ENUM)\n\t\t\talEffecti(effect, AL_VOCAL_MORPHER_PHONEMEB, AL_VOCAL_MORPHER_DEFAULT_PHONEMEB);\n\t\telse\n\t\t\talEffecti(effect, AL_VOCAL_MORPHER_PHONEMEB, phonemeMap[phoneme]);\n\n\t\talEffectf(PARAMSTR(MORPHER_RATE,VOCAL_MORPHER,RATE));\n\t\talEffecti(PARAMSTR(MORPHER_TUNEA,VOCAL_MORPHER,PHONEMEA_COARSE_TUNING));\n\t\talEffecti(PARAMSTR(MORPHER_TUNEB,VOCAL_MORPHER,PHONEMEB_COARSE_TUNING));\n\t\tbreak;\n\t}\n\tcase TYPE_PITCHSHIFTER:\n\t{\n\t\tfloat tune = getValue(PITCHSHIFTER_PITCH, (float)AL_PITCH_SHIFTER_DEFAULT_COARSE_TUNE + (float)(AL_PITCH_SHIFTER_DEFAULT_FINE_TUNE - 50) / 100.0 );\n\n\t\tint coarse = (int)floor(tune);\n\t\tint fine = (int)(fmod(tune, 1.0)*100.0);\n\t\tif (fine > 50)\n\t\t{\n\t\t\tfine -= 100;\n\t\t\tcoarse += 1;\n\t\t}\n\t\telse if (fine < -50)\n\t\t{\n\t\t\tfine += 100;\n\t\t\tcoarse -= 1;\n\t\t}\n\t\tif (coarse > AL_PITCH_SHIFTER_MAX_COARSE_TUNE)\n\t\t{\n\t\t\tcoarse = AL_PITCH_SHIFTER_MAX_COARSE_TUNE;\n\t\t\tfine = AL_PITCH_SHIFTER_MAX_FINE_TUNE;\n\t\t}\n\t\telse if (coarse < AL_PITCH_SHIFTER_MIN_COARSE_TUNE)\n\t\t{\n\t\t\tcoarse = AL_PITCH_SHIFTER_MIN_COARSE_TUNE;\n\t\t\tfine = AL_PITCH_SHIFTER_MIN_FINE_TUNE;\n\t\t}\n\t\talEffecti(effect, AL_PITCH_SHIFTER_COARSE_TUNE, coarse);\n\t\talEffecti(effect, AL_PITCH_SHIFTER_FINE_TUNE, fine);\n\t\tbreak;\n\t}\n*/\n\tcase TYPE_MODULATOR:\n\t{\n\t\tWaveform wave = static_cast<Waveform>(getValue(MODULATOR_WAVEFORM,static_cast<int>(WAVE_MAX_ENUM)));\n\t\tif (wave == WAVE_SINE)\n\t\t\talEffecti(effect, AL_RING_MODULATOR_WAVEFORM, AL_RING_MODULATOR_SINUSOID);\n\t\telse if (wave == WAVE_SAWTOOTH)\n\t\t\talEffecti(effect, AL_RING_MODULATOR_WAVEFORM, AL_RING_MODULATOR_SAWTOOTH);\n\t\telse if (wave == WAVE_SQUARE)\n\t\t\talEffecti(effect, AL_RING_MODULATOR_WAVEFORM, AL_RING_MODULATOR_SQUARE);\n\t\telse\n\t\t\talEffecti(effect, AL_RING_MODULATOR_WAVEFORM, AL_RING_MODULATOR_DEFAULT_WAVEFORM);\n\n\t\talEffectf(PARAMSTR(MODULATOR_FREQ,RING_MODULATOR,FREQUENCY));\n\t\talEffectf(PARAMSTR(MODULATOR_HIGHCUT,RING_MODULATOR,HIGHPASS_CUTOFF));\n\t\tbreak;\n\t}\n/*\n\tcase TYPE_AUTOWAH:\n\t\talEffectf(PARAMSTR(AUTOWAH_ATTACK,AUTOWAH,ATTACK_TIME));\n\t\talEffectf(PARAMSTR(AUTOWAH_RELEASE,AUTOWAH,RELEASE_TIME));\n\t\talEffectf(PARAMSTR(AUTOWAH_RESONANCE,AUTOWAH,RESONANCE));\n\t\talEffectf(PARAMSTR(AUTOWAH_PEAKGAIN,AUTOWAH,PEAK_GAIN));\n\t\tbreak;\n*/\n\tcase TYPE_COMPRESSOR:\n\t\talEffecti(effect, AL_COMPRESSOR_ONOFF, getValue(COMPRESSOR_ENABLE,static_cast<int>(AL_COMPRESSOR_DEFAULT_ONOFF)));\n\t\tbreak;\n\n\tcase TYPE_EQUALIZER:\n\t\talEffectf(PARAMSTR(EQUALIZER_LOWGAIN,EQUALIZER,LOW_GAIN));\n\t\talEffectf(PARAMSTR(EQUALIZER_LOWCUT,EQUALIZER,LOW_CUTOFF));\n\t\talEffectf(PARAMSTR(EQUALIZER_MID1GAIN,EQUALIZER,MID1_GAIN));\n\t\talEffectf(PARAMSTR(EQUALIZER_MID1FREQ,EQUALIZER,MID1_CENTER));\n\t\talEffectf(PARAMSTR(EQUALIZER_MID1BAND,EQUALIZER,MID1_WIDTH));\n\t\talEffectf(PARAMSTR(EQUALIZER_MID2GAIN,EQUALIZER,MID2_GAIN));\n\t\talEffectf(PARAMSTR(EQUALIZER_MID2FREQ,EQUALIZER,MID2_CENTER));\n\t\talEffectf(PARAMSTR(EQUALIZER_MID2BAND,EQUALIZER,MID2_WIDTH));\n\t\talEffectf(PARAMSTR(EQUALIZER_HIGHGAIN,EQUALIZER,HIGH_GAIN));\n\t\talEffectf(PARAMSTR(EQUALIZER_HIGHCUT,EQUALIZER,HIGH_CUTOFF));\n\t\tbreak;\n\tcase TYPE_BASIC:\n\tcase TYPE_MAX_ENUM:\n\t\tbreak;\n\t}\n#undef PARAMSTR\n#undef clampf\n\t//alGetError();\n\n\treturn true;\n#else\n\treturn false;\n#endif //ALC_EXT_EFX\n}\n\nconst std::map<Effect::Parameter, float> &Effect::getParams() const\n{\n\treturn params;\n}\n\nfloat Effect::getValue(Parameter in, float def) const\n{\n\treturn params.find(in) == params.end() ? def : params.at(in);\n}\n\nint Effect::getValue(Parameter in, int def) const\n{\n\treturn params.find(in) == params.end() ? def : static_cast<int>(params.at(in));\n}\n\n/*\nstd::map<Effect::Phoneme, ALint> Effect::phonemeMap =\n{\n\t{Effect::PHONEME_A, AL_VOCAL_MORPHER_PHONEME_A},\n\t{Effect::PHONEME_E, AL_VOCAL_MORPHER_PHONEME_E},\n\t{Effect::PHONEME_I, AL_VOCAL_MORPHER_PHONEME_I},\n\t{Effect::PHONEME_O, AL_VOCAL_MORPHER_PHONEME_O},\n\t{Effect::PHONEME_U, AL_VOCAL_MORPHER_PHONEME_U},\n\t{Effect::PHONEME_AA, AL_VOCAL_MORPHER_PHONEME_AA},\n\t{Effect::PHONEME_AE, AL_VOCAL_MORPHER_PHONEME_AE},\n\t{Effect::PHONEME_AH, AL_VOCAL_MORPHER_PHONEME_AH},\n\t{Effect::PHONEME_AO, AL_VOCAL_MORPHER_PHONEME_AO},\n\t{Effect::PHONEME_EH, AL_VOCAL_MORPHER_PHONEME_EH},\n\t{Effect::PHONEME_ER, AL_VOCAL_MORPHER_PHONEME_ER},\n\t{Effect::PHONEME_IH, AL_VOCAL_MORPHER_PHONEME_IH},\n\t{Effect::PHONEME_IY, AL_VOCAL_MORPHER_PHONEME_IY},\n\t{Effect::PHONEME_UH, AL_VOCAL_MORPHER_PHONEME_UH},\n\t{Effect::PHONEME_UW, AL_VOCAL_MORPHER_PHONEME_UW},\n\t{Effect::PHONEME_B, AL_VOCAL_MORPHER_PHONEME_B},\n\t{Effect::PHONEME_D, AL_VOCAL_MORPHER_PHONEME_D},\n\t{Effect::PHONEME_F, AL_VOCAL_MORPHER_PHONEME_F},\n\t{Effect::PHONEME_G, AL_VOCAL_MORPHER_PHONEME_G},\n\t{Effect::PHONEME_J, AL_VOCAL_MORPHER_PHONEME_J},\n\t{Effect::PHONEME_K, AL_VOCAL_MORPHER_PHONEME_K},\n\t{Effect::PHONEME_L, AL_VOCAL_MORPHER_PHONEME_L},\n\t{Effect::PHONEME_M, AL_VOCAL_MORPHER_PHONEME_M},\n\t{Effect::PHONEME_N, AL_VOCAL_MORPHER_PHONEME_N},\n\t{Effect::PHONEME_P, AL_VOCAL_MORPHER_PHONEME_P},\n\t{Effect::PHONEME_R, AL_VOCAL_MORPHER_PHONEME_R},\n\t{Effect::PHONEME_S, AL_VOCAL_MORPHER_PHONEME_S},\n\t{Effect::PHONEME_T, AL_VOCAL_MORPHER_PHONEME_T},\n\t{Effect::PHONEME_V, AL_VOCAL_MORPHER_PHONEME_V},\n\t{Effect::PHONEME_Z, AL_VOCAL_MORPHER_PHONEME_Z}\n};\n*/\n\n} //openal\n} //audio\n} //love\n"
  },
  {
    "path": "src/modules/audio/openal/Effect.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_AUDIO_OPENAL_EFFECTS_H\n#define LOVE_AUDIO_OPENAL_EFFECTS_H\n\n#include \"common/config.h\"\n\n// OpenAL\n#ifdef LOVE_APPLE_USE_FRAMEWORKS // Frameworks have different include paths.\n#ifdef LOVE_IOS\n#include <OpenAL/alc.h>\n#include <OpenAL/al.h>\n#else\n#include <OpenAL-Soft/alc.h>\n#include <OpenAL-Soft/al.h>\n#include <OpenAL-Soft/alext.h>\n#endif\n#else\n#include <alc.h>\n#include <al.h>\n#include <alext.h>\n#endif\n\n#include <vector>\n#include <map>\n\n#include \"audio/Effect.h\"\n#include \"Audio.h\"\n\n#ifndef AL_EFFECT_NULL\n#define AL_EFFECT_NULL (0)\n#endif\n\n#ifndef AL_EFFECTSLOT_NULL\n#define AL_EFFECTSLOT_NULL (0)\n#endif\n\nnamespace love\n{\nnamespace audio\n{\nnamespace openal\n{\n\nclass Effect : public love::audio::Effect\n{\npublic:\n\tEffect();\n\tEffect(const Effect &s);\n\tvirtual ~Effect();\n\tvirtual Effect *clone();\n\tALuint getEffect() const;\n\tvirtual bool setParams(const std::map<Parameter, float> &params);\n\tvirtual const std::map<Parameter, float> &getParams() const;\n\nprivate:\n\tbool generateEffect();\n\tvoid deleteEffect();\n\tfloat getValue(Parameter in, float def) const;\n\tint getValue(Parameter in, int def) const;\n\n\tALuint effect = AL_EFFECT_NULL;\n\tstd::map<Parameter, float> params;\n\t//static std::map<Phoneme, ALint> phonemeMap;\n};\n\n} //openal\n} //audio\n} //love\n\n#endif //LOVE_AUDIO_OPENAL_EFFECTS_H\n"
  },
  {
    "path": "src/modules/audio/openal/Filter.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Filter.h\"\n#include \"common/Exception.h\"\n\n#include <cmath>\n\nnamespace love\n{\nnamespace audio\n{\nnamespace openal\n{\n\n//base class\nFilter::Filter()\n{\n\tgenerateFilter();\n}\n\nFilter::Filter(const Filter &s)\n\t: Filter()\n{\n\tsetParams(s.getParams());\n}\n\nFilter::~Filter()\n{\n\tdeleteFilter();\n}\n\nFilter *Filter::clone()\n{\n\treturn new Filter(*this);\n}\n\nbool Filter::generateFilter()\n{\n#ifdef ALC_EXT_EFX\n\tif (!alGenFilters)\n\t\treturn false;\n\n\tif (filter != AL_FILTER_NULL)\n\t\treturn true;\n\n\talGenFilters(1, &filter);\n\tif (alGetError() != AL_NO_ERROR)\n\t\tthrow love::Exception(\"Failed to create sound Filter.\");\n\n\treturn true;\n#else\n\treturn false;\n#endif\n}\n\nvoid Filter::deleteFilter()\n{\n#ifdef ALC_EXT_EFX\n\tif (filter != AL_FILTER_NULL)\n\t\talDeleteFilters(1, &filter);\n#endif\n\tfilter = AL_FILTER_NULL;\n}\n\nALuint Filter::getFilter() const\n{\n\treturn filter;\n}\n\nbool Filter::setParams(const std::map<Parameter, float> &params)\n{\n\tthis->params = params;\n\ttype = (Type)(int) this->params[FILTER_TYPE];\n\n\tif (!generateFilter())\n\t\treturn false;\n\n#ifdef ALC_EXT_EFX\n\tswitch (type)\n\t{\n\tcase TYPE_LOWPASS:\n\t\talFilteri(filter, AL_FILTER_TYPE, AL_FILTER_LOWPASS);\n\t\tbreak;\n\tcase TYPE_HIGHPASS:\n\t\talFilteri(filter, AL_FILTER_TYPE, AL_FILTER_HIGHPASS);\n\t\tbreak;\n\tcase TYPE_BANDPASS:\n\t\talFilteri(filter, AL_FILTER_TYPE, AL_FILTER_BANDPASS);\n\t\tbreak;\n\tcase TYPE_BASIC:\n\tcase TYPE_MAX_ENUM:\n\t\tbreak;\n\t}\n\n\t//failed to make filter specific type - not supported etc.\n\tif (alGetError() != AL_NO_ERROR)\n\t{\n\t\tdeleteFilter();\n\t\treturn false;\n\t}\n\n#define clampf(v,l,h) fmax(fmin((v),(h)),(l))\n#define PARAMSTR(i,e,v) filter,AL_##e##_##v,clampf(getValue(i,AL_##e##_DEFAULT_##v),AL_##e##_MIN_##v,AL_##e##_MAX_##v)\n\tswitch (type)\n\t{\n\tcase TYPE_LOWPASS:\n\t\talFilterf(PARAMSTR(FILTER_VOLUME,LOWPASS,GAIN));\n\t\talFilterf(PARAMSTR(FILTER_HIGHGAIN,LOWPASS,GAINHF));\n\t\tbreak;\n\tcase TYPE_HIGHPASS:\n\t\talFilterf(PARAMSTR(FILTER_VOLUME,HIGHPASS,GAIN));\n\t\talFilterf(PARAMSTR(FILTER_LOWGAIN,HIGHPASS,GAINLF));\n\t\tbreak;\n\tcase TYPE_BANDPASS:\n\t\talFilterf(PARAMSTR(FILTER_VOLUME,BANDPASS,GAIN));\n\t\talFilterf(PARAMSTR(FILTER_LOWGAIN,BANDPASS,GAINLF));\n\t\talFilterf(PARAMSTR(FILTER_HIGHGAIN,BANDPASS,GAINHF));\n\t\tbreak;\n\tcase TYPE_BASIC:\n\tcase TYPE_MAX_ENUM:\n\t\tbreak;\n\t}\n#undef clampf\n#undef PARAMSTR\n\t//alGetError();\n\n\treturn true;\n#else\n\treturn false;\n#endif\n}\n\nconst std::map<Filter::Parameter, float> &Filter::getParams() const\n{\n\treturn params;\n}\n\nfloat Filter::getValue(Parameter in, float def) const\n{\n\treturn params.find(in) == params.end() ? def : params.at(in);\n}\n\nint Filter::getValue(Parameter in, int def) const\n{\n\treturn params.find(in) == params.end() ? def : static_cast<int>(params.at(in));\n}\n\n} //openal\n} //audio\n} //love\n"
  },
  {
    "path": "src/modules/audio/openal/Filter.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_AUDIO_OPENAL_FILTERS_H\n#define LOVE_AUDIO_OPENAL_FILTERS_H\n\n#include \"common/config.h\"\n\n// OpenAL\n#ifdef LOVE_APPLE_USE_FRAMEWORKS // Frameworks have different include paths.\n#ifdef LOVE_IOS\n#include <OpenAL/alc.h>\n#include <OpenAL/al.h>\n#else\n#include <OpenAL-Soft/alc.h>\n#include <OpenAL-Soft/al.h>\n#include <OpenAL-Soft/alext.h>\n#endif\n#else\n#include <alc.h>\n#include <al.h>\n#include <alext.h>\n#endif\n\n#include <vector>\n\n#include \"audio/Filter.h\"\n#include \"Audio.h\"\n\n#ifndef AL_FILTER_NULL\n#define AL_FILTER_NULL (0)\n#endif\n\nnamespace love\n{\nnamespace audio\n{\nnamespace openal\n{\n\nclass Filter : public love::audio::Filter\n{\npublic:\n\tFilter();\n\tFilter(const Filter &s);\n\tvirtual ~Filter();\n\tvirtual Filter *clone();\n\tALuint getFilter() const;\n\tvirtual bool setParams(const std::map<Parameter, float> &params);\n\tvirtual const std::map<Parameter, float> &getParams() const;\n\nprivate:\n\tbool generateFilter();\n\tvoid deleteFilter();\n\tfloat getValue(Parameter in, float def) const;\n\tint getValue(Parameter in, int def) const;\n\tALuint filter = AL_FILTER_NULL;\n\tstd::map<Parameter, float> params;\n};\n\n} //openal\n} //audio\n} //love\n\n#endif //LOVE_AUDIO_OPENAL_FILTERS_H\n"
  },
  {
    "path": "src/modules/audio/openal/Pool.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Pool.h\"\n\n#include \"event/Event.h\"\n#include \"Source.h\"\n\nnamespace love\n{\nnamespace audio\n{\nnamespace openal\n{\n\nstatic Variant::SharedTable *putSourcesAsSharedTable(std::vector<audio::Source *> &sources)\n{\n\tVariant::SharedTable *table = new Variant::SharedTable();\n\n\tfor (int i = 0; i < (int) sources.size(); i++)\n\t\ttable->pairs.emplace_back((double) (i + 1), Variant(&Source::type, sources[i]));\n\n\treturn table;\n}\n\nPool::Pool(ALCdevice *device)\n\t: device(device)\n\t, sources()\n\t, disconnectNotified(false)\n\t, totalSources(0)\n{\n\t// Clear errors.\n\talGetError();\n\n\t// Generate sources.\n\tfor (int i = 0; i < MAX_SOURCES; i++)\n\t{\n\t\talGenSources(1, &sources[i]);\n\n\t\t// We might hit an implementation-dependent limit on the total number\n\t\t// of sources before reaching MAX_SOURCES.\n\t\tif (alGetError() != AL_NO_ERROR)\n\t\t\tbreak;\n\n\t\ttotalSources++;\n\t}\n\n\tif (totalSources < 4)\n\t\tthrow love::Exception(\"Could not generate sources.\");\n\n\t// Make all sources available initially.\n\tfor (int i = 0; i < totalSources; i++)\n\t\tavailable.push(sources[i]);\n}\n\nPool::~Pool()\n{\n\tSource::stop(this);\n\n\t// Free all sources.\n\talDeleteSources(totalSources, sources);\n}\n\nbool Pool::isAvailable() const\n{\n\tbool has = false;\n\t{\n\t\tthread::Lock lock(mutex);\n\t\thas = !available.empty();\n\t}\n\treturn has;\n}\n\nbool Pool::isPlaying(Source *s)\n{\n\tbool p = false;\n\t{\n\t\tthread::Lock lock(mutex);\n\t\tp = (playing.find(s) != playing.end());\n\t}\n\treturn p;\n}\n\nvoid Pool::update()\n{\n#ifndef ALC_CONNECTED\n\tconstexpr ALCenum ALC_CONNECTED = 0x313;\n#endif\n\n\tthread::Lock lock(mutex);\n\n\tstatic bool disconnectExtSupported = alcIsExtensionPresent(device, \"ALC_EXT_disconnect\") == ALC_TRUE;\n\n\t// Device disconnection event\n\tif (disconnectExtSupported)\n\t{\n\t\tauto eventModule = Module::getInstance<event::Event>(Module::M_EVENT);\n\t\tif (eventModule)\n\t\t{\n\t\t\tALCint connected;\n\t\t\talcGetIntegerv(device, ALC_CONNECTED, 1, &connected);\n\n\t\t\tif (connected)\n\t\t\t\tdisconnectNotified = false;\n\t\t\telse if (!disconnectNotified)\n\t\t\t{\n\t\t\t\t// Get all sources in this Pool then stop it\n\t\t\t\t// since they're all internally stopped.\n\t\t\t\tstd::vector<audio::Source *> sources = getPlayingSources();\n\t\t\t\tSource::stop(sources);\n\n\t\t\t\tstd::vector<Variant> vargs;\n\t\t\t\tvargs.emplace_back(putSourcesAsSharedTable(sources));\n\n\t\t\t\tStrongRef<event::Message> msg(new event::Message(\"audiodisconnected\", vargs), Acquire::NORETAIN);\n\t\t\t\teventModule->push(msg);\n\n\t\t\t\tdisconnectNotified = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tstd::vector<Source *> torelease;\n\n\tfor (const auto &i : playing)\n\t{\n\t\tif (!i.first->update())\n\t\t\ttorelease.push_back(i.first);\n\t}\n\n\tfor (Source *s : torelease)\n\t\treleaseSource(s);\n}\n\nint Pool::getActiveSourceCount() const\n{\n\treturn (int) playing.size();\n}\n\nint Pool::getMaxSources() const\n{\n\treturn totalSources;\n}\n\nbool Pool::assignSource(Source *source, ALuint &out, char &wasPlaying)\n{\n\tout = 0;\n\n\tif (findSource(source, out))\n\t\treturn wasPlaying = true;\n\n\twasPlaying = false;\n\n\tif (available.empty())\n\t\treturn false;\n\n\tout = available.front();\n\tavailable.pop();\n\n\tplaying.insert(std::make_pair(source, out));\n\tsource->retain();\n\treturn true;\n}\n\nbool Pool::releaseSource(Source *source, bool stop)\n{\n\tALuint s;\n\n\tif (findSource(source, s))\n\t{\n\t\tif (stop)\n\t\t\tsource->stopAtomic();\n\t\tsource->release();\n\t\tavailable.push(s);\n\t\tplaying.erase(source);\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool Pool::findSource(Source *source, ALuint &out)\n{\n\tstd::map<Source *, ALuint>::const_iterator i = playing.find(source);\n\n\tif (i == playing.end())\n\t\treturn false;\n\n\tout = i->second;\n\treturn true;\n}\n\nthread::Lock Pool::lock()\n{\n\treturn thread::Lock(mutex);\n}\n\nstd::vector<love::audio::Source*> Pool::getPlayingSources()\n{\n\tstd::vector<love::audio::Source*> sources;\n\tsources.reserve(playing.size());\n\tfor (auto &i : playing)\n\t\tsources.push_back(i.first);\n\treturn sources;\n}\n\n} // openal\n} // audio\n} // love\n"
  },
  {
    "path": "src/modules/audio/openal/Pool.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_AUDIO_OPENAL_POOL_H\n#define LOVE_AUDIO_OPENAL_POOL_H\n\n// STD\n#include <queue>\n#include <map>\n#include <vector>\n#include <cmath>\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/Exception.h\"\n#include \"thread/threads.h\"\n#include \"audio/Source.h\"\n\n// OpenAL\n#ifdef LOVE_APPLE_USE_FRAMEWORKS\n#ifdef LOVE_IOS\n#include <OpenAL/alc.h>\n#include <OpenAL/al.h>\n#include <OpenAL/oalMacOSX_OALExtensions.h>\n#include <OpenAL/oalStaticBufferExtension.h>\n#else\n#include <OpenAL-Soft/alc.h>\n#include <OpenAL-Soft/al.h>\n#include <OpenAL-Soft/alext.h>\n#endif\n#else\n#include <alc.h>\n#include <al.h>\n#include <alext.h>\n#endif\n\nnamespace love\n{\nnamespace audio\n{\nnamespace openal\n{\n\nclass Source;\n\nclass Pool\n{\npublic:\n\n\tPool(ALCdevice *device);\n\t~Pool();\n\n\t/**\n\t * Checks whether an OpenAL source is available.\n\t * @return True if at least one is available, false otherwise.\n\t **/\n\tbool isAvailable() const;\n\n\t/**\n\t * Checks whether a Source is currently in the playing list.\n\t **/\n\tbool isPlaying(Source *s);\n\n\tvoid update();\n\n\tint getActiveSourceCount() const;\n\tint getMaxSources() const;\n\nprivate:\n\n\tfriend class Source;\n\tLOVE_WARN_UNUSED thread::Lock lock();\n\tstd::vector<love::audio::Source*> getPlayingSources();\n\n\t/**\n\t * Makes the specified OpenAL source available for use.\n\t * @param source The OpenAL source.\n\t **/\n\tbool releaseSource(Source *source, bool stop = true);\n\n\tbool assignSource(Source *source, ALuint &out, char &wasPlaying);\n\tbool findSource(Source *source, ALuint &out);\n\n\t// Maximum possible number of OpenAL sources the pool attempts to generate.\n\tstatic const int MAX_SOURCES = 64;\n\n\t// Current OpenAL device\n\tALCdevice *device;\n\n\t// OpenAL sources\n\tALuint sources[MAX_SOURCES];\n\n\t// Is device disconnection has been notified?\n\tbool disconnectNotified;\n\n\t// Total number of created sources in the pool.\n\tint totalSources;\n\n\t// A queue of available sources.\n\tstd::queue<ALuint> available;\n\n\t// A map of playing sources.\n\tstd::map<Source *, ALuint> playing;\n\n\t// Only one thread can access this object at the same time. This mutex will\n\t// make sure of that.\n\tlove::thread::MutexRef mutex;\n\n}; // Pool\n\n} // openal\n} // audio\n} // love\n\n#endif // LOVE_AUDIO_OPENAL_POOL_H\n"
  },
  {
    "path": "src/modules/audio/openal/RecordingDevice.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"RecordingDevice.h\"\n#include \"Audio.h\"\n#include \"sound/Sound.h\"\n\nnamespace love\n{\nnamespace audio\n{\nnamespace openal\n{\n\n#define soundInstance() (Module::getInstance<love::sound::Sound>(Module::M_SOUND))\n\nclass InvalidFormatException : public love::Exception\n{\npublic:\n\n\tInvalidFormatException(int channels, int bitdepth)\n\t\t: Exception(\"Recording %d channels with %d bits per sample is not supported.\", channels, bitdepth)\n\t{\n\t}\n\n};\n\nRecordingDevice::RecordingDevice(const char *name) \n\t: name(name)\n{\n}\n\nRecordingDevice::~RecordingDevice()\n{\n\tstop();\n}\n\nbool RecordingDevice::start(int samples, int sampleRate, int bitDepth, int channels)\n{\n\tALenum format = Audio::getFormat(bitDepth, channels);\n\tif (format == AL_NONE)\n\t\tthrow InvalidFormatException(channels, bitDepth);\n\n\tif (samples <= 0)\n\t\tthrow love::Exception(\"Invalid number of samples.\");\n\n\tif (sampleRate <= 0)\n\t\tthrow love::Exception(\"Invalid sample rate.\");\n\n\tif (isRecording())\n\t\tstop();\n\n\t// This hard-crashes on iOS with Apple's OpenAL implementation, even when\n\t// the user gives permission to the app.\n#ifndef LOVE_IOS\n\tdevice = alcCaptureOpenDevice(name.c_str(), sampleRate, format, samples);\n#endif\n\tif (device == nullptr)\n\t\treturn false;\n\n\talcCaptureStart(device);\n\n\tthis->samples = samples;\n\tthis->sampleRate = sampleRate;\n\tthis->bitDepth = bitDepth;\n\tthis->channels = channels;\n\n\treturn true;\n}\n\nvoid RecordingDevice::stop()\n{\n\tif (!isRecording())\n\t\treturn;\n\n\talcCaptureStop(device);\n\talcCaptureCloseDevice(device);\n\tdevice = nullptr;\n}\n\nlove::sound::SoundData *RecordingDevice::getData()\n{\n\tif (!isRecording())\n\t\treturn nullptr;\n\n\tint samples = getSampleCount();\n\tif (samples == 0)\n\t\treturn nullptr;\n\n\tlove::sound::SoundData *soundData = soundInstance()->newSoundData(samples, sampleRate, bitDepth, channels);\n\n\talcCaptureSamples(device, soundData->getData(), samples);\n\n\treturn soundData;\n}\n\nint RecordingDevice::getSampleCount() const\n{\n\tif (!isRecording())\n\t\treturn 0;\n\n\tALCint samples;\n\talcGetIntegerv(device, ALC_CAPTURE_SAMPLES, sizeof(ALCint), &samples);\n\treturn (int)samples;\n}\n\nint RecordingDevice::getMaxSamples() const\n{\n\treturn samples;\n}\n\nint RecordingDevice::getSampleRate() const\n{\n\treturn sampleRate;\n}\n\nint RecordingDevice::getBitDepth() const\n{\n\treturn bitDepth;\n}\n\nint RecordingDevice::getChannelCount() const\n{\n\treturn channels;\n}\n\nconst char *RecordingDevice::getName() const\n{\n\treturn name.c_str();\n}\n\nbool RecordingDevice::isRecording() const\n{\n\treturn device != nullptr;\n}\n\n} //openal\n} //audio\n} //love\n"
  },
  {
    "path": "src/modules/audio/openal/RecordingDevice.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_AUDIO_OPENAL_RECORDING_DEVICE_H\n#define LOVE_AUDIO_OPENAL_RECORDING_DEVICE_H\n\n#include \"common/config.h\"\n\n#ifdef LOVE_APPLE_USE_FRAMEWORKS\n#ifdef LOVE_IOS\n#include <OpenAL/alc.h>\n#include <OpenAL/al.h>\n#else\n#include <OpenAL-Soft/alc.h>\n#include <OpenAL-Soft/al.h>\n#endif\n#else\n#include <alc.h>\n#include <al.h>\n#endif\n\n#include \"audio/RecordingDevice.h\"\n#include \"sound/SoundData.h\"\n\nnamespace love\n{\nnamespace audio\n{\nnamespace openal\n{\n\nclass RecordingDevice : public love::audio::RecordingDevice\n{\npublic:\n\n\tRecordingDevice(const char *name);\n\tvirtual ~RecordingDevice();\n\tvirtual bool start(int samples, int sampleRate, int bitDepth, int channels);\n\tvirtual void stop();\n\tvirtual love::sound::SoundData *getData();\n\tvirtual const char *getName() const;\n\tvirtual int getSampleCount() const;\n\tvirtual int getMaxSamples() const;\n\tvirtual int getSampleRate() const;\n\tvirtual int getBitDepth() const;\n\tvirtual int getChannelCount() const;\n\tvirtual bool isRecording() const;\n\nprivate:\n\n\tint samples = DEFAULT_SAMPLES;\n\tint sampleRate = DEFAULT_SAMPLE_RATE;\n\tint bitDepth = DEFAULT_BIT_DEPTH;\n\tint channels = DEFAULT_CHANNELS;\n\n\tstd::string name;\n\tALCdevice *device = nullptr;\n\n}; //RecordingDevice\n\n} //openal\n} //audio\n} //love\n\n#endif //LOVE_AUDIO_OPENAL_RECORDING_DEVICE_H\n"
  },
  {
    "path": "src/modules/audio/openal/Source.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Source.h\"\n#include \"Filter.h\"\n#include \"Pool.h\"\n#include \"Audio.h\"\n#include \"common/math.h\"\n\n// STD\n#include <iostream>\n#include <algorithm>\n\n#define audiomodule() (Module::getInstance<Audio>(Module::M_AUDIO))\n\nusing love::thread::Lock;\n\nnamespace love\n{\nnamespace audio\n{\nnamespace openal\n{\n\nclass InvalidFormatException : public love::Exception\n{\npublic:\n\n\tInvalidFormatException(int channels, int bitdepth)\n\t\t: Exception(\"%d-channel Sources with %d bits per sample are not supported.\", channels, bitdepth)\n\t{\n\t}\n\n};\n\nclass SpatialSupportException : public love::Exception\n{\npublic:\n\n\tSpatialSupportException()\n\t\t: Exception(\"This spatial audio functionality is only available for mono Sources. \\\nEnsure the Source is not multi-channel before calling this function.\")\n\t{\n\t}\n\n};\n\nclass QueueFormatMismatchException : public love::Exception\n{\npublic:\n\n\tQueueFormatMismatchException()\n\t\t: Exception(\"Queued sound data must have same format as sound Source.\")\n\t{\n\t}\n\n};\n\nclass QueueTypeMismatchException : public love::Exception\n{\npublic:\n\n\tQueueTypeMismatchException()\n\t\t: Exception(\"Only queueable Sources can be queued with sound data.\")\n\t{\n\t}\n\n};\n\nclass QueueMalformedLengthException : public love::Exception\n{\npublic:\n\n\tQueueMalformedLengthException(int bytes)\n\t\t: Exception(\"Data length must be a multiple of sample size (%d bytes).\", bytes)\n\t{\n\t}\n\n};\n\nclass QueueLoopingException : public love::Exception\n{\npublic:\n\n\tQueueLoopingException()\n\t\t: Exception(\"Queueable Sources can not be looped.\")\n\t{\n\t}\n\n};\n\nStaticDataBuffer::StaticDataBuffer(ALenum format, const ALvoid *data, ALsizei size, ALsizei freq)\n\t: size(size)\n{\n\talGenBuffers(1, &buffer);\n\talBufferData(buffer, format, data, size, freq);\n}\n\nStaticDataBuffer::~StaticDataBuffer()\n{\n\talDeleteBuffers(1, &buffer);\n}\n\nSource::Source(Pool *pool, love::sound::SoundData *soundData)\n\t: love::audio::Source(Source::TYPE_STATIC)\n\t, pool(pool)\n\t, sampleRate(soundData->getSampleRate())\n\t, channels(soundData->getChannelCount())\n\t, bitDepth(soundData->getBitDepth())\n{\n\tALenum fmt = Audio::getFormat(soundData->getBitDepth(), soundData->getChannelCount());\n\tif (fmt == AL_NONE)\n\t\tthrow InvalidFormatException(soundData->getChannelCount(), soundData->getBitDepth());\n\n\tstaticBuffer.set(new StaticDataBuffer(fmt, soundData->getData(), (ALsizei) soundData->getSize(), sampleRate), Acquire::NORETAIN);\n\n\tfloat z[3] = {0, 0, 0};\n\n\tsetFloatv(position, z);\n\tsetFloatv(velocity, z);\n\tsetFloatv(direction, z);\n\n\tfor (int i = 0; i < audiomodule()->getMaxSourceEffects(); i++)\n\t\tslotlist.push(i);\n}\n\nSource::Source(Pool *pool, love::sound::Decoder *decoder)\n\t: love::audio::Source(Source::TYPE_STREAM)\n\t, pool(pool)\n\t, sampleRate(decoder->getSampleRate())\n\t, channels(decoder->getChannelCount())\n\t, bitDepth(decoder->getBitDepth())\n\t, decoder(decoder)\n\t, buffers(DEFAULT_BUFFERS)\n{\n\tif (Audio::getFormat(decoder->getBitDepth(), decoder->getChannelCount()) == AL_NONE)\n\t\tthrow InvalidFormatException(decoder->getChannelCount(), decoder->getBitDepth());\n\n\tfor (int i = 0; i < buffers; i++)\n\t{\n\t\tALuint buf;\n\t\talGenBuffers(1, &buf);\n\t\tif (alGetError() == AL_NO_ERROR)\n\t\t\tunusedBuffers.push(buf);\n\t\telse\n\t\t{\n\t\t\tbuffers = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tfloat z[3] = {0, 0, 0};\n\n\tsetFloatv(position, z);\n\tsetFloatv(velocity, z);\n\tsetFloatv(direction, z);\n\n\tfor (int i = 0; i < audiomodule()->getMaxSourceEffects(); i++)\n\t\tslotlist.push(i);\n}\n\nSource::Source(Pool *pool, int sampleRate, int bitDepth, int channels, int b)\n\t: love::audio::Source(Source::TYPE_QUEUE)\n\t, pool(pool)\n\t, sampleRate(sampleRate)\n\t, channels(channels)\n\t, bitDepth(bitDepth)\n\t, buffers(b)\n{\n\tALenum fmt = Audio::getFormat(bitDepth, channels);\n\tif (fmt == AL_NONE)\n\t\tthrow InvalidFormatException(channels, bitDepth);\n\n\tif (buffers < 1)\n\t\tbuffers = DEFAULT_BUFFERS;\n\tif (buffers > MAX_BUFFERS)\n\t\tbuffers = MAX_BUFFERS;\n\n\tfor (int i = 0; i < buffers; i++)\n\t{\n\t\tALuint buf;\n\t\talGenBuffers(1, &buf);\n\t\tif (alGetError() == AL_NO_ERROR)\n\t\t\tunusedBuffers.push(buf);\n\t\telse\n\t\t{\n\t\t\tbuffers = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tfloat z[3] = {0, 0, 0};\n\n\tsetFloatv(position, z);\n\tsetFloatv(velocity, z);\n\tsetFloatv(direction, z);\n\n\tfor (int i = 0; i < audiomodule()->getMaxSourceEffects(); i++)\n\t\tslotlist.push(i);\n}\n\nSource::Source(const Source &s)\n\t: love::audio::Source(s.sourceType)\n\t, pool(s.pool)\n\t, valid(false)\n\t, staticBuffer(s.staticBuffer)\n\t, pitch(s.pitch)\n\t, volume(s.volume)\n\t, relative(s.relative)\n\t, looping(s.looping)\n\t, minVolume(s.minVolume)\n\t, maxVolume(s.maxVolume)\n\t, referenceDistance(s.referenceDistance)\n\t, rolloffFactor(s.rolloffFactor)\n\t, maxDistance(s.maxDistance)\n\t, cone(s.cone)\n\t, offsetSamples(0)\n\t, sampleRate(s.sampleRate)\n\t, channels(s.channels)\n\t, bitDepth(s.bitDepth)\n\t, decoder(nullptr)\n\t, toLoop(0)\n\t, buffers(s.buffers)\n{\n\tif (sourceType == TYPE_STREAM)\n\t{\n\t\tif (s.decoder.get())\n\t\t\tdecoder.set(s.decoder->clone(), Acquire::NORETAIN);\n\t}\n\tif (sourceType != TYPE_STATIC)\n\t{\n\t\tfor (int i = 0; i < buffers; i++)\n\t\t{\n\t\t\tALuint buf;\n\t\t\talGenBuffers(1, &buf);\n\t\t\tif (alGetError() == AL_NO_ERROR)\n\t\t\t\tunusedBuffers.push(buf);\n\t\t\telse\n\t\t\t{\n\t\t\t\tbuffers = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (s.directfilter)\n\t\tdirectfilter = s.directfilter->clone();\n\n\tfor (auto e : s.effectmap)\n\t{\n\t\tFilter *filter = e.second.filter ? e.second.filter->clone() : nullptr;\n\t\teffectmap[e.first] = { filter, e.second.slot, e.second.target };\n\t}\n\n\tsetFloatv(position, s.position);\n\tsetFloatv(velocity, s.velocity);\n\tsetFloatv(direction, s.direction);\n\n\tfor (int i = 0; i < audiomodule()->getMaxSourceEffects(); i++)\n\t{\n\t\t// filter out already taken slots\n\t\tbool push = true;\n\t\tfor (auto e : effectmap)\n\t\t{\n\t\t\tif (e.second.slot)\n\t\t\t{\n\t\t\t\tpush = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (push)\n\t\t\tslotlist.push(i);\n\t}\n}\n\nSource::~Source()\n{\n\tstop();\n\n\tif (sourceType != TYPE_STATIC)\n\t{\n\t\twhile (!streamBuffers.empty())\n\t\t{\n\t\t\talDeleteBuffers(1, &streamBuffers.front());\n\t\t\tstreamBuffers.pop();\n\t\t}\n\t\twhile (!unusedBuffers.empty())\n\t\t{\n\t\t\talDeleteBuffers(1, &unusedBuffers.top());\n\t\t\tunusedBuffers.pop();\n\t\t}\n\t}\n\n\tif (directfilter)\n\t\tdelete directfilter;\n\n\tfor (auto e : effectmap)\n\t{\n\t\tif (e.second.filter)\n\t\t\tdelete e.second.filter;\n\t}\n}\n\nlove::audio::Source *Source::clone()\n{\n\treturn new Source(*this);\n}\n\nbool Source::play()\n{\n\tLock l = pool->lock();\n\tALuint out;\n\n\tchar wasPlaying;\n\tif (!pool->assignSource(this, out, wasPlaying))\n\t\treturn valid = false;\n\n\tif (!wasPlaying)\n\t\treturn valid = playAtomic(out);\n\n\tresumeAtomic();\n\treturn valid = true;\n}\n\nvoid Source::stop()\n{\n\tif (!valid)\n\t\treturn;\n\n\tLock l = pool->lock();\n\tpool->releaseSource(this);\n}\n\nvoid Source::pause()\n{\n\tLock l = pool->lock();\n\tif (pool->isPlaying(this))\n\t\tpauseAtomic();\n}\n\nbool Source::isPlaying() const\n{\n\tif (!valid)\n\t\treturn false;\n\n\tALenum state;\n\talGetSourcei(source, AL_SOURCE_STATE, &state);\n\treturn state == AL_PLAYING;\n}\n\nbool Source::isFinished() const\n{\n\tif (!valid)\n\t\treturn false;\n\n\tif (sourceType == TYPE_STREAM && (isLooping() || !decoder->isFinished()))\n\t\treturn false;\n\n\tALenum state;\n\talGetSourcei(source, AL_SOURCE_STATE, &state);\n\treturn state == AL_STOPPED;\n}\n\nbool Source::update()\n{\n\tif (!valid)\n\t\treturn false;\n\n\tswitch (sourceType)\n\t{\n\t\tcase TYPE_STATIC:\n\t\t{\n\t\t\t// Looping mode could have changed.\n\t\t\t// FIXME: make looping mode change atomically so this is not needed\n\t\t\talSourcei(source, AL_LOOPING, isLooping() ? AL_TRUE : AL_FALSE);\n\t\t\treturn !isFinished();\n\t\t}\n\t\tcase TYPE_STREAM:\n\t\t\tif (!isFinished())\n\t\t\t{\n\t\t\t\tALint processed;\n\t\t\t\talGetSourcei(source, AL_BUFFERS_PROCESSED, &processed);\n\n\t\t\t\t// It would theoretically be better to unqueue all processed\n\t\t\t\t// buffers in a single call to alSourceUnqueueBuffers, but on\n\t\t\t\t// iOS I observed occasional (every ~5-10 seconds) pops in the\n\t\t\t\t// streaming source test I was using, when doing that. Perhaps\n\t\t\t\t// there was a bug in this code when I was testing, or maybe\n\t\t\t\t// this code runs into the same problem but now it's much harder\n\t\t\t\t// to reproduce. The test I used is the play-stop-play .love\n\t\t\t\t// from https://bitbucket.org/rude/love/issues/1484/\n\t\t\t\twhile (processed--)\n\t\t\t\t{\n\t\t\t\t\tint curOffsetSamples;\n\t\t\t\t\talGetSourcei(source, AL_SAMPLE_OFFSET, &curOffsetSamples);\n\n\t\t\t\t\tALuint buffer;\n\t\t\t\t\talSourceUnqueueBuffers(source, 1, &buffer);\n\n\t\t\t\t\tint newOffsetSamples;\n\t\t\t\t\talGetSourcei(source, AL_SAMPLE_OFFSET, &newOffsetSamples);\n\n\t\t\t\t\toffsetSamples += (curOffsetSamples - newOffsetSamples);\n\n\t\t\t\t\tif (streamAtomic(buffer, decoder.get()) > 0)\n\t\t\t\t\t\talSourceQueueBuffers(source, 1, &buffer);\n\t\t\t\t\telse\n\t\t\t\t\t\tunusedBuffers.push(buffer);\n\t\t\t\t}\n\n\t\t\t\twhile (!unusedBuffers.empty())\n\t\t\t\t{\n\t\t\t\t\tALuint b = unusedBuffers.top();\n\t\t\t\t\tif (streamAtomic(b, decoder.get()) > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\talSourceQueueBuffers(source, 1, &b);\n\t\t\t\t\t\tunusedBuffers.pop();\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\tcase TYPE_QUEUE:\n\t\t{\n\t\t\tALint processed;\n\t\t\tALuint buffers[MAX_BUFFERS];\n\n\t\t\talGetSourcei(source, AL_BUFFERS_PROCESSED, &processed);\n\t\t\talSourceUnqueueBuffers(source, processed, buffers);\n\n\t\t\tfor (int i = 0; i < processed; i++)\n\t\t\t{\n\t\t\t\tALint size;\n\t\t\t\talGetBufferi(buffers[i], AL_SIZE, &size);\n\t\t\t\tbufferedBytes -= size;\n\t\t\t\tunusedBuffers.push(buffers[i]);\n\t\t\t}\n\t\t\treturn !isFinished();\n\t\t}\n\t\tcase TYPE_MAX_ENUM:\n\t\t\tbreak;\n\t}\n\n\treturn false;\n}\n\nvoid Source::setPitch(float pitch)\n{\n\tif (valid)\n\t\talSourcef(source, AL_PITCH, pitch);\n\n\tthis->pitch = pitch;\n}\n\nfloat Source::getPitch() const\n{\n\tif (valid)\n\t{\n\t\tALfloat f;\n\t\talGetSourcef(source, AL_PITCH, &f);\n\t\treturn f;\n\t}\n\n\t// In case the Source isn't playing.\n\treturn pitch;\n}\n\nvoid Source::setVolume(float volume)\n{\n\tif (valid)\n\t\talSourcef(source, AL_GAIN, volume);\n\n\tthis->volume = volume;\n}\n\nfloat Source::getVolume() const\n{\n\tif (valid)\n\t{\n\t\tALfloat f;\n\t\talGetSourcef(source, AL_GAIN, &f);\n\t\treturn f;\n\t}\n\n\t// In case the Source isn't playing.\n\treturn volume;\n}\n\nvoid Source::seek(double offset, Source::Unit unit)\n{\n\tLock l = pool->lock();\n\n\tint offsetSamples = 0;\n\tdouble offsetSeconds = 0.0f;\n\n\tswitch (unit)\n\t{\n\tcase Source::UNIT_SAMPLES:\n\t\toffsetSamples = (int) offset;\n\t\toffsetSeconds = offset / (double) sampleRate;\n\t\tbreak;\n\tcase Source::UNIT_SECONDS:\n\tdefault:\n\t\toffsetSeconds = offset;\n\t\toffsetSamples = (int) (offset * sampleRate);\n\t\tbreak;\n\t}\n\n\tbool wasPlaying = isPlaying();\n\tswitch (sourceType)\n\t{\n\t\tcase TYPE_STATIC:\n\t\t\tif (valid)\n\t\t\t{\n\t\t\t\talSourcei(source, AL_SAMPLE_OFFSET, offsetSamples);\n\t\t\t\toffsetSamples = offsetSeconds = 0;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase TYPE_STREAM:\n\t\t{\n\t\t\t// To drain all buffers\n\t\t\tif (valid)\n\t\t\t\tstop();\n\n\t\t\tdecoder->seek(offsetSeconds);\n\n\t\t\tif (wasPlaying)\n\t\t\t\tplay();\n\n\t\t\tbreak;\n\t\t}\n\t\tcase TYPE_QUEUE:\n\t\t\tif (valid)\n\t\t\t{\n\t\t\t\talSourcei(source, AL_SAMPLE_OFFSET, offsetSamples);\n\t\t\t\toffsetSamples = offsetSeconds = 0;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//emulate AL behavior, discarding buffer once playback head is past one\n\t\t\t\twhile (!unusedBuffers.empty())\n\t\t\t\t{\n\t\t\t\t\tALint size;\n\t\t\t\t\tauto buffer = unusedBuffers.top();\n\t\t\t\t\talGetBufferi(buffer, AL_SIZE, &size);\n\n\t\t\t\t\tif (offsetSamples < size / (bitDepth / 8 * channels))\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tunusedBuffers.pop();\n\t\t\t\t\tbufferedBytes -= size;\n\t\t\t\t\toffsetSamples -= size / (bitDepth / 8 * channels);\n\t\t\t\t}\n\t\t\t\tif (unusedBuffers.empty())\n\t\t\t\t\toffsetSamples = 0;\n\t\t\t\toffsetSeconds = offsetSamples / (double) sampleRate;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase TYPE_MAX_ENUM:\n\t\t\tbreak;\n\t}\n\n\tif (wasPlaying && (alGetError() == AL_INVALID_VALUE || (sourceType == TYPE_STREAM && !isPlaying())))\n\t{\n\t\tstop();\n\t\tif (isLooping())\n\t\t\tplay();\n\t\treturn;\n\t}\n\n\tthis->offsetSamples = offsetSamples;\n}\n\ndouble Source::tell(Source::Unit unit)\n{\n\tLock l = pool->lock();\n\n\tint offset = 0;\n\n\tif (valid)\n\t\talGetSourcei(source, AL_SAMPLE_OFFSET, &offset);\n\n\toffset += offsetSamples;\n\n\tif (unit == UNIT_SECONDS)\n\t\treturn offset / (double) sampleRate;\n\telse\n\t\treturn offset;\n}\n\ndouble Source::getDuration(Unit unit)\n{\n\tLock l = pool->lock();\n\n\tswitch (sourceType)\n\t{\n\tcase TYPE_STATIC:\n\t{\n\t\tALsizei size = staticBuffer->getSize();\n\t\tALsizei samples = (size / channels) / (bitDepth / 8);\n\n\t\tif (unit == UNIT_SAMPLES)\n\t\t\treturn (double) samples;\n\t\telse\n\t\t\treturn (double) samples / (double) sampleRate;\n\t}\n\tcase TYPE_STREAM:\n\t{\n\t\tdouble seconds = decoder->getDuration();\n\n\t\tif (unit == UNIT_SECONDS)\n\t\t\treturn seconds;\n\t\telse\n\t\t\treturn seconds * decoder->getSampleRate();\n\t}\n\tcase TYPE_QUEUE:\n\t{\n\t\tALsizei samples = (bufferedBytes / channels) / (bitDepth / 8);\n\n\t\tif (unit == UNIT_SAMPLES)\n\t\t\treturn (double)samples;\n\t\telse\n\t\t\treturn (double)samples / (double)sampleRate;\n\t}\n\tcase TYPE_MAX_ENUM:\n\t\treturn 0.0;\n\t}\n\treturn 0.0;\n}\n\nvoid Source::setPosition(float *v)\n{\n\tif (channels > 1)\n\t\tthrow SpatialSupportException();\n\n\tif (valid)\n\t\talSourcefv(source, AL_POSITION, v);\n\n\tsetFloatv(position, v);\n}\n\nvoid Source::getPosition(float *v) const\n{\n\tif (channels > 1)\n\t\tthrow SpatialSupportException();\n\n\tif (valid)\n\t\talGetSourcefv(source, AL_POSITION, v);\n\telse\n\t\tsetFloatv(v, position);\n}\n\nvoid Source::setVelocity(float *v)\n{\n\tif (channels > 1)\n\t\tthrow SpatialSupportException();\n\n\tif (valid)\n\t\talSourcefv(source, AL_VELOCITY, v);\n\n\tsetFloatv(velocity, v);\n}\n\nvoid Source::getVelocity(float *v) const\n{\n\tif (channels > 1)\n\t\tthrow SpatialSupportException();\n\n\tif (valid)\n\t\talGetSourcefv(source, AL_VELOCITY, v);\n\telse\n\t\tsetFloatv(v, velocity);\n}\n\nvoid Source::setDirection(float *v)\n{\n\tif (channels > 1)\n\t\tthrow SpatialSupportException();\n\n\tif (valid)\n\t\talSourcefv(source, AL_DIRECTION, v);\n\telse\n\t\tsetFloatv(direction, v);\n}\n\nvoid Source::getDirection(float *v) const\n{\n\tif (channels > 1)\n\t\tthrow SpatialSupportException();\n\n\tif (valid)\n\t\talGetSourcefv(source, AL_DIRECTION, v);\n\telse\n\t\tsetFloatv(v, direction);\n}\n\nvoid Source::setCone(float innerAngle, float outerAngle, float outerVolume, float outerHighGain)\n{\n\tif (channels > 1)\n\t\tthrow SpatialSupportException();\n\n\tcone.innerAngle  = (int) LOVE_TODEG(innerAngle);\n\tcone.outerAngle  = (int) LOVE_TODEG(outerAngle);\n\tcone.outerVolume = outerVolume;\n\tcone.outerHighGain = outerHighGain;\n\n\tif (valid)\n\t{\n\t\talSourcei(source, AL_CONE_INNER_ANGLE, cone.innerAngle);\n\t\talSourcei(source, AL_CONE_OUTER_ANGLE, cone.outerAngle);\n\t\talSourcef(source, AL_CONE_OUTER_GAIN, cone.outerVolume);\n#ifdef ALC_EXT_EFX\n\t\talSourcef(source, AL_CONE_OUTER_GAINHF, cone.outerHighGain);\n#endif\n\t}\n}\n\nvoid Source::getCone(float &innerAngle, float &outerAngle, float &outerVolume, float &outerHighGain) const\n{\n\tif (channels > 1)\n\t\tthrow SpatialSupportException();\n\n\tinnerAngle  = LOVE_TORAD(cone.innerAngle);\n\touterAngle  = LOVE_TORAD(cone.outerAngle);\n\touterVolume = cone.outerVolume;\n\touterHighGain = cone.outerHighGain;\n}\n\nvoid Source::setRelative(bool enable)\n{\n\tif (channels > 1)\n\t\tthrow SpatialSupportException();\n\n\tif (valid)\n\t\talSourcei(source, AL_SOURCE_RELATIVE, enable ? AL_TRUE : AL_FALSE);\n\n\trelative = enable;\n}\n\nbool Source::isRelative() const\n{\n\tif (channels > 1)\n\t\tthrow SpatialSupportException();\n\n\treturn relative;\n}\n\nvoid Source::setLooping(bool enable)\n{\n\tif (sourceType == TYPE_QUEUE)\n\t\tthrow QueueLoopingException();\n\n\tif (valid && sourceType == TYPE_STATIC)\n\t\talSourcei(source, AL_LOOPING, enable ? AL_TRUE : AL_FALSE);\n\n\tlooping = enable;\n}\n\nbool Source::isLooping() const\n{\n\treturn looping;\n}\n\nbool Source::queue(void *data, size_t length, int dataSampleRate, int dataBitDepth, int dataChannels)\n{\n\tif (sourceType != TYPE_QUEUE)\n\t\tthrow QueueTypeMismatchException();\n\n\tif (dataSampleRate != sampleRate || dataBitDepth != bitDepth || dataChannels != channels )\n\t\tthrow QueueFormatMismatchException();\n\n\tif (length % (bitDepth / 8 * channels) != 0)\n\t\tthrow QueueMalformedLengthException(bitDepth / 8 * channels);\n\n\tif (length == 0)\n\t\treturn true;\n\n\tLock l = pool->lock();\n\n\tif (unusedBuffers.empty())\n\t\treturn false;\n\n\tauto buffer = unusedBuffers.top();\n\tunusedBuffers.pop();\n\talBufferData(buffer, Audio::getFormat(bitDepth, channels), data, length, sampleRate);\n\tbufferedBytes += length;\n\n\tif (valid)\n\t\talSourceQueueBuffers(source, 1, &buffer);\n\telse\n\t\tstreamBuffers.push(buffer);\n\n\treturn true;\n}\n\nint Source::getFreeBufferCount() const\n{\n\tswitch (sourceType) //why not :^)\n\t{\n\tcase TYPE_STATIC:\n\t\treturn 0;\n\tcase TYPE_STREAM:\n\t\treturn unusedBuffers.size();\n\tcase TYPE_QUEUE:\n\t\treturn unusedBuffers.size();\n\tcase TYPE_MAX_ENUM:\n\t\treturn 0;\n\t}\n\treturn 0;\n}\n\nvoid Source::prepareAtomic()\n{\n\t// This Source may now be associated with an OpenAL source that still has\n\t// the properties of another love Source. Let's reset it to the settings\n\t// of the new one.\n\treset();\n\n\tswitch (sourceType)\n\t{\n\tcase TYPE_STATIC:\n\t\talSourcei(source, AL_BUFFER, staticBuffer->getBuffer());\n\t\tbreak;\n\tcase TYPE_STREAM:\n\t\twhile (!unusedBuffers.empty())\n\t\t{\n\t\t\tauto b = unusedBuffers.top();\n\t\t\tif (streamAtomic(b, decoder.get()) == 0)\n\t\t\t\tbreak;\n\n\t\t\talSourceQueueBuffers(source, 1, &b);\n\t\t\tunusedBuffers.pop();\n\n\t\t\tif (decoder->isFinished())\n\t\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\tcase TYPE_QUEUE:\n\t{\n\t\twhile (!streamBuffers.empty())\n\t\t{\n\t\t\talSourceQueueBuffers(source, 1, &streamBuffers.front());\n\t\t\tstreamBuffers.pop();\n\t\t}\n\t\tbreak;\n\t}\n\tcase TYPE_MAX_ENUM:\n\t\tbreak;\n\t}\n\n\t// Seek to the current/pending offset.\n\talSourcei(source, AL_SAMPLE_OFFSET, offsetSamples);\n}\n\nvoid Source::teardownAtomic()\n{\n\tswitch (sourceType)\n\t{\n\tcase TYPE_STATIC:\n\t\tbreak;\n\tcase TYPE_STREAM:\n\t{\n\t\tALint queued = 0;\n\t\tALuint buffers[MAX_BUFFERS];\n\n\t\t// Some decoders (e.g. ModPlug) can rewind() more reliably than seek(0).\n\t\tdecoder->rewind();\n\n\t\t// Drain buffers.\n\t\t// NOTE: The Apple implementation of OpenAL on iOS doesn't return\n\t\t// correct buffer ids for single alSourceUnqueueBuffers calls past the\n\t\t// first queued buffer, so we must unqueue them all at once.\n\t\talGetSourcei(source, AL_BUFFERS_QUEUED, &queued);\n\t\talSourceUnqueueBuffers(source, queued, buffers);\n\n\t\tfor (int i = 0; i < queued; i++)\n\t\t\tunusedBuffers.push(buffers[i]);\n\t\tbreak;\n\t}\n\tcase TYPE_QUEUE:\n\t{\n\t\tALint queued;\n\t\tALuint buffers[MAX_BUFFERS];\n\n\t\talGetSourcei(source, AL_BUFFERS_QUEUED, &queued);\n\t\talSourceUnqueueBuffers(source, queued, buffers);\n\n\t\tfor (int i = 0; i < queued; i++)\n\t\t\tunusedBuffers.push(buffers[i]);\n\t\tbreak;\n\t}\n\tcase TYPE_MAX_ENUM:\n\t\tbreak;\n\t}\n\n\talSourcei(source, AL_BUFFER, AL_NONE);\n\n\ttoLoop = 0;\n\tvalid = false;\n\toffsetSamples = 0;\n}\n\nbool Source::playAtomic(ALuint source)\n{\n\tthis->source = source;\n\tprepareAtomic();\n\n\t// Clear errors.\n\talGetError();\n\n\talSourcePlay(source);\n\n\tbool success = alGetError() == AL_NO_ERROR;\n\n\tif (sourceType == TYPE_STREAM)\n\t{\n\t\tvalid = true; //isPlaying() needs source to be valid\n\t\tif (!isPlaying())\n\t\t\tsuccess = false;\n\t}\n\n\tif (!success)\n\t{\n\t\tvalid = true; //stop() needs source to be valid\n\t\tstop();\n\t}\n\n\t// Static sources: reset the pending offset since it's not valid anymore.\n\tif (sourceType != TYPE_STREAM)\n\t\toffsetSamples = 0;\n\n\treturn success;\n}\n\nvoid Source::stopAtomic()\n{\n\tif (!valid)\n\t\treturn;\n\talSourceStop(source);\n\tteardownAtomic();\n}\n\nvoid Source::pauseAtomic()\n{\n\tif (valid)\n\t\talSourcePause(source);\n}\n\nvoid Source::resumeAtomic()\n{\n\tif (valid && !isPlaying())\n\t{\n\t\talSourcePlay(source);\n\n\t\t//failed to play or nothing to play\n\t\tif (alGetError() == AL_INVALID_VALUE || (sourceType == TYPE_STREAM && (int) unusedBuffers.size() == buffers))\n\t\t\tstop();\n\t}\n}\n\nbool Source::play(const std::vector<love::audio::Source*> &sources)\n{\n\tif (sources.size() == 0)\n\t\treturn true;\n\n\tPool *pool = ((Source*) sources[0])->pool;\n\tLock l = pool->lock();\n\n\t// NOTE: not bool, because std::vector<bool> is implemented as a bitvector\n\t// which means no bool references can be created.\n\tstd::vector<char> wasPlaying(sources.size());\n\tstd::vector<ALuint> ids(sources.size());\n\n\tfor (size_t i = 0; i < sources.size(); i++)\n\t{\n\t\tif (!pool->assignSource((Source*) sources[i], ids[i], wasPlaying[i]))\n\t\t{\n\t\t\tfor (size_t j = 0; j < i; j++)\n\t\t\t\tif (!wasPlaying[j])\n\t\t\t\t\tpool->releaseSource((Source*) sources[j], false);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tstd::vector<ALuint> toPlay;\n\ttoPlay.reserve(sources.size());\n\tfor (size_t i = 0; i < sources.size(); i++)\n\t{\n\t\t// If the source was paused, wasPlaying[i] will be true but we still\n\t\t// want to resume it. We don't want to call alSourcePlay on sources\n\t\t// that are actually playing though.\n\t\tif (wasPlaying[i] && sources[i]->isPlaying())\n\t\t\tcontinue;\n\n\t\tif (!wasPlaying[i])\n\t\t{\n\t\t\tSource *source = (Source*) sources[i];\n\t\t\tsource->source = ids[i];\n\t\t\tsource->prepareAtomic();\n\t\t}\n\n\t\ttoPlay.push_back(ids[i]);\n\t}\n\n\talGetError();\n\talSourcePlayv((ALsizei) toPlay.size(), &toPlay[0]);\n\tbool success = alGetError() == AL_NO_ERROR;\n\n\tfor (auto &_source : sources)\n\t{\n\t\tSource *source = (Source*) _source;\n\t\tsource->valid = source->valid || success;\n\n\t\tif (success && source->sourceType != TYPE_STREAM)\n\t\t\tsource->offsetSamples = 0;\n\t}\n\n\treturn success;\n}\n\nvoid Source::stop(const std::vector<love::audio::Source*> &sources)\n{\n\tif (sources.size() == 0)\n\t\treturn;\n\n\tPool *pool = ((Source*) sources[0])->pool;\n\tLock l = pool->lock();\n\n\tstd::vector<ALuint> sourceIds;\n\tsourceIds.reserve(sources.size());\n\tfor (auto &_source : sources)\n\t{\n\t\tSource *source = (Source*) _source;\n\t\tif (source->valid)\n\t\t\tsourceIds.push_back(source->source);\n\t}\n\n\talSourceStopv((ALsizei) sourceIds.size(), &sourceIds[0]);\n\n\tfor (auto &_source : sources)\n\t{\n\t\tSource *source = (Source*) _source;\n\t\tif (source->valid)\n\t\t\tsource->teardownAtomic();\n\t\tpool->releaseSource(source, false);\n\t}\n}\n\nvoid Source::pause(const std::vector<love::audio::Source*> &sources)\n{\n\tif (sources.size() == 0)\n\t\treturn;\n\n\tLock l = ((Source*) sources[0])->pool->lock();\n\n\tstd::vector<ALuint> sourceIds;\n\tsourceIds.reserve(sources.size());\n\tfor (auto &_source : sources)\n\t{\n\t\tSource *source = (Source*) _source;\n\t\tif (source->valid)\n\t\t\tsourceIds.push_back(source->source);\n\t}\n\n\talSourcePausev((ALsizei) sourceIds.size(), &sourceIds[0]);\n}\n\nstd::vector<love::audio::Source*> Source::pause(Pool *pool)\n{\n\tLock l = pool->lock();\n\tstd::vector<love::audio::Source*> sources = pool->getPlayingSources();\n\n\tauto newend = std::remove_if(sources.begin(), sources.end(), [](love::audio::Source* s) {\n\t\treturn !s->isPlaying();\n\t});\n\tsources.erase(newend, sources.end());\n\n\tpause(sources);\n\treturn sources;\n}\n\nvoid Source::stop(Pool *pool)\n{\n\tLock l = pool->lock();\n\tstop(pool->getPlayingSources());\n}\n\nvoid Source::reset()\n{\n\talSourcei(source, AL_BUFFER, AL_NONE);\n\talSourcefv(source, AL_POSITION, position);\n\talSourcefv(source, AL_VELOCITY, velocity);\n\talSourcefv(source, AL_DIRECTION, direction);\n\talSourcef(source, AL_PITCH, pitch);\n\talSourcef(source, AL_GAIN, volume);\n\talSourcef(source, AL_MIN_GAIN, minVolume);\n\talSourcef(source, AL_MAX_GAIN, maxVolume);\n\talSourcef(source, AL_REFERENCE_DISTANCE, referenceDistance);\n\talSourcef(source, AL_ROLLOFF_FACTOR, rolloffFactor);\n\talSourcef(source, AL_MAX_DISTANCE, maxDistance);\n\talSourcei(source, AL_LOOPING, (sourceType == TYPE_STATIC) && isLooping() ? AL_TRUE : AL_FALSE);\n\talSourcei(source, AL_SOURCE_RELATIVE, relative ? AL_TRUE : AL_FALSE);\n\talSourcei(source, AL_CONE_INNER_ANGLE, cone.innerAngle);\n\talSourcei(source, AL_CONE_OUTER_ANGLE, cone.outerAngle);\n\talSourcef(source, AL_CONE_OUTER_GAIN, cone.outerVolume);\n#ifdef ALC_EXT_EFX\n\talSourcef(source, AL_AIR_ABSORPTION_FACTOR, absorptionFactor);\n\talSourcef(source, AL_CONE_OUTER_GAINHF, cone.outerHighGain);\n\talSourcef(source, AL_ROOM_ROLLOFF_FACTOR, rolloffFactor); //reverb-specific rolloff\n\talSourcei(source, AL_DIRECT_FILTER, directfilter ? directfilter->getFilter() : AL_FILTER_NULL);\n\t// clear all send slots, then re-enable applied ones\n\tfor (int i = 0; i < audiomodule()->getMaxSourceEffects(); i++)\n\t\talSource3i(source, AL_AUXILIARY_SEND_FILTER, AL_EFFECTSLOT_NULL, i, AL_FILTER_NULL);\n\tfor (auto i : effectmap)\n\t\talSource3i(source, AL_AUXILIARY_SEND_FILTER, i.second.target, i.second.slot, i.second.filter ? i.second.filter->getFilter() : AL_FILTER_NULL);\n\t//alGetError();\n#endif\n}\n\nvoid Source::setFloatv(float *dst, const float *src) const\n{\n\tdst[0] = src[0];\n\tdst[1] = src[1];\n\tdst[2] = src[2];\n}\n\nint Source::streamAtomic(ALuint buffer, love::sound::Decoder *d)\n{\n\t// Get more sound data.\n\tint decoded = std::max(d->decode(), 0);\n\n\t// OpenAL implementations are allowed to ignore 0-size alBufferData calls.\n\tif (decoded > 0)\n\t{\n\t\tint fmt = Audio::getFormat(d->getBitDepth(), d->getChannelCount());\n\n\t\tif (fmt != AL_NONE)\n\t\t\talBufferData(buffer, fmt, d->getBuffer(), decoded, d->getSampleRate());\n\t\telse\n\t\t\tdecoded = 0;\n\t}\n\n\t// This shouldn't run after toLoop is calculated in this streamAtomic call,\n\t// otherwise it'll decrease too quickly.\n\t// TODO: this code is hard to understand, can it be made more clear?\n\t// It's meant to reset offsetSamples once OpenAL starts processing the first\n\t// queued buffer after a loop.\n\tif (toLoop > 0)\n\t{\n\t\tif (--toLoop == 0)\n\t\t{\n\t\t\toffsetSamples = 0;\n\t\t}\n\t}\n\n\tif (decoder->isFinished() && isLooping())\n\t{\n\t\tint queued, processed;\n\t\talGetSourcei(source, AL_BUFFERS_QUEUED, &queued);\n\t\talGetSourcei(source, AL_BUFFERS_PROCESSED, &processed);\n\t\tif (queued > processed)\n\t\t\ttoLoop = queued-processed;\n\t\telse\n\t\t\ttoLoop = buffers-processed;\n\t\td->rewind();\n\t}\n\n\treturn decoded;\n}\n\nvoid Source::setMinVolume(float volume)\n{\n\tif (valid)\n\t\talSourcef(source, AL_MIN_GAIN, volume);\n\n\tminVolume = volume;\n}\n\nfloat Source::getMinVolume() const\n{\n\tif (valid)\n\t{\n\t\tALfloat f;\n\t\talGetSourcef(source, AL_MIN_GAIN, &f);\n\t\treturn f;\n\t}\n\n\t// In case the Source isn't playing.\n\treturn this->minVolume;\n}\n\nvoid Source::setMaxVolume(float volume)\n{\n\tif (valid)\n\t\talSourcef(source, AL_MAX_GAIN, volume);\n\n\tmaxVolume = volume;\n}\n\nfloat Source::getMaxVolume() const\n{\n\tif (valid)\n\t{\n\t\tALfloat f;\n\t\talGetSourcef(source, AL_MAX_GAIN, &f);\n\t\treturn f;\n\t}\n\n\t// In case the Source isn't playing.\n\treturn maxVolume;\n}\n\nvoid Source::setReferenceDistance(float distance)\n{\n\tif (channels > 1)\n\t\tthrow SpatialSupportException();\n\n\tif (valid)\n\t\talSourcef(source, AL_REFERENCE_DISTANCE, distance);\n\n\treferenceDistance = distance;\n}\n\nfloat Source::getReferenceDistance() const\n{\n\tif (channels > 1)\n\t\tthrow SpatialSupportException();\n\n\tif (valid)\n\t{\n\t\tALfloat f;\n\t\talGetSourcef(source, AL_REFERENCE_DISTANCE, &f);\n\t\treturn f;\n\t}\n\n\t// In case the Source isn't playing.\n\treturn referenceDistance;\n}\n\nvoid Source::setRolloffFactor(float factor)\n{\n\tif (channels > 1)\n\t\tthrow SpatialSupportException();\n\n\tif (valid)\n\t\talSourcef(source, AL_ROLLOFF_FACTOR, factor);\n\n\trolloffFactor = factor;\n}\n\nfloat Source::getRolloffFactor() const\n{\n\tif (channels > 1)\n\t\tthrow SpatialSupportException();\n\n\tif (valid)\n\t{\n\t\tALfloat f;\n\t\talGetSourcef(source, AL_ROLLOFF_FACTOR, &f);\n\t\treturn f;\n\t}\n\n\t// In case the Source isn't playing.\n\treturn rolloffFactor;\n}\n\nvoid Source::setMaxDistance(float distance)\n{\n\tif (channels > 1)\n\t\tthrow SpatialSupportException();\n\n\tdistance = std::min(distance, MAX_ATTENUATION_DISTANCE);\n\n\tif (valid)\n\t\talSourcef(source, AL_MAX_DISTANCE, distance);\n\n\tmaxDistance = distance;\n}\n\nfloat Source::getMaxDistance() const\n{\n\tif (channels > 1)\n\t\tthrow SpatialSupportException();\n\n\tif (valid)\n\t{\n\t\tALfloat f;\n\t\talGetSourcef(source, AL_MAX_DISTANCE, &f);\n\t\treturn f;\n\t}\n\n\t// In case the Source isn't playing.\n\treturn maxDistance;\n}\n\nvoid Source::setAirAbsorptionFactor(float factor)\n{\n\tif (channels > 1)\n\t\tthrow SpatialSupportException();\n\n\tabsorptionFactor = factor;\n#ifdef ALC_EXT_EFX\n\tif (valid)\n\t{\n\t\talSourcef(source, AL_AIR_ABSORPTION_FACTOR, absorptionFactor);\n\t\t//alGetError();\n\t}\n#endif\n}\n\nfloat Source::getAirAbsorptionFactor() const\n{\n\tif (channels > 1)\n\t\tthrow SpatialSupportException();\n\n\treturn absorptionFactor;\n}\n\nint Source::getChannelCount() const\n{\n\treturn channels;\n}\n\nbool Source::setFilter(const std::map<Filter::Parameter, float> &params)\n{\n\tif (!directfilter)\n\t\tdirectfilter = new Filter();\n\n\tbool result = directfilter->setParams(params);\n\n#ifdef ALC_EXT_EFX\n\tif (valid)\n\t{\n\t\t//in case of failure contains AL_FILTER_NULL, a valid non-filter\n\t\talSourcei(source, AL_DIRECT_FILTER, directfilter->getFilter());\n\t\t//alGetError();\n\t}\n#endif\n\n\treturn result;\n}\n\nbool Source::setFilter()\n{\n\tif (directfilter)\n\t\tdelete directfilter;\n\n\tdirectfilter = nullptr;\n\n#ifdef ALC_EXT_EFX\n\tif (valid)\n\t{\n\t\talSourcei(source, AL_DIRECT_FILTER, AL_FILTER_NULL);\n\t\t//alGetError();\n\t}\n#endif\n\n\treturn true;\n}\n\nbool Source::getFilter(std::map<Filter::Parameter, float> &params)\n{\n\tif (!directfilter)\n\t\treturn false;\n\n\tparams = directfilter->getParams();\n\n\treturn true;\n}\n\nbool Source::setEffect(const char *name)\n{\n\tALuint slot, target;\n\tFilter *filter;\n\n\t// effect with this name doesn't exist\n\tif (!dynamic_cast<Audio*>(audiomodule())->getEffectID(name, target))\n\t\treturn false;\n\n\tauto iter = effectmap.find(name);\n\tif (iter == effectmap.end())\n\t{\n\t\t// new send target needed but no more room\n\t\tif (slotlist.empty())\n\t\t\treturn false;\n\n\t\tslot = slotlist.top();\n\t\tslotlist.pop();\n\t}\n\telse\n\t{\n\t\tslot = iter->second.slot;\n\t\tfilter = iter->second.filter;\n\n\t\tif (filter)\n\t\t\tdelete filter;\n\t}\n\teffectmap[name] = {nullptr, slot, target};\n\n#ifdef ALC_EXT_EFX\n\tif (valid)\n\t{\n\t\talSource3i(source, AL_AUXILIARY_SEND_FILTER, target, slot, AL_FILTER_NULL);\n\t\t//alGetError();\n\t}\n#endif\n\n\treturn true;\n}\n\nbool Source::setEffect(const char *name, const std::map<Filter::Parameter, float> &params)\n{\n\tALuint slot, target;\n\tFilter *filter = nullptr;\n\n\t// effect with this name doesn't exist\n\tif (!dynamic_cast<Audio*>(audiomodule())->getEffectID(name, target))\n\t\treturn false;\n\n\tauto iter = effectmap.find(name);\n\tif (iter == effectmap.end())\n\t{\n\t\t// new send target needed but no more room\n\t\tif (slotlist.empty())\n\t\t\treturn false;\n\n\t\tslot = slotlist.top();\n\t\tslotlist.pop();\n\t}\n\telse\n\t{\n\t\tslot = iter->second.slot;\n\t\tfilter = iter->second.filter;\n\t}\n\tif (!filter)\n\t\tfilter = new Filter();\n\n\teffectmap[name] = {filter, slot, target};\n\n\tfilter->setParams(params);\n\n#ifdef ALC_EXT_EFX\n\tif (valid)\n\t{\n\t\t//in case of failure contains AL_FILTER_NULL, a valid non-filter\n\t\talSource3i(source, AL_AUXILIARY_SEND_FILTER, target, slot, filter->getFilter());\n\t\t//alGetError();\n\t}\n#endif\n\treturn true;\n}\n\nbool Source::unsetEffect(const char *name)\n{\n\tauto iter = effectmap.find(name);\n\tif (iter == effectmap.end())\n\t\treturn false;\n\n\tALuint slot = iter->second.slot;\n\tFilter *filter = iter->second.filter;\n\n\tif (filter)\n\t\tdelete filter;\n\n#ifdef ALC_EXT_EFX\n\tif (valid)\n\t{\n\t\talSource3i(source, AL_AUXILIARY_SEND_FILTER, AL_EFFECTSLOT_NULL, slot, AL_FILTER_NULL);\n\t\t//alGetError();\n\t}\n#endif\n\teffectmap.erase(iter);\n\tslotlist.push(slot);\n\treturn true;\n}\n\nbool Source::getEffect(const char *name, std::map<Filter::Parameter, float> &params)\n{\n\tauto iter = effectmap.find(name);\n\tif (iter == effectmap.end())\n\t\treturn false;\n\n\tif (iter->second.filter)\n\t\tparams = iter->second.filter->getParams();\n\n\treturn true;\n}\n\nbool Source::getActiveEffects(std::vector<std::string> &list) const\n{\n\tif (effectmap.empty())\n\t\treturn false;\n\n\tlist.reserve(effectmap.size());\n\n\tfor (auto i : effectmap)\n\t\tlist.push_back(i.first);\n\n\treturn true;\n}\n\n} // openal\n} // audio\n} // love\n"
  },
  {
    "path": "src/modules/audio/openal/Source.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_AUDIO_OPENAL_SOURCE_H\n#define LOVE_AUDIO_OPENAL_SOURCE_H\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/Object.h\"\n#include \"audio/Source.h\"\n#include \"audio/Filter.h\"\n#include \"sound/SoundData.h\"\n#include \"sound/Decoder.h\"\n#include \"Audio.h\"\n#include \"Filter.h\"\n\n// STL\n#include <vector>\n#include <stack>\n\n// C\n#include <float.h>\n\n// OpenAL\n#ifdef LOVE_APPLE_USE_FRAMEWORKS\n#ifdef LOVE_IOS\n#include <OpenAL/alc.h>\n#include <OpenAL/al.h>\n#else\n#include <OpenAL-Soft/alc.h>\n#include <OpenAL-Soft/al.h>\n#endif\n#else\n#include <alc.h>\n#include <al.h>\n#endif\n\nnamespace love\n{\nnamespace audio\n{\nnamespace openal\n{\n\n#ifdef LOVE_IOS\n// OpenAL on iOS barfs if the max distance is +inf.\nstatic const float MAX_ATTENUATION_DISTANCE = 1000000.0f;\n#else\nstatic const float MAX_ATTENUATION_DISTANCE = FLT_MAX;\n#endif\n\nclass Audio;\nclass Pool;\n\n// Basically just a reference-counted non-streaming OpenAL buffer object.\nclass StaticDataBuffer : public love::Object\n{\npublic:\n\n\tStaticDataBuffer(ALenum format, const ALvoid *data, ALsizei size, ALsizei freq);\n\tvirtual ~StaticDataBuffer();\n\n\tinline ALuint getBuffer() const\n\t{\n\t\treturn buffer;\n\t}\n\n\tinline ALsizei getSize() const\n\t{\n\t\treturn size;\n\t}\n\nprivate:\n\n\tALuint buffer;\n\tALsizei size;\n\n}; // StaticDataBuffer\n\nclass Source : public love::audio::Source\n{\npublic:\n\n\tSource(Pool *pool, love::sound::SoundData *soundData);\n\tSource(Pool *pool, love::sound::Decoder *decoder);\n\tSource(Pool *pool, int sampleRate, int bitDepth, int channels, int buffers);\n\tSource(const Source &s);\n\tvirtual ~Source();\n\n\tvirtual love::audio::Source *clone();\n\tvirtual bool play();\n\tvirtual void stop();\n\tvirtual void pause();\n\tvirtual bool isPlaying() const;\n\tvirtual bool isFinished() const;\n\tvirtual bool update();\n\tvirtual void setPitch(float pitch);\n\tvirtual float getPitch() const;\n\tvirtual void setVolume(float volume);\n\tvirtual float getVolume() const;\n\tvirtual void seek(double offset, Unit unit);\n\tvirtual double tell(Unit unit);\n\tvirtual double getDuration(Unit unit);\n\tvirtual void setPosition(float *v);\n\tvirtual void getPosition(float *v) const;\n\tvirtual void setVelocity(float *v);\n\tvirtual void getVelocity(float *v) const;\n\tvirtual void setDirection(float *v);\n\tvirtual void getDirection(float *v) const;\n\tvirtual void setCone(float innerAngle, float outerAngle, float outerVolume, float outerHighGain);\n\tvirtual void getCone(float &innerAngle, float &outerAngle, float &outerVolume, float &outerHighGain) const;\n\tvirtual void setRelative(bool enable);\n\tvirtual bool isRelative() const;\n\tvoid setLooping(bool looping);\n\tbool isLooping() const;\n\tvirtual void setMinVolume(float volume);\n\tvirtual float getMinVolume() const;\n\tvirtual void setMaxVolume(float volume);\n\tvirtual float getMaxVolume() const;\n\tvirtual void setReferenceDistance(float distance);\n\tvirtual float getReferenceDistance() const;\n\tvirtual void setRolloffFactor(float factor);\n\tvirtual float getRolloffFactor() const;\n\tvirtual void setMaxDistance(float distance);\n\tvirtual float getMaxDistance() const;\n\tvirtual void setAirAbsorptionFactor(float factor);\n\tvirtual float getAirAbsorptionFactor() const;\n\tvirtual int getChannelCount() const;\n\n\tvirtual bool setFilter(const std::map<Filter::Parameter, float> &params);\n\tvirtual bool setFilter();\n\tvirtual bool getFilter(std::map<Filter::Parameter, float> &params);\n\n\tvirtual bool setEffect(const char *effect);\n\tvirtual bool setEffect(const char *effect, const std::map<Filter::Parameter, float> &params);\n\tvirtual bool unsetEffect(const char *effect);\n\tvirtual bool getEffect(const char *effect, std::map<Filter::Parameter, float> &params);\n\tvirtual bool getActiveEffects(std::vector<std::string> &list) const;\n\n\tvirtual int getFreeBufferCount() const;\n\tvirtual bool queue(void *data, size_t length, int dataSampleRate, int dataBitDepth, int dataChannels);\n\n\tvoid prepareAtomic();\n\tvoid teardownAtomic();\n\n\tbool playAtomic(ALuint source);\n\tvoid stopAtomic();\n\tvoid pauseAtomic();\n\tvoid resumeAtomic();\n\n\tstatic bool play(const std::vector<love::audio::Source*> &sources);\n\tstatic void stop(const std::vector<love::audio::Source*> &sources);\n\tstatic void pause(const std::vector<love::audio::Source*> &sources);\n\n\tstatic std::vector<love::audio::Source*> pause(Pool *pool);\n\tstatic void stop(Pool *pool);\n\nprivate:\n\n\tvoid reset();\n\n\tvoid setFloatv(float *dst, const float *src) const;\n\n\tint streamAtomic(ALuint buffer, love::sound::Decoder *d);\n\n\tPool *pool = nullptr;\n\tALuint source = 0;\n\tbool valid = false;\n\n\tconst static int DEFAULT_BUFFERS = 8;\n\tconst static int MAX_BUFFERS = 64;\n\tstd::queue<ALuint> streamBuffers;\n\tstd::stack<ALuint> unusedBuffers;\n\n\tStrongRef<StaticDataBuffer> staticBuffer;\n\n\tfloat pitch = 1.0f;\n\tfloat volume = 1.0f;\n\tfloat position[3];\n\tfloat velocity[3];\n\tfloat direction[3];\n\tbool relative = false;\n\tbool looping = false;\n\tfloat minVolume = 0.0f;\n\tfloat maxVolume = 1.0f;\n\tfloat referenceDistance = 1.0f;\n\tfloat rolloffFactor = 1.0f;\n\tfloat absorptionFactor = 0.0f;\n\tfloat maxDistance = MAX_ATTENUATION_DISTANCE;\n\n\tstruct Cone\n\t{\n\t\tint innerAngle = 360; // degrees\n\t\tint outerAngle = 360; // degrees\n\t\tfloat outerVolume = 0.0f;\n\t\tfloat outerHighGain = 1.0f;\n\t} cone;\n\n\tint offsetSamples = 0;\n\n\tint sampleRate = 0;\n\tint channels = 0;\n\tint bitDepth = 0;\n\n\tStrongRef<love::sound::Decoder> decoder;\n\n\tunsigned int toLoop = 0;\n\tALsizei bufferedBytes = 0;\n\tint buffers = 0;\n\n\tFilter *directfilter = nullptr;\n\n\tstruct EffectMapStorage\n\t{\n\t\tFilter *filter;\n\t\tALuint slot, target;\n\t};\n\tstd::map<std::string, EffectMapStorage> effectmap;\n\tstd::stack<ALuint> slotlist;\n}; // Source\n\n} // openal\n} // audio\n} // love\n\n#endif // LOVE_AUDIO_OPENAL_SOURCE_H\n"
  },
  {
    "path": "src/modules/audio/wrap_Audio.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"wrap_Audio.h\"\n#include \"filesystem/wrap_Filesystem.h\"\n\n#include \"openal/Audio.h\"\n#include \"null/Audio.h\"\n\n#include \"common/runtime.h\"\n\n// C++\n#include <iostream>\n#include <cmath>\n\nnamespace love\n{\nnamespace audio\n{\n\n#define instance() (Module::getInstance<Audio>(Module::M_AUDIO))\n\nint w_getActiveSourceCount(lua_State *L)\n{\n\tlua_pushinteger(L, instance()->getActiveSourceCount());\n\treturn 1;\n}\n\nint w_newSource(lua_State *L)\n{\n\tSource::Type stype = Source::TYPE_STREAM;\n\n\tif (!luax_istype(L, 1, love::sound::SoundData::type))\n\t{\n\t\tif (!luax_istype(L, 1, love::sound::Decoder::type))\n\t\t{\n\t\t\tconst char *stypestr = luaL_checkstring(L, 2);\n\t\t\tif (stypestr && !Source::getConstant(stypestr, stype))\n\t\t\t\treturn luax_enumerror(L, \"source type\", Source::getConstants(stype), stypestr);\n\n\t\t\tif (stype == Source::TYPE_QUEUE)\n\t\t\t\treturn luaL_error(L, \"Cannot create queueable sources using newSource. Use newQueueableSource instead.\");\n\t\t}\n\n\t\tif (love::filesystem::luax_cangetdata(L, 1))\n\t\t{\n\t\t\t// stream type\n\t\t\tif (stype == Source::TYPE_STATIC)\n\t\t\t\tlua_pushstring(L, \"memory\");\n\t\t\telse if (!lua_isnone(L, 3))\n\t\t\t\tlua_pushvalue(L, 3);\n\t\t\telse\n\t\t\t\tlua_pushnil(L);\n\n\t\t\t// buffer size\n\t\t\tlua_pushnil(L);\n\n\t\t\t// (file, buffer size, stream type)\n\t\t\tint idxs[] = { 1, lua_gettop(L), lua_gettop(L) - 1 };\n\t\t\tluax_convobj(L, idxs, 3, \"sound\", \"newDecoder\");\n\t\t}\n\t}\n\n\tif (stype == Source::TYPE_STATIC && luax_istype(L, 1, love::sound::Decoder::type))\n\t\tluax_convobj(L, 1, \"sound\", \"newSoundData\");\n\n\tSource *t = nullptr;\n\n\tluax_catchexcept(L, [&]() {\n\t\tif (luax_istype(L, 1, love::sound::SoundData::type))\n\t\t\tt = instance()->newSource(luax_totype<love::sound::SoundData>(L, 1));\n\t\telse if (luax_istype(L, 1, love::sound::Decoder::type))\n\t\t\tt = instance()->newSource(luax_totype<love::sound::Decoder>(L, 1));\n\t});\n\n\tif (t != nullptr)\n\t{\n\t\tluax_pushtype(L, t);\n\t\tt->release();\n\t\treturn 1;\n\t}\n\telse\n\t\treturn luax_typerror(L, 1, \"Decoder or SoundData\");\n}\n\nint w_newQueueableSource(lua_State *L)\n{\n\tint samplerate = (int) luaL_checkinteger(L, 1);\n\tint bitdepth = (int) luaL_checkinteger(L, 2);\n\tint channels = (int) luaL_checkinteger(L, 3);\n\tint buffers = (int) luaL_optinteger(L, 4, 0);\n\n\tSource *t = nullptr;\n\tluax_catchexcept(L, [&]() { t = instance()->newSource(samplerate, bitdepth, channels, buffers); });\n\n\tluax_pushtype(L, t);\n\tt->release();\n\treturn 1;\n}\n\nstatic std::vector<Source*> readSourceList(lua_State *L, int n)\n{\n\tif (n < 0)\n\t\tn += lua_gettop(L) + 1;\n\n\tint items = (int) luax_objlen(L, n);\n\tstd::vector<Source*> sources(items);\n\n\tfor (int i = 0; i < items; i++)\n\t{\n\t\tlua_rawgeti(L, n, i+1);\n\t\tsources[i] = luax_checksource(L, -1);\n\t\tlua_pop(L, 1);\n\t}\n\n\treturn sources;\n}\n\nstatic std::vector<Source*> readSourceVararg(lua_State *L, int i)\n{\n\tconst int top = lua_gettop(L);\n\n\tif (i < 0)\n\t\ti += top + 1;\n\n\tint items = top - i + 1;\n\tstd::vector<Source*> sources(items);\n\n\tfor (int pos = 0; i <= top; i++, pos++)\n\t\tsources[pos] = luax_checksource(L, i);\n\n\treturn sources;\n}\n\nint w_play(lua_State *L)\n{\n\tif (lua_istable(L, 1))\n\t\tluax_pushboolean(L, instance()->play(readSourceList(L, 1)));\n\telse if (lua_gettop(L) > 1)\n\t\tluax_pushboolean(L, instance()->play(readSourceVararg(L, 1)));\n\telse\n\t{\n\t\tSource *s = luax_checksource(L, 1);\n\t\tluax_pushboolean(L, instance()->play(s));\n\t}\n\n\treturn 1;\n}\n\nint w_stop(lua_State *L)\n{\n\tif (lua_isnone(L, 1))\n\t\tinstance()->stop();\n\telse if (lua_istable(L, 1))\n\t\tinstance()->stop(readSourceList(L, 1));\n\telse if (lua_gettop(L) > 1)\n\t\tinstance()->stop(readSourceVararg(L, 1));\n\telse\n\t{\n\t\tSource *s = luax_checksource(L, 1);\n\t\ts->stop();\n\t}\n\treturn 0;\n}\n\nint w_pause(lua_State *L)\n{\n\tif (lua_isnone(L, 1))\n\t{\n\t\tauto sources = instance()->pause();\n\n\t\tlua_createtable(L, (int) sources.size(), 0);\n\t\tfor (int i = 0; i < (int) sources.size(); i++)\n\t\t{\n\t\t\tluax_pushtype(L, sources[i]);\n\t\t\tlua_rawseti(L, -2, i+1);\n\t\t}\n\t\treturn 1;\n\t}\n\telse if (lua_istable(L, 1))\n\t\tinstance()->pause(readSourceList(L, 1));\n\telse if (lua_gettop(L) > 1)\n\t\tinstance()->pause(readSourceVararg(L, 1));\n\telse\n\t{\n\t\tSource *s = luax_checksource(L, 1);\n\t\ts->pause();\n\t}\n\n\treturn 0;\n}\n\nint w_setVolume(lua_State *L)\n{\n\tfloat v = (float)luaL_checknumber(L, 1);\n\tinstance()->setVolume(v);\n\treturn 0;\n}\n\nint w_getVolume(lua_State *L)\n{\n\tlua_pushnumber(L, instance()->getVolume());\n\treturn 1;\n}\n\nint w_setPosition(lua_State *L)\n{\n\tfloat v[3];\n\tv[0] = (float)luaL_checknumber(L, 1);\n\tv[1] = (float)luaL_checknumber(L, 2);\n\tv[2] = (float)luaL_optnumber(L, 3, 0);\n\tinstance()->setPosition(v);\n\treturn 0;\n}\n\nint w_getPosition(lua_State *L)\n{\n\tfloat v[3];\n\tinstance()->getPosition(v);\n\tlua_pushnumber(L, v[0]);\n\tlua_pushnumber(L, v[1]);\n\tlua_pushnumber(L, v[2]);\n\treturn 3;\n}\n\nint w_setOrientation(lua_State *L)\n{\n\tfloat v[6];\n\tv[0] = (float)luaL_checknumber(L, 1);\n\tv[1] = (float)luaL_checknumber(L, 2);\n\tv[2] = (float)luaL_checknumber(L, 3);\n\tv[3] = (float)luaL_checknumber(L, 4);\n\tv[4] = (float)luaL_checknumber(L, 5);\n\tv[5] = (float)luaL_checknumber(L, 6);\n\tinstance()->setOrientation(v);\n\treturn 0;\n}\n\nint w_getOrientation(lua_State *L)\n{\n\tfloat v[6];\n\tinstance()->getOrientation(v);\n\tlua_pushnumber(L, v[0]);\n\tlua_pushnumber(L, v[1]);\n\tlua_pushnumber(L, v[2]);\n\tlua_pushnumber(L, v[3]);\n\tlua_pushnumber(L, v[4]);\n\tlua_pushnumber(L, v[5]);\n\treturn 6;\n}\n\nint w_setVelocity(lua_State *L)\n{\n\tfloat v[3];\n\tv[0] = (float)luaL_checknumber(L, 1);\n\tv[1] = (float)luaL_checknumber(L, 2);\n\tv[2] = (float)luaL_optnumber(L, 3, 0);\n\tinstance()->setVelocity(v);\n\treturn 0;\n}\n\nint w_getVelocity(lua_State *L)\n{\n\tfloat v[3];\n\tinstance()->getVelocity(v);\n\tlua_pushnumber(L, v[0]);\n\tlua_pushnumber(L, v[1]);\n\tlua_pushnumber(L, v[2]);\n\treturn 3;\n}\n\nint w_setDopplerScale(lua_State *L)\n{\n\tinstance()->setDopplerScale(luax_checkfloat(L, 1));\n\treturn 0;\n}\n\nint w_getDopplerScale(lua_State *L)\n{\n\tlua_pushnumber(L, instance()->getDopplerScale());\n\treturn 1;\n}\n/*\nint w_setMeter(lua_State *L)\n{\n\tinstance()->setMeter(luax_checkfloat(L, 1));\n\treturn 0;\n}\n\nint w_getMeter(lua_State *L)\n{\n\tlua_pushnumber(L, instance()->getMeter());\n\treturn 1;\n}\n*/\nint w_setDistanceModel(lua_State *L)\n{\n\tconst char *modelStr = luaL_checkstring(L, 1);\n\tAudio::DistanceModel distanceModel;\n\tif (!Audio::getConstant(modelStr, distanceModel))\n\t\treturn luax_enumerror(L, \"distance model\", Audio::getConstants(distanceModel), modelStr);\n\tinstance()->setDistanceModel(distanceModel);\n\treturn 0;\n}\n\nint w_getDistanceModel(lua_State *L)\n{\n\tAudio::DistanceModel distanceModel = instance()->getDistanceModel();\n\tconst char *modelStr;\n\tif (!Audio::getConstant(distanceModel, modelStr))\n\t\treturn 0;\n\tlua_pushstring(L, modelStr);\n\treturn 1;\n}\n\nint w_getRecordingDevices(lua_State *L)\n{\n\tconst std::vector<RecordingDevice*> &devices = instance()->getRecordingDevices();\n\n\tlua_createtable(L, devices.size(), 0);\n\n\tfor (unsigned int i = 0; i < devices.size(); i++)\n\t{\n\t\tluax_pushtype(L, devices[i]);\n\t\tlua_rawseti(L, -2, i + 1);\n\t}\n\n\treturn 1;\n}\n\nint w_setEffect(lua_State *L)\n{\n\tconst char *namestr = luaL_checkstring(L, 1);\n\n\tif (lua_isnoneornil(L, 2) || (lua_gettop(L) == 2 && lua_isboolean(L, 2) && !lua_toboolean(L, 2)))\n\t{\n\t\tlua_pushboolean(L, instance()->unsetEffect(namestr));\n\t\treturn 1;\n\t}\n\n\tluaL_checktype(L, 2, LUA_TTABLE);\n\n\tconst char *paramstr = nullptr;\n\n\t//find type (mandatory)\n\tEffect::getConstant(Effect::EFFECT_TYPE, paramstr, Effect::TYPE_BASIC);\n\tlua_pushstring(L, paramstr);\n\tlua_rawget(L, 2);\n\tif (lua_type(L, -1) == LUA_TNIL)\n\t\treturn luaL_error(L, \"Effect type not specificed.\");\n\n\tEffect::Type type = Effect::TYPE_MAX_ENUM;\n\tconst char *typestr = luaL_checkstring(L, -1);\n\tif (!Effect::getConstant(typestr, type))\n\t\treturn luax_enumerror(L, \"effect type\", Effect::getConstants(type), typestr);\n\n\tlua_pop(L, 1);\n\tstd::map<Effect::Parameter, float> params;\n\tparams[Effect::EFFECT_TYPE] = static_cast<int>(type);\n\n\t// Iterate over the whole table, reading valid parameters and erroring on invalid ones\n\tlua_pushnil(L);\n\twhile (lua_next(L, 2))\n\t{\n\t\tconst char *keystr = luaL_checkstring(L, -2);\n\t\tEffect::Parameter param;\n\n\t\tif(Effect::getConstant(keystr, param, type) || Effect::getConstant(keystr, param, Effect::TYPE_BASIC))\n\t\t{\n#define luax_effecterror(l,t) luaL_error(l,\"Bad parameter type for %s %s: \" t \" expected, got %s\", typestr, keystr, lua_typename(L, -1))\n\t\t\tswitch(Effect::getParameterType(param))\n\t\t\t{\n\t\t\tcase Effect::PARAM_FLOAT:\n\t\t\t\tif (!lua_isnumber(L, -1))\n\t\t\t\t\treturn luax_effecterror(L, \"number\");\n\t\t\t\tparams[param] = lua_tonumber(L, -1);\n\t\t\t\tbreak;\n\t\t\tcase Effect::PARAM_BOOL:\n\t\t\t\tif (!lua_isboolean(L, -1))\n\t\t\t\t\treturn luax_effecterror(L, \"boolean\");\n\t\t\t\tparams[param] = lua_toboolean(L, -1) ? 1.0 : 0.0;\n\t\t\t\tbreak;\n\t\t\tcase Effect::PARAM_WAVEFORM:\n\t\t\t{\n\t\t\t\tif (!lua_isstring(L, -1))\n\t\t\t\t\treturn luax_effecterror(L, \"string\");\n\t\t\t\tparamstr = lua_tostring(L, -1);\n\t\t\t\tEffect::Waveform waveform;\n\t\t\t\tif (!Effect::getConstant(paramstr, waveform))\n\t\t\t\t\treturn luax_enumerror(L, \"waveform type\", paramstr);\n\t\t\t\tparams[param] = static_cast<int>(waveform);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t/*\n\t\t\tcase Effect::PARAM_DIRECTION:\n\t\t\t{\n\t\t\t\tif (!lua_isstring(L, -1))\n\t\t\t\t\treturn luax_effecterror(L, \"string\");\n\t\t\t\tparamstr = lua_tostring(L, -1);\n\t\t\t\tEffect::Direction direction;\n\t\t\t\tif (!Effect::getConstant(paramstr, direction))\n\t\t\t\t\treturn luaL_error(L, \"Invalid direction type: %s\", paramstr);\n\t\t\t\tparams[param] = static_cast<int>(direction);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase Effect::PARAM_PHONEME:\n\t\t\t{\n\t\t\t\tif (!lua_isstring(L, -1))\n\t\t\t\t\treturn luax_effecterror(L, \"string\");\n\t\t\t\tparamstr = lua_tostring(L, -1);\n\t\t\t\tEffect::Phoneme phoneme;\n\t\t\t\tif (!Effect::getConstant(basicstr, phoneme))\n\t\t\t\t\treturn luaL_error(L, \"Invalid phoneme type: %s\", paramstr);\n\t\t\t\tparams[param] = static_cast<int>(phoneme);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t*/\n\t\t\tcase Effect::PARAM_TYPE:\n\t\t\tcase Effect::PARAM_MAX_ENUM:\n\t\t\t\tbreak;\n\t\t\t}\n#undef luax_effecterror\n\t\t}\n\t\telse\n\t\t\tluaL_error(L, \"Invalid '%s' Effect parameter: %s\", typestr, keystr);\n\n\t\t//remove the value (-1) from stack, keep the key (-2) to feed into lua_next\n\t\tlua_pop(L, 1);\n\t}\n\n\tluax_catchexcept(L, [&]() { lua_pushboolean(L, instance()->setEffect(namestr, params)); });\n\treturn 1;\n}\n\nint w_getEffect(lua_State *L)\n{\n\tconst char *namestr = luaL_checkstring(L, 1);\n\n\tstd::map<Effect::Parameter, float> params;\n\n\tif (!instance()->getEffect(namestr, params))\n\t\treturn 0;\n\n\tconst char *keystr, *valstr;\n\tEffect::Type type = static_cast<Effect::Type>((int)params[Effect::EFFECT_TYPE]);\n\n\tif (lua_istable(L, 2))\n\t\tlua_pushvalue(L, 2);\n\telse\n\t\tlua_createtable(L, 0, params.size());\n\n\tfor (auto p : params)\n\t{\n\t\tif (!Effect::getConstant(p.first, keystr, type))\n\t\t\tEffect::getConstant(p.first, keystr, Effect::TYPE_BASIC);\n\n\t\tlua_pushstring(L, keystr);\n\t\tswitch (Effect::getParameterType(p.first))\n\t\t{\n\t\tcase Effect::PARAM_FLOAT:\n\t\t\tlua_pushnumber(L, p.second);\n\t\t\tbreak;\n\t\tcase Effect::PARAM_BOOL:\n\t\t\tlua_pushboolean(L, p.second > 0.5 ? true : false);\n\t\t\tbreak;\n\t\tcase Effect::PARAM_WAVEFORM:\n\t\t\tEffect::getConstant(static_cast<Effect::Waveform>((int)p.second), valstr);\n\t\t\tlua_pushstring(L, valstr);\n\t\t\tbreak;\n/*\n\t\tcase Effect::PARAM_DIRECTION:\n\t\t\tEffect::getConstant(static_cast<Effect::Direction>((int)p.second), valstr);\n\t\t\tlua_pushstring(L, valstr);\n\t\t\tbreak;\n\t\tcase Effect::PARAM_PHONEME:\n\t\t\tEffect::getConstant(static_cast<Effect::Phoneme>((int)p.second), valstr);\n\t\t\tlua_pushstring(L, valstr);\n\t\t\tbreak;\n*/\n\t\tcase Effect::PARAM_TYPE:\n\t\t\tEffect::getConstant(static_cast<Effect::Type>((int)p.second), valstr);\n\t\t\tlua_pushstring(L, valstr);\n\t\t\tbreak;\n\t\tcase Effect::PARAM_MAX_ENUM:\n\t\t\tbreak;\n\t\t}\n\t\tlua_rawset(L, -3);\n\t}\n\treturn 1;\n}\n\nint w_getActiveEffects(lua_State *L)\n{\n\tstd::vector<std::string> list;\n\tinstance()->getActiveEffects(list);\n\n\tlua_createtable(L, 0, (int) list.size());\n\tfor (int i = 0; i < (int) list.size(); i++)\n\t{\n\t\tlua_pushnumber(L, i + 1);\n\t\tlua_pushstring(L, list[i].c_str());\n\t\tlua_rawset(L, -3);\n\t}\n\treturn 1;\n}\n\nint w_getMaxSceneEffects(lua_State *L)\n{\n\tlua_pushnumber(L, instance()->getMaxSceneEffects());\n\treturn 1;\n}\n\nint w_getMaxSourceEffects(lua_State *L)\n{\n\tlua_pushnumber(L, instance()->getMaxSourceEffects());\n\treturn 1;\n}\n\nint w_isEffectsSupported(lua_State *L)\n{\n\tlua_pushboolean(L, instance()->isEFXsupported());\n\treturn 1;\n}\n\nint w_setOutputSpatialization(lua_State *L)\n{\n\tbool enable = luax_checkboolean(L, 1);\n\tconst char *filter = luaL_optstring(L, 2, nullptr);\n\tbool success = instance()->setOutputSpatialization(enable, filter);\n\tluax_pushboolean(L, success);\n\treturn 1;\n}\n\nint w_getOutputSpatialization(lua_State *L)\n{\n\tconst char *filter = nullptr;\n\tbool enabled = instance()->getOutputSpatialization(filter);\n\tluax_pushboolean(L, enabled);\n\tif (filter != nullptr)\n\t\tlua_pushstring(L, filter);\n\telse\n\t\tlua_pushnil(L);\n\treturn 2;\n}\n\nint w_getOutputSpatializationFilters(lua_State *L)\n{\n\tstd::vector<std::string> filters;\n\tinstance()->getOutputSpatializationFilters(filters);\n\n\tlua_createtable(L, (int)filters.size(), 0);\n\tfor (int i = 0; i < (int)filters.size(); i++)\n\t{\n\t\tluax_pushstring(L, filters[i]);\n\t\tlua_rawseti(L, -2, i + 1);\n\t}\n\treturn 1;\n}\n\nint w_setMixWithSystem(lua_State *L)\n{\n\tluax_pushboolean(L, Audio::setMixWithSystem(luax_checkboolean(L, 1)));\n\treturn 1;\n}\n\nint w_getPlaybackDevice(lua_State* L)\n{\n\tstd::string device;\n\n\tluax_catchexcept(L, [&]() { device = instance()->getPlaybackDevice(); });\n\tluax_pushstring(L, device);\n\treturn 1;\n}\n\nint w_getPlaybackDevices(lua_State* L)\n{\n\tstd::vector<std::string> list;\n\n\tluax_catchexcept(L, [&]() { instance()->getPlaybackDevices(list); });\n\tlua_createtable(L, 0, (int) list.size());\n\tfor (int i = 0; i < (int) list.size(); i++)\n\t{\n\t\tlua_pushnumber(L, i + 1);\n\t\tlua_pushstring(L, list[i].c_str());\n\t\tlua_rawset(L, -3);\n\t}\n\n\treturn 1;\n}\n\nint w_setPlaybackDevice(lua_State* L)\n{\n\tconst char *device = luaL_optstring(L, 1, nullptr);\n\n\ttry\n\t{\n\t\tinstance()->setPlaybackDevice(device);\n\t\tluax_pushboolean(L, true);\n\t\treturn 1;\n\t}\n\tcatch (love::Exception& e)\n\t{\n\t\tluax_pushboolean(L, false);\n\t\tlua_pushstring(L, e.what());\n\t\treturn 2;\n\t}\n\n\t// To avoid compiler warning\n\treturn 0;\n}\n\n// List of functions to wrap.\nstatic const luaL_Reg functions[] =\n{\n\t{ \"getActiveSourceCount\", w_getActiveSourceCount },\n\t{ \"newSource\", w_newSource },\n\t{ \"newQueueableSource\", w_newQueueableSource },\n\t{ \"play\", w_play },\n\t{ \"stop\", w_stop },\n\t{ \"pause\", w_pause },\n\t{ \"setVolume\", w_setVolume },\n\t{ \"getVolume\", w_getVolume },\n\t{ \"setPosition\", w_setPosition },\n\t{ \"getPosition\", w_getPosition },\n\t{ \"setOrientation\", w_setOrientation },\n\t{ \"getOrientation\", w_getOrientation },\n\t{ \"setVelocity\", w_setVelocity },\n\t{ \"getVelocity\", w_getVelocity },\n\t{ \"setDopplerScale\", w_setDopplerScale },\n\t{ \"getDopplerScale\", w_getDopplerScale },\n\t//{ \"setMeter\", w_setMeter },\n\t//{ \"getMeter\", w_setMeter },\n\t{ \"setDistanceModel\", w_setDistanceModel },\n\t{ \"getDistanceModel\", w_getDistanceModel },\n\t{ \"getRecordingDevices\", w_getRecordingDevices },\n\t{ \"setEffect\", w_setEffect },\n\t{ \"getEffect\", w_getEffect },\n\t{ \"getActiveEffects\", w_getActiveEffects },\n\t{ \"getMaxSceneEffects\", w_getMaxSceneEffects },\n\t{ \"getMaxSourceEffects\", w_getMaxSourceEffects },\n\t{ \"isEffectsSupported\", w_isEffectsSupported },\n\t{ \"setOutputSpatialization\", w_setOutputSpatialization },\n\t{ \"getOutputSpatialization\", w_getOutputSpatialization },\n\t{ \"getOutputSpatializationFilters\", w_getOutputSpatializationFilters },\n\t{ \"setMixWithSystem\", w_setMixWithSystem },\n\t{ \"getPlaybackDevice\", w_getPlaybackDevice },\n\t{ \"getPlaybackDevices\", w_getPlaybackDevices },\n\t{ \"setPlaybackDevice\", w_setPlaybackDevice },\n\n\t{ 0, 0 }\n};\n\nstatic const lua_CFunction types[] =\n{\n\tluaopen_source,\n\tluaopen_recordingdevice,\n\t0\n};\n\nextern \"C\" int luaopen_love_audio(lua_State *L)\n{\n\tAudio *instance = instance();\n\n\tif (instance == nullptr)\n\t{\n\t\t// Try OpenAL first.\n\t\ttry\n\t\t{\n\t\t\tinstance = new love::audio::openal::Audio();\n\t\t}\n\t\tcatch(love::Exception &e)\n\t\t{\n\t\t\tstd::cout << e.what() << std::endl;\n\t\t}\n\t}\n\telse\n\t\tinstance->retain();\n\n\tif (instance == nullptr)\n\t{\n\t\t// Fall back to nullaudio.\n\t\ttry\n\t\t{\n\t\t\tinstance = new love::audio::null::Audio();\n\t\t}\n\t\tcatch(love::Exception &e)\n\t\t{\n\t\t\tstd::cout << e.what() << std::endl;\n\t\t}\n\t}\n\n\tif (instance == nullptr)\n\t\treturn luaL_error(L, \"Could not open any audio module.\");\n\n\tWrappedModule w;\n\tw.module = instance;\n\tw.name = \"audio\";\n\tw.type = &Module::type;\n\tw.functions = functions;\n\tw.types = types;\n\n\tint n = luax_register_module(L, w);\n\n\treturn n;\n}\n\n} // audio\n} // love\n"
  },
  {
    "path": "src/modules/audio/wrap_Audio.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_AUDIO_WRAP_AUDIO_H\n#define LOVE_AUDIO_WRAP_AUDIO_H\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/runtime.h\"\n#include \"Audio.h\"\n#include \"wrap_Source.h\"\n#include \"wrap_RecordingDevice.h\"\n\nnamespace love\n{\nnamespace audio\n{\n\nextern \"C\" LOVE_EXPORT int luaopen_love_audio(lua_State *L);\n\n} // audio\n} // love\n\n#endif // LOVE_AUDIO_WRAP_AUDIO_H\n"
  },
  {
    "path": "src/modules/audio/wrap_RecordingDevice.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_RecordingDevice.h\"\n#include \"wrap_Audio.h\"\n\n#include \"sound/SoundData.h\"\nnamespace love\n{\nnamespace audio\n{\n\nRecordingDevice *luax_checkrecordingdevice(lua_State *L, int idx)\n{\n\treturn luax_checktype<RecordingDevice>(L, idx);\n}\n\nint w_RecordingDevice_start(lua_State *L)\n{\n\tRecordingDevice *d = luax_checkrecordingdevice(L, 1);\n\n\tint samples = d->getMaxSamples();\n\tint samplerate = d->getSampleRate();\n\tint bitdepth = d->getBitDepth();\n\tint channels = d->getChannelCount();\n\n\tif (lua_gettop(L) > 1)\n\t{\n\t\tsamples = (int) luaL_checkinteger(L, 2);\n\t\tsamplerate = (int) luaL_optinteger(L, 3, RecordingDevice::DEFAULT_SAMPLE_RATE);\n\t\tbitdepth = (int) luaL_optinteger(L, 4, RecordingDevice::DEFAULT_BIT_DEPTH);\n\t\tchannels = (int) (int) luaL_optinteger(L, 5, RecordingDevice::DEFAULT_CHANNELS);\n\t}\n\n\tbool success = false;\n\tluax_catchexcept(L, [&]() { success = d->start(samples, samplerate, bitdepth, channels); });\n\n\tluax_pushboolean(L, success);\n\treturn 1;\n}\n\nint w_RecordingDevice_stop(lua_State *L)\n{\n\tRecordingDevice *d = luax_checkrecordingdevice(L, 1);\n\tlove::sound::SoundData *s = nullptr;\n\n\tluax_catchexcept(L, [&](){ s = d->getData(); });\n\n\td->stop();\n\n\tif (s != nullptr)\n\t{\n\t\tluax_pushtype(L, s);\n\t\ts->release();\n\t}\n\telse\n\t\tlua_pushnil(L);\n\n\treturn 1;\n}\n\nint w_RecordingDevice_getData(lua_State *L)\n{\n\tRecordingDevice *d = luax_checkrecordingdevice(L, 1);\n\tlove::sound::SoundData *s = nullptr;\n\n\tluax_catchexcept(L, [&](){ s = d->getData(); });\n\n\tif (s != nullptr)\n\t{\n\t\tluax_pushtype(L, s);\n\t\ts->release();\n\t}\n\telse\n\t\tlua_pushnil(L);\n\n\treturn 1;\n}\n\nint w_RecordingDevice_getSampleCount(lua_State *L)\n{\n\tRecordingDevice *d = luax_checkrecordingdevice(L, 1);\n\tlua_pushnumber(L, d->getSampleCount());\n\treturn 1;\n}\n\nint w_RecordingDevice_getSampleRate(lua_State *L)\n{\n\tRecordingDevice *d = luax_checkrecordingdevice(L, 1);\n\tlua_pushnumber(L, d->getSampleRate());\n\treturn 1;\n}\n\nint w_RecordingDevice_getBitDepth(lua_State *L)\n{\n\tRecordingDevice *d = luax_checkrecordingdevice(L, 1);\n\tlua_pushnumber(L, d->getBitDepth());\n\treturn 1;\n}\n\nint w_RecordingDevice_getChannelCount(lua_State *L)\n{\n\tRecordingDevice *d = luax_checkrecordingdevice(L, 1);\n\tlua_pushnumber(L, d->getChannelCount());\n\treturn 1;\n}\n\nint w_RecordingDevice_getName(lua_State *L)\n{\n\tRecordingDevice *d = luax_checkrecordingdevice(L, 1);\n\tlua_pushstring(L, d->getName());\n\treturn 1;\n}\n\nint w_RecordingDevice_isRecording(lua_State *L)\n{\n\tRecordingDevice *d = luax_checkrecordingdevice(L, 1);\n\tlua_pushboolean(L, d->isRecording());\n\treturn 1;\n}\n\nstatic const luaL_Reg w_RecordingDevice_functions[] =\n{\n\t{ \"start\", w_RecordingDevice_start },\n\t{ \"stop\", w_RecordingDevice_stop },\n\t{ \"getData\", w_RecordingDevice_getData },\n\t{ \"getSampleCount\", w_RecordingDevice_getSampleCount },\n\t{ \"getSampleRate\", w_RecordingDevice_getSampleRate },\n\t{ \"getBitDepth\", w_RecordingDevice_getBitDepth },\n\t{ \"getChannelCount\", w_RecordingDevice_getChannelCount },\n\t{ \"getName\", w_RecordingDevice_getName },\n\t{ \"isRecording\", w_RecordingDevice_isRecording },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_recordingdevice(lua_State *L)\n{\n\tint ret = luax_register_type(L, &RecordingDevice::type, w_RecordingDevice_functions, nullptr);\n\treturn ret;\n}\n\n} //audio\n} //love\n"
  },
  {
    "path": "src/modules/audio/wrap_RecordingDevice.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_AUDIO_WRAP_RECORDING_DEVICE_H\n#define LOVE_AUDIO_WRAP_RECORDING_DEVICE_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"RecordingDevice.h\"\n\nnamespace love\n{\nnamespace audio\n{\n\nRecordingDevice *luax_checkrecordingdevice(lua_State *L, int idx);\nextern \"C\" int luaopen_recordingdevice(lua_State *L);\n\n} // audio\n} // love\n\n#endif //LOVE_AUDIO_WRAP_RECORDING_DEVICE_H\n\n"
  },
  {
    "path": "src/modules/audio/wrap_Source.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include <limits>\n\n#include \"sound/SoundData.h\"\n#include \"wrap_Source.h\"\n\n#include <cmath>\n#include <iostream>\n\nnamespace love\n{\nnamespace audio\n{\n\nSource *luax_checksource(lua_State *L, int idx)\n{\n\treturn luax_checktype<Source>(L, idx);\n}\n\nint w_Source_clone(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tSource *clone = nullptr;\n\tluax_catchexcept(L, [&](){ clone = t->clone(); });\n\tluax_pushtype(L, clone);\n\tclone->release();\n\treturn 1;\n}\n\nint w_Source_play(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tluax_pushboolean(L, t->play());\n\treturn 1;\n}\n\nint w_Source_stop(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tt->stop();\n\treturn 0;\n}\n\nint w_Source_pause(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tt->pause();\n\treturn 0;\n}\n\nint w_Source_setPitch(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tfloat p = (float)luaL_checknumber(L, 2);\n\tif (p != p)\n\t\treturn luaL_error(L, \"Pitch cannot be NaN.\");\n\tif (p > std::numeric_limits<lua_Number>::max() ||\n\t\t\tp <= 0.0f)\n\t\treturn luaL_error(L, \"Pitch has to be non-zero, positive, finite number.\");\n\tt->setPitch(p);\n\treturn 0;\n}\n\nint w_Source_getPitch(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tlua_pushnumber(L, t->getPitch());\n\treturn 1;\n}\n\nint w_Source_setVolume(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tfloat p = (float)luaL_checknumber(L, 2);\n\tt->setVolume(p);\n\treturn 0;\n}\n\nint w_Source_getVolume(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tlua_pushnumber(L, t->getVolume());\n\treturn 1;\n}\n\nint w_Source_seek(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tdouble offset = luaL_checknumber(L, 2);\n\tif (offset < 0)\n\t\treturn luaL_argerror(L, 2, \"can't seek to a negative position\");\n\n\tSource::Unit u = Source::UNIT_SECONDS;\n\tconst char *unit = lua_isnoneornil(L, 3) ? 0 : lua_tostring(L, 3);\n\tif (unit && !t->getConstant(unit, u))\n\t\treturn luax_enumerror(L, \"time unit\", Source::getConstants(u), unit);\n\n\tt->seek(offset, u);\n\treturn 0;\n}\n\nint w_Source_tell(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\n\tSource::Unit u = Source::UNIT_SECONDS;\n\tconst char *unit = lua_isnoneornil(L, 2) ? 0 : lua_tostring(L, 2);\n\tif (unit && !t->getConstant(unit, u))\n\t\treturn luax_enumerror(L, \"time unit\", Source::getConstants(u), unit);\n\n\tlua_pushnumber(L, t->tell(u));\n\treturn 1;\n}\n\nint w_Source_getDuration(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\n\tSource::Unit u = Source::UNIT_SECONDS;\n\tconst char *unit = lua_isnoneornil(L, 2) ? 0 : lua_tostring(L, 2);\n\tif (unit && !t->getConstant(unit, u))\n\t\treturn luax_enumerror(L, \"time unit\", Source::getConstants(u), unit);\n\n\tlua_pushnumber(L, t->getDuration(u));\n\treturn 1;\n}\n\nint w_Source_setPosition(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tfloat v[3];\n\tv[0] = (float)luaL_checknumber(L, 2);\n\tv[1] = (float)luaL_checknumber(L, 3);\n\tv[2] = (float)luaL_optnumber(L, 4, 0);\n\tluax_catchexcept(L, [&](){ t->setPosition(v); });\n\treturn 0;\n}\n\nint w_Source_getPosition(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tfloat v[3];\n\tluax_catchexcept(L, [&](){ t->getPosition(v); });\n\tlua_pushnumber(L, v[0]);\n\tlua_pushnumber(L, v[1]);\n\tlua_pushnumber(L, v[2]);\n\treturn 3;\n}\n\nint w_Source_setVelocity(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tfloat v[3];\n\tv[0] = (float)luaL_checknumber(L, 2);\n\tv[1] = (float)luaL_checknumber(L, 3);\n\tv[2] = (float)luaL_optnumber(L, 4, 0);\n\tluax_catchexcept(L, [&](){ t->setVelocity(v); });\n\treturn 0;\n}\n\nint w_Source_getVelocity(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tfloat v[3];\n\tluax_catchexcept(L, [&](){ t->getVelocity(v); });\n\tlua_pushnumber(L, v[0]);\n\tlua_pushnumber(L, v[1]);\n\tlua_pushnumber(L, v[2]);\n\treturn 3;\n}\n\nint w_Source_setDirection(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tfloat v[3];\n\tv[0] = (float)luaL_checknumber(L, 2);\n\tv[1] = (float)luaL_checknumber(L, 3);\n\tv[2] = (float)luaL_optnumber(L, 4, 0);\n\tluax_catchexcept(L, [&](){ t->setDirection(v); });\n\treturn 0;\n}\n\nint w_Source_getDirection(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tfloat v[3];\n\tluax_catchexcept(L, [&](){ t->getDirection(v); });\n\tlua_pushnumber(L, v[0]);\n\tlua_pushnumber(L, v[1]);\n\tlua_pushnumber(L, v[2]);\n\treturn 3;\n}\n\nint w_Source_setCone(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tfloat innerAngle = (float) luaL_checknumber(L, 2);\n\tfloat outerAngle = (float) luaL_checknumber(L, 3);\n\tfloat outerVolume = (float) luaL_optnumber(L, 4, 0.0);\n\tfloat outerHighGain = (float) luaL_optnumber(L, 5, 1.0);\n\tluax_catchexcept(L, [&](){ t->setCone(innerAngle, outerAngle, outerVolume, outerHighGain); });\n\treturn 0;\n}\n\nint w_Source_getCone(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tfloat innerAngle, outerAngle, outerVolume, outerHighGain;\n\tluax_catchexcept(L, [&](){ t->getCone(innerAngle, outerAngle, outerVolume, outerHighGain); });\n\tlua_pushnumber(L, innerAngle);\n\tlua_pushnumber(L, outerAngle);\n\tlua_pushnumber(L, outerVolume);\n\tlua_pushnumber(L, outerHighGain);\n\treturn 4;\n}\n\nint w_Source_setRelative(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tluax_catchexcept(L, [&](){ t->setRelative(luax_checkboolean(L, 2)); });\n\treturn 0;\n}\n\nint w_Source_isRelative(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tluax_catchexcept(L, [&](){ luax_pushboolean(L, t->isRelative()); });\n\treturn 1;\n}\n\nint w_Source_setLooping(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tluax_catchexcept(L, [&](){ t->setLooping(luax_checkboolean(L, 2)); });\n\treturn 0;\n}\n\nint w_Source_isLooping(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tluax_pushboolean(L, t->isLooping());\n\treturn 1;\n}\n\nint w_Source_isPlaying(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tluax_pushboolean(L, t->isPlaying());\n\treturn 1;\n}\n\nint w_Source_setVolumeLimits(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tfloat vmin = (float)luaL_checknumber(L, 2);\n\tfloat vmax = (float)luaL_checknumber(L, 3);\n\tif (vmin < .0f || vmin > 1.f || vmax < .0f || vmax > 1.f)\n\t\treturn luaL_error(L, \"Invalid volume limits: [%f:%f]. Must be in [0:1]\", vmin, vmax);\n\tt->setMinVolume(vmin);\n\tt->setMaxVolume(vmax);\n\treturn 0;\n}\n\nint w_Source_getVolumeLimits(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tlua_pushnumber(L, t->getMinVolume());\n\tlua_pushnumber(L, t->getMaxVolume());\n\treturn 2;\n}\n\nint w_Source_setAttenuationDistances(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tfloat dref = (float)luaL_checknumber(L, 2);\n\tfloat dmax = (float)luaL_checknumber(L, 3);\n\tif (dref < .0f || dmax < .0f)\n\t\treturn luaL_error(L, \"Invalid distances: %f, %f. Must be > 0\", dref, dmax);\n\tluax_catchexcept(L, [&]() {\n\t\tt->setReferenceDistance(dref);\n\t\tt->setMaxDistance(dmax);\n\t});\n\treturn 0;\n}\n\nint w_Source_getAttenuationDistances(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tluax_catchexcept(L, [&]() {\n\t\tlua_pushnumber(L, t->getReferenceDistance());\n\t\tlua_pushnumber(L, t->getMaxDistance());\n\t});\n\treturn 2;\n}\n\nint w_Source_setRolloff(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tfloat rolloff = (float)luaL_checknumber(L, 2);\n\tif (rolloff < .0f)\n\t\treturn luaL_error(L, \"Invalid rolloff: %f. Must be > 0.\", rolloff);\n\tluax_catchexcept(L, [&](){ t->setRolloffFactor(rolloff); });\n\treturn 0;\n}\n\nint w_Source_getRolloff(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tluax_catchexcept(L, [&](){ lua_pushnumber(L, t->getRolloffFactor()); });\n\treturn 1;\n}\n\nint w_Source_setAirAbsorption(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tfloat factor = (float)luaL_checknumber(L, 2);\n\tif (factor < 0.0f)\n\t\treturn luaL_error(L, \"Invalid air absorption factor: %f. Must be > 0.\", factor);\n\tluax_catchexcept(L, [&](){ t->setAirAbsorptionFactor(factor); });\n\treturn 0;\n}\n\nint w_Source_getAirAbsorption(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tluax_catchexcept(L, [&](){ lua_pushnumber(L, t->getAirAbsorptionFactor()); });\n\treturn 1;\n}\n\nint w_Source_getChannelCount(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tlua_pushinteger(L, t->getChannelCount());\n\treturn 1;\n}\n\nint setFilterReadFilter(lua_State *L, int idx, std::map<Filter::Parameter, float> &params)\n{\n\tif (lua_gettop(L) < idx || lua_isnoneornil(L, idx))\n\t\treturn 0;\n\n\tluaL_checktype(L, idx, LUA_TTABLE);\n\n\tconst char *paramstr = nullptr;\n\n\tFilter::getConstant(Filter::FILTER_TYPE, paramstr, Filter::TYPE_BASIC);\n\tlua_pushstring(L, paramstr);\n\tlua_rawget(L, idx);\n\tif (lua_type(L, -1) == LUA_TNIL)\n\t\treturn luaL_error(L, \"Filter type not specificed.\");\n\n\tFilter::Type type = Filter::TYPE_MAX_ENUM;\n\tconst char *typestr = luaL_checkstring(L, -1);\n\tif (!Filter::getConstant(typestr, type))\n\t\treturn luax_enumerror(L, \"filter type\", Filter::getConstants(type), typestr);\n\n\tlua_pop(L, 1);\n\tparams[Filter::FILTER_TYPE] = static_cast<int>(type);\n\n\tlua_pushnil(L);\n\twhile (lua_next(L, idx))\n\t{\n\t\tconst char *keystr = luaL_checkstring(L, -2);\n\t\tFilter::Parameter param;\n\n\t\tif(Filter::getConstant(keystr, param, type) || Filter::getConstant(keystr, param, Filter::TYPE_BASIC))\n\t\t{\n#define luax_effecterror(l,t) luaL_error(l,\"Bad parameter type for %s %s: \" t \" expected, got %s\", typestr, keystr, lua_typename(L, -1))\n\t\t\tswitch(Filter::getParameterType(param))\n\t\t\t{\n\t\t\tcase Filter::PARAM_FLOAT:\n\t\t\t\tif (!lua_isnumber(L, -1))\n\t\t\t\t\treturn luax_effecterror(L, \"number\");\n\t\t\t\tparams[param] = lua_tonumber(L, -1);\n\t\t\t\tbreak;\n\t\t\tcase Filter::PARAM_TYPE:\n\t\t\tcase Filter::PARAM_MAX_ENUM:\n\t\t\t\tbreak;\n\t\t\t}\n#undef luax_effecterror\n\t\t}\n\t\telse\n\t\t\tluaL_error(L, \"Invalid '%s' Effect parameter: %s\", typestr, keystr);\n\n\t\t//remove the value (-1) from stack, keep the key (-2) to feed into lua_next\n\t\tlua_pop(L, 1);\n\t}\n\n\treturn 1;\n}\n\nvoid getFilterWriteFilter(lua_State *L, int idx, std::map<Filter::Parameter, float> &params)\n{\n\tconst char *keystr, *valstr;\n\tFilter::Type type = static_cast<Filter::Type>((int)params[Filter::FILTER_TYPE]);\n\n\tif (lua_istable(L, idx))\n\t\tlua_pushvalue(L, idx);\n\telse\n\t\tlua_createtable(L, 0, params.size());\n\n\tfor (auto p : params)\n\t{\n\t\tif (!Filter::getConstant(p.first, keystr, type))\n\t\t\tFilter::getConstant(p.first, keystr, Filter::TYPE_BASIC);\n\n\t\tlua_pushstring(L, keystr);\n\t\tswitch (Filter::getParameterType(p.first))\n\t\t{\n\t\tcase Filter::PARAM_FLOAT:\n\t\t\tlua_pushnumber(L, p.second);\n\t\t\tbreak;\n\t\tcase Filter::PARAM_TYPE:\n\t\t\tFilter::getConstant(static_cast<Filter::Type>((int)p.second), valstr);\n\t\t\tlua_pushstring(L, valstr);\n\t\t\tbreak;\n\t\tcase Filter::PARAM_MAX_ENUM:\n\t\t\tbreak;\n\t\t}\n\t\tlua_rawset(L, -3);\n\t}\n}\n\nint w_Source_setFilter(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\n\tstd::map<Filter::Parameter, float> params;\n\n\tif (setFilterReadFilter(L, 2, params) == 1)\n\t\tluax_catchexcept(L, [&]() { lua_pushboolean(L, t->setFilter(params)); });\n\telse\n\t\tluax_catchexcept(L, [&]() { lua_pushboolean(L, t->setFilter()); });\n\n\treturn 1;\n}\n\nint w_Source_getFilter(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\n\tstd::map<Filter::Parameter, float> params;\n\n\tif (!t->getFilter(params))\n\t\treturn 0;\n\n\tgetFilterWriteFilter(L, 2, params);\n\treturn 1;\n}\n\nint w_Source_setEffect(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tconst char *namestr = luaL_checkstring(L, 2);\n\n\tconst bool isBool = lua_gettop(L) >= 3 && lua_isboolean(L, 3);\n\n\t// :setEffect(effect, false) = clear effect\n\tif (isBool && !lua_toboolean(L, 3))\n\t{\n\t\tluax_catchexcept(L, [&]() { lua_pushboolean(L, t->unsetEffect(namestr)); });\n\t\treturn 1;\n\t}\n\n\tstd::map<Filter::Parameter, float> params;\n\n\t// :setEffect(effect, [true]) = set effect without filter\n\tif (isBool || setFilterReadFilter(L, 3, params) == 0)\n\t\tluax_catchexcept(L, [&]() { lua_pushboolean(L, t->setEffect(namestr)); });\n\telse\n\t\tluax_catchexcept(L, [&]() { lua_pushboolean(L, t->setEffect(namestr, params)); });\n\treturn 1;\n}\n\nint w_Source_getEffect(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tconst char *namestr = luaL_checkstring(L, 2);\n\n\tstd::map<Filter::Parameter, float> params;\n\tif (!t->getEffect(namestr, params))\n\t{\n\t\tluax_pushboolean(L, false);\n\t\treturn 1;\n\t}\n\n\tluax_pushboolean(L, true);\n\n\t// No filter associated, return nil as second argument\n\tif (params.size() == 0)\n\t\treturn 1;\n\n\t// Return filter settings as second argument\n\tgetFilterWriteFilter(L, 3, params);\n\treturn 2;\n}\n\nint w_Source_getActiveEffects(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\n\tstd::vector<std::string> list;\n\tt->getActiveEffects(list);\n\n\tlua_createtable(L, 0, (int) list.size());\n\tfor (int i = 0; i < (int) list.size(); i++)\n\t{\n\t\tlua_pushnumber(L, i + 1);\n\t\tlua_pushstring(L, list[i].c_str());\n\t\tlua_rawset(L, -3);\n\t}\n\treturn 1;\n}\n\nint w_Source_getFreeBufferCount(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tlua_pushinteger(L, t->getFreeBufferCount());\n\treturn 1;\n}\n\nint w_Source_queue(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tbool success;\n\n\tif (luax_istype(L, 2, love::sound::SoundData::type))\n\t{\n\t\tauto s = luax_totype<love::sound::SoundData>(L, 2);\n\n\t\tint offset = 0;\n\t\tsize_t length = s->getSize();\n\n\t\tif (lua_gettop(L) == 4)\n\t\t{\n\t\t\toffset = luaL_checknumber(L, 3);\n\t\t\tlength = luaL_checknumber(L, 4);\n\t\t}\n\t\telse if (lua_gettop(L) == 3)\n\t\t\tlength = luaL_checknumber(L, 3);\n\n\t\tif (offset < 0 || length > s->getSize() - offset)\n\t\t\treturn luaL_error(L, \"Data region out of bounds.\");\n\n\t\tluax_catchexcept(L, [&]() {\n\t\t\tsuccess = t->queue((unsigned char *)s->getData() + offset, length,\n\t\t\t            s->getSampleRate(), s->getBitDepth(), s->getChannelCount());\n\t\t});\n\t}\n\telse if (lua_islightuserdata(L, 2))\n\t{\n\t\tint offset = luaL_checknumber(L, 3);\n\t\tint length = luaL_checknumber(L, 4);\n\t\tint sampleRate = luaL_checknumber(L, 5);\n\t\tint bitDepth = luaL_checknumber(L, 6);\n\t\tint channels = luaL_checknumber(L, 7);\n\n\t\tif (length < 0 || offset < 0)\n\t\t\treturn luaL_error(L, \"Data region out of bounds.\");\n\n\t\tluax_catchexcept(L, [&]() {\n\t\t\tsuccess = t->queue((void*)((uintptr_t)lua_touserdata(L, 2) + (uintptr_t)offset), length, sampleRate, bitDepth, channels);\n\t\t});\n\t}\n\telse\n\t\treturn luax_typerror(L, 2, \"SoundData or lightuserdata\");\n\n\tluax_pushboolean(L, success);\n\treturn 1;\n}\n\nint w_Source_getType(lua_State *L)\n{\n\tSource *t = luax_checksource(L, 1);\n\tSource::Type type = t->getType();\n\tconst char *str = nullptr;\n\n\tif (!Source::getConstant(type, str))\n\t\treturn luaL_error(L, \"Unknown Source type.\");\n\n\tlua_pushstring(L, str);\n\treturn 1;\n}\n\nstatic const luaL_Reg w_Source_functions[] =\n{\n\t{ \"clone\", w_Source_clone },\n\n\t{ \"play\", w_Source_play },\n\t{ \"stop\", w_Source_stop },\n\t{ \"pause\", w_Source_pause },\n\n\t{ \"setPitch\", w_Source_setPitch },\n\t{ \"getPitch\", w_Source_getPitch },\n\t{ \"setVolume\", w_Source_setVolume },\n\t{ \"getVolume\", w_Source_getVolume },\n\t{ \"seek\", w_Source_seek },\n\t{ \"tell\", w_Source_tell },\n\t{ \"getDuration\", w_Source_getDuration },\n\t{ \"setPosition\", w_Source_setPosition },\n\t{ \"getPosition\", w_Source_getPosition },\n\t{ \"setVelocity\", w_Source_setVelocity },\n\t{ \"getVelocity\", w_Source_getVelocity },\n\t{ \"setDirection\", w_Source_setDirection },\n\t{ \"getDirection\", w_Source_getDirection },\n\t{ \"setCone\", w_Source_setCone },\n\t{ \"getCone\", w_Source_getCone },\n\n\t{ \"setRelative\", w_Source_setRelative },\n\t{ \"isRelative\", w_Source_isRelative },\n\n\t{ \"setLooping\", w_Source_setLooping },\n\t{ \"isLooping\", w_Source_isLooping },\n\t{ \"isPlaying\", w_Source_isPlaying },\n\n\t{ \"setVolumeLimits\", w_Source_setVolumeLimits },\n\t{ \"getVolumeLimits\", w_Source_getVolumeLimits },\n\t{ \"setAttenuationDistances\", w_Source_setAttenuationDistances },\n\t{ \"getAttenuationDistances\", w_Source_getAttenuationDistances },\n\t{ \"setRolloff\", w_Source_setRolloff },\n\t{ \"getRolloff\", w_Source_getRolloff },\n\t{ \"setAirAbsorption\", w_Source_setAirAbsorption },\n\t{ \"getAirAbsorption\", w_Source_getAirAbsorption },\n\n\t{ \"getChannelCount\", w_Source_getChannelCount },\n\n\t{ \"setFilter\", w_Source_setFilter },\n\t{ \"getFilter\", w_Source_getFilter },\n\t{ \"setEffect\", w_Source_setEffect },\n\t{ \"getEffect\", w_Source_getEffect },\n\t{ \"getActiveEffects\", w_Source_getActiveEffects },\n\n\t{ \"getFreeBufferCount\", w_Source_getFreeBufferCount },\n\t{ \"queue\", w_Source_queue },\n\n\t{ \"getType\", w_Source_getType },\n\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_source(lua_State *L)\n{\n\treturn luax_register_type(L, &love::audio::Source::type, w_Source_functions, nullptr);\n}\n\n} // audio\n} // love\n"
  },
  {
    "path": "src/modules/audio/wrap_Source.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_AUDIO_WRAP_SOURCE_H\n#define LOVE_AUDIO_WRAP_SOURCE_H\n\n#include \"common/runtime.h\"\n#include \"Source.h\"\n#include \"Filter.h\"\n\nnamespace love\n{\nnamespace audio\n{\n\nSource *luax_checksource(lua_State *L, int idx);\nextern \"C\" int luaopen_source(lua_State *L);\n\n} // audio\n} // love\n\n#endif // LOVE_AUDIO_WRAP_SOURCE_H\n"
  },
  {
    "path": "src/modules/data/ByteData.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"ByteData.h\"\n#include \"common/Exception.h\"\n#include \"common/int.h\"\n\n#include <string.h>\n\nnamespace love\n{\nnamespace data\n{\n\nlove::Type ByteData::type(\"ByteData\", &Data::type);\n\nByteData::ByteData(size_t size, bool clear)\n\t: size(size)\n{\n\tcreate();\n\tif (clear)\n\t\tmemset(data, 0, size);\n}\n\nByteData::ByteData(const void *d, size_t size)\n\t: size(size)\n{\n\tcreate();\n\tif (d != nullptr)\n\t\tmemcpy(data, d, size);\n}\n\nByteData::ByteData(void *d, size_t size, bool own)\n\t: size(size)\n{\n\tif (own)\n\t\tdata = (char *) d;\n\telse\n\t{\n\t\tcreate();\n\t\tif (d != nullptr)\n\t\t\tmemcpy(data, d, size);\n\t}\n}\n\nByteData::ByteData(const ByteData &d)\n\t: size(d.size)\n{\n\tcreate();\n\tmemcpy(data, d.data, size);\n}\n\nByteData::~ByteData()\n{\n\tdelete[] data;\n}\n\nvoid ByteData::create()\n{\n\tif (size == 0)\n\t\tthrow love::Exception(\"ByteData size must be greater than 0.\");\n\n\ttry\n\t{\n\t\tdata = new char[size];\n\t}\n\tcatch (std::exception &)\n\t{\n\t\tthrow love::Exception(\"Out of memory.\");\n\t}\n}\n\nByteData *ByteData::clone() const\n{\n\treturn new ByteData(*this);\n}\n\nvoid *ByteData::getData() const\n{\n\treturn data;\n}\n\nsize_t ByteData::getSize() const\n{\n\treturn size;\n}\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/data/ByteData.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"common/Data.h\"\n\n#include <stddef.h>\n\nnamespace love\n{\nnamespace data\n{\n\nclass ByteData : public love::Data\n{\npublic:\n\n\tstatic love::Type type;\n\n\tByteData(size_t size, bool clear = true);\n\tByteData(const void *d, size_t size);\n\tByteData(void *d, size_t size, bool own);\n\tByteData(const ByteData &d);\n\tvirtual ~ByteData();\n\n\t// Implements Data.\n\tByteData *clone() const override;\n\tvoid *getData() const override;\n\tsize_t getSize() const override;\n\nprivate:\n\n\tvoid create();\n\n\tchar *data;\n\tsize_t size;\n\n}; // ByteData\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/data/CompressedData.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"CompressedData.h\"\n#include \"common/Exception.h\"\n\nnamespace love\n{\nnamespace data\n{\n\nlove::Type CompressedData::type(\"CompressedData\", &Data::type);\n\nCompressedData::CompressedData(Compressor::Format format, char *cdata, size_t compressedsize, size_t rawsize, bool own)\n\t: format(format)\n\t, data(nullptr)\n\t, dataSize(compressedsize)\n\t, originalSize(rawsize)\n{\n\tif (own)\n\t\tdata = cdata;\n\telse\n\t{\n\t\ttry\n\t\t{\n\t\t\tdata = new char[dataSize];\n\t\t}\n\t\tcatch (std::bad_alloc &)\n\t\t{\n\t\t\tthrow love::Exception(\"Out of memory.\");\n\t\t}\n\n\t\tmemcpy(data, cdata, dataSize);\n\t}\n}\n\nCompressedData::CompressedData(const CompressedData &c)\n\t: format(c.format)\n\t, data(nullptr)\n\t, dataSize(c.dataSize)\n\t, originalSize(c.originalSize)\n{\n\ttry\n\t{\n\t\tdata = new char[dataSize];\n\t}\n\tcatch (std::bad_alloc &)\n\t{\n\t\tthrow love::Exception(\"Out of memory.\");\n\t}\n\n\tmemcpy(data, c.data, dataSize);\n}\n\nCompressedData::~CompressedData()\n{\n\tdelete[] data;\n}\n\nCompressedData *CompressedData::clone() const\n{\n\treturn new CompressedData(*this);\n}\n\nCompressor::Format CompressedData::getFormat() const\n{\n\treturn format;\n}\n\nsize_t CompressedData::getDecompressedSize() const\n{\n\treturn originalSize;\n}\n\nvoid *CompressedData::getData() const\n{\n\treturn data;\n}\n\nsize_t CompressedData::getSize() const\n{\n\treturn dataSize;\n}\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/data/CompressedData.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/Data.h\"\n#include \"Compressor.h\"\n\nnamespace love\n{\nnamespace data\n{\n\n/**\n * Stores byte data compressed via DataModule::compress.\n **/\nclass CompressedData : public love::Data\n{\npublic:\n\n\tstatic love::Type type;\n\n\t/**\n\t * Constructor just stores already-compressed data in the object.\n\t **/\n\tCompressedData(Compressor::Format format, char *cdata, size_t compressedsize, size_t rawsize, bool own = true);\n\tCompressedData(const CompressedData &c);\n\tvirtual ~CompressedData();\n\n\t/**\n\t * Gets the format that was used to compress the data.\n\t **/\n\tCompressor::Format getFormat() const;\n\n\t/**\n\t * Gets the original (uncompressed) size of the compressed data. May return\n\t * 0 if the uncompressed size is unknown.\n\t **/\n\tsize_t getDecompressedSize() const;\n\n\t// Implements Data.\n\tCompressedData *clone() const override;\n\tvoid *getData() const override;\n\tsize_t getSize() const override;\n\nprivate:\n\n\tCompressor::Format format;\n\n\tchar *data;\n\tsize_t dataSize;\n\n\tsize_t originalSize;\n\n}; // CompressedData\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/data/Compressor.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"Compressor.h\"\n#include \"common/config.h\"\n#include \"common/int.h\"\n#include \"common/Exception.h\"\n\n#include \"libraries/lz4/lz4.h\"\n#include \"libraries/lz4/lz4hc.h\"\n\n#include <zlib.h>\n\nnamespace love\n{\nnamespace data\n{\n\nclass LZ4Compressor : public Compressor\n{\npublic:\n\n\tchar *compress(Format format, const char *data, size_t dataSize, int level, size_t &compressedSize) override\n\t{\n\t\tif (format != FORMAT_LZ4)\n\t\t\tthrow love::Exception(\"Invalid format (expecting LZ4)\");\n\n\t\tif (dataSize > LZ4_MAX_INPUT_SIZE)\n\t\t\tthrow love::Exception(\"Data is too large for LZ4 compressor.\");\n\n\t\t// We use a custom header to store some info with the compressed data.\n\t\tconst size_t headersize = sizeof(uint32);\n\n\t\tint maxdestsize = LZ4_compressBound((int) dataSize);\n\t\tsize_t maxsize = headersize + (size_t) maxdestsize;\n\t\tchar *compressedbytes = nullptr;\n\n\t\ttry\n\t\t{\n\t\t\tcompressedbytes = new char[maxsize];\n\t\t}\n\t\tcatch (std::bad_alloc &)\n\t\t{\n\t\t\tthrow love::Exception(\"Out of memory.\");\n\t\t}\n\n\t\t// Store the size of the uncompressed data as a header.\n#ifdef LOVE_BIG_ENDIAN\n\t\t// Make sure it's little-endian for storage.\n\t\t*(uint32 *) compressedbytes = swapuint32((uint32) dataSize);\n#else\n\t\t*(uint32 *) compressedbytes = (uint32) dataSize;\n#endif\n\n\t\t// Use LZ4-HC for compression level 9 and higher.\n\t\tint csize = 0;\n\t\tif (level > 8)\n\t\t\tcsize = LZ4_compress_HC(data, compressedbytes + headersize, (int) dataSize, maxdestsize, LZ4HC_CLEVEL_DEFAULT);\n\t\telse\n\t\t\tcsize = LZ4_compress_default(data, compressedbytes + headersize, (int) dataSize, maxdestsize);\n\n\t\tif (csize <= 0)\n\t\t{\n\t\t\tdelete[] compressedbytes;\n\t\t\tthrow love::Exception(\"Could not LZ4-compress data.\");\n\t\t}\n\n\t\t// We allocated space for the maximum possible amount of data, but the\n\t\t// actual compressed size might be much smaller, so we should shrink the\n\t\t// data buffer if so.\n\t\tif ((double) maxsize / (double) (csize + headersize) >= 1.2)\n\t\t{\n\t\t\tchar *cbytes = new (std::nothrow) char[csize + headersize];\n\t\t\tif (cbytes)\n\t\t\t{\n\t\t\t\tmemcpy(cbytes, compressedbytes, csize + headersize);\n\t\t\t\tdelete[] compressedbytes;\n\t\t\t\tcompressedbytes = cbytes;\n\t\t\t}\n\t\t}\n\n\t\tcompressedSize = (size_t) csize + headersize;\n\t\treturn compressedbytes;\n\t}\n\n\tchar *decompress(Format format, const char *data, size_t dataSize, size_t &decompressedSize) override\n\t{\n\t\tif (format != FORMAT_LZ4)\n\t\t\tthrow love::Exception(\"Invalid format (expecting LZ4)\");\n\n\t\tconst size_t headersize = sizeof(uint32);\n\t\tchar *rawbytes = nullptr;\n\n\t\tif (dataSize < headersize)\n\t\t\tthrow love::Exception(\"Invalid LZ4-compressed data size.\");\n\n\t\t// Extract the original uncompressed size (stored in our custom header.)\n#ifdef LOVE_BIG_ENDIAN\n\t\t// Convert from stored little-endian to big-endian.\n\t\tuint32 rawsize = swapuint32(*(uint32 *) data);\n#else\n\t\tuint32 rawsize = *(uint32 *) data;\n#endif\n\n\t\ttry\n\t\t{\n\t\t\trawbytes = new char[rawsize];\n\t\t}\n\t\tcatch (std::bad_alloc &)\n\t\t{\n\t\t\tthrow love::Exception(\"Out of memory.\");\n\t\t}\n\n\t\t// If the uncompressed size is passed in as an argument (non-zero) and\n\t\t// it matches the header's stored size, then we assume it's 100% accurate\n\t\t// and we use a more efficient decompression function.\n\t\tif (decompressedSize > 0 && decompressedSize == (size_t) rawsize)\n\t\t{\n\t\t\t// We don't use the header here, but we need to account for its size.\n\t\t\tif (LZ4_decompress_fast(data + headersize, rawbytes, (int) decompressedSize) < 0)\n\t\t\t{\n\t\t\t\tdelete[] rawbytes;\n\t\t\t\tthrow love::Exception(\"Could not decompress LZ4-compressed data.\");\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Account for our custom header's size in the decompress arguments.\n\t\t\tint result = LZ4_decompress_safe(data + headersize, rawbytes,\n\t\t\t                                 (int) (dataSize - headersize), rawsize);\n\n\t\t\tif (result < 0)\n\t\t\t{\n\t\t\t\tdelete[] rawbytes;\n\t\t\t\tthrow love::Exception(\"Could not decompress LZ4-compressed data.\");\n\t\t\t}\n\n\t\t\tdecompressedSize = (size_t) result;\n\t\t}\n\n\t\treturn rawbytes;\n\t}\n\n\tbool isSupported(Format format) const override\n\t{\n\t\treturn format == FORMAT_LZ4;\n\t}\n\n}; // LZ4Compressor\n\n\nclass zlibCompressor : public Compressor\n{\nprivate:\n\n\t// The following three functions are mostly copied from the zlib source\n\t// (compressBound, compress2, and uncompress), but modified to support both\n\t// zlib and gzip.\n\n\tuLong zlibCompressBound(Format format, uLong sourceLen)\n\t{\n\t\tuLong size = sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + (sourceLen >> 25) + 13;\n\n\t\t// The gzip header is slightly larger than the zlib header.\n\t\tif (format == FORMAT_GZIP)\n\t\t\tsize += 18 - 6;\n\n\t\treturn size;\n\t}\n\n\tint zlibCompress(Format format, Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level)\n\t{\n\t\tz_stream stream = {};\n\n\t\tstream.next_in = (Bytef *) source;\n\t\tstream.avail_in = (uInt) sourceLen;\n\n\t\tstream.next_out = dest;\n\t\tstream.avail_out = (uInt) (*destLen);\n\n\t\tint windowbits = 15;\n\t\tif (format == FORMAT_GZIP)\n\t\t\twindowbits += 16; // This tells zlib to use a gzip header.\n\t\telse if (format == FORMAT_DEFLATE)\n\t\t\twindowbits = -windowbits;\n\n\t\tint err = deflateInit2(&stream, level, Z_DEFLATED, windowbits, 8, Z_DEFAULT_STRATEGY);\n\n\t\tif (err != Z_OK)\n\t\t\treturn err;\n\n\t\terr = deflate(&stream, Z_FINISH);\n\n\t\tif (err != Z_STREAM_END)\n\t\t{\n\t\t\tdeflateEnd(&stream);\n\t\t\treturn err == Z_OK ? Z_BUF_ERROR : err;\n\t\t}\n\n\t\t*destLen = stream.total_out;\n\n\t\treturn deflateEnd(&stream);\n\t}\n\n\tint zlibDecompress(Format format, Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)\n\t{\n\t\tz_stream stream = {};\n\n\t\tstream.next_in = (Bytef *) source;\n\t\tstream.avail_in = (uInt) sourceLen;\n\n\t\tstream.next_out = dest;\n\t\tstream.avail_out = (uInt) (*destLen);\n\n\t\t// 15 is the default. Adding 32 makes zlib auto-detect the header type.\n\t\tint windowbits = 15 + 32;\n\n\t\tif (format == FORMAT_DEFLATE)\n\t\t\twindowbits = -15;\n\n\t\tint err = inflateInit2(&stream, windowbits);\n\n\t\tif (err != Z_OK)\n\t\t\treturn err;\n\n\t\terr = inflate(&stream, Z_FINISH);\n\n\t\tif (err != Z_STREAM_END)\n\t\t{\n\t\t\tinflateEnd(&stream);\n\t\t\tif (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0))\n\t\t\t\treturn Z_DATA_ERROR;\n\t\t\treturn err;\n\t\t}\n\n\t\t*destLen = stream.total_out;\n\n\t\treturn inflateEnd(&stream);\n\t}\n\npublic:\n\n\tchar *compress(Format format, const char *data, size_t dataSize, int level, size_t &compressedSize) override\n\t{\n\t\tif (!isSupported(format))\n\t\t\tthrow love::Exception(\"Invalid format (expecting zlib or gzip)\");\n\n\t\tif (level < 0)\n\t\t\tlevel = Z_DEFAULT_COMPRESSION;\n\t\telse if (level > 9)\n\t\t\tlevel = 9;\n\n\t\tuLong maxsize = zlibCompressBound(format, (uLong) dataSize);\n\t\tchar *compressedbytes = nullptr;\n\n\t\ttry\n\t\t{\n\t\t\tcompressedbytes = new char[maxsize];\n\t\t}\n\t\tcatch (std::bad_alloc &)\n\t\t{\n\t\t\tthrow love::Exception(\"Out of memory.\");\n\t\t}\n\n\t\tuLongf destlen = maxsize;\n\t\tint status = zlibCompress(format, (Bytef *) compressedbytes, &destlen, (const Bytef *) data, (uLong) dataSize, level);\n\n\t\tif (status != Z_OK)\n\t\t{\n\t\t\tdelete[] compressedbytes;\n\t\t\tthrow love::Exception(\"Could not zlib/gzip-compress data.\");\n\t\t}\n\n\t\t// We allocated space for the maximum possible amount of data, but the\n\t\t// actual compressed size might be much smaller, so we should shrink the\n\t\t// data buffer if so.\n\t\tif ((double) maxsize / (double) destlen >= 1.3)\n\t\t{\n\t\t\tchar *cbytes = new (std::nothrow) char[destlen];\n\t\t\tif (cbytes)\n\t\t\t{\n\t\t\t\tmemcpy(cbytes, compressedbytes, destlen);\n\t\t\t\tdelete[] compressedbytes;\n\t\t\t\tcompressedbytes = cbytes;\n\t\t\t}\n\t\t}\n\n\t\tcompressedSize = (size_t) destlen;\n\t\treturn compressedbytes;\n\t}\n\n\tchar *decompress(Format format, const char *data, size_t dataSize, size_t &decompressedSize) override\n\t{\n\t\tif (!isSupported(format))\n\t\t\tthrow love::Exception(\"Invalid format (expecting zlib or gzip)\");\n\n\t\tchar *rawbytes = nullptr;\n\n\t\t// We might know the output size before decompression. If not, we guess.\n\t\tsize_t rawsize = decompressedSize > 0 ? decompressedSize : dataSize * 2;\n\n\t\t// Repeatedly try to decompress with an increasingly large output buffer.\n\t\twhile (true)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\trawbytes = new char[rawsize];\n\t\t\t}\n\t\t\tcatch (std::bad_alloc &)\n\t\t\t{\n\t\t\t\tthrow love::Exception(\"Out of memory.\");\n\t\t\t}\n\n\t\t\tuLongf destLen = (uLongf) rawsize;\n\t\t\tint status = zlibDecompress(format, (Bytef *) rawbytes, &destLen, (const Bytef *) data, (uLong) dataSize);\n\n\t\t\tif (status == Z_OK)\n\t\t\t{\n\t\t\t\tdecompressedSize = (size_t) destLen;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (status != Z_BUF_ERROR)\n\t\t\t{\n\t\t\t\t// For any error other than \"not enough room\", throw an exception.\n\t\t\t\tdelete[] rawbytes;\n\t\t\t\tthrow love::Exception(\"Could not decompress zlib/gzip-compressed data (error code: %d).\", status);\n\t\t\t}\n\n\t\t\t// Not enough room in the output buffer: try again with a larger size.\n\t\t\tdelete[] rawbytes;\n\t\t\trawsize *= 2;\n\t\t}\n\n\t\treturn rawbytes;\n\t}\n\n\tbool isSupported(Format format) const override\n\t{\n\t\treturn format == FORMAT_ZLIB || format == FORMAT_GZIP || format == FORMAT_DEFLATE;\n\t}\n\n}; // zlibCompressor\n\nCompressor *Compressor::getCompressor(Format format)\n{\n\tstatic LZ4Compressor lz4compressor;\n\tstatic zlibCompressor zlibcompressor;\n\n\tCompressor *compressors[] = {&lz4compressor, &zlibcompressor};\n\n\tfor (Compressor *c : compressors)\n\t{\n\t\tif (c->isSupported(format))\n\t\t\treturn c;\n\t}\n\n\treturn nullptr;\n}\n\nbool Compressor::getConstant(const char *in, Format &out)\n{\n\treturn formatNames.find(in, out);\n}\n\nbool Compressor::getConstant(Format in, const char *&out)\n{\n\treturn formatNames.find(in, out);\n}\n\nstd::vector<std::string> Compressor::getConstants(Format)\n{\n\treturn formatNames.getNames();\n}\n\nStringMap<Compressor::Format, Compressor::FORMAT_MAX_ENUM>::Entry Compressor::formatEntries[] =\n{\n\t{ \"lz4\",     FORMAT_LZ4     },\n\t{ \"zlib\",    FORMAT_ZLIB    },\n\t{ \"gzip\",    FORMAT_GZIP    },\n\t{ \"deflate\", FORMAT_DEFLATE },\n};\n\nStringMap<Compressor::Format, Compressor::FORMAT_MAX_ENUM> Compressor::formatNames(Compressor::formatEntries, sizeof(Compressor::formatEntries));\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/data/Compressor.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/StringMap.h\"\n\nnamespace love\n{\nnamespace data\n{\n\n/**\n * Base class for backends for different compression formats.\n **/\nclass Compressor\n{\npublic:\n\n\tenum Format\n\t{\n\t\tFORMAT_LZ4,\n\t\tFORMAT_ZLIB,\n\t\tFORMAT_GZIP,\n\t\tFORMAT_DEFLATE,\n\t\tFORMAT_MAX_ENUM\n\t};\n\n\t/**\n\t * Gets a Compressor that can compress and decompress a specific format.\n\t * Returns null if there are no supported compressors for the given format.\n\t **/\n\tstatic Compressor *getCompressor(Format format);\n\n\tvirtual ~Compressor() {}\n\n\t/**\n\t * Compresses input data, and returns the compressed result.\n\t *\n\t * @param[in] format The format to compress to.\n\t * @param[in] data The input (uncompressed) data.\n\t * @param[in] dataSize The size in bytes of the input data.\n\t * @param[in] level The amount of compression to apply (between 0 and 9.)\n\t *            A value of -1 indicates the default amount of compression.\n\t *            Specific formats may not use every level.\n\t * @param[out] compressedSize The size in bytes of the compressed result.\n\t *\n\t * @return The newly compressed data (allocated with new[]).\n\t **/\n\tvirtual char *compress(Format format, const char *data, size_t dataSize, int level, size_t &compressedSize) = 0;\n\n\t/**\n\t * Decompresses compressed data, and returns the decompressed result.\n\t *\n\t * @param[in] format The format the compressed data is in.\n\t * @param[in] data The input (compressed) data.\n\t * @param[in] dataSize The size in bytes of the compressed data.\n\t * @param[in,out] decompressedSize On input, the size in bytes of the\n\t *               original uncompressed data, or 0 if unknown. On return, the\n\t *               size in bytes of the decompressed data.\n\t *\n\t * @return The decompressed data (allocated with new[]).\n\t **/\n\tvirtual char *decompress(Format format, const char *data, size_t dataSize, size_t &decompressedSize) = 0;\n\n\t/**\n\t * Gets whether a specific format is supported by this backend.\n\t **/\n\tvirtual bool isSupported(Format format) const = 0;\n\n\tstatic bool getConstant(const char *in, Format &out);\n\tstatic bool getConstant(Format in, const char *&out);\n\tstatic std::vector<std::string> getConstants(Format);\n\nprotected:\n\n\tCompressor() {}\n\nprivate:\n\n\tstatic StringMap<Format, FORMAT_MAX_ENUM>::Entry formatEntries[];\n\tstatic StringMap<Format, FORMAT_MAX_ENUM> formatNames;\n\n}; // Compressor\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/data/DataModule.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"DataModule.h\"\n#include \"common/b64.h\"\n#include \"common/int.h\"\n#include \"common/StringMap.h\"\n\n// STL\n#include <cmath>\n#include <list>\n#include <iostream>\n\nnamespace\n{\n\nstatic const char hexchars[] = \"0123456789abcdef\";\n\nchar *bytesToHex(const love::uint8 *src, size_t srclen, size_t &dstlen)\n{\n\tdstlen = srclen * 2;\n\n\tif (dstlen == 0)\n\t\treturn nullptr;\n\n\tchar *dst = nullptr;\n\ttry\n\t{\n\t\tdst = new char[dstlen + 1];\n\t}\n\tcatch (std::exception &)\n\t{\n\t\tthrow love::Exception(\"Out of memory.\");\n\t}\n\n\tfor (size_t i = 0; i < srclen; i++)\n\t{\n\t\tlove::uint8 b = src[i];\n\t\tdst[i * 2 + 0] = hexchars[b >> 4];\n\t\tdst[i * 2 + 1] = hexchars[b & 0xF];\n\t}\n\n\tdst[dstlen] = '\\0';\n\treturn dst;\n}\n\nlove::uint8 nibble(char c)\n{\n\tif (c >= '0' && c <= '9')\n\t\treturn (love::uint8) (c - '0');\n\n\tif (c >= 'A' && c <= 'F')\n\t\treturn (love::uint8) (c - 'A' + 0x0a);\n\n\tif (c >= 'a' && c <= 'f')\n\t\treturn (love::uint8) (c - 'a' + 0x0a);\n\n\treturn 0;\n}\n\nlove::uint8 *hexToBytes(const char *src, size_t srclen, size_t &dstlen)\n{\n\tif (srclen >= 2 && src[0] == '0' && (src[1] == 'x' || src[1] == 'X'))\n\t{\n\t\tsrc += 2;\n\t\tsrclen -= 2;\n\t}\n\n\tdstlen = (srclen + 1) / 2;\n\n\tif (dstlen == 0)\n\t\treturn nullptr;\n\n\tlove::uint8 *dst = nullptr;\n\ttry\n\t{\n\t\tdst = new love::uint8[dstlen];\n\t}\n\tcatch (std::exception &)\n\t{\n\t\tthrow love::Exception(\"Out of memory.\");\n\t}\n\n\tfor (size_t i = 0; i < dstlen; i++)\n\t{\n\t\tdst[i] = nibble(src[i * 2]) << 4;\n\n\t\tif (i * 2 + 1 < srclen)\n\t\t\tdst[i] |= nibble(src[i * 2 + 1]);\n\t}\n\n\treturn dst;\n}\n\n} // anonymous namespace\n\nnamespace love\n{\nnamespace data\n{\n\nCompressedData *compress(Compressor::Format format, const char *rawbytes, size_t rawsize, int level)\n{\n\tCompressor *compressor = Compressor::getCompressor(format);\n\n\tif (compressor == nullptr)\n\t\tthrow love::Exception(\"Invalid compression format.\");\n\n\tsize_t compressedsize = 0;\n\tchar *cbytes = compressor->compress(format, rawbytes, rawsize, level, compressedsize);\n\n\tCompressedData *data = nullptr;\n\n\ttry\n\t{\n\t\tdata = new CompressedData(format, cbytes, compressedsize, rawsize, true);\n\t}\n\tcatch (love::Exception &)\n\t{\n\t\tdelete[] cbytes;\n\t\tthrow;\n\t}\n\n\treturn data;\n}\n\nchar *decompress(CompressedData *data, size_t &decompressedsize)\n{\n\tsize_t rawsize = data->getDecompressedSize();\n\n\tchar *rawbytes = decompress(data->getFormat(), (const char *) data->getData(),\n\t                            data->getSize(), rawsize);\n\n\tdecompressedsize = rawsize;\n\treturn rawbytes;\n}\n\nchar *decompress(Compressor::Format format, const char *cbytes, size_t compressedsize, size_t &rawsize)\n{\n\tCompressor *compressor = Compressor::getCompressor(format);\n\n\tif (compressor == nullptr)\n\t\tthrow love::Exception(\"Invalid compression format.\");\n\n\treturn compressor->decompress(format, cbytes, compressedsize, rawsize);\n}\n\nchar *encode(EncodeFormat format, const char *src, size_t srclen, size_t &dstlen, size_t linelen)\n{\n\tswitch (format)\n\t{\n\tcase ENCODE_BASE64:\n\tdefault:\n\t\treturn b64_encode(src, srclen, linelen, dstlen);\n\tcase ENCODE_HEX:\n\t\treturn bytesToHex((const uint8 *) src, srclen, dstlen);\n\t}\n}\n\nchar *decode(EncodeFormat format, const char *src, size_t srclen, size_t &dstlen)\n{\n\tswitch (format)\n\t{\n\tcase ENCODE_BASE64:\n\tdefault:\n\t\treturn b64_decode(src, srclen, dstlen);\n\tcase ENCODE_HEX:\n\t\treturn (char *) hexToBytes(src, srclen, dstlen);\n\t}\n}\n\nstd::string hash(HashFunction::Function function, Data *input)\n{\n\treturn hash(function, (const char*) input->getData(), input->getSize());\n}\n\nstd::string hash(HashFunction::Function function, const char *input, uint64_t size)\n{\n\tHashFunction::Value output;\n\thash(function, input, size, output);\n\treturn std::string(output.data, output.size);\n}\n\nvoid hash(HashFunction::Function function, Data *input, HashFunction::Value &output)\n{\n\thash(function, (const char*) input->getData(), input->getSize(), output);\n}\n\nvoid hash(HashFunction::Function function, const char *input, uint64_t size, HashFunction::Value &output)\n{\n\tHashFunction *hashfunction = HashFunction::getHashFunction(function);\n\tif (hashfunction == nullptr)\n\t\tthrow love::Exception(\"Invalid hash function.\");\n\n\thashfunction->hash(function, input, size, output);\n}\n\nDataModule::DataModule()\n\t: Module(M_DATA, \"love.data\")\n{\n}\n\nDataModule::~DataModule()\n{\n}\n\nDataView *DataModule::newDataView(Data *data, size_t offset, size_t size)\n{\n\treturn new DataView(data, offset, size);\n}\n\nByteData *DataModule::newByteData(size_t size)\n{\n\treturn new ByteData(size);\n}\n\nByteData *DataModule::newByteData(const void *d, size_t size)\n{\n\treturn new ByteData(d, size);\n}\n\nByteData *DataModule::newByteData(void *d, size_t size, bool own)\n{\n\treturn new ByteData(d, size, own);\n}\n\nstatic StringMap<EncodeFormat, ENCODE_MAX_ENUM>::Entry encoderEntries[] =\n{\n\t{ \"base64\", ENCODE_BASE64 },\n\t{ \"hex\",    ENCODE_HEX    },\n};\n\nstatic StringMap<EncodeFormat, ENCODE_MAX_ENUM> encoders(encoderEntries, sizeof(encoderEntries));\n\nstatic StringMap<ContainerType, CONTAINER_MAX_ENUM>::Entry containerEntries[] =\n{\n\t{ \"data\",   CONTAINER_DATA   },\n\t{ \"string\", CONTAINER_STRING },\n};\n\nstatic StringMap<ContainerType, CONTAINER_MAX_ENUM> containers(containerEntries, sizeof(containerEntries));\n\nbool getConstant(const char *in, EncodeFormat &out)\n{\n\treturn encoders.find(in, out);\n}\n\nbool getConstant(EncodeFormat in, const char *&out)\n{\n\treturn encoders.find(in, out);\n}\n\nstd::vector<std::string> getConstants(EncodeFormat)\n{\n\treturn encoders.getNames();\n}\n\nbool getConstant(const char *in, ContainerType &out)\n{\n\treturn containers.find(in, out);\n}\n\nbool getConstant(ContainerType in, const char *&out)\n{\n\treturn containers.find(in, out);\n}\n\nstd::vector<std::string> getConstants(ContainerType)\n{\n\treturn containers.getNames();\n}\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/data/DataModule.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"CompressedData.h\"\n#include \"Compressor.h\"\n#include \"HashFunction.h\"\n#include \"DataView.h\"\n#include \"ByteData.h\"\n\n// LOVE\n#include \"common/Module.h\"\n#include \"common/int.h\"\n\nnamespace love\n{\nnamespace data\n{\n\nenum EncodeFormat\n{\n\tENCODE_BASE64,\n\tENCODE_HEX,\n\tENCODE_MAX_ENUM\n};\n\nenum ContainerType\n{\n\tCONTAINER_DATA,\n\tCONTAINER_STRING,\n\tCONTAINER_MAX_ENUM\n};\n\n/**\n * Compresses a block of memory using the given compression format.\n *\n * @param format The compression format to use.\n * @param rawbytes The data to compress.\n * @param rawsize The size in bytes of the data to compress.\n * @param level The amount of compression to apply (between 0 and 9.)\n *              A value of -1 indicates the default amount of compression.\n *              Specific formats may not use every level.\n * @return The newly compressed data.\n **/\nCompressedData *compress(Compressor::Format format, const char *rawbytes, size_t rawsize, int level = -1);\n\n/**\n * Decompresses existing compressed data into raw bytes.\n *\n * @param[in] data The compressed data to decompress.\n * @param[out] decompressedsize The size in bytes of the decompressed data.\n * @return The newly decompressed data (allocated with new[]).\n **/\nchar *decompress(CompressedData *data, size_t &decompressedsize);\n\n/**\n * Decompresses existing compressed data into raw bytes.\n *\n * @param[in] format The compression format the data is in.\n * @param[in] cbytes The compressed data to decompress.\n * @param[in] compressedsize The size in bytes of the compressed data.\n * @param[in,out] rawsize On input, the size in bytes of the original\n *               uncompressed data, or 0 if unknown. On return, the size in\n *               bytes of the newly decompressed data.\n * @return The newly decompressed data (allocated with new[]).\n **/\nchar *decompress(Compressor::Format format, const char *cbytes, size_t compressedsize, size_t &rawsize);\n\nchar *encode(EncodeFormat format, const char *src, size_t srclen, size_t &dstlen, size_t linelen = 0);\nchar *decode(EncodeFormat format, const char *src, size_t srclen, size_t &dstlen);\n\n/**\n * Hash the input, producing an set of bytes as output.\n *\n * @param[in] function The selected hash function.\n * @param[in] input The input data to hash.\n * @return An std::string of bytes, representing the result of the hash\n *         function.\n **/\nstd::string hash(HashFunction::Function function, Data *input);\nstd::string hash(HashFunction::Function function, const char *input, uint64_t size);\nvoid hash(HashFunction::Function function, Data *input, HashFunction::Value &output);\nvoid hash(HashFunction::Function function, const char *input, uint64_t size, HashFunction::Value &output);\n\n\nbool getConstant(const char *in, EncodeFormat &out);\nbool getConstant(EncodeFormat in, const char *&out);\nstd::vector<std::string> getConstants(EncodeFormat);\n\nbool getConstant(const char *in, ContainerType &out);\nbool getConstant(ContainerType in, const char *&out);\nstd::vector<std::string> getConstants(ContainerType);\n\n\nclass DataModule : public Module\n{\npublic:\n\n\tDataModule();\n\tvirtual ~DataModule();\n\n\tDataView *newDataView(Data *data, size_t offset, size_t size);\n\tByteData *newByteData(size_t size);\n\tByteData *newByteData(const void *d, size_t size);\n\tByteData *newByteData(void *d, size_t size, bool own);\n\n}; // DataModule\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/data/DataStream.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"DataStream.h\"\n#include \"common/Exception.h\"\n#include \"common/int.h\"\n#include \"common/Data.h\"\n\n#include <algorithm>\n\nnamespace love\n{\nnamespace data\n{\n\nlove::Type DataStream::type(\"DataStream\", &Stream::type);\n\nDataStream::DataStream(Data *data)\n\t: data(data)\n\t, memory((const uint8 *) data->getData())\n\t, writableMemory((uint8 *) data->getData()) // TODO: disallow writing sometimes?\n\t, offset(0)\n\t, size(data->getSize())\n{\n}\n\nDataStream::DataStream(const DataStream &other)\n\t: data(other.data)\n\t, memory(other.memory)\n\t, writableMemory(other.writableMemory)\n\t, offset(0)\n\t, size(other.size)\n{\n}\n\nDataStream::~DataStream()\n{\n}\n\nDataStream *DataStream::clone()\n{\n\treturn new DataStream(*this);\n}\n\nbool DataStream::isReadable() const\n{\n\treturn true;\n}\n\nbool DataStream::isWritable() const\n{\n\treturn writableMemory != nullptr;\n}\n\nbool DataStream::isSeekable() const\n{\n\treturn true;\n}\n\nint64 DataStream::read(void* data, int64 size)\n{\n\tif (size <= 0)\n\t\treturn 0;\n\n\tif ((int64) offset >= getSize())\n\t\treturn 0;\n\n\tint64 readsize = std::min<int64>(size, getSize() - offset);\n\n\tmemcpy(data, memory + offset, readsize);\n\n\toffset += readsize;\n\treturn readsize;\n}\n\nbool DataStream::write(const void* data, int64 size)\n{\n\tif (size <= 0 || writableMemory == nullptr)\n\t\treturn false;\n\n\tif ((int64) offset >= getSize())\n\t\treturn false;\n\n\tint64 writesize = std::min<int64>(size, getSize() - offset);\n\n\tmemcpy(writableMemory + offset, data, writesize);\n\n\toffset += writesize;\n\treturn true;\n}\n\nbool DataStream::flush()\n{\n\treturn true;\n}\n\nint64 DataStream::getSize()\n{\n\treturn size;\n}\n\nbool DataStream::seek(int64 pos, SeekOrigin origin)\n{\n\tif (origin == SEEKORIGIN_CURRENT)\n\t\tpos += offset;\n\telse if (origin == SEEKORIGIN_END)\n\t\tpos += size;\n\n\tif (pos < 0 || pos > (int64) size)\n\t\treturn false;\n\n\toffset = pos;\n\treturn true;\n}\n\nint64 DataStream::tell()\n{\n\treturn offset;\n}\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/data/DataStream.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"common/Stream.h\"\n\nnamespace love\n{\nnamespace data\n{\n\nclass DataStream : public love::Stream\n{\npublic:\n\n\tstatic love::Type type;\n\n\tDataStream(Data *data);\n\tvirtual ~DataStream();\n\n\t// Implements Stream.\n\tDataStream *clone() override;\n\n\tbool isReadable() const override;\n\tbool isWritable() const override;\n\tbool isSeekable() const override;\n\n\tint64 read(void* data, int64 size) override;\n\tbool write(const void* data, int64 size) override;\n\n\tbool flush() override;\n\n\tint64 getSize() override;\n\n\tbool seek(int64 pos, SeekOrigin origin = SEEKORIGIN_BEGIN) override;\n\tint64 tell() override;\n\nprivate:\n\n\tDataStream(const DataStream &other);\n\n\tStrongRef<Data> data;\n\tconst uint8 *memory;\n\tuint8 *writableMemory;\n\tsize_t offset;\n\tsize_t size;\n\n}; // DataStream\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/data/DataView.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"DataView.h\"\n#include \"common/Exception.h\"\n#include \"common/int.h\"\n\nnamespace love\n{\nnamespace data\n{\n\nlove::Type DataView::type(\"DataView\", &Data::type);\n\nDataView::DataView(Data *data, size_t offset, size_t size)\n\t: data(data)\n\t, offset(offset)\n\t, size(size)\n{\n\tif (offset >= data->getSize() || size > data->getSize() || offset > data->getSize() - size)\n\t\tthrow love::Exception(\"Offset and size of Data View must fit within the original Data's size.\");\n\n\tif (size == 0)\n\t\tthrow love::Exception(\"DataView size must be greater than 0.\");\n}\n\nDataView::DataView(const DataView &d)\n\t: data(d.data)\n\t, offset(d.offset)\n\t, size(d.size)\n{\n}\n\nDataView::~DataView()\n{\n}\n\nDataView *DataView::clone() const\n{\n\treturn new DataView(*this);\n}\n\nvoid *DataView::getData() const\n{\n\treturn (uint8 *) data->getData() + offset;\n}\n\nsize_t DataView::getSize() const\n{\n\treturn size;\n}\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/data/DataView.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"common/Data.h\"\n\nnamespace love\n{\nnamespace data\n{\n\n/**\n * Contains a reference to a subsection of an existing Data object.\n **/\nclass DataView : public love::Data\n{\npublic:\n\n\tstatic love::Type type;\n\n\tDataView(Data *data, size_t offset, size_t size);\n\tDataView(const DataView &d);\n\tvirtual ~DataView();\n\n\t// Implements Data.\n\tDataView *clone() const override;\n\tvoid *getData() const override;\n\tsize_t getSize() const override;\n\nprivate:\n\n\tStrongRef<Data> data;\n\tsize_t offset;\n\tsize_t size;\n\n}; // DataView\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/data/HashFunction.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"HashFunction.h\"\n#include \"common/Exception.h\"\n\n// FIXME: Probably trivial by having tole and tobe functions, which can be ifdeffed to being identity functions\n#ifdef LOVE_BIG_ENDIAN\n#\terror Hashing not yet implemented for big endian\n#endif\n\nnamespace love\n{\nnamespace data\n{\n\nnamespace\n{\nnamespace impl\n{\n\ninline uint32 leftrot(uint32 x, uint8 amount)\n{\n\treturn (x << amount) | (x >> (32 - amount));\n}\n\ninline uint32 rightrot(uint32 x, uint8 amount)\n{\n\treturn (x >> amount) | (x << (32 - amount));\n}\n\ninline uint64 rightrot(uint64 x, uint8 amount)\n{\n\treturn (x >> amount) | (x << (64 - amount));\n}\n\n// Extend the value of `a` to make it a multiple of `n`.\ninline uint64 extend_multiple(uint64 a, uint64 n)\n{\n\tuint64 r = a % n;\n\treturn r == 0 ? a : a + (n-r);\n}\n\n/**\n * The following implementation is based on the pseudocode provided by multiple\n * authors on wikipedia: https://en.wikipedia.org/wiki/MD5\n * The pseudocode is licensed under the CC-BY-SA license, but no authorship\n * information is present. I believe this note, and the zlib license of this\n * project satisfy the conditions of the license.\n **/\nclass MD5 : public HashFunction\n{\nprivate:\n\tstatic const uint8 shifts[64];\n\tstatic const uint32 constants[64];\n\npublic:\n\tbool isSupported(Function function) const override\n\t{\n\t\treturn function == FUNCTION_MD5;\n\t}\n\n\tvoid hash(Function function, const char *input, uint64 length, Value &output) const override\n\t{\n\t\tif (function != FUNCTION_MD5)\n\t\t\tthrow love::Exception(\"Hash function not supported by MD5 implementation\");\n\n\t\tuint32 a0 = 0x67452301;\n\t\tuint32 b0 = 0xefcdab89;\n\t\tuint32 c0 = 0x98badcfe;\n\t\tuint32 d0 = 0x10325476;\n\n\t\t// Compute final padded length, accounting for the appended bit (byte) and size\n\t\tuint64 paddedLength = extend_multiple(length + 1 + 8, 64);\n\n\t\tuint32 *padded = new uint32[paddedLength / 4];\n\t\tmemcpy(padded, input, length);\n\t\tmemset(((uint8*)padded) + length, 0, paddedLength - length);\n\t\t*(((uint8*)padded) + length) = 0x80; // append bit\n\n\t\t// Append length in bits\n\t\tuint64 bit_length = length * 8;\n\t\tmemcpy(((uint8*)padded) + paddedLength - 8, &bit_length, 8);\n\n\t\t// Process chunks\n\t\tfor (uint64 i = 0; i < paddedLength/4; i += 16)\n\t\t{\n\t\t\tuint32 *chunk = &padded[i];\n\n\t\t\tuint32 A = a0;\n\t\t\tuint32 B = b0;\n\t\t\tuint32 C = c0;\n\t\t\tuint32 D = d0;\n\t\t\tuint32 F;\n\t\t\tuint32 g;\n\n\t\t\tfor (int j = 0; j < 64; j++)\n\t\t\t{\n\t\t\t\tif (j < 16)\n\t\t\t\t{\n\t\t\t\t\tF = (B & C) | (~B & D);\n\t\t\t\t\tg = j;\n\t\t\t\t}\n\t\t\t\telse if (j < 32)\n\t\t\t\t{\n\t\t\t\t\tF = (D & B) | (~D & C);\n\t\t\t\t\tg = (5*j + 1) % 16;\n\t\t\t\t}\n\t\t\t\telse if (j < 48)\n\t\t\t\t{\n\t\t\t\t\tF = B ^ C ^ D;\n\t\t\t\t\tg = (3*j + 5) % 16;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tF = C ^ (B | ~D);\n\t\t\t\t\tg = (7*j) % 16;\n\t\t\t\t}\n\n\t\t\t\tuint32 temp = D;\n\t\t\t\tD = C;\n\t\t\t\tC = B;\n\t\t\t\tB += leftrot(A + F + constants[j] + chunk[g], shifts[j]);\n\t\t\t\tA = temp;\n\t\t\t}\n\n\t\t\ta0 += A;\n\t\t\tb0 += B;\n\t\t\tc0 += C;\n\t\t\td0 += D;\n\t\t}\n\n\t\tdelete[] padded;\n\n\t\tmemcpy(&output.data[ 0], &a0, 4);\n\t\tmemcpy(&output.data[ 4], &b0, 4);\n\t\tmemcpy(&output.data[ 8], &c0, 4);\n\t\tmemcpy(&output.data[12], &d0, 4);\n\t\toutput.size = 16;\n\t}\n} md5;\n\nconst uint8 MD5::shifts[64] = {\n\t7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,\n\t5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,\n\t4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,\n\t6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21,\n};\n\nconst uint32 MD5::constants[64] = {\n\t0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,\n\t0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,\n\t0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,\n\t0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,\n\t0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,\n\t0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,\n\t0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,\n\t0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,\n\t0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,\n\t0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,\n\t0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05,\n\t0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,\n\t0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,\n\t0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,\n\t0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,\n\t0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391,\n};\n\n/**\n * The following implementation was based on the text, not the code listings,\n * in RFC3174. I believe this means no copyright other than that of the L�VE\n * Development Team applies.\n **/\nclass SHA1 : public HashFunction\n{\npublic:\n\tbool isSupported(Function function) const override\n\t{\n\t\treturn function == FUNCTION_SHA1;\n\t}\n\n\tvoid hash(Function function, const char *input, uint64 length, Value &output) const override\n\t{\n\t\tif (function != FUNCTION_SHA1)\n\t\t\tthrow love::Exception(\"Hash function not supported by SHA1 implementation\");\n\n\t\tuint32 intermediate[5] = {\n\t\t\t0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0\n\t\t};\n\n\t\t// Compute final padded length, accounting for the appended bit (byte) and size\n\t\tuint64 paddedLength = extend_multiple(length + 1 + 8, 64);\n\n\t\tuint32 *padded = new uint32[paddedLength / 4];\n\t\tmemcpy(padded, input, length);\n\t\tmemset(((uint8*)padded) + length, 0, paddedLength - length);\n\t\t*(((uint8*)padded) + length) = 0x80; // append bit\n\n\t\t// Append length in bits (big endian)\n\t\tuint64 bit_length = length * 8;\n\t\tfor (int i = 0; i < 8; ++i)\n\t\t\t*(((uint8*)padded) + (paddedLength - 8 + i)) = (bit_length >> (56 - i * 8)) & 0xFF;\n\n\t\t// Allocate our extended words\n\t\tuint32 words[80];\n\n\t\tfor (uint64 i = 0; i < paddedLength/4; i += 16)\n\t\t{\n\t\t\tuint32 *chunk = &padded[i];\n\t\t\tfor (int j = 0; j < 16; j++)\n\t\t\t{\n\t\t\t\tchar *c = (char*) &words[j];\n\t\t\t\tc[0] = (chunk[j] >> 24) & 0xFF;\n\t\t\t\tc[1] = (chunk[j] >> 16) & 0xFF;\n\t\t\t\tc[2] = (chunk[j] >>  8) & 0xFF;\n\t\t\t\tc[3] = (chunk[j] >>  0) & 0xFF;\n\t\t\t}\n\t\t\tfor (int j = 16; j < 80; j++)\n\t\t\t\twords[j] = leftrot(words[j-3] ^ words[j-8] ^ words[j-14] ^ words[j-16], 1);\n\n\t\t\tuint32 A = intermediate[0];\n\t\t\tuint32 B = intermediate[1];\n\t\t\tuint32 C = intermediate[2];\n\t\t\tuint32 D = intermediate[3];\n\t\t\tuint32 E = intermediate[4];\n\n\t\t\tfor (int j = 0; j < 80; j++)\n\t\t\t{\n\t\t\t\tuint32 temp = leftrot(A, 5) + E + words[j];\n\n\t\t\t\tif (j < 20)\n\t\t\t\t\ttemp += 0x5A827999 + ((B & C) | (~B & D));\n\t\t\t\telse if (j < 40)\n\t\t\t\t\ttemp += 0x6ED9EBA1 + (B ^ C ^ D);\n\t\t\t\telse if (j < 60)\n\t\t\t\t\ttemp += 0x8F1BBCDC + ((B & C) | (B & D) | (C & D));\n\t\t\t\telse\n\t\t\t\t\ttemp += 0xCA62C1D6 + (B ^ C ^ D);\n\n\t\t\t\tE = D;\n\t\t\t\tD = C;\n\t\t\t\tC = leftrot(B, 30);\n\t\t\t\tB = A;\n\t\t\t\tA = temp;\n\t\t\t}\n\n\t\t\tintermediate[0] += A;\n\t\t\tintermediate[1] += B;\n\t\t\tintermediate[2] += C;\n\t\t\tintermediate[3] += D;\n\t\t\tintermediate[4] += E;\n\t\t}\n\n\t\tdelete[] padded;\n\n\t\tfor (int i = 0; i < 20; i += 4)\n\t\t{\n\t\t\toutput.data[i+0] = (intermediate[i/4] >> 24) & 0xFF;\n\t\t\toutput.data[i+1] = (intermediate[i/4] >> 16) & 0xFF;\n\t\t\toutput.data[i+2] = (intermediate[i/4] >>  8) & 0xFF;\n\t\t\toutput.data[i+3] = (intermediate[i/4] >>  0) & 0xFF;\n\t\t}\n\n\t\toutput.size = 20;\n\t}\n} sha1;\n\n/**\n * This implementation was based on the description in RFC-6234.\n **/\n// SHA-2: SHA-224 and SHA-256\nclass SHA256 : public HashFunction\n{\nprivate:\n\tstatic const uint32 initial224[8];\n\tstatic const uint32 initial256[8];\n\tstatic const uint32 constants[64];\n\npublic:\n\tbool isSupported(Function function) const override\n\t{\n\t\treturn function == FUNCTION_SHA224 || function == FUNCTION_SHA256;\n\t}\n\n\tvoid hash(Function function, const char *input, uint64 length, Value &output) const override\n\t{\n\t\tif (!isSupported(function))\n\t\t\tthrow love::Exception(\"Hash function not supported by SHA-224/SHA-256 implementation\");\n\n\t\t// Compute final padded length, accounting for the appended bit (byte) and size\n\t\tuint64 paddedLength = extend_multiple(length + 1 + 8, 64);\n\n\t\tuint32 *padded = new uint32[paddedLength / 4];\n\t\tmemcpy(padded, input, length);\n\t\tmemset(((uint8*)padded) + length, 0, paddedLength - length);\n\t\t*(((uint8*)padded) + length) = 0x80; // append bit\n\n\t\t// Append length in bits (big endian)\n\t\tuint64 bit_length = length * 8;\n\t\tfor (int i = 0; i < 8; ++i)\n\t\t\t*(((uint8*)padded) + (paddedLength - 8 + i)) = (bit_length >> (56 - i * 8)) & 0xFF;\n\n\t\tuint32 intermediate[8];\n\t\tif (function == FUNCTION_SHA224)\n\t\t\tmemcpy(intermediate, initial224, sizeof(intermediate));\n\t\telse\n\t\t\tmemcpy(intermediate, initial256, sizeof(intermediate));\n\n\t\t// Allocate our extended words\n\t\tuint32 words[64];\n\n\t\tfor (uint64 i = 0; i < paddedLength/4; i += 16)\n\t\t{\n\t\t\tuint32 *chunk = &padded[i];\n\t\t\tfor (int j = 0; j < 16; j++)\n\t\t\t{\n\t\t\t\tchar *c = (char*) &words[j];\n\t\t\t\tc[0] = (chunk[j] >> 24) & 0xFF;\n\t\t\t\tc[1] = (chunk[j] >> 16) & 0xFF;\n\t\t\t\tc[2] = (chunk[j] >>  8) & 0xFF;\n\t\t\t\tc[3] = (chunk[j] >>  0) & 0xFF;\n\t\t\t}\n\t\t\tfor (int j = 16; j < 64; j++)\n\t\t\t{\n\t\t\t\twords[j] = rightrot(words[j-2], 17) ^ rightrot(words[j-2], 19) ^ (words[j-2] >> 10);\n\t\t\t\twords[j] += rightrot(words[j-15], 7) ^ rightrot(words[j-15], 18) ^ (words[j-15] >> 3);\n\t\t\t\twords[j] += words[j-7] + words[j-16];\n\t\t\t}\n\n\t\t\tuint32 A = intermediate[0];\n\t\t\tuint32 B = intermediate[1];\n\t\t\tuint32 C = intermediate[2];\n\t\t\tuint32 D = intermediate[3];\n\t\t\tuint32 E = intermediate[4];\n\t\t\tuint32 F = intermediate[5];\n\t\t\tuint32 G = intermediate[6];\n\t\t\tuint32 H = intermediate[7];\n\n\t\t\tfor (int j = 0; j < 64; j++)\n\t\t\t{\n\t\t\t\tuint32 temp1 = H + constants[j] + words[j];\n\t\t\t\ttemp1 += rightrot(E, 6) ^ rightrot(E, 11) ^ rightrot(E, 25);\n\t\t\t\ttemp1 += (E & F) ^ (~E & G);\n\t\t\t\tuint32 temp2 = rightrot(A, 2) ^ rightrot(A, 13) ^ rightrot(A, 22);\n\t\t\t\ttemp2 += (A & B) ^ (A & C) ^ (B & C);\n\n\t\t\t\tH = G;\n\t\t\t\tG = F;\n\t\t\t\tF = E;\n\t\t\t\tE = D + temp1;\n\t\t\t\tD = C;\n\t\t\t\tC = B;\n\t\t\t\tB = A;\n\t\t\t\tA = temp1 + temp2;\n\t\t\t}\n\n\t\t\tintermediate[0] += A;\n\t\t\tintermediate[1] += B;\n\t\t\tintermediate[2] += C;\n\t\t\tintermediate[3] += D;\n\t\t\tintermediate[4] += E;\n\t\t\tintermediate[5] += F;\n\t\t\tintermediate[6] += G;\n\t\t\tintermediate[7] += H;\n\t\t}\n\n\t\tdelete[] padded;\n\n\t\tint hashlength = 32;\n\t\tif (function == FUNCTION_SHA224)\n\t\t\thashlength = 28;\n\n\t\tfor (int i = 0; i < hashlength; i += 4)\n\t\t{\n\t\t\toutput.data[i+0] = (intermediate[i/4] >> 24) & 0xFF;\n\t\t\toutput.data[i+1] = (intermediate[i/4] >> 16) & 0xFF;\n\t\t\toutput.data[i+2] = (intermediate[i/4] >>  8) & 0xFF;\n\t\t\toutput.data[i+3] = (intermediate[i/4] >>  0) & 0xFF;\n\t\t}\n\n\t\toutput.size = hashlength;\n\t}\n} sha256;\n\nconst uint32 SHA256::initial224[8] = {\n\t0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,\n\t0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n};\n\nconst uint32 SHA256::initial256[8] = {\n\t0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,\n\t0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n};\n\nconst uint32 SHA256::constants[64] = {\n\t0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,\n\t0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n\t0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n\t0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n\t0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\n\t0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n\t0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\n\t0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n\t0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n\t0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n\t0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,\n\t0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n\t0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,\n\t0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n\t0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n\t0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n};\n\n/**\n * This implementation was based on the description in RFC-6234.\n **/\n// SHA-2: SHA-384 and SHA-512\nclass SHA512 : public HashFunction\n{\nprivate:\n\tstatic const uint64 initial384[8];\n\tstatic const uint64 initial512[8];\n\tstatic const uint64 constants[80];\n\npublic:\n\tbool isSupported(Function function) const override\n\t{\n\t\treturn function == FUNCTION_SHA384 || function == FUNCTION_SHA512;\n\t}\n\n\tvoid hash(Function function, const char *input, uint64 length, Value &output) const override\n\t{\n\t\tif (!isSupported(function))\n\t\t\tthrow love::Exception(\"Hash function not supported by SHA-384/SHA-512 implementation\");\n\n\t\tuint64 intermediates[8];\n\t\tif (function == FUNCTION_SHA384)\n\t\t\tmemcpy(intermediates, initial384, sizeof(intermediates));\n\t\telse\n\t\t\tmemcpy(intermediates, initial512, sizeof(intermediates));\n\n\t\t// Compute final padded length, accounting for the appended bit (byte) and size\n\t\tuint64 paddedLength = extend_multiple(length + 1 + 16, 128);\n\n\t\tuint64 *padded = new uint64[paddedLength / 8];\n\t\tmemcpy(padded, input, length);\n\t\tmemset(((uint8*)padded) + length, 0, paddedLength - length);\n\t\t*(((uint8*)padded) + length) = 0x80; // append bit\n\n\t\t// Append length in bits (big endian), note we only write a 64-bit int, so\n\t\t// we have filled the first 8 bytes with zeroes\n\t\tuint64 bit_length = length * 8;\n\t\tfor (int i = 0; i < 8; ++i)\n\t\t\t*(((uint8*)padded) + (paddedLength - 8 + i)) = (bit_length >> (56 - i * 8)) & 0xFF;\n\n\t\t// Allocate our extended words\n\t\tuint64 words[80];\n\n\t\tfor (uint64 i = 0; i < paddedLength/8; i += 16)\n\t\t{\n\t\t\tuint64 *chunk = &padded[i];\n\t\t\tfor (int j = 0; j < 16; ++j)\n\t\t\t{\n\t\t\t\tchar *c = (char*) &words[j];\n\t\t\t\tc[0] = (chunk[j] >> 56) & 0xFF;\n\t\t\t\tc[1] = (chunk[j] >> 48) & 0xFF;\n\t\t\t\tc[2] = (chunk[j] >> 40) & 0xFF;\n\t\t\t\tc[3] = (chunk[j] >> 32) & 0xFF;\n\t\t\t\tc[4] = (chunk[j] >> 24) & 0xFF;\n\t\t\t\tc[5] = (chunk[j] >> 16) & 0xFF;\n\t\t\t\tc[6] = (chunk[j] >>  8) & 0xFF;\n\t\t\t\tc[7] = (chunk[j] >>  0) & 0xFF;\n\t\t\t}\n\t\t\tfor (int j = 16; j < 80; ++j)\n\t\t\t{\n\t\t\t\twords[j] = words[j-7] + words[j-16];\n\t\t\t\twords[j] += rightrot(words[j-2], 19) ^ rightrot(words[j-2], 61) ^ (words[j-2] >> 6);\n\t\t\t\twords[j] += rightrot(words[j-15], 1) ^ rightrot(words[j-15], 8) ^ (words[j-15] >> 7);\n\t\t\t}\n\n\t\t\tuint64 A = intermediates[0];\n\t\t\tuint64 B = intermediates[1];\n\t\t\tuint64 C = intermediates[2];\n\t\t\tuint64 D = intermediates[3];\n\t\t\tuint64 E = intermediates[4];\n\t\t\tuint64 F = intermediates[5];\n\t\t\tuint64 G = intermediates[6];\n\t\t\tuint64 H = intermediates[7];\n\n\t\t\tfor (int j = 0; j < 80; ++j)\n\t\t\t{\n\t\t\t\tuint64 temp1 = H + constants[j] + words[j];\n\t\t\t\ttemp1 += rightrot(E, 14) ^ rightrot(E, 18) ^ rightrot(E, 41);\n\t\t\t\ttemp1 += (E & F) ^ (~E & G);\n\t\t\t\tuint64 temp2 = rightrot(A, 28) ^ rightrot(A, 34) ^ rightrot(A, 39);\n\t\t\t\ttemp2 += (A & B) ^ (A & C) ^ (B & C);\n\t\t\t\tH = G;\n\t\t\t\tG = F;\n\t\t\t\tF = E;\n\t\t\t\tE = D + temp1;\n\t\t\t\tD = C;\n\t\t\t\tC = B;\n\t\t\t\tB = A;\n\t\t\t\tA = temp1 + temp2;\n\t\t\t}\n\n\t\t\tintermediates[0] += A;\n\t\t\tintermediates[1] += B;\n\t\t\tintermediates[2] += C;\n\t\t\tintermediates[3] += D;\n\t\t\tintermediates[4] += E;\n\t\t\tintermediates[5] += F;\n\t\t\tintermediates[6] += G;\n\t\t\tintermediates[7] += H;\n\t\t}\n\n\t\tdelete[] padded;\n\n\t\tint hashlength = 64;\n\t\tif (function == FUNCTION_SHA384)\n\t\t\thashlength = 48;\n\n\t\tfor (int i = 0; i < hashlength; i += 8)\n\t\t{\n\t\t\toutput.data[i+0] = (intermediates[i/8] >> 56) & 0xFF;\n\t\t\toutput.data[i+1] = (intermediates[i/8] >> 48) & 0xFF;\n\t\t\toutput.data[i+2] = (intermediates[i/8] >> 40) & 0xFF;\n\t\t\toutput.data[i+3] = (intermediates[i/8] >> 32) & 0xFF;\n\t\t\toutput.data[i+4] = (intermediates[i/8] >> 24) & 0xFF;\n\t\t\toutput.data[i+5] = (intermediates[i/8] >> 16) & 0xFF;\n\t\t\toutput.data[i+6] = (intermediates[i/8] >>  8) & 0xFF;\n\t\t\toutput.data[i+7] = (intermediates[i/8] >>  0) & 0xFF;\n\t\t}\n\n\t\toutput.size = hashlength;\n\t}\n} sha512;\n\nconst uint64 SHA512::initial384[8] = {\n\t0xcbbb9d5dc1059ed8, 0x629a292a367cd507, 0x9159015a3070dd17, 0x152fecd8f70e5939,\n\t0x67332667ffc00b31, 0x8eb44a8768581511, 0xdb0c2e0d64f98fa7, 0x47b5481dbefa4fa4,\n};\n\nconst uint64 SHA512::initial512[8] = {\n\t0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1,\n\t0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179,\n};\n\nconst uint64 SHA512::constants[80] = {\n\t0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc,\n\t0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118,\n\t0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2,\n\t0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694,\n\t0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65,\n\t0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5,\n\t0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4,\n\t0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70,\n\t0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df,\n\t0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b,\n\t0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30,\n\t0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8,\n\t0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8,\n\t0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3,\n\t0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec,\n\t0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b,\n\t0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178,\n\t0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b,\n\t0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c,\n\t0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817,\n};\n\n} // impl\n}\n\nHashFunction *HashFunction::getHashFunction(Function function)\n{\n\tswitch(function)\n\t{\n\tcase FUNCTION_MD5:\n\t\treturn &impl::md5;\n\tcase FUNCTION_SHA1:\n\t\treturn &impl::sha1;\n\tcase FUNCTION_SHA224:\n\tcase FUNCTION_SHA256:\n\t\treturn &impl::sha256;\n\tcase FUNCTION_SHA384:\n\tcase FUNCTION_SHA512:\n\t\treturn &impl::sha512;\n\tcase FUNCTION_MAX_ENUM:\n\t\treturn nullptr;\n\t// No default for compiler warnings\n\t}\n    return nullptr;\n}\n\nbool HashFunction::getConstant(const char *in, Function &out)\n{\n\treturn functionNames.find(in, out);\n}\n\nbool HashFunction::getConstant(const Function &in, const char *&out)\n{\n\treturn functionNames.find(in, out);\n}\nstd::vector<std::string> HashFunction::getConstants(Function)\n{\n\treturn functionNames.getNames();\n}\n\nStringMap<HashFunction::Function, HashFunction::FUNCTION_MAX_ENUM>::Entry HashFunction::functionEntries[] =\n{\n\t{\"md5\",  FUNCTION_MD5},\n\t{\"sha1\", FUNCTION_SHA1},\n\t{\"sha224\", FUNCTION_SHA224},\n\t{\"sha256\", FUNCTION_SHA256},\n\t{\"sha384\", FUNCTION_SHA384},\n\t{\"sha512\", FUNCTION_SHA512},\n};\n\nStringMap<HashFunction::Function, HashFunction::FUNCTION_MAX_ENUM> HashFunction::functionNames(HashFunction::functionEntries, sizeof(HashFunction::functionEntries));\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/data/HashFunction.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/Data.h\"\n#include \"common/StringMap.h\"\n#include \"common/int.h\"\n\nnamespace love\n{\nnamespace data\n{\n\nclass HashFunction\n{\npublic:\n\n\tenum Function\n\t{\n\t\tFUNCTION_MD5,\n\t\tFUNCTION_SHA1,\n\t\tFUNCTION_SHA224,\n\t\tFUNCTION_SHA256,\n\t\tFUNCTION_SHA384,\n\t\tFUNCTION_SHA512,\n\t\tFUNCTION_MAX_ENUM\n\t};\n\n\tstruct Value\n\t{\n\t\tchar data[64]; // Maximum possible size (SHA512).\n\t\tsize_t size;\n\t};\n\n\t/**\n\t * Get a HashFunction instance for the given function.\n\t *\n\t * @param[in] function The selected hash function.\n\t * @return An instance of HashFunction for the given function, or NULL if\n\t *         not available.\n\t **/\n\tstatic HashFunction *getHashFunction(Function function);\n\n\tvirtual ~HashFunction() {}\n\n\t/**\n\t * Hash the input, producing an set of bytes as output.\n\t *\n\t * @param[in] function The selected hash function.\n\t * @param[in] input The input data to hash.\n\t * @param[in] length The length of the input data.\n\t * @param[out] output The result of the hash function.\n\t **/\n\tvirtual void hash(Function function, const char *input, uint64 length, Value &output) const = 0;\n\n\t/**\n\t * @param[in] function The requested hash function.\n\t * @return Whether this HashFunction instance implements the given function.\n\t **/\n\tvirtual bool isSupported(Function function) const = 0;\n\n\tstatic bool getConstant(const char *in, Function &out);\n\tstatic bool getConstant(const Function &in, const char *&out);\n\tstatic std::vector<std::string> getConstants(Function);\n\nprotected:\n\n\tHashFunction() {}\n\nprivate:\n\n\tstatic StringMap<Function, FUNCTION_MAX_ENUM>::Entry functionEntries[];\n\tstatic StringMap<Function, FUNCTION_MAX_ENUM> functionNames;\n\n}; // HashFunction\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/data/wrap_ByteData.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_ByteData.h\"\n#include \"wrap_Data.h\"\n#include \"common/config.h\"\n\n#include <algorithm>\n\nnamespace love\n{\nnamespace data\n{\n\nByteData *luax_checkbytedata(lua_State *L, int idx)\n{\n\treturn luax_checktype<ByteData>(L, idx);\n}\n\nint w_ByteData_clone(lua_State *L)\n{\n\tByteData *t = luax_checkbytedata(L, 1);\n\tByteData *c = nullptr;\n\tluax_catchexcept(L, [&](){ c = t->clone(); });\n\tluax_pushtype(L, c);\n\tc->release();\n\treturn 1;\n}\n\nint w_ByteData_setString(lua_State *L)\n{\n\tData *t = luax_checkdata(L, 1);\n\tsize_t size = 0;\n\tconst char *str = luaL_checklstring(L, 2, &size);\n\tint64 offset = (int64)luaL_optnumber(L, 3, 0);\n\n\tsize = std::min(size, t->getSize());\n\n\tif (size == 0)\n\t\treturn 0;\n\n\tif (offset < 0 || offset + (int64) size > (int64) t->getSize())\n\t\treturn luaL_error(L, \"The given string offset and size don't fit within the Data's size.\");\n\n\tmemcpy((char *) t->getData() + (size_t) offset, str, size);\n\treturn 0;\n}\n\ntemplate <typename T>\nstatic int w_ByteData_setT(lua_State *L)\n{\n\tByteData *t = luax_checkbytedata(L, 1);\n\tint64 offset = (int64) luaL_checknumber(L, 2);\n\n\tbool istable = lua_type(L, 3) == LUA_TTABLE;\n\tint nargs = std::max(1, istable ? (int) luax_objlen(L, 3) : lua_gettop(L) - 2);\n\n\tif (offset < 0 || offset + sizeof(T) * nargs > t->getSize())\n\t\treturn luaL_error(L, \"The given offset and value parameters don't fit within the Data's size.\");\n\n\tauto data = (T *)((uint8 *) t->getData() + offset);\n\n\tif (istable)\n\t{\n\t\tfor (int i = 0; i < nargs; i++)\n\t\t{\n\t\t\tlua_rawgeti(L, 3, i + 1);\n\t\t\tdata[i] = (T) luaL_checknumber(L, -1);\n\t\t\tlua_pop(L, 1);\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (int i = 0; i < nargs; i++)\n\t\t\tdata[i] = (T) luaL_checknumber(L, 3 + i);\n\t}\n\n\treturn 0;\n}\n\nint w_ByteData_setFloat(lua_State *L)\n{\n\treturn w_ByteData_setT<float>(L);\n}\n\nint w_ByteData_setDouble(lua_State *L)\n{\n\treturn w_ByteData_setT<double>(L);\n}\n\nint w_ByteData_setInt8(lua_State *L)\n{\n\treturn w_ByteData_setT<int8>(L);\n}\n\nint w_ByteData_setUInt8(lua_State *L)\n{\n\treturn w_ByteData_setT<uint8>(L);\n}\n\nint w_ByteData_setInt16(lua_State *L)\n{\n\treturn w_ByteData_setT<int16>(L);\n}\n\nint w_ByteData_setUInt16(lua_State *L)\n{\n\treturn w_ByteData_setT<uint16>(L);\n}\n\nint w_ByteData_setInt32(lua_State *L)\n{\n\treturn w_ByteData_setT<int32>(L);\n}\n\nint w_ByteData_setUInt32(lua_State *L)\n{\n\treturn w_ByteData_setT<uint32>(L);\n}\n\nstatic const luaL_Reg w_ByteData_functions[] =\n{\n\t{ \"clone\", w_ByteData_clone },\n\t{ \"setString\", w_ByteData_setString },\n\t{ \"setFloat\", w_ByteData_setFloat },\n\t{ \"setDouble\", w_ByteData_setDouble },\n\t{ \"setInt8\", w_ByteData_setInt8 },\n\t{ \"setUInt8\", w_ByteData_setUInt8 },\n\t{ \"setInt16\", w_ByteData_setInt16 },\n\t{ \"setUInt16\", w_ByteData_setUInt16 },\n\t{ \"setInt32\", w_ByteData_setInt32 },\n\t{ \"setUInt32\", w_ByteData_setUInt32 },\n\t{ 0, 0 }\n};\n\nint luaopen_bytedata(lua_State *L)\n{\n\tluax_register_type(L, &ByteData::type, w_Data_functions, w_ByteData_functions, nullptr);\n\tlove::data::luax_rundatawrapper(L, ByteData::type);\n\treturn 0;\n}\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/data/wrap_ByteData.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"ByteData.h\"\n\nnamespace love\n{\nnamespace data\n{\n\nByteData *luax_checkbytedata(lua_State *L, int idx);\nint luaopen_bytedata(lua_State *L);\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/data/wrap_CompressedData.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"wrap_CompressedData.h\"\n#include \"wrap_Data.h\"\n\nnamespace love\n{\nnamespace data\n{\n\nCompressedData *luax_checkcompresseddata(lua_State *L, int idx)\n{\n\treturn luax_checktype<CompressedData>(L, idx);\n}\n\nint w_CompressedData_clone(lua_State *L)\n{\n\tCompressedData *t = luax_checkcompresseddata(L, 1), *c = nullptr;\n\tluax_catchexcept(L, [&](){ c = t->clone(); });\n\tluax_pushtype(L, c);\n\tc->release();\n\treturn 1;\n}\n\nint w_CompressedData_getFormat(lua_State *L)\n{\n\tCompressedData *t = luax_checkcompresseddata(L, 1);\n\n\tconst char *fname = nullptr;\n\tif (!Compressor::getConstant(t->getFormat(), fname))\n\t\treturn luax_enumerror(L, \"compressed data format\", Compressor::getConstants(Compressor::FORMAT_MAX_ENUM), fname);\n\n\tlua_pushstring(L, fname);\n\treturn 1;\n}\n\nstatic const luaL_Reg w_CompressedData_functions[] =\n{\n\t{ \"clone\", w_CompressedData_clone },\n\t{ \"getFormat\", w_CompressedData_getFormat },\n\t{ 0, 0 },\n};\n\n\nextern \"C\" int luaopen_compresseddata(lua_State *L)\n{\n\tint ret = luax_register_type(L, &CompressedData::type, w_Data_functions, w_CompressedData_functions, nullptr);\n\tlove::data::luax_rundatawrapper(L, CompressedData::type);\n\treturn ret;\n}\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/data/wrap_CompressedData.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"CompressedData.h\"\n\nnamespace love\n{\nnamespace data\n{\n\nCompressedData *luax_checkcompresseddata(lua_State *L, int idx);\nextern \"C\" int luaopen_compresseddata(lua_State *L);\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/data/wrap_Data.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_Data.h\"\n#include \"common/int.h\"\n#include \"thread/threads.h\"\n\n// Put the Lua code directly into a raw string literal.\nstatic const char data_lua[] =\n#include \"wrap_Data.lua\"\n;\n\nnamespace love\n{\nnamespace data\n{\n\nData *luax_checkdata(lua_State *L, int idx)\n{\n\treturn luax_checktype<Data>(L, idx);\n}\n\nint w_Data_getString(lua_State *L)\n{\n\tData *t = luax_checkdata(L, 1);\n\tint64 offset = (int64) luaL_optnumber(L, 2, 0);\n\n\tint64 size = lua_isnoneornil(L, 3)\n\t\t? ((int64) t->getSize() - offset)\n\t\t: (int64) luaL_checknumber(L, 3);\n\n\tif (size <= 0)\n\t\treturn luaL_error(L, \"Invalid size parameter (must be greater than 0)\");\n\n\tif (offset < 0 || offset + size > (int64) t->getSize())\n\t\treturn luaL_error(L, \"The given offset and size parameters don't fit within the Data's size.\");\n\n\tauto data = (const char *) t->getData() + offset;\n\n\tlua_pushlstring(L, data, size);\n\treturn 1;\n}\n\nint w_Data_getPointer(lua_State *L)\n{\n\tData *t = luax_checkdata(L, 1);\n\tlua_pushlightuserdata(L, t->getData());\n\treturn 1;\n}\n\n// Placeholder, overridden by the FFI code when the FFI is available.\nint w_Data_getFFIPointer(lua_State *L)\n{\n\tlua_pushnil(L);\n\treturn 1;\n}\n\nint w_Data_getSize(lua_State *L)\n{\n\tData *t = luax_checkdata(L, 1);\n\tlua_pushnumber(L, (lua_Number) t->getSize());\n\treturn 1;\n}\n\nint w_Data_performAtomic(lua_State *L)\n{\n\tData *t = luax_checkdata(L, 1);\n\tint err = 0;\n\n\t{\n\t\tlove::thread::Lock lock(t->getMutex());\n\t\t// call the function, passing any user-specified arguments.\n\t\terr = lua_pcall(L, lua_gettop(L) - 2, LUA_MULTRET, 0);\n\t}\n\n\t// Unfortunately, this eats the stack trace, too bad.\n\tif (err != 0)\n\t\treturn lua_error(L);\n\n\t// The function and everything after it in the stack are eaten by the pcall,\n\t// leaving only the Data object. Everything else is a return value.\n\treturn lua_gettop(L) - 1;\n}\n\ntemplate <typename T>\nstatic int w_Data_getT(lua_State* L)\n{\n\tData* t = luax_checkdata(L, 1);\n\tint64 offset = (int64)luaL_checknumber(L, 2);\n\tint count = (int)luaL_optinteger(L, 3, 1);\n\n\tif (count <= 0)\n\t\treturn luaL_error(L, \"Invalid count parameter (must be greater than 0)\");\n\n\tif (offset < 0 || offset + sizeof(T) * count > t->getSize())\n\t\treturn luaL_error(L, \"The given offset and count parameters don't fit within the Data's size.\");\n\n\tauto data = (const T*)((uint8*)t->getData() + offset);\n\n\tfor (int i = 0; i < count; i++)\n\t\tlua_pushnumber(L, (lua_Number)data[i]);\n\n\treturn count;\n}\n\nint w_Data_getFloat(lua_State* L)\n{\n\treturn w_Data_getT<float>(L);\n}\n\nint w_Data_getDouble(lua_State* L)\n{\n\treturn w_Data_getT<double>(L);\n}\n\nint w_Data_getInt8(lua_State* L)\n{\n\treturn w_Data_getT<int8>(L);\n}\n\nint w_Data_getUInt8(lua_State* L)\n{\n\treturn w_Data_getT<uint8>(L);\n}\n\nint w_Data_getInt16(lua_State* L)\n{\n\treturn w_Data_getT<int16>(L);\n}\n\nint w_Data_getUInt16(lua_State* L)\n{\n\treturn w_Data_getT<uint16>(L);\n}\n\nint w_Data_getInt32(lua_State* L)\n{\n\treturn w_Data_getT<int32>(L);\n}\n\nint w_Data_getUInt32(lua_State* L)\n{\n\treturn w_Data_getT<uint32>(L);\n}\n\n// C functions in a struct, necessary for the FFI versions of Data methods.\nstruct FFI_Data\n{\n\tvoid *(*getFFIPointer)(Proxy *p);\n};\n\nstatic FFI_Data ffifuncs =\n{\n\t[](Proxy *p) -> void * // getFFIPointer\n\t{\n\t\tauto data = luax_ffi_checktype<Data>(p);\n\t\treturn data != nullptr ? data->getData() : nullptr;\n\t}\n};\n\nconst luaL_Reg w_Data_functions[] =\n{\n\t{ \"getString\", w_Data_getString },\n\t{ \"getPointer\", w_Data_getPointer },\n\t{ \"getFFIPointer\", w_Data_getFFIPointer },\n\t{ \"getSize\", w_Data_getSize },\n\t{ \"performAtomic\", w_Data_performAtomic },\n\t{ \"getFloat\", w_Data_getFloat },\n\t{ \"getDouble\", w_Data_getDouble },\n\t{ \"getInt8\", w_Data_getInt8 },\n\t{ \"getUInt8\", w_Data_getUInt8 },\n\t{ \"getInt16\", w_Data_getInt16 },\n\t{ \"getUInt16\", w_Data_getUInt16 },\n\t{ \"getInt32\", w_Data_getInt32 },\n\t{ \"getUInt32\", w_Data_getUInt32 },\n\t{ 0, 0 }\n};\n\nvoid luax_rundatawrapper(lua_State *L, const love::Type &type)\n{\n\tluax_runwrapper(L, data_lua, sizeof(data_lua), \"Data.lua\", type, &ffifuncs);\n}\n\nint luaopen_data(lua_State *L)\n{\n\tint n = luax_register_type(L, &Data::type, w_Data_functions, nullptr);\n\tluax_rundatawrapper(L, Data::type);\n\treturn n;\n}\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/data/wrap_Data.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"common/Data.h\"\n\nnamespace love\n{\nnamespace data\n{\n\nvoid luax_rundatawrapper(lua_State *L, const love::Type &type);\nData *luax_checkdata(lua_State *L, int idx);\nint luaopen_data(lua_State *L);\nextern const luaL_Reg w_Data_functions[];\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/data/wrap_Data.lua",
    "content": "R\"luastring\"--(\n-- DO NOT REMOVE THE ABOVE LINE. It is used to load this file as a C++ string.\n-- There is a matching delimiter at the bottom of the file.\n\n--[[\nCopyright (c) 2006-2024 LOVE Development Team\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\nclaim that you wrote the original software. If you use this software\nin a product, an acknowledgment in the product documentation would be\nappreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be\nmisrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n--]]\n\nlocal Data_mt, ffifuncspointer_str = ...\nlocal Data = Data_mt.__index\n\nlocal type, error = type, error\n\nif type(jit) ~= \"table\" then return end\n\nlocal status, ffi = pcall(require, \"ffi\")\nif not status then return end\n\npcall(ffi.cdef, [[\ntypedef struct Proxy Proxy;\n\ntypedef struct FFI_Data\n{\n\tvoid *(*getFFIPointer)(Proxy *p);\n} FFI_Data;\n]])\n\nlocal ffifuncs = ffi.cast(\"const FFI_Data **\", ffifuncspointer_str)[0]\n\n-- Overwrite placeholder method with the FFI implementation.\n\nfunction Data:getFFIPointer()\n\t-- TODO: This should ideally be handled inside the C function\n\tif self == nil then error(\"bad argument #1 to 'getFFIPointer' (Data expected, got no value)\", 2) end\n\treturn ffifuncs.getFFIPointer(self)\nend\n\n-- DO NOT REMOVE THE NEXT LINE. It is used to load this file as a C++ string.\n--)luastring\"--\"\n"
  },
  {
    "path": "src/modules/data/wrap_DataModule.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"wrap_DataModule.h\"\n#include \"wrap_Data.h\"\n#include \"wrap_ByteData.h\"\n#include \"wrap_DataView.h\"\n#include \"wrap_CompressedData.h\"\n#include \"DataModule.h\"\n#include \"common/b64.h\"\n\n// Lua 5.3\n#include \"libraries/lua53/lstrlib.h\"\n\n// C\n#include <cmath>\n#include <iostream>\n#include <algorithm>\n#include <limits>\n\nnamespace love\n{\nnamespace data\n{\n\n#define instance() (Module::getInstance<DataModule>(Module::M_DATA))\n\nContainerType luax_checkcontainertype(lua_State *L, int idx)\n{\n\tconst char *str = luaL_checkstring(L, idx);\n\tContainerType ctype = CONTAINER_STRING;\n\tif (!getConstant(str, ctype))\n\t\tluax_enumerror(L, \"container type\", getConstants(ctype), str);\n\treturn ctype;\n}\n\nint w_newDataView(lua_State *L)\n{\n\tData *data = luax_checkdata(L, 1);\n\n\tlua_Integer offset = luaL_checkinteger(L, 2);\n\tlua_Integer size = luaL_optinteger(L, 3, data->getSize() - offset);\n\n\tif (offset < 0 || size < 0)\n\t\treturn luaL_error(L, \"DataView offset and size must not be negative.\");\n\n\tDataView *d;\n\tluax_catchexcept(L, [&]() { d = instance()->newDataView(data, (size_t) offset, (size_t) size); });\n\tluax_pushtype(L, d);\n\td->release();\n\n\treturn 1;\n}\n\nint w_newByteData(lua_State *L)\n{\n\tByteData *d = nullptr;\n\n\tif (luax_istype(L, 1, Data::type))\n\t{\n\t\tData *data = luax_checkdata(L, 1);\n\n\t\tif (data->getSize() > std::numeric_limits<lua_Integer>::max())\n\t\t\treturn luaL_error(L, \"Data's size is too large!\");\n\n\t\tlua_Integer offset = luaL_optinteger(L, 2, 0);\n\t\tif (offset < 0)\n\t\t\treturn luaL_error(L, \"Offset argument must not be negative.\");\n\n\t\tlua_Integer size = luaL_optinteger(L, 3, data->getSize() - offset);\n\t\tif (size <= 0)\n\t\t\treturn luaL_error(L, \"Size argument must be greater than zero.\");\n\t\telse if ((size_t)(offset + size) > data->getSize())\n\t\t\treturn luaL_error(L, \"Offset and size arguments must fit within the given Data's size.\");\n\n\t\tconst char *bytes = (const char *) data->getData() + offset;\n\t\tluax_catchexcept(L, [&]() { d = instance()->newByteData(bytes, (size_t) size); });\n\t}\n\telse if (lua_type(L, 1) == LUA_TSTRING)\n\t{\n\t\tsize_t size = 0;\n\t\tconst char *data = luaL_checklstring(L, 1, &size);\n\t\tluax_catchexcept(L, [&]() { d = instance()->newByteData(data, size); });\n\t}\n\telse\n\t{\n\t\tlua_Integer size = luaL_checkinteger(L, 1);\n\t\tif (size <= 0)\n\t\t\treturn luaL_error(L, \"Data size must be a positive number.\");\n\t\tluax_catchexcept(L, [&]() { d = instance()->newByteData((size_t) size); });\n\t}\n\n\tluax_pushtype(L, d);\n\td->release();\n\treturn 1;\n}\n\nint w_compress(lua_State *L)\n{\n\tContainerType ctype = luax_checkcontainertype(L, 1);\n\n\tconst char *fstr = luaL_checkstring(L, 2);\n\tCompressor::Format format = Compressor::FORMAT_LZ4;\n\n\tif (!Compressor::getConstant(fstr, format))\n\t\treturn luax_enumerror(L, \"compressed data format\", Compressor::getConstants(format), fstr);\n\n\tint level = (int) luaL_optinteger(L, 4, -1);\n\tsize_t rawsize = 0;\n\tconst char *rawbytes = nullptr;\n\n\tif (lua_isstring(L, 3))\n\t\trawbytes = luaL_checklstring(L, 3, &rawsize);\n\telse\n\t{\n\t\tData *rawdata = luax_checktype<Data>(L, 3);\n\t\trawsize = rawdata->getSize();\n\t\trawbytes = (const char *) rawdata->getData();\n\t}\n\n\tCompressedData *cdata = nullptr;\n\tluax_catchexcept(L, [&](){ cdata = compress(format, rawbytes, rawsize, level); });\n\n\tif (ctype == CONTAINER_DATA)\n\t\tluax_pushtype(L, cdata);\n\telse\n\t\tlua_pushlstring(L, (const char *) cdata->getData(), cdata->getSize());\n\n\tcdata->release();\n\treturn 1;\n}\n\nint w_decompress(lua_State *L)\n{\n\tContainerType ctype = luax_checkcontainertype(L, 1);\n\n\tchar *rawbytes = nullptr;\n\tsize_t rawsize = 0;\n\n\tif (luax_istype(L, 2, CompressedData::type))\n\t{\n\t\tCompressedData *data = luax_checkcompresseddata(L, 2);\n\t\trawsize = data->getDecompressedSize();\n\t\tluax_catchexcept(L, [&](){ rawbytes = decompress(data, rawsize); });\n\t}\n\telse\n\t{\n\t\tCompressor::Format format = Compressor::FORMAT_LZ4;\n\t\tconst char *fstr = luaL_checkstring(L, 2);\n\n\t\tif (!Compressor::getConstant(fstr, format))\n\t\t\treturn luax_enumerror(L, \"compressed data format\", Compressor::getConstants(format), fstr);\n\n\t\tsize_t compressedsize = 0;\n\t\tconst char *cbytes = nullptr;\n\n\t\tif (luax_istype(L, 3, Data::type))\n\t\t{\n\t\t\tData *data = luax_checktype<Data>(L, 3);\n\t\t\tcbytes = (const char *) data->getData();\n\t\t\tcompressedsize = data->getSize();\n\t\t}\n\t\telse\n\t\t\tcbytes = luaL_checklstring(L, 3, &compressedsize);\n\n\t\tluax_catchexcept(L, [&](){ rawbytes = decompress(format, cbytes, compressedsize, rawsize); });\n\t}\n\n\tif (ctype == CONTAINER_DATA)\n\t{\n\t\tByteData *data = nullptr;\n\t\tluax_catchexcept(L, [&]() { data = instance()->newByteData(rawbytes, rawsize, true); });\n\t\tluax_pushtype(L, Data::type, data);\n\t\tdata->release();\n\t}\n\telse\n\t{\n\t\tlua_pushlstring(L, rawbytes, rawsize);\n\t\tdelete[] rawbytes;\n\t}\n\n\treturn 1;\n}\n\nint w_encode(lua_State *L)\n{\n\tContainerType ctype = luax_checkcontainertype(L, 1);\n\n\tconst char *formatstr = luaL_checkstring(L, 2);\n\tEncodeFormat format;\n\tif (!getConstant(formatstr, format))\n\t\treturn luax_enumerror(L, \"encode format\", getConstants(format), formatstr);\n\n\tsize_t srclen = 0;\n\tconst char *src = nullptr;\n\n\tif (luax_istype(L, 3, Data::type))\n\t{\n\t\tData *data = luax_totype<Data>(L, 3);\n\t\tsrc = (const char *) data->getData();\n\t\tsrclen = data->getSize();\n\t}\n\telse\n\t\tsrc = luaL_checklstring(L, 3, &srclen);\n\n\tsize_t linelen = (size_t) luaL_optinteger(L, 4, 0);\n\n\tsize_t dstlen = 0;\n\tchar *dst = nullptr;\n\tluax_catchexcept(L, [&](){ dst = encode(format, src, srclen, dstlen, linelen); });\n\n\tif (ctype == CONTAINER_DATA)\n\t{\n\t\tByteData *data = nullptr;\n\t\tif (dst != nullptr)\n\t\t\tluax_catchexcept(L, [&]() { data = instance()->newByteData(dst, dstlen, true); });\n\t\telse\n\t\t\tluax_catchexcept(L, [&]() { data = instance()->newByteData(0); });\n\n\t\tluax_pushtype(L, Data::type, data);\n\t\tdata->release();\n\t}\n\telse\n\t{\n\t\tif (dst != nullptr)\n\t\t\tlua_pushlstring(L, dst, dstlen);\n\t\telse\n\t\t\tlua_pushstring(L, \"\");\n\n\t\tdelete[] dst;\n\t}\n\n\treturn 1;\n}\n\nint w_decode(lua_State *L)\n{\n\tContainerType ctype = luax_checkcontainertype(L, 1);\n\n\tconst char *formatstr = luaL_checkstring(L, 2);\n\tEncodeFormat format;\n\tif (!getConstant(formatstr, format))\n\t\treturn luax_enumerror(L, \"decode format\", getConstants(format), formatstr);\n\n\tsize_t srclen = 0;\n\tconst char *src = nullptr;\n\n\tif (luax_istype(L, 3, Data::type))\n\t{\n\t\tData *data = luax_totype<Data>(L, 3);\n\t\tsrc = (const char *) data->getData();\n\t\tsrclen = data->getSize();\n\t}\n\telse\n\t\tsrc = luaL_checklstring(L, 3, &srclen);\n\n\tsize_t dstlen = 0;\n\tchar *dst = nullptr;\n\tluax_catchexcept(L, [&](){ dst = decode(format, src, srclen, dstlen); });\n\n\tif (ctype == CONTAINER_DATA)\n\t{\n\t\tByteData *data = nullptr;\n\t\tif (dst != nullptr)\n\t\t\tluax_catchexcept(L, [&]() { data = instance()->newByteData(dst, dstlen, true); });\n\t\telse\n\t\t\tluax_catchexcept(L, [&]() { data = instance()->newByteData(0); });\n\n\t\tluax_pushtype(L, Data::type, data);\n\t\tdata->release();\n\t}\n\telse\n\t{\n\t\tif (dst != nullptr)\n\t\t\tlua_pushlstring(L, dst, dstlen);\n\t\telse\n\t\t\tlua_pushstring(L, \"\");\n\n\t\tdelete[] dst;\n\t}\n\n\treturn 1;\n}\n\nint w_hash(lua_State *L)\n{\n\tint narg = 0; // used to change the arg position when using the deprecated function variant\n\n\tContainerType ctype = CONTAINER_STRING;\n\tHashFunction::Function function;\n\n\tconst char *str = luaL_checkstring(L, 1);\n\tif (!getConstant(str, ctype))\n\t{\n\t\tif (HashFunction::getConstant(str, function))\n\t\t{ // check if the argument at 1 is a hash function; deprecated function variant\n\t\t\tluax_markdeprecated(L, 1, \"love.data.hash\", API_FUNCTION_VARIANT, DEPRECATED_REPLACED, \"variant with container return type parameter\");\n\t\t\tnarg = -1;\n\t\t}\n\t\telse\n\t\t\tluax_enumerror(L, \"container type\", getConstants(ctype), str);\n\t}\n\n\tconst char *fstr = luaL_checkstring(L, 2 + narg);\n\tif (!HashFunction::getConstant(fstr, function))\n\t\treturn luax_enumerror(L, \"hash function\", HashFunction::getConstants(function), fstr);\n\n\tHashFunction::Value hashvalue;\n\tif (lua_isstring(L, 3 + narg))\n\t{\n\t\tsize_t rawsize = 0;\n\t\tconst char *rawbytes = luaL_checklstring(L, 3 + narg, &rawsize);\n\t\tluax_catchexcept(L, [&](){ love::data::hash(function, rawbytes, rawsize, hashvalue); });\n\t}\n\telse\n\t{\n\t\tData *rawdata = luax_checktype<Data>(L, 3 + narg);\n\t\tluax_catchexcept(L, [&](){ love::data::hash(function, rawdata, hashvalue); });\n\t}\n\n\tif (ctype == CONTAINER_DATA)\n\t{\n\t\tData* d = nullptr;\n\t\tluax_catchexcept(L, [&]() { d = instance()->newByteData(hashvalue.size); });\n\t\tmemcpy(d->getData(), hashvalue.data, hashvalue.size);\n\n\t\tluax_pushtype(L, Data::type, d);\n\t\td->release();\n\t}\n\telse\n\t\tlua_pushlstring(L, hashvalue.data, hashvalue.size);\n\n\treturn 1;\n}\n\nint w_pack(lua_State *L)\n{\n\tif (luax_istype(L, 1, ByteData::type))\n\t{\n\t\tByteData *d = luax_checkbytedata(L, 1);\n\t\tsize_t offset = (size_t) luaL_checknumber(L, 2);\n\t\tconst char *fmt = luaL_checkstring(L, 3);\n\n\t\tluaL_Buffer_53 b;\n\t\tlua53_str_pack(L, fmt, 4, &b);\n\n\t\tif (offset + b.nelems > d->getSize())\n\t\t{\n\t\t\tlua53_cleanupbuffer(&b);\n\t\t\treturn luaL_error(L, \"The given byte offset and pack format parameters do not fit within the ByteData's size.\");\n\t\t}\n\n\t\tmemcpy((uint8 *) d->getData() + offset, b.ptr, b.nelems);\n\n\t\tlua53_cleanupbuffer(&b);\n\t\tluax_pushtype(L, Data::type, d);\n\t\treturn 1;\n\t}\n\n\tContainerType ctype = luax_checkcontainertype(L, 1);\n\tconst char *fmt = luaL_checkstring(L, 2);\n\tluaL_Buffer_53 b;\n\tlua53_str_pack(L, fmt, 3, &b);\n\n\tif (ctype == CONTAINER_DATA)\n\t{\n\t\tData *d = nullptr;\n\t\tluax_catchexcept(L, [&]() { d = instance()->newByteData(b.nelems); });\n\t\tmemcpy(d->getData(), b.ptr, d->getSize());\n\n\t\tlua53_cleanupbuffer(&b);\n\t\tluax_pushtype(L, Data::type, d);\n\t\td->release();\n\t}\n\telse\n\t\tlua53_pushresult(&b);\n\n\treturn 1;\n}\n\nint w_unpack(lua_State *L)\n{\n\tconst char *fmt = luaL_checkstring(L, 1);\n\n\tconst char *data = nullptr;\n\tsize_t datasize = 0;\n\n\tif (luax_istype(L, 2, Data::type))\n\t{\n\t\tData *d = luax_checkdata(L, 2);\n\t\tdata = (const char *) d->getData();\n\t\tdatasize = d->getSize();\n\t}\n\telse\n\t\tdata = luaL_checklstring(L, 2, &datasize);\n\n\treturn lua53_str_unpack(L, fmt, data, datasize, 2, 3);\n}\n\n// List of functions to wrap.\nstatic const luaL_Reg functions[] =\n{\n\t{ \"newDataView\", w_newDataView },\n\t{ \"newByteData\", w_newByteData },\n\t{ \"compress\", w_compress },\n\t{ \"decompress\", w_decompress },\n\t{ \"encode\", w_encode },\n\t{ \"decode\", w_decode },\n\t{ \"hash\", w_hash },\n\n\t{ \"pack\", w_pack },\n\t{ \"unpack\", w_unpack },\n\t{ \"getPackedSize\", lua53_str_packsize },\n\n\t{ 0, 0 }\n};\n\nstatic const lua_CFunction types[] =\n{\n\tluaopen_data,\n\tluaopen_bytedata,\n\tluaopen_dataview,\n\tluaopen_compresseddata,\n\tnullptr\n};\n\nextern \"C\" int luaopen_love_data(lua_State *L)\n{\n\tDataModule *instance = instance();\n\tif (instance == nullptr)\n\t{\n\t\tluax_catchexcept(L, [&](){ instance = new DataModule(); });\n\t}\n\telse\n\t\tinstance->retain();\n\n\tWrappedModule w;\n\tw.module = instance;\n\tw.name = \"data\";\n\tw.type = &Module::type;\n\tw.functions = functions;\n\tw.types = types;\n\n\tint n = luax_register_module(L, w);\n\treturn n;\n}\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/data/wrap_DataModule.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/runtime.h\"\n#include \"DataModule.h\"\n\nnamespace love\n{\nnamespace data\n{\n\nContainerType luax_checkcontainertype(lua_State *L, int idx);\nint w_compress(lua_State *L);\nint w_decompress(lua_State *L);\nextern \"C\" LOVE_EXPORT int luaopen_love_data(lua_State *L);\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/data/wrap_DataView.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_DataView.h\"\n#include \"wrap_Data.h\"\n\nnamespace love\n{\nnamespace data\n{\n\nDataView *luax_checkdataview(lua_State *L, int idx)\n{\n\treturn luax_checktype<DataView>(L, idx);\n}\n\nint w_DataView_clone(lua_State *L)\n{\n\tDataView *t = luax_checkdataview(L, 1);\n\tDataView *c = nullptr;\n\tluax_catchexcept(L, [&](){ c = t->clone(); });\n\tluax_pushtype(L, c);\n\tc->release();\n\treturn 1;\n}\n\nstatic const luaL_Reg w_DataView_functions[] =\n{\n\t{ \"clone\", w_DataView_clone },\n\t{ 0, 0 }\n};\n\nint luaopen_dataview(lua_State *L)\n{\n\tluax_register_type(L, &DataView::type, w_Data_functions, w_DataView_functions, nullptr);\n\tlove::data::luax_rundatawrapper(L, DataView::type);\n\treturn 0;\n}\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/data/wrap_DataView.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"DataView.h\"\n\nnamespace love\n{\nnamespace data\n{\n\nDataView *luax_checkdataview(lua_State *L, int idx);\nint luaopen_dataview(lua_State *L);\n\n} // data\n} // love\n"
  },
  {
    "path": "src/modules/event/Event.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Event.h\"\n\nusing love::thread::Mutex;\nusing love::thread::Lock;\n\nnamespace love\n{\nnamespace event\n{\n\nMessage::Message(const std::string &name, const std::vector<Variant> &vargs)\n\t: name(name)\n\t, args(vargs)\n{\n}\n\nMessage::~Message()\n{\n}\n\nEvent::Event(const char *name)\n\t: Module(M_EVENT, name)\n\t, modalDrawData()\n\t, defaultModalDrawData()\n{\n}\n\nEvent::~Event()\n{\n\tif (modalDrawData.cleanup != nullptr)\n\t\tmodalDrawData.cleanup(modalDrawData.context);\n\n\tif (defaultModalDrawData.cleanup != nullptr)\n\t\tdefaultModalDrawData.cleanup(defaultModalDrawData.context);\n}\n\nvoid Event::push(Message *msg)\n{\n\tpush(msg, false);\n}\n\nvoid Event::push(Message *msg, bool pushFront)\n{\n\tLock lock(mutex);\n\tmsg->retain();\n\tif (pushFront)\n\t\tqueue.push_front(msg);\n\telse\n\t\tqueue.push_back(msg);\n}\n\nbool Event::poll(Message *&msg)\n{\n\tLock lock(mutex);\n\tif (queue.empty())\n\t\treturn false;\n\tmsg = queue.front();\n\tqueue.pop_front();\n\treturn true;\n}\n\nvoid Event::clear()\n{\n\tLock lock(mutex);\n\twhile (!queue.empty())\n\t{\n\t\tqueue.front()->release();\n\t\tqueue.pop_front();\n\t}\n}\n\nvoid Event::setModalDrawData(const ModalDrawData &data)\n{\n\tif (modalDrawData.cleanup != nullptr)\n\t\tmodalDrawData.cleanup(modalDrawData.context);\n\n\tmodalDrawData = data;\n}\n\nvoid Event::setDefaultModalDrawData(const ModalDrawData &data)\n{\n\tif (defaultModalDrawData.cleanup != nullptr)\n\t\tdefaultModalDrawData.cleanup(defaultModalDrawData.context);\n\n\tdefaultModalDrawData = data;\n}\n\nvoid Event::modalDraw()\n{\n\t// Skip the draw if a previous one generated an unprocessed exception.\n\tif (!deferredExceptionMessage.empty())\n\t\treturn;\n\n\t// Also skip the draw if a previous one generated a return value that\n\t// needs to be passed down as a quit event.\n\tif (deferredReturnValues[0].getType() != Variant::NIL)\n\t\treturn;\n\n\ttry\n\t{\n\t\tif (modalDrawData.draw != nullptr)\n\t\t\tmodalDrawData.draw(modalDrawData.context, &deferredReturnValues[0], &deferredReturnValues[1]);\n\t\telse if (defaultModalDrawData.draw != nullptr)\n\t\t\tdefaultModalDrawData.draw(defaultModalDrawData.context, &deferredReturnValues[0], &deferredReturnValues[1]);\n\t}\n\tcatch (std::exception &e)\n\t{\n\t\tdeferredExceptionMessage = e.what();\n\t}\n}\n\n} // event\n} // love\n"
  },
  {
    "path": "src/modules/event/Event.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_EVENT_EVENT_H\n#define LOVE_EVENT_EVENT_H\n\n// LOVE\n#include \"common/Module.h\"\n#include \"common/StringMap.h\"\n#include \"common/Variant.h\"\n#include \"keyboard/Keyboard.h\"\n#include \"mouse/Mouse.h\"\n#include \"joystick/Joystick.h\"\n#include \"thread/threads.h\"\n\n// C++\n#include <deque>\n#include <vector>\n\nnamespace love\n{\nnamespace event\n{\n\nclass Message : public Object\n{\npublic:\n\n\tMessage(const std::string &name, const std::vector<Variant> &vargs = {});\n\t~Message();\n\n\tconst std::string name;\n\tconst std::vector<Variant> args;\n\n}; // Message\n\nclass Event : public Module\n{\npublic:\n\n\ttypedef void (*ModalDrawCallback)(void *context, Variant *returnValue0, Variant *returnValue1);\n\ttypedef void (*ModalCleanupCallback)(void *context);\n\n\tstruct ModalDrawData\n\t{\n\t\tModalDrawCallback draw;\n\t\tModalCleanupCallback cleanup;\n\t\tvoid *context;\n\t};\n\n\tvirtual ~Event();\n\n\tvoid push(Message *msg);\n\tbool poll(Message *&msg);\n\tvirtual void clear();\n\n\tvirtual void pump(float waitTimeout = 0.0f) = 0;\n\tvirtual Message *wait() = 0;\n\n\tvoid setModalDrawData(const ModalDrawData &data);\n\tconst ModalDrawData &getModalDrawData() const { return modalDrawData; }\n\n\tvoid setDefaultModalDrawData(const ModalDrawData &data);\n\n\tvoid modalDraw();\n\nprotected:\n\n\tEvent(const char *name);\n\n\tvoid push(Message *msg, bool pushFront);\n\n\tModalDrawData modalDrawData;\n\tModalDrawData defaultModalDrawData;\n\tstd::string deferredExceptionMessage;\n\tVariant deferredReturnValues[2];\n\n\tlove::thread::MutexRef mutex;\n\tstd::deque<Message *> queue;\n\n}; // Event\n\n} // event\n} // love\n\n#endif // LOVE_EVENT_EVENT_H\n"
  },
  {
    "path": "src/modules/event/sdl/Event.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Event.h\"\n\n#include \"common/int.h\"\n#include \"filesystem/Filesystem.h\"\n#include \"keyboard/sdl/Keyboard.h\"\n#include \"joystick/JoystickModule.h\"\n#include \"touch/sdl/Touch.h\"\n#include \"graphics/Graphics.h\"\n#include \"window/Window.h\"\n#include \"common/Exception.h\"\n#include \"audio/Audio.h\"\n#include \"common/config.h\"\n#include \"timer/Timer.h\"\n#include \"sensor/sdl/Sensor.h\"\n\n#include <cmath>\n\n#include \"joystick/sdl/Joystick.h\"\n#include \"window/sdl/Window.h\"\n\nnamespace love\n{\nnamespace event\n{\nnamespace sdl\n{\n\n// SDL reports mouse coordinates in the window coordinate system in OS X, but\n// we want them in pixel coordinates (may be different with high-DPI enabled.)\nstatic void windowToDPICoords(love::window::Window *window, double *x, double *y)\n{\n\tif (window)\n\t\twindow->windowToDPICoords(x, y);\n}\n\nstatic void clampToWindow(love::window::Window *window, double *x, double *y)\n{\n\tif (window)\n\t\twindow->clampPositionInWindow(x, y);\n}\n\nstatic void normalizedToDPICoords(love::window::Window *window, double *x, double *y)\n{\n\tdouble w = 1.0, h = 1.0;\n\n\tif (window)\n\t{\n\t\tw = window->getWidth();\n\t\th = window->getHeight();\n\t\twindow->windowToDPICoords(&w, &h);\n\t}\n\n\tif (x)\n\t\t*x = ((*x) * w);\n\tif (y)\n\t\t*y = ((*y) * h);\n}\n\n// SDL's event watch callbacks trigger when the event is actually posted inside\n// SDL, unlike with SDL_PollEvents. This is useful for some events which require\n// handling inside the function which triggered them on some backends.\n// Note: this may run on non-main threads on some platforms (Android?)\nstatic bool SDLCALL watchAppEvents(void *udata, SDL_Event *event)\n{\n\tauto eventModule = (Event *)udata;\n\n\tswitch (event->type)\n\t{\n\tcase SDL_EVENT_DID_ENTER_BACKGROUND:\n\tcase SDL_EVENT_WILL_ENTER_FOREGROUND:\n\t\t// On iOS, calling any OpenGL ES function after the function which triggers\n\t\t// SDL_APP_DIDENTERBACKGROUND is called will kill the app, so we handle it\n\t\t// with an event watch callback, which will be called inside that function.\n\t\t{\n\t\t\tauto gfx = Module::getInstance<graphics::Graphics>(Module::M_GRAPHICS);\n\t\t\tif (gfx && SDL_IsMainThread())\n\t\t\t\tgfx->setActive(event->type == SDL_EVENT_WILL_ENTER_FOREGROUND);\n\t\t}\n\t\tbreak;\n\tcase SDL_EVENT_WINDOW_EXPOSED:\n\t\t// Only redraw during live-resize events (data1 is 1 in that situation).\n\t\tif (event->window.data1 == 1 && eventModule != nullptr && SDL_IsMainThread() && eventModule->allowModalDraws())\n\t\t\teventModule->modalDraw();\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn true;\n}\n\nEvent::Event()\n\t: love::event::Event(\"love.event.sdl\")\n{\n\tif (!SDL_InitSubSystem(SDL_INIT_EVENTS))\n\t\tthrow love::Exception(\"Could not initialize SDL events subsystem (%s)\", SDL_GetError());\n\n\tSDL_AddEventWatch(watchAppEvents, this);\n}\n\nEvent::~Event()\n{\n\tSDL_RemoveEventWatch(watchAppEvents, this);\n\tSDL_QuitSubSystem(SDL_INIT_EVENTS);\n}\n\nvoid Event::pump(float waitTimeout)\n{\n\texceptionIfInRenderPass(\"love.event.pump\");\n\n\tbool shouldPoll = false;\n\n\tif (insideEventPump)\n\t{\n\t\t// Don't pump if we're inside the event pump already, but do allow\n\t\t// polling what's in the SDL queue.\n\t\tshouldPoll = true;\n\t}\n\telse\n\t{\n\t\tint waitTimeoutMS = 0;\n\t\tif (std::isinf(waitTimeout) || waitTimeout < 0.0f)\n\t\t\twaitTimeoutMS = -1; // Wait forever.\n\t\telse if (waitTimeout > 0.0f)\n\t\t\twaitTimeoutMS = (int)std::min<int64>(LOVE_INT32_MAX, 1000LL * waitTimeout);\n\n\t\t// Wait for the first event, if requested. WaitEvent also calls PumpEvents.\n\t\tSDL_Event e = {};\n\t\tinsideEventPump = true;\n\t\tbool success = false;\n\t\ttry\n\t\t{\n\t\t\tsuccess = SDL_WaitEventTimeout(&e, waitTimeoutMS);\n\t\t}\n\t\tcatch (std::exception &)\n\t\t{\n\t\t\tinsideEventPump = false;\n\t\t\tthrow;\n\t\t}\n\t\tinsideEventPump = false;\n\n\t\tif (success)\n\t\t{\n\t\t\tStrongRef<Message> msg(convert(e), Acquire::NORETAIN);\n\t\t\tif (msg)\n\t\t\t\tpush(msg);\n\n\t\t\t// Fetch any extra events that came in during WaitEvent.\n\t\t\tshouldPoll = true;\n\t\t}\n\n\t\t// For exceptions generated inside a modal draw callback, propagate them\n\t\t// outside of OS event processing instead of inside.\n\t\tif (!deferredExceptionMessage.empty())\n\t\t{\n\t\t\tstd::string exceptionstr = deferredExceptionMessage;\n\t\t\tdeferredExceptionMessage.clear();\n\t\t\tdeferredReturnValues[0] = Variant();\n\t\t\tdeferredReturnValues[1] = Variant();\n\t\t\tthrow love::Exception(\"%s\", exceptionstr.c_str());\n\t\t}\n\n\t\tif (deferredReturnValues[0].getType() != Variant::NIL)\n\t\t{\n\t\t\t// Third arg being true will tell love.run to skip the love.quit callback,\n\t\t\t// since the original modal draw function already processed that.\n\t\t\tstd::vector<Variant> args = {deferredReturnValues[0], deferredReturnValues[1], Variant(true)};\n\n\t\t\tStrongRef<Message> msg(new Message(\"quit\", args), Acquire::NORETAIN);\n\n\t\t\t// Push to the front of queue so it's dealt with before any other event.\n\t\t\tpush(msg, true);\n\n\t\t\tdeferredReturnValues[0] = Variant();\n\t\t\tdeferredReturnValues[1] = Variant();\n\t\t}\n\t}\n\n\tif (shouldPoll)\n\t{\n\t\tSDL_Event e;\n\t\twhile (SDL_PeepEvents(&e, 1, SDL_GETEVENT, SDL_EVENT_FIRST, SDL_EVENT_LAST) > 0)\n\t\t{\n\t\t\tStrongRef<Message> msg(convert(e), Acquire::NORETAIN);\n\t\t\tif (msg)\n\t\t\t\tpush(msg);\n\t\t}\n\t}\n}\n\nMessage *Event::wait()\n{\n\texceptionIfInRenderPass(\"love.event.wait\");\n\n\tSDL_Event e;\n\n\tif (!SDL_WaitEvent(&e))\n\t\treturn nullptr;\n\n\treturn convert(e);\n}\n\nvoid Event::clear()\n{\n\texceptionIfInRenderPass(\"love.event.clear\");\n\n\tSDL_Event e;\n\n\twhile (SDL_PollEvent(&e))\n\t{\n\t\t// Do nothing with 'e' ...\n\t}\n\n\tlove::event::Event::clear();\n}\n\nbool Event::allowModalDraws() const\n{\n\treturn insideEventPump;\n}\n\nvoid Event::exceptionIfInRenderPass(const char *name)\n{\n\t// Some core OS graphics functionality (e.g. swap buffers on some platforms)\n\t// happens inside SDL_PumpEvents - which is called by SDL_PollEvent and\n\t// friends. It's probably a bad idea to call those functions while a RT\n\t// is active.\n\tauto gfx = Module::getInstance<graphics::Graphics>(Module::M_GRAPHICS);\n\tif (gfx != nullptr && gfx->isRenderTargetActive())\n\t\tthrow love::Exception(\"%s cannot be called while a render target is active in love.graphics.\", name);\n}\n\nMessage *Event::convert(const SDL_Event &e)\n{\n\tMessage *msg = nullptr;\n\n\tstd::vector<Variant> vargs;\n\tvargs.reserve(4);\n\n\tlove::filesystem::Filesystem *filesystem = nullptr;\n\tlove::sensor::Sensor *sensorInstance = nullptr;\n\tlove::window::Window *win = Module::getInstance<window::Window>(Module::M_WINDOW);\n\n\tlove::keyboard::Keyboard::Key key = love::keyboard::Keyboard::KEY_UNKNOWN;\n\tlove::keyboard::Keyboard::Scancode scancode = love::keyboard::Keyboard::SCANCODE_UNKNOWN;\n\n\tconst char *txt;\n\tconst char *txt2;\n\n\tlove::touch::sdl::Touch *touchmodule = nullptr;\n\tlove::touch::Touch::TouchInfo touchinfo = {};\n\n\tif (win)\n\t{\n\t\t// Dubious cast, but it's not like having an SDL event backend\n\t\t// with a non-SDL window backend will be a thing.\n\t\tauto sdlwin = dynamic_cast<love::window::sdl::Window *>(win);\n\t\tif (sdlwin != nullptr)\n\t\t\tsdlwin->handleSDLEvent(e);\n\t}\n\n\tswitch (e.type)\n\t{\n\tcase SDL_EVENT_KEY_DOWN:\n\t\tif (e.key.repeat)\n\t\t{\n\t\t\tauto kb = Module::getInstance<love::keyboard::Keyboard>(Module::M_KEYBOARD);\n\t\t\tif (kb && !kb->hasKeyRepeat())\n\t\t\t\tbreak;\n\t\t}\n\n\t\tlove::keyboard::sdl::Keyboard::getConstant(e.key.key, key);\n\t\tif (!love::keyboard::Keyboard::getConstant(key, txt))\n\t\t\ttxt = \"unknown\";\n\n\t\tlove::keyboard::sdl::Keyboard::getConstant(e.key.scancode, scancode);\n\t\tif (!love::keyboard::Keyboard::getConstant(scancode, txt2))\n\t\t\ttxt2 = \"unknown\";\n\n\t\tvargs.emplace_back(txt, strlen(txt));\n\t\tvargs.emplace_back(txt2, strlen(txt2));\n\t\tvargs.emplace_back(e.key.repeat != 0);\n\t\tmsg = new Message(\"keypressed\", vargs);\n\t\tbreak;\n\tcase SDL_EVENT_KEY_UP:\n\t\tlove::keyboard::sdl::Keyboard::getConstant(e.key.key, key);\n\t\tif (!love::keyboard::Keyboard::getConstant(key, txt))\n\t\t\ttxt = \"unknown\";\n\n\t\tlove::keyboard::sdl::Keyboard::getConstant(e.key.scancode, scancode);\n\t\tif (!love::keyboard::Keyboard::getConstant(scancode, txt2))\n\t\t\ttxt2 = \"unknown\";\n\n\t\tvargs.emplace_back(txt, strlen(txt));\n\t\tvargs.emplace_back(txt2, strlen(txt2));\n\t\tmsg = new Message(\"keyreleased\", vargs);\n\t\tbreak;\n\tcase SDL_EVENT_TEXT_INPUT:\n\t\ttxt = e.text.text;\n\t\tvargs.emplace_back(txt, strlen(txt));\n\t\tmsg = new Message(\"textinput\", vargs);\n\t\tbreak;\n\tcase SDL_EVENT_TEXT_EDITING:\n\t\ttxt = e.edit.text;\n\t\tvargs.emplace_back(txt, strlen(txt));\n\t\tvargs.emplace_back((double) e.edit.start);\n\t\tvargs.emplace_back((double) e.edit.length);\n\t\tmsg = new Message(\"textedited\", vargs);\n\t\tbreak;\n\tcase SDL_EVENT_MOUSE_MOTION:\n\t\t{\n\t\t\tdouble x = (double) e.motion.x;\n\t\t\tdouble y = (double) e.motion.y;\n\t\t\tdouble xrel = (double) e.motion.xrel;\n\t\t\tdouble yrel = (double) e.motion.yrel;\n\n\t\t\t// SDL reports mouse coordinates outside the window bounds when click-and-\n\t\t\t// dragging. For compatibility we clamp instead since user code may not be\n\t\t\t// able to handle out-of-bounds coordinates. SDL has a hint to turn off\n\t\t\t// auto capture, but it doesn't report the mouse's position at the edge of\n\t\t\t// the window if the mouse moves fast enough when it's off.\n\t\t\tclampToWindow(win, &x, &y);\n\t\t\twindowToDPICoords(win, &x, &y);\n\t\t\twindowToDPICoords(win, &xrel, &yrel);\n\n\t\t\tvargs.emplace_back(x);\n\t\t\tvargs.emplace_back(y);\n\t\t\tvargs.emplace_back(xrel);\n\t\t\tvargs.emplace_back(yrel);\n\t\t\tvargs.emplace_back(e.motion.which == SDL_TOUCH_MOUSEID);\n\t\t\tmsg = new Message(\"mousemoved\", vargs);\n\t\t}\n\t\tbreak;\n\tcase SDL_EVENT_MOUSE_BUTTON_DOWN:\n\tcase SDL_EVENT_MOUSE_BUTTON_UP:\n\t\t{\n\t\t\t// SDL uses button 3 for the right mouse button, but we use button 2\n\t\t\tint button = e.button.button;\n\t\t\tswitch (button)\n\t\t\t{\n\t\t\tcase SDL_BUTTON_RIGHT:\n\t\t\t\tbutton = 2;\n\t\t\t\tbreak;\n\t\t\tcase SDL_BUTTON_MIDDLE:\n\t\t\t\tbutton = 3;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdouble px = (double) e.button.x;\n\t\t\tdouble py = (double) e.button.y;\n\n\t\t\tclampToWindow(win, &px, &py);\n\t\t\twindowToDPICoords(win, &px, &py);\n\n\t\t\tvargs.emplace_back(px);\n\t\t\tvargs.emplace_back(py);\n\t\t\tvargs.emplace_back((double) button);\n\t\t\tvargs.emplace_back(e.button.which == SDL_TOUCH_MOUSEID);\n\t\t\tvargs.emplace_back((double) e.button.clicks);\n\n\t\t\tbool down = e.type == SDL_EVENT_MOUSE_BUTTON_DOWN;\n\t\t\tmsg = new Message(down ? \"mousepressed\" : \"mousereleased\", vargs);\n\t\t}\n\t\tbreak;\n\tcase SDL_EVENT_MOUSE_WHEEL:\n\t\tvargs.emplace_back((double) e.wheel.x);\n\t\tvargs.emplace_back((double) e.wheel.y);\n\n\t\ttxt = e.wheel.direction == SDL_MOUSEWHEEL_FLIPPED ? \"flipped\" : \"standard\";\n\t\tvargs.emplace_back(txt, strlen(txt));\n\n\t\tmsg = new Message(\"wheelmoved\", vargs);\n\t\tbreak;\n\tcase SDL_EVENT_FINGER_DOWN:\n\tcase SDL_EVENT_FINGER_UP:\n\tcase SDL_EVENT_FINGER_MOTION:\n\t\ttouchinfo.id = (int64)e.tfinger.fingerID;\n\t\ttouchinfo.x = e.tfinger.x;\n\t\ttouchinfo.y = e.tfinger.y;\n\t\ttouchinfo.dx = e.tfinger.dx;\n\t\ttouchinfo.dy = e.tfinger.dy;\n\t\ttouchinfo.pressure = e.tfinger.pressure;\n\t\ttouchinfo.deviceType = love::touch::sdl::Touch::getDeviceType(SDL_GetTouchDeviceType(e.tfinger.touchID));\n\t\ttouchinfo.mouse = e.tfinger.touchID == SDL_MOUSE_TOUCHID;\n\n\t\t// SDL's coords are normalized to [0, 1], but we want screen coords for direct touches.\n\t\tif (touchinfo.deviceType == love::touch::Touch::DEVICE_TOUCHSCREEN)\n\t\t{\n\t\t\tnormalizedToDPICoords(win, &touchinfo.x, &touchinfo.y);\n\t\t\tnormalizedToDPICoords(win, &touchinfo.dx, &touchinfo.dy);\n\t\t}\n\n\t\t// We need to update the love.touch.sdl internal state from here.\n\t\ttouchmodule = (touch::sdl::Touch *) Module::getInstance(\"love.touch.sdl\");\n\t\tif (touchmodule)\n\t\t\ttouchmodule->onEvent(e.type, touchinfo);\n\n\t\tif (!love::touch::Touch::getConstant(touchinfo.deviceType, txt))\n\t\t\ttxt = \"unknown\";\n\n\t\t// This is a bit hackish and we lose the higher 32 bits of the id on\n\t\t// 32-bit systems, but SDL only ever gives id's that at most use as many\n\t\t// bits as can fit in a pointer (for now.)\n\t\t// We use lightuserdata instead of a lua_Number (double) because doubles\n\t\t// can't represent all possible id values on 64-bit systems.\n\t\tvargs.emplace_back((void *)(intptr_t)touchinfo.id);\n\t\tvargs.emplace_back(touchinfo.x);\n\t\tvargs.emplace_back(touchinfo.y);\n\t\tvargs.emplace_back(touchinfo.dx);\n\t\tvargs.emplace_back(touchinfo.dy);\n\t\tvargs.emplace_back(touchinfo.pressure);\n\t\tvargs.emplace_back(txt, strlen(txt));\n\t\tvargs.emplace_back(touchinfo.mouse);\n\n\t\tif (e.type == SDL_EVENT_FINGER_DOWN)\n\t\t\ttxt = \"touchpressed\";\n\t\telse if (e.type == SDL_EVENT_FINGER_UP || e.type == SDL_EVENT_FINGER_CANCELED)\n\t\t\ttxt = \"touchreleased\";\n\t\telse\n\t\t\ttxt = \"touchmoved\";\n\t\tmsg = new Message(txt, vargs);\n\t\tbreak;\n\tcase SDL_EVENT_JOYSTICK_BUTTON_DOWN:\n\tcase SDL_EVENT_JOYSTICK_BUTTON_UP:\n\tcase SDL_EVENT_JOYSTICK_AXIS_MOTION:\n\tcase SDL_EVENT_JOYSTICK_HAT_MOTION:\n\tcase SDL_EVENT_JOYSTICK_ADDED:\n\tcase SDL_EVENT_JOYSTICK_REMOVED:\n\tcase SDL_EVENT_GAMEPAD_BUTTON_DOWN:\n\tcase SDL_EVENT_GAMEPAD_BUTTON_UP:\n\tcase SDL_EVENT_GAMEPAD_AXIS_MOTION:\n\tcase SDL_EVENT_GAMEPAD_SENSOR_UPDATE:\n\t\tmsg = convertJoystickEvent(e);\n\t\tbreak;\n\tcase SDL_EVENT_WINDOW_FOCUS_GAINED:\n\tcase SDL_EVENT_WINDOW_FOCUS_LOST:\n\tcase SDL_EVENT_WINDOW_MOUSE_ENTER:\n\tcase SDL_EVENT_WINDOW_MOUSE_LEAVE:\n\tcase SDL_EVENT_WINDOW_SHOWN:\n\tcase SDL_EVENT_WINDOW_HIDDEN:\n\tcase SDL_EVENT_WINDOW_RESIZED:\n\tcase SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED:\n\tcase SDL_EVENT_WINDOW_MINIMIZED:\n\tcase SDL_EVENT_WINDOW_RESTORED:\n\tcase SDL_EVENT_WINDOW_EXPOSED:\n\tcase SDL_EVENT_WINDOW_OCCLUDED:\n\t\tmsg = convertWindowEvent(e, win);\n\t\tbreak;\n\tcase SDL_EVENT_DISPLAY_ORIENTATION:\n\t\t{\n\t\t\tauto orientation = window::Window::ORIENTATION_UNKNOWN;\n\t\t\tswitch ((SDL_DisplayOrientation) e.display.data1)\n\t\t\t{\n\t\t\tcase SDL_ORIENTATION_UNKNOWN:\n\t\t\tdefault:\n\t\t\t\torientation = window::Window::ORIENTATION_UNKNOWN;\n\t\t\t\tbreak;\n\t\t\tcase SDL_ORIENTATION_LANDSCAPE:\n\t\t\t\torientation = window::Window::ORIENTATION_LANDSCAPE;\n\t\t\t\tbreak;\n\t\t\tcase SDL_ORIENTATION_LANDSCAPE_FLIPPED:\n\t\t\t\torientation = window::Window::ORIENTATION_LANDSCAPE_FLIPPED;\n\t\t\t\tbreak;\n\t\t\tcase SDL_ORIENTATION_PORTRAIT:\n\t\t\t\torientation = window::Window::ORIENTATION_PORTRAIT;\n\t\t\t\tbreak;\n\t\t\tcase SDL_ORIENTATION_PORTRAIT_FLIPPED:\n\t\t\t\torientation = window::Window::ORIENTATION_PORTRAIT_FLIPPED;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (!window::Window::getConstant(orientation, txt))\n\t\t\t\ttxt = \"unknown\";\n\n\t\t\tint count = 0;\n\t\t\tint displayindex = 0;\n\t\t\tSDL_DisplayID *displays = SDL_GetDisplays(&count);\n\t\t\tfor (int i = 0; i < count; i++)\n\t\t\t{\n\t\t\t\tif (displays[i] == e.display.displayID)\n\t\t\t\t{\n\t\t\t\t\tdisplayindex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tSDL_free(displays);\n\t\t\tvargs.emplace_back((double)(displayindex + 1));\n\t\t\tvargs.emplace_back(txt, strlen(txt));\n\n\t\t\tmsg = new Message(\"displayrotated\", vargs);\n\t\t}\n\t\tbreak;\n\tcase SDL_EVENT_DROP_BEGIN:\n\t\tmsg = new Message(\"dropbegan\", vargs);\n\t\tbreak;\n\tcase SDL_EVENT_DROP_COMPLETE:\n\t\t{\n\t\t\tdouble x = e.drop.x;\n\t\t\tdouble y = e.drop.y;\n\t\t\twindowToDPICoords(win, &x, &y);\n\t\t\tvargs.emplace_back(x);\n\t\t\tvargs.emplace_back(y);\n\t\t\tmsg = new Message(\"dropcompleted\", vargs);\n\t\t}\n\t\tbreak;\n\tcase SDL_EVENT_DROP_POSITION:\n\t\t{\n\t\t\tdouble x = e.drop.x;\n\t\t\tdouble y = e.drop.y;\n\t\t\twindowToDPICoords(win, &x, &y);\n\t\t\tvargs.emplace_back(x);\n\t\t\tvargs.emplace_back(y);\n\t\t\tmsg = new Message(\"dropmoved\", vargs);\n\t\t}\n\t\tbreak;\n\tcase SDL_EVENT_DROP_FILE:\n\t\tfilesystem = Module::getInstance<filesystem::Filesystem>(Module::M_FILESYSTEM);\n\t\tif (filesystem != nullptr)\n\t\t{\n\t\t\tconst char *filepath = e.drop.data;\n\t\t\t// Allow mounting any dropped path, so zips or dirs can be mounted.\n\t\t\tfilesystem->allowMountingForPath(filepath);\n\n\t\t\tdouble x = e.drop.x;\n\t\t\tdouble y = e.drop.y;\n\t\t\twindowToDPICoords(win, &x, &y);\n\n\t\t\tif (filesystem->isRealDirectory(filepath))\n\t\t\t{\n\t\t\t\tvargs.emplace_back(filepath, strlen(filepath));\n\t\t\t\tvargs.emplace_back(x);\n\t\t\t\tvargs.emplace_back(y);\n\t\t\t\tmsg = new Message(\"directorydropped\", vargs);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tauto *file = filesystem->openNativeFile(filepath, love::filesystem::File::MODE_CLOSED);\n\t\t\t\tvargs.emplace_back(&love::filesystem::File::type, file);\n\t\t\t\tvargs.emplace_back(x);\n\t\t\t\tvargs.emplace_back(y);\n\t\t\t\tmsg = new Message(\"filedropped\", vargs);\n\t\t\t\tfile->release();\n\t\t\t}\n\t\t}\n\t\tbreak;\n\tcase SDL_EVENT_QUIT:\n\tcase SDL_EVENT_TERMINATING:\n\t\tmsg = new Message(\"quit\");\n\t\tbreak;\n\tcase SDL_EVENT_LOW_MEMORY:\n\t\tmsg = new Message(\"lowmemory\");\n\t\tbreak;\n\tcase SDL_EVENT_LOCALE_CHANGED:\n\t\tmsg = new Message(\"localechanged\");\n\t\tbreak;\n\tcase SDL_EVENT_SYSTEM_THEME_CHANGED:\n\t\tmsg = new Message(\"themechanged\");\n\t\tbreak;\n\tcase SDL_EVENT_SENSOR_UPDATE:\n\t\tsensorInstance = Module::getInstance<sensor::Sensor>(M_SENSOR);\n\t\tif (sensorInstance)\n\t\t{\n\t\t\tstd::vector<void*> sensors = sensorInstance->getHandles();\n\n\t\t\tfor (void *s: sensors)\n\t\t\t{\n\t\t\t\tSDL_Sensor *sensor = (SDL_Sensor *) s;\n\t\t\t\tSDL_SensorID id = SDL_GetSensorID(sensor);\n\n\t\t\t\tif (e.sensor.which == id)\n\t\t\t\t{\n\t\t\t\t\t// Found sensor\n\t\t\t\t\tconst char *sensorType;\n\t\t\t\t\tauto sdltype = SDL_GetSensorType(sensor);\n\t\t\t\t\tif (!sensor::Sensor::getConstant(sensor::sdl::Sensor::convert(sdltype), sensorType))\n\t\t\t\t\t\tsensorType = \"unknown\";\n\n\t\t\t\t\tvargs.emplace_back(sensorType, strlen(sensorType));\n\t\t\t\t\t// Both accelerometer and gyroscope only pass up to 3 values.\n\t\t\t\t\t// https://github.com/libsdl-org/SDL/blob/SDL2/include/SDL_sensor.h#L81-L127\n\t\t\t\t\tvargs.emplace_back(e.sensor.data[0]);\n\t\t\t\t\tvargs.emplace_back(e.sensor.data[1]);\n\t\t\t\t\tvargs.emplace_back(e.sensor.data[2]);\n\t\t\t\t\tmsg = new Message(\"sensorupdated\", vargs);\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn msg;\n}\n\nMessage *Event::convertJoystickEvent(const SDL_Event &e) const\n{\n\tauto joymodule = Module::getInstance<joystick::JoystickModule>(Module::M_JOYSTICK);\n\tif (!joymodule)\n\t\treturn nullptr;\n\n\tMessage *msg = nullptr;\n\n\tstd::vector<Variant> vargs;\n\tvargs.reserve(4);\n\n\tlove::Type *joysticktype = &love::joystick::Joystick::type;\n\tlove::joystick::Joystick *stick = nullptr;\n\tlove::joystick::Joystick::Hat hat;\n\tlove::joystick::Joystick::GamepadButton padbutton;\n\tlove::joystick::Joystick::GamepadAxis padaxis;\n\tconst char *txt;\n\n\tswitch (e.type)\n\t{\n\tcase SDL_EVENT_JOYSTICK_BUTTON_DOWN:\n\tcase SDL_EVENT_JOYSTICK_BUTTON_UP:\n\t\tstick = joymodule->getJoystickFromID(e.jbutton.which);\n\t\tif (!stick)\n\t\t\tbreak;\n\n\t\tvargs.emplace_back(joysticktype, stick);\n\t\tvargs.emplace_back((double)(e.jbutton.button+1));\n\t\tmsg = new Message((e.type == SDL_EVENT_JOYSTICK_BUTTON_DOWN) ?\n\t\t\t\t\t\t  \"joystickpressed\" : \"joystickreleased\",\n\t\t\t\t\t\t  vargs);\n\t\tbreak;\n\tcase SDL_EVENT_JOYSTICK_AXIS_MOTION:\n\t\t{\n\t\t\tstick = joymodule->getJoystickFromID(e.jaxis.which);\n\t\t\tif (!stick)\n\t\t\t\tbreak;\n\n\t\t\tvargs.emplace_back(joysticktype, stick);\n\t\t\tvargs.emplace_back((double)(e.jaxis.axis+1));\n\t\t\tfloat value = joystick::Joystick::clampval(e.jaxis.value / 32768.0f);\n\t\t\tvargs.emplace_back((double) value);\n\t\t\tmsg = new Message(\"joystickaxis\", vargs);\n\t\t}\n\t\tbreak;\n\tcase SDL_EVENT_JOYSTICK_HAT_MOTION:\n\t\tif (!joystick::sdl::Joystick::getConstant(e.jhat.value, hat) || !joystick::Joystick::getConstant(hat, txt))\n\t\t\tbreak;\n\n\t\tstick = joymodule->getJoystickFromID(e.jhat.which);\n\t\tif (!stick)\n\t\t\tbreak;\n\n\t\tvargs.emplace_back(joysticktype, stick);\n\t\tvargs.emplace_back((double)(e.jhat.hat+1));\n\t\tvargs.emplace_back(txt, strlen(txt));\n\t\tmsg = new Message(\"joystickhat\", vargs);\n\t\tbreak;\n\tcase SDL_EVENT_GAMEPAD_BUTTON_DOWN:\n\tcase SDL_EVENT_GAMEPAD_BUTTON_UP:\n\t\t{\n\t\t\tconst auto &b = e.gbutton;\n\t\t\tif (!joystick::sdl::Joystick::getConstant((SDL_GamepadButton) b.button, padbutton))\n\t\t\t\tbreak;\n\n\t\t\tif (!joystick::Joystick::getConstant(padbutton, txt))\n\t\t\t\tbreak;\n\n\t\t\tstick = joymodule->getJoystickFromID(b.which);\n\t\t\tif (!stick)\n\t\t\t\tbreak;\n\n\t\t\tvargs.emplace_back(joysticktype, stick);\n\t\t\tvargs.emplace_back(txt, strlen(txt));\n\t\t\tmsg = new Message(e.type == SDL_EVENT_GAMEPAD_BUTTON_DOWN ?\n\t\t\t\t\t\t\t  \"gamepadpressed\" : \"gamepadreleased\", vargs);\n\t\t}\n\t\tbreak;\n\tcase SDL_EVENT_GAMEPAD_AXIS_MOTION:\n\t\tif (joystick::sdl::Joystick::getConstant((SDL_GamepadAxis) e.gaxis.axis, padaxis))\n\t\t{\n\t\t\tif (!joystick::Joystick::getConstant(padaxis, txt))\n\t\t\t\tbreak;\n\n\t\t\tconst auto &a = e.gaxis;\n\t\t\tstick = joymodule->getJoystickFromID(a.which);\n\t\t\tif (!stick)\n\t\t\t\tbreak;\n\n\t\t\tvargs.emplace_back(joysticktype, stick);\n\t\t\tvargs.emplace_back(txt, strlen(txt));\n\t\t\tfloat value = joystick::Joystick::clampval(a.value / 32768.0f);\n\t\t\tvargs.emplace_back((double) value);\n\t\t\tmsg = new Message(\"gamepadaxis\", vargs);\n\t\t}\n\t\tbreak;\n\tcase SDL_EVENT_JOYSTICK_ADDED:\n\t\t// jdevice.which is the joystick device index.\n\t\tstick = joymodule->addJoystick(e.jdevice.which);\n\t\tif (stick)\n\t\t{\n\t\t\tvargs.emplace_back(joysticktype, stick);\n\t\t\tmsg = new Message(\"joystickadded\", vargs);\n\t\t}\n\t\tbreak;\n\tcase SDL_EVENT_JOYSTICK_REMOVED:\n\t\t// jdevice.which is the joystick instance ID now.\n\t\tstick = joymodule->getJoystickFromID(e.jdevice.which);\n\t\tif (stick)\n\t\t{\n\t\t\tjoymodule->removeJoystick(stick);\n\t\t\tvargs.emplace_back(joysticktype, stick);\n\t\t\tmsg = new Message(\"joystickremoved\", vargs);\n\t\t}\n\t\tbreak;\n#if defined(LOVE_ENABLE_SENSOR)\n\tcase SDL_EVENT_GAMEPAD_SENSOR_UPDATE:\n\t\t{\n\t\t\tconst auto &sens = e.gsensor;\n\t\t\tstick = joymodule->getJoystickFromID(sens.which);\n\t\t\tif (stick)\n\t\t\t{\n\t\t\t\tusing Sensor = love::sensor::Sensor;\n\n\t\t\t\tconst char *sensorName;\n\t\t\t\tSensor::SensorType sensorType = love::sensor::sdl::Sensor::convert((SDL_SensorType) sens.sensor);\n\t\t\t\tif (!Sensor::getConstant(sensorType, sensorName))\n\t\t\t\t\tsensorName = \"unknown\";\n\n\t\t\t\tvargs.emplace_back(joysticktype, stick);\n\t\t\t\tvargs.emplace_back(sensorName, strlen(sensorName));\n\t\t\t\tvargs.emplace_back(sens.data[0]);\n\t\t\t\tvargs.emplace_back(sens.data[1]);\n\t\t\t\tvargs.emplace_back(sens.data[2]);\n\t\t\t\tmsg = new Message(\"joysticksensorupdated\", vargs);\n\t\t\t}\n\t\t}\n\t\tbreak;\n#endif // defined(LOVE_ENABLE_SENSOR)\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn msg;\n}\n\nMessage *Event::convertWindowEvent(const SDL_Event &e, love::window::Window *win)\n{\n\tMessage *msg = nullptr;\n\n\tstd::vector<Variant> vargs;\n\tvargs.reserve(4);\n\n\tgraphics::Graphics *gfx = nullptr;\n\n\tauto event = e.type;\n\n\tswitch (event)\n\t{\n\tcase SDL_EVENT_WINDOW_FOCUS_GAINED:\n\tcase SDL_EVENT_WINDOW_FOCUS_LOST:\n\t\tvargs.emplace_back(event == SDL_EVENT_WINDOW_FOCUS_GAINED);\n\t\tmsg = new Message(\"focus\", vargs);\n\t\tbreak;\n\tcase SDL_EVENT_WINDOW_MOUSE_ENTER:\n\tcase SDL_EVENT_WINDOW_MOUSE_LEAVE:\n\t\tvargs.emplace_back(event == SDL_EVENT_WINDOW_MOUSE_ENTER);\n\t\tmsg = new Message(\"mousefocus\", vargs);\n\t\tbreak;\n\tcase SDL_EVENT_WINDOW_SHOWN:\n\tcase SDL_EVENT_WINDOW_HIDDEN:\n\tcase SDL_EVENT_WINDOW_MINIMIZED:\n\tcase SDL_EVENT_WINDOW_RESTORED:\n#ifdef LOVE_ANDROID\n\t\tif (auto audio = Module::getInstance<audio::Audio>(Module::M_AUDIO))\n\t\t{\n\t\t\tif (event == SDL_EVENT_WINDOW_MINIMIZED)\n\t\t\t\taudio->pauseContext();\n\t\t\telse if (event == SDL_EVENT_WINDOW_RESTORED)\n\t\t\t\taudio->resumeContext();\n\t\t}\n#endif\n\t\t// WINDOW_RESTORED can also happen when going from maximized -> unmaximized,\n\t\t// but there isn't a nice way to avoid sending our event in that situation.\n\t\tvargs.emplace_back(event == SDL_EVENT_WINDOW_SHOWN || event == SDL_EVENT_WINDOW_RESTORED);\n\t\tmsg = new Message(\"visible\", vargs);\n\t\tbreak;\n\tcase SDL_EVENT_WINDOW_EXPOSED:\n\t\tmsg = new Message(\"exposed\");\n\t\tbreak;\n\tcase SDL_EVENT_WINDOW_OCCLUDED:\n\t\tmsg = new Message(\"occluded\");\n\t\tbreak;\n\tcase SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED:\n\t\t{\n\t\t\tdouble width = e.window.data1;\n\t\t\tdouble height = e.window.data2;\n\n\t\t\tgfx = Module::getInstance<graphics::Graphics>(Module::M_GRAPHICS);\n\t\t\tif (win)\n\t\t\t\twin->onSizeChanged(e.window.data1, e.window.data2);\n\n\t\t\t// The size values in the Window aren't necessarily the same as the\n\t\t\t// graphics size, which is what we want to output.\n\t\t\tif (gfx)\n\t\t\t{\n\t\t\t\twidth = gfx->getWidth();\n\t\t\t\theight = gfx->getHeight();\n\t\t\t}\n\t\t\telse if (win)\n\t\t\t{\n\t\t\t\twidth = win->getWidth();\n\t\t\t\theight = win->getHeight();\n\t\t\t\twindowToDPICoords(win, &width, &height);\n\t\t\t}\n\n\t\t\tvargs.emplace_back(width);\n\t\t\tvargs.emplace_back(height);\n\t\t\tmsg = new Message(\"resize\", vargs);\n\t\t}\n\t\tbreak;\n\t}\n\n\treturn msg;\n}\n\n} // sdl\n} // event\n} // love\n"
  },
  {
    "path": "src/modules/event/sdl/Event.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_EVENT_SDL_EVENT_H\n#define LOVE_EVENT_SDL_EVENT_H\n\n// LOVE\n#include \"event/Event.h\"\n#include \"audio/Source.h\"\n\n// SDL\n#include <SDL3/SDL_events.h>\n\nnamespace love::window\n{\nclass Window;\n}\n\nnamespace love\n{\nnamespace event\n{\nnamespace sdl\n{\n\nclass Event : public love::event::Event\n{\npublic:\n\n\tEvent();\n\tvirtual ~Event();\n\n\t/**\n\t * Pumps the event queue. This function gathers all the pending input information\n\t * from devices and places it on the event queue. Normally not needed if you poll\n\t * for events.\n\t **/\n\tvoid pump(float waitTimeout = 0.0f) override;\n\n\t// Deprecated.\n\tMessage *wait() override;\n\n\t/**\n\t * Clears the event queue.\n\t */\n\tvoid clear() override;\n\n\tbool allowModalDraws() const;\n\nprivate:\n\n\tvoid exceptionIfInRenderPass(const char *name);\n\n\tMessage *convert(const SDL_Event &e);\n\tMessage *convertJoystickEvent(const SDL_Event &e) const;\n\tMessage *convertWindowEvent(const SDL_Event &e, love::window::Window *win);\n\n\tbool insideEventPump = false;\n\n}; // Event\n\n} // sdl\n} // event\n} // love\n\n#endif // LOVE_EVENT_SDL_EVENT_H\n"
  },
  {
    "path": "src/modules/event/wrap_Event.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_Event.h\"\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"common/Reference.h\"\n#include \"sdl/Event.h\"\n\n#include <algorithm>\n\n// Shove the wrap_Event.lua code directly into a raw string literal.\nstatic const char event_lua[] =\n#include \"wrap_Event.lua\"\n;\n\nnamespace love\n{\nnamespace event\n{\n\n#define instance() (Module::getInstance<Event>(Module::M_EVENT))\n\nstatic int luax_pushmessage(lua_State *L, const Message &m)\n{\n\tluax_pushstring(L, m.name);\n\n\tfor (const Variant &v : m.args)\n\t\tluax_pushvariant(L, v);\n\n\treturn (int) m.args.size() + 1;\n}\n\nstatic int w_poll_i(lua_State *L)\n{\n\tMessage *m = nullptr;\n\n\tif (instance()->poll(m) && m != nullptr)\n\t{\n\t\tint args = luax_pushmessage(L, *m);\n\t\tm->release();\n\t\treturn args;\n\t}\n\n\t// No pending events.\n\treturn 0;\n}\n\nint w_pump(lua_State *L)\n{\n\tfloat waitTimeout = (float)luaL_optnumber(L, 1, 0.0f);\n\tluax_catchexcept(L, [&]() { instance()->pump(waitTimeout); });\n\treturn 0;\n}\n\nint w_wait(lua_State *L)\n{\n\tluax_markdeprecated(L, 1, \"love.event.wait\", API_FUNCTION, DEPRECATED_REPLACED, \"waitTimeout parameter in love.event.pump\");\n\n\tMessage *m = nullptr;\n\tluax_catchexcept(L, [&]() { m = instance()->wait(); });\n\tif (m != nullptr)\n\t{\n\t\tint args = luax_pushmessage(L, *m);\n\t\tm->release();\n\t\treturn args;\n\t}\n\n\treturn 0;\n}\n\nint w_push(lua_State *L)\n{\n\tstd::string name = luax_checkstring(L, 1);\n\tstd::vector<Variant> vargs;\n\n\tint nargs = lua_gettop(L);\n\tfor (int i = 2; i <= nargs; i++)\n\t{\n\t\tif (lua_isnoneornil(L, i))\n\t\t\tbreak;\n\n\t\tluax_catchexcept(L, [&]() { vargs.push_back(luax_checkvariant(L, i)); });\n\n\t\tif (vargs.back().getType() == Variant::UNKNOWN)\n\t\t{\n\t\t\tvargs.clear();\n\t\t\treturn luaL_error(L, \"Argument %d can't be stored safely\\nExpected boolean, number, string or userdata.\", i);\n\t\t}\n\t}\n\n\tStrongRef<Message> m(new Message(name, vargs), Acquire::NORETAIN);\n\n\tinstance()->push(m);\n\tluax_pushboolean(L, true);\n\treturn 1;\n}\n\nint w_clear(lua_State *L)\n{\n\tluax_catchexcept(L, [&]() { instance()->clear(); });\n\treturn 0;\n}\n\nint w_quit(lua_State *L)\n{\n\tluax_catchexcept(L, [&]() {\n\t\tstd::vector<Variant> args;\n\t\tfor (int i = 1; i <= std::max(1, lua_gettop(L)); i++)\n\t\t\targs.push_back(luax_checkvariant(L, i));\n\n\t\tStrongRef<Message> m(new Message(\"quit\", args), Acquire::NORETAIN);\n\t\tinstance()->push(m);\n\t});\n\n\tluax_pushboolean(L, true);\n\treturn 1;\n}\n\nint w_restart(lua_State *L)\n{\n\tluax_catchexcept(L, [&]() {\n\t\tstd::vector<Variant> args;\n\t\targs.emplace_back(\"restart\", strlen(\"restart\"));\n\n\t\tfor (int i = 1; i <= lua_gettop(L); i++)\n\t\t\targs.push_back(luax_checkvariant(L, i));\n\n\t\tStrongRef<Message> m(new Message(\"quit\", args), Acquire::NORETAIN);\n\t\tinstance()->push(m);\n\t});\n\n\tluax_pushboolean(L, true);\n\treturn 1;\n}\n\nstruct DrawCallbackData\n{\n\tVariant returnValues[2];\n\tReference *r;\n};\n\nstatic int drawCallbackInner(lua_State *L)\n{\n\tauto data = (DrawCallbackData *)lua_touserdata(L, 1);\n\n\tdata->r->push(L);\n\n\tlua_call(L, 0, 2);\n\n\tdata->returnValues[0] = luax_checkvariant(L, -2, false);\n\tdata->returnValues[1] = luax_checkvariant(L, -1, false);\n\n\tlua_pop(L, 2);\n\treturn 0;\n}\n\nstatic void drawCallback(void *context, Variant *returnVal0, Variant *returnVal1)\n{\n\tauto r = (Reference *)context;\n\tlua_State *L = r->getPinnedL();\n\n\tDrawCallbackData data = {};\n\tdata.r = r;\n\n\t// pcall into C code to catch errors from checkvariant as well as the lua_call.\n\tint err = lua_cpcall(L, drawCallbackInner, &data);\n\n\t// Unfortunately, this eats the stack trace, too bad.\n\tif (err != 0)\n\t\tthrow love::Exception(\"Error in modal draw callback: %s\", lua_tostring(L, -1));\n\n\t*returnVal0 = data.returnValues[0];\n\t*returnVal1 = data.returnValues[1];\n}\n\nstatic void cleanupCallback(void *context)\n{\n\tauto r = (Reference *)context;\n\tdelete r;\n}\n\nint w_setModalDrawCallback(lua_State *L)\n{\n\tEvent::ModalDrawData data = {};\n\n\tif (!lua_isnoneornil(L, 1))\n\t{\n\t\tluaL_checktype(L, 1, LUA_TFUNCTION);\n\n\t\t// Save the callback function as a Reference.\n\t\tlua_pushvalue(L, 1);\n\t\tReference *r = new Reference(L);\n\t\tlua_pop(L, 1);\n\n\t\tdata.draw = drawCallback;\n\t\tdata.cleanup = cleanupCallback;\n\t\tdata.context = r;\n\t}\n\n\tluax_catchexcept(L, [&]() { instance()->setModalDrawData(data); });\n\treturn 0;\n}\n\nint w__setDefaultModalDrawCallback(lua_State *L)\n{\n\tEvent::ModalDrawData data = {};\n\n\tif (!lua_isnoneornil(L, 1))\n\t{\n\t\tluaL_checktype(L, 1, LUA_TFUNCTION);\n\n\t\t// Save the callback function as a Reference.\n\t\tlua_pushvalue(L, 1);\n\t\tReference *r = new Reference(L);\n\t\tlua_pop(L, 1);\n\n\t\tdata.draw = drawCallback;\n\t\tdata.cleanup = cleanupCallback;\n\t\tdata.context = r;\n\t}\n\n\tluax_catchexcept(L, [&]() { instance()->setDefaultModalDrawData(data); });\n\treturn 0;\n}\n\n// List of functions to wrap.\nstatic const luaL_Reg functions[] =\n{\n\t{ \"pump\", w_pump },\n\t{ \"poll_i\", w_poll_i },\n\t{ \"wait\", w_wait },\n\t{ \"push\", w_push },\n\t{ \"clear\", w_clear },\n\t{ \"quit\", w_quit },\n\t{ \"restart\", w_restart },\n\t{ \"setModalDrawCallback\", w_setModalDrawCallback },\n\t{ \"_setDefaultModalDrawCallback\", w__setDefaultModalDrawCallback },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_love_event(lua_State *L)\n{\n\tEvent *instance = instance();\n\tif (instance == nullptr)\n\t{\n\t\tluax_catchexcept(L, [&](){ instance = new love::event::sdl::Event(); });\n\t}\n\telse\n\t\tinstance->retain();\n\n\tWrappedModule w;\n\tw.module = instance;\n\tw.name = \"event\";\n\tw.type = &Module::type;\n\tw.functions = functions;\n\tw.types = nullptr;\n\n\tint ret = luax_register_module(L, w);\n\n\tif (luaL_loadbuffer(L, (const char *)event_lua, sizeof(event_lua), \"=[love \\\"wrap_Event.lua\\\"]\") == 0)\n\t\tlua_call(L, 0, 0);\n\telse\n\t\tlua_error(L);\n\n\treturn ret;\n}\n\n} // event\n} // love\n"
  },
  {
    "path": "src/modules/event/wrap_Event.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_EVENT_WRAP_EVENT_H\n#define LOVE_EVENT_WRAP_EVENT_H\n\n// LOVE\n#include \"common/config.h\"\n#include \"Event.h\"\n#include \"common/runtime.h\"\n\nnamespace love\n{\nnamespace event\n{\n\nextern \"C\" LOVE_EXPORT int luaopen_love_event(lua_State *L);\n\n} // event\n} // love\n\n#endif // LOVE_EVENT_WRAP_EVENT_H\n"
  },
  {
    "path": "src/modules/event/wrap_Event.lua",
    "content": "R\"luastring\"--(\n-- DO NOT REMOVE THE ABOVE LINE. It is used to load this file as a C++ string.\n-- There is a matching delimiter at the bottom of the file.\n\n--[[\nCopyright (c) 2006-2024 LOVE Development Team\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\nclaim that you wrote the original software. If you use this software\nin a product, an acknowledgment in the product documentation would be\nappreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be\nmisrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n--]]\n\nfunction love.event.poll()\n\treturn love.event.poll_i\nend\n\n-- DO NOT REMOVE THE NEXT LINE. It is used to load this file as a C++ string.\n--)luastring\"--\"\n"
  },
  {
    "path": "src/modules/filesystem/File.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"File.h\"\n\nnamespace love\n{\nnamespace filesystem\n{\n\nlove::Type File::type(\"File\", &Stream::type);\n\nFile::~File()\n{\n}\n\nFileData *File::read()\n{\n\treturn read(SIZE_ALL);\n}\n\nFileData *File::read(int64 size)\n{\n\tbool isopen = isOpen();\n\n\tif (!isopen && !open(MODE_READ))\n\t\tthrow love::Exception(\"Could not read file %s.\", getFilename().c_str());\n\n\tint64 max = getSize();\n\tint64 cur = tell();\n\n\tif (size == SIZE_ALL)\n\t\tsize = max;\n\telse if (size < 0)\n\t\tthrow love::Exception(\"Invalid read size.\");\n\n\t// Clamping because the file offset may be in a weird position.\n\tif (cur < 0)\n\t\tcur = 0;\n\telse if (cur > max)\n\t\tcur = max;\n\n\tif (cur + size > max)\n\t\tsize = max - cur;\n\n\tStrongRef<FileData> fileData(new FileData(size, getFilename()), Acquire::NORETAIN);\n\tint64 bytesRead = read(fileData->getData(), size);\n\n\tif (bytesRead < 0 || (bytesRead == 0 && bytesRead != size))\n\t{\n\t\tdelete fileData;\n\t\tthrow love::Exception(\"Could not read from file.\");\n\t}\n\n\tif (bytesRead < size)\n\t{\n\t\tStrongRef<FileData> tmpFileData(new FileData(bytesRead, getFilename()), Acquire::NORETAIN);\n\t\tmemcpy(tmpFileData->getData(), fileData->getData(), (size_t) bytesRead);\n\t\tfileData = tmpFileData;\n\t}\n\n\tif (!isopen)\n\t\tclose();\n\n\tfileData->retain();\n\treturn fileData;\n}\n\nstd::string File::getExtension() const\n{\n\tconst std::string &filename = getFilename();\n\tstd::string::size_type idx = filename.rfind('.');\n\n\tif (idx != std::string::npos)\n\t\treturn filename.substr(idx+1);\n\telse\n\t\treturn std::string();\n}\n\nSTRINGMAP_CLASS_BEGIN(File, File::Mode, File::MODE_MAX_ENUM, mode)\n{\n\t{ \"c\", File::MODE_CLOSED },\n\t{ \"r\", File::MODE_READ   },\n\t{ \"w\", File::MODE_WRITE  },\n\t{ \"a\", File::MODE_APPEND },\n}\nSTRINGMAP_CLASS_END(File, File::Mode, File::MODE_MAX_ENUM, mode)\n\nSTRINGMAP_CLASS_BEGIN(File, File::BufferMode, File::BUFFER_MAX_ENUM, bufferMode)\n{\n\t{ \"none\", File::BUFFER_NONE },\n\t{ \"line\", File::BUFFER_LINE },\n\t{ \"full\", File::BUFFER_FULL },\n}\nSTRINGMAP_CLASS_END(File, File::BufferMode, File::BUFFER_MAX_ENUM, bufferMode)\n\n} // filesystem\n} // love\n"
  },
  {
    "path": "src/modules/filesystem/File.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_FILESYSTEM_FILE_H\n#define LOVE_FILESYSTEM_FILE_H\n\n// STD\n#include <string>\n\n// LOVE\n#include \"common/Data.h\"\n#include \"common/Object.h\"\n#include \"common/Stream.h\"\n#include \"common/StringMap.h\"\n#include \"common/int.h\"\n#include \"FileData.h\"\n\nnamespace love\n{\nnamespace filesystem\n{\n\n/**\n * A File interface, providing generic means of reading from and\n * writing to files.\n **/\nclass File : public Stream\n{\npublic:\n\n\tstatic love::Type type;\n\n\tstatic const int64 SIZE_ALL = -1;\n\n\t/**\n\t * File open mode.\n\t **/\n\tenum Mode\n\t{\n\t\tMODE_CLOSED,\n\t\tMODE_READ,\n\t\tMODE_WRITE,\n\t\tMODE_APPEND,\n\t\tMODE_MAX_ENUM\n\t};\n\n\tenum BufferMode\n\t{\n\t\tBUFFER_NONE,\n\t\tBUFFER_LINE,\n\t\tBUFFER_FULL,\n\t\tBUFFER_MAX_ENUM\n\t};\n\n\t/**\n\t * Destructor.\n\t **/\n\tvirtual ~File();\n\n\t// Implements Stream.\n\tbool isReadable() const override { return getMode() == MODE_READ; }\n\tbool isWritable() const override { return getMode() == MODE_WRITE || getMode() == MODE_APPEND; }\n\tbool isSeekable() const override { return isOpen(); }\n\n\tusing Stream::read;\n\tusing Stream::write;\n\n\t/**\n\t * Opens the file in a certain mode.\n\t *\n\t * @param mode MODE_READ, MODE_WRITE, MODE_APPEND.\n\t * @return True if successful, false otherwise.\n\t **/\n\tvirtual bool open(Mode mode) = 0;\n\n\t/**\n\t * Closes the file.\n\t *\n\t * @return True if successful, false otherwise.\n\t **/\n\tvirtual bool close() = 0;\n\n\t/**\n\t * Gets whether the file is open.\n\t **/\n\tvirtual bool isOpen() const = 0;\n\n\t/**\n\t * Reads data from the file and allocates a Data object.\n\t *\n\t * @param size The number of bytes to attempt reading.\n\t * @return A newly allocated Data object.\n\t **/\n\tFileData *read(int64 size) override;\n\tFileData *read();\n\n\t/**\n\t * Checks whether we are currently at end-of-file.\n\t *\n\t * @return True if EOF, false otherwise.\n\t **/\n\tvirtual bool isEOF() = 0;\n\n\t/**\n\t * Sets the buffering mode for the file. When buffering is enabled, the file\n\t * will not write to disk (or will pre-load data if in read mode) until the\n\t * buffer's capacity is reached.\n\t * In the BUFFER_LINE mode, the file will also write to disk if a newline is\n\t * written.\n\t *\n\t * @param bufmode The buffer mode.\n\t * @param size The size in bytes of the buffer.\n\t **/\n\tvirtual bool setBuffer(BufferMode bufmode, int64 size) = 0;\n\n\t/**\n\t * @param[out] size The size in bytes of the buffer.\n\t * @return The current buffer mode.\n\t **/\n\tvirtual BufferMode getBuffer(int64 &size) const = 0;\n\n\t/**\n\t * Gets the current mode of the File.\n\t * @return The current mode of the File; CLOSED, READ, WRITE or APPEND.\n\t **/\n\tvirtual Mode getMode() const = 0;\n\n\t/**\n\t * Gets the filename for this File, or empty string if none.\n\t * @return The filename for this File.\n\t **/\n\tvirtual const std::string &getFilename() const = 0;\n\n\t/**\n\t * Gets the file extension for this File, or empty string if none.\n\t * @return The file extension for this File (without the dot).\n\t **/\n\tvirtual std::string getExtension() const;\n\n\tSTRINGMAP_CLASS_DECLARE(Mode);\n\tSTRINGMAP_CLASS_DECLARE(BufferMode);\n\n}; // File\n\n} // filesystem\n} // love\n\n#endif // LOVE_FILESYSTEM_FILE_H\n"
  },
  {
    "path": "src/modules/filesystem/FileData.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"FileData.h\"\n\n// C++\n#include <iostream>\n#include <limits>\n\nnamespace love\n{\nnamespace filesystem\n{\n\nlove::Type FileData::type(\"FileData\", &Data::type);\n\nFileData::FileData(uint64 size, const std::string &filename)\n\t: data(nullptr)\n\t, size((size_t) size)\n\t, filename(filename)\n{\n\ttry\n\t{\n\t\tdata = new char[(size_t) size];\n\t}\n\tcatch (std::bad_alloc &)\n\t{\n\t\tthrow love::Exception(\"Out of memory.\");\n\t}\n\n\tsize_t dotpos = filename.rfind('.');\n\n\tif (dotpos != std::string::npos)\n\t{\n\t\textension = filename.substr(dotpos + 1);\n\t\tname = filename.substr(0, dotpos);\n\t}\n\telse\n\t\tname = filename;\n}\n\nFileData::FileData(const FileData &c)\n\t: data(nullptr)\n\t, size(c.size)\n\t, filename(c.filename)\n\t, extension(c.extension)\n\t, name(c.name)\n{\n\ttry\n\t{\n\t\tdata = new char[(size_t) size];\n\t}\n\tcatch (std::bad_alloc &)\n\t{\n\t\tthrow love::Exception(\"Out of memory.\");\n\t}\n\tmemcpy(data, c.data, size);\n}\n\nFileData::~FileData()\n{\n\tdelete [] data;\n}\n\nFileData *FileData::clone() const\n{\n\treturn new FileData(*this);\n}\n\nvoid *FileData::getData() const\n{\n\treturn data;\n}\n\nsize_t FileData::getSize() const\n{\n\tsize_t sizemax = std::numeric_limits<size_t>::max();\n\treturn size > sizemax ? sizemax : (size_t) size;\n}\n\nconst std::string &FileData::getFilename() const\n{\n\treturn filename;\n}\n\nconst std::string &FileData::getExtension() const\n{\n\treturn extension;\n}\n\nconst std::string &FileData::getName() const\n{\n\treturn name;\n}\n\n} // filesystem\n} // love\n"
  },
  {
    "path": "src/modules/filesystem/FileData.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/Data.h\"\n#include \"common/int.h\"\n#include \"common/Exception.h\"\n\n#include <string>\n\nnamespace love\n{\nnamespace filesystem\n{\n\nclass FileData : public Data\n{\npublic:\n\n\tstatic love::Type type;\n\n\tFileData(uint64 size, const std::string &filename);\n\tFileData(const FileData &c);\n\n\tvirtual ~FileData();\n\n\t// Implements Data.\n\tFileData *clone() const;\n\tvoid *getData() const;\n\tsize_t getSize() const;\n\n\tconst std::string &getFilename() const;\n\tconst std::string &getExtension() const;\n\tconst std::string &getName() const;\n\nprivate:\n\n\t// The actual data.\n\tchar *data;\n\n\t// Size of the data.\n\tuint64 size;\n\n\t// The filename used for error purposes.\n\tstd::string filename;\n\n\t// The extension (without dot). Used to identify file type.\n\tstd::string extension;\n\n\t// The file name without the extension (and without the dot).\n\tstd::string name;\n\n}; // FileData\n\n} // filesystem\n} // love\n"
  },
  {
    "path": "src/modules/filesystem/Filesystem.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"Filesystem.h\"\n#include \"NativeFile.h\"\n#include \"common/utf8.h\"\n\n// Assume POSIX or Visual Studio.\n#include <sys/types.h>\n#include <sys/stat.h>\n\n#if defined(LOVE_MACOS) || defined(LOVE_IOS)\n#include \"common/apple.h\"\n#include <unistd.h>\n#elif defined(LOVE_WINDOWS)\n#define WIN32_LEAN_AND_MEAN\n#include <windows.h>\n#include <fileapi.h>\n#include \"common/utf8.h\"\n#elif defined(LOVE_LINUX)\n#include <unistd.h>\n#endif\n\n// C++17 std::filesystem\n#include <filesystem>\n\nnamespace love\n{\nnamespace filesystem\n{\n\nlove::Type Filesystem::type(\"filesystem\", &Module::type);\n\nFilesystem::Filesystem(const char *name)\n\t: Module(M_FILESYSTEM, name)\n{\n}\n\nFilesystem::~Filesystem()\n{\n}\n\nvoid Filesystem::setAndroidSaveExternal(bool useExternal)\n{\t\n\tthis->useExternal = useExternal;\n}\n\nbool Filesystem::isAndroidSaveExternal() const\n{ \n\treturn useExternal;\n}\n\nFile *Filesystem::openNativeFile(const char *path, File::Mode mode) const\n{\n\treturn new NativeFile(path, mode);\n}\n\nFileData *Filesystem::newFileData(const void *data, size_t size, const char *filename) const\n{\n\tFileData *fd = new FileData(size, std::string(filename));\n\tmemcpy(fd->getData(), data, size);\n\treturn fd;\n}\n\nbool Filesystem::isRealDirectory(const std::string &path) const\n{\n\tFileType ftype = FILETYPE_MAX_ENUM;\n\tif (!getRealPathType(path, ftype))\n\t\treturn false;\n\treturn ftype == FILETYPE_DIRECTORY;\n}\n\nbool Filesystem::getRealPathType(const std::string &path, FileType &ftype) const\n{\n#ifdef LOVE_WINDOWS\n\t// make sure non-ASCII paths work.\n\tstd::wstring wpath = to_widestr(path);\n\n\tstruct _stat buf;\n\tif (_wstat(wpath.c_str(), &buf) != 0)\n\t\treturn false;\n\n\tif ((buf.st_mode & _S_IFREG) == _S_IFREG)\n\t\tftype = FILETYPE_FILE;\n\telse if ((buf.st_mode & _S_IFDIR) == _S_IFDIR)\n\t\tftype = FILETYPE_DIRECTORY;\n\telse\n\t\tftype = FILETYPE_OTHER;\n#else\n\t// Assume POSIX support...\n\tstruct stat buf;\n\tif (stat(path.c_str(), &buf) != 0)\n\t\treturn false;\n\n\tif (S_ISREG(buf.st_mode))\n\t\tftype = FILETYPE_FILE;\n\telse if (S_ISDIR(buf.st_mode))\n\t\tftype = FILETYPE_DIRECTORY;\n\telse if (S_ISLNK(buf.st_mode))\n\t\tftype = FILETYPE_SYMLINK;\n\telse\n\t\tftype = FILETYPE_OTHER;\n#endif\n\n\treturn true;\n}\n\nstatic bool getContainingDirectory(const std::string &path, std::string &newpath)\n{\n\tsize_t index = path.find_last_of(\"/\\\\\");\n\n\tif (index == std::string::npos)\n\t\treturn false;\n\n\tnewpath = path.substr(0, index);\n\n\t// Bail if the root has been stripped out.\n\treturn newpath.find_first_of(\"/\\\\\") != std::string::npos;\n}\n\nstatic bool createDirectoryRaw(const std::string &path)\n{\n#ifdef LOVE_WINDOWS\n\tstd::wstring wpath = to_widestr(path);\n\treturn CreateDirectoryW(wpath.c_str(), nullptr) != 0;\n#else\n\tint mode = S_IRWXU;\n\n#ifdef LOVE_ANDROID\n\t// Need to create save directory with ugo+rwx and setgid bit if\n\t// t.externalstorage is set and it's for save directory.\n\tauto fs = Module::getInstance<Filesystem>(Module::M_FILESYSTEM);\n\tif (fs != nullptr && fs->isAndroidSaveExternal())\n\t{\n\t\tconst std::string &savedir = fs->getFullCommonPath(Filesystem::COMMONPATH_APP_SAVEDIR);\n\t\tif (path.rfind(savedir, 0) == 0)\n\t\t\tmode |= S_IRWXG | S_IRWXO | S_ISGID;\n\t}\n#endif\n\n\treturn mkdir(path.c_str(), mode) == 0;\n#endif\n}\n\nbool Filesystem::createRealDirectory(const std::string &path)\n{\n\tFileType ftype = FILETYPE_MAX_ENUM;\n\tif (getRealPathType(path, ftype))\n\t\treturn ftype == FILETYPE_DIRECTORY;\n\n\tstd::vector<std::string> createpaths = {path};\n\n\t// Find the deepest subdirectory in the given path that actually exists.\n\twhile (true)\n\t{\n\t\tstd::string subpath;\n\t\tif (!getContainingDirectory(createpaths[0], subpath))\n\t\t\tbreak;\n\n\t\tif (isRealDirectory(subpath))\n\t\t\tbreak;\n\n\t\tcreatepaths.insert(createpaths.begin(), subpath);\n\t}\n\n\t// Try to create missing subdirectories starting from that existing one.\n\tfor (const std::string &p : createpaths)\n\t{\n\t\tif (!createDirectoryRaw(p))\n\t\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nstd::string Filesystem::canonicalizeRealPath(const std::string &p) const\n{\n\ttry\n\t{\n\t\treturn std::filesystem::weakly_canonical(p).string();\n\t}\n\tcatch (std::exception &)\n\t{\n\t\treturn p;\n\t}\n}\n\nstd::string Filesystem::getExecutablePath() const\n{\n#if defined(LOVE_MACOS) || defined(LOVE_IOS)\n\treturn love::apple::getExecutablePath();\n#elif defined(LOVE_WINDOWS)\n\n\twchar_t buffer[MAX_PATH + 1] = {0};\n\n\tif (GetModuleFileNameW(nullptr, buffer, MAX_PATH) == 0)\n\t\treturn \"\";\n\n\treturn to_utf8(buffer);\n\n#elif defined(LOVE_LINUX)\n\n\tchar buffer[2048] = {0};\n\n\tssize_t len = readlink(\"/proc/self/exe\", buffer, 2048);\n\tif (len <= 0)\n\t\treturn \"\";\n\n\treturn std::string(buffer, len);\n\n#else\n#error Missing implementation for Filesystem::getExecutablePath!\n#endif\n}\n\nSTRINGMAP_CLASS_BEGIN(Filesystem, Filesystem::FileType, Filesystem::FILETYPE_MAX_ENUM, fileType)\n{\n\t{ \"file\",      Filesystem::FILETYPE_FILE      },\n\t{ \"directory\", Filesystem::FILETYPE_DIRECTORY },\n\t{ \"symlink\",   Filesystem::FILETYPE_SYMLINK   },\n\t{ \"other\",     Filesystem::FILETYPE_OTHER     },\n}\nSTRINGMAP_CLASS_END(Filesystem, Filesystem::FileType, Filesystem::FILETYPE_MAX_ENUM, fileType)\n\nSTRINGMAP_CLASS_BEGIN(Filesystem, Filesystem::CommonPath, Filesystem::COMMONPATH_MAX_ENUM, commonPath)\n{\n\t{ \"appsavedir\",    Filesystem::COMMONPATH_APP_SAVEDIR    },\n\t{ \"appdocuments\",  Filesystem::COMMONPATH_APP_DOCUMENTS  },\n\t{ \"userhome\",      Filesystem::COMMONPATH_USER_HOME      },\n\t{ \"userappdata\",   Filesystem::COMMONPATH_USER_APPDATA   },\n\t{ \"userdesktop\",   Filesystem::COMMONPATH_USER_DESKTOP   },\n\t{ \"userdocuments\", Filesystem::COMMONPATH_USER_DOCUMENTS },\n}\nSTRINGMAP_CLASS_END(Filesystem, Filesystem::CommonPath, Filesystem::COMMONPATH_MAX_ENUM, commonPath)\n\nSTRINGMAP_CLASS_BEGIN(Filesystem, Filesystem::MountPermissions, Filesystem::MOUNT_PERMISSIONS_MAX_ENUM, mountPermissions)\n{\n\t{ \"read\",      Filesystem::MOUNT_PERMISSIONS_READ      },\n\t{ \"readwrite\", Filesystem::MOUNT_PERMISSIONS_READWRITE },\n}\nSTRINGMAP_CLASS_END(Filesystem, Filesystem::MountPermissions, Filesystem::MOUNT_PERMISSIONS_MAX_ENUM, mountPermissions)\n\nSTRINGMAP_CLASS_BEGIN(Filesystem, Filesystem::LoadMode, Filesystem::LOADMODE_MAX_ENUM, loadMode)\n{\n\t{ \"b\",  Filesystem::LOADMODE_BINARY},\n\t{ \"t\",  Filesystem::LOADMODE_TEXT  },\n\t{ \"bt\", Filesystem::LOADMODE_ANY   }\n}\nSTRINGMAP_CLASS_END(Filesystem, Filesystem::LoadMode, Filesystem::LOADMODE_MAX_ENUM, loadMode)\n\n} // filesystem\n} // love\n"
  },
  {
    "path": "src/modules/filesystem/Filesystem.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_FILESYSTEM_FILESYSTEM_H\n#define LOVE_FILESYSTEM_FILESYSTEM_H\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/Module.h\"\n#include \"common/int.h\"\n#include \"common/StringMap.h\"\n#include \"FileData.h\"\n#include \"File.h\"\n\n// C++\n#include <string>\n#include <vector>\n\n// In Windows, we would like to use \"LOVE\" as the\n// application folder, but in Linux, we like .love.\n#define LOVE_APPDATA_PREFIX \"\"\n#ifdef LOVE_WINDOWS\n#\tdefine LOVE_APPDATA_FOLDER \"LOVE\"\n#\tdefine LOVE_PATH_SEPARATOR \"/\"\n#\tdefine LOVE_MAX_PATH _MAX_PATH\n#else\n#\tif defined(LOVE_MACOS) || defined(LOVE_IOS)\n#\t\tdefine LOVE_APPDATA_FOLDER \"LOVE\"\n#\telif defined(LOVE_LINUX)\n#\t\tdefine LOVE_APPDATA_FOLDER \"love\"\n#\telse\n#\t\tdefine LOVE_APPDATA_PREFIX \".\"\n#\t\tdefine LOVE_APPDATA_FOLDER \"love\"\n#\tendif\n#\tdefine LOVE_PATH_SEPARATOR \"/\"\n#\tdefine LOVE_MAX_PATH MAXPATHLEN\n#endif\n\nnamespace love\n{\nnamespace filesystem\n{\n\nclass Filesystem : public Module\n{\npublic:\n\n\tenum FileType\n\t{\n\t\tFILETYPE_FILE,\n\t\tFILETYPE_DIRECTORY,\n\t\tFILETYPE_SYMLINK,\n\t\tFILETYPE_OTHER,\n\t\tFILETYPE_MAX_ENUM\n\t};\n\n\tenum CommonPath\n\t{\n\t\tCOMMONPATH_APP_SAVEDIR,\n\t\tCOMMONPATH_APP_DOCUMENTS,\n\t\tCOMMONPATH_USER_HOME,\n\t\tCOMMONPATH_USER_APPDATA,\n\t\tCOMMONPATH_USER_DESKTOP,\n\t\tCOMMONPATH_USER_DOCUMENTS,\n\t\tCOMMONPATH_MAX_ENUM\n\t};\n\n\tenum MountPermissions\n\t{\n\t\tMOUNT_PERMISSIONS_READ,\n\t\tMOUNT_PERMISSIONS_READWRITE,\n\t\tMOUNT_PERMISSIONS_MAX_ENUM\n\t};\n\n\tenum LoadMode\n\t{\n\t\tLOADMODE_BINARY,\n\t\tLOADMODE_TEXT,\n\t\tLOADMODE_ANY,\n\t\tLOADMODE_MAX_ENUM\n\t};\n\n\tstruct Info\n\t{\n\t\t// Numbers will be -1 if they cannot be determined.\n\t\tint64 size;\n\t\tint64 modtime;\n\t\tFileType type;\n\t\tbool readonly;\n\t};\n\n\tstatic love::Type type;\n\n\tvirtual ~Filesystem();\n\n\tvirtual void init(const char *arg0) = 0;\n\n\tvirtual void setFused(bool fused) = 0;\n\tvirtual bool isFused() const = 0;\n\n\t/**\n\t * This sets up the save directory. If the\n\t * it is already set up, nothing happens.\n\t * @return True on success, false otherwise.\n\t **/\n\tvirtual bool setupWriteDirectory() = 0;\n\n\t/**\n\t * This sets the save location on Android. \n\t * False for internal, true for external\n\t * @param external Bool for whether \n\t * Android should use external file storage.\n\t**/\n\tvirtual void setAndroidSaveExternal(bool useExternal = false);\n\n\t/**\n\t * Gets whether the Android save is external.\n\t * Returns a bool.\n\t**/\n\tvirtual bool isAndroidSaveExternal() const; \n\n\t/**\n\t * Sets the name of the save folder.\n\t * @param ident The name of the game. Will be used to\n\t * to create the folder in the LOVE data folder.\n\t **/\n\tvirtual bool setIdentity(const char *ident, bool appendToPath = false) = 0;\n\tvirtual const char *getIdentity() const = 0;\n\n\t/**\n\t * Sets the path to the game source.\n\t * This can only be set once.\n\t * @param source Path to a directory or a .love-file.\n\t **/\n\tvirtual bool setSource(const char *source) = 0;\n\n\t/**\n\t * Gets the path to the game source.\n\t * Returns a 0-length string if the source has not been set.\n\t **/\n\tvirtual const char *getSource() const = 0;\n\n\tvirtual bool mount(const char *archive, const char *mountpoint, bool appendToPath = false) = 0;\n\tvirtual bool mount(Data *data, const char *archivename, const char *mountpoint, bool appendToPath = false) = 0;\n\n\tvirtual bool mountFullPath(const char *archive, const char *mountpoint, MountPermissions permissions, bool appendToPath = false) = 0;\n\tvirtual bool mountCommonPath(CommonPath path, const char *mountpoint, MountPermissions permissions, bool appendToPath = false) = 0;\n\n\tvirtual bool unmount(const char *archive) = 0;\n\tvirtual bool unmount(Data *data) = 0;\n\tvirtual bool unmount(CommonPath path) = 0;\n\tvirtual bool unmountFullPath(const char *fullpath) = 0;\n\n\t/**\n\t * Opens a new File object from the specified path, using the given mode.\n\t **/\n\tvirtual File *openFile(const char *filename, File::Mode mode) const = 0;\n\n\tFile *openNativeFile(const char *path, File::Mode mode) const;\n\n\t/**\n\t * Creates a new FileData object. Data will be copied.\n\t * @param data Pointer to the data.\n\t * @param size The size of the data.\n\t * @param filename The full filename used to file type identification.\n\t **/\n\tvirtual FileData *newFileData(const void *data, size_t size, const char *filename) const;\n\n\t/**\n\t * Gets the full path for the given common path.\n\t */\n\tvirtual std::string getFullCommonPath(CommonPath path) = 0;\n\n\t/**\n\t * Gets the current working directory.\n\t **/\n\tvirtual const char *getWorkingDirectory() = 0;\n\n\t/**\n\t * Gets the user home directory.\n\t **/\n\tvirtual std::string getUserDirectory() = 0;\n\n\t/**\n\t * Gets the APPDATA directory. On Windows, this is the folder\n\t * in the %APPDATA% enviroment variable. On Linux, this is the\n\t * user home folder.\n\t **/\n\tvirtual std::string getAppdataDirectory() = 0;\n\n\t/**\n\t * Gets the full path of the save folder.\n\t **/\n\tvirtual std::string getSaveDirectory() = 0;\n\n\t/**\n\t * Gets the full path to the directory containing the game source.\n\t * For example if the game source is C:\\Games\\mygame.love, this will return\n\t * C:\\Games.\n\t **/\n\tvirtual std::string getSourceBaseDirectory() const = 0;\n\n\t/**\n\t * Gets the real directory path containing the file.\n\t **/\n\tvirtual std::string getRealDirectory(const char *filename) const = 0;\n\n\t/**\n\t * Gets whether anything exists at the specified path.\n\t **/\n\tvirtual bool exists(const char *filepath) const = 0;\n\n\t/**\n\t * Gets information about the item at the specified filepath. Returns false\n\t * if nothing exists at the path.\n\t **/\n\tvirtual bool getInfo(const char *filepath, Info &info) const = 0;\n\n\t/**\n\t * Creates a directory. Write dir must be set.\n\t * @param dir The directory to create.\n\t **/\n\tvirtual bool createDirectory(const char *dir) = 0;\n\n\t/**\n\t * Removes a file (or directory).\n\t * @param file The file or directory to remove.\n\t **/\n\tvirtual bool remove(const char *file) = 0;\n\n\t/**\n\t * Reads data from a file.\n\t * @param filename The name of the file to read from.\n\t * @param size The size in bytes of the data to read.\n\t **/\n\tvirtual FileData *read(const char *filename, int64 size) const = 0;\n\tvirtual FileData *read(const char *filename) const = 0;\n\n\t/**\n\t * Write data to a file.\n\t * @param filename The name of the file to write to.\n\t * @param data The data to write.\n\t * @param size The size in bytes of the data to write.\n\t **/\n\tvirtual void write(const char *filename, const void *data, int64 size) const = 0;\n\n\t/**\n\t * Append data to a file, creating it if it doesn't exist.\n\t * @param filename The name of the file to write to.\n\t * @param data The data to append.\n\t * @param size The size in bytes of the data to append.\n\t **/\n\tvirtual void append(const char *filename, const void *data, int64 size) const = 0;\n\n\t/**\n\t * This \"native\" method returns a table of all\n\t * files in a given directory.\n\t **/\n\tvirtual bool getDirectoryItems(const char *dir, std::vector<std::string> &items) = 0;\n\n\t/**\n\t * Enable or disable symbolic link support in love.filesystem.\n\t **/\n\tvirtual void setSymlinksEnabled(bool enable) = 0;\n\n\t/**\n\t * Gets whether symbolic link support is enabled.\n\t **/\n\tvirtual bool areSymlinksEnabled() const = 0;\n\n\t// Require path accessors\n\t// Not const because it's R/W\n\tvirtual std::vector<std::string> &getRequirePath() = 0;\n\tvirtual std::vector<std::string> &getCRequirePath() = 0;\n\n\t/**\n\t * Allows a full (OS-dependent) path to be used with Filesystem::mount.\n\t **/\n\tvirtual void allowMountingForPath(const std::string &path) = 0;\n\n\t/**\n\t * Gets whether the given full (OS-dependent) path is a directory.\n\t **/\n\tvirtual bool isRealDirectory(const std::string &path) const;\n\n\t/**\n\t * Recursively creates a directory at the given full OS-dependent path.\n\t **/\n\tvirtual bool createRealDirectory(const std::string &path);\n\n\t/**\n\t * Converts the given real path to its canonical version (e.g. resolving\n\t * '..', '.', relative paths, etc).\n\t **/\n\tvirtual std::string canonicalizeRealPath(const std::string &path) const;\n\n\t/**\n\t * Gets the full platform-dependent path to the executable.\n\t **/\n\tvirtual std::string getExecutablePath() const;\n\n\tSTRINGMAP_CLASS_DECLARE(FileType);\n\tSTRINGMAP_CLASS_DECLARE(CommonPath);\n\tSTRINGMAP_CLASS_DECLARE(MountPermissions);\n\tSTRINGMAP_CLASS_DECLARE(LoadMode);\n\nprotected:\n\n\tFilesystem(const char *name);\n\nprivate:\n\n\tbool getRealPathType(const std::string &path, FileType &ftype) const;\n\n\t// Should we save external or internal for Android\n\tbool useExternal = false;\n\n}; // Filesystem\n\n} // filesystem\n} // love\n\n#endif // LOVE_FILESYSTEM_FILESYSTEM_H\n"
  },
  {
    "path": "src/modules/filesystem/NativeFile.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"NativeFile.h\"\n\n// C\n#include <cstring>\n\n// SDL\n#include <SDL3/SDL_iostream.h>\n\nnamespace love\n{\nnamespace filesystem\n{\n\nNativeFile::NativeFile(const std::string &filename, Mode mode)\n: filename(filename)\n, file(nullptr)\n, mode(MODE_CLOSED)\n, buffer(nullptr)\n, bufferMode(BUFFER_NONE)\n, bufferSize(0)\n, bufferUsed(0)\n{\n\tif (!open(mode))\n\t\tthrow love::Exception(\"Could not open file at path %s\", filename.c_str());\n}\n\nNativeFile::NativeFile(const NativeFile &other)\n: filename(other.filename)\n, file(nullptr)\n, mode(MODE_CLOSED)\n, buffer(nullptr)\n, bufferMode(other.bufferMode)\n, bufferSize(other.bufferSize)\n, bufferUsed(0)\n{\n\tif (!open(other.mode))\n\t\tthrow love::Exception(\"Could not open file at path %s\", filename.c_str());\n}\n\nNativeFile::~NativeFile()\n{\n\tif (mode != MODE_CLOSED)\n\t\tclose();\n}\n\nNativeFile *NativeFile::clone()\n{\n\treturn new NativeFile(*this);\n}\n\nbool NativeFile::open(Mode newmode)\n{\n\tif (newmode == MODE_CLOSED)\n\t{\n\t\tclose();\n\t\treturn true;\n\t}\n\n\t// File already open?\n\tif (file != nullptr)\n\t\treturn false;\n\n\tfile = SDL_IOFromFile(filename.c_str(), getModeString(newmode));\n\tif (file == nullptr)\n\t\tthrow love::Exception(\"Could not open file %s: %s\", filename.c_str(), SDL_GetError());\n\n\tmode = newmode;\n\n\tif (!setupBuffering(bufferMode, bufferSize))\n\t{\n\t\tSDL_CloseIO(file);\n\t\tfile = nullptr;\n\t\tmode = MODE_CLOSED;\n\t\tthrow love::Exception(\"Could not open file %s: cannot setup buffering\", filename.c_str());\n\t}\n\n\treturn file != nullptr;\n}\n\nbool NativeFile::close()\n{\n\tif (file == nullptr)\n\t\treturn false;\n\n\tbool success = flush();\n\tsuccess = SDL_CloseIO(file) && success;\n\t// Regardless whetever SDL_CloseIO succeeded or failed, the `file`\n\t// pointer is no longer valid.\n\tmode = MODE_CLOSED;\n\tfile = nullptr;\n\tsetupBuffering(BUFFER_NONE, 0);\n\n\treturn success;\n}\n\nbool NativeFile::isOpen() const\n{\n\treturn mode != MODE_CLOSED && file != nullptr;\n}\n\nint64 NativeFile::getSize()\n{\n\tint64 size = -1;\n\tif (!file)\n\t{\n\t\topen(MODE_READ);\n\t\tsize = SDL_GetIOSize(file);\n\t\tclose();\n\t}\n\telse\n\t\tsize = SDL_GetIOSize(file);\n\n\treturn std::max<int64>(size, -1);\n}\n\nint64 NativeFile::read(void *dst, int64 size)\n{\n\tif (!file || mode != MODE_READ)\n\t\tthrow love::Exception(\"File is not opened for reading.\");\n\n\tif (size < 0)\n\t\tthrow love::Exception(\"Invalid read size.\");\n\n\t// Are we using buffers?\n\tif (buffer)\n\t\treturn bufferedRead(dst, size);\n\n\t// No buffering.\n\tsize_t read = SDL_ReadIO(file, dst, (size_t) size);\n\treturn (int64) read;\n}\n\nbool NativeFile::write(const void *data, int64 size)\n{\n\tif (!file || (mode != MODE_WRITE && mode != MODE_APPEND))\n\t\tthrow love::Exception(\"File is not opened for writing.\");\n\n\tif (size < 0)\n\t\tthrow love::Exception(\"Invalid write size.\");\n\n\tif (buffer)\n\t{\n\t\tif (!bufferedWrite(data, size))\n\t\t\treturn false;\n\n\t\t// There's newline? force flush\n\t\tif (bufferMode == BUFFER_LINE && memchr(data, '\\n', size) != nullptr)\n\t\t{\n\t\t\tif (!flush())\n\t\t\t\treturn false;\n\t\t}\n\t}\n\telse\n\t\treturn SDL_WriteIO(file, data, (size_t) size) == (size_t) size;\n\n\treturn true;\n}\n\nbool NativeFile::flush()\n{\n\tswitch (mode)\n\t{\n\t\tcase MODE_READ:\n\t\t{\n\t\t\tif (buffer)\n\t\t\t{\n\t\t\t\t// Seek to already consumed buffer\n\t\t\t\tif (SDL_SeekIO(file, (size_t) (bufferUsed - bufferSize), SDL_IO_SEEK_CUR) < 0)\n\t\t\t\t\treturn false;\n\n\t\t\t\t// Mark as depleted\n\t\t\t\tbufferUsed = bufferSize;\n\t\t\t}\n\t\t\t\n\t\t\treturn true;\n\t\t}\n\t\tcase MODE_WRITE:\n\t\tcase MODE_APPEND:\n\t\t{\n\t\t\tif (buffer && bufferUsed > 0)\n\t\t\t{\n\t\t\t\tsize_t written = SDL_WriteIO(file, buffer, (size_t) bufferUsed);\n\t\t\t\tmemmove(buffer, buffer + written, (size_t) bufferSize - written);\n\t\t\t\tbufferUsed = std::max<int64>(bufferUsed - (int64) written, 0);\n\t\t\t}\n\n\t\t\treturn SDL_FlushIO(file);\n\t\t}\n\t\tdefault:\n\t\t\tthrow love::Exception(\"Invalid file mode.\");\n\t}\n\n\t// Make sure compiler doesn't emit warnings.\n\treturn true;\n}\n\nbool NativeFile::isEOF()\n{\n\treturn file == nullptr || tell() >= getSize();\n}\n\nint64 NativeFile::tell()\n{\n\tif (file == nullptr)\n\t\treturn -1;\n\n\tint64 offset = 0;\n\tif (buffer)\n\t{\n\t\tswitch (mode)\n\t\t{\n\t\t\tcase MODE_READ:\n\t\t\t\t// Note: We want offset be negative for reading\n\t\t\t\toffset = bufferUsed - bufferSize;\n\t\t\t\tbreak;\n\t\t\tcase MODE_WRITE:\n\t\t\tcase MODE_APPEND:\n\t\t\t\toffset = bufferUsed;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn SDL_TellIO(file) + offset;\n}\n\nbool NativeFile::seek(int64 pos, SeekOrigin origin)\n{\n\tif (file == nullptr)\n\t\treturn false;\n\n\tif (mode == MODE_APPEND)\n\t\t// FIXME: PhysFS \"append\" allows the user to\n\t\t// seek the write pointer, but it's not possible\n\t\t// to do so with standard fopen-style modes.\n\t\treturn false;\n\n\tSDL_IOWhence whence = SDL_IO_SEEK_SET;\n\tif (origin == SEEKORIGIN_CURRENT)\n\t\twhence = SDL_IO_SEEK_CUR;\n\telse if (origin == SEEKORIGIN_END)\n\t\twhence = SDL_IO_SEEK_END;\n\n\tif (mode == MODE_READ && whence == SDL_IO_SEEK_SET && buffer)\n\t{\n\t\t// Retain the buffer if it's forward.\n\t\t// TODO: Handle SDL_IO_SEEK_CUR.\n\t\tint64 offset = pos - tell();\n\t\tif (offset >= 0 && (offset + bufferUsed) < bufferSize)\n\t\t{\n\t\t\t// Seek success\n\t\t\tbufferUsed += offset;\n\t\t\treturn true;\n\t\t}\n\n\t\t// Note: We don't handle backward seek because the\n\t\t// contents past `bufferUsed` is not necessarily valid.\n\t}\n\n\t// If the read is buffered, the flush() will ensure\n\t// the read pointer is in correct place before doing seek.\n\treturn flush() && (SDL_SeekIO(file, pos, whence) >= 0);\n}\n\nbool NativeFile::setBuffer(BufferMode bufmode, int64 size)\n{\n\t// BUFSIZ in Windows is too low on 512 bytes.\n\t// Make sure the default buffer size is at least 4KiB.\n\tconstexpr int64 DEFAULT_BUFFER_SIZE = std::max<int64>(BUFSIZ, 4096);\n\n\tif (size < 0)\n\t\treturn false;\n\telse if (sizeof(uintptr_t) == 4 && size > 0x80000000LL)\n\t\t// Safeguards against 32-bit integer truncation?\n\t\treturn false;\n\n\tif (bufmode == BUFFER_NONE)\n\t\tsize = 0;\n\telse if (size == 0)\n\t\tsize = DEFAULT_BUFFER_SIZE;\n\n\t// If there's no file handle, we'll setup the buffering later in open()\n\tif (file)\n\t{\n\t\t// Ideally we don't want to flush if user request larger buffer size\n\t\t// but the added complexity is not worth it for now.\n\t\tif (!flush())\n\t\t\treturn false;\n\n\t\tif (!setupBuffering(bufmode, size))\n\t\t\treturn false;\n\t}\n\n\tbufferMode = bufmode;\n\tbufferSize = size;\n\n\treturn true;\n}\n\nFile::BufferMode NativeFile::getBuffer(int64 &size) const\n{\n\tsize = bufferSize;\n\treturn bufferMode;\n}\n\nconst std::string &NativeFile::getFilename() const\n{\n\treturn filename;\n}\n\nFile::Mode NativeFile::getMode() const\n{\n\treturn mode;\n}\n\nbool NativeFile::setupBuffering(BufferMode mode, int64 bufferSize)\n{\n\tint8 *newbuf = nullptr;\n\tif (mode != BUFFER_NONE)\n\t{\n\t\tnewbuf = new (std::nothrow) int8[(size_t) bufferSize];\n\t\tif (newbuf == nullptr)\n\t\t\treturn false;\n\t}\n\n\tdelete[] buffer;\n\tbuffer = newbuf;\n\tbufferUsed = this->mode == MODE_READ ? bufferSize : 0;\n\treturn true;\n}\n\nint64 NativeFile::bufferedRead(void *dst, int64 size)\n{\n\tint8 *ptr = (int8 *) dst;\n\tint64 readed = 0;\n\n\twhile (size > 0)\n\t{\n\t\tint64 available = bufferSize - bufferUsed;\n\n\t\tif (available > 0)\n\t\t{\n\t\t\t// There's leftover buffers.\n\t\t\tsize_t copy = (size_t) std::min(size, available);\n\t\t\tmemcpy(ptr, buffer + (size_t) bufferUsed, copy);\n\n\t\t\tptr += copy;\n\t\t\tsize -= (int64) copy;\n\t\t\tbufferUsed += (int64) copy;\n\t\t\treaded += copy;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Buffer is empty. Fill it.\n\t\t\tsize_t ureaded = SDL_ReadIO(file, buffer, (size_t) bufferSize);\n\t\t\tbufferUsed = bufferSize - (int64) ureaded;\n\n\t\t\tif (ureaded == 0)\n\t\t\t\tbreak;\n\n\t\t\tif (bufferUsed > 0)\n\t\t\t\t// Shift the buffer so code above can properly index it\n\t\t\t\tmemmove(buffer + bufferUsed, buffer, ureaded);\n\t\t}\n\t}\n\n\treturn readed;\n}\n\nbool NativeFile::bufferedWrite(const void *data, int64 size)\n{\n\tconst int8 *ptr = (const int8 *) data;\n\n\tint64 inBuffer = std::min<int64>(size, bufferSize - bufferUsed);\n\tif (inBuffer > 0)\n\t{\n\t\t// Put the data into buffer\n\t\tmemcpy(buffer + bufferUsed, ptr, (size_t) inBuffer);\n\t\tbufferUsed += inBuffer;\n\t\tsize -= inBuffer;\n\t\tptr += (size_t) inBuffer;\n\t}\n\n\tif (size > 0)\n\t{\n\t\t// This means the buffer is full. Soft-flush the buffers.\n\t\tsize_t bufferWritten = SDL_WriteIO(file, buffer, bufferSize);\n\t\tbufferUsed -= bufferWritten;\n\n\t\tif (bufferWritten < (size_t) bufferSize)\n\t\t{\n\t\t\tmemmove(buffer, buffer + bufferWritten, (size_t) bufferSize - bufferWritten);\n\t\t\treturn false;\n\t\t}\n\n\t\tint64 directWriteCount = size / bufferSize;\n\t\tif (directWriteCount > 0)\n\t\t{\n\t\t\t// Batch write from the source pointer directly, bypassing\n\t\t\t// our buffer.\n\t\t\tsize_t targetDirectBuffer = (size_t) (directWriteCount * bufferSize);\n\t\t\tif (SDL_WriteIO(file, ptr, targetDirectBuffer) < targetDirectBuffer)\n\t\t\t\treturn false;\n\n\t\t\tptr += targetDirectBuffer;\n\t\t\tsize -= targetDirectBuffer;\n\t\t}\n\n\t\tif (size > 0)\n\t\t{\n\t\t\t// Store the rest in our buffer.\n\t\t\t// Note that bufferUsed will always be 0 here.\n\t\t\tmemcpy(buffer, ptr, size);\n\t\t\tbufferUsed = size;\n\t\t}\n\n\t\treturn SDL_FlushIO(file);\n\t}\n\n\t// If above codeblock is not taken, it means the\n\t// whole data goes into our buffer. Report success.\n\treturn true;\n}\n\nconst char *NativeFile::getModeString(Mode mode)\n{\n\tswitch (mode)\n\t{\n\tcase File::MODE_CLOSED:\n\tdefault:\n\t\treturn \"c\";\n\tcase File::MODE_READ:\n\t\treturn \"rb\";\n\tcase File::MODE_WRITE:\n\t\treturn \"wb\";\n\tcase File::MODE_APPEND:\n\t\treturn \"ab\";\n\t}\n}\n\n} // filesystem\n} // love\n"
  },
  {
    "path": "src/modules/filesystem/NativeFile.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"common/config.h\"\n#include \"File.h\"\n\n// C\n#include <cstdio>\n\ntypedef struct SDL_IOStream SDL_IOStream;\n\nnamespace love\n{\nnamespace filesystem\n{\n\n/**\n * File which uses C's stdio. Filenames are system-dependent full paths.\n **/\nclass NativeFile : public File\n{\npublic:\n\n\tNativeFile(const std::string &filename, Mode mode);\n\tvirtual ~NativeFile();\n\n\t// Implements Stream.\n\tNativeFile *clone() override;\n\tint64 read(void* dst, int64 size) override;\n\tbool write(const void* data, int64 size) override;\n\tbool flush() override;\n\tint64 getSize() override;\n\tint64 tell() override;\n\tbool seek(int64 pos, SeekOrigin origin) override;\n\n\t// Implements File.\n\tusing File::read;\n\tusing File::write;\n\tbool open(Mode mode) override;\n\tbool close() override;\n\tbool isOpen() const override;\n\tbool isEOF() override;\n\tbool setBuffer(BufferMode bufmode, int64 size) override;\n\tBufferMode getBuffer(int64 &size) const override;\n\tMode getMode() const override;\n\tconst std::string &getFilename() const override;\n\nprivate:\n\n\tNativeFile(const NativeFile &other);\n\tbool setupBuffering(BufferMode mode, int64 bufferSize);\n\tint64 bufferedRead(void* dst, int64 size);\n\tbool bufferedWrite(const void* data, int64 size);\n\n\tstatic const char *getModeString(Mode mode);\n\n\tstd::string filename;\n\n\tSDL_IOStream *file;\n\n\tMode mode;\n\n\tint8 *buffer;\n\tBufferMode bufferMode;\n\tint64 bufferSize;\n\tint64 bufferUsed;\n\n}; // NativeFile\n\n} // filesystem\n} // love\n"
  },
  {
    "path": "src/modules/filesystem/physfs/File.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"File.h\"\n\n// STD\n#include <cstring>\n\n// LOVE\n#include \"Filesystem.h\"\n#include \"filesystem/FileData.h\"\n\n#ifdef LOVE_ANDROID\n#include \"common/android.h\"\n#endif\n\nnamespace love\n{\nnamespace filesystem\n{\n\nnamespace physfs\n{\n\nstatic bool setupWriteDirectory()\n{\n\tauto fs = Module::getInstance<love::filesystem::Filesystem>(Module::M_FILESYSTEM);\n\treturn fs != nullptr && fs->setupWriteDirectory();\n}\n\nFile::File(const std::string &filename, Mode mode)\n\t: filename(filename)\n\t, file(nullptr)\n\t, mode(MODE_CLOSED)\n\t, bufferMode(BUFFER_NONE)\n\t, bufferSize(0)\n{\n\tif (!open(mode))\n\t\tthrow love::Exception(\"Could not open file at path %s\", filename.c_str());\n\n#ifdef LOVE_ANDROID\n\t// In Android with t.externalstorage = true, make sure the file opened or\n\t// created in the save directory has permissions of ugo+rw (0666) so that\n\t// it's accessible through MTP.\n\tauto fs = Module::getInstance<love::filesystem::Filesystem>(Module::M_FILESYSTEM);\n\tif (fs != nullptr && fs->isAndroidSaveExternal())\n\t{\n\t\tconst char *realdir = PHYSFS_getRealDir(filename.c_str());\n\t\tconst std::string &savedir = fs->getFullCommonPath(Filesystem::COMMONPATH_APP_SAVEDIR);\n\n\t\tif (realdir != nullptr && strcmp(realdir, savedir.c_str()) == 0)\n\t\t\tlove::android::fixupPermissionSingleFile(savedir, filename);\n\t}\n#endif\n}\n\nFile::File(const File &other)\n\t: filename(other.filename)\n\t, file(nullptr)\n\t, mode(MODE_CLOSED)\n\t, bufferMode(other.bufferMode)\n\t, bufferSize(other.bufferSize)\n{\n\tif (!open(other.mode))\n\t\tthrow love::Exception(\"Could not open file at path %s\", filename.c_str());\n}\n\nFile::~File()\n{\n\tif (mode != MODE_CLOSED)\n\t\tclose();\n}\n\nFile *File::clone()\n{\n\treturn new File(*this);\n}\n\nbool File::open(Mode mode)\n{\n\tif (mode == MODE_CLOSED)\n\t{\n\t\tclose();\n\t\treturn true;\n\t}\n\n\tif (!PHYSFS_isInit())\n\t\tthrow love::Exception(\"PhysFS is not initialized.\");\n\n\t// File must exist if read mode.\n\tif ((mode == MODE_READ) && !PHYSFS_exists(filename.c_str()))\n\t\tthrow love::Exception(\"Could not open file %s. Does not exist.\", filename.c_str());\n\n\t// Check whether the write directory is set.\n\tif ((mode == MODE_APPEND || mode == MODE_WRITE) && !setupWriteDirectory())\n\t\tthrow love::Exception(\"Could not set write directory.\");\n\n\t// File already open?\n\tif (file != nullptr)\n\t\treturn false;\n\n\tPHYSFS_File *handle = nullptr;\n\n\tswitch (mode)\n\t{\n\tcase MODE_READ:\n\t\thandle = PHYSFS_openRead(filename.c_str());\n\t\tbreak;\n\tcase MODE_APPEND:\n\t\thandle = PHYSFS_openAppend(filename.c_str());\n\t\tbreak;\n\tcase MODE_WRITE:\n\t\thandle = PHYSFS_openWrite(filename.c_str());\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\n\tif (handle == nullptr)\n\t{\n\t\tconst char *err = PHYSFS_getErrorByCode(PHYSFS_getLastErrorCode());\n\t\tif (err == nullptr)\n\t\t\terr = \"unknown error\";\n\t\tthrow love::Exception(\"Could not open file %s (%s)\", filename.c_str(), err);\n\t}\n\n\tfile = handle;\n\n\tthis->mode = mode;\n\n\tif (file != nullptr && !setBuffer(bufferMode, bufferSize))\n\t{\n\t\t// Revert to buffer defaults if we don't successfully set the buffer.\n\t\tbufferMode = BUFFER_NONE;\n\t\tbufferSize = 0;\n\t}\n\n\treturn (file != nullptr);\n}\n\nbool File::close()\n{\n\tif (file == nullptr || !PHYSFS_close(file))\n\t\treturn false;\n\n\tmode = MODE_CLOSED;\n\tfile = nullptr;\n\n\treturn true;\n}\n\nbool File::isOpen() const\n{\n\treturn mode != MODE_CLOSED && file != nullptr;\n}\n\nint64 File::getSize()\n{\n\t// If the file is closed, open it to\n\t// check the size.\n\tif (file == nullptr)\n\t{\n\t\topen(MODE_READ);\n\t\tint64 size = (int64) PHYSFS_fileLength(file);\n\t\tclose();\n\t\treturn size;\n\t}\n\n\treturn (int64) PHYSFS_fileLength(file);\n}\n\nint64 File::read(void *dst, int64 size)\n{\n\tif (!file || mode != MODE_READ)\n\t\tthrow love::Exception(\"File is not opened for reading.\");\n\n\tif (size < 0)\n\t\tthrow love::Exception(\"Invalid read size.\");\n\n\treturn PHYSFS_readBytes(file, dst, (PHYSFS_uint64) size);\n}\n\nbool File::write(const void *data, int64 size)\n{\n\tif (!file || (mode != MODE_WRITE && mode != MODE_APPEND))\n\t\tthrow love::Exception(\"File is not opened for writing.\");\n\n\tif (size < 0)\n\t\tthrow love::Exception(\"Invalid write size.\");\n\n\t// Try to write.\n\tint64 written = PHYSFS_writeBytes(file, data, (PHYSFS_uint64) size);\n\n\t// Check that correct amount of data was written.\n\tif (written != size)\n\t\treturn false;\n\n\t// Manually flush the buffer in BUFFER_LINE mode if we find a newline.\n\tif (bufferMode == BUFFER_LINE && bufferSize > size)\n\t{\n\t\tif (memchr(data, '\\n', (size_t) size) != nullptr)\n\t\t\tflush();\n\t}\n\n\treturn true;\n}\n\nbool File::flush()\n{\n\tif (!file || (mode != MODE_WRITE && mode != MODE_APPEND))\n\t\tthrow love::Exception(\"File is not opened for writing.\");\n\n\treturn PHYSFS_flush(file) != 0;\n}\n\nbool File::isEOF()\n{\n\treturn file == nullptr || PHYSFS_eof(file);\n}\n\nint64 File::tell()\n{\n\tif (file == nullptr)\n\t\treturn -1;\n\n\treturn (int64) PHYSFS_tell(file);\n}\n\nbool File::seek(int64 pos, SeekOrigin origin)\n{\n\tif (file != nullptr)\n\t{\n\t\tif (origin == SEEKORIGIN_CURRENT)\n\t\t\tpos += tell();\n\t\telse if (origin == SEEKORIGIN_END)\n\t\t\tpos += getSize();\n\t}\n\n\tif (pos < 0)\n\t\treturn false;\n\n\treturn file != nullptr && PHYSFS_seek(file, (PHYSFS_uint64) pos) != 0;\n}\n\nbool File::setBuffer(BufferMode bufmode, int64 size)\n{\n\tif (size < 0)\n\t\treturn false;\n\n\t// If the file isn't open, we'll make sure the buffer values are set in\n\t// File::open.\n\tif (!isOpen())\n\t{\n\t\tbufferMode = bufmode;\n\t\tbufferSize = size;\n\t\treturn true;\n\t}\n\n\tint ret = 1;\n\n\tswitch (bufmode)\n\t{\n\tcase BUFFER_NONE:\n\tdefault:\n\t\tret = PHYSFS_setBuffer(file, 0);\n\t\tsize = 0;\n\t\tbreak;\n\tcase BUFFER_LINE:\n\tcase BUFFER_FULL:\n\t\tret = PHYSFS_setBuffer(file, size);\n\t\tbreak;\n\t}\n\n\tif (ret == 0)\n\t\treturn false;\n\n\tbufferMode = bufmode;\n\tbufferSize = size;\n\n\treturn true;\n}\n\nFile::BufferMode File::getBuffer(int64 &size) const\n{\n\tsize = bufferSize;\n\treturn bufferMode;\n}\n\nconst std::string &File::getFilename() const\n{\n\treturn filename;\n}\n\nfilesystem::File::Mode File::getMode() const\n{\n\treturn mode;\n}\n\n} // physfs\n} // filesystem\n} // love\n"
  },
  {
    "path": "src/modules/filesystem/physfs/File.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_FILESYSTEM_PHYSFS_FILE_H\n#define LOVE_FILESYSTEM_PHYSFS_FILE_H\n\n// LOVE\n#include \"common/config.h\"\n#include \"filesystem/File.h\"\n\n// PhysFS\n#include \"libraries/physfs/physfs.h\"\n\n// STD\n#include <string>\n\nnamespace love\n{\nnamespace filesystem\n{\nnamespace physfs\n{\n\nclass File : public love::filesystem::File\n{\npublic:\n\n\t/**\n\t * Constructs an File with the given ilename.\n\t * @param filename The relative filepath of the file to load.\n\t **/\n\tFile(const std::string &filename, Mode mode);\n\n\tvirtual ~File();\n\n\t// Implements Stream.\n\tFile *clone() override;\n\tint64 read(void* dst, int64 size) override;\n\tbool write(const void* data, int64 size) override;\n\tbool flush() override;\n\tint64 getSize() override;\n\tbool seek(int64 pos, SeekOrigin origin) override;\n\tint64 tell() override;\n\n\t// Implements love::filesystem::File.\n\tusing love::filesystem::File::read;\n\tusing love::filesystem::File::write;\n\tbool open(Mode mode) override;\n\tbool close() override;\n\tbool isOpen() const override;\n\tbool isEOF() override;\n\tbool setBuffer(BufferMode bufmode, int64 size) override;\n\tBufferMode getBuffer(int64 &size) const override;\n\tMode getMode() const override;\n\tconst std::string &getFilename() const override;\n\nprivate:\n\n\tFile(const File &other);\n\n\t// filename\n\tstd::string filename;\n\n\t// PHYSFS File handle.\n\tPHYSFS_File *file;\n\n\t// The current mode of the file.\n\tMode mode;\n\n\tBufferMode bufferMode;\n\tint64 bufferSize;\n\n}; // File\n\n} // physfs\n} // filesystem\n} // love\n\n#endif // LOVE_FILESYSTEM_PHYSFS_FILE_H\n"
  },
  {
    "path": "src/modules/filesystem/physfs/Filesystem.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include <iostream>\n#include <sstream>\n#include <algorithm>\n\n#include \"common/utf8.h\"\n#include \"common/b64.h\"\n\n#include \"Filesystem.h\"\n#include \"File.h\"\n#include \"PhysfsIo.h\"\n\n// PhysFS\n#include \"libraries/physfs/physfs.h\"\n\n// For great CWD. (Current Working Directory)\n// Using this instead of boost::filesystem which totally\n// cramped our style.\n#ifdef LOVE_WINDOWS\n#\tdefine WIN32_LEAN_AND_MEAN\n#\tinclude <windows.h>\n#\tinclude <direct.h>\n#\tinclude <initguid.h>\n#\tinclude <Shlobj.h>\n#\tinclude <Knownfolders.h>\n#else\n#\tinclude <sys/param.h>\n#\tinclude <unistd.h>\n#endif\n\n#if defined(LOVE_IOS) || defined(LOVE_MACOS)\n#\tinclude \"common/apple.h\"\n#endif\n\n#ifdef LOVE_IOS\n#\tinclude \"common/ios.h\"\n#endif\n\n#ifdef LOVE_MACOS\n#\tinclude \"common/macos.h\"\n#endif\n\n#include <string>\n\n#ifdef LOVE_ANDROID\n#include <SDL3/SDL.h>\n#include \"common/android.h\"\n#endif\n\nnamespace love\n{\nnamespace filesystem\n{\nnamespace physfs\n{\n\nstatic std::string normalize(const std::string &input)\n{\n\tstd::stringstream out;\n\tbool seenSep = false, isSep = false;\n\tfor (size_t i = 0; i < input.size(); ++i)\n\t{\n\t\tisSep = (input[i] == LOVE_PATH_SEPARATOR[0]);\n\t\tif (!isSep || !seenSep)\n\t\t\tout << input[i];\n\t\tseenSep = isSep;\n\t}\n\n\treturn out.str();\n}\n\nstatic const Filesystem::CommonPath appCommonPaths[] =\n{\n\tFilesystem::COMMONPATH_APP_SAVEDIR,\n\tFilesystem::COMMONPATH_APP_DOCUMENTS\n};\n\nstatic bool isAppCommonPath(Filesystem::CommonPath path)\n{\n\tswitch (path)\n\t{\n\tcase Filesystem::COMMONPATH_APP_SAVEDIR:\n\tcase Filesystem::COMMONPATH_APP_DOCUMENTS:\n\t\treturn true;\n\tdefault:\n\t\treturn false;\n\t}\n}\n\nstatic bool isMounted(const std::string &path)\n{\n\tchar **mountedpaths = PHYSFS_getSearchPath();\n\tif (mountedpaths == nullptr)\n\t\treturn false;\n\n\tbool mounted = false;\n\tfor (char **p = mountedpaths; *p != nullptr; p++)\n\t{\n\t\tchar *mountedpath = *p;\n\t\tif (strcmp(path.c_str(), mountedpath) == 0)\n\t\t{\n\t\t\tmounted = true;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tPHYSFS_freeList(mountedpaths);\n\treturn mounted;\n}\n\nFilesystem::Filesystem()\n\t: love::filesystem::Filesystem(\"love.filesystem.physfs\")\n\t, appendIdentityToPath(false)\n\t, fused(false)\n\t, fusedSet(false)\n\t, fullPaths()\n\t, commonPathMountInfo()\n\t, saveDirectoryNeedsMounting(false)\n{\n\trequirePath = {\"?.lua\", \"?/init.lua\"};\n\tcRequirePath = {\"??\"};\n}\n\nFilesystem::~Filesystem()\n{\n#ifdef LOVE_ANDROID\n\tlove::android::deinitializeVirtualArchive();\n#endif\n\n\tif (PHYSFS_isInit())\n\t\tPHYSFS_deinit();\n}\n\nvoid Filesystem::init(const char *arg0)\n{\n#ifdef LOVE_ANDROID\n\targ0 = love::android::getArg0();\n#endif\n\n\tif (!PHYSFS_init(arg0))\n\t\tthrow love::Exception(\"Failed to initialize filesystem: %s\", PHYSFS_getErrorByCode(PHYSFS_getLastErrorCode()));\n\n\t// Enable symlinks by default.\n\tsetSymlinksEnabled(true);\n}\n\nvoid Filesystem::setFused(bool fused)\n{\n\tif (fusedSet)\n\t\treturn;\n\tthis->fused = fused;\n\tfusedSet = true;\n}\n\nbool Filesystem::isFused() const\n{\n\tif (!fusedSet)\n\t\treturn false;\n\treturn fused;\n}\n\nbool Filesystem::setIdentity(const char *ident, bool appendToPath)\n{\n\tif (!PHYSFS_isInit())\n\t\treturn false;\n\n\tif (ident == nullptr || strlen(ident) == 0)\n\t\treturn false;\n\n\t// Validate whether re-mounting will work.\n\tfor (CommonPath p : appCommonPaths)\n\t{\n\t\tif (!commonPathMountInfo[p].mounted)\n\t\t\tcontinue;\n\n\t\t// If a file is still open, unmount will fail.\n\t\tstd::string fullpath = getFullCommonPath(p);\n\t\t\n\t\tif (!fullpath.empty())\n\t\t{\n\t\t\tstd::string canonpath = canonicalizeRealPath(fullpath);\n\t\t\tif (!PHYSFS_canUnmount(canonpath.c_str()))\n\t\t\t\treturn false;\n\t\t}\n\t}\n\n\tbool oldMountedCommonPaths[COMMONPATH_MAX_ENUM] = {false};\n\n\t// We don't want old save paths to accumulate when we set a new identity.\n\tfor (CommonPath p : appCommonPaths)\n\t{\n\t\toldMountedCommonPaths[p] = commonPathMountInfo[p].mounted;\n\t\tif (commonPathMountInfo[p].mounted)\n\t\t\tunmount(p);\n\t}\n\n\t// These will be re-populated by getFullCommonPath.\n\tfor (CommonPath p : appCommonPaths)\n\t\tfullPaths[p].clear();\n#ifdef LOVE_ANDROID\n\t// Ensure COMMONPATH_USER_APPDATA is also cleared in Android to ensure\n\t// `t.externalstorage` works as expected.\n\tfullPaths[COMMONPATH_USER_APPDATA].clear();\n#endif\n\n\t// Store the save directory. getFullCommonPath(COMMONPATH_APP_*) uses this.\n\tsaveIdentity = std::string(ident);\n\tappendIdentityToPath = appendToPath;\n\n\t// Try to mount as readwrite without creating missing directories in the\n\t// path hierarchy. If this fails, setupWriteDirectory will attempt to create\n\t// them and try again.\n\t// This is done so the save directory is only created on-demand.\n\tif (!mountCommonPathInternal(COMMONPATH_APP_SAVEDIR, nullptr, MOUNT_PERMISSIONS_READWRITE, appendToPath, false))\n\t\tsaveDirectoryNeedsMounting = true;\n\telse\n\t\tsaveDirectoryNeedsMounting = false;\n\n\t// Mount any other app common paths with directory creation immediately\n\t// instead of on-demand, since to get to this point they would have to be\n\t// explicitly mounted already beforehand.\n\tfor (CommonPath p : appCommonPaths)\n\t{\n\t\tif (oldMountedCommonPaths[p] && p != COMMONPATH_APP_SAVEDIR)\n\t\t{\n\t\t\t// TODO: error handling?\n\t\t\tauto info = commonPathMountInfo[p];\n\t\t\tmountCommonPathInternal(p, info.mountPoint.c_str(), info.permissions, appendToPath, true);\n\t\t}\n\t}\n\n\treturn true;\n}\n\nconst char *Filesystem::getIdentity() const\n{\n\treturn saveIdentity.c_str();\n}\n\nbool Filesystem::setSource(const char *source)\n{\n\tif (!PHYSFS_isInit())\n\t\treturn false;\n\n\t// Check whether directory is already set.\n\tif (!gameSource.empty())\n\t\treturn false;\n\n\tstd::string new_search_path = canonicalizeRealPath(source);\n\n#ifdef LOVE_ANDROID\n\tif (!love::android::createStorageDirectories())\n\t\tSDL_Log(\"Error creating storage directories!\");\n\n\tPHYSFS_Io *gameLoveIO;\n\tbool hasFusedGame = love::android::checkFusedGame((void **) &gameLoveIO);\n\n\tif (hasFusedGame)\n\t{\n\t\tif (gameLoveIO)\n\t\t{\n\t\t\tif (PHYSFS_mountIo(gameLoveIO, \".zip\", nullptr, 0)) {\n\t\t\t\tgameSource = new_search_path;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tgameLoveIO->destroy(gameLoveIO);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (!love::android::initializeVirtualArchive())\n\t\t\t{\n\t\t\t\tSDL_Log(\"Unable to mount AAsset: %s\", PHYSFS_getErrorByCode(PHYSFS_getLastErrorCode()));\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// See love::android::initializeVirtualArchive()\n\t\t\tgameSource = \"ASET.AASSET\";\n\t\t\treturn true;\n\t\t}\n\t}\n\n\ttry\n\t{\n\t\t// Is this content:// URIs?\n\t\tauto io = (PHYSFS_Io *) love::android::getIOFromContentProtocol(source);\n\n\t\tif (PHYSFS_mountIo(io, \"LOVE.FD\", nullptr, 0))\n\t\t{\n\t\t\tgameSource = source;\n\t\t\treturn true;\n\t\t}\n\n\t\tio->destroy(io);\n\t}\n\tcatch (const love::Exception &)\n\t{}\n#endif\n\n\tif (isMounted(new_search_path))\n\t\treturn false;\n\n\t// Add the directory.\n\tif (!PHYSFS_mount(new_search_path.c_str(), nullptr, 1))\n\t{\n\t\t// It's possible there is additional data at the end of the fused executable,\n\t\t// e.g. for signed windows executables (the signature).\n\t\t// In this case let's try a little bit harder to find the zip file.\n\t\t// This is not used by default because I assume that the physfs IOs are probably\n\t\t// more robust and more performant, so they should be favored, if possible.\n\t\tauto io = StripSuffixIo::create(new_search_path);\n\t\tif (!io->determineStrippedLength())\n\t\t{\n\t\t\tdelete io;\n\t\t\treturn false;\n\t\t}\n\t\tif (!PHYSFS_mountIo(io, io->filename.c_str(), nullptr, 1))\n\t\t{\n\t\t\t// If PHYSFS_mountIo fails, io->destroy(io) is not called and we have\n\t\t\t// to delete ourselves.\n\t\t\tdelete io;\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\t// Save the game source.\n\tgameSource = new_search_path;\n\n\treturn true;\n}\n\nconst char *Filesystem::getSource() const\n{\n\treturn gameSource.c_str();\n}\n\nbool Filesystem::setupWriteDirectory()\n{\n\tif (!PHYSFS_isInit())\n\t\treturn false;\n\n\tif (!saveDirectoryNeedsMounting)\n\t\treturn true;\n\n\tif (saveIdentity.empty())\n\t\treturn false;\n\n\t// Only the save directory is mounted on-demand if it doesn't exist yet.\n\t// Other app common paths are immediately re-mounted in setIdentity.\n\tbool createdir = true;\n\tif (!mountCommonPathInternal(COMMONPATH_APP_SAVEDIR, nullptr, MOUNT_PERMISSIONS_READWRITE, appendIdentityToPath, createdir))\n\t\treturn false;\n\n\tsaveDirectoryNeedsMounting = false;\n\treturn true;\n}\n\nbool Filesystem::mount(const char *archive, const char *mountpoint, bool appendToPath)\n{\n\tif (!PHYSFS_isInit() || !archive)\n\t\treturn false;\n\n\tstd::string realPath;\n\tstd::string sourceBase = getSourceBaseDirectory();\n\n\t// Check whether the given archive path is in the list of allowed full paths.\n\tauto it = std::find(allowedMountPaths.begin(), allowedMountPaths.end(), archive);\n\n\tif (it != allowedMountPaths.end())\n\t\trealPath = *it;\n\telse if (isFused() && sourceBase.compare(archive) == 0)\n\t{\n\t\t// Special case: if the game is fused and the archive is the source's\n\t\t// base directory, mount it even though it's outside of the save dir.\n\t\trealPath = sourceBase;\n\t}\n\telse\n\t{\n\t\t// Not allowed for safety reasons.\n\t\tif (strlen(archive) == 0 || strstr(archive, \"..\") || strcmp(archive, \"/\") == 0)\n\t\t\treturn false;\n\n\t\tconst char *realDir = PHYSFS_getRealDir(archive);\n\t\tif (!realDir)\n\t\t\treturn false;\n\n\t\trealPath = realDir;\n\n\t\t// Always disallow mounting of files inside the game source, since it\n\t\t// won't work anyway if the game source is a zipped .love file.\n\t\tif (realPath.find(gameSource) == 0)\n\t\t\treturn false;\n\n\t\trealPath += LOVE_PATH_SEPARATOR;\n\t\trealPath += archive;\n\t}\n\n\treturn mountFullPath(realPath.c_str(), mountpoint, MOUNT_PERMISSIONS_READ, appendToPath);\n}\n\nbool Filesystem::mountFullPath(const char *archive, const char *mountpoint, MountPermissions permissions, bool appendToPath)\n{\n\tif (!PHYSFS_isInit() || !archive)\n\t\treturn false;\n\n\tstd::string canonarchive = canonicalizeRealPath(archive);\n\n\tif (isMounted(canonarchive))\n\t\treturn false;\n\n#ifdef LOVE_ANDROID\n\tif (strncmp(archive, \"content://\", 10) == 0)\n\t{\n\t\tif (permissions == MOUNT_PERMISSIONS_READWRITE)\n\t\t\t// Currently there's no way content:// URIs we got are for read-write.\n\t\t\t// TODO: Re-evaluate this in the future, maybe?\n\t\t\treturn false;\n\n\t\tauto io = (PHYSFS_Io *) love::android::getIOFromContentProtocol(archive);\n\t\tif (!io)\n\t\t\treturn false;\n\n\t\tif (PHYSFS_mountIo(io, canonarchive.c_str(), mountpoint, appendToPath))\n\t\t\treturn true;\n\n\t\tio->destroy(io);\n\t}\n#endif\n\n\tif (permissions == MOUNT_PERMISSIONS_READWRITE)\n\t\treturn PHYSFS_mountRW(canonarchive.c_str(), mountpoint, appendToPath) != 0;\n\n\treturn PHYSFS_mount(canonarchive.c_str(), mountpoint, appendToPath) != 0;\n}\n\nbool Filesystem::mountCommonPathInternal(CommonPath path, const char *mountpoint, MountPermissions permissions, bool appendToPath, bool createDir)\n{\n\tstd::string fullpath = getFullCommonPath(path);\n\tif (fullpath.empty())\n\t\treturn false;\n\n\tif (createDir && isAppCommonPath(path) && !isRealDirectory(fullpath))\n\t{\n\t\tif (!createRealDirectory(fullpath))\n\t\t\treturn false;\n\t}\n\n\tif (mountFullPath(fullpath.c_str(), mountpoint, permissions, appendToPath))\n\t{\n\t\tstd::string mp = mountpoint != nullptr ? mountpoint : \"/\";\n\t\tcommonPathMountInfo[path] = {true, mp, permissions};\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool Filesystem::mountCommonPath(CommonPath path, const char *mountpoint, MountPermissions permissions, bool appendToPath)\n{\n\treturn mountCommonPathInternal(path, mountpoint, permissions, appendToPath, true);\n}\n\nbool Filesystem::mount(Data *data, const char *archivename, const char *mountpoint, bool appendToPath)\n{\n\tif (!PHYSFS_isInit())\n\t\treturn false;\n\n\tif (isMounted(archivename))\n\t\treturn false;\n\n\tif (PHYSFS_mountMemory(data->getData(), data->getSize(), nullptr, archivename, mountpoint, appendToPath) != 0)\n\t{\n\t\tmountedData[archivename] = data;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool Filesystem::unmount(const char *archive)\n{\n\tif (!PHYSFS_isInit() || !archive)\n\t\treturn false;\n\n\tauto datait = mountedData.find(archive);\n\n\tif (datait != mountedData.end() && PHYSFS_unmount(archive) != 0)\n\t{\n\t\tmountedData.erase(datait);\n\t\treturn true;\n\t}\n\n\tauto it = std::find(allowedMountPaths.begin(), allowedMountPaths.end(), archive);\n\tif (it != allowedMountPaths.end())\n\t\treturn unmountFullPath(archive);\n\n\tstd::string sourceBase = getSourceBaseDirectory();\n\tif (isFused() && sourceBase.compare(archive) == 0)\n\t\treturn unmountFullPath(archive);\n\n\tif (strlen(archive) == 0 || strstr(archive, \"..\") || strcmp(archive, \"/\") == 0)\n\t\treturn false;\n\n\tconst char *realDir = PHYSFS_getRealDir(archive);\n\tif (!realDir)\n\t\treturn false;\n\n\tstd::string realPath = realDir;\n\trealPath += LOVE_PATH_SEPARATOR;\n\trealPath += archive;\n\n\tstd::string canonpath = canonicalizeRealPath(realPath.c_str());\n\n\tif (PHYSFS_getMountPoint(canonpath.c_str()) == nullptr)\n\t\treturn false;\n\n\treturn PHYSFS_unmount(canonpath.c_str()) != 0;\n}\n\nbool Filesystem::unmountFullPath(const char *fullpath)\n{\n\tif (!PHYSFS_isInit() || !fullpath)\n\t\treturn false;\n\n\tstd::string canonpath = canonicalizeRealPath(fullpath);\n\n\treturn PHYSFS_unmount(canonpath.c_str()) != 0;\n}\n\nbool Filesystem::unmount(CommonPath path)\n{\n\tstd::string fullpath = getFullCommonPath(path);\n\n\tif (!fullpath.empty() && unmountFullPath(fullpath.c_str()))\n\t{\n\t\tcommonPathMountInfo[path].mounted = false;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool Filesystem::unmount(Data *data)\n{\n\tfor (const auto &datapair : mountedData)\n\t{\n\t\tif (datapair.second.get() == data)\n\t\t{\n\t\t\tstd::string archive = datapair.first;\n\t\t\treturn unmount(archive.c_str());\n\t\t}\n\t}\n\n\treturn false;\n}\n\nlove::filesystem::File *Filesystem::openFile(const char *filename, File::Mode mode) const\n{\n\treturn new File(filename, mode);\n}\n\nstd::string Filesystem::getFullCommonPath(CommonPath path)\n{\n\tif (!fullPaths[path].empty())\n\t\treturn fullPaths[path];\n\n\tif (isAppCommonPath(path))\n\t{\n\t\tif (saveIdentity.empty())\n\t\t\treturn fullPaths[path];\n\n\t\tstd::string rootpath;\n\t\tswitch (path)\n\t\t{\n\t\tcase COMMONPATH_APP_SAVEDIR:\n\t\t\trootpath = getFullCommonPath(COMMONPATH_USER_APPDATA);\n\t\t\tbreak;\n\t\tcase COMMONPATH_APP_DOCUMENTS:\n\t\t\trootpath = getFullCommonPath(COMMONPATH_USER_DOCUMENTS);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\tif (rootpath.empty())\n\t\t\treturn fullPaths[path];\n\n\t\tstd::string suffix;\n\t\tif (isFused())\n\t\t\tsuffix = std::string(LOVE_PATH_SEPARATOR) + saveIdentity;\n\t\telse\n\t\t\tsuffix = std::string(LOVE_PATH_SEPARATOR LOVE_APPDATA_FOLDER LOVE_PATH_SEPARATOR) + saveIdentity;\n\n\t\t// TODO: do we still need the normalize?\n\t\tfullPaths[path] = normalize(rootpath + suffix);\n\t\tfullPaths[path] = canonicalizeRealPath(fullPaths[path].c_str());\n\n\t\treturn fullPaths[path];\n\t}\n\n#if defined(LOVE_MACOS) || defined(LOVE_IOS)\n\n\tswitch (path)\n\t{\n\tcase COMMONPATH_APP_SAVEDIR:\n\tcase COMMONPATH_APP_DOCUMENTS:\n\t\t// Handled above.\n\t\tbreak;\n\tcase COMMONPATH_USER_HOME:\n\t\tfullPaths[path] = apple::getUserDirectory(apple::USER_DIRECTORY_HOME);\n\t\tbreak;\n\tcase COMMONPATH_USER_APPDATA:\n\t\tfullPaths[path] = apple::getUserDirectory(apple::USER_DIRECTORY_APPSUPPORT);\n\t\tbreak;\n\tcase COMMONPATH_USER_DESKTOP:\n\t\tfullPaths[path] = apple::getUserDirectory(apple::USER_DIRECTORY_DESKTOP);\n\t\tbreak;\n\tcase COMMONPATH_USER_DOCUMENTS:\n\t\tfullPaths[path] = apple::getUserDirectory(apple::USER_DIRECTORY_DOCUMENTS);\n\t\tbreak;\n\tcase COMMONPATH_MAX_ENUM:\n\t\tbreak;\n\t}\n\n#elif defined(LOVE_WINDOWS)\n\n\tPWSTR winpath = nullptr;\n\tHRESULT hr = E_FAIL;\n\n\tswitch (path)\n\t{\n\tcase COMMONPATH_APP_SAVEDIR:\n\tcase COMMONPATH_APP_DOCUMENTS:\n\t\t// Handled above.\n\t\tbreak;\n\tcase COMMONPATH_USER_HOME:\n\t\thr = SHGetKnownFolderPath(FOLDERID_Profile, 0, nullptr, &winpath);\n\t\tbreak;\n\tcase COMMONPATH_USER_APPDATA:\n\t\thr = SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, nullptr, &winpath);\n\t\tbreak;\n\tcase COMMONPATH_USER_DESKTOP:\n\t\thr = SHGetKnownFolderPath(FOLDERID_Desktop, 0, nullptr, &winpath);\n\t\tbreak;\n\tcase COMMONPATH_USER_DOCUMENTS:\n\t\thr = SHGetKnownFolderPath(FOLDERID_Documents, 0, nullptr, &winpath);\n\t\tbreak;\n\tcase COMMONPATH_MAX_ENUM:\n\t\tbreak;\n\t}\n\n\tif (SUCCEEDED(hr))\n\t{\n\t\tfullPaths[path] = to_utf8(winpath);\n\t\tCoTaskMemFree(winpath);\n\t}\n\n#elif defined(LOVE_ANDROID)\n\n\tstd::string storagepath;\n    if (isAndroidSaveExternal())\n        storagepath = SDL_GetAndroidExternalStoragePath();\n    else\n        storagepath = SDL_GetAndroidInternalStoragePath();\n\n\tswitch (path)\n\t{\n\tcase COMMONPATH_APP_SAVEDIR:\n\tcase COMMONPATH_APP_DOCUMENTS:\n\t\t// Handled above.\n\t\tbreak;\n\tcase COMMONPATH_USER_HOME:\n\t\tfullPaths[path] = normalize(PHYSFS_getUserDir());\n\t\tbreak;\n\tcase COMMONPATH_USER_APPDATA:\n\t\tfullPaths[path] = normalize(storagepath + \"/save/\");\n\t\tbreak;\n\tcase COMMONPATH_USER_DESKTOP:\n\t\t// No such thing on Android?\n\t\tbreak;\n\tcase COMMONPATH_USER_DOCUMENTS:\n\t\t// TODO: something more idiomatic / useful?\n\t\tfullPaths[path] = normalize(storagepath + \"/Documents/\");\n\t\tbreak;\n\tcase COMMONPATH_MAX_ENUM:\n\t\tbreak;\n\t}\n\n#elif defined(LOVE_LINUX)\n\n\tconst char *xdgdir = nullptr;\n\n\tswitch (path)\n\t{\n\tcase COMMONPATH_APP_SAVEDIR:\n\tcase COMMONPATH_APP_DOCUMENTS:\n\t\t// Handled above.\n\t\tbreak;\n\tcase COMMONPATH_USER_HOME:\n\t\tfullPaths[path] = normalize(PHYSFS_getUserDir());\n\t\tbreak;\n\tcase COMMONPATH_USER_APPDATA:\n\t\txdgdir = getenv(\"XDG_DATA_HOME\");\n\t\tif (!xdgdir)\n\t\t\tfullPaths[path] = normalize(std::string(getUserDirectory()) + \"/.local/share/\");\n\t\telse\n\t\t\tfullPaths[path] = xdgdir;\n\t\tbreak;\n\tcase COMMONPATH_USER_DESKTOP:\n\t\tfullPaths[path] = normalize(std::string(getUserDirectory()) + \"/Desktop/\");\n\t\tbreak;\n\tcase COMMONPATH_USER_DOCUMENTS:\n\t\tfullPaths[path] = normalize(std::string(getUserDirectory()) + \"/Documents/\");\n\t\tbreak;\n\tcase COMMONPATH_MAX_ENUM:\n\t\tbreak;\n\t}\n\n#endif\n\n\tif (!fullPaths[path].empty())\n\t\tfullPaths[path] = canonicalizeRealPath(fullPaths[path].c_str());\n\n\treturn fullPaths[path];\n}\n\nconst char *Filesystem::getWorkingDirectory()\n{\n\tif (cwd.empty())\n\t{\n#ifdef LOVE_WINDOWS\n\n\t\tWCHAR w_cwd[LOVE_MAX_PATH];\n\t\t_wgetcwd(w_cwd, LOVE_MAX_PATH);\n\t\tcwd = to_utf8(w_cwd);\n\t\treplace_char(cwd, '\\\\', '/');\n#else\n\t\tchar *cwd_char = new char[LOVE_MAX_PATH];\n\n\t\tif (getcwd(cwd_char, LOVE_MAX_PATH))\n\t\t\tcwd = cwd_char; // if getcwd fails, cwd_char (and thus cwd) will still be empty\n\n\t\tdelete[] cwd_char;\n#endif\n\t}\n\n\treturn cwd.c_str();\n}\n\nstd::string Filesystem::getUserDirectory()\n{\n\treturn getFullCommonPath(COMMONPATH_USER_HOME);\n}\n\nstd::string Filesystem::getAppdataDirectory()\n{\n\treturn getFullCommonPath(COMMONPATH_USER_APPDATA);\n}\n\nstd::string Filesystem::getSaveDirectory()\n{\n\treturn getFullCommonPath(COMMONPATH_APP_SAVEDIR);\n}\n\nstd::string Filesystem::getSourceBaseDirectory() const\n{\n\tsize_t source_len = gameSource.length();\n\n\tif (source_len == 0)\n\t\treturn \"\";\n\n#ifdef LOVE_WINDOWS\n\t// In windows, delimiters can be either '/' or '\\'.\n\tsize_t base_end_pos = gameSource.find_last_of(\"/\\\\\", source_len - 2);\n#else\n\tsize_t base_end_pos = gameSource.find_last_of('/', source_len - 2);\n#endif\n\n\tif (base_end_pos == std::string::npos)\n\t\treturn \"\";\n\n\t// If the source is in the unix root (aka '/'), we want to keep the '/'.\n\tif (base_end_pos == 0)\n\t\tbase_end_pos = 1;\n\n\treturn gameSource.substr(0, base_end_pos);\n}\n\nstd::string Filesystem::getRealDirectory(const char *filename) const\n{\n\tif (!PHYSFS_isInit())\n\t\tthrow love::Exception(\"PhysFS is not initialized.\");\n\n\tconst char *dir = PHYSFS_getRealDir(filename);\n\n\tif (dir == nullptr)\n\t\tthrow love::Exception(\"File does not exist on disk.\");\n\n\treturn std::string(dir);\n}\n\nbool Filesystem::exists(const char *filepath) const\n{\n\tif (!PHYSFS_isInit())\n\t\treturn false;\n\n\treturn PHYSFS_exists(filepath) != 0;\n}\n\nbool Filesystem::getInfo(const char *filepath, Info &info) const\n{\n\tif (!PHYSFS_isInit())\n\t\treturn false;\n\n\tPHYSFS_Stat stat = {};\n\tif (!PHYSFS_stat(filepath, &stat))\n\t\treturn false;\n\n\tinfo.size = (int64) stat.filesize;\n\tinfo.modtime = (int64) stat.modtime;\n\tinfo.readonly = stat.readonly != 0;\n\n\tif (stat.filetype == PHYSFS_FILETYPE_REGULAR)\n\t\tinfo.type = FILETYPE_FILE;\n\telse if (stat.filetype == PHYSFS_FILETYPE_DIRECTORY)\n\t\tinfo.type = FILETYPE_DIRECTORY;\n\telse if (stat.filetype == PHYSFS_FILETYPE_SYMLINK)\n\t\tinfo.type = FILETYPE_SYMLINK;\n\telse\n\t\tinfo.type = FILETYPE_OTHER;\n\n\treturn true;\n}\n\nbool Filesystem::createDirectory(const char *dir)\n{\n\tif (!PHYSFS_isInit())\n\t\treturn false;\n\n\tif (!setupWriteDirectory())\n\t\treturn false;\n\n\tif (!PHYSFS_mkdir(dir))\n\t\treturn false;\n\n#ifdef LOVE_ANDROID\n\t// In Android with t.externalstorage = true, make sure the directory\n    // created in the save directory has permissions of ugo+rwx (0777) so that\n    // it's accessible through MTP.\n\tif (isAndroidSaveExternal())\n\t\tlove::android::fixupExternalStoragePermission(\n\t\t\tgetFullCommonPath(CommonPath::COMMONPATH_APP_SAVEDIR),\n\t\t\tdir\n\t\t);\n#endif\n\treturn true;\n}\n\nbool Filesystem::remove(const char *file)\n{\n\tif (!PHYSFS_isInit())\n\t\treturn false;\n\n\tif (!setupWriteDirectory())\n\t\treturn false;\n\n\tif (!PHYSFS_delete(file))\n\t\treturn false;\n\n\treturn true;\n}\n\nFileData *Filesystem::read(const char *filename, int64 size) const\n{\n\tFile file(filename, File::MODE_READ);\n\n\t// close() is called in the File destructor.\n\treturn file.read(size);\n}\n\nFileData* Filesystem::read(const char* filename) const\n{\n\tFile file(filename, File::MODE_READ);\n\n\t// close() is called in the File destructor.\n\treturn file.read();\n}\n\nvoid Filesystem::write(const char *filename, const void *data, int64 size) const\n{\n\tFile file(filename, File::MODE_WRITE);\n\n\t// close() is called in the File destructor.\n\tif (!file.write(data, size))\n\t\tthrow love::Exception(\"Data could not be written.\");\n}\n\nvoid Filesystem::append(const char *filename, const void *data, int64 size) const\n{\n\tFile file(filename, File::MODE_APPEND);\n\n\t// close() is called in the File destructor.\n\tif (!file.write(data, size))\n\t\tthrow love::Exception(\"Data could not be written.\");\n}\n\nbool Filesystem::getDirectoryItems(const char *dir, std::vector<std::string> &items)\n{\n\tif (!PHYSFS_isInit())\n\t\treturn false;\n\n\tchar **rc = PHYSFS_enumerateFiles(dir);\n\n\tif (rc == nullptr)\n\t\treturn false;\n\n\tfor (char **i = rc; *i != 0; i++)\n\t\titems.push_back(*i);\n\n\tPHYSFS_freeList(rc);\n\treturn true;\n}\n\nvoid Filesystem::setSymlinksEnabled(bool enable)\n{\n\tif (!PHYSFS_isInit())\n\t\treturn;\n\n\tPHYSFS_permitSymbolicLinks(enable ? 1 : 0);\n}\n\nbool Filesystem::areSymlinksEnabled() const\n{\n\tif (!PHYSFS_isInit())\n\t\treturn false;\n\n\treturn PHYSFS_symbolicLinksPermitted() != 0;\n}\n\nstd::vector<std::string> &Filesystem::getRequirePath()\n{\n\treturn requirePath;\n}\n\nstd::vector<std::string> &Filesystem::getCRequirePath()\n{\n\treturn cRequirePath;\n}\n\nvoid Filesystem::allowMountingForPath(const std::string &path)\n{\n\tif (std::find(allowedMountPaths.begin(), allowedMountPaths.end(), path) == allowedMountPaths.end())\n\t\tallowedMountPaths.push_back(path);\n}\n\n} // physfs\n} // filesystem\n} // love\n"
  },
  {
    "path": "src/modules/filesystem/physfs/Filesystem.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_FILESYSTEM_PHYSFS_FILESYSTEM_H\n#define LOVE_FILESYSTEM_PHYSFS_FILESYSTEM_H\n\n// STD\n#include <cstdlib>\n#include <cstring>\n#include <map>\n\n// LOVE\n#include \"filesystem/Filesystem.h\"\n\nnamespace love\n{\nnamespace filesystem\n{\nnamespace physfs\n{\n\nclass Filesystem final : public love::filesystem::Filesystem\n{\npublic:\n\n\tFilesystem();\n\tvirtual ~Filesystem();\n\n\tvoid init(const char *arg0) override;\n\n\tvoid setFused(bool fused) override;\n\tbool isFused() const override;\n\n\tbool setupWriteDirectory() override;\n\n\tbool setIdentity(const char *ident, bool appendToPath = false) override;\n\tconst char *getIdentity() const override;\n\n\tbool setSource(const char *source) override;\n\n\tconst char *getSource() const override;\n\n\tbool mount(const char *archive, const char *mountpoint, bool appendToPath = false) override;\n\tbool mount(Data *data, const char *archivename, const char *mountpoint, bool appendToPath = false) override;\n\n\tbool mountFullPath(const char *archive, const char *mountpoint, MountPermissions permissions, bool appendToPath = false) override;\n\tbool mountCommonPath(CommonPath path, const char *mountpoint, MountPermissions permissions, bool appendToPath = false) override;\n\n\tbool unmount(const char *archive) override;\n\tbool unmount(Data *data) override;\n\tbool unmount(CommonPath path) override;\n\tbool unmountFullPath(const char *fullpath) override;\n\n\tlove::filesystem::File *openFile(const char *filename, File::Mode mode) const override;\n\n\tstd::string getFullCommonPath(CommonPath path) override;\n\tconst char *getWorkingDirectory() override;\n\tstd::string getUserDirectory() override;\n\tstd::string getAppdataDirectory() override;\n\tstd::string getSaveDirectory() override;\n\tstd::string getSourceBaseDirectory() const override;\n\n\tstd::string getRealDirectory(const char *filename) const override;\n\n\tbool exists(const char *filepath) const override;\n\tbool getInfo(const char *filepath, Info &info) const override;\n\n\tbool createDirectory(const char *dir) override;\n\n\tbool remove(const char *file) override;\n\n\tFileData *read(const char *filename, int64 size) const override;\n\tFileData *read(const char *filename) const override;\n\tvoid write(const char *filename, const void *data, int64 size) const override;\n\tvoid append(const char *filename, const void *data, int64 size) const override;\n\n\tbool getDirectoryItems(const char *dir, std::vector<std::string> &items) override;\n\n\tvoid setSymlinksEnabled(bool enable) override;\n\tbool areSymlinksEnabled() const override;\n\n\tstd::vector<std::string> &getRequirePath() override;\n\tstd::vector<std::string> &getCRequirePath() override;\n\n\tvoid allowMountingForPath(const std::string &path) override;\n\nprivate:\n\n\tstruct CommonPathMountInfo\n\t{\n\t\tbool mounted;\n\t\tstd::string mountPoint;\n\t\tMountPermissions permissions;\n\t};\n\n\tbool mountCommonPathInternal(CommonPath path, const char *mountpoint, MountPermissions permissions, bool appendToPath, bool createDir);\n\n\t// Contains the current working directory (UTF8).\n\tstd::string cwd;\n\n\t// This name will be used to create the folder in the appdata folder.\n\tstd::string saveIdentity;\n\tbool appendIdentityToPath;\n\n\t// The full path to the source of the game.\n\tstd::string gameSource;\n\n\t// Allow saving outside of the LOVE_APPDATA_FOLDER for release 'builds'\n\tbool fused;\n\tbool fusedSet;\n\n\t// Search path for require\n\tstd::vector<std::string> requirePath;\n\tstd::vector<std::string> cRequirePath;\n\n\tstd::vector<std::string> allowedMountPaths;\n\n\tstd::map<std::string, StrongRef<Data>> mountedData;\n\n\tstd::string fullPaths[COMMONPATH_MAX_ENUM];\n\n\tCommonPathMountInfo commonPathMountInfo[COMMONPATH_MAX_ENUM];\n\n\tbool saveDirectoryNeedsMounting;\n\n}; // Filesystem\n\n} // physfs\n} // filesystem\n} // love\n\n#endif // LOVE_FILESYSTEM_PHYSFS_FILESYSTEM_H\n"
  },
  {
    "path": "src/modules/filesystem/physfs/PhysfsIo.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include <algorithm>\n\n#include \"PhysfsIo.h\"\n\nnamespace love\n{\nnamespace filesystem\n{\nnamespace physfs\n{\n\nbool StripSuffixIo::determineStrippedLength()\n{\n\tif (!file)\n\t\treturn false;\n\n\tconst int64 fullSize = file->getSize();\n\n\tint64 chunkSize = std::min(fullSize, (int64) 8192);\n\tstd::string buffer;\n\tbuffer.reserve(chunkSize);\n\tint64 i = fullSize - chunkSize;\n\t// I don't think we really need to go through the whole file. The main known use\n\t// case for this functionality is to skip windows codesign signatures, which are\n\t// from what I have seen ~12KB or so, but trying is better than just failing.\n\twhile (i >= 0)\n\t{\n\t\tbuffer.resize(chunkSize);\n\t\tif (seek(i) == 0)\n\t\t\treturn false;\n\t\tconst auto n = read(&buffer[0], chunkSize);\n\t\tif (n <= 0)\n\t\t\treturn false;\n\t\tbuffer.resize(n);\n\t\t// We are looking for the magic bytes that indicate the start\n\t\t// of the \"End of cental directory record (EOCD)\".\n\t\t// As this is most likely not a multi-disk zip, we could include 4 bytes of 0x00,\n\t\t// but I'd rather make fewer assumptions.\n\t\tconst auto endOfCentralDirectory = buffer.rfind(\"\\x50\\x4B\\x05\\x06\");\n\t\tif (endOfCentralDirectory != std::string::npos)\n\t\t{\n\t\t\ti = i + endOfCentralDirectory;\n\t\t\tbreak;\n\t\t}\n\t\tif (i == 0)\n\t\t\tbreak;\n\t\ti = std::max((int64)0, i - chunkSize);\n\t}\n\n\tif (i > 0)\n\t{\n\t\t// The EOCD record is at least 22 bytes but may include a comment\n\t\tif (i + 22 > fullSize)\n\t\t\treturn false; // Incomplete central directory\n\t\t// The comment length (u16) is located 20 bytes from the start of the EOCD record\n\t\tif (seek(i + 20) == 0)\n\t\t\treturn false;\n\t\tuint8 buffer[2];\n\t\tconst auto n = read(buffer, 2);\n\t\tif (n <= 0)\n\t\t\treturn false;\n\t\tconst auto commentSize = (buffer[1] << 8) | buffer[0];\n\t\tif (i + 22 + commentSize > fullSize) // Comment incomplete\n\t\t\treturn false;\n\t\t// We pretend the file ends just after the comment\n\t\t// (which should be the end of the embedded zip file)\n\t\tstrippedLength_ = i + 22 + commentSize;\n\t}\n\telse\n\t{\n\t\tstrippedLength_ = fullSize;\n\t}\n\n\tif (seek(0) == 0)\n\t\treturn false;\n\treturn true;\n}\n\nint64 StripSuffixIo::read(void *buf, uint64 len)\n{\n\tif (!file)\n\t{\n\t\tPHYSFS_setErrorCode(PHYSFS_ERR_OS_ERROR);\n\t\treturn -1;\n\t}\n\tint64 r = file->read(buf, (int64) len);\n\tif (r == 0)\n\t{\n\t\tif (file->isEOF())\n\t\t{\n\t\t\tPHYSFS_setErrorCode(PHYSFS_ERR_OK);\n\t\t\treturn 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tPHYSFS_setErrorCode(PHYSFS_ERR_OS_ERROR);\n\t\t\treturn -1;\n\t\t}\n\t}\n\tPHYSFS_setErrorCode(PHYSFS_ERR_OK);\n\treturn r;\n}\n\nint64 StripSuffixIo::write(const void */*buf*/, uint64 /*len*/)\n{\n\tPHYSFS_setErrorCode(PHYSFS_ERR_READ_ONLY);\n\treturn -1;\n}\n\nint64 StripSuffixIo::seek(uint64 offset)\n{\n\tif (!file)\n\t{\n\t\tPHYSFS_setErrorCode(PHYSFS_ERR_OS_ERROR);\n\t\treturn 0;\n\t}\n\tbool success = file->seek(offset, Stream::SEEKORIGIN_BEGIN);\n\tPHYSFS_setErrorCode(success ? PHYSFS_ERR_OK : PHYSFS_ERR_OS_ERROR);\n\treturn success ? 1 : 0;\n}\n\nint64 StripSuffixIo::tell()\n{\n\tif (!file)\n\t{\n\t\tPHYSFS_setErrorCode(PHYSFS_ERR_OS_ERROR);\n\t\treturn -1;\n\t}\n\treturn file->tell();\n}\n\nint64 StripSuffixIo::length()\n{\n\treturn strippedLength_;\n}\n\nint64 StripSuffixIo::flush()\n{\n\tif (!file)\n\t{\n\t\tPHYSFS_setErrorCode(PHYSFS_ERR_OS_ERROR);\n\t\treturn 0;\n\t}\n\ttry\n\t{\n\t\treturn file->flush() ? 1 : 0;\n\t}\n\tcatch (love::Exception &)\n\t{\n\t\tPHYSFS_setErrorCode(PHYSFS_ERR_OS_ERROR);\n\t\treturn 0;\n\t}\n}\n\n} // physfs\n} // filesystem\n} // love\n"
  },
  {
    "path": "src/modules/filesystem/physfs/PhysfsIo.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_FILESYSTEM_PHYSFS_PHYSFSIO_H\n#define LOVE_FILESYSTEM_PHYSFS_PHYSFSIO_H\n\n#include \"libraries/physfs/physfs.h\"\n#include \"common/int.h\"\n#include \"filesystem/NativeFile.h\"\n\n#include <string>\n\nnamespace love\n{\nnamespace filesystem\n{\nnamespace physfs\n{\n\ntemplate <typename Derived>\nstruct PhysfsIo : PHYSFS_Io\n{\nprotected:\n\n\tPhysfsIo()\n\t: PHYSFS_Io()\n\t{\n\t\t// Direct initialization of PHYSFS_Io members in the initializer list\n\t\t// doesn't work in VS2013.\n\t\tthis->version = Derived::version;\n\t\tthis->opaque = this;\n\t\tthis->read = staticRead; // May be null.\n\t\tthis->write = staticWrite; // May be null.\n\t\tthis->seek = staticSeek;\n\t\tthis->tell = staticTell;\n\t\tthis->length = staticLength;\n\t\tthis->duplicate = staticDuplicate;\n\t\tthis->flush = staticFlush; // May be null.\n\t\tthis->destroy = staticDestroy;\n\t}\n\n\tvirtual ~PhysfsIo() {}\n\nprivate:\n\n\t// Returns: number of bytes read, 0 on EOF, -1 on failure\n\tstatic PHYSFS_sint64 staticRead(struct PHYSFS_Io *io, void *buf, PHYSFS_uint64 len)\n\t{\n\t\treturn derived(io)->read(buf, len);\n\t}\n\n\t// Returns: number of bytes written, -1 on failure\n\tstatic PHYSFS_sint64 staticWrite(struct PHYSFS_Io *io, const void *buf, PHYSFS_uint64 len)\n\t{\n\t\treturn derived(io)->write(buf, len);\n\t}\n\n\t// Returns: non-zero on success, zero on error\n\tstatic int staticSeek(struct PHYSFS_Io *io, PHYSFS_uint64 offset)\n\t{\n\t\treturn derived(io)->seek(offset);\n\t}\n\n\t// Returns: current offset from start, -1 on error\n\tstatic PHYSFS_sint64 staticTell(struct PHYSFS_Io *io)\n\t{\n\t\treturn derived(io)->tell();\n\t}\n\n\t// Returns: total size in bytes, -1 on error\n\tstatic PHYSFS_sint64 staticLength(struct PHYSFS_Io *io)\n\t{\n\t\treturn derived(io)->length();\n\t}\n\n\tstatic struct PHYSFS_Io *staticDuplicate(struct PHYSFS_Io *io)\n\t{\n\t\t// Just use copy constructor\n\t\treturn new Derived(*derived(io));\n\t}\n\n\t// Returns: non-zero on success, zero on error\n\tstatic int staticFlush(struct PHYSFS_Io *io)\n\t{\n\t\treturn derived(io)->flush();\n\t}\n\n\tstatic void staticDestroy(struct PHYSFS_Io *io)\n\t{\n\t\t// Just use destructor\n\t\tdelete derived(io);\n\t}\n\n\tstatic Derived* derived(PHYSFS_Io *io)\n\t{\n\t\treturn static_cast<Derived*>(reinterpret_cast<PhysfsIo*>(io->opaque));\n\t}\n};\n\nstruct StripSuffixIo : public PhysfsIo<StripSuffixIo>\n{\n\tstatic const uint32 version = 0;\n\n\tstd::string filename;\n\tNativeFile *file = nullptr;\n\n\t// The constructor is private in favor of this function to prevent stack allocation\n\t// because Physfs will take ownership of this object and call destroy on it later.\n\tstatic StripSuffixIo *create(const std::string &f) { return new StripSuffixIo(f); }\n\n\tvirtual ~StripSuffixIo()\n\t{\n\t\tif (file)\n\t\t{\n\t\t\tfile->release();\n\t\t}\n\t}\n\n\tStripSuffixIo(const StripSuffixIo &other)\n\t\t: StripSuffixIo(other.filename)\n\t{\n\t}\n\n\tbool determineStrippedLength();\n\n\tint64 read(void *buf, uint64 len);\n\tint64 write(const void *buf, uint64 len);\n\tint64 seek(uint64 offset);\n\tint64 tell();\n\tint64 length();\n\tint64 flush();\n\nprivate:\n\n\tStripSuffixIo(const std::string &f)\n\t\t: filename(f)\n\t\t, file(nullptr)\n\t{\n\t\ttry\n\t\t{\n\t\t\tfile = new NativeFile(f, File::MODE_READ);\n\t\t}\n\t\tcatch (love::Exception &)\n\t\t{\n\t\t}\n\t}\n\n\tint64_t strippedLength_ = -1;\n};\n\n} // physfs\n} // filesystem\n} // love\n\n#endif\n"
  },
  {
    "path": "src/modules/filesystem/wrap_File.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_File.h\"\n\n#include \"common/Data.h\"\n#include \"common/Exception.h\"\n#include \"common/int.h\"\n\n#include \"data/wrap_DataModule.h\"\n\nnamespace love\n{\nnamespace filesystem\n{\n\nint luax_ioError(lua_State *L, const char *fmt, ...)\n{\n\tva_list args;\n\tva_start(args, fmt);\n\n\tlua_pushnil(L);\n\tlua_pushvfstring(L, fmt, args);\n\n\tva_end(args);\n\treturn 2;\n}\n\nFile *luax_checkfile(lua_State *L, int idx)\n{\n\treturn luax_checktype<File>(L, idx);\n}\n\nint w_File_getSize(lua_State *L)\n{\n\tFile *t = luax_checkfile(L, 1);\n\n\tint64 size = -1;\n\ttry\n\t{\n\t\tsize = t->getSize();\n\t}\n\tcatch (love::Exception &e)\n\t{\n\t\treturn luax_ioError(L, \"%s\", e.what());\n\t}\n\n\t// Push nil on failure or if size does not fit into a double precision floating-point number.\n\tif (size == -1)\n\t\treturn luax_ioError(L, \"Could not determine file size.\");\n\telse if (size >= 0x20000000000000LL)\n\t\treturn luax_ioError(L, \"Size is too large.\");\n\n\tlua_pushnumber(L, (lua_Number) size);\n\treturn 1;\n}\n\nint w_File_open(lua_State *L)\n{\n\tFile *file = luax_checkfile(L, 1);\n\tconst char *str = luaL_checkstring(L, 2);\n\tFile::Mode mode;\n\n\tif (!File::getConstant(str, mode))\n\t\treturn luax_enumerror(L, \"file open mode\", File::getConstants(mode), str);\n\n\ttry\n\t{\n\t\tluax_pushboolean(L, file->open(mode));\n\t}\n\tcatch (love::Exception &e)\n\t{\n\t\treturn luax_ioError(L, \"%s\", e.what());\n\t}\n\n\treturn 1;\n}\n\nint w_File_close(lua_State *L)\n{\n\tFile *file = luax_checkfile(L, 1);\n\tluax_pushboolean(L, file->close());\n\treturn 1;\n}\n\nint w_File_isOpen(lua_State *L)\n{\n\tFile *file = luax_checkfile(L, 1);\n\tluax_pushboolean(L, file->isOpen());\n\treturn 1;\n}\n\nint w_File_read(lua_State *L)\n{\n\tFile *file = luax_checkfile(L, 1);\n\tStrongRef<FileData> d = nullptr;\n\n\tlove::data::ContainerType ctype = love::data::CONTAINER_STRING;\n\n\tint startidx = 2;\n\tif (lua_type(L, 2) == LUA_TSTRING)\n\t{\n\t\tctype = love::data::luax_checkcontainertype(L, 2);\n\t\tstartidx = 3;\n\t}\n\n\tint64 size = (int64) luaL_optnumber(L, startidx, -1);\n\n\ttry\n\t{\n\t\tif (size < 0)\n\t\t\tsize = file->getSize();\n\t\td.set(file->read(size), Acquire::NORETAIN);\n\t}\n\tcatch (love::Exception &e)\n\t{\n\t\treturn luax_ioError(L, \"%s\", e.what());\n\t}\n\n\tif (ctype == love::data::CONTAINER_DATA)\n\t\tluax_pushtype(L, d.get());\n\telse\n\t\tlua_pushlstring(L, (const char *) d->getData(), d->getSize());\n\n\tlua_pushinteger(L, d->getSize());\n\n\treturn 2;\n}\n\nint w_File_write(lua_State *L)\n{\n\tFile *file = luax_checkfile(L, 1);\n\tbool result = false;\n\n\tif (lua_isstring(L, 2))\n\t{\n\t\ttry\n\t\t{\n\t\t\tsize_t datasize = 0;\n\t\t\tconst char *data = lua_tolstring(L, 2, &datasize);\n\n\t\t\tif (!lua_isnoneornil(L, 3))\n\t\t\t\tdatasize = luaL_checkinteger(L, 3);\n\n\t\t\tresult = file->write(data, datasize);\n\t\t}\n\t\tcatch (love::Exception &e)\n\t\t{\n\t\t\treturn luax_ioError(L, \"%s\", e.what());\n\t\t}\n\t}\n\telse if (luax_istype(L, 2, love::Data::type))\n\t{\n\t\ttry\n\t\t{\n\t\t\tlove::Data *data = luax_totype<love::Data>(L, 2);\n\t\t\tresult = file->write(data->getData(), luaL_optinteger(L, 3, data->getSize()));\n\t\t}\n\t\tcatch (love::Exception &e)\n\t\t{\n\t\t\treturn luax_ioError(L, \"%s\", e.what());\n\t\t}\n\t}\n\telse\n\t{\n\t\treturn luaL_argerror(L, 2, \"string or data expected\");\n\t}\n\n\tluax_pushboolean(L, result);\n\treturn 1;\n}\n\nint w_File_flush(lua_State *L)\n{\n\tFile *file = luax_checkfile(L, 1);\n\tbool success = false;\n\ttry\n\t{\n\t\tsuccess = file->flush();\n\t}\n\tcatch (love::Exception &e)\n\t{\n\t\treturn luax_ioError(L, \"%s\", e.what());\n\t}\n\tluax_pushboolean(L, success);\n\treturn 1;\n}\n\nint w_File_isEOF(lua_State *L)\n{\n\tFile *file = luax_checkfile(L, 1);\n\tluax_pushboolean(L, file->isEOF());\n\treturn 1;\n}\n\nint w_File_tell(lua_State *L)\n{\n\tFile *file = luax_checkfile(L, 1);\n\tint64 pos = file->tell();\n\t// Push nil on failure or if pos does not fit into a double precision floating-point number.\n\tif (pos == -1)\n\t\treturn luax_ioError(L, \"Invalid position.\");\n\telse if (pos >= 0x20000000000000LL)\n\t\treturn luax_ioError(L, \"Number is too large.\");\n\telse\n\t\tlua_pushnumber(L, (lua_Number)pos);\n\treturn 1;\n}\n\nint w_File_seek(lua_State *L)\n{\n\tFile *file = luax_checkfile(L, 1);\n\tlua_Number pos = luaL_checknumber(L, 2);\n\n\t// Push false on negative and precision-problematic numbers.\n\t// Better fail than seek to an unknown position.\n\tif (pos < 0.0 || pos >= 9007199254740992.0)\n\t\tluax_pushboolean(L, false);\n\telse\n\t\tluax_pushboolean(L, file->seek((uint64)pos));\n\treturn 1;\n}\n\nint w_File_lines_i(lua_State *L)\n{\n\t// The upvalues:\n\t//   - File\n\t//   - read buffer (string)\n\t//   - read buffer offset (number)\n\t//   - file position (number, optional)\n\t//   - restore userpos (bool, optional)\n\n\tFile *file = luax_checktype<File>(L, lua_upvalueindex(1));\n\n\t// Only accept read mode at this point.\n\tif (file->getMode() != File::MODE_READ)\n\t\treturn luaL_error(L, \"File needs to stay in read mode.\");\n\n\t// Get the current (lua-side) buffer info\n\tsize_t len;\n\tconst char *buffer = lua_tolstring(L, lua_upvalueindex(2), &len);\n\tint offset = lua_tointeger(L, lua_upvalueindex(3));\n\n\t// Find our next line\n\tconst char *start = buffer+offset;\n\tconst char *end = reinterpret_cast<const char*>(memchr(start, '\\n', len-offset));\n\n\tbool seekBack = luax_toboolean(L, lua_upvalueindex(5));\n\n\t// If there are no more lines in the buffer, keep adding more data until we\n\t// found another line or EOF\n\tif (!end && !file->isEOF())\n\t{\n\t\tconst int readbufsize = 1024;\n\t\tchar readbuf[readbufsize];\n\n\t\t// Build new buffer\n\t\tluaL_Buffer storage;\n\t\tluaL_buffinit(L, &storage);\n\t\tluaL_addlstring(&storage, start, len-offset);\n\n\t\t// If the user has changed the position, we need to seek back first\n\t\tint64 pos = file->tell();\n\t\tint64 userpos = -1;\n\t\tif (seekBack)\n\t\t{\n\t\t\tuserpos = pos;\n\t\t\tpos = (int64) lua_tonumber(L, lua_upvalueindex(4));\n\t\t\tif (userpos != pos)\n\t\t\t\tfile->seek(pos);\n\t\t}\n\n\t\t// Keep reading until newline or EOF\n\t\twhile (!file->isEOF())\n\t\t{\n\t\t\tint read = (int) file->read(readbuf, readbufsize);\n\t\t\tif (read < 0)\n\t\t\t\treturn luaL_error(L, \"Could not read from file.\");\n\n\t\t\tluaL_addlstring(&storage, readbuf, read);\n\n\t\t\t// If we found a newline now, break\n\t\t\tif (memchr(readbuf, '\\n', read))\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Possibly seek back to the user position\n\t\t// But make sure to save our target position too\n\t\tif (seekBack)\n\t\t{\n\t\t\tlua_pushnumber(L, file->tell());\n\t\t\tlua_replace(L, lua_upvalueindex(4));\n\t\t\tfile->seek(userpos);\n\t\t}\n\n\t\t// We've now got a new buffer, replace the old one\n\t\tluaL_pushresult(&storage);\n\t\tlua_replace(L, lua_upvalueindex(2));\n\t\tbuffer = lua_tolstring(L, lua_upvalueindex(2), &len);\n\t\toffset = 0;\n\t\tstart = buffer;\n\t\tend = reinterpret_cast<const char*>(memchr(start, '\\n', len));\n\t}\n\n\tif (!end)\n\t\tend = buffer+len-1;\n\n\t// We've found the next line, update our offset upvalue and return\n\toffset = end-buffer+1;\n\tlua_pushinteger(L, offset);\n\tlua_replace(L, lua_upvalueindex(3));\n\n\t// If we're past the end, terminate (as we must be at EOF)\n\tif (start == buffer+len)\n\t{\n\t\tfile->close();\n\t\treturn 0;\n\t}\n\n\t// Unless we're at EOF, end points at '\\n', so let's take that (and an\n\t// optional '\\r') off\n\tif (end >= start && *end == '\\n')\n\t\t--end;\n\tif (end >= start && *end == '\\r')\n\t\t--end;\n\n\t// Note: inclusive because *end contains the last character in the string\n\tlua_pushlstring(L, start, end-start+1);\n\treturn 1;\n}\n\nint w_File_lines(lua_State *L)\n{\n\tFile *file = luax_checkfile(L, 1);\n\n\tlua_pushstring(L, \"\"); // buffer\n\tlua_pushnumber(L, 0); // buffer offset\n\tlua_pushnumber(L, 0); // File position.\n\tluax_pushboolean(L, file->getMode() != File::MODE_CLOSED); // Save current file position.\n\n\tif (file->getMode() != File::MODE_READ)\n\t{\n\t\tif (file->getMode() != File::MODE_CLOSED)\n\t\t\tfile->close();\n\n\t\tbool success = false;\n\t\tluax_catchexcept(L, [&](){ success = file->open(File::MODE_READ); });\n\n\t\tif (!success)\n\t\t\treturn luaL_error(L, \"Could not open file.\");\n\t}\n\n\tlua_pushcclosure(L, w_File_lines_i, 5);\n\treturn 1;\n}\n\nint w_File_setBuffer(lua_State *L)\n{\n\tFile *file = luax_checkfile(L, 1);\n\tconst char *str = luaL_checkstring(L, 2);\n\tint64 size = (int64) luaL_optnumber(L, 3, 0.0);\n\n\tFile::BufferMode bufmode;\n\tif (!File::getConstant(str, bufmode))\n\t\treturn luax_enumerror(L, \"file buffer mode\", File::getConstants(bufmode), str);\n\n\tbool success = false;\n\ttry\n\t{\n\t\tsuccess = file->setBuffer(bufmode, size);\n\t}\n\tcatch (love::Exception &e)\n\t{\n\t\treturn luax_ioError(L, \"%s\", e.what());\n\t}\n\n\tluax_pushboolean(L, success);\n\treturn 1;\n}\n\nint w_File_getBuffer(lua_State *L)\n{\n\tFile *file = luax_checkfile(L, 1);\n\tint64 size = 0;\n\tFile::BufferMode bufmode = file->getBuffer(size);\n\tconst char *str = 0;\n\n\tif (!File::getConstant(bufmode, str))\n\t\treturn luax_ioError(L, \"Unknown file buffer mode.\");\n\n\tlua_pushstring(L, str);\n\tlua_pushnumber(L, (lua_Number) size);\n\treturn 2;\n}\n\nint w_File_getMode(lua_State *L)\n{\n\tFile *file = luax_checkfile(L, 1);\n\n\tFile::Mode mode = file->getMode();\n\tconst char *str = 0;\n\n\tif (!File::getConstant(mode, str))\n\t\treturn luax_ioError(L, \"Unknown file mode.\");\n\n\tlua_pushstring(L, str);\n\treturn 1;\n}\n\nint w_File_getFilename(lua_State *L)\n{\n\tFile *file = luax_checkfile(L, 1);\n\tluax_pushstring(L, file->getFilename());\n\treturn 1;\n}\n\nint w_File_getExtension(lua_State *L)\n{\n\tFile *file = luax_checkfile(L, 1);\n\tluax_pushstring(L, file->getExtension());\n\treturn 1;\n}\n\nconst luaL_Reg w_File_functions[] =\n{\n\t{ \"getSize\", w_File_getSize },\n\t{ \"open\", w_File_open },\n\t{ \"close\", w_File_close },\n\t{ \"isOpen\", w_File_isOpen },\n\t{ \"read\", w_File_read },\n\t{ \"write\", w_File_write },\n\t{ \"flush\", w_File_flush },\n\t{ \"isEOF\", w_File_isEOF },\n\t{ \"tell\", w_File_tell },\n\t{ \"seek\", w_File_seek },\n\t{ \"lines\", w_File_lines },\n\t{ \"setBuffer\", w_File_setBuffer },\n\t{ \"getBuffer\", w_File_getBuffer },\n\t{ \"getMode\", w_File_getMode },\n\t{ \"getFilename\", w_File_getFilename },\n\t{ \"getExtension\", w_File_getExtension },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_file(lua_State *L)\n{\n\treturn luax_register_type(L, &File::type, w_File_functions, nullptr);\n}\n\n} // filesystem\n} // love\n"
  },
  {
    "path": "src/modules/filesystem/wrap_File.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_FILESYSTEM_WRAP_FILE_H\n#define LOVE_FILESYSTEM_WRAP_FILE_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"File.h\"\n\nnamespace love\n{\nnamespace filesystem\n{\n\n// Does not use lua_error, so it's safe to call in exception handling code.\nint luax_ioError(lua_State *L, const char *fmt, ...);\n\nFile *luax_checkfile(lua_State *L, int idx);\nint w_File_lines_i(lua_State *L);\nextern \"C\" int luaopen_file(lua_State *L);\n\nextern const luaL_Reg w_File_functions[];\n\n} // filesystem\n} // love\n\n#endif // LOVE_FILESYSTEM_WRAP_FILE_H\n"
  },
  {
    "path": "src/modules/filesystem/wrap_FileData.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_FileData.h\"\n\n#include \"data/wrap_Data.h\"\n\nnamespace love\n{\nnamespace filesystem\n{\n\nFileData *luax_checkfiledata(lua_State *L, int idx)\n{\n\treturn luax_checktype<FileData>(L, idx);\n}\n\nint w_FileData_clone(lua_State *L)\n{\n\tFileData *t = luax_checkfiledata(L, 1), *c = nullptr;\n\tluax_catchexcept(L, [&](){ c = t->clone(); });\n\tluax_pushtype(L, c);\n\tc->release();\n\treturn 1;\n}\n\nint w_FileData_getFilename(lua_State *L)\n{\n\tFileData *t = luax_checkfiledata(L, 1);\n\tlua_pushstring(L, t->getFilename().c_str());\n\treturn 1;\n}\n\nint w_FileData_getExtension(lua_State *L)\n{\n\tFileData *t = luax_checkfiledata(L, 1);\n\tlua_pushstring(L, t->getExtension().c_str());\n\treturn 1;\n}\n\nstatic const luaL_Reg w_FileData_functions[] =\n{\n\t{ \"clone\", w_FileData_clone },\n\t{ \"getFilename\", w_FileData_getFilename },\n\t{ \"getExtension\", w_FileData_getExtension },\n\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_filedata(lua_State *L)\n{\n\tint ret = luax_register_type(L, &FileData::type, data::w_Data_functions, w_FileData_functions, nullptr);\n\tlove::data::luax_rundatawrapper(L, FileData::type);\n\treturn ret;\n}\n\n} // filesystem\n} // love\n"
  },
  {
    "path": "src/modules/filesystem/wrap_FileData.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_FILESYSTEM_WRAP_FILE_DATA_H\n#define LOVE_FILESYSTEM_WRAP_FILE_DATA_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"FileData.h\"\n\nnamespace love\n{\nnamespace filesystem\n{\n\nFileData *luax_checkfiledata(lua_State *L, int idx);\nextern \"C\" int luaopen_filedata(lua_State *L);\n\n} // filesystem\n} // love\n\n#endif // LOVE_FILESYSTEM_WRAP_FILE_DATA_H\n"
  },
  {
    "path": "src/modules/filesystem/wrap_Filesystem.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"common/config.h\"\n#include \"wrap_Filesystem.h\"\n#include \"wrap_File.h\"\n#include \"wrap_NativeFile.h\"\n#include \"wrap_FileData.h\"\n#include \"data/wrap_Data.h\"\n#include \"data/wrap_DataModule.h\"\n\n#include \"physfs/Filesystem.h\"\n\n#ifdef LOVE_ANDROID\n#include \"common/android.h\"\n#endif\n\n// SDL\n#include <SDL3/SDL_loadso.h>\n\n// STL\n#include <vector>\n#include <string>\n#include <sstream>\n#include <algorithm>\n\nnamespace love\n{\nnamespace filesystem\n{\n\n#define instance() (Module::getInstance<Filesystem>(Module::M_FILESYSTEM))\n\nint w_init(lua_State *L)\n{\n\tconst char *arg0 = luaL_checkstring(L, 1);\n\tluax_catchexcept(L, [&](){ instance()->init(arg0); });\n\treturn 0;\n}\n\nint w_setFused(lua_State *L)\n{\n\t// no error checking needed, everything, even nothing\n\t// can be converted to a boolean\n\tinstance()->setFused(luax_toboolean(L, 1));\n\treturn 0;\n}\n\nint w_isFused(lua_State *L)\n{\n\tluax_pushboolean(L, instance()->isFused());\n\treturn 1;\n}\n\nint w_setAndroidSaveExternal(lua_State *L)\n{\n\tbool useExternal = luax_optboolean(L, 1, false);\n\tinstance()->setAndroidSaveExternal(useExternal);\n\treturn 0;\n}\n\nint w_setIdentity(lua_State *L)\n{\n\tconst char *arg = luaL_checkstring(L, 1);\n\tbool append = luax_optboolean(L, 2, false);\n\n\tif (!instance()->setIdentity(arg, append))\n\t\treturn luaL_error(L, \"Could not set write directory.\");\n\n\treturn 0;\n}\n\nint w_getIdentity(lua_State *L)\n{\n\tlua_pushstring(L, instance()->getIdentity());\n\treturn 1;\n}\n\nint w_setSource(lua_State *L)\n{\n\tconst char *arg = luaL_checkstring(L, 1);\n\n\tif (!instance()->setSource(arg))\n\t\treturn luaL_error(L, \"Could not set source.\");\n\n\treturn 0;\n}\n\nint w_getSource(lua_State *L)\n{\n\tlua_pushstring(L, instance()->getSource());\n\treturn 1;\n}\n\nint w_mount(lua_State *L)\n{\n\tstd::string archive;\n\n\tif (luax_istype(L, 1, Data::type))\n\t{\n\t\tData *data = love::data::luax_checkdata(L, 1);\n\t\tint startidx = 2;\n\n\t\tif (luax_istype(L, 1, FileData::type) && !lua_isstring(L, 3))\n\t\t{\n\t\t\tFileData *filedata = luax_checkfiledata(L, 1);\n\t\t\tarchive = filedata->getFilename();\n\t\t\tstartidx = 2;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tarchive = luax_checkstring(L, 2);\n\t\t\tstartidx = 3;\n\t\t}\n\n\t\tconst char *mountpoint = luaL_checkstring(L, startidx + 0);\n\t\tbool append = luax_optboolean(L, startidx + 1, false);\n\n\t\tluax_pushboolean(L, instance()->mount(data, archive.c_str(), mountpoint, append));\n\t\treturn 1;\n\t}\n\telse if (luax_istype(L, 1, NativeFile::type))\n\t{\n\t\tNativeFile *file = luax_totype<NativeFile>(L, 1);\n\t\tarchive = file->getFilename();\n\t}\n\telse\n\t\tarchive = luax_checkstring(L, 1);\n\n\tconst char *mountpoint = luaL_checkstring(L, 2);\n\tbool append = luax_optboolean(L, 3, false);\n\n\tluax_pushboolean(L, instance()->mount(archive.c_str(), mountpoint, append));\n\treturn 1;\n}\n\nint w_mountFullPath(lua_State *L)\n{\n\tconst char *fullpath = luaL_checkstring(L, 1);\n\tconst char *mountpoint = luaL_checkstring(L, 2);\n\n\tauto permissions = Filesystem::MOUNT_PERMISSIONS_READ;\n\tif (!lua_isnoneornil(L, 3))\n\t{\n\t\tconst char *permissionstr = luaL_checkstring(L, 3);\n\t\tif (!Filesystem::getConstant(permissionstr, permissions))\n\t\t\treturn luax_enumerror(L, \"mount permissions\", Filesystem::getConstants(permissions), permissionstr);\n\t}\n\n\tbool append = luax_optboolean(L, 4, false);\n\n\tluax_pushboolean(L, instance()->mountFullPath(fullpath, mountpoint, permissions, append));\n\treturn 1;\n}\n\nint w_mountCommonPath(lua_State *L)\n{\n\tconst char *commonpathstr = luaL_checkstring(L, 1);\n\tFilesystem::CommonPath commonpath;\n\tif (!Filesystem::getConstant(commonpathstr, commonpath))\n\t\treturn luax_enumerror(L, \"common path\", Filesystem::getConstants(commonpath), commonpathstr);\n\n\tconst char *mountpoint = luaL_checkstring(L, 2);\n\n\tauto permissions = Filesystem::MOUNT_PERMISSIONS_READ;\n\tif (!lua_isnoneornil(L, 3))\n\t{\n\t\tconst char *permissionstr = luaL_checkstring(L, 3);\n\t\tif (!Filesystem::getConstant(permissionstr, permissions))\n\t\t\treturn luax_enumerror(L, \"mount permissions\", Filesystem::getConstants(permissions), permissionstr);\n\t}\n\n\tbool append = luax_optboolean(L, 4, false);\n\n\tluax_pushboolean(L, instance()->mountCommonPath(commonpath, mountpoint, permissions, append));\n\treturn 1;\n}\n\nint w_unmount(lua_State *L)\n{\n\tif (luax_istype(L, 1, Data::type))\n\t{\n\t\tData *data = love::data::luax_checkdata(L, 1);\n\t\tluax_pushboolean(L, instance()->unmount(data));\n\t}\n\telse\n\t{\n\t\tconst char *archive = luaL_checkstring(L, 1);\n\t\tluax_pushboolean(L, instance()->unmount(archive));\n\t}\n\treturn 1;\n}\n\nint w_unmountFullPath(lua_State *L)\n{\n\tconst char *fullpath = luaL_checkstring(L, 1);\n\tluax_pushboolean(L, instance()->unmountFullPath(fullpath));\n\treturn 1;\n}\n\nint w_unmountCommonPath(lua_State *L)\n{\n\tconst char *commonpathstr = luaL_checkstring(L, 1);\n\tFilesystem::CommonPath commonpath;\n\tif (!Filesystem::getConstant(commonpathstr, commonpath))\n\t\treturn luax_enumerror(L, \"common path\", Filesystem::getConstants(commonpath), commonpathstr);\n\n\tluax_pushboolean(L, instance()->unmount(commonpath));\n\treturn 1;\n}\n\nint w_openFile(lua_State *L)\n{\n\tconst char *filename = luaL_checkstring(L, 1);\n\tconst char *modestr = luaL_checkstring(L, 2);\n\n\tFile::Mode mode = File::MODE_CLOSED;\n\tif (!File::getConstant(modestr, mode))\n\t\treturn luax_enumerror(L, \"file open mode\", File::getConstants(mode), modestr);\n\n\tFile *t = nullptr;\n\ttry\n\t{\n\t\tt = instance()->openFile(filename, mode);\n\t}\n\tcatch (love::Exception &e)\n\t{\n\t\treturn luax_ioError(L, \"%s\", e.what());\n\t}\n\n\tluax_pushtype(L, t);\n\tt->release();\n\treturn 1;\n}\n\nint w_openNativeFile(lua_State *L)\n{\n\tconst char *path = luaL_checkstring(L, 1);\n\tconst char *modestr = luaL_checkstring(L, 2);\n\n\tFile::Mode mode = File::MODE_CLOSED;\n\tif (!File::getConstant(modestr, mode))\n\t\treturn luax_enumerror(L, \"file open mode\", File::getConstants(mode), modestr);\n\n\tFile *t = nullptr;\n\ttry\n\t{\n\t\tt = instance()->openNativeFile(path, mode);\n\t}\n\tcatch (love::Exception &e)\n\t{\n\t\treturn luax_ioError(L, \"%s\", e.what());\n\t}\n\n\tluax_pushtype(L, t);\n\tt->release();\n\treturn 1;\n}\n\nint w_newFile(lua_State* L)\n{\n\tluax_markdeprecated(L, 1, \"love.filesystem.newFile\", API_FUNCTION, DEPRECATED_RENAMED, \"love.filesystem.openFile\");\n\n\tconst char* filename = luaL_checkstring(L, 1);\n\n\tFile::Mode mode = File::MODE_CLOSED;\n\n\tif (!lua_isnoneornil(L, 2))\n\t{\n\t\tconst char* modestr = luaL_checkstring(L, 2);\n\t\tif (!File::getConstant(modestr, mode))\n\t\t\treturn luax_enumerror(L, \"file open mode\", File::getConstants(mode), modestr);\n\t}\n\n\tFile* t = nullptr;\n\ttry\n\t{\n\t\tt = instance()->openFile(filename, mode);\n\t}\n\tcatch (love::Exception& e)\n\t{\n\t\treturn luax_ioError(L, \"%s\", e.what());\n\t}\n\n\tluax_pushtype(L, t);\n\tt->release();\n\treturn 1;\n}\n\nFile *luax_getfile(lua_State *L, int idx)\n{\n\tFile *file = nullptr;\n\tif (lua_isstring(L, idx))\n\t{\n\t\tconst char *filename = luaL_checkstring(L, idx);\n\t\ttry\n\t\t{\n\t\t\tfile = instance()->openFile(filename, File::MODE_CLOSED);\n\t\t}\n\t\tcatch (love::Exception &e)\n\t\t{\n\t\t\tluax_ioError(L, \"%s\", e.what());\n\t\t}\n\t}\n\telse\n\t{\n\t\tfile = luax_checkfile(L, idx);\n\t\tfile->retain();\n\t}\n\n\treturn file;\n}\n\nFileData *luax_getfiledata(lua_State *L, int idx, bool ioerror, int &nresults)\n{\n\tFileData *data = nullptr;\n\tFile *file = nullptr;\n\tnresults = 0;\n\n\tif (lua_isstring(L, idx) || luax_istype(L, idx, File::type))\n\t{\n\t\tfile = luax_getfile(L, idx);\n\t}\n\telse if (luax_istype(L, idx, FileData::type))\n\t{\n\t\tdata = luax_checkfiledata(L, idx);\n\t\tdata->retain();\n\t}\n\n\tif (!data && !file)\n\t{\n\t\tnresults = luaL_argerror(L, idx, \"filename, File, or FileData expected\");\n\t\treturn nullptr; // Never reached.\n\t}\n\telse if (file && !data)\n\t{\n\t\ttry\n\t\t{\n\t\t\tdata = file->read();\n\t\t}\n\t\tcatch (love::Exception &e)\n\t\t{\n\t\t\tfile->release();\n\t\t\tif (ioerror)\n\t\t\t\tnresults = luax_ioError(L, \"%s\", e.what());\n\t\t\telse\n\t\t\t\tnresults = luaL_error(L, \"%s\", e.what());\n\t\t\treturn nullptr; // Never reached if ioerror is false.\n\t\t}\n\n\t\tfile->release();\n\t}\n\n\treturn data;\n}\n\nFileData *luax_getfiledata(lua_State *L, int idx)\n{\n\tint nresults = 0;\n\treturn luax_getfiledata(L, idx, false, nresults);\n}\n\nData *luax_getdata(lua_State *L, int idx)\n{\n\tData *data = nullptr;\n\tFile *file = nullptr;\n\n\tif (lua_isstring(L, idx) || luax_istype(L, idx, File::type))\n\t{\n\t\tfile = luax_getfile(L, idx);\n\t}\n\telse if (luax_istype(L, idx, Data::type))\n\t{\n\t\tdata = data::luax_checkdata(L, idx);\n\t\tdata->retain();\n\t}\n\n\tif (!data && !file)\n\t{\n\t\tluaL_argerror(L, idx, \"filename, File, or Data expected\");\n\t\treturn nullptr; // Never reached.\n\t}\n\n\tif (file)\n\t{\n\t\tluax_catchexcept(L,\n\t\t\t[&]() { data = file->read(); },\n\t\t\t[&](bool) { file->release(); }\n\t\t);\n\t}\n\n\treturn data;\n}\n\nbool luax_cangetfile(lua_State *L, int idx)\n{\n\treturn lua_isstring(L, idx) || luax_istype(L, idx, File::type);\n}\n\nbool luax_cangetfiledata(lua_State *L, int idx)\n{\n\treturn lua_isstring(L, idx) || luax_istype(L, idx, File::type) || luax_istype(L, idx, FileData::type);\n}\n\nbool luax_cangetdata(lua_State *L, int idx)\n{\n\treturn lua_isstring(L, idx) || luax_istype(L, idx, File::type) || luax_istype(L, idx, Data::type);\n}\n\nint w_newFileData(lua_State *L)\n{\n\t// Single argument: treat as filepath or File.\n\tif (lua_gettop(L) == 1)\n\t{\n\t\tint nresults = 0;\n\t\tFileData *data = luax_getfiledata(L, 1, true, nresults);\n\t\tif (data == nullptr)\n\t\t\treturn nresults;\n\t\tluax_pushtype(L, data);\n\t\tdata->release();\n\t\treturn 1;\n\t}\n\n\tsize_t length = 0;\n\tconst void *ptr = nullptr;\n\tif (luax_istype(L, 1, Data::type))\n\t{\n\t\tData *data = data::luax_checkdata(L, 1);\n\t\tptr = data->getData();\n\t\tlength = data->getSize();\n\t}\n\telse if (lua_isstring(L, 1))\n\t\tptr = luaL_checklstring(L, 1, &length);\n\telse\n\t\treturn luaL_argerror(L, 1, \"string or Data expected\");\n\n\tconst char *filename = luaL_checkstring(L, 2);\n\n\tFileData *t = nullptr;\n\tluax_catchexcept(L, [&](){ t = instance()->newFileData(ptr, length, filename); });\n\n\tluax_pushtype(L, t);\n\tt->release();\n\treturn 1;\n}\n\nint w_getFullCommonPath(lua_State *L)\n{\n\tconst char *commonpathstr = luaL_checkstring(L, 1);\n\tFilesystem::CommonPath commonpath;\n\tif (!Filesystem::getConstant(commonpathstr, commonpath))\n\t\treturn luax_enumerror(L, \"common path\", Filesystem::getConstants(commonpath), commonpathstr);\n\n\tluax_pushstring(L, instance()->getFullCommonPath(commonpath));\n\treturn 1;\n}\n\nint w_getWorkingDirectory(lua_State *L)\n{\n\tlua_pushstring(L, instance()->getWorkingDirectory());\n\treturn 1;\n}\n\nint w_getUserDirectory(lua_State *L)\n{\n\tluax_pushstring(L, instance()->getUserDirectory());\n\treturn 1;\n}\n\nint w_getAppdataDirectory(lua_State *L)\n{\n\tluax_pushstring(L, instance()->getAppdataDirectory());\n\treturn 1;\n}\n\nint w_getSaveDirectory(lua_State *L)\n{\n\tluax_pushstring(L, instance()->getSaveDirectory());\n\treturn 1;\n}\n\nint w_getSourceBaseDirectory(lua_State *L)\n{\n\tluax_pushstring(L, instance()->getSourceBaseDirectory());\n\treturn 1;\n}\n\nint w_getRealDirectory(lua_State *L)\n{\n\tconst char *filename = luaL_checkstring(L, 1);\n\tstd::string dir;\n\n\ttry\n\t{\n\t\tdir = instance()->getRealDirectory(filename);\n\t}\n\tcatch (love::Exception &e)\n\t{\n\t\treturn luax_ioError(L, \"%s\", e.what());\n\t}\n\n\tlua_pushstring(L, dir.c_str());\n\treturn 1;\n}\n\nint w_canonicalizeRealPath(lua_State *L)\n{\n\tconst char *path = luaL_checkstring(L, 1);\n\tluax_pushstring(L, instance()->canonicalizeRealPath(path));\n\treturn 1;\n}\n\nint w_getExecutablePath(lua_State *L)\n{\n\tluax_pushstring(L, instance()->getExecutablePath());\n\treturn 1;\n}\n\nint w_exists(lua_State *L)\n{\n\tconst char *path = luaL_checkstring(L, 1);\n\tluax_pushboolean(L, instance()->exists(path));\n\treturn 1;\n}\n\nint w_getInfo(lua_State *L)\n{\n\tconst char *filepath = luaL_checkstring(L, 1);\n\tFilesystem::Info info = {};\n\n\tint startidx = 2;\n\tFilesystem::FileType filtertype = Filesystem::FILETYPE_MAX_ENUM;\n\tif (lua_isstring(L, startidx))\n\t{\n\t\tconst char *typestr = luaL_checkstring(L, startidx);\n\t\tif (!Filesystem::getConstant(typestr, filtertype))\n\t\t\treturn luax_enumerror(L, \"file type\", Filesystem::getConstants(filtertype), typestr);\n\n\t\tstartidx++;\n\t}\n\n\tif (instance()->getInfo(filepath, info))\n\t{\n\t\tif (filtertype != Filesystem::FILETYPE_MAX_ENUM && info.type != filtertype)\n\t\t{\n\t\t\tlua_pushnil(L);\n\t\t\treturn 1;\n\t\t}\n\n\t\tconst char *typestr = nullptr;\n\t\tif (!Filesystem::getConstant(info.type, typestr))\n\t\t\treturn luaL_error(L, \"Unknown file type.\");\n\n\t\tif (lua_istable(L, startidx))\n\t\t\tlua_pushvalue(L, startidx);\n\t\telse\n\t\t\tlua_createtable(L, 0, 3);\n\n\t\tlua_pushstring(L, typestr);\n\t\tlua_setfield(L, -2, \"type\");\n\n\t\tluax_pushboolean(L, info.readonly);\n\t\tlua_setfield(L, -2, \"readonly\");\n\n\t\t// Lua numbers (doubles) can't fit the full range of 64 bit ints.\n\t\tinfo.size = std::min<int64>(info.size, 0x20000000000000LL);\n\t\tif (info.size >= 0)\n\t\t{\n\t\t\tlua_pushnumber(L, (lua_Number) info.size);\n\t\t\tlua_setfield(L, -2, \"size\");\n\t\t}\n\n\t\tinfo.modtime = std::min<int64>(info.modtime, 0x20000000000000LL);\n\t\tif (info.modtime >= 0)\n\t\t{\n\t\t\tlua_pushnumber(L, (lua_Number) info.modtime);\n\t\t\tlua_setfield(L, -2, \"modtime\");\n\t\t}\n\t}\n\telse\n\t\tlua_pushnil(L);\n\n\treturn 1;\n}\n\nint w_createDirectory(lua_State *L)\n{\n\tconst char *arg = luaL_checkstring(L, 1);\n\tluax_pushboolean(L, instance()->createDirectory(arg));\n\treturn 1;\n}\n\nint w_remove(lua_State *L)\n{\n\tconst char *arg = luaL_checkstring(L, 1);\n\tluax_pushboolean(L, instance()->remove(arg));\n\treturn 1;\n}\n\nint w_read(lua_State *L)\n{\n\tlove::data::ContainerType ctype = love::data::CONTAINER_STRING;\n\tint startidx = 1;\n\n\tif (lua_type(L, 2) == LUA_TSTRING)\n\t{\n\t\tctype = love::data::luax_checkcontainertype(L, 1);\n\t\tstartidx = 2;\n\t}\n\n\tconst char *filename = luaL_checkstring(L, startidx + 0);\n\tint64 len = (int64) luaL_optinteger(L, startidx + 1, -1);\n\n\tFileData *data = nullptr;\n\ttry\n\t{\n\t\tif (len >= 0)\n\t\t\tdata = instance()->read(filename, len);\n\t\telse\n\t\t\tdata = instance()->read(filename);\n\t}\n\tcatch (love::Exception &e)\n\t{\n\t\treturn luax_ioError(L, \"%s\", e.what());\n\t}\n\n\tif (data == nullptr)\n\t\treturn luax_ioError(L, \"File could not be read.\");\n\n\tif (ctype == love::data::CONTAINER_DATA)\n\t\tluax_pushtype(L, data);\n\telse\n\t\tlua_pushlstring(L, (const char *) data->getData(), data->getSize());\n\n\tlua_pushinteger(L, data->getSize());\n\n\t// Lua has a copy now, so we can free it.\n\tdata->release();\n\n\treturn 2;\n}\n\nstatic int w_write_or_append(lua_State *L, File::Mode mode)\n{\n\tconst char *filename = luaL_checkstring(L, 1);\n\n\tconst char *input = nullptr;\n\tsize_t len = 0;\n\n\tif (luax_istype(L, 2, love::Data::type))\n\t{\n\t\tlove::Data *data = luax_totype<love::Data>(L, 2);\n\t\tinput = (const char *) data->getData();\n\t\tlen = data->getSize();\n\t}\n\telse if (lua_isstring(L, 2))\n\t\tinput = lua_tolstring(L, 2, &len);\n\telse\n\t\treturn luaL_argerror(L, 2, \"string or Data expected\");\n\n\t// Get how much we should write. Length of string default.\n\tlen = luaL_optinteger(L, 3, len);\n\n\ttry\n\t{\n\t\tif (mode == File::MODE_APPEND)\n\t\t\tinstance()->append(filename, (const void *) input, len);\n\t\telse\n\t\t\tinstance()->write(filename, (const void *) input, len);\n\t}\n\tcatch (love::Exception &e)\n\t{\n\t\treturn luax_ioError(L, \"%s\", e.what());\n\t}\n\n\tluax_pushboolean(L, true);\n\treturn 1;\n}\n\nint w_write(lua_State *L)\n{\n\treturn w_write_or_append(L, File::MODE_WRITE);\n}\n\nint w_append(lua_State *L)\n{\n\treturn w_write_or_append(L, File::MODE_APPEND);\n}\n\nint w_getDirectoryItems(lua_State *L)\n{\n\tconst char *dir = luaL_checkstring(L, 1);\n\tstd::vector<std::string> items;\n\n\tinstance()->getDirectoryItems(dir, items);\n\n\tlua_createtable(L, (int) items.size(), 0);\n\n\tfor (int i = 0; i < (int) items.size(); i++)\n\t{\n\t\tlua_pushstring(L, items[i].c_str());\n\t\tlua_rawseti(L, -2, i + 1);\n\t}\n\n\t// Return the table.\n\treturn 1;\n}\n\nint w_lines(lua_State *L)\n{\n\tif (lua_isstring(L, 1))\n\t{\n\t\tFile *file = nullptr;\n\t\tluax_catchexcept(L, [&]() { file = instance()->openFile(lua_tostring(L, 1), File::MODE_READ); });\n\n\t\tluax_pushtype(L, file);\n\t\tfile->release();\n\t}\n\telse\n\t\treturn luaL_argerror(L, 1, \"expected filename.\");\n\n\tlua_pushstring(L, \"\"); // buffer\n\tlua_pushstring(L, 0); // buffer offset\n\tlua_pushcclosure(L, w_File_lines_i, 3);\n\treturn 1;\n}\n\nint w_load(lua_State *L)\n{\n\tstd::string filename = std::string(luaL_checkstring(L, 1));\n\n\tFilesystem::LoadMode loadMode = Filesystem::LOADMODE_ANY;\n\n\tif (!lua_isnoneornil(L, 2))\n\t{\n\t\tconst char *mode = luaL_checkstring(L, 2);\n\n\t\tif (!Filesystem::getConstant(mode, loadMode))\n\t\t\treturn luax_enumerror(L, \"load mode\", Filesystem::getConstants(loadMode), mode);\n\t}\n\n\tData *data = nullptr;\n\ttry\n\t{\n\t\tdata = instance()->read(filename.c_str());\n\t}\n\tcatch (love::Exception &e)\n\t{\n\t\treturn luax_ioError(L, \"%s\", e.what());\n\t}\n\n\tint status;\n\n#if (LUA_VERSION_NUM > 501) || defined(LUA_JITLIBNAME)\n\t// LuaJIT support this Lua 5.2 function.\n\tconst char *mode;\n\tFilesystem::getConstant(loadMode, mode);\n\n\tstatus = luaL_loadbufferx(L, (const char *)data->getData(), data->getSize(), (\"@\" + filename).c_str(), mode);\n#else\n\tif (loadMode == Filesystem::LOADMODE_ANY)\n\t\tstatus = luaL_loadbuffer(L, (const char *)data->getData(), data->getSize(), (\"@\" + filename).c_str());\n\telse\n\t{\n\t\t// Unsupported\n\t\tdata->release();\n\t\treturn luaL_error(L, \"only \\\"bt\\\" is supported on this Lua interpreter\\n\");\n\t}\n#endif\n\n\tdata->release();\n\n\t// Load the chunk, but don't run it.\n\tswitch (status)\n\t{\n\tcase LUA_ERRMEM:\n\t\treturn luaL_error(L, \"Memory allocation error: %s\\n\", lua_tostring(L, -1));\n\tcase LUA_ERRSYNTAX:\n\t\treturn luaL_error(L, \"Syntax error: %s\\n\", lua_tostring(L, -1));\n\tdefault: // success\n\t\treturn 1;\n\t}\n}\n\nint w_setSymlinksEnabled(lua_State *L)\n{\n\tinstance()->setSymlinksEnabled(luax_checkboolean(L, 1));\n\treturn 0;\n}\n\nint w_areSymlinksEnabled(lua_State *L)\n{\n\tluax_pushboolean(L, instance()->areSymlinksEnabled());\n\treturn 1;\n}\n\nint w_getRequirePath(lua_State *L)\n{\n\tstd::stringstream path;\n\tbool seperator = false;\n\tfor (auto &element : instance()->getRequirePath())\n\t{\n\t\tif (seperator)\n\t\t\tpath << \";\";\n\t\telse\n\t\t\tseperator = true;\n\n\t\tpath << element;\n\t}\n\n\tluax_pushstring(L, path.str());\n\treturn 1;\n}\n\nint w_getCRequirePath(lua_State *L)\n{\n\tstd::stringstream path;\n\tbool seperator = false;\n\tfor (auto &element : instance()->getCRequirePath())\n\t{\n\t\tif (seperator)\n\t\t\tpath << \";\";\n\t\telse\n\t\t\tseperator = true;\n\n\t\tpath << element;\n\t}\n\n\tluax_pushstring(L, path.str());\n\treturn 1;\n}\n\nint w_setRequirePath(lua_State *L)\n{\n\tstd::string element = luax_checkstring(L, 1);\n\tauto &requirePath = instance()->getRequirePath();\n\n\trequirePath.clear();\n\tstd::stringstream path;\n\tpath << element;\n\n\twhile(std::getline(path, element, ';'))\n\t\trequirePath.push_back(element);\n\n\treturn 0;\n}\n\nint w_setCRequirePath(lua_State *L)\n{\n\tstd::string element = luax_checkstring(L, 1);\n\tauto &requirePath = instance()->getCRequirePath();\n\n\trequirePath.clear();\n\tstd::stringstream path;\n\tpath << element;\n\n\twhile(std::getline(path, element, ';'))\n\t\trequirePath.push_back(element);\n\n\treturn 0;\n}\n\nstatic void replaceAll(std::string &str, const std::string &substr, const std::string &replacement)\n{\n\tstd::vector<size_t> locations;\n\tsize_t pos = 0;\n\tsize_t sublen = substr.length();\n\n\twhile ((pos = str.find(substr, pos)) != std::string::npos)\n\t{\n\t\tlocations.push_back(pos);\n\t\tpos += sublen;\n\t}\n\n\tfor (int i = (int) locations.size() - 1; i >= 0; i--)\n\t\tstr.replace(locations[i], sublen, replacement);\n}\n\nint loader(lua_State *L)\n{\n\tstd::string modulename = luax_checkstring(L, 1);\n\tbool hasSlash = modulename.find('/') != std::string::npos;\n\n\tfor (char &c : modulename)\n\t{\n\t\tif (c == '.')\n\t\t\tc = '/';\n\t}\n\n\tauto *inst = instance();\n\tfor (std::string element : inst->getRequirePath())\n\t{\n\t\treplaceAll(element, \"?\", modulename);\n\n\t\tFilesystem::Info info = {};\n\t\tif (inst->getInfo(element.c_str(), info) && info.type != Filesystem::FILETYPE_DIRECTORY)\n\t\t{\n\t\t\tif (hasSlash)\n\t\t\t\tluax_markdeprecated(L, 2, \"character in require string (forward slashes), use dots instead.\", API_CUSTOM);\n\n\t\t\tlua_pop(L, 1);\n\t\t\tlua_pushstring(L, element.c_str());\n\t\t\treturn w_load(L);\n\t\t}\n\t}\n\n\tstd::string errstr = \"\\n\\tno '%s' in LOVE game directories.\";\n\n\tlua_pushfstring(L, errstr.c_str(), modulename.c_str());\n\treturn 1;\n}\n\nstatic const char *library_extensions[] =\n{\n#ifdef LOVE_WINDOWS\n\t\".dll\"\n#elif defined(LOVE_MACOS) || defined(LOVE_IOS)\n\t\".dylib\", \".so\"\n#else\n\t\".so\"\n#endif\n};\n\nint extloader(lua_State *L)\n{\n\tstd::string filename = luax_checkstring(L, 1);\n\tstd::string tokenized_name(filename);\n\tstd::string tokenized_function(filename);\n\n\t// We need both the tokenized filename (dots replaced with slashes)\n\t// and the tokenized function name (dots replaced with underscores)\n\t// NOTE: Lua's loader queries more names than this one.\n\tfor (unsigned int i = 0; i < tokenized_name.size(); i++)\n\t{\n\t\tif (tokenized_name[i] == '.')\n\t\t{\n\t\t\ttokenized_name[i] = '/';\n\t\t\ttokenized_function[i] = '_';\n\t\t}\n\t}\n\n\tSDL_SharedObject *handle = nullptr;\n\tauto *inst = instance();\n\n\tstd::string loaderror = \"\";\n\n#ifdef LOVE_ANDROID\n\t// Specifically Android, look the library path based on getCRequirePath first\n\tstd::string androidPath(love::android::getCRequirePath());\n\n\tif (!androidPath.empty())\n\t{\n\t\t// Replace ? with just the dotted filename (not tokenized_name)\n\t\treplaceAll(androidPath, \"?\", filename);\n\n\t\t// Load directly, don't check for existence.\n\t\thandle = SDL_LoadObject(androidPath.c_str());\n\t}\n\n\tif (!handle)\n\t{\n\t\tloaderror += std::string(\" \") + std::string(SDL_GetError());\n#endif // LOVE_ANDROID\n\n\tfor (const std::string &el : inst->getCRequirePath())\n\t{\n\t\tfor (const char *ext : library_extensions)\n\t\t{\n\t\t\tstd::string element = el;\n\n\t\t\t// Replace ?? with the filename and extension\n\t\t\treplaceAll(element, \"??\", tokenized_name + ext);\n\n\t\t\t// And ? with just the filename\n\t\t\treplaceAll(element, \"?\", tokenized_name);\n\n\t\t\tFilesystem::Info info = {};\n\t\t\tif (!inst->getInfo(element.c_str(), info) || info.type == Filesystem::FILETYPE_DIRECTORY)\n\t\t\t\tcontinue;\n\n\t\t\t// Now resolve the full path, as we're bypassing physfs for the next part.\n\t\t\tstd::string filepath = inst->getRealDirectory(element.c_str()) + LOVE_PATH_SEPARATOR + element;\n\n\t\t\thandle = SDL_LoadObject(filepath.c_str());\n\t\t\t// Can fail, for instance if it turned out the source was a zip\n\t\t\tif (handle)\n\t\t\t\tbreak;\n\t\t\telse\n\t\t\t\tloaderror += std::string(\" \") + std::string(SDL_GetError());\n\t\t}\n\n\t\tif (handle)\n\t\t\tbreak;\n\t}\n\n#ifdef LOVE_ANDROID\n\t} // if (!handle)\n#endif\n\n\tif (!handle)\n\t{\n\t\tlua_pushfstring(L, \"\\n\\tno valid C library '%s' in LOVE paths.%s\", tokenized_name.c_str(), loaderror.c_str());\n\t\treturn 1;\n\t}\n\n\t// We look for both loveopen_ and luaopen_, so libraries with specific love support\n\t// can tell when they've been loaded by love.\n\tSDL_FunctionPointer func = SDL_LoadFunction(handle, (\"loveopen_\" + tokenized_function).c_str());\n\tif (!func)\n\t\tfunc = SDL_LoadFunction(handle, (\"luaopen_\" + tokenized_function).c_str());\n\n\tif (!func)\n\t{\n\t\tSDL_UnloadObject(handle);\n\t\tlua_pushfstring(L, \"\\n\\tC library '%s' is incompatible.\", tokenized_name.c_str());\n\t\treturn 1;\n\t}\n\n\tlua_pushcfunction(L, (lua_CFunction) func);\n\treturn 1;\n}\n\n// List of functions to wrap.\nstatic const luaL_Reg functions[] =\n{\n\t{ \"init\", w_init },\n\t{ \"setFused\", w_setFused },\n\t{ \"isFused\", w_isFused },\n\t{ \"_setAndroidSaveExternal\", w_setAndroidSaveExternal },\n\t{ \"setIdentity\", w_setIdentity },\n\t{ \"getIdentity\", w_getIdentity },\n\t{ \"setSource\", w_setSource },\n\t{ \"getSource\", w_getSource },\n\t{ \"mount\", w_mount },\n\t{ \"mountFullPath\", w_mountFullPath },\n\t{ \"mountCommonPath\", w_mountCommonPath },\n\t{ \"unmount\", w_unmount },\n\t{ \"unmountFullPath\", w_unmountFullPath },\n\t{ \"unmountCommonPath\", w_unmountCommonPath },\n\t{ \"openFile\", w_openFile },\n\t{ \"openNativeFile\", w_openNativeFile },\n\t{ \"getFullCommonPath\", w_getFullCommonPath },\n\t{ \"getWorkingDirectory\", w_getWorkingDirectory },\n\t{ \"getUserDirectory\", w_getUserDirectory },\n\t{ \"getAppdataDirectory\", w_getAppdataDirectory },\n\t{ \"getSaveDirectory\", w_getSaveDirectory },\n\t{ \"getSourceBaseDirectory\", w_getSourceBaseDirectory },\n\t{ \"getRealDirectory\", w_getRealDirectory },\n\t{ \"canonicalizeRealPath\", w_canonicalizeRealPath },\n\t{ \"getExecutablePath\", w_getExecutablePath },\n\t{ \"createDirectory\", w_createDirectory },\n\t{ \"remove\", w_remove },\n\t{ \"read\", w_read },\n\t{ \"write\", w_write },\n\t{ \"append\", w_append },\n\t{ \"getDirectoryItems\", w_getDirectoryItems },\n\t{ \"lines\", w_lines },\n\t{ \"load\", w_load },\n\t{ \"exists\", w_exists },\n\t{ \"getInfo\", w_getInfo },\n\t{ \"setSymlinksEnabled\", w_setSymlinksEnabled },\n\t{ \"areSymlinksEnabled\", w_areSymlinksEnabled },\n\t{ \"newFileData\", w_newFileData },\n\t{ \"getRequirePath\", w_getRequirePath },\n\t{ \"setRequirePath\", w_setRequirePath },\n\t{ \"getCRequirePath\", w_getCRequirePath },\n\t{ \"setCRequirePath\", w_setCRequirePath },\n\n\t// Deprecated\n\t{ \"newFile\", w_newFile },\n\n\t{ 0, 0 }\n};\n\nstatic const lua_CFunction types[] =\n{\n\tluaopen_file,\n\tluaopen_nativefile,\n\tluaopen_filedata,\n\t0\n};\n\nextern \"C\" int luaopen_love_filesystem(lua_State *L)\n{\n\tFilesystem *instance = instance();\n\tif (instance == nullptr)\n\t{\n\t\tluax_catchexcept(L, [&](){ instance = new physfs::Filesystem(); });\n\t}\n\telse\n\t\tinstance->retain();\n\n\t// The love loaders should be tried after package.preload.\n\tlove::luax_register_searcher(L, loader, 2);\n\tlove::luax_register_searcher(L, extloader, 3);\n\n\tWrappedModule w;\n\tw.module = instance;\n\tw.name = \"filesystem\";\n\tw.type = &Filesystem::type;\n\tw.functions = functions;\n\tw.types = types;\n\n\treturn luax_register_module(L, w);\n}\n\n} // filesystem\n} // love\n"
  },
  {
    "path": "src/modules/filesystem/wrap_Filesystem.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_FILESYSTEM_WRAP_FILESYSTEM_H\n#define LOVE_FILESYSTEM_WRAP_FILESYSTEM_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"File.h\"\n#include \"FileData.h\"\n\nnamespace love\n{\nnamespace filesystem\n{\n\n/**\n * Gets FileData at the specified index. If the index contains a filepath or\n * a File object, the FileData will be created from that.\n * Note that this function retains the FileData object (possibly by creating it),\n * so a matching release() is required!\n * May trigger a Lua error.\n **/\nFileData *luax_getfiledata(lua_State *L, int idx);\nbool luax_cangetfiledata(lua_State *L, int idx);\n\nFile *luax_getfile(lua_State *L, int idx);\nbool luax_cangetfile(lua_State *L, int idx);\n\nData *luax_getdata(lua_State *L, int idx);\nbool luax_cangetdata(lua_State *L, int idx);\n\nint loader(lua_State *L);\nint extloader(lua_State *L);\nextern \"C\" LOVE_EXPORT int luaopen_love_filesystem(lua_State *L);\n\n} // filesystem\n} // love\n\n#endif // LOVE_FILESYSTEM_WRAP_FILESYSTEM_H\n"
  },
  {
    "path": "src/modules/filesystem/wrap_NativeFile.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_NativeFile.h\"\n#include \"wrap_File.h\"\n\nnamespace love\n{\nnamespace filesystem\n{\n\nNativeFile *luax_checknativefile(lua_State *L, int idx)\n{\n\treturn luax_checktype<NativeFile>(L, idx);\n}\n\nextern \"C\" int luaopen_nativefile(lua_State *L)\n{\n\treturn luax_register_type(L, &NativeFile::type, w_File_functions, nullptr);\n}\n\n} // filesystem\n} // love\n"
  },
  {
    "path": "src/modules/filesystem/wrap_NativeFile.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"NativeFile.h\"\n\nnamespace love\n{\nnamespace filesystem\n{\n\nNativeFile *luax_checknativefile(lua_State *L, int idx);\nextern \"C\" int luaopen_nativefile(lua_State *L);\n\n} // filesystem\n} // love\n"
  },
  {
    "path": "src/modules/font/BMFontRasterizer.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"BMFontRasterizer.h\"\n#include \"GenericShaper.h\"\n#include \"filesystem/Filesystem.h\"\n#include \"image/Image.h\"\n\n// C++\n#include <sstream>\n#include <vector>\n#include <algorithm>\n\n// C\n#include <cstdlib>\n#include <cstring>\n\nnamespace love\n{\nnamespace font\n{\n\nnamespace\n{\n\n/**\n * Helper class for parsing lines in BMFont definition files.\n * NOTE: Does not properly handle multi-value attributes (e.g. 'padding' or\n * 'spacing'.)\n **/\nclass BMFontLine\n{\npublic:\n\n\tBMFontLine(const std::string &line);\n\n\tconst std::string &getTag() const { return tag; }\n\n\tint getAttributeInt(const char *name) const;\n\tstd::string getAttributeString(const char *name) const;\n\nprivate:\n\n\tstd::string tag;\n\tstd::unordered_map<std::string, std::string> attributes;\n\n};\n\n// This is not entirely robust...\nBMFontLine::BMFontLine(const std::string &line)\n{\n\t// The tag name should always be at the start of the line.\n\ttag = line.substr(0, line.find(' '));\n\n\tsize_t startpos = 0;\n\n\twhile (startpos < line.length())\n\t{\n\t\t// Find the next '=', which indicates a key-value pair.\n\t\tsize_t fpos = line.find('=', startpos);\n\t\tif (fpos == std::string::npos || fpos + 1 >= line.length())\n\t\t\tbreak;\n\n\t\t// The key should be between a space character and the '='.\n\t\tsize_t keystart = line.rfind(' ', fpos);\n\t\tif (keystart == std::string::npos)\n\t\t\tbreak;\n\n\t\tkeystart++;\n\n\t\tstd::string key = line.substr(keystart, fpos - keystart);\n\n\t\tsize_t valstart = fpos + 1;\n\t\tsize_t valend = valstart + 1;\n\n\t\tif (line[valstart] == '\"')\n\t\t{\n\t\t\t// Values can be surrounded by quotes (a literal string.)\n\t\t\tvalstart++;\n\t\t\tvalend = line.find('\"', valstart) - 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Otherwise look for the next space character after the '='.\n\t\t\tvalend = line.find(' ', valstart + 1) - 1;\n\t\t}\n\n\t\tvalend = std::min(valend, line.length() - 1);\n\n\t\tattributes[key] = line.substr(valstart, valend - valstart + 1);\n\n\t\tstartpos = valend + 1;\n\t}\n}\n\nint BMFontLine::getAttributeInt(const char *name) const\n{\n\tauto it = attributes.find(name);\n\tif (it == attributes.end())\n\t\treturn 0;\n\n\treturn (int) strtol(it->second.c_str(), nullptr, 10);\n}\n\nstd::string BMFontLine::getAttributeString(const char *name) const\n{\n\tauto it = attributes.find(name);\n\tif (it == attributes.end())\n\t\treturn \"\";\n\n\treturn it->second;\n}\n\n} // anonymous namespace\n\n\nBMFontRasterizer::BMFontRasterizer(love::filesystem::FileData *fontdef, const std::vector<image::ImageData *> &imagelist, float dpiscale)\n\t: fontSize(0)\n\t, unicode(false)\n\t, lineHeight(0)\n{\n\tthis->dpiScale = dpiscale;\n\n\tconst std::string &filename = fontdef->getFilename();\n\n\tsize_t separatorpos = filename.rfind('/');\n\tif (separatorpos != std::string::npos)\n\t\tfontFolder = filename.substr(0, separatorpos);\n\n\t// The parseConfig function will try to load any missing page images.\n\tfor (int i = 0; i < (int) imagelist.size(); i++)\n\t{\n\t\tif (imagelist[i]->getFormat() != PIXELFORMAT_RGBA8_UNORM)\n\t\t\tthrow love::Exception(\"Only 32-bit RGBA images are supported in BMFonts.\");\n\n\t\timages[i] = imagelist[i];\n\t}\n\n\tstd::string configtext((const char *) fontdef->getData(), fontdef->getSize());\n\n\tparseConfig(configtext);\n}\n\nBMFontRasterizer::~BMFontRasterizer()\n{\n}\n\nvoid BMFontRasterizer::parseConfig(const std::string &configtext)\n{\n\t{\n\t\tBMFontCharacter nullchar = {};\n\t\tnullchar.page = -1;\n\t\tnullchar.glyph = 0;\n\t\tcharacters.push_back(nullchar);\n\t\tcharacterIndices[0] = (int)characters.size() - 1;\n\t}\n\n\tstd::stringstream ss(configtext);\n\tstd::string line;\n\n\twhile (std::getline(ss, line))\n\t{\n\t\tBMFontLine cline(line);\n\n\t\tconst std::string &tag = cline.getTag();\n\n\t\tif (tag == \"info\")\n\t\t{\n\t\t\tfontSize = cline.getAttributeInt(\"size\");\n\t\t\tunicode  = cline.getAttributeInt(\"unicode\") > 0;\n\t\t}\n\t\telse if (tag == \"common\")\n\t\t{\n\t\t\tlineHeight = cline.getAttributeInt(\"lineHeight\");\n\t\t\tmetrics.ascent = cline.getAttributeInt(\"base\");\n\t\t\tmetrics.descent = metrics.ascent - lineHeight; // Negative.\n\t\t}\n\t\telse if (tag == \"page\")\n\t\t{\n\t\t\tint pageindex = cline.getAttributeInt(\"id\");\n\t\t\tstd::string filename = cline.getAttributeString(\"file\");\n\n\t\t\t// The file name is relative to the font file's folder.\n\t\t\tif (!fontFolder.empty())\n\t\t\t\tfilename = fontFolder + \"/\" + filename;\n\n\t\t\t// Load the page file from disk into an ImageData, if necessary.\n\t\t\tif (images[pageindex].get() == nullptr)\n\t\t\t{\n\t\t\t\tusing namespace love::filesystem;\n\t\t\t\tusing namespace love::image;\n\n\t\t\t\tauto filesystem  = Module::getInstance<Filesystem>(Module::M_FILESYSTEM);\n\t\t\t\tauto imagemodule = Module::getInstance<image::Image>(Module::M_IMAGE);\n\n\t\t\t\tif (!filesystem)\n\t\t\t\t\tthrow love::Exception(\"Filesystem module not loaded!\");\n\t\t\t\tif (!imagemodule)\n\t\t\t\t\tthrow love::Exception(\"Image module not loaded!\");\n\n\t\t\t\t// read() returns a retained ref already.\n\t\t\t\tStrongRef<FileData> data(filesystem->read(filename.c_str()), Acquire::NORETAIN);\n\n\t\t\t\tImageData *imagedata = imagemodule->newImageData(data.get());\n\n\t\t\t\tif (imagedata->getFormat() != PIXELFORMAT_RGBA8_UNORM)\n\t\t\t\t{\n\t\t\t\t\timagedata->release();\n\t\t\t\t\tthrow love::Exception(\"Only 32-bit RGBA images are supported in BMFonts.\");\n\t\t\t\t}\n\n\t\t\t\t// Same with newImageData.\n\t\t\t\timages[pageindex].set(imagedata, Acquire::NORETAIN);\n\t\t\t}\n\t\t}\n\t\telse if (tag == \"char\")\n\t\t{\n\t\t\tBMFontCharacter c = {};\n\n\t\t\tuint32 id = (uint32) cline.getAttributeInt(\"id\");\n\n\t\t\tc.x    = cline.getAttributeInt(\"x\");\n\t\t\tc.y    = cline.getAttributeInt(\"y\");\n\t\t\tc.page = cline.getAttributeInt(\"page\");\n\n\t\t\tc.metrics.width    =  cline.getAttributeInt(\"width\");\n\t\t\tc.metrics.height   =  cline.getAttributeInt(\"height\");\n\t\t\tc.metrics.bearingX =  cline.getAttributeInt(\"xoffset\");\n\t\t\tc.metrics.bearingY = -cline.getAttributeInt(\"yoffset\");\n\t\t\tc.metrics.advance  =  cline.getAttributeInt(\"xadvance\");\n\n\t\t\tc.glyph = id;\n\n\t\t\tcharacters.push_back(c);\n\t\t\tcharacterIndices[id] = (int) characters.size() - 1;\n\n\t\t\tmetrics.advance = std::max(metrics.advance, c.metrics.advance);\n\t\t}\n\t\telse if (tag == \"kerning\")\n\t\t{\n\t\t\tuint32 firstid  = (uint32) cline.getAttributeInt(\"first\");\n\t\t\tuint32 secondid = (uint32) cline.getAttributeInt(\"second\");\n\n\t\t\tuint64 packedids = ((uint64) firstid << 32) | (uint64) secondid;\n\n\t\t\tkerning[packedids] = cline.getAttributeInt(\"amount\");\n\t\t}\n\t}\n\n\tif (characters.size() == 0)\n\t\tthrow love::Exception(\"Invalid BMFont file (no character definitions?)\");\n\n\t// Try to guess the line height if the lineheight attribute isn't found.\n\tbool guessheight = lineHeight == 0;\n\n\t// Verify the glyph character attributes.\n\tfor (const auto &c : characters)\n\t{\n\t\tif (c.glyph == 0)\n\t\t\tcontinue;\n\n\t\tint width = c.metrics.width;\n\t\tint height = c.metrics.height;\n\n\t\tif (!unicode && c.glyph > 127)\n\t\t\tthrow love::Exception(\"Invalid BMFont character id (only unicode and ASCII are supported)\");\n\n\t\tif (c.page < 0 || images[c.page].get() == nullptr)\n\t\t\tthrow love::Exception(\"Invalid BMFont character page id: %d\", c.page);\n\n\t\tconst image::ImageData *id = images[c.page].get();\n\n\t\tif (!id->inside(c.x, c.y))\n\t\t\tthrow love::Exception(\"Invalid coordinates for BMFont character %u.\", c.glyph);\n\n\t\tif (width > 0 && !id->inside(c.x + width - 1, c.y))\n\t\t\tthrow love::Exception(\"Invalid width %d for BMFont character %u.\", width, c.glyph);\n\n\t\tif (height > 0 && !id->inside(c.x, c.y + height - 1))\n\t\t\tthrow love::Exception(\"Invalid height %d for BMFont character %u.\", height, c.glyph);\n\n\t\tif (guessheight)\n\t\t\tlineHeight = std::max(lineHeight, c.metrics.height);\n\t}\n\n\tmetrics.height = lineHeight;\n}\n\nint BMFontRasterizer::getLineHeight() const\n{\n\treturn lineHeight;\n}\n\nint BMFontRasterizer::getGlyphSpacing(uint32 glyph) const\n{\n\tauto it = characterIndices.find(glyph);\n\tif (it == characterIndices.end())\n\t\treturn 0;\n\n\treturn characters[it->second].metrics.advance;\n}\n\nint BMFontRasterizer::getGlyphIndex(uint32 glyph) const\n{\n\tauto it = characterIndices.find(glyph);\n\tif (it == characterIndices.end())\n\t\treturn 0;\n\treturn it->second;\n}\n\nGlyphData *BMFontRasterizer::getGlyphDataForIndex(int index) const\n{\n\t// Return an empty GlyphData if we don't have the glyph character.\n\tif (index < 0 || index >= (int) characters.size())\n\t\treturn new GlyphData(0, GlyphMetrics(), PIXELFORMAT_RGBA8_UNORM);\n\n\tconst BMFontCharacter& c = characters[index];\n\tconst auto &imagepair = images.find(c.page);\n\n\tif (imagepair == images.end())\n\t\treturn new GlyphData(c.glyph, GlyphMetrics(), PIXELFORMAT_RGBA8_UNORM);\n\n\timage::ImageData *imagedata = imagepair->second.get();\n\tGlyphData *g = new GlyphData(c.glyph, c.metrics, PIXELFORMAT_RGBA8_UNORM);\n\n\tsize_t pixelsize = imagedata->getPixelSize();\n\n\tuint8 *pixels = (uint8 *) g->getData();\n\tconst uint8 *ipixels = (const uint8 *) imagedata->getData();\n\n\t// Always lock the mutex since the user can't know when to do it.\n\tlove::thread::Lock lock(imagedata->getMutex());\n\n\t// Copy the subsection of the texture from the ImageData to the GlyphData.\n\tfor (int y = 0; y < c.metrics.height; y++)\n\t{\n\t\tsize_t idindex = ((c.y + y) * imagedata->getWidth() + c.x) * pixelsize;\n\t\tmemcpy(&pixels[y * c.metrics.width * pixelsize], &ipixels[idindex], pixelsize * c.metrics.width);\n\t}\n\n\treturn g;\n}\n\nint BMFontRasterizer::getGlyphCount() const\n{\n\treturn (int) characters.size();\n}\n\nbool BMFontRasterizer::hasGlyph(uint32 glyph) const\n{\n\treturn characterIndices.find(glyph) != characterIndices.end();\n}\n\nfloat BMFontRasterizer::getKerning(uint32 leftglyph, uint32 rightglyph) const\n{\n\tuint64 packedglyphs = ((uint64) leftglyph << 32) | (uint64) rightglyph;\n\n\tauto it = kerning.find(packedglyphs);\n\tif (it != kerning.end())\n\t\treturn it->second;\n\n\treturn 0.0f;\n}\n\nRasterizer::DataType BMFontRasterizer::getDataType() const\n{\n\treturn DATA_IMAGE;\n}\n\nTextShaper *BMFontRasterizer::newTextShaper()\n{\n\treturn new GenericShaper(this);\n}\n\nbool BMFontRasterizer::accepts(love::filesystem::FileData *fontdef)\n{\n\tconst char *data = (const char *) fontdef->getData();\n\n\t// Check if the \"info\" tag is at the start of the file. This is a truly\n\t// crappy test. Is the tag even guaranteed to be at the start?\n\treturn fontdef->getSize() > 4 && memcmp(data, \"info\", 4) == 0;\n}\n\n} // font\n} // love\n"
  },
  {
    "path": "src/modules/font/BMFontRasterizer.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_FONT_BMFONT_RASTERIZER_H\n#define LOVE_FONT_BMFONT_RASTERIZER_H\n\n// LOVE\n#include \"common/config.h\"\n#include \"Rasterizer.h\"\n#include \"image/ImageData.h\"\n\n// C++\n#include <unordered_map>\n#include <vector>\n\nnamespace love\n{\nnamespace font\n{\n\n/**\n * Rasterizer for BMFont bitmap fonts.\n **/\nclass BMFontRasterizer : public Rasterizer\n{\npublic:\n\n\tBMFontRasterizer(love::filesystem::FileData *fontdef, const std::vector<image::ImageData *> &imagelist, float dpiscale);\n\tvirtual ~BMFontRasterizer();\n\n\t// Implements Rasterizer.\n\tint getLineHeight() const override;\n\tint getGlyphSpacing(uint32 glyph) const override;\n\tint getGlyphIndex(uint32 glyph) const override;\n\tGlyphData *getGlyphDataForIndex(int index) const override;\n\tint getGlyphCount() const override;\n\tbool hasGlyph(uint32 glyph) const override;\n\tfloat getKerning(uint32 leftglyph, uint32 rightglyph) const override;\n\tDataType getDataType() const override;\n\tTextShaper *newTextShaper() override;\n\n\tstatic bool accepts(love::filesystem::FileData *fontdef);\n\nprivate:\n\n\tstruct BMFontCharacter\n\t{\n\t\tint x;\n\t\tint y;\n\t\tint page;\n\t\tGlyphMetrics metrics;\n\t\tuint32 glyph;\n\t};\n\n\tvoid parseConfig(const std::string &config);\n\n\tstd::string fontFolder;\n\n\t// Image pages, indexed by their page id.\n\tstd::unordered_map<int, StrongRef<image::ImageData>> images;\n\n\tstd::vector<BMFontCharacter> characters;\n\n\t// Glyph character indices, indexed by their glyph id.\n\tstd::unordered_map<uint32, int> characterIndices;\n\n\t// Kerning information, indexed by two (packed) characters.\n\tstd::unordered_map<uint64, int> kerning;\n\n\tint fontSize;\n\tbool unicode;\n\n\tint lineHeight;\n\n}; // BMFontRasterizer\n\n} // font\n} // love\n\n#endif // LOVE_FONT_BMFONT_RASTERIZER_H\n"
  },
  {
    "path": "src/modules/font/Font.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"Font.h\"\n#include \"BMFontRasterizer.h\"\n#include \"ImageRasterizer.h\"\n#include \"data/DataModule.h\"\n\n#include \"libraries/utf8/utf8.h\"\n\nnamespace love\n{\nnamespace font\n{\n\n// Default TrueType font, gzip-compressed.\n#include \"NotoSans-Regular.ttf.gzip.h\"\n\nFont::Font(const char *name)\n\t: Module(M_FONT, name)\n{\n\tauto compressedbytes = (const char *) NotoSans_Regular_ttf_gzip;\n\tsize_t compressedsize = NotoSans_Regular_ttf_gzip_len;\n\n\tsize_t rawsize = 0;\n\tchar *fontdata = data::decompress(data::Compressor::FORMAT_GZIP, compressedbytes, compressedsize, rawsize);\n\n\tdefaultFontData.set(new data::ByteData(fontdata, rawsize, true), Acquire::NORETAIN);\n}\n\nRasterizer *Font::newTrueTypeRasterizer(int size, const TrueTypeRasterizer::Settings &settings)\n{\n\treturn newTrueTypeRasterizer(defaultFontData.get(), size, settings);\n}\n\nRasterizer *Font::newBMFontRasterizer(love::filesystem::FileData *fontdef, const std::vector<image::ImageData *> &images, float dpiscale)\n{\n\treturn new BMFontRasterizer(fontdef, images, dpiscale);\n}\n\nRasterizer *Font::newImageRasterizer(love::image::ImageData *data, const std::string &text, int extraspacing, float dpiscale)\n{\n\tstd::vector<uint32> glyphs;\n\tglyphs.reserve(text.size());\n\n\ttry\n\t{\n\t\tutf8::iterator<std::string::const_iterator> i(text.begin(), text.begin(), text.end());\n\t\tutf8::iterator<std::string::const_iterator> end(text.end(), text.begin(), text.end());\n\n\t\twhile (i != end)\n\t\t\tglyphs.push_back(*i++);\n\t}\n\tcatch (utf8::exception &e)\n\t{\n\t\tthrow love::Exception(\"UTF-8 decoding error: %s\", e.what());\n\t}\n\n\treturn new ImageRasterizer(data, glyphs.data(), (int) glyphs.size(), extraspacing, dpiscale);\n}\n\nGlyphData *Font::newGlyphData(Rasterizer *r, const std::string &text)\n{\n\tuint32 codepoint = 0;\n\n\ttry\n\t{\n\t\tcodepoint = utf8::peek_next(text.begin(), text.end());\n\t}\n\tcatch (utf8::exception &e)\n\t{\n\t\tthrow love::Exception(\"UTF-8 decoding error: %s\", e.what());\n\t}\n\n\treturn r->getGlyphData(codepoint);\n}\n\nGlyphData *Font::newGlyphData(Rasterizer *r, uint32 glyph)\n{\n\treturn r->getGlyphData(glyph);\n}\n\n} // font\n} // love\n"
  },
  {
    "path": "src/modules/font/Font.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_FONT_FONT_H\n#define LOVE_FONT_FONT_H\n\n// LOVE\n#include \"Rasterizer.h\"\n#include \"TrueTypeRasterizer.h\"\n#include \"image/ImageData.h\"\n#include \"filesystem/FileData.h\"\n#include \"common/Module.h\"\n#include \"common/int.h\"\n\n// C++\n#include <string>\n#include <vector>\n\nnamespace love\n{\nnamespace font\n{\n\nclass Font : public Module\n{\n\npublic:\n\n\tvirtual ~Font() {}\n\n\tvirtual Rasterizer *newRasterizer(love::filesystem::FileData *data) = 0;\n\n\tRasterizer *newTrueTypeRasterizer(int size, const TrueTypeRasterizer::Settings &settings);\n\tvirtual Rasterizer *newTrueTypeRasterizer(love::Data *data, int size, const TrueTypeRasterizer::Settings &settings) = 0;\n\n\tvirtual Rasterizer *newBMFontRasterizer(love::filesystem::FileData *fontdef, const std::vector<image::ImageData *> &images, float dpiscale);\n\n\tvirtual Rasterizer *newImageRasterizer(love::image::ImageData *data, const std::string &glyphs, int extraspacing, float dpiscale);\n\n\tvirtual GlyphData *newGlyphData(Rasterizer *r, const std::string &glyph);\n\tvirtual GlyphData *newGlyphData(Rasterizer *r, uint32 glyph);\n\nprotected:\n\n\tFont(const char *name);\n\nprivate:\n\n\tStrongRef<Data> defaultFontData;\n\n}; // Font\n\n} // font\n} // love\n\n#endif // LOVE_FONT_FONT_H\n"
  },
  {
    "path": "src/modules/font/GenericShaper.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"GenericShaper.h\"\n#include \"Rasterizer.h\"\n#include \"common/Optional.h\"\n\n#include <algorithm>\n\nnamespace love\n{\nnamespace font\n{\n\nGenericShaper::GenericShaper(Rasterizer *rasterizer)\n\t: TextShaper(rasterizer)\n{\n}\n\nGenericShaper::~GenericShaper()\n{\n}\n\nvoid GenericShaper::computeGlyphPositions(const ColoredCodepoints &codepoints, Range range, Vector2 offset, float extraspacing, std::vector<GlyphPosition> *positions, std::vector<IndexedColor> *colors, TextInfo *info)\n{\n\tif (!range.isValid())\n\t\trange = Range(0, codepoints.cps.size());\n\n\tif (rasterizers[0]->getDataType() == Rasterizer::DATA_TRUETYPE)\n\t\toffset.y += getBaseline();\n\n\t// Spacing counter and newline handling.\n\tVector2 curpos = offset;\n\tfloat spacingremainder = 0;\n\n\tfloat maxwidth = 0;\n\tuint32 prevglyph = 0;\n\n\tif (positions)\n\t\tpositions->reserve(range.getSize());\n\n\tint colorindex = 0;\n\tint ncolors = (int) codepoints.colors.size();\n\tOptional<Colorf> colorToAdd;\n\n\t// Make sure the right color is applied to the start of the glyph list,\n\t// when the start isn't 0.\n\tif (colors && range.getOffset() > 0 && !codepoints.colors.empty())\n\t{\n\t\tfor (; colorindex < ncolors; colorindex++)\n\t\t{\n\t\t\tif (codepoints.colors[colorindex].index >= (int) range.getOffset())\n\t\t\t\tbreak;\n\t\t\tcolorToAdd.set(codepoints.colors[colorindex].color);\n\t\t}\n\t}\n\n\tfor (int i = (int) range.getMin(); i <= (int) range.getMax(); i++)\n\t{\n\t\tuint32 g = codepoints.cps[i];\n\n\t\t// Do this before anything else so we don't miss colors corresponding\n\t\t// to newlines. The actual add to the list happens after newline\n\t\t// handling, to make sure the resulting index is valid in the positions\n\t\t// array.\n\t\tif (colors && colorindex < ncolors && codepoints.colors[colorindex].index == i)\n\t\t{\n\t\t\tcolorToAdd.set(codepoints.colors[colorindex].color);\n\t\t\tcolorindex++;\n\t\t}\n\n\t\tif (g == '\\n')\n\t\t{\n\t\t\tmaxwidth = std::max(maxwidth, curpos.x);\n\n\t\t\t// Wrap newline, but do not output a position for it.\n\t\t\tcurpos.y += getCombinedHeight();\n\t\t\tcurpos.x = offset.x;\n\t\t\tprevglyph = 0;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore carriage returns\n\t\tif (g == '\\r')\n\t\t{\n\t\t\tprevglyph = g;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (colorToAdd.hasValue && colors && positions)\n\t\t{\n\t\t\tIndexedColor c = {colorToAdd.value, (int) positions->size()};\n\t\t\tcolors->push_back(c);\n\t\t\tcolorToAdd.clear();\n\t\t}\n\n\t\t// Add kerning to the current horizontal offset.\n\t\tcurpos.x += getKerning(prevglyph, g);\n\n\t\tGlyphIndex glyphindex;\n\t\tfloat advance = getGlyphAdvance(g, &glyphindex);\n\n\t\tif (positions)\n\t\t\tpositions->push_back({ Vector2(curpos.x, curpos.y), glyphindex });\n\n\t\t// Advance the x position for the next glyph.\n\t\tcurpos.x += advance;\n\n\t\t// Account for extra spacing given to space characters.\n\t\tif (g == ' ' && extraspacing != 0.0f)\n\t\t{\n\t\t\tspacingremainder += fmod(extraspacing, 1);\n\t\t\tcurpos.x += floorf(extraspacing) + floorf(spacingremainder);\n\t\t\tspacingremainder = fmod(spacingremainder, 1);\n\t\t}\n\n\t\tprevglyph = g;\n\t}\n\n\tmaxwidth = std::max(maxwidth, curpos.x);\n\n\tif (info != nullptr)\n\t{\n\t\tinfo->width = maxwidth - offset.x;\n\t\tinfo->height = curpos.y - offset.y;\n\t\tif (curpos.x > offset.x)\n\t\t\tinfo->height += getCombinedHeight();\n\t}\n}\n\nint GenericShaper::computeWordWrapIndex(const ColoredCodepoints &codepoints, Range range, float wraplimit, float *width)\n{\n\tif (!range.isValid())\n\t\trange = Range(0, codepoints.cps.size());\n\n\tuint32 prevglyph = 0;\n\n\tfloat w = 0.0f;\n\tfloat outwidth = 0.0f;\n\tfloat widthbeforelastspace = 0.0f;\n\tint firstindexafterspace = -1;\n\n\tfor (int i = (int)range.getMin(); i <= (int)range.getMax(); i++)\n\t{\n\t\tuint32 g = codepoints.cps[i];\n\n\t\tif (g == '\\r')\n\t\t{\n\t\t\tprevglyph = g;\n\t\t\tcontinue;\n\t\t}\n\n\t\tfloat newwidth = w + getKerning(prevglyph, g) + getGlyphAdvance(g);\n\n\t\t// Don't count trailing spaces in the output width.\n\t\tif (isWhitespace(g))\n\t\t{\n\t\t\tif (!isWhitespace(prevglyph))\n\t\t\t\twidthbeforelastspace = w;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (isWhitespace(prevglyph))\n\t\t\t\tfirstindexafterspace = i;\n\n\t\t\t// Only wrap when there's a non-space character.\n\t\t\tif (newwidth > wraplimit)\n\t\t\t{\n\t\t\t\t// If this is the first character, wrap from the next one instead of this one.\n\t\t\t\tint wrapindex = i > (int)range.first ? i : (int)range.first + 1;\n\n\t\t\t\t// Rewind to after the last seen space when wrapping.\n\t\t\t\tif (firstindexafterspace != -1)\n\t\t\t\t{\n\t\t\t\t\twrapindex = firstindexafterspace;\n\t\t\t\t\toutwidth = widthbeforelastspace;\n\t\t\t\t}\n\n\t\t\t\tif (width)\n\t\t\t\t\t*width = outwidth;\n\n\t\t\t\treturn wrapindex;\n\t\t\t}\n\n\t\t\toutwidth = newwidth;\n\t\t}\n\n\t\tw = newwidth;\n\t\tprevglyph = g;\n\t}\n\n\tif (width)\n\t\t*width = outwidth;\n\n\t// There wasn't any wrap in the middle of the range.\n\treturn range.last + 1;\n}\n\n} // font\n} // love\n"
  },
  {
    "path": "src/modules/font/GenericShaper.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"TextShaper.h\"\n\nnamespace love\n{\nnamespace font\n{\n\nclass GenericShaper : public love::font::TextShaper\n{\npublic:\n\n\tGenericShaper(Rasterizer *rasterizer);\n\tvirtual ~GenericShaper();\n\n\tvoid computeGlyphPositions(const ColoredCodepoints &codepoints, Range range, Vector2 offset, float extraspacing, std::vector<GlyphPosition> *positions, std::vector<IndexedColor> *colors, TextInfo *info) override;\n\tint computeWordWrapIndex(const ColoredCodepoints &codepoints, Range range, float wraplimit, float *width) override;\n\nprivate:\n\n}; // GenericShaper\n\n} // font\n} // love\n"
  },
  {
    "path": "src/modules/font/GlyphData.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"GlyphData.h\"\n\n// UTF-8\n#include \"libraries/utf8/utf8.h\"\n\nnamespace love\n{\nnamespace font\n{\n\nlove::Type GlyphData::type(\"GlyphData\", &Data::type);\n\nGlyphData::GlyphData(uint32 glyph, GlyphMetrics glyphMetrics, PixelFormat f)\n\t: glyph(glyph)\n\t, metrics(glyphMetrics)\n\t, data(nullptr)\n\t, format(f)\n{\n\tif (f != PIXELFORMAT_LA8_UNORM && f != PIXELFORMAT_RGBA8_UNORM)\n\t\tthrow love::Exception(\"Invalid GlyphData pixel format.\");\n\n\tif (metrics.width > 0 && metrics.height > 0)\n\t\tdata = new uint8[metrics.width * metrics.height * getPixelSize()];\n}\n\nGlyphData::GlyphData(const GlyphData &c)\n\t: glyph(c.glyph)\n\t, metrics(c.metrics)\n\t, data(nullptr)\n\t, format(c.format)\n{\n\tif (metrics.width > 0 && metrics.height > 0)\n\t{\n\t\tdata = new uint8[metrics.width * metrics.height * getPixelSize()];\n\t\tmemcpy(data, c.data, c.getSize());\n\t}\n}\n\nGlyphData::~GlyphData()\n{\n\tdelete[] data;\n}\n\nGlyphData *GlyphData::clone() const\n{\n\treturn new GlyphData(*this);\n}\n\nvoid *GlyphData::getData() const\n{\n\treturn data;\n}\n\nsize_t GlyphData::getPixelSize() const\n{\n\treturn getPixelFormatBlockSize(format);\n}\n\nvoid *GlyphData::getData(int x, int y) const\n{\n\tsize_t offset = (y * getWidth() + x) * getPixelSize();\n\treturn data + offset;\n}\n\nsize_t GlyphData::getSize() const\n{\n\treturn size_t(getWidth() * getHeight()) * getPixelSize();\n}\n\nint GlyphData::getHeight() const\n{\n\treturn metrics.height;\n}\n\nint GlyphData::getWidth() const\n{\n\treturn metrics.width;\n}\n\nuint32 GlyphData::getGlyph() const\n{\n\treturn glyph;\n}\n\nstd::string GlyphData::getGlyphString() const\n{\n\tchar u[5] = {0, 0, 0, 0, 0};\n\tptrdiff_t length = 0;\n\n\ttry\n\t{\n\t\tchar *end = utf8::append(glyph, u);\n\t\tlength = end - u;\n\t}\n\tcatch (utf8::exception &e)\n\t{\n\t\tthrow love::Exception(\"UTF-8 decoding error: %s\", e.what());\n\t}\n\n\t// Just in case...\n\tif (length < 0)\n\t\treturn \"\";\n\n\treturn std::string(u, length);\n}\n\nint GlyphData::getAdvance() const\n{\n\treturn metrics.advance;\n}\n\nint GlyphData::getBearingX() const\n{\n\treturn metrics.bearingX;\n}\n\nint GlyphData::getBearingY() const\n{\n\treturn metrics.bearingY;\n}\n\nint GlyphData::getMinX() const\n{\n\treturn getBearingX();\n}\n\nint GlyphData::getMinY() const\n{\n\treturn getHeight() - getBearingY();\n}\n\nint GlyphData::getMaxX() const\n{\n\treturn getBearingX() + getWidth();\n}\n\nint GlyphData::getMaxY() const\n{\n\treturn getBearingY();\n}\n\nPixelFormat GlyphData::getFormat() const\n{\n\treturn format;\n}\n\n} // font\n} // love\n"
  },
  {
    "path": "src/modules/font/GlyphData.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_FONT_GLYPH_DATA_H\n#define LOVE_FONT_GLYPH_DATA_H\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/Data.h\"\n#include \"common/Exception.h\"\n#include \"common/StringMap.h\"\n#include \"common/int.h\"\n#include \"common/pixelformat.h\"\n\n// stdlib\n#include <string>\n\nnamespace love\n{\nnamespace font\n{\n\n/**\n * Holds the specific glyph data.\n **/\nstruct GlyphMetrics\n{\n\tint height;\n\tint width;\n\tint advance;\n\tint bearingX;\n\tint bearingY;\n};\n\n/**\n * Holds data for a specic glyph object.\n **/\nclass GlyphData : public Data\n{\npublic:\n\n\tstatic love::Type type;\n\n\tGlyphData(uint32 glyph, GlyphMetrics glyphMetrics, PixelFormat f);\n\tGlyphData(const GlyphData &c);\n\tvirtual ~GlyphData();\n\n\t// Implements Data.\n\tGlyphData *clone() const;\n\tvoid *getData() const;\n\tsize_t getSize() const;\n\n\t/**\n\t * Gets the data starting at a specific pixel in the glyph.\n\t **/\n\tvoid *getData(int x, int y) const;\n\n\t/**\n\t * Gets the size in bytes of each pixel in the glyph.\n\t **/\n\tsize_t getPixelSize() const;\n\n\t/**\n\t * Gets the height of the glyph.\n\t **/\n\tvirtual int getHeight() const;\n\n\t/**\n\t * Gets the width of the glyph.\n\t **/\n\tvirtual int getWidth() const;\n\n\t/**\n\t * Gets the glyph codepoint itself.\n\t **/\n\tuint32 getGlyph() const;\n\n\t/**\n\t * Gets the glyph as a UTF-8 string (instead of a UTF-8 code point.)\n\t **/\n\tstd::string getGlyphString() const;\n\n\t/**\n\t * Gets the advance (the space the glyph takes up) of the glyph.\n\t **/\n\tint getAdvance() const;\n\n\t/**\n\t * Gets bearing (the spacing from origin) along the x-axis of the glyph.\n\t **/\n\tint getBearingX() const;\n\n\t/**\n\t * Gets bearing (the spacing from origin) along the y-axis of the glyph.\n\t **/\n\tint getBearingY() const;\n\n\t/**\n\t * Gets the min x value of the glyph.\n\t **/\n\tint getMinX() const;\n\n\t/**\n\t * Gets the min y value of the glyph.\n\t **/\n\tint getMinY() const;\n\n\t/**\n\t * Gets the max x value of the glyph.\n\t **/\n\tint getMaxX() const;\n\n\t/**\n\t * Gets the max y value of the glyph.\n\t **/\n\tint getMaxY() const;\n\n\t/**\n\t * Gets the format of the glyph data.\n\t **/\n\tPixelFormat getFormat() const;\n\nprivate:\n\n\t// The glyph codepoint itself.\n\tuint32 glyph;\n\n\t// Glyph metrics.\n\tGlyphMetrics metrics;\n\n\t// Glyph texture data.\n\tuint8 *data;\n\n\t// The format the data's in.\n\tPixelFormat format;\n\n}; // GlyphData\n\n} // font\n} // love\n\n#endif // LOVE_FONT_GLYPH_DATA_H\n"
  },
  {
    "path": "src/modules/font/ImageRasterizer.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"ImageRasterizer.h\"\n#include \"GenericShaper.h\"\n#include \"common/Exception.h\"\n\n#include <string.h>\n#include <algorithm>\n\nnamespace love\n{\nnamespace font\n{\n\nstatic_assert(sizeof(Color32) == 4, \"sizeof(Color32) must equal 4 bytes!\");\n\nImageRasterizer::ImageRasterizer(love::image::ImageData *data, const uint32 *glyphs, int numglyphs, int extraspacing, float dpiscale)\n\t: imageData(data)\n\t, numglyphs(numglyphs + 1) // Always have a null glyph at the start of the array.\n\t, extraSpacing(extraspacing)\n{\n\tthis->dpiScale = dpiscale;\n\n\tif (data->getFormat() != PIXELFORMAT_RGBA8_UNORM)\n\t\tthrow love::Exception(\"Only 32-bit RGBA images are supported in Image Fonts!\");\n\n\tload(glyphs, numglyphs);\n}\n\nImageRasterizer::~ImageRasterizer()\n{\n}\n\nint ImageRasterizer::getLineHeight() const\n{\n\treturn getHeight();\n}\n\nint ImageRasterizer::getGlyphSpacing(uint32 glyph) const\n{\n\tauto it = glyphIndices.find(glyph);\n\tif (it == glyphIndices.end())\n\t\treturn 0;\n\treturn imageGlyphs[it->second].width + extraSpacing;\n}\n\nint ImageRasterizer::getGlyphIndex(uint32 glyph) const\n{\n\tauto it = glyphIndices.find(glyph);\n\tif (it == glyphIndices.end())\n\t\treturn 0;\n\treturn it->second;\n}\n\nGlyphData *ImageRasterizer::getGlyphDataForIndex(int index) const\n{\n\tGlyphMetrics gm = {};\n\tuint32 glyph = 0;\n\n\t// Set relevant glyph metrics if the glyph is in this ImageFont\n\tif (index >= 0 && index < (int) imageGlyphs.size())\n\t{\n\t\tgm.width = imageGlyphs[index].width;\n\t\tgm.advance = imageGlyphs[index].width + extraSpacing;\n\t\tglyph = imageGlyphs[index].glyph;\n\t}\n\n\tgm.height = metrics.height;\n\n\tGlyphData *g = new GlyphData(glyph, gm, PIXELFORMAT_RGBA8_UNORM);\n\n\tif (gm.width == 0)\n\t\treturn g;\n\n\t// Always lock the mutex since the user can't know when to do it.\n\tlove::thread::Lock lock(imageData->getMutex());\n\n\tColor32 *gdpixels = (Color32 *) g->getData();\n\tconst Color32 *imagepixels = (const Color32 *) imageData->getData();\n\n\t// copy glyph pixels from imagedata to glyphdata\n\tfor (int i = 0; i < g->getWidth() * g->getHeight(); i++)\n\t{\n\t\tColor32 p = imagepixels[imageGlyphs[index].x + (i % gm.width) + (imageData->getWidth() * (i / gm.width))];\n\n\t\t// Use transparency instead of the spacer color\n\t\tif (p == spacer)\n\t\t\tgdpixels[i] = Color32(0, 0, 0, 0);\n\t\telse\n\t\t\tgdpixels[i] = p;\n\t}\n\n\treturn g;\n}\n\nvoid ImageRasterizer::load(const uint32 *glyphs, int glyphcount)\n{\n\tauto pixels = (const Color32 *) imageData->getData();\n\n\tint imgw = imageData->getWidth();\n\tint imgh = imageData->getHeight();\n\n\t// Set the only metric that matters\n\tmetrics.height = imgh;\n\n\t// Reading texture data begins\n\tspacer = pixels[0];\n\n\tint start = 0;\n\tint end = 0;\n\n\t{\n\t\tImageGlyphData nullglyph;\n\t\tnullglyph.x = 0;\n\t\tnullglyph.width = 0;\n\t\tnullglyph.glyph = 0;\n\t\timageGlyphs.push_back(nullglyph);\n\t\tglyphIndices[0] = (int) imageGlyphs.size() - 1;\n\t}\n\n\tfor (int i = 0; i < glyphcount; ++i)\n\t{\n\t\tstart = end;\n\n\t\t// Finds out where the first character starts\n\t\twhile (start < imgw && pixels[start] == spacer)\n\t\t\t++start;\n\n\t\tend = start;\n\n\t\t// Find where glyph ends.\n\t\twhile (end < imgw && pixels[end] != spacer)\n\t\t\t++end;\n\n\t\tif (start >= end)\n\t\t\tbreak;\n\n\t\tImageGlyphData imageGlyph;\n\t\timageGlyph.x = start;\n\t\timageGlyph.width = end - start;\n\t\timageGlyph.glyph = glyphs[i];\n\n\t\timageGlyphs.push_back(imageGlyph);\n\t\tglyphIndices[glyphs[i]] = (int) imageGlyphs.size() - 1;\n\n\t\tmetrics.advance = std::max(metrics.advance, imageGlyph.width + extraSpacing);\n\t}\n}\n\nint ImageRasterizer::getGlyphCount() const\n{\n\treturn numglyphs;\n}\n\nbool ImageRasterizer::hasGlyph(uint32 glyph) const\n{\n\treturn glyphIndices.find(glyph) != glyphIndices.end();\n}\n\nRasterizer::DataType ImageRasterizer::getDataType() const\n{\n\treturn DATA_IMAGE;\n}\n\nTextShaper *ImageRasterizer::newTextShaper()\n{\n\treturn new GenericShaper(this);\n}\n\n} // font\n} // love\n"
  },
  {
    "path": "src/modules/font/ImageRasterizer.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_FONT_IMAGE_RASTERIZER_H\n#define LOVE_FONT_IMAGE_RASTERIZER_H\n\n// LOVE\n#include \"font/Rasterizer.h\"\n#include \"image/ImageData.h\"\n#include \"common/Color.h\"\n\n#include <map>\n\nnamespace love\n{\nnamespace font\n{\n\n/**\n * Holds data for a font object.\n **/\nclass ImageRasterizer : public Rasterizer\n{\npublic:\n\tImageRasterizer(love::image::ImageData *imageData, const uint32 *glyphs, int numglyphs, int extraspacing, float dpiscale);\n\tvirtual ~ImageRasterizer();\n\n\t// Implement Rasterizer\n\tint getLineHeight() const override;\n\tint getGlyphSpacing(uint32 glyph) const override;\n\tint getGlyphIndex(uint32 glyph) const override;\n\tGlyphData *getGlyphDataForIndex(int index) const override;\n\tint getGlyphCount() const override;\n\tbool hasGlyph(uint32 glyph) const override;\n\tDataType getDataType() const override;\n\tTextShaper *newTextShaper() override;\n\n\nprivate:\n\n\t// Information about a glyph in the ImageData\n\tstruct ImageGlyphData\n\t{\n\t\tint x;\n\t\tint width;\n\t\tuint32 glyph;\n\t};\n\n\t// Load all the glyph positions into memory\n\tvoid load(const uint32 *glyphs, int glyphcount);\n\n\t// The image data\n\tStrongRef<love::image::ImageData> imageData;\n\n\t// Number of glyphs in the font\n\tint numglyphs;\n\n\tint extraSpacing;\n\n\n\tstd::vector<ImageGlyphData> imageGlyphs;\n\tstd::map<uint32, int> glyphIndices;\n\n\t// Color used to identify glyph separation in the source ImageData\n\tColor32 spacer;\n\n}; // ImageRasterizer\n\n} // font\n} // love\n\n#endif // LOVE_FONT_IMAGE_RASTERIZER_H\n"
  },
  {
    "path": "src/modules/font/NotoSans-Regular.ttf.gzip.h",
    "content": "unsigned char NotoSans_Regular_ttf_gzip[] = {\n  0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xec, 0xbd,\n  0x0b, 0x7c, 0x54, 0xc5, 0xd9, 0x3f, 0x3e, 0x33, 0x27, 0x39, 0xbb, 0x9b,\n  0x5d, 0x43, 0xc0, 0x10, 0x2e, 0x62, 0xa4, 0x88, 0x88, 0x88, 0x88, 0x88,\n  0x80, 0x88, 0x98, 0x84, 0x24, 0xe4, 0x9e, 0x25, 0x37, 0x72, 0xbf, 0x27,\n  0xe4, 0xba, 0x89, 0x88, 0x48, 0x11, 0x11, 0x11, 0x11, 0x11, 0x29, 0x22,\n  0x22, 0x45, 0x4a, 0x11, 0x11, 0x91, 0x52, 0x44, 0x44, 0xc4, 0x88, 0x94,\n  0x62, 0xca, 0x6b, 0x91, 0xa6, 0x88, 0x88, 0x11, 0x29, 0xd2, 0x15, 0xd1,\n  0xe2, 0x8a, 0x88, 0x18, 0x11, 0x91, 0xfc, 0xbe, 0xf3, 0xcc, 0x39, 0x61,\n  0x13, 0xee, 0x5e, 0xfa, 0xf6, 0xed, 0xff, 0x9f, 0xf9, 0x3c, 0xf3, 0xcc,\n  0xcc, 0x39, 0x67, 0xae, 0xcf, 0x3c, 0xf3, 0x7d, 0xe6, 0x9c, 0xcd, 0x30,\n  0xce, 0x18, 0x6b, 0x0f, 0xcf, 0x87, 0x05, 0x8c, 0x0c, 0x8f, 0x88, 0x3c,\n  0x79, 0xd3, 0x0f, 0xd1, 0x8c, 0xf1, 0x6e, 0x48, 0x58, 0x31, 0xd2, 0x99,\n  0x98, 0x5c, 0x3a, 0xed, 0xc4, 0x04, 0xc6, 0x7c, 0xeb, 0x19, 0xe7, 0x7d,\n  0x46, 0x26, 0xa7, 0x86, 0xf5, 0x5a, 0xed, 0x89, 0x61, 0x5c, 0x3f, 0xc2,\n  0xd8, 0xaf, 0xc6, 0x27, 0x26, 0xdf, 0x38, 0xe0, 0xb1, 0x17, 0xa7, 0x8f,\n  0x62, 0xbc, 0x77, 0x19, 0x72, 0xc9, 0x2f, 0xaa, 0x2e, 0xa8, 0x7d, 0x74,\n  0x75, 0xf0, 0xe5, 0x88, 0xbf, 0xc5, 0x98, 0xdf, 0xc0, 0xa2, 0xf1, 0xe3,\n  0xba, 0x0f, 0xf7, 0xb9, 0xe2, 0x7a, 0x66, 0x79, 0x35, 0x0e, 0x79, 0xf6,\n  0x2d, 0xad, 0x1d, 0x53, 0xbd, 0x78, 0x50, 0x97, 0x3d, 0xcc, 0xb2, 0x01,\n  0x79, 0xfa, 0x77, 0x1c, 0x53, 0x70, 0x57, 0x2d, 0x9e, 0x0b, 0xc0, 0xf5,\n  0x70, 0x70, 0xeb, 0x98, 0xaa, 0x5f, 0x97, 0x8e, 0xfe, 0xf4, 0xfa, 0x27,\n  0x19, 0x1f, 0x70, 0x92, 0xf9, 0x8e, 0xeb, 0x5c, 0x56, 0x52, 0x50, 0xdc,\n  0x75, 0x76, 0xec, 0xbf, 0x98, 0xfe, 0x7c, 0x20, 0xae, 0x0f, 0x2a, 0x43,\n  0x82, 0xe3, 0xe5, 0xc0, 0x44, 0xc4, 0x91, 0x1f, 0xeb, 0x59, 0x56, 0x3d,\n  0x6e, 0x42, 0xde, 0xab, 0xf1, 0x49, 0x88, 0x23, 0x9f, 0x9b, 0xbb, 0x55,\n  0xd5, 0x14, 0x15, 0x5c, 0xfd, 0x74, 0xe1, 0x2a, 0xa6, 0xef, 0x99, 0x85,\n  0x78, 0xf7, 0xea, 0x82, 0x09, 0xb5, 0xed, 0xfe, 0x10, 0xf0, 0x03, 0xb3,\n  0x5c, 0xb6, 0x0a, 0xf7, 0x77, 0x77, 0x15, 0x54, 0x97, 0xcc, 0xce, 0x7a,\n  0xed, 0x3e, 0xc4, 0xb7, 0x33, 0xa6, 0x77, 0xa8, 0xad, 0xb9, 0x6b, 0xdc,\n  0x8c, 0x43, 0x22, 0x9d, 0x59, 0x2e, 0xdf, 0xcf, 0xd8, 0xb3, 0x45, 0xb5,\n  0x63, 0x4b, 0x6a, 0x9d, 0x23, 0xdb, 0xfd, 0x89, 0x59, 0xb6, 0xce, 0x41,\n  0x7d, 0x7d, 0x19, 0x67, 0x82, 0xf9, 0x33, 0x26, 0xb6, 0x81, 0x8e, 0x23,\n  0x3c, 0x8e, 0xf5, 0x64, 0xb7, 0x23, 0x35, 0x9c, 0xe5, 0xc0, 0xaf, 0x82,\n  0xe3, 0x6c, 0x12, 0x1c, 0x67, 0x53, 0xd9, 0x02, 0xf8, 0x0b, 0xd9, 0x06,\n  0xf8, 0x75, 0x3c, 0x1a, 0xbd, 0x95, 0xca, 0x53, 0xe1, 0x8f, 0x16, 0xc8,\n  0x48, 0x74, 0x12, 0x9d, 0xe0, 0x77, 0x17, 0xdd, 0xe1, 0xf7, 0x12, 0xbd,\n  0x98, 0x26, 0x86, 0x8a, 0xa1, 0x08, 0xdf, 0x2e, 0x90, 0x9b, 0xb8, 0x43,\n  0x84, 0xc1, 0x0f, 0x17, 0x25, 0xf0, 0x2b, 0x44, 0x35, 0xfc, 0x3b, 0x7d,\n  0xee, 0x61, 0xdc, 0x67, 0x9a, 0xcf, 0x34, 0xf8, 0x0f, 0xfb, 0x3c, 0x0c,\n  0x7f, 0x9e, 0x0f, 0xf2, 0xf7, 0x79, 0xd9, 0xe7, 0x65, 0xa6, 0xf9, 0xbc,\n  0xea, 0xf3, 0x1a, 0xc2, 0xaf, 0xfb, 0x6c, 0x82, 0xbf, 0xd9, 0x57, 0x43,\n  0x45, 0x2d, 0xbe, 0x16, 0xf8, 0x7e, 0xbe, 0xb1, 0xf0, 0x13, 0x7c, 0x13,\n  0xe0, 0xa7, 0xfa, 0xa6, 0xc1, 0x4f, 0xf7, 0xcd, 0x82, 0x9f, 0xe3, 0x5b,\n  0x04, 0xbf, 0xd4, 0xb7, 0x14, 0xbe, 0xcb, 0xd7, 0x05, 0xff, 0xd7, 0xfa,\n  0x3f, 0x30, 0x86, 0xfb, 0xf5, 0xfd, 0xf0, 0x3f, 0xb6, 0xd8, 0x18, 0xb7,\n  0x38, 0x2c, 0x9d, 0xe1, 0x0f, 0xb0, 0x0c, 0x82, 0x3f, 0xd4, 0x82, 0xba,\n  0x59, 0xa2, 0x2c, 0x51, 0x4c, 0xb3, 0x24, 0x58, 0x8a, 0x11, 0x1e, 0x6f,\n  0xf9, 0x35, 0xc2, 0x13, 0x2d, 0xab, 0x10, 0x5e, 0x6d, 0x59, 0xcb, 0x84,\n  0xe5, 0x65, 0x0b, 0xea, 0x60, 0xf9, 0x93, 0xe5, 0x4f, 0xf0, 0xdf, 0xb4,\n  0x40, 0x3a, 0x2c, 0x7f, 0xb5, 0x6c, 0x87, 0xdf, 0x60, 0xd9, 0x0d, 0xff,\n  0x03, 0xcb, 0x07, 0xf0, 0x3f, 0xb1, 0x7c, 0x02, 0xff, 0x90, 0xe5, 0x73,\n  0xf8, 0x5f, 0x58, 0x0e, 0xc3, 0x3f, 0x62, 0x39, 0x0a, 0xff, 0x1b, 0x4b,\n  0x13, 0xfc, 0xef, 0xad, 0xbd, 0x19, 0xb7, 0x5e, 0x6f, 0xbd, 0x1e, 0xfe,\n  0x00, 0xeb, 0xcd, 0xf0, 0x6f, 0xb1, 0xde, 0x02, 0x7f, 0x88, 0xf5, 0x36,\n  0xf8, 0xb7, 0x5b, 0x87, 0xc3, 0x0f, 0xb1, 0x86, 0xc2, 0x0f, 0xb7, 0x46,\n  0xc2, 0x8f, 0xb2, 0x46, 0xc1, 0x8f, 0xb1, 0xa2, 0x8d, 0xd6, 0x44, 0x6b,\n  0x32, 0xfc, 0x54, 0x2b, 0x7a, 0xd8, 0x9a, 0x6e, 0x4d, 0x87, 0x9f, 0x6f,\n  0x1d, 0x03, 0xbf, 0xdc, 0x86, 0xde, 0xb6, 0x09, 0x1b, 0x46, 0xce, 0x66,\n  0xb5, 0x59, 0xe1, 0xdb, 0x6d, 0x76, 0xf8, 0x5d, 0x6c, 0xe8, 0x79, 0x5b,\n  0x0f, 0x5b, 0x0f, 0xf8, 0x7d, 0x6d, 0x28, 0xc5, 0x36, 0xc4, 0x86, 0x52,\n  0x6c, 0x21, 0x36, 0xe4, 0x6f, 0x8b, 0xb4, 0x61, 0xbc, 0x6c, 0xf1, 0xb6,\n  0x78, 0xf8, 0x89, 0xb6, 0x44, 0xf8, 0x19, 0xb6, 0x0c, 0xf8, 0x59, 0xb6,\n  0x5c, 0xf8, 0xf9, 0xb6, 0x02, 0xf8, 0x45, 0x36, 0xe4, 0x6f, 0x2b, 0xb7,\n  0x61, 0xac, 0x6d, 0x93, 0x6d, 0x93, 0xe1, 0xcf, 0xb2, 0x3d, 0x06, 0xff,\n  0x29, 0x1b, 0xc6, 0xc5, 0xb6, 0xc8, 0xb6, 0x08, 0xfe, 0x2a, 0xdb, 0x1f,\n  0xe1, 0xbf, 0x68, 0x7b, 0x11, 0xfe, 0x4b, 0xb6, 0x97, 0xe0, 0xbf, 0x6c,\n  0x5b, 0x07, 0x7f, 0x83, 0x0d, 0x7d, 0x65, 0x7b, 0xdd, 0xf6, 0x06, 0xfc,\n  0x7a, 0xdb, 0x56, 0xf8, 0xbb, 0x6d, 0xef, 0xc3, 0xff, 0xc8, 0xf6, 0x05,\n  0xfc, 0x2f, 0x6d, 0x47, 0x18, 0xf7, 0x7b, 0xdb, 0x0f, 0xbd, 0xe7, 0xb7,\n  0xc7, 0x6f, 0x0f, 0xfc, 0xbd, 0x7e, 0xfb, 0xe0, 0xef, 0xf7, 0x3b, 0x00,\n  0xff, 0x53, 0xbf, 0xcf, 0xe0, 0x1f, 0xf6, 0xfb, 0x12, 0xfe, 0xd7, 0x7e,\n  0x5f, 0x33, 0x6e, 0x7f, 0xda, 0xfe, 0x34, 0xfc, 0x45, 0x8e, 0xd1, 0x4c,\n  0x73, 0x64, 0x38, 0x30, 0xb2, 0x8e, 0x52, 0xc7, 0x7d, 0x08, 0x4f, 0x76,\n  0xa0, 0x56, 0x8e, 0x07, 0x1c, 0x4b, 0x11, 0x7e, 0xd6, 0x81, 0x12, 0x1d,\n  0x1b, 0x1d, 0x28, 0xd1, 0xb1, 0xc5, 0x81, 0x12, 0x21, 0xc5, 0xbe, 0xac,\n  0x33, 0xb9, 0xee, 0x70, 0xc2, 0x18, 0x47, 0xf4, 0x16, 0xe6, 0x3d, 0xe7,\n  0x37, 0x20, 0x45, 0x67, 0x7e, 0x08, 0xa1, 0x57, 0xc4, 0x3d, 0x94, 0xca,\n  0x98, 0x9c, 0x73, 0xab, 0x41, 0x0d, 0xb8, 0xcd, 0x89, 0x3b, 0xba, 0x90,\n  0xec, 0x32, 0xfb, 0x4b, 0x76, 0xb4, 0xca, 0xfe, 0xaa, 0xfd, 0x6f, 0xcc,\n  0xd7, 0xfe, 0xae, 0x7d, 0x37, 0xeb, 0x66, 0xff, 0x87, 0xfd, 0x23, 0xd6,\n  0xdd, 0xfe, 0xb1, 0xfd, 0x00, 0xbb, 0xda, 0xfe, 0x2f, 0xbb, 0x87, 0x5d,\n  0x63, 0xff, 0xd2, 0x7e, 0x84, 0x5d, 0x67, 0x3f, 0x6a, 0x3f, 0xca, 0xae,\n  0xb7, 0x7f, 0x63, 0xff, 0x86, 0xf5, 0xb5, 0x1f, 0xb7, 0x1f, 0x67, 0x37,\n  0xd8, 0x4f, 0xda, 0x4f, 0xb2, 0x7e, 0x0e, 0xdd, 0xa1, 0xb3, 0x1b, 0x1d,\n  0x76, 0x87, 0x9d, 0xf5, 0x77, 0x74, 0x70, 0x74, 0x62, 0x37, 0x39, 0xba,\n  0x3a, 0x7a, 0xb3, 0xc1, 0x8e, 0xeb, 0x1d, 0xa1, 0x2c, 0xd2, 0x31, 0xc2,\n  0x11, 0xc7, 0x72, 0x1c, 0x09, 0x8e, 0x14, 0x36, 0xc6, 0x31, 0x1a, 0xed,\n  0x74, 0x39, 0xca, 0x1d, 0xe5, 0xac, 0xc6, 0x51, 0xeb, 0xb8, 0x87, 0xd5,\n  0x3a, 0xee, 0x75, 0xdc, 0xcb, 0x26, 0xa0, 0x9d, 0xb3, 0xd9, 0xaf, 0x1d,\n  0x73, 0xd0, 0xda, 0x87, 0x65, 0xeb, 0xec, 0x0d, 0xf6, 0xbf, 0xdb, 0x77,\n  0xd8, 0xdf, 0xb1, 0xef, 0x74, 0xfc, 0xca, 0x71, 0xad, 0x63, 0xb0, 0x63,\n  0x86, 0x63, 0x96, 0xe3, 0x71, 0xc7, 0x93, 0x8e, 0xdf, 0x3a, 0x16, 0xa3,\n  0xe6, 0x1d, 0x69, 0xe6, 0x30, 0x92, 0x63, 0xf4, 0x9d, 0xfd, 0x45, 0xd4,\n  0xfc, 0x7d, 0xfb, 0x5e, 0xd6, 0xc5, 0xbe, 0xdf, 0xee, 0x66, 0x57, 0xd9,\n  0x0f, 0xda, 0x3f, 0x63, 0x3d, 0xec, 0x5f, 0xd8, 0xbf, 0x40, 0xcd, 0xbf,\n  0xb2, 0x7f, 0xc5, 0x7a, 0xd9, 0xbf, 0xb6, 0x1f, 0x63, 0xd7, 0xda, 0x9b,\n  0xec, 0xdf, 0xa2, 0x15, 0xdf, 0xd9, 0xbf, 0x47, 0x2b, 0x7e, 0x70, 0xf8,\n  0xa2, 0xe6, 0x16, 0x87, 0x1f, 0xea, 0xe9, 0x70, 0xb4, 0x67, 0xb7, 0x39,\n  0x3a, 0x3b, 0xba, 0xb0, 0x50, 0xc7, 0x15, 0x8e, 0x3e, 0x6c, 0x84, 0xe3,\n  0x06, 0xd4, 0x39, 0xd9, 0x91, 0xea, 0x48, 0x63, 0x77, 0x61, 0x3c, 0xca,\n  0xd8, 0xdd, 0x8e, 0x0a, 0x8c, 0xca, 0x04, 0x1a, 0x8f, 0x59, 0xa8, 0x61,\n  0x3f, 0xfb, 0x1a, 0xfb, 0x2b, 0xf6, 0xf5, 0xf6, 0xc3, 0x8e, 0x6e, 0x8e,\n  0x2b, 0x1d, 0x57, 0xa1, 0x96, 0x3d, 0x1c, 0x3d, 0x1d, 0xd7, 0x38, 0x7a,\n  0xa1, 0xb6, 0xbd, 0x51, 0xdf, 0x5b, 0x1d, 0x43, 0x1d, 0xc3, 0x1c, 0x61,\n  0x68, 0x7b, 0xb8, 0xe3, 0x2e, 0x3c, 0x35, 0xcd, 0x31, 0x1d, 0x6d, 0x98,\n  0xe9, 0x78, 0x14, 0xed, 0x78, 0x0c, 0xed, 0x7c, 0xdc, 0x31, 0xd7, 0x31,\n  0x0f, 0xed, 0x79, 0xca, 0xb1, 0x00, 0x6d, 0x5a, 0xe8, 0x78, 0xda, 0xf1,\n  0x3b, 0xc7, 0x62, 0xc7, 0xef, 0x1d, 0x4b, 0x1c, 0xcf, 0xa0, 0x04, 0xa9,\n  0xc3, 0xfd, 0xd8, 0x58, 0xb6, 0x94, 0xf9, 0x84, 0x47, 0xc6, 0xa5, 0xb0,\n  0x3e, 0x45, 0xbf, 0x1e, 0x5b, 0xc5, 0xba, 0x8e, 0x19, 0x5b, 0x52, 0xc9,\n  0xfa, 0x54, 0x15, 0x8c, 0x73, 0xb1, 0x7e, 0x2c, 0x8c, 0x89, 0xf8, 0xd8,\n  0xf0, 0xee, 0x2c, 0x2c, 0x39, 0x29, 0x0c, 0x3e, 0x1b, 0x80, 0x67, 0xfa,\n  0x31, 0x4b, 0xa8, 0xd3, 0x19, 0xc5, 0xfa, 0x8d, 0x08, 0x4d, 0xe9, 0xce,\n  0xfa, 0x45, 0x53, 0x38, 0x3e, 0x34, 0x0a, 0xe1, 0xf8, 0xc4, 0x38, 0xf8,\n  0x09, 0xa1, 0x69, 0xf0, 0x93, 0x12, 0xe3, 0xe1, 0x33, 0xd6, 0xdc, 0xcc,\n  0x34, 0x92, 0x19, 0xc1, 0xb4, 0xca, 0x92, 0xb1, 0x2e, 0x16, 0x58, 0x5d,\n  0x30, 0xb6, 0x92, 0x75, 0xab, 0xae, 0xac, 0xae, 0x84, 0x66, 0x84, 0x92,\n  0x6c, 0x21, 0x8d, 0x24, 0xc8, 0x07, 0x52, 0xa7, 0x33, 0x0b, 0xb3, 0x32,\n  0x1b, 0x0b, 0xe4, 0xfd, 0xb8, 0xf3, 0xae, 0xbd, 0x9f, 0xe7, 0x1f, 0x71,\n  0x35, 0x05, 0x35, 0x2d, 0x3f, 0xe5, 0x41, 0xaa, 0xbc, 0xc3, 0x1f, 0x4f,\n  0x4e, 0x62, 0x4d, 0x78, 0x82, 0xb3, 0x93, 0x90, 0xc0, 0x6e, 0x78, 0xba,\n  0x1f, 0x17, 0xd4, 0x26, 0x4e, 0xa9, 0x07, 0x91, 0xaa, 0x23, 0xe4, 0x82,\n  0xf4, 0x7a, 0x8c, 0x74, 0xc1, 0xfc, 0x5a, 0x49, 0xe3, 0x7a, 0xc8, 0xa1,\n  0x2f, 0xc9, 0x61, 0x2f, 0xc8, 0xe1, 0x27, 0x18, 0x35, 0x29, 0x87, 0x7d,\n  0xed, 0x87, 0x21, 0x87, 0xfd, 0x21, 0x87, 0xdf, 0xb0, 0x9b, 0xed, 0xdf,\n  0x42, 0x02, 0x07, 0x93, 0x2c, 0xdd, 0x4a, 0xf9, 0xce, 0x06, 0xad, 0x46,\n  0x4e, 0x41, 0x6c, 0x5e, 0x4b, 0xae, 0x01, 0x4a, 0x52, 0x48, 0x46, 0x38,\n  0xc9, 0x48, 0x47, 0x92, 0x91, 0x2b, 0x48, 0x46, 0x82, 0x49, 0x46, 0x7e,\n  0x45, 0x32, 0xd2, 0x03, 0xd2, 0xd1, 0xc4, 0xae, 0xa6, 0xd1, 0xee, 0x89,\n  0xd1, 0x9a, 0xce, 0xae, 0xc5, 0x68, 0x3d, 0xc6, 0x7a, 0xcb, 0xb1, 0x62,\n  0xd7, 0x63, 0xa4, 0x9e, 0x62, 0x37, 0x60, 0xac, 0x7e, 0x0b, 0xa9, 0x79,\n  0xda, 0xf1, 0x34, 0xe4, 0x7d, 0xb1, 0xe3, 0x19, 0xd6, 0x9f, 0x4a, 0x0e,\n  0x04, 0x0d, 0x04, 0x75, 0x35, 0xca, 0x85, 0xb3, 0x5e, 0x45, 0xad, 0x75,\n  0xb0, 0x10, 0x96, 0x6f, 0xa4, 0x5a, 0x89, 0x7c, 0x30, 0x52, 0x9c, 0x59,\n  0x50, 0xa3, 0x67, 0xec, 0x4b, 0xed, 0xcf, 0xda, 0x9f, 0xb3, 0x2f, 0xb7,\n  0xaf, 0x42, 0x4d, 0xad, 0xb2, 0x0f, 0xae, 0x80, 0x56, 0xd5, 0xd2, 0x64,\n  0x5f, 0xf3, 0xe5, 0x01, 0x7d, 0x74, 0x90, 0x75, 0x7e, 0xc0, 0xb0, 0x80,\n  0x9e, 0x01, 0xc3, 0x82, 0xb6, 0xda, 0x66, 0x75, 0x9a, 0x1f, 0xe4, 0x0e,\n  0xda, 0xa5, 0x1f, 0xb3, 0x6c, 0xea, 0x34, 0xdf, 0x36, 0x21, 0xc8, 0x6d,\n  0x0b, 0x0f, 0x72, 0x5b, 0x3c, 0xd6, 0xb4, 0x4e, 0x3d, 0x03, 0xba, 0x06,\n  0x74, 0xed, 0x34, 0xbf, 0x93, 0xc3, 0x36, 0xd5, 0x3a, 0xdf, 0x3a, 0xad,\n  0x53, 0xb0, 0x74, 0x08, 0x2d, 0x09, 0xc8, 0x0c, 0xc8, 0xb7, 0x1e, 0x0d,\n  0xda, 0xea, 0xe5, 0x76, 0x21, 0x97, 0x5d, 0x86, 0x73, 0x7b, 0x3b, 0x3c,\n  0x1d, 0x2e, 0x9f, 0x93, 0x77, 0xd9, 0x92, 0x90, 0x1b, 0x39, 0x94, 0xe2,\n  0x92, 0xa5, 0x9a, 0xce, 0x56, 0x26, 0xcb, 0x26, 0xe7, 0x92, 0xbe, 0xf1,\n  0xf4, 0xae, 0x4e, 0x3d, 0xa5, 0x43, 0x2d, 0x82, 0x3b, 0x39, 0x24, 0xd9,\n  0xa6, 0x4a, 0x27, 0xcb, 0x43, 0xce, 0xe1, 0x9d, 0xc6, 0x77, 0x4a, 0xea,\n  0x34, 0xa7, 0x53, 0xb8, 0x6d, 0x96, 0xdf, 0x04, 0xf8, 0x4b, 0x3b, 0x8d,\n  0xf7, 0x3b, 0x0e, 0x7e, 0x0c, 0xe9, 0xc5, 0x7e, 0x03, 0x90, 0x96, 0xe4,\n  0x37, 0xd7, 0xef, 0xb8, 0xdf, 0x29, 0xdc, 0x93, 0xd4, 0x69, 0x78, 0xa7,\n  0xe1, 0xfe, 0xcc, 0x3e, 0xe1, 0xb2, 0x7e, 0x97, 0x85, 0x5f, 0x36, 0xd7,\n  0x9f, 0xf9, 0xeb, 0x81, 0x27, 0x02, 0xb7, 0xfa, 0xef, 0xea, 0x38, 0x24,\n  0xd0, 0x03, 0xbe, 0x2f, 0xf0, 0x44, 0xd0, 0xc6, 0x8e, 0x43, 0x3a, 0x0e,\n  0x69, 0x2f, 0x02, 0xb7, 0xe2, 0x8a, 0xa7, 0x5d, 0xcf, 0x8e, 0x43, 0x82,\n  0x36, 0x06, 0x6d, 0x0c, 0xdc, 0x1e, 0xb8, 0x3d, 0xe0, 0xa4, 0x72, 0x81,\n  0x27, 0x64, 0x4d, 0x4c, 0x92, 0x35, 0x42, 0x1f, 0x4a, 0xd7, 0x07, 0x6e,\n  0x98, 0xe1, 0xa3, 0x6f, 0x3a, 0xcd, 0x09, 0x40, 0xcd, 0x50, 0x4b, 0x4f,\n  0x50, 0x13, 0x9e, 0xda, 0x1a, 0xb8, 0x35, 0x60, 0x96, 0xa4, 0x80, 0xb9,\n  0x28, 0x0b, 0xa5, 0x05, 0x6d, 0x0c, 0x38, 0xd9, 0x5e, 0x74, 0x0c, 0x6c,\n  0x6f, 0x6d, 0xbf, 0xb4, 0x63, 0xaf, 0xc0, 0xed, 0x1d, 0x7b, 0xc9, 0x92,\n  0x65, 0x79, 0x48, 0xdb, 0xd8, 0xa1, 0xb4, 0xc3, 0x76, 0x59, 0x87, 0xcb,\n  0xf5, 0xcb, 0xf5, 0x8e, 0xbd, 0x64, 0x1d, 0x2e, 0xef, 0x7e, 0xf9, 0x36,\n  0xd4, 0xb3, 0x73, 0xd0, 0x72, 0x19, 0x43, 0x9d, 0x90, 0x23, 0xe2, 0xdb,\n  0x03, 0x77, 0x52, 0x7e, 0x9e, 0xc0, 0x13, 0x1d, 0x03, 0x29, 0x8f, 0xb0,\n  0x8e, 0x61, 0xc8, 0x03, 0x7e, 0xc7, 0xa8, 0x8e, 0x2b, 0x3b, 0x1e, 0xa7,\n  0xfb, 0xb7, 0x9e, 0xc3, 0xed, 0x6a, 0xe3, 0x5a, 0x8d, 0x1a, 0x6a, 0x6e,\n  0xba, 0x26, 0xd3, 0xa9, 0x11, 0x30, 0xa8, 0x27, 0x7a, 0x94, 0xfa, 0xb4,\n  0x95, 0x0b, 0x6f, 0xe3, 0xc6, 0x7b, 0xb9, 0x24, 0xc3, 0xcd, 0x69, 0xe3,\n  0x86, 0x5f, 0xd0, 0x99, 0xb9, 0x99, 0x39, 0x14, 0x53, 0x7e, 0xf2, 0xd9,\n  0xf9, 0x67, 0x75, 0x4b, 0x3a, 0xad, 0x3f, 0xed, 0x3a, 0x1f, 0x51, 0xae,\n  0xd3, 0xc6, 0xce, 0xfe, 0xe4, 0x8e, 0x9c, 0xd5, 0x75, 0xee, 0xec, 0x82,\n  0xdf, 0xd4, 0x65, 0x71, 0x97, 0x38, 0x90, 0x74, 0xab, 0xba, 0xea, 0x2d,\n  0x2e, 0xa0, 0xeb, 0xf8, 0x16, 0x37, 0xad, 0xeb, 0xec, 0xae, 0xab, 0xba,\n  0x1e, 0xed, 0x7a, 0xf2, 0x0a, 0x68, 0x54, 0xbe, 0x1c, 0xba, 0xcb, 0x06,\n  0xad, 0x6a, 0x67, 0xed, 0x80, 0x50, 0xdb, 0x43, 0x4b, 0x5d, 0xc3, 0x7a,\n  0xb1, 0x6b, 0x59, 0x6f, 0x76, 0x1d, 0xeb, 0x03, 0x6d, 0x78, 0x23, 0xe6,\n  0xe5, 0xcd, 0x98, 0xc5, 0xb7, 0xb0, 0x41, 0x6c, 0x30, 0x34, 0xca, 0x50,\n  0x76, 0x1b, 0x1b, 0x06, 0x74, 0x38, 0x9c, 0x45, 0xb2, 0x0c, 0x96, 0xc9,\n  0xb2, 0x59, 0x2e, 0x2b, 0x62, 0xd5, 0xec, 0x3e, 0xf6, 0x00, 0xd0, 0xe1,\n  0x83, 0x6c, 0x1a, 0x7b, 0x88, 0x4d, 0xc7, 0x6a, 0x35, 0x83, 0x3d, 0xc2,\n  0x66, 0xb2, 0x47, 0xb1, 0x2a, 0x3c, 0xc6, 0xe6, 0x42, 0xf3, 0x3c, 0xc9,\n  0xe6, 0xb3, 0xa7, 0x80, 0x1e, 0x17, 0xb2, 0xdf, 0xb3, 0x25, 0xec, 0x4f,\n  0xec, 0xcf, 0x6c, 0x0b, 0xab, 0x67, 0x5b, 0xd9, 0x5b, 0x6c, 0x1b, 0xdb,\n  0x8e, 0xb5, 0x77, 0x07, 0x7b, 0x87, 0xed, 0x64, 0xbb, 0xd8, 0x6e, 0xd6,\n  0xc8, 0xf6, 0xb0, 0xbd, 0xec, 0x08, 0xfb, 0x96, 0x9d, 0x80, 0xa6, 0x3c,\n  0xc5, 0x9a, 0xa1, 0x36, 0x04, 0xbf, 0x8c, 0xb7, 0xe3, 0xed, 0xf9, 0xe5,\n  0xfc, 0x6a, 0x7e, 0x0d, 0xbf, 0x96, 0xdf, 0xc2, 0x07, 0xf1, 0xc1, 0x7c,\n  0x08, 0xbf, 0x95, 0x0f, 0xe5, 0xc3, 0xf8, 0x70, 0x1e, 0xc6, 0xc3, 0x79,\n  0x24, 0xb0, 0x68, 0x26, 0xcf, 0xe2, 0xd9, 0x3c, 0x97, 0xe7, 0xf1, 0x7c,\n  0x5e, 0xc0, 0x8b, 0x78, 0x09, 0x1f, 0xc3, 0xcb, 0x78, 0x25, 0xaf, 0xe2,\n  0x2e, 0x5e, 0xc3, 0x6b, 0xf9, 0x9d, 0x7c, 0x2c, 0xbf, 0x8b, 0x8f, 0xe3,\n  0x77, 0xf3, 0x7b, 0xf8, 0x04, 0x7e, 0x1f, 0xbf, 0x9f, 0x4f, 0xe5, 0xd3,\n  0xf8, 0x74, 0xfe, 0x30, 0x7f, 0x84, 0x3f, 0xc1, 0x7f, 0xc7, 0x17, 0xf3,\n  0xdf, 0xf3, 0xe5, 0xfc, 0x79, 0xfe, 0x02, 0x5f, 0xc9, 0x57, 0xf1, 0x3f,\n  0xf2, 0x17, 0xf9, 0xcb, 0xfc, 0x35, 0x5e, 0xc7, 0x5f, 0xe7, 0x1b, 0xf9,\n  0x1b, 0x7c, 0x13, 0xff, 0x13, 0xdf, 0xc2, 0xdf, 0xe6, 0x3b, 0xf8, 0xc7,\n  0xfc, 0x13, 0xfe, 0x15, 0x3f, 0xca, 0xbf, 0xe5, 0xdf, 0xf1, 0x13, 0xfc,\n  0x7b, 0x7e, 0x92, 0xff, 0xc0, 0x4f, 0xf1, 0x66, 0xc1, 0x04, 0x17, 0x42,\n  0x68, 0xc2, 0x57, 0xe8, 0xc2, 0x22, 0x6c, 0xc2, 0x4f, 0xd8, 0xc5, 0xe5,\n  0x22, 0x10, 0x98, 0x78, 0x18, 0x50, 0x70, 0x28, 0xd0, 0x6f, 0xa4, 0x48,\n  0x14, 0x4e, 0x91, 0x24, 0x92, 0x45, 0x8a, 0x48, 0x15, 0xd9, 0x22, 0x5f,\n  0x14, 0x8a, 0x2a, 0x71, 0xa7, 0x18, 0x27, 0xee, 0x16, 0xf7, 0x88, 0x5f,\n  0x8b, 0x89, 0xe2, 0x5e, 0x31, 0x59, 0xdc, 0x2f, 0x1e, 0x10, 0x0f, 0x8a,\n  0x87, 0xc4, 0xc3, 0xe2, 0x11, 0xf1, 0xa8, 0x98, 0x25, 0x1e, 0x13, 0xbf,\n  0x11, 0x8f, 0x8b, 0x27, 0xc4, 0x93, 0xe2, 0x29, 0xf1, 0x5b, 0xf1, 0xb4,\n  0xf8, 0xbd, 0x58, 0x22, 0x96, 0x8b, 0x15, 0xe2, 0x05, 0xb1, 0x52, 0xac,\n  0x16, 0x6b, 0xc5, 0x2b, 0xe2, 0x55, 0xf1, 0x67, 0x51, 0x2f, 0xfe, 0x22,\n  0xde, 0x15, 0xef, 0x89, 0xf7, 0xc5, 0x87, 0xe2, 0x23, 0xf1, 0x4f, 0xf1,\n  0xb1, 0xf8, 0x54, 0xfc, 0x4b, 0x7c, 0x2e, 0xbe, 0x10, 0x5f, 0x8a, 0xaf,\n  0xc4, 0x51, 0xf1, 0xb5, 0xf8, 0x46, 0x7c, 0x2b, 0xbe, 0x13, 0xdf, 0x8b,\n  0x1f, 0x44, 0xb3, 0xc6, 0x35, 0x4d, 0xf3, 0xd5, 0x2c, 0x9a, 0x4d, 0xb3,\n  0x6b, 0x97, 0x69, 0xed, 0xb4, 0xf6, 0xda, 0xe5, 0x5a, 0x47, 0xad, 0x93,\n  0xd6, 0x45, 0xbb, 0x42, 0xbb, 0x52, 0xbb, 0x4a, 0xbb, 0x46, 0xbb, 0x56,\n  0xbb, 0x4e, 0xbb, 0x5e, 0xbb, 0x41, 0xbb, 0x51, 0xbb, 0x49, 0xbb, 0x59,\n  0xbb, 0x45, 0x1b, 0xac, 0xdd, 0xaa, 0xdd, 0xa6, 0x85, 0x6a, 0x23, 0xb4,\n  0x08, 0x6d, 0xa4, 0x16, 0xad, 0xc5, 0x6a, 0x71, 0x5a, 0xbc, 0x96, 0xa0,\n  0x25, 0x6a, 0x4e, 0x2d, 0xc9, 0x67, 0xa3, 0xcf, 0x1b, 0x7a, 0x7f, 0xfd,\n  0x26, 0x7d, 0x80, 0x7e, 0xb3, 0x3e, 0x50, 0xbf, 0x45, 0x1f, 0xa4, 0x0f,\n  0xd6, 0x87, 0xe8, 0xb7, 0xea, 0x43, 0xf5, 0xdb, 0xf4, 0x61, 0xfa, 0xed,\n  0xfa, 0x70, 0xfd, 0x0e, 0x7d, 0xac, 0x7e, 0x97, 0x3e, 0x4e, 0xbf, 0x5b,\n  0x1f, 0xaf, 0xdf, 0xa3, 0x4f, 0xd1, 0x1f, 0xd0, 0xa7, 0xea, 0x0f, 0xea,\n  0xb3, 0xf4, 0xc7, 0xf4, 0xd9, 0xfa, 0x6f, 0xf4, 0x39, 0xfa, 0xe3, 0xfa,\n  0x5c, 0xfd, 0x09, 0x7d, 0x9e, 0xfe, 0xa4, 0xbe, 0x54, 0x7f, 0x56, 0x5f,\n  0xa6, 0x3f, 0xa7, 0x2f, 0xd7, 0x9f, 0xd7, 0x57, 0xe8, 0x2f, 0xe8, 0x3b,\n  0xf5, 0x77, 0xf5, 0x5d, 0xfa, 0x7b, 0xfa, 0x6e, 0xfd, 0x7d, 0xbd, 0x51,\n  0xff, 0x40, 0xdf, 0xa3, 0x7f, 0xa8, 0xef, 0x85, 0x39, 0xa0, 0x5b, 0x2c,\n  0x16, 0xab, 0xc5, 0x66, 0xe9, 0x60, 0xb9, 0xdc, 0x12, 0x68, 0xe9, 0x68,\n  0xbd, 0xdf, 0x3a, 0xc5, 0xfa, 0x80, 0x75, 0xaa, 0xf5, 0x41, 0xeb, 0x34,\n  0xeb, 0x43, 0xd6, 0xe9, 0xd6, 0x87, 0xad, 0x33, 0xac, 0x8f, 0x58, 0x67,\n  0x59, 0x1f, 0xb3, 0xce, 0xb6, 0xfe, 0xc6, 0x3a, 0xc7, 0xfa, 0xb8, 0x75,\n  0xae, 0xf5, 0x09, 0xeb, 0x3c, 0xeb, 0x93, 0x58, 0x05, 0x9e, 0xb1, 0xbe,\n  0x66, 0xad, 0xb3, 0x6e, 0xb4, 0x6e, 0xb5, 0xfe, 0x8f, 0xf5, 0x2d, 0xeb,\n  0x5f, 0xad, 0xdb, 0xac, 0x6f, 0x5b, 0xb7, 0x5b, 0xff, 0x66, 0x6d, 0xb0,\n  0xfe, 0xdd, 0xba, 0xc3, 0xba, 0xd3, 0xfa, 0xae, 0x75, 0x97, 0xf5, 0x23,\n  0xeb, 0x7e, 0xeb, 0x3f, 0xad, 0x6e, 0xeb, 0xc7, 0xd6, 0x03, 0xd6, 0x23,\n  0xd6, 0xaf, 0xac, 0x47, 0xad, 0x5f, 0x5b, 0x8f, 0x59, 0xbf, 0xb1, 0x36,\n  0x59, 0xbf, 0xb5, 0x1e, 0xb7, 0x7e, 0x67, 0x3d, 0x61, 0xfd, 0xde, 0xef,\n  0x0f, 0x7e, 0xab, 0xfd, 0xd6, 0xf8, 0xad, 0xf5, 0x5b, 0x67, 0x5f, 0xc8,\n  0x2e, 0x67, 0x83, 0x9b, 0xeb, 0xd9, 0xad, 0xcd, 0x1e, 0x36, 0x14, 0x34,\n  0xac, 0xd9, 0xcd, 0x7e, 0xdf, 0xec, 0xe6, 0x57, 0x37, 0xd7, 0xf3, 0x6b,\n  0x40, 0xd7, 0x82, 0x6e, 0x69, 0xf6, 0xf0, 0xc1, 0x48, 0xbb, 0x15, 0xf4,\n  0x1d, 0xc2, 0xdf, 0x83, 0x7e, 0x00, 0x35, 0x37, 0xbb, 0xb5, 0x58, 0x50,\n  0x3c, 0x28, 0x11, 0x94, 0x84, 0x7c, 0x06, 0x60, 0x9d, 0x0c, 0x64, 0xed,\n  0x10, 0x6a, 0x0f, 0xea, 0x81, 0x70, 0x4f, 0xe4, 0x1a, 0x02, 0x9e, 0x0f,\n  0x9a, 0x8a, 0xf0, 0x83, 0xa0, 0x69, 0xa0, 0x87, 0x40, 0xd3, 0x41, 0x0f,\n  0x83, 0xb6, 0x80, 0xea, 0x41, 0x5b, 0x91, 0x6b, 0x58, 0xb3, 0x47, 0x58,\n  0x9a, 0xeb, 0x85, 0x1d, 0x84, 0x7c, 0x44, 0x28, 0xe2, 0x28, 0x55, 0xa0,\n  0x54, 0x81, 0x52, 0x45, 0x73, 0xb3, 0x47, 0xe3, 0x20, 0x0d, 0xe4, 0x0b,\n  0xb2, 0x80, 0x6c, 0x20, 0x3b, 0xe8, 0x32, 0x50, 0xbb, 0x66, 0x8f, 0x35,\n  0xb0, 0xb9, 0xce, 0xda, 0x11, 0x74, 0x7f, 0xb3, 0xdb, 0x3a, 0x05, 0xf4,\n  0x00, 0x68, 0x2a, 0xe8, 0x41, 0xd0, 0x34, 0xd0, 0x43, 0xa0, 0xe9, 0xa0,\n  0x87, 0x41, 0x33, 0x40, 0x8f, 0x80, 0x66, 0x36, 0x37, 0x58, 0x1f, 0x6d,\n  0x6e, 0xb0, 0x0d, 0x6c, 0xae, 0xb3, 0x55, 0x34, 0xd7, 0x31, 0xbb, 0x75,\n  0x3f, 0x72, 0xfa, 0x67, 0x73, 0x93, 0xd5, 0x0d, 0xfe, 0x31, 0xe8, 0x00,\n  0xe8, 0x08, 0xe2, 0xdf, 0x82, 0x8e, 0x83, 0xbe, 0x03, 0x9d, 0x00, 0x7d,\n  0xdf, 0xdc, 0x04, 0xbc, 0x50, 0xdd, 0xdc, 0x24, 0x2e, 0x47, 0xec, 0x31,\n  0xd0, 0x6c, 0xd0, 0x6f, 0x40, 0x73, 0x40, 0x8f, 0x83, 0xe6, 0x82, 0x96,\n  0x82, 0x9e, 0x05, 0x2d, 0x03, 0x3d, 0x07, 0x5a, 0x0e, 0xda, 0x0a, 0xfa,\n  0x1f, 0xd0, 0x5b, 0xa0, 0xbf, 0x82, 0xb6, 0x81, 0xde, 0x06, 0x6d, 0x07,\n  0xfd, 0x0d, 0xd4, 0x00, 0xfa, 0x3b, 0x68, 0x07, 0xe8, 0x1d, 0xd0, 0x2e,\n  0x94, 0x74, 0xbe, 0x7a, 0x79, 0x50, 0x2f, 0x0f, 0xea, 0xe5, 0x41, 0xbd,\n  0x3c, 0xa8, 0x97, 0x87, 0x70, 0x5e, 0x20, 0x74, 0x65, 0xa0, 0xd0, 0x41,\n  0xe0, 0xc0, 0x26, 0x37, 0x40, 0x07, 0xc6, 0x43, 0x5b, 0x06, 0x22, 0x34,\n  0x00, 0xa3, 0xef, 0xc1, 0xe8, 0x37, 0x61, 0xf4, 0x9b, 0xbc, 0x46, 0xdf,\n  0x83, 0xd1, 0xf7, 0x60, 0xf4, 0x3d, 0x18, 0xfd, 0x26, 0xaf, 0xd1, 0x6f,\n  0xc2, 0xe8, 0x37, 0x61, 0xf4, 0x9b, 0xce, 0x32, 0xfa, 0x1e, 0xca, 0xb1,\n  0x18, 0x39, 0x36, 0x22, 0x47, 0x37, 0x72, 0x74, 0x23, 0xc7, 0x46, 0xe4,\n  0xd8, 0x88, 0x1c, 0x1b, 0x91, 0x63, 0x23, 0x72, 0x6c, 0x44, 0x8e, 0x6e,\n  0xe4, 0xd8, 0x88, 0x1c, 0x1b, 0x91, 0xa3, 0x1b, 0x39, 0xba, 0x91, 0xa3,\n  0x1b, 0x39, 0x36, 0x22, 0xc7, 0x46, 0xe4, 0xd8, 0x88, 0x1c, 0x1b, 0x91,\n  0x63, 0x23, 0x70, 0x97, 0x0d, 0xf5, 0xba, 0x0d, 0xad, 0xf9, 0x08, 0xf9,\n  0xfb, 0x22, 0x7f, 0x97, 0xf5, 0x15, 0xe6, 0xb4, 0xae, 0x07, 0xfd, 0x13,\n  0xa3, 0x76, 0xa4, 0x59, 0xe2, 0x4e, 0xd9, 0x0e, 0x01, 0x69, 0x73, 0xb2,\n  0x7f, 0x41, 0xc7, 0x0b, 0x5c, 0xa9, 0xc7, 0x95, 0x7a, 0x0a, 0x35, 0xc9,\n  0xbe, 0xc1, 0x93, 0xed, 0xe0, 0xb7, 0xc7, 0x18, 0x59, 0x40, 0x76, 0x90,\n  0x8c, 0x07, 0x62, 0xd4, 0x3c, 0x3c, 0x07, 0x08, 0xb8, 0x04, 0x2d, 0xaa,\n  0x02, 0x8d, 0x45, 0x3d, 0xe6, 0xa3, 0xa7, 0x2e, 0x6f, 0xf6, 0xe8, 0xb9,\n  0x2c, 0x50, 0xcf, 0x03, 0x41, 0x72, 0xf5, 0x02, 0x50, 0x21, 0xa8, 0x08,\n  0xb4, 0x10, 0x74, 0x04, 0xf4, 0x15, 0xe8, 0x28, 0xe8, 0x6b, 0xd0, 0x31,\n  0xd0, 0x37, 0x52, 0xf2, 0x91, 0x9b, 0x1f, 0x72, 0xf0, 0xc3, 0xd3, 0x7e,\n  0x78, 0xda, 0x0f, 0x4f, 0xfb, 0xe1, 0x69, 0x3f, 0x3c, 0xed, 0x87, 0xa7,\n  0xfd, 0xf0, 0xb4, 0x1f, 0x9e, 0xf6, 0xc3, 0xd3, 0x7e, 0x78, 0xda, 0x0f,\n  0x4f, 0xfb, 0xe1, 0x69, 0x3f, 0x3c, 0xed, 0x87, 0xb5, 0x0c, 0x52, 0x84,\n  0x1c, 0xda, 0x21, 0x87, 0x76, 0x52, 0x9a, 0x90, 0x4b, 0x3b, 0xe4, 0xd2,\n  0x0e, 0xb9, 0xb4, 0x43, 0x2e, 0xed, 0x90, 0x4b, 0x3b, 0xe4, 0xd2, 0x0e,\n  0xb9, 0xb4, 0x43, 0x2e, 0xed, 0x90, 0x4b, 0x3b, 0xe4, 0xd2, 0x0e, 0xb9,\n  0xb4, 0x43, 0x2e, 0xed, 0x90, 0x4b, 0x3b, 0xa6, 0xa3, 0x15, 0x0d, 0xfc,\n  0x6e, 0xb4, 0x04, 0xb2, 0xcf, 0x9f, 0xc0, 0x9c, 0xe9, 0xde, 0xec, 0x16,\n  0xc3, 0xd0, 0x53, 0x5d, 0xd0, 0x0b, 0x0d, 0xe8, 0x85, 0x06, 0x9e, 0x8b,\n  0x76, 0x17, 0x80, 0x8a, 0x70, 0x47, 0x19, 0x78, 0x0d, 0xca, 0xad, 0xc5,\n  0x78, 0xdc, 0x89, 0xf8, 0x5d, 0x08, 0xdf, 0x03, 0xfe, 0x30, 0xf5, 0x56,\n  0x03, 0x7a, 0xab, 0x01, 0xbd, 0xd5, 0x20, 0x6e, 0x6f, 0x76, 0xfb, 0xbc,\n  0xd1, 0xec, 0xd6, 0x3f, 0x40, 0xdf, 0xec, 0x69, 0xf6, 0x58, 0x7c, 0x9b,\n  0xdd, 0x16, 0x1d, 0x63, 0x10, 0x88, 0xde, 0xee, 0xd8, 0x5c, 0x8f, 0x99,\n  0x53, 0x8f, 0x99, 0x23, 0xf7, 0xa3, 0xd0, 0x8b, 0x2c, 0xd8, 0xd4, 0x02,\n  0xd4, 0xbf, 0xb9, 0xc8, 0xbb, 0x00, 0x24, 0xfb, 0xb9, 0x0c, 0x5c, 0xf6,\n  0x35, 0x66, 0x0a, 0xf5, 0xb5, 0xd7, 0x6c, 0x3f, 0x6f, 0x9f, 0x7f, 0xd0,\n  0xdc, 0x88, 0x72, 0x1b, 0xcf, 0xd5, 0xf7, 0x16, 0xde, 0xdc, 0x64, 0x11,\n  0x18, 0xd5, 0x6a, 0x16, 0x80, 0x16, 0xe6, 0xb0, 0x60, 0x3e, 0x01, 0x2d,\n  0x9b, 0x84, 0x52, 0xee, 0x03, 0x9f, 0x02, 0x9a, 0x86, 0xf0, 0xa3, 0xe0,\n  0xb3, 0x40, 0xb3, 0x41, 0xbf, 0x01, 0xcd, 0x01, 0x61, 0x8e, 0xf2, 0xb9,\n  0xe0, 0xf3, 0xc0, 0x9f, 0xa4, 0x5a, 0x05, 0xf3, 0xa7, 0xc0, 0x17, 0x20,\n  0xed, 0xb7, 0xe0, 0x0b, 0xd1, 0x13, 0x1c, 0x3d, 0x20, 0x40, 0x5a, 0x73,\n  0x83, 0xde, 0x1f, 0x3d, 0x70, 0x13, 0x68, 0x00, 0xe8, 0x66, 0xd0, 0x40,\n  0x10, 0xb4, 0xa4, 0x3e, 0x08, 0x34, 0x98, 0x24, 0x27, 0x18, 0xad, 0x08,\n  0x46, 0x2b, 0x82, 0xd1, 0x8a, 0x60, 0xb4, 0x22, 0x18, 0xad, 0x08, 0xd6,\n  0xab, 0x70, 0x0d, 0x12, 0xa7, 0xbb, 0x40, 0x35, 0xa0, 0x5a, 0xd0, 0x9d,\n  0xa0, 0x09, 0x18, 0xe9, 0x5f, 0x83, 0x26, 0x82, 0xee, 0x05, 0xa1, 0xce,\n  0xfa, 0x7d, 0xa0, 0xc9, 0xa0, 0xfb, 0x41, 0xa8, 0xb7, 0xfe, 0x10, 0x68,\n  0x3a, 0x08, 0xa3, 0xa2, 0xcf, 0x00, 0x3d, 0x02, 0x9a, 0x09, 0x7a, 0x14,\n  0x34, 0x0f, 0x79, 0x3c, 0x09, 0x5a, 0x88, 0x32, 0x16, 0x81, 0xff, 0x0e,\n  0xb4, 0x18, 0xe9, 0xbf, 0x07, 0x2d, 0x01, 0x3d, 0x03, 0x5a, 0x8a, 0xb4,\n  0x67, 0x41, 0xcb, 0x40, 0xcf, 0x81, 0x96, 0x83, 0x9e, 0x07, 0xad, 0x00,\n  0xbd, 0x00, 0xda, 0x82, 0x7b, 0xde, 0x04, 0xd5, 0x83, 0xfe, 0x02, 0x82,\n  0x6e, 0xd2, 0xa1, 0x9b, 0x74, 0xe8, 0x26, 0x1d, 0xba, 0x49, 0xdf, 0x89,\n  0x7b, 0xde, 0x05, 0xed, 0x02, 0xbd, 0x07, 0xda, 0x0d, 0x7a, 0x1f, 0xd4,\n  0x08, 0x3a, 0x82, 0x72, 0xbf, 0x02, 0x1d, 0x05, 0x7d, 0x0d, 0x3a, 0x06,\n  0xfa, 0x06, 0x04, 0x3d, 0xa1, 0x9f, 0x02, 0x35, 0x63, 0x64, 0x18, 0x48,\n  0x03, 0xf9, 0x80, 0x2e, 0x03, 0xf9, 0x83, 0x30, 0x07, 0x2d, 0x01, 0xa0,\n  0xf6, 0xc6, 0x0c, 0xf5, 0x40, 0x5e, 0xa4, 0xf6, 0xf7, 0x40, 0x1e, 0x3c,\n  0x42, 0xc6, 0x2f, 0xa7, 0x31, 0x94, 0xe3, 0xf7, 0xa8, 0xd7, 0x98, 0xc9,\n  0xb1, 0xc2, 0xd8, 0xb4, 0x8c, 0x83, 0xd9, 0xaf, 0x66, 0x3f, 0x98, 0x7d,\n  0x60, 0xb6, 0xd9, 0xa8, 0x2f, 0xbb, 0x82, 0xf9, 0x42, 0x26, 0xfd, 0x20,\n  0x93, 0x13, 0x48, 0x2a, 0x9a, 0xf8, 0xfd, 0xc8, 0xe9, 0x11, 0xca, 0xbd,\n  0xc9, 0x90, 0x8a, 0x26, 0x94, 0xd0, 0x44, 0x52, 0x31, 0x97, 0x24, 0xa0,\n  0x49, 0xe8, 0x90, 0x4d, 0x3c, 0x83, 0xd2, 0x9a, 0x50, 0x5a, 0x13, 0x4a,\n  0x6b, 0x42, 0x69, 0xb2, 0xd7, 0x9b, 0x50, 0x5a, 0x13, 0x4a, 0x6b, 0x42,\n  0x69, 0xb2, 0x87, 0x9b, 0x50, 0x5a, 0x13, 0x4a, 0x6b, 0x42, 0x69, 0x4d,\n  0x98, 0x07, 0x18, 0x2b, 0x20, 0xd1, 0x76, 0x98, 0x0d, 0x01, 0xd4, 0x36,\n  0x77, 0x4b, 0x6b, 0xa6, 0x9c, 0xa5, 0x45, 0x4f, 0x60, 0x9e, 0xa0, 0x55,\n  0x90, 0x34, 0x0f, 0x24, 0xcd, 0x03, 0x49, 0x93, 0x7d, 0xe1, 0x46, 0x5f,\n  0xb8, 0xd1, 0x17, 0xee, 0x0b, 0x4a, 0xdd, 0xb9, 0xa4, 0xeb, 0x5c, 0xbd,\n  0x72, 0x2e, 0x49, 0x38, 0xcf, 0x48, 0x33, 0x21, 0x0e, 0xa1, 0x56, 0x1e,\n  0xd9, 0x1a, 0xf4, 0xa5, 0x07, 0x7d, 0xe9, 0xe1, 0x2f, 0xa0, 0x9f, 0x36,\n  0x23, 0x55, 0x07, 0x21, 0x2e, 0x92, 0xd0, 0x67, 0xd9, 0xe0, 0x4f, 0x83,\n  0x50, 0x9e, 0x78, 0x06, 0x84, 0xf2, 0xc4, 0x1a, 0xd0, 0x2b, 0xb8, 0xf6,\n  0x2a, 0xe8, 0x35, 0x10, 0xf4, 0x08, 0x50, 0x79, 0x3b, 0x68, 0xf9, 0xf6,\n  0xd0, 0x08, 0xa8, 0x1d, 0xc7, 0x5d, 0x1c, 0x35, 0xe2, 0xcf, 0xa3, 0xa7,\n  0x50, 0x13, 0xfe, 0x47, 0xd0, 0x8b, 0x20, 0x3c, 0xc9, 0xd7, 0x81, 0x5e,\n  0x47, 0xfa, 0x46, 0xd0, 0x26, 0x84, 0xdf, 0x04, 0x49, 0xbc, 0xf0, 0x37,\n  0x10, 0x6a, 0xca, 0xbf, 0xa2, 0xde, 0x6a, 0x44, 0x6f, 0x35, 0xa2, 0xb7,\n  0x1a, 0x51, 0x0b, 0x8f, 0x48, 0x06, 0x65, 0x82, 0xf2, 0x51, 0x5a, 0x21,\n  0xe8, 0x5e, 0x84, 0xd1, 0xfb, 0x02, 0xd8, 0x43, 0x3c, 0x8e, 0x5e, 0x7d,\n  0x02, 0xf4, 0x24, 0xe8, 0x29, 0xc4, 0x7f, 0x0b, 0x42, 0x4f, 0x88, 0x95,\n  0xa0, 0x3f, 0x50, 0x4d, 0x3d, 0xa8, 0xa9, 0x07, 0x35, 0xf5, 0x88, 0x3f,\n  0x83, 0x50, 0x9e, 0x78, 0x07, 0xf4, 0x2e, 0xee, 0x7f, 0x0f, 0xf4, 0x3e,\n  0xe8, 0x9f, 0x88, 0x63, 0x05, 0x16, 0xff, 0x02, 0x7d, 0x0e, 0xfa, 0x02,\n  0x74, 0x18, 0xf4, 0x35, 0x08, 0xab, 0xb1, 0xc0, 0x6a, 0xec, 0x6b, 0x23,\n  0x3c, 0xd2, 0x5a, 0x43, 0xca, 0xb5, 0x2a, 0x10, 0x2b, 0x9a, 0x1b, 0x32,\n  0x02, 0xad, 0xcb, 0x7c, 0x48, 0x53, 0x03, 0x1d, 0xf1, 0x2f, 0x90, 0x6b,\n  0x0e, 0xa4, 0xc6, 0x82, 0xf4, 0x3a, 0xd2, 0xe3, 0xe3, 0x20, 0xad, 0xc0,\n  0x4b, 0xfc, 0x8d, 0xe6, 0x46, 0xac, 0x66, 0x72, 0xa5, 0x6f, 0xa4, 0xa7,\n  0xdc, 0x98, 0x31, 0xb7, 0xb5, 0x68, 0xee, 0x7a, 0x68, 0x6d, 0x0f, 0x7f,\n  0xcb, 0x98, 0x47, 0x6e, 0x29, 0x6b, 0xde, 0xb2, 0x03, 0x73, 0x24, 0x87,\n  0x50, 0x4a, 0x3b, 0x20, 0x9b, 0xf6, 0xc8, 0xf9, 0x59, 0xea, 0xe1, 0x46,\n  0xf4, 0xb0, 0x1b, 0x3d, 0xeb, 0x6e, 0xd3, 0x8b, 0x75, 0x78, 0xae, 0x0e,\n  0xcf, 0xd5, 0xa1, 0x17, 0x1b, 0xa9, 0x17, 0x57, 0x22, 0x1f, 0xd5, 0x2b,\n  0x8d, 0xe8, 0x95, 0x46, 0xf4, 0x4a, 0xa3, 0xf8, 0x04, 0xf4, 0x29, 0x48,\n  0xd6, 0xf9, 0x30, 0xb5, 0xd8, 0x6d, 0xb6, 0x18, 0xe5, 0x6d, 0x25, 0x3f,\n  0x0d, 0xa5, 0xf6, 0x82, 0xa4, 0xb8, 0x21, 0x29, 0x6e, 0x8c, 0xb1, 0x9b,\n  0x2f, 0x65, 0x03, 0x30, 0xc6, 0x6e, 0x1a, 0xcb, 0xcd, 0xa8, 0xc1, 0x9b,\n  0xe0, 0x1f, 0xa2, 0x64, 0xa0, 0x1a, 0xfe, 0x31, 0x49, 0x91, 0x1b, 0x52,\n  0xe4, 0x86, 0x04, 0x35, 0x62, 0xdc, 0xdc, 0x18, 0x37, 0x37, 0xc6, 0xcb,\n  0x2d, 0xa6, 0x1b, 0x63, 0x86, 0x99, 0x22, 0xe4, 0x9a, 0xf6, 0x24, 0x8d,\n  0x99, 0x5b, 0x2c, 0x24, 0x49, 0x6b, 0x14, 0x8b, 0x48, 0xda, 0x1a, 0xc5,\n  0x62, 0x92, 0xb4, 0x46, 0xf1, 0x12, 0x38, 0x56, 0x0c, 0xb1, 0x87, 0xc6,\n  0xc7, 0x0d, 0xb9, 0x75, 0x63, 0x8c, 0xdc, 0x90, 0x5d, 0x37, 0xc6, 0xc7,\n  0x2d, 0x8e, 0xa1, 0x7e, 0xba, 0x59, 0xb3, 0x96, 0x52, 0x4d, 0xe9, 0xee,\n  0x83, 0x2b, 0x6b, 0x70, 0x65, 0x0d, 0xea, 0xdc, 0x60, 0xd4, 0xb9, 0x01,\n  0x75, 0x5e, 0x8e, 0x3a, 0xd7, 0xa3, 0xce, 0x0d, 0xa8, 0x73, 0xa3, 0x51,\n  0xe7, 0x46, 0x3c, 0xbd, 0x06, 0x4f, 0xaf, 0x41, 0x9d, 0xeb, 0x51, 0xe7,\n  0x3a, 0xd4, 0xb9, 0x0e, 0x75, 0x6e, 0x40, 0x9d, 0x1b, 0x51, 0xe7, 0xe5,\n  0xa8, 0x73, 0x23, 0xea, 0xdc, 0x80, 0x3a, 0x37, 0xa0, 0xce, 0x0d, 0xa8,\n  0x73, 0x23, 0xea, 0x5c, 0x6f, 0xd4, 0xb9, 0x9e, 0xea, 0xfc, 0x0c, 0x4a,\n  0x5f, 0x4a, 0x33, 0xc5, 0x2d, 0x96, 0x51, 0x1b, 0xea, 0x8d, 0x36, 0xd4,\n  0x1b, 0x6d, 0x58, 0x8e, 0xda, 0x35, 0xa2, 0x0d, 0xcb, 0x51, 0xc3, 0x46,\n  0xb4, 0xa1, 0x01, 0x6d, 0x68, 0xc4, 0x9a, 0xee, 0x8b, 0x31, 0xf5, 0xc3,\n  0x98, 0x7e, 0x88, 0x5a, 0xa9, 0x1a, 0x35, 0xa0, 0x46, 0x75, 0xa8, 0x51,\n  0x9d, 0x88, 0xc7, 0x93, 0x58, 0xe7, 0x45, 0x11, 0xa8, 0x12, 0x34, 0x1d,\n  0xd7, 0xe6, 0x82, 0xa0, 0x13, 0xc4, 0x7c, 0xd0, 0x42, 0x84, 0x65, 0x2d,\n  0x64, 0x0d, 0x64, 0xe9, 0xb2, 0x64, 0x59, 0xaa, 0x2c, 0xf1, 0x10, 0x9e,\n  0xf7, 0x80, 0x8e, 0x01, 0x33, 0xf8, 0xd3, 0xfc, 0x7c, 0xce, 0x98, 0x83,\n  0x6f, 0x7a, 0xcd, 0xa9, 0xd3, 0x73, 0xa9, 0x09, 0xed, 0x6b, 0xa2, 0x79,\n  0x64, 0xce, 0x87, 0xaf, 0x65, 0x1f, 0x43, 0x72, 0xdd, 0xfc, 0x33, 0x92,\n  0xed, 0x46, 0x31, 0x1a, 0xa9, 0x39, 0xa0, 0x6f, 0x20, 0x17, 0x7d, 0xbc,\n  0xe4, 0xc2, 0xcc, 0xbb, 0xde, 0x90, 0x09, 0x0f, 0xc9, 0xc4, 0x5e, 0xc8,\n  0xf6, 0x7e, 0x10, 0xe4, 0x82, 0x7f, 0x43, 0x9a, 0xf8, 0x6c, 0xb2, 0xe1,\n  0x31, 0x64, 0xa3, 0xde, 0x90, 0x0d, 0xb3, 0x9f, 0x3d, 0x5e, 0xb2, 0xd1,\n  0x64, 0xc8, 0x46, 0x93, 0x21, 0x1b, 0x4d, 0x02, 0x58, 0x5a, 0x40, 0x4b,\n  0x8b, 0x46, 0xd2, 0x44, 0x52, 0x4e, 0x9a, 0x50, 0xef, 0x46, 0x92, 0x80,\n  0xcf, 0xc1, 0x3d, 0xc6, 0x3c, 0x96, 0x72, 0x72, 0x39, 0x6a, 0xda, 0x80,\n  0x9a, 0x36, 0x18, 0xb5, 0xf2, 0x18, 0x35, 0x92, 0xd2, 0xda, 0x80, 0x1a,\n  0x35, 0x50, 0x0d, 0x64, 0xe9, 0xa7, 0xfb, 0xd5, 0x83, 0x12, 0x3c, 0x28,\n  0xc1, 0x83, 0x12, 0x3c, 0x34, 0x72, 0x72, 0xd4, 0x64, 0x6e, 0xd7, 0xb7,\n  0xb4, 0x5b, 0xca, 0xd5, 0xeb, 0x34, 0xb7, 0x3d, 0xd4, 0xee, 0x0f, 0x91,\n  0xa6, 0x46, 0xf0, 0xb4, 0x44, 0xc6, 0x93, 0x36, 0x95, 0xed, 0x95, 0x23,\n  0x29, 0xfb, 0x5c, 0x8e, 0x66, 0x13, 0x46, 0xb3, 0x09, 0xa5, 0xba, 0xd1,\n  0x6e, 0x59, 0xb2, 0x9b, 0xe6, 0xc4, 0x3c, 0x1a, 0x03, 0x59, 0x83, 0x26,\n  0xd4, 0xc0, 0x7d, 0xc6, 0xbc, 0x78, 0x06, 0x35, 0x55, 0x32, 0xd6, 0x60,\n  0xc8, 0x58, 0xdb, 0x79, 0x22, 0xdb, 0xdf, 0x60, 0xb4, 0x5f, 0xca, 0x97,\n  0xd4, 0x50, 0x6f, 0xc8, 0x99, 0xcc, 0x3f, 0x03, 0xa2, 0x93, 0xf3, 0xa5,\n  0x09, 0x35, 0x97, 0x23, 0xd1, 0x24, 0x24, 0x37, 0xe7, 0x8b, 0x46, 0xa3,\n  0x0c, 0xfd, 0x83, 0x51, 0x6e, 0xa2, 0x31, 0x6f, 0xc4, 0x98, 0xbb, 0x11,\n  0xab, 0xc7, 0x98, 0x37, 0x60, 0xcc, 0x1b, 0xa0, 0x11, 0xdc, 0xd0, 0x74,\n  0x6f, 0x50, 0xaa, 0xdb, 0x90, 0x04, 0x99, 0xb2, 0x94, 0xb9, 0x64, 0xaa,\n  0xc8, 0x62, 0xc1, 0xa4, 0xa5, 0x84, 0x2c, 0x91, 0x24, 0x44, 0xea, 0x0f,\n  0x0f, 0xeb, 0xdc, 0xb2, 0x46, 0xc8, 0x95, 0xe6, 0x45, 0x92, 0x13, 0x8f,\n  0x5c, 0x03, 0xda, 0xe8, 0xfb, 0xa6, 0x56, 0x7a, 0xfe, 0x71, 0x92, 0x05,\n  0x25, 0x93, 0x4f, 0x19, 0xba, 0xdd, 0x7b, 0xf5, 0x91, 0x3a, 0xdd, 0xd0,\n  0xdf, 0x34, 0xbe, 0x6a, 0x2d, 0x83, 0xb5, 0x45, 0x52, 0xb7, 0x0f, 0xa4,\n  0x24, 0x4e, 0xad, 0x69, 0x40, 0x64, 0x42, 0x62, 0x81, 0xe7, 0x41, 0x5b,\n  0xda, 0x48, 0x8f, 0x1b, 0x74, 0xc0, 0xab, 0x2f, 0xe4, 0xf8, 0x36, 0x22,\n  0xb7, 0x46, 0xd2, 0x77, 0xcf, 0x19, 0x6b, 0xd9, 0x8b, 0xc6, 0xdc, 0xd9,\n  0x44, 0x63, 0xed, 0x69, 0xd1, 0x7b, 0x4a, 0xe7, 0x35, 0xa2, 0x14, 0xb5,\n  0x66, 0x65, 0xd3, 0xdc, 0xf2, 0xd0, 0x38, 0xdf, 0x4b, 0x6b, 0xd5, 0xd9,\n  0x75, 0xdf, 0x53, 0xad, 0xf4, 0x9f, 0x5a, 0x69, 0x97, 0xb7, 0xac, 0xb2,\n  0xad, 0xd7, 0xae, 0x0f, 0x4e, 0xb7, 0xd5, 0x6b, 0x6e, 0x2a, 0x1d, 0xe8,\n  0x2b, 0x25, 0xae, 0x45, 0x07, 0x18, 0x73, 0x1f, 0x63, 0x80, 0x51, 0x11,\n  0x5b, 0x61, 0xd1, 0x68, 0xd2, 0xba, 0x6a, 0xb1, 0xb5, 0x64, 0x6c, 0x98,\n  0xb1, 0x0e, 0x61, 0xa4, 0x68, 0x05, 0xfa, 0x3d, 0x85, 0xfa, 0xe2, 0xde,\n  0xdb, 0x60, 0x87, 0xf9, 0x9a, 0x21, 0x8d, 0x31, 0x3f, 0xad, 0x2b, 0xa8,\n  0x2f, 0x2c, 0x1b, 0x1f, 0xd8, 0x71, 0x6e, 0x63, 0xd5, 0x6b, 0x90, 0x56,\n  0x19, 0xac, 0x36, 0xb9, 0x3b, 0xa0, 0x33, 0xb9, 0x5a, 0xa8, 0x74, 0x73,\n  0x7d, 0xf3, 0x58, 0x9b, 0x48, 0xee, 0x1e, 0x96, 0xa5, 0x1b, 0xeb, 0xa0,\n  0x07, 0xeb, 0xa0, 0x5c, 0x27, 0xa5, 0x7d, 0x76, 0x37, 0xc6, 0x06, 0xeb,\n  0x25, 0xac, 0x9a, 0x26, 0xa4, 0x60, 0x2e, 0xd0, 0xda, 0x37, 0x85, 0x2c,\n  0x16, 0xa9, 0x6f, 0x64, 0x8a, 0x5a, 0x15, 0xdd, 0x74, 0x65, 0x1c, 0xc2,\n  0x0f, 0x13, 0x1e, 0xab, 0x95, 0x2d, 0x33, 0x4b, 0x61, 0xbe, 0x67, 0xb5,\n  0xe4, 0xb9, 0xdf, 0x8b, 0x64, 0x19, 0x9e, 0x65, 0x15, 0xb5, 0xde, 0x87,\n  0x3a, 0x4e, 0x06, 0x01, 0x93, 0x5b, 0xa7, 0x80, 0x1e, 0x00, 0x4d, 0x05,\n  0x3d, 0x08, 0x02, 0x46, 0xb7, 0x02, 0xa3, 0x5b, 0x81, 0xd1, 0xad, 0x28,\n  0xcd, 0x0a, 0x8c, 0x6e, 0x05, 0x46, 0xb7, 0xce, 0x44, 0x69, 0x8f, 0x1a,\n  0xe5, 0xba, 0x69, 0xf5, 0xee, 0x88, 0xbc, 0xd7, 0x20, 0xef, 0x35, 0xc8,\n  0x7b, 0x0d, 0xf2, 0x5e, 0x83, 0xbc, 0xd7, 0x20, 0xef, 0x35, 0xc8, 0x7b,\n  0xcd, 0x25, 0xee, 0x59, 0xbc, 0x8b, 0xbc, 0xdf, 0xb5, 0xc3, 0x3e, 0x61,\n  0xdd, 0xcf, 0x86, 0x9f, 0x2f, 0xb1, 0xa6, 0x4d, 0xc8, 0xad, 0xc9, 0xba,\n  0x9f, 0xf6, 0x16, 0x9a, 0xac, 0x1f, 0x83, 0x20, 0xd7, 0xd6, 0xaf, 0x40,\n  0x47, 0x41, 0x5f, 0x83, 0x8e, 0x81, 0xbe, 0x39, 0xc7, 0x1e, 0x08, 0xc7,\n  0xb8, 0x35, 0xa1, 0x75, 0xc6, 0x5c, 0x32, 0xe7, 0x8e, 0xb1, 0x5f, 0xf1,\n  0xd5, 0x19, 0xfb, 0x15, 0x67, 0xcf, 0xf7, 0x8c, 0x3d, 0x0c, 0xbf, 0x97,\n  0x69, 0x67, 0xe1, 0xec, 0xad, 0xf3, 0xa0, 0x75, 0x1e, 0xb4, 0xce, 0x83,\n  0xd6, 0x79, 0xd0, 0x3a, 0x0f, 0x5a, 0xe7, 0x41, 0xeb, 0x3c, 0x68, 0x9d,\n  0x07, 0xad, 0xf3, 0xa0, 0x75, 0x1e, 0xb4, 0xce, 0x63, 0x8e, 0x83, 0x1c,\n  0x5d, 0xea, 0x2f, 0x0d, 0x12, 0xd7, 0x84, 0x98, 0x1b, 0xb1, 0xaf, 0x58,\n  0x90, 0xa9, 0x63, 0xbc, 0x75, 0x8a, 0xd7, 0x78, 0xff, 0x98, 0x72, 0x3c,\n  0x54, 0x8e, 0x30, 0x42, 0xb0, 0xbe, 0x7f, 0xe9, 0xbd, 0x21, 0x92, 0x5c,\n  0xef, 0x76, 0x49, 0xa9, 0x7b, 0x05, 0xf3, 0x75, 0x3d, 0x1b, 0xc6, 0x2c,\n  0x66, 0xe8, 0xac, 0xfb, 0x44, 0xed, 0x31, 0x4a, 0x6e, 0x63, 0x57, 0xc9,\n  0x8d, 0x51, 0x72, 0x63, 0x94, 0x68, 0xc6, 0x63, 0x94, 0x3c, 0x18, 0x25,\n  0x0f, 0x46, 0xc9, 0x83, 0x51, 0xf2, 0x60, 0x94, 0xe4, 0xfc, 0x94, 0x23,\n  0xe5, 0x46, 0x2e, 0x6e, 0xe4, 0xe2, 0x46, 0x2e, 0x6e, 0xe4, 0xe2, 0xa6,\n  0xd2, 0x82, 0x51, 0x46, 0x30, 0xbb, 0xee, 0x92, 0xda, 0xfa, 0x0a, 0xcb,\n  0xc4, 0x53, 0x99, 0x3f, 0xa6, 0xcd, 0xa8, 0x77, 0x23, 0xea, 0xdc, 0x88,\n  0x3a, 0x37, 0xa2, 0xce, 0x8d, 0xa8, 0xb3, 0x1b, 0x75, 0x76, 0xa3, 0xce,\n  0x6e, 0xd4, 0xd9, 0x8d, 0x3a, 0xbb, 0x51, 0x67, 0x37, 0xea, 0xdb, 0x88,\n  0xfa, 0x36, 0xa2, 0xbe, 0x8d, 0xa8, 0x6f, 0x23, 0xea, 0xdb, 0xc8, 0x02,\n  0xf0, 0xf4, 0xbb, 0x34, 0x2f, 0xdd, 0xe0, 0x1f, 0x83, 0x0e, 0x80, 0x54,\n  0x0e, 0x67, 0xb6, 0xfa, 0xac, 0x2d, 0xbe, 0xad, 0xbb, 0x7c, 0xc7, 0x77,\n  0x47, 0xf7, 0x98, 0xa1, 0x2c, 0x93, 0xa5, 0xb0, 0x0b, 0xfc, 0xa1, 0xa7,\n  0x7f, 0xa6, 0x3f, 0x8c, 0xf4, 0x19, 0xa1, 0xff, 0xec, 0x3f, 0xf4, 0xf7,\n  0xff, 0x89, 0x16, 0xfd, 0xb4, 0xd2, 0x2f, 0x76, 0x84, 0x61, 0x05, 0x9e,\n  0xa5, 0x7f, 0x9a, 0xdd, 0xe7, 0x2e, 0x1d, 0x28, 0xbf, 0xf5, 0xbd, 0x75,\n  0x17, 0x51, 0x4c, 0xef, 0x1f, 0x5b, 0x5f, 0xb3, 0x1e, 0x67, 0xd6, 0xe7,\n  0x6c, 0x35, 0xf4, 0x1e, 0x5b, 0xcc, 0x8a, 0xb3, 0xe6, 0x77, 0xf6, 0xf4,\n  0x5f, 0x6e, 0x86, 0xa8, 0xdc, 0x2e, 0x6e, 0x34, 0x7f, 0xde, 0x52, 0x2f,\n  0x5c, 0xc6, 0x85, 0x6b, 0xd5, 0xdc, 0x74, 0xae, 0x7b, 0x5a, 0xa7, 0xff,\n  0x2f, 0xcc, 0x95, 0xc0, 0xb3, 0x84, 0xfe, 0xc3, 0x66, 0x69, 0xdb, 0xab,\n  0x17, 0xd7, 0x97, 0x17, 0xa3, 0xb9, 0x7e, 0xce, 0xfe, 0x3e, 0x53, 0x07,\n  0x9c, 0xf7, 0xee, 0xba, 0x1f, 0x2f, 0x6f, 0xe7, 0xf8, 0x0b, 0x66, 0xff,\n  0xe5, 0x7f, 0xe7, 0x5d, 0x73, 0x7a, 0xff, 0x82, 0x33, 0xe3, 0x17, 0xd2,\n  0x1b, 0xbf, 0xcc, 0xca, 0x05, 0x5d, 0xe3, 0x69, 0xad, 0x33, 0xcf, 0xa5,\n  0x37, 0xcd, 0xfe, 0x6c, 0xf6, 0x9c, 0xbb, 0x56, 0xa6, 0x9e, 0x6f, 0xad,\n  0xef, 0xda, 0x68, 0x2d, 0xf7, 0xf9, 0xd6, 0x8b, 0xe6, 0x06, 0x45, 0xf2,\n  0x4b, 0x38, 0xac, 0x88, 0xee, 0x4b, 0x19, 0x6b, 0x79, 0x77, 0x73, 0x63,\n  0xeb, 0x99, 0xa5, 0x62, 0x94, 0xa3, 0x77, 0xea, 0xdc, 0xf3, 0xcd, 0x3f,\n  0x94, 0xbb, 0xe6, 0x7c, 0xfd, 0xff, 0xd3, 0x34, 0xca, 0x2f, 0x80, 0x07,\n  0x7f, 0xc6, 0x15, 0xec, 0xff, 0x0a, 0xa2, 0xfc, 0xff, 0x42, 0xab, 0xfe,\n  0x1d, 0xc8, 0xe4, 0xbf, 0x5b, 0x12, 0xfe, 0xd7, 0xdb, 0xf0, 0x6f, 0xc4,\n  0x4b, 0x3f, 0x7a, 0x05, 0x68, 0xbc, 0x38, 0x39, 0x6b, 0xfe, 0xf4, 0x4c,\n  0x3d, 0xfa, 0xbf, 0x39, 0x92, 0xad, 0xd7, 0xf7, 0x73, 0x68, 0xea, 0xc6,\n  0xff, 0x16, 0xf9, 0xbc, 0xc8, 0x31, 0xf2, 0xfc, 0x94, 0x7b, 0x2e, 0xda,\n  0x7e, 0xf5, 0x98, 0xf7, 0x9e, 0xb1, 0xae, 0x7a, 0xfe, 0x1d, 0x1a, 0xed,\n  0x52, 0x73, 0xf9, 0xdf, 0xd5, 0xa3, 0x17, 0xfc, 0x1b, 0x70, 0xd1, 0xed,\n  0x68, 0x30, 0xf1, 0x17, 0x10, 0x4a, 0x43, 0x73, 0xfd, 0xd9, 0x30, 0x0c,\n  0x61, 0xa0, 0x86, 0xf3, 0xdb, 0xe3, 0x6d, 0xd0, 0x56, 0xfd, 0x19, 0x76,\n  0xb3, 0xc7, 0xc0, 0x6d, 0x2d, 0xb3, 0xa7, 0x79, 0xd1, 0x79, 0x73, 0x31,\n  0xf0, 0xd2, 0xa5, 0x5a, 0x29, 0x97, 0x88, 0x70, 0xff, 0xc3, 0xe7, 0xf2,\n  0xbf, 0x73, 0x3d, 0x3a, 0xcf, 0x4e, 0x91, 0xfb, 0xd2, 0xa4, 0xe9, 0xdf,\n  0x33, 0x53, 0xcf, 0xa2, 0xbd, 0xeb, 0x2f, 0xb6, 0x2e, 0xcd, 0xf5, 0x2d,\n  0xb9, 0xd4, 0x9d, 0x6b, 0xfe, 0x34, 0xcf, 0xf5, 0xb6, 0x94, 0x21, 0x8f,\n  0x9e, 0x36, 0x12, 0xdd, 0xf0, 0x23, 0xe6, 0x63, 0xe0, 0x45, 0xce, 0xd2,\n  0x01, 0xbf, 0x98, 0xb4, 0xd4, 0x7b, 0xcd, 0xb0, 0x46, 0xcc, 0xc7, 0x3a,\n  0xf4, 0x85, 0x39, 0x0b, 0x86, 0x9d, 0xee, 0x5f, 0x9a, 0xc5, 0xb2, 0x6f,\n  0xfc, 0x5a, 0xda, 0x5b, 0x6f, 0xd4, 0x3e, 0xf0, 0x8c, 0x99, 0xea, 0x69,\n  0xb5, 0xab, 0x10, 0xd8, 0x6a, 0x67, 0xf1, 0x2c, 0x96, 0xd9, 0xf9, 0xe6,\n  0xb4, 0x9c, 0xf5, 0xa6, 0xa5, 0x74, 0xc9, 0xfd, 0xd9, 0xfb, 0xdf, 0x68,\n  0x9b, 0xff, 0xf7, 0xe2, 0x5b, 0xcf, 0xc5, 0xce, 0x67, 0x03, 0xe9, 0xb9,\n  0xcf, 0x9e, 0xc3, 0xd9, 0x67, 0x23, 0xad, 0xf3, 0xee, 0x4b, 0xd1, 0x22,\n  0xa6, 0xb4, 0xb4, 0xd5, 0x1e, 0x24, 0x91, 0xa7, 0x6b, 0xb1, 0xe6, 0x02,\n  0xf3, 0xbd, 0x41, 0x61, 0xd2, 0x56, 0xb2, 0xe9, 0x69, 0x65, 0xe9, 0xaf,\n  0xf1, 0x96, 0x7b, 0xcc, 0x8b, 0x86, 0xd6, 0xbb, 0xd0, 0x54, 0x5a, 0xe0,\n  0xcf, 0xd1, 0xb7, 0xb2, 0x36, 0xe7, 0xec, 0x71, 0xcf, 0x69, 0x24, 0x74,\n  0x5e, 0x6c, 0xea, 0xf6, 0x5a, 0x91, 0x3d, 0xad, 0xeb, 0xda, 0x6a, 0xb5,\n  0xf6, 0x9c, 0xde, 0x31, 0xa1, 0x9d, 0x98, 0xc6, 0x0b, 0xad, 0x84, 0x17,\n  0x92, 0x61, 0x79, 0xfd, 0xdc, 0x7d, 0xed, 0xf5, 0xd6, 0xa5, 0xe1, 0x02,\n  0x7b, 0x44, 0x6e, 0x6f, 0x29, 0xf1, 0xd6, 0xea, 0x84, 0x37, 0x2e, 0xb4,\n  0xe6, 0x0c, 0x3b, 0x23, 0x25, 0xf2, 0x02, 0xab, 0x4d, 0xe4, 0xff, 0x8a,\n  0x3d, 0x7d, 0xc1, 0x7a, 0x5e, 0xc4, 0x13, 0x3f, 0x5b, 0xfd, 0x2e, 0x65,\n  0x8d, 0x27, 0x39, 0xac, 0x3f, 0xf7, 0x38, 0xb4, 0x92, 0xda, 0xfa, 0x8b,\n  0xd2, 0xda, 0x17, 0x9e, 0x19, 0x9e, 0x1f, 0xfb, 0xf4, 0xcf, 0x67, 0xcb,\n  0x5c, 0xcc, 0xbd, 0xe7, 0xe9, 0xc7, 0x4b, 0x42, 0x94, 0x3f, 0x0d, 0x7f,\n  0x7a, 0xf7, 0xf8, 0xa5, 0xe6, 0x74, 0x69, 0x3d, 0xfd, 0xd3, 0x90, 0xdb,\n  0x85, 0xdf, 0xe6, 0x5d, 0xf4, 0x7a, 0xe4, 0xfe, 0xf1, 0x92, 0xd0, 0x46,\n  0xe7, 0xfe, 0xe8, 0x5d, 0x87, 0x9f, 0x67, 0x8d, 0xbf, 0xd8, 0x5c, 0xfe,\n  0x83, 0xed, 0xcc, 0x9f, 0x79, 0xf7, 0xe9, 0x27, 0xca, 0xd8, 0xa5, 0xef,\n  0x33, 0x78, 0xfe, 0xfd, 0x3d, 0x7d, 0x29, 0xb3, 0xf4, 0x7c, 0xef, 0x3b,\n  0x7e, 0x9e, 0xbe, 0x06, 0x6a, 0x38, 0x0f, 0x0e, 0x39, 0xe7, 0xb3, 0x75,\n  0x6d, 0x70, 0x48, 0xdd, 0x69, 0x4c, 0xe0, 0x65, 0x4b, 0xb4, 0xb9, 0x57,\n  0x85, 0x68, 0x9f, 0xa1, 0x01, 0x58, 0xad, 0xbe, 0x4d, 0x2e, 0x9e, 0x96,\n  0x7d, 0x86, 0xba, 0xf3, 0xf5, 0x95, 0xdc, 0xa5, 0x68, 0x65, 0x95, 0xd5,\n  0xb7, 0x96, 0x47, 0x5c, 0x6f, 0x3c, 0x8d, 0x0d, 0x8d, 0xf0, 0x85, 0xf6,\n  0x19, 0xd4, 0xdb, 0x9c, 0xe5, 0xff, 0xcd, 0x78, 0xbe, 0xc5, 0xf2, 0x72,\n  0x9f, 0x0b, 0xb3, 0xb7, 0x1d, 0x89, 0xb3, 0xbf, 0x45, 0x3b, 0xfb, 0x48,\n  0x9c, 0x99, 0xe3, 0xc5, 0xec, 0xda, 0x9c, 0x77, 0x7d, 0xbd, 0xe0, 0x5c,\n  0xbc, 0x58, 0xfd, 0xdd, 0x82, 0x2b, 0x3d, 0x3f, 0xdf, 0x3e, 0xf3, 0x7f,\n  0xce, 0xfe, 0xd2, 0x79, 0x70, 0xc8, 0xa7, 0x97, 0x94, 0xcf, 0x4f, 0xea,\n  0x1b, 0xef, 0x59, 0x78, 0xd6, 0xb7, 0xb5, 0x9e, 0x9f, 0xab, 0xad, 0xe7,\n  0xfd, 0xc2, 0xa1, 0xf7, 0xbf, 0x77, 0x4e, 0x5d, 0xec, 0xe8, 0xfe, 0x14,\n  0x19, 0x38, 0xf3, 0x59, 0x63, 0xbf, 0xb6, 0xc9, 0x6b, 0x6e, 0x37, 0x9c,\n  0x4d, 0x1a, 0xbc, 0xdf, 0x51, 0xc3, 0x96, 0x5d, 0x43, 0xba, 0xb9, 0xfe,\n  0xcc, 0xf7, 0x32, 0x5e, 0x36, 0x74, 0xdd, 0xf9, 0xe4, 0x01, 0x5a, 0xbb,\n  0xce, 0x0b, 0xeb, 0xb7, 0xd9, 0x27, 0x26, 0x5d, 0xdc, 0xf8, 0xf3, 0x69,\n  0xce, 0x8b, 0x5d, 0xef, 0x2e, 0xa5, 0x94, 0x33, 0xa5, 0xb0, 0x8d, 0xce,\n  0x6a, 0x3c, 0xe7, 0x3e, 0x43, 0x43, 0x9b, 0xfb, 0x02, 0xcf, 0x3d, 0x8f,\n  0x68, 0x15, 0xf4, 0x9c, 0x5d, 0x52, 0xe9, 0xbb, 0x63, 0xd6, 0x7a, 0xe4,\n  0xda, 0xee, 0x2b, 0x9e, 0x1f, 0x5b, 0xfd, 0x9f, 0xf9, 0x36, 0xf3, 0xc7,\n  0xbe, 0x37, 0x6c, 0xb8, 0x48, 0x3b, 0xae, 0xe1, 0xc7, 0xbd, 0x19, 0xf8,\n  0x8f, 0xfd, 0x8b, 0xfc, 0xbf, 0x3b, 0x66, 0xad, 0x34, 0xe2, 0x8f, 0x1d,\n  0xf7, 0x5f, 0xe0, 0xbb, 0xca, 0xb6, 0xfb, 0xf5, 0xec, 0xff, 0xff, 0xbb,\n  0x64, 0x39, 0x38, 0xe3, 0x3b, 0x2b, 0xcf, 0x2f, 0x2b, 0x59, 0xbf, 0x0c,\n  0x5e, 0x6a, 0xa3, 0xe7, 0x1b, 0xce, 0xb9, 0x1e, 0x34, 0xb4, 0x42, 0xb4,\n  0x8d, 0xe7, 0x43, 0x3c, 0x2d, 0xab, 0x45, 0xfd, 0xf9, 0x6d, 0x63, 0xd2,\n  0xf3, 0x8d, 0xe7, 0xde, 0x77, 0xfd, 0x31, 0xb2, 0x7e, 0x09, 0xef, 0xe3,\n  0xdc, 0xff, 0xdd, 0xf2, 0xf9, 0x73, 0xa3, 0xf6, 0x8b, 0x78, 0xdf, 0xe1,\n  0x3e, 0xe7, 0xfb, 0x8e, 0xba, 0xb3, 0xe1, 0xaa, 0x73, 0xed, 0xe6, 0xff,\n  0x2c, 0xf8, 0xd3, 0xf3, 0x63, 0xe6, 0x4b, 0xdb, 0x67, 0x5a, 0x49, 0xbd,\n  0xfb, 0xec, 0x98, 0xe8, 0xbf, 0xd1, 0x2e, 0x36, 0x7a, 0xb0, 0xd5, 0x1e,\n  0xaa, 0xb2, 0x95, 0xcf, 0xbd, 0x93, 0x7d, 0x2e, 0x64, 0xf7, 0x63, 0x2c,\n  0xa5, 0x1f, 0xaf, 0xc3, 0x54, 0xef, 0x5f, 0xe8, 0x17, 0x10, 0x3f, 0x65,\n  0xee, 0xff, 0xd2, 0x7a, 0xe3, 0xff, 0xca, 0x77, 0x17, 0xe7, 0x9d, 0xb9,\n  0xc3, 0x7e, 0x41, 0xdb, 0xf3, 0xe7, 0xfc, 0x92, 0xbe, 0xf7, 0x7f, 0x16,\n  0xce, 0xbc, 0x38, 0xbd, 0xfe, 0x4b, 0xe0, 0xb5, 0xd6, 0xd6, 0xc5, 0x79,\n  0xbf, 0xd6, 0x9e, 0x7c, 0xe1, 0x15, 0xe1, 0xf4, 0xbe, 0xe2, 0xd9, 0xa5,\n  0xf9, 0x12, 0x5a, 0xe0, 0xf7, 0xa3, 0x5b, 0x34, 0xf9, 0xc2, 0xab, 0x57,\n  0xf3, 0xa2, 0xf3, 0xd7, 0xe4, 0x02, 0x57, 0x1b, 0x7e, 0x0e, 0x4d, 0xd6,\n  0xba, 0x9e, 0xe7, 0xb0, 0xf8, 0xe7, 0x5e, 0xd4, 0x9a, 0xb7, 0xe6, 0x3f,\n  0x15, 0xd5, 0x78, 0xef, 0xc9, 0xb4, 0xe2, 0x67, 0xee, 0xa5, 0xd4, 0x19,\n  0x68, 0x21, 0xf8, 0xcc, 0x3d, 0xf8, 0x0b, 0x8d, 0x04, 0xfd, 0x52, 0xaf,\n  0xa1, 0xcd, 0xee, 0xcb, 0x9a, 0xd6, 0xe5, 0x98, 0xdf, 0x33, 0x9c, 0xf7,\n  0x3b, 0x1b, 0xb7, 0xf9, 0x0d, 0xd4, 0x2f, 0xd9, 0x9b, 0x3f, 0x3b, 0x4e,\n  0x10, 0x6c, 0x25, 0xf3, 0x85, 0x93, 0x73, 0xc6, 0x8f, 0x71, 0xd6, 0x8e,\n  0xb5, 0x47, 0x5a, 0x4f, 0x38, 0x5f, 0xd6, 0x0b, 0x9a, 0x4e, 0xa7, 0xff,\n  0xd7, 0x69, 0x63, 0x03, 0xd8, 0x40, 0x66, 0x67, 0x83, 0xd9, 0xed, 0xcc,\n  0x9f, 0x85, 0xb3, 0x08, 0xd6, 0x91, 0x45, 0xb1, 0x68, 0xd6, 0x89, 0xc5,\n  0xc2, 0x75, 0x61, 0x4e, 0x96, 0xcc, 0xba, 0xb2, 0x54, 0xb8, 0x60, 0x36,\n  0x1a, 0xee, 0x2a, 0x96, 0xc1, 0xb2, 0x59, 0x77, 0x56, 0x0d, 0xd7, 0x93,\n  0xdd, 0x07, 0x77, 0x0d, 0x9b, 0xca, 0x1e, 0x43, 0x8e, 0x73, 0xe1, 0x06,\n  0xb0, 0x79, 0x6c, 0x01, 0xbb, 0x99, 0x2d, 0x64, 0x4b, 0xd8, 0x10, 0xb6,\n  0x94, 0xad, 0x60, 0x77, 0xa0, 0x16, 0x7f, 0x84, 0x2e, 0x5d, 0xc3, 0xd6,\n  0xb2, 0x18, 0xb6, 0x8e, 0x6d, 0x60, 0xf1, 0xac, 0x0e, 0x2e, 0x89, 0xfd,\n  0x89, 0xbd, 0x85, 0xbc, 0xb7, 0xc1, 0xe5, 0xb0, 0xed, 0x70, 0xb9, 0xac,\n  0x01, 0x2e, 0x8f, 0xed, 0x60, 0x3b, 0x59, 0x3e, 0xdb, 0xc5, 0xfe, 0xc1,\n  0x8a, 0xd8, 0xa7, 0x70, 0xd5, 0xec, 0x73, 0x38, 0x17, 0xfb, 0x02, 0xae,\n  0x86, 0x7d, 0x0b, 0x57, 0xcb, 0xbe, 0x63, 0x27, 0xd8, 0x9d, 0xec, 0x24,\n  0xdc, 0x5d, 0xec, 0x14, 0x67, 0x6c, 0x1c, 0x17, 0x5c, 0xb0, 0x7b, 0xb8,\n  0x2f, 0xf7, 0x65, 0x13, 0xb8, 0x85, 0x5b, 0xd8, 0xaf, 0xb9, 0x1f, 0xf7,\n  0x63, 0x13, 0xb9, 0x83, 0x07, 0xb2, 0x7b, 0x79, 0x10, 0x0f, 0x62, 0xd3,\n  0x78, 0x67, 0xde, 0x99, 0x3d, 0xc4, 0xbb, 0xf2, 0xae, 0x6c, 0x3a, 0xbf,\n  0x9a, 0x5f, 0xc7, 0x1e, 0xe6, 0xd7, 0xf3, 0xeb, 0xd9, 0x6c, 0x7e, 0x03,\n  0xbf, 0x81, 0xfd, 0x86, 0xdf, 0xc8, 0x6f, 0x64, 0x73, 0xf8, 0x4d, 0xfc,\n  0x26, 0xf6, 0x38, 0xbf, 0x99, 0xdf, 0xcc, 0xe6, 0xf2, 0x5b, 0xf8, 0x50,\n  0xf6, 0x04, 0x1f, 0xc6, 0x87, 0xb1, 0xdf, 0xf2, 0xe1, 0x7c, 0x38, 0x5b,\n  0xc8, 0xc3, 0x78, 0x24, 0x7b, 0x9a, 0xfe, 0x8b, 0xfd, 0x12, 0x9e, 0xc1,\n  0x73, 0xd9, 0x33, 0xf2, 0x3f, 0x87, 0xb2, 0xe7, 0x79, 0x09, 0x2f, 0x63,\n  0x2f, 0xf0, 0x2a, 0x5e, 0xc5, 0xfe, 0xc8, 0x5d, 0xdc, 0xc5, 0x56, 0xcb,\n  0xff, 0x1e, 0xca, 0x5e, 0xe4, 0x77, 0xf1, 0xbb, 0xd8, 0x4b, 0xfc, 0x6e,\n  0x3e, 0x81, 0xad, 0xe5, 0x13, 0xf9, 0xbd, 0x6c, 0x3d, 0xbf, 0x8f, 0xdf,\n  0xc7, 0x36, 0xf0, 0xfb, 0xf9, 0xfd, 0xec, 0x35, 0xfe, 0x20, 0x7f, 0x90,\n  0xd5, 0xf1, 0x87, 0xf8, 0x43, 0xec, 0x75, 0xfe, 0x08, 0x7f, 0x84, 0x6d,\n  0xe4, 0x8f, 0xf2, 0x47, 0xd9, 0x1b, 0xfc, 0x31, 0xfe, 0x18, 0xdb, 0xc4,\n  0x7f, 0xc3, 0x7f, 0xc3, 0xfe, 0xc4, 0xe7, 0xf2, 0xb9, 0x6c, 0x33, 0x9f,\n  0xcf, 0xe7, 0xb3, 0x3f, 0xf3, 0x05, 0x7c, 0x01, 0xdb, 0xc2, 0x17, 0xf1,\n  0xc5, 0xec, 0x4d, 0xfe, 0x2c, 0x7f, 0x9e, 0x6d, 0xe5, 0x2f, 0xf0, 0x17,\n  0xd8, 0xdb, 0xfc, 0x0f, 0xfc, 0x8f, 0x6c, 0x3b, 0x7f, 0x91, 0xaf, 0x61,\n  0x7f, 0xe7, 0x2f, 0xf3, 0x97, 0xd9, 0x3b, 0xfc, 0x55, 0xfe, 0x2a, 0xdb,\n  0xc9, 0x5f, 0xe3, 0x1b, 0xd9, 0xbb, 0xf2, 0xff, 0x90, 0xb2, 0xf7, 0xf9,\n  0x16, 0xfe, 0x26, 0xfb, 0x80, 0xff, 0x85, 0xff, 0x0f, 0xfb, 0x90, 0xff,\n  0x95, 0xff, 0x95, 0xed, 0xe3, 0xdb, 0xf9, 0xdf, 0xd9, 0x47, 0xfc, 0x5d,\n  0xfe, 0x2e, 0xfb, 0x98, 0xbf, 0xcf, 0xdf, 0x67, 0x07, 0xf8, 0x07, 0xfc,\n  0x03, 0xf6, 0x09, 0xff, 0x90, 0x7f, 0xc4, 0x0e, 0x72, 0x37, 0xff, 0x98,\n  0x7d, 0xce, 0x3f, 0xe1, 0x9f, 0xb2, 0x2f, 0xf8, 0xbf, 0xf8, 0xe7, 0xec,\n  0x08, 0xff, 0x92, 0x7f, 0xc9, 0xbe, 0xe6, 0x5f, 0xf1, 0x6f, 0xd8, 0x31,\n  0xfe, 0xad, 0xd0, 0xd8, 0x77, 0xc2, 0x57, 0x58, 0xb8, 0x2e, 0x6c, 0xc2,\n  0xce, 0x6d, 0xf2, 0xff, 0x96, 0x72, 0x87, 0xfc, 0x6f, 0xfe, 0xdc, 0x5f,\n  0xfe, 0x07, 0x7f, 0xde, 0x4e, 0x84, 0x88, 0x30, 0x1e, 0x20, 0xc2, 0xc5,\n  0x48, 0x7e, 0xb9, 0x88, 0x11, 0x31, 0xbc, 0x93, 0x88, 0x13, 0x4e, 0xde,\n  0x59, 0x24, 0x89, 0x34, 0x7e, 0xa5, 0x48, 0x17, 0xe9, 0xbc, 0x87, 0xc8,\n  0x14, 0x99, 0xfc, 0x6a, 0x91, 0x23, 0xaa, 0x78, 0x4f, 0x71, 0xa7, 0x98,\n  0xc0, 0x07, 0x8a, 0x7b, 0xc5, 0x7d, 0x7c, 0x98, 0xb8, 0x5f, 0xcc, 0xe4,\n  0x77, 0x88, 0xd9, 0xe2, 0x37, 0x3c, 0x56, 0x3c, 0x2e, 0x16, 0xf1, 0x78,\n  0xf1, 0x8c, 0x58, 0xc6, 0x33, 0xc4, 0x72, 0xf1, 0x3c, 0xcf, 0x11, 0x2b,\n  0xc5, 0x1f, 0x78, 0x9e, 0x58, 0x2d, 0x5e, 0xe4, 0x05, 0x62, 0xad, 0x78,\n  0x99, 0x17, 0x89, 0x57, 0xc4, 0x06, 0x5e, 0x22, 0xea, 0x44, 0x1d, 0x2f,\n  0x17, 0x1b, 0xc5, 0x9b, 0xbc, 0x42, 0xbc, 0x2d, 0x1a, 0xf9, 0x58, 0xf1,\n  0xa1, 0xd8, 0xcb, 0xa7, 0x88, 0x8f, 0xc4, 0x01, 0x3e, 0x55, 0x7c, 0x2a,\n  0x8e, 0xf0, 0x19, 0xe2, 0x98, 0x38, 0xc6, 0xe7, 0x8a, 0x6f, 0xb5, 0xee,\n  0xfc, 0x09, 0xed, 0x1a, 0xed, 0x76, 0xfe, 0x86, 0x76, 0x87, 0x76, 0x07,\n  0xdf, 0xad, 0x85, 0x6a, 0x4e, 0xfe, 0xbe, 0x96, 0xa4, 0x25, 0xf3, 0x4f,\n  0xb5, 0x9d, 0xda, 0x4e, 0xfe, 0x2f, 0xf9, 0x1f, 0x4a, 0xf9, 0x21, 0xdf,\n  0xb7, 0x7d, 0xdf, 0xe6, 0x1e, 0xbd, 0xbf, 0x7e, 0x07, 0xff, 0x42, 0x8f,\n  0xd3, 0xe3, 0xf9, 0x0f, 0x7a, 0xb6, 0x5e, 0xcd, 0x9b, 0xf5, 0xb1, 0xfa,\n  0x3d, 0xa2, 0xbd, 0x3e, 0x45, 0x7f, 0x50, 0x74, 0xd2, 0x67, 0xe9, 0x4f,\n  0x8a, 0x2b, 0xf4, 0x05, 0xfa, 0xef, 0xc4, 0x35, 0xfa, 0x52, 0xfd, 0x65,\n  0x71, 0xbd, 0x5e, 0xa7, 0xff, 0x59, 0xdc, 0xae, 0x6f, 0xd3, 0xff, 0x21,\n  0x22, 0xf4, 0x8f, 0xf5, 0x4f, 0x44, 0x86, 0xee, 0xd1, 0x3d, 0x22, 0x5b,\n  0x3f, 0xa2, 0x7f, 0x27, 0x72, 0x20, 0x9e, 0x42, 0x8c, 0xb1, 0xf8, 0x5a,\n  0x6c, 0xa2, 0xdc, 0xd2, 0xc1, 0x12, 0x24, 0x5c, 0x96, 0xd5, 0x96, 0xd5,\n  0xe2, 0x2e, 0xeb, 0xfd, 0xd6, 0x47, 0xc4, 0x38, 0xeb, 0x63, 0xd6, 0xf9,\n  0xe2, 0x7e, 0xeb, 0xab, 0xd6, 0x4d, 0xe2, 0x11, 0xeb, 0x56, 0xeb, 0x0e,\n  0xf1, 0xb8, 0x75, 0x97, 0x75, 0x97, 0x58, 0x64, 0xdd, 0x6f, 0xdd, 0x2f,\n  0x7e, 0x67, 0x75, 0x5b, 0xbf, 0x14, 0x8b, 0xad, 0x5f, 0x59, 0xbf, 0x11,\n  0xab, 0xac, 0xdf, 0x5a, 0x9b, 0xc5, 0x4b, 0x7e, 0x2b, 0xfc, 0x56, 0x88,\n  0x3a, 0xbf, 0x95, 0x7e, 0x2b, 0xc5, 0xeb, 0x7e, 0x2f, 0xf9, 0xbd, 0x24,\n  0x36, 0x3a, 0x5e, 0x74, 0xbc, 0x28, 0xde, 0x60, 0x02, 0xa3, 0x29, 0xe7,\n  0x7f, 0x0f, 0x9a, 0xff, 0x3d, 0x30, 0xff, 0xdb, 0x61, 0x8e, 0x07, 0xc0,\n  0x0d, 0x83, 0x26, 0x68, 0x8f, 0xb0, 0xd4, 0x05, 0x1a, 0x66, 0x6e, 0x2f,\n  0xd6, 0x97, 0x5d, 0x0b, 0xe7, 0x03, 0xad, 0xd0, 0x1b, 0x4f, 0xf4, 0x83,\n  0x0b, 0x87, 0x6e, 0xb8, 0x91, 0x5d, 0x8f, 0x19, 0x3d, 0x00, 0xe9, 0x37,\n  0xc3, 0xa5, 0x41, 0x4f, 0x0c, 0x44, 0x78, 0x30, 0xdc, 0x2d, 0x98, 0xdd,\n  0x43, 0x90, 0x9f, 0xfc, 0x0f, 0xbf, 0xbd, 0xd9, 0x6d, 0x70, 0xe1, 0xc8,\n  0x75, 0x18, 0xeb, 0x86, 0x5c, 0xe5, 0x7f, 0xfb, 0x0d, 0x87, 0x13, 0xd0,\n  0x22, 0xd1, 0x6c, 0x14, 0xe9, 0x11, 0x01, 0x3d, 0x32, 0x0a, 0xbe, 0xd4,\n  0x23, 0xb7, 0x91, 0x1e, 0xb9, 0x89, 0xfe, 0x1f, 0xb0, 0x9d, 0x65, 0xc1,\n  0x45, 0x40, 0xa3, 0x64, 0x23, 0x2c, 0x75, 0x4a, 0x22, 0xe9, 0x94, 0x04,\n  0xe8, 0x94, 0x87, 0x51, 0xb7, 0x19, 0x70, 0xbe, 0xec, 0x11, 0xb8, 0xbe,\n  0x6c, 0x26, 0xb4, 0x8c, 0x2f, 0x69, 0x19, 0x1f, 0xd2, 0x32, 0x3e, 0xd0,\n  0x32, 0x0b, 0xe1, 0x3f, 0xcd, 0x16, 0xa3, 0x26, 0xbf, 0x87, 0xeb, 0x06,\n  0xad, 0xb3, 0x04, 0xf5, 0x5c, 0xca, 0x9e, 0x47, 0x59, 0x6b, 0xd8, 0x4b,\n  0xec, 0x0a, 0x68, 0x99, 0x3f, 0x21, 0xe7, 0x3f, 0xc3, 0xd9, 0xd9, 0x16,\n  0x38, 0x8d, 0xbd, 0x09, 0x27, 0x58, 0x3d, 0x9c, 0xc6, 0xfe, 0x02, 0x27,\n  0xd8, 0x56, 0x38, 0x8d, 0xfd, 0x0f, 0x9c, 0x80, 0x4e, 0x7a, 0x0b, 0x65,\n  0x49, 0xad, 0xd4, 0x97, 0xb4, 0x52, 0x5f, 0xd2, 0x4a, 0x7d, 0xa1, 0x95,\n  0x76, 0xa0, 0xac, 0x77, 0xe0, 0x92, 0xa0, 0x9f, 0x76, 0x22, 0xbc, 0x0b,\n  0xce, 0x97, 0xed, 0x86, 0xf3, 0x65, 0x8d, 0x70, 0xbe, 0x6c, 0x0f, 0x9c,\n  0x2f, 0xdb, 0x0b, 0xe7, 0x4b, 0x9a, 0x4b, 0x90, 0xe6, 0xba, 0x82, 0x34,\n  0xd7, 0x15, 0xa4, 0xb9, 0xc2, 0xa1, 0xb9, 0xbe, 0x43, 0x7b, 0x4f, 0xc0,\n  0x5d, 0x4f, 0xfa, 0xeb, 0x7a, 0x76, 0x0a, 0xee, 0x7a, 0xd6, 0x0c, 0x97,\n  0x24, 0xff, 0xe9, 0x39, 0xbb, 0x9e, 0x74, 0xd9, 0xf5, 0xa4, 0xcb, 0x04,\n  0xe9, 0x32, 0x41, 0xba, 0x4c, 0x40, 0x97, 0x39, 0x98, 0xfc, 0xdf, 0xc6,\n  0x97, 0x31, 0x1f, 0xde, 0x8e, 0xb7, 0x83, 0xdf, 0x9e, 0xb7, 0x87, 0x7f,\n  0x39, 0xbf, 0x9c, 0xf9, 0x92, 0x8e, 0xbb, 0x8d, 0x74, 0xdc, 0x6d, 0xa4,\n  0xe3, 0x6e, 0x83, 0x8e, 0xbb, 0x9a, 0xdd, 0xc2, 0x7b, 0xf2, 0x9e, 0xec,\n  0x26, 0x7e, 0x0d, 0xbf, 0x06, 0xe1, 0x5e, 0xbc, 0x17, 0xc2, 0xd7, 0xf2,\n  0x6b, 0x11, 0xee, 0xcd, 0x7b, 0x23, 0x7c, 0x1d, 0xf4, 0x60, 0x3b, 0xd2,\n  0x83, 0xed, 0x48, 0x0f, 0xb6, 0x23, 0x3d, 0xd8, 0x8e, 0xf4, 0x60, 0x3b,\n  0xd2, 0x83, 0xed, 0xa0, 0x07, 0x6f, 0x61, 0xbd, 0xf9, 0x20, 0x3e, 0x88,\n  0xd9, 0xf9, 0x60, 0x3e, 0x98, 0x75, 0xe3, 0x43, 0xf8, 0x10, 0x84, 0x6f,\n  0xe5, 0xb7, 0x22, 0x3c, 0x14, 0x5a, 0x72, 0x38, 0x69, 0xc9, 0xe1, 0xa4,\n  0x25, 0xe5, 0xff, 0x57, 0x0e, 0x63, 0x1a, 0x1f, 0xc1, 0x47, 0xa0, 0xb6,\n  0xe1, 0x3c, 0x1c, 0x75, 0x8b, 0x84, 0xde, 0xf4, 0x21, 0xbd, 0x69, 0x83,\n  0xde, 0xcc, 0x60, 0x7e, 0x3c, 0x93, 0x67, 0xb2, 0x4e, 0x3c, 0x8b, 0x67,\n  0x31, 0x7f, 0x9e, 0xcd, 0xb3, 0x59, 0x00, 0xcf, 0xe1, 0x39, 0xcc, 0xc1,\n  0x73, 0xa1, 0x55, 0x6d, 0xd0, 0xaa, 0xf9, 0x2c, 0x9d, 0x17, 0x40, 0xb7,\n  0xda, 0xa0, 0x5b, 0x4b, 0x70, 0x67, 0x29, 0x2f, 0xc5, 0x53, 0x63, 0xf8,\n  0x18, 0x36, 0x9a, 0x97, 0x41, 0xdb, 0xda, 0x48, 0xdb, 0x76, 0x22, 0x6d,\n  0x9b, 0x0a, 0x6d, 0x5b, 0x8b, 0xfb, 0xef, 0x84, 0xce, 0xf5, 0x27, 0x9d,\n  0x3b, 0x1a, 0x3a, 0xf7, 0x6e, 0xe4, 0x39, 0x9e, 0x8f, 0xc7, 0x53, 0xf7,\n  0xf0, 0x7b, 0x90, 0x3e, 0x01, 0x5a, 0xb8, 0x23, 0xb4, 0xf0, 0x44, 0x16,\n  0xc8, 0xef, 0x85, 0x2e, 0xe6, 0xa4, 0x8b, 0x3b, 0x92, 0x2e, 0x76, 0x92,\n  0x2e, 0x0e, 0x24, 0x5d, 0xcc, 0x49, 0x17, 0x3b, 0x49, 0x17, 0x77, 0x26,\n  0x5d, 0xdc, 0x99, 0x74, 0x71, 0x06, 0xe9, 0xe2, 0xce, 0xa4, 0x8b, 0x1d,\n  0xa4, 0x8b, 0x3b, 0x43, 0x17, 0x2f, 0x62, 0xd7, 0xf2, 0xdf, 0xf1, 0xdf,\n  0xb1, 0x5e, 0x7c, 0x31, 0xf4, 0xf2, 0x00, 0xe8, 0xe5, 0xe7, 0x90, 0xb2,\n  0x9c, 0x2f, 0x67, 0x5d, 0xf8, 0xf3, 0xd0, 0xd1, 0xdd, 0x49, 0x47, 0x0f,\n  0x84, 0x8e, 0xfe, 0x03, 0xbb, 0x99, 0xaf, 0xe2, 0xab, 0x70, 0xe7, 0x1f,\n  0xa1, 0xaf, 0x3b, 0x40, 0x5f, 0xbf, 0x88, 0x7b, 0xd6, 0x40, 0x6b, 0xdf,\n  0x4c, 0x5a, 0xbb, 0x0b, 0x69, 0xed, 0xcb, 0xa0, 0xb5, 0x5f, 0x63, 0x29,\n  0xbc, 0x8e, 0xd7, 0xc9, 0xff, 0x50, 0xc5, 0x5f, 0xc7, 0xfd, 0x1b, 0xa1,\n  0xc7, 0xbb, 0x43, 0x8f, 0x6f, 0xc2, 0x3d, 0x7f, 0x82, 0x36, 0xef, 0x00,\n  0x6d, 0xbe, 0x05, 0xfe, 0x9b, 0xd0, 0xe9, 0xd7, 0x42, 0xa7, 0xff, 0x05,\n  0xfe, 0x56, 0x68, 0xf6, 0xcb, 0x48, 0xb3, 0x8f, 0x80, 0x66, 0xdf, 0xce,\n  0xae, 0xe2, 0x7f, 0xe3, 0x7f, 0x63, 0xed, 0x79, 0x03, 0x6f, 0x60, 0xc1,\n  0xfc, 0xef, 0xd0, 0xf5, 0x5d, 0x49, 0xd7, 0x77, 0x25, 0x5d, 0xaf, 0x93,\n  0xae, 0xd7, 0xa1, 0xeb, 0x3f, 0xc4, 0x9d, 0x7b, 0xf9, 0x5e, 0x76, 0x25,\n  0xff, 0x07, 0xff, 0x07, 0x52, 0xf6, 0xf1, 0x7d, 0xb8, 0xe7, 0x23, 0xac,\n  0x01, 0xed, 0xb1, 0x06, 0xb8, 0xe1, 0x7f, 0x8c, 0x95, 0xe0, 0x1a, 0xac,\n  0x04, 0x9f, 0xc0, 0x3f, 0x88, 0xf5, 0x40, 0xc7, 0x7a, 0xf0, 0x2f, 0xe4,\n  0x79, 0x88, 0x1f, 0x62, 0xc9, 0xfc, 0x73, 0xac, 0x0d, 0x57, 0xd1, 0xda,\n  0x70, 0x85, 0xfc, 0x1f, 0xd7, 0xb8, 0xe7, 0x6b, 0xfe, 0x35, 0xd2, 0x8f,\n  0xf1, 0x63, 0xc8, 0xe7, 0x1b, 0xac, 0x16, 0x57, 0xf2, 0x6f, 0xf9, 0xb7,\n  0x68, 0xc5, 0x71, 0x7e, 0x1c, 0x77, 0x7e, 0xc7, 0xbf, 0x83, 0x2c, 0x9d,\n  0xe0, 0x27, 0x20, 0x3f, 0xdf, 0xf3, 0xef, 0x11, 0x3e, 0xc9, 0x4f, 0x22,\n  0xfc, 0x03, 0xff, 0x01, 0xe1, 0x53, 0xfc, 0x14, 0xc2, 0xcd, 0xbc, 0x99,\n  0x75, 0x13, 0xf2, 0xd0, 0x04, 0x3b, 0xa6, 0x82, 0xc6, 0x86, 0xc9, 0xff,\n  0x90, 0xcd, 0x7a, 0x08, 0x8b, 0xb0, 0xb0, 0xdb, 0xe5, 0xff, 0xc9, 0x46,\n  0xd8, 0x2e, 0xec, 0x08, 0x5f, 0x2e, 0x2e, 0x67, 0x89, 0x22, 0x50, 0x04,\n  0xb2, 0x04, 0x3a, 0x49, 0x26, 0x80, 0x4e, 0x8f, 0xf1, 0xc7, 0xda, 0x13,\n  0xc2, 0x84, 0x08, 0x15, 0xa1, 0x4c, 0x13, 0x61, 0x22, 0x0c, 0xe1, 0x70,\n  0x11, 0xce, 0xfa, 0x88, 0x08, 0x11, 0xc1, 0xae, 0x16, 0x91, 0x22, 0x92,\n  0x5d, 0x27, 0x46, 0x8a, 0x91, 0xec, 0x57, 0x72, 0x65, 0x62, 0xc1, 0x58,\n  0x99, 0xe2, 0xd8, 0x65, 0x22, 0x5e, 0xc4, 0xb3, 0x5b, 0x45, 0x82, 0x48,\n  0x60, 0x71, 0x22, 0x51, 0x24, 0xb2, 0x6b, 0x84, 0x53, 0x38, 0xd9, 0x00,\n  0xac, 0x58, 0x49, 0x6c, 0xa0, 0x48, 0x16, 0xc9, 0x2c, 0x56, 0xa4, 0x88,\n  0x14, 0x84, 0x53, 0x45, 0x2a, 0xc2, 0x69, 0x22, 0x8d, 0xc5, 0xc8, 0x95,\n  0x0c, 0x3e, 0x56, 0x32, 0x76, 0x33, 0x56, 0xb2, 0x1c, 0xa6, 0x8b, 0x5c,\n  0x91, 0x8b, 0xdc, 0xf2, 0x44, 0x1e, 0xc2, 0xf9, 0x22, 0x9f, 0x75, 0x17,\n  0x05, 0xa2, 0x00, 0x39, 0x17, 0x8a, 0x42, 0x84, 0x8b, 0x44, 0x11, 0xc2,\n  0xc5, 0xa2, 0x84, 0x5d, 0x29, 0x4a, 0x45, 0x29, 0xee, 0x1c, 0x23, 0xc6,\n  0xe0, 0xce, 0x32, 0x51, 0x86, 0x70, 0xb9, 0x28, 0x47, 0xb8, 0x42, 0x54,\n  0x20, 0x5c, 0x29, 0x2a, 0x71, 0x67, 0x95, 0xa8, 0x42, 0x1d, 0xee, 0x14,\n  0x77, 0xb2, 0x0e, 0x62, 0xac, 0x18, 0xcb, 0xda, 0x8b, 0xbb, 0xc4, 0x5d,\n  0xa8, 0xe1, 0x38, 0x31, 0x0e, 0x35, 0xbc, 0x5b, 0xdc, 0xcd, 0x52, 0xc4,\n  0x78, 0x31, 0x1e, 0x4f, 0xdd, 0x23, 0xee, 0x61, 0x77, 0x88, 0x09, 0x62,\n  0x02, 0x8b, 0xc6, 0x3a, 0x7a, 0x2f, 0x1b, 0x22, 0x26, 0x89, 0x49, 0xac,\n  0xbf, 0xb8, 0x4f, 0xdc, 0x87, 0xba, 0xdd, 0x2f, 0xee, 0x47, 0xca, 0x14,\n  0x31, 0x05, 0x29, 0x0f, 0x88, 0x07, 0x58, 0x17, 0x31, 0x55, 0x4c, 0x65,\n  0x5d, 0xc5, 0x83, 0xe2, 0x41, 0x84, 0xa7, 0x89, 0x69, 0x08, 0x3f, 0x24,\n  0x1e, 0x42, 0x78, 0xba, 0x98, 0x8e, 0xf0, 0xc3, 0xe2, 0x61, 0x94, 0x38,\n  0x43, 0xcc, 0x40, 0x89, 0x8f, 0x88, 0x47, 0x90, 0xf3, 0x4c, 0x31, 0x93,\n  0x5d, 0x85, 0x55, 0x79, 0x36, 0xca, 0xfa, 0x8d, 0xf8, 0x0d, 0x6a, 0xf5,\n  0xb8, 0x78, 0x9c, 0xf5, 0x12, 0x73, 0xc5, 0x5c, 0xa4, 0x3f, 0x21, 0x9e,\n  0x60, 0x51, 0x62, 0x9e, 0x98, 0xc7, 0x46, 0x8a, 0x27, 0xc5, 0x93, 0x08,\n  0xcf, 0x17, 0xf3, 0x11, 0x7e, 0x4a, 0x3c, 0x85, 0x72, 0x17, 0x88, 0x05,\n  0x28, 0xf7, 0xb7, 0xe2, 0xb7, 0xc8, 0x73, 0xa1, 0x58, 0x88, 0x3c, 0x9f,\n  0x16, 0x4f, 0x23, 0xbc, 0x48, 0x2c, 0x42, 0xf8, 0x19, 0xf1, 0x0c, 0x8b,\n  0x14, 0x4b, 0xc5, 0x52, 0x8c, 0xc5, 0xb3, 0xe2, 0x59, 0x84, 0x97, 0x89,\n  0x65, 0x08, 0x2f, 0x17, 0x98, 0x47, 0xe2, 0x79, 0xf1, 0x3c, 0xea, 0xb3,\n  0x52, 0xac, 0xc4, 0xfd, 0x7f, 0x10, 0x7f, 0xc0, 0xfd, 0xab, 0xc5, 0x6a,\n  0x84, 0x5f, 0x14, 0x2f, 0x22, 0xbc, 0x56, 0xac, 0x45, 0xf8, 0x65, 0xf1,\n  0x32, 0xc2, 0xaf, 0x88, 0x57, 0x30, 0x3a, 0xeb, 0xc5, 0x7a, 0x36, 0x42,\n  0xbc, 0x2a, 0x5e, 0x45, 0x78, 0x83, 0xd8, 0x80, 0x30, 0x90, 0x01, 0x72,\n  0xdb, 0x28, 0x36, 0xc2, 0x7f, 0x03, 0x6b, 0xe3, 0x65, 0x62, 0x93, 0xd8,\n  0x84, 0x56, 0xfc, 0x49, 0xfc, 0x09, 0xe1, 0xcd, 0x62, 0x33, 0xc2, 0x7f,\n  0x16, 0x7f, 0x46, 0x59, 0x5b, 0xc4, 0x16, 0x94, 0xf5, 0xa6, 0x78, 0x13,\n  0x3d, 0xf6, 0xb6, 0x78, 0x1b, 0x57, 0xb7, 0x8b, 0xed, 0xb8, 0xfa, 0x37,\n  0xf1, 0x37, 0x84, 0x1b, 0x44, 0x03, 0xc2, 0x7f, 0x17, 0x7f, 0x47, 0x78,\n  0x87, 0xd8, 0x81, 0xf0, 0x3b, 0xe2, 0x1d, 0x84, 0x77, 0x8a, 0x9d, 0x08,\n  0xbf, 0x2b, 0xde, 0xc5, 0xf8, 0xee, 0x12, 0xbb, 0x30, 0xb2, 0xef, 0x89,\n  0xf7, 0x10, 0xde, 0x2d, 0x76, 0x23, 0xfc, 0xbe, 0x78, 0x1f, 0xe1, 0x46,\n  0xd1, 0x88, 0xf0, 0x87, 0xe2, 0x43, 0xf4, 0xd8, 0x5e, 0xb1, 0x17, 0x3d,\n  0xf6, 0x91, 0xf8, 0x08, 0xbd, 0xba, 0x5f, 0xec, 0xc7, 0x78, 0xfd, 0x53,\n  0xfc, 0x13, 0xbd, 0xe4, 0x16, 0x6e, 0xf4, 0xd2, 0xc7, 0xe2, 0x63, 0xd4,\n  0xe4, 0x80, 0x38, 0x80, 0xf0, 0xa7, 0xe2, 0x53, 0x36, 0x58, 0x7c, 0x26,\n  0x3e, 0x63, 0x37, 0x8a, 0x7f, 0x89, 0x7f, 0x21, 0x7c, 0x48, 0x1c, 0x42,\n  0xf8, 0x73, 0xf1, 0x39, 0x5a, 0xed, 0x11, 0x1e, 0xb4, 0xfa, 0x0b, 0xf1,\n  0x05, 0xd2, 0x0f, 0x8b, 0xc3, 0x48, 0xff, 0x52, 0x7c, 0x89, 0xf0, 0x11,\n  0x71, 0x04, 0x61, 0x60, 0x1d, 0xf8, 0xdf, 0x8a, 0x6f, 0x71, 0xe7, 0x71,\n  0x71, 0x1c, 0x77, 0x7e, 0x27, 0xbe, 0xc3, 0x8c, 0x38, 0x21, 0x4e, 0x60,\n  0x46, 0x7c, 0x2f, 0xbe, 0x47, 0xf8, 0xa4, 0x38, 0x89, 0xf0, 0x0f, 0xe2,\n  0x07, 0x84, 0x4f, 0x89, 0x53, 0x08, 0x37, 0x8b, 0x66, 0xa6, 0x69, 0xf2,\n  0x50, 0x13, 0xa1, 0x71, 0x8d, 0x23, 0x2c, 0x34, 0x4c, 0x46, 0x4d, 0x93,\n  0x89, 0x9a, 0x8f, 0xe6, 0x83, 0xb0, 0xaf, 0xe6, 0x8b, 0xb0, 0xae, 0xe9,\n  0x08, 0x5b, 0x34, 0x0b, 0xc2, 0x56, 0xcd, 0x8a, 0xb0, 0x4d, 0xb3, 0x21,\n  0xec, 0xa7, 0x61, 0xb5, 0xd2, 0xec, 0x9a, 0x1d, 0x61, 0x87, 0x86, 0x35,\n  0x4b, 0xbb, 0x4c, 0xbb, 0x0c, 0x61, 0x7f, 0xcd, 0x1f, 0xe1, 0x76, 0x5a,\n  0x3b, 0x84, 0x03, 0xb4, 0x00, 0x84, 0xdb, 0x6b, 0xed, 0x99, 0xaf, 0x76,\n  0xb9, 0x86, 0xf5, 0x4b, 0xeb, 0xa8, 0x75, 0x84, 0xdf, 0x49, 0xeb, 0x04,\n  0xbf, 0x8b, 0xd6, 0x05, 0xfe, 0x15, 0xda, 0x15, 0xf0, 0xaf, 0xd4, 0xae,\n  0x84, 0x7f, 0x95, 0x76, 0x15, 0xfc, 0x6b, 0xb4, 0x6b, 0x98, 0x8f, 0x76,\n  0xad, 0x06, 0xac, 0xa2, 0x5d, 0xa7, 0x5d, 0x07, 0xff, 0x7a, 0xed, 0x7a,\n  0xf8, 0x37, 0x68, 0x37, 0xc0, 0xbf, 0x51, 0xbb, 0x11, 0xfe, 0x4d, 0xda,\n  0x4d, 0xf0, 0x6f, 0xd6, 0x6e, 0x66, 0x7d, 0xb4, 0x81, 0xda, 0x40, 0x76,\n  0xb5, 0x76, 0x8b, 0x76, 0x0b, 0xc2, 0x83, 0xb4, 0x41, 0x08, 0x0f, 0xd6,\n  0x06, 0x23, 0x3c, 0x44, 0x1b, 0x82, 0xf0, 0xad, 0xda, 0xad, 0x08, 0x0f,\n  0xd5, 0x86, 0x22, 0x7c, 0x9b, 0x76, 0x1b, 0xc2, 0xc3, 0xb4, 0x61, 0x08,\n  0xdf, 0xae, 0xdd, 0xce, 0xda, 0x49, 0x5c, 0x08, 0x3f, 0x54, 0x0b, 0x65,\n  0xd7, 0x69, 0x61, 0x5a, 0x18, 0xfb, 0x95, 0x36, 0x42, 0x1b, 0x81, 0x70,\n  0xb8, 0x16, 0x8e, 0x70, 0x84, 0x16, 0x81, 0x70, 0xa4, 0x16, 0x89, 0xf0,\n  0x48, 0x6d, 0x24, 0xc2, 0x51, 0x5a, 0x14, 0xc2, 0xd1, 0x5a, 0x34, 0xc2,\n  0x31, 0x5a, 0x0c, 0xc2, 0xb1, 0x5a, 0x2c, 0xeb, 0xa6, 0xc5, 0x69, 0x71,\n  0xcc, 0xae, 0xc5, 0x6b, 0xf1, 0x08, 0x27, 0x68, 0x09, 0x08, 0x27, 0x6a,\n  0x89, 0x08, 0x3b, 0x35, 0x27, 0xc2, 0x49, 0x5a, 0x12, 0xbb, 0x45, 0x4b,\n  0xd6, 0x92, 0xd9, 0x4d, 0x12, 0x77, 0xb2, 0x2b, 0x24, 0xee, 0x64, 0xfe,\n  0x12, 0x77, 0xb2, 0x2b, 0xe4, 0x7f, 0xc8, 0x67, 0x1d, 0xf5, 0x01, 0xfa,\n  0x60, 0x66, 0xd1, 0x87, 0xe8, 0x77, 0x30, 0x9b, 0xc4, 0xa0, 0x2c, 0x10,\n  0x18, 0x34, 0x87, 0x71, 0x3d, 0x57, 0x2f, 0x62, 0x0e, 0xbd, 0x58, 0xaf,\n  0x64, 0x7e, 0x7a, 0x95, 0x5e, 0xcd, 0x3a, 0x4b, 0x54, 0xca, 0x3a, 0x49,\n  0x54, 0xca, 0xfc, 0x81, 0x4a, 0x9f, 0x60, 0x01, 0xf2, 0xff, 0xe3, 0x23,\n  0x87, 0x05, 0xfa, 0x6f, 0xe5, 0x7f, 0x72, 0xd6, 0x9f, 0xc6, 0x53, 0x8b,\n  0xf4, 0xdf, 0xe1, 0xce, 0xa5, 0xfa, 0xb3, 0x48, 0x5f, 0xa6, 0xbf, 0x80,\n  0x9c, 0x57, 0xea, 0x2f, 0x21, 0x7d, 0xad, 0xfe, 0x32, 0xee, 0x01, 0x72,\n  0x45, 0x78, 0x9b, 0xfe, 0x0e, 0xfc, 0x9d, 0xfa, 0xbb, 0xb8, 0xba, 0x4b,\n  0xdf, 0x8d, 0x3b, 0xdf, 0xd7, 0x1b, 0x11, 0xfe, 0x40, 0xdf, 0x8b, 0x3a,\n  0xfc, 0x83, 0x4e, 0xca, 0x02, 0xae, 0xc5, 0xfd, 0xc0, 0xb5, 0xf2, 0xe4,\n  0x33, 0xfd, 0x1b, 0xd4, 0xa4, 0x49, 0xff, 0x8e, 0xf9, 0x49, 0x74, 0xcb,\n  0x3a, 0x03, 0xdd, 0x5a, 0x99, 0xbf, 0xc5, 0x66, 0xb1, 0xb1, 0x54, 0xf9,\n  0xff, 0xf6, 0x59, 0x27, 0xf9, 0x1f, 0xf7, 0x59, 0x80, 0x25, 0xc8, 0x12,\n  0x44, 0xe7, 0x2c, 0xad, 0x66, 0xa3, 0x24, 0xde, 0x65, 0x41, 0xc0, 0xbb,\n  0x73, 0x59, 0x4f, 0xeb, 0x13, 0xd6, 0xf9, 0xcc, 0x0a, 0xd4, 0x0b, 0xfb,\n  0x50, 0xfe, 0xa7, 0x7d, 0x16, 0x6a, 0x7d, 0xdd, 0xfa, 0x3a, 0x0b, 0xb1,\n  0x6e, 0xb4, 0x6e, 0x44, 0xf8, 0x0d, 0xeb, 0x26, 0x84, 0x81, 0x86, 0x71,\n  0x0f, 0xd0, 0x30, 0x7c, 0xa0, 0x61, 0x36, 0x14, 0x68, 0xf8, 0x00, 0xfc,\n  0x4f, 0xac, 0x5f, 0xb2, 0xcb, 0x25, 0x26, 0x66, 0xfd, 0x80, 0x89, 0xbf,\n  0x67, 0x37, 0x58, 0x4f, 0x5a, 0x9b, 0xd9, 0x20, 0x89, 0x8c, 0x59, 0x98,\n  0x44, 0xc6, 0xf0, 0x81, 0x8c, 0x59, 0x98, 0x44, 0xc6, 0x40, 0x62, 0x42,\n  0x04, 0x10, 0x32, 0x1e, 0x4a, 0xc8, 0x78, 0x28, 0x73, 0xd0, 0x09, 0x33,\n  0x12, 0x1f, 0xf7, 0x25, 0x7c, 0x7c, 0x1b, 0xe1, 0xe3, 0xbe, 0x84, 0x8f,\n  0x6d, 0x84, 0x8f, 0x7d, 0x59, 0x1f, 0xf9, 0x3f, 0x33, 0x09, 0x0d, 0xfb,\n  0x12, 0x0e, 0xf6, 0x25, 0x1c, 0x3c, 0x80, 0x70, 0xb0, 0x83, 0x70, 0x70,\n  0x0f, 0x42, 0xc0, 0x5d, 0x08, 0x01, 0xdf, 0x8e, 0xfc, 0xa4, 0x93, 0x38,\n  0xd8, 0x02, 0xbc, 0x17, 0xc1, 0x02, 0x61, 0x03, 0x47, 0x01, 0xde, 0x49,\n  0x4c, 0x7c, 0x05, 0x2c, 0xe1, 0x18, 0xe4, 0x27, 0x91, 0x31, 0x56, 0x2e,\n  0x60, 0xde, 0x40, 0xc2, 0xc7, 0x3a, 0xb0, 0x65, 0x12, 0xee, 0x49, 0x86,\n  0xd3, 0x59, 0x0a, 0x1c, 0x27, 0xc4, 0xac, 0x03, 0xd3, 0xa6, 0xa1, 0x0c,\n  0x89, 0x9b, 0x7b, 0xb3, 0x74, 0x38, 0x9d, 0xac, 0xf0, 0x00, 0x58, 0xce,\n  0x39, 0xc0, 0xe2, 0xf9, 0x70, 0x21, 0x84, 0x9e, 0x13, 0x08, 0x3d, 0xc7,\n  0x13, 0x7a, 0xb6, 0x11, 0x7a, 0x4e, 0x26, 0xf4, 0xec, 0x4b, 0x88, 0xd9,\n  0x97, 0x10, 0xb3, 0x2f, 0x21, 0x66, 0x07, 0x21, 0xe6, 0x2e, 0xc0, 0xca,\n  0xf2, 0xa4, 0xa4, 0x67, 0x61, 0xa9, 0x5b, 0xd8, 0x0b, 0xb0, 0xd4, 0x39,\n  0xd9, 0xe8, 0x9c, 0x6c, 0x74, 0xce, 0x5e, 0x67, 0xd0, 0x92, 0x84, 0xa1,\n  0x03, 0xd8, 0x66, 0xb8, 0x40, 0x42, 0xd2, 0x01, 0x84, 0xa4, 0x6d, 0x84,\n  0xa4, 0x2d, 0x84, 0xa4, 0x6d, 0x84, 0xa4, 0x2d, 0x84, 0xa4, 0x6d, 0x84,\n  0xa4, 0x2d, 0x84, 0xa4, 0x7d, 0xd9, 0x5f, 0xe1, 0x38, 0xe1, 0x69, 0x5f,\n  0xf6, 0x36, 0x1c, 0x27, 0x54, 0xed, 0xcb, 0xfe, 0x06, 0xc7, 0x09, 0x5b,\n  0xfb, 0xb2, 0xbf, 0xc3, 0x71, 0xc2, 0xd6, 0x9c, 0xbd, 0x0b, 0xc7, 0xd9,\n  0x7b, 0x70, 0x9c, 0xbd, 0x0f, 0xc7, 0xd9, 0x07, 0x70, 0x9c, 0x7d, 0x08,\n  0xc7, 0xd9, 0x3f, 0xe0, 0x38, 0xdb, 0x07, 0xe7, 0xcb, 0x3e, 0x82, 0xeb,\n  0xc3, 0xf6, 0xc3, 0xf9, 0xb2, 0x7f, 0xc2, 0xf5, 0x61, 0x6e, 0x26, 0xff,\n  0x33, 0xef, 0xc7, 0x70, 0x7d, 0xd8, 0x01, 0x38, 0x5f, 0xf6, 0x09, 0x5c,\n  0x1f, 0xc2, 0xe2, 0x81, 0xec, 0x38, 0x5c, 0x20, 0xe1, 0x6f, 0x9d, 0x7d,\n  0x0f, 0x17, 0xc8, 0x7e, 0x80, 0x0b, 0x24, 0xe4, 0x1d, 0xc8, 0xf1, 0x07,\n  0x5f, 0x62, 0x6e, 0x9d, 0x30, 0xb7, 0x4e, 0x68, 0x5b, 0x27, 0xb4, 0xed,\n  0xcb, 0xfd, 0xb9, 0x3f, 0x70, 0xa1, 0xc4, 0xdc, 0xbe, 0x3c, 0x80, 0x07,\n  0x20, 0x2c, 0x91, 0xb7, 0x2f, 0xef, 0xc0, 0x3b, 0x20, 0xac, 0xf0, 0x77,\n  0x20, 0x0f, 0x44, 0x58, 0xa2, 0x70, 0x9d, 0x50, 0xb8, 0xce, 0xbb, 0xf1,\n  0x6e, 0xec, 0x56, 0xde, 0x9d, 0x77, 0x87, 0x2f, 0xb1, 0xf8, 0x00, 0xc2,\n  0xe2, 0xbd, 0x09, 0x8b, 0x0f, 0x20, 0x2c, 0xde, 0x9b, 0xb0, 0xf8, 0x00,\n  0xc2, 0xe2, 0xbd, 0x09, 0x8b, 0x3b, 0x78, 0x1f, 0xde, 0x07, 0xcf, 0x4a,\n  0x44, 0xee, 0xe0, 0x7d, 0x79, 0x5f, 0x84, 0x25, 0x2e, 0x77, 0xf0, 0x7e,\n  0xbc, 0x1f, 0xc2, 0x12, 0x9d, 0x3b, 0x78, 0x7f, 0xde, 0x1f, 0x61, 0x89,\n  0xd1, 0x1d, 0x7c, 0x00, 0x1f, 0x80, 0xb0, 0x44, 0xea, 0x0e, 0x3e, 0x90,\n  0x0f, 0x44, 0x58, 0xe2, 0xf5, 0x1e, 0x84, 0xd7, 0x03, 0x08, 0xaf, 0x77,\n  0x21, 0xbc, 0x1e, 0x40, 0x78, 0xbd, 0x0b, 0xe1, 0xf5, 0xdb, 0xf9, 0x6d,\n  0xfc, 0x36, 0xd8, 0x00, 0x12, 0xb5, 0xdf, 0xce, 0xe1, 0x10, 0x96, 0xd8,\n  0xfd, 0x76, 0x7e, 0x07, 0xbf, 0x03, 0x61, 0x89, 0xe0, 0x6d, 0x84, 0xe0,\n  0x2d, 0x84, 0xe0, 0x93, 0x79, 0x04, 0x8f, 0x40, 0x58, 0xe2, 0x78, 0x5f,\n  0x3e, 0x92, 0x8f, 0x44, 0x4b, 0xa3, 0x79, 0x34, 0xda, 0x95, 0x43, 0xff,\n  0x33, 0x5f, 0xa2, 0xf6, 0x9b, 0x09, 0xaf, 0xdf, 0x4c, 0x78, 0x3d, 0x89,\n  0x30, 0xfa, 0xcd, 0x84, 0xd1, 0x93, 0x08, 0x97, 0x5f, 0x4d, 0x28, 0xfc,\n  0x6a, 0x42, 0xe1, 0x76, 0xfe, 0x6b, 0xfe, 0x6b, 0x58, 0x38, 0x12, 0x8b,\n  0x77, 0x20, 0x2c, 0x7e, 0x1d, 0x9f, 0xc4, 0x27, 0xc1, 0x5a, 0x90, 0x88,\n  0xdc, 0x4e, 0x88, 0x3c, 0x91, 0x3f, 0xc0, 0x1f, 0xc0, 0x3d, 0x12, 0x97,\n  0x77, 0x20, 0x5c, 0x7e, 0x1d, 0x9f, 0xce, 0xa7, 0x23, 0x3c, 0x83, 0xcf,\n  0x80, 0x2f, 0x31, 0x7a, 0x22, 0x61, 0x74, 0x3b, 0x9f, 0xc5, 0x67, 0xb1,\n  0x18, 0x42, 0xea, 0x77, 0xf0, 0xd9, 0x40, 0xea, 0x76, 0x3e, 0x87, 0xcf,\n  0x41, 0xca, 0xe3, 0xfc, 0x71, 0xe4, 0x29, 0x51, 0xbb, 0x9d, 0xcf, 0xe3,\n  0x4f, 0x22, 0x2c, 0xb1, 0x7b, 0x3b, 0xfe, 0x14, 0x7f, 0x0a, 0x61, 0x89,\n  0xe0, 0xed, 0xfc, 0xb7, 0x7c, 0x21, 0xc2, 0x12, 0xc7, 0x5f, 0x45, 0x08,\n  0xde, 0x1f, 0x08, 0xfe, 0x59, 0xa0, 0xdb, 0xe7, 0x80, 0xe3, 0xaf, 0x22,\n  0x04, 0xdf, 0x9f, 0x10, 0xfc, 0x4d, 0x84, 0xda, 0x83, 0x09, 0xb5, 0x77,\n  0x26, 0xd4, 0xfe, 0x2b, 0xbe, 0x8e, 0xaf, 0x43, 0x8a, 0x44, 0xed, 0xfe,\n  0x84, 0xd7, 0xfd, 0x09, 0xaf, 0x3b, 0x09, 0xaf, 0xf7, 0x27, 0xbc, 0xde,\n  0x99, 0x6f, 0xe6, 0x9b, 0x81, 0xdd, 0x25, 0x52, 0xbf, 0x0a, 0x18, 0x7d,\n  0x2b, 0x9e, 0x92, 0x18, 0xfd, 0x4a, 0xfe, 0x36, 0x30, 0xba, 0x46, 0x18,\n  0xbd, 0x13, 0x61, 0x74, 0x3f, 0xc2, 0xe8, 0x41, 0x7c, 0x07, 0xdf, 0xc1,\n  0x6e, 0xe4, 0xef, 0x00, 0xa9, 0x6b, 0x7c, 0x17, 0xdf, 0x85, 0xab, 0xef,\n  0xf1, 0xdd, 0x08, 0x4b, 0xd4, 0xee, 0xc7, 0x1b, 0x81, 0xda, 0x35, 0xbe,\n  0x87, 0xef, 0x41, 0x58, 0x62, 0xf7, 0x6e, 0x84, 0xdd, 0xfb, 0x11, 0x76,\n  0xf7, 0x23, 0xec, 0x1e, 0x44, 0xd8, 0x5d, 0xe3, 0xfb, 0xf9, 0x7e, 0x76,\n  0x03, 0xff, 0x27, 0x10, 0xbc, 0x46, 0x08, 0xbe, 0x1b, 0x3f, 0x00, 0x04,\n  0xaf, 0x01, 0xc1, 0x1f, 0x44, 0xfe, 0x9f, 0x02, 0xc7, 0x6b, 0x84, 0xe3,\n  0xfd, 0x08, 0xc7, 0x0f, 0x23, 0x1c, 0xaf, 0x71, 0x0f, 0xf7, 0x20, 0xe5,\n  0x2b, 0xfe, 0x15, 0xca, 0x3d, 0x0a, 0x34, 0xaf, 0x11, 0x9a, 0x1f, 0x46,\n  0x68, 0x5e, 0x23, 0x34, 0xdf, 0x8f, 0x37, 0xf1, 0x26, 0x84, 0x25, 0x9a,\n  0xd7, 0x08, 0xcd, 0xf7, 0x20, 0x34, 0x1f, 0x40, 0x68, 0xbe, 0x07, 0xa1,\n  0xf9, 0x00, 0x42, 0xf3, 0x3d, 0x08, 0xcd, 0x07, 0x10, 0x9a, 0xef, 0x42,\n  0x38, 0xfe, 0x36, 0xa1, 0x03, 0xc7, 0x0f, 0x25, 0x1c, 0xdf, 0x57, 0xf8,\n  0x01, 0xc7, 0x0f, 0x25, 0x1c, 0xdf, 0x57, 0xb4, 0x13, 0xd0, 0xbd, 0x84,\n  0xe6, 0x13, 0x08, 0xcd, 0xc7, 0x13, 0x8e, 0xbf, 0x9a, 0x70, 0xbc, 0x4e,\n  0x38, 0xde, 0x46, 0x38, 0xde, 0x42, 0x38, 0xde, 0x97, 0x70, 0x3c, 0x27,\n  0x1c, 0xef, 0x20, 0x1c, 0xaf, 0x13, 0x8e, 0xf7, 0x13, 0xb1, 0x22, 0x16,\n  0x38, 0x46, 0xa2, 0x79, 0x7f, 0x42, 0xf3, 0x83, 0x09, 0xcd, 0x5f, 0x2b,\n  0x46, 0x89, 0x51, 0x48, 0x97, 0x38, 0xfe, 0x26, 0xc2, 0xf1, 0x9d, 0x08,\n  0xc1, 0x6b, 0x22, 0x43, 0x64, 0xc0, 0x97, 0xd8, 0xfd, 0x57, 0x22, 0x5b,\n  0x64, 0x03, 0xa5, 0x49, 0xec, 0xee, 0x4f, 0xd8, 0xdd, 0x8f, 0xb0, 0x7b,\n  0x34, 0x61, 0xf7, 0xc1, 0x84, 0xdd, 0xa3, 0x09, 0xbb, 0x0f, 0x06, 0x76,\n  0x2f, 0xc6, 0x3d, 0x25, 0x40, 0xf0, 0x7e, 0x84, 0xe0, 0xfd, 0x09, 0xc1,\n  0xfb, 0x11, 0x82, 0xf7, 0x27, 0x04, 0xef, 0x47, 0x08, 0xde, 0x9f, 0x10,\n  0xfc, 0x60, 0x42, 0xf0, 0xfe, 0xa2, 0x5a, 0x54, 0x23, 0x5d, 0x22, 0x78,\n  0x8d, 0x10, 0xfc, 0xb5, 0x84, 0xe0, 0x87, 0x11, 0x76, 0xd7, 0x08, 0xbb,\n  0x5f, 0x2b, 0x26, 0x8a, 0x89, 0x08, 0x4b, 0xec, 0xde, 0x99, 0xb0, 0x7b,\n  0x10, 0x61, 0xf7, 0x5f, 0x89, 0xc9, 0x62, 0x32, 0x90, 0x9c, 0xc4, 0xee,\n  0x1a, 0xa1, 0x76, 0x8d, 0x50, 0xfb, 0xb5, 0x84, 0xda, 0x87, 0x11, 0x6a,\n  0xbf, 0x8a, 0x50, 0x7b, 0x37, 0xc2, 0xeb, 0x1a, 0x21, 0x75, 0x4d, 0xcc,\n  0x12, 0xb3, 0xe0, 0x3f, 0x26, 0x1e, 0x43, 0xe9, 0x12, 0xb5, 0xfb, 0x11,\n  0x6a, 0xf7, 0x17, 0x73, 0xc4, 0x1c, 0x84, 0x25, 0x76, 0x77, 0x12, 0x76,\n  0xef, 0x76, 0x5e, 0xec, 0xde, 0x99, 0xb0, 0x7b, 0x10, 0x61, 0xf7, 0xab,\n  0x08, 0xbb, 0x77, 0x23, 0xec, 0xde, 0x9d, 0xb0, 0xfb, 0x0d, 0xe2, 0x77,\n  0xe2, 0x77, 0x08, 0x2f, 0x16, 0x8b, 0x11, 0x5e, 0x22, 0x96, 0xa0, 0xc4,\n  0xd3, 0x68, 0x3e, 0xc2, 0x0b, 0xcd, 0x47, 0x10, 0x9a, 0xef, 0x4c, 0x68,\n  0x3e, 0x48, 0xbc, 0x20, 0x5e, 0xc0, 0x9d, 0x12, 0xd3, 0x07, 0x13, 0xa6,\n  0xef, 0x24, 0xfe, 0x28, 0xfe, 0x88, 0x14, 0x89, 0xe9, 0x35, 0xb1, 0x46,\n  0xac, 0x41, 0x9e, 0x2f, 0x89, 0x97, 0x90, 0xa7, 0x44, 0xf6, 0x1a, 0x21,\n  0xfb, 0x9b, 0x08, 0xd9, 0x5f, 0x49, 0xc8, 0xfe, 0x26, 0x42, 0xf6, 0x57,\n  0x8a, 0xd7, 0xc4, 0x6b, 0x08, 0x4b, 0x7c, 0x7f, 0x25, 0xe1, 0x7b, 0x3f,\n  0xc2, 0xf7, 0xe1, 0x84, 0xef, 0xaf, 0x24, 0x7c, 0x1f, 0x4e, 0xf8, 0xfe,\n  0x4a, 0xc2, 0xf7, 0x9d, 0x09, 0xdf, 0x07, 0x11, 0xbe, 0xff, 0x95, 0xa8,\n  0x17, 0xf5, 0xe8, 0xd5, 0xb7, 0xc4, 0x5b, 0xc8, 0x7f, 0x9b, 0xd8, 0x06,\n  0x5f, 0x22, 0x7e, 0x7f, 0x42, 0xfc, 0x7e, 0x84, 0xf8, 0xfd, 0x09, 0xf1,\n  0xfb, 0x11, 0xe2, 0xf7, 0x27, 0xc4, 0xef, 0x47, 0x88, 0xff, 0x57, 0x84,\n  0xf8, 0x6f, 0x24, 0xc4, 0xdf, 0x9f, 0x10, 0x7f, 0x3f, 0x42, 0xfc, 0xfd,\n  0x09, 0xf1, 0xf7, 0x23, 0xc4, 0xdf, 0x9f, 0x10, 0x7f, 0x3f, 0xf1, 0x81,\n  0xf8, 0x00, 0x6d, 0xd9, 0x23, 0xf6, 0xa0, 0x2d, 0x12, 0xf7, 0x6b, 0x62,\n  0x9f, 0xd8, 0x07, 0x5f, 0xa2, 0xff, 0x6b, 0x09, 0xf7, 0x77, 0x26, 0xdc,\n  0x1f, 0x44, 0xb8, 0xbf, 0x33, 0xe1, 0xfe, 0x20, 0xf1, 0x89, 0xf8, 0x04,\n  0x76, 0xcb, 0x41, 0x71, 0x10, 0x25, 0x4a, 0x1b, 0x60, 0x04, 0xd9, 0x00,\n  0x7e, 0x64, 0x03, 0x84, 0x91, 0x0d, 0x10, 0x4a, 0x36, 0x40, 0x18, 0xd9,\n  0x00, 0xa1, 0x64, 0x03, 0x04, 0x93, 0x0d, 0xd0, 0x89, 0xd0, 0xbf, 0x26,\n  0xbe, 0x12, 0x5f, 0xa1, 0xce, 0x47, 0xc5, 0x51, 0x3c, 0xf5, 0xb5, 0xf8,\n  0x1a, 0x63, 0x27, 0xed, 0x81, 0x6e, 0xa2, 0x49, 0x34, 0x21, 0x45, 0x5a,\n  0x05, 0xc1, 0x64, 0x15, 0x74, 0x22, 0xab, 0xc0, 0x46, 0x56, 0x81, 0x85,\n  0xac, 0x02, 0x1b, 0x59, 0x05, 0x16, 0xb2, 0x0a, 0x6c, 0x64, 0x15, 0x58,\n  0xc8, 0x2a, 0xb0, 0x91, 0x55, 0x60, 0x21, 0xab, 0xc0, 0x46, 0x56, 0x81,\n  0x85, 0xac, 0x02, 0x1b, 0x59, 0x05, 0x16, 0xb2, 0x0a, 0x6c, 0x64, 0x15,\n  0x58, 0xc8, 0x2a, 0xb0, 0x91, 0x55, 0x60, 0x21, 0xab, 0xc0, 0x46, 0x56,\n  0x81, 0x85, 0xac, 0x02, 0x1b, 0x59, 0x05, 0x16, 0xb2, 0x0a, 0x6c, 0x64,\n  0x15, 0x58, 0xc8, 0x2a, 0xb0, 0x91, 0x55, 0x60, 0xd1, 0x3a, 0x68, 0x58,\n  0x55, 0xb5, 0x40, 0x0d, 0xeb, 0xa9, 0x16, 0xa4, 0x01, 0x2f, 0x6a, 0x9d,\n  0xb5, 0xce, 0xf0, 0xbb, 0x6a, 0x5d, 0xe1, 0x77, 0xd3, 0xba, 0xc1, 0x0f,\n  0xd6, 0x82, 0xe1, 0x77, 0xd7, 0xba, 0xc3, 0x97, 0x56, 0x81, 0xaf, 0xd6,\n  0x4b, 0xeb, 0x85, 0xb0, 0xb4, 0x0d, 0x7c, 0xb5, 0xde, 0x5a, 0x6f, 0x84,\n  0xa5, 0x85, 0xe0, 0xab, 0xf5, 0xd1, 0xfa, 0x20, 0x2c, 0xed, 0x04, 0x5f,\n  0xad, 0xaf, 0xd6, 0x17, 0x61, 0x69, 0x2d, 0xf8, 0x6a, 0xfd, 0xb4, 0x7e,\n  0x08, 0x4b, 0x9b, 0xc1, 0x57, 0xeb, 0xaf, 0xf5, 0x47, 0x58, 0x5a, 0x0e,\n  0xbe, 0xda, 0x00, 0x6d, 0x00, 0xc2, 0xd2, 0x7e, 0xf0, 0x25, 0xfb, 0x81,\n  0x93, 0xfd, 0xe0, 0x4b, 0xf6, 0x03, 0x27, 0xfb, 0xc1, 0x97, 0xec, 0x07,\n  0x4e, 0xf6, 0x83, 0x2f, 0xd9, 0x0f, 0x9c, 0xec, 0x07, 0x5f, 0xb2, 0x1f,\n  0x38, 0xd9, 0x0f, 0x0e, 0x6d, 0xb8, 0x36, 0x9c, 0xe9, 0x64, 0x45, 0x38,\n  0xb4, 0x10, 0x0d, 0x7a, 0x8c, 0x6c, 0x09, 0x07, 0xd9, 0x12, 0x3a, 0xd9,\n  0x12, 0x0e, 0xb2, 0x25, 0x74, 0xb2, 0x25, 0x1c, 0x64, 0x4b, 0xe8, 0x64,\n  0x4b, 0x38, 0xc8, 0x96, 0xd0, 0xc9, 0x96, 0x70, 0x90, 0x2d, 0xa1, 0x93,\n  0x2d, 0xd1, 0x85, 0x6c, 0x89, 0x00, 0xb2, 0x25, 0xba, 0x90, 0x2d, 0x11,\n  0x40, 0xb6, 0x44, 0x17, 0xb2, 0x25, 0x02, 0xc8, 0x96, 0x18, 0x40, 0xb6,\n  0x44, 0x6f, 0x9f, 0x37, 0x60, 0x45, 0x5c, 0xed, 0x6b, 0xf3, 0xb5, 0xc1,\n  0x1e, 0x90, 0x56, 0x84, 0x9d, 0xac, 0x88, 0xcb, 0xf4, 0x10, 0x3d, 0x94,\n  0x5d, 0xaf, 0x87, 0xe9, 0x11, 0xac, 0x17, 0xd9, 0x12, 0x1d, 0xf4, 0x04,\n  0x3d, 0x99, 0xb5, 0x27, 0x8b, 0xe2, 0x3a, 0xb2, 0x28, 0xda, 0x91, 0x2d,\n  0x61, 0xd7, 0x5d, 0xfa, 0x9d, 0x6c, 0x90, 0x3e, 0x41, 0xbf, 0x9f, 0x09,\n  0x7d, 0x9a, 0xfe, 0x28, 0x7c, 0x69, 0x4b, 0xd8, 0xf5, 0xf9, 0xfa, 0x7c,\n  0x3c, 0xfb, 0x94, 0xfe, 0x14, 0xf2, 0x91, 0x76, 0x45, 0x07, 0xd8, 0x15,\n  0xf2, 0x4c, 0x9c, 0xa7, 0x61, 0x5d, 0x5c, 0x47, 0xd6, 0x85, 0x5d, 0x5f,\n  0xac, 0x3f, 0x83, 0xfb, 0xa5, 0x8d, 0x61, 0x27, 0x1b, 0xe3, 0x32, 0xb2,\n  0x2e, 0x3a, 0xe8, 0xeb, 0xf4, 0xd7, 0x50, 0xd6, 0x16, 0xfd, 0xaf, 0xb8,\n  0xba, 0x53, 0xdf, 0x85, 0xf4, 0xf7, 0x60, 0x5d, 0xd8, 0xc9, 0xba, 0xb8,\n  0x4c, 0x9e, 0xd4, 0xc5, 0x6e, 0x26, 0xbb, 0xa2, 0x83, 0x7e, 0x50, 0xff,\n  0x14, 0x77, 0x4a, 0xbb, 0xa2, 0x9d, 0xfe, 0x83, 0x05, 0xb6, 0x28, 0xd9,\n  0x15, 0x77, 0x40, 0xac, 0x60, 0x7f, 0xca, 0xb3, 0xbc, 0xd8, 0xd5, 0x96,\n  0xcb, 0x2c, 0xed, 0x11, 0x96, 0x67, 0xb6, 0x5e, 0x61, 0x0d, 0xb4, 0x76,\n  0x64, 0xc3, 0xad, 0xf7, 0x59, 0x27, 0xb3, 0x58, 0xb2, 0x2b, 0x3a, 0x5a,\n  0x67, 0x5a, 0x1f, 0x85, 0x8d, 0x31, 0xcb, 0x3a, 0x8b, 0xf9, 0x90, 0x8d,\n  0x61, 0x85, 0x8d, 0xf1, 0x0c, 0xc2, 0x4b, 0xad, 0xcb, 0x11, 0x7e, 0xde,\n  0xfa, 0x02, 0xc2, 0xaf, 0x58, 0xd7, 0xb3, 0x38, 0x58, 0x1d, 0x7f, 0x41,\n  0x78, 0xab, 0xf5, 0x1d, 0xa4, 0xef, 0xb4, 0xbe, 0x8b, 0xb0, 0xb2, 0x31,\n  0xde, 0xb3, 0x36, 0x22, 0xfc, 0x81, 0x75, 0x1f, 0xeb, 0x4a, 0xf6, 0xc6,\n  0x10, 0xb2, 0x37, 0x86, 0x78, 0xd9, 0x1b, 0xd7, 0x90, 0xbd, 0xd1, 0x93,\n  0xec, 0x8d, 0x81, 0x36, 0x38, 0x36, 0xdc, 0x56, 0x61, 0xab, 0x60, 0xc3,\n  0xe9, 0xa4, 0x4f, 0x75, 0x5a, 0xa5, 0x03, 0xc8, 0xdf, 0x47, 0x34, 0xea,\n  0x5b, 0x99, 0xc0, 0x6c, 0xa2, 0xf3, 0x39, 0xe9, 0x3c, 0x4d, 0x75, 0x9a,\n  0xb0, 0x50, 0xe7, 0x08, 0xdb, 0x17, 0xd9, 0x0f, 0x30, 0x8b, 0xfd, 0xa0,\n  0x23, 0x8e, 0x39, 0x1d, 0x09, 0x8e, 0xd1, 0xec, 0x55, 0x3a, 0xc1, 0xf6,\n  0xcf, 0x74, 0x56, 0xea, 0x07, 0x78, 0xb2, 0x9a, 0x4e, 0x59, 0x66, 0x74,\n  0xca, 0x72, 0x57, 0x3a, 0x65, 0x79, 0x20, 0x9d, 0xb2, 0x7c, 0x0b, 0x9d,\n  0xb2, 0x3c, 0x88, 0x4e, 0x59, 0x8e, 0xa7, 0x53, 0x96, 0xab, 0x68, 0x9f,\n  0xf5, 0x24, 0x9d, 0xb2, 0xfc, 0x83, 0x3c, 0x65, 0x99, 0x3f, 0x4f, 0xef,\n  0x65, 0x56, 0xc8, 0xf3, 0x95, 0xf9, 0x0b, 0xf4, 0x76, 0x66, 0xa5, 0x3c,\n  0x5f, 0x99, 0xff, 0x41, 0x9e, 0xaf, 0xcc, 0x5f, 0x94, 0xe7, 0x2b, 0xf3,\n  0x77, 0xe4, 0xf9, 0xca, 0xfc, 0x3d, 0x79, 0xbe, 0xb2, 0xb6, 0x57, 0x9e,\n  0xaf, 0xac, 0xfd, 0x43, 0x9e, 0xaf, 0xac, 0xed, 0x93, 0x27, 0x2b, 0x6b,\n  0x1f, 0xcb, 0x93, 0x95, 0xb5, 0x83, 0xf2, 0x64, 0x65, 0xed, 0x90, 0x3c,\n  0x59, 0xd9, 0xa7, 0x9f, 0x3c, 0x59, 0xd9, 0xe7, 0x46, 0x79, 0xb2, 0xb2,\n  0xcf, 0x9d, 0xf2, 0x64, 0x65, 0x9f, 0xb1, 0xbe, 0x19, 0xbe, 0x59, 0x3e,\n  0xe3, 0xe4, 0xc9, 0xca, 0x3e, 0xf7, 0xc8, 0x93, 0x95, 0x7d, 0x26, 0xcb,\n  0x93, 0x95, 0x7d, 0xee, 0x97, 0x27, 0x2b, 0xfb, 0x4c, 0x91, 0x27, 0x2b,\n  0xfb, 0x7e, 0x22, 0x4f, 0x56, 0xf6, 0x3d, 0x28, 0x4f, 0x56, 0xd6, 0x2f,\n  0x93, 0x27, 0x2b, 0xeb, 0x5d, 0xe5, 0xc9, 0xca, 0xfa, 0x55, 0xf2, 0x4c,\n  0x65, 0xbd, 0xbb, 0x3c, 0x4d, 0x59, 0x1f, 0x2c, 0xcf, 0x51, 0xd6, 0x2b,\n  0xe4, 0x39, 0xca, 0xfa, 0x9d, 0x96, 0x7a, 0x4b, 0xbd, 0x3e, 0x56, 0x9e,\n  0xa3, 0xac, 0xdf, 0x65, 0x69, 0xb0, 0xec, 0xd0, 0xef, 0xb1, 0xec, 0xb4,\n  0xec, 0xd6, 0x27, 0xca, 0xd3, 0x94, 0xf5, 0xfb, 0xe5, 0x69, 0xca, 0xfa,\n  0x14, 0x79, 0x9a, 0xb2, 0xfe, 0x80, 0x3c, 0x4d, 0x59, 0x7f, 0x50, 0x9e,\n  0xa6, 0xac, 0x3f, 0x24, 0x4f, 0x53, 0xd6, 0x67, 0x58, 0xbe, 0xb7, 0x72,\n  0x7d, 0x26, 0x54, 0x50, 0x90, 0xfe, 0xb8, 0xb5, 0xb3, 0xb5, 0xb7, 0xfe,\n  0x9c, 0x3c, 0x59, 0x59, 0x5f, 0x2f, 0x4f, 0x56, 0xd6, 0x5f, 0x95, 0x27,\n  0x2b, 0xeb, 0xaf, 0xc9, 0x93, 0x95, 0xf5, 0x3a, 0x79, 0xb2, 0xb2, 0xbe,\n  0xc9, 0x1a, 0x6a, 0x0d, 0xd5, 0x37, 0xcb, 0x93, 0x95, 0xf5, 0x3f, 0xcb,\n  0x93, 0x95, 0xf5, 0x7a, 0x79, 0xb2, 0xb2, 0xfe, 0x17, 0x79, 0xb2, 0xb2,\n  0xfe, 0x3f, 0xf2, 0x64, 0x65, 0x7d, 0xbb, 0x3c, 0x59, 0x59, 0xff, 0x9b,\n  0x3c, 0x59, 0x59, 0x6f, 0xb0, 0x96, 0x5b, 0x27, 0xe8, 0xbb, 0xad, 0x13,\n  0x6d, 0x4c, 0x3f, 0x28, 0xcf, 0x57, 0xb6, 0x54, 0xcb, 0xf3, 0x95, 0x2d,\n  0x77, 0xca, 0xf3, 0x95, 0x2d, 0x63, 0x6d, 0x5d, 0x6c, 0xc1, 0x96, 0xbb,\n  0x6c, 0xdd, 0x6d, 0xdd, 0x2d, 0xbf, 0xb6, 0xdd, 0x60, 0xbb, 0xc5, 0x32,\n  0x51, 0x9e, 0xaf, 0x6c, 0x79, 0x50, 0x9e, 0xaf, 0x6c, 0x79, 0x58, 0x9e,\n  0xaf, 0x6c, 0x79, 0x44, 0x9e, 0xaf, 0x6c, 0x79, 0x4c, 0x9e, 0xa9, 0x6c,\n  0x99, 0x6d, 0xcb, 0xb7, 0xe5, 0x5b, 0xe6, 0xca, 0x33, 0x95, 0x2d, 0x4f,\n  0xc8, 0x33, 0x95, 0x2d, 0x0b, 0xe4, 0x99, 0xca, 0x96, 0x55, 0xf2, 0x4c,\n  0x65, 0xcb, 0x1f, 0xe5, 0x99, 0xca, 0x96, 0x17, 0xe5, 0x99, 0xca, 0x96,\n  0x97, 0xe4, 0x99, 0xca, 0x96, 0xb5, 0xf2, 0x4c, 0x65, 0xcb, 0x3a, 0x79,\n  0xa6, 0xb2, 0xe5, 0x15, 0x79, 0xa6, 0xb2, 0x65, 0xbd, 0x3c, 0x53, 0xd9,\n  0xb2, 0x41, 0x9e, 0xa9, 0x6c, 0xa9, 0x93, 0x67, 0x2a, 0x5b, 0xde, 0x90,\n  0x67, 0x2a, 0x5b, 0x36, 0xcb, 0x33, 0x95, 0x2d, 0x5b, 0xe4, 0x99, 0xca,\n  0x96, 0x77, 0xe4, 0x99, 0xca, 0x96, 0x77, 0xe5, 0x99, 0xca, 0x96, 0xf7,\n  0xe4, 0x99, 0xca, 0x96, 0xdd, 0xf2, 0x4c, 0x65, 0xcb, 0x07, 0xf2, 0x4c,\n  0x65, 0xcb, 0x3e, 0x79, 0xa6, 0xb2, 0x65, 0xbf, 0x3c, 0x53, 0xd9, 0xe2,\n  0x96, 0x67, 0x2a, 0x5b, 0x3e, 0x96, 0xa7, 0x29, 0x5b, 0x0e, 0xc8, 0xb3,\n  0x93, 0x2d, 0x5f, 0x3a, 0x36, 0x3a, 0x36, 0x5a, 0x75, 0x79, 0x76, 0xb2,\n  0xd5, 0x02, 0xfb, 0x89, 0x4d, 0x72, 0x31, 0xfe, 0xe0, 0x6e, 0xd0, 0x5e,\n  0xc6, 0xa7, 0xcd, 0x69, 0x43, 0x93, 0x15, 0x7f, 0xd0, 0x0d, 0xfa, 0x0c,\n  0x74, 0x18, 0xf1, 0x99, 0xc6, 0xb5, 0x69, 0x2a, 0xfc, 0xe0, 0x31, 0x15,\n  0x7e, 0xf0, 0x84, 0xd7, 0x73, 0xec, 0xf4, 0xb3, 0xd3, 0x74, 0x10, 0xf4,\n  0xe9, 0x34, 0x07, 0x13, 0x33, 0x36, 0xa2, 0x3c, 0xab, 0x41, 0x2e, 0x22,\n  0x31, 0x63, 0x0b, 0xe8, 0x2d, 0x84, 0x45, 0x4b, 0x5a, 0x0b, 0xdd, 0x7b,\n  0x04, 0xd4, 0x04, 0x3a, 0x89, 0xf8, 0x10, 0xe3, 0x9e, 0xd6, 0xcf, 0xb7,\n  0x0e, 0x9f, 0x8d, 0xac, 0x4c, 0xbb, 0x7f, 0x39, 0x68, 0x15, 0x68, 0x2d,\n  0x68, 0x03, 0x68, 0x93, 0x57, 0x79, 0x2a, 0xbf, 0xd6, 0x6d, 0xc6, 0xca,\n  0x35, 0xad, 0x33, 0xc5, 0x55, 0xb9, 0x2a, 0x2f, 0x75, 0x6d, 0xb2, 0x91,\n  0xee, 0x32, 0x9e, 0xeb, 0xdf, 0x92, 0xae, 0xd2, 0x7a, 0x19, 0xd4, 0x95,\n  0xd2, 0xc4, 0x8c, 0x06, 0x23, 0x7d, 0x88, 0xf1, 0x9c, 0xbf, 0xd1, 0x77,\n  0x73, 0x8c, 0x3c, 0x65, 0x99, 0xc1, 0x08, 0x07, 0x1a, 0xe1, 0xfe, 0x44,\n  0xea, 0xf9, 0x94, 0xb3, 0x8c, 0x89, 0xa4, 0x9e, 0x2d, 0xf7, 0xaa, 0x3c,\n  0xe4, 0x98, 0xf4, 0x31, 0x78, 0x0a, 0xd2, 0xba, 0x1b, 0xf9, 0x0c, 0x6a,\n  0x29, 0xcb, 0x1c, 0x33, 0x55, 0x37, 0xef, 0xfe, 0xe9, 0x0b, 0x1a, 0xe0,\n  0xd5, 0x86, 0x21, 0xe7, 0x28, 0xf3, 0x62, 0x48, 0x8e, 0x73, 0x18, 0xf2,\n  0x18, 0x0e, 0x0a, 0xff, 0x09, 0xf9, 0xfc, 0x3c, 0x74, 0xba, 0x8d, 0x31,\n  0x20, 0x27, 0x28, 0xcd, 0xa0, 0x6c, 0xa3, 0x5f, 0xa2, 0x10, 0x2e, 0x34,\n  0xda, 0x9e, 0x00, 0x2a, 0x45, 0xbc, 0xcc, 0xe8, 0xf7, 0x4c, 0x50, 0x3e,\n  0xa5, 0xf1, 0x69, 0x55, 0xa0, 0xb1, 0x17, 0x51, 0xa6, 0x29, 0x1f, 0x13,\n  0xbc, 0xe2, 0xd3, 0x7e, 0x42, 0x1b, 0x66, 0x5e, 0x52, 0x5b, 0x2f, 0x70,\n  0x8f, 0xd5, 0x51, 0x95, 0x5f, 0x99, 0x54, 0x55, 0xc5, 0x58, 0xaa, 0x27,\n  0xcd, 0x2f, 0x7b, 0x2a, 0x63, 0x85, 0xbd, 0x0b, 0x17, 0x16, 0xf6, 0x63,\n  0x2c, 0x6d, 0x68, 0xfe, 0x81, 0xb4, 0xda, 0xb4, 0xf1, 0xb5, 0xce, 0xc2,\n  0xe5, 0x85, 0xab, 0x10, 0xaf, 0x0f, 0x29, 0x4c, 0xdb, 0xc1, 0x58, 0xfe,\n  0xcc, 0xe8, 0xc2, 0x34, 0x37, 0x63, 0x63, 0xe6, 0x8e, 0xee, 0x99, 0xeb,\n  0xca, 0x1d, 0x97, 0xbb, 0xac, 0x70, 0x43, 0x21, 0xe6, 0x4e, 0xe8, 0xd0,\n  0xca, 0xdc, 0xca, 0x62, 0xc6, 0xaa, 0x26, 0x57, 0x4d, 0xab, 0x9a, 0xc9,\n  0x18, 0x9e, 0x9b, 0x51, 0x38, 0xdb, 0xb5, 0xa3, 0xa2, 0x7b, 0x45, 0xaf,\n  0x0a, 0xc8, 0x53, 0xe1, 0x40, 0xe4, 0xbb, 0x84, 0xb1, 0x8a, 0xe1, 0x15,\n  0x69, 0x15, 0x03, 0x2a, 0x86, 0x14, 0x4d, 0x28, 0x38, 0x5e, 0x70, 0x0a,\n  0xe9, 0x3d, 0x64, 0x9c, 0xb1, 0x9a, 0x61, 0x35, 0x61, 0x35, 0xe8, 0xfb,\n  0xc2, 0xa1, 0x85, 0x21, 0x85, 0x91, 0xe0, 0xe3, 0x0b, 0x6b, 0x0b, 0x57,\n  0x15, 0x4e, 0x2a, 0xac, 0xaf, 0x28, 0x2c, 0xdc, 0x86, 0xeb, 0x29, 0x35,\n  0x99, 0x35, 0xf9, 0x8c, 0x65, 0x85, 0x67, 0xf4, 0xc8, 0xe8, 0xcd, 0x58,\n  0x46, 0x48, 0x4c, 0x64, 0x46, 0x1c, 0x63, 0xae, 0xbd, 0xae, 0xdd, 0x05,\n  0x18, 0xbf, 0x8c, 0xa9, 0x19, 0x33, 0xb2, 0xa6, 0xa3, 0xfc, 0xa5, 0x25,\n  0xbd, 0x4b, 0x50, 0xff, 0xaa, 0x61, 0x69, 0x41, 0x69, 0xdd, 0x64, 0xbc,\n  0x6a, 0x45, 0xd5, 0x6a, 0xc6, 0x8a, 0xc3, 0x8b, 0x63, 0x8a, 0x9d, 0xc5,\n  0x69, 0xc5, 0x53, 0x4a, 0x86, 0x96, 0x84, 0x20, 0x7d, 0xfb, 0xdd, 0xf3,\n  0xee, 0x5e, 0x88, 0xf4, 0x05, 0xc5, 0x8b, 0x8b, 0x97, 0x21, 0xbe, 0xae,\n  0xaa, 0xae, 0x6a, 0x73, 0xd5, 0xd6, 0x5a, 0x57, 0x4d, 0xff, 0x9a, 0x41,\n  0x28, 0x6f, 0xbb, 0xe2, 0xc5, 0x2b, 0x4b, 0xfc, 0x8a, 0xd7, 0x80, 0x67,\n  0x97, 0xf8, 0x95, 0x04, 0x94, 0x04, 0x15, 0x17, 0x16, 0x97, 0x15, 0x43,\n  0x7e, 0x4a, 0x7b, 0x96, 0x24, 0x95, 0xa4, 0x23, 0x7d, 0x4a, 0xd1, 0xe4,\n  0xec, 0xc8, 0xec, 0xb8, 0xa2, 0x93, 0x30, 0x1e, 0xa1, 0x37, 0x8a, 0xfd,\n  0xab, 0xc7, 0xc9, 0xfc, 0x8a, 0xd7, 0x17, 0x6f, 0x29, 0x86, 0x6e, 0x2b,\n  0x9f, 0x0f, 0x0e, 0x5d, 0x96, 0x31, 0x2f, 0x7d, 0x4d, 0x7e, 0x58, 0x7e,\n  0x54, 0xd5, 0x58, 0xe3, 0xb9, 0xae, 0xc5, 0xdd, 0x8b, 0x31, 0xef, 0x2a,\n  0x9c, 0xc5, 0x1b, 0x33, 0x96, 0x33, 0x56, 0xd0, 0x77, 0x44, 0x5a, 0x06,\n  0xd2, 0x33, 0x56, 0xc5, 0xed, 0xc9, 0xd8, 0xc0, 0x58, 0x76, 0xbf, 0xfc,\n  0xc9, 0x19, 0xb3, 0x19, 0x0b, 0x29, 0x0b, 0x71, 0xc9, 0x8f, 0x7e, 0x42,\n  0xc6, 0x85, 0x4c, 0x94, 0xbc, 0x2a, 0x3f, 0x76, 0x8e, 0x1c, 0xaf, 0x33,\n  0x79, 0xc8, 0x14, 0xc5, 0x23, 0xbb, 0x2a, 0x5e, 0x55, 0x2a, 0x79, 0xac,\n  0x63, 0x64, 0x9c, 0x7c, 0x2e, 0xad, 0x87, 0x1a, 0xd7, 0x5a, 0x67, 0xec,\n  0x52, 0x39, 0x9e, 0x67, 0xf2, 0xb0, 0xed, 0x92, 0xe7, 0x2e, 0x8b, 0x5d,\n  0x2d, 0xc7, 0xf3, 0x4c, 0x1e, 0xb6, 0x53, 0xf2, 0xe8, 0xec, 0x82, 0xe9,\n  0x32, 0xbf, 0xc2, 0x81, 0x21, 0xd3, 0xd5, 0x78, 0xc6, 0x6e, 0x96, 0xe3,\n  0x79, 0x26, 0x0f, 0x99, 0xa5, 0x78, 0xe4, 0x74, 0xe2, 0xce, 0xa8, 0xd5,\n  0xf4, 0x5c, 0x7d, 0xec, 0x21, 0x39, 0x9e, 0x67, 0xf2, 0x90, 0xb9, 0x92,\n  0xbb, 0xf6, 0x8e, 0x68, 0x90, 0xe3, 0x59, 0x34, 0xa1, 0x26, 0x53, 0xde,\n  0x5f, 0xe6, 0x53, 0x95, 0x40, 0xed, 0x5e, 0x1a, 0x3b, 0x9f, 0xc6, 0xf5,\n  0x0c, 0x1e, 0xb2, 0x40, 0xf1, 0xc8, 0xee, 0x46, 0x7c, 0xb1, 0xe4, 0xce,\n  0x6e, 0xb2, 0xd7, 0xd1, 0xee, 0x7e, 0xc6, 0xf8, 0x4f, 0x89, 0x5d, 0x21,\n  0xc7, 0xfd, 0x4c, 0x3e, 0x62, 0xa2, 0xe4, 0x35, 0x9b, 0x63, 0xd7, 0xc9,\n  0xfb, 0xcf, 0xe4, 0x23, 0xa8, 0xbd, 0x45, 0x13, 0x42, 0x96, 0x49, 0x5e,\n  0xda, 0x33, 0xfd, 0x2d, 0x35, 0xee, 0xb1, 0x5b, 0xe5, 0xb8, 0x9f, 0xc9,\n  0x43, 0x56, 0x2a, 0x1e, 0x39, 0x97, 0xe4, 0x62, 0x42, 0x11, 0x7d, 0xf7,\n  0x57, 0x35, 0x36, 0xf6, 0x88, 0x7c, 0xee, 0x4c, 0x1e, 0xb2, 0xa6, 0x84,\n  0xc6, 0x3d, 0x72, 0xa3, 0x1c, 0xf7, 0xe2, 0xbe, 0xc5, 0xf4, 0x7f, 0x9d,\n  0x10, 0x5f, 0x23, 0xe3, 0x55, 0xf9, 0x39, 0x4d, 0x34, 0x9e, 0x4b, 0x43,\n  0xd6, 0x53, 0xfb, 0xf2, 0x73, 0x8e, 0xa8, 0x78, 0xec, 0x22, 0x19, 0x0f,\n  0xd9, 0x18, 0xb2, 0x45, 0xc6, 0x4b, 0x7a, 0x28, 0xb9, 0x2f, 0xec, 0x9d,\n  0xd6, 0xbb, 0x90, 0xfa, 0x21, 0x6d, 0xa0, 0x6c, 0xf7, 0x99, 0xf1, 0xd1,\n  0xab, 0x55, 0x3c, 0xe4, 0xad, 0xb3, 0x5d, 0x4f, 0x1b, 0x1a, 0xd2, 0x20,\n  0xe7, 0xbd, 0x39, 0x5f, 0xcc, 0xf1, 0x2e, 0xed, 0x19, 0x3d, 0x44, 0xf2,\n  0x5a, 0x67, 0xc8, 0x2e, 0x29, 0x27, 0x68, 0xe7, 0x1e, 0xd9, 0x6f, 0xb5,\n  0xce, 0xb4, 0xb5, 0x2a, 0x9e, 0xb6, 0x49, 0xc5, 0x43, 0xf6, 0x1b, 0xd7,\n  0x0f, 0xca, 0x78, 0x88, 0x47, 0xe9, 0x8f, 0x92, 0x81, 0x6a, 0xde, 0x99,\n  0xf2, 0x66, 0xf6, 0x7f, 0xfe, 0xcc, 0xd8, 0x2a, 0xa9, 0x4f, 0x8a, 0x17,\n  0xc4, 0x8e, 0x95, 0xf3, 0x26, 0x7f, 0x66, 0xc8, 0x51, 0x15, 0x0f, 0x39,\n  0x6e, 0xc4, 0x4f, 0xa9, 0x78, 0xa8, 0x8f, 0x8c, 0x87, 0xfa, 0x29, 0xfd,\n  0x63, 0xde, 0x3f, 0x66, 0x6e, 0x5c, 0xa0, 0xd4, 0x43, 0x55, 0xeb, 0xe2,\n  0xba, 0xca, 0xf9, 0x9b, 0xdb, 0x7d, 0x74, 0x4f, 0x55, 0xdf, 0x2a, 0xfa,\n  0xf2, 0x2f, 0x77, 0x59, 0x68, 0x80, 0x94, 0xdb, 0x9a, 0xcd, 0xa1, 0x41,\n  0x2a, 0x9e, 0xbb, 0xd2, 0x88, 0x77, 0x33, 0xe2, 0x8b, 0x55, 0x3c, 0x96,\n  0xee, 0x2f, 0x5c, 0xab, 0xf4, 0x59, 0x49, 0xa4, 0x9a, 0xff, 0x78, 0xbe,\n  0x07, 0xe9, 0xb7, 0xde, 0xa1, 0xfd, 0xe4, 0xf5, 0x98, 0x55, 0xa1, 0x03,\n  0x25, 0x0f, 0x1d, 0x1a, 0x1a, 0x22, 0xf5, 0x5d, 0xcd, 0x76, 0x25, 0x27,\n  0xa1, 0x91, 0x4a, 0xef, 0x85, 0xc6, 0x19, 0xfa, 0x62, 0x65, 0x42, 0x1f,\n  0xd5, 0x5f, 0xa1, 0x49, 0x52, 0x0f, 0x16, 0x67, 0x8f, 0x4e, 0x90, 0xfa,\n  0x23, 0x34, 0x5d, 0xe9, 0xc5, 0xd0, 0x5c, 0xa5, 0x4f, 0x4c, 0x3d, 0x69,\n  0xea, 0x97, 0xb3, 0xc5, 0x65, 0x3e, 0x32, 0xae, 0xe6, 0x1d, 0xc6, 0x6b,\n  0x89, 0x6c, 0x9f, 0x92, 0x9f, 0xd0, 0x62, 0xa5, 0x57, 0x43, 0x2b, 0x94,\n  0x5e, 0x39, 0xe3, 0x7a, 0x6d, 0xe8, 0xf8, 0xd0, 0x49, 0xe8, 0xc7, 0x43,\n  0x85, 0x0b, 0xa9, 0x5f, 0x82, 0xd5, 0x7d, 0x98, 0xa7, 0xfd, 0xe5, 0xbc,\n  0xc4, 0x38, 0x0c, 0x92, 0x72, 0x8a, 0xf8, 0x76, 0x23, 0xbe, 0xd3, 0x88,\n  0x6f, 0x36, 0xe2, 0x24, 0xd7, 0xa1, 0x53, 0x43, 0xa9, 0x1e, 0x77, 0x77,\n  0x73, 0x4e, 0xa5, 0x79, 0x31, 0x2c, 0xb6, 0x51, 0xea, 0xeb, 0xe2, 0xf5,\n  0xe9, 0x69, 0x52, 0xcf, 0x85, 0xce, 0x56, 0xfa, 0x3b, 0x74, 0x9e, 0xd2,\n  0x7b, 0x6d, 0xaf, 0x17, 0x0e, 0x4d, 0x77, 0x4a, 0xbd, 0x5e, 0x3e, 0x1f,\n  0xf1, 0xb7, 0xce, 0x8c, 0x87, 0x2e, 0x54, 0x7a, 0x3f, 0x7e, 0x9e, 0xd2,\n  0x97, 0x67, 0x5c, 0x5f, 0xa2, 0xd6, 0x83, 0xd0, 0xe5, 0x4a, 0x8f, 0x16,\n  0x8e, 0x0f, 0x5d, 0x25, 0xe3, 0x19, 0xf3, 0xf2, 0x87, 0xa9, 0x78, 0x61,\n  0x2d, 0xcd, 0x1b, 0x43, 0xcf, 0x16, 0xd6, 0xa7, 0x6f, 0x91, 0xfa, 0xa4,\n  0x6a, 0xac, 0x9a, 0xaf, 0x85, 0xf5, 0xa1, 0x6b, 0x55, 0x3c, 0x74, 0x83,\n  0x8a, 0xc7, 0x36, 0xa9, 0x78, 0xec, 0x49, 0xe3, 0xfa, 0x26, 0xe3, 0x7a,\n  0xbd, 0x71, 0xfd, 0x90, 0x71, 0x5d, 0xf5, 0xe3, 0x36, 0xb5, 0x0e, 0x95,\n  0xc4, 0xa9, 0xfe, 0xcb, 0x0a, 0x1f, 0xb1, 0x5e, 0xae, 0x43, 0x15, 0xce,\n  0x11, 0xa4, 0xbf, 0x4d, 0xbd, 0x65, 0xce, 0x63, 0xd7, 0xde, 0xb0, 0x14,\n  0x63, 0x5d, 0xaa, 0x90, 0xeb, 0x52, 0x76, 0xbf, 0x8c, 0x5a, 0xa9, 0xcf,\n  0x33, 0xa6, 0x86, 0xee, 0x50, 0xf1, 0xd0, 0xdd, 0x2a, 0xde, 0xfa, 0x7a,\n  0x51, 0x55, 0x02, 0xe9, 0xbd, 0x82, 0x8d, 0xa1, 0x7b, 0x43, 0x21, 0xe7,\n  0x05, 0x6b, 0x42, 0x3f, 0x53, 0xfa, 0x2f, 0xf4, 0xb0, 0xe4, 0xb1, 0x8e,\n  0xd0, 0x63, 0x92, 0x3b, 0xbb, 0x85, 0x9e, 0x90, 0xbc, 0xc2, 0x19, 0xbb,\n  0x59, 0xe9, 0xa7, 0xd8, 0xad, 0x92, 0x87, 0x31, 0xd5, 0x8f, 0x61, 0xba,\n  0xea, 0x47, 0x73, 0x7d, 0x0f, 0x73, 0x44, 0x5b, 0xc3, 0x3a, 0xa0, 0x3f,\n  0xf7, 0x85, 0x75, 0x0e, 0x0b, 0x0e, 0xeb, 0x59, 0x3c, 0xab, 0x4a, 0x0f,\n  0x83, 0x84, 0x86, 0x0d, 0x0b, 0xeb, 0x9f, 0x9b, 0x16, 0x36, 0x08, 0x3c,\n  0xac, 0x6a, 0x11, 0x63, 0x79, 0x41, 0x79, 0x34, 0x2f, 0x2a, 0x16, 0x87,\n  0x45, 0xa9, 0xf5, 0x46, 0x3d, 0x9f, 0x78, 0x30, 0x6e, 0x8d, 0xc4, 0x07,\n  0x45, 0x61, 0x85, 0xf4, 0x5f, 0x22, 0x4a, 0xa3, 0xc2, 0x12, 0x94, 0x7c,\n  0xab, 0xf9, 0x6d, 0xae, 0xbf, 0x26, 0x2e, 0x30, 0xd7, 0x79, 0x13, 0x1f,\n  0x98, 0xb8, 0x20, 0x6e, 0x7d, 0xdc, 0x46, 0xca, 0xbf, 0x0d, 0x2e, 0x30,\n  0xc7, 0xcf, 0x7c, 0x2e, 0xa1, 0xae, 0xa2, 0x50, 0xb5, 0x4b, 0xe1, 0x84,\n  0x18, 0xe0, 0x02, 0x92, 0x7f, 0x03, 0x17, 0x98, 0xeb, 0x7e, 0xfe, 0xcc,\n  0xf0, 0x0a, 0x1a, 0x77, 0x03, 0x0f, 0x98, 0xf1, 0x0a, 0x67, 0x45, 0x9a,\n  0x9a, 0xdf, 0x6a, 0xdd, 0x32, 0xc7, 0xa3, 0x7c, 0x6b, 0x18, 0xf5, 0x6f,\n  0x76, 0xbf, 0xb0, 0x7c, 0x35, 0x1f, 0xc2, 0x4a, 0x8d, 0xf6, 0x56, 0x49,\n  0x9e, 0xbf, 0x33, 0x6c, 0xac, 0xe4, 0xe5, 0x5b, 0x73, 0xe8, 0x0b, 0xe2,\n  0xe2, 0x86, 0xe2, 0x5d, 0xc5, 0x7b, 0xc0, 0x8f, 0x17, 0x9f, 0x0a, 0x9b,\n  0x20, 0xd3, 0x8b, 0x3a, 0xa8, 0xe7, 0xe3, 0x8e, 0x52, 0x7f, 0xaf, 0x08,\n  0x9b, 0xac, 0xf2, 0xc9, 0xf5, 0xa7, 0xf5, 0xea, 0x44, 0xd8, 0xb4, 0xb0,\n  0x99, 0x32, 0xbf, 0x0a, 0x5a, 0x2f, 0x4c, 0x3d, 0x10, 0xbd, 0x3e, 0x9a,\n  0xda, 0x1d, 0x36, 0xa7, 0x80, 0xd6, 0xf1, 0xb0, 0xf9, 0x71, 0xf4, 0xe5,\n  0x71, 0xd8, 0xa2, 0xb0, 0xa5, 0x74, 0x9f, 0x81, 0x23, 0xaa, 0x26, 0x8f,\n  0x08, 0xa7, 0x7a, 0x1f, 0x55, 0xeb, 0x46, 0xd8, 0x8a, 0xc4, 0x8d, 0x4a,\n  0x9f, 0x95, 0x24, 0x51, 0xbd, 0x80, 0x27, 0x54, 0x3d, 0xab, 0xc7, 0x91,\n  0x1c, 0xf8, 0xe5, 0xd3, 0xf3, 0xd5, 0xd9, 0xd5, 0x85, 0xd5, 0x65, 0x8c,\n  0x85, 0xd7, 0x86, 0x8f, 0x57, 0xed, 0xcf, 0x8b, 0x33, 0xda, 0xb5, 0xda,\n  0x68, 0xd7, 0x3a, 0x55, 0x4e, 0x58, 0x9d, 0x2c, 0x07, 0xf1, 0xcd, 0xea,\n  0xbe, 0xb0, 0xad, 0x6a, 0x1c, 0x8d, 0xf5, 0xdf, 0xd0, 0x9f, 0x45, 0x61,\n  0xb1, 0x94, 0x2f, 0x70, 0x94, 0xd2, 0x3b, 0x06, 0x2e, 0x33, 0xc7, 0xd3,\n  0xec, 0xd7, 0xca, 0x74, 0x85, 0xfb, 0xe2, 0x23, 0xc3, 0xa8, 0xbf, 0xc2,\n  0xf6, 0x85, 0x1d, 0xa0, 0xfa, 0xb7, 0xe8, 0xe1, 0xb0, 0x43, 0x92, 0x8f,\n  0xd9, 0x12, 0x76, 0x84, 0xae, 0x37, 0xa9, 0x71, 0x35, 0xe5, 0xaa, 0xda,\n  0x55, 0x49, 0x7a, 0xc5, 0xc4, 0x9f, 0xa6, 0x7c, 0x55, 0x84, 0x57, 0xc4,\n  0x78, 0xcb, 0x57, 0x64, 0x8c, 0x92, 0xcb, 0xaa, 0xb1, 0x85, 0xc5, 0x92,\n  0xbb, 0xea, 0xc3, 0x4e, 0x2a, 0x3e, 0x42, 0xa8, 0x72, 0xe2, 0x68, 0x7d,\n  0xaa, 0x08, 0xac, 0xe8, 0xea, 0x2d, 0x5f, 0x6d, 0xe5, 0xb1, 0xad, 0x5c,\n  0x99, 0x78, 0xd7, 0x94, 0xab, 0x31, 0x5b, 0xc2, 0xf7, 0x52, 0x7f, 0xb5,\n  0x91, 0xab, 0x11, 0x56, 0xd5, 0x9e, 0xc8, 0x2d, 0x23, 0x4e, 0x49, 0x3e,\n  0xc2, 0xbf, 0x8a, 0xe4, 0x25, 0x3c, 0x60, 0x04, 0xfd, 0xce, 0x71, 0x44,\n  0x57, 0x55, 0xdf, 0xc8, 0xfd, 0x23, 0xba, 0x4b, 0x3e, 0xb2, 0x62, 0x44,\n  0x2f, 0xaa, 0xff, 0x90, 0x1a, 0x9a, 0x27, 0x23, 0xfa, 0x8e, 0xa0, 0x75,\n  0xbd, 0x60, 0x4d, 0xc1, 0x7a, 0x35, 0x9f, 0xd5, 0x7a, 0x5d, 0xeb, 0x1c,\n  0x41, 0xf5, 0x2e, 0xca, 0x74, 0xd2, 0x6f, 0x54, 0xc2, 0x77, 0xc4, 0xd3,\n  0xfc, 0xae, 0x38, 0x55, 0x2b, 0xd4, 0x78, 0xa9, 0x75, 0x33, 0x32, 0xad,\n  0xe2, 0x38, 0xdd, 0x17, 0x3c, 0x62, 0xb8, 0x1a, 0x17, 0x25, 0x27, 0xe0,\n  0x54, 0x6e, 0x41, 0xdf, 0x88, 0xce, 0xf4, 0xdc, 0xc1, 0x0a, 0x92, 0xab,\n  0x8a, 0xa3, 0xea, 0xfe, 0x84, 0xce, 0x09, 0xc1, 0xde, 0xf2, 0x35, 0x66,\n  0x8b, 0x92, 0x3f, 0x13, 0xaf, 0x9a, 0xf8, 0x78, 0x84, 0x33, 0x22, 0x53,\n  0xe1, 0x0e, 0x85, 0x3f, 0x9d, 0x7e, 0x89, 0x0b, 0x54, 0xbe, 0x0a, 0x97,\n  0x8e, 0xc8, 0x56, 0xcf, 0xe5, 0xef, 0x1c, 0x41, 0xfd, 0x57, 0xdb, 0xb7,\n  0x76, 0x80, 0x37, 0x1f, 0x51, 0x36, 0x82, 0x70, 0x6a, 0xde, 0xd0, 0x11,\n  0x24, 0x97, 0x19, 0x53, 0x8b, 0x17, 0x4b, 0x9e, 0x78, 0xca, 0xe9, 0x43,\n  0xf5, 0xd9, 0x52, 0x41, 0x78, 0xac, 0x78, 0x5c, 0xf1, 0x44, 0x55, 0x1f,\n  0x85, 0xbb, 0x4a, 0x83, 0x15, 0xae, 0x08, 0xdf, 0x31, 0x62, 0x0a, 0xdd,\n  0x7f, 0x34, 0xf1, 0xb8, 0x29, 0xe7, 0x52, 0x7f, 0xb5, 0xe0, 0x71, 0x03,\n  0x87, 0x99, 0xb8, 0x3c, 0x61, 0xf5, 0x88, 0x59, 0x32, 0x9e, 0x19, 0x35,\n  0x62, 0xae, 0x37, 0x3e, 0x41, 0x7d, 0x17, 0xa8, 0x76, 0x8c, 0x58, 0x2c,\n  0xdb, 0x31, 0x62, 0x59, 0x25, 0xc9, 0xef, 0x98, 0x98, 0x11, 0x2b, 0xa9,\n  0x3f, 0x06, 0x8d, 0xa0, 0x5f, 0x0a, 0xb4, 0xd5, 0xdf, 0x67, 0x89, 0x6f,\n  0x31, 0xe2, 0x6f, 0x9d, 0x4d, 0xbf, 0x27, 0x87, 0xa4, 0x8e, 0x4b, 0x9d,\n  0x78, 0x5a, 0xcf, 0x98, 0x38, 0x00, 0x33, 0x62, 0xad, 0x92, 0xbf, 0x11,\n  0xbb, 0xa4, 0xfc, 0x15, 0x17, 0x8e, 0xd8, 0x23, 0xed, 0x85, 0x11, 0xfb,\n  0x95, 0xbc, 0x8f, 0x38, 0xa8, 0xc6, 0xdd, 0x7c, 0x4e, 0x8e, 0x0b, 0xe9,\n  0x87, 0x89, 0x4a, 0x2e, 0x33, 0x42, 0xd4, 0x3c, 0x37, 0x71, 0x12, 0xe4,\n  0xdb, 0xa3, 0xee, 0x53, 0x78, 0x09, 0xe3, 0x4d, 0x7a, 0x27, 0x6f, 0x46,\n  0xde, 0x6c, 0xea, 0xb7, 0x85, 0xe1, 0x4b, 0xa8, 0xff, 0x8f, 0x2b, 0xb9,\n  0xac, 0x0d, 0x0f, 0xa7, 0xfe, 0x0e, 0xf7, 0x8b, 0x59, 0xa8, 0xe4, 0x33,\n  0x9c, 0x70, 0x4f, 0xda, 0xd0, 0x70, 0x9a, 0x3f, 0x31, 0xfd, 0xc2, 0x7b,\n  0x50, 0x7a, 0xef, 0x02, 0xba, 0x3f, 0xbc, 0x5f, 0x38, 0xe1, 0x19, 0x13,\n  0xe7, 0x15, 0xac, 0xa9, 0xd8, 0x4f, 0xe9, 0x43, 0xc3, 0x49, 0xdf, 0x86,\n  0x47, 0x86, 0x93, 0x1e, 0x09, 0x4f, 0x0a, 0x4f, 0x27, 0x9e, 0x1b, 0x5e,\n  0xec, 0x3d, 0x3f, 0x4e, 0xeb, 0x1b, 0xd5, 0x1e, 0x13, 0xef, 0xa2, 0x1e,\n  0x93, 0x28, 0x9e, 0x50, 0x6c, 0xd4, 0x2b, 0x76, 0x8e, 0x8a, 0x87, 0x13,\n  0x7e, 0x08, 0x9f, 0x91, 0x4d, 0xf3, 0x3c, 0x7c, 0x76, 0xf8, 0x3c, 0x68,\n  0xd3, 0xb8, 0xb6, 0xed, 0x09, 0x5f, 0xae, 0xf4, 0x4e, 0xf8, 0xaa, 0x70,\n  0xea, 0xcf, 0xf0, 0x0d, 0xe1, 0x9b, 0x88, 0xd7, 0x87, 0x6f, 0x53, 0x72,\n  0x98, 0xb8, 0x46, 0xc9, 0x59, 0xcd, 0x52, 0xef, 0x78, 0x71, 0x5f, 0xa5,\n  0x17, 0x0b, 0xfa, 0x46, 0x1e, 0x57, 0x72, 0xe5, 0x24, 0xdc, 0x16, 0xbe,\n  0x5b, 0xcd, 0xeb, 0x70, 0xb7, 0xd2, 0xc7, 0xe1, 0x9f, 0x85, 0xd3, 0x7a,\n  0x1a, 0x7e, 0x2c, 0x9c, 0xd6, 0xd1, 0x92, 0xb8, 0xaa, 0x09, 0x92, 0x47,\n  0xb0, 0x22, 0x9a, 0xe7, 0x11, 0x7a, 0x84, 0x83, 0x78, 0x07, 0x35, 0xaf,\n  0x4a, 0x7b, 0x16, 0xf4, 0x52, 0xf9, 0x16, 0x0c, 0xf0, 0x8e, 0x4b, 0xfb,\n  0x90, 0xee, 0x0b, 0x8e, 0xe8, 0xa9, 0xf4, 0x9c, 0x31, 0x4f, 0x12, 0xf2,\n  0xe9, 0xe4, 0xb2, 0x88, 0x3e, 0x6a, 0xfe, 0x61, 0x7c, 0xfd, 0xbd, 0xe7,\n  0x63, 0x44, 0xff, 0x88, 0x41, 0xc4, 0x87, 0x45, 0x84, 0x49, 0x1e, 0x75,\n  0x28, 0xda, 0xaa, 0xf4, 0xc6, 0x48, 0x5a, 0x07, 0x23, 0xa2, 0x94, 0x5e,\n  0x2a, 0xe9, 0xa1, 0xe6, 0x67, 0x44, 0x82, 0x5a, 0x1f, 0x23, 0x52, 0xd4,\n  0x3c, 0x35, 0xd7, 0xbf, 0x88, 0xfc, 0xfc, 0xf9, 0x66, 0x9c, 0xae, 0x1b,\n  0xf1, 0x88, 0x52, 0x67, 0x00, 0xf1, 0xaa, 0x6a, 0x92, 0xab, 0x88, 0xb1,\n  0x99, 0xa4, 0x2f, 0x23, 0x26, 0x44, 0xd0, 0xf8, 0x44, 0x4c, 0x8b, 0x98,\n  0x49, 0x7c, 0x8e, 0x5a, 0xe7, 0x22, 0xb7, 0x54, 0x4c, 0xf4, 0x1e, 0x3f,\n  0x33, 0x6e, 0xda, 0xc5, 0x11, 0xf3, 0x23, 0xa8, 0x9f, 0x0b, 0x76, 0x45,\n  0xd0, 0x7a, 0x12, 0xb1, 0x48, 0xc5, 0x23, 0x56, 0xa8, 0xb8, 0xb9, 0x2e,\n  0x44, 0xc6, 0x44, 0xd0, 0x3c, 0x88, 0x4c, 0x8b, 0x20, 0x3c, 0x1d, 0xb1,\n  0x39, 0x92, 0xe6, 0x65, 0xc4, 0x56, 0x35, 0xef, 0x23, 0xb6, 0x57, 0x90,\n  0x9c, 0x45, 0xec, 0x8c, 0x21, 0x79, 0x8a, 0x68, 0x54, 0x72, 0x1f, 0xb1,\n  0x4f, 0xd5, 0xa3, 0xa5, 0xdf, 0x0e, 0x44, 0xd0, 0xba, 0x11, 0x71, 0x44,\n  0xd5, 0x23, 0xa2, 0x29, 0x9e, 0x7e, 0xef, 0x13, 0x71, 0xb2, 0x5c, 0xd5,\n  0x57, 0x44, 0x5a, 0xbd, 0xcb, 0x85, 0xdd, 0xeb, 0xaf, 0xec, 0xa2, 0xc8,\n  0x40, 0x65, 0x27, 0x19, 0x76, 0xb0, 0x61, 0x17, 0xc6, 0x3a, 0x22, 0x7b,\n  0x29, 0xdc, 0xe4, 0xec, 0xa1, 0xe6, 0x57, 0x64, 0x5f, 0x65, 0x87, 0x44,\n  0x0e, 0x90, 0xf3, 0x2a, 0x7a, 0xa2, 0xaa, 0x67, 0xd1, 0xa0, 0xa2, 0x61,\n  0x6a, 0xbc, 0x22, 0x87, 0xab, 0x78, 0x24, 0xe9, 0xd9, 0xc8, 0x98, 0x48,\n  0xa7, 0x6a, 0x57, 0x64, 0xb6, 0x5a, 0x87, 0x22, 0xd5, 0x3a, 0x12, 0x1c,\n  0x59, 0x46, 0x72, 0x10, 0x1e, 0x43, 0xbf, 0x2b, 0x8c, 0x3f, 0xac, 0xf4,\n  0xb7, 0xab, 0x3e, 0xd2, 0xa5, 0xf4, 0x73, 0xe4, 0x38, 0x23, 0x3e, 0xd1,\n  0x88, 0x4f, 0x51, 0x38, 0x47, 0xd9, 0xc5, 0xa6, 0x9d, 0xd8, 0x76, 0xfe,\n  0x54, 0x38, 0x23, 0x67, 0xa9, 0x78, 0xe4, 0x5c, 0xb5, 0x8e, 0x44, 0x2e,\n  0x50, 0xfa, 0x34, 0x72, 0xb1, 0x92, 0xb3, 0xc8, 0x65, 0x86, 0xbe, 0x9e,\n  0x22, 0xf5, 0x11, 0xe2, 0x2b, 0xbd, 0xed, 0x46, 0xc4, 0xd7, 0x1b, 0x71,\n  0xd2, 0x57, 0x91, 0x5b, 0x22, 0xdf, 0x52, 0xf3, 0x24, 0x92, 0x7e, 0x23,\n  0x15, 0xb9, 0x4b, 0xcd, 0x8f, 0xc8, 0x3d, 0x6a, 0x7e, 0x44, 0xee, 0x8f,\n  0x3c, 0xa8, 0xf4, 0x77, 0x24, 0xe9, 0x9b, 0xc8, 0xa3, 0xc6, 0xf5, 0x53,\n  0xea, 0xfa, 0x48, 0x1f, 0x25, 0x4f, 0x23, 0xfd, 0x46, 0x06, 0x28, 0x3d,\n  0x35, 0x32, 0xc8, 0x7b, 0x3e, 0x98, 0xeb, 0xb8, 0x69, 0x37, 0x8e, 0xec,\n  0x36, 0x92, 0xfa, 0x39, 0xab, 0xd7, 0x48, 0x5a, 0xd7, 0xca, 0xf7, 0x8d,\n  0xa4, 0x7c, 0xf2, 0x9b, 0xf2, 0x49, 0x0e, 0x47, 0x0e, 0x2c, 0xa0, 0xfc,\n  0x47, 0x0e, 0x1d, 0x49, 0x7a, 0x66, 0x64, 0xa4, 0xda, 0xa7, 0xc8, 0xda,\n  0x95, 0x41, 0x7a, 0x60, 0x64, 0xd2, 0x48, 0x92, 0x8f, 0x91, 0xb9, 0x23,\n  0x8b, 0x95, 0xdd, 0xa3, 0xec, 0x17, 0x73, 0x7e, 0x8c, 0x1c, 0x3f, 0x72,\n  0x92, 0xb2, 0x43, 0x46, 0x92, 0x3e, 0x91, 0x78, 0xd6, 0x1b, 0x97, 0x8d,\n  0x9c, 0x31, 0x52, 0xe5, 0x33, 0x6f, 0xa4, 0x7a, 0xee, 0x98, 0xd2, 0xbf,\n  0x23, 0x4f, 0x18, 0xfb, 0x43, 0xf9, 0x23, 0x97, 0x28, 0xf9, 0x18, 0xb9,\n  0xdc, 0x88, 0xaf, 0x32, 0xe2, 0x6b, 0xcf, 0x11, 0xdf, 0x60, 0xc4, 0x37,\n  0x19, 0xf1, 0x7a, 0x23, 0xbe, 0x4d, 0xc6, 0x47, 0x1e, 0x53, 0xfb, 0x30,\n  0x23, 0x4f, 0x18, 0xfb, 0x12, 0xf9, 0x23, 0x77, 0x18, 0xd7, 0x77, 0x9f,\n  0x23, 0xbe, 0xd7, 0x88, 0xbb, 0x8d, 0xf8, 0x67, 0x46, 0xfc, 0xb0, 0xca,\n  0x4f, 0xd9, 0xf9, 0xc8, 0x8f, 0xec, 0xfc, 0xf4, 0x53, 0x0a, 0x07, 0x45,\n  0x4d, 0x33, 0xed, 0xe8, 0x28, 0xa6, 0xe4, 0x37, 0x4a, 0x37, 0xe2, 0x0e,\n  0x23, 0xde, 0xc1, 0x88, 0x77, 0x36, 0xe2, 0xc1, 0xe7, 0x88, 0xf7, 0x34,\n  0xe2, 0x7d, 0x8c, 0x78, 0x7f, 0x23, 0x3e, 0x48, 0xc6, 0xd3, 0x4f, 0xa9,\n  0xf5, 0x27, 0x6a, 0x9a, 0x5a, 0x77, 0x72, 0x97, 0x45, 0x0d, 0x53, 0x76,\n  0x72, 0x94, 0xd2, 0x57, 0x51, 0x6a, 0xde, 0x45, 0x25, 0xa8, 0xf5, 0x38,\n  0x6a, 0x85, 0xc2, 0x57, 0x51, 0xd3, 0x14, 0xce, 0xa8, 0x18, 0x1e, 0x95,\n  0xa2, 0xe4, 0x3b, 0x2a, 0xd3, 0x88, 0xe7, 0x1b, 0xf1, 0xd2, 0x73, 0xc4,\n  0xab, 0x8c, 0xf8, 0x58, 0x23, 0x3e, 0xc1, 0x88, 0x53, 0x7e, 0x51, 0x2b,\n  0x94, 0x3d, 0x8a, 0xfa, 0x6c, 0x35, 0xae, 0xcf, 0x54, 0x72, 0x17, 0x35,\n  0x47, 0xcd, 0xa7, 0x33, 0xe2, 0xf3, 0x8d, 0xf8, 0x22, 0x23, 0xae, 0x70,\n  0xb2, 0x2b, 0x97, 0xd6, 0xa3, 0xa8, 0x15, 0x6a, 0x3f, 0x2a, 0x6a, 0x9d,\n  0x5a, 0x2f, 0xa2, 0xea, 0x94, 0x7d, 0x17, 0xb5, 0xd9, 0xb0, 0xa3, 0xeb,\n  0xa3, 0xb6, 0x2a, 0xfb, 0x2f, 0x6a, 0xbb, 0x8c, 0x47, 0x1d, 0x8a, 0xda,\n  0x49, 0xf7, 0x35, 0x45, 0x35, 0x2a, 0x7d, 0x7d, 0x46, 0x7c, 0x9f, 0x11,\n  0x3f, 0x60, 0xc4, 0x8f, 0x18, 0x71, 0x92, 0xf7, 0x68, 0xa1, 0xf4, 0x7b,\n  0xb4, 0x7f, 0x34, 0xe1, 0xc5, 0xe8, 0xae, 0xc6, 0xbe, 0xa5, 0x81, 0xb7,\n  0x5c, 0x7b, 0xa3, 0xbb, 0xab, 0x78, 0x74, 0x2f, 0x23, 0xde, 0xd7, 0x88,\n  0x0f, 0x90, 0x71, 0x13, 0xdf, 0x24, 0x36, 0x28, 0x9c, 0x1a, 0x3d, 0x5c,\n  0xd9, 0xb9, 0xd5, 0x2e, 0xb5, 0x5f, 0x64, 0xae, 0xdf, 0xe6, 0x3c, 0x34,\n  0xd3, 0x6b, 0xc3, 0x2b, 0x09, 0x4f, 0x44, 0x87, 0x47, 0x13, 0x4e, 0x2c,\n  0xeb, 0x5d, 0x40, 0xf3, 0xa3, 0xb0, 0x77, 0xb4, 0x53, 0xe1, 0xd0, 0xe8,\n  0x34, 0xef, 0xe7, 0xf3, 0x9b, 0xa2, 0x0b, 0xcf, 0x96, 0x4f, 0x74, 0x59,\n  0x34, 0xe9, 0xb3, 0xd2, 0x0e, 0xd1, 0xe3, 0xe4, 0x3e, 0xb0, 0xb9, 0x9e,\n  0x55, 0x8d, 0x55, 0xeb, 0x66, 0xad, 0x2b, 0x7a, 0x4a, 0x26, 0x42, 0x19,\n  0x7b, 0xa3, 0x29, 0x9f, 0xe8, 0x59, 0xca, 0x5e, 0x8b, 0x9e, 0x1b, 0x4d,\n  0x7a, 0x2b, 0x7a, 0x71, 0xf4, 0x32, 0x53, 0x5f, 0xab, 0x75, 0x25, 0x7a,\n  0xa5, 0x5a, 0x3f, 0xa3, 0xd7, 0x78, 0xef, 0x6f, 0x98, 0x76, 0x52, 0xf4,\n  0x96, 0x68, 0xd2, 0x57, 0xd1, 0x0d, 0xe6, 0xbe, 0x85, 0xb2, 0xaf, 0x4c,\n  0x3d, 0x19, 0xbd, 0x2b, 0x7a, 0x0f, 0xf1, 0xfd, 0xd1, 0xa4, 0xb7, 0xa2,\n  0x3d, 0xd1, 0x47, 0xd5, 0xfa, 0x9f, 0x40, 0xf2, 0x19, 0x7d, 0xbc, 0x46,\n  0xf1, 0x53, 0x31, 0x3e, 0xde, 0x76, 0x93, 0x69, 0x47, 0xa6, 0x74, 0x88,\n  0xa1, 0xf2, 0x62, 0x02, 0x62, 0x82, 0x14, 0xfe, 0x2e, 0xdf, 0x4e, 0xeb,\n  0x73, 0x54, 0x4c, 0x37, 0xb3, 0x9f, 0xbd, 0xcb, 0x8b, 0xe9, 0x51, 0x31,\n  0x5d, 0xed, 0x4f, 0xaa, 0x75, 0x36, 0xa6, 0x77, 0xfc, 0x67, 0x0a, 0x4f,\n  0xe5, 0x93, 0xbd, 0x18, 0x33, 0x30, 0x7f, 0xb2, 0xf7, 0x3a, 0xd0, 0x76,\n  0x3d, 0x30, 0x79, 0xcc, 0xd0, 0x98, 0x10, 0xef, 0xeb, 0x45, 0xc1, 0x0a,\n  0x6f, 0x54, 0x4e, 0x8a, 0x21, 0xfd, 0x17, 0x93, 0xa4, 0xd6, 0xc5, 0x98,\n  0xdc, 0x18, 0xd2, 0x7b, 0x63, 0xe6, 0xc6, 0x10, 0xce, 0x8a, 0xa9, 0x2d,\n  0xa2, 0x75, 0x31, 0x66, 0x7c, 0x0c, 0xe9, 0xbd, 0xd8, 0xa8, 0x18, 0xe8,\n  0xbd, 0xb4, 0xf1, 0xb1, 0x29, 0x31, 0x33, 0x88, 0xe7, 0xc7, 0x40, 0xdf,\n  0x15, 0xa7, 0xc5, 0xcc, 0x93, 0xb8, 0xcf, 0xb5, 0x23, 0x66, 0x49, 0xcc,\n  0x72, 0xe2, 0xab, 0x62, 0x80, 0x9f, 0x4a, 0x82, 0x62, 0x36, 0xc4, 0x10,\n  0x7e, 0x8a, 0xa9, 0x8f, 0x21, 0xfc, 0x14, 0xb3, 0x23, 0x66, 0x77, 0xab,\n  0xfd, 0x64, 0x63, 0x3f, 0xd5, 0xdc, 0xef, 0x35, 0xf7, 0x3f, 0xdb, 0xee,\n  0x03, 0xb5, 0xdd, 0x17, 0x29, 0xac, 0x8f, 0xd9, 0xab, 0xe2, 0x31, 0x6e,\n  0x23, 0xfe, 0x99, 0x11, 0x3f, 0xac, 0xe2, 0xe9, 0x7b, 0x8c, 0x7d, 0x98,\n  0xfd, 0x67, 0xbb, 0x5e, 0x95, 0x1f, 0x73, 0x4c, 0x95, 0x1f, 0x73, 0x42,\n  0xe9, 0xc1, 0x58, 0x66, 0xd4, 0x47, 0x57, 0xeb, 0x76, 0x6c, 0x07, 0xb5,\n  0x6e, 0xc7, 0x12, 0x0e, 0x8b, 0x0d, 0x8e, 0xed, 0xe9, 0x8d, 0xf3, 0xda,\n  0xee, 0x1f, 0x56, 0x4d, 0x1e, 0x1d, 0x25, 0xf7, 0x19, 0x8a, 0x57, 0x8e,\n  0x4e, 0x90, 0xfb, 0x70, 0xb1, 0x7d, 0x94, 0x5e, 0x2a, 0x19, 0xa8, 0xf4,\n  0x52, 0x6c, 0x1f, 0xb5, 0xef, 0x55, 0x32, 0x50, 0xed, 0x7b, 0x15, 0x87,\n  0xc7, 0x0e, 0x53, 0xe3, 0x13, 0x1b, 0xa6, 0xfa, 0x35, 0x36, 0x41, 0xf5,\n  0x6b, 0x6c, 0xa6, 0xea, 0xd7, 0xd8, 0x52, 0xd9, 0xaf, 0x6d, 0xcb, 0x89,\n  0x9d, 0x10, 0x4b, 0xe3, 0x1d, 0x3b, 0x2d, 0x76, 0xe6, 0xd9, 0xf6, 0xe5,\n  0xda, 0xf6, 0x6b, 0xdb, 0x7d, 0xdb, 0xb6, 0xfb, 0xa0, 0x6d, 0xf7, 0x51,\n  0xdb, 0x8e, 0x43, 0xdb, 0x7d, 0xca, 0xb6, 0xe3, 0xd2, 0x76, 0xff, 0xae,\n  0xed, 0xfe, 0x1b, 0xe2, 0xfb, 0x54, 0x3c, 0xf6, 0x00, 0xed, 0xc7, 0x9d,\n  0x31, 0x8e, 0xad, 0xf7, 0xc3, 0xe2, 0x44, 0x1c, 0xe9, 0xab, 0x38, 0x7f,\n  0xe7, 0x72, 0x25, 0x87, 0xad, 0xf7, 0x59, 0xe3, 0x0c, 0xfb, 0x3e, 0xae,\n  0x57, 0x5c, 0x5f, 0xe2, 0x03, 0x94, 0xfd, 0x5d, 0x76, 0x22, 0x8e, 0x70,\n  0x53, 0x5c, 0xb8, 0xda, 0x0f, 0x8a, 0x8b, 0x51, 0xf3, 0xa2, 0x2a, 0x3f,\n  0xce, 0xa9, 0xda, 0x1f, 0x97, 0x26, 0xdb, 0x9f, 0xb6, 0xca, 0x78, 0xaf,\n  0xb4, 0x41, 0xad, 0x67, 0x15, 0xc3, 0xe3, 0xb2, 0x55, 0xfd, 0xe3, 0x0a,\n  0x55, 0x7b, 0xce, 0x88, 0x97, 0x19, 0x71, 0x97, 0x11, 0x1f, 0x67, 0xc4,\n  0x27, 0xca, 0xb8, 0x6b, 0x6f, 0x5e, 0x80, 0xa1, 0x4f, 0x09, 0x0f, 0xc5,\n  0x4d, 0x8f, 0x9b, 0xe5, 0x6d, 0x07, 0xc7, 0xcd, 0x8d, 0x23, 0x3d, 0x14,\n  0xb7, 0x38, 0x4e, 0xed, 0xcb, 0xf8, 0xc7, 0xad, 0xf4, 0xde, 0x87, 0x30,\n  0xf7, 0x01, 0xf2, 0xfb, 0x54, 0x5b, 0x25, 0xde, 0x36, 0xf7, 0x61, 0xcd,\n  0x7d, 0x01, 0xb9, 0x2f, 0x49, 0x72, 0xb2, 0x57, 0xb5, 0xc7, 0xb5, 0xd0,\n  0xb5, 0x49, 0xd9, 0x93, 0x09, 0x24, 0x3f, 0x72, 0x7f, 0x4c, 0xbd, 0xdf,\n  0x50, 0xeb, 0x88, 0xb9, 0xcf, 0x65, 0xee, 0x5f, 0xc4, 0x6d, 0x89, 0x7b,\n  0x4b, 0xb6, 0x33, 0xae, 0xa1, 0x32, 0x57, 0xd9, 0xdf, 0x35, 0xfd, 0xa9,\n  0x3e, 0xbb, 0x5c, 0x4b, 0xbc, 0xe5, 0xd9, 0x7c, 0x0f, 0x66, 0xbe, 0x3f,\n  0x6a, 0x79, 0xbf, 0x65, 0xac, 0x13, 0x72, 0xdf, 0x20, 0x3e, 0x4e, 0xea,\n  0x65, 0x75, 0xff, 0x69, 0xae, 0xf4, 0x5e, 0xbe, 0x9e, 0xef, 0x50, 0xf6,\n  0x6e, 0xdc, 0x7e, 0x95, 0x6f, 0xf1, 0x80, 0x62, 0xe7, 0xe9, 0xeb, 0x12,\n  0xdf, 0xc6, 0x1d, 0x94, 0x5c, 0xed, 0x3f, 0x99, 0x78, 0xa9, 0xd6, 0x59,\n  0xb5, 0x53, 0xd5, 0xab, 0x76, 0x5c, 0xdc, 0xf1, 0xd3, 0x7a, 0xd4, 0x7c,\n  0x3f, 0x96, 0x79, 0x28, 0xee, 0x54, 0x3c, 0x34, 0x69, 0xbc, 0x9f, 0xb2,\n  0x2f, 0xca, 0x1d, 0x8a, 0xc7, 0x07, 0x94, 0x24, 0xc5, 0x07, 0x55, 0x6d,\n  0x2d, 0xed, 0x19, 0xdf, 0x4d, 0xe9, 0x69, 0xc5, 0x4d, 0xbb, 0xdd, 0xdc,\n  0x07, 0x73, 0x6d, 0x4b, 0xa1, 0xfd, 0xb6, 0xf8, 0x1e, 0xf1, 0x84, 0x07,\n  0xe3, 0xfb, 0xc5, 0x0f, 0x54, 0xe5, 0x29, 0xbd, 0x1f, 0x3f, 0x34, 0x9e,\n  0xf4, 0x62, 0x7c, 0x64, 0x7c, 0xba, 0x6c, 0x5f, 0x7c, 0x52, 0x3c, 0xe9,\n  0x41, 0xc9, 0xe9, 0x7d, 0x9b, 0xb1, 0x6f, 0x6d, 0xf2, 0x32, 0x9f, 0xf8,\n  0xdc, 0xf8, 0xe2, 0xd3, 0x78, 0xd9, 0xc4, 0xf5, 0x15, 0xce, 0xf8, 0x0a,\n  0xb5, 0x2f, 0xa6, 0xf6, 0x2f, 0xe2, 0x6b, 0x9d, 0x3e, 0x2e, 0xb7, 0xe4,\n  0xf1, 0x64, 0xa7, 0xc6, 0x4f, 0x52, 0xfb, 0x11, 0x67, 0xf0, 0xa9, 0xf1,\n  0x84, 0x17, 0xe3, 0x67, 0x28, 0xde, 0xb2, 0x4f, 0x61, 0x70, 0x73, 0xfc,\n  0x8b, 0x4e, 0xc6, 0x2f, 0x6c, 0xcd, 0x6b, 0xc7, 0x79, 0xc7, 0xe3, 0x97,\n  0xc4, 0x2f, 0x8f, 0x5f, 0x15, 0xbf, 0x36, 0x7e, 0x43, 0xfc, 0xa6, 0xfc,\n  0x30, 0x39, 0x9f, 0x54, 0x7d, 0xcd, 0x7a, 0xe6, 0xef, 0x54, 0x76, 0x8c,\n  0xec, 0x3f, 0xaa, 0xd7, 0xb6, 0xe2, 0x8d, 0x92, 0x97, 0xc5, 0xc5, 0xef,\n  0x90, 0xbc, 0x7c, 0x6c, 0xfc, 0x6e, 0x6f, 0x39, 0x8b, 0x77, 0xab, 0x75,\n  0xa6, 0xed, 0x3a, 0x92, 0xbb, 0x2c, 0x21, 0x33, 0x01, 0x9a, 0x2a, 0x21,\n  0x25, 0x21, 0x33, 0xfe, 0x04, 0x71, 0xda, 0x7d, 0x48, 0xd0, 0xd5, 0x73,\n  0x15, 0xc3, 0x13, 0x1c, 0xf4, 0x9e, 0xd5, 0xd8, 0x57, 0x32, 0xc7, 0x37,\n  0xf3, 0x50, 0x42, 0x07, 0x6f, 0x3b, 0xd4, 0x94, 0xc3, 0x84, 0x9e, 0x09,\n  0x7d, 0x12, 0xfa, 0x9f, 0x96, 0x67, 0x73, 0xfc, 0x13, 0xa2, 0x4e, 0x97,\n  0x43, 0xf1, 0xfc, 0x04, 0x5a, 0xef, 0x13, 0x4a, 0x13, 0x68, 0xff, 0x2b,\n  0x61, 0xac, 0x11, 0x9f, 0x9c, 0x30, 0x8d, 0xf8, 0xcc, 0x04, 0xc2, 0x5f,\n  0x09, 0xf3, 0x13, 0x08, 0x77, 0x25, 0x2c, 0x4d, 0x58, 0x41, 0x7c, 0x75,\n  0x02, 0xe9, 0xb1, 0x84, 0xba, 0x04, 0xda, 0x77, 0x2c, 0x8b, 0x4b, 0xd8,\n  0xea, 0x8d, 0xdb, 0x0b, 0xa7, 0x26, 0x6c, 0xf7, 0xe6, 0x09, 0x3b, 0x13,\n  0x1a, 0x13, 0xf6, 0xa5, 0x34, 0x26, 0x87, 0x24, 0x10, 0x9e, 0xaa, 0xd9,\n  0x57, 0xbe, 0xa2, 0x1c, 0xf3, 0x32, 0xe1, 0x50, 0xaa, 0x33, 0x11, 0x08,\n  0x2a, 0xe1, 0x48, 0xc2, 0xc9, 0x54, 0xcc, 0xe0, 0x84, 0xa6, 0x04, 0xc2,\n  0x57, 0x89, 0x22, 0x91, 0xf4, 0x55, 0xa2, 0x7f, 0x62, 0x60, 0x62, 0x57,\n  0xf0, 0xee, 0x89, 0xbd, 0x12, 0x49, 0x33, 0x25, 0x1a, 0xe7, 0xa4, 0x24,\n  0x2a, 0xfc, 0x34, 0x3c, 0x95, 0xe4, 0x31, 0x31, 0x3c, 0xa5, 0x29, 0x31,\n  0x26, 0xd1, 0x99, 0x98, 0x86, 0xfc, 0x60, 0xd1, 0x25, 0x16, 0x26, 0x96,\n  0x25, 0x42, 0xce, 0x12, 0xc7, 0x25, 0x4e, 0x4c, 0x9c, 0x72, 0x1a, 0x2f,\n  0x98, 0xfb, 0x63, 0x66, 0x3c, 0x71, 0x7a, 0xe2, 0x2c, 0x23, 0xbf, 0xb9,\n  0xde, 0xfb, 0x3d, 0x52, 0xde, 0x12, 0x61, 0x99, 0x25, 0x2e, 0x4b, 0x5c,\n  0xe9, 0xbd, 0x7f, 0x6b, 0xee, 0x4b, 0x24, 0xae, 0x57, 0xfb, 0xb8, 0xc5,\n  0x2b, 0xf3, 0xa9, 0x5f, 0x12, 0xb7, 0x38, 0x3f, 0x33, 0xf6, 0xbb, 0xde,\n  0x52, 0x78, 0x23, 0x71, 0x97, 0xda, 0xcf, 0xa8, 0xa4, 0xf1, 0x4d, 0xdc,\n  0x93, 0xb8, 0x5f, 0xe9, 0x95, 0x44, 0x8f, 0x77, 0x7e, 0x66, 0x7d, 0xcc,\n  0x7d, 0x30, 0x13, 0x9f, 0x98, 0xfb, 0x66, 0xe6, 0x7e, 0x9b, 0xf9, 0xfe,\n  0xd4, 0x7c, 0x9f, 0x68, 0xea, 0xb7, 0x82, 0xc0, 0x8a, 0x5e, 0xde, 0xfb,\n  0xc6, 0x66, 0xbe, 0x65, 0x86, 0x7d, 0x67, 0xde, 0xd7, 0x12, 0x37, 0xde,\n  0xcf, 0x9b, 0xef, 0xb5, 0xcd, 0xf7, 0xef, 0xe6, 0x7b, 0xeb, 0xaa, 0xfe,\n  0x4e, 0x92, 0xfb, 0x82, 0x65, 0xce, 0x20, 0xef, 0x79, 0x58, 0xbe, 0x55,\n  0xc9, 0x9d, 0xb3, 0xd8, 0x59, 0xa1, 0xd6, 0x85, 0xca, 0x1e, 0xde, 0xdc,\n  0xb9, 0x44, 0xad, 0x2b, 0xe5, 0x63, 0x95, 0x7d, 0xe9, 0x1c, 0xe8, 0x1c,\n  0x4a, 0x3c, 0xc4, 0x49, 0xb8, 0xc8, 0x19, 0xe7, 0x24, 0xdc, 0x5a, 0x95,\n  0xe9, 0x4c, 0x57, 0x7a, 0xd5, 0x99, 0xeb, 0xbd, 0x0f, 0x5e, 0x3b, 0xc4,\n  0x39, 0xdb, 0x3b, 0x7f, 0x39, 0xbf, 0x9c, 0xb5, 0xce, 0xf1, 0xc4, 0x27,\n  0x9d, 0x9e, 0x6f, 0xe6, 0xfb, 0x2a, 0xe7, 0x0c, 0xb5, 0x0f, 0xe2, 0x9c,\n  0xa7, 0x9e, 0xc3, 0xf3, 0xf3, 0x28, 0x7e, 0x62, 0x14, 0x8d, 0xa2, 0xd9,\n  0x0e, 0x93, 0x9b, 0xf5, 0x33, 0xeb, 0x2b, 0xcb, 0x75, 0x42, 0x8f, 0x3b,\n  0xd7, 0x3a, 0x37, 0x38, 0xa1, 0xf9, 0x9d, 0xf5, 0xce, 0x6d, 0xce, 0x1d,\n  0xea, 0x3d, 0xbe, 0x1c, 0x0f, 0xe7, 0x6e, 0xe7, 0x5e, 0xa5, 0x4f, 0xd5,\n  0x7b, 0x7b, 0x13, 0xd7, 0x39, 0xdd, 0x6a, 0x9c, 0x9d, 0x87, 0x9d, 0xc7,\n  0xbc, 0xcb, 0x1b, 0xa5, 0x8f, 0x9a, 0x36, 0x0a, 0x9a, 0x7a, 0x54, 0x87,\n  0x51, 0x84, 0x6b, 0x52, 0xfb, 0x8e, 0x0a, 0x1e, 0xd5, 0xf3, 0x34, 0x1f,\n  0xd5, 0x67, 0x54, 0xff, 0xa4, 0xb4, 0x51, 0x83, 0x46, 0xad, 0x1e, 0x35,\n  0x2c, 0x09, 0x2b, 0xea, 0xa8, 0xb0, 0x51, 0x51, 0xa3, 0x30, 0x0f, 0x47,\n  0xa5, 0x8c, 0xca, 0x1c, 0x05, 0x4d, 0x3a, 0xaa, 0xd4, 0xd5, 0x7b, 0x54,\n  0xd5, 0xa8, 0xb1, 0xa3, 0x26, 0x8c, 0x9a, 0x3c, 0x0a, 0x33, 0x6f, 0xd4,\n  0xcc, 0x51, 0x73, 0x46, 0x41, 0x23, 0x8f, 0x5a, 0x34, 0x6a, 0xe9, 0x28,\n  0xcc, 0x38, 0x3c, 0xb7, 0x6e, 0x54, 0xdd, 0xa8, 0xcd, 0xa3, 0xb6, 0x8e,\n  0xda, 0x3e, 0x0a, 0x33, 0x7f, 0xd4, 0xbe, 0x51, 0x07, 0x46, 0x35, 0x1a,\n  0xfc, 0x10, 0xf8, 0x91, 0x51, 0x4d, 0xa3, 0x4e, 0x26, 0x89, 0x24, 0x6b,\n  0x12, 0xe1, 0xea, 0xd4, 0x29, 0x49, 0x81, 0x49, 0x98, 0x37, 0x49, 0xdd,\n  0x93, 0x7a, 0x25, 0x61, 0xde, 0x24, 0x0d, 0x48, 0x1a, 0x92, 0x34, 0x3c,\n  0x29, 0x3c, 0x29, 0x26, 0xc9, 0x99, 0x04, 0x09, 0x4b, 0xca, 0x4e, 0x2a,\n  0x4c, 0x2a, 0x03, 0x6e, 0x9e, 0x90, 0x34, 0x2e, 0xc9, 0xa5, 0x78, 0x32,\n  0x46, 0x22, 0x75, 0x6e, 0x2a, 0xe9, 0xd9, 0xa4, 0x89, 0x49, 0xb4, 0xaf,\n  0x91, 0x34, 0x3d, 0x69, 0x56, 0x12, 0x66, 0x46, 0xd2, 0x82, 0xa4, 0xc5,\n  0x49, 0xcb, 0x92, 0x56, 0x26, 0xcf, 0x4e, 0x99, 0x9c, 0xb4, 0x86, 0xee,\n  0xa7, 0xfd, 0x88, 0xd4, 0x35, 0x49, 0x34, 0x0f, 0x92, 0xb6, 0x24, 0x91,\n  0xdc, 0xa7, 0x6c, 0xae, 0x0c, 0x49, 0x81, 0x26, 0x48, 0x6a, 0x48, 0x22,\n  0xf9, 0x4f, 0xda, 0x93, 0xd2, 0x94, 0x04, 0xc9, 0x4f, 0x3a, 0x98, 0xe4,\n  0x49, 0xc5, 0x3c, 0x4f, 0xed, 0xa5, 0xf6, 0x59, 0x93, 0x67, 0xa7, 0x4e,\n  0x4f, 0x3a, 0x9a, 0x74, 0x3c, 0xe9, 0x54, 0x32, 0xc9, 0x77, 0x72, 0x50,\n  0x32, 0xad, 0x1b, 0xc9, 0x01, 0xc9, 0x24, 0x77, 0xa9, 0x69, 0xc9, 0xdd,\n  0x92, 0x31, 0x52, 0xc9, 0xbd, 0x93, 0xfb, 0x25, 0x0f, 0x4c, 0x1e, 0x9a,\n  0xea, 0x32, 0x9e, 0x0b, 0x49, 0x1d, 0x97, 0x0c, 0x89, 0x4a, 0x8e, 0x4b,\n  0xed, 0x2e, 0xeb, 0x9b, 0x9c, 0x9b, 0x5c, 0x9c, 0x9c, 0xae, 0x38, 0x3d,\n  0x5f, 0x91, 0x5c, 0x9b, 0x8c, 0x95, 0x21, 0x79, 0x52, 0xf2, 0xd4, 0xe4,\n  0x19, 0xb2, 0x9c, 0x64, 0x92, 0x8b, 0xd4, 0xe1, 0xc9, 0x24, 0x07, 0xc9,\n  0x4b, 0x92, 0x97, 0x27, 0x63, 0xdc, 0x93, 0xd7, 0x16, 0xcd, 0x29, 0x42,\n  0xff, 0x26, 0x6f, 0xa8, 0x3e, 0x9a, 0x8c, 0xf1, 0x4f, 0xae, 0xaf, 0x6e,\n  0xa8, 0x46, 0x8d, 0x93, 0xb7, 0x25, 0xef, 0x48, 0x86, 0xc6, 0x4e, 0xde,\n  0x9b, 0xec, 0x4e, 0xc6, 0x48, 0x27, 0x1f, 0x4e, 0x3e, 0x96, 0x0c, 0x7d,\n  0x9c, 0xc2, 0xf2, 0x48, 0x8f, 0xa7, 0xe8, 0x29, 0x0e, 0x65, 0x6f, 0xa4,\n  0x74, 0x4e, 0x81, 0xc6, 0x4d, 0xe9, 0x99, 0x42, 0xfb, 0x8f, 0x29, 0xfd,\n  0x53, 0x68, 0xff, 0x2f, 0x65, 0x58, 0x4a, 0x98, 0x29, 0x5f, 0x72, 0x9d,\n  0x48, 0x89, 0xaa, 0x0d, 0x97, 0xaa, 0x3c, 0x25, 0x25, 0x25, 0xd3, 0x7b,\n  0xdd, 0x34, 0xd7, 0x51, 0x73, 0xdf, 0xbe, 0xe5, 0xbb, 0x02, 0xe3, 0x3b,\n  0x17, 0x73, 0xdf, 0xa5, 0xed, 0x77, 0x2d, 0x29, 0xa5, 0xea, 0x7d, 0x74,\n  0x4a, 0x55, 0xca, 0x58, 0xef, 0xe7, 0x4d, 0xdc, 0x60, 0x8e, 0x5f, 0xca,\n  0x84, 0x94, 0xc9, 0x29, 0x90, 0xa3, 0x94, 0x99, 0x29, 0x73, 0x94, 0x3c,\n  0xa4, 0xd0, 0xfa, 0x9e, 0xb2, 0x28, 0x85, 0xf4, 0x44, 0xca, 0x8a, 0x94,\n  0xd5, 0x29, 0xeb, 0x64, 0x3f, 0xd7, 0x4e, 0x49, 0xa9, 0x3b, 0x3d, 0x6e,\n  0x29, 0xdb, 0x53, 0xc7, 0xa5, 0xec, 0x4c, 0x69, 0xac, 0x9d, 0xa8, 0xf4,\n  0x73, 0xca, 0xbe, 0x14, 0xd2, 0xd7, 0x29, 0x87, 0x52, 0x8e, 0x78, 0xf3,\n  0xd4, 0xb4, 0xf2, 0x15, 0x8a, 0xa7, 0xd0, 0xff, 0xc3, 0x49, 0x39, 0x99,\n  0x4a, 0xef, 0x37, 0x52, 0xad, 0xa9, 0x4a, 0xfe, 0xba, 0xa6, 0x76, 0xa7,\n  0xf1, 0x06, 0xa7, 0xb8, 0x31, 0xee, 0x2d, 0xbc, 0x6f, 0xea, 0x80, 0xd4,\n  0x21, 0xb2, 0x5e, 0xa9, 0xd3, 0xd5, 0xf8, 0xa4, 0xd2, 0xbe, 0x5c, 0x6a,\n  0x4c, 0xaa, 0x53, 0xe5, 0x9b, 0x4a, 0xfb, 0x72, 0xa9, 0x85, 0xa9, 0xb4,\n  0x1f, 0x67, 0x8e, 0xbf, 0x79, 0x7f, 0xcd, 0xea, 0xd4, 0x59, 0xde, 0xed,\n  0x4d, 0x5d, 0x9c, 0xba, 0x4c, 0xae, 0x1f, 0xa9, 0x6b, 0x52, 0xb7, 0xa4,\n  0x42, 0x32, 0x53, 0x37, 0xa6, 0x92, 0x7e, 0x4f, 0x7d, 0x2b, 0x95, 0xf6,\n  0xc7, 0x52, 0x77, 0xa5, 0xee, 0x31, 0x9e, 0xdb, 0x9f, 0x7a, 0x50, 0xbe,\n  0x9f, 0x4a, 0x3d, 0x2a, 0xdf, 0x4f, 0x99, 0xfd, 0x9d, 0x7a, 0x5c, 0xbd,\n  0xaf, 0x4a, 0x3d, 0xa5, 0xe2, 0x69, 0x3e, 0x2a, 0x9e, 0x16, 0x60, 0xc4,\n  0x7b, 0xa8, 0xef, 0x2a, 0xd2, 0xfa, 0x99, 0xdf, 0x55, 0xa4, 0x85, 0x78,\n  0x7f, 0x57, 0x91, 0x16, 0xa9, 0xbe, 0xaf, 0x4a, 0x8b, 0x33, 0xe2, 0x49,\n  0x46, 0x3c, 0xdd, 0x88, 0xe7, 0x1a, 0xf1, 0x62, 0x23, 0x5e, 0x61, 0xc4,\n  0x27, 0xa9, 0x38, 0xec, 0x85, 0xa9, 0x86, 0xbd, 0x30, 0xc3, 0xb0, 0x1f,\n  0x66, 0x1b, 0xf1, 0x79, 0x32, 0x3e, 0x7a, 0xa6, 0x81, 0xaf, 0x17, 0x2a,\n  0x7c, 0x9d, 0xb6, 0xc4, 0x88, 0x2f, 0x37, 0xe2, 0xab, 0x94, 0xbd, 0x91,\n  0xb6, 0x41, 0xd9, 0x1b, 0x69, 0xf5, 0x69, 0xdb, 0xa4, 0x5d, 0x5f, 0xb5,\n  0x3d, 0x6d, 0xb7, 0x94, 0x9f, 0xfc, 0x99, 0x69, 0x7b, 0x95, 0xbd, 0x93,\n  0xf6, 0x99, 0xfa, 0xce, 0x22, 0xed, 0xb0, 0xc2, 0xff, 0x69, 0xc7, 0x24,\n  0xfe, 0x4f, 0x3b, 0xa1, 0xde, 0xab, 0x8d, 0x66, 0x6a, 0x7f, 0x78, 0xcc,\n  0xdc, 0xd1, 0xba, 0xba, 0x3e, 0xda, 0x21, 0xe3, 0xa3, 0x3b, 0x18, 0xd7,\n  0x3b, 0xab, 0xeb, 0xa3, 0x83, 0x8d, 0x78, 0x1f, 0x23, 0xde, 0x5f, 0xed,\n  0x1f, 0x8d, 0x1e, 0x64, 0x7e, 0x67, 0x31, 0xda, 0xd8, 0x5f, 0x1a, 0x4d,\n  0xf3, 0xa1, 0xad, 0x1d, 0x37, 0x3a, 0x45, 0xbd, 0x3f, 0x1e, 0x9d, 0xa9,\n  0xe4, 0x79, 0x74, 0xbe, 0x11, 0x37, 0xe4, 0x3b, 0xfd, 0x94, 0xc2, 0xeb,\n  0xa3, 0xc7, 0xaa, 0xef, 0x26, 0xd2, 0x4f, 0x8d, 0xae, 0x52, 0xf1, 0xd1,\n  0x13, 0x64, 0x7c, 0xf4, 0x64, 0xe3, 0xfa, 0x34, 0x75, 0x1d, 0xfd, 0xa3,\n  0xe2, 0x73, 0x54, 0xbc, 0xa2, 0xfb, 0xe8, 0xf9, 0xea, 0x7d, 0xcd, 0xe8,\n  0x45, 0x12, 0x6f, 0x8e, 0x5e, 0xaa, 0xde, 0x1f, 0x8e, 0x5e, 0xa1, 0xbe,\n  0xf7, 0x2a, 0x1c, 0x38, 0x7a, 0xb5, 0xb2, 0xef, 0x46, 0xaf, 0x93, 0xf3,\n  0x74, 0x74, 0x9d, 0x7a, 0x6f, 0x3d, 0xda, 0xd8, 0x2f, 0x1a, 0xbd, 0xd5,\n  0x88, 0x6f, 0x37, 0xe2, 0x3b, 0x8d, 0x78, 0xa3, 0xf9, 0xbd, 0xc5, 0xe8,\n  0x7d, 0xca, 0x5e, 0x19, 0x7d, 0x40, 0xd9, 0x2f, 0xa3, 0x0f, 0x19, 0xf1,\n  0x23, 0x46, 0xbc, 0xc9, 0x88, 0x9f, 0x54, 0xf1, 0x74, 0xa1, 0xe2, 0xe9,\n  0x56, 0xf5, 0x1d, 0x51, 0xba, 0xbf, 0x7c, 0x63, 0x53, 0x74, 0x32, 0x3d,\n  0x50, 0xcd, 0xff, 0xf4, 0xae, 0x46, 0xbc, 0xbb, 0x8c, 0xd7, 0x0c, 0x4b,\n  0xef, 0x65, 0xd8, 0x7b, 0x13, 0xa5, 0xdd, 0x90, 0xde, 0x57, 0xd9, 0x11,\n  0xe9, 0x43, 0x94, 0x1d, 0x91, 0xde, 0x37, 0x7d, 0x80, 0x8a, 0xa7, 0x0f,\n  0xa7, 0x78, 0xb8, 0x71, 0x3d, 0x46, 0x5d, 0x2f, 0x1c, 0x9a, 0xee, 0x32,\n  0xbe, 0xb7, 0x98, 0x28, 0xdf, 0xbb, 0xa5, 0x97, 0xa9, 0xf7, 0xbd, 0xe9,\n  0xe3, 0xce, 0xfe, 0x3d, 0x06, 0xe2, 0xd9, 0x46, 0xbc, 0x50, 0xdd, 0xaf,\n  0x9e, 0x4f, 0x1f, 0xa7, 0x9e, 0x2f, 0x1c, 0x9f, 0x3e, 0x45, 0x7d, 0x9f,\n  0x91, 0x3e, 0x5d, 0xee, 0x53, 0xa5, 0xcf, 0x52, 0x76, 0x54, 0xfa, 0x5c,\n  0xb5, 0x6f, 0x95, 0xbe, 0xc0, 0x88, 0x2f, 0x36, 0xe2, 0xcb, 0x8c, 0xf8,\n  0x4a, 0x23, 0xbe, 0x5e, 0xd9, 0x51, 0xe9, 0x1b, 0xcd, 0xfd, 0xb8, 0xd6,\n  0xdf, 0x73, 0xa4, 0x37, 0x18, 0xd7, 0x77, 0xb5, 0x5c, 0x6f, 0xb3, 0xcf,\n  0x90, 0x7e, 0xd0, 0x88, 0x7b, 0x64, 0xbc, 0xd6, 0x99, 0x7e, 0x54, 0x7e,\n  0x3f, 0x58, 0xdc, 0x35, 0xfd, 0xb8, 0xfc, 0xee, 0x2e, 0xfd, 0x54, 0x86,\n  0x8f, 0x8c, 0x67, 0xf8, 0xa9, 0xef, 0xf0, 0x80, 0x6b, 0x02, 0x14, 0xae,\n  0xc9, 0x08, 0x92, 0xb8, 0x26, 0xa3, 0x9b, 0xf1, 0x9d, 0x61, 0x3f, 0x85,\n  0x73, 0x32, 0x42, 0x32, 0x06, 0xca, 0xf7, 0xc0, 0x05, 0x7d, 0x33, 0x86,\n  0xd2, 0x77, 0x7a, 0x21, 0x19, 0x91, 0x46, 0x3c, 0x49, 0xc6, 0x5d, 0x7b,\n  0x33, 0x72, 0x95, 0x9d, 0x96, 0x51, 0x2c, 0xed, 0xb4, 0x33, 0xbe, 0xfb,\n  0x18, 0xaf, 0xec, 0xe1, 0x8c, 0x49, 0x0a, 0x1f, 0x98, 0xdf, 0x4b, 0x98,\n  0x78, 0xc1, 0x7c, 0xcf, 0x92, 0x31, 0x2f, 0x63, 0xa1, 0x6c, 0x3f, 0xea,\n  0xb1, 0x84, 0xca, 0x5d, 0x95, 0xb1, 0x56, 0xd9, 0x7d, 0x19, 0xb4, 0xef,\n  0x5c, 0x54, 0x95, 0xa1, 0xec, 0x87, 0xad, 0xd9, 0xe9, 0x97, 0xc8, 0x73,\n  0xbd, 0xb9, 0x69, 0xf7, 0x9a, 0x3c, 0x63, 0x5b, 0xee, 0xc6, 0xec, 0x5a,\n  0xf4, 0xc3, 0x80, 0x8c, 0x1d, 0x19, 0xbb, 0xe5, 0x3e, 0x5e, 0xa1, 0x8f,\n  0x9c, 0x5f, 0xf9, 0x4d, 0x19, 0xee, 0x0c, 0xac, 0x6b, 0x19, 0x87, 0x33,\n  0x8e, 0xe5, 0x0e, 0x38, 0xcd, 0xd1, 0xae, 0x13, 0x0a, 0xef, 0x5c, 0x1c,\n  0xcf, 0x64, 0x99, 0x7a, 0xa6, 0xc3, 0x8b, 0x77, 0xc8, 0xec, 0x9c, 0x89,\n  0xf5, 0x30, 0xb3, 0x67, 0x66, 0x9f, 0x4c, 0xd8, 0x1d, 0x99, 0x83, 0x32,\n  0x87, 0x65, 0x86, 0x9d, 0xe6, 0xa5, 0xc1, 0xd9, 0xf5, 0xca, 0x9e, 0xbc,\n  0x68, 0xbe, 0xcd, 0x9b, 0x67, 0x46, 0x65, 0x1d, 0xcc, 0x4c, 0xc8, 0x4c,\n  0xc9, 0xcc, 0xcc, 0xcc, 0xcf, 0x2c, 0xcd, 0xac, 0xca, 0x1c, 0x9b, 0x39,\n  0x21, 0x73, 0x72, 0xe6, 0xb4, 0xcc, 0x99, 0x99, 0x73, 0x32, 0xe7, 0x67,\n  0x2e, 0xca, 0x5c, 0x9a, 0x75, 0x3c, 0x73, 0x45, 0xe6, 0xea, 0xcc, 0x75,\n  0x99, 0x75, 0x99, 0x9b, 0x33, 0xb7, 0x66, 0x6e, 0xcf, 0xdc, 0x99, 0xd9,\n  0x98, 0x95, 0x96, 0x75, 0x34, 0x73, 0x5f, 0x4e, 0x7e, 0x4e, 0x69, 0xc5,\n  0xe2, 0xcc, 0x03, 0x6a, 0xdd, 0xbd, 0x58, 0x9e, 0xbb, 0xc0, 0x9b, 0x67,\n  0x1e, 0x2a, 0x2c, 0xce, 0xa3, 0xef, 0xea, 0x32, 0x8f, 0x64, 0x61, 0x25,\n  0xc9, 0x6c, 0xca, 0x3c, 0x49, 0xdf, 0xaf, 0x8a, 0x2c, 0x6b, 0x16, 0x56,\n  0xbc, 0xac, 0xc0, 0xdc, 0xe1, 0x59, 0x5d, 0x4f, 0xf3, 0xda, 0xbe, 0x59,\n  0xdd, 0xb3, 0x8e, 0xcb, 0xf7, 0x25, 0x59, 0x7d, 0x49, 0xef, 0x4d, 0xc9,\n  0x3d, 0xae, 0xbe, 0x23, 0xbc, 0x38, 0x9e, 0x35, 0x20, 0x6b, 0x48, 0xf6,\n  0xb1, 0xac, 0xe1, 0x59, 0xe1, 0xb9, 0xce, 0xac, 0x35, 0xb9, 0xd9, 0x59,\n  0x31, 0xb9, 0x7d, 0xb3, 0x9c, 0x68, 0x4f, 0x76, 0x4d, 0x54, 0x56, 0x61,\n  0x4e, 0x9f, 0xac, 0xb2, 0x2c, 0x57, 0xd6, 0xb8, 0xac, 0x89, 0x59, 0x53,\n  0xb2, 0xa6, 0x67, 0xcd, 0xca, 0x9a, 0x9b, 0xbf, 0x33, 0x6b, 0x81, 0xb2,\n  0x4f, 0x2e, 0x96, 0xe7, 0xf9, 0x78, 0xf3, 0xac, 0xc5, 0xb9, 0x1b, 0xb3,\n  0xa4, 0x3d, 0xb0, 0xb2, 0x30, 0x28, 0x0b, 0xfa, 0x37, 0x6b, 0x7d, 0xd6,\n  0xc6, 0x2c, 0xac, 0xa0, 0x45, 0xeb, 0xb2, 0xde, 0xca, 0x6a, 0x90, 0xf3,\n  0x28, 0xa7, 0x4a, 0xd9, 0xe3, 0x17, 0xcd, 0xc7, 0x7a, 0xf3, 0xac, 0x5d,\n  0x59, 0xb4, 0xfe, 0x66, 0xed, 0xcf, 0xa2, 0xfd, 0xdd, 0x2c, 0x4f, 0x0d,\n  0x7d, 0x8f, 0x94, 0x75, 0x34, 0x8b, 0xec, 0x9c, 0xac, 0x53, 0xd9, 0x54,\n  0x8f, 0x6c, 0xbf, 0x6c, 0xb2, 0x53, 0xb2, 0x83, 0xb2, 0x69, 0xdf, 0x21,\n  0xbb, 0x47, 0x76, 0x6f, 0xe3, 0xfb, 0x9d, 0x7d, 0xde, 0x3c, 0xbb, 0x5f,\n  0xf6, 0x40, 0x6f, 0x5e, 0x1a, 0x9c, 0x1b, 0xe8, 0xcd, 0x2b, 0x16, 0x67,\n  0x0f, 0xf5, 0xe6, 0xc5, 0x53, 0xb2, 0x43, 0x54, 0xff, 0x2a, 0x9e, 0xbf,\n  0x33, 0x3b, 0x49, 0xb5, 0x5f, 0xf1, 0x0a, 0x67, 0x5e, 0x2b, 0x9e, 0x73,\n  0x40, 0xcd, 0xb3, 0x4b, 0xe0, 0xb9, 0xde, 0x3c, 0xbb, 0x38, 0xbb, 0x42,\n  0xce, 0xc3, 0x16, 0xbe, 0x36, 0x7b, 0x83, 0x9c, 0x8f, 0xd9, 0xe3, 0xb3,\n  0x27, 0x49, 0x5c, 0x91, 0x3d, 0x23, 0x7b, 0x76, 0xb6, 0x7c, 0x53, 0xbe,\n  0x30, 0x7b, 0x89, 0x7c, 0x73, 0x4e, 0xd7, 0x57, 0x19, 0x7c, 0xd3, 0x4f,\n  0x9f, 0x2f, 0xd9, 0x3b, 0xb2, 0x77, 0x67, 0xef, 0xcd, 0x76, 0x67, 0x7f,\n  0x96, 0x7d, 0x38, 0xfb, 0x58, 0xf6, 0x89, 0x1c, 0x96, 0xa3, 0xe7, 0x38,\n  0x72, 0x3a, 0xe4, 0x74, 0xce, 0x09, 0xce, 0xe9, 0x99, 0xd3, 0x27, 0x67,\n  0x73, 0xce, 0xd6, 0x9c, 0xfe, 0x39, 0x83, 0x5a, 0xf8, 0xb0, 0x9c, 0xb0,\n  0x9c, 0xa8, 0x9c, 0x84, 0x9c, 0x94, 0x9c, 0x4c, 0x39, 0x5f, 0xf2, 0xd2,\n  0xd5, 0x38, 0x5e, 0x02, 0x1f, 0xeb, 0xcd, 0x73, 0x26, 0xe4, 0x10, 0x9e,\n  0xcd, 0x99, 0x96, 0x43, 0xfb, 0xa9, 0x39, 0x73, 0x72, 0xe6, 0xb7, 0xe2,\n  0x8b, 0x72, 0x08, 0x87, 0xe6, 0xac, 0xc8, 0xa1, 0xf7, 0x36, 0x39, 0xeb,\n  0x72, 0x68, 0x1f, 0x54, 0xd6, 0xc7, 0x18, 0xe7, 0xed, 0x06, 0xdf, 0xa9,\n  0xfa, 0x55, 0x8d, 0x3b, 0x78, 0xa3, 0x77, 0x1c, 0xd7, 0x0f, 0x19, 0xf1,\n  0x43, 0x4a, 0x0f, 0x1a, 0xfb, 0xb2, 0xe6, 0x77, 0xb6, 0x6d, 0xf4, 0x62,\n  0xce, 0xc9, 0x5c, 0xa1, 0xbe, 0xf4, 0xc9, 0xb5, 0xb6, 0x91, 0x1b, 0xff,\n  0x36, 0xf1, 0xae, 0xde, 0x3c, 0xb7, 0x7b, 0x6e, 0xaf, 0x5c, 0xfa, 0xfe,\n  0xa8, 0xc0, 0x25, 0xf5, 0x65, 0xee, 0x90, 0xdc, 0xe1, 0xb9, 0xe1, 0xb9,\n  0x31, 0x05, 0x81, 0xb9, 0xce, 0xdc, 0xb4, 0xdc, 0xec, 0xdc, 0xc2, 0xdc,\n  0x32, 0x89, 0x87, 0x70, 0x65, 0xa2, 0xda, 0x47, 0xc8, 0xdd, 0x65, 0xf0,\n  0x3d, 0x86, 0x1e, 0x99, 0x62, 0xf0, 0xe9, 0x06, 0x9f, 0xd5, 0x86, 0xcf,\n  0xf5, 0xd6, 0x37, 0xe6, 0xfe, 0xb0, 0xf9, 0x7d, 0x6b, 0xee, 0x9a, 0xdc,\n  0xf5, 0xb9, 0x58, 0xd7, 0x73, 0xb7, 0x54, 0xd6, 0xe6, 0x92, 0xa5, 0x95,\n  0xdb, 0x70, 0xb6, 0x72, 0xf2, 0x77, 0xe6, 0xee, 0x37, 0xf8, 0x41, 0x83,\n  0x7b, 0xbc, 0x79, 0xee, 0xd1, 0xdc, 0xe3, 0xde, 0x1c, 0xe9, 0xa7, 0xbc,\n  0xf5, 0x80, 0x6b, 0x6f, 0x9e, 0x9f, 0x5c, 0xf7, 0xcc, 0xfd, 0x57, 0xf9,\n  0xfd, 0x60, 0x1e, 0xec, 0xb0, 0xbc, 0xde, 0x79, 0xfd, 0xf2, 0x06, 0xca,\n  0xf7, 0xc9, 0x05, 0xd6, 0x3c, 0xda, 0xd9, 0xcb, 0x8b, 0x54, 0xe3, 0xad,\n  0xe6, 0x0b, 0x78, 0x9c, 0x77, 0x1c, 0xf3, 0x28, 0xd7, 0x88, 0x13, 0x2f,\n  0x2e, 0xcc, 0x2b, 0xce, 0xab, 0xc8, 0xab, 0xcd, 0x9b, 0x97, 0x37, 0x3e,\n  0x6f, 0x52, 0xde, 0x54, 0xf3, 0xfb, 0x10, 0xc4, 0xc9, 0x2e, 0xcb, 0x5b,\n  0x92, 0x67, 0x9c, 0x56, 0x95, 0xb7, 0xca, 0xe0, 0xb4, 0x0f, 0x93, 0x77,\n  0x22, 0x6f, 0x43, 0x1e, 0xda, 0x9f, 0xb7, 0x23, 0xaf, 0x3e, 0x6f, 0x1b,\n  0xf1, 0xdd, 0x79, 0x7b, 0xf3, 0xdc, 0x79, 0x9f, 0xe5, 0x1d, 0xce, 0x3b,\n  0x26, 0xaf, 0x93, 0x39, 0xc5, 0xcc, 0xef, 0xf8, 0xcd, 0xfd, 0xd2, 0xfc,\n  0x0e, 0xf9, 0x9d, 0xf3, 0x83, 0xe5, 0xf7, 0x67, 0xe5, 0x27, 0xbd, 0xdf,\n  0x47, 0x99, 0x71, 0x73, 0x3f, 0x25, 0xbf, 0xa7, 0x7a, 0xaf, 0x94, 0xdf,\n  0x27, 0xbf, 0xbf, 0x5c, 0x8f, 0xf3, 0x07, 0xa9, 0xef, 0x4f, 0xcd, 0xef,\n  0x16, 0xf2, 0x33, 0xd5, 0x3a, 0x9e, 0x6f, 0xe0, 0xd3, 0x7c, 0x03, 0x9f,\n  0xe6, 0x57, 0xa9, 0xf7, 0x44, 0xf9, 0x13, 0x8c, 0xfd, 0xe3, 0x7a, 0xb5,\n  0xef, 0x5b, 0x94, 0x90, 0x4f, 0xfb, 0x66, 0x77, 0x2f, 0xa9, 0x3c, 0xac,\n  0xde, 0x67, 0xe4, 0xcf, 0xf1, 0xde, 0x5f, 0x35, 0xf7, 0x8b, 0x2a, 0x27,\n  0x15, 0x51, 0x3d, 0x2b, 0x37, 0xa9, 0x7d, 0x9b, 0xf2, 0xad, 0xf9, 0x2b,\n  0x2e, 0xc0, 0x57, 0x9f, 0x8f, 0x57, 0x2c, 0xce, 0x5f, 0x77, 0x01, 0x5e,\n  0x77, 0x3e, 0x9e, 0xbf, 0x33, 0x7f, 0xf3, 0x05, 0xf8, 0xd6, 0xf3, 0x71,\n  0xe4, 0xb3, 0xfd, 0x7c, 0x1c, 0xf7, 0x35, 0x9e, 0x97, 0xef, 0xcb, 0xa7,\n  0x75, 0xd7, 0xfc, 0xae, 0xb9, 0x60, 0x59, 0xc1, 0x4a, 0xb5, 0xdf, 0x93,\n  0x7f, 0xc4, 0xfb, 0x3b, 0x83, 0x02, 0x51, 0x40, 0xf3, 0xb6, 0xc0, 0xbf,\n  0x40, 0x7d, 0x27, 0x67, 0xec, 0x7f, 0x15, 0x74, 0x2d, 0xe8, 0x7e, 0xb6,\n  0xef, 0x7a, 0x0a, 0x86, 0x14, 0xd0, 0xfb, 0x8b, 0x82, 0x70, 0xe3, 0x7e,\n  0x67, 0x01, 0xed, 0xaf, 0x15, 0x64, 0x17, 0xd0, 0xfe, 0x51, 0x41, 0x59,\n  0x01, 0xbd, 0x07, 0x2d, 0x18, 0xa7, 0xbe, 0xf3, 0x29, 0x98, 0x62, 0x7c,\n  0x37, 0x35, 0xab, 0x60, 0xae, 0xf7, 0xb8, 0x16, 0x2c, 0x28, 0x58, 0xec,\n  0x5d, 0x2f, 0xf9, 0xdd, 0x5f, 0x01, 0xe6, 0x63, 0xe5, 0x8e, 0x82, 0x2d,\n  0x6a, 0x1c, 0x0a, 0x68, 0x56, 0x16, 0x34, 0x14, 0xec, 0x32, 0xff, 0xb1,\n  0xab, 0xc4, 0xbf, 0x05, 0x7b, 0x0a, 0xf6, 0x17, 0x1c, 0x2c, 0xf0, 0x98,\n  0xef, 0x69, 0xcd, 0xef, 0x66, 0xdb, 0xf2, 0x96, 0xdf, 0xd7, 0x18, 0xdf,\n  0x35, 0xb6, 0xfd, 0x5d, 0x8d, 0xab, 0xbe, 0xd0, 0xa7, 0x10, 0x12, 0x5c,\n  0x18, 0x50, 0x18, 0x54, 0xd8, 0xed, 0xf4, 0x3e, 0x5e, 0xcb, 0xef, 0x6d,\n  0x8c, 0xdf, 0xd3, 0xb8, 0x36, 0xa1, 0xc6, 0xdb, 0x5c, 0x3b, 0x5a, 0xbe,\n  0xc3, 0x35, 0xf6, 0xff, 0xcc, 0x72, 0x5a, 0xd2, 0xcd, 0xdf, 0xe5, 0xc4,\n  0x15, 0x26, 0x15, 0xa6, 0x17, 0xe6, 0x9a, 0xdf, 0x61, 0x16, 0x56, 0xd4,\n  0x1c, 0x91, 0xfb, 0xd6, 0x40, 0xef, 0xe3, 0x5d, 0xee, 0xc2, 0x49, 0x85,\n  0x53, 0x8d, 0xf7, 0x26, 0xf3, 0xd4, 0x73, 0xa6, 0x1e, 0x35, 0xdf, 0x83,\n  0x98, 0xdf, 0xd7, 0x9b, 0xef, 0x49, 0xaa, 0x3a, 0x54, 0x8e, 0xaf, 0x0a,\n  0x96, 0xbc, 0x70, 0xb7, 0xe2, 0x55, 0x0e, 0x23, 0xbe, 0xa3, 0x75, 0x7a,\n  0xe1, 0x5e, 0xc5, 0x2b, 0x67, 0x1b, 0x7c, 0xbc, 0xf7, 0xfd, 0x85, 0xee,\n  0x96, 0x7c, 0x3e, 0x6b, 0x7d, 0xbd, 0xf0, 0xb0, 0x71, 0x5f, 0x67, 0xba,\n  0xef, 0x98, 0x4a, 0x37, 0x39, 0xae, 0x9f, 0x90, 0xbc, 0x88, 0xa9, 0x78,\n  0x65, 0x45, 0x65, 0x6d, 0xd5, 0x7c, 0xc9, 0x8b, 0xf4, 0xaa, 0xf9, 0xe6,\n  0xc8, 0xb8, 0x76, 0x98, 0xf3, 0xcf, 0xfc, 0xfe, 0xb7, 0x78, 0x56, 0x51,\n  0x67, 0xef, 0xf7, 0xb7, 0x45, 0x7d, 0x8a, 0xfa, 0x7b, 0x7f, 0x3f, 0x54,\n  0x14, 0x56, 0x14, 0xa5, 0x7e, 0x3f, 0xa2, 0xde, 0x0f, 0xd4, 0x6c, 0x37,\n  0xde, 0x13, 0x24, 0xa8, 0xf7, 0xb8, 0x45, 0x99, 0xc5, 0x47, 0x8b, 0xf2,\n  0x8b, 0x4a, 0x8b, 0xaa, 0x8a, 0xd4, 0xbe, 0x8c, 0xc9, 0x8d, 0x7d, 0x1d,\n  0xb9, 0xdf, 0x5c, 0x34, 0xad, 0x68, 0x66, 0xed, 0x32, 0xb5, 0xef, 0x54,\n  0xb4, 0xa8, 0x88, 0xe6, 0x7d, 0xd1, 0x8a, 0x22, 0x9a, 0xbf, 0x45, 0xeb,\n  0x8a, 0xea, 0x8a, 0x30, 0xd3, 0x8a, 0xb6, 0x16, 0x6d, 0x2f, 0xda, 0x59,\n  0xd4, 0x58, 0xb4, 0xaf, 0xe8, 0x80, 0xf7, 0x7b, 0xee, 0x96, 0xdf, 0x2d,\n  0xb5, 0xe5, 0xc6, 0xef, 0x0a, 0xca, 0x7c, 0x8a, 0x0e, 0x15, 0x1d, 0x29,\n  0x6a, 0x3a, 0xe3, 0x77, 0x4b, 0x06, 0x2f, 0x1f, 0x5b, 0x4c, 0xeb, 0x9a,\n  0xf9, 0x3b, 0x25, 0x73, 0x1f, 0xb9, 0x85, 0x0f, 0x29, 0x1e, 0xee, 0xfd,\n  0xbd, 0xcf, 0x39, 0x7f, 0x1f, 0xd5, 0xf2, 0xbd, 0x67, 0xf1, 0x74, 0xef,\n  0x7d, 0xae, 0xe2, 0x59, 0x95, 0x3d, 0x8a, 0xe7, 0x9e, 0xde, 0xa7, 0x32,\n  0xeb, 0xd7, 0x72, 0xbd, 0xcd, 0xef, 0xa7, 0x5a, 0xbe, 0xc3, 0xde, 0x5f,\n  0x4c, 0xeb, 0x54, 0xb1, 0xa7, 0x58, 0xbd, 0xef, 0x3f, 0xae, 0xbe, 0x2f,\n  0x2c, 0xf1, 0x51, 0xe5, 0x97, 0x74, 0x53, 0xcf, 0x9b, 0xbf, 0x87, 0x31,\n  0x7f, 0x77, 0x62, 0xfe, 0x9e, 0xc3, 0xfc, 0x7e, 0xbf, 0x64, 0xc6, 0x98,\n  0x71, 0x25, 0xf3, 0x24, 0x2f, 0xc9, 0x35, 0x78, 0xb1, 0xc1, 0x2b, 0x0c,\n  0x5e, 0x6b, 0xf0, 0xf1, 0x06, 0x9f, 0x64, 0xf0, 0xa9, 0x8a, 0xb7, 0x3c,\n  0x3f, 0x9b, 0xf8, 0x92, 0x92, 0x85, 0x25, 0xab, 0x88, 0x2f, 0x97, 0xbc,\n  0xaa, 0x7f, 0xc9, 0xda, 0x92, 0x13, 0xc4, 0x37, 0x18, 0x7c, 0x93, 0xc1,\n  0xeb, 0x0d, 0xbe, 0xcd, 0xe0, 0x3b, 0x0c, 0xbe, 0x5b, 0xf2, 0x92, 0xbd,\n  0x25, 0x6e, 0x23, 0xfe, 0x99, 0xc1, 0x0f, 0x1b, 0xfc, 0x98, 0xe4, 0xa5,\n  0x3a, 0x7d, 0xae, 0x2e, 0xb9, 0x43, 0x7d, 0x8f, 0x31, 0xc6, 0xbf, 0xb4,\n  0xb3, 0xec, 0xb7, 0x31, 0x1b, 0x4b, 0xfb, 0x13, 0x5f, 0x66, 0xf0, 0x95,\n  0xc4, 0x83, 0x5b, 0xd2, 0x55, 0xbc, 0x67, 0x69, 0x1f, 0xe2, 0x51, 0xa5,\n  0x09, 0xa5, 0xc3, 0x4a, 0xc3, 0x24, 0x57, 0xdf, 0xf3, 0x97, 0x0e, 0xf2,\n  0x8e, 0x97, 0xf5, 0x2e, 0x9d, 0x56, 0x3a, 0x93, 0x78, 0x8a, 0xc1, 0x33,\n  0x0d, 0x9e, 0xdf, 0x86, 0x97, 0x1a, 0xbc, 0xca, 0xe0, 0x63, 0x0d, 0x3e,\n  0x41, 0xf2, 0xd2, 0xc9, 0x2a, 0x9f, 0xd2, 0x39, 0xa5, 0xf3, 0x4b, 0xb1,\n  0x92, 0x95, 0x6e, 0x2e, 0x5d, 0x5a, 0xba, 0x9d, 0xf8, 0x0a, 0x83, 0xaf,\n  0x26, 0xbe, 0xae, 0xb4, 0xce, 0x88, 0x6f, 0x95, 0xbc, 0xd6, 0x59, 0x36,\n  0xaf, 0xb4, 0xb1, 0x74, 0x9f, 0xe4, 0xea, 0xfd, 0x55, 0xe9, 0x4e, 0x19,\n  0x1f, 0xd3, 0x6b, 0x4c, 0xf7, 0x31, 0x90, 0xc0, 0x31, 0xbd, 0x4a, 0x0f,\n  0x18, 0xfc, 0x90, 0xc1, 0x8f, 0x18, 0xbc, 0xc9, 0xe0, 0x27, 0x15, 0x1f,\n  0x23, 0x88, 0x5b, 0xc7, 0x10, 0x5e, 0x43, 0x3c, 0x90, 0xe2, 0x5d, 0xcd,\n  0x7c, 0xc6, 0xf4, 0x25, 0x3e, 0x64, 0xcc, 0xb8, 0x31, 0xe1, 0xc4, 0x87,\n  0x13, 0x8f, 0x19, 0x93, 0x36, 0x26, 0x1b, 0xdc, 0x69, 0x70, 0x17, 0xae,\n  0x4f, 0x1c, 0x33, 0x05, 0xbc, 0xd0, 0xe0, 0x2a, 0x5e, 0xd6, 0x92, 0xae,\n  0xf8, 0xf4, 0x31, 0xb3, 0xd4, 0xfb, 0xf2, 0x31, 0x0b, 0xc6, 0x2c, 0x96,\n  0xdf, 0xe1, 0x8d, 0xd9, 0x38, 0xa6, 0x81, 0xf8, 0x32, 0x83, 0xaf, 0x24,\n  0xbe, 0xc6, 0x48, 0x5f, 0x3f, 0x66, 0xa3, 0xfa, 0x9e, 0x6f, 0xcc, 0x5b,\n  0x32, 0x5e, 0xe6, 0x53, 0x36, 0xb4, 0x2c, 0xa4, 0x2c, 0xa0, 0xcc, 0x67,\n  0xcc, 0x2e, 0x83, 0xef, 0x31, 0xb8, 0xc7, 0xe0, 0xfb, 0x0d, 0x7e, 0xb0,\n  0x4d, 0xfa, 0x51, 0x83, 0x1f, 0x57, 0xef, 0x73, 0xc6, 0x9c, 0x52, 0xbc,\n  0xcc, 0x8f, 0xd2, 0x83, 0xca, 0xba, 0xa9, 0x71, 0x2d, 0xeb, 0x57, 0xd6,\n  0x43, 0x71, 0x8a, 0x0f, 0x94, 0xe5, 0xc9, 0xf7, 0x71, 0x65, 0xb9, 0x65,\n  0xc5, 0xc4, 0x23, 0x0d, 0x9e, 0x44, 0x3c, 0xdd, 0x48, 0x1f, 0x5f, 0x36,\n  0xa3, 0x6c, 0x36, 0xf1, 0x0a, 0x83, 0x4f, 0x22, 0x5e, 0xdb, 0x92, 0xae,\n  0xe2, 0x53, 0x55, 0xdc, 0x1c, 0x37, 0xd7, 0xc2, 0xb2, 0x85, 0x65, 0x1b,\n  0xca, 0x36, 0x81, 0xaf, 0x35, 0xe2, 0x4b, 0x64, 0xbc, 0x6c, 0x79, 0xd9,\n  0x5a, 0xe2, 0xab, 0x0c, 0x7e, 0xa2, 0xac, 0xbe, 0x5c, 0x97, 0xef, 0x5b,\n  0x6a, 0xe6, 0x28, 0x5e, 0xb6, 0xcd, 0xe0, 0x7b, 0x0d, 0xbe, 0xc3, 0xe0,\n  0xbb, 0xdb, 0xa4, 0xbb, 0x89, 0x7f, 0x56, 0x76, 0xd8, 0x88, 0x1f, 0x53,\n  0xbc, 0x9c, 0x49, 0x5e, 0xee, 0x28, 0xef, 0x50, 0x8e, 0xf9, 0x51, 0x3e,\n  0xa8, 0x3c, 0xb8, 0x3c, 0x8c, 0x78, 0x4f, 0x83, 0xf7, 0x31, 0x78, 0x7f,\n  0x83, 0x0f, 0x23, 0x1e, 0x55, 0x9e, 0x50, 0x9e, 0x22, 0xf5, 0x5f, 0x79,\n  0x66, 0xf9, 0x64, 0xe2, 0xf9, 0x06, 0x2f, 0x35, 0x78, 0x95, 0xc1, 0x27,\n  0x10, 0x9f, 0x5f, 0x3e, 0xad, 0x7c, 0x29, 0xf1, 0x99, 0x06, 0x9f, 0x63,\n  0xf0, 0x45, 0x92, 0x9b, 0xfb, 0xe2, 0xe5, 0x07, 0xca, 0x0f, 0x95, 0x03,\n  0x59, 0x95, 0xd7, 0x95, 0x6f, 0x2e, 0xdf, 0x29, 0xd7, 0x91, 0xf2, 0xed,\n  0xc4, 0x1b, 0xcb, 0xf7, 0xd1, 0x7b, 0x5f, 0x79, 0x1d, 0xc8, 0xa5, 0xbc,\n  0xa9, 0xfc, 0x64, 0x85, 0x00, 0x0e, 0xb2, 0xaa, 0xef, 0xab, 0xcc, 0xdf,\n  0x41, 0xb4, 0xfd, 0x5d, 0x83, 0xf7, 0xba, 0xdf, 0xea, 0x3e, 0xe3, 0x7d,\n  0x60, 0x45, 0xb6, 0xfa, 0xae, 0xb6, 0xa2, 0xac, 0x82, 0xf0, 0x4a, 0xc5,\n  0x38, 0xf5, 0x1d, 0x6d, 0xc5, 0x14, 0xf5, 0xfd, 0xed, 0xe9, 0xf5, 0x51,\n  0xad, 0xa7, 0xe6, 0xba, 0x67, 0xa6, 0x57, 0xcc, 0xaa, 0x98, 0x5b, 0xb1,\n  0xe0, 0xf4, 0x7b, 0x87, 0x8a, 0x95, 0x15, 0xf4, 0x1e, 0xb3, 0x62, 0x7d,\n  0xc5, 0x46, 0xef, 0xef, 0xf9, 0x2b, 0x1a, 0x2a, 0x08, 0xbf, 0x54, 0xec,\n  0x51, 0xdf, 0x8d, 0x9b, 0xbf, 0x5b, 0x68, 0xfb, 0x3b, 0x04, 0x33, 0xbd,\n  0xd2, 0x47, 0x7d, 0x8f, 0x5f, 0x19, 0x50, 0x49, 0xef, 0x6d, 0x2a, 0xbb,\n  0xa9, 0xf7, 0x6b, 0x95, 0xbd, 0xd5, 0xfb, 0x69, 0xb3, 0xfc, 0xca, 0x7e,\n  0x95, 0x64, 0xa7, 0x57, 0x0e, 0xad, 0x24, 0xeb, 0xa1, 0x32, 0xb2, 0x32,\n  0xce, 0xfb, 0x7b, 0x36, 0x13, 0x67, 0x99, 0xbf, 0x3f, 0x69, 0x5b, 0xff,\n  0xca, 0x49, 0x95, 0x53, 0xe5, 0x17, 0x6c, 0x2d, 0xed, 0x9b, 0x57, 0xb9,\n  0xb0, 0x12, 0x4f, 0x54, 0x2e, 0xaf, 0x5c, 0x25, 0xdf, 0xd8, 0x56, 0x6e,\n  0xaa, 0xdc, 0x50, 0xb9, 0x8d, 0x78, 0x3d, 0xf1, 0x1d, 0x95, 0xbb, 0x2b,\n  0xf7, 0x7a, 0x71, 0x77, 0xe5, 0x67, 0x12, 0x91, 0x9b, 0xbc, 0x2a, 0xb3,\n  0x8a, 0xc9, 0x37, 0xb3, 0x95, 0x27, 0xaa, 0x98, 0x7c, 0x63, 0x7d, 0x1a,\n  0xa7, 0x28, 0x5c, 0x51, 0xd5, 0xb3, 0xaa, 0x8f, 0x7a, 0x7f, 0x58, 0x35,\n  0x48, 0xbd, 0x97, 0xa9, 0x52, 0xfb, 0xd8, 0x51, 0xc6, 0xef, 0x57, 0x53,\n  0xaa, 0x32, 0xe5, 0x38, 0x9b, 0xbf, 0xcb, 0x35, 0xbf, 0x9b, 0x6b, 0xc1,\n  0x75, 0x73, 0xaa, 0xe6, 0xcb, 0xdf, 0x5f, 0x99, 0xef, 0x77, 0xcd, 0xfd,\n  0x40, 0xf3, 0x7d, 0x8e, 0xf9, 0xfe, 0xbe, 0xaa, 0xb1, 0x6a, 0x9f, 0xf7,\n  0x77, 0x1f, 0x55, 0x07, 0xaa, 0x0e, 0x55, 0x41, 0x6e, 0xaa, 0x9a, 0xd4,\n  0x7d, 0x55, 0x27, 0xab, 0x45, 0xb5, 0xb5, 0xda, 0xbf, 0x3a, 0xb0, 0x9a,\n  0xe4, 0xa5, 0xba, 0x7b, 0x75, 0xaf, 0xea, 0xbe, 0xd5, 0x03, 0xaa, 0x87,\n  0x54, 0xd3, 0x7a, 0x5d, 0x1d, 0x5e, 0x1d, 0xd3, 0x8a, 0x3b, 0xab, 0xd3,\n  0xbc, 0x7f, 0x3f, 0xd4, 0xf2, 0x3d, 0xc9, 0xc4, 0xea, 0x29, 0xd5, 0xd3,\n  0xab, 0x67, 0x55, 0xcf, 0xad, 0x5e, 0x56, 0x0d, 0x39, 0xa8, 0x5e, 0x0c,\n  0xbe, 0xb2, 0x7a, 0x4d, 0xf5, 0xfa, 0xea, 0x8d, 0xd5, 0x40, 0x18, 0xd5,\n  0x6f, 0xa9, 0xf7, 0x5f, 0xd5, 0x7b, 0xaa, 0xf7, 0x57, 0x63, 0x45, 0xae,\n  0xf6, 0x54, 0x1f, 0xad, 0xc6, 0x48, 0x57, 0x9f, 0x72, 0xf9, 0xb8, 0xfc,\n  0x5c, 0x01, 0xae, 0x20, 0x17, 0xe9, 0x1b, 0x57, 0x0f, 0x17, 0xed, 0xc7,\n  0xb8, 0xfa, 0xb9, 0x68, 0x3c, 0x5d, 0x43, 0x5d, 0x21, 0xae, 0x48, 0x57,\n  0x9c, 0x2b, 0xc9, 0x45, 0xfb, 0x20, 0xae, 0x5c, 0x97, 0xfa, 0x3d, 0x4f,\n  0x85, 0xab, 0xd6, 0x35, 0x1e, 0x7c, 0x92, 0x6b, 0xaa, 0x0b, 0xe3, 0xe6,\n  0x9a, 0xed, 0x52, 0xfa, 0x63, 0x89, 0xab, 0xde, 0xf8, 0xde, 0x66, 0x89,\n  0x6b, 0xb9, 0x6b, 0x87, 0x6b, 0x95, 0x6b, 0xad, 0x6b, 0xc3, 0x69, 0xdc,\n  0xea, 0xda, 0xed, 0xda, 0x2b, 0xfb, 0xd5, 0xf5, 0x99, 0xeb, 0xb0, 0x4b,\n  0x7d, 0x79, 0x7d, 0x42, 0x61, 0xb6, 0x1a, 0x03, 0xbb, 0xd5, 0xd0, 0xf7,\n  0x05, 0x35, 0x8e, 0x9a, 0x0e, 0x35, 0xd0, 0x03, 0x35, 0xc1, 0x35, 0x3d,\n  0x6b, 0xfa, 0x78, 0xfd, 0xae, 0xc4, 0xf8, 0xde, 0xc6, 0xfc, 0x9d, 0x8e,\n  0x89, 0x8b, 0x6b, 0x4a, 0x6b, 0xaa, 0x8c, 0xe7, 0xc7, 0x1a, 0x7c, 0x82,\n  0xc1, 0x8d, 0x73, 0x3c, 0x6a, 0xa6, 0x19, 0x7c, 0xa6, 0xc1, 0xe7, 0xb4,\n  0xe1, 0x06, 0x7a, 0xac, 0x31, 0xce, 0x48, 0x51, 0xbf, 0x53, 0x00, 0x5f,\n  0xa1, 0xde, 0x2b, 0xd5, 0xac, 0xab, 0xa9, 0x3b, 0x13, 0x1f, 0xd6, 0x6c,\n  0x6d, 0x13, 0x37, 0xf9, 0xbe, 0xda, 0x29, 0xad, 0xe2, 0x3b, 0x6b, 0xc9,\n  0xae, 0xa8, 0x69, 0x54, 0xf1, 0xda, 0x89, 0xb5, 0x53, 0x6a, 0xa7, 0x7b,\n  0xdd, 0x77, 0xc0, 0xb8, 0xef, 0x90, 0xc1, 0x8f, 0xd4, 0xd0, 0x7b, 0xb7,\n  0x9a, 0x93, 0x6a, 0x1e, 0xd6, 0x5a, 0x6b, 0x49, 0xbf, 0xd4, 0x06, 0xd6,\n  0x92, 0x9c, 0xd4, 0x76, 0xaf, 0xed, 0xd5, 0xea, 0x77, 0x3d, 0x43, 0x6a,\n  0x87, 0xab, 0xf9, 0x56, 0x6b, 0xfc, 0x0e, 0xab, 0x96, 0xe4, 0xa4, 0x36,\n  0xbb, 0xb6, 0xb0, 0xb6, 0x4c, 0xf6, 0x5f, 0xeb, 0x72, 0x6b, 0x67, 0xd5,\n  0xaa, 0xef, 0xd4, 0x17, 0xd4, 0x92, 0xdd, 0x53, 0xbb, 0xac, 0x76, 0x65,\n  0xad, 0xd4, 0x18, 0x9c, 0xf7, 0x11, 0xdb, 0x18, 0x67, 0xab, 0xf8, 0x14,\n  0xe9, 0x0b, 0xf9, 0xff, 0x1f, 0x37, 0xf0, 0x49, 0xf0, 0x37, 0xc9, 0x30,\n  0x1f, 0xae, 0x3d, 0x0e, 0x7f, 0x12, 0xf9, 0x0f, 0x93, 0xef, 0xd2, 0x66,\n  0xc1, 0xef, 0x22, 0x3e, 0x92, 0xbe, 0x76, 0x13, 0xfc, 0x1b, 0xc5, 0x0f,\n  0xe4, 0xcb, 0x94, 0x5b, 0xc4, 0x1e, 0xba, 0xfa, 0x1c, 0xfc, 0xf0, 0xe6,\n  0x9e, 0x32, 0x07, 0xf1, 0x37, 0xf8, 0xdd, 0xc4, 0x3f, 0xe1, 0x97, 0x6b,\n  0x6b, 0xe0, 0xdf, 0xa4, 0x8d, 0x86, 0x7f, 0x25, 0xdd, 0x73, 0x93, 0xf6,\n  0x04, 0x85, 0xe5, 0xd5, 0xbe, 0x74, 0xff, 0x93, 0xda, 0x7c, 0xf8, 0xd7,\n  0x89, 0x03, 0x14, 0x7e, 0x82, 0xc2, 0xf2, 0xea, 0xdc, 0xe6, 0xab, 0x51,\n  0xab, 0x95, 0xb2, 0x0e, 0xec, 0x01, 0x59, 0x16, 0xfc, 0xe7, 0x28, 0x45,\n  0xde, 0x33, 0xa0, 0x39, 0x4c, 0xfa, 0xb2, 0x2d, 0xfc, 0x41, 0x79, 0x7f,\n  0xf3, 0xc9, 0xe6, 0x34, 0x5c, 0x7d, 0x84, 0x4a, 0x8c, 0x91, 0xcf, 0x72,\n  0x3b, 0xe5, 0x30, 0x8b, 0x52, 0xfa, 0x52, 0xf8, 0x01, 0x4a, 0x9f, 0x44,\n  0xfe, 0x2d, 0xe4, 0xdf, 0x4b, 0x7d, 0x72, 0xaf, 0xe8, 0xcc, 0xb8, 0x98,\n  0x20, 0x7d, 0xbe, 0x83, 0x52, 0x76, 0x50, 0xce, 0x51, 0xf4, 0xd4, 0x64,\n  0xba, 0x93, 0x37, 0xcb, 0xff, 0x47, 0x19, 0x44, 0x29, 0xbb, 0x29, 0x25,\n  0x88, 0x72, 0x76, 0x51, 0xeb, 0x6e, 0xa1, 0xd6, 0xb9, 0xb4, 0x8f, 0x65,\n  0x98, 0x7a, 0xa9, 0x8a, 0x5a, 0xd7, 0x43, 0xd6, 0x96, 0x7d, 0x4e, 0x2d,\n  0x0a, 0xa3, 0x7e, 0xdb, 0x42, 0x7e, 0x88, 0xb6, 0x89, 0xfa, 0x53, 0xfa,\n  0xaf, 0x51, 0x3e, 0x6b, 0xc4, 0x29, 0x2a, 0x45, 0xe6, 0x7f, 0x84, 0xf2,\n  0x7f, 0x40, 0xd6, 0x44, 0x54, 0x53, 0x4d, 0xde, 0x92, 0xbe, 0xd6, 0x4b,\n  0x85, 0x79, 0x09, 0xfc, 0x8d, 0x14, 0x7e, 0x45, 0xf9, 0x94, 0xb2, 0x9e,\n  0x6a, 0xbe, 0x9e, 0xc6, 0x77, 0xaa, 0x16, 0x89, 0xf0, 0xd5, 0x74, 0xf5,\n  0x0a, 0x1a, 0xc1, 0xc1, 0xda, 0x35, 0xf0, 0x1d, 0xe4, 0x47, 0x4a, 0x1f,\n  0xf7, 0xc8, 0xf0, 0x40, 0xba, 0xf3, 0xa4, 0x6c, 0x3b, 0x3b, 0x2a, 0x8e,\n  0x93, 0x84, 0xa0, 0x86, 0x42, 0xa3, 0x7a, 0x0e, 0xa1, 0x56, 0x77, 0xa0,\n  0xff, 0xb2, 0xf4, 0x65, 0xf3, 0xed, 0xd2, 0x97, 0xf7, 0xb0, 0xa3, 0x14,\n  0x9e, 0x4a, 0xa3, 0x3f, 0x90, 0xfc, 0x1b, 0x8d, 0xdc, 0xa4, 0xff, 0x10,\n  0xf9, 0x37, 0xc9, 0x72, 0x31, 0x5e, 0xb2, 0xf4, 0x5d, 0x54, 0x93, 0x8f,\n  0xa8, 0x86, 0x1f, 0x51, 0xf8, 0x16, 0x6a, 0xf5, 0x10, 0x6d, 0x85, 0xec,\n  0xb7, 0xe6, 0x70, 0xf8, 0x8f, 0x52, 0xfa, 0x0c, 0x4a, 0xb9, 0x4b, 0xa6,\n  0x08, 0x0b, 0xf5, 0x80, 0x8d, 0xd2, 0x33, 0xe9, 0xd9, 0x97, 0x28, 0x1c,\n  0x2a, 0x7d, 0xe1, 0x4f, 0x57, 0xfd, 0x29, 0xa5, 0xaf, 0xac, 0x2d, 0x3b,\n  0x44, 0x23, 0x18, 0x43, 0xfe, 0x48, 0xd1, 0x84, 0x94, 0xc3, 0xf4, 0x94,\n  0x85, 0x52, 0x86, 0x34, 0xcb, 0x96, 0x5e, 0x4f, 0xe1, 0x6c, 0x4a, 0xcf,\n  0xa6, 0xf0, 0x03, 0xe4, 0x5f, 0x29, 0x5b, 0xc1, 0x3e, 0x90, 0xa3, 0x00,\n  0x49, 0x93, 0x2d, 0x7a, 0x8e, 0xd2, 0x5f, 0x27, 0xdf, 0x46, 0xe9, 0xcd,\n  0x32, 0x4f, 0x7e, 0x6b, 0xb3, 0xfc, 0xbf, 0x9c, 0x7e, 0x5a, 0x0e, 0x52,\n  0xf6, 0x88, 0x75, 0x08, 0xbf, 0x43, 0x6d, 0x79, 0x84, 0x46, 0xf0, 0x1d,\n  0x6a, 0xef, 0x23, 0x94, 0xc3, 0x15, 0x94, 0xbe, 0x95, 0xfc, 0x8f, 0xe8,\n  0x6a, 0xf8, 0xa9, 0x2f, 0xe5, 0xb8, 0x93, 0x3f, 0x85, 0xd2, 0xc3, 0x28,\n  0x3d, 0x89, 0xea, 0x93, 0x44, 0x6d, 0x19, 0x2e, 0xa6, 0xa1, 0x5d, 0x4f,\n  0xaa, 0xb6, 0x1b, 0x3d, 0x20, 0xeb, 0x90, 0x46, 0x57, 0x83, 0x49, 0x56,\n  0xa3, 0xe9, 0x7e, 0x8f, 0xf2, 0x29, 0x65, 0x2c, 0xdd, 0x39, 0x96, 0x7a,\n  0xa6, 0x23, 0x85, 0x3b, 0xd2, 0x53, 0xbd, 0x9a, 0xfb, 0x48, 0x5f, 0x4b,\n  0x45, 0x6d, 0xbf, 0x69, 0x1e, 0x2e, 0x7d, 0xb1, 0x40, 0xce, 0x2f, 0xca,\n  0xed, 0x3e, 0x1a, 0xdf, 0xfb, 0xc4, 0xb7, 0xb2, 0x7f, 0x28, 0x45, 0xc8,\n  0xfa, 0x88, 0x42, 0x99, 0x2e, 0x7a, 0x2a, 0x9f, 0xf2, 0x79, 0x94, 0xca,\n  0x7a, 0x94, 0xc2, 0x61, 0x32, 0x9d, 0x35, 0x29, 0x5f, 0xf5, 0x21, 0x8d,\n  0xe0, 0x03, 0xda, 0xd3, 0x34, 0xfb, 0x46, 0xd2, 0x28, 0x34, 0xd1, 0x7f,\n  0x95, 0x95, 0x4f, 0x45, 0x36, 0xeb, 0xd2, 0xa7, 0xfc, 0xed, 0xcd, 0x76,\n  0xf8, 0xf5, 0x74, 0x7f, 0x3d, 0xa5, 0xcc, 0xa6, 0xfb, 0x67, 0x93, 0x04,\n  0x7e, 0x43, 0xb3, 0x26, 0x91, 0xae, 0x26, 0xd2, 0xd5, 0x4e, 0x34, 0x6a,\n  0x9d, 0xa8, 0x94, 0x2c, 0xca, 0x2d, 0xeb, 0xff, 0xd1, 0xf6, 0x1d, 0x80,\n  0x51, 0x15, 0x5b, 0xff, 0x33, 0x73, 0x77, 0xf7, 0x96, 0xbd, 0xe9, 0xbd,\n  0xf7, 0x42, 0x12, 0x42, 0x20, 0x8d, 0x12, 0x60, 0x13, 0x42, 0x42, 0x49,\n  0x20, 0xf4, 0xde, 0x7b, 0xef, 0x28, 0x88, 0x80, 0x20, 0x45, 0x54, 0xba,\n  0x85, 0x2a, 0xa2, 0x80, 0x62, 0x01, 0x15, 0xb1, 0x2b, 0x76, 0x41, 0xc5,\n  0xa7, 0x62, 0x57, 0x44, 0x51, 0xb0, 0x00, 0x02, 0x2a, 0xa2, 0x90, 0xdd,\n  0xff, 0x99, 0xdf, 0xbd, 0x09, 0xc1, 0xa7, 0xef, 0x7b, 0xef, 0x7b, 0xdf,\n  0x9f, 0xcb, 0x9e, 0x3d, 0x39, 0xf7, 0xcc, 0xdc, 0x33, 0x67, 0x66, 0xce,\n  0x9c, 0x73, 0x66, 0x76, 0x17, 0xf4, 0xb6, 0xb2, 0x94, 0x88, 0x92, 0x35,\n  0x8b, 0x28, 0x50, 0x1e, 0x45, 0xcd, 0x8f, 0x82, 0x73, 0x26, 0xea, 0x09,\n  0x97, 0xf5, 0xb0, 0x33, 0x92, 0x93, 0x9d, 0x41, 0xfd, 0x5e, 0xb4, 0xb7,\n  0x04, 0xf5, 0x87, 0xa2, 0xe6, 0x3d, 0xc0, 0xc7, 0x43, 0x86, 0xf1, 0x28,\n  0x3b, 0x14, 0x94, 0xa1, 0xa8, 0xb3, 0x18, 0x3c, 0x3f, 0xe1, 0xb9, 0x3f,\n  0x81, 0xfe, 0x13, 0xe8, 0x0b, 0xc0, 0xbf, 0x00, 0xfc, 0x0f, 0x60, 0xc4,\n  0x5e, 0x83, 0xb1, 0x31, 0x10, 0x2d, 0x8d, 0x84, 0x24, 0x63, 0xc1, 0x9f,\n  0x0e, 0xce, 0xc9, 0xa0, 0x17, 0x83, 0xde, 0x19, 0x94, 0xce, 0x28, 0x3b,\n  0x08, 0x3c, 0xf9, 0x78, 0xca, 0x9b, 0xc0, 0xe7, 0xe2, 0xee, 0x5c, 0xdc,\n  0x6d, 0x83, 0x9a, 0xa3, 0x50, 0x73, 0x1b, 0xdb, 0x0e, 0xcb, 0x71, 0xf5,\n  0x14, 0x64, 0x68, 0x8a, 0xbb, 0x71, 0xd6, 0x73, 0x41, 0x99, 0x0e, 0x9e,\n  0x68, 0xf0, 0x3c, 0x00, 0x99, 0x1f, 0x00, 0xe5, 0x1a, 0xe0, 0xd7, 0x80,\n  0x9e, 0x8e, 0x59, 0xf9, 0x2b, 0xf0, 0x85, 0xb0, 0x5d, 0x65, 0xb0, 0x5d,\n  0x0b, 0xc1, 0x59, 0x06, 0xfa, 0x32, 0xe0, 0xcb, 0x94, 0x05, 0xb0, 0xf3,\n  0x92, 0xd2, 0x5a, 0xe2, 0xec, 0x37, 0xe0, 0xcd, 0x51, 0xaa, 0x39, 0xea,\n  0xf1, 0xd9, 0x94, 0xbd, 0xc0, 0xe5, 0x48, 0x1e, 0x84, 0x67, 0x0d, 0x42,\n  0x0d, 0xf9, 0xb8, 0xab, 0xa3, 0x17, 0x3e, 0x41, 0xbb, 0x1e, 0xc2, 0xdd,\n  0x87, 0x70, 0x77, 0x89, 0x7d, 0xb7, 0x25, 0xe6, 0xd7, 0x21, 0xf0, 0xb4,\n  0x44, 0xef, 0x48, 0x18, 0x62, 0x41, 0xe8, 0x21, 0x0d, 0xad, 0x7b, 0x19,\n  0x65, 0x5f, 0x06, 0xfe, 0x12, 0x2c, 0xd5, 0xab, 0xc0, 0x5b, 0x43, 0x6f,\n  0x7e, 0xa8, 0xdf, 0x0f, 0xfc, 0xa7, 0xc1, 0x79, 0x1a, 0x77, 0x2f, 0x03,\n  0xbf, 0x0c, 0xfc, 0x4d, 0xe0, 0x6f, 0x82, 0xa7, 0x14, 0x78, 0x29, 0xf0,\n  0xd1, 0xc0, 0x47, 0x5b, 0x36, 0x1f, 0x94, 0x91, 0x78, 0xfa, 0x48, 0x50,\n  0xd2, 0x80, 0xa7, 0xd9, 0x3d, 0x82, 0xf5, 0x4e, 0x29, 0x04, 0xfe, 0x2e,\n  0xf0, 0x1c, 0x89, 0x3b, 0x4c, 0xe0, 0x63, 0x80, 0x47, 0x02, 0x9f, 0x01,\n  0x9e, 0x73, 0xc0, 0xab, 0x40, 0x0f, 0x01, 0x3e, 0x19, 0x78, 0x38, 0xf0,\n  0x69, 0x58, 0x37, 0x6b, 0x24, 0x0e, 0xd8, 0x14, 0xf5, 0xc7, 0xa1, 0xfe,\n  0xa6, 0x58, 0x7f, 0xe3, 0xb0, 0xce, 0x36, 0xc5, 0xb3, 0xe2, 0xf0, 0xac,\n  0xa6, 0x78, 0x56, 0x1c, 0x9e, 0xd5, 0x14, 0xcf, 0x8a, 0x93, 0xcf, 0x22,\n  0x4b, 0x2b, 0x2d, 0xd8, 0x0d, 0xb2, 0x2c, 0xdb, 0x2d, 0x6b, 0x63, 0x8b,\n  0x51, 0xe7, 0x32, 0xc5, 0xb2, 0xcf, 0x85, 0xc0, 0xdf, 0x05, 0x2e, 0xeb,\n  0x59, 0x86, 0x7a, 0x9a, 0xa0, 0x9e, 0x65, 0xa8, 0xa7, 0x09, 0x64, 0x6e,\n  0x8c, 0x52, 0xcb, 0x61, 0x9d, 0x0a, 0xd0, 0xa7, 0xcb, 0x51, 0x43, 0x01,\n  0x6a, 0x58, 0x0e, 0xa9, 0x96, 0x5b, 0x3c, 0xd0, 0x4f, 0x01, 0xf0, 0x89,\n  0x80, 0xe9, 0x80, 0x93, 0xc1, 0x5f, 0x08, 0xfe, 0xa5, 0xa8, 0xa7, 0x1b,\n  0xea, 0x59, 0x0a, 0x7a, 0x37, 0x8b, 0x0e, 0x9d, 0x2f, 0x45, 0x6d, 0xdd,\n  0x80, 0x77, 0x43, 0x4b, 0x97, 0xa2, 0x86, 0xa5, 0xa8, 0xb9, 0x1b, 0xf0,\n  0x6e, 0xd0, 0x7c, 0x0c, 0xf0, 0x18, 0xb4, 0xd1, 0x87, 0x1a, 0x62, 0xe0,\n  0x1b, 0xf8, 0x6c, 0x3f, 0xe4, 0x22, 0xd6, 0x65, 0x39, 0xbb, 0x9b, 0xa1,\n  0xb6, 0x66, 0x18, 0x21, 0xf3, 0xa0, 0xf9, 0x58, 0xac, 0x65, 0x93, 0x40,\n  0xbf, 0x0d, 0x35, 0xe7, 0xfa, 0x12, 0x25, 0x44, 0xcd, 0xa6, 0x35, 0x77,\n  0x6c, 0x4f, 0x40, 0xe2, 0x7b, 0x15, 0x39, 0x5b, 0xe3, 0x50, 0xdb, 0xfb,\n  0xa0, 0xbf, 0x0f, 0xeb, 0xf1, 0x16, 0xd6, 0xc1, 0x15, 0xe0, 0x29, 0xb2,\n  0xac, 0x19, 0x6a, 0x0e, 0x00, 0x4f, 0x00, 0x2c, 0xa7, 0x02, 0xdb, 0xab,\n  0xe0, 0xee, 0x3c, 0xd8, 0xcf, 0x68, 0x50, 0xa2, 0x41, 0xd9, 0x85, 0x3a,\n  0x77, 0xe1, 0xb9, 0x7d, 0x50, 0xaa, 0x8f, 0x6d, 0x67, 0x36, 0xcb, 0xd1,\n  0x0e, 0x4a, 0x08, 0xe6, 0xc2, 0x63, 0x58, 0xd1, 0x1e, 0x87, 0x8d, 0x7d,\n  0x5c, 0xac, 0x03, 0x94, 0xcf, 0x1a, 0x6b, 0x3d, 0x0b, 0xf5, 0xc4, 0x43,\n  0x9e, 0x1f, 0x41, 0x89, 0xb3, 0x20, 0x78, 0x52, 0x51, 0xc3, 0x77, 0xb2,\n  0x14, 0xf5, 0x88, 0xe4, 0x4c, 0x87, 0xfc, 0xf7, 0x81, 0xff, 0x3e, 0x68,\n  0x66, 0x2a, 0xa0, 0xf0, 0xf9, 0x88, 0xb2, 0x0c, 0xf4, 0x65, 0xf0, 0x31,\n  0xce, 0xcb, 0xfe, 0x52, 0x5e, 0x95, 0x6d, 0x51, 0xba, 0xa3, 0x45, 0x9a,\n  0xf4, 0xb5, 0x04, 0xf4, 0x26, 0x92, 0xd1, 0xa2, 0x5b, 0xe1, 0xcf, 0x44,\n  0xa2, 0xe6, 0xc5, 0xb2, 0x1e, 0xf1, 0x8b, 0xe4, 0x51, 0x6e, 0x40, 0x0d,\n  0xfe, 0x92, 0xae, 0xcc, 0x91, 0x3c, 0x62, 0x21, 0xf8, 0x2d, 0xff, 0x67,\n  0xb2, 0x72, 0x01, 0xa3, 0x42, 0xce, 0xd6, 0xc9, 0x8e, 0x28, 0xe0, 0x98,\n  0x2f, 0xa0, 0x47, 0x81, 0xde, 0x46, 0xf9, 0x1e, 0x78, 0x7b, 0x69, 0xe5,\n  0xd0, 0xa2, 0xa7, 0x60, 0x6d, 0xf6, 0xc2, 0x46, 0x6d, 0x05, 0xe5, 0x51,\n  0xcb, 0x4f, 0x80, 0x85, 0x5f, 0x86, 0xbb, 0x4d, 0x70, 0x37, 0x15, 0x56,\n  0xe8, 0x77, 0x48, 0xfe, 0xbb, 0xe4, 0x54, 0xce, 0x43, 0x1e, 0xf4, 0x1a,\n  0xb5, 0x48, 0x7e, 0xb7, 0x69, 0x3f, 0xe0, 0xdd, 0xd1, 0xf6, 0xdb, 0x30,\n  0x32, 0x1b, 0x61, 0x64, 0x7e, 0x80, 0x9a, 0x3f, 0x40, 0xcd, 0x9d, 0xd1,\n  0xae, 0xce, 0xd6, 0x5a, 0x0c, 0x9e, 0x28, 0xf0, 0x44, 0xc1, 0x47, 0x6d,\n  0x0a, 0x4a, 0x1c, 0xfc, 0x81, 0xdd, 0x78, 0xe2, 0x0d, 0xb6, 0xcf, 0xf0,\n  0x0d, 0xe4, 0xd9, 0x0b, 0x79, 0xbc, 0xc0, 0x6f, 0x07, 0xfe, 0x0d, 0xbc,\n  0xaf, 0xbd, 0x80, 0xb7, 0x4b, 0xef, 0x0e, 0x94, 0xc9, 0xa0, 0x14, 0x82,\n  0x73, 0x32, 0x38, 0x0b, 0x41, 0x8f, 0xf6, 0x2d, 0x93, 0xdf, 0x7b, 0x8e,\n  0x1e, 0x3c, 0xeb, 0xeb, 0x21, 0x7d, 0x21, 0x3c, 0x65, 0x91, 0x72, 0x14,\n  0x7e, 0x91, 0x94, 0x6d, 0xaf, 0xef, 0x0e, 0xe8, 0x44, 0xb6, 0xa2, 0x06,\n  0x92, 0xd7, 0x40, 0xda, 0x2c, 0x50, 0x1a, 0x49, 0x7b, 0xc5, 0x7e, 0x84,\n  0xd5, 0x6a, 0x03, 0x6f, 0x39, 0x0a, 0xfa, 0x5f, 0x06, 0x3d, 0x37, 0x81,\n  0x9e, 0x97, 0x81, 0xde, 0xc4, 0xa6, 0x7f, 0x0f, 0x7a, 0x7b, 0xcc, 0x26,\n  0xe9, 0x63, 0xbf, 0x80, 0xf1, 0x80, 0x9e, 0x65, 0x2f, 0x01, 0x7f, 0x09,\n  0x63, 0xe9, 0x04, 0x9e, 0x75, 0x02, 0x4f, 0x39, 0x81, 0x31, 0xdc, 0x1e,\n  0xcf, 0xcd, 0x03, 0x3d, 0x0f, 0x78, 0x63, 0x5f, 0x1e, 0xf4, 0x23, 0xcb,\n  0xde, 0x04, 0x2f, 0x1d, 0x63, 0x80, 0x6a, 0x96, 0xfc, 0x06, 0xc6, 0x61,\n  0x28, 0xf0, 0x60, 0x7b, 0xf6, 0x49, 0x8a, 0x65, 0x93, 0x13, 0xe0, 0xc9,\n  0xa8, 0xf6, 0x4a, 0x1d, 0x0c, 0x2f, 0x3d, 0x51, 0x7e, 0x53, 0x3f, 0x66,\n  0x6b, 0x21, 0x66, 0xc4, 0x73, 0x90, 0xe7, 0x39, 0xd4, 0xbf, 0x07, 0xf8,\n  0x1e, 0xc8, 0xd3, 0x11, 0x9a, 0xe9, 0x08, 0xfc, 0x08, 0xe8, 0x96, 0x1d,\n  0x38, 0x02, 0xfa, 0x11, 0xd4, 0x5f, 0x82, 0xfa, 0xcb, 0x80, 0x2f, 0xc3,\n  0x53, 0xde, 0x01, 0xe7, 0x3b, 0xa8, 0xed, 0x1d, 0xc8, 0x89, 0x15, 0x8a,\n  0x3d, 0x64, 0xe1, 0xe0, 0x39, 0x0b, 0xfc, 0x06, 0x7b, 0x3e, 0x2e, 0xc1,\n  0x4c, 0x94, 0xf4, 0x68, 0xe0, 0xfb, 0xb8, 0x29, 0xbf, 0x61, 0x1f, 0x3c,\n  0x5b, 0xa0, 0xa5, 0x7c, 0xd4, 0x7f, 0x13, 0xea, 0xf1, 0x29, 0xf2, 0xbb,\n  0x49, 0x4f, 0x83, 0xff, 0x47, 0x48, 0x12, 0xe0, 0xbb, 0x1f, 0xb6, 0x42,\n  0x52, 0x7e, 0x47, 0xa9, 0xdf, 0x81, 0xc7, 0x2b, 0x92, 0xff, 0x03, 0x48,\n  0xf2, 0xa3, 0x2f, 0x08, 0x12, 0x7e, 0x00, 0x9d, 0xc8, 0x19, 0xdd, 0x16,\n  0x6d, 0x69, 0x8b, 0x9a, 0xdd, 0xd0, 0x86, 0x1b, 0xa5, 0x9c, 0xd0, 0xcf,\n  0xa7, 0x78, 0xd6, 0xa7, 0xb8, 0x5b, 0x60, 0xc9, 0x09, 0xfe, 0x5b, 0xac,\n  0x3a, 0x99, 0x55, 0xb3, 0xf4, 0xea, 0x9f, 0x85, 0x2d, 0x7a, 0x0c, 0xb3,\n  0xf2, 0x23, 0xcc, 0xdc, 0x67, 0xa5, 0x3c, 0xe2, 0x59, 0xe0, 0xa1, 0xb8,\n  0x1b, 0x8a, 0x56, 0xb4, 0x87, 0xb4, 0xfb, 0x51, 0xea, 0x46, 0xdf, 0x05,\n  0x09, 0x25, 0x5d, 0x14, 0xa1, 0x6c, 0x5b, 0x48, 0xb5, 0xc3, 0xb6, 0xa8,\n  0x52, 0xe7, 0x93, 0x81, 0x4f, 0x86, 0xfc, 0x3e, 0x8c, 0x84, 0x96, 0x90,\n  0xf0, 0x10, 0x4f, 0x90, 0xbf, 0xaf, 0x20, 0x4e, 0xc2, 0x4b, 0x21, 0xc8,\n  0x0e, 0x8a, 0x1f, 0x08, 0x76, 0x07, 0x7d, 0x99, 0x05, 0xd9, 0x2a, 0xd8,\n  0x9f, 0x61, 0x04, 0xf7, 0x83, 0xb2, 0x1f, 0xb8, 0x17, 0xb8, 0x4f, 0xe2,\n  0xfc, 0x3c, 0x28, 0xad, 0xc1, 0xb9, 0x13, 0x94, 0xb6, 0xa0, 0x60, 0x2e,\n  0xb3, 0xee, 0xac, 0x84, 0xe0, 0x0e, 0xb6, 0x9a, 0x60, 0x4f, 0x94, 0x5a,\n  0x8c, 0x67, 0xf5, 0xe4, 0x07, 0x08, 0x6e, 0x96, 0x14, 0x1a, 0x93, 0xc3,\n  0x10, 0xf9, 0xca, 0xbb, 0x0f, 0xa0, 0x86, 0xce, 0xa0, 0xac, 0x00, 0x65,\n  0x05, 0xa4, 0x0a, 0x15, 0xa7, 0x88, 0x9e, 0x21, 0xdb, 0xcb, 0x33, 0xd0,\n  0xc6, 0xbb, 0xd0, 0x96, 0x09, 0xd0, 0xcf, 0x8b, 0x68, 0xe9, 0x7c, 0xb4,\n  0x74, 0x3e, 0xe8, 0xf9, 0x98, 0xa7, 0xe7, 0x7d, 0xf9, 0x88, 0x9e, 0x64,\n  0x7b, 0x4f, 0xa0, 0x4f, 0x2f, 0xe2, 0x6e, 0xb8, 0x15, 0x33, 0xa2, 0x1e,\n  0x27, 0x70, 0x27, 0xf0, 0xf6, 0xa8, 0xa1, 0x3d, 0xf8, 0x2f, 0xa2, 0x77,\n  0x2e, 0x02, 0xff, 0xcd, 0x1e, 0x8d, 0xb2, 0x1f, 0x27, 0x58, 0x9e, 0x2a,\n  0xea, 0x19, 0x01, 0x8a, 0x15, 0xbf, 0xef, 0x05, 0x9e, 0x08, 0xfe, 0x4f,\n  0x00, 0x57, 0xf8, 0x8a, 0x21, 0xbf, 0xc4, 0x8f, 0xfa, 0x66, 0x49, 0x08,\n  0x1e, 0x06, 0x7e, 0x06, 0xfa, 0x17, 0xa0, 0x4c, 0x04, 0x74, 0x82, 0xee,\n  0xc4, 0x5c, 0x28, 0xf0, 0x5d, 0x26, 0x3c, 0x53, 0x8e, 0x61, 0x21, 0x7f,\n  0x5f, 0x8e, 0x73, 0xd4, 0xc9, 0x31, 0x12, 0x78, 0x6b, 0xe0, 0xad, 0xb9,\n  0x1f, 0x41, 0x0d, 0xf5, 0x7c, 0x0f, 0x09, 0xbf, 0x47, 0xd9, 0x36, 0x4c,\n  0xfa, 0x30, 0x2b, 0xc0, 0x69, 0x3d, 0xfd, 0x88, 0xf0, 0xc7, 0x9c, 0xbd,\n  0x15, 0xb3, 0x75, 0x25, 0xf1, 0x78, 0x7c, 0xd2, 0xdb, 0x19, 0x09, 0x9e,\n  0x91, 0x96, 0x7e, 0x50, 0x03, 0xac, 0x07, 0xab, 0x05, 0x5e, 0x0b, 0xfc,\n  0x12, 0xf0, 0x4b, 0xc0, 0xdf, 0x47, 0x7f, 0x75, 0x13, 0x6f, 0xca, 0xf1,\n  0x0f, 0xdc, 0x23, 0x71, 0xf6, 0x2e, 0x28, 0x1b, 0x81, 0x1f, 0x45, 0xaf,\n  0xfd, 0x08, 0xfc, 0x34, 0xff, 0x95, 0xe0, 0x6b, 0xc0, 0x1f, 0x00, 0xfd,\n  0x61, 0x70, 0x96, 0x03, 0x3a, 0x51, 0x83, 0x0a, 0xfc, 0x2d, 0xf0, 0xfc,\n  0x04, 0xca, 0x07, 0xc0, 0xcf, 0xa1, 0xec, 0x14, 0x94, 0x9a, 0x02, 0xca,\n  0x3b, 0x12, 0xfa, 0x6a, 0xd9, 0x53, 0x84, 0xf7, 0x03, 0xe5, 0x5e, 0xc0,\n  0x8f, 0xc0, 0xf3, 0x05, 0xea, 0x59, 0x02, 0xca, 0xcb, 0xa0, 0x0c, 0xb0,\n  0x64, 0x00, 0xdc, 0x2d, 0x6b, 0xe3, 0x29, 0xa8, 0x3f, 0x43, 0x52, 0x44,\n  0x29, 0xf8, 0xbf, 0xc2, 0xdd, 0xdf, 0xc0, 0xff, 0x1b, 0x28, 0x67, 0x40,\n  0xf1, 0x81, 0xe2, 0x05, 0xe5, 0x27, 0x50, 0xbc, 0x90, 0xe7, 0x53, 0xd0,\n  0x3f, 0x05, 0xe5, 0x30, 0xee, 0xce, 0x03, 0xfe, 0x01, 0xe8, 0x87, 0x40,\n  0x59, 0x06, 0xca, 0xe3, 0xa0, 0x3c, 0x0e, 0xca, 0x40, 0x9b, 0xf2, 0x2b,\n  0x74, 0x92, 0x80, 0xa8, 0x47, 0xd2, 0xad, 0x1a, 0xb2, 0x20, 0x55, 0x2e,\n  0xa4, 0xaa, 0x01, 0xa5, 0x0a, 0xe3, 0xff, 0x09, 0xcc, 0x85, 0x28, 0xdc,\n  0x8d, 0x02, 0xe5, 0x5d, 0x94, 0xfd, 0x1c, 0x73, 0xb6, 0x2b, 0xe6, 0xd1,\n  0xf3, 0xa0, 0x3c, 0x06, 0xca, 0x18, 0x50, 0xde, 0x90, 0x33, 0x8b, 0x0f,\n  0x07, 0xff, 0xa3, 0x80, 0x0f, 0x03, 0x6e, 0x04, 0xe7, 0xad, 0xc0, 0xfb,\n  0xb3, 0x9d, 0x12, 0x5a, 0x77, 0x51, 0x7f, 0x5f, 0xd4, 0xd0, 0x0c, 0x78,\n  0x31, 0x9e, 0x3b, 0x1b, 0x77, 0x5f, 0xc5, 0x3c, 0x9d, 0x87, 0xb2, 0xf3,\n  0x40, 0x39, 0x6c, 0x41, 0x50, 0x0e, 0xe3, 0xee, 0xc7, 0xe0, 0xb7, 0xee,\n  0xde, 0x0c, 0xfa, 0x48, 0xb1, 0x1b, 0x5a, 0x92, 0x70, 0x36, 0x78, 0x0e,\n  0xa2, 0xe6, 0x59, 0x5c, 0xfa, 0xb7, 0x79, 0xe0, 0x49, 0x02, 0xa5, 0x35,\n  0x4a, 0xdd, 0x0b, 0xca, 0xbd, 0xc0, 0x7f, 0x01, 0xfe, 0xbe, 0x9c, 0xf5,\n  0x14, 0xf7, 0xfd, 0x00, 0xef, 0x68, 0x15, 0xbc, 0xa3, 0x61, 0x88, 0x5e,\n  0x25, 0xcf, 0x2b, 0xe0, 0x79, 0x05, 0xed, 0x3d, 0x05, 0xca, 0x63, 0xe0,\n  0x79, 0x0c, 0x3c, 0xfd, 0x40, 0xe9, 0xe5, 0xdb, 0x26, 0xed, 0x0f, 0xa0,\n  0x8f, 0x7d, 0x2d, 0x57, 0x4f, 0xe0, 0xf7, 0x5a, 0x50, 0x52, 0x78, 0x6b,\n  0xd0, 0x7f, 0x01, 0xe5, 0x7d, 0x3e, 0x41, 0x3e, 0x51, 0x42, 0x76, 0x1f,\n  0x6c, 0xc5, 0x7d, 0xe0, 0xe9, 0x04, 0x9e, 0x57, 0x41, 0x39, 0x65, 0x41,\n  0x50, 0x60, 0xab, 0xe9, 0xb9, 0x92, 0xa7, 0x1f, 0xe0, 0x57, 0x98, 0x4d,\n  0x5f, 0x8b, 0x46, 0x58, 0x17, 0x14, 0xb9, 0xfa, 0x2b, 0x0a, 0xac, 0x96,\n  0x17, 0xa3, 0xee, 0x32, 0xe2, 0x35, 0xb9, 0xee, 0x94, 0x58, 0xf6, 0x04,\n  0xad, 0x78, 0x07, 0xd2, 0x6e, 0xb3, 0x57, 0x10, 0xe9, 0x21, 0x2c, 0xf0,\n  0xc9, 0xb9, 0x76, 0xbd, 0xf8, 0x5d, 0x8e, 0x01, 0xf0, 0x3c, 0x85, 0x76,\n  0x65, 0x83, 0xf3, 0x21, 0x50, 0x1e, 0xb2, 0x7a, 0x07, 0xfa, 0xb9, 0x0b,\n  0x94, 0xbb, 0x40, 0x19, 0x61, 0x6b, 0xf2, 0x07, 0x8c, 0x67, 0x09, 0x6f,\n  0x04, 0xfd, 0x25, 0xa9, 0x1f, 0x3e, 0x0e, 0xf8, 0x41, 0xb6, 0x81, 0x60,\n  0x11, 0xe0, 0x41, 0xf4, 0xce, 0x72, 0x7b, 0x2d, 0x90, 0x77, 0xc7, 0x02,\n  0x1f, 0x0b, 0xbc, 0x27, 0x34, 0xdc, 0x83, 0xad, 0x27, 0xd8, 0x4d, 0x7c,\n  0x47, 0x70, 0x25, 0xee, 0xae, 0x94, 0x77, 0x05, 0xec, 0x3c, 0xf9, 0x18,\n  0xab, 0xe0, 0x63, 0x58, 0x35, 0xcb, 0x5e, 0x78, 0x1b, 0x3c, 0x6f, 0xe3,\n  0xee, 0xb5, 0xa0, 0x9f, 0x02, 0xfd, 0x14, 0x6a, 0xdb, 0x0c, 0x7c, 0xb3,\n  0x55, 0x3f, 0xf0, 0x9e, 0x90, 0x73, 0x36, 0xf0, 0xd9, 0x18, 0x33, 0x2f,\n  0xa0, 0x86, 0x83, 0xa8, 0x61, 0x92, 0x3d, 0x0e, 0x13, 0xd0, 0x5e, 0xb4,\n  0x05, 0xf0, 0x0d, 0x50, 0xde, 0x00, 0xbe, 0x03, 0xf8, 0x0e, 0xe0, 0x7e,\n  0xc0, 0xb7, 0x60, 0x74, 0x45, 0x82, 0xb2, 0x01, 0x35, 0x6f, 0x00, 0xbe,\n  0x97, 0xbc, 0x72, 0x82, 0xc0, 0xb7, 0x83, 0xbe, 0xdd, 0xae, 0xf3, 0x07,\n  0xcc, 0x29, 0x09, 0x5b, 0xa1, 0x1f, 0xcb, 0xe0, 0x89, 0xb5, 0x42, 0x74,\n  0x53, 0x06, 0xd8, 0xca, 0x37, 0x09, 0x91, 0xf8, 0x21, 0x50, 0x26, 0x22,\n  0x2f, 0x74, 0x11, 0x31, 0xc5, 0x45, 0x64, 0x36, 0x02, 0x11, 0xd7, 0xc0,\n  0x2f, 0x05, 0x1e, 0x0b, 0x1f, 0xb2, 0x37, 0x6a, 0x1b, 0x87, 0xda, 0x7a,\n  0xa3, 0x9e, 0x54, 0xc0, 0xde, 0xa8, 0x2d, 0x15, 0xb0, 0x37, 0xf8, 0x91,\n  0xd5, 0x21, 0xbc, 0x39, 0xd5, 0xf9, 0x1a, 0x9e, 0x32, 0x09, 0xf9, 0xc3,\n  0x54, 0x49, 0x21, 0xff, 0x76, 0x35, 0xd6, 0xca, 0xa3, 0xc0, 0x37, 0x02,\n  0xff, 0x0e, 0x7e, 0x5d, 0x73, 0xe4, 0x51, 0xdb, 0x01, 0xaf, 0x04, 0x1e,\n  0x08, 0x9e, 0xdb, 0x41, 0x09, 0x04, 0xa7, 0xf4, 0x60, 0x1d, 0x56, 0x9e,\n  0x19, 0x92, 0xfc, 0x8c, 0xf5, 0xf1, 0x32, 0xea, 0xb9, 0x4d, 0xfa, 0xea,\n  0xc2, 0xca, 0xf9, 0x34, 0x82, 0xc7, 0x3e, 0x03, 0xd9, 0xd1, 0x45, 0xca,\n  0x8b, 0x32, 0x1e, 0x81, 0xb4, 0x45, 0x80, 0x33, 0x90, 0x5b, 0x58, 0xa4,\n  0x3c, 0x0d, 0x7a, 0x20, 0xe8, 0x81, 0xc0, 0xe5, 0x73, 0x67, 0x58, 0xf1,\n  0x17, 0xb2, 0x3a, 0xbb, 0x7d, 0x1d, 0x10, 0xe7, 0x4a, 0xb8, 0x5b, 0xc6,\n  0x14, 0x14, 0xff, 0xca, 0x98, 0xa2, 0xa7, 0xe5, 0x99, 0xc3, 0x67, 0xee,\n  0x84, 0x3a, 0xdd, 0x80, 0x9d, 0xa0, 0x07, 0xb7, 0x6f, 0x14, 0x32, 0xc3,\n  0x7d, 0x90, 0x13, 0xae, 0x01, 0xe7, 0x12, 0xb4, 0x68, 0x06, 0x28, 0x53,\n  0x81, 0x37, 0x07, 0x5e, 0x82, 0x0c, 0xde, 0x3a, 0x64, 0xf0, 0xa4, 0xb7,\n  0x7c, 0x00, 0xf5, 0x7c, 0x04, 0x38, 0x0f, 0xf4, 0x42, 0xd0, 0xe7, 0x81,\n  0x52, 0x68, 0xd1, 0x65, 0xfd, 0x84, 0xc3, 0x5e, 0x41, 0x6f, 0x85, 0x80,\n  0xcb, 0x1c, 0x29, 0xf0, 0xb4, 0xa7, 0x01, 0x77, 0x00, 0xef, 0x0e, 0x0f,\n  0x7c, 0x35, 0xbc, 0xf1, 0xa3, 0xc0, 0x37, 0x02, 0xff, 0x0e, 0xb3, 0x78,\n  0x2f, 0xac, 0xb4, 0x17, 0xf8, 0x3a, 0xe0, 0x5f, 0x21, 0x8e, 0x58, 0x87,\n  0xec, 0x74, 0x0d, 0xf0, 0x3e, 0xc8, 0x51, 0xd7, 0x20, 0xb2, 0xd8, 0x01,\n  0xfa, 0x18, 0x50, 0xa6, 0x20, 0x33, 0xb0, 0x17, 0x74, 0x59, 0x43, 0x9c,\n  0x7c, 0x22, 0x3b, 0x8b, 0x27, 0x72, 0x94, 0x8d, 0x83, 0xfe, 0xcf, 0xda,\n  0x65, 0xbf, 0x42, 0x4e, 0x5b, 0x52, 0x36, 0x52, 0x9c, 0x24, 0xbd, 0x97,\n  0x1a, 0xc4, 0xd4, 0x35, 0xc0, 0xa7, 0x01, 0x9f, 0x04, 0xbc, 0x39, 0x70,\n  0xe9, 0xf3, 0x6c, 0x84, 0xaf, 0x38, 0xc5, 0xd7, 0x0d, 0x79, 0x80, 0x6e,\n  0x88, 0x65, 0xd6, 0x40, 0x27, 0x5f, 0x22, 0x27, 0xd0, 0x1c, 0x11, 0x68,\n  0x21, 0x22, 0x3e, 0x64, 0xdd, 0xd1, 0xf6, 0xc9, 0x68, 0x7b, 0x21, 0x24,\n  0xc9, 0x41, 0x14, 0x7f, 0x19, 0xfc, 0x39, 0x78, 0x56, 0x8e, 0x35, 0x66,\n  0x80, 0xbf, 0x8b, 0x96, 0xde, 0x04, 0xd9, 0x0e, 0x59, 0x14, 0xc4, 0x74,\n  0x2b, 0x31, 0x06, 0x96, 0x59, 0xe3, 0x1c, 0x3c, 0x2a, 0x78, 0xd2, 0x30,\n  0xf6, 0x52, 0xe5, 0xf8, 0x11, 0x56, 0x84, 0xae, 0x22, 0xcb, 0x54, 0x6b,\n  0xe5, 0x10, 0xd0, 0x3a, 0x1f, 0x38, 0x93, 0xa1, 0x99, 0x1f, 0xa1, 0x99,\n  0x46, 0x68, 0xe9, 0x79, 0xd4, 0xd6, 0x08, 0x35, 0x24, 0xa3, 0xec, 0xc3,\n  0xf0, 0x46, 0x3e, 0x84, 0x15, 0xdd, 0x08, 0x69, 0x6f, 0x92, 0xb9, 0x7d,\n  0xe1, 0x05, 0x7d, 0xb0, 0x15, 0xd7, 0x20, 0xdb, 0x6f, 0x65, 0x9e, 0xa3,\n  0xe4, 0x2f, 0x6a, 0xb0, 0x0f, 0xd0, 0x83, 0xf7, 0x5b, 0xf9, 0x37, 0x44,\n  0xcd, 0x33, 0x51, 0xdb, 0x7a, 0x50, 0x56, 0x81, 0xd2, 0x17, 0x94, 0x0d,\n  0xa0, 0xac, 0x93, 0xbf, 0x9c, 0xc1, 0x4d, 0xe4, 0x1c, 0xae, 0x07, 0x65,\n  0x11, 0x78, 0xc6, 0x01, 0x06, 0xda, 0xb9, 0x5c, 0x89, 0x23, 0x8b, 0x25,\n  0xdc, 0xa0, 0x04, 0x02, 0xff, 0x0d, 0x90, 0x83, 0xe2, 0x02, 0x6e, 0x65,\n  0xbd, 0x9e, 0x41, 0x9c, 0x1b, 0x0b, 0xfc, 0x79, 0xcc, 0xee, 0x57, 0x50,\n  0xf3, 0xeb, 0xd0, 0x9e, 0x95, 0x4f, 0x7b, 0x5d, 0xd2, 0x45, 0x27, 0x94,\n  0xad, 0x06, 0xdd, 0x92, 0xb6, 0x1a, 0xf4, 0x76, 0xa0, 0x23, 0x67, 0xab,\n  0xdc, 0x0b, 0x7a, 0x05, 0xe8, 0x3d, 0x50, 0xf3, 0x3e, 0x50, 0x7a, 0x83,\n  0x52, 0x05, 0x4e, 0x64, 0x6b, 0x95, 0x87, 0x40, 0xef, 0x0a, 0x3a, 0x72,\n  0xec, 0x62, 0x08, 0x7e, 0x17, 0xe4, 0x39, 0xd0, 0xfb, 0x49, 0x9c, 0xe6,\n  0xb5, 0x6c, 0x69, 0x02, 0xe4, 0xb1, 0x32, 0xb7, 0x88, 0xe3, 0xf8, 0x1e,\n  0xe0, 0xdb, 0x80, 0x6f, 0x03, 0x7f, 0x21, 0x28, 0x88, 0x46, 0x45, 0x4f,\n  0xe0, 0x2f, 0x42, 0x57, 0x88, 0x49, 0xf9, 0x4b, 0xc0, 0x1f, 0xb1, 0xbd,\n  0x62, 0xe4, 0x6d, 0xd0, 0xd2, 0x43, 0xe0, 0x1f, 0x0a, 0x39, 0x31, 0x5a,\n  0xc4, 0x10, 0xc8, 0x83, 0xec, 0xb1, 0xf2, 0x16, 0x28, 0x99, 0xe0, 0xc9,\n  0x80, 0xcc, 0x1b, 0x40, 0xc9, 0x00, 0x0f, 0x7a, 0x5f, 0x64, 0x82, 0xbe,\n  0xd1, 0xe2, 0x44, 0x9d, 0x05, 0x90, 0xf9, 0x1e, 0xdc, 0xdd, 0x0d, 0x7a,\n  0x01, 0x6a, 0x6b, 0x05, 0xbc, 0x03, 0xe8, 0x1d, 0x50, 0x0a, 0x7a, 0x10,\n  0xd3, 0xd0, 0xea, 0x6b, 0xad, 0x51, 0x04, 0x09, 0x1f, 0xb6, 0xfa, 0x02,\n  0xf8, 0xf3, 0xe0, 0xc1, 0x8e, 0x86, 0xe8, 0x6d, 0x41, 0x50, 0x10, 0x47,\n  0x0b, 0xc4, 0xd1, 0xa2, 0x29, 0xf0, 0xa6, 0xc0, 0x1b, 0x03, 0x6f, 0x2c,\n  0xeb, 0x14, 0x5d, 0x2d, 0x6d, 0x43, 0x93, 0xe7, 0x51, 0x9b, 0x29, 0x57,\n  0x7c, 0xb6, 0x08, 0xeb, 0x7e, 0x13, 0x09, 0x85, 0x15, 0x27, 0x36, 0x91,\n  0x5e, 0x3d, 0xc5, 0x83, 0x97, 0x61, 0x25, 0x90, 0x7f, 0x56, 0x06, 0x92,\n  0x54, 0x15, 0xa8, 0xe1, 0x37, 0xf8, 0xf0, 0x13, 0x21, 0x33, 0xa2, 0x45,\n  0x65, 0x34, 0x28, 0xb3, 0x41, 0xb9, 0x0b, 0x94, 0x1a, 0x50, 0x90, 0x09,\n  0x57, 0xee, 0xb6, 0x33, 0x27, 0x92, 0x32, 0x1c, 0x52, 0x8d, 0xb6, 0xc6,\n  0x0c, 0xe8, 0xd8, 0x49, 0x11, 0x63, 0xd0, 0xc6, 0x0a, 0x3c, 0xab, 0x42,\n  0x3e, 0xcb, 0xe1, 0x87, 0xbb, 0xcf, 0x23, 0xf7, 0x02, 0xad, 0xf2, 0x43,\n  0x52, 0x9f, 0x0e, 0xec, 0xec, 0x28, 0x4f, 0x82, 0x6e, 0xcd, 0xb5, 0x57,\n  0x40, 0x47, 0x86, 0xc7, 0xd1, 0x15, 0x74, 0x64, 0xb9, 0xc5, 0x00, 0xd0,\n  0xb7, 0x80, 0xde, 0x05, 0xf4, 0x27, 0x2d, 0xed, 0x49, 0xba, 0x02, 0xad,\n  0x8a, 0x1a, 0xf0, 0xec, 0x04, 0x4f, 0x1f, 0xf0, 0xbc, 0x08, 0xfa, 0x08,\n  0xd0, 0x37, 0x83, 0x5e, 0x0d, 0xfa, 0x13, 0xd6, 0x38, 0x44, 0x9f, 0x2e,\n  0x81, 0x9c, 0x4b, 0x20, 0x67, 0x24, 0xe4, 0x39, 0x28, 0x79, 0x1c, 0xe9,\n  0xc0, 0x3f, 0x02, 0xfe, 0x28, 0xca, 0x22, 0xfe, 0x72, 0x60, 0x47, 0xc6,\n  0x51, 0x01, 0xfc, 0x4e, 0xe0, 0x1d, 0x81, 0x2f, 0x07, 0xde, 0x02, 0xf8,\n  0x3a, 0xe0, 0xe5, 0xd0, 0x7f, 0xb1, 0x95, 0xf9, 0x81, 0x4d, 0x2e, 0xb6,\n  0x29, 0x97, 0x91, 0x7b, 0x4c, 0x05, 0xfe, 0x25, 0xf2, 0x33, 0xb7, 0x03,\n  0xf6, 0x91, 0xda, 0xc6, 0x73, 0x39, 0x6c, 0xcb, 0x42, 0x4b, 0x87, 0x28,\n  0x55, 0x81, 0x52, 0x15, 0xe0, 0x9f, 0x81, 0x1e, 0xbf, 0xd6, 0x1a, 0xd5,\n  0x80, 0x56, 0xe6, 0x1f, 0x71, 0x3d, 0x7f, 0x01, 0x3d, 0x12, 0x67, 0xcd,\n  0x1a, 0xb4, 0xf1, 0x20, 0x28, 0x18, 0xe7, 0xfc, 0x20, 0x34, 0x86, 0x5d,\n  0x42, 0x65, 0x0c, 0xfa, 0x0b, 0xb3, 0x83, 0xcf, 0xb0, 0x56, 0x7f, 0xf9,\n  0x44, 0x1a, 0x45, 0xdf, 0x00, 0xee, 0xc0, 0x3c, 0x35, 0x80, 0x7f, 0x09,\n  0x7c, 0x20, 0xf2, 0x5d, 0x32, 0x7f, 0xb5, 0x1b, 0xf6, 0x70, 0x37, 0x32,\n  0x6f, 0xd8, 0x83, 0xe3, 0xd6, 0x1e, 0xdc, 0x3d, 0x80, 0xd8, 0x7b, 0xe2,\n  0xbb, 0xad, 0xbd, 0x1b, 0xb4, 0xa2, 0x25, 0x60, 0xb6, 0xac, 0x81, 0x46,\n  0xe3, 0x37, 0x80, 0x3b, 0x30, 0xa7, 0x0c, 0x39, 0x4a, 0xb1, 0xb2, 0x37,\n  0x01, 0x4f, 0x01, 0xda, 0x58, 0x00, 0xce, 0x18, 0x68, 0x26, 0x06, 0x4f,\n  0x79, 0x10, 0x75, 0x3e, 0x88, 0xf6, 0x3e, 0x86, 0x9a, 0xf7, 0x81, 0x62,\n  0x59, 0xa1, 0x67, 0x40, 0x59, 0x82, 0x51, 0x6d, 0x45, 0xeb, 0xfe, 0xd0,\n  0xd8, 0x12, 0x68, 0x6f, 0x09, 0xf0, 0x65, 0xd0, 0xf9, 0x12, 0xd4, 0xff,\n  0x21, 0x74, 0x82, 0xd9, 0xca, 0x3f, 0x44, 0xdb, 0x77, 0x81, 0x62, 0xd9,\n  0xa2, 0x5d, 0xa0, 0x20, 0x67, 0xc8, 0x61, 0x2b, 0x38, 0xb2, 0xa6, 0xfc,\n  0x3e, 0xf0, 0x60, 0x07, 0x53, 0x59, 0x6d, 0xed, 0x27, 0x62, 0xde, 0x2d,\n  0x85, 0xde, 0x9e, 0x80, 0x67, 0x5e, 0x05, 0x8f, 0xfd, 0x29, 0xe0, 0xc3,\n  0x81, 0xbf, 0x02, 0x9f, 0xff, 0x55, 0x50, 0x66, 0x5b, 0x1e, 0x3e, 0x2b,\n  0x95, 0x59, 0x08, 0xd0, 0x1f, 0x00, 0xbd, 0x33, 0xe8, 0x4f, 0x80, 0xf2,\n  0x28, 0x70, 0x58, 0x09, 0x86, 0x59, 0x43, 0xeb, 0x51, 0x16, 0xfc, 0xa5,\n  0x58, 0x19, 0x71, 0x5b, 0xa3, 0x08, 0x1a, 0x8b, 0x42, 0x9e, 0x2d, 0xca,\n  0xce, 0x7b, 0xe7, 0x61, 0x2d, 0xbe, 0x08, 0xdf, 0x12, 0xb9, 0x62, 0xcc,\n  0xfd, 0xb9, 0xd6, 0x8e, 0x92, 0xed, 0x2f, 0x55, 0xc0, 0xff, 0x29, 0x87,\n  0xff, 0x23, 0xf1, 0x78, 0xe0, 0xf1, 0x58, 0x6d, 0x7f, 0x94, 0x14, 0x5a,\n  0x0d, 0x23, 0xb1, 0x03, 0x28, 0xe1, 0x5a, 0xb4, 0x7a, 0xad, 0x95, 0x8b,\n  0xb3, 0xa2, 0x06, 0x3b, 0x13, 0x02, 0x19, 0x94, 0xf1, 0x80, 0xcb, 0x31,\n  0x36, 0xc6, 0x03, 0x2e, 0x47, 0xdf, 0x8d, 0x07, 0xb4, 0xe8, 0xd2, 0x7b,\n  0xc9, 0x47, 0x3d, 0x05, 0xc0, 0xc7, 0x21, 0x1f, 0x38, 0xce, 0xce, 0x8d,\n  0x97, 0x21, 0xdb, 0x20, 0xf1, 0xdb, 0xec, 0x3c, 0x92, 0xac, 0x79, 0x9d,\n  0xb5, 0x26, 0x5a, 0xeb, 0x23, 0x5a, 0xfa, 0x1a, 0x28, 0x4f, 0x5a, 0x10,\n  0x3c, 0xd6, 0xba, 0x80, 0xbd, 0x51, 0x6e, 0xed, 0x8d, 0xfe, 0x8e, 0xfd,\n  0xb5, 0xdf, 0xed, 0x52, 0x72, 0x97, 0x6d, 0x03, 0x46, 0x78, 0x32, 0xf6,\n  0x07, 0x2d, 0x0b, 0xb3, 0x1f, 0xf4, 0xfd, 0xe0, 0x9f, 0x85, 0xb6, 0xcf,\n  0x02, 0xbd, 0x39, 0xbc, 0xca, 0xe6, 0xa0, 0x4f, 0x02, 0xdd, 0xda, 0x73,\n  0x2f, 0x05, 0xbd, 0x14, 0x5a, 0x3d, 0xe0, 0xf3, 0x48, 0x68, 0x65, 0x63,\n  0xf0, 0xdc, 0x11, 0xc0, 0x3d, 0xc0, 0x3d, 0xd0, 0xe1, 0xb5, 0xc0, 0xa7,\n  0x58, 0xfb, 0x0b, 0xd6, 0x2e, 0xa1, 0x05, 0x31, 0x66, 0xe0, 0x15, 0x2b,\n  0xd8, 0x17, 0x70, 0xe0, 0xb9, 0x8a, 0x22, 0x47, 0x1a, 0xbb, 0x60, 0xed,\n  0x61, 0x61, 0x24, 0x77, 0xb4, 0xf6, 0x43, 0x81, 0x5b, 0xab, 0x0f, 0x6c,\n  0x91, 0x28, 0x00, 0xbf, 0xc7, 0xf6, 0x79, 0x7a, 0xcb, 0x28, 0x00, 0x74,\n  0x6b, 0x7f, 0x6a, 0x1e, 0x9e, 0xcb, 0xed, 0xfc, 0xbf, 0x2c, 0x85, 0xec,\n  0x31, 0x3f, 0x06, 0xca, 0x71, 0x94, 0xc5, 0x8e, 0x39, 0x3f, 0x8e, 0xb1,\n  0x9d, 0x00, 0x3c, 0xc9, 0xca, 0x50, 0x59, 0x10, 0x9c, 0xe1, 0xb8, 0xdb,\n  0x12, 0x5e, 0xcd, 0x2d, 0xa0, 0x4f, 0xb4, 0x9f, 0x88, 0x88, 0x03, 0x35,\n  0x7f, 0x63, 0xed, 0x3c, 0x02, 0x8f, 0x44, 0xab, 0x77, 0xcb, 0x99, 0xc5,\n  0xac, 0xf9, 0xde, 0xd6, 0x2a, 0x05, 0xd9, 0xe0, 0x69, 0xb0, 0x35, 0xf0,\n  0xb2, 0x56, 0x29, 0x7b, 0x00, 0x25, 0xbe, 0x1a, 0xbe, 0xd6, 0x75, 0xa0,\n  0xac, 0x81, 0x3d, 0xb9, 0x01, 0x35, 0xac, 0x52, 0x6e, 0x95, 0x14, 0xe9,\n  0xc9, 0xf3, 0x30, 0xdc, 0xfd, 0x0e, 0x3d, 0x92, 0x0b, 0xfd, 0x67, 0x58,\n  0xbb, 0xc3, 0x98, 0x17, 0xbf, 0x02, 0x47, 0x14, 0xcc, 0xbe, 0x02, 0x0f,\n  0x76, 0x58, 0x78, 0x34, 0x70, 0x17, 0x70, 0x97, 0x35, 0x92, 0x81, 0x0b,\n  0xd4, 0x90, 0x08, 0xa9, 0x6e, 0x86, 0xbf, 0x7a, 0x0e, 0x39, 0x5b, 0xac,\n  0xe6, 0xec, 0x1e, 0xeb, 0x34, 0x0b, 0x38, 0x9b, 0x60, 0x8d, 0x68, 0x84,\n  0x3c, 0xe7, 0x7a, 0xf0, 0xf4, 0xe4, 0xfd, 0x09, 0x6e, 0x02, 0xc4, 0xc9,\n  0x10, 0xf6, 0x0f, 0xf0, 0x17, 0x22, 0x3b, 0x5d, 0x20, 0xfe, 0x90, 0x6b,\n  0x3d, 0x6a, 0x9e, 0x86, 0xb2, 0x58, 0x7d, 0xf8, 0xe3, 0x88, 0xca, 0x5f,\n  0x92, 0x11, 0xba, 0xb2, 0x06, 0xe3, 0xf0, 0x06, 0xcc, 0x47, 0x19, 0x07,\n  0x4a, 0x0f, 0x30, 0x19, 0xbb, 0xfc, 0x92, 0xde, 0xc5, 0xda, 0x55, 0xc4,\n  0xb3, 0x6e, 0x80, 0x9e, 0xab, 0xac, 0xfd, 0x7d, 0xd0, 0xad, 0x5c, 0xe2,\n  0x4f, 0x22, 0x4e, 0xfa, 0xc3, 0x78, 0x3a, 0xce, 0x69, 0x70, 0x4b, 0x33,\n  0x05, 0xe0, 0x2f, 0x40, 0xeb, 0x52, 0x21, 0x4f, 0x96, 0x48, 0x92, 0xb8,\n  0xbd, 0x8b, 0x24, 0x63, 0xc6, 0x46, 0xb8, 0x5b, 0x60, 0xd5, 0x0f, 0xfa,\n  0x47, 0xf6, 0x19, 0x0c, 0x29, 0xed, 0x2c, 0xd4, 0x83, 0xb5, 0x8f, 0x62,\n  0x58, 0x89, 0xc3, 0xd3, 0x20, 0x0f, 0xfc, 0x33, 0xa9, 0x73, 0xe0, 0x56,\n  0x56, 0x39, 0x0b, 0xcf, 0x6a, 0x04, 0xd9, 0xac, 0x13, 0x14, 0x96, 0x17,\n  0x1a, 0x04, 0xfb, 0x63, 0x65, 0x44, 0x6f, 0xb2, 0xb2, 0xe5, 0xb8, 0xfb,\n  0x04, 0xa0, 0x35, 0x23, 0xca, 0x91, 0x43, 0x6e, 0x0c, 0xbd, 0x61, 0x2d,\n  0xe6, 0x9b, 0x71, 0x17, 0x3e, 0x18, 0xcf, 0x04, 0x5d, 0x41, 0xfd, 0x0a,\n  0x6a, 0x58, 0x6e, 0xe7, 0xdb, 0x2f, 0x22, 0xd3, 0x25, 0xa1, 0xa5, 0xbd,\n  0xb6, 0xb6, 0xdd, 0x4b, 0x85, 0xdd, 0x93, 0x35, 0x58, 0x7b, 0x0a, 0x8d,\n  0x41, 0x89, 0x83, 0x6c, 0x56, 0x5e, 0x74, 0x31, 0x28, 0xe9, 0x80, 0x85,\n  0xa0, 0x37, 0x03, 0xfd, 0x41, 0xf8, 0xe7, 0x73, 0x94, 0x20, 0xc0, 0x74,\n  0x39, 0x67, 0xc5, 0x69, 0x09, 0x15, 0x95, 0xa0, 0x47, 0x09, 0x23, 0x78,\n  0x8d, 0x38, 0x88, 0x2c, 0x81, 0xd4, 0xf6, 0x5c, 0x45, 0x20, 0xef, 0x54,\n  0x82, 0x4c, 0x9a, 0x84, 0xf0, 0x82, 0xd8, 0x39, 0x59, 0x96, 0x2c, 0x6d,\n  0x09, 0x76, 0x34, 0x24, 0xd4, 0x64, 0xcd, 0x5c, 0xfe, 0x0e, 0x9f, 0x84,\n  0xc9, 0xc8, 0x97, 0x9e, 0x06, 0x1e, 0x06, 0xfc, 0xa0, 0x84, 0x90, 0x47,\n  0xb3, 0xf9, 0x7b, 0x01, 0xde, 0x07, 0xa8, 0x60, 0x87, 0x5a, 0xd2, 0xc7,\n  0x02, 0x0e, 0x86, 0x66, 0x06, 0xa3, 0x4e, 0x78, 0x4a, 0x64, 0xd9, 0x4a,\n  0x30, 0xea, 0xa4, 0x06, 0x0a, 0x41, 0x69, 0x2e, 0x7e, 0x46, 0x16, 0x51,\n  0xd2, 0x53, 0xe4, 0x13, 0xa9, 0x8d, 0xc0, 0x79, 0xbc, 0x84, 0xe0, 0x49,\n  0x81, 0xcc, 0xe7, 0xd0, 0xea, 0x73, 0xc8, 0x08, 0x9d, 0x93, 0x9c, 0xec,\n  0x1c, 0x5a, 0x7d, 0x4e, 0x71, 0x02, 0x86, 0x81, 0x72, 0x10, 0x27, 0x3a,\n  0x52, 0x81, 0x97, 0x20, 0x72, 0x91, 0x65, 0xdf, 0x43, 0x7b, 0x4f, 0x81,\n  0xb2, 0x1a, 0xb0, 0xd4, 0x82, 0x68, 0x69, 0x29, 0x5a, 0x5a, 0x89, 0xd3,\n  0x4a, 0xa5, 0x42, 0x66, 0x06, 0x2a, 0xed, 0x5d, 0x75, 0x92, 0x4d, 0x94,\n  0x80, 0x33, 0x07, 0xb2, 0xb5, 0xb3, 0x70, 0x29, 0x1b, 0x5b, 0x0b, 0x79,\n  0xd6, 0x42, 0x9e, 0xb5, 0x90, 0x67, 0x2d, 0xe4, 0x59, 0x0b, 0x79, 0xd6,\n  0x42, 0x63, 0xaa, 0x6f, 0x38, 0x62, 0xb7, 0x12, 0xdc, 0x95, 0xb2, 0xad,\n  0x85, 0x6c, 0x6b, 0x2d, 0x0a, 0xa4, 0x5a, 0x0b, 0xbd, 0x05, 0x80, 0x32,\n  0x5b, 0xf2, 0xb3, 0xd9, 0xa8, 0xed, 0x23, 0xab, 0x5f, 0x20, 0x89, 0x01,\n  0xd9, 0x82, 0x40, 0x39, 0x61, 0x71, 0xe2, 0xe9, 0x3f, 0xe3, 0x9c, 0xd5,\n  0xcf, 0xa8, 0x67, 0x36, 0xe8, 0x3f, 0x02, 0x7e, 0x0e, 0x09, 0x3f, 0x07,\n  0xfd, 0x73, 0x94, 0x9a, 0x8a, 0x7a, 0xa6, 0x4a, 0x5c, 0xbc, 0x05, 0x4a,\n  0x73, 0xf4, 0x4b, 0x73, 0xb4, 0xbd, 0x39, 0xea, 0x6f, 0x0e, 0x69, 0x9b,\n  0x5b, 0x77, 0xad, 0xde, 0x91, 0xb2, 0x89, 0x01, 0xa0, 0x94, 0x80, 0xbf,\n  0x04, 0x1a, 0x2b, 0xc1, 0xa8, 0x28, 0x41, 0x1b, 0x4b, 0x50, 0x43, 0x09,\n  0xc6, 0x46, 0x1b, 0xd1, 0x1a, 0x14, 0x79, 0x42, 0x00, 0x59, 0x3b, 0xc2,\n  0x65, 0xeb, 0x4a, 0xd0, 0x9b, 0x18, 0x8d, 0x1c, 0x72, 0x72, 0xb4, 0x8e,\n  0x5d, 0x80, 0x84, 0x17, 0xac, 0xfa, 0x7d, 0xd7, 0xa2, 0x9e, 0x12, 0xac,\n  0x08, 0x25, 0x88, 0x49, 0x83, 0x91, 0x8d, 0xb4, 0x76, 0xa0, 0xa4, 0x4e,\n  0x7c, 0x68, 0xaf, 0x0f, 0xfc, 0x3f, 0x80, 0xe7, 0x38, 0x78, 0x8e, 0x63,\n  0xae, 0x1d, 0x07, 0xe7, 0x71, 0x70, 0x1e, 0x07, 0xe7, 0x71, 0x70, 0x3e,\n  0x62, 0xf5, 0x1a, 0xf8, 0xbf, 0x04, 0x3c, 0x06, 0x9e, 0x63, 0x28, 0x75,\n  0x0c, 0x9c, 0xc7, 0xc0, 0xf3, 0xa0, 0x75, 0x17, 0xd2, 0x66, 0x83, 0x92,\n  0x85, 0xf6, 0x66, 0xa1, 0xbd, 0x59, 0x68, 0x6f, 0x16, 0xda, 0x9b, 0x85,\n  0xf6, 0x66, 0x61, 0x2e, 0x64, 0xd9, 0x9c, 0x72, 0x2e, 0x64, 0xd9, 0x59,\n  0x23, 0xa9, 0x37, 0x0f, 0x6a, 0xf3, 0x42, 0x2a, 0x2f, 0x78, 0x4e, 0x02,\n  0x2e, 0xb6, 0x20, 0xf4, 0xb9, 0x18, 0xb5, 0x2d, 0x46, 0xfd, 0x8b, 0x51,\n  0x76, 0xb1, 0x7c, 0x8a, 0xc0, 0xe8, 0x65, 0xd8, 0xff, 0x65, 0xd6, 0xac,\n  0xf9, 0x02, 0x94, 0xd3, 0x16, 0x44, 0xab, 0x4f, 0xa3, 0x15, 0xa7, 0x31,\n  0xea, 0x70, 0x56, 0x84, 0x28, 0x61, 0x38, 0x4f, 0x52, 0x02, 0x0b, 0x06,\n  0x08, 0xce, 0xb3, 0xe0, 0x3c, 0x0b, 0x9e, 0xb3, 0x72, 0x7c, 0xf2, 0x37,\n  0x71, 0xb7, 0xa7, 0x90, 0xbf, 0x96, 0xbd, 0x49, 0x42, 0xf2, 0x02, 0x65,\n  0x3e, 0x01, 0xfb, 0xfe, 0xec, 0x0b, 0x6b, 0xf5, 0x87, 0x3c, 0x89, 0x58,\n  0x01, 0x43, 0xad, 0x93, 0x27, 0x80, 0xaf, 0x5a, 0xfb, 0x92, 0xd4, 0x9f,\n  0x54, 0xca, 0x86, 0xd2, 0xbb, 0x4b, 0xb6, 0xd7, 0x2c, 0xc9, 0x1f, 0x6c,\n  0x9d, 0x46, 0x80, 0x1f, 0x82, 0xd3, 0x5c, 0x7c, 0x38, 0xee, 0x22, 0xe6,\n  0xe2, 0x07, 0x80, 0x23, 0x6b, 0xa7, 0x5c, 0x83, 0x55, 0xd8, 0xf2, 0x79,\n  0x96, 0x61, 0xed, 0x46, 0x24, 0xc2, 0xfb, 0xa3, 0x6c, 0x7f, 0x8b, 0x0e,\n  0x0a, 0x76, 0xf6, 0xf9, 0x64, 0x5f, 0x01, 0x76, 0xe8, 0x64, 0xa9, 0x27,\n  0x71, 0xbe, 0x0e, 0x91, 0x14, 0x1f, 0x04, 0xdf, 0x66, 0x10, 0xf0, 0xb1,\n  0xc0, 0xc7, 0x42, 0x92, 0x9f, 0xac, 0x53, 0x7f, 0xb0, 0x9c, 0x99, 0x80,\n  0xef, 0x82, 0xb2, 0x08, 0x56, 0xb7, 0x88, 0x21, 0x87, 0x23, 0xe2, 0x31,\n  0x9b, 0xbc, 0xb0, 0x1b, 0x97, 0x88, 0xb2, 0x1d, 0x4f, 0xdc, 0x0e, 0x9e,\n  0xfb, 0xb1, 0xde, 0xdd, 0x2f, 0xa2, 0xa5, 0x8f, 0x04, 0x9f, 0xd3, 0x03,\n  0x7a, 0x12, 0x78, 0x92, 0x2c, 0x4f, 0x0c, 0xb8, 0xb5, 0x12, 0xa5, 0x80,\n  0xa7, 0x05, 0xac, 0x1c, 0xe2, 0x29, 0x51, 0x2a, 0x29, 0xa2, 0xd4, 0x5e,\n  0x83, 0x2a, 0x30, 0x66, 0x22, 0x91, 0x29, 0x92, 0xfe, 0xea, 0xd7, 0xc8,\n  0xc1, 0x7e, 0x8d, 0xcc, 0xea, 0x8b, 0xc0, 0x5f, 0x04, 0x7e, 0x14, 0x72,\n  0x1e, 0xb5, 0x4f, 0xd3, 0x1d, 0xc2, 0xe9, 0xd0, 0x32, 0xb9, 0x1f, 0x8d,\n  0x76, 0xd5, 0x02, 0x5a, 0xbb, 0x69, 0xc8, 0xab, 0xb0, 0x55, 0xd6, 0x79,\n  0x09, 0x94, 0xfa, 0xce, 0x3a, 0xd3, 0x62, 0xd1, 0x95, 0x65, 0x72, 0x6f,\n  0x1a, 0x74, 0xab, 0x07, 0x23, 0x40, 0x3f, 0x0c, 0x4a, 0x0b, 0x71, 0x04,\n  0x5e, 0x87, 0xa4, 0x2c, 0x07, 0x3e, 0x01, 0xf4, 0x25, 0xc0, 0x11, 0x69,\n  0xf2, 0x29, 0xf6, 0x89, 0x91, 0x23, 0x38, 0x49, 0x28, 0x29, 0xab, 0x41,\n  0xd9, 0x8c, 0xdc, 0xc5, 0xe7, 0x76, 0x2e, 0xf4, 0x10, 0x7e, 0x79, 0x5d,\n  0xd2, 0xad, 0x3d, 0xf4, 0x0c, 0xfb, 0xe9, 0xd2, 0x93, 0x5f, 0x05, 0xfa,\n  0x2a, 0x99, 0x91, 0x63, 0x9f, 0x81, 0x8e, 0x4c, 0x0e, 0x7b, 0x05, 0x7a,\n  0xd0, 0xd0, 0x0a, 0x0d, 0x9a, 0x2f, 0xb3, 0xf2, 0xc9, 0xd6, 0x4e, 0x37,\n  0x76, 0x30, 0x4b, 0xac, 0xb5, 0x15, 0xa5, 0xbe, 0xb0, 0xd6, 0x62, 0xc0,\n  0x36, 0xf2, 0x0c, 0x92, 0x50, 0xf1, 0x2c, 0x78, 0x98, 0xdc, 0x3a, 0x59,\n  0x8a, 0x5c, 0x10, 0x47, 0xa6, 0x45, 0x58, 0xe7, 0x52, 0x16, 0xd9, 0x2b,\n  0xbb, 0xa4, 0x20, 0x87, 0xc3, 0xa3, 0x40, 0x89, 0xc5, 0x53, 0xde, 0xb2,\n  0x47, 0x82, 0x35, 0x2a, 0xa4, 0xbf, 0x11, 0x01, 0x7f, 0xa3, 0x10, 0xfe,\n  0xc6, 0x06, 0xdb, 0x97, 0x90, 0x3c, 0xf9, 0xc8, 0x93, 0xe7, 0x23, 0x9f,\n  0x6f, 0x79, 0x68, 0x38, 0x37, 0x28, 0xac, 0xbd, 0xef, 0x0d, 0xd8, 0xbd,\n  0xc5, 0x49, 0x1b, 0xf6, 0x3e, 0x6a, 0x88, 0xc5, 0xba, 0xff, 0x3e, 0xea,\n  0x79, 0x9e, 0xc9, 0x55, 0xf8, 0x80, 0x3c, 0xa3, 0xc8, 0xac, 0x19, 0xf4,\n  0x2a, 0x78, 0xfc, 0xc1, 0xf3, 0x2a, 0x7c, 0x83, 0x4f, 0xe0, 0x53, 0x7d,\n  0xc2, 0x0c, 0x78, 0x47, 0x72, 0xbc, 0x7d, 0x27, 0x4b, 0xf1, 0xde, 0x18,\n  0x81, 0xfd, 0x44, 0x36, 0xce, 0xfb, 0xc9, 0x71, 0x85, 0xb3, 0x07, 0xc2,\n  0x3a, 0x57, 0x56, 0x60, 0xc5, 0x26, 0xd6, 0x3e, 0x35, 0xe2, 0xaf, 0x5e,\n  0x7c, 0xac, 0xdc, 0x47, 0x93, 0x90, 0x1d, 0x44, 0xa4, 0xf6, 0xb0, 0xa4,\n  0xf3, 0xbe, 0xa0, 0xf4, 0x04, 0x4f, 0x4f, 0xe0, 0x8b, 0x2d, 0x8a, 0xe4,\n  0xe1, 0xcd, 0xc0, 0x53, 0x2c, 0x63, 0x37, 0xd1, 0x16, 0x11, 0xdc, 0x41,\n  0x70, 0x1e, 0x44, 0x7c, 0x37, 0x09, 0x94, 0x9e, 0xb0, 0x99, 0x1f, 0x83,\n  0x32, 0x0f, 0x94, 0xcd, 0xe0, 0xd9, 0x0c, 0x4a, 0x1c, 0x28, 0x37, 0x83,\n  0x32, 0x92, 0x67, 0x63, 0x07, 0x30, 0x1b, 0x7e, 0x48, 0x29, 0x34, 0xb0,\n  0x1a, 0x7b, 0x07, 0xa3, 0xb1, 0x5f, 0x99, 0x80, 0xb9, 0xf6, 0x26, 0xea,\n  0x5f, 0x8d, 0xbd, 0x09, 0xb9, 0x63, 0x72, 0x13, 0xe8, 0x37, 0x61, 0xef,\n  0xe3, 0x29, 0xc0, 0x9b, 0xb0, 0xe7, 0x72, 0x1d, 0xe8, 0xd7, 0x81, 0x72,\n  0x94, 0x27, 0xc2, 0x62, 0x4f, 0x24, 0x38, 0x08, 0xf4, 0x41, 0xa8, 0x67,\n  0x25, 0xe0, 0x74, 0x50, 0xf6, 0x59, 0xfb, 0x92, 0xd8, 0x1f, 0x8c, 0x87,\n  0xc6, 0x26, 0xcb, 0xd1, 0xcb, 0xac, 0x68, 0x62, 0x21, 0xc6, 0xd2, 0x36,\n  0xfb, 0x14, 0xae, 0xe4, 0x91, 0x27, 0x4a, 0x39, 0x0b, 0x00, 0x3c, 0x06,\n  0xfa, 0x42, 0xf4, 0x91, 0x95, 0xc7, 0x73, 0xc1, 0x2e, 0xc5, 0x58, 0xe7,\n  0x90, 0x41, 0xc7, 0xce, 0xb2, 0x72, 0x1f, 0xb4, 0x57, 0x60, 0x41, 0x99,\n  0xa1, 0x15, 0x69, 0x5c, 0x66, 0x5f, 0xff, 0xe0, 0xfd, 0x90, 0xb7, 0xa9,\n  0x26, 0x88, 0x9d, 0x62, 0x71, 0x06, 0xb6, 0x0e, 0x31, 0xbb, 0x18, 0x03,\n  0xca, 0xad, 0xa0, 0x20, 0x63, 0x46, 0x5e, 0xe2, 0x57, 0xf0, 0xcd, 0xa4,\n  0x05, 0x46, 0x16, 0x8e, 0x17, 0x5b, 0xd9, 0x21, 0xdc, 0x3d, 0x85, 0xe7,\n  0x66, 0xdb, 0xbe, 0xbd, 0xa4, 0x97, 0x83, 0xbe, 0x42, 0x84, 0xe0, 0xb4,\n  0xe1, 0x25, 0xcc, 0xbe, 0xd3, 0x38, 0x7b, 0xf0, 0xb3, 0xf4, 0x01, 0xb0,\n  0x0a, 0x94, 0x62, 0x7d, 0x19, 0x6e, 0xaf, 0x59, 0xc1, 0xe0, 0xa9, 0x45,\n  0x2e, 0xa2, 0x18, 0xf8, 0x45, 0xc4, 0x50, 0x2f, 0xc8, 0x1e, 0xb1, 0x77,\n  0x8b, 0xa4, 0x1e, 0xe6, 0x40, 0x6f, 0x4b, 0x2c, 0x0b, 0x00, 0x5f, 0x05,\n  0xbb, 0xff, 0xac, 0x37, 0xfa, 0xf4, 0x06, 0xec, 0xb8, 0xf9, 0x63, 0x27,\n  0x68, 0x09, 0x76, 0x2b, 0x96, 0x20, 0xdb, 0x1c, 0x01, 0xd9, 0x22, 0x14,\n  0x0e, 0xeb, 0x17, 0x08, 0x9f, 0x4d, 0x8e, 0xc6, 0x6f, 0x50, 0xcf, 0x37,\n  0x18, 0xa5, 0x73, 0xc1, 0x33, 0x0f, 0x74, 0x9c, 0x81, 0x64, 0xd6, 0x19,\n  0xc8, 0x17, 0x41, 0x7f, 0xd1, 0xda, 0xa3, 0x07, 0xbd, 0x0a, 0xb2, 0xb5,\n  0x01, 0x7e, 0x3f, 0xf0, 0x1c, 0x7b, 0x0e, 0xca, 0xb9, 0x89, 0x18, 0x47,\n  0x24, 0xd8, 0x39, 0x37, 0xf8, 0xc9, 0xe0, 0xc4, 0xf9, 0x67, 0x1a, 0xf9,\n  0x09, 0x58, 0xd7, 0x86, 0x61, 0x5d, 0x93, 0xf0, 0x3a, 0xcb, 0x2b, 0x10,\n  0x31, 0xd2, 0x37, 0x46, 0x5b, 0xbe, 0x17, 0x72, 0x87, 0x05, 0xe7, 0xbb,\n  0x68, 0xe4, 0xcb, 0x11, 0xbb, 0x89, 0xa0, 0xb3, 0xc1, 0x6f, 0xf0, 0x56,\n  0x51, 0xe4, 0xd3, 0xdb, 0x91, 0x47, 0x73, 0xcf, 0xf8, 0x17, 0xbf, 0xc1,\n  0xfb, 0x36, 0x53, 0xdd, 0xef, 0xbb, 0xbf, 0x61, 0x2d, 0xf0, 0x4b, 0xbc,\n  0x9d, 0xf1, 0x4b, 0xbc, 0x8f, 0xe2, 0x97, 0x78, 0x9f, 0xc5, 0x2f, 0xf1,\n  0x1e, 0x91, 0x73, 0x17, 0xbf, 0x38, 0xcc, 0xa4, 0xa7, 0xa3, 0xd2, 0x78,\n  0xf5, 0xa7, 0x31, 0xe8, 0x4f, 0xe3, 0x24, 0x60, 0xe5, 0x9f, 0x5e, 0xf3,\n  0xac, 0x77, 0xff, 0x63, 0xf4, 0x3a, 0x41, 0xaf, 0x53, 0xf4, 0xf7, 0x72,\n  0xfb, 0xde, 0x22, 0x0b, 0xf7, 0x3f, 0x6f, 0xe1, 0xfe, 0x17, 0xaf, 0x94,\n  0xf3, 0xf7, 0x5e, 0x29, 0x1b, 0x40, 0x2b, 0x59, 0x00, 0xf5, 0x4f, 0x80,\n  0xc1, 0x44, 0xc8, 0xd3, 0xf4, 0x3c, 0x97, 0xfd, 0x9a, 0x88, 0x97, 0x08,\n  0x39, 0x40, 0xaf, 0xd7, 0x08, 0x67, 0xf5, 0xb4, 0xfa, 0x97, 0xeb, 0x0c,\n  0xbd, 0x7e, 0xa1, 0xd7, 0x1f, 0xf4, 0x77, 0x91, 0xcd, 0x73, 0x75, 0xf9,\n  0xab, 0xf1, 0xbf, 0x7a, 0xb9, 0x1a, 0xd4, 0x6d, 0x95, 0xbd, 0xba, 0x7d,\n  0xa4, 0xef, 0x80, 0x70, 0xfc, 0x6d, 0x3d, 0xc3, 0x2a, 0x67, 0xdd, 0x9b,\n  0x67, 0xd3, 0x27, 0xda, 0xe5, 0x72, 0xeb, 0xe9, 0x16, 0x2d, 0xd5, 0x7e,\n  0x45, 0x82, 0x26, 0x42, 0xde, 0xb2, 0xe9, 0x45, 0x76, 0x39, 0xd3, 0xd6,\n  0xd3, 0x4a, 0xbb, 0x4e, 0xf9, 0xcc, 0x58, 0xc2, 0x83, 0x6d, 0x3c, 0x17,\n  0x2f, 0xab, 0x7c, 0xf7, 0xbf, 0xd0, 0xbf, 0x7c, 0x25, 0xd7, 0xf3, 0x5a,\n  0x75, 0x48, 0xfd, 0x67, 0xda, 0xef, 0xdd, 0x89, 0x16, 0x6f, 0xd7, 0x53,\n  0x50, 0xff, 0xac, 0xba, 0xfe, 0xb1, 0x64, 0x6b, 0xa8, 0x0b, 0xf2, 0x03,\n  0xd5, 0xbc, 0x06, 0x6d, 0x28, 0xfa, 0x9b, 0x67, 0xfe, 0x3b, 0x2f, 0xd9,\n  0xa7, 0x1e, 0xaa, 0x83, 0x3c, 0x6a, 0xb5, 0xec, 0xbf, 0xa8, 0xe7, 0xff,\n  0xe6, 0x75, 0xa5, 0x8d, 0x64, 0xa9, 0xd4, 0x2e, 0xf4, 0xea, 0x69, 0xbf,\n  0xfa, 0xdb, 0x7a, 0xa9, 0x20, 0x7c, 0xa8, 0xdd, 0xf6, 0x2a, 0x7a, 0x8d,\n  0xa4, 0xbf, 0x47, 0xdb, 0x7a, 0xef, 0x4b, 0xaf, 0xc1, 0xa0, 0xf1, 0x80,\n  0xf1, 0xf4, 0x9a, 0xfa, 0x6f, 0x3c, 0xb3, 0x6e, 0x7c, 0xcc, 0x6e, 0xf0,\n  0xf7, 0xa2, 0xff, 0xa2, 0x0d, 0xcb, 0xff, 0xa3, 0xb6, 0xfe, 0x4f, 0x3c,\n  0x4e, 0xb2, 0x17, 0x89, 0xcc, 0xc3, 0x26, 0xb2, 0x5b, 0x68, 0xbe, 0x97,\n  0xb1, 0x0e, 0xb4, 0x66, 0x74, 0x21, 0x1b, 0xf9, 0x28, 0x59, 0xa9, 0x19,\n  0x64, 0x71, 0x05, 0xcb, 0x65, 0x05, 0x74, 0xcf, 0x9f, 0xd6, 0x8c, 0x68,\n  0xac, 0xee, 0x56, 0x3e, 0xa2, 0x16, 0xfb, 0x52, 0x5f, 0xd1, 0x7d, 0x79,\n  0x67, 0x22, 0xdd, 0x4b, 0x64, 0x32, 0x96, 0xbf, 0x03, 0xf7, 0x63, 0x60,\n  0xab, 0x3f, 0x06, 0xfe, 0x31, 0x78, 0x93, 0xc9, 0xfa, 0x29, 0x54, 0x53,\n  0x4b, 0x7a, 0x56, 0x05, 0x59, 0xa8, 0xee, 0x54, 0x6a, 0xb0, 0xac, 0x51,\n  0x41, 0x6e, 0x52, 0xd9, 0x4a, 0x75, 0x29, 0x78, 0x86, 0xac, 0x27, 0x87,\n  0x35, 0x63, 0xcd, 0x59, 0x1b, 0x26, 0xcf, 0xac, 0xdf, 0x68, 0xe7, 0x5c,\n  0x6a, 0x61, 0x7f, 0x25, 0xfc, 0xdc, 0xde, 0x8b, 0x92, 0xf5, 0x1e, 0x91,\n  0x50, 0xc1, 0x3e, 0x8d, 0xd2, 0x14, 0xf8, 0x5c, 0x7a, 0x92, 0x8b, 0x49,\n  0xeb, 0x88, 0xe8, 0x93, 0xda, 0xb7, 0x12, 0x7b, 0x89, 0x4f, 0x92, 0xac,\n  0x61, 0x96, 0x3d, 0x74, 0x3f, 0xe2, 0xde, 0xc7, 0xb8, 0xfb, 0x09, 0xb2,\n  0x81, 0x4e, 0xb2, 0x81, 0x1f, 0xb2, 0x58, 0xf7, 0x17, 0xee, 0x2f, 0x59,\n  0xa2, 0xfb, 0x38, 0xd9, 0xc3, 0x14, 0xf7, 0xf7, 0xee, 0x53, 0x2c, 0xcd,\n  0xfd, 0x93, 0xfb, 0x2c, 0x6b, 0xe4, 0x3e, 0xef, 0x3e, 0xcf, 0xb2, 0xdd,\n  0xbf, 0xba, 0x7f, 0x65, 0x39, 0xee, 0x8b, 0xee, 0x8b, 0xac, 0xb1, 0xfb,\n  0xb2, 0xfb, 0x32, 0xcb, 0x35, 0x5d, 0xa6, 0x8b, 0x35, 0x31, 0xdd, 0xa6,\n  0x9b, 0xe5, 0x99, 0xc1, 0x66, 0x04, 0x6b, 0x6a, 0x46, 0x9b, 0xd1, 0xac,\n  0xd8, 0xcc, 0x36, 0x73, 0x58, 0x73, 0xb2, 0xa5, 0x3d, 0x59, 0x4b, 0xb3,\n  0x0f, 0x59, 0xd4, 0x52, 0x73, 0x9c, 0x39, 0x8e, 0x95, 0x99, 0x1b, 0xcd,\n  0x8d, 0xac, 0x1d, 0x49, 0x10, 0xf9, 0xff, 0x55, 0x82, 0x4c, 0x92, 0xa0,\n  0xb1, 0x59, 0xca, 0x2a, 0xcc, 0x76, 0x64, 0xd3, 0x07, 0x40, 0x82, 0x51,\n  0x90, 0x60, 0xb4, 0x39, 0xd5, 0xbc, 0x86, 0x8d, 0x31, 0xaf, 0x33, 0xaf,\n  0x63, 0x53, 0xc8, 0xbe, 0xaf, 0x64, 0x53, 0xcd, 0xd5, 0x64, 0xe5, 0xe7,\n  0x93, 0x8e, 0x99, 0xf4, 0x87, 0x65, 0xec, 0x87, 0xd7, 0x6a, 0xfb, 0x95,\n  0xda, 0x00, 0xaf, 0x7b, 0x05, 0xd3, 0x2b, 0x92, 0x5e, 0xf1, 0xf4, 0xea,\n  0x6f, 0xf3, 0xfc, 0xb9, 0x5c, 0xd6, 0x5f, 0x94, 0x5b, 0xfd, 0xa7, 0xfb,\n  0xa9, 0x7f, 0x7a, 0x66, 0xff, 0xbf, 0xe0, 0x91, 0xef, 0x1d, 0xec, 0x57,\n  0x89, 0xfd, 0xb7, 0xe4, 0xcb, 0xb3, 0xf1, 0xa2, 0x06, 0xf4, 0x32, 0x9b,\n  0xaf, 0x61, 0x1d, 0x34, 0xb7, 0x79, 0x4f, 0xbb, 0xcc, 0x50, 0x7a, 0x8d,\n  0x6e, 0x70, 0x8f, 0xe6, 0xbf, 0x3c, 0x6b, 0x2e, 0x73, 0x63, 0x78, 0xcd,\n  0x67, 0xd6, 0xcf, 0x71, 0xaf, 0xc0, 0x7d, 0xee, 0xdb, 0x85, 0x91, 0x83,\n  0x73, 0xca, 0x5e, 0x6b, 0xe7, 0x19, 0x59, 0x4c, 0x86, 0xfc, 0xae, 0x0f,\n  0xbe, 0x33, 0xc3, 0x1e, 0x0b, 0x03, 0xee, 0xc3, 0xb9, 0x39, 0x1f, 0x62,\n  0x65, 0x1f, 0xce, 0x0f, 0xfa, 0x90, 0x29, 0xf4, 0xf9, 0x6c, 0xa8, 0xa1,\n  0xa4, 0xdc, 0xab, 0x67, 0xbe, 0xcf, 0x00, 0x3f, 0x01, 0xfc, 0x07, 0xe0,\n  0x1b, 0xf4, 0x14, 0x2b, 0xce, 0xc6, 0x7e, 0x2c, 0x3e, 0x12, 0xb9, 0x86,\n  0xa7, 0xf2, 0x2c, 0xba, 0x46, 0xd3, 0xb5, 0x99, 0xe7, 0xd1, 0x55, 0xc4,\n  0x4b, 0x78, 0x19, 0xef, 0xc0, 0xbb, 0xf0, 0x9e, 0xbc, 0x3f, 0x7f, 0x8d,\n  0x0f, 0xe5, 0x4f, 0xd3, 0xbd, 0x87, 0xf9, 0x44, 0x3e, 0x9d, 0x5f, 0xcb,\n  0xe7, 0xf3, 0x1b, 0xf9, 0x0a, 0xbe, 0x9a, 0xdf, 0x4e, 0xdc, 0xdb, 0xf9,\n  0x7d, 0x44, 0xdf, 0x47, 0xf7, 0x3f, 0xe6, 0x07, 0x88, 0xf3, 0x2d, 0xfe,\n  0x1e, 0x5d, 0x67, 0xe9, 0xaf, 0x8f, 0xf9, 0x51, 0xfe, 0x0d, 0xff, 0x81,\n  0xf0, 0x0b, 0xfc, 0xb2, 0x10, 0x42, 0x13, 0xfe, 0x74, 0x85, 0x8a, 0x68,\n  0x91, 0x28, 0xf6, 0xd2, 0xc8, 0xcc, 0x11, 0x9f, 0x8a, 0x66, 0xa2, 0xb9,\n  0x68, 0x23, 0x7a, 0x93, 0x97, 0xd6, 0x89, 0x66, 0xd7, 0xa7, 0xf4, 0x3a,\n  0x4c, 0xf0, 0x53, 0xba, 0x5f, 0x83, 0xf7, 0x4f, 0xed, 0xbf, 0xe4, 0xbd,\n  0xde, 0x62, 0x2b, 0xfe, 0x1a, 0x08, 0x38, 0x1c, 0xf0, 0x5e, 0x31, 0x56,\n  0x4c, 0xb6, 0x79, 0x24, 0x9c, 0x29, 0xe6, 0x8a, 0x85, 0xc0, 0xf7, 0x8b,\n  0xa5, 0xf5, 0xe5, 0x6f, 0x69, 0x50, 0x97, 0xbc, 0xd6, 0x8a, 0x63, 0xe2,\n  0x4e, 0xaa, 0xed, 0x30, 0x95, 0xff, 0x54, 0xec, 0x26, 0xfe, 0xbd, 0xf5,\n  0xf7, 0xf6, 0x43, 0x8a, 0x67, 0xc5, 0x4b, 0xf8, 0xeb, 0x0d, 0xe2, 0x91,\n  0xcf, 0x3e, 0x26, 0x7b, 0x05, 0xd9, 0x0f, 0x45, 0xc6, 0xd4, 0x84, 0xe7,\n  0x01, 0xc6, 0x42, 0xa7, 0x59, 0xb2, 0x17, 0x65, 0x3e, 0x96, 0xf5, 0x93,\n  0xd0, 0x8b, 0xb3, 0x22, 0x74, 0xb7, 0x1b, 0x41, 0x87, 0x2f, 0x0e, 0x3c,\n  0xa9, 0xa0, 0xa4, 0xa3, 0x86, 0x16, 0xc0, 0x9b, 0x03, 0x56, 0x02, 0x56,\n  0x00, 0x76, 0xc0, 0xdd, 0x49, 0xc0, 0x47, 0x03, 0x4f, 0x46, 0x0d, 0x09,\n  0xa8, 0xc1, 0x2a, 0x1b, 0x0b, 0xd8, 0x15, 0x3c, 0xc9, 0x80, 0x96, 0x3c,\n  0x69, 0xa0, 0x07, 0x02, 0x4f, 0x02, 0xbf, 0x85, 0x07, 0x82, 0x1e, 0x0d,\n  0x7c, 0x0a, 0xc1, 0x08, 0x70, 0x6a, 0xf6, 0xdd, 0x44, 0x79, 0xee, 0xd1,\n  0x97, 0x23, 0x47, 0x9b, 0x45, 0xf1, 0xfe, 0x06, 0x3a, 0xf1, 0xfb, 0x70,\n  0x56, 0xd9, 0xe7, 0xf5, 0x45, 0x80, 0x22, 0x5b, 0x17, 0x84, 0x38, 0x22,\n  0x0d, 0x50, 0x00, 0xba, 0x05, 0x49, 0xeb, 0xbb, 0x4f, 0x64, 0x4a, 0x0b,\n  0x28, 0xc8, 0xb3, 0xf0, 0x6d, 0xb6, 0x71, 0x92, 0xcd, 0xf7, 0xb4, 0xa4,\n  0x30, 0x4d, 0xe2, 0x04, 0x27, 0x82, 0x3e, 0x59, 0x9e, 0xa4, 0x12, 0xf2,\n  0x2c, 0x5c, 0x2b, 0x49, 0xf1, 0x31, 0xb4, 0x28, 0x49, 0xea, 0xc7, 0xf7,\n  0x22, 0xf8, 0xab, 0x41, 0xbf, 0x24, 0x6b, 0x66, 0xb1, 0xa0, 0xc4, 0xa2,\n  0x6c, 0x30, 0xa0, 0x0b, 0x14, 0x37, 0x70, 0x13, 0x9c, 0x9f, 0x7b, 0x7f,\n  0x20, 0x78, 0x02, 0x94, 0x28, 0x40, 0x05, 0x50, 0xb7, 0x9f, 0x38, 0x11,\n  0x4f, 0x9c, 0x58, 0x6f, 0xa7, 0x39, 0xec, 0x34, 0x79, 0x57, 0x64, 0xf9,\n  0x87, 0x4a, 0xbf, 0xd3, 0x7d, 0xd8, 0x6d, 0x65, 0x3d, 0x75, 0x33, 0xc9,\n  0xcc, 0x30, 0x8b, 0xcd, 0xe5, 0xe6, 0x2d, 0xe6, 0x1a, 0xf3, 0x36, 0x73,\n  0x83, 0xb9, 0x15, 0xbe, 0xae, 0xdc, 0x2d, 0x91, 0x9f, 0xa6, 0x96, 0x59,\n  0x1b, 0x99, 0xc3, 0xce, 0x95, 0x72, 0xf0, 0x40, 0x44, 0x9a, 0xb2, 0x57,\n  0x18, 0x8f, 0x03, 0x9e, 0x0c, 0x7c, 0x30, 0xd3, 0x69, 0x5d, 0x91, 0x97,\n  0xb5, 0xc2, 0x58, 0x17, 0xc5, 0x05, 0xe2, 0x23, 0x48, 0xfe, 0x11, 0xa4,\n  0xfa, 0xa8, 0x5e, 0x1e, 0x01, 0x79, 0xe4, 0x09, 0x92, 0x4c, 0xc7, 0x76,\n  0xfa, 0x2b, 0x02, 0x1e, 0x34, 0x83, 0x07, 0xcd, 0xe1, 0x41, 0x0b, 0xf2,\n  0xa0, 0xf7, 0x30, 0x97, 0xfb, 0x23, 0xf7, 0xe7, 0x2c, 0xda, 0x7d, 0xcc,\n  0xfd, 0x35, 0xd9, 0xee, 0x13, 0xee, 0xef, 0xc8, 0x76, 0x9f, 0x76, 0x9f,\n  0x66, 0xe9, 0xee, 0x73, 0xee, 0x73, 0x2c, 0xc3, 0xfd, 0xb3, 0xfb, 0x17,\n  0x96, 0xe9, 0xbe, 0xe0, 0xfe, 0x8d, 0x65, 0xb9, 0x7f, 0x77, 0x5f, 0x22,\n  0x0b, 0x5e, 0x6b, 0x3a, 0xc9, 0x6a, 0xab, 0xa6, 0x41, 0xab, 0x84, 0x69,\n  0x06, 0xb1, 0x12, 0x33, 0xd2, 0x8c, 0xa2, 0xf5, 0x21, 0xc6, 0xcc, 0x62,\n  0xe5, 0x64, 0xbb, 0xab, 0x58, 0x4f, 0xb3, 0x97, 0xd9, 0x9b, 0xcd, 0x24,\n  0x4f, 0x7c, 0x2c, 0x9b, 0x6d, 0x8e, 0x27, 0x7f, 0x7c, 0x0e, 0xd9, 0xeb,\n  0x0d, 0xec, 0x56, 0x73, 0x13, 0xd9, 0xeb, 0x9d, 0x57, 0xa4, 0x81, 0x04,\n  0x1c, 0x12, 0x84, 0x41, 0x82, 0x18, 0x48, 0x10, 0x0f, 0x09, 0x92, 0x20,\n  0x41, 0x32, 0x24, 0x48, 0x81, 0x04, 0x69, 0x90, 0x20, 0xc3, 0x5d, 0xeb,\n  0xae, 0x65, 0x59, 0x26, 0x27, 0x39, 0xb2, 0x21, 0x47, 0x1e, 0xe4, 0x28,\n  0x80, 0x1c, 0x2d, 0x21, 0x47, 0x09, 0xe4, 0xa8, 0x82, 0x1c, 0x13, 0x21,\n  0xc7, 0x64, 0x92, 0x63, 0x12, 0x9b, 0x86, 0x35, 0x64, 0x16, 0xd6, 0x90,\n  0xeb, 0x11, 0x23, 0xcc, 0x67, 0x0f, 0x33, 0x26, 0xc8, 0x5b, 0x17, 0x07,\n  0x18, 0x53, 0x66, 0xfe, 0xe9, 0x35, 0xdc, 0x7a, 0x17, 0xe4, 0xb5, 0x0b,\n  0xf2, 0x78, 0x05, 0xf5, 0xa8, 0x32, 0xd9, 0xbe, 0x37, 0xd6, 0xc2, 0xc5,\n  0xc7, 0x16, 0x2e, 0x8e, 0x5e, 0x29, 0x27, 0xbe, 0x69, 0x50, 0xf6, 0x07,\n  0x7a, 0x4f, 0xa4, 0xf7, 0xb3, 0x57, 0xd7, 0x2b, 0x28, 0x22, 0x11, 0x97,\n  0x1b, 0x3c, 0xc7, 0xe6, 0x57, 0x42, 0x1b, 0xfc, 0x3d, 0xbc, 0xc1, 0xb3,\n  0xea, 0xca, 0x8a, 0x06, 0x7c, 0xf2, 0xd5, 0xfc, 0x2f, 0xe4, 0x96, 0x2f,\n  0xad, 0x01, 0x9f, 0x94, 0xd9, 0xdf, 0x7e, 0x6f, 0x6e, 0xd3, 0xa2, 0xff,\n  0x54, 0xef, 0xd8, 0x3f, 0x3d, 0xf3, 0x7f, 0xf3, 0xa2, 0x76, 0x2a, 0xe9,\n  0xff, 0x45, 0xf9, 0xff, 0xab, 0x97, 0x6c, 0x4b, 0x8e, 0xdd, 0x96, 0x66,\n  0xf4, 0xea, 0x64, 0xb7, 0x9b, 0x62, 0x5a, 0xa5, 0xdc, 0xfe, 0xbb, 0x86,\n  0x5e, 0xbd, 0xff, 0x8d, 0xba, 0xea, 0x74, 0x32, 0xb0, 0xc1, 0xdf, 0x63,\n  0xff, 0x0b, 0xd9, 0x26, 0xff, 0x9f, 0xb5, 0x93, 0x7b, 0x3f, 0x93, 0x31,\n  0xb7, 0xcf, 0xc7, 0xc9, 0x93, 0xf7, 0x62, 0xdf, 0xdb, 0x8b, 0x7d, 0x33,\n  0x56, 0x04, 0x1c, 0x79, 0x35, 0xf2, 0x30, 0xc9, 0x5f, 0xf7, 0x62, 0xff,\n  0xcd, 0x77, 0x19, 0xbe, 0x41, 0x2d, 0x20, 0x32, 0x7f, 0x0c, 0x67, 0xf3,\n  0xbd, 0x0f, 0x8b, 0xa1, 0x92, 0x0e, 0x1c, 0x9f, 0x3f, 0xf0, 0x59, 0x67,\n  0xd3, 0x1c, 0x80, 0xf0, 0x28, 0x90, 0x73, 0x24, 0x0a, 0xca, 0x5e, 0xe6,\n  0x14, 0x23, 0x7b, 0x71, 0x5a, 0xcd, 0x8b, 0x4f, 0xc4, 0x7a, 0x91, 0x63,\n  0xf0, 0x7e, 0x6b, 0x97, 0x7d, 0x56, 0x96, 0x12, 0x0e, 0x78, 0x0e, 0x6d,\n  0x25, 0xb4, 0x25, 0x89, 0x84, 0x8d, 0x47, 0x9d, 0x04, 0xb7, 0x35, 0xf0,\n  0x06, 0x86, 0x92, 0x27, 0x70, 0xb5, 0x1f, 0x60, 0x7b, 0x02, 0xe2, 0x44,\n  0xbd, 0x2f, 0x50, 0xe7, 0x09, 0xc0, 0x07, 0x10, 0xa1, 0xfc, 0x07, 0x31,\n  0xfc, 0x2a, 0x4f, 0xe0, 0x58, 0xbd, 0x27, 0x90, 0x48, 0x9e, 0xc0, 0x31,\n  0xf2, 0x05, 0x2c, 0x4f, 0x40, 0xfa, 0x01, 0x35, 0xb4, 0xd2, 0x0f, 0xa4,\n  0xf5, 0x5d, 0xae, 0xec, 0x93, 0x95, 0x02, 0xb9, 0xa6, 0x2b, 0x15, 0xb4,\n  0xaa, 0x2f, 0x55, 0xd6, 0x8b, 0x7b, 0x95, 0x96, 0xca, 0x7a, 0xba, 0xfa,\n  0xca, 0x8b, 0xd6, 0xf5, 0xb5, 0xf8, 0x7b, 0x1e, 0xbd, 0x56, 0xca, 0x15,\n  0x1d, 0xf7, 0x0a, 0x24, 0x24, 0xce, 0x4c, 0x49, 0x55, 0x0c, 0xb1, 0x9b,\n  0xde, 0x0d, 0xa2, 0xec, 0x95, 0xf7, 0x68, 0x7d, 0xa7, 0xb5, 0x9d, 0xfe,\n  0x7a, 0x03, 0x5c, 0xf6, 0xea, 0x2e, 0x4e, 0x88, 0x53, 0xe2, 0xbc, 0xb8,\n  0x28, 0xbc, 0x8a, 0x83, 0xca, 0x87, 0x53, 0xed, 0xeb, 0xad, 0x52, 0x74,\n  0x05, 0x02, 0xd6, 0x5d, 0xe1, 0x4a, 0xac, 0x92, 0x4c, 0x75, 0x67, 0x2a,\n  0xb9, 0xc4, 0xd9, 0x52, 0xf1, 0x28, 0x15, 0x4a, 0x95, 0xd2, 0x9d, 0x4a,\n  0x0c, 0x56, 0x46, 0x2a, 0xe3, 0x95, 0xa9, 0xe0, 0x9a, 0x4d, 0x32, 0x2d,\n  0xa2, 0xf7, 0xe5, 0x90, 0x61, 0xa5, 0xb2, 0x9e, 0x34, 0xfe, 0x85, 0xfc,\n  0x0c, 0x23, 0xe9, 0xf7, 0x03, 0xe8, 0xf4, 0x2b, 0x8c, 0x83, 0x5a, 0x8c,\n  0x83, 0x5a, 0x8c, 0x03, 0x2f, 0x34, 0x5e, 0x0b, 0xe8, 0x45, 0x1f, 0xc8,\n  0x4c, 0x97, 0x43, 0x9e, 0x36, 0xa4, 0xf1, 0xf1, 0x19, 0x28, 0xbb, 0x24,\n  0xa4, 0x39, 0x21, 0x79, 0x2e, 0x62, 0xac, 0xa0, 0x94, 0xfc, 0xcc, 0x23,\n  0x51, 0xbe, 0x41, 0xcd, 0x87, 0xf0, 0x94, 0x43, 0xa0, 0xab, 0x80, 0xc3,\n  0x01, 0x0f, 0x10, 0xfd, 0x35, 0xf0, 0xb7, 0xb5, 0x9f, 0xf5, 0x07, 0xe8,\n  0x0e, 0xc0, 0xcd, 0x80, 0x03, 0x01, 0xd3, 0x01, 0x65, 0x86, 0x4f, 0xb1,\n  0x6a, 0x10, 0xf7, 0x62, 0x55, 0x85, 0x17, 0xa4, 0x74, 0xc5, 0x53, 0x8e,\n  0x4a, 0xa8, 0xd0, 0x2a, 0xea, 0x25, 0xcd, 0x81, 0x9e, 0x82, 0xe7, 0x7a,\n  0x71, 0xf7, 0x3b, 0x8c, 0x48, 0x82, 0xde, 0x5f, 0xac, 0x56, 0x48, 0x7e,\n  0xef, 0x29, 0x9c, 0x2f, 0x62, 0xf8, 0xdc, 0xbd, 0x0b, 0x9c, 0x8a, 0xcc,\n  0xb0, 0x51, 0x59, 0xf8, 0x3f, 0x0a, 0xfc, 0x1f, 0x65, 0x1e, 0xf0, 0x76,\n  0x04, 0x23, 0x21, 0x95, 0xbf, 0xb2, 0x95, 0x60, 0x2e, 0xa0, 0x1b, 0x14,\n  0x26, 0xa6, 0x42, 0x1e, 0xd9, 0x46, 0xa7, 0x22, 0xf3, 0xfc, 0x41, 0x80,\n  0x61, 0x80, 0xaa, 0x84, 0x3e, 0x2f, 0x6a, 0xd0, 0xf1, 0x19, 0x37, 0x53,\n  0xd9, 0x42, 0x94, 0xd7, 0x51, 0xd6, 0x0d, 0x7a, 0x2b, 0x70, 0x2a, 0x8a,\n  0xf4, 0xc1, 0x5c, 0x96, 0x0c, 0xf2, 0xa4, 0x10, 0xcd, 0x07, 0xaa, 0xd3,\n  0x7b, 0x52, 0xca, 0xe3, 0x45, 0x2e, 0x91, 0x7a, 0xe7, 0x0b, 0x82, 0x27,\n  0xa4, 0xe4, 0x44, 0x97, 0xf2, 0x6b, 0x28, 0x5b, 0x0d, 0xe8, 0x0f, 0xc8,\n  0x95, 0x8e, 0xd2, 0xc7, 0x40, 0x2b, 0xe2, 0xf1, 0xf4, 0xcb, 0xf6, 0xb3,\n  0xe4, 0x5d, 0x03, 0x92, 0x3b, 0xd0, 0x3b, 0x2e, 0xdc, 0x7d, 0x1a, 0x77,\n  0x0d, 0x64, 0xfb, 0x0d, 0x79, 0x12, 0xd8, 0xf7, 0x96, 0x4d, 0x91, 0x30,\n  0x09, 0xfc, 0x81, 0x28, 0x1b, 0xe0, 0x93, 0x19, 0xdd, 0x28, 0xe0, 0x6e,\n  0xf9, 0x39, 0x3e, 0x6a, 0xd7, 0x4c, 0xb4, 0xcb, 0xaa, 0xb9, 0xac, 0xde,\n  0x8b, 0x50, 0xe0, 0x45, 0xc8, 0xf9, 0x3a, 0x55, 0xfa, 0x12, 0xcc, 0xe1,\n  0xde, 0xeb, 0x7e, 0xdc, 0xbd, 0xdf, 0x7d, 0x86, 0xf0, 0x2c, 0x33, 0xd6,\n  0x8c, 0x33, 0x13, 0xc8, 0xbb, 0x49, 0x36, 0x53, 0xcd, 0x34, 0x33, 0x9d,\n  0xbc, 0x9c, 0x4c, 0xf2, 0x73, 0x5a, 0x98, 0x2d, 0xcd, 0x12, 0xb3, 0x8c,\n  0xe2, 0xb7, 0x72, 0x73, 0x06, 0xad, 0xb1, 0x37, 0x9a, 0x4b, 0xc9, 0xf7,\n  0x59, 0x61, 0xde, 0x4c, 0xfe, 0xcf, 0xad, 0x14, 0xb1, 0xad, 0x31, 0xd7,\n  0x9a, 0xeb, 0xc9, 0x0f, 0xba, 0xc3, 0xbc, 0x93, 0x7c, 0xa1, 0x8d, 0xe4,\n  0x13, 0x6c, 0x31, 0xb7, 0x9a, 0x77, 0x99, 0xdb, 0xcc, 0xbb, 0x69, 0x3d,\n  0x96, 0xe7, 0x5b, 0xe4, 0xf7, 0x44, 0xc8, 0xd3, 0x04, 0xf2, 0x73, 0xa9,\n  0xd2, 0x83, 0xbb, 0xd3, 0xfa, 0xae, 0x11, 0x31, 0x9b, 0xf0, 0x9f, 0xc4,\n  0x38, 0x7c, 0xd6, 0x24, 0x92, 0x65, 0xb1, 0xde, 0x6c, 0x20, 0x1b, 0xce,\n  0x5e, 0x62, 0x93, 0xd9, 0x31, 0x36, 0x96, 0x2d, 0x24, 0xec, 0x18, 0xfe,\n  0xba, 0x85, 0x9d, 0x62, 0x33, 0xe9, 0xef, 0x3b, 0xd9, 0x09, 0x36, 0x97,\n  0xe0, 0x42, 0xb6, 0x94, 0x68, 0xb7, 0xb0, 0xb5, 0x84, 0x6f, 0x65, 0xf7,\n  0xb2, 0xdd, 0x6c, 0x2f, 0xdb, 0xcf, 0x9e, 0x05, 0xf7, 0x1b, 0xec, 0x30,\n  0x3b, 0xc2, 0x3e, 0x25, 0xfc, 0x04, 0x95, 0x92, 0x63, 0x6e, 0x2c, 0xf4,\n  0x75, 0x0d, 0xf4, 0x35, 0x16, 0xf0, 0x51, 0xe8, 0x65, 0x19, 0xe0, 0x8b,\n  0xe8, 0xe9, 0x19, 0xc0, 0xa7, 0x03, 0xbe, 0x0b, 0x38, 0x09, 0x70, 0x0e,\n  0xca, 0x2e, 0x04, 0x3e, 0x17, 0x70, 0x2a, 0x28, 0xad, 0xd0, 0x2b, 0x0b,\n  0x81, 0x67, 0x03, 0xbe, 0x86, 0xbb, 0x4b, 0x00, 0x7b, 0xa2, 0x3f, 0x06,\n  0x03, 0x1f, 0x09, 0x58, 0x83, 0xfe, 0x98, 0x07, 0x7c, 0x26, 0xe0, 0xb5,\n  0x80, 0xc3, 0x95, 0x32, 0x3b, 0xbe, 0x32, 0xc4, 0x2b, 0x8e, 0x45, 0xcc,\n  0x51, 0x5e, 0x51, 0xd5, 0x93, 0x45, 0x8f, 0x98, 0x33, 0x7d, 0x22, 0xeb,\n  0x34, 0x66, 0xfa, 0xa8, 0x09, 0xec, 0xc4, 0xc4, 0x61, 0x33, 0x27, 0xf3,\n  0x68, 0xe8, 0x91, 0x91, 0xf5, 0x0d, 0xb1, 0x63, 0x3f, 0x85, 0x22, 0x38,\n  0x9d, 0x7a, 0xd4, 0x4d, 0x51, 0x5f, 0x38, 0x8b, 0x20, 0xfd, 0x46, 0xb1,\n  0x18, 0xf2, 0x3f, 0xe3, 0x29, 0x62, 0x4b, 0x64, 0x49, 0xd4, 0xdf, 0xa2,\n  0xba, 0x73, 0x79, 0x22, 0xf3, 0xf4, 0xe8, 0x5e, 0x96, 0x48, 0x3a, 0x94,\n  0x65, 0xc3, 0xec, 0xb2, 0xce, 0xbf, 0x28, 0x1b, 0x8d, 0xd2, 0x71, 0xf5,\n  0xe5, 0x25, 0x7f, 0xe8, 0x3f, 0x3d, 0x2b, 0xf0, 0x6f, 0x9e, 0xf6, 0xd7,\n  0xdc, 0xa1, 0x7f, 0xc3, 0x5d, 0xd7, 0x96, 0x3a, 0x79, 0x5c, 0xff, 0x86,\n  0x3c, 0xb9, 0x4c, 0x2d, 0xad, 0xa9, 0xe9, 0xc0, 0x06, 0xb7, 0x2b, 0xed,\n  0x99, 0xc8, 0x6e, 0xe9, 0x28, 0xf1, 0xa7, 0xab, 0x4b, 0x3b, 0x24, 0xb2,\n  0xef, 0xaa, 0xbb, 0x56, 0x25, 0xf2, 0xf0, 0x2e, 0xa5, 0xbd, 0x13, 0x79,\n  0x79, 0xf7, 0xae, 0xd5, 0x89, 0x32, 0x8e, 0x6e, 0x50, 0xbb, 0xfa, 0xbf,\n  0x6e, 0xad, 0xf9, 0x6f, 0xb4, 0xd6, 0x51, 0xcf, 0xed, 0xf7, 0x1f, 0xe9,\n  0xc6, 0xff, 0x3f, 0xaa, 0x3b, 0xe0, 0x3f, 0xe2, 0x0e, 0xfa, 0x8f, 0xb8,\n  0x83, 0xff, 0x23, 0xee, 0x90, 0xbf, 0xe1, 0x4e, 0x1e, 0x36, 0x6c, 0xe2,\n  0x4c, 0x76, 0x78, 0x44, 0xb3, 0x19, 0x23, 0xd8, 0x87, 0x23, 0x86, 0xcd,\n  0x18, 0xc5, 0x3e, 0x1f, 0x31, 0x62, 0xd2, 0x54, 0xf6, 0x35, 0xe0, 0x29,\n  0x40, 0xaf, 0x84, 0xdc, 0x00, 0x0c, 0x1f, 0x39, 0x79, 0xca, 0x24, 0x9e,\n  0x3a, 0x7a, 0xfa, 0xb0, 0x11, 0x3c, 0x6b, 0xe2, 0xb8, 0x31, 0xc3, 0x78,\n  0xc1, 0xc4, 0xc9, 0xb3, 0x26, 0xf1, 0x96, 0x13, 0xa7, 0x8c, 0x98, 0xc8,\n  0x3d, 0x80, 0x15, 0x80, 0x55, 0x80, 0xdd, 0x01, 0xfb, 0x02, 0x0e, 0x06,\n  0x1c, 0x09, 0x38, 0x1e, 0x70, 0x2a, 0x15, 0x9d, 0xce, 0x67, 0x4f, 0x91,\n  0x35, 0xcc, 0x9b, 0x32, 0x7d, 0xe4, 0x64, 0xbe, 0x48, 0x92, 0xf8, 0xf2,\n  0xe9, 0x33, 0x27, 0x4e, 0xe2, 0x2b, 0x67, 0x90, 0x6c, 0x7c, 0xdb, 0x8c,\n  0x49, 0x23, 0xa6, 0xf2, 0xf5, 0x33, 0x66, 0xe4, 0xe5, 0xf3, 0x8d, 0x04,\n  0x0b, 0x88, 0x32, 0x6b, 0xf8, 0x0c, 0xbe, 0x73, 0xc6, 0xac, 0xa9, 0x33,\n  0xf8, 0x83, 0x33, 0x25, 0xff, 0xa3, 0x73, 0x47, 0x4d, 0x9f, 0x82, 0x33,\n  0x85, 0xc2, 0x9e, 0x97, 0x9c, 0xe1, 0xdc, 0x14, 0x93, 0xfb, 0xa1, 0x0a,\n  0x7a, 0x50, 0xe6, 0x57, 0x54, 0x1b, 0xab, 0x7b, 0x31, 0xd2, 0x90, 0x45,\n  0xd1, 0x1a, 0xe0, 0x32, 0x79, 0xef, 0x6c, 0xc0, 0x29, 0xeb, 0x89, 0x44,\n  0x3d, 0xd6, 0x08, 0x94, 0x7f, 0xe3, 0x34, 0x15, 0xc3, 0x29, 0x34, 0x66,\n  0x7d, 0x9f, 0x0e, 0xce, 0x46, 0x53, 0x1f, 0x5a, 0x99, 0xc2, 0xfa, 0xbd,\n  0x31, 0x3b, 0x77, 0x88, 0xd3, 0x8d, 0x0c, 0xa7, 0xac, 0x6c, 0x5b, 0x80,\n  0xbd, 0x22, 0x86, 0x93, 0x3d, 0xcc, 0xfa, 0xe4, 0x3f, 0xf6, 0xd1, 0x11,\n  0x83, 0x52, 0x1c, 0x0e, 0x88, 0x53, 0x14, 0x2c, 0xbb, 0x41, 0x96, 0x08,\n  0x67, 0xfb, 0x10, 0xab, 0x72, 0xd6, 0x88, 0x62, 0xdc, 0xfe, 0x8e, 0x8f,\n  0xb5, 0xb5, 0xda, 0x83, 0xfa, 0x42, 0xba, 0xbe, 0x0e, 0x9c, 0x1d, 0x1c,\n  0x1d, 0x5c, 0x10, 0x3c, 0x9a, 0xae, 0xe5, 0xc1, 0xbb, 0x83, 0x2f, 0x86,\n  0x44, 0x86, 0x34, 0x0f, 0xe9, 0x4b, 0xd7, 0x5c, 0xba, 0x56, 0x86, 0x5c,\n  0x0c, 0x1d, 0x1b, 0x5a, 0x11, 0xda, 0x93, 0xe0, 0xec, 0xd0, 0x7d, 0x74,\n  0xbd, 0x15, 0x16, 0x1a, 0x56, 0x14, 0xd6, 0x25, 0x6c, 0x7d, 0xd8, 0x91,\n  0xf0, 0xe8, 0xc8, 0xf5, 0x31, 0xc1, 0x31, 0xd3, 0x63, 0xf6, 0xc7, 0x1c,\n  0x8a, 0x39, 0x1a, 0x73, 0xde, 0xd6, 0xa1, 0x46, 0x2b, 0xe7, 0x52, 0xee,\n  0x31, 0x1e, 0x74, 0x6f, 0x14, 0xe1, 0xc6, 0x63, 0xda, 0x2d, 0xda, 0xad,\n  0xda, 0x3a, 0xed, 0x0e, 0xed, 0x6e, 0x6d, 0xbb, 0xb6, 0x4b, 0x7b, 0x42,\n  0x7b, 0x4a, 0x7b, 0x41, 0x3b, 0xa0, 0xbd, 0xa7, 0x1d, 0xd1, 0x3e, 0xd0,\n  0x3e, 0xd1, 0x8e, 0x69, 0xdf, 0x6a, 0x67, 0xb5, 0x73, 0xda, 0x05, 0xed,\n  0x37, 0xed, 0xb2, 0xb1, 0xdb, 0x78, 0xe0, 0x2a, 0x7e, 0xc9, 0xd3, 0xf0,\n  0xfe, 0x7d, 0xc6, 0xfd, 0xc6, 0xc3, 0xe6, 0x28, 0x63, 0x9f, 0x76, 0xa3,\n  0xb6, 0x50, 0x5b, 0xa4, 0xdd, 0xa4, 0x2d, 0xd6, 0x96, 0x69, 0x2b, 0xb4,\n  0xd5, 0xda, 0x56, 0xed, 0x4e, 0x6d, 0x93, 0xb6, 0x59, 0x5b, 0xaf, 0xbd,\n  0xaa, 0xbd, 0xa9, 0xbd, 0xae, 0x1d, 0xd4, 0xfe, 0xa1, 0x1d, 0xd2, 0x0e,\n  0x6b, 0x3f, 0x68, 0x27, 0xb4, 0xef, 0xb4, 0xef, 0xb5, 0x8b, 0xda, 0xfb,\n  0xda, 0x97, 0x7f, 0x5b, 0x6a, 0xaf, 0xf6, 0x80, 0xf6, 0x90, 0xf6, 0xf0,\n  0xbf, 0x2c, 0xfd, 0x87, 0xb6, 0x84, 0xae, 0x1b, 0xe8, 0x5a, 0x49, 0xd7,\n  0x1a, 0xba, 0xd6, 0x6a, 0xab, 0xe8, 0xba, 0x8d, 0xae, 0xdb, 0xe9, 0xba,\n  0x8b, 0xae, 0x0d, 0x74, 0x6d, 0xa1, 0x6b, 0x23, 0x5d, 0xf7, 0xd2, 0x75,\n  0x0f, 0x5d, 0x3b, 0xb5, 0x1d, 0x74, 0xdd, 0x4f, 0xd7, 0x7d, 0x74, 0xed,\n  0xd3, 0x1e, 0xd5, 0x1e, 0xd4, 0x1e, 0xd1, 0xf6, 0x6b, 0x4f, 0xd2, 0xf5,\n  0x34, 0x5d, 0xcf, 0xd0, 0xf5, 0x1c, 0x5d, 0xcf, 0xd3, 0xf5, 0x22, 0x5d,\n  0x2f, 0xd1, 0xf5, 0x8a, 0xf6, 0x36, 0x5d, 0x6f, 0xd0, 0xf5, 0x16, 0x5d,\n  0xef, 0xd2, 0xf5, 0x21, 0x5d, 0x1f, 0xd3, 0xf5, 0x11, 0x5d, 0x9f, 0xd2,\n  0xf5, 0x05, 0x5d, 0x9f, 0xd1, 0xf5, 0x0d, 0x5d, 0x5f, 0xd3, 0xf5, 0x15,\n  0x5d, 0x3f, 0xd1, 0x75, 0x8a, 0xae, 0x93, 0x74, 0x9d, 0xa1, 0xeb, 0x47,\n  0xba, 0x7e, 0xa6, 0xeb, 0x77, 0xba, 0xfe, 0xd0, 0x6a, 0xe9, 0xf2, 0xd1,\n  0xe5, 0xd5, 0xbc, 0xc6, 0x9b, 0xda, 0x72, 0xba, 0x6e, 0xa6, 0xeb, 0x1d,\n  0xba, 0x8e, 0x6a, 0x47, 0xf5, 0x89, 0xea, 0xef, 0xfa, 0x04, 0xf5, 0xa2,\n  0x3e, 0x49, 0x1b, 0xa3, 0x7f, 0xa4, 0x37, 0xd3, 0xf3, 0xf5, 0x02, 0x7d,\n  0x88, 0x79, 0xaf, 0xb9, 0x43, 0xfb, 0x95, 0xae, 0xf3, 0x74, 0xfd, 0x42,\n  0xd7, 0x25, 0xed, 0x92, 0xb1, 0xc7, 0xd8, 0x6b, 0x3c, 0xa4, 0x17, 0xea,\n  0x43, 0x35, 0x3f, 0xcd, 0x6d, 0xee, 0xd5, 0xc2, 0xb5, 0x08, 0xcd, 0xa9,\n  0xa9, 0x9a, 0xbf, 0xb9, 0xcb, 0x7c, 0xc9, 0xbc, 0xcf, 0xbc, 0x5f, 0x9f,\n  0x6f, 0xee, 0xd6, 0x7f, 0xd2, 0xcf, 0x9a, 0x0f, 0x98, 0x0f, 0x9a, 0x0f,\n  0x99, 0x0f, 0x6b, 0x21, 0xe6, 0x1e, 0x4d, 0xd7, 0x27, 0xeb, 0x53, 0xf4,\n  0xa9, 0xfa, 0x34, 0x7d, 0xba, 0x3e, 0x43, 0x9f, 0xa9, 0xcf, 0xd2, 0xaf,\n  0xd5, 0xe7, 0xe8, 0xb3, 0xf5, 0x6b, 0xa8, 0x57, 0x82, 0xcc, 0xd7, 0xb4,\n  0xe9, 0xda, 0x0c, 0x6d, 0xa6, 0x36, 0x4b, 0x9b, 0xad, 0x5d, 0xa3, 0x5d,\n  0xab, 0xcd, 0xd1, 0xe6, 0x6a, 0xd7, 0x69, 0xf3, 0xb4, 0xeb, 0xb5, 0xf9,\n  0xe6, 0xcb, 0xba, 0xa6, 0x8f, 0x37, 0x5f, 0x31, 0x5f, 0x35, 0xa2, 0x8d,\n  0x18, 0x23, 0xd6, 0x88, 0x33, 0xe2, 0x8d, 0x04, 0x23, 0xd1, 0x48, 0x32,\n  0x92, 0x8d, 0x14, 0xe3, 0x4b, 0xb3, 0x9f, 0xd9, 0xdf, 0x1c, 0x60, 0x0e,\n  0x34, 0x07, 0x99, 0x83, 0xcd, 0x21, 0xe6, 0x50, 0x73, 0x98, 0x39, 0xdc,\n  0x1c, 0x61, 0x8e, 0xa4, 0xb9, 0xd8, 0x9d, 0x66, 0xa7, 0x5c, 0x7f, 0x74,\n  0xba, 0xe4, 0x8c, 0x0b, 0x26, 0x5a, 0x32, 0x5d, 0x0a, 0xcd, 0x94, 0x6c,\n  0xba, 0x93, 0xcb, 0x9a, 0xd2, 0xec, 0xca, 0x67, 0x6d, 0xc8, 0xe6, 0x7a,\n  0xe8, 0x8a, 0x61, 0xed, 0x59, 0x27, 0xb2, 0x73, 0x3d, 0x59, 0x2f, 0xe2,\n  0xea, 0xcb, 0x06, 0x93, 0x3d, 0x18, 0x4a, 0x57, 0x36, 0x1b, 0x41, 0x57,\n  0x0e, 0x9b, 0x46, 0x57, 0x63, 0x76, 0x03, 0xbb, 0x95, 0x4a, 0x4a, 0x7f,\n  0xa4, 0x15, 0xf9, 0x55, 0x4f, 0xb2, 0x32, 0xf6, 0x34, 0x7b, 0x95, 0x0d,\n  0x23, 0x6f, 0xe4, 0x4d, 0x36, 0x89, 0xbd, 0xcd, 0x3e, 0x21, 0xae, 0xcf,\n  0xd9, 0x57, 0x6c, 0x3e, 0x3b, 0xce, 0xbe, 0x67, 0x37, 0xb2, 0x1f, 0xe9,\n  0xba, 0x99, 0x9d, 0xa6, 0xeb, 0x16, 0xf6, 0x13, 0x5d, 0xb7, 0xb2, 0x5f,\n  0xe8, 0x5a, 0xc9, 0x2e, 0xb0, 0x8b, 0x6c, 0x15, 0xfb, 0x83, 0x5d, 0xa2,\n  0xba, 0xbc, 0xdc, 0xc9, 0xd6, 0x73, 0x8d, 0xeb, 0x6c, 0x33, 0x37, 0x79,\n  0x3c, 0xdb, 0xca, 0x93, 0x78, 0x33, 0xf6, 0x08, 0x2f, 0xe4, 0x6d, 0xd9,\n  0xcb, 0xbc, 0x94, 0x77, 0x64, 0x87, 0x79, 0x3f, 0xde, 0x8f, 0x7d, 0xc4,\n  0x87, 0xf0, 0x21, 0xec, 0x63, 0x99, 0x97, 0x65, 0x9f, 0xf0, 0x19, 0x7c,\n  0x06, 0xfb, 0x94, 0xcf, 0xe6, 0xb3, 0xd9, 0x67, 0x14, 0x79, 0xcd, 0x67,\n  0x9f, 0xf3, 0x75, 0x7c, 0x1d, 0xfb, 0x82, 0x6f, 0xe3, 0xdb, 0xd9, 0x51,\n  0x7e, 0x88, 0x1f, 0x62, 0x5f, 0xf1, 0x33, 0xfc, 0x0c, 0xfb, 0x9a, 0xe2,\n  0xac, 0xb3, 0xec, 0x38, 0xff, 0x9d, 0x0c, 0xdd, 0x37, 0x22, 0x44, 0x84,\n  0xb1, 0x53, 0x62, 0x87, 0xd8, 0xc1, 0x7e, 0x12, 0xfb, 0xc4, 0x3e, 0x76,\n  0x56, 0x49, 0x52, 0x92, 0xd8, 0x39, 0x25, 0x45, 0x49, 0x65, 0xe7, 0x95,\n  0xdb, 0x95, 0xdb, 0xd9, 0x2f, 0xca, 0x06, 0x65, 0x03, 0xfb, 0x55, 0xd9,\n  0x4a, 0x1e, 0xd4, 0x05, 0xe5, 0x1d, 0xe5, 0x1d, 0xf6, 0x9b, 0xf2, 0xae,\n  0xf2, 0x2e, 0xbb, 0xe8, 0x70, 0x3b, 0xdc, 0xec, 0x77, 0x47, 0x86, 0x23,\n  0x83, 0xfd, 0xe1, 0x18, 0xe8, 0x18, 0xc8, 0x2e, 0x39, 0xa6, 0x39, 0xa6,\n  0xb1, 0xcb, 0x8e, 0x67, 0x1c, 0xcf, 0xb0, 0x5a, 0xc7, 0xdb, 0x8e, 0xb7,\n  0x99, 0xd7, 0x19, 0xe2, 0x0c, 0x65, 0x3e, 0xa7, 0xc7, 0xe9, 0xe1, 0xdc,\n  0x39, 0xd3, 0x39, 0x93, 0x0b, 0xe7, 0x22, 0xe7, 0x22, 0xae, 0x38, 0x97,\n  0x3a, 0x97, 0x72, 0x87, 0xf3, 0x0d, 0xe7, 0x21, 0xee, 0x74, 0x8d, 0x74,\n  0x4d, 0xe0, 0x9a, 0xeb, 0x82, 0xeb, 0x77, 0x1e, 0xa8, 0x3e, 0xae, 0x3e,\n  0xce, 0x43, 0x55, 0x9f, 0xea, 0xe3, 0x61, 0x5a, 0x86, 0x96, 0xc1, 0xc3,\n  0xb5, 0xdd, 0xda, 0x7e, 0x1e, 0x81, 0x4e, 0x4b, 0xd5, 0x85, 0x2e, 0x78,\n  0x9a, 0x3e, 0x4e, 0x1f, 0xc7, 0xd3, 0xf5, 0x7b, 0xf4, 0x7b, 0x79, 0x86,\n  0x91, 0x6a, 0x34, 0xe6, 0x8d, 0x8c, 0xcf, 0x8c, 0xcf, 0x78, 0xbe, 0x7b,\n  0xb3, 0x7b, 0x27, 0x2f, 0x70, 0xbf, 0xe4, 0x7e, 0x09, 0x9f, 0x82, 0xb5,\n  0xf7, 0xa0, 0x95, 0x60, 0xd6, 0x87, 0xed, 0x23, 0x1f, 0xf1, 0x15, 0x76,\n  0x88, 0xbc, 0xc3, 0xef, 0xd8, 0x05, 0xee, 0xe0, 0xc1, 0x3c, 0x91, 0xe7,\n  0xf2, 0x12, 0xde, 0x89, 0xf7, 0xe5, 0xe3, 0xf9, 0x60, 0x3e, 0x92, 0xe2,\n  0xd3, 0xf1, 0x7c, 0x2a, 0x69, 0x6f, 0x1e, 0x5f, 0xc4, 0x97, 0xf3, 0x95,\n  0x7c, 0xfd, 0x55, 0xb9, 0xeb, 0xab, 0xe2, 0x55, 0x3b, 0x52, 0xf5, 0x0a,\n  0x97, 0x30, 0x45, 0xb0, 0x88, 0x14, 0xf1, 0x22, 0x55, 0x64, 0x89, 0x3c,\n  0xd1, 0x52, 0x78, 0x44, 0x85, 0xa8, 0x12, 0xdd, 0x45, 0x5f, 0x31, 0x58,\n  0x8c, 0x14, 0xe3, 0xc5, 0x54, 0x31, 0x5b, 0xcc, 0x13, 0x8b, 0xc4, 0x72,\n  0xb1, 0x52, 0xac, 0x17, 0x1b, 0xc5, 0x36, 0xb1, 0x53, 0x3c, 0x28, 0x1e,\n  0x15, 0x4f, 0x8a, 0xe7, 0xe5, 0xe7, 0x1e, 0xc5, 0x3f, 0xc4, 0x87, 0xe2,\n  0x73, 0xf1, 0xb5, 0xf8, 0x4e, 0x9c, 0x11, 0xbf, 0x88, 0x3f, 0x14, 0xa6,\n  0xb8, 0x14, 0x93, 0x29, 0xc6, 0x1a, 0x63, 0x93, 0xf1, 0x08, 0xbd, 0xaf,\n  0x35, 0x36, 0x1b, 0x8f, 0x32, 0x61, 0x7c, 0x6c, 0x7c, 0xc2, 0x54, 0xb5,\n  0x89, 0x7e, 0xce, 0x70, 0x1a, 0x2e, 0x23, 0x90, 0xc6, 0x7e, 0x2a, 0xad,\n  0x2a, 0xd7, 0xe9, 0xe7, 0x0d, 0xd5, 0x08, 0xa2, 0x79, 0x90, 0x46, 0x7f,\n  0xcd, 0xd4, 0x7f, 0x36, 0x34, 0x23, 0x98, 0xe6, 0x44, 0x3a, 0xfd, 0x35,\n  0x4b, 0xff, 0xc5, 0xd0, 0x8d, 0x10, 0x9a, 0x1f, 0x19, 0x14, 0x4b, 0x65,\n  0xe8, 0xbf, 0x1a, 0x86, 0x11, 0x4a, 0x73, 0x25, 0x93, 0xfe, 0xca, 0xd4,\n  0x2f, 0x18, 0x6e, 0x23, 0x8c, 0xe6, 0x4d, 0x23, 0xe6, 0x52, 0xf3, 0xf4,\n  0xdf, 0x0c, 0xd3, 0x08, 0xa7, 0x39, 0x94, 0x45, 0xf7, 0x1a, 0xe9, 0x17,\n  0x0d, 0x3f, 0x23, 0x82, 0xe6, 0x53, 0x36, 0xfd, 0x95, 0xa5, 0xff, 0x6e,\n  0xf8, 0x1b, 0x91, 0x34, 0xb7, 0x72, 0x88, 0xb3, 0xa9, 0xfe, 0x87, 0x11,\n  0x60, 0x44, 0xd1, 0x3c, 0x6b, 0x4c, 0x32, 0xbd, 0x67, 0xbc, 0xcf, 0x84,\n  0xc6, 0xb5, 0xdd, 0x04, 0x43, 0xb5, 0xc7, 0x69, 0x36, 0x4d, 0xd4, 0x16,\n  0x10, 0xbe, 0x4b, 0x3f, 0x46, 0x30, 0x01, 0xf4, 0x44, 0x49, 0xd7, 0x9e,\n  0xd0, 0xbf, 0x22, 0xf8, 0x94, 0xfe, 0x35, 0xc1, 0x17, 0xf4, 0xe3, 0x14,\n  0x99, 0x45, 0x68, 0x07, 0xf4, 0x6f, 0xa8, 0xc4, 0x3c, 0xed, 0x35, 0xa2,\n  0xbd, 0xa7, 0x7f, 0x4b, 0xf0, 0x13, 0xfd, 0x04, 0xc1, 0x63, 0xfa, 0x49,\n  0x82, 0xa6, 0xb6, 0x97, 0xa0, 0xa2, 0x3d, 0x40, 0xd0, 0xa5, 0x3d, 0x44,\n  0x50, 0xd3, 0x1e, 0x66, 0x42, 0xad, 0xd5, 0x96, 0x12, 0x3e, 0x59, 0x42,\n  0xd5, 0xab, 0x6d, 0x23, 0x7c, 0x0a, 0x60, 0xb0, 0xb6, 0x8f, 0x60, 0x80,\n  0x46, 0xba, 0xd2, 0x1c, 0xda, 0x83, 0x4c, 0x51, 0x7d, 0x5a, 0xa0, 0xf6,\n  0x18, 0x53, 0xb4, 0xa9, 0xda, 0x63, 0xe6, 0x4e, 0xa2, 0x1a, 0xda, 0x1e,\n  0x82, 0x42, 0x7b, 0x84, 0x60, 0x98, 0xb6, 0x9f, 0xca, 0x5f, 0xd2, 0x9e,\n  0x25, 0x7c, 0xa2, 0x84, 0xea, 0x65, 0xed, 0x65, 0xc2, 0x27, 0x11, 0x74,\n  0xa8, 0x1b, 0xd5, 0x4d, 0xea, 0x66, 0xed, 0x15, 0x26, 0x78, 0x07, 0xed,\n  0x73, 0x82, 0x1d, 0x25, 0xd4, 0x98, 0x76, 0x9a, 0xe0, 0x34, 0x09, 0x79,\n  0x8a, 0x76, 0x9c, 0x60, 0xaa, 0x84, 0x2c, 0x44, 0xbf, 0x44, 0x30, 0x54,\n  0xbf, 0x2c, 0x77, 0xf4, 0x74, 0xb9, 0x47, 0x19, 0xae, 0x7b, 0x65, 0x5e,\n  0x54, 0xf7, 0xc9, 0x1d, 0x36, 0x43, 0xfa, 0x13, 0x51, 0x86, 0xf4, 0xa4,\n  0xa2, 0x0d, 0x41, 0x30, 0xc6, 0x90, 0xbe, 0x44, 0xac, 0x41, 0x9e, 0x02,\n  0xf5, 0xa6, 0x8b, 0x20, 0xf5, 0x21, 0x41, 0xea, 0x3b, 0x82, 0xd4, 0x67,\n  0x04, 0xa9, 0xaf, 0x08, 0x52, 0x1f, 0x11, 0xa4, 0xbe, 0x21, 0x48, 0x7d,\n  0x42, 0x90, 0xfa, 0x82, 0x20, 0xf5, 0x81, 0x2c, 0x2b, 0x9f, 0xab, 0x9f,\n  0x97, 0xcf, 0xd5, 0x7f, 0x96, 0xcf, 0xd5, 0x7f, 0x91, 0xcf, 0xd5, 0x7f,\n  0x95, 0xcf, 0xa5, 0xb2, 0x0c, 0x65, 0x39, 0xca, 0x0a, 0x94, 0x55, 0x50,\n  0x56, 0x7a, 0x28, 0xd1, 0xf0, 0x70, 0x19, 0x79, 0xa2, 0xfe, 0xb2, 0x05,\n  0x64, 0xe3, 0x14, 0xe4, 0xa0, 0xfd, 0xc8, 0xc2, 0xa5, 0x12, 0x2d, 0x87,\n  0xec, 0x5a, 0x00, 0x6b, 0x46, 0x57, 0x10, 0x2b, 0xa7, 0x2b, 0x98, 0x75,\n  0x66, 0x3d, 0x88, 0xaf, 0x37, 0xcd, 0xa4, 0x58, 0xb2, 0x55, 0x6b, 0xc8,\n  0xdb, 0x78, 0x8d, 0xbd, 0x4e, 0x56, 0xf1, 0x53, 0xf6, 0x19, 0x95, 0xf8,\n  0x81, 0xae, 0x74, 0x8a, 0xb9, 0x4e, 0x91, 0x4f, 0x73, 0x86, 0xae, 0x4c,\n  0x76, 0x96, 0xfd, 0x4c, 0xbe, 0xc5, 0xaf, 0x74, 0x35, 0x66, 0x97, 0x59,\n  0x2d, 0xcb, 0xe5, 0x2e, 0xae, 0xb2, 0x3c, 0xee, 0xe6, 0x6e, 0xd6, 0x8c,\n  0x27, 0xf0, 0x44, 0x96, 0xcf, 0xf3, 0x79, 0x01, 0x2b, 0x54, 0xba, 0x2b,\n  0x3d, 0x58, 0x31, 0x69, 0xc2, 0xc1, 0x5a, 0xd0, 0xc8, 0x0e, 0x60, 0xd5,\n  0xb0, 0xd1, 0x98, 0xb9, 0x21, 0x6d, 0xec, 0x53, 0x24, 0x0e, 0x83, 0x7c,\n  0x29, 0xb3, 0x1a, 0x7e, 0x94, 0x20, 0x6f, 0x28, 0xd6, 0x9a, 0xdd, 0x32,\n  0x9d, 0xc5, 0x46, 0xc3, 0xcf, 0x70, 0xd8, 0xf3, 0xfd, 0x8c, 0xec, 0x0b,\n  0xb2, 0xd8, 0xdc, 0xf6, 0xbf, 0x8c, 0xab, 0x76, 0x38, 0xf7, 0xbb, 0x3f,\n  0x64, 0x4e, 0xec, 0x6d, 0xa6, 0xbb, 0x8f, 0xbb, 0xbf, 0x65, 0x8d, 0xb0,\n  0xb7, 0x99, 0xe3, 0x3e, 0xe3, 0x3e, 0xcb, 0xf2, 0xdc, 0xe7, 0xdd, 0xbf,\n  0xb2, 0x7c, 0xf7, 0x6f, 0xee, 0x8b, 0xac, 0x18, 0xbb, 0x94, 0x2d, 0xa8,\n  0x7c, 0xe0, 0x7f, 0x90, 0xdd, 0xbe, 0xe0, 0xbe, 0xc0, 0x52, 0x90, 0xa1,\n  0x4e, 0xa5, 0x38, 0x79, 0x29, 0xcb, 0xa0, 0x38, 0xf9, 0x56, 0x96, 0x29,\n  0xa3, 0x64, 0x96, 0x4d, 0x31, 0xf2, 0x1d, 0xac, 0x31, 0x45, 0xc9, 0x1b,\n  0x58, 0x2e, 0xc5, 0xc9, 0x9b, 0x58, 0x13, 0x8a, 0x94, 0xef, 0x66, 0x79,\n  0x57, 0xbc, 0x24, 0x5a, 0x45, 0x42, 0x69, 0xd6, 0x24, 0x9a, 0x3b, 0xe5,\n  0x3a, 0x6b, 0xee, 0xad, 0x5b, 0x3f, 0xcd, 0xdd, 0x75, 0x2b, 0xa7, 0xb9,\n  0xc7, 0x7c, 0xcd, 0x7c, 0x59, 0xae, 0x7d, 0xf0, 0x0c, 0xab, 0x48, 0x57,\n  0xe7, 0xc8, 0xa2, 0x9f, 0x55, 0x52, 0xc9, 0x12, 0x67, 0x90, 0x05, 0x9e,\n  0xe6, 0x78, 0x9b, 0x2c, 0xed, 0x4c, 0xb2, 0xb0, 0x4b, 0x9d, 0x07, 0xb5,\n  0x0c, 0xb2, 0x99, 0x64, 0x23, 0xaf, 0xe8, 0xd3, 0x35, 0x98, 0x3c, 0xc0,\n  0x3c, 0xd6, 0x92, 0x7a, 0xb4, 0x0b, 0x1b, 0xcf, 0xe6, 0x51, 0x2c, 0xbd,\n  0x9a, 0xd6, 0xac, 0xfd, 0xec, 0x0d, 0xfe, 0xa9, 0x38, 0xa5, 0x78, 0x9d,\n  0x81, 0xae, 0x64, 0x57, 0x8e, 0xab, 0xc8, 0xe5, 0x71, 0x75, 0x72, 0x49,\n  0x1d, 0x3a, 0xa8, 0x97, 0x85, 0xfb, 0x25, 0x60, 0x9f, 0xd6, 0x63, 0x67,\n  0x81, 0xc9, 0x78, 0x26, 0x90, 0x85, 0x2b, 0x4f, 0x33, 0x85, 0xec, 0x6d,\n  0x95, 0x28, 0x27, 0xea, 0x7e, 0xe5, 0x49, 0xdc, 0x93, 0x71, 0x9d, 0x29,\n  0x2a, 0x24, 0x85, 0xe7, 0xd7, 0x97, 0x7b, 0xbd, 0x1e, 0xfb, 0xac, 0x1e,\n  0x3b, 0x77, 0x55, 0x5d, 0xcf, 0xd8, 0x75, 0xb5, 0x47, 0x5d, 0x4f, 0x35,\n  0xa8, 0xab, 0x12, 0x75, 0x15, 0x80, 0x12, 0x4b, 0x2d, 0x28, 0xa3, 0x95,\n  0xb9, 0x3b, 0xeb, 0xcf, 0x86, 0x53, 0x3b, 0xa6, 0xb3, 0xb9, 0x6c, 0x11,\n  0x5b, 0x41, 0xeb, 0xe6, 0x46, 0xb6, 0x9d, 0xed, 0x66, 0x8f, 0xd2, 0x0a,\n  0xfc, 0x12, 0xd9, 0xfa, 0xf7, 0x48, 0xe6, 0xaf, 0x69, 0x64, 0x9e, 0x67,\n  0x7f, 0x70, 0x6a, 0x3c, 0x37, 0x8d, 0xdf, 0x98, 0xe2, 0xd8, 0xe0, 0xd8,\n  0x68, 0xfc, 0x8e, 0xf7, 0x4d, 0xc6, 0x45, 0xbc, 0x6f, 0x36, 0x2e, 0xe0,\n  0x7d, 0x8b, 0x9b, 0xd3, 0xfb, 0x46, 0xc7, 0x06, 0xb7, 0x82, 0xf7, 0x8d,\n  0x6e, 0x27, 0xde, 0x37, 0xb9, 0x1d, 0x78, 0xdf, 0xec, 0x16, 0x78, 0xdf,\n  0xe2, 0xf6, 0xa3, 0xf7, 0x4d, 0xc4, 0x17, 0x80, 0xf7, 0x8d, 0xee, 0x20,\n  0xbc, 0x6f, 0x72, 0x07, 0xe2, 0x7d, 0xb3, 0xdb, 0x1f, 0xef, 0x5b, 0xdc,\n  0x2a, 0xbd, 0x6f, 0x26, 0x3e, 0x1d, 0xef, 0x1b, 0xdd, 0x6e, 0xbc, 0x6f,\n  0x72, 0x1b, 0x78, 0xdf, 0xec, 0xd6, 0xf0, 0xbe, 0xc5, 0xb8, 0x44, 0xef,\n  0x5b, 0x1c, 0x1b, 0x8c, 0x5a, 0xbc, 0x6f, 0x34, 0x7c, 0x78, 0xdf, 0x64,\n  0x78, 0xf1, 0xbe, 0xd9, 0xb8, 0x8c, 0xf7, 0x2d, 0x6e, 0x99, 0x88, 0xdd,\n  0xe8, 0x26, 0x7b, 0x40, 0x75, 0x90, 0xe5, 0xa0, 0x3b, 0x7f, 0x10, 0xdc,\n  0xf2, 0xbf, 0xd7, 0x88, 0xbb, 0x09, 0x5a, 0xbe, 0xc1, 0xdd, 0xd4, 0xd2,\n  0x8c, 0x3b, 0xdf, 0xd2, 0x8c, 0xbb, 0x99, 0xa5, 0x19, 0x77, 0x9e, 0xad,\n  0x99, 0x96, 0xb6, 0x66, 0x5a, 0xdb, 0x1a, 0x29, 0xb1, 0x35, 0xd2, 0xca,\n  0xd6, 0x48, 0x7b, 0x5b, 0x23, 0x95, 0xb6, 0x46, 0x3a, 0xda, 0x1a, 0xe9,\n  0x60, 0x6b, 0xa4, 0xc2, 0xd6, 0x48, 0x5b, 0x5b, 0x23, 0xa5, 0xb6, 0x46,\n  0xda, 0xd9, 0x1a, 0x29, 0xb3, 0x35, 0xe2, 0xb1, 0x34, 0xe2, 0x2e, 0xb4,\n  0x34, 0xe2, 0x2e, 0xb6, 0x34, 0xe2, 0x6e, 0x61, 0x69, 0xc4, 0xdd, 0xdc,\n  0xd2, 0x88, 0xbb, 0xc8, 0xd6, 0x48, 0x2e, 0xb5, 0x7f, 0x83, 0xbb, 0x1c,\n  0x1a, 0x69, 0x23, 0x35, 0xe2, 0x2e, 0xf8, 0x2f, 0x35, 0x32, 0xc6, 0xd6,\n  0xc8, 0x38, 0x5b, 0x23, 0x13, 0x6c, 0x8d, 0x8c, 0xb7, 0x35, 0x32, 0xd6,\n  0xd6, 0xc8, 0x0c, 0x5b, 0x23, 0xb3, 0xec, 0xb1, 0x72, 0x8d, 0xad, 0x99,\n  0xd9, 0xb6, 0x66, 0x66, 0xda, 0x9a, 0x99, 0x6f, 0x6b, 0x66, 0xa1, 0xad,\n  0x99, 0x1b, 0x6c, 0x8d, 0x2c, 0xb0, 0x35, 0x32, 0xc7, 0xd6, 0xc8, 0x75,\n  0xb6, 0x46, 0xae, 0xb7, 0x35, 0x32, 0xcf, 0xd6, 0xc8, 0x5c, 0x5b, 0x23,\n  0x93, 0x6c, 0x8d, 0x4c, 0xb1, 0x35, 0x32, 0xcd, 0xd6, 0xc8, 0x54, 0x5b,\n  0x23, 0x93, 0x6d, 0x8d, 0x8c, 0x86, 0x46, 0xa6, 0x63, 0xa4, 0x5c, 0x0b,\n  0x8d, 0x4c, 0xfc, 0x2f, 0x35, 0xd2, 0xd9, 0xd6, 0x48, 0xb5, 0xad, 0x91,\n  0xae, 0xb6, 0x46, 0xba, 0xd8, 0x1a, 0xa9, 0xb2, 0x35, 0xd2, 0xc7, 0xd6,\n  0x48, 0x3f, 0x5b, 0x23, 0x03, 0x6c, 0x8d, 0xf4, 0xb7, 0x35, 0xd2, 0xd7,\n  0xd6, 0xc8, 0x30, 0x5b, 0x23, 0x23, 0x6c, 0x8d, 0x8c, 0xb2, 0xc7, 0xca,\n  0x48, 0x5b, 0x33, 0xc3, 0x6d, 0xcd, 0x0c, 0xb4, 0x35, 0x33, 0xd8, 0xd6,\n  0xcc, 0x10, 0x5b, 0x33, 0x83, 0x6c, 0x8d, 0x74, 0xb3, 0x35, 0xd2, 0xc3,\n  0xd6, 0x48, 0x2f, 0x5b, 0x23, 0x3d, 0x6d, 0x8d, 0x74, 0xb7, 0x35, 0xd2,\n  0x09, 0x1a, 0xe9, 0x0d, 0x8d, 0x0c, 0xc5, 0x48, 0xa9, 0xf9, 0x2f, 0x35,\n  0x12, 0x62, 0x6b, 0x24, 0xcc, 0xd6, 0x48, 0x84, 0xad, 0x91, 0x70, 0x5b,\n  0x23, 0xa1, 0xb6, 0x46, 0xe2, 0x6c, 0x8d, 0x24, 0xd8, 0x1a, 0x49, 0xb2,\n  0x35, 0x92, 0x68, 0x6b, 0x24, 0xde, 0xd6, 0x48, 0x23, 0x5b, 0x23, 0xd9,\n  0xb6, 0x46, 0x1a, 0xdb, 0x1a, 0xc9, 0xb1, 0x35, 0x92, 0x65, 0x6b, 0x24,\n  0xc5, 0xd6, 0x48, 0x9a, 0xad, 0x91, 0x0c, 0x5b, 0x23, 0xe9, 0xf6, 0x58,\n  0x49, 0xb5, 0x35, 0x13, 0x69, 0x6b, 0x26, 0xca, 0xd6, 0x4c, 0x8c, 0xad,\n  0x99, 0x68, 0x5b, 0x33, 0xc1, 0xd0, 0x48, 0x2c, 0x34, 0x92, 0x09, 0x8d,\n  0x24, 0xcb, 0x91, 0x22, 0x2d, 0xb2, 0x46, 0x54, 0xe3, 0x57, 0x60, 0xf1,\n  0xf5, 0x18, 0x79, 0x5b, 0x14, 0x41, 0x49, 0x6c, 0x5b, 0x3d, 0xf6, 0x58,\n  0x3d, 0x76, 0xda, 0xc6, 0xc2, 0xc8, 0x13, 0xc8, 0xb4, 0x4f, 0x4b, 0x95,\n  0xb3, 0x0e, 0x38, 0x57, 0xd5, 0x57, 0xea, 0x47, 0xb6, 0xc1, 0xb1, 0x45,\n  0x8b, 0xd1, 0xe2, 0xb4, 0x05, 0x14, 0xc9, 0xef, 0xd6, 0xbe, 0xbd, 0xb2,\n  0x26, 0xf1, 0xb5, 0x64, 0xfd, 0x4d, 0x36, 0x99, 0x96, 0x41, 0x8d, 0xfc,\n  0x8c, 0x58, 0xf2, 0x23, 0xea, 0x56, 0xa8, 0xbe, 0xea, 0x02, 0xe6, 0x70,\n  0xdf, 0xe3, 0x7e, 0xd8, 0x7d, 0x97, 0x3a, 0xdf, 0xc6, 0xb6, 0xaa, 0x37,\n  0x00, 0xdb, 0x43, 0xb4, 0x85, 0x36, 0xb6, 0x55, 0xbd, 0x8e, 0xb0, 0x9d,\n  0xe0, 0x9b, 0x6b, 0x63, 0x5b, 0xd5, 0xeb, 0x81, 0x49, 0xbe, 0x79, 0x36,\n  0xb6, 0x95, 0x9e, 0x13, 0x4d, 0x32, 0xe6, 0x92, 0x7c, 0x65, 0x24, 0x5d,\n  0x6f, 0x8a, 0xe5, 0xc6, 0xb3, 0x99, 0x14, 0x99, 0x2d, 0x57, 0x97, 0xd5,\n  0x3f, 0x69, 0x69, 0xfd, 0x93, 0x6e, 0xaa, 0x7f, 0xd2, 0xf2, 0xfa, 0x27,\n  0xdd, 0x46, 0xd8, 0x66, 0xc2, 0xef, 0x52, 0xd7, 0xdb, 0xd8, 0x56, 0x75,\n  0x1d, 0xb0, 0x9d, 0x44, 0x5b, 0x6b, 0x63, 0x5b, 0xd5, 0xc5, 0xf5, 0x12,\n  0x2d, 0xaa, 0x97, 0x68, 0x49, 0xbd, 0x44, 0x37, 0xfe, 0x1b, 0x12, 0xad,\n  0xaa, 0x97, 0x68, 0x65, 0xbd, 0x44, 0x6b, 0xea, 0x25, 0x5a, 0x5d, 0x2f,\n  0xd1, 0x86, 0x7a, 0x89, 0xee, 0xac, 0x97, 0xe8, 0x8e, 0x7a, 0x89, 0x6e,\n  0xaf, 0x97, 0xe8, 0xe6, 0x7a, 0x89, 0x56, 0xd4, 0x4b, 0x74, 0x6b, 0xbd,\n  0x44, 0xb7, 0xd4, 0x4b, 0x44, 0x6b, 0x20, 0xbf, 0x9e, 0x2f, 0xe1, 0x6b,\n  0x1a, 0x78, 0x26, 0xe4, 0x8d, 0x4a, 0x9f, 0x44, 0xe6, 0x03, 0xa5, 0xbf,\n  0xd1, 0xe0, 0x4e, 0x38, 0xd3, 0xc8, 0x27, 0x9f, 0x4c, 0xbe, 0xf8, 0x14,\n  0xf2, 0xb8, 0xa7, 0x92, 0x97, 0x3c, 0x0d, 0x77, 0xa4, 0x77, 0x28, 0x7d,\n  0xc3, 0xb3, 0xe4, 0xa1, 0x48, 0x3f, 0xef, 0x4a, 0x09, 0x7f, 0xe6, 0xe0,\n  0x1d, 0x78, 0x47, 0x9e, 0xc2, 0x53, 0xb1, 0x07, 0x49, 0xbe, 0x20, 0x7c,\n  0xc0, 0xab, 0x38, 0xc8, 0x37, 0x9f, 0x48, 0x3e, 0xf9, 0x24, 0xf8, 0x08,\n  0xe4, 0x3f, 0xc2, 0x7b, 0x74, 0x21, 0x7f, 0x26, 0x4f, 0x08, 0x16, 0xc0,\n  0xdb, 0x13, 0xf6, 0x77, 0xbc, 0x75, 0x47, 0x59, 0x7f, 0x9b, 0x36, 0x98,\n  0xc9, 0xf3, 0x25, 0x83, 0x41, 0x0b, 0xb0, 0x69, 0xe3, 0xc9, 0x5b, 0xe2,\n  0x6c, 0x3c, 0x68, 0x38, 0x95, 0xc1, 0xe6, 0x5c, 0x19, 0x81, 0x78, 0xf9,\n  0x83, 0xda, 0x15, 0x12, 0x49, 0x5f, 0xfd, 0xaf, 0xef, 0x37, 0xc1, 0x7d,\n  0xf6, 0x77, 0xf7, 0xb5, 0xa7, 0x30, 0x1f, 0x9e, 0xc3, 0xfd, 0xab, 0xdb,\n  0xf3, 0xbb, 0x7a, 0x51, 0x66, 0x52, 0x50, 0x7e, 0x08, 0x45, 0xea, 0xf3,\n  0xf9, 0xba, 0x7a, 0x0e, 0x4e, 0x91, 0xd5, 0x6d, 0xd8, 0x95, 0x3d, 0xd4,\n  0xa0, 0x54, 0x33, 0x16, 0x4e, 0x51, 0xe0, 0x5a, 0x8a, 0xfc, 0x02, 0x29,\n  0xc2, 0x0b, 0xa6, 0x48, 0x2e, 0x94, 0x22, 0xb6, 0x70, 0x8a, 0xcc, 0x22,\n  0x29, 0x02, 0x7b, 0x4f, 0x3f, 0xa6, 0x7f, 0xa5, 0x7f, 0xad, 0x1f, 0xd7,\n  0xbf, 0xd1, 0xbf, 0xd5, 0x4f, 0xe8, 0x27, 0x91, 0xd7, 0x93, 0x5e, 0xbd,\n  0x3f, 0xf9, 0xe9, 0xa1, 0xff, 0x94, 0xef, 0x4e, 0x24, 0x0f, 0xbe, 0x0b,\n  0xb5, 0xaf, 0x86, 0x75, 0x23, 0x4f, 0x5e, 0xfa, 0xf1, 0x57, 0x9e, 0x94,\n  0xca, 0x02, 0x28, 0xda, 0xdc, 0x6c, 0x7c, 0xa2, 0x36, 0x61, 0xd7, 0xd1,\n  0xe8, 0x9b, 0x25, 0x32, 0x44, 0xa6, 0x9a, 0x27, 0x1a, 0x89, 0x2c, 0xb5,\n  0xa9, 0xf1, 0xbe, 0x88, 0xc0, 0x69, 0xfe, 0x7f, 0x55, 0x77, 0xb7, 0x06,\n  0x6d, 0xd9, 0x67, 0xa8, 0x0d, 0x5b, 0x26, 0x77, 0x8e, 0x91, 0x6d, 0xb9,\n  0x42, 0x5b, 0x6b, 0x04, 0xd5, 0x7b, 0xf2, 0xc9, 0xd8, 0x97, 0x92, 0x77,\n  0xeb, 0x76, 0x43, 0x62, 0xb1, 0x8f, 0x19, 0x5e, 0x4f, 0xcf, 0xb2, 0xe9,\n  0x71, 0xf2, 0x1c, 0x0c, 0xc5, 0xbd, 0x29, 0xf5, 0xd9, 0x59, 0xd4, 0xef,\n  0xbb, 0x00, 0x7a, 0xaa, 0x21, 0x3f, 0xa7, 0x5a, 0x57, 0x6b, 0x2a, 0x4a,\n  0xe7, 0xd4, 0xe7, 0x55, 0x19, 0x4b, 0x40, 0x2e, 0x3b, 0x95, 0xec, 0x4a,\n  0x5d, 0xbd, 0xb1, 0xf5, 0x77, 0x04, 0xf2, 0xa9, 0xb1, 0x76, 0xbe, 0xbb,\n  0x99, 0x3d, 0x9e, 0xea, 0xfb, 0x8e, 0x4d, 0x24, 0x4f, 0x59, 0xbe, 0xe4,\n  0x58, 0x4c, 0xa5, 0xfb, 0xe5, 0x0d, 0x38, 0xea, 0x25, 0xd0, 0x2f, 0x19,\n  0x8e, 0x06, 0x92, 0xc1, 0x9b, 0xa7, 0x18, 0xed, 0x3c, 0xc5, 0x66, 0xbf,\n  0x50, 0x4c, 0x76, 0x41, 0xff, 0x4d, 0xbf, 0xa8, 0xff, 0xae, 0xff, 0xa1,\n  0x5f, 0xd2, 0x2f, 0xeb, 0xb5, 0xba, 0x57, 0xf7, 0x19, 0xcc, 0xe0, 0x86,\n  0x30, 0x14, 0x44, 0x64, 0x56, 0x14, 0xc6, 0x10, 0x01, 0x19, 0x57, 0xd7,\n  0xf2, 0x57, 0x3a, 0x27, 0x3e, 0x95, 0x62, 0x7d, 0x9d, 0x62, 0x7a, 0x37,\n  0xc5, 0xee, 0x7e, 0x14, 0xa3, 0x07, 0x40, 0x8a, 0x73, 0xff, 0x2c, 0xc5,\n  0x5f, 0xf1, 0xfe, 0x6b, 0x29, 0x48, 0xee, 0x3f, 0x1a, 0x4a, 0xc1, 0x5b,\n  0xb2, 0x8d, 0x32, 0x7f, 0x6b, 0x3c, 0x62, 0x3c, 0x6a, 0x3c, 0x46, 0x36,\n  0xfc, 0xea, 0x1c, 0xee, 0x6e, 0xed, 0xf1, 0xfa, 0x3c, 0xee, 0x6b, 0x7f,\n  0x9f, 0xc9, 0xfd, 0x37, 0xb2, 0xb5, 0xff, 0x4e, 0xde, 0x55, 0xe6, 0x5c,\n  0x97, 0x22, 0xe3, 0xba, 0x0a, 0x99, 0xd6, 0xbb, 0x90, 0x63, 0xdd, 0x86,\n  0x0c, 0xeb, 0x3d, 0xc8, 0xac, 0xd6, 0x65, 0x55, 0x1f, 0xd3, 0xf6, 0xd8,\n  0x99, 0xd5, 0xa7, 0xb5, 0x67, 0x91, 0x55, 0x95, 0x19, 0xd5, 0x97, 0xed,\n  0x7c, 0xea, 0x1b, 0xc8, 0xa4, 0x7e, 0x88, 0x1c, 0xaa, 0xcc, 0x9f, 0x7e,\n  0x8e, 0xec, 0xe9, 0xd7, 0xc8, 0x9b, 0x9e, 0x42, 0xc6, 0xf4, 0x47, 0xed,\n  0x34, 0xb2, 0xa5, 0x7f, 0x20, 0x53, 0xea, 0x45, 0x86, 0x54, 0x66, 0x47,\n  0x7f, 0x45, 0xf6, 0xd3, 0xce, 0x7c, 0x6a, 0xc7, 0xb5, 0xbf, 0xcf, 0x39,\n  0x72, 0xf2, 0x24, 0x1c, 0x4c, 0xc7, 0xdc, 0x49, 0xa6, 0xb1, 0x93, 0x46,\n  0xab, 0x5b, 0x06, 0xd9, 0x27, 0xf9, 0x0d, 0x0e, 0xd9, 0x88, 0xb2, 0x73,\n  0xc9, 0xa6, 0xe4, 0xb1, 0xa6, 0x34, 0xaa, 0xf2, 0xc9, 0xaa, 0x15, 0xb2,\n  0x22, 0x56, 0x4c, 0x6b, 0x41, 0x0b, 0x5a, 0x01, 0x5b, 0x91, 0x6d, 0x6b,\n  0xcd, 0xda, 0x30, 0x0f, 0xd9, 0xb2, 0xa1, 0x6c, 0x04, 0x9b, 0xc6, 0x6e,\n  0x20, 0xef, 0x64, 0x31, 0xbb, 0x91, 0x2d, 0xa1, 0xb8, 0x6d, 0x19, 0x5b,\n  0xce, 0x6e, 0x22, 0x5f, 0xe5, 0x66, 0x76, 0x0b, 0xbb, 0x95, 0x22, 0xf2,\n  0x55, 0x14, 0xc9, 0xad, 0x21, 0xcf, 0x65, 0x1d, 0x5b, 0xcf, 0x6e, 0x63,\n  0xb7, 0xb3, 0x3b, 0xd8, 0x9d, 0xf4, 0xec, 0x4d, 0x6c, 0x33, 0xdb, 0xc2,\n  0xb6, 0xb2, 0xbb, 0xd8, 0x36, 0xf2, 0x64, 0x5e, 0x21, 0xab, 0xfc, 0x06,\n  0xf9, 0x33, 0x87, 0xd9, 0x3f, 0xc8, 0xa7, 0x39, 0xc2, 0x3e, 0x64, 0x1f,\n  0x93, 0x8d, 0xfe, 0x9c, 0x1d, 0x65, 0xc7, 0xd8, 0x37, 0xec, 0x04, 0xfb,\n  0x8e, 0x7c, 0x9c, 0x53, 0x14, 0x41, 0x9f, 0x25, 0x4f, 0xe7, 0x67, 0x8a,\n  0xdc, 0x7f, 0x63, 0x7f, 0x90, 0xed, 0xf5, 0xca, 0xe9, 0xc8, 0x1d, 0x64,\n  0x81, 0x35, 0x8a, 0xde, 0xfd, 0x78, 0x00, 0x0f, 0xe2, 0x21, 0x3c, 0x8c,\n  0x47, 0xf0, 0x28, 0x1e, 0xc3, 0xe3, 0xc8, 0x7e, 0x27, 0x91, 0x2d, 0x4f,\n  0xe3, 0x19, 0xbc, 0x11, 0xcf, 0xe6, 0x8d, 0x79, 0x13, 0xde, 0x94, 0x2c,\n  0x7e, 0x21, 0x2f, 0xe6, 0x2d, 0x78, 0x4b, 0x5e, 0xc2, 0xdb, 0xf0, 0x32,\n  0x5e, 0xce, 0x2b, 0xc8, 0xe6, 0xff, 0xce, 0x2f, 0xf1, 0x5a, 0xee, 0x13,\n  0x21, 0x22, 0x54, 0x84, 0x29, 0xdd, 0xd5, 0xc7, 0x69, 0x65, 0xda, 0xe2,\n  0xde, 0xea, 0xbe, 0xcb, 0xbd, 0xcd, 0x7d, 0xb7, 0x7b, 0x3b, 0xad, 0x5c,\n  0xf7, 0xba, 0x77, 0xd0, 0x2a, 0xf4, 0x52, 0x83, 0x91, 0x57, 0xc2, 0x36,\n  0x5d, 0x19, 0x79, 0xd8, 0x0f, 0xf8, 0xdf, 0x8c, 0xbe, 0x2b, 0x23, 0xef,\n  0xbf, 0xcf, 0xf9, 0xd7, 0x8d, 0xbe, 0xb5, 0x7f, 0x39, 0xfe, 0x76, 0xfe,\n  0x69, 0x04, 0xfe, 0x5f, 0x8c, 0xbf, 0x7f, 0x39, 0xfa, 0xfe, 0xc5, 0xd8,\n  0xdb, 0xd4, 0x60, 0xec, 0xc9, 0x71, 0x54, 0xce, 0xda, 0xb3, 0x0a, 0x56,\n  0x49, 0x9e, 0x59, 0x47, 0xf2, 0x7a, 0x3b, 0x23, 0x7f, 0x50, 0xb7, 0x26,\n  0x74, 0xa7, 0x55, 0x41, 0xe6, 0xb9, 0xe5, 0xca, 0xd0, 0x97, 0xf5, 0x23,\n  0x8f, 0x78, 0x00, 0x1b, 0xc8, 0x06, 0x35, 0x18, 0x7b, 0x77, 0x93, 0x4f,\n  0x7c, 0x0f, 0xbb, 0x97, 0xed, 0x60, 0x3b, 0xd9, 0x2e, 0x76, 0x1f, 0xbb,\n  0x9f, 0x3c, 0xe4, 0x07, 0xd8, 0x83, 0xec, 0x21, 0xf6, 0x30, 0xdb, 0xc3,\n  0xf6, 0xb2, 0x47, 0xc8, 0x5f, 0x7e, 0x8c, 0xed, 0x63, 0x8f, 0xb3, 0xfd,\n  0xec, 0x09, 0xf6, 0x24, 0xf9, 0xce, 0xcf, 0xb0, 0x67, 0xd9, 0x73, 0xec,\n  0x79, 0xf6, 0x02, 0x3b, 0xc0, 0x5e, 0x64, 0x2f, 0xb3, 0x57, 0xc9, 0x27,\n  0x38, 0xc8, 0xde, 0x64, 0x6f, 0xb3, 0x77, 0xd8, 0xbb, 0xec, 0x7d, 0xf6,\n  0x01, 0xfb, 0x88, 0x7d, 0x42, 0x3e, 0xc2, 0x17, 0xec, 0x4b, 0xf6, 0x15,\n  0x3b, 0xce, 0xbe, 0x65, 0x27, 0xd9, 0xf7, 0xec, 0x47, 0x76, 0x9a, 0xfd,\n  0xc4, 0xce, 0xb1, 0x5f, 0x90, 0x11, 0xbf, 0xc4, 0x6a, 0x99, 0x8f, 0x73,\n  0xae, 0x70, 0x27, 0x57, 0xb9, 0xce, 0x4d, 0xee, 0xcf, 0x03, 0x79, 0x30,\n  0x0f, 0xe5, 0xe1, 0x3c, 0x92, 0x47, 0xf3, 0x58, 0x1e, 0xcf, 0x13, 0x79,\n  0x32, 0x4f, 0xe5, 0xe9, 0x3c, 0x93, 0x67, 0xf1, 0x1c, 0x9e, 0xcb, 0xf3,\n  0x78, 0x33, 0x5e, 0xc0, 0x8b, 0x78, 0x73, 0xde, 0x8a, 0xb7, 0xe6, 0x6d,\n  0x79, 0x3b, 0xde, 0x9e, 0x57, 0x92, 0xc7, 0xf1, 0x07, 0xbf, 0xcc, 0xbd,\n  0x64, 0xe4, 0xac, 0xf1, 0xd7, 0xe3, 0x7f, 0x1e, 0x7d, 0xb4, 0x26, 0xc5,\n  0xff, 0xa5, 0x0d, 0xff, 0x37, 0x69, 0xd8, 0xff, 0xb3, 0x2c, 0xaa, 0x5c,\n  0x1d, 0x0c, 0x58, 0xf7, 0xd0, 0x06, 0x9e, 0x43, 0x11, 0xde, 0xe5, 0xa7,\n  0x1e, 0x42, 0x89, 0x2b, 0x99, 0x65, 0xaa, 0x8f, 0x50, 0x89, 0x8e, 0xac,\n  0x4a, 0x7d, 0x14, 0xef, 0x5d, 0xd5, 0x87, 0xa9, 0x8e, 0x8e, 0xea, 0x1e,\n  0x82, 0x55, 0xea, 0x5e, 0x82, 0x5d, 0xb1, 0x9a, 0x76, 0x6c, 0xb8, 0xfe,\n  0x30, 0xac, 0xb0, 0xc6, 0x67, 0x0d, 0x69, 0xfa, 0x79, 0xf0, 0x85, 0x5c,\n  0x45, 0x5b, 0x01, 0x1f, 0xa3, 0xb4, 0x41, 0xfb, 0xe6, 0xb3, 0x12, 0x8d,\n  0x6b, 0xa1, 0x9a, 0xa9, 0x29, 0x9a, 0x4b, 0xd3, 0xb4, 0x60, 0x2d, 0x40,\n  0x73, 0x68, 0x81, 0x9a, 0xa1, 0x09, 0x2d, 0x4c, 0x9f, 0xa8, 0x4f, 0xd0,\n  0x27, 0xd9, 0x7b, 0x3f, 0xf6, 0xfe, 0xce, 0x95, 0xdd, 0x1d, 0xb9, 0xa3,\n  0xa3, 0x85, 0xfc, 0x8b, 0x7d, 0x9c, 0xa0, 0xbf, 0xdf, 0xc3, 0x91, 0x3b,\n  0x38, 0xf8, 0x2e, 0x4a, 0x69, 0x01, 0xeb, 0x6c, 0xd7, 0x55, 0xb6, 0x87,\n  0xf7, 0xe3, 0xa3, 0xf9, 0x6c, 0xbe, 0x8d, 0xdf, 0xcd, 0xb7, 0x8b, 0x1d,\n  0x62, 0x9f, 0x92, 0xa4, 0xa4, 0x28, 0xb7, 0x2b, 0x1b, 0x94, 0xad, 0xca,\n  0x3b, 0xca, 0xbb, 0x72, 0x4f, 0x41, 0xee, 0x1c, 0xb8, 0x46, 0xba, 0x46,\n  0xb9, 0x46, 0xbb, 0xc6, 0xb8, 0xc6, 0xba, 0xc6, 0xb9, 0xc6, 0xbb, 0x26,\n  0xb8, 0x2e, 0xb8, 0x7e, 0x73, 0x5d, 0x74, 0xfd, 0x4e, 0x9e, 0xe8, 0x6e,\n  0x9a, 0xcd, 0x0f, 0x62, 0x3e, 0xef, 0xa1, 0x99, 0xfd, 0x08, 0xcd, 0xc6,\n  0xc7, 0x68, 0x4e, 0x3e, 0xae, 0xed, 0xd7, 0x85, 0x3e, 0x4e, 0xe6, 0x0b,\n  0x45, 0x19, 0x5f, 0x2d, 0xcf, 0xee, 0x8a, 0x15, 0x42, 0xfe, 0xce, 0x51,\n  0x67, 0xeb, 0x9d, 0x0f, 0x66, 0xcd, 0xe4, 0xf9, 0x7d, 0xe1, 0x76, 0x0a,\n  0x87, 0xd3, 0x21, 0x84, 0xe3, 0x18, 0x13, 0x3e, 0x0f, 0x4b, 0x4c, 0xd0,\n  0x18, 0x59, 0xed, 0x40, 0xc6, 0x2a, 0xbb, 0x76, 0xad, 0x94, 0xdf, 0xf1,\n  0xe2, 0xab, 0x75, 0x34, 0xf6, 0x7e, 0x46, 0x15, 0x35, 0x96, 0xdf, 0x30,\n  0xc7, 0xe5, 0xb7, 0x63, 0x31, 0x7c, 0xff, 0x09, 0x23, 0x7f, 0xc8, 0x61,\n  0xef, 0x22, 0x4b, 0xef, 0x33, 0x14, 0x1e, 0x87, 0x7c, 0x77, 0x18, 0x89,\n  0xc4, 0xe9, 0xcf, 0xe5, 0x1e, 0xb2, 0xfc, 0x96, 0x24, 0x3f, 0x36, 0x9f,\n  0xc6, 0x6a, 0x53, 0x3e, 0x8c, 0x8f, 0xe0, 0x0b, 0xf8, 0x1a, 0xbe, 0x96,\n  0xdf, 0x45, 0xed, 0x7d, 0x98, 0xef, 0xe5, 0x9f, 0xf3, 0x2f, 0xf8, 0x4f,\n  0xfc, 0x2c, 0x59, 0x4c, 0x9f, 0x88, 0x10, 0x31, 0xa2, 0x48, 0x14, 0x8b,\n  0x7e, 0x62, 0x90, 0x78, 0x46, 0x3c, 0x2b, 0x5e, 0x15, 0x07, 0xc5, 0x47,\n  0xe2, 0xa8, 0x38, 0x2f, 0x7e, 0x16, 0x3e, 0xc5, 0x54, 0xd2, 0x94, 0x74,\n  0xa5, 0x54, 0x69, 0xaf, 0x0c, 0x57, 0xae, 0x51, 0xe6, 0x2b, 0x0b, 0x94,\n  0x15, 0xca, 0x2d, 0xca, 0xdd, 0xca, 0x61, 0xe5, 0x43, 0xe5, 0x2b, 0xc5,\n  0xe7, 0x60, 0x0e, 0xd3, 0xe1, 0xe7, 0xe8, 0xea, 0xa8, 0x71, 0x0c, 0x74,\n  0x0c, 0x71, 0x2c, 0x72, 0xac, 0x21, 0xdd, 0xc5, 0x39, 0x33, 0x9c, 0x4d,\n  0xa2, 0x9f, 0x8b, 0x7e, 0x3e, 0x76, 0x79, 0xdc, 0x0b, 0x71, 0x27, 0xe2,\n  0x7e, 0x8d, 0xe7, 0xf1, 0xad, 0xe3, 0xdb, 0xc6, 0x2f, 0x88, 0x5f, 0x12,\n  0xbf, 0x29, 0xfe, 0xae, 0xf8, 0x73, 0xf1, 0xbe, 0x84, 0xb0, 0x84, 0xb8,\n  0x84, 0xf6, 0x09, 0xd5, 0x09, 0x7d, 0x12, 0xfa, 0x25, 0x0c, 0x48, 0x18,\n  0x94, 0x70, 0x7d, 0xc2, 0xbe, 0x84, 0x57, 0x12, 0xde, 0x4f, 0xf8, 0x2c,\n  0xe1, 0xa7, 0x84, 0x5f, 0x12, 0xbc, 0x89, 0xee, 0xc4, 0x91, 0x89, 0xd3,\n  0x12, 0x17, 0x24, 0xde, 0x94, 0xb8, 0x32, 0x71, 0x7d, 0xe2, 0xe6, 0xc4,\n  0x07, 0x13, 0x1f, 0x4f, 0x7c, 0x21, 0xf1, 0x6c, 0xd2, 0x90, 0xa4, 0x1b,\n  0x93, 0x6e, 0x4a, 0x7b, 0x2b, 0x67, 0x52, 0xce, 0x82, 0xc6, 0xbe, 0xdc,\n  0xf2, 0x9d, 0x33, 0x76, 0x5e, 0xbf, 0xf3, 0xae, 0x5d, 0xe1, 0xbb, 0x92,\n  0x76, 0x3d, 0xbc, 0x6b, 0xdf, 0xae, 0x27, 0x76, 0xfd, 0xb1, 0xcb, 0x77,\n  0x7f, 0xee, 0x03, 0xfd, 0x1f, 0x18, 0x75, 0xc9, 0x71, 0xc9, 0xe5, 0x65,\n  0xde, 0x26, 0x5e, 0x9f, 0xaf, 0x16, 0x9f, 0x4c, 0x90, 0xfa, 0x48, 0x64,\n  0xdb, 0x48, 0x1f, 0xcd, 0xf8, 0x70, 0x3e, 0x92, 0x2f, 0x24, 0x7d, 0xac,\n  0x93, 0x7b, 0x57, 0x7c, 0x0f, 0x7f, 0x84, 0xf4, 0x71, 0x94, 0xf4, 0x71,\n  0x8e, 0xff, 0x21, 0xa4, 0x96, 0x63, 0x49, 0x1f, 0xcd, 0x45, 0x7f, 0x31,\n  0x98, 0xf4, 0xf1, 0x9c, 0xfc, 0xc6, 0x4a, 0xf1, 0xb1, 0xf8, 0x92, 0xf4,\n  0xf1, 0x8b, 0xc2, 0x14, 0x3f, 0xd2, 0x47, 0x86, 0x52, 0xa6, 0x54, 0x28,\n  0x23, 0x94, 0xb9, 0xa4, 0x8f, 0x1b, 0x49, 0x1f, 0x2b, 0x95, 0x7b, 0x68,\n  0xdc, 0x7c, 0xa4, 0x9c, 0x25, 0x7d, 0x70, 0xd2, 0x87, 0x3f, 0xe9, 0xa3,\n  0x9b, 0x63, 0x90, 0x63, 0xa8, 0x63, 0xb1, 0x63, 0x2d, 0x8d, 0xa5, 0x78,\n  0x67, 0x66, 0xf4, 0x5e, 0xd2, 0xc7, 0xc2, 0x38, 0x16, 0x77, 0x20, 0xee,\n  0x64, 0xdc, 0xa5, 0x78, 0x11, 0xdf, 0x26, 0xde, 0x13, 0xbf, 0x30, 0x7e,\n  0x69, 0xfc, 0xe6, 0xf8, 0x6d, 0xf1, 0xe7, 0x13, 0x58, 0x42, 0x64, 0x42,\n  0x62, 0x42, 0x87, 0x84, 0x1a, 0x5b, 0x1f, 0x43, 0x12, 0x16, 0x26, 0xec,\n  0x4f, 0x78, 0x2d, 0xe1, 0xc3, 0x84, 0x2f, 0x12, 0xce, 0x27, 0x5c, 0x48,\n  0x64, 0x89, 0x66, 0xe2, 0xe8, 0xc4, 0x99, 0x89, 0x0b, 0x13, 0x57, 0x24,\n  0xae, 0x4e, 0xbc, 0x2d, 0x71, 0x5b, 0xe2, 0x43, 0x89, 0xfb, 0x49, 0x1f,\n  0xcc, 0xd6, 0xc7, 0xd0, 0x9c, 0xc9, 0x8d, 0x8f, 0xe5, 0xb2, 0x9d, 0x9e,\n  0x9d, 0x33, 0x77, 0xce, 0xdf, 0xc5, 0x76, 0x45, 0xec, 0x4a, 0xde, 0xb5,\n  0x77, 0xd7, 0xe3, 0xbb, 0x7e, 0xdb, 0x75, 0x89, 0xf4, 0x91, 0xf7, 0xc0,\n  0x80, 0x4b, 0xec, 0x92, 0x93, 0xf4, 0x91, 0x48, 0xfa, 0xb8, 0x2c, 0xbf,\n  0x81, 0xdf, 0xf7, 0xab, 0xef, 0xb8, 0xef, 0x25, 0xd7, 0x19, 0xdf, 0x8b,\n  0xfc, 0x2c, 0xbd, 0x8e, 0xf8, 0xf6, 0xf0, 0xf7, 0xd9, 0xbd, 0xfc, 0x5d,\n  0x76, 0x07, 0x7f, 0xc7, 0xe5, 0xe1, 0x87, 0x59, 0x27, 0xfe, 0xb6, 0xaf,\n  0x03, 0x7f, 0x9d, 0x46, 0xd4, 0xcb, 0xce, 0xef, 0xe5, 0xf7, 0xdf, 0xf1,\n  0x17, 0x7c, 0x0b, 0xe4, 0xb7, 0xc9, 0xc9, 0x6f, 0xfa, 0xe3, 0xfb, 0x7c,\n  0x35, 0xfc, 0x31, 0x0a, 0xa9, 0x37, 0xf9, 0x98, 0xb6, 0x51, 0x4f, 0xd5,\n  0x6e, 0x97, 0x9f, 0x4f, 0x71, 0xfe, 0x50, 0xfb, 0x4e, 0xed, 0xe1, 0xda,\n  0xb7, 0x6b, 0xe5, 0x77, 0x59, 0x7d, 0xc7, 0x3e, 0xf5, 0x76, 0xa8, 0xdd,\n  0xe8, 0x2d, 0xa9, 0xdd, 0x50, 0xfb, 0x47, 0xed, 0x9d, 0x8c, 0xd5, 0x9e,\n  0xa2, 0xd7, 0xb7, 0x34, 0x70, 0x97, 0x30, 0x76, 0x6e, 0xd0, 0xb9, 0x8d,\n  0x67, 0x9b, 0x9e, 0x3c, 0xca, 0xd8, 0x99, 0x02, 0xc6, 0x4e, 0x6e, 0xfe,\n  0x86, 0x9f, 0xdc, 0x78, 0x7c, 0xce, 0xc9, 0xf5, 0x8c, 0x7d, 0xd3, 0x8f,\n  0xfe, 0xce, 0x3b, 0x99, 0x7b, 0x32, 0xe7, 0x64, 0xd6, 0xc9, 0xcc, 0x93,\n  0x19, 0x27, 0xd3, 0x4f, 0xa6, 0x9d, 0x4c, 0x3d, 0x99, 0x7c, 0x32, 0xe9,\n  0x64, 0xe2, 0xc9, 0xf8, 0x93, 0x71, 0x27, 0x63, 0x4e, 0x46, 0x7f, 0x9d,\n  0x6d, 0xfd, 0x92, 0xd6, 0xf7, 0xab, 0x19, 0x3b, 0xb1, 0xfd, 0xfb, 0xce,\n  0x04, 0xd7, 0xd0, 0x8b, 0xe6, 0xd7, 0xb7, 0x87, 0xbe, 0xdb, 0xf9, 0xd5,\n  0xe2, 0x4f, 0xcf, 0x32, 0x76, 0xb4, 0x1a, 0xbf, 0x0a, 0x7a, 0x99, 0xb1,\n  0x91, 0x8b, 0x86, 0x76, 0x65, 0x6c, 0x68, 0x7b, 0xfc, 0xda, 0xae, 0x36,\n  0x6c, 0xd9, 0xe0, 0x1b, 0x19, 0x33, 0x1f, 0xa6, 0x80, 0xae, 0x5a, 0x9e,\n  0xf4, 0xc5, 0x77, 0x2b, 0xfc, 0xfb, 0xff, 0xbe, 0xf9, 0x8b, 0xf7, 0xef,\n  0x6c, 0xfc, 0x4c, 0x03, 0xbe, 0xcb, 0x0d, 0x0b, 0xe1, 0xfb, 0x6e, 0xae,\n  0xfa, 0x27, 0xbf, 0xff, 0x08, 0x9f, 0x2d, 0x6a, 0x66, 0x7d, 0x9e, 0xc7,\n  0xa6, 0xca, 0x4f, 0xf5, 0xac, 0x6d, 0xc0, 0x45, 0xfa, 0xe0, 0x77, 0xfe,\n  0xcf, 0x42, 0xf1, 0xd5, 0xc2, 0x23, 0xbf, 0xd5, 0x4f, 0x8c, 0x87, 0x95,\n  0x90, 0x27, 0xcd, 0xa9, 0x8d, 0x62, 0x7d, 0xdd, 0x7d, 0x9c, 0x61, 0x1e,\n  0xaf, 0x9c, 0x27, 0x6b, 0x82, 0xdf, 0xf0, 0x72, 0xd0, 0x1d, 0xe7, 0x6e,\n  0xe7, 0xc3, 0xd6, 0x5d, 0xf9, 0xee, 0x3c, 0x60, 0xbd, 0x2c, 0x29, 0xac,\n  0xe8, 0x59, 0x8b, 0x77, 0xc4, 0x6a, 0x31, 0x5a, 0x2c, 0xef, 0xc4, 0x3b,\n  0x3b, 0x6e, 0xe4, 0x55, 0xbc, 0x9a, 0x77, 0xe1, 0x5d, 0x79, 0x0d, 0xef,\n  0xc6, 0xbb, 0x1b, 0xbf, 0x62, 0x65, 0xbb, 0x1b, 0x2b, 0xda, 0x2e, 0x5a,\n  0xdb, 0xb6, 0xb8, 0x37, 0x3b, 0x1e, 0xa3, 0x15, 0x6e, 0x9b, 0x7b, 0xbb,\n  0xb9, 0xd4, 0xbc, 0xd5, 0x5c, 0x6b, 0x6e, 0x30, 0xef, 0xc2, 0x39, 0xbe,\n  0x35, 0xe6, 0x1d, 0xe6, 0x26, 0x73, 0xab, 0x3c, 0xb3, 0xa7, 0x8f, 0xd2,\n  0xe7, 0xea, 0xa3, 0xf5, 0xeb, 0x1c, 0xfb, 0x1c, 0x8f, 0xeb, 0x63, 0xf4,\n  0x79, 0xfa, 0x58, 0xc7, 0x33, 0xa2, 0x44, 0xb4, 0x76, 0x3c, 0xeb, 0x78,\n  0xce, 0xf1, 0xbc, 0x68, 0x23, 0x3a, 0xf3, 0x5f, 0xf9, 0x05, 0x73, 0xbc,\n  0x39, 0xc1, 0x9c, 0x68, 0x4e, 0x32, 0x27, 0x8b, 0x29, 0x62, 0xaa, 0x98,\n  0x26, 0xa6, 0x8b, 0x19, 0x62, 0xa6, 0x98, 0x25, 0x66, 0xf3, 0xdf, 0xf8,\n  0x45, 0x75, 0x8b, 0xba, 0x55, 0xbd, 0x4b, 0xdd, 0xa6, 0xde, 0xad, 0x6e,\n  0x77, 0x7c, 0xea, 0xf8, 0xcc, 0xf1, 0xb9, 0xe3, 0x0b, 0x3d, 0x57, 0x1f,\n  0xa0, 0x37, 0xd1, 0x07, 0xea, 0x79, 0xfa, 0x20, 0xbd, 0xa9, 0x3e, 0xd8,\n  0x14, 0x26, 0x37, 0xdd, 0xa6, 0x69, 0xaa, 0xa6, 0xd3, 0xd4, 0xdd, 0x7f,\n  0x98, 0x0e, 0xf7, 0xef, 0xe6, 0x46, 0x77, 0xad, 0xa9, 0x99, 0x8a, 0x69,\n  0x98, 0x7d, 0x4c, 0x97, 0x3c, 0xed, 0x6f, 0xae, 0x32, 0x97, 0x99, 0xcb,\n  0xcd, 0x9b, 0xcc, 0x15, 0xe6, 0x3a, 0x73, 0xa5, 0xb9, 0xda, 0xbc, 0x01,\n  0x67, 0x0d, 0x17, 0x99, 0x8b, 0xcd, 0x3b, 0xcd, 0x1b, 0xcd, 0x25, 0xe6,\n  0x66, 0x73, 0x8b, 0x79, 0xbb, 0xb9, 0xdd, 0xcc, 0x92, 0x9f, 0x73, 0x73,\n  0x5f, 0x72, 0x5f, 0x16, 0xa5, 0xa2, 0x4c, 0x4b, 0xd1, 0x52, 0xd5, 0xc7,\n  0xb5, 0x28, 0xb2, 0x9c, 0x4c, 0xe9, 0xac, 0x54, 0x29, 0xd5, 0x4a, 0x17,\n  0xa5, 0xab, 0x52, 0xa3, 0x3e, 0xa6, 0x25, 0xa9, 0x4f, 0x68, 0xe3, 0xd5,\n  0x27, 0xb5, 0x09, 0x6a, 0x94, 0x1a, 0xad, 0xc6, 0xa8, 0xb1, 0xc6, 0x56,\n  0xe3, 0x2e, 0x35, 0x4e, 0x70, 0x21, 0x84, 0xa2, 0xc6, 0x0b, 0x87, 0x70,\n  0x0a, 0x97, 0x50, 0x85, 0x26, 0x74, 0x61, 0x08, 0xb7, 0x9a, 0x20, 0x4c,\n  0xe1, 0x27, 0xfc, 0x8d, 0xe5, 0xc6, 0x60, 0xe3, 0x46, 0x11, 0x60, 0x74,\n  0x33, 0x9e, 0x34, 0x9e, 0x52, 0x13, 0xd5, 0x24, 0x35, 0x59, 0x4d, 0x51,\n  0x53, 0xd5, 0x34, 0x11, 0x68, 0x7c, 0x24, 0x82, 0x44, 0xb0, 0x9a, 0x6e,\n  0xdc, 0x6b, 0xdc, 0x63, 0xec, 0x34, 0xda, 0x48, 0xdf, 0xc2, 0x18, 0x27,\n  0xc2, 0x8c, 0x9e, 0x6a, 0x86, 0xb1, 0xcc, 0xf0, 0x18, 0x6d, 0x8d, 0x16,\n  0x46, 0x77, 0x11, 0x6e, 0x94, 0x18, 0xad, 0x8d, 0xe1, 0xc6, 0x08, 0xa3,\n  0x93, 0x71, 0xbd, 0x31, 0xc1, 0x68, 0x69, 0xb4, 0x32, 0x06, 0x19, 0x93,\n  0x8c, 0x52, 0x63, 0xb1, 0xf1, 0x0f, 0xe3, 0x5a, 0xa3, 0xb7, 0x51, 0x6d,\n  0xcc, 0x31, 0x76, 0x18, 0x35, 0x46, 0x95, 0xb1, 0xc4, 0xe8, 0x6a, 0x94,\n  0x1b, 0x0b, 0xd4, 0x4c, 0xe3, 0x09, 0xe3, 0x25, 0xe3, 0x69, 0xe3, 0x39,\n  0xe3, 0x59, 0xe3, 0x19, 0xe3, 0x79, 0xe3, 0x05, 0xe3, 0x80, 0xf1, 0xa2,\n  0xda, 0x48, 0xcd, 0x52, 0xb3, 0xd5, 0x1c, 0xb5, 0xb1, 0x9a, 0xab, 0x36,\n  0xd1, 0xd9, 0x55, 0x91, 0xfa, 0x27, 0xc6, 0x87, 0xc6, 0xfb, 0x32, 0x92,\n  0x17, 0x11, 0xc6, 0xc7, 0xc6, 0x07, 0xc6, 0x7b, 0x32, 0x7f, 0xa0, 0x16,\n  0xab, 0xcd, 0xd5, 0x16, 0x64, 0x33, 0xa3, 0xd4, 0x96, 0x6a, 0x2b, 0x11,\n  0xad, 0x96, 0xa8, 0xad, 0x8d, 0xd7, 0x94, 0x6e, 0x22, 0xc6, 0x78, 0xd9,\n  0x78, 0xdd, 0x78, 0x43, 0xad, 0x54, 0x1f, 0x32, 0x0e, 0x1a, 0xaf, 0x18,\n  0xaf, 0x1a, 0x87, 0xcc, 0x17, 0x8c, 0xaf, 0x8c, 0xaf, 0xf5, 0x95, 0xc6,\n  0x37, 0xc6, 0xb7, 0x22, 0xd6, 0x38, 0xae, 0xdf, 0x61, 0xfc, 0x64, 0x9c,\n  0xd4, 0x1f, 0xd0, 0x97, 0xe9, 0x0b, 0xf5, 0x55, 0xfa, 0x2e, 0xfd, 0x3e,\n  0x7d, 0xb9, 0x7e, 0x83, 0x7e, 0x93, 0x88, 0x33, 0xbe, 0xd7, 0x57, 0x8b,\n  0x78, 0xb5, 0xa3, 0xf1, 0x8b, 0xbe, 0x46, 0x5f, 0xab, 0xdf, 0xac, 0x2f,\n  0xd2, 0xd7, 0x19, 0xa7, 0x8c, 0x33, 0xc6, 0x59, 0xe3, 0xbc, 0x48, 0x30,\n  0x7e, 0xd6, 0xd7, 0x1b, 0x3f, 0x88, 0x44, 0xe3, 0x2d, 0x7d, 0xb1, 0x7b,\n  0x93, 0x7e, 0xa7, 0x7e, 0xab, 0xbe, 0x54, 0x5f, 0x20, 0x92, 0xf4, 0xfb,\n  0xf5, 0x0d, 0xfa, 0x46, 0xfd, 0x16, 0x7d, 0x93, 0xbe, 0xdb, 0x78, 0xdb,\n  0x78, 0xc7, 0x38, 0x62, 0xbc, 0x6b, 0x7c, 0x67, 0x1c, 0x33, 0x4e, 0xe8,\n  0x3b, 0xf5, 0x1d, 0xfa, 0xed, 0xfa, 0x0a, 0xe3, 0x33, 0xe3, 0x73, 0xe3,\n  0x0b, 0xe3, 0x53, 0xe3, 0xa8, 0x7e, 0x9b, 0x7e, 0xb7, 0xbe, 0x5d, 0xee,\n  0x5f, 0x19, 0xa7, 0x8d, 0xc3, 0xc6, 0x8f, 0x6a, 0x27, 0xb5, 0xb3, 0x71,\n  0xce, 0x28, 0x32, 0x8a, 0x8d, 0xe6, 0x6a, 0x95, 0x5a, 0x6d, 0xe4, 0x19,\n  0x4d, 0x8d, 0x66, 0x46, 0xbe, 0x51, 0x60, 0x14, 0x8a, 0x64, 0x91, 0x22,\n  0x52, 0x45, 0x9a, 0x91, 0xab, 0xee, 0x53, 0xf7, 0xab, 0x4f, 0xa9, 0x83,\n  0xd5, 0x21, 0xea, 0x50, 0x75, 0x98, 0x3a, 0x5c, 0x1d, 0xa1, 0x8e, 0xd4,\n  0xa2, 0xb5, 0x4c, 0x2d, 0x4d, 0x8b, 0xd4, 0x32, 0xcc, 0x7b, 0xd4, 0xa7,\n  0xd5, 0x67, 0x8c, 0x29, 0xc6, 0x64, 0xa3, 0xbf, 0x31, 0xc3, 0xe8, 0x63,\n  0x4c, 0x35, 0xc6, 0x18, 0xa3, 0x8d, 0x4a, 0x63, 0x80, 0x31, 0xd3, 0x18,\n  0x6b, 0xf4, 0x33, 0xa6, 0x1b, 0x1d, 0x8d, 0x61, 0x46, 0x17, 0x63, 0xbc,\n  0xd1, 0xc3, 0x68, 0x6f, 0x74, 0x30, 0x56, 0x19, 0x15, 0xea, 0x28, 0xa3,\n  0x97, 0x31, 0xd4, 0xd8, 0x62, 0xcc, 0x33, 0xfa, 0x1a, 0xd3, 0x8c, 0xb9,\n  0xc6, 0x75, 0xc6, 0x40, 0x63, 0x96, 0x71, 0x9b, 0x71, 0xbb, 0xb1, 0xce,\n  0x58, 0x6f, 0x6c, 0x30, 0x36, 0x1a, 0x77, 0x18, 0x77, 0x1a, 0x4b, 0x8d,\n  0x21, 0xc6, 0x35, 0x46, 0x67, 0x63, 0xa2, 0x7e, 0xc6, 0x98, 0x6d, 0xac,\n  0x36, 0x16, 0x1a, 0xa3, 0x8c, 0x91, 0xc6, 0x22, 0xa3, 0xcc, 0x68, 0x67,\n  0xdc, 0x60, 0xcc, 0x37, 0xee, 0x36, 0xb6, 0x19, 0x37, 0x19, 0x2b, 0x8c,\n  0x9b, 0x8d, 0x5b, 0x8c, 0xed, 0xc6, 0xad, 0xc6, 0x2e, 0xf3, 0x80, 0xf9,\n  0xa2, 0xae, 0xeb, 0x45, 0xba, 0xa1, 0x17, 0xeb, 0x6e, 0xbd, 0xb9, 0x6e,\n  0xea, 0x2d, 0x74, 0x3f, 0xbd, 0xa5, 0xee, 0xaf, 0xb7, 0xd2, 0x03, 0xf4,\n  0x12, 0x3d, 0x50, 0x6f, 0xad, 0x07, 0xe9, 0x6d, 0xf4, 0x60, 0xbd, 0xad,\n  0x1e, 0xa2, 0x7b, 0xf4, 0x50, 0xbd, 0x54, 0x0f, 0xd3, 0xcb, 0xf4, 0x70,\n  0xbd, 0x9d, 0x1e, 0xa1, 0x97, 0xeb, 0x91, 0x7a, 0x7b, 0x3d, 0x4a, 0xaf,\n  0xd0, 0xa3, 0xf5, 0x4a, 0x3d, 0x46, 0xef, 0xa0, 0xc7, 0xea, 0x1d, 0xf5,\n  0x38, 0xbd, 0x93, 0x1e, 0xaf, 0x77, 0xd6, 0x13, 0xf4, 0x2a, 0x7d, 0x98,\n  0x39, 0xc5, 0x9c, 0x6f, 0x2e, 0x30, 0x17, 0x1a, 0x2b, 0x8d, 0xfd, 0xfa,\n  0x70, 0x3d, 0x51, 0xaf, 0xd6, 0x93, 0xf4, 0x2e, 0x7a, 0xb2, 0xde, 0x55,\n  0x4f, 0xd1, 0x6b, 0xf4, 0x54, 0xbd, 0x9b, 0x9e, 0xa6, 0x77, 0xd7, 0xd3,\n  0xf5, 0x1e, 0x7a, 0x86, 0xde, 0x53, 0xcf, 0xd4, 0x7b, 0xe9, 0x8d, 0xf4,\n  0xde, 0x7a, 0x96, 0xde, 0x47, 0xcf, 0xd6, 0xfb, 0xea, 0x39, 0x7a, 0x3f,\n  0xbd, 0xb1, 0xde, 0x5f, 0x1f, 0xa1, 0x8f, 0x34, 0xe7, 0x9a, 0xd7, 0xa9,\n  0xcf, 0x6a, 0x8d, 0xd4, 0xe7, 0xb4, 0x2c, 0xf5, 0x79, 0x2d, 0x5b, 0x7d,\n  0x41, 0xcb, 0x51, 0x0f, 0x68, 0x8d, 0xd5, 0x17, 0xb5, 0x5c, 0xf5, 0x25,\n  0xad, 0x89, 0x96, 0xa7, 0x35, 0x55, 0x5f, 0xd6, 0x9a, 0xa9, 0xaf, 0x68,\n  0xf9, 0xea, 0xab, 0x5a, 0x81, 0xfa, 0x9a, 0x56, 0xa8, 0xbe, 0xae, 0x15,\n  0xa9, 0x6f, 0x68, 0xc5, 0xea, 0x41, 0xad, 0xb9, 0x7a, 0x48, 0x6b, 0xa1,\n  0xbe, 0xa9, 0xb5, 0x54, 0xdf, 0xd2, 0x5a, 0xa9, 0x6f, 0x6b, 0x25, 0xea,\n  0x61, 0xad, 0xb5, 0xfa, 0x8e, 0xd6, 0x46, 0xfd, 0x87, 0xd6, 0x56, 0x7d,\n  0x57, 0xf3, 0xa8, 0xef, 0x69, 0xa5, 0xea, 0xfb, 0x5a, 0x99, 0x7a, 0x44,\n  0x6b, 0xa7, 0x7e, 0xa0, 0x95, 0xab, 0x1f, 0x6a, 0xed, 0xd5, 0x8f, 0xb4,\n  0x0a, 0xf5, 0x63, 0xad, 0x52, 0xfd, 0x44, 0xeb, 0xa0, 0x7e, 0xaa, 0x75,\n  0xd4, 0x6f, 0xd4, 0x97, 0xa8, 0x9f, 0x69, 0x9d, 0xd4, 0xcf, 0xb5, 0xce,\n  0xea, 0x17, 0x5a, 0x95, 0x7a, 0x54, 0xab, 0x56, 0xbf, 0xd4, 0xba, 0xa8,\n  0xc7, 0xb4, 0xae, 0xfa, 0x77, 0x5a, 0x8d, 0xd6, 0x4d, 0xeb, 0xae, 0xf5,\n  0xd0, 0x7a, 0x6a, 0xbd, 0xb4, 0xde, 0x5a, 0x1f, 0xf5, 0x2b, 0xad, 0xaf,\n  0xfa, 0xb5, 0xd6, 0x4f, 0x3d, 0xae, 0x7e, 0xa3, 0xf5, 0x57, 0xbf, 0xd5,\n  0x06, 0xa8, 0x27, 0xb4, 0x81, 0xea, 0x49, 0x6d, 0x90, 0xfa, 0x9d, 0x36,\n  0x58, 0x9d, 0xa6, 0x4e, 0x57, 0x67, 0xa8, 0x33, 0xd5, 0x59, 0xea, 0xf7,\n  0xda, 0x10, 0x9d, 0xab, 0x3f, 0x68, 0x43, 0xd5, 0x1f, 0xb5, 0x61, 0xfa,\n  0x83, 0xfa, 0x43, 0xfa, 0x66, 0xfd, 0x61, 0x7d, 0x8b, 0xbe, 0x47, 0xdf,\n  0xaa, 0xef, 0xd5, 0xef, 0xd2, 0x1f, 0xd1, 0xb7, 0xe9, 0x8f, 0xaa, 0xa7,\n  0xb4, 0xe1, 0xea, 0x69, 0x6d, 0x84, 0x7a, 0x46, 0x1b, 0xa9, 0xfe, 0xa4,\n  0x8d, 0x52, 0xcf, 0x6a, 0xa3, 0xd5, 0x73, 0xea, 0x79, 0xf5, 0x67, 0xf5,\n  0x17, 0xf3, 0x69, 0x6d, 0x8c, 0xfa, 0x87, 0x36, 0x96, 0xfc, 0xca, 0xef,\n  0xf5, 0xc7, 0xb4, 0x71, 0xee, 0x0d, 0xfa, 0x0f, 0xfa, 0x8f, 0xfa, 0x29,\n  0xfd, 0xb4, 0xf9, 0x8c, 0xf9, 0xac, 0xf9, 0x9c, 0xf9, 0xbc, 0xfe, 0xa5,\n  0x7e, 0xbd, 0x96, 0xac, 0xa5, 0xab, 0xb3, 0xd5, 0x6b, 0xd4, 0x6b, 0xd5,\n  0x39, 0x6e, 0x9f, 0xc9, 0xdc, 0x5e, 0xb3, 0x8b, 0xd9, 0xd5, 0xac, 0x31,\n  0xbb, 0x99, 0xdd, 0xcd, 0x1e, 0x66, 0x4f, 0x73, 0x9e, 0x79, 0x3d, 0x72,\n  0x97, 0x0c, 0xdf, 0x58, 0xa8, 0x90, 0x87, 0x98, 0xe5, 0x91, 0xe7, 0x03,\n  0x15, 0xb2, 0x62, 0x63, 0x28, 0x0e, 0xe6, 0xa2, 0x0f, 0x13, 0x82, 0x0f,\n  0x71, 0x10, 0xc6, 0xbb, 0xca, 0x0f, 0xf6, 0x3b, 0xe5, 0x96, 0xb7, 0x12,\n  0xe4, 0x74, 0x45, 0x64, 0xe7, 0x07, 0x25, 0x05, 0xa5, 0x25, 0x05, 0x25,\n  0x0d, 0xe6, 0x9b, 0xbc, 0x77, 0xf2, 0x42, 0xef, 0x9b, 0xe2, 0x50, 0x6d,\n  0x51, 0xbe, 0x18, 0x09, 0x2f, 0xb4, 0x83, 0xef, 0x3c, 0x7b, 0x05, 0x75,\n  0x06, 0xb0, 0x04, 0x0f, 0xb2, 0x5c, 0x43, 0xe4, 0xd7, 0xcd, 0x57, 0x53,\n  0x7d, 0xca, 0x30, 0xa6, 0x28, 0xd3, 0x94, 0x2e, 0xa9, 0x29, 0x41, 0x81,\n  0x0e, 0xbf, 0xe8, 0xec, 0xe2, 0x14, 0x25, 0x5f, 0x29, 0x28, 0xca, 0x6f,\n  0x16, 0x1e, 0x16, 0xea, 0x4a, 0x49, 0x4e, 0xbf, 0xa7, 0x45, 0xd4, 0x84,\n  0x99, 0xa9, 0xd1, 0x51, 0x69, 0x69, 0x51, 0xd1, 0xa9, 0x07, 0x05, 0xaf,\n  0x9d, 0x98, 0x16, 0x1f, 0x9f, 0x96, 0x9a, 0x98, 0x48, 0xf5, 0x96, 0xf2,\n  0x37, 0xf0, 0x4b, 0x45, 0x52, 0xd6, 0x54, 0x4f, 0x92, 0xfc, 0xc6, 0x61,\n  0x3e, 0xc4, 0xa9, 0x38, 0x14, 0xaa, 0x9b, 0x75, 0x71, 0x90, 0x0b, 0xec,\n  0x50, 0x1d, 0x24, 0x26, 0xa4, 0x74, 0xf9, 0x45, 0x64, 0x87, 0x90, 0x0b,\n  0x2f, 0xdd, 0xf8, 0x6d, 0xa1, 0xc5, 0x14, 0xbd, 0x11, 0x10, 0x87, 0xbc,\n  0x5e, 0x2e, 0xe4, 0x0b, 0x67, 0x24, 0x08, 0xc8, 0x6f, 0x17, 0x8c, 0x61,\n  0x09, 0xac, 0xd2, 0x53, 0x6e, 0x1a, 0x42, 0x0b, 0x08, 0xf4, 0x53, 0x54,\n  0xa6, 0xa9, 0x63, 0xfd, 0x5d, 0x82, 0x39, 0x15, 0x32, 0xd4, 0x8c, 0x8f,\n  0x71, 0x73, 0x5d, 0x1f, 0x5f, 0xed, 0x20, 0xa3, 0x3d, 0x41, 0x74, 0x61,\n  0x2c, 0x21, 0x3e, 0x2e, 0x96, 0xca, 0xc4, 0x44, 0x47, 0x45, 0x46, 0x90,\n  0xd4, 0x21, 0x41, 0xf5, 0xff, 0xfc, 0x12, 0xb2, 0xb9, 0x9a, 0x1f, 0x96,\n  0xa2, 0xa6, 0x14, 0xe3, 0x55, 0x98, 0x8f, 0x57, 0xbe, 0x8a, 0x57, 0x98,\n  0x93, 0xfe, 0xe4, 0xc7, 0x12, 0x6e, 0xba, 0xbd, 0x51, 0x65, 0xa3, 0x55,\n  0x19, 0x15, 0xe9, 0xf3, 0x6f, 0x4e, 0x5c, 0xba, 0x36, 0xb3, 0x43, 0xe6,\n  0xea, 0xcc, 0xf6, 0x99, 0x0b, 0xbc, 0x0b, 0x56, 0x25, 0xac, 0xe2, 0xfb,\n  0xb6, 0xb5, 0x7b, 0x97, 0xfe, 0xb5, 0xdb, 0x56, 0x76, 0x84, 0xfe, 0x95,\n  0x6d, 0xdb, 0x26, 0x3d, 0xfa, 0x36, 0xbe, 0xd7, 0x68, 0xa5, 0xf8, 0x8d,\n  0xa2, 0xb5, 0x46, 0x2c, 0x8f, 0x4d, 0xf5, 0x84, 0xe6, 0x65, 0xa5, 0xa6,\n  0x44, 0x47, 0x85, 0x87, 0xe9, 0x4e, 0x83, 0x8b, 0x24, 0x87, 0x90, 0xdf,\n  0x7f, 0xdc, 0x79, 0x6f, 0xe3, 0x9a, 0xbe, 0x9e, 0x38, 0x92, 0x52, 0xe1,\n  0x24, 0xf7, 0x42, 0x17, 0x77, 0x32, 0xe7, 0x52, 0xe9, 0xc9, 0x38, 0x65,\n  0x1e, 0x5a, 0x51, 0x26, 0x2a, 0x5d, 0x62, 0x3c, 0x49, 0xd4, 0xbd, 0xca,\n  0x12, 0x62, 0xe2, 0x62, 0xc9, 0x15, 0x0e, 0xf9, 0x7d, 0x27, 0x9c, 0x0d,\n  0x97, 0x31, 0x5a, 0xf7, 0x7e, 0x1e, 0x7f, 0x7c, 0xac, 0x30, 0x39, 0x28,\n  0x28, 0x3c, 0x2c, 0x48, 0xf5, 0x8b, 0xc9, 0x8e, 0x28, 0x4c, 0x4f, 0xcf,\n  0x28, 0x0c, 0x0f, 0x97, 0xef, 0x85, 0x05, 0x45, 0xc5, 0x85, 0xf9, 0x61,\n  0xf4, 0x87, 0x4a, 0xc4, 0xb0, 0x78, 0x41, 0xbd, 0xa6, 0x86, 0x29, 0x85,\n  0x2e, 0x57, 0x58, 0x68, 0x78, 0x48, 0x51, 0x51, 0x61, 0x41, 0x7a, 0x46,\n  0x6d, 0xf1, 0xd8, 0xc4, 0xe4, 0xf1, 0xf9, 0x23, 0x06, 0x8e, 0xe9, 0xeb,\n  0x29, 0xec, 0x93, 0x1a, 0x93, 0x58, 0x9d, 0x59, 0xd6, 0xb7, 0xf1, 0xd8,\n  0x21, 0x9e, 0xa2, 0xfc, 0xc6, 0xf3, 0x5a, 0x15, 0xe5, 0x95, 0xb6, 0x9c,\n  0xc0, 0x83, 0x02, 0x7a, 0x05, 0x46, 0xf2, 0x43, 0x31, 0xdd, 0x2b, 0x3b,\n  0xf5, 0x74, 0xf6, 0xed, 0xc3, 0xc3, 0x02, 0x3a, 0xf9, 0x85, 0x28, 0x07,\n  0x43, 0xb2, 0xdb, 0x36, 0xab, 0xe8, 0x63, 0x4c, 0xe1, 0x9f, 0x3d, 0xe2,\n  0xc8, 0x4a, 0xca, 0xcc, 0xf6, 0xbe, 0xef, 0xca, 0x4e, 0x4e, 0xcf, 0x08,\n  0x84, 0x53, 0xc2, 0x9a, 0xfa, 0x2e, 0x28, 0xfe, 0xe2, 0x08, 0x4e, 0x28,\n  0x47, 0xb1, 0x34, 0xd6, 0x84, 0x6d, 0xe8, 0xbc, 0x37, 0x8a, 0x5a, 0x9d,\n  0xe3, 0xc7, 0x5d, 0xfe, 0x5c, 0x73, 0xba, 0xb4, 0xf1, 0xc4, 0xc6, 0x75,\n  0x27, 0x1f, 0x67, 0x72, 0x1a, 0x0f, 0xc3, 0xdc, 0x8a, 0x41, 0x01, 0xd1,\n  0xd4, 0x6a, 0xa6, 0xeb, 0x62, 0x98, 0x6a, 0x75, 0x60, 0x8c, 0xa7, 0xe0,\n  0x9f, 0xd9, 0xdd, 0x5c, 0x51, 0xc6, 0x57, 0x5b, 0x85, 0x0c, 0x8e, 0x22,\n  0xc4, 0x2c, 0xcb, 0xa9, 0xc3, 0x98, 0x4a, 0xb3, 0xb7, 0x4b, 0x3f, 0x4f,\n  0x76, 0x46, 0x7a, 0x4c, 0x74, 0x50, 0xa0, 0x69, 0x72, 0xd6, 0x38, 0x3b,\n  0xbd, 0x49, 0x46, 0x93, 0xa4, 0x84, 0xe8, 0xb4, 0x98, 0xb4, 0x88, 0xb0,\n  0xc0, 0xa8, 0xa0, 0x28, 0x33, 0xc0, 0x0c, 0xf0, 0xf7, 0x53, 0x9d, 0xcc,\n  0xcd, 0xdd, 0x01, 0x7e, 0xe1, 0xd9, 0x21, 0x75, 0x03, 0x9a, 0x34, 0xe6,\n  0x24, 0xdf, 0xc9, 0x99, 0x2c, 0x35, 0x94, 0xdf, 0xac, 0xb0, 0xc0, 0xd9,\n  0xe0, 0x4e, 0x44, 0x3d, 0xf5, 0xe5, 0x4e, 0x55, 0x1d, 0xab, 0x2b, 0x3b,\n  0x57, 0x88, 0x30, 0xef, 0xcc, 0x6a, 0x7e, 0x8b, 0xf7, 0xc6, 0xf4, 0x94,\n  0x94, 0xf4, 0x6a, 0x3e, 0xb6, 0x63, 0x35, 0xc8, 0x55, 0xf8, 0x53, 0x1c,\n  0x99, 0x35, 0x7e, 0xfc, 0x35, 0xd7, 0x8c, 0x1f, 0x3f, 0xcb, 0xa8, 0x2d,\n  0x12, 0x87, 0x0a, 0xba, 0xd5, 0xd4, 0x74, 0xdf, 0x7e, 0xf7, 0xb1, 0x3a,\n  0x62, 0xdb, 0x9a, 0x9a, 0x6e, 0xdd, 0xb6, 0x6f, 0x43, 0x14, 0x58, 0xe8,\n  0xbb, 0x20, 0x3e, 0x15, 0x1f, 0xd0, 0xc8, 0xce, 0x66, 0x85, 0x6c, 0xae,\n  0x27, 0x20, 0x3d, 0xda, 0xa5, 0x70, 0x47, 0x61, 0x90, 0xbf, 0xea, 0x70,\n  0x62, 0xb8, 0x48, 0xc5, 0xa5, 0xa8, 0x68, 0xb1, 0xcb, 0x6a, 0x31, 0x4d,\n  0xf4, 0x61, 0x0a, 0x47, 0xbb, 0x9d, 0x4e, 0x1b, 0x95, 0xfa, 0x4a, 0xfa,\n  0x33, 0xd7, 0x10, 0x66, 0x33, 0xd5, 0xcd, 0xe6, 0x7e, 0x9e, 0x88, 0xa4,\n  0x44, 0xce, 0xf2, 0x9b, 0x26, 0x66, 0x27, 0x65, 0x87, 0x85, 0x04, 0x06,\n  0xb8, 0x0d, 0x96, 0xc0, 0x13, 0x34, 0x52, 0x04, 0x47, 0x73, 0xd5, 0x88,\n  0xa2, 0xa2, 0xe2, 0x7c, 0x17, 0xbd, 0xa7, 0x64, 0xb8, 0xec, 0xc6, 0x17,\n  0xa7, 0x5f, 0x51, 0x41, 0x04, 0x86, 0x8e, 0xe2, 0xb2, 0xd4, 0x51, 0x54,\n  0xcc, 0xf3, 0x6a, 0x06, 0x75, 0x6b, 0xf3, 0x62, 0x74, 0x92, 0xbb, 0x5f,\n  0x60, 0x5e, 0xfa, 0xda, 0x6b, 0xfa, 0x34, 0x99, 0xd9, 0x63, 0xcc, 0xdc,\n  0x1e, 0x95, 0x89, 0xc5, 0x23, 0xba, 0x67, 0x15, 0xa6, 0xa7, 0xb6, 0xca,\n  0xcf, 0xeb, 0x5e, 0xd4, 0xba, 0x53, 0x1b, 0xcf, 0xc0, 0x04, 0xf1, 0x41,\n  0xb7, 0x8e, 0x6d, 0xfb, 0xa6, 0x3e, 0x9d, 0xd0, 0xad, 0x89, 0x67, 0x72,\n  0xa3, 0x95, 0x3d, 0xb3, 0x0a, 0x46, 0x0f, 0xae, 0x1e, 0x94, 0x99, 0xda,\n  0xbd, 0xb8, 0x53, 0xf7, 0x0e, 0x39, 0x19, 0xa9, 0xad, 0xd3, 0x92, 0x5b,\n  0x67, 0xa6, 0xe6, 0x7a, 0xdf, 0x48, 0x2c, 0x2b, 0x2a, 0x2e, 0xcb, 0x8a,\n  0x83, 0x43, 0x2b, 0x6d, 0x09, 0xbe, 0x41, 0x48, 0x61, 0x51, 0x1e, 0x9c,\n  0x4e, 0x1e, 0x42, 0x16, 0x4f, 0x9a, 0x11, 0x68, 0x4f, 0x09, 0x52, 0x6c,\n  0xf3, 0xb1, 0xad, 0xde, 0x6a, 0x58, 0xe5, 0x32, 0x7d, 0xc3, 0xf1, 0x4d,\n  0xc3, 0x7e, 0x2c, 0xc4, 0x83, 0x7d, 0x1d, 0xf9, 0x13, 0x72, 0x54, 0x2c,\n  0x3c, 0x44, 0xf8, 0x45, 0x66, 0x87, 0x14, 0xa0, 0x95, 0xb2, 0x41, 0x29,\n  0xe9, 0xe9, 0x99, 0x95, 0x55, 0x3d, 0x2a, 0x2a, 0x2b, 0xdb, 0x77, 0xaf,\n  0xaa, 0xe4, 0xc1, 0x73, 0x8f, 0x0f, 0x18, 0xfc, 0xf5, 0x35, 0x33, 0xbf,\n  0x1c, 0xdc, 0xf7, 0x4b, 0x9c, 0x9d, 0xa6, 0x7a, 0x1c, 0xf5, 0xf5, 0xc8,\n  0xaf, 0xf0, 0xc5, 0x0f, 0x72, 0xd8, 0xf5, 0x70, 0xd2, 0x58, 0x8a, 0x35,\n  0x9b, 0xf2, 0xc3, 0xc3, 0xb9, 0xa3, 0xb2, 0xaa, 0x7b, 0xfb, 0xca, 0xca,\n  0x8a, 0x1e, 0xb2, 0xa2, 0x39, 0x5f, 0xf6, 0x1d, 0xfc, 0xe5, 0xcc, 0x6b,\n  0xbe, 0x1e, 0x3c, 0xe0, 0xb8, 0x3c, 0x4d, 0xcd, 0x8b, 0xf8, 0x65, 0x71,\n  0x91, 0xa2, 0xfb, 0x7c, 0x4f, 0xa0, 0x9f, 0xe9, 0x36, 0x74, 0x4d, 0x1a,\n  0x6a, 0xb2, 0x00, 0x7e, 0xac, 0x63, 0xe7, 0xbd, 0x8d, 0x6a, 0xfa, 0xee,\n  0x97, 0x87, 0x96, 0x26, 0xb2, 0x2e, 0x31, 0xfb, 0x24, 0x32, 0xbb, 0x9f,\n  0x47, 0xb7, 0x8e, 0x61, 0x09, 0xd9, 0x39, 0x6a, 0x71, 0x84, 0x1a, 0xa1,\n  0x66, 0xa8, 0x19, 0xc5, 0x19, 0xc5, 0x11, 0x19, 0xbc, 0x2c, 0xf4, 0x80,\n  0xff, 0x93, 0xd7, 0xf4, 0xee, 0x55, 0xdd, 0x6f, 0xd6, 0x7e, 0xff, 0xe7,\n  0xc3, 0xc4, 0xc5, 0x03, 0x45, 0x03, 0x03, 0xb6, 0x36, 0xd9, 0xb3, 0xa7,\n  0xc9, 0xd6, 0x80, 0x81, 0x45, 0x07, 0xf0, 0x7b, 0x56, 0x53, 0xc8, 0x5b,\n  0xed, 0x41, 0x73, 0x30, 0xdd, 0x93, 0x22, 0xcf, 0x3b, 0x39, 0xfb, 0x38,\n  0xe4, 0xfe, 0x1d, 0x0c, 0xa5, 0x1c, 0x36, 0x34, 0x36, 0x9c, 0xa2, 0x2b,\n  0xcc, 0x61, 0xa0, 0xcb, 0x2f, 0x36, 0x9b, 0x93, 0x3d, 0x0c, 0x4b, 0x29,\n  0x24, 0x3b, 0x58, 0x98, 0xcf, 0x4b, 0x5f, 0x7f, 0xbd, 0x03, 0xfd, 0xe7,\n  0x37, 0x56, 0x1e, 0x3e, 0x5c, 0xf9, 0x0e, 0x4e, 0x83, 0xfb, 0x16, 0xb0,\n  0x03, 0x6c, 0x26, 0xd3, 0xe4, 0x4a, 0x21, 0x70, 0xbe, 0xaa, 0x8f, 0xec,\n  0x09, 0x36, 0x84, 0x61, 0x77, 0x4c, 0xee, 0xd1, 0x6a, 0xa1, 0xb2, 0x37,\n  0x8a, 0x23, 0x5c, 0x50, 0x4a, 0xf1, 0x53, 0xaa, 0x5f, 0xd3, 0xc8, 0x52,\n  0xff, 0x38, 0x75, 0xa6, 0xbb, 0x70, 0x41, 0x51, 0x8b, 0xe5, 0x05, 0xd6,\n  0xf9, 0xf3, 0x6f, 0x79, 0x34, 0xcf, 0xa7, 0xbe, 0x8b, 0xf7, 0xc4, 0xe0,\n  0xa0, 0x56, 0x9f, 0xba, 0x5e, 0x65, 0x72, 0xf5, 0xaa, 0xef, 0x54, 0x69,\n  0xbe, 0x32, 0xcf, 0x7f, 0xdb, 0xa5, 0x8b, 0xd5, 0x9f, 0x58, 0xab, 0xd8,\n  0x1c, 0xf9, 0x59, 0x03, 0x0f, 0xbe, 0xe5, 0x5e, 0xfe, 0x5c, 0xc2, 0x34,\n  0xde, 0x25, 0x35, 0x59, 0xf6, 0x43, 0x71, 0x83, 0x95, 0xa9, 0x43, 0x6a,\n  0x54, 0x74, 0x5a, 0x5a, 0x74, 0x54, 0x6a, 0x51, 0xdd, 0x8a, 0x64, 0x9f,\n  0x93, 0xe7, 0xe3, 0xeb, 0xc6, 0x11, 0x86, 0x90, 0x8c, 0x32, 0x27, 0x5c,\n  0x35, 0x8e, 0xe4, 0xf7, 0x61, 0xf2, 0xf1, 0xde, 0x0b, 0xbd, 0xb9, 0x21,\n  0x97, 0x49, 0xe2, 0x16, 0xd2, 0x96, 0x09, 0x37, 0xcd, 0x4f, 0x3f, 0xb2,\n  0x64, 0x72, 0x8d, 0x54, 0x14, 0x3c, 0x19, 0x76, 0x87, 0x0d, 0xa3, 0xc2,\n  0xd3, 0x58, 0x97, 0xd4, 0xd4, 0xb4, 0x14, 0xb9, 0x46, 0xd2, 0x68, 0xb0,\n  0xa7, 0x8c, 0x94, 0xc6, 0x89, 0x19, 0x42, 0x43, 0x23, 0x25, 0xd9, 0x25,\n  0xdc, 0x79, 0x63, 0x7b, 0xcf, 0x99, 0xd1, 0x64, 0x6c, 0xaf, 0x6b, 0x67,\n  0x7b, 0xe7, 0xb7, 0xeb, 0x56, 0xd3, 0xbe, 0x7d, 0x4d, 0xb7, 0x76, 0x7c,\n  0xf4, 0x8c, 0x1d, 0x7d, 0x5f, 0x7e, 0x68, 0xe6, 0xbd, 0x7d, 0x5e, 0x7c,\n  0x78, 0xdd, 0xda, 0x35, 0xeb, 0xd7, 0xae, 0x5d, 0x5b, 0xf7, 0x7d, 0x0e,\n  0xf8, 0xc6, 0x60, 0x93, 0xc5, 0x78, 0x22, 0x0d, 0xdd, 0xa9, 0xe0, 0xdb,\n  0xa2, 0xaf, 0x88, 0x1c, 0x1d, 0x28, 0xdb, 0x9c, 0x94, 0x12, 0x44, 0xa3,\n  0x98, 0x74, 0x4d, 0x83, 0x22, 0x9f, 0x8f, 0xe8, 0x2d, 0x44, 0x60, 0x74,\n  0x68, 0x55, 0xee, 0x8b, 0x1d, 0xf9, 0xcf, 0xd9, 0x05, 0xb1, 0x81, 0xe1,\n  0x41, 0x6d, 0x5a, 0xdd, 0x6e, 0xe9, 0x2e, 0x8f, 0xc9, 0xe3, 0x8d, 0x47,\n  0x68, 0x2d, 0x24, 0xcf, 0xc1, 0xdf, 0x8f, 0x16, 0x1e, 0x21, 0x3f, 0x02,\n  0x57, 0x05, 0x43, 0x42, 0xed, 0xa0, 0xc6, 0x28, 0x8a, 0xec, 0x48, 0x59,\n  0x79, 0x46, 0x5a, 0x26, 0x16, 0xfc, 0xa4, 0xa4, 0xc2, 0xe2, 0x36, 0xc2,\n  0x12, 0x5f, 0xcd, 0x28, 0xb2, 0xf5, 0x4b, 0x4f, 0x0b, 0x4b, 0x12, 0x9a,\n  0x37, 0xf3, 0x99, 0xa2, 0x4e, 0xe9, 0x15, 0xcd, 0x0b, 0xba, 0x36, 0x6a,\n  0x92, 0x35, 0xa9, 0x7c, 0xe4, 0xcc, 0xdc, 0xee, 0xc5, 0xb7, 0xf1, 0x71,\n  0x1d, 0x9f, 0x2b, 0xea, 0xd9, 0x2d, 0xaf, 0x55, 0xeb, 0xd4, 0xc4, 0x56,\n  0x29, 0x4d, 0x47, 0xf5, 0x6b, 0x3e, 0x7c, 0x48, 0xd1, 0x3a, 0x87, 0x25,\n  0x43, 0x63, 0xd2, 0xa3, 0x42, 0x32, 0x64, 0x31, 0x8f, 0xa7, 0x75, 0x2a,\n  0x97, 0xce, 0x80, 0x50, 0x02, 0x48, 0x00, 0x7f, 0xea, 0x77, 0x47, 0x55,\n  0x1a, 0x77, 0xf0, 0xce, 0xf2, 0xa3, 0x14, 0xb4, 0x26, 0x8e, 0x63, 0x0e,\n  0x87, 0x73, 0x18, 0x8d, 0x51, 0x18, 0xb1, 0x3a, 0x25, 0xa7, 0xa5, 0x26,\n  0xa5, 0xa6, 0x65, 0x61, 0xa4, 0xca, 0xa5, 0x2c, 0x1c, 0xd2, 0x90, 0xb6,\n  0xe5, 0x8a, 0x67, 0xeb, 0x99, 0xc6, 0x6e, 0x9d, 0xc2, 0x6d, 0x89, 0xf9,\n  0xe9, 0x9a, 0xf2, 0xde, 0x3d, 0x5b, 0xce, 0x19, 0xd2, 0x7c, 0x68, 0x4e,\n  0xe3, 0xb1, 0x79, 0x43, 0x7b, 0x8d, 0x1b, 0xd2, 0xbe, 0xa2, 0xef, 0x80,\n  0x8a, 0x92, 0x96, 0xdd, 0x33, 0x73, 0xd2, 0xa7, 0x75, 0x98, 0x3a, 0x49,\n  0xa4, 0x74, 0xe8, 0xe5, 0xef, 0x30, 0xfa, 0x56, 0xb6, 0x19, 0x56, 0x14,\n  0x14, 0xde, 0x3d, 0x3c, 0xaa, 0x73, 0x59, 0xbb, 0x56, 0x9d, 0x3b, 0xb5,\n  0x2e, 0x68, 0x91, 0x1c, 0x5d, 0x12, 0x9f, 0x33, 0x52, 0xfa, 0x1f, 0x61,\n  0x04, 0x32, 0xc5, 0x61, 0x1a, 0x43, 0xa1, 0xac, 0xa9, 0x27, 0x37, 0x80,\n  0x3b, 0x14, 0x97, 0xfc, 0x54, 0x5e, 0x95, 0xcb, 0x49, 0xeb, 0xbd, 0x94,\n  0x9f, 0x8d, 0x65, 0x72, 0x5d, 0x92, 0xdf, 0xea, 0xc7, 0xbb, 0xb8, 0xdd,\n  0xee, 0x50, 0x77, 0x68, 0x50, 0x30, 0x4d, 0x2c, 0xb9, 0x2c, 0xa7, 0xc9,\n  0x69, 0x95, 0x54, 0xc8, 0xf3, 0x83, 0xf2, 0x53, 0xa4, 0x35, 0x4d, 0x21,\n  0x25, 0x2a, 0x22, 0x73, 0x6c, 0x2f, 0xef, 0x6e, 0x5e, 0x33, 0x60, 0xec,\n  0x73, 0x0e, 0xee, 0xd0, 0x22, 0xdd, 0x1f, 0x6e, 0xdf, 0xbe, 0xbd, 0x33,\n  0xff, 0xca, 0x9b, 0xf2, 0x55, 0x41, 0xc7, 0xa4, 0x90, 0x9c, 0x00, 0xef,\n  0x3b, 0x96, 0xde, 0xda, 0x42, 0x6f, 0x87, 0x58, 0x3c, 0x2b, 0xf7, 0x94,\n  0xc6, 0x46, 0x08, 0x85, 0x85, 0x1b, 0xe4, 0x9d, 0xe9, 0xa4, 0x39, 0xa5,\n  0x4a, 0x5a, 0x7a, 0xe9, 0x06, 0x8e, 0x23, 0x65, 0x39, 0x86, 0x90, 0xda,\n  0xe0, 0xba, 0xd5, 0x4d, 0x0d, 0x0e, 0xd7, 0x27, 0x34, 0xd8, 0xdf, 0xa4,\n  0xe5, 0x2e, 0x9e, 0xc7, 0xab, 0xf5, 0x56, 0xfe, 0x6a, 0xb5, 0x49, 0x6d,\n  0x85, 0x24, 0x85, 0x25, 0xa9, 0x45, 0x45, 0x3c, 0x64, 0xf2, 0xa2, 0x5b,\n  0xe7, 0x17, 0x0f, 0x4b, 0x4a, 0x1d, 0xd3, 0xa4, 0xeb, 0xb0, 0xde, 0x83,\n  0x62, 0x3b, 0x84, 0xe7, 0xc4, 0xf0, 0xd1, 0xde, 0x6f, 0x83, 0x82, 0x5a,\n  0xf2, 0xfd, 0x93, 0x47, 0x4e, 0x59, 0x10, 0x1a, 0xd2, 0x83, 0x74, 0xd4,\n  0xb5, 0xa2, 0xb3, 0xe1, 0x8c, 0xe5, 0xdd, 0x6a, 0xde, 0x91, 0x1f, 0x40,\n  0x97, 0x3a, 0x2a, 0x26, 0x39, 0xfd, 0xa8, 0x7f, 0xe3, 0x59, 0x0e, 0x6b,\n  0xe3, 0x69, 0xa5, 0x51, 0xc7, 0xe9, 0x34, 0xcc, 0x82, 0xb8, 0xc3, 0xa9,\n  0x54, 0xc9, 0x4f, 0x97, 0x51, 0x08, 0x3d, 0xae, 0xae, 0x3b, 0xa7, 0x56,\n  0xbb, 0x68, 0xa5, 0xaa, 0x5b, 0x94, 0x12, 0x13, 0xd2, 0x53, 0x13, 0x72,\n  0x12, 0x73, 0x52, 0x33, 0xd2, 0x52, 0x55, 0x1a, 0x79, 0x21, 0x05, 0x6d,\n  0x04, 0xf5, 0x5d, 0x44, 0x58, 0x3a, 0xc9, 0xe6, 0x2f, 0xd4, 0xfc, 0xa2,\n  0x2b, 0x93, 0x3b, 0x3d, 0xa2, 0x4e, 0x66, 0x69, 0xbc, 0xc3, 0x8b, 0x63,\n  0x2a, 0x17, 0x8e, 0x0a, 0xcb, 0x0f, 0x0c, 0x6e, 0x1c, 0xd1, 0x7e, 0x60,\n  0x61, 0xa4, 0xe2, 0x8a, 0xe8, 0xee, 0x19, 0x34, 0xfd, 0xba, 0xb1, 0xe5,\n  0x93, 0x4b, 0xcf, 0xb7, 0xed, 0xd2, 0xbe, 0x7d, 0x93, 0x8a, 0x8c, 0xe4,\n  0x72, 0xde, 0xb4, 0xfa, 0xb6, 0x39, 0x1d, 0x1c, 0xce, 0xce, 0x2e, 0x57,\n  0x6e, 0xcd, 0x58, 0x1a, 0x99, 0xd3, 0xc6, 0x4e, 0x5d, 0x58, 0x7e, 0xcb,\n  0xd2, 0x6e, 0xbd, 0xca, 0x6b, 0x32, 0x4a, 0x12, 0xb3, 0x7b, 0x15, 0x63,\n  0x47, 0x98, 0x09, 0xf9, 0x9d, 0xe5, 0x2e, 0x96, 0xe6, 0x49, 0x76, 0x72,\n  0xcc, 0xb8, 0x7a, 0x7f, 0x58, 0xa9, 0x73, 0x29, 0xe9, 0xb6, 0x2b, 0x28,\n  0xc8, 0x41, 0xb3, 0x2f, 0x9f, 0x27, 0x15, 0x26, 0x85, 0xf1, 0xe5, 0x3c,\n  0xcd, 0xbb, 0x80, 0x7f, 0xe9, 0x3d, 0x2a, 0xe6, 0xd6, 0x94, 0xd7, 0xce,\n  0x45, 0xca, 0x06, 0x36, 0xc3, 0xc0, 0x7c, 0xcb, 0x94, 0xfb, 0x76, 0x9e,\n  0xfc, 0xfc, 0x94, 0x30, 0x55, 0x9a, 0xfa, 0x2a, 0x5a, 0xd1, 0xc9, 0x6a,\n  0x38, 0xac, 0x05, 0xda, 0x36, 0x25, 0xd4, 0x53, 0x71, 0xb1, 0xd2, 0x55,\n  0x89, 0xcd, 0x8c, 0xcb, 0x0c, 0xf0, 0x63, 0x31, 0x3c, 0xc6, 0x55, 0xdf,\n  0x53, 0x2e, 0x15, 0xae, 0x9b, 0x6d, 0x55, 0xac, 0x95, 0xd8, 0x5e, 0x8a,\n  0xeb, 0xd6, 0xe2, 0x3a, 0x33, 0x93, 0x41, 0x0b, 0x36, 0x8f, 0x1b, 0x7c,\n  0x6d, 0x5a, 0x9b, 0xb4, 0x9c, 0x0e, 0xd9, 0x0b, 0x26, 0xcc, 0x98, 0xd7,\n  0xa8, 0x3c, 0xa3, 0xa0, 0x63, 0xf3, 0xa1, 0x25, 0xc5, 0x95, 0x29, 0x25,\n  0xa9, 0x05, 0x95, 0x15, 0xef, 0x74, 0x22, 0x27, 0xa5, 0x7b, 0x79, 0x60,\n  0x59, 0x7b, 0x71, 0xa4, 0x6f, 0x8f, 0x6c, 0x4f, 0xd3, 0x90, 0xb0, 0xc2,\n  0x8a, 0xa6, 0xfd, 0xc7, 0x8d, 0x1a, 0xd0, 0xb4, 0x43, 0x41, 0x70, 0x7c,\n  0xaf, 0xb2, 0xe2, 0xce, 0x99, 0x95, 0x85, 0xcd, 0xd2, 0x9a, 0xa5, 0x04,\n  0x86, 0xb7, 0x29, 0x6a, 0x56, 0xe8, 0xcd, 0x2c, 0x68, 0xdf, 0xbe, 0xb8,\n  0xa0, 0x7d, 0xb4, 0x2b, 0xb6, 0xa3, 0xec, 0xe3, 0x66, 0xd4, 0x2e, 0xed,\n  0x4a, 0x1f, 0x07, 0x72, 0xa7, 0x43, 0x8e, 0x43, 0x4d, 0x7e, 0x8a, 0xb5,\n  0x4a, 0xae, 0x31, 0xdc, 0x29, 0xc6, 0xd5, 0xf7, 0xec, 0x55, 0xb3, 0xb7,\n  0xae, 0x8f, 0xd3, 0x32, 0x52, 0xd1, 0xc7, 0x3c, 0xd4, 0x5f, 0x58, 0xa3,\n  0x30, 0xbf, 0x59, 0x1b, 0x21, 0xe7, 0xc4, 0x15, 0xc3, 0x19, 0x9e, 0x61,\n  0x7b, 0x5b, 0x68, 0x5f, 0xba, 0xd0, 0x62, 0x2a, 0x6f, 0x18, 0x15, 0x5a,\n  0x18, 0x94, 0xd1, 0xb4, 0x62, 0x40, 0x51, 0xa4, 0x70, 0x85, 0xf7, 0x28,\n  0x1d, 0x38, 0xad, 0xc5, 0xe8, 0xf6, 0xe5, 0x93, 0x3d, 0xe7, 0xdb, 0x74,\n  0x6d, 0x57, 0x91, 0x87, 0x4e, 0xde, 0x20, 0x3b, 0xd9, 0xe9, 0xec, 0xec,\n  0x97, 0xdb, 0x75, 0x5c, 0xcb, 0xe4, 0xa6, 0xd3, 0xc6, 0x74, 0x9e, 0xd8,\n  0xb2, 0xfd, 0xcd, 0x4b, 0xbb, 0xf7, 0x6c, 0xdf, 0x55, 0x76, 0x72, 0xcf,\n  0xe6, 0xac, 0x41, 0xcc, 0x93, 0x4e, 0xeb, 0x48, 0x04, 0xec, 0xb9, 0x2d,\n  0xe2, 0x8c, 0xab, 0x62, 0x9e, 0xd4, 0xd4, 0x64, 0x07, 0x06, 0xe2, 0x95,\n  0x81, 0x17, 0xf4, 0x57, 0x2b, 0x4c, 0xdd, 0x3b, 0xff, 0x3a, 0x3d, 0x3e,\n  0x3e, 0x9d, 0x96, 0x1a, 0xef, 0xb5, 0x57, 0xd6, 0x1c, 0xc1, 0x12, 0x68,\n  0xcd, 0x7c, 0x09, 0xcf, 0x0a, 0x63, 0xc9, 0x9e, 0x04, 0x07, 0x27, 0xfb,\n  0xa6, 0x88, 0x11, 0xf5, 0xcf, 0xe4, 0x5d, 0x4c, 0xd3, 0x0c, 0x33, 0xc3,\n  0xc2, 0x53, 0x93, 0x9d, 0x7e, 0x51, 0x57, 0x3d, 0x2e, 0x04, 0x8b, 0x28,\n  0x69, 0xa6, 0xa2, 0xee, 0x19, 0xe3, 0xe5, 0x6a, 0x5a, 0x66, 0x84, 0x04,\n  0x39, 0xaf, 0x3c, 0x6d, 0xbf, 0xbb, 0xe0, 0x86, 0xc2, 0xf4, 0x3e, 0xbd,\n  0x52, 0x98, 0xfd, 0x1b, 0x96, 0x33, 0x85, 0x2e, 0x86, 0xca, 0x41, 0xfa,\n  0x18, 0xad, 0x19, 0xcd, 0xb2, 0xd3, 0xd2, 0x0a, 0xd3, 0xc2, 0x68, 0xad,\n  0xd7, 0xbd, 0x8d, 0xf8, 0x47, 0xde, 0x65, 0x7c, 0xce, 0xcc, 0x77, 0x9a,\n  0xfd, 0xd8, 0xe5, 0xd1, 0xad, 0x24, 0x5b, 0x73, 0xf6, 0x09, 0x59, 0x8a,\n  0x93, 0x88, 0xd1, 0x9a, 0x78, 0x68, 0xf4, 0x3b, 0x6c, 0xd7, 0x40, 0x28,\n  0x0a, 0x02, 0x4a, 0x65, 0x88, 0x93, 0x6c, 0xb1, 0xd2, 0xf5, 0xaf, 0xc2,\n  0x35, 0x1a, 0xf9, 0x4e, 0x7a, 0x35, 0xe7, 0x87, 0xbc, 0x45, 0xfc, 0x10,\n  0xdf, 0x56, 0x59, 0xf9, 0x7a, 0x65, 0xe5, 0x3f, 0xcb, 0x40, 0x8e, 0x6c,\n  0xb3, 0xec, 0x62, 0x12, 0xc2, 0x19, 0xe6, 0x6c, 0xc6, 0xe7, 0x90, 0x00,\n  0x1f, 0x79, 0x1b, 0xbd, 0xb4, 0xe5, 0xb1, 0x2e, 0x3f, 0x36, 0x7b, 0x47,\n  0xea, 0xc7, 0xf4, 0x9d, 0xe7, 0x77, 0xd2, 0x78, 0x92, 0xbe, 0x6f, 0x4b,\n  0x4f, 0x71, 0x20, 0x8d, 0xa3, 0x00, 0x12, 0x42, 0xc8, 0x69, 0x22, 0xd7,\n  0x02, 0x65, 0x61, 0xdd, 0x42, 0x8f, 0xd9, 0xe2, 0x18, 0x46, 0x16, 0x6e,\n  0x9a, 0x83, 0xa6, 0x61, 0x56, 0x66, 0x6a, 0x32, 0x95, 0x4a, 0x48, 0xcb,\n  0x76, 0xc9, 0xc5, 0x1f, 0x53, 0xe3, 0xaf, 0xd6, 0x2a, 0x7f, 0x11, 0x16,\n  0xa6, 0x36, 0xd0, 0xea, 0x2d, 0x01, 0x69, 0x89, 0x19, 0xd9, 0xc1, 0x6d,\n  0x5a, 0x35, 0xad, 0x4a, 0x49, 0xc8, 0x1c, 0x56, 0x32, 0x64, 0x6c, 0x5c,\n  0x61, 0x6a, 0x52, 0x8a, 0x39, 0x28, 0x25, 0x46, 0x76, 0x66, 0x4c, 0xca,\n  0xc1, 0x98, 0xf4, 0xe2, 0x66, 0x31, 0x49, 0x39, 0x59, 0xf1, 0x79, 0x05,\n  0x51, 0x41, 0x15, 0x61, 0xb1, 0x83, 0xbb, 0x35, 0x6e, 0x5b, 0x18, 0x1f,\n  0x9b, 0xd5, 0x28, 0x2e, 0x68, 0xdd, 0x95, 0xae, 0x25, 0xd9, 0x5b, 0xfa,\n  0x76, 0x29, 0xf2, 0x1b, 0xf8, 0xdb, 0xb2, 0x6a, 0x76, 0x9d, 0x27, 0x24,\n  0x9c, 0xeb, 0xa2, 0x52, 0x23, 0xbb, 0xdc, 0x84, 0x82, 0xb5, 0x3c, 0x4e,\n  0x9e, 0x1d, 0x79, 0xee, 0xf1, 0xe4, 0xb9, 0xa7, 0x6b, 0x9c, 0x9c, 0x2e,\n  0x0a, 0x51, 0x19, 0x19, 0x69, 0xe6, 0x72, 0xba, 0x46, 0x51, 0x23, 0x10,\n  0xab, 0x8c, 0xb7, 0xa2, 0x1d, 0x52, 0xf5, 0x24, 0x9d, 0x9c, 0xf7, 0x54,\n  0xaa, 0x54, 0x57, 0x84, 0x3e, 0xee, 0xef, 0x0b, 0x38, 0xc8, 0x7f, 0xf7,\n  0xef, 0xdc, 0x31, 0x2d, 0x23, 0x2d, 0x2d, 0x3d, 0x33, 0x2d, 0x2d, 0xd5,\n  0x90, 0x71, 0xac, 0x3d, 0x91, 0xae, 0x9a, 0x41, 0x11, 0xaa, 0x2b, 0xb4,\n  0xc1, 0x0c, 0xb2, 0xad, 0xa5, 0xf4, 0xd7, 0xc3, 0xc0, 0x46, 0x7c, 0x30,\n  0xb1, 0xb6, 0x8f, 0x52, 0x5c, 0x6c, 0xf1, 0x28, 0x1d, 0xc3, 0x72, 0x3c,\n  0x39, 0xb9, 0x85, 0x2e, 0x67, 0x70, 0x45, 0x61, 0x55, 0x8f, 0x82, 0x21,\n  0xa5, 0x39, 0xbd, 0x22, 0x0d, 0x9e, 0x16, 0x95, 0x90, 0x1d, 0xd1, 0x79,\n  0x71, 0x8f, 0xe9, 0x5b, 0xba, 0x6d, 0x5e, 0xd7, 0x7a, 0x4a, 0x76, 0xf6,\n  0x84, 0xd2, 0xd9, 0xf7, 0xf5, 0x6b, 0x39, 0x79, 0xcb, 0x88, 0xb1, 0xdb,\n  0x07, 0x79, 0xd5, 0xfc, 0xec, 0xe6, 0x4d, 0x1d, 0x2e, 0xbf, 0xcc, 0xb0,\n  0xa6, 0x25, 0xd1, 0x7c, 0x54, 0x6e, 0xdf, 0xca, 0xec, 0xc2, 0xe4, 0xb4,\n  0x66, 0xa3, 0x7b, 0x96, 0x8d, 0x6a, 0x19, 0xa0, 0xbf, 0x19, 0x1c, 0xa0,\n  0x14, 0x24, 0xe7, 0xf7, 0xca, 0x1f, 0x74, 0x43, 0xf9, 0xe0, 0x1d, 0xe3,\n  0xd7, 0x6f, 0x8d, 0x09, 0x2c, 0x0f, 0x8e, 0xe8, 0xbb, 0x63, 0xe6, 0xa0,\n  0xbb, 0x66, 0x95, 0xf6, 0xde, 0xb6, 0xc7, 0xd3, 0xb2, 0x67, 0xbb, 0xeb,\n  0x1d, 0xae, 0xbc, 0xce, 0xd6, 0xae, 0x18, 0x13, 0xf3, 0xc5, 0xdb, 0x34,\n  0x22, 0x83, 0xe4, 0x3a, 0xeb, 0x47, 0x8e, 0x37, 0xa7, 0x35, 0xce, 0xc1,\n  0xac, 0x15, 0x56, 0x88, 0xf1, 0xd5, 0x32, 0xd4, 0x97, 0x6b, 0xac, 0x46,\n  0xcb, 0x8e, 0x16, 0xa4, 0x05, 0x11, 0xaf, 0x4a, 0x1e, 0xac, 0x4a, 0xd3,\n  0x27, 0x29, 0x23, 0x49, 0x4d, 0xe1, 0xf9, 0x5c, 0xc9, 0xc8, 0x15, 0x19,\n  0xd2, 0x51, 0x11, 0x49, 0xbd, 0xbd, 0xdf, 0xf6, 0x1a, 0xc0, 0x23, 0xba,\n  0xf1, 0xf0, 0xc3, 0x35, 0x8a, 0xbf, 0x9f, 0x43, 0x0d, 0x76, 0x75, 0xfb,\n  0xe2, 0x0b, 0xf1, 0x76, 0x6d, 0x3e, 0x6f, 0xfc, 0xb1, 0x96, 0xd5, 0xd8,\n  0x4c, 0x68, 0x15, 0xf4, 0xb1, 0x65, 0xb3, 0x69, 0x42, 0xe2, 0x57, 0x83,\n  0x02, 0xc9, 0xcf, 0x4b, 0x66, 0x85, 0x9e, 0x66, 0x2a, 0x19, 0x33, 0x5a,\n  0x03, 0x04, 0x45, 0xdf, 0xb4, 0x74, 0x8d, 0xa9, 0xf3, 0x90, 0xa8, 0xd7,\n  0x1c, 0x0e, 0x2c, 0x0b, 0x24, 0x45, 0x74, 0x74, 0x74, 0x72, 0x74, 0x52,\n  0x72, 0x6a, 0x52, 0x4e, 0xa2, 0x5c, 0xe9, 0x43, 0xac, 0x81, 0xa6, 0x5a,\n  0xe1, 0x76, 0x4a, 0x4a, 0x48, 0x9d, 0x5f, 0x12, 0x14, 0x64, 0x63, 0xc3,\n  0xde, 0x5a, 0x7a, 0x53, 0x45, 0x59, 0xe3, 0x8e, 0x59, 0x4b, 0x66, 0x5c,\n  0xea, 0x7f, 0xe3, 0xc0, 0xf2, 0x1e, 0x03, 0x66, 0xaf, 0x1e, 0xd2, 0xa9,\n  0x9a, 0x9c, 0xbd, 0xae, 0xc3, 0xdb, 0xf6, 0x30, 0x9d, 0x2a, 0xf9, 0x54,\n  0xc3, 0xc6, 0xf3, 0x8d, 0xad, 0x5a, 0xb6, 0xca, 0xf7, 0xbe, 0xe7, 0xad,\n  0xed, 0x54, 0xd2, 0xbc, 0xbd, 0x35, 0xaf, 0x5a, 0x93, 0xed, 0xed, 0x47,\n  0x73, 0x25, 0x9a, 0x15, 0x7b, 0x0a, 0x22, 0xc8, 0x7d, 0x8b, 0xd4, 0xc9,\n  0xf3, 0x30, 0x68, 0x89, 0x55, 0xaa, 0xe4, 0x7a, 0x72, 0xc5, 0xe4, 0x62,\n  0x48, 0x4d, 0x13, 0xb4, 0xfc, 0x87, 0x87, 0x62, 0xe9, 0x8f, 0xe6, 0xd1,\n  0x4e, 0xb9, 0xa0, 0x24, 0xff, 0xd3, 0x20, 0x90, 0x83, 0x45, 0x26, 0x08,\n  0xf8, 0xba, 0x19, 0x37, 0x5e, 0x77, 0x5d, 0x93, 0x9e, 0x99, 0x99, 0xbd,\n  0x5a, 0x4d, 0x5a, 0xdb, 0xb1, 0xeb, 0xc6, 0xc9, 0xd3, 0x7a, 0xa6, 0x26,\n  0x75, 0x13, 0x4b, 0x36, 0x2e, 0x5d, 0xb2, 0x29, 0xd0, 0xec, 0x12, 0xe0,\n  0xdf, 0x7f, 0xe7, 0xd4, 0x89, 0x3b, 0x06, 0x65, 0x55, 0x05, 0x44, 0x32,\n  0xb8, 0xbd, 0x62, 0x0b, 0xe9, 0x4a, 0xa7, 0x7e, 0x92, 0x36, 0x54, 0x66,\n  0x9f, 0x2c, 0xf7, 0xf4, 0x8a, 0x1b, 0x99, 0x94, 0x96, 0x94, 0x6c, 0xfb,\n  0xc4, 0xd4, 0x7e, 0x39, 0xd6, 0x54, 0x68, 0x22, 0x3f, 0x51, 0x6c, 0x79,\n  0x75, 0xef, 0xeb, 0x9f, 0x4f, 0xdc, 0xda, 0x7b, 0xc8, 0xad, 0x37, 0xcc,\n  0x1a, 0xc6, 0x93, 0xf9, 0xc4, 0xc7, 0x9f, 0x10, 0x87, 0x6a, 0x36, 0xcd,\n  0x5e, 0xb5, 0xa4, 0xd6, 0xfa, 0xd5, 0x04, 0xaa, 0x9f, 0x9f, 0xa5, 0xfa,\n  0xdd, 0xac, 0x91, 0x27, 0x9d, 0xfa, 0x86, 0x5c, 0x08, 0xc7, 0x98, 0x06,\n  0x4f, 0x71, 0x3a, 0xeb, 0x9e, 0x72, 0x25, 0x7c, 0x49, 0x4a, 0x0a, 0x22,\n  0x17, 0xc6, 0xba, 0xf8, 0x59, 0xef, 0x34, 0xbe, 0xca, 0xfb, 0x26, 0x4f,\n  0xf1, 0x7e, 0x21, 0x7f, 0xfe, 0xa3, 0xeb, 0x97, 0x5d, 0x7c, 0x0d, 0xeb,\n  0xd5, 0x59, 0x8a, 0x27, 0x51, 0xd6, 0xcb, 0xae, 0xae, 0xb7, 0xbe, 0xca,\n  0x40, 0x27, 0xf5, 0x66, 0x7e, 0x4a, 0x5d, 0x8d, 0xcf, 0xf4, 0x47, 0x6d,\n  0xc9, 0xb4, 0xca, 0x1f, 0xea, 0x5a, 0xdb, 0xb5, 0xbe, 0x3f, 0x56, 0x52,\n  0x7f, 0x24, 0xb2, 0x56, 0x9e, 0xe6, 0x81, 0x64, 0x29, 0x83, 0xa8, 0x4f,\n  0xe2, 0xc9, 0xdb, 0xa1, 0xf1, 0xe9, 0x70, 0x48, 0xdf, 0xc1, 0xe9, 0x60,\n  0x18, 0x36, 0x75, 0x2e, 0x36, 0x0d, 0x1b, 0x7b, 0xb9, 0x0f, 0xa1, 0xf9,\n  0x9b, 0x62, 0x07, 0x5d, 0x41, 0x0d, 0xfb, 0x02, 0xd9, 0x9a, 0x14, 0x6b,\n  0x75, 0x97, 0x1d, 0x55, 0x98, 0xc2, 0xef, 0xf8, 0xad, 0xe5, 0xec, 0xce,\n  0x53, 0xee, 0xec, 0xda, 0x77, 0xc7, 0xac, 0x92, 0x09, 0xb9, 0xc9, 0xe9,\n  0x43, 0xf2, 0x17, 0xae, 0x2a, 0x9e, 0x3d, 0xb4, 0x49, 0x59, 0xcc, 0x16,\n  0xb2, 0xa8, 0xdb, 0x43, 0x82, 0xfb, 0xed, 0x98, 0x36, 0xf5, 0xde, 0x01,\n  0xe1, 0xa1, 0x5d, 0x82, 0x22, 0x37, 0x2e, 0xed, 0xb5, 0xb8, 0xa3, 0xa1,\n  0x1e, 0xb1, 0xdb, 0x2a, 0x16, 0x43, 0x87, 0x49, 0x9e, 0x78, 0x9c, 0x03,\n  0x70, 0xf0, 0x31, 0x4e, 0x64, 0x4f, 0x64, 0x3e, 0xee, 0x6a, 0xdd, 0x51,\n  0x4b, 0x83, 0xa8, 0x6b, 0x08, 0xe6, 0x8b, 0xc5, 0xfd, 0xbd, 0x6b, 0xfb,\n  0xf7, 0xe7, 0x93, 0xfb, 0xf3, 0x6a, 0xef, 0x63, 0x14, 0x51, 0xbf, 0x27,\n  0xbf, 0xa0, 0x1c, 0x9f, 0x1b, 0xe6, 0x59, 0xa8, 0x2f, 0xd1, 0x13, 0x27,\n  0xa3, 0x57, 0x19, 0xbb, 0x6a, 0x7f, 0x0a, 0x4c, 0xc2, 0xac, 0xc0, 0x84,\n  0x22, 0x87, 0xa0, 0x0c, 0x5a, 0x1f, 0xd4, 0xa0, 0x08, 0x9e, 0xe5, 0xf5,\n  0xf6, 0xec, 0xc9, 0x45, 0xcf, 0x9e, 0x05, 0x21, 0xa2, 0x55, 0x68, 0x41,\n  0x41, 0x68, 0xed, 0xab, 0x21, 0xf2, 0xbb, 0xe6, 0x1e, 0xf5, 0x95, 0xb1,\n  0xfd, 0x98, 0x6f, 0x99, 0x9e, 0x34, 0xb9, 0xf6, 0xc8, 0x6f, 0xb5, 0x95,\n  0x21, 0x89, 0x7c, 0x67, 0xa3, 0xe4, 0x64, 0x97, 0x43, 0xd8, 0xcf, 0xd4,\n  0x5c, 0x2c, 0x90, 0x53, 0x44, 0x12, 0x9e, 0xad, 0xd6, 0x7b, 0xad, 0x45,\n  0x85, 0x24, 0x6c, 0xa8, 0xcb, 0x11, 0x99, 0xea, 0x1f, 0x98, 0x1a, 0x1a,\n  0xd5, 0x38, 0xb6, 0xff, 0xe8, 0xe7, 0x55, 0x57, 0x95, 0xc3, 0x15, 0xda,\n  0xac, 0xb1, 0x78, 0xad, 0xb6, 0x74, 0xcc, 0xf0, 0xba, 0x71, 0x44, 0x6e,\n  0xdb, 0x21, 0x0a, 0xa2, 0x49, 0x66, 0x7f, 0x4d, 0x11, 0x0e, 0x72, 0x51,\n  0xaa, 0xa4, 0x33, 0x37, 0xbe, 0x9a, 0x5b, 0x4a, 0x08, 0x0b, 0x0a, 0xb1,\n  0xa2, 0x9d, 0x14, 0x45, 0x85, 0x0a, 0x68, 0x25, 0xa1, 0x68, 0x4a, 0x4c,\n  0x18, 0x5f, 0xdb, 0xb1, 0x7f, 0xff, 0xf8, 0x36, 0x09, 0x2f, 0x8e, 0xf3,\n  0x7e, 0xcb, 0x7b, 0x79, 0xbc, 0x3f, 0x92, 0x2a, 0xb6, 0x25, 0x97, 0x27,\n  0x7f, 0xec, 0x3d, 0x58, 0x3f, 0x46, 0xe5, 0xef, 0x15, 0x3a, 0xed, 0xcc,\n  0x29, 0x9c, 0x7f, 0x31, 0xf4, 0x8a, 0xa7, 0xe8, 0x64, 0x4e, 0xdb, 0x53,\n  0x94, 0x8a, 0x0d, 0x1b, 0xd6, 0x9f, 0x37, 0xa7, 0xa0, 0x72, 0x69, 0x8d,\n  0x55, 0x56, 0x91, 0xba, 0x0c, 0x63, 0x19, 0x9e, 0xd4, 0x10, 0x83, 0x23,\n  0xbe, 0xb3, 0x62, 0x52, 0xd2, 0xaa, 0x52, 0x17, 0x96, 0x86, 0x31, 0x92,\n  0x2e, 0x28, 0xdc, 0x25, 0xc5, 0x53, 0x52, 0x28, 0xe0, 0x91, 0x02, 0x86,\n  0xd0, 0x15, 0x84, 0xc8, 0x2f, 0x45, 0xe1, 0x9b, 0x7f, 0x74, 0x28, 0x8e,\n  0x1e, 0x4b, 0x3e, 0x77, 0x1c, 0xbb, 0xb1, 0x1f, 0x85, 0x22, 0x67, 0xc4,\n  0xf4, 0x84, 0x71, 0x2d, 0xbc, 0x5d, 0xe9, 0x39, 0x4f, 0x88, 0x8e, 0xb5,\n  0x45, 0xfc, 0x89, 0x82, 0xd1, 0x89, 0xb5, 0xab, 0xea, 0x75, 0x71, 0x07,\n  0x3d, 0x33, 0x98, 0xc5, 0x79, 0xa2, 0x05, 0xff, 0x27, 0x45, 0x44, 0x04,\n  0x85, 0xdb, 0x8a, 0xe0, 0x75, 0x8f, 0xe2, 0xf9, 0xb9, 0x82, 0x14, 0x2d,\n  0xee, 0x18, 0xe7, 0x5d, 0xe4, 0x10, 0xae, 0x1e, 0x63, 0xf9, 0xf5, 0xe4,\n  0xc2, 0x28, 0x3d, 0x45, 0xb7, 0x94, 0xb1, 0xc5, 0xde, 0x69, 0xf4, 0x94,\n  0x47, 0x02, 0x3d, 0x55, 0x89, 0xf2, 0x47, 0x78, 0x04, 0xe6, 0xc3, 0x3f,\n  0x28, 0x4e, 0x0e, 0x90, 0x59, 0xda, 0xbf, 0x8b, 0x93, 0x69, 0xd8, 0x37,\n  0x88, 0x93, 0xeb, 0xfd, 0xbd, 0xab, 0x22, 0xe5, 0x7f, 0x74, 0x5e, 0x3b,\n  0x71, 0xca, 0xba, 0x0e, 0x1d, 0xd6, 0x4d, 0x9d, 0xb0, 0xb6, 0x73, 0xed,\n  0x5b, 0xd3, 0xe7, 0xcc, 0x9d, 0x3a, 0x75, 0xce, 0x9c, 0x19, 0x7c, 0xf4,\n  0x94, 0x1d, 0x03, 0x07, 0xee, 0x9c, 0x32, 0xf9, 0xde, 0x81, 0x03, 0x76,\n  0x4c, 0x59, 0xb6, 0x69, 0xd3, 0xb2, 0x65, 0x1b, 0x36, 0xd8, 0xb6, 0xc8,\n  0x1a, 0x97, 0xa1, 0xac, 0x99, 0xa7, 0x89, 0x1c, 0xe9, 0x82, 0x46, 0xba,\n  0x8b, 0x4b, 0x53, 0x44, 0x7e, 0x3c, 0x43, 0x48, 0x44, 0x5d, 0xe2, 0x67,\n  0x72, 0x16, 0xe8, 0x6f, 0x86, 0xfa, 0x85, 0xd2, 0xe0, 0x75, 0xc9, 0xf4,\n  0xdf, 0x95, 0x78, 0x48, 0x9a, 0xa8, 0x94, 0xa0, 0x88, 0x14, 0xdb, 0x4c,\n  0xf3, 0xf8, 0x5b, 0x16, 0x16, 0x5e, 0x3f, 0xa1, 0x7b, 0xff, 0xc7, 0x07,\n  0x74, 0x18, 0x3d, 0xb2, 0xaf, 0x38, 0x34, 0x79, 0x64, 0xab, 0x31, 0x1e,\n  0xef, 0x0f, 0xe2, 0x50, 0xb5, 0xf7, 0x44, 0x59, 0xd7, 0xf6, 0xe5, 0x68,\n  0x6f, 0x6f, 0xb4, 0x37, 0x94, 0x2c, 0x40, 0xb6, 0x27, 0x53, 0x91, 0xe7,\n  0x90, 0xaa, 0xac, 0xfc, 0x90, 0xc3, 0x71, 0x25, 0xaa, 0xae, 0x4f, 0x53,\n  0xa4, 0xa5, 0x97, 0x86, 0x4a, 0xab, 0x22, 0x83, 0xd7, 0x88, 0x14, 0xf2,\n  0x70, 0xff, 0x5e, 0x01, 0xe3, 0xc6, 0x3c, 0x70, 0xc3, 0x0a, 0x97, 0x9f,\n  0xeb, 0x2f, 0xb5, 0xb0, 0xf8, 0xc9, 0x94, 0x47, 0xef, 0xe6, 0xff, 0xa4,\n  0x08, 0xf8, 0x24, 0x52, 0x17, 0x43, 0x30, 0xde, 0x23, 0xa4, 0x55, 0x52,\n  0xb9, 0x70, 0xf2, 0x3a, 0xbf, 0x7c, 0x0c, 0x72, 0x83, 0x43, 0x5c, 0xd0,\n  0x08, 0x49, 0x2b, 0x97, 0xaf, 0xc0, 0x00, 0xce, 0x42, 0x82, 0x02, 0x22,\n  0x02, 0x23, 0xac, 0x84, 0x14, 0xf3, 0xe7, 0xfe, 0x5a, 0x83, 0xd0, 0x23,\n  0x24, 0x45, 0xb9, 0x5a, 0x2f, 0xe9, 0x4b, 0x16, 0x64, 0x95, 0xa6, 0xbe,\n  0x32, 0xee, 0xa1, 0x95, 0xfd, 0x0f, 0x8c, 0x9e, 0xd0, 0xa7, 0x86, 0x16,\n  0xcc, 0x51, 0xa3, 0x5b, 0x54, 0x35, 0xf6, 0xf3, 0x1e, 0xe0, 0x19, 0xde,\n  0x4f, 0xc4, 0xa1, 0x2e, 0xde, 0xdf, 0xda, 0xb7, 0xab, 0x68, 0x45, 0x6a,\n  0xc8, 0xf7, 0x5d, 0xe0, 0x17, 0xc8, 0x3e, 0x36, 0x62, 0xb9, 0x9e, 0xec,\n  0x18, 0xb2, 0x8f, 0xb1, 0x2a, 0x2d, 0x55, 0x2e, 0x2b, 0x54, 0xb8, 0x62,\n  0x14, 0x1b, 0xc4, 0xf7, 0x39, 0x69, 0x58, 0x30, 0xd2, 0xfe, 0x14, 0x9e,\n  0xa6, 0x67, 0xfc, 0x95, 0x75, 0x8c, 0x88, 0x17, 0xfc, 0xc2, 0x8a, 0x59,\n  0x25, 0xa3, 0x93, 0x53, 0x27, 0xb4, 0xa8, 0xe9, 0x16, 0xdf, 0xb1, 0x74,\n  0xc0, 0xa0, 0x96, 0x63, 0xda, 0xb5, 0x1a, 0x9e, 0x19, 0x9b, 0xd6, 0xa7,\n  0x49, 0xbb, 0xf2, 0xf8, 0xf2, 0x96, 0x6d, 0xfb, 0x34, 0x7e, 0x61, 0xc8,\n  0xf8, 0xe0, 0xc0, 0xde, 0x81, 0xd1, 0x6d, 0x0a, 0x53, 0xf2, 0x1a, 0x45,\n  0x24, 0x0d, 0xed, 0xd1, 0xa2, 0x5b, 0x4e, 0x78, 0x70, 0x75, 0x60, 0x78,\n  0x8b, 0x26, 0xa9, 0x79, 0xe9, 0xe1, 0x11, 0x85, 0x9d, 0xea, 0x72, 0x43,\n  0x42, 0xfe, 0xc2, 0x91, 0x2a, 0xf3, 0x2d, 0x52, 0x37, 0x48, 0x9c, 0x36,\n  0x58, 0x10, 0xec, 0x99, 0x11, 0x44, 0x71, 0x7c, 0x58, 0x0a, 0x6f, 0xd7,\n  0xff, 0x4b, 0x11, 0x71, 0x54, 0x5c, 0xd7, 0x55, 0x9e, 0xb8, 0xea, 0x4f,\n  0xe3, 0x7e, 0x21, 0xe6, 0x15, 0xd9, 0x59, 0x19, 0xe3, 0x59, 0xdb, 0x27,\n  0x75, 0xad, 0xc2, 0xf7, 0xdc, 0x04, 0xa7, 0x84, 0xa4, 0x4a, 0x07, 0x9f,\n  0x07, 0xd9, 0x09, 0x22, 0x69, 0xbd, 0xd0, 0xbc, 0x20, 0xb1, 0xb0, 0xe4,\n  0xba, 0x21, 0x4b, 0x6e, 0xee, 0x3f, 0x68, 0xf0, 0xb0, 0x3e, 0x64, 0x61,\n  0x9a, 0x75, 0xba, 0xa6, 0xfd, 0x9a, 0x6b, 0xf8, 0x5b, 0xde, 0xa6, 0x7d,\n  0x86, 0x8e, 0xe9, 0xc6, 0x0f, 0xb3, 0xba, 0xef, 0xd9, 0xc4, 0x6f, 0x40,\n  0x9a, 0xf2, 0x19, 0x1a, 0x62, 0x53, 0x45, 0x88, 0xab, 0x52, 0x58, 0x26,\n  0x33, 0x2d, 0x6b, 0xc3, 0x95, 0x14, 0x25, 0x3f, 0x04, 0xc1, 0x61, 0x71,\n  0x88, 0xe8, 0xeb, 0xeb, 0xef, 0x1b, 0x7c, 0x77, 0x60, 0xb8, 0xaa, 0x86,\n  0x07, 0x6e, 0xb3, 0x72, 0x5a, 0xde, 0xa2, 0x9c, 0xea, 0x94, 0x94, 0x2e,\n  0x8d, 0xf9, 0x1b, 0x75, 0xdf, 0x25, 0xa1, 0xdc, 0x46, 0x75, 0x27, 0x48,\n  0x5b, 0x14, 0x13, 0xac, 0xca, 0x14, 0x4c, 0x95, 0xb4, 0x42, 0x0d, 0x6c,\n  0x03, 0x8e, 0x42, 0x27, 0x44, 0x06, 0x45, 0x05, 0x49, 0x5b, 0x24, 0x9f,\n  0x60, 0x79, 0x58, 0x0d, 0x1f, 0x55, 0x8f, 0x28, 0xb7, 0x3d, 0x3f, 0xe0,\n  0x66, 0x2d, 0xd0, 0x10, 0x3c, 0xc4, 0x7f, 0xd9, 0x80, 0xe7, 0x06, 0x4f,\n  0x31, 0x83, 0x9c, 0xce, 0x50, 0xbf, 0xf9, 0x83, 0x16, 0xfb, 0x87, 0x3a,\n  0x9d, 0xc1, 0xe6, 0x64, 0x29, 0x06, 0x3f, 0x12, 0xd7, 0xb2, 0xb1, 0xee,\n  0xd7, 0x2b, 0xd7, 0xdb, 0x84, 0x24, 0xaa, 0xca, 0xed, 0x9d, 0x9e, 0x31,\n  0x30, 0x87, 0xef, 0xf1, 0x76, 0xc9, 0x1d, 0x90, 0x42, 0xfd, 0x27, 0xcf,\n  0xa7, 0xe0, 0x4c, 0x35, 0xc3, 0x6f, 0x4a, 0x5a, 0x6b, 0x8e, 0xe6, 0xfc,\n  0x0b, 0xfb, 0x1d, 0x1c, 0x1c, 0x5c, 0x67, 0xbf, 0x95, 0x94, 0x10, 0x12,\n  0x27, 0x24, 0x5f, 0x11, 0x15, 0xa3, 0x9f, 0x3b, 0x30, 0xe4, 0xf4, 0xd1,\n  0x91, 0x7b, 0xf6, 0x0e, 0xf9, 0x82, 0x17, 0x79, 0x0f, 0xf1, 0x99, 0xbc,\n  0xb7, 0xf7, 0x3b, 0x1e, 0xe9, 0x7d, 0xf0, 0x8a, 0x3e, 0x65, 0x76, 0x4f,\n  0x63, 0xb1, 0x9e, 0x28, 0x97, 0x22, 0x33, 0x38, 0x55, 0x82, 0xdb, 0x36,\n  0x9c, 0xe6, 0x45, 0x70, 0x70, 0x90, 0x22, 0xbb, 0x8b, 0xea, 0xa2, 0xe1,\n  0xaf, 0xe4, 0xf3, 0x98, 0xa7, 0x87, 0x9d, 0xe9, 0x7f, 0x66, 0x38, 0xdd,\n  0x1b, 0xe2, 0xed, 0xec, 0xfd, 0x91, 0x07, 0xf1, 0xa7, 0xec, 0x6f, 0xff,\n  0xc0, 0x6f, 0x6d, 0xea, 0xd2, 0x4f, 0x51, 0xe5, 0x6f, 0x47, 0xd5, 0xa7,\n  0xd5, 0xec, 0x01, 0x74, 0xc5, 0x1f, 0x0a, 0x0e, 0x0a, 0xae, 0x4b, 0xab,\n  0x59, 0x99, 0x83, 0x24, 0x11, 0xe6, 0x0d, 0xe2, 0xd7, 0x7a, 0xd7, 0xf3,\n  0x4f, 0xbc, 0xcb, 0xf9, 0xa2, 0x72, 0x51, 0x54, 0x53, 0x5e, 0x8b, 0x5f,\n  0xa3, 0x64, 0x35, 0xbe, 0xe1, 0x3c, 0x0f, 0xe3, 0x91, 0xe4, 0x93, 0x27,\n  0xc5, 0x14, 0x36, 0xa2, 0xde, 0x4d, 0x11, 0xf5, 0x03, 0xd2, 0x49, 0xf3,\n  0x32, 0x4c, 0xda, 0xe9, 0xbc, 0x63, 0xc7, 0x56, 0xac, 0xd8, 0xaa, 0x8c,\n  0xed, 0x50, 0x9b, 0x59, 0x9f, 0xeb, 0x9c, 0xf0, 0x3f, 0xe4, 0x3a, 0x43,\n  0x78, 0x0a, 0x1f, 0xca, 0xdd, 0x7d, 0xbc, 0x17, 0xec, 0x54, 0xa7, 0xfc,\n  0xae, 0x28, 0xdf, 0x70, 0xf6, 0x7b, 0xfd, 0x73, 0xc1, 0x3b, 0xa2, 0xbe,\n  0x31, 0xbc, 0xfe, 0xb9, 0x11, 0xb4, 0x00, 0x15, 0xd2, 0x2b, 0x6a, 0xc5,\n  0x8a, 0x63, 0xc7, 0x7a, 0x8b, 0x8f, 0x3b, 0x5c, 0xbe, 0xd3, 0xd2, 0x6b,\n  0x3a, 0x77, 0x8b, 0x70, 0xf1, 0x0e, 0xc5, 0x7e, 0x19, 0x8f, 0xb8, 0x46,\n  0x96, 0x7b, 0x62, 0x9d, 0x32, 0xa9, 0x0b, 0xab, 0xb8, 0x04, 0x03, 0x76,\n  0x76, 0xc3, 0x0c, 0xca, 0x23, 0x2e, 0x56, 0x4e, 0xdd, 0x45, 0x46, 0x46,\n  0x49, 0x3f, 0xd2, 0xec, 0x87, 0x2e, 0xfb, 0xb6, 0x71, 0x37, 0x7f, 0xc5,\n  0x5b, 0xc2, 0xc7, 0x78, 0x61, 0xcf, 0xe4, 0xf7, 0x87, 0x8e, 0xe6, 0xcf,\n  0xfb, 0x76, 0xca, 0x4f, 0x20, 0xa3, 0xbe, 0x30, 0xec, 0x81, 0xc9, 0xdf,\n  0xf8, 0xb3, 0xb3, 0xce, 0x41, 0xf0, 0x37, 0x64, 0x45, 0x4e, 0xd2, 0x29,\n  0x7f, 0xde, 0xeb, 0xe1, 0x07, 0x36, 0x7a, 0xac, 0xfc, 0xbf, 0x18, 0xcc,\n  0xce, 0x09, 0xaf, 0xcc, 0x7f, 0xa3, 0x6c, 0x8c, 0x21, 0xb7, 0xdf, 0xb0,\n  0xcc, 0x32, 0xfc, 0xfc, 0x9f, 0x94, 0xc5, 0xcd, 0xdc, 0x61, 0x52, 0x19,\n  0x10, 0x25, 0x5e, 0x44, 0x84, 0xa5, 0xd0, 0xc0, 0x2e, 0x5c, 0xe3, 0x4e,\n  0x4a, 0x0b, 0x68, 0x15, 0xd1, 0xb2, 0xa9, 0x29, 0xbc, 0xe1, 0xc5, 0x05,\n  0x21, 0x66, 0x70, 0x8b, 0x16, 0xc1, 0xf2, 0xbb, 0x36, 0x73, 0xc9, 0xa6,\n  0x1d, 0x13, 0x49, 0xb4, 0xc2, 0xa5, 0xb3, 0x59, 0x1e, 0xff, 0x28, 0x8a,\n  0x4a, 0x22, 0xb9, 0xe2, 0x70, 0x51, 0xb8, 0xa7, 0xd8, 0x1b, 0x35, 0x09,\n  0x24, 0xac, 0xd3, 0xa5, 0x90, 0xe3, 0x27, 0x77, 0x62, 0x54, 0x8e, 0xcc,\n  0x82, 0xcb, 0xc5, 0x87, 0x09, 0xcb, 0xe4, 0xc6, 0x78, 0x52, 0xfe, 0x8a,\n  0x83, 0xee, 0x49, 0xb6, 0x3a, 0xd7, 0xbd, 0x9f, 0x27, 0x8c, 0xb3, 0xd4,\n  0xe4, 0xf8, 0xd8, 0xf0, 0xd0, 0xa0, 0x00, 0xb7, 0x4e, 0x9e, 0x64, 0x0c,\n  0x8f, 0xa9, 0xb3, 0xcc, 0x41, 0x29, 0x57, 0x82, 0xbd, 0xe2, 0xe2, 0x2b,\n  0x41, 0x6f, 0x88, 0x5a, 0x17, 0xe5, 0x15, 0xf2, 0xc4, 0xe1, 0x83, 0x3d,\n  0x41, 0x8e, 0x94, 0xea, 0xf2, 0x8e, 0x43, 0xe7, 0x2f, 0x1e, 0xd0, 0xb2,\n  0x30, 0xab, 0x2a, 0x29, 0x26, 0x65, 0xe8, 0x96, 0xae, 0x23, 0xab, 0x8b,\n  0xb3, 0xcb, 0xfb, 0x53, 0x60, 0x34, 0xd8, 0xbb, 0xae, 0x2a, 0x27, 0xab,\n  0xba, 0x7b, 0x4d, 0x1f, 0x87, 0x92, 0xd8, 0xae, 0x20, 0x2a, 0xb0, 0x2c,\n  0x24, 0xc6, 0xfb, 0xad, 0xe2, 0x68, 0x9e, 0xdf, 0x38, 0xab, 0x73, 0x17,\n  0x6a, 0x6b, 0x2f, 0xb2, 0x6b, 0x79, 0xe2, 0x22, 0x39, 0x21, 0x49, 0x6c,\n  0xed, 0xfe, 0x20, 0x0a, 0x81, 0x1c, 0xdc, 0x6e, 0x63, 0x9c, 0x5c, 0x5c,\n  0x27, 0x56, 0x5b, 0x9b, 0x4d, 0x56, 0xee, 0xc4, 0xe9, 0xb4, 0x5a, 0x48,\n  0x2b, 0x5d, 0x0c, 0x36, 0x33, 0x3c, 0x49, 0xff, 0xcc, 0x64, 0xef, 0x45,\n  0xd5, 0x2d, 0x89, 0xf5, 0xfb, 0x55, 0xb8, 0x2b, 0xd9, 0xaf, 0xec, 0x57,\n  0xd5, 0xf1, 0xf4, 0xeb, 0xe7, 0x09, 0x8d, 0x08, 0x67, 0x8c, 0x34, 0x91,\n  0x14, 0x91, 0x24, 0x3d, 0xa2, 0xd0, 0xd4, 0x0c, 0x4d, 0xe6, 0x4a, 0x64,\n  0x9c, 0xd5, 0x30, 0x31, 0x98, 0x91, 0xa2, 0xa6, 0x04, 0x85, 0xd0, 0xe2,\n  0x60, 0xab, 0xa0, 0xe0, 0x21, 0x45, 0x38, 0x23, 0x6a, 0xda, 0x8e, 0x9c,\n  0x33, 0x77, 0x44, 0xdb, 0x9a, 0x08, 0x35, 0xb8, 0xed, 0x4f, 0xbd, 0xca,\n  0x4a, 0xfb, 0x76, 0xa8, 0x14, 0x17, 0x9f, 0x4a, 0x6e, 0x15, 0x94, 0x9c,\n  0x7b, 0xf3, 0x8a, 0x15, 0xb7, 0xe4, 0x26, 0x96, 0x8b, 0x8b, 0xde, 0x63,\n  0xc3, 0xc7, 0x38, 0x46, 0x8c, 0x1b, 0x3f, 0xf2, 0x4d, 0x39, 0x6e, 0x8a,\n  0xa9, 0x8f, 0x5f, 0x10, 0xc9, 0x56, 0x9c, 0xe5, 0xa6, 0xf0, 0x2a, 0xc2,\n  0x14, 0x8a, 0x88, 0x94, 0x5f, 0xf8, 0x56, 0x55, 0x97, 0x5b, 0x9d, 0x81,\n  0x89, 0x8d, 0x34, 0x1e, 0x99, 0x78, 0xce, 0xc2, 0x42, 0x02, 0xfd, 0x75,\n  0xb5, 0x2e, 0xce, 0x72, 0xfe, 0xd9, 0x9d, 0xbf, 0x12, 0x75, 0xf1, 0x9c,\n  0xca, 0x29, 0x6d, 0xcb, 0xa6, 0x75, 0x68, 0x54, 0x15, 0x19, 0x13, 0xe9,\n  0x89, 0xdd, 0x5a, 0x5d, 0x95, 0xd3, 0x2e, 0x36, 0xa6, 0xd4, 0x68, 0x39,\n  0x77, 0xc8, 0x88, 0x79, 0x2d, 0x83, 0xcc, 0x8e, 0x7a, 0xe0, 0x9b, 0xc3,\n  0xc6, 0x04, 0xfb, 0x75, 0xf1, 0x0f, 0xa8, 0xcb, 0xa9, 0x06, 0xa3, 0x0f,\n  0x92, 0xd9, 0x6d, 0xfb, 0x83, 0x75, 0xe1, 0x70, 0xd6, 0xf7, 0x81, 0xfc,\n  0x12, 0xdd, 0x7a, 0x4d, 0xcd, 0xb0, 0xf5, 0xac, 0xb8, 0x04, 0x44, 0xaa,\n  0xeb, 0x83, 0x3f, 0x31, 0x91, 0xd4, 0x13, 0xaa, 0xaf, 0xec, 0x11, 0x4a,\n  0x46, 0xe2, 0xb9, 0x72, 0x5b, 0x26, 0x7d, 0xfe, 0x99, 0x87, 0xfa, 0x20,\n  0x22, 0x22, 0x9c, 0xcb, 0x3e, 0x48, 0x8e, 0x48, 0x0e, 0x0a, 0x0c, 0xf0,\n  0xa7, 0x98, 0x32, 0x8c, 0x87, 0x69, 0x56, 0x5b, 0x0b, 0x91, 0x5f, 0x89,\n  0xc8, 0xa7, 0x46, 0x4b, 0xa3, 0x20, 0xc7, 0x66, 0x06, 0xe9, 0xdf, 0x1a,\n  0x97, 0xd4, 0x74, 0x1e, 0x32, 0xf2, 0xda, 0x39, 0x23, 0xdb, 0x74, 0x8d,\n  0xa2, 0x40, 0xba, 0x6f, 0xa5, 0x9f, 0x23, 0xb2, 0xa6, 0x69, 0xaf, 0xf6,\n  0x65, 0xfd, 0x2a, 0x2b, 0x2b, 0x0d, 0xea, 0x82, 0x5b, 0x73, 0x93, 0xfc,\n  0xf2, 0x03, 0x3e, 0xac, 0xd5, 0x3a, 0x24, 0xe7, 0x75, 0x1c, 0x34, 0x38,\n  0x70, 0xe4, 0x84, 0x69, 0x43, 0x86, 0x8e, 0xb7, 0xdb, 0xce, 0xa9, 0x1f,\n  0x22, 0x58, 0x3c, 0x6b, 0xe7, 0xf1, 0x98, 0xd4, 0x13, 0x7e, 0xe4, 0x45,\n  0x08, 0xe9, 0xcf, 0x48, 0xbf, 0x66, 0xcc, 0x15, 0x19, 0xaf, 0xca, 0xdd,\n  0x45, 0x51, 0x57, 0xc5, 0xc6, 0x44, 0xc6, 0x47, 0xc5, 0x07, 0x05, 0x18,\n  0x9a, 0xcb, 0xc9, 0x22, 0x78, 0x84, 0x3d, 0x73, 0xc2, 0xc3, 0xc2, 0x92,\n  0xc2, 0xff, 0x1c, 0x00, 0x47, 0xd0, 0xe4, 0x49, 0xa2, 0x08, 0x38, 0xb5,\n  0xfd, 0x88, 0x42, 0xef, 0x1a, 0xd1, 0xaf, 0x26, 0xbf, 0x6b, 0x56, 0xa3,\n  0x9a, 0xe2, 0xaa, 0x59, 0xa5, 0xad, 0x26, 0x54, 0xb4, 0xed, 0xa8, 0x92,\n  0xad, 0x6f, 0x23, 0x92, 0x4b, 0x26, 0x75, 0x2c, 0x1c, 0x30, 0x24, 0x24,\n  0xb8, 0x3a, 0x38, 0xa8, 0xcd, 0x75, 0xfd, 0xfa, 0xce, 0x2f, 0xef, 0xd0,\n  0xad, 0x43, 0x79, 0x2f, 0x86, 0x4f, 0x3f, 0x31, 0xbe, 0x58, 0xd4, 0x92,\n  0x9c, 0x03, 0x3d, 0x01, 0xfe, 0xff, 0x8f, 0xb6, 0xf7, 0x80, 0x6f, 0xec,\n  0x2a, 0xf3, 0x40, 0xef, 0x39, 0xf7, 0x4a, 0x57, 0xc5, 0x6a, 0x56, 0x97,\n  0x2c, 0xcb, 0x92, 0xac, 0xe2, 0x6e, 0x59, 0x96, 0xe5, 0x6e, 0xb9, 0x37,\n  0xb9, 0x4d, 0xb1, 0x2d, 0x8f, 0xc7, 0x1e, 0xcf, 0x78, 0xc6, 0x33, 0x9e,\n  0x9a, 0xcc, 0x64, 0x26, 0x95, 0x4c, 0xda, 0x24, 0x21, 0x85, 0x54, 0x42,\n  0xaf, 0x09, 0x9b, 0x42, 0x20, 0x04, 0x12, 0x20, 0x9b, 0x65, 0x59, 0x08,\n  0x0b, 0x0c, 0x6d, 0x17, 0x12, 0x16, 0x42, 0x09, 0x81, 0x40, 0xb2, 0x1b,\n  0x58, 0xc2, 0x42, 0x42, 0x60, 0xe3, 0xeb, 0x77, 0xbe, 0x73, 0x8b, 0xe4,\n  0x96, 0xc9, 0xbe, 0xf7, 0x7b, 0x93, 0xb8, 0x5d, 0x9d, 0x73, 0xef, 0xb9,\n  0xa7, 0x7c, 0xfd, 0xfb, 0x7f, 0x88, 0x63, 0x4d, 0x3c, 0x39, 0x2a, 0x6a,\n  0x30, 0xe0, 0x90, 0xa5, 0xf2, 0x91, 0x55, 0xf0, 0x32, 0x92, 0x41, 0xf4,\n  0x08, 0xd5, 0xbc, 0x54, 0xf3, 0x64, 0xc6, 0x8f, 0x4a, 0x9c, 0xc6, 0x4b,\n  0xe9, 0x3b, 0xe8, 0xb7, 0x87, 0x36, 0x7c, 0x96, 0x4d, 0x6b, 0x89, 0xa2,\n  0x28, 0x7b, 0xe7, 0x40, 0x10, 0x0b, 0x25, 0x53, 0xd2, 0x6c, 0x4b, 0x82,\n  0x90, 0x3d, 0x81, 0x32, 0x37, 0x4e, 0xcf, 0xcd, 0xcd, 0x6e, 0x2b, 0x49,\n  0x5a, 0x9d, 0xe6, 0x72, 0x47, 0x65, 0xc5, 0x8d, 0xe8, 0x59, 0xa1, 0x12,\n  0x3d, 0x5b, 0x56, 0xec, 0x3f, 0xb8, 0x4b, 0xcf, 0xf7, 0xaa, 0x74, 0x2d,\n  0x1d, 0x21, 0x71, 0x2f, 0x99, 0xc9, 0x5e, 0x0a, 0x92, 0xd9, 0xac, 0x60,\n  0xce, 0xa6, 0x4d, 0x0e, 0x16, 0xab, 0x55, 0x64, 0x42, 0x39, 0x32, 0xb1,\n  0xac, 0x4c, 0xbc, 0x82, 0x1a, 0x44, 0x54, 0xeb, 0x05, 0xc4, 0x63, 0x89,\n  0x6c, 0x89, 0x16, 0xb7, 0x11, 0x59, 0x5e, 0x3b, 0x0e, 0x4e, 0x66, 0x28,\n  0x66, 0x77, 0x74, 0x44, 0x6c, 0xa9, 0xd0, 0xb7, 0x8d, 0x0d, 0xb3, 0x69,\n  0x77, 0x89, 0x9f, 0xb0, 0x84, 0x52, 0x7f, 0x45, 0x49, 0x85, 0xc7, 0x65,\n  0x36, 0xea, 0xb5, 0x6a, 0xea, 0x85, 0xd0, 0x8a, 0x8b, 0xe1, 0x4c, 0xa4,\n  0x40, 0x85, 0x0b, 0x05, 0xa9, 0x09, 0x18, 0xf6, 0x0b, 0x78, 0x46, 0xd6,\n  0x7a, 0xdb, 0xe9, 0x2e, 0x42, 0xd6, 0xe4, 0xce, 0x62, 0x55, 0x41, 0xdf,\n  0x25, 0x57, 0x9c, 0x1e, 0x1e, 0x3b, 0xd3, 0x3b, 0x86, 0x11, 0xd7, 0x70,\n  0xe2, 0xe0, 0x25, 0x97, 0x9c, 0xec, 0x1e, 0x1a, 0xec, 0x9b, 0x18, 0xca,\n  0xe0, 0x60, 0xac, 0xac, 0x7f, 0xe5, 0x85, 0x93, 0xa7, 0x82, 0x13, 0xe5,\n  0x13, 0x7d, 0xf6, 0x82, 0x2a, 0xed, 0xc4, 0x5d, 0xd7, 0x9d, 0xbd, 0x6f,\n  0xe8, 0xf0, 0xbe, 0x7d, 0x87, 0xa6, 0x16, 0xec, 0xc7, 0xe6, 0x45, 0xde,\n  0x44, 0x16, 0x0b, 0xbb, 0xe9, 0x59, 0x1a, 0x7f, 0x02, 0xbc, 0xa0, 0x70,\n  0x90, 0xe0, 0x8c, 0x38, 0x55, 0x64, 0x1f, 0x1d, 0x51, 0x44, 0xb6, 0x93,\n  0xb2, 0x6c, 0xec, 0x4d, 0x3b, 0x73, 0xd7, 0xa0, 0x0d, 0x9a, 0x97, 0x3e,\n  0xc9, 0xa6, 0x0d, 0xa2, 0x72, 0x66, 0x0d, 0x5a, 0x23, 0x20, 0x10, 0x11,\n  0x5a, 0x24, 0x93, 0x22, 0xd0, 0xcc, 0x60, 0x61, 0xc8, 0xcf, 0x47, 0x55,\n  0x6a, 0x4f, 0xb6, 0x7e, 0xef, 0xde, 0xa9, 0x4b, 0x67, 0xba, 0xa7, 0xf1,\n  0x9b, 0x2f, 0xc4, 0x42, 0x65, 0xe5, 0xbb, 0x97, 0x84, 0x4f, 0xa2, 0xa9,\n  0x6b, 0xf6, 0xcf, 0x11, 0x75, 0xf2, 0x4d, 0x51, 0x66, 0x07, 0x9e, 0xfc,\n  0x04, 0x7e, 0x91, 0xc6, 0x4a, 0xdc, 0x36, 0xfc, 0x98, 0x0e, 0x86, 0x44,\n  0xa5, 0x62, 0xa0, 0x2e, 0x47, 0x46, 0x40, 0x63, 0x3f, 0x2a, 0x69, 0x30,\n  0xe4, 0x54, 0x17, 0xac, 0xf9, 0xf8, 0xc4, 0xfa, 0x8f, 0xab, 0xde, 0xae,\n  0x77, 0xda, 0x0e, 0x17, 0x41, 0xd9, 0x3c, 0x94, 0x7f, 0x3d, 0x4b, 0xce,\n  0xb7, 0x15, 0x62, 0x25, 0xf2, 0x23, 0x23, 0xd4, 0xeb, 0x22, 0x23, 0x9c,\n  0xe4, 0x85, 0xae, 0xb5, 0xf9, 0xfd, 0x36, 0x47, 0x71, 0x71, 0xe7, 0x34,\n  0x7e, 0xd1, 0xeb, 0x2b, 0x22, 0xff, 0x7c, 0xde, 0x6f, 0xaf, 0x40, 0x75,\n  0x49, 0xf2, 0x1e, 0xab, 0xdf, 0x5e, 0x35, 0x4b, 0xef, 0xe1, 0x65, 0x1e,\n  0x48, 0xeb, 0xcc, 0x64, 0x6b, 0x99, 0xc8, 0xd6, 0x82, 0x00, 0x06, 0x1d,\n  0x3d, 0x04, 0x92, 0xa4, 0x7f, 0x04, 0x0c, 0x21, 0x47, 0xc5, 0x9d, 0x02,\n  0xde, 0x90, 0xe3, 0xca, 0x7b, 0x79, 0x73, 0xde, 0xa1, 0xcd, 0x9a, 0x54,\n  0x5d, 0xe8, 0x2e, 0x54, 0x64, 0x21, 0x2c, 0x19, 0x1d, 0xda, 0xf0, 0x19,\n  0xbc, 0xa3, 0xc9, 0x50, 0xe0, 0x72, 0xda, 0x0a, 0x0b, 0xbc, 0x06, 0x6f,\n  0x69, 0x50, 0x2d, 0xc6, 0x00, 0x28, 0xdc, 0x83, 0xcd, 0x69, 0x1c, 0xd4,\n  0xb2, 0x30, 0x5a, 0xec, 0x10, 0xdf, 0xb6, 0xd1, 0x1d, 0x31, 0x9a, 0x4a,\n  0xac, 0x25, 0xe5, 0xd3, 0x03, 0xf8, 0x21, 0x9f, 0x97, 0xbe, 0xf7, 0x5b,\n  0xd7, 0xf1, 0xaa, 0x7e, 0x4e, 0x1d, 0x8a, 0xe3, 0xc3, 0x2b, 0xef, 0x1b,\n  0xde, 0x99, 0xdb, 0x5f, 0x06, 0xb2, 0xa8, 0x56, 0x66, 0x2c, 0xad, 0x35,\n  0x9b, 0x0a, 0xc8, 0x86, 0x61, 0xe4, 0x3d, 0x56, 0xc8, 0x51, 0x5e, 0x48,\n  0xda, 0x1d, 0x1d, 0x51, 0xe4, 0x00, 0x17, 0x5c, 0x14, 0xa3, 0x19, 0x0e,\n  0xaf, 0xf9, 0x28, 0x9b, 0x06, 0xfc, 0x15, 0x2b, 0x63, 0xb5, 0x16, 0x7a,\n  0xa8, 0x5b, 0xc0, 0x02, 0xac, 0xae, 0x1d, 0xa7, 0x52, 0x09, 0xa2, 0x91,\n  0x45, 0x79, 0x22, 0xf2, 0x7d, 0x9a, 0x45, 0x9c, 0xda, 0xe5, 0xd6, 0x3e,\n  0xb2, 0xf4, 0xd3, 0x57, 0x96, 0x9f, 0x6a, 0x9b, 0x22, 0x4c, 0xec, 0xa4,\n  0xb9, 0xde, 0xaa, 0x29, 0xf6, 0xeb, 0x9e, 0xf8, 0xad, 0xf0, 0xbd, 0xbf,\n  0x27, 0x69, 0xcd, 0x2b, 0x18, 0x13, 0xf3, 0x28, 0xad, 0x67, 0x11, 0x13,\n  0x07, 0x02, 0x25, 0x6d, 0x8f, 0x48, 0xb2, 0xa0, 0x97, 0xfe, 0x25, 0x8b,\n  0xa7, 0xd9, 0x2f, 0x88, 0xb2, 0x54, 0x82, 0xc8, 0x93, 0x8f, 0x4e, 0x4f,\n  0xc3, 0xee, 0xa4, 0xfd, 0xd9, 0x49, 0x42, 0x33, 0x02, 0xcc, 0xee, 0x27,\n  0x8b, 0x5d, 0x58, 0x3c, 0x34, 0x40, 0x28, 0x1c, 0x1c, 0xf5, 0x63, 0xf1,\n  0x6a, 0x0d, 0x4b, 0x8f, 0x87, 0x64, 0x94, 0xf5, 0xa6, 0x3d, 0x84, 0x16,\n  0x1c, 0x1d, 0x91, 0x3e, 0xd5, 0xe0, 0xfc, 0x0f, 0x09, 0x17, 0x41, 0x8c,\n  0xcf, 0x0b, 0x91, 0x58, 0x16, 0xb2, 0x16, 0x5a, 0x9e, 0x48, 0x35, 0x01,\n  0x14, 0xd0, 0x2a, 0x52, 0x8d, 0x72, 0x72, 0xe4, 0x9f, 0x09, 0x27, 0x3d,\n  0x55, 0xf0, 0x1d, 0x7f, 0x7c, 0xd7, 0xcc, 0xd4, 0xd1, 0xd1, 0xee, 0xa9,\n  0x63, 0x13, 0xed, 0x84, 0x89, 0xa8, 0xdc, 0x3b, 0x6b, 0xdf, 0x15, 0x51,\n  0x79, 0x77, 0xe3, 0xe0, 0xee, 0x83, 0xe4, 0x48, 0x65, 0xaf, 0x9e, 0x99,\n  0x14, 0x7e, 0x42, 0x7e, 0x2c, 0xce, 0x01, 0x5c, 0xf1, 0x60, 0x79, 0xd9,\n  0x4c, 0x75, 0x65, 0xfe, 0xb9, 0x0f, 0x92, 0xf9, 0x1c, 0x7f, 0xc2, 0x8c,\n  0x72, 0xaf, 0x60, 0xa5, 0xa7, 0x9b, 0x53, 0xe1, 0x75, 0x67, 0x9e, 0x6e,\n  0x1d, 0xf8, 0x48, 0x85, 0xf2, 0x3e, 0xc9, 0xa6, 0x2d, 0x84, 0xd4, 0x1b,\n  0xa5, 0x61, 0x5b, 0x91, 0x55, 0xbd, 0x71, 0xd8, 0x74, 0xb8, 0x68, 0x6a,\n  0x0f, 0x39, 0xf1, 0xd9, 0x1e, 0x18, 0xa4, 0x67, 0x56, 0x1a, 0xde, 0xd4,\n  0x35, 0xca, 0xb8, 0x14, 0x5f, 0x69, 0x94, 0x8c, 0x69, 0x5d, 0x4c, 0xc1,\n  0xc9, 0xb5, 0xb6, 0x92, 0xb0, 0x62, 0x3f, 0x15, 0x59, 0xd5, 0x06, 0x43,\n  0x41, 0xf4, 0xc6, 0x93, 0xfd, 0xc7, 0xd3, 0xe7, 0x4e, 0x0e, 0x1e, 0xef,\n  0x10, 0x0e, 0x0f, 0x6f, 0x9b, 0xc8, 0x64, 0xb6, 0x6d, 0x1b, 0x42, 0x86,\n  0x1b, 0xee, 0xea, 0xbc, 0x2a, 0x7b, 0xc3, 0x1d, 0x9d, 0x57, 0x64, 0xe7,\n  0x8f, 0x1f, 0x9f, 0x9f, 0x3f, 0x72, 0x84, 0x3e, 0x73, 0x27, 0xa1, 0xff,\n  0xb5, 0xe4, 0x99, 0x76, 0x26, 0xc4, 0x1c, 0x06, 0x59, 0x22, 0x4f, 0x9e,\n  0xcb, 0x13, 0x1e, 0x4e, 0xe6, 0xa4, 0xaf, 0x11, 0x99, 0xe2, 0x07, 0x18,\n  0xa0, 0x16, 0x6b, 0xf8, 0xed, 0xba, 0x36, 0x39, 0x09, 0x21, 0xe4, 0x0c,\n  0xad, 0x95, 0x10, 0x72, 0x0e, 0x67, 0x30, 0x2b, 0xd9, 0xa5, 0x69, 0x02,\n  0xae, 0x9b, 0x73, 0x50, 0xa0, 0x1d, 0xfb, 0x2e, 0x23, 0x22, 0xc2, 0x84,\n  0x53, 0x8d, 0xb9, 0xe9, 0x81, 0x02, 0xce, 0x35, 0x1a, 0xdf, 0xd6, 0x8d,\n  0x3b, 0xa7, 0xe3, 0x1d, 0xfe, 0x7e, 0x1c, 0x7c, 0xf7, 0x2d, 0x37, 0xdf,\n  0x5e, 0xe3, 0xb7, 0xd4, 0x5b, 0x7f, 0xce, 0x6a, 0x06, 0x43, 0xb5, 0x43,\n  0xb3, 0x73, 0x96, 0x7d, 0x87, 0x1b, 0x76, 0xb7, 0xce, 0x1e, 0xcb, 0xe7,\n  0x6b, 0x20, 0x23, 0x1d, 0x04, 0x39, 0x35, 0x5f, 0x46, 0x92, 0xc5, 0xd2,\n  0x93, 0x39, 0x39, 0xf4, 0x22, 0x2a, 0x69, 0x1e, 0x17, 0x63, 0xec, 0x30,\n  0x3e, 0xba, 0x41, 0x86, 0xca, 0x6f, 0x93, 0x93, 0x3e, 0x89, 0xe4, 0x93,\n  0x27, 0x7d, 0xaa, 0x24, 0x3f, 0x7e, 0x28, 0x27, 0xfe, 0x10, 0x6e, 0xc6,\n  0x82, 0xc5, 0x56, 0x11, 0x7b, 0x9e, 0xc2, 0xac, 0xda, 0x39, 0x91, 0x5e,\n  0xb8, 0xec, 0x8a, 0xbd, 0x1d, 0xe3, 0x2e, 0xce, 0xd0, 0xf7, 0xda, 0xf6,\n  0x5e, 0xd4, 0x33, 0x35, 0xd0, 0xd7, 0xff, 0xda, 0x6f, 0x0b, 0x6b, 0x2d,\n  0xc1, 0x5a, 0x90, 0x7e, 0x6a, 0x43, 0x83, 0x6f, 0xbd, 0x89, 0x6a, 0x76,\n  0xcd, 0x15, 0x1e, 0x38, 0x74, 0xd1, 0xfc, 0xfc, 0x61, 0x65, 0xcf, 0xa2,\n  0xdb, 0xe9, 0x9e, 0x3d, 0x20, 0xbe, 0x89, 0x1e, 0x3c, 0x42, 0x66, 0x8e,\n  0x88, 0x9f, 0x38, 0xe3, 0x85, 0xbf, 0x58, 0xf9, 0xaf, 0xac, 0xd8, 0xa0,\n  0x90, 0x12, 0x46, 0x96, 0xc3, 0xb2, 0xa0, 0x0d, 0xeb, 0xe6, 0xa0, 0xeb,\n  0xa6, 0xb0, 0x03, 0xf9, 0x03, 0x42, 0x0a, 0xc5, 0xbd, 0xac, 0x51, 0xc3,\n  0x4e, 0x56, 0x49, 0xfc, 0x98, 0x97, 0xfc, 0x44, 0xca, 0x4e, 0x1e, 0x33,\n  0x85, 0x0c, 0x7a, 0x83, 0xdf, 0x58, 0x36, 0x50, 0x31, 0x3d, 0xa0, 0xe3,\n  0x3c, 0xdb, 0x70, 0x90, 0x65, 0x27, 0x58, 0xae, 0x6a, 0xa2, 0x41, 0xf8,\n  0x35, 0x76, 0xed, 0xad, 0x4c, 0x33, 0x92, 0x9d, 0xe7, 0x71, 0x1c, 0x7c,\n  0x5b, 0x3b, 0xcf, 0xc9, 0x77, 0x66, 0xe7, 0xa9, 0xc6, 0x6b, 0xa5, 0x1b,\n  0xc9, 0xcc, 0xf3, 0xf8, 0xa9, 0xbd, 0x8d, 0x13, 0xfe, 0x92, 0x5d, 0x35,\n  0xdd, 0xad, 0x8e, 0xa6, 0x64, 0xfd, 0x50, 0xec, 0xf8, 0x4c, 0x7c, 0x67,\n  0xb8, 0x38, 0x38, 0x14, 0x6d, 0x68, 0xf2, 0xb4, 0x25, 0x12, 0x03, 0x91,\n  0x7b, 0x46, 0xc7, 0x0b, 0xcd, 0xe3, 0x66, 0x6f, 0x45, 0xa9, 0xad, 0xa4,\n  0xc4, 0x66, 0x8b, 0x35, 0x56, 0xf6, 0x0c, 0x59, 0x2d, 0x7d, 0x46, 0x5b,\n  0xa8, 0xd8, 0xe1, 0xf7, 0xd9, 0xac, 0xb1, 0x26, 0x71, 0x5e, 0xcd, 0x64,\n  0xac, 0xdb, 0xf1, 0xdd, 0x8c, 0x0b, 0x62, 0x50, 0x8c, 0x08, 0x73, 0x2c,\n  0x62, 0x30, 0x24, 0xf5, 0xc3, 0x50, 0x39, 0xf6, 0x06, 0xe0, 0x16, 0x34,\n  0x8c, 0xe2, 0xe8, 0x08, 0xec, 0xf3, 0x5c, 0x1c, 0x85, 0xdd, 0x66, 0x2d,\n  0xb4, 0x98, 0xe9, 0x8c, 0xb9, 0x90, 0x0b, 0xec, 0x86, 0xe1, 0x3c, 0x29,\n  0x12, 0xe4, 0xb2, 0x54, 0xc2, 0x0e, 0xba, 0x38, 0x59, 0x77, 0x8d, 0xad,\n  0xdc, 0x60, 0xac, 0x77, 0x95, 0xf7, 0x57, 0x66, 0x46, 0x42, 0xf5, 0x1f,\n  0xfc, 0x60, 0x4d, 0x3b, 0xcf, 0x75, 0xf3, 0x5a, 0xdf, 0x40, 0x27, 0x6a,\n  0x2c, 0x0f, 0x5d, 0x7c, 0x45, 0x8f, 0x70, 0x3e, 0x5e, 0x23, 0x8e, 0x67,\n  0x8c, 0xd0, 0x01, 0x3b, 0xe1, 0x9f, 0x56, 0x26, 0xf3, 0x04, 0x0d, 0x06,\n  0x95, 0x69, 0x13, 0xa4, 0x97, 0xe1, 0xa3, 0xa2, 0x96, 0x21, 0x19, 0x3a,\n  0x08, 0x6d, 0x92, 0xaf, 0x92, 0xbf, 0xf3, 0x4d, 0x8b, 0xa2, 0x3c, 0x42,\n  0xf8, 0x45, 0xd0, 0x5a, 0x2a, 0x1a, 0x68, 0x72, 0x1a, 0x22, 0x30, 0x33,\n  0xd1, 0xce, 0x64, 0x1f, 0x30, 0x70, 0x9e, 0xd9, 0xfa, 0x85, 0xbd, 0xd9,\n  0x33, 0xd9, 0x5e, 0xec, 0x5a, 0x79, 0xa5, 0xbf, 0x3c, 0xba, 0xfb, 0x00,\n  0x9a, 0x17, 0xfe, 0xe1, 0xec, 0xe2, 0x9c, 0x58, 0x59, 0x8e, 0x0e, 0x0a,\n  0x6a, 0x46, 0x9b, 0xc0, 0xce, 0xc4, 0x83, 0x3b, 0x38, 0x03, 0x4f, 0x3f,\n  0x9a, 0x17, 0xff, 0x60, 0x62, 0x4c, 0x5e, 0xd1, 0xaa, 0xcd, 0x26, 0x40,\n  0x63, 0x06, 0xbe, 0x64, 0x4d, 0xb0, 0xdf, 0xf9, 0xce, 0xdc, 0xc5, 0x9a,\n  0x42, 0x23, 0xcb, 0x71, 0x26, 0x2b, 0x7f, 0xf1, 0xdc, 0x77, 0xb1, 0x4b,\n  0x78, 0xc6, 0xd1, 0x10, 0xb7, 0x58, 0xea, 0x1a, 0xec, 0xa8, 0x75, 0xe5,\n  0x15, 0x46, 0xc2, 0x27, 0x45, 0x2c, 0x8f, 0xc1, 0xbf, 0x06, 0xb6, 0x26,\n  0x33, 0xc7, 0x2a, 0x96, 0xac, 0xa3, 0x23, 0x2a, 0xd8, 0xbb, 0xa2, 0x89,\n  0x22, 0xc8, 0x04, 0xdd, 0x1e, 0x8b, 0x1b, 0x5e, 0x25, 0xcc, 0x46, 0xa8,\n  0x6b, 0x53, 0x31, 0x35, 0x89, 0xcf, 0xa3, 0xbf, 0x51, 0xab, 0x13, 0x8b,\n  0xf5, 0xb3, 0x06, 0x32, 0x5f, 0x5c, 0xa1, 0x71, 0xcf, 0xe2, 0xdd, 0xbb,\n  0x86, 0xf4, 0x36, 0x8e, 0xe3, 0xf4, 0x46, 0x7e, 0x7e, 0xcf, 0xac, 0xde,\n  0x4e, 0xe4, 0x6e, 0x7b, 0xc1, 0xf0, 0xcc, 0xbd, 0x08, 0x55, 0x97, 0x8d,\n  0x39, 0x1c, 0x63, 0xe5, 0xc2, 0x8f, 0xc8, 0xc0, 0x7e, 0x5d, 0x31, 0xed,\n  0xb3, 0xd4, 0xa5, 0x1c, 0xa8, 0x5a, 0xf8, 0x61, 0x70, 0xdc, 0xe7, 0x9e,\n  0xae, 0x46, 0xc5, 0x30, 0x42, 0x8a, 0x08, 0x40, 0xab, 0x44, 0xeb, 0x81,\n  0x2a, 0x6b, 0xd5, 0x2c, 0xbb, 0x61, 0x06, 0x0a, 0x0b, 0x0b, 0x2d, 0x34,\n  0x32, 0x80, 0x4d, 0x38, 0x53, 0x09, 0x16, 0xd8, 0x71, 0xe8, 0xd9, 0x2f,\n  0x2f, 0xbe, 0xfb, 0xe6, 0x7d, 0x5f, 0xfe, 0xfa, 0xe2, 0x5d, 0xf7, 0xec,\n  0x43, 0x85, 0x48, 0x7d, 0xfe, 0xbc, 0xf0, 0x77, 0xe1, 0xbf, 0x7f, 0xfc,\n  0x63, 0xf1, 0x9d, 0xd1, 0xaa, 0x19, 0x01, 0xca, 0xbe, 0x07, 0xde, 0xd9,\n  0x63, 0x55, 0x91, 0x25, 0x2d, 0xa4, 0x72, 0x91, 0x78, 0xdf, 0x3c, 0x89,\n  0x39, 0x1c, 0x72, 0x53, 0xf3, 0xca, 0x9a, 0xd7, 0xcb, 0x0f, 0x71, 0x4a,\n  0xa5, 0xd0, 0xdc, 0x29, 0x93, 0x4b, 0xcd, 0xa9, 0x3d, 0xc6, 0xa3, 0xf3,\n  0x2f, 0x17, 0x65, 0x47, 0x5d, 0xa5, 0x06, 0xbd, 0xdf, 0x52, 0xdd, 0x64,\n  0x2e, 0x22, 0xef, 0xf5, 0x83, 0xd8, 0x60, 0xc0, 0x3d, 0x51, 0x86, 0x6a,\n  0x57, 0x3e, 0x92, 0x99, 0x51, 0xb1, 0x7d, 0x98, 0xab, 0xaf, 0xe8, 0x97,\n  0xd1, 0x64, 0xd1, 0x67, 0xc9, 0x18, 0xb6, 0xb0, 0x53, 0x1d, 0x7d, 0x7b,\n  0x3b, 0x15, 0xfa, 0xac, 0x70, 0x29, 0x2a, 0x11, 0xfe, 0x84, 0x4e, 0x08,\n  0x2f, 0xa1, 0x50, 0x33, 0xfa, 0x40, 0x4f, 0x97, 0x70, 0x8c, 0xde, 0xb7,\n  0x68, 0x75, 0x2f, 0x9a, 0xc5, 0xe7, 0x19, 0x1f, 0x53, 0x99, 0x2e, 0x73,\n  0x50, 0xe6, 0x0a, 0x48, 0x03, 0x2a, 0x8c, 0xc0, 0x75, 0x4d, 0xfe, 0xdf,\n  0x2f, 0xab, 0x3e, 0xcb, 0xdc, 0xa8, 0xd7, 0x62, 0xb7, 0xd8, 0xa9, 0x2e,\n  0xa3, 0x02, 0x55, 0x91, 0xd0, 0xc9, 0x64, 0x03, 0x15, 0xfb, 0x13, 0xe4,\n  0x1c, 0x11, 0xad, 0x9d, 0xb7, 0x3b, 0x40, 0x77, 0x77, 0xa2, 0xd9, 0xd9,\n  0xe5, 0x8e, 0x96, 0x96, 0x8e, 0x63, 0xd3, 0xf5, 0x2d, 0x47, 0x8f, 0x36,\n  0x27, 0x3f, 0x82, 0x46, 0xc7, 0xef, 0x4e, 0x54, 0x0c, 0xa2, 0xf2, 0xba,\n  0x7b, 0xc6, 0x47, 0x07, 0x50, 0x65, 0xfc, 0x8e, 0x25, 0xab, 0xda, 0xba,\n  0x74, 0x77, 0xbc, 0x02, 0x3c, 0x45, 0x7f, 0x5c, 0x35, 0xa1, 0xc6, 0xb5,\n  0x32, 0x0e, 0x15, 0x0f, 0x11, 0x3a, 0x8e, 0xa8, 0x8c, 0x43, 0xeb, 0x2c,\n  0xd2, 0xbf, 0x64, 0x19, 0x07, 0x1c, 0x28, 0x7f, 0x1c, 0x1c, 0xc4, 0x6f,\n  0xbe, 0xe5, 0x14, 0xd7, 0xa8, 0x84, 0xbc, 0xc7, 0x1e, 0xfa, 0x1e, 0x75,\n  0xe9, 0x1a, 0xc2, 0x05, 0xc0, 0x92, 0x2f, 0x7a, 0x07, 0x0f, 0x31, 0x0c,\n  0x8d, 0xbe, 0xde, 0x2f, 0xfb, 0x55, 0x97, 0xa1, 0x5c, 0x13, 0x69, 0xe8,\n  0x23, 0x6f, 0xe3, 0x95, 0xa2, 0xae, 0xe9, 0x6b, 0xa4, 0x92, 0xf4, 0xa5,\n  0x60, 0xa9, 0xa8, 0x09, 0x42, 0x7c, 0x29, 0x75, 0x89, 0xf8, 0x12, 0xd2,\n  0x2b, 0x7d, 0x64, 0x00, 0x57, 0xc4, 0xef, 0xa4, 0xc3, 0xbf, 0x8b, 0x0c,\n  0x7f, 0x80, 0xbc, 0xda, 0x5d, 0xe2, 0xab, 0xdd, 0x3b, 0x36, 0x26, 0xc5,\n  0x4f, 0x20, 0x3f, 0xd6, 0xa2, 0x4f, 0x10, 0x7d, 0xb2, 0x95, 0xda, 0xad,\n  0xe2, 0xe4, 0x1c, 0x22, 0x2b, 0x44, 0x8e, 0x64, 0x0a, 0x11, 0x1a, 0x52,\n  0x03, 0x5e, 0x3c, 0x26, 0xab, 0x97, 0xa5, 0x18, 0xfa, 0x88, 0x39, 0x24,\n  0xe9, 0xbe, 0x98, 0x9d, 0x90, 0xc3, 0x56, 0xc0, 0x9a, 0x85, 0x28, 0x09,\n  0xe5, 0x93, 0x94, 0x9e, 0xca, 0x4a, 0x2f, 0xd9, 0x4a, 0xc8, 0x50, 0x5a,\n  0xe3, 0x28, 0x6a, 0x77, 0xd5, 0x0e, 0xf8, 0x9a, 0xaa, 0x4b, 0x6b, 0xec,\n  0xbe, 0x76, 0x57, 0xbc, 0xbf, 0xa8, 0x05, 0x75, 0x98, 0xf5, 0x41, 0xf7,\n  0x68, 0xb2, 0xc0, 0x06, 0x3f, 0x47, 0x1a, 0x0c, 0x52, 0xac, 0xcc, 0x10,\n  0xf3, 0x0c, 0xa1, 0xed, 0xa0, 0x9b, 0x80, 0x45, 0x10, 0x9e, 0xcb, 0xee,\n  0x93, 0x63, 0x32, 0x4e, 0x32, 0xa3, 0x96, 0x42, 0x29, 0x50, 0xc6, 0x96,\n  0x63, 0x85, 0x7c, 0xc2, 0x1a, 0x7a, 0x46, 0x4e, 0x0c, 0x98, 0x6d, 0x76,\n  0x1f, 0x41, 0xbf, 0x94, 0x02, 0x27, 0xbe, 0x24, 0x88, 0x49, 0x6a, 0xcc,\n  0x2e, 0x42, 0x87, 0x7f, 0x8b, 0x9f, 0x25, 0x72, 0xe5, 0xb1, 0xb4, 0xa5,\n  0x04, 0x22, 0xe8, 0x2c, 0x2a, 0xb2, 0x27, 0x5d, 0x85, 0xe4, 0x5c, 0x80,\n  0x2e, 0x1a, 0x27, 0xcb, 0x48, 0xb3, 0x11, 0xc8, 0x66, 0x02, 0x5b, 0x00,\n  0xe1, 0x6b, 0xec, 0x21, 0xb2, 0x0e, 0x2a, 0xea, 0x7c, 0x3f, 0xcc, 0x81,\n  0x15, 0x8d, 0x2e, 0xcb, 0x0d, 0x0c, 0xc7, 0x72, 0xe7, 0x72, 0x2d, 0x59,\n  0x98, 0x17, 0x65, 0x3e, 0xc4, 0x08, 0xf9, 0x00, 0x13, 0xb0, 0xd8, 0x4b,\n  0xc3, 0x74, 0xad, 0x90, 0x14, 0x10, 0x1f, 0xca, 0x77, 0x85, 0x13, 0x81,\n  0x3a, 0x49, 0x59, 0x0f, 0xe1, 0xde, 0x68, 0x21, 0xd2, 0xeb, 0xf6, 0x78,\n  0xba, 0xbc, 0xdb, 0x46, 0xc6, 0x32, 0x95, 0x9d, 0x7e, 0x6f, 0x73, 0xb4,\n  0xbb, 0x65, 0xaa, 0xb6, 0x76, 0xba, 0x19, 0x3f, 0x3b, 0x8e, 0x2c, 0xfa,\n  0x41, 0x9d, 0x79, 0xff, 0xc1, 0x83, 0xf3, 0x16, 0xc3, 0x88, 0xc1, 0x84,\n  0x17, 0x16, 0xb5, 0xad, 0x17, 0x67, 0x77, 0x9d, 0x6a, 0xd7, 0xee, 0x60,\n  0x64, 0xbc, 0x66, 0xec, 0xc4, 0x3f, 0x22, 0x3f, 0x07, 0xd2, 0xbd, 0xc0,\n  0xb2, 0x21, 0x7e, 0xdf, 0x81, 0x54, 0x1c, 0x9b, 0x21, 0xab, 0x48, 0x96,\n  0x8e, 0xbc, 0xc7, 0x12, 0x65, 0x85, 0x1a, 0x24, 0xa9, 0x39, 0x54, 0xe3,\n  0x3f, 0xac, 0x22, 0x3c, 0xc6, 0x57, 0xe4, 0xf5, 0x00, 0x9f, 0x21, 0x8c,\n  0x59, 0x4f, 0xf8, 0x4c, 0x09, 0x2a, 0xd1, 0xae, 0xe1, 0xcc, 0x76, 0x60,\n  0x30, 0x60, 0xf5, 0x0a, 0xd8, 0x03, 0x74, 0xcb, 0x41, 0xa4, 0x6e, 0x7d,\n  0x03, 0x1a, 0x4d, 0x4d, 0x07, 0xfd, 0xc5, 0x83, 0x65, 0x4d, 0xad, 0xdf,\n  0xfd, 0x6e, 0xb9, 0x07, 0x9d, 0x15, 0xb4, 0x15, 0x8d, 0x7b, 0xf6, 0x1c,\n  0xc7, 0x3f, 0x72, 0x11, 0x0e, 0xe8, 0x6a, 0xe9, 0xba, 0xa5, 0xeb, 0x60,\n  0x5b, 0x8b, 0x79, 0x7c, 0x48, 0x9f, 0xee, 0x3a, 0xd4, 0x75, 0x4f, 0x16,\n  0xd0, 0x6e, 0x5b, 0x98, 0xb3, 0x84, 0xce, 0x75, 0x91, 0xa9, 0x89, 0x33,\n  0x6d, 0xe9, 0x66, 0x63, 0x81, 0x9a, 0x1c, 0x53, 0xc6, 0x6f, 0x33, 0xc1,\n  0x00, 0x8b, 0x8b, 0x9c, 0x76, 0x48, 0x4e, 0xc8, 0x18, 0x88, 0x6c, 0x3c,\n  0xe4, 0x73, 0x60, 0x04, 0x1b, 0x8e, 0xbc, 0xc8, 0x7e, 0xca, 0x8e, 0x40,\n  0x1f, 0x66, 0x47, 0x23, 0xe5, 0x35, 0x31, 0x29, 0x42, 0x0a, 0x02, 0x92,\n  0x45, 0x63, 0x57, 0xca, 0xc9, 0x43, 0x54, 0x26, 0xc4, 0x29, 0x03, 0xd9,\n  0x82, 0x60, 0xe5, 0x48, 0x24, 0x65, 0x73, 0xac, 0x89, 0x43, 0x99, 0xb1,\n  0x9a, 0xbb, 0xe2, 0x5d, 0xce, 0x66, 0xbf, 0x3f, 0xe5, 0xea, 0xae, 0x4d,\n  0x9b, 0x6c, 0xa1, 0x8e, 0x9a, 0x6e, 0x67, 0xa3, 0x3f, 0x5d, 0xdb, 0x55,\n  0xdb, 0x69, 0xb6, 0x76, 0x07, 0x5b, 0x4a, 0xc3, 0xcd, 0xa1, 0x50, 0x73,\n  0xb8, 0xb4, 0x25, 0x88, 0x16, 0x8a, 0x9b, 0x9c, 0x3d, 0x35, 0x69, 0x0b,\n  0xa1, 0xba, 0x69, 0xd2, 0xaa, 0xc9, 0xdf, 0x11, 0xef, 0xaa, 0x49, 0x9b,\n  0x0b, 0x43, 0xe9, 0x9a, 0x2e, 0xf2, 0x57, 0x29, 0x34, 0x2c, 0x0d, 0xb7,\n  0x84, 0x42, 0x2d, 0x74, 0xfe, 0xc9, 0x72, 0xe3, 0x4a, 0x72, 0x8e, 0x1d,\n  0x4c, 0x22, 0x5d, 0xab, 0x45, 0x48, 0x03, 0x5e, 0x65, 0x7c, 0x90, 0x07,\n  0x79, 0x84, 0xc6, 0x10, 0xe8, 0x44, 0x23, 0x3f, 0x9d, 0xf1, 0x35, 0x19,\n  0x21, 0x7a, 0x88, 0xa4, 0x21, 0xe4, 0x16, 0xa6, 0x38, 0x17, 0x07, 0x4d,\n  0xbe, 0xd8, 0x04, 0xf2, 0x7d, 0x7e, 0xf6, 0xdb, 0x57, 0xde, 0x77, 0xdf,\n  0x7d, 0x93, 0xe4, 0xeb, 0xf2, 0x6f, 0xee, 0x46, 0x47, 0xd1, 0x6e, 0xe1,\n  0xe6, 0xf4, 0xb6, 0xf4, 0x35, 0xd7, 0x90, 0x6f, 0xe8, 0x0c, 0x99, 0x9c,\n  0x1c, 0x0d, 0xe2, 0x99, 0x56, 0x91, 0x0a, 0xd9, 0x65, 0xdd, 0xea, 0x88,\n  0x62, 0x56, 0xa3, 0x32, 0xa7, 0x55, 0xda, 0xac, 0x4b, 0x79, 0x57, 0xb3,\n  0x4f, 0xca, 0x96, 0x75, 0xa0, 0x4c, 0x76, 0x91, 0x3a, 0x01, 0x7d, 0x12,\n  0xae, 0xfb, 0xa3, 0x70, 0x1d, 0xac, 0xd7, 0xea, 0xff, 0xa2, 0x7f, 0xc6,\n  0x2b, 0x4c, 0x82, 0xe9, 0x64, 0x76, 0x10, 0x65, 0x9d, 0xdc, 0xba, 0xa3,\n  0x31, 0x52, 0x64, 0x60, 0xd5, 0x2c, 0x0a, 0x4b, 0xf6, 0x1b, 0x9f, 0xfc,\n  0x50, 0x49, 0x3d, 0x96, 0xf8, 0x0a, 0x15, 0x04, 0xe9, 0x43, 0x41, 0xef,\n  0xcf, 0xbb, 0x9a, 0x4d, 0x6b, 0xcb, 0x63, 0xa1, 0x40, 0x38, 0xc6, 0x49,\n  0xe1, 0xf0, 0xb2, 0x8e, 0x91, 0x3b, 0x1f, 0x4e, 0x1a, 0x63, 0x4b, 0xd7,\n  0x74, 0xa3, 0xa8, 0x46, 0xd6, 0xd5, 0x29, 0x06, 0x20, 0x46, 0xc8, 0x6a,\n  0x77, 0xd7, 0xfa, 0x4b, 0x63, 0x07, 0xe6, 0x1b, 0x47, 0xc3, 0xde, 0x60,\n  0x4f, 0x6d, 0x6b, 0xbc, 0x31, 0x33, 0x32, 0x59, 0xed, 0x0b, 0x45, 0x4f,\n  0x2e, 0xa5, 0xb6, 0x95, 0x94, 0xcc, 0xd5, 0x0c, 0x35, 0x5a, 0x53, 0xa9,\n  0xfa, 0xe1, 0xe8, 0x70, 0xc7, 0xb8, 0xc3, 0x59, 0xe6, 0xed, 0x69, 0x2f,\n  0xaa, 0x44, 0xb7, 0xd4, 0xb5, 0x99, 0x6c, 0xa9, 0x58, 0x6b, 0xaf, 0xd5,\n  0xd4, 0x6d, 0xb4, 0xfa, 0x8b, 0x8a, 0xa2, 0x45, 0x45, 0x03, 0xad, 0x89,\n  0x4e, 0x8b, 0x35, 0x19, 0xe9, 0xcd, 0x58, 0xcc, 0xc3, 0x26, 0x4f, 0x45,\n  0x91, 0xb5, 0xc8, 0x6f, 0xb3, 0x95, 0x37, 0x37, 0x84, 0x13, 0xc5, 0x1a,\n  0x63, 0x45, 0xd0, 0x1d, 0x0b, 0x5b, 0xf9, 0x6a, 0xa0, 0x4d, 0xf7, 0xe2,\n  0x33, 0xe8, 0x33, 0xf8, 0x79, 0x1a, 0xc7, 0x17, 0xa6, 0x94, 0x12, 0xbc,\n  0xda, 0xe4, 0xfd, 0xb3, 0x34, 0xdd, 0x68, 0x01, 0x8e, 0x1f, 0x5a, 0x43,\n  0x12, 0xf3, 0xf5, 0xfd, 0xfc, 0x78, 0xf1, 0x7b, 0x8b, 0xac, 0xd6, 0x22,\n  0xf8, 0x7a, 0xda, 0x2b, 0xfe, 0xe2, 0xc5, 0x0f, 0x79, 0x9c, 0x4e, 0x8f,\n  0x9b, 0xfc, 0x93, 0x7e, 0x8a, 0x31, 0x9d, 0xac, 0x89, 0xd0, 0x2c, 0x2b,\n  0x13, 0x61, 0x3a, 0x98, 0xfd, 0xf4, 0x89, 0x33, 0x10, 0xe8, 0xd5, 0x1a,\n  0xc7, 0xbc, 0xba, 0x0d, 0x71, 0x3c, 0x2d, 0xa4, 0xc2, 0xaa, 0x10, 0x4b,\n  0xe3, 0xb6, 0x78, 0x95, 0xfa, 0x10, 0xc3, 0xeb, 0x10, 0x87, 0x79, 0xee,\n  0x90, 0x96, 0xe6, 0x31, 0x65, 0xb5, 0x54, 0x2f, 0xd6, 0x00, 0x94, 0xd0,\n  0x44, 0x2c, 0x6a, 0xb7, 0x21, 0xa6, 0xb9, 0xb1, 0xbe, 0xae, 0xa6, 0x2a,\n  0xda, 0x11, 0xeb, 0x20, 0x72, 0x6a, 0xc4, 0x1e, 0xd1, 0x6b, 0x41, 0x24,\n  0xd7, 0x93, 0x83, 0x4f, 0x9d, 0x1a, 0x41, 0xa0, 0x4b, 0x10, 0xa9, 0x05,\n  0x01, 0x45, 0x46, 0x1c, 0xad, 0x83, 0x20, 0xb7, 0x6a, 0x2c, 0xc6, 0x73,\n  0x15, 0xe3, 0x54, 0x30, 0x17, 0xc3, 0xb3, 0x86, 0xa4, 0xa1, 0x8f, 0x8d,\n  0x9f, 0xdb, 0xd7, 0xd0, 0xb0, 0xef, 0xdc, 0x78, 0xe6, 0x86, 0xfd, 0x4d,\n  0xf0, 0x33, 0x7d, 0x62, 0xb2, 0xb6, 0x7a, 0xfb, 0x45, 0x3d, 0x33, 0xb7,\n  0x8d, 0x57, 0x6f, 0xbf, 0x78, 0xfb, 0xbe, 0xbd, 0xd5, 0x33, 0x9d, 0x9d,\n  0xcd, 0xbe, 0xba, 0x8a, 0x96, 0xce, 0x26, 0x72, 0x94, 0xdc, 0xae, 0x3a,\n  0x1d, 0x34, 0x93, 0xbb, 0xc1, 0xcf, 0x64, 0xf5, 0xce, 0x8b, 0x7b, 0x3b,\n  0x2f, 0x9e, 0x8c, 0x4f, 0xdc, 0x36, 0x0b, 0x3f, 0x66, 0xae, 0xd8, 0xdf,\n  0xb9, 0xbf, 0xa9, 0xb8, 0xcd, 0xb3, 0x63, 0x28, 0xb3, 0xdd, 0xa0, 0x4b,\n  0xeb, 0xe0, 0xb8, 0x11, 0x3a, 0x75, 0x35, 0xaa, 0xc7, 0x3f, 0x24, 0x9a,\n  0x6c, 0x29, 0xf3, 0x7a, 0xda, 0xe8, 0x44, 0x1c, 0xe3, 0xa0, 0x3e, 0x11,\n  0xa4, 0x86, 0x6d, 0x69, 0xa7, 0x66, 0x68, 0xd9, 0xd3, 0xf1, 0x6e, 0x25,\n  0x17, 0xe5, 0xb6, 0x9c, 0x57, 0xe4, 0x4e, 0xea, 0x33, 0xc8, 0x77, 0x9e,\n  0x1c, 0xca, 0xef, 0xb0, 0xb6, 0x59, 0x98, 0xb2, 0x06, 0xb9, 0x99, 0x1a,\n  0x8b, 0x45, 0xa3, 0x95, 0xe6, 0x1c, 0xb4, 0x89, 0x80, 0x29, 0x13, 0xfe,\n  0x24, 0x44, 0x8d, 0x70, 0x70, 0xa5, 0x31, 0x69, 0x9b, 0x95, 0x6f, 0xa7,\n  0x46, 0x13, 0xde, 0x74, 0x19, 0x83, 0xd4, 0x84, 0x2c, 0xe3, 0xb3, 0x9b,\n  0x35, 0xc6, 0xb4, 0x31, 0x1c, 0x17, 0x35, 0x9e, 0xc8, 0x82, 0x05, 0xc9,\n  0x8e, 0x98, 0x60, 0x49, 0x91, 0xc7, 0x56, 0x68, 0x32, 0xe8, 0x34, 0x2a,\n  0x8e, 0x71, 0x23, 0xb7, 0xc6, 0x24, 0xda, 0xc9, 0xec, 0x4a, 0xb6, 0x4c,\n  0xbe, 0x47, 0xc6, 0x99, 0xf3, 0xc8, 0x7c, 0xae, 0xb3, 0xab, 0xa6, 0xc0,\n  0xd6, 0x18, 0xa9, 0x69, 0xfc, 0x48, 0x63, 0xb9, 0xaf, 0xa8, 0xce, 0xe9,\n  0xf0, 0x74, 0x2e, 0xd5, 0xb6, 0x96, 0xfb, 0xdc, 0x89, 0x2a, 0xfc, 0xc3,\n  0x86, 0x96, 0x9f, 0x97, 0xdb, 0xbd, 0xf1, 0xba, 0x7d, 0x6a, 0xec, 0x08,\n  0x78, 0x4c, 0xfa, 0xb8, 0xc1, 0xfc, 0x38, 0xc6, 0x7e, 0xaf, 0xdb, 0x59,\n  0x13, 0x23, 0x73, 0x1c, 0x63, 0x1a, 0xd1, 0x8f, 0x11, 0x54, 0x7d, 0x33,\n  0x30, 0x9a, 0x27, 0x0a, 0x34, 0x44, 0x4f, 0xa9, 0xab, 0xb0, 0x8a, 0x19,\n  0x21, 0x29, 0xf1, 0x47, 0xec, 0xc1, 0x8e, 0x5b, 0x6f, 0xed, 0x78, 0xf0,\n  0x5f, 0x1f, 0x6e, 0xbf, 0xf5, 0xd6, 0xf6, 0x87, 0x91, 0xf1, 0xdb, 0xa5,\n  0x8f, 0x3c, 0x12, 0xfe, 0xb6, 0x41, 0xfc, 0x21, 0xc6, 0x65, 0x9e, 0xc5,\n  0x1a, 0x74, 0x3d, 0xd9, 0x9a, 0xe1, 0x74, 0x90, 0xc6, 0x29, 0x40, 0x16,\n  0x00, 0xc2, 0x53, 0x20, 0xd9, 0x82, 0x67, 0x91, 0xe6, 0x0e, 0xe6, 0xa2,\n  0x56, 0x10, 0x38, 0xbb, 0x93, 0x58, 0xd3, 0x2f, 0x5c, 0x84, 0xae, 0x17,\n  0xde, 0xfa, 0xa7, 0xfe, 0xd5, 0x55, 0x39, 0x77, 0x03, 0x43, 0xdd, 0x18,\n  0xc0, 0xd5, 0xcd, 0x3f, 0x13, 0xf5, 0x4c, 0x1b, 0x73, 0x88, 0x9e, 0x8a,\n  0xb9, 0x1a, 0xa4, 0xd6, 0xa0, 0x4c, 0x01, 0x8f, 0x55, 0x64, 0x76, 0x55,\n  0xf8, 0x2c, 0x1c, 0x0b, 0x0e, 0x8e, 0x05, 0xc7, 0x68, 0x35, 0x9c, 0xf6,\n  0x10, 0xa3, 0x61, 0xd4, 0x2a, 0x8d, 0x7a, 0x49, 0x2f, 0x9e, 0x0a, 0x3d,\n  0x3d, 0x15, 0x14, 0x06, 0x79, 0x22, 0x4a, 0x4f, 0x45, 0x5b, 0x4b, 0x2a,\n  0x19, 0xad, 0x8f, 0xd6, 0x27, 0xea, 0xe2, 0xb5, 0xe5, 0xb1, 0xfc, 0x93,\n  0x61, 0x78, 0x87, 0x27, 0x23, 0x6a, 0x91, 0x42, 0xf1, 0x9c, 0x44, 0x15,\n  0xb2, 0xcb, 0x69, 0x01, 0xa1, 0x0b, 0x9d, 0x8b, 0xde, 0xb3, 0xdb, 0x32,\n  0xb5, 0xc5, 0xa7, 0x26, 0x17, 0xdb, 0xeb, 0xa2, 0x95, 0xb1, 0xca, 0xf8,\n  0x05, 0xcf, 0xc4, 0x3c, 0x7a, 0x22, 0xdd, 0x59, 0x93, 0x2a, 0xf8, 0xda,\n  0xa3, 0x8f, 0xbe, 0x1a, 0xf3, 0x87, 0x4a, 0x44, 0xbf, 0xe5, 0x0a, 0x7e,\n  0x13, 0xfd, 0x95, 0x6d, 0x7e, 0x27, 0x7e, 0x4b, 0x90, 0xb1, 0xd1, 0x5f,\n  0x05, 0x35, 0xfa, 0x3b, 0x7e, 0xb3, 0x8b, 0xda, 0x33, 0xd0, 0xc7, 0xd1,\n  0x25, 0x34, 0x77, 0xce, 0xc9, 0x34, 0xd1, 0xde, 0xd5, 0xb4, 0x5e, 0x11,\n  0x99, 0x3f, 0x95, 0x38, 0x5f, 0x4a, 0x0c, 0x39, 0x99, 0x2f, 0x08, 0x6a,\n  0xb1, 0x5a, 0x0a, 0x9c, 0x06, 0x67, 0xce, 0x6e, 0x4b, 0x69, 0x9d, 0x2c,\n  0x8d, 0x91, 0x39, 0x88, 0xca, 0x06, 0x23, 0xb2, 0x15, 0x7f, 0x3c, 0x30,\n  0x35, 0x39, 0xd8, 0x3f, 0x3d, 0xdd, 0x57, 0x5b, 0x55, 0x53, 0x1d, 0xaf,\n  0xae, 0x46, 0x1f, 0xdf, 0xd9, 0xd3, 0x33, 0x39, 0xd9, 0xd3, 0xb3, 0xb3,\n  0xa5, 0xbe, 0xbc, 0xb2, 0xbe, 0xbe, 0xb2, 0xbc, 0x9e, 0xe2, 0x9c, 0x31,\n  0x58, 0x8b, 0x27, 0xa9, 0xdc, 0x17, 0x4f, 0x57, 0xe7, 0xe7, 0x0d, 0x31,\n  0xb0, 0xa2, 0x4b, 0xe4, 0x60, 0xf0, 0xf3, 0x1a, 0xc4, 0xf3, 0x87, 0x79,\n  0x08, 0x61, 0x36, 0x15, 0x98, 0x0a, 0xc5, 0x68, 0x32, 0xad, 0xc1, 0xb7,\n  0x36, 0x91, 0x08, 0x34, 0x08, 0x29, 0x99, 0x88, 0x68, 0x10, 0xff, 0x81,\n  0x6e, 0xa4, 0x09, 0x45, 0x2b, 0x0f, 0xf7, 0x43, 0xed, 0x4a, 0x17, 0xfa,\n  0x18, 0x4a, 0xb0, 0x3b, 0x09, 0xed, 0xa8, 0x4d, 0x57, 0x19, 0xc9, 0x23,\n  0x0c, 0x48, 0x4c, 0x4d, 0xa1, 0x19, 0x03, 0xa0, 0x10, 0x1f, 0xa2, 0xde,\n  0xef, 0x29, 0x49, 0x3f, 0x61, 0x99, 0x31, 0x07, 0x64, 0xa7, 0x14, 0x10,\n  0x1d, 0x77, 0xd3, 0xec, 0x14, 0x9e, 0x4f, 0xa0, 0x3a, 0xe1, 0x77, 0x27,\n  0xcb, 0xca, 0x4c, 0x44, 0xe6, 0x8c, 0x7b, 0x42, 0xbe, 0xde, 0x8a, 0xf4,\n  0x60, 0x4b, 0xe3, 0xc4, 0xd7, 0xd1, 0xc7, 0x1a, 0x4e, 0x44, 0xe3, 0x51,\n  0x47, 0x49, 0x89, 0xd3, 0x56, 0xed, 0x2e, 0xee, 0x48, 0xc5, 0x47, 0x93,\n  0x23, 0xb4, 0xa2, 0x06, 0x7a, 0x1f, 0xea, 0x24, 0x63, 0x88, 0x31, 0x23,\n  0xe9, 0xa1, 0x08, 0x11, 0x2a, 0xc3, 0x44, 0x54, 0x00, 0x51, 0xcd, 0x42,\n  0x18, 0x2b, 0x18, 0x0c, 0x55, 0x34, 0xcb, 0x02, 0x82, 0xf9, 0x60, 0x03,\n  0xb3, 0x98, 0x23, 0x1b, 0x19, 0x0e, 0x4e, 0x56, 0xf2, 0x06, 0x62, 0x34,\n  0x81, 0x98, 0x50, 0xc0, 0xe7, 0xf5, 0xd0, 0x54, 0x0b, 0x26, 0x86, 0x62,\n  0x7c, 0x81, 0x6c, 0x3d, 0x97, 0xf2, 0x54, 0xe4, 0x48, 0xf7, 0xcd, 0xb2,\n  0x54, 0x1e, 0xe8, 0x1f, 0xa8, 0x28, 0x8e, 0xd6, 0xec, 0xc8, 0x86, 0xd3,\n  0xc5, 0x7d, 0xed, 0xf5, 0xb5, 0xcd, 0xf5, 0x4d, 0x4d, 0x75, 0x35, 0x65,\n  0x3e, 0x7f, 0xd2, 0x5b, 0xea, 0xef, 0x65, 0x77, 0xb6, 0xd7, 0xc6, 0xea,\n  0x75, 0x2c, 0x9f, 0x28, 0x6b, 0x1e, 0x34, 0x98, 0x3a, 0x82, 0x65, 0xa1,\n  0xd2, 0x40, 0x2a, 0xea, 0x2f, 0xf1, 0xd9, 0x2d, 0xd5, 0x4e, 0x0f, 0xb3,\n  0xb9, 0xaf, 0x9b, 0xea, 0xee, 0x6f, 0xe7, 0xeb, 0xb6, 0x1b, 0x31, 0x1f,\n  0x4a, 0x12, 0x5d, 0xfa, 0x4f, 0x05, 0x75, 0x4d, 0xae, 0x66, 0x53, 0x28,\n  0xa8, 0xc7, 0x82, 0x0e, 0xfc, 0xdc, 0x05, 0xd6, 0xfa, 0x14, 0xd4, 0xb7,\n  0x04, 0x7b, 0xa1, 0x07, 0x03, 0xaa, 0xdc, 0x6c, 0x5a, 0xc7, 0x12, 0x9d,\n  0x48, 0x47, 0x33, 0x5e, 0x44, 0x42, 0xed, 0x22, 0x9b, 0x80, 0xda, 0x96,\n  0x80, 0xf0, 0x52, 0x03, 0x85, 0x62, 0x2c, 0x2c, 0x92, 0x3f, 0xa2, 0x17,\n  0xe5, 0x98, 0x47, 0xc5, 0x4e, 0x08, 0x12, 0xb9, 0x9b, 0x71, 0x07, 0x2d,\n  0xce, 0x52, 0x51, 0x22, 0x57, 0x6c, 0x15, 0x8a, 0x7d, 0x50, 0xb6, 0x58,\n  0x78, 0xfa, 0x8d, 0x2a, 0xf7, 0x78, 0x63, 0xb4, 0xd1, 0x46, 0xa4, 0xd2,\n  0xe9, 0xe9, 0x4b, 0xb3, 0x3d, 0x60, 0xb6, 0x18, 0x88, 0x95, 0xbb, 0x6d,\n  0x85, 0xad, 0x65, 0x1f, 0x62, 0x35, 0xc2, 0xa7, 0xae, 0x96, 0x4c, 0x17,\n  0xd4, 0x6f, 0x7b, 0x0d, 0x0e, 0x13, 0x19, 0xac, 0x90, 0x99, 0x78, 0x42,\n  0x0d, 0x11, 0xd4, 0x92, 0xed, 0xdd, 0x05, 0x4a, 0x12, 0x11, 0x7e, 0xce,\n  0x82, 0x58, 0x70, 0x3d, 0x19, 0x0b, 0x35, 0xf0, 0x1c, 0x01, 0xdd, 0xd0,\n  0xb7, 0xf6, 0x23, 0x8e, 0x7c, 0x36, 0x25, 0x05, 0xf7, 0x72, 0x68, 0x2c,\n  0xfb, 0xc5, 0x48, 0x48, 0x8a, 0x04, 0x55, 0x51, 0xe7, 0x5b, 0x7e, 0xa4,\n  0x66, 0x00, 0x87, 0x9b, 0x0f, 0x34, 0x9b, 0xa2, 0x96, 0xf6, 0xd9, 0x44,\n  0x6a, 0xb1, 0x13, 0x15, 0x5e, 0xcd, 0x76, 0xbc, 0xf5, 0x2f, 0xe8, 0x0e,\n  0x4e, 0x55, 0x7d, 0x64, 0xd7, 0x9e, 0xa3, 0xd5, 0x62, 0x25, 0xa3, 0x01,\n  0xe4, 0x63, 0x9e, 0x41, 0xf7, 0xb3, 0x10, 0xcf, 0xcc, 0xa0, 0x0a, 0x46,\n  0xfb, 0x39, 0x06, 0x7d, 0x09, 0x55, 0x3c, 0x96, 0xac, 0x10, 0xc7, 0x6c,\n  0x5c, 0x35, 0x33, 0xcf, 0x52, 0xfc, 0x9f, 0x3a, 0xba, 0x6e, 0xd1, 0x42,\n  0x13, 0x91, 0xe8, 0xb0, 0x4a, 0x8c, 0x84, 0x84, 0xd4, 0xdf, 0xf5, 0x49,\n  0xbf, 0x8e, 0xd2, 0x20, 0x44, 0xa6, 0xc0, 0x1a, 0x3a, 0x25, 0xe7, 0x99,\n  0x9c, 0xfd, 0x91, 0x4a, 0x10, 0x49, 0xed, 0xd9, 0xa1, 0xa1, 0x92, 0x42,\n  0x6d, 0xb1, 0xb1, 0x34, 0x92, 0x8c, 0x54, 0x34, 0x7b, 0x4a, 0x13, 0xb7,\n  0xd4, 0x26, 0x55, 0x29, 0xcc, 0x5a, 0xdd, 0x1e, 0x97, 0x6a, 0x32, 0xa9,\n  0x91, 0xaa, 0xbf, 0xa0, 0x8f, 0x31, 0xaf, 0x91, 0x33, 0x56, 0x00, 0x36,\n  0x09, 0xbd, 0x4e, 0x2d, 0xc7, 0x1f, 0x6e, 0xcc, 0xe9, 0x83, 0xb0, 0x22,\n  0xb6, 0xc0, 0x59, 0x61, 0xb5, 0xe4, 0x25, 0x9b, 0xbd, 0xd6, 0xcf, 0x22,\n  0x9d, 0xcb, 0xd0, 0x10, 0xba, 0x96, 0xcd, 0x08, 0x3b, 0x90, 0xcd, 0x53,\n  0x6e, 0xd7, 0xda, 0xb5, 0xd1, 0xf8, 0xac, 0x2c, 0x0f, 0x64, 0x89, 0x3c,\n  0x00, 0xf4, 0xab, 0x5d, 0xe4, 0xd7, 0x50, 0x4c, 0x83, 0xfc, 0xbf, 0x5f,\n  0xb6, 0x59, 0xbd, 0x1b, 0x04, 0x61, 0x97, 0x4c, 0xd5, 0xe8, 0x87, 0x59,\n  0xc9, 0xf2, 0x4d, 0x48, 0x5a, 0xf6, 0x49, 0x2a, 0xb4, 0x99, 0x64, 0xd3,\n  0xb7, 0xa4, 0x55, 0xe6, 0x19, 0xbe, 0x51, 0x76, 0x72, 0xa0, 0x7b, 0x7a,\n  0xc7, 0x60, 0xff, 0xce, 0xbf, 0x57, 0xc6, 0xe3, 0x95, 0xf0, 0x85, 0xcb,\n  0x26, 0xb2, 0x53, 0xdb, 0xb7, 0x4d, 0x4d, 0x6e, 0x6f, 0x6e, 0x69, 0x69,\n  0x6e, 0x69, 0x6a, 0xa2, 0xfa, 0x6b, 0x94, 0xf0, 0xcd, 0xe7, 0xd6, 0xf3,\n  0x4d, 0x24, 0xe6, 0x50, 0xf2, 0xe2, 0x0f, 0xf4, 0x9c, 0xc8, 0x31, 0xbf,\n  0xf9, 0x10, 0xfc, 0x78, 0x08, 0xa1, 0x6f, 0x87, 0x1f, 0x79, 0xa4, 0x94,\n  0x30, 0x4e, 0xfa, 0x83, 0x1c, 0x78, 0xc2, 0x2b, 0xf1, 0xaf, 0x68, 0x2c,\n  0x8d, 0x99, 0xf1, 0x12, 0x19, 0x67, 0x91, 0xae, 0x54, 0xd6, 0x50, 0xa0,\n  0x61, 0x55, 0x4c, 0x00, 0xb1, 0x2a, 0x1b, 0xe2, 0xd4, 0x90, 0xfd, 0xc2,\n  0x22, 0x15, 0x99, 0x3c, 0x42, 0x84, 0x59, 0x35, 0xc3, 0x2e, 0x69, 0x91,\n  0x9a, 0x07, 0x64, 0x3c, 0xee, 0x20, 0xd8, 0x97, 0xe7, 0x0b, 0x34, 0x3a,\n  0x80, 0x29, 0x1b, 0x23, 0xbc, 0x95, 0x63, 0x88, 0xaa, 0x67, 0xf1, 0x5a,\n  0xa4, 0xb4, 0x74, 0x6b, 0x21, 0x67, 0xe6, 0xcc, 0x26, 0x23, 0x0d, 0xcc,\n  0x31, 0x48, 0xe7, 0x13, 0x00, 0xf0, 0xd9, 0xbc, 0xec, 0x3e, 0x0b, 0x22,\n  0xe4, 0x94, 0x28, 0x07, 0x40, 0x59, 0xa3, 0xa0, 0xf5, 0xc1, 0x07, 0xef,\n  0x42, 0x5f, 0x18, 0x16, 0x32, 0x21, 0x79, 0x2d, 0x06, 0xd1, 0xe1, 0xaf,\n  0x7f, 0x63, 0xb0, 0xad, 0xed, 0x5b, 0x57, 0x61, 0xa4, 0x2a, 0xd1, 0xd3,\n  0x28, 0xab, 0xe2, 0xbc, 0xc5, 0x11, 0x76, 0x08, 0xbf, 0xde, 0x53, 0x8f,\n  0xbc, 0xc2, 0x1f, 0x5a, 0xf7, 0x7c, 0x68, 0xb7, 0xbd, 0xd1, 0xa5, 0x8f,\n  0x5b, 0xc8, 0x43, 0x1d, 0x50, 0xdb, 0x54, 0x7a, 0xbf, 0x72, 0x66, 0x2f,\n  0x7d, 0xbb, 0x29, 0xf1, 0xed, 0x20, 0x9a, 0xd9, 0x47, 0x28, 0x61, 0x21,\n  0x11, 0x97, 0x38, 0xf0, 0xbb, 0x73, 0xac, 0x8a, 0x5b, 0xc6, 0x90, 0xd8,\n  0x45, 0xdf, 0x91, 0x4a, 0x54, 0x53, 0x20, 0x51, 0xcd, 0xeb, 0x78, 0x0d,\n  0x4b, 0x64, 0x2a, 0xe9, 0xfd, 0x2c, 0xe5, 0x96, 0xf2, 0xb2, 0x58, 0xb0,\n  0xc4, 0xeb, 0xce, 0x7b, 0x37, 0xfd, 0x56, 0xef, 0x66, 0xdd, 0x82, 0x92,\n  0xdb, 0xf7, 0xd0, 0x17, 0xb4, 0x28, 0x2f, 0xf8, 0xf3, 0x4d, 0xe8, 0xfa,\n  0xa6, 0xaf, 0xb9, 0x09, 0xa9, 0x6f, 0x07, 0x79, 0xc5, 0xc4, 0x80, 0x29,\n  0xe1, 0x47, 0x14, 0x89, 0x38, 0xc5, 0xa4, 0x99, 0xbf, 0xc2, 0xdb, 0x0e,\n  0x3f, 0xe6, 0x05, 0xcf, 0xa2, 0x9b, 0xbc, 0x2c, 0x04, 0xf3, 0x04, 0x09,\n  0xd9, 0x6f, 0xe3, 0x30, 0xd2, 0x02, 0x6d, 0xa8, 0x45, 0x1a, 0x9d, 0x3a,\n  0xe3, 0xa5, 0x9f, 0xaa, 0xb7, 0xf8, 0x34, 0x2b, 0xde, 0x20, 0x05, 0x06,\n  0x09, 0x98, 0x20, 0x60, 0x59, 0x58, 0x0b, 0x59, 0x8c, 0x5a, 0xc4, 0x6b,\n  0xa7, 0x28, 0xaa, 0x17, 0xa1, 0x9d, 0x87, 0x0c, 0x48, 0xa7, 0x47, 0x1a,\n  0x5e, 0xa7, 0x39, 0x08, 0xc9, 0xea, 0xf3, 0xe6, 0x02, 0x13, 0xcb, 0x6b,\n  0xf9, 0x31, 0x6f, 0xba, 0x9d, 0x48, 0x43, 0x84, 0xe5, 0x70, 0x67, 0x99,\n  0xff, 0x57, 0x37, 0xc8, 0xa6, 0x2b, 0xaa, 0xaa, 0xca, 0xca, 0x10, 0xd3,\n  0xd4, 0x58, 0x95, 0xaa, 0x4a, 0x91, 0x33, 0x42, 0xc4, 0xa6, 0x9a, 0xea,\n  0xb2, 0xca, 0xb2, 0xca, 0x8a, 0x72, 0x9f, 0xd7, 0x61, 0x33, 0x1b, 0x0d,\n  0x7a, 0x22, 0x1d, 0x10, 0xbe, 0x64, 0xc9, 0x49, 0x07, 0x5b, 0xb2, 0xa3,\n  0x44, 0x3e, 0xdf, 0x62, 0x11, 0xa4, 0xb9, 0x6d, 0xdc, 0x7a, 0x77, 0x6d,\n  0xca, 0xab, 0xaa, 0x25, 0x4e, 0xd6, 0x49, 0xd7, 0x0d, 0xdd, 0x98, 0xbf,\n  0x1d, 0x91, 0x63, 0x23, 0xf3, 0xca, 0xe3, 0x6c, 0x10, 0x5b, 0xbb, 0xd2,\n  0xb0, 0x61, 0x7b, 0x12, 0x1a, 0xea, 0x5a, 0x4d, 0xa3, 0xfb, 0x71, 0x10,\n  0x99, 0x98, 0x20, 0x7a, 0x0c, 0xdb, 0xbe, 0xca, 0x00, 0x15, 0xc5, 0x5f,\n  0xc2, 0x36, 0xa0, 0xa2, 0x22, 0x3a, 0x18, 0x7e, 0x17, 0xfb, 0x18, 0x8e,\n  0x40, 0x45, 0x2e, 0xc4, 0x33, 0xdd, 0xcc, 0xdd, 0xcc, 0xe3, 0x8c, 0xe6,\n  0x73, 0x18, 0x3d, 0xf6, 0x38, 0x25, 0xb4, 0x9b, 0xb4, 0x39, 0xcd, 0x3c,\n  0x7f, 0xa1, 0x36, 0x68, 0x88, 0x39, 0xbe, 0x45, 0x9b, 0x3b, 0x95, 0x36,\n  0x13, 0xcc, 0xdc, 0x16, 0x6d, 0x6e, 0x55, 0x9e, 0xb5, 0xcc, 0x14, 0x89,\n  0x6d, 0xf0, 0xfa, 0x36, 0xc7, 0x94, 0xfb, 0x8c, 0x31, 0x0f, 0x12, 0xe9,\n  0x99, 0xb6, 0x69, 0x13, 0x99, 0x03, 0x86, 0x56, 0x6c, 0x92, 0x9c, 0x4b,\n  0x13, 0x91, 0xae, 0x1b, 0xd3, 0x49, 0x50, 0x29, 0x35, 0x2a, 0xf5, 0x12,\n  0xe0, 0xf5, 0xf1, 0x1a, 0x44, 0xe8, 0x0b, 0xc7, 0x51, 0xfb, 0xc1, 0xf2,\n  0x08, 0xc3, 0xf3, 0xcc, 0xbc, 0x14, 0xd3, 0x6f, 0x2d, 0x94, 0x2d, 0x1a,\n  0x66, 0x48, 0x0e, 0x0a, 0x90, 0xc5, 0xe3, 0x43, 0x48, 0x49, 0x8c, 0x08,\n  0x27, 0x2c, 0x21, 0x36, 0x29, 0xdc, 0xfa, 0xf7, 0xc3, 0xbb, 0xd1, 0x76,\n  0xf4, 0x1b, 0xe1, 0x77, 0x88, 0x17, 0xfe, 0x86, 0x3c, 0x2b, 0x4f, 0xfc,\n  0x47, 0xf3, 0x2f, 0x7e, 0x21, 0xe6, 0x49, 0xfc, 0x12, 0x8d, 0xd0, 0x31,\n  0xb6, 0x11, 0xfe, 0x9f, 0xc5, 0xcf, 0x92, 0x31, 0x46, 0x68, 0x65, 0xb3,\n  0xcb, 0xc9, 0xf6, 0x86, 0xeb, 0x34, 0x87, 0x82, 0xce, 0x53, 0x4c, 0x9a,\n  0xef, 0x73, 0xf4, 0xfd, 0x50, 0xde, 0x1c, 0xac, 0x6f, 0x73, 0x9a, 0xf9,\n  0xde, 0x85, 0xda, 0x90, 0xf9, 0xde, 0xbb, 0x45, 0x9b, 0x5b, 0x95, 0xfb,\n  0x2c, 0x93, 0xd9, 0xa0, 0x6d, 0xf2, 0xe6, 0x12, 0x6c, 0xdb, 0xe5, 0xf4,\n  0x3e, 0x95, 0xe2, 0x78, 0xc8, 0xb5, 0xf5, 0xf7, 0x81, 0xde, 0xa9, 0xbc,\n  0x36, 0xa7, 0x99, 0xbe, 0x0d, 0x6d, 0x88, 0x9c, 0x89, 0x76, 0xe6, 0xda,\n  0xa0, 0xa1, 0xd5, 0x9f, 0x6d, 0x68, 0xe3, 0x23, 0x9f, 0x34, 0xd0, 0xf1,\n  0x88, 0xf7, 0x59, 0x5e, 0xbd, 0x69, 0xed, 0x78, 0x08, 0xcf, 0x29, 0x96,\n  0x72, 0x63, 0xc0, 0xb7, 0xdb, 0x91, 0x6e, 0x55, 0x81, 0xed, 0x09, 0xf3,\n  0x2c, 0xa6, 0x2b, 0xc6, 0xcc, 0x6b, 0x44, 0x0b, 0x14, 0xcf, 0xcb, 0x29,\n  0x44, 0x26, 0x23, 0xe4, 0xe9, 0x80, 0x7b, 0xc9, 0xe8, 0x36, 0xb9, 0x69,\n  0x18, 0x36, 0x61, 0x57, 0xc8, 0xa0, 0x93, 0x63, 0x96, 0x68, 0xfe, 0x0c,\n  0xc4, 0x5b, 0x3a, 0x45, 0xd3, 0x54, 0xa2, 0xc4, 0x52, 0x1f, 0x41, 0x6d,\n  0x87, 0x3f, 0x32, 0xf5, 0x8d, 0xcf, 0xfd, 0xf3, 0xd0, 0xd0, 0xb7, 0x8e,\n  0x3d, 0xfe, 0xf8, 0x0c, 0x0a, 0xde, 0x0e, 0x19, 0x34, 0x27, 0x9f, 0xf8,\n  0x22, 0x6a, 0x1e, 0x45, 0x5d, 0x23, 0xaf, 0x8f, 0xfe, 0x01, 0x15, 0xbd,\n  0xe7, 0x06, 0x69, 0x0e, 0xf1, 0x7d, 0x74, 0xcf, 0xc6, 0xa5, 0x3d, 0xfb,\n  0xa1, 0x0d, 0xef, 0x45, 0x63, 0xf7, 0xe9, 0xbb, 0xd7, 0x49, 0x6b, 0xfa,\n  0xf3, 0x0d, 0xfb, 0x7a, 0x7d, 0x9b, 0xd3, 0x28, 0x74, 0xa1, 0x36, 0x64,\n  0x4d, 0xbf, 0xb4, 0x45, 0x9b, 0x3b, 0x95, 0x36, 0x13, 0xcc, 0x3f, 0x6c,\n  0xd1, 0xe6, 0x56, 0xe5, 0x59, 0xcb, 0x44, 0x76, 0x58, 0x73, 0x86, 0x88,\n  0xec, 0x90, 0x66, 0xae, 0x27, 0x3a, 0x53, 0x3b, 0x91, 0x33, 0xd4, 0x9f,\n  0xe7, 0x20, 0xd7, 0x11, 0xe5, 0x01, 0x24, 0xa0, 0x6f, 0xd5, 0x3d, 0xfc,\n  0x50, 0xdd, 0x23, 0xff, 0x50, 0xff, 0xd0, 0xc3, 0xf5, 0x0f, 0xe1, 0xf6,\n  0xc4, 0xc3, 0x0f, 0x27, 0x1e, 0x7a, 0x28, 0xf1, 0xf0, 0x43, 0xf5, 0x8f,\n  0xd0, 0xa8, 0xd6, 0xb6, 0xd5, 0x17, 0xf1, 0xbf, 0xe1, 0xff, 0x22, 0x12,\n  0x4a, 0x09, 0x53, 0xc6, 0xb4, 0xa6, 0x9b, 0xec, 0x56, 0x22, 0xcb, 0x97,\n  0x86, 0x8a, 0xbc, 0x0e, 0xad, 0x9a, 0xc5, 0x1a, 0x35, 0x06, 0x15, 0xc4,\n  0x86, 0xd0, 0x10, 0x0f, 0x80, 0x9a, 0x52, 0xd4, 0x9f, 0x98, 0x25, 0x2f,\n  0x79, 0x31, 0xa3, 0x95, 0xe5, 0x79, 0xa9, 0x0c, 0xa2, 0xa9, 0x53, 0x0e,\n  0xfa, 0x03, 0x3b, 0xa8, 0x0a, 0x3c, 0x19, 0x40, 0x53, 0x55, 0xf5, 0x51,\n  0x44, 0x65, 0x34, 0x9a, 0xd8, 0x70, 0x62, 0xb0, 0xb6, 0xad, 0xbe, 0xb2,\n  0x72, 0xe0, 0xee, 0x13, 0xf5, 0xd9, 0x70, 0x75, 0x5b, 0x62, 0x6e, 0xe5,\n  0xbb, 0x4e, 0x17, 0xea, 0xa8, 0x1f, 0xbd, 0xec, 0x24, 0x7a, 0x2e, 0x21,\n  0x7c, 0xd5, 0xd3, 0x5b, 0x7e, 0xf9, 0x09, 0x9a, 0xea, 0x50, 0xd3, 0x13,\n  0x1b, 0x8a, 0xdf, 0x3a, 0x75, 0xec, 0xfe, 0x59, 0x97, 0xbd, 0xab, 0xac,\n  0x7f, 0xdf, 0xe7, 0xda, 0x16, 0xc3, 0xe8, 0xeb, 0xa1, 0xf7, 0xdf, 0x78,\n  0xcd, 0xa0, 0xd0, 0x5c, 0x68, 0xfb, 0x20, 0xcc, 0x13, 0x8d, 0x3d, 0xa7,\n  0xf3, 0xdd, 0x28, 0xad, 0xdb, 0xd7, 0x37, 0xac, 0xed, 0xfa, 0x36, 0xa7,\n  0x91, 0xee, 0x42, 0x6d, 0xc8, 0xba, 0x7d, 0x74, 0x8b, 0x36, 0xb7, 0x2a,\n  0xf7, 0x59, 0x66, 0x32, 0x1b, 0xce, 0x22, 0x8d, 0xab, 0xa6, 0xf7, 0x69,\n  0x95, 0xce, 0xd9, 0x17, 0xd7, 0xde, 0x27, 0x2f, 0x5f, 0xc3, 0x40, 0x24,\n  0x0f, 0x22, 0x7d, 0x82, 0xc1, 0x85, 0xa3, 0xc1, 0xb0, 0x34, 0x76, 0x67,\n  0x49, 0x0c, 0x9b, 0xa6, 0x27, 0xa3, 0x34, 0x18, 0xb0, 0x58, 0x42, 0x52,\n  0xc2, 0x3f, 0x39, 0x04, 0xa0, 0x1b, 0xd8, 0x01, 0x57, 0x41, 0x66, 0x5c,\n  0xb8, 0xbc, 0xfe, 0xaa, 0xa3, 0x13, 0x33, 0x33, 0x7b, 0xee, 0x7c, 0x97,\n  0x70, 0xe7, 0xc0, 0xa1, 0x85, 0xa9, 0xbd, 0x59, 0xf4, 0xae, 0xd6, 0xa5,\n  0xf4, 0x07, 0xf1, 0xf9, 0x2b, 0x8f, 0xfd, 0xad, 0x7b, 0xac, 0xb7, 0x9b,\n  0xea, 0x31, 0x6f, 0xe0, 0x21, 0xbc, 0xc2, 0x34, 0x30, 0x37, 0x8b, 0xba,\n  0x8b, 0x8e, 0xac, 0x2b, 0xb6, 0x52, 0x11, 0xdb, 0x2b, 0xff, 0xc1, 0xe6,\n  0x3c, 0xe9, 0x0e, 0x32, 0x02, 0x1a, 0xcd, 0x76, 0x44, 0x74, 0x5a, 0xb3,\n  0x48, 0x8e, 0xa8, 0x04, 0x0b, 0xab, 0x27, 0xef, 0x53, 0x08, 0x94, 0xcc,\n  0xf3, 0x6b, 0x83, 0x48, 0x0b, 0xf1, 0xe9, 0x1c, 0x3e, 0xb4, 0xfe, 0xa3,\n  0x6c, 0x36, 0xad, 0x4f, 0x26, 0x6a, 0xaa, 0xcb, 0x63, 0xe1, 0x1a, 0x15,\n  0x45, 0x0d, 0x31, 0xb2, 0xd4, 0xbb, 0xbd, 0xd1, 0xb4, 0x4a, 0x93, 0x1d,\n  0xda, 0x59, 0x39, 0xc5, 0x9d, 0x8a, 0xdd, 0xb0, 0xa9, 0xb0, 0xae, 0xa8,\n  0xbc, 0xbc, 0xc8, 0x10, 0x09, 0x37, 0xb4, 0x2f, 0x6d, 0xaf, 0x19, 0xf0,\n  0x78, 0x32, 0xb1, 0x54, 0x6d, 0x59, 0xb2, 0xa3, 0xda, 0x5b, 0x56, 0xe6,\n  0xed, 0x6f, 0x0c, 0xb5, 0x85, 0xa7, 0x9b, 0x17, 0x3b, 0x16, 0xce, 0xe0,\n  0x43, 0xc1, 0x44, 0xb4, 0xc4, 0x5f, 0x68, 0x70, 0xf8, 0xdc, 0xa5, 0xc3,\n  0x2d, 0x3b, 0x47, 0x0b, 0xcd, 0x63, 0x66, 0x4f, 0x75, 0xac, 0xb4, 0x2e,\n  0x58, 0xd6, 0x12, 0xf3, 0x57, 0x06, 0x4a, 0x22, 0xde, 0xf2, 0x88, 0xb5,\n  0xba, 0x62, 0xe5, 0x4b, 0x78, 0xa0, 0x7b, 0x2c, 0x34, 0x04, 0xeb, 0x26,\n  0xc6, 0x35, 0x0b, 0x64, 0xdd, 0x7a, 0x68, 0x80, 0x76, 0xf7, 0x31, 0x51,\n  0x7f, 0x59, 0x7b, 0x1d, 0xd6, 0xf3, 0x89, 0x4d, 0xae, 0xab, 0xd1, 0xd0,\n  0x50, 0x7e, 0xfb, 0x17, 0x94, 0xeb, 0x13, 0x4d, 0xf9, 0xd7, 0x9f, 0x57,\n  0xee, 0xbf, 0xfc, 0xd7, 0xbc, 0xeb, 0x6c, 0x5c, 0xbe, 0x3f, 0xe1, 0x83,\n  0x37, 0xd0, 0xf3, 0x49, 0xae, 0xb3, 0x55, 0x38, 0x48, 0xa8, 0x2c, 0x54,\n  0xdc, 0x7b, 0x6f, 0xda, 0x56, 0x8a, 0xd4, 0x4c, 0x79, 0x08, 0xab, 0xd4,\n  0x85, 0x05, 0x58, 0x8c, 0x03, 0x85, 0xf4, 0xda, 0x18, 0x59, 0x90, 0xb0,\n  0x16, 0xa9, 0x74, 0x88, 0x06, 0x84, 0x1a, 0x34, 0x58, 0xad, 0x66, 0x16,\n  0xf8, 0x02, 0x1a, 0x04, 0x01, 0x56, 0x25, 0x76, 0x01, 0x62, 0xac, 0x2e,\n  0x02, 0x75, 0xa3, 0x9c, 0x88, 0x50, 0x2a, 0xdd, 0x14, 0x69, 0xcd, 0x5c,\n  0xa8, 0x71, 0x36, 0x1d, 0xaa, 0xae, 0x42, 0x4c, 0x6b, 0x73, 0x43, 0x7d,\n  0xbc, 0xb6, 0x2a, 0x51, 0x9d, 0x88, 0x45, 0x02, 0xfe, 0x22, 0x0f, 0x84,\n  0x62, 0xd3, 0x80, 0xd2, 0x4a, 0x54, 0x69, 0xdc, 0x34, 0xa0, 0x34, 0xba,\n  0x59, 0x54, 0x36, 0x10, 0x04, 0x31, 0xde, 0x25, 0x51, 0x1f, 0x51, 0xe5,\n  0x0c, 0x82, 0x78, 0x57, 0xe7, 0x5c, 0x42, 0x78, 0x08, 0x8f, 0x0d, 0xd5,\n  0x65, 0x22, 0xb1, 0x91, 0xba, 0xdb, 0xda, 0x83, 0xb3, 0x23, 0x83, 0x0b,\n  0x97, 0x5e, 0x39, 0xd3, 0x96, 0x88, 0x8d, 0x04, 0xbc, 0xa1, 0xc5, 0x78,\n  0xfb, 0x84, 0xdd, 0xb3, 0x23, 0xd9, 0xdc, 0xad, 0x7a, 0xb3, 0x49, 0xf8,\n  0xcd, 0xf0, 0xdc, 0x40, 0xa2, 0xbc, 0x63, 0x27, 0x0e, 0xb6, 0x1e, 0x19,\n  0x68, 0xd8, 0xb3, 0x8b, 0x86, 0xa2, 0x5e, 0x54, 0xdf, 0x26, 0x46, 0x70,\n  0x07, 0x3b, 0xeb, 0x5d, 0x96, 0x2e, 0x9b, 0xa7, 0xac, 0xaa, 0xac, 0x7a,\n  0x60, 0x6c, 0xa8, 0x77, 0xc7, 0xb3, 0x4a, 0x24, 0x37, 0xcc, 0x73, 0x6a,\n  0xd5, 0x0c, 0x31, 0xcd, 0x64, 0x9e, 0xfb, 0x44, 0x5e, 0xce, 0x3c, 0x2c,\n  0x5d, 0x87, 0x18, 0x5b, 0x58, 0xc7, 0x01, 0x71, 0xdd, 0x2f, 0x66, 0x36,\n  0xb9, 0x0e, 0xeb, 0xfe, 0xe5, 0xcd, 0xda, 0xa3, 0xa1, 0xd1, 0xfc, 0xf6,\n  0xcf, 0x2b, 0xf7, 0x59, 0xfe, 0x5f, 0x7a, 0x7d, 0x15, 0xfc, 0x7d, 0xdf,\n  0x84, 0xf6, 0x1a, 0xbf, 0x78, 0xff, 0x1f, 0x8b, 0xed, 0x7b, 0x01, 0xeb,\n  0x36, 0xef, 0xfa, 0x69, 0x9f, 0xd8, 0xfe, 0x79, 0x72, 0xbd, 0x32, 0x77,\n  0x1d, 0x0d, 0x3d, 0x2e, 0x5e, 0xff, 0x0b, 0xb9, 0x6e, 0x80, 0xfb, 0xd3,\n  0xeb, 0xc0, 0x77, 0xe7, 0xf3, 0xe2, 0xa8, 0x56, 0x08, 0x15, 0xaf, 0x04,\n  0x94, 0x05, 0x07, 0x18, 0x34, 0x33, 0x25, 0xe0, 0x48, 0x03, 0x64, 0x1d,\n  0x2d, 0xa1, 0x63, 0x88, 0xc2, 0x6c, 0xd1, 0x13, 0x29, 0x1f, 0xc6, 0x60,\n  0x80, 0xac, 0x67, 0x65, 0xb0, 0x32, 0x5c, 0x01, 0x47, 0x11, 0x5c, 0xed,\n  0x92, 0xdf, 0x2a, 0x2f, 0xce, 0xca, 0x49, 0xa8, 0xb9, 0x48, 0xd3, 0xa3,\n  0x56, 0x25, 0x16, 0xb5, 0x3e, 0xf2, 0x93, 0x92, 0x4e, 0xdf, 0xc9, 0xc8,\n  0xbe, 0x9e, 0xa9, 0x73, 0xa7, 0x06, 0x8e, 0x77, 0x5c, 0x7d, 0x24, 0x39,\n  0xe6, 0xe2, 0xcc, 0x5d, 0xe5, 0xd7, 0x46, 0x4e, 0xd8, 0xab, 0x9d, 0x57,\n  0xec, 0x18, 0xce, 0x6c, 0xdf, 0x9e, 0x19, 0xc5, 0x2b, 0xa6, 0x52, 0x7b,\n  0x77, 0x43, 0x53, 0xfa, 0xe9, 0xcb, 0x6f, 0x7f, 0x4f, 0xcb, 0xd1, 0xe1,\n  0x13, 0x67, 0x8b, 0x8a, 0x71, 0xd3, 0x9e, 0xc8, 0x70, 0x2a, 0x6d, 0xf4,\n  0x16, 0x08, 0xff, 0x9e, 0xdd, 0x3e, 0x38, 0xbf, 0x30, 0xdb, 0x9e, 0x25,\n  0xf3, 0x20, 0xc6, 0xa6, 0xc1, 0x79, 0x99, 0x10, 0xcf, 0xcb, 0xce, 0xdc,\n  0x7c, 0x46, 0xe9, 0x3c, 0x6f, 0xa3, 0xef, 0xdb, 0xcd, 0x5c, 0xbf, 0xe9,\n  0xf5, 0xd3, 0xcc, 0x77, 0x36, 0xb9, 0x4e, 0xe6, 0x6d, 0x4f, 0xfe, 0x7d,\n  0x5e, 0x50, 0xae, 0x4f, 0x8c, 0xe5, 0x5f, 0x7f, 0x5e, 0xbe, 0xce, 0x2c,\n  0x1b, 0xc4, 0x1c, 0xe8, 0x3a, 0xe6, 0x32, 0xac, 0xc5, 0xfd, 0xd4, 0xee,\n  0xe7, 0x65, 0x3a, 0x89, 0x66, 0x42, 0x74, 0x3a, 0x42, 0xd2, 0xc0, 0xc9,\n  0xcc, 0x13, 0x55, 0x17, 0xbc, 0x97, 0x2a, 0x8e, 0x53, 0x65, 0x01, 0x6e,\n  0x64, 0x41, 0x43, 0x34, 0x26, 0x6e, 0x42, 0xc4, 0xd9, 0x72, 0xda, 0xcd,\n  0x44, 0xa3, 0xcd, 0x8f, 0x20, 0xa5, 0xce, 0xcb, 0x3c, 0x2b, 0x24, 0xe0,\n  0x05, 0xf0, 0x79, 0x7f, 0x23, 0x9f, 0x33, 0x10, 0x70, 0x3a, 0x4b, 0x4a,\n  0x04, 0x01, 0xfd, 0xc7, 0xef, 0xa5, 0xdf, 0xd1, 0xf7, 0x7d, 0x25, 0x41,\n  0x8f, 0x27, 0x58, 0xe2, 0xbb, 0xb3, 0xbf, 0xff, 0x19, 0xf9, 0x77, 0x3a,\n  0xb6, 0xd4, 0xea, 0x0b, 0x64, 0xcc, 0x0d, 0x8c, 0x9d, 0x48, 0x58, 0x11,\n  0xe0, 0xd9, 0x85, 0x66, 0x42, 0x0a, 0x82, 0x01, 0x8f, 0xdb, 0xaa, 0x21,\n  0x3c, 0x9b, 0x57, 0x51, 0x9e, 0x6d, 0xa1, 0x2e, 0xf2, 0x1c, 0xcf, 0x3e,\n  0x99, 0xcf, 0xb3, 0x23, 0x95, 0x65, 0xb9, 0x90, 0x3a, 0x85, 0x65, 0x27,\n  0xea, 0xc4, 0x0d, 0x00, 0x1c, 0xdb, 0x2a, 0x71, 0x6c, 0x96, 0x32, 0xec,\n  0xe8, 0x8d, 0x27, 0x07, 0x1b, 0x63, 0xcd, 0x55, 0xfe, 0xc0, 0xb9, 0x93,\n  0x83, 0xcd, 0xd1, 0x96, 0x2a, 0x5f, 0x50, 0x38, 0xac, 0x37, 0xfc, 0xbc,\n  0xb4, 0x7e, 0xdb, 0x10, 0x6a, 0x76, 0xfe, 0x3c, 0x58, 0x3f, 0x91, 0x81,\n  0x70, 0xbb, 0x40, 0x63, 0xb4, 0xbd, 0x74, 0x7f, 0xfa, 0x86, 0x3b, 0x4a,\n  0x1b, 0x23, 0x1d, 0xa1, 0x7d, 0xed, 0x91, 0x4e, 0x37, 0xaa, 0x73, 0x1f,\n  0x99, 0x1f, 0x8a, 0x0b, 0xdf, 0x77, 0x1e, 0x27, 0xf3, 0x2d, 0xc6, 0xf9,\n  0xc0, 0xfa, 0x4c, 0x4b, 0xeb, 0xf9, 0x6e, 0xba, 0x0e, 0xeb, 0xaf, 0x9f,\n  0x66, 0xfe, 0x7d, 0x93, 0xeb, 0x64, 0x3d, 0x0f, 0x30, 0x79, 0xd7, 0x9f,\n  0x97, 0xaf, 0x33, 0xcb, 0x56, 0xf1, 0xba, 0x18, 0x63, 0x02, 0xed, 0x67,\n  0xa5, 0xfb, 0x7c, 0x30, 0x2f, 0xe6, 0xef, 0x4d, 0x22, 0x89, 0x46, 0x98,\n  0xdd, 0x4f, 0x5a, 0xd5, 0x52, 0xcc, 0x5f, 0x19, 0x75, 0xb5, 0xd0, 0xd4,\n  0x00, 0x29, 0x3c, 0x83, 0x46, 0xf4, 0x49, 0xa1, 0x6f, 0x72, 0xe4, 0x84,\n  0x1f, 0xb0, 0x2a, 0x6e, 0xd8, 0xba, 0x45, 0x36, 0xad, 0x0d, 0x97, 0x46,\n  0x2d, 0xae, 0xa0, 0xc4, 0xa1, 0xa9, 0x09, 0xaf, 0x18, 0x53, 0x13, 0x5e,\n  0x2e, 0x39, 0x83, 0x17, 0x09, 0xa1, 0x78, 0x84, 0x70, 0xed, 0x65, 0xfb,\n  0x3a, 0xc6, 0x5d, 0x6a, 0x42, 0xbf, 0xa7, 0xa7, 0x09, 0xa7, 0x74, 0x8d,\n  0xa6, 0xf7, 0x5d, 0xb6, 0xab, 0x6f, 0x68, 0x5b, 0x0f, 0xee, 0x9c, 0x1e,\n  0xea, 0x45, 0x86, 0x9b, 0x6f, 0xaf, 0x2e, 0xe1, 0x4b, 0x82, 0xfa, 0x5f,\n  0xb1, 0xaf, 0xfc, 0xca, 0x58, 0x65, 0x08, 0xd6, 0xde, 0x7a, 0xd3, 0xfe,\n  0xfd, 0xb3, 0xb3, 0xd6, 0x7d, 0x87, 0x0f, 0xe7, 0xde, 0xf3, 0x79, 0xe9,\n  0x3d, 0xc9, 0xfb, 0xff, 0x82, 0xc9, 0xd3, 0xa7, 0xa6, 0x14, 0x7d, 0x2a,\n  0xc3, 0x5c, 0xb3, 0x41, 0xa6, 0x14, 0x79, 0xd0, 0x03, 0x0a, 0x6f, 0xca,\n  0xcc, 0xe6, 0xf7, 0x7d, 0xaf, 0xd2, 0x77, 0x84, 0xb9, 0x7a, 0x8b, 0xbe,\n  0x2f, 0x29, 0x7d, 0x47, 0x66, 0xa4, 0xbe, 0xab, 0xa5, 0x80, 0x57, 0x20,\n  0xf6, 0x25, 0xfc, 0x6b, 0x1c, 0x7d, 0x4e, 0x6a, 0x5f, 0x8a, 0xfe, 0x86,\n  0x03, 0x0a, 0x5f, 0x1b, 0x47, 0x95, 0x8a, 0x5c, 0x9b, 0xa5, 0xf2, 0x51,\n  0x44, 0x92, 0xc5, 0x5c, 0x1b, 0xe4, 0x2c, 0x31, 0xff, 0x44, 0x50, 0x68,\n  0xf5, 0x69, 0x22, 0x43, 0x6f, 0xd2, 0x97, 0xd0, 0xb6, 0x47, 0x37, 0xed,\n  0xfb, 0x4d, 0xa5, 0x2f, 0xd9, 0x37, 0x23, 0x4c, 0x5e, 0xdf, 0xbb, 0x95,\n  0xbe, 0xa3, 0x92, 0xec, 0xbe, 0xf1, 0xb9, 0x2f, 0xca, 0xcf, 0x45, 0xa3,\n  0x44, 0x96, 0xdc, 0xec, 0xb9, 0xc3, 0xcc, 0x23, 0x9b, 0xf6, 0xfd, 0x46,\n  0xde, 0x73, 0x87, 0x87, 0x19, 0x59, 0x7f, 0xc3, 0x1f, 0xa6, 0x7d, 0xa3,\n  0x52, 0xdf, 0xf7, 0xad, 0x9d, 0x5b, 0x7a, 0xae, 0xdf, 0xc0, 0x8f, 0x91,\n  0x3d, 0xaa, 0xa7, 0xd5, 0xdc, 0xbf, 0x94, 0x2e, 0xa0, 0xb6, 0xeb, 0x62,\n  0x3b, 0x56, 0xf3, 0xb2, 0xb5, 0x99, 0x96, 0xda, 0x9e, 0xe7, 0x34, 0x98,\n  0x06, 0x2f, 0xf3, 0xbc, 0xb4, 0x21, 0x75, 0x08, 0xdc, 0x73, 0x2a, 0x2d,\n  0xa6, 0x29, 0x53, 0x52, 0xca, 0x4b, 0x6c, 0xf3, 0xb6, 0xe0, 0xf2, 0x97,\n  0x3a, 0x80, 0x13, 0x16, 0xda, 0xa7, 0xcb, 0x68, 0xfc, 0xcc, 0x54, 0xae,\n  0x11, 0xed, 0x25, 0x06, 0x64, 0xac, 0x6d, 0x4b, 0xe4, 0xb7, 0xe2, 0x50,\n  0xd0, 0x50, 0x00, 0xc0, 0x23, 0xc1, 0xea, 0x50, 0x35, 0x70, 0x18, 0xab,\n  0xa5, 0x20, 0x60, 0x08, 0x50, 0xab, 0x3a, 0x58, 0xb6, 0x90, 0x62, 0x51,\n  0x47, 0x17, 0x4e, 0x89, 0xc1, 0x8f, 0x71, 0xce, 0x62, 0x53, 0x2d, 0x6f,\n  0xd0, 0x63, 0xe1, 0xa9, 0xad, 0xb2, 0x63, 0xf0, 0x9b, 0xda, 0xc2, 0x86,\n  0x26, 0x47, 0x81, 0x35, 0x99, 0xb2, 0xbf, 0x25, 0x6c, 0x9d, 0x2a, 0x43,\n  0xe6, 0x59, 0xd2, 0x39, 0xb1, 0x9a, 0xb9, 0x4b, 0xe1, 0x8b, 0x73, 0x64,\n  0x4e, 0x7d, 0x4c, 0x39, 0xf3, 0x8f, 0x4f, 0x7a, 0xb4, 0x58, 0xa3, 0x95,\n  0x43, 0x0b, 0xa3, 0xa2, 0x42, 0x4a, 0x4e, 0xe0, 0x92, 0x28, 0xc5, 0x6a,\n  0xb5, 0x12, 0xa1, 0xd4, 0x23, 0x8d, 0x86, 0x08, 0x44, 0xba, 0x35, 0x19,\n  0x44, 0x15, 0x5b, 0x36, 0x27, 0xd3, 0x76, 0x58, 0xea, 0xa3, 0x93, 0x73,\n  0x89, 0xf2, 0x5b, 0xe7, 0x1a, 0x72, 0x1c, 0x3f, 0xbf, 0xb1, 0x35, 0x99,\n  0x53, 0xbf, 0xbf, 0x18, 0x12, 0x44, 0x8a, 0xcb, 0xfd, 0xe5, 0x12, 0x42,\n  0x67, 0xa1, 0x14, 0x3b, 0xec, 0x43, 0xbe, 0x82, 0x8d, 0xd9, 0x45, 0xd4,\n  0xa3, 0x44, 0xc3, 0x2c, 0xb7, 0xc8, 0x32, 0xda, 0xd7, 0x41, 0xe6, 0x11,\n  0x73, 0xcf, 0x3d, 0x37, 0x9d, 0xc9, 0x0c, 0xc0, 0x5c, 0xd6, 0xec, 0x80,\n  0xb9, 0xec, 0xeb, 0xd3, 0xdd, 0x72, 0xd3, 0xad, 0xef, 0x86, 0xe9, 0x33,\n  0xb7, 0x75, 0x65, 0xb3, 0x5d, 0x2b, 0x9f, 0x84, 0x29, 0x9c, 0xdd, 0x6d,\n  0xd9, 0x7f, 0xf0, 0xd8, 0x9e, 0x3d, 0x87, 0xf2, 0x6c, 0x0d, 0x53, 0x8a,\n  0x3d, 0x22, 0xc3, 0x9c, 0xda, 0x6c, 0x9f, 0x13, 0x39, 0xe7, 0x01, 0x45,\n  0xfe, 0xc9, 0xec, 0x61, 0xf2, 0xfa, 0xbe, 0x57, 0xe9, 0x3b, 0xc2, 0x5c,\n  0xbc, 0x45, 0xdf, 0x97, 0x94, 0xbe, 0x23, 0x73, 0xf9, 0x7d, 0xef, 0x56,\n  0xfa, 0x8e, 0x32, 0x3f, 0xd9, 0xa2, 0xef, 0x8b, 0xb2, 0x3c, 0x46, 0xda,\n  0x3c, 0x23, 0xf6, 0x25, 0x74, 0xe6, 0x35, 0xb2, 0xee, 0xb4, 0x2f, 0xa5,\n  0x33, 0xc5, 0xd2, 0xfa, 0x97, 0xd2, 0xdc, 0x29, 0x40, 0x21, 0xbd, 0x26,\n  0x6d, 0x0d, 0x23, 0x15, 0x17, 0x31, 0x61, 0xac, 0x52, 0x21, 0x80, 0x33,\n  0x41, 0x0c, 0x27, 0x6d, 0x86, 0x18, 0xa1, 0x2f, 0x9c, 0x8a, 0xe7, 0x96,\n  0x34, 0x64, 0xb7, 0xe7, 0x4e, 0x8a, 0x98, 0x85, 0x38, 0x22, 0xc7, 0x79,\n  0x51, 0x6e, 0x10, 0x96, 0x9b, 0x8a, 0x41, 0x8d, 0xfb, 0x37, 0xeb, 0x01,\n  0xfe, 0x1d, 0x4b, 0x45, 0x79, 0x75, 0x55, 0x79, 0x6d, 0x45, 0x6d, 0xd0,\n  0x16, 0x89, 0x84, 0x03, 0x5a, 0x08, 0xf7, 0xb3, 0xe5, 0x52, 0xae, 0xa8,\n  0xfd, 0x30, 0x3f, 0xf3, 0x3d, 0x27, 0x41, 0x1b, 0x31, 0x2b, 0xa5, 0x62,\n  0xdd, 0x50, 0x65, 0x71, 0x6a, 0x8c, 0x45, 0xb6, 0x64, 0x5d, 0x99, 0xdb,\n  0x1f, 0xa5, 0x99, 0x58, 0xfd, 0x79, 0xd9, 0x59, 0xb1, 0x4a, 0xf3, 0x5e,\n  0x29, 0x31, 0xeb, 0x54, 0x95, 0x0a, 0x35, 0x72, 0xaa, 0xba, 0xca, 0x60,\n  0x87, 0x93, 0x13, 0x13, 0xb3, 0x94, 0x4c, 0xad, 0x92, 0xda, 0x18, 0x6e,\n  0x12, 0xb3, 0xb4, 0x36, 0xb3, 0x37, 0x0d, 0x33, 0x7b, 0xb6, 0x98, 0xe7,\n  0x9c, 0x7c, 0x3b, 0x9c, 0xc9, 0xd1, 0xcf, 0xdb, 0x69, 0xdf, 0x72, 0x89,\n  0xf6, 0xfe, 0xeb, 0x26, 0x7d, 0x21, 0x0e, 0x1d, 0xfa, 0x0e, 0x89, 0xb4,\n  0x77, 0x26, 0xbf, 0xef, 0x7b, 0x95, 0xbe, 0x23, 0xcc, 0x8f, 0xb7, 0xe8,\n  0xfb, 0x92, 0xd2, 0x77, 0x64, 0x39, 0xbf, 0xef, 0xdd, 0x4a, 0xdf, 0x51,\n  0xd4, 0xba, 0x45, 0xdf, 0x17, 0xa5, 0xbe, 0xb0, 0x37, 0xfe, 0x8d, 0x11,\n  0xf1, 0x18, 0x42, 0x12, 0x3e, 0x49, 0x25, 0x73, 0x7d, 0xda, 0xb9, 0x1e,\n  0xa1, 0x24, 0x16, 0x24, 0x04, 0x56, 0x95, 0x11, 0x6d, 0xd7, 0xb1, 0xb7,\n  0x41, 0x2b, 0x19, 0x01, 0x37, 0xaf, 0x7a, 0x9e, 0x51, 0xab, 0x8f, 0xab,\n  0xe9, 0x3e, 0x90, 0x9a, 0x6a, 0xa0, 0xea, 0x1a, 0xaf, 0xde, 0xb7, 0x29,\n  0xc0, 0x49, 0x36, 0x6d, 0x0e, 0x04, 0x02, 0x95, 0x81, 0x4a, 0x87, 0x08,\n  0x75, 0x22, 0xba, 0x85, 0x2f, 0x00, 0x75, 0x92, 0x73, 0x4a, 0xbe, 0x1d,\n  0xe8, 0x49, 0x0b, 0xe7, 0x0e, 0x14, 0xd6, 0x6a, 0x2c, 0x46, 0xbc, 0x25,\n  0xfc, 0x89, 0xf0, 0x01, 0x6d, 0x61, 0xaa, 0xd1, 0x51, 0x60, 0x49, 0x36,\n  0xd9, 0x25, 0x1e, 0x43, 0xd7, 0x86, 0x10, 0xeb, 0x72, 0x26, 0xc5, 0x3c,\n  0x9f, 0xb6, 0x51, 0x1e, 0x13, 0x34, 0x61, 0x0d, 0xef, 0x46, 0x2a, 0xb5,\n  0x0b, 0x04, 0x59, 0xe9, 0x48, 0x54, 0x51, 0xfe, 0xa1, 0x45, 0xc0, 0x3e,\n  0xf4, 0xe4, 0xcd, 0xf1, 0x02, 0xab, 0xc3, 0x34, 0x82, 0x5d, 0xa3, 0x51,\n  0x2f, 0x90, 0x59, 0xb8, 0x68, 0x84, 0x0a, 0xbf, 0xe4, 0x65, 0x8f, 0xd3,\n  0x60, 0x13, 0x98, 0xbf, 0x78, 0x5e, 0x27, 0x1a, 0x73, 0x2f, 0xf6, 0xd4,\n  0xa1, 0xad, 0x3b, 0xa6, 0x6b, 0xb4, 0xe0, 0x6f, 0x23, 0xb2, 0xf5, 0xd2,\n  0x3b, 0xeb, 0x41, 0xe8, 0x65, 0x49, 0x65, 0x05, 0xf0, 0xa0, 0xba, 0xda,\n  0x8a, 0x54, 0x65, 0x2a, 0x52, 0x5a, 0xe4, 0x71, 0xda, 0x0b, 0x2d, 0x05,\n  0xe5, 0x86, 0x72, 0xca, 0x85, 0x0a, 0xd6, 0x70, 0x21, 0xfe, 0xff, 0x92,\n  0x61, 0x77, 0x98, 0x4c, 0x27, 0x3b, 0xa5, 0x72, 0x05, 0x0a, 0xa3, 0x17,\n  0xc8, 0xb5, 0x13, 0xc8, 0xa4, 0x36, 0x3a, 0x28, 0x63, 0xfa, 0xf9, 0x05,\n  0xd2, 0xee, 0x24, 0xfe, 0x7f, 0x1d, 0x3d, 0x37, 0x15, 0xd2, 0xb9, 0xb9,\n  0x7f, 0xfd, 0xfe, 0x5d, 0xfd, 0x19, 0xe8, 0x40, 0xec, 0x2f, 0x49, 0x9b,\n  0x61, 0xc9, 0xee, 0xfa, 0x79, 0xe6, 0x57, 0x62, 0x9b, 0x5f, 0xc9, 0x36,\n  0x23, 0xf8, 0xf6, 0x12, 0x3e, 0xcf, 0x58, 0x45, 0x5c, 0x0b, 0xc8, 0x28,\n  0xd2, 0xab, 0x31, 0x38, 0x45, 0x96, 0x18, 0x1d, 0x03, 0x2e, 0x91, 0x25,\n  0x8e, 0x82, 0x02, 0x14, 0x68, 0x31, 0x8d, 0x49, 0x60, 0x18, 0x60, 0x27,\n  0x10, 0x13, 0x9f, 0x83, 0x7c, 0x36, 0xf8, 0x2b, 0x68, 0xde, 0x3a, 0x61,\n  0x21, 0x01, 0x99, 0x8d, 0x58, 0x02, 0x16, 0x4b, 0x20, 0x19, 0x58, 0x58,\n  0x58, 0x00, 0xc0, 0x1b, 0xf2, 0x5d, 0xb8, 0x0b, 0x1d, 0x13, 0xee, 0xc2,\n  0xfa, 0x81, 0x33, 0xe4, 0xdf, 0xc0, 0xca, 0xeb, 0x80, 0x81, 0x83, 0x3e,\n  0x74, 0x9c, 0x90, 0x3c, 0xad, 0x94, 0x3f, 0x58, 0xcc, 0xdc, 0xf1, 0x84,\n  0x06, 0xb1, 0x8a, 0x20, 0x1d, 0xe0, 0x11, 0xf8, 0xc1, 0x20, 0x3a, 0x42,\n  0x4b, 0xf8, 0x1b, 0x95, 0xa9, 0x45, 0x50, 0x2f, 0x9a, 0x7d, 0x77, 0x98,\n  0x85, 0x4d, 0x12, 0x5f, 0xdb, 0x30, 0xd7, 0x04, 0xba, 0x50, 0xa0, 0x35,\n  0xda, 0x30, 0xed, 0xcf, 0x6b, 0x83, 0x19, 0x8e, 0xc5, 0x10, 0x3a, 0x96,\n  0xd7, 0x82, 0x6c, 0x02, 0x0b, 0x99, 0x8c, 0x62, 0xa6, 0xd8, 0x62, 0xb1,\n  0x06, 0xad, 0x51, 0x8b, 0x45, 0x67, 0x28, 0xae, 0xb0, 0xca, 0x91, 0xa1,\n  0x1b, 0x93, 0x10, 0xe1, 0x7d, 0x1f, 0x7d, 0xf6, 0x59, 0x16, 0xab, 0x3d,\n  0x33, 0xf5, 0x0b, 0x62, 0x2e, 0x62, 0x26, 0x83, 0xdf, 0x9c, 0xe9, 0x9a,\n  0xb2, 0x46, 0xcd, 0x65, 0xe5, 0x73, 0x4b, 0xc2, 0x17, 0x51, 0x37, 0xa4,\n  0x27, 0x09, 0x78, 0xb6, 0x6b, 0x86, 0xac, 0xc7, 0xff, 0xd0, 0xe0, 0xb9,\n  0x3b, 0x15, 0x3b, 0xf8, 0xc4, 0xea, 0xf9, 0x0d, 0x6b, 0x06, 0x01, 0x45,\n  0x8d, 0xa0, 0x57, 0x4a, 0x7a, 0xfa, 0xc4, 0xc7, 0x45, 0x7a, 0x45, 0x4e,\n  0x1b, 0x6a, 0xa7, 0x3c, 0x54, 0xec, 0x9b, 0x59, 0xfd, 0xc3, 0x86, 0xbe,\n  0xbf, 0x27, 0x9f, 0xd8, 0x81, 0x87, 0x4a, 0x7d, 0x33, 0xcf, 0x88, 0x7d,\n  0x01, 0x14, 0x68, 0x88, 0xd2, 0x49, 0xb1, 0xef, 0xc8, 0xea, 0xab, 0x1b,\n  0xfa, 0xfe, 0x17, 0xf9, 0x24, 0x00, 0x74, 0x52, 0xea, 0x3b, 0xf2, 0x35,\n  0xb1, 0x6f, 0x8c, 0xf0, 0xc1, 0x72, 0xca, 0x07, 0x2b, 0xe9, 0xf5, 0x71,\n  0x49, 0xb6, 0xf7, 0xae, 0x96, 0x32, 0x5f, 0xa5, 0xb4, 0x31, 0x23, 0x5e,\n  0xff, 0x33, 0xa3, 0xf8, 0x03, 0xca, 0x29, 0x5d, 0xad, 0x94, 0x78, 0xee,\n  0xc4, 0x46, 0x9f, 0xc1, 0x6a, 0x17, 0xd1, 0x85, 0xcf, 0x33, 0xe2, 0x3d,\n  0x79, 0xa6, 0x0a, 0x6d, 0xa7, 0xd7, 0x47, 0x89, 0x0e, 0xf2, 0x45, 0xfc,\n  0x22, 0x23, 0xde, 0x93, 0x67, 0x46, 0x20, 0x28, 0x87, 0x8c, 0xed, 0xf1,\n  0xd5, 0x2e, 0x54, 0x4f, 0xf7, 0x7a, 0x95, 0xb4, 0x8f, 0x9f, 0xda, 0x38,\n  0x6f, 0xa4, 0xaf, 0x68, 0xdf, 0x28, 0xc9, 0xd9, 0x37, 0xc0, 0x26, 0x4a,\n  0x68, 0xb5, 0x88, 0x53, 0xe4, 0x61, 0xb2, 0x69, 0xa3, 0x84, 0x54, 0xe4,\n  0x30, 0x63, 0x42, 0xab, 0x25, 0x12, 0xed, 0xca, 0x43, 0xbd, 0x18, 0x81,\n  0x50, 0x68, 0x1a, 0xc6, 0x40, 0x29, 0x89, 0x9d, 0x7a, 0x1e, 0x55, 0xdc,\n  0xbe, 0x35, 0xc0, 0x18, 0xe4, 0x3e, 0x26, 0x93, 0xc9, 0x63, 0x22, 0x44,\n  0xc2, 0x62, 0xa5, 0x38, 0xa4, 0xeb, 0x20, 0x8e, 0x72, 0xe4, 0x76, 0x2d,\n  0xd8, 0x51, 0x6f, 0x8e, 0xc0, 0xae, 0x85, 0x3d, 0x12, 0x6a, 0xd7, 0x90,\n  0x55, 0xaa, 0x5f, 0x86, 0xa4, 0x9c, 0x47, 0x3f, 0x73, 0x57, 0xda, 0x28,\n  0x65, 0x3d, 0x7a, 0xed, 0x79, 0xe3, 0x96, 0xb0, 0x02, 0x72, 0xf9, 0x8d,\n  0x23, 0x7c, 0xfe, 0xe0, 0xc5, 0x33, 0xe4, 0xe1, 0xa5, 0x37, 0x50, 0x6f,\n  0x92, 0x27, 0x59, 0x92, 0xff, 0xe1, 0xa6, 0xf9, 0x92, 0xd9, 0xb4, 0xcd,\n  0x66, 0x63, 0x18, 0x9b, 0xdf, 0xe6, 0xf7, 0xb8, 0xa5, 0xc4, 0x49, 0xcd,\n  0xe6, 0x89, 0x93, 0xb9, 0x97, 0x5e, 0x9f, 0x42, 0xf9, 0x86, 0xf2, 0xda,\n  0x9b, 0x25, 0x53, 0xbe, 0xf5, 0x9d, 0xb5, 0xef, 0x2e, 0xe7, 0x7b, 0xba,\n  0x98, 0x42, 0xc0, 0x57, 0x36, 0x10, 0xc5, 0x9a, 0x62, 0x93, 0x90, 0x23,\n  0x0b, 0xc7, 0x3a, 0x87, 0x9b, 0x52, 0xc8, 0x14, 0x5a, 0xac, 0x85, 0x14,\n  0xfc, 0x45, 0x1e, 0x83, 0xac, 0x1d, 0xa7, 0x52, 0x68, 0xe5, 0x3b, 0x3f,\n  0x3b, 0xf4, 0x58, 0xd7, 0xee, 0xdd, 0x1c, 0xc6, 0x5a, 0xbb, 0xf6, 0x2b,\n  0xd8, 0xf5, 0x07, 0xe1, 0xb9, 0xff, 0x69, 0x78, 0x1a, 0xbb, 0x6e, 0x89,\n  0x65, 0x6c, 0x06, 0xaf, 0xfe, 0x57, 0xe2, 0x7e, 0x1d, 0x07, 0xac, 0x29,\n  0xba, 0xb7, 0x6a, 0x24, 0xbb, 0x7a, 0x6c, 0xc3, 0x7e, 0xa5, 0x36, 0x35,\n  0x4a, 0x47, 0xc7, 0xa4, 0x36, 0xbe, 0x0d, 0x74, 0x94, 0xec, 0x33, 0x09,\n  0xb3, 0xca, 0xc2, 0xcc, 0x3d, 0x69, 0xe0, 0xb1, 0x48, 0xc6, 0xbc, 0x52,\n  0xb8, 0xbd, 0x04, 0x61, 0xa5, 0xa2, 0xc8, 0xe2, 0x6a, 0xd9, 0xc1, 0x48,\n  0xc3, 0x96, 0xdd, 0x80, 0xc2, 0xc7, 0x72, 0x34, 0xf8, 0x3f, 0xbf, 0x19,\n  0x88, 0x7c, 0x56, 0xb5, 0x9a, 0x6c, 0x66, 0x8b, 0xda, 0x52, 0xa0, 0x17,\n  0xc3, 0x07, 0x79, 0x05, 0xf4, 0x8a, 0x57, 0xa6, 0x1b, 0xe0, 0xaf, 0x6e,\n  0xcc, 0x4d, 0x31, 0x00, 0x61, 0xb5, 0xe5, 0x4d, 0x29, 0x66, 0x3a, 0x57,\n  0x43, 0xcc, 0xbf, 0xd0, 0x18, 0x6a, 0x13, 0xb3, 0xf4, 0xa4, 0x5e, 0x85,\n  0x31, 0x2b, 0x8f, 0xcd, 0xa1, 0x64, 0xad, 0x8e, 0x70, 0x32, 0x4a, 0xc4,\n  0x71, 0x45, 0xe3, 0xb3, 0xe6, 0xc1, 0x6a, 0xe6, 0x72, 0x5b, 0xf3, 0xaf,\n  0x2a, 0x39, 0xae, 0xd9, 0x34, 0xd9, 0xa0, 0x9c, 0x89, 0x33, 0x39, 0x20,\n  0xae, 0xc7, 0x4d, 0x93, 0x5d, 0x73, 0x3b, 0xe2, 0xd1, 0xe9, 0x69, 0x5b,\n  0xde, 0x26, 0x58, 0xb3, 0xe4, 0x58, 0xc1, 0xfb, 0xd2, 0x93, 0xb9, 0x6b,\n  0x48, 0x27, 0xa4, 0x08, 0x2b, 0x11, 0xba, 0x5a, 0x85, 0x25, 0xf0, 0x3b,\n  0x6e, 0x0f, 0x4c, 0xdb, 0x61, 0x6e, 0xb4, 0x80, 0xf0, 0xe9, 0x02, 0x4b,\n  0x01, 0xa8, 0x33, 0x06, 0xca, 0x9d, 0xf9, 0xb5, 0x3a, 0x22, 0x9d, 0x1d,\n  0xf4, 0xe7, 0x9c, 0x1a, 0xf8, 0x0d, 0x0a, 0x0f, 0x96, 0xd3, 0xf8, 0x00,\n  0x92, 0x05, 0xc0, 0xc2, 0xc4, 0x73, 0x46, 0x9e, 0x32, 0x41, 0x75, 0x64,\n  0x13, 0x33, 0xf8, 0xa4, 0xf4, 0x68, 0x29, 0xb5, 0x98, 0x8e, 0x80, 0xe5,\n  0x44, 0x7d, 0x37, 0x17, 0xef, 0x4d, 0x04, 0x8b, 0x29, 0x7a, 0x55, 0xc4,\n  0xd4, 0x90, 0x42, 0xaf, 0x20, 0xeb, 0x8f, 0x0e, 0x47, 0xb5, 0x66, 0x38,\n  0x2c, 0x80, 0xc8, 0x4c, 0x28, 0x83, 0x19, 0x81, 0xfc, 0xdf, 0xbc, 0xa1,\n  0x68, 0x68, 0xae, 0xba, 0x24, 0x43, 0xff, 0x99, 0xd2, 0xd9, 0x1a, 0xd9,\n  0x8e, 0x20, 0x3c, 0xcd, 0x68, 0xc9, 0x1e, 0xfb, 0x92, 0xf0, 0xb4, 0xe4,\n  0x8f, 0x87, 0xb1, 0x36, 0x93, 0x0e, 0xd2, 0x3e, 0x24, 0xb4, 0xf5, 0x11,\n  0xe1, 0x87, 0x52, 0x9b, 0x1f, 0xd2, 0x8d, 0x88, 0x18, 0x83, 0x34, 0x97,\n  0x06, 0xc8, 0x1b, 0x02, 0x20, 0x74, 0xc0, 0x4d, 0xd2, 0x88, 0x50, 0x31,\n  0x1b, 0x81, 0xd4, 0x0c, 0x8c, 0xc1, 0x6e, 0xa7, 0x29, 0x67, 0x49, 0x3e,\n  0x9a, 0x22, 0x33, 0x97, 0x72, 0xf2, 0xf6, 0x80, 0x7d, 0x21, 0x1e, 0xda,\n  0x31, 0x73, 0x73, 0xe9, 0xa3, 0xa8, 0xf1, 0xaf, 0x45, 0xad, 0x75, 0xe8,\n  0x1a, 0xe1, 0x0b, 0x13, 0x1d, 0x8b, 0x3f, 0x87, 0xa3, 0xb2, 0xfa, 0x57,\n  0xf2, 0x4d, 0x4f, 0xe7, 0xab, 0x23, 0x6d, 0x58, 0x73, 0x7f, 0x71, 0xd2,\n  0x0a, 0x68, 0x88, 0xbc, 0x42, 0x61, 0x0a, 0x14, 0x58, 0x79, 0x9a, 0xe9,\n  0xab, 0xcb, 0x0b, 0x96, 0x4b, 0x58, 0x94, 0x47, 0x5a, 0x46, 0x13, 0xa5,\n  0x53, 0xd3, 0xe9, 0xf0, 0x7e, 0xe4, 0x2b, 0x69, 0x69, 0x44, 0x37, 0x09,\n  0x9f, 0xab, 0x6c, 0xe9, 0x11, 0x1e, 0xce, 0xf9, 0x58, 0x1f, 0x93, 0x7d,\n  0xac, 0x9b, 0xda, 0x75, 0x44, 0x5b, 0xaf, 0x20, 0xd9, 0x7a, 0x25, 0x5b,\n  0x9f, 0x44, 0xfb, 0x45, 0x5c, 0xb6, 0x62, 0x66, 0x32, 0xad, 0x07, 0x64,\n  0x36, 0x8f, 0xed, 0xff, 0x23, 0xe1, 0xb7, 0x5a, 0xad, 0xc5, 0xd6, 0x62,\n  0x07, 0x40, 0xba, 0x89, 0x84, 0x7f, 0x3d, 0xa4, 0x1b, 0x9b, 0xa3, 0xfd,\n  0xeb, 0xc1, 0xdd, 0x7e, 0x96, 0x3b, 0x02, 0xeb, 0x61, 0xde, 0xde, 0xfa,\n  0xdb, 0x1a, 0x22, 0x28, 0xd2, 0x7f, 0x31, 0xb7, 0xda, 0xcf, 0x7c, 0x28,\n  0xad, 0x87, 0x68, 0x49, 0x42, 0xfc, 0x55, 0x6a, 0xd9, 0x70, 0x53, 0x2c,\n  0xe6, 0x58, 0xf3, 0xb9, 0x1c, 0xeb, 0x11, 0xd0, 0x1b, 0xa9, 0x89, 0xe5,\n  0xb8, 0x4a, 0x96, 0x9e, 0x83, 0xb9, 0x9c, 0x6b, 0x1e, 0x6d, 0xd1, 0x32,\n  0xed, 0x27, 0x7f, 0x32, 0x2a, 0xb5, 0x6a, 0xdf, 0xa6, 0x8d, 0x29, 0x13,\n  0x70, 0xdb, 0x6c, 0x48, 0x62, 0x02, 0xf9, 0x99, 0xda, 0xda, 0x2d, 0x32,\n  0xb5, 0xf3, 0xd4, 0x8d, 0x35, 0x39, 0xdb, 0x13, 0xb9, 0x09, 0xd8, 0x90,\n  0xbd, 0xbd, 0xf2, 0xf1, 0xdc, 0x0c, 0x6c, 0x5c, 0xf7, 0x4d, 0x6d, 0x63,\n  0x6b, 0xd7, 0x9d, 0xe8, 0x94, 0x8b, 0x92, 0xcd, 0x56, 0xc2, 0x6a, 0x23,\n  0xd7, 0xfb, 0xc8, 0x75, 0xac, 0x7e, 0x5d, 0xe4, 0x2b, 0x0b, 0x44, 0xee,\n  0xb8, 0x8f, 0xe2, 0x71, 0x11, 0x49, 0xd7, 0x81, 0x80, 0x44, 0x8b, 0xd8,\n  0x88, 0x6c, 0x06, 0xd0, 0x68, 0x86, 0x19, 0xa4, 0xa2, 0x00, 0x89, 0x1c,\n  0x85, 0x72, 0x14, 0xcf, 0x36, 0x20, 0x9e, 0x80, 0xf5, 0x44, 0xa3, 0x86,\n  0x62, 0x0e, 0x6a, 0xd1, 0x72, 0xa2, 0x40, 0x25, 0x22, 0xb0, 0xca, 0x8a,\n  0x8b, 0x1f, 0x11, 0x33, 0x42, 0xd5, 0xe8, 0x67, 0xee, 0xb0, 0xd1, 0x1c,\n  0x71, 0x78, 0x6a, 0xfc, 0xc2, 0x51, 0x0e, 0xb3, 0x2c, 0x5d, 0x7e, 0x96,\n  0xdb, 0x21, 0xc1, 0x28, 0x5a, 0xe3, 0x15, 0x78, 0xc2, 0xda, 0x37, 0x1e,\n  0x16, 0xae, 0x22, 0xcb, 0xff, 0x4c, 0xc9, 0x45, 0x29, 0x74, 0x6a, 0xa5,\n  0x75, 0x71, 0x8f, 0x12, 0x17, 0x0a, 0xe8, 0xbb, 0x47, 0xd3, 0x46, 0x3b,\n  0x78, 0xe2, 0x10, 0xf0, 0x65, 0x18, 0x9f, 0xb8, 0xe8, 0x45, 0xd4, 0x45,\n  0x0a, 0x88, 0x19, 0x47, 0xf3, 0x7c, 0xa4, 0x10, 0x43, 0x7b, 0x1c, 0x08,\n  0x73, 0x89, 0xbc, 0x80, 0x14, 0xe1, 0xfd, 0xe4, 0xc6, 0x26, 0x84, 0xa1,\n  0x20, 0xc6, 0xe3, 0x02, 0x63, 0x90, 0xb1, 0x40, 0x7c, 0x23, 0x7e, 0xcd,\n  0x1b, 0x25, 0xd7, 0x03, 0x04, 0x90, 0xb5, 0x25, 0xaf, 0xf4, 0x6e, 0x57,\n  0xd0, 0x60, 0x2c, 0x2a, 0xf4, 0x45, 0xce, 0x64, 0x7b, 0xa7, 0xfb, 0x8d,\n  0x2a, 0x0a, 0xbe, 0xd1, 0xf7, 0x9a, 0x04, 0xd5, 0x80, 0x1e, 0x39, 0xbb,\n  0x6f, 0x4e, 0xf8, 0x4f, 0xba, 0x8a, 0xbb, 0x97, 0x84, 0x6d, 0xc3, 0x3b,\n  0x95, 0x38, 0x83, 0x29, 0x25, 0x16, 0x21, 0xc3, 0x9c, 0xdf, 0x60, 0xfb,\n  0x15, 0x7d, 0x25, 0x0f, 0x28, 0x3e, 0x94, 0xcc, 0xc5, 0x4c, 0x5e, 0x8c,\n  0xc2, 0x7b, 0x95, 0xbe, 0x23, 0xcc, 0xb7, 0xb6, 0xe8, 0xfb, 0x92, 0xd2,\n  0x77, 0xe4, 0x04, 0xb3, 0x69, 0x9c, 0xc4, 0x36, 0xe6, 0x37, 0x1b, 0x62,\n  0x84, 0xd6, 0xf9, 0x7a, 0x48, 0x9b, 0x5b, 0x24, 0xbd, 0xfe, 0x0d, 0x76,\n  0x11, 0x3f, 0x47, 0x34, 0xa1, 0x20, 0xf3, 0xbd, 0xb4, 0x2e, 0x40, 0x56,\n  0xa0, 0x04, 0x10, 0x6a, 0xa5, 0x5c, 0x8b, 0x90, 0x0c, 0x97, 0xaa, 0xd7,\n  0x60, 0x38, 0x24, 0x08, 0xec, 0x79, 0x27, 0x88, 0x9e, 0xa1, 0x52, 0xa9,\n  0xc9, 0x89, 0x51, 0xab, 0x0f, 0xab, 0xe5, 0x6c, 0x8b, 0xa4, 0xd2, 0x54,\n  0xb1, 0xcb, 0x51, 0xb4, 0xc6, 0x1c, 0xca, 0xaa, 0xd4, 0x03, 0xac, 0x7e,\n  0xb9, 0xce, 0xe9, 0xc4, 0x85, 0xfb, 0x81, 0xb9, 0x60, 0x6d, 0x51, 0x96,\n  0x6c, 0xda, 0x0f, 0xc8, 0x3c, 0x7e, 0x9f, 0x2b, 0xe8, 0x0e, 0x02, 0xfe,\n  0x43, 0xae, 0x00, 0x06, 0x20, 0xf4, 0x14, 0xd0, 0x43, 0xea, 0x54, 0x02,\n  0x95, 0xec, 0x81, 0x35, 0x08, 0x3d, 0x54, 0x57, 0x4d, 0x59, 0x22, 0xe8,\n  0xda, 0xba, 0x6a, 0x74, 0xad, 0xf0, 0x22, 0x2a, 0x10, 0xfe, 0x82, 0xfc,\n  0xc2, 0xf5, 0x8e, 0xb8, 0xe7, 0xf8, 0xdd, 0x03, 0xfd, 0x77, 0x5e, 0x72,\n  0xc5, 0xa9, 0x53, 0x97, 0x37, 0x95, 0x97, 0xe1, 0xe7, 0xf4, 0x10, 0xc3,\n  0x34, 0xc6, 0xa9, 0x67, 0x3f, 0x75, 0xfc, 0xf8, 0xfd, 0xbb, 0xc6, 0xde,\n  0x7f, 0xe3, 0x8d, 0x1f, 0xb4, 0xe0, 0x80, 0x59, 0xf4, 0x6f, 0x35, 0x90,\n  0xb9, 0x7b, 0x17, 0x0e, 0x30, 0x01, 0x22, 0x3f, 0xd5, 0x13, 0x49, 0x7b,\n  0xd2, 0x8f, 0x78, 0x75, 0xa1, 0x9e, 0x0c, 0xbd, 0x00, 0xa0, 0xae, 0x33,\n  0x84, 0x2c, 0x23, 0xcc, 0xa3, 0xa5, 0x02, 0x8d, 0x9e, 0x05, 0xef, 0xb0,\n  0x4a, 0x47, 0x29, 0x97, 0x36, 0xdf, 0x3b, 0x5c, 0x5e, 0x16, 0x0a, 0x22,\n  0xa6, 0xb6, 0xba, 0xac, 0xbe, 0xbc, 0x3e, 0x12, 0x0e, 0xc6, 0x42, 0x31,\n  0x31, 0xc6, 0x4e, 0xc6, 0xb3, 0x30, 0x48, 0xe4, 0x66, 0x2d, 0xd4, 0x50,\n  0x54, 0x9d, 0xef, 0x5d, 0x94, 0x50, 0x87, 0xea, 0x23, 0xaa, 0x3c, 0xe7,\n  0x22, 0x7e, 0x60, 0xff, 0x29, 0xe1, 0x43, 0x78, 0xfb, 0x48, 0x72, 0x24,\n  0x16, 0x1b, 0x4d, 0xf6, 0x1c, 0x2c, 0xf1, 0x1f, 0xe8, 0xea, 0x3b, 0xda,\n  0x71, 0xdd, 0xc5, 0x1d, 0x8b, 0xc5, 0xbe, 0xf9, 0xd6, 0xd6, 0x3e, 0x42,\n  0xee, 0x5b, 0x85, 0xae, 0xb1, 0xbe, 0x81, 0xb1, 0xd1, 0x81, 0x41, 0x1c,\n  0xb8, 0xee, 0x58, 0x72, 0xcf, 0x0c, 0xf5, 0x03, 0x37, 0xa6, 0x52, 0x8d,\n  0x9d, 0x57, 0x65, 0xaf, 0xbf, 0xa3, 0xb1, 0x21, 0xd9, 0x34, 0x30, 0x3a,\n  0xd4, 0xbb, 0x1d, 0x1d, 0xd8, 0xbf, 0xff, 0xd0, 0x81, 0xc5, 0x83, 0x4b,\n  0x8a, 0x1d, 0x7e, 0x9e, 0xee, 0xb7, 0xa4, 0x24, 0x1b, 0xfe, 0x68, 0xc3,\n  0x5e, 0x15, 0x31, 0x07, 0x60, 0xbf, 0xed, 0x94, 0xf8, 0xd3, 0xad, 0x22,\n  0x2e, 0x32, 0xa1, 0xf1, 0x32, 0xa6, 0x64, 0x88, 0xb9, 0x2e, 0xad, 0x07,\n  0x54, 0x49, 0xbf, 0x5b, 0x32, 0xcf, 0x03, 0xfd, 0x8e, 0xc8, 0x08, 0x93,\n  0xf9, 0x11, 0x4e, 0x22, 0x0d, 0xd7, 0xad, 0xb1, 0x1d, 0x85, 0xe4, 0x86,\n  0x3a, 0xc9, 0x76, 0xb4, 0xa1, 0x03, 0xb0, 0x5f, 0xbf, 0xcb, 0x05, 0xb8,\n  0x94, 0xae, 0x90, 0x2b, 0x54, 0xec, 0x5b, 0x8f, 0x4e, 0xa9, 0x7f, 0x1b,\n  0x74, 0xca, 0x3c, 0x82, 0xbe, 0x01, 0xa7, 0xd2, 0x94, 0x27, 0x7a, 0x6e,\n  0x8a, 0x58, 0xb9, 0xd2, 0xbf, 0x8e, 0xb7, 0xb5, 0x13, 0x59, 0xf9, 0x76,\n  0x89, 0xb7, 0x3d, 0x21, 0x1e, 0x18, 0xb3, 0x82, 0xc2, 0x40, 0x55, 0x1c,\n  0x36, 0xe3, 0x85, 0x4b, 0xec, 0x9a, 0x4b, 0x59, 0x19, 0x7a, 0x82, 0xc6,\n  0x8e, 0xa8, 0x15, 0x3c, 0x86, 0xf5, 0x6a, 0x8f, 0x97, 0xe6, 0x45, 0x29,\n  0xf8, 0x0c, 0x0a, 0x8c, 0xd5, 0xba, 0x86, 0x90, 0x86, 0x2f, 0xf2, 0xf8,\n  0xcd, 0xda, 0x52, 0xcf, 0x84, 0x73, 0x2d, 0xdb, 0x13, 0x41, 0x1d, 0x34,\n  0x5b, 0x80, 0x3a, 0xe4, 0x18, 0xff, 0x46, 0x78, 0x87, 0x6c, 0x1e, 0xe3,\n  0x5b, 0x07, 0xf4, 0xb0, 0x09, 0xdf, 0xcb, 0xdb, 0x4f, 0x84, 0x29, 0x1d,\n  0xd8, 0xb0, 0x9f, 0xfa, 0xc9, 0x27, 0xef, 0x57, 0xf6, 0x13, 0xe1, 0x7b,\n  0x7e, 0x91, 0xf6, 0x51, 0x5c, 0x50, 0xda, 0xb7, 0x41, 0xda, 0x8b, 0x5f,\n  0xde, 0xc0, 0x33, 0x45, 0x4c, 0x09, 0xe8, 0x3b, 0x99, 0xdb, 0x8b, 0x1b,\n  0xfb, 0xa2, 0x21, 0xa2, 0x62, 0xbd, 0x7d, 0x5f, 0xa2, 0x63, 0x07, 0xe4,\n  0xe7, 0x9a, 0x01, 0x8f, 0x54, 0xec, 0x4b, 0x63, 0x20, 0xee, 0x52, 0xae,\n  0x3f, 0x4e, 0x63, 0x23, 0x26, 0xa5, 0xeb, 0xd7, 0x6c, 0xfa, 0xac, 0x61,\n  0x39, 0xde, 0xe9, 0x6d, 0x9e, 0x45, 0xdf, 0x91, 0xec, 0x1d, 0x1d, 0x39,\n  0x33, 0x22, 0x9e, 0xa8, 0x95, 0xc9, 0x3e, 0x69, 0x92, 0x71, 0xdb, 0xa8,\n  0x9e, 0xb5, 0x0e, 0x5e, 0x74, 0x9d, 0x48, 0xe7, 0xce, 0x89, 0x74, 0xeb,\n  0x50, 0x48, 0x89, 0x58, 0xa7, 0xd1, 0x68, 0xac, 0x1a, 0xab, 0xc3, 0x22,\n  0xd5, 0x15, 0x91, 0xf1, 0x48, 0xf3, 0xf6, 0xbd, 0x88, 0x4c, 0x6a, 0xcd,\n  0x2d, 0xe4, 0x15, 0x63, 0x63, 0x2b, 0x03, 0x6b, 0xf4, 0x18, 0x33, 0xd9,\n  0xd7, 0x22, 0x06, 0x46, 0x29, 0x73, 0x73, 0xda, 0x9a, 0x8f, 0x82, 0x51,\n  0xe2, 0x21, 0xa7, 0x9a, 0x93, 0x06, 0x1a, 0x5d, 0x8f, 0x88, 0xa1, 0x51,\n  0x10, 0x31, 0x08, 0x41, 0xcc, 0x3f, 0xd6, 0xa5, 0xb4, 0xa5, 0x56, 0x3a,\n  0xd3, 0x9b, 0xf6, 0x80, 0x73, 0xed, 0x75, 0xbb, 0x11, 0xe3, 0x2e, 0x75,\n  0x97, 0xfa, 0x8b, 0xd7, 0xc2, 0x69, 0xe8, 0xde, 0x0e, 0x4e, 0xc3, 0x99,\n  0x7b, 0xb9, 0x0d, 0xc0, 0x1a, 0x09, 0xe5, 0x3d, 0x37, 0x83, 0xd8, 0xb8,\n  0x22, 0xef, 0xb5, 0xc9, 0x5a, 0x51, 0x8c, 0x57, 0xba, 0x9e, 0x29, 0x69,\n  0x3d, 0x7b, 0x37, 0xc4, 0xa6, 0x01, 0x3e, 0xc8, 0x8f, 0xa9, 0xde, 0x50,\n  0xca, 0xdc, 0x95, 0x76, 0x20, 0x5a, 0x58, 0x9c, 0x51, 0x79, 0x10, 0xa7,\n  0x36, 0x91, 0x79, 0x02, 0x1b, 0xba, 0x4a, 0x52, 0x21, 0xca, 0xa1, 0x5a,\n  0x1b, 0x59, 0x2b, 0x5a, 0xa1, 0x80, 0x90, 0x30, 0x50, 0xbf, 0x00, 0x3f,\n  0x86, 0x4e, 0xcb, 0x51, 0x89, 0x65, 0x30, 0x52, 0xf0, 0x51, 0x4c, 0x6e,\n  0x0c, 0x55, 0x51, 0xc8, 0x3e, 0x61, 0x96, 0xb6, 0x68, 0x9a, 0x4d, 0x7b,\n  0xc0, 0xc2, 0x1b, 0x28, 0x81, 0xd2, 0x75, 0x50, 0xba, 0xa5, 0xa0, 0xd4,\n  0x50, 0x4a, 0x95, 0x11, 0xdd, 0x5a, 0x85, 0x6d, 0x4b, 0xf4, 0x91, 0x1f,\n  0x2b, 0x5a, 0xdc, 0x99, 0xf5, 0xd3, 0xb5, 0x46, 0xa7, 0xeb, 0xdb, 0x1c,\n  0x94, 0x24, 0x87, 0x85, 0x6b, 0x82, 0xaa, 0x10, 0x2a, 0x48, 0x94, 0x24,\n  0xc2, 0x07, 0x43, 0xed, 0xab, 0x52, 0xbc, 0xb1, 0x94, 0xf7, 0x25, 0x82,\n  0x81, 0x48, 0xd6, 0x55, 0x30, 0xf0, 0x8b, 0xd6, 0x55, 0xba, 0x25, 0xe9,\n  0x68, 0x5e, 0xb9, 0xf7, 0xde, 0x5f, 0x62, 0xe7, 0x0b, 0xf7, 0xdc, 0x83,\n  0x7a, 0x87, 0x5e, 0x1d, 0x1f, 0x7f, 0x75, 0x48, 0xf8, 0xc7, 0x3c, 0x0c,\n  0x96, 0x12, 0x66, 0x5b, 0x7a, 0xac, 0x10, 0x72, 0x27, 0x72, 0x18, 0x2c,\n  0x44, 0xbe, 0xbf, 0x41, 0x83, 0x58, 0xc8, 0x96, 0x65, 0x71, 0xfe, 0x1c,\n  0xe9, 0xd6, 0xa0, 0xb1, 0x80, 0xfb, 0x55, 0x74, 0x18, 0x52, 0xfd, 0xba,\n  0x40, 0xcc, 0x96, 0xd7, 0xaf, 0xdb, 0x46, 0x52, 0x06, 0xb7, 0x34, 0x37,\n  0xa2, 0x89, 0x34, 0x1f, 0x9d, 0xa5, 0xa7, 0x47, 0x9c, 0x97, 0xbb, 0xee,\n  0xca, 0x21, 0xb4, 0x5c, 0xd9, 0x75, 0x39, 0x9d, 0x8d, 0xcb, 0xbb, 0x2e,\n  0xa7, 0xd3, 0xa1, 0xc4, 0x3d, 0xde, 0xa9, 0xc4, 0x46, 0x4e, 0x30, 0xb7,\n  0x6f, 0xa0, 0x03, 0x62, 0x5c, 0xc6, 0x0b, 0x4a, 0xbc, 0x86, 0x1c, 0xc7,\n  0x23, 0xf6, 0x9d, 0x52, 0xfa, 0x66, 0x98, 0xcf, 0x6d, 0xd1, 0xf7, 0x01,\n  0xa5, 0x6f, 0xe6, 0xd2, 0xfc, 0xbe, 0xef, 0x55, 0xfa, 0x8e, 0x30, 0x9f,\n  0xdd, 0xa2, 0xef, 0x4b, 0x4a, 0xdf, 0x91, 0xd3, 0xf9, 0x7d, 0x7f, 0xa3,\n  0xf4, 0x1d, 0x93, 0xe2, 0xdd, 0xf3, 0x63, 0x35, 0x69, 0x5f, 0x1a, 0x7b,\n  0x37, 0x2d, 0xc5, 0xde, 0x7d, 0x7c, 0xd3, 0x58, 0xd0, 0x6d, 0x92, 0x4c,\n  0xbc, 0xbe, 0x6f, 0x49, 0x2e, 0x6e, 0x85, 0xb4, 0xb9, 0x93, 0xee, 0x9d,\n  0x99, 0xd5, 0x52, 0x8a, 0x85, 0x1c, 0x61, 0x66, 0xd2, 0x46, 0x33, 0x39,\n  0x31, 0x10, 0x3d, 0xc4, 0xd3, 0xb5, 0x15, 0xd9, 0xa2, 0x57, 0x04, 0xa0,\n  0x97, 0xed, 0xdf, 0xeb, 0x7c, 0x8c, 0x2e, 0xc9, 0xb7, 0xb8, 0xae, 0x11,\n  0xcd, 0x55, 0xb7, 0x86, 0xac, 0x44, 0xda, 0xa2, 0xe8, 0x21, 0xf9, 0x35,\n  0x0c, 0x64, 0x7f, 0x62, 0x1e, 0xa2, 0x32, 0xe8, 0x37, 0xbc, 0x5a, 0x8d,\n  0x7e, 0xe8, 0xb2, 0xcb, 0x6e, 0xc4, 0x12, 0x7b, 0xb4, 0x5a, 0xc2, 0x58,\n  0xce, 0x56, 0x56, 0x56, 0x96, 0x1f, 0xf6, 0xb9, 0xa9, 0xdf, 0xb0, 0x3e,\n  0xe1, 0x6f, 0x73, 0x69, 0xf3, 0xf1, 0x96, 0x85, 0xba, 0x8e, 0xe5, 0xd2,\n  0xba, 0x5e, 0xfa, 0x8e, 0xa5, 0xd8, 0x87, 0x5d, 0xca, 0x3b, 0x8e, 0xa3,\n  0x71, 0xfa, 0xee, 0x14, 0x2f, 0x99, 0xce, 0x4f, 0xb3, 0xc8, 0x83, 0xc8,\n  0x66, 0x5d, 0xbf, 0x2e, 0x22, 0xce, 0x0d, 0xcc, 0xcf, 0x0c, 0xed, 0x3b,\n  0xc4, 0x3c, 0xb5, 0x59, 0x7c, 0x2c, 0xb9, 0xbe, 0x91, 0xa7, 0xac, 0x8d,\n  0xe5, 0x21, 0xfc, 0xab, 0x96, 0xc9, 0xeb, 0x7b, 0xab, 0x12, 0x5b, 0xbb,\n  0xbc, 0xfa, 0xb7, 0x0d, 0xeb, 0x42, 0xf1, 0x88, 0xe9, 0xfd, 0xdb, 0x24,\n  0xde, 0xfa, 0x95, 0x0d, 0xf7, 0x17, 0xb1, 0x60, 0xe0, 0xfe, 0xbb, 0x25,\n  0xde, 0x7a, 0x63, 0x5e, 0xdf, 0xbb, 0xe5, 0xbe, 0x68, 0x94, 0xf9, 0xf6,\n  0x16, 0x7d, 0x5f, 0x94, 0xfb, 0x92, 0x36, 0x77, 0x6d, 0xf6, 0x5c, 0x42,\n  0x5b, 0x27, 0x2e, 0xf0, 0x5c, 0xc2, 0x2b, 0x3d, 0x39, 0xac, 0xab, 0x65,\n  0xbc, 0x42, 0x68, 0x49, 0x7f, 0x5a, 0x57, 0x40, 0xf6, 0x8b, 0x81, 0xec,\n  0x17, 0x2c, 0x01, 0x1a, 0x58, 0x20, 0xfa, 0x96, 0xee, 0x82, 0x23, 0x0a,\n  0x60, 0xa6, 0x89, 0x11, 0x4b, 0x05, 0x30, 0x87, 0x64, 0x98, 0x4c, 0x03,\n  0xa1, 0x5a, 0x90, 0x8f, 0x6d, 0x42, 0x26, 0x4e, 0xaa, 0x73, 0x41, 0xe3,\n  0x66, 0x25, 0x27, 0x23, 0x52, 0x95, 0xd5, 0x4c, 0x2f, 0x8c, 0xfb, 0xeb,\n  0x00, 0x21, 0x13, 0x7f, 0xa1, 0xbe, 0x63, 0xe5, 0x9f, 0x71, 0xe7, 0xd2,\n  0x4e, 0xbd, 0xa6, 0x57, 0xa5, 0x13, 0xf3, 0x75, 0xff, 0xbc, 0xfa, 0x27,\n  0xf4, 0x6d, 0x32, 0x86, 0x32, 0xe6, 0xd2, 0xb4, 0xd5, 0x8b, 0x38, 0xb6,\n  0xc8, 0x86, 0x55, 0x9c, 0x95, 0x08, 0xba, 0xe0, 0x8c, 0xe1, 0xa4, 0xc1,\n  0x04, 0x72, 0x38, 0x9e, 0x6a, 0x42, 0x0d, 0x73, 0x58, 0x9d, 0xa2, 0x29,\n  0x82, 0x46, 0x40, 0xf8, 0x65, 0x34, 0xcf, 0x2d, 0x5a, 0xd0, 0x24, 0xf2,\n  0x48, 0xb8, 0x34, 0x54, 0x52, 0xec, 0x76, 0x82, 0x82, 0xcb, 0x94, 0xa1,\n  0x32, 0x10, 0xd6, 0x9c, 0xe2, 0x5e, 0x76, 0x2a, 0xf1, 0xa1, 0x9b, 0x81,\n  0x7d, 0x02, 0x89, 0x57, 0x5f, 0x9b, 0x1e, 0xc3, 0xec, 0x30, 0x42, 0x01,\n  0x47, 0x91, 0x7f, 0x2d, 0xf2, 0xe7, 0x8d, 0xdd, 0xa6, 0xbe, 0x16, 0x9d,\n  0x43, 0x6f, 0xe6, 0xf4, 0x6a, 0xbf, 0x3f, 0x12, 0x47, 0xdd, 0x6b, 0x50,\n  0x40, 0x7b, 0x84, 0xaf, 0x66, 0xa6, 0x68, 0xde, 0x36, 0xec, 0xa5, 0xb3,\n  0xec, 0x57, 0x08, 0xad, 0x2f, 0x22, 0x9a, 0x50, 0x9c, 0xd9, 0x95, 0x9e,\n  0x86, 0xac, 0xbf, 0x6a, 0x67, 0x01, 0xab, 0x51, 0x63, 0x11, 0xaf, 0x19,\n  0x0a, 0x3b, 0xa1, 0x1b, 0xf4, 0x48, 0xcd, 0x13, 0x35, 0x4d, 0x73, 0x96,\n  0x70, 0x47, 0x5e, 0x8d, 0x79, 0xc8, 0xdd, 0xe6, 0x58, 0x0d, 0x77, 0x50,\n  0x07, 0x59, 0x9e, 0x87, 0xd9, 0xd1, 0x62, 0x9f, 0x5e, 0xcf, 0x30, 0xe5,\n  0x65, 0xa5, 0x41, 0x5f, 0xac, 0x38, 0xa6, 0x2f, 0xd2, 0x53, 0xda, 0x5c,\n  0x68, 0x26, 0xf7, 0xd6, 0xd9, 0xa8, 0x4b, 0x32, 0x09, 0x05, 0x25, 0x81,\n  0x73, 0x21, 0x94, 0x8b, 0xfe, 0xe3, 0x51, 0x28, 0x1a, 0xe0, 0xad, 0x79,\n  0x99, 0xc9, 0x6c, 0x22, 0x4a, 0x91, 0x24, 0x78, 0x64, 0xb2, 0xd7, 0x9a,\n  0x97, 0x75, 0xd5, 0x0d, 0x0e, 0xe1, 0x49, 0x84, 0xe3, 0x6d, 0xb5, 0x35,\n  0x9d, 0x1e, 0x07, 0xc2, 0xbb, 0xb7, 0x09, 0x3f, 0x1d, 0xfd, 0xb5, 0xdb,\n  0x4f, 0xd4, 0xc8, 0x12, 0xdf, 0xcc, 0x7f, 0xef, 0xe0, 0xed, 0x1a, 0x8d,\n  0x8d, 0x67, 0xdb, 0xb4, 0xae, 0x9e, 0x22, 0x8d, 0xb1, 0xba, 0xda, 0xf4,\n  0xd6, 0xd7, 0xf1, 0x1e, 0x6f, 0x47, 0x5d, 0x63, 0xaa, 0xce, 0x5f, 0x6d,\n  0x58, 0xf9, 0xe8, 0x57, 0xbf, 0x8a, 0xaf, 0x05, 0xbc, 0x46, 0x9f, 0xd7,\n  0x53, 0x2c, 0xdc, 0xfe, 0x83, 0xc2, 0x46, 0xaf, 0xb7, 0xc5, 0x42, 0x14,\n  0x10, 0x31, 0xe6, 0x18, 0xde, 0xdd, 0x41, 0x34, 0xe8, 0x76, 0x66, 0x90,\n  0xf9, 0xd7, 0xb4, 0xb1, 0x15, 0xe9, 0xd4, 0x2d, 0x48, 0xab, 0x2b, 0x43,\n  0x05, 0x7a, 0x99, 0x56, 0xb5, 0x1a, 0xa4, 0xec, 0x59, 0xcc, 0xdc, 0x40,\n  0xa4, 0x24, 0x13, 0x38, 0xce, 0x39, 0x80, 0x76, 0x60, 0xd5, 0x2a, 0x76,\n  0x99, 0xd1, 0x32, 0xfa, 0x02, 0xad, 0x7e, 0x89, 0xd1, 0xe9, 0xd4, 0x0b,\n  0x66, 0xa2, 0x1a, 0x13, 0x89, 0xbc, 0xa0, 0x80, 0x5f, 0x90, 0x98, 0xa3,\n  0x37, 0x9d, 0xfe, 0x3f, 0x77, 0x87, 0x10, 0x19, 0x72, 0x0f, 0xcd, 0x02,\n  0xa3, 0xd1, 0x5c, 0xa4, 0x21, 0x5b, 0xa5, 0xb2, 0x34, 0xe4, 0x72, 0x16,\n  0x90, 0xe9, 0xed, 0xef, 0xed, 0xec, 0x68, 0x4a, 0xd5, 0xd7, 0x55, 0x57,\n  0xc6, 0xa2, 0xa1, 0xf6, 0xd2, 0xf6, 0xe2, 0x22, 0x67, 0xd0, 0x15, 0x2c,\n  0x34, 0xeb, 0x1d, 0x05, 0x0e, 0x98, 0x68, 0xbb, 0x25, 0x27, 0x1d, 0x90,\n  0xd9, 0xe6, 0x37, 0x29, 0x5c, 0x0a, 0x13, 0xcd, 0xbf, 0x43, 0xf0, 0xe8,\n  0xaf, 0xe8, 0x1a, 0xd3, 0xce, 0x0e, 0xb2, 0x0a, 0xc5, 0x35, 0xe9, 0x8e,\n  0xda, 0x78, 0x6b, 0x6b, 0x9c, 0x4c, 0xb9, 0xd7, 0xed, 0x2f, 0xb1, 0xbf,\n  0x2d, 0xaa, 0x34, 0xfb, 0x15, 0xb5, 0x3e, 0x5c, 0x5a, 0xa0, 0xb1, 0x26,\n  0x1d, 0xb7, 0xa5, 0xe2, 0x89, 0xc6, 0xc6, 0xba, 0xba, 0x54, 0xbc, 0xd8,\n  0xe3, 0x29, 0x86, 0xaf, 0x17, 0x2e, 0x84, 0x38, 0x0d, 0xfe, 0x31, 0x9a,\n  0xf3, 0x44, 0xe9, 0xc8, 0x4d, 0x92, 0x1d, 0xf5, 0xe6, 0xcd, 0x62, 0xf1,\n  0xd8, 0x2a, 0x4a, 0x47, 0x1e, 0x14, 0xe9, 0x97, 0xe4, 0x97, 0xa3, 0x39,\n  0x1d, 0xb4, 0xef, 0x07, 0xa4, 0xbe, 0xa5, 0xb4, 0x2f, 0xbb, 0xc6, 0x1e,\n  0xf3, 0x82, 0x64, 0x53, 0x79, 0x2a, 0x17, 0x3f, 0x4b, 0x16, 0x28, 0x41,\n  0x64, 0x62, 0xb1, 0x56, 0x41, 0x92, 0x39, 0x9e, 0xb6, 0xad, 0x41, 0xb1,\n  0x8b, 0x57, 0x60, 0x31, 0x3a, 0x00, 0x84, 0xe2, 0x92, 0x4d, 0x2a, 0x17,\n  0xac, 0x93, 0xe0, 0x7d, 0xea, 0x9c, 0xc2, 0xb6, 0xb1, 0xc8, 0x01, 0x91,\n  0xe2, 0xcb, 0xcb, 0xcb, 0x93, 0xe5, 0x49, 0x3f, 0xc0, 0xe0, 0xd1, 0xea,\n  0x80, 0xef, 0xb4, 0xdc, 0x41, 0x9e, 0xea, 0x76, 0xe1, 0xc2, 0x07, 0x4f,\n  0x28, 0xa2, 0xf1, 0x85, 0x4b, 0x20, 0x08, 0xdf, 0x5d, 0xef, 0xd7, 0x83,\n  0xf9, 0x10, 0x31, 0xfd, 0xde, 0xe9, 0x7c, 0x9c, 0x7c, 0xe7, 0xf3, 0x71,\n  0xf2, 0xff, 0x3a, 0x1f, 0x9b, 0xc3, 0x02, 0xe6, 0x5c, 0x4b, 0xef, 0x00,\n  0x20, 0xf0, 0x5a, 0x65, 0x3a, 0x2e, 0x0c, 0x15, 0xf8, 0x56, 0xfe, 0x6c,\n  0xd0, 0xdc, 0x7a, 0x74, 0x39, 0x16, 0x98, 0x42, 0xa6, 0x8c, 0xe6, 0xc6,\n  0x16, 0x1b, 0xb5, 0x1c, 0x2b, 0x95, 0x21, 0x60, 0xf0, 0x0d, 0xb4, 0x54,\n  0xab, 0xe8, 0xe7, 0x73, 0xd8, 0x15, 0x54, 0x7b, 0x0a, 0x25, 0x2f, 0x92,\n  0x33, 0x3a, 0xc4, 0x95, 0x82, 0xaa, 0xb8, 0xb5, 0xdd, 0x43, 0x68, 0x50,\n  0x83, 0xa7, 0xd5, 0x5a, 0x53, 0x69, 0x00, 0x60, 0xf9, 0xa4, 0x55, 0x6f,\n  0xae, 0xf1, 0x7a, 0xab, 0x2d, 0x7a, 0x1b, 0xa4, 0xdc, 0x6f, 0xf5, 0x2c,\n  0x09, 0x83, 0x8e, 0x90, 0x11, 0x30, 0xf3, 0x6f, 0x7c, 0x16, 0x20, 0xd6,\n  0x27, 0xc4, 0xda, 0x0b, 0x94, 0xcc, 0x7e, 0xd2, 0x50, 0x59, 0x5b, 0xd8,\n  0xea, 0x69, 0x74, 0x7b, 0x1b, 0x3d, 0xed, 0xd6, 0x78, 0x55, 0x01, 0x9e,\n  0x73, 0x26, 0xeb, 0xad, 0x06, 0x4b, 0xad, 0xd7, 0x5b, 0x6b, 0x31, 0x58,\n  0xeb, 0x93, 0x4e, 0xf9, 0x59, 0x13, 0xf8, 0x01, 0xc2, 0xaf, 0x24, 0xac,\n  0xfe, 0x4d, 0xf3, 0xbf, 0xe5, 0x6a, 0x01, 0x14, 0xaa, 0xc2, 0x1e, 0x48,\n  0xa2, 0x09, 0xe1, 0x3f, 0xf0, 0x03, 0x72, 0xad, 0x37, 0xb8, 0xc7, 0x3c,\n  0x7e, 0x89, 0x31, 0x30, 0xd5, 0xf4, 0x1e, 0x21, 0xf0, 0xb3, 0x10, 0xae,\n  0xb1, 0x3e, 0xa5, 0x5b, 0x74, 0xe2, 0x04, 0x0b, 0x69, 0x95, 0x3b, 0x7a,\n  0x2b, 0xd1, 0x28, 0x96, 0x10, 0x4d, 0x64, 0x68, 0x5e, 0x35, 0x31, 0x30,\n  0x34, 0xcc, 0x35, 0xa8, 0xea, 0xaa, 0xa3, 0x4d, 0x2a, 0xfc, 0x52, 0xeb,\n  0xd0, 0x60, 0x5b, 0x99, 0xc3, 0x15, 0x15, 0x9f, 0x71, 0x11, 0xf3, 0x1e,\n  0x8a, 0x2b, 0x1c, 0xa3, 0xcf, 0xf0, 0xad, 0x41, 0xf9, 0x01, 0x79, 0x71,\n  0x82, 0x68, 0x28, 0x34, 0xe4, 0x9c, 0x95, 0xd3, 0x5b, 0xf3, 0xe8, 0xdf,\n  0xac, 0x04, 0x5a, 0x9c, 0x83, 0x2c, 0x06, 0x3c, 0x15, 0x32, 0x6e, 0x8e,\n  0x8d, 0xff, 0xff, 0x84, 0xb1, 0x71, 0x2f, 0x50, 0x4c, 0xa0, 0x9c, 0x84,\n  0x62, 0xba, 0x08, 0xe5, 0xc4, 0x73, 0x40, 0x09, 0x81, 0x22, 0xd6, 0xc9,\n  0xd4, 0x90, 0xd6, 0x27, 0x2e, 0x65, 0xbe, 0x47, 0xb3, 0x3b, 0x2b, 0xe9,\n  0x08, 0x02, 0x6a, 0x5a, 0x2b, 0xc1, 0x62, 0x56, 0xb1, 0x10, 0xc9, 0x85,\n  0x68, 0x15, 0x58, 0xf9, 0x0d, 0xc3, 0x01, 0x19, 0x2f, 0xc4, 0xb9, 0x36,\n  0x98, 0x8e, 0x4a, 0x0c, 0x27, 0x94, 0x78, 0x39, 0x5f, 0x85, 0xad, 0x36,\n  0x18, 0x54, 0xa2, 0xe2, 0x7c, 0x0d, 0x95, 0x46, 0x53, 0x49, 0x52, 0x59,\n  0xab, 0xfb, 0xf0, 0x0b, 0x8c, 0x9d, 0xa9, 0xa7, 0xcf, 0x2b, 0x63, 0x00,\n  0xe7, 0x8e, 0x4e, 0xa3, 0x88, 0x7c, 0x83, 0x10, 0xbb, 0x00, 0xd8, 0x0d,\n  0x88, 0x9d, 0x10, 0xe1, 0xad, 0x83, 0x64, 0xc1, 0xe8, 0x91, 0xa4, 0x2f,\n  0x2b, 0x86, 0xeb, 0xc1, 0xc3, 0x13, 0xa2, 0x82, 0x05, 0x8c, 0x23, 0xa6,\n  0x6e, 0xaa, 0x29, 0x4e, 0xd6, 0xda, 0x9d, 0x6e, 0xbe, 0x4e, 0xdd, 0x58,\n  0x53, 0x94, 0x8c, 0x3b, 0x5c, 0x2e, 0x1e, 0xcf, 0xb5, 0xf4, 0xfa, 0x8a,\n  0x7c, 0xbe, 0xe6, 0x3e, 0xf2, 0xcd, 0x27, 0xcd, 0xf7, 0x7b, 0x68, 0xfc,\n  0x95, 0x83, 0x69, 0xa3, 0x4f, 0xaf, 0xb3, 0x1a, 0x78, 0x80, 0x6a, 0x46,\n  0x19, 0x5a, 0x16, 0x1e, 0x36, 0x9e, 0x58, 0x1f, 0x9e, 0x66, 0xb2, 0x92,\n  0xbd, 0x47, 0x1d, 0xa8, 0x84, 0xbd, 0x15, 0x5a, 0xa8, 0xfa, 0xab, 0x56,\n  0xf6, 0xa0, 0x7c, 0xea, 0x43, 0x0a, 0xbb, 0x43, 0xef, 0x21, 0xc2, 0x82,\n  0xb3, 0xce, 0x58, 0xe2, 0xd7, 0x8d, 0xd3, 0xdf, 0xec, 0x75, 0x66, 0x2c,\n  0xe8, 0x2c, 0xcd, 0x12, 0x98, 0x85, 0xf8, 0x9b, 0x6f, 0x67, 0x90, 0xce,\n  0xc3, 0x0a, 0x19, 0xcb, 0x4d, 0x6c, 0x98, 0xdc, 0xb5, 0x8a, 0x8e, 0x24,\n  0x08, 0xf8, 0x7a, 0x62, 0x91, 0x8a, 0x0d, 0xa5, 0x88, 0xa9, 0x17, 0x50,\n  0x23, 0x41, 0x66, 0xc0, 0x43, 0xe9, 0x01, 0x5b, 0xd1, 0x16, 0x1a, 0xb9,\n  0x39, 0x55, 0x51, 0xa8, 0x10, 0xcf, 0x19, 0xdd, 0x9d, 0x3d, 0x5e, 0xbd,\n  0xa3, 0xbb, 0xbf, 0x08, 0xce, 0xca, 0xbb, 0xf1, 0x19, 0xf4, 0x2f, 0x6c,\n  0x1f, 0x61, 0xee, 0x50, 0x35, 0xe1, 0x46, 0x7a, 0x7f, 0x48, 0x4e, 0xa2,\n  0x59, 0x14, 0x20, 0xd3, 0x02, 0xcc, 0x75, 0x44, 0x4d, 0x01, 0x18, 0x4f,\n  0x30, 0xe0, 0x9e, 0x66, 0xd8, 0xb3, 0x1a, 0x8e, 0x67, 0x29, 0xa0, 0x1f,\n  0xfd, 0x05, 0xb3, 0x7b, 0x69, 0xd9, 0xc5, 0x6d, 0xde, 0x74, 0x58, 0x4d,\n  0x45, 0xb0, 0x0b, 0xb4, 0xcb, 0xa6, 0x3d, 0x4e, 0x87, 0x9e, 0x08, 0xb2,\n  0x3e, 0x2f, 0x94, 0x48, 0xb0, 0x98, 0x74, 0x76, 0xbd, 0x9d, 0x8c, 0x40,\n  0x6b, 0xd3, 0x6a, 0xe4, 0x39, 0xa3, 0x64, 0x68, 0x9d, 0x60, 0x90, 0xc8,\n  0xfb, 0x1d, 0xdd, 0x62, 0x6e, 0xf0, 0x95, 0xeb, 0xbd, 0xfc, 0x49, 0xab,\n  0xd7, 0x6b, 0x25, 0x5f, 0xff, 0x5d, 0x58, 0x54, 0x54, 0x68, 0xf3, 0x78,\n  0xd8, 0x3e, 0x9d, 0x7f, 0x47, 0xa8, 0xa0, 0x78, 0x47, 0xf0, 0xc8, 0x1a,\n  0x3c, 0x2c, 0xf2, 0x53, 0x89, 0x9d, 0xc7, 0xaf, 0x29, 0xb1, 0xf3, 0xdb,\n  0x57, 0x0b, 0x56, 0xbf, 0xc3, 0x68, 0x09, 0xbf, 0xfe, 0xd2, 0xea, 0x77,\n  0x24, 0x7f, 0xf0, 0x00, 0xfa, 0x28, 0xd4, 0xdb, 0x64, 0x79, 0xe6, 0x32,\n  0xd2, 0xfc, 0x5a, 0xc2, 0x91, 0x19, 0xf4, 0xd8, 0xb5, 0xe4, 0x43, 0x91,\n  0xdf, 0xe3, 0x5e, 0xfc, 0x1a, 0xd1, 0x1f, 0x62, 0x3b, 0xc5, 0xfe, 0x98,\n  0xf6, 0x47, 0xb9, 0xfe, 0xb4, 0xcd, 0x4f, 0x68, 0x9b, 0x8a, 0xb7, 0x6b,\n  0x83, 0xfe, 0x81, 0xb6, 0xa9, 0xbc, 0x6a, 0xcb, 0x36, 0x44, 0x67, 0x15,\n  0x68, 0x9b, 0xba, 0xea, 0xfc, 0x36, 0x78, 0xdd, 0xb3, 0xfe, 0x9d, 0xb4,\n  0x89, 0x12, 0x1d, 0xeb, 0x83, 0xcc, 0xa6, 0x77, 0xa2, 0x72, 0xca, 0x9b,\n  0x64, 0xb1, 0x8d, 0xf8, 0x4f, 0x4c, 0x04, 0x5d, 0x12, 0xa6, 0xad, 0x84,\n  0xff, 0x5d, 0xfd, 0xae, 0xd4, 0xea, 0xbb, 0xd2, 0xbd, 0x5e, 0x25, 0x72,\n  0xe6, 0x00, 0xdb, 0x87, 0x23, 0x14, 0x80, 0x85, 0x47, 0x3b, 0x56, 0x17,\n  0x72, 0xf9, 0x06, 0xf8, 0x7b, 0x58, 0x0d, 0x73, 0x26, 0xd9, 0x52, 0x77,\n  0xd0, 0xd8, 0xed, 0xb0, 0x52, 0x57, 0xec, 0x2f, 0x34, 0x46, 0xa3, 0x45,\n  0x8c, 0x1b, 0x83, 0x80, 0x2f, 0x3c, 0x0f, 0xb4, 0xbf, 0x1e, 0x38, 0x67,\n  0x12, 0x74, 0x20, 0x8b, 0x5c, 0xd0, 0x5c, 0xfa, 0x00, 0x18, 0xa9, 0x5e,\n  0x41, 0x6f, 0xd2, 0xb8, 0x88, 0x30, 0x08, 0x05, 0xdd, 0xd0, 0x5f, 0x84,\n  0x6f, 0xce, 0xe0, 0xf3, 0xe3, 0x2b, 0xe7, 0xa0, 0xbe, 0x0b, 0x66, 0x6c,\n  0xe4, 0x5b, 0x9c, 0xde, 0xdb, 0xc8, 0x64, 0xd2, 0x7a, 0x28, 0x1e, 0xc8,\n  0x01, 0x17, 0xc3, 0x12, 0xe6, 0x62, 0x21, 0x58, 0x1d, 0xeb, 0x45, 0xf8,\n  0x6e, 0x08, 0x6d, 0x4e, 0x82, 0x4a, 0x63, 0xe2, 0x28, 0x49, 0x64, 0x16,\n  0xe9, 0x87, 0x34, 0xb6, 0x93, 0x06, 0x7c, 0x18, 0xd5, 0x46, 0x78, 0x5e,\n  0xa1, 0x8a, 0x6c, 0x33, 0x64, 0x25, 0xbc, 0xc1, 0x6a, 0x65, 0x45, 0x96,\n  0xc7, 0xa2, 0xb1, 0x5f, 0xaf, 0xfc, 0xe6, 0xc5, 0x9f, 0x5e, 0x65, 0x72,\n  0x6b, 0xb4, 0x4e, 0xe3, 0xd5, 0xf8, 0xfc, 0xca, 0x91, 0x86, 0x14, 0xbe,\n  0x7b, 0xe5, 0x06, 0x74, 0xaa, 0x6a, 0x47, 0x69, 0xe9, 0xf6, 0x72, 0xe1,\n  0xa6, 0x5c, 0x4c, 0x2e, 0x7d, 0xf7, 0x58, 0x4e, 0x8f, 0xa4, 0x7f, 0xb7,\n  0x29, 0x73, 0x73, 0x1d, 0xfd, 0xbb, 0x42, 0xca, 0xdb, 0xcd, 0xab, 0x31,\n  0x06, 0xf6, 0x29, 0x2a, 0x5b, 0x10, 0x55, 0x6d, 0x49, 0x86, 0x16, 0x69,\n  0x56, 0x20, 0xb4, 0xc9, 0xd8, 0x09, 0xb9, 0xf7, 0x17, 0xf9, 0xad, 0x50,\n  0x75, 0x8c, 0xd7, 0x78, 0xdf, 0xb6, 0xea, 0x98, 0x8a, 0x8c, 0x7f, 0xcb,\n  0xca, 0x63, 0xd7, 0x08, 0x3f, 0xdc, 0xb4, 0xfa, 0xd8, 0xae, 0xd1, 0xd1,\n  0xbc, 0x78, 0x32, 0x3a, 0xce, 0x4a, 0x65, 0xdc, 0x87, 0xe9, 0xdf, 0xd5,\n  0x4a, 0xbd, 0xa1, 0x79, 0x5a, 0xbf, 0xa9, 0xf9, 0x09, 0x9a, 0x50, 0x25,\n  0xcd, 0xb7, 0x41, 0x5c, 0x55, 0x60, 0xbc, 0x74, 0xaa, 0xa9, 0xea, 0x4b,\n  0x81, 0xb9, 0x70, 0x3d, 0x96, 0x96, 0xb4, 0x80, 0x29, 0x70, 0x89, 0x4b,\n  0x8a, 0x42, 0xf2, 0xfc, 0x86, 0x10, 0x9a, 0x43, 0x68, 0xfe, 0x23, 0x66,\n  0xaf, 0x96, 0xf7, 0x9a, 0x3f, 0x3c, 0x4f, 0x7a, 0x01, 0x0c, 0xc6, 0xd7,\n  0x6a, 0xb6, 0x97, 0x96, 0xee, 0xa8, 0x12, 0xda, 0x60, 0xb5, 0xa5, 0x71,\n  0xb0, 0xe2, 0xb8, 0x6a, 0x95, 0x71, 0xdd, 0x47, 0xff, 0x8e, 0xd3, 0xf9,\n  0x84, 0xc2, 0x10, 0x3c, 0xc5, 0xfe, 0xe0, 0x09, 0xad, 0xdb, 0x2f, 0x0e,\n  0xaa, 0x84, 0xe6, 0x7a, 0x01, 0x52, 0xa5, 0x5a, 0x12, 0x05, 0x98, 0x7a,\n  0x11, 0xa9, 0x12, 0x6a, 0x3e, 0x24, 0x55, 0x14, 0x38, 0x47, 0x6e, 0xc2,\n  0x70, 0xe4, 0x22, 0xa7, 0xda, 0x97, 0x6b, 0x0a, 0x1b, 0xc4, 0xa3, 0xd1,\n  0x00, 0x0c, 0x88, 0x46, 0xaf, 0xd1, 0xeb, 0xb4, 0x79, 0xb5, 0x63, 0x81,\n  0x22, 0x41, 0xed, 0x58, 0x24, 0x7d, 0xa5, 0xd0, 0xd3, 0xc2, 0x11, 0x74,\n  0x44, 0x98, 0x46, 0x2f, 0x81, 0xa5, 0x5a, 0xf8, 0xd1, 0xe8, 0xa8, 0xf0,\n  0x38, 0x00, 0xa1, 0xca, 0x3e, 0x52, 0xfc, 0x1c, 0x19, 0x6b, 0x9d, 0x52,\n  0xbf, 0xee, 0x32, 0x6a, 0x53, 0x6f, 0x97, 0x36, 0x2b, 0xac, 0xb4, 0x38,\n  0x3a, 0x5a, 0x76, 0x8b, 0x1e, 0x8c, 0x42, 0x51, 0x02, 0x39, 0xa7, 0x7c,\n  0x86, 0x25, 0x38, 0x7d, 0xb1, 0x4c, 0xa8, 0x4a, 0xe3, 0xae, 0x48, 0xd0,\n  0x5a, 0x87, 0x01, 0xcb, 0x02, 0x76, 0x65, 0x85, 0x0f, 0xd2, 0xe2, 0x47,\n  0x57, 0xac, 0xdc, 0xa0, 0xcc, 0x8f, 0x38, 0x5f, 0x09, 0xfa, 0x4c, 0x72,\n  0x42, 0x71, 0x90, 0xc6, 0x66, 0xec, 0x48, 0x9b, 0x80, 0x39, 0x15, 0x60,\n  0x00, 0x2b, 0x46, 0x39, 0x94, 0x52, 0x07, 0x93, 0x9b, 0x22, 0x30, 0x90,\n  0x82, 0x93, 0x30, 0x29, 0xe2, 0x3c, 0x62, 0x0e, 0x51, 0xb4, 0xd4, 0xfc,\n  0x89, 0x29, 0x10, 0xa5, 0xb7, 0xae, 0x09, 0x1b, 0x1d, 0x49, 0xd2, 0xca,\n  0x82, 0xb5, 0x34, 0x18, 0x8c, 0x84, 0xac, 0x6c, 0x5d, 0x43, 0x22, 0x60,\n  0x2f, 0xfd, 0xaf, 0x97, 0xd0, 0xcf, 0x56, 0x8d, 0xb5, 0x95, 0xfa, 0x17,\n  0x5f, 0x8d, 0x0c, 0xc7, 0x10, 0x1e, 0x42, 0x15, 0x48, 0x37, 0x3c, 0x8e,\n  0x84, 0xff, 0x15, 0x7e, 0x82, 0xc6, 0x64, 0x3b, 0x36, 0x1d, 0x63, 0x2a,\n  0x67, 0x17, 0xa2, 0x7f, 0xb7, 0xd2, 0x35, 0x4d, 0x90, 0x79, 0x7b, 0x8d,\n  0xe8, 0x32, 0x4e, 0xa8, 0xe8, 0xc5, 0x2c, 0x4b, 0xb1, 0xa7, 0x44, 0x92,\n  0xd1, 0x6b, 0xb1, 0x9a, 0x67, 0xd4, 0x87, 0x88, 0x86, 0x0a, 0x68, 0x5e,\n  0x3c, 0x3a, 0xa4, 0x23, 0xeb, 0x49, 0xc7, 0x9d, 0xa4, 0x28, 0xef, 0x5b,\n  0xb6, 0xa1, 0x7e, 0x88, 0x24, 0xcc, 0xa4, 0x07, 0xaa, 0xdf, 0x96, 0x44,\n  0x4b, 0xa2, 0xc1, 0x80, 0xbf, 0xd8, 0xed, 0x22, 0x0f, 0x71, 0x3a, 0x2d,\n  0x16, 0xa7, 0xa5, 0x00, 0x8e, 0x97, 0x5d, 0x84, 0x62, 0xa3, 0x70, 0xaa,\n  0xac, 0x08, 0xa7, 0x4a, 0xd8, 0x25, 0xe0, 0x48, 0x5a, 0x2d, 0x22, 0x50,\n  0x24, 0xfa, 0xca, 0xa9, 0x73, 0x8d, 0xbe, 0xbe, 0xd3, 0xd9, 0xec, 0xae,\n  0x33, 0x3d, 0x45, 0x4d, 0xe7, 0x4e, 0x8e, 0xcf, 0xc7, 0x96, 0x4e, 0x64,\n  0x4f, 0xed, 0x8b, 0xcd, 0xe1, 0x67, 0xa7, 0xf1, 0xc0, 0x99, 0xc1, 0xda,\n  0xf9, 0x91, 0x5a, 0x7c, 0xec, 0x18, 0x8e, 0x8f, 0xcd, 0x55, 0xf7, 0x9f,\n  0x19, 0xc2, 0xd3, 0xf7, 0xe3, 0xda, 0xed, 0x8d, 0xd3, 0x87, 0x38, 0x74,\n  0xad, 0xf0, 0x2e, 0xee, 0xf0, 0x64, 0xd3, 0xf6, 0x1a, 0xf2, 0xce, 0x52,\n  0x5d, 0x30, 0xf2, 0xce, 0x22, 0xee, 0x27, 0x91, 0x70, 0xf0, 0x1f, 0xc9,\n  0x3a, 0x79, 0x99, 0x51, 0xf1, 0x7d, 0x5d, 0x6a, 0x24, 0xd5, 0x65, 0x3f,\n  0xa4, 0xe1, 0x55, 0x2c, 0xcb, 0xe6, 0x48, 0x67, 0xde, 0x47, 0x20, 0xf2,\n  0xcc, 0x4b, 0x9f, 0x53, 0xba, 0x46, 0x6e, 0xe6, 0x65, 0xbc, 0x16, 0x8b,\n  0xd5, 0x6e, 0xb1, 0xd8, 0xb5, 0x1a, 0x1f, 0x79, 0x27, 0xa8, 0xae, 0x4b,\n  0x5e, 0x08, 0xe0, 0xe6, 0x92, 0x09, 0x50, 0x90, 0x2d, 0x09, 0x0b, 0x44,\n  0x4d, 0xe3, 0x3f, 0xfa, 0x7a, 0xce, 0xcc, 0x4c, 0xcf, 0x9c, 0xe9, 0x2e,\n  0x9a, 0x39, 0x70, 0x62, 0xfa, 0xe2, 0x45, 0x7c, 0xfe, 0xd5, 0xc4, 0xdc,\n  0x50, 0xc5, 0x4f, 0x7f, 0x5a, 0x39, 0x34, 0x17, 0xff, 0xfd, 0x7f, 0xed,\n  0xde, 0x8d, 0xee, 0x17, 0x66, 0x77, 0xef, 0xfa, 0xbd, 0x5c, 0x27, 0xec,\n  0x3f, 0x09, 0xdd, 0x0a, 0x30, 0x93, 0x4f, 0x16, 0xa9, 0xa5, 0x3a, 0x0a,\n  0xd2, 0x38, 0xa5, 0xca, 0xad, 0xcd, 0x94, 0xea, 0x12, 0x49, 0x18, 0x49,\n  0xe3, 0x04, 0x0c, 0x56, 0x15, 0x08, 0x00, 0xfb, 0x72, 0x6d, 0xa4, 0xe0,\n  0x08, 0xd1, 0xc2, 0x02, 0xfe, 0x73, 0x70, 0x38, 0xf3, 0x1a, 0xb9, 0xb4,\n  0xab, 0x13, 0x02, 0x9b, 0xf3, 0x52, 0x2b, 0x20, 0xcc, 0x50, 0xc4, 0x8a,\n  0xad, 0x8f, 0xa0, 0x1b, 0x2f, 0x3d, 0x31, 0xb4, 0x5b, 0xf8, 0xd5, 0xe3,\n  0xe9, 0xe9, 0xcc, 0xdd, 0x07, 0x97, 0xef, 0xca, 0x4c, 0xa5, 0x3f, 0x27,\n  0xfc, 0x6a, 0xf7, 0xf0, 0x45, 0xf8, 0xdc, 0x75, 0x17, 0x2f, 0x7e, 0xa2,\n  0x7b, 0x60, 0x2c, 0x7e, 0xff, 0x89, 0xbd, 0x77, 0x8c, 0x8d, 0xde, 0xb1,\n  0xf7, 0xc4, 0x03, 0xf1, 0xb1, 0x81, 0xae, 0xfb, 0xf7, 0x5d, 0x7c, 0xdd,\n  0x3b, 0xc2, 0xbc, 0x78, 0x87, 0xb6, 0x49, 0x88, 0x67, 0x98, 0x66, 0xc3,\n  0x84, 0x1f, 0x5e, 0x45, 0xed, 0x7f, 0xdb, 0xa5, 0xdc, 0xc5, 0x0a, 0xc2,\n  0x27, 0xff, 0x85, 0x5e, 0xbf, 0x46, 0xbc, 0xfe, 0x8a, 0x78, 0x1d, 0xe2,\n  0x4c, 0xdc, 0xf4, 0xfa, 0x75, 0xe2, 0xf5, 0xa0, 0x78, 0x7d, 0x1b, 0xe5,\n  0xab, 0x61, 0x85, 0xaf, 0x6e, 0x5f, 0x9d, 0x53, 0x6c, 0xd2, 0x35, 0x94,\n  0xdf, 0xde, 0x49, 0xdb, 0xef, 0xb0, 0xe6, 0xea, 0xd2, 0x4f, 0x13, 0x5d,\n  0x36, 0x44, 0x68, 0xe0, 0x91, 0xb4, 0xbe, 0x44, 0x8b, 0x59, 0xb5, 0x87,\n  0xc2, 0x5f, 0x8b, 0x66, 0x1e, 0x8f, 0x02, 0x30, 0xd9, 0x36, 0xa2, 0x01,\n  0xa3, 0x16, 0xb3, 0x97, 0x06, 0x2c, 0x51, 0x82, 0x0c, 0x01, 0x4c, 0x29,\n  0x11, 0x82, 0x92, 0xd9, 0xa4, 0x41, 0x36, 0xed, 0x0e, 0x97, 0x22, 0xa6,\n  0xb2, 0xbc, 0xb4, 0x36, 0x5c, 0x5b, 0x5c, 0xe4, 0xb0, 0xd3, 0xe4, 0xd7,\n  0x10, 0x0a, 0x69, 0x35, 0x6b, 0x92, 0x97, 0x40, 0x35, 0x83, 0x52, 0xd4,\n  0xf9, 0x96, 0xeb, 0x4d, 0x32, 0x98, 0xf6, 0x5e, 0x7e, 0xe9, 0x91, 0x96,\n  0x31, 0x8f, 0x5a, 0x65, 0xd6, 0xf7, 0xf2, 0x05, 0x6a, 0x97, 0x45, 0x53,\n  0xc8, 0xf1, 0x25, 0x96, 0x70, 0x8d, 0x9e, 0x77, 0x66, 0x92, 0xdb, 0x7b,\n  0x3b, 0xa7, 0x07, 0xfb, 0x7a, 0x75, 0xb7, 0xdc, 0x7c, 0xd3, 0x1d, 0x65,\n  0x65, 0x96, 0x98, 0xc9, 0x31, 0x30, 0x5e, 0xfa, 0x6f, 0x7e, 0x37, 0x87,\n  0xd2, 0x9c, 0xb6, 0xb4, 0x3a, 0x58, 0x3b, 0x38, 0xbf, 0xa4, 0x5e, 0x3c,\n  0xb4, 0xbc, 0x7f, 0xf1, 0x80, 0x9c, 0xfb, 0x39, 0x44, 0xeb, 0x12, 0x55,\n  0x33, 0xa3, 0xe9, 0x61, 0x1e, 0xa9, 0xd4, 0x3e, 0xc4, 0xa9, 0x2c, 0x88,\n  0x88, 0xfd, 0x19, 0x46, 0xcd, 0xa8, 0x38, 0xb5, 0x0a, 0x4a, 0x4d, 0xb3,\n  0xa2, 0x6d, 0xb2, 0x55, 0x49, 0xdf, 0x48, 0x02, 0x45, 0x68, 0xc2, 0xb4,\n  0x90, 0x52, 0x79, 0x2c, 0x1a, 0x0e, 0xf8, 0x5d, 0xd5, 0xee, 0x6a, 0x6b,\n  0xa1, 0xc9, 0x00, 0x81, 0x1a, 0xf0, 0x66, 0x12, 0x2c, 0x49, 0x1e, 0xb6,\n  0x9d, 0x08, 0x53, 0xe0, 0xa4, 0x9e, 0x66, 0xc7, 0x7a, 0x60, 0x21, 0xd4,\n  0xd3, 0x7d, 0xb0, 0x65, 0x74, 0x68, 0xd7, 0xee, 0x6b, 0x4e, 0x36, 0x8f,\n  0x95, 0x4c, 0xb7, 0x1f, 0xe9, 0x8e, 0xf5, 0x94, 0x85, 0x86, 0x13, 0x93,\n  0xa3, 0x7b, 0x46, 0x93, 0x15, 0xa3, 0x03, 0x23, 0x78, 0xa5, 0x62, 0x47,\n  0x7a, 0x60, 0x47, 0x01, 0xa7, 0xdb, 0xbb, 0x6b, 0xe9, 0x58, 0xa1, 0x59,\n  0x78, 0x93, 0xe5, 0x27, 0xf6, 0xd7, 0x0e, 0x16, 0xf5, 0x75, 0x08, 0x3b,\n  0x0a, 0x9d, 0x23, 0x7d, 0x63, 0x83, 0x43, 0x43, 0x6d, 0xed, 0xad, 0xf4,\n  0xac, 0xab, 0xc8, 0x7b, 0x21, 0x0c, 0xa4, 0x27, 0x98, 0xf6, 0x5b, 0x74,\n  0x58, 0x81, 0x90, 0x4f, 0x81, 0x33, 0xa1, 0x89, 0x06, 0xdd, 0x12, 0xb2,\n  0x64, 0xb7, 0x53, 0x9e, 0x49, 0xc4, 0x34, 0x7b, 0x08, 0x48, 0x51, 0x1e,\n  0x5a, 0x3d, 0x46, 0xff, 0x6a, 0x72, 0x14, 0xcc, 0x1b, 0x9c, 0xa6, 0x9f,\n  0xee, 0xba, 0x48, 0xef, 0x28, 0x24, 0x7a, 0x87, 0xc5, 0xae, 0x59, 0xc6,\n  0xae, 0x95, 0xd7, 0x63, 0xb3, 0x53, 0xc1, 0xa2, 0x1d, 0xbb, 0xcb, 0x70,\n  0xa1, 0xf0, 0xb2, 0x27, 0xdd, 0x5c, 0x68, 0x6e, 0x4d, 0x3b, 0x90, 0x8f,\n  0xee, 0xa3, 0x06, 0xb2, 0x8f, 0x22, 0xf8, 0x4d, 0x72, 0x86, 0x6b, 0x00,\n  0x5d, 0x18, 0xb8, 0x41, 0x11, 0x07, 0xb9, 0xe5, 0x19, 0xa5, 0xc0, 0x42,\n  0x83, 0x82, 0xba, 0x9b, 0x84, 0x98, 0xac, 0x8a, 0x32, 0xbb, 0x55, 0xa3,\n  0x86, 0x23, 0xaa, 0xd2, 0xac, 0x01, 0x72, 0xce, 0x47, 0x7e, 0x10, 0x95,\n  0x38, 0xfa, 0xc3, 0x4a, 0x41, 0x21, 0xa4, 0x39, 0xeb, 0xe8, 0xdd, 0x1b,\n  0x8d, 0x84, 0x77, 0x24, 0xaa, 0xca, 0x3d, 0x2d, 0xf1, 0x5d, 0x0b, 0x37,\n  0x5f, 0xd4, 0x7f, 0xa2, 0x23, 0x35, 0xdf, 0xd2, 0xd8, 0xb3, 0xb4, 0xcb,\n  0xdf, 0xd9, 0x18, 0x9a, 0x18, 0x1c, 0xd9, 0xd6, 0x8d, 0xdf, 0x0c, 0xda,\n  0x7a, 0xed, 0xc5, 0x65, 0x45, 0xae, 0x48, 0x99, 0x37, 0x7e, 0xc9, 0xd4,\n  0xa5, 0xef, 0xaa, 0xdf, 0xdf, 0x9f, 0xde, 0xd3, 0x69, 0x29, 0x19, 0x49,\n  0xf5, 0xf6, 0x0b, 0x0f, 0xf3, 0xbe, 0x9a, 0xfe, 0x44, 0xd7, 0x8e, 0xec,\n  0xf6, 0x1e, 0x09, 0x9f, 0x9a, 0x9e, 0x35, 0x72, 0x16, 0x62, 0x4c, 0x6f,\n  0xba, 0xcb, 0x4f, 0x36, 0x02, 0x44, 0x0e, 0xd9, 0xc9, 0x9c, 0x12, 0x25,\n  0x85, 0x81, 0xe8, 0x32, 0xc0, 0x3a, 0x54, 0x31, 0xe0, 0xaa, 0x5c, 0x92,\n  0x8d, 0xdd, 0x6d, 0x4a, 0x49, 0xe9, 0x24, 0x8d, 0xc6, 0x8c, 0x31, 0xd1,\n  0x70, 0x65, 0x38, 0x14, 0xa0, 0x12, 0x95, 0x3d, 0xbf, 0xb8, 0x99, 0xac,\n  0x91, 0x26, 0xd7, 0x22, 0x09, 0x43, 0x03, 0xb4, 0x6f, 0xf0, 0xbe, 0x6d,\n  0xad, 0x8d, 0x3b, 0x03, 0xfe, 0xc9, 0xf6, 0x93, 0xc7, 0x02, 0x0d, 0x25,\n  0x55, 0xa9, 0x93, 0xbb, 0x9a, 0xb7, 0xc7, 0x02, 0x81, 0xde, 0x9a, 0xcb,\n  0xb6, 0xf7, 0xa1, 0x96, 0x81, 0xd9, 0x78, 0xcc, 0x63, 0x1e, 0x31, 0xdb,\n  0xb3, 0xdd, 0xb1, 0x84, 0x5f, 0xab, 0x32, 0xb6, 0xc4, 0x7b, 0x86, 0x6c,\n  0x85, 0x7d, 0x26, 0x5b, 0xa6, 0x32, 0x22, 0xe1, 0xfb, 0xb5, 0xa1, 0x6f,\n  0xd3, 0xb8, 0x52, 0x7f, 0xba, 0xc8, 0x2b, 0x62, 0xcd, 0xd3, 0x6a, 0xab,\n  0x92, 0x9f, 0xbc, 0x01, 0x8d, 0x5a, 0xe6, 0xad, 0x2c, 0x61, 0xab, 0x2a,\n  0xb2, 0x35, 0x43, 0x0d, 0x39, 0x5b, 0x1a, 0x59, 0xf3, 0x20, 0xe0, 0x87,\n  0x10, 0x56, 0xab, 0xc0, 0x6e, 0xa0, 0x6f, 0x47, 0x5d, 0x53, 0xae, 0x88,\n  0x39, 0xd1, 0x30, 0xbf, 0xb7, 0x76, 0xfb, 0x91, 0x16, 0xae, 0xaa, 0x33,\n  0x78, 0x29, 0x3a, 0xb5, 0x74, 0x55, 0xbb, 0x3d, 0x96, 0x69, 0x18, 0x49,\n  0xc7, 0x2a, 0xc7, 0x4a, 0x4a, 0x06, 0xbd, 0x46, 0x97, 0x5d, 0x6b, 0x59,\n  0xda, 0x37, 0x7c, 0xd5, 0xb1, 0x83, 0x49, 0x8c, 0x07, 0xbb, 0xa6, 0x6e,\n  0x3e, 0x36, 0x13, 0x6b, 0x6a, 0xf1, 0xe9, 0xcd, 0x29, 0x46, 0x8a, 0x85,\n  0x83, 0xf8, 0x47, 0x1b, 0x73, 0xe5, 0x13, 0x96, 0xbc, 0xfa, 0x0d, 0xce,\n  0x5c, 0x6d, 0x99, 0x36, 0xd8, 0x13, 0x49, 0x98, 0xc3, 0x26, 0x24, 0x67,\n  0x82, 0x40, 0x41, 0xb0, 0x54, 0xae, 0xc8, 0xcc, 0xda, 0x26, 0xe4, 0xd3,\n  0x35, 0x1f, 0x50, 0x4b, 0x5a, 0x4a, 0xfa, 0x34, 0x4b, 0xeb, 0xd0, 0x80,\n  0xd3, 0x93, 0x3a, 0x3c, 0x6c, 0x44, 0xa4, 0xd5, 0xe4, 0xa2, 0x1b, 0x23,\n  0x1b, 0x0a, 0xd1, 0x34, 0xb7, 0x4f, 0xf7, 0xe6, 0x2a, 0xd1, 0xac, 0x7c,\n  0x1e, 0xf7, 0xa7, 0x3b, 0xf3, 0x4b, 0xd1, 0x48, 0xf9, 0xb7, 0x45, 0x84,\n  0x4e, 0x18, 0xc8, 0x5b, 0x78, 0xa1, 0xe6, 0x9d, 0x8c, 0xc8, 0x02, 0x1e,\n  0x0c, 0x4a, 0x10, 0x5a, 0x73, 0x85, 0x51, 0x08, 0xcd, 0x73, 0xd8, 0x4d,\n  0x46, 0xb7, 0xcb, 0xee, 0x75, 0x78, 0x0b, 0x2d, 0x46, 0x9b, 0xc9, 0x16,\n  0x0e, 0x69, 0xe0, 0xa0, 0xd9, 0xf2, 0xcb, 0xcf, 0x47, 0xc5, 0x44, 0x3e,\n  0xf0, 0x52, 0x07, 0x1c, 0x0e, 0x5c, 0x14, 0x3f, 0x3c, 0x7d, 0xe5, 0x25,\n  0xb5, 0x87, 0x27, 0xaf, 0x3a, 0xf3, 0x97, 0x4c, 0xbf, 0x0a, 0xd5, 0xa9,\n  0x06, 0x46, 0x46, 0x87, 0x58, 0xe1, 0x7b, 0xb8, 0x1f, 0x5d, 0x76, 0xd9,\n  0xa3, 0xbb, 0xbf, 0xff, 0xc4, 0xe5, 0x9f, 0x99, 0xfd, 0xce, 0x75, 0x37,\n  0x9e, 0x3b, 0x77, 0xe3, 0xca, 0xcd, 0x77, 0xdc, 0xf9, 0x9e, 0xbb, 0x28,\n  0xd4, 0x21, 0xd0, 0x79, 0x72, 0xce, 0xcd, 0x62, 0xcd, 0x02, 0x06, 0x6b,\n  0xa8, 0x5f, 0x08, 0x64, 0xe3, 0x94, 0xe2, 0x36, 0x4c, 0x52, 0x34, 0x7e,\n  0x33, 0x63, 0x0e, 0x87, 0xe0, 0xb8, 0x5b, 0x2d, 0x6b, 0xeb, 0x9b, 0x5b,\n  0x1e, 0x0a, 0xc7, 0x1c, 0x35, 0x06, 0x63, 0x83, 0xa7, 0xb2, 0x37, 0x8a,\n  0x5d, 0xc2, 0xb9, 0xda, 0x5a, 0xd1, 0xd3, 0x3b, 0xd8, 0x89, 0xae, 0x90,\n  0x62, 0x33, 0x0d, 0xd8, 0x45, 0xe4, 0x88, 0xbf, 0x51, 0x3f, 0xd0, 0xdf,\n  0xc9, 0x5c, 0x14, 0x63, 0x81, 0xc8, 0x4d, 0x1f, 0x95, 0x22, 0x7e, 0xb4,\n  0x44, 0x52, 0x08, 0x12, 0x2a, 0x09, 0x41, 0x6a, 0x20, 0xf5, 0x79, 0xd7,\n  0x5e, 0x22, 0x04, 0x40, 0x8e, 0xf8, 0x71, 0xca, 0x63, 0x6a, 0x15, 0xab,\n  0xd1, 0xa9, 0x20, 0xac, 0x32, 0xc9, 0xe6, 0xd6, 0x5c, 0xf9, 0x18, 0x42,\n  0x23, 0x93, 0x4a, 0xc9, 0x3a, 0x2a, 0x2d, 0x16, 0xab, 0xe0, 0x56, 0x98,\n  0x63, 0xcf, 0xae, 0xbb, 0x8b, 0xd8, 0x20, 0x2b, 0x96, 0xf8, 0x88, 0x32,\n  0xd1, 0x88, 0x3d, 0x5c, 0xaa, 0xd6, 0x78, 0x2a, 0x42, 0xd6, 0xa8, 0x0c,\n  0xf0, 0x4f, 0x79, 0xbd, 0xd3, 0x9a, 0xcf, 0x5a, 0xa2, 0xd5, 0x58, 0x2c,\n  0x9a, 0xa1, 0x7e, 0xd9, 0x6b, 0x8e, 0x54, 0x14, 0x7a, 0xf5, 0xc6, 0x60,\n  0x61, 0x7d, 0x47, 0x85, 0xed, 0x51, 0xab, 0x5f, 0x63, 0x51, 0xe9, 0x7d,\n  0x96, 0x70, 0x85, 0x79, 0x50, 0x63, 0xb7, 0x70, 0x9c, 0xd6, 0x67, 0xb9,\n  0x1c, 0x1b, 0x87, 0x2b, 0xe2, 0x1c, 0xee, 0x67, 0x55, 0xa5, 0x43, 0xcd,\n  0x42, 0x71, 0x03, 0x87, 0x3a, 0x55, 0x7c, 0xb8, 0xf2, 0x7b, 0xae, 0x96,\n  0x26, 0x6b, 0x68, 0x3c, 0x2a, 0xbc, 0x2c, 0xf3, 0x63, 0x0f, 0x9d, 0xab,\n  0x33, 0x4a, 0xad, 0x90, 0xbf, 0x93, 0xf5, 0xb1, 0x30, 0x75, 0x44, 0xa7,\n  0xc1, 0x8c, 0x2c, 0xd2, 0x00, 0x38, 0x39, 0x93, 0x52, 0xa4, 0xca, 0x02,\n  0x42, 0x3a, 0xf1, 0x39, 0x7a, 0x8d, 0xf0, 0xcb, 0x27, 0x6c, 0x1e, 0x33,\n  0x1c, 0x51, 0x8b, 0x4c, 0x8d, 0x93, 0x09, 0x88, 0xe4, 0x0a, 0xed, 0x3a,\n  0xac, 0x75, 0xda, 0x55, 0x5c, 0x7b, 0x6f, 0xd1, 0x54, 0x78, 0xd7, 0xf6,\n  0x79, 0xb2, 0x54, 0x2f, 0xb8, 0xba, 0x3a, 0x6c, 0x1d, 0xb7, 0x7c, 0x72,\n  0xe1, 0xd0, 0x13, 0xff, 0xb0, 0x1d, 0x9e, 0xd7, 0x20, 0x9d, 0xff, 0x24,\n  0xe8, 0x7d, 0x05, 0x20, 0xc0, 0x11, 0xfa, 0x05, 0xd5, 0x00, 0x39, 0xd5,\n  0x39, 0x39, 0x20, 0x91, 0xda, 0x04, 0x21, 0x0a, 0xb1, 0x81, 0x28, 0x7f,\n  0x81, 0x70, 0xc0, 0xd2, 0xa6, 0xd6, 0x14, 0x55, 0xa4, 0x72, 0x44, 0x09,\n  0xc0, 0xeb, 0x28, 0x21, 0x10, 0x71, 0x82, 0x1d, 0x89, 0x84, 0x7d, 0x0d,\n  0x41, 0xce, 0xa3, 0x1b, 0x0d, 0xd1, 0x74, 0x38, 0xde, 0x54, 0xd6, 0x1d,\n  0xb3, 0xf6, 0x04, 0x8b, 0xd1, 0x8c, 0xa7, 0xe9, 0x70, 0xcf, 0x50, 0x76,\n  0xfb, 0xe4, 0xae, 0x3d, 0xe5, 0x63, 0xc9, 0x91, 0xd6, 0x88, 0x63, 0xbb,\n  0xb3, 0xd4, 0x5c, 0xdf, 0xb0, 0xb0, 0xf8, 0xfd, 0xba, 0x91, 0x84, 0x5e,\n  0x6d, 0xec, 0x6c, 0xaa, 0x69, 0x0b, 0xeb, 0x31, 0x37, 0xd8, 0x13, 0xec,\n  0x49, 0x24, 0x52, 0xdd, 0xd3, 0x9d, 0x89, 0x7a, 0x8f, 0xde, 0xdc, 0x58,\n  0x46, 0x09, 0x49, 0x91, 0xd1, 0x49, 0x08, 0xc9, 0xde, 0x5c, 0x5c, 0x67,\n  0x90, 0xcc, 0xe3, 0x36, 0xb1, 0xfe, 0x2e, 0xf9, 0xfb, 0x24, 0xe5, 0x67,\n  0x0f, 0x89, 0x1b, 0x09, 0x1c, 0xe7, 0xaa, 0x5c, 0x50, 0x84, 0x37, 0xff,\n  0x02, 0x51, 0xa2, 0xe4, 0xfd, 0xe6, 0x56, 0x43, 0x35, 0x18, 0xea, 0x62,\n  0x4c, 0x8d, 0xf0, 0x32, 0xe4, 0x39, 0x95, 0x1d, 0xc5, 0x85, 0xf0, 0xe5,\n  0x37, 0xa0, 0x14, 0x86, 0x47, 0xb9, 0x63, 0x03, 0x81, 0xb8, 0x2c, 0x18,\n  0x3d, 0xd1, 0xd9, 0x8d, 0x37, 0x12, 0x9b, 0x88, 0x88, 0xd7, 0x10, 0xaa,\n  0x03, 0x41, 0x16, 0x7a, 0x1d, 0xe1, 0x65, 0x50, 0x4b, 0x51, 0x93, 0x17,\n  0x66, 0x91, 0xb4, 0x48, 0x65, 0x09, 0x03, 0x34, 0xfa, 0x04, 0x37, 0x1a,\n  0x9d, 0xbc, 0x26, 0xe4, 0x3c, 0xfe, 0x9b, 0xa9, 0xa3, 0x03, 0xd8, 0x7f,\n  0xc8, 0xd3, 0xae, 0xe6, 0x7a, 0x39, 0xed, 0x59, 0x94, 0x15, 0xe2, 0xe8,\n  0x07, 0x91, 0xd0, 0xa0, 0xf0, 0x68, 0x08, 0xec, 0xaf, 0x63, 0x64, 0x2f,\n  0x45, 0xa4, 0xd8, 0xba, 0x86, 0x74, 0x82, 0x9c, 0x23, 0x70, 0x2d, 0x70,\n  0x38, 0x03, 0x9e, 0x7f, 0xca, 0x6b, 0xda, 0x44, 0x68, 0x59, 0x20, 0x39,\n  0x12, 0xe9, 0xb3, 0xdb, 0xbc, 0x6e, 0x9b, 0xdf, 0xee, 0x0f, 0x11, 0x29,\n  0x83, 0xec, 0x20, 0xb4, 0xa6, 0xa6, 0x94, 0x58, 0x1c, 0x2b, 0x1a, 0xb4,\n  0xdb, 0x65, 0xe9, 0x03, 0x47, 0xae, 0x3e, 0x16, 0xcb, 0xf8, 0x88, 0xbc,\n  0x96, 0xbd, 0xf6, 0x68, 0xcf, 0xa1, 0x96, 0xdf, 0xdf, 0xe5, 0x1b, 0x8e,\n  0x8d, 0xf5, 0xf6, 0xa2, 0x82, 0x9b, 0x6e, 0x77, 0x3a, 0xcc, 0x03, 0x55,\n  0xb7, 0x63, 0xf6, 0xe6, 0x73, 0xe9, 0x2b, 0x2f, 0xfe, 0xd7, 0x4f, 0xb8,\n  0x5d, 0x07, 0xf7, 0x2f, 0xed, 0x97, 0x79, 0xcc, 0x79, 0x2a, 0x2b, 0x8a,\n  0x15, 0xbd, 0x69, 0xfd, 0x06, 0x11, 0x89, 0xf5, 0x9c, 0x02, 0x06, 0xd5,\n  0x26, 0x16, 0x04, 0x22, 0xb3, 0x41, 0x04, 0x3d, 0x6e, 0x0b, 0xce, 0xae,\n  0x6c, 0x24, 0xb1, 0xb0, 0x04, 0x6a, 0x8a, 0x8d, 0x14, 0x15, 0x79, 0xda,\n  0x03, 0x53, 0x99, 0xa2, 0xe1, 0xbe, 0x91, 0x36, 0xd8, 0x3e, 0x61, 0xb2,\n  0x7d, 0x52, 0xd9, 0x64, 0xd7, 0x29, 0x1c, 0xb4, 0x14, 0x0c, 0xea, 0x4c,\n  0xc7, 0x0e, 0xb5, 0xf4, 0x44, 0x4c, 0xe6, 0xa6, 0xb2, 0xca, 0x89, 0x62,\n  0x71, 0xc7, 0xe8, 0xf4, 0xf5, 0xfb, 0xb7, 0xef, 0xbf, 0xb6, 0x5d, 0x91,\n  0x63, 0x27, 0x28, 0x3d, 0xf4, 0xd1, 0x4a, 0xd3, 0x12, 0x6a, 0x37, 0x4a,\n  0x29, 0x08, 0x27, 0x84, 0x38, 0x87, 0xc3, 0x96, 0x70, 0x48, 0xa5, 0xa1,\n  0x5e, 0x14, 0x85, 0x1e, 0x93, 0x3d, 0x9e, 0x67, 0xec, 0x88, 0x42, 0xe5,\n  0xb0, 0x48, 0xe3, 0xf1, 0x6d, 0xc7, 0x6f, 0xec, 0xbf, 0x2e, 0xfb, 0xd7,\n  0x6b, 0xa3, 0xb5, 0xc2, 0x91, 0xa1, 0xed, 0xdb, 0x87, 0x2a, 0x62, 0xfe,\n  0xc5, 0xc5, 0x37, 0x06, 0x4e, 0xf5, 0xdc, 0x74, 0xed, 0xfe, 0x2b, 0x1a,\n  0x07, 0xc3, 0x47, 0xda, 0x77, 0x1e, 0x39, 0x30, 0xd6, 0x79, 0xbc, 0x62,\n  0x4e, 0x94, 0x1d, 0x74, 0xab, 0xaf, 0xa3, 0x67, 0xc8, 0xf3, 0xed, 0x4c,\n  0x32, 0x5d, 0x67, 0x23, 0x53, 0x03, 0xf9, 0xab, 0x60, 0x41, 0x62, 0x33,\n  0x30, 0x2b, 0xdc, 0x3c, 0x90, 0xb5, 0xd4, 0x3a, 0x61, 0x01, 0x2a, 0x66,\n  0x85, 0x43, 0x16, 0xa0, 0x58, 0x88, 0xee, 0x90, 0xc4, 0xba, 0xc0, 0x25,\n  0xf4, 0xcc, 0xbf, 0x27, 0x2b, 0x1c, 0x35, 0x66, 0x63, 0xca, 0x57, 0x3d,\n  0x5a, 0x7b, 0xc7, 0x20, 0x76, 0x0d, 0x09, 0x3f, 0x6e, 0xae, 0xe6, 0xb9,\n  0x2e, 0xb5, 0xce, 0x3b, 0xd0, 0x8d, 0x12, 0xd1, 0x90, 0x54, 0x27, 0xa9,\n  0x86, 0x3c, 0xdb, 0xc1, 0x94, 0xa6, 0x03, 0xb0, 0xcb, 0x25, 0xee, 0xc9,\n  0x89, 0x86, 0x13, 0xc4, 0x58, 0xcc, 0xb4, 0xba, 0xa4, 0x03, 0x39, 0x54,\n  0x1a, 0xa9, 0x00, 0xab, 0x12, 0x10, 0x52, 0x4f, 0xfd, 0x0c, 0x80, 0x38,\n  0x93, 0xc8, 0xee, 0x8b, 0x4d, 0xf7, 0x8d, 0x8c, 0x67, 0xcc, 0xa6, 0x69,\n  0xb3, 0xf9, 0x6a, 0x5d, 0xf7, 0xc9, 0x7e, 0x14, 0x16, 0x7e, 0xb9, 0x73,\n  0xdf, 0xc5, 0x97, 0xf6, 0x1d, 0x6b, 0x6d, 0x39, 0x3e, 0xf4, 0xc1, 0xbb,\n  0x65, 0x9d, 0xc1, 0x8c, 0x3f, 0x42, 0xf6, 0x81, 0x8f, 0x48, 0x3b, 0x75,\n  0xe9, 0x1a, 0x22, 0x32, 0x33, 0x41, 0x0d, 0x20, 0x7b, 0x65, 0x54, 0x32,\n  0x27, 0x6c, 0xa3, 0x01, 0xab, 0xb2, 0xac, 0xec, 0x2f, 0x2e, 0x8e, 0xf9,\n  0x63, 0x16, 0x8b, 0xa3, 0x02, 0x5e, 0xd5, 0x2a, 0x7a, 0xf1, 0x1d, 0x4e,\n  0x69, 0x5f, 0xd2, 0x68, 0x55, 0xb9, 0xc8, 0x08, 0x84, 0xfc, 0x5a, 0x28,\n  0xde, 0xe9, 0x87, 0x7b, 0xc2, 0x55, 0x35, 0xa3, 0xd5, 0x3b, 0x07, 0xdb,\n  0xa7, 0x6b, 0x87, 0xaf, 0x18, 0x98, 0x1c, 0xba, 0xa4, 0xa7, 0x19, 0x1d,\n  0xf4, 0x55, 0x26, 0xb6, 0xd5, 0xb6, 0x61, 0x5f, 0x4d, 0xfc, 0x70, 0xdf,\n  0xe0, 0x54, 0x4c, 0x85, 0xca, 0x77, 0xcd, 0x75, 0x9f, 0x19, 0x5b, 0xb8,\n  0x2a, 0xcd, 0xbd, 0xfc, 0x32, 0xd7, 0x7c, 0xe9, 0xde, 0x89, 0x1b, 0x8d,\n  0xb5, 0x1d, 0xc2, 0x73, 0xaa, 0xf8, 0xee, 0xbe, 0xb9, 0x7d, 0x62, 0xfc,\n  0xc2, 0xeb, 0x64, 0xbc, 0x01, 0xec, 0x25, 0xfb, 0xb6, 0x33, 0xdd, 0x1e,\n  0x20, 0xd2, 0x5b, 0x89, 0xc7, 0x69, 0xe4, 0x39, 0x35, 0x56, 0x99, 0xc4,\n  0xb8, 0x66, 0x5a, 0xd5, 0x13, 0x82, 0x51, 0x53, 0x22, 0x5b, 0x01, 0x33,\n  0x45, 0x13, 0x3b, 0x0a, 0xf1, 0xd8, 0x6e, 0x97, 0xd5, 0x52, 0xa0, 0x53,\n  0x53, 0xb5, 0x05, 0x54, 0x49, 0x2b, 0xd9, 0xcd, 0x4e, 0x6b, 0x82, 0x75,\n  0xae, 0xa9, 0x94, 0x1a, 0x8d, 0xb2, 0x12, 0xcb, 0x01, 0x8e, 0x33, 0x53,\n  0x57, 0xe3, 0xec, 0x79, 0xff, 0xdc, 0x0f, 0x77, 0x17, 0x86, 0xc3, 0x06,\n  0xa7, 0x56, 0x5f, 0x6c, 0xaf, 0x6a, 0x0a, 0x9b, 0xfb, 0x3f, 0x33, 0xf7,\n  0xd2, 0x36, 0x53, 0xc0, 0x63, 0x35, 0xea, 0x8b, 0xb1, 0xb7, 0xa3, 0xe5,\n  0xd3, 0x28, 0x24, 0xdc, 0xf4, 0xfb, 0xea, 0x6a, 0x16, 0xf5, 0xb0, 0xaa,\n  0x40, 0x5b, 0xf9, 0x53, 0xc2, 0x57, 0xd0, 0x07, 0x9e, 0x8b, 0x55, 0xa9,\n  0x7b, 0x59, 0x95, 0x5c, 0xff, 0xca, 0x8c, 0x9f, 0xc6, 0x7f, 0x65, 0x8a,\n  0x01, 0xff, 0xdb, 0x27, 0xda, 0xe1, 0xc1, 0x7b, 0xd8, 0x30, 0xc2, 0x51,\n  0x26, 0x92, 0x3f, 0xc5, 0x62, 0xda, 0xab, 0x8d, 0xcc, 0xb1, 0x93, 0x8a,\n  0x9e, 0xa2, 0x49, 0x41, 0x5a, 0x5a, 0x79, 0x7a, 0xe9, 0xa2, 0x93, 0x79,\n  0x47, 0x0f, 0xef, 0x5c, 0x32, 0x9b, 0xa7, 0xcc, 0xa6, 0xa1, 0x2b, 0x33,\n  0x93, 0x99, 0xd3, 0xdd, 0x53, 0xb5, 0xe3, 0xd5, 0xf8, 0xaf, 0x2b, 0x43,\n  0x9a, 0xfd, 0xcb, 0xbd, 0x97, 0xf4, 0x75, 0x5f, 0xda, 0xb5, 0x74, 0x55,\n  0x8b, 0xea, 0xe5, 0x97, 0xd9, 0xc6, 0xcb, 0xf6, 0x21, 0x9d, 0xf0, 0xe7,\n  0xe1, 0xc9, 0x08, 0x87, 0xbf, 0x28, 0x8e, 0xa9, 0x91, 0xec, 0xb5, 0x1f,\n  0x93, 0xbd, 0x56, 0xc6, 0xd4, 0xa7, 0xe3, 0x5a, 0x9a, 0xe8, 0xcb, 0x48,\n  0xbc, 0x99, 0x57, 0x63, 0x10, 0x3e, 0x80, 0x48, 0x31, 0x7b, 0x25, 0xa3,\n  0x1d, 0xe9, 0x53, 0xc6, 0x94, 0x85, 0xac, 0x61, 0x47, 0x28, 0xa2, 0x21,\n  0xcc, 0x06, 0x89, 0xe3, 0x09, 0x05, 0xa3, 0x21, 0x59, 0xbc, 0x07, 0x87,\n  0x89, 0x9c, 0x6c, 0x9d, 0x50, 0x24, 0xfc, 0x28, 0xfe, 0xa0, 0xbf, 0xa8,\n  0x72, 0x67, 0xfb, 0x91, 0xa0, 0xaa, 0xe4, 0x68, 0xfb, 0xce, 0xca, 0x22,\n  0xff, 0x8c, 0xbf, 0xb8, 0x35, 0x5e, 0x57, 0xbd, 0xa3, 0xae, 0xaa, 0xae,\n  0xd5, 0x57, 0x82, 0x5d, 0x7d, 0x67, 0x47, 0xc7, 0x2f, 0xef, 0x99, 0x99,\n  0xe9, 0xb9, 0x7c, 0x7c, 0xf4, 0x6c, 0x5f, 0xdf, 0xd5, 0xe3, 0x0b, 0xfb,\n  0x86, 0x1a, 0xef, 0xbb, 0xaf, 0xbd, 0x67, 0xdf, 0xc2, 0xf8, 0xd5, 0x7d,\n  0x60, 0x63, 0x7e, 0x9d, 0xca, 0x48, 0xcf, 0xcb, 0xba, 0x30, 0xd1, 0xbb,\n  0xf7, 0xe4, 0x74, 0x61, 0x7a, 0xfd, 0x4e, 0x11, 0x27, 0xa7, 0x30, 0x0f,\n  0xf7, 0x09, 0x74, 0x67, 0x29, 0x1f, 0x61, 0xbb, 0x9e, 0xc9, 0xd3, 0x9d,\n  0xc3, 0x8a, 0xee, 0xbc, 0xdd, 0x2c, 0x5e, 0xa7, 0x73, 0x41, 0xaf, 0xdf,\n  0x2b, 0x5e, 0x5f, 0x60, 0xde, 0x19, 0x2e, 0x27, 0xa5, 0x17, 0x6f, 0xe0,\n  0x0f, 0xe0, 0xf3, 0x64, 0xd1, 0x6e, 0x92, 0x70, 0xf7, 0x58, 0xb1, 0xf0,\n  0x94, 0x88, 0xbb, 0x27, 0xfe, 0x91, 0x87, 0xbb, 0x57, 0x42, 0xc6, 0x8f,\n  0x11, 0x8f, 0x97, 0x20, 0x83, 0x8e, 0x72, 0xa3, 0x88, 0x04, 0xc0, 0x07,\n  0x65, 0x24, 0x2b, 0x19, 0x1a, 0x68, 0xba, 0x49, 0x13, 0x96, 0x8d, 0x8e,\n  0x28, 0x25, 0x75, 0x2a, 0x19, 0xb1, 0xcc, 0xa4, 0x3b, 0x87, 0x26, 0x52,\n  0xa0, 0xe6, 0x68, 0xd5, 0x59, 0x1e, 0xe8, 0x82, 0x98, 0x09, 0x2f, 0x2a,\n  0xdd, 0x22, 0xe7, 0xa2, 0xc1, 0x8a, 0x10, 0xae, 0x4f, 0xe8, 0xc3, 0x4b,\n  0x71, 0xaf, 0xaf, 0xc2, 0x51, 0x55, 0xdc, 0xdc, 0xf7, 0xa5, 0xec, 0xa7,\n  0xd0, 0x4f, 0x7e, 0xfa, 0xcf, 0xfb, 0x8f, 0x1e, 0xd0, 0x15, 0x8c, 0xea,\n  0x2c, 0xb5, 0xd5, 0xe9, 0xe6, 0x46, 0xe1, 0xfd, 0x60, 0xa3, 0xfc, 0xc6,\n  0xee, 0xe9, 0xbe, 0xc5, 0x05, 0x69, 0x0e, 0xfe, 0x02, 0xf1, 0x06, 0x68,\n  0xcf, 0xe6, 0x18, 0xa7, 0x64, 0x0e, 0xc0, 0x86, 0x79, 0x00, 0x3f, 0x47,\n  0xe8, 0x48, 0x5f, 0xba, 0xdb, 0x43, 0xf4, 0x2c, 0x2f, 0xd8, 0x10, 0xc9,\n  0x91, 0x34, 0x10, 0x8e, 0xc7, 0x41, 0xb9, 0x10, 0x50, 0x20, 0x97, 0x28,\n  0xbe, 0x3c, 0x64, 0xc3, 0x54, 0x50, 0x81, 0x1f, 0x12, 0xfe, 0x2b, 0x39,\n  0x72, 0x38, 0x5d, 0x0e, 0xb3, 0x11, 0x10, 0xe7, 0x38, 0x16, 0x00, 0x51,\n  0x78, 0x9e, 0xda, 0x79, 0xa0, 0xfc, 0x4f, 0x5e, 0x3d, 0xa7, 0xfc, 0x58,\n  0x01, 0x74, 0xdf, 0xf2, 0xb5, 0x06, 0x34, 0x2b, 0x7c, 0x42, 0x75, 0xd5,\n  0x65, 0xf1, 0xe9, 0xf2, 0xd1, 0x8b, 0x4e, 0xdd, 0xd3, 0x37, 0xfe, 0xc1,\n  0x8b, 0x3a, 0xf7, 0x95, 0x85, 0x43, 0x3b, 0xf0, 0x0d, 0xa7, 0x4f, 0x8d,\n  0x5e, 0x7d, 0xb3, 0xb9, 0x60, 0xd4, 0x37, 0xfb, 0xc0, 0xf1, 0x63, 0x0f,\n  0xcc, 0xba, 0x6c, 0x23, 0x16, 0x57, 0x5e, 0x4c, 0x36, 0x7e, 0x96, 0xc8,\n  0x24, 0x0d, 0x9b, 0xda, 0xb3, 0xdf, 0x81, 0x0d, 0x08, 0xf2, 0x9f, 0x99,\n  0x27, 0x69, 0x9f, 0x2a, 0x4a, 0x43, 0x09, 0x55, 0x62, 0xaf, 0x25, 0xeb,\n  0x1f, 0x62, 0x2a, 0xd1, 0xa4, 0xe8, 0xf9, 0xd2, 0x11, 0x89, 0x86, 0x67,\n  0xc5, 0x1d, 0x30, 0xfc, 0x98, 0x51, 0xba, 0xa2, 0x56, 0xae, 0x58, 0x37,\n  0xb4, 0xb1, 0xaf, 0x6b, 0x23, 0xff, 0xc1, 0xc1, 0xbe, 0x21, 0xff, 0xc4,\n  0xfb, 0x82, 0x24, 0xc3, 0x23, 0x96, 0x3f, 0xc4, 0x48, 0xb6, 0xca, 0xc8,\n  0x08, 0xb5, 0x47, 0x2f, 0x70, 0xf2, 0xd6, 0x11, 0x9f, 0x56, 0x01, 0xed,\n  0xd4, 0x6b, 0xda, 0x31, 0x90, 0xe6, 0x21, 0x36, 0x93, 0x0a, 0x25, 0xe6,\n  0xba, 0x58, 0xdf, 0xe1, 0xad, 0xed, 0xff, 0xd7, 0x5b, 0xa7, 0x63, 0x9b,\n  0xb6, 0xa6, 0x9a, 0xde, 0xba, 0xcd, 0x0c, 0x65, 0x47, 0x9c, 0x60, 0x61,\n  0x8a, 0x94, 0x16, 0x79, 0x3d, 0x84, 0x54, 0x9b, 0x4d, 0xa2, 0xe0, 0x01,\n  0xfb, 0xd9, 0x99, 0x4b, 0xf2, 0x4a, 0x11, 0x25, 0x37, 0x60, 0x49, 0xe4,\n  0xf0, 0x62, 0x8d, 0x98, 0x37, 0xe2, 0xb0, 0x6c, 0x89, 0xe9, 0xb2, 0x04,\n  0x8d, 0xfa, 0x22, 0x73, 0x71, 0xd0, 0xa6, 0xd1, 0x38, 0x8b, 0x8c, 0x68,\n  0x47, 0xcb, 0xa1, 0xcb, 0x13, 0xef, 0xba, 0xf9, 0xfe, 0xcf, 0xe8, 0x9c,\n  0x0e, 0xbd, 0x21, 0xd2, 0x81, 0x9e, 0xee, 0xd8, 0x3d, 0xbd, 0x67, 0xb1,\n  0x56, 0xcf, 0xab, 0x86, 0x55, 0x7c, 0xcd, 0x60, 0x34, 0x76, 0xd7, 0xd7,\n  0x8e, 0x0b, 0x3f, 0x6c, 0x98, 0x6d, 0x9a, 0x3b, 0x89, 0xaf, 0x18, 0xfa,\n  0xe4, 0x3d, 0xf5, 0xdd, 0x73, 0xb5, 0xd3, 0x9d, 0xdd, 0xbd, 0x8d, 0x32,\n  0x86, 0x27, 0xfb, 0x3e, 0x8a, 0xc7, 0x50, 0x24, 0xd9, 0x42, 0x34, 0x48,\n  0xc5, 0x23, 0x15, 0xad, 0x61, 0x1d, 0x81, 0x48, 0x26, 0x6e, 0x8f, 0x56,\n  0x8d, 0xc9, 0xdb, 0x70, 0x84, 0x40, 0x02, 0x74, 0x22, 0x85, 0x62, 0x20,\n  0x02, 0xb9, 0xc5, 0xa2, 0xe3, 0x8b, 0xc4, 0xe4, 0x60, 0xf2, 0x95, 0x1b,\n  0x6f, 0xc0, 0xa2, 0x8c, 0x75, 0x61, 0x06, 0xd5, 0xed, 0x6a, 0x86, 0xf1,\n  0xdd, 0xf4, 0x80, 0xf0, 0x7d, 0x74, 0x5b, 0xc7, 0xec, 0xf4, 0x9e, 0x7d,\n  0xb5, 0xf8, 0xbc, 0xf0, 0x43, 0x28, 0xd8, 0x47, 0x87, 0x04, 0xa8, 0x0c,\n  0x23, 0x74, 0x34, 0x62, 0xbc, 0xf2, 0x07, 0xe8, 0x58, 0xaa, 0xd2, 0xe5,\n  0x92, 0x17, 0x7f, 0x09, 0xb4, 0x67, 0xf5, 0x3c, 0x64, 0x2c, 0x45, 0xa8,\n  0x5d, 0x35, 0x4a, 0xf9, 0x07, 0x85, 0x83, 0x08, 0x59, 0x03, 0x16, 0x0d,\n  0x19, 0x03, 0x92, 0x0e, 0x3e, 0xa1, 0x01, 0x0a, 0x31, 0x40, 0xc2, 0xeb,\n  0x5f, 0x5b, 0x3c, 0x3c, 0x93, 0xea, 0x79, 0x7a, 0xe6, 0x01, 0x7c, 0x7e,\n  0xfc, 0x1b, 0xb3, 0xd9, 0x55, 0xe6, 0xf5, 0xe6, 0x94, 0xf0, 0x01, 0x7c,\n  0xf9, 0xb8, 0xec, 0x1f, 0x58, 0xa6, 0x67, 0xfe, 0xf3, 0xd2, 0x99, 0xff,\n  0xfd, 0x86, 0x18, 0x72, 0x3d, 0x39, 0xf3, 0x27, 0xd8, 0x07, 0x89, 0x3e,\n  0x1d, 0x83, 0x2a, 0x60, 0x21, 0x9f, 0x93, 0x55, 0xa9, 0x1d, 0x10, 0xfd,\n  0x95, 0xd1, 0xe4, 0xa2, 0x23, 0x08, 0x2f, 0x3e, 0xa4, 0xe5, 0x31, 0x8c,\n  0x4f, 0xc6, 0xf8, 0x20, 0x47, 0xde, 0x68, 0x64, 0x18, 0x63, 0xcc, 0x18,\n  0xf3, 0x17, 0x13, 0x59, 0xb7, 0x50, 0x8a, 0x99, 0xd0, 0xf1, 0x44, 0xda,\n  0x5d, 0x13, 0x2f, 0xe1, 0x64, 0x8d, 0x38, 0xaf, 0x2a, 0x20, 0xca, 0xd5,\n  0x0b, 0x44, 0x7f, 0xe3, 0xa7, 0xe6, 0xf7, 0x4e, 0xa8, 0xb6, 0xa9, 0x6a,\n  0xea, 0xab, 0x93, 0xaa, 0xf3, 0x2f, 0x95, 0x74, 0x4e, 0xf7, 0x14, 0xc5,\n  0x6d, 0xb6, 0x6a, 0x77, 0x63, 0x67, 0x91, 0xf0, 0x87, 0x7d, 0xdf, 0x54,\n  0x19, 0x55, 0x1c, 0x57, 0xc0, 0x7d, 0x9a, 0x7d, 0x70, 0x78, 0x24, 0x93,\n  0x69, 0x08, 0x47, 0xeb, 0x7f, 0x29, 0xa0, 0xfe, 0xf9, 0x1a, 0x0d, 0x9f,\n  0xd5, 0xea, 0x89, 0xdc, 0x61, 0x15, 0xce, 0xe8, 0xfc, 0x46, 0xbd, 0x5f,\n  0x87, 0x6e, 0x95, 0xf3, 0x11, 0x7b, 0xa8, 0xdf, 0x45, 0xcf, 0x84, 0xc8,\n  0x69, 0x00, 0xb7, 0x23, 0xf0, 0xbf, 0x08, 0x95, 0xcf, 0xf7, 0xc0, 0x7a,\n  0x47, 0x99, 0x51, 0x11, 0x70, 0x5a, 0x4d, 0x66, 0x35, 0x40, 0x2b, 0x7f,\n  0x88, 0xcb, 0x8b, 0x2f, 0x7b, 0x71, 0xf6, 0x67, 0x33, 0x68, 0x7f, 0xf6,\n  0xe9, 0xa7, 0x21, 0x97, 0x19, 0x5f, 0xbe, 0xd1, 0xff, 0x29, 0xe1, 0xc1,\n  0xd6, 0x4b, 0x78, 0xb0, 0xf1, 0x74, 0x35, 0xb9, 0x42, 0x34, 0x67, 0xd5,\n  0x92, 0xec, 0x36, 0xa1, 0x0f, 0x62, 0xe7, 0x21, 0xf7, 0x3f, 0xca, 0x92,\n  0x45, 0x84, 0x54, 0x2b, 0xd2, 0xb6, 0x80, 0x6c, 0x25, 0x9e, 0xa7, 0xce,\n  0x1c, 0x7b, 0xc0, 0x2e, 0xef, 0xa3, 0xa8, 0xb2, 0x87, 0xd0, 0x83, 0xc2,\n  0xe3, 0xcb, 0x87, 0x4f, 0x57, 0x9f, 0xbe, 0xf5, 0xcc, 0xb1, 0x3d, 0xa3,\n  0x93, 0x4b, 0xf3, 0x00, 0x6e, 0x9d, 0xdc, 0xd5, 0xb2, 0xf7, 0x38, 0xdd,\n  0x37, 0xeb, 0xfd, 0xae, 0x32, 0x3d, 0x87, 0xbf, 0x81, 0x9e, 0x93, 0x51,\n  0xa8, 0xc9, 0x7b, 0x7f, 0x98, 0xc6, 0xc1, 0x3b, 0x65, 0x7b, 0x1f, 0xda,\n  0xce, 0x40, 0x4a, 0x2a, 0xb8, 0xc1, 0x22, 0x23, 0x3c, 0xd4, 0xab, 0xa4,\n  0x87, 0x97, 0x6e, 0x2e, 0xa7, 0xc3, 0x62, 0x56, 0xe2, 0xe1, 0xb5, 0x3c,\n  0x08, 0x28, 0x09, 0x91, 0xbd, 0x58, 0x12, 0xed, 0x6c, 0xca, 0x19, 0x32,\n  0xb2, 0x7c, 0x00, 0x77, 0xed, 0x9a, 0x14, 0xec, 0x93, 0xa9, 0xd2, 0xce,\n  0xba, 0x12, 0xee, 0x4f, 0x9f, 0xe0, 0xfc, 0x35, 0x4d, 0x25, 0x68, 0x04,\n  0x26, 0x47, 0xf8, 0xcb, 0xd3, 0x4f, 0xa3, 0x82, 0xf6, 0x0f, 0x3c, 0xf4,\n  0xf0, 0xd8, 0x44, 0xf3, 0x5d, 0xef, 0xbf, 0xbd, 0x61, 0xa3, 0x7f, 0x14,\n  0xe6, 0x9e, 0x9c, 0x3b, 0x32, 0x66, 0xa2, 0x73, 0x87, 0xd3, 0x41, 0x53,\n  0x81, 0x56, 0xcd, 0xaa, 0x88, 0x0e, 0x97, 0xc1, 0xe0, 0xa0, 0x8d, 0x8c,\n  0x50, 0x8b, 0x03, 0x99, 0xa4, 0x42, 0xf8, 0x67, 0x81, 0xd5, 0x40, 0x28,\n  0x01, 0xc3, 0x20, 0xdf, 0x51, 0x08, 0x81, 0x3f, 0x38, 0x84, 0x4a, 0x84,\n  0x57, 0x17, 0x91, 0x65, 0x12, 0x59, 0x16, 0x85, 0x57, 0x51, 0xf1, 0x92,\n  0xf0, 0x9f, 0x93, 0xc2, 0x2b, 0x4b, 0xe8, 0x38, 0xda, 0x25, 0x7c, 0x0a,\n  0xcd, 0x88, 0x5f, 0xc2, 0x1d, 0x68, 0x59, 0x78, 0x2f, 0x7c, 0x51, 0xdf,\n  0x05, 0xd9, 0xcf, 0x0e, 0x1a, 0x1b, 0x97, 0x4e, 0xb7, 0x85, 0x10, 0x04,\n  0x69, 0x60, 0x56, 0xac, 0xd5, 0x42, 0x74, 0xf0, 0x4c, 0x29, 0xa1, 0xc5,\n  0xc3, 0x00, 0x58, 0x2f, 0x41, 0x84, 0xc9, 0x7c, 0x4c, 0x0a, 0xf1, 0x22,\n  0x34, 0x2c, 0x5c, 0x1a, 0x28, 0x0d, 0x97, 0xd1, 0xe1, 0xac, 0xab, 0x87,\n  0xb2, 0x35, 0x02, 0x3d, 0xe6, 0x67, 0x47, 0x66, 0xe6, 0xee, 0xb8, 0xa3,\n  0xf9, 0x50, 0x55, 0xcd, 0xf1, 0xf8, 0x9e, 0x7d, 0xa7, 0x0e, 0x1e, 0x58,\n  0x58, 0x3e, 0x34, 0x9e, 0xee, 0xce, 0x96, 0x57, 0x94, 0x5f, 0x31, 0x72,\n  0xea, 0x52, 0x1c, 0x1a, 0xdc, 0x59, 0xc0, 0x15, 0x4c, 0xf7, 0xcf, 0x9d,\n  0xb6, 0x38, 0xb6, 0x39, 0xdc, 0x03, 0x5d, 0x3d, 0xed, 0xc3, 0xfd, 0xad,\n  0x0d, 0xcd, 0x41, 0x6f, 0x9b, 0xbf, 0x62, 0x91, 0xa1, 0xf5, 0x32, 0xf0,\n  0xc7, 0x28, 0x5d, 0xf0, 0xa5, 0x3d, 0x66, 0xa5, 0x96, 0x69, 0x84, 0x56,\n  0xf2, 0x24, 0x4b, 0xe6, 0xb4, 0x38, 0xcd, 0x1c, 0x4f, 0x4b, 0xae, 0x81,\n  0xfc, 0x98, 0x40, 0x09, 0xd1, 0x88, 0x9d, 0x22, 0xc4, 0x75, 0xef, 0x0e,\n  0x10, 0xf8, 0xd0, 0xcd, 0x8b, 0x3b, 0x88, 0xf8, 0xc7, 0x09, 0xa7, 0x17,\n  0x09, 0xf5, 0xb9, 0x34, 0xb0, 0xad, 0xc7, 0x8c, 0xc7, 0x56, 0x1a, 0xd0,\n  0xf5, 0xe1, 0x1d, 0x7d, 0xa6, 0x95, 0xcf, 0x90, 0x3d, 0x42, 0x9f, 0x41,\n  0xcf, 0x7a, 0x80, 0x69, 0x4a, 0x37, 0x14, 0x23, 0x35, 0x91, 0x16, 0xf3,\n  0x4e, 0x39, 0xd9, 0x22, 0x87, 0x40, 0x63, 0x20, 0xbb, 0x85, 0x9c, 0xe0,\n  0xa8, 0x7a, 0x14, 0x52, 0x3b, 0x20, 0x73, 0xc1, 0x64, 0x94, 0x0e, 0xb7,\n  0x76, 0xc3, 0xe1, 0x56, 0x6d, 0x32, 0x1e, 0x3c, 0xb0, 0xe6, 0x58, 0x0b,\n  0x47, 0xd7, 0x8f, 0x2f, 0xff, 0x34, 0x6f, 0x1c, 0xa8, 0xe2, 0x3f, 0x5d,\n  0x26, 0xf3, 0xa1, 0x03, 0xfb, 0xa9, 0x8e, 0xc7, 0x72, 0x0c, 0x1b, 0xe1,\n  0x3d, 0x48, 0x3c, 0xc5, 0xb4, 0xf2, 0x27, 0x99, 0x91, 0x00, 0xdd, 0x2b,\n  0x74, 0xdb, 0xe0, 0xe5, 0x23, 0xc2, 0x3f, 0xcd, 0xcc, 0xa0, 0x96, 0x03,\n  0xc2, 0x79, 0xd8, 0x10, 0x64, 0x1e, 0x60, 0x8b, 0x3c, 0x40, 0xeb, 0x9a,\n  0xbe, 0x8e, 0xf7, 0x51, 0x9f, 0xdb, 0x44, 0x5a, 0x47, 0xd4, 0x0c, 0xa8,\n  0x52, 0xc0, 0xca, 0x59, 0xa8, 0x0e, 0xb9, 0xce, 0x4a, 0x44, 0xd4, 0x4e,\n  0x25, 0x3a, 0x01, 0xf5, 0xc1, 0x73, 0x1f, 0x90, 0x4b, 0x8a, 0xc1, 0xbc,\n  0x12, 0x8f, 0x66, 0xbf, 0xe8, 0x0c, 0x47, 0x2d, 0x66, 0x15, 0x2f, 0x66,\n  0x36, 0x51, 0x06, 0x16, 0x5a, 0xc7, 0xe1, 0xf0, 0xbe, 0x99, 0x5f, 0x6b,\n  0x1d, 0x94, 0x65, 0x91, 0xe9, 0x31, 0x00, 0x4b, 0x0b, 0xd9, 0x78, 0x8d,\n  0xd3, 0x6b, 0x44, 0x37, 0x2a, 0x7c, 0x8a, 0xf2, 0xb0, 0xf8, 0x60, 0x69,\n  0xe4, 0xee, 0x67, 0x8e, 0x6f, 0xed, 0x07, 0x57, 0xe2, 0x0a, 0xd6, 0xfb,\n  0x9a, 0xa5, 0xcf, 0x2f, 0xa3, 0xb4, 0xe0, 0xe8, 0x46, 0xbf, 0xb0, 0x8c,\n  0x89, 0x48, 0xe5, 0xa5, 0x08, 0xc3, 0xac, 0xf7, 0xc9, 0x42, 0x9d, 0x5b,\n  0xe0, 0x01, 0x64, 0x6e, 0x3c, 0xc0, 0x93, 0xec, 0x26, 0x2d, 0x99, 0x66,\n  0x0d, 0x15, 0x60, 0x28, 0x3c, 0x48, 0x24, 0xff, 0x74, 0x90, 0xef, 0x1e,\n  0xc6, 0x63, 0x0d, 0x97, 0xaa, 0x60, 0x27, 0x6c, 0x49, 0xd8, 0xf1, 0x89,\n  0xad, 0x49, 0x39, 0x59, 0x94, 0xad, 0x28, 0xb8, 0x28, 0xdb, 0x81, 0x3f,\n  0x98, 0xbc, 0xcb, 0xc5, 0x74, 0xac, 0xeb, 0x7d, 0xa7, 0x40, 0xdf, 0xff,\n  0x8d, 0xd2, 0xf7, 0xb2, 0x74, 0x04, 0x0c, 0xc2, 0x3b, 0x38, 0xba, 0x29,\n  0x68, 0x19, 0x1f, 0x42, 0x0b, 0x11, 0x8a, 0x52, 0x23, 0xab, 0x9e, 0xd1,\n  0x53, 0xda, 0xc6, 0x93, 0xf5, 0x09, 0x03, 0x65, 0x93, 0x78, 0x38, 0xfe,\n  0xb7, 0xc9, 0x95, 0x97, 0x81, 0xca, 0x8f, 0x09, 0xaf, 0x4b, 0x74, 0x7e,\n  0x05, 0xca, 0xd6, 0x8c, 0x43, 0x18, 0x1d, 0x3d, 0x7f, 0xe4, 0xbe, 0x60,\n  0x1c, 0xc7, 0xe0, 0x37, 0xcf, 0x48, 0x46, 0xa7, 0x43, 0xe2, 0x43, 0xa8,\n  0x51, 0x73, 0xd4, 0x1a, 0xb2, 0x86, 0xe4, 0x75, 0x57, 0xaf, 0xc9, 0xe6,\n  0x48, 0x11, 0x2e, 0x92, 0x9d, 0x69, 0xde, 0xdf, 0xbe, 0x78, 0x6c, 0xa6,\n  0xad, 0xa7, 0x65, 0xae, 0x65, 0x06, 0x85, 0x6d, 0xee, 0xdd, 0xd3, 0xc8,\n  0x27, 0xbc, 0xd6, 0xdc, 0xe4, 0xb0, 0xa2, 0x19, 0x79, 0x6f, 0xb3, 0x8f,\n  0xd0, 0x77, 0x20, 0x7b, 0x9b, 0xd6, 0x9b, 0x8f, 0xe4, 0x82, 0x58, 0xd6,\n  0xf2, 0x27, 0x79, 0xd8, 0xe4, 0x8b, 0x7d, 0xe4, 0xad, 0x27, 0x67, 0x90,\n  0x6f, 0x06, 0x15, 0xef, 0x92, 0xc6, 0x4d, 0x79, 0x94, 0x38, 0x27, 0xec,\n  0x9f, 0x29, 0xed, 0x07, 0x99, 0x02, 0xe6, 0x84, 0xda, 0xc8, 0x22, 0x23,\n  0xa2, 0xb3, 0x38, 0x6f, 0x56, 0xf2, 0x32, 0xa0, 0x78, 0xdf, 0x9a, 0x79,\n  0x81, 0x2f, 0xf6, 0xcf, 0x93, 0x6f, 0x3d, 0x33, 0x83, 0x1c, 0xbb, 0x90,\n  0x73, 0x26, 0x6f, 0x7a, 0xc4, 0x29, 0x22, 0x04, 0x42, 0x43, 0xbe, 0x5d,\n  0xb3, 0x09, 0xef, 0x93, 0xac, 0x98, 0x17, 0xe4, 0x7d, 0x50, 0x15, 0x60,\n  0x03, 0xef, 0xfb, 0xcc, 0xa7, 0x56, 0x2f, 0x5a, 0x3c, 0x15, 0xbf, 0xfc,\n  0xba, 0xab, 0x4e, 0x4d, 0x6d, 0x9b, 0xd9, 0x7d, 0x80, 0x68, 0x2d, 0x92,\n  0xd8, 0x24, 0x8a, 0x4c, 0x0c, 0xb5, 0x16, 0xe1, 0xbf, 0xd1, 0xf9, 0x32,\n  0x31, 0x2e, 0xb0, 0xc0, 0x91, 0x77, 0x56, 0xab, 0x90, 0x7a, 0x89, 0x15,\n  0xe5, 0x37, 0x22, 0x95, 0xee, 0x11, 0xa3, 0xcc, 0x08, 0xa1, 0x84, 0x48,\n  0x3c, 0x97, 0xa3, 0xd0, 0x2c, 0x82, 0xfb, 0x92, 0x3e, 0xba, 0x00, 0x79,\n  0x59, 0x11, 0xe1, 0x45, 0x7e, 0x38, 0xbc, 0x6c, 0x9e, 0x00, 0x77, 0x6c,\n  0xf1, 0x64, 0xfc, 0xb2, 0xeb, 0xd1, 0xe1, 0x99, 0x95, 0xaf, 0x5d, 0x34,\n  0xb9, 0x2d, 0x3b, 0x0b, 0xf4, 0x53, 0x12, 0x26, 0xcf, 0xaf, 0x34, 0x64,\n  0xba, 0xba, 0x7b, 0x53, 0x0a, 0xef, 0x1f, 0xa3, 0xe3, 0xb0, 0x82, 0xc5,\n  0x8d, 0x8c, 0x82, 0x70, 0x17, 0x0a, 0x31, 0x48, 0xe9, 0x86, 0x88, 0x31,\n  0x43, 0xd9, 0xab, 0x15, 0x52, 0x25, 0xe8, 0xa3, 0xd5, 0xeb, 0x1e, 0x4d,\n  0xde, 0x5b, 0x7a, 0xea, 0xb9, 0xc5, 0xd3, 0xf5, 0x67, 0xaf, 0xbb, 0xf3,\n  0xa6, 0xcf, 0xee, 0x99, 0xbd, 0x42, 0x79, 0xe0, 0xc8, 0xf5, 0x54, 0x66,\n  0x45, 0x4c, 0x31, 0x39, 0x07, 0x2d, 0x84, 0x8f, 0x15, 0x83, 0x2e, 0xc6,\n  0x01, 0x5e, 0x01, 0x52, 0x31, 0x56, 0x5a, 0xdd, 0x06, 0xb3, 0x4a, 0x75,\n  0x9b, 0x25, 0xa5, 0xee, 0x77, 0x45, 0x3e, 0x6d, 0x02, 0x80, 0x05, 0x8f,\n  0xdb, 0x69, 0x37, 0x1b, 0x89, 0xf4, 0x4d, 0xb4, 0x49, 0xd0, 0xc5, 0xac,\n  0x0a, 0xb7, 0x92, 0x34, 0x7e, 0xe5, 0xdc, 0x06, 0x92, 0x81, 0x48, 0xe4,\n  0x95, 0xba, 0x6d, 0x81, 0x70, 0xd9, 0x72, 0xe3, 0xc9, 0x7b, 0x87, 0x32,\n  0xef, 0x3f, 0xd5, 0x3e, 0x59, 0x5e, 0x3e, 0x59, 0x7b, 0xcd, 0x75, 0x9c,\n  0xf0, 0x00, 0x9a, 0xd1, 0x5d, 0x83, 0x6f, 0x70, 0x9a, 0x86, 0x6d, 0x8e,\n  0xd9, 0x8f, 0x1f, 0xb8, 0xe4, 0xe1, 0x59, 0xa3, 0x69, 0x54, 0x6f, 0xb9,\n  0xf9, 0xec, 0xd8, 0xb1, 0xcb, 0x45, 0x3c, 0x90, 0x37, 0xd8, 0x5f, 0x12,\n  0x9d, 0x11, 0xb2, 0x13, 0x6e, 0x11, 0xa9, 0xa9, 0x9f, 0x1c, 0x5a, 0x60,\n  0x2d, 0x4b, 0x14, 0xaa, 0x54, 0x12, 0xbf, 0x40, 0xbb, 0xc0, 0x48, 0xd6,\n  0x41, 0xdc, 0x34, 0xf5, 0x5f, 0x6e, 0x46, 0x1b, 0xf0, 0xbc, 0xcc, 0x8b,\n  0xf3, 0x9b, 0xa6, 0xa3, 0x5b, 0xb5, 0x22, 0x33, 0x2d, 0x36, 0x65, 0x24,\n  0xd5, 0x23, 0xad, 0x2f, 0x0d, 0x87, 0xc8, 0xce, 0xb6, 0x86, 0x34, 0x7c,\n  0xb1, 0x12, 0x3d, 0x15, 0x0d, 0x51, 0xe6, 0x90, 0x80, 0xda, 0x7b, 0x6b,\n  0x63, 0xa8, 0xd8, 0x5f, 0xf6, 0xdf, 0x7a, 0xf0, 0xc0, 0x2d, 0x43, 0xdc,\n  0x43, 0x33, 0x33, 0x8f, 0xf0, 0x43, 0x37, 0xed, 0x5d, 0xba, 0x6d, 0x70,\n  0xe5, 0xa5, 0xc3, 0x27, 0x2f, 0x39, 0xbc, 0x7c, 0xea, 0xd4, 0x11, 0x1a,\n  0x41, 0xb5, 0xe3, 0x03, 0x87, 0x84, 0xcf, 0xc3, 0xda, 0xcc, 0xdf, 0x36,\n  0xa2, 0xc4, 0x51, 0x7d, 0x80, 0xee, 0x05, 0xa8, 0x43, 0x54, 0x2c, 0xe5,\n  0x99, 0x53, 0x79, 0x8b, 0x55, 0x21, 0xc8, 0x08, 0x44, 0x2c, 0xa3, 0x82,\n  0x38, 0x23, 0x4e, 0x3a, 0x12, 0x12, 0x2b, 0x21, 0x12, 0x97, 0xdd, 0x62,\n  0x22, 0xad, 0x8d, 0x96, 0x28, 0x3d, 0x0d, 0x88, 0x0d, 0x59, 0xc5, 0x48,\n  0x71, 0x60, 0x9c, 0x16, 0xa9, 0x1c, 0x66, 0x02, 0x35, 0x7e, 0xf9, 0xd0,\n  0xb7, 0x22, 0xdd, 0xe5, 0xe7, 0x6e, 0xf8, 0xd6, 0xcc, 0x91, 0x9d, 0xbb,\n  0xa6, 0x67, 0x0f, 0xa2, 0x98, 0xf0, 0x13, 0xd4, 0x68, 0xa8, 0x1e, 0xef,\n  0x58, 0x58, 0x22, 0x4c, 0x32, 0x86, 0x76, 0xb6, 0xf4, 0x74, 0x0d, 0xe4,\n  0xe1, 0xfc, 0x06, 0x08, 0x6d, 0xec, 0xa1, 0x63, 0x6a, 0x22, 0x7b, 0x26,\n  0x80, 0x57, 0x88, 0x96, 0x53, 0x01, 0xe7, 0x33, 0x6a, 0xa4, 0xa0, 0x44,\n  0x64, 0x8b, 0x00, 0xd4, 0x22, 0x04, 0x63, 0x52, 0x32, 0x46, 0xb7, 0x4b,\n  0x25, 0x1a, 0x2d, 0xf6, 0x95, 0x06, 0x7d, 0x15, 0xc5, 0x15, 0x20, 0xbb,\n  0xab, 0x60, 0x83, 0xd4, 0x37, 0xa4, 0x20, 0x40, 0x97, 0x70, 0x32, 0x35,\n  0xc5, 0xa1, 0x12, 0x43, 0x2e, 0x61, 0x16, 0x9d, 0xf2, 0x9c, 0xa9, 0x79,\n  0x5b, 0x31, 0x6e, 0x5a, 0x3e, 0xdd, 0x79, 0x65, 0x83, 0x29, 0x34, 0x3d,\n  0xe9, 0xef, 0xcc, 0xa8, 0xd4, 0xc6, 0x78, 0x6f, 0xe5, 0xc1, 0xe5, 0xf6,\n  0x63, 0x83, 0xc7, 0xaf, 0xff, 0x7b, 0xe7, 0x78, 0x5b, 0x5f, 0xe5, 0x40,\n  0xad, 0xce, 0x18, 0xea, 0x40, 0x5d, 0x8f, 0x7d, 0xc3, 0x6d, 0x74, 0x68,\n  0x47, 0x54, 0x26, 0x13, 0x6f, 0x3c, 0x7c, 0x91, 0x35, 0x56, 0x74, 0xee,\n  0x70, 0xf6, 0xd2, 0x96, 0x87, 0x17, 0x76, 0x1c, 0xd8, 0x36, 0x1f, 0xad,\n  0xb3, 0xc4, 0x67, 0x07, 0x2b, 0x44, 0x9f, 0xde, 0x4e, 0x1a, 0x47, 0x07,\n  0xb6, 0x62, 0x17, 0xf8, 0xab, 0xd3, 0x95, 0xac, 0x52, 0xd3, 0x1a, 0xdc,\n  0x24, 0x32, 0x56, 0x43, 0x8c, 0x62, 0x3a, 0xcf, 0x8b, 0x34, 0x32, 0x10,\n  0x0a, 0x84, 0x03, 0xeb, 0xc5, 0xb4, 0x10, 0x3d, 0x66, 0x80, 0xe1, 0x0c,\n  0xca, 0x92, 0x53, 0xfa, 0xd9, 0x80, 0xb9, 0xd6, 0x9a, 0xba, 0xa1, 0xfd,\n  0xa7, 0x5e, 0xfe, 0x5d, 0xd3, 0xae, 0x64, 0x36, 0xd5, 0x7e, 0xf3, 0x65,\n  0x37, 0x98, 0xfa, 0x7a, 0xae, 0xbb, 0xa1, 0xab, 0x0f, 0xdd, 0x59, 0xd7,\n  0xa8, 0xe3, 0xf8, 0xa6, 0xd6, 0x9e, 0x2c, 0x76, 0xb9, 0x5b, 0xda, 0x23,\n  0xa1, 0xbb, 0x3f, 0x5a, 0x1d, 0xfb, 0x74, 0x34, 0x97, 0xeb, 0xf5, 0x21,\n  0x32, 0x2e, 0x15, 0xd0, 0x69, 0x25, 0x7a, 0x31, 0x36, 0xa2, 0x90, 0x53,\n  0x31, 0x7e, 0x91, 0x77, 0x51, 0x6b, 0x31, 0x91, 0x57, 0x3f, 0xf4, 0xc7,\n  0x69, 0xb0, 0x08, 0xd7, 0x61, 0x17, 0x5d, 0x0f, 0xeb, 0x6a, 0x1f, 0x8e,\n  0x93, 0xdf, 0xc1, 0x57, 0xb9, 0x51, 0x26, 0x8f, 0xad, 0x97, 0xc9, 0x6d,\n  0x56, 0x51, 0xce, 0xda, 0x4c, 0x26, 0x87, 0x85, 0x01, 0x19, 0x23, 0x81,\n  0x7e, 0x33, 0xba, 0x53, 0xb8, 0x65, 0x47, 0x45, 0x6f, 0x2f, 0xfa, 0xc6,\n  0x19, 0x2e, 0x98, 0x0c, 0xbd, 0x8e, 0x5d, 0x42, 0x9d, 0xf0, 0xd6, 0x53,\n  0x4f, 0x11, 0x41, 0xe5, 0xcf, 0x57, 0xf6, 0xf6, 0xdc, 0x79, 0x7d, 0x6d,\n  0x0e, 0x1b, 0x14, 0xfc, 0x36, 0x03, 0xb2, 0x2c, 0x8e, 0x5f, 0xa5, 0xfe,\n  0xaf, 0xca, 0x74, 0x99, 0xd9, 0xa0, 0xe3, 0x39, 0xa4, 0x66, 0x60, 0x77,\n  0xa8, 0x38, 0xc2, 0x22, 0x62, 0x23, 0x54, 0x28, 0xa7, 0x1b, 0x95, 0x34,\n  0xb1, 0x50, 0x99, 0x1c, 0x58, 0x27, 0x62, 0xad, 0x21, 0x96, 0xbc, 0x1a,\n  0xd9, 0xad, 0x6c, 0xc2, 0x4a, 0xc6, 0x63, 0xc5, 0x3f, 0xf9, 0xc5, 0x6b,\n  0x8b, 0xaf, 0x6c, 0x7b, 0x65, 0xf1, 0xb5, 0x5f, 0xec, 0xf9, 0xe9, 0xb6,\n  0xe7, 0xc9, 0xd3, 0xdf, 0x12, 0x7e, 0x8f, 0xcc, 0xc2, 0x6b, 0xf4, 0xcb,\n  0x46, 0xe4, 0xbb, 0xb7, 0xc4, 0x2f, 0x71, 0x0e, 0x03, 0x64, 0x8f, 0xfe,\n  0x13, 0xf5, 0xe1, 0x0f, 0xa5, 0xfb, 0xa3, 0x84, 0x86, 0x45, 0xa4, 0x7a,\n  0x85, 0x40, 0xc7, 0x2c, 0xb4, 0x5e, 0xa1, 0x54, 0xa6, 0x70, 0x89, 0x9a,\n  0x7d, 0x81, 0xa0, 0x55, 0x8d, 0x30, 0xb9, 0x6d, 0x8a, 0x98, 0xd2, 0x60,\n  0x71, 0x91, 0xd7, 0xed, 0xb0, 0x99, 0x0c, 0xb4, 0x58, 0x21, 0x9f, 0x2b,\n  0x56, 0x08, 0x11, 0x5c, 0x6b, 0x84, 0xf3, 0x75, 0xb2, 0xf9, 0xaf, 0x67,\n  0x8f, 0x36, 0xd4, 0x94, 0x34, 0x04, 0x8e, 0x9f, 0x6e, 0x9e, 0xf3, 0x07,\n  0x77, 0xa7, 0x5a, 0xb7, 0xbf, 0x7f, 0xa0, 0xb9, 0x77, 0x7b, 0x47, 0x4b,\n  0x65, 0x77, 0xcc, 0xbf, 0x03, 0x07, 0x07, 0x7b, 0xe2, 0x4d, 0x06, 0x4e,\n  0x5b, 0x52, 0x5f, 0xd6, 0xbd, 0xcb, 0x0a, 0x85, 0x27, 0xca, 0xea, 0x66,\n  0x06, 0xc2, 0x55, 0x91, 0x88, 0xc5, 0xd2, 0x17, 0xce, 0xe1, 0xa6, 0x55,\n  0xd1, 0x79, 0x23, 0x72, 0x39, 0x64, 0x37, 0x30, 0x31, 0x8a, 0xc4, 0x24,\n  0x6e, 0x00, 0x32, 0x55, 0x0e, 0x8b, 0x03, 0x64, 0x21, 0x2b, 0x15, 0x83,\n  0x15, 0x29, 0x18, 0x85, 0x2c, 0x0f, 0x92, 0xc3, 0x87, 0xfc, 0x47, 0xb6,\n  0x11, 0xe9, 0x5a, 0xf8, 0xcd, 0x51, 0x32, 0x4f, 0x5f, 0x2e, 0xa8, 0xad,\n  0x35, 0xa2, 0x7f, 0x59, 0x79, 0x05, 0xb5, 0x9a, 0xeb, 0x13, 0x06, 0x21,\n  0x4d, 0xb7, 0x89, 0x88, 0x97, 0x45, 0x9e, 0xf1, 0x06, 0x59, 0x7b, 0x3f,\n  0xd4, 0x4e, 0x5a, 0x27, 0x91, 0x13, 0xbd, 0x9b, 0xe3, 0x62, 0x34, 0x4d,\n  0x25, 0xaa, 0x12, 0x75, 0x6e, 0xbf, 0xd1, 0x5f, 0xec, 0xa3, 0x90, 0x91,\n  0x5b, 0xe9, 0xdc, 0xaa, 0x0d, 0xc3, 0xc1, 0xfc, 0x5a, 0xa1, 0xfc, 0x2f,\n  0x6b, 0x87, 0xf7, 0x46, 0x4e, 0x22, 0xdf, 0x62, 0x9c, 0xe2, 0x5c, 0xa8,\n  0xc8, 0x1f, 0xa2, 0x4c, 0xae, 0xa2, 0x79, 0x8d, 0xd4, 0x9b, 0xa2, 0x4c,\n  0x09, 0xd9, 0x38, 0x54, 0x26, 0x47, 0x09, 0x69, 0xdf, 0x10, 0xb1, 0xfc,\n  0xae, 0x3d, 0xbf, 0x7d, 0xf3, 0xc0, 0xff, 0x4c, 0x93, 0x93, 0x21, 0x08,\n  0xc2, 0x7f, 0xc1, 0x2e, 0x81, 0x3d, 0x03, 0xf7, 0xe3, 0x57, 0xff, 0x86,\n  0xfe, 0x40, 0x31, 0xe9, 0xf6, 0x0f, 0x3f, 0x16, 0x04, 0xdb, 0x99, 0x9e,\n  0x56, 0x42, 0xd4, 0x21, 0x66, 0xd0, 0x9b, 0xd6, 0x2b, 0x7f, 0xa0, 0xe1,\n  0xac, 0xf8, 0xb9, 0x22, 0xa7, 0xc7, 0xb6, 0x92, 0xd3, 0x63, 0x9b, 0xc8,\n  0xe9, 0x85, 0x84, 0x2d, 0xe4, 0xc9, 0xe9, 0xf9, 0x9c, 0x0f, 0xfd, 0x21,\n  0xfb, 0x11, 0x43, 0x75, 0xa6, 0xd9, 0xe0, 0xd6, 0xa8, 0x8d, 0x7c, 0x43,\n  0xa7, 0x05, 0x75, 0xa3, 0x1f, 0x3c, 0xf4, 0x83, 0x39, 0x96, 0xeb, 0xc2,\n  0xf8, 0x77, 0x7f, 0x91, 0xde, 0xf9, 0x1e, 0x32, 0x46, 0x2b, 0x54, 0x7f,\n  0x29, 0x84, 0xda, 0x83, 0xe4, 0xd0, 0x50, 0xd5, 0x75, 0xcd, 0x99, 0x01,\n  0x5b, 0x8d, 0xdd, 0x41, 0xb8, 0xbd, 0x07, 0x4a, 0x44, 0x42, 0xb9, 0xb8,\n  0x10, 0x4b, 0xfe, 0x13, 0x51, 0xac, 0xac, 0x56, 0x7c, 0xcf, 0x18, 0x8b,\n  0xd9, 0xcf, 0x0e, 0x3d, 0xcc, 0xb2, 0x63, 0x97, 0x3c, 0xf4, 0x69, 0x28,\n  0x0c, 0x89, 0x26, 0xed, 0xd5, 0x0e, 0x61, 0x02, 0x7d, 0xb6, 0xaa, 0x46,\n  0x78, 0x94, 0xcc, 0x08, 0xf9, 0x4d, 0x9e, 0xe3, 0x18, 0x79, 0x9e, 0x9e,\n  0x56, 0x9b, 0x11, 0xc9, 0xf6, 0x92, 0x1a, 0x10, 0xdb, 0x62, 0x79, 0xa6,\n  0xa1, 0x7c, 0xe9, 0x16, 0x62, 0x99, 0x65, 0x3a, 0xf1, 0x28, 0x0a, 0x4d,\n  0x4f, 0x0b, 0xbf, 0x20, 0x73, 0xfd, 0xc2, 0x0b, 0x2b, 0xaf, 0xfc, 0xf1,\n  0x8f, 0xe4, 0x46, 0x9b, 0xf8, 0x70, 0xe1, 0x19, 0x50, 0x2b, 0x93, 0x07,\n  0xcf, 0x1c, 0x8d, 0x2a, 0x04, 0x07, 0x4b, 0x2c, 0xc7, 0xab, 0xe4, 0xf0,\n  0x53, 0xd8, 0x56, 0x34, 0xf8, 0x94, 0x6c, 0x1f, 0xcf, 0xb4, 0xf0, 0xea,\n  0x34, 0x1d, 0xf8, 0xf7, 0x84, 0x84, 0x78, 0x5f, 0x11, 0xaf, 0x1f, 0xee,\n  0xbb, 0x3d, 0x0f, 0x93, 0x1d, 0xfe, 0xee, 0xa3, 0xcf, 0xb1, 0x91, 0x6f,\n  0xdf, 0xa4, 0xcf, 0xf1, 0xa6, 0x5d, 0x70, 0x73, 0x9a, 0x91, 0x2f, 0xd3,\n  0x4f, 0x5a, 0x44, 0x1c, 0xe6, 0x4b, 0xb2, 0x6c, 0xa3, 0x6f, 0x7e, 0x76,\n  0xea, 0x51, 0xf4, 0x79, 0x48, 0x6a, 0x46, 0xdf, 0x1f, 0xca, 0xe5, 0x16,\n  0x83, 0x0f, 0x7f, 0x56, 0xc2, 0xc3, 0x01, 0x3f, 0x17, 0xe0, 0x37, 0x7a,\n  0x08, 0x9f, 0x88, 0xa4, 0x43, 0x44, 0xca, 0xb1, 0x15, 0xea, 0x35, 0x48,\n  0xb3, 0xa6, 0x7a, 0x68, 0xb9, 0xbc, 0x22, 0x6e, 0x96, 0x77, 0x4a, 0x71,\n  0x9e, 0x39, 0x87, 0x56, 0x2a, 0x69, 0xa1, 0xfe, 0x0d, 0x39, 0xca, 0x13,\n  0xdd, 0x3b, 0x7e, 0xa6, 0xeb, 0xb6, 0x2b, 0x27, 0xc7, 0x2e, 0xed, 0xba,\n  0xed, 0xea, 0xd9, 0x1d, 0x3b, 0x77, 0x6d, 0x9f, 0xd9, 0xb1, 0x13, 0xbf,\n  0xf9, 0x13, 0xbe, 0xef, 0xf4, 0xc4, 0x65, 0x77, 0xe8, 0x5f, 0x79, 0x85,\n  0xef, 0x3d, 0x33, 0x71, 0xf9, 0x1d, 0xba, 0x9f, 0x08, 0x2f, 0x68, 0x97,\n  0x76, 0xed, 0x3a, 0xa8, 0x45, 0xef, 0x15, 0x96, 0x75, 0x07, 0x67, 0x66,\n  0x0e, 0xd0, 0x77, 0x2e, 0x04, 0x87, 0x16, 0x1d, 0xe3, 0x2e, 0x71, 0x6e,\n  0x09, 0xcd, 0x3f, 0x40, 0xd7, 0x0f, 0xec, 0x4f, 0xb2, 0x7e, 0x12, 0xa3,\n  0x5e, 0x18, 0x59, 0x10, 0xcf, 0xc9, 0xf7, 0xaa, 0x9c, 0x00, 0x9e, 0xc0,\n  0x07, 0x26, 0x85, 0xde, 0x69, 0x64, 0x9f, 0xce, 0x3c, 0xf5, 0x14, 0xd0,\n  0x74, 0x32, 0x11, 0x71, 0xf1, 0xdc, 0x11, 0xf6, 0x8d, 0xcd, 0xf4, 0x9c,\n  0xd0, 0x18, 0x72, 0x06, 0xe9, 0x01, 0x2c, 0x30, 0x23, 0x33, 0x75, 0x15,\n  0x47, 0x77, 0x87, 0xcc, 0x46, 0x20, 0x62, 0x37, 0x64, 0x01, 0x71, 0xcf,\n  0x43, 0xf6, 0x06, 0xcd, 0xbf, 0xa1, 0xfb, 0x43, 0x54, 0x55, 0x92, 0x9f,\n  0x58, 0xaa, 0xdb, 0x56, 0x31, 0x3d, 0x5d, 0x35, 0xd5, 0xb6, 0x6d, 0x17,\n  0x76, 0x7d, 0x7d, 0xd6, 0xef, 0xf9, 0x1d, 0xd9, 0x29, 0xbe, 0xc0, 0xe4,\n  0xc0, 0xb7, 0xa5, 0xbd, 0xc1, 0x56, 0xd2, 0xf1, 0x87, 0xd3, 0x41, 0x35,\n  0x51, 0x1f, 0xe4, 0x8d, 0x27, 0x2b, 0x27, 0xeb, 0x76, 0x1f, 0x12, 0x07,\n  0x4f, 0xff, 0x63, 0x2b, 0x57, 0xca, 0xa6, 0x5f, 0x9e, 0x7e, 0x05, 0x76,\n  0x89, 0xf4, 0x06, 0xe4, 0x4b, 0xa2, 0x1d, 0xab, 0xfd, 0xec, 0x65, 0xe4,\n  0xbe, 0x26, 0xc9, 0xee, 0x89, 0x76, 0x88, 0xca, 0x09, 0x21, 0x6c, 0x94,\n  0x0b, 0xee, 0x51, 0x86, 0xbf, 0x56, 0x47, 0x91, 0x78, 0x60, 0xee, 0x19,\n  0x15, 0xa3, 0xd3, 0x2b, 0xf5, 0xe2, 0x53, 0x84, 0xb8, 0x20, 0x7c, 0x79,\n  0xcd, 0x83, 0x30, 0xac, 0x07, 0xbe, 0x96, 0x3c, 0xa7, 0x80, 0xb1, 0x53,\n  0x4d, 0x81, 0xe1, 0x09, 0xbf, 0x61, 0x38, 0xb1, 0x7e, 0xbd, 0x9a, 0x6e,\n  0x73, 0x5a, 0xe1, 0x52, 0x5c, 0x09, 0xa2, 0x20, 0x30, 0x16, 0x93, 0xc1,\n  0x6e, 0xb4, 0xd3, 0xd2, 0xa1, 0xa5, 0x01, 0x0d, 0x6c, 0x79, 0xbb, 0x94,\n  0x6c, 0x42, 0x6d, 0xac, 0x54, 0x82, 0x80, 0x7d, 0x62, 0xbf, 0xe7, 0xd8,\n  0xe1, 0x03, 0xa7, 0x5e, 0x7d, 0x04, 0xdd, 0x73, 0xe7, 0x3d, 0x2d, 0xfd,\n  0x5d, 0xd8, 0xf5, 0xf3, 0x91, 0xe1, 0xe1, 0x2c, 0xd9, 0xaa, 0xc2, 0xf3,\n  0x8f, 0xc4, 0x6a, 0x6b, 0x43, 0x39, 0x59, 0xe6, 0x09, 0x4a, 0x23, 0x41,\n  0x32, 0x5c, 0xa7, 0xab, 0xc4, 0xd6, 0xe9, 0x2a, 0x90, 0x8b, 0x0c, 0x72,\n  0xa1, 0xde, 0xa8, 0x07, 0xa4, 0x43, 0x1d, 0xa3, 0x55, 0x74, 0x15, 0x79,\n  0x0c, 0x6b, 0x54, 0x95, 0x9d, 0xd3, 0xb7, 0x1c, 0x5c, 0xdc, 0x7b, 0x0c,\n  0x95, 0x4d, 0xaf, 0xbc, 0x79, 0x75, 0xd3, 0x40, 0x57, 0xfb, 0x59, 0x32,\n  0x8a, 0x4c, 0x66, 0x38, 0x0b, 0x33, 0xde, 0x1f, 0x8d, 0xc7, 0x43, 0x0a,\n  0x3f, 0xf1, 0x91, 0x31, 0x68, 0xc9, 0x6c, 0xd0, 0x5d, 0xc8, 0xb0, 0x1c,\n  0xd4, 0xbf, 0xa4, 0xb2, 0x0b, 0x91, 0x4c, 0xa5, 0x6d, 0x08, 0xe4, 0xb0,\n  0x04, 0xe8, 0xa2, 0x35, 0x51, 0x27, 0x49, 0x4f, 0x48, 0x16, 0x99, 0x1e,\n  0xfd, 0xe8, 0xbf, 0x1f, 0x38, 0xfe, 0xe7, 0x69, 0xe4, 0xea, 0x6d, 0xbf,\n  0xf7, 0xbe, 0xc6, 0x41, 0xd4, 0xfa, 0x3e, 0x78, 0x88, 0x70, 0x63, 0x3c,\n  0xf4, 0x69, 0xd1, 0xb6, 0xe7, 0x23, 0x67, 0xfd, 0x8b, 0x84, 0xaf, 0x53,\n  0xfd, 0x84, 0x70, 0x7d, 0x15, 0xe8, 0x26, 0x32, 0xf6, 0x1b, 0x97, 0x59,\n  0x6f, 0x62, 0xab, 0xca, 0x61, 0x01, 0x55, 0x32, 0xd4, 0x57, 0x24, 0x82,\n  0x6a, 0xe5, 0xf4, 0x13, 0xe7, 0x3a, 0x85, 0x24, 0xb4, 0x56, 0x5f, 0x79,\n  0xa4, 0xba, 0xdb, 0x57, 0xdc, 0x57, 0x39, 0x3a, 0xab, 0x12, 0xde, 0x44,\n  0x3c, 0x3f, 0x96, 0xf1, 0xf5, 0x7a, 0xdd, 0xbe, 0xf1, 0xd8, 0xf0, 0xc9,\n  0xce, 0xde, 0xcb, 0x74, 0x26, 0x63, 0xa6, 0xa0, 0x70, 0xc7, 0xae, 0x81,\n  0x6d, 0x19, 0xb3, 0xae, 0xdf, 0x50, 0xd8, 0x78, 0xf9, 0xe2, 0xfc, 0x95,\n  0x2d, 0x12, 0xe6, 0xdf, 0x1b, 0xac, 0x41, 0x8a, 0xdd, 0x98, 0x97, 0xcb,\n  0xb6, 0xaf, 0xd7, 0x4f, 0x62, 0x6f, 0xa3, 0x74, 0xc4, 0x14, 0xa5, 0xa3,\n  0x6a, 0xa3, 0xd2, 0x01, 0x3a, 0x47, 0x90, 0xec, 0xd4, 0xc2, 0xa0, 0xa4,\n  0x73, 0xd0, 0x20, 0x0f, 0xb1, 0xf2, 0xd7, 0xc6, 0xac, 0x0d, 0xd6, 0x70,\n  0xf6, 0xe8, 0x81, 0xab, 0x34, 0x37, 0x4d, 0x4f, 0xdf, 0xac, 0xbf, 0x72,\n  0x7f, 0xef, 0x72, 0xab, 0x70, 0x6d, 0x5f, 0x66, 0xa4, 0xa7, 0x37, 0x93,\n  0xe9, 0x83, 0xba, 0x2c, 0x67, 0x2f, 0x23, 0xf4, 0xfa, 0x85, 0x8b, 0x2e,\n  0xed, 0xbc, 0x22, 0xbb, 0xff, 0xd0, 0xa1, 0xfd, 0xfb, 0x0f, 0x1c, 0x00,\n  0x8c, 0x17, 0x32, 0xd9, 0x44, 0xc8, 0xa2, 0xbb, 0x89, 0xe8, 0x9c, 0x58,\n  0xf2, 0xf0, 0x82, 0x6c, 0x4c, 0x25, 0x26, 0x49, 0x32, 0x96, 0x48, 0x37,\n  0x59, 0x52, 0x4b, 0x94, 0x52, 0x96, 0x44, 0x28, 0xa5, 0xa8, 0x17, 0xc9,\n  0x50, 0x14, 0x74, 0x8b, 0x24, 0x19, 0xc2, 0xe9, 0x03, 0xef, 0xf7, 0x37,\n  0x97, 0x1e, 0x9c, 0x7c, 0x6d, 0xfa, 0xda, 0xab, 0x7b, 0xdb, 0xdf, 0xf5,\n  0x9e, 0xb6, 0xe4, 0x8b, 0x9a, 0x50, 0x47, 0xcd, 0xc8, 0xc4, 0xca, 0x2b,\n  0xcf, 0xdd, 0x5f, 0x5d, 0xf5, 0xb9, 0xda, 0x2d, 0xeb, 0x23, 0x01, 0xa6,\n  0x34, 0x8d, 0xa9, 0x7a, 0x93, 0x10, 0xd8, 0x5b, 0xd2, 0xc6, 0x92, 0x75,\n  0x58, 0x7a, 0x10, 0xc3, 0x53, 0xce, 0x23, 0x95, 0x06, 0x71, 0x5a, 0x15,\n  0x3d, 0x6f, 0xda, 0x05, 0x46, 0xab, 0xa5, 0x53, 0x4b, 0xe9, 0xbe, 0xe4,\n  0x2a, 0x02, 0x6c, 0x94, 0x72, 0xea, 0x55, 0xca, 0x6b, 0xac, 0x65, 0x30,\n  0xab, 0xc5, 0x87, 0x36, 0x6f, 0x9a, 0x4d, 0x7b, 0x11, 0x13, 0x0e, 0x29,\n  0x28, 0x2a, 0x32, 0xd2, 0x5e, 0x39, 0x2a, 0xd7, 0xf3, 0x9b, 0x23, 0xed,\n  0x29, 0xa5, 0x17, 0xf2, 0x61, 0xa6, 0x6d, 0x6a, 0xf4, 0x1e, 0x47, 0xa0,\n  0xc0, 0xe0, 0x31, 0x7b, 0x4b, 0xcf, 0x64, 0x7b, 0xb2, 0x99, 0xcc, 0xf4,\n  0x57, 0xbf, 0x8a, 0xb1, 0xca, 0x33, 0x53, 0xbf, 0x77, 0x6f, 0xcf, 0x6b,\n  0xbc, 0x6a, 0x80, 0x53, 0x87, 0x6a, 0xd1, 0x7d, 0x67, 0x29, 0xbc, 0xf4,\n  0xee, 0xce, 0x99, 0x99, 0xce, 0x69, 0x6b, 0xc4, 0x52, 0x56, 0xbe, 0x7b,\n  0x49, 0x58, 0xca, 0x48, 0x18, 0x29, 0xa2, 0x4e, 0x20, 0xe0, 0x08, 0xfa,\n  0xae, 0x94, 0x93, 0x7d, 0xaf, 0x14, 0xef, 0xf9, 0x06, 0xfa, 0x9e, 0x7c,\n  0x1e, 0x20, 0x36, 0x15, 0xfc, 0xa6, 0x5e, 0xa4, 0xe2, 0x8a, 0x10, 0xa3,\n  0xe2, 0xd6, 0xe8, 0x32, 0x20, 0xd8, 0x56, 0x8d, 0x28, 0xd2, 0x2e, 0x3d,\n  0x0f, 0x44, 0x59, 0x27, 0xef, 0x05, 0xb0, 0x6c, 0xf2, 0x79, 0x50, 0x6d,\n  0x80, 0x9e, 0xcf, 0x77, 0xa5, 0xaa, 0x51, 0xc3, 0xd0, 0xc9, 0xae, 0x9e,\n  0x4b, 0x06, 0xcb, 0xc6, 0x8a, 0x3c, 0x45, 0xdd, 0xbe, 0x91, 0x71, 0x0d,\n  0xe2, 0x85, 0x37, 0x55, 0xe3, 0xa3, 0x55, 0x7d, 0xc5, 0x45, 0x3d, 0xba,\n  0xa6, 0xcb, 0xf7, 0x2c, 0x5e, 0xd9, 0x64, 0x36, 0x0c, 0xe8, 0x8d, 0xa3,\n  0xe3, 0x03, 0xd9, 0xc9, 0xc2, 0x82, 0x8c, 0xd1, 0x94, 0xc3, 0x80, 0x02,\n  0x1e, 0x3d, 0x29, 0xe2, 0x43, 0x93, 0xd1, 0x3f, 0x81, 0x5f, 0x24, 0x7f,\n  0x67, 0xb6, 0xae, 0x5d, 0x25, 0x62, 0x41, 0x4b, 0xed, 0x46, 0xe8, 0xb9,\n  0x22, 0xb2, 0x1b, 0x0b, 0x3a, 0x1b, 0x68, 0x6c, 0xcf, 0x49, 0x1e, 0x73,\n  0x80, 0xc7, 0x41, 0x50, 0xd3, 0x68, 0xd0, 0x2b, 0xc9, 0x73, 0xe4, 0x0a,\n  0x2f, 0x5d, 0x49, 0xeb, 0x95, 0x3f, 0x88, 0x3c, 0x27, 0x79, 0xd1, 0x03,\n  0x0c, 0xa3, 0x25, 0x07, 0x8d, 0x51, 0xc3, 0xc4, 0x28, 0x6a, 0x11, 0x82,\n  0xd0, 0x6e, 0x56, 0x94, 0x28, 0xa5, 0x3b, 0x55, 0xd0, 0x86, 0xfc, 0xda,\n  0x86, 0x50, 0x96, 0x52, 0x6c, 0x27, 0x46, 0x83, 0xcb, 0x5d, 0xa0, 0x54,\n  0xca, 0xe6, 0xad, 0x29, 0xd9, 0x57, 0xca, 0x08, 0x55, 0xd2, 0x50, 0x45,\n  0x87, 0xc7, 0x0d, 0xd9, 0x88, 0xee, 0x80, 0x27, 0x40, 0xde, 0xc6, 0x55,\n  0x1a, 0x22, 0x6c, 0x40, 0x07, 0x9c, 0x2d, 0x8f, 0x0d, 0x80, 0xd4, 0xa8,\n  0x98, 0x39, 0x15, 0x8e, 0xf0, 0x9d, 0x2b, 0x0f, 0xed, 0x5f, 0x3c, 0xf5,\n  0x9d, 0xab, 0x0c, 0xd5, 0xc3, 0x4d, 0x25, 0x26, 0x15, 0x11, 0x20, 0xbb,\n  0x2c, 0xe8, 0xb6, 0x23, 0xc7, 0x9b, 0x07, 0x7b, 0x15, 0xee, 0xf0, 0xd0,\n  0xf7, 0xe7, 0xf8, 0x4e, 0xc4, 0xbe, 0xfc, 0x17, 0x85, 0x4b, 0x50, 0xfa,\n  0xcc, 0xa6, 0x29, 0x3f, 0xf7, 0x82, 0xbc, 0xaf, 0x42, 0x8c, 0x8e, 0xc7,\n  0x58, 0xc3, 0xe0, 0x25, 0xea, 0x85, 0x8c, 0x01, 0xa2, 0x3e, 0xda, 0x23,\n  0xbd, 0x8d, 0xcd, 0x0a, 0x3c, 0xc2, 0xea, 0xb5, 0x79, 0x29, 0x38, 0x33,\n  0xf9, 0x57, 0x1a, 0xd0, 0x53, 0x87, 0xa0, 0x3c, 0xbc, 0xa4, 0x44, 0x70,\n  0x92, 0x56, 0x65, 0x64, 0x6f, 0x5e, 0x7a, 0x78, 0xff, 0xde, 0x53, 0xdf,\n  0xfb, 0xef, 0x99, 0x99, 0xd7, 0xbe, 0x71, 0xec, 0x44, 0xcb, 0x40, 0x0f,\n  0x76, 0xfd, 0x22, 0x43, 0xc6, 0x03, 0x12, 0xe1, 0x0b, 0x2f, 0x28, 0x43,\n  0x21, 0xeb, 0x2f, 0xe1, 0xc4, 0x93, 0x75, 0xfd, 0x4f, 0x05, 0xff, 0x53,\n  0x45, 0xf7, 0xf7, 0x8f, 0xa4, 0xfd, 0xfd, 0x79, 0xc9, 0x3f, 0x0e, 0xb2,\n  0xd8, 0x1b, 0xd4, 0x4f, 0xd8, 0x9d, 0x4e, 0xc7, 0x02, 0x56, 0x96, 0xe7,\n  0x4a, 0x10, 0xc0, 0xea, 0x6d, 0xe2, 0x41, 0xa0, 0xb3, 0x4d, 0x8b, 0x02,\n  0x94, 0x83, 0x17, 0x21, 0x1c, 0x2a, 0x2e, 0x72, 0xbb, 0xde, 0xd6, 0x8b,\n  0xa0, 0x98, 0x8e, 0x13, 0xec, 0x1a, 0xe3, 0x54, 0x0a, 0x3d, 0xbd, 0x56,\n  0x6f, 0x79, 0xdf, 0xdc, 0x29, 0x93, 0x4b, 0xcd, 0xa9, 0x3d, 0xc6, 0xa3,\n  0xf3, 0x2f, 0x17, 0x65, 0x47, 0x5d, 0xa5, 0x06, 0xbd, 0xdf, 0x52, 0xdd,\n  0x64, 0x2e, 0xca, 0xd7, 0x61, 0x7e, 0x10, 0x1b, 0x0c, 0xb8, 0x27, 0xca,\n  0x50, 0xed, 0xca, 0x47, 0x32, 0x33, 0x2a, 0xb6, 0x0f, 0x73, 0xf5, 0x15,\n  0xfd, 0x92, 0x1c, 0x82, 0x8b, 0x14, 0xf9, 0x8c, 0x28, 0xf0, 0xe7, 0x60,\n  0x9e, 0xa9, 0xf4, 0xc4, 0xec, 0xe1, 0x36, 0xfa, 0x07, 0x25, 0xe9, 0x8c,\n  0x4c, 0x31, 0x32, 0xff, 0xe3, 0x34, 0x72, 0x4e, 0x3f, 0x39, 0x29, 0x4a,\n  0x1c, 0x2b, 0xaf, 0x7c, 0x59, 0xce, 0x7f, 0x5c, 0x61, 0x77, 0x93, 0x99,\n  0x22, 0xf2, 0x12, 0x4d, 0xa1, 0xba, 0x81, 0x91, 0x94, 0xfa, 0x48, 0xce,\n  0x50, 0x90, 0x27, 0x4f, 0xd3, 0x4c, 0xc7, 0x40, 0x12, 0xad, 0x08, 0x5f,\n  0x99, 0x41, 0x03, 0xec, 0xee, 0xdf, 0x40, 0xb6, 0xe3, 0xdd, 0x8a, 0xbd,\n  0xe1, 0x23, 0xf8, 0x0b, 0xa4, 0x75, 0xdf, 0xf0, 0x63, 0x4e, 0xd0, 0x77,\n  0x38, 0xd1, 0x78, 0x26, 0xdd, 0x50, 0x96, 0x9c, 0xbd, 0xf4, 0x83, 0xbc,\n  0x27, 0xc9, 0x1f, 0xac, 0xc9, 0x1d, 0xa3, 0x0f, 0xa3, 0xd6, 0xaf, 0x24,\n  0xfa, 0xc8, 0x9f, 0xa6, 0xff, 0x8c, 0xbf, 0xf0, 0x2b, 0x81, 0x48, 0x76,\n  0x1f, 0x62, 0x36, 0xc3, 0x05, 0x62, 0xba, 0x51, 0xe4, 0x42, 0xb8, 0x40,\n  0x4c, 0x37, 0xf3, 0xcb, 0x4d, 0xfb, 0x9e, 0x46, 0x47, 0x2f, 0xd8, 0xf7,\n  0x34, 0x0a, 0xe7, 0xf5, 0xbd, 0x55, 0xe9, 0xbb, 0x2c, 0xe3, 0x44, 0xe1,\n  0xf5, 0x7d, 0x9f, 0x97, 0xfa, 0x12, 0xfe, 0xb3, 0xc4, 0x6c, 0x5a, 0xaf,\n  0xb3, 0x9b, 0x39, 0x71, 0x21, 0x3c, 0x22, 0xa6, 0x5b, 0xca, 0x25, 0x88,\n  0x31, 0xbf, 0x45, 0xdf, 0x45, 0x80, 0x05, 0x5a, 0x0c, 0xc1, 0xcd, 0x1b,\n  0x93, 0xa7, 0x65, 0xe8, 0x80, 0x14, 0x51, 0xa4, 0x62, 0xe8, 0xfe, 0xdf,\n  0xd2, 0x64, 0x49, 0xda, 0x8f, 0xfd, 0xea, 0x3b, 0xee, 0xc7, 0xbe, 0x8f,\n  0xf6, 0xa3, 0x31, 0x29, 0xb4, 0x1f, 0x56, 0x63, 0x4c, 0xeb, 0x23, 0x0b,\n  0xab, 0x41, 0xf4, 0xe1, 0xd5, 0xdf, 0xd1, 0xdc, 0xc5, 0x72, 0x9a, 0x69,\n  0xed, 0xa7, 0xfe, 0x51, 0x5a, 0x50, 0x83, 0xc8, 0xa6, 0x53, 0x8c, 0x88,\n  0x14, 0xce, 0xe2, 0x31, 0xaa, 0x18, 0x19, 0x3c, 0x34, 0x19, 0x5a, 0x45,\n  0x64, 0x21, 0xa2, 0xdf, 0x05, 0xd0, 0x87, 0x85, 0x05, 0xf4, 0x51, 0xf8,\n  0x9a, 0x49, 0x3f, 0x93, 0x86, 0x38, 0x5c, 0xf4, 0x1c, 0xf3, 0x49, 0x7c,\n  0x9e, 0x9c, 0x5f, 0x77, 0xda, 0x21, 0x83, 0x20, 0x30, 0xcb, 0x74, 0xb7,\n  0x41, 0x36, 0x35, 0x0c, 0xc9, 0x1a, 0x15, 0x33, 0x79, 0xf8, 0x42, 0xb5,\n  0xb1, 0xd6, 0xd5, 0xa9, 0xb5, 0x99, 0x55, 0xe8, 0x39, 0x7d, 0xf2, 0x6c,\n  0x32, 0x32, 0xb5, 0x33, 0xb4, 0xfe, 0x1e, 0x0a, 0xa8, 0xf4, 0x32, 0xb3,\n  0xe6, 0x1e, 0x4e, 0x08, 0x78, 0x6e, 0xc7, 0xa9, 0x0f, 0xf1, 0x86, 0xb8,\n  0xab, 0x53, 0x67, 0x35, 0xab, 0xf0, 0x79, 0x7d, 0xfd, 0x35, 0xf4, 0x1e,\n  0xe4, 0x3d, 0xfd, 0xab, 0x57, 0x33, 0x4f, 0x32, 0xa7, 0x10, 0x4f, 0x28,\n  0x88, 0x75, 0xe5, 0x61, 0xa8, 0x76, 0x8d, 0xbe, 0xb4, 0xf2, 0xb0, 0x18,\n  0x5e, 0x20, 0x3d, 0xe3, 0xfe, 0x0b, 0x3d, 0xa3, 0x18, 0x3b, 0x01, 0x7e,\n  0x22, 0x75, 0xb1, 0xca, 0x6c, 0xd3, 0x76, 0xba, 0x6b, 0x8d, 0x3c, 0x3e,\n  0x1f, 0xda, 0x39, 0x15, 0x49, 0x5e, 0x53, 0xaf, 0x27, 0x64, 0x85, 0xdc,\n  0x03, 0xed, 0x22, 0xf7, 0xd0, 0x30, 0x16, 0x88, 0xa8, 0x14, 0xc3, 0xa6,\n  0xc5, 0xfc, 0x7b, 0x72, 0x23, 0x2d, 0x21, 0x61, 0x5a, 0x8b, 0xd6, 0x42,\n  0x04, 0x68, 0x0d, 0xa3, 0xb1, 0x42, 0xea, 0x3d, 0x82, 0x31, 0xc3, 0xcb,\n  0x87, 0xe4, 0x5f, 0xd0, 0x2e, 0x63, 0x91, 0x66, 0x9e, 0x37, 0xd6, 0xba,\n  0x2f, 0x25, 0xbf, 0xcc, 0xa9, 0x8d, 0x35, 0x6e, 0x7c, 0xbe, 0xf9, 0xc6,\n  0x7a, 0x7d, 0xf2, 0xea, 0x06, 0xe9, 0x87, 0x68, 0x8b, 0x91, 0x9f, 0xa5,\n  0x25, 0x12, 0xe3, 0xc6, 0x67, 0xe9, 0x74, 0x0c, 0xa3, 0xb3, 0xea, 0xc0,\n  0x50, 0x07, 0x83, 0xa7, 0xcf, 0x92, 0x27, 0x28, 0x24, 0xff, 0x82, 0x76,\n  0xc0, 0x54, 0x75, 0xe9, 0xac, 0x16, 0xd5, 0x2e, 0xf8, 0x8d, 0xb0, 0x41,\n  0x3a, 0x69, 0xd2, 0xc4, 0x2b, 0x0b, 0x40, 0xf7, 0x09, 0x99, 0x3f, 0x74,\n  0x8c, 0xce, 0x9f, 0x4e, 0x9e, 0x3f, 0x9c, 0x3f, 0x7f, 0x9d, 0xe4, 0xdb,\n  0x57, 0x29, 0xc6, 0x5f, 0x2a, 0x6d, 0xd0, 0xeb, 0x00, 0x82, 0x16, 0x31,\n  0x9a, 0x1c, 0xa0, 0xba, 0x7e, 0x0d, 0x8c, 0xbc, 0x3e, 0x1f, 0x3e, 0xfe,\n  0x0b, 0xf6, 0x42, 0x80, 0x61, 0x40, 0x51, 0x6b, 0xc8, 0xca, 0x27, 0x9d,\n  0xd1, 0x04, 0x9f, 0x42, 0x5f, 0x7d, 0xc4, 0xbd, 0xe8, 0xfa, 0xf8, 0xc7,\n  0x5d, 0x8b, 0xee, 0x47, 0xd0, 0x4b, 0x26, 0xc1, 0x80, 0xfe, 0x6c, 0x9a,\n  0x32, 0x7d, 0xf7, 0xbb, 0x26, 0xfa, 0x2c, 0x38, 0x55, 0xcf, 0x90, 0x67,\n  0xd9, 0x99, 0x74, 0x5a, 0x92, 0xb3, 0x64, 0xe0, 0x5b, 0x42, 0xe2, 0x2d,\n  0xef, 0xec, 0xa1, 0x1e, 0x1b, 0x3c, 0x34, 0x9c, 0xb2, 0x47, 0x9d, 0xa1,\n  0x14, 0x3c, 0x36, 0x25, 0x3d, 0x9b, 0x5c, 0x40, 0xee, 0x47, 0x1e, 0x71,\n  0xed, 0x77, 0x3d, 0xf8, 0xa0, 0xdd, 0xfe, 0xe0, 0x83, 0xe4, 0x97, 0x47,\n  0x1e, 0xb1, 0xff, 0xc9, 0xb4, 0xd3, 0xf8, 0xe5, 0x2f, 0x1b, 0x77, 0x9a,\n  0xde, 0x73, 0xa3, 0x69, 0xa7, 0xe9, 0xa9, 0xa7, 0xc8, 0xb7, 0x1b, 0x61,\n  0x2c, 0x23, 0xcc, 0x9f, 0x50, 0x05, 0xfa, 0x4f, 0xf2, 0xde, 0xae, 0xb4,\n  0x7d, 0x3d, 0xbe, 0x44, 0x69, 0x10, 0x9e, 0x61, 0xcd, 0x43, 0x05, 0x18,\n  0x49, 0xd7, 0xd4, 0xa4, 0xe1, 0x0b, 0x1d, 0xed, 0x69, 0x6c, 0xec, 0xe9,\n  0x6a, 0x6e, 0x86, 0x5c, 0xfe, 0xd5, 0xff, 0xc1, 0x3f, 0x60, 0x2e, 0x63,\n  0x22, 0x8c, 0x85, 0xea, 0xae, 0x16, 0xa4, 0xa6, 0xb4, 0xc8, 0x82, 0xf5,\n  0xf4, 0x67, 0x7c, 0xf5, 0x0d, 0xee, 0x20, 0x7e, 0x96, 0xfa, 0x95, 0xdc,\n  0x4c, 0x98, 0x89, 0x33, 0x2d, 0x4c, 0xaf, 0x8c, 0x9e, 0x5a, 0x57, 0xa8,\n  0xb1, 0xb0, 0x6a, 0x5b, 0x81, 0x95, 0xd5, 0xa9, 0xd4, 0xba, 0x65, 0xc2,\n  0x2a, 0x90, 0x5e, 0x85, 0x0e, 0x99, 0x69, 0x44, 0xad, 0x89, 0x35, 0xb2,\n  0x00, 0x23, 0x6c, 0x40, 0x7a, 0x3d, 0x5e, 0xd0, 0x12, 0xee, 0x2d, 0x22,\n  0xd9, 0x37, 0x6f, 0xde, 0xc9, 0x44, 0x11, 0xe2, 0xc4, 0xae, 0x46, 0x19,\n  0x7f, 0xf8, 0x30, 0xed, 0xcd, 0x2f, 0x00, 0x3a, 0x25, 0x40, 0x0e, 0xa7,\n  0x5b, 0xda, 0x5a, 0x13, 0x75, 0xd1, 0x88, 0xd7, 0x23, 0xd6, 0xa8, 0xec,\n  0xee, 0x6c, 0xed, 0x6d, 0xeb, 0x6d, 0x4a, 0xd5, 0xb5, 0x24, 0x5a, 0xaa,\n  0x2a, 0x22, 0xf1, 0x68, 0x3c, 0xe0, 0xf7, 0x84, 0xbd, 0x61, 0xa7, 0xdd,\n  0xec, 0xb6, 0xb8, 0xf3, 0x6b, 0x57, 0xda, 0x0d, 0xb2, 0x49, 0x54, 0x8c,\n  0xa1, 0x56, 0xa1, 0x10, 0x92, 0xa1, 0x7a, 0x93, 0xf5, 0xaa, 0xbc, 0x4f,\n  0x02, 0xf9, 0xad, 0x94, 0x16, 0x01, 0xe5, 0xb7, 0xaf, 0x0f, 0x65, 0x06,\n  0x47, 0xfa, 0x87, 0xfb, 0xb0, 0x5d, 0x38, 0x35, 0x82, 0x6e, 0x15, 0xae,\n  0x27, 0xea, 0x60, 0x64, 0x04, 0x1d, 0x1c, 0x1c, 0xa1, 0x97, 0xd1, 0xa7,\n  0xa4, 0x5f, 0x84, 0xff, 0x11, 0x3f, 0x30, 0xd0, 0x1f, 0xf8, 0xd9, 0x4b,\n  0x96, 0x97, 0xcf, 0x9c, 0x59, 0x5e, 0xbe, 0x44, 0x07, 0x75, 0x00, 0xea,\n  0x27, 0xc6, 0xc7, 0xb7, 0x7d, 0xe2, 0xe3, 0xbf, 0x92, 0x2f, 0xca, 0x3f,\n  0x3b, 0xc6, 0xc7, 0x27, 0x26, 0x3e, 0xf1, 0x31, 0xf1, 0x3b, 0xac, 0x71,\n  0x14, 0x7d, 0x0b, 0x61, 0x9a, 0xcf, 0x6d, 0x4d, 0x9b, 0x65, 0x88, 0x00,\n  0x72, 0xca, 0x2c, 0x66, 0xba, 0xbc, 0x09, 0x36, 0xf4, 0xe0, 0xcc, 0xc7,\n  0x9b, 0xf1, 0xf9, 0xff, 0x87, 0xbd, 0xf7, 0x8e, 0x8f, 0xf3, 0xaa, 0xf2,\n  0x87, 0x9f, 0xfb, 0xf4, 0xe9, 0xbd, 0xcf, 0x68, 0x34, 0x7d, 0x46, 0x5d,\n  0x1a, 0x8d, 0x7a, 0x19, 0x15, 0x4b, 0x56, 0x2f, 0x96, 0xd5, 0x6c, 0x4b,\n  0x96, 0x5c, 0xe4, 0xee, 0xd8, 0x4e, 0xe2, 0x14, 0xe3, 0x98, 0xb8, 0xc4,\n  0x29, 0x10, 0x12, 0xbc, 0x40, 0x12, 0x02, 0x9b, 0x6c, 0xc2, 0x12, 0x20,\n  0x84, 0xdd, 0x65, 0x81, 0xb0, 0x01, 0x02, 0x0b, 0x2c, 0x98, 0x5e, 0x03,\n  0xe1, 0x0d, 0xcb, 0x2e, 0x24, 0x2c, 0x0b, 0x9b, 0x84, 0x96, 0xcd, 0x42,\n  0x3c, 0xfe, 0xdd, 0x73, 0x9f, 0xe7, 0x19, 0xcd, 0x48, 0x23, 0x59, 0x61,\n  0x3f, 0x6f, 0xf9, 0xe3, 0xf5, 0x27, 0x72, 0xac, 0x99, 0xa7, 0xdc, 0x7b,\n  0xee, 0xb9, 0xf7, 0x9e, 0x73, 0xcf, 0x39, 0xdf, 0x6f, 0x26, 0x23, 0xcd,\n  0x4d, 0xb8, 0xfe, 0xef, 0xe5, 0xfa, 0x6f, 0x3c, 0x37, 0x73, 0x10, 0x38,\n  0x60, 0xe1, 0x83, 0x12, 0xee, 0x9c, 0xe2, 0x6d, 0x98, 0x9b, 0x16, 0x78,\n  0x06, 0xfe, 0x79, 0xee, 0xad, 0xb3, 0x8f, 0xfc, 0x27, 0xfe, 0x81, 0xf7,\n  0x65, 0x32, 0xf0, 0x23, 0xaf, 0xed, 0x0d, 0xc8, 0x80, 0x9e, 0xc3, 0xbb,\n  0x04, 0xff, 0x0f, 0x1c, 0x42, 0x35, 0xa5, 0x96, 0x7a, 0x42, 0xca, 0x1d,\n  0xff, 0x60, 0xfb, 0x3d, 0xf7, 0xb4, 0x7f, 0x10, 0xe9, 0xbf, 0x1a, 0xfe,\n  0xf0, 0x87, 0x23, 0x5f, 0x25, 0xd7, 0xc6, 0xf0, 0xb5, 0x7a, 0xf9, 0x5a,\n  0x06, 0xf8, 0xbb, 0x2d, 0x0e, 0x1b, 0x90, 0x77, 0xef, 0x79, 0xe2, 0x89,\n  0xb6, 0x7b, 0xee, 0x41, 0xcf, 0x7d, 0x55, 0xf7, 0xd5, 0xc8, 0x87, 0x3f,\n  0x2c, 0xcd, 0x69, 0xac, 0x77, 0xe8, 0x43, 0x04, 0x57, 0x90, 0x25, 0x7a,\n  0xc6, 0x52, 0x2f, 0x91, 0xbc, 0x67, 0x98, 0xcb, 0x69, 0xd2, 0x7e, 0x79,\n  0xcd, 0x56, 0xc0, 0x52, 0x73, 0xb6, 0x11, 0x48, 0x7d, 0x41, 0xe9, 0xcc,\n  0xe0, 0x00, 0xfa, 0x38, 0xa9, 0xf5, 0xbe, 0x0c, 0xfe, 0x18, 0xf2, 0xa3,\n  0x1d, 0xf4, 0x12, 0xea, 0x05, 0x68, 0x1a, 0xe4, 0x4f, 0x3c, 0x18, 0xdd,\n  0x2b, 0xad, 0xb3, 0xc8, 0x9f, 0x5d, 0x27, 0xca, 0x89, 0xdd, 0x06, 0xb9,\n  0x36, 0x50, 0x13, 0xc5, 0x52, 0xd8, 0x0a, 0x83, 0x9a, 0x28, 0x00, 0x04,\n  0x15, 0x25, 0xd2, 0x26, 0x19, 0x9e, 0x15, 0x08, 0x7a, 0x0e, 0x8a, 0xf2,\n  0xe1, 0xb5, 0xf2, 0x07, 0x68, 0x79, 0x00, 0x7d, 0x52, 0xca, 0x4f, 0x22,\n  0x39, 0x4a, 0xd8, 0x77, 0xba, 0x7d, 0xeb, 0x56, 0x74, 0x36, 0xf3, 0x7d,\n  0xe4, 0xca, 0xfc, 0xf2, 0xdd, 0xef, 0xbe, 0xbd, 0x83, 0x16, 0x46, 0xfe,\n  0x3c, 0x72, 0xa4, 0xe3, 0x76, 0xe9, 0x5c, 0x1f, 0xbf, 0xcf, 0x49, 0x7f,\n  0x8f, 0x60, 0x27, 0x4e, 0x29, 0xb5, 0x07, 0x2e, 0x84, 0x57, 0x0a, 0xc0,\n  0x7d, 0x57, 0x4b, 0xe5, 0xf6, 0x2a, 0x04, 0xf5, 0xf6, 0x3c, 0x2b, 0xe5,\n  0x47, 0x2d, 0x68, 0x25, 0xd5, 0xc7, 0xcb, 0x24, 0x21, 0xd8, 0x13, 0xb0,\n  0xdf, 0x13, 0x0a, 0x4a, 0xe0, 0xa1, 0xe0, 0xd8, 0x99, 0x25, 0x78, 0x4c,\n  0x0d, 0x76, 0xed, 0xa2, 0x28, 0xaa, 0xcb, 0x83, 0x04, 0xb6, 0x29, 0xa0,\n  0x98, 0x56, 0xe2, 0x06, 0x41, 0x91, 0xb0, 0x84, 0x97, 0x99, 0x04, 0x3c,\n  0x90, 0xd1, 0x86, 0xa9, 0xa0, 0xdf, 0xdf, 0x97, 0x48, 0xb5, 0x5f, 0xbe,\n  0x7c, 0xf9, 0x6b, 0xd1, 0x22, 0x74, 0x26, 0xa3, 0xaa, 0x4c, 0x2d, 0xe0,\n  0x3f, 0xf3, 0xf4, 0xf7, 0xec, 0xa6, 0x4d, 0x7a, 0x6b, 0x53, 0xe7, 0x74,\n  0xc7, 0x70, 0x67, 0x47, 0x97, 0x71, 0xb4, 0x5f, 0xdd, 0xdf, 0xd3, 0x39,\n  0xdc, 0xd1, 0xb9, 0x74, 0x03, 0x91, 0xfa, 0x20, 0xf6, 0x75, 0x5f, 0x24,\n  0x31, 0x5d, 0x2b, 0xf6, 0xc4, 0x7e, 0x91, 0xd6, 0x97, 0x60, 0xc1, 0x15,\n  0x63, 0xb1, 0x05, 0x10, 0x2d, 0x28, 0xd8, 0x6a, 0x95, 0x14, 0x87, 0xfd,\n  0x09, 0xdc, 0x13, 0xe0, 0xfd, 0x46, 0x02, 0x8b, 0xf6, 0x6b, 0x21, 0xa9,\n  0x7a, 0x5e, 0x43, 0xa0, 0xa0, 0x75, 0x48, 0xad, 0x3e, 0x0c, 0x06, 0x2f,\n  0xbd, 0x28, 0x4a, 0x2c, 0x10, 0x32, 0x60, 0x72, 0x72, 0x23, 0xb7, 0xc1,\n  0x42, 0x80, 0xef, 0x15, 0x17, 0x25, 0x18, 0x35, 0x4f, 0xba, 0x0e, 0x7f,\n  0xc1, 0x70, 0x78, 0x01, 0x39, 0xb3, 0xee, 0xed, 0x2b, 0x6f, 0xc4, 0x9e,\n  0x4c, 0xc4, 0x66, 0x03, 0xf0, 0x1f, 0x5b, 0x99, 0xad, 0x2c, 0x11, 0x97,\n  0x6c, 0x6e, 0x87, 0xdd, 0xa8, 0xd7, 0x5a, 0x75, 0x56, 0xbc, 0x88, 0xf3,\n  0xb0, 0x54, 0xe8, 0xb3, 0x4b, 0x05, 0xf1, 0x6b, 0x96, 0xd1, 0xa8, 0x39,\n  0x19, 0x71, 0x34, 0xa7, 0x38, 0x92, 0xa0, 0x91, 0x7e, 0xf7, 0xfc, 0x8d,\n  0xd5, 0xd7, 0xef, 0xf5, 0x4f, 0x9d, 0x49, 0xb8, 0xb7, 0x6f, 0x1b, 0x47,\n  0x9b, 0x8f, 0x1c, 0x71, 0xfb, 0x0d, 0x09, 0xb5, 0xb6, 0xb4, 0xb8, 0x3e,\n  0x3d, 0x34, 0xec, 0xa7, 0x2f, 0x1f, 0xd9, 0xdd, 0xb2, 0xd4, 0x9e, 0xf9,\n  0x4f, 0xfa, 0xf2, 0x50, 0xe6, 0xa5, 0xae, 0xe1, 0x4d, 0xdd, 0x37, 0xed,\n  0xeb, 0xfa, 0x76, 0x24, 0xce, 0xb3, 0x1d, 0xbc, 0xba, 0xab, 0xe7, 0x27,\n  0xf1, 0xf0, 0xbc, 0xa4, 0x9f, 0x0e, 0x92, 0xe3, 0xfd, 0x3d, 0xaa, 0x8a,\n  0xda, 0x99, 0xde, 0xa1, 0xe8, 0x8b, 0x07, 0xf1, 0x9c, 0x17, 0xeb, 0x0c,\n  0x3b, 0x58, 0x86, 0x18, 0x34, 0xa0, 0x06, 0x20, 0xd5, 0x3c, 0xbd, 0xd9,\n  0x47, 0xf4, 0x46, 0x93, 0xd5, 0x1b, 0x19, 0x9e, 0x1d, 0x51, 0x15, 0xe5,\n  0x91, 0x70, 0x28, 0x08, 0xa8, 0x84, 0xb0, 0x4f, 0x91, 0x4d, 0x8a, 0xa7,\n  0xaa, 0x50, 0x95, 0x36, 0x57, 0x6b, 0x04, 0xdc, 0x25, 0xde, 0x6a, 0xb3,\n  0x5a, 0x1d, 0xa4, 0xa6, 0x24, 0xb7, 0x98, 0x39, 0x95, 0x8c, 0xd6, 0x62,\n  0xcd, 0x01, 0x05, 0xaa, 0xab, 0x43, 0xa7, 0x6a, 0xa6, 0x13, 0x11, 0xef,\n  0x40, 0xec, 0x3d, 0x91, 0x3f, 0xfc, 0x19, 0xa1, 0x17, 0x7e, 0x60, 0x5a,\n  0x18, 0x8f, 0x8d, 0xf8, 0xfd, 0x03, 0x55, 0x37, 0xdf, 0x69, 0x1f, 0xdd,\n  0x8c, 0xd0, 0xe6, 0x11, 0xcb, 0x3d, 0x58, 0x91, 0x9c, 0x9b, 0x0d, 0xee,\n  0xcf, 0x75, 0xa8, 0xcd, 0x6a, 0x95, 0x4d, 0xd3, 0xb1, 0x75, 0x87, 0x45,\n  0x37, 0xac, 0xb3, 0xdc, 0x75, 0x63, 0x87, 0xd6, 0xa8, 0xd3, 0xd8, 0xf8,\n  0x8e, 0x5b, 0xef, 0x03, 0xac, 0xc2, 0x8e, 0xab, 0x7f, 0xa6, 0xff, 0x80,\n  0x77, 0x1d, 0x27, 0xc1, 0x2a, 0xac, 0xa5, 0x0e, 0xa6, 0xf7, 0xe1, 0x6e,\n  0x71, 0x36, 0x0d, 0xb6, 0xec, 0xec, 0x08, 0x38, 0x7f, 0x35, 0x88, 0x83,\n  0xd2, 0x55, 0xfa, 0x0c, 0xc5, 0x8a, 0xbc, 0xc8, 0xf2, 0x67, 0xe4, 0xbc,\n  0xea, 0xfd, 0x14, 0xa3, 0x46, 0x94, 0xc0, 0x50, 0xfb, 0xf1, 0x92, 0x81,\n  0xf7, 0x5c, 0xd5, 0x7e, 0x0a, 0x7f, 0x2b, 0xce, 0xc8, 0xf4, 0x6a, 0x22,\n  0x3f, 0x06, 0x88, 0xc4, 0xc9, 0xea, 0xf2, 0x52, 0x28, 0x72, 0x76, 0x79,\n  0x5d, 0x84, 0xd5, 0xd3, 0xa0, 0x93, 0x50, 0x89, 0xb5, 0x3c, 0x84, 0xf8,\n  0xf3, 0x4f, 0x0c, 0x6c, 0x0a, 0xf8, 0x12, 0x2c, 0x2a, 0x96, 0x1c, 0x24,\n  0x1d, 0x21, 0xe7, 0x50, 0xea, 0x37, 0x7d, 0x8b, 0x95, 0xa3, 0x55, 0x9e,\n  0x1a, 0xec, 0x5a, 0x96, 0x5a, 0xf6, 0x2f, 0xb9, 0xab, 0xf0, 0xa2, 0x89,\n  0x4e, 0x91, 0xe5, 0xff, 0xf3, 0x5b, 0x7b, 0x3b, 0xa6, 0xb6, 0xf6, 0x74,\n  0x4c, 0xbf, 0x12, 0xab, 0x28, 0x8f, 0xc5, 0xca, 0x2b, 0x62, 0xe8, 0xb6,\n  0x91, 0xa9, 0xb6, 0xfe, 0xa0, 0x5a, 0xac, 0xe5, 0x55, 0xc7, 0x8f, 0xa9,\n  0x85, 0x5a, 0x95, 0x1a, 0x0d, 0x10, 0xee, 0x97, 0x1f, 0x8f, 0x4d, 0x4d,\n  0x8d, 0x8d, 0x4f, 0x4e, 0x8e, 0xd7, 0xa4, 0xd3, 0x35, 0xb5, 0x6d, 0x6d,\n  0x72, 0x0d, 0x32, 0xfa, 0x32, 0xde, 0x5f, 0x83, 0x54, 0x09, 0x54, 0x7a,\n  0x24, 0xfc, 0x16, 0xa3, 0x41, 0xcb, 0x23, 0x38, 0xc0, 0x42, 0x2c, 0x56,\n  0x00, 0xea, 0x0c, 0x1c, 0x8b, 0xe0, 0xa5, 0x62, 0x3f, 0x30, 0x3d, 0xd2,\n  0xd4, 0x0c, 0x27, 0xc3, 0x67, 0x52, 0xf4, 0x18, 0x30, 0x6d, 0xba, 0x1c,\n  0x22, 0xcf, 0x32, 0x54, 0x10, 0x05, 0x79, 0x5e, 0xaa, 0xe2, 0x4a, 0x2a,\n  0x60, 0xb9, 0x3c, 0x29, 0x25, 0xac, 0x97, 0xbb, 0x2b, 0x95, 0x54, 0x58,\n  0xed, 0x16, 0x72, 0xfe, 0x63, 0xab, 0x43, 0xf5, 0xa1, 0x14, 0x9b, 0x64,\n  0x07, 0xfa, 0x12, 0x3d, 0xa5, 0xf6, 0x2a, 0xa7, 0xbb, 0xc2, 0xee, 0x6b,\n  0xaf, 0x6d, 0xda, 0x54, 0x3d, 0x59, 0x17, 0xdb, 0xd2, 0x12, 0x75, 0xde,\n  0xd2, 0x54, 0xde, 0x34, 0x3e, 0x13, 0x18, 0xec, 0x38, 0x26, 0xea, 0xf9,\n  0x66, 0xc1, 0x20, 0xbc, 0x92, 0xe8, 0x8a, 0x0f, 0xf5, 0x74, 0x1c, 0x1c,\n  0x75, 0xdc, 0x51, 0xd3, 0x4c, 0xb3, 0xdb, 0x93, 0x89, 0x6f, 0xa7, 0xf1,\n  0x58, 0x62, 0xd5, 0x65, 0xbe, 0x4e, 0x72, 0x82, 0xfc, 0x54, 0x29, 0x55,\n  0x49, 0x6d, 0x49, 0x8f, 0x62, 0x75, 0xe4, 0xa8, 0xf3, 0xf8, 0x07, 0x6f,\n  0x33, 0x02, 0x9e, 0x8f, 0xbc, 0x06, 0xab, 0x2a, 0xcf, 0xe2, 0xa1, 0xc2,\n  0x0e, 0xfc, 0x14, 0x1e, 0x2a, 0x7a, 0x5e, 0xa7, 0x52, 0x63, 0x25, 0x16,\n  0xe9, 0x91, 0xb2, 0xb2, 0x40, 0xb1, 0xcd, 0x4a, 0x51, 0x65, 0x95, 0x65,\n  0x95, 0x58, 0x7e, 0x91, 0xe2, 0xd2, 0x40, 0xa9, 0x54, 0x14, 0x46, 0xc2,\n  0x45, 0x0e, 0x93, 0x9e, 0x87, 0xac, 0x18, 0x85, 0xe4, 0xc4, 0x14, 0x92,\n  0x98, 0x2f, 0x22, 0x6b, 0xe0, 0x74, 0x09, 0xd8, 0x13, 0x98, 0xdf, 0x83,\n  0x36, 0xb1, 0x88, 0xa5, 0x47, 0x16, 0x33, 0x9f, 0x84, 0x18, 0x14, 0x7d,\n  0x21, 0x3d, 0x31, 0xd6, 0x93, 0xde, 0x3a, 0xde, 0x5d, 0x16, 0x8d, 0x96,\n  0x95, 0xc6, 0x63, 0x93, 0x08, 0xe1, 0xc1, 0xf8, 0xb8, 0xbb, 0x7b, 0x93,\n  0x0b, 0xbd, 0x03, 0x0f, 0xcc, 0xb0, 0xbb, 0xb7, 0xc7, 0x93, 0xb9, 0xfe,\n  0xc2, 0xf4, 0xf8, 0xf8, 0xd4, 0xe4, 0x96, 0xf1, 0xe9, 0xa6, 0xc6, 0xfa,\n  0x86, 0x54, 0xaa, 0xa1, 0xbe, 0xf1, 0xd9, 0x4d, 0x9b, 0xc8, 0x9e, 0x6a,\n  0x42, 0x07, 0xe8, 0xcf, 0xe0, 0x3e, 0x5a, 0xb1, 0xbe, 0x62, 0xbf, 0xde,\n  0xa0, 0xc1, 0x0f, 0xe5, 0xd0, 0xa0, 0x5a, 0x54, 0xb1, 0x0c, 0x87, 0x77,\n  0x94, 0x0b, 0x50, 0x2c, 0xc9, 0x71, 0xd4, 0x14, 0xfc, 0x9f, 0xe2, 0xe6,\n  0x01, 0xdf, 0x9d, 0x1b, 0xb1, 0x61, 0x93, 0xcc, 0xe6, 0xb5, 0xc9, 0x47,\n  0x72, 0xf8, 0x66, 0xab, 0xdd, 0x64, 0x36, 0x69, 0x78, 0x88, 0x7e, 0x25,\n  0xb1, 0x02, 0x41, 0x96, 0xb2, 0x12, 0x02, 0x03, 0x6e, 0x01, 0x39, 0x3c,\n  0x85, 0x36, 0xcd, 0xcd, 0x2d, 0x6c, 0x4b, 0xd3, 0x88, 0xdd, 0x93, 0xc2,\n  0xce, 0x36, 0x9d, 0xf9, 0xe3, 0x1e, 0xa4, 0xde, 0x8b, 0x0e, 0xa0, 0x9d,\n  0x99, 0xdf, 0x22, 0x43, 0xe6, 0xaf, 0xbf, 0x2e, 0x56, 0x6a, 0xe1, 0x5f,\n  0xc6, 0x38, 0xff, 0x1d, 0x54, 0x52, 0x57, 0x97, 0xf9, 0x61, 0x16, 0x67,\n  0xe7, 0x57, 0x90, 0xef, 0x86, 0x6e, 0x20, 0x6d, 0xae, 0xb9, 0xfa, 0x0a,\n  0xdd, 0x40, 0x3b, 0xb0, 0xcd, 0x16, 0xa4, 0xfa, 0xd2, 0x3d, 0x01, 0x0f,\n  0xcd, 0xb1, 0x76, 0x9b, 0x01, 0xb7, 0x1c, 0xaa, 0xdb, 0x29, 0x16, 0xef,\n  0x7d, 0xfb, 0xa1, 0x9d, 0x34, 0xee, 0x01, 0xde, 0xf9, 0xf0, 0x28, 0xce,\n  0x90, 0x70, 0x21, 0x8f, 0xe7, 0x1f, 0x35, 0xe6, 0x76, 0x23, 0xca, 0x1d,\n  0x74, 0x07, 0xfd, 0x3e, 0x8b, 0x09, 0x0a, 0x93, 0x29, 0x17, 0x72, 0x89,\n  0xbc, 0x72, 0xe0, 0x26, 0xe5, 0x89, 0xe0, 0x0d, 0x50, 0xce, 0x5d, 0xd6,\n  0xd3, 0x96, 0x94, 0x74, 0xfa, 0x66, 0x43, 0xa9, 0x89, 0xeb, 0x9b, 0x2b,\n  0x06, 0xb6, 0x57, 0xf4, 0xdf, 0xd0, 0x9d, 0x39, 0x64, 0x1f, 0x2e, 0xef,\n  0x9b, 0x0c, 0x86, 0x1c, 0xcd, 0x13, 0x13, 0x96, 0xc1, 0xda, 0xea, 0xcd,\n  0x0e, 0xd3, 0xf0, 0xe9, 0xcd, 0x9b, 0xf7, 0x75, 0x17, 0x77, 0x9d, 0xda,\n  0xfa, 0x51, 0x47, 0xa4, 0xa5, 0xce, 0x1a, 0x69, 0x8b, 0xa0, 0xb6, 0x3b,\n  0xac, 0xd1, 0xa0, 0xe3, 0x22, 0x45, 0x92, 0x05, 0x8a, 0xaf, 0xbe, 0x4e,\n  0xbf, 0x4c, 0xf6, 0x7f, 0x23, 0xc1, 0x2a, 0xec, 0xa4, 0xee, 0x4a, 0x03,\n  0x1e, 0x34, 0xc3, 0x51, 0xad, 0x61, 0x07, 0x23, 0x90, 0x7c, 0xc4, 0x22,\n  0x92, 0x1a, 0xc3, 0x51, 0x3c, 0xc3, 0xf1, 0x07, 0x54, 0x64, 0xc1, 0x27,\n  0x06, 0x0e, 0xa1, 0x5c, 0x44, 0x0b, 0x6a, 0x56, 0x64, 0x64, 0x64, 0xd9,\n  0x58, 0xa1, 0xab, 0x44, 0x42, 0x64, 0x00, 0xd7, 0xb2, 0x0b, 0x6a, 0x6c,\n  0x70, 0x1e, 0x63, 0xb1, 0x65, 0x19, 0xac, 0xaf, 0x33, 0x9b, 0xc0, 0x3e,\n  0xaa, 0xeb, 0xac, 0xef, 0xac, 0xae, 0xf4, 0xfb, 0x4c, 0x09, 0x73, 0x82,\n  0x35, 0xb2, 0x78, 0xbf, 0x25, 0x86, 0x07, 0x00, 0x9f, 0x62, 0x35, 0x44,\n  0x0c, 0x04, 0x2e, 0xf1, 0x54, 0xc2, 0x86, 0x4d, 0xd2, 0x24, 0x11, 0x03,\n  0xd7, 0x67, 0x4f, 0x21, 0xe1, 0x28, 0x95, 0x9c, 0xc5, 0x33, 0x75, 0xcb,\n  0x4a, 0x29, 0x65, 0x86, 0xc4, 0x62, 0x24, 0xa4, 0x76, 0x04, 0x7d, 0x7c,\n  0x20, 0x33, 0x68, 0x63, 0x90, 0xda, 0xa9, 0xab, 0x0b, 0xdd, 0xde, 0x87,\n  0x8e, 0xf4, 0x0d, 0x97, 0x17, 0xfb, 0x03, 0xd1, 0xf6, 0x48, 0xfd, 0x68,\n  0x49, 0x51, 0xac, 0x72, 0x4b, 0x87, 0x2f, 0x12, 0x2e, 0x2e, 0x0e, 0xc7,\n  0x3d, 0x25, 0xf1, 0xf2, 0xa8, 0x2e, 0x10, 0x8c, 0x13, 0x20, 0xa0, 0x22,\n  0x64, 0x75, 0x97, 0xd8, 0x54, 0x36, 0x55, 0xac, 0x7a, 0x7b, 0x66, 0x22,\n  0xf3, 0x7c, 0xba, 0x21, 0x51, 0x67, 0xb2, 0x96, 0x46, 0xc3, 0x35, 0xae,\n  0x54, 0x7d, 0xa4, 0xca, 0x68, 0xac, 0x4f, 0x34, 0x74, 0xe1, 0xa9, 0x16,\n  0xf0, 0xba, 0x7d, 0x3e, 0xb7, 0x3b, 0xf8, 0x7c, 0xd8, 0xeb, 0x8b, 0xea,\n  0x38, 0x63, 0xdc, 0xe7, 0x0d, 0x83, 0x5c, 0x4d, 0x58, 0xae, 0x7f, 0xc2,\n  0x7b, 0x4b, 0x1c, 0xef, 0xe0, 0x9b, 0xb0, 0x8d, 0x34, 0x87, 0xaa, 0x64,\n  0xf4, 0x7a, 0x17, 0xde, 0xcc, 0x9d, 0x78, 0x81, 0x09, 0x4a, 0xc4, 0x34,\n  0x6a, 0x38, 0xac, 0x9e, 0x49, 0x27, 0x19, 0x0d, 0xc5, 0x0f, 0x7a, 0xc8,\n  0xd7, 0xfc, 0x5a, 0x5f, 0xcf, 0x48, 0x8f, 0x48, 0x61, 0x47, 0x4f, 0x8d,\n  0x54, 0xd8, 0x96, 0x47, 0x5a, 0x00, 0x1d, 0xc0, 0xab, 0x33, 0x84, 0x34,\n  0x20, 0x1a, 0x7f, 0x5d, 0xb6, 0xe6, 0xf9, 0xf0, 0x90, 0x81, 0x98, 0xf2,\n  0x7a, 0x51, 0xc7, 0x48, 0x78, 0xaa, 0xd2, 0x38, 0x36, 0xae, 0xbe, 0x99,\n  0xe7, 0x09, 0x54, 0x34, 0x09, 0x28, 0xac, 0xf7, 0x80, 0x74, 0xeb, 0xc6,\n  0xef, 0xd5, 0x01, 0x88, 0x2b, 0x79, 0x82, 0x88, 0xdd, 0x0b, 0xc5, 0x1a,\n  0x28, 0xdd, 0x32, 0x5e, 0x51, 0x9e, 0x48, 0x20, 0x6a, 0x7c, 0x6e, 0xcb,\n  0xdc, 0xd0, 0x40, 0x73, 0x63, 0xf9, 0xa6, 0x8a, 0x4d, 0x89, 0xb2, 0x44,\n  0x59, 0x69, 0x89, 0x44, 0x01, 0xa2, 0xd3, 0x60, 0xf7, 0x21, 0x8e, 0xe2,\n  0x46, 0x1d, 0xd9, 0x3a, 0x64, 0xda, 0xcd, 0x82, 0x09, 0xce, 0xcb, 0xf0,\n  0x19, 0x0c, 0x56, 0x13, 0xee, 0x4d, 0x6b, 0xc6, 0xa5, 0x48, 0xba, 0xa8,\n  0xa7, 0xad, 0xb6, 0xaa, 0xa9, 0xb6, 0xb1, 0xb1, 0xa6, 0x32, 0xe1, 0xf3,\n  0xa7, 0x3c, 0x61, 0xff, 0xa6, 0x8a, 0xde, 0xcd, 0xa5, 0x58, 0x2b, 0x26,\n  0xe6, 0x88, 0xde, 0xa0, 0xbb, 0xaf, 0xa9, 0x2d, 0xc8, 0xae, 0x33, 0xb4,\n  0x07, 0x13, 0xa1, 0x70, 0xa0, 0x3e, 0xe6, 0x2f, 0xf6, 0xd9, 0x4c, 0x15,\n  0x0e, 0x77, 0x5b, 0x55, 0xbc, 0x56, 0xcd, 0x08, 0xc9, 0x44, 0x53, 0x1f,\n  0x58, 0x21, 0x57, 0xea, 0xc4, 0x37, 0xa7, 0x3e, 0x58, 0x7f, 0x42, 0x58,\n  0x7f, 0xfe, 0x87, 0xcc, 0xcb, 0x20, 0xf6, 0x00, 0x7b, 0xa9, 0x09, 0x6c,\n  0x81, 0xbb, 0xdc, 0x36, 0x9a, 0x15, 0xac, 0x48, 0x85, 0x2d, 0x11, 0x46,\n  0x2d, 0x60, 0x05, 0x19, 0xa9, 0x4b, 0x30, 0x1a, 0x02, 0xa8, 0x5f, 0xa4,\n  0xe8, 0x05, 0x03, 0xc3, 0xc3, 0xe8, 0x10, 0xad, 0x61, 0x48, 0xf0, 0x82,\n  0x9a, 0xe7, 0x24, 0xdb, 0x8c, 0x65, 0x89, 0xa9, 0x72, 0x82, 0x0c, 0x0a,\n  0xc2, 0xc3, 0xaa, 0x95, 0x27, 0xad, 0x14, 0x27, 0x69, 0xdc, 0xd8, 0xcd,\n  0x5a, 0x32, 0x97, 0xf3, 0xc6, 0xd5, 0x93, 0xae, 0x07, 0x87, 0x42, 0x25,\n  0xe0, 0x2d, 0x67, 0x9d, 0x67, 0x14, 0xb8, 0x13, 0x6b, 0x44, 0x49, 0xdf,\n  0xe6, 0x70, 0x88, 0xc3, 0xcb, 0xc0, 0xe6, 0x89, 0xbe, 0x89, 0xae, 0x8e,\n  0xea, 0xca, 0x50, 0x73, 0xb8, 0x59, 0xb2, 0x12, 0xcd, 0x46, 0xad, 0x9a,\n  0x0d, 0x72, 0x41, 0xb2, 0x1c, 0x18, 0x95, 0xe5, 0x20, 0x2f, 0xed, 0x1d,\n  0x94, 0xa1, 0x1e, 0x1b, 0x52, 0x82, 0x32, 0xe6, 0x6f, 0x7e, 0x81, 0xb8,\n  0x9b, 0x0c, 0x74, 0x7d, 0x71, 0x8f, 0xdd, 0xb3, 0xc9, 0x5d, 0x9e, 0x4a,\n  0x55, 0xb9, 0x23, 0x06, 0xbf, 0xf1, 0xf7, 0x4f, 0xab, 0xb4, 0x3e, 0x53,\n  0xd7, 0xec, 0x04, 0x3a, 0xb1, 0xb1, 0xf5, 0xc2, 0xa6, 0xd3, 0x75, 0x19,\n  0x2d, 0xf1, 0xd2, 0x68, 0x89, 0xc8, 0x5a, 0xbf, 0x5d, 0x7f, 0x98, 0x66,\n  0xbb, 0xd3, 0x3d, 0x43, 0x99, 0x9f, 0xbf, 0xd9, 0x75, 0xa3, 0x0a, 0x8f,\n  0xfb, 0x6b, 0x64, 0xdc, 0xd5, 0x54, 0x08, 0xef, 0xef, 0x2d, 0xd4, 0x83,\n  0x69, 0x2d, 0xa0, 0xf9, 0xd7, 0x17, 0x99, 0x18, 0x91, 0x55, 0x56, 0xe3,\n  0x52, 0xbc, 0x8e, 0x0a, 0xa2, 0xc0, 0x8a, 0x67, 0xb0, 0xf7, 0x27, 0xb0,\n  0xbc, 0x70, 0x80, 0xc0, 0x75, 0x31, 0xb2, 0xa4, 0x45, 0x11, 0x2d, 0x68,\n  0x38, 0x95, 0xb2, 0x2a, 0x57, 0xae, 0x77, 0xb5, 0x8a, 0x8c, 0x0b, 0xdc,\n  0xc3, 0x61, 0xab, 0x96, 0xe3, 0x8e, 0x71, 0x78, 0x75, 0x0e, 0x57, 0x57,\n  0x69, 0x35, 0xb0, 0x3a, 0x57, 0xb5, 0x54, 0xb7, 0x94, 0x26, 0x5c, 0x0e,\n  0x4d, 0x48, 0x1b, 0x62, 0xd5, 0xac, 0x5a, 0x54, 0x7c, 0x59, 0x9d, 0x32,\n  0x20, 0x16, 0xd8, 0x47, 0x99, 0x37, 0x2f, 0xf8, 0x05, 0x22, 0xf8, 0xbe,\n  0x0f, 0xbd, 0x80, 0x62, 0x1f, 0x42, 0x1f, 0xdf, 0xe8, 0xaa, 0x7c, 0x5d,\n  0x4b, 0x75, 0xe6, 0xfc, 0x9b, 0x5d, 0x8e, 0xb1, 0x9f, 0xfb, 0xec, 0xd5,\n  0x10, 0x95, 0xbe, 0xfa, 0xcf, 0xd8, 0xa7, 0x92, 0x71, 0x56, 0x65, 0x0a,\n  0xc0, 0x82, 0x90, 0xad, 0x0a, 0x75, 0x1d, 0x41, 0x0b, 0xcd, 0xc2, 0x65,\n  0xa6, 0xb3, 0x08, 0xb8, 0xb9, 0xb4, 0x8b, 0xc0, 0x55, 0x82, 0xfe, 0x1a,\n  0x6d, 0x65, 0x46, 0xf0, 0x88, 0x59, 0x20, 0xba, 0x6e, 0xc8, 0xd6, 0xe2,\n  0x63, 0xcf, 0x01, 0x31, 0x53, 0x3c, 0x47, 0xcb, 0x70, 0x59, 0x04, 0x63,\n  0x6f, 0x1e, 0xf2, 0x66, 0x47, 0x34, 0x1a, 0x8d, 0x45, 0x63, 0xc1, 0x06,\n  0x8a, 0xc9, 0x28, 0x68, 0x3d, 0xa5, 0x88, 0x14, 0xfd, 0xa4, 0xb0, 0x95,\n  0x92, 0x24, 0x66, 0x0a, 0x6c, 0x78, 0x68, 0x6b, 0xeb, 0xc0, 0x3f, 0x7f,\n  0xa9, 0xaf, 0xf5, 0x22, 0xb6, 0xcc, 0x8b, 0x35, 0xa3, 0x34, 0xb5, 0x73,\n  0x67, 0x2d, 0xf2, 0x64, 0xfe, 0x6b, 0x87, 0xad, 0xc1, 0xa9, 0xa9, 0x36,\n  0xdd, 0x20, 0xe5, 0xe4, 0xa2, 0x77, 0xa3, 0x34, 0x33, 0x48, 0x15, 0x51,\n  0x9d, 0xe9, 0x76, 0x1f, 0x84, 0x3f, 0xbd, 0x46, 0xbc, 0x71, 0x18, 0xf0,\n  0xe2, 0xc0, 0xe4, 0x20, 0xd1, 0x48, 0x69, 0xc1, 0xfb, 0xc9, 0xb1, 0xee,\n  0x8c, 0x9c, 0x89, 0xc4, 0xd0, 0x63, 0x52, 0x45, 0x70, 0x18, 0xfb, 0x2d,\n  0x26, 0xd2, 0x8a, 0x9c, 0x99, 0x14, 0x5a, 0x3d, 0xd1, 0x50, 0xa9, 0x32,\n  0x2b, 0xc6, 0x57, 0x4c, 0x17, 0x66, 0x50, 0xd1, 0xf8, 0xbc, 0x69, 0x80,\n  0x5f, 0xeb, 0xc5, 0xb2, 0xe9, 0x22, 0x68, 0x49, 0x25, 0xe9, 0x18, 0x50,\n  0x78, 0xc8, 0xa8, 0xbf, 0x17, 0x28, 0x22, 0x77, 0x2a, 0x57, 0xec, 0x3c,\n  0xc5, 0x9b, 0x4c, 0xac, 0xd6, 0x59, 0x6a, 0x91, 0x74, 0x6a, 0x44, 0xd2,\n  0x8d, 0xbf, 0x96, 0x06, 0x5d, 0xca, 0x65, 0x70, 0xa1, 0xf7, 0xa0, 0x4d,\n  0xcc, 0x04, 0xe1, 0x5e, 0xa9, 0x86, 0x48, 0x95, 0xdf, 0xcc, 0x33, 0x00,\n  0x1b, 0x83, 0x4d, 0x77, 0xec, 0xc3, 0x30, 0x14, 0xf8, 0x2c, 0x08, 0x91,\n  0x4e, 0xc2, 0xc9, 0x1c, 0x83, 0xc6, 0xdc, 0x2e, 0xa8, 0xfe, 0x73, 0x85,\n  0xdd, 0x61, 0x9d, 0x06, 0xdc, 0x12, 0x5e, 0x9b, 0xcd, 0xd6, 0xb3, 0x2f,\n  0x1f, 0x3d, 0xd5, 0xe7, 0x32, 0x65, 0x39, 0x88, 0xd2, 0x2e, 0xe3, 0x79,\n  0x63, 0xa5, 0xfd, 0x98, 0xac, 0x98, 0x9d, 0x8a, 0xa6, 0x86, 0xb1, 0x76,\n  0x16, 0x61, 0x2d, 0xad, 0xc4, 0xca, 0x99, 0x00, 0x2d, 0x65, 0x26, 0x96,\n  0x55, 0x31, 0xab, 0x9f, 0xd5, 0xee, 0x7a, 0xd0, 0x47, 0x2d, 0xd1, 0xcc,\n  0x4f, 0x11, 0x7d, 0x24, 0xaa, 0x49, 0x51, 0x76, 0x2a, 0x71, 0x75, 0x13,\n  0xf3, 0x55, 0xfa, 0x45, 0x3c, 0xeb, 0x55, 0x94, 0x8e, 0x32, 0x51, 0x0e,\n  0x82, 0xc9, 0x58, 0x4a, 0x35, 0x51, 0xfd, 0xd4, 0x24, 0x35, 0x47, 0x2d,\n  0x52, 0x7b, 0xa9, 0xa3, 0xd4, 0x09, 0xea, 0x24, 0xf5, 0x16, 0xea, 0x2c,\n  0x75, 0x07, 0x75, 0x37, 0x75, 0x2f, 0x13, 0x18, 0xf8, 0x98, 0x1a, 0x10,\n  0x2e, 0x3a, 0x51, 0xb1, 0xab, 0x12, 0x59, 0x8a, 0x2b, 0x90, 0xdd, 0xc3,\n  0x40, 0x9d, 0xa7, 0x26, 0xff, 0x53, 0xa3, 0x87, 0xe0, 0x5e, 0xe4, 0x5f,\n  0x06, 0x21, 0x4e, 0xb8, 0xfb, 0xed, 0x29, 0x0d, 0x8d, 0x68, 0x1d, 0x8d,\n  0x8e, 0x27, 0x50, 0x24, 0x10, 0x8d, 0x46, 0x8e, 0xab, 0x04, 0x8e, 0x61,\n  0x29, 0x75, 0xad, 0x98, 0xe4, 0x6b, 0xd8, 0x6a, 0x11, 0x28, 0x14, 0x97,\n  0x0c, 0x48, 0x87, 0xad, 0xb0, 0x29, 0xca, 0x64, 0xd5, 0x9a, 0x66, 0x6c,\n  0xd8, 0x1e, 0x72, 0xea, 0x19, 0xad, 0xd7, 0xaa, 0xdd, 0x4f, 0xb9, 0xea,\n  0x51, 0xb1, 0xc5, 0x55, 0xbc, 0xbf, 0x08, 0x79, 0x7d, 0xc8, 0x63, 0xf7,\n  0x7a, 0x96, 0x28, 0xbb, 0xd1, 0x62, 0x9f, 0xf2, 0x3b, 0x68, 0x4b, 0x9d,\n  0x99, 0x36, 0x06, 0x2d, 0xc6, 0xfd, 0x61, 0x14, 0x0c, 0xa1, 0x40, 0x24,\n  0x18, 0x58, 0xaa, 0x2c, 0x2f, 0x8d, 0xb3, 0x78, 0xd6, 0x47, 0xa7, 0xa4,\n  0x7f, 0x45, 0x63, 0x3b, 0x5b, 0xaa, 0x9a, 0x2b, 0x9a, 0xca, 0x1a, 0x4b,\n  0x1a, 0x54, 0xb1, 0x68, 0x6c, 0x54, 0x6e, 0xfd, 0xb9, 0x37, 0xd3, 0x2a,\n  0x9b, 0x95, 0x36, 0x49, 0x0d, 0x32, 0xad, 0x6a, 0x90, 0x11, 0x37, 0x08,\n  0x9a, 0x62, 0xaf, 0x33, 0x33, 0x7f, 0x41, 0x5b, 0xf4, 0xff, 0x1f, 0x94,\n  0x50, 0xfa, 0x1d, 0x4a, 0x83, 0x74, 0x67, 0x48, 0x8b, 0x02, 0x91, 0xe8,\n  0x99, 0xff, 0x57, 0x9b, 0x04, 0x65, 0xb5, 0xef, 0xbc, 0xe7, 0x9e, 0x8b,\n  0x17, 0xcf, 0x9d, 0x3b, 0x7d, 0xfa, 0xa6, 0x9b, 0x96, 0x96, 0xca, 0xcb,\n  0xcc, 0x66, 0xbd, 0x5e, 0xad, 0x06, 0x64, 0xd3, 0x7b, 0xee, 0xbd, 0xe7,\n  0xde, 0xb7, 0xbf, 0xed, 0xe2, 0xdd, 0x17, 0xef, 0xbe, 0xeb, 0xce, 0x73,\n  0x77, 0x9c, 0xbb, 0xe3, 0xc2, 0xf9, 0xd3, 0x67, 0x4f, 0x9f, 0xbd, 0xfd,\n  0xad, 0x67, 0x6e, 0xbb, 0xe9, 0x2d, 0x37, 0xbd, 0xe5, 0xd4, 0xad, 0xb7,\n  0xdc, 0x7c, 0xf2, 0xc6, 0x1b, 0xae, 0x3f, 0x71, 0xfc, 0xd8, 0x75, 0x4b,\n  0x47, 0x97, 0x8e, 0x1c, 0xd8, 0xb7, 0x77, 0xcf, 0xee, 0x5d, 0x8b, 0x0b,\n  0x3b, 0xe7, 0xe7, 0xb6, 0xcf, 0x4c, 0x6d, 0xdd, 0x32, 0x32, 0xd4, 0xbf,\n  0xb9, 0xb5, 0xb9, 0xbe, 0x2e, 0x59, 0x5d, 0x86, 0xbd, 0xe2, 0x92, 0x78,\n  0x38, 0x08, 0xc7, 0x71, 0x04, 0xb2, 0xcf, 0x61, 0x26, 0xd9, 0x16, 0x7a,\n  0x93, 0xde, 0x64, 0x34, 0xa8, 0x75, 0x6a, 0x9d, 0x56, 0xc3, 0xab, 0x78,\n  0x80, 0xf1, 0x23, 0x79, 0xcf, 0xad, 0xbc, 0xb3, 0x14, 0xa5, 0xb0, 0x41,\n  0x90, 0x0a, 0xc8, 0x1c, 0xe5, 0xf0, 0xc3, 0xc1, 0x27, 0x36, 0x0e, 0x9b,\n  0x90, 0xe4, 0x27, 0xe7, 0xd0, 0x81, 0x53, 0x22, 0xe8, 0x04, 0x56, 0x80,\n  0x47, 0x79, 0x66, 0x65, 0x88, 0xa4, 0xa8, 0x64, 0xe1, 0x4d, 0xe5, 0x64,\n  0xde, 0xec, 0x63, 0xe4, 0xb8, 0x36, 0xf6, 0x90, 0xa5, 0x0f, 0x10, 0xc9,\n  0xee, 0x08, 0x64, 0xd9, 0xd1, 0x09, 0x43, 0x3a, 0xfe, 0x61, 0x52, 0x97,\n  0x52, 0x99, 0x7f, 0x3f, 0x9f, 0x79, 0x06, 0xff, 0x77, 0x2e, 0xf3, 0xe4,\n  0xa5, 0x39, 0xe6, 0x40, 0x2a, 0xf5, 0xc6, 0xbb, 0xea, 0xea, 0x50, 0x6f,\n  0x5b, 0x67, 0x67, 0x1b, 0xfc, 0xa0, 0x1a, 0xa7, 0x41, 0x34, 0xa8, 0xcd,\n  0xce, 0xd6, 0xba, 0xcc, 0xd7, 0xf1, 0x2a, 0xe2, 0xb0, 0xd9, 0x8b, 0x52,\n  0x15, 0x7b, 0x7e, 0x5d, 0x1c, 0x0c, 0xf9, 0xfd, 0xa1, 0x60, 0x31, 0x8a,\n  0x15, 0x3b, 0x4c, 0xa5, 0xbe, 0xcc, 0x44, 0x5d, 0x1d, 0xdc, 0x9c, 0xe9,\n  0x0c, 0x3b, 0xcd, 0x66, 0x77, 0xa6, 0x46, 0xfa, 0xf5, 0x8d, 0x9d, 0x75,\n  0x73, 0xf4, 0x4d, 0xf3, 0xa9, 0x2b, 0x2f, 0xc3, 0x1b, 0xfe, 0x74, 0x9e,\n  0x7e, 0xaa, 0xee, 0xd2, 0x5c, 0x1d, 0xf9, 0x33, 0x77, 0xa9, 0x6e, 0xee,\n  0x73, 0xe7, 0xce, 0x9d, 0xfb, 0x79, 0xe7, 0xd8, 0x58, 0x67, 0xd7, 0xe8,\n  0xe8, 0x0f, 0xb8, 0x1a, 0xec, 0x50, 0xb9, 0xbe, 0xf8, 0x85, 0xea, 0x0a,\n  0x14, 0x28, 0x4e, 0x38, 0x8b, 0x59, 0x96, 0xf5, 0x06, 0x63, 0x65, 0xf7,\n  0x96, 0x27, 0x93, 0xe5, 0xf8, 0xc7, 0x60, 0x34, 0xfa, 0x3f, 0x7b, 0xfe,\n  0xfc, 0xf9, 0xba, 0x01, 0x9b, 0xd9, 0x68, 0xcd, 0xfc, 0x0e, 0xdf, 0x9a,\n  0xf9, 0xe8, 0xa5, 0xf9, 0x54, 0x6a, 0xfe, 0x52, 0x8a, 0xfc, 0x21, 0x6b,\n  0x70, 0xe2, 0xea, 0x6e, 0xe6, 0xb3, 0x84, 0x67, 0x18, 0x56, 0x2b, 0xec,\n  0xa1, 0x9b, 0xf0, 0x2a, 0x6e, 0x66, 0x00, 0xbd, 0x8b, 0xc6, 0x1b, 0x2a,\n  0xd3, 0x47, 0xd8, 0x2f, 0x28, 0x12, 0x80, 0x67, 0x58, 0xe6, 0x02, 0x5e,\n  0x97, 0x59, 0x96, 0x9e, 0x22, 0xb4, 0x56, 0x0b, 0x78, 0x5f, 0x64, 0xc7,\n  0x58, 0x16, 0x46, 0x95, 0xf5, 0xb3, 0xfe, 0x48, 0x39, 0x8f, 0xc7, 0x4c,\n  0xc5, 0x70, 0x29, 0x92, 0xea, 0x2f, 0xef, 0x35, 0x8e, 0xac, 0x0d, 0x81,\n  0x97, 0x60, 0x5b, 0xee, 0xd1, 0x10, 0xfa, 0x3d, 0xfa, 0x5a, 0x26, 0x95,\n  0xa9, 0x43, 0xff, 0x69, 0x0d, 0x94, 0x96, 0x6e, 0x1f, 0x2d, 0x99, 0x0e,\n  0xc6, 0x03, 0x6d, 0x1e, 0x7f, 0x91, 0x3b, 0x10, 0x09, 0xe8, 0xe2, 0x3e,\n  0x4f, 0x22, 0xe1, 0xf1, 0xc5, 0xe9, 0xd7, 0x33, 0x75, 0xf8, 0x9a, 0xcb,\n  0xb7, 0x3a, 0x5c, 0x45, 0xae, 0x50, 0x6b, 0x75, 0x57, 0xbf, 0xd7, 0x3a,\n  0x65, 0xb2, 0x7b, 0x1d, 0xde, 0x90, 0xbb, 0xa8, 0x3e, 0xe6, 0xbb, 0x00,\n  0x72, 0x8d, 0x14, 0x15, 0x51, 0x59, 0x4e, 0xf1, 0x92, 0x1c, 0x4e, 0xf1,\n  0x81, 0x8f, 0xc9, 0xf1, 0x68, 0x29, 0x16, 0x49, 0xf3, 0x34, 0x2f, 0xd7,\n  0xb3, 0xbe, 0x46, 0xef, 0xa4, 0xaf, 0x50, 0x49, 0xaa, 0x95, 0xda, 0x9a,\n  0x1e, 0xf7, 0x20, 0x96, 0x76, 0x23, 0x1e, 0xef, 0xf3, 0x2a, 0x38, 0xd3,\n  0xc6, 0x5b, 0x2f, 0x0d, 0xe4, 0x14, 0x2c, 0xcf, 0xb1, 0xfb, 0x97, 0x79,\n  0x1d, 0x5b, 0x48, 0xb2, 0x91, 0x8c, 0x42, 0x95, 0xaa, 0x45, 0x54, 0x73,\n  0x53, 0x6d, 0x6b, 0xaa, 0xb5, 0xa2, 0x3c, 0x1e, 0xf5, 0xfb, 0x9c, 0x76,\n  0xbd, 0x96, 0x80, 0x13, 0x60, 0x4b, 0x4a, 0x2b, 0xe3, 0xe0, 0x90, 0x73,\n  0x41, 0xdb, 0x32, 0xd0, 0xee, 0x4a, 0xa7, 0x67, 0x79, 0x4b, 0x22, 0xc9,\n  0x54, 0x0e, 0x19, 0x33, 0x27, 0x1a, 0x45, 0xc5, 0x47, 0x6e, 0x31, 0xf7,\n  0xa4, 0x11, 0x6a, 0xbe, 0x79, 0x47, 0xef, 0x58, 0x31, 0x9e, 0x21, 0x5a,\n  0x97, 0x68, 0x31, 0x57, 0xbb, 0x6b, 0x62, 0xfa, 0xca, 0xfa, 0x99, 0xed,\n  0x08, 0x9d, 0x7a, 0x57, 0xd7, 0x96, 0xe9, 0xd2, 0xd2, 0xaa, 0x23, 0xdb,\n  0x75, 0xd3, 0xf4, 0x95, 0x07, 0xcf, 0xf5, 0x69, 0x3c, 0x86, 0xfd, 0x8f,\n  0xcd, 0x25, 0xc7, 0xca, 0x13, 0x43, 0x2e, 0x87, 0x49, 0xe4, 0xda, 0x44,\n  0x5d, 0x6d, 0x2c, 0x38, 0x56, 0x5e, 0xd2, 0xf9, 0xce, 0x4b, 0x1a, 0x9f,\n  0x9a, 0x6e, 0x98, 0x6b, 0x6a, 0x9f, 0xdc, 0x5c, 0x16, 0x8d, 0x34, 0x87,\n  0xd0, 0xd2, 0x51, 0x05, 0x87, 0xb7, 0x9e, 0xfe, 0x36, 0xe5, 0xa6, 0x9e,\n  0x1a, 0xf8, 0x58, 0x1c, 0xc0, 0xaa, 0x00, 0xf8, 0xce, 0x69, 0xd3, 0x90,\n  0xc1, 0xf7, 0x90, 0x5f, 0x19, 0xe5, 0x57, 0x79, 0xbb, 0x31, 0x65, 0x81,\n  0x7f, 0x9a, 0x14, 0x50, 0x2b, 0x09, 0x75, 0x60, 0xf9, 0x8b, 0xda, 0xe5,\n  0x2f, 0xe2, 0x6b, 0xdd, 0x01, 0x5e, 0x8a, 0x8d, 0x92, 0x81, 0x48, 0x49,\n  0xba, 0x5b, 0xf6, 0x4b, 0xfc, 0x39, 0x01, 0x18, 0xca, 0xfb, 0x12, 0x91,\n  0xda, 0xff, 0x4f, 0x98, 0x9d, 0xe1, 0x28, 0x0b, 0xe8, 0x39, 0xd8, 0x84,\n  0x93, 0x0e, 0x22, 0x6d, 0x44, 0xa0, 0x7a, 0x42, 0xe5, 0xce, 0x24, 0x91,\n  0xcb, 0x56, 0x59, 0x6e, 0xb4, 0xd5, 0xc4, 0x8d, 0x76, 0x51, 0x6b, 0xd2,\n  0x7b, 0x2d, 0x9a, 0x68, 0x59, 0xa9, 0x69, 0xdb, 0xaf, 0x16, 0xd1, 0x9e,\n  0xea, 0x23, 0x8b, 0x45, 0xd1, 0x28, 0xcb, 0xf6, 0x30, 0xe6, 0x80, 0xb5,\n  0x6f, 0xfb, 0x62, 0x45, 0xe6, 0xbf, 0x91, 0x09, 0x3d, 0x2d, 0xd7, 0xa8,\n  0x33, 0x8d, 0x04, 0x4f, 0xa7, 0x8c, 0xea, 0x4e, 0x77, 0xd8, 0xb0, 0x81,\n  0xa5, 0x26, 0x99, 0x27, 0xd8, 0x15, 0xc2, 0x36, 0x36, 0x7f, 0x86, 0x83,\n  0xbc, 0x7c, 0x76, 0x5e, 0x45, 0x20, 0x7d, 0x80, 0x88, 0x17, 0x2d, 0xd2,\n  0x48, 0x86, 0x5b, 0x8b, 0xe3, 0x06, 0xe0, 0xc1, 0x77, 0xe0, 0xbb, 0xed,\n  0xb6, 0x50, 0xc4, 0xa4, 0x96, 0xc0, 0x7d, 0x64, 0x6b, 0x44, 0x82, 0x3d,\n  0x21, 0x87, 0x55, 0xa9, 0x7a, 0x2e, 0x50, 0x08, 0xf9, 0x84, 0x69, 0xbc,\n  0xd5, 0xed, 0xdb, 0xb5, 0xe3, 0x50, 0x90, 0x0d, 0x1d, 0xdc, 0xbe, 0x2b,\n  0xe8, 0xbd, 0xb3, 0x87, 0x76, 0x64, 0x6e, 0x77, 0x86, 0x9b, 0x6b, 0xaa,\n  0xaa, 0xb6, 0xd6, 0x96, 0xd5, 0x34, 0x79, 0x68, 0x67, 0x5f, 0xd3, 0xa9,\n  0xe6, 0x1b, 0x4e, 0xcc, 0xce, 0x9e, 0xb8, 0xa1, 0xf9, 0x54, 0x53, 0x34,\n  0xd4, 0x57, 0xfb, 0x96, 0xe6, 0x1d, 0xbd, 0xfd, 0x0d, 0x33, 0x33, 0x6d,\n  0xdd, 0x9b, 0xb7, 0x37, 0xdf, 0xa2, 0xd4, 0x74, 0x92, 0xdc, 0x85, 0x2a,\n  0x39, 0x67, 0x62, 0xb1, 0x10, 0xf7, 0x2e, 0x33, 0x49, 0x72, 0x17, 0x46,\n  0xe5, 0x9c, 0x89, 0x5b, 0xa5, 0xbc, 0x87, 0xcc, 0x2b, 0xa4, 0x06, 0x9d,\n  0xe0, 0x96, 0x53, 0x02, 0xdd, 0x05, 0x9c, 0x21, 0x50, 0xff, 0x93, 0x79,\n  0x85, 0xd4, 0xff, 0x44, 0x49, 0xfd, 0x0f, 0x4f, 0x77, 0xed, 0x92, 0xe2,\n  0x64, 0x0d, 0xf8, 0x73, 0x1b, 0xb1, 0xbf, 0xff, 0xef, 0xe0, 0x0b, 0x78,\n  0x9c, 0xf0, 0x05, 0x74, 0xa4, 0x09, 0x5f, 0x80, 0xcb, 0xef, 0xcd, 0xbc,\n  0xd2, 0x50, 0x53, 0xd3, 0xd0, 0x20, 0xf1, 0x05, 0x48, 0x04, 0x36, 0x32,\n  0xef, 0x6b, 0x04, 0xaf, 0x5b, 0x60, 0x3b, 0x8e, 0x7d, 0xc2, 0x61, 0x90,\n  0xb9, 0xdb, 0x13, 0x04, 0xc2, 0x94, 0xf0, 0x23, 0xc9, 0xf8, 0x9d, 0xd7,\n  0x65, 0x01, 0xa1, 0x8e, 0x49, 0x99, 0xfc, 0x58, 0xb9, 0xce, 0x17, 0xfc,\n  0x72, 0xe6, 0x93, 0xe1, 0x38, 0x56, 0x27, 0x4e, 0xb7, 0x0a, 0x1b, 0x1b,\n  0x4c, 0xc8, 0x24, 0x84, 0xdf, 0xf3, 0xd2, 0x2d, 0xe9, 0x6f, 0xf5, 0xdf,\n  0x7f, 0xe8, 0xba, 0xfb, 0x01, 0x20, 0x7b, 0xfc, 0x54, 0xa2, 0xc4, 0x3e,\n  0x2f, 0x68, 0x1a, 0xdb, 0xcb, 0xaf, 0x7c, 0xe3, 0xd8, 0x2d, 0xb7, 0x1c,\n  0x3d, 0x72, 0xcb, 0xad, 0xc7, 0x72, 0x40, 0xb2, 0xeb, 0xab, 0x35, 0x83,\n  0xb5, 0x9a, 0xe6, 0xdd, 0x8e, 0xad, 0xa7, 0xa0, 0xc8, 0xeb, 0xc2, 0x83,\n  0x0f, 0x2a, 0x18, 0x56, 0x17, 0xe8, 0x03, 0x84, 0x49, 0xb4, 0x32, 0x5d,\n  0xa6, 0x43, 0x2c, 0xb2, 0x41, 0x60, 0x6b, 0x30, 0xaf, 0x8d, 0x27, 0x72,\n  0xdb, 0x18, 0x4e, 0xd8, 0x22, 0x41, 0xb9, 0x85, 0x79, 0x0c, 0xaa, 0x72,\n  0xfb, 0xf2, 0x1b, 0x18, 0xbb, 0xe3, 0x44, 0xef, 0xd1, 0xf4, 0x85, 0x13,\n  0xa9, 0x99, 0xe2, 0x72, 0xfb, 0x9c, 0xa0, 0x6b, 0x6a, 0x32, 0x9a, 0x33,\n  0x07, 0x07, 0xc6, 0xb7, 0xf4, 0x0f, 0x6c, 0x19, 0xef, 0x87, 0x9c, 0xd0,\n  0x8e, 0xb7, 0xcc, 0x9c, 0x7f, 0x47, 0x38, 0xa0, 0x1f, 0xaa, 0xd1, 0x6c,\n  0xda, 0x61, 0xf3, 0x0f, 0x57, 0x28, 0x99, 0xa1, 0x12, 0x7f, 0xd9, 0x6b,\n  0x4c, 0x0d, 0x96, 0xb1, 0x0f, 0x4b, 0x58, 0x8d, 0xed, 0x71, 0x5a, 0x91,\n  0xb0, 0x83, 0x10, 0x86, 0x73, 0x50, 0x04, 0x4a, 0x78, 0xde, 0x15, 0x2e,\n  0x3a, 0x0f, 0x7c, 0x43, 0x53, 0xe7, 0x57, 0x7f, 0x23, 0x21, 0xf6, 0xf9,\n  0x28, 0x5f, 0xc8, 0x92, 0xb0, 0xf2, 0x3a, 0x98, 0x22, 0xa4, 0xcd, 0xd8,\n  0x1f, 0x33, 0x59, 0xf3, 0x8b, 0x5c, 0xeb, 0x52, 0x26, 0xfa, 0x4c, 0xb5,\n  0x6f, 0x87, 0x20, 0x46, 0x36, 0xb7, 0x36, 0x9c, 0xdc, 0x79, 0xf1, 0xde,\n  0xd9, 0xf9, 0x9d, 0x1d, 0x23, 0x61, 0xfa, 0xf2, 0x82, 0x38, 0xd8, 0xac,\n  0xa9, 0x1c, 0xab, 0xd7, 0x64, 0xbe, 0xd3, 0x7f, 0x72, 0x13, 0xe1, 0x29,\n  0xab, 0x9a, 0xdc, 0x59, 0xb9, 0x25, 0x85, 0xbe, 0x25, 0xe3, 0x27, 0xbd,\n  0x46, 0x7f, 0x91, 0x3e, 0x88, 0x5f, 0x33, 0xf3, 0x49, 0xb7, 0xc8, 0x31,\n  0xcb, 0x08, 0x94, 0x4e, 0xec, 0x3d, 0xd1, 0xdc, 0x79, 0xc8, 0x33, 0x3f,\n  0x2c, 0x89, 0x53, 0x66, 0x07, 0xf7, 0xa4, 0xbd, 0x79, 0x5f, 0x01, 0x05,\n  0x65, 0x5e, 0xb3, 0xf5, 0x52, 0xb3, 0x2d, 0x41, 0x4b, 0xd8, 0x0e, 0xe4,\n  0x0f, 0x88, 0x34, 0x39, 0xcb, 0x1a, 0x04, 0x8d, 0x96, 0x68, 0xd6, 0xa0,\n  0x3f, 0xf4, 0x67, 0x04, 0x31, 0xdc, 0xdb, 0xb2, 0x59, 0xc7, 0xba, 0xb7,\n  0x25, 0x17, 0x77, 0xcd, 0x00, 0xf5, 0x72, 0x95, 0x87, 0x3e, 0xa8, 0xa9,\n  0x9c, 0x68, 0x10, 0x32, 0x8b, 0xbd, 0x25, 0xb1, 0x1d, 0x7b, 0xd1, 0x5c,\n  0xe6, 0x83, 0x67, 0x76, 0xcf, 0x21, 0x7b, 0xb3, 0x38, 0xd4, 0x94, 0x8b,\n  0x1f, 0xf4, 0xb1, 0x2c, 0x7e, 0x50, 0x17, 0x75, 0x61, 0xd5, 0xdc, 0x95,\n  0x6a, 0xeb, 0x01, 0x6b, 0xe3, 0xef, 0xe4, 0x6b, 0x7e, 0xb6, 0xea, 0x1a,\n  0x29, 0xaf, 0x36, 0x93, 0xcd, 0xab, 0xed, 0x3a, 0x9e, 0xcd, 0x29, 0xa5,\n  0x09, 0x47, 0x10, 0xfa, 0x8e, 0x9c, 0x67, 0xf5, 0x7e, 0x22, 0x2f, 0xd7,\n  0xd5, 0x3f, 0x33, 0xa7, 0x49, 0x1c, 0x39, 0x96, 0x0e, 0x47, 0x9c, 0x6a,\n  0xa6, 0x00, 0x7a, 0x02, 0x14, 0x9f, 0x52, 0x51, 0x8b, 0xcb, 0x67, 0x85,\n  0x7c, 0x7f, 0xbc, 0x33, 0xd1, 0xb1, 0x64, 0x11, 0x23, 0xa5, 0xd2, 0x61,\n  0x43, 0x52, 0xfa, 0xb7, 0xb9, 0x3e, 0xc9, 0x63, 0xc7, 0xba, 0x82, 0x8e,\n  0x31, 0x2f, 0xd7, 0xef, 0x68, 0xe6, 0x77, 0x70, 0xc5, 0x15, 0x49, 0x27,\n  0x27, 0x38, 0x0c, 0x0b, 0x2a, 0x2d, 0xbd, 0x83, 0x29, 0xae, 0x6a, 0xf4,\n  0xb2, 0x2d, 0x7d, 0xf4, 0x1c, 0xbb, 0xb0, 0x7d, 0xb4, 0xb8, 0xad, 0xd6,\n  0x74, 0x07, 0x37, 0xff, 0x1b, 0xc4, 0xbc, 0x75, 0xdb, 0xdf, 0x3d, 0x72,\n  0x67, 0xd2, 0x37, 0x14, 0x47, 0x42, 0xed, 0xa1, 0xaa, 0x89, 0x27, 0x1f,\n  0xbb, 0xaf, 0xe1, 0x24, 0x6a, 0xfc, 0xec, 0x37, 0x32, 0xef, 0xb8, 0xbf,\n  0xf6, 0xfc, 0x9d, 0xcd, 0x99, 0xb3, 0xb8, 0x8d, 0x90, 0x6f, 0x7f, 0x85,\n  0x76, 0xe1, 0x19, 0x12, 0x4f, 0x47, 0xfc, 0x0e, 0xb3, 0xc0, 0x42, 0xa1,\n  0x3e, 0x14, 0x95, 0x41, 0x5a, 0x1a, 0xca, 0x56, 0x94, 0x84, 0xa8, 0x90,\n  0xd7, 0x6a, 0xb5, 0x90, 0x02, 0x19, 0x68, 0x0b, 0x6e, 0x1b, 0x69, 0x50,\n  0x12, 0x80, 0x15, 0x71, 0x63, 0xeb, 0x49, 0x63, 0xa5, 0x7f, 0xd3, 0x57,\n  0x84, 0xd9, 0xc9, 0xf1, 0xa2, 0x16, 0xcb, 0x8d, 0xa3, 0x25, 0xc3, 0x49,\n  0x76, 0x8a, 0x8f, 0x37, 0x78, 0x18, 0x95, 0x57, 0xd7, 0xaf, 0xd5, 0xd1,\n  0xd3, 0x4c, 0xa0, 0xd6, 0xc7, 0xd6, 0xf5, 0x0b, 0xb4, 0xeb, 0xfe, 0xcc,\n  0xeb, 0xb7, 0xd5, 0x9e, 0x6d, 0xfe, 0x5d, 0xd7, 0x87, 0xff, 0x79, 0xdf,\n  0xfc, 0x47, 0xde, 0x96, 0x74, 0xa7, 0x3c, 0x7f, 0x55, 0xb3, 0xbf, 0x7a,\n  0xec, 0xd1, 0xf7, 0x74, 0x4e, 0xfe, 0xd7, 0x5d, 0x58, 0xcf, 0x21, 0xb7,\n  0xf1, 0xa8, 0x8c, 0xfb, 0xd2, 0x98, 0xae, 0xc3, 0xae, 0x2a, 0x71, 0x5c,\n  0xb1, 0x8b, 0xce, 0x51, 0xa2, 0xc0, 0x89, 0x4b, 0x52, 0x92, 0x9e, 0x20,\n  0xf0, 0x3b, 0x55, 0x0a, 0xe0, 0x81, 0x8c, 0xfe, 0x62, 0x0e, 0x48, 0x71,\n  0x71, 0x82, 0xfe, 0xb2, 0x9c, 0x4d, 0xbc, 0xaa, 0x7a, 0xf9, 0xd1, 0x07,\n  0x1e, 0xd8, 0x76, 0xf9, 0xf2, 0xdc, 0x81, 0x9b, 0x6a, 0x6e, 0xb9, 0xfb,\n  0xf0, 0xae, 0xb9, 0x89, 0xed, 0x7b, 0x26, 0x68, 0xe7, 0xe0, 0xde, 0xbd,\n  0x83, 0xa7, 0xea, 0xb6, 0x37, 0xce, 0x1f, 0x1f, 0xec, 0xec, 0xea, 0x96,\n  0x30, 0x68, 0x54, 0x84, 0x3b, 0xe2, 0x1c, 0xf6, 0x3c, 0xdd, 0x80, 0x4c,\n  0x81, 0xdf, 0x47, 0xf1, 0xe7, 0x29, 0x5a, 0x8d, 0x04, 0x91, 0x16, 0x96,\n  0x58, 0x72, 0x24, 0xc2, 0x49, 0x25, 0x02, 0xa2, 0xc8, 0xec, 0xa4, 0xc8,\n  0xe0, 0x5a, 0xcc, 0x50, 0x45, 0x6d, 0x76, 0x5b, 0xdc, 0x52, 0xb0, 0x3e,\n  0x84, 0x5b, 0x05, 0xb9, 0x9f, 0x16, 0xb9, 0x31, 0x4a, 0x91, 0x42, 0x4e,\n  0xea, 0xe7, 0x0f, 0x9e, 0x78, 0xe2, 0xdd, 0x3f, 0x5e, 0xba, 0xfe, 0x37,\n  0x37, 0xdc, 0xf0, 0xd2, 0xbd, 0xf7, 0x35, 0x0f, 0xf5, 0xd2, 0xe7, 0x0e,\n  0xf5, 0x5d, 0x7a, 0xf7, 0xc0, 0x0c, 0xfa, 0x56, 0xdf, 0xa1, 0xcc, 0x11,\n  0xa5, 0x50, 0x01, 0x91, 0xba, 0xdd, 0xb7, 0xd0, 0xdf, 0xa7, 0x22, 0xd4,\n  0x63, 0xd2, 0x14, 0x34, 0x9b, 0x11, 0xcf, 0x58, 0x10, 0xcb, 0x07, 0x91,\n  0x0a, 0x85, 0x10, 0xa5, 0x62, 0xb1, 0x85, 0xb1, 0xe2, 0x43, 0x1a, 0x7f,\n  0x28, 0x67, 0xee, 0x06, 0x05, 0x88, 0xd1, 0x22, 0x15, 0x24, 0xc9, 0x83,\n  0xcd, 0x25, 0x97, 0xf9, 0xaa, 0x54, 0xd4, 0x02, 0xad, 0x56, 0x80, 0x83,\n  0x4a, 0x72, 0x2e, 0x92, 0xab, 0x80, 0xf3, 0xca, 0x77, 0xe1, 0x6a, 0xb5,\n  0x82, 0x83, 0xe5, 0x41, 0x54, 0x71, 0x91, 0x52, 0xb7, 0xac, 0xd0, 0x6d,\n  0x53, 0x11, 0x14, 0x91, 0x93, 0xbc, 0xf3, 0x4b, 0x79, 0x0b, 0xe5, 0x44,\n  0xd3, 0x4f, 0x1c, 0x7e, 0x47, 0x1f, 0xfb, 0xd8, 0xec, 0xec, 0xdf, 0xaa,\n  0xb7, 0xbc, 0x73, 0x5f, 0xc3, 0xee, 0x58, 0x38, 0x38, 0x52, 0x7d, 0xf0,\n  0xb4, 0x1e, 0x8d, 0x67, 0x3e, 0xc2, 0x9d, 0x3a, 0x59, 0x39, 0x91, 0x88,\n  0x4f, 0xaa, 0xb7, 0x3e, 0xb4, 0x24, 0xd5, 0xf4, 0xce, 0xdd, 0x3d, 0xe2,\n  0xb6, 0x0e, 0x9a, 0xdc, 0x37, 0x1d, 0x1b, 0x3e, 0x7d, 0xb7, 0x51, 0x3b,\n  0x6c, 0xd0, 0x4b, 0xf9, 0xa1, 0xaf, 0xd1, 0xff, 0x4c, 0x07, 0xf1, 0xae,\n  0xb5, 0x52, 0x2e, 0x01, 0x2c, 0x82, 0xe0, 0x4a, 0xb9, 0x48, 0x1f, 0x5e,\n  0x43, 0x2e, 0xf1, 0xf5, 0xe5, 0x12, 0xcf, 0xca, 0xa5, 0x7c, 0x0d, 0xb9,\n  0xf8, 0x7d, 0xab, 0xe4, 0x12, 0x46, 0xe1, 0x65, 0xb9, 0x48, 0xf9, 0xbf,\n  0xab, 0xe4, 0xa2, 0x88, 0xa5, 0xa6, 0xe7, 0x68, 0x27, 0x77, 0xe7, 0xf4,\n  0xf4, 0x5d, 0xaa, 0xee, 0x43, 0x5d, 0x89, 0x41, 0x8f, 0xdb, 0xdd, 0xee,\n  0x1b, 0x1c, 0x16, 0x11, 0x95, 0xb9, 0xaa, 0x7a, 0xa0, 0xac, 0xc3, 0xe7,\n  0x6d, 0x57, 0xd7, 0x1e, 0x9d, 0x84, 0xd4, 0xe0, 0xf1, 0xa5, 0x2a, 0x93,\n  0x76, 0xb3, 0x46, 0x3f, 0x34, 0xda, 0xff, 0x51, 0x29, 0x65, 0x1c, 0x74,\n  0x17, 0xfe, 0x92, 0xf0, 0x0a, 0x6c, 0x70, 0xb2, 0x44, 0xf1, 0x10, 0xbf,\n  0xe7, 0xd1, 0x3e, 0x81, 0x20, 0xcb, 0xb0, 0xb4, 0x52, 0x05, 0x27, 0x91,\n  0xdf, 0x90, 0x89, 0x23, 0x42, 0x02, 0x35, 0x92, 0x18, 0xaf, 0xf1, 0xdf,\n  0x64, 0x55, 0x16, 0x80, 0x32, 0x0f, 0xbd, 0x15, 0x95, 0xcc, 0x5f, 0xec,\n  0x19, 0xef, 0xb9, 0x73, 0x07, 0x2a, 0x29, 0x65, 0x0d, 0x66, 0x31, 0xf4,\n  0x48, 0x4c, 0x63, 0x27, 0x27, 0x8e, 0xfd, 0x99, 0x4f, 0xc0, 0x0f, 0x7d,\n  0x79, 0xda, 0x50, 0x59, 0x6d, 0x9d, 0x5e, 0xf0, 0x35, 0x4b, 0xf6, 0x0c,\n  0x4b, 0xec, 0x60, 0x27, 0xa9, 0xbb, 0x5f, 0xf9, 0xfe, 0x78, 0xce, 0xfb,\n  0x4d, 0xc6, 0xfc, 0xf7, 0x5b, 0x42, 0x31, 0x72, 0xd4, 0x27, 0x84, 0x2c,\n  0x8e, 0x10, 0x4f, 0xde, 0x8f, 0xb6, 0xfc, 0x62, 0x76, 0x57, 0x6a, 0xa4,\n  0x7e, 0x61, 0xf6, 0xe7, 0x0d, 0xac, 0xde, 0xe6, 0x3b, 0xe7, 0x73, 0x42,\n  0xed, 0xcc, 0xaf, 0xf1, 0x1f, 0xda, 0xd9, 0x5c, 0x51, 0xd3, 0xdf, 0xd7,\n  0x4a, 0x65, 0x31, 0xa3, 0x1e, 0x91, 0xd7, 0x8e, 0x1a, 0x38, 0xd4, 0x15,\n  0x01, 0xa8, 0x81, 0x12, 0xd1, 0x92, 0x46, 0x85, 0xbb, 0x12, 0x85, 0xb2,\n  0x25, 0x46, 0x7e, 0xaf, 0xcb, 0x29, 0x61, 0x35, 0xc9, 0x7f, 0xb4, 0x82,\n  0x3f, 0xb7, 0xef, 0x16, 0x59, 0x6d, 0x49, 0x26, 0x25, 0x91, 0x01, 0x7d,\n  0x13, 0x4a, 0x2c, 0xde, 0xd1, 0x3d, 0xb6, 0xe9, 0xe2, 0xce, 0xbb, 0xbf,\n  0x3c, 0x3b, 0xfb, 0xcb, 0xd3, 0xa5, 0x82, 0x5d, 0x1f, 0x7a, 0x28, 0xac,\n  0xb5, 0x11, 0x31, 0x0c, 0x65, 0xfe, 0x41, 0xf9, 0x91, 0x60, 0xa4, 0xa6,\n  0x8b, 0x5a, 0x42, 0xb3, 0x3b, 0xfd, 0x4d, 0x4a, 0xee, 0x38, 0x4f, 0xea,\n  0x11, 0x7d, 0x85, 0xda, 0x15, 0xcf, 0x6d, 0x97, 0xdb, 0xb5, 0xba, 0x5d,\n  0xcb, 0x32, 0xa9, 0x97, 0xd5, 0xa6, 0xde, 0x11, 0xca, 0x36, 0x2c, 0xf4,\n  0xf3, 0x99, 0xdd, 0xa9, 0x91, 0xda, 0xdd, 0xb3, 0x7b, 0xde, 0x36, 0x39,\n  0xf9, 0xe4, 0x7c, 0x03, 0xcb, 0x5b, 0x35, 0x9e, 0xdb, 0xbd, 0x1a, 0x33,\n  0x08, 0xe9, 0x15, 0xf2, 0x87, 0x76, 0xfe, 0xec, 0x67, 0xcd, 0x96, 0x46,\n  0x4f, 0x7b, 0xaf, 0xaf, 0x06, 0x6c, 0x73, 0xdc, 0xa8, 0x6f, 0x60, 0x39,\n  0xf9, 0xa8, 0x62, 0xaa, 0x35, 0xdd, 0xe4, 0x45, 0xb4, 0x28, 0x14, 0xe3,\n  0xf6, 0xd0, 0x50, 0x77, 0x0e, 0x39, 0x1e, 0x70, 0x48, 0x28, 0x8a, 0xc2,\n  0x3c, 0xa4, 0xb9, 0xe1, 0x6d, 0x0b, 0xd0, 0x2e, 0x48, 0x4e, 0xb4, 0xbf,\n  0x08, 0xf6, 0x6d, 0xab, 0xd5, 0x64, 0xb2, 0x5a, 0xcd, 0x6a, 0xa8, 0xf4,\n  0xb2, 0x09, 0x78, 0xfd, 0x77, 0x84, 0xb0, 0xab, 0x05, 0x12, 0x83, 0x62,\n  0x73, 0xdc, 0x48, 0xec, 0x48, 0xc4, 0x52, 0x5c, 0xc0, 0x41, 0xdf, 0xf3,\n  0xf5, 0xce, 0xc1, 0x32, 0x53, 0xe7, 0xf6, 0x4e, 0xbd, 0xbf, 0xbe, 0x66,\n  0xb6, 0x26, 0x55, 0xa4, 0xef, 0xd8, 0xd9, 0x69, 0x2a, 0x1d, 0xe8, 0xf8,\n  0x0a, 0xfa, 0x6e, 0xe6, 0x41, 0x2c, 0xa9, 0xce, 0x57, 0xd9, 0x8a, 0xb1,\n  0x86, 0x17, 0x7e, 0x52, 0x59, 0x6b, 0xcb, 0x3c, 0x89, 0xb6, 0xd8, 0x6a,\n  0x2b, 0x7f, 0xf2, 0x42, 0xc3, 0x68, 0x25, 0xfb, 0x6a, 0xe7, 0xd8, 0x73,\n  0xd2, 0x98, 0x62, 0xcf, 0x92, 0xbe, 0x09, 0xcb, 0x0e, 0xda, 0xda, 0x92,\n  0x6e, 0xc4, 0x6d, 0xe5, 0xb9, 0x62, 0x0f, 0xcd, 0xe0, 0x0d, 0x69, 0x10,\n  0xab, 0x14, 0x0f, 0x54, 0xc7, 0x67, 0x48, 0x7d, 0xf6, 0x4a, 0xcd, 0x92,\n  0x1b, 0x8b, 0xdb, 0xea, 0x20, 0x9a, 0x95, 0xd3, 0x54, 0x60, 0x5b, 0x58,\n  0xd1, 0xd4, 0x86, 0x47, 0xeb, 0x5a, 0x82, 0x86, 0xf6, 0xe9, 0x76, 0x6c,\n  0x8f, 0x44, 0xc7, 0xe2, 0xa5, 0x2e, 0x7d, 0x7a, 0xaa, 0xdd, 0x18, 0x68,\n  0xa9, 0x7b, 0x14, 0x9d, 0xcd, 0xfc, 0xe6, 0x2e, 0xda, 0x99, 0x7c, 0x92,\n  0x8b, 0xb5, 0x27, 0x1e, 0x7b, 0x34, 0x18, 0x35, 0xfd, 0xf9, 0xcf, 0xc6,\n  0x58, 0xf0, 0xd1, 0xc7, 0xe2, 0xed, 0x71, 0xee, 0xc9, 0xe4, 0xe6, 0x77,\n  0x67, 0x75, 0xef, 0x7b, 0x58, 0xa6, 0x41, 0xbc, 0x3a, 0x3f, 0x2d, 0xd5,\n  0x3f, 0x68, 0x02, 0x88, 0xd6, 0x88, 0x11, 0x44, 0x69, 0xc0, 0xf1, 0x53,\n  0x7e, 0x53, 0x69, 0x88, 0xdf, 0x07, 0x17, 0x14, 0xab, 0xf0, 0x94, 0x00,\n  0x62, 0x77, 0x90, 0xb7, 0x46, 0x23, 0xce, 0x6b, 0xd5, 0xb4, 0x28, 0x46,\n  0x87, 0x04, 0x52, 0xc2, 0x27, 0x15, 0x52, 0x94, 0xe3, 0xeb, 0x22, 0x50,\n  0x6b, 0xa3, 0x9a, 0xa2, 0xae, 0x71, 0x31, 0x60, 0xab, 0xe0, 0xd1, 0xe3,\n  0xe1, 0x02, 0x15, 0x96, 0x8b, 0x8a, 0x5f, 0x2a, 0x78, 0x21, 0xd4, 0x4f,\n  0x50, 0x54, 0x38, 0x84, 0xdb, 0x1a, 0x2c, 0xf6, 0x9b, 0x4c, 0x16, 0x69,\n  0x3c, 0x75, 0xa0, 0x6a, 0x05, 0xc7, 0x13, 0x3b, 0x5a, 0x64, 0x3a, 0x04,\n  0x88, 0xa8, 0x98, 0xfb, 0xbe, 0xd6, 0x39, 0x58, 0x6a, 0xea, 0x9a, 0xe9,\n  0x32, 0x04, 0xeb, 0xaa, 0xb7, 0x55, 0xd7, 0xfb, 0xf5, 0x1d, 0x73, 0x3d,\n  0xae, 0xa2, 0xef, 0xce, 0xce, 0xa2, 0x6d, 0x5f, 0xc4, 0x03, 0xfb, 0x10,\n  0x0c, 0xec, 0x6f, 0xd9, 0x8a, 0x51, 0x3c, 0xb0, 0x35, 0x49, 0x73, 0xe6,\n  0xa3, 0x68, 0xdc, 0x9e, 0xac, 0xf8, 0xc9, 0xbf, 0x8d, 0x79, 0xa4, 0xc9,\n  0xf1, 0x9b, 0xce, 0xb1, 0x1f, 0x29, 0x35, 0x6f, 0xcc, 0x00, 0x1e, 0xdb,\n  0x10, 0x36, 0x87, 0x6e, 0x4a, 0x1b, 0xf0, 0x9a, 0xac, 0x16, 0xa2, 0x48,\n  0x54, 0x63, 0x75, 0x13, 0x95, 0x34, 0x2e, 0x3f, 0xa5, 0x4c, 0x96, 0xfd,\n  0x94, 0x5a, 0x2d, 0xcc, 0xaf, 0x9c, 0x31, 0xb8, 0xd7, 0x80, 0x0d, 0xc7,\n  0x89, 0x88, 0x3b, 0x43, 0x89, 0x60, 0x24, 0x70, 0x4b, 0x05, 0x2f, 0x9c,\n  0x49, 0x5b, 0x29, 0x2a, 0x12, 0x06, 0xa3, 0xc6, 0x04, 0xfd, 0x05, 0xbd,\n  0xd0, 0xae, 0xe8, 0xf2, 0xb2, 0x5e, 0x40, 0x1e, 0x32, 0x99, 0x6a, 0x72,\n  0x9f, 0x35, 0x79, 0xea, 0x11, 0x2d, 0xf3, 0xe8, 0xb0, 0x7a, 0xa8, 0xac,\n  0x9a, 0xbf, 0x9a, 0x9c, 0x44, 0x86, 0x47, 0x14, 0x15, 0xf9, 0x28, 0x17,\n  0x6b, 0xc3, 0x2a, 0x12, 0x88, 0x19, 0xff, 0xf4, 0x27, 0x63, 0x14, 0xab,\n  0x88, 0x33, 0xae, 0x7d, 0x15, 0x2f, 0xd1, 0x1f, 0x49, 0x6e, 0xbe, 0x44,\n  0xf0, 0x41, 0x4a, 0x68, 0x2b, 0xb3, 0x15, 0xf7, 0xfb, 0x70, 0xfa, 0xc0,\n  0x10, 0xf4, 0x6a, 0xbc, 0x5f, 0xcd, 0xe2, 0x5d, 0xa5, 0x07, 0x5b, 0x14,\n  0x46, 0xec, 0x1d, 0x47, 0x10, 0xcb, 0x70, 0x83, 0xbd, 0x48, 0x44, 0x03,\n  0x51, 0xc4, 0xf6, 0xe1, 0x4e, 0x0b, 0x48, 0x14, 0xce, 0xa8, 0x60, 0x13,\n  0x82, 0x82, 0x59, 0xc8, 0x32, 0xe2, 0x39, 0x81, 0xdf, 0x47, 0x4a, 0xc9,\n  0xd8, 0x5d, 0x50, 0x99, 0x98, 0x85, 0x0f, 0x19, 0x19, 0xee, 0xee, 0x6c,\n  0x6b, 0x69, 0x6e, 0x4c, 0x25, 0x2b, 0xe2, 0x21, 0x9f, 0xd3, 0x2e, 0xf2,\n  0xd4, 0x56, 0xb4, 0x15, 0x36, 0x1c, 0x44, 0x7c, 0x7a, 0xb2, 0xc5, 0xe4,\n  0xb2, 0x2a, 0x08, 0x84, 0x39, 0x05, 0xbc, 0x83, 0x64, 0xf6, 0x82, 0x2c,\n  0xa0, 0x68, 0x5d, 0xa1, 0xa8, 0x32, 0x18, 0x7c, 0x84, 0x08, 0xb0, 0x8d,\n  0x46, 0x8f, 0x99, 0x5c, 0x22, 0x6f, 0x51, 0x39, 0x52, 0x8e, 0xe9, 0xed,\n  0x0b, 0xc3, 0xb3, 0xbb, 0x6f, 0xff, 0xab, 0xfa, 0x06, 0x6b, 0xa8, 0xba,\n  0xac, 0xad, 0x31, 0x50, 0x56, 0xa3, 0x57, 0xa7, 0x6a, 0x8a, 0x6b, 0x5b,\n  0xca, 0x37, 0x0d, 0x15, 0xef, 0xb9, 0x69, 0x71, 0xe6, 0xa6, 0xdd, 0x7b,\n  0x17, 0xf7, 0xef, 0x1f, 0x4d, 0xb7, 0xce, 0x95, 0x94, 0x45, 0x26, 0x53,\n  0xae, 0x76, 0x5b, 0xda, 0xd9, 0xe2, 0xb2, 0x94, 0x24, 0x99, 0xad, 0x1c,\n  0xdd, 0x48, 0xb3, 0x25, 0x01, 0xed, 0x5c, 0x57, 0xdf, 0xa4, 0x96, 0xd5,\n  0x4e, 0xf6, 0xce, 0x1d, 0xe5, 0x68, 0x83, 0xcb, 0x64, 0xf7, 0x32, 0x8c,\n  0x46, 0xdc, 0x2a, 0x9a, 0x68, 0x26, 0xd4, 0x1c, 0x6a, 0xd9, 0xc4, 0x32,\n  0x9d, 0x5d, 0x9b, 0x9a, 0x15, 0xfc, 0x2d, 0x57, 0x44, 0x28, 0xea, 0xb0,\n  0xeb, 0x8c, 0x29, 0xb7, 0xa3, 0xa2, 0x48, 0xc6, 0xb8, 0x6e, 0x43, 0x9f,\n  0xa1, 0xdf, 0x43, 0x4d, 0x50, 0xfb, 0xd3, 0x7b, 0x07, 0x41, 0xb6, 0x63,\n  0x7d, 0x3d, 0x2a, 0x16, 0xeb, 0xc5, 0x26, 0x2c, 0x5c, 0x03, 0x16, 0x6e,\n  0x98, 0x08, 0x37, 0xb2, 0x9e, 0x5c, 0xf7, 0x17, 0x92, 0xeb, 0xf0, 0x50,\n  0x57, 0x47, 0x6b, 0x73, 0x53, 0x43, 0x6d, 0x4d, 0x59, 0x2c, 0x88, 0xe5,\n  0x8a, 0x3d, 0xee, 0x09, 0x34, 0xb1, 0x2c, 0xd7, 0x1c, 0xb1, 0x4a, 0x55,\n  0xcb, 0x8a, 0x58, 0x97, 0xa5, 0x9a, 0x25, 0x61, 0xb8, 0xa6, 0x54, 0x6f,\n  0x36, 0xba, 0x05, 0x9d, 0xd5, 0x5e, 0x63, 0x6f, 0xde, 0xd4, 0x50, 0x59,\n  0x5c, 0x1f, 0x3c, 0x7a, 0x4b, 0x6d, 0xd2, 0x14, 0xac, 0x48, 0xed, 0x88,\n  0x04, 0xa2, 0x2a, 0x4d, 0x99, 0x23, 0xb8, 0xaf, 0xa1, 0xb9, 0xd3, 0x1d,\n  0x1c, 0xef, 0xd9, 0x3c, 0x3d, 0x34, 0xdc, 0x43, 0x70, 0x11, 0x62, 0x9b,\n  0xe3, 0x7e, 0x7f, 0x53, 0xc0, 0x96, 0xb2, 0xa6, 0x9d, 0xb5, 0x5e, 0x2c,\n  0x54, 0xfa, 0x3d, 0x58, 0xa8, 0x5c, 0xd4, 0xa7, 0xeb, 0xae, 0x25, 0x50,\n  0x09, 0xfe, 0xda, 0x78, 0xd7, 0x34, 0x8d, 0xf4, 0x0e, 0x83, 0xdd, 0xc1,\n  0x69, 0x54, 0xfd, 0x1a, 0x35, 0x17, 0xaa, 0xf3, 0x06, 0xea, 0x43, 0x08,\n  0x25, 0xaa, 0x2b, 0x4b, 0x14, 0xf0, 0x04, 0x9d, 0x89, 0x75, 0x37, 0x13,\n  0x0e, 0x47, 0x47, 0x99, 0x8f, 0xf8, 0x38, 0x32, 0xe7, 0x0d, 0xcd, 0xa3,\n  0xeb, 0x65, 0x0c, 0x57, 0x82, 0xa5, 0x8b, 0x7f, 0xbf, 0xb4, 0x82, 0x2b,\n  0xcb, 0x8e, 0x97, 0xda, 0x42, 0xb8, 0xfe, 0xa5, 0xcb, 0xb8, 0xfe, 0xd8,\n  0x2e, 0x72, 0x3a, 0x4c, 0x46, 0x8f, 0xdb, 0xe1, 0x73, 0xfa, 0xac, 0x16,\n  0xa3, 0xdd, 0x64, 0x8f, 0x86, 0x44, 0xc1, 0xb9, 0x8a, 0x33, 0x2b, 0x92,\n  0x8f, 0xec, 0x9f, 0xc7, 0x98, 0x95, 0xf9, 0xd4, 0x75, 0xc7, 0x55, 0xe8,\n  0xbb, 0xaa, 0xa3, 0xd7, 0x1d, 0x3f, 0xc6, 0x67, 0xca, 0xf9, 0x63, 0x79,\n  0xa4, 0x59, 0x7f, 0xf7, 0xd6, 0xe3, 0xc7, 0xdf, 0x7a, 0xe5, 0xb3, 0x17,\n  0x6f, 0xbe, 0xf9, 0x62, 0x96, 0x77, 0x20, 0x86, 0xed, 0xc2, 0xb5, 0x79,\n  0x07, 0xca, 0xf3, 0xda, 0xb7, 0x8a, 0x77, 0x20, 0x28, 0xb7, 0x6f, 0xf9,\n  0x54, 0x60, 0x25, 0xef, 0x80, 0x72, 0x1a, 0xd0, 0x77, 0xb4, 0xfd, 0x7f,\n  0xfa, 0xfb, 0x05, 0xd4, 0x20, 0x0c, 0x6d, 0x1e, 0xea, 0xe7, 0x32, 0xff,\n  0xc2, 0x0d, 0x66, 0x8f, 0x02, 0x3a, 0x6e, 0x3d, 0x3e, 0x36, 0x32, 0x32,\n  0x96, 0x59, 0x9a, 0x9d, 0x9c, 0x9c, 0x55, 0xce, 0x08, 0x1f, 0xa0, 0xbf,\n  0x4d, 0xb9, 0xa8, 0xf1, 0xb4, 0xc6, 0x8e, 0x17, 0x74, 0x87, 0x86, 0x96,\n  0x08, 0xa9, 0xe1, 0x6c, 0xcf, 0xcc, 0x92, 0x8c, 0x3a, 0x09, 0x37, 0x2d,\n  0x5b, 0x3c, 0x44, 0xdc, 0x1e, 0x56, 0xa1, 0xe9, 0x29, 0xcd, 0x16, 0x0f,\n  0x19, 0x10, 0x65, 0x35, 0x13, 0xeb, 0xd2, 0x85, 0x5c, 0x9c, 0x8c, 0xdf,\n  0x8a, 0x8d, 0x37, 0x52, 0x9c, 0x05, 0x3e, 0x9a, 0x64, 0x61, 0x62, 0x3d,\n  0xa4, 0x97, 0x82, 0x11, 0xfb, 0xa3, 0x4b, 0x99, 0xab, 0x73, 0x7f, 0x63,\n  0x72, 0xaa, 0x44, 0x97, 0x61, 0xd4, 0x11, 0x6b, 0xac, 0x32, 0x07, 0xb4,\n  0x5a, 0x27, 0x7d, 0x21, 0xdd, 0x93, 0xa1, 0xf0, 0xda, 0x5c, 0x5f, 0x3d,\n  0x1c, 0x8d, 0x4d, 0x57, 0x5f, 0xd9, 0x3c, 0x15, 0x17, 0x98, 0x7e, 0x4e,\n  0xc6, 0x50, 0xa6, 0x48, 0xbd, 0x99, 0x0f, 0xb7, 0x77, 0xaf, 0xb4, 0x21,\n  0x69, 0xc0, 0x98, 0x33, 0xc1, 0x66, 0x44, 0x76, 0x36, 0x88, 0x27, 0xca,\n  0xbf, 0xcd, 0x48, 0x17, 0x98, 0xa5, 0xf3, 0x49, 0x96, 0x40, 0x6f, 0x48,\n  0x55, 0xe2, 0xd0, 0x07, 0x19, 0x48, 0x40, 0x42, 0xd5, 0x56, 0xbe, 0x20,\n  0x7d, 0x80, 0x9a, 0x05, 0x3c, 0xb1, 0x94, 0x3e, 0x64, 0x27, 0x16, 0x13,\n  0x62, 0xb2, 0x65, 0x66, 0xb8, 0x2b, 0xe8, 0x55, 0xad, 0x55, 0xa5, 0xb3,\n  0xd9, 0xbd, 0xfa, 0x5b, 0x6f, 0xf8, 0x97, 0xed, 0xb7, 0x19, 0xac, 0x34,\n  0xcb, 0x1a, 0x35, 0x3d, 0xa6, 0x40, 0x25, 0xed, 0x63, 0xe9, 0x6e, 0x2e,\n  0x5e, 0x92, 0xb9, 0x85, 0x76, 0x66, 0x1e, 0x2e, 0x69, 0xd7, 0xdb, 0x36,\n  0x07, 0x9f, 0xaf, 0x6d, 0x72, 0x2a, 0x35, 0x48, 0x0f, 0x80, 0x9f, 0x4f,\n  0x13, 0x1c, 0x5d, 0xcd, 0x87, 0xe8, 0xb9, 0x82, 0xfc, 0x42, 0x2e, 0xf0,\n  0xe7, 0x69, 0x50, 0x06, 0xb8, 0x26, 0x21, 0xeb, 0xb8, 0x91, 0xfd, 0x9c,\n  0xcc, 0x07, 0x57, 0x07, 0x9c, 0x26, 0x78, 0x1b, 0x67, 0xeb, 0xf0, 0x68,\n  0x55, 0x22, 0x81, 0xaa, 0xc0, 0xcb, 0x0a, 0xd4, 0x89, 0x32, 0xb2, 0xb2,\n  0xcb, 0x65, 0x74, 0x32, 0x3d, 0x5c, 0x59, 0x6e, 0x41, 0x5d, 0x24, 0xe4,\n  0x32, 0x03, 0x4b, 0x5c, 0x2e, 0xce, 0x51, 0x21, 0x96, 0xb8, 0xc8, 0xda,\n  0x55, 0x75, 0xf4, 0xc3, 0x9b, 0xee, 0xd8, 0xbd, 0x74, 0x47, 0x67, 0xe7,\n  0x1d, 0xfb, 0x76, 0x5f, 0xd8, 0x74, 0x25, 0xb3, 0xe7, 0xf0, 0x91, 0x5d,\n  0x8b, 0x47, 0x0e, 0xef, 0xa5, 0x13, 0x3b, 0x4e, 0x1a, 0x1c, 0x02, 0xcb,\n  0x79, 0xf4, 0x07, 0x77, 0xbc, 0xe8, 0x9d, 0x1d, 0x72, 0xc9, 0xe5, 0x75,\n  0x26, 0x6f, 0x41, 0x4e, 0xb9, 0xd2, 0xcc, 0x37, 0x62, 0x9b, 0x83, 0xae,\n  0xb1, 0x38, 0xaa, 0xc9, 0xaf, 0xb4, 0x93, 0xce, 0x3b, 0x8c, 0x6c, 0x2f,\n  0x9e, 0x33, 0x12, 0x7e, 0xb3, 0x40, 0x6d, 0xa7, 0xfb, 0xc8, 0x5e, 0xdd,\n  0x7a, 0xf5, 0x4b, 0xf4, 0xeb, 0x0c, 0x8b, 0x3d, 0xe1, 0x1a, 0x88, 0xe1,\n  0x97, 0xc7, 0xb0, 0x09, 0x16, 0x20, 0x94, 0x93, 0xca, 0x31, 0x65, 0x0e,\n  0x23, 0xab, 0x74, 0x48, 0x09, 0xf4, 0x34, 0x7e, 0x9f, 0x5e, 0x4b, 0xb9,\n  0x91, 0x9b, 0x93, 0x8b, 0x7e, 0x25, 0x38, 0x07, 0x69, 0xc7, 0x21, 0xab,\n  0x25, 0x44, 0x30, 0x62, 0xd9, 0x03, 0xc1, 0x5a, 0x20, 0x9f, 0x83, 0x3e,\n  0x93, 0x43, 0x5d, 0xf4, 0x90, 0x37, 0xc2, 0x6d, 0x7b, 0x4b, 0xfa, 0x1d,\n  0x17, 0xb9, 0x88, 0xd7, 0x13, 0x16, 0xa6, 0x4f, 0x75, 0x75, 0x9e, 0x9a,\n  0x16, 0x22, 0x0b, 0x62, 0xd8, 0xed, 0x0c, 0xab, 0xb6, 0xef, 0xd8, 0xb1,\n  0x5d, 0x0c, 0xbb, 0xdc, 0x61, 0x71, 0xdb, 0xfc, 0x7c, 0xb3, 0xcb, 0xa7,\n  0x5f, 0x7c, 0x70, 0xf1, 0xfe, 0xcf, 0xdb, 0x7c, 0x4e, 0xa7, 0x4f, 0xbf,\n  0xf3, 0x81, 0xc5, 0xc5, 0x07, 0x16, 0x0c, 0x3e, 0xd7, 0x05, 0x87, 0xc5,\n  0xe2, 0xb0, 0x5e, 0x3a, 0x71, 0xe2, 0x9d, 0xf8, 0x7f, 0x56, 0xbb, 0xe5,\n  0xfe, 0x13, 0x27, 0x2e, 0x49, 0xe7, 0x84, 0x5f, 0xa3, 0xb7, 0xe3, 0xc6,\n  0xdb, 0xa9, 0x72, 0xaa, 0x22, 0x5d, 0x5a, 0xec, 0xc6, 0xea, 0x5b, 0x1a,\n  0x05, 0xf2, 0xcb, 0xc1, 0xe5, 0xdc, 0xde, 0x6c, 0x16, 0x22, 0x68, 0xc2,\n  0x58, 0x49, 0x49, 0x49, 0x98, 0x80, 0x5f, 0x40, 0xd8, 0x05, 0x1a, 0xa9,\n  0xec, 0x94, 0xd0, 0x78, 0x02, 0x61, 0x94, 0xdb, 0x78, 0x12, 0xa2, 0xc1,\n  0x7f, 0xd1, 0xdb, 0xaf, 0xdb, 0x25, 0xd6, 0x7b, 0x8b, 0xb8, 0xb9, 0x1b,\n  0x8f, 0xed, 0x66, 0x8b, 0xbc, 0xee, 0x00, 0x3b, 0x7f, 0xfd, 0xb6, 0xe6,\n  0x36, 0xc1, 0xe7, 0x76, 0x17, 0xf1, 0xe9, 0xa6, 0xe6, 0x34, 0x5f, 0xe4,\n  0xaa, 0xd1, 0xb6, 0x37, 0x21, 0xdd, 0xf5, 0x6f, 0x33, 0x55, 0xd9, 0x3d,\n  0xa6, 0xbb, 0x6f, 0x38, 0x71, 0x8f, 0xc9, 0x6d, 0xb3, 0x79, 0x4c, 0xf7,\n  0x1c, 0x1f, 0xdb, 0x6d, 0xc4, 0x96, 0x8a, 0xcd, 0xb0, 0x7b, 0xcb, 0x96,\n  0xbd, 0x06, 0xab, 0x29, 0x6c, 0xd8, 0x2b, 0xad, 0xbb, 0xcc, 0x97, 0x58,\n  0x15, 0x65, 0xa2, 0x02, 0xd4, 0x34, 0x75, 0x3a, 0x7d, 0xab, 0xc5, 0x4c,\n  0x0b, 0x74, 0x7f, 0x39, 0x36, 0xe3, 0xfb, 0x2a, 0x68, 0xb5, 0xd8, 0xda,\n  0x44, 0xab, 0xd4, 0x53, 0x88, 0x57, 0x71, 0x83, 0x14, 0x36, 0x9e, 0x18,\n  0xc8, 0x5b, 0x56, 0x8b, 0x2a, 0x51, 0xad, 0x02, 0xee, 0x0f, 0x86, 0xa3,\n  0xf0, 0x60, 0x21, 0x03, 0x9e, 0xb0, 0x02, 0xee, 0x25, 0x24, 0xb6, 0x08,\n  0x0b, 0x90, 0x8e, 0x56, 0x3a, 0xa4, 0x41, 0x2a, 0x15, 0xbf, 0xa0, 0x37,\n  0xd2, 0x3c, 0x5f, 0xc6, 0x0f, 0x87, 0x82, 0x14, 0x35, 0x39, 0x31, 0x3c,\n  0x08, 0xd4, 0xe0, 0x2d, 0xcd, 0x0d, 0x75, 0x35, 0x55, 0xa5, 0x89, 0xe0,\n  0x74, 0x68, 0xda, 0xe7, 0x81, 0x93, 0x8d, 0x60, 0xd0, 0x1c, 0x32, 0x81,\n  0x34, 0xe4, 0x85, 0x91, 0xf0, 0x5c, 0x90, 0x0c, 0x66, 0x47, 0x8a, 0xf0,\n  0x12, 0x64, 0x0f, 0xa2, 0x99, 0x60, 0x01, 0xba, 0x69, 0x09, 0xe2, 0xc2,\n  0x96, 0x97, 0x40, 0x91, 0x8b, 0x74, 0x16, 0xe3, 0xd1, 0x68, 0x6b, 0x2a,\n  0xda, 0x37, 0x9e, 0xe4, 0xc5, 0x86, 0xe9, 0x6e, 0x6f, 0x6d, 0xa2, 0xd9,\n  0xe9, 0x72, 0xdb, 0xbd, 0x81, 0x96, 0x47, 0x76, 0x9c, 0x6a, 0x6d, 0xbb,\n  0x7e, 0x34, 0x3a, 0x50, 0x14, 0xb4, 0xd7, 0xfa, 0xc6, 0x67, 0xf7, 0xee,\n  0xf1, 0xd7, 0xbb, 0x66, 0xdd, 0x0d, 0xc5, 0x7b, 0xf6, 0x6e, 0x1b, 0xf7,\n  0x25, 0x1d, 0xc1, 0xa2, 0x81, 0xe8, 0xe8, 0xf5, 0x6d, 0xad, 0xb7, 0xee,\n  0xd8, 0xd7, 0xdb, 0xcb, 0xdc, 0x6b, 0x48, 0xd5, 0xf9, 0x7c, 0x6d, 0x5e,\n  0x4f, 0xe3, 0xfb, 0xc3, 0x16, 0x8f, 0x4e, 0xa5, 0x33, 0x5b, 0x2c, 0x41,\n  0x5f, 0xac, 0xf1, 0x8d, 0xd7, 0xe7, 0x9f, 0x38, 0x7a, 0xf8, 0x91, 0x19,\n  0xa7, 0xad, 0xcb, 0x64, 0x7d, 0xe0, 0xdc, 0x1d, 0xef, 0x77, 0x5a, 0x9e,\n  0x7b, 0xce, 0xea, 0x78, 0xff, 0x1d, 0xe7, 0x1e, 0xb0, 0x9a, 0xba, 0x6c,\n  0xce, 0x99, 0x47, 0x0e, 0x1f, 0x7d, 0x62, 0x1e, 0x72, 0xa2, 0x19, 0xaa,\n  0x09, 0xcb, 0x7b, 0x98, 0x39, 0x86, 0x7b, 0x5d, 0x8c, 0x6d, 0xb7, 0x8b,\n  0xe9, 0xf3, 0x2e, 0x27, 0x96, 0x77, 0x6f, 0x09, 0x96, 0x77, 0x4f, 0x29,\n  0x96, 0x77, 0x53, 0x3d, 0x96, 0x37, 0x3b, 0xb8, 0x05, 0xa9, 0xd0, 0x80,\n  0x11, 0xad, 0x90, 0xb8, 0x01, 0x65, 0x45, 0xce, 0xa2, 0x15, 0x12, 0x2f,\n  0x57, 0x24, 0x6e, 0x92, 0x24, 0x1e, 0x0c, 0x58, 0xcc, 0xd8, 0x70, 0x19,\n  0x19, 0xe8, 0x03, 0x53, 0xae, 0xb1, 0x21, 0x95, 0xac, 0x2c, 0x8f, 0x47,\n  0x03, 0x5b, 0x83, 0x5b, 0xcd, 0xc5, 0x96, 0x62, 0xbd, 0x4e, 0xab, 0x26,\n  0xc9, 0xd5, 0x26, 0x64, 0x32, 0x4b, 0xab, 0x64, 0x8e, 0xd4, 0x21, 0x2d,\n  0xc6, 0x21, 0xc5, 0x04, 0x15, 0xf9, 0x33, 0xc1, 0xe8, 0x4a, 0x5a, 0xeb,\n  0x35, 0xc5, 0x2e, 0x67, 0xb4, 0xf0, 0x3c, 0xba, 0x80, 0x85, 0x5e, 0x23,\n  0x88, 0x8d, 0xd3, 0x5d, 0xde, 0xda, 0x74, 0xcb, 0x92, 0x37, 0xd0, 0xda,\n  0xd4, 0xe4, 0x74, 0x2e, 0x1d, 0xbc, 0xf5, 0xf8, 0xee, 0x60, 0x83, 0xab,\n  0xc8, 0x99, 0xb0, 0xb6, 0xb6, 0x0d, 0x77, 0x05, 0x6b, 0xbd, 0xd3, 0xde,\n  0xba, 0x60, 0xf7, 0x40, 0x7b, 0xab, 0xa5, 0xc4, 0xe1, 0x77, 0x35, 0x06,\n  0x77, 0x1f, 0xbf, 0xf5, 0x60, 0xc3, 0x98, 0xc7, 0x3b, 0xca, 0x1c, 0xf3,\n  0x79, 0xdb, 0xbd, 0xde, 0x46, 0x43, 0x2a, 0x75, 0x30, 0xe8, 0x8b, 0x37,\n  0xe8, 0x43, 0x56, 0xaf, 0x4e, 0xa5, 0x35, 0x47, 0xdf, 0x78, 0xf5, 0xde,\n  0x73, 0x17, 0xef, 0x37, 0xe9, 0xbb, 0x34, 0xba, 0x03, 0x7b, 0xe6, 0x0e,\n  0xb9, 0xbc, 0x0f, 0xbf, 0xd7, 0xe7, 0x3a, 0x34, 0xb7, 0xe7, 0x80, 0x4e,\n  0xd3, 0xa5, 0x37, 0xdd, 0x7f, 0xf1, 0xdc, 0xbd, 0xf1, 0x60, 0x30, 0x2e,\n  0xf9, 0x7d, 0xe4, 0x1c, 0x95, 0x39, 0x81, 0xf7, 0xee, 0x5a, 0xac, 0xe1,\n  0x3a, 0x2d, 0xa4, 0xdf, 0x27, 0xa3, 0x4e, 0x46, 0xc5, 0x2b, 0xac, 0x6a,\n  0x41, 0x70, 0xf5, 0x80, 0xf6, 0xf6, 0xb8, 0x06, 0xcb, 0x1c, 0x92, 0xbc,\n  0xd1, 0x92, 0x28, 0xe1, 0x1d, 0x63, 0x8f, 0x47, 0xa5, 0x8a, 0xa9, 0xf0,\n  0x9e, 0x13, 0x52, 0x2e, 0xe2, 0xcf, 0xac, 0x79, 0xd5, 0x4c, 0xda, 0x4b,\n  0x10, 0x9a, 0x6a, 0xf5, 0xb5, 0x95, 0x15, 0xa5, 0x25, 0x81, 0x62, 0x8b,\n  0x59, 0x81, 0xf4, 0xc2, 0x4e, 0x11, 0xf1, 0x1c, 0xb1, 0x03, 0x2e, 0xff,\n  0xa4, 0x98, 0x6b, 0x1e, 0xd7, 0xd2, 0x0f, 0xc5, 0x8d, 0xce, 0x6d, 0x4e,\n  0xa3, 0x73, 0xd6, 0x69, 0x8c, 0xb9, 0x36, 0x76, 0x76, 0xcb, 0x9c, 0x30,\n  0x4e, 0xd4, 0xe0, 0x3f, 0x13, 0xc6, 0x37, 0x2e, 0x6e, 0xec, 0x18, 0x57,\n  0xc6, 0x4d, 0xb9, 0x42, 0x7f, 0x01, 0x37, 0xb6, 0x9a, 0x3a, 0x9b, 0xd6,\n  0x13, 0x19, 0x95, 0x47, 0x8a, 0x6d, 0x2c, 0x2f, 0x2a, 0x42, 0x0a, 0x93,\n  0xfe, 0x8b, 0x58, 0x48, 0x50, 0x32, 0xcd, 0xcd, 0x6b, 0xc8, 0xf1, 0x8f,\n  0x56, 0xad, 0x62, 0x44, 0x31, 0xae, 0x40, 0xc6, 0x7a, 0xd2, 0x11, 0xe5,\n  0x32, 0xf1, 0xcc, 0x3a, 0xd7, 0x29, 0x82, 0xaa, 0xd6, 0x57, 0x27, 0xe2,\n  0x5e, 0x8f, 0x03, 0x98, 0x93, 0xd7, 0x16, 0x14, 0x77, 0xcd, 0x23, 0xe3,\n  0xa1, 0x1c, 0x39, 0xd1, 0xdd, 0x1b, 0x39, 0x3f, 0xfe, 0x82, 0x22, 0xa5,\n  0x27, 0xae, 0x71, 0x90, 0x2c, 0xd5, 0x46, 0x62, 0x7b, 0x75, 0x2f, 0xfd,\n  0x7d, 0xbc, 0x67, 0x35, 0xa5, 0xeb, 0x61, 0xec, 0x8d, 0x92, 0x91, 0x42,\n  0x4c, 0x10, 0x38, 0xb8, 0x25, 0x67, 0x9a, 0x12, 0x32, 0x36, 0x44, 0x28,\n  0x4a, 0x80, 0xae, 0x22, 0x0b, 0x55, 0x81, 0x77, 0x2d, 0x5e, 0x58, 0x41,\n  0xbd, 0x42, 0xf0, 0x42, 0xb1, 0x93, 0x28, 0x2d, 0x68, 0xe8, 0xbd, 0x0d,\n  0xfb, 0x13, 0x91, 0xe0, 0x96, 0x9a, 0x1b, 0x2f, 0xde, 0x78, 0xde, 0x55,\n  0x6e, 0x99, 0x3d, 0xf5, 0x9e, 0x9e, 0x2d, 0xef, 0xa3, 0xbf, 0x6f, 0xb7,\n  0x0e, 0x19, 0x1d, 0x0f, 0x5e, 0x38, 0xfb, 0x20, 0x27, 0x64, 0x3e, 0xf3,\n  0xd2, 0xfc, 0x07, 0x0e, 0x1c, 0xfa, 0xc0, 0x0e, 0x09, 0x6f, 0xc2, 0x48,\n  0xb8, 0x5f, 0x5c, 0x6b, 0xb5, 0xa7, 0x7c, 0xbd, 0xf6, 0x60, 0xdb, 0x68,\n  0xed, 0xf6, 0xc8, 0x0c, 0x30, 0xa3, 0x2e, 0xb7, 0xab, 0xdb, 0xb7, 0x65,\n  0x6c, 0x7c, 0xb4, 0xb8, 0xcc, 0x3a, 0x7d, 0xdb, 0x85, 0xae, 0x1b, 0x08,\n  0xf3, 0x8b, 0xca, 0x88, 0xdd, 0xaf, 0x9d, 0x5a, 0x55, 0xe6, 0xd3, 0x2f,\n  0x9d, 0x7f, 0xfb, 0xee, 0x53, 0x8d, 0xb8, 0x2d, 0xc9, 0xab, 0x19, 0xba,\n  0x9c, 0xbe, 0x9e, 0xb2, 0x50, 0xfc, 0x3f, 0xa8, 0xa1, 0x36, 0x0e, 0x91,\n  0x32, 0x3a, 0xf2, 0x13, 0xab, 0x8f, 0xd5, 0x3b, 0xe0, 0x07, 0x7d, 0xae,\n  0x79, 0xf6, 0x6d, 0xc1, 0xbb, 0x77, 0xdf, 0x13, 0xb8, 0x67, 0xa6, 0x65,\n  0xe6, 0x9e, 0xc0, 0xdb, 0x76, 0xbd, 0x2d, 0x78, 0x0f, 0x7d, 0x7d, 0xf0,\n  0xa1, 0xb1, 0xc6, 0xb1, 0x8f, 0x8c, 0x37, 0x8e, 0x3d, 0x18, 0x78, 0xef,\n  0x58, 0xe3, 0xf8, 0x93, 0x63, 0x4d, 0x60, 0x2b, 0x88, 0x94, 0xf5, 0xea,\n  0x6e, 0xe6, 0xab, 0xf4, 0xa7, 0xb0, 0x4e, 0x78, 0xa8, 0x04, 0x55, 0x4f,\n  0x6d, 0xa2, 0xb6, 0xe0, 0xad, 0xf3, 0x28, 0xf5, 0x63, 0x12, 0xcf, 0xfc,\n  0x66, 0x31, 0xc4, 0xbc, 0x59, 0x1a, 0xb1, 0x67, 0x82, 0x1a, 0x55, 0x40,\n  0xe0, 0x38, 0x5e, 0xcb, 0x73, 0xda, 0x33, 0x61, 0x8b, 0x29, 0x64, 0xe0,\n  0x74, 0x7a, 0xab, 0x5e, 0x67, 0x3d, 0x13, 0xf5, 0xb8, 0x22, 0x0e, 0x0e,\n  0x1b, 0x78, 0x76, 0x9b, 0xf7, 0x4c, 0xcc, 0x4f, 0xfb, 0x8a, 0x7c, 0x84,\n  0x83, 0x18, 0x4e, 0x3d, 0x44, 0x04, 0x21, 0x64, 0x8e, 0xe5, 0xf7, 0x1b,\n  0x91, 0xd6, 0x8c, 0xf0, 0x72, 0xa8, 0xdf, 0xef, 0x44, 0x56, 0x37, 0xc2,\n  0x8b, 0x97, 0x7d, 0x3f, 0xe5, 0x2d, 0x2a, 0xf2, 0xce, 0x50, 0x5e, 0x6f,\n  0xd1, 0x02, 0x55, 0xe4, 0x2d, 0x1a, 0x5b, 0x5c, 0x9c, 0x98, 0xe8, 0xe9,\n  0x69, 0x68, 0x28, 0x29, 0xf1, 0x12, 0xad, 0x5d, 0x3c, 0xba, 0x78, 0xf4,\n  0xf0, 0xc1, 0xfd, 0xfb, 0xf6, 0xee, 0x9e, 0x58, 0x98, 0x58, 0x98, 0xdf,\n  0xb1, 0x6d, 0x76, 0x7a, 0xb2, 0x67, 0x4b, 0xcf, 0x96, 0xb1, 0x91, 0xa1,\n  0xc1, 0xfe, 0xcd, 0x0d, 0x9b, 0x1a, 0x36, 0x75, 0x75, 0xb4, 0xb7, 0xb5,\n  0x34, 0x95, 0xd4, 0x97, 0xe0, 0x15, 0xb2, 0xba, 0xaa, 0xa2, 0xcc, 0x9b,\n  0xf0, 0x26, 0x62, 0x11, 0xa8, 0x58, 0xd2, 0x7b, 0xf4, 0x1e, 0xa8, 0x5a,\n  0x32, 0x1b, 0x65, 0x34, 0x84, 0xb8, 0x20, 0x93, 0xcc, 0x4b, 0xbb, 0x5a,\n  0x28, 0x9a, 0x93, 0x95, 0xa1, 0xfc, 0x16, 0xc8, 0xfb, 0x4d, 0x58, 0xe7,\n  0x3b, 0x6e, 0xc3, 0xdf, 0xa1, 0xb3, 0x74, 0x4d, 0x4d, 0x55, 0x8a, 0x89,\n  0x31, 0x11, 0x57, 0x51, 0x31, 0xf3, 0x5a, 0xde, 0x6f, 0x57, 0x3e, 0x98,\n  0xf7, 0xeb, 0xa9, 0xbc, 0xdf, 0xe8, 0x2f, 0xe4, 0x5f, 0x3b, 0x90, 0xff,\n  0xad, 0x3e, 0xef, 0xd7, 0xcc, 0xb3, 0xf9, 0xdf, 0xce, 0x94, 0x25, 0x53,\n  0x25, 0x5e, 0x83, 0xde, 0x77, 0xb7, 0xf2, 0x0f, 0xe5, 0xff, 0x2f, 0xaf,\n  0xfc, 0xe0, 0x0f, 0x2b, 0x3f, 0xb8, 0xa8, 0xfc, 0x83, 0x92, 0x75, 0xa4,\n  0x9b, 0xf9, 0x20, 0xfd, 0x23, 0x52, 0x17, 0xee, 0x06, 0xe6, 0x06, 0xec,\n  0x65, 0xb6, 0x51, 0xbd, 0xd4, 0x14, 0xd1, 0x91, 0x41, 0x13, 0xa2, 0x50,\n  0x7d, 0x0a, 0xaa, 0x62, 0x42, 0xfe, 0x22, 0xbc, 0xc2, 0x58, 0x74, 0x5a,\n  0x03, 0x43, 0xb5, 0x34, 0xd7, 0x54, 0x43, 0xec, 0x6c, 0x10, 0xf8, 0xaa,\n  0x48, 0xfd, 0x3d, 0x10, 0x93, 0xd3, 0xcc, 0x14, 0x21, 0x73, 0x92, 0x2a,\n  0xf0, 0xdb, 0xdb, 0x29, 0xaa, 0xbd, 0xb7, 0xbd, 0xb7, 0xbb, 0x4b, 0x2a,\n  0x29, 0x17, 0x64, 0x66, 0x72, 0xa5, 0x9a, 0x9c, 0xc3, 0x66, 0xb5, 0x80,\n  0x4d, 0xb6, 0x18, 0x07, 0x67, 0xba, 0x31, 0x6c, 0xb6, 0xc1, 0x27, 0x36,\n  0x3c, 0x95, 0x62, 0x11, 0x3b, 0x71, 0x90, 0x62, 0x29, 0xc1, 0x61, 0x27,\n  0x93, 0x2b, 0x16, 0x71, 0x00, 0x9e, 0x26, 0xbe, 0x8d, 0x5c, 0x1c, 0x82,\n  0xc5, 0xca, 0xaa, 0xb6, 0x70, 0xdd, 0x9c, 0x3a, 0x60, 0xca, 0x3c, 0xef,\n  0xa8, 0xb5, 0x57, 0x89, 0x96, 0xb8, 0x81, 0xbe, 0x18, 0x0c, 0x8f, 0xfa,\n  0xaa, 0x50, 0x70, 0xeb, 0x15, 0x5b, 0x62, 0x2e, 0x2c, 0x44, 0x66, 0xa2,\n  0xf4, 0xab, 0xd1, 0xe9, 0x28, 0xfe, 0x77, 0x8d, 0x68, 0x8d, 0x19, 0x02,\n  0xf6, 0x94, 0x3d, 0x73, 0x00, 0xbe, 0x8f, 0xe1, 0x0b, 0x51, 0x0c, 0xee,\n  0xae, 0xc4, 0x8f, 0xa1, 0x7f, 0x04, 0x57, 0xe3, 0x0b, 0x0f, 0xca, 0xb7,\n  0xc7, 0x44, 0xb8, 0xb4, 0x0a, 0xdf, 0xf3, 0x5b, 0xe5, 0x2d, 0x95, 0xf2,\n  0xb5, 0xdd, 0xbf, 0x90, 0x6f, 0xf7, 0x79, 0xc9, 0x3b, 0x03, 0x8e, 0xda,\n  0x0e, 0x78, 0x11, 0x7e, 0x82, 0x74, 0xee, 0x88, 0xe5, 0x49, 0x31, 0x0f,\n  0x61, 0xbd, 0x8c, 0x50, 0x83, 0xe9, 0x3e, 0x3f, 0x12, 0x79, 0xc8, 0x20,\n  0x95, 0xc0, 0x3d, 0xd4, 0x88, 0xb0, 0x00, 0x50, 0x22, 0x36, 0x33, 0x44,\n  0xd5, 0x2e, 0x89, 0xac, 0x00, 0x9c, 0x94, 0x18, 0x10, 0x01, 0x20, 0x4a,\n  0x1f, 0xd1, 0x43, 0x49, 0x5e, 0x00, 0x2a, 0x82, 0x8c, 0x06, 0x8d, 0x64,\n  0x5d, 0xe8, 0x90, 0x4e, 0x4b, 0xfc, 0xc8, 0x2c, 0xd2, 0x47, 0x92, 0xe7,\n  0x2d, 0xf5, 0x59, 0xa4, 0x70, 0xd3, 0x32, 0x7a, 0x78, 0x92, 0x41, 0xb7,\n  0x2d, 0x8e, 0x72, 0x63, 0x5c, 0x65, 0x6d, 0x79, 0x1d, 0xb7, 0x85, 0x9f,\n  0x3e, 0x31, 0xb4, 0x05, 0x3b, 0x7d, 0x6c, 0xe6, 0x86, 0xdd, 0x13, 0x0c,\n  0x50, 0x68, 0xdc, 0xb9, 0x6b, 0x71, 0x33, 0xc3, 0x0c, 0x0c, 0x01, 0xc0,\n  0xc7, 0xc0, 0xd0, 0x1b, 0x1d, 0xcf, 0xa0, 0x73, 0xbe, 0xc1, 0x01, 0xd7,\n  0x95, 0xa7, 0xb0, 0xaf, 0x79, 0x32, 0x30, 0xd4, 0x6d, 0xa3, 0x47, 0xaf,\n  0x9c, 0xcf, 0xfc, 0x91, 0x60, 0x3e, 0xf5, 0xd2, 0x77, 0x12, 0xac, 0x92,\n  0x20, 0x35, 0x94, 0xee, 0xf7, 0xd9, 0xe8, 0x6b, 0x74, 0x24, 0x9e, 0xd7,\n  0x91, 0xa0, 0x9e, 0x14, 0xa5, 0x92, 0xe2, 0xc9, 0x0d, 0x75, 0x44, 0xee,\n  0x87, 0x20, 0xf5, 0xa2, 0x2f, 0xaf, 0x17, 0x9b, 0x5b, 0x09, 0xc2, 0xe2,\n  0xbf, 0x1f, 0xda, 0x82, 0x57, 0x2b, 0xff, 0xa1, 0xed, 0xed, 0xf4, 0x9c,\n  0x84, 0x51, 0x82, 0xbb, 0xf0, 0xab, 0xa7, 0x51, 0xab, 0xb5, 0xa6, 0xd2,\n  0x90, 0x69, 0xc7, 0x7e, 0xe6, 0x57, 0x8a, 0x07, 0x8a, 0xd0, 0xe7, 0x33,\n  0x35, 0x99, 0x2b, 0x64, 0x2c, 0x1c, 0x32, 0xcf, 0x80, 0x05, 0xaf, 0x7f,\n  0x6d, 0xe9, 0x66, 0x0e, 0x0e, 0xd3, 0x21, 0x8b, 0x7a, 0x29, 0x1b, 0x33,\n  0x54, 0x91, 0x11, 0xc8, 0x89, 0x16, 0x42, 0xad, 0x99, 0xd3, 0x6e, 0xf5,\n  0xd8, 0x3c, 0xd2, 0xb1, 0x7f, 0x64, 0x45, 0xb4, 0x30, 0x4b, 0xb6, 0x41,\n  0xe2, 0x85, 0x26, 0x02, 0x44, 0xfc, 0x4f, 0x8f, 0x3d, 0x36, 0x7b, 0xe8,\n  0x74, 0xea, 0xf6, 0x7b, 0xbe, 0xd4, 0xdf, 0xff, 0xcc, 0xe2, 0xde, 0x7f,\n  0xdc, 0x49, 0x5f, 0x9e, 0x1d, 0xbe, 0x90, 0xda, 0xde, 0xb4, 0x78, 0x94,\n  0x0e, 0x0e, 0xcf, 0x66, 0xce, 0x66, 0xae, 0x9e, 0xef, 0x6e, 0x90, 0xe3,\n  0x97, 0x3e, 0xfa, 0x75, 0x82, 0x59, 0x83, 0xdb, 0x23, 0xc5, 0x2f, 0x0b,\n  0xb4, 0x2a, 0xa7, 0x3d, 0x2b, 0x91, 0x6b, 0xc2, 0xb9, 0xed, 0x31, 0xe5,\n  0x60, 0xac, 0xe5, 0x84, 0x2f, 0x9f, 0xbc, 0x74, 0xe9, 0x5d, 0x47, 0x0f,\n  0xee, 0xbb, 0xfe, 0x37, 0x83, 0x83, 0x2f, 0xbd, 0xfd, 0x1d, 0x2d, 0x83,\n  0x3d, 0xf4, 0xeb, 0x27, 0xbb, 0x32, 0x19, 0xc0, 0xd2, 0xa1, 0xdb, 0xba,\n  0x4e, 0x5e, 0xf9, 0x93, 0x14, 0xc1, 0x94, 0xb0, 0x98, 0xab, 0x09, 0xe6,\n  0xb5, 0x8f, 0x70, 0xb2, 0xe1, 0x87, 0xb1, 0x0c, 0xcb, 0x03, 0x20, 0x1e,\n  0xe0, 0xe1, 0x51, 0x0c, 0x40, 0x2e, 0x51, 0x88, 0x21, 0xcc, 0xa0, 0x79,\n  0x70, 0x2c, 0xf1, 0x9a, 0x80, 0x29, 0x06, 0xb0, 0x67, 0xe0, 0x7b, 0xe1,\n  0x69, 0x2c, 0x15, 0xc2, 0x42, 0x82, 0x22, 0x0c, 0x2b, 0xde, 0xa9, 0xea,\n  0x48, 0xee, 0x21, 0x5d, 0x5d, 0xd3, 0xd8, 0x98, 0xec, 0xad, 0xea, 0x9a,\n  0x9a, 0xfd, 0xe2, 0xdd, 0x6f, 0xcd, 0xdc, 0x35, 0x62, 0x0b, 0x9b, 0x6a,\n  0xea, 0x3b, 0xbc, 0x45, 0x9f, 0x9e, 0x47, 0xaf, 0x37, 0xee, 0xf6, 0x0f,\n  0x94, 0xee, 0xd0, 0x41, 0xc1, 0xc9, 0x91, 0xff, 0xa1, 0xe9, 0xce, 0x92,\n  0x2d, 0xa6, 0x86, 0xd2, 0x3b, 0x15, 0x1e, 0xdb, 0x2a, 0xbc, 0x2f, 0xbb,\n  0xf1, 0x6a, 0x74, 0x4b, 0xda, 0x16, 0x8b, 0x46, 0xc2, 0x5a, 0x06, 0x6f,\n  0x34, 0x2e, 0x3b, 0x4d, 0x71, 0x4e, 0x07, 0x69, 0x99, 0x64, 0x4e, 0xf9,\n  0xe0, 0xb8, 0x48, 0x3a, 0x9b, 0x89, 0xe7, 0xa0, 0x41, 0x41, 0x2b, 0x4b,\n  0xe0, 0x98, 0x26, 0x40, 0x80, 0x5d, 0xe0, 0x22, 0x72, 0x4c, 0x53, 0xbe,\n  0xfa, 0x9a, 0x99, 0xb4, 0xc3, 0xeb, 0x41, 0x54, 0x28, 0xe0, 0x29, 0xf3,\n  0x96, 0x99, 0x0c, 0x10, 0x1b, 0x04, 0x4b, 0x43, 0x94, 0xfd, 0x63, 0x99,\n  0x6c, 0x8e, 0xd0, 0x6b, 0xca, 0x19, 0x7e, 0xd0, 0x5d, 0x26, 0x48, 0x6a,\n  0x25, 0x93, 0x35, 0x4a, 0x5f, 0xa3, 0x68, 0x4b, 0xdb, 0x98, 0x83, 0xa7,\n  0xd9, 0xe9, 0xcd, 0x3a, 0xd6, 0x39, 0x9c, 0xde, 0x75, 0x73, 0x45, 0xa2,\n  0xbe, 0xb6, 0x3d, 0xd0, 0x30, 0xde, 0x45, 0x77, 0x4c, 0xdb, 0xcd, 0x4d,\n  0xf5, 0xad, 0x0e, 0x7b, 0xaf, 0xba, 0xd2, 0x6f, 0xad, 0xd3, 0xff, 0x5f,\n  0x8c, 0xd8, 0x17, 0xaa, 0xba, 0xeb, 0xee, 0x89, 0x1b, 0x82, 0x03, 0x89,\n  0x09, 0x2d, 0xfa, 0xf7, 0xed, 0x73, 0xa6, 0x5d, 0x07, 0xf9, 0x81, 0xc4,\n  0x88, 0x7b, 0xbc, 0x61, 0xcf, 0x1e, 0xb9, 0xd6, 0x17, 0xff, 0xf5, 0x67,\n  0x82, 0x13, 0x5e, 0x9e, 0x2e, 0xe1, 0x20, 0xea, 0x4e, 0x78, 0x83, 0xa8,\n  0x65, 0x92, 0x13, 0x4a, 0xc9, 0x5d, 0x50, 0xe0, 0x6e, 0x65, 0x8e, 0x13,\n  0x52, 0x77, 0x2e, 0xe1, 0x77, 0x99, 0xd0, 0x9f, 0x33, 0xcf, 0x7e, 0xf3,\n  0x9b, 0xb3, 0xfd, 0xfd, 0xf4, 0xe5, 0xd1, 0xdf, 0x0d, 0x67, 0xbe, 0x8c,\n  0x9a, 0x86, 0x51, 0x27, 0x79, 0xbe, 0x88, 0xff, 0x7a, 0x98, 0xe0, 0xea,\n  0x16, 0x7e, 0x7e, 0x7c, 0xcd, 0xe7, 0x93, 0x12, 0x72, 0x92, 0xfd, 0x9f,\n  0x4c, 0xa1, 0x87, 0x7f, 0xfb, 0xc1, 0x0f, 0x4e, 0x0f, 0x0e, 0xd2, 0xce,\n  0xfe, 0x47, 0xba, 0x7f, 0xf5, 0xab, 0xee, 0x5f, 0xcb, 0x71, 0x71, 0x9e,\n  0x5e, 0xc2, 0x6d, 0x2f, 0xc6, 0xa3, 0x67, 0x56, 0x93, 0x54, 0x7e, 0x44,\n  0x39, 0xb1, 0xd5, 0xef, 0x80, 0x82, 0x64, 0x19, 0xe7, 0x2c, 0x44, 0xb1,\n  0x82, 0xcc, 0xc9, 0x2d, 0xd7, 0xd5, 0x4b, 0xca, 0x95, 0x0d, 0xe4, 0x96,\n  0x70, 0x84, 0xb1, 0x30, 0x7b, 0x15, 0x4f, 0x71, 0x3c, 0xb7, 0x27, 0xff,\n  0x62, 0x18, 0x3f, 0x1b, 0xa2, 0xbc, 0x6e, 0x9b, 0x45, 0xaf, 0x95, 0xa3,\n  0xba, 0xc5, 0xa8, 0x58, 0x94, 0xcf, 0xdd, 0x00, 0x25, 0x08, 0xcb, 0x23,\n  0x5b, 0xdf, 0x9a, 0x57, 0x23, 0x80, 0x6c, 0xd6, 0x7a, 0xc3, 0x2c, 0x7a,\n  0x7f, 0xe6, 0x9f, 0x2c, 0xcd, 0x9e, 0x47, 0x1e, 0xed, 0xbe, 0x69, 0xb8,\n  0xa2, 0xdd, 0xe7, 0x6f, 0x0b, 0xce, 0xee, 0x38, 0x83, 0x9a, 0x38, 0x3a,\n  0xf3, 0x0d, 0x2c, 0xb3, 0x3f, 0x31, 0xfc, 0x47, 0x2e, 0x1d, 0x7e, 0x47,\n  0x8f, 0x56, 0x3b, 0xaa, 0xd5, 0xde, 0x7a, 0xd3, 0xc9, 0x5b, 0x64, 0x1c,\n  0x46, 0x0d, 0x7a, 0x1d, 0xcb, 0xae, 0x98, 0xea, 0x4d, 0x77, 0xc3, 0xb2,\n  0xea, 0x43, 0x1c, 0x6b, 0x42, 0x0c, 0x67, 0x94, 0x70, 0xc5, 0xe5, 0xf2,\n  0xc9, 0x5c, 0x59, 0x72, 0xdc, 0x32, 0xa0, 0x6a, 0x09, 0x81, 0x68, 0x2c,\n  0xa6, 0x8a, 0x2d, 0xe1, 0x48, 0x24, 0x94, 0x95, 0x6a, 0xe1, 0x56, 0x92,\n  0xaa, 0xc9, 0x90, 0x09, 0x3d, 0xfa, 0x47, 0x53, 0xd0, 0x7c, 0xdb, 0x1d,\n  0x4d, 0x8b, 0x2d, 0xd1, 0x46, 0x97, 0xa3, 0x29, 0xd8, 0xde, 0x35, 0x31,\n  0x63, 0x0c, 0x9a, 0x00, 0x2b, 0xf9, 0x61, 0x9a, 0xbd, 0xe3, 0x9d, 0x0b,\n  0x37, 0x37, 0x18, 0xf4, 0xc3, 0x3a, 0xd3, 0xce, 0xbd, 0xfb, 0x77, 0x31,\n  0xec, 0xcf, 0x71, 0xeb, 0x80, 0xaf, 0xa1, 0x9b, 0xb9, 0x01, 0x8f, 0x83,\n  0x0d, 0xea, 0x0e, 0xac, 0x26, 0xbd, 0x46, 0xc4, 0x2b, 0x0e, 0x40, 0x6c,\n  0xe3, 0xd5, 0xf4, 0x02, 0x00, 0x92, 0x10, 0x36, 0x2d, 0x00, 0x8e, 0x24,\n  0x24, 0x05, 0x31, 0x85, 0xbf, 0x8f, 0x90, 0x89, 0x98, 0xcc, 0x04, 0x3a,\n  0x12, 0x91, 0x42, 0x54, 0x85, 0x4a, 0x44, 0x26, 0x17, 0x61, 0x06, 0x32,\n  0xbf, 0xfe, 0xd9, 0xfc, 0x64, 0x8d, 0x4c, 0x25, 0xe2, 0x57, 0x08, 0x46,\n  0x80, 0x2b, 0x22, 0xf3, 0xb3, 0xcc, 0x1f, 0x9e, 0x51, 0xd8, 0x44, 0x72,\n  0x59, 0x46, 0x24, 0xbd, 0x46, 0x57, 0x7b, 0x19, 0x2d, 0xe1, 0x14, 0x5c,\n  0xb3, 0x4d, 0xf1, 0x6b, 0xb5, 0x09, 0xfb, 0x77, 0xd0, 0xa6, 0x55, 0x98,\n  0xca, 0x4f, 0x2d, 0x6e, 0xad, 0xca, 0x47, 0x55, 0xfe, 0x5a, 0x26, 0xf3,\n  0xf4, 0xda, 0xb8, 0xca, 0xd1, 0xab, 0x61, 0xc2, 0x73, 0xd2, 0x44, 0x5d,\n  0x4c, 0xfb, 0xbd, 0x88, 0x61, 0xa3, 0x78, 0xfc, 0x04, 0xbc, 0x18, 0x03,\n  0x3e, 0x68, 0x1d, 0x12, 0xa9, 0x14, 0x5e, 0x8f, 0xf9, 0x41, 0x1f, 0xf0,\n  0x9d, 0x48, 0xeb, 0x4d, 0x7c, 0x0d, 0xda, 0x13, 0x79, 0x45, 0x81, 0x73,\n  0x04, 0x4a, 0x10, 0x4a, 0xa0, 0xf6, 0x30, 0x92, 0xbd, 0x54, 0xa4, 0x04,\n  0x51, 0xd8, 0x53, 0xe8, 0x0e, 0x88, 0x82, 0x69, 0x43, 0x11, 0x0f, 0xe1,\n  0x4b, 0xb1, 0xa8, 0x04, 0x7f, 0x29, 0x57, 0x0b, 0xc7, 0x58, 0xeb, 0x12,\n  0xa5, 0xe4, 0x04, 0x8c, 0x94, 0x04, 0x4c, 0x52, 0x75, 0x88, 0x1c, 0x45,\n  0xde, 0xe4, 0xf6, 0x78, 0x61, 0xf2, 0x14, 0xe0, 0x56, 0x79, 0xcb, 0x5b,\n  0x5c, 0x25, 0xc9, 0x6a, 0xbf, 0xc7, 0xe4, 0x36, 0xbb, 0xae, 0x77, 0xd5,\n  0xfa, 0x68, 0xb3, 0x65, 0x35, 0x8d, 0xca, 0x90, 0x4c, 0xb2, 0x32, 0x7d,\n  0x42, 0xb4, 0x34, 0x45, 0xcb, 0x6a, 0xc5, 0x06, 0xce, 0x21, 0x61, 0x50,\n  0x87, 0x09, 0x06, 0x75, 0x03, 0x75, 0x47, 0xba, 0xc8, 0x83, 0x58, 0xce,\n  0x8d, 0xe5, 0x15, 0xc2, 0xf2, 0xe2, 0x01, 0x7f, 0x1a, 0xcb, 0xab, 0x16,\n  0xcb, 0x2b, 0x89, 0xe5, 0x25, 0x0c, 0xae, 0x21, 0xaa, 0xf2, 0x37, 0x2d,\n  0xaa, 0xf2, 0xd5, 0xa2, 0xf2, 0x86, 0xc3, 0x81, 0x50, 0x98, 0x88, 0xca,\n  0x01, 0xa2, 0x5a, 0x0b, 0xb5, 0x3a, 0x99, 0x8b, 0x6e, 0x9d, 0x2f, 0xa7,\n  0x57, 0x8a, 0x7c, 0x3b, 0xea, 0x56, 0x01, 0x59, 0x2f, 0xc9, 0x30, 0xd7,\n  0x0b, 0x4b, 0xce, 0x1c, 0x21, 0xa5, 0x7c, 0x9c, 0x6f, 0x05, 0xa4, 0xf5,\n  0x32, 0xde, 0x75, 0xfb, 0x34, 0x6f, 0x6d, 0xcc, 0x8a, 0x48, 0xe6, 0xd5,\n  0xb8, 0x97, 0xe0, 0xd9, 0x57, 0xa7, 0x2b, 0x74, 0x22, 0x82, 0xc2, 0x7c,\n  0x49, 0xb1, 0xa1, 0xa4, 0x8a, 0x95, 0xe7, 0x1a, 0x93, 0x45, 0x20, 0x06,\n  0x24, 0x7b, 0x50, 0x6a, 0x82, 0x01, 0x9b, 0x33, 0xd1, 0xf0, 0x0c, 0xa3,\n  0xb7, 0x67, 0x2e, 0x5f, 0x39, 0x34, 0xd9, 0x2c, 0x51, 0xb1, 0xe0, 0x79,\n  0xf5, 0x78, 0xe6, 0xdf, 0xe4, 0x79, 0x25, 0x11, 0xb2, 0x28, 0x38, 0xb9,\n  0x45, 0x04, 0xd7, 0x12, 0xbf, 0x4f, 0x23, 0x32, 0xd8, 0xd4, 0x23, 0x64,\n  0x8a, 0x04, 0x90, 0x4d, 0x06, 0x2a, 0xa5, 0x76, 0x2e, 0xe7, 0x8f, 0xe1,\n  0xf7, 0xe1, 0x49, 0x64, 0x26, 0x98, 0xb3, 0x5c, 0x4a, 0xc6, 0x96, 0x06,\n  0xde, 0x47, 0xfc, 0xc2, 0xcb, 0xa5, 0xbf, 0x9b, 0x9e, 0x7e, 0x71, 0xe7,\n  0x8b, 0x9f, 0x9c, 0xfd, 0xf4, 0xa7, 0x15, 0x7c, 0x69, 0x3c, 0x57, 0x32,\n  0x5f, 0x07, 0x98, 0xe9, 0x1c, 0x2e, 0x19, 0x0b, 0x9c, 0xce, 0x02, 0x06,\n  0x81, 0x4a, 0x64, 0x68, 0x91, 0x92, 0x20, 0xe6, 0x89, 0x8d, 0x20, 0xd1,\n  0x7b, 0x70, 0x12, 0xe2, 0x9e, 0xc5, 0x6c, 0x31, 0x59, 0x08, 0xfc, 0x5b,\n  0x24, 0x94, 0x8a, 0x91, 0x17, 0xc1, 0x39, 0x57, 0x7d, 0x12, 0xd9, 0x50,\n  0x28, 0x86, 0x52, 0xad, 0xad, 0xb3, 0xb3, 0xad, 0xad, 0x9f, 0xdf, 0x9b,\n  0xf9, 0x31, 0x4a, 0x1d, 0xfa, 0xea, 0x3d, 0x0f, 0x76, 0x4b, 0xfd, 0xea,\n  0x7a, 0x7c, 0xf1, 0xfb, 0x99, 0x4f, 0x04, 0x33, 0x8f, 0xfe, 0x5b, 0x2e,\n  0x56, 0xb6, 0x05, 0x78, 0x19, 0xcd, 0x26, 0xad, 0x46, 0xe4, 0x58, 0x24,\n  0x42, 0x69, 0x3d, 0x74, 0x12, 0xf0, 0x1f, 0x96, 0xa4, 0xc0, 0x05, 0x93,\n  0x05, 0x13, 0x07, 0xa3, 0x0d, 0xbf, 0x5b, 0x12, 0x29, 0x7e, 0x9d, 0x60,\n  0x73, 0x84, 0x62, 0xb6, 0xe5, 0x26, 0xa0, 0xc8, 0xe1, 0x9d, 0xdf, 0xf8,\n  0xd9, 0xde, 0x5b, 0xd2, 0x0d, 0xd3, 0xd3, 0x0d, 0xe8, 0x95, 0x2d, 0xa7,\n  0x7e, 0x59, 0xf7, 0xe7, 0x3b, 0xb7, 0x3f, 0xd6, 0x2e, 0x75, 0x38, 0xfd,\n  0x10, 0xe9, 0xab, 0x4e, 0xee, 0xab, 0x19, 0x10, 0xe7, 0x71, 0x4f, 0x19,\n  0x8e, 0x81, 0x9c, 0x41, 0x4a, 0x14, 0x68, 0x38, 0x39, 0x24, 0x99, 0x66,\n  0x51, 0x05, 0x4c, 0x5c, 0x02, 0x0b, 0x26, 0xab, 0x93, 0x84, 0xb6, 0x6b,\n  0xc9, 0x66, 0xba, 0x65, 0x49, 0x98, 0x74, 0x13, 0xb3, 0x73, 0x73, 0x12,\n  0xa3, 0x4e, 0x37, 0xb0, 0xeb, 0xd0, 0xd1, 0x91, 0xad, 0x5b, 0x47, 0x3e,\n  0x01, 0xb4, 0x3a, 0x99, 0xfb, 0xc8, 0x98, 0x46, 0x09, 0x36, 0x28, 0xe9,\n  0x2f, 0xd8, 0x87, 0xad, 0xe9, 0x26, 0x8d, 0x9c, 0xdc, 0xc9, 0xc3, 0x11,\n  0x19, 0xb1, 0x0f, 0x45, 0x24, 0x08, 0x12, 0xcc, 0x74, 0x6c, 0x88, 0xd8,\n  0x35, 0xac, 0xc2, 0x12, 0x22, 0xd9, 0x86, 0xa4, 0x0d, 0xa4, 0x05, 0xc4,\n  0x02, 0xb0, 0x28, 0xf8, 0xe1, 0xb0, 0x51, 0x3f, 0xf9, 0x89, 0x4f, 0xbc,\n  0x28, 0x61, 0x88, 0xe3, 0xcd, 0xfa, 0xf5, 0xd9, 0x8e, 0xcc, 0x27, 0x61,\n  0x70, 0x65, 0x28, 0xf1, 0x1d, 0x1d, 0x12, 0xa7, 0x8a, 0x80, 0xdf, 0xff,\n  0x71, 0xdc, 0x6f, 0x2d, 0xa0, 0xa4, 0x6a, 0x80, 0x7a, 0x18, 0x18, 0xd7,\n  0x01, 0xf4, 0x97, 0x64, 0x4a, 0x46, 0x73, 0x52, 0x11, 0x01, 0xe9, 0x17,\n  0xbf, 0x10, 0x52, 0x11, 0x55, 0x34, 0xe9, 0x23, 0x31, 0x37, 0xe8, 0x0f,\n  0x28, 0x5d, 0x7c, 0x2c, 0x23, 0xab, 0xad, 0xd4, 0xbf, 0x5b, 0x46, 0x89,\n  0xd2, 0x4a, 0xb9, 0x8e, 0x07, 0x09, 0xb6, 0x70, 0xc1, 0x77, 0xc4, 0x0b,\n  0xbf, 0x03, 0x65, 0xbb, 0x12, 0xc0, 0x2b, 0xfd, 0xf4, 0x8b, 0xaf, 0xef,\n  0xf9, 0xfd, 0xe4, 0x87, 0x11, 0x7a, 0x09, 0x0f, 0xda, 0x95, 0xcc, 0xaf,\n  0xc9, 0xea, 0xfe, 0xed, 0xcd, 0xf2, 0xc2, 0x2e, 0xcd, 0xc3, 0x1f, 0x13,\n  0xbb, 0xb6, 0x2a, 0x5d, 0x9e, 0x85, 0xa1, 0xe5, 0xb1, 0xfc, 0x78, 0x61,\n  0x97, 0x94, 0x64, 0xb7, 0x0c, 0xd3, 0x9d, 0x0f, 0x95, 0x8c, 0xa7, 0x05,\n  0x81, 0xea, 0x96, 0xf1, 0xa4, 0x4d, 0xf4, 0xd9, 0x99, 0xcc, 0x7d, 0x78,\n  0x0a, 0x1e, 0x9d, 0x99, 0x7c, 0xe6, 0x99, 0xe5, 0x6c, 0x22, 0x60, 0xef,\n  0xca, 0x62, 0x32, 0xd3, 0x27, 0x09, 0x26, 0xf3, 0x1a, 0xef, 0x8a, 0xaf,\n  0xf7, 0x2e, 0x89, 0x98, 0x80, 0x80, 0x8f, 0xe3, 0x77, 0x15, 0x8f, 0x66,\n  0x5e, 0x98, 0x9e, 0x46, 0xa1, 0xe9, 0x91, 0xa7, 0x9f, 0x96, 0x51, 0x26,\n  0x25, 0x57, 0x46, 0xe6, 0xbb, 0x89, 0x29, 0xf6, 0x20, 0x05, 0x78, 0xa8,\n  0x88, 0x83, 0xc4, 0x37, 0x09, 0xb3, 0x20, 0x3a, 0x24, 0x64, 0xb9, 0xf7,\n  0xf2, 0xed, 0x35, 0x99, 0x77, 0x8f, 0x58, 0x84, 0x01, 0xd3, 0xc2, 0x2c,\n  0x3a, 0x92, 0x79, 0x6c, 0x36, 0x73, 0xbf, 0xd4, 0x8d, 0xd1, 0x2b, 0x17,\n  0xa0, 0x4f, 0xca, 0x5c, 0xfb, 0x9e, 0x62, 0x0f, 0xae, 0x7a, 0x7e, 0x7c,\n  0xbd, 0xe7, 0x03, 0xb6, 0x9e, 0x4d, 0x22, 0xd6, 0xdc, 0x8a, 0x5b, 0x8f,\n  0x98, 0x0f, 0x4f, 0x67, 0x5e, 0x80, 0xd6, 0x6f, 0xce, 0x54, 0xbd, 0xf2,\n  0x8a, 0x64, 0x0f, 0x32, 0x6f, 0x90, 0x5c, 0x9c, 0x93, 0x69, 0x33, 0xc2,\n  0x43, 0x8e, 0xf7, 0x0f, 0xc6, 0x80, 0x68, 0x16, 0x38, 0xc5, 0x14, 0x7b,\n  0x30, 0x2c, 0x43, 0x2c, 0x03, 0x41, 0xa2, 0x30, 0x2f, 0x92, 0x4c, 0x27,\n  0x20, 0xfd, 0x8c, 0x65, 0x89, 0x0c, 0x64, 0x8b, 0x5e, 0xb9, 0x8c, 0x86,\n  0x95, 0x75, 0xcf, 0xca, 0xab, 0x01, 0xaa, 0x01, 0xa8, 0x4c, 0x83, 0x54,\n  0x10, 0x2b, 0x4f, 0x6d, 0x24, 0x52, 0x23, 0x21, 0x60, 0xaf, 0x6d, 0x5d,\n  0x29, 0xe0, 0xec, 0x3b, 0x2d, 0xf5, 0xae, 0xf7, 0x3c, 0xd2, 0x75, 0x72,\n  0xb8, 0xb2, 0xad, 0x08, 0x9b, 0x81, 0x33, 0x3b, 0x6e, 0x38, 0x64, 0x6b,\n  0x34, 0xcc, 0x64, 0x3e, 0x3e, 0x8b, 0x85, 0xf5, 0x29, 0x86, 0xf9, 0xc8,\n  0x5f, 0x1d, 0xbc, 0xb7, 0x57, 0xa7, 0x19, 0xd5, 0xe8, 0x4e, 0xdd, 0x78,\n  0xd3, 0xcd, 0x0c, 0x9b, 0xf9, 0x26, 0x7d, 0xf3, 0x95, 0x3b, 0x70, 0xb7,\n  0x14, 0x9b, 0x90, 0xe9, 0x24, 0xb9, 0x33, 0x7d, 0xe9, 0x1e, 0xe8, 0xa3,\n  0x17, 0xf7, 0x11, 0xdb, 0x83, 0xac, 0x81, 0xf4, 0x71, 0x55, 0xe7, 0xe2,\n  0xab, 0x3b, 0x27, 0x65, 0xf8, 0x9a, 0x4c, 0x16, 0x88, 0x4b, 0x92, 0x56,\n  0xdb, 0x0a, 0x71, 0xcd, 0x2c, 0x1b, 0x85, 0xa4, 0xd9, 0x82, 0x31, 0x68,\n  0xec, 0x39, 0xd6, 0x99, 0xda, 0xd6, 0x10, 0xae, 0x73, 0xd8, 0x6b, 0x8b,\n  0x1b, 0x5b, 0x46, 0xb7, 0x60, 0xf7, 0x7b, 0x3a, 0x93, 0xc1, 0xb6, 0xe1,\n  0x2f, 0x69, 0xb6, 0xe1, 0xd4, 0xde, 0x5c, 0xdb, 0x90, 0xe5, 0xfe, 0x0d,\n  0x90, 0xbe, 0x71, 0x4b, 0x21, 0x86, 0xf8, 0x1c, 0xfd, 0x33, 0xfa, 0x07,\n  0x54, 0x92, 0x6a, 0xa7, 0x86, 0xd3, 0x03, 0xd8, 0xce, 0x61, 0x80, 0xcf,\n  0xac, 0x35, 0x41, 0x73, 0x82, 0x8a, 0xc5, 0xbe, 0x16, 0x70, 0xa8, 0xa9,\n  0xc1, 0x1e, 0x82, 0x7a, 0x58, 0x81, 0xe3, 0x85, 0xfd, 0x92, 0x0d, 0xb7,\n  0x47, 0x41, 0x7f, 0x2d, 0x1d, 0xca, 0x49, 0xcd, 0x88, 0xc4, 0xb0, 0x3d,\n  0x1b, 0x0e, 0x47, 0x95, 0x90, 0xaa, 0x00, 0xcd, 0x55, 0xd0, 0x82, 0xf8,\n  0xdc, 0x54, 0xfe, 0x9c, 0xf3, 0xd2, 0xe5, 0x0a, 0x6c, 0xc2, 0x39, 0xa2,\n  0x54, 0xb3, 0xd2, 0x5f, 0x0f, 0xd5, 0x17, 0x1b, 0xc2, 0x8e, 0x68, 0x91,\n  0x3e, 0x66, 0xad, 0x18, 0x0e, 0xb9, 0xda, 0x8b, 0xf7, 0xdd, 0xd7, 0xff,\n  0xc0, 0x23, 0xc5, 0x4d, 0x66, 0xa7, 0xb6, 0xc6, 0x71, 0xfd, 0xd2, 0x99,\n  0x03, 0x0e, 0x7b, 0xbc, 0xbc, 0x6a, 0x4b, 0x6d, 0x72, 0x4b, 0xcd, 0xb6,\n  0xca, 0xf2, 0x8a, 0x8a, 0x8a, 0x70, 0x55, 0x1d, 0x1a, 0xe8, 0x38, 0x34,\n  0xea, 0x14, 0x44, 0xcd, 0x08, 0xcf, 0xbb, 0x1d, 0x2a, 0xd5, 0xec, 0xa3,\n  0x07, 0x3f, 0xf6, 0x15, 0xb5, 0x30, 0xc8, 0xa9, 0xde, 0x7b, 0xe7, 0x7d,\n  0xf7, 0x70, 0xd5, 0x77, 0x0d, 0x4c, 0x1e, 0x4e, 0x56, 0x1f, 0x9e, 0x1f,\n  0x5f, 0x58, 0x1c, 0xe9, 0x3d, 0x19, 0x2d, 0xbe, 0x55, 0xe1, 0x7e, 0xfe,\n  0x39, 0xbd, 0x03, 0xdb, 0x36, 0x35, 0x54, 0x1b, 0xf5, 0x57, 0x69, 0x8f,\n  0x84, 0xac, 0xc4, 0xa0, 0x46, 0x44, 0x0b, 0x41, 0x1f, 0xcd, 0xd2, 0x09,\n  0x2c, 0x94, 0x10, 0x76, 0x5d, 0xf8, 0x41, 0x09, 0xcf, 0x22, 0x41, 0x31,\n  0x2a, 0x84, 0xf7, 0x02, 0x2c, 0x0e, 0x85, 0xb8, 0x93, 0x9c, 0x14, 0x93,\n  0xd8, 0x72, 0x59, 0x16, 0x5e, 0xa2, 0x8c, 0x23, 0x39, 0x60, 0xd9, 0x6b,\n  0x59, 0x20, 0xae, 0xdf, 0x53, 0xe8, 0x16, 0x38, 0xca, 0xf7, 0xd4, 0x26,\n  0x11, 0x95, 0x6c, 0xab, 0x6d, 0x93, 0xb0, 0x89, 0x9c, 0x76, 0x82, 0x4a,\n  0x54, 0x83, 0x6a, 0xd4, 0x2b, 0x0f, 0x99, 0xc9, 0xd1, 0x49, 0x4e, 0x3c,\n  0xaf, 0xb0, 0x9c, 0xb9, 0x9c, 0xc2, 0x60, 0x14, 0xf0, 0x25, 0xf4, 0x16,\n  0x75, 0xd8, 0x3a, 0xda, 0xee, 0xef, 0x69, 0x34, 0x39, 0x19, 0x6f, 0x64,\n  0xb6, 0xab, 0x63, 0x6b, 0x63, 0x4c, 0x5d, 0x64, 0x28, 0xf2, 0x68, 0x43,\n  0xa6, 0x48, 0xb7, 0xcf, 0x56, 0x13, 0x19, 0x39, 0xdc, 0x70, 0x23, 0x52,\n  0x07, 0x43, 0x61, 0x57, 0x71, 0xdc, 0x4f, 0x07, 0x05, 0xae, 0x97, 0xe1,\n  0x8f, 0xec, 0x69, 0x9c, 0x4d, 0x72, 0xa8, 0x78, 0xaa, 0x69, 0xfb, 0xe4,\n  0x96, 0xf9, 0xee, 0x05, 0x0f, 0x2b, 0x0a, 0x3d, 0x2c, 0x6b, 0x33, 0x8b,\n  0xda, 0xfe, 0x53, 0x03, 0x67, 0x1e, 0xfa, 0x5c, 0x73, 0xaa, 0x7a, 0xc0,\n  0x66, 0x1d, 0xa8, 0x4d, 0x36, 0xcb, 0xfc, 0xb7, 0x61, 0xe0, 0x49, 0xc3,\n  0x06, 0xdb, 0xc1, 0xb4, 0x43, 0x8b, 0xfb, 0xea, 0xd2, 0x61, 0x0d, 0xc7,\n  0xc6, 0x22, 0x1d, 0x47, 0x1c, 0x13, 0xc3, 0x86, 0x23, 0x97, 0xcd, 0x24,\n  0x93, 0x0b, 0x9f, 0x4a, 0xb3, 0x30, 0x1c, 0x65, 0x59, 0x66, 0xcc, 0x12,\n  0x16, 0xca, 0x16, 0xa0, 0x3a, 0x8d, 0x63, 0xf7, 0x14, 0xb8, 0x90, 0xc1,\n  0x12, 0x53, 0xe1, 0x9d, 0x3d, 0x1c, 0x26, 0xfc, 0x35, 0x92, 0xd9, 0x2c,\n  0x29, 0x52, 0xfe, 0x69, 0x3c, 0x11, 0x4b, 0x28, 0xdf, 0x50, 0xbe, 0x39,\n  0x58, 0x74, 0xfa, 0xf4, 0xc8, 0x83, 0x47, 0x8e, 0x4d, 0x84, 0x03, 0x63,\n  0x55, 0x27, 0xce, 0xdd, 0x7a, 0x6b, 0xe5, 0x44, 0x3c, 0xbe, 0xb5, 0x99,\n  0xa1, 0x9d, 0x89, 0xac, 0xed, 0xe7, 0x69, 0x28, 0xb2, 0x7f, 0xee, 0xd2,\n  0xa1, 0xc7, 0x77, 0x94, 0x0c, 0x1a, 0x9c, 0x0f, 0x5e, 0x38, 0xff, 0x10,\n  0x49, 0x6f, 0xb6, 0x36, 0xe4, 0xd8, 0xc4, 0xf5, 0xd8, 0x26, 0xfe, 0x1c,\n  0x0d, 0xc8, 0x4c, 0xb8, 0xaf, 0x3a, 0xe8, 0xab, 0x5e, 0xee, 0x6b, 0x14,\n  0xf7, 0x35, 0x52, 0xa8, 0xaf, 0xe5, 0x1b, 0xed, 0x6b, 0xf9, 0xca, 0xbe,\n  0x46, 0x6c, 0xa1, 0xc8, 0xaa, 0xbe, 0x66, 0x41, 0xaa, 0xb2, 0x7d, 0xcd,\n  0xef, 0x69, 0x49, 0xd0, 0x3f, 0xba, 0xd8, 0x79, 0x6c, 0x73, 0x62, 0xd0,\n  0xe9, 0x71, 0xa6, 0xbd, 0xef, 0x1b, 0x1a, 0x2c, 0xeb, 0xf2, 0x7a, 0xd2,\n  0x25, 0xf9, 0xfd, 0x34, 0x9f, 0x3d, 0xb9, 0xeb, 0x54, 0x13, 0x89, 0x4b,\n  0x7c, 0x6d, 0x61, 0xc9, 0xac, 0x1b, 0xd6, 0x1b, 0xf2, 0xfa, 0xa9, 0xc2,\n  0xfb, 0x69, 0x80, 0xe4, 0x2e, 0x43, 0xe6, 0x30, 0x8b, 0x0d, 0x1f, 0x96,\n  0xdb, 0x05, 0x36, 0x97, 0xe2, 0x89, 0x17, 0x22, 0x35, 0x80, 0x9d, 0x54,\n  0xde, 0xdf, 0x4c, 0xa8, 0x73, 0xf6, 0x5f, 0xf1, 0x86, 0x80, 0xb7, 0x50,\n  0xfa, 0xe6, 0xb1, 0xb1, 0x2b, 0xcf, 0x91, 0xcd, 0x13, 0x51, 0xd6, 0xab,\n  0xbd, 0xe8, 0xcb, 0x24, 0x27, 0x19, 0x9e, 0x8b, 0xa0, 0x22, 0x68, 0x17,\n  0x18, 0x74, 0xdc, 0x3c, 0x2f, 0xa1, 0x4d, 0x2b, 0xe6, 0x4d, 0x1e, 0x59,\n  0x02, 0x79, 0x62, 0x88, 0x3c, 0x1d, 0x7d, 0xf9, 0xa3, 0x23, 0x93, 0xa3,\n  0x4f, 0xd2, 0xce, 0xbe, 0xcc, 0x2d, 0xe0, 0xe9, 0x7d, 0xab, 0x6f, 0x19,\n  0xe3, 0x96, 0xf0, 0xdd, 0xb5, 0x48, 0xf9, 0x32, 0x57, 0x8d, 0xe8, 0x0d,\n  0xb2, 0x47, 0xfb, 0xd2, 0x6e, 0x83, 0x48, 0x33, 0x32, 0x90, 0x02, 0x22,\n  0x9e, 0x66, 0x09, 0x35, 0xec, 0x32, 0x1b, 0x19, 0xc1, 0x05, 0x4c, 0x12,\n  0x4c, 0x6e, 0xba, 0x07, 0x2a, 0x99, 0xfe, 0xee, 0xf6, 0xeb, 0x0c, 0x5e,\n  0x8e, 0xe3, 0xdd, 0xc6, 0xa3, 0xdb, 0xbf, 0xfb, 0xea, 0xcb, 0xb4, 0x3b,\n  0xf3, 0x7c, 0x7c, 0xc6, 0xe5, 0x9a, 0x4e, 0xa0, 0xe8, 0x95, 0x97, 0x94,\n  0x5c, 0x1c, 0xfc, 0x2e, 0xca, 0x28, 0xd9, 0xe0, 0xd8, 0x52, 0x24, 0xb5,\n  0xfd, 0x88, 0x83, 0xec, 0x6a, 0x6a, 0x9f, 0x94, 0x35, 0x94, 0xa5, 0x82,\n  0xc4, 0x97, 0x19, 0x25, 0x3b, 0x8d, 0xec, 0x9d, 0xe4, 0x0c, 0x85, 0x01,\n  0xb0, 0x27, 0x86, 0x18, 0x8c, 0x2f, 0x5f, 0xba, 0xf4, 0xf2, 0xe2, 0xd3,\n  0x9f, 0x5e, 0x78, 0xf9, 0x9d, 0xef, 0xfc, 0xd0, 0x88, 0x13, 0x3d, 0x9d,\n  0x79, 0x04, 0xcd, 0x67, 0x06, 0xbc, 0x23, 0x1f, 0xa2, 0xf2, 0xfa, 0x61,\n  0x83, 0x4a, 0x2a, 0x23, 0xd8, 0x85, 0x80, 0x22, 0xc0, 0x10, 0xeb, 0x70,\n  0x1f, 0xde, 0xa0, 0x89, 0xcc, 0x94, 0xf3, 0x05, 0xec, 0x33, 0xe7, 0x9c,\n  0xda, 0x30, 0xd9, 0x33, 0x9b, 0x9c, 0x1e, 0xa2, 0x37, 0xbe, 0x73, 0xe1,\n  0x8e, 0xe9, 0x3b, 0x2f, 0x7e, 0x67, 0xfb, 0x11, 0x93, 0x5b, 0x60, 0x45,\n  0x8f, 0xf9, 0x20, 0xe4, 0x28, 0x77, 0x3d, 0xf9, 0x64, 0x17, 0x36, 0xac,\n  0x5e, 0xa8, 0x18, 0x0e, 0x04, 0xc6, 0x2a, 0x91, 0x9f, 0xbc, 0x9b, 0xc5,\n  0x3a, 0xb0, 0x8f, 0xd8, 0x54, 0xf8, 0xdd, 0x40, 0x43, 0xca, 0x82, 0xb3,\n  0xb1, 0xac, 0x0c, 0x39, 0xa4, 0x92, 0x92, 0xa1, 0x43, 0x4c, 0x62, 0xc5,\n  0xd3, 0x90, 0xdc, 0x74, 0xb0, 0x48, 0xb1, 0x99, 0x63, 0xae, 0xf9, 0xcc,\n  0xb3, 0xf3, 0xff, 0xf5, 0xd3, 0xdd, 0x4f, 0x7d, 0x6c, 0xfe, 0x85, 0x4f,\n  0x83, 0x59, 0x55, 0x87, 0x8d, 0xc6, 0xeb, 0xd1, 0x64, 0xe6, 0x3f, 0x90,\n  0x33, 0xf3, 0x91, 0xcc, 0xf3, 0x19, 0xe0, 0x8c, 0x31, 0x63, 0xdf, 0xc6,\n  0x45, 0xc6, 0x6c, 0xad, 0xf7, 0xc5, 0xd7, 0x7e, 0x5f, 0x4c, 0x80, 0xf7,\n  0x39, 0xea, 0x25, 0xd7, 0xe6, 0x9f, 0xe3, 0xf7, 0x5f, 0xda, 0xf5, 0x85,\n  0xa7, 0x77, 0xdf, 0x75, 0xe7, 0xae, 0xa7, 0xef, 0x1d, 0xfe, 0xf4, 0xa7,\n  0x7f, 0xf8, 0x43, 0x64, 0x46, 0xfc, 0xe5, 0xcb, 0x99, 0x3f, 0x7d, 0x45,\n  0xe2, 0xd0, 0xc1, 0xfa, 0xcd, 0xf4, 0x92, 0xbe, 0xe1, 0x31, 0xc4, 0x9b,\n  0x33, 0x25, 0x5c, 0x90, 0xb4, 0x9b, 0x93, 0x68, 0x11, 0x21, 0x25, 0x6d,\n  0x99, 0xb9, 0x63, 0xa5, 0x11, 0xa7, 0x00, 0x73, 0xc9, 0x06, 0xe3, 0xef,\n  0xae, 0xfc, 0xe2, 0x1b, 0xb4, 0xe6, 0x17, 0x68, 0xf7, 0xec, 0x8c, 0xa2,\n  0xee, 0xc0, 0xff, 0xa7, 0xd8, 0x8b, 0x58, 0xe7, 0xe9, 0x2f, 0x90, 0x7e,\n  0x49, 0xef, 0x62, 0x85, 0x89, 0xe5, 0x77, 0xc5, 0xdf, 0xe4, 0xbb, 0x0e,\n  0x65, 0x3a, 0x1f, 0x44, 0xef, 0x7b, 0x12, 0x59, 0xa7, 0xc7, 0x9e, 0x06,\n  0xed, 0xef, 0xcb, 0xdc, 0x0a, 0x8c, 0x27, 0x12, 0xd6, 0x27, 0xa2, 0x46,\n  0xf1, 0x98, 0x3d, 0x85, 0xfb, 0xe5, 0x80, 0xb3, 0x16, 0x3b, 0x16, 0x9c,\n  0x80, 0x18, 0x8e, 0x06, 0xde, 0x3b, 0x20, 0x58, 0x93, 0xf7, 0xf2, 0x5d,\n  0xc4, 0xb2, 0x8b, 0x2e, 0x53, 0x9f, 0x38, 0x28, 0x07, 0xe4, 0xdb, 0xcb,\n  0x8a, 0x23, 0xcf, 0xb5, 0x95, 0x1c, 0x8d, 0xf4, 0xcc, 0xe4, 0x64, 0x2e,\n  0x49, 0xa3, 0x4c, 0x68, 0x5b, 0x80, 0xaa, 0x11, 0xb8, 0x57, 0xf0, 0x58,\n  0xce, 0x93, 0xda, 0x53, 0xdc, 0x0e, 0xdb, 0xba, 0xed, 0xc8, 0xa1, 0x60,\n  0xb1, 0x53, 0xf6, 0xe0, 0xca, 0x76, 0x28, 0x04, 0x2c, 0x49, 0x99, 0x93,\n  0x85, 0x36, 0x8e, 0x4c, 0x8d, 0x12, 0x1a, 0x96, 0x69, 0xa0, 0x64, 0x91,\n  0x69, 0xbc, 0x24, 0x26, 0x16, 0x42, 0xcb, 0x22, 0xc9, 0x41, 0xe6, 0xa5,\n  0x74, 0x51, 0xcd, 0xe9, 0x06, 0xa7, 0x8d, 0x66, 0x39, 0x9e, 0xa1, 0x69,\n  0xa8, 0x41, 0x84, 0x42, 0x2b, 0x96, 0x54, 0x41, 0x93, 0x44, 0x04, 0xdc,\n  0x04, 0x19, 0x2b, 0x5c, 0x12, 0xbf, 0x8b, 0x72, 0x99, 0x2c, 0x16, 0x93,\n  0x4d, 0x6e, 0x02, 0x88, 0x01, 0x38, 0x70, 0xb2, 0x92, 0x48, 0x41, 0x45,\n  0x1c, 0x08, 0x63, 0x5b, 0xb0, 0x27, 0xda, 0x7a, 0xf4, 0xfa, 0xd9, 0x74,\n  0x5f, 0x6b, 0x6c, 0xb3, 0x9f, 0x54, 0x20, 0x84, 0x74, 0x36, 0xee, 0x5d,\n  0xf7, 0xcf, 0x6e, 0x03, 0x61, 0x34, 0x36, 0x3d, 0xf1, 0x38, 0x6b, 0xd1,\n  0xa2, 0xed, 0xcb, 0x5c, 0x34, 0x22, 0x96, 0x87, 0x1b, 0x32, 0xe8, 0x5d,\n  0x76, 0xdc, 0x1e, 0x15, 0x60, 0x82, 0xac, 0xd5, 0xa0, 0xf8, 0x72, 0x83,\n  0xdc, 0x94, 0xdb, 0x64, 0xb6, 0x58, 0xb2, 0x0d, 0x4a, 0x49, 0x0d, 0xca,\n  0x0a, 0xc5, 0x21, 0xb5, 0x28, 0x45, 0x8b, 0xd3, 0xde, 0x86, 0xe2, 0x66,\n  0x56, 0x35, 0x3e, 0x3d, 0x3d, 0xdf, 0x5c, 0xd4, 0x50, 0x44, 0x6a, 0x0f,\n  0x2c, 0x5e, 0xf1, 0xe6, 0xe3, 0x68, 0xaa, 0xf7, 0xf2, 0x17, 0x67, 0x98,\n  0xfb, 0xee, 0xe6, 0x3d, 0x96, 0x97, 0xa8, 0x15, 0xbe, 0x7d, 0x22, 0x1d,\n  0xa5, 0xb1, 0xe5, 0x63, 0x82, 0x42, 0xc8, 0xe5, 0x44, 0x32, 0xf0, 0x2f,\n  0x64, 0xde, 0xa4, 0x2c, 0x6f, 0x27, 0x9e, 0xc8, 0x32, 0x25, 0x44, 0xc8,\n  0xa4, 0xd8, 0xd1, 0x0b, 0xb3, 0x4d, 0x87, 0xea, 0xb3, 0xb4, 0x9d, 0xd8,\n  0x6a, 0xfe, 0x09, 0x68, 0x43, 0xe6, 0xe7, 0xc8, 0xd8, 0xd4, 0x68, 0xb3,\n  0x66, 0x3e, 0xa0, 0xd4, 0xe9, 0x49, 0x58, 0xf9, 0x03, 0xc4, 0xf6, 0xf2,\n  0x5c, 0x7d, 0x8d, 0xb1, 0x61, 0x1b, 0x34, 0x84, 0xd7, 0xe1, 0x8b, 0x69,\n  0x35, 0xe4, 0x4c, 0xe8, 0x20, 0x96, 0x38, 0x28, 0x55, 0x5c, 0xc7, 0x29,\n  0x4e, 0xe0, 0x79, 0xee, 0xb8, 0x08, 0x7e, 0x15, 0x1c, 0xcc, 0x1d, 0x50,\n  0x63, 0xe3, 0x99, 0x5a, 0x50, 0xa1, 0x15, 0xe6, 0x00, 0x10, 0x16, 0xe0,\n  0x4b, 0xb1, 0x91, 0x7a, 0xe6, 0x9a, 0xd7, 0xce, 0xa4, 0x7d, 0x91, 0x30,\n  0xa2, 0xe2, 0xb1, 0x70, 0x49, 0xa4, 0x24, 0xe0, 0xf7, 0xb8, 0x6d, 0x16,\n  0x93, 0x41, 0x2d, 0xf2, 0x1c, 0xb0, 0xac, 0xcb, 0x89, 0xc4, 0x80, 0xb8,\n  0x97, 0x0f, 0x77, 0x29, 0x95, 0x38, 0x27, 0x21, 0x99, 0x2c, 0x99, 0x24,\n  0xc0, 0x2b, 0x42, 0x00, 0x9b, 0x56, 0x2f, 0x1f, 0xb8, 0xbd, 0xf9, 0xca,\n  0x9f, 0xc4, 0x9b, 0x6f, 0xee, 0x3e, 0x5c, 0x51, 0x7a, 0x64, 0xf4, 0xfd,\n  0x1f, 0x50, 0x3b, 0xeb, 0x7b, 0x44, 0x7e, 0x80, 0x11, 0xea, 0x4c, 0xd6,\n  0x47, 0xee, 0x58, 0xb8, 0x41, 0x44, 0x1f, 0xd8, 0x41, 0xff, 0x60, 0xf6,\n  0xe1, 0xa5, 0xe4, 0xad, 0xe7, 0x9c, 0xc6, 0x71, 0xa3, 0xed, 0x1f, 0x1e,\n  0x6a, 0x4f, 0x59, 0x83, 0x5a, 0xc1, 0x6f, 0xaa, 0x7e, 0xff, 0x63, 0xa3,\n  0xa7, 0x4e, 0x1e, 0xbb, 0x1d, 0xb8, 0x10, 0xaf, 0xbe, 0x46, 0xef, 0xa5,\n  0x03, 0x7f, 0x89, 0x1c, 0xca, 0xdf, 0x84, 0x1c, 0xca, 0xd7, 0x94, 0x43,\n  0x71, 0x91, 0xdb, 0x65, 0xdd, 0x80, 0x1c, 0xa2, 0xb9, 0x62, 0x68, 0xa3,\n  0x15, 0x31, 0x5c, 0xec, 0xd9, 0x95, 0xca, 0xbc, 0x83, 0x9e, 0x1a, 0x69,\n  0x1a, 0x2c, 0x49, 0x8c, 0xd6, 0x9f, 0xb8, 0x87, 0x4d, 0x6f, 0x12, 0x81,\n  0x0d, 0x24, 0xa9, 0x56, 0x77, 0xec, 0x6e, 0x6c, 0xeb, 0xe7, 0x91, 0x39,\n  0x4d, 0x07, 0x5a, 0x0e, 0xf5, 0xa5, 0x16, 0x66, 0x2c, 0xa6, 0x41, 0xb3,\n  0xe9, 0xc2, 0x6d, 0xa8, 0xae, 0xde, 0x5c, 0xac, 0x16, 0xbc, 0xa6, 0xea,\n  0x91, 0x5d, 0x95, 0x9b, 0x87, 0x07, 0x36, 0x4d, 0x50, 0xb2, 0x4e, 0x74,\n  0x13, 0x9d, 0x88, 0x52, 0x15, 0xd8, 0x1e, 0xd7, 0x80, 0x2c, 0x2c, 0x3a,\n  0x7a, 0x59, 0x18, 0xe5, 0xd8, 0xbf, 0x16, 0x04, 0xfe, 0x38, 0xe4, 0x86,\n  0x5f, 0xc0, 0xd6, 0x35, 0x9c, 0x8f, 0x08, 0xe8, 0xc0, 0x32, 0x86, 0xc1,\n  0x0a, 0xcd, 0xa8, 0x80, 0xeb, 0x45, 0x5e, 0x38, 0xb3, 0xb1, 0x1b, 0x66,\n  0xd2, 0xfe, 0x78, 0x0c, 0x51, 0xa5, 0x25, 0xb1, 0x8a, 0x78, 0x45, 0x38,\n  0x58, 0xe4, 0x73, 0xda, 0x01, 0x56, 0x97, 0x08, 0x26, 0x8a, 0xa2, 0xda,\n  0x02, 0x82, 0x81, 0x49, 0x18, 0x5d, 0x53, 0x47, 0xf2, 0x95, 0x24, 0xb6,\n  0xd0, 0x35, 0x75, 0xf6, 0x2e, 0xd5, 0xb2, 0x96, 0x18, 0x1f, 0x97, 0xb4,\n  0x24, 0x3a, 0x4d, 0xff, 0x60, 0xe6, 0xe1, 0x3d, 0x75, 0x44, 0x4d, 0xf4,\n  0x16, 0xfa, 0xe3, 0x9f, 0xd4, 0x3f, 0x75, 0x4f, 0xbe, 0xaa, 0x0c, 0x1e,\n  0x6a, 0x26, 0xba, 0xd2, 0x4b, 0x74, 0x25, 0x82, 0xad, 0xec, 0x3b, 0xd2,\n  0x1a, 0x3f, 0xe2, 0xa8, 0x62, 0x8a, 0xe6, 0x39, 0x45, 0x3e, 0x65, 0x14,\n  0x12, 0xb1, 0x21, 0x7a, 0x9c, 0xc2, 0x7a, 0x80, 0xbb, 0x4b, 0x43, 0xc5,\n  0x26, 0x4d, 0x61, 0x2d, 0x10, 0xc5, 0xe5, 0x30, 0x98, 0xe2, 0x79, 0x78,\n  0xb0, 0x38, 0xf1, 0xe5, 0x22, 0xa2, 0xcf, 0x6c, 0xe8, 0xfa, 0x99, 0xb4,\n  0x25, 0x16, 0x2d, 0x49, 0x44, 0xcb, 0x62, 0x65, 0x26, 0x5b, 0xd0, 0x1a,\n  0x0c, 0xdb, 0x2c, 0x1a, 0xec, 0xf0, 0x71, 0xd1, 0x15, 0xaa, 0x21, 0xbb,\n  0xae, 0xf9, 0x42, 0xb2, 0xc8, 0xda, 0xb2, 0x38, 0x7b, 0x80, 0xc9, 0xea,\n  0x87, 0xf1, 0xad, 0x33, 0x39, 0xca, 0x13, 0xea, 0x2d, 0x9b, 0x0c, 0x4b,\n  0xea, 0xc2, 0xea, 0x6f, 0x3f, 0xba, 0xac, 0x23, 0x27, 0x8e, 0x64, 0x95,\n  0xc7, 0x68, 0xa0, 0xff, 0x8e, 0xbe, 0x5f, 0x52, 0x18, 0xc2, 0x13, 0x40,\n  0x21, 0x89, 0xab, 0xb9, 0x4c, 0xe2, 0xd9, 0x00, 0xce, 0x74, 0xc2, 0xd1,\n  0xed, 0x07, 0xb4, 0x0f, 0x9f, 0xdb, 0x61, 0x35, 0x71, 0x02, 0x8b, 0x06,\n  0xd5, 0xf9, 0x2c, 0x1b, 0xf2, 0xa9, 0xac, 0x4a, 0xa4, 0x05, 0x21, 0x26,\n  0x90, 0x12, 0x25, 0xaf, 0xc7, 0xe5, 0xb4, 0xdb, 0x2c, 0x66, 0xa3, 0x41,\n  0xce, 0x2c, 0xd1, 0xac, 0xe2, 0xd9, 0x60, 0x56, 0x31, 0xac, 0xd3, 0xfb,\n  0xf3, 0xe8, 0x35, 0x5e, 0x2b, 0xc4, 0xb7, 0xbe, 0x4c, 0xd7, 0x7d, 0xe5,\n  0x5f, 0xd6, 0x62, 0x5e, 0x97, 0xdb, 0x4e, 0xff, 0x5a, 0xe6, 0x31, 0xec,\n  0x4b, 0xf7, 0x14, 0x79, 0x9c, 0x36, 0xb3, 0x81, 0x07, 0xd2, 0x97, 0x9c,\n  0xc6, 0x0b, 0xb8, 0xf1, 0x1a, 0x95, 0xc8, 0x90, 0x63, 0x04, 0x8e, 0x96,\n  0xc3, 0xee, 0x12, 0xa9, 0xa1, 0xcf, 0xeb, 0x76, 0x39, 0xec, 0x78, 0x26,\n  0x2b, 0xb9, 0x31, 0xda, 0x55, 0x3d, 0x70, 0xac, 0x26, 0xa4, 0xac, 0xc9,\n  0xeb, 0xc1, 0xff, 0xe4, 0xd3, 0x53, 0xe6, 0x70, 0x82, 0xac, 0xcb, 0x53,\n  0x09, 0x71, 0xbf, 0x73, 0x78, 0x1f, 0x09, 0x51, 0x87, 0xd2, 0x66, 0x3f,\n  0x62, 0x28, 0x37, 0x62, 0x01, 0x58, 0x8f, 0xd5, 0xe6, 0x9c, 0xf3, 0xf8,\n  0x95, 0xa3, 0x10, 0x62, 0xb0, 0x12, 0xbe, 0xe3, 0x15, 0x47, 0x3c, 0xde,\n  0x15, 0x47, 0x3c, 0x39, 0x17, 0xc2, 0xe9, 0x8e, 0x41, 0x3e, 0x27, 0xb1,\n  0x44, 0x22, 0x91, 0x80, 0x28, 0x51, 0xde, 0x17, 0x38, 0xda, 0x51, 0xce,\n  0x76, 0x60, 0x9f, 0xaa, 0xaf, 0xa7, 0x77, 0x64, 0xbe, 0x61, 0xfb, 0x9b,\n  0x47, 0x37, 0xdf, 0x3a, 0x5c, 0xd1, 0x56, 0xe4, 0x6f, 0x8f, 0x4f, 0xec,\n  0xe9, 0x38, 0xde, 0x1f, 0x6c, 0xb4, 0xcd, 0xce, 0x3a, 0xea, 0x5c, 0xdf,\n  0xc1, 0x5b, 0xd5, 0xdf, 0x3f, 0x7e, 0xef, 0x91, 0x7b, 0x37, 0x91, 0x38,\n  0xdf, 0x2d, 0x37, 0x8d, 0x2e, 0xd5, 0x88, 0x42, 0xe6, 0xa7, 0xf8, 0xe3,\n  0xf7, 0xfb, 0xda, 0xbd, 0xbf, 0x92, 0xcf, 0x77, 0x68, 0x3d, 0xde, 0xb3,\n  0xfd, 0x70, 0x36, 0xeb, 0xc2, 0xab, 0xaa, 0x15, 0xaf, 0xce, 0x22, 0x42,\n  0x8c, 0x20, 0x71, 0x75, 0xf1, 0x14, 0xcd, 0xf0, 0xb4, 0x42, 0xdc, 0x92,\n  0xa5, 0x5f, 0x92, 0xfc, 0x0b, 0x93, 0x19, 0x0e, 0x75, 0x42, 0x02, 0xf0,\n  0x45, 0xaf, 0x71, 0x96, 0x03, 0x67, 0xe3, 0x42, 0x11, 0x4d, 0xeb, 0x5b,\n  0x77, 0x37, 0x87, 0xeb, 0x1d, 0x8e, 0x54, 0xa0, 0x65, 0x78, 0xc7, 0xb4,\n  0xb9, 0xca, 0x3a, 0x35, 0xf5, 0x9f, 0x0b, 0x3f, 0xeb, 0x3f, 0xda, 0xe6,\n  0x5b, 0xb8, 0xa9, 0x91, 0x50, 0x74, 0xed, 0x5c, 0xda, 0x37, 0x27, 0x70,\n  0xcf, 0xd1, 0xce, 0x37, 0xde, 0xf8, 0x0d, 0xaa, 0x3f, 0x29, 0xc5, 0xf9,\n  0xe8, 0x2f, 0x62, 0xb9, 0xfb, 0xa9, 0xc5, 0xb4, 0xda, 0x82, 0x57, 0x03,\n  0x33, 0xa2, 0x39, 0x85, 0x97, 0xdd, 0x27, 0x9b, 0x57, 0xb8, 0x4d, 0xfc,\n  0x3c, 0x45, 0x02, 0xc7, 0x70, 0x64, 0x23, 0xef, 0xe7, 0xd2, 0x81, 0xda,\n  0x8a, 0xef, 0x49, 0xfd, 0xac, 0xec, 0x9c, 0x96, 0x81, 0xc8, 0xd5, 0x40,\n  0xd3, 0x0e, 0xc8, 0x6f, 0xd0, 0x81, 0x24, 0x13, 0xaa, 0x5f, 0x9b, 0xac,\n  0x7d, 0x61, 0xf3, 0xd2, 0xf0, 0xda, 0x84, 0xed, 0xa3, 0xd8, 0x46, 0x5c,\n  0x8b, 0xb4, 0x1d, 0xb8, 0x2c, 0x7b, 0xe9, 0xcd, 0x58, 0xc6, 0x56, 0xea,\n  0xbd, 0x92, 0xdb, 0xac, 0xd1, 0x83, 0x6b, 0x33, 0x88, 0x55, 0x08, 0x0d,\n  0x78, 0xe0, 0x37, 0x4e, 0xf9, 0x4d, 0xae, 0x14, 0xf6, 0x52, 0x84, 0x0e,\n  0x56, 0x6e, 0x3a, 0xa4, 0xa0, 0x40, 0xa9, 0x86, 0xd2, 0x37, 0xa9, 0x7e,\n  0x63, 0xa5, 0x00, 0xe2, 0xd7, 0x10, 0x40, 0x7c, 0xb5, 0x00, 0xb0, 0x04,\n  0xcc, 0xa1, 0xd0, 0x6a, 0x09, 0x28, 0x7e, 0x76, 0x7d, 0x00, 0xfd, 0x66,\n  0x7b, 0x7a, 0xa6, 0x75, 0xfa, 0xfd, 0xda, 0xca, 0xc1, 0x46, 0x9f, 0x49,\n  0x6b, 0xa8, 0xeb, 0x30, 0xa2, 0xae, 0xfe, 0xcc, 0x15, 0x6c, 0x95, 0x3f,\n  0xf1, 0xcd, 0x39, 0xbe, 0x8b, 0x79, 0xf1, 0xf7, 0xcb, 0x73, 0xe4, 0x2c,\n  0x1e, 0x2b, 0x27, 0xb5, 0x3b, 0xad, 0x56, 0x61, 0xfd, 0x91, 0x58, 0xe2,\n  0x95, 0xb9, 0x21, 0x03, 0xee, 0x2a, 0x36, 0xf9, 0x0a, 0x3d, 0x92, 0x8e,\n  0x09, 0x24, 0x48, 0x5e, 0x80, 0xa3, 0xa3, 0xf6, 0xe4, 0x5c, 0xc8, 0xc8,\n  0x73, 0xc3, 0x49, 0x39, 0x81, 0xc1, 0x39, 0x12, 0x96, 0x6c, 0xc4, 0x7c,\n  0x7d, 0xcb, 0x1e, 0x6e, 0xd3, 0x67, 0xbb, 0x4f, 0x0e, 0x57, 0xb6, 0xfa,\n  0xfd, 0x6d, 0xa1, 0xed, 0xf3, 0xd2, 0x11, 0x37, 0x36, 0x5b, 0x4f, 0x1d,\n  0x79, 0x7b, 0xb7, 0x56, 0x3b, 0xa2, 0xd5, 0xde, 0x78, 0x33, 0x52, 0x29,\n  0x87, 0xdd, 0xca, 0xf9, 0x26, 0xe1, 0xd4, 0x74, 0x82, 0x0d, 0xbd, 0xdc,\n  0xee, 0xbc, 0x06, 0xaf, 0x56, 0xfc, 0x6b, 0x35, 0x27, 0x7b, 0xfe, 0x4d,\n  0xc7, 0xe1, 0x00, 0x33, 0xe5, 0xb0, 0xa5, 0xfc, 0x8d, 0xad, 0x99, 0x9f,\n  0x4e, 0x4f, 0xa3, 0x20, 0x36, 0xe6, 0xa9, 0x85, 0x1b, 0xeb, 0x0c, 0xba,\n  0x61, 0x8d, 0x79, 0x66, 0xe9, 0x39, 0x72, 0x1e, 0x4e, 0x65, 0xcf, 0xf7,\n  0x5f, 0x24, 0xfe, 0x1a, 0xa9, 0x64, 0xc6, 0x5e, 0x04, 0xcf, 0x2c, 0x29,\n  0x5e, 0x84, 0x54, 0x4f, 0x2d, 0x0d, 0xae, 0xec, 0x3b, 0x19, 0xe1, 0x44,\n  0x52, 0x1e, 0xb5, 0xec, 0xe1, 0x3e, 0x7d, 0x76, 0xb1, 0x6f, 0x69, 0x58,\n  0x39, 0xdd, 0x07, 0xc5, 0x5c, 0x3e, 0xde, 0x97, 0xcf, 0xf5, 0xcf, 0x65,\n  0xcf, 0xf5, 0x11, 0xd4, 0x4b, 0xf3, 0x4b, 0x72, 0x39, 0x9a, 0x74, 0x22,\n  0x2e, 0x0a, 0xb4, 0x12, 0x00, 0xca, 0x77, 0xd3, 0x92, 0xca, 0x89, 0x3e,\n  0xbc, 0x50, 0x3e, 0x14, 0x9f, 0xde, 0x9e, 0x9e, 0x6d, 0x93, 0x8f, 0xc5,\n  0xe1, 0x50, 0xff, 0xe9, 0x57, 0x5e, 0x59, 0xf6, 0xd1, 0x66, 0x88, 0x8f,\n  0x56, 0x93, 0xae, 0x04, 0xdf, 0x88, 0xcf, 0xfa, 0x46, 0x34, 0xa7, 0x2c,\n  0x81, 0xbb, 0xc0, 0x2d, 0x54, 0xfc, 0x12, 0x0b, 0xf1, 0xce, 0x88, 0x26,\n  0x06, 0x48, 0x4d, 0x64, 0x6a, 0xa5, 0x73, 0x96, 0xa4, 0x67, 0xa6, 0x26,\n  0xb7, 0xe4, 0x78, 0x67, 0xb3, 0xcf, 0x20, 0xed, 0x0f, 0x56, 0x7a, 0x66,\n  0x92, 0x5f, 0x66, 0x2c, 0xec, 0x97, 0xe5, 0xbc, 0x5b, 0x19, 0x5a, 0xc5,\n  0x07, 0x59, 0xe1, 0x97, 0xe5, 0x36, 0x21, 0xd7, 0x2f, 0x9b, 0x1c, 0xca,\n  0xf5, 0xcb, 0xae, 0xfc, 0xc7, 0xa7, 0x11, 0xfb, 0xf8, 0x0a, 0xbf, 0x0c,\n  0x72, 0xe5, 0xee, 0xc6, 0x7d, 0xf7, 0x80, 0x8f, 0xaf, 0x81, 0x04, 0x14,\n  0x89, 0xb0, 0x9a, 0x88, 0x18, 0x42, 0x6c, 0x02, 0xcf, 0x29, 0x75, 0xd8,\n  0xf8, 0x22, 0x0f, 0xe8, 0x91, 0xc9, 0x01, 0xaf, 0x0d, 0x30, 0x04, 0xe6,\n  0x1b, 0x78, 0x61, 0x93, 0x16, 0x59, 0xd2, 0x52, 0x3e, 0x1c, 0x83, 0xde,\n  0xfb, 0x6b, 0x96, 0x61, 0xd0, 0x96, 0xf3, 0x2f, 0xb0, 0xff, 0x7a, 0x6e,\n  0x61, 0xf3, 0xbe, 0x91, 0x19, 0x6c, 0x39, 0xb2, 0x2f, 0xd3, 0xc7, 0xdd,\n  0x9b, 0x3a, 0x1d, 0x99, 0x1e, 0xac, 0xe4, 0x9f, 0xa4, 0xfb, 0x24, 0x67,\n  0xf5, 0x59, 0x67, 0x57, 0xa7, 0xf5, 0xca, 0xbd, 0xd9, 0x38, 0xce, 0xab,\n  0x58, 0x16, 0x0e, 0x18, 0x6f, 0xab, 0x56, 0x64, 0xb0, 0xed, 0x3c, 0x28,\n  0x00, 0xd9, 0x09, 0x4f, 0xed, 0x92, 0x56, 0x75, 0x6c, 0x80, 0x2a, 0x61,\n  0x46, 0xec, 0x23, 0x9b, 0x81, 0xab, 0x96, 0xc8, 0x20, 0x22, 0xbf, 0x3d,\n  0x9f, 0xae, 0x16, 0xbb, 0xe7, 0xaf, 0xe2, 0x31, 0xcf, 0xe3, 0xac, 0xbd,\n  0x81, 0xac, 0x08, 0xab, 0x49, 0x6b, 0x33, 0x35, 0x05, 0xec, 0x18, 0x86,\n  0x18, 0x04, 0xa7, 0x89, 0x1d, 0x63, 0xc3, 0x6b, 0xfb, 0x60, 0xba, 0xcf,\n  0x43, 0xb2, 0x09, 0x55, 0xcb, 0x86, 0x00, 0x24, 0xe1, 0x61, 0x2b, 0x96,\n  0x62, 0x39, 0x91, 0xdd, 0x47, 0x16, 0x6f, 0xb5, 0xac, 0x95, 0x76, 0x3b,\n  0x18, 0x04, 0x76, 0xbf, 0xdd, 0xaf, 0xb7, 0xe9, 0x09, 0x0f, 0x4d, 0xd6,\n  0xa4, 0x59, 0x6d, 0x10, 0x58, 0x62, 0x01, 0x21, 0x04, 0xd8, 0xa8, 0xb1,\n  0x0a, 0x3a, 0x46, 0xa0, 0x3c, 0xff, 0x9c, 0x67, 0x0f, 0xdc, 0x3c, 0x99,\n  0x79, 0x71, 0xeb, 0x36, 0xe4, 0x18, 0x43, 0xf6, 0x6f, 0x8e, 0x32, 0x7a,\n  0x1d, 0x2b, 0x98, 0xf9, 0xb1, 0x65, 0x8b, 0xe6, 0x8d, 0xe9, 0x17, 0x5e,\n  0xa0, 0xbf, 0x71, 0x25, 0x89, 0xca, 0x7f, 0x24, 0x96, 0x94, 0x6b, 0xfd,\n  0xcd, 0xa6, 0x1f, 0x91, 0xf6, 0x4b, 0xdc, 0xea, 0x60, 0xcb, 0x24, 0xa8,\n  0x5a, 0xea, 0xbd, 0x69, 0x7d, 0x0c, 0x89, 0x6c, 0x14, 0x09, 0xa2, 0x15,\n  0xa9, 0x55, 0x4a, 0x0a, 0x57, 0x85, 0x26, 0xdf, 0x28, 0x03, 0xe0, 0x7e,\n  0xb5, 0xa0, 0xda, 0x47, 0x89, 0x22, 0xbb, 0xa0, 0xc5, 0x82, 0xc7, 0xd6,\n  0xa7, 0x5a, 0xcd, 0x2d, 0xca, 0xe1, 0x56, 0x4f, 0xba, 0x66, 0x03, 0x37,\n  0x90, 0x74, 0x1b, 0xb5, 0x9a, 0x5f, 0x54, 0x6c, 0xd6, 0x22, 0x40, 0xa6,\n  0xa8, 0xa9, 0x2a, 0x2b, 0x09, 0x07, 0xfd, 0x3e, 0x97, 0xc3, 0x62, 0xd6,\n  0x27, 0x0c, 0x09, 0x59, 0x1e, 0xba, 0x55, 0xf2, 0x10, 0x88, 0x5f, 0xab,\n  0xe0, 0xdf, 0xe0, 0x91, 0xad, 0x5f, 0xce, 0xc0, 0xb0, 0x2c, 0xa3, 0x6c,\n  0xa2, 0x1f, 0xe6, 0x49, 0x69, 0xd7, 0xe2, 0x5c, 0xda, 0xc4, 0x86, 0x86,\n  0xba, 0xfb, 0x76, 0x9e, 0x3e, 0xbb, 0xad, 0x29, 0x55, 0x32, 0x18, 0xf0,\n  0x84, 0x76, 0x3e, 0x3c, 0xb2, 0x7b, 0xa8, 0xbe, 0xb4, 0x7b, 0x76, 0xd9,\n  0x8a, 0xfa, 0xc1, 0xe4, 0x5c, 0xe6, 0x9d, 0x83, 0x65, 0x25, 0x43, 0xe3,\n  0xa3, 0x53, 0x2c, 0x53, 0xdc, 0x55, 0xeb, 0x32, 0x76, 0x5a, 0x3c, 0x99,\n  0x17, 0x19, 0xb6, 0x21, 0x59, 0x5e, 0x32, 0x30, 0x9c, 0x3d, 0xc3, 0x3c,\n  0x4d, 0x38, 0xbe, 0xc2, 0x32, 0xc7, 0x97, 0x97, 0xd4, 0xc8, 0xd1, 0x39,\n  0x35, 0x72, 0x92, 0x7c, 0x9f, 0x57, 0xb0, 0xab, 0xa8, 0x03, 0xff, 0x2d,\n  0xe1, 0xc3, 0xe1, 0xbb, 0x99, 0x14, 0xd1, 0xa3, 0x8b, 0xca, 0x75, 0x4c,\n  0x39, 0xe1, 0x2b, 0xfc, 0xa0, 0x52, 0x1b, 0x8f, 0x5e, 0x25, 0x7a, 0xe5,\n  0x82, 0x0c, 0xa6, 0x1c, 0xc3, 0x92, 0x93, 0xe4, 0x29, 0xaa, 0x04, 0x71,\n  0x89, 0x14, 0xf1, 0x53, 0xc4, 0xf2, 0x52, 0xa9, 0x08, 0x31, 0x34, 0x09,\n  0xff, 0x65, 0xf9, 0x23, 0x8d, 0x59, 0x2e, 0xba, 0xd5, 0x36, 0xb2, 0x25,\n  0x90, 0x25, 0x41, 0x09, 0xa0, 0x97, 0xf3, 0xa4, 0xb4, 0x35, 0x73, 0x0c,\n  0xdd, 0x9b, 0xf9, 0x1a, 0x0a, 0x65, 0x5e, 0x40, 0xa9, 0x5c, 0x1d, 0xa2,\n  0x2f, 0x8f, 0xfc, 0xeb, 0xf0, 0x55, 0xa5, 0x4e, 0x14, 0x11, 0xbd, 0x01,\n  0x0f, 0x67, 0x5b, 0x7a, 0xda, 0x8d, 0x78, 0xce, 0x83, 0xf0, 0x42, 0xb4,\n  0xd2, 0x82, 0xa7, 0x54, 0x14, 0xc7, 0xab, 0xb8, 0x7d, 0x50, 0xc2, 0xc3,\n  0x2e, 0x68, 0xa4, 0xc1, 0x97, 0x39, 0x2e, 0xca, 0x84, 0xe1, 0x58, 0x14,\n  0x86, 0x5d, 0x72, 0x56, 0x00, 0xbc, 0xce, 0x6a, 0xd1, 0x47, 0x0c, 0x91,\n  0xf5, 0x86, 0x7d, 0xa5, 0xbb, 0xab, 0x60, 0xac, 0x42, 0x8d, 0x29, 0x7a,\n  0x3e, 0x7f, 0xb8, 0x37, 0x61, 0xa7, 0xe5, 0x3e, 0x7a, 0x66, 0x34, 0x39,\n  0x02, 0x1e, 0xef, 0xe0, 0x0d, 0x1d, 0xcd, 0x07, 0x7b, 0xda, 0xfb, 0x04,\n  0x64, 0x42, 0x6d, 0xcb, 0x83, 0xfd, 0xfd, 0x96, 0xc3, 0x7d, 0xa9, 0x6d,\n  0xf3, 0x16, 0xf3, 0x90, 0xd9, 0xd4, 0x76, 0xeb, 0xcc, 0xf4, 0xe9, 0xee,\n  0xcd, 0x63, 0x9b, 0xbb, 0xb7, 0x92, 0x71, 0x68, 0xc6, 0xfd, 0x7c, 0x1c,\n  0xfb, 0xb9, 0x0e, 0xc9, 0x4f, 0x61, 0x81, 0x05, 0x54, 0x62, 0x25, 0xce,\n  0xd6, 0xc5, 0x4a, 0x74, 0x4d, 0x72, 0xdd, 0xae, 0x12, 0x68, 0x73, 0x39,\n  0x11, 0xe5, 0xf5, 0x38, 0xfd, 0x2e, 0xbf, 0xcd, 0x6a, 0xd4, 0x8b, 0x3c,\n  0xe5, 0x40, 0x0e, 0x25, 0xe5, 0x2d, 0x95, 0x17, 0x32, 0xc4, 0x4b, 0xb2,\n  0x52, 0x1c, 0x6b, 0xb5, 0xdb, 0xd1, 0x60, 0xd7, 0xb1, 0xaa, 0xb2, 0x83,\n  0x23, 0xc7, 0xde, 0x33, 0xdc, 0x7f, 0xef, 0xfe, 0x03, 0x67, 0x9b, 0x69,\n  0x8d, 0x70, 0xcb, 0xe2, 0xe2, 0x2d, 0x42, 0x66, 0x2b, 0xf6, 0x3d, 0x2f,\n  0x38, 0x4d, 0xe3, 0x46, 0xfb, 0xf6, 0xc7, 0xaf, 0x3b, 0xfa, 0xd8, 0xb6,\n  0x6d, 0x8f, 0x1f, 0x0d, 0xde, 0x7c, 0xe1, 0xca, 0xe7, 0xde, 0x72, 0xe3,\n  0xc0, 0xe1, 0x66, 0x4a, 0xe1, 0xbc, 0xbc, 0x02, 0x3a, 0xc4, 0x7a, 0xc8,\n  0xef, 0xa4, 0xed, 0xa0, 0x9f, 0xf4, 0x67, 0x64, 0xfd, 0x6c, 0x5a, 0xa5,\n  0x9f, 0xd2, 0x3d, 0x58, 0x3f, 0xe1, 0x1e, 0xd0, 0xcf, 0x57, 0xa5, 0x9a,\n  0x46, 0xc9, 0x3f, 0xc3, 0xf7, 0x12, 0xba, 0x6e, 0xb8, 0xf7, 0xae, 0x55,\n  0xf5, 0x9f, 0x92, 0x1f, 0x84, 0xef, 0x25, 0xb8, 0x57, 0xf8, 0xde, 0x2d,\n  0xd2, 0xbd, 0x51, 0xfc, 0x5e, 0x3b, 0xb9, 0xf7, 0x63, 0xd2, 0xbd, 0x57,\n  0xaf, 0xac, 0xba, 0x37, 0x80, 0xdf, 0xfb, 0x19, 0x72, 0xef, 0xb7, 0xa5,\n  0x7b, 0xbf, 0x22, 0xed, 0xb5, 0x21, 0x7c, 0xaf, 0x09, 0xef, 0x37, 0x6e,\n  0x60, 0xd2, 0x40, 0x88, 0xe5, 0x1c, 0x88, 0xc2, 0xbe, 0x09, 0xcd, 0x68,\n  0xb2, 0x31, 0x5a, 0xe0, 0x82, 0x86, 0xf8, 0x1d, 0x89, 0x40, 0x44, 0xb3,\n  0x7e, 0x49, 0x19, 0x92, 0x4f, 0xdf, 0xcc, 0xe1, 0x48, 0x58, 0x4e, 0x2e,\n  0xc9, 0x82, 0xf1, 0xe6, 0x65, 0x6b, 0xd5, 0x07, 0x52, 0xe8, 0xf7, 0x7f,\n  0x3c, 0xf3, 0xce, 0xb7, 0xdf, 0xdf, 0xb4, 0x54, 0x5e, 0x79, 0xa4, 0x66,\n  0x61, 0xe7, 0xb1, 0xfd, 0x5d, 0xbf, 0x06, 0x40, 0x96, 0xde, 0xdf, 0xb0,\n  0xbb, 0x77, 0xcd, 0xdd, 0x64, 0xb2, 0x8f, 0xdb, 0x5d, 0xfd, 0x5d, 0x5d,\n  0x6d, 0x7d, 0x3f, 0x1f, 0xc5, 0x6d, 0xd2, 0x5f, 0x35, 0xa2, 0x6f, 0xd3,\n  0xc0, 0x74, 0x22, 0xb7, 0xc9, 0x85, 0x35, 0x00, 0x9b, 0xbd, 0xd8, 0x6f,\n  0x2a, 0xd8, 0xa6, 0xf8, 0x8a, 0x88, 0xb1, 0x97, 0xf2, 0x42, 0x1d, 0xab,\n  0xd2, 0x26, 0xa9, 0x86, 0xb3, 0x50, 0xa3, 0xfe, 0xf1, 0x27, 0xdd, 0xd7,\n  0x75, 0x76, 0x9c, 0x1c, 0x6b, 0x9e, 0x2b, 0x0e, 0x2c, 0x36, 0x0d, 0xed,\n  0x3c, 0xba, 0xad, 0xf9, 0x27, 0x99, 0x6f, 0xd2, 0xce, 0xf4, 0x1f, 0xd8,\n  0xd4, 0x42, 0x5f, 0xef, 0xe1, 0x56, 0x8b, 0x71, 0xd4, 0xe8, 0x9e, 0x19,\n  0x9a, 0x18, 0x68, 0xfd, 0x7d, 0x3f, 0x95, 0x83, 0xc7, 0x35, 0xa5, 0xe0,\n  0x71, 0xe1, 0xcd, 0xf9, 0x9b, 0x85, 0xf0, 0xf6, 0xe8, 0x72, 0xac, 0xc5,\n  0x32, 0xee, 0x16, 0xbe, 0xe6, 0x6d, 0x39, 0xf7, 0xde, 0x93, 0xc5, 0xf2,\n  0x3a, 0x80, 0x27, 0xeb, 0xca, 0x71, 0x92, 0xee, 0x7d, 0x5e, 0xbe, 0x17,\n  0x8f, 0x53, 0x5c, 0x7a, 0x2f, 0xa9, 0x63, 0x27, 0x6b, 0x5f, 0x8d, 0x7c,\n  0xef, 0x9e, 0x55, 0xba, 0x25, 0xd5, 0x92, 0xc3, 0xda, 0x37, 0x2e, 0xdd,\n  0xab, 0xcb, 0xb9, 0x17, 0x78, 0x2e, 0xe8, 0x39, 0x2a, 0x8f, 0xb7, 0x9d,\n  0x9e, 0xcf, 0x79, 0xf6, 0x6d, 0x58, 0x6f, 0xe7, 0xb2, 0xcf, 0x7e, 0x1c,\n  0x3f, 0x9b, 0xa1, 0x3f, 0xf6, 0xf8, 0xaa, 0x67, 0xc3, 0x3d, 0xf0, 0x6c,\n  0xad, 0xf4, 0xec, 0x22, 0xfc, 0x79, 0x33, 0xdc, 0x8b, 0xbe, 0x2c, 0xeb,\n  0xde, 0x8b, 0xe4, 0x5e, 0x94, 0x73, 0xaf, 0xc4, 0xe9, 0x0c, 0x7d, 0x7a,\n  0x49, 0xba, 0x57, 0xe6, 0xb3, 0xd2, 0xe0, 0x7b, 0xaf, 0x23, 0xb2, 0x7c,\n  0x46, 0x96, 0xe5, 0x9d, 0x6b, 0xf0, 0x2e, 0x3e, 0xae, 0xf0, 0x2e, 0xa2,\n  0xc1, 0xce, 0xdc, 0x7b, 0xef, 0x51, 0xee, 0xc5, 0x6d, 0x0e, 0xaf, 0x9e,\n  0x2f, 0xe4, 0xde, 0xe7, 0xb3, 0x9c, 0x8d, 0x07, 0x5e, 0xc8, 0xbd, 0xf7,\n  0x63, 0xd9, 0xf7, 0x8e, 0x53, 0x8f, 0xae, 0x71, 0x6f, 0x96, 0xef, 0x11,\n  0x8d, 0x6f, 0x93, 0xee, 0x25, 0xe7, 0xe6, 0xe4, 0xbd, 0xcf, 0xca, 0xef,\n  0xad, 0x5a, 0x75, 0xaf, 0xc4, 0xab, 0x0e, 0xfd, 0xfd, 0x99, 0xf4, 0x5e,\n  0x55, 0xd6, 0x46, 0x27, 0xf9, 0xcb, 0x2a, 0xc0, 0x34, 0x93, 0x63, 0x7b,\n  0x14, 0x00, 0x4c, 0x72, 0x68, 0xd9, 0x61, 0x91, 0xf8, 0x0b, 0xc1, 0x6e,\n  0x26, 0x49, 0x3e, 0xb6, 0x80, 0x1c, 0x6d, 0x80, 0xb4, 0xe5, 0xad, 0x5b,\n  0x67, 0xe9, 0xcb, 0xa3, 0x57, 0x7e, 0x08, 0x1e, 0x63, 0x36, 0xc7, 0xa2,\n  0x17, 0x3d, 0x44, 0x38, 0xb9, 0x0b, 0x3c, 0x33, 0xbe, 0xc6, 0x33, 0x95,\n  0x68, 0x21, 0x7a, 0xe8, 0xe5, 0x91, 0xa9, 0x51, 0x25, 0x54, 0x48, 0x3b,\n  0x25, 0x4c, 0x3a, 0xfa, 0x7f, 0x48, 0xff, 0xbe, 0x28, 0xf7, 0xef, 0x5e,\n  0xd2, 0x3f, 0x66, 0x85, 0x8e, 0xfe, 0x23, 0xe9, 0xdf, 0x2f, 0xa4, 0xfe,\n  0x65, 0xb9, 0x98, 0x9a, 0x48, 0xff, 0xbc, 0xd4, 0x78, 0x7a, 0x44, 0xe1,\n  0xec, 0xc6, 0x2b, 0x37, 0x36, 0xce, 0x18, 0x15, 0x7d, 0x86, 0x80, 0x53,\n  0x31, 0x2a, 0xe0, 0x97, 0x46, 0x6a, 0xfc, 0x0d, 0xb5, 0x37, 0x67, 0x3b,\n  0x25, 0xbe, 0x09, 0xca, 0xdb, 0x49, 0x65, 0x1e, 0x6f, 0x2f, 0xf2, 0x6a,\n  0x72, 0x79, 0xbc, 0x53, 0x29, 0x29, 0xb1, 0x4a, 0x61, 0x13, 0x03, 0xd0,\n  0xdf, 0x4b, 0x16, 0xbf, 0x5a, 0x74, 0x1b, 0xab, 0x66, 0xfa, 0xfb, 0xd1,\n  0x83, 0x90, 0xde, 0x3d, 0xdc, 0xf8, 0x65, 0x91, 0xed, 0x63, 0xf8, 0xda,\n  0x1e, 0x92, 0xde, 0x3d, 0xfa, 0xbb, 0xe1, 0xff, 0xbc, 0x2f, 0xbd, 0x09,\n  0x72, 0xbc, 0x71, 0x1b, 0x1f, 0x26, 0x6b, 0xcb, 0x9b, 0x6c, 0x63, 0xfc,\n  0x4d, 0xb6, 0x91, 0xc4, 0x31, 0x03, 0x72, 0x66, 0x38, 0xb4, 0xf1, 0x9c,\n  0xdc, 0xc6, 0xc9, 0xc1, 0x41, 0xd4, 0xf7, 0xdb, 0x0f, 0x7e, 0x70, 0x28,\n  0xdb, 0xc4, 0x5f, 0x75, 0xff, 0xba, 0xff, 0x91, 0xee, 0xc7, 0xcf, 0xa7,\n  0x37, 0x51, 0x72, 0x5c, 0xb1, 0x89, 0x5e, 0x20, 0x6b, 0x72, 0x4f, 0xba,\n  0xcb, 0x66, 0x36, 0x68, 0x59, 0x3e, 0x4b, 0x81, 0x0e, 0x30, 0xec, 0x2c,\n  0xcd, 0xf2, 0xf4, 0x19, 0xd0, 0x5c, 0x68, 0xa0, 0xa4, 0x3c, 0x72, 0x06,\n  0x25, 0x1e, 0x04, 0x72, 0xce, 0xa5, 0xd7, 0x91, 0x76, 0xe5, 0x64, 0xed,\n  0x2b, 0xed, 0xca, 0x8d, 0x3b, 0x02, 0x5c, 0xf2, 0x6f, 0xe4, 0x66, 0xe5,\n  0x04, 0x20, 0xff, 0x29, 0x47, 0x7a, 0x2b, 0xe2, 0x90, 0xf7, 0x29, 0x6d,\n  0x34, 0xe3, 0x36, 0x3a, 0x48, 0xbc, 0x66, 0xa3, 0x6d, 0x8c, 0x6f, 0xbc,\n  0x8d, 0xb9, 0xb1, 0x4a, 0x68, 0xe3, 0xa3, 0x72, 0x1b, 0xcb, 0x97, 0x83,\n  0x96, 0xf7, 0xf7, 0x65, 0xdb, 0xb8, 0x1c, 0xbb, 0xfc, 0xe6, 0x79, 0x32,\n  0xc6, 0xd8, 0x4b, 0xa0, 0x7b, 0x08, 0x67, 0x1d, 0xf6, 0xa1, 0xc0, 0x82,\n  0xd0, 0x61, 0x3f, 0x0e, 0xa0, 0x98, 0xf0, 0x5a, 0xcc, 0x72, 0x14, 0xbb,\n  0x8f, 0xce, 0x4d, 0x56, 0x84, 0x74, 0x53, 0xfc, 0x43, 0x1c, 0x62, 0x4b,\n  0x52, 0x12, 0x0d, 0x1e, 0x33, 0x0b, 0x91, 0x54, 0xa8, 0xf5, 0x5d, 0xcf,\n  0xee, 0x7e, 0xea, 0xa9, 0x9d, 0x9f, 0x7f, 0xe0, 0x7d, 0xcf, 0xed, 0xfd,\n  0xcc, 0xb3, 0x3b, 0x9f, 0x7b, 0x18, 0x3d, 0x82, 0x12, 0x99, 0x5f, 0x22,\n  0x57, 0xe6, 0xb9, 0x91, 0xcc, 0x47, 0x89, 0x78, 0xc6, 0x29, 0x29, 0x87,\n  0x0f, 0x5d, 0xc5, 0xf2, 0x58, 0xf7, 0x9d, 0xf1, 0xc2, 0xef, 0x8c, 0x41,\n  0x57, 0x81, 0x54, 0xcc, 0x01, 0x3d, 0xaf, 0x0f, 0x35, 0x9c, 0xfd, 0x6b,\n  0xe8, 0xe3, 0x23, 0x17, 0x2e, 0x3e, 0xb9, 0x1b, 0xf7, 0xf8, 0x23, 0x17,\n  0x50, 0xdd, 0xbf, 0x5f, 0xbe, 0xfc, 0xef, 0xdd, 0xbf, 0xfb, 0xe1, 0x0f,\n  0x7f, 0x07, 0x36, 0x12, 0x90, 0x60, 0x99, 0x64, 0x6e, 0x39, 0xec, 0x21,\n  0xcb, 0xc4, 0x00, 0x12, 0xea, 0x20, 0x0f, 0x9c, 0x3d, 0x3b, 0x39, 0x29,\n  0x0a, 0x0c, 0x10, 0xac, 0xf9, 0x3c, 0x6d, 0xc0, 0x00, 0x1e, 0x90, 0xe9,\n  0xbc, 0x20, 0x5c, 0x1a, 0xc3, 0x0b, 0x01, 0xc9, 0x0b, 0x41, 0x5d, 0x6f,\n  0x3f, 0x99, 0xbc, 0x71, 0xd7, 0xe1, 0xd9, 0xcf, 0xee, 0xde, 0x3b, 0x3f,\n  0xb5, 0x75, 0x69, 0xae, 0x71, 0xb1, 0x05, 0x55, 0x5c, 0xa9, 0x1b, 0x42,\n  0xa8, 0xbb, 0xad, 0xab, 0x25, 0xbb, 0x07, 0x98, 0x49, 0x9c, 0xaa, 0x97,\n  0xd8, 0x6a, 0x6d, 0xd8, 0x86, 0x2e, 0x25, 0xf3, 0x3d, 0x06, 0xc8, 0x25,\n  0x46, 0x08, 0xef, 0x93, 0xf2, 0x37, 0x9e, 0x42, 0xfc, 0x7e, 0x91, 0x58,\n  0x0b, 0x42, 0x16, 0x28, 0xa4, 0x0c, 0x22, 0x98, 0xe0, 0x6a, 0xc0, 0xfe,\n  0x1c, 0x09, 0x63, 0xd9, 0xaa, 0x60, 0x7f, 0x36, 0x2d, 0x03, 0xe3, 0x2e,\n  0x27, 0xeb, 0xc8, 0xed, 0x93, 0xda, 0x46, 0xb0, 0x41, 0xd1, 0x9f, 0x1b,\n  0x6b, 0xab, 0x9a, 0x66, 0x16, 0x17, 0x5a, 0x87, 0x1c, 0xae, 0xd1, 0xf6,\n  0x23, 0x27, 0x9a, 0x4e, 0xef, 0xdd, 0xd4, 0x33, 0xbf, 0x70, 0xb1, 0xb2,\n  0xde, 0x89, 0xfd, 0xd7, 0xff, 0x68, 0x4c, 0x35, 0xd5, 0xff, 0xea, 0xbf,\n  0xc6, 0x0e, 0x94, 0x45, 0x23, 0x65, 0xfb, 0xf6, 0x76, 0xec, 0xac, 0x43,\n  0x15, 0x99, 0xb3, 0x6d, 0x03, 0x67, 0xfc, 0xd5, 0x5e, 0x4a, 0xe6, 0x0c,\n  0x63, 0x92, 0xf4, 0xeb, 0x54, 0x90, 0xaa, 0x84, 0x33, 0x64, 0x1f, 0x42,\n  0xbc, 0x89, 0xcc, 0x7c, 0x11, 0x82, 0xe7, 0xe7, 0x29, 0x19, 0xa5, 0x0b,\n  0x8a, 0x9f, 0xc8, 0x11, 0x57, 0x79, 0x7e, 0xcb, 0xc3, 0x21, 0x6c, 0x33,\n  0xc7, 0x43, 0x95, 0xe1, 0x4a, 0xc8, 0xa2, 0x0b, 0x47, 0x70, 0xeb, 0xd5,\n  0x05, 0x5a, 0xbf, 0xdc, 0x7c, 0xc8, 0x43, 0x49, 0x82, 0xad, 0xc9, 0x2c,\n  0xd7, 0xb4, 0xd7, 0x46, 0xf1, 0xb3, 0x3a, 0x1a, 0x92, 0x33, 0xbb, 0xe7,\n  0x6a, 0xda, 0x22, 0xba, 0xa2, 0xad, 0x03, 0xbb, 0x6e, 0x3a, 0x39, 0xd7,\n  0x3a, 0xe0, 0xe0, 0x11, 0x7b, 0x7f, 0x4f, 0x67, 0x57, 0xcf, 0x68, 0x07,\n  0x36, 0x93, 0x5f, 0xbf, 0xf2, 0x9d, 0x74, 0x7f, 0xba, 0xe3, 0x5d, 0xef,\n  0x5b, 0x9c, 0x77, 0x96, 0x7a, 0xe3, 0x0d, 0x77, 0xdf, 0x79, 0xd7, 0xdb,\n  0x2b, 0x02, 0xba, 0x1a, 0xe3, 0x0f, 0x33, 0x3f, 0x3b, 0xb0, 0x67, 0xcf,\n  0x9e, 0xed, 0x73, 0xa6, 0xdd, 0x07, 0x14, 0xdb, 0x8d, 0xa9, 0xa0, 0xbf,\n  0x4f, 0x95, 0x52, 0xf7, 0x49, 0x49, 0x58, 0x86, 0x38, 0xa2, 0x79, 0xfc,\n  0x30, 0x9a, 0x1e, 0x4c, 0x20, 0x1e, 0xce, 0x07, 0x95, 0x4f, 0x38, 0xf9,\n  0x13, 0x99, 0x7d, 0xc8, 0x0f, 0x78, 0xbd, 0x2c, 0x36, 0xa6, 0xc0, 0xa3,\n  0xa1, 0x16, 0x04, 0x29, 0xdc, 0x83, 0xd0, 0x72, 0x7c, 0x28, 0x0a, 0xc1,\n  0x13, 0x9e, 0x06, 0xb2, 0x40, 0x7c, 0x21, 0xb7, 0xd6, 0x85, 0xa4, 0xd4,\n  0x24, 0x1a, 0x2e, 0x2e, 0xf2, 0x79, 0x1c, 0x36, 0x28, 0x02, 0xa6, 0x4a,\n  0x51, 0xa9, 0x28, 0x45, 0x83, 0xe4, 0xa4, 0x7c, 0x87, 0x3d, 0x7f, 0x80,\n  0xa3, 0xab, 0x12, 0xf8, 0x91, 0xea, 0xc8, 0xf5, 0xdb, 0x7a, 0x27, 0xb6,\n  0x21, 0x94, 0x6c, 0x6e, 0x4c, 0x4d, 0xef, 0x9b, 0xdb, 0x76, 0x1d, 0x42,\n  0x07, 0x16, 0x17, 0x76, 0x2c, 0x2c, 0x0e, 0xb4, 0x34, 0x4d, 0x45, 0xcb,\n  0x13, 0x37, 0xd2, 0xdf, 0xdf, 0x35, 0xd4, 0x37, 0x05, 0xe0, 0x4b, 0xfd,\n  0x3d, 0xad, 0xcd, 0xe9, 0x9f, 0xbe, 0xb4, 0xb0, 0x30, 0x7f, 0x70, 0xa0,\n  0xa3, 0xaf, 0x0f, 0x92, 0xf4, 0xdd, 0x2d, 0xfe, 0x52, 0xa9, 0x76, 0xe1,\n  0x35, 0xfa, 0x47, 0x74, 0x90, 0x8a, 0xc3, 0xb9, 0x40, 0x14, 0x8f, 0x68,\n  0x44, 0xee, 0x3c, 0x5e, 0x90, 0xf2, 0x7b, 0xb3, 0x3f, 0xdb, 0x1b, 0x92,\n  0x4f, 0xcf, 0x2c, 0x4a, 0xbd, 0x81, 0x9a, 0x27, 0x9f, 0xc7, 0xed, 0xb4,\n  0xc1, 0xea, 0xa4, 0x05, 0x0e, 0x23, 0xe8, 0x8a, 0x25, 0xbf, 0x2b, 0xa4,\n  0x27, 0xa1, 0x60, 0x81, 0x7e, 0x3c, 0x37, 0x7d, 0x28, 0x59, 0x56, 0xdd,\n  0x4a, 0xd3, 0xd5, 0x8d, 0xfb, 0xa7, 0x3e, 0xf7, 0x19, 0x9e, 0xee, 0xed,\n  0xdd, 0xd4, 0xd0, 0x31, 0xd8, 0x5c, 0x1f, 0xdd, 0x14, 0xf5, 0x25, 0xc6,\n  0xe9, 0xa0, 0x94, 0x27, 0xaf, 0x6e, 0xaa, 0x2d, 0x4f, 0x9d, 0x79, 0xd7,\n  0xfb, 0xbe, 0xf0, 0x48, 0x75, 0xa9, 0x92, 0x42, 0x6f, 0x31, 0x93, 0xf1,\n  0xec, 0xa6, 0x17, 0xf1, 0x78, 0x86, 0xa8, 0xfe, 0x74, 0x6f, 0x31, 0x24,\n  0xd7, 0x91, 0x81, 0x0b, 0xc0, 0xc0, 0x41, 0xfd, 0xe8, 0x85, 0x35, 0xc6,\n  0x62, 0x5e, 0xda, 0xe5, 0x11, 0x55, 0xe4, 0x85, 0x40, 0x8d, 0xb4, 0x2d,\n  0x41, 0xbc, 0x32, 0x7f, 0x20, 0x6c, 0x36, 0x29, 0x5f, 0x60, 0x75, 0x05,\n  0x05, 0x32, 0x1d, 0xbb, 0x69, 0x67, 0xff, 0xcc, 0xfc, 0xec, 0xe4, 0xb6,\n  0x1b, 0x0f, 0xee, 0xda, 0xb3, 0xb4, 0x6f, 0x24, 0xdd, 0xba, 0x23, 0x5e,\n  0x9e, 0xb8, 0x85, 0x88, 0x7d, 0x92, 0x14, 0x3f, 0xdc, 0x82, 0x8d, 0x8e,\n  0xcb, 0xdd, 0x6d, 0x58, 0xe2, 0xa9, 0xe6, 0x90, 0x8b, 0x48, 0x5c, 0x92,\n  0x79, 0x2f, 0xad, 0xa2, 0x03, 0xd8, 0xfa, 0xc2, 0xfb, 0x40, 0x10, 0xcb,\n  0x3c, 0x20, 0xb7, 0x9b, 0x19, 0xcc, 0xb6, 0x56, 0xb6, 0x4a, 0x72, 0x44,\n  0x2e, 0xb7, 0x17, 0x8e, 0x1d, 0xec, 0x56, 0x69, 0x1f, 0x05, 0xe4, 0xc9,\n  0x5c, 0x69, 0x63, 0xab, 0x7d, 0xcd, 0xf6, 0xfe, 0x74, 0xf6, 0x48, 0x5d,\n  0xb9, 0x3f, 0x55, 0x3c, 0x3e, 0x39, 0xda, 0x3f, 0xd4, 0xdf, 0xdc, 0xb3,\n  0x25, 0xdd, 0x10, 0x1f, 0x0c, 0x17, 0x97, 0xcc, 0xd3, 0x81, 0xfe, 0xee,\n  0xea, 0x7a, 0x1d, 0xa7, 0xf2, 0xa7, 0x12, 0xfd, 0xd8, 0xa4, 0xb9, 0x54,\n  0x59, 0xd9, 0x17, 0x29, 0x8b, 0xc6, 0xcc, 0x44, 0xc2, 0x52, 0xbe, 0xd0,\n  0x1f, 0x99, 0x33, 0x78, 0xcd, 0x4a, 0x50, 0x17, 0xa4, 0xa3, 0x70, 0x75,\n  0x11, 0x5e, 0x06, 0x7c, 0x40, 0x67, 0x32, 0xe8, 0xc9, 0xfe, 0xc2, 0x11,\n  0x94, 0x20, 0xf8, 0xba, 0x18, 0xf2, 0xf8, 0x19, 0x42, 0x29, 0xc8, 0x28,\n  0x55, 0x66, 0xcb, 0x27, 0xea, 0x65, 0x70, 0x58, 0x5e, 0x52, 0xe0, 0x12,\n  0x2a, 0x7b, 0xc5, 0xf2, 0xc9, 0x7a, 0x19, 0x2d, 0x9f, 0x46, 0x27, 0xa8,\n  0x44, 0x24, 0x66, 0x0d, 0x99, 0x43, 0xf2, 0xf1, 0xaf, 0xa2, 0x54, 0x92,\n  0x77, 0x5a, 0x38, 0x8c, 0x40, 0x8f, 0xa5, 0xea, 0x0e, 0x4d, 0xef, 0xdf,\n  0xd6, 0x38, 0x93, 0xfc, 0x8e, 0xca, 0x66, 0xd7, 0xe8, 0x62, 0x6d, 0x58,\n  0x3a, 0x7a, 0xad, 0xc7, 0x58, 0x14, 0xb4, 0x8a, 0xa2, 0xd3, 0xa3, 0xc7,\n  0xab, 0xe0, 0xef, 0xd3, 0x0d, 0xb7, 0xc2, 0xd4, 0x88, 0x4e, 0xf6, 0xa2,\n  0xcf, 0xf7, 0xfd, 0xcd, 0xa5, 0x54, 0xd7, 0x0e, 0x88, 0x28, 0xf0, 0x42,\n  0x55, 0x5f, 0x2c, 0x7e, 0xff, 0x17, 0x8e, 0x92, 0x78, 0xc2, 0x6b, 0x8c,\n  0x86, 0xd8, 0x3f, 0x75, 0xe9, 0xa4, 0x1d, 0xf7, 0xd6, 0x46, 0xba, 0x9e,\n  0xd7, 0x85, 0xe5, 0xb0, 0xc1, 0xa2, 0xdc, 0x6e, 0x73, 0x28, 0x64, 0x09,\n  0x9a, 0x83, 0x52, 0xb0, 0x66, 0x79, 0x0e, 0x48, 0x8d, 0xcd, 0x39, 0xf1,\n  0xff, 0x45, 0x4d, 0xc3, 0x9e, 0xe9, 0x67, 0x76, 0xec, 0x7d, 0x77, 0xee,\n  0x99, 0x7f, 0xf3, 0x33, 0xed, 0xad, 0xb7, 0xbd, 0xfb, 0x7d, 0x5f, 0x98,\n  0xdf, 0x8d, 0xec, 0x39, 0x07, 0xff, 0x12, 0x56, 0xec, 0xc3, 0xc4, 0xce,\n  0x99, 0x95, 0x43, 0x17, 0x3c, 0x82, 0xdd, 0x1b, 0x31, 0x4b, 0xe4, 0x20,\n  0x39, 0x57, 0x8c, 0x20, 0xe8, 0xe2, 0x55, 0x5f, 0x93, 0x38, 0x99, 0xc4,\n  0xed, 0x28, 0x89, 0xd7, 0x28, 0x27, 0x84, 0x98, 0x4c, 0x56, 0xb2, 0xc1,\n  0xf8, 0x56, 0x2f, 0xd1, 0xa9, 0x54, 0xf6, 0xbc, 0xff, 0x28, 0xf0, 0xbd,\n  0x4e, 0xef, 0xc3, 0x42, 0xad, 0xc9, 0x3c, 0x0e, 0xd0, 0x80, 0x58, 0x86,\n  0x7f, 0x48, 0x37, 0x4a, 0xeb, 0x4b, 0x74, 0xaa, 0xf7, 0x9d, 0x39, 0xc7,\n  0xfd, 0x12, 0x86, 0x2b, 0xd3, 0x4d, 0xce, 0x43, 0xf7, 0x49, 0xed, 0x0d,\n  0x51, 0xc4, 0xdc, 0xa1, 0x00, 0xb2, 0x86, 0xa3, 0x29, 0x0e, 0xda, 0x45,\n  0x32, 0xe8, 0x68, 0x9a, 0x5d, 0x84, 0xf3, 0xe9, 0x32, 0x96, 0xf0, 0xe9,\n  0xad, 0x71, 0x15, 0xcf, 0xc7, 0xa4, 0x4b, 0x95, 0x98, 0x92, 0x51, 0x3a,\n  0x46, 0x35, 0x59, 0x00, 0xb7, 0x46, 0x2e, 0x5b, 0x80, 0x53, 0xf3, 0x3c,\n  0x91, 0x93, 0xf8, 0xc0, 0x93, 0xc8, 0x39, 0x9d, 0x6c, 0xd8, 0x33, 0xf5,\n  0xcc, 0xf6, 0xa5, 0xcc, 0x7f, 0x4c, 0x93, 0x13, 0xf4, 0xc7, 0xd3, 0xad,\n  0xb0, 0xa8, 0xec, 0xdc, 0x55, 0xf7, 0x0a, 0x6e, 0xa3, 0x94, 0x77, 0xfa,\n  0x1a, 0xfd, 0x2c, 0x5e, 0x4f, 0x8a, 0xa1, 0x66, 0xc3, 0x88, 0x18, 0xda,\n  0x84, 0x08, 0x76, 0x10, 0x6e, 0x06, 0x4b, 0x91, 0x4c, 0x76, 0x22, 0xb8,\n  0xd2, 0x2c, 0x66, 0x3a, 0x76, 0xe9, 0x2d, 0x91, 0x48, 0x34, 0x44, 0x8a,\n  0x54, 0x50, 0xc0, 0x66, 0xcd, 0x03, 0x43, 0xcf, 0x4b, 0xb6, 0xad, 0x4b,\n  0x85, 0xd0, 0xdf, 0x22, 0xd7, 0xbd, 0x8f, 0x1c, 0x7a, 0xf7, 0xe8, 0xc4,\n  0x63, 0x27, 0x9b, 0x8f, 0x97, 0x07, 0xa3, 0x7b, 0x6b, 0xdf, 0x7a, 0xb1,\n  0xee, 0xf0, 0xc4, 0xd0, 0xb6, 0xf8, 0x3f, 0xa1, 0xe3, 0xa5, 0x8f, 0x3e,\n  0x35, 0xf3, 0xf8, 0xf1, 0x23, 0x8f, 0x6d, 0x77, 0x5a, 0x87, 0x4c, 0xae,\n  0x07, 0x2f, 0x6c, 0x3d, 0xdb, 0xd7, 0xb8, 0xa7, 0x83, 0x92, 0x72, 0x44,\n  0x5f, 0xa3, 0x87, 0xf0, 0x3a, 0xed, 0x85, 0x76, 0xe9, 0x71, 0xbb, 0x0c,\n  0x05, 0xdb, 0x55, 0x9e, 0xdb, 0x2e, 0x38, 0x64, 0x90, 0xdb, 0x95, 0xb4,\n  0xe5, 0xb0, 0x7f, 0xe4, 0x65, 0xb6, 0xe2, 0x36, 0x8d, 0x5e, 0xb9, 0xf5,\n  0xec, 0x5d, 0x6f, 0x7f, 0xf7, 0xa5, 0xa6, 0x1d, 0xf1, 0xa2, 0xe2, 0x89,\n  0xca, 0xa5, 0xa5, 0x99, 0xdd, 0xd3, 0x43, 0x8f, 0x21, 0x5f, 0xf0, 0xf4,\n  0x1d, 0x97, 0xde, 0x7a, 0xdb, 0x7b, 0xac, 0x96, 0x4d, 0x7a, 0xfb, 0xd1,\n  0x9d, 0xdb, 0x8f, 0x6d, 0xe9, 0x92, 0xc6, 0x54, 0x05, 0xbe, 0x20, 0xd6,\n  0x41, 0x3b, 0x89, 0x69, 0xd0, 0x64, 0xad, 0x3a, 0xb3, 0x9c, 0x70, 0x19,\n  0xcd, 0xdd, 0xec, 0xa4, 0x83, 0x7e, 0x50, 0xac, 0x6c, 0xd6, 0xe5, 0x4a,\n  0xdd, 0xc2, 0x0b, 0x16, 0xed, 0xf9, 0x59, 0x43, 0x7d, 0xaa, 0x61, 0xe6,\n  0xe0, 0xb6, 0xc6, 0x6d, 0xa9, 0x1f, 0xd1, 0x97, 0xc7, 0x32, 0xdd, 0xa0,\n  0x52, 0xff, 0x2a, 0xcf, 0xcb, 0x67, 0xc7, 0xe4, 0x9c, 0xb7, 0xd7, 0xe8,\n  0x76, 0x12, 0xd7, 0x2b, 0xf8, 0xde, 0x78, 0xee, 0xb6, 0x84, 0x6f, 0xb0,\n  0x52, 0x56, 0x4b, 0xb0, 0xe0, 0x7b, 0xa5, 0x59, 0x98, 0x42, 0x9f, 0xfb,\n  0x50, 0x6d, 0x43, 0x4d, 0x6a, 0xea, 0xb3, 0xdb, 0xf6, 0x3f, 0x41, 0x3b,\n  0x37, 0x67, 0xfe, 0x2b, 0xdd, 0xda, 0xd2, 0xf1, 0x00, 0x99, 0x74, 0x8e,\n  0xcd, 0xf8, 0xe9, 0x29, 0xfc, 0xbe, 0x08, 0xd6, 0x85, 0x38, 0xec, 0x2d,\n  0x0a, 0x4f, 0x6e, 0x10, 0xcb, 0xde, 0x85, 0x58, 0xc6, 0x0d, 0x36, 0x10,\n  0xde, 0x23, 0x25, 0x96, 0xdc, 0x6c, 0x81, 0x59, 0x69, 0x6e, 0xda, 0x36,\n  0xa2, 0x60, 0x8b, 0x37, 0x19, 0x08, 0xce, 0x07, 0xde, 0x19, 0x85, 0x55,\n  0x38, 0x1f, 0x00, 0xf3, 0xb3, 0x9c, 0x62, 0x2c, 0x9f, 0x12, 0xa7, 0x88,\n  0xfe, 0xa0, 0xd6, 0xc1, 0xa3, 0xe5, 0x55, 0x89, 0xa9, 0xb6, 0xae, 0xa1,\n  0xbd, 0xbb, 0xf7, 0xec, 0xde, 0x77, 0x72, 0x71, 0xba, 0xf5, 0x60, 0xf9,\n  0xe4, 0xed, 0x17, 0xdf, 0xb6, 0x67, 0xdb, 0xc8, 0xb6, 0xb7, 0xd0, 0xdf,\n  0x8f, 0xf9, 0xd3, 0xee, 0xe2, 0xc6, 0xfa, 0x96, 0x4d, 0xfd, 0x1d, 0xdd,\n  0x5d, 0x5d, 0x4e, 0xdb, 0x96, 0xe8, 0xd1, 0xb9, 0xfe, 0x1d, 0x6a, 0x56,\n  0xb3, 0xb5, 0x6f, 0x78, 0x0f, 0xd8, 0x9e, 0xa5, 0x57, 0x5f, 0x43, 0x9f,\n  0x87, 0x33, 0x0b, 0xf4, 0x56, 0xb9, 0x66, 0xb2, 0x89, 0xfe, 0x3b, 0x3c,\n  0x6e, 0x25, 0x80, 0xa7, 0x0c, 0x31, 0x5d, 0xb3, 0x0b, 0x71, 0x82, 0x13,\n  0x2f, 0xdd, 0x8a, 0x17, 0x42, 0xf0, 0x94, 0x73, 0x3e, 0x64, 0xa5, 0x0f,\n  0x67, 0xa4, 0xcb, 0xa3, 0x94, 0xc0, 0x70, 0x8c, 0x80, 0x2d, 0x02, 0x80,\n  0x94, 0x01, 0x3f, 0x6f, 0x8d, 0x58, 0x70, 0xc9, 0x3a, 0x17, 0xae, 0x0a,\n  0x0a, 0x3b, 0x10, 0x05, 0x95, 0xd9, 0xc0, 0x83, 0x28, 0x7b, 0x86, 0x25,\n  0xa8, 0x44, 0xb5, 0xc2, 0xbb, 0x59, 0x23, 0x4e, 0x6c, 0x02, 0x25, 0xa2,\n  0x5b, 0x14, 0x4f, 0x76, 0xcd, 0x78, 0xf1, 0xb2, 0x73, 0x56, 0x30, 0x6a,\n  0x7c, 0xe5, 0x42, 0xd6, 0x47, 0x13, 0xb0, 0x8c, 0x9a, 0xb1, 0x8e, 0x05,\n  0xa8, 0x5f, 0x4a, 0x60, 0xae, 0x16, 0x1b, 0xe2, 0x98, 0x65, 0x2f, 0xcd,\n  0x4a, 0x62, 0xc8, 0xd2, 0x3e, 0xa7, 0x7c, 0xc5, 0xe6, 0x7e, 0x45, 0x3e,\n  0x15, 0x56, 0x7c, 0x3a, 0x23, 0x23, 0xc3, 0xfa, 0x57, 0x0a, 0x04, 0x8a,\n  0xca, 0x73, 0x45, 0x27, 0x3d, 0x38, 0xb4, 0xfa, 0x32, 0x22, 0x37, 0xb8,\n  0x56, 0x11, 0xdc, 0x3a, 0x52, 0x2e, 0x18, 0x79, 0xc6, 0x62, 0x06, 0x32,\n  0x21, 0x97, 0xc3, 0x6c, 0x94, 0xc5, 0x1c, 0x40, 0x81, 0x42, 0x62, 0xce,\n  0x81, 0xa6, 0x93, 0xe4, 0x8b, 0xbe, 0x2c, 0xcb, 0x77, 0xfa, 0x7d, 0xba,\n  0x8a, 0xc1, 0x26, 0x9d, 0x4b, 0xe4, 0xf5, 0x42, 0x5d, 0x87, 0x09, 0x75,\n  0xe5, 0xf8, 0xbc, 0xdf, 0x7a, 0xe2, 0x5b, 0x73, 0x0c, 0xdb, 0x49, 0xd3,\n  0x2f, 0xfd, 0x21, 0x53, 0x06, 0x2e, 0x25, 0x44, 0x0f, 0xae, 0x8e, 0xe6,\n  0x72, 0x65, 0x68, 0x3e, 0x4b, 0x1f, 0x91, 0xe3, 0x08, 0xa3, 0x39, 0x5c,\n  0x19, 0xf0, 0x79, 0x57, 0x4e, 0x9c, 0xea, 0x79, 0xc2, 0x7f, 0x1b, 0x05,\n  0xb4, 0x08, 0x23, 0x16, 0xbb, 0x81, 0xc7, 0x13, 0x3d, 0x88, 0x04, 0x30,\n  0x8e, 0x28, 0x48, 0x87, 0xc6, 0xfd, 0x95, 0xa6, 0xfe, 0x7e, 0x15, 0x12,\n  0xf0, 0xec, 0x13, 0x98, 0x7d, 0xb8, 0xa7, 0x07, 0x86, 0x44, 0x88, 0x2f,\n  0x1e, 0x64, 0x87, 0x7d, 0x3e, 0x9b, 0xcd, 0x17, 0xf5, 0x45, 0x81, 0x13,\n  0x17, 0x8a, 0x60, 0xa2, 0x56, 0xb5, 0xce, 0x4b, 0x00, 0x06, 0x08, 0x60,\n  0x88, 0x6c, 0x11, 0xa5, 0x60, 0x21, 0x5c, 0x1d, 0xaf, 0xfa, 0x58, 0x45,\n  0x88, 0xab, 0x13, 0xc2, 0xa5, 0x11, 0xaf, 0xce, 0x23, 0x9a, 0x23, 0x2d,\n  0x9d, 0xc7, 0x0a, 0x86, 0xac, 0x6e, 0x8b, 0x26, 0xc4, 0xd4, 0x56, 0xde,\n  0xe1, 0x70, 0x1a, 0x69, 0xba, 0x96, 0x2f, 0x7b, 0x63, 0x7c, 0x75, 0xe4,\n  0x4a, 0x8e, 0x5b, 0x31, 0x29, 0x58, 0xaf, 0xa8, 0x66, 0xea, 0x91, 0xb4,\n  0x23, 0xdb, 0x9f, 0x0a, 0x24, 0x30, 0xe5, 0x88, 0x17, 0x3c, 0x48, 0x25,\n  0x72, 0x59, 0x62, 0x73, 0x38, 0xb6, 0xa7, 0x98, 0x6c, 0xf7, 0xb0, 0x4b,\n  0x28, 0xaa, 0x78, 0x71, 0x89, 0x12, 0x04, 0x66, 0x41, 0x8d, 0x7d, 0xd4,\n  0x13, 0x24, 0x82, 0xb2, 0x00, 0x07, 0x03, 0x07, 0x41, 0x01, 0x92, 0x1b,\n  0xb9, 0x03, 0x5f, 0x0b, 0xb7, 0x91, 0x25, 0x89, 0x50, 0x1c, 0x62, 0x73,\n  0xb7, 0xb1, 0x3e, 0x59, 0x5d, 0x9a, 0x00, 0x17, 0xc4, 0xed, 0xb2, 0x55,\n  0xd9, 0xab, 0xb0, 0x8c, 0x34, 0x3a, 0x57, 0x61, 0x19, 0x6d, 0x34, 0x86,\n  0x75, 0x61, 0xa5, 0xe4, 0xf6, 0xae, 0x1f, 0xc6, 0x7a, 0x7e, 0x85, 0x08,\n  0xff, 0xe3, 0x5a, 0xd1, 0x2c, 0x56, 0xd6, 0x8f, 0xef, 0x50, 0x2a, 0x6c,\n  0xae, 0x04, 0xa9, 0x32, 0x6a, 0x26, 0x3d, 0xc9, 0x41, 0xce, 0x10, 0x9e,\n  0x6b, 0x6e, 0x8b, 0x9e, 0xa1, 0x51, 0x1c, 0xa9, 0x00, 0xb7, 0x11, 0x5f,\n  0x7a, 0x1e, 0xaf, 0xd5, 0xac, 0x44, 0xc5, 0x84, 0xbd, 0x51, 0x81, 0x3e,\n  0xaf, 0x41, 0x72, 0x88, 0x07, 0xcb, 0xe6, 0xc0, 0x90, 0x5a, 0xc4, 0x4e,\n  0xce, 0x41, 0x7e, 0x38, 0x14, 0xf2, 0x78, 0x42, 0x65, 0xa1, 0x32, 0x4f,\n  0xd0, 0x13, 0x34, 0x99, 0x70, 0x57, 0x4c, 0x56, 0x8b, 0x56, 0x57, 0x54,\n  0x8a, 0xf0, 0xfa, 0x92, 0x84, 0x54, 0xb3, 0x10, 0x20, 0xf4, 0x80, 0x6a,\n  0x84, 0x80, 0xe2, 0x1a, 0xc0, 0x5c, 0x57, 0xeb, 0xcc, 0x53, 0x56, 0xb7,\n  0x71, 0xda, 0x5e, 0xeb, 0xae, 0x89, 0x55, 0xbb, 0x6a, 0xdd, 0xee, 0x5a,\n  0x57, 0xb5, 0xab, 0xc9, 0xb1, 0xdd, 0xd1, 0xe4, 0x1a, 0x28, 0xa8, 0x3b,\n  0x47, 0x5c, 0x25, 0xc5, 0x6a, 0x5f, 0xd2, 0x36, 0x6f, 0x4a, 0x38, 0x1c,\n  0x09, 0x93, 0xd6, 0xd7, 0x11, 0x0c, 0x76, 0xf8, 0xde, 0xf8, 0x6d, 0xa1,\n  0xd8, 0x27, 0x0b, 0x3a, 0x44, 0xfb, 0x98, 0x32, 0xd2, 0xe7, 0x3a, 0xaa,\n  0x83, 0x7a, 0x26, 0xed, 0xcd, 0xef, 0x73, 0x2d, 0x52, 0x71, 0x49, 0x24,\n  0xaa, 0x02, 0x48, 0xa3, 0xe6, 0x65, 0x55, 0x6a, 0x94, 0x44, 0x80, 0x9d,\n  0x5a, 0xbc, 0xae, 0x9c, 0x61, 0x60, 0x2d, 0xa7, 0xb9, 0xd3, 0x94, 0x48,\n  0xa9, 0x35, 0xa2, 0x1a, 0x0a, 0xa9, 0x0f, 0x49, 0x2a, 0xa1, 0xc5, 0xeb,\n  0x09, 0x56, 0x11, 0x8d, 0x86, 0x5f, 0x00, 0x13, 0xfc, 0x20, 0x4f, 0xb8,\n  0x6e, 0xdf, 0xd4, 0xbd, 0xf8, 0x2e, 0x78, 0x80, 0xc2, 0x06, 0x3f, 0x93,\n  0x76, 0x7b, 0x3d, 0xed, 0xad, 0x8d, 0xf5, 0xd5, 0x95, 0x65, 0x25, 0x58,\n  0xc1, 0xfc, 0x9e, 0x3a, 0x6f, 0x1d, 0x11, 0xab, 0x0e, 0x08, 0x41, 0xd6,\n  0x16, 0xeb, 0x46, 0xd5, 0xec, 0x8e, 0xb5, 0x84, 0xfd, 0xf6, 0xf5, 0xd5,\n  0xed, 0xab, 0x05, 0xa5, 0xde, 0x77, 0xcd, 0x10, 0x2a, 0x55, 0x40, 0xef,\n  0x0e, 0xa4, 0x97, 0x80, 0xcb, 0x51, 0xc4, 0xb3, 0xd9, 0x61, 0xd6, 0x30,\n  0x4c, 0x56, 0xef, 0x68, 0x2c, 0x38, 0xa0, 0xa3, 0x01, 0x2e, 0x28, 0x74,\n  0x5e, 0x83, 0x0d, 0x03, 0x81, 0x39, 0xaf, 0xcb, 0xd3, 0x3c, 0x6d, 0x8e,\n  0xe6, 0xa9, 0xd5, 0x14, 0xa5, 0x68, 0x1f, 0xa0, 0xdc, 0xf8, 0xbc, 0x6a,\n  0xb7, 0xda, 0x6d, 0xb5, 0x18, 0xf4, 0x70, 0xf4, 0x6c, 0xd5, 0xeb, 0x1c,\n  0xa5, 0x16, 0x05, 0x43, 0xd8, 0x26, 0x28, 0x92, 0xb2, 0xc9, 0xa2, 0x43,\n  0x2b, 0x15, 0xf1, 0xbd, 0xde, 0xa4, 0x7d, 0xca, 0xe8, 0xb1, 0xc4, 0xb0,\n  0x44, 0x76, 0x60, 0x89, 0xd4, 0x60, 0x01, 0xb9, 0x52, 0x2e, 0x54, 0x58,\n  0x0d, 0x17, 0x6d, 0x49, 0x9f, 0xba, 0xb8, 0xd4, 0xa5, 0x99, 0xd7, 0x48,\n  0xb2, 0xd0, 0x48, 0x92, 0x79, 0xe3, 0x4a, 0x01, 0x45, 0x64, 0x29, 0x33,\n  0x59, 0xcb, 0x96, 0xf5, 0xf0, 0xeb, 0x69, 0x6f, 0xbe, 0x0c, 0x0a, 0xe9,\n  0x61, 0x33, 0x11, 0x09, 0x64, 0xed, 0x41, 0x02, 0xf8, 0x19, 0x1d, 0x0b,\n  0x39, 0x3e, 0x4c, 0x8e, 0x36, 0x11, 0xf2, 0x21, 0xd0, 0x26, 0x7d, 0x01,\n  0x4d, 0x6c, 0x7f, 0xb3, 0x77, 0xaf, 0xd2, 0xc5, 0xa8, 0x97, 0xc8, 0x78,\n  0xa5, 0x3e, 0xe6, 0x49, 0xd9, 0xb0, 0xbe, 0x94, 0x1d, 0x1b, 0xd3, 0xcb,\n  0x93, 0x85, 0x65, 0x7f, 0x74, 0x7d, 0xa5, 0xfc, 0xcc, 0x1a, 0x63, 0xd0,\n  0xba, 0xc1, 0xb5, 0x90, 0xd5, 0x52, 0x16, 0xbc, 0xb7, 0x96, 0xe1, 0x11,\n  0xf9, 0xa7, 0xb4, 0xcd, 0x8c, 0xc7, 0xc3, 0xa4, 0xc2, 0x7e, 0x78, 0xc0,\n  0xeb, 0xc0, 0x03, 0x52, 0x83, 0xd4, 0x22, 0x24, 0x4b, 0x02, 0x13, 0x59,\n  0x1d, 0x9e, 0xad, 0x34, 0xe0, 0x2b, 0x60, 0x5b, 0x01, 0x0b, 0xf3, 0x3a,\n  0x16, 0x31, 0x22, 0xcd, 0x88, 0xa7, 0x35, 0xe0, 0xb0, 0x72, 0x14, 0xbd,\n  0x5f, 0x8f, 0xd4, 0x14, 0x2f, 0xa8, 0x79, 0xc8, 0x7e, 0x38, 0x30, 0xa4,\n  0x03, 0x8c, 0x75, 0xc2, 0x7c, 0x5d, 0x9f, 0x7f, 0x23, 0x73, 0x7a, 0x83,\n  0x77, 0xce, 0xa4, 0x13, 0xe5, 0xe5, 0x91, 0x88, 0xd5, 0x8a, 0xa8, 0xf2,\n  0xba, 0xf2, 0xba, 0x48, 0x59, 0xa4, 0xac, 0xb4, 0x24, 0x11, 0x8f, 0x45,\n  0xad, 0x61, 0x2b, 0x1e, 0x05, 0x97, 0xd3, 0xa8, 0x17, 0x05, 0xca, 0x82,\n  0x2c, 0x06, 0x5d, 0xf6, 0xb8, 0x65, 0x79, 0xeb, 0xc1, 0xa3, 0x20, 0xe4,\n  0x8c, 0x01, 0x59, 0x24, 0x56, 0xa9, 0x3b, 0xfa, 0x52, 0x45, 0x4d, 0xd8,\n  0xcd, 0x24, 0x38, 0x5f, 0x91, 0xc7, 0xe6, 0xd0, 0x6a, 0xbb, 0xb0, 0xd8,\n  0x73, 0xd6, 0x04, 0x64, 0x2f, 0xa4, 0xf6, 0xac, 0x36, 0x18, 0xf2, 0xf9,\n  0xf8, 0x58, 0x3b, 0x67, 0x30, 0x9b, 0x74, 0x4c, 0x82, 0x79, 0x0b, 0x96,\n  0xba, 0x76, 0x79, 0x4d, 0x78, 0xe3, 0x58, 0xa1, 0x65, 0x58, 0x5e, 0x87,\n  0x21, 0x3b, 0x0c, 0xe4, 0x9d, 0xa6, 0x06, 0x90, 0x37, 0xed, 0x5b, 0x21,\n  0xef, 0x36, 0xa4, 0xe6, 0x5b, 0x91, 0x4a, 0x5d, 0x8a, 0xb4, 0x1a, 0x5e,\n  0x96, 0x7b, 0x2b, 0x05, 0xb0, 0xa1, 0xe8, 0x38, 0x96, 0x1a, 0xcf, 0x31,\n  0xfc, 0x69, 0x9d, 0x22, 0x35, 0xac, 0x7a, 0x1a, 0xad, 0x4a, 0xb3, 0x04,\n  0x9a, 0x7b, 0x88, 0xa4, 0x98, 0x2c, 0x18, 0xb0, 0xde, 0x63, 0x25, 0xd6,\n  0x6a, 0x85, 0x05, 0x28, 0xec, 0x95, 0x98, 0xcb, 0x61, 0x16, 0xb5, 0xc1,\n  0x43, 0x38, 0x3c, 0x03, 0xfe, 0xc2, 0xa7, 0xa4, 0x3b, 0xff, 0x82, 0x07,\n  0x00, 0x8b, 0x39, 0x7e, 0x8a, 0xb8, 0x40, 0x29, 0x8c, 0xd5, 0x89, 0x28,\n  0x19, 0xce, 0xbe, 0xde, 0xae, 0x8e, 0xe6, 0xc6, 0xba, 0xda, 0xaa, 0x8a,\n  0x92, 0x44, 0x24, 0x1d, 0x4d, 0xaf, 0x1c, 0x50, 0xe3, 0x46, 0x07, 0x74,\n  0x83, 0x33, 0x0b, 0x7d, 0x60, 0xdd, 0x61, 0xae, 0x5d, 0x77, 0x86, 0x31,\n  0x4b, 0xeb, 0x0f, 0xf7, 0x57, 0x37, 0xbe, 0xfe, 0xb3, 0x50, 0x2f, 0x17,\n  0xa1, 0xca, 0xa9, 0x7a, 0xea, 0x78, 0xfa, 0x68, 0xd0, 0xe7, 0x62, 0x78,\n  0x31, 0x89, 0x74, 0x1a, 0x7a, 0xd0, 0x80, 0x44, 0x30, 0xbc, 0xf8, 0x33,\n  0x10, 0x46, 0x41, 0x33, 0x14, 0x40, 0x5e, 0x89, 0x2c, 0xb5, 0x5f, 0xcf,\n  0x01, 0x0a, 0x0c, 0xaf, 0x61, 0xf8, 0x25, 0x13, 0xd2, 0x51, 0x2a, 0xb5,\n  0x4e, 0xb5, 0x0f, 0x2f, 0x4f, 0x07, 0x86, 0x8c, 0x5a, 0x5a, 0xad, 0x3e,\n  0xa8, 0x1e, 0xae, 0xa8, 0x88, 0x46, 0xed, 0x76, 0x8a, 0xaa, 0xa8, 0xaf,\n  0xa8, 0x8f, 0x96, 0x47, 0xcb, 0xa5, 0x29, 0x62, 0x8f, 0xd8, 0x23, 0x81,\n  0x62, 0x8f, 0x1b, 0x2a, 0xef, 0x82, 0x41, 0x33, 0xfe, 0x0f, 0x76, 0x4e,\n  0x29, 0x0d, 0x03, 0xc4, 0x13, 0x92, 0x32, 0x33, 0x48, 0xa2, 0x89, 0x24,\n  0xd3, 0x75, 0xe6, 0xc8, 0x4f, 0xd9, 0xca, 0x84, 0xa3, 0xa2, 0xc4, 0x62,\n  0xb1, 0x09, 0xe5, 0x5c, 0x65, 0xdc, 0x55, 0x51, 0x6a, 0xb2, 0x5a, 0xf9,\n  0x6e, 0x47, 0xb3, 0xab, 0x2a, 0x99, 0x72, 0xd5, 0xb9, 0xaa, 0x5c, 0xcd,\n  0x0e, 0xa4, 0x2f, 0x38, 0x53, 0x9c, 0x15, 0x6d, 0x0e, 0x6c, 0x9d, 0x55,\n  0xb6, 0xc2, 0xdf, 0x77, 0x07, 0xd3, 0x3e, 0x4d, 0xa0, 0xd2, 0x11, 0x37,\n  0x69, 0x7c, 0xe9, 0xe0, 0x1b, 0x27, 0x0a, 0xee, 0x11, 0x92, 0xbd, 0x7b,\n  0x82, 0xc8, 0xa9, 0x83, 0x1a, 0xa4, 0xbe, 0x9d, 0xb6, 0x4a, 0x72, 0x6a,\n  0x47, 0x3a, 0x55, 0x1b, 0xd2, 0xea, 0xca, 0x90, 0x41, 0xcf, 0xca, 0x7b,\n  0x43, 0xfb, 0x0a, 0x69, 0x19, 0x25, 0x69, 0xa9, 0xb0, 0xb4, 0x28, 0x2d,\n  0xa5, 0x37, 0x68, 0xf5, 0x58, 0x6a, 0xa2, 0x88, 0xb5, 0x52, 0xa7, 0x53,\n  0x2d, 0x98, 0x91, 0x4a, 0x85, 0xb5, 0xd2, 0x60, 0x50, 0x2f, 0x68, 0x10,\n  0x11, 0x9e, 0x27, 0xdd, 0xf5, 0x97, 0x3c, 0x01, 0xdf, 0x0b, 0x8f, 0xd1,\n  0x2c, 0xe0, 0x91, 0x38, 0xa6, 0xc1, 0xeb, 0x54, 0x49, 0x8c, 0x8c, 0x41,\n  0xff, 0xe6, 0xee, 0xce, 0x96, 0xa6, 0xfa, 0x54, 0x75, 0x65, 0x69, 0x49,\n  0xb4, 0x23, 0xd6, 0xb1, 0x6a, 0x14, 0x2c, 0x1b, 0x1e, 0x85, 0x8d, 0x2a,\n  0xf6, 0x3f, 0x6e, 0x60, 0x6c, 0xea, 0xd6, 0x57, 0xef, 0x13, 0x6b, 0x8f,\n  0xd1, 0xbf, 0x5c, 0x43, 0xb5, 0x15, 0xff, 0x8c, 0x70, 0xa9, 0x81, 0x7f,\n  0x16, 0x93, 0xfc, 0x33, 0x24, 0xa0, 0x7e, 0xea, 0xa8, 0x14, 0xbf, 0x46,\n  0xb9, 0x39, 0x62, 0xe0, 0xb3, 0x65, 0x64, 0x9f, 0x2d, 0x8a, 0xfa, 0xfb,\n  0x25, 0xcf, 0x8d, 0x50, 0xf4, 0x64, 0x6d, 0xa4, 0xdf, 0xe2, 0x05, 0x05,\n  0xb2, 0x90, 0x12, 0xd4, 0xde, 0xf4, 0x2e, 0x1e, 0x7c, 0xe6, 0x08, 0xde,\n  0x85, 0xe8, 0x41, 0x0d, 0x31, 0x88, 0xb4, 0x78, 0x80, 0x28, 0xe6, 0xbc,\n  0x6c, 0x9f, 0x53, 0xb4, 0xc8, 0xd2, 0x07, 0x0a, 0x6f, 0x1f, 0xc5, 0xc5,\n  0x4e, 0x27, 0xec, 0xdc, 0xc5, 0x89, 0xe2, 0x84, 0xd3, 0xef, 0x94, 0x69,\n  0x70, 0xd5, 0x0e, 0xb5, 0x43, 0x0e, 0x33, 0x28, 0x3b, 0x37, 0xb2, 0x65,\n  0xa5, 0x7e, 0x8d, 0x4c, 0xc4, 0x8f, 0x63, 0xa3, 0xb1, 0xda, 0xe2, 0x35,\n  0x9c, 0xe4, 0xfa, 0x7b, 0x7a, 0x7b, 0xd9, 0x14, 0x57, 0x51, 0x1a, 0xad,\n  0xe5, 0x6e, 0x2f, 0x68, 0x1b, 0xfd, 0x56, 0xed, 0x4d, 0x59, 0x35, 0xae,\n  0x32, 0xff, 0xc1, 0x96, 0xde, 0x9e, 0xd6, 0x84, 0xd3, 0x1d, 0x7b, 0xe3,\n  0x96, 0xb5, 0xf7, 0x05, 0xac, 0xf3, 0x83, 0xa4, 0xdf, 0x49, 0xaa, 0x0d,\n  0xe9, 0xd2, 0x16, 0xd2, 0xef, 0x6a, 0xbc, 0x1b, 0x54, 0xe1, 0xdd, 0xa0,\n  0x08, 0xef, 0x06, 0x8a, 0xca, 0xb7, 0xe8, 0x88, 0x18, 0xa0, 0x2a, 0x81,\n  0xa1, 0xd8, 0x33, 0x20, 0x02, 0x1e, 0x8b, 0x40, 0x5e, 0x84, 0xf7, 0xc1,\n  0x7a, 0xc1, 0xac, 0x5a, 0xc6, 0x17, 0x97, 0x37, 0x03, 0x40, 0xe0, 0x4f,\n  0xbf, 0xe9, 0x67, 0x28, 0x2b, 0xf9, 0xa2, 0xb4, 0x92, 0x63, 0x0b, 0x5f,\n  0x7a, 0x84, 0x7e, 0xc5, 0x68, 0xe4, 0x3e, 0x66, 0x9d, 0xfb, 0xf1, 0x4e,\n  0x10, 0x77, 0x91, 0xc1, 0x69, 0x69, 0xaa, 0xab, 0xad, 0x28, 0x4b, 0xc4,\n  0x42, 0x01, 0x9f, 0xd7, 0x99, 0x74, 0x25, 0x57, 0x0c, 0x8f, 0x71, 0x9d,\n  0xe1, 0xd9, 0xa8, 0xb5, 0x7f, 0x77, 0xc1, 0x41, 0x9b, 0x5c, 0x7f, 0x52,\n  0x0c, 0xae, 0x1a, 0xbd, 0x67, 0x37, 0xea, 0x5b, 0xe6, 0xe9, 0xaf, 0xc8,\n  0xfc, 0x3f, 0xa0, 0xbf, 0xca, 0xae, 0x98, 0xe2, 0xae, 0xa1, 0xbf, 0x3e,\n  0x83, 0xc7, 0x52, 0xe5, 0x4a, 0xd9, 0x91, 0x8e, 0xeb, 0xeb, 0xed, 0xed,\n  0xe1, 0x64, 0x59, 0x9c, 0x2d, 0xac, 0xc0, 0xfe, 0x32, 0x97, 0xc6, 0x9a,\n  0xf2, 0xaa, 0x65, 0x11, 0xb8, 0xe2, 0x85, 0x15, 0xb8, 0xa0, 0xfe, 0x92,\n  0x7e, 0xff, 0xff, 0xfa, 0x0b, 0xfa, 0x6b, 0x59, 0x63, 0x78, 0x36, 0xa8,\n  0xbf, 0x7f, 0x28, 0x3c, 0x66, 0x5b, 0xaf, 0xa1, 0xbf, 0xab, 0x06, 0x6f,\n  0xa3, 0xfa, 0xcb, 0x5a, 0x28, 0x2b, 0x05, 0x38, 0x12, 0xb5, 0xd4, 0xa7,\n  0xd2, 0x7a, 0x0b, 0xb6, 0x4f, 0x55, 0xd8, 0x8f, 0xaf, 0x42, 0x1a, 0x92,\n  0x25, 0x0d, 0x25, 0x7d, 0xf5, 0x3a, 0x1e, 0xa0, 0x9a, 0xb1, 0x6f, 0x8f,\n  0xad, 0x15, 0x6c, 0xd9, 0x5f, 0xa7, 0x05, 0x53, 0x90, 0xa5, 0x48, 0xa9,\n  0x30, 0xa3, 0xe2, 0x98, 0xfd, 0x06, 0xa4, 0xa1, 0x04, 0x51, 0x23, 0xec,\n  0xc3, 0x9e, 0xd5, 0x81, 0x21, 0x3d, 0x70, 0x4c, 0x1d, 0x04, 0xa9, 0x37,\n  0xac, 0xb8, 0x93, 0x3b, 0xbd, 0xc1, 0x5b, 0x67, 0xd2, 0xa5, 0xa5, 0xa5,\n  0xa1, 0x90, 0xcd, 0x86, 0xa8, 0xd2, 0xda, 0xd2, 0xda, 0x50, 0x49, 0x88,\n  0x38, 0x02, 0x91, 0xb0, 0x2d, 0x68, 0x0b, 0x02, 0xcb, 0xa0, 0xcb, 0x41,\n  0x6c, 0x47, 0x2b, 0xb2, 0x16, 0xb4, 0x1d, 0xe1, 0x1c, 0xea, 0x5a, 0x8b,\n  0x7b, 0xa2, 0xbc, 0x3a, 0xec, 0xc2, 0x36, 0xa2, 0xb7, 0xc8, 0x63, 0xd5,\n  0x58, 0x78, 0xed, 0xbf, 0x5c, 0x7b, 0x8e, 0xb0, 0x96, 0x60, 0xc8, 0xeb,\n  0xe3, 0xad, 0xe5, 0x9c, 0xc1, 0x64, 0xd2, 0xd1, 0x28, 0xc6, 0xbe, 0x6d,\n  0x63, 0x73, 0xe5, 0x08, 0x91, 0x71, 0x1b, 0xd5, 0x87, 0xf6, 0xa5, 0xed,\n  0x8a, 0x8c, 0x5b, 0x90, 0x46, 0x68, 0x46, 0x6a, 0x4d, 0x02, 0xe9, 0xb4,\n  0x9c, 0x2c, 0x6b, 0x6c, 0xb7, 0xb3, 0x58, 0x50, 0xc7, 0xf5, 0xb9, 0x72,\n  0x12, 0xa0, 0x20, 0x42, 0x4d, 0x69, 0x75, 0x6a, 0xed, 0x3e, 0x03, 0x9c,\n  0x58, 0x1e, 0x92, 0x5c, 0x56, 0x23, 0x9e, 0x25, 0x27, 0xc0, 0x52, 0x11,\n  0x17, 0x55, 0x48, 0x12, 0x79, 0xd6, 0x4e, 0x62, 0x01, 0x44, 0xe9, 0xcc,\n  0x5f, 0xfe, 0x18, 0x98, 0x77, 0x5d, 0x7f, 0xc9, 0x63, 0xf0, 0x03, 0x88,\n  0xf1, 0xb4, 0x88, 0x07, 0xf4, 0x18, 0xc0, 0xee, 0x6f, 0x32, 0xac, 0x54,\n  0x82, 0x35, 0x1f, 0xb7, 0xce, 0x73, 0x66, 0xf0, 0x1c, 0x2c, 0x0d, 0x13,\n  0x8d, 0x00, 0x0e, 0x8a, 0xc6, 0xfa, 0xda, 0x9a, 0x8a, 0xb2, 0x78, 0x2c,\n  0xd4, 0x16, 0x6e, 0x5b, 0xad, 0x13, 0xa6, 0x8d, 0xe9, 0xc4, 0x46, 0x77,\n  0x14, 0x76, 0x5d, 0x4d, 0x99, 0x59, 0x7f, 0x66, 0x1e, 0x59, 0x53, 0x65,\n  0x9e, 0xbd, 0xb6, 0x23, 0xa1, 0xcc, 0x51, 0x3b, 0x36, 0x29, 0x43, 0x54,\n  0x29, 0x95, 0xa2, 0xae, 0x4b, 0x1f, 0xae, 0x46, 0x7a, 0x2d, 0x1a, 0x34,\n  0xe2, 0x6d, 0x83, 0x60, 0x16, 0x9e, 0x31, 0xc0, 0xa2, 0x06, 0x66, 0xed,\n  0x7e, 0x62, 0xd6, 0x0a, 0x00, 0x58, 0x8a, 0xbd, 0x0b, 0xad, 0xc8, 0xef,\n  0x37, 0x23, 0x3d, 0xa5, 0xd6, 0xe8, 0xd5, 0xfb, 0xf0, 0x62, 0x76, 0x60,\n  0x08, 0xbf, 0x5f, 0xa3, 0x39, 0xa8, 0x19, 0x2e, 0x2b, 0x0b, 0x87, 0xc1,\n  0x7e, 0x2d, 0x4b, 0x95, 0xa5, 0xc2, 0xa5, 0x61, 0xc9, 0xc9, 0x8e, 0xd8,\n  0x43, 0xf6, 0x50, 0x00, 0x4a, 0x38, 0x9d, 0x1b, 0xb0, 0x5f, 0xaf, 0x35,\n  0xb9, 0x0a, 0xfb, 0x10, 0xfe, 0x3c, 0xc1, 0x5d, 0x28, 0x38, 0xc5, 0xec,\n  0x15, 0x2d, 0xc4, 0x3c, 0x6d, 0x86, 0xbf, 0xef, 0x6f, 0xee, 0xe9, 0x6e,\n  0x8d, 0x3b, 0x9c, 0xb1, 0x37, 0x4e, 0xad, 0x6b, 0x4b, 0x1d, 0x23, 0xf2,\n  0x69, 0xa7, 0xfa, 0x51, 0x20, 0xad, 0x6f, 0x45, 0x7a, 0x75, 0x0b, 0xd2,\n  0xe9, 0x4b, 0x90, 0xd1, 0xa0, 0x54, 0x7a, 0x74, 0x98, 0x0a, 0x0b, 0x49,\n  0x8d, 0x85, 0x44, 0xe9, 0x28, 0x83, 0x51, 0x67, 0xd8, 0x67, 0x86, 0x8d,\n  0x18, 0x2b, 0xb3, 0x5e, 0xaf, 0x5e, 0xb0, 0x60, 0x87, 0x01, 0x2b, 0xa1,\n  0xd1, 0xa8, 0x59, 0xd4, 0x22, 0x22, 0x34, 0x3c, 0x27, 0xa2, 0xf8, 0x41,\n  0x9b, 0xfe, 0xb2, 0x07, 0xe1, 0x47, 0xc0, 0xd3, 0xb4, 0x8b, 0x78, 0x20,\n  0x8e, 0x69, 0xf1, 0xac, 0xd8, 0x6c, 0xce, 0x8e, 0xdf, 0x06, 0x9e, 0xb8,\n  0xce, 0xa3, 0xf0, 0xbc, 0x28, 0x8b, 0x90, 0xe1, 0xdc, 0xdc, 0xd3, 0x99,\n  0x6e, 0x22, 0x3c, 0x21, 0x89, 0x78, 0xb8, 0x3d, 0xd2, 0x5e, 0x60, 0x40,\n  0xad, 0x1b, 0x1c, 0xd0, 0x8d, 0xce, 0x8c, 0x4f, 0x6d, 0x60, 0x98, 0xaf,\n  0xb1, 0x73, 0x1d, 0x2b, 0x38, 0xde, 0x9f, 0xdd, 0x50, 0x9d, 0x0a, 0xf1,\n  0x45, 0xde, 0xa5, 0xf8, 0x22, 0x68, 0x88, 0xba, 0x8d, 0xfa, 0x7b, 0x24,\n  0xc7, 0x8c, 0x20, 0x67, 0x7b, 0x95, 0x2f, 0xf2, 0x8b, 0xac, 0x2f, 0x32,\n  0x34, 0x2b, 0xf9, 0x22, 0x35, 0x94, 0xcc, 0x11, 0x8d, 0xbf, 0x7f, 0x95,\n  0xbe, 0x2c, 0x71, 0x44, 0x93, 0x6f, 0x26, 0xe5, 0x5c, 0xbc, 0x51, 0xbc,\n  0x76, 0x05, 0x65, 0xce, 0x67, 0xf8, 0x7c, 0x2a, 0xa7, 0x8e, 0x05, 0xe2,\n  0x4e, 0x04, 0x89, 0x37, 0x1b, 0xa5, 0x81, 0xf0, 0x3a, 0xd0, 0x14, 0xb3,\n  0xb9, 0x01, 0x16, 0x00, 0x00, 0x58, 0x82, 0xd0, 0x1a, 0x54, 0xb2, 0x1c,\n  0x20, 0x98, 0xdf, 0x90, 0x4b, 0x74, 0x90, 0x91, 0xaa, 0x04, 0xcd, 0xe1,\n  0xa8, 0x55, 0xa5, 0xf3, 0xaf, 0x11, 0x6f, 0xca, 0x2d, 0x67, 0x79, 0x60,\n  0x65, 0xc0, 0x64, 0x2a, 0xaf, 0xa2, 0x65, 0x75, 0x88, 0x49, 0x2e, 0x6c,\n  0x91, 0xeb, 0x5a, 0x48, 0x5c, 0xa9, 0x0c, 0xdb, 0x6c, 0xf3, 0xe9, 0xed,\n  0xd9, 0x16, 0x07, 0x10, 0xc7, 0x06, 0x81, 0x4b, 0x61, 0x70, 0x55, 0x68,\n  0x48, 0x2a, 0xee, 0x5a, 0x02, 0x08, 0x07, 0x66, 0x41, 0x25, 0xc5, 0x86,\n  0xe4, 0x6a, 0xfc, 0x63, 0xfc, 0x70, 0x45, 0xb9, 0xdd, 0x56, 0x5d, 0x55,\n  0x9e, 0xac, 0x48, 0x46, 0xc3, 0x7e, 0x9f, 0xc7, 0x6d, 0x2b, 0xb3, 0x97,\n  0x5d, 0x23, 0x2a, 0xb4, 0x6e, 0x89, 0xcb, 0xbb, 0x56, 0x76, 0xee, 0xf8,\n  0x7a, 0x55, 0x2e, 0x2b, 0x63, 0x41, 0xbf, 0x5c, 0xa3, 0xd8, 0x25, 0xcb,\n  0xff, 0x7d, 0x9f, 0xc2, 0xff, 0x8d, 0xc6, 0xa8, 0xb1, 0x35, 0xb8, 0xbd,\n  0xff, 0x55, 0xe1, 0xf6, 0x46, 0x63, 0xc4, 0x49, 0x25, 0x74, 0x4f, 0x74,\n  0x95, 0x7c, 0x8e, 0x1f, 0xa5, 0xb6, 0xa6, 0xc7, 0xf3, 0x23, 0x29, 0x4c,\n  0x81, 0xc8, 0x11, 0x4f, 0x9f, 0xc7, 0x92, 0x53, 0xa9, 0x45, 0x15, 0x04,\n  0xd5, 0x48, 0x74, 0xf5, 0x00, 0xa9, 0x23, 0x83, 0xf4, 0xe6, 0x83, 0xdc,\n  0x30, 0x36, 0x63, 0x24, 0xda, 0x49, 0x08, 0x71, 0x68, 0x60, 0xdc, 0xd7,\n  0x89, 0x1c, 0xe5, 0x8e, 0xfe, 0x83, 0x6b, 0xc5, 0x31, 0x2a, 0xf3, 0xb4,\n  0x60, 0xad, 0x60, 0x91, 0xac, 0x0b, 0x2c, 0xe9, 0x6b, 0x42, 0x3e, 0x97,\n  0xaf, 0xa1, 0x1a, 0x61, 0x4f, 0xc9, 0xef, 0x55, 0x0c, 0x09, 0x7c, 0x1c,\n  0x89, 0x02, 0x37, 0x58, 0x38, 0xb0, 0xa3, 0xb8, 0x2f, 0xb0, 0xf7, 0x6b,\n  0x11, 0x9c, 0xa6, 0x6b, 0xa4, 0xd3, 0x74, 0x41, 0x50, 0x0e, 0xff, 0x6a,\n  0x93, 0x5e, 0x4f, 0x7d, 0x5d, 0xb2, 0xb1, 0xb6, 0xb1, 0xac, 0x24, 0x12,\n  0x0a, 0x14, 0x7b, 0x6a, 0xbc, 0x35, 0x1b, 0x8c, 0xe9, 0xac, 0xab, 0x24,\n  0xef, 0x5c, 0x4b, 0x06, 0xef, 0x5a, 0x4f, 0x59, 0x0a, 0x47, 0x72, 0x36,\n  0xaf, 0x59, 0x1f, 0xc5, 0x50, 0x51, 0xa2, 0x33, 0xca, 0xb8, 0x2f, 0xa5,\n  0x77, 0xe7, 0x47, 0x2e, 0x98, 0x9c, 0xc8, 0x8d, 0xec, 0xe8, 0xb1, 0x34,\n  0xc3, 0x33, 0xeb, 0x8f, 0x3c, 0x78, 0x10, 0x51, 0xc2, 0xb2, 0x40, 0x22,\n  0x37, 0x9e, 0xbc, 0xa0, 0x82, 0xee, 0x1a, 0xa1, 0x9b, 0x1c, 0x4d, 0xb8,\n  0x7b, 0x8d, 0xa8, 0x4d, 0x69, 0x9e, 0x1e, 0xac, 0x1d, 0xad, 0x51, 0xca,\n  0xdd, 0xf0, 0xe0, 0xfa, 0xc9, 0xba, 0xb0, 0xac, 0x0b, 0xa7, 0xd3, 0xb7,\n  0xe6, 0xf7, 0x34, 0x57, 0x17, 0x70, 0x8f, 0x35, 0x4a, 0x68, 0x45, 0x9b,\n  0x0d, 0xad, 0x48, 0xda, 0x20, 0x85, 0x56, 0xf4, 0x44, 0x1b, 0x74, 0x85,\n  0xb4, 0x01, 0x3a, 0xbf, 0x52, 0x23, 0xde, 0x64, 0x54, 0x65, 0x3d, 0xcd,\n  0x38, 0x57, 0x58, 0x26, 0x7b, 0xd7, 0x53, 0x8b, 0xb5, 0x62, 0x29, 0x2d,\n  0x6b, 0x29, 0x86, 0xb4, 0x1e, 0x58, 0xe5, 0x18, 0x4a, 0x15, 0xf5, 0xb9,\n  0xb4, 0x69, 0xc5, 0x89, 0x3e, 0xa3, 0x9c, 0xe2, 0xeb, 0x56, 0x45, 0x4f,\n  0x00, 0x89, 0x51, 0x72, 0x80, 0xe4, 0x63, 0x74, 0xb5, 0x46, 0xa5, 0x5e,\n  0x22, 0xe4, 0xca, 0x24, 0xcc, 0x07, 0x91, 0x2c, 0x50, 0x19, 0x12, 0xc8,\n  0x6a, 0xd3, 0xad, 0x0e, 0xa2, 0xbc, 0x89, 0x07, 0xcc, 0xa4, 0x43, 0x70,\n  0xf0, 0x5e, 0x55, 0x59, 0x21, 0x9f, 0x10, 0x47, 0x23, 0x2b, 0x0f, 0xdd,\n  0xf5, 0x1b, 0x3d, 0x74, 0xcf, 0x5b, 0x83, 0x3e, 0xbe, 0xee, 0xc9, 0xfa,\n  0x6b, 0xb9, 0x0a, 0x78, 0xed, 0xb8, 0x49, 0x8e, 0x1e, 0xc2, 0x9a, 0xa4,\n  0x92, 0x63, 0x25, 0x2d, 0x54, 0x17, 0xf5, 0xad, 0xb4, 0x6b, 0x85, 0x64,\n  0xab, 0xb1, 0x12, 0xd6, 0xc8, 0xb9, 0x0f, 0x85, 0xe2, 0x24, 0xcb, 0x82,\n  0x91, 0x3c, 0xca, 0x25, 0x1d, 0x09, 0x50, 0x18, 0x10, 0xf8, 0xf5, 0x7a,\n  0xc9, 0xaf, 0x17, 0x45, 0xd5, 0x82, 0xe2, 0x97, 0xac, 0x0a, 0x91, 0xbc,\n  0xb9, 0x07, 0x60, 0x77, 0xa4, 0xad, 0x55, 0x0a, 0x6f, 0x74, 0xa4, 0x5b,\n  0xbb, 0xda, 0xba, 0xea, 0x6a, 0x2b, 0xcb, 0x4b, 0x4b, 0x22, 0x2d, 0xd1,\n  0x96, 0xff, 0x4d, 0x78, 0x63, 0xdd, 0xc5, 0xef, 0x89, 0x75, 0x85, 0x9f,\n  0x5a, 0x47, 0xd5, 0xaf, 0x15, 0xd4, 0xf8, 0xca, 0x9a, 0x4b, 0xa1, 0xa4,\n  0xf3, 0xe8, 0x55, 0x39, 0x96, 0x51, 0x4d, 0x1d, 0x4d, 0x1f, 0x92, 0x4e,\n  0xe8, 0xb1, 0x0f, 0xb2, 0x46, 0x14, 0xc3, 0x20, 0x9d, 0xaa, 0xab, 0xa5,\n  0x53, 0x75, 0x9d, 0x5e, 0xab, 0x03, 0xf6, 0x69, 0xf5, 0x3c, 0x5e, 0x0a,\n  0x0f, 0x80, 0x59, 0xac, 0x9a, 0xc7, 0x32, 0x3c, 0xa8, 0x1a, 0x06, 0xab,\n  0xb5, 0x3a, 0x47, 0x47, 0x57, 0x1d, 0xa0, 0x9b, 0x36, 0x7c, 0x80, 0x9e,\n  0xa7, 0xa4, 0x5f, 0xde, 0xc0, 0x29, 0xf9, 0x1f, 0xf3, 0x54, 0x75, 0xdd,\n  0xc0, 0x45, 0x56, 0x4d, 0x65, 0x3d, 0x45, 0x72, 0xbc, 0xa2, 0x15, 0xdb,\n  0x92, 0x78, 0xbd, 0x94, 0xa4, 0x51, 0x83, 0x34, 0xea, 0x24, 0xd2, 0x6a,\n  0x98, 0xc1, 0xc2, 0xc2, 0x20, 0x21, 0x06, 0xc9, 0x1b, 0x5b, 0x32, 0x92,\n  0x10, 0x83, 0x19, 0x41, 0x8c, 0xc1, 0x24, 0xc5, 0x18, 0x34, 0x1a, 0xed,\n  0x82, 0x64, 0xd0, 0xb7, 0xb7, 0x49, 0xd1, 0x85, 0xce, 0x8e, 0xb6, 0xee,\n  0xf6, 0xee, 0xfa, 0x54, 0x55, 0x45, 0x59, 0x69, 0xb4, 0x35, 0xd6, 0xfa,\n  0xbf, 0x8b, 0x2e, 0xac, 0xab, 0x57, 0x9f, 0xd9, 0x80, 0xbc, 0x6a, 0xd6,\n  0xd3, 0xae, 0x75, 0x62, 0x0a, 0x5f, 0x5e, 0xc7, 0x2e, 0x03, 0x9b, 0x9b,\n  0xc4, 0x12, 0xe2, 0x72, 0x2c, 0x61, 0x52, 0x8e, 0x25, 0x2c, 0x4a, 0x35,\n  0x97, 0x79, 0xf6, 0x19, 0xd8, 0xe1, 0x19, 0xd9, 0x3e, 0x8b, 0xa2, 0xfe,\n  0xe1, 0x65, 0x6b, 0x1c, 0x36, 0x26, 0x82, 0x5f, 0x20, 0xdb, 0xe3, 0x2d,\n  0xe9, 0xc6, 0xac, 0x75, 0x0b, 0x1b, 0x2d, 0x50, 0x1a, 0x89, 0x0c, 0xcb,\n  0xac, 0x36, 0xcd, 0x89, 0x35, 0x4e, 0x0c, 0x71, 0x1b, 0x18, 0xe1, 0x9c,\n  0xce, 0xb3, 0x96, 0x11, 0x9e, 0xaa, 0x37, 0xc5, 0x52, 0x01, 0x9b, 0x60,\n  0x72, 0x20, 0xf7, 0x4a, 0x3b, 0xd5, 0x98, 0xc9, 0x4c, 0x4c, 0x20, 0x7a,\n  0x62, 0xa2, 0x80, 0x01, 0x5e, 0x6b, 0xa1, 0x9b, 0xad, 0xb5, 0xb5, 0xd6,\n  0x2b, 0x5f, 0xb2, 0x90, 0x76, 0x02, 0x2a, 0xe8, 0x6f, 0x89, 0x1d, 0xee,\n  0x04, 0x14, 0xc6, 0xf5, 0xfc, 0x06, 0x96, 0x3d, 0x2c, 0x37, 0xce, 0xa4,\n  0x34, 0xce, 0x52, 0xa8, 0x71, 0x4c, 0xc8, 0x94, 0xfc, 0xed, 0xca, 0x36,\n  0x75, 0x4f, 0x4f, 0xaf, 0x32, 0x91, 0xdf, 0xf8, 0x6f, 0x9a, 0x70, 0xe0,\n  0xc6, 0xb1, 0xdc, 0x4b, 0x88, 0xaf, 0x53, 0x26, 0xf9, 0x34, 0xe8, 0x7b,\n  0x44, 0xc6, 0xc3, 0x57, 0x47, 0xa9, 0x4f, 0xd0, 0xff, 0x86, 0x3f, 0x1f,\n  0x94, 0x3f, 0x7f, 0x52, 0xae, 0x5b, 0x1d, 0x25, 0x75, 0xad, 0xa4, 0x26,\n  0x96, 0x48, 0xfd, 0xef, 0xb3, 0x63, 0x12, 0x23, 0xbe, 0xd1, 0x78, 0x8e,\n  0x6f, 0x24, 0x73, 0x41, 0x93, 0xb1, 0x80, 0x3d, 0xb2, 0x35, 0xdd, 0xb4,\n  0xae, 0x77, 0x24, 0xd5, 0x01, 0x5d, 0x07, 0x9e, 0x05, 0x49, 0x00, 0x3e,\n  0xc6, 0x0c, 0x87, 0x23, 0xd8, 0x4a, 0x8a, 0x5a, 0x05, 0x9d, 0x6f, 0x8d,\n  0xe1, 0x58, 0x87, 0x34, 0x17, 0xfd, 0xf7, 0x4a, 0x51, 0xfc, 0x38, 0x97,\n  0x35, 0xfa, 0xca, 0xd7, 0x8f, 0xdf, 0x7c, 0xcb, 0x75, 0xd7, 0xdd, 0x7c,\n  0xf3, 0x89, 0x55, 0x83, 0x75, 0xe5, 0x53, 0x05, 0x08, 0x72, 0xb3, 0xdc,\n  0xd1, 0x64, 0xcc, 0x82, 0x54, 0xc5, 0x06, 0xfb, 0x73, 0x22, 0xbf, 0x3f,\n  0x80, 0x4d, 0xbd, 0x6e, 0x7f, 0x72, 0x68, 0xa5, 0xf3, 0x7a, 0xf3, 0xbe,\n  0x95, 0xbd, 0xb9, 0x73, 0x99, 0x65, 0x3a, 0x73, 0x70, 0x60, 0x7c, 0x6c,\n  0x70, 0x70, 0x7c, 0xbc, 0x7f, 0xd5, 0x50, 0x67, 0xd8, 0x2c, 0xe1, 0xf4,\n  0xcc, 0xfc, 0xd1, 0xa3, 0xf3, 0xf3, 0x87, 0x0e, 0x49, 0xeb, 0x97, 0x34,\n  0x36, 0x92, 0x5d, 0x5b, 0x42, 0xd5, 0x41, 0x8d, 0xd6, 0x06, 0x3d, 0x1a,\n  0x91, 0xf8, 0x7d, 0xd7, 0x81, 0x59, 0xa7, 0x24, 0x06, 0xe2, 0x71, 0x8a,\n  0x11, 0xa3, 0x5e, 0x75, 0x0d, 0x2f, 0x66, 0xdd, 0xf1, 0x5a, 0xcb, 0xa2,\n  0xff, 0xfb, 0x35, 0xc6, 0xad, 0xb0, 0x7f, 0x93, 0x99, 0x2a, 0x38, 0x7a,\n  0xca, 0x9a, 0x5d, 0x2b, 0xdb, 0xb8, 0x71, 0xaa, 0x16, 0xf0, 0xc6, 0x0b,\n  0xf7, 0x79, 0xd9, 0xcf, 0xe1, 0x59, 0x9a, 0x3f, 0x2d, 0x25, 0xae, 0xc9,\n  0x1d, 0x3f, 0x91, 0xdf, 0xf1, 0x48, 0x74, 0x83, 0x1d, 0x5f, 0x73, 0x60,\n  0xd7, 0xea, 0xf6, 0x62, 0xc1, 0x01, 0x2e, 0xec, 0xc1, 0x64, 0xfe, 0x66,\n  0xf5, 0x30, 0xaf, 0x1e, 0xe3, 0x6d, 0xe9, 0xe9, 0xb5, 0xbd, 0x17, 0x15,\n  0xf1, 0x5e, 0xd4, 0x8a, 0xf7, 0x52, 0x60, 0x94, 0xc1, 0x70, 0x97, 0xd8,\n  0x67, 0x8b, 0x8b, 0xf2, 0x0c, 0x76, 0xcd, 0x35, 0x3c, 0x96, 0x75, 0x46,\n  0xfd, 0x97, 0x6b, 0x78, 0x30, 0x4f, 0xad, 0x31, 0xe6, 0x6b, 0xf9, 0x32,\n  0x99, 0x5d, 0x05, 0x47, 0x9d, 0xa5, 0x12, 0x64, 0xce, 0x2e, 0x8f, 0xf9,\n  0xce, 0xf4, 0x8e, 0x82, 0x32, 0x50, 0x29, 0xfe, 0x0c, 0x91, 0x00, 0xfe,\n  0xef, 0xb4, 0x94, 0x22, 0x56, 0x68, 0xd4, 0x41, 0x10, 0xc9, 0xea, 0xf2,\n  0x52, 0x38, 0xee, 0x78, 0x93, 0x82, 0x58, 0x43, 0x0b, 0xde, 0xbe, 0x86,\n  0x18, 0xe6, 0x0b, 0xea, 0xc0, 0x5a, 0xee, 0x4a, 0xe6, 0xa9, 0x42, 0x93,\n  0x5d, 0xd6, 0x03, 0xd9, 0x57, 0xa9, 0xa5, 0xd2, 0xd4, 0x87, 0xd7, 0xf4,\n  0x56, 0x52, 0x9a, 0xc2, 0xde, 0x8a, 0x7a, 0xd9, 0xd9, 0x50, 0x91, 0x14,\n  0xb9, 0xeb, 0xb2, 0x92, 0x39, 0x06, 0x5e, 0x4a, 0x9d, 0x66, 0x0d, 0x2f,\n  0x65, 0xfd, 0x1b, 0x67, 0xd2, 0x7e, 0xb0, 0x9b, 0x21, 0xc7, 0xae, 0xa6,\n  0xaa, 0x24, 0xbe, 0xd2, 0x5e, 0xd6, 0x6e, 0x38, 0xbf, 0x6b, 0x1d, 0x0d,\n  0xa3, 0x4d, 0xeb, 0xa7, 0x7a, 0xdd, 0x5c, 0x58, 0xd3, 0xae, 0xe5, 0xb4,\n  0x5c, 0x79, 0xae, 0x90, 0xc2, 0xb1, 0xf2, 0x1e, 0x21, 0xf9, 0x2f, 0x80,\n  0xe5, 0xff, 0xb7, 0x6b, 0xca, 0x3a, 0xb9, 0xec, 0xb7, 0x08, 0x5c, 0xae,\n  0xa8, 0x34, 0x52, 0x42, 0x95, 0x2c, 0xb0, 0x13, 0xf9, 0x92, 0xae, 0xcd,\n  0xf1, 0x56, 0x36, 0x7c, 0x9b, 0x2c, 0xe7, 0xd6, 0x66, 0xb0, 0x22, 0x13,\n  0xb1, 0xff, 0x8d, 0x9c, 0xd7, 0x5a, 0xc6, 0x9e, 0x5e, 0x5f, 0xca, 0xf1,\n  0x42, 0x8a, 0x7c, 0x2d, 0x67, 0x24, 0x13, 0x5a, 0x4f, 0x9f, 0x25, 0x3f,\n  0x24, 0x45, 0x75, 0x50, 0xbb, 0xd2, 0x3b, 0x15, 0x4f, 0x44, 0xbf, 0x86,\n  0x27, 0xa2, 0xcb, 0xf5, 0x44, 0xb4, 0xea, 0x05, 0xec, 0x81, 0x5c, 0x07,\n  0xc6, 0xb6, 0xe2, 0xc5, 0x81, 0xa1, 0x9d, 0x6e, 0x6b, 0x6a, 0x80, 0xdc,\n  0xf6, 0x55, 0x06, 0xb6, 0x61, 0xe3, 0x49, 0x54, 0xeb, 0x29, 0x62, 0x78,\n  0x23, 0xf9, 0x54, 0x27, 0xd7, 0x50, 0xc7, 0x75, 0x1c, 0x93, 0x2b, 0x3f,\n  0x5e, 0x63, 0xed, 0xfb, 0x3f, 0xac, 0xbd, 0x07, 0x80, 0x1d, 0x57, 0x75,\n  0x37, 0x3e, 0x77, 0xca, 0x9b, 0xd7, 0xf7, 0xf5, 0xde, 0xeb, 0xf6, 0xfe,\n  0xb6, 0x97, 0xb7, 0x7d, 0x57, 0xdb, 0x55, 0xac, 0xdd, 0x95, 0xb4, 0xab,\n  0x5d, 0xc9, 0x5a, 0xb5, 0xb5, 0x24, 0xcb, 0x4d, 0xae, 0xb2, 0x8d, 0x6c,\n  0x5c, 0x68, 0x36, 0x98, 0x60, 0xca, 0x87, 0x89, 0x1d, 0x88, 0x31, 0xc1,\n  0x40, 0x4c, 0x09, 0x81, 0x90, 0x40, 0xf2, 0x4f, 0x6c, 0x7a, 0x6c, 0xc0,\n  0x18, 0x30, 0x10, 0x42, 0x2f, 0xa2, 0xc4, 0x28, 0xc4, 0xfb, 0xf6, 0xbb,\n  0xe7, 0xde, 0x99, 0x79, 0xf3, 0xca, 0x4a, 0x26, 0xdf, 0xdf, 0xa0, 0x95,\n  0x76, 0xe6, 0xde, 0x99, 0x7b, 0xef, 0x9c, 0x7b, 0xee, 0xa9, 0xbf, 0x43,\n  0x69, 0x91, 0xea, 0x28, 0x50, 0x5f, 0x03, 0xf3, 0x3e, 0x79, 0x9d, 0xb6,\n  0x5f, 0x1e, 0x33, 0x0d, 0x7b, 0x92, 0x16, 0xe9, 0x6c, 0xf1, 0x22, 0xf5,\n  0xf5, 0x74, 0xb4, 0x35, 0x35, 0x54, 0x57, 0xfe, 0xbf, 0x2d, 0xd2, 0x76,\n  0x54, 0xf4, 0xc5, 0xd7, 0xb2, 0x44, 0xa9, 0xb2, 0xb4, 0x74, 0x19, 0xd5,\n  0x23, 0x97, 0x2c, 0x43, 0x47, 0xb2, 0x3c, 0x4b, 0xf4, 0x8e, 0x66, 0x49,\n  0xef, 0xf8, 0xa8, 0xa4, 0x77, 0x7c, 0xb2, 0x24, 0x86, 0x89, 0xca, 0xb8,\n  0x39, 0x49, 0xc6, 0x4d, 0x4b, 0x32, 0xae, 0x06, 0xed, 0x38, 0xa8, 0x60,\n  0xbe, 0x70, 0x49, 0x78, 0x16, 0x3b, 0x4c, 0x70, 0x3c, 0x6e, 0x40, 0xf1,\n  0x32, 0xba, 0xcb, 0x2b, 0xec, 0x3d, 0xf0, 0x0c, 0x16, 0x12, 0x86, 0x70,\n  0x1b, 0xe6, 0xb9, 0xb2, 0x7d, 0x87, 0x98, 0xef, 0x5c, 0xb1, 0xef, 0x10,\n  0xf3, 0x3a, 0x59, 0xc6, 0xc6, 0x7d, 0x41, 0xc6, 0xae, 0x63, 0x3a, 0x99,\n  0x3b, 0xb3, 0x16, 0x49, 0x26, 0x15, 0x50, 0x6d, 0x82, 0xd5, 0x88, 0xc0,\n  0x6c, 0xaa, 0x30, 0xb3, 0xa9, 0x86, 0x5c, 0x3f, 0x41, 0x92, 0x4f, 0x05,\n  0x90, 0x4f, 0x09, 0xb3, 0x10, 0x45, 0x59, 0xe8, 0xd6, 0x68, 0x64, 0x21,\n  0xd5, 0x9f, 0xad, 0x65, 0xa0, 0x98, 0x9a, 0x00, 0x09, 0x94, 0x20, 0xd3,\n  0xde, 0xae, 0xf4, 0x29, 0xd7, 0x7c, 0x31, 0x6b, 0x48, 0x54, 0x3a, 0x89,\n  0x9c, 0xae, 0x35, 0x85, 0x5e, 0x93, 0x9c, 0x0e, 0x05, 0x41, 0x5a, 0xa0,\n  0x88, 0x6e, 0xe1, 0xc7, 0xbf, 0x54, 0x2c, 0xe2, 0x7e, 0x73, 0xc7, 0x43,\n  0x27, 0x4f, 0x3f, 0x04, 0x7b, 0x61, 0xe7, 0xad, 0x55, 0xd5, 0xae, 0x15,\n  0xd1, 0xd0, 0xd9, 0x5f, 0xb7, 0xf9, 0xa5, 0x33, 0x37, 0xdf, 0x7c, 0xea,\n  0x9a, 0x9b, 0x6f, 0x39, 0x73, 0x39, 0xc1, 0xbd, 0xbd, 0xc9, 0x30, 0xd5,\n  0x6a, 0xe8, 0x3e, 0xec, 0xde, 0x73, 0x2b, 0x6c, 0x88, 0x7b, 0x1e, 0x7d,\n  0x54, 0x92, 0xdf, 0xef, 0x91, 0x7c, 0x1f, 0x1d, 0xaa, 0x1c, 0x21, 0x01,\n  0x72, 0x84, 0xf8, 0x6a, 0xa4, 0x81, 0x40, 0xfc, 0xcb, 0x4f, 0xfd, 0xac,\n  0x7a, 0xea, 0x89, 0x2a, 0x27, 0x91, 0xe7, 0x2f, 0x37, 0x6f, 0x55, 0xc5,\n  0x19, 0x65, 0xd6, 0xaf, 0x51, 0xb2, 0xcf, 0x2c, 0x46, 0xea, 0x5c, 0xcb,\n  0xa2, 0xa9, 0xab, 0xcb, 0x62, 0x03, 0x42, 0xdf, 0xb5, 0x63, 0x72, 0xd7,\n  0xe5, 0x44, 0xfc, 0x44, 0xd4, 0x3c, 0xdd, 0x6c, 0x18, 0x39, 0xe0, 0x0c,\n  0xcf, 0xd4, 0x5f, 0x7d, 0xec, 0xd8, 0xd5, 0x57, 0x1f, 0x39, 0xa2, 0xa6,\n  0xcd, 0xb7, 0xc8, 0xf4, 0x85, 0xe6, 0x99, 0xf7, 0x6f, 0x43, 0x5f, 0x2f,\n  0x4b, 0xf4, 0xa5, 0x41, 0xf3, 0xb3, 0x72, 0xdf, 0x39, 0x2e, 0xc9, 0x5e,\n  0xa2, 0x7d, 0x89, 0x6e, 0xf7, 0x61, 0x65, 0x3f, 0xdc, 0xc3, 0x1e, 0x97,\n  0xe9, 0x11, 0x5f, 0x5f, 0x20, 0xd7, 0x97, 0xf0, 0xf5, 0xf3, 0x44, 0xa7,\n  0xec, 0x90, 0xae, 0x3f, 0x42, 0xae, 0xcf, 0xe2, 0xeb, 0x4e, 0xd6, 0x83,\n  0xaf, 0x2f, 0x48, 0xd7, 0xe7, 0x88, 0x1e, 0xbc, 0x84, 0xdf, 0x7b, 0x9e,\n  0xd0, 0x6f, 0x9a, 0xe9, 0xcf, 0xf6, 0x5c, 0x46, 0xa3, 0x22, 0x18, 0x90,\n  0xc7, 0xd5, 0xea, 0x94, 0xd3, 0xe9, 0x4c, 0x3b, 0xd3, 0x71, 0x7b, 0x8a,\n  0x7c, 0x83, 0x6d, 0xf2, 0xb4, 0xdc, 0x12, 0xdc, 0xa7, 0x82, 0x4d, 0x99,\n  0xb1, 0xa2, 0x6f, 0x17, 0x2f, 0xf9, 0x5f, 0xf5, 0xdc, 0xb2, 0x72, 0xe1,\n  0x81, 0xa5, 0x03, 0xcb, 0xab, 0x7b, 0x4b, 0xa8, 0xea, 0x47, 0xb9, 0xe6,\n  0x1d, 0x37, 0x8e, 0xbc, 0xe5, 0x46, 0xf4, 0xc5, 0x5c, 0xd3, 0xde, 0x83,\n  0xeb, 0xf3, 0xe8, 0xcb, 0x30, 0xee, 0x59, 0x3c, 0x6e, 0x27, 0xa1, 0xa5,\n  0x4a, 0xe6, 0x5c, 0xb6, 0x42, 0x19, 0xb7, 0x07, 0x69, 0x04, 0xd9, 0xd9,\n  0x1c, 0x2f, 0x4e, 0x3a, 0x23, 0x69, 0xd4, 0x1b, 0x94, 0x84, 0xa0, 0x70,\n  0xda, 0x09, 0x8e, 0xa4, 0x2b, 0x6f, 0xd3, 0x0a, 0xdf, 0x9f, 0x96, 0xd5,\n  0xc8, 0x33, 0x24, 0x5d, 0x19, 0x4f, 0xb8, 0xd2, 0x59, 0x19, 0xb3, 0x27,\n  0xec, 0xc4, 0x53, 0x18, 0xdc, 0x6e, 0xc6, 0x8a, 0xc7, 0x16, 0xe6, 0x4c,\n  0xa7, 0xfc, 0xee, 0xe2, 0x29, 0xdf, 0x34, 0x6e, 0xe2, 0x7d, 0xfb, 0x5b,\n  0x57, 0xd7, 0x16, 0x6f, 0x5c, 0x1c, 0x29, 0x21, 0xaa, 0xdf, 0x6e, 0xfe,\n  0x74, 0xac, 0x3a, 0x7d, 0xe0, 0x08, 0x5a, 0xc9, 0xbd, 0xff, 0xfc, 0xe1,\n  0x65, 0xe4, 0xa6, 0xdf, 0xf6, 0x15, 0xae, 0x99, 0xf0, 0xa9, 0x51, 0x89,\n  0xc7, 0xe9, 0x4b, 0xfc, 0x67, 0xb0, 0x2e, 0x5f, 0x20, 0x7c, 0x6a, 0x4c,\n  0xe2, 0x71, 0x5f, 0x63, 0xca, 0xf5, 0x1d, 0x62, 0x3e, 0x7f, 0xc5, 0xbe,\n  0x43, 0xcc, 0xfd, 0x32, 0x8d, 0xe0, 0xbe, 0x40, 0x23, 0xcd, 0xcc, 0x79,\n  0x85, 0xc3, 0x71, 0x28, 0xec, 0x62, 0xe9, 0x62, 0x03, 0x87, 0xc3, 0xcb,\n  0xc8, 0x09, 0x9c, 0xb4, 0x8c, 0x1c, 0x6c, 0x59, 0x08, 0x06, 0x23, 0x6b,\n  0x79, 0x5c, 0xbd, 0x8c, 0x00, 0x4e, 0xaf, 0xe4, 0x87, 0xc3, 0xba, 0xdf,\n  0x2e, 0x77, 0x28, 0x6d, 0x4b, 0x97, 0xbc, 0xd9, 0xd9, 0x1c, 0xb7, 0x57,\n  0xb9, 0x2e, 0xbb, 0xe4, 0x4e, 0xb2, 0xb9, 0xcd, 0xac, 0x58, 0x4c, 0x6d,\n  0xb0, 0xf6, 0xdf, 0x2f, 0x5e, 0xfb, 0xf7, 0x36, 0x05, 0x0f, 0x88, 0xda,\n  0xe4, 0x78, 0x6f, 0xc7, 0x8d, 0x07, 0x5f, 0xff, 0xa6, 0xa5, 0x95, 0x83,\n  0x03, 0xb3, 0x89, 0x52, 0xba, 0x5b, 0xd5, 0x4e, 0x75, 0x1b, 0x1a, 0xe6,\n  0xdb, 0x0d, 0xb9, 0xaf, 0xc9, 0x04, 0xd8, 0x78, 0xd5, 0xc1, 0x86, 0x5d,\n  0x19, 0x02, 0x47, 0x27, 0xd1, 0xe0, 0x17, 0x08, 0x0d, 0x36, 0x33, 0xf7,\n  0x67, 0xad, 0xd2, 0xba, 0x68, 0x51, 0x43, 0xd0, 0xc7, 0xe5, 0xa9, 0xb0,\n  0x5a, 0x47, 0x52, 0x3c, 0xb5, 0x05, 0xf3, 0xd5, 0xc2, 0x86, 0x42, 0xa5,\n  0xc4, 0x58, 0x7f, 0x85, 0xc6, 0x25, 0x34, 0x69, 0xa5, 0x0b, 0x64, 0xc7,\n  0x44, 0xe9, 0x21, 0xe9, 0x92, 0xdb, 0xb0, 0x42, 0x81, 0x2c, 0x4e, 0x29,\n  0x61, 0x42, 0xad, 0x88, 0x0c, 0x7a, 0x6f, 0xf1, 0x0a, 0xa1, 0xa0, 0xa8,\n  0x4d, 0x8c, 0xf5, 0x00, 0x8d, 0xee, 0x6b, 0x59, 0x3b, 0x04, 0x34, 0xba,\n  0xd0, 0xe8, 0x2f, 0x21, 0xd3, 0xf7, 0x18, 0x1a, 0x76, 0x77, 0x88, 0xb9,\n  0x35, 0x4a, 0xab, 0xcb, 0xb9, 0x0f, 0x00, 0xad, 0xba, 0xba, 0xb5, 0xd3,\n  0x5d, 0x79, 0x9a, 0x7b, 0x8b, 0x4c, 0x73, 0x98, 0xef, 0xbd, 0x71, 0x1b,\n  0x9a, 0x7b, 0x59, 0xa2, 0x39, 0xcc, 0xf7, 0xf6, 0x30, 0x32, 0x1f, 0xe3,\n  0x9a, 0x09, 0xdf, 0x1b, 0x95, 0xf8, 0xd5, 0xbb, 0x14, 0x3e, 0xf6, 0x05,\n  0xf6, 0x84, 0x4c, 0xa3, 0xf8, 0xfa, 0xac, 0x12, 0x83, 0xd0, 0x46, 0xf8,\n  0x5e, 0x8f, 0x74, 0x7d, 0x58, 0x85, 0x6b, 0xe6, 0xa1, 0xb8, 0x66, 0x24,\n  0x26, 0xe1, 0x43, 0x5b, 0x7f, 0x60, 0x74, 0x78, 0x0c, 0x9f, 0xdc, 0xfa,\n  0x03, 0x19, 0x04, 0x4b, 0xeb, 0xf7, 0x10, 0xfa, 0x0e, 0x02, 0x0a, 0xae,\n  0xc2, 0x4b, 0xfc, 0x1e, 0x96, 0xe7, 0xb8, 0x12, 0x77, 0x3c, 0x54, 0xf4,\n  0x3b, 0x4e, 0x92, 0x33, 0xf9, 0x19, 0x9b, 0x0d, 0x58, 0x81, 0x66, 0x3b,\n  0xe6, 0xc7, 0xd9, 0x5b, 0x08, 0xc8, 0x7a, 0x0b, 0xba, 0xaf, 0x78, 0x85,\n  0xaf, 0xf9, 0xbb, 0xd5, 0x5f, 0x2f, 0xfd, 0x7a, 0xad, 0xf4, 0x10, 0xfd,\n  0x0c, 0xd4, 0xfb, 0xc9, 0xfd, 0x02, 0x59, 0xd1, 0xa7, 0xe0, 0x8d, 0x30,\n  0x7e, 0x42, 0x63, 0x0d, 0x80, 0x0f, 0xa9, 0x8c, 0xad, 0xa1, 0x12, 0xd3,\n  0x18, 0x97, 0x26, 0xc5, 0x94, 0x8b, 0x07, 0x08, 0xd4, 0xb4, 0xa1, 0xd4,\n  0x50, 0x3e, 0x25, 0xcc, 0x24, 0xe3, 0x5e, 0xdb, 0xe5, 0xec, 0x5e, 0x82,\n  0xba, 0xe2, 0x91, 0x1a, 0x3a, 0xb0, 0xbd, 0x1d, 0x1d, 0x2f, 0x1e, 0x78,\n  0xee, 0xed, 0xcb, 0xd7, 0x55, 0x78, 0x34, 0xbc, 0xc6, 0x67, 0xde, 0x58,\n  0xf9, 0x49, 0x60, 0x71, 0xc6, 0x93, 0x30, 0x19, 0xc2, 0xd6, 0xfa, 0x4e,\n  0x4b, 0xa0, 0x94, 0x8d, 0xe5, 0xbe, 0x52, 0x39, 0x11, 0xf5, 0xce, 0x57,\n  0xa1, 0xc6, 0xcd, 0xf7, 0x4c, 0x2d, 0x09, 0xdc, 0x28, 0xcb, 0xb7, 0xd6,\n  0x8c, 0xc9, 0xf5, 0x99, 0x48, 0x2c, 0x40, 0x8f, 0x44, 0x1b, 0xdd, 0xdb,\n  0x60, 0xe1, 0xbd, 0xac, 0x60, 0xd2, 0xcd, 0x87, 0x19, 0xe9, 0xec, 0x3b,\n  0xc2, 0x2e, 0x03, 0x6d, 0x30, 0xff, 0x4e, 0xf0, 0xd8, 0x06, 0xaf, 0xa7,\n  0xd7, 0xf5, 0x5b, 0x16, 0xa8, 0x51, 0x85, 0xaf, 0xb7, 0x13, 0xfe, 0x75,\n  0x33, 0x3e, 0x67, 0xe1, 0xba, 0x05, 0x3f, 0x67, 0x17, 0xfb, 0x30, 0xbe,\n  0x4e, 0x64, 0x46, 0xe6, 0xe6, 0x75, 0xba, 0x7f, 0x01, 0x0b, 0xa1, 0x91,\n  0xbd, 0x84, 0xbf, 0x7a, 0x15, 0xf3, 0xe9, 0x8f, 0x3b, 0x38, 0x56, 0xab,\n  0x43, 0xd2, 0xa6, 0x4d, 0xe3, 0x8f, 0xac, 0x41, 0xac, 0x48, 0x6b, 0xd7,\n  0xaa, 0xd5, 0x3a, 0x5a, 0x30, 0x02, 0xe9, 0x31, 0xd9, 0x9c, 0x61, 0x20,\n  0x1a, 0x09, 0x98, 0x5f, 0xcd, 0xb6, 0xcd, 0x19, 0x84, 0x4e, 0x4c, 0xe7,\n  0x8b, 0x4c, 0x40, 0x97, 0x82, 0xd6, 0xf9, 0x86, 0x3c, 0x8f, 0x56, 0x4a,\n  0x5b, 0x2f, 0x62, 0xdd, 0x31, 0x1c, 0x42, 0x4c, 0x22, 0x16, 0xaa, 0x0a,\n  0x57, 0x79, 0xdd, 0x12, 0x06, 0x1b, 0xa9, 0x73, 0xcd, 0x04, 0x51, 0x10,\n  0x74, 0x47, 0x52, 0xa4, 0x5c, 0xa4, 0x45, 0x3e, 0x69, 0xd5, 0x51, 0xfc,\n  0x91, 0x95, 0x62, 0xe5, 0x69, 0x52, 0x1a, 0x37, 0xa6, 0x71, 0x02, 0xea,\n  0xd5, 0xae, 0xfe, 0x39, 0xb7, 0x68, 0xeb, 0x9f, 0x9a, 0x5a, 0x78, 0xe1,\n  0x05, 0x8e, 0x15, 0xdc, 0x73, 0xfd, 0x87, 0xb1, 0x86, 0x33, 0x3e, 0xf6,\n  0x96, 0x3d, 0x83, 0x03, 0xfa, 0xfa, 0xc8, 0x30, 0x7b, 0x60, 0x70, 0x71,\n  0x71, 0x30, 0x14, 0xeb, 0xb6, 0xc6, 0xea, 0x1f, 0xb8, 0xff, 0xfe, 0x07,\n  0x27, 0x8e, 0x1f, 0x7e, 0x6e, 0x6d, 0x9d, 0x3f, 0x74, 0x0c, 0x64, 0x5d,\n  0x3d, 0x5e, 0xb4, 0xc7, 0xd9, 0x67, 0x99, 0x10, 0x96, 0x15, 0x1a, 0x99,\n  0x1b, 0x9e, 0x71, 0x21, 0x28, 0xa8, 0x40, 0x03, 0x26, 0x53, 0x80, 0xca,\n  0xc5, 0xa0, 0x6b, 0xf1, 0x0f, 0x51, 0xc3, 0x8b, 0xeb, 0x04, 0x4e, 0x05,\n  0x4a, 0x83, 0x11, 0x86, 0xce, 0xad, 0x68, 0xf3, 0xc7, 0x2d, 0x69, 0x48,\n  0xc2, 0x87, 0x2f, 0xd7, 0x72, 0x31, 0xeb, 0x60, 0x98, 0xc6, 0xfa, 0xea,\n  0x4a, 0xa8, 0x84, 0x87, 0x5f, 0x19, 0xcc, 0x38, 0xa3, 0x3a, 0x93, 0xb7,\n  0x46, 0x06, 0xf0, 0x02, 0x1b, 0x1f, 0x08, 0x76, 0x05, 0x55, 0x7e, 0xe3,\n  0x9c, 0x8c, 0x77, 0x69, 0x95, 0xff, 0xf1, 0x11, 0x5f, 0x38, 0x24, 0x72,\n  0xb3, 0xbc, 0x38, 0x32, 0xfe, 0xe3, 0x7b, 0xee, 0x1b, 0x1d, 0xac, 0x9b,\n  0xa8, 0xbe, 0x70, 0xf6, 0xb1, 0xd7, 0xed, 0x1f, 0xde, 0xb5, 0xef, 0x86,\n  0x37, 0xaf, 0xec, 0x98, 0x3e, 0x74, 0x1f, 0x7b, 0x9b, 0xdf, 0x6d, 0x09,\n  0x8b, 0x86, 0x88, 0x71, 0xa0, 0x77, 0x76, 0xad, 0x7f, 0x97, 0x51, 0x10,\n  0x53, 0xa3, 0x1d, 0xab, 0xc7, 0xd1, 0xa3, 0xdd, 0x5d, 0xdd, 0x2d, 0x9b,\n  0x5f, 0xd9, 0xd1, 0xd3, 0x31, 0xc2, 0x48, 0xf1, 0x2b, 0x6c, 0x2b, 0x60,\n  0xea, 0xa2, 0x27, 0x19, 0x5a, 0xa3, 0x9e, 0xd2, 0x8f, 0x9b, 0x89, 0x33,\n  0x8f, 0x7f, 0xdc, 0x8c, 0xd7, 0x53, 0x23, 0xd3, 0x4f, 0x4c, 0xae, 0x51,\n  0x7e, 0x72, 0x3a, 0x6f, 0x89, 0x06, 0x84, 0x30, 0x4c, 0x3a, 0x62, 0x01,\n  0xe9, 0xa4, 0xca, 0xb5, 0x24, 0x74, 0x40, 0x9b, 0x8b, 0x32, 0xd5, 0x24,\n  0x14, 0xbc, 0x8a, 0xcb, 0x34, 0xc3, 0xe4, 0xe2, 0x05, 0x68, 0xd8, 0x50,\n  0xc0, 0x13, 0xf7, 0xc6, 0xed, 0x56, 0x89, 0x50, 0xdc, 0xc8, 0xad, 0x53,\n  0x11, 0x0a, 0x78, 0xe7, 0xae, 0x44, 0x22, 0xe8, 0x89, 0xdc, 0xc7, 0xca,\n  0x52, 0xc8, 0xa5, 0x1d, 0xa7, 0xca, 0x91, 0x87, 0x24, 0x4b, 0x8e, 0x93,\n  0xda, 0xc7, 0x5e, 0x82, 0xd3, 0xc6, 0x32, 0x3c, 0x07, 0x90, 0x5b, 0x08,\n  0x1d, 0xa7, 0x38, 0x6d, 0xab, 0x02, 0x1d, 0xa5, 0xa5, 0x02, 0x31, 0x2e,\n  0x47, 0x85, 0xd7, 0xe2, 0xd5, 0xc1, 0xe8, 0xcc, 0xc8, 0x2c, 0xd2, 0xd1,\n  0x91, 0x83, 0x49, 0xc2, 0xae, 0x4d, 0x4b, 0x1f, 0x10, 0xc6, 0xb4, 0xe7,\n  0xc0, 0x35, 0x8d, 0x4b, 0xf7, 0x1c, 0xbe, 0xa1, 0xf5, 0xa6, 0x5b, 0xe7,\n  0xc6, 0x0e, 0xee, 0xbf, 0x65, 0x52, 0xdf, 0x71, 0x68, 0x00, 0x5d, 0xca,\n  0x7d, 0xbd, 0x63, 0xb9, 0x73, 0xf9, 0xdc, 0xf4, 0xd8, 0xd0, 0x48, 0xcf,\n  0xad, 0x33, 0x03, 0x30, 0x86, 0x9d, 0x78, 0x0c, 0x75, 0xa4, 0x7e, 0x6e,\n  0x88, 0x59, 0x7b, 0x46, 0x87, 0x38, 0x42, 0xa1, 0x55, 0xb4, 0x4e, 0x00,\n  0x3a, 0x09, 0xdb, 0x8c, 0x80, 0xad, 0x9c, 0x2d, 0x1c, 0x11, 0xa0, 0xea,\n  0x13, 0x50, 0xe1, 0xf2, 0xb7, 0x17, 0xb3, 0x4e, 0x87, 0x1d, 0x31, 0x5e,\n  0xb7, 0x3d, 0xe4, 0x08, 0x99, 0x8d, 0x02, 0xcf, 0xd8, 0x90, 0x4d, 0x1a,\n  0x73, 0x86, 0x00, 0x2d, 0x6c, 0xb3, 0x98, 0x83, 0x1b, 0x77, 0x2f, 0xc8,\n  0xab, 0x78, 0xfb, 0x49, 0xb2, 0x8a, 0xf3, 0xfa, 0x07, 0xee, 0x47, 0xbf,\n  0xfa, 0x54, 0xd1, 0x1a, 0x6a, 0x0e, 0x52, 0x8c, 0x33, 0x88, 0x03, 0xe9,\n  0x66, 0x9f, 0x67, 0xfc, 0x80, 0x30, 0x07, 0x35, 0x98, 0x2c, 0x10, 0xb3,\n  0x2b, 0xa1, 0x0c, 0x4a, 0xf5, 0x69, 0x4e, 0x53, 0x78, 0x7d, 0x9e, 0x8e,\n  0x0d, 0x31, 0x50, 0xf8, 0x5e, 0xab, 0x61, 0xfc, 0xc8, 0x2f, 0x98, 0x54,\n  0xa0, 0x8c, 0x85, 0x25, 0xc3, 0x09, 0x1c, 0xf0, 0xef, 0xbb, 0xf7, 0x54,\n  0x56, 0xed, 0xaa, 0x3f, 0xfb, 0xba, 0x5b, 0x6f, 0x69, 0x9c, 0x8f, 0x26,\n  0xaa, 0x8e, 0x0f, 0x5c, 0xf3, 0x96, 0x89, 0x99, 0x87, 0xf4, 0xe6, 0x8a,\n  0x19, 0xa3, 0x05, 0x0a, 0x1c, 0x7a, 0x2a, 0xa6, 0x1c, 0xae, 0xa5, 0x27,\n  0xce, 0x9c, 0x7c, 0xe2, 0x00, 0xa3, 0x60, 0xea, 0x7c, 0x92, 0x5b, 0xa2,\n  0x18, 0x63, 0x14, 0x47, 0x45, 0x40, 0x49, 0x3d, 0x8b, 0xe7, 0x64, 0x60,\n  0x39, 0xd6, 0x83, 0x78, 0x4e, 0x98, 0x22, 0x18, 0xc5, 0x02, 0x83, 0x65,\n  0x3e, 0x7c, 0x1d, 0xce, 0x9c, 0xd3, 0x20, 0xa9, 0xc8, 0x42, 0x0a, 0x30,\n  0xaf, 0x80, 0xcf, 0x69, 0x27, 0xc5, 0x2c, 0x01, 0x49, 0x85, 0x9a, 0xbb,\n  0xdc, 0x4e, 0x52, 0xb6, 0xd0, 0x59, 0x5a, 0xaa, 0x51, 0xa9, 0xe2, 0x88,\n  0xff, 0x62, 0x6f, 0xb5, 0x87, 0xa1, 0xf4, 0x4b, 0x43, 0x22, 0x3a, 0xad,\n  0x2a, 0xd3, 0xb8, 0xf1, 0xd0, 0xc4, 0xec, 0xa3, 0xd7, 0x74, 0x77, 0xb5,\n  0x71, 0x4b, 0x5a, 0x61, 0x9c, 0x13, 0x1b, 0x5b, 0x66, 0x54, 0x15, 0x1a,\n  0x97, 0xfe, 0xea, 0x34, 0x9e, 0x80, 0xd9, 0x3c, 0x30, 0xa2, 0xe0, 0xef,\n  0xc4, 0xd8, 0x4d, 0xa2, 0x29, 0x78, 0x6c, 0x58, 0xd6, 0xb4, 0x23, 0xc4,\n  0x79, 0x0d, 0x2c, 0x8f, 0x92, 0x3e, 0x56, 0xe0, 0x53, 0x58, 0xce, 0x82,\n  0x60, 0x86, 0x20, 0x81, 0xbf, 0x92, 0xc0, 0x78, 0x4e, 0x2a, 0x60, 0x3c,\n  0xc4, 0x83, 0x44, 0x01, 0x62, 0x08, 0xa1, 0x84, 0x60, 0x1f, 0xe2, 0x4f,\n  0x72, 0xac, 0x7c, 0x83, 0xc5, 0xac, 0x1d, 0x60, 0xd5, 0x42, 0x01, 0xb7,\n  0xd3, 0x62, 0xd6, 0x89, 0xf2, 0x84, 0x05, 0x95, 0xfa, 0x2d, 0xe9, 0xa3,\n  0xea, 0xf9, 0xe7, 0xa7, 0x8f, 0x6a, 0xc7, 0x4e, 0xf5, 0x0f, 0x9e, 0x19,\n  0xb7, 0x46, 0x2c, 0x6d, 0xbd, 0xd2, 0xdc, 0x55, 0x75, 0x1b, 0x07, 0xf4,\n  0x5d, 0x37, 0xaf, 0x1c, 0xba, 0xb5, 0x8b, 0x67, 0xf7, 0x0d, 0x8c, 0x68,\n  0x85, 0x09, 0x3c, 0xf5, 0x5b, 0x55, 0x35, 0x1b, 0x29, 0x46, 0x2d, 0xde,\n  0x08, 0xef, 0x26, 0xd8, 0xdf, 0x0f, 0x91, 0x7d, 0x09, 0x7c, 0xfb, 0x57,\n  0xa4, 0xbe, 0x40, 0x98, 0xd9, 0x47, 0xd9, 0x75, 0x48, 0x62, 0xd7, 0x6a,\n  0xe6, 0xcb, 0xf3, 0xdc, 0x8a, 0x46, 0x66, 0xd3, 0x61, 0x99, 0x4d, 0x6f,\n  0xd3, 0x82, 0x80, 0x37, 0x85, 0x83, 0x3e, 0x40, 0x87, 0x72, 0x61, 0xd6,\n  0x2c, 0x96, 0x67, 0xcd, 0x04, 0x1e, 0x39, 0xdd, 0x12, 0xb1, 0x16, 0xb1,\n  0xe2, 0x57, 0x4e, 0xbe, 0xe7, 0xaa, 0x7f, 0x7e, 0x7a, 0x63, 0x15, 0xc5,\n  0xde, 0x70, 0xe7, 0xf5, 0x6a, 0x06, 0x3c, 0xf7, 0xce, 0xb3, 0xcf, 0x7c,\n  0x62, 0x1a, 0x05, 0xde, 0x74, 0x81, 0x9e, 0xd1, 0x2d, 0xf8, 0x87, 0x86,\n  0xd4, 0x3c, 0x76, 0x31, 0x9d, 0xd9, 0x36, 0xa5, 0x2a, 0x31, 0x54, 0x8b,\n  0x66, 0x40, 0x0e, 0x03, 0x50, 0x6c, 0x66, 0x05, 0x16, 0xff, 0x04, 0x83,\n  0x3f, 0x3d, 0x62, 0x6c, 0x16, 0xb3, 0xab, 0xc2, 0x45, 0xce, 0x48, 0x0d,\n  0x63, 0x42, 0x26, 0xad, 0x49, 0x05, 0x01, 0x99, 0x89, 0x66, 0xa2, 0x2a,\n  0x10, 0xc8, 0xfe, 0x07, 0xcf, 0x67, 0x6e, 0x3b, 0xb1, 0x3f, 0xf7, 0x51,\n  0xf4, 0x81, 0x7f, 0xb8, 0x7a, 0xe7, 0x91, 0xc3, 0x8b, 0x47, 0x97, 0x3b,\n  0xd6, 0x7a, 0x5e, 0x9e, 0x05, 0x1c, 0x48, 0xb6, 0x77, 0xbc, 0xbf, 0x4f,\n  0xaa, 0x0d, 0x4b, 0x70, 0x20, 0xf1, 0x4c, 0x13, 0x98, 0xcf, 0x3b, 0x74,\n  0x05, 0x7c, 0x5e, 0x1a, 0x08, 0xe1, 0xde, 0x12, 0x39, 0x50, 0x8e, 0xcc,\n  0x17, 0xf3, 0xf9, 0x32, 0x2d, 0x09, 0xc2, 0x47, 0x09, 0x9f, 0x87, 0x7a,\n  0xd8, 0x20, 0x1b, 0x5c, 0xa6, 0x99, 0xcc, 0xe7, 0x23, 0x21, 0x4f, 0xc2,\n  0x9b, 0xa0, 0xd8, 0xac, 0xa2, 0x9a, 0xcf, 0xab, 0x21, 0x19, 0x61, 0xce,\n  0x44, 0xf2, 0x07, 0xd6, 0x94, 0x91, 0x2b, 0xec, 0x22, 0xfb, 0xe1, 0x9b,\n  0xce, 0x1d, 0xee, 0x9b, 0xf5, 0x6a, 0x90, 0x90, 0xfb, 0x18, 0x7a, 0x62,\n  0xcc, 0xc4, 0x7b, 0xe6, 0x9a, 0xf6, 0x8c, 0x0c, 0x2e, 0x8e, 0x8d, 0x8d,\n  0x61, 0x1e, 0x75, 0xff, 0x1b, 0xea, 0xa3, 0xa6, 0x96, 0x8a, 0x07, 0x77,\n  0x6c, 0x6a, 0xc7, 0x63, 0x8d, 0x13, 0x07, 0x96, 0x2d, 0x87, 0x4f, 0x9c,\n  0x59, 0x21, 0x6c, 0x0a, 0xd3, 0x58, 0xdb, 0x56, 0x04, 0xcb, 0xe0, 0x31,\n  0x54, 0x81, 0xce, 0xb3, 0xfb, 0x59, 0xcf, 0xe7, 0x18, 0x2c, 0x53, 0x33,\n  0xec, 0x27, 0x59, 0x0f, 0x11, 0xde, 0x10, 0x91, 0xea, 0x9e, 0x23, 0x98,\n  0x9d, 0x0d, 0xd9, 0x5a, 0x49, 0x30, 0x05, 0xa4, 0x2b, 0x39, 0xf4, 0x56,\n  0x06, 0x7e, 0x3a, 0x21, 0x14, 0x14, 0xf7, 0x34, 0xf9, 0x6b, 0xc8, 0x37,\n  0xa2, 0xff, 0xb3, 0xf6, 0xa0, 0x4c, 0xee, 0xbb, 0x28, 0x9e, 0x7b, 0x0e,\n  0xbd, 0x69, 0x76, 0x6b, 0x06, 0xbe, 0x8b, 0x82, 0x3b, 0x4e, 0xf0, 0x9d,\n  0x3f, 0x43, 0xf6, 0x77, 0x1b, 0xfe, 0x3d, 0x85, 0x79, 0x66, 0x35, 0x33,\n  0x99, 0x1d, 0x07, 0x9c, 0xa7, 0x84, 0x0a, 0xe7, 0x89, 0x9f, 0x82, 0xda,\n  0x8a, 0x93, 0x25, 0x60, 0x4f, 0xa7, 0x15, 0xb0, 0xa7, 0x33, 0x02, 0x81,\n  0x12, 0x54, 0xc0, 0x9e, 0xaa, 0x51, 0xb5, 0xcc, 0xa2, 0xb6, 0x03, 0x7b,\n  0x92, 0x99, 0x94, 0x0c, 0xf7, 0xd4, 0xb5, 0xe3, 0xc6, 0xca, 0x9a, 0xca,\n  0x5d, 0x03, 0x3d, 0x53, 0x07, 0x57, 0x57, 0x8f, 0xac, 0x5f, 0xbf, 0xba,\n  0xaf, 0xfd, 0x4c, 0x7d, 0xdd, 0xc9, 0xc1, 0xc3, 0x37, 0xb7, 0x2f, 0x2f,\n  0x8d, 0xec, 0xbc, 0x8e, 0x7d, 0xbe, 0x26, 0xdc, 0xeb, 0x8f, 0x75, 0xb5,\n  0xf5, 0x8c, 0x4d, 0xf6, 0x0d, 0x0f, 0x8e, 0x87, 0x5c, 0x3b, 0x5d, 0xae,\n  0xcc, 0x81, 0xee, 0xa9, 0x25, 0x23, 0x6f, 0xdc, 0x33, 0x31, 0x7d, 0x18,\n  0xe6, 0xb1, 0xf5, 0x9b, 0xad, 0xdf, 0x92, 0x3a, 0xa2, 0x5e, 0xa6, 0x2b,\n  0xdb, 0x2e, 0x40, 0xfd, 0x50, 0x28, 0x06, 0x28, 0x20, 0x9e, 0x62, 0x84,\n  0x49, 0x9b, 0x50, 0x9e, 0x00, 0x61, 0xfd, 0x32, 0x30, 0xaf, 0x51, 0xcf,\n  0x78, 0x91, 0x57, 0xa4, 0xec, 0x3f, 0xd3, 0xda, 0xee, 0x96, 0x43, 0xc3,\n  0x95, 0x68, 0x1c, 0x87, 0xe6, 0xdc, 0xd0, 0x98, 0x7e, 0x96, 0x0b, 0x78,\n  0xfc, 0x69, 0x74, 0x4b, 0xee, 0x65, 0x64, 0xce, 0xfd, 0x6e, 0xb1, 0x62,\n  0xa2, 0x37, 0x18, 0xf2, 0x98, 0x2c, 0x81, 0x68, 0x43, 0x0f, 0x1b, 0x9e,\n  0xfd, 0xde, 0xec, 0x53, 0xcb, 0xbb, 0xf2, 0x7c, 0xff, 0x27, 0x98, 0xef,\n  0xd7, 0x51, 0xaf, 0x25, 0xf0, 0x7d, 0x11, 0x55, 0x63, 0xbe, 0x2f, 0x82,\n  0xab, 0xc9, 0x83, 0xcf, 0xd5, 0x20, 0xd2, 0x70, 0x9a, 0x29, 0xa8, 0x62,\n  0x8c, 0x44, 0x60, 0xfd, 0x02, 0x3e, 0xed, 0x05, 0x82, 0xca, 0x2a, 0x3b,\n  0x9a, 0x38, 0x4e, 0x76, 0x80, 0x20, 0xa6, 0x2a, 0x1d, 0x0d, 0x43, 0x1e,\n  0x1d, 0x3e, 0xf6, 0xe1, 0x18, 0xa8, 0x43, 0x75, 0xba, 0x6d, 0x8e, 0x01,\n  0x8a, 0x1d, 0x0a, 0x88, 0xc7, 0x25, 0x67, 0xc1, 0x07, 0x25, 0x7e, 0x18,\n  0x4b, 0xad, 0xb4, 0x9c, 0x7f, 0x53, 0xfb, 0x0d, 0x07, 0x1b, 0x06, 0xfd,\n  0xef, 0xfe, 0x63, 0xd7, 0x0d, 0x93, 0xa7, 0xfe, 0x62, 0x76, 0xe1, 0x89,\n  0xeb, 0xc7, 0x07, 0x94, 0xe3, 0x20, 0x33, 0x63, 0xf5, 0x10, 0x0c, 0x36,\n  0xbd, 0xf8, 0xfc, 0x5c, 0xee, 0x7d, 0x76, 0xdb, 0xe2, 0x13, 0x67, 0x4e,\n  0x3f, 0xbe, 0xcf, 0x6a, 0x25, 0x47, 0x02, 0xe8, 0x7c, 0x58, 0x57, 0xe8,\n  0x22, 0x3c, 0x31, 0x06, 0xb2, 0x4a, 0xd0, 0x66, 0xd4, 0xf0, 0x9c, 0x54,\n  0x12, 0xf6, 0xf8, 0xb4, 0x40, 0x0e, 0x7f, 0x38, 0x60, 0x4f, 0x31, 0x04,\n  0x6a, 0xdf, 0x13, 0xf3, 0xc6, 0x00, 0xbe, 0x16, 0x76, 0x98, 0x46, 0xd9,\n  0x61, 0xed, 0xb4, 0x90, 0x2a, 0xd5, 0x9b, 0x24, 0xa1, 0x05, 0xef, 0xaf,\n  0x34, 0x09, 0xcc, 0x47, 0xc1, 0xb6, 0xbe, 0x4a, 0xff, 0x2f, 0x97, 0xdf,\n  0x60, 0xf5, 0x89, 0xa2, 0xdf, 0xf2, 0xe0, 0xca, 0x2f, 0xa3, 0xb1, 0xbe,\n  0xb6, 0x98, 0xc5, 0x66, 0xaf, 0xb0, 0x5f, 0x9c, 0xea, 0xac, 0xbd, 0xae,\n  0x8d, 0x5d, 0xc9, 0x3d, 0x50, 0x3b, 0x1d, 0x8f, 0xcf, 0xd6, 0xa2, 0xb3,\n  0x9b, 0xef, 0x1b, 0x38, 0x9d, 0xea, 0x98, 0x9e, 0xe9, 0x74, 0x4f, 0xc4,\n  0x92, 0x23, 0xae, 0x70, 0x40, 0xc2, 0xdf, 0xdb, 0x83, 0xf9, 0x4e, 0x9c,\n  0xf9, 0xc2, 0x33, 0x56, 0x4c, 0x0d, 0x32, 0xd3, 0x09, 0x52, 0x2e, 0x82,\n  0x10, 0xbf, 0x0a, 0xa0, 0x7b, 0xd2, 0xf9, 0xc3, 0xe6, 0xf9, 0x0d, 0x40,\n  0x9e, 0x46, 0x4b, 0x1a, 0xb1, 0xec, 0x09, 0xda, 0x52, 0x66, 0x35, 0x94,\n  0x31, 0x25, 0x65, 0x9e, 0xb4, 0x41, 0x5b, 0x33, 0xe5, 0x1b, 0xe3, 0x76,\n  0x45, 0x4d, 0x24, 0x92, 0x2c, 0x6c, 0x07, 0xf9, 0x41, 0x4e, 0xcc, 0x97,\n  0xc2, 0x01, 0x9f, 0xcb, 0x01, 0xaa, 0x0a, 0xfe, 0xd8, 0x80, 0xcc, 0x29,\n  0xad, 0x99, 0xc4, 0x7d, 0x00, 0x90, 0xd0, 0xe9, 0x90, 0x65, 0x26, 0xa7,\n  0x64, 0x8a, 0xb0, 0x3a, 0x34, 0xec, 0x1d, 0xc7, 0x4f, 0x66, 0x3a, 0x76,\n  0xf6, 0x2e, 0x2c, 0x08, 0x1a, 0xcf, 0xee, 0xc6, 0x7d, 0xfb, 0x6f, 0x1f,\n  0xe8, 0x5d, 0x38, 0xa1, 0x3f, 0xb0, 0xfe, 0xee, 0x81, 0xec, 0xd5, 0xcb,\n  0xb9, 0x5f, 0xb0, 0x97, 0x5e, 0xae, 0x8c, 0x57, 0x55, 0xe3, 0xdf, 0xef,\n  0x1c, 0x9d, 0x45, 0xc3, 0xb9, 0x4f, 0xdd, 0x74, 0x88, 0xd2, 0x2b, 0x96,\n  0x3d, 0xd1, 0x4e, 0x52, 0x83, 0xb7, 0x26, 0x5b, 0x09, 0xe5, 0xa1, 0xf0,\n  0x49, 0xc0, 0x02, 0xce, 0x23, 0xfe, 0x9a, 0xf8, 0x1f, 0xcc, 0x2a, 0x27,\n  0x6f, 0x19, 0x83, 0x0e, 0x8b, 0x9c, 0x16, 0x64, 0xe1, 0xe9, 0x66, 0x51,\n  0x15, 0xcd, 0xc1, 0xfb, 0xfa, 0xf7, 0xb5, 0x23, 0x95, 0x8b, 0xc9, 0x4a,\n  0x57, 0x83, 0xc9, 0xdc, 0xae, 0x0f, 0x4e, 0x0c, 0xb0, 0x75, 0x9b, 0x2f,\n  0x35, 0x36, 0x8a, 0xfc, 0x0e, 0x51, 0xc2, 0x34, 0x8f, 0xe1, 0x1f, 0x8d,\n  0xa4, 0x4e, 0x26, 0x96, 0xcf, 0x6c, 0x56, 0x16, 0xe1, 0x0d, 0x8a, 0x27,\n  0x29, 0x82, 0x94, 0xa6, 0xaa, 0xc4, 0x0b, 0xac, 0x8d, 0xbc, 0xf8, 0x04,\n  0xa9, 0x63, 0x6a, 0x67, 0xec, 0x50, 0x44, 0xd4, 0x0e, 0xfc, 0x0d, 0x39,\n  0x45, 0xd0, 0xd1, 0xac, 0x6e, 0x27, 0x04, 0x33, 0x81, 0xce, 0x96, 0xce,\n  0xa0, 0xea, 0xdd, 0x4b, 0x4b, 0xbb, 0x73, 0x39, 0xf8, 0xc9, 0x3e, 0xdb,\n  0xea, 0xf8, 0xd5, 0xcc, 0x16, 0x63, 0x6f, 0x6d, 0xc5, 0x92, 0xc4, 0xcc,\n  0xaf, 0x1c, 0xad, 0x72, 0x7d, 0xce, 0x13, 0xec, 0x57, 0xb1, 0x5c, 0xf8,\n  0x01, 0x8a, 0x33, 0x66, 0x86, 0x4d, 0xe9, 0xa8, 0x30, 0x1b, 0x20, 0x4f,\n  0x0d, 0xb0, 0x3c, 0xe1, 0x02, 0x9f, 0xbf, 0xb0, 0x48, 0xbd, 0x9c, 0x76,\n  0x2a, 0x2a, 0x0a, 0x2c, 0x70, 0x3c, 0x00, 0xf7, 0x3d, 0x41, 0x90, 0xca,\n  0x8c, 0x85, 0xb7, 0x8e, 0xab, 0x6e, 0x55, 0x6e, 0xd7, 0x2b, 0xeb, 0xa6,\n  0xac, 0x1b, 0x6e, 0x09, 0x48, 0x75, 0x07, 0xbe, 0xb9, 0x15, 0x31, 0xc0,\n  0x88, 0x4c, 0x46, 0xad, 0x00, 0x82, 0xa8, 0x46, 0xbd, 0xb9, 0x21, 0x11,\n  0x29, 0xce, 0xe5, 0x0b, 0xb1, 0xf5, 0xb1, 0x6c, 0x95, 0xd5, 0xa3, 0x13,\n  0x03, 0x3a, 0x53, 0xd0, 0xf7, 0x38, 0x4a, 0x1c, 0xff, 0xe3, 0xec, 0xd2,\n  0x92, 0x6f, 0x38, 0x78, 0xb3, 0x37, 0x95, 0x60, 0xbf, 0xca, 0xf3, 0xa3,\n  0x2c, 0xaa, 0x08, 0xff, 0x53, 0xee, 0x04, 0xba, 0x6a, 0x3a, 0xf7, 0x47,\n  0xf6, 0xd9, 0xdc, 0x5f, 0x44, 0x67, 0x12, 0x8f, 0x84, 0x83, 0x3a, 0x82,\n  0x49, 0x89, 0xd7, 0xc1, 0x84, 0x65, 0xb9, 0x10, 0xb3, 0x9c, 0xb5, 0xca,\n  0xb8, 0x7e, 0x98, 0xad, 0x98, 0xb1, 0xaa, 0xc1, 0x49, 0x42, 0x9c, 0x5b,\n  0x19, 0xe2, 0x49, 0xf8, 0x04, 0x1b, 0xd3, 0x8a, 0x79, 0xcd, 0x09, 0x17,\n  0xe1, 0x03, 0x1d, 0x53, 0x5f, 0x27, 0xa3, 0x0f, 0xf8, 0x3d, 0x6e, 0xa7,\n  0x03, 0x53, 0x6b, 0x08, 0x85, 0x60, 0xf4, 0x76, 0x65, 0xf4, 0x4e, 0x2b,\n  0x88, 0xf7, 0x7d, 0x6c, 0x7b, 0x7b, 0x8b, 0x68, 0x8f, 0xa7, 0xa1, 0x52,\n  0x5b, 0xeb, 0x97, 0xed, 0x09, 0xe0, 0x44, 0x2e, 0x2f, 0xcb, 0xf2, 0x1a,\n  0x8f, 0x57, 0xf7, 0xc1, 0xf5, 0x17, 0x7f, 0x7a, 0xfc, 0xef, 0x7a, 0xf7,\n  0xb2, 0x9b, 0x44, 0x26, 0xf3, 0x45, 0x72, 0x7f, 0xb0, 0xb4, 0xda, 0x75,\n  0xc1, 0xb0, 0xfe, 0x99, 0xff, 0xcc, 0x7d, 0xe9, 0x4f, 0x99, 0x7f, 0x66,\n  0xcf, 0x3c, 0x48, 0xe8, 0x07, 0xf0, 0x50, 0x7f, 0x8f, 0xf7, 0xb4, 0x81,\n  0x19, 0xa7, 0xdb, 0xcf, 0x05, 0x9f, 0x0d, 0x0a, 0xbd, 0x32, 0x34, 0x72,\n  0x5b, 0x3a, 0x14, 0xfd, 0x45, 0x37, 0x94, 0xd3, 0x72, 0x31, 0x6b, 0x2e,\n  0x3e, 0x30, 0x09, 0x3c, 0x3c, 0x54, 0x9c, 0x8a, 0x5b, 0xf7, 0x8c, 0x8e,\n  0x2e, 0x8c, 0x8e, 0xa2, 0xb5, 0x41, 0xb4, 0x3b, 0xf7, 0xd4, 0x60, 0xee,\n  0x3d, 0xe4, 0x5c, 0xf9, 0x13, 0xe6, 0xe5, 0x21, 0x36, 0xc7, 0xd4, 0x02,\n  0xed, 0x00, 0x03, 0x71, 0xdb, 0x8d, 0x78, 0x0d, 0xd2, 0x4e, 0x87, 0xcd,\n  0x20, 0xe0, 0x75, 0xd3, 0xb1, 0x4c, 0x00, 0xc1, 0xf2, 0xf9, 0xcb, 0xde,\n  0xc1, 0xc7, 0xe6, 0x94, 0x54, 0x6b, 0xcd, 0xcd, 0x48, 0xc5, 0x48, 0x4e,\n  0xd2, 0x62, 0x99, 0x02, 0xbe, 0x47, 0x7c, 0x56, 0x94, 0xe7, 0xf8, 0xf3,\n  0xb7, 0x09, 0xd0, 0x99, 0x52, 0x51, 0x93, 0xb8, 0xb5, 0xbc, 0xa4, 0xa0,\n  0x07, 0x62, 0x8e, 0x95, 0xdc, 0xc3, 0xf4, 0x03, 0xa5, 0x1b, 0x6a, 0x99,\n  0xda, 0x94, 0x3b, 0x99, 0xd6, 0x98, 0x7c, 0x35, 0x71, 0x7b, 0x5a, 0x4c,\n  0xb7, 0xa7, 0x24, 0x13, 0x15, 0x11, 0x65, 0xda, 0xdd, 0xa2, 0x5d, 0x5d,\n  0x84, 0x14, 0x72, 0xdc, 0xb0, 0x4c, 0x23, 0x72, 0x9a, 0x9f, 0xb8, 0x8f,\n  0xdb, 0x0f, 0x99, 0x63, 0x7e, 0x9b, 0xdf, 0x60, 0x8e, 0xd9, 0x3a, 0x07,\n  0x3c, 0x1b, 0xf6, 0x23, 0x1f, 0xb3, 0x87, 0xb5, 0x56, 0xc1, 0x10, 0xb4,\n  0x26, 0x6b, 0x2c, 0x13, 0x5a, 0xa7, 0x95, 0xe7, 0x75, 0x41, 0xeb, 0xcd,\n  0xac, 0x39, 0x1b, 0xe9, 0x0f, 0x79, 0x6c, 0x3c, 0x3b, 0xc6, 0x09, 0xb5,\n  0xf5, 0xd1, 0xfe, 0x48, 0xce, 0xdc, 0xc6, 0xa3, 0x01, 0x41, 0x4c, 0xd6,\n  0x7e, 0xc9, 0xd3, 0xdd, 0x69, 0x8f, 0xcf, 0xa5, 0x73, 0x3f, 0x91, 0xf8,\n  0x09, 0xf7, 0x38, 0xa9, 0x63, 0x78, 0xe0, 0xe3, 0x11, 0x1f, 0x54, 0x7d,\n  0x92, 0x98, 0xaf, 0x0b, 0x82, 0x06, 0x30, 0x53, 0x01, 0xd4, 0x3f, 0x66,\n  0x4d, 0xd4, 0x68, 0x39, 0x89, 0x3f, 0xfa, 0xa4, 0x1b, 0x04, 0xca, 0x48,\n  0xba, 0xab, 0x65, 0x25, 0x9d, 0xc0, 0x4d, 0xc0, 0x7f, 0x3d, 0x6e, 0x97,\n  0xdd, 0x6a, 0x36, 0xe9, 0xb5, 0x58, 0x81, 0xc4, 0x4c, 0x51, 0xa7, 0x28,\n  0x90, 0xb2, 0x67, 0x44, 0xf5, 0x0f, 0xc9, 0x54, 0x0b, 0x3f, 0x51, 0xf8,\n  0xf0, 0xea, 0x52, 0x57, 0xff, 0xe2, 0xd4, 0x52, 0x77, 0x76, 0xff, 0xd8,\n  0xd2, 0x58, 0x85, 0x10, 0x38, 0x9c, 0x79, 0x5d, 0x8d, 0x10, 0x3a, 0xa6,\n  0x5f, 0x3f, 0x8b, 0xfe, 0x94, 0xd3, 0x8c, 0x8e, 0x1e, 0x5e, 0x46, 0x5f,\n  0x80, 0xbf, 0x4f, 0xad, 0xa3, 0xa7, 0x37, 0xdb, 0x76, 0xd6, 0xd7, 0x1f,\n  0x6e, 0x69, 0x22, 0xdf, 0xfe, 0xbf, 0xf0, 0x39, 0xf7, 0x76, 0x62, 0xb3,\n  0xc1, 0xd2, 0xb3, 0x9b, 0x04, 0x56, 0xc9, 0xe8, 0x86, 0xb0, 0x7b, 0x8f,\n  0x4b, 0x20, 0x73, 0xf2, 0x86, 0x39, 0x25, 0x0b, 0x15, 0x84, 0x71, 0x4b,\n  0x5b, 0x41, 0xa5, 0x51, 0x5a, 0x5b, 0x50, 0x4b, 0x3d, 0x4b, 0xc6, 0x87,\n  0xa0, 0xce, 0x3c, 0xde, 0x1a, 0x75, 0x78, 0xd9, 0xf5, 0x2e, 0x53, 0x38,\n  0x72, 0x14, 0xdd, 0x06, 0x1b, 0x6a, 0xf7, 0xb1, 0xdc, 0x5d, 0x3c, 0xab,\n  0x19, 0xba, 0x28, 0x6a, 0xa6, 0x78, 0x4d, 0xbc, 0x81, 0xf3, 0x6e, 0x7e,\n  0xc4, 0x92, 0x9d, 0x8a, 0xa0, 0x87, 0x37, 0xdb, 0xd8, 0xf9, 0xf8, 0xd1,\n  0xf6, 0x5c, 0x68, 0xe7, 0x24, 0xad, 0xab, 0x80, 0xc7, 0xe6, 0x25, 0x18,\n  0x97, 0x77, 0x97, 0xd6, 0xed, 0xc0, 0x67, 0x34, 0xf8, 0xcd, 0x5e, 0x64,\n  0x5f, 0xc0, 0x63, 0xaf, 0x66, 0x76, 0x7f, 0x3c, 0x58, 0x01, 0xb0, 0x96,\n  0xd2, 0x57, 0xf0, 0xc0, 0x99, 0x86, 0x56, 0xe1, 0xb4, 0x3e, 0x4d, 0xcf,\n  0x1f, 0x4e, 0x51, 0xe4, 0x0b, 0x6e, 0x11, 0x83, 0x39, 0xdc, 0x67, 0xa4,\n  0x2f, 0xa1, 0x07, 0x30, 0xf3, 0x44, 0x2a, 0x2e, 0x19, 0x43, 0x8b, 0xfc,\n  0xa2, 0xaa, 0x6a, 0xc6, 0x85, 0xde, 0x51, 0xf6, 0xe9, 0xb1, 0x07, 0xd6,\n  0x8f, 0x3f, 0x30, 0x32, 0xf2, 0xe0, 0xf1, 0x89, 0xd3, 0xe9, 0xf0, 0x91,\n  0xf6, 0xab, 0x0f, 0xe2, 0x4f, 0x72, 0x24, 0x99, 0xd9, 0xfc, 0xe5, 0x89,\n  0xd3, 0x67, 0x8e, 0x1d, 0x3d, 0x73, 0xe6, 0x04, 0x3a, 0xa2, 0xb8, 0x3f,\n  0x1b, 0x6a, 0x1b, 0x6a, 0xd7, 0xcf, 0xe6, 0x04, 0xf4, 0x3f, 0xa3, 0xa3,\n  0xbd, 0xfb, 0x5f, 0xaf, 0xc4, 0x04, 0x80, 0x2e, 0x61, 0x61, 0x5f, 0x65,\n  0x63, 0x24, 0x9b, 0xa5, 0x25, 0xdb, 0x68, 0xc4, 0x5b, 0xdc, 0x4b, 0x90,\n  0xf3, 0xf3, 0xa3, 0x3e, 0x9b, 0x1f, 0x30, 0x8c, 0xff, 0x14, 0xc4, 0x2d,\n  0xc6, 0xec, 0xf1, 0x64, 0x4c, 0x1a, 0xb2, 0xe2, 0xd2, 0x54, 0x8d, 0xb7,\n  0x64, 0xb8, 0xe6, 0xf3, 0x1b, 0x43, 0xc7, 0x7b, 0xef, 0xd8, 0x38, 0xde,\n  0xef, 0x9b, 0xaa, 0x9e, 0x9b, 0xdb, 0xbb, 0x3f, 0x1b, 0x8a, 0xe7, 0x5e,\n  0x37, 0x32, 0x39, 0x39, 0x3a, 0x3a, 0x39, 0x35, 0x8c, 0x4c, 0x92, 0xcf,\n  0x72, 0x3c, 0x19, 0x3f, 0x70, 0x74, 0xf3, 0x63, 0xec, 0xc4, 0x1d, 0xb5,\n  0xd9, 0x95, 0x7c, 0x8c, 0x07, 0xd5, 0x19, 0x6f, 0x26, 0xb2, 0x68, 0x8c,\n  0x59, 0xa3, 0xe7, 0x45, 0x14, 0x94, 0x2f, 0x30, 0xf1, 0x09, 0x58, 0x94,\n  0x16, 0x38, 0x52, 0x99, 0x48, 0x12, 0x4a, 0x45, 0x19, 0xd6, 0x30, 0x46,\n  0xdb, 0x10, 0xe0, 0xf1, 0x6d, 0x1a, 0x61, 0x6e, 0xcb, 0x30, 0xb1, 0x48,\n  0xc0, 0x07, 0xa5, 0xb5, 0x93, 0x58, 0x75, 0xd4, 0xe2, 0xfd, 0x5e, 0xde,\n  0xaa, 0xa7, 0x81, 0x82, 0x8b, 0x65, 0x0c, 0x79, 0xdf, 0x24, 0x6a, 0xdb,\n  0xce, 0xf1, 0x23, 0x87, 0x17, 0x56, 0xf6, 0xa9, 0xb5, 0xc7, 0x6b, 0x0e,\n  0x77, 0xaf, 0x67, 0x73, 0x3f, 0x47, 0x87, 0x06, 0x67, 0x47, 0x86, 0x25,\n  0x1b, 0x9d, 0x85, 0x6d, 0xc4, 0xe7, 0x45, 0x9c, 0x69, 0x62, 0xee, 0xca,\n  0x56, 0xc8, 0x27, 0x86, 0xdf, 0x2c, 0xb9, 0xae, 0x82, 0xd4, 0x76, 0x89,\n  0xa8, 0x00, 0x73, 0x92, 0x68, 0x59, 0x92, 0x05, 0x48, 0xf1, 0x34, 0xc3,\n  0x1e, 0x39, 0x05, 0xb3, 0x4b, 0x88, 0xf2, 0xf1, 0x71, 0x99, 0x66, 0x58,\n  0x33, 0x83, 0x8a, 0xca, 0xb5, 0xd5, 0x89, 0xa6, 0x64, 0x53, 0x34, 0xe2,\n  0x75, 0xdb, 0xad, 0x54, 0x06, 0xd2, 0x15, 0x9e, 0x2a, 0x05, 0x46, 0x23,\n  0x52, 0x5d, 0x1a, 0x82, 0xc3, 0xf1, 0xb7, 0x84, 0x02, 0xb9, 0x4e, 0xc9,\n  0x79, 0xd5, 0x9a, 0xfa, 0x8a, 0x7c, 0xd2, 0xe0, 0x3d, 0xe5, 0x99, 0x19,\n  0x38, 0x74, 0x0e, 0xeb, 0x6c, 0xf3, 0x6e, 0x0d, 0xcb, 0x2f, 0xfc, 0x66,\n  0xe7, 0x10, 0x3b, 0xb0, 0xd0, 0xd4, 0x1f, 0x1e, 0x53, 0x4e, 0x9d, 0x39,\n  0x7b, 0xab, 0x35, 0xde, 0x78, 0xff, 0x03, 0xf7, 0xbd, 0xb1, 0x21, 0x8c,\n  0x1f, 0xf4, 0x1d, 0x6e, 0xf5, 0xc1, 0xdc, 0x4b, 0xfb, 0x97, 0xad, 0x87,\n  0x4e, 0xb4, 0x1d, 0xe8, 0xd9, 0x7f, 0x0d, 0xe4, 0x4b, 0x6e, 0xbd, 0x8b,\n  0x5d, 0x21, 0x72, 0x12, 0xa9, 0x84, 0x5e, 0x01, 0x07, 0xcc, 0x14, 0xfe,\n  0x32, 0x88, 0xbf, 0x07, 0x6a, 0x28, 0x0a, 0x10, 0xa0, 0x23, 0x10, 0x6b,\n  0xce, 0xba, 0xac, 0x6e, 0x9c, 0x80, 0x22, 0x43, 0x30, 0x0d, 0xdc, 0xc9,\n  0x12, 0x85, 0xa2, 0x7f, 0xf8, 0x83, 0x09, 0x1c, 0x29, 0xfa, 0xe7, 0x94,\n  0x3e, 0x94, 0x68, 0x47, 0xf2, 0x77, 0x42, 0xaf, 0x7c, 0xe8, 0x8d, 0x4b,\n  0x4b, 0x27, 0x2e, 0xdc, 0x51, 0x3d, 0x90, 0xf8, 0x42, 0x6e, 0xff, 0x89,\n  0xbd, 0x73, 0xbb, 0x17, 0x8e, 0x1c, 0x46, 0xe9, 0xcf, 0xb3, 0xcf, 0x1e,\n  0xbe, 0xfa, 0x48, 0xe7, 0x54, 0x9d, 0x29, 0xf7, 0x39, 0x74, 0x76, 0x64,\n  0x68, 0xb4, 0x1b, 0xf8, 0x6c, 0x03, 0x96, 0xdb, 0x7e, 0x8f, 0x75, 0xb7,\n  0x2a, 0x90, 0xa7, 0xd2, 0x88, 0x63, 0x52, 0x58, 0xa6, 0xe2, 0x6c, 0x88,\n  0x04, 0x83, 0xca, 0x42, 0x38, 0x31, 0x78, 0x91, 0xe5, 0x3e, 0xc3, 0x12,\n  0x73, 0x12, 0x68, 0x11, 0x4c, 0x15, 0xaa, 0x12, 0x4c, 0x52, 0x1d, 0x66,\n  0xbc, 0x96, 0x66, 0xb6, 0x40, 0x3d, 0x83, 0x3d, 0x8d, 0x25, 0x0d, 0x15,\n  0xe8, 0x7b, 0xc5, 0xf0, 0x91, 0xae, 0xfd, 0xfb, 0xb3, 0xb3, 0xf1, 0x9d,\n  0xb3, 0x9d, 0x27, 0x12, 0xb1, 0x23, 0x3d, 0xd7, 0xdf, 0xdf, 0xbc, 0xbf,\n  0xbf, 0x6b, 0x38, 0x34, 0x3c, 0x54, 0x3d, 0x13, 0x0b, 0xa4, 0x96, 0xd8,\n  0xe7, 0x6b, 0xe7, 0x3b, 0x77, 0x1d, 0x8c, 0xba, 0xab, 0x1a, 0xe3, 0x99,\n  0xbe, 0xb0, 0xe5, 0x2a, 0x8b, 0xfb, 0xf8, 0x4a, 0xc7, 0x8e, 0x8c, 0xdb,\n  0x95, 0x6a, 0x4c, 0x34, 0x74, 0xba, 0x2c, 0xd3, 0x36, 0x17, 0x8c, 0xb9,\n  0x0e, 0x8f, 0xf9, 0x29, 0x82, 0xbb, 0x8f, 0xc7, 0x9c, 0xc2, 0x63, 0x4e,\n  0x96, 0x19, 0xf3, 0xd9, 0xc2, 0x31, 0xc7, 0xa3, 0x64, 0xcc, 0x95, 0xa8,\n  0x52, 0x30, 0xc9, 0xa0, 0xef, 0xc5, 0x63, 0x2e, 0x19, 0xf2, 0x7f, 0xac,\n  0xad, 0x57, 0xee, 0x68, 0x6d, 0xed, 0x72, 0xf5, 0x0c, 0x35, 0xec, 0x0f,\n  0x87, 0xe7, 0x3b, 0xbe, 0x91, 0x1a, 0x6f, 0x69, 0xed, 0xf1, 0x75, 0xb6,\n  0x85, 0x87, 0x62, 0xa1, 0xd4, 0x34, 0x1b, 0xdb, 0x31, 0x5c, 0xdb, 0x51,\n  0xe9, 0x70, 0x44, 0x22, 0x8e, 0x44, 0x8d, 0xdf, 0x32, 0x67, 0xb1, 0xbd,\n  0xa7, 0xa6, 0xb3, 0xd2, 0xee, 0x08, 0x86, 0x5d, 0xa1, 0xb8, 0xc3, 0x3c,\n  0x6a, 0xb5, 0x03, 0x5f, 0x4d, 0xe0, 0x8d, 0x10, 0x23, 0x76, 0x6b, 0xa8,\n  0xb1, 0xca, 0x6e, 0x5d, 0xda, 0xb2, 0xa0, 0x47, 0xf0, 0x9e, 0xf0, 0x31,\n  0x49, 0x66, 0x23, 0xab, 0x07, 0xc4, 0x43, 0x03, 0x62, 0x49, 0x05, 0xd2,\n  0xa0, 0x54, 0x81, 0x94, 0x43, 0x02, 0x77, 0x8c, 0x98, 0x56, 0x88, 0xae,\n  0x79, 0x52, 0x99, 0xcc, 0x29, 0x10, 0x04, 0x83, 0x1a, 0xb9, 0xcc, 0xc7,\n  0x31, 0xb9, 0xad, 0xea, 0x3e, 0x3e, 0xed, 0x02, 0x7e, 0x2c, 0x29, 0x47,\n  0xfc, 0xc9, 0x40, 0x52, 0x32, 0xfb, 0x41, 0xd1, 0x13, 0x69, 0xde, 0xd6,\n  0x42, 0x25, 0xda, 0x2a, 0x7d, 0x2b, 0xb7, 0xa4, 0x67, 0xe3, 0xd9, 0x5f,\n  0xdf, 0x3b, 0x42, 0x45, 0xf0, 0x36, 0x5f, 0xed, 0x48, 0xba, 0x6e, 0xa0,\n  0xcb, 0xdd, 0x5e, 0xe5, 0xb2, 0x06, 0x9c, 0x69, 0x07, 0xbb, 0x39, 0x3a,\n  0xb6, 0x39, 0x0e, 0x02, 0xf9, 0x90, 0xa8, 0x03, 0xf1, 0x7c, 0xbd, 0xbf,\n  0x29, 0xd0, 0x12, 0x19, 0xf7, 0x54, 0xb8, 0x6c, 0xa6, 0x20, 0xd4, 0x03,\n  0x92, 0x7c, 0x3d, 0x98, 0x6b, 0xed, 0xcc, 0xce, 0xda, 0x10, 0x27, 0x84,\n  0x91, 0xc8, 0xe5, 0x21, 0x92, 0x19, 0x5e, 0xe0, 0x2f, 0x80, 0x09, 0x8b,\n  0xa4, 0x02, 0x6e, 0x40, 0x04, 0x0e, 0xfd, 0x46, 0xf4, 0x08, 0xd4, 0xca,\n  0x47, 0x60, 0xd0, 0x4f, 0xab, 0xde, 0x58, 0x2d, 0x46, 0x80, 0xdb, 0x8d,\n  0xa1, 0x98, 0xce, 0x54, 0x58, 0xef, 0x46, 0x42, 0xbf, 0xc6, 0x42, 0x21,\n  0x91, 0xe6, 0x49, 0xcd, 0x4b, 0xfc, 0x4d, 0xbf, 0x27, 0xe1, 0xed, 0x3a,\n  0x93, 0x43, 0x35, 0x53, 0xd3, 0xf1, 0xd6, 0x77, 0xbe, 0x73, 0xb7, 0xa3,\n  0xda, 0xd4, 0x79, 0x91, 0x62, 0xed, 0x1e, 0x09, 0x8e, 0x0f, 0xa0, 0x8e,\n  0xea, 0xf8, 0xb5, 0xb7, 0x0c, 0xe7, 0x9e, 0x3d, 0x28, 0xf2, 0x7f, 0x4b,\n  0xea, 0xb7, 0x00, 0xaf, 0xcd, 0xe0, 0x3d, 0x69, 0x63, 0x66, 0x28, 0xa7,\n  0xf5, 0x4a, 0xd6, 0x39, 0x2e, 0xcf, 0x3c, 0x15, 0xe0, 0x58, 0x9f, 0x6c,\n  0x98, 0x2b, 0xbd, 0x49, 0xa5, 0x28, 0x1b, 0x63, 0xb3, 0x26, 0x1d, 0x51,\n  0x8d, 0xc4, 0x55, 0x55, 0x4c, 0x15, 0x80, 0xd4, 0x37, 0x8f, 0xf4, 0x4a,\n  0x4c, 0x14, 0xbd, 0xe7, 0x7b, 0xec, 0x2d, 0x8d, 0x8a, 0xe3, 0x63, 0xf3,\n  0x02, 0x91, 0x4f, 0x2d, 0x98, 0xb6, 0x77, 0x11, 0x7e, 0x79, 0x6b, 0xd6,\n  0x0d, 0xdc, 0x32, 0xc2, 0x63, 0xe1, 0x27, 0x8c, 0xc5, 0x43, 0x07, 0x96,\n  0x1b, 0x9c, 0x04, 0x38, 0x9b, 0x92, 0x49, 0x54, 0xc5, 0x35, 0x61, 0x45,\n  0xc9, 0x58, 0x36, 0xd4, 0x56, 0x15, 0x7f, 0x36, 0xac, 0x30, 0xcc, 0xf2,\n  0x2d, 0x88, 0xae, 0x18, 0x0a, 0xaa, 0x80, 0x8d, 0x25, 0x5d, 0xd1, 0x9e,\n  0x37, 0x0c, 0xb4, 0xc8, 0xf0, 0xdf, 0x2a, 0x92, 0xc9, 0xb4, 0xe3, 0xf9,\n  0x5c, 0x74, 0x57, 0x99, 0x74, 0x75, 0xee, 0x9e, 0x77, 0xbe, 0xb3, 0x21,\n  0x89, 0xd7, 0xd8, 0xdc, 0xea, 0xa9, 0x1e, 0xab, 0x9d, 0x9a, 0x9e, 0x90,\n  0xb8, 0xe1, 0xf0, 0x1e, 0xbc, 0xc6, 0x4d, 0x0d, 0x94, 0x54, 0xe8, 0xb2,\n  0x0f, 0xee, 0x98, 0x83, 0x39, 0x4a, 0x7e, 0x42, 0xac, 0x95, 0x65, 0xb2,\n  0xcd, 0x16, 0xcc, 0xfb, 0xb0, 0xf8, 0x4f, 0x6a, 0xd7, 0x60, 0x32, 0x51,\n  0x2c, 0x9d, 0x2a, 0x79, 0xc8, 0x6c, 0x24, 0x5e, 0x14, 0x1e, 0x62, 0x35,\n  0x65, 0xe5, 0xdf, 0x1a, 0x27, 0xb8, 0xf4, 0x79, 0xb3, 0xed, 0xe9, 0xa1,\n  0xe1, 0x97, 0x59, 0xf7, 0xf7, 0x22, 0x61, 0x93, 0x4b, 0xaf, 0x8f, 0x5f,\n  0x9c, 0xdc, 0xc9, 0x7e, 0x79, 0x76, 0x76, 0xb3, 0xad, 0x21, 0xae, 0xe1,\n  0xa7, 0x34, 0x22, 0x59, 0xdb, 0xe4, 0xd6, 0x7f, 0xb1, 0x3f, 0xc5, 0xef,\n  0x8d, 0xc2, 0x7b, 0x03, 0x1a, 0x22, 0x54, 0x82, 0xa0, 0x88, 0x56, 0x04,\n  0x44, 0x7d, 0x24, 0x0c, 0x23, 0x8b, 0xc4, 0x88, 0xf1, 0xfb, 0xbc, 0x1e,\n  0x9b, 0x05, 0x1c, 0x38, 0x80, 0xf6, 0x0c, 0xa6, 0x9d, 0x24, 0xe1, 0xb0,\n  0x90, 0xfe, 0x12, 0x57, 0x55, 0xf7, 0x83, 0xa2, 0xa3, 0xf8, 0x12, 0xb5,\n  0x39, 0xdc, 0x7b, 0xd3, 0xe9, 0x1d, 0x07, 0x50, 0xe4, 0xa3, 0xd9, 0x85,\n  0xa9, 0x87, 0x8e, 0x1d, 0x7f, 0x68, 0x6a, 0x6f, 0xf6, 0x23, 0x28, 0x72,\n  0x60, 0xf2, 0xcc, 0xf0, 0xdd, 0xd7, 0x1e, 0x7e, 0xdf, 0xd0, 0xf8, 0x6c,\n  0xd3, 0xe3, 0xa7, 0xd7, 0xde, 0x3c, 0x3b, 0xf3, 0xe6, 0xb5, 0x33, 0x8f,\n  0x37, 0xcd, 0x8e, 0x0f, 0x3e, 0x7e, 0xe8, 0xda, 0xbb, 0x15, 0xfd, 0x99,\n  0x3d, 0x8f, 0xf9, 0x70, 0x90, 0x39, 0x90, 0xd5, 0x3b, 0x10, 0x87, 0xec,\n  0x10, 0x8f, 0x3d, 0x25, 0x8b, 0xfd, 0x1c, 0x87, 0x30, 0x57, 0x53, 0x94,\n  0x69, 0xc5, 0x6b, 0xe2, 0xa7, 0x0a, 0xb6, 0x64, 0xec, 0x3f, 0x5d, 0x70,\n  0x97, 0xa8, 0x55, 0x1e, 0x97, 0xb5, 0x82, 0xc8, 0xbb, 0x41, 0x14, 0xd4,\n  0x94, 0xc8, 0xbb, 0xad, 0x79, 0x01, 0x1f, 0x44, 0x49, 0x0d, 0x3a, 0x2e,\n  0x45, 0x01, 0x45, 0xc2, 0x8e, 0x94, 0xa5, 0xa2, 0xd9, 0x77, 0x6f, 0xcf,\n  0x2d, 0x7a, 0x55, 0xe8, 0xcf, 0x60, 0x3a, 0x62, 0xd0, 0x4d, 0x19, 0x8c,\n  0x6f, 0xce, 0x7d, 0x72, 0xc7, 0x8d, 0x23, 0xa4, 0xbe, 0x05, 0xde, 0x04,\n  0xdd, 0x58, 0x46, 0xb4, 0x41, 0x8d, 0x02, 0x00, 0x3a, 0x37, 0x59, 0x8d,\n  0xf8, 0x30, 0xc3, 0xa2, 0xf8, 0x94, 0x01, 0x31, 0x3b, 0xb0, 0x5a, 0xac,\n  0xfe, 0x9d, 0x14, 0x84, 0x21, 0xe8, 0xe9, 0x64, 0xa0, 0x98, 0x80, 0x99,\n  0xe3, 0x79, 0xed, 0x10, 0x33, 0x77, 0xe6, 0xb8, 0x52, 0x5b, 0xef, 0x74,\n  0x5e, 0x3d, 0x34, 0xd2, 0x6d, 0x95, 0x48, 0xd8, 0x04, 0x62, 0xe6, 0x86,\n  0xa2, 0x49, 0x6d, 0x92, 0x0d, 0x1f, 0x4b, 0x5e, 0x9c, 0xf5, 0xd7, 0xbf,\n  0x5e, 0xfb, 0xd4, 0x79, 0x47, 0x63, 0xc4, 0x11, 0xd2, 0xdb, 0x9c, 0x1e,\n  0xdb, 0xfb, 0xc0, 0x79, 0x9f, 0x7b, 0x0c, 0x85, 0xeb, 0x42, 0x22, 0x3f,\n  0xa1, 0x8d, 0xe7, 0x3e, 0x9c, 0xfb, 0x05, 0xc1, 0x70, 0xb7, 0x60, 0x3d,\n  0x2c, 0x86, 0x25, 0xbf, 0xdb, 0xe9, 0xba, 0x12, 0x05, 0x36, 0xec, 0xb5,\n  0xf1, 0x58, 0x22, 0x07, 0x5f, 0x0f, 0x68, 0x60, 0x70, 0x8d, 0x2f, 0xb8,\n  0xa6, 0xe8, 0x5e, 0x8a, 0x4e, 0x4e, 0x8d, 0x2f, 0x0a, 0x3b, 0xf6, 0xd3,\n  0x14, 0x25, 0x59, 0x86, 0x2f, 0xb8, 0x4b, 0x3e, 0x82, 0xdf, 0x27, 0x99,\n  0xdd, 0x52, 0x28, 0x55, 0xa4, 0x99, 0x17, 0xb9, 0xfb, 0x39, 0x25, 0x12,\n  0xa0, 0x1d, 0x9f, 0x98, 0xff, 0x69, 0x0d, 0x1a, 0x04, 0xab, 0xd6, 0xea,\n  0x32, 0x7c, 0x22, 0xef, 0xe7, 0xef, 0xb6, 0xf8, 0xbe, 0x25, 0x45, 0x00,\n  0x04, 0xcc, 0x53, 0x8e, 0x5a, 0x36, 0x26, 0x0a, 0x03, 0x2c, 0xe7, 0x0b,\n  0xe4, 0x6c, 0x79, 0x0f, 0x3f, 0xeb, 0x93, 0x3d, 0xff, 0x2f, 0x76, 0x54,\n  0x91, 0xba, 0x29, 0xf8, 0x3b, 0x39, 0x49, 0x8d, 0x2a, 0x7c, 0x66, 0x6a,\n  0x20, 0x8a, 0x01, 0x69, 0x04, 0x55, 0xbd, 0x28, 0x30, 0xcc, 0xca, 0x9b,\n  0x4f, 0x10, 0xe4, 0xf4, 0x59, 0x5a, 0x36, 0xca, 0x6a, 0x81, 0x08, 0x3f,\n  0x7b, 0x4b, 0x7b, 0x14, 0x32, 0xbf, 0x30, 0x3f, 0xe0, 0xa2, 0xce, 0x68,\n  0xc6, 0x1e, 0x9f, 0xfd, 0xe4, 0xdb, 0x73, 0x6f, 0x45, 0x2f, 0xfe, 0x9f,\n  0x9b, 0xff, 0xfa, 0x49, 0x74, 0x57, 0xce, 0xfa, 0xd1, 0xfb, 0xd0, 0xdb,\n  0xff, 0x63, 0x6e, 0xf8, 0x37, 0x63, 0x5b, 0xcc, 0xdc, 0x30, 0x32, 0x52,\n  0xba, 0x86, 0xe8, 0xae, 0x0f, 0x93, 0x3a, 0x55, 0xbd, 0xd9, 0x2e, 0x84,\n  0x34, 0xa2, 0x1e, 0xb3, 0x32, 0x76, 0x4a, 0x00, 0x31, 0x10, 0x18, 0x13,\n  0x58, 0xd9, 0xc5, 0x15, 0xc0, 0xb9, 0xda, 0x98, 0x96, 0x2d, 0xf4, 0x27,\n  0x48, 0x09, 0x02, 0x2b, 0x43, 0x5f, 0x6e, 0xb5, 0x91, 0xb0, 0x23, 0xf2,\n  0x62, 0x11, 0x5e, 0x8c, 0xb7, 0x1b, 0x0c, 0x05, 0x7d, 0xe0, 0xd4, 0xd5,\n  0x6f, 0xbf, 0x05, 0xc5, 0x73, 0x37, 0xdd, 0x75, 0xfa, 0xb1, 0x8d, 0xdc,\n  0x6f, 0x59, 0xcf, 0xe0, 0xbb, 0x47, 0x3f, 0x3c, 0xdc, 0xf5, 0xa9, 0xd1,\n  0x77, 0x0e, 0x53, 0x1b, 0xb9, 0x54, 0x6b, 0x12, 0xeb, 0x33, 0xff, 0xac,\n  0xf8, 0xa1, 0x92, 0x78, 0x0d, 0x82, 0x50, 0x3b, 0x46, 0x87, 0xc7, 0x61,\n  0xc6, 0xbc, 0x07, 0x6c, 0xd4, 0x7e, 0xf0, 0x6a, 0x40, 0x4c, 0x30, 0x2f,\n  0x40, 0x5d, 0xab, 0xbc, 0xad, 0x57, 0xe5, 0x57, 0xa2, 0x5b, 0x89, 0x70,\n  0x49, 0x11, 0x36, 0x93, 0xda, 0xa9, 0xd4, 0x0e, 0x3c, 0x21, 0xea, 0x06,\n  0x13, 0xb5, 0xca, 0x46, 0x8d, 0x26, 0x57, 0x6f, 0xee, 0x1c, 0xda, 0xe8,\n  0xfb, 0x2a, 0xfa, 0xfb, 0xdc, 0xc7, 0xbf, 0x34, 0xd3, 0x34, 0xdf, 0x70,\n  0x70, 0xb5, 0xf9, 0x54, 0x7d, 0xdd, 0x71, 0x7d, 0xef, 0xd5, 0xdd, 0x53,\n  0x87, 0x5b, 0xd8, 0xe7, 0xc6, 0xe6, 0x9e, 0x1d, 0x88, 0x0c, 0xb5, 0x8f,\n  0xcc, 0x79, 0x5d, 0x3b, 0x5d, 0x56, 0x6a, 0xdf, 0xc2, 0xe7, 0xe7, 0x8f,\n  0x48, 0xbd, 0x14, 0xd5, 0x18, 0x41, 0x43, 0xf1, 0xa9, 0xc7, 0x78, 0x8c,\n  0xc9, 0x73, 0x73, 0x79, 0x8c, 0x84, 0x55, 0x82, 0x11, 0x5d, 0x1a, 0x63,\n  0x00, 0x05, 0xb6, 0x19, 0xa3, 0x6a, 0x88, 0x91, 0xd9, 0x6b, 0x7b, 0x07,\n  0x4f, 0x0f, 0xbf, 0x84, 0xde, 0x91, 0xfb, 0xf2, 0x4b, 0xdd, 0xfb, 0x4e,\n  0x1d, 0x9c, 0xee, 0x5e, 0x8d, 0x46, 0x0e, 0x5e, 0xec, 0x39, 0x3a, 0x30,\n  0x7b, 0xa4, 0x8d, 0xff, 0x43, 0x76, 0xc7, 0xef, 0x7b, 0xa7, 0x97, 0xc6,\n  0xf6, 0xfa, 0xb0, 0x6c, 0x63, 0x87, 0xf1, 0x05, 0xf0, 0xf8, 0xfe, 0x11,\n  0x8f, 0xaf, 0x12, 0xce, 0x77, 0xcc, 0xa7, 0xf8, 0x0a, 0xc4, 0x0a, 0x49,\n  0x24, 0x6a, 0x52, 0x80, 0xd8, 0x42, 0x6a, 0x91, 0x23, 0x81, 0x3d, 0x06,\n  0xd5, 0xba, 0x45, 0xa4, 0x39, 0x26, 0x7b, 0x1c, 0xc8, 0x49, 0xaf, 0x3a,\n  0xdf, 0xa1, 0xee, 0x91, 0xcb, 0x09, 0x16, 0x2b, 0xb9, 0xbe, 0x83, 0x4e,\n  0xb6, 0x9d, 0xc3, 0xc6, 0xce, 0xd7, 0xcc, 0x8c, 0x4a, 0x35, 0x3e, 0x35,\n  0x05, 0xe3, 0xfe, 0xe6, 0xfc, 0xf1, 0xf0, 0xdc, 0xc4, 0xae, 0xc1, 0x83,\n  0xfb, 0xba, 0x3f, 0x91, 0xfb, 0x1d, 0xba, 0xff, 0xd3, 0x47, 0xaf, 0x69,\n  0x58, 0xdf, 0x93, 0x4d, 0x67, 0x5a, 0x5b, 0xe6, 0x03, 0x81, 0xf9, 0x8b,\n  0x9d, 0x7d, 0xd1, 0xf6, 0x68, 0x57, 0x36, 0xdb, 0xda, 0xfb, 0x97, 0x3b,\n  0xb2, 0x8f, 0xf3, 0xcb, 0x7b, 0x3b, 0x16, 0x5b, 0x7c, 0x2e, 0xa7, 0xd7,\n  0x6d, 0x9a, 0x33, 0x59, 0xc8, 0x3a, 0x37, 0xe2, 0xfd, 0xa0, 0xc5, 0xe7,\n  0x6c, 0x98, 0x39, 0x9d, 0x35, 0x04, 0x03, 0x2c, 0x12, 0x2b, 0x08, 0x61,\n  0x4a, 0x6e, 0x48, 0x0d, 0x58, 0xff, 0xb1, 0xcc, 0xc2, 0xae, 0x2b, 0xe3,\n  0x3e, 0x39, 0x2d, 0x4f, 0x86, 0xc8, 0x01, 0x21, 0xb8, 0x86, 0x8f, 0x57,\n  0xf1, 0x98, 0xaa, 0x6d, 0xbe, 0x01, 0x31, 0x39, 0xf8, 0x3c, 0x64, 0x86,\n  0x26, 0x23, 0x09, 0x03, 0x60, 0xc2, 0x28, 0xac, 0xcb, 0xa7, 0x1a, 0xc0,\n  0x3e, 0x72, 0xd2, 0x8d, 0x94, 0x69, 0x69, 0x53, 0x57, 0x47, 0xe2, 0x0f,\n  0x9c, 0x74, 0x7a, 0x0f, 0xbf, 0xf9, 0x07, 0xe8, 0x86, 0x5c, 0xe5, 0xf7,\n  0x3e, 0xf7, 0xdb, 0xa0, 0xab, 0xaf, 0xb9, 0x61, 0x2c, 0xd9, 0x90, 0xbe,\n  0x9a, 0xdd, 0x3c, 0xb8, 0xa7, 0x7a, 0xb6, 0x76, 0x34, 0xf7, 0x2b, 0x7e,\n  0x74, 0x02, 0x39, 0x46, 0xeb, 0x27, 0xab, 0x33, 0x99, 0x58, 0xa4, 0x3b,\n  0xde, 0x54, 0x50, 0x5b, 0x35, 0x04, 0x75, 0x4c, 0x55, 0xb5, 0x06, 0x35,\n  0xf8, 0x9b, 0x68, 0xd8, 0x75, 0x30, 0xaa, 0xcb, 0xee, 0x1f, 0x59, 0x74,\n  0x90, 0x08, 0x5b, 0xf2, 0x62, 0x98, 0xa8, 0xcd, 0x41, 0x5b, 0xec, 0xc5,\n  0x86, 0x78, 0x0e, 0x38, 0xe3, 0xa2, 0x4e, 0xd9, 0x91, 0xfd, 0x5b, 0xb9,\n  0xb2, 0x6a, 0xc3, 0x5c, 0xf3, 0xad, 0xcb, 0xe8, 0xb9, 0xdc, 0xaf, 0xaa,\n  0x27, 0x6f, 0x1c, 0xe9, 0xbf, 0x43, 0x4f, 0x4a, 0xab, 0xee, 0x9c, 0x6a,\n  0xce, 0x86, 0x91, 0x61, 0x6e, 0xee, 0x1f, 0x5b, 0xd6, 0xc6, 0x86, 0x8e,\n  0x75, 0xe3, 0xb1, 0xd1, 0x7a, 0xb0, 0x1e, 0xbc, 0xf7, 0x2e, 0x3f, 0xb6,\n  0x8d, 0xa2, 0xb1, 0xb9, 0xe5, 0xca, 0x87, 0x40, 0x26, 0x78, 0xdb, 0x95,\n  0x8c, 0x2d, 0x0e, 0x25, 0x9b, 0x48, 0xdd, 0x43, 0x69, 0x68, 0xdf, 0xea,\n  0x5a, 0x0e, 0xc7, 0x0e, 0xb4, 0xf7, 0xec, 0x9a, 0x9a, 0x5e, 0x1a, 0x47,\n  0x67, 0xbe, 0x1d, 0xda, 0x7d, 0xb0, 0xaa, 0xe9, 0x6a, 0xbd, 0xdd, 0x32,\n  0x6b, 0xf1, 0xb5, 0x74, 0x65, 0x9a, 0x3e, 0xb3, 0x63, 0xc7, 0xf5, 0x35,\n  0x53, 0x4d, 0x4d, 0x7b, 0x32, 0xb0, 0x66, 0x09, 0x3c, 0xae, 0xf7, 0x61,\n  0x79, 0x35, 0xce, 0x64, 0xb3, 0xbd, 0xf8, 0xcc, 0x55, 0x17, 0x15, 0xe4,\n  0x78, 0xee, 0x02, 0xfe, 0xb2, 0xac, 0x6a, 0x60, 0x6b, 0x0a, 0x37, 0xf0,\n  0x11, 0x01, 0xd5, 0x26, 0xe9, 0x96, 0x62, 0xf1, 0xb0, 0xd2, 0xe0, 0xf8,\n  0x53, 0xc4, 0x53, 0x10, 0x02, 0xc9, 0xe8, 0xbe, 0xd8, 0x31, 0x1f, 0x8e,\n  0xec, 0x6b, 0x18, 0xea, 0xa9, 0x1f, 0xae, 0xa9, 0xdc, 0xb7, 0x1f, 0xe4,\n  0x53, 0xa7, 0x6f, 0x64, 0xe6, 0x3a, 0xbd, 0x0d, 0x6f, 0x30, 0x7f, 0x4d,\n  0x22, 0x58, 0x19, 0xb0, 0xf5, 0xf5, 0x2e, 0x11, 0x09, 0x75, 0x7f, 0x2c,\n  0xac, 0xf3, 0x0e, 0xf7, 0xce, 0xcc, 0xc9, 0x7a, 0xb4, 0x1f, 0x9f, 0x5d,\n  0x16, 0xac, 0x35, 0xac, 0x7c, 0xdc, 0x69, 0x62, 0x51, 0xa1, 0x2d, 0x86,\n  0x59, 0xe5, 0xa4, 0x93, 0x09, 0xa1, 0x33, 0xd3, 0xf2, 0xc9, 0x14, 0x60,\n  0x20, 0x12, 0x8d, 0xde, 0x17, 0x50, 0xd1, 0x6d, 0x2c, 0xfc, 0xd9, 0xf0,\n  0xe1, 0x64, 0xf5, 0xd9, 0x7c, 0x34, 0xa2, 0x09, 0xac, 0xf2, 0x62, 0x5e,\n  0xa3, 0xd3, 0x80, 0xa5, 0xb5, 0x05, 0x0e, 0x23, 0xd0, 0x0d, 0x9c, 0x84,\n  0x44, 0xd1, 0x64, 0xcf, 0x72, 0xdb, 0xf2, 0x13, 0x27, 0x16, 0xc6, 0x8d,\n  0xbc, 0x7b, 0x47, 0xcd, 0x54, 0xf6, 0xce, 0x87, 0xc6, 0xd8, 0x58, 0xf3,\n  0xa1, 0x1d, 0x2b, 0x6f, 0xb9, 0x4a, 0xfc, 0x31, 0xa7, 0x9d, 0x88, 0x37,\n  0xee, 0xd8, 0xbf, 0xfc, 0x7d, 0xeb, 0xeb, 0x8f, 0x0f, 0xef, 0x22, 0x34,\n  0x09, 0xd5, 0x53, 0xbe, 0xc2, 0x5e, 0xc2, 0xba, 0x6d, 0x23, 0xb5, 0xb7,\n  0xc2, 0xb9, 0x70, 0x72, 0x1a, 0xec, 0x2c, 0x58, 0xaf, 0xf5, 0x93, 0x5f,\n  0xd1, 0x8a, 0xf4, 0xeb, 0x62, 0x56, 0x4f, 0x82, 0xfa, 0x39, 0x2b, 0x67,\n  0x72, 0xd7, 0x80, 0x4d, 0xf5, 0xce, 0x19, 0xf6, 0xd2, 0xa6, 0x16, 0xf3,\n  0x72, 0xfc, 0x1c, 0xf4, 0x24, 0x7e, 0x4e, 0x8a, 0x83, 0x5a, 0xf1, 0x22,\n  0xfe, 0xf9, 0x12, 0x79, 0xfe, 0x00, 0xfe, 0xf1, 0x79, 0x7c, 0xdd, 0xce,\n  0x1c, 0xa4, 0xcf, 0x8f, 0x68, 0xe1, 0x48, 0x23, 0x47, 0x8b, 0x06, 0x32,\n  0xb2, 0x88, 0xd7, 0x51, 0x8f, 0x74, 0xba, 0x93, 0xd3, 0xf2, 0xd6, 0xdd,\n  0xb6, 0x49, 0x7e, 0xf3, 0xda, 0x24, 0xa7, 0x81, 0xfc, 0x1f, 0x81, 0xa7,\n  0x91, 0x4a, 0x6b, 0xe2, 0xbd, 0x40, 0xdc, 0x06, 0xf0, 0x07, 0x55, 0x3d,\n  0x8a, 0xff, 0x9b, 0x81, 0x1f, 0x78, 0xa0, 0xe3, 0x07, 0xc7, 0x73, 0xff,\n  0x85, 0x0c, 0xf8, 0xaf, 0x4d, 0x38, 0x7f, 0xc6, 0xb7, 0x7e, 0xc7, 0x7c,\n  0x81, 0xc4, 0x01, 0xf0, 0x72, 0xfc, 0x12, 0xff, 0x9f, 0xdc, 0xd3, 0xf8,\n  0x2c, 0x4e, 0x43, 0x0e, 0x05, 0xd3, 0xcb, 0x7e, 0x95, 0xc4, 0xde, 0x4d,\n  0x72, 0xd1, 0x92, 0x7c, 0x0b, 0x68, 0x7b, 0x1f, 0x9b, 0x53, 0xda, 0x1e,\n  0x60, 0xbf, 0x4d, 0x6a, 0xfb, 0x4e, 0xb2, 0x7f, 0x90, 0xe3, 0xd5, 0x79,\n  0x17, 0xb9, 0x3f, 0x26, 0xdd, 0x5f, 0x97, 0xee, 0xdf, 0x29, 0xe1, 0x38,\n  0x0d, 0xb2, 0xff, 0x84, 0x79, 0x41, 0x8a, 0x69, 0x20, 0xb1, 0x78, 0x75,\n  0xac, 0x51, 0xba, 0x6e, 0x61, 0xff, 0x91, 0xfd, 0x81, 0x72, 0x7d, 0x5a,\n  0xba, 0x8e, 0xe9, 0x0b, 0x7d, 0x02, 0xd6, 0x97, 0x99, 0xa5, 0xd7, 0x11,\n  0x2b, 0x3f, 0x87, 0xfb, 0x1b, 0xf2, 0x9c, 0x26, 0xe9, 0x39, 0x97, 0xe4,\n  0xe7, 0x70, 0x1f, 0x22, 0xcf, 0x69, 0x92, 0x9e, 0x73, 0x49, 0x7e, 0x0e,\n  0x17, 0x26, 0xd7, 0xe7, 0xa5, 0xeb, 0xc7, 0x55, 0xb5, 0xd4, 0x9f, 0x96,\n  0x6b, 0xa9, 0xa3, 0x49, 0x66, 0xa3, 0x24, 0x06, 0x9f, 0xd6, 0x52, 0x97,\n  0x71, 0x72, 0xf1, 0xf9, 0x39, 0xae, 0xd4, 0xaa, 0x46, 0xbb, 0x48, 0xdf,\n  0x5a, 0xda, 0x77, 0xeb, 0xc5, 0xe2, 0x58, 0xc5, 0xad, 0x6f, 0x41, 0xde,\n  0x3b, 0xf4, 0xd5, 0x86, 0x69, 0xdf, 0xa7, 0xd5, 0x75, 0x8c, 0x9f, 0x96,\n  0xeb, 0x18, 0xe3, 0xf7, 0x7e, 0xbc, 0x6c, 0xec, 0x7f, 0x3e, 0xb7, 0x05,\n  0xf7, 0x5d, 0x96, 0x63, 0x60, 0x21, 0x36, 0xff, 0x69, 0x1a, 0xcb, 0x4f,\n  0xfa, 0xbe, 0xbb, 0x6c, 0xfc, 0xac, 0x93, 0xf4, 0x5d, 0xa0, 0x7d, 0x0f,\n  0xd3, 0x5c, 0x5b, 0xda, 0xf7, 0x15, 0x4c, 0xcc, 0x15, 0x8c, 0x9f, 0xa9,\n  0x67, 0xe6, 0xb2, 0xd3, 0x7a, 0x44, 0xed, 0xef, 0xeb, 0x46, 0xde, 0xc0,\n  0x01, 0xd9, 0x89, 0x2c, 0x77, 0x8c, 0xa0, 0x9e, 0x1e, 0x57, 0x27, 0xab,\n  0x05, 0x02, 0x56, 0x0b, 0x96, 0xd7, 0x99, 0x40, 0x7d, 0xa0, 0xbe, 0xa6,\n  0x2a, 0x95, 0x8c, 0x45, 0xdc, 0x4e, 0x8b, 0xdf, 0xea, 0x37, 0xe8, 0xf8,\n  0x0a, 0xa1, 0x82, 0xec, 0x0e, 0x33, 0x81, 0x87, 0x8d, 0x66, 0xdc, 0xb2,\n  0xed, 0x8a, 0x46, 0x1b, 0x28, 0xff, 0x2e, 0x13, 0xf3, 0xcf, 0xb2, 0xb9,\n  0x6f, 0xb6, 0xdb, 0xfd, 0x7e, 0xbb, 0x3d, 0x10, 0xf8, 0xb2, 0xc3, 0xef,\n  0x77, 0xe0, 0xbf, 0xff, 0x55, 0x15, 0xf5, 0xff, 0xca, 0xd8, 0xd8, 0xeb,\n  0x3d, 0x3e, 0x9f, 0xdb, 0xed, 0xf3, 0x79, 0xe4, 0xbf, 0x1f, 0x2f, 0x13,\n  0xf9, 0x0f, 0x73, 0xa3, 0xb1, 0xff, 0xc3, 0xd2, 0xdc, 0x1a, 0x98, 0x67,\n  0x9f, 0x09, 0x23, 0x9d, 0x56, 0x66, 0x47, 0xd5, 0x06, 0x79, 0x9e, 0xc0,\n  0xd4, 0xd9, 0x55, 0x13, 0x6f, 0xe4, 0x40, 0x98, 0x22, 0x98, 0x96, 0x1b,\n  0x10, 0x9a, 0x99, 0xaf, 0x53, 0x30, 0xf9, 0x74, 0x02, 0xf7, 0xa8, 0xbf,\n  0x42, 0x0f, 0x52, 0x9b, 0x40, 0x0a, 0xd4, 0x3c, 0x03, 0xa0, 0xec, 0xb5,\n  0x4a, 0x07, 0xd2, 0x54, 0x20, 0xb8, 0xfa, 0xc7, 0xb6, 0x69, 0x0e, 0xa0,\n  0xa5, 0xca, 0x9a, 0x36, 0x04, 0x1a, 0x6a, 0xab, 0x2b, 0xd3, 0x89, 0x58,\n  0x28, 0x58, 0xb2, 0xaa, 0x15, 0x57, 0x5c, 0xd5, 0x32, 0x79, 0x05, 0xff,\n  0x56, 0xba, 0xac, 0x8f, 0xa8, 0x33, 0x0b, 0xb8, 0xe1, 0x72, 0x0b, 0x5b,\n  0x92, 0x5d, 0x90, 0xa7, 0x19, 0xde, 0xcb, 0xe8, 0x19, 0x17, 0x13, 0x63,\n  0x32, 0x50, 0xa3, 0x05, 0xf3, 0x27, 0x7c, 0x16, 0x41, 0x84, 0x31, 0x23,\n  0x55, 0xc6, 0xc0, 0x93, 0x25, 0xf4, 0x23, 0x72, 0xec, 0xf1, 0x52, 0xe2,\n  0x89, 0xc7, 0x3d, 0x6e, 0xa3, 0x81, 0x61, 0xe0, 0x50, 0x6c, 0x6e, 0xac,\n  0xab, 0xad, 0x4a, 0x87, 0x02, 0xee, 0x98, 0x27, 0x66, 0xb3, 0x18, 0x5c,\n  0x46, 0x17, 0x7e, 0xb2, 0x9e, 0x94, 0xc6, 0x40, 0x24, 0x35, 0xd7, 0x69,\n  0xc6, 0xdd, 0x55, 0xd3, 0x6c, 0x51, 0xfd, 0xbb, 0x5c, 0xda, 0x48, 0x87,\n  0xbb, 0xd3, 0x72, 0xcc, 0xd0, 0xdc, 0xe5, 0x3e, 0x84, 0x67, 0x69, 0xc7,\n  0xb3, 0xfe, 0x00, 0xfc, 0x8d, 0x67, 0xfd, 0x98, 0x8a, 0x90, 0x5e, 0x6f,\n  0x0c, 0x8c, 0xc5, 0xf4, 0xb6, 0xe6, 0x26, 0xdb, 0x6d, 0xea, 0x29, 0xc3,\n  0xdf, 0x03, 0x97, 0xa5, 0xa7, 0x75, 0x69, 0xde, 0x6d, 0xcc, 0x37, 0xb2,\n  0x06, 0x32, 0xef, 0x14, 0xa6, 0x2a, 0x59, 0x05, 0xae, 0x25, 0x4b, 0x40,\n  0x21, 0xa6, 0x28, 0x7d, 0x70, 0xab, 0x34, 0x10, 0x7c, 0x7b, 0xba, 0x6a,\n  0xbc, 0x62, 0x9f, 0x12, 0xca, 0xaa, 0x57, 0x75, 0xc1, 0x4d, 0x49, 0x2f,\n  0x2d, 0x5e, 0xe9, 0xcb, 0xd0, 0x96, 0xb2, 0xe4, 0x6d, 0xf1, 0xb6, 0x96,\n  0xa6, 0x06, 0xbc, 0x67, 0x93, 0x89, 0x92, 0x45, 0x27, 0x98, 0x4e, 0xaf,\n  0x61, 0xd1, 0x4b, 0x29, 0x6c, 0x6b, 0xbb, 0x45, 0x3f, 0x55, 0x90, 0xc0,\n  0xf2, 0x8d, 0xcb, 0x2c, 0x7b, 0x29, 0xb5, 0xc9, 0xb4, 0x16, 0x27, 0x71,\n  0x9a, 0xd5, 0x4c, 0x2f, 0xb3, 0x3f, 0xbb, 0x68, 0xd6, 0x61, 0x35, 0x1d,\n  0x13, 0x1b, 0xde, 0x5b, 0x04, 0xe0, 0x8a, 0xe5, 0xd9, 0x0b, 0x58, 0x74,\n  0x30, 0x09, 0x46, 0x8e, 0xd3, 0xf2, 0x1c, 0x5d, 0x83, 0xe3, 0xea, 0xe9,\n  0xd7, 0xd4, 0x44, 0xc2, 0x0e, 0xac, 0x16, 0xd4, 0xf4, 0xd6, 0xf4, 0x76,\n  0x75, 0x64, 0x5a, 0x9b, 0x1a, 0x52, 0x89, 0x70, 0x75, 0xa4, 0x1a, 0xcb,\n  0xbd, 0x21, 0x47, 0x08, 0x54, 0x76, 0x97, 0xb3, 0xc2, 0xe4, 0xa9, 0x41,\n  0xf5, 0x2c, 0xcd, 0x09, 0xff, 0xdf, 0x50, 0x5d, 0xd6, 0x54, 0xdb, 0x68,\n  0xeb, 0xf1, 0x75, 0x78, 0xfd, 0x1d, 0xbe, 0x3e, 0x7b, 0x53, 0x9d, 0xf1,\n  0xfe, 0xcb, 0x50, 0xdf, 0x1b, 0xdc, 0x8d, 0x0d, 0x76, 0x93, 0x35, 0xe5,\n  0xf7, 0xa7, 0xac, 0x26, 0x7b, 0x43, 0xa3, 0xfb, 0xae, 0xd7, 0x44, 0x84,\n  0x32, 0x0d, 0x9e, 0x91, 0xd6, 0xa3, 0x8f, 0x79, 0x29, 0x6b, 0xa4, 0xeb,\n  0x51, 0x8f, 0xf4, 0x3a, 0x99, 0x08, 0xeb, 0xe8, 0xd2, 0x18, 0xc9, 0xd2,\n  0x98, 0x05, 0x13, 0x07, 0x76, 0x17, 0x90, 0xae, 0x8e, 0x4f, 0x57, 0x18,\n  0x58, 0x9d, 0x6e, 0x03, 0x40, 0xce, 0xd4, 0x25, 0x28, 0x80, 0x0a, 0x9b,\n  0xae, 0xdc, 0x89, 0xc0, 0x2c, 0xeb, 0xf5, 0x32, 0x4a, 0x98, 0x3f, 0xdb,\n  0xa0, 0xee, 0x83, 0xdb, 0x92, 0x6e, 0x78, 0x38, 0xc7, 0xb7, 0xe9, 0x01,\n  0x25, 0x26, 0x94, 0x8f, 0xd1, 0x57, 0xd3, 0xd7, 0xdd, 0xd9, 0x8e, 0x69,\n  0xb1, 0xae, 0xb6, 0xf4, 0x73, 0x58, 0xfe, 0xbc, 0xcf, 0x51, 0x86, 0xe3,\n  0x89, 0x57, 0xfa, 0x1e, 0x85, 0x84, 0xf9, 0xd2, 0x95, 0xbf, 0xc8, 0xf6,\n  0xf4, 0x59, 0xc0, 0x0b, 0x75, 0x40, 0x9d, 0x68, 0x0a, 0x8e, 0x51, 0x00,\n  0xc1, 0x86, 0xf5, 0xc9, 0x1f, 0xa4, 0xff, 0x0f, 0xbc, 0x90, 0xa4, 0xe7,\n  0xc2, 0x92, 0xfc, 0x19, 0xc7, 0x29, 0x1a, 0xb6, 0x76, 0xb8, 0xbb, 0xdd,\n  0x5d, 0x4d, 0xc6, 0xcc, 0xf6, 0x87, 0x2a, 0xef, 0x8d, 0x8d, 0x05, 0x8c,\n  0xb6, 0xa6, 0x66, 0x9b, 0xfe, 0x83, 0x7f, 0xde, 0xd9, 0x5a, 0xc0, 0x0b,\n  0xc9, 0xbc, 0x0b, 0x78, 0xa1, 0x21, 0xbf, 0x04, 0xaf, 0xf5, 0x8c, 0x6d,\n  0xbc, 0x62, 0x9f, 0x52, 0x5e, 0xa8, 0xea, 0xa2, 0x3a, 0x67, 0xff, 0x7f,\n  0xe1, 0x85, 0xaf, 0x65, 0xd1, 0xcb, 0xd0, 0x9e, 0x61, 0xbb, 0x55, 0x2f,\n  0x3c, 0x73, 0xd7, 0x2f, 0xb3, 0xee, 0x25, 0xc4, 0x26, 0x48, 0xb2, 0xa9,\n  0x2c, 0xab, 0xc5, 0x99, 0x3a, 0xc8, 0x14, 0xaf, 0x42, 0x7a, 0x2d, 0xd8,\n  0x2c, 0xcb, 0x08, 0x1a, 0x15, 0x05, 0xb8, 0xf5, 0x66, 0x09, 0xb7, 0x3e,\n  0x91, 0x90, 0xa5, 0x8c, 0x44, 0x5d, 0xa2, 0x2e, 0x10, 0x0f, 0x48, 0xf0,\n  0x86, 0x25, 0x72, 0x86, 0xe5, 0x0a, 0x72, 0x46, 0x29, 0x8a, 0xf0, 0xd7,\n  0x4b, 0x85, 0x8c, 0x77, 0x94, 0xc5, 0xae, 0x2f, 0x27, 0xc5, 0xbd, 0xfa,\n  0x50, 0x29, 0x64, 0xb0, 0x20, 0xe1, 0x05, 0xcb, 0x32, 0x5c, 0x3b, 0x33,\n  0xc8, 0xfc, 0x4f, 0xd6, 0x9c, 0x41, 0x7a, 0x4d, 0x2b, 0xd2, 0xe9, 0x63,\n  0x04, 0xbf, 0x8b, 0x12, 0x5b, 0x9b, 0x49, 0x5e, 0x02, 0xb9, 0xe0, 0x0d,\n  0x25, 0x9f, 0x0a, 0xde, 0x4c, 0xc8, 0x87, 0xc0, 0xc5, 0x5b, 0xca, 0xd5,\n  0xdf, 0x01, 0xb2, 0xeb, 0xfa, 0x33, 0x7a, 0x17, 0x95, 0xcd, 0x01, 0xd8,\n  0x74, 0xb9, 0x33, 0x69, 0x0e, 0x59, 0x3b, 0x10, 0xf6, 0x2d, 0x3d, 0xe8,\n  0x32, 0x5d, 0x01, 0x0b, 0x38, 0x28, 0x7d, 0x0c, 0x40, 0x35, 0xc0, 0xbb,\n  0xbf, 0x26, 0x9d, 0x8c, 0x46, 0x02, 0xed, 0xc1, 0xf6, 0x92, 0xcf, 0x61,\n  0xbd, 0xc2, 0xe7, 0x78, 0xad, 0x18, 0xc0, 0x1f, 0x2a, 0xfd, 0x48, 0x43,\n  0x97, 0x87, 0xfc, 0x2d, 0x27, 0x1a, 0xbe, 0xf3, 0x8a, 0x80, 0xbf, 0x72,\n  0xbd, 0x85, 0x9f, 0x91, 0x6f, 0xe7, 0x66, 0xa2, 0x80, 0xc6, 0x1a, 0x44,\n  0x5a, 0x0d, 0x9a, 0xd2, 0xc9, 0xeb, 0xa5, 0xc7, 0xda, 0x1b, 0x59, 0x2c,\n  0x23, 0xa2, 0xd8, 0xb5, 0x47, 0x09, 0x04, 0xa7, 0x01, 0x32, 0x3c, 0x4f,\n  0x08, 0x33, 0x1e, 0x8f, 0x85, 0xac, 0x8d, 0x27, 0xea, 0x89, 0x5a, 0xdc,\n  0x16, 0x37, 0xb5, 0xff, 0xa8, 0xd6, 0xc4, 0x54, 0x66, 0x4d, 0xca, 0x92,\n  0xe5, 0x23, 0x8e, 0x70, 0xd8, 0xe1, 0x0a, 0x85, 0x2e, 0x95, 0x25, 0xc7,\n  0x9f, 0x8d, 0x8d, 0xdd, 0xe8, 0x0f, 0x06, 0xf0, 0x7f, 0x41, 0xff, 0xab,\n  0x6f, 0xbc, 0x4c, 0xdd, 0x9b, 0x11, 0x32, 0x97, 0x1a, 0xcc, 0xef, 0x9e,\n  0xca, 0x9a, 0xab, 0x90, 0x96, 0xaf, 0x44, 0xa2, 0xd6, 0x85, 0x4f, 0x5e,\n  0x99, 0x0a, 0x5b, 0x94, 0x8d, 0x88, 0x75, 0x4a, 0x9d, 0x5e, 0xd4, 0xd1,\n  0xaa, 0xbd, 0x46, 0x1a, 0x42, 0xa3, 0xd5, 0xf2, 0xab, 0x26, 0x1a, 0x64,\n  0xa9, 0xd7, 0x0b, 0xab, 0x4a, 0x08, 0x57, 0xfb, 0x6b, 0xed, 0x85, 0xdb,\n  0x53, 0x52, 0x94, 0xf1, 0x42, 0x12, 0x94, 0x78, 0x00, 0x5c, 0x3d, 0x95,\n  0x88, 0x86, 0xfd, 0x5e, 0xa7, 0xc3, 0x52, 0x63, 0xad, 0xb9, 0x82, 0x0e,\n  0xe6, 0x7e, 0xed, 0xa4, 0xf2, 0x56, 0x69, 0xe1, 0x42, 0x97, 0x27, 0x91,\n  0x11, 0xd5, 0x0a, 0x7e, 0xe8, 0x35, 0x60, 0x41, 0x83, 0xa6, 0xcd, 0x65,\n  0xb8, 0xbd, 0x58, 0x1f, 0x7d, 0x3d, 0xd1, 0x59, 0xa7, 0x50, 0x63, 0x39,\n  0x3d, 0x9b, 0xab, 0x63, 0x9f, 0xc0, 0x6d, 0x3e, 0x40, 0x6c, 0x06, 0x53,\n  0xcc, 0x9f, 0x94, 0x98, 0xe3, 0x2f, 0x93, 0x9a, 0xbd, 0x0b, 0xd9, 0x3d,\n  0xe0, 0x91, 0x36, 0x22, 0x91, 0xf5, 0x22, 0x0e, 0x32, 0x34, 0x38, 0x7e,\n  0x0a, 0xaf, 0xa1, 0x46, 0x10, 0x35, 0xeb, 0x5a, 0x24, 0xe8, 0x90, 0x1c,\n  0x6b, 0x2c, 0xb9, 0x6a, 0x88, 0xdb, 0x5d, 0x2f, 0xdb, 0xc6, 0x54, 0xd0,\n  0xae, 0xbe, 0x7c, 0x1a, 0x86, 0xa1, 0x28, 0x0d, 0xa3, 0x34, 0xe2, 0x18,\n  0xfe, 0x10, 0x23, 0x8b, 0x46, 0x83, 0xde, 0x7d, 0xee, 0x5d, 0x93, 0x0b,\n  0x4f, 0x5c, 0xdf, 0x73, 0xa2, 0x3e, 0x96, 0x5a, 0x6b, 0x39, 0xff, 0x20,\n  0x8d, 0x36, 0x7e, 0xf8, 0xe1, 0x77, 0xff, 0x31, 0x9b, 0x6d, 0xbd, 0x46,\n  0xbf, 0xf4, 0x97, 0xa7, 0x4e, 0xff, 0xd5, 0x7e, 0x97, 0x63, 0xc6, 0xea,\n  0x79, 0xdb, 0x03, 0x8b, 0x77, 0x8d, 0xea, 0xc5, 0x89, 0xb1, 0x99, 0xb9,\n  0xf7, 0x8c, 0x9d, 0xb7, 0xba, 0x19, 0x39, 0xce, 0x67, 0x82, 0x8d, 0x31,\n  0x09, 0xa6, 0x89, 0xf9, 0xf7, 0x6c, 0x45, 0x80, 0x63, 0xf5, 0x3a, 0x0b,\n  0x12, 0xb8, 0x0a, 0x52, 0x2a, 0x5e, 0x3a, 0x47, 0x45, 0xc4, 0x6a, 0x10,\n  0xa0, 0xb7, 0x1e, 0x05, 0xf4, 0x5e, 0x66, 0x15, 0x19, 0xa8, 0x09, 0x4d,\n  0x12, 0xac, 0x4e, 0x28, 0x65, 0x60, 0x21, 0xfa, 0x84, 0x86, 0xd8, 0x35,\n  0xe6, 0xfb, 0xe0, 0x89, 0x6f, 0x4c, 0xd3, 0x8e, 0x06, 0xb4, 0x7d, 0x3f,\n  0xac, 0x53, 0xe8, 0x19, 0x2d, 0xab, 0xd7, 0x1e, 0xbb, 0x5c, 0xd7, 0x7c,\n  0x07, 0xcc, 0xbc, 0xa2, 0xa9, 0x24, 0x04, 0xb0, 0x24, 0x9b, 0x52, 0x4d,\n  0x91, 0x10, 0x98, 0x19, 0xed, 0x56, 0xb3, 0x51, 0x4a, 0x25, 0x4b, 0xa0,\n  0x84, 0x49, 0x72, 0x21, 0xb5, 0xb4, 0x93, 0xa0, 0x43, 0x12, 0xa6, 0x46,\n  0x2b, 0xa2, 0xc3, 0x1a, 0x82, 0x3f, 0x52, 0xa6, 0x47, 0xa5, 0x50, 0x35,\n  0x98, 0xee, 0xec, 0x99, 0x3d, 0x21, 0xc1, 0x38, 0xda, 0xde, 0x6f, 0xbe,\n  0xf6, 0xe8, 0x0d, 0x93, 0xb3, 0x37, 0x76, 0x0c, 0x19, 0xdf, 0xff, 0xb7,\n  0x2c, 0xe2, 0xdb, 0x4e, 0x1f, 0xbd, 0xfe, 0xfa, 0xb3, 0x43, 0x3b, 0x26,\n  0x46, 0xe7, 0x77, 0x4c, 0xb1, 0xb1, 0xca, 0xaa, 0xb1, 0xcd, 0x7f, 0x1d,\n  0xeb, 0x9d, 0x8a, 0xcd, 0x57, 0x47, 0xc3, 0x63, 0x03, 0xd6, 0x94, 0x61,\n  0xfe, 0x81, 0xdb, 0xce, 0xbd, 0x69, 0xc7, 0xa1, 0xfd, 0x07, 0xd6, 0xe6,\n  0xf6, 0x59, 0x8e, 0x1c, 0x50, 0xec, 0x2a, 0x6f, 0x24, 0xb6, 0x91, 0x6a,\n  0xc9, 0x36, 0xf2, 0x85, 0x32, 0x58, 0xd2, 0x16, 0xd6, 0x46, 0x6c, 0x23,\n  0x3b, 0xa8, 0x6d, 0x64, 0x81, 0x51, 0xf2, 0xf8, 0x4e, 0x90, 0xbe, 0xf5,\n  0x52, 0xdf, 0xbb, 0xcb, 0xd9, 0x73, 0x58, 0x13, 0xf7, 0x3d, 0xdc, 0x66,\n  0x46, 0xb2, 0xf9, 0x3c, 0xcd, 0x7c, 0x9f, 0xb6, 0xf9, 0xbe, 0xfc, 0xfc,\n  0xde, 0xad, 0x84, 0x1a, 0x8f, 0x0f, 0xcd, 0x21, 0x87, 0xf4, 0xde, 0x84,\n  0x1a, 0x8f, 0x0f, 0xcd, 0x31, 0x9f, 0xcd, 0xb7, 0x27, 0x7b, 0x83, 0xe0,\n  0x9d, 0x60, 0xba, 0x7f, 0x16, 0x70, 0xd2, 0x71, 0xbf, 0x48, 0x09, 0x4e,\n  0x3a, 0x7d, 0xc6, 0x13, 0xd2, 0x33, 0x52, 0x68, 0xea, 0x5a, 0xe5, 0x49,\n  0x79, 0xdf, 0x12, 0xcc, 0x81, 0xbb, 0x47, 0x9a, 0xc3, 0x60, 0xc9, 0xfc,\n  0xcd, 0x5b, 0x16, 0xf4, 0x55, 0x92, 0xcf, 0xff, 0x2f, 0x74, 0xfe, 0x3e,\n  0x26, 0x6f, 0x07, 0x24, 0x36, 0xb5, 0x34, 0xb1, 0x91, 0x11, 0x3b, 0xa0,\n  0x62, 0xf3, 0xcb, 0x5f, 0x27, 0x36, 0x3f, 0xc5, 0xd6, 0x77, 0x49, 0xb2,\n  0xf5, 0x89, 0xd4, 0xd6, 0x57, 0xfa, 0x0d, 0x98, 0x1b, 0x50, 0xd3, 0x15,\n  0xbe, 0x01, 0xe0, 0x11, 0x50, 0x5f, 0xd8, 0xea, 0xd6, 0x1f, 0xb9, 0x39,\n  0x12, 0x5f, 0xb6, 0x46, 0x09, 0x3b, 0x02, 0x2e, 0x1b, 0x0e, 0x69, 0xd6,\n  0x59, 0xe2, 0x94, 0x95, 0x51, 0x17, 0x85, 0x55, 0x02, 0x0b, 0x40, 0xa2,\n  0x09, 0x12, 0x65, 0x9a, 0x90, 0xe3, 0x9e, 0x36, 0x94, 0x43, 0x0a, 0xc0,\n  0xc1, 0xe2, 0x65, 0xbc, 0x76, 0xa8, 0x5b, 0x6e, 0xb5, 0x82, 0xf3, 0x0e,\n  0x2c, 0xb9, 0xd1, 0x82, 0x28, 0x4b, 0x0d, 0xad, 0x2c, 0x6f, 0x5d, 0x5d,\n  0x42, 0x95, 0x4b, 0x0d, 0xf5, 0x8d, 0xb5, 0x4b, 0x4b, 0x2b, 0x0b, 0xfb,\n  0x73, 0xdf, 0x62, 0x9f, 0xcd, 0x7d, 0x1d, 0xd5, 0x6f, 0x7e, 0xbb, 0xae,\n  0xb9, 0xad, 0x1a, 0x9d, 0xcd, 0xbd, 0x61, 0xc7, 0xe1, 0x83, 0xb3, 0xef,\n  0xcf, 0x7d, 0x8c, 0xe6, 0x0c, 0x80, 0xed, 0x72, 0x99, 0x7d, 0x81, 0xb1,\n  0x32, 0x01, 0x66, 0xf7, 0x27, 0xdc, 0x66, 0x1d, 0x87, 0xd5, 0x74, 0x69,\n  0x2f, 0xdb, 0x69, 0xca, 0x00, 0xd6, 0x97, 0xa4, 0x70, 0xa5, 0x53, 0x88,\n  0x44, 0x4c, 0xd3, 0xf0, 0x8c, 0x82, 0x40, 0xa6, 0x53, 0x60, 0x68, 0xb6,\n  0xdb, 0x6d, 0x88, 0xb1, 0x05, 0xec, 0x01, 0xf0, 0x96, 0x31, 0x56, 0x64,\n  0xd5, 0x28, 0x86, 0x6f, 0xac, 0x10, 0xa9, 0x0c, 0xdf, 0x1a, 0xa7, 0x95,\n  0x5a, 0xbe, 0x2f, 0xf4, 0xaf, 0x75, 0x54, 0xaf, 0xbc, 0xef, 0x26, 0x88,\n  0xff, 0x0c, 0xad, 0xf4, 0x8c, 0xce, 0xc7, 0x3f, 0xf0, 0xd8, 0x14, 0xfb,\n  0x42, 0xeb, 0xc9, 0x5d, 0x43, 0x17, 0xce, 0x9f, 0x6d, 0xfa, 0x31, 0xf7,\n  0xe9, 0xd5, 0xba, 0xbe, 0x99, 0xce, 0xf5, 0x91, 0xdc, 0x07, 0xc6, 0xbe,\n  0x7e, 0xfb, 0xae, 0x5d, 0x79, 0x5a, 0x7f, 0x3b, 0xf9, 0x46, 0x4d, 0x12,\n  0xee, 0xc3, 0xd7, 0x4a, 0xbe, 0x11, 0xc4, 0x54, 0x7b, 0xc9, 0x37, 0x9a,\n  0xcf, 0xe3, 0x3e, 0x94, 0xda, 0x4c, 0x0d, 0x4f, 0xb2, 0x87, 0x29, 0x2f,\n  0x67, 0xb7, 0xb3, 0x99, 0x42, 0x9b, 0x7e, 0x55, 0xdf, 0x47, 0x94, 0xbe,\n  0x4f, 0xa1, 0xbe, 0x6d, 0xec, 0xad, 0x3f, 0x52, 0xfa, 0x3e, 0x85, 0xbc,\n  0xe4, 0xfa, 0x3c, 0xc1, 0xfc, 0x7e, 0x5a, 0xc6, 0x89, 0xc7, 0xcf, 0xdc,\n  0x4b, 0xc7, 0xcc, 0x16, 0xe3, 0xc4, 0xe7, 0x94, 0x7a, 0x00, 0x4f, 0x42,\n  0x1d, 0x6a, 0x05, 0x63, 0xfe, 0x11, 0xa5, 0xef, 0x53, 0x65, 0x69, 0x12,\n  0xfa, 0xfe, 0x48, 0xe9, 0xfb, 0x14, 0x0a, 0x92, 0x3d, 0xff, 0x2c, 0xee,\n  0xd1, 0x94, 0xb7, 0xf3, 0x1a, 0x9e, 0x44, 0x5f, 0x2d, 0x7e, 0xef, 0xd6,\n  0x63, 0x0c, 0xe0, 0x31, 0xc8, 0x76, 0x5e, 0x68, 0x43, 0x73, 0xcc, 0xcd,\n  0xf8, 0xfa, 0x08, 0x79, 0x2f, 0xed, 0xfb, 0x14, 0xf3, 0x64, 0x09, 0x4f,\n  0xf9, 0x4f, 0x7c, 0x27, 0x00, 0xef, 0x95, 0xfa, 0x3e, 0xc5, 0xdc, 0x59,\n  0xce, 0x46, 0x8c, 0xe7, 0xf2, 0xa1, 0x92, 0x75, 0x2e, 0xb4, 0x11, 0x43,\n  0x9b, 0x3d, 0xaa, 0xbe, 0x8f, 0x28, 0x7d, 0x9f, 0x42, 0xf7, 0x6e, 0x63,\n  0x5f, 0xfe, 0x91, 0xd2, 0xf7, 0x29, 0xd4, 0x40, 0xae, 0xef, 0x85, 0x00,\n  0x22, 0xf2, 0xde, 0x8c, 0xf4, 0xde, 0x03, 0x25, 0xef, 0xc5, 0x9b, 0x09,\n  0xbd, 0x91, 0xbc, 0x77, 0x8f, 0xf4, 0x5e, 0x97, 0x42, 0x57, 0x2b, 0xe4,\n  0xbd, 0x19, 0xe9, 0xbd, 0xed, 0x25, 0xef, 0xdd, 0x4d, 0xfa, 0xfe, 0x48,\n  0xe9, 0xfb, 0x14, 0x73, 0xb1, 0x9c, 0x5d, 0x1b, 0x3f, 0xf3, 0xad, 0x25,\n  0xdf, 0xb7, 0xd0, 0xae, 0x0d, 0x6d, 0xf6, 0xa9, 0xfa, 0x3e, 0xa2, 0xf4,\n  0x7d, 0x0a, 0x5d, 0xb3, 0x8d, 0x4d, 0xfc, 0x47, 0x4a, 0xdf, 0xa7, 0x50,\n  0x86, 0xf0, 0x9c, 0xd4, 0xd6, 0x14, 0xab, 0x23, 0xb1, 0x86, 0x91, 0x6c,\n  0x30, 0xe6, 0x71, 0x9b, 0x8c, 0x3a, 0xc4, 0x68, 0x99, 0x09, 0x39, 0x6a,\n  0xfd, 0x34, 0x33, 0x03, 0x79, 0xaa, 0x2c, 0xf8, 0xd2, 0x32, 0x7d, 0x1c,\n  0xcd, 0xe4, 0x11, 0xd3, 0xea, 0x88, 0x3c, 0xc9, 0xc9, 0x27, 0x92, 0x6c,\n  0x73, 0x4d, 0xfa, 0xcc, 0x23, 0x7b, 0x53, 0xbd, 0x99, 0xf8, 0x54, 0xa5,\n  0x75, 0xe5, 0x86, 0xf6, 0xd1, 0xbe, 0xee, 0x83, 0x75, 0x35, 0x9d, 0xe7,\n  0x06, 0x3b, 0x8f, 0x0c, 0xf4, 0xb7, 0xc6, 0xba, 0x93, 0x87, 0x5e, 0xf8,\n  0xdb, 0xab, 0x82, 0x3d, 0x83, 0x53, 0x75, 0x3d, 0xa3, 0x3e, 0x93, 0x53,\n  0x3f, 0xea, 0xad, 0xef, 0xad, 0x6b, 0xe9, 0x0a, 0x87, 0x7a, 0x2b, 0x63,\n  0xf1, 0x99, 0xa1, 0xae, 0x5d, 0x41, 0x4b, 0xf3, 0x44, 0xe6, 0xc0, 0xdd,\n  0x07, 0x61, 0x6c, 0x21, 0xcc, 0xab, 0xff, 0x81, 0xc4, 0x86, 0x24, 0xb3,\n  0x31, 0x17, 0x02, 0x43, 0x43, 0xc4, 0x69, 0xd0, 0x83, 0x83, 0x37, 0x3f,\n  0xc0, 0xb3, 0xcc, 0x8c, 0xcf, 0x63, 0xb7, 0xd2, 0x01, 0x12, 0xae, 0xb0,\n  0xed, 0x00, 0xa9, 0x07, 0x2d, 0xf4, 0xd8, 0x13, 0x75, 0x95, 0xc1, 0xa1,\n  0xa4, 0x75, 0x61, 0x25, 0xd1, 0xd9, 0x5c, 0x3b, 0x9d, 0x0c, 0xd5, 0x2f,\n  0x37, 0xb5, 0x2f, 0x64, 0x1a, 0x6a, 0x6a, 0xfb, 0x8f, 0x7e, 0xfa, 0xe2,\n  0x6c, 0x6c, 0x63, 0x4f, 0x4b, 0xb7, 0xc3, 0xe8, 0xd0, 0x0d, 0xba, 0x1b,\n  0xda, 0x62, 0xf5, 0x4d, 0x0e, 0x47, 0xd6, 0xe7, 0x8c, 0x4e, 0xf4, 0x34,\n  0x4c, 0xf8, 0x9d, 0xd3, 0xc3, 0x7b, 0x6f, 0x98, 0x52, 0xbe, 0xf5, 0xdd,\n  0xe4, 0x7b, 0xd5, 0x48, 0x67, 0xcd, 0xfb, 0x4a, 0x68, 0xfb, 0x45, 0xe0,\n  0x21, 0xe4, 0xbc, 0x9c, 0x94, 0xce, 0xcb, 0x8f, 0x14, 0x9e, 0x97, 0x84,\n  0xe7, 0x5b, 0xd8, 0xfb, 0x31, 0xff, 0x74, 0x32, 0x0b, 0xcf, 0x58, 0x01,\n  0xf2, 0x45, 0x09, 0x2f, 0x82, 0x60, 0x1c, 0x29, 0xdb, 0x84, 0x46, 0x6c,\n  0x4b, 0xfc, 0xd3, 0x4f, 0xbd, 0xc5, 0x72, 0x50, 0x51, 0xc1, 0x5d, 0x12,\n  0xd9, 0x02, 0x70, 0x08, 0x24, 0xbc, 0xc8, 0x89, 0x9c, 0x12, 0x07, 0x95,\n  0xe3, 0xb7, 0x69, 0x96, 0x91, 0xbb, 0xa5, 0x8f, 0x45, 0x0f, 0x5f, 0x77,\n  0xf7, 0xd2, 0xcc, 0xd2, 0x35, 0x2b, 0xc0, 0x3a, 0xdd, 0xa3, 0x3b, 0xd9,\n  0x17, 0x6e, 0x7b, 0x60, 0x73, 0x88, 0xfd, 0xcc, 0x81, 0x03, 0x37, 0x1d,\n  0xcd, 0x2d, 0xb2, 0xcf, 0xed, 0x0f, 0xd7, 0x7b, 0x29, 0xbe, 0xec, 0xdb,\n  0x49, 0xbe, 0x55, 0x35, 0xd6, 0x47, 0x87, 0xd0, 0xb8, 0x14, 0xa3, 0x63,\n  0x47, 0xbc, 0x38, 0x10, 0xd0, 0x70, 0x1a, 0x5d, 0x25, 0x1e, 0xb2, 0x86,\n  0x9b, 0x92, 0x72, 0x64, 0x0a, 0x6f, 0x08, 0x1a, 0x12, 0xbc, 0x23, 0x5f,\n  0xd3, 0xca, 0xd7, 0x16, 0xa5, 0xe8, 0x1d, 0x92, 0x14, 0x79, 0x0f, 0x56,\n  0x38, 0x74, 0x1a, 0x5e, 0x47, 0xb1, 0x71, 0xe4, 0xd8, 0xc3, 0xb3, 0xd3,\n  0x06, 0xad, 0x9e, 0x83, 0x64, 0x4f, 0x08, 0x03, 0x3b, 0x83, 0xe4, 0x24,\n  0x9c, 0xf6, 0x2b, 0x77, 0x21, 0x87, 0xde, 0x09, 0xa5, 0x3f, 0x23, 0x77,\n  0xaf, 0x22, 0xf8, 0x86, 0x72, 0x77, 0x6d, 0x99, 0xee, 0x48, 0xab, 0x95,\n  0x3a, 0xeb, 0x91, 0xaa, 0x2b, 0xee, 0xc5, 0xb1, 0x50, 0x98, 0x4d, 0xdd,\n  0xf5, 0x4a, 0xbd, 0x20, 0xff, 0xc7, 0xdb, 0xd9, 0x51, 0x5b, 0xd3, 0xdf,\n  0xdb, 0x31, 0xd4, 0x39, 0xd4, 0xd2, 0x54, 0xd3, 0x5e, 0xdb, 0x9e, 0x48,\n  0xba, 0x13, 0x95, 0x16, 0xa3, 0x29, 0x50, 0x23, 0xa4, 0xdb, 0xda, 0x53,\n  0xa9, 0xbc, 0x56, 0xa2, 0xe4, 0xa5, 0xe2, 0x73, 0xd8, 0x8d, 0xcf, 0x38,\n  0x97, 0x1c, 0x00, 0xad, 0xd1, 0x24, 0xd5, 0x09, 0xaa, 0x49, 0x25, 0x83,\n  0xdd, 0xe5, 0x62, 0x5b, 0xe6, 0x75, 0x36, 0xab, 0x95, 0x17, 0xfc, 0xbb,\n  0xe6, 0x0e, 0x9f, 0x93, 0xd3, 0x56, 0x17, 0xcc, 0x89, 0xd5, 0xe6, 0xde,\n  0x81, 0xa5, 0xa3, 0x9e, 0xb4, 0x55, 0xa3, 0xcd, 0xfd, 0x52, 0x4a, 0x5e,\n  0x45, 0xff, 0xd4, 0x51, 0xef, 0xf7, 0xa7, 0x3b, 0x6c, 0xe6, 0xc8, 0x31,\n  0x61, 0x57, 0x97, 0x39, 0xa0, 0x6f, 0x6d, 0x51, 0xf2, 0x59, 0xbf, 0xb1,\n  0xf9, 0x8d, 0x4c, 0xb0, 0xaf, 0x1e, 0xa1, 0xee, 0xba, 0xd6, 0x1d, 0x3c,\n  0xef, 0xed, 0xbc, 0x4f, 0xc9, 0x6c, 0xd5, 0x04, 0x3d, 0x66, 0x4f, 0x6d,\n  0x9a, 0xe7, 0xf1, 0x59, 0xdf, 0x85, 0x79, 0xc8, 0xd5, 0x58, 0x3e, 0x09,\n  0x63, 0x9a, 0xef, 0xc9, 0x76, 0x7a, 0xb1, 0x10, 0x82, 0xe9, 0x15, 0xdf,\n  0x80, 0xca, 0x1b, 0xc7, 0x38, 0x12, 0x0a, 0x97, 0x8f, 0x8f, 0xc5, 0x5a,\n  0x47, 0x34, 0x82, 0x98, 0x74, 0x32, 0x52, 0x13, 0xad, 0x71, 0x3a, 0xac,\n  0x15, 0x46, 0x03, 0x44, 0x5b, 0x68, 0xf3, 0x1a, 0x47, 0x3b, 0x99, 0xb0,\n  0x2c, 0x0d, 0xb7, 0xe4, 0xb7, 0x68, 0x5a, 0x9e, 0x25, 0x84, 0xef, 0x4d,\n  0xcf, 0xdc, 0x3a, 0x31, 0x3b, 0xda, 0xd5, 0xbe, 0x34, 0x31, 0x33, 0x3b,\n  0xb1, 0xd4, 0xd1, 0x3d, 0xbc, 0x6b, 0xf4, 0xb6, 0x5d, 0x2b, 0x0b, 0x8b,\n  0x2b, 0xcb, 0x7b, 0x17, 0xf4, 0x9d, 0x27, 0xa7, 0x77, 0x1e, 0x72, 0x7a,\n  0x0e, 0x8d, 0x2c, 0x2c, 0x0c, 0x93, 0xff, 0x8f, 0xae, 0x79, 0x9d, 0x87,\n  0xe6, 0xa7, 0x4f, 0x76, 0xce, 0xec, 0x9d, 0x9e, 0xde, 0xbd, 0x7b, 0x7a,\n  0x7a, 0x2f, 0x95, 0x53, 0x9a, 0x49, 0xbe, 0xfb, 0x25, 0x62, 0x49, 0x3e,\n  0xf4, 0x71, 0x69, 0xe8, 0x94, 0x28, 0xfc, 0xea, 0x19, 0x9c, 0x2c, 0x9c,\n  0x01, 0xde, 0x6e, 0x90, 0xbd, 0x86, 0x2e, 0xc8, 0x6d, 0x0a, 0xee, 0x2e,\n  0x66, 0xdd, 0x91, 0x30, 0xe6, 0xa1, 0xc4, 0xa2, 0x2b, 0x4d, 0x51, 0x8a,\n  0xd5, 0xb8, 0xc2, 0x14, 0x0b, 0x66, 0x58, 0x39, 0x76, 0x2a, 0x3b, 0xdc,\n  0xd7, 0xd8, 0xb8, 0xd0, 0x3b, 0x30, 0xd0, 0xbb, 0xd0, 0xd4, 0xd8, 0x33,\n  0x76, 0xef, 0x19, 0x8a, 0x20, 0x38, 0xa9, 0xef, 0x3a, 0x3d, 0xbb, 0x7b,\n  0xdd, 0x65, 0xbd, 0x6a, 0xee, 0xce, 0xdb, 0x67, 0x47, 0x47, 0x67, 0x6f,\n  0xbf, 0x73, 0xfe, 0x2a, 0xab, 0x6b, 0x7d, 0xd7, 0x8d, 0x77, 0x4d, 0x2c,\n  0xef, 0x9c, 0xdf, 0xbf, 0x7f, 0x7e, 0xe7, 0x32, 0x23, 0xf1, 0xf1, 0x2e,\n  0x12, 0x4b, 0xe6, 0x62, 0x46, 0xb2, 0x83, 0x98, 0x91, 0xf0, 0x46, 0x28,\n  0x88, 0x92, 0x8f, 0xf1, 0x45, 0x78, 0xc8, 0x88, 0xb9, 0x5a, 0x95, 0x6d,\n  0x2c, 0x08, 0x34, 0x55, 0x11, 0x22, 0xb1, 0xed, 0x36, 0x60, 0x1a, 0x24,\n  0xd8, 0xd4, 0x85, 0x5c, 0x52, 0x88, 0x92, 0x1c, 0xd6, 0x1b, 0xcd, 0x20,\n  0x88, 0xf9, 0x41, 0x90, 0x2f, 0x8b, 0xde, 0x2b, 0xc5, 0xf2, 0xe6, 0x0e,\n  0xa2, 0x9b, 0x20, 0xd0, 0x2c, 0xf7, 0x7a, 0x74, 0x57, 0xe7, 0xbf, 0xd0,\n  0x48, 0xde, 0xd1, 0x61, 0xb6, 0x6d, 0x6e, 0x78, 0xf3, 0xd9, 0xb7, 0x64,\n  0x29, 0x36, 0x48, 0x7a, 0xab, 0x0b, 0xe2, 0xcc, 0x58, 0x8d, 0x70, 0x52,\n  0x25, 0xff, 0x3c, 0xac, 0xf8, 0x9b, 0x67, 0x98, 0xff, 0xdc, 0x46, 0xfe,\n  0xf9, 0x81, 0x2c, 0xff, 0xe0, 0x36, 0x9f, 0x93, 0x7d, 0xdb, 0xea, 0x1a,\n  0x48, 0xcc, 0xcd, 0xcc, 0x67, 0x14, 0x59, 0x5a, 0x55, 0x03, 0x09, 0x5f,\n  0x07, 0x6d, 0x40, 0x90, 0x64, 0x00, 0xd9, 0x7e, 0x58, 0x83, 0xb9, 0xd7,\n  0x6c, 0x76, 0xaa, 0xac, 0xb7, 0xb7, 0x2c, 0x0a, 0x2c, 0x35, 0x35, 0x40,\n  0x55, 0x68, 0x48, 0xd2, 0x2d, 0xb1, 0x4f, 0x99, 0xae, 0x64, 0x2e, 0xbc,\n  0x1c, 0xe6, 0xa6, 0xbf, 0xd4, 0x28, 0xb5, 0xb5, 0x0d, 0xb4, 0x70, 0x39,\n  0xdb, 0xe1, 0xe6, 0xa5, 0xf2, 0x60, 0xd2, 0x82, 0x84, 0xad, 0x29, 0xdb,\n  0x0f, 0xab, 0xb0, 0x14, 0x72, 0x0f, 0xb5, 0xf8, 0xd5, 0xea, 0x0b, 0x9d,\n  0xb9, 0x64, 0xfa, 0xec, 0xf1, 0xed, 0xf0, 0x5c, 0xab, 0x2f, 0xbb, 0x4e,\n  0x45, 0x28, 0xae, 0xb1, 0xbc, 0x55, 0x06, 0x6f, 0xf5, 0xd0, 0xff, 0x66,\n  0xa9, 0xb6, 0x43, 0xde, 0xfc, 0x7c, 0xe9, 0x42, 0xfd, 0x4d, 0x59, 0x9c,\n  0xcd, 0x72, 0x46, 0xbb, 0xdc, 0x7c, 0x19, 0x80, 0x4d, 0x5e, 0x45, 0x17,\n  0x5e, 0xb2, 0x42, 0x57, 0x65, 0xb1, 0x52, 0x60, 0xa4, 0x81, 0x27, 0x3c,\n  0xfe, 0xa9, 0x11, 0x58, 0x88, 0x90, 0x33, 0x61, 0x06, 0xa1, 0xe3, 0x84,\n  0x63, 0x32, 0xd2, 0xe8, 0x69, 0xb5, 0x67, 0x87, 0x57, 0xe6, 0x1b, 0x0e,\n  0xf2, 0x5e, 0xde, 0x0b, 0x55, 0x36, 0x2b, 0xcc, 0x24, 0x28, 0x5e, 0xb6,\n  0x42, 0xd9, 0xf1, 0x86, 0x11, 0xf2, 0x70, 0xa3, 0x2d, 0x79, 0x10, 0xd2,\n  0xcb, 0xc1, 0xb1, 0xfe, 0x0e, 0x55, 0xe5, 0xbe, 0x20, 0x34, 0xd5, 0x04,\n  0x9a, 0xeb, 0xed, 0x4e, 0x9b, 0xd8, 0x2c, 0x34, 0xd6, 0x7a, 0x9b, 0xeb,\n  0x9d, 0x2e, 0x9b, 0x06, 0x7d, 0x76, 0x1b, 0x0a, 0xf9, 0xf0, 0xd8, 0xd8,\n  0x7b, 0x33, 0xbd, 0x1e, 0x8f, 0xdf, 0xd5, 0xda, 0x87, 0xe7, 0xee, 0x2e,\n  0x0f, 0x35, 0xce, 0xab, 0x68, 0xc3, 0x8b, 0x35, 0xd9, 0x16, 0xb0, 0x26,\n  0x29, 0xf3, 0x56, 0x4d, 0x57, 0xa3, 0x61, 0x57, 0x79, 0x6a, 0x8a, 0x93,\n  0x66, 0x7e, 0xb6, 0x78, 0xe6, 0xcd, 0x8d, 0x50, 0x23, 0x27, 0x14, 0xf8,\n  0xdf, 0xcc, 0x7c, 0x9b, 0x2f, 0xfd, 0xe8, 0xf6, 0xf3, 0xde, 0x28, 0x8b,\n  0x36, 0xbd, 0x59, 0x3c, 0xeb, 0xa7, 0x4b, 0x3e, 0xb6, 0xa2, 0x07, 0x3c,\n  0xac, 0xc4, 0x99, 0xcc, 0xa0, 0xfa, 0x6d, 0xf4, 0x80, 0x1f, 0x28, 0x76,\n  0x89, 0x19, 0xe6, 0x1b, 0x2a, 0x2c, 0x7a, 0x6a, 0xcf, 0x85, 0xf3, 0x6e,\n  0x38, 0x3b, 0xa0, 0x95, 0x77, 0x85, 0x0e, 0x2c, 0xb9, 0x02, 0x6c, 0x09,\n  0x09, 0x7f, 0xfb, 0xb4, 0x1a, 0x7f, 0x0e, 0x76, 0x43, 0x75, 0x65, 0x22,\n  0x16, 0xf4, 0x3b, 0xed, 0xaa, 0x7d, 0xa0, 0x2f, 0xb3, 0x0f, 0xd0, 0x15,\n  0xd8, 0x84, 0x6c, 0xc9, 0x45, 0xcb, 0xdb, 0x7c, 0x7d, 0xb5, 0x31, 0x77,\n  0xf3, 0x0f, 0xe5, 0xf9, 0x82, 0xfc, 0xed, 0xa9, 0x3d, 0x17, 0x70, 0xbd,\n  0x46, 0xb3, 0x43, 0xca, 0x5c, 0x88, 0xf1, 0x55, 0x47, 0xbf, 0xb8, 0x34,\n  0x9b, 0xb3, 0xc5, 0xb3, 0xa9, 0x4c, 0xc5, 0x22, 0x7e, 0xaf, 0xc3, 0x76,\n  0xe5, 0xd9, 0x5c, 0x66, 0x27, 0xcb, 0xc6, 0x55, 0x54, 0x51, 0x76, 0x0b,\n  0xab, 0x8d, 0xaa, 0xb9, 0xfe, 0xf2, 0xd8, 0xb8, 0x14, 0x1f, 0x6d, 0xaf,\n  0x82, 0x8f, 0x36, 0xc5, 0x2c, 0x6f, 0x83, 0x8f, 0xf6, 0x84, 0x82, 0x8f,\n  0x36, 0x35, 0x48, 0xcf, 0x7f, 0x71, 0xeb, 0x87, 0xe8, 0x2c, 0x89, 0x49,\n  0x0b, 0x31, 0x07, 0xb3, 0x16, 0x0d, 0xe2, 0x51, 0x00, 0x4b, 0x75, 0xbc,\n  0x15, 0x4f, 0x9d, 0x93, 0xf1, 0x1a, 0x49, 0x8e, 0x09, 0x07, 0xa1, 0xbc,\n  0x10, 0x0f, 0x47, 0x79, 0x25, 0x4d, 0x56, 0x82, 0x4c, 0x5d, 0x88, 0x42,\n  0x90, 0x1b, 0xa8, 0xef, 0x2d, 0x66, 0xcd, 0x4e, 0x07, 0x5e, 0x9f, 0x90,\n  0x33, 0x94, 0x88, 0x39, 0x34, 0x26, 0x6f, 0x8d, 0x1b, 0x4b, 0x77, 0x90,\n  0xd7, 0x9d, 0xcf, 0x63, 0xd3, 0x68, 0xda, 0xa5, 0xc5, 0xc0, 0xe7, 0xff,\n  0x8e, 0xa1, 0x44, 0xf5, 0x42, 0x24, 0x31, 0x30, 0x30, 0x3c, 0xd0, 0x30,\n  0x60, 0xd5, 0xd9, 0xde, 0xe9, 0xf7, 0x87, 0x7d, 0xe1, 0x10, 0x1b, 0x08,\n  0x85, 0x56, 0xdb, 0xd8, 0xd5, 0xcd, 0x1f, 0x1a, 0x07, 0x5a, 0x5a, 0xc7,\n  0x13, 0x41, 0x6b, 0x6d, 0x36, 0xe4, 0xc2, 0xac, 0x2c, 0x51, 0xcb, 0x48,\n  0x79, 0x7b, 0x3f, 0x64, 0x5f, 0xc6, 0xfa, 0x50, 0x9c, 0xa9, 0x67, 0x1e,\n  0x93, 0xd4, 0x04, 0x33, 0xe2, 0x19, 0xc0, 0x1c, 0xab, 0xe5, 0x58, 0x8d,\n  0x18, 0x45, 0x48, 0xc3, 0x4f, 0x61, 0x29, 0x66, 0xc2, 0x9f, 0xf5, 0x94,\n  0xbf, 0x43, 0xa2, 0xfd, 0xbd, 0xc4, 0xb6, 0x44, 0xb1, 0xc6, 0x08, 0x4c,\n  0xd5, 0x2a, 0xe4, 0xbd, 0x82, 0xe1, 0x48, 0x96, 0xb8, 0x49, 0x1c, 0x60,\n  0xa5, 0xd2, 0x84, 0x04, 0x35, 0x4b, 0x89, 0x18, 0x0a, 0xc4, 0x96, 0x24,\n  0x6a, 0x13, 0xfb, 0x92, 0x35, 0x99, 0xa8, 0xa9, 0x4a, 0xd4, 0x27, 0xeb,\n  0x13, 0x89, 0x84, 0xd5, 0x9e, 0xd4, 0x49, 0x22, 0x2e, 0x05, 0x7d, 0xb2,\n  0x4a, 0x96, 0x1b, 0x82, 0x6b, 0xb0, 0xdd, 0xa2, 0xa0, 0x4f, 0xe0, 0x55,\n  0xb9, 0x69, 0x71, 0x78, 0x61, 0xcc, 0x24, 0xf8, 0xf6, 0xb7, 0x1c, 0x5c,\n  0xa3, 0x0b, 0x54, 0x9f, 0xb5, 0xeb, 0xac, 0x8f, 0x06, 0xbd, 0xf9, 0x05,\n  0xfa, 0xdc, 0x9d, 0x87, 0x97, 0x73, 0x3f, 0x67, 0x3d, 0x13, 0xd5, 0x55,\n  0x07, 0x8e, 0xde, 0x6d, 0x1c, 0x6d, 0x6e, 0x1f, 0x88, 0x07, 0xad, 0x35,\n  0xca, 0x52, 0xb1, 0x8c, 0x19, 0x7f, 0xeb, 0x9b, 0xd9, 0x87, 0xf1, 0x19,\n  0x98, 0x02, 0x84, 0x26, 0x2c, 0xf9, 0xb0, 0x66, 0xbc, 0x10, 0x09, 0x58,\n  0x08, 0x2f, 0x16, 0x8b, 0x00, 0x1e, 0x90, 0x02, 0x5b, 0xd1, 0xe9, 0x29,\n  0x59, 0x43, 0x1b, 0x05, 0xb3, 0x0a, 0x06, 0xe2, 0xd1, 0x40, 0x2a, 0x98,\n  0x4a, 0xc4, 0xac, 0x56, 0xbb, 0x03, 0xa6, 0x44, 0xbe, 0x6b, 0x3e, 0x80,\n  0x74, 0xbb, 0xa9, 0xcc, 0xe3, 0x99, 0xd0, 0x3c, 0x27, 0x69, 0x0e, 0x03,\n  0x78, 0x0e, 0xef, 0x54, 0xcf, 0x01, 0xf5, 0x92, 0x68, 0xd2, 0x3f, 0x95,\n  0x8e, 0x5e, 0xaa, 0xe9, 0xc1, 0xbd, 0x0d, 0xd3, 0x6a, 0x94, 0xa9, 0xc3,\n  0x1a, 0xfd, 0xcd, 0x9f, 0x08, 0xdb, 0x31, 0x6f, 0xd6, 0xc8, 0xe2, 0x6a,\n  0x94, 0xa4, 0xc4, 0xd3, 0x4f, 0xc5, 0x91, 0xd4, 0x58, 0x83, 0xa8, 0xe7,\n  0x08, 0xba, 0x8e, 0x4e, 0x42, 0xbb, 0x80, 0x36, 0x88, 0xbd, 0x70, 0xb9,\n  0x36, 0x8b, 0xd9, 0x68, 0x43, 0x7d, 0x3c, 0x86, 0xe0, 0x20, 0xeb, 0x68,\n  0xe8, 0xa8, 0x4a, 0xc7, 0xea, 0xe2, 0x75, 0xa1, 0x80, 0xc7, 0x45, 0x30,\n  0x73, 0xa2, 0x28, 0x6a, 0x2c, 0xc5, 0xcc, 0x69, 0x29, 0x4a, 0xcf, 0x4c,\n  0x17, 0x4a, 0xea, 0x51, 0x19, 0xe4, 0x0b, 0x8b, 0xb4, 0x89, 0xd3, 0xb7,\n  0x29, 0x0a, 0x89, 0x8c, 0xf5, 0x75, 0xc7, 0xe9, 0xfb, 0x3a, 0x02, 0x87,\n  0xfb, 0x26, 0x26, 0x41, 0x21, 0x99, 0x40, 0x5f, 0x9c, 0x02, 0xe4, 0xaf,\n  0x09, 0x19, 0x55, 0xa7, 0x2b, 0xf6, 0xf7, 0x79, 0xfc, 0xaf, 0xdb, 0xb2,\n  0xbd, 0x13, 0x67, 0x56, 0x0e, 0x1f, 0x01, 0x0d, 0x84, 0x40, 0x81, 0x5d,\n  0x7d, 0x82, 0xac, 0x8b, 0x05, 0xaf, 0x4b, 0x0c, 0xaf, 0x8b, 0x84, 0x95,\n  0x0c, 0x0b, 0xa3, 0x11, 0xd0, 0x54, 0xc1, 0xe4, 0xce, 0xaa, 0xd6, 0x46,\n  0x0e, 0xab, 0xad, 0xaf, 0xa3, 0x53, 0xad, 0xeb, 0xa8, 0xef, 0xc0, 0xdc,\n  0xac, 0x36, 0x5e, 0x5b, 0x3c, 0x55, 0x54, 0x94, 0x72, 0x4a, 0x4d, 0xf6,\n  0x8a, 0xbc, 0x82, 0x75, 0x32, 0x01, 0x66, 0x46, 0x59, 0x5a, 0x54, 0xb1,\n  0xe1, 0xb7, 0xa6, 0xd8, 0x0f, 0x9c, 0xb9, 0x95, 0x4e, 0x95, 0xe5, 0x17,\n  0x78, 0x24, 0xb8, 0xe6, 0xa5, 0xa9, 0x06, 0x0f, 0xe7, 0x3e, 0x83, 0xa7,\n  0x78, 0xd5, 0xc0, 0x38, 0x6a, 0xa1, 0x73, 0x1e, 0x67, 0x63, 0xd2, 0x64,\n  0x3b, 0xe3, 0x5f, 0xfc, 0xb7, 0x58, 0x8f, 0x45, 0x9a, 0xec, 0x40, 0xcf,\n  0x84, 0x34, 0x49, 0x79, 0xce, 0xb4, 0xb6, 0x15, 0xb3, 0xf5, 0x0c, 0x7b,\n  0x3b, 0xa6, 0x83, 0x0a, 0x7c, 0x66, 0x07, 0x98, 0xeb, 0xb3, 0x7a, 0xbf,\n  0xcb, 0x66, 0x36, 0x08, 0xa2, 0x02, 0xdf, 0x16, 0x03, 0x90, 0xcb, 0x7b,\n  0xf4, 0x5a, 0x56, 0xc4, 0xac, 0x9c, 0x13, 0x99, 0xa3, 0x14, 0x41, 0x1b,\n  0xc4, 0x7b, 0x9d, 0x86, 0x95, 0x32, 0x78, 0x62, 0x80, 0xb2, 0x7d, 0xa1,\n  0xa4, 0xa5, 0xba, 0x11, 0xd6, 0x63, 0x7c, 0x3e, 0x86, 0xf1, 0x05, 0x7c,\n  0x01, 0xab, 0x05, 0xbf, 0xae, 0xc2, 0x26, 0x05, 0xd8, 0x06, 0x6a, 0xa2,\n  0xe9, 0x38, 0x17, 0xb7, 0xc7, 0xc1, 0xcb, 0xe8, 0x06, 0xac, 0x07, 0xd4,\n  0xd2, 0x4e, 0x5d, 0x8d, 0xee, 0xb4, 0xc8, 0x46, 0xaf, 0x7a, 0x78, 0x7d,\n  0x68, 0x7d, 0x84, 0x38, 0x19, 0x43, 0xd5, 0x43, 0x3b, 0x5e, 0xc8, 0xcd,\n  0x0d, 0x4d, 0xf3, 0x26, 0x23, 0x27, 0xda, 0x34, 0x6f, 0x69, 0xac, 0xfd,\n  0x6e, 0xee, 0x5b, 0xa8, 0xf2, 0xbb, 0xec, 0x97, 0x66, 0xce, 0x3d, 0xbf,\n  0xf9, 0x1d, 0x54, 0xf7, 0x3d, 0x63, 0x3a, 0x6d, 0x00, 0x1f, 0xe3, 0x9d,\n  0x77, 0x32, 0x52, 0x2e, 0xfb, 0x33, 0xec, 0x22, 0x9e, 0x5f, 0x04, 0x9f,\n  0x49, 0xb7, 0x64, 0x5d, 0x61, 0x0e, 0x71, 0x02, 0x57, 0x99, 0x36, 0x69,\n  0x79, 0x81, 0x11, 0x5c, 0x76, 0x33, 0x00, 0x78, 0xe6, 0x89, 0x1e, 0xb1,\n  0xf7, 0x40, 0x84, 0x0e, 0x28, 0x68, 0x12, 0xdc, 0xf2, 0xe9, 0x69, 0xd9,\n  0x08, 0x44, 0xd4, 0xf4, 0x28, 0xbe, 0xcd, 0xf1, 0xa4, 0x72, 0xc8, 0x3d,\n  0xe5, 0xdb, 0x2c, 0x66, 0xed, 0xb1, 0x28, 0xc3, 0x44, 0xab, 0x62, 0x55,\n  0xf8, 0xa5, 0x91, 0xb4, 0x2d, 0x59, 0x05, 0x79, 0xbb, 0x48, 0x24, 0x8e,\n  0xaf, 0x34, 0x97, 0xcf, 0xa8, 0x4b, 0x8b, 0xf1, 0x76, 0x05, 0x66, 0xa7,\n  0x5d, 0xa4, 0x79, 0xd8, 0xf6, 0x14, 0xdb, 0x60, 0x8f, 0x06, 0x12, 0x46,\n  0x9f, 0xf9, 0xb3, 0x89, 0x1a, 0x0a, 0xba, 0xd6, 0x5c, 0xeb, 0x1b, 0x8a,\n  0xee, 0xdd, 0x3b, 0xfb, 0xe8, 0x35, 0xc9, 0xa4, 0x79, 0xf1, 0xec, 0xeb,\n  0xda, 0xda, 0x3e, 0xed, 0x61, 0x2f, 0xb5, 0xeb, 0xcc, 0x53, 0x82, 0x41,\n  0xd8, 0xfc, 0x8e, 0x9e, 0x60, 0xaf, 0xe9, 0x27, 0x57, 0x2a, 0x3f, 0x7c,\n  0xcb, 0xc9, 0x27, 0x0e, 0x08, 0x55, 0x67, 0x1f, 0xbd, 0x67, 0xe1, 0xae,\n  0x18, 0xeb, 0xe1, 0x89, 0x3f, 0xac, 0x11, 0xbd, 0x4c, 0xe6, 0x9f, 0x62,\n  0x6e, 0xcc, 0x3a, 0xec, 0x56, 0xac, 0x94, 0xc6, 0x83, 0x1e, 0x07, 0xcf,\n  0x0b, 0x21, 0xa8, 0xbb, 0xcb, 0xcb, 0xb3, 0x07, 0x3f, 0x00, 0xba, 0x87,\n  0x9a, 0x2b, 0xf2, 0x39, 0xd6, 0x05, 0x6a, 0x6a, 0x84, 0xda, 0x28, 0x48,\n  0xbb, 0xb2, 0x4d, 0x08, 0x06, 0x5b, 0x2a, 0xe1, 0xf7, 0x5a, 0x00, 0x0e,\n  0x85, 0x63, 0x22, 0x28, 0x42, 0xf5, 0xbc, 0xc2, 0xa9, 0xb6, 0x14, 0xaf,\n  0x05, 0xe7, 0x70, 0xdb, 0xf1, 0xe6, 0xa9, 0x6d, 0xae, 0x9a, 0x1c, 0xda,\n  0x53, 0xd7, 0x3a, 0x78, 0x66, 0xdc, 0x5c, 0x31, 0x3d, 0x34, 0x17, 0x70,\n  0xf8, 0xf5, 0x5e, 0xd3, 0xeb, 0xfd, 0x09, 0x02, 0xc0, 0xf6, 0xaf, 0xa9,\n  0x5b, 0xf9, 0xf7, 0xe8, 0x4d, 0xff, 0x7e, 0x31, 0x72, 0xf6, 0xaa, 0x43,\n  0xb7, 0x76, 0xa1, 0x6f, 0xfe, 0x50, 0xd4, 0x4f, 0xf0, 0x5a, 0x2e, 0x77,\n  0xb7, 0x91, 0x40, 0xb0, 0x21, 0xc7, 0xc1, 0x16, 0xb4, 0xcc, 0xd0, 0xbc,\n  0x4e, 0xf4, 0x7b, 0x82, 0x5d, 0x56, 0x97, 0xad, 0x2e, 0x40, 0xf3, 0xa0,\n  0x49, 0x4e, 0x07, 0xa5, 0x10, 0x19, 0xfc, 0xd5, 0x4c, 0x8c, 0x89, 0x06,\n  0x7a, 0x03, 0x8e, 0xb6, 0x0a, 0xd0, 0xc3, 0x19, 0x75, 0xae, 0xee, 0xdd,\n  0xbb, 0xf4, 0xe4, 0x93, 0xa8, 0x03, 0x4d, 0x8d, 0xa1, 0xf6, 0xdc, 0xbf,\n  0x8d, 0xbd, 0x4a, 0xe2, 0xf1, 0xf5, 0x98, 0x9e, 0xa2, 0x78, 0x3d, 0x2d,\n  0xf8, 0x94, 0xbf, 0x3a, 0xab, 0xb3, 0x59, 0x04, 0xa8, 0xe4, 0x2d, 0x6f,\n  0x96, 0x10, 0x5d, 0x1c, 0xa0, 0x20, 0xad, 0xa8, 0x81, 0xc0, 0xc3, 0x15,\n  0x09, 0xb5, 0x96, 0xc0, 0xa4, 0x01, 0x88, 0x1d, 0x21, 0x1f, 0x68, 0x55,\n  0xae, 0xc1, 0x62, 0xd6, 0x82, 0xc7, 0x62, 0xb7, 0x92, 0x00, 0x74, 0x9b,\n  0xcd, 0x02, 0x4e, 0x94, 0x68, 0x3c, 0x23, 0xc6, 0xed, 0x90, 0x87, 0x81,\n  0x17, 0x0e, 0x92, 0x47, 0xac, 0xce, 0x76, 0x34, 0xb4, 0x74, 0xf5, 0xe8,\n  0x07, 0x5f, 0x46, 0x7f, 0xe9, 0x1c, 0x75, 0xd6, 0xef, 0x7a, 0x60, 0xe4,\n  0x8d, 0x2f, 0xa2, 0xd3, 0xe8, 0xaa, 0xd9, 0xfa, 0xfa, 0xd9, 0xdc, 0x0b,\n  0xa8, 0xe6, 0xad, 0x6f, 0xa5, 0xfa, 0x7a, 0x0b, 0x96, 0x53, 0x3e, 0x85,\n  0x79, 0x59, 0x37, 0xf0, 0xb1, 0x20, 0xe2, 0xd8, 0x90, 0x8e, 0x45, 0x9c,\n  0x16, 0xaf, 0x47, 0x07, 0x12, 0xf8, 0x4e, 0x02, 0xbf, 0x27, 0xa7, 0xac,\n  0x9d, 0x55, 0x10, 0x86, 0xce, 0x14, 0xa5, 0x16, 0xb5, 0xb5, 0x36, 0xd4,\n  0x83, 0x6c, 0x66, 0x32, 0x30, 0xdd, 0xa8, 0x5b, 0xd6, 0xdb, 0x21, 0xd1,\n  0x41, 0x95, 0x28, 0x92, 0xae, 0x67, 0x25, 0x2e, 0x9e, 0xf7, 0xee, 0xba,\n  0x89, 0xb1, 0x16, 0xaa, 0x20, 0x28, 0x85, 0xd7, 0xd0, 0xd1, 0x9d, 0xb3,\n  0x0e, 0x5b, 0x97, 0xc5, 0x6d, 0x24, 0xc9, 0x10, 0xae, 0xce, 0x4c, 0xeb,\n  0x8e, 0xca, 0x53, 0x4b, 0x4d, 0x7b, 0x92, 0xa1, 0xd8, 0x8e, 0x74, 0x5b,\n  0xa7, 0xaf, 0xb7, 0xa5, 0x65, 0x3c, 0x75, 0x62, 0xc5, 0x50, 0xa1, 0x31,\n  0xb5, 0x54, 0x59, 0xab, 0x4d, 0x86, 0x86, 0x8b, 0x53, 0xf3, 0xa3, 0x16,\n  0x41, 0x27, 0x92, 0x34, 0x09, 0x48, 0xb8, 0x76, 0x54, 0x76, 0xd4, 0x0e,\n  0xef, 0xb0, 0x5b, 0x47, 0xcd, 0x8e, 0x78, 0xc8, 0x15, 0x0e, 0x3a, 0xec,\n  0x95, 0x9d, 0x35, 0x93, 0x73, 0xac, 0x25, 0xe9, 0xac, 0xad, 0xd4, 0x0a,\n  0xe3, 0x02, 0xc1, 0xab, 0x49, 0xe3, 0xb9, 0x3f, 0xc7, 0x7a, 0xf0, 0xf9,\n  0x3c, 0x98, 0xed, 0x37, 0x23, 0x96, 0xab, 0xc0, 0x73, 0x07, 0xd8, 0x44,\n  0xe4, 0xc5, 0xe2, 0x15, 0x3f, 0x25, 0xe7, 0x9c, 0x6d, 0x50, 0x49, 0xa3,\n  0x30, 0xf1, 0xd4, 0xe5, 0x90, 0xb2, 0x62, 0x25, 0x44, 0x1d, 0x30, 0xb4,\n  0xa4, 0x21, 0x1b, 0x46, 0xb2, 0x52, 0x14, 0x4c, 0xe9, 0xee, 0x9e, 0xa9,\n  0x3a, 0xb3, 0xb1, 0xa9, 0x33, 0x8e, 0x22, 0xb9, 0xdf, 0xa2, 0xd3, 0xb9,\n  0x1f, 0x75, 0xf7, 0x59, 0x0c, 0x1d, 0x4d, 0x8e, 0x70, 0x85, 0x29, 0x7a,\n  0x31, 0x3e, 0xda, 0x5a, 0x9b, 0xee, 0x42, 0x8f, 0x0e, 0x0f, 0xe6, 0xae,\n  0xd1, 0x4f, 0x0d, 0xd4, 0x56, 0x6a, 0xf0, 0x00, 0x45, 0x40, 0x65, 0xc3,\n  0x83, 0x7c, 0x17, 0xfb, 0x3c, 0xe3, 0x04, 0x1a, 0xb5, 0x63, 0x61, 0xdf,\n  0xa6, 0xd3, 0x80, 0x80, 0x34, 0xa5, 0x80, 0x26, 0x9d, 0x96, 0x30, 0x00,\n  0x10, 0x43, 0xea, 0x95, 0x38, 0x91, 0x93, 0x57, 0x32, 0xd8, 0x01, 0xd3,\n  0x47, 0x9d, 0x3a, 0xf4, 0x0f, 0xeb, 0x37, 0x2c, 0x1f, 0x5d, 0x5a, 0x3c,\n  0xda, 0x37, 0x1c, 0x5b, 0x08, 0x45, 0xe3, 0x47, 0xd8, 0xe7, 0x8f, 0x2c,\n  0x4e, 0xde, 0xdf, 0x84, 0xc7, 0x33, 0x18, 0xb8, 0x66, 0xb4, 0xb5, 0xdf,\n  0xe7, 0x1e, 0xf7, 0x85, 0x08, 0x4d, 0x18, 0xf1, 0x8f, 0x37, 0x63, 0x9a,\n  0xc8, 0xbf, 0x57, 0x2f, 0x16, 0xbe, 0xf7, 0xac, 0xea, 0xbd, 0x3a, 0x6d,\n  0xe1, 0x7b, 0x21, 0x35, 0x84, 0x18, 0xc0, 0x95, 0xf7, 0x1e, 0x4f, 0xec,\n  0x1c, 0x5d, 0x58, 0x5c, 0xbd, 0x25, 0x36, 0x83, 0xdf, 0xbb, 0x9f, 0x8d,\n  0x1d, 0x59, 0xac, 0x5b, 0xde, 0x13, 0x5d, 0x7b, 0x33, 0x7e, 0xed, 0x39,\n  0x9f, 0x7b, 0x10, 0xbf, 0x15, 0x34, 0x02, 0x86, 0xdd, 0x8d, 0xf7, 0x23,\n  0xe0, 0x3c, 0x57, 0x43, 0xc5, 0x2d, 0x23, 0x01, 0xb0, 0x05, 0xd1, 0x08,\n  0xf1, 0xe2, 0x3a, 0xd6, 0x13, 0x74, 0x08, 0x8b, 0xd1, 0xcc, 0xba, 0x6c,\n  0x2f, 0x92, 0x10, 0x69, 0xf5, 0x48, 0xca, 0x09, 0x24, 0xc5, 0x11, 0x13,\n  0x91, 0x50, 0xd0, 0xef, 0x76, 0xe2, 0xa7, 0xd8, 0xa3, 0x70, 0x6e, 0x78,\n  0x6b, 0x48, 0xdc, 0x80, 0xf5, 0x4a, 0x40, 0xb4, 0x20, 0x46, 0xad, 0xee,\n  0xdc, 0xf9, 0xc5, 0xf2, 0x20, 0xb4, 0x6f, 0x7d, 0xeb, 0x07, 0x67, 0xd0,\n  0xd7, 0xb6, 0x83, 0x9f, 0xbd, 0x6a, 0x86, 0xee, 0xf9, 0x57, 0xd8, 0xaf,\n  0xe1, 0xf1, 0x3b, 0xb1, 0x5c, 0x9f, 0xc9, 0x36, 0xf3, 0x78, 0xa5, 0x74,\n  0x78, 0xd5, 0x04, 0x2d, 0x23, 0xac, 0x53, 0x8b, 0xa4, 0xca, 0x5a, 0xc1,\n  0x30, 0xa1, 0x20, 0xad, 0x38, 0x9e, 0x90, 0x53, 0x48, 0x82, 0x58, 0x61,\n  0x95, 0x5d, 0xa1, 0x14, 0x25, 0x98, 0xba, 0x41, 0xdd, 0x92, 0xc9, 0x2e,\n  0xaa, 0x9f, 0x5b, 0x42, 0x67, 0x17, 0xe7, 0xe7, 0xf3, 0x21, 0x84, 0xb9,\n  0x37, 0xa0, 0xb5, 0x19, 0xe4, 0xcb, 0xfd, 0x18, 0xfe, 0xcc, 0x1c, 0x21,\n  0x21, 0x83, 0x87, 0xd7, 0x21, 0x60, 0x50, 0xaa, 0x6d, 0x00, 0x87, 0xdb,\n  0x0a, 0xc1, 0x16, 0x38, 0x4a, 0x6b, 0x54, 0x6e, 0x3d, 0x83, 0x2e, 0x12,\n  0xdd, 0xc3, 0x8d, 0x69, 0xfe, 0x99, 0xc9, 0xa7, 0x6d, 0x10, 0x60, 0x4f,\n  0x52, 0x28, 0xce, 0xe8, 0x91, 0x68, 0x42, 0x5a, 0x9d, 0xa8, 0xa5, 0x20,\n  0xc9, 0x06, 0x04, 0x8b, 0x4b, 0xd9, 0x0e, 0x89, 0x45, 0x58, 0x61, 0x29,\n  0x8a, 0xa3, 0x64, 0xc0, 0xae, 0x23, 0xec, 0xe9, 0x35, 0x77, 0xc2, 0xed,\n  0x15, 0x9e, 0x96, 0xef, 0xb4, 0x6d, 0xfb, 0xc5, 0xc5, 0xac, 0xcb, 0x4f,\n  0x93, 0xa8, 0x20, 0xf8, 0x48, 0xfa, 0xcf, 0x62, 0x36, 0x85, 0x31, 0xa7,\n  0xc3, 0xc7, 0x44, 0xdc, 0x2a, 0xf1, 0x39, 0xfa, 0x07, 0xcb, 0x02, 0xf8,\n  0x53, 0xb6, 0xc7, 0xd1, 0xc5, 0x1f, 0xdb, 0x07, 0xec, 0x47, 0x51, 0xd0,\n  0x38, 0x60, 0x6c, 0x1a, 0xe9, 0x38, 0x71, 0xc7, 0xc0, 0xd7, 0x73, 0xcf,\n  0xdd, 0xd8, 0xf1, 0xe1, 0xd8, 0xc0, 0xa1, 0xc9, 0x49, 0xf6, 0x59, 0xcc,\n  0xf9, 0x5e, 0x9e, 0xd9, 0x42, 0xd3, 0x2f, 0x6f, 0x3e, 0x2f, 0xd7, 0x53,\n  0x6d, 0xc4, 0xfb, 0xfd, 0x12, 0xd6, 0xab, 0xc1, 0x7b, 0xd2, 0xc0, 0xbc,\n  0x3f, 0xeb, 0x12, 0x10, 0x60, 0x0c, 0x8a, 0x9a, 0x7a, 0x8b, 0x01, 0x33,\n  0x3d, 0xaf, 0xcb, 0xca, 0xe1, 0x71, 0x4f, 0xc9, 0x73, 0xc6, 0x02, 0xcc,\n  0x3d, 0x46, 0x2c, 0xbb, 0x98, 0x74, 0x98, 0x33, 0x88, 0xec, 0x51, 0x82,\n  0xa6, 0x04, 0xb3, 0xa0, 0xf1, 0x2d, 0x67, 0xd5, 0xc8, 0xaa, 0x7e, 0xba,\n  0x46, 0x17, 0x4a, 0x3a, 0x6d, 0xd3, 0x7e, 0x31, 0x9b, 0xae, 0xad, 0x4d,\n  0xa7, 0xc1, 0x54, 0x5d, 0xdb, 0x50, 0xdb, 0x90, 0xae, 0x49, 0xd7, 0x24,\n  0xe2, 0x91, 0x54, 0x34, 0xe5, 0x71, 0x03, 0x86, 0xac, 0x5e, 0x87, 0xcf,\n  0xca, 0x30, 0x0a, 0xd3, 0x8a, 0xb4, 0xe4, 0x7c, 0x04, 0xf1, 0x50, 0x2c,\n  0x27, 0x2a, 0x40, 0xc9, 0xca, 0x96, 0xf6, 0x94, 0xbb, 0x35, 0x95, 0x16,\n  0xf1, 0x31, 0xda, 0x8e, 0x12, 0x6e, 0xd7, 0xe4, 0xd0, 0xce, 0xf6, 0xde,\n  0xaf, 0xf7, 0x44, 0xaa, 0x69, 0x69, 0xca, 0xd6, 0xda, 0x89, 0xa1, 0x5d,\n  0x4d, 0x1d, 0xb4, 0x3c, 0xe5, 0xe9, 0x8c, 0xe1, 0x46, 0xaf, 0xb7, 0xf6,\n  0x19, 0xb6, 0xaa, 0x81, 0x8d, 0xf1, 0xdf, 0xfe, 0x55, 0xe0, 0xcc, 0x4c,\n  0xe6, 0x43, 0x26, 0x52, 0x8d, 0xd2, 0xfc, 0xfc, 0xc5, 0xe8, 0xf5, 0x3b,\n  0x69, 0x41, 0xca, 0xbf, 0x40, 0xef, 0xa8, 0x1e, 0xb2, 0x9f, 0x1f, 0xdd,\n  0xdb, 0x78, 0x2f, 0x39, 0x3b, 0xb6, 0x3e, 0xba, 0x35, 0x88, 0x44, 0x4c,\n  0xf3, 0x1e, 0xc0, 0x44, 0xcc, 0xe7, 0xed, 0x51, 0x04, 0x6d, 0x82, 0x92,\n  0x89, 0x95, 0x63, 0x62, 0xed, 0xc5, 0x42, 0x1e, 0x60, 0xcd, 0xca, 0xf9,\n  0x7a, 0x26, 0x48, 0xd8, 0xf3, 0x20, 0x0f, 0x18, 0xa8, 0x45, 0x25, 0x33,\n  0xae, 0x2d, 0xa3, 0x02, 0xcb, 0x72, 0x68, 0x78, 0x4f, 0xc2, 0x6c, 0x49,\n  0x38, 0xbc, 0x75, 0x81, 0x9d, 0x3b, 0x97, 0xe6, 0xe7, 0x8f, 0x7c, 0x96,\n  0x60, 0x16, 0x39, 0x9a, 0xeb, 0x50, 0xdb, 0x0c, 0x1a, 0xcc, 0x7d, 0x76,\n  0x26, 0xf7, 0xb5, 0xf5, 0x35, 0x82, 0x99, 0xf1, 0x6f, 0x5b, 0x16, 0xe6,\n  0x12, 0xfb, 0x03, 0xc6, 0x80, 0x35, 0xd2, 0x17, 0xb2, 0x7a, 0x0b, 0xcd,\n  0x3c, 0x25, 0x19, 0xf2, 0x00, 0xb3, 0x96, 0xc4, 0x42, 0x98, 0x56, 0x0a,\n  0x4a, 0x42, 0x04, 0xad, 0x8d, 0x91, 0x31, 0xf5, 0x64, 0xa3, 0xc3, 0x29,\n  0x05, 0x78, 0xad, 0x4c, 0xe3, 0xd3, 0x65, 0x1b, 0xd7, 0xbd, 0xf6, 0x27,\n  0x43, 0xb1, 0x0b, 0x06, 0x13, 0x16, 0xa9, 0x14, 0x20, 0xb7, 0x2f, 0x6e,\n  0x05, 0x8e, 0x1a, 0xb7, 0xc9, 0x28, 0x45, 0x46, 0x61, 0xda, 0x77, 0xd8,\n  0x8c, 0x71, 0x53, 0x3c, 0x11, 0xd3, 0x9b, 0x3c, 0x35, 0x76, 0x95, 0xad,\n  0x92, 0x53, 0x21, 0x3e, 0x29, 0xa8, 0xe2, 0x78, 0xbd, 0x66, 0x42, 0x2e,\n  0x6a, 0xda, 0xe8, 0xf0, 0xa6, 0xcc, 0x15, 0x11, 0x7b, 0xa4, 0x7a, 0x72,\n  0x72, 0x61, 0x72, 0x72, 0x9c, 0xfd, 0xeb, 0xa0, 0x9f, 0x58, 0x34, 0x5e,\n  0xbd, 0x5b, 0x14, 0xc6, 0x78, 0x4d, 0xbc, 0x09, 0x4d, 0x8e, 0xbd, 0xf8,\n  0xe2, 0x58, 0xee, 0x93, 0x93, 0x7b, 0x64, 0xf9, 0xd7, 0xc2, 0x81, 0xef,\n  0x35, 0x4e, 0x6a, 0x48, 0x54, 0x78, 0xb0, 0x7e, 0x2a, 0x98, 0x10, 0xcb,\n  0x9b, 0x11, 0xc5, 0x6d, 0x23, 0x60, 0xaa, 0x2a, 0x80, 0x6c, 0x95, 0x99,\n  0x49, 0x41, 0x0a, 0x3b, 0x05, 0x22, 0x7e, 0x8a, 0x20, 0x0e, 0xe4, 0xc1,\n  0x50, 0xb7, 0x69, 0x28, 0xa1, 0xf0, 0x60, 0x45, 0xbd, 0x39, 0xd9, 0x1c,\n  0xf4, 0xdb, 0x2c, 0x04, 0xf6, 0x4f, 0x42, 0xe1, 0x91, 0x83, 0x97, 0x0a,\n  0xf0, 0x62, 0xf2, 0x5a, 0x90, 0x1a, 0x8f, 0x04, 0x48, 0x06, 0x04, 0x0b,\n  0x74, 0x62, 0xe2, 0xda, 0x80, 0x50, 0x31, 0x46, 0xf1, 0x1d, 0x02, 0xb6,\n  0xa1, 0x49, 0x0e, 0x09, 0x81, 0xd3, 0x73, 0x2b, 0x17, 0x46, 0x46, 0xee,\n  0x3d, 0xb8, 0x76, 0xf2, 0xe4, 0xa1, 0x85, 0x03, 0x89, 0xc4, 0x32, 0xfb,\n  0x7c, 0x7b, 0xc3, 0xfe, 0x57, 0x7f, 0x22, 0xa1, 0x3e, 0x4c, 0xee, 0x5c,\n  0xb7, 0x27, 0xac, 0xf5, 0x1d, 0xfb, 0x9f, 0x38, 0x75, 0xea, 0xf1, 0x7d,\n  0x33, 0x8f, 0xde, 0x7b, 0xef, 0xa3, 0x6d, 0x2b, 0xfd, 0x8f, 0xf6, 0x1f,\n  0xcc, 0x28, 0x31, 0x62, 0xd7, 0xe3, 0x33, 0x30, 0x86, 0xf9, 0x02, 0x5e,\n  0x13, 0xef, 0x95, 0xd6, 0xe4, 0xec, 0xe5, 0xd6, 0x64, 0x43, 0xb5, 0x26,\n  0x67, 0xb7, 0x5d, 0x93, 0x44, 0x1c, 0x31, 0xd5, 0x95, 0xf1, 0x86, 0x44,\n  0x43, 0x28, 0x20, 0xad, 0x89, 0x84, 0x6d, 0x52, 0x6e, 0x4d, 0xd4, 0x8b,\n  0xa2, 0x0e, 0xe7, 0x82, 0xb0, 0x42, 0xe4, 0xe8, 0x9f, 0xf3, 0xf0, 0xa6,\n  0x51, 0x8f, 0xd7, 0xea, 0x13, 0x75, 0x09, 0x6f, 0xb8, 0x2d, 0xc2, 0x72,\n  0x1a, 0xf7, 0x7c, 0x76, 0xf5, 0xdc, 0x2d, 0xd7, 0x8c, 0x8f, 0x8e, 0x4d,\n  0xec, 0x1a, 0x41, 0xc3, 0x6c, 0xac, 0x31, 0x3e, 0xb1, 0xf9, 0xde, 0xee,\n  0xa4, 0x0c, 0xd8, 0xd2, 0x67, 0x6b, 0xb4, 0xc6, 0x1a, 0x41, 0x33, 0xc4,\n  0x3a, 0xef, 0xca, 0x89, 0x7d, 0xcb, 0xb6, 0x23, 0xc7, 0x14, 0xbc, 0xa9,\n  0x15, 0x82, 0x81, 0xe2, 0x87, 0x0c, 0x5d, 0x11, 0xf2, 0x22, 0xa7, 0x30,\n  0x29, 0x03, 0x58, 0x93, 0xc0, 0xae, 0xeb, 0x80, 0xa1, 0xad, 0x68, 0x11,\n  0x85, 0x2a, 0x24, 0x72, 0x01, 0x00, 0x72, 0x63, 0xb6, 0xe5, 0x77, 0xf8,\n  0xad, 0x0a, 0x28, 0x3e, 0xc0, 0x72, 0xeb, 0x15, 0x0d, 0x57, 0x23, 0xda,\n  0xb1, 0x42, 0x47, 0xb3, 0x25, 0xad, 0x6e, 0xf9, 0x24, 0x46, 0x29, 0x0a,\n  0x4d, 0x74, 0xec, 0x43, 0x6f, 0x5c, 0xda, 0xbb, 0xf7, 0x73, 0x47, 0x00,\n  0xa0, 0x88, 0x7d, 0x56, 0x41, 0x26, 0x4a, 0xe7, 0x5e, 0x44, 0xe9, 0x29,\n  0xb4, 0x77, 0x26, 0xf7, 0x47, 0x19, 0xa3, 0x48, 0x4f, 0xe2, 0x18, 0x62,\n  0x58, 0x33, 0xbd, 0x85, 0x7e, 0x14, 0x83, 0xdd, 0x80, 0xe7, 0x8a, 0xa6,\n  0x6c, 0x88, 0xdf, 0xe1, 0xcf, 0x1a, 0xf0, 0x5f, 0x02, 0xb9, 0xc2, 0xca,\n  0x58, 0x0d, 0x01, 0xad, 0x08, 0xd5, 0x0c, 0xa1, 0xca, 0x09, 0x85, 0x6b,\n  0x07, 0x84, 0x96, 0x0d, 0x49, 0xa0, 0x81, 0x04, 0x50, 0xd5, 0x6d, 0x72,\n  0x43, 0xb2, 0xc4, 0xc8, 0x32, 0x8f, 0x12, 0xc4, 0x94, 0xa4, 0x87, 0x37,\n  0x45, 0x20, 0x88, 0x3b, 0xe3, 0x24, 0x4a, 0x51, 0x36, 0x30, 0x49, 0x32,\n  0xae, 0x88, 0x6a, 0x6e, 0x87, 0x4d, 0xa8, 0xe7, 0x7d, 0x3b, 0x3b, 0x2a,\n  0xe2, 0x26, 0x83, 0x29, 0x6c, 0xee, 0x58, 0xd0, 0xa3, 0xfe, 0xb1, 0x4b,\n  0x97, 0xc6, 0x5e, 0x5c, 0xab, 0xcd, 0x72, 0xdc, 0x3c, 0xc7, 0xcf, 0x0d,\n  0x31, 0x4a, 0xad, 0x0b, 0x82, 0xc3, 0xe0, 0x00, 0x19, 0x42, 0x43, 0x86,\n  0x31, 0xa5, 0x13, 0x05, 0x8e, 0xd3, 0xb2, 0x50, 0x88, 0x85, 0x39, 0x4a,\n  0x73, 0x43, 0x64, 0xe0, 0x27, 0x87, 0x9d, 0x22, 0x21, 0x80, 0x1e, 0x60,\n  0xd5, 0xd3, 0x71, 0x80, 0xd8, 0x97, 0xc6, 0x23, 0x49, 0xb7, 0x00, 0xc9,\n  0x88, 0x62, 0x7b, 0x9c, 0xad, 0x3d, 0x72, 0xfb, 0xd2, 0x1d, 0x57, 0x77,\n  0x8f, 0xac, 0x0d, 0xfd, 0x72, 0x78, 0x75, 0xf4, 0x85, 0xe9, 0x77, 0xb0,\n  0x3b, 0x66, 0x7e, 0x02, 0x55, 0x2c, 0x7e, 0x31, 0x73, 0x1e, 0xff, 0xf7,\n  0xf2, 0x5b, 0xe4, 0x5a, 0x16, 0x04, 0x5b, 0x20, 0x05, 0x68, 0x74, 0x1e,\n  0x2b, 0xab, 0xe1, 0x2d, 0x48, 0xc0, 0xcb, 0xa6, 0xc5, 0xc3, 0xd0, 0x89,\n  0x2c, 0x8f, 0x5f, 0x7d, 0x14, 0xce, 0xe7, 0x82, 0xea, 0x15, 0xf1, 0x98,\n  0xd5, 0x91, 0x8c, 0x93, 0xd3, 0x59, 0x8f, 0x4f, 0x67, 0x3b, 0x7d, 0x29,\n  0x68, 0x20, 0x45, 0xd8, 0x15, 0x78, 0x44, 0x76, 0x02, 0x5d, 0x11, 0xc7,\n  0x62, 0x31, 0x5a, 0x1e, 0xfa, 0x6c, 0xff, 0xca, 0x50, 0xe7, 0xee, 0xfb,\n  0x0a, 0x4a, 0x54, 0x5c, 0xb7, 0xaf, 0xef, 0x93, 0x50, 0xba, 0xc2, 0x71,\n  0x9f, 0xab, 0xc2, 0xc3, 0x7a, 0x3e, 0xf2, 0x91, 0x8f, 0x8c, 0xe5, 0x1e,\n  0xc9, 0xe3, 0x56, 0xa0, 0xd8, 0x58, 0xee, 0xd7, 0xde, 0xf9, 0xaa, 0x8e,\n  0xce, 0xca, 0x09, 0x1a, 0x8b, 0xb4, 0xf5, 0x47, 0xfc, 0xa9, 0x62, 0xa8,\n  0x82, 0x19, 0x66, 0x9b, 0x4a, 0x70, 0x8e, 0x29, 0x36, 0xf4, 0x22, 0xa6,\n  0x0d, 0x90, 0x28, 0x4f, 0x66, 0x0d, 0x3e, 0x1d, 0x26, 0x03, 0x07, 0xd6,\n  0xe5, 0xe5, 0x5c, 0x09, 0x1f, 0x41, 0x71, 0xa6, 0xb0, 0x6e, 0x5a, 0xac,\n  0xe8, 0x72, 0xcc, 0x9a, 0x02, 0x0c, 0x0d, 0x50, 0xe2, 0xec, 0x86, 0x1a,\n  0x38, 0xba, 0xb0, 0x01, 0xde, 0xaf, 0x50, 0xfa, 0x21, 0x95, 0x08, 0x55,\n  0x87, 0xab, 0x3d, 0x2e, 0x4b, 0x85, 0xd1, 0x20, 0x92, 0xa2, 0x0f, 0x45,\n  0x18, 0xcf, 0x45, 0xbb, 0x76, 0x7b, 0xa4, 0x67, 0xde, 0x3c, 0xea, 0xb1,\n  0x6a, 0x6d, 0xbc, 0x18, 0xb1, 0xa6, 0x9a, 0x0d, 0xa5, 0x70, 0xcf, 0x23,\n  0xb9, 0xe5, 0xb0, 0x97, 0x47, 0x59, 0x5e, 0x97, 0xa8, 0x57, 0x43, 0x3e,\n  0x93, 0x58, 0x42, 0xa8, 0x75, 0x80, 0xd7, 0x81, 0xb7, 0xb3, 0xeb, 0x65,\n  0xd6, 0x81, 0xd6, 0x42, 0xd8, 0xc4, 0xfa, 0x7d, 0x0d, 0xf3, 0xa1, 0x32,\n  0x38, 0x6b, 0x14, 0x2c, 0x7b, 0x7b, 0x9c, 0x35, 0xc0, 0x5a, 0xa1, 0x40,\n  0x92, 0x97, 0x43, 0x64, 0x23, 0x58, 0x85, 0xea, 0x52, 0x69, 0xe5, 0x11,\n  0xd9, 0x8a, 0x9a, 0x41, 0x78, 0x42, 0x2c, 0x8a, 0x98, 0xca, 0x54, 0xb4,\n  0x26, 0x56, 0x03, 0x70, 0x43, 0x04, 0x92, 0x2d, 0x82, 0x22, 0x57, 0x84,\n  0x64, 0x13, 0x29, 0x1e, 0x9b, 0x6c, 0x01, 0xfb, 0xb2, 0x3d, 0x49, 0xc1,\n  0xd8, 0x94, 0xca, 0x08, 0x87, 0x68, 0xb5, 0x84, 0xdf, 0xec, 0x19, 0x1c,\n  0x58, 0x18, 0xcf, 0x03, 0xb1, 0x75, 0x28, 0xe6, 0x3d, 0x28, 0x99, 0x70,\n  0xe6, 0xc1, 0xdc, 0x4b, 0x6b, 0xeb, 0x47, 0xc0, 0xbc, 0xc7, 0x48, 0x58,\n  0x04, 0x7f, 0x8d, 0x69, 0x86, 0x60, 0xfc, 0x7b, 0xf1, 0x96, 0xf3, 0x18,\n  0x31, 0x93, 0x36, 0x80, 0x70, 0x53, 0x80, 0x1f, 0x26, 0x45, 0x37, 0x9f,\n  0x41, 0x44, 0x15, 0x24, 0x61, 0xcc, 0x12, 0xc6, 0xbf, 0xbd, 0x59, 0x01,\n  0x00, 0x2a, 0xc1, 0xfa, 0xff, 0xfb, 0xb1, 0xe3, 0x3d, 0x43, 0x67, 0xc6,\n  0x6a, 0x06, 0xfc, 0x81, 0xc1, 0xea, 0xb9, 0xd9, 0xc9, 0xb9, 0xc0, 0x90,\n  0xc7, 0xef, 0xd9, 0xc3, 0xc6, 0xda, 0x6f, 0x58, 0x39, 0x74, 0xbe, 0xb7,\n  0xc2, 0x3c, 0x63, 0xb2, 0x9d, 0x3c, 0x7c, 0xf8, 0xa0, 0xd9, 0x38, 0x61,\n  0xb4, 0x12, 0x9e, 0xd0, 0xb8, 0xf5, 0x15, 0xf4, 0x33, 0x12, 0xab, 0xdc,\n  0x00, 0xa8, 0x1a, 0xf2, 0xb7, 0xab, 0x0c, 0x1b, 0xb0, 0x14, 0xe1, 0x41,\n  0xf8, 0xc7, 0x54, 0xc0, 0xcf, 0x72, 0x13, 0x0c, 0x0b, 0x58, 0x2d, 0x2c,\n  0x7f, 0x4c, 0xc1, 0xa0, 0x2e, 0xa8, 0xae, 0x0c, 0x41, 0xc3, 0x35, 0x55,\n  0xc9, 0x86, 0x54, 0x83, 0x84, 0x36, 0x93, 0x40, 0x09, 0xad, 0x1a, 0x48,\n  0xdb, 0xe9, 0x70, 0xcb, 0x8b, 0x2b, 0x19, 0x92, 0x61, 0xbc, 0xed, 0xe4,\n  0xb8, 0x05, 0xd0, 0x3b, 0x69, 0x1e, 0xa8, 0xb3, 0x6a, 0xca, 0x43, 0x20,\n  0xef, 0xf5, 0xa9, 0x85, 0x86, 0xf1, 0xf9, 0xcc, 0x7c, 0x75, 0xe3, 0x7c,\n  0x44, 0x6f, 0xd7, 0x0e, 0x19, 0x7c, 0x15, 0xa9, 0x81, 0x6b, 0x17, 0xa3,\n  0x43, 0x91, 0xca, 0x1d, 0x55, 0x99, 0x18, 0x1b, 0xb3, 0x1a, 0x01, 0xfb,\n  0xbe, 0x35, 0x99, 0xac, 0x1c, 0x6e, 0x6b, 0xee, 0x0f, 0xba, 0xbd, 0xf6,\n  0x1a, 0x6f, 0x38, 0xd2, 0xe5, 0xcd, 0x1e, 0x3d, 0x74, 0x6b, 0x57, 0xee,\n  0xe1, 0x68, 0xba, 0x3e, 0x11, 0xb6, 0x47, 0xe4, 0xb3, 0xf6, 0x75, 0x58,\n  0x0e, 0x4f, 0x62, 0xf9, 0xe3, 0x75, 0xd9, 0x0a, 0xa7, 0x96, 0x15, 0x34,\n  0x31, 0xac, 0x85, 0xc7, 0x51, 0xde, 0xf4, 0x94, 0x92, 0x91, 0x90, 0x25,\n  0x3a, 0x02, 0x92, 0xa2, 0x5f, 0x80, 0xea, 0xe5, 0x22, 0xd5, 0xcb, 0xe1,\n  0xbc, 0x25, 0x06, 0xa8, 0x2b, 0x35, 0xc4, 0x64, 0x97, 0x4e, 0x21, 0xa6,\n  0xbe, 0x36, 0xd5, 0x9c, 0x6e, 0x8e, 0x84, 0xfc, 0x3e, 0xbb, 0xd5, 0x64,\n  0x60, 0x92, 0x28, 0xa9, 0x93, 0x83, 0x26, 0x8a, 0x2c, 0xaf, 0xf9, 0xb8,\n  0x18, 0x45, 0xab, 0x57, 0xef, 0x63, 0xb6, 0x23, 0xd6, 0x19, 0xc7, 0xda,\n  0x83, 0x77, 0xb6, 0x4f, 0x15, 0x03, 0x13, 0x0c, 0xd8, 0xc3, 0xa2, 0x3e,\n  0x9d, 0xfb, 0xb2, 0xb4, 0x97, 0x2f, 0xe2, 0x63, 0xb6, 0xbf, 0xa2, 0xc5,\n  0x14, 0xad, 0xcf, 0xc7, 0xbc, 0xbc, 0xfa, 0x39, 0xe9, 0x08, 0x46, 0x0d,\n  0x6a, 0x1c, 0x77, 0x89, 0x7f, 0x5d, 0x4f, 0xf6, 0x6d, 0x1d, 0xec, 0x5b,\n  0x3b, 0x01, 0xfa, 0x42, 0x5c, 0x50, 0x47, 0xa2, 0x97, 0x54, 0xc5, 0x4c,\n  0x56, 0xe5, 0x12, 0x25, 0xdb, 0x81, 0xdc, 0x07, 0xe5, 0x62, 0x26, 0xc5,\n  0x2d, 0xcb, 0x83, 0xdc, 0xcb, 0x45, 0x14, 0xae, 0x00, 0x72, 0x0f, 0xfb,\n  0xb6, 0x2a, 0x1d, 0xad, 0x8b, 0xd5, 0x05, 0xfc, 0x00, 0x80, 0x83, 0x19,\n  0xa0, 0xb4, 0x6f, 0x8b, 0x0c, 0xf6, 0xad, 0x2d, 0x2a, 0xc0, 0xde, 0xcb,\n  0xa3, 0xdd, 0x9f, 0x93, 0x77, 0xf1, 0x36, 0x90, 0xf7, 0xb3, 0x0f, 0x4a,\n  0xbb, 0x78, 0xf3, 0xbe, 0x42, 0xe4, 0x7b, 0xcc, 0x07, 0x5b, 0xf0, 0xde,\n  0xdd, 0xc4, 0x7b, 0x65, 0x8c, 0x19, 0x67, 0x5b, 0x19, 0xe6, 0x73, 0x4c,\n  0x56, 0xaa, 0x53, 0x20, 0x5d, 0x77, 0x63, 0xdd, 0xbc, 0x2f, 0xdb, 0xed,\n  0xc4, 0xbb, 0xda, 0x41, 0xf4, 0x03, 0xa8, 0x82, 0x22, 0xb0, 0x04, 0xd5,\n  0x47, 0xb5, 0x67, 0xf2, 0x1b, 0x1b, 0x90, 0xe6, 0x6c, 0x58, 0xed, 0xd4,\n  0x11, 0x6c, 0x71, 0xb1, 0x70, 0x73, 0x43, 0x8c, 0xb2, 0x02, 0x82, 0x6b,\n  0x8f, 0x92, 0x9d, 0xfe, 0x3f, 0xd3, 0xd7, 0x0d, 0x74, 0x9f, 0x18, 0x1b,\n  0x3e, 0x9c, 0x41, 0xa7, 0xd8, 0xc5, 0x39, 0xa2, 0x6b, 0x7d, 0x27, 0xf7,\n  0x1b, 0xd4, 0x37, 0xd4, 0x3f, 0xc1, 0xc6, 0xfa, 0x6e, 0x5e, 0xc2, 0x9a,\n  0x54, 0xcf, 0xc6, 0x44, 0x66, 0xdf, 0x0a, 0xd1, 0xae, 0x72, 0xcf, 0x0c,\n  0xef, 0x99, 0xa7, 0xba, 0x7a, 0x0d, 0x1e, 0xe3, 0x3f, 0x12, 0xbc, 0xd5,\n  0x3b, 0x95, 0x6f, 0x5f, 0x83, 0xc7, 0xec, 0x60, 0xaa, 0xa0, 0xf6, 0x1f,\n  0x3e, 0x7c, 0x01, 0x71, 0x9e, 0xe2, 0xb8, 0x43, 0xb2, 0x00, 0xab, 0x0c,\n  0x18, 0xe0, 0xbf, 0xe8, 0x80, 0x5d, 0x4e, 0xc4, 0x24, 0xe3, 0x00, 0xdf,\n  0xe9, 0xac, 0x72, 0x55, 0x59, 0xcc, 0x78, 0x96, 0x0e, 0x6d, 0x1e, 0x54,\n  0x86, 0x5a, 0x3f, 0x4a, 0xc2, 0xff, 0x09, 0x4c, 0x8a, 0xb4, 0xbb, 0xa7,\n  0x0f, 0x1f, 0x6d, 0x6b, 0x08, 0xb6, 0xc7, 0x9b, 0x8f, 0xce, 0x5d, 0xb8,\n  0xf0, 0xc6, 0x7b, 0x56, 0x96, 0x0e, 0xec, 0xef, 0x9b, 0x9c, 0x9a, 0xae,\n  0x0e, 0x8c, 0xec, 0x6a, 0x63, 0x63, 0xf3, 0x03, 0xad, 0x19, 0x13, 0xcf,\n  0x07, 0x5a, 0xab, 0x6a, 0x27, 0x6b, 0x1f, 0xb9, 0xe3, 0xee, 0xb7, 0xee,\n  0x38, 0x7a, 0xf5, 0xd1, 0xc3, 0x0d, 0x8d, 0xb5, 0xc9, 0xf1, 0x68, 0x63,\n  0xac, 0x9e, 0xe8, 0x84, 0x54, 0x17, 0x83, 0xca, 0x13, 0xbd, 0xd9, 0xae,\n  0xb2, 0x3a, 0x61, 0x01, 0x8e, 0x0b, 0x31, 0xa5, 0x29, 0x5a, 0x21, 0xe0,\n  0xda, 0xe2, 0x85, 0x2e, 0xc2, 0x71, 0x29, 0xd0, 0x72, 0x5c, 0x85, 0xca,\n  0xcd, 0xc5, 0x52, 0x95, 0x86, 0x65, 0xda, 0x88, 0xec, 0xbe, 0x89, 0x77,\n  0x4d, 0x17, 0xf3, 0x36, 0x82, 0xd5, 0x4c, 0x2a, 0xa3, 0xa4, 0xb1, 0x5e,\n  0x0f, 0x11, 0x49, 0x16, 0x3c, 0x28, 0x19, 0x28, 0xaf, 0x46, 0x81, 0x16,\n  0x3c, 0x39, 0xad, 0x43, 0x79, 0x49, 0x4f, 0x2a, 0x69, 0x79, 0xa6, 0x10,\n  0xcc, 0xab, 0x4a, 0x2b, 0x17, 0x53, 0xb9, 0x52, 0xdb, 0xc5, 0xac, 0xbf,\n  0xa1, 0x1e, 0x31, 0x99, 0x96, 0xfa, 0xae, 0x86, 0xae, 0x64, 0x3c, 0x1c,\n  0x74, 0xd8, 0x64, 0x6c, 0x7d, 0x7d, 0x01, 0xc8, 0x97, 0x93, 0xc4, 0xbb,\n  0xd3, 0x14, 0x0d, 0x60, 0x39, 0x6d, 0x99, 0x78, 0x31, 0xcb, 0x69, 0xe5,\n  0xd4, 0xa9, 0x1a, 0x6c, 0xab, 0x04, 0x3a, 0xea, 0xbb, 0xfe, 0x16, 0xc8,\n  0xd4, 0x18, 0x99, 0x95, 0xd3, 0x34, 0xd6, 0x33, 0x7b, 0x42, 0x78, 0x07,\n  0xbd, 0x4b, 0xce, 0xd6, 0x90, 0xcf, 0xbb, 0xcd, 0xf3, 0x67, 0xaf, 0x8b,\n  0xcd, 0x57, 0xcf, 0x8f, 0x3a, 0xb5, 0x61, 0x1f, 0x9a, 0x7f, 0xe8, 0xee,\n  0xf3, 0x6f, 0xaf, 0xac, 0xc2, 0x47, 0xe7, 0x38, 0x3e, 0xf9, 0x4e, 0x1c,\n  0x3a, 0x74, 0x6c, 0xef, 0xaa, 0xf3, 0x9a, 0x95, 0x7c, 0x3e, 0x00, 0xa6,\n  0x41, 0x92, 0x0f, 0x40, 0x30, 0xb1, 0xd0, 0x2b, 0x44, 0x7e, 0x1a, 0xcd,\n  0x0e, 0x61, 0x31, 0x09, 0x73, 0x05, 0x1e, 0x81, 0x9d, 0xd4, 0x8e, 0xc5,\n  0x7e, 0xc0, 0x6b, 0xc4, 0xac, 0x96, 0x57, 0x95, 0x6d, 0x20, 0xc7, 0x62,\n  0xbe, 0x6c, 0x83, 0xdb, 0x49, 0xab, 0x1f, 0x50, 0xb9, 0x88, 0x82, 0xc7,\n  0xb8, 0xd5, 0x15, 0x55, 0x8a, 0x0a, 0x09, 0xa0, 0xa1, 0x6b, 0x7a, 0x23,\n  0xe1, 0xb1, 0xc8, 0xc7, 0xa7, 0xa7, 0x12, 0x2d, 0x81, 0xb3, 0xcf, 0x35,\n  0x2d, 0x77, 0x8f, 0x9d, 0xea, 0x1f, 0x3f, 0xc7, 0xc6, 0x12, 0x53, 0x16,\n  0xfb, 0x73, 0xab, 0xeb, 0xa2, 0xf8, 0xf0, 0x58, 0xee, 0x77, 0x36, 0x07,\n  0xad, 0xb2, 0x22, 0xd7, 0x0a, 0xb0, 0xa1, 0x57, 0x31, 0xbd, 0x79, 0xe1,\n  0xf4, 0xc8, 0x36, 0x44, 0x1c, 0xaa, 0x5a, 0x01, 0x1b, 0x85, 0xb5, 0x02,\n  0xfc, 0x3e, 0xc4, 0xf8, 0x92, 0xfe, 0xa4, 0xdd, 0xa6, 0x15, 0xa1, 0x22,\n  0x83, 0x46, 0x41, 0x95, 0x6a, 0xe7, 0x5a, 0xdc, 0x00, 0xad, 0x46, 0x70,\n  0xc4, 0x39, 0x55, 0x60, 0x1c, 0xad, 0x16, 0xb0, 0xd9, 0xda, 0x9f, 0xf2,\n  0x3f, 0xb7, 0x7c, 0xc4, 0x1c, 0x13, 0x79, 0x8d, 0xc3, 0xa5, 0x3b, 0xb2,\n  0xfc, 0xa5, 0x70, 0xac, 0xbf, 0xb5, 0xc2, 0x65, 0xb3, 0xdb, 0x6d, 0xae,\n  0x5f, 0x8f, 0x65, 0x9a, 0xf7, 0xb7, 0xa0, 0x7f, 0xfb, 0x6d, 0x64, 0x4f,\n  0xc4, 0xd1, 0xd6, 0xe6, 0xfc, 0x6d, 0xae, 0xbd, 0x7b, 0x7f, 0x75, 0xeb,\n  0xf8, 0x84, 0x37, 0xe0, 0x18, 0x0c, 0x87, 0x07, 0x1c, 0x01, 0x1f, 0xc3,\n  0x6e, 0x6d, 0x6e, 0xfd, 0x11, 0xcb, 0xd7, 0x31, 0xa6, 0x91, 0xe9, 0x01,\n  0xf9, 0x3a, 0x0c, 0xb2, 0x7d, 0x95, 0xdb, 0xc0, 0xf3, 0x3c, 0x22, 0x48,\n  0xf8, 0x79, 0x8c, 0x1e, 0xa9, 0xca, 0x11, 0x41, 0x26, 0xed, 0x68, 0x8b,\n  0x47, 0x6d, 0x16, 0x4c, 0x37, 0x8d, 0xa8, 0xb1, 0x18, 0xb6, 0xdd, 0x95,\n  0x8f, 0x78, 0x68, 0x07, 0x43, 0x7b, 0x4a, 0x41, 0xe3, 0x76, 0xe7, 0x61,\n  0xe2, 0x38, 0x4d, 0x7e, 0x9b, 0xa3, 0xe7, 0x4d, 0x0e, 0x9d, 0x60, 0xd5,\n  0x1a, 0xbd, 0xae, 0x73, 0x89, 0x48, 0x7f, 0x6b, 0x6b, 0x7f, 0x2c, 0x76,\n  0x87, 0xc5, 0x6b, 0xd6, 0x99, 0x04, 0x9d, 0xd3, 0x1c, 0xaa, 0x0e, 0xf4,\n  0x9a, 0x7d, 0x3a, 0x5e, 0x1f, 0x30, 0xf5, 0xba, 0x6b, 0x9f, 0xb1, 0x38,\n  0x5d, 0x15, 0x15, 0x2e, 0x37, 0x1b, 0xe3, 0xf9, 0x11, 0x96, 0xb3, 0x86,\n  0xfe, 0xaa, 0x69, 0xb0, 0xa6, 0xa5, 0xb7, 0xb7, 0xb5, 0x66, 0xb8, 0xfe,\n  0x29, 0x97, 0x0d, 0x21, 0x9e, 0x1d, 0xe2, 0x35, 0xa1, 0xd4, 0x6e, 0x7b,\n  0x95, 0xcd, 0x5a, 0x63, 0xbb, 0x2a, 0x12, 0xcb, 0xbd, 0xdf, 0x5d, 0xe3,\n  0xf1, 0xb8, 0x3d, 0x1e, 0x5f, 0x1d, 0x95, 0xcd, 0x23, 0x50, 0xd3, 0x14,\n  0xcb, 0xe6, 0x93, 0xec, 0x71, 0x59, 0x26, 0x45, 0xf9, 0x1a, 0x24, 0x34,\n  0xaf, 0x01, 0xce, 0xb6, 0xb5, 0xac, 0x59, 0x83, 0x00, 0x74, 0x87, 0x45,\n  0x60, 0xb9, 0x91, 0x81, 0x7f, 0x03, 0x2a, 0x8b, 0x4a, 0xbe, 0xf0, 0x93,\n  0x20, 0x7b, 0x13, 0x21, 0x5d, 0x86, 0x82, 0xc5, 0x97, 0xdc, 0xa4, 0x28,\n  0xec, 0x11, 0x26, 0x12, 0xb3, 0x57, 0x02, 0x30, 0x33, 0xa0, 0xb0, 0xab,\n  0x4f, 0xa0, 0x7c, 0x71, 0x03, 0x8a, 0xce, 0x8c, 0xf7, 0xe0, 0x9e, 0x9b,\n  0x65, 0x24, 0x5f, 0x41, 0xe3, 0x5b, 0x6c, 0x5d, 0x5b, 0xdb, 0x7b, 0xd3,\n  0xd2, 0x10, 0x16, 0x0d, 0xa5, 0x1d, 0xb4, 0x4c, 0xeb, 0x1a, 0xe4, 0xfe,\n  0x12, 0xed, 0xbd, 0x13, 0x2a, 0x1d, 0x90, 0xfa, 0x0f, 0x16, 0x32, 0xfe,\n  0x1a, 0xe6, 0x6e, 0x99, 0xc3, 0xb0, 0xc8, 0x84, 0x34, 0x82, 0x1f, 0x61,\n  0x15, 0x06, 0xcf, 0x43, 0xe6, 0x30, 0x49, 0x95, 0xb8, 0xcc, 0xa8, 0xe5,\n  0x6a, 0xe2, 0x50, 0xc8, 0xdb, 0x09, 0xe2, 0x8a, 0xb4, 0xbc, 0x7d, 0x2b,\n  0x02, 0xc9, 0x59, 0x55, 0x09, 0xfc, 0xc4, 0xe3, 0x22, 0x74, 0x51, 0x83,\n  0x6a, 0xb4, 0xc5, 0x72, 0xb2, 0x32, 0x3b, 0x87, 0x4a, 0x04, 0xb5, 0xca,\n  0x11, 0x10, 0xad, 0x5f, 0x29, 0x9a, 0xea, 0x39, 0x7b, 0xdc, 0x20, 0x06,\n  0x2d, 0x6e, 0x0f, 0x9e, 0xf2, 0x82, 0xc2, 0x34, 0xe4, 0x29, 0xf7, 0x3f,\n  0xa8, 0xe3, 0xf1, 0x05, 0x7f, 0x18, 0xfd, 0x23, 0x99, 0x3a, 0xc5, 0xca,\n  0x27, 0x36, 0x01, 0xc9, 0xe6, 0xe6, 0x66, 0x3e, 0x43, 0xed, 0x6c, 0x51,\n  0xac, 0x25, 0x82, 0x4d, 0x00, 0x13, 0xf2, 0xba, 0x8a, 0xad, 0xca, 0x96,\n  0xae, 0x13, 0x9c, 0x6c, 0x63, 0x2b, 0xdb, 0xf0, 0x74, 0x51, 0xc3, 0xba,\n  0xd7, 0xf6, 0xc4, 0x6c, 0x98, 0xf0, 0x64, 0x30, 0xae, 0xa9, 0x1b, 0xe7,\n  0x5b, 0x80, 0x5d, 0xcd, 0x6f, 0x34, 0x22, 0xc6, 0xe8, 0x36, 0xba, 0x5d,\n  0x8a, 0x05, 0x12, 0x33, 0x25, 0x03, 0x32, 0xe8, 0x15, 0xaf, 0x85, 0x14,\n  0x04, 0x98, 0xd7, 0xe3, 0x9d, 0x77, 0x49, 0x81, 0x42, 0x0f, 0xc2, 0x41,\n  0xb3, 0xc0, 0xfe, 0x40, 0x89, 0x0a, 0x5a, 0x26, 0xba, 0xfb, 0x8b, 0xf4,\n  0xdc, 0xde, 0x89, 0x79, 0xe4, 0x38, 0xc4, 0x96, 0x22, 0x8a, 0xd1, 0x9a,\n  0x20, 0x79, 0x24, 0x1e, 0xbc, 0x2e, 0xa9, 0x6c, 0x1c, 0xd2, 0xf2, 0x00,\n  0xde, 0x52, 0xcb, 0x28, 0x1c, 0x89, 0xfa, 0xf0, 0x68, 0x95, 0x00, 0x27,\n  0x47, 0xa2, 0x97, 0x44, 0xab, 0x1b, 0xbf, 0xb4, 0xdd, 0x9a, 0xce, 0xa0,\n  0xc0, 0xdc, 0xdc, 0xa5, 0xb9, 0x39, 0xd6, 0xd3, 0x6a, 0xcb, 0x9d, 0xb5,\n  0xb6, 0xb6, 0x5a, 0xd1, 0x1b, 0x6c, 0xad, 0xd4, 0x4f, 0x07, 0xb8, 0xcf,\n  0xd7, 0x93, 0x7a, 0x88, 0x47, 0xb3, 0x46, 0x8b, 0x89, 0xe5, 0xd9, 0x00,\n  0xc0, 0xa0, 0xb0, 0xb2, 0x53, 0x51, 0x00, 0x4c, 0x26, 0xfc, 0x07, 0xef,\n  0x07, 0xbc, 0x9b, 0x44, 0x5e, 0xae, 0xf1, 0x2a, 0x65, 0x5c, 0x6f, 0xd3,\n  0x80, 0xa2, 0x2b, 0xe2, 0x06, 0xd4, 0xa8, 0x11, 0x64, 0x82, 0x31, 0x5b,\n  0xdc, 0x86, 0xff, 0xd0, 0xcc, 0x2c, 0x55, 0xb9, 0x72, 0xb7, 0xb5, 0xc5,\n  0xaa, 0x8a, 0xa4, 0x4b, 0x5b, 0xdf, 0xa2, 0xb3, 0x6a, 0x3d, 0x1e, 0xb1,\n  0x45, 0xd3, 0xd9, 0x60, 0xb2, 0x2e, 0xe8, 0x6c, 0x5a, 0xb7, 0x57, 0x6c,\n  0xd6, 0x74, 0x34, 0x98, 0xad, 0xe8, 0x5a, 0x5e, 0x08, 0x06, 0xbb, 0x47,\n  0x04, 0xd4, 0x93, 0x7b, 0x07, 0xfc, 0xb3, 0x6b, 0x54, 0xc8, 0x7d, 0x0a,\n  0xf3, 0xc0, 0x57, 0xf0, 0x00, 0x76, 0x4b, 0xb1, 0x4f, 0xc7, 0x9e, 0x31,\n  0x22, 0x11, 0xc9, 0x3e, 0x51, 0xa8, 0x68, 0x25, 0x72, 0x48, 0x3c, 0x06,\n  0x91, 0x00, 0xe0, 0x8a, 0xe5, 0x98, 0x63, 0x52, 0x78, 0x89, 0x94, 0xae,\n  0xbb, 0x4d, 0x0b, 0x61, 0x45, 0x2b, 0x97, 0x5e, 0xc0, 0x5f, 0x91, 0x61,\n  0x7c, 0x1e, 0x08, 0x7f, 0xa2, 0xf0, 0x5c, 0xf6, 0x64, 0x54, 0x4f, 0x4b,\n  0x30, 0xc4, 0x94, 0xbc, 0x52, 0xc9, 0xba, 0xcc, 0xb5, 0x28, 0xc2, 0xe7,\n  0x5b, 0xab, 0x7b, 0xdb, 0x9d, 0x0d, 0x69, 0xb3, 0x5f, 0xbf, 0x70, 0xf4,\n  0xe8, 0x2d, 0x71, 0x9b, 0xd7, 0x6e, 0xf1, 0xa2, 0xaa, 0xee, 0x7a, 0x5f,\n  0x63, 0x48, 0xa7, 0x43, 0x96, 0xdc, 0xb9, 0xf1, 0xdc, 0x37, 0xd1, 0x19,\n  0x83, 0x3b, 0xec, 0x30, 0xda, 0x2a, 0xe8, 0xb7, 0x00, 0x3c, 0xac, 0x5e,\n  0xe2, 0xdf, 0x9d, 0xc8, 0xea, 0xf3, 0xf5, 0x4c, 0xe8, 0x54, 0xac, 0x72,\n  0x05, 0x06, 0xea, 0x29, 0x23, 0x3a, 0x89, 0x95, 0x86, 0xf9, 0xa8, 0xae,\n  0x2d, 0x66, 0x4d, 0x57, 0xa8, 0x76, 0xf2, 0xab, 0xda, 0x91, 0xf4, 0xde,\n  0x64, 0xa5, 0x35, 0x65, 0x32, 0x57, 0x82, 0xda, 0xc0, 0x0d, 0xbc, 0xfa,\n  0x39, 0x09, 0x5c, 0x59, 0x1a, 0x03, 0x96, 0x33, 0xc0, 0x77, 0x71, 0x5f,\n  0xd6, 0x86, 0xf5, 0x40, 0x4d, 0x05, 0x62, 0x45, 0xb9, 0x7e, 0x80, 0xec,\n  0xb1, 0xa8, 0x64, 0x44, 0x86, 0xc5, 0x6a, 0x80, 0x54, 0xd1, 0x9c, 0xe3,\n  0x08, 0x76, 0xe7, 0x86, 0xaa, 0xae, 0x80, 0x56, 0x1e, 0x62, 0xbe, 0x69,\n  0xbe, 0x95, 0x20, 0x50, 0xd0, 0xb3, 0x82, 0xa6, 0x14, 0xbc, 0xd0, 0x2b,\n  0x6f, 0x25, 0x82, 0xbd, 0x27, 0x81, 0x17, 0x0a, 0x45, 0xd8, 0x7b, 0xed,\n  0x51, 0x52, 0x4b, 0x46, 0x81, 0x69, 0x44, 0x47, 0xba, 0x97, 0x23, 0xd1,\n  0xb5, 0xae, 0xe9, 0x83, 0xa7, 0xf6, 0x75, 0xbf, 0x94, 0xfb, 0xdc, 0xc2,\n  0x02, 0x7a, 0xff, 0x4b, 0x67, 0x2e, 0x0c, 0xdc, 0x78, 0xd1, 0x6e, 0x99,\n  0xb3, 0xf8, 0x16, 0xa7, 0x77, 0x4f, 0xf6, 0xfe, 0x3e, 0xd7, 0xcc, 0x5e,\n  0xfa, 0x7e, 0xf6, 0x0f, 0xe2, 0xa9, 0x8d, 0xb1, 0x8d, 0x5e, 0x46, 0xb2,\n  0xf3, 0xbc, 0xc2, 0xed, 0x24, 0x67, 0xc9, 0x1c, 0xf7, 0xfe, 0x32, 0x67,\n  0xc9, 0xfc, 0x96, 0x05, 0xee, 0xe3, 0xbd, 0xd7, 0x9a, 0x6d, 0xd2, 0xf3,\n  0x60, 0xbe, 0x9b, 0xd2, 0xf0, 0x2c, 0xd8, 0x6f, 0x88, 0x00, 0xb0, 0x06,\n  0x41, 0x86, 0x67, 0xc8, 0x5e, 0x38, 0x25, 0xc2, 0xde, 0x4b, 0x30, 0x09,\n  0x7b, 0x0c, 0xca, 0xf2, 0xa6, 0x81, 0xce, 0x05, 0x45, 0xd3, 0x2b, 0xad,\n  0xc0, 0xab, 0xfc, 0xcd, 0xfe, 0x49, 0x40, 0xa2, 0x77, 0x4f, 0xe3, 0xed,\n  0x29, 0xc1, 0xbf, 0x3f, 0xb3, 0x6f, 0x69, 0xef, 0xc6, 0xcc, 0xd0, 0xde,\n  0x6b, 0xe6, 0xfb, 0x16, 0x2e, 0xfe, 0x1c, 0xeb, 0x73, 0xd5, 0x55, 0x4b,\n  0xf5, 0xb5, 0xcb, 0xeb, 0xe8, 0x40, 0xee, 0xfd, 0x77, 0xec, 0xdb, 0x83,\n  0x2a, 0xf1, 0x5f, 0x50, 0x6c, 0xf7, 0xd5, 0x4b, 0x32, 0xbd, 0x70, 0x57,\n  0xe1, 0xb3, 0xbf, 0x96, 0xb9, 0x39, 0x5b, 0x51, 0x15, 0xc7, 0x32, 0x93,\n  0x1e, 0xb1, 0xbc, 0x8e, 0xd8, 0x14, 0xa8, 0x16, 0x17, 0xa6, 0x82, 0x8a,\n  0x56, 0xd4, 0x71, 0x20, 0x03, 0x68, 0xe4, 0x22, 0x1c, 0x44, 0xb2, 0x27,\n  0xd9, 0x36, 0x71, 0x06, 0x50, 0x50, 0xa5, 0x66, 0x34, 0xbc, 0xa8, 0xa4,\n  0x15, 0x56, 0xc9, 0xc0, 0x90, 0x02, 0xe9, 0xd5, 0x01, 0x1f, 0x38, 0x10,\n  0xcc, 0x46, 0xcc, 0xe6, 0x6a, 0x51, 0xad, 0x6c, 0x76, 0xdd, 0xe6, 0x44,\n  0x28, 0x8c, 0x8d, 0x83, 0x9f, 0xec, 0x63, 0xfb, 0x96, 0x94, 0x73, 0x41,\n  0x9e, 0xe9, 0x98, 0x49, 0x90, 0x16, 0xe0, 0x00, 0x1b, 0x3b, 0x70, 0x54,\n  0x75, 0x34, 0x7c, 0xfe, 0x8e, 0xa5, 0xab, 0x72, 0xdf, 0x42, 0x8b, 0x77,\n  0x28, 0x11, 0x71, 0x78, 0x39, 0xa8, 0x8f, 0xe8, 0x3f, 0x68, 0x1d, 0x09,\n  0x7c, 0x1c, 0x6f, 0x64, 0xcd, 0x41, 0x3c, 0x65, 0x07, 0x96, 0x21, 0xed,\n  0xd2, 0x39, 0x4f, 0xcc, 0xb1, 0x34, 0x83, 0x48, 0x23, 0x03, 0x14, 0x16,\n  0x1d, 0x8b, 0x11, 0x0a, 0x05, 0xae, 0xd2, 0x77, 0x8a, 0x9a, 0x90, 0x78,\n  0x12, 0xaa, 0x7f, 0xea, 0x44, 0x81, 0x97, 0xe3, 0x49, 0x90, 0xfa, 0x78,\n  0x2f, 0xb4, 0xc6, 0xd0, 0x89, 0xa2, 0xbd, 0x07, 0xf1, 0x29, 0xbf, 0x38,\n  0x9c, 0xe8, 0x49, 0xb8, 0x92, 0x06, 0x6d, 0xd8, 0x14, 0x0e, 0x93, 0x88,\n  0x3f, 0x32, 0x35, 0x38, 0xe8, 0xf1, 0x5c, 0x1e, 0x1b, 0x98, 0x08, 0xea,\n  0xc4, 0x21, 0x5e, 0x4c, 0x76, 0xb3, 0x07, 0xf1, 0xac, 0xa4, 0x7d, 0xf7,\n  0x00, 0x99, 0xcf, 0x6a, 0xd6, 0xec, 0xc5, 0x0a, 0x8d, 0x06, 0xe2, 0x98,\n  0x10, 0x8d, 0x10, 0xf2, 0xd2, 0x2c, 0x0e, 0x56, 0xb1, 0x29, 0x93, 0x8c,\n  0x28, 0x29, 0xee, 0x87, 0x7c, 0xc6, 0x30, 0x55, 0x7f, 0x24, 0x31, 0xf9,\n  0x6c, 0x49, 0x8b, 0xc5, 0xac, 0x0e, 0xe2, 0x16, 0x93, 0x31, 0x28, 0x5b,\n  0x2c, 0x14, 0x41, 0x6b, 0x97, 0x04, 0x31, 0xb2, 0xde, 0x70, 0xc8, 0x1c,\n  0xd6, 0xea, 0xd3, 0xce, 0x78, 0x4f, 0x42, 0x1d, 0xb3, 0x38, 0x9e, 0xb7,\n  0xea, 0xa3, 0xf7, 0xaa, 0xe3, 0x14, 0x19, 0x59, 0xf6, 0x8a, 0x13, 0xdc,\n  0xdd, 0x60, 0xd6, 0x87, 0x88, 0x49, 0x17, 0x9f, 0x52, 0x72, 0x3d, 0x24,\n  0xb0, 0x28, 0xbb, 0xac, 0x14, 0x4c, 0xb9, 0x05, 0xc9, 0x05, 0x45, 0xb0,\n  0xee, 0x68, 0xdd, 0x73, 0x12, 0x61, 0xdd, 0x99, 0xdd, 0xb5, 0x91, 0xfb,\n  0x35, 0x40, 0xd2, 0x7b, 0x72, 0x73, 0xe6, 0xc6, 0x46, 0x23, 0x6a, 0xdb,\n  0xfc, 0x29, 0xfa, 0xb0, 0xa9, 0xa5, 0xd5, 0x92, 0x7b, 0x81, 0x51, 0xc5,\n  0x32, 0x63, 0x3d, 0x82, 0x5d, 0x91, 0x75, 0x59, 0xae, 0x16, 0xaf, 0x19,\n  0xec, 0xd0, 0x3f, 0xd0, 0x55, 0xd2, 0xe3, 0xfe, 0x0c, 0x85, 0x19, 0x96,\n  0x92, 0xe7, 0xe1, 0x0a, 0xc2, 0x57, 0x74, 0x50, 0x2f, 0x09, 0xff, 0xa2,\n  0x95, 0x7e, 0x91, 0x93, 0xb4, 0xe2, 0x0c, 0x87, 0x95, 0x75, 0x8e, 0x5f,\n  0x37, 0x68, 0x59, 0x82, 0x0f, 0xad, 0x27, 0x14, 0xa3, 0xc3, 0xec, 0x5f,\n  0x8d, 0x67, 0x03, 0x8f, 0x6a, 0x2b, 0x6a, 0x4a, 0x7d, 0xad, 0xe4, 0x17,\n  0x52, 0xc6, 0x77, 0x23, 0x0f, 0x63, 0x5c, 0x88, 0x6a, 0xd3, 0xa2, 0x74,\n  0x54, 0xca, 0xfc, 0x52, 0x53, 0xdf, 0x65, 0x7a, 0x41, 0x11, 0x60, 0x9f,\n  0x17, 0xaa, 0xfd, 0x79, 0x13, 0xbe, 0x04, 0x94, 0x90, 0x91, 0x4b, 0x00,\n  0xf3, 0x1c, 0xf8, 0x38, 0x69, 0x50, 0x9f, 0x9b, 0x22, 0xa4, 0x92, 0xa0,\n  0xa1, 0x68, 0x46, 0xd1, 0x79, 0xd4, 0x5a, 0x38, 0x6a, 0x5c, 0xee, 0x43,\n  0x07, 0x73, 0xbf, 0xdf, 0xdc, 0x44, 0xa6, 0xdc, 0x7b, 0x43, 0x73, 0x4d,\n  0x10, 0x9d, 0x7c, 0x66, 0x64, 0x2f, 0x09, 0x4d, 0x66, 0x63, 0x03, 0xed,\n  0x13, 0x0f, 0x4f, 0x3c, 0x39, 0xd1, 0x16, 0x8e, 0x92, 0x90, 0xe4, 0x1d,\n  0x27, 0xa5, 0x92, 0x20, 0x78, 0x7d, 0x3b, 0xf0, 0x7a, 0x7f, 0x03, 0xaf,\n  0xaf, 0x8d, 0x49, 0x43, 0x1d, 0x6a, 0x9d, 0x64, 0x2b, 0xe0, 0xc0, 0x56,\n  0x70, 0x5e, 0x4b, 0x58, 0x06, 0xf5, 0x3c, 0x91, 0x3a, 0x26, 0x6b, 0x2c,\n  0xcd, 0x64, 0x73, 0xd0, 0x5a, 0x98, 0x41, 0x9f, 0xc7, 0x9e, 0x76, 0xa4,\n  0x4d, 0xa0, 0x7b, 0xdb, 0x90, 0x4d, 0x97, 0xc7, 0xf8, 0x24, 0xfc, 0xb0,\n  0xb0, 0x02, 0x80, 0x94, 0x3c, 0x24, 0x8f, 0xf8, 0xbe, 0x13, 0x6f, 0x9b,\n  0x5e, 0x3b, 0x70, 0x32, 0x26, 0x44, 0x36, 0x0e, 0xac, 0x4d, 0x3e, 0x72,\n  0xfa, 0xdc, 0xf9, 0x9e, 0xa6, 0xe6, 0xfa, 0xdd, 0xcd, 0x75, 0xcd, 0x3d,\n  0xb7, 0xb2, 0xb1, 0x99, 0x37, 0xad, 0x1d, 0xbf, 0x7b, 0x69, 0xe9, 0xee,\n  0xe3, 0xab, 0x6f, 0x9a, 0x9d, 0xb8, 0xeb, 0xda, 0x9d, 0xbb, 0x77, 0x74,\n  0xdc, 0x7d, 0x77, 0xdf, 0xf0, 0xee, 0x9d, 0xd7, 0xde, 0x25, 0xd7, 0x29,\n  0xb4, 0xb0, 0xef, 0x61, 0x2f, 0xe1, 0x2d, 0xf4, 0x5d, 0xf2, 0x7b, 0x05,\n  0x95, 0xa5, 0x30, 0x9f, 0xdf, 0x83, 0xde, 0x5d, 0x86, 0xcf, 0xd3, 0xfb,\n  0x20, 0x3f, 0x5c, 0x90, 0x7c, 0x3d, 0x4a, 0x01, 0x56, 0x20, 0x1a, 0xe5,\n  0x37, 0x4e, 0xf1, 0xf5, 0xd8, 0xa8, 0xb9, 0x8b, 0xa8, 0x57, 0x7c, 0x41,\n  0xc9, 0x47, 0x17, 0xbd, 0x23, 0xa5, 0x2c, 0x2a, 0x05, 0x5b, 0xfd, 0xe4,\n  0x06, 0x45, 0x9a, 0x2e, 0xb8, 0x81, 0x3f, 0x73, 0x05, 0x1e, 0x01, 0x75,\n  0x5d, 0xdb, 0x91, 0x5d, 0xae, 0xe6, 0xda, 0x2e, 0xbb, 0xae, 0xa5, 0xaa,\n  0x40, 0x33, 0x15, 0x31, 0xb3, 0xc1, 0x14, 0x31, 0x55, 0x8f, 0xd5, 0x2c,\n  0x8c, 0xeb, 0x79, 0xef, 0x2e, 0x3d, 0xf1, 0xf0, 0xd4, 0xcd, 0xb7, 0xa1,\n  0xdc, 0xa6, 0x76, 0xad, 0x36, 0x4b, 0xe6, 0x61, 0x41, 0x7f, 0x87, 0xf7,\n  0x5f, 0x1c, 0xe2, 0x8e, 0x2c, 0x98, 0x2c, 0xb9, 0x0a, 0xcc, 0x18, 0x23,\n  0x98, 0x31, 0x46, 0x69, 0xdc, 0x11, 0x09, 0x39, 0x92, 0x2d, 0xcc, 0x45,\n  0x71, 0x47, 0xa1, 0x80, 0xd7, 0xe3, 0xb0, 0x99, 0x0c, 0xe0, 0x2f, 0xd5,\n  0x94, 0xda, 0x2a, 0xd5, 0x03, 0xca, 0x5b, 0x2a, 0x37, 0xa2, 0x60, 0x9c,\n  0xc4, 0xa3, 0xe9, 0x50, 0x0d, 0x8f, 0x1a, 0x27, 0x89, 0x70, 0xb1, 0x1f,\n  0x9f, 0x61, 0x92, 0x2f, 0x0a, 0x46, 0x1a, 0x52, 0xdc, 0x82, 0x8a, 0xbc,\n  0x03, 0x3e, 0x36, 0x3b, 0x73, 0x44, 0x5a, 0x77, 0x50, 0x78, 0x2c, 0x50,\n  0x7c, 0x80, 0xac, 0x3b, 0x87, 0x38, 0xf9, 0x37, 0x65, 0xdd, 0x95, 0x25,\n  0x3f, 0xab, 0x00, 0xce, 0xba, 0xe4, 0x50, 0x2a, 0x95, 0x11, 0x9d, 0x98,\n  0x4a, 0x4a, 0x16, 0x36, 0x5f, 0xde, 0x31, 0xcf, 0xef, 0xd0, 0xac, 0xe4,\n  0x3e, 0xab, 0x1a, 0x27, 0x2b, 0xeb, 0xdb, 0xc9, 0xc6, 0xe4, 0x01, 0x6f,\n  0xfe, 0x8e, 0x23, 0x4b, 0xab, 0x1a, 0x6b, 0x84, 0xb9, 0x95, 0x0e, 0xc5,\n  0x02, 0x63, 0x0d, 0xda, 0x40, 0x0c, 0xb7, 0x4b, 0x85, 0xb4, 0xf0, 0x25,\n  0xbe, 0xe0, 0x52, 0x59, 0x14, 0x77, 0xb5, 0x13, 0xb7, 0x14, 0xc5, 0x5d,\n  0xed, 0xb9, 0x25, 0x15, 0xca, 0x00, 0xcb, 0x84, 0x3a, 0x2e, 0x34, 0xc5,\n  0x33, 0x28, 0x62, 0xe3, 0x25, 0xd3, 0x49, 0x54, 0x5a, 0xc3, 0x26, 0x73,\n  0x14, 0x0a, 0x6a, 0x14, 0x4d, 0x2c, 0xf7, 0xa8, 0xaa, 0x9e, 0xc6, 0x2a,\n  0x99, 0x22, 0x9e, 0xe3, 0x4e, 0xfc, 0x63, 0x9c, 0xe0, 0xfd, 0xd6, 0x64,\n  0x2b, 0x65, 0xdd, 0x53, 0xb6, 0x22, 0xc8, 0xc3, 0x23, 0xf9, 0x74, 0xc4,\n  0xa2, 0x26, 0x49, 0x98, 0xf6, 0x7c, 0xe0, 0x1d, 0x1c, 0x8c, 0x6d, 0x6d,\n  0xbf, 0x73, 0x34, 0xda, 0x0c, 0xa6, 0x94, 0x3f, 0x1e, 0xdf, 0x5b, 0x89,\n  0x1f, 0xa7, 0xd7, 0x4c, 0xf2, 0x86, 0xda, 0xc6, 0xdc, 0x3d, 0xe8, 0x96,\n  0xc1, 0xf1, 0x20, 0xbc, 0xc7, 0x86, 0xd7, 0x52, 0x2b, 0xbf, 0xc7, 0x8c,\n  0x19, 0xb6, 0x09, 0x95, 0x46, 0x81, 0x9d, 0x42, 0x45, 0x75, 0xfb, 0x88,\n  0x89, 0x54, 0xce, 0xf3, 0x05, 0x27, 0xc2, 0xd1, 0xc6, 0xf1, 0xca, 0xbd,\n  0xf1, 0xb8, 0x3f, 0x65, 0x32, 0xd8, 0x1a, 0xd9, 0x58, 0x70, 0x7c, 0x70,\n  0xf3, 0x6d, 0xec, 0xf1, 0xc6, 0x5a, 0x03, 0x3f, 0xa9, 0xd1, 0x13, 0xff,\n  0x14, 0xfe, 0x11, 0xc6, 0xfb, 0xc1, 0x8c, 0x75, 0xc9, 0x96, 0x6c, 0xa3,\n  0x0e, 0x0b, 0x47, 0x24, 0xf2, 0x8b, 0x45, 0x3c, 0x0b, 0xf1, 0x5e, 0x0c,\n  0x1c, 0x23, 0x1b, 0xd3, 0xe0, 0x0f, 0xa5, 0x7e, 0x4f, 0x40, 0x32, 0xc7,\n  0xad, 0xcd, 0x56, 0xb7, 0x54, 0xdb, 0x56, 0xae, 0x74, 0xe3, 0xc6, 0x7b,\n  0xd0, 0xa9, 0x44, 0x75, 0xed, 0xb9, 0x78, 0xd5, 0xd1, 0x44, 0x67, 0xe4,\n  0x1d, 0x47, 0xee, 0xbf, 0xeb, 0xf6, 0xbe, 0x91, 0xd6, 0xbe, 0x37, 0xb1,\n  0x9e, 0xf9, 0xe9, 0x86, 0xfe, 0xb8, 0xf6, 0x07, 0x2f, 0xbc, 0x80, 0x42,\n  0x75, 0xf5, 0xa9, 0x46, 0x46, 0xc1, 0x58, 0xc0, 0xef, 0x47, 0x63, 0x7c,\n  0x3f, 0xfe, 0x97, 0x27, 0xcb, 0x14, 0x79, 0xd0, 0xe4, 0x38, 0xc9, 0x8f,\n  0xe2, 0xb5, 0x68, 0x87, 0x3d, 0x5b, 0x85, 0x04, 0xbe, 0xda, 0x89, 0x35,\n  0x4d, 0x4c, 0x0c, 0x9c, 0x11, 0x2f, 0x3b, 0x28, 0x01, 0xc2, 0x94, 0x0c,\n  0xd4, 0x72, 0x96, 0x42, 0xde, 0xd0, 0x22, 0x51, 0xf9, 0xda, 0x2b, 0xc9,\n  0xda, 0x54, 0x32, 0x41, 0x0e, 0xf6, 0x24, 0x61, 0xae, 0x45, 0x15, 0x4b,\n  0xaf, 0x18, 0x28, 0x89, 0x3e, 0x7a, 0xdd, 0x5a, 0x5d, 0x5c, 0x45, 0x2c,\n  0x97, 0x8b, 0x8f, 0x7c, 0xeb, 0xcc, 0x9c, 0x66, 0x38, 0x4f, 0x3c, 0x1f,\n  0xb9, 0x5c, 0x64, 0xa4, 0x24, 0xa7, 0xa1, 0x30, 0xbb, 0x89, 0x55, 0xc0,\n  0x05, 0xea, 0x21, 0xb4, 0x63, 0x39, 0x1a, 0xd9, 0x10, 0x4d, 0x4a, 0x09,\n  0x12, 0x8e, 0x29, 0xef, 0xdc, 0x93, 0x85, 0x56, 0x51, 0x07, 0x5c, 0xc3,\n  0x2c, 0x80, 0x68, 0x94, 0x79, 0x03, 0x68, 0x05, 0x58, 0x00, 0xc9, 0x9e,\n  0x08, 0xa2, 0xa0, 0x50, 0x52, 0xb5, 0xaf, 0x40, 0x22, 0xc3, 0xd4, 0xf8,\n  0xa2, 0x2b, 0xa5, 0xd7, 0x62, 0x69, 0x26, 0xac, 0x12, 0xc8, 0x12, 0xbd,\n  0xec, 0xa6, 0x24, 0x7f, 0x6d, 0xae, 0xa9, 0x64, 0xb1, 0xf7, 0x00, 0x81,\n  0xe6, 0xc7, 0x9c, 0x64, 0x6e, 0xcc, 0xda, 0x5c, 0xf8, 0x9b, 0xb8, 0xc1,\n  0x1f, 0xa6, 0xe4, 0x9a, 0x2a, 0x70, 0xed, 0x9c, 0x28, 0x99, 0x9e, 0xa5,\n  0xef, 0x73, 0xb2, 0x48, 0xf7, 0x09, 0x41, 0x25, 0x57, 0x8e, 0x17, 0x8e,\n  0xa9, 0x9a, 0x16, 0x6b, 0x3c, 0x00, 0x59, 0x04, 0xb9, 0x47, 0x92, 0x95,\n  0x5a, 0x72, 0x14, 0x15, 0x59, 0xa9, 0xad, 0xad, 0x6d, 0x6d, 0x6a, 0x57,\n  0x07, 0x35, 0x59, 0x6b, 0xaa, 0xe4, 0xf9, 0x4c, 0x4e, 0x26, 0x7a, 0xe3,\n  0xf2, 0x3c, 0xf1, 0x2f, 0x3d, 0x17, 0xa5, 0x19, 0xa1, 0xec, 0x18, 0x72,\n  0xe3, 0x49, 0x49, 0xbf, 0xe6, 0x7e, 0x3e, 0x96, 0xfb, 0x07, 0x3c, 0x5f,\n  0x3c, 0xc7, 0xdf, 0x91, 0x39, 0x82, 0x0d, 0xb6, 0x3d, 0xdb, 0x0a, 0x79,\n  0x72, 0x3e, 0x03, 0x9e, 0x9e, 0x1f, 0xd3, 0x1d, 0x37, 0x25, 0xd3, 0x96,\n  0x44, 0x6f, 0xbc, 0x7c, 0x44, 0x78, 0x5c, 0xc4, 0x1f, 0x29, 0x2d, 0x3b,\n  0xd5, 0x2c, 0x55, 0xd5, 0x3c, 0x5c, 0xea, 0x3a, 0x3f, 0x2f, 0xc6, 0x7b,\n  0x13, 0x7e, 0xbf, 0xc1, 0xa7, 0xd5, 0xc7, 0x1d, 0xd1, 0x8e, 0x68, 0x38,\n  0x6c, 0x0e, 0x69, 0xf5, 0x29, 0x38, 0x13, 0xd0, 0xb3, 0x4d, 0x95, 0x84,\n  0x7c, 0x02, 0xc3, 0xbd, 0xb9, 0x96, 0xfc, 0x79, 0xc0, 0x6e, 0x3d, 0xa4,\n  0xd0, 0x4a, 0x25, 0x64, 0x03, 0x00, 0x38, 0xbe, 0x05, 0x21, 0x4e, 0x06,\n  0xc8, 0x8f, 0xe2, 0x4f, 0x20, 0x22, 0x41, 0x83, 0x84, 0x63, 0x79, 0x97,\n  0x13, 0x09, 0x12, 0xc9, 0x2f, 0x79, 0x58, 0xf6, 0x31, 0xe5, 0xdb, 0x16,\n  0xb4, 0x58, 0xcc, 0xfa, 0xc1, 0xbd, 0x9e, 0x88, 0x85, 0x2a, 0xc3, 0x95,\n  0x34, 0x1a, 0xca, 0x24, 0x39, 0xd8, 0xf5, 0x8a, 0xd9, 0xb6, 0xa5, 0xdc,\n  0x82, 0x9b, 0x59, 0xe2, 0x5b, 0x92, 0x52, 0x41, 0xb2, 0xb3, 0xc3, 0xd3,\n  0xcd, 0x05, 0x8b, 0x8e, 0xd2, 0x7d, 0x75, 0xfe, 0x48, 0x6d, 0xa0, 0xd2,\n  0x75, 0x71, 0xb0, 0xb5, 0x7d, 0x88, 0xbd, 0x2a, 0xbf, 0xec, 0x9b, 0x1f,\n  0x1c, 0x1f, 0x9c, 0x08, 0x8e, 0x27, 0x6b, 0x2b, 0x1c, 0x01, 0x7b, 0x90,\n  0xf2, 0x06, 0xd7, 0xd6, 0x05, 0xb4, 0x48, 0x62, 0x0c, 0xf6, 0xa2, 0x63,\n  0x65, 0x64, 0x12, 0xb9, 0xa6, 0x91, 0x07, 0x30, 0xe2, 0x31, 0x8f, 0x04,\n  0xfd, 0x1b, 0xea, 0xf8, 0x31, 0xa5, 0x18, 0xf1, 0xa4, 0x12, 0xfb, 0xaa,\n  0xcc, 0x32, 0xa9, 0xfa, 0x2c, 0x47, 0xc2, 0x91, 0x90, 0xe9, 0xa2, 0x32,\n  0x3a, 0x72, 0xf5, 0x22, 0x17, 0xd2, 0xaa, 0x4a, 0xe8, 0x40, 0x3a, 0x4f,\n  0xc3, 0x07, 0xe4, 0xca, 0x39, 0x6c, 0x88, 0x24, 0xf0, 0x6c, 0xfe, 0xa8,\n  0xa9, 0x81, 0xda, 0xc3, 0x21, 0x0e, 0xf5, 0x20, 0xf1, 0xbf, 0x84, 0x98,\n  0x93, 0xcf, 0x54, 0x20, 0x9d, 0x20, 0x23, 0x39, 0x84, 0x21, 0x26, 0x55,\n  0x6f, 0xd0, 0x72, 0x82, 0x4e, 0x8a, 0x49, 0x2d, 0x02, 0x83, 0xcc, 0xc6,\n  0xcb, 0xb5, 0x28, 0x16, 0x77, 0xb3, 0x4e, 0x88, 0x5e, 0xf5, 0x7b, 0xf1,\n  0x1b, 0xdc, 0x52, 0xf4, 0xaa, 0xd5, 0x68, 0x0a, 0xd5, 0xb4, 0x13, 0xa3,\n  0x59, 0x54, 0x02, 0xe9, 0x52, 0x80, 0xce, 0x32, 0x6e, 0xa2, 0x41, 0x47,\n  0xf5, 0x23, 0x8b, 0xc8, 0x09, 0x1e, 0x1b, 0x15, 0x16, 0x63, 0xee, 0x17,\n  0x9b, 0x63, 0xcf, 0xe3, 0xff, 0xc6, 0x36, 0x09, 0xec, 0xe2, 0x70, 0xdf,\n  0xf9, 0x43, 0xfb, 0x28, 0xde, 0xc6, 0x2b, 0x6c, 0x3f, 0x9e, 0x43, 0x04,\n  0xa2, 0x60, 0x3c, 0x06, 0x50, 0x0c, 0xa6, 0x04, 0x52, 0x00, 0x88, 0x27,\n  0xe9, 0x61, 0x8a, 0xbb, 0x8e, 0x00, 0x8a, 0x41, 0xb4, 0x9c, 0x54, 0x8b,\n  0x47, 0xc9, 0x25, 0x90, 0x4b, 0xef, 0xb4, 0x38, 0x55, 0xf6, 0x6f, 0xbc,\n  0x55, 0xf1, 0xd0, 0xe0, 0xa0, 0x40, 0x75, 0x58, 0xb6, 0x6e, 0x6b, 0xb9,\n  0xeb, 0x97, 0x8d, 0xe3, 0x20, 0x5d, 0xc7, 0xda, 0x23, 0xbf, 0xbc, 0xeb,\n  0xf8, 0xbd, 0xfa, 0xde, 0x33, 0x33, 0x3b, 0x4e, 0xa6, 0x27, 0x46, 0x5c,\n  0xd7, 0x5f, 0x35, 0x7b, 0xf8, 0xf0, 0x5c, 0xcb, 0xfe, 0x61, 0xd3, 0xc8,\n  0xc4, 0x9e, 0x7b, 0x6f, 0xb8, 0x97, 0xd8, 0x18, 0x5e, 0x61, 0xdd, 0x64,\n  0x1f, 0x9e, 0x91, 0x34, 0x18, 0x3f, 0x16, 0x22, 0xc0, 0xd0, 0x4b, 0x44,\n  0x20, 0xf8, 0x07, 0x9a, 0xf2, 0xe3, 0x91, 0x4e, 0x2a, 0xc2, 0x04, 0x88,\n  0x6d, 0xac, 0x52, 0x12, 0x26, 0x9f, 0x1f, 0xe2, 0x97, 0x2b, 0x2d, 0xa9,\n  0x4a, 0xc2, 0xe4, 0x33, 0x43, 0xb0, 0x30, 0x41, 0x4b, 0x2e, 0xd1, 0x1d,\n  0xac, 0x40, 0x0f, 0x49, 0x36, 0x4a, 0x05, 0x29, 0x89, 0x26, 0x79, 0xe1,\n  0x0d, 0x8d, 0xce, 0x37, 0x0c, 0x25, 0x4f, 0x5d, 0x77, 0xc3, 0xc6, 0xc2,\n  0xd0, 0xf8, 0xf8, 0x50, 0x38, 0x15, 0xf2, 0x9b, 0x93, 0x6c, 0x2c, 0x30,\n  0x36, 0xf8, 0xb6, 0x73, 0xe7, 0xae, 0xbf, 0x0d, 0x35, 0xe6, 0xfe, 0x7d,\n  0x75, 0x72, 0x7a, 0xe5, 0x4d, 0xed, 0x49, 0xdd, 0x24, 0x3e, 0x4a, 0xa5,\n  0xb8, 0x60, 0xf0, 0x99, 0x60, 0x9a, 0x5e, 0x84, 0xbf, 0x0b, 0x69, 0x1a,\n  0xdf, 0x37, 0x6c, 0x6d, 0x71, 0x22, 0xeb, 0xc6, 0xf7, 0x97, 0x38, 0x5b,\n  0x99, 0xfb, 0xd0, 0x7f, 0x93, 0xc3, 0x0a, 0x1a, 0xb3, 0x1f, 0x62, 0x86,\n  0x4a, 0xf6, 0x04, 0xdc, 0xff, 0x36, 0xfe, 0x7e, 0x5a, 0x26, 0x9e, 0x8d,\n  0x88, 0x3c, 0x1c, 0x0d, 0x68, 0x8a, 0x83, 0x92, 0x4a, 0x2a, 0xfb, 0xa7,\n  0x96, 0xd1, 0xda, 0x6c, 0x3c, 0x20, 0xce, 0x72, 0xce, 0x78, 0x86, 0x6b,\n  0x71, 0xb7, 0xa3, 0x6f, 0x7f, 0x6e, 0xe1, 0x9f, 0x0e, 0xdf, 0x7f, 0x1f,\n  0x56, 0x2c, 0xff, 0xf9, 0xbb, 0xdf, 0x45, 0xdd, 0xbf, 0xfb, 0x1d, 0x8d,\n  0xd1, 0x67, 0xa3, 0xf8, 0x59, 0x1e, 0x66, 0x3c, 0x3b, 0x62, 0xc4, 0x1c,\n  0x03, 0xeb, 0xda, 0xbc, 0x13, 0x09, 0xc8, 0x45, 0x6b, 0x9e, 0xe4, 0x43,\n  0xf4, 0xb1, 0x6a, 0xb3, 0x42, 0x8d, 0x03, 0x05, 0xa9, 0x09, 0xa0, 0x91,\n  0x91, 0x7a, 0xf3, 0x82, 0xb2, 0xcf, 0xa8, 0xef, 0x36, 0x8f, 0x26, 0xa0,\n  0x88, 0xc9, 0x2f, 0xc5, 0xbb, 0x62, 0xb9, 0xe7, 0xe4, 0x18, 0x7d, 0x14,\n  0x97, 0xb4, 0x6b, 0xe0, 0x86, 0x13, 0x52, 0x80, 0xfe, 0x83, 0x0a, 0x23,\n  0x64, 0xf1, 0xd8, 0xfe, 0x9a, 0x75, 0x90, 0xb1, 0xc5, 0xa0, 0x5e, 0x1f,\n  0x04, 0x89, 0x68, 0x88, 0xf6, 0x81, 0xb7, 0xff, 0x04, 0x44, 0xae, 0x73,\n  0x90, 0xb3, 0x28, 0xd5, 0xce, 0xd9, 0x20, 0x85, 0xb8, 0x98, 0x15, 0x81,\n  0x86, 0x38, 0x27, 0x62, 0x89, 0x98, 0xcd, 0x6a, 0x73, 0x40, 0xf5, 0x1c,\n  0x37, 0x44, 0x5a, 0xc8, 0x79, 0x03, 0xf9, 0x18, 0x97, 0xb8, 0xa6, 0x5d,\n  0x09, 0x1e, 0xf9, 0xf9, 0x90, 0xc6, 0xa8, 0xf9, 0x0b, 0x79, 0x64, 0xbb,\n  0xaa, 0x16, 0x7b, 0x33, 0x03, 0x3b, 0xf6, 0xad, 0xda, 0x5a, 0x46, 0xea,\n  0x22, 0x4e, 0x97, 0xbf, 0x79, 0x6f, 0xc0, 0x12, 0x32, 0x49, 0x43, 0x9c,\n  0x9f, 0xe9, 0xab, 0x6e, 0x1f, 0x4e, 0x1e, 0x0b, 0xbb, 0xcc, 0x9e, 0xda,\n  0x3c, 0xd6, 0x98, 0x07, 0xeb, 0xe3, 0xff, 0x42, 0xf8, 0xf7, 0x2f, 0xf1,\n  0x9a, 0x72, 0x78, 0xdc, 0x69, 0xa6, 0x99, 0x59, 0xcb, 0xae, 0xe0, 0x53,\n  0x93, 0xc7, 0x07, 0xbd, 0x50, 0x1d, 0x66, 0x35, 0x62, 0x32, 0xc6, 0x32,\n  0x1a, 0x7e, 0x4a, 0x0f, 0x30, 0x31, 0x71, 0x98, 0x46, 0xbe, 0x68, 0x8b,\n  0xa8, 0x41, 0xa2, 0xaa, 0x68, 0x4b, 0x01, 0xbf, 0xae, 0xaa, 0x84, 0x58,\n  0x8a, 0xca, 0xe6, 0xaa, 0x66, 0x2f, 0xa9, 0x18, 0x62, 0xad, 0xc0, 0x7c,\n  0x2d, 0x8d, 0xd2, 0x7a, 0xf9, 0x00, 0x6a, 0x95, 0x8a, 0x78, 0xaa, 0x8b,\n  0xb7, 0x28, 0xb9, 0x1f, 0x62, 0x8a, 0xa4, 0xf0, 0xb5, 0xcb, 0xd2, 0xce,\n  0x87, 0xea, 0x17, 0xbb, 0x16, 0x66, 0xba, 0x4f, 0x65, 0x38, 0x9e, 0x58,\n  0x0a, 0xbf, 0x8c, 0xde, 0xf1, 0xd2, 0xf0, 0xe9, 0x41, 0x93, 0xd1, 0x9e,\n  0xb2, 0x77, 0x26, 0xa2, 0xa9, 0x6b, 0x86, 0x57, 0x3b, 0xeb, 0x17, 0xea,\n  0x1a, 0x52, 0x7d, 0x17, 0x83, 0xfd, 0xcd, 0x6d, 0xc3, 0xc9, 0x84, 0xc1,\n  0x63, 0x02, 0xe3, 0xe1, 0x8e, 0xec, 0x1f, 0xf8, 0xcc, 0xea, 0x44, 0x30,\n  0xe3, 0xb1, 0x55, 0xba, 0xdb, 0xaa, 0xc2, 0xb1, 0xd4, 0x44, 0x6b, 0x3c,\n  0x1c, 0xb1, 0x87, 0x13, 0xf9, 0xbc, 0x86, 0x4d, 0xc6, 0xc9, 0x4c, 0x64,\n  0x8d, 0xea, 0xbc, 0x06, 0x7a, 0x6e, 0x59, 0x15, 0xc1, 0xf6, 0xa4, 0x12,\n  0x0d, 0x58, 0xc1, 0xd1, 0xfc, 0x64, 0x58, 0x00, 0x1a, 0xfc, 0x67, 0x2a,\n  0x9f, 0xf3, 0x20, 0x25, 0x5b, 0x6c, 0x97, 0xf3, 0xb0, 0x49, 0x73, 0x1e,\n  0x72, 0x9f, 0x47, 0x27, 0xf2, 0x59, 0x0f, 0xf0, 0x6d, 0x7c, 0x78, 0x4c,\n  0xef, 0xc1, 0x63, 0x1a, 0xe3, 0x77, 0xa1, 0x27, 0x95, 0x98, 0x05, 0x3c,\n  0x56, 0xac, 0xeb, 0xbe, 0x19, 0xeb, 0xba, 0x4e, 0x66, 0x32, 0x6b, 0xac,\n  0x30, 0xf2, 0x9c, 0xac, 0xe7, 0xca, 0x56, 0x66, 0x59, 0xb1, 0x5d, 0x53,\n  0x8a, 0xab, 0x5a, 0x49, 0xb2, 0xa5, 0xfa, 0x1a, 0x19, 0xad, 0x19, 0xfc,\n  0xce, 0xd2, 0x68, 0x15, 0x8d, 0x15, 0x7c, 0x9b, 0x98, 0x95, 0x90, 0x2f,\n  0xf0, 0x0f, 0xad, 0xfb, 0xe3, 0xd1, 0xd0, 0x4c, 0xec, 0x96, 0xd5, 0xc5,\n  0x85, 0xd1, 0x9d, 0x89, 0xe3, 0xfa, 0xb0, 0x77, 0xd0, 0xe5, 0x3f, 0x37,\n  0xb6, 0x11, 0xc0, 0xb4, 0xf6, 0xd9, 0xc8, 0x55, 0xcb, 0x75, 0x8b, 0x47,\n  0x24, 0x7f, 0xb0, 0x95, 0xe0, 0x20, 0x11, 0x59, 0x04, 0x30, 0x20, 0x7d,\n  0x46, 0x4c, 0x47, 0x92, 0x2c, 0x22, 0xa9, 0xab, 0x97, 0x97, 0x45, 0x48,\n  0x5c, 0x48, 0x1f, 0xdb, 0xa2, 0xd2, 0x8e, 0x1c, 0xf9, 0x2c, 0x99, 0xda,\n  0x5b, 0xcf, 0xa5, 0x47, 0xf6, 0xb5, 0x4a, 0x11, 0x46, 0xcd, 0x63, 0xc9,\n  0xf8, 0x48, 0x13, 0x49, 0xeb, 0xfa, 0xcd, 0x67, 0xfe, 0xbf, 0x6b, 0xdf,\n  0xb1, 0x2f, 0x4d, 0x22, 0x8a, 0xfa, 0x1f, 0xb8, 0xee, 0xfa, 0xfb, 0x7a,\n  0x48, 0x36, 0x97, 0xba, 0x2e, 0xad, 0x84, 0xf3, 0xc7, 0x9c, 0x03, 0x7b,\n  0x96, 0x24, 0xd3, 0x3b, 0x89, 0x5f, 0xe6, 0x39, 0x72, 0x2e, 0xd6, 0xe1,\n  0x76, 0x51, 0xa2, 0xc3, 0x26, 0x21, 0x9e, 0xc2, 0x04, 0x86, 0xf2, 0x29,\n  0xc9, 0xdc, 0x53, 0x18, 0x4f, 0x91, 0x0f, 0x00, 0x71, 0x3a, 0xa0, 0x52,\n  0x62, 0xd0, 0xef, 0xf3, 0x38, 0x92, 0xce, 0x24, 0x96, 0x3e, 0xb0, 0x7a,\n  0xaa, 0x55, 0xe7, 0x68, 0x92, 0xda, 0x49, 0x19, 0xc9, 0x92, 0x43, 0x2a,\n  0x24, 0x3a, 0x65, 0xe7, 0x76, 0xa6, 0x15, 0x39, 0xee, 0x7a, 0xe0, 0xc2,\n  0x85, 0x9b, 0xae, 0x8d, 0xb6, 0x45, 0xea, 0xdb, 0xaf, 0x3b, 0x74, 0xf7,\n  0xae, 0x91, 0x40, 0xf5, 0x3b, 0x76, 0xf5, 0xed, 0xdf, 0xc3, 0xc6, 0x1e,\n  0xba, 0xfb, 0x8e, 0xbf, 0xd8, 0x37, 0x54, 0xd5, 0x1a, 0xd1, 0xf1, 0xa6,\n  0xce, 0xa6, 0xe1, 0x89, 0x1d, 0x93, 0x75, 0xc9, 0xf1, 0xa5, 0xe6, 0xca,\n  0x23, 0x47, 0x9f, 0x93, 0x6b, 0x51, 0xcd, 0x13, 0xdf, 0xe2, 0x9b, 0x09,\n  0xec, 0x0b, 0xd6, 0xef, 0x44, 0x54, 0xa9, 0x67, 0x59, 0xd1, 0x80, 0xb7,\n  0xa2, 0x0b, 0x6f, 0x57, 0x3f, 0xd2, 0x70, 0x1a, 0x89, 0x6c, 0x2b, 0xa5,\n  0xa8, 0x90, 0x02, 0x0f, 0x19, 0x6e, 0x2b, 0x61, 0x64, 0x70, 0x5c, 0x1e,\n  0x50, 0x23, 0x45, 0x7c, 0x65, 0x22, 0xf1, 0x31, 0x32, 0x32, 0x4a, 0x67,\n  0x69, 0x43, 0x22, 0xf0, 0x02, 0xa8, 0x04, 0x15, 0xbc, 0x48, 0xe0, 0x42,\n  0x0d, 0xaa, 0xd1, 0xa9, 0x1d, 0xd0, 0x4e, 0xe7, 0x65, 0x3c, 0xf9, 0x2d,\n  0xcd, 0x6e, 0xfc, 0x17, 0xeb, 0xb4, 0x87, 0xc1, 0xd3, 0xd8, 0x50, 0xce,\n  0xa9, 0x3f, 0x99, 0xa9, 0x6e, 0x93, 0x9c, 0x8d, 0x8d, 0x77, 0x97, 0x73,\n  0xef, 0xeb, 0x96, 0x07, 0x46, 0xa4, 0xef, 0x58, 0x49, 0xbe, 0x23, 0xe0,\n  0x21, 0x70, 0x5b, 0x8f, 0x29, 0xb1, 0xfe, 0x01, 0xcc, 0xbf, 0x5e, 0xa2,\n  0x9e, 0xc7, 0x34, 0x80, 0x2f, 0x23, 0x28, 0x98, 0x86, 0xa5, 0xc8, 0x7c,\n  0x15, 0x6c, 0xe0, 0x52, 0x06, 0x04, 0x08, 0x49, 0xfa, 0x82, 0x18, 0xff,\n  0x72, 0xcd, 0x4f, 0x97, 0x6f, 0x5e, 0xf7, 0xe7, 0x3c, 0x1d, 0x7c, 0xbd,\n  0x3a, 0xf8, 0x5a, 0x50, 0x46, 0x5b, 0xee, 0x52, 0xda, 0x0e, 0x3c, 0x92,\n  0xd1, 0x50, 0xd0, 0x64, 0x24, 0xa5, 0xae, 0xd2, 0xa1, 0xb4, 0x94, 0xe8,\n  0x62, 0x35, 0x06, 0x4c, 0x01, 0xea, 0x97, 0x04, 0xa3, 0xa1, 0x5d, 0x05,\n  0x51, 0xc2, 0xc9, 0xf2, 0x6e, 0x4b, 0x89, 0x88, 0x7b, 0x97, 0x2b, 0x44,\n  0x02, 0xff, 0xaf, 0xe9, 0x99, 0xcc, 0x4e, 0xd4, 0x60, 0x09, 0x0b, 0x25,\n  0xbb, 0xab, 0xdd, 0x81, 0x94, 0x27, 0x6e, 0x67, 0xcf, 0x80, 0xbf, 0x12,\n  0xfc, 0x96, 0xaf, 0xfe, 0x1f, 0x22, 0xeb, 0x7a, 0x36, 0x7f, 0x4a, 0x24,\n  0xdc, 0x44, 0x8d, 0x95, 0x48, 0xb8, 0x78, 0x7d, 0x75, 0x5b, 0x11, 0xa8,\n  0xd9, 0x85, 0xcf, 0xf2, 0x19, 0xd6, 0x55, 0xde, 0x4f, 0x8f, 0x1e, 0xc3,\n  0x67, 0x85, 0xc0, 0x84, 0xb3, 0x01, 0xa2, 0x86, 0xc3, 0x81, 0x76, 0x50,\n  0xaa, 0x2e, 0x4f, 0xe0, 0x5e, 0x04, 0xab, 0x15, 0xce, 0x71, 0x3a, 0xb8,\n  0x3d, 0x0b, 0x7f, 0xc0, 0xe7, 0x77, 0xd3, 0x44, 0x3e, 0xae, 0x6f, 0x93,\n  0xc4, 0xf5, 0xdd, 0x9e, 0xad, 0x20, 0xd9, 0x85, 0x58, 0x4f, 0xb0, 0xf2,\n  0x52, 0xfc, 0xda, 0xb6, 0x51, 0x69, 0x34, 0xd2, 0x8c, 0xe8, 0xcf, 0x80,\n  0x73, 0x44, 0xeb, 0xfb, 0x96, 0x46, 0xa5, 0x95, 0x36, 0xc3, 0xd2, 0x69,\n  0x3a, 0xc5, 0x48, 0x51, 0x7d, 0xf8, 0xbd, 0xc9, 0x64, 0x35, 0xf8, 0x78,\n  0x7c, 0x2a, 0x1f, 0x4f, 0x61, 0x68, 0x4d, 0xa1, 0xfa, 0xc0, 0x15, 0x44,\n  0xa5, 0xfd, 0x5d, 0x71, 0x38, 0x5f, 0xbc, 0x33, 0xe6, 0x4f, 0xeb, 0xc5,\n  0xb0, 0x3d, 0x10, 0xfc, 0xad, 0x1c, 0xd0, 0xf7, 0xe3, 0xc2, 0x68, 0xbe,\n  0xd6, 0xbc, 0x36, 0xf1, 0xea, 0xa7, 0x0b, 0x03, 0xfa, 0xf2, 0xe7, 0x4f,\n  0x90, 0xb9, 0x3a, 0x6b, 0xc4, 0x5b, 0x98, 0xf1, 0xd9, 0xf0, 0xf9, 0xa3,\n  0x91, 0xcf, 0x1f, 0xbf, 0x00, 0x69, 0xa8, 0xb4, 0x58, 0x18, 0x1c, 0xad,\n  0xa2, 0xac, 0x6a, 0x13, 0x3f, 0xb7, 0x17, 0x7e, 0xc5, 0x2c, 0x4a, 0x73,\n  0x4c, 0xd5, 0x4c, 0x8a, 0x77, 0x70, 0x92, 0x02, 0x74, 0xf9, 0x48, 0x7b,\n  0xa9, 0x16, 0x96, 0x92, 0x8f, 0xd7, 0xa2, 0xb8, 0xb5, 0x0b, 0xcf, 0xa8,\n  0xf8, 0xcc, 0xc0, 0xc9, 0x93, 0x0b, 0xfb, 0xf6, 0xcd, 0xaf, 0x14, 0x9d,\n  0x53, 0x73, 0x13, 0x8f, 0x3f, 0x3e, 0x71, 0x7b, 0xfe, 0xa4, 0x42, 0xca,\n  0x39, 0x45, 0xc6, 0x0e, 0x3c, 0xc9, 0x6d, 0x04, 0xfb, 0x99, 0x32, 0xf6,\n  0x7c, 0xb1, 0x24, 0x75, 0xbc, 0x83, 0x54, 0x54, 0xc9, 0xab, 0x2a, 0x35,\n  0xaa, 0x34, 0x93, 0xaa, 0x29, 0x39, 0x69, 0x4d, 0x73, 0xea, 0x95, 0xcf,\n  0xd7, 0xf1, 0xb2, 0xe7, 0x03, 0x53, 0xf1, 0xf7, 0xc9, 0x4f, 0x80, 0x98,\n  0x46, 0x7e, 0x91, 0xd9, 0x87, 0x4f, 0xac, 0xe9, 0xf8, 0x2d, 0x2b, 0xf3,\n  0xfb, 0xf6, 0x2d, 0x9c, 0x3c, 0x99, 0x9d, 0x8d, 0x1f, 0x67, 0x37, 0x43,\n  0xbe, 0x41, 0xb7, 0xef, 0xdc, 0xe8, 0x35, 0x81, 0xdb, 0x61, 0xf4, 0x73,\n  0xd1, 0x3d, 0xf4, 0xe0, 0xa2, 0x38, 0x06, 0xef, 0xc0, 0x67, 0xa9, 0x0f,\n  0x73, 0x8c, 0x6a, 0xd4, 0x4c, 0xe5, 0x73, 0xa3, 0xdb, 0xa6, 0xc3, 0xf2,\n  0x59, 0x25, 0x29, 0x2f, 0x2a, 0xed, 0x74, 0xe5, 0x9a, 0x40, 0xa4, 0xfa,\n  0x0a, 0x1b, 0xd2, 0x8a, 0x6e, 0x1d, 0xcb, 0x6b, 0xf1, 0x15, 0x15, 0x5e,\n  0x5c, 0x44, 0x72, 0x4d, 0x8b, 0xa2, 0x8c, 0x6a, 0xa0, 0xd7, 0xb0, 0x58,\n  0x9c, 0x5f, 0x13, 0x74, 0x05, 0x36, 0xe6, 0x8c, 0xaa, 0x9d, 0x44, 0xb0,\n  0xa2, 0x28, 0x89, 0xab, 0xa4, 0x87, 0x70, 0x90, 0xe2, 0xb5, 0xd1, 0xde,\n  0x3a, 0x24, 0x77, 0xae, 0xa3, 0x9d, 0x09, 0x74, 0xc2, 0x9f, 0xd9, 0x39,\n  0xdb, 0x48, 0xa5, 0x00, 0xa5, 0x1b, 0xa3, 0xd5, 0xe6, 0x25, 0x64, 0xb9,\n  0x0f, 0x11, 0xdd, 0x74, 0xb2, 0x65, 0x7b, 0x31, 0x1b, 0x84, 0xa2, 0xc0,\n  0xd5, 0x55, 0xf1, 0xa8, 0x3f, 0x1d, 0x48, 0x13, 0x5e, 0x64, 0x21, 0xa0,\n  0x04, 0x3e, 0xe4, 0x33, 0x94, 0xc3, 0x5f, 0x20, 0x72, 0x73, 0xb4, 0x24,\n  0x90, 0x53, 0x40, 0x51, 0x75, 0x2c, 0xe7, 0x02, 0x3a, 0x0f, 0x52, 0x74,\n  0xae, 0x59, 0x1d, 0xca, 0x89, 0x3a, 0x51, 0x38, 0xf7, 0x83, 0x7c, 0x40,\n  0xe7, 0x37, 0xbe, 0x8f, 0x45, 0xd6, 0xe1, 0x82, 0x58, 0x4e, 0x1e, 0xbd,\n  0x43, 0xce, 0xc1, 0xe1, 0x3e, 0x86, 0xbf, 0x5b, 0x33, 0xd3, 0x8f, 0xee,\n  0xa2, 0xb5, 0x41, 0xdd, 0xd5, 0x51, 0x96, 0xf8, 0xba, 0x75, 0x0e, 0xa4,\n  0x67, 0x65, 0x7f, 0xb7, 0x00, 0x1f, 0xd0, 0x2b, 0xdf, 0x36, 0x94, 0xb9,\n  0x5d, 0x7a, 0x47, 0xa0, 0x77, 0x16, 0xa5, 0xa2, 0xa3, 0x4d, 0x8c, 0x8e,\n  0x61, 0xf5, 0x3a, 0x16, 0xb0, 0x74, 0x20, 0xa7, 0x0f, 0x4e, 0x43, 0x2d,\n  0x01, 0x90, 0x37, 0x21, 0xbd, 0x9e, 0x3a, 0xf4, 0x24, 0x8f, 0x80, 0x51,\n  0x32, 0x62, 0xd0, 0x57, 0x76, 0x17, 0x74, 0x64, 0x0c, 0x06, 0xb9, 0x1f,\n  0xf3, 0x9a, 0x1e, 0x01, 0x74, 0xd2, 0x5b, 0xfa, 0x08, 0x46, 0x7a, 0x82,\n  0x76, 0x85, 0x21, 0xf5, 0x14, 0xa0, 0x27, 0x3c, 0x85, 0x46, 0xd7, 0x15,\n  0x3e, 0x44, 0xd5, 0xbf, 0x5c, 0x57, 0x51, 0x94, 0xbc, 0xf8, 0xdb, 0xf4,\n  0x87, 0xef, 0x1f, 0x6f, 0x6d, 0x41, 0x4c, 0x77, 0x67, 0x4b, 0x7f, 0x6b,\n  0x7f, 0x6d, 0x0d, 0x24, 0xd2, 0x86, 0x21, 0x10, 0x5f, 0x76, 0xef, 0x37,\n  0xa3, 0x66, 0xf3, 0x36, 0xee, 0xfd, 0x72, 0xc8, 0x81, 0x4e, 0x59, 0xb4,\n  0x2f, 0x8a, 0x90, 0x7e, 0xb2, 0xc0, 0xfb, 0xff, 0x03, 0x12, 0xe0, 0xdb,\n  0xaf, 0xa6, 0x96, 0x7b, 0x40, 0xc8, 0x1f, 0xb8, 0x31, 0x97, 0x92, 0x99,\n  0x6b, 0x41, 0x58, 0xc0, 0x38, 0xcd, 0x4d, 0x92, 0x88, 0x86, 0x0a, 0xfa,\n  0x63, 0x1b, 0xbd, 0x05, 0x4c, 0x16, 0x72, 0x3a, 0xff, 0x9a, 0xcb, 0x61,\n  0x9a, 0xa9, 0x62, 0xda, 0x98, 0x4e, 0x66, 0x08, 0x1d, 0x93, 0x20, 0x80,\n  0x03, 0x76, 0x56, 0xa3, 0xc3, 0x6f, 0x31, 0xb6, 0x43, 0xec, 0x08, 0xd1,\n  0xd0, 0xa4, 0x8d, 0x56, 0x7a, 0x0b, 0x60, 0x6b, 0x5c, 0x01, 0xa4, 0xd7,\n  0xd9, 0x91, 0x46, 0x2f, 0xdd, 0xd0, 0x52, 0x3c, 0x1b, 0x99, 0x05, 0x54,\n  0x31, 0x1a, 0xc6, 0x28, 0x68, 0x8c, 0x34, 0xca, 0x06, 0xea, 0xc3, 0x51,\n  0xbc, 0xaa, 0xb3, 0xd3, 0x06, 0x93, 0x16, 0x30, 0x40, 0x0e, 0x8a, 0x10,\n  0x6f, 0x93, 0x4f, 0x98, 0xed, 0x2f, 0xd3, 0x81, 0x98, 0xee, 0x94, 0xda,\n  0x72, 0x1b, 0xaa, 0xae, 0xb8, 0xa7, 0xf4, 0x1b, 0x5a, 0x53, 0x80, 0x23,\n  0xeb, 0xc8, 0x63, 0x68, 0x74, 0x3b, 0x7d, 0xd6, 0xff, 0xe2, 0x31, 0xd9,\n  0xce, 0x82, 0x27, 0x30, 0xca, 0x03, 0x18, 0x4c, 0xa2, 0x52, 0x7f, 0x94,\n  0xef, 0x6d, 0x42, 0x5a, 0x6d, 0x01, 0x94, 0x64, 0x4d, 0xf5, 0x60, 0xb6,\n  0xa7, 0xab, 0xb3, 0xa3, 0xb9, 0xb1, 0xba, 0xad, 0xa6, 0x0d, 0x74, 0x58,\n  0x77, 0x22, 0xe1, 0x30, 0x63, 0x2d, 0x56, 0x20, 0x5a, 0xec, 0x36, 0x04,\n  0x51, 0xa0, 0xd6, 0x26, 0x8b, 0x79, 0x46, 0x1e, 0x6c, 0xea, 0x79, 0xd0,\n  0x73, 0xbf, 0x57, 0x42, 0x19, 0xe7, 0xd5, 0x3a, 0x6f, 0xae, 0xbb, 0x80,\n  0x95, 0x20, 0x51, 0xad, 0x03, 0x17, 0x52, 0x49, 0x5e, 0x1b, 0x3e, 0xac,\n  0xe6, 0x2e, 0xb9, 0xd3, 0x54, 0x37, 0xc6, 0x3c, 0xc6, 0x82, 0x7f, 0x3c,\n  0xcb, 0x3e, 0xcc, 0x24, 0x98, 0x0e, 0xe6, 0xf3, 0x14, 0xdb, 0xd3, 0x60,\n  0x13, 0x59, 0xc4, 0xe1, 0x6f, 0x4f, 0xbd, 0x5b, 0xf8, 0x37, 0x41, 0xfa,\n  0x4d, 0xfa, 0xf8, 0x61, 0x06, 0xab, 0x3d, 0x17, 0x44, 0x81, 0xc5, 0xc2,\n  0x0c, 0x49, 0x8e, 0x91, 0x94, 0x61, 0x92, 0x03, 0x47, 0x3f, 0x39, 0x3c,\n  0xa7, 0x9a, 0x81, 0x0a, 0x3d, 0xa4, 0x99, 0xe4, 0x16, 0xa0, 0x5d, 0x28,\n  0x37, 0x2e, 0xec, 0x91, 0x4d, 0x93, 0xc6, 0x79, 0x0f, 0x82, 0x88, 0xca,\n  0xb7, 0x84, 0x68, 0xb6, 0x74, 0x12, 0x31, 0x99, 0xd6, 0x64, 0x47, 0xba,\n  0x03, 0x0c, 0xec, 0x70, 0xe4, 0x13, 0xec, 0xf7, 0x38, 0x28, 0xdb, 0x2d,\n  0x2a, 0xeb, 0x61, 0xb4, 0xad, 0x2c, 0xda, 0x42, 0x3c, 0x5d, 0xe0, 0x67,\n  0x68, 0x07, 0x13, 0xe3, 0x7f, 0x4b, 0xb6, 0x45, 0x64, 0xb4, 0x57, 0xbb,\n  0xf3, 0xae, 0x84, 0x9e, 0xd6, 0x96, 0xf1, 0xd4, 0x75, 0x6b, 0xbf, 0xfc,\n  0xb5, 0xec, 0x67, 0xd0, 0x89, 0xef, 0x6f, 0x80, 0x82, 0xdd, 0xf5, 0x60,\n  0x76, 0x14, 0x84, 0x22, 0x84, 0x85, 0x99, 0xd1, 0xf1, 0x88, 0xe2, 0x65,\n  0xb0, 0x45, 0xcc, 0xb9, 0xe7, 0x9b, 0x1a, 0x60, 0x8d, 0xb1, 0x1c, 0xe8,\n  0x23, 0xf1, 0xd8, 0x6d, 0xcc, 0x13, 0xd9, 0x50, 0x0a, 0x89, 0x9a, 0x34,\n  0xe2, 0x45, 0x2f, 0xe2, 0x84, 0x26, 0xa4, 0xe5, 0x30, 0x53, 0xc6, 0x44,\n  0x86, 0x58, 0xc8, 0x15, 0x16, 0x25, 0x79, 0xa2, 0x85, 0xe1, 0x45, 0x41,\n  0xe4, 0x85, 0xf3, 0x98, 0x7d, 0x11, 0x96, 0x06, 0x16, 0x64, 0xa5, 0x32,\n  0xbc, 0x1e, 0x53, 0xa5, 0xba, 0x34, 0x3c, 0x23, 0x31, 0xc2, 0x26, 0xa5,\n  0x97, 0x86, 0x11, 0x79, 0x8d, 0x78, 0xec, 0x8a, 0x7d, 0x16, 0xb3, 0xf6,\n  0x86, 0xfa, 0x96, 0xe6, 0xfa, 0xb6, 0x86, 0xb6, 0x64, 0xc2, 0x6a, 0x77,\n  0x24, 0x93, 0x71, 0x03, 0xd0, 0x72, 0xa1, 0x7f, 0x22, 0x53, 0x64, 0x95,\n  0x2d, 0x92, 0x1b, 0xb1, 0xd8, 0xd8, 0x6e, 0x25, 0x86, 0xda, 0x0f, 0xa8,\n  0x9c, 0x17, 0x15, 0x4d, 0x6e, 0x69, 0x51, 0xdf, 0xa5, 0x32, 0x40, 0xbf,\n  0xd7, 0x56, 0x65, 0x7a, 0x57, 0xc3, 0x44, 0xde, 0x99, 0x31, 0xa5, 0xd1,\n  0x2a, 0x85, 0xe7, 0xfb, 0x54, 0xb6, 0xe8, 0x9f, 0x69, 0x78, 0xf4, 0x20,\n  0x14, 0x49, 0xa7, 0x76, 0x5d, 0x0b, 0x96, 0x61, 0x5a, 0x31, 0x9d, 0xb6,\n  0x31, 0x03, 0x78, 0x0d, 0x9d, 0x21, 0x20, 0xd1, 0x30, 0xd2, 0xa2, 0x34,\n  0x32, 0x68, 0xb3, 0xad, 0x4e, 0x4e, 0x30, 0xf0, 0x53, 0x32, 0x6b, 0x02,\n  0xea, 0x64, 0xb4, 0x8c, 0x41, 0xd0, 0x1a, 0x8e, 0x89, 0x3c, 0xa1, 0x52,\n  0x0d, 0xa1, 0x52, 0x93, 0x9e, 0x05, 0x89, 0x59, 0x67, 0x94, 0x93, 0xdc,\n  0x5a, 0x19, 0x56, 0x53, 0xd4, 0x56, 0x3a, 0x40, 0x68, 0x3f, 0x4a, 0x80,\n  0x45, 0xdd, 0xf0, 0x71, 0xd1, 0x81, 0x39, 0x62, 0x5f, 0x4f, 0xfb, 0x40,\n  0xc7, 0x40, 0x73, 0x63, 0x0d, 0x16, 0x1b, 0x02, 0x3e, 0x39, 0xf0, 0x01,\n  0x53, 0x62, 0x1b, 0x6a, 0x33, 0x2b, 0x7e, 0x07, 0xb5, 0x1d, 0x1b, 0x34,\n  0xc5, 0xc2, 0x0a, 0x0f, 0x20, 0xdc, 0x15, 0xa5, 0x1d, 0xa9, 0x90, 0x65,\n  0xff, 0x5b, 0x31, 0x78, 0xd7, 0x05, 0x9a, 0xa6, 0x13, 0xae, 0xc1, 0x33,\n  0xe3, 0x72, 0xf6, 0x11, 0xcf, 0x25, 0xf6, 0xb4, 0x93, 0xf4, 0xa3, 0xde,\n  0xc3, 0xd1, 0xea, 0x55, 0x34, 0x55, 0x95, 0x89, 0x55, 0x57, 0x8e, 0x46,\n  0x2b, 0xf5, 0xca, 0x62, 0x92, 0x0a, 0xf3, 0x55, 0x81, 0xb6, 0x39, 0xac,\n  0x4c, 0xd2, 0x5c, 0x24, 0x67, 0xd2, 0xea, 0x4b, 0x92, 0x64, 0xa4, 0x74,\n  0x55, 0xb8, 0x69, 0x02, 0xd2, 0x8f, 0x62, 0x9e, 0x1e, 0x6a, 0x6f, 0xa9,\n  0xc0, 0xb2, 0x86, 0x09, 0xd3, 0x68, 0x06, 0x89, 0x52, 0x1c, 0x4f, 0x14,\n  0x0b, 0x7f, 0x31, 0x1f, 0xab, 0xd3, 0x7a, 0xb1, 0xd0, 0x50, 0x83, 0x75,\n  0x17, 0x2c, 0x34, 0x70, 0x20, 0x34, 0x68, 0x30, 0x57, 0x08, 0x91, 0xbb,\n  0x48, 0xaf, 0xf5, 0x21, 0x9d, 0xbe, 0xb8, 0x81, 0x38, 0xa5, 0x9c, 0x12,\n  0x5a, 0x2d, 0x51, 0xaf, 0x4f, 0x4e, 0x93, 0x78, 0x34, 0xdd, 0x2a, 0xb0,\n  0x69, 0x1a, 0xc6, 0x25, 0x49, 0x02, 0x06, 0x45, 0x12, 0x00, 0xb2, 0x6f,\n  0x2d, 0xea, 0xa0, 0x5f, 0xc5, 0x6c, 0xf9, 0xac, 0xd4, 0x79, 0x85, 0xd9,\n  0xa6, 0x6f, 0xb6, 0x99, 0x11, 0x19, 0xad, 0x5e, 0xd4, 0x1e, 0x7b, 0xed,\n  0x9d, 0x40, 0xe8, 0x43, 0x4c, 0x63, 0x7d, 0x75, 0x55, 0x2a, 0x11, 0x0e,\n  0xca, 0x48, 0x0b, 0xe4, 0xb8, 0xcf, 0xa0, 0x8c, 0xb1, 0xf0, 0xb8, 0x57,\n  0x22, 0x8f, 0x68, 0xc2, 0x6e, 0x7b, 0xa1, 0x77, 0xd2, 0xa9, 0xc4, 0x23,\n  0x59, 0x1d, 0x1a, 0xf6, 0x36, 0x4f, 0xcc, 0x64, 0x0e, 0xd8, 0x82, 0xa9,\n  0x1b, 0x17, 0x87, 0x17, 0x5e, 0xb7, 0xb0, 0xbc, 0xbc, 0x7f, 0x67, 0x24,\n  0x63, 0x77, 0x5b, 0xaa, 0x5d, 0xb5, 0x35, 0xcf, 0x99, 0x05, 0xdf, 0x42,\n  0xeb, 0xda, 0xda, 0xa8, 0x92, 0xb6, 0xf1, 0xc1, 0xf3, 0x87, 0x96, 0x73,\n  0x3f, 0x43, 0xcf, 0xe7, 0x6a, 0xd1, 0xf3, 0x55, 0xa1, 0xf0, 0xd1, 0x7d,\n  0x06, 0x71, 0x44, 0xd0, 0x77, 0xf7, 0xc7, 0x21, 0x5a, 0x69, 0x3d, 0xb7,\n  0x73, 0x72, 0x0f, 0xf1, 0xe9, 0xbf, 0xc2, 0x1e, 0xc3, 0x67, 0x7a, 0x2d,\n  0xf3, 0x61, 0xba, 0xae, 0x15, 0x7e, 0x2c, 0xa1, 0x07, 0xb4, 0x2c, 0x07,\n  0x42, 0x1c, 0xa9, 0xcc, 0xae, 0xbe, 0x82, 0xf2, 0x75, 0xd9, 0x03, 0x54,\n  0xb1, 0x2c, 0xf4, 0xcb, 0x22, 0x4d, 0x81, 0x94, 0x1e, 0x29, 0x6e, 0x43,\n  0x6c, 0xc8, 0x2a, 0x17, 0x03, 0x0d, 0x42, 0x93, 0xef, 0x4a, 0xd1, 0x40,\n  0x85, 0x4d, 0x16, 0x49, 0x14, 0x5a, 0x24, 0xe4, 0x75, 0x1b, 0x74, 0x10,\n  0xf9, 0x03, 0x41, 0x77, 0x32, 0x0a, 0x0e, 0xd4, 0x0b, 0xb0, 0x5e, 0x19,\n  0x03, 0x07, 0x9d, 0xed, 0x5a, 0xad, 0x59, 0x58, 0x38, 0xbc, 0x7e, 0xd5,\n  0xe8, 0x36, 0x2e, 0xdd, 0xf3, 0x7a, 0xa7, 0x33, 0xc2, 0x5e, 0xda, 0xbc,\n  0x39, 0x73, 0x19, 0x90, 0x1b, 0xa8, 0x08, 0x2c, 0xfb, 0xd4, 0x5b, 0xf1,\n  0x9a, 0xe1, 0xad, 0xcd, 0x2c, 0x67, 0xf5, 0x58, 0xf6, 0x44, 0x3a, 0xa9,\n  0x88, 0x35, 0xc5, 0x1a, 0x96, 0xf4, 0x33, 0x39, 0xb4, 0x89, 0x65, 0xb9,\n  0x83, 0x02, 0x92, 0x74, 0x4d, 0x3f, 0xc5, 0x18, 0x2c, 0x7b, 0x97, 0x44,\n  0xd7, 0x1b, 0xf4, 0xc4, 0x7e, 0x6f, 0xb5, 0x6a, 0xa8, 0xfb, 0x9d, 0x2a,\n  0x04, 0x49, 0x14, 0xdd, 0x23, 0xcb, 0xfc, 0xe7, 0xe0, 0x68, 0x66, 0x2f,\n  0x11, 0xe1, 0xbe, 0x5b, 0x92, 0xe7, 0x89, 0xdf, 0x80, 0x7d, 0x16, 0xeb,\n  0xc1, 0x5e, 0x66, 0x26, 0x3b, 0x69, 0xd0, 0xe2, 0x15, 0x64, 0x3d, 0x4e,\n  0x0b, 0x27, 0x88, 0xc4, 0x66, 0xce, 0x8a, 0x2c, 0x23, 0x9e, 0x37, 0xe8,\n  0xb4, 0x1c, 0x3e, 0x28, 0x45, 0xe1, 0x76, 0x3d, 0xcf, 0x11, 0x78, 0x58,\n  0xa9, 0x66, 0x8f, 0xc9, 0xc4, 0x30, 0x26, 0xaf, 0xc9, 0xeb, 0x76, 0x01,\n  0xa9, 0x56, 0x98, 0xf1, 0x73, 0x8c, 0x36, 0xab, 0xcd, 0x6a, 0x04, 0xe8,\n  0x2c, 0x2e, 0x9e, 0x16, 0xe3, 0xe0, 0x45, 0xc0, 0xff, 0xb7, 0xab, 0x7f,\n  0x41, 0x9b, 0x87, 0x26, 0xe7, 0x77, 0x4d, 0xac, 0x8d, 0x0e, 0xee, 0x1e,\n  0x9d, 0x1b, 0x1d, 0x51, 0xff, 0xc2, 0x3e, 0x9b, 0x7b, 0xfa, 0x7f, 0xfe,\n  0x07, 0xcd, 0x6d, 0x6e, 0xe6, 0x72, 0xb9, 0x7b, 0xf2, 0xff, 0x96, 0xd6,\n  0x0f, 0xfd, 0x37, 0x1e, 0xab, 0xc8, 0x54, 0x30, 0x8d, 0xd9, 0x3a, 0x00,\n  0x5f, 0xc6, 0x1c, 0x91, 0x3f, 0x8f, 0x45, 0x4c, 0xfc, 0x7d, 0x35, 0x60,\n  0x38, 0x23, 0x61, 0x09, 0xc7, 0x09, 0x0c, 0x18, 0x1e, 0x9d, 0x0c, 0x52,\n  0x02, 0x06, 0x7d, 0x7b, 0x14, 0xb4, 0x55, 0x12, 0xec, 0x45, 0xfe, 0xde,\n  0x83, 0x1e, 0x5f, 0xf8, 0xc3, 0x02, 0xf9, 0xc1, 0x3e, 0xfb, 0xb3, 0xb7,\n  0xbf, 0xfd, 0x12, 0xfe, 0xc3, 0x20, 0x62, 0x87, 0x0f, 0x11, 0x8c, 0x81,\n  0xdb, 0xa5, 0xb8, 0x9a, 0x08, 0x12, 0x98, 0xb0, 0x15, 0x0c, 0xee, 0x20,\n  0x79, 0xe0, 0xdf, 0x58, 0xe9, 0x37, 0x85, 0x9e, 0x81, 0x11, 0xb3, 0x4a,\n  0xb0, 0x64, 0x3e, 0xf1, 0x48, 0x0a, 0x96, 0x2c, 0xa8, 0xfa, 0x5e, 0xda,\n  0x84, 0x90, 0x69, 0xd0, 0xef, 0x72, 0x48, 0x6e, 0xec, 0x18, 0x8a, 0x29,\n  0x59, 0x6d, 0x4e, 0x39, 0xd4, 0x35, 0x9e, 0x69, 0x95, 0x4d, 0x25, 0x19,\n  0xc5, 0x6d, 0xdc, 0x18, 0xef, 0x8e, 0x43, 0x82, 0xc0, 0x82, 0xa0, 0xf1,\n  0x2e, 0xb5, 0xae, 0x1e, 0x0a, 0x06, 0x4d, 0x61, 0xad, 0x21, 0xc5, 0xc6,\n  0x7c, 0xdd, 0xcd, 0xdf, 0xbe, 0xf3, 0xea, 0x65, 0xe4, 0x7c, 0xf5, 0xd2,\n  0x6f, 0x68, 0xce, 0xc0, 0xcb, 0xf1, 0xa0, 0x86, 0x1b, 0xc1, 0x32, 0x0b,\n  0x23, 0xcd, 0xf1, 0x4e, 0x16, 0x50, 0x14, 0x1e, 0x95, 0x24, 0xf1, 0x3a,\n  0xa4, 0x61, 0x6a, 0x43, 0x2c, 0xd2, 0xd8, 0xf1, 0xf9, 0xef, 0x00, 0xa8,\n  0x34, 0x3c, 0x57, 0xb8, 0xca, 0x16, 0x5d, 0x95, 0xe6, 0x1c, 0x25, 0xc6,\n  0x10, 0x56, 0x94, 0xe7, 0x2c, 0xab, 0x30, 0x12, 0x74, 0x0a, 0x31, 0x0e,\n  0x25, 0xe5, 0x64, 0x6d, 0x05, 0x63, 0xa1, 0x5c, 0x3b, 0x62, 0x6c, 0xa8,\n  0xae, 0x8c, 0x47, 0x21, 0x58, 0x94, 0xcc, 0xbf, 0x01, 0x35, 0x68, 0x4b,\n  0xe6, 0x5f, 0x8c, 0xb2, 0xb0, 0xfd, 0x62, 0xa8, 0xf0, 0x15, 0xb6, 0x5d,\n  0x16, 0x35, 0xc2, 0xc2, 0x78, 0xd1, 0x02, 0x41, 0xac, 0x24, 0x0a, 0xa3,\n  0x03, 0xec, 0x4f, 0xd0, 0x18, 0xc1, 0xe6, 0x0f, 0x57, 0x3d, 0x9a, 0x3a,\n  0x42, 0x2d, 0x70, 0x28, 0x4c, 0x63, 0x4f, 0x94, 0x36, 0x3f, 0x47, 0x63,\n  0x7c, 0x72, 0xbb, 0x36, 0x5b, 0xdf, 0x61, 0xde, 0xc4, 0xdc, 0xc0, 0xbe,\n  0x88, 0x9f, 0x33, 0xad, 0x6e, 0xc3, 0x16, 0x3f, 0x87, 0x63, 0xd7, 0x71,\n  0x9b, 0x3d, 0xdb, 0xbe, 0x4b, 0x8f, 0xbc, 0xcc, 0x0b, 0xec, 0x2a, 0x7e,\n  0x57, 0xc7, 0xf6, 0x6d, 0x98, 0x37, 0xa1, 0x30, 0x69, 0xd3, 0x75, 0xd9,\n  0x31, 0xaf, 0x92, 0x36, 0xd9, 0x6d, 0xc7, 0x23, 0xa2, 0x08, 0xba, 0x04,\n  0x6d, 0x98, 0xa5, 0x6d, 0x9f, 0x83, 0xf0, 0xbb, 0xa6, 0x48, 0x9b, 0xfd,\n  0xdb, 0xb6, 0x31, 0xa2, 0x17, 0x98, 0xbf, 0x04, 0x9c, 0x23, 0x56, 0x23,\n  0xff, 0x8e, 0xf6, 0x91, 0xdf, 0xf5, 0x45, 0xf7, 0x05, 0xe5, 0xf7, 0xc7,\n  0xc9, 0xef, 0x5a, 0x72, 0xf6, 0x87, 0xd8, 0x7e, 0xe6, 0x01, 0xce, 0x86,\n  0xf9, 0x49, 0xf5, 0x47, 0x34, 0x87, 0x87, 0xb3, 0x50, 0x01, 0x84, 0x63,\n  0x19, 0xee, 0x18, 0x83, 0x65, 0x20, 0x76, 0x51, 0x72, 0x6d, 0xb0, 0x68,\n  0xde, 0x6e, 0x75, 0x58, 0x78, 0xcc, 0x6d, 0x3e, 0xa2, 0x61, 0x86, 0xa5,\n  0xb4, 0x91, 0x0c, 0x01, 0x9b, 0x0c, 0x35, 0xf5, 0xf4, 0x34, 0x79, 0x22,\n  0x1d, 0x9c, 0xad, 0xa3, 0xb9, 0xa9, 0xa3, 0x39, 0xe8, 0x6b, 0x2f, 0xff,\n  0x5c, 0xcc, 0xe3, 0x38, 0x04, 0x31, 0xf6, 0xf8, 0x05, 0x8b, 0x52, 0x90,\n  0x10, 0xc7, 0x14, 0x3e, 0x97, 0x2a, 0x4f, 0x4e, 0x82, 0xf2, 0xf8, 0x80,\n  0xf4, 0x5c, 0xb6, 0xbf, 0xa3, 0xb9, 0xb9, 0x5d, 0x7e, 0xae, 0x16, 0x7d,\n  0x15, 0x99, 0xd8, 0x1c, 0xe3, 0x60, 0x3a, 0xc8, 0x73, 0xeb, 0xf4, 0x58,\n  0xe8, 0xb0, 0x03, 0x7b, 0x67, 0xd8, 0x29, 0xfc, 0x7c, 0x86, 0xbd, 0x87,\n  0x80, 0x3a, 0x2d, 0x4a, 0x82, 0x2e, 0x22, 0xb5, 0x63, 0x1c, 0x0c, 0x96,\n  0x6e, 0xc1, 0x50, 0x4b, 0xde, 0x92, 0x69, 0x2b, 0xa8, 0x4b, 0x41, 0xf2,\n  0x43, 0xe7, 0xce, 0x25, 0x53, 0xee, 0x0c, 0x16, 0xc9, 0x7a, 0x92, 0x23,\n  0xe3, 0x5d, 0x83, 0xe8, 0xab, 0xbb, 0xfd, 0xe3, 0xbe, 0xb4, 0xd5, 0xdc,\n  0x6a, 0xb6, 0x0f, 0x37, 0xd7, 0x8c, 0x38, 0x5a, 0xf1, 0xda, 0x39, 0xf0,\n  0xbb, 0xbd, 0xf8, 0xdd, 0x63, 0xfc, 0xed, 0x28, 0x2a, 0xfb, 0xab, 0xf0,\n  0x75, 0x2f, 0x1b, 0x40, 0x02, 0x67, 0x43, 0x80, 0x52, 0xcc, 0xa0, 0x1f,\n  0x46, 0x24, 0x3b, 0x32, 0xfa, 0xa1, 0xe4, 0x33, 0xce, 0xdf, 0x8f, 0x96,\n  0xde, 0xc7, 0x23, 0xb4, 0xb3, 0x31, 0xa4, 0xe3, 0x4c, 0x58, 0x70, 0x4f,\n  0x93, 0x39, 0x05, 0x04, 0xa4, 0x14, 0x37, 0x26, 0xae, 0xe3, 0x1b, 0x00,\n  0x46, 0x97, 0xd1, 0x50, 0x5b, 0x33, 0x99, 0x02, 0xe6, 0xee, 0x98, 0xcf,\n  0xdb, 0x37, 0x02, 0x1b, 0xe9, 0xdd, 0xbb, 0xd9, 0xd8, 0x2f, 0x7e, 0xf1,\n  0xf7, 0x7f, 0x4f, 0xc7, 0x62, 0xc2, 0xcf, 0xe2, 0x38, 0x13, 0xaa, 0xe0,\n  0xef, 0x42, 0x2e, 0xa1, 0x41, 0xb6, 0x69, 0x0b, 0x0d, 0xd2, 0xbb, 0x2a,\n  0xd1, 0x45, 0xe6, 0x26, 0x52, 0x77, 0x5e, 0x7a, 0x17, 0xe4, 0x36, 0x32,\n  0x68, 0x2f, 0x04, 0xc6, 0x02, 0x53, 0x47, 0xa4, 0xce, 0xb9, 0x5c, 0x6a,\n  0x9e, 0xbc, 0x0b, 0xcb, 0x3d, 0x37, 0xcd, 0xb1, 0x97, 0x72, 0x97, 0x90,\n  0x96, 0xbe, 0xa3, 0x92, 0x5d, 0x66, 0x7e, 0xcb, 0xe6, 0x30, 0xc5, 0xdd,\n  0x50, 0xf4, 0xfb, 0x10, 0xa1, 0xa9, 0xca, 0xad, 0x56, 0xe6, 0x26, 0xa6,\n  0xe7, 0xcf, 0x78, 0x47, 0x3b, 0x79, 0x47, 0x0f, 0xbc, 0x02, 0x9e, 0xb7,\n  0xb5, 0x81, 0xe6, 0xb7, 0xfe, 0x96, 0x03, 0x74, 0x61, 0x66, 0xb3, 0x82,\n  0xce, 0x60, 0xb3, 0x42, 0xa1, 0x79, 0x78, 0xfe, 0x6f, 0xb7, 0x9e, 0x67,\n  0x44, 0xc3, 0x47, 0x98, 0x07, 0x99, 0xe2, 0x6b, 0x1f, 0xa5, 0xd7, 0xf0,\n  0x39, 0x06, 0x68, 0xf4, 0x7f, 0x62, 0x3d, 0x50, 0x36, 0x80, 0xa9, 0x25,\n  0x23, 0x81, 0xf0, 0x1c, 0xba, 0xb2, 0x08, 0xaa, 0xcc, 0x30, 0x68, 0x05,\n  0x86, 0x86, 0x66, 0x39, 0xac, 0x2a, 0x71, 0x42, 0x7e, 0xca, 0xe9, 0x16,\n  0xae, 0xdd, 0xfd, 0xd8, 0xe2, 0x47, 0x3f, 0xba, 0xb8, 0x88, 0xde, 0xf0,\n  0xc0, 0xe6, 0x4f, 0x1f, 0x78, 0x00, 0x46, 0x3d, 0x8e, 0xde, 0x20, 0x3d,\n  0xcf, 0x06, 0x4f, 0xfb, 0x04, 0x7e, 0xc0, 0x0d, 0x56, 0x94, 0xef, 0x83,\n  0x3b, 0xe0, 0xd6, 0xd2, 0x78, 0x98, 0xcf, 0x33, 0x6f, 0x43, 0x8f, 0x20,\n  0x91, 0xbf, 0x95, 0xd1, 0xe7, 0x5e, 0x47, 0xe7, 0x90, 0x7b, 0x5d, 0x7e,\n  0x0e, 0xca, 0xfd, 0xdb, 0xca, 0xde, 0x0f, 0x31, 0xdf, 0x63, 0x2e, 0xa2,\n  0xdb, 0x91, 0x68, 0xf8, 0x24, 0x73, 0x2f, 0xfa, 0x1b, 0x89, 0x62, 0xfe,\n  0xa6, 0xcc, 0xfd, 0x4f, 0x6d, 0x73, 0xff, 0x59, 0x7c, 0xff, 0x21, 0x7c,\n  0xff, 0xef, 0x4a, 0xef, 0xc3, 0xfe, 0x44, 0x15, 0x10, 0xb0, 0x81, 0xbf,\n  0x42, 0x84, 0xac, 0x8c, 0x93, 0xec, 0x9a, 0xbd, 0x8c, 0xf2, 0x85, 0xac,\n  0x16, 0x56, 0x22, 0x36, 0xf4, 0x7f, 0x99, 0x7b, 0x13, 0xf0, 0xb8, 0x8a,\n  0x2b, 0x5f, 0xbc, 0xea, 0xde, 0xdb, 0xf7, 0xf6, 0x2a, 0xa9, 0xf7, 0x96,\n  0xd4, 0x5a, 0x7a, 0x51, 0xb7, 0xf6, 0xbd, 0xb5, 0x59, 0x92, 0x5b, 0xb6,\n  0x76, 0x4b, 0x96, 0x77, 0x59, 0xde, 0xe4, 0x05, 0x63, 0x6c, 0x63, 0x6c,\n  0xc7, 0xe0, 0xb0, 0x63, 0x02, 0x86, 0xb0, 0x4f, 0x20, 0xcb, 0x90, 0x99,\n  0x24, 0x90, 0x3c, 0x96, 0xcc, 0x4c, 0x32, 0x09, 0x84, 0x24, 0x64, 0x7d,\n  0xc9, 0x40, 0x98, 0xc0, 0x40, 0x32, 0x09, 0x09, 0x59, 0x18, 0x48, 0xc8,\n  0x46, 0x02, 0x01, 0x66, 0x26, 0x21, 0x04, 0xec, 0xd6, 0xff, 0x9c, 0xaa,\n  0xba, 0xb7, 0x6f, 0x4b, 0xdd, 0x32, 0xf3, 0xbe, 0xf7, 0x7d, 0xef, 0x6f,\n  0xf0, 0xa2, 0xba, 0xa7, 0xea, 0x56, 0x9d, 0x3a, 0x75, 0xea, 0x54, 0xdd,\n  0x73, 0xce, 0x2f, 0x96, 0xea, 0xa0, 0xd2, 0xaf, 0x7f, 0x4d, 0x8b, 0xfb,\n  0xf5, 0xf9, 0x5f, 0x41, 0xfe, 0x24, 0x6b, 0xc0, 0xeb, 0xe7, 0xc8, 0xed,\n  0x44, 0xcf, 0xb7, 0xf6, 0x37, 0x74, 0x92, 0xe9, 0xbc, 0xe8, 0x72, 0x3a,\n  0x98, 0x1c, 0x63, 0xfa, 0x7e, 0xa6, 0xa0, 0x3e, 0x8b, 0xd0, 0x52, 0x5a,\n  0xc6, 0xf4, 0xf4, 0x96, 0x65, 0x74, 0x5e, 0x95, 0xd0, 0x8b, 0xdb, 0x0b,\n  0xd2, 0xb8, 0x81, 0xc6, 0xc5, 0xf6, 0x8d, 0x4d, 0xf9, 0x69, 0x60, 0x8c,\n  0x6b, 0x59, 0x4c, 0xd6, 0xe7, 0xb2, 0xd2, 0x61, 0xd2, 0x1f, 0x26, 0x4e,\n  0x98, 0x3f, 0xf4, 0x20, 0x3f, 0x22, 0x98, 0x6b, 0xd2, 0x4d, 0x3d, 0x8f,\n  0xc1, 0xb6, 0x7d, 0xd1, 0xaa, 0xb3, 0xeb, 0x72, 0xda, 0xd2, 0x48, 0x2b,\n  0x6b, 0x0b, 0x76, 0x65, 0xd0, 0x49, 0xb3, 0xd8, 0x96, 0xcc, 0x73, 0x6b,\n  0xca, 0xf3, 0x0a, 0x3a, 0xdc, 0xce, 0xb0, 0x4f, 0xb5, 0x1a, 0x98, 0x4b,\n  0x18, 0x66, 0xa0, 0xb7, 0xd7, 0x91, 0xea, 0xc0, 0x16, 0x1f, 0x5b, 0x45,\n  0xbf, 0xbb, 0xea, 0x3e, 0xd6, 0xe4, 0xff, 0x85, 0x36, 0xdd, 0x7a, 0x9b,\n  0xa3, 0xab, 0x68, 0xed, 0xff, 0x85, 0x7e, 0xa6, 0x4c, 0x6d, 0x3e, 0xb0,\n  0x8a, 0x3e, 0xb1, 0xb8, 0x9f, 0x16, 0x92, 0x60, 0x6d, 0x96, 0x8b, 0x8f,\n  0xf1, 0x3a, 0x1b, 0x19, 0x90, 0xd0, 0x3a, 0xb0, 0x0f, 0x65, 0xbd, 0xa5,\n  0x08, 0x36, 0x44, 0x37, 0x65, 0xde, 0x7e, 0x6c, 0xd5, 0x2a, 0xe9, 0x22,\n  0xde, 0xc6, 0xfd, 0xd0, 0x46, 0x89, 0xa9, 0x0d, 0x9e, 0xea, 0x1b, 0xd4,\n  0xdf, 0x2c, 0xfb, 0xea, 0x86, 0x6d, 0x9a, 0xdb, 0xf0, 0x32, 0xd3, 0x7b,\n  0xed, 0xaa, 0xc7, 0x32, 0x6f, 0x4b, 0x25, 0x99, 0x9f, 0xac, 0x32, 0xb5,\n  0xa1, 0x65, 0xf7, 0x32, 0x2a, 0x93, 0x59, 0xb1, 0xf3, 0x1c, 0x40, 0x9d,\n  0x33, 0x8f, 0x6a, 0x67, 0x06, 0x6d, 0x55, 0x63, 0xcf, 0x11, 0x4e, 0x5b,\n  0xd0, 0xd2, 0x63, 0xab, 0xa4, 0x92, 0x0f, 0xae, 0xfa, 0xa0, 0xd0, 0x27,\n  0xbd, 0xf4, 0xf2, 0x85, 0x9f, 0xca, 0x88, 0x2a, 0x44, 0xce, 0xfc, 0x9c,\n  0xcb, 0xce, 0x99, 0x9f, 0x67, 0xd7, 0xaf, 0x34, 0x4b, 0x9f, 0x90, 0xcb,\n  0xa9, 0x26, 0x29, 0xa4, 0x5e, 0x4e, 0x71, 0x59, 0x97, 0x53, 0xe6, 0x7d,\n  0x39, 0xbb, 0x0f, 0x33, 0x9d, 0x58, 0x42, 0x4f, 0x2e, 0xbc, 0x96, 0xd5,\n  0xf1, 0x28, 0x6b, 0x3a, 0xa6, 0x38, 0x7e, 0x51, 0x14, 0x3a, 0xde, 0x63,\n  0x88, 0x59, 0x30, 0xc9, 0xb2, 0xfd, 0x7e, 0xe9, 0x8e, 0x99, 0xad, 0x73,\n  0x6b, 0x6f, 0x7f, 0xe3, 0x85, 0x1b, 0x6e, 0x78, 0xc1, 0x68, 0xe7, 0xd5,\n  0xff, 0xc1, 0x5e, 0x11, 0xe4, 0x7b, 0x45, 0xed, 0xed, 0x6d, 0xd8, 0xd2,\n  0x1b, 0xcf, 0x3f, 0x7f, 0xfd, 0xf5, 0xa2, 0x9d, 0x18, 0x09, 0x22, 0xe9,\n  0xc3, 0x32, 0xa1, 0xed, 0x0d, 0x96, 0x64, 0xaa, 0xdb, 0xaf, 0x05, 0x69,\n  0xec, 0x9d, 0x77, 0x3e, 0xf5, 0xa9, 0x37, 0x0e, 0xb7, 0x1d, 0x1e, 0x19,\n  0x5c, 0xb9, 0x88, 0x4e, 0x41, 0xba, 0x60, 0xaa, 0x3b, 0x99, 0x0a, 0xfa,\n  0x6b, 0x3f, 0xf5, 0xa9, 0x77, 0xde, 0x00, 0x92, 0x91, 0xc3, 0x6d, 0x9c,\n  0x1f, 0x60, 0x3b, 0xfd, 0x27, 0x7d, 0x54, 0x46, 0x94, 0x36, 0x92, 0xf9,\n  0xaa, 0xd0, 0x67, 0x5f, 0xcd, 0xf2, 0x0b, 0xd6, 0xf5, 0x1d, 0xf4, 0x51,\n  0x3a, 0x46, 0x37, 0xd0, 0x2f, 0x65, 0xbe, 0xca, 0xf6, 0x4e, 0xc6, 0xb3,\n  0xa5, 0x34, 0xc0, 0xf3, 0x0d, 0x7a, 0x1b, 0xb9, 0xcf, 0x17, 0x56, 0xd3,\n  0x8f, 0x2c, 0x3c, 0x06, 0xcf, 0x61, 0x4f, 0x3f, 0xf3, 0x1b, 0x31, 0x27,\n  0xbf, 0x31, 0x9e, 0x8f, 0x93, 0xc7, 0xc8, 0x63, 0xd2, 0x5b, 0xd0, 0x07,\n  0x74, 0x60, 0xfc, 0x01, 0xb1, 0x42, 0xfd, 0xcf, 0xfd, 0x00, 0x1f, 0xe3,\n  0xbe, 0xf7, 0x04, 0x79, 0x53, 0xfa, 0x74, 0xae, 0x8c, 0xde, 0x60, 0xda,\n  0x08, 0x30, 0x61, 0xe1, 0x4c, 0x8e, 0x7c, 0xa1, 0x54, 0xd4, 0x3e, 0x73,\n  0x77, 0x4a, 0xfa, 0x74, 0xea, 0x33, 0x7c, 0x0e, 0x8d, 0x36, 0x9a, 0x58,\n  0x1b, 0x51, 0x06, 0x47, 0x04, 0x93, 0x07, 0xf2, 0x39, 0x8b, 0x73, 0x88,\n  0xad, 0x48, 0x74, 0x89, 0xc2, 0xf0, 0xb2, 0xef, 0x77, 0x6f, 0xa6, 0xee,\n  0x96, 0x3e, 0xfd, 0xd2, 0x67, 0x52, 0x7c, 0xcd, 0x20, 0x82, 0xca, 0x9b,\n  0xe4, 0xa5, 0xac, 0xee, 0x59, 0x2c, 0xef, 0xd8, 0xac, 0xb4, 0x6e, 0x71,\n  0x53, 0x3c, 0x19, 0x44, 0x6d, 0xea, 0x6e, 0xde, 0x90, 0xb9, 0x9d, 0x77,\n  0xb9, 0xf6, 0x3a, 0x98, 0xb2, 0x79, 0x13, 0xc6, 0x05, 0xa3, 0xc2, 0xf9,\n  0x6d, 0xa5, 0xbf, 0x5d, 0xf8, 0x11, 0xa2, 0x79, 0x61, 0x7d, 0xee, 0x24,\n  0x10, 0xc4, 0x23, 0x9f, 0x44, 0x8f, 0xe1, 0xb9, 0x15, 0x74, 0x03, 0x1c,\n  0xf7, 0x76, 0xe3, 0x7e, 0xba, 0xae, 0x9c, 0x85, 0x7b, 0x73, 0x24, 0x9e,\n  0x9c, 0x07, 0x73, 0x5f, 0x34, 0x2f, 0x29, 0x4b, 0x84, 0x7b, 0x43, 0xd2,\n  0xdf, 0x66, 0x56, 0xf5, 0xd0, 0xe9, 0xde, 0xef, 0xdf, 0xb7, 0x6f, 0x1f,\n  0x31, 0xbd, 0xcb, 0x42, 0x46, 0xb3, 0xef, 0x0a, 0x90, 0x02, 0xaf, 0xf2,\n  0x93, 0xbc, 0x6f, 0x7a, 0xc4, 0x34, 0x16, 0xfe, 0x22, 0xfe, 0x9a, 0x1b,\n  0xe0, 0x2d, 0x42, 0x5e, 0x5f, 0x83, 0xf3, 0x84, 0x8d, 0xb4, 0x31, 0x7e,\n  0x24, 0xd0, 0x83, 0x12, 0x16, 0x08, 0x42, 0xd6, 0x4f, 0xda, 0x80, 0x39,\n  0x13, 0x4b, 0xe6, 0xdc, 0xaf, 0x6f, 0x74, 0x7c, 0x09, 0x44, 0xfc, 0x11,\n  0xb6, 0x0a, 0xae, 0xa7, 0x33, 0x99, 0xcf, 0x5f, 0xff, 0xc6, 0xe9, 0xb6,\n  0xd3, 0x2b, 0x86, 0xfb, 0x47, 0x80, 0x3c, 0x73, 0x8b, 0xb4, 0x76, 0x21,\n  0x0d, 0x6b, 0xdd, 0xa7, 0xb7, 0x5d, 0x02, 0xcc, 0x28, 0x86, 0x03, 0x29,\n  0x06, 0x20, 0x30, 0x64, 0xaa, 0x45, 0x36, 0x73, 0x3c, 0xe1, 0xd3, 0xbb,\n  0x2a, 0x83, 0x91, 0xa9, 0xc5, 0x92, 0x46, 0x52, 0xda, 0x14, 0x5a, 0x9e,\n  0xff, 0xbb, 0x39, 0x66, 0xe9, 0xd2, 0xe2, 0x0d, 0x35, 0x61, 0x57, 0xb9,\n  0xd5, 0x53, 0xd3, 0xbf, 0x4a, 0xfa, 0x59, 0xa2, 0xce, 0x9a, 0xda, 0xac,\n  0x06, 0x83, 0xa1, 0x12, 0x49, 0xea, 0x54, 0x1b, 0xd9, 0x1c, 0xfb, 0xa4,\n  0x7a, 0xf2, 0x5d, 0x38, 0x8f, 0xdb, 0x48, 0x59, 0x3a, 0x88, 0x3e, 0x69,\n  0xb8, 0xe0, 0x59, 0x22, 0x65, 0x42, 0x3a, 0xc9, 0x5a, 0x9f, 0x57, 0xb2,\n  0x86, 0x1a, 0xbc, 0x0c, 0xb4, 0x5e, 0x55, 0xb5, 0x98, 0x2f, 0x50, 0xeb,\n  0x3a, 0x14, 0x58, 0x15, 0xeb, 0x93, 0xba, 0xa2, 0xeb, 0xa2, 0xf6, 0xc4,\n  0xe6, 0x72, 0x6c, 0x63, 0x21, 0x4e, 0xbe, 0xbb, 0xf0, 0x18, 0xb4, 0xd1,\n  0xfc, 0x45, 0x0b, 0x61, 0x80, 0xf1, 0xe2, 0xdc, 0xcd, 0x33, 0x75, 0x12,\n  0xd2, 0x8b, 0xb7, 0x3d, 0x36, 0xfd, 0xa7, 0x93, 0x73, 0x5f, 0xe0, 0xed,\n  0x06, 0xb1, 0xc9, 0x14, 0x36, 0xfe, 0xdd, 0x40, 0xb2, 0xe8, 0x50, 0x70,\n  0x28, 0xd6, 0x37, 0x1e, 0x9d, 0x89, 0xb1, 0x66, 0x61, 0xcd, 0xbd, 0xb5,\n  0x10, 0xa7, 0xd7, 0x2f, 0x7c, 0x5b, 0x52, 0xd5, 0x17, 0xf9, 0xfe, 0xcd,\n  0x73, 0x48, 0x49, 0xaa, 0x12, 0xd0, 0xe3, 0xe1, 0xd0, 0x6f, 0x4a, 0x4a,\n  0x90, 0x51, 0x81, 0x37, 0xf4, 0xc3, 0xcc, 0x31, 0x58, 0xb9, 0x14, 0xb4,\n  0xc3, 0x31, 0x61, 0x1f, 0xeb, 0x75, 0x12, 0x58, 0x87, 0xd1, 0xcc, 0x66,\n  0x8e, 0x0a, 0x9a, 0xa3, 0x82, 0xa6, 0x6a, 0xe1, 0x1a, 0xf2, 0x6d, 0x29,\n  0x01, 0x36, 0x66, 0x25, 0xb3, 0x1d, 0x11, 0x4b, 0x2a, 0x24, 0x9d, 0x05,\n  0x8b, 0xbb, 0x9e, 0x74, 0x21, 0xc2, 0x40, 0x94, 0x5a, 0x94, 0x4e, 0x44,\n  0x17, 0x90, 0x30, 0x55, 0x8c, 0x4c, 0x2c, 0x32, 0x26, 0xf0, 0xd3, 0x54,\n  0xa2, 0x1d, 0xb4, 0x52, 0x91, 0x27, 0xa1, 0x9f, 0x7d, 0x4f, 0x60, 0xdf,\n  0x74, 0x52, 0x74, 0x6d, 0x63, 0x43, 0xa4, 0xba, 0xbd, 0xb5, 0xa1, 0xab,\n  0xb1, 0x2b, 0x11, 0xaf, 0xae, 0x8f, 0xd4, 0xd7, 0x24, 0x12, 0x35, 0x76,\n  0x6b, 0x59, 0x83, 0x17, 0x46, 0x6c, 0x00, 0xd6, 0x99, 0xb1, 0x41, 0xc4,\n  0x8f, 0xdd, 0x88, 0x2f, 0xc0, 0xef, 0xb4, 0x64, 0x13, 0x14, 0xd8, 0x7d,\n  0x4e, 0x27, 0x2d, 0xdd, 0x3a, 0xd0, 0xbf, 0x7f, 0x60, 0xf8, 0xe8, 0xaa,\n  0xad, 0x87, 0x5a, 0x46, 0x2e, 0x5b, 0xbb, 0x79, 0x2e, 0xb5, 0xbe, 0xbe,\n  0x61, 0xed, 0x65, 0x33, 0x2d, 0xc1, 0x91, 0x48, 0x6b, 0x73, 0xe3, 0xe4,\n  0xd4, 0xda, 0xa9, 0xa1, 0x9e, 0x8d, 0x21, 0x6d, 0x42, 0x6a, 0x8c, 0xed,\n  0xec, 0x8a, 0x35, 0x74, 0xcc, 0xaf, 0xda, 0x72, 0x34, 0xb5, 0xe3, 0xc1,\n  0x13, 0xd7, 0x3c, 0x34, 0x3f, 0xba, 0xa2, 0xb9, 0x3f, 0x5c, 0xf1, 0xc9,\n  0xb5, 0x9e, 0x40, 0x34, 0x50, 0x16, 0x3f, 0x7b, 0xf3, 0xf6, 0x75, 0xab,\n  0x27, 0x6b, 0xa3, 0x57, 0x9c, 0xe0, 0x67, 0xdc, 0x97, 0x41, 0xfa, 0xbf,\n  0x26, 0xfd, 0x17, 0x49, 0x4a, 0x03, 0xe4, 0x34, 0xe3, 0xd2, 0xc6, 0xcc,\n  0x2b, 0x0b, 0x4f, 0x73, 0x2e, 0x2d, 0x3c, 0x6d, 0xe8, 0x40, 0x34, 0x7c,\n  0xbb, 0xe5, 0x5b, 0x81, 0x53, 0x03, 0xcc, 0xdd, 0xe9, 0xd0, 0xc2, 0x5b,\n  0x4b, 0x30, 0x0c, 0x73, 0x62, 0xcf, 0x08, 0x5d, 0x78, 0x07, 0x7e, 0x3e,\n  0x25, 0x45, 0x49, 0x8a, 0xfc, 0x94, 0xcb, 0x44, 0xa0, 0x82, 0xca, 0x4a,\n  0x7b, 0x22, 0x5c, 0xa2, 0xa8, 0xb2, 0x5d, 0x0f, 0x33, 0xc3, 0xab, 0x0a,\n  0x7c, 0x60, 0x59, 0xfa, 0x40, 0xdc, 0x56, 0xc4, 0x89, 0x2a, 0x63, 0xb6,\n  0xc1, 0x53, 0xec, 0xde, 0x01, 0x3f, 0xf9, 0x0e, 0xe0, 0xf5, 0x59, 0x8a,\n  0xfb, 0xea, 0xe1, 0xe5, 0x44, 0x2f, 0xbb, 0x79, 0x6c, 0x63, 0x9e, 0x5b,\n  0x3a, 0xad, 0xc5, 0xd2, 0x6d, 0x5c, 0x54, 0xe4, 0xa3, 0x4f, 0xd7, 0x1b,\n  0xa4, 0x68, 0xaa, 0xd0, 0xab, 0x17, 0xd7, 0x30, 0x11, 0xcf, 0xb1, 0x6b,\n  0x8e, 0xd6, 0xe6, 0xda, 0x64, 0xa4, 0xaa, 0x2c, 0xe4, 0x71, 0xf3, 0x1b,\n  0x5d, 0xab, 0x35, 0x07, 0x4b, 0x8b, 0x3b, 0x48, 0xd3, 0xd8, 0x22, 0x78,\n  0x42, 0x3c, 0x06, 0xd2, 0x8e, 0x22, 0x49, 0xf7, 0x89, 0xf5, 0xa9, 0x92,\n  0x43, 0x00, 0x6d, 0x0d, 0x4f, 0x5a, 0xed, 0x99, 0xd7, 0xb6, 0x79, 0xa2,\n  0xfe, 0x54, 0xcc, 0xe5, 0xd5, 0x42, 0x45, 0x35, 0xa5, 0x6b, 0x37, 0x5b,\n  0xed, 0xd4, 0xbf, 0xd5, 0x13, 0x0d, 0xb4, 0xd5, 0x3a, 0x4b, 0xb5, 0xde,\n  0x37, 0x38, 0xfc, 0xd6, 0x01, 0xcb, 0xb1, 0x63, 0x55, 0xc3, 0x55, 0x99,\n  0x4f, 0xd6, 0xec, 0x7f, 0xef, 0xca, 0x4d, 0x23, 0x16, 0x79, 0xc4, 0xa2,\n  0x1d, 0x7d, 0x6f, 0xd5, 0xea, 0x6a, 0xba, 0x0b, 0x4b, 0xb6, 0x0e, 0x59,\n  0xe4, 0x87, 0xd2, 0x23, 0x98, 0x77, 0x14, 0xe6, 0xe9, 0x1b, 0xd2, 0xb3,\n  0xc4, 0x03, 0xf2, 0xbc, 0xe9, 0x8b, 0x0e, 0xab, 0xc4, 0x21, 0x5b, 0x91,\n  0x35, 0x41, 0x0b, 0x73, 0xc9, 0x43, 0x37, 0xc2, 0x3e, 0xe6, 0x1f, 0x3d,\n  0xcf, 0xe5, 0xb5, 0x3c, 0xed, 0x03, 0xb9, 0x06, 0xba, 0x7d, 0x26, 0x02,\n  0x8c, 0x36, 0xf1, 0x62, 0x38, 0x63, 0x59, 0xc8, 0x5b, 0xe9, 0xab, 0xb4,\n  0xdb, 0x30, 0x90, 0x51, 0xb5, 0x1a, 0x81, 0x8c, 0x2c, 0x23, 0x35, 0xbb,\n  0x78, 0xcd, 0x0d, 0xb8, 0xbc, 0xe6, 0x82, 0xdb, 0x27, 0x56, 0x5e, 0xb1,\n  0x6d, 0xdb, 0xce, 0xcb, 0xfb, 0x47, 0xef, 0x38, 0x72, 0xc9, 0x45, 0x17,\n  0x5d, 0x7c, 0xc9, 0x85, 0x17, 0x4a, 0xcf, 0x4e, 0xdd, 0x38, 0xbb, 0xfe,\n  0xd4, 0x3a, 0xeb, 0xb5, 0xd7, 0x5a, 0xd7, 0x5f, 0xbb, 0x6e, 0xcb, 0x0d,\n  0xd3, 0x33, 0x97, 0xed, 0xdd, 0x7b, 0xc5, 0x15, 0x7b, 0xf7, 0x5e, 0xa6,\n  0xfb, 0x34, 0x25, 0x41, 0x4e, 0x10, 0xd9, 0x0a, 0xa3, 0xcd, 0x35, 0xd6,\n  0xe9, 0x6c, 0x67, 0x06, 0x8c, 0xde, 0xf6, 0xd2, 0xb5, 0xee, 0x12, 0x16,\n  0x03, 0x53, 0xee, 0x2e, 0xb7, 0x59, 0x49, 0x31, 0x2d, 0x36, 0xf5, 0x09,\n  0xbb, 0x94, 0x27, 0x04, 0x74, 0xe2, 0xe8, 0xca, 0x23, 0xf3, 0x5b, 0xb7,\n  0xbd, 0xe7, 0x86, 0xe3, 0x1b, 0x26, 0x45, 0xe0, 0xe7, 0xca, 0xcb, 0xe6,\n  0x2e, 0xbd, 0xa5, 0xe8, 0x8d, 0x37, 0x5c, 0xb7, 0x5e, 0x7a, 0xfa, 0xd6,\n  0xc9, 0x0b, 0x10, 0x85, 0x66, 0x7e, 0xfe, 0x02, 0x86, 0xc9, 0x0d, 0x1d,\n  0x9a, 0x03, 0xfe, 0x05, 0xc9, 0x96, 0x74, 0x91, 0x1e, 0x07, 0xe6, 0x16,\n  0x09, 0x4a, 0xdb, 0x72, 0x42, 0x76, 0xfa, 0xa6, 0x75, 0x4f, 0xe9, 0x14,\n  0x5e, 0x14, 0x7a, 0xd1, 0x99, 0x4a, 0x92, 0xf7, 0x65, 0x9f, 0x53, 0x1e,\n  0xb1, 0x53, 0x52, 0xcc, 0x3e, 0x01, 0x04, 0x69, 0xd0, 0x62, 0x35, 0x47,\n  0xb1, 0x09, 0xe7, 0xc6, 0x94, 0xc8, 0xd4, 0x73, 0xd3, 0xca, 0xfd, 0x8d,\n  0x91, 0x9a, 0x0d, 0xdd, 0xef, 0x7d, 0xef, 0x15, 0x57, 0x54, 0x6d, 0xbb,\n  0xfd, 0xd6, 0x35, 0x1f, 0x94, 0x9e, 0x65, 0x78, 0xdb, 0x27, 0x76, 0xef,\n  0x39, 0xfe, 0x8b, 0x0f, 0x3b, 0x3e, 0x72, 0xc5, 0x96, 0xf7, 0x4d, 0x08,\n  0x9f, 0xd1, 0x0e, 0xfa, 0x24, 0xf0, 0xab, 0x0e, 0xb9, 0x85, 0xf1, 0xd2,\n  0x65, 0xb0, 0x64, 0xd8, 0x57, 0x12, 0x8c, 0x5f, 0x51, 0x74, 0x30, 0x38,\n  0xa6, 0x9a, 0x06, 0x64, 0x16, 0xdf, 0x18, 0xf4, 0x43, 0x0f, 0xea, 0x68,\n  0x9d, 0xc5, 0xba, 0xc8, 0xe7, 0x40, 0xdc, 0x9e, 0x2f, 0xbe, 0x3e, 0x67,\n  0xfc, 0xa4, 0x75, 0x91, 0x95, 0xd5, 0x95, 0x1d, 0xe1, 0x54, 0x83, 0x3f,\n  0xd5, 0xda, 0x3d, 0x97, 0x5a, 0x75, 0xf1, 0x54, 0xed, 0x74, 0x38, 0x5c,\n  0x36, 0x18, 0x99, 0x9d, 0x0a, 0xaf, 0x19, 0x9d, 0x1e, 0x98, 0x7d, 0x5a,\n  0xb5, 0x0e, 0x6b, 0xb6, 0x9a, 0xaa, 0x50, 0xb9, 0xdb, 0xe6, 0xe8, 0xdc,\n  0xbf, 0x71, 0xff, 0xfb, 0x06, 0xdd, 0xce, 0x09, 0x7b, 0xf1, 0x45, 0x07,\n  0x57, 0x0c, 0x27, 0x8a, 0x4b, 0xc6, 0xdb, 0x56, 0xaf, 0x21, 0xfc, 0xba,\n  0xe4, 0xb7, 0xb0, 0xcf, 0x38, 0x10, 0xb3, 0xcc, 0xce, 0x3e, 0x0f, 0xc8,\n  0x8a, 0x45, 0x91, 0xdf, 0x83, 0xb9, 0xc2, 0x64, 0x89, 0x7b, 0x59, 0xe2,\n  0xc5, 0x6f, 0x27, 0xbb, 0x96, 0x4e, 0x59, 0xf4, 0xc5, 0x1c, 0xe1, 0x74,\n  0x96, 0x53, 0x85, 0x09, 0xf5, 0xb6, 0x2c, 0xa7, 0xb0, 0xe4, 0xfa, 0x25,\n  0x84, 0xf8, 0x89, 0x9d, 0xe5, 0xae, 0x71, 0x10, 0x07, 0xbb, 0x4c, 0xd6,\n  0xac, 0x98, 0xbe, 0x02, 0x23, 0x87, 0xd9, 0x45, 0xb2, 0x7b, 0x0f, 0x3d,\n  0x9d, 0xf9, 0x11, 0xf5, 0x6e, 0xf9, 0xba, 0xf4, 0xe4, 0xcc, 0xd9, 0xef,\n  0x9d, 0xca, 0xfc, 0x3b, 0xb7, 0xa3, 0xb6, 0xc0, 0x7e, 0xff, 0x8f, 0x2c,\n  0xe7, 0x48, 0x63, 0xba, 0x8e, 0x20, 0x68, 0x85, 0x42, 0x4e, 0xa1, 0xfa,\n  0x87, 0x57, 0x1d, 0xd0, 0x3f, 0x58, 0x74, 0x4f, 0xf3, 0xfd, 0x8d, 0xdf,\n  0x52, 0xab, 0xd6, 0x70, 0x43, 0x30, 0x06, 0x4d, 0xb3, 0xd4, 0xe7, 0xa9,\n  0xd8, 0x67, 0xb7, 0xd2, 0xcd, 0x67, 0x7f, 0xb6, 0xe5, 0xfa, 0x37, 0x64,\n  0xeb, 0xc4, 0x0f, 0x7e, 0xfa, 0x01, 0x22, 0x74, 0xe2, 0x9b, 0xf4, 0xe7,\n  0x20, 0x5f, 0x0d, 0x98, 0xff, 0xc9, 0x0b, 0x8a, 0xce, 0x43, 0x15, 0xa9,\n  0x96, 0x5a, 0x68, 0x1d, 0xf7, 0xbd, 0x07, 0x5b, 0xd8, 0xa2, 0xd0, 0x03,\n  0x7a, 0x2c, 0x64, 0x5f, 0xf6, 0xe6, 0x39, 0x85, 0xae, 0xbf, 0x89, 0x78,\n  0x65, 0x45, 0xd0, 0x5f, 0x8c, 0x89, 0xe9, 0x1b, 0x68, 0x83, 0x66, 0xd5,\n  0xfd, 0x88, 0xba, 0xbb, 0x23, 0xdd, 0x5d, 0x4b, 0xaf, 0x9f, 0xb4, 0x88,\n  0xa6, 0x07, 0x6b, 0x30, 0x6f, 0xe0, 0x4f, 0xf4, 0x8c, 0x59, 0xed, 0x35,\n  0x99, 0x27, 0xfb, 0x2c, 0xb6, 0x32, 0x9f, 0x35, 0x64, 0x0b, 0x7a, 0x62,\n  0xde, 0xc1, 0x21, 0xab, 0x3d, 0x4c, 0xbb, 0x56, 0x2b, 0xf6, 0xb2, 0x40,\n  0x49, 0x99, 0xd5, 0x5e, 0x65, 0xef, 0xef, 0x75, 0xb7, 0x57, 0x5f, 0xf3,\n  0x78, 0x71, 0xc2, 0x13, 0x0a, 0xaa, 0x96, 0x71, 0xab, 0x36, 0xd8, 0x0d,\n  0x05, 0xbb, 0x7f, 0xcd, 0x0b, 0xe4, 0x09, 0xc5, 0xca, 0x79, 0xd4, 0x0a,\n  0x3c, 0x3a, 0x03, 0x7b, 0x65, 0x23, 0xe6, 0x25, 0xf3, 0x80, 0x89, 0x52,\n  0x57, 0x59, 0x11, 0x76, 0xdb, 0xac, 0x9a, 0x55, 0xa6, 0xf5, 0x39, 0xd1,\n  0x54, 0xfd, 0x59, 0x0f, 0xe6, 0x5e, 0x1c, 0x46, 0xb2, 0x06, 0xf3, 0x3b,\n  0xe2, 0x17, 0x1d, 0x4b, 0x76, 0x08, 0x5e, 0x4b, 0xca, 0xcb, 0x7d, 0xe9,\n  0xcc, 0x23, 0xa8, 0xf1, 0xcb, 0x59, 0xdd, 0x89, 0x43, 0x58, 0xb3, 0xaa,\n  0xc4, 0xb5, 0x3f, 0xf3, 0xf7, 0xe7, 0x15, 0xb9, 0x1b, 0x02, 0xa5, 0xa1,\n  0xa2, 0x64, 0xb8, 0x7f, 0xc0, 0xeb, 0x1d, 0xa3, 0xbb, 0x2e, 0x76, 0xba,\n  0x2c, 0xd5, 0x31, 0x77, 0x99, 0xe6, 0xaa, 0x7a, 0x63, 0xa4, 0xa7, 0xa2,\n  0xb7, 0x86, 0x96, 0x4d, 0x75, 0x53, 0x39, 0xb6, 0x32, 0xd8, 0xe0, 0xc0,\n  0xef, 0x5f, 0xcd, 0x95, 0x13, 0x6d, 0x5f, 0x99, 0xe8, 0xcb, 0x7c, 0x25,\n  0x5a, 0x17, 0x2e, 0xa9, 0xa8, 0x64, 0x2a, 0x94, 0xcf, 0xc9, 0x9b, 0x88,\n  0x7d, 0x2e, 0xfd, 0x88, 0x84, 0xc9, 0x4c, 0xda, 0x03, 0x2a, 0x8f, 0x7a,\n  0x18, 0x0c, 0x81, 0xa6, 0xa2, 0xef, 0x99, 0x24, 0xd6, 0xbd, 0x5b, 0xcf,\n  0x28, 0xd0, 0x37, 0x8d, 0x26, 0x79, 0x0a, 0x7d, 0x53, 0xdd, 0xe2, 0x60,\n  0xaf, 0x3f, 0xc1, 0xef, 0xb8, 0x0e, 0xf8, 0x29, 0x4c, 0xc2, 0x35, 0xcd,\n  0x0a, 0x18, 0x39, 0x11, 0x1c, 0x4f, 0x52, 0x4b, 0x76, 0x27, 0xd8, 0x1f,\n  0x8b, 0x36, 0x85, 0xe3, 0xd5, 0x15, 0xf2, 0x37, 0x92, 0x3f, 0x2b, 0x2a,\n  0xfb, 0x63, 0xed, 0x0b, 0x9d, 0xe3, 0x9d, 0xb3, 0x65, 0xf5, 0xc9, 0xbd,\n  0xa3, 0xf7, 0x3e, 0x10, 0xae, 0x9a, 0xba, 0x6d, 0x3c, 0x1e, 0x39, 0xb6,\n  0xfa, 0xd4, 0xea, 0x86, 0x5b, 0x86, 0xdf, 0x17, 0xaf, 0x0c, 0x8c, 0x56,\n  0x54, 0xbf, 0xfc, 0xcc, 0xc8, 0xdf, 0x4c, 0x42, 0x5f, 0x1f, 0x61, 0xf8,\n  0x0a, 0x67, 0x41, 0x53, 0x56, 0xa5, 0xc3, 0x5e, 0xf4, 0x4e, 0xc4, 0xb8,\n  0x78, 0x1b, 0x99, 0xa4, 0x9c, 0xb7, 0xf0, 0xf6, 0x72, 0x52, 0x2e, 0x21,\n  0x57, 0x39, 0x60, 0x2e, 0xbe, 0x57, 0xff, 0x33, 0x59, 0x29, 0xb3, 0x17,\n  0x47, 0x13, 0x0d, 0x16, 0xe5, 0x95, 0xc0, 0x7f, 0xd9, 0x2b, 0x3d, 0xbf,\n  0x09, 0xfe, 0xa0, 0xff, 0xa3, 0xeb, 0xc2, 0x57, 0x7c, 0xe7, 0x96, 0xc9,\n  0xfa, 0x9a, 0x37, 0xd6, 0x7e, 0xe9, 0xbc, 0x70, 0x57, 0xd9, 0xf4, 0xaa,\n  0x99, 0xf8, 0xea, 0xca, 0x35, 0xc3, 0x23, 0x53, 0xbb, 0xbd, 0x1b, 0x82,\n  0xc7, 0x3f, 0xfd, 0x93, 0xab, 0xf7, 0x7c, 0x7d, 0x9c, 0xcb, 0x2e, 0xdb,\n  0xcf, 0x1b, 0xc8, 0x67, 0x04, 0x56, 0xac, 0x03, 0x98, 0x55, 0x5f, 0xed,\n  0xb3, 0x2b, 0x32, 0x89, 0x50, 0x85, 0x7d, 0x35, 0xc4, 0x32, 0xc9, 0x28,\n  0xb3, 0x64, 0xbf, 0x1b, 0x86, 0x18, 0x9b, 0xf0, 0xae, 0x8e, 0xe9, 0x73,\n  0x65, 0xaf, 0x6a, 0x91, 0x14, 0x25, 0xa5, 0xe8, 0x8b, 0x1d, 0x3f, 0xb4,\n  0x74, 0x1b, 0x79, 0x1b, 0x06, 0xf8, 0x0a, 0xe7, 0x94, 0x84, 0xd3, 0xa5,\n  0x63, 0x50, 0xc6, 0x23, 0xf0, 0x17, 0xd1, 0x9a, 0xa8, 0xc4, 0x72, 0x6f,\n  0x20, 0x0d, 0x35, 0x89, 0x40, 0x4d, 0x82, 0x2d, 0xf7, 0x73, 0xec, 0xc8,\n  0xba, 0x77, 0x4d, 0x37, 0x9d, 0x58, 0x66, 0x2b, 0x76, 0x55, 0xf9, 0xd6,\n  0x6c, 0xc0, 0xfd, 0xba, 0xf0, 0x16, 0x0c, 0x25, 0xc7, 0x4e, 0xb2, 0x6d,\n  0xda, 0xc8, 0x77, 0x9d, 0x60, 0x79, 0x46, 0x3b, 0x70, 0xb5, 0x3b, 0x28,\n  0x55, 0x19, 0xa4, 0x2a, 0x6a, 0xa8, 0x83, 0xd9, 0xcc, 0x8f, 0x03, 0x86,\n  0x97, 0x2e, 0x1b, 0x6e, 0x2f, 0xcf, 0x2c, 0xda, 0xd2, 0x54, 0xd3, 0x91,\n  0xe8, 0xc0, 0xcf, 0xc8, 0x2c, 0xee, 0x23, 0x4e, 0xe3, 0x36, 0xab, 0x29,\n  0x8d, 0x00, 0x02, 0xcc, 0x56, 0x4a, 0x3a, 0xfa, 0x71, 0x8c, 0xa9, 0xf2,\n  0x6c, 0x02, 0x04, 0xcd, 0x27, 0x90, 0x32, 0x70, 0x03, 0x1c, 0x1c, 0x3e,\n  0xb8, 0xe2, 0x9a, 0x8b, 0x92, 0xa9, 0x86, 0x90, 0xc5, 0x1a, 0xe9, 0x6f,\n  0x5e, 0x3d, 0x52, 0x6a, 0xb1, 0x4c, 0x2b, 0x8e, 0x64, 0xdd, 0xcc, 0xfe,\n  0xd6, 0xf7, 0x5d, 0x3b, 0xb5, 0x03, 0xa6, 0xa4, 0x6e, 0xa2, 0x73, 0x66,\n  0x64, 0x44, 0x8a, 0xa6, 0xaf, 0xdc, 0xf6, 0xfe, 0xdb, 0x5d, 0xe5, 0x81,\n  0xd1, 0xc9, 0xb2, 0xa2, 0xaa, 0x70, 0x91, 0x1f, 0x1d, 0x61, 0x1c, 0x96,\n  0x55, 0xf7, 0xde, 0xfe, 0x99, 0x7f, 0x99, 0xb8, 0xe9, 0x63, 0x25, 0xa5,\n  0xae, 0x68, 0xf8, 0x82, 0xfd, 0x07, 0xce, 0x37, 0xd9, 0xdf, 0x2a, 0xda,\n  0xdf, 0x60, 0x47, 0x62, 0x8e, 0xc2, 0x47, 0xa4, 0x5f, 0xc2, 0xcf, 0xd3,\n  0xc4, 0x1c, 0x43, 0xa0, 0x4a, 0xbb, 0x0c, 0x7b, 0xfd, 0x69, 0x96, 0x8b,\n  0xf1, 0x55, 0xf6, 0x73, 0x05, 0xfc, 0xfc, 0x25, 0xf6, 0xf3, 0x6f, 0x0d,\n  0xcc, 0xe5, 0x7a, 0xbc, 0xd7, 0x20, 0xf7, 0xf0, 0x58, 0x03, 0xe0, 0x5d,\n  0x2b, 0xda, 0x92, 0x02, 0x23, 0x74, 0x80, 0xe5, 0x1d, 0x7e, 0x16, 0x7e,\n  0x4e, 0x70, 0x6c, 0x65, 0x30, 0xd6, 0xeb, 0x19, 0x36, 0xc4, 0xba, 0x2f,\n  0x95, 0x38, 0x65, 0xd0, 0x2e, 0xd4, 0xd8, 0xa0, 0x65, 0xb6, 0x13, 0x9f,\n  0xc2, 0x15, 0xd1, 0x39, 0x6d, 0xc1, 0x4f, 0xf6, 0x29, 0x11, 0x2b, 0xcf,\n  0x1f, 0xb0, 0x22, 0x32, 0xcf, 0x9e, 0xa3, 0x9d, 0xe3, 0x82, 0x16, 0xfd,\n  0xc4, 0x1f, 0x70, 0x7b, 0xdd, 0x2a, 0xd8, 0xe9, 0x1d, 0xee, 0x0e, 0x2f,\n  0xfc, 0xc7, 0x02, 0xba, 0xbb, 0x63, 0x32, 0xfc, 0x87, 0xd1, 0x9d, 0x7b,\n  0x2e, 0xff, 0x9d, 0xf2, 0xca, 0x65, 0x73, 0x8a, 0xac, 0xbc, 0x36, 0xf9,\n  0x0a, 0xfc, 0x29, 0x3d, 0x99, 0xb9, 0x96, 0x5e, 0x73, 0xb6, 0x8b, 0x7e,\n  0xb6, 0xeb, 0x70, 0x34, 0x73, 0x0d, 0x7d, 0x5f, 0xe4, 0xc2, 0xee, 0xcc,\n  0x06, 0x3d, 0xb6, 0x5f, 0xba, 0x16, 0xf6, 0x0e, 0x0f, 0xd9, 0xfa, 0xa5,\n  0x22, 0x87, 0xb9, 0x6f, 0x65, 0xe6, 0xbe, 0x75, 0x73, 0xa3, 0x14, 0xed,\n  0xd9, 0x5e, 0x85, 0xa5, 0x5f, 0x13, 0x0f, 0x89, 0xde, 0xbb, 0x6e, 0xfd,\n  0x21, 0xef, 0xa3, 0x87, 0x78, 0xfc, 0x6e, 0x0f, 0xeb, 0x63, 0x10, 0xfa,\n  0xa8, 0x77, 0x11, 0x8e, 0x7f, 0xd8, 0xc1, 0xcd, 0x17, 0x7c, 0xf6, 0xe1,\n  0x7d, 0x9b, 0x28, 0xfd, 0xe4, 0xf8, 0xc7, 0x29, 0x85, 0x3d, 0x27, 0xf3,\n  0x27, 0xea, 0x3c, 0xfb, 0x32, 0xdd, 0xe0, 0xeb, 0xf0, 0xbe, 0xf6, 0x47,\n  0x6f, 0x67, 0xf0, 0xec, 0xbf, 0xa0, 0x4c, 0x2a, 0x42, 0x26, 0xcb, 0x80,\n  0x8f, 0x93, 0xe9, 0xb1, 0x38, 0xd5, 0xac, 0x1e, 0xc4, 0x00, 0x9d, 0x42,\n  0xf7, 0x4d, 0x81, 0x06, 0x22, 0x9c, 0x7a, 0x06, 0xa6, 0xed, 0xe8, 0x1e,\n  0x8b, 0xdb, 0x50, 0x8a, 0x1d, 0x70, 0x7a, 0xd5, 0xb5, 0xe1, 0x72, 0x42,\n  0xa2, 0xd5, 0xe5, 0x89, 0x70, 0x02, 0x5a, 0x28, 0x73, 0x07, 0x30, 0x4f,\n  0xb5, 0x03, 0xf7, 0xbd, 0x14, 0x0f, 0xd5, 0xed, 0x30, 0xe4, 0x13, 0xb1,\n  0xb6, 0x82, 0x78, 0xd7, 0xe1, 0x15, 0x67, 0x19, 0xbf, 0x3f, 0x10, 0x98,\n  0x59, 0xb3, 0xe6, 0x7d, 0x47, 0x98, 0x38, 0xd6, 0x4e, 0x55, 0x58, 0x60,\n  0x17, 0xfd, 0xd6, 0xb7, 0xfe, 0x06, 0x04, 0x6f, 0xfa, 0xce, 0x8a, 0x35,\n  0x6f, 0x6c, 0x1a, 0xa5, 0x07, 0x6f, 0xba, 0x81, 0x49, 0x60, 0x30, 0x50,\n  0x92, 0xae, 0x1b, 0xdd, 0x44, 0x5b, 0x40, 0xd8, 0xf6, 0x7f, 0xe7, 0x93,\n  0xa5, 0x21, 0x7e, 0x06, 0xa9, 0x02, 0x19, 0x58, 0x81, 0x32, 0x20, 0x6f,\n  0xcb, 0x91, 0x89, 0x04, 0x93, 0x89, 0x6c, 0x9c, 0x8a, 0x4e, 0x97, 0x40,\n  0x3a, 0xa2, 0x92, 0xcb, 0x0e, 0x13, 0x41, 0xbf, 0x85, 0xcb, 0x24, 0x9c,\n  0x6e, 0x73, 0x73, 0x33, 0x6e, 0xe2, 0x77, 0x6b, 0x20, 0x53, 0x1f, 0x62,\n  0x32, 0xd8, 0xc7, 0x7e, 0x86, 0x23, 0x2c, 0x70, 0xa6, 0x14, 0x7e, 0xde,\n  0x66, 0xe4, 0x6c, 0x57, 0xa4, 0x32, 0xf6, 0xfd, 0x1a, 0xac, 0x02, 0x27,\n  0x55, 0x88, 0x11, 0x53, 0x7f, 0x01, 0xf3, 0xe3, 0xb7, 0x18, 0xe1, 0xf4,\n  0x60, 0x9c, 0xf2, 0x5b, 0x4e, 0xf6, 0x35, 0x1f, 0xe4, 0x29, 0x96, 0x8c,\n  0x69, 0xdd, 0x1d, 0x49, 0x96, 0x05, 0xd8, 0xfe, 0xdc, 0xf4, 0x8f, 0xb7,\n  0x0f, 0x3d, 0xb6, 0x72, 0xfb, 0x1d, 0xbd, 0x76, 0x0b, 0x1c, 0x71, 0xa5,\n  0xb2, 0xb3, 0xbf, 0xbd, 0xf7, 0xde, 0x3f, 0x7c, 0xb0, 0x34, 0xec, 0x2a,\n  0x2d, 0xe6, 0xdf, 0x18, 0x60, 0x8b, 0x95, 0x6e, 0x06, 0x19, 0x2a, 0x26,\n  0x5e, 0xd2, 0x93, 0x4e, 0xc1, 0xd1, 0x53, 0xb5, 0x5a, 0x54, 0x98, 0x1b,\n  0x38, 0x7c, 0x59, 0xe9, 0x01, 0x1b, 0xc8, 0x85, 0xee, 0x82, 0xac, 0x69,\n  0x06, 0xc8, 0x87, 0x09, 0xd8, 0x03, 0x53, 0x87, 0x47, 0x22, 0x29, 0x44,\n  0xf7, 0x12, 0x16, 0x89, 0xbf, 0xa3, 0xa6, 0x23, 0x15, 0x93, 0x6e, 0xce,\n  0x3c, 0xfb, 0xe9, 0x75, 0x3b, 0x41, 0x15, 0x5d, 0xf9, 0xc3, 0xc7, 0x1f,\n  0xff, 0x61, 0x66, 0xfa, 0xc6, 0xd2, 0x7b, 0xef, 0x95, 0x42, 0xe3, 0x1f,\n  0x1a, 0xfb, 0xa7, 0x4f, 0xfe, 0x86, 0x63, 0x93, 0x75, 0x2c, 0xbc, 0x29,\n  0xb7, 0xb3, 0xdc, 0x4a, 0xdd, 0x64, 0x90, 0x5c, 0x9b, 0xf6, 0xc1, 0x19,\n  0x58, 0x4d, 0x46, 0x24, 0xc5, 0xe2, 0x71, 0xc0, 0x8b, 0x9c, 0x60, 0x11,\n  0xa3, 0x63, 0x54, 0x14, 0x33, 0xc8, 0x40, 0x47, 0xf0, 0x4b, 0x99, 0x42,\n  0x0e, 0x58, 0x8d, 0xac, 0x31, 0x08, 0x9c, 0x8d, 0x1b, 0x3f, 0xee, 0x93,\n  0x0c, 0x5f, 0xb1, 0x96, 0x28, 0x36, 0xa2, 0xcc, 0x12, 0x1b, 0x92, 0xda,\n  0x96, 0x21, 0x9d, 0x4b, 0x7b, 0x06, 0x56, 0xf4, 0xf6, 0x74, 0x75, 0xc6,\n  0x63, 0x35, 0x51, 0x5f, 0xbc, 0x26, 0x16, 0x75, 0xc2, 0x30, 0x28, 0xda,\n  0x01, 0x42, 0x59, 0x07, 0x75, 0x9f, 0xa6, 0xc5, 0xd9, 0x62, 0x19, 0x8e,\n  0x1b, 0x88, 0x9f, 0xc6, 0x9d, 0x20, 0xfd, 0x60, 0x0e, 0x59, 0x62, 0xac,\n  0x8e, 0xdc, 0x7e, 0xe9, 0x95, 0xdb, 0x06, 0x3a, 0x6a, 0xa7, 0x23, 0xe5,\n  0xb1, 0x7d, 0xed, 0x83, 0xeb, 0xfd, 0x65, 0x9b, 0xba, 0x86, 0x76, 0x75,\n  0xd0, 0x59, 0x69, 0x66, 0xb2, 0x6d, 0x3a, 0x51, 0x3b, 0xdd, 0x7e, 0xdb,\n  0x60, 0x6c, 0xfb, 0xf4, 0xc4, 0x9e, 0xed, 0x1d, 0xf5, 0x2b, 0x37, 0xaf,\n  0xd9, 0x35, 0x9e, 0xf9, 0xfc, 0x5b, 0xbd, 0x03, 0x7d, 0xab, 0xe9, 0x75,\n  0xeb, 0x66, 0x15, 0x39, 0x3a, 0xd4, 0x59, 0x5a, 0xb2, 0xca, 0x5b, 0x5e,\n  0xd7, 0x54, 0xd7, 0xdc, 0x7f, 0x64, 0xac, 0x6b, 0xf7, 0x76, 0x96, 0x66,\n  0xf6, 0x78, 0xe7, 0xc0, 0xf4, 0xfa, 0xa6, 0xfa, 0x35, 0x6b, 0x5b, 0x65,\n  0xa5, 0xe7, 0xf2, 0x91, 0x4d, 0x33, 0xc0, 0x37, 0x3b, 0xcb, 0x35, 0x1f,\n  0x22, 0x01, 0x38, 0x7b, 0x25, 0x31, 0x7a, 0x51, 0xb3, 0x8b, 0x34, 0xf3,\n  0x36, 0x91, 0x17, 0x9f, 0x3b, 0x83, 0x12, 0x9b, 0x8d, 0xfb, 0xbb, 0xa0,\n  0xa0, 0x24, 0xe2, 0xb1, 0x48, 0x65, 0xb8, 0xbc, 0x14, 0x6a, 0x05, 0x22,\n  0x6e, 0x77, 0x8d, 0xdb, 0xe1, 0x2a, 0xc7, 0x9c, 0xf3, 0x7c, 0x1d, 0x89,\n  0xc4, 0x79, 0x42, 0xcd, 0x27, 0x39, 0xae, 0x4e, 0x7b, 0x50, 0xfc, 0xdd,\n  0x25, 0x75, 0x8d, 0xba, 0x7d, 0xfb, 0x2f, 0xfe, 0xdd, 0x9a, 0x35, 0xbf,\n  0xed, 0xdd, 0x9e, 0xf2, 0x7b, 0xdb, 0xba, 0x07, 0x6f, 0xba, 0xec, 0x74,\n  0xf1, 0xe8, 0xf0, 0x75, 0xa7, 0x57, 0x8d, 0xd2, 0xbe, 0x91, 0xe2, 0x86,\n  0xca, 0xe1, 0xb9, 0x3f, 0x8f, 0xbc, 0x50, 0xba, 0xa2, 0xa3, 0xa2, 0xa1,\n  0x78, 0x2a, 0x11, 0xbb, 0xeb, 0x13, 0xcd, 0xb5, 0xff, 0x94, 0x04, 0x1d,\n  0xb5, 0x62, 0xe1, 0xaf, 0xf4, 0x65, 0xa9, 0x0a, 0x56, 0x71, 0x77, 0xba,\n  0x33, 0x08, 0xc6, 0x5a, 0xc8, 0x06, 0x53, 0x6b, 0xc7, 0x48, 0xfd, 0x29,\n  0x34, 0xd3, 0xb2, 0x70, 0x90, 0xd9, 0xcc, 0x99, 0x88, 0x99, 0xc2, 0x1d,\n  0xd8, 0x59, 0x42, 0x91, 0xa8, 0xba, 0x78, 0x03, 0xd5, 0x4f, 0x11, 0x74,\n  0x74, 0xfd, 0xce, 0x2d, 0x5b, 0xa3, 0x23, 0xb1, 0xe8, 0x70, 0xf3, 0xa9,\n  0x6b, 0x07, 0x2f, 0xdd, 0xd2, 0xb0, 0x31, 0x16, 0x0d, 0x0f, 0xd1, 0xe7,\n  0x2e, 0x9c, 0xdf, 0x75, 0xa4, 0xc8, 0x3e, 0xee, 0x72, 0x7c, 0xe8, 0x9a,\n  0xf5, 0x57, 0x8e, 0x78, 0xdc, 0x23, 0x2e, 0x3c, 0x35, 0x6d, 0xc1, 0x0c,\n  0x11, 0x2c, 0xb6, 0xb5, 0x84, 0x45, 0xc4, 0x64, 0x93, 0x03, 0x61, 0x70,\n  0x27, 0x8f, 0x6e, 0x8d, 0xc4, 0x23, 0x51, 0xbc, 0x07, 0x44, 0x20, 0x52,\n  0x44, 0x36, 0x60, 0xf3, 0x8c, 0xff, 0x90, 0x42, 0x77, 0xdf, 0x74, 0xcf,\n  0xe7, 0xae, 0xfe, 0xe0, 0x8e, 0xf3, 0x76, 0x4c, 0x0f, 0x7e, 0x8f, 0xba,\n  0xdf, 0x7f, 0x93, 0x14, 0xba, 0xe1, 0xba, 0xf3, 0x76, 0x65, 0x4e, 0xb2,\n  0x75, 0x14, 0x17, 0x6d, 0x3b, 0x49, 0x08, 0x63, 0xd4, 0x78, 0xce, 0x5c,\n  0x4d, 0x96, 0xd8, 0x0a, 0xe2, 0x1e, 0xa0, 0x6c, 0x09, 0xe9, 0x13, 0x52,\n  0xe4, 0xc2, 0x71, 0x62, 0xe4, 0x84, 0x2b, 0x54, 0x14, 0x62, 0x59, 0x87,\n  0x2c, 0x20, 0xf1, 0xce, 0x2c, 0xca, 0x82, 0x98, 0x93, 0xa0, 0x58, 0x53,\n  0x18, 0xf6, 0x47, 0xd5, 0xab, 0x3e, 0x74, 0xf7, 0xcd, 0x77, 0xf7, 0xf4,\n  0xdc, 0x33, 0x7e, 0xc3, 0x0d, 0xbd, 0xdf, 0x3b, 0x0f, 0x7a, 0x70, 0xed,\n  0xfb, 0x6f, 0xfa, 0xcd, 0xf8, 0x2b, 0x63, 0xff, 0x6b, 0xfc, 0xe3, 0xff,\n  0x7a, 0xde, 0x2e, 0x3c, 0x4f, 0xc0, 0xc6, 0xf0, 0x11, 0x76, 0x9e, 0xa8,\n  0xc3, 0xf8, 0x1c, 0x9e, 0x12, 0x29, 0x27, 0x0d, 0x92, 0x3e, 0x52, 0x71,\n  0x98, 0x40, 0x7c, 0xbe, 0x88, 0xdb, 0x58, 0xba, 0xf4, 0x23, 0x99, 0x6f,\n  0xd2, 0xa1, 0x97, 0x7f, 0xf6, 0xb3, 0x97, 0xf9, 0x5a, 0xd5, 0xf3, 0xaa,\n  0x7f, 0x1d, 0xd6, 0x69, 0x2d, 0x6a, 0xf2, 0x10, 0x55, 0x2c, 0x18, 0x75,\n  0x1a, 0xc5, 0xf4, 0x12, 0xec, 0x9a, 0x15, 0x5d, 0xf1, 0x71, 0x4b, 0x81,\n  0x03, 0x22, 0x46, 0x4c, 0x65, 0x01, 0x17, 0xcc, 0x81, 0xde, 0x65, 0x7e,\n  0x6f, 0x49, 0x11, 0x4b, 0x03, 0x50, 0x4b, 0x6b, 0x35, 0xe6, 0x62, 0x28,\n  0xd2, 0xdd, 0xe8, 0x49, 0x8c, 0x53, 0xe6, 0x34, 0x07, 0xfc, 0xe4, 0xcf,\n  0xa4, 0xf1, 0xa5, 0x03, 0x9b, 0xaa, 0x6a, 0x57, 0x37, 0xae, 0x58, 0xb9,\n  0x71, 0xa4, 0x6f, 0xfc, 0xee, 0x8d, 0xfd, 0xdd, 0x3b, 0xa3, 0x55, 0xbb,\n  0xfa, 0x4e, 0x1e, 0x8d, 0x74, 0x55, 0xb7, 0x74, 0x1d, 0xb1, 0xd7, 0x8c,\n  0x96, 0x78, 0x12, 0x09, 0x16, 0x83, 0x57, 0x57, 0x56, 0x32, 0xe3, 0xf6,\n  0x6c, 0x5f, 0x5d, 0x9b, 0xe2, 0xc1, 0x79, 0xab, 0x27, 0xb9, 0x8e, 0xdb,\n  0xb2, 0xd0, 0x4d, 0xbe, 0x0e, 0x3c, 0x41, 0xa4, 0x2a, 0xe0, 0x0a, 0x66,\n  0x53, 0x84, 0x03, 0xf4, 0x7e, 0xc5, 0x94, 0xd4, 0x11, 0x21, 0x6a, 0x4d,\n  0xd0, 0xb4, 0x2a, 0x82, 0x10, 0xc3, 0xae, 0x67, 0xce, 0x2f, 0xf9, 0xc5,\n  0xad, 0x0d, 0x22, 0x5c, 0x0b, 0x63, 0xb1, 0xe0, 0xf7, 0x1d, 0xe5, 0x15,\n  0x18, 0xa1, 0x55, 0xc1, 0x3e, 0xf5, 0xb4, 0x03, 0x8f, 0xec, 0x2c, 0x0f,\n  0x4a, 0x43, 0xba, 0x36, 0x9b, 0x3b, 0x99, 0xfb, 0xb6, 0x98, 0xc2, 0x3a,\n  0x29, 0x71, 0x60, 0x52, 0xdd, 0x22, 0x5a, 0xa4, 0x18, 0x39, 0x28, 0x74,\n  0xdf, 0x15, 0xf5, 0x62, 0x6f, 0xa4, 0x28, 0x1e, 0x2e, 0x4d, 0x6e, 0xdd,\n  0x60, 0xd7, 0xd4, 0x31, 0x47, 0x55, 0x13, 0xbd, 0x2d, 0x73, 0xe9, 0xcc,\n  0x1a, 0x22, 0xe6, 0xf5, 0x6d, 0xd6, 0x7e, 0x22, 0x1d, 0x03, 0x63, 0x1c,\n  0xf3, 0xf3, 0xb0, 0xcf, 0x2f, 0xb9, 0x09, 0xc0, 0x8a, 0x48, 0x11, 0xec,\n  0xdd, 0x22, 0x01, 0x98, 0x1f, 0xf3, 0xc8, 0x76, 0x68, 0xb0, 0x25, 0x68,\n  0xfe, 0x2d, 0x73, 0xbe, 0x6a, 0xed, 0x93, 0x07, 0x7e, 0xfe, 0xd2, 0x81,\n  0x47, 0x1b, 0xa4, 0xd0, 0x9f, 0xcb, 0xa2, 0xd6, 0xcf, 0xbf, 0x92, 0xf9,\n  0xe1, 0x9f, 0x6a, 0xbe, 0x07, 0x6d, 0xfb, 0xa1, 0xed, 0xbb, 0xa1, 0x6d,\n  0x17, 0xee, 0x36, 0x46, 0xde, 0x4b, 0xfe, 0x59, 0x66, 0x69, 0xd0, 0x98,\n  0x8b, 0xb8, 0xfc, 0x7e, 0x16, 0x34, 0x96, 0x02, 0x6b, 0x1f, 0xde, 0xd2,\n  0x1d, 0xc4, 0x28, 0xa5, 0x2d, 0x95, 0xb1, 0xa1, 0xb9, 0xdd, 0xf1, 0xeb,\n  0xff, 0xf0, 0x4f, 0xee, 0xbe, 0x04, 0xad, 0xf8, 0x43, 0x77, 0xff, 0xe4,\n  0x87, 0x27, 0xc4, 0x19, 0x17, 0x26, 0xe1, 0x7d, 0x12, 0x62, 0x66, 0x41,\n  0xdf, 0x9d, 0xb2, 0x94, 0xed, 0xb9, 0x85, 0x79, 0x89, 0xf1, 0x76, 0x75,\n  0xcb, 0xc8, 0x95, 0x63, 0x19, 0x75, 0x0a, 0xcb, 0xc8, 0xe7, 0x77, 0x6f,\n  0x79, 0xef, 0xc7, 0xa4, 0x7b, 0x4e, 0x6e, 0xa5, 0x96, 0xbb, 0xc7, 0x3f,\n  0x62, 0xc1, 0x14, 0x66, 0xe7, 0xd3, 0x8f, 0x82, 0xe1, 0x31, 0xee, 0xae,\n  0x2e, 0xc9, 0xbc, 0x97, 0xde, 0x54, 0x12, 0xf3, 0x66, 0xbe, 0x6e, 0xbc,\n  0xcf, 0xc7, 0x72, 0xa4, 0x55, 0xa6, 0xcb, 0x8b, 0x2c, 0xa6, 0xf7, 0x89,\n  0x51, 0x04, 0xdc, 0x01, 0x76, 0xd9, 0x0f, 0xaf, 0xf0, 0xf9, 0x10, 0x83,\n  0x4a, 0xd8, 0x60, 0x34, 0xb6, 0x65, 0x13, 0x4c, 0x9c, 0x6d, 0xf7, 0x26,\n  0x85, 0xca, 0x99, 0x3f, 0xed, 0x86, 0x77, 0xfc, 0xa0, 0xb4, 0x2f, 0x48,\n  0xff, 0x16, 0x5e, 0xd3, 0x50, 0x91, 0x0a, 0x65, 0x0e, 0x33, 0x79, 0x02,\n  0x9d, 0x26, 0xad, 0x94, 0xaa, 0x81, 0xd9, 0x65, 0x4c, 0x8f, 0x88, 0x14,\n  0x00, 0x27, 0x78, 0xaa, 0x3b, 0xc2, 0xe6, 0x39, 0x1e, 0x4f, 0xc4, 0x84,\n  0x1e, 0x31, 0x5f, 0xc1, 0xe6, 0xa0, 0x33, 0xaf, 0x5c, 0x71, 0x62, 0xd3,\n  0xec, 0x89, 0x9e, 0xde, 0x13, 0xb3, 0x57, 0x5d, 0x9f, 0x99, 0x5b, 0xb7,\n  0x79, 0xcb, 0xcc, 0xcc, 0xe6, 0xcd, 0xeb, 0xa9, 0x6b, 0xe3, 0x95, 0x23,\n  0x23, 0x57, 0x6d, 0xd8, 0x78, 0xc5, 0xc8, 0x87, 0xaf, 0x9a, 0xbf, 0xe8,\n  0x22, 0x0e, 0x5d, 0x8c, 0xe3, 0x8a, 0x81, 0x2e, 0xfd, 0x1e, 0xe8, 0xd2,\n  0x52, 0xd4, 0xa5, 0x6e, 0x10, 0x31, 0x23, 0x85, 0x16, 0x8b, 0xe1, 0xcd,\n  0xaa, 0x52, 0x23, 0xf3, 0x15, 0x25, 0x98, 0x48, 0x10, 0xcc, 0xfa, 0x52,\n  0x5a, 0x6a, 0xc9, 0xcd, 0x79, 0xa2, 0x1f, 0x54, 0xc4, 0x62, 0x7b, 0xa6,\n  0x79, 0x38, 0x1a, 0x1f, 0x8e, 0xae, 0xdf, 0xb5, 0x75, 0x36, 0x3a, 0x54,\n  0x11, 0x19, 0xdd, 0x7f, 0xea, 0xda, 0x81, 0x13, 0x9a, 0xc3, 0x35, 0x6e,\n  0x2f, 0x3a, 0xb2, 0x6b, 0xd7, 0x11, 0xaf, 0x6b, 0x24, 0x06, 0xba, 0xf4,\n  0x8a, 0x51, 0xb4, 0x57, 0x3c, 0xc4, 0x27, 0x0d, 0x4a, 0x0a, 0xbd, 0x91,\n  0x6c, 0x20, 0x61, 0x69, 0x85, 0x11, 0xf9, 0xcc, 0xf3, 0xee, 0xac, 0x30,\n  0xee, 0x72, 0x4b, 0xc9, 0xb8, 0x34, 0x42, 0xbf, 0x0f, 0x74, 0xa3, 0x24,\n  0x26, 0x69, 0x66, 0x3a, 0xfa, 0x65, 0x49, 0x33, 0xe8, 0x64, 0xe2, 0x95,\n  0xb6, 0xc1, 0x38, 0x6e, 0x24, 0x5f, 0x21, 0x71, 0xa9, 0xcf, 0x4c, 0x27,\n  0x7f, 0x59, 0xea, 0x33, 0xe8, 0x3a, 0x17, 0xfe, 0x22, 0x5f, 0x89, 0xf9,\n  0x3c, 0xa8, 0x4f, 0x7e, 0x48, 0x8f, 0x77, 0x94, 0xb3, 0x58, 0x19, 0xbd,\n  0xc0, 0x9f, 0xd7, 0x60, 0xde, 0x2b, 0x49, 0x3d, 0xe6, 0x69, 0x76, 0x2b,\n  0xe8, 0xf6, 0x37, 0x65, 0xa0, 0x2b, 0xb0, 0x1c, 0x44, 0xc2, 0xc5, 0x8e,\n  0x4f, 0x52, 0x75, 0x15, 0xee, 0x8b, 0x55, 0xf5, 0xd5, 0xf5, 0x50, 0xa7,\n  0x32, 0x56, 0x56, 0x67, 0x85, 0x85, 0x43, 0x79, 0x60, 0xbb, 0xdf, 0x40,\n  0xa2, 0xee, 0x16, 0xb8, 0xb5, 0xdc, 0x9d, 0x5c, 0x33, 0xdf, 0xf9, 0xfd,\n  0x30, 0x56, 0xd7, 0xd2, 0x73, 0xe9, 0x79, 0x03, 0xfb, 0x7a, 0x53, 0xad,\n  0x35, 0x35, 0x73, 0xed, 0x9d, 0x5d, 0xed, 0x17, 0x0c, 0x0d, 0x0c, 0x0c,\n  0x0d, 0x0d, 0x0e, 0x82, 0xfa, 0x6c, 0x1b, 0xf1, 0x7b, 0x26, 0x7b, 0xb6,\n  0xee, 0x6e, 0xd8, 0xd8, 0xd7, 0x3b, 0xe1, 0xf5, 0x8d, 0x37, 0x8f, 0x8f,\n  0x37, 0xf7, 0xf7, 0x37, 0x8f, 0xff, 0xb5, 0x37, 0x95, 0xea, 0xef, 0x4f,\n  0xa5, 0x7a, 0x71, 0x7f, 0xa4, 0x2e, 0x21, 0x4b, 0x71, 0xfc, 0x7e, 0x0f,\n  0xfb, 0xe2, 0x0d, 0x44, 0xbf, 0x8f, 0x3c, 0x21, 0x31, 0x75, 0x61, 0x55,\n  0xe1, 0x88, 0x0b, 0x0a, 0x43, 0x64, 0xd7, 0xf2, 0xc7, 0xb8, 0xe5, 0x11,\n  0xc3, 0xcb, 0xbc, 0xc1, 0xab, 0xae, 0xdf, 0x89, 0x42, 0xb3, 0xb3, 0xf7,\n  0x84, 0x54, 0x0d, 0xe2, 0x72, 0xe1, 0x85, 0xf3, 0x20, 0x37, 0x7c, 0xdf,\n  0x95, 0x56, 0x52, 0x17, 0x68, 0xbc, 0x48, 0xba, 0x92, 0x45, 0xfb, 0x89,\n  0x24, 0xa6, 0x7c, 0xe4, 0xf0, 0x67, 0x31, 0x29, 0x8e, 0x7a, 0x63, 0xa8,\n  0x2a, 0x0c, 0x19, 0xed, 0xe0, 0x03, 0xd3, 0x05, 0x73, 0x27, 0x8a, 0xa4,\n  0x2e, 0x8e, 0x28, 0x89, 0x7c, 0x0f, 0xa5, 0xdf, 0x66, 0xfb, 0x8b, 0x0f,\n  0x73, 0x76, 0xe3, 0x3d, 0x12, 0x48, 0xc2, 0xc1, 0x6c, 0x7e, 0x84, 0x23,\n  0x22, 0x81, 0x15, 0x86, 0xc8, 0x96, 0x14, 0x39, 0x7d, 0x2e, 0x1f, 0x26,\n  0x70, 0xc0, 0xc0, 0x58, 0x2d, 0x1b, 0xd6, 0x08, 0x56, 0x45, 0xcc, 0x1d,\n  0x64, 0xa6, 0x05, 0xb0, 0xf1, 0xf5, 0x8b, 0xf6, 0xd7, 0xef, 0xd9, 0xdc,\n  0x31, 0x77, 0x57, 0x5f, 0xc3, 0xf8, 0xc8, 0x80, 0x14, 0xda, 0x34, 0xdd,\n  0xb4, 0xb6, 0xed, 0x29, 0x29, 0x34, 0xf6, 0xcd, 0xa6, 0x54, 0x4b, 0x33,\n  0xd7, 0xe1, 0x60, 0x9a, 0xd3, 0x47, 0x45, 0x9e, 0x29, 0xb0, 0x53, 0x29,\n  0xcb, 0x33, 0x05, 0x13, 0x5b, 0x28, 0xd1, 0x54, 0x09, 0xd8, 0xb7, 0x5e,\n  0x77, 0x71, 0xb0, 0x24, 0xc8, 0x92, 0x4d, 0xb9, 0x93, 0x38, 0xb5, 0x88,\n  0x3b, 0xcb, 0x63, 0x71, 0x61, 0x6f, 0xd5, 0xbc, 0x1d, 0x22, 0x0c, 0x37,\n  0x74, 0x77, 0xb8, 0xad, 0xf2, 0xe0, 0xa1, 0x7b, 0xb6, 0x6e, 0xbd, 0xe5,\n  0x13, 0xc3, 0x63, 0x2b, 0x06, 0xfb, 0x5f, 0x76, 0xc4, 0xfa, 0x9b, 0x26,\n  0x67, 0xce, 0xbe, 0xfc, 0x93, 0x9f, 0xd0, 0xca, 0x87, 0x6b, 0x9b, 0x9a,\n  0xda, 0x96, 0xf4, 0x01, 0xad, 0x2e, 0x6a, 0x61, 0xe2, 0x45, 0xe0, 0x9c,\n  0x67, 0x39, 0xc8, 0x53, 0xae, 0x60, 0x2c, 0x2b, 0xd9, 0xad, 0x72, 0x2b,\n  0xb9, 0xa4, 0x98, 0x8a, 0x3e, 0x88, 0xd8, 0x4e, 0x98, 0x44, 0x74, 0x59,\n  0x8c, 0x88, 0xe8, 0x73, 0x84, 0xf9, 0x81, 0xd3, 0x4c, 0x52, 0xef, 0x07,\n  0x2d, 0x3d, 0x74, 0xb0, 0xb2, 0x2d, 0x7c, 0xf7, 0xf9, 0xb7, 0x6c, 0xdd,\n  0xfa, 0x89, 0xb1, 0xe1, 0x74, 0xff, 0xe0, 0xba, 0x89, 0xe6, 0x15, 0x71,\n  0x3b, 0x74, 0xe3, 0xec, 0xcb, 0x63, 0x0f, 0xb7, 0x35, 0x35, 0xd5, 0x32,\n  0x3d, 0x80, 0xfa, 0xfa, 0xab, 0xd0, 0x0f, 0x8d, 0x94, 0xa7, 0x43, 0x32,\n  0x35, 0x92, 0x54, 0x18, 0xfb, 0x3a, 0x53, 0x6e, 0x11, 0x74, 0xf7, 0x86,\n  0x7d, 0x9d, 0xfa, 0xe7, 0x1e, 0xa0, 0xf7, 0xdf, 0x4f, 0xbf, 0x3f, 0x3e,\n  0xce, 0x72, 0xa1, 0xfc, 0x95, 0xe5, 0x8f, 0xf0, 0xe8, 0x72, 0x41, 0x8f,\n  0x4c, 0xe7, 0xca, 0x05, 0x9c, 0xfe, 0x62, 0xde, 0x38, 0x93, 0x0b, 0x91,\n  0xea, 0x29, 0x9b, 0xb8, 0xc4, 0x2d, 0xc9, 0x2d, 0x7b, 0xd6, 0x1c, 0x3a,\n  0x32, 0x97, 0x1e, 0x1a, 0xee, 0x07, 0xed, 0xf8, 0x40, 0xcf, 0xb6, 0xce,\n  0x23, 0xdb, 0xe9, 0x6c, 0xe6, 0x81, 0x81, 0x55, 0xe3, 0xdd, 0x74, 0x8e,\n  0xaf, 0xd3, 0x04, 0x69, 0x91, 0xc6, 0xe9, 0x7f, 0xc3, 0x7a, 0x5e, 0x4f,\n  0x12, 0xd2, 0xf8, 0xa2, 0x75, 0x3f, 0x6e, 0xac, 0x67, 0x0f, 0x69, 0x90,\n  0xde, 0xa4, 0xff, 0x09, 0x74, 0xdf, 0x90, 0x5e, 0x5d, 0x78, 0x9e, 0x10,\n  0x96, 0xbd, 0x4b, 0xac, 0xea, 0x85, 0xe7, 0x4d, 0xdf, 0xcd, 0x6f, 0x93,\n  0x26, 0xa5, 0xdb, 0x81, 0x6e, 0x1d, 0xa9, 0x95, 0x7e, 0xb5, 0xa8, 0xbd,\n  0x5f, 0x99, 0xbf, 0x1d, 0xd1, 0x17, 0x61, 0x6c, 0xa3, 0x04, 0x3a, 0xd2,\n  0x3f, 0x99, 0x16, 0x18, 0x53, 0xd2, 0x37, 0x58, 0x7e, 0xd9, 0x64, 0x3a,\n  0x5e, 0xe9, 0x56, 0xd9, 0x21, 0x19, 0x13, 0x58, 0xb2, 0xdd, 0x47, 0x12,\n  0x00, 0x94, 0x98, 0x55, 0xd6, 0x5d, 0x5a, 0xc6, 0x37, 0x1f, 0xb9, 0xc3,\n  0x2b, 0x12, 0xca, 0x7b, 0xf9, 0xbf, 0x60, 0xaa, 0xbc, 0x1d, 0xb0, 0x0b,\n  0x35, 0x4b, 0xc9, 0x58, 0x11, 0x18, 0x75, 0x77, 0x9c, 0xde, 0xb0, 0xda,\n  0xe1, 0x91, 0x15, 0xd9, 0xe1, 0x54, 0xb7, 0xcc, 0x6e, 0xb2, 0xf9, 0xe0,\n  0x9f, 0x5e, 0xc7, 0xf0, 0xfa, 0x1b, 0x77, 0x6e, 0xd2, 0x8a, 0x30, 0x40,\n  0xd1, 0xee, 0xb2, 0xce, 0x02, 0x77, 0x5e, 0x6a, 0xd8, 0x5a, 0xe1, 0x6e,\n  0xef, 0x0e, 0xd0, 0xe6, 0xcc, 0x0f, 0xa2, 0xeb, 0x2a, 0x4a, 0xb7, 0x36,\n  0xd3, 0x4a, 0xd8, 0x49, 0x9a, 0xc3, 0x7d, 0xcd, 0x76, 0x7b, 0x4b, 0x5f,\n  0x38, 0xf3, 0x43, 0xde, 0xef, 0x24, 0x74, 0xf4, 0x9f, 0x31, 0x4e, 0x9e,\n  0xec, 0x24, 0x59, 0x7b, 0x2b, 0x04, 0xbb, 0xcb, 0x50, 0x7a, 0x90, 0x82,\n  0xad, 0x15, 0x84, 0xfd, 0x1d, 0x73, 0x95, 0x49, 0x0e, 0xf6, 0xb9, 0x0a,\n  0xdd, 0x41, 0x60, 0xe6, 0xd8, 0x67, 0xaa, 0x79, 0x03, 0x01, 0xcb, 0x34,\n  0x85, 0x70, 0x64, 0xf6, 0xc4, 0x6b, 0x92, 0x38, 0x1a, 0xea, 0x37, 0x74,\n  0xd9, 0xa2, 0x00, 0xc0, 0x14, 0x7d, 0xf0, 0xc1, 0xf3, 0x67, 0x8f, 0x9e,\n  0xec, 0xdb, 0x55, 0x15, 0xdd, 0xd9, 0xdd, 0xbf, 0x71, 0x6a, 0x7a, 0xfc,\n  0xd3, 0x99, 0xb3, 0x52, 0x68, 0xd5, 0x07, 0x6c, 0xdb, 0x46, 0x47, 0x77,\n  0x7b, 0x4b, 0x66, 0x4a, 0xca, 0x1a, 0xbb, 0xdb, 0x1b, 0x87, 0x3e, 0x38,\n  0x0c, 0x7d, 0x6a, 0x04, 0xdd, 0x7a, 0xb7, 0x84, 0x68, 0x8b, 0x20, 0xf9,\n  0x6e, 0xe8, 0x4a, 0xac, 0xbc, 0xac, 0x44, 0x53, 0x55, 0x99, 0xc6, 0x0b,\n  0xe5, 0xb3, 0x62, 0xfb, 0x4f, 0xa4, 0x0a, 0xad, 0x79, 0x92, 0xa0, 0x09,\n  0x4b, 0x36, 0x65, 0x7f, 0x2a, 0xcf, 0x15, 0x32, 0xcb, 0xf6, 0x23, 0xac,\n  0xfc, 0x37, 0x77, 0x1e, 0x99, 0x9a, 0x5e, 0xd5, 0xdb, 0xd8, 0x1a, 0x5d,\n  0x59, 0x11, 0x88, 0xae, 0xad, 0xdd, 0xb2, 0x7d, 0x64, 0x64, 0x7d, 0xdf,\n  0xd1, 0xba, 0xad, 0x55, 0xe1, 0x0d, 0xda, 0xea, 0xd1, 0xde, 0x61, 0x6f,\n  0xca, 0x1e, 0x8f, 0x87, 0xa3, 0x5e, 0xd7, 0x58, 0xb1, 0x67, 0xbc, 0x2f,\n  0xb5, 0x3a, 0xd0, 0x6b, 0xad, 0x8b, 0xae, 0x2e, 0x77, 0xcd, 0x80, 0x9d,\n  0x8f, 0x79, 0x9d, 0xde, 0xa4, 0xbf, 0x97, 0x10, 0x11, 0x1a, 0x6c, 0xb1,\n  0x72, 0x7f, 0x91, 0xaa, 0x10, 0xc5, 0xa7, 0xb1, 0x8c, 0xdb, 0x2c, 0x0e,\n  0x40, 0xa6, 0xfa, 0x0d, 0xe1, 0x71, 0xba, 0xb6, 0xb6, 0xa6, 0xa6, 0x26,\n  0x6a, 0x81, 0xb3, 0x50, 0x4d, 0xc0, 0xec, 0x3b, 0x9c, 0xcc, 0xc1, 0xc0,\n  0x32, 0xf6, 0x6f, 0x9e, 0x0b, 0xb9, 0x27, 0xb9, 0xd2, 0xed, 0x09, 0x3b,\n  0x1d, 0x35, 0x1e, 0x7f, 0x7b, 0x7f, 0xa2, 0x6b, 0x63, 0xd4, 0x53, 0xe3,\n  0x54, 0xa3, 0x45, 0xa1, 0xfe, 0xda, 0xce, 0xa1, 0xc6, 0x99, 0xae, 0xae,\n  0x99, 0x86, 0x68, 0xea, 0x63, 0x9d, 0xf5, 0xaa, 0x32, 0xaa, 0x6a, 0xee,\n  0xb6, 0xd6, 0xd1, 0x46, 0x4d, 0x1d, 0x95, 0xac, 0x75, 0xa9, 0xee, 0x8b,\n  0xba, 0x5b, 0xd7, 0x34, 0x36, 0xae, 0x69, 0x4d, 0x4c, 0x8f, 0x0b, 0x9b,\n  0xee, 0xa3, 0xa6, 0xf8, 0x7c, 0x69, 0x5e, 0xa6, 0xc2, 0x5e, 0x64, 0x47,\n  0xb6, 0xac, 0xeb, 0x04, 0x9c, 0xd3, 0xc0, 0x44, 0xa1, 0x1f, 0x7d, 0x65,\n  0x4e, 0x0a, 0x4d, 0x64, 0xda, 0x24, 0x76, 0xc7, 0xc9, 0xf0, 0xd3, 0x5e,\n  0x66, 0xba, 0x18, 0xd6, 0xb2, 0x95, 0x1a, 0x06, 0x1b, 0xf3, 0xa3, 0xe1,\n  0x2d, 0xb0, 0xaf, 0x11, 0xcc, 0x58, 0xc3, 0xab, 0x01, 0x19, 0xc7, 0xa5,\n  0xc9, 0xf6, 0xef, 0x6c, 0x7c, 0x7c, 0xe7, 0xe5, 0x9a, 0xd3, 0x62, 0x2b,\n  0xbe, 0x1c, 0x6d, 0x59, 0xba, 0xc9, 0x57, 0x17, 0x68, 0x4e, 0x66, 0x3e,\n  0x2b, 0xfa, 0x74, 0x56, 0xd7, 0x2d, 0xc4, 0x08, 0x23, 0x12, 0xe7, 0x7e,\n  0xb3, 0x6e, 0x81, 0xff, 0x22, 0xf4, 0xec, 0xec, 0x5f, 0xe6, 0xe8, 0x03,\n  0xf4, 0xfb, 0x99, 0x56, 0xec, 0x13, 0xc8, 0xb2, 0xd8, 0x1f, 0x24, 0x55,\n  0x79, 0x93, 0xf5, 0x31, 0x05, 0xc3, 0xda, 0xc2, 0x72, 0x5a, 0xc1, 0x5c,\n  0xa8, 0xa0, 0xab, 0xd9, 0x21, 0xfe, 0xa0, 0x15, 0x81, 0xd1, 0x64, 0xd3,\n  0x50, 0x83, 0x24, 0xe8, 0x76, 0x7b, 0x7c, 0x6e, 0xb7, 0x8f, 0x63, 0xb2,\n  0xa1, 0xe6, 0xf1, 0xc7, 0x52, 0x51, 0xb1, 0xf7, 0xa2, 0xdf, 0x56, 0x7b,\n  0x2a, 0x25, 0x6d, 0xa9, 0x3f, 0x6f, 0xeb, 0xec, 0x96, 0xf3, 0xea, 0xe7,\n  0x6e, 0x99, 0xbd, 0x55, 0x0a, 0x3d, 0xdc, 0xbe, 0xa3, 0xf7, 0xe3, 0x1f,\n  0xef, 0xdd, 0xde, 0xfe, 0x85, 0x87, 0xae, 0xa5, 0x1d, 0x99, 0xa7, 0xaf,\n  0xf9, 0x02, 0x7b, 0x67, 0xd1, 0xc2, 0x5b, 0xf4, 0x8f, 0x2c, 0xb7, 0xcf,\n  0x7a, 0xcc, 0xf1, 0x2d, 0x53, 0xa7, 0x00, 0x0e, 0xab, 0x14, 0xdf, 0xd5,\n  0xf4, 0xf3, 0x31, 0x4a, 0xaa, 0x01, 0x73, 0x5a, 0x66, 0x7a, 0x80, 0xe1,\n  0x93, 0xfa, 0x97, 0x2d, 0xbc, 0x2e, 0xf8, 0x52, 0x20, 0x9e, 0x70, 0x97,\n  0xa0, 0x94, 0xe0, 0xc8, 0x41, 0x07, 0xa8, 0x1c, 0xf8, 0x83, 0x09, 0x07,\n  0x28, 0x8a, 0x08, 0xfd, 0xe3, 0xdc, 0x47, 0xb4, 0xe2, 0x62, 0xab, 0xa7,\n  0xbf, 0xa7, 0xa2, 0xaa, 0x28, 0x6c, 0xf7, 0x97, 0xbb, 0x54, 0xb7, 0xd7,\n  0x4e, 0xfb, 0xe8, 0xf7, 0x53, 0x97, 0x1c, 0x4a, 0xcc, 0x8e, 0x39, 0xc7,\n  0x35, 0x6b, 0xe3, 0xaa, 0xca, 0xe3, 0x7f, 0xb3, 0x56, 0xe8, 0x2a, 0x5a,\n  0x45, 0x3f, 0x21, 0x3d, 0x4d, 0xc7, 0x58, 0xd6, 0xf9, 0xbc, 0xfe, 0x86,\n  0x0b, 0x0b, 0xb4, 0x4a, 0x0a, 0x48, 0x4f, 0x01, 0xcd, 0xfb, 0x0b, 0xfa,\n  0x24, 0xae, 0x84, 0x76, 0xae, 0x63, 0x34, 0x39, 0xfe, 0xe5, 0x72, 0xd6,\n  0x4f, 0x50, 0x26, 0x2e, 0xa0, 0xf9, 0xb8, 0xf4, 0x14, 0xc3, 0xe7, 0x4d,\n  0x90, 0x0b, 0xd7, 0x7c, 0xae, 0x06, 0x6f, 0x54, 0x54, 0xd0, 0xfa, 0x0e,\n  0x9b, 0x1d, 0x4c, 0x70, 0x2b, 0x91, 0x0f, 0xe8, 0x47, 0xd3, 0x9b, 0x31,\n  0xe8, 0x9c, 0xb1, 0xe1, 0x76, 0xbc, 0x2b, 0x8c, 0x60, 0xee, 0x20, 0x42,\n  0xb5, 0x03, 0x8b, 0xa8, 0xb3, 0x34, 0x73, 0xe9, 0xb2, 0xca, 0x4a, 0x42,\n  0x2a, 0x13, 0x95, 0x35, 0x91, 0x2a, 0x01, 0xe0, 0xeb, 0xab, 0x71, 0xfb,\n  0x22, 0x6e, 0x67, 0x71, 0x39, 0x02, 0xe3, 0xa6, 0xd8, 0x02, 0x47, 0x5c,\n  0x39, 0xfd, 0xaa, 0xa1, 0xdb, 0x80, 0xee, 0x15, 0x06, 0x40, 0xcc, 0xd5,\n  0x7e, 0x7a, 0xcb, 0xb6, 0xe4, 0xfa, 0x21, 0x8f, 0x6f, 0xcb, 0x9a, 0x4f,\n  0xad, 0xd8, 0xdc, 0xdf, 0xd8, 0xb5, 0x62, 0x6a, 0xe7, 0x60, 0x6b, 0x7b,\n  0x9a, 0xbe, 0xdc, 0xf4, 0xc5, 0x96, 0x15, 0xed, 0x65, 0x4d, 0xce, 0x64,\n  0x78, 0xc5, 0xca, 0xef, 0x36, 0xc5, 0xa3, 0xb1, 0xaa, 0x47, 0xfe, 0xae,\n  0x31, 0x1e, 0xad, 0x13, 0x63, 0x7f, 0x98, 0x8d, 0x3d, 0xb9, 0x2c, 0x7f,\n  0x56, 0x31, 0x9a, 0xda, 0x82, 0xbe, 0x96, 0x49, 0xa0, 0xa9, 0x47, 0x1a,\n  0x79, 0x6f, 0x41, 0x1a, 0xf4, 0xed, 0xfa, 0xb4, 0xf4, 0xef, 0xd0, 0x4e,\n  0x7d, 0x41, 0x1a, 0x7c, 0xd7, 0x27, 0xd9, 0xbb, 0x1a, 0x0a, 0xd2, 0x94,\n  0xd1, 0x2a, 0xf2, 0x6d, 0x46, 0xd3, 0x58, 0x30, 0x1e, 0xe0, 0x69, 0xf2,\n  0x19, 0x72, 0x92, 0xd1, 0x34, 0x2d, 0xfb, 0xae, 0x3b, 0x19, 0x4d, 0xf3,\n  0xb2, 0x34, 0xc3, 0x8c, 0xa6, 0x65, 0x39, 0x1a, 0xa9, 0x98, 0xd1, 0xb4,\n  0x2e, 0xdb, 0xce, 0x3f, 0x33, 0x9a, 0xb6, 0x82, 0xbe, 0xa8, 0x82, 0x06,\n  0xce, 0x5c, 0x03, 0x8f, 0x14, 0x33, 0xd7, 0x40, 0x2e, 0x66, 0x45, 0x78,\n  0xf0, 0xba, 0x99, 0x1f, 0x51, 0x6f, 0xc7, 0x3b, 0x3a, 0x56, 0x20, 0xcd,\n  0xeb, 0x05, 0x73, 0x69, 0x67, 0x36, 0x6f, 0x75, 0x71, 0x29, 0x9c, 0xba,\n  0x3b, 0x18, 0x5a, 0x9c, 0x97, 0xc5, 0xb2, 0xe0, 0xbd, 0xf8, 0xca, 0x6e,\n  0x38, 0x8c, 0xfd, 0x65, 0xb8, 0x4b, 0xa1, 0xd2, 0x5f, 0xe1, 0x25, 0xff,\n  0xf4, 0x9f, 0x15, 0xa3, 0x45, 0x74, 0x6f, 0x66, 0xd3, 0xeb, 0x91, 0x95,\n  0xfe, 0xcc, 0xdf, 0xeb, 0x73, 0xf3, 0xac, 0xf4, 0x03, 0xe8, 0x5f, 0x7b,\n  0x41, 0x39, 0x48, 0x00, 0xcd, 0xed, 0x6c, 0x8e, 0x7f, 0xb3, 0xac, 0xac,\n  0x5c, 0xc0, 0xc6, 0xd9, 0xb1, 0x2c, 0xcd, 0x2d, 0x8c, 0x26, 0xb5, 0x4c,\n  0x6c, 0x44, 0x15, 0xdd, 0xcb, 0x68, 0xba, 0x0b, 0xf2, 0x74, 0x05, 0xf4,\n  0xe7, 0x1e, 0x46, 0x53, 0x38, 0x56, 0xc3, 0x0a, 0x73, 0xb3, 0x89, 0xd1,\n  0x14, 0x8e, 0xd5, 0xa8, 0x84, 0x76, 0x7a, 0xa4, 0xf3, 0x81, 0x66, 0xb8,\n  0x60, 0x7f, 0x52, 0xb4, 0x8c, 0xce, 0xa0, 0x4f, 0xb2, 0xe2, 0x29, 0x48,\n  0x13, 0x87, 0x76, 0x6e, 0x64, 0x34, 0xde, 0x82, 0x34, 0x11, 0x5a, 0x0a,\n  0xe7, 0x6a, 0xa4, 0xf9, 0x45, 0x7e, 0x5d, 0xc3, 0x7c, 0xa4, 0x4b, 0xe9,\n  0x85, 0xcc, 0x47, 0x7a, 0x64, 0xd9, 0x77, 0xcd, 0x31, 0x9a, 0xb1, 0x65,\n  0x69, 0xa6, 0x99, 0x1f, 0xf5, 0xf8, 0x72, 0xfd, 0xa1, 0x6b, 0x58, 0x7f,\n  0xca, 0x0b, 0xd2, 0x84, 0x81, 0x26, 0xce, 0x68, 0xc2, 0x05, 0x79, 0xe8,\n  0x07, 0x9a, 0x08, 0xa3, 0xf9, 0x6d, 0x41, 0x9a, 0x38, 0xb9, 0x03, 0xfa,\n  0x8c, 0xfd, 0x99, 0x2c, 0xf8, 0xae, 0x1e, 0x72, 0x3f, 0xb9, 0x82, 0xf9,\n  0x90, 0xff, 0x6e, 0xd9, 0x38, 0x9e, 0xcd, 0x6c, 0xec, 0x6b, 0x97, 0x8b,\n  0xbf, 0x91, 0x1a, 0xd8, 0xbb, 0xd6, 0x15, 0xa6, 0x81, 0xfe, 0xec, 0x42,\n  0x1a, 0xea, 0x2c, 0xdc, 0x67, 0x18, 0xd7, 0xf9, 0xac, 0x9d, 0x0d, 0x05,\n  0xfb, 0x83, 0x63, 0xe7, 0x73, 0x1a, 0x28, 0xd8, 0x4e, 0x82, 0xfe, 0x6f,\n  0x7a, 0x52, 0xda, 0x0f, 0x34, 0x7f, 0x5a, 0x86, 0xa6, 0x9c, 0x9e, 0x04,\n  0xba, 0x31, 0xe5, 0xcf, 0xcb, 0xf6, 0xf9, 0x42, 0xd6, 0x9f, 0x8d, 0x05,\n  0xfb, 0x83, 0x31, 0x4c, 0xcf, 0x4b, 0xff, 0x00, 0x34, 0xb3, 0x05, 0xdb,\n  0xe9, 0x80, 0x3e, 0x6f, 0x63, 0xfe, 0xf3, 0x5b, 0x0b, 0xd2, 0x94, 0xd2,\n  0x15, 0xf4, 0x4a, 0x69, 0x12, 0xfa, 0xf3, 0x4e, 0x41, 0x9a, 0x14, 0xc8,\n  0x73, 0x1d, 0x9b, 0xaf, 0xc2, 0x3a, 0x14, 0xf7, 0x69, 0x16, 0x17, 0x80,\n  0x67, 0x8a, 0xc2, 0x71, 0x57, 0x74, 0x10, 0xf9, 0x63, 0x91, 0x97, 0x1d,\n  0xfb, 0x55, 0xe8, 0xcf, 0x4f, 0xaf, 0x2e, 0x38, 0x76, 0x19, 0x68, 0xa6,\n  0xf1, 0x5d, 0xf4, 0x9a, 0x82, 0xed, 0xc4, 0xd8, 0x9c, 0x82, 0xfc, 0x80,\n  0xf9, 0x5f, 0x70, 0xed, 0x40, 0x3b, 0x5f, 0x60, 0xb2, 0x71, 0x67, 0x41,\n  0xdb, 0xe2, 0xaf, 0x40, 0xb3, 0x57, 0xda, 0x0b, 0x34, 0x77, 0x15, 0xe6,\n  0xf3, 0xc2, 0x3d, 0xe4, 0x24, 0xdd, 0x46, 0x47, 0xc9, 0x14, 0xb9, 0x27,\n  0xdb, 0xca, 0xc2, 0x3d, 0xc2, 0xa7, 0xb1, 0x7b, 0xe1, 0x1e, 0x2a, 0x93,\n  0x97, 0xe1, 0xf9, 0xe6, 0xec, 0x73, 0x9a, 0x7d, 0xde, 0xb1, 0xf0, 0x51,\n  0xba, 0x8d, 0xbc, 0x04, 0xcf, 0xb7, 0xe6, 0x7d, 0x4e, 0xa0, 0xfe, 0x24,\n  0x7b, 0x3e, 0x97, 0xf7, 0x79, 0xf7, 0x42, 0x09, 0xbd, 0x0a, 0xec, 0xc3,\n  0x51, 0xe0, 0x59, 0xbe, 0xf7, 0xcb, 0xf0, 0x7c, 0x1a, 0xeb, 0x03, 0xbf,\n  0xf2, 0xbf, 0xbf, 0x84, 0x9e, 0x8f, 0xfd, 0xa3, 0xb7, 0xe5, 0xad, 0x1f,\n  0x87, 0xe7, 0x5f, 0x60, 0xcf, 0xef, 0xcc, 0xf7, 0x7c, 0xe1, 0xaf, 0xf0,\n  0x7c, 0x2f, 0xf9, 0x15, 0x3c, 0xbf, 0x6b, 0x69, 0xfb, 0x70, 0xee, 0x47,\n  0x6c, 0x93, 0xa3, 0x52, 0x14, 0xac, 0x8f, 0x66, 0x72, 0x59, 0xba, 0xb8,\n  0x9a, 0x5a, 0x95, 0x22, 0x3c, 0x66, 0x58, 0xd9, 0xd7, 0x0d, 0x81, 0xf1,\n  0x68, 0xa7, 0x88, 0xf9, 0x62, 0x23, 0xdc, 0x66, 0xd2, 0x30, 0xe3, 0x0f,\n  0xc6, 0x74, 0xe7, 0x7c, 0xb7, 0x4a, 0x18, 0x44, 0x2a, 0x3f, 0xcd, 0x89,\n  0x48, 0xf2, 0x13, 0xb9, 0x84, 0x73, 0x69, 0x4f, 0x6d, 0x6d, 0x6d, 0x73,\n  0x6d, 0x73, 0x22, 0xe6, 0x85, 0x23, 0x7a, 0x4d, 0xb4, 0xc4, 0xe1, 0xaa,\n  0x6a, 0xa8, 0x89, 0x98, 0x0f, 0x2e, 0xc9, 0xc5, 0x27, 0x76, 0xbc, 0x05,\n  0x66, 0x07, 0x97, 0x24, 0xff, 0x84, 0x25, 0x1f, 0xcd, 0x7c, 0x40, 0x87,\n  0x37, 0xec, 0x5e, 0xb5, 0x2f, 0x16, 0xd8, 0x36, 0x76, 0xe8, 0xc8, 0xd6,\n  0xa1, 0xa1, 0xe1, 0x15, 0x5b, 0xcb, 0x46, 0x5b, 0x47, 0xf6, 0xa5, 0x76,\n  0x30, 0xc4, 0x43, 0xed, 0x1d, 0x81, 0x73, 0xd8, 0xdc, 0x59, 0xd7, 0x65,\n  0x3e, 0xe2, 0xf7, 0x54, 0xd4, 0xf4, 0x1f, 0x99, 0x70, 0x0f, 0x6f, 0x5e,\n  0x3f, 0x8e, 0xf9, 0x28, 0x5f, 0x64, 0xf8, 0xb4, 0x6f, 0x01, 0x07, 0xfa,\n  0xc8, 0xbf, 0xa7, 0xdd, 0xa5, 0x01, 0xb0, 0xfc, 0xe3, 0x76, 0x49, 0x96,\n  0x6a, 0x55, 0xc9, 0x61, 0xd7, 0xb9, 0xd0, 0x42, 0x54, 0x2b, 0x95, 0x6d,\n  0xaa, 0x2c, 0xd0, 0x6c, 0x10, 0x66, 0x43, 0xe3, 0x70, 0xc8, 0x76, 0xbb,\n  0x6d, 0x0f, 0xb1, 0xd9, 0x4e, 0x60, 0xee, 0x1c, 0xb2, 0x87, 0x52, 0x73,\n  0x78, 0x77, 0xc7, 0xbb, 0xa9, 0xc6, 0xe2, 0xb9, 0xb1, 0x2e, 0x11, 0x11,\n  0xdf, 0xa6, 0x5a, 0x79, 0x2b, 0x58, 0x2c, 0x7a, 0x14, 0x78, 0xb6, 0xd6,\n  0x1c, 0xf0, 0xb6, 0xb7, 0xbb, 0xbd, 0xb5, 0xa9, 0x21, 0xea, 0xc1, 0xff,\n  0x62, 0x3e, 0xfd, 0x8b, 0xa0, 0x0e, 0x57, 0x6b, 0xc6, 0x53, 0x82, 0x13,\n  0x89, 0x09, 0x4e, 0x29, 0x8b, 0x6e, 0xab, 0x75, 0x72, 0x14, 0x2f, 0x7c,\n  0x28, 0xb5, 0xea, 0x18, 0xb6, 0x16, 0x9b, 0xc5, 0xef, 0x57, 0x3b, 0x2c,\n  0xed, 0x75, 0x4e, 0xfb, 0xd6, 0x22, 0x87, 0xcf, 0xaf, 0xb5, 0x5b, 0xda,\n  0xea, 0x9d, 0xc5, 0x3a, 0xd6, 0xed, 0xf6, 0x0f, 0x70, 0x90, 0x5b, 0xea,\n  0xe4, 0xa8, 0xb6, 0x97, 0x4a, 0x12, 0x42, 0x30, 0xc9, 0xbd, 0x17, 0x68,\n  0x0c, 0x7f, 0xc9, 0xc6, 0x31, 0x6f, 0x6f, 0x7a, 0x6a, 0xef, 0x01, 0x65,\n  0xdf, 0x41, 0x13, 0xbe, 0xe8, 0x8d, 0x8c, 0xef, 0x2b, 0xc8, 0xcb, 0x69,\n  0x77, 0x45, 0x19, 0xf0, 0xbd, 0xb6, 0x08, 0xf8, 0xde, 0x60, 0x93, 0xec,\n  0x0e, 0x9d, 0xef, 0x6d, 0x8c, 0x15, 0x34, 0x1f, 0x03, 0x1d, 0x0e, 0x71,\n  0x69, 0x8d, 0xa9, 0x85, 0x4c, 0x79, 0x25, 0xf4, 0xf4, 0x57, 0xe7, 0xae,\n  0x08, 0xdc, 0x3c, 0x2c, 0x6a, 0x3b, 0xf5, 0x68, 0x7b, 0x53, 0xbd, 0xbc,\n  0x55, 0x2c, 0x16, 0x96, 0xd5, 0x60, 0x51, 0x3d, 0xcc, 0x62, 0xd4, 0xda,\n  0x42, 0x49, 0x77, 0xaa, 0x65, 0x45, 0xeb, 0x8a, 0xfa, 0xba, 0x24, 0x22,\n  0x61, 0xe2, 0xc7, 0xca, 0xa0, 0xdf, 0xe7, 0x29, 0xd1, 0x2c, 0xa4, 0x99,\n  0x36, 0x17, 0x2d, 0xcd, 0x65, 0x55, 0x78, 0x4a, 0xce, 0x01, 0x54, 0xaa,\n  0x39, 0x55, 0x31, 0x23, 0xae, 0xe2, 0xad, 0x56, 0x7d, 0x46, 0xec, 0x8e,\n  0x02, 0xb8, 0xa5, 0x1b, 0x65, 0x85, 0x61, 0x62, 0xad, 0x38, 0xac, 0xe0,\n  0x84, 0xc8, 0x67, 0xbf, 0x92, 0x0b, 0x5f, 0x8a, 0xbe, 0x5d, 0x7f, 0x85,\n  0x3f, 0xae, 0x93, 0xce, 0x82, 0x15, 0x7d, 0x77, 0xba, 0x34, 0x48, 0x2d,\n  0x4a, 0xa8, 0x44, 0x52, 0x2d, 0xc5, 0x54, 0x56, 0x63, 0x4e, 0xc9, 0x2a,\n  0xb5, 0xa0, 0x17, 0xbf, 0x0e, 0x2b, 0xd7, 0x6c, 0x33, 0xf0, 0xbc, 0xac,\n  0x76, 0x4a, 0x1d, 0x56, 0x86, 0x1b, 0x27, 0xd2, 0x9b, 0x6b, 0xd4, 0x00,\n  0x71, 0x72, 0x52, 0x87, 0xe3, 0xb0, 0x03, 0xb8, 0xda, 0x88, 0x49, 0xce,\n  0x55, 0x05, 0xf3, 0x6c, 0x2f, 0xae, 0xb8, 0x94, 0x7c, 0x0e, 0x8e, 0xb8,\n  0x04, 0xfa, 0xd1, 0xda, 0xdc, 0x58, 0x5f, 0x17, 0x43, 0x40, 0x1a, 0x94,\n  0x68, 0x17, 0x48, 0x73, 0x87, 0xdb, 0xcc, 0xb0, 0x3c, 0xb9, 0x20, 0xfc,\n  0x31, 0xbf, 0x19, 0x27, 0xcc, 0x7f, 0xc4, 0x66, 0x15, 0x7c, 0xb2, 0xdb,\n  0x73, 0x92, 0x41, 0xdc, 0x78, 0xa3, 0xe6, 0xd2, 0x04, 0xdb, 0x8a, 0x8b,\n  0xa8, 0x45, 0x66, 0x02, 0x7b, 0x53, 0x4e, 0x16, 0x88, 0xe1, 0x2f, 0xcb,\n  0x8c, 0x5d, 0xea, 0x8f, 0x30, 0xf7, 0xe3, 0x7f, 0xc2, 0x1f, 0x5f, 0x01,\n  0x5d, 0x89, 0x79, 0x64, 0xd2, 0xc0, 0x23, 0xbf, 0xdb, 0x21, 0x29, 0xf6,\n  0x81, 0xe6, 0x52, 0xab, 0xe2, 0x52, 0xea, 0x12, 0xd5, 0x54, 0x21, 0x56,\n  0x5d, 0x6a, 0xeb, 0x1c, 0xf8, 0x13, 0x51, 0xac, 0x07, 0x8b, 0xa9, 0x4b,\n  0x05, 0xbe, 0xb9, 0xc8, 0x41, 0x27, 0xc8, 0x0b, 0xdd, 0x23, 0x12, 0x11,\n  0x17, 0xd9, 0x34, 0x59, 0x60, 0x8b, 0x35, 0xe5, 0xa1, 0x65, 0x5f, 0x3a,\n  0xb1, 0x02, 0xd7, 0x9c, 0x27, 0xb2, 0xf4, 0x73, 0xe9, 0xca, 0x6e, 0xb0,\n  0xc9, 0xbb, 0xd3, 0xdd, 0xe9, 0x15, 0xbd, 0xa9, 0xce, 0xf6, 0x56, 0xe8,\n  0x4f, 0x93, 0xd7, 0x0b, 0xba, 0x32, 0x1e, 0xf7, 0xf9, 0x4a, 0x90, 0x47,\n  0x29, 0x95, 0x71, 0xa8, 0x3b, 0x65, 0x82, 0x54, 0xc2, 0x13, 0x2c, 0x7e,\n  0x4c, 0xeb, 0xe0, 0xee, 0xc8, 0x2c, 0x31, 0x04, 0x48, 0x5f, 0xd2, 0xef,\n  0xe5, 0x19, 0xf9, 0x02, 0x01, 0x4b, 0x8a, 0x2f, 0xfd, 0x40, 0x60, 0x73,\n  0xb9, 0x57, 0xee, 0xb0, 0xb6, 0x34, 0x99, 0x10, 0x97, 0x3a, 0xb7, 0x6f,\n  0x0b, 0x05, 0x94, 0x76, 0x4b, 0x6b, 0xcb, 0xec, 0xc0, 0xa9, 0xa1, 0xd9,\n  0xf4, 0x35, 0x83, 0x67, 0x2f, 0x1a, 0x1d, 0xd2, 0x56, 0x5c, 0x4d, 0xff,\n  0xf6, 0xc8, 0xda, 0xd5, 0x83, 0xa7, 0xde, 0xd2, 0xca, 0x3d, 0x2d, 0x7d,\n  0xae, 0x17, 0x38, 0xf6, 0xd2, 0xce, 0x0b, 0xa6, 0xd5, 0x32, 0x7f, 0x4b,\n  0xbf, 0xf3, 0x99, 0xc7, 0x5d, 0xd6, 0x9f, 0xfd, 0xd6, 0xe6, 0xa2, 0x67,\n  0x69, 0x53, 0xe3, 0x35, 0xd3, 0x63, 0xd4, 0xd5, 0xb0, 0xf6, 0x9a, 0x6d,\n  0x5b, 0x34, 0xcd, 0x05, 0x7a, 0x17, 0xf8, 0x29, 0x5d, 0xc6, 0xf2, 0x0f,\n  0x34, 0x90, 0xeb, 0xd3, 0xee, 0x2a, 0x4a, 0xd5, 0xba, 0x44, 0xd8, 0xef,\n  0x29, 0x72, 0x28, 0x56, 0x85, 0xea, 0x28, 0xe9, 0x31, 0x42, 0x55, 0x04,\n  0x7f, 0x3f, 0x45, 0x14, 0xd0, 0x0f, 0xd2, 0xd5, 0x56, 0x96, 0x3c, 0xce,\n  0xc2, 0xe3, 0xf1, 0xc5, 0xc7, 0x30, 0xcc, 0x5f, 0x94, 0x4b, 0xc5, 0x72,\n  0xee, 0x70, 0x52, 0x1e, 0x91, 0x2f, 0x28, 0xe7, 0xd2, 0xa5, 0xf1, 0x18,\n  0x25, 0xb1, 0x86, 0x38, 0x82, 0x7d, 0x87, 0x7c, 0x5e, 0x97, 0xd3, 0xaa,\n  0x61, 0x1e, 0x02, 0x91, 0x5d, 0xd4, 0xcc, 0xa3, 0x66, 0x09, 0x79, 0x94,\n  0xc3, 0xcb, 0x20, 0xe3, 0x54, 0x30, 0xd5, 0x89, 0xf0, 0x4d, 0x21, 0x8f,\n  0xd2, 0xae, 0xb4, 0x35, 0xcc, 0x36, 0xef, 0xde, 0x55, 0xb7, 0xb5, 0xdc,\n  0x27, 0x75, 0x58, 0x52, 0xf5, 0x0c, 0x01, 0x29, 0xb1, 0x76, 0x4c, 0x1d,\n  0xba, 0x6d, 0x04, 0xa1, 0x9c, 0xd6, 0x59, 0x2a, 0x02, 0xdd, 0x2b, 0x6c,\n  0x4f, 0x3e, 0xa1, 0xf8, 0x03, 0x96, 0x77, 0xce, 0xa8, 0xe1, 0x40, 0x4f,\n  0x9f, 0xed, 0xa7, 0xc0, 0xa5, 0xc9, 0xe9, 0x09, 0xad, 0xc6, 0x3a, 0x71,\n  0x2d, 0xf0, 0xe1, 0x79, 0xe6, 0xbf, 0x15, 0x05, 0x3d, 0xd8, 0x4f, 0xfe,\n  0x3e, 0x5d, 0x12, 0x2e, 0x06, 0xed, 0x17, 0x71, 0x4a, 0x2a, 0x8b, 0xd5,\n  0x35, 0xb6, 0x1f, 0xcd, 0x58, 0x37, 0xa0, 0x9e, 0xa8, 0x4d, 0xa5, 0x98,\n  0x6e, 0x4d, 0xcf, 0xff, 0x64, 0xca, 0xad, 0xe6, 0xa4, 0x36, 0xdb, 0x51,\n  0x1b, 0xee, 0x21, 0x79, 0x6a, 0xb0, 0xfb, 0x2a, 0x87, 0x43, 0x24, 0x13,\n  0x59, 0x5a, 0x6b, 0x2e, 0x5d, 0xd6, 0x0a, 0x07, 0x6d, 0x50, 0x62, 0xfd,\n  0xad, 0xfd, 0xd0, 0xa1, 0x66, 0x8f, 0xa7, 0x36, 0x1e, 0xc7, 0xc5, 0x57,\n  0x04, 0x82, 0x15, 0x4c, 0xe5, 0x00, 0xf2, 0x05, 0x73, 0xf1, 0xd0, 0x31,\n  0x87, 0x41, 0x76, 0xe5, 0xa1, 0x64, 0xb5, 0x1b, 0x77, 0xa4, 0xa0, 0xbc,\n  0x36, 0xbb, 0x6c, 0x62, 0x21, 0x16, 0x39, 0xc6, 0x9d, 0x4a, 0x68, 0xed,\n  0xd0, 0x3e, 0xcc, 0x6c, 0xb9, 0x3e, 0x08, 0xe6, 0x84, 0x43, 0xd7, 0x5f,\n  0xaa, 0x53, 0xbd, 0xbb, 0x6d, 0x65, 0xd5, 0xd8, 0xe4, 0x86, 0xd5, 0xd2,\n  0xd0, 0x1b, 0x97, 0x31, 0x1c, 0x3f, 0x45, 0x1a, 0x9f, 0x88, 0xb5, 0xde,\n  0x7c, 0xcb, 0x4d, 0xb7, 0xb7, 0x54, 0xb9, 0x3b, 0xbd, 0x6b, 0x54, 0xa6,\n  0xc0, 0xe8, 0x04, 0x6d, 0xe9, 0xda, 0xd9, 0xbf, 0xe3, 0xa2, 0x1d, 0xbb,\n  0xdc, 0xfb, 0x0e, 0x33, 0xfd, 0xf5, 0x1f, 0xf0, 0xc7, 0xed, 0xcc, 0x17,\n  0xe7, 0x13, 0x9c, 0x67, 0x3e, 0x8c, 0xe0, 0xb1, 0x54, 0x53, 0x55, 0x6a,\n  0x40, 0xdd, 0x25, 0x4f, 0x05, 0xa9, 0x3c, 0x59, 0x9e, 0xf6, 0xe1, 0xb7,\n  0xff, 0xdc, 0x47, 0xd9, 0xf8, 0x89, 0x3c, 0x4c, 0x43, 0x18, 0x73, 0xce,\n  0x66, 0x4c, 0x9f, 0x73, 0x18, 0x79, 0x5b, 0x5b, 0x88, 0xb7, 0x46, 0xa2,\n  0x16, 0x41, 0x0a, 0x7b, 0x32, 0xf4, 0xad, 0x91, 0x34, 0x46, 0x3d, 0x35,\n  0x35, 0x71, 0x9f, 0xc7, 0x13, 0x75, 0xb0, 0x15, 0x9a, 0x65, 0x24, 0x48,\n  0x93, 0xce, 0x49, 0x23, 0x29, 0x71, 0xce, 0xd6, 0xbc, 0xd9, 0xa9, 0x33,\n  0x0e, 0xb8, 0xc3, 0x00, 0x5a, 0x7a, 0xb2, 0xd8, 0x2d, 0x4e, 0x9d, 0x73,\n  0x45, 0x8e, 0xdf, 0x30, 0x6e, 0x49, 0xd2, 0xab, 0x7b, 0xb3, 0x50, 0x3a,\n  0x11, 0xc6, 0x2c, 0xe5, 0x11, 0x83, 0x3f, 0x88, 0xdb, 0x52, 0x4f, 0xd6,\n  0xa4, 0xc7, 0xfd, 0x54, 0x91, 0x03, 0x54, 0x52, 0x2a, 0x5c, 0x92, 0x45,\n  0xaa, 0xe3, 0x3c, 0x50, 0x8d, 0x41, 0x59, 0x34, 0x4a, 0xad, 0x16, 0x86,\n  0x6e, 0x2a, 0x3e, 0xc9, 0xda, 0xa8, 0xd5, 0x7a, 0xd8, 0x8a, 0x37, 0x7f,\n  0xf5, 0xa4, 0x1e, 0x07, 0x53, 0x03, 0x16, 0x86, 0xdd, 0x55, 0x89, 0x63,\n  0x31, 0xab, 0xe4, 0x5c, 0xff, 0xf8, 0x5c, 0x5d, 0xbc, 0x41, 0x31, 0xcc,\n  0x08, 0x87, 0xbd, 0x76, 0xbc, 0xd5, 0x00, 0x80, 0x31, 0x6b, 0xe2, 0xdf,\n  0x0a, 0xd3, 0x61, 0xed, 0xaa, 0xf1, 0x0a, 0x81, 0x09, 0x73, 0xa5, 0xd0,\n  0xc2, 0x5f, 0xe2, 0x3e, 0xc8, 0x6f, 0x2f, 0xbc, 0x49, 0x7f, 0x05, 0xe3,\n  0xe8, 0x21, 0x07, 0xd2, 0xe7, 0x55, 0xc3, 0x3e, 0x15, 0xa1, 0x9a, 0x25,\n  0x44, 0x55, 0xad, 0x33, 0x27, 0x4b, 0x12, 0xd1, 0x2c, 0xaa, 0x45, 0x53,\n  0x4f, 0x11, 0x55, 0xb2, 0xa8, 0xa0, 0x11, 0x10, 0x99, 0x53, 0xbe, 0x9a,\n  0xc8, 0x98, 0x7a, 0xf1, 0xea, 0x9c, 0x7c, 0x3b, 0x3c, 0x6d, 0x31, 0xbb,\n  0xeb, 0x6f, 0x6b, 0x6d, 0x6e, 0xaa, 0x89, 0x55, 0x86, 0x71, 0xd3, 0xb6,\n  0xaa, 0xa4, 0x87, 0xf6, 0xd8, 0x16, 0x7f, 0x73, 0x4e, 0x24, 0x8d, 0x01,\n  0x77, 0x27, 0x16, 0x67, 0xd3, 0x41, 0xec, 0x5b, 0x3e, 0x60, 0x0d, 0x17,\n  0xc6, 0xf3, 0x3d, 0xeb, 0xab, 0x18, 0x4c, 0x4a, 0xb0, 0xb7, 0xd3, 0x35,\n  0x5c, 0x51, 0x55, 0x0a, 0x83, 0xaf, 0x89, 0xfb, 0x4d, 0xb9, 0x75, 0xfa,\n  0xd7, 0x02, 0x17, 0xca, 0x13, 0xb6, 0x76, 0x25, 0x52, 0xe1, 0xbe, 0xd8,\n  0xee, 0x29, 0x59, 0xa7, 0x43, 0xa5, 0x58, 0x8a, 0x2b, 0x2a, 0xda, 0xd3,\n  0xf6, 0xca, 0x6c, 0x92, 0x9d, 0x68, 0x5d, 0xb9, 0xe6, 0xb6, 0x79, 0x1a,\n  0x9a, 0x56, 0xba, 0xc2, 0x09, 0xcc, 0xb4, 0x43, 0x17, 0x5e, 0x01, 0x5e,\n  0x20, 0xfe, 0x43, 0x27, 0xf2, 0x02, 0xe6, 0x54, 0xad, 0xa0, 0x56, 0xb9,\n  0x1e, 0xdd, 0x05, 0xdb, 0xa8, 0x43, 0x6a, 0xa7, 0xc4, 0x81, 0xb8, 0x30,\n  0xaa, 0xe5, 0xb4, 0x0d, 0xd3, 0xe0, 0x4b, 0x32, 0x65, 0xdb, 0xae, 0xe4,\n  0xb0, 0x4a, 0x07, 0xd1, 0xb0, 0xd1, 0xa1, 0x16, 0xc1, 0x8a, 0xdc, 0xeb,\n  0xd4, 0x79, 0xd0, 0xd2, 0x94, 0x44, 0x4f, 0xab, 0x2a, 0x44, 0x36, 0x08,\n  0x05, 0x7d, 0xde, 0xe2, 0x22, 0xa7, 0xc3, 0xa6, 0x91, 0x4e, 0xda, 0xe9,\n  0xd2, 0xf3, 0x6a, 0x99, 0xe7, 0x3c, 0xc0, 0xf6, 0x61, 0x9e, 0x65, 0xcb,\n  0x3c, 0xdf, 0x09, 0x13, 0xc2, 0x0c, 0xa6, 0xd2, 0x52, 0x34, 0x59, 0x4c,\n  0xbe, 0x62, 0x53, 0x78, 0x5e, 0x2d, 0x6b, 0xb1, 0x3e, 0xef, 0xd6, 0x12,\n  0x6b, 0x4b, 0x0d, 0x83, 0x99, 0xc0, 0x0c, 0x5a, 0x87, 0x28, 0x45, 0x19,\n  0xa0, 0xf4, 0xfd, 0x2c, 0x93, 0xd6, 0x17, 0x39, 0x8a, 0xa7, 0x22, 0xf7,\n  0xb4, 0xb5, 0xe8, 0x30, 0x20, 0x84, 0x92, 0x28, 0xff, 0xe6, 0x04, 0x67,\n  0xc5, 0xf5, 0xe9, 0xb5, 0x20, 0xaf, 0xb6, 0x08, 0xba, 0x49, 0xf8, 0x8b,\n  0x61, 0x61, 0xf3, 0x0c, 0x2e, 0x88, 0x8b, 0x67, 0x91, 0x10, 0x07, 0x84,\n  0x80, 0x68, 0xcb, 0x98, 0x45, 0xdd, 0x6a, 0xb5, 0xcd, 0xf3, 0x24, 0x58,\n  0xf8, 0xe5, 0x69, 0x37, 0xcf, 0x02, 0xab, 0x43, 0x32, 0x7a, 0xc0, 0xd4,\n  0x88, 0x7a, 0xe2, 0xb8, 0x42, 0xd9, 0x37, 0x27, 0xd3, 0x50, 0x30, 0x24,\n  0x31, 0xd5, 0x6d, 0x1e, 0x34, 0xfb, 0xfa, 0x74, 0xbd, 0xdd, 0x6b, 0x17,\n  0x23, 0xf0, 0xd5, 0xf9, 0x8e, 0xd1, 0x58, 0xe6, 0xd2, 0x5b, 0x42, 0x7e,\n  0x31, 0xcc, 0x40, 0x43, 0xe0, 0xa2, 0xcc, 0x7f, 0x4a, 0xa1, 0x55, 0x5f,\n  0x93, 0x64, 0xec, 0xbf, 0xd3, 0xfa, 0x89, 0xe1, 0xbe, 0xef, 0x58, 0x71,\n  0x64, 0x45, 0xb6, 0x8f, 0x0d, 0x0b, 0xdf, 0x5d, 0x38, 0x7b, 0x30, 0x2c,\n  0x83, 0x49, 0xe9, 0x80, 0xee, 0x0f, 0x20, 0x65, 0xb1, 0x0e, 0xf0, 0xae,\n  0xe5, 0x00, 0x3b, 0x4f, 0xff, 0xb8, 0xc0, 0xbd, 0xa5, 0x44, 0xea, 0x59,\n  0x7e, 0x3b, 0xf4, 0x4d, 0x89, 0x20, 0x3a, 0x10, 0x3a, 0xee, 0x78, 0xdc,\n  0x12, 0xcb, 0x2c, 0x8f, 0x41, 0x6a, 0x8a, 0x85, 0x2a, 0x07, 0x59, 0xf8,\n  0x0d, 0xcf, 0xc2, 0xa6, 0x3b, 0x0f, 0x1c, 0x25, 0x6b, 0x83, 0x60, 0x66,\n  0x55, 0x94, 0x07, 0x22, 0xc1, 0x08, 0xba, 0xae, 0x78, 0xfd, 0xb5, 0xdc,\n  0x79, 0x40, 0x0b, 0xe6, 0xf8, 0x0e, 0x24, 0xf1, 0x4b, 0x9b, 0xd7, 0xec,\n  0x33, 0xf0, 0xd6, 0x1f, 0x4e, 0xcd, 0x0c, 0xdc, 0x78, 0x62, 0xec, 0x68,\n  0xfa, 0xe4, 0x05, 0x7b, 0x1f, 0xcf, 0xfc, 0xe2, 0xc7, 0x7a, 0xb4, 0x50,\n  0x28, 0x7d, 0xf7, 0x74, 0xcb, 0xd1, 0x99, 0x4b, 0x4e, 0xf5, 0x1d, 0x59,\n  0x7b, 0xf8, 0x52, 0x75, 0x75, 0xd5, 0xd5, 0x93, 0x99, 0x0f, 0xcf, 0xad,\n  0x9b, 0xd9, 0xb9, 0x73, 0x66, 0xdd, 0x1c, 0xc7, 0x2b, 0x79, 0x44, 0x7e,\n  0x1f, 0xd8, 0xfc, 0xdd, 0x74, 0x86, 0x83, 0xe5, 0x95, 0xfa, 0x41, 0xf7,\n  0x84, 0x60, 0x37, 0x97, 0x5a, 0xea, 0xeb, 0x3c, 0x6e, 0x8b, 0x9d, 0x74,\n  0xb5, 0x52, 0x59, 0xb3, 0x63, 0xa8, 0x1b, 0x3c, 0x53, 0xf3, 0x3f, 0x13,\n  0xda, 0xba, 0x99, 0x50, 0x05, 0x56, 0xbc, 0x74, 0xca, 0x45, 0x9d, 0x9a,\n  0xf3, 0x06, 0xfc, 0x8e, 0x78, 0xe1, 0xb4, 0x55, 0xc6, 0x78, 0xd5, 0x3d,\n  0x2a, 0xff, 0x0e, 0x65, 0xb7, 0x6b, 0xf3, 0x0e, 0x9b, 0xc4, 0x61, 0x68,\n  0xf9, 0x2b, 0xdb, 0x4d, 0xb5, 0x1c, 0x79, 0x6b, 0xd9, 0x10, 0x95, 0x16,\n  0xeb, 0x3a, 0xf6, 0xc0, 0xd2, 0x38, 0xee, 0xc8, 0x66, 0x4a, 0x85, 0x15,\n  0xa6, 0x50, 0x75, 0x69, 0x4d, 0x91, 0xb6, 0x8e, 0xb7, 0xc2, 0x3f, 0x65,\n  0x2f, 0x6d, 0x64, 0x71, 0xfd, 0x42, 0x35, 0xb1, 0x5d, 0x6d, 0x7e, 0x49,\n  0x7d, 0x4c, 0x80, 0x89, 0x5f, 0xcd, 0xba, 0x49, 0x77, 0x67, 0x7b, 0x53,\n  0x43, 0x6d, 0x32, 0xea, 0x8d, 0x79, 0xfc, 0x6e, 0xb7, 0xd7, 0xcf, 0x36,\n  0xe7, 0xee, 0x45, 0xf9, 0xee, 0x82, 0x14, 0x1d, 0x9b, 0x3a, 0xe4, 0x45,\n  0x58, 0xd3, 0x31, 0xb7, 0x6c, 0x3e, 0x6b, 0x6b, 0xf1, 0x6d, 0x25, 0x1e,\n  0xbe, 0x1a, 0xc1, 0x7c, 0xda, 0xfa, 0xa9, 0xe9, 0xa7, 0xcb, 0x46, 0x12,\n  0x1c, 0x80, 0x7a, 0xeb, 0xcf, 0x4b, 0xfc, 0x1c, 0xf9, 0xc5, 0x97, 0x70,\n  0x0f, 0xac, 0x39, 0xee, 0xed, 0xab, 0x33, 0x52, 0xdb, 0x85, 0xbc, 0x74,\n  0x9c, 0x0e, 0x3c, 0xf3, 0x4c, 0xe6, 0x6c, 0x20, 0x60, 0x42, 0xa6, 0xa6,\n  0xdb, 0x32, 0xaf, 0x68, 0x6c, 0x89, 0xaa, 0x88, 0x74, 0x9a, 0xc5, 0x23,\n  0xf6, 0xa2, 0xbf, 0x8f, 0xc7, 0x5d, 0xe4, 0x82, 0x75, 0x89, 0xce, 0x59,\n  0x0a, 0x7e, 0xc9, 0x44, 0xc4, 0x6c, 0xfc, 0x98, 0x26, 0x93, 0x0b, 0x74,\n  0x80, 0x33, 0xfe, 0x25, 0xcd, 0x4b, 0xc0, 0xa0, 0x85, 0xff, 0x35, 0xee,\n  0xdf, 0xe9, 0x67, 0x00, 0xc5, 0xcc, 0x95, 0x10, 0x31, 0x54, 0x34, 0x3f,\n  0x0d, 0xae, 0x59, 0xf7, 0xd6, 0xba, 0x35, 0xf8, 0x07, 0x5d, 0x39, 0xf6,\n  0x30, 0x42, 0x15, 0x3f, 0x3c, 0x76, 0x97, 0xa7, 0xb3, 0xd3, 0x73, 0x17,\n  0x62, 0x15, 0x73, 0x1c, 0x3f, 0x12, 0xc2, 0x77, 0xda, 0x28, 0x77, 0xd5,\n  0x94, 0xa6, 0xf0, 0xde, 0x42, 0xe6, 0xfe, 0xb7, 0x1c, 0xd4, 0x33, 0xeb,\n  0xaf, 0x09, 0xaf, 0x04, 0x72, 0xb7, 0xdb, 0x57, 0x13, 0x73, 0x5b, 0x5d,\n  0x61, 0xf6, 0xce, 0x45, 0x69, 0x98, 0x38, 0x28, 0x33, 0x2d, 0x3b, 0x5e,\n  0x53, 0x1b, 0x68, 0x71, 0x15, 0x75, 0x21, 0x00, 0xd6, 0xf4, 0xf4, 0x2c,\n  0xbc, 0x7e, 0x5b, 0x16, 0xe6, 0x6a, 0x3b, 0xc7, 0x65, 0x46, 0xff, 0x56,\n  0x58, 0x93, 0xe7, 0xc3, 0x1e, 0x15, 0x26, 0x31, 0xd8, 0x30, 0xef, 0x4e,\n  0xdb, 0x4b, 0x41, 0x41, 0x81, 0x3d, 0x2f, 0xe9, 0x66, 0x6d, 0xbd, 0x0d,\n  0xec, 0x3b, 0x07, 0x28, 0x6a, 0xe8, 0xdc, 0x01, 0x17, 0xc3, 0x7b, 0xd4,\n  0x9c, 0xcc, 0xa6, 0x2d, 0x02, 0xab, 0x8c, 0x6d, 0xba, 0x0c, 0x7a, 0x8f,\n  0xe5, 0x97, 0x6a, 0x36, 0x13, 0x33, 0x24, 0x56, 0x5e, 0xc3, 0x49, 0xf3,\n  0x56, 0x98, 0x4b, 0x27, 0x6b, 0xe2, 0x95, 0x15, 0x94, 0xd4, 0x26, 0xe3,\n  0xf5, 0x35, 0xf5, 0x91, 0xea, 0x8a, 0x58, 0x65, 0x4c, 0xcf, 0xb1, 0x67,\n  0xb7, 0x32, 0x68, 0xc8, 0x30, 0x0d, 0x17, 0x8b, 0x84, 0xfa, 0x20, 0x2d,\n  0x6a, 0xd6, 0x84, 0x8b, 0xf1, 0x54, 0x18, 0xba, 0xb5, 0x1b, 0x49, 0x60,\n  0x84, 0x6d, 0x77, 0x24, 0x10, 0xa0, 0x9b, 0xb6, 0x5d, 0xe2, 0xe8, 0xe9,\n  0xb2, 0x5c, 0xba, 0x9b, 0x1b, 0x6d, 0x88, 0xa6, 0x83, 0x76, 0x5c, 0xdb,\n  0xe4, 0x88, 0x4a, 0x63, 0xd6, 0xd1, 0xc1, 0xe1, 0x31, 0x25, 0xf3, 0x13,\n  0x79, 0xb5, 0x14, 0x3d, 0xfe, 0x9e, 0xd1, 0x53, 0xd7, 0x31, 0x63, 0xed,\n  0x79, 0xfa, 0xfb, 0xd1, 0x9f, 0x82, 0xf5, 0x36, 0x39, 0x35, 0x3d, 0xb6,\n  0x21, 0x73, 0xe0, 0x82, 0x0d, 0xdb, 0x76, 0xeb, 0x38, 0x41, 0x7f, 0x95,\n  0x26, 0x99, 0xce, 0xaa, 0x44, 0x0f, 0x01, 0x4c, 0x16, 0x68, 0xd3, 0x24,\n  0x6a, 0x95, 0xe8, 0x01, 0x0b, 0xd3, 0x52, 0x59, 0x08, 0xcc, 0xe3, 0xa8,\n  0xa7, 0x28, 0x29, 0x2f, 0x0b, 0x54, 0x06, 0x2b, 0xb3, 0x59, 0xc6, 0x59,\n  0x9e, 0x3b, 0x3f, 0xf5, 0x8b, 0x5c, 0x81, 0xfa, 0x0c, 0xe9, 0x08, 0x40,\n  0x3e, 0x71, 0x76, 0x46, 0x7c, 0x15, 0x5a, 0x7b, 0xe8, 0xc8, 0xd8, 0xd8,\n  0x1c, 0xa5, 0x5b, 0xc7, 0xc6, 0x5a, 0xf6, 0x8c, 0x0f, 0xf7, 0x67, 0x16,\n  0xd2, 0xda, 0x91, 0xed, 0xab, 0x46, 0xbf, 0x07, 0xbf, 0x46, 0x87, 0x7b,\n  0xb6, 0x75, 0x8e, 0x8d, 0x77, 0x0f, 0x0f, 0x0f, 0xac, 0xca, 0x62, 0x18,\n  0x6d, 0x64, 0xfb, 0x4a, 0x0b, 0xd9, 0x98, 0x5e, 0x17, 0x04, 0x4b, 0x11,\n  0xe4, 0xd5, 0x66, 0x05, 0x11, 0xa2, 0x56, 0xba, 0x06, 0x53, 0x53, 0xda,\n  0x61, 0xb7, 0xa1, 0xd6, 0x03, 0xa8, 0x2d, 0xe4, 0x79, 0xde, 0x61, 0x62,\n  0xb3, 0xf1, 0xec, 0x86, 0x6c, 0x0f, 0x6d, 0x6e, 0xa8, 0x4b, 0x56, 0x57,\n  0x55, 0x56, 0xe0, 0x16, 0xea, 0x13, 0xb1, 0x47, 0x18, 0x98, 0xe2, 0x34,\n  0xf0, 0x81, 0xb0, 0xbf, 0x5d, 0x3a, 0x48, 0x10, 0xb2, 0x99, 0xc3, 0x03,\n  0xe1, 0x6c, 0xf8, 0xa0, 0xf7, 0x35, 0x42, 0xd9, 0xa6, 0x22, 0x3e, 0x06,\n  0x17, 0xd4, 0xd4, 0xe5, 0x68, 0xad, 0x79, 0xdf, 0xab, 0xf1, 0x81, 0x22,\n  0x9a, 0x28, 0x1a, 0x88, 0xbd, 0xfa, 0xbe, 0xc9, 0x40, 0x57, 0xe3, 0x8d,\n  0x99, 0xff, 0x42, 0xbd, 0x9b, 0xf9, 0x0e, 0x62, 0x07, 0x29, 0xf2, 0x68,\n  0xd3, 0x58, 0x78, 0x62, 0xc4, 0xbd, 0xa6, 0x27, 0xb5, 0xae, 0x78, 0x64,\n  0x62, 0xc5, 0xe6, 0x51, 0x59, 0x3e, 0x79, 0xe3, 0x19, 0xc4, 0x12, 0x52,\n  0x60, 0xf7, 0xe3, 0x79, 0xf9, 0x16, 0xfa, 0xd8, 0x5d, 0x57, 0x0d, 0x69,\n  0x23, 0x3f, 0x11, 0x56, 0x72, 0x44, 0x91, 0x34, 0x35, 0x5c, 0x24, 0xc9,\n  0x1a, 0x18, 0x84, 0xb2, 0x1f, 0xfd, 0x92, 0x40, 0xf9, 0x86, 0x58, 0x71,\n  0x11, 0x55, 0x4c, 0xa5, 0x61, 0xaa, 0x18, 0x00, 0x43, 0x98, 0x10, 0x1f,\n  0xd6, 0xd5, 0x7e, 0x74, 0x50, 0xd7, 0xf1, 0xb5, 0x08, 0xcb, 0x7d, 0x86,\n  0x81, 0x10, 0x68, 0x2f, 0x1f, 0x97, 0x75, 0xbd, 0x59, 0x5b, 0x90, 0x96,\n  0xa5, 0xa4, 0x16, 0x91, 0x13, 0x48, 0x6f, 0x90, 0x9a, 0x88, 0xb0, 0x96,\n  0x8e, 0x04, 0x9d, 0x25, 0x05, 0x65, 0x18, 0x10, 0xc9, 0xf6, 0xdb, 0x92,\n  0x6d, 0x98, 0x6c, 0xdf, 0x17, 0xab, 0xa9, 0x4d, 0x22, 0xe4, 0xb6, 0x37,\n  0x7b, 0x9d, 0xc5, 0xdc, 0x32, 0x4c, 0xae, 0x23, 0xa9, 0x94, 0x71, 0x1b,\n  0xe6, 0x35, 0xee, 0xb9, 0x52, 0x9d, 0x9f, 0xd1, 0x2f, 0xb2, 0x6a, 0xa2,\n  0xbd, 0xfd, 0x22, 0xe2, 0x38, 0x92, 0xe0, 0x77, 0x5f, 0xaf, 0xf3, 0xab,\n  0x2d, 0xe9, 0xad, 0x47, 0xf9, 0x25, 0xd6, 0xcd, 0x6b, 0x8e, 0xc4, 0xde,\n  0x93, 0x1e, 0xe1, 0xc1, 0xc6, 0xa3, 0x76, 0xbc, 0xee, 0x7a, 0x2b, 0xf3,\n  0x0b, 0x7e, 0xb1, 0x75, 0xde, 0x53, 0xec, 0x5e, 0xab, 0x4f, 0x1a, 0x04,\n  0x1e, 0xc7, 0x81, 0xc7, 0x2f, 0x0b, 0x40, 0x4a, 0x30, 0xbf, 0xac, 0x11,\n  0x38, 0x82, 0x94, 0x52, 0xc4, 0x01, 0x52, 0x2c, 0xc8, 0x61, 0x51, 0xa8,\n  0x99, 0x0a, 0x05, 0x6f, 0x6b, 0x10, 0x1f, 0xc3, 0xa2, 0xec, 0xe7, 0xa9,\n  0x21, 0x45, 0x0a, 0x64, 0x38, 0x53, 0x68, 0x12, 0x4b, 0xfa, 0x98, 0x9b,\n  0xe6, 0xbd, 0x95, 0xc8, 0x18, 0x46, 0xa8, 0x9d, 0xca, 0x5f, 0x89, 0x21,\n  0x68, 0x61, 0x74, 0x8a, 0x91, 0x71, 0xbd, 0x7c, 0x69, 0x95, 0x2c, 0xb5,\n  0x24, 0x09, 0x8c, 0xd9, 0x9c, 0x2a, 0x98, 0xae, 0x13, 0x23, 0xad, 0x9a,\n  0x1a, 0x6a, 0xda, 0x12, 0x6d, 0xd5, 0x55, 0x98, 0xc3, 0x4f, 0xe4, 0x68,\n  0x07, 0xa1, 0xce, 0x97, 0xa3, 0x9d, 0x7d, 0x03, 0x35, 0xb1, 0x7d, 0xf9,\n  0xdb, 0xac, 0xad, 0x8d, 0x06, 0xdb, 0xe3, 0xf9, 0x2f, 0xb0, 0x7e, 0x7c,\n  0x76, 0xfd, 0xcd, 0x06, 0xd3, 0x97, 0xdc, 0x5d, 0x91, 0xe2, 0x85, 0x3e,\n  0x76, 0x77, 0x95, 0x20, 0x1f, 0x4c, 0x07, 0x19, 0x16, 0x5f, 0xb1, 0xa4,\n  0x5a, 0x8a, 0xa8, 0xac, 0xea, 0x8e, 0xcc, 0xfa, 0xcd, 0x55, 0x03, 0x81,\n  0xad, 0x56, 0xb6, 0x4a, 0xa7, 0x18, 0x58, 0x06, 0x86, 0xff, 0xe6, 0xbb,\n  0xb7, 0x22, 0xe2, 0x5e, 0xa1, 0xce, 0xa0, 0x16, 0xd7, 0x57, 0x7a, 0xad,\n  0x25, 0xb4, 0x0c, 0xfd, 0x3a, 0x16, 0xd5, 0x81, 0xfa, 0x58, 0x58, 0xa4,\n  0x8a, 0x4e, 0x43, 0x76, 0xf3, 0x01, 0x02, 0x18, 0xe1, 0xce, 0x7b, 0x6b,\n  0xc5, 0xf8, 0x75, 0xa5, 0xe0, 0x41, 0x6a, 0xd1, 0x4d, 0x55, 0x63, 0xef,\n  0x77, 0xc4, 0xc8, 0x17, 0xa5, 0x29, 0x1d, 0xce, 0x5c, 0x72, 0x33, 0x8b,\n  0x65, 0xc7, 0xf8, 0x9c, 0x3f, 0xb1, 0x3c, 0x87, 0xfd, 0xe4, 0xe1, 0x74,\n  0x19, 0x18, 0x7f, 0xb6, 0x24, 0xec, 0x36, 0x25, 0x54, 0xb1, 0x56, 0x52,\n  0x4d, 0x29, 0x06, 0xb3, 0xa9, 0x42, 0x80, 0xb6, 0x94, 0x32, 0x13, 0x48,\n  0x22, 0x16, 0xab, 0x64, 0x39, 0x00, 0xc3, 0x02, 0x16, 0xc9, 0x07, 0xf1,\n  0xfc, 0x4f, 0xf6, 0xc0, 0x91, 0x81, 0xad, 0x4a, 0xbb, 0xdd, 0xba, 0x07,\n  0x64, 0xe2, 0xf8, 0xb4, 0x9e, 0xfe, 0xf8, 0x28, 0xc2, 0xb7, 0x74, 0x2d,\n  0xae, 0x24, 0x2e, 0xa9, 0x74, 0xc5, 0x57, 0xa0, 0xe2, 0x5c, 0x3a, 0xd2,\n  0xd6, 0x8a, 0x17, 0xa3, 0xad, 0xfd, 0x6d, 0xfd, 0x0d, 0x75, 0x70, 0xae,\n  0x28, 0x0b, 0x06, 0x10, 0x4f, 0x0f, 0x55, 0x38, 0xa6, 0x40, 0x74, 0xe9,\n  0xfb, 0x50, 0xf7, 0x52, 0xa9, 0xe1, 0x38, 0xc0, 0x29, 0x01, 0x39, 0x86,\n  0x18, 0x1a, 0xdc, 0x93, 0xdd, 0x04, 0x08, 0x0c, 0xf6, 0xa8, 0x37, 0xb5,\n  0xb9, 0xd2, 0xe2, 0x1c, 0x7d, 0xc9, 0x10, 0xa2, 0xbb, 0x2e, 0xb9, 0xe2,\n  0xe4, 0x9a, 0x99, 0xf7, 0x8e, 0xcc, 0x48, 0x54, 0xe9, 0x3a, 0x76, 0xc1,\n  0x25, 0x97, 0x9c, 0x58, 0x3d, 0x39, 0x31, 0xba, 0x7e, 0x72, 0x4a, 0x8a,\n  0xd6, 0xd6, 0x8d, 0x65, 0xf6, 0x7d, 0x59, 0x17, 0xa5, 0xf7, 0x0e, 0x9e,\n  0xb8, 0x38, 0xba, 0xbe, 0x7e, 0xfd, 0xa8, 0xdf, 0xd9, 0x64, 0x5b, 0x7f,\n  0xe7, 0x75, 0xa7, 0x3e, 0x32, 0x79, 0x78, 0xdf, 0xbe, 0x83, 0xb3, 0x7b,\n  0xfc, 0x17, 0xcd, 0xf3, 0xf8, 0xb4, 0x3e, 0xc9, 0x0d, 0x6b, 0x39, 0x4a,\n  0x2e, 0x4d, 0xbb, 0xab, 0x2a, 0x9d, 0x0a, 0x18, 0x2e, 0x88, 0x80, 0xe3,\n  0x17, 0xc8, 0x94, 0x75, 0x2c, 0xf4, 0x9a, 0xa2, 0x0f, 0xa9, 0x82, 0x31,\n  0xcf, 0x60, 0xd0, 0xec, 0xc7, 0x60, 0x9d, 0x0b, 0xa7, 0x79, 0x90, 0x13,\n  0x15, 0x10, 0x14, 0xc9, 0x3c, 0x34, 0xdc, 0xf1, 0xed, 0x70, 0x0e, 0xe5,\n  0x5c, 0x1a, 0x83, 0x9a, 0xa2, 0x24, 0xea, 0xf5, 0xd4, 0xc4, 0x3c, 0x65,\n  0x68, 0x8c, 0x78, 0xdd, 0xa8, 0xcd, 0x06, 0x25, 0xf4, 0x83, 0x0f, 0x2e,\n  0x59, 0x55, 0x1a, 0x88, 0xce, 0x3f, 0xc9, 0x60, 0x56, 0x86, 0x4a, 0x6d,\n  0xff, 0x78, 0xe0, 0xa7, 0x0f, 0xf5, 0x19, 0x3c, 0xa8, 0xfa, 0xca, 0xc0,\n  0x2c, 0x68, 0xa6, 0x13, 0x25, 0x9d, 0x5e, 0x6b, 0x65, 0x95, 0xfd, 0x91,\n  0xdf, 0xbc, 0x72, 0x93, 0xb1, 0x80, 0xde, 0x4e, 0x3d, 0x0e, 0x83, 0x62,\n  0xb9, 0x5a, 0xfa, 0xc8, 0x4f, 0xe1, 0x9f, 0x1e, 0xb2, 0x33, 0x6d, 0x07,\n  0xeb, 0x42, 0xb6, 0x51, 0x6a, 0xce, 0xd2, 0x0a, 0x96, 0x1a, 0x91, 0x4f,\n  0x09, 0x9d, 0xcc, 0xed, 0x5d, 0x92, 0xcd, 0xd2, 0xba, 0xe4, 0x29, 0x47,\n  0x2e, 0x96, 0xb3, 0x41, 0x78, 0x30, 0x0a, 0xe6, 0x91, 0xe8, 0x5d, 0x32,\n  0xb3, 0xee, 0xcf, 0x64, 0xd7, 0x7c, 0x4a, 0x7a, 0xeb, 0xec, 0xba, 0x6c,\n  0xef, 0x24, 0x1d, 0xb7, 0xbe, 0x0f, 0xce, 0x0a, 0x51, 0xd2, 0x4a, 0x6e,\n  0x4e, 0x17, 0xc7, 0x2b, 0x25, 0xbb, 0xac, 0xaf, 0x65, 0xfd, 0x52, 0xac,\n  0x86, 0xd8, 0x61, 0x75, 0xda, 0x71, 0x2d, 0x3b, 0xd8, 0xaa, 0xc4, 0xad,\n  0x58, 0xdb, 0x03, 0x5b, 0x35, 0xda, 0x48, 0x2c, 0x03, 0xb1, 0x58, 0xc5,\n  0x8b, 0xe8, 0x0c, 0x34, 0x7b, 0xeb, 0x1e, 0xbc, 0xd8, 0x38, 0x61, 0xd0,\n  0xb2, 0xb4, 0xc4, 0x4d, 0x8d, 0x75, 0xc9, 0x58, 0xa4, 0x02, 0xce, 0xbf,\n  0x41, 0xbf, 0xd7, 0x53, 0xec, 0x62, 0x2b, 0xb9, 0x95, 0xb6, 0xe6, 0xa4,\n  0x25, 0xc6, 0x21, 0x2c, 0x03, 0x61, 0xcf, 0x6c, 0x6e, 0x1c, 0xb3, 0xec,\n  0x12, 0x83, 0xec, 0xcc, 0x03, 0x64, 0xdf, 0xb9, 0x7d, 0x9b, 0x69, 0x6d,\n  0xcf, 0xe5, 0xc3, 0xb1, 0xdf, 0x79, 0x41, 0x06, 0x27, 0x4e, 0xc8, 0xe2,\n  0x08, 0xbb, 0x2f, 0xbd, 0x2a, 0x5d, 0x14, 0x80, 0x7d, 0x63, 0x31, 0x3b,\n  0xa2, 0x44, 0x83, 0x61, 0x6a, 0x38, 0x4c, 0xab, 0x9e, 0xd9, 0xc0, 0xb2,\n  0x07, 0x83, 0x83, 0x8f, 0x4c, 0x2b, 0xfa, 0x4d, 0x69, 0x62, 0x09, 0x11,\n  0x33, 0x86, 0x05, 0xfc, 0xd2, 0x09, 0x9d, 0x90, 0x81, 0x30, 0xa1, 0x2a,\n  0x43, 0xa3, 0x51, 0xb0, 0x40, 0x5c, 0x93, 0xe6, 0x65, 0x41, 0x47, 0xce,\n  0xa0, 0xe9, 0xf7, 0xf5, 0x41, 0x9b, 0x61, 0xe1, 0x4d, 0x43, 0x9d, 0x35,\n  0xa3, 0xc2, 0xf3, 0x01, 0x0a, 0xfb, 0x84, 0xdf, 0x85, 0xd6, 0x90, 0x0e,\n  0x72, 0x5b, 0xda, 0x17, 0x2d, 0x05, 0x1b, 0xc4, 0xa7, 0x42, 0x7f, 0x8b,\n  0x60, 0xa8, 0x2e, 0x66, 0x84, 0xe8, 0x53, 0x2f, 0xe1, 0x31, 0x8e, 0x0a,\n  0xdc, 0x4e, 0xd0, 0x4b, 0x86, 0xed, 0x91, 0x63, 0x3a, 0xd7, 0xe9, 0x74,\n  0x6c, 0x98, 0x59, 0xd0, 0xb8, 0xa5, 0xb4, 0x98, 0xd9, 0x3e, 0x81, 0x30,\n  0x72, 0x89, 0x8e, 0x64, 0x07, 0xaa, 0xf1, 0xa0, 0xdf, 0x53, 0xe2, 0xb0,\n  0x21, 0xd6, 0x6a, 0x36, 0xa2, 0x29, 0xaf, 0x31, 0xc1, 0xcd, 0x66, 0xc3,\n  0x64, 0xe6, 0x8a, 0x89, 0x1d, 0x94, 0x37, 0xed, 0xcb, 0xb5, 0x28, 0x84,\n  0xe5, 0xcc, 0xed, 0x66, 0xbc, 0xe3, 0xdc, 0x8a, 0xb7, 0x9d, 0x52, 0xf4,\n  0xe6, 0x5b, 0xd6, 0x5c, 0x64, 0x36, 0x2a, 0xb8, 0xf1, 0x2c, 0x5b, 0xd1,\n  0x74, 0x66, 0x17, 0x9c, 0xec, 0xaa, 0x93, 0xaf, 0x57, 0x76, 0xc7, 0x19,\n  0x35, 0xf2, 0xd9, 0x62, 0xe2, 0x0d, 0xc4, 0xd6, 0xa4, 0x7e, 0xb0, 0x20,\n  0x7c, 0xa0, 0x9a, 0x58, 0x3e, 0x5b, 0x99, 0xaa, 0x8b, 0x4b, 0x8d, 0x7c,\n  0xb6, 0x12, 0xb5, 0x50, 0xc9, 0x82, 0x3b, 0x9a, 0xac, 0xc8, 0xfb, 0x79,\n  0x90, 0x93, 0x48, 0x6f, 0x2b, 0xbe, 0x48, 0xd4, 0x2c, 0xa6, 0x61, 0xdb,\n  0x9c, 0x0e, 0xac, 0xa3, 0xd3, 0xb1, 0x44, 0x2f, 0x95, 0x15, 0xf8, 0x8d,\n  0xcb, 0xc3, 0x91, 0x44, 0x41, 0x40, 0xac, 0x8b, 0xd0, 0xa7, 0xfd, 0x4b,\n  0xd6, 0xfd, 0x12, 0xfc, 0x69, 0x93, 0x1e, 0x58, 0x84, 0x3f, 0xfd, 0x63,\n  0x93, 0x4e, 0x08, 0x71, 0xf8, 0x69, 0x86, 0x85, 0xdc, 0xc7, 0xb0, 0x90,\n  0xfb, 0x30, 0xe7, 0x10, 0x0e, 0xbf, 0x5e, 0x91, 0x2c, 0xb4, 0x2e, 0xe6,\n  0x97, 0x15, 0x0b, 0x66, 0xcd, 0x09, 0x83, 0xa8, 0xf0, 0x70, 0x2e, 0x50,\n  0xb4, 0x46, 0x0c, 0xd7, 0x09, 0xe3, 0x72, 0xf6, 0xb8, 0x82, 0x06, 0x7a,\n  0x63, 0xb2, 0x06, 0x13, 0xd4, 0x40, 0xaf, 0xfb, 0x68, 0x9f, 0x96, 0x0b,\n  0x50, 0x6d, 0x64, 0xc5, 0x5e, 0x3c, 0xdd, 0xb9, 0x3e, 0xc8, 0x22, 0x21,\n  0xc8, 0x99, 0x45, 0x89, 0xb2, 0x2b, 0xca, 0x8c, 0x01, 0x79, 0x6a, 0x03,\n  0xfa, 0x0d, 0xa0, 0xc8, 0xaa, 0x2d, 0x45, 0x17, 0x65, 0xcc, 0x4e, 0xf4,\n  0xf9, 0xf6, 0xe8, 0xa3, 0x1c, 0x56, 0x14, 0xd3, 0x05, 0x20, 0x4f, 0xb0,\n  0xcd, 0xef, 0x3c, 0x11, 0x6b, 0x18, 0xb1, 0x9b, 0x9a, 0xc9, 0x2d, 0xb8,\n  0xbb, 0xf3, 0x5c, 0x2b, 0x3e, 0x98, 0xdb, 0x38, 0xec, 0xee, 0x5e, 0xd8,\n  0xdd, 0x63, 0x26, 0x48, 0xb6, 0x84, 0x70, 0xe8, 0x37, 0x6f, 0xd4, 0x06,\n  0x34, 0x9b, 0x79, 0x47, 0x8f, 0x5b, 0x75, 0x60, 0xa4, 0x25, 0x35, 0xcc,\n  0xfb, 0x37, 0x68, 0x82, 0xda, 0x44, 0xa4, 0xaa, 0xbc, 0xcc, 0x48, 0x5c,\n  0xdc, 0x4c, 0x9b, 0x6d, 0x8b, 0x20, 0x95, 0xf3, 0xec, 0xdc, 0x05, 0x31,\n  0x96, 0x7f, 0x65, 0x30, 0xe8, 0x83, 0xf9, 0xe1, 0x96, 0x33, 0x89, 0xaf,\n  0xe9, 0x3c, 0xb9, 0xe2, 0xea, 0xc5, 0xc8, 0xcb, 0x0c, 0xe3, 0x13, 0x64,\n  0xe0, 0x0c, 0x8b, 0x93, 0x61, 0xf9, 0x34, 0x2c, 0x26, 0x5d, 0x48, 0xa8,\n  0xca, 0xf4, 0x9a, 0xa2, 0xdf, 0x76, 0xb1, 0x5b, 0x15, 0x86, 0x47, 0x8e,\n  0xa7, 0x31, 0x61, 0x98, 0x55, 0xd2, 0x4a, 0x6d, 0x91, 0x2e, 0x93, 0x3b,\n  0xbc, 0x95, 0x92, 0x70, 0x9a, 0x97, 0x99, 0x16, 0xdb, 0x23, 0x7a, 0xf9,\n  0xb5, 0xa7, 0x76, 0xbd, 0xc7, 0xea, 0x29, 0x82, 0x55, 0x54, 0xec, 0xd5,\n  0xde, 0xb3, 0xeb, 0xa1, 0x5b, 0x0d, 0x45, 0x26, 0x85, 0x32, 0x8f, 0x05,\n  0xba, 0xda, 0xdc, 0xee, 0xf6, 0x2e, 0x3f, 0xed, 0xcf, 0x34, 0xdf, 0xc8,\n  0x14, 0x19, 0x62, 0x97, 0xf7, 0xd1, 0xbf, 0x30, 0xff, 0xf7, 0x74, 0x7a,\n  0xa0, 0x34, 0xe0, 0xa5, 0x60, 0x3e, 0x3a, 0xa0, 0x87, 0x76, 0xec, 0xe6,\n  0x14, 0x21, 0x16, 0xd9, 0x92, 0xdd, 0x39, 0x35, 0x55, 0xe2, 0x2a, 0x5a,\n  0x77, 0xe5, 0x47, 0xe7, 0x77, 0xdc, 0x3a, 0x3d, 0xec, 0x32, 0x42, 0xce,\n  0xb3, 0xeb, 0xc7, 0xbc, 0x0c, 0xb2, 0xf4, 0xcf, 0x8f, 0xde, 0x91, 0x5d,\n  0x3d, 0xae, 0x3b, 0x3f, 0xb8, 0xef, 0xdb, 0x8f, 0x72, 0x04, 0xd3, 0xb7,\n  0xbf, 0x9b, 0xb5, 0x96, 0x7f, 0xfc, 0x63, 0xea, 0xa1, 0xea, 0x93, 0x4f,\n  0x12, 0x86, 0x67, 0xda, 0xc7, 0xee, 0x4c, 0x03, 0xd8, 0x2f, 0x0a, 0xf2,\n  0x03, 0xb2, 0x43, 0xf4, 0x8e, 0xa1, 0x5b, 0x3e, 0xeb, 0x10, 0x86, 0x40,\n  0xce, 0xf3, 0x7d, 0x43, 0x64, 0x6c, 0x14, 0x1d, 0x0b, 0x90, 0x00, 0xeb,\n  0x17, 0xbf, 0x98, 0x41, 0xf0, 0x52, 0x73, 0xbf, 0x18, 0xa6, 0x29, 0x7d,\n  0x10, 0x13, 0xb0, 0x1b, 0x9d, 0xca, 0x3c, 0x81, 0xa8, 0xa1, 0x52, 0x68,\n  0x55, 0xe6, 0xa2, 0xd3, 0x46, 0x8f, 0x10, 0x29, 0x94, 0xeb, 0xfb, 0x66,\n  0xd8, 0xd3, 0x2e, 0x92, 0x22, 0xa4, 0x81, 0x74, 0x91, 0xbf, 0x88, 0xcc,\n  0x57, 0xa5, 0xd0, 0xad, 0x10, 0xac, 0x63, 0x95, 0xaa, 0xb6, 0x5a, 0xaa,\n  0x61, 0xba, 0x17, 0x0d, 0x31, 0x94, 0x16, 0x3f, 0x90, 0xf8, 0x03, 0xd0,\n  0x6b, 0x5e, 0x76, 0xc6, 0x94, 0x89, 0x4d, 0x95, 0x6d, 0x07, 0x88, 0x66,\n  0x47, 0x87, 0xdf, 0xf3, 0xb3, 0x71, 0x9c, 0x0e, 0xab, 0x84, 0x59, 0x23,\n  0xf0, 0x7b, 0xda, 0x61, 0xaa, 0x03, 0x27, 0xb5, 0x10, 0xd5, 0x66, 0xb5,\n  0xa9, 0xd6, 0x53, 0xcb, 0xd4, 0x63, 0xe8, 0x33, 0x7a, 0x35, 0x74, 0xca,\n  0x38, 0x57, 0x0d, 0xe6, 0x93, 0xe1, 0x30, 0xa0, 0x3e, 0x10, 0x6c, 0x2f,\n  0x5d, 0xd5, 0xd4, 0x48, 0x49, 0x7b, 0x6b, 0x63, 0x57, 0x53, 0x57, 0x22,\n  0x1e, 0xa9, 0x66, 0x47, 0xa7, 0x62, 0x87, 0xcd, 0xa2, 0x60, 0x5a, 0x9a,\n  0xec, 0xed, 0x45, 0x16, 0xb9, 0xa6, 0xbb, 0x3b, 0x37, 0xb2, 0xc0, 0xdd,\n  0x61, 0xca, 0xe9, 0xc2, 0xe2, 0xb7, 0x58, 0xa2, 0x1a, 0xa9, 0xb9, 0x2d,\n  0x5d, 0xe1, 0x56, 0x62, 0xd3, 0xc3, 0x13, 0xbb, 0xaf, 0xbe, 0x6e, 0x7b,\n  0x5f, 0xaa, 0x7e, 0x2a, 0x52, 0x1e, 0xdb, 0xdd, 0xb9, 0x77, 0x57, 0x63,\n  0x79, 0xa9, 0xb3, 0x5c, 0xb3, 0xc7, 0x32, 0xff, 0x30, 0xbc, 0x6d, 0xe6,\n  0xbc, 0xe9, 0xee, 0xef, 0x0c, 0x4c, 0xae, 0x9c, 0x6a, 0xac, 0x9f, 0xde,\n  0x80, 0x41, 0xda, 0xd5, 0xab, 0x79, 0x90, 0xf6, 0x96, 0x5d, 0x99, 0xe7,\n  0x6f, 0x14, 0x99, 0xc0, 0xa9, 0xcc, 0x83, 0xb3, 0x3b, 0x9a, 0xea, 0xc5,\n  0xf9, 0xf5, 0xab, 0x2c, 0x56, 0x36, 0x45, 0xde, 0x97, 0xf6, 0xd6, 0xd8,\n  0x60, 0xfb, 0x8d, 0xc2, 0xd9, 0xb5, 0x0c, 0x84, 0x18, 0x71, 0x0e, 0xf4,\n  0x2d, 0xb8, 0x1a, 0xcf, 0x44, 0x8a, 0x65, 0x3f, 0x03, 0xfb, 0x92, 0x18,\n  0x10, 0x99, 0x4d, 0x65, 0x27, 0x54, 0xab, 0x7e, 0xd0, 0x8c, 0xeb, 0x24,\n  0xec, 0x2e, 0xd6, 0x00, 0x05, 0xcb, 0x25, 0x83, 0x8d, 0xb7, 0x1e, 0xa6,\n  0xb2, 0xad, 0xa5, 0x2e, 0x55, 0x9f, 0xaa, 0xaa, 0x08, 0x05, 0x4a, 0x40,\n  0xc9, 0xf0, 0x28, 0x5b, 0x7b, 0xee, 0xc9, 0xb2, 0xdb, 0xc8, 0x8e, 0x9e,\n  0x13, 0x4d, 0x8d, 0xdf, 0xb1, 0x0b, 0x9e, 0x2e, 0x95, 0xa2, 0xd1, 0x90,\n  0xdb, 0xea, 0x51, 0x04, 0x4f, 0xbc, 0xc0, 0xb4, 0x84, 0x6d, 0xe9, 0x11,\n  0x73, 0x24, 0xb3, 0xab, 0xaa, 0x54, 0xa1, 0xd7, 0x0a, 0x8e, 0x0c, 0x4c,\n  0x76, 0x2b, 0x35, 0xc9, 0x45, 0xc7, 0x4c, 0x71, 0xce, 0xba, 0x84, 0xf9,\n  0x48, 0x0c, 0x90, 0x0f, 0xa7, 0x83, 0x55, 0x14, 0x18, 0x0a, 0x0b, 0xc7,\n  0x0f, 0x12, 0xa6, 0x35, 0xc1, 0x9e, 0xd9, 0x4c, 0x41, 0x0e, 0x8c, 0x93,\n  0xa6, 0xf8, 0x7a, 0xc6, 0xb4, 0xae, 0x08, 0x2d, 0x31, 0xb2, 0xdf, 0x1d,\n  0xe7, 0x17, 0xf1, 0x06, 0x24, 0x79, 0x1d, 0x46, 0x3a, 0x4b, 0xb2, 0x72,\n  0xf0, 0x9c, 0xb4, 0xc0, 0xaf, 0xf6, 0x36, 0x4a, 0x7a, 0xbb, 0xdb, 0x06,\n  0xda, 0x07, 0x1a, 0xea, 0xe2, 0xd1, 0x8a, 0x72, 0xaf, 0xdb, 0xe5, 0x40,\n  0x0b, 0xd5, 0x6e, 0xe0, 0x0b, 0xe7, 0xc7, 0x1b, 0x34, 0xa3, 0x0d, 0xe6,\n  0xca, 0x94, 0x01, 0x93, 0xd5, 0x82, 0xd9, 0xe4, 0x17, 0x21, 0x0f, 0x5e,\n  0xe6, 0xad, 0x41, 0x24, 0xcd, 0x40, 0xa9, 0xc8, 0x38, 0x9f, 0xf9, 0xa9,\n  0x0e, 0x91, 0x55, 0x31, 0x31, 0xb4, 0x32, 0x17, 0x82, 0x70, 0xe6, 0x56,\n  0x86, 0xaa, 0x59, 0x56, 0x7d, 0x76, 0x48, 0x64, 0x9e, 0xcf, 0xc5, 0x21,\n  0xe4, 0xf2, 0xb5, 0x86, 0xe5, 0x7a, 0x69, 0x20, 0x5b, 0xd2, 0x1b, 0xc1,\n  0x3a, 0x91, 0x62, 0x20, 0x5e, 0x08, 0x68, 0x1d, 0x66, 0xe2, 0x05, 0x6b,\n  0x0a, 0x2d, 0xd4, 0x03, 0x42, 0x78, 0x0c, 0x36, 0x88, 0xc0, 0x1c, 0x21,\n  0x36, 0x78, 0x1f, 0x51, 0x57, 0x5b, 0xd3, 0x90, 0x68, 0x40, 0xe0, 0x0b,\n  0x4f, 0x49, 0x91, 0xcb, 0xa6, 0xe1, 0x6d, 0x84, 0x3d, 0x0b, 0xc1, 0xcd,\n  0xbd, 0xc6, 0xfc, 0xba, 0x77, 0x59, 0xae, 0xd0, 0xa8, 0x32, 0xbf, 0xde,\n  0xa4, 0xbd, 0x53, 0x97, 0x0c, 0xad, 0x38, 0x3c, 0x36, 0xb2, 0x2f, 0xa5,\n  0xbb, 0x95, 0x65, 0x65, 0xa5, 0x61, 0x6a, 0xe5, 0x84, 0x46, 0xdd, 0x74,\n  0xd0, 0x3e, 0x78, 0xc5, 0xdc, 0xd6, 0xab, 0x87, 0xfb, 0x8f, 0x4c, 0xa4,\n  0xd0, 0xab, 0xec, 0x7f, 0x19, 0x72, 0x32, 0x68, 0xa3, 0xbf, 0x5e, 0x3f,\n  0x3e, 0xbc, 0x99, 0xdb, 0x26, 0x0d, 0x30, 0xb6, 0x08, 0xcb, 0xe3, 0xb7,\n  0x33, 0xbd, 0x2d, 0x08, 0x23, 0x0b, 0x81, 0x84, 0xb8, 0x60, 0x54, 0x0d,\n  0x54, 0xb5, 0xc0, 0x1e, 0xa5, 0xb6, 0x83, 0x42, 0xeb, 0x00, 0xad, 0xa1,\n  0x4d, 0x89, 0x1b, 0x05, 0xd0, 0x22, 0x56, 0xd4, 0x22, 0x46, 0x1a, 0xb2,\n  0x13, 0x46, 0x8e, 0x9b, 0xe3, 0x08, 0xd4, 0xde, 0xda, 0x5c, 0x97, 0x8c,\n  0x47, 0xf1, 0xd4, 0xec, 0xf7, 0xc2, 0xa2, 0x48, 0xd1, 0x94, 0x4d, 0xd7,\n  0x19, 0x8b, 0x30, 0x60, 0xcd, 0xb0, 0x36, 0x26, 0x28, 0x58, 0xd3, 0xb8,\n  0xe9, 0x2f, 0x61, 0x44, 0xbd, 0x27, 0x2e, 0x8a, 0x74, 0x55, 0x37, 0x75,\n  0x9f, 0xd8, 0xde, 0xb7, 0xb1, 0x36, 0x12, 0x19, 0x69, 0xb9, 0x6c, 0xe3,\n  0x68, 0xcf, 0xc4, 0x47, 0x36, 0xf4, 0xf7, 0x6c, 0x8e, 0x88, 0x81, 0x7f,\n  0x07, 0x87, 0x35, 0xb7, 0xba, 0xb6, 0xa3, 0xca, 0x66, 0x29, 0x5a, 0xd1,\n  0x36, 0x3c, 0xe9, 0xf3, 0x8c, 0x16, 0xfb, 0xa6, 0x1a, 0x13, 0xe3, 0x3b,\n  0xda, 0x6a, 0xcb, 0x4a, 0xee, 0xd7, 0x01, 0x04, 0x30, 0xce, 0xab, 0x8f,\n  0xc5, 0xd5, 0xb3, 0xf1, 0xea, 0xfa, 0x39, 0x42, 0x25, 0xb6, 0x1f, 0xc3,\n  0x98, 0x29, 0x8c, 0x57, 0x15, 0xe3, 0xe5, 0xf1, 0xf5, 0xd9, 0xf1, 0x9a,\n  0xb5, 0xa6, 0x8e, 0xfd, 0xca, 0x30, 0x61, 0x6a, 0xc3, 0x65, 0x98, 0xf3,\n  0xca, 0xe5, 0xe0, 0xb9, 0x03, 0xc5, 0x17, 0xd8, 0x94, 0x6e, 0x77, 0xb1,\n  0x50, 0xfb, 0xc5, 0xd1, 0xbf, 0x9a, 0x9f, 0x83, 0x4b, 0x45, 0x4d, 0x5f,\n  0x1d, 0xef, 0x6c, 0x4b, 0xb3, 0xb0, 0xb0, 0xbb, 0xc7, 0xfb, 0x46, 0x36,\n  0xae, 0x5c, 0xd1, 0xb8, 0xba, 0xb6, 0x6a, 0xd3, 0x81, 0x1d, 0x47, 0xba,\n  0x5a, 0xaa, 0xbb, 0x22, 0x47, 0x4f, 0xf6, 0xb6, 0x64, 0x47, 0xfb, 0x40,\n  0x49, 0x59, 0x5d, 0xfb, 0xb6, 0xf1, 0x9a, 0xa6, 0x44, 0xc2, 0xed, 0x1e,\n  0xad, 0x99, 0x18, 0x6e, 0xeb, 0x75, 0x29, 0xb6, 0xea, 0xce, 0xba, 0xd5,\n  0xdb, 0x6d, 0x03, 0x59, 0x3c, 0x09, 0x09, 0x6d, 0x4f, 0xe9, 0x1f, 0x60,\n  0xbc, 0x09, 0xd2, 0x84, 0x23, 0x46, 0xcb, 0xda, 0xcb, 0x46, 0xab, 0x59,\n  0xc1, 0x02, 0xc3, 0x40, 0x32, 0xd5, 0x82, 0xe9, 0xf8, 0x88, 0x55, 0x93,\n  0xac, 0x07, 0x60, 0xc3, 0x80, 0x02, 0xd8, 0x20, 0x44, 0xa6, 0xc4, 0x13,\n  0xec, 0x56, 0x4d, 0x9f, 0xdb, 0xda, 0x24, 0xc8, 0x4b, 0x7d, 0xb2, 0xa9,\n  0xb6, 0x09, 0xbf, 0xb5, 0xa2, 0x6d, 0xc5, 0x8c, 0xe8, 0x04, 0x4d, 0xe8,\n  0x17, 0x6a, 0xee, 0x7c, 0xb9, 0x3b, 0x30, 0x9c, 0x2f, 0x67, 0xf1, 0xe2,\n  0xe5, 0xbc, 0x74, 0xa8, 0x2d, 0x5d, 0x74, 0xd5, 0xae, 0xe1, 0xf3, 0x52,\n  0xf4, 0xa8, 0xe1, 0x1a, 0xb9, 0xe6, 0x3d, 0xab, 0xa5, 0x35, 0xfa, 0x5e,\n  0xf0, 0x41, 0x10, 0xe4, 0xcc, 0xeb, 0x74, 0x10, 0x46, 0x4b, 0x7d, 0x07,\n  0x4f, 0xea, 0x82, 0x3c, 0xed, 0x71, 0xf7, 0x5f, 0xbc, 0x39, 0x73, 0x9f,\n  0xbe, 0x13, 0x28, 0xba, 0x2c, 0x4b, 0x64, 0x2d, 0xcc, 0xed, 0x0a, 0x86,\n  0x75, 0x5b, 0x45, 0x7e, 0x9e, 0xb6, 0xfb, 0xa9, 0x6c, 0x09, 0x80, 0x34,\n  0xe3, 0xed, 0x80, 0x9d, 0x5b, 0x99, 0xaa, 0x45, 0xc5, 0x43, 0x82, 0x8c,\n  0x17, 0x01, 0xe7, 0x9b, 0x80, 0x37, 0xd1, 0xf1, 0xe6, 0x88, 0x7e, 0x9a,\n  0xe0, 0x39, 0x66, 0x0b, 0x52, 0x1f, 0x5b, 0x4c, 0xdd, 0xf4, 0x3f, 0x68,\n  0x1b, 0x6f, 0xa1, 0x39, 0x21, 0x83, 0xf8, 0x54, 0xd1, 0x92, 0xe5, 0x35,\n  0xcc, 0x64, 0x0c, 0x39, 0xce, 0xe9, 0xa4, 0xc4, 0x59, 0xe5, 0xac, 0xaa,\n  0xac, 0x28, 0x0b, 0x21, 0x5a, 0x14, 0x47, 0xba, 0xb5, 0x19, 0x01, 0xbd,\n  0xe2, 0x5e, 0xc9, 0xbc, 0xd9, 0x32, 0x35, 0x11, 0x73, 0xbf, 0xcf, 0x57,\n  0x55, 0xe5, 0x0b, 0x54, 0x56, 0x0e, 0x35, 0x66, 0xf5, 0x42, 0x4a, 0xfa,\n  0x25, 0x02, 0xdb, 0x22, 0xc0, 0xed, 0x77, 0x33, 0x6d, 0x37, 0x1a, 0xda,\n  0x60, 0xa5, 0x88, 0x6b, 0xc3, 0x75, 0xf1, 0x69, 0x96, 0x77, 0x70, 0x32,\n  0x3d, 0x96, 0xa4, 0x16, 0x92, 0x28, 0x93, 0x14, 0xb0, 0x00, 0x29, 0x42,\n  0x9d, 0x53, 0x30, 0xba, 0x24, 0xcb, 0x14, 0x4f, 0x82, 0xb8, 0xdf, 0x8c,\n  0x97, 0xa2, 0x28, 0xd9, 0x85, 0x1f, 0x8f, 0x62, 0x2e, 0x42, 0x06, 0x5f,\n  0x5d, 0x47, 0xeb, 0x0c, 0x9c, 0x14, 0xdf, 0xe2, 0x6f, 0xeb, 0x31, 0xd3,\n  0xd2, 0xd0, 0xcd, 0x86, 0x47, 0xc6, 0x2e, 0x5a, 0x39, 0x74, 0x6c, 0xac,\n  0xa4, 0xdc, 0x95, 0xed, 0x72, 0x78, 0x55, 0xfd, 0xba, 0xa9, 0xb5, 0x33,\n  0xe1, 0xa1, 0x50, 0x79, 0x68, 0xad, 0x14, 0xe5, 0x30, 0xc7, 0x92, 0xd4,\n  0x63, 0xf4, 0xfd, 0x1e, 0x97, 0xe7, 0x82, 0xf3, 0xf6, 0x1c, 0x28, 0x72,\n  0x4e, 0x38, 0xdd, 0xfc, 0xcc, 0xd1, 0x47, 0xab, 0x60, 0xaf, 0xab, 0x25,\n  0x17, 0xf1, 0x63, 0x66, 0x25, 0x9e, 0xb3, 0x02, 0xd0, 0xf7, 0x20, 0xfb,\n  0xbc, 0xce, 0x77, 0xb9, 0x0a, 0xce, 0xf0, 0xec, 0x41, 0x8b, 0x81, 0x19,\n  0xe9, 0xf6, 0x4f, 0x39, 0x42, 0xb3, 0x42, 0x63, 0x16, 0x63, 0x66, 0xf6,\n  0x9b, 0x9e, 0x32, 0x3c, 0x98, 0x68, 0x35, 0xde, 0x97, 0x16, 0x17, 0x81,\n  0xe8, 0x8b, 0xbc, 0x1a, 0xe6, 0x63, 0x05, 0x4b, 0xa2, 0x91, 0x6f, 0xac,\n  0x39, 0x07, 0x8a, 0x68, 0x4f, 0x24, 0x3b, 0xd0, 0x25, 0x87, 0x89, 0xf1,\n  0x81, 0xf1, 0x2a, 0x29, 0x65, 0x8c, 0xf3, 0xfd, 0x58, 0x48, 0xbf, 0xcc,\n  0x8f, 0x12, 0x98, 0x5d, 0x1e, 0xd6, 0xf4, 0xa7, 0x60, 0xde, 0x62, 0x98,\n  0x73, 0x11, 0x0d, 0x9b, 0x22, 0x34, 0x8a, 0x6d, 0x94, 0xca, 0x3c, 0xc7,\n  0x4b, 0x39, 0x16, 0xa8, 0x58, 0xa0, 0xf0, 0x02, 0x71, 0x92, 0xc6, 0x9c,\n  0xbe, 0x12, 0x95, 0xce, 0x87, 0xa5, 0x8e, 0x96, 0xb2, 0xca, 0x52, 0xc1,\n  0x28, 0x3a, 0x88, 0x51, 0x82, 0xa0, 0xdf, 0x05, 0x51, 0x4f, 0xe5, 0x52,\n  0x11, 0x86, 0x84, 0xa5, 0xaa, 0xfa, 0x49, 0x74, 0x2e, 0x5d, 0x02, 0x9d,\n  0x88, 0x91, 0x58, 0xd4, 0x1b, 0xf7, 0xd6, 0xc4, 0xdc, 0x2c, 0x74, 0x70,\n  0xa9, 0x10, 0xea, 0xd6, 0x21, 0x3a, 0x45, 0xf3, 0x28, 0x66, 0xbf, 0x49,\n  0x1a, 0x6b, 0x5c, 0x4a, 0xd9, 0x8e, 0xce, 0x3d, 0x7b, 0xe7, 0xde, 0x3b,\n  0x37, 0x82, 0xf0, 0xc7, 0x26, 0x79, 0x1c, 0xab, 0x4f, 0xee, 0x3c, 0x9f,\n  0xce, 0x67, 0x1e, 0x38, 0x75, 0xde, 0x2e, 0x1a, 0x34, 0x64, 0x13, 0x63,\n  0x73, 0x6b, 0xc9, 0x5c, 0x7a, 0x0b, 0x6a, 0xb0, 0x62, 0x38, 0xea, 0xa3,\n  0xbe, 0xae, 0x04, 0x0d, 0x56, 0x03, 0xfa, 0x3a, 0x01, 0xfa, 0x59, 0xc5,\n  0x14, 0xbe, 0x88, 0xfd, 0x73, 0xd0, 0xb4, 0x3f, 0xe9, 0xb1, 0x85, 0x66,\n  0x7d, 0x8d, 0xe8, 0x6b, 0x01, 0xbf, 0x01, 0xd6, 0x09, 0x53, 0xb8, 0x58,\n  0x5f, 0x8b, 0x58, 0xdd, 0x88, 0x29, 0x8c, 0x77, 0xa9, 0x8e, 0x9e, 0x9a,\n  0x1e, 0xfc, 0x64, 0xe6, 0x6d, 0x7a, 0xf1, 0xa7, 0xf6, 0xef, 0x38, 0x7a,\n  0x32, 0x9c, 0x0a, 0x66, 0x75, 0xf3, 0x3f, 0x96, 0x94, 0x35, 0x77, 0xb6,\n  0xd7, 0x0d, 0xdd, 0x31, 0x31, 0x76, 0xab, 0xbc, 0x71, 0x74, 0xcd, 0x7e,\n  0x55, 0x19, 0xca, 0xaa, 0x64, 0xc4, 0x90, 0x66, 0xf1, 0x3a, 0x18, 0xff,\n  0xe1, 0x5b, 0x36, 0x16, 0x27, 0xc6, 0xe2, 0x36, 0x46, 0x0b, 0xc6, 0x0a,\n  0x54, 0xc1, 0xe4, 0x0e, 0xb2, 0x76, 0x82, 0xcb, 0xb6, 0x73, 0x3e, 0xc6,\n  0x40, 0x90, 0x87, 0x96, 0x8d, 0x47, 0x61, 0xb1, 0x38, 0xd6, 0xf2, 0x65,\n  0xe2, 0x2d, 0xaa, 0xc8, 0x19, 0xd6, 0xce, 0xc4, 0xb2, 0x98, 0x3a, 0xf7,\n  0xb2, 0xd8, 0x8e, 0xca, 0x73, 0xc7, 0xf4, 0x28, 0xd5, 0x85, 0x63, 0xa7,\n  0xc8, 0xdd, 0x3c, 0xd6, 0x44, 0x89, 0x17, 0x6c, 0x47, 0x83, 0xfe, 0xdc,\n  0x8b, 0xf8, 0x3d, 0x4a, 0x72, 0x99, 0x18, 0x2c, 0x1d, 0x9b, 0xa7, 0x70,\n  0x1c, 0x62, 0x10, 0xda, 0x79, 0x94, 0xd1, 0xd4, 0x9d, 0x9b, 0xc6, 0x52,\n  0x30, 0x1e, 0x65, 0xe1, 0xdb, 0x6c, 0xec, 0xd8, 0x9f, 0x1d, 0x85, 0xe3,\n  0xb4, 0x80, 0xe6, 0x19, 0x8c, 0x23, 0x51, 0x1a, 0x0b, 0xc7, 0x2a, 0x92,\n  0x07, 0xc9, 0x6d, 0x48, 0x63, 0xd9, 0xb7, 0x2c, 0x56, 0x50, 0x31, 0xeb,\n  0xf3, 0xae, 0xe5, 0x62, 0x5f, 0x78, 0x3c, 0x93, 0x52, 0x38, 0xc6, 0x30,\n  0x05, 0x34, 0x3c, 0x16, 0xa7, 0x60, 0xac, 0xe2, 0xc2, 0x1f, 0x61, 0xbe,\n  0x76, 0xb2, 0x76, 0xda, 0x96, 0x8d, 0xb3, 0x79, 0x80, 0xd1, 0xb4, 0x2f,\n  0xdb, 0xe7, 0xf3, 0xd8, 0xbb, 0x3a, 0xce, 0x1d, 0x3b, 0xa5, 0x74, 0x16,\n  0xe4, 0x61, 0x8c, 0xc5, 0xd9, 0x20, 0x0f, 0xbb, 0x0b, 0xd2, 0x44, 0x80,\n  0x86, 0xe1, 0x81, 0x28, 0x43, 0xcb, 0x8d, 0x8b, 0x7c, 0x95, 0x61, 0x7d,\n  0xac, 0x5a, 0x0e, 0xb7, 0x89, 0xc7, 0x45, 0xc9, 0x57, 0x2e, 0x23, 0x87,\n  0xa5, 0xf4, 0x16, 0x36, 0xae, 0xc2, 0x31, 0x73, 0x3e, 0xa0, 0x39, 0xc9,\n  0x68, 0x26, 0x96, 0x89, 0x8b, 0x2a, 0xa7, 0x33, 0x8c, 0xe6, 0xed, 0xe5,\n  0x62, 0xa7, 0xe8, 0x0e, 0x36, 0xae, 0xc9, 0x73, 0xc7, 0x4e, 0x29, 0x6b,\n  0x96, 0x89, 0xd3, 0xaa, 0xa2, 0x21, 0x16, 0x5f, 0xb5, 0xb3, 0x30, 0x0d,\n  0x8b, 0x55, 0xc2, 0x76, 0x66, 0x96, 0xa1, 0x79, 0x45, 0xac, 0xd3, 0x75,\n  0x05, 0xc7, 0x6e, 0x83, 0x76, 0x9a, 0x19, 0xcd, 0xfa, 0x65, 0xe7, 0x7d,\n  0x9e, 0xc5, 0x69, 0x5d, 0x5f, 0x70, 0x4e, 0x31, 0x87, 0xe4, 0x26, 0xf9,\n  0x2e, 0x29, 0xc1, 0x62, 0xae, 0x31, 0xdf, 0xfb, 0xef, 0x59, 0x8e, 0x72,\n  0x99, 0x66, 0x73, 0x94, 0x6f, 0xe6, 0x71, 0x31, 0x40, 0x83, 0x77, 0x5a,\n  0x48, 0xf3, 0x57, 0x5e, 0x77, 0x61, 0x9d, 0xb4, 0x49, 0x7a, 0x92, 0xd7,\n  0x25, 0x9a, 0xe3, 0x1b, 0xd2, 0x7e, 0x41, 0xbf, 0xce, 0x4c, 0x0f, 0xe5,\n  0x17, 0x0a, 0xfa, 0x23, 0x59, 0x7a, 0x8a, 0x88, 0x42, 0xa7, 0x19, 0xa2,\n  0x90, 0xac, 0x23, 0x0a, 0xb1, 0xba, 0x17, 0x66, 0xeb, 0x32, 0x9a, 0x5b,\n  0xce, 0x16, 0x01, 0x8d, 0x04, 0x34, 0x45, 0x82, 0x66, 0x00, 0xce, 0xde,\n  0x73, 0xf2, 0xe7, 0x44, 0x0e, 0xc3, 0x24, 0xb9, 0x1c, 0xac, 0x0a, 0xcc,\n  0xaf, 0x7e, 0x92, 0x86, 0x58, 0xdf, 0x25, 0x53, 0xdf, 0x31, 0xee, 0xea,\n  0x9b, 0x52, 0x86, 0xe7, 0xbc, 0x47, 0x5a, 0xf2, 0x0f, 0x2c, 0xef, 0xe1,\n  0x49, 0xf2, 0x65, 0x63, 0xfc, 0x1f, 0x63, 0xe3, 0x4f, 0xf2, 0xf1, 0xd3,\n  0x92, 0x3c, 0x6d, 0xbc, 0x29, 0x79, 0x58, 0x9f, 0xc6, 0xc4, 0xf8, 0x1f,\n  0x36, 0xc6, 0xff, 0x31, 0x36, 0x9e, 0xa4, 0x18, 0xe7, 0x29, 0x41, 0xbf,\n  0xce, 0x4c, 0x0f, 0xe5, 0x6b, 0x8d, 0xf1, 0x1b, 0xf4, 0x6c, 0x6c, 0x0f,\n  0xb0, 0xf1, 0x4b, 0xa6, 0xf1, 0x77, 0x03, 0x8d, 0x51, 0x97, 0xd1, 0x5c,\n  0x9c, 0x4b, 0x03, 0xc6, 0xe2, 0x1e, 0x18, 0x3f, 0xb4, 0x03, 0xd6, 0x78,\n  0x12, 0x3d, 0x9b, 0x2a, 0x8a, 0x55, 0x19, 0xe1, 0xec, 0x59, 0x8e, 0x2e,\n  0xf1, 0xe9, 0xed, 0x50, 0xf6, 0xbe, 0xd3, 0x0c, 0x33, 0x1b, 0x69, 0x8c,\n  0x74, 0xc5, 0xa3, 0x98, 0x27, 0xcd, 0xe2, 0xcb, 0x46, 0xfd, 0x63, 0xca,\n  0xdb, 0xee, 0x28, 0x4f, 0x11, 0xc7, 0x13, 0x08, 0x07, 0x02, 0x5e, 0x9e,\n  0x2a, 0xae, 0x9a, 0x7e, 0x65, 0x72, 0xb2, 0xda, 0x63, 0xab, 0x2c, 0x8a,\n  0x27, 0x52, 0x89, 0x3a, 0xa7, 0xeb, 0x89, 0xe7, 0x2f, 0xfc, 0xf8, 0x96,\n  0x8f, 0xbc, 0xbf, 0x3c, 0xde, 0x71, 0xfd, 0x6d, 0xd7, 0x5e, 0xb2, 0x87,\n  0x46, 0x6f, 0x69, 0x4d, 0x59, 0xba, 0x25, 0xd9, 0x5b, 0x5a, 0x16, 0xb2,\n  0x6c, 0x91, 0x9e, 0x5c, 0xf7, 0x77, 0x27, 0x3e, 0xfe, 0xb0, 0x7f, 0x85,\n  0xb5, 0x96, 0x3e, 0x73, 0xc7, 0xe9, 0xb3, 0xdf, 0x37, 0xee, 0x4a, 0x60,\n  0x4c, 0xa4, 0x1e, 0x34, 0xda, 0xb7, 0xd3, 0x6e, 0x8f, 0x4d, 0x52, 0xb5,\n  0xba, 0xea, 0xa0, 0x6c, 0x81, 0x9d, 0x56, 0xb1, 0xe8, 0x1f, 0xad, 0x92,\n  0xdc, 0x5f, 0x21, 0x7b, 0x37, 0xc4, 0x3e, 0xd1, 0xc8, 0xf8, 0x3d, 0xe7,\n  0xb8, 0x71, 0x65, 0x7f, 0x54, 0xd1, 0xbd, 0x1d, 0x1a, 0x16, 0x91, 0x33,\n  0x7b, 0x2a, 0xfb, 0x59, 0x27, 0xb7, 0x0a, 0x50, 0x67, 0x09, 0x45, 0x02,\n  0xf2, 0x82, 0xd4, 0x08, 0x6d, 0xdc, 0xd8, 0x40, 0x49, 0x47, 0x5b, 0x43,\n  0x77, 0x63, 0x37, 0x5a, 0xdf, 0xc2, 0xc3, 0xa1, 0x9e, 0xd6, 0xdb, 0xf3,\n  0x79, 0x38, 0x30, 0xa3, 0x4c, 0xd3, 0x8d, 0x1a, 0x33, 0x53, 0xbb, 0x0b,\n  0xfa, 0x39, 0x8c, 0xb9, 0x14, 0x77, 0x6b, 0xa4, 0x2c, 0xde, 0x61, 0x62,\n  0x6f, 0xc2, 0x9a, 0xc7, 0xdb, 0xc1, 0x3a, 0x1e, 0x4a, 0xd8, 0x53, 0xd6,\n  0xda, 0x84, 0x89, 0xcf, 0x53, 0xa6, 0xdb, 0x28, 0x26, 0x57, 0x3d, 0x39,\n  0x72, 0xf8, 0x04, 0xdd, 0x22, 0xe4, 0xb0, 0x27, 0x47, 0x0e, 0x9f, 0xa0,\n  0x71, 0xe6, 0x93, 0x86, 0xb9, 0xc5, 0xdf, 0x50, 0x1a, 0x40, 0x0f, 0x63,\n  0xd6, 0x2f, 0xb0, 0xfd, 0x6c, 0x8a, 0x64, 0x00, 0xd7, 0xd8, 0x05, 0xa8,\n  0x88, 0x83, 0xa2, 0x9b, 0xf4, 0x05, 0x88, 0xe8, 0x6a, 0xd3, 0xf0, 0x04,\n  0xab, 0x32, 0x00, 0xe3, 0x43, 0xe8, 0xdf, 0xc4, 0x9d, 0x70, 0x94, 0xb5,\n  0x0e, 0x07, 0x21, 0xe8, 0x1a, 0xcc, 0x1d, 0xca, 0x4a, 0x8a, 0x1d, 0x45,\n  0x8e, 0x22, 0x97, 0x13, 0xda, 0xb5, 0xfb, 0x9d, 0xae, 0x60, 0x03, 0x28,\n  0xa8, 0x64, 0xaa, 0x03, 0x8e, 0xa9, 0x7e, 0x0d, 0x8c, 0x3e, 0x6f, 0x44,\n  0x64, 0x10, 0x87, 0xff, 0xe8, 0x60, 0xb0, 0xaf, 0xcd, 0x79, 0xd0, 0xdd,\n  0x13, 0xfc, 0x31, 0xad, 0x8b, 0x67, 0x8e, 0xd3, 0x3b, 0x32, 0x4f, 0xd1,\n  0x58, 0xe6, 0x3f, 0x68, 0x4a, 0xfe, 0xa8, 0xa7, 0xad, 0xdd, 0x63, 0x8f,\n  0x8e, 0x85, 0x9d, 0x27, 0xc6, 0xc6, 0xce, 0xfc, 0x54, 0x7a, 0x72, 0xe6,\n  0xc5, 0xb5, 0x2c, 0x1d, 0x8e, 0xc2, 0xd6, 0x21, 0x95, 0x8f, 0xb3, 0x7e,\n  0xe3, 0xb9, 0xfb, 0x33, 0xe9, 0x62, 0xd6, 0xf3, 0x72, 0xaa, 0x5a, 0xc2,\n  0x60, 0xae, 0xa2, 0x24, 0x05, 0x59, 0xc0, 0x97, 0x69, 0x20, 0x36, 0xb0,\n  0xbe, 0x6d, 0x96, 0x03, 0x30, 0x1c, 0x99, 0xad, 0x87, 0x43, 0xcc, 0x65,\n  0x4e, 0xd9, 0xe3, 0xa4, 0xcc, 0xe9, 0x1b, 0x26, 0x0e, 0xa3, 0x13, 0x8f,\n  0x6b, 0xec, 0x5e, 0x77, 0x11, 0x03, 0x14, 0x64, 0x80, 0x68, 0xa0, 0x40,\n  0xad, 0xb9, 0x74, 0xa2, 0x36, 0x09, 0x23, 0x07, 0x4e, 0xf0, 0x23, 0x3c,\n  0xde, 0x41, 0xf9, 0x7d, 0xc5, 0x89, 0x92, 0x84, 0x89, 0x1b, 0x45, 0x4b,\n  0xb8, 0xa1, 0xe5, 0x5c, 0x48, 0x65, 0xf3, 0xaa, 0x09, 0x57, 0x3b, 0x1a,\n  0x33, 0x31, 0xe8, 0x36, 0xd3, 0x8d, 0x14, 0x9c, 0xe6, 0xd9, 0x2d, 0xd5,\n  0xa8, 0xb8, 0x8e, 0x92, 0x7e, 0x61, 0xe6, 0xd7, 0x1a, 0xd3, 0x69, 0x9e,\n  0xdf, 0x53, 0x8d, 0xb3, 0x63, 0x7c, 0x9e, 0x39, 0x57, 0xe9, 0xff, 0xed,\n  0x39, 0xf7, 0xe1, 0x9c, 0x7b, 0x19, 0x3c, 0x89, 0xbf, 0x48, 0xd2, 0x16,\n  0xcf, 0xf9, 0x9f, 0x02, 0x3d, 0xee, 0x43, 0xce, 0xf6, 0xde, 0xd0, 0x6d,\n  0xb4, 0x2e, 0x91, 0x3b, 0xe5, 0xce, 0xf0, 0x58, 0xd4, 0xee, 0x69, 0x6f,\n  0xf3, 0x98, 0xa7, 0x3c, 0xef, 0x7c, 0xb3, 0x5e, 0xff, 0xff, 0x7e, 0xbe,\n  0x7d, 0x45, 0x4b, 0x38, 0x71, 0x8e, 0xf9, 0x7e, 0xde, 0xc4, 0x9c, 0xdb,\n  0x97, 0x9d, 0x6e, 0x33, 0xaf, 0x0a, 0x4d, 0x37, 0xd7, 0x09, 0xf4, 0x0d,\n  0xa6, 0x13, 0x6a, 0xc5, 0xda, 0x6f, 0x34, 0x74, 0x02, 0x65, 0x18, 0x30,\n  0xe3, 0xa2, 0xbc, 0x49, 0xec, 0x4d, 0xab, 0x25, 0x62, 0xd0, 0xab, 0xca,\n  0x3f, 0x1c, 0x14, 0xf6, 0xe5, 0xc2, 0x58, 0x96, 0x9e, 0x22, 0xda, 0xd3,\n  0xc0, 0x99, 0xdf, 0xf3, 0xfd, 0xe8, 0xcc, 0xef, 0xc5, 0x9e, 0x05, 0xfb,\n  0x11, 0x7d, 0x43, 0xfe, 0xb0, 0xa8, 0x8b, 0x7b, 0xec, 0xd7, 0x19, 0xed,\n  0x34, 0x79, 0x4f, 0xbe, 0xfd, 0x18, 0xda, 0xfb, 0xb5, 0x78, 0x7f, 0x82,\n  0x4e, 0xef, 0xc2, 0xdd, 0xf8, 0x72, 0xf2, 0x0d, 0x62, 0xd8, 0x23, 0xd0,\n  0x16, 0xee, 0xc7, 0x75, 0xc2, 0x1e, 0xf9, 0x77, 0x8e, 0x99, 0x62, 0x6a,\n  0xa3, 0x18, 0xe3, 0x13, 0xe5, 0x8f, 0x02, 0xcd, 0x84, 0xa0, 0xf9, 0x0c,\n  0x79, 0x94, 0xd3, 0x3c, 0xaa, 0xd3, 0x60, 0x9e, 0xe3, 0xdb, 0xe5, 0x59,\n  0xa0, 0xa9, 0x17, 0xfb, 0xe8, 0x4f, 0x96, 0xb4, 0xc3, 0xf7, 0xa5, 0xfb,\n  0x80, 0x06, 0x3f, 0xae, 0xaa, 0x74, 0xea, 0xc2, 0xac, 0x4d, 0x74, 0x1d,\n  0xeb, 0x43, 0x83, 0xb0, 0x09, 0xca, 0x96, 0xd4, 0x05, 0xab, 0x4b, 0x2a,\n  0x95, 0xbf, 0x05, 0x34, 0x6b, 0x44, 0x1f, 0xea, 0xc8, 0x2f, 0x38, 0xcd,\n  0x2f, 0x74, 0x1a, 0xb4, 0x0f, 0xae, 0x63, 0x3c, 0x6d, 0x10, 0x76, 0xc0,\n  0x47, 0x0d, 0xfb, 0xa8, 0x94, 0xe9, 0xe5, 0x35, 0xa2, 0x7c, 0xb7, 0xe9,\n  0xbd, 0xb7, 0xea, 0xef, 0x25, 0x87, 0xe0, 0x2d, 0x8b, 0xf0, 0x62, 0x16,\n  0xfe, 0xcc, 0xde, 0xfb, 0x15, 0xfd, 0xbd, 0xe4, 0xd0, 0xc2, 0x6e, 0xfe,\n  0x5e, 0x29, 0xfb, 0xde, 0x1a, 0x18, 0x57, 0xf6, 0xbd, 0x2a, 0xb9, 0x3c,\n  0x28, 0xce, 0x5b, 0x50, 0x9e, 0x7d, 0x2f, 0x94, 0xdb, 0xc4, 0x78, 0x61,\n  0x8e, 0xcd, 0xfd, 0xfc, 0x57, 0x7a, 0x42, 0xf4, 0x73, 0x2c, 0xa7, 0x9f,\n  0xff, 0x4a, 0x53, 0xac, 0x0f, 0xff, 0xb5, 0x30, 0x4e, 0xf7, 0x30, 0xfa,\n  0x46, 0x56, 0xfe, 0x24, 0xda, 0x54, 0x2c, 0x9f, 0xf9, 0x38, 0xed, 0x91,\n  0x7e, 0x09, 0xe5, 0x53, 0x5c, 0x56, 0x16, 0xee, 0x3d, 0xf3, 0x07, 0x21,\n  0x2b, 0x7f, 0x60, 0x9d, 0x53, 0x10, 0x0d, 0x8c, 0x0e, 0x28, 0xa5, 0xb0,\n  0x4a, 0x02, 0x04, 0x23, 0xdd, 0x36, 0xa7, 0x37, 0xb0, 0x35, 0xdd, 0xdc,\n  0xd4, 0xd8, 0x50, 0x9b, 0x4c, 0xd4, 0x58, 0x19, 0x68, 0x10, 0xae, 0x4b,\n  0x2b, 0xa5, 0x32, 0x3d, 0x6d, 0xa1, 0xb2, 0x5d, 0xb1, 0xc9, 0x98, 0x7e,\n  0xf6, 0x10, 0xac, 0xc0, 0x43, 0xcc, 0x8d, 0x51, 0x5d, 0x1b, 0x0a, 0x3a,\n  0x61, 0x05, 0xd6, 0xd7, 0xc5, 0x63, 0x95, 0xe1, 0x60, 0x34, 0x14, 0xf5,\n  0x94, 0x38, 0x02, 0xce, 0x00, 0x5b, 0x7b, 0x8e, 0xdc, 0xb5, 0xa7, 0x6f,\n  0xd6, 0xb0, 0x37, 0x77, 0x98, 0xfe, 0xed, 0x8d, 0xa4, 0xba, 0xdd, 0x49,\n  0x5c, 0x98, 0xee, 0xe0, 0xc5, 0xc1, 0xde, 0x92, 0x83, 0x8e, 0xf6, 0xbe,\n  0xe0, 0x3e, 0x6f, 0x38, 0xec, 0xf5, 0x96, 0x97, 0x3f, 0x88, 0x7f, 0xfb,\n  0xca, 0xcb, 0x8b, 0x33, 0x99, 0x4d, 0x9b, 0xa8, 0xb4, 0x69, 0x93, 0xfc,\n  0x7e, 0x63, 0xd9, 0x5d, 0x15, 0x2c, 0x2b, 0x0b, 0x85, 0xca, 0xca, 0x82,\n  0xfa, 0xdf, 0x67, 0xfe, 0xdc, 0xe9, 0x95, 0x56, 0xf8, 0x3a, 0x3b, 0x7d,\n  0x67, 0x1f, 0xf7, 0xe2, 0x3e, 0xb5, 0x80, 0x99, 0x25, 0x7c, 0xf2, 0x01,\n  0x31, 0xc6, 0x04, 0xb9, 0xfc, 0x8b, 0x42, 0xd9, 0xae, 0xf9, 0x5c, 0x9c,\n  0x39, 0xcc, 0x66, 0x87, 0xc7, 0xc6, 0x26, 0xc9, 0x7b, 0xd0, 0x05, 0xe9,\n  0xd0, 0x34, 0xf3, 0x46, 0xe2, 0x03, 0x2c, 0xe7, 0x88, 0x66, 0xf9, 0xb9,\n  0xa0, 0x13, 0xcd, 0xa5, 0x2b, 0x39, 0x23, 0x12, 0x35, 0xff, 0xc7, 0x8c,\n  0x90, 0xc1, 0xca, 0x5b, 0x53, 0x88, 0x01, 0x23, 0x5b, 0xb7, 0x4a, 0x3f,\n  0x2e, 0x3c, 0xf4, 0xb3, 0x0f, 0x48, 0x21, 0x21, 0xb7, 0x87, 0x99, 0x3d,\n  0xde, 0xcc, 0xed, 0x70, 0xf2, 0xc6, 0x92, 0xf5, 0x32, 0x82, 0x78, 0x11,\n  0xf2, 0x0b, 0x40, 0xb3, 0x56, 0xd0, 0x54, 0xe4, 0x5d, 0x2f, 0x87, 0x99,\n  0x5c, 0x35, 0x8b, 0x75, 0x71, 0xb1, 0xb1, 0x5e, 0x5c, 0x4c, 0x0e, 0xd7,\n  0x8a, 0xf2, 0x94, 0x61, 0x4f, 0x9b, 0xe9, 0x9f, 0xa2, 0x93, 0x82, 0x7e,\n  0x7f, 0x96, 0x9e, 0xad, 0xfd, 0x43, 0x67, 0x35, 0x8e, 0xce, 0x74, 0x56,\n  0x33, 0x74, 0xd6, 0x3a, 0xfa, 0xdf, 0xac, 0x6e, 0x8b, 0x68, 0x93, 0xdb,\n  0x4c, 0x53, 0x0b, 0xeb, 0xc8, 0x17, 0x58, 0xdd, 0x19, 0x5e, 0x4e, 0xff,\n  0x91, 0xc9, 0xf6, 0x5f, 0x90, 0x9e, 0xe9, 0x13, 0xa4, 0x4f, 0x72, 0x7a,\n  0x6c, 0x7b, 0xe1, 0x7b, 0x8b, 0x75, 0xdc, 0xc2, 0xab, 0x40, 0xeb, 0x97,\n  0x4f, 0x8b, 0x36, 0x92, 0xbc, 0x0d, 0x46, 0xfb, 0x18, 0x1b, 0xb3, 0x94,\n  0x33, 0xe6, 0x13, 0xd9, 0x7e, 0xb0, 0xbe, 0x1e, 0x3d, 0xeb, 0x17, 0x7d,\n  0xf5, 0x8b, 0xdc, 0x0d, 0xaf, 0x2e, 0x1c, 0xa3, 0x7e, 0xbd, 0x4f, 0xbc,\n  0x9d, 0xb3, 0x1e, 0x41, 0xe3, 0x31, 0xc6, 0xd3, 0x93, 0x33, 0x1e, 0xa1,\n  0xef, 0x17, 0x7e, 0xb6, 0xd0, 0x4f, 0x1b, 0x4d, 0x75, 0x27, 0x17, 0x1e,\n  0x3a, 0xf3, 0x02, 0xaf, 0x7b, 0xe6, 0x05, 0xbd, 0x2e, 0xe2, 0x02, 0x30,\n  0x7d, 0xd7, 0x2a, 0xf4, 0xdd, 0x91, 0x25, 0xf3, 0xb7, 0x19, 0x68, 0xb6,\n  0xb0, 0xb5, 0xbd, 0x8e, 0x9f, 0x81, 0x10, 0xf1, 0x8c, 0xf3, 0x11, 0x31,\n  0x05, 0x78, 0x5d, 0xc6, 0xc7, 0x3f, 0xe8, 0x73, 0x06, 0xf4, 0x51, 0x9d,\n  0xde, 0xf1, 0x0d, 0x99, 0x1a, 0x3a, 0xee, 0x23, 0xec, 0x5d, 0x6d, 0xe2,\n  0x5d, 0xb1, 0x7c, 0xef, 0x02, 0xbd, 0x83, 0xef, 0x5a, 0x2f, 0xce, 0x5b,\n  0xcf, 0x1b, 0xf2, 0xf1, 0x11, 0xf6, 0xae, 0x36, 0xf1, 0xae, 0xfb, 0x4d,\n  0xfa, 0x34, 0xaa, 0xd3, 0x43, 0xf9, 0xbc, 0xa0, 0xdf, 0x9f, 0xa5, 0x67,\n  0xbc, 0x7d, 0x72, 0x89, 0x1c, 0x6c, 0x5e, 0xd8, 0x93, 0xad, 0xcb, 0x68,\n  0xae, 0x3a, 0x2b, 0x0b, 0x1a, 0x39, 0xcb, 0xdb, 0x9c, 0xf7, 0x3e, 0x41,\n  0xaf, 0x14, 0xef, 0xed, 0xc9, 0x79, 0xef, 0x13, 0xa8, 0x1f, 0x41, 0xc7,\n  0x31, 0x1c, 0x07, 0x25, 0x06, 0x8b, 0xb0, 0x1a, 0xb8, 0xd2, 0x4f, 0xe6,\n  0xd3, 0x3b, 0xcc, 0xd6, 0x96, 0x93, 0x19, 0x1c, 0x0a, 0x95, 0x88, 0x6a,\n  0x91, 0xd4, 0x83, 0x44, 0x76, 0x69, 0x92, 0xc5, 0x26, 0x5b, 0x0e, 0x11,\n  0x87, 0x83, 0xe5, 0x75, 0x38, 0x96, 0xf5, 0x9f, 0xb5, 0x32, 0x7b, 0x6b,\n  0x45, 0x6f, 0xaa, 0xa3, 0xb9, 0x31, 0x11, 0x77, 0x54, 0x3b, 0xaa, 0x2b,\n  0xc3, 0x65, 0xa1, 0x80, 0xdf, 0xeb, 0x2e, 0x76, 0x19, 0x96, 0x06, 0xcd,\n  0x2e, 0x72, 0xfe, 0x5d, 0x28, 0x1b, 0xaf, 0xc6, 0xbe, 0x03, 0x2c, 0xca,\n  0xdb, 0x9b, 0x93, 0xb8, 0x97, 0x8e, 0xea, 0x96, 0xc7, 0xbd, 0x96, 0xb6,\n  0x86, 0x70, 0x7b, 0xb3, 0xd7, 0xef, 0xd1, 0xda, 0x2d, 0xad, 0x8d, 0xa5,\n  0xed, 0xcd, 0xfe, 0x80, 0x47, 0xa5, 0xdf, 0x58, 0x73, 0xe7, 0x85, 0x47,\n  0xef, 0x1a, 0x1f, 0xbf, 0xeb, 0xd8, 0xe1, 0x3b, 0xd7, 0x9c, 0xfd, 0xb7,\n  0xf7, 0x5c, 0x76, 0xf9, 0xb1, 0x63, 0x97, 0x5d, 0x76, 0x42, 0xfe, 0x3b,\n  0x67, 0x78, 0x10, 0xd4, 0x42, 0x53, 0x93, 0xe7, 0xd6, 0xd4, 0x40, 0x28,\n  0x54, 0x1e, 0xe8, 0x1c, 0x04, 0x9d, 0x10, 0xcc, 0xcc, 0x1e, 0xbd, 0x6f,\n  0xc7, 0x8e, 0xfb, 0x8f, 0x5e, 0xf4, 0xbf, 0x76, 0x6c, 0xbf, 0xef, 0xe8,\n  0x8d, 0x7f, 0xf7, 0x77, 0x37, 0xde, 0x78, 0xf7, 0xdd, 0xc2, 0x96, 0x4b,\n  0x32, 0x5b, 0xae, 0x9a, 0xe5, 0xd7, 0xd8, 0x93, 0xde, 0xb5, 0x94, 0x27,\n  0x26, 0x56, 0xa8, 0xaa, 0xb4, 0x07, 0x3d, 0x10, 0x59, 0xc6, 0x05, 0x3d,\n  0xdb, 0x45, 0x2e, 0x57, 0x7a, 0xbb, 0x3b, 0xda, 0x1a, 0xeb, 0x6b, 0x62,\n  0x05, 0xb8, 0xe2, 0x3d, 0x37, 0x57, 0x04, 0x53, 0x16, 0xf3, 0xe4, 0xb5,\n  0x73, 0xb0, 0xe4, 0x08, 0x8b, 0x78, 0xbb, 0xe1, 0xc4, 0xc4, 0xd1, 0x95,\n  0x99, 0xc3, 0x2c, 0xde, 0x6d, 0xc3, 0x86, 0x49, 0xe9, 0xf7, 0x05, 0x18,\n  0xf2, 0xb9, 0xd3, 0x77, 0x0e, 0x5d, 0x35, 0x77, 0xfa, 0x6f, 0x86, 0xae,\n  0x98, 0x9b, 0x3f, 0x7a, 0x94, 0x67, 0x40, 0xb6, 0x08, 0x19, 0x51, 0x88,\n  0x83, 0x04, 0xc1, 0xb2, 0x1d, 0x00, 0x4b, 0x66, 0x6f, 0x7a, 0x5e, 0xa6,\n  0xb4, 0x58, 0x2a, 0x92, 0x89, 0x42, 0xc9, 0x41, 0x15, 0x73, 0x01, 0x68,\n  0x8a, 0xf5, 0x20, 0xb1, 0x94, 0xd8, 0x24, 0xcd, 0x61, 0xd1, 0x0e, 0x12,\n  0x97, 0x8b, 0x85, 0x80, 0x81, 0x7c, 0x38, 0x9d, 0xf6, 0x3d, 0xc0, 0x8e,\n  0xe3, 0xf6, 0xb5, 0xa1, 0x10, 0x66, 0xa7, 0x1d, 0x1f, 0x5d, 0x95, 0x5e,\n  0xd1, 0xdb, 0xd1, 0x16, 0x6a, 0x0a, 0x35, 0x35, 0xe8, 0x39, 0x27, 0xca,\n  0xbc, 0x6e, 0x67, 0xd0, 0x15, 0xe4, 0x1f, 0xb8, 0xdc, 0x2c, 0xfd, 0x7c,\n  0xfe, 0x3d, 0xc0, 0xf2, 0x3f, 0x17, 0x9b, 0x3a, 0xb6, 0x53, 0x84, 0xc3,\n  0x0f, 0xc2, 0x6e, 0x81, 0x7f, 0x67, 0x5e, 0x50, 0x3b, 0x5b, 0x2a, 0x53,\n  0xad, 0xfe, 0x60, 0xa9, 0xd6, 0xa4, 0x76, 0xb4, 0x84, 0x53, 0x6d, 0x81,\n  0x50, 0x48, 0xa3, 0x4f, 0x17, 0x10, 0x9f, 0x7b, 0x4b, 0x4b, 0x71, 0x1f,\n  0x29, 0x2d, 0xd5, 0xff, 0xbe, 0xf3, 0xdc, 0x52, 0x84, 0x7c, 0xe3, 0x72,\n  0xb4, 0x41, 0xf0, 0x6d, 0x05, 0x9c, 0x6c, 0xcf, 0x4b, 0xef, 0x31, 0xf3,\n  0xcd, 0xc4, 0x2e, 0x34, 0xe0, 0x55, 0x9e, 0xb5, 0x43, 0x70, 0xee, 0xc4,\n  0x52, 0xce, 0x8d, 0x0e, 0xa7, 0x07, 0x31, 0x5b, 0xca, 0xf2, 0x9c, 0xf3,\n  0xfe, 0x4f, 0x39, 0x57, 0x40, 0xb4, 0xfe, 0xfd, 0x5d, 0xb2, 0xed, 0xca,\n  0xbc, 0x22, 0xf6, 0xfa, 0xf2, 0x4c, 0xcb, 0x27, 0x69, 0x59, 0x7d, 0xc4,\n  0xcf, 0x7e, 0x98, 0x4f, 0x7a, 0x3a, 0x3d, 0x69, 0x3e, 0xf1, 0x5b, 0xc5,\n  0x01, 0xc8, 0xa6, 0x9f, 0xfe, 0x34, 0xf6, 0x39, 0xfe, 0x98, 0xf9, 0xeb,\n  0x14, 0xae, 0x37, 0xf4, 0x85, 0x0e, 0x97, 0xf9, 0x3c, 0xa6, 0x73, 0xad,\n  0x7d, 0xe9, 0x29, 0x7f, 0x39, 0xa1, 0xb9, 0xce, 0x74, 0xa8, 0xfd, 0x66,\n  0x01, 0xc1, 0xc8, 0x39, 0xff, 0x67, 0x56, 0xe6, 0x97, 0x03, 0xb3, 0x3e,\n  0x29, 0x22, 0x61, 0x38, 0x77, 0x5c, 0xff, 0x45, 0x31, 0x24, 0x7e, 0x24,\n  0x6c, 0x30, 0x8d, 0xcc, 0x96, 0x3d, 0x0a, 0xea, 0x63, 0x3b, 0x61, 0x1e,\n  0x1b, 0xba, 0xdc, 0x2c, 0xc3, 0x87, 0x13, 0xb9, 0x5f, 0xe9, 0xca, 0x90,\n  0x15, 0xdc, 0x65, 0xd4, 0xeb, 0x3e, 0x17, 0x2b, 0x0a, 0x48, 0x01, 0x6d,\n  0x37, 0x31, 0xe2, 0x40, 0xde, 0xa9, 0xce, 0x39, 0xd6, 0x67, 0xee, 0xc9,\n  0x33, 0xb3, 0x79, 0xe7, 0xd5, 0xac, 0x53, 0xff, 0xcf, 0xe7, 0xd5, 0x67,\n  0xcf, 0xdd, 0x55, 0xce, 0x35, 0xaf, 0x69, 0x54, 0x98, 0xae, 0x36, 0x76,\n  0x7a, 0xfd, 0x4a, 0xa1, 0x79, 0x35, 0x1f, 0x5c, 0xff, 0x27, 0xf3, 0x6a,\n  0xd8, 0xce, 0xff, 0x4f, 0xe6, 0x95, 0xb1, 0xc2, 0xbb, 0x98, 0x15, 0x05,\n  0xe6, 0xf5, 0x77, 0xa6, 0x53, 0xfc, 0xa1, 0xfc, 0xd3, 0x9a, 0xc3, 0x85,\n  0x7c, 0xd3, 0xaa, 0xe3, 0x3a, 0x31, 0x7b, 0xba, 0x43, 0xd8, 0xca, 0x3f,\n  0x5d, 0x72, 0x8e, 0xe6, 0xfe, 0xf1, 0x78, 0xaf, 0xbd, 0x51, 0xdc, 0x67,\n  0xbf, 0x6c, 0xaa, 0x7b, 0x97, 0x5e, 0x17, 0x6c, 0xa7, 0x5f, 0x17, 0xa8,\n  0xfb, 0x4b, 0xbd, 0x2e, 0xd0, 0xfc, 0xb7, 0x51, 0x77, 0x9e, 0xd5, 0x4d,\n  0x89, 0xba, 0x2f, 0x2c, 0xad, 0xcb, 0x72, 0x6b, 0x60, 0xdd, 0xcd, 0xa2,\n  0xee, 0x47, 0x0c, 0xdb, 0x6c, 0x9e, 0xd9, 0x48, 0x29, 0x61, 0x83, 0xbd,\n  0x87, 0x95, 0x4f, 0x80, 0x2d, 0x7c, 0x3b, 0xb3, 0x91, 0x36, 0x0b, 0x7b,\n  0xfa, 0xc1, 0x2c, 0x3d, 0xb3, 0xa7, 0x91, 0x3e, 0x09, 0x22, 0x7b, 0x39,\n  0x79, 0x88, 0x8a, 0x7a, 0x8b, 0xde, 0xc9, 0xdb, 0xb8, 0x4f, 0xb4, 0x91,\n  0xa0, 0x53, 0x1d, 0x46, 0x4b, 0xa2, 0xad, 0x03, 0xd9, 0x77, 0x33, 0x1b,\n  0xee, 0xc3, 0x67, 0x6d, 0xe2, 0xce, 0xdc, 0x26, 0x6c, 0xb8, 0x92, 0x85,\n  0xa3, 0xd9, 0x7e, 0x30, 0x1b, 0xfa, 0xe5, 0xb3, 0x6e, 0x61, 0xe7, 0xb9,\n  0x8d, 0x1c, 0x6b, 0x6f, 0xd2, 0x37, 0xd9, 0xf8, 0xbb, 0xc4, 0xf8, 0x1f,\n  0x5b, 0x62, 0x9b, 0x22, 0xcd, 0x43, 0x6c, 0xfc, 0x5b, 0x72, 0xc6, 0xdf,\n  0x01, 0x7d, 0x7c, 0x93, 0xe1, 0x2a, 0x75, 0x89, 0xf1, 0x37, 0x18, 0xe5,\n  0x0f, 0xb1, 0xf7, 0x6e, 0x11, 0xe5, 0x65, 0x3a, 0x5e, 0x10, 0xbc, 0xeb,\n  0x73, 0x6c, 0x1f, 0x1b, 0x22, 0xbb, 0xd3, 0x3b, 0x35, 0xcc, 0xcb, 0x00,\n  0x92, 0xda, 0x41, 0x35, 0xb5, 0xb3, 0x4a, 0xb2, 0x68, 0x95, 0x54, 0xb1,\n  0x58, 0xa6, 0x90, 0x96, 0x49, 0xb0, 0x2a, 0x51, 0xf5, 0x14, 0x91, 0x6d,\n  0x94, 0x63, 0x93, 0x08, 0xb7, 0xec, 0x63, 0x66, 0x67, 0x76, 0x90, 0x58,\n  0xd2, 0xd3, 0xd5, 0xd6, 0x82, 0xcb, 0x99, 0x6f, 0x60, 0x98, 0x33, 0x99,\n  0x6b, 0xa6, 0xd4, 0xa0, 0xc4, 0x25, 0x38, 0x69, 0xda, 0xbd, 0xa8, 0x6f,\n  0xb1, 0x1f, 0x7b, 0x22, 0x91, 0x07, 0xd8, 0xb2, 0x52, 0xa2, 0x4a, 0x71,\n  0x2c, 0xea, 0x60, 0xa2, 0x7d, 0x89, 0xd8, 0xc1, 0x68, 0xd9, 0xcd, 0x97,\n  0xf4, 0x9f, 0x1f, 0x8d, 0x1f, 0xee, 0x5d, 0xb7, 0xbe, 0x72, 0x62, 0x68,\n  0xfb, 0xce, 0xbe, 0x03, 0xab, 0x57, 0xec, 0xad, 0x0d, 0xd7, 0xcc, 0xb6,\n  0xac, 0x1e, 0xae, 0x1c, 0xee, 0x5b, 0x39, 0xdb, 0x24, 0x97, 0x38, 0xbd,\n  0x9d, 0xdd, 0x01, 0xbb, 0xa7, 0xb7, 0xd7, 0x63, 0x6c, 0x59, 0x67, 0x3f,\n  0x3c, 0x7f, 0xc8, 0x53, 0xb2, 0xa5, 0xa4, 0x6c, 0x30, 0x15, 0x6b, 0xad,\n  0x0b, 0x46, 0x76, 0x6f, 0xec, 0x5d, 0xdf, 0x18, 0xf0, 0x4c, 0x97, 0x04,\n  0x7a, 0x5b, 0xe2, 0xad, 0x89, 0x40, 0x30, 0x35, 0xa9, 0xf3, 0xe7, 0x21,\n  0x29, 0x23, 0xf8, 0xf3, 0xb1, 0x74, 0xb0, 0x00, 0x7f, 0x78, 0x24, 0x7f,\n  0x73, 0x96, 0x43, 0xe8, 0x77, 0x62, 0xa3, 0x02, 0x41, 0xe2, 0x98, 0xe1,\n  0xe6, 0x9e, 0xe3, 0xf5, 0x5f, 0x9e, 0x6e, 0xce, 0xe5, 0xeb, 0xb9, 0x2a,\n  0x80, 0x7a, 0x58, 0x86, 0xb9, 0xde, 0x77, 0xc9, 0x5c, 0x9e, 0xb0, 0x7f,\n  0x31, 0x6f, 0x9f, 0x5b, 0xca, 0x5a, 0xf9, 0xe2, 0xbd, 0x8b, 0xa2, 0x05,\n  0xb6, 0x2d, 0x0a, 0x2d, 0x90, 0x76, 0xe5, 0x61, 0x6d, 0xa6, 0x62, 0xed,\n  0xba, 0x25, 0x61, 0x03, 0xb9, 0x51, 0x06, 0x59, 0xd9, 0x63, 0xb6, 0x67,\n  0x25, 0x19, 0x27, 0x17, 0xa4, 0xf7, 0x97, 0x95, 0x48, 0x44, 0xf2, 0x83,\n  0xc1, 0xd9, 0x47, 0xad, 0xda, 0x8a, 0x84, 0xa4, 0x5a, 0x6b, 0xa8, 0x45,\n  0xb5, 0x4c, 0xc9, 0x4c, 0xf5, 0x4a, 0xe4, 0x94, 0x1d, 0x9e, 0x69, 0x44,\n  0xd1, 0x78, 0xac, 0x24, 0x33, 0xb3, 0x44, 0x5a, 0x3f, 0xb6, 0x9b, 0xf0,\n  0xdc, 0x41, 0x96, 0xb5, 0xe8, 0x5a, 0xb5, 0x72, 0xa0, 0xa7, 0xab, 0xbe,\n  0x36, 0x16, 0x71, 0x56, 0x3a, 0x2b, 0x4b, 0x43, 0x1e, 0x37, 0xb7, 0xa1,\n  0x1c, 0x8b, 0xac, 0x4f, 0x4d, 0xdf, 0x29, 0x75, 0xc5, 0xea, 0x7d, 0xd7,\n  0xa2, 0x58, 0x21, 0xb8, 0x34, 0xe4, 0x6a, 0x6c, 0xf5, 0xf4, 0x97, 0xf5,\n  0x94, 0x96, 0xf7, 0x94, 0x0d, 0x7a, 0xdb, 0x9a, 0x9c, 0x9f, 0x39, 0xb7,\n  0x40, 0x1a, 0x56, 0xe7, 0x07, 0x82, 0xa9, 0x4e, 0xaf, 0xcb, 0xdd, 0x5a,\n  0x5e, 0xde, 0xea, 0x76, 0x79, 0x3b, 0x53, 0xc1, 0xb3, 0xff, 0xfc, 0x2e,\n  0xc4, 0x52, 0x97, 0x4b, 0x66, 0x7f, 0x22, 0xef, 0x3e, 0x99, 0x0e, 0x15,\n  0xe2, 0x1d, 0x17, 0xcc, 0xa6, 0xa5, 0x9c, 0xc3, 0x7c, 0x1c, 0x17, 0x9a,\n  0xd2, 0x22, 0x9a, 0xf8, 0x57, 0x9e, 0x6e, 0x7d, 0x17, 0x2c, 0xcf, 0xa9,\n  0x32, 0x97, 0xae, 0x58, 0x9e, 0xeb, 0xde, 0xff, 0x19, 0xd7, 0xf3, 0xcb,\n  0xe8, 0x1b, 0x85, 0x78, 0xfe, 0xe1, 0x73, 0x4b, 0xea, 0xeb, 0x05, 0x79,\n  0x9e, 0xe9, 0x7a, 0x17, 0xf2, 0xaa, 0xeb, 0x56, 0x5d, 0x2f, 0xc3, 0x5e,\n  0xc1, 0xf4, 0x32, 0x15, 0x3a, 0x76, 0x89, 0x7e, 0x5e, 0x67, 0xd2, 0xcf,\n  0x49, 0xae, 0x9f, 0x75, 0xbd, 0xcb, 0x7c, 0x0f, 0x88, 0x14, 0x61, 0x6d,\n  0x75, 0x0b, 0x1d, 0xff, 0xf5, 0x25, 0x3a, 0x1e, 0x73, 0xee, 0x6f, 0x94,\n  0xe7, 0x80, 0x06, 0xf3, 0xb6, 0xaa, 0x74, 0xed, 0xe0, 0xa5, 0x9c, 0xe2,\n  0x52, 0xa0, 0xc0, 0x36, 0x60, 0xef, 0x8a, 0xb0, 0xfd, 0xa6, 0x5b, 0xb4,\n  0x9d, 0x16, 0xf5, 0xd6, 0x61, 0x0e, 0x1e, 0x5e, 0x8f, 0x95, 0x0b, 0x7f,\n  0x87, 0x85, 0xe3, 0x59, 0x7a, 0xb6, 0x3f, 0xcd, 0x9d, 0xf5, 0x8a, 0xbd,\n  0xc7, 0x6b, 0xec, 0x4f, 0x47, 0xe8, 0x61, 0x53, 0xdd, 0xa7, 0xc8, 0x8f,\n  0x45, 0xdd, 0x9e, 0x9c, 0x77, 0x3d, 0x41, 0x03, 0xe2, 0x5d, 0x1d, 0xf4,\n  0x6a, 0x9d, 0x1e, 0xef, 0x75, 0x88, 0x72, 0xe6, 0x47, 0xe2, 0x5e, 0xe7,\n  0x47, 0xa2, 0xcd, 0x6d, 0x0b, 0xeb, 0xa5, 0x53, 0xac, 0x6e, 0x0f, 0xab,\n  0xfb, 0x4d, 0x7a, 0x84, 0xd5, 0x9d, 0x81, 0x72, 0xbf, 0x14, 0x82, 0xf2,\n  0xad, 0xa2, 0xbc, 0x9d, 0x70, 0xfa, 0x37, 0xa5, 0x53, 0xf2, 0x07, 0x38,\n  0x3d, 0xbb, 0xeb, 0xbf, 0x7d, 0x09, 0x6f, 0x66, 0x80, 0xc6, 0x2f, 0xbd,\n  0x28, 0xea, 0xaa, 0x74, 0xfd, 0x66, 0x22, 0xea, 0xf6, 0xe4, 0xbc, 0xeb,\n  0x09, 0x7a, 0xa1, 0xa0, 0x4f, 0x65, 0xdf, 0xc5, 0xfa, 0x79, 0xfe, 0x99,\n  0xe7, 0x44, 0x3f, 0x9f, 0x63, 0x8d, 0xca, 0xfc, 0xbd, 0xe2, 0xbe, 0xa4,\n  0x03, 0xf7, 0xc2, 0x77, 0x75, 0x5b, 0x52, 0xe4, 0x90, 0x6c, 0xb6, 0x43,\n  0xe6, 0x4b, 0x81, 0x48, 0x04, 0x6d, 0xb8, 0x48, 0x47, 0xa4, 0xa3, 0xb5,\n  0xb9, 0xa1, 0x3e, 0x59, 0x93, 0xe7, 0x62, 0xa0, 0xf8, 0x5d, 0x5c, 0x97,\n  0x58, 0x96, 0x42, 0x85, 0xd0, 0xa6, 0x73, 0x5c, 0x09, 0xdc, 0xd8, 0x7f,\n  0xc5, 0xfc, 0xe9, 0x5b, 0xb6, 0xed, 0xdc, 0xb5, 0x67, 0xb6, 0xd0, 0xcd,\n  0xc8, 0x48, 0xa6, 0x7d, 0xf2, 0xbd, 0x23, 0x1f, 0x78, 0x2f, 0xfd, 0xb7,\n  0x4c, 0xdb, 0xec, 0xee, 0x03, 0xeb, 0xe9, 0x33, 0x38, 0x76, 0xc6, 0x4f,\n  0x71, 0x2f, 0xd2, 0x49, 0x3e, 0x93, 0x76, 0xb0, 0xb1, 0xc7, 0xa9, 0xc3,\n  0xae, 0x27, 0x08, 0xe1, 0x5f, 0xa9, 0x5c, 0xe2, 0x82, 0xa4, 0x08, 0x46,\n  0x6f, 0xcf, 0xbd, 0x20, 0x29, 0x76, 0x4a, 0x76, 0x3b, 0xcb, 0xdd, 0xc4,\n  0x83, 0x58, 0x0f, 0x5b, 0x41, 0x91, 0x74, 0xbf, 0xdb, 0x5a, 0x40, 0x6f,\n  0x5c, 0xb1, 0x1c, 0xc7, 0x3c, 0x65, 0xb5, 0x82, 0x8d, 0x9d, 0x91, 0xce,\n  0xb6, 0x16, 0x16, 0x01, 0x1b, 0xcd, 0xc3, 0xc8, 0x92, 0x77, 0x71, 0xc3,\n  0x62, 0x71, 0x2f, 0x75, 0x57, 0xfc, 0xd3, 0x39, 0x18, 0xb9, 0x79, 0xdc,\n  0xec, 0xc2, 0x58, 0xe0, 0x4e, 0x65, 0xe4, 0xec, 0xcb, 0x4b, 0xdc, 0x19,\n  0xe1, 0xec, 0xc0, 0xe5, 0x88, 0xdf, 0xa9, 0x94, 0x93, 0x66, 0xcc, 0x06,\n  0xe5, 0x90, 0xec, 0x32, 0x91, 0x29, 0x73, 0x3b, 0x75, 0xc2, 0x9f, 0x8a,\n  0x66, 0x51, 0x0e, 0xb8, 0x30, 0x0d, 0xd0, 0x21, 0x1c, 0xba, 0xee, 0xbd,\n  0x18, 0x0e, 0xf3, 0xcb, 0x80, 0x70, 0x73, 0xb8, 0xb9, 0xa1, 0x2e, 0x51,\n  0x13, 0xad, 0x0e, 0x95, 0x87, 0xca, 0xcb, 0x4a, 0xcd, 0xd7, 0x00, 0x45,\n  0x59, 0x34, 0x3b, 0x93, 0x4a, 0x15, 0xde, 0xc2, 0xfe, 0x48, 0x2a, 0x9f,\n  0xd8, 0x94, 0x08, 0xbd, 0xf9, 0x8c, 0xb8, 0x57, 0x5f, 0x93, 0x79, 0x8e,\n  0xde, 0x9f, 0x15, 0x15, 0x45, 0x31, 0x1f, 0xe6, 0xf1, 0xef, 0x8f, 0x8f,\n  0x8d, 0xfd, 0x7d, 0x1e, 0x39, 0x51, 0x84, 0x9c, 0x6c, 0x10, 0x63, 0x6b,\n  0x21, 0x8f, 0x3f, 0x52, 0x45, 0x6d, 0x56, 0xfd, 0x58, 0x54, 0xef, 0x94,\n  0x1c, 0xc6, 0x38, 0x59, 0xd0, 0x96, 0x8b, 0xe2, 0x77, 0xdb, 0x22, 0xbb,\n  0x64, 0xb5, 0xb2, 0x94, 0x24, 0x1c, 0x3a, 0x12, 0x3f, 0x2c, 0x70, 0xa9,\n  0xaa, 0x35, 0xd7, 0x70, 0x21, 0x67, 0xac, 0xc0, 0x99, 0x7c, 0xf4, 0xe9,\n  0xc6, 0x65, 0x49, 0x31, 0x45, 0x04, 0xd0, 0x1b, 0xdf, 0x47, 0xe7, 0xd2,\n  0x75, 0x06, 0x37, 0x5b, 0xc2, 0x2d, 0x8d, 0xf5, 0xb5, 0xc9, 0x78, 0xb4,\n  0xb2, 0x62, 0x29, 0x3f, 0x8b, 0x17, 0x79, 0x5c, 0x2f, 0xe5, 0xe7, 0x52,\n  0xe9, 0x79, 0x2e, 0x0f, 0x3f, 0x2f, 0x36, 0x4b, 0x8c, 0xbc, 0x21, 0x1f,\n  0x47, 0x17, 0x8b, 0x0b, 0xc7, 0xd7, 0x91, 0xb6, 0x32, 0x5d, 0xd7, 0x2b,\n  0x74, 0xdd, 0xcc, 0x12, 0x5d, 0x87, 0x4e, 0xb2, 0x67, 0x98, 0xae, 0x9b,\n  0xe3, 0xba, 0x2e, 0x2c, 0x7c, 0xc1, 0x40, 0xff, 0x6f, 0x65, 0xba, 0xae,\n  0x57, 0xe8, 0xf9, 0xcd, 0x7a, 0x39, 0xc6, 0x22, 0x0a, 0x7a, 0x2c, 0x4f,\n  0x64, 0x31, 0x52, 0xd9, 0x9e, 0xd3, 0x27, 0xee, 0xbc, 0x2f, 0x5d, 0xf2,\n  0x2e, 0x8e, 0x9b, 0x8a, 0xfb, 0xd6, 0x36, 0x71, 0xbf, 0xde, 0xca, 0xeb,\n  0x2e, 0xac, 0x63, 0xf8, 0xaa, 0xac, 0x2e, 0x6b, 0xf3, 0x4f, 0x9c, 0x1e,\n  0xca, 0x11, 0x67, 0x55, 0xd0, 0x43, 0xf9, 0xe7, 0x59, 0xb9, 0x02, 0xe3,\n  0x1a, 0x65, 0xef, 0x5a, 0x21, 0xf6, 0xb7, 0xa7, 0x96, 0xbc, 0x0b, 0x33,\n  0xe7, 0x2f, 0xb0, 0x77, 0x6d, 0x17, 0x67, 0x98, 0xcf, 0x9a, 0xea, 0xde,\n  0xaa, 0xd7, 0x25, 0x87, 0x88, 0xb4, 0xf8, 0xfb, 0xa3, 0xa8, 0xfb, 0x33,\n  0x51, 0x57, 0x25, 0x87, 0x7e, 0x63, 0xe0, 0x15, 0x49, 0x5d, 0xec, 0xbd,\n  0xfd, 0xe2, 0xbd, 0xdf, 0x5e, 0xf2, 0x5e, 0xba, 0x50, 0x42, 0x33, 0xec,\n  0xbd, 0x3b, 0xc4, 0x7b, 0xef, 0x17, 0x18, 0x4b, 0x60, 0x41, 0xb1, 0xf3,\n  0xee, 0x80, 0xd8, 0x23, 0x36, 0x2e, 0xa9, 0xcb, 0x71, 0x85, 0xf0, 0xbc,\n  0xbb, 0x93, 0xcd, 0xc5, 0xa4, 0x98, 0x8b, 0x04, 0xcc, 0x85, 0x9f, 0xf1,\n  0x67, 0x40, 0xf0, 0x61, 0x23, 0xa7, 0x87, 0xb9, 0xf8, 0x67, 0x36, 0x17,\n  0x3b, 0x45, 0x79, 0x58, 0xd0, 0x1f, 0xc9, 0xa1, 0x7f, 0x8a, 0x56, 0x0a,\n  0xfa, 0x23, 0x39, 0xf4, 0x4f, 0x91, 0x57, 0xc4, 0x59, 0xf9, 0x48, 0xce,\n  0x37, 0xd0, 0xa7, 0xf8, 0x37, 0x50, 0x61, 0x23, 0x6c, 0xd0, 0xf7, 0x5f,\n  0x72, 0x68, 0xe1, 0x1a, 0x72, 0x29, 0xe7, 0xd5, 0xa5, 0x39, 0x73, 0x2a,\n  0xb7, 0x19, 0x73, 0x3a, 0x43, 0xfe, 0x9c, 0xe5, 0x03, 0x2b, 0xdf, 0xc1,\n  0xc6, 0x32, 0x23, 0xb0, 0x76, 0x9b, 0xa1, 0xcd, 0x5f, 0xc8, 0x1e, 0x28,\n  0xc7, 0xa0, 0x48, 0x4d, 0xb9, 0x92, 0xbc, 0x64, 0x9c, 0xb9, 0x0f, 0xe1,\n  0xf7, 0x6e, 0x9a, 0x16, 0xbc, 0xfd, 0x9b, 0x25, 0xdf, 0xbb, 0xf1, 0xde,\n  0x64, 0xab, 0xac, 0x02, 0xcd, 0x55, 0x58, 0x57, 0x7d, 0x81, 0x7c, 0x2d,\n  0x5f, 0xb9, 0x16, 0x22, 0xff, 0x9c, 0xa7, 0x5c, 0x55, 0xff, 0x58, 0x46,\n  0xf2, 0x96, 0xbf, 0x1d, 0xcb, 0x5f, 0xfe, 0x5a, 0x20, 0x7f, 0xf9, 0x3b,\n  0x41, 0x73, 0xf9, 0x0e, 0xa3, 0xfc, 0x75, 0x7f, 0xfe, 0xf2, 0x33, 0xb6,\n  0xac, 0xfc, 0x5c, 0xcd, 0xce, 0xcf, 0xf8, 0x79, 0x54, 0x55, 0x5f, 0xf8,\n  0xce, 0x33, 0xfc, 0x04, 0xbf, 0xf0, 0x8c, 0x19, 0x13, 0xcb, 0x4c, 0xa3,\n  0x85, 0x0a, 0xd0, 0xfc, 0x4a, 0x7a, 0x16, 0x64, 0x2a, 0xbe, 0x1f, 0x78,\n  0xa5, 0xfe, 0x71, 0xe1, 0xbc, 0x05, 0x46, 0x25, 0x09, 0x2a, 0x41, 0xf3,\n  0x0a, 0xa7, 0x39, 0x82, 0x34, 0x6f, 0x2f, 0x5c, 0x94, 0x97, 0xe6, 0x19,\n  0xe9, 0x47, 0x48, 0xb3, 0x0e, 0x69, 0x5e, 0x5b, 0x58, 0xb7, 0xf0, 0x3d,\n  0x41, 0xf3, 0x3d, 0x13, 0xcd, 0xf7, 0xa0, 0x9d, 0xa4, 0xfa, 0x0e, 0x3c,\n  0x7d, 0x86, 0xaa, 0x24, 0xbe, 0x5e, 0xe4, 0xed, 0xd3, 0xdb, 0x59, 0xf8,\n  0x1d, 0xd0, 0xfc, 0x50, 0xae, 0x07, 0x9a, 0xd7, 0x17, 0x8e, 0x73, 0x9a,\n  0xcd, 0x85, 0x68, 0x12, 0xf8, 0x0c, 0xde, 0x75, 0x06, 0x29, 0x17, 0xf5,\n  0xa7, 0x01, 0x64, 0xe3, 0x5b, 0x8c, 0xcf, 0xd7, 0x8a, 0xf9, 0xfd, 0x00,\n  0xc9, 0x53, 0x0e, 0xf3, 0x7b, 0x7d, 0x9e, 0x72, 0x98, 0xdf, 0xd7, 0x49,\n  0xde, 0xf2, 0xb7, 0xdf, 0xca, 0x5f, 0xfe, 0xda, 0x2b, 0xf9, 0xcb, 0xdf,\n  0x79, 0x35, 0xcb, 0xe7, 0x21, 0xc6, 0xc3, 0xda, 0xf5, 0x6c, 0xbe, 0x1e,\n  0x7d, 0x86, 0x5b, 0x75, 0x8b, 0xe6, 0xc2, 0x44, 0xa3, 0x85, 0x1e, 0xce,\n  0x4f, 0xf3, 0x2c, 0xf2, 0x90, 0xd4, 0x92, 0x5f, 0x13, 0xf3, 0x8c, 0x51,\n  0x69, 0x31, 0xdd, 0xf7, 0x04, 0xdd, 0x8b, 0xc4, 0x3c, 0x6b, 0x4b, 0xe9,\n  0x1e, 0x17, 0x74, 0x3f, 0x22, 0xfa, 0xcc, 0xbd, 0x1b, 0xba, 0x77, 0xf2,\n  0xd2, 0xe1, 0x5d, 0x59, 0x29, 0x1b, 0xff, 0x75, 0x82, 0xef, 0x4f, 0xe5,\n  0x2b, 0x07, 0xbe, 0x7f, 0x23, 0x4f, 0x39, 0xf0, 0xbd, 0x8e, 0xe4, 0x2d,\n  0x7f, 0xbb, 0x3d, 0x7f, 0xf9, 0x6b, 0x35, 0xf9, 0xcb, 0xdf, 0x49, 0x98,\n  0xcb, 0x77, 0x18, 0xe5, 0xaf, 0xc7, 0xf3, 0x97, 0x9f, 0x09, 0x65, 0xc7,\n  0xf9, 0x0c, 0x9b, 0x83, 0x86, 0x35, 0xcb, 0xcd, 0xd3, 0x73, 0x9c, 0x66,\n  0xd3, 0x32, 0xf3, 0x24, 0xef, 0x64, 0xfc, 0x6a, 0x20, 0x3f, 0x5b, 0x7e,\n  0x9e, 0xe4, 0x2d, 0x82, 0xee, 0x87, 0xcb, 0xcf, 0x93, 0x7c, 0xbe, 0xa0,\n  0xfb, 0xd5, 0xf2, 0xf3, 0x24, 0xcf, 0x0b, 0xba, 0xe7, 0x0b, 0xcf, 0x13,\n  0xae, 0x21, 0xf9, 0x28, 0xae, 0x33, 0xa0, 0x7b, 0x95, 0xd1, 0xbd, 0x2e,\n  0x56, 0xd1, 0x52, 0xba, 0x83, 0x82, 0xee, 0xb7, 0xc4, 0xbc, 0xda, 0x72,\n  0xdf, 0xbb, 0x16, 0x73, 0x07, 0x32, 0xfe, 0x9f, 0x66, 0xfc, 0x7c, 0x41,\n  0xe3, 0xe5, 0x63, 0xb9, 0xe5, 0x5a, 0xe8, 0x6d, 0x22, 0x74, 0xba, 0xb9,\n  0x1c, 0xb9, 0xb3, 0x5f, 0xd8, 0x04, 0xb9, 0xe5, 0xc0, 0x0d, 0x56, 0xee,\n  0x5e, 0x54, 0xfe, 0xda, 0xc2, 0x1e, 0xbe, 0xbf, 0x2e, 0x2a, 0x7f, 0x67,\n  0x61, 0x2f, 0xeb, 0xf7, 0x8f, 0x59, 0xf9, 0x0e, 0xa3, 0xfc, 0xf5, 0x05,\n  0xe6, 0x33, 0xb4, 0xf0, 0xe4, 0xa2, 0xf2, 0x33, 0x0b, 0x9b, 0x0c, 0xdb,\n  0xe5, 0x13, 0x6c, 0x4e, 0x1b, 0x2f, 0x59, 0x66, 0xde, 0xe9, 0xdd, 0x9c,\n  0xe6, 0xe8, 0x72, 0xeb, 0xb3, 0x85, 0xf1, 0xbf, 0x91, 0x7b, 0x59, 0x2f,\n  0xb3, 0x3e, 0xab, 0x39, 0x1d, 0x79, 0xf3, 0x1c, 0xeb, 0x73, 0xa5, 0x68,\n  0xcf, 0x7f, 0x8e, 0xf5, 0x99, 0x4b, 0x57, 0x70, 0xde, 0xa5, 0x21, 0x36,\n  0x9f, 0x8d, 0x78, 0x0c, 0x58, 0x6e, 0xde, 0xa5, 0x55, 0x82, 0x2e, 0xb4,\n  0xcc, 0xbc, 0xf3, 0xef, 0x0f, 0xc0, 0x7f, 0xc4, 0x99, 0x61, 0xeb, 0xfd,\n  0x0b, 0xf9, 0xca, 0x61, 0xbd, 0x3f, 0x90, 0xa7, 0x1c, 0xd6, 0xbb, 0x87,\n  0xe4, 0x2d, 0x7f, 0xbb, 0x3c, 0x7f, 0xf9, 0x6b, 0x45, 0xf9, 0xcb, 0xdf,\n  0x29, 0xd6, 0x6d, 0xcd, 0x37, 0xa5, 0xbf, 0xb2, 0x7d, 0xa8, 0xbd, 0x2e,\n  0x3b, 0x8f, 0x8b, 0xf6, 0xbc, 0x85, 0x37, 0xc1, 0x6a, 0x60, 0x34, 0xab,\n  0xb2, 0xf3, 0xb8, 0x94, 0xe6, 0x41, 0xa0, 0x49, 0x92, 0x76, 0xf2, 0x13,\n  0x92, 0x77, 0x67, 0x34, 0xe8, 0x3e, 0x25, 0xe8, 0x72, 0xd7, 0xef, 0x52,\n  0xba, 0x63, 0x82, 0xee, 0x9e, 0x9c, 0x79, 0x5c, 0x4a, 0x77, 0x5c, 0xd0,\n  0xdd, 0x9b, 0x33, 0x8f, 0xb9, 0x74, 0x78, 0xbe, 0x69, 0x61, 0x72, 0xff,\n  0x01, 0xc1, 0xf7, 0x47, 0xf3, 0x95, 0x03, 0xdf, 0xff, 0x29, 0x4f, 0x39,\n  0xf0, 0x3d, 0x48, 0xf2, 0x96, 0xbf, 0x5d, 0x9d, 0xbf, 0xfc, 0x35, 0x6f,\n  0xfe, 0xf2, 0x77, 0x7c, 0xe6, 0xf2, 0x1d, 0x46, 0xf9, 0xeb, 0x9e, 0xfc,\n  0xe5, 0x67, 0xd4, 0xac, 0xbc, 0x7e, 0x03, 0xd7, 0x12, 0x72, 0x1f, 0xec,\n  0xc1, 0x7e, 0xc4, 0xb9, 0x13, 0x18, 0x2b, 0x26, 0x9b, 0x42, 0x9e, 0x61,\n  0xf6, 0x02, 0xe3, 0x29, 0x52, 0xd1, 0x52, 0x92, 0x63, 0x0d, 0x18, 0x3a,\n  0x6f, 0x9f, 0xc9, 0xae, 0x40, 0xba, 0xa6, 0xa5, 0x74, 0x0b, 0xef, 0x00,\n  0xdd, 0xad, 0x68, 0x37, 0xa8, 0x67, 0x4e, 0x73, 0xaa, 0x2d, 0x64, 0x91,\n  0x6d, 0x41, 0x7a, 0xa0, 0xbf, 0x3f, 0x66, 0xe3, 0xfb, 0x10, 0xe7, 0x2b,\n  0xb5, 0x93, 0x3c, 0xe5, 0xc0, 0xd7, 0xb3, 0x79, 0xca, 0x81, 0xaf, 0x17,\n  0x90, 0xbc, 0xe5, 0x6f, 0x1f, 0xcf, 0x5f, 0xfe, 0xda, 0x79, 0xf9, 0xcb,\n  0xdf, 0xd9, 0x6f, 0x2e, 0xdf, 0x61, 0x94, 0xbf, 0xbe, 0x2f, 0x7f, 0xf9,\n  0x99, 0xd9, 0x2c, 0x2f, 0x4a, 0x50, 0xb6, 0xe9, 0x25, 0xc9, 0x65, 0xf4,\n  0x98, 0x5c, 0xcd, 0x69, 0xba, 0x97, 0xdb, 0xbf, 0xbe, 0x86, 0x72, 0x48,\n  0x2f, 0x11, 0x72, 0x5d, 0x78, 0xff, 0xfa, 0xb2, 0xa0, 0xfb, 0xde, 0x39,\n  0xf6, 0xaf, 0x3b, 0x05, 0xdd, 0xa7, 0xcf, 0xb1, 0x7f, 0xdd, 0x25, 0xe8,\n  0xfe, 0xe1, 0x1c, 0xfb, 0xd7, 0x1d, 0xa8, 0x9f, 0x80, 0xee, 0xfe, 0x65,\n  0xf4, 0x18, 0xce, 0xf9, 0xe7, 0x05, 0xdd, 0xbf, 0x32, 0x4b, 0x19, 0xe6,\n  0xde, 0x4c, 0xa5, 0xdb, 0xd8, 0xd2, 0x19, 0xdd, 0xc6, 0xd6, 0x9c, 0x4e,\n  0x93, 0xed, 0x6d, 0x2a, 0x0f, 0x36, 0x99, 0x6c, 0x3c, 0x56, 0x7e, 0x2d,\n  0xa7, 0xff, 0x65, 0xfe, 0xf2, 0xa0, 0x64, 0xb2, 0x35, 0x58, 0xf9, 0x75,\n  0x9c, 0xbe, 0x3c, 0x7f, 0x79, 0xb0, 0x5f, 0xe0, 0x96, 0xb1, 0x3c, 0xbc,\n  0x67, 0xf4, 0x3d, 0x4a, 0x73, 0x2e, 0xcc, 0xb2, 0xf2, 0x0d, 0x8b, 0xca,\n  0x83, 0x0b, 0x97, 0x66, 0x75, 0x21, 0x96, 0x73, 0x5d, 0xa8, 0x39, 0x15,\n  0x92, 0xb7, 0x3c, 0x58, 0x63, 0x5a, 0x93, 0xac, 0x9d, 0x0f, 0x70, 0x7a,\n  0x5b, 0xfe, 0xf2, 0x60, 0xbd, 0x49, 0xd6, 0x58, 0xf9, 0x87, 0x38, 0xfd,\n  0xb6, 0xfc, 0xe5, 0xc1, 0x2b, 0xf4, 0xf7, 0xc6, 0x4d, 0x67, 0x9c, 0x24,\n  0x3f, 0x5b, 0x81, 0x8c, 0xbe, 0xe8, 0xcc, 0xfb, 0x9c, 0x9f, 0xb1, 0x0a,\n  0x3e, 0x4f, 0xb0, 0xb3, 0x16, 0x7b, 0x9a, 0xe7, 0x19, 0x9e, 0xb7, 0x0a,\n  0x3d, 0xc3, 0x33, 0x57, 0xa1, 0x67, 0x78, 0xee, 0xca, 0x7d, 0xb6, 0xc3,\n  0x78, 0x86, 0x67, 0xaf, 0x42, 0xcf, 0xf0, 0xfc, 0xa5, 0x3f, 0x43, 0x5d,\n  0xfd, 0x75, 0x7e, 0x2e, 0x62, 0x77, 0xe7, 0xa7, 0xa5, 0x4b, 0x4c, 0x67,\n  0x31, 0x79, 0xc9, 0x7e, 0xf2, 0x75, 0xae, 0xef, 0xbe, 0xf6, 0x0c, 0xaf,\n  0x01, 0x27, 0x53, 0x56, 0xc3, 0xac, 0xf5, 0x74, 0x5a, 0x25, 0xca, 0xf4,\n  0x19, 0x5f, 0x73, 0xe2, 0x6c, 0x06, 0xd4, 0x3f, 0x5b, 0xa2, 0xaf, 0x90,\n  0xb6, 0x31, 0xab, 0x23, 0x91, 0xf6, 0x28, 0xa7, 0xfd, 0x75, 0x5e, 0xda,\n  0x00, 0xa3, 0xe5, 0x6b, 0x0f, 0x68, 0xe7, 0x38, 0xed, 0x33, 0x79, 0x69,\n  0x43, 0x59, 0x9d, 0x8a, 0xb4, 0xdb, 0x39, 0xed, 0xf7, 0xc9, 0x92, 0xf3,\n  0x18, 0xf6, 0x37, 0x7b, 0x66, 0x43, 0xda, 0xf9, 0x02, 0xfd, 0x35, 0xd1,\n  0x9e, 0xd1, 0x69, 0x77, 0x17, 0x1a, 0x5b, 0xae, 0x4d, 0x9f, 0xe4, 0x67,\n  0x09, 0xd0, 0xc9, 0x2f, 0x2e, 0x1c, 0xc8, 0x63, 0xf3, 0x27, 0xf9, 0x99,\n  0xa2, 0xe0, 0xf3, 0x04, 0x3b, 0x5b, 0x88, 0xa7, 0x79, 0x9f, 0xe3, 0x19,\n  0x63, 0xb9, 0xe7, 0x78, 0xd6, 0x58, 0xee, 0x39, 0x9e, 0x39, 0x96, 0x3e,\n  0xdf, 0x61, 0x3c, 0xc7, 0xb3, 0xc7, 0x72, 0xcf, 0xf1, 0x0c, 0x62, 0x7e,\n  0x8e, 0x73, 0x70, 0x3d, 0x3f, 0x67, 0xcc, 0xe2, 0x73, 0xd0, 0xe5, 0xc8,\n  0x29, 0xb9, 0x9f, 0x71, 0x8a, 0x2e, 0x91, 0x99, 0xab, 0x39, 0x2d, 0x9c,\n  0xa9, 0xc5, 0xae, 0x0a, 0xb4, 0x5d, 0xf9, 0x69, 0x2d, 0x7e, 0x71, 0x46,\n  0x78, 0x99, 0x71, 0x96, 0xc9, 0x19, 0xa3, 0x7f, 0x9a, 0xd3, 0x2f, 0xb6,\n  0x49, 0x2c, 0x3e, 0x41, 0xff, 0x3b, 0x46, 0x2f, 0xf6, 0x63, 0xa0, 0xff,\n  0xb7, 0x02, 0xf4, 0x76, 0x41, 0xff, 0x1f, 0x8c, 0xfe, 0x35, 0xbe, 0x2f,\n  0x03, 0xfd, 0xb7, 0xdf, 0x15, 0xfd, 0x3b, 0xcb, 0xd1, 0xa3, 0x0c, 0x59,\n  0x2a, 0xc4, 0x99, 0xe4, 0x0d, 0x46, 0xcf, 0xef, 0x0a, 0x90, 0xfe, 0x47,\n  0x05, 0xe8, 0xbd, 0xd9, 0x33, 0x8c, 0x2e, 0x7b, 0x8c, 0xfe, 0xa9, 0x3c,\n  0xfd, 0xe9, 0x81, 0x35, 0x9f, 0xdd, 0x8b, 0x93, 0xdc, 0x06, 0xc0, 0x55,\n  0xbf, 0x2f, 0xef, 0x73, 0x6e, 0x0b, 0x14, 0x7c, 0x9e, 0x60, 0x36, 0x01,\n  0x7b, 0x9a, 0xe7, 0x19, 0xda, 0x05, 0x85, 0x9e, 0xa1, 0x6d, 0x50, 0xe8,\n  0xd9, 0x3b, 0x73, 0x8b, 0x9f, 0xed, 0x30, 0x9e, 0xbd, 0xbe, 0xab, 0xf0,\n  0x33, 0xb4, 0x13, 0xf4, 0x67, 0x28, 0x33, 0x77, 0x70, 0x3b, 0xa0, 0xd7,\n  0x2c, 0x5f, 0x63, 0x05, 0xe4, 0xeb, 0x63, 0x9c, 0x76, 0x8c, 0xe9, 0x3a,\n  0x79, 0x33, 0x59, 0xc6, 0x76, 0xb6, 0xd4, 0x65, 0x6d, 0x07, 0x46, 0xfd,\n  0xcb, 0xe5, 0x6d, 0xe8, 0x02, 0xf4, 0x05, 0x6d, 0x69, 0x8b, 0x53, 0xd0,\n  0x7f, 0x51, 0xd0, 0x3f, 0xb6, 0xbc, 0x4d, 0x6d, 0x29, 0x16, 0xf4, 0x8f,\n  0x0a, 0xfa, 0x27, 0x0a, 0xdb, 0xd6, 0x4c, 0x47, 0x2d, 0x08, 0x9b, 0xe1,\n  0xd3, 0x82, 0xfe, 0x4b, 0x39, 0x36, 0xc6, 0x12, 0x7a, 0x8b, 0x5d, 0xd0,\n  0x7f, 0x41, 0xd0, 0x7f, 0x9b, 0xe4, 0xbd, 0x99, 0x32, 0xd9, 0x15, 0xbf,\n  0xd6, 0xed, 0x0a, 0x3a, 0x7d, 0xa9, 0xb9, 0xfc, 0x3e, 0xa3, 0x7c, 0xea,\n  0x72, 0xd3, 0x7e, 0x68, 0xd8, 0x21, 0x09, 0x66, 0x9f, 0xe4, 0xec, 0x4f,\n  0xe8, 0x2f, 0x23, 0xee, 0x07, 0x73, 0xf6, 0x50, 0x53, 0x1d, 0xb4, 0x5d,\n  0xb2, 0x75, 0xf0, 0x3d, 0x2f, 0x1a, 0xef, 0x59, 0x3f, 0x6b, 0xae, 0xa3,\n  0x97, 0x27, 0x58, 0xb9, 0xb1, 0xd7, 0xe1, 0x5d, 0x22, 0x8b, 0x59, 0x8a,\n  0x8b, 0x58, 0xa5, 0x6b, 0x96, 0xf8, 0x3a, 0x71, 0x9a, 0x59, 0x83, 0x66,\n  0x8a, 0x5c, 0x9b, 0x9f, 0x46, 0x7a, 0x49, 0xa7, 0x01, 0xdb, 0x66, 0x74,\n  0xe1, 0xb7, 0x42, 0x82, 0x7e, 0x6b, 0xba, 0x27, 0x34, 0xd3, 0x04, 0x17,\n  0x92, 0x4b, 0x69, 0x60, 0x3f, 0x7d, 0x42, 0x7a, 0x5a, 0xec, 0xbd, 0xb8,\n  0x7f, 0x5c, 0xc3, 0x72, 0x74, 0x8c, 0x49, 0x9b, 0xc8, 0x23, 0xb2, 0x4a,\n  0x8a, 0x49, 0xfd, 0xe7, 0xd5, 0xf3, 0x86, 0xd3, 0x55, 0x50, 0x86, 0x51,\n  0x4f, 0xe4, 0x06, 0x22, 0x51, 0x2a, 0xcd, 0x11, 0x49, 0xc2, 0xb8, 0x56,\n  0x89, 0xae, 0x8f, 0x7b, 0xdc, 0xb2, 0xb5, 0xb4, 0xe1, 0xf3, 0x2a, 0x19,\n  0xc6, 0x0f, 0x73, 0x29, 0xd3, 0x47, 0x95, 0xb1, 0x68, 0x69, 0xa0, 0xb2,\n  0x32, 0x10, 0x2a, 0xef, 0x90, 0x36, 0xd5, 0x48, 0xe1, 0x92, 0x60, 0xa8,\n  0x2c, 0x10, 0x29, 0x4b, 0xf5, 0x43, 0x33, 0x6f, 0x2d, 0xc4, 0xe9, 0xf5,\n  0x0b, 0xdf, 0x26, 0x45, 0x64, 0x33, 0xb6, 0xff, 0x88, 0x46, 0xb9, 0xb3,\n  0x5d, 0xd1, 0xba, 0xad, 0xe9, 0xa0, 0x8c, 0x38, 0x40, 0xd2, 0x31, 0x82,\n  0x11, 0xc4, 0xf8, 0x49, 0x83, 0xee, 0x85, 0x1a, 0x74, 0x43, 0x79, 0x3a,\n  0x80, 0x4f, 0xa4, 0xd3, 0x8b, 0x1f, 0xcc, 0xa5, 0x1d, 0xf0, 0x43, 0x11,\n  0x29, 0xaa, 0x89, 0x2a, 0xd6, 0x10, 0xeb, 0x8a, 0xc5, 0xef, 0x33, 0xe7,\n  0x2f, 0xa1, 0xab, 0xab, 0x6d, 0x1e, 0xd5, 0x1a, 0xf1, 0xc5, 0x1b, 0x06,\n  0xbb, 0xea, 0x15, 0xda, 0x27, 0xab, 0xcd, 0x6d, 0x2b, 0xf1, 0x5e, 0x85,\n  0x8f, 0x53, 0x02, 0x6b, 0x83, 0xf1, 0xf5, 0xb8, 0xb4, 0x8b, 0xfe, 0x42,\n  0x7a, 0x11, 0x67, 0x73, 0x02, 0xbf, 0x93, 0x9e, 0x94, 0x2e, 0xa0, 0x3f,\n  0x97, 0x77, 0x30, 0x6c, 0x93, 0x26, 0xb2, 0x9e, 0xf1, 0x62, 0x14, 0xf1,\n  0xce, 0x15, 0x99, 0x28, 0x07, 0x09, 0xb5, 0x5b, 0x24, 0x59, 0xa3, 0xf2,\n  0x41, 0x1b, 0x48, 0xa9, 0xaa, 0xcd, 0x21, 0x66, 0x86, 0xba, 0xc7, 0x69,\n  0x75, 0xc8, 0xaa, 0xa6, 0xae, 0x8f, 0x45, 0x11, 0xe0, 0xa4, 0x2e, 0x19,\n  0x6d, 0x8a, 0x35, 0x65, 0x61, 0x4e, 0xa2, 0x51, 0x4f, 0x34, 0xea, 0xb2,\n  0x96, 0x73, 0x96, 0xe5, 0xfd, 0x82, 0x19, 0x2c, 0xe0, 0xf6, 0x7b, 0x32,\n  0xaf, 0xd7, 0x6e, 0xf5, 0x22, 0xe7, 0x5e, 0xe9, 0xf7, 0xe6, 0x8f, 0x96,\n  0xd7, 0x2e, 0x76, 0xde, 0xcd, 0x63, 0x33, 0x27, 0x98, 0x2d, 0xbd, 0x64,\n  0x4f, 0x65, 0xeb, 0xe1, 0xba, 0xa5, 0xb6, 0x80, 0xa9, 0x1e, 0xda, 0xda,\n  0x4b, 0xeb, 0xbd, 0xa8, 0xdb, 0xe2, 0x74, 0xfd, 0xf9, 0xf9, 0xca, 0x13,\n  0xac, 0xdc, 0x54, 0x8f, 0xdd, 0x93, 0x74, 0x4b, 0x4f, 0xe2, 0x9d, 0xed,\n  0x18, 0x97, 0xe7, 0xe8, 0x42, 0xce, 0x69, 0x0a, 0x63, 0x61, 0x80, 0xa6,\n  0x93, 0xd3, 0x0c, 0x73, 0x79, 0xb6, 0x2e, 0xa1, 0xf9, 0x4f, 0x76, 0x5f,\n  0x8b, 0x34, 0x0d, 0x53, 0xbc, 0x9d, 0xc6, 0x25, 0x34, 0x6f, 0x02, 0xcd,\n  0x4f, 0x39, 0xcd, 0x16, 0xde, 0x8e, 0xb6, 0x98, 0x86, 0xec, 0x01, 0xdd,\n  0xd5, 0xc4, 0x69, 0xc4, 0xba, 0xf8, 0x0d, 0x8b, 0x29, 0xff, 0x7b, 0x69,\n  0x13, 0x7d, 0x80, 0xad, 0x8b, 0x52, 0x72, 0x3b, 0x4a, 0x83, 0x91, 0xb1,\n  0x87, 0x62, 0xaa, 0x35, 0x82, 0x90, 0x37, 0xca, 0x04, 0xcb, 0xd8, 0x43,\n  0xe5, 0x6c, 0x81, 0xc8, 0xd8, 0x53, 0x05, 0x22, 0xab, 0x50, 0xa2, 0x9c,\n  0xc2, 0x5c, 0xd5, 0xd7, 0xa3, 0xcf, 0x0d, 0x2c, 0x25, 0x74, 0xcc, 0x11,\n  0x6b, 0x09, 0x33, 0xdf, 0xca, 0x12, 0x26, 0x12, 0x3d, 0x95, 0x43, 0x49,\n  0x10, 0x4d, 0xc7, 0xb4, 0xe6, 0xe6, 0xd2, 0xae, 0x92, 0x92, 0x92, 0xd2,\n  0x92, 0xd2, 0x52, 0x58, 0x7d, 0xaa, 0xb5, 0x2c, 0xef, 0xea, 0xeb, 0x66,\n  0x90, 0x0e, 0xe8, 0x15, 0xfc, 0xf7, 0xc6, 0x3a, 0xbc, 0x3f, 0xdc, 0x5d,\n  0xb2, 0xdb, 0x5a, 0xe6, 0xc8, 0x5d, 0x8f, 0x4a, 0x6c, 0x43, 0x95, 0x3d,\n  0xba, 0xa1, 0xd2, 0xc9, 0xf3, 0x6e, 0x7d, 0x0e, 0xc6, 0xf8, 0xbf, 0xf3,\n  0x8c, 0x31, 0x00, 0xbd, 0x75, 0x9b, 0xc7, 0x08, 0x05, 0xb2, 0xfb, 0xff,\n  0xed, 0x18, 0xb9, 0x2b, 0x00, 0x2c, 0xbd, 0xcf, 0x19, 0x63, 0x1c, 0x77,\n  0x94, 0x6b, 0xbb, 0x4b, 0xba, 0x2a, 0x16, 0x8d, 0xd1, 0x59, 0xb9, 0x21,\n  0x6a, 0xaf, 0xda, 0x10, 0xe3, 0x63, 0x3c, 0x29, 0x4d, 0x8a, 0x75, 0x1d,\n  0x27, 0x6b, 0xd8, 0xaa, 0x4e, 0x07, 0xa8, 0x3a, 0x01, 0xa7, 0x2f, 0xf5,\n  0x06, 0xd3, 0xf2, 0xb6, 0xc1, 0xf2, 0xb6, 0xc2, 0xf2, 0x26, 0x56, 0x4d,\n  0xb3, 0xce, 0x09, 0x4f, 0x28, 0xab, 0x06, 0xa6, 0x61, 0x75, 0x65, 0x79,\n  0x59, 0x28, 0x68, 0xac, 0x67, 0xfb, 0xf2, 0xeb, 0x59, 0xef, 0xf6, 0x72,\n  0xcb, 0x78, 0x1c, 0x47, 0xd0, 0x19, 0x0c, 0xb7, 0xe5, 0xae, 0xdf, 0x4f,\n  0x44, 0x24, 0xb7, 0xdd, 0x13, 0x6a, 0x08, 0x85, 0xeb, 0xda, 0xf8, 0x5a,\n  0x79, 0x85, 0x9d, 0x5f, 0x7f, 0xad, 0xdf, 0x05, 0xd3, 0xe9, 0x7f, 0x11,\n  0x39, 0x50, 0x58, 0xf9, 0x7d, 0x46, 0xf9, 0xd4, 0xe3, 0xbc, 0xfc, 0x05,\n  0x76, 0x57, 0x6b, 0x37, 0xce, 0xbb, 0xf6, 0x85, 0x7d, 0xac, 0xfc, 0xe7,\n  0x8b, 0xca, 0x1d, 0xe6, 0xbb, 0x5d, 0xb6, 0x56, 0x79, 0x3b, 0xeb, 0x3f,\n  0xc9, 0xdb, 0x79, 0x6e, 0xd1, 0x9d, 0xef, 0x4b, 0xe2, 0xee, 0x18, 0xd1,\n  0xce, 0x27, 0xd9, 0x9e, 0xd6, 0xc8, 0xf7, 0xb4, 0x85, 0x57, 0x96, 0x7c,\n  0x47, 0xc5, 0xbb, 0xd4, 0x41, 0xb6, 0xa7, 0x35, 0x0a, 0x3f, 0xd8, 0x3f,\n  0x2e, 0xa6, 0x41, 0x1d, 0x40, 0x6f, 0x67, 0x6b, 0xae, 0xf1, 0xbc, 0x42,\n  0x3a, 0x00, 0x69, 0x3e, 0xc4, 0x69, 0x0e, 0xb3, 0xb5, 0x9b, 0x79, 0x2b,\n  0x97, 0x06, 0xe6, 0xf6, 0x4e, 0x90, 0xdf, 0xbf, 0xcd, 0xbf, 0x46, 0x11,\n  0xe6, 0x42, 0x5a, 0xbc, 0x46, 0xa5, 0x45, 0xf2, 0x2b, 0x81, 0x54, 0x4a,\n  0x86, 0xfc, 0xb2, 0xbd, 0x06, 0xa3, 0xc8, 0x50, 0x2e, 0x89, 0x90, 0x5f,\n  0xf8, 0x17, 0xca, 0xaf, 0x99, 0x12, 0x76, 0x0b, 0xb1, 0x29, 0x71, 0x3a,\n  0x43, 0x7e, 0xfd, 0x1e, 0x5f, 0x8d, 0x2e, 0xbf, 0x34, 0x61, 0x72, 0x39,\n  0xf0, 0x05, 0x82, 0x41, 0x63, 0x8d, 0x52, 0xd2, 0xd7, 0x59, 0x1e, 0x42,\n  0x11, 0x2e, 0x8d, 0x5e, 0x64, 0xac, 0x52, 0xb5, 0x3f, 0x55, 0x16, 0x09,\n  0x80, 0xa0, 0x95, 0x84, 0xa5, 0xf2, 0xec, 0x2a, 0x5d, 0x76, 0x8d, 0x12,\n  0xb7, 0x79, 0x8c, 0x62, 0x8d, 0xfe, 0xbf, 0x1c, 0xa3, 0xb1, 0x46, 0x69,\n  0x65, 0x76, 0x8c, 0x7e, 0x63, 0x95, 0xe6, 0x8c, 0x31, 0xbb, 0x4a, 0x0b,\n  0xac, 0x51, 0xeb, 0x04, 0xac, 0x45, 0xeb, 0xe2, 0x35, 0xaa, 0xe2, 0x1a,\n  0x55, 0x61, 0xef, 0x9d, 0x13, 0x31, 0xf3, 0x2a, 0xae, 0xd1, 0x78, 0x0c,\n  0xd3, 0xdd, 0xbe, 0xdb, 0x35, 0x2a, 0xba, 0x2d, 0x7a, 0x9d, 0x7f, 0x8d,\n  0x7e, 0x65, 0xa0, 0xad, 0x22, 0xd0, 0x89, 0xfd, 0x5f, 0xb4, 0x48, 0x2d,\n  0x6d, 0x75, 0x61, 0x58, 0xa3, 0x1e, 0xbb, 0x5b, 0x32, 0xdd, 0x01, 0xfd,\n  0x5a, 0xbf, 0x03, 0xa2, 0xd3, 0x97, 0x98, 0xef, 0x86, 0xee, 0x33, 0xca,\n  0xa7, 0xde, 0x6b, 0xbe, 0xdf, 0xb5, 0x1b, 0x77, 0x46, 0x76, 0x7f, 0xfe,\n  0x72, 0x87, 0x71, 0x1f, 0x5c, 0x22, 0x25, 0xd8, 0x39, 0xe6, 0x36, 0x71,\n  0x6f, 0xfd, 0xad, 0x7c, 0xe5, 0x70, 0xa6, 0xfa, 0x82, 0xe9, 0xbd, 0x2f,\n  0x1a, 0xef, 0x5d, 0xbf, 0x29, 0xff, 0xbd, 0xf2, 0x4b, 0x5e, 0xb3, 0x5f,\n  0xc5, 0x87, 0x0d, 0xbf, 0x8a, 0x69, 0xb2, 0x23, 0x9f, 0x9f, 0x0a, 0xd0,\n  0xcc, 0x1a, 0x34, 0x53, 0x64, 0x57, 0xbe, 0x35, 0x2d, 0x3d, 0x01, 0xeb,\n  0x35, 0x09, 0x34, 0x1f, 0x20, 0x79, 0x57, 0x35, 0xa3, 0x7b, 0x4b, 0xec,\n  0xdb, 0x48, 0x77, 0xb7, 0xb0, 0x56, 0x6d, 0x0b, 0x4f, 0x0b, 0xba, 0xa7,\n  0x73, 0xbe, 0xcf, 0x9c, 0x62, 0xe7, 0xf3, 0x8e, 0x2d, 0x79, 0xcf, 0x4d,\n  0x20, 0xb7, 0x57, 0x48, 0xfb, 0xe8, 0x77, 0x64, 0x3b, 0xb1, 0x31, 0xab,\n  0xed, 0x3c, 0x26, 0x39, 0x76, 0xcc, 0x57, 0x6e, 0xa3, 0x84, 0x61, 0x4b,\n  0x44, 0x11, 0xf7, 0x8d, 0xe8, 0xfe, 0x7d, 0x44, 0x9a, 0x43, 0xd7, 0x34,\n  0xb2, 0xc7, 0x22, 0x4b, 0x88, 0x48, 0x5e, 0x9e, 0xae, 0x66, 0xcf, 0x08,\n  0xe6, 0x6f, 0x27, 0xf2, 0x29, 0xa4, 0x91, 0x39, 0x0d, 0x0b, 0x98, 0x96,\n  0x64, 0x90, 0x7b, 0x5b, 0x3c, 0x1e, 0x4f, 0xf8, 0x4a, 0x54, 0x6b, 0x98,\n  0xcb, 0x7c, 0x4c, 0x5f, 0xc8, 0x49, 0x93, 0x47, 0x51, 0xb7, 0xe9, 0xdf,\n  0x74, 0x43, 0xbd, 0x58, 0xd5, 0xcf, 0x95, 0x7b, 0x99, 0xa1, 0x56, 0xfe,\n  0x7a, 0x99, 0xcf, 0x13, 0x0e, 0x7b, 0x7c, 0x65, 0xd2, 0xa1, 0xd8, 0x26,\n  0x58, 0xda, 0x9b, 0x2a, 0xab, 0x72, 0x2d, 0xb5, 0xd2, 0x7c, 0xe3, 0xb9,\n  0x82, 0x8f, 0x47, 0xe5, 0x7e, 0xe9, 0xb2, 0x3e, 0x9e, 0x30, 0xf3, 0x2c,\n  0x87, 0xee, 0x41, 0xd9, 0x1c, 0x86, 0x75, 0xd3, 0x3d, 0x56, 0x45, 0x93,\n  0x54, 0x2c, 0x81, 0x21, 0xc5, 0xd8, 0x63, 0x15, 0x2b, 0xc0, 0x36, 0x7b,\n  0x0a, 0x4b, 0x25, 0x4e, 0x27, 0x21, 0x1d, 0x94, 0x4a, 0x30, 0xaa, 0xb2,\n  0x60, 0xc0, 0x61, 0xd7, 0x21, 0xf9, 0xdc, 0xc5, 0x76, 0xbf, 0xc3, 0x0f,\n  0x6f, 0xb5, 0xf9, 0x6c, 0xd6, 0xa0, 0xb1, 0xfd, 0xf2, 0xa5, 0x5c, 0x28,\n  0xac, 0xfb, 0x75, 0xb1, 0xac, 0x8f, 0xf1, 0x21, 0x96, 0x3f, 0xef, 0x2b,\n  0x63, 0xa3, 0x94, 0x0e, 0x39, 0x2b, 0x37, 0xc1, 0xca, 0xde, 0x14, 0xd3,\n  0x96, 0xda, 0xa3, 0xa0, 0x4b, 0x1e, 0x07, 0xbb, 0x7b, 0x83, 0x74, 0x06,\n  0xde, 0x56, 0xcd, 0xc6, 0xe7, 0xb7, 0x29, 0x12, 0x8c, 0x6f, 0x0a, 0xd5,\n  0x0c, 0xee, 0x36, 0x27, 0x7d, 0x25, 0x92, 0x30, 0xed, 0xb3, 0xbc, 0xce,\n  0xf2, 0x54, 0xda, 0x25, 0x94, 0xa3, 0x71, 0x56, 0x37, 0xee, 0x53, 0x13,\n  0xec, 0x9e, 0x35, 0xe7, 0x1c, 0x8f, 0xfe, 0x36, 0xe2, 0xbe, 0x3f, 0xe7,\n  0xae, 0xc1, 0x54, 0x07, 0xef, 0x60, 0xb3, 0x75, 0xf0, 0x7e, 0xf6, 0x45,\n  0xfd, 0x9b, 0x05, 0x5d, 0x4f, 0xee, 0x33, 0xd5, 0xd1, 0xcb, 0x93, 0xbc,\n  0x3c, 0xdb, 0xe6, 0xc2, 0x1b, 0x70, 0xb6, 0xaa, 0xe2, 0xdf, 0xc7, 0x66,\n  0xb8, 0xe4, 0x37, 0x2c, 0xe4, 0x48, 0x2b, 0x3f, 0xf3, 0x4a, 0x6f, 0x70,\n  0x9a, 0x6a, 0xf3, 0x7e, 0x66, 0xa6, 0x79, 0x19, 0xe6, 0xae, 0x99, 0xdf,\n  0x19, 0x8c, 0xf0, 0x76, 0x62, 0xf9, 0xec, 0x5e, 0xd0, 0x12, 0x8c, 0x26,\n  0xc2, 0x57, 0x8f, 0xb4, 0xc4, 0xa6, 0x4d, 0x80, 0x4d, 0xbb, 0x85, 0xd3,\n  0x70, 0x9b, 0x56, 0x2e, 0x62, 0xbc, 0x7f, 0x1d, 0x78, 0x7f, 0x25, 0xe3,\n  0x7d, 0x82, 0xf1, 0xbe, 0xdc, 0xec, 0x07, 0x8b, 0x79, 0xb5, 0x4f, 0xe2,\n  0x45, 0x06, 0x88, 0x81, 0xbc, 0x44, 0x0c, 0xf4, 0xe9, 0x96, 0x76, 0x19,\n  0x8a, 0x9b, 0x92, 0x69, 0x38, 0x53, 0x7d, 0x35, 0xf7, 0xec, 0x28, 0x4d,\n  0x60, 0x0e, 0xca, 0x1b, 0xb2, 0x07, 0x37, 0xbe, 0x7f, 0xc0, 0xae, 0x61,\n  0x9c, 0x1d, 0x17, 0xed, 0x1a, 0x5f, 0xcd, 0x6e, 0x15, 0xb9, 0x5b, 0x04,\n  0xc7, 0x23, 0x78, 0x75, 0xe1, 0x0a, 0xf2, 0xac, 0xf4, 0x10, 0xb1, 0x93,\n  0xce, 0x74, 0x9b, 0x85, 0x62, 0xc2, 0x48, 0x09, 0x41, 0xf6, 0x14, 0x58,\n  0xb2, 0x93, 0x68, 0x74, 0x8a, 0x97, 0xe1, 0x91, 0x1c, 0xa1, 0xea, 0x09,\n  0xc5, 0x98, 0x78, 0x3b, 0xb1, 0x07, 0xdc, 0x8a, 0x2b, 0xd4, 0xa0, 0xb9,\n  0x3b, 0x92, 0xdd, 0x41, 0x2d, 0xd9, 0x1d, 0x73, 0xfb, 0xee, 0x4d, 0x97,\n  0x5f, 0x78, 0x61, 0x79, 0xfa, 0xb2, 0xd3, 0xd2, 0x8b, 0x03, 0xe5, 0x87,\n  0x0f, 0x97, 0x0d, 0x9c, 0x1d, 0xe7, 0xef, 0x68, 0x80, 0x77, 0xf8, 0xb2,\n  0xef, 0x20, 0x98, 0x7b, 0x16, 0x34, 0x04, 0x02, 0xf9, 0xd1, 0x49, 0x76,\n  0x12, 0xbd, 0x01, 0x91, 0x00, 0xe8, 0x2c, 0xbe, 0x88, 0xa1, 0xf5, 0x2c,\n  0x7a, 0x47, 0x0c, 0xdf, 0x10, 0xd4, 0x3a, 0xdc, 0xfe, 0xcb, 0x86, 0xca,\n  0x8f, 0x1c, 0x29, 0x1f, 0xfa, 0xe4, 0x69, 0xe9, 0xcb, 0x03, 0x65, 0x87,\n  0x0f, 0x97, 0x0f, 0x9c, 0x8d, 0xf0, 0xdc, 0x9f, 0xb5, 0x74, 0x48, 0xf2,\n  0xd1, 0x9b, 0x61, 0x71, 0x56, 0x22, 0xa0, 0x8d, 0xd1, 0x63, 0x89, 0x8a,\n  0x2e, 0xcb, 0x44, 0x76, 0xcb, 0xcc, 0xe9, 0x35, 0xe2, 0xaf, 0xa5, 0xaf,\n  0xd2, 0xa1, 0x89, 0x09, 0x9c, 0xcb, 0x6b, 0x17, 0x8a, 0xe9, 0xfd, 0xd2,\n  0x5b, 0x20, 0x37, 0xf3, 0x77, 0xa2, 0x3f, 0xdc, 0xfc, 0x45, 0xdc, 0xae,\n  0x75, 0xd2, 0x1f, 0xd1, 0xed, 0xa0, 0x47, 0xad, 0xc4, 0x4d, 0xe2, 0xe9,\n  0x08, 0x6e, 0x93, 0x74, 0xde, 0x22, 0x2b, 0xa0, 0x16, 0x0e, 0x91, 0xb5,\n  0x36, 0x1b, 0x4c, 0xa4, 0xdb, 0xe6, 0x76, 0x39, 0x81, 0xc0, 0xea, 0x55,\n  0xd1, 0x2b, 0x19, 0xd6, 0x11, 0x2e, 0xa8, 0xee, 0x98, 0xfe, 0x0f, 0x5a,\n  0x67, 0x0d, 0x17, 0x0d, 0x95, 0xb6, 0x16, 0x69, 0xdb, 0xe0, 0x1f, 0xe9,\n  0xd2, 0x96, 0x22, 0x55, 0x7a, 0xb2, 0xf3, 0xc6, 0xbe, 0xae, 0x53, 0x9d,\n  0x0e, 0xf1, 0x97, 0x79, 0x0e, 0xb6, 0x11, 0x0b, 0xbe, 0xa9, 0x20, 0xcf,\n  0x2d, 0xc4, 0xe2, 0xd6, 0x79, 0x8e, 0xb0, 0x90, 0x2f, 0x7f, 0x13, 0x18,\n  0x9d, 0xd4, 0x79, 0xdc, 0xc8, 0x78, 0x9c, 0x6d, 0x23, 0x3f, 0x4f, 0x4d,\n  0x6d, 0xc4, 0x52, 0xc0, 0xce, 0x6f, 0xbe, 0x0c, 0x8c, 0x4c, 0x0a, 0x1e,\n  0x2e, 0xdc, 0x0a, 0x6d, 0x5c, 0x2c, 0x7d, 0x9e, 0x68, 0x24, 0x91, 0x8e,\n  0x29, 0xa0, 0x17, 0x65, 0x73, 0x1b, 0x28, 0xca, 0x3c, 0xa9, 0x02, 0xd1,\n  0xdc, 0x6e, 0xb7, 0xc5, 0x55, 0xca, 0x5b, 0x81, 0xbe, 0xf8, 0xe7, 0x5f,\n  0x9e, 0x3f, 0x2d, 0xed, 0x7d, 0xf6, 0xd9, 0xb3, 0x1f, 0x37, 0xb7, 0xe3,\n  0x20, 0x9b, 0xb9, 0x7b, 0x6b, 0x99, 0x4a, 0xe1, 0xcd, 0xd8, 0x18, 0x2a,\n  0xcd, 0x03, 0x0a, 0x15, 0x58, 0x04, 0x47, 0x30, 0x5f, 0x7a, 0x55, 0xee,\n  0x43, 0x98, 0x28, 0x22, 0xcf, 0x62, 0x7e, 0xf0, 0x79, 0xa0, 0x93, 0xc9,\n  0xcc, 0x5c, 0x1a, 0x57, 0x97, 0x83, 0x38, 0xdc, 0xf8, 0x0b, 0x01, 0x0b,\n  0xc4, 0x6b, 0xfd, 0xe2, 0xd5, 0xdf, 0xfa, 0x16, 0x7b, 0x79, 0xf2, 0xc6,\n  0x04, 0xbe, 0x7e, 0xb9, 0xf7, 0x8b, 0xc4, 0xd5, 0x0a, 0xe5, 0x7c, 0xa5,\n  0x39, 0xef, 0xd7, 0xb3, 0x5a, 0x67, 0x47, 0xac, 0xb0, 0x11, 0x17, 0x78,\n  0x7f, 0x4a, 0x1f, 0xfa, 0xb7, 0xbe, 0xc5, 0x06, 0x9f, 0xb8, 0x31, 0xc9,\n  0x86, 0x0f, 0xed, 0x24, 0xe9, 0xbf, 0x4a, 0x7b, 0x41, 0x76, 0x64, 0x60,\n  0x95, 0x83, 0xb4, 0xa4, 0x1b, 0xad, 0x16, 0x4d, 0x56, 0x2d, 0xac, 0x49,\n  0x10, 0x7c, 0x72, 0x88, 0xae, 0xb5, 0x5a, 0x15, 0x85, 0x10, 0xab, 0xc3,\n  0xea, 0xb0, 0xdb, 0x14, 0x4d, 0x41, 0x00, 0x2d, 0x14, 0x50, 0x1b, 0x0a,\n  0x92, 0xb7, 0x43, 0x8e, 0x20, 0x70, 0x05, 0xfc, 0xa6, 0x37, 0x5e, 0xbb,\n  0xed, 0xde, 0xcc, 0xf9, 0xf0, 0xc7, 0x49, 0xf8, 0x4d, 0xff, 0x95, 0x4a,\n  0x99, 0x8c, 0xfe, 0x9b, 0xeb, 0xc6, 0xb3, 0xd2, 0x5b, 0xf4, 0x2f, 0x72,\n  0x9f, 0xa4, 0x92, 0xe3, 0xcc, 0x87, 0x7a, 0x7c, 0xe1, 0xbf, 0xc8, 0x63,\n  0xa0, 0x9b, 0xd0, 0xcf, 0x38, 0x46, 0x5a, 0xc8, 0x69, 0x3d, 0xdb, 0x9a,\n  0xc5, 0x4e, 0xd1, 0x79, 0xfa, 0xa0, 0x55, 0x58, 0xa7, 0xf4, 0x58, 0x36,\n  0xcc, 0xea, 0x08, 0x8f, 0x9a, 0x72, 0x50, 0xe6, 0x4c, 0xcd, 0x52, 0xd8,\n  0xc3, 0x33, 0x0b, 0xc6, 0xa9, 0xe5, 0xa9, 0x66, 0xa6, 0x9d, 0x4b, 0xc7,\n  0x6a, 0xe2, 0xa5, 0xcc, 0x5b, 0xb8, 0xa1, 0x2e, 0xde, 0x52, 0xd3, 0x52,\n  0x55, 0x11, 0x8a, 0x95, 0xc6, 0xcc, 0x7e, 0xc2, 0xce, 0xc5, 0x41, 0x2c,\n  0xef, 0xe2, 0xdf, 0x37, 0x94, 0xc5, 0xe3, 0x65, 0xcb, 0xfc, 0x96, 0xa6,\n  0xab, 0xe3, 0x89, 0xca, 0xca, 0x44, 0xbc, 0xfa, 0xbb, 0x85, 0xff, 0x91,\n  0x23, 0x0b, 0xc5, 0x64, 0x07, 0x97, 0x85, 0xb0, 0x95, 0x82, 0x00, 0xc3,\n  0x74, 0x2b, 0x2c, 0x12, 0xef, 0x80, 0xca, 0x57, 0x36, 0x15, 0xd2, 0x10,\n  0x5d, 0xf4, 0x18, 0x67, 0x0d, 0xe4, 0x01, 0x9f, 0x93, 0x79, 0x55, 0x08,\n  0x04, 0x66, 0xfa, 0x2d, 0x26, 0xc5, 0x6e, 0xfe, 0x0b, 0x33, 0xfd, 0x9a,\n  0x44, 0x42, 0x88, 0xe5, 0x3c, 0xac, 0x89, 0x79, 0x21, 0x18, 0xba, 0x68,\n  0x12, 0xc9, 0xb4, 0xc6, 0x1c, 0x64, 0xd6, 0x90, 0x4e, 0xb1, 0xd4, 0x2c,\n  0x0a, 0xb5, 0x1c, 0x60, 0x16, 0x39, 0xcb, 0xcf, 0x2b, 0xa4, 0xd3, 0xfc,\n  0x10, 0x7d, 0x7c, 0x95, 0x59, 0x78, 0xc8, 0xd6, 0xa3, 0x22, 0x3a, 0x83,\n  0x30, 0x9a, 0x62, 0x59, 0x6a, 0xa6, 0x65, 0x29, 0x43, 0x8f, 0x70, 0x69,\n  0xee, 0xfd, 0xe8, 0x47, 0xc5, 0xea, 0x94, 0xde, 0x7f, 0x23, 0xf0, 0xe4,\n  0x16, 0xe8, 0xc3, 0x25, 0xd0, 0x07, 0x0b, 0xea, 0x4a, 0x25, 0xcf, 0x1e,\n  0x05, 0xeb, 0xc1, 0x83, 0xba, 0x52, 0x73, 0x27, 0x3b, 0x34, 0xb7, 0x7f,\n  0xf7, 0x1f, 0x76, 0x9f, 0x96, 0xae, 0x7b, 0xf8, 0xe1, 0xb3, 0x57, 0x71,\n  0x3d, 0xc1, 0xeb, 0x7f, 0x01, 0xb4, 0x65, 0x05, 0x62, 0xd8, 0x90, 0x49,\n  0xe0, 0x8d, 0x44, 0x4e, 0xe3, 0xdd, 0xc4, 0x49, 0xe6, 0x54, 0xac, 0x7a,\n  0x74, 0x25, 0xd3, 0x1d, 0x04, 0x5e, 0xec, 0xbe, 0xe4, 0x12, 0x68, 0x60,\n  0xef, 0x73, 0xcf, 0x31, 0x26, 0x48, 0xa2, 0xfe, 0x43, 0x40, 0x68, 0x27,\n  0xe1, 0x74, 0x29, 0x74, 0xde, 0x02, 0x3b, 0x02, 0xb5, 0xb2, 0x86, 0x88,\n  0x68, 0x42, 0x02, 0xb1, 0x81, 0xf7, 0x83, 0xda, 0x77, 0xcb, 0xdd, 0x49,\n  0x8d, 0x35, 0xe2, 0x1f, 0x1c, 0x1c, 0x3c, 0x2d, 0x9d, 0x98, 0x3b, 0x7c,\n  0x78, 0xee, 0xec, 0x6d, 0xd2, 0x87, 0xba, 0xbb, 0xbb, 0x73, 0xe6, 0xd8,\n  0x45, 0xe6, 0x38, 0x47, 0xcb, 0x35, 0x0a, 0x2d, 0x18, 0x4b, 0xda, 0xc2,\n  0xa6, 0x58, 0xd1, 0xa7, 0x38, 0x92, 0xfb, 0x54, 0xe1, 0x33, 0xac, 0xb0,\n  0x19, 0xb6, 0x88, 0x19, 0x46, 0xef, 0x1d, 0x17, 0x71, 0xf1, 0x09, 0x46,\n  0xf0, 0x96, 0xec, 0x04, 0xeb, 0xd3, 0x7b, 0x93, 0x3e, 0xbb, 0x9f, 0xe5,\n  0x93, 0x2b, 0x11, 0x2f, 0xfd, 0x5b, 0xd8, 0xcf, 0x36, 0xc1, 0xcc, 0xfa,\n  0x49, 0x1b, 0x62, 0x1a, 0xe3, 0xfd, 0x8c, 0x7c, 0xd0, 0xc2, 0x6d, 0x63,\n  0x0b, 0xb3, 0x8d, 0x11, 0x2f, 0x97, 0xac, 0xc7, 0xf5, 0xe2, 0x2e, 0x76,\n  0xfa, 0x5d, 0x7e, 0xbe, 0x46, 0x54, 0x67, 0xee, 0x1a, 0x49, 0xb6, 0xa7,\n  0x3a, 0x79, 0xf4, 0xd6, 0x67, 0xa7, 0xd7, 0x4e, 0xae, 0x9f, 0x9e, 0x99,\n  0xd8, 0xb8, 0x69, 0x53, 0x43, 0x32, 0x49, 0xff, 0xf6, 0xc4, 0x85, 0x87,\n  0x4e, 0xbc, 0xe7, 0xf0, 0xa1, 0x4b, 0x56, 0xde, 0xf3, 0x89, 0x99, 0xf5,\n  0x33, 0xeb, 0xd8, 0x7b, 0x7d, 0xf0, 0xde, 0x29, 0x78, 0x6f, 0x98, 0x67,\n  0x29, 0xd7, 0x51, 0x85, 0x1c, 0x70, 0x5a, 0x95, 0xa7, 0xd4, 0x2c, 0x32,\n  0x10, 0x42, 0x48, 0x4b, 0x70, 0xd2, 0xb3, 0xc8, 0xb2, 0x65, 0x8e, 0x58,\n  0x2c, 0xb8, 0xf6, 0x2d, 0xf2, 0x7a, 0x04, 0x98, 0xad, 0x89, 0x55, 0xd4,\n  0x55, 0xd6, 0x61, 0xb2, 0x7e, 0xab, 0x8a, 0x90, 0xb2, 0x56, 0xa7, 0x39,\n  0x7b, 0xb7, 0x09, 0x84, 0x93, 0xf9, 0xf7, 0x0f, 0x4a, 0x1c, 0xb6, 0x4f,\n  0x44, 0x9d, 0xbd, 0x5a, 0x14, 0x73, 0x38, 0xa2, 0xde, 0xae, 0xc1, 0x72,\n  0x59, 0x29, 0xea, 0xaa, 0x5b, 0x31, 0xb9, 0x61, 0x64, 0x78, 0xa7, 0xa7,\n  0x65, 0x93, 0xab, 0xa1, 0xdd, 0x57, 0x5b, 0x99, 0x68, 0xa9, 0x93, 0x37,\n  0x29, 0xf2, 0x0a, 0xc5, 0x52, 0x37, 0x5a, 0xef, 0xaf, 0x18, 0x4d, 0x8f,\n  0xae, 0x9b, 0xdf, 0xd3, 0xb2, 0x6d, 0xbc, 0xe1, 0xb9, 0xa6, 0xb2, 0x50,\n  0x4b, 0x65, 0x53, 0x73, 0xa2, 0x01, 0xc6, 0xe0, 0x86, 0x31, 0x4c, 0xc8,\n  0x5b, 0x48, 0x39, 0x9c, 0x5c, 0x60, 0x0c, 0x1e, 0x2a, 0x9b, 0x60, 0x76,\n  0x60, 0x0c, 0xd8, 0x77, 0x3c, 0xa5, 0x82, 0x9e, 0x04, 0xc5, 0x74, 0x70,\n  0xf1, 0xe5, 0x79, 0x45, 0x98, 0x25, 0xb0, 0x4e, 0x56, 0x24, 0x83, 0xfe,\n  0x62, 0xc4, 0x8f, 0x28, 0xa7, 0xe5, 0x62, 0x0c, 0x7e, 0x5f, 0x91, 0x64,\n  0x64, 0x75, 0x34, 0x81, 0x69, 0x04, 0x4d, 0x40, 0xd8, 0x0f, 0x42, 0x7f,\n  0x9b, 0x36, 0xad, 0xaa, 0x29, 0x73, 0x54, 0x87, 0xba, 0xfb, 0xcb, 0x25,\n  0x8b, 0xab, 0xa3, 0x36, 0x0d, 0xc3, 0x88, 0xb7, 0x24, 0xeb, 0x1b, 0x3a,\n  0x9a, 0xe4, 0x2d, 0x3b, 0xf6, 0xb5, 0x6c, 0x9f, 0x68, 0xd4, 0xfa, 0x15,\n  0xb5, 0x71, 0xac, 0xd6, 0x5b, 0x35, 0x9e, 0x1e, 0xda, 0xd8, 0xdb, 0xd8,\n  0x98, 0x68, 0x6e, 0x2a, 0xab, 0x5f, 0xc1, 0x6c, 0xd8, 0xca, 0x85, 0x8f,\n  0xd2, 0x1e, 0xf2, 0x3b, 0x3a, 0x4a, 0x86, 0xc9, 0x3d, 0xd9, 0x8c, 0xaf,\n  0x0b, 0xf7, 0x08, 0x9b, 0x31, 0x0e, 0xcf, 0xa7, 0xc9, 0xcb, 0xf0, 0x7c,\n  0xbc, 0xe0, 0xf3, 0xf3, 0xd9, 0xf3, 0x0d, 0x79, 0x9f, 0x3b, 0x17, 0xee,\n  0x81, 0x45, 0xfa, 0x12, 0x3c, 0xdf, 0x9e, 0x7d, 0x4e, 0xb3, 0xcf, 0x23,\n  0x50, 0x7f, 0x0d, 0xd6, 0x57, 0xca, 0x97, 0xd6, 0xe7, 0xf8, 0xcd, 0x12,\n  0x7e, 0x6b, 0xaf, 0x26, 0xeb, 0xd2, 0xd3, 0x5c, 0x42, 0x64, 0xcc, 0x37,\n  0xca, 0xb1, 0x4a, 0x60, 0x89, 0x48, 0x36, 0x38, 0x05, 0x62, 0x80, 0x16,\n  0x66, 0x1b, 0xb5, 0xb3, 0x7c, 0xfe, 0xa0, 0xe8, 0xad, 0xf3, 0x84, 0x05,\n  0x24, 0x71, 0xc8, 0x25, 0x23, 0x69, 0x60, 0x11, 0x03, 0x38, 0xa8, 0xa6,\n  0xd5, 0x8e, 0xc5, 0x78, 0x5b, 0x1d, 0x60, 0x5e, 0x31, 0x15, 0xe8, 0x47,\n  0x08, 0x5f, 0x0e, 0x6b, 0xf1, 0x97, 0xf8, 0x58, 0x75, 0x75, 0x30, 0x15,\n  0x5e, 0x31, 0x3c, 0x3a, 0x43, 0xd5, 0x2f, 0x3c, 0xf0, 0xc0, 0x17, 0x32,\n  0x6f, 0x5f, 0x7a, 0x71, 0xdb, 0xbc, 0xf4, 0x6c, 0x91, 0x3b, 0xed, 0x2c,\n  0x39, 0x6f, 0xeb, 0xb6, 0xd9, 0xa7, 0x57, 0xdd, 0xb2, 0xea, 0x13, 0xab,\n  0x5f, 0xba, 0xe4, 0x9a, 0x35, 0x27, 0xd2, 0x22, 0x4e, 0xf3, 0x3b, 0x52,\n  0x9d, 0xf4, 0x17, 0x52, 0x43, 0x9a, 0x49, 0x27, 0xb9, 0x22, 0x1d, 0x0c,\n  0xf9, 0x25, 0x4d, 0x6a, 0x6d, 0x4a, 0x56, 0x87, 0x4b, 0x55, 0x45, 0x8b,\n  0xa8, 0x32, 0xe2, 0xac, 0x62, 0x06, 0x41, 0x84, 0x19, 0xa8, 0xb4, 0xaa,\n  0x12, 0x88, 0xc6, 0x0d, 0x20, 0x48, 0x9a, 0x22, 0x69, 0x07, 0x11, 0x92,\n  0x83, 0x28, 0x96, 0x43, 0x30, 0x50, 0x7a, 0x21, 0x42, 0xfe, 0xd4, 0xc8,\n  0x2c, 0x92, 0x6a, 0x09, 0x99, 0xc5, 0xa2, 0xcc, 0x61, 0xbc, 0xcd, 0x5e,\n  0x04, 0x28, 0xd9, 0x30, 0x97, 0x76, 0x13, 0x52, 0x5f, 0x8b, 0x18, 0xb4,\n  0xfe, 0x52, 0x4f, 0x24, 0xe4, 0xb3, 0x61, 0xa6, 0xd5, 0xee, 0x44, 0x52,\n  0x8b, 0x75, 0x73, 0x08, 0xf5, 0xee, 0x0e, 0x0d, 0x21, 0xe3, 0x3b, 0xb4,\n  0x00, 0x1b, 0x73, 0x52, 0x16, 0xdf, 0x46, 0xb4, 0xa4, 0x97, 0x5d, 0x7e,\n  0xc8, 0x81, 0xa4, 0x17, 0x41, 0x7d, 0x68, 0xc0, 0xdb, 0x10, 0x0b, 0xae,\n  0xac, 0xe8, 0xee, 0x39, 0x79, 0xd4, 0xbb, 0xd2, 0x1d, 0xa8, 0x77, 0x7b,\n  0x56, 0xfa, 0xdc, 0x91, 0x92, 0x98, 0x23, 0xe8, 0xda, 0x53, 0x37, 0x19,\n  0x8f, 0x4f, 0xa7, 0x3c, 0x15, 0xfb, 0xbc, 0x01, 0xbb, 0xdf, 0xbe, 0x33,\n  0x3a, 0x3b, 0xd3, 0x37, 0xd4, 0xb7, 0x5d, 0x2d, 0x3e, 0x76, 0x47, 0xdd,\n  0xcd, 0xdb, 0x2e, 0x7b, 0xb0, 0x74, 0xfb, 0x46, 0x49, 0x9a, 0xdd, 0x6b,\n  0x71, 0x59, 0xc7, 0x2d, 0x0e, 0x25, 0x13, 0x2d, 0x71, 0x4e, 0x16, 0x17,\n  0x6d, 0x7d, 0x90, 0xfe, 0x1e, 0xac, 0xe6, 0x4c, 0x2a, 0x30, 0x41, 0x4f,\n  0x87, 0x2f, 0xde, 0xb0, 0x0f, 0xe6, 0x14, 0xcf, 0x53, 0xa5, 0x30, 0xa7,\n  0xcd, 0xe4, 0x41, 0x71, 0x16, 0xc7, 0x89, 0x0d, 0x21, 0x5a, 0x1c, 0xde,\n  0x54, 0xc5, 0x4a, 0x8b, 0x64, 0x8b, 0x12, 0xa7, 0xaa, 0x05, 0x41, 0x97,\n  0xc2, 0xfa, 0xa4, 0x87, 0x60, 0x45, 0xe5, 0x3e, 0x56, 0x31, 0x11, 0x3e,\n  0xd6, 0xaf, 0x42, 0xc3, 0x91, 0xeb, 0x88, 0x2c, 0xaa, 0x03, 0x28, 0x0a,\n  0x75, 0x2f, 0x11, 0x96, 0x41, 0x02, 0x8c, 0x34, 0xd0, 0xd5, 0x0c, 0xfe,\n  0x52, 0xb1, 0xc8, 0x85, 0x08, 0x19, 0xa2, 0x5c, 0x6d, 0x82, 0x83, 0x24,\n  0x95, 0x14, 0x73, 0xa0, 0xb1, 0xc5, 0x88, 0x72, 0x70, 0x38, 0x31, 0xd0,\n  0x06, 0x0d, 0x04, 0xd5, 0xae, 0x9c, 0xec, 0x8a, 0x74, 0x57, 0xd7, 0xae,\n  0x64, 0x3c, 0x3c, 0xd9, 0x3a, 0xb8, 0xab, 0x63, 0x64, 0x60, 0x4c, 0x93,\n  0x4b, 0x56, 0x24, 0x9c, 0xd5, 0xc5, 0xf6, 0xe2, 0x4a, 0x6b, 0x43, 0xba,\n  0x7d, 0xb4, 0x3a, 0x3e, 0x95, 0xda, 0x77, 0xcd, 0xe0, 0xea, 0xeb, 0xa4,\n  0x67, 0x03, 0xbe, 0xf1, 0xe2, 0xd0, 0xd8, 0x75, 0xdb, 0x8e, 0xdc, 0x55,\n  0x4a, 0x2f, 0xe8, 0xa9, 0x88, 0xca, 0xf2, 0x1a, 0x45, 0x19, 0xee, 0x79,\n  0x44, 0x2a, 0x76, 0x00, 0xf7, 0xb6, 0xdd, 0x7f, 0xec, 0xc2, 0xfb, 0x76,\n  0x72, 0x2c, 0xca, 0x3b, 0xe5, 0x2d, 0xd2, 0x47, 0xc1, 0xde, 0xff, 0x1a,\n  0xbf, 0xc2, 0x73, 0xd5, 0xc0, 0x98, 0xa3, 0x61, 0x77, 0x11, 0xde, 0x4b,\n  0x00, 0x9f, 0xf0, 0x67, 0xcd, 0xf8, 0x79, 0x8e, 0x43, 0x64, 0x44, 0x08,\n  0x1a, 0xfc, 0xc7, 0x80, 0x7f, 0xca, 0x0d, 0x5c, 0x8f, 0x5b, 0x35, 0xbb,\n  0x8c, 0x48, 0x0f, 0x2a, 0xa8, 0x78, 0x13, 0x18, 0x55, 0x35, 0x9e, 0xef,\n  0x4e, 0x2f, 0x47, 0x97, 0x8e, 0x67, 0x49, 0x04, 0x7a, 0x25, 0xa3, 0xb3,\n  0x4b, 0x66, 0x32, 0xcc, 0x61, 0x4b, 0xf1, 0xde, 0xad, 0x0a, 0xd7, 0x9d,\n  0xdf, 0x5b, 0x52, 0xec, 0x72, 0xda, 0xc0, 0x0e, 0xd3, 0x41, 0x45, 0x68,\n  0x0e, 0x12, 0x7c, 0x4a, 0x8e, 0x79, 0x53, 0x8b, 0xb1, 0x2b, 0x41, 0x48,\n  0xbb, 0xa4, 0x7b, 0xb7, 0x6f, 0x9b, 0x45, 0xb8, 0xca, 0xf7, 0x8f, 0x3e,\n  0x93, 0x45, 0xac, 0xbc, 0xb8, 0x7e, 0xfb, 0xe8, 0xca, 0xa4, 0x14, 0xdd,\n  0x79, 0x41, 0xe6, 0x53, 0x02, 0xab, 0xf2, 0x8b, 0x99, 0xe7, 0xe9, 0x57,\n  0x9d, 0x59, 0xbc, 0xca, 0xe9, 0xc7, 0xdf, 0x5f, 0xc2, 0x0c, 0x01, 0x8c,\n  0xb7, 0x6d, 0x07, 0x5b, 0xb6, 0x9c, 0x54, 0x81, 0x3d, 0x89, 0x1e, 0x0b,\n  0x3b, 0xd3, 0xdb, 0x2a, 0xa9, 0xac, 0xd4, 0x52, 0x07, 0x1c, 0xe1, 0x8a,\n  0x34, 0xd8, 0x4c, 0x3c, 0x25, 0x56, 0xdc, 0xe8, 0xa4, 0x0b, 0xdc, 0xc5,\n  0x36, 0x99, 0x7a, 0x9d, 0x76, 0x44, 0x22, 0x23, 0x07, 0x78, 0xea, 0x1e,\n  0x9f, 0x4b, 0x72, 0x38, 0x0e, 0x3b, 0xd6, 0xb2, 0x7c, 0x9b, 0x98, 0xe7,\n  0x2e, 0x0a, 0x52, 0x11, 0x86, 0xf6, 0x0c, 0x85, 0xe2, 0xd6, 0x7f, 0xf9,\n  0x5d, 0x55, 0x0d, 0x1d, 0xfa, 0x3e, 0x8b, 0xc8, 0xe5, 0x02, 0x02, 0x1c,\n  0x77, 0xdc, 0x98, 0x8c, 0xf6, 0x4c, 0x32, 0xe6, 0x85, 0xdf, 0x41, 0xf1,\n  0xf7, 0xd6, 0xb5, 0xf0, 0xeb, 0x82, 0xf9, 0x93, 0x33, 0xf8, 0xf7, 0xc1,\n  0xf9, 0x93, 0x52, 0x7d, 0xbd, 0xa2, 0xee, 0xaa, 0x5c, 0xf5, 0xb9, 0xd5,\n  0xd2, 0xfc, 0xbc, 0x22, 0xd7, 0x53, 0x9a, 0xde, 0x90, 0xfe, 0x0b, 0xfc,\n  0x82, 0xbf, 0x32, 0x0b, 0x94, 0xc2, 0xef, 0x1f, 0x5e, 0x99, 0xf9, 0xaf,\n  0x0d, 0x1b, 0x36, 0x64, 0xde, 0xbe, 0x18, 0x04, 0x78, 0xe3, 0xc2, 0x9b,\n  0x72, 0x29, 0x8c, 0xad, 0x08, 0x6c, 0xe5, 0x95, 0xe4, 0xbe, 0x74, 0xa0,\n  0x9c, 0x6a, 0x6a, 0x98, 0x5a, 0x34, 0x0d, 0x8c, 0xdf, 0x56, 0x6a, 0x93,\n  0x5a, 0x28, 0xb5, 0x59, 0x44, 0x18, 0x67, 0x23, 0xc2, 0x28, 0xd8, 0x2c,\n  0xd2, 0x01, 0xd8, 0x56, 0xc1, 0xfa, 0x42, 0x0d, 0x79, 0x88, 0x9b, 0xc2,\n  0x4e, 0xca, 0xb2, 0x0d, 0xd8, 0x6c, 0x74, 0xde, 0x6a, 0xcc, 0x72, 0xeb,\n  0x39, 0xc8, 0x51, 0x33, 0xb1, 0xc0, 0x3b, 0x3d, 0xf8, 0x15, 0x2c, 0xe9,\n  0xd2, 0x50, 0x49, 0x31, 0x25, 0x9d, 0xed, 0x4d, 0x0d, 0xd5, 0x95, 0xa1,\n  0x95, 0xa5, 0x2b, 0xbd, 0xee, 0xe2, 0x60, 0x49, 0x90, 0xa3, 0xa4, 0x93,\n  0x22, 0x5a, 0xe4, 0x32, 0x22, 0xee, 0x54, 0xcd, 0xfb, 0xff, 0x91, 0xf7,\n  0xde, 0x81, 0x71, 0x5d, 0x55, 0xc2, 0xf8, 0xbb, 0xf7, 0xb5, 0xe9, 0xbd,\n  0x68, 0x46, 0xa3, 0x19, 0x4d, 0x9f, 0x51, 0x97, 0x46, 0xa3, 0x51, 0xf7,\n  0xa8, 0xb7, 0x51, 0xb5, 0x65, 0x4b, 0x72, 0x91, 0x2d, 0x17, 0x59, 0xee,\n  0x25, 0x89, 0xd3, 0x63, 0x9b, 0xd8, 0x09, 0x09, 0xe9, 0x21, 0xe0, 0x40,\n  0xe8, 0x09, 0x10, 0x60, 0x09, 0x64, 0xc3, 0x02, 0x4b, 0x08, 0x2d, 0xc0,\n  0x1a, 0x08, 0x01, 0xc2, 0xd2, 0x02, 0x6c, 0xa1, 0x43, 0x58, 0x58, 0x20,\n  0x9b, 0x2f, 0x44, 0xa3, 0xdf, 0x3d, 0xf7, 0xbd, 0x37, 0x1a, 0x49, 0x23,\n  0xdb, 0xd9, 0xe5, 0xfb, 0x63, 0x7f, 0x9f, 0x13, 0xb5, 0xf7, 0xee, 0x7b,\n  0x73, 0xef, 0x69, 0xf7, 0x9c, 0x73, 0x4f, 0x01, 0x80, 0x04, 0xcd, 0x4e,\n  0x28, 0xfa, 0x0c, 0x3b, 0x18, 0x9f, 0x2f, 0x84, 0x9d, 0x72, 0x0b, 0x9d,\n  0xbc, 0xcc, 0x70, 0x29, 0x31, 0xfc, 0xe7, 0x47, 0x16, 0x7c, 0x35, 0xc5,\n  0x77, 0xcd, 0xde, 0xb4, 0x75, 0xf2, 0xcd, 0xe9, 0xce, 0xce, 0xc6, 0x56,\n  0xb4, 0x50, 0x9e, 0xf6, 0x94, 0x7a, 0x6a, 0x3d, 0x81, 0x68, 0xb8, 0x21,\n  0xd8, 0xe0, 0x9b, 0xd8, 0x1a, 0xee, 0x2a, 0x72, 0x0e, 0xfa, 0x6a, 0x62,\n  0xa1, 0x64, 0x30, 0xe5, 0x9b, 0xc6, 0x17, 0xf7, 0xee, 0x6b, 0xcc, 0x54,\n  0xe9, 0xb3, 0x9f, 0x43, 0xd1, 0xec, 0x0f, 0xf0, 0xc5, 0x4c, 0xf6, 0x2f,\n  0x3d, 0x5d, 0xbd, 0x6d, 0xdb, 0xec, 0xe6, 0x2e, 0x93, 0x39, 0x54, 0x42,\n  0x94, 0x06, 0x6b, 0x59, 0x53, 0x45, 0xef, 0x16, 0x93, 0x69, 0xdc, 0xe4,\n  0xae, 0x08, 0x7a, 0xe3, 0x5e, 0x1b, 0xf9, 0xbb, 0x33, 0x43, 0xcd, 0x44,\n  0xa0, 0x9d, 0x07, 0x69, 0x9d, 0x6b, 0xa8, 0xa2, 0x58, 0x46, 0xe4, 0x54,\n  0x2d, 0x91, 0xe5, 0xfb, 0xd3, 0x7b, 0x03, 0x84, 0x7e, 0x50, 0xc6, 0x04,\n  0x04, 0xcd, 0x3a, 0x6c, 0x16, 0x0d, 0x47, 0xa9, 0xc7, 0x6e, 0x35, 0x6b,\n  0x39, 0x54, 0xe4, 0x34, 0xe8, 0x38, 0x46, 0x4f, 0xe8, 0x87, 0x08, 0x6b,\n  0x20, 0x20, 0x97, 0x11, 0xeb, 0xf5, 0x07, 0xf5, 0x84, 0x80, 0xea, 0x13,\n  0xb5, 0x35, 0x50, 0x67, 0xb2, 0x2c, 0x1e, 0xa3, 0x94, 0xe4, 0x2f, 0x25,\n  0xaf, 0xf6, 0x41, 0xe3, 0xca, 0x35, 0xa4, 0xe4, 0x06, 0x52, 0x62, 0x09,\n  0x19, 0x45, 0xe1, 0x2b, 0x01, 0x1d, 0xc7, 0xe0, 0x4b, 0x24, 0xa4, 0x04,\n  0x5f, 0x2c, 0xfc, 0x47, 0x48, 0x88, 0x4d, 0xa4, 0x28, 0x35, 0x91, 0x7b,\n  0x41, 0x36, 0x15, 0xe4, 0x53, 0xc1, 0x7b, 0x2a, 0xa7, 0x32, 0x86, 0xf6,\n  0x44, 0xf9, 0x58, 0xf4, 0x60, 0xd5, 0xb6, 0xea, 0x83, 0xe1, 0xd1, 0x78,\n  0x6d, 0xab, 0x7e, 0x60, 0x53, 0xd9, 0x4c, 0xcd, 0xa9, 0xca, 0x89, 0x4a,\n  0xe7, 0x13, 0xad, 0xba, 0x4d, 0x77, 0xcd, 0xea, 0xbb, 0xdf, 0xda, 0xa6,\n  0xdd, 0xbc, 0x68, 0x8f, 0xa3, 0x0d, 0xb6, 0x58, 0x8e, 0xca, 0x56, 0xd0,\n  0xd9, 0x85, 0xec, 0x77, 0x27, 0xe0, 0x5f, 0xf6, 0x07, 0x6f, 0xbe, 0x70,\n  0x01, 0xfa, 0x5a, 0x13, 0x58, 0xb4, 0x12, 0x58, 0x58, 0x99, 0xc6, 0x74,\n  0xd2, 0x42, 0x6c, 0x0c, 0x94, 0x31, 0x13, 0x5d, 0x73, 0x88, 0x18, 0x59,\n  0x88, 0xaa, 0x37, 0xcc, 0x7e, 0x29, 0xaf, 0x97, 0xf6, 0xbc, 0x3d, 0x28,\n  0x42, 0xa5, 0x44, 0x2b, 0x93, 0x5b, 0x90, 0x46, 0xef, 0x95, 0x58, 0xc3,\n  0x4c, 0xfe, 0xa3, 0x5d, 0x0d, 0x83, 0x84, 0x02, 0x44, 0xf3, 0xbe, 0x2d,\n  0x5b, 0x26, 0xdd, 0xaf, 0xce, 0x65, 0x9f, 0xfb, 0xf8, 0x4b, 0x7b, 0x7f,\n  0xd6, 0x88, 0x46, 0x3a, 0x51, 0x73, 0xf6, 0xcb, 0xf0, 0xd5, 0x99, 0xfd,\n  0x38, 0x1a, 0x69, 0xcf, 0xfe, 0x01, 0x64, 0x9e, 0x15, 0x6a, 0xca, 0x90,\n  0xcf, 0x76, 0x32, 0x0d, 0xe9, 0x84, 0xb2, 0x85, 0x43, 0xd3, 0x66, 0xd0,\n  0xba, 0x4d, 0x2c, 0x99, 0x0a, 0x56, 0x2c, 0xe2, 0x03, 0x79, 0xcd, 0x0b,\n  0x9d, 0x8c, 0xd3, 0x6c, 0x76, 0x81, 0x9d, 0x9f, 0x48, 0x8a, 0xd1, 0x14,\n  0xfd, 0x0a, 0xd2, 0xed, 0x9d, 0x28, 0xe5, 0xf4, 0xeb, 0x3f, 0xaf, 0x0e,\n  0x5d, 0x20, 0xff, 0xff, 0x14, 0x3b, 0x7f, 0x22, 0xfd, 0xf6, 0xbe, 0xb1,\n  0xe4, 0xc2, 0x1e, 0xf2, 0xf5, 0xbd, 0xd1, 0xd1, 0xf7, 0x8d, 0x27, 0x17,\n  0xf6, 0x92, 0xaf, 0xef, 0x4b, 0xbe, 0xd7, 0xa2, 0x25, 0x13, 0xfb, 0x18,\n  0xd9, 0xab, 0x8a, 0x69, 0x67, 0xeb, 0x8f, 0xa7, 0x2d, 0x26, 0xb2, 0x0d,\n  0x11, 0x6a, 0xc7, 0xcd, 0x84, 0xc7, 0xca, 0x10, 0xa7, 0x52, 0x9a, 0xd1,\n  0x35, 0x93, 0xc9, 0xf2, 0x64, 0x97, 0x86, 0x96, 0xe6, 0x6a, 0xc4, 0xab,\n  0x17, 0x98, 0xe5, 0xd2, 0x1e, 0x08, 0x71, 0x73, 0x82, 0x06, 0x43, 0xaf,\n  0x65, 0x1d, 0x2d, 0xef, 0x2b, 0xff, 0xa1, 0x45, 0xa2, 0x78, 0x54, 0x94,\n  0xb2, 0xa6, 0x2f, 0xf5, 0xf0, 0x4e, 0x0d, 0x52, 0x9e, 0x95, 0x32, 0x87,\n  0x95, 0x27, 0xa7, 0xd3, 0xbe, 0xda, 0x1a, 0x8f, 0x87, 0x91, 0x9b, 0x5b,\n  0x43, 0xe2, 0x2b, 0x34, 0xca, 0x24, 0xb3, 0x75, 0x87, 0x23, 0x7e, 0xb3,\n  0x5e, 0xef, 0x2e, 0xa7, 0x50, 0x97, 0xba, 0xc1, 0xe6, 0xf5, 0xf4, 0x93,\n  0xda, 0xf8, 0xf0, 0x56, 0x45, 0x3d, 0x96, 0xfa, 0xc8, 0x82, 0x5f, 0xd7,\n  0x9a, 0x6b, 0xe3, 0x43, 0x74, 0x85, 0xaa, 0x1b, 0x36, 0x1f, 0x54, 0xef,\n  0xbb, 0xa3, 0xaf, 0xf9, 0xe0, 0x60, 0xf9, 0xce, 0x90, 0x37, 0x74, 0xa4,\n  0x79, 0xef, 0x83, 0xe3, 0xf3, 0x4f, 0x5e, 0x85, 0xa6, 0x27, 0xcc, 0xdb,\n  0xc7, 0xc7, 0x32, 0x65, 0x53, 0xbd, 0xee, 0x5a, 0x3d, 0xc7, 0xa9, 0x34,\n  0xbe, 0x07, 0x2a, 0xbb, 0x42, 0x81, 0x58, 0xbd, 0x5e, 0xab, 0x8d, 0xe1,\n  0xce, 0xac, 0x66, 0xe6, 0x6d, 0x73, 0xbd, 0xfb, 0x9a, 0x2c, 0xe6, 0x3e,\n  0xb3, 0x33, 0x73, 0xc7, 0x8e, 0xd3, 0xff, 0xb8, 0xf7, 0x0f, 0xe8, 0x8d,\n  0x63, 0xbb, 0x27, 0xda, 0xab, 0xb6, 0xb6, 0xd9, 0xf5, 0xce, 0x86, 0xca,\n  0xbb, 0x51, 0x45, 0x77, 0x4b, 0x30, 0x96, 0x68, 0xac, 0x77, 0x59, 0xa8,\n  0xdf, 0x6a, 0xc9, 0x84, 0x39, 0x62, 0xff, 0x43, 0xcf, 0xfa, 0xae, 0x74,\n  0xda, 0x4b, 0x50, 0xad, 0xd7, 0x12, 0x46, 0xd2, 0xc1, 0x51, 0x31, 0x96,\n  0xfa, 0x6a, 0xca, 0xdd, 0xec, 0x8e, 0x0d, 0x2f, 0x97, 0x97, 0xe7, 0xa5,\n  0x8e, 0x74, 0x88, 0xa9, 0x28, 0x73, 0x39, 0x8d, 0x06, 0x81, 0x83, 0x06,\n  0x6c, 0x02, 0x2d, 0x96, 0x2e, 0x37, 0xed, 0x26, 0x22, 0x44, 0x84, 0x76,\n  0x95, 0xce, 0x54, 0x9e, 0x83, 0x51, 0xa4, 0x82, 0x86, 0x6d, 0x68, 0xc8,\n  0x15, 0x49, 0x77, 0xa0, 0x23, 0xa1, 0x68, 0x34, 0xe4, 0x8d, 0xfa, 0x12,\n  0x27, 0x36, 0xb6, 0x4f, 0xdc, 0x3b, 0x36, 0x59, 0x11, 0x1e, 0x6e, 0x6f,\n  0x1f, 0x68, 0x68, 0xac, 0xac, 0xb5, 0x4c, 0xb4, 0xc7, 0xec, 0x5e, 0x57,\n  0x91, 0x5f, 0xe7, 0xfc, 0x83, 0x66, 0xc8, 0x54, 0x51, 0xe6, 0x3e, 0x7d,\n  0xea, 0xab, 0xe7, 0xaf, 0x47, 0xea, 0xfb, 0x1f, 0xd8, 0xfa, 0xd6, 0xda,\n  0xc9, 0x89, 0x4c, 0x4f, 0xdb, 0xbb, 0xa7, 0xf7, 0xdd, 0xb6, 0xc5, 0x3b,\n  0x38, 0x8e, 0x87, 0x32, 0xa7, 0xbc, 0x15, 0xb1, 0xb2, 0x06, 0xe7, 0xc0,\n  0x04, 0xf5, 0x6b, 0x28, 0xfb, 0x90, 0x97, 0xec, 0x42, 0xe5, 0x64, 0x6d,\n  0x73, 0xe9, 0x59, 0x9d, 0x06, 0x23, 0xbd, 0x1a, 0x53, 0xaf, 0x91, 0x41,\n  0x45, 0xa8, 0x49, 0xc4, 0x9c, 0x89, 0xe8, 0xb2, 0x8c, 0x89, 0xe1, 0x05,\n  0x13, 0xbf, 0x60, 0x41, 0x5a, 0x2d, 0x33, 0x6b, 0x96, 0x24, 0x2f, 0xcd,\n  0x85, 0x2e, 0xf5, 0x41, 0x5b, 0xb2, 0xca, 0x0a, 0x90, 0x1e, 0x01, 0xbf,\n  0x2f, 0x58, 0x1a, 0xcc, 0x97, 0x1d, 0xa0, 0xd5, 0x02, 0x4f, 0x40, 0x4b,\n  0x51, 0xab, 0xac, 0xd7, 0x12, 0x3e, 0x93, 0x4a, 0xea, 0x93, 0x5f, 0x08,\n  0x72, 0x83, 0xb0, 0x13, 0xc9, 0xfb, 0x93, 0x93, 0x6c, 0x4c, 0x11, 0xf8,\n  0x06, 0xab, 0x17, 0xc9, 0xcf, 0xba, 0x86, 0xc5, 0x3d, 0x27, 0x6c, 0x43,\n  0x1d, 0xd0, 0x78, 0xbb, 0x6b, 0xdc, 0x79, 0xf5, 0x42, 0xe3, 0xc6, 0x2d,\n  0xe4, 0xdf, 0x85, 0xde, 0xef, 0x84, 0x92, 0x3f, 0xfb, 0x77, 0x8c, 0x9d,\n  0xcf, 0x27, 0x5a, 0x46, 0xf0, 0xc5, 0xc1, 0xee, 0x06, 0xb5, 0x45, 0xad,\n  0x2f, 0xd6, 0x37, 0xb4, 0x8d, 0xff, 0x1a, 0x9d, 0x6a, 0x98, 0x6e, 0xb8,\n  0x7b, 0xb0, 0xbb, 0xfb, 0xfa, 0x69, 0xad, 0x4b, 0x6f, 0xbf, 0xb1, 0xbb,\n  0x94, 0xf0, 0x4a, 0xdb, 0xd2, 0x13, 0xf8, 0x6e, 0xa2, 0xfb, 0xba, 0x18,\n  0x3f, 0xd9, 0x71, 0xef, 0x48, 0xdb, 0x61, 0x75, 0xd8, 0x67, 0xc4, 0x1c,\n  0x1b, 0xf5, 0x62, 0x95, 0x48, 0x74, 0x2b, 0xca, 0x2e, 0xa0, 0xf9, 0xc6,\n  0xd5, 0x92, 0x31, 0xcb, 0x31, 0xa2, 0x8a, 0x13, 0xe7, 0x09, 0x32, 0x69,\n  0x63, 0x6f, 0xda, 0x98, 0xe9, 0x18, 0xa4, 0xc8, 0x4b, 0xb8, 0x3d, 0x28,\n  0x75, 0x26, 0x94, 0xca, 0x6e, 0xad, 0x78, 0xa0, 0xe0, 0xd8, 0xe9, 0x34,\n  0x91, 0x19, 0xb0, 0x57, 0x93, 0x39, 0xb8, 0xac, 0x66, 0xbb, 0xd9, 0x49,\n  0x24, 0x10, 0x51, 0x85, 0xa5, 0xfe, 0x74, 0x0d, 0x29, 0xb2, 0x31, 0xcb,\n  0x0a, 0x30, 0x91, 0x47, 0xd0, 0xd8, 0x09, 0x41, 0x9d, 0x11, 0xf2, 0x1b,\n  0x1f, 0x04, 0x0d, 0x0e, 0x5d, 0xfd, 0xd6, 0x77, 0x0d, 0xbc, 0x69, 0x77,\n  0xba, 0x79, 0x7f, 0x65, 0x20, 0x34, 0x5d, 0xf3, 0x83, 0xc4, 0xfe, 0xf6,\n  0xec, 0x2f, 0x2a, 0x77, 0x0e, 0xef, 0x3f, 0x81, 0x2e, 0xdc, 0x52, 0xd6,\n  0xea, 0x1a, 0xeb, 0x53, 0x7f, 0xf1, 0x3d, 0xfb, 0xde, 0x3e, 0xab, 0x8d,\n  0x04, 0x89, 0xa2, 0x3c, 0x62, 0x72, 0xe2, 0xec, 0x9f, 0xb3, 0xef, 0x31,\n  0x5b, 0x70, 0x2f, 0x7a, 0x6a, 0xf8, 0xfa, 0x61, 0x0d, 0x6e, 0x36, 0x3e,\n  0xf4, 0xe4, 0xcf, 0x91, 0x46, 0x90, 0x64, 0x07, 0x18, 0xb9, 0xb3, 0x54,\n  0x7e, 0x79, 0xc9, 0x4e, 0xd2, 0x9d, 0xee, 0x20, 0x98, 0x67, 0x08, 0xe6,\n  0xc1, 0xac, 0xdd, 0x4f, 0x60, 0x83, 0x45, 0x1e, 0x43, 0xed, 0xef, 0x79,\n  0x23, 0xc1, 0xf8, 0x81, 0x61, 0x41, 0xea, 0xc0, 0xce, 0x30, 0x44, 0xd3,\n  0xf0, 0x79, 0x8a, 0x41, 0x8e, 0xad, 0xd8, 0x1b, 0x4c, 0x64, 0x6f, 0x40,\n  0x56, 0x82, 0x50, 0xc0, 0xae, 0x33, 0x18, 0x0d, 0x12, 0xed, 0x9e, 0x20,\n  0x14, 0xbe, 0xac, 0x4e, 0xb0, 0x75, 0x23, 0x04, 0xad, 0x62, 0x02, 0xed,\n  0xd8, 0xf9, 0xd6, 0x33, 0xde, 0xdd, 0x99, 0xc9, 0xd9, 0x8d, 0xaf, 0x4d,\n  0xcc, 0x4e, 0x0e, 0xcd, 0x95, 0xdc, 0xf2, 0xd0, 0xce, 0x2a, 0xd1, 0x63,\n  0x5e, 0x30, 0x17, 0x77, 0xbe, 0xd9, 0xf3, 0x1c, 0xbe, 0x98, 0xfd, 0x0b,\n  0x11, 0xf8, 0x2f, 0x91, 0x7f, 0xe4, 0x07, 0xd2, 0xce, 0x85, 0x26, 0x6b,\n  0x6a, 0x37, 0x3d, 0x3b, 0x21, 0xf9, 0xa3, 0xb5, 0x44, 0x37, 0xf7, 0x10,\n  0x79, 0xd7, 0xc4, 0xec, 0x48, 0x6f, 0x75, 0x23, 0x5e, 0x80, 0x9e, 0x7a,\n  0x0d, 0xc4, 0x26, 0x4f, 0x91, 0x7b, 0x5c, 0x86, 0x98, 0xb3, 0x2a, 0xb2,\n  0xe7, 0x71, 0xec, 0xbc, 0x1a, 0x61, 0x62, 0xe4, 0x6a, 0x31, 0x9a, 0x07,\n  0xfd, 0x59, 0xae, 0x09, 0x45, 0x08, 0x97, 0xe8, 0x09, 0xb4, 0x3b, 0x22,\n  0x28, 0x04, 0xb0, 0xe9, 0xc9, 0x25, 0x82, 0xed, 0x60, 0x7c, 0x81, 0xec,\n  0x66, 0x9a, 0x50, 0x93, 0x5e, 0xe9, 0x66, 0x00, 0x73, 0x6f, 0x67, 0xa1,\n  0x37, 0x53, 0x43, 0xc3, 0xca, 0x9e, 0xa3, 0x12, 0xe9, 0x1a, 0x58, 0xd1,\n  0x6f, 0xf7, 0x83, 0xce, 0xad, 0x74, 0x9b, 0x0b, 0x5c, 0x7d, 0xb3, 0xb6,\n  0x7a, 0x93, 0xad, 0x6b, 0xa0, 0x51, 0x95, 0xfd, 0x3a, 0xba, 0x59, 0x25,\n  0xa6, 0xbb, 0x6b, 0xb7, 0x04, 0x5c, 0x91, 0x23, 0xf5, 0x7b, 0xaf, 0x16,\n  0x54, 0xa9, 0x2d, 0xa6, 0xee, 0xc1, 0x56, 0x35, 0xd9, 0x48, 0x6e, 0x50,\n  0x09, 0xef, 0x6e, 0x3a, 0x18, 0x0a, 0x9c, 0xd0, 0xec, 0x98, 0x8d, 0xf8,\n  0xd2, 0x36, 0xbf, 0xdb, 0xca, 0xa5, 0x0d, 0x5e, 0x67, 0x75, 0xd2, 0x6d,\n  0x1a, 0xb5, 0x14, 0x6d, 0x9c, 0xb4, 0xc7, 0x4d, 0x69, 0x93, 0xdf, 0x63,\n  0xe3, 0xd3, 0x46, 0xb7, 0xf3, 0xaa, 0x12, 0xd0, 0x03, 0x40, 0x0e, 0x01,\n  0x0d, 0x4f, 0x13, 0x1a, 0x2e, 0x26, 0x18, 0x3b, 0x99, 0xb6, 0xb8, 0xa1,\n  0xb8, 0x5f, 0xc0, 0xa3, 0xe3, 0xc9, 0x4f, 0x3d, 0x9c, 0x9d, 0xc9, 0xe4,\n  0xeb, 0x87, 0x4e, 0x62, 0xe7, 0xa1, 0x54, 0xc1, 0xa1, 0x5c, 0x9f, 0x0b,\n  0x2a, 0x97, 0xa4, 0x92, 0xca, 0xc7, 0xd9, 0x9c, 0xbf, 0xe6, 0x1c, 0x1d,\n  0x59, 0x78, 0x8c, 0xe4, 0xaf, 0x21, 0x2a, 0x25, 0xd1, 0x21, 0xc9, 0x7f,\n  0xb4, 0xd9, 0x6e, 0x8e, 0x40, 0x25, 0x8b, 0x42, 0xb4, 0x07, 0x73, 0xc4,\n  0x6b, 0x97, 0x8c, 0x0f, 0xf4, 0x58, 0xdd, 0xb6, 0x70, 0xc8, 0xdb, 0x57,\n  0x46, 0xec, 0xb1, 0x40, 0x5f, 0x55, 0xfa, 0xcd, 0x0f, 0xf6, 0xdc, 0xba,\n  0x73, 0xc7, 0xa1, 0xbd, 0x7b, 0xf1, 0x7f, 0x05, 0xb1, 0xdd, 0x9a, 0x31,\n  0x38, 0xf0, 0xe2, 0xe7, 0x89, 0xfd, 0x30, 0xa2, 0xd7, 0xe3, 0xbe, 0x3e,\n  0xcd, 0xb3, 0xef, 0xda, 0xf3, 0xc8, 0x2e, 0x75, 0xe4, 0x6a, 0xe3, 0x43,\n  0xd7, 0x5e, 0xf7, 0x90, 0x41, 0xf6, 0xa8, 0xa3, 0x97, 0x08, 0x5d, 0xba,\n  0x81, 0x26, 0x5d, 0x08, 0xab, 0x24, 0x3f, 0x9a, 0x8a, 0xb0, 0xe7, 0x69,\n  0x28, 0xe4, 0x71, 0x2b, 0x31, 0x91, 0x28, 0x92, 0x17, 0x04, 0x1a, 0xbd,\n  0xb3, 0x45, 0x00, 0x11, 0x3c, 0x2b, 0x82, 0x29, 0x3a, 0x2a, 0x75, 0x07,\n  0x36, 0x5b, 0xcc, 0xe6, 0x80, 0xd9, 0x12, 0xd0, 0x08, 0xde, 0x72, 0x3f,\n  0x0b, 0xed, 0x10, 0x01, 0x95, 0x11, 0xe8, 0xb4, 0x45, 0x36, 0x5a, 0x2a,\n  0x7f, 0x40, 0xd9, 0x43, 0xba, 0xa7, 0x1d, 0x63, 0x93, 0xe2, 0x17, 0x3e,\n  0xaf, 0x99, 0xcc, 0x38, 0xd0, 0x3b, 0x9e, 0xae, 0x51, 0xdf, 0x7a, 0x56,\n  0xdc, 0x35, 0xf6, 0x0c, 0x1a, 0xac, 0xa8, 0x6a, 0x4d, 0x37, 0xd6, 0xa5,\n  0xd3, 0xd1, 0xae, 0xf4, 0xc0, 0xb8, 0x36, 0xfb, 0x2c, 0xf8, 0x84, 0x1d,\n  0xe8, 0x31, 0xe6, 0xd7, 0xec, 0x7e, 0xa2, 0x64, 0xe8, 0xb3, 0x2f, 0x31,\n  0xc7, 0x18, 0xd5, 0xc7, 0x18, 0xf4, 0xc4, 0x31, 0x70, 0x04, 0x70, 0x4c,\n  0x2d, 0xd1, 0x79, 0x8d, 0x84, 0x2e, 0xad, 0x0c, 0x54, 0xc3, 0x6d, 0x66,\n  0xa6, 0xd2, 0x93, 0x5a, 0x62, 0x02, 0x62, 0x5e, 0x80, 0x46, 0xf2, 0xe0,\n  0xf6, 0x64, 0xc1, 0x7a, 0x96, 0x2a, 0x97, 0x8a, 0x44, 0x90, 0x8a, 0xfc,\n  0xbc, 0x46, 0x72, 0x60, 0x69, 0xa8, 0xa1, 0xa2, 0xa6, 0x0e, 0xac, 0x68,\n  0x94, 0xd8, 0xb8, 0x4c, 0x73, 0x63, 0x7d, 0x5d, 0xb4, 0x36, 0x5a, 0x0b,\n  0xad, 0x1e, 0x7d, 0x25, 0xb6, 0x88, 0x3d, 0xa2, 0x55, 0x33, 0x56, 0x62,\n  0x01, 0x08, 0x40, 0x97, 0xa0, 0x71, 0xb6, 0xe3, 0x44, 0x1d, 0xec, 0x11,\n  0x06, 0x1c, 0xad, 0x6b, 0x27, 0x7f, 0x57, 0x61, 0xc9, 0xf4, 0xf3, 0xe2,\n  0xa8, 0x59, 0x76, 0x28, 0x05, 0xed, 0x4a, 0x17, 0xc8, 0x20, 0x7a, 0xd7,\n  0xd8, 0xf9, 0xdd, 0x0d, 0x0d, 0xbb, 0xcf, 0x8f, 0x65, 0xce, 0xed, 0x6d,\n  0x82, 0x9f, 0xe9, 0x63, 0x9b, 0x6b, 0xaa, 0x36, 0x1e, 0xef, 0x9e, 0xb9,\n  0x6b, 0xac, 0x6a, 0xe3, 0x89, 0xf6, 0x07, 0x27, 0x32, 0x9b, 0xdb, 0x27,\n  0x7a, 0xa3, 0x15, 0xb1, 0x8a, 0x1e, 0x0d, 0xdc, 0x57, 0xc6, 0xc3, 0xcf,\n  0x64, 0xd5, 0xe4, 0x89, 0x9e, 0x8e, 0x13, 0x9b, 0x6b, 0xc7, 0xef, 0xda,\n  0x06, 0x3f, 0x66, 0xd1, 0x53, 0x3d, 0xdd, 0x5d, 0x99, 0x47, 0x7e, 0x14,\n  0x2e, 0x8b, 0x05, 0x61, 0x0f, 0xe1, 0x97, 0x5e, 0xc3, 0x9f, 0x26, 0xf8,\n  0x02, 0xdf, 0xab, 0x95, 0xac, 0xfd, 0xb7, 0x69, 0xab, 0x11, 0x09, 0xac,\n  0x13, 0xa9, 0xc4, 0xf2, 0x22, 0xac, 0x51, 0x11, 0x35, 0x44, 0xc3, 0xc9,\n  0x4d, 0x11, 0x9b, 0x08, 0xe6, 0x04, 0xf6, 0x1c, 0xec, 0x98, 0x44, 0x37,\n  0x13, 0x4f, 0x33, 0x9c, 0x46, 0xad, 0xe1, 0xd4, 0xa7, 0xb5, 0xd0, 0x9b,\n  0x90, 0x11, 0xd0, 0x7e, 0x1d, 0x01, 0xaf, 0x4a, 0x23, 0x12, 0x28, 0x91,\n  0xcb, 0x9a, 0x69, 0x46, 0xa3, 0x81, 0x12, 0x2c, 0x1a, 0xf5, 0x38, 0xb1,\n  0x04, 0xb5, 0xe4, 0x05, 0x75, 0xab, 0x5e, 0x50, 0xf0, 0x41, 0x8e, 0x3e,\n  0xc8, 0x11, 0xa0, 0x92, 0x4f, 0x1e, 0x2f, 0xfe, 0x1f, 0x7c, 0x2a, 0x18,\n  0x8c, 0x76, 0x9b, 0x4e, 0x57, 0x5d, 0x19, 0x8b, 0x78, 0xdc, 0xb6, 0x66,\n  0x7b, 0xb3, 0xce, 0xaa, 0xb3, 0xca, 0xf2, 0x4e, 0x20, 0xfc, 0x40, 0xe5,\n  0x9c, 0x35, 0x61, 0x0d, 0xa2, 0x04, 0x1f, 0x8d, 0x44, 0x41, 0x45, 0x59,\n  0x69, 0x33, 0xe4, 0x7a, 0xba, 0xad, 0xae, 0xe1, 0x85, 0x46, 0x7a, 0x82,\n  0xd7, 0x85, 0xba, 0xcf, 0x6d, 0x28, 0x1d, 0x40, 0xb7, 0x0f, 0x64, 0xf7,\n  0x04, 0x58, 0x91, 0x28, 0x59, 0x01, 0xf4, 0x95, 0x92, 0x16, 0xbb, 0xd9,\n  0x9a, 0xb4, 0x79, 0xdc, 0xa5, 0xb1, 0xe6, 0xf8, 0x48, 0xb7, 0xa7, 0xd5,\n  0x6c, 0x6b, 0x77, 0x05, 0xca, 0x54, 0xbe, 0x50, 0x63, 0xac, 0x05, 0x9d,\n  0x98, 0x9b, 0x43, 0x53, 0x8b, 0x0d, 0xf8, 0xe2, 0x17, 0x66, 0xd5, 0x45,\n  0x3a, 0x33, 0xbf, 0xe3, 0xc3, 0x7a, 0x4d, 0x52, 0xa5, 0x33, 0xda, 0x9c,\n  0x36, 0x83, 0xb5, 0x26, 0x5e, 0x9e, 0xd4, 0xa8, 0xdb, 0x34, 0x06, 0x93,\n  0x43, 0x6b, 0xb1, 0xea, 0x6c, 0x35, 0xc1, 0x78, 0x03, 0x95, 0x9b, 0x5e,\n  0x7a, 0x68, 0x57, 0x44, 0x6c, 0xe4, 0xaa, 0x74, 0x39, 0xb4, 0x55, 0x3c,\n  0x07, 0xad, 0xac, 0x19, 0x10, 0x8f, 0xe0, 0xf5, 0x86, 0x23, 0x31, 0x6e,\n  0x96, 0x47, 0x1c, 0x03, 0xfd, 0x97, 0xc0, 0x92, 0x86, 0x15, 0x0a, 0x02,\n  0xd1, 0xcf, 0x14, 0xb3, 0xd1, 0xec, 0xfd, 0xd5, 0x0f, 0x7e, 0x30, 0xdd,\n  0xff, 0xa1, 0xfe, 0x1f, 0x2f, 0xfe, 0x4a, 0xda, 0x3f, 0x1c, 0x4b, 0xaf,\n  0xe0, 0x2c, 0x3d, 0x8f, 0x31, 0x11, 0x79, 0xfc, 0x58, 0xda, 0xa3, 0xd7,\n  0xa9, 0x58, 0x35, 0x53, 0x86, 0x54, 0xea, 0x38, 0x62, 0x55, 0x09, 0x04,\n  0x1b, 0x18, 0x2f, 0xd8, 0x10, 0xf9, 0x46, 0xd0, 0xef, 0x85, 0x82, 0x2c,\n  0xe4, 0xd5, 0x64, 0x8c, 0xea, 0x00, 0x21, 0x16, 0x81, 0x17, 0x85, 0x05,\n  0xe8, 0x47, 0x41, 0x7d, 0xee, 0x0c, 0x6d, 0xcd, 0x83, 0x76, 0xe9, 0x38,\n  0x0d, 0x2b, 0xdb, 0x7a, 0x55, 0x97, 0x1a, 0xac, 0x91, 0x0c, 0x3d, 0xa8,\n  0x45, 0x07, 0xcd, 0x28, 0x68, 0x31, 0xba, 0x80, 0xc5, 0x0c, 0xc7, 0x3f,\n  0x52, 0xeb, 0x7a, 0xaf, 0xa7, 0xc8, 0x61, 0x6e, 0xb2, 0x34, 0x71, 0x26,\n  0x8e, 0xc8, 0x76, 0x7a, 0x0c, 0xa4, 0xd7, 0x3b, 0xcb, 0x13, 0x28, 0x81,\n  0x58, 0x73, 0x7d, 0x43, 0x0a, 0x30, 0x15, 0x4d, 0x25, 0xcc, 0x88, 0xa2,\n  0x26, 0xd7, 0x88, 0x6f, 0x45, 0x9b, 0x48, 0xa5, 0x75, 0x2a, 0xc5, 0xe1,\n  0x3e, 0xf4, 0xf7, 0x43, 0xd9, 0x8c, 0x93, 0x45, 0x9a, 0x22, 0x7d, 0x43,\n  0xf0, 0xec, 0x00, 0x3a, 0x16, 0x4e, 0x7b, 0x7b, 0xdb, 0xeb, 0x6b, 0x9a,\n  0xeb, 0x9b, 0x9a, 0xea, 0xaa, 0xe3, 0x25, 0xbe, 0x64, 0x71, 0xc8, 0xd7,\n  0x53, 0xd5, 0xd7, 0x5f, 0xee, 0x8d, 0x56, 0x6f, 0xc2, 0x17, 0x17, 0x1b,\n  0x90, 0x17, 0xd9, 0xdc, 0x65, 0x76, 0xb5, 0x5d, 0x1d, 0xad, 0xdd, 0x96,\n  0xdd, 0x94, 0xfd, 0xa1, 0xde, 0xb8, 0x21, 0x10, 0x0f, 0x86, 0xfc, 0xa9,\n  0xa8, 0xaf, 0xb4, 0xc4, 0x6e, 0xae, 0x72, 0xba, 0xdb, 0x6b, 0x62, 0xf5,\n  0x1a, 0x56, 0x4c, 0xc4, 0x9b, 0x07, 0x24, 0x7d, 0xfe, 0x15, 0xb6, 0x12,\n  0x7f, 0x87, 0xe8, 0x07, 0x25, 0x4c, 0x2f, 0x8a, 0x48, 0xd5, 0xd2, 0x7c,\n  0xc4, 0x6c, 0x43, 0x3a, 0xa4, 0x65, 0x52, 0x48, 0xa3, 0x6d, 0x20, 0x0a,\n  0x3e, 0x4e, 0x13, 0x18, 0x07, 0x90, 0xa8, 0xf2, 0x83, 0x55, 0x9d, 0x29,\n  0xa6, 0x23, 0xb8, 0x4b, 0x8c, 0x98, 0x96, 0x5e, 0x54, 0x47, 0x38, 0x54,\n  0x83, 0xb5, 0x9a, 0x03, 0x0c, 0xd6, 0x21, 0x56, 0x4d, 0xb6, 0x76, 0x00,\n  0xb1, 0xa8, 0x56, 0x2d, 0xd0, 0x33, 0x6f, 0xf0, 0xd5, 0x1f, 0x93, 0x8a,\n  0x86, 0x1a, 0x04, 0x3d, 0xab, 0x34, 0x1c, 0x05, 0xc4, 0x35, 0xac, 0xff,\n  0x24, 0x2d, 0x24, 0x9c, 0x7f, 0x8a, 0x95, 0xff, 0x34, 0xb1, 0x3b, 0xae,\n  0xf0, 0x41, 0xa8, 0xcc, 0x73, 0x50, 0x32, 0xe5, 0x0d, 0xf2, 0x21, 0xd8,\n  0x74, 0x3a, 0xe4, 0xf3, 0xba, 0xdd, 0x50, 0xe8, 0x9b, 0x6c, 0xd6, 0x15,\n  0xe5, 0xf1, 0x70, 0xd0, 0xdb, 0xeb, 0xeb, 0x75, 0x97, 0xb8, 0x89, 0x7e,\n  0x09, 0x2a, 0x94, 0x23, 0x1c, 0x33, 0x12, 0x3b, 0xca, 0x9a, 0x4c, 0x81,\n  0x10, 0x5c, 0x85, 0x35, 0xb2, 0x41, 0xb3, 0x04, 0xd9, 0xfc, 0x95, 0xe2,\n  0xb7, 0xe8, 0x64, 0x3c, 0x6e, 0x0c, 0x7b, 0xbd, 0xb5, 0xee, 0x60, 0x49,\n  0x4f, 0x79, 0x7a, 0xa0, 0xa5, 0x71, 0xfc, 0x8b, 0x77, 0x52, 0x9c, 0xa3,\n  0xbb, 0x2f, 0x89, 0x69, 0xe4, 0x6d, 0x38, 0x46, 0xc4, 0xb5, 0xa3, 0xb4,\n  0xd4, 0x69, 0xab, 0x72, 0x79, 0x37, 0xa4, 0x6a, 0x47, 0x92, 0xc3, 0xed,\n  0xd9, 0x7f, 0x03, 0x0a, 0x50, 0x5d, 0x06, 0xe3, 0x92, 0x8f, 0xf9, 0x65,\n  0xe8, 0x85, 0x8a, 0x05, 0x0e, 0x8a, 0x87, 0x98, 0x98, 0x1a, 0xa6, 0x8c,\n  0xfc, 0xe5, 0xc9, 0x9d, 0x35, 0x42, 0x35, 0xe7, 0x8d, 0xcc, 0x2c, 0x51,\n  0x20, 0x4f, 0x31, 0x6f, 0x60, 0xee, 0x61, 0xde, 0xc6, 0xbc, 0x9f, 0x79,\n  0x92, 0x79, 0x86, 0xf9, 0x62, 0xfa, 0x73, 0xa5, 0x4a, 0x57, 0xd7, 0x00,\n  0xe7, 0x67, 0x31, 0x0f, 0xb5, 0x72, 0xd8, 0x05, 0x15, 0x12, 0xd4, 0x48,\n  0xd4, 0x08, 0xe2, 0x82, 0x0e, 0x69, 0xf4, 0x48, 0x6b, 0xd0, 0x68, 0x17,\n  0x4c, 0xc8, 0x60, 0x46, 0x46, 0x8b, 0xc1, 0xb8, 0x60, 0x43, 0x16, 0x3b,\n  0xb2, 0x3a, 0x2c, 0xd6, 0x85, 0x22, 0xe4, 0x70, 0x21, 0xa7, 0xd7, 0xe1,\n  0x5c, 0x08, 0x23, 0x6f, 0xb1, 0xcf, 0x3b, 0x1d, 0xf2, 0x04, 0x59, 0x77,\n  0x09, 0x2a, 0xf6, 0xb9, 0x8b, 0xe1, 0x92, 0xd7, 0xb7, 0x8b, 0xf1, 0x79,\n  0x7d, 0xe3, 0x4f, 0xfd, 0xfd, 0x07, 0x3f, 0xf0, 0xc8, 0xdb, 0xa5, 0xd3,\n  0xc8, 0x7f, 0xfc, 0xd4, 0xdf, 0x3f, 0xf3, 0xd4, 0x33, 0x1f, 0xfd, 0xc8,\n  0x07, 0x9e, 0xfc, 0xe0, 0x93, 0xef, 0x7d, 0xf7, 0xdb, 0xdf, 0xff, 0xc8,\n  0xfb, 0x1f, 0x7e, 0xeb, 0x83, 0xf7, 0xdf, 0xfd, 0xa6, 0xdb, 0xcf, 0x9f,\n  0x3d, 0x7d, 0xe3, 0xf5, 0xd7, 0x5c, 0x75, 0xec, 0xc8, 0x81, 0xfd, 0x7b,\n  0xe6, 0x76, 0x6c, 0x9b, 0xda, 0x3c, 0x31, 0x96, 0x19, 0x84, 0x22, 0xd2,\n  0xb0, 0x99, 0x55, 0x55, 0xc4, 0x22, 0x6b, 0x4f, 0x30, 0x23, 0xc2, 0xca,\n  0xca, 0x51, 0xe2, 0x3a, 0x55, 0x8f, 0xf8, 0xbc, 0x3f, 0xc3, 0x79, 0xbf,\n  0xff, 0xdf, 0xbe, 0xbe, 0xde, 0x7c, 0xf2, 0xaf, 0xa3, 0xb8, 0xd6, 0x68,\n  0xd4, 0x6a, 0x4c, 0xa6, 0x41, 0xf9, 0xe7, 0xc7, 0xe5, 0x9f, 0xd9, 0xac,\n  0x49, 0x23, 0xfd, 0x8a, 0x5a, 0x95, 0xdf, 0xb2, 0x6f, 0xce, 0x5d, 0x7b,\n  0x38, 0x77, 0x6d, 0x53, 0xee, 0xda, 0x67, 0x0b, 0x5c, 0x7b, 0xb8, 0xc0,\n  0xb3, 0xb9, 0xf7, 0x7d, 0x7f, 0xd5, 0x67, 0x2a, 0x73, 0xc0, 0x1e, 0xfa,\n  0x83, 0x8c, 0xb2, 0x28, 0xbf, 0x28, 0x3f, 0x07, 0x96, 0x7f, 0xa5, 0x3f,\n  0xd3, 0xab, 0xfe, 0x1e, 0xbc, 0xcc, 0xdf, 0xab, 0xc7, 0x6b, 0x57, 0x7f,\n  0x40, 0xee, 0x13, 0x25, 0x7d, 0x9d, 0xd8, 0x97, 0xd0, 0x7f, 0x81, 0xb1,\n  0x33, 0xad, 0xd2, 0x2e, 0x2c, 0x1d, 0xff, 0x12, 0x5d, 0x8d, 0xa8, 0x73,\n  0x44, 0xe7, 0x99, 0x97, 0xa4, 0x80, 0x5a, 0xad, 0xd9, 0xa9, 0x45, 0x1a,\n  0xcd, 0x41, 0x0d, 0x78, 0x48, 0xec, 0x4c, 0xbe, 0x5d, 0xa1, 0x03, 0x9f,\n  0x53, 0x52, 0x36, 0x0f, 0xc1, 0x4f, 0x23, 0x1f, 0x84, 0xf8, 0xed, 0xbb,\n  0xc0, 0x0e, 0x9c, 0x79, 0x9c, 0xfc, 0x43, 0x8d, 0x3f, 0xe9, 0x9b, 0xee,\n  0x43, 0x7c, 0xf6, 0xaf, 0xe4, 0xc7, 0xdd, 0x63, 0xb9, 0xcf, 0x66, 0x5e,\n  0xc1, 0xaf, 0x10, 0x9d, 0x64, 0xa7, 0x74, 0x5a, 0x5f, 0xba, 0xce, 0x04,\n  0x0e, 0x91, 0xdd, 0x44, 0xad, 0x3e, 0xa8, 0x26, 0xe2, 0x6a, 0xbd, 0x21,\n  0xea, 0x59, 0x79, 0xc8, 0x74, 0xda, 0xb2, 0xd2, 0x85, 0x64, 0xd6, 0xae,\n  0x33, 0xbf, 0xc9, 0x21, 0xf2, 0x6f, 0x0a, 0xbe, 0xbd, 0x02, 0x73, 0x73,\n  0x65, 0x7f, 0x49, 0x7e, 0xbc, 0xc2, 0xa0, 0xa5, 0x45, 0x19, 0x26, 0x5e,\n  0xa6, 0x33, 0xbd, 0x01, 0xe2, 0x68, 0xcc, 0x3a, 0x4c, 0x76, 0xfe, 0x0c,\n  0xe4, 0x98, 0xf0, 0x18, 0xf1, 0x0b, 0x10, 0x00, 0x89, 0x59, 0x06, 0x2f,\n  0x80, 0xb6, 0x7b, 0x00, 0xec, 0x4e, 0x6e, 0x27, 0x23, 0x1b, 0x5f, 0xe4,\n  0x29, 0xaf, 0xc5, 0x02, 0xba, 0x2d, 0xd1, 0x6e, 0xf5, 0xde, 0x72, 0xab,\n  0x79, 0x39, 0x50, 0x34, 0x0a, 0xfd, 0xa4, 0xcc, 0x54, 0xb8, 0x05, 0x25,\n  0xf7, 0xbf, 0xf9, 0x9b, 0x3a, 0x8d, 0xcd, 0x2e, 0xd6, 0xf1, 0xb5, 0x65,\n  0x46, 0x35, 0x0a, 0x65, 0xcf, 0xea, 0xd4, 0x76, 0xbb, 0x90, 0xe0, 0xeb,\n  0xe2, 0x82, 0x4e, 0x20, 0x96, 0xd6, 0xbb, 0xf9, 0x92, 0x92, 0xe6, 0x5e,\n  0xee, 0x85, 0x31, 0xb4, 0x89, 0xfc, 0xd6, 0xd2, 0x43, 0xf4, 0xe8, 0x6a,\n  0x7a, 0xf6, 0xa9, 0x91, 0x7d, 0x5b, 0x46, 0xc6, 0xc3, 0x1c, 0x94, 0x6c,\n  0x8a, 0x30, 0x1c, 0x12, 0x72, 0x3c, 0x0b, 0xfd, 0xaf, 0xe4, 0xfa, 0xd2,\n  0x34, 0x7a, 0x01, 0x14, 0x6f, 0x74, 0x78, 0x58, 0x2d, 0x99, 0x87, 0xc5,\n  0xe9, 0xa0, 0x04, 0x38, 0x1e, 0x00, 0xb7, 0xe6, 0x09, 0x79, 0xd4, 0x74,\n  0xda, 0xce, 0x30, 0xd4, 0x47, 0xe0, 0xb0, 0x98, 0xe0, 0xcc, 0x3f, 0xec,\n  0x07, 0x67, 0x9c, 0x5b, 0xf6, 0x53, 0x2b, 0x4e, 0x9f, 0xa0, 0xd9, 0xac,\n  0x08, 0x6e, 0x00, 0x29, 0xc1, 0xf7, 0xd3, 0x6f, 0x3a, 0x9d, 0xbc, 0xe9,\n  0xe0, 0x44, 0xff, 0xbe, 0x3d, 0x53, 0xb3, 0x5b, 0xef, 0xbf, 0x1f, 0x3d,\n  0x33, 0xf2, 0xf4, 0xf1, 0x83, 0xe9, 0x83, 0x1d, 0xd9, 0x2c, 0x1a, 0xed,\n  0xd9, 0x3c, 0xdc, 0x7b, 0x6c, 0x44, 0x8a, 0x33, 0x82, 0x5e, 0x80, 0xb3,\n  0xd4, 0x86, 0x08, 0x32, 0x23, 0xe9, 0x21, 0x11, 0x61, 0xc1, 0x82, 0x58,\n  0x64, 0x45, 0x1c, 0xcb, 0x66, 0x18, 0x81, 0x28, 0x3e, 0x02, 0x9e, 0x57,\n  0x91, 0x2d, 0x87, 0x99, 0x15, 0x25, 0xe5, 0x83, 0xaa, 0x13, 0x72, 0x1f,\n  0xf2, 0xa3, 0xdc, 0x88, 0xa7, 0x18, 0x31, 0xbe, 0x92, 0xe2, 0xa0, 0x27,\n  0x08, 0x3d, 0xa6, 0xa9, 0xab, 0xd8, 0x8d, 0xdc, 0xea, 0x5c, 0xb1, 0x3b,\n  0xd9, 0x55, 0xbc, 0xa2, 0x0d, 0xf1, 0xb2, 0xdb, 0x18, 0x45, 0xce, 0xdd,\n  0x52, 0xd6, 0x11, 0xfa, 0xd2, 0xc2, 0x47, 0xee, 0x2e, 0xf5, 0xe9, 0x1d,\n  0x1a, 0x8d, 0xc7, 0xd2, 0x35, 0xf4, 0xb9, 0x7d, 0x07, 0xb7, 0x8c, 0x6d,\n  0x02, 0xd7, 0x6f, 0x53, 0xa6, 0x52, 0x72, 0xfd, 0xde, 0x51, 0x1d, 0x14,\n  0xb8, 0x8c, 0x20, 0x0e, 0x4d, 0xb0, 0x25, 0x23, 0xd9, 0xff, 0xea, 0xe9,\n  0xea, 0x6d, 0x91, 0x6a, 0xf6, 0x55, 0x2d, 0xd5, 0xa0, 0x7f, 0x21, 0xb4,\n  0x5b, 0xca, 0x40, 0x17, 0x97, 0x24, 0xf3, 0x43, 0xc9, 0x8b, 0xe7, 0x70,\n  0x1a, 0x89, 0x79, 0x1e, 0x32, 0x60, 0x01, 0x25, 0xea, 0x3c, 0xac, 0x4a,\n  0x84, 0x68, 0x05, 0x8e, 0x28, 0x00, 0x05, 0x6e, 0xf0, 0xe4, 0x86, 0x1c,\n  0x4f, 0x1d, 0x83, 0x57, 0x9e, 0x27, 0xcb, 0x16, 0x55, 0x02, 0xf5, 0x4d,\n  0x50, 0xab, 0x90, 0x3a, 0x28, 0x4e, 0x0e, 0xd3, 0x7e, 0x00, 0xbc, 0x8c,\n  0x3d, 0x89, 0x51, 0x2a, 0x18, 0x7a, 0x9c, 0xb7, 0xce, 0x78, 0xf0, 0xf5,\n  0x91, 0x87, 0x96, 0xab, 0xb3, 0xae, 0x1a, 0xbe, 0x3c, 0x52, 0xee, 0x88,\n  0xbc, 0x62, 0x38, 0xd9, 0xd5, 0x89, 0x02, 0x6d, 0xb7, 0xd9, 0xcc, 0xc9,\n  0xb8, 0x49, 0x4d, 0x78, 0xc7, 0x99, 0x3b, 0x04, 0x5c, 0xde, 0x96, 0xe9,\n  0x51, 0xa0, 0x5d, 0xae, 0x74, 0x67, 0x05, 0x1f, 0x59, 0x4a, 0x14, 0x03,\n  0x50, 0x4f, 0x31, 0xc9, 0x13, 0x9d, 0x9a, 0x28, 0x6f, 0x17, 0xba, 0x3a,\n  0xaa, 0x9b, 0xf7, 0xee, 0xaf, 0x53, 0xab, 0xcb, 0x32, 0xfe, 0xe2, 0xe0,\n  0xce, 0x7a, 0x8b, 0xb9, 0xbb, 0xab, 0x7f, 0x47, 0xda, 0xcc, 0x05, 0x87,\n  0xbb, 0x9f, 0x34, 0x9b, 0xe2, 0x83, 0x68, 0x54, 0x14, 0xdb, 0x3b, 0xa7,\n  0x97, 0x18, 0x9b, 0x25, 0x55, 0x1f, 0x7f, 0xfe, 0x39, 0xc3, 0x50, 0x7b,\n  0xff, 0xa4, 0xf6, 0xed, 0xc8, 0x65, 0xea, 0xb4, 0x16, 0xa3, 0xef, 0xff,\n  0x22, 0x78, 0x36, 0xfb, 0x40, 0xa6, 0xa2, 0x0c, 0x1d, 0x0e, 0x55, 0xeb,\n  0xcf, 0xe2, 0x36, 0x16, 0x3d, 0x8b, 0x86, 0x86, 0x3b, 0x8b, 0x43, 0x9a,\n  0xbf, 0xd3, 0x25, 0x28, 0x0d, 0x99, 0x08, 0x0e, 0x2e, 0x10, 0x1c, 0x80,\n  0x9f, 0xfd, 0x5c, 0xda, 0x6a, 0x52, 0x11, 0xb1, 0xe0, 0x2f, 0xb2, 0x12,\n  0xf9, 0xe0, 0x73, 0x61, 0x56, 0xea, 0xb3, 0x16, 0xa7, 0x4a, 0x2d, 0xb1,\n  0x45, 0x39, 0xcc, 0x9e, 0x06, 0xe7, 0xfc, 0x79, 0x2a, 0x4f, 0xd4, 0x2a,\n  0x1e, 0x02, 0x5d, 0x67, 0xa5, 0x20, 0xa0, 0xfc, 0xe6, 0x6a, 0x51, 0x86,\n  0xc3, 0xdc, 0x39, 0x08, 0xdd, 0x3d, 0x47, 0x87, 0xaf, 0x37, 0x72, 0x3a,\n  0x6d, 0x2e, 0x2d, 0x2d, 0x0d, 0x94, 0x06, 0xc2, 0x44, 0xab, 0x35, 0x5b,\n  0xed, 0x26, 0x60, 0x76, 0x67, 0x10, 0xc2, 0x10, 0x09, 0x8b, 0xa4, 0x52,\n  0x09, 0x3b, 0xf8, 0xdd, 0xed, 0x41, 0x36, 0x8f, 0x00, 0xa3, 0x56, 0x7b,\n  0x6a, 0x7f, 0xd7, 0xb8, 0xce, 0x90, 0x19, 0x0e, 0xd6, 0x6f, 0xed, 0xeb,\n  0x1a, 0xb4, 0x9c, 0x72, 0x96, 0xdb, 0xca, 0xf4, 0x86, 0xfa, 0x22, 0x7b,\n  0xcc, 0xac, 0xee, 0x7d, 0x1e, 0x21, 0x6b, 0x32, 0x88, 0x1a, 0xcb, 0x82,\n  0x27, 0x6e, 0xf8, 0x97, 0xdf, 0x36, 0x65, 0x6f, 0xf7, 0x8a, 0x5c, 0x97,\n  0xa8, 0x16, 0x45, 0xf4, 0xfc, 0x4f, 0x7e, 0xa2, 0xd4, 0x0c, 0xef, 0x86,\n  0xdc, 0x23, 0x2c, 0xe0, 0xdb, 0x18, 0xe9, 0x5c, 0xaf, 0x17, 0xef, 0x27,\n  0x30, 0x70, 0x31, 0x3b, 0x9f, 0x22, 0xf3, 0xe4, 0x90, 0xbc, 0x66, 0xaf,\n  0xd4, 0xb5, 0x7b, 0xb7, 0xec, 0x62, 0x20, 0x6a, 0x37, 0xb8, 0x0f, 0x4e,\n  0x0e, 0xf3, 0x4a, 0x7b, 0x6f, 0x65, 0xc0, 0xf2, 0x2d, 0x18, 0xca, 0xce,\n  0xca, 0x03, 0x24, 0xd7, 0x02, 0x78, 0xc1, 0x02, 0x64, 0x75, 0x11, 0x70,\n  0x2d, 0x58, 0xed, 0x36, 0x25, 0x1e, 0xc2, 0x0c, 0x62, 0x20, 0x77, 0x0c,\n  0x67, 0xfe, 0x08, 0x2f, 0xb8, 0xa7, 0xeb, 0xe7, 0xe6, 0x46, 0xb7, 0x8c,\n  0x5e, 0x3b, 0xd3, 0x35, 0x85, 0x5f, 0xf9, 0x69, 0x2c, 0x18, 0x2f, 0xdb,\n  0x3e, 0x9f, 0x7d, 0x29, 0xfb, 0xda, 0xa7, 0xd1, 0x96, 0x33, 0x7b, 0x77,\n  0x64, 0x7f, 0x8b, 0x5f, 0xa1, 0xf3, 0x85, 0xf9, 0xdf, 0x48, 0xf8, 0xde,\n  0x02, 0xf1, 0x61, 0x66, 0xad, 0xc0, 0x13, 0xf1, 0x83, 0x32, 0x10, 0x8a,\n  0x46, 0x48, 0x74, 0x37, 0x47, 0xdb, 0x49, 0x41, 0x38, 0x0e, 0x31, 0x30,\n  0xc8, 0x78, 0x0b, 0x63, 0x21, 0xa6, 0x96, 0x14, 0x7d, 0x16, 0x86, 0x8f,\n  0x64, 0x45, 0x38, 0xe9, 0x03, 0xdf, 0x46, 0x2a, 0x81, 0xac, 0xf8, 0xc6,\n  0xcd, 0xe1, 0xc5, 0x81, 0x99, 0x19, 0x6f, 0xbb, 0xef, 0xf3, 0x0b, 0xd9,\n  0x9f, 0xff, 0x6e, 0x2c, 0xfb, 0xe7, 0xcf, 0xa0, 0xc9, 0x34, 0xf9, 0xb0,\n  0x8b, 0xd9, 0x77, 0x05, 0xba, 0x03, 0xdf, 0xcf, 0xfe, 0x53, 0xf6, 0x69,\n  0x26, 0x07, 0xa7, 0x20, 0x99, 0x83, 0x93, 0x99, 0x4d, 0xab, 0x1d, 0x06,\n  0xf8, 0xdc, 0x1c, 0xac, 0x5c, 0xca, 0xc7, 0x4b, 0x8c, 0x04, 0x1d, 0xc2,\n  0xe5, 0x29, 0xc8, 0x51, 0x72, 0xf2, 0x3d, 0x1a, 0x55, 0x09, 0x52, 0x28,\n  0x6f, 0x84, 0x14, 0x25, 0xe7, 0x64, 0x9c, 0xee, 0x15, 0xf3, 0x8c, 0x12,\n  0xcc, 0x43, 0xf5, 0x47, 0x41, 0x4c, 0xb4, 0x63, 0x38, 0x3d, 0x77, 0xe2,\n  0xe0, 0x96, 0xf8, 0xa7, 0xdb, 0xb6, 0x6c, 0x61, 0x11, 0x27, 0x14, 0xb9,\n  0xd4, 0x1f, 0x9a, 0xff, 0xc1, 0x13, 0x83, 0x04, 0x3a, 0xaf, 0x26, 0x9f,\n  0xc5, 0xaf, 0x64, 0x4f, 0x9a, 0xea, 0xad, 0x2a, 0xaf, 0x4f, 0xf3, 0xd4,\n  0xcf, 0x7f, 0x4d, 0xe6, 0x1a, 0x21, 0x30, 0xb2, 0x13, 0x18, 0x69, 0x99,\n  0x64, 0xba, 0x0e, 0x6a, 0x7d, 0xb3, 0x10, 0x51, 0x93, 0xa1, 0xd6, 0x1f,\n  0x78, 0x82, 0x94, 0xe6, 0x01, 0x60, 0x6c, 0x31, 0xd4, 0x6f, 0x29, 0x05,\n  0xea, 0x59, 0xcc, 0x16, 0xb3, 0x40, 0x64, 0x34, 0x9f, 0xf4, 0x27, 0x11,\n  0xf4, 0x2b, 0x47, 0x7e, 0x33, 0x7a, 0x26, 0x3b, 0x8f, 0xae, 0xcd, 0x3e,\n  0x88, 0x7e, 0x90, 0xbd, 0x1d, 0x9d, 0xfd, 0xcc, 0x67, 0xba, 0x71, 0xc3,\n  0x58, 0xf7, 0xe2, 0xc5, 0xec, 0x9f, 0xc9, 0xe7, 0x44, 0x97, 0x7a, 0xa1,\n  0x76, 0xe0, 0xa5, 0x3f, 0xe7, 0xf0, 0x15, 0x7d, 0x8e, 0x1d, 0x4d, 0x65,\n  0xbf, 0x89, 0x4a, 0xb3, 0x7f, 0x44, 0xc7, 0xb2, 0x3f, 0x43, 0xc1, 0x4f,\n  0x7f, 0xba, 0x19, 0x3d, 0xdc, 0xdd, 0x99, 0x3d, 0x92, 0x95, 0x7c, 0x62,\n  0x2f, 0xe3, 0x47, 0xf0, 0x0b, 0x8c, 0x8d, 0xc8, 0xfa, 0xf9, 0x4f, 0xa8,\n  0x59, 0x2c, 0x81, 0x1e, 0x04, 0x9f, 0x4b, 0x84, 0x63, 0xc2, 0x5d, 0x44,\n  0xd8, 0xcb, 0x27, 0xe9, 0x78, 0x17, 0x84, 0x53, 0x1d, 0xc4, 0xe0, 0xff,\n  0xa2, 0xe7, 0x32, 0xd2, 0x00, 0x01, 0xc9, 0xbe, 0x2f, 0x6a, 0x52, 0x52,\n  0x37, 0x3e, 0xf5, 0x7f, 0x39, 0x1d, 0x76, 0xc4, 0x78, 0xdc, 0xf6, 0xa0,\n  0x23, 0x68, 0xd0, 0x51, 0xf7, 0xa0, 0x0d, 0xd9, 0x94, 0x03, 0x77, 0xc2,\n  0x80, 0xb9, 0x5a, 0x9c, 0x4a, 0xd3, 0x42, 0x29, 0xf4, 0x85, 0x76, 0x37,\n  0x8d, 0xa0, 0x83, 0x03, 0x27, 0x3c, 0xbc, 0xb1, 0xaf, 0xcf, 0xc8, 0x7b,\n  0x8e, 0x8d, 0xcd, 0x9e, 0xeb, 0xe9, 0xb9, 0x6d, 0xe7, 0xdc, 0xa1, 0x43,\n  0xbb, 0xa7, 0xb6, 0x87, 0x42, 0x3b, 0xf0, 0x0b, 0xa9, 0xea, 0x6d, 0x8b,\n  0x0d, 0xdb, 0xaa, 0x1a, 0xb7, 0x3d, 0x7a, 0xf4, 0xe8, 0xfb, 0xb6, 0x8e,\n  0x3c, 0x7c, 0xdb, 0x6d, 0x0f, 0x37, 0xcc, 0x6e, 0x78, 0x78, 0xc3, 0xce,\n  0xa4, 0x9c, 0x47, 0xe0, 0xc2, 0x25, 0x84, 0x0f, 0x77, 0x51, 0xfa, 0x82,\n  0x5a, 0x99, 0x4f, 0xe3, 0xe7, 0x99, 0x38, 0x73, 0x62, 0xe8, 0x89, 0x18,\n  0x9c, 0xaf, 0x43, 0x04, 0x6e, 0xd0, 0x6d, 0x24, 0x82, 0x07, 0xd1, 0xf3,\n  0x75, 0xf2, 0x37, 0x97, 0xfb, 0x7b, 0x5a, 0x1a, 0x64, 0xa3, 0xf1, 0x96,\n  0x3c, 0x27, 0xb0, 0xb0, 0xc5, 0xe5, 0x56, 0x5e, 0xc4, 0x4b, 0xdd, 0x5f,\n  0xc0, 0xe9, 0x27, 0xad, 0x5c, 0xbe, 0x35, 0x9d, 0xb6, 0x92, 0x5d, 0xcf,\n  0x0b, 0x6e, 0x5d, 0x8d, 0x5a, 0xe0, 0x98, 0x38, 0x8a, 0x8b, 0x74, 0xb1,\n  0x4e, 0xbb, 0x14, 0x86, 0x11, 0x64, 0xab, 0x30, 0xf8, 0x38, 0xc8, 0x2f,\n  0x09, 0xab, 0x54, 0x30, 0xdb, 0x9a, 0xfb, 0xa5, 0xa1, 0x81, 0xbd, 0xa7,\n  0xd8, 0xaa, 0xb7, 0xba, 0x9d, 0x9a, 0x7b, 0xb7, 0x9e, 0x57, 0x99, 0x34,\n  0x18, 0x59, 0x0d, 0xb7, 0x6d, 0x7d, 0x7a, 0xc7, 0x51, 0x9d, 0x99, 0xe7,\n  0x6d, 0xfa, 0x9b, 0xb7, 0xdf, 0x6c, 0xb0, 0xf1, 0xbc, 0x45, 0x37, 0x61,\n  0x6c, 0xc0, 0xcf, 0x8b, 0x03, 0x7c, 0x28, 0xba, 0xf8, 0x65, 0xf4, 0x42,\n  0x49, 0x73, 0xa5, 0x5a, 0x3f, 0x59, 0x95, 0xad, 0x26, 0x5c, 0x95, 0xa9,\n  0xda, 0x1c, 0x89, 0x6e, 0xab, 0x40, 0x1f, 0xcd, 0x8e, 0x54, 0x6d, 0x0d,\n  0x86, 0xb7, 0x54, 0xa3, 0x9e, 0x36, 0x5a, 0xb2, 0x57, 0x0b, 0xbd, 0xb8,\n  0x70, 0x80, 0xd8, 0x46, 0x5b, 0xd2, 0x7a, 0x0f, 0x62, 0x99, 0xb2, 0x12,\n  0xb3, 0xc0, 0x71, 0xac, 0x52, 0x0d, 0xd8, 0xc6, 0x48, 0xae, 0x01, 0x82,\n  0xe7, 0xc3, 0xc3, 0x02, 0x8f, 0x65, 0x5d, 0xa4, 0x08, 0x82, 0xd0, 0x0e,\n  0xe7, 0x3c, 0xf7, 0x27, 0x73, 0xb7, 0x24, 0xbe, 0xaa, 0x61, 0x6a, 0xac,\n  0xe1, 0x72, 0x37, 0xe5, 0xab, 0x84, 0xb4, 0x22, 0xe0, 0x27, 0x69, 0x49,\n  0x09, 0x90, 0x02, 0x92, 0x1a, 0x25, 0x85, 0x6b, 0xc9, 0xcb, 0x0f, 0x1a,\n  0xb0, 0xc8, 0xbe, 0xe3, 0x81, 0xad, 0x83, 0x5a, 0x1b, 0xc7, 0x71, 0x5a,\n  0x83, 0x38, 0xbb, 0x73, 0x9b, 0xd6, 0x4e, 0xe6, 0x62, 0xd3, 0xd4, 0x69,\n  0x6b, 0xc2, 0xe6, 0x12, 0x2d, 0x6f, 0x56, 0x99, 0xdd, 0xe2, 0xfe, 0xf9,\n  0x6d, 0x2a, 0x93, 0x16, 0x73, 0x48, 0x6b, 0x54, 0xef, 0xc4, 0x45, 0xd9,\n  0x7f, 0x2b, 0x9f, 0x2a, 0x31, 0xd7, 0xa5, 0x1c, 0xa8, 0x2a, 0xfb, 0xed,\n  0xc0, 0x58, 0x89, 0x6b, 0xaa, 0xea, 0x7b, 0x55, 0x41, 0x91, 0xef, 0xc0,\n  0xac, 0xab, 0x24, 0xbb, 0x0d, 0x55, 0x79, 0x9a, 0xab, 0x34, 0x9a, 0xea,\n  0x66, 0x4f, 0xf6, 0x3b, 0x92, 0xfe, 0x85, 0x5e, 0xc3, 0x51, 0xc6, 0xcf,\n  0x54, 0x30, 0xfd, 0xe9, 0x9e, 0x98, 0x07, 0x73, 0xbc, 0x80, 0x58, 0x0e,\n  0x82, 0xb7, 0xe0, 0xa8, 0x89, 0xa1, 0xfe, 0x4f, 0x88, 0xb5, 0x25, 0x14,\n  0x4c, 0xb4, 0x18, 0x8a, 0x47, 0xda, 0xc4, 0x97, 0xa0, 0x31, 0x18, 0x40,\n  0x4c, 0xa0, 0x22, 0x58, 0x51, 0x4c, 0xd4, 0x2b, 0x38, 0x95, 0x64, 0xfc,\n  0xc8, 0xaf, 0xca, 0x1d, 0x72, 0x8b, 0x4e, 0x2f, 0x96, 0x97, 0xc9, 0x06,\n  0x09, 0x32, 0x83, 0x49, 0xb2, 0x81, 0x44, 0x96, 0x43, 0xb7, 0x9c, 0xa0,\n  0xc0, 0x7c, 0x22, 0xd9, 0xdb, 0xde, 0x6c, 0x51, 0x59, 0x0c, 0x2c, 0xc7,\n  0x19, 0x2d, 0xaa, 0x53, 0x3b, 0xbe, 0xb5, 0x77, 0xab, 0x2d, 0x59, 0x64,\n  0x0b, 0x99, 0xb4, 0x86, 0x81, 0x44, 0x91, 0x4d, 0xaf, 0x4d, 0x17, 0xe1,\n  0x68, 0x5b, 0xb2, 0x71, 0x8b, 0xbb, 0xc6, 0xd1, 0x50, 0x6b, 0x36, 0xd7,\n  0x35, 0xd8, 0x51, 0xeb, 0xe2, 0xaf, 0x5e, 0xe6, 0xd8, 0x01, 0x84, 0x4b,\n  0x9b, 0x5c, 0x2d, 0x1b, 0xba, 0xfd, 0xc4, 0x34, 0x2f, 0xf5, 0x75, 0xda,\n  0x3d, 0x0c, 0x75, 0x2e, 0x53, 0x9f, 0xae, 0xc8, 0x04, 0x21, 0x7d, 0x45,\n  0x8e, 0x49, 0x06, 0xaa, 0x5c, 0x3e, 0x18, 0x5d, 0x0e, 0x80, 0x06, 0x35,\n  0x1a, 0x54, 0xd9, 0x5d, 0x33, 0xa8, 0x2e, 0x0b, 0x27, 0x02, 0xdf, 0x1e,\n  0xcd, 0x3e, 0x29, 0xc9, 0x59, 0xf2, 0xed, 0xe3, 0x44, 0xa6, 0x48, 0xef,\n  0x91, 0x42, 0xf0, 0xe6, 0xe1, 0x15, 0x87, 0xe5, 0xb5, 0xaf, 0x78, 0x8f,\n  0x95, 0xb6, 0x58, 0x25, 0x1b, 0x08, 0x58, 0x06, 0x53, 0xb8, 0xe8, 0xa7,\n  0x83, 0xff, 0x81, 0x8b, 0xe4, 0xde, 0xcb, 0x2f, 0xe3, 0x77, 0x60, 0x38,\n  0x87, 0x09, 0x31, 0x95, 0xe9, 0x32, 0x1a, 0x9d, 0xef, 0x36, 0x60, 0xc8,\n  0xbf, 0x91, 0xa3, 0xdf, 0x10, 0x04, 0x13, 0xc8, 0x47, 0x05, 0x81, 0x52,\n  0xab, 0x99, 0x71, 0x21, 0x17, 0x97, 0x6b, 0x73, 0x9c, 0x72, 0x0a, 0x52,\n  0x11, 0x78, 0x73, 0x7d, 0xee, 0xbc, 0x32, 0xaa, 0x38, 0x21, 0xec, 0x68,\n  0xf7, 0xdd, 0xef, 0x68, 0xae, 0xe8, 0x0e, 0x57, 0x56, 0x8f, 0x54, 0x4d,\n  0x0e, 0xb4, 0x4f, 0xd5, 0x8c, 0xde, 0x5d, 0x9b, 0x98, 0xa8, 0x69, 0xab,\n  0x2e, 0xa9, 0xd0, 0x9c, 0x7f, 0x60, 0xfc, 0xb6, 0x86, 0xea, 0xda, 0x83,\n  0xbd, 0x03, 0x9b, 0xa3, 0x3c, 0x8a, 0x6d, 0xdd, 0xd1, 0x75, 0x6a, 0x74,\n  0xd7, 0x99, 0x8e, 0x21, 0xbe, 0x66, 0x5b, 0xef, 0x8e, 0xdd, 0x35, 0x1b,\n  0x24, 0xfd, 0xd5, 0xc4, 0x0c, 0xa2, 0x4e, 0xf4, 0x1b, 0x1a, 0xeb, 0xac,\n  0x7a, 0x4a, 0xe0, 0xc8, 0xcc, 0xea, 0xca, 0x53, 0xd1, 0xb0, 0x13, 0x91,\n  0xaf, 0xfa, 0x10, 0x32, 0x84, 0xb2, 0xff, 0x09, 0xdf, 0x5f, 0x4b, 0x7e,\n  0x2a, 0x99, 0x7d, 0x33, 0xf9, 0x46, 0x9e, 0x89, 0xe1, 0x33, 0x48, 0xcf,\n  0x3e, 0x4c, 0x9e, 0x31, 0x32, 0x15, 0xe9, 0x38, 0x47, 0x5b, 0x24, 0xc2,\n  0xcb, 0xce, 0x33, 0xd0, 0x4c, 0x71, 0x5a, 0xe6, 0x02, 0x16, 0x8f, 0x33,\n  0x8c, 0x01, 0x02, 0xcd, 0xc0, 0x27, 0xc6, 0x0b, 0xce, 0x72, 0x44, 0x36,\n  0x3d, 0x31, 0xcf, 0xd2, 0x45, 0xfa, 0x81, 0x7a, 0x9f, 0x1d, 0x92, 0x1b,\n  0xec, 0x3e, 0xf6, 0xe1, 0xec, 0x2f, 0x91, 0xeb, 0x4e, 0x0f, 0xf9, 0x57,\n  0x52, 0x5c, 0x4c, 0xe7, 0x16, 0xc3, 0x35, 0xa8, 0x8d, 0xed, 0x23, 0x3c,\n  0x69, 0x04, 0x2c, 0x18, 0x21, 0x3d, 0x2f, 0x63, 0xd0, 0x63, 0x66, 0x80,\n  0x06, 0x79, 0x4f, 0xcb, 0x87, 0x09, 0x88, 0x19, 0x0f, 0x05, 0xb0, 0x50,\n  0x54, 0x6e, 0xcd, 0x7b, 0x35, 0x64, 0x1c, 0xdc, 0xab, 0xbc, 0xfb, 0x23,\n  0x5f, 0xae, 0xff, 0x0a, 0x6b, 0x94, 0x5f, 0x9d, 0xfc, 0x4a, 0xe2, 0x2b,\n  0x8c, 0xfc, 0xfe, 0x1d, 0xa8, 0x43, 0x7e, 0x7f, 0x80, 0x66, 0xf6, 0x43,\n  0x5a, 0xdf, 0x02, 0x5d, 0x04, 0x44, 0xb0, 0xc3, 0xbe, 0xc1, 0xe2, 0x51,\n  0xb3, 0x25, 0x14, 0xe0, 0x04, 0xf7, 0xca, 0xd7, 0x93, 0xed, 0xe2, 0x57,\n  0xca, 0xeb, 0xa7, 0x61, 0xe6, 0xb9, 0xf7, 0x3f, 0x47, 0xcb, 0x03, 0xc4,\n  0xf0, 0x46, 0x54, 0x87, 0xff, 0x0f, 0xd9, 0x71, 0x7b, 0x25, 0x7f, 0xb2,\n  0x93, 0xce, 0xf9, 0x18, 0xf9, 0x5c, 0x4c, 0xbd, 0xa0, 0x78, 0x27, 0x8d,\n  0xf2, 0x1f, 0x23, 0x2a, 0xb5, 0x9c, 0xdb, 0xb3, 0xea, 0x86, 0x94, 0xcc,\n  0x2f, 0x45, 0xfc, 0xc3, 0xe2, 0xc0, 0x5c, 0xb1, 0xc7, 0xbe, 0x9b, 0xc4,\n  0x1b, 0x93, 0xc7, 0x1f, 0xa3, 0x34, 0xda, 0x8b, 0xfb, 0xd1, 0xbb, 0xd8,\n  0xdb, 0x89, 0x3e, 0x6c, 0x4d, 0x9b, 0x68, 0x78, 0xff, 0x39, 0x02, 0x92,\n  0x6b, 0x08, 0x4d, 0xb2, 0x02, 0xa1, 0x49, 0x67, 0xd0, 0x4e, 0x76, 0xf0,\n  0x3f, 0x7d, 0xe4, 0xb6, 0xcc, 0x6d, 0xec, 0xed, 0x9f, 0x3d, 0x7b, 0x56,\n  0x7e, 0xa6, 0x99, 0x3c, 0x73, 0xbd, 0xf4, 0x0c, 0xfd, 0x60, 0x70, 0x73,\n  0xe6, 0x9e, 0x89, 0xd2, 0x98, 0x1d, 0xfa, 0x0c, 0x6e, 0x96, 0x9e, 0xc1,\n  0x4c, 0x3f, 0xea, 0x67, 0xbe, 0xc4, 0xee, 0xa5, 0xf8, 0x0e, 0xc1, 0x76,\n  0x26, 0x4d, 0x97, 0x01, 0xed, 0x92, 0xa5, 0x51, 0x9c, 0xb0, 0x91, 0x61,\n  0x76, 0x3c, 0x14, 0x34, 0x9b, 0x28, 0xa4, 0x88, 0xd4, 0x66, 0xf3, 0x7c,\n  0x19, 0xef, 0x6d, 0x72, 0x1d, 0xbc, 0x2a, 0xe4, 0x76, 0x85, 0xc3, 0x2e,\n  0x77, 0x08, 0xfb, 0x50, 0x6f, 0x36, 0x1a, 0xf6, 0x7a, 0xc3, 0xa1, 0xd2,\n  0x52, 0xf9, 0xfd, 0x13, 0xe4, 0xfd, 0x47, 0x29, 0x1e, 0x22, 0xe9, 0x20,\n  0xb9, 0x42, 0x6c, 0x52, 0xa2, 0xe5, 0xb2, 0xec, 0xad, 0xab, 0x11, 0x5d,\n  0x08, 0x17, 0x62, 0xc2, 0x1a, 0xfc, 0x92, 0xf2, 0xf6, 0xad, 0xe4, 0xa3,\n  0xd8, 0x72, 0xf9, 0xed, 0xff, 0x90, 0xfd, 0x34, 0xe8, 0x9a, 0xfd, 0xcc,\n  0x07, 0x98, 0x2f, 0xe1, 0x67, 0x59, 0x51, 0x84, 0xfa, 0xfb, 0x9b, 0xe5,\n  0xc8, 0xca, 0xcd, 0x72, 0x9e, 0x1c, 0xe4, 0x9e, 0x3c, 0x4f, 0xf3, 0x6d,\n  0xd5, 0x8c, 0xf0, 0x24, 0x8f, 0x50, 0x1d, 0x81, 0x35, 0x6f, 0x8f, 0xda,\n  0xa3, 0xc9, 0xa8, 0x3d, 0x86, 0xf6, 0xbd, 0x2d, 0xb9, 0x0b, 0x6b, 0x3e,\n  0xf7, 0xc6, 0xe6, 0xd6, 0x93, 0xf6, 0x13, 0x91, 0xdb, 0xe8, 0xf8, 0xa5,\n  0x25, 0x74, 0x37, 0x1a, 0xa0, 0xe3, 0x89, 0x58, 0xa8, 0x2b, 0xe7, 0xc3,\n  0x49, 0xa7, 0xdd, 0x09, 0x5f, 0xe8, 0xee, 0xec, 0xc3, 0xc9, 0x5d, 0xc9,\n  0xb7, 0xa1, 0x3b, 0x3e, 0x67, 0xbb, 0x2d, 0x44, 0x9e, 0x68, 0x25, 0x9f,\n  0x1f, 0x5b, 0xaa, 0x42, 0xd7, 0x2f, 0x3d, 0xc7, 0x42, 0x65, 0x65, 0xe6,\n  0xb5, 0xe7, 0xa5, 0xc8, 0xcf, 0xd7, 0x9e, 0x97, 0x3f, 0x9f, 0xac, 0x9f,\n  0xd9, 0x4c, 0xe6, 0x17, 0xa1, 0x7e, 0x38, 0x4f, 0xda, 0x05, 0xeb, 0xc7,\n  0x04, 0xdc, 0xf2, 0x51, 0xd9, 0x49, 0x34, 0x12, 0x0a, 0x91, 0x55, 0x13,\n  0x45, 0xc5, 0x9a, 0x07, 0x53, 0x73, 0xde, 0xef, 0xfd, 0x21, 0x97, 0x3b,\n  0x1c, 0x76, 0xbb, 0x42, 0xca, 0x4f, 0xf4, 0x6f, 0x52, 0x08, 0x7d, 0x69,\n  0xf6, 0xc5, 0x1c, 0xa0, 0x31, 0x53, 0xc7, 0x7c, 0x02, 0xdd, 0x85, 0x9e,\n  0xa5, 0xbc, 0x5e, 0x93, 0xae, 0x24, 0xb6, 0x1a, 0x82, 0xe4, 0xb9, 0x79,\n  0x38, 0xe4, 0x22, 0x14, 0xcf, 0xa3, 0x1c, 0xc9, 0x83, 0x77, 0x3b, 0x2f,\n  0xad, 0x41, 0x90, 0xf2, 0x6e, 0x4a, 0xb0, 0x3f, 0x59, 0x87, 0xb6, 0x66,\n  0x1f, 0x45, 0x37, 0xf7, 0xf5, 0x9d, 0xe9, 0xeb, 0xa3, 0x18, 0x61, 0x7e,\n  0xcc, 0x7c, 0x86, 0xfa, 0xe6, 0xad, 0x34, 0xac, 0x5e, 0x8a, 0x42, 0x61,\n  0x46, 0xcc, 0x26, 0xac, 0x2f, 0x2a, 0x4f, 0x11, 0x42, 0x00, 0xe4, 0xff,\n  0x18, 0xbd, 0x04, 0x63, 0xd1, 0x7d, 0xf2, 0x58, 0x57, 0xda, 0x81, 0x91,\n  0x94, 0xd8, 0x02, 0xd9, 0x14, 0xf9, 0xe9, 0x3d, 0x84, 0x72, 0x0e, 0xb8,\n  0x0e, 0xba, 0xd0, 0x7d, 0xa8, 0x29, 0x4b, 0xf9, 0x14, 0x65, 0x6f, 0xc4,\n  0x43, 0x0c, 0xcf, 0x42, 0x3c, 0xd2, 0xca, 0xfc, 0x9a, 0xbc, 0x04, 0x2a,\n  0x29, 0xdf, 0x28, 0x60, 0x05, 0x4e, 0x41, 0xed, 0x38, 0x41, 0x8c, 0x78,\n  0xb2, 0x8f, 0x66, 0x6f, 0x0c, 0x5c, 0xf5, 0xd6, 0xcd, 0x3c, 0x7f, 0xe0,\n  0x43, 0x71, 0x3c, 0xd4, 0x35, 0x11, 0xed, 0x4f, 0x41, 0x81, 0xeb, 0xa5,\n  0xbf, 0xe2, 0x21, 0x74, 0x2b, 0x7d, 0x5f, 0x34, 0x1d, 0x82, 0x33, 0xf5,\n  0xf3, 0x2c, 0x24, 0x44, 0x4a, 0x99, 0xbf, 0x20, 0xb9, 0x18, 0x3c, 0x8e,\n  0x18, 0x15, 0x84, 0xeb, 0x69, 0x90, 0x86, 0x13, 0x1c, 0xe5, 0xe6, 0x3a,\n  0x29, 0x29, 0x28, 0x18, 0x4c, 0x6e, 0x79, 0xcb, 0x55, 0x81, 0xde, 0xf8,\n  0xe3, 0x07, 0xc9, 0x84, 0xa2, 0x13, 0x5d, 0x6d, 0x29, 0x29, 0x7f, 0x27,\n  0x7b, 0x0b, 0xf4, 0xbc, 0xc4, 0x3f, 0x65, 0xf4, 0x4c, 0x2c, 0x1d, 0xd6,\n  0xc3, 0x19, 0x1b, 0x04, 0xd5, 0xd3, 0xb4, 0x3d, 0x08, 0x57, 0x65, 0x28,\n  0x9b, 0xd0, 0x0e, 0x4f, 0xcc, 0x78, 0xc0, 0x12, 0x00, 0x66, 0x33, 0x47,\n  0xf2, 0x3d, 0x28, 0x75, 0xf3, 0x4d, 0xad, 0x4d, 0x62, 0x42, 0xb7, 0xbd,\n  0xbf, 0x71, 0x5f, 0x1d, 0xbe, 0x59, 0x6b, 0xf5, 0x7b, 0xba, 0x5b, 0xad,\n  0x5a, 0x80, 0x31, 0x11, 0x09, 0xe8, 0x0c, 0xfe, 0x17, 0xe9, 0xdd, 0xf0,\n  0x46, 0x3d, 0x08, 0x88, 0xcc, 0xb2, 0xd8, 0x00, 0x40, 0xc8, 0xf3, 0x56,\n  0xde, 0x9d, 0x9f, 0xd6, 0x1b, 0xcd, 0xbd, 0xbb, 0xaf, 0x89, 0xbc, 0xfb,\n  0xf3, 0xf0, 0xee, 0xae, 0x36, 0x78, 0x37, 0x2f, 0xd7, 0x83, 0x3e, 0x40,\n  0xf3, 0xa7, 0x4b, 0x98, 0x0e, 0xa2, 0x1a, 0xff, 0x55, 0x52, 0x74, 0x9c,\n  0x45, 0x08, 0x22, 0xe2, 0x59, 0x24, 0x20, 0x81, 0x6d, 0x8f, 0x62, 0x8d,\n  0xbe, 0x11, 0x89, 0x1a, 0x88, 0x44, 0x85, 0x3b, 0x5c, 0x81, 0x3b, 0xb2,\n  0x0f, 0xa0, 0x85, 0x81, 0x3b, 0xac, 0x70, 0xda, 0xc8, 0x19, 0x88, 0x3a,\n  0x48, 0xc4, 0x0b, 0x5e, 0x30, 0x21, 0x81, 0xe1, 0x55, 0x02, 0xbf, 0x9f,\n  0x40, 0xa5, 0x19, 0xba, 0x01, 0x4a, 0x9d, 0x12, 0xda, 0x86, 0x2d, 0xd0,\n  0x05, 0x41, 0x9c, 0xd3, 0x9a, 0xa1, 0xb5, 0x17, 0x98, 0xad, 0xbd, 0x46,\n  0xa8, 0xa3, 0x40, 0x6c, 0xd7, 0xd3, 0xca, 0x6b, 0x0c, 0xa8, 0xf0, 0x4b,\n  0xd4, 0xea, 0x94, 0xf4, 0x26, 0xa6, 0xc0, 0x8b, 0xa6, 0xd3, 0x89, 0xae,\n  0x4e, 0xf0, 0xe9, 0x9b, 0x4c, 0x88, 0x19, 0xec, 0xef, 0x1c, 0xe9, 0x1a,\n  0x69, 0x6d, 0xae, 0x4f, 0x54, 0x94, 0x87, 0x83, 0xde, 0x0e, 0x5f, 0x87,\n  0xe4, 0xd9, 0xa7, 0x09, 0xdb, 0x36, 0xad, 0x46, 0x25, 0x32, 0x46, 0x64,\n  0xb4, 0xaa, 0x72, 0x8a, 0x4b, 0xae, 0xb8, 0x82, 0x13, 0x32, 0xd2, 0x69,\n  0x9a, 0x25, 0x54, 0xc4, 0xcf, 0x45, 0xf8, 0x53, 0x95, 0x2d, 0x61, 0xc0,\n  0x76, 0x7b, 0xbe, 0x5b, 0x06, 0x34, 0xf4, 0x68, 0x1d, 0x55, 0xc9, 0xa5,\n  0x23, 0xb9, 0x3f, 0x16, 0x15, 0x27, 0x5a, 0x68, 0x39, 0x86, 0x4f, 0xa9,\n  0xdc, 0x5a, 0x48, 0xd1, 0x7c, 0x6b, 0xf6, 0xfb, 0x47, 0xe7, 0xae, 0xbf,\n  0xf6, 0x50, 0xcb, 0xa8, 0x5b, 0xe0, 0x4d, 0xda, 0x1e, 0x51, 0x27, 0x14,\n  0x99, 0x55, 0x16, 0x4e, 0x2c, 0x35, 0x87, 0xab, 0xb5, 0xa2, 0x33, 0x93,\n  0xdc, 0xd8, 0xd3, 0x31, 0x35, 0xd0, 0xdb, 0xc3, 0x1e, 0x80, 0x5a, 0x0d,\n  0x82, 0x52, 0xb8, 0x81, 0xa6, 0xbb, 0x43, 0x66, 0xe7, 0x17, 0xfb, 0xfa,\n  0x16, 0xa7, 0xef, 0x7c, 0xe3, 0xed, 0xf7, 0xc6, 0xe3, 0xe6, 0x98, 0xd1,\n  0xd1, 0x3f, 0x16, 0x7a, 0xde, 0xe7, 0xe2, 0x50, 0x9a, 0x53, 0x87, 0xaa,\n  0x02, 0x35, 0x03, 0xb3, 0xf3, 0xc2, 0x9e, 0x85, 0x03, 0x7b, 0xf7, 0xec,\n  0x63, 0x0a, 0xe3, 0xf6, 0x8f, 0x32, 0x6e, 0x95, 0x0a, 0x16, 0x0c, 0xe2,\n  0xb9, 0x95, 0xb8, 0x55, 0x4a, 0x59, 0xac, 0xba, 0x23, 0xe3, 0xb6, 0xd9,\n  0x80, 0xa4, 0xc8, 0xec, 0xd3, 0xb0, 0x47, 0x81, 0xe1, 0xbd, 0xc0, 0xf0,\n  0x46, 0x24, 0xa8, 0x78, 0x01, 0xea, 0x54, 0xae, 0x40, 0xad, 0x59, 0xc6,\n  0x88, 0x49, 0x41, 0x6d, 0x8f, 0x52, 0xee, 0x22, 0xf7, 0x12, 0xa6, 0xf0,\n  0x3b, 0x56, 0x62, 0x76, 0xd5, 0x7b, 0xa6, 0xd3, 0xe5, 0x0a, 0x66, 0x2f,\n  0x85, 0x57, 0x28, 0x96, 0x61, 0x51, 0xb9, 0xcb, 0xd7, 0x2f, 0x94, 0x01,\n  0xad, 0xe4, 0xd8, 0xd7, 0x89, 0xd1, 0x67, 0xd6, 0x14, 0xd7, 0xf8, 0x2a,\n  0x8a, 0x7d, 0xea, 0x8a, 0x30, 0x8a, 0x3f, 0x59, 0xb0, 0x0a, 0xc7, 0x21,\n  0x82, 0xd0, 0x77, 0x5d, 0x11, 0x42, 0x2f, 0xcd, 0xab, 0x08, 0x78, 0x15,\n  0x6b, 0x0a, 0xf0, 0x2a, 0xe2, 0x0a, 0xdc, 0x59, 0xe6, 0x55, 0x62, 0xf9,\n  0xe5, 0x78, 0x95, 0xe6, 0x99, 0x2c, 0xb3, 0x19, 0xc6, 0x57, 0xc0, 0xab,\n  0x10, 0x94, 0x7e, 0x5a, 0x79, 0x8d, 0x01, 0x15, 0x7e, 0xc9, 0xdf, 0x8a,\n  0x57, 0xd5, 0xe4, 0x95, 0x2b, 0x79, 0x15, 0x52, 0x64, 0xed, 0x91, 0xff,\n  0x39, 0xaf, 0xfe, 0x52, 0x4a, 0xb1, 0x6d, 0xae, 0x2f, 0xfe, 0xac, 0xcc,\n  0xab, 0xef, 0xbc, 0x72, 0x5e, 0x95, 0x33, 0x72, 0xc3, 0x34, 0x3d, 0xf7,\n  0xff, 0x02, 0xaf, 0xd2, 0x4a, 0x16, 0xeb, 0xf2, 0x2a, 0x5e, 0x9f, 0x57,\n  0x31, 0xb1, 0x42, 0x81, 0x57, 0x95, 0x14, 0xa2, 0x1c, 0x9f, 0xad, 0x42,\n  0x6d, 0x21, 0x5e, 0x95, 0xca, 0x5e, 0xe4, 0x5e, 0xc2, 0x14, 0x7e, 0xc7,\n  0xdf, 0x82, 0x57, 0xa1, 0x68, 0x06, 0xf0, 0xea, 0xfa, 0x05, 0x33, 0xfe,\n  0x3b, 0xbc, 0x8a, 0x2a, 0xd6, 0x16, 0xd9, 0xf8, 0xca, 0x95, 0x73, 0x6b,\n  0xc1, 0x6a, 0x1c, 0x57, 0xce, 0xad, 0xcb, 0x38, 0xbd, 0x9d, 0xe2, 0x34,\n  0xca, 0x0c, 0x31, 0x53, 0x08, 0xc9, 0x38, 0x55, 0xaa, 0x24, 0x31, 0x48,\n  0xe0, 0xfa, 0x6b, 0xb1, 0xce, 0xd8, 0x89, 0xd4, 0x3a, 0x8a, 0x53, 0xa5,\n  0x5c, 0xd2, 0xaa, 0x3b, 0x32, 0x4e, 0xd3, 0x26, 0x72, 0x4b, 0x60, 0x38,\n  0x21, 0x4f, 0xfe, 0x8a, 0x66, 0xc4, 0x6b, 0x44, 0xfe, 0x00, 0xf9, 0xc8,\n  0xd6, 0x61, 0x15, 0x12, 0x84, 0xfa, 0x61, 0xc6, 0x68, 0xd4, 0xec, 0x82,\n  0x63, 0xae, 0xb6, 0x61, 0xab, 0x01, 0xeb, 0x74, 0xea, 0x39, 0xbd, 0x05,\n  0xab, 0xd5, 0x49, 0x38, 0x78, 0x1a, 0x52, 0xa4, 0x70, 0xee, 0x55, 0xcc,\n  0xa5, 0xde, 0xa4, 0xd5, 0xa6, 0xa4, 0xd7, 0x31, 0x05, 0xde, 0x36, 0x9d,\n  0xae, 0x1e, 0xce, 0xc4, 0x63, 0xc5, 0x04, 0xbf, 0x9b, 0x26, 0x32, 0x53,\n  0xc3, 0x53, 0xbd, 0xdd, 0xed, 0x6d, 0x0d, 0xc9, 0xea, 0xca, 0xd8, 0x50,\n  0x7c, 0x28, 0x1c, 0x0a, 0x94, 0x7a, 0x4b, 0xdc, 0xd1, 0xe2, 0xa8, 0x22,\n  0x8f, 0x6d, 0x85, 0xe4, 0x71, 0xae, 0xf0, 0x8b, 0x48, 0x70, 0x98, 0xc8,\n  0xa9, 0x2d, 0xaf, 0x17, 0xdb, 0x9f, 0x5e, 0x53, 0xda, 0xe9, 0x4d, 0xbd,\n  0x03, 0xaa, 0x94, 0xaa, 0xa6, 0x2c, 0xd8, 0xa0, 0x6e, 0x52, 0x8d, 0x1f,\n  0xb8, 0x32, 0xb4, 0xff, 0x73, 0xc1, 0x72, 0x50, 0xf7, 0x75, 0xa4, 0xfc,\n  0x26, 0xab, 0x37, 0xd5, 0xb1, 0xf8, 0xfe, 0xd7, 0xc7, 0xcf, 0x85, 0x70,\n  0xbf, 0xbc, 0xf7, 0xae, 0xc6, 0xfd, 0xf2, 0xde, 0xfb, 0xff, 0x08, 0xee,\n  0xf3, 0xab, 0x68, 0xfc, 0x0f, 0x70, 0xff, 0x85, 0x35, 0xbb, 0x72, 0x6a,\n  0x05, 0xee, 0x17, 0xfe, 0x3b, 0xb8, 0x57, 0x58, 0xfe, 0x6f, 0x8a, 0x7b,\n  0xa5, 0xf2, 0xd2, 0xba, 0x7c, 0x8f, 0xd7, 0xc7, 0x3d, 0xd9, 0x61, 0x29,\n  0xee, 0x15, 0x39, 0x9c, 0xc3, 0x18, 0xc6, 0x57, 0x88, 0x7b, 0x49, 0xa2,\n  0xe7, 0x5e, 0xc5, 0x5c, 0xea, 0x4d, 0x7f, 0x2b, 0xdc, 0x83, 0x6c, 0xb7,\n  0x15, 0x92, 0xed, 0x7f, 0x23, 0xbe, 0x47, 0x91, 0xb5, 0xe5, 0xa2, 0xce,\n  0xfd, 0xb7, 0x38, 0xbf, 0x60, 0x89, 0xa9, 0xd7, 0x89, 0xfd, 0xcb, 0xf0,\n  0xbd, 0xbc, 0x8f, 0xaf, 0xc3, 0xf7, 0xff, 0xef, 0xe0, 0xfe, 0x6f, 0xc4,\n  0xf7, 0xa8, 0x66, 0xed, 0x0e, 0xdf, 0xf0, 0x3f, 0xc7, 0xfd, 0x7f, 0x93,\n  0xf3, 0xb9, 0xa5, 0xff, 0xa0, 0x75, 0xe1, 0x14, 0x1d, 0xae, 0x8a, 0xf9,\n  0x9e, 0x7c, 0x96, 0x9e, 0x6f, 0x49, 0x87, 0x91, 0xa8, 0x8e, 0x20, 0x95,\n  0x08, 0x88, 0x77, 0xe4, 0x1b, 0xd2, 0xcb, 0x37, 0x64, 0xbc, 0xd7, 0x29,\n  0x06, 0xb0, 0x96, 0xd3, 0x28, 0x76, 0xb4, 0x0e, 0xd4, 0x6a, 0xb5, 0x62,\n  0x02, 0xeb, 0x11, 0xd5, 0xbe, 0x44, 0x91, 0x6a, 0x5f, 0x49, 0x68, 0x3b,\n  0xd8, 0xa4, 0x5d, 0x6d, 0x3e, 0x6b, 0xd0, 0x95, 0x3d, 0x3b, 0x9d, 0x8e,\n  0x7a, 0x65, 0x1d, 0xdc, 0x5b, 0xe5, 0xad, 0x82, 0x66, 0xa6, 0x85, 0xac,\n  0x64, 0xc3, 0x65, 0xad, 0x64, 0xe7, 0x8a, 0x58, 0x85, 0x48, 0xd2, 0xdc,\n  0x5a, 0xc8, 0x0c, 0xfe, 0x74, 0x38, 0xe6, 0xa8, 0xd6, 0x1b, 0x1a, 0xdc,\n  0x15, 0x3d, 0xd1, 0x4b, 0x18, 0xbb, 0xe7, 0xb2, 0xe7, 0x6b, 0x6a, 0xe8,\n  0xe1, 0x71, 0xc9, 0x40, 0x07, 0xba, 0x81, 0xc6, 0x2c, 0xac, 0x81, 0xf3,\n  0x37, 0x64, 0x38, 0xe7, 0x5b, 0xb5, 0x2b, 0xe0, 0x9c, 0x6f, 0xd4, 0xae,\n  0x81, 0x73, 0xad, 0xa6, 0x80, 0x4d, 0xab, 0x45, 0x82, 0x5a, 0xb1, 0x47,\n  0x75, 0x6b, 0xc1, 0xdc, 0xa8, 0x6c, 0xa4, 0x9a, 0xb5, 0xa6, 0xec, 0x25,\n  0x1f, 0x9d, 0x4e, 0xfb, 0x24, 0x28, 0xaf, 0x85, 0x31, 0xec, 0x92, 0xfa,\n  0xcb, 0x5a, 0xac, 0xe2, 0x6a, 0xe8, 0x6a, 0x0a, 0x99, 0xa4, 0x47, 0xf2,\n  0xa0, 0xbb, 0xbe, 0xe1, 0xd9, 0xbe, 0x06, 0xb8, 0x97, 0xa2, 0xe1, 0x65,\n  0x0b, 0x73, 0x15, 0x0d, 0x2f, 0x1b, 0x98, 0x85, 0x68, 0x58, 0x32, 0x0c,\n  0x25, 0x1a, 0xa6, 0x22, 0x67, 0x99, 0x0e, 0xc1, 0x80, 0x58, 0x8f, 0x86,\n  0x57, 0x98, 0x95, 0x1a, 0x74, 0x65, 0xcf, 0x5e, 0x86, 0x86, 0x15, 0xeb,\n  0xd1, 0x70, 0x59, 0xeb, 0x71, 0x0d, 0x0d, 0xd7, 0x15, 0x32, 0x0f, 0x57,\n  0xd2, 0xf0, 0xba, 0x46, 0xe0, 0xeb, 0xa5, 0xe1, 0x9c, 0xb5, 0x57, 0x88,\n  0x86, 0xf1, 0xba, 0x34, 0xbc, 0xc6, 0xd6, 0x53, 0x08, 0x11, 0x40, 0x55,\n  0x98, 0x86, 0xa5, 0x4d, 0x41, 0xb3, 0xd6, 0xc4, 0xbb, 0xe4, 0xa3, 0x97,\n  0xa0, 0x61, 0x90, 0xf8, 0x94, 0x86, 0x2f, 0x69, 0xc9, 0xad, 0xa1, 0xe1,\n  0x53, 0x05, 0x2d, 0xb5, 0x95, 0x44, 0xbc, 0x9e, 0x3d, 0xb6, 0x86, 0x88,\n  0x39, 0xa9, 0xfe, 0x67, 0x6e, 0x0f, 0x6e, 0x64, 0x7e, 0x2c, 0xc3, 0x36,\n  0xdf, 0xea, 0xaa, 0x46, 0x6a, 0x6d, 0x0d, 0xd2, 0xa8, 0x29, 0x6c, 0xf3,\n  0x8d, 0xae, 0xe5, 0x1b, 0x32, 0x6c, 0x53, 0xba, 0x02, 0x7a, 0xb7, 0x1e,\n  0xf1, 0xda, 0x95, 0xda, 0xb2, 0x01, 0xd1, 0x6d, 0x53, 0xad, 0xd6, 0xcc,\n  0x91, 0x6d, 0x33, 0xa9, 0x21, 0x10, 0x6e, 0x57, 0xa4, 0x84, 0x6e, 0xad,\n  0xba, 0x7d, 0x05, 0x2f, 0x98, 0x4e, 0x07, 0x63, 0x74, 0x9f, 0x8d, 0x35,\n  0xc6, 0x1a, 0x21, 0xab, 0x78, 0xad, 0x56, 0x6d, 0x7c, 0x1d, 0x16, 0xd5,\n  0x1a, 0xa8, 0xf3, 0x97, 0x31, 0x99, 0x7c, 0xf9, 0xf0, 0xbf, 0x8c, 0x61,\n  0x94, 0x2a, 0x44, 0xe3, 0xbf, 0x5b, 0x07, 0x0f, 0xf9, 0x16, 0xd0, 0x0a,\n  0x3c, 0xe4, 0x1b, 0x40, 0xff, 0xfb, 0xf1, 0xb0, 0x8e, 0x96, 0xb3, 0x06,\n  0x0f, 0xfa, 0xcb, 0x98, 0x2f, 0xde, 0xf5, 0xf1, 0xb0, 0x46, 0x55, 0x29,\n  0x88, 0x87, 0x4b, 0xf0, 0x43, 0xce, 0x1a, 0x29, 0xc4, 0x0f, 0x78, 0x5d,\n  0x3c, 0xac, 0xd1, 0x47, 0x15, 0x30, 0x2e, 0x6b, 0x91, 0x85, 0xf1, 0x20,\n  0x49, 0x1c, 0xdd, 0x5a, 0x35, 0xf4, 0x0a, 0x5e, 0x70, 0x19, 0x3c, 0x80,\n  0xec, 0x31, 0x16, 0x92, 0x3d, 0x57, 0xca, 0x0f, 0xc7, 0x2f, 0x67, 0x49,\n  0xac, 0x64, 0x88, 0x4b, 0xdb, 0x0b, 0xa9, 0x02, 0x7b, 0xeb, 0x4b, 0xeb,\n  0xf3, 0x43, 0xce, 0x32, 0x28, 0xc4, 0x0f, 0xff, 0x3f, 0xc1, 0xc3, 0x95,\n  0xf2, 0xc3, 0x0d, 0x97, 0xd3, 0xea, 0x2f, 0x81, 0x87, 0x2b, 0x60, 0x08,\n  0x4e, 0xae, 0xf5, 0xaa, 0xec, 0xbd, 0xf5, 0xcc, 0xd7, 0xe4, 0x9a, 0xc1,\n  0xf9, 0x7a, 0x3a, 0x4b, 0xe0, 0x6f, 0xc8, 0xd7, 0xcf, 0x59, 0x05, 0xee,\n  0x09, 0x45, 0xb3, 0xd6, 0x71, 0x5a, 0x45, 0x2f, 0xd7, 0xaf, 0x38, 0x9a,\n  0xd2, 0x20, 0x95, 0x2a, 0x25, 0x35, 0x65, 0x36, 0x20, 0xd9, 0xa1, 0xda,\n  0xac, 0x5b, 0xad, 0x98, 0x6b, 0xd1, 0x15, 0x3e, 0x3c, 0x9d, 0x8e, 0x2b,\n  0xde, 0xf1, 0xea, 0xaa, 0x78, 0x34, 0x14, 0xf4, 0xd6, 0xfb, 0xea, 0x0b,\n  0xe9, 0xe6, 0xc6, 0x2b, 0x39, 0xc1, 0xca, 0xeb, 0x8f, 0x5d, 0x4f, 0xd1,\n  0x40, 0x86, 0xff, 0xbe, 0x90, 0x86, 0x7e, 0xff, 0xf4, 0xee, 0xd8, 0x54,\n  0xef, 0xf0, 0x58, 0xc6, 0x64, 0x9c, 0x32, 0x99, 0x6e, 0xb9, 0xe4, 0x89,\n  0x54, 0xd7, 0xc9, 0x3e, 0x14, 0xce, 0xfe, 0x64, 0x72, 0xf7, 0x89, 0x6b,\n  0x7b, 0x8f, 0xb4, 0xb6, 0x1c, 0x1d, 0x7c, 0xdb, 0x03, 0x05, 0xe0, 0xfc,\n  0xf9, 0x55, 0xf5, 0xd3, 0x41, 0x95, 0xa1, 0x70, 0xce, 0xd7, 0xcf, 0x73,\n  0x70, 0xae, 0xd3, 0x16, 0xd0, 0xcb, 0x75, 0x79, 0xe7, 0x44, 0x79, 0x90,\n  0xd2, 0x2b, 0x60, 0x6e, 0x52, 0x44, 0xbd, 0x76, 0xad, 0x62, 0x7e, 0xe9,\n  0x67, 0xa7, 0xd3, 0x7e, 0x09, 0xca, 0x85, 0x60, 0x0c, 0x32, 0xde, 0x70,\n  0x25, 0xa7, 0x49, 0x85, 0xa0, 0xfb, 0x99, 0x42, 0x1a, 0xfa, 0x43, 0x2b,\n  0xa1, 0x7b, 0xa9, 0xd3, 0xa1, 0x42, 0xc0, 0xbd, 0x0c, 0x1d, 0x2f, 0xeb,\n  0xea, 0x32, 0x1d, 0x2f, 0xeb, 0xe8, 0xf9, 0x74, 0x2c, 0x69, 0xd7, 0x12,\n  0x1d, 0x53, 0xfe, 0xd7, 0xaf, 0x38, 0xb6, 0x59, 0x97, 0x8e, 0x57, 0x28,\n  0xe7, 0x5a, 0x74, 0x85, 0x0f, 0x5f, 0x96, 0x8e, 0x15, 0xfd, 0xdc, 0x78,\n  0x25, 0xa7, 0x3b, 0x85, 0x20, 0xfd, 0xb3, 0x42, 0x5a, 0xfa, 0x1a, 0x3a,\n  0xbe, 0xc4, 0x69, 0xcd, 0xeb, 0xa6, 0xe3, 0x9c, 0xae, 0x9e, 0x4f, 0xc7,\n  0x78, 0x0d, 0x1d, 0xaf, 0xd1, 0xcd, 0x75, 0x79, 0x67, 0x28, 0xeb, 0xd0,\n  0xb1, 0x24, 0xa2, 0xb5, 0x6b, 0x95, 0xf3, 0x4b, 0x3f, 0x7b, 0x49, 0x3a,\n  0x06, 0xd9, 0x6c, 0xb8, 0x92, 0x93, 0x96, 0x42, 0xd0, 0x45, 0xf1, 0x82,\n  0x6a, 0xfa, 0x1a, 0x4a, 0x5e, 0xff, 0xe4, 0xa4, 0x20, 0x25, 0x2b, 0xf0,\n  0x55, 0xf6, 0xc5, 0x76, 0xe6, 0x5b, 0xab, 0x7a, 0x49, 0xc0, 0xf6, 0x47,\n  0xe1, 0x9b, 0xaf, 0xa7, 0xe7, 0xe0, 0xdb, 0xa8, 0x2f, 0xa0, 0x17, 0x1a,\n  0xd6, 0x78, 0xb3, 0x75, 0x48, 0xa3, 0x49, 0x81, 0x6f, 0x4b, 0x3d, 0x67,\n  0x44, 0xb2, 0x5f, 0x6c, 0x83, 0x22, 0x2d, 0xf4, 0x6b, 0x15, 0xc3, 0x2b,\n  0x79, 0xc3, 0x74, 0x3a, 0x2c, 0x79, 0xc2, 0x9a, 0x1a, 0x13, 0xb5, 0x55,\n  0x95, 0xb1, 0xf6, 0x78, 0xfb, 0x5a, 0xdd, 0xd0, 0xf4, 0xfa, 0x4e, 0x3d,\n  0x0a, 0x41, 0xfe, 0x1f, 0x2e, 0xa3, 0xa9, 0xf7, 0xad, 0x42, 0xc1, 0x65,\n  0x4f, 0x31, 0x2e, 0x45, 0xe7, 0x6b, 0xf1, 0x90, 0xaf, 0xaf, 0xaf, 0x92,\n  0xd7, 0xff, 0xdb, 0xf1, 0xb0, 0xbe, 0x27, 0xb2, 0x10, 0x1e, 0x9e, 0xb9,\n  0x8c, 0xa6, 0xde, 0x7b, 0x49, 0x3c, 0x14, 0xf0, 0x2b, 0xbe, 0x3e, 0x3c,\n  0xe4, 0xeb, 0xeb, 0xf9, 0xfc, 0x80, 0xd7, 0xe0, 0x61, 0x8d, 0x5e, 0x68,\n  0x58, 0xe3, 0xe5, 0x5d, 0x07, 0x0f, 0x92, 0xd4, 0xd1, 0xaf, 0x55, 0x0c,\n  0xaf, 0xe4, 0x0d, 0x97, 0xc5, 0x03, 0xc8, 0x1f, 0xd3, 0xeb, 0x3b, 0x0d,\n  0x28, 0x28, 0x89, 0x82, 0x97, 0x53, 0xd5, 0xd7, 0x70, 0xc4, 0xe5, 0xbc,\n  0xfb, 0x85, 0x37, 0xd9, 0x4b, 0xf2, 0x44, 0x4e, 0x67, 0x5f, 0x25, 0xfb,\n  0xff, 0xb7, 0xe3, 0xe2, 0xf5, 0xf1, 0x04, 0xaa, 0xbc, 0x9c, 0xba, 0x7e,\n  0x69, 0x5c, 0x5c, 0x21, 0x57, 0x30, 0x0c, 0xbf, 0xf4, 0x7b, 0x6a, 0x3f,\n  0x3d, 0xc1, 0xa8, 0x19, 0x3d, 0xc1, 0x46, 0x98, 0x69, 0x60, 0x3e, 0x9a,\n  0x36, 0x42, 0xc9, 0x36, 0xa6, 0x12, 0xa9, 0x34, 0x55, 0x48, 0xad, 0x82,\n  0x4c, 0xa9, 0x08, 0xd5, 0x6d, 0x20, 0x18, 0x56, 0x4b, 0x6b, 0x46, 0xd2,\n  0x7c, 0x70, 0x1e, 0xb3, 0xfb, 0x21, 0x59, 0x9c, 0xe3, 0xf8, 0x5d, 0x10,\n  0xc7, 0x5e, 0x3f, 0x6c, 0x94, 0x20, 0xa6, 0x52, 0x41, 0x01, 0x06, 0x09,\n  0xe4, 0xb5, 0x85, 0x9e, 0x22, 0xa3, 0xe9, 0x83, 0x1a, 0x9e, 0x5b, 0x58,\n  0xf3, 0xcc, 0x74, 0xba, 0x22, 0x12, 0x29, 0x76, 0x1b, 0x0d, 0x1a, 0x0d,\n  0xc3, 0x44, 0x1a, 0x22, 0x0d, 0x75, 0x35, 0xe5, 0x71, 0xbf, 0xcf, 0x1d,\n  0x2e, 0x0e, 0xdb, 0xad, 0x06, 0x97, 0xd1, 0xa5, 0xd1, 0x6b, 0xf4, 0x3a,\n  0x2d, 0x2d, 0x1a, 0x6f, 0x52, 0x39, 0xc1, 0x26, 0x52, 0xe8, 0x1c, 0xfc,\n  0x60, 0xeb, 0xf4, 0x0e, 0x58, 0x63, 0x11, 0xdd, 0xe8, 0xae, 0x77, 0x6c,\n  0x31, 0x7a, 0xac, 0xcf, 0xa0, 0xd8, 0x1f, 0xe5, 0x1e, 0x57, 0xef, 0x97,\n  0x7b, 0x5c, 0x0d, 0xe4, 0xfb, 0x20, 0x3b, 0x6c, 0x49, 0x8f, 0xc6, 0x57,\n  0xe1, 0xd2, 0xee, 0xed, 0xeb, 0x3b, 0xbb, 0xba, 0xbd, 0x40, 0xe7, 0x2a,\n  0x4b, 0x68, 0x1d, 0x78, 0x0a, 0x40, 0x63, 0x6b, 0xe0, 0xa9, 0x45, 0x52,\n  0xb0, 0x21, 0xcb, 0x9c, 0x23, 0x70, 0x81, 0x3c, 0x34, 0x0c, 0x90, 0xe1,\n  0xb9, 0x5d, 0x12, 0x54, 0x0b, 0xc3, 0xb3, 0xd0, 0x53, 0x74, 0x3c, 0x79,\n  0x54, 0xc3, 0xf1, 0x7f, 0x03, 0x78, 0x02, 0x99, 0x06, 0x81, 0x60, 0xa9,\n  0xd7, 0x76, 0xbd, 0x3c, 0xea, 0xd5, 0xf0, 0xfc, 0x99, 0xa3, 0xde, 0x5d,\n  0x6b, 0xf5, 0x18, 0xdf, 0x98, 0xfd, 0x7e, 0x4a, 0x86, 0xe7, 0x37, 0xe8,\n  0xcf, 0xe2, 0xe2, 0x60, 0x3e, 0x3c, 0x9f, 0xd0, 0x78, 0x92, 0x36, 0xad,\n  0xab, 0xc2, 0x77, 0x57, 0x5f, 0xdf, 0xbe, 0x15, 0x0d, 0x29, 0xc8, 0xcf,\n  0x47, 0xd7, 0xc0, 0xf3, 0x97, 0x39, 0x78, 0x4a, 0xf9, 0xf4, 0x69, 0xe6,\n  0x0b, 0x69, 0x8b, 0x8a, 0xd8, 0x8f, 0x90, 0x8f, 0x94, 0x42, 0x1a, 0x5d,\n  0x23, 0xd2, 0xd2, 0x02, 0x25, 0x00, 0xd2, 0x26, 0x3d, 0x0d, 0x9b, 0x37,\n  0x10, 0x1a, 0x63, 0xd8, 0x73, 0x20, 0x6a, 0xce, 0x91, 0x2f, 0x2c, 0x70,\n  0xf8, 0x80, 0xd4, 0x3c, 0xcd, 0xa4, 0x32, 0xb2, 0xc0, 0xda, 0x66, 0xa4,\n  0xd3, 0x11, 0x20, 0x69, 0x34, 0xda, 0x5d, 0x84, 0xbf, 0x93, 0x5a, 0x28,\n  0x93, 0xb6, 0xfe, 0xb3, 0xf4, 0x29, 0xf2, 0x02, 0x9d, 0x20, 0x1e, 0x58,\n  0xf3, 0xe4, 0x74, 0xba, 0xa6, 0xa6, 0x06, 0xea, 0x7d, 0x03, 0x78, 0x6b,\n  0xd2, 0x35, 0xe9, 0xd6, 0xe6, 0x64, 0x22, 0xbf, 0xee, 0xb7, 0xc6, 0xa9,\n  0x71, 0xda, 0xad, 0x66, 0x93, 0x41, 0x47, 0x41, 0x6c, 0x01, 0x10, 0xe7,\n  0x14, 0x6f, 0x5e, 0x3a, 0x85, 0x93, 0x25, 0x82, 0x78, 0xa5, 0xc0, 0x3e,\n  0x42, 0x08, 0xb7, 0x96, 0x10, 0x30, 0xe2, 0x54, 0xe3, 0xdd, 0xcb, 0x82,\n  0xe1, 0xb3, 0xab, 0x00, 0x1f, 0x58, 0x01, 0x78, 0x20, 0x62, 0x20, 0xe6,\n  0xb9, 0x54, 0x6f, 0x6f, 0xca, 0x6f, 0x2f, 0xf2, 0xde, 0x77, 0x39, 0xf0,\n  0x13, 0xf8, 0xff, 0xaa, 0x10, 0xfc, 0x95, 0xfe, 0x20, 0x6b, 0xe0, 0x9f,\n  0xeb, 0x13, 0xc2, 0x9e, 0xd3, 0x43, 0xc2, 0x21, 0x01, 0xa1, 0x01, 0x61,\n  0x51, 0x81, 0xa1, 0x20, 0xee, 0x02, 0x3c, 0x14, 0x86, 0xff, 0xfa, 0xcf,\n  0x92, 0x67, 0xe8, 0xe3, 0x3a, 0x51, 0xb8, 0x04, 0xfc, 0xb5, 0xeb, 0xc0,\n  0xdf, 0x6e, 0xb3, 0x98, 0x0c, 0x7a, 0x8d, 0x53, 0xeb, 0x5c, 0x86, 0xff,\n  0x7a, 0x6e, 0x93, 0x2b, 0x15, 0x1e, 0xa3, 0x84, 0xd0, 0xb7, 0x10, 0x82,\n  0x47, 0x2b, 0x84, 0xf2, 0x3b, 0x2e, 0x29, 0x47, 0x80, 0xe6, 0x81, 0xf6,\n  0x8f, 0x49, 0xc0, 0x4f, 0xf5, 0x9e, 0xba, 0x9c, 0x34, 0x81, 0xb8, 0x07,\n  0x69, 0xaf, 0x5c, 0x96, 0x27, 0xad, 0xcc, 0xe3, 0x9f, 0xa0, 0xe2, 0x19,\n  0xc9, 0x30, 0xaf, 0xa7, 0x02, 0x56, 0x27, 0x0b, 0x58, 0xbd, 0x24, 0x60,\n  0x8d, 0x82, 0x21, 0x4f, 0x2c, 0x6b, 0xa5, 0xd3, 0x06, 0x8d, 0x46, 0xb5,\n  0xcb, 0x84, 0xe4, 0x93, 0x8a, 0xba, 0x42, 0x8f, 0x91, 0xe1, 0xf4, 0x49,\n  0x35, 0x91, 0xcb, 0x6b, 0x1f, 0x9a, 0x4e, 0x57, 0x45, 0x73, 0x82, 0x24,\n  0xd5, 0x50, 0x5b, 0x5d, 0x51, 0x1e, 0x69, 0x8d, 0xb6, 0xae, 0x23, 0x4a,\n  0xcc, 0x04, 0xce, 0xe8, 0x8a, 0x44, 0xf3, 0x7a, 0x9b, 0x60, 0xd5, 0xfa,\n  0x12, 0xfa, 0xf8, 0x2a, 0xfb, 0xf3, 0x92, 0x42, 0x7a, 0xf1, 0xed, 0x05,\n  0x37, 0xbf, 0xc2, 0xb0, 0xa5, 0xa2, 0x3a, 0x07, 0x5b, 0xdd, 0xb2, 0xb0,\n  0xd5, 0xaf, 0x14, 0xd1, 0x12, 0x84, 0xd7, 0x81, 0x6d, 0xa1, 0xc7, 0xe8,\n  0x03, 0xe4, 0x59, 0x35, 0x91, 0xd1, 0x7f, 0x13, 0xd8, 0x5e, 0x91, 0x98,\n  0x5e, 0x0f, 0xb6, 0x0f, 0xad, 0x2f, 0xad, 0x87, 0x56, 0xc1, 0xf6, 0x92,\n  0x02, 0x7b, 0xb1, 0xe9, 0xb2, 0xb0, 0x95, 0xe4, 0x46, 0x2f, 0xf3, 0xd9,\n  0xb4, 0x46, 0x91, 0xdb, 0x58, 0x86, 0x6f, 0xb3, 0x81, 0xca, 0x5c, 0xe3,\n  0xba, 0xf2, 0xda, 0xac, 0x32, 0x51, 0x79, 0xad, 0x97, 0xfc, 0xa5, 0x3a,\n  0x9d, 0x66, 0x97, 0x05, 0xc9, 0x1e, 0xd7, 0xc6, 0xf5, 0x1f, 0xa6, 0x8f,\n  0x91, 0x37, 0x68, 0x89, 0xc0, 0x5e, 0xfb, 0xe8, 0x74, 0xba, 0xae, 0x36,\n  0x27, 0xb1, 0x3b, 0xd2, 0x2d, 0x4d, 0x0d, 0xc9, 0x9a, 0xde, 0xda, 0xde,\n  0x4b, 0xc8, 0x6c, 0xab, 0x4a, 0xea, 0x65, 0xf2, 0x7a, 0x64, 0xf6, 0x7a,\n  0x90, 0x2f, 0xbd, 0x32, 0xd1, 0x3d, 0xb8, 0x1a, 0x0b, 0x97, 0x97, 0xde,\n  0xaf, 0x0f, 0x17, 0xf9, 0x3d, 0x9e, 0x22, 0x52, 0x8d, 0xd1, 0x9c, 0xfc,\n  0x35, 0xc8, 0xf2, 0xd7, 0x28, 0xc9, 0x5f, 0x09, 0x0b, 0x8a, 0xec, 0x2e,\n  0x88, 0x8b, 0xf5, 0x1f, 0x26, 0x0f, 0xd1, 0xe7, 0xb5, 0x44, 0x78, 0x5f,\n  0x02, 0x17, 0xda, 0x75, 0x71, 0xb1, 0x4a, 0x7e, 0x53, 0x5c, 0xbc, 0x4e,\n  0xf9, 0xbd, 0x1e, 0x2e, 0xd0, 0x15, 0x89, 0xf1, 0x35, 0xc2, 0xe6, 0xf2,\n  0x92, 0x7c, 0x1d, 0x91, 0x43, 0x44, 0xee, 0xdc, 0x52, 0x27, 0xbe, 0x06,\n  0xbf, 0x00, 0xd9, 0xce, 0xe0, 0x43, 0x64, 0x31, 0xe4, 0x0b, 0xb1, 0xb4,\n  0x06, 0xa9, 0x9c, 0xf5, 0xcc, 0x20, 0xda, 0x52, 0x63, 0x2f, 0xb1, 0x44,\n  0xa4, 0xd2, 0x0e, 0x11, 0x48, 0x81, 0x8d, 0x42, 0x5e, 0x7e, 0x49, 0xee,\n  0x1e, 0xbd, 0x8a, 0x31, 0xad, 0xcb, 0x50, 0x2e, 0xdf, 0xa7, 0x09, 0xc0,\n  0x5e, 0x0f, 0x14, 0x76, 0xa4, 0x2d, 0x0b, 0x82, 0x28, 0x28, 0x8a, 0x34,\n  0xe7, 0x51, 0x29, 0xf4, 0x9f, 0x34, 0xd7, 0x4b, 0x65, 0xc6, 0xa5, 0x92,\n  0xd8, 0x50, 0x88, 0xce, 0x61, 0x37, 0x13, 0x40, 0xfc, 0xbd, 0x2b, 0x6c,\n  0x30, 0x45, 0x1c, 0xee, 0x6a, 0x5f, 0x66, 0xa6, 0x7f, 0xdc, 0x3f, 0xd3,\n  0x67, 0xe4, 0xad, 0x1b, 0x86, 0xc2, 0xc7, 0xcf, 0x1f, 0xfa, 0xac, 0x28,\n  0x64, 0x38, 0xc1, 0x5a, 0x5b, 0x8e, 0x7e, 0xb4, 0x75, 0x2c, 0xb9, 0x73,\n  0x43, 0x76, 0x04, 0x5f, 0xdc, 0xe6, 0xab, 0x72, 0x5d, 0x75, 0x7d, 0xb6,\n  0x74, 0xcf, 0x4e, 0xa5, 0xee, 0x40, 0x27, 0x7e, 0x0b, 0xd4, 0x1d, 0x40,\n  0x5a, 0xba, 0xc6, 0xad, 0x84, 0xde, 0x8e, 0x92, 0x35, 0x86, 0x99, 0x1b,\n  0x9f, 0x72, 0x21, 0x8e, 0x55, 0x12, 0xba, 0xcb, 0x18, 0x62, 0x76, 0x71,\n  0x08, 0xdc, 0xf5, 0x2c, 0xbf, 0x4b, 0x20, 0x72, 0x34, 0x02, 0xf9, 0xf2,\n  0xb9, 0x5f, 0x21, 0x99, 0x07, 0x0a, 0x7a, 0x54, 0x40, 0x61, 0xce, 0x58,\n  0xde, 0x60, 0x5a, 0x02, 0xb2, 0x9c, 0x8e, 0x9d, 0x65, 0x56, 0x0f, 0xa5,\n  0x75, 0xd5, 0x09, 0xa9, 0x90, 0x75, 0x9b, 0x8d, 0x1a, 0x15, 0xcf, 0x31,\n  0x61, 0x14, 0x56, 0x49, 0x0b, 0x4f, 0x26, 0x13, 0x72, 0x3f, 0x83, 0xa4,\n  0xbc, 0x72, 0x7b, 0xde, 0xca, 0x21, 0xef, 0x13, 0xcd, 0x9d, 0x39, 0x3f,\n  0x33, 0x3d, 0xbd, 0x6d, 0x62, 0xd5, 0xc2, 0x9b, 0x4f, 0x69, 0xee, 0x3b,\n  0xa5, 0xd1, 0x6f, 0xd9, 0x39, 0x3f, 0xfe, 0x53, 0xba, 0xf0, 0x41, 0x34,\n  0x27, 0xad, 0xfb, 0x37, 0x83, 0xa7, 0x7a, 0xa4, 0x1c, 0x37, 0x66, 0xe9,\n  0x2f, 0xec, 0xdf, 0xe1, 0x8b, 0x04, 0x97, 0xa7, 0x87, 0x9e, 0xb0, 0x83,\n  0x05, 0xeb, 0x76, 0xda, 0xcc, 0x1c, 0x8f, 0x04, 0x40, 0x28, 0x24, 0x76,\n  0xe7, 0x5d, 0xe0, 0xa4, 0xcc, 0x6e, 0x3b, 0x45, 0x31, 0x94, 0x54, 0x81,\n  0xb4, 0xed, 0xc8, 0xb0, 0x9c, 0xe4, 0x2d, 0xb2, 0x0c, 0x31, 0x85, 0x29,\n  0x8a, 0x97, 0xef, 0x01, 0xf2, 0xa3, 0xc3, 0xb9, 0x6a, 0xf2, 0xca, 0x5a,\n  0x3d, 0x90, 0x1a, 0x6c, 0xb7, 0x5a, 0x68, 0x0d, 0x79, 0x82, 0x64, 0x58,\n  0xab, 0x73, 0x19, 0xc9, 0xa9, 0x76, 0x9c, 0xf2, 0x5b, 0xad, 0x09, 0xd6,\n  0x1a, 0x64, 0xd9, 0xa0, 0x95, 0x85, 0x94, 0x67, 0x03, 0xee, 0x34, 0x07,\n  0x0d, 0xba, 0x62, 0x93, 0x37, 0x60, 0x53, 0xa9, 0x8a, 0x8a, 0x0d, 0x88,\n  0xfd, 0xe8, 0x13, 0xb3, 0x3f, 0xfe, 0xfd, 0xbe, 0xa7, 0x3f, 0x37, 0xfb,\n  0xd2, 0xe3, 0x6f, 0x54, 0xdb, 0x1d, 0x5a, 0x7d, 0xb4, 0x5d, 0x2b, 0xf2,\n  0x43, 0x82, 0x58, 0x33, 0x10, 0x8d, 0xdd, 0xff, 0x85, 0xa3, 0xd9, 0x5f,\n  0xa1, 0xa2, 0xec, 0x87, 0xb3, 0x77, 0xa0, 0x86, 0xec, 0x45, 0x74, 0x15,\n  0x12, 0x06, 0xde, 0xfb, 0x60, 0xb2, 0x6b, 0x7b, 0x0d, 0xac, 0x5b, 0x5c,\n  0x7a, 0x95, 0x75, 0xe2, 0x22, 0xa6, 0x88, 0x39, 0x23, 0xa5, 0xaa, 0x1b,\n  0xac, 0x26, 0xbd, 0x86, 0x25, 0xcb, 0xc4, 0xf2, 0xba, 0x8d, 0xca, 0x05,\n  0x28, 0xa3, 0xcc, 0xa1, 0x21, 0x39, 0xa5, 0x7d, 0x79, 0xe1, 0xb1, 0x4b,\n  0x2c, 0x3c, 0xb6, 0xde, 0xc2, 0x89, 0x24, 0x30, 0x1b, 0x0d, 0x3a, 0xad,\n  0x5a, 0x25, 0x70, 0x4c, 0x11, 0x2a, 0x92, 0x16, 0x2e, 0x15, 0x08, 0x4b,\n  0x25, 0x9c, 0x29, 0x58, 0x32, 0x94, 0xe3, 0x85, 0x2c, 0xef, 0x64, 0x89,\n  0x59, 0x67, 0x6c, 0xe8, 0x30, 0xfd, 0xfe, 0x8e, 0x37, 0xee, 0xfe, 0xd4,\n  0x17, 0xf7, 0xdc, 0xff, 0xe0, 0xee, 0x2f, 0x9c, 0x3b, 0xa1, 0xab, 0xce,\n  0x08, 0x42, 0x17, 0xfb, 0xf3, 0x3f, 0x5d, 0xbc, 0x98, 0x7d, 0x35, 0xfb,\n  0xfb, 0x7f, 0xfe, 0x67, 0x64, 0xf9, 0xcc, 0x07, 0x9f, 0xdb, 0x4e, 0x6b,\n  0xce, 0x10, 0x09, 0x16, 0x20, 0xb8, 0x34, 0x33, 0x6e, 0xa6, 0x39, 0x9d,\n  0x52, 0x0b, 0x98, 0x17, 0xa8, 0xb5, 0x9a, 0x91, 0xdb, 0x6b, 0x40, 0x1d,\n  0x1c, 0x66, 0x16, 0x52, 0xd2, 0x23, 0xc3, 0x44, 0xae, 0x61, 0x1c, 0x85,\n  0x7c, 0x65, 0x77, 0x91, 0xcd, 0x42, 0x9e, 0x31, 0x07, 0x2d, 0x36, 0xbf,\n  0x4a, 0x84, 0x12, 0x38, 0x34, 0xa1, 0x98, 0x4e, 0x85, 0x5d, 0x59, 0x04,\n  0x67, 0xd7, 0xd3, 0x73, 0x27, 0x13, 0x0f, 0xcc, 0xfe, 0xec, 0xf7, 0xfb,\n  0x5e, 0xf0, 0x1f, 0x1a, 0x91, 0xab, 0xe0, 0xe0, 0x8b, 0x75, 0x7b, 0x33,\n  0xff, 0x4e, 0xe1, 0x3c, 0xe5, 0x0d, 0x65, 0x7f, 0x83, 0x76, 0x77, 0x8e,\n  0xf6, 0x74, 0x93, 0xf9, 0x4c, 0x2e, 0x99, 0xd8, 0x52, 0x1c, 0x60, 0x8a,\n  0x99, 0x38, 0x73, 0x4d, 0x5a, 0xe3, 0xa0, 0xf0, 0x14, 0x44, 0x85, 0x95,\n  0x7c, 0x8c, 0x28, 0xca, 0x29, 0xf3, 0xb1, 0x61, 0x35, 0x14, 0xe7, 0xd8,\n  0x05, 0x89, 0xd4, 0xd1, 0x61, 0x28, 0x8b, 0x53, 0x06, 0x75, 0x5d, 0xa2,\n  0x90, 0x83, 0x1a, 0x83, 0x18, 0x13, 0x9a, 0x10, 0x5d, 0x49, 0x85, 0x04,\n  0x1d, 0x4a, 0xab, 0xe4, 0x54, 0x28, 0x23, 0xa7, 0xd3, 0x8e, 0x12, 0x0f,\n  0xc3, 0x84, 0x02, 0x9e, 0x78, 0x49, 0x1c, 0xea, 0x85, 0x06, 0x2d, 0xd6,\n  0x90, 0x59, 0x23, 0x16, 0x97, 0xe7, 0x75, 0x22, 0x90, 0x40, 0x2b, 0x47,\n  0x0c, 0x92, 0xf5, 0xd9, 0xad, 0x75, 0xb9, 0xa2, 0xaa, 0x84, 0xc1, 0x26,\n  0xfb, 0x75, 0x5c, 0xd1, 0x48, 0xc7, 0xe6, 0x93, 0x86, 0xdb, 0x01, 0xd8,\n  0xf7, 0xea, 0x4f, 0x4e, 0xb7, 0x8f, 0x3b, 0x05, 0xcc, 0x5d, 0xa8, 0xdd,\n  0xe0, 0xeb, 0x1b, 0x9c, 0xe8, 0xc2, 0x1d, 0x7f, 0x60, 0x55, 0x03, 0xc1,\n  0x9a, 0x85, 0x85, 0xaf, 0x02, 0xe0, 0xbf, 0x7d, 0xf8, 0x68, 0xb5, 0xcf,\n  0x5c, 0x6f, 0x7d, 0x11, 0x55, 0x37, 0x6c, 0x6f, 0xdd, 0x76, 0x64, 0xdb,\n  0x0e, 0xf3, 0xee, 0x83, 0x52, 0xde, 0xa6, 0x83, 0xe0, 0x61, 0x8c, 0xe0,\n  0xc1, 0xc1, 0xf8, 0xa0, 0xe7, 0x09, 0x02, 0xd6, 0xc9, 0x40, 0xf6, 0xa6,\n  0x80, 0xd9, 0x79, 0x2d, 0x52, 0x31, 0x02, 0xa7, 0x12, 0xe6, 0xd5, 0x4a,\n  0xa2, 0xa3, 0x24, 0x40, 0x66, 0x35, 0x22, 0xe6, 0xf9, 0x28, 0x3f, 0x52,\n  0xe4, 0x64, 0x98, 0x62, 0x97, 0xd3, 0x57, 0xe4, 0x23, 0x2f, 0x70, 0x48,\n  0x25, 0x9e, 0xa2, 0x3a, 0xb1, 0xa4, 0x3c, 0x61, 0xa5, 0xb5, 0xde, 0x13,\n  0x7e, 0x7b, 0xee, 0x3f, 0x33, 0x54, 0x3b, 0x37, 0xcb, 0x15, 0x9a, 0xbf,\n  0x1a, 0xe9, 0x2a, 0x3b, 0x7f, 0x0e, 0xbd, 0x9a, 0xfd, 0x1a, 0x0a, 0x66,\n  0x7f, 0x8c, 0x92, 0xd9, 0xab, 0xde, 0xf4, 0xa9, 0x1f, 0xef, 0x3f, 0x34,\n  0xb9, 0x75, 0x0a, 0x35, 0xea, 0xab, 0xc6, 0x36, 0xec, 0x9a, 0x1f, 0xfd,\n  0xe9, 0xc8, 0xd2, 0x28, 0x8a, 0x65, 0xbf, 0x4f, 0x98, 0x41, 0xdd, 0xd2,\n  0xdd, 0xd9, 0x2f, 0xd5, 0x51, 0x34, 0x2d, 0xbd, 0xcc, 0xb6, 0x11, 0x3c,\n  0x05, 0x08, 0x9e, 0xea, 0x94, 0xdc, 0x21, 0x0b, 0xd1, 0xea, 0x58, 0x11,\n  0x21, 0xde, 0x47, 0x38, 0xa0, 0x14, 0x91, 0x39, 0x13, 0x9e, 0x58, 0x75,\n  0x91, 0x28, 0x2a, 0x8a, 0x3c, 0x28, 0x83, 0xa2, 0xa2, 0x48, 0xe4, 0xe7,\n  0x75, 0x48, 0xcd, 0x40, 0xfd, 0xb7, 0x79, 0x38, 0x82, 0x90, 0x30, 0x1a,\n  0x83, 0xba, 0x32, 0xcc, 0x2e, 0xac, 0xc5, 0x92, 0x5c, 0x94, 0x3e, 0xa0,\n  0x7e, 0xcd, 0x13, 0x4c, 0xde, 0x03, 0x1a, 0x4d, 0xe1, 0x67, 0xd3, 0x0d,\n  0x85, 0x1e, 0xa3, 0xe4, 0x50, 0x49, 0x9f, 0x82, 0x42, 0x36, 0x31, 0x10,\n  0xae, 0x51, 0xe9, 0x49, 0xad, 0xcc, 0x7c, 0xd3, 0x69, 0x7f, 0x79, 0x19,\n  0x62, 0xaa, 0x2a, 0xca, 0xea, 0xca, 0xeb, 0x62, 0x91, 0x50, 0xb0, 0x84,\n  0x88, 0x20, 0x9b, 0xc5, 0xa8, 0xa7, 0xa5, 0xa1, 0x03, 0x28, 0xa0, 0x97,\n  0xf7, 0x19, 0x28, 0x1b, 0x2c, 0x01, 0x3a, 0x61, 0x97, 0x6b, 0x81, 0xdb,\n  0xfd, 0x0e, 0xc5, 0x76, 0x62, 0xfd, 0x52, 0x76, 0x66, 0x22, 0x29, 0x41,\n  0x1d, 0x5f, 0x3d, 0x7f, 0xab, 0xfe, 0xa6, 0x3b, 0xf6, 0x5d, 0xf0, 0x35,\n  0x87, 0xf6, 0x6f, 0xfe, 0xd7, 0xe2, 0xa1, 0xea, 0x9e, 0xdd, 0xc9, 0xec,\n  0x7d, 0x78, 0x7a, 0x2c, 0x31, 0x5a, 0x16, 0x1f, 0x7b, 0x11, 0x99, 0x51,\n  0x7b, 0xd7, 0x86, 0x81, 0xef, 0x5c, 0x75, 0xae, 0x2d, 0xd9, 0xa3, 0x39,\n  0x71, 0xf8, 0xbb, 0xff, 0xaa, 0x0a, 0x6e, 0xa8, 0x1e, 0x1e, 0x6f, 0x2e,\n  0x0d, 0xb5, 0x1e, 0x1e, 0x48, 0x6e, 0x9d, 0xb5, 0x5a, 0x86, 0x2d, 0x66,\n  0x34, 0xd4, 0x3d, 0x39, 0x7e, 0xf0, 0x63, 0x35, 0x91, 0xaa, 0x4a, 0xa9,\n  0x56, 0x01, 0x3e, 0x40, 0x6b, 0xc8, 0x44, 0xd3, 0x21, 0xda, 0x96, 0x05,\n  0xca, 0x3f, 0x89, 0x58, 0xcb, 0x60, 0x94, 0x91, 0xc4, 0x2a, 0xf0, 0x30,\n  0x11, 0x39, 0x0e, 0xb3, 0xc5, 0xc4, 0x11, 0x96, 0xf5, 0x07, 0x11, 0xad,\n  0x1b, 0x93, 0x8a, 0xa6, 0xa0, 0x72, 0x91, 0x53, 0x8c, 0x8a, 0xf8, 0xc0,\n  0xa1, 0xec, 0xd3, 0x33, 0x33, 0x1f, 0xdb, 0x5c, 0xb7, 0x79, 0x6a, 0xdf,\n  0x6d, 0x33, 0x89, 0xa9, 0x9b, 0xd1, 0x81, 0xec, 0x43, 0xf8, 0x62, 0xf6,\n  0xb1, 0x2f, 0x6e, 0x4c, 0x4e, 0xec, 0x7a, 0xcb, 0xe6, 0xe4, 0xe4, 0xdd,\n  0x52, 0x3d, 0x03, 0xcc, 0x13, 0x39, 0x68, 0x61, 0xe2, 0xe9, 0x88, 0xc5,\n  0xac, 0x53, 0x43, 0x91, 0x11, 0xac, 0x06, 0xdb, 0x8c, 0x7c, 0xc6, 0x20,\n  0x4b, 0x19, 0x10, 0x72, 0x72, 0xa3, 0x68, 0xc4, 0x6c, 0x71, 0x58, 0xe1,\n  0xd3, 0xac, 0xb9, 0x0f, 0x21, 0x02, 0x42, 0xfa, 0xdc, 0x9f, 0x55, 0xf4,\n  0xb4, 0xed, 0x3c, 0x30, 0x58, 0x36, 0x30, 0xf1, 0xca, 0xbe, 0xff, 0x9c,\n  0x9a, 0x3a, 0x8d, 0x5e, 0x2a, 0xef, 0xe9, 0x39, 0x35, 0x58, 0xd1, 0xbf,\n  0x9d, 0xc8, 0x03, 0x53, 0xf6, 0x0f, 0xb8, 0x28, 0xfb, 0x1a, 0xb4, 0x37,\n  0x65, 0xd0, 0x92, 0xc0, 0x7e, 0x83, 0xac, 0xad, 0x81, 0xf9, 0xb5, 0x44,\n  0x38, 0xce, 0x4a, 0x84, 0x55, 0xa5, 0x26, 0x2c, 0x60, 0x1f, 0x62, 0x05,\n  0x45, 0x93, 0xa0, 0xf1, 0xcf, 0xab, 0xef, 0xf0, 0xd2, 0x1d, 0x99, 0xe2,\n  0xe2, 0x8c, 0x8a, 0x68, 0xca, 0x2a, 0x0c, 0x75, 0x1c, 0xc5, 0x59, 0x22,\n  0x23, 0x22, 0x80, 0x70, 0xa9, 0x76, 0xb0, 0x2c, 0x78, 0xc9, 0x32, 0x98,\n  0x32, 0x4a, 0x70, 0xb5, 0xe4, 0x81, 0xca, 0x02, 0x0f, 0xd0, 0xa1, 0x82,\n  0x40, 0x75, 0x90, 0x8a, 0x95, 0x0f, 0x11, 0x92, 0x56, 0xc6, 0x43, 0x63,\n  0x54, 0x49, 0x63, 0x29, 0xf8, 0x1c, 0xad, 0x29, 0xe5, 0x42, 0x4c, 0x6d,\n  0x55, 0x45, 0x79, 0x28, 0x50, 0x52, 0x0c, 0x25, 0x2f, 0x8c, 0x50, 0xdf,\n  0xa0, 0x01, 0x35, 0x68, 0x56, 0x68, 0x2f, 0xb2, 0xb8, 0x21, 0x30, 0x93,\n  0x76, 0xb4, 0xe0, 0xaa, 0x2d, 0xcf, 0x9c, 0xab, 0x37, 0x8f, 0x9f, 0xad,\n  0x6e, 0xf7, 0xfa, 0xda, 0x03, 0xd3, 0xdb, 0xaf, 0x3e, 0x64, 0x6f, 0x32,\n  0xce, 0xfc, 0x9d, 0xc6, 0x49, 0xf6, 0xb7, 0xc8, 0x86, 0x84, 0x39, 0x60,\n  0xd0, 0x7a, 0xa4, 0x3d, 0xd0, 0xe9, 0x31, 0xa0, 0x4d, 0xd6, 0x94, 0xeb,\n  0xad, 0xef, 0xee, 0x3a, 0xf5, 0xaa, 0x5e, 0x3b, 0xa6, 0xd5, 0xdf, 0x78,\n  0xcd, 0xb5, 0xd7, 0xb1, 0x5c, 0xf6, 0x39, 0x7c, 0xc3, 0xe0, 0x7b, 0x1f,\n  0xac, 0xef, 0xda, 0x51, 0x43, 0x76, 0x43, 0x5e, 0xac, 0x96, 0x77, 0xc3,\n  0x4f, 0xb2, 0xec, 0x87, 0xdf, 0x7c, 0xf0, 0x9e, 0x3e, 0x69, 0xff, 0xd3,\n  0xb2, 0x76, 0x82, 0xf7, 0x0a, 0xe6, 0x93, 0x52, 0x8f, 0x98, 0xa2, 0x20,\n  0x81, 0x76, 0x31, 0x40, 0x5b, 0xc1, 0x01, 0x97, 0x71, 0x13, 0x65, 0x78,\n  0xa8, 0x78, 0xe5, 0x2d, 0x3e, 0xef, 0x96, 0xdc, 0x5e, 0x66, 0x0d, 0x26,\n  0x62, 0xeb, 0x62, 0x62, 0x2d, 0x12, 0x62, 0x97, 0x42, 0x02, 0x05, 0x6b,\n  0x34, 0x1c, 0xf0, 0xfb, 0x4a, 0x5c, 0x4e, 0x00, 0x2b, 0x2d, 0x1b, 0x51,\n  0x81, 0x2a, 0x0a, 0x82, 0xd5, 0x4e, 0xc1, 0x9a, 0xeb, 0x09, 0x45, 0x14,\n  0xdb, 0x65, 0x70, 0xb6, 0x45, 0x9a, 0x5c, 0xce, 0xe6, 0xc0, 0x86, 0xae,\n  0x4d, 0xd3, 0xa6, 0x80, 0x79, 0xea, 0x26, 0x7d, 0xd5, 0x50, 0x53, 0xa9,\n  0x91, 0x37, 0x88, 0x0d, 0x9d, 0x66, 0x54, 0x6a, 0x0e, 0x58, 0x6e, 0xb9,\n  0xad, 0x79, 0xee, 0x2f, 0x46, 0xc3, 0x88, 0xde, 0xbc, 0x73, 0xdf, 0xc2,\n  0x6e, 0x96, 0xfb, 0x77, 0xf4, 0xdc, 0x07, 0x9f, 0xdb, 0x21, 0x76, 0x20,\n  0xf6, 0x97, 0x7f, 0xfe, 0x25, 0xe6, 0x6e, 0x7b, 0x60, 0xd7, 0x75, 0x8d,\n  0xb4, 0xbe, 0x93, 0xc0, 0xf9, 0x68, 0x7f, 0xed, 0x1b, 0xd2, 0x16, 0x42,\n  0x8d, 0x8c, 0x9b, 0x28, 0x87, 0x06, 0x84, 0x39, 0x3d, 0x22, 0xdf, 0x32,\n  0x12, 0xa5, 0x45, 0xc9, 0x22, 0x79, 0x56, 0xc5, 0x43, 0x81, 0x11, 0x96,\n  0x63, 0xd8, 0x05, 0xb0, 0x3a, 0x22, 0xb4, 0x80, 0x79, 0x74, 0x58, 0x29,\n  0xef, 0x51, 0x26, 0x35, 0x8d, 0x59, 0x35, 0x12, 0x0e, 0xb8, 0x30, 0xda,\n  0x9b, 0xf7, 0x00, 0xad, 0x15, 0x13, 0x09, 0xc3, 0x36, 0x60, 0xa9, 0x0f,\n  0x87, 0x6b, 0x35, 0xa2, 0xaf, 0x1c, 0xad, 0xe8, 0x4b, 0xb0, 0x9a, 0xb6,\n  0xfc, 0x94, 0x27, 0xfd, 0xe6, 0x04, 0x7e, 0x83, 0x4c, 0x1d, 0x23, 0x2b,\n  0x89, 0x29, 0x7b, 0xff, 0xcc, 0x0c, 0x3a, 0x32, 0x83, 0xce, 0xca, 0x04,\n  0xb1, 0x82, 0x76, 0xd0, 0x70, 0xf6, 0x49, 0xa8, 0x78, 0x82, 0xaa, 0xa4,\n  0xba, 0x52, 0x5a, 0x76, 0x90, 0xd0, 0x49, 0x84, 0x79, 0xb7, 0x54, 0x85,\n  0xcf, 0x52, 0x42, 0x6c, 0x22, 0x53, 0x9e, 0xd2, 0x4f, 0xf7, 0x85, 0x12,\n  0xc4, 0xad, 0xba, 0x38, 0x2d, 0x0d, 0x0f, 0x90, 0x95, 0x10, 0xb5, 0x91,\n  0x15, 0x31, 0x94, 0x05, 0x15, 0x62, 0xc3, 0x79, 0x44, 0xa1, 0x51, 0x88,\n  0x02, 0x6a, 0x92, 0x89, 0xdc, 0x16, 0x32, 0x94, 0xb9, 0xe4, 0x48, 0xda,\n  0x3c, 0xc7, 0xef, 0xf3, 0xe4, 0xf5, 0xac, 0xa2, 0x04, 0x01, 0xcd, 0x73,\n  0x0a, 0x13, 0x44, 0x12, 0x2a, 0xfb, 0x27, 0xec, 0x50, 0xbd, 0x62, 0x99,\n  0x16, 0x4e, 0xac, 0xa4, 0x85, 0x57, 0xa7, 0xc8, 0xff, 0x85, 0x28, 0xe0,\n  0x3f, 0xfe, 0x03, 0x17, 0xfd, 0xf4, 0xa7, 0x39, 0xe4, 0xe7, 0xea, 0x7b,\n  0x7d, 0x93, 0xd6, 0xae, 0x2a, 0x83, 0x69, 0x13, 0xad, 0x9f, 0xe3, 0x77,\n  0x33, 0x72, 0x01, 0xb5, 0xc8, 0x30, 0x96, 0xe4, 0x72, 0x7e, 0x63, 0x49,\n  0xa2, 0x85, 0xf0, 0x49, 0x09, 0x29, 0x04, 0x25, 0x66, 0x7c, 0xdd, 0x74,\n  0xf6, 0x6d, 0x33, 0xb8, 0x68, 0xf3, 0x67, 0x3e, 0x83, 0x6f, 0x58, 0x3c,\n  0x87, 0x2f, 0x2e, 0x9e, 0xcf, 0xfe, 0x59, 0xa9, 0xe1, 0xd5, 0x87, 0x17,\n  0x68, 0xbd, 0x2a, 0xf2, 0xee, 0x5c, 0x5d, 0x2e, 0x62, 0x42, 0x41, 0x0d,\n  0xbb, 0x18, 0x6d, 0x2d, 0x13, 0x45, 0xab, 0xdf, 0x4d, 0xcb, 0x71, 0xc9,\n  0x6f, 0xc7, 0x0b, 0x5b, 0xc6, 0xb2, 0xbf, 0x9d, 0x42, 0xcf, 0x0e, 0x66,\n  0x17, 0x3f, 0x85, 0xbe, 0x91, 0x4d, 0x10, 0xb1, 0x5b, 0xb7, 0x3c, 0xef,\n  0x67, 0x68, 0xad, 0xfd, 0xc6, 0x74, 0x12, 0xcc, 0x5b, 0x35, 0xe2, 0xa1,\n  0x4f, 0x18, 0x07, 0x31, 0x09, 0x10, 0x3d, 0x20, 0x42, 0xc3, 0xa8, 0xdd,\n  0xab, 0x16, 0xe1, 0x64, 0x9c, 0xd6, 0xa0, 0x99, 0xfc, 0xaf, 0x12, 0x3d,\n  0x74, 0x15, 0x39, 0x1a, 0x4b, 0xc8, 0xa2, 0xca, 0x4e, 0x56, 0xb4, 0x30,\n  0xdd, 0xd6, 0xdd, 0xb2, 0xa3, 0x65, 0x66, 0xa6, 0xf9, 0x50, 0x6a, 0xcf,\n  0x61, 0xb2, 0x30, 0x64, 0x6a, 0x6e, 0xb2, 0xdb, 0xb2, 0x8f, 0x11, 0x32,\n  0xfa, 0x91, 0xcd, 0xb5, 0x7d, 0xea, 0x1b, 0xb0, 0x42, 0x69, 0x7d, 0x52,\n  0x2d, 0xb7, 0x86, 0x74, 0xc2, 0x48, 0x3e, 0x9f, 0x68, 0x45, 0xca, 0xe7,\n  0x92, 0x19, 0xc9, 0x7b, 0xb8, 0x52, 0x62, 0x59, 0x9a, 0x01, 0x54, 0x68,\n  0x8b, 0x98, 0xad, 0x81, 0xe5, 0x19, 0x28, 0xed, 0x90, 0x56, 0x54, 0x6b,\n  0xc3, 0x66, 0x5a, 0x99, 0x6d, 0x4a, 0x29, 0xd4, 0xf6, 0xa9, 0x4f, 0xe5,\n  0xca, 0xb2, 0x2d, 0xd7, 0x6a, 0x5b, 0x24, 0x73, 0xb0, 0x2d, 0xfd, 0x15,\n  0x7b, 0x69, 0xef, 0x9a, 0xbe, 0x74, 0xb7, 0xd2, 0xf5, 0x8c, 0x6e, 0xaf,\n  0x82, 0x81, 0x25, 0xa0, 0xc0, 0x18, 0xe8, 0x17, 0xb3, 0x19, 0x86, 0xa5,\n  0x55, 0x38, 0x4f, 0xd3, 0x22, 0x5d, 0x60, 0xab, 0xcd, 0x71, 0x52, 0x0f,\n  0x05, 0x68, 0x99, 0xe6, 0x74, 0xe8, 0x75, 0x8c, 0x0f, 0xf9, 0x78, 0xbd,\n  0x64, 0xb6, 0x98, 0xc5, 0x64, 0x2a, 0x09, 0x5f, 0x09, 0x7b, 0xca, 0x2e,\n  0xc2, 0x97, 0x19, 0x94, 0xcb, 0x84, 0xcd, 0x80, 0xbf, 0xed, 0x2e, 0x33,\n  0x1e, 0x24, 0xff, 0x36, 0x3f, 0x47, 0xfe, 0x6d, 0x3d, 0x50, 0xb5, 0x39,\n  0x38, 0x7a, 0x33, 0x34, 0x87, 0xe9, 0x0d, 0x77, 0x84, 0x46, 0x43, 0x1d,\n  0xa1, 0xbf, 0x7f, 0xa8, 0xaf, 0xa3, 0x6f, 0xb4, 0x2f, 0xdd, 0x9f, 0xfd,\n  0xd9, 0xd0, 0xcd, 0x23, 0x3d, 0xa7, 0xf7, 0x34, 0x53, 0x7b, 0x14, 0xfa,\n  0xca, 0xfc, 0x08, 0x2f, 0x12, 0xbe, 0x1b, 0xa0, 0x15, 0x85, 0x06, 0xd0,\n  0x54, 0xee, 0xba, 0x3e, 0xef, 0x7a, 0x26, 0xef, 0x3a, 0x9f, 0x77, 0x7d,\n  0x74, 0xf9, 0x3a, 0xbb, 0x37, 0x77, 0x3d, 0x2a, 0xbd, 0x07, 0x9e, 0xc3,\n  0x4f, 0xe4, 0xee, 0x6f, 0x2f, 0x70, 0x7f, 0x14, 0xee, 0x4b, 0x36, 0x05,\n  0xfe, 0x05, 0x81, 0x17, 0xcf, 0xa8, 0x81, 0x2a, 0x59, 0xa5, 0x56, 0x25,\n  0xde, 0x29, 0x70, 0x64, 0x19, 0x50, 0xf1, 0x88, 0x68, 0x59, 0x8c, 0xa0,\n  0x16, 0x08, 0x08, 0xa5, 0xaa, 0x34, 0xa2, 0xbe, 0xa8, 0xdc, 0x2f, 0x17,\n  0x50, 0x4a, 0x98, 0xd1, 0xa6, 0x19, 0xd4, 0xb8, 0x78, 0xc3, 0x0c, 0x10,\n  0xfa, 0x18, 0x54, 0x24, 0x56, 0xe8, 0x31, 0xcd, 0x4a, 0x78, 0x20, 0xb4,\n  0x50, 0x62, 0x37, 0x13, 0xd1, 0x01, 0x15, 0xda, 0x44, 0xa9, 0x93, 0x09,\n  0x1c, 0x8a, 0x32, 0x7b, 0x69, 0xad, 0xac, 0x5c, 0xd9, 0x30, 0xf2, 0x98,\n  0x8f, 0xf1, 0x99, 0xed, 0xce, 0x70, 0x10, 0xca, 0x65, 0x21, 0x73, 0x5e,\n  0x55, 0xf3, 0x24, 0x14, 0xd4, 0xa6, 0xdd, 0x7f, 0x68, 0xfb, 0xac, 0x84,\n  0x35, 0x61, 0x65, 0xbd, 0x3b, 0x36, 0xbb, 0x62, 0x06, 0xc2, 0xd7, 0xfb,\n  0x39, 0x96, 0xfb, 0xcd, 0xd0, 0xcf, 0x39, 0x61, 0xe2, 0xf4, 0x8b, 0xec,\n  0xbf, 0xc0, 0x14, 0x76, 0xcd, 0x8a, 0xfc, 0x00, 0x27, 0x9c, 0x44, 0xdf,\n  0x8c, 0x8d, 0x45, 0x16, 0xdf, 0x8c, 0x0f, 0x8d, 0x6c, 0xc9, 0x36, 0x91,\n  0x1b, 0x1f, 0xc6, 0x9b, 0xe0, 0x83, 0x67, 0x88, 0xed, 0xff, 0x1e, 0x62,\n  0xfb, 0xc7, 0x98, 0x87, 0x24, 0x55, 0xd5, 0xea, 0x21, 0x08, 0xe3, 0x8b,\n  0x89, 0x15, 0x48, 0x64, 0x1c, 0x38, 0x85, 0x58, 0x10, 0x7a, 0xab, 0xaf,\n  0x0a, 0x6c, 0xae, 0xde, 0x25, 0xd4, 0x0c, 0xe2, 0x88, 0xbd, 0x4c, 0xf8,\n  0x8a, 0xcf, 0xb5, 0x51, 0x83, 0xea, 0x47, 0xd0, 0x29, 0xe0, 0x38, 0x94,\n  0x40, 0x0b, 0x16, 0x1a, 0x21, 0x08, 0x07, 0x73, 0xa5, 0xc2, 0x8e, 0x63,\n  0xc9, 0x60, 0x0c, 0x05, 0x4b, 0xbd, 0x60, 0xa1, 0xe9, 0xb5, 0x3c, 0xc7,\n  0xc4, 0x50, 0x2c, 0xd7, 0x6d, 0x8d, 0xb6, 0x68, 0x59, 0x25, 0xff, 0x83,\n  0xc9, 0x94, 0x54, 0xf7, 0x1d, 0x7a, 0x88, 0x35, 0x34, 0xa0, 0xfd, 0xbb,\n  0xaf, 0x2a, 0xba, 0x7b, 0xc3, 0x5c, 0x63, 0xfd, 0xe1, 0xa9, 0xfa, 0xed,\n  0xf1, 0xf8, 0xae, 0x8a, 0xc9, 0xc1, 0xcd, 0x9b, 0xdb, 0xdf, 0x6e, 0xed,\n  0x6d, 0xde, 0xb6, 0x69, 0xba, 0xf9, 0x5a, 0xfc, 0xc2, 0x96, 0xa1, 0xb7,\n  0xe0, 0xda, 0x99, 0xf4, 0x86, 0x5d, 0x8d, 0x66, 0xc7, 0x84, 0xc3, 0x35,\n  0xd4, 0x9d, 0xee, 0xea, 0x78, 0x5f, 0x24, 0x3e, 0x3f, 0x9e, 0xad, 0x43,\n  0xcf, 0x51, 0x27, 0x01, 0xa1, 0x11, 0xb4, 0xb4, 0x88, 0x6f, 0xc1, 0x17,\n  0x91, 0x91, 0x09, 0xc1, 0xcf, 0xcf, 0x31, 0x52, 0xa5, 0x1c, 0x7c, 0x51,\n  0xee, 0x41, 0x08, 0xf5, 0xef, 0xde, 0x85, 0x9f, 0x67, 0xc2, 0x50, 0xc9,\n  0x0a, 0x82, 0x73, 0x2c, 0xd4, 0x84, 0x26, 0xbf, 0x0c, 0x2a, 0xb5, 0x38,\n  0x0f, 0x43, 0xa1, 0x6d, 0xa5, 0xac, 0x5d, 0x24, 0x1c, 0x8a, 0x41, 0xd9,\n  0x1a, 0xe4, 0x34, 0xe0, 0xe5, 0x6e, 0x93, 0x20, 0x58, 0x92, 0x79, 0xcd,\n  0x77, 0x94, 0x56, 0x71, 0xc3, 0x5d, 0xc3, 0x87, 0x9b, 0xaa, 0x77, 0x0e,\n  0xcc, 0xef, 0xdd, 0x31, 0xe4, 0xaa, 0xd4, 0x99, 0xab, 0x82, 0x99, 0xa3,\n  0x6d, 0x9d, 0xe7, 0xf7, 0xcd, 0xde, 0x39, 0xd4, 0x7f, 0x23, 0x7e, 0xbe,\n  0xc6, 0xb7, 0xed, 0xf6, 0xb9, 0xee, 0x63, 0x9d, 0xc7, 0xa6, 0xb6, 0xed,\n  0xe4, 0x85, 0x5e, 0x41, 0xbd, 0xe1, 0xea, 0xb1, 0xe1, 0xd3, 0x99, 0x8d,\n  0xf7, 0x6f, 0x3b, 0xf1, 0xe8, 0x01, 0xc9, 0x1e, 0xd3, 0x90, 0xf9, 0x6d,\n  0xa3, 0xb2, 0x2f, 0x00, 0x75, 0xa9, 0x7c, 0x7a, 0x91, 0xf0, 0x38, 0x58,\n  0xf5, 0x94, 0xb5, 0x89, 0xbc, 0xa1, 0xac, 0x4d, 0x0b, 0x6d, 0x79, 0xdc,\n  0x56, 0x8b, 0x5a, 0xc5, 0x38, 0x91, 0x53, 0x66, 0x6d, 0xda, 0x59, 0x82,\n  0xcd, 0xd5, 0x63, 0xb3, 0x26, 0x58, 0x03, 0x8e, 0x4a, 0x35, 0xf6, 0x52,\n  0x06, 0x7c, 0x47, 0xaa, 0xa5, 0x65, 0xbe, 0xe3, 0x8f, 0xbb, 0x1e, 0x33,\n  0x15, 0x6b, 0x38, 0xb5, 0x57, 0x7b, 0x76, 0xc7, 0xaf, 0xcb, 0x7a, 0x07,\n  0xa6, 0x8b, 0x1c, 0xb6, 0x48, 0x4d, 0x20, 0xb9, 0xa9, 0x56, 0xd3, 0x5e,\n  0x9b, 0x18, 0xae, 0xd3, 0xa2, 0x0f, 0x64, 0x7f, 0xe8, 0x49, 0xb9, 0x8a,\n  0xbb, 0x9c, 0xa8, 0x24, 0x6b, 0x99, 0xdc, 0x5b, 0x71, 0xdc, 0xea, 0x76,\n  0xf5, 0xf7, 0x09, 0xbe, 0x3a, 0x0a, 0xdf, 0x39, 0x32, 0xbf, 0x2f, 0xe0,\n  0x17, 0x90, 0x51, 0xdc, 0x8e, 0x97, 0x0a, 0xc0, 0x37, 0xb1, 0x54, 0x8a,\n  0x5e, 0x26, 0xf4, 0xd8, 0xc1, 0x1c, 0x4a, 0x17, 0x11, 0xa5, 0x98, 0x23,\n  0x1a, 0x10, 0xe2, 0xbc, 0x44, 0x3e, 0xf9, 0x60, 0xcb, 0xcd, 0xd8, 0xc9,\n  0x42, 0x86, 0xa4, 0x32, 0xe9, 0x3e, 0x38, 0x70, 0x01, 0x3d, 0xea, 0x18,\n  0x18, 0x95, 0x54, 0xcf, 0x38, 0x3e, 0xac, 0x34, 0x4b, 0x3a, 0x0a, 0xfe,\n  0x37, 0x8f, 0x52, 0x46, 0x68, 0xed, 0x40, 0xa8, 0xf6, 0xa8, 0xae, 0xac,\n  0x08, 0x47, 0x5a, 0x83, 0x02, 0xb4, 0xda, 0xc8, 0xf5, 0x10, 0x90, 0x1b,\n  0x8f, 0x81, 0xa3, 0xd2, 0x01, 0x0d, 0x05, 0xf2, 0xce, 0x91, 0xa2, 0xd2,\n  0xff, 0x79, 0xbd, 0x05, 0xa8, 0xed, 0x44, 0xab, 0x78, 0xfd, 0xda, 0x5b,\n  0xb5, 0x31, 0xde, 0x3e, 0x1c, 0xed, 0xaf, 0x6e, 0xdc, 0x92, 0xb8, 0x65,\n  0x9f, 0xd1, 0xa3, 0x37, 0x58, 0x78, 0x67, 0x22, 0x64, 0x0e, 0x99, 0x8c,\n  0xd5, 0xce, 0x64, 0x47, 0xdc, 0x6c, 0x08, 0x94, 0x6a, 0xec, 0x9a, 0x8a,\n  0x7d, 0xcd, 0xbd, 0x9b, 0xcb, 0x32, 0x75, 0x89, 0x8d, 0xb5, 0xad, 0x0b,\n  0x9d, 0xc9, 0x9d, 0xf8, 0x83, 0xfd, 0x56, 0x5b, 0x73, 0x32, 0x56, 0x13,\n  0xb0, 0x3a, 0x12, 0x43, 0xcd, 0xdb, 0xf6, 0x91, 0x9d, 0x42, 0xe3, 0xd1,\n  0x37, 0x85, 0xd5, 0x9a, 0x21, 0x51, 0x1d, 0x6c, 0x8f, 0x05, 0x2a, 0x4d,\n  0xbc, 0xc8, 0x6f, 0xb6, 0xba, 0xda, 0x9b, 0xa2, 0x75, 0x21, 0xab, 0xad,\n  0x36, 0xd3, 0xd2, 0x3a, 0x59, 0xe9, 0x00, 0x58, 0x05, 0x96, 0x4a, 0xb1,\n  0x9f, 0xf6, 0xb5, 0x3b, 0x09, 0x67, 0x7c, 0xe0, 0x1e, 0xe6, 0x31, 0xe1,\n  0x4f, 0xde, 0x4c, 0xf4, 0x34, 0x4e, 0xee, 0x02, 0x00, 0xa5, 0xa4, 0x78,\n  0x22, 0x2f, 0x4f, 0xe7, 0x0a, 0x13, 0x0d, 0x0b, 0x52, 0xf5, 0xf7, 0xe5,\n  0xfa, 0xbb, 0xc5, 0xe9, 0xd2, 0xdc, 0x28, 0x16, 0x7a, 0x94, 0xec, 0x5d,\n  0x35, 0x98, 0x97, 0x6b, 0xf8, 0x41, 0x2f, 0x29, 0x28, 0x2a, 0x42, 0x6b,\n  0xf8, 0xc9, 0xf5, 0x22, 0x57, 0x41, 0x29, 0x0a, 0xed, 0x31, 0xd0, 0xad,\n  0xd9, 0x3b, 0xd1, 0xcf, 0xb3, 0xd7, 0x6d, 0xe8, 0xf5, 0x05, 0x87, 0x82,\n  0x45, 0xb5, 0x36, 0x6b, 0x4b, 0xc9, 0xe8, 0xac, 0xcf, 0x16, 0x88, 0xf9,\n  0xda, 0xf0, 0x86, 0x91, 0xb6, 0xc5, 0xa7, 0xb9, 0xf6, 0x54, 0x5b, 0xb9,\n  0x4a, 0x33, 0xa8, 0x52, 0x8f, 0xa6, 0x82, 0x51, 0x13, 0xa5, 0xdd, 0x5e,\n  0xf2, 0xa1, 0x9d, 0xd4, 0xa7, 0x13, 0x64, 0x7a, 0xd2, 0x9d, 0xb4, 0x0b,\n  0x89, 0x08, 0xc5, 0xc8, 0xe4, 0x96, 0x04, 0x80, 0x5b, 0x50, 0x3d, 0x0e,\n  0x48, 0xad, 0x08, 0xe4, 0xf2, 0xc6, 0x56, 0x0b, 0x78, 0x51, 0x8b, 0x5d,\n  0x0e, 0x9b, 0x25, 0x68, 0x0d, 0xea, 0x34, 0x6a, 0x91, 0x83, 0x56, 0xac,\n  0x66, 0x0d, 0x14, 0xe1, 0x93, 0x6b, 0xd0, 0xd3, 0x5a, 0xf4, 0x94, 0xd5,\n  0xd8, 0x35, 0x57, 0x4e, 0xdb, 0x8d, 0xcd, 0x43, 0x87, 0x33, 0x13, 0x9b,\n  0x37, 0x45, 0x27, 0xa7, 0xec, 0xfa, 0xc6, 0xa1, 0x85, 0xfa, 0xa6, 0xc9,\n  0x91, 0xd0, 0x38, 0x7a, 0x67, 0x59, 0x6d, 0xfd, 0x74, 0xd7, 0x68, 0x57,\n  0xbc, 0xb7, 0x2c, 0xbb, 0xab, 0xac, 0xa2, 0x61, 0xb2, 0x6b, 0xac, 0x23,\n  0xda, 0x15, 0x97, 0x64, 0x7a, 0x2d, 0xb1, 0x93, 0xee, 0xc5, 0xff, 0xc4,\n  0x98, 0x98, 0x70, 0x3a, 0x00, 0x2d, 0x47, 0x08, 0xe0, 0xc0, 0x05, 0x2c,\n  0x41, 0x0d, 0x13, 0xf6, 0x32, 0xea, 0x35, 0x2a, 0x91, 0x67, 0x4c, 0xc8,\n  0x04, 0xec, 0x85, 0x24, 0xf7, 0x36, 0xd4, 0x64, 0x02, 0x0f, 0x67, 0xc2,\n  0x8e, 0x32, 0xf7, 0xbc, 0xe9, 0xba, 0x9b, 0x16, 0xe6, 0xfe, 0xee, 0x9a,\n  0x1d, 0x76, 0xa4, 0xbe, 0x69, 0x7e, 0xef, 0xa9, 0xb1, 0x07, 0x27, 0xa6,\n  0xea, 0xe4, 0xfd, 0x02, 0x9f, 0xa1, 0x3c, 0xdc, 0x9e, 0x6e, 0x51, 0xb4,\n  0x4c, 0xea, 0xd8, 0xc2, 0x2c, 0x0f, 0xdd, 0xbd, 0x45, 0x6a, 0xa2, 0x49,\n  0xbd, 0x09, 0x19, 0x5a, 0xd1, 0x8f, 0x6c, 0xf6, 0x4a, 0x53, 0x53, 0x2d,\n  0x51, 0x12, 0x09, 0x4f, 0xab, 0xf4, 0x2b, 0x94, 0xc4, 0x65, 0x45, 0x19,\n  0xfc, 0xc7, 0x5f, 0x74, 0xc5, 0x0d, 0x04, 0x5a, 0xf5, 0x8d, 0xd9, 0x07,\n  0x89, 0x76, 0x7c, 0x68, 0x66, 0xcf, 0xe7, 0x44, 0x3e, 0xc3, 0x09, 0x2d,\n  0xbd, 0x68, 0x43, 0xf6, 0xe3, 0x92, 0x42, 0xbc, 0xd8, 0x7f, 0x78, 0x2f,\n  0xe1, 0x57, 0xcd, 0x92, 0x91, 0xd5, 0x52, 0x1b, 0x00, 0x4a, 0x43, 0x8a,\n  0xec, 0x79, 0xe6, 0xd5, 0x25, 0x17, 0xe1, 0x59, 0x84, 0x3e, 0xb9, 0xe4,\n  0x92, 0x79, 0xb6, 0x96, 0xf0, 0x74, 0x31, 0xe1, 0x59, 0x3f, 0x33, 0x90,\n  0xee, 0xd5, 0x13, 0x56, 0xb5, 0x5a, 0x0c, 0xa0, 0x64, 0xb0, 0xd8, 0x4b,\n  0x08, 0xd1, 0x47, 0xab, 0x26, 0x43, 0x0d, 0x45, 0xb2, 0x95, 0x9c, 0x56,\n  0x2c, 0x82, 0x63, 0x52, 0x1d, 0x5b, 0x7e, 0x59, 0x18, 0x39, 0x6c, 0x66,\n  0x93, 0x56, 0x03, 0xe5, 0x13, 0x85, 0x5c, 0xe5, 0xbf, 0x86, 0x54, 0x34,\n  0x99, 0x92, 0x3b, 0x7c, 0x88, 0xbc, 0x3d, 0xa8, 0xd4, 0xfc, 0xa4, 0xed,\n  0x7f, 0x06, 0x6e, 0xbf, 0x77, 0xc3, 0x81, 0x0d, 0xcf, 0xff, 0x4b, 0xdf,\n  0xb1, 0x5a, 0x7f, 0xd5, 0x96, 0x8a, 0xb7, 0x20, 0x61, 0xe3, 0xbe, 0xfd,\n  0xbb, 0x66, 0xeb, 0x0e, 0xd6, 0x96, 0xef, 0xd7, 0x1c, 0xdd, 0xdd, 0xb5,\n  0xb9, 0x92, 0x3f, 0xdf, 0x75, 0xad, 0xcd, 0xd1, 0x63, 0x33, 0x6f, 0x7c,\n  0xac, 0xab, 0xbb, 0xbd, 0xb3, 0xbf, 0xc8, 0xb9, 0xd1, 0x6a, 0x97, 0xe4,\n  0x64, 0x70, 0xe9, 0x65, 0xf4, 0x2d, 0xfc, 0x75, 0xc6, 0xc2, 0x78, 0x98,\n  0x8e, 0x74, 0xbb, 0x93, 0x4c, 0xd4, 0x8c, 0x96, 0xf7, 0x65, 0x2e, 0x23,\n  0x40, 0xac, 0x3a, 0xe2, 0xf0, 0x7e, 0x9e, 0xd6, 0xb1, 0x55, 0x2a, 0x91,\n  0x91, 0xc9, 0x5a, 0xad, 0x0c, 0x63, 0xf5, 0x58, 0x3d, 0x50, 0xd1, 0xd6,\n  0x0a, 0x1b, 0xb4, 0x6b, 0xe5, 0x06, 0xdd, 0x90, 0x84, 0x5a, 0xaa, 0x56,\n  0x28, 0x5c, 0x08, 0x8d, 0x6f, 0x58, 0xf4, 0xad, 0xa1, 0xee, 0xa2, 0xb0,\n  0xde, 0x58, 0x62, 0xf0, 0x47, 0xb2, 0x8f, 0xa3, 0x51, 0x15, 0x87, 0x39,\n  0xc1, 0x6d, 0xff, 0x32, 0xfe, 0xfa, 0xe2, 0xf7, 0xb6, 0x6c, 0x26, 0x56,\n  0x2b, 0x27, 0xc4, 0xab, 0xaa, 0xdb, 0xd1, 0xb3, 0xd9, 0xfe, 0xb7, 0x34,\n  0x5f, 0x1d, 0xd2, 0x57, 0x94, 0x64, 0x7f, 0x47, 0x7d, 0x55, 0x64, 0x8e,\n  0x44, 0x87, 0xfc, 0x3a, 0xe3, 0x60, 0x4a, 0x99, 0x72, 0xe6, 0x49, 0xb9,\n  0xcc, 0x28, 0xd9, 0x84, 0x59, 0x02, 0x64, 0x2e, 0xc0, 0x61, 0xa4, 0x8a,\n  0xb2, 0x58, 0xb2, 0x4a, 0xd6, 0x5c, 0x16, 0x25, 0xbb, 0x04, 0x1e, 0x29,\n  0xd3, 0x10, 0x6b, 0x96, 0x68, 0xc0, 0xe4, 0x83, 0xf7, 0x53, 0xf6, 0xd1,\n  0x22, 0xe8, 0x93, 0x25, 0xaa, 0x31, 0x59, 0x8f, 0xec, 0xb6, 0xa5, 0xbf,\n  0x53, 0xfb, 0xa4, 0xd0, 0x60, 0x6a, 0xbd, 0x1e, 0x5c, 0x36, 0x57, 0x8f,\n  0x83, 0x7d, 0xe2, 0xf7, 0xfb, 0x9d, 0x4e, 0x62, 0xa3, 0x94, 0xfb, 0xcb,\n  0x23, 0x61, 0x67, 0xa9, 0xb3, 0x54, 0xa2, 0x40, 0x4a, 0x80, 0x0e, 0xe4,\n  0xd0, 0xad, 0x24, 0x40, 0x80, 0x89, 0x54, 0xaf, 0xdd, 0x26, 0xb0, 0x39,\n  0xd8, 0xf0, 0xd2, 0xa9, 0x68, 0x3b, 0x4e, 0xa1, 0xce, 0x7c, 0x18, 0xcd,\n  0xde, 0x79, 0xe7, 0x90, 0x4e, 0x86, 0x13, 0xfa, 0xa5, 0x2e, 0xee, 0xa8,\n  0x13, 0x8d, 0x7a, 0xac, 0x59, 0x01, 0xac, 0xa1, 0xc8, 0x96, 0xcd, 0xc8,\n  0x9b, 0x03, 0xd9, 0x55, 0xea, 0xf0, 0xa6, 0x80, 0xc6, 0x92, 0x6a, 0x76,\n  0x32, 0x52, 0x4d, 0x57, 0xee, 0xdd, 0xf8, 0x1b, 0x84, 0x6e, 0x43, 0x54,\n  0xc7, 0x0b, 0xe1, 0xa0, 0xd4, 0x87, 0x6b, 0xe9, 0x65, 0x2e, 0x83, 0xbf,\n  0xcb, 0x58, 0x89, 0x82, 0x15, 0x63, 0x1e, 0xfd, 0x44, 0x88, 0xc7, 0xa2,\n  0xa0, 0x78, 0x69, 0xfd, 0xc4, 0x2a, 0x53, 0x21, 0x8e, 0x17, 0xb9, 0xfd,\n  0x44, 0x3f, 0x41, 0xbb, 0xe4, 0x5d, 0x13, 0xb4, 0x16, 0x56, 0x6e, 0x40,\n  0x26, 0x09, 0xd5, 0x70, 0xe1, 0x81, 0x64, 0x48, 0x7e, 0x49, 0xdb, 0x62,\n  0xe8, 0x6c, 0x96, 0x1b, 0x47, 0x47, 0x08, 0x82, 0xd2, 0xa9, 0x6c, 0xd5,\n  0xd8, 0xe9, 0xe9, 0xb4, 0x13, 0x2a, 0xd4, 0x95, 0xc6, 0x4a, 0x63, 0xd0,\n  0x4d, 0x05, 0xaa, 0xde, 0x47, 0x82, 0x52, 0x9d, 0xf6, 0x94, 0x18, 0x44,\n  0x09, 0xe7, 0x0a, 0x75, 0x21, 0x9a, 0xb2, 0xe5, 0xa9, 0x12, 0xb0, 0x2b,\n  0xc1, 0xe1, 0xda, 0x93, 0xe3, 0x73, 0xc8, 0xbc, 0x7d, 0xca, 0xfd, 0x8e,\n  0xf3, 0x07, 0xef, 0x1f, 0x1a, 0xba, 0xff, 0xd0, 0x99, 0xb7, 0x7b, 0x46,\n  0x4e, 0x5c, 0x77, 0xfd, 0xb1, 0x63, 0xd7, 0x5d, 0x77, 0x72, 0x7e, 0x4c,\n  0xb0, 0xa9, 0x44, 0x9b, 0x30, 0xfe, 0xe2, 0x8b, 0xf8, 0x1b, 0xbf, 0x3d,\n  0xf6, 0x86, 0xad, 0x8f, 0x1e, 0x3d, 0xfa, 0xe8, 0xb6, 0x1b, 0x0f, 0xdc,\n  0x71, 0xdb, 0xdb, 0xde, 0x76, 0xdb, 0x6d, 0x17, 0x2e, 0x7c, 0xe9, 0xc7,\n  0xd6, 0x56, 0x8f, 0x2b, 0x6d, 0x7d, 0x51, 0xe2, 0x0f, 0x02, 0x27, 0xf6,\n  0x55, 0x02, 0x3f, 0xf0, 0xeb, 0xee, 0x79, 0xca, 0x43, 0xdd, 0xba, 0x12,\n  0x90, 0x8a, 0x19, 0x81, 0x90, 0x9c, 0x80, 0x14, 0xc6, 0x00, 0x36, 0xc6,\n  0xa2, 0x42, 0x3e, 0xbe, 0x55, 0x77, 0x69, 0x95, 0x5f, 0x18, 0x22, 0x2a,\n  0x64, 0x43, 0xf4, 0xbc, 0x22, 0xa7, 0xd5, 0x62, 0xd4, 0x53, 0xf7, 0x1b,\n  0x07, 0xa4, 0xa2, 0xc8, 0xaa, 0xa8, 0x1f, 0x56, 0x6a, 0xf5, 0x62, 0x2a,\n  0xb1, 0xa8, 0xa4, 0x4a, 0xc8, 0x6b, 0xc3, 0xff, 0x76, 0xf8, 0xa6, 0x98,\n  0x3a, 0xfb, 0x3b, 0xba, 0xc2, 0xa7, 0x1c, 0x35, 0x7d, 0xa9, 0x6d, 0xdb,\n  0x67, 0xee, 0x5b, 0xdc, 0xf3, 0x33, 0x79, 0x59, 0x9a, 0x3d, 0x07, 0x8a,\n  0xc8, 0xc2, 0xb2, 0x25, 0x8d, 0x83, 0xe1, 0xdd, 0xdb, 0xd1, 0x57, 0xb2,\n  0x75, 0xa7, 0xee, 0x41, 0x09, 0x79, 0x4d, 0xb0, 0x1e, 0x82, 0xfc, 0x9b,\n  0xc8, 0x7a, 0xe0, 0xbc, 0xa0, 0x36, 0x5d, 0xe5, 0x20, 0x16, 0x27, 0x07,\n  0x4d, 0xee, 0x68, 0xb9, 0x6a, 0xa2, 0xda, 0xe2, 0xfd, 0x1c, 0x92, 0xea,\n  0xf6, 0xd2, 0x52, 0xd0, 0x16, 0x8b, 0xc5, 0x6d, 0x71, 0x83, 0xdd, 0x59,\n  0x44, 0xeb, 0x40, 0x7b, 0xb1, 0x54, 0x7e, 0x17, 0x05, 0xe5, 0x39, 0x2a,\n  0x20, 0xc7, 0x5e, 0xb5, 0xd5, 0xc4, 0xf1, 0x4e, 0xcd, 0x87, 0xb7, 0x67,\n  0x97, 0x76, 0x8f, 0x65, 0x7f, 0x43, 0x27, 0xd8, 0xa5, 0x00, 0xfb, 0x35,\n  0x47, 0x5b, 0x8b, 0xad, 0x68, 0xd8, 0x8b, 0x5e, 0x5a, 0x6c, 0x00, 0xc0,\n  0x67, 0xb7, 0xe5, 0xc0, 0x4c, 0x7b, 0xc2, 0xb1, 0x67, 0xa8, 0x7d, 0x6d,\n  0x63, 0xbc, 0x4c, 0x2a, 0x5d, 0x6f, 0x21, 0xfc, 0xe5, 0x22, 0xfa, 0x35,\n  0xcc, 0x8a, 0x08, 0x79, 0xd0, 0x99, 0xf7, 0x4b, 0x1d, 0x78, 0x54, 0x3c,\n  0x96, 0x2b, 0xb7, 0x7a, 0x4b, 0x0c, 0xfa, 0x9c, 0x51, 0xac, 0x26, 0x73,\n  0xab, 0x45, 0x60, 0x02, 0x90, 0x99, 0x41, 0x3b, 0x50, 0x51, 0x86, 0x97,\n  0x55, 0x9a, 0x70, 0x2a, 0x88, 0xcc, 0xbb, 0x8e, 0x7f, 0xeb, 0xd8, 0xf6,\n  0xec, 0x5f, 0xe7, 0x8f, 0x7e, 0xe7, 0xea, 0xcf, 0x56, 0xbd, 0xa3, 0x42,\n  0xb4, 0xaa, 0x44, 0xfb, 0x9f, 0x54, 0x76, 0x1b, 0x2f, 0xba, 0x75, 0x81,\n  0x47, 0x88, 0xb0, 0x7f, 0x06, 0x75, 0x2c, 0x36, 0x10, 0xc1, 0xff, 0x79,\n  0xcc, 0xdf, 0x78, 0x13, 0x9d, 0x5d, 0xf6, 0x67, 0x8e, 0xf4, 0x06, 0x87,\n  0x6b, 0x3c, 0x30, 0x27, 0xd3, 0x82, 0x89, 0xc0, 0xee, 0x6b, 0x4c, 0x09,\n  0xe1, 0xa6, 0xee, 0x74, 0x47, 0x00, 0x09, 0x5c, 0x91, 0x1e, 0xb3, 0x98,\n  0x4c, 0x92, 0xe5, 0xa9, 0xb0, 0x84, 0xee, 0x66, 0x98, 0x15, 0x40, 0x58,\n  0x2a, 0x7b, 0x52, 0x4e, 0x62, 0x1e, 0x65, 0x46, 0xbc, 0x5e, 0x6f, 0xc4,\n  0x1b, 0x71, 0x99, 0xcd, 0xb6, 0x50, 0x00, 0xaa, 0x8f, 0xd3, 0x13, 0x79,\n  0xc5, 0x73, 0x95, 0xca, 0x61, 0x5d, 0x06, 0x71, 0x0e, 0xb4, 0x87, 0x82,\n  0x47, 0x66, 0x5b, 0xca, 0x1c, 0xb5, 0x45, 0x0d, 0xad, 0x2e, 0x7b, 0x26,\n  0xfb, 0xab, 0x31, 0x00, 0xed, 0x13, 0x14, 0xde, 0x0e, 0xcd, 0x47, 0xb6,\n  0x67, 0xeb, 0xc7, 0x60, 0x31, 0x36, 0x71, 0x3c, 0xbe, 0x6b, 0x9f, 0x71,\n  0x42, 0xa3, 0x4a, 0x6d, 0xa8, 0xff, 0xce, 0x8b, 0xf8, 0x6b, 0xd9, 0xda,\n  0x1c, 0xd0, 0xb3, 0xb3, 0x39, 0x70, 0x13, 0x99, 0xe0, 0x23, 0xf2, 0xb4,\n  0x05, 0xbf, 0x80, 0x23, 0xec, 0x0c, 0xed, 0xe4, 0x72, 0xdd, 0x26, 0xcc,\n  0xa8, 0xc8, 0x4e, 0xf6, 0x04, 0x86, 0x8d, 0x0c, 0x31, 0x7a, 0xb2, 0xd8,\n  0x83, 0xf4, 0x2c, 0xa3, 0x3e, 0x5d, 0x4b, 0x28, 0x54, 0x4d, 0xeb, 0x99,\n  0x63, 0x28, 0x83, 0x48, 0x36, 0x5e, 0x86, 0x9d, 0xe7, 0x50, 0x9e, 0x46,\n  0x44, 0x96, 0xe6, 0x60, 0x1c, 0x56, 0x8b, 0x5d, 0x42, 0x44, 0x89, 0x5c,\n  0x9d, 0x14, 0x24, 0x9c, 0x54, 0xd2, 0x1c, 0x49, 0x15, 0xce, 0xf5, 0x9b,\n  0x66, 0x76, 0xec, 0x90, 0xab, 0x9a, 0xa3, 0xc8, 0x81, 0xc5, 0x81, 0x19,\n  0x1c, 0x19, 0x9d, 0x9c, 0x1c, 0xfd, 0x8c, 0x5c, 0xd4, 0xfc, 0xb0, 0x54,\n  0xe5, 0x3c, 0x22, 0xdb, 0x8a, 0xb9, 0x39, 0x44, 0xd3, 0x21, 0x87, 0x9d,\n  0x4a, 0x54, 0x88, 0x1f, 0xd2, 0x32, 0x39, 0x2d, 0x5e, 0x16, 0x45, 0x70,\n  0x12, 0x0c, 0x96, 0x45, 0x38, 0x15, 0xcd, 0x2f, 0xa4, 0xee, 0x4c, 0x39,\n  0x45, 0x67, 0x30, 0x4a, 0x30, 0xb2, 0x7b, 0xef, 0x72, 0x39, 0xf5, 0xf9,\n  0xdd, 0xf1, 0x7d, 0x17, 0x0e, 0x9c, 0x98, 0xbb, 0x71, 0xfc, 0xf6, 0x15,\n  0x25, 0xd5, 0xef, 0x9e, 0xa8, 0xdb, 0xf4, 0xad, 0x87, 0xc7, 0xa5, 0xcf,\n  0x56, 0xd6, 0xef, 0x85, 0x1a, 0xe2, 0xde, 0x12, 0xea, 0x78, 0x32, 0x29,\n  0x9f, 0xcd, 0x21, 0xcc, 0x23, 0xda, 0xc4, 0x4a, 0xa0, 0x9c, 0x2d, 0xe6,\n  0x66, 0x01, 0xff, 0x6c, 0x2a, 0xbd, 0x57, 0x99, 0x49, 0x70, 0x15, 0x1c,\n  0x56, 0xce, 0x68, 0x53, 0x1e, 0x38, 0x56, 0xcd, 0x2a, 0x1f, 0x2c, 0xcb,\n  0x13, 0x93, 0x60, 0x32, 0x42, 0x6b, 0x93, 0x06, 0xd2, 0x3e, 0xb5, 0x8a,\n  0xe7, 0x60, 0x67, 0xce, 0x48, 0x75, 0xd3, 0x65, 0x3d, 0x95, 0xb0, 0xac,\n  0xd5, 0x6c, 0x62, 0xc9, 0x56, 0x1c, 0x06, 0x53, 0x5c, 0x24, 0x1b, 0x4d,\n  0x0a, 0xd9, 0x50, 0x73, 0xf6, 0xd0, 0xf4, 0xcc, 0xf4, 0xc8, 0x08, 0x7a,\n  0x24, 0x88, 0xc6, 0x5e, 0x05, 0x3b, 0xd4, 0x21, 0xf7, 0x03, 0xd1, 0x83,\n  0xfd, 0x46, 0x8b, 0xec, 0x4b, 0xcd, 0x33, 0xe8, 0xcb, 0x78, 0x5e, 0xd8,\n  0x09, 0x95, 0xf3, 0x0f, 0x0a, 0x80, 0x5d, 0x3d, 0xa3, 0x97, 0x4e, 0xa4,\n  0x80, 0x64, 0x13, 0xcb, 0xcb, 0x22, 0xc6, 0xfe, 0xae, 0xa1, 0xa1, 0x99,\n  0xc3, 0x87, 0x51, 0x23, 0x2e, 0x1f, 0x9e, 0x98, 0x18, 0xce, 0x86, 0xc7,\n  0x94, 0xbd, 0x85, 0x55, 0x93, 0xbd, 0xc5, 0x4e, 0x74, 0x0a, 0xaa, 0xc1,\n  0x8a, 0x18, 0x33, 0x6a, 0x0d, 0xcf, 0xb2, 0x2a, 0x06, 0x0e, 0xc3, 0x60,\n  0xa7, 0xa0, 0xaa, 0x8f, 0xd4, 0xf8, 0x95, 0xa1, 0x9d, 0xb4, 0xbc, 0x25,\n  0x4e, 0x32, 0x27, 0x7f, 0x69, 0x49, 0xd0, 0x1b, 0x74, 0xbb, 0x1c, 0x1e,\n  0xa7, 0x07, 0x5a, 0xb2, 0x50, 0x47, 0x94, 0x9e, 0x70, 0xb7, 0x39, 0x29,\n  0x1d, 0x7e, 0xd3, 0x36, 0x7a, 0xd4, 0x89, 0x1e, 0x89, 0x22, 0x22, 0xf2,\n  0xfd, 0x91, 0x08, 0xf4, 0x6d, 0xf7, 0x3b, 0x1c, 0xed, 0x62, 0xe6, 0xee,\n  0x85, 0x3d, 0x77, 0x8d, 0x8a, 0xcd, 0xcd, 0xdc, 0xc8, 0x3d, 0xf3, 0x07,\n  0xef, 0x19, 0xe2, 0xd0, 0xe0, 0xb1, 0x13, 0x6a, 0xf4, 0x1d, 0xd5, 0xf1,\n  0x63, 0x27, 0x8f, 0xf3, 0xd9, 0x4a, 0xfe, 0x24, 0x1a, 0xec, 0x9d, 0xbb,\n  0x7f, 0x7c, 0xec, 0xfe, 0xdd, 0xbd, 0xf3, 0x17, 0x36, 0x4d, 0x5e, 0xd8,\n  0x87, 0x5a, 0xcf, 0x5e, 0x75, 0xd5, 0xd9, 0xc5, 0xcf, 0xde, 0x79, 0xc3,\n  0x0d, 0x77, 0x4a, 0x31, 0x01, 0xc4, 0xae, 0x65, 0x3f, 0x40, 0xe6, 0x1e,\n  0x61, 0xea, 0xe8, 0x7e, 0x79, 0x02, 0x27, 0x94, 0xeb, 0xbc, 0x90, 0x77,\n  0xbd, 0x0e, 0x37, 0xc8, 0x35, 0x93, 0xa5, 0x9e, 0x25, 0x56, 0xb2, 0x56,\n  0xa2, 0xa5, 0x82, 0xa7, 0x9b, 0x51, 0xe1, 0x79, 0x42, 0x9b, 0x6a, 0xd0,\n  0x1f, 0x18, 0x6e, 0x5e, 0x83, 0x44, 0x51, 0xb6, 0x21, 0x18, 0xca, 0x30,\n  0x76, 0x1b, 0xc3, 0x10, 0x6b, 0xd1, 0x63, 0xf7, 0xc8, 0x2d, 0x5d, 0xc2,\n  0x7e, 0xb3, 0x96, 0x80, 0x36, 0x95, 0x4c, 0x98, 0x73, 0x4d, 0x48, 0x28,\n  0xdd, 0x04, 0x93, 0x56, 0xa5, 0xb9, 0x87, 0x69, 0x5c, 0xee, 0x42, 0xb2,\n  0x67, 0xcf, 0xcc, 0x53, 0x5b, 0xe1, 0x10, 0xf6, 0xea, 0x21, 0xac, 0x39,\n  0xb2, 0xa7, 0x65, 0x3e, 0xbd, 0x79, 0xe8, 0xea, 0xab, 0xb1, 0x2a, 0xfb,\n  0x0b, 0x7a, 0x02, 0xcb, 0x50, 0x03, 0x86, 0xc1, 0x37, 0x50, 0x7b, 0x28,\n  0xc4, 0x1c, 0x93, 0x5a, 0xe0, 0x05, 0x89, 0x94, 0x27, 0x5a, 0xdc, 0x09,\n  0x11, 0x7c, 0xf9, 0x64, 0x23, 0x46, 0x0b, 0x70, 0xa2, 0xca, 0xcc, 0xaa,\n  0x24, 0xdf, 0x8e, 0x5c, 0xa3, 0x3d, 0x24, 0x8d, 0xc2, 0xa7, 0x2f, 0x35,\n  0x6c, 0x3a, 0x5d, 0x5c, 0xe2, 0x41, 0x4c, 0xa9, 0xd7, 0x13, 0x2a, 0x09,\n  0xb9, 0x8b, 0xac, 0x16, 0x3d, 0xb8, 0xd2, 0x04, 0xa6, 0x18, 0x15, 0x6b,\n  0x96, 0x3b, 0x95, 0x04, 0xa1, 0xa3, 0xb5, 0xdc, 0x8d, 0x2e, 0x28, 0x45,\n  0x95, 0x27, 0xf2, 0x5a, 0x95, 0x1c, 0x95, 0x16, 0x33, 0x63, 0x2a, 0x8f,\n  0x8a, 0xec, 0x20, 0x27, 0x0e, 0x6e, 0x32, 0x4a, 0xab, 0xc2, 0x17, 0xe9,\n  0x9a, 0xb2, 0xbf, 0x41, 0xce, 0x78, 0xa9, 0xb9, 0x58, 0xa5, 0xf1, 0x9a,\n  0x5a, 0x37, 0xa1, 0xfd, 0xc3, 0xb9, 0xe5, 0x91, 0xf5, 0x11, 0xfe, 0x64,\n  0xfd, 0x54, 0xcf, 0x2e, 0x63, 0xbe, 0x3d, 0xf4, 0x84, 0x95, 0xac, 0x4f,\n  0xa3, 0x21, 0x9b, 0x98, 0x1a, 0xb1, 0x70, 0x8a, 0x2f, 0x6d, 0xcf, 0xf2,\n  0x15, 0x91, 0x9e, 0xeb, 0xc3, 0x1f, 0x9c, 0xf4, 0xc7, 0xf4, 0xb4, 0xf4,\n  0x84, 0x57, 0x45, 0x84, 0x36, 0xd1, 0xf6, 0x04, 0x96, 0x59, 0xd0, 0x88,\n  0xd0, 0xd2, 0x71, 0x17, 0x34, 0x6d, 0x3e, 0x26, 0xb7, 0x97, 0x95, 0xdf,\n  0x12, 0xcb, 0x1b, 0xc5, 0x2c, 0x8f, 0x01, 0x9c, 0xae, 0x1a, 0x9f, 0x8e,\n  0xac, 0x1e, 0xca, 0x28, 0x23, 0xa9, 0x2f, 0x57, 0xe9, 0x5b, 0x4b, 0x14,\n  0x9c, 0x12, 0xa8, 0x95, 0x1e, 0x09, 0x05, 0xca, 0x82, 0x65, 0xa5, 0x3e,\n  0xe8, 0x03, 0x6a, 0xb3, 0x18, 0x74, 0xc4, 0x44, 0x22, 0x2a, 0xbf, 0x56,\n  0x36, 0x91, 0x68, 0x07, 0x78, 0xc9, 0x35, 0x42, 0x0b, 0xdf, 0xe4, 0x51,\n  0x86, 0x99, 0xf2, 0x84, 0x0c, 0xc7, 0x8a, 0x89, 0xc9, 0x36, 0x53, 0x89,\n  0x41, 0x17, 0x71, 0xde, 0x5e, 0x56, 0x15, 0x90, 0x49, 0x44, 0x26, 0x10,\n  0xe4, 0xdc, 0xb1, 0xf1, 0xf8, 0x98, 0xc0, 0xf5, 0x09, 0xaa, 0x07, 0xaf,\n  0x6a, 0xac, 0x43, 0xfb, 0x73, 0x90, 0x45, 0xfb, 0x64, 0x70, 0x42, 0x1f,\n  0x83, 0x4d, 0xf8, 0x79, 0x42, 0xd7, 0x1e, 0xa2, 0x05, 0x36, 0xa6, 0x93,\n  0x0e, 0x1b, 0x66, 0xd8, 0xe2, 0x22, 0xa7, 0x9d, 0x68, 0x02, 0x0c, 0xce,\n  0x78, 0x10, 0x1e, 0x80, 0x52, 0xb2, 0xe7, 0x15, 0x7f, 0x01, 0x75, 0x69,\n  0x29, 0x06, 0x40, 0x28, 0x5c, 0x1c, 0xe9, 0xe4, 0x09, 0x73, 0xf2, 0xa9,\n  0x68, 0x20, 0xe7, 0xbc, 0x91, 0xb5, 0x33, 0x51, 0x11, 0x77, 0x6c, 0x9e,\n  0x86, 0x86, 0x8e, 0xed, 0x6b, 0x10, 0xf4, 0xc2, 0xd1, 0x07, 0xfa, 0xfb,\n  0x1f, 0x38, 0x46, 0x74, 0xb3, 0x85, 0xf9, 0xca, 0x73, 0xce, 0xc3, 0xa3,\n  0x67, 0x62, 0x37, 0xfc, 0x56, 0xd1, 0xcf, 0x8e, 0xc7, 0xd2, 0x68, 0xdb,\n  0x63, 0x47, 0x8f, 0xbc, 0x6f, 0x1b, 0xd1, 0xcc, 0xde, 0xf0, 0xc9, 0x60,\n  0x75, 0xb2, 0xb9, 0x7c, 0x63, 0x75, 0x2d, 0xb6, 0xc8, 0xfa, 0x19, 0x9d,\n  0x73, 0x8a, 0xfd, 0x1c, 0x99, 0x73, 0x8c, 0xa9, 0x07, 0x9b, 0x85, 0x25,\n  0x70, 0x77, 0x15, 0x39, 0xac, 0x1c, 0xd1, 0x0d, 0x70, 0xc6, 0x49, 0xa7,\n  0xcc, 0x92, 0x29, 0x13, 0x9a, 0xe5, 0xc1, 0x6a, 0x96, 0x23, 0x07, 0x8e,\n  0xe5, 0xab, 0x99, 0xa1, 0x70, 0xa4, 0xc7, 0x69, 0x76, 0x8b, 0x64, 0xbb,\n  0x42, 0x30, 0xd7, 0xb0, 0x14, 0x16, 0x90, 0x94, 0xbb, 0xb8, 0xc1, 0xbc,\n  0xa3, 0xab, 0x17, 0xc5, 0xe7, 0x2d, 0x04, 0x3f, 0xbf, 0x30, 0x5f, 0x8d,\n  0x54, 0x95, 0xc1, 0x60, 0xa4, 0xb5, 0x37, 0xd9, 0x94, 0xdd, 0x72, 0x26,\n  0x74, 0xdc, 0x73, 0xb0, 0x3b, 0x7f, 0x6d, 0x8b, 0x5f, 0x57, 0x96, 0x84,\n  0xf6, 0x91, 0x75, 0xd4, 0x3e, 0x5e, 0xd2, 0xe4, 0xf7, 0xc7, 0x1b, 0x7a,\n  0x93, 0xcd, 0x43, 0xa1, 0xf7, 0x6e, 0x2d, 0x1b, 0xa8, 0xe8, 0x19, 0x5d,\n  0x5e, 0xa8, 0xb2, 0x38, 0x2a, 0xe7, 0x2b, 0x09, 0x91, 0xb7, 0x51, 0x99,\n  0x12, 0x4f, 0x47, 0x44, 0x48, 0x86, 0xca, 0x40, 0x15, 0x6c, 0xe8, 0x0f,\n  0x05, 0x2a, 0x24, 0x2d, 0x94, 0x3c, 0x2c, 0x09, 0xfb, 0xa0, 0xdf, 0xec,\n  0x28, 0x05, 0x14, 0x58, 0xe5, 0x88, 0x5f, 0x68, 0x10, 0x44, 0x2c, 0x7a,\n  0xea, 0x18, 0xac, 0xfc, 0xda, 0x1d, 0xb7, 0x0e, 0x77, 0x7f, 0x75, 0xdf,\n  0x93, 0x8f, 0x5c, 0xfb, 0xf8, 0xf6, 0xe9, 0x43, 0xf8, 0xe2, 0xbe, 0x7d,\n  0x03, 0xb3, 0xce, 0xec, 0xe7, 0x51, 0x6c, 0xe8, 0xb6, 0xc1, 0x66, 0xe9,\n  0xb3, 0x9a, 0xc8, 0x67, 0x41, 0x5c, 0x57, 0x00, 0xb0, 0x6f, 0x32, 0x42,\n  0x7e, 0x21, 0x61, 0x15, 0x50, 0xbc, 0x38, 0x68, 0x0d, 0xc5, 0xa1, 0xf9,\n  0xbc, 0xb6, 0xdb, 0xd0, 0xb9, 0x48, 0x6a, 0x9a, 0x41, 0xa4, 0x56, 0x24,\n  0x1c, 0x33, 0x9b, 0x60, 0xbb, 0xf3, 0x07, 0x89, 0x4d, 0x53, 0xb0, 0x19,\n  0x9e, 0xdd, 0x2f, 0xed, 0x14, 0xd8, 0x3a, 0x99, 0xbd, 0xe1, 0x43, 0x15,\n  0x3d, 0xb1, 0x96, 0xc6, 0x48, 0x26, 0x5c, 0x5b, 0x31, 0xd7, 0xb1, 0xed,\n  0x40, 0x5f, 0xff, 0x9b, 0x10, 0x9e, 0xdc, 0xbd, 0xfb, 0x8e, 0xe4, 0x85,\n  0x68, 0x57, 0x67, 0xb4, 0x2c, 0xe1, 0x2d, 0x6d, 0x89, 0xc4, 0xc7, 0x46,\n  0x37, 0x2c, 0xb4, 0x9f, 0x62, 0xef, 0xbd, 0x77, 0x88, 0xc6, 0x29, 0xfd,\n  0x17, 0x9e, 0xc2, 0xdf, 0x21, 0x5a, 0xe1, 0x94, 0xd4, 0x4a, 0x50, 0x63,\n  0x33, 0x1b, 0x04, 0x68, 0x0a, 0x8e, 0x80, 0xa7, 0xe5, 0x3f, 0xc8, 0x9e,\n  0x2c, 0x77, 0x1a, 0x34, 0x70, 0x10, 0x57, 0x92, 0xd7, 0x73, 0xc2, 0x21,\n  0x17, 0xfb, 0x97, 0xdd, 0xf9, 0x07, 0x65, 0x27, 0xc1, 0xf4, 0x3f, 0x58,\n  0x2c, 0x66, 0x97, 0x09, 0xc0, 0x86, 0x12, 0xac, 0x53, 0x69, 0x29, 0xc1,\n  0x42, 0x10, 0x0e, 0xf8, 0xfd, 0x50, 0xa6, 0xe9, 0x7e, 0x9d, 0xc9, 0x21,\n  0x8a, 0x0e, 0xd3, 0xbb, 0x66, 0x97, 0x66, 0x1a, 0x1b, 0x1b, 0x26, 0x3e,\n  0xb4, 0xe3, 0x3a, 0xfc, 0x9d, 0xec, 0x88, 0xbf, 0x62, 0x38, 0x18, 0x1c,\n  0xa9, 0x44, 0x5f, 0x5d, 0x6c, 0x78, 0xe4, 0xb1, 0x97, 0xd1, 0x8f, 0xb3,\n  0x1f, 0x00, 0x18, 0x1a, 0x89, 0x5e, 0x78, 0x27, 0xc1, 0x57, 0x05, 0xe8,\n  0x4b, 0x91, 0x12, 0x8b, 0x9e, 0x58, 0xf8, 0x44, 0x27, 0xc4, 0x3c, 0x75,\n  0x6c, 0xf3, 0xe4, 0xaf, 0x9c, 0x05, 0xb0, 0xac, 0x0b, 0xba, 0x8a, 0xcc,\n  0x9e, 0x50, 0x40, 0x58, 0xa3, 0x05, 0xae, 0xd7, 0xec, 0x82, 0xf6, 0x4e,\n  0xc0, 0x5f, 0x2e, 0xbd, 0x6e, 0x36, 0x15, 0x07, 0x55, 0xb0, 0xc3, 0x6e,\n  0x39, 0xcb, 0xeb, 0x34, 0x2c, 0x67, 0x12, 0xcf, 0xed, 0xf8, 0xec, 0xcc,\n  0x31, 0x9d, 0x5d, 0xe0, 0x8b, 0x0c, 0x27, 0x67, 0x4e, 0x6b, 0xad, 0x3c,\n  0xd6, 0xea, 0xf8, 0x6b, 0x67, 0xb4, 0xa7, 0x8e, 0x80, 0x36, 0xd8, 0x90,\n  0x6e, 0x44, 0x2f, 0xd8, 0xea, 0x6a, 0x8c, 0xce, 0x8c, 0x3b, 0xeb, 0x24,\n  0x2a, 0xcf, 0x58, 0xcd, 0x8e, 0x48, 0x70, 0xa1, 0x1e, 0xbd, 0x2f, 0x9b,\n  0x0c, 0x6d, 0xf1, 0x59, 0xea, 0x1b, 0xac, 0xe8, 0x9f, 0xa9, 0x5c, 0x55,\n  0x91, 0x6f, 0x31, 0xb2, 0x0e, 0x1b, 0xd1, 0x70, 0x6f, 0x92, 0x0c, 0xbc,\n  0x38, 0xa5, 0x03, 0xf0, 0x85, 0xd1, 0x20, 0x16, 0x62, 0x0e, 0xd3, 0xde,\n  0xc6, 0xb4, 0x7b, 0x1a, 0x33, 0xab, 0x91, 0x1a, 0x5d, 0xc8, 0xd0, 0x8e,\n  0x2e, 0x8f, 0x85, 0x1b, 0x6a, 0x15, 0xa3, 0x5e, 0xfd, 0x90, 0xbc, 0x81,\n  0xf8, 0xe4, 0x0e, 0x27, 0x25, 0x8e, 0x92, 0x9c, 0xb7, 0x06, 0x8e, 0x63,\n  0x68, 0xa7, 0x13, 0x5d, 0x6e, 0x13, 0xc9, 0xb5, 0xe8, 0x96, 0xb4, 0x28,\n  0xb9, 0x0b, 0x7b, 0xd0, 0x8c, 0xe2, 0x67, 0x6e, 0xbe, 0xe3, 0x0d, 0x3b,\n  0x67, 0xa6, 0xa7, 0x89, 0xf2, 0x31, 0xba, 0x7d, 0xcf, 0xe6, 0xad, 0xb3,\n  0x38, 0xb6, 0xb0, 0x67, 0xcf, 0xc9, 0x5b, 0xf1, 0xd6, 0x8e, 0xaa, 0xaa,\n  0x8e, 0x44, 0xf6, 0x3d, 0x1b, 0xc6, 0x7b, 0x3a, 0xb2, 0xbf, 0x59, 0xb5,\n  0xa6, 0xb6, 0x74, 0x33, 0xb1, 0xca, 0xc8, 0x5e, 0xa5, 0x9e, 0x67, 0x54,\n  0x1a, 0xe8, 0xbe, 0x2a, 0xce, 0x83, 0xc3, 0x0a, 0xd1, 0x86, 0x0e, 0x79,\n  0x33, 0x64, 0x98, 0x92, 0x62, 0xa7, 0x9d, 0x3c, 0x63, 0xf5, 0x2b, 0xed,\n  0xd6, 0x4a, 0xca, 0x53, 0xf2, 0x96, 0x4c, 0x1b, 0xae, 0xd9, 0xe5, 0x90,\n  0xd9, 0xa8, 0xe2, 0x84, 0xff, 0xc7, 0xc3, 0x87, 0x61, 0x3e, 0x47, 0xe8,\n  0xcc, 0xa4, 0x39, 0x7d, 0x32, 0xd5, 0x91, 0x4e, 0x77, 0xe0, 0x81, 0x23,\n  0x07, 0x76, 0xef, 0x3d, 0xd1, 0xd7, 0x36, 0xd1, 0xdd, 0x09, 0xbc, 0xbd,\n  0x64, 0xc2, 0x5b, 0xa9, 0x5e, 0x1b, 0x4a, 0xfb, 0x1d, 0x46, 0xad, 0x06,\n  0x6c, 0x3f, 0x68, 0x1b, 0xb7, 0xec, 0x9c, 0xa6, 0xe4, 0x51, 0x6c, 0xb7,\n  0x80, 0x16, 0xe7, 0x74, 0x92, 0x4f, 0x4c, 0x99, 0xa3, 0x04, 0x04, 0x22,\n  0x74, 0xde, 0x91, 0x4d, 0x83, 0x7f, 0x1e, 0x7d, 0x65, 0x94, 0xfc, 0x2f,\n  0x70, 0x9c, 0x3e, 0xe2, 0x7c, 0x71, 0x6f, 0xf6, 0x86, 0x47, 0x1d, 0xc9,\n  0xa4, 0x83, 0x0d, 0xc1, 0xf7, 0xec, 0x87, 0x6a, 0xe7, 0x7c, 0xa8, 0x74,\n  0x63, 0x39, 0x7a, 0x6a, 0xb1, 0x9c, 0xf2, 0x78, 0xc5, 0xd2, 0xcb, 0xd4,\n  0x97, 0x1c, 0x63, 0xd2, 0xe9, 0xb6, 0x00, 0xb1, 0xab, 0x08, 0x83, 0xb0,\n  0x70, 0x76, 0xad, 0xa3, 0x46, 0x4b, 0x10, 0x22, 0xdd, 0xf2, 0x04, 0x8c,\n  0xe2, 0x22, 0x5e, 0xf6, 0xf4, 0x84, 0x43, 0xfe, 0x50, 0x28, 0x4e, 0xfd,\n  0xc3, 0xb9, 0xce, 0x95, 0x39, 0x92, 0x2d, 0xdc, 0xe2, 0x12, 0xfd, 0x72,\n  0xa4, 0x6f, 0x6c, 0xd3, 0x9d, 0xd7, 0x5c, 0x3f, 0x5a, 0xb6, 0xb7, 0x7c,\n  0x62, 0x6e, 0xdf, 0xdc, 0xa6, 0xc9, 0x3d, 0x93, 0x99, 0xd6, 0xc4, 0xa6,\n  0xb2, 0x50, 0xf5, 0xb1, 0xee, 0xd9, 0x6b, 0x70, 0xb0, 0x77, 0x8b, 0x81,\n  0x35, 0x4c, 0xf5, 0xed, 0x3d, 0x1c, 0x1f, 0x77, 0xb8, 0x7a, 0x7a, 0x3b,\n  0xd2, 0x99, 0xce, 0xb6, 0x86, 0xe6, 0xd2, 0xd2, 0x74, 0x38, 0xba, 0x43,\n  0xda, 0xe7, 0x79, 0x32, 0xef, 0xdf, 0x92, 0x79, 0x7b, 0x20, 0xdb, 0x2e,\n  0xdd, 0x62, 0x23, 0x72, 0xc9, 0x4a, 0xad, 0x42, 0x95, 0x40, 0x6e, 0x82,\n  0x4f, 0x1c, 0x2f, 0x28, 0x71, 0x62, 0xd4, 0x8f, 0xa6, 0x48, 0x77, 0x6f,\n  0x49, 0x28, 0x50, 0x12, 0xf5, 0x46, 0xad, 0xe1, 0x60, 0x28, 0x68, 0x52,\n  0x43, 0x9f, 0xa7, 0xc4, 0x72, 0x98, 0x73, 0x70, 0x65, 0x6f, 0xdc, 0x64,\n  0x30, 0xac, 0xcc, 0xdd, 0x6e, 0x2f, 0xba, 0x67, 0xf3, 0x58, 0xff, 0xe6,\n  0x6d, 0x9b, 0x9a, 0xb7, 0x4e, 0x5a, 0x2b, 0x75, 0x26, 0xbf, 0xb9, 0xae,\n  0xea, 0x1e, 0xe4, 0xab, 0xa8, 0x0c, 0x97, 0x06, 0xe2, 0xe8, 0x3f, 0xeb,\n  0x07, 0xf7, 0x8c, 0xa4, 0x33, 0x13, 0x2f, 0xcd, 0xef, 0x10, 0xb9, 0x11,\n  0x8e, 0x6f, 0xec, 0xfa, 0xe5, 0x60, 0x45, 0xa4, 0x24, 0x56, 0x97, 0xaa,\n  0xa2, 0x70, 0xae, 0x27, 0x76, 0x95, 0x97, 0xea, 0x25, 0x64, 0xb6, 0x6a,\n  0x02, 0x3e, 0x0d, 0xd4, 0xa7, 0x87, 0x93, 0x2d, 0x22, 0x0a, 0xf0, 0x02,\n  0x74, 0x4b, 0x59, 0x96, 0xa4, 0x8a, 0xde, 0x8b, 0x18, 0xe8, 0x5b, 0x6f,\n  0xb7, 0x2a, 0x1a, 0x00, 0xed, 0x7d, 0x93, 0xef, 0xdf, 0x93, 0xc2, 0xb2,\n  0x95, 0x6d, 0x15, 0x1a, 0xa7, 0xc0, 0xc6, 0x1f, 0x1a, 0x1a, 0xea, 0xee,\n  0x2a, 0xad, 0xb5, 0xd9, 0x9b, 0xe3, 0x3b, 0x8f, 0x34, 0x1d, 0x1c, 0x1c,\n  0x3c, 0xde, 0xf1, 0x91, 0xa7, 0xce, 0xdd, 0x9c, 0xc1, 0xb7, 0xcf, 0x0c,\n  0xf5, 0x65, 0x8c, 0xda, 0x7e, 0xbd, 0xf1, 0xaa, 0xf9, 0xfe, 0x23, 0x6d,\n  0xdd, 0x77, 0x2c, 0x7c, 0xf7, 0xdb, 0x43, 0xef, 0xf9, 0xf8, 0x89, 0x33,\n  0x12, 0x4c, 0x75, 0x64, 0x8e, 0x5f, 0x27, 0x7b, 0xa7, 0x99, 0x58, 0x37,\n  0xe3, 0xd2, 0x71, 0x7d, 0x11, 0xe8, 0x31, 0xcc, 0x2c, 0x4f, 0x75, 0x3c,\n  0x30, 0x6a, 0x94, 0x93, 0x01, 0x22, 0x40, 0x79, 0xd8, 0x02, 0x68, 0x5b,\n  0xc0, 0xfc, 0x1b, 0xd3, 0x69, 0x3b, 0x78, 0x9b, 0x5d, 0x4e, 0x8b, 0xd7,\n  0xea, 0x35, 0x19, 0xd5, 0x22, 0xf8, 0x99, 0xa5, 0xa6, 0x3d, 0x2b, 0x0e,\n  0x72, 0x52, 0xc1, 0x24, 0xca, 0xc1, 0xd6, 0xe6, 0x70, 0xa0, 0xdb, 0x0f,\n  0xdd, 0xdb, 0x3f, 0x70, 0xdf, 0x91, 0xc3, 0xf7, 0x0d, 0xb4, 0xb6, 0x3d,\n  0x8e, 0xae, 0xbb, 0xee, 0xc8, 0xc9, 0x93, 0xd7, 0x1e, 0xaf, 0x9d, 0xc7,\n  0xdf, 0xdd, 0xfe, 0xbe, 0x23, 0x87, 0x1f, 0xdb, 0xbe, 0xfd, 0xb1, 0x23,\n  0xdb, 0xde, 0x5c, 0x3d, 0xb2, 0x78, 0xec, 0xed, 0xe7, 0xde, 0xf8, 0x96,\n  0x47, 0xde, 0xb0, 0xe5, 0x6c, 0x3f, 0x85, 0xeb, 0xb6, 0xa5, 0x5a, 0xf4,\n  0x65, 0x02, 0x57, 0x3b, 0x73, 0xad, 0xac, 0xdb, 0x41, 0x1f, 0x22, 0x0b,\n  0x92, 0x9a, 0x10, 0x91, 0x3f, 0x78, 0xf9, 0x0f, 0xf9, 0x24, 0xce, 0x2d,\n  0xb5, 0x17, 0x27, 0x9a, 0x0c, 0x34, 0x92, 0xa7, 0x74, 0xcc, 0xd3, 0x66,\n  0x4c, 0x88, 0xf6, 0x08, 0x5b, 0x71, 0x93, 0x32, 0x7d, 0xae, 0x27, 0x11,\n  0x92, 0x82, 0x91, 0x15, 0x91, 0x24, 0x72, 0x8c, 0x1d, 0xd9, 0xe5, 0x6e,\n  0x44, 0xf2, 0xc9, 0x08, 0xb5, 0x7c, 0x82, 0x52, 0x88, 0x21, 0x7a, 0x43,\n  0xd8, 0xab, 0xd7, 0x87, 0x4d, 0x33, 0xfb, 0x7f, 0xf7, 0xbb, 0xe9, 0x6e,\n  0x13, 0xef, 0x9e, 0xc7, 0x2f, 0xf0, 0xe3, 0x18, 0xef, 0x3d, 0xb8, 0x6f,\n  0x30, 0x5b, 0xcd, 0x5e, 0xd8, 0x57, 0xbb, 0x01, 0x60, 0xde, 0x44, 0x60,\n  0xee, 0xc6, 0x5f, 0x63, 0x7c, 0x64, 0x87, 0xa8, 0x4a, 0x97, 0x47, 0x8c,\n  0xb0, 0xc7, 0x66, 0xc0, 0xc3, 0x22, 0x77, 0xbd, 0xe2, 0x91, 0xdc, 0xb0,\n  0x8c, 0xf0, 0x9a, 0xbf, 0xb4, 0xb4, 0xc2, 0x5f, 0xe1, 0x37, 0x97, 0x44,\n  0xa0, 0x1d, 0x15, 0xa2, 0x87, 0x30, 0x8a, 0x16, 0x92, 0x52, 0xa0, 0xea,\n  0x97, 0xdc, 0xe7, 0x0e, 0x56, 0x0a, 0x0b, 0xa7, 0x47, 0x6a, 0x68, 0xb6,\n  0x65, 0x53, 0xc5, 0x2d, 0x27, 0x7b, 0x0f, 0xb5, 0xb5, 0x6c, 0xab, 0x4b,\n  0x95, 0x3b, 0xac, 0x67, 0xd1, 0x93, 0xef, 0xdc, 0x65, 0x2c, 0x57, 0xf7,\n  0x0d, 0xb7, 0xb7, 0x57, 0x8c, 0xd7, 0x6d, 0x42, 0x3f, 0x2a, 0xed, 0x9d,\n  0x6a, 0x3b, 0x7c, 0x53, 0xfd, 0x5c, 0x4f, 0xdf, 0xb6, 0xa4, 0x2e, 0x98,\n  0x8a, 0xb9, 0x42, 0xfa, 0xc1, 0xc1, 0x56, 0xbb, 0xd7, 0x97, 0xcd, 0x6c,\n  0xca, 0x6c, 0xc8, 0x84, 0xb5, 0x65, 0x83, 0x2d, 0xbd, 0x63, 0xd4, 0xde,\n  0x69, 0x5a, 0x5a, 0x22, 0x73, 0x86, 0xf3, 0xa9, 0x7f, 0xc7, 0x1b, 0x57,\n  0x9f, 0x4f, 0x91, 0xfb, 0x2e, 0x82, 0x98, 0x0f, 0xd1, 0xf3, 0xc1, 0x6a,\n  0xac, 0x53, 0xee, 0xa3, 0xe5, 0xf3, 0xab, 0x6d, 0x4b, 0x2d, 0xac, 0x86,\n  0xe0, 0xcc, 0xcb, 0xec, 0x48, 0x6b, 0x9d, 0xa0, 0x4c, 0x0a, 0xb4, 0x09,\n  0x82, 0xe2, 0x3b, 0x23, 0x4a, 0xdb, 0xf9, 0x5c, 0xa4, 0xf8, 0x72, 0x4b,\n  0x5e, 0x4a, 0x75, 0x3e, 0xe9, 0x2e, 0xbd, 0x2e, 0xc7, 0x8a, 0x1f, 0xcb,\n  0x1f, 0x31, 0x9d, 0x56, 0x87, 0xcc, 0x56, 0x22, 0x94, 0x40, 0x22, 0x85,\n  0x6d, 0x12, 0x9f, 0xd0, 0x5e, 0x88, 0xf5, 0xca, 0x41, 0xa8, 0x12, 0x01,\n  0x6a, 0xc7, 0xd7, 0x0e, 0xdb, 0xfc, 0x26, 0x7f, 0x32, 0x33, 0x38, 0x3a,\n  0xb6, 0xb0, 0x73, 0xa6, 0xc7, 0x20, 0x94, 0x1c, 0x1e, 0xbe, 0xfa, 0xd4,\n  0x3b, 0xb7, 0x8b, 0xc2, 0xa0, 0x71, 0xeb, 0x30, 0xaa, 0xdf, 0x31, 0x73,\n  0xdd, 0x81, 0xc5, 0x07, 0xd9, 0x7b, 0x76, 0xd4, 0x35, 0xdc, 0x7c, 0x8e,\n  0x59, 0x41, 0x6f, 0x66, 0x66, 0x4f, 0x1e, 0xbd, 0x19, 0x96, 0xe9, 0x8d,\n  0x95, 0xff, 0x90, 0xe9, 0xcd, 0xc2, 0xd0, 0x36, 0x14, 0x40, 0x45, 0x84,\n  0xa8, 0x64, 0x3a, 0x73, 0x48, 0x17, 0x73, 0x3e, 0x73, 0x4e, 0xa1, 0x2f,\n  0x23, 0x62, 0x64, 0xda, 0x22, 0x4c, 0xc3, 0xaf, 0xa0, 0xad, 0xb5, 0x74,\n  0xb5, 0x92, 0xaa, 0x16, 0x6f, 0x91, 0x69, 0x0a, 0xd1, 0xda, 0xa2, 0x13,\n  0x64, 0x1f, 0x71, 0x81, 0x17, 0x0f, 0x66, 0x63, 0x84, 0xc6, 0x1d, 0xa0,\n  0x6c, 0x28, 0xad, 0x34, 0x72, 0x47, 0x80, 0xc7, 0x59, 0x39, 0xa8, 0x22,\n  0x4c, 0x0c, 0x4d, 0x20, 0x2a, 0x2b, 0xa5, 0x1f, 0x61, 0xa5, 0x8c, 0x91,\n  0xba, 0x21, 0xe2, 0xe2, 0x7b, 0x66, 0xce, 0x0d, 0xdc, 0x70, 0x4d, 0xc5,\n  0x64, 0x79, 0x6c, 0x26, 0x35, 0x7f, 0xef, 0xd0, 0xc2, 0x08, 0xbe, 0x71,\n  0x64, 0x64, 0xf8, 0xfc, 0xd4, 0x2d, 0x77, 0x1b, 0x0d, 0xc3, 0x46, 0xe3,\n  0xe4, 0xc3, 0xf3, 0xc7, 0xde, 0x1a, 0x5b, 0xf6, 0xd1, 0x9c, 0xa1, 0xfe,\n  0x08, 0x5f, 0xda, 0x23, 0xa7, 0x28, 0xef, 0x07, 0x61, 0x22, 0xb9, 0x80,\n  0xa9, 0x96, 0x68, 0xa6, 0x6a, 0x96, 0x5f, 0x8a, 0x83, 0x81, 0xf0, 0xa4,\n  0x33, 0x33, 0xd9, 0x66, 0x38, 0x6a, 0x41, 0x23, 0xe8, 0x46, 0x1a, 0x70,\n  0x04, 0xe7, 0x3c, 0x29, 0xfc, 0x3d, 0xba, 0x27, 0x46, 0xd2, 0x41, 0xb0,\n  0x3f, 0x11, 0xc4, 0xa8, 0x40, 0x90, 0x0d, 0x4b, 0x5f, 0x86, 0x90, 0xfc,\n  0x36, 0xa7, 0xd9, 0x61, 0x02, 0x9c, 0xfb, 0x83, 0x08, 0xa2, 0x79, 0x01,\n  0x5c, 0x28, 0x51, 0x85, 0xc1, 0x45, 0x9a, 0x30, 0x07, 0xf1, 0xe9, 0x89,\n  0xec, 0x59, 0x0e, 0x0b, 0x1b, 0xf7, 0xa3, 0x9b, 0x20, 0x8c, 0x74, 0x53,\n  0x7a, 0x0b, 0x1e, 0x0f, 0xee, 0x4f, 0x65, 0x8f, 0xe3, 0x8b, 0x8b, 0x1f,\n  0x33, 0xa5, 0x33, 0xa5, 0xe8, 0x81, 0xc5, 0x33, 0xf4, 0x4c, 0x01, 0x2d,\n  0x2d, 0x11, 0xf8, 0x4d, 0x13, 0x1c, 0xfb, 0xc0, 0x3f, 0xa1, 0x22, 0xf0,\n  0x53, 0x13, 0xea, 0x2c, 0x42, 0x3c, 0xe7, 0x42, 0x64, 0x43, 0x26, 0xcc,\n  0x09, 0xce, 0x2e, 0x6a, 0xbf, 0xe7, 0x9d, 0xd4, 0xf0, 0x3c, 0x8d, 0xe8,\n  0x3f, 0x2e, 0xc8, 0x81, 0x09, 0xe1, 0x80, 0xd9, 0x12, 0x0a, 0x52, 0xa7,\n  0x17, 0x2b, 0xf9, 0x27, 0x64, 0x4c, 0x8a, 0x44, 0x48, 0xac, 0x38, 0x0c,\n  0x44, 0x1b, 0x84, 0x8d, 0x0f, 0x2e, 0x1c, 0xdf, 0x14, 0xf2, 0x8f, 0xd7,\n  0x1c, 0x3c, 0xab, 0x7e, 0xee, 0x1b, 0xea, 0xeb, 0x8f, 0x57, 0x6f, 0x8a,\n  0xc5, 0x26, 0x5b, 0x1e, 0x7e, 0xaf, 0x06, 0xb5, 0x64, 0x76, 0x3f, 0xb4,\n  0xa9, 0x2c, 0x63, 0x2c, 0xba, 0xed, 0x54, 0xe6, 0xc4, 0xad, 0x26, 0xdd,\n  0x88, 0xd1, 0xf0, 0xd1, 0x87, 0x24, 0x18, 0x23, 0x32, 0xcf, 0x67, 0xa8,\n  0xdf, 0xa1, 0x3b, 0xdd, 0x51, 0x42, 0xe6, 0x17, 0x09, 0x87, 0xbc, 0x76,\n  0x2b, 0x51, 0x7c, 0x6d, 0xd4, 0xbe, 0x65, 0x90, 0x81, 0x90, 0x23, 0x9f,\n  0xc9, 0x75, 0x56, 0x97, 0x77, 0x96, 0x63, 0xf9, 0x87, 0xef, 0xe1, 0x28,\n  0xb1, 0x19, 0xc3, 0x00, 0x39, 0x6b, 0x0e, 0xeb, 0x44, 0x8f, 0x21, 0xd4,\n  0x20, 0x04, 0x4b, 0x21, 0x8e, 0x85, 0xba, 0x56, 0x94, 0xb9, 0x87, 0xed,\n  0x8f, 0x20, 0x74, 0xf6, 0x0d, 0xe5, 0xdd, 0x9e, 0x4f, 0x20, 0x63, 0xf2,\n  0x9a, 0xde, 0xec, 0xe3, 0xad, 0x5d, 0xc6, 0xad, 0x6f, 0x99, 0x6f, 0x3e,\n  0x58, 0x55, 0x1a, 0xdf, 0x56, 0xb3, 0xe7, 0x9c, 0x13, 0xdb, 0xd1, 0xed,\n  0x6a, 0xb3, 0xfa, 0xce, 0xb7, 0x6a, 0x35, 0x5f, 0x19, 0xc9, 0x3e, 0x65,\n  0x77, 0xa0, 0x33, 0xfa, 0x76, 0xc3, 0xe4, 0x99, 0x01, 0xa7, 0x7d, 0xc8,\n  0xe6, 0x98, 0x9f, 0x3e, 0xd6, 0x46, 0xe7, 0xce, 0xca, 0x7e, 0x34, 0x3b,\n  0xf8, 0xf0, 0xec, 0x16, 0x33, 0xc8, 0x54, 0xa2, 0xaf, 0x33, 0x5a, 0x2c,\n  0x45, 0x9a, 0x2e, 0xab, 0xea, 0x56, 0xbb, 0xdd, 0x4a, 0x9b, 0xda, 0x10,\n  0x5d, 0x47, 0x71, 0xe0, 0x85, 0xed, 0xa2, 0xec, 0x39, 0x64, 0x77, 0xc8,\n  0xee, 0xbb, 0x5f, 0xa2, 0xe2, 0x57, 0x88, 0x8a, 0xb4, 0x38, 0x30, 0x83,\n  0xac, 0xed, 0x76, 0xb4, 0x47, 0xf6, 0xde, 0x7d, 0x6d, 0xa0, 0x2d, 0x9d,\n  0x7d, 0x27, 0x75, 0x1f, 0xa2, 0x38, 0x74, 0x8f, 0x21, 0x9f, 0xfb, 0x47,\n  0x6a, 0x3f, 0xb9, 0x89, 0x5d, 0x53, 0x99, 0x2e, 0x0b, 0xf8, 0x9d, 0x90,\n  0x78, 0x20, 0x05, 0xfd, 0x80, 0xba, 0x65, 0x2e, 0x30, 0x03, 0xab, 0x85,\n  0xce, 0x80, 0x4c, 0x00, 0xbe, 0xcc, 0x10, 0xcf, 0x23, 0x7d, 0xbc, 0x98,\n  0xb2, 0xa7, 0x20, 0x7a, 0x9c, 0x92, 0x5a, 0x52, 0x64, 0x77, 0xec, 0xff,\n  0xa7, 0x8f, 0x6d, 0x9a, 0x99, 0x59, 0xf8, 0xee, 0xa3, 0x1b, 0x77, 0x7c,\n  0xec, 0xcc, 0x39, 0x42, 0x71, 0xe8, 0x7e, 0xa0, 0xb7, 0xbb, 0xd0, 0xa8,\n  0x09, 0x1d, 0xcc, 0x7e, 0xd5, 0x8b, 0xdc, 0xd9, 0x3f, 0x1b, 0xdb, 0x8d,\n  0xd9, 0xd3, 0x68, 0xb0, 0x38, 0xfb, 0x2d, 0xe4, 0x37, 0xdd, 0x1c, 0xb0,\n  0x7f, 0x33, 0xb8, 0x3f, 0xfb, 0x14, 0xd0, 0x60, 0x4b, 0x91, 0xd4, 0xe1,\n  0x86, 0xcc, 0x71, 0x81, 0xea, 0xa5, 0x6e, 0x42, 0x49, 0x1b, 0xd2, 0xad,\n  0xde, 0x12, 0x42, 0xd0, 0x64, 0x2f, 0x55, 0x89, 0x82, 0x96, 0xe7, 0xa0,\n  0x7f, 0xbd, 0xe4, 0x93, 0x07, 0xbf, 0x1c, 0x68, 0x65, 0xf2, 0x89, 0x2f,\n  0x96, 0x78, 0xc1, 0x53, 0x5c, 0xec, 0xf3, 0xf8, 0x2a, 0xc2, 0x84, 0xbf,\n  0x44, 0xca, 0x5f, 0x2c, 0x6c, 0x4a, 0x34, 0x1a, 0x09, 0xc2, 0xde, 0xed,\n  0x22, 0x31, 0x21, 0xa2, 0x61, 0x68, 0x52, 0x63, 0xad, 0x4b, 0xf1, 0x76,\n  0x3c, 0x3b, 0xff, 0xa1, 0xfb, 0x67, 0x76, 0xec, 0xf8, 0xd4, 0xa9, 0x33,\n  0xa6, 0xbe, 0x0e, 0xd4, 0xdf, 0xf5, 0xaf, 0x48, 0xa3, 0xdb, 0x3a, 0x38,\n  0xbd, 0xef, 0x5d, 0xea, 0xec, 0x1f, 0x51, 0x49, 0xf6, 0xdf, 0xd1, 0x13,\n  0xfa, 0x36, 0xc3, 0x8b, 0x23, 0x23, 0x9a, 0x76, 0x75, 0xf7, 0x2e, 0xfb,\n  0x97, 0x22, 0xf5, 0xf1, 0xec, 0x6f, 0x6e, 0x88, 0x4c, 0x4a, 0x34, 0xc8,\n  0x12, 0x1a, 0x2c, 0x25, 0xbc, 0x52, 0x0d, 0x71, 0x3b, 0x90, 0xc7, 0x5d,\n  0x5d, 0x15, 0x80, 0x58, 0x3c, 0xa2, 0x3e, 0x6a, 0x58, 0xe4, 0x97, 0xba,\n  0xc3, 0xc9, 0xda, 0xe2, 0xb1, 0xfc, 0x60, 0x96, 0x70, 0x65, 0x38, 0x2a,\n  0x01, 0x35, 0x67, 0x45, 0x3b, 0x73, 0x01, 0x06, 0x4e, 0x82, 0x60, 0x59,\n  0x93, 0x5c, 0x11, 0x4b, 0x10, 0x89, 0x8a, 0xec, 0xed, 0xd1, 0x58, 0xf3,\n  0x7c, 0x57, 0xcb, 0x5c, 0xcc, 0x13, 0xde, 0x52, 0xdd, 0xd5, 0xdd, 0xd0,\n  0x85, 0x4c, 0x1f, 0x49, 0x77, 0xdd, 0x71, 0x75, 0xeb, 0xbe, 0x40, 0xe8,\n  0x60, 0xd3, 0xd8, 0xb8, 0x77, 0xa0, 0x43, 0xab, 0x79, 0x11, 0xed, 0xf4,\n  0x7a, 0x86, 0x53, 0x4d, 0xe3, 0x15, 0x0e, 0xcb, 0xb0, 0xc9, 0xd1, 0x54,\n  0x5d, 0x93, 0x2a, 0x6e, 0x69, 0x8f, 0x78, 0xc7, 0xbb, 0x67, 0x0f, 0x58,\n  0x4c, 0x9b, 0x4d, 0xee, 0xf6, 0x64, 0xb0, 0x26, 0xee, 0xe4, 0xb8, 0x1a,\n  0xd9, 0xa7, 0xfb, 0x27, 0x2a, 0x2f, 0xb7, 0x49, 0x1e, 0x31, 0x3f, 0xd1,\n  0x03, 0x04, 0x96, 0x3b, 0x01, 0xe7, 0x34, 0x8c, 0x80, 0xa0, 0xe1, 0x2c,\n  0x3f, 0x0b, 0x39, 0x92, 0x39, 0x18, 0x17, 0xa7, 0x03, 0xd2, 0x18, 0xe1,\n  0xf4, 0xfa, 0x83, 0xa6, 0xd3, 0x5a, 0xb3, 0x39, 0x6c, 0x27, 0x76, 0x82,\n  0x6c, 0x0b, 0xd3, 0x03, 0xe6, 0xd5, 0x8e, 0x2f, 0x10, 0x7c, 0x7f, 0x82,\n  0x10, 0xcc, 0x68, 0xce, 0xdf, 0x75, 0x1a, 0x82, 0x31, 0x21, 0xec, 0xf2,\n  0x96, 0x78, 0xa9, 0xc9, 0xa3, 0xd2, 0x78, 0xcd, 0x2d, 0x9b, 0x40, 0x1e,\n  0x92, 0xbd, 0x35, 0x42, 0xe0, 0xed, 0xc0, 0x2f, 0x10, 0xba, 0x92, 0xe2,\n  0xb1, 0xda, 0x88, 0xcd, 0xf0, 0x06, 0x9a, 0x7b, 0x95, 0x60, 0x6e, 0x4c,\n  0x1b, 0x4b, 0x0c, 0x98, 0x87, 0xd0, 0x68, 0x9c, 0x9f, 0x7e, 0x55, 0xaa,\n  0x92, 0xcf, 0x6f, 0x16, 0x18, 0x25, 0xa9, 0xe2, 0xd8, 0x72, 0x26, 0x0a,\n  0x18, 0x14, 0xe9, 0xd0, 0xf2, 0x10, 0xd9, 0x1d, 0xa5, 0x68, 0xa3, 0x79,\n  0xc3, 0xa6, 0xd3, 0xae, 0x70, 0x08, 0x42, 0xe6, 0x43, 0x89, 0x70, 0xa2,\n  0xd4, 0x57, 0xec, 0xb2, 0x9a, 0xa5, 0x6c, 0x1d, 0xf5, 0xaa, 0x63, 0x4c,\n  0xe9, 0xe4, 0x32, 0xcf, 0x3f, 0x42, 0x5b, 0x53, 0xda, 0x04, 0xb6, 0xae,\n  0x1d, 0x27, 0xf3, 0x54, 0xbe, 0xa9, 0x0d, 0xd7, 0x36, 0xb6, 0xdc, 0xd8,\n  0xbe, 0x77, 0x9e, 0x45, 0x5c, 0xf1, 0xfe, 0x89, 0xd9, 0x1b, 0xdb, 0x7a,\n  0x6e, 0x9a, 0x1c, 0xd9, 0x5b, 0xc2, 0xeb, 0x46, 0xde, 0x78, 0xa1, 0x69,\n  0xa4, 0xca, 0xb6, 0x7f, 0x76, 0x6e, 0x4f, 0x7c, 0xcb, 0x1f, 0x6c, 0xce,\n  0xcd, 0x6e, 0xf7, 0x9e, 0x93, 0x06, 0x47, 0x9d, 0xb5, 0xaa, 0x6b, 0xea,\n  0xc2, 0xce, 0x23, 0x17, 0xc6, 0x5a, 0xaa, 0x77, 0x2e, 0x2e, 0xdc, 0xfb,\n  0x00, 0x3a, 0x10, 0xeb, 0xdc, 0x58, 0xd6, 0x78, 0xf5, 0xb5, 0x77, 0xdd,\n  0x34, 0x78, 0x75, 0x17, 0x83, 0x97, 0x5e, 0x25, 0x40, 0xe9, 0xa3, 0xfc,\n  0xed, 0x65, 0xae, 0x79, 0x4a, 0x87, 0x44, 0x0c, 0x67, 0x72, 0xa0, 0xca,\n  0x46, 0x34, 0x2a, 0x38, 0xb4, 0x45, 0x02, 0x84, 0x37, 0xd2, 0xad, 0x17,\n  0xfc, 0x74, 0x34, 0x16, 0x89, 0x3a, 0x32, 0x77, 0x32, 0x32, 0x66, 0x43,\n  0x04, 0xac, 0x22, 0x87, 0xc5, 0x85, 0xd5, 0x0f, 0xe4, 0x0f, 0x9b, 0x4e,\n  0x3b, 0x6d, 0x36, 0x86, 0xb1, 0x79, 0x6d, 0x25, 0x2e, 0xa7, 0xe4, 0xab,\n  0xb5, 0x84, 0x24, 0x5f, 0x2d, 0x60, 0x5c, 0xc9, 0x9d, 0x74, 0x26, 0xa5,\n  0xf3, 0x5c, 0x36, 0xb7, 0xea, 0x04, 0xee, 0xcb, 0xee, 0xa9, 0x6f, 0xdf,\n  0xd0, 0x99, 0x08, 0x15, 0xcd, 0xcc, 0xcf, 0xcf, 0x94, 0x94, 0xb8, 0x8b,\n  0x43, 0xde, 0xe1, 0x61, 0x94, 0xd8, 0x50, 0x95, 0x6c, 0xb4, 0x7f, 0x3b,\n  0xfb, 0xce, 0x86, 0x5f, 0x20, 0x8f, 0xb5, 0x2e, 0xe2, 0x75, 0xba, 0x4a,\n  0x24, 0xbf, 0x33, 0x20, 0x5a, 0x43, 0xf5, 0xa9, 0x2a, 0x90, 0x99, 0x2b,\n  0xf5, 0x29, 0x72, 0x5f, 0x4b, 0xee, 0x07, 0xe8, 0xfd, 0x14, 0xae, 0x58,\n  0xa3, 0x6f, 0xe1, 0xa5, 0x47, 0x97, 0x5a, 0x89, 0x20, 0x03, 0x79, 0xe2,\n  0x63, 0xb6, 0xa4, 0x6d, 0x16, 0x62, 0xd3, 0x15, 0x8b, 0x84, 0x31, 0x39,\n  0x30, 0x70, 0xd9, 0x0c, 0xd1, 0xe3, 0x07, 0x86, 0x9e, 0x28, 0xa5, 0xbd,\n  0xe7, 0x58, 0x46, 0x8e, 0xd1, 0xa0, 0x9a, 0x89, 0x62, 0x87, 0x14, 0xa7,\n  0xed, 0xb9, 0xf0, 0xb4, 0xe5, 0x11, 0xc4, 0x5a, 0xff, 0x87, 0x60, 0xd0,\n  0x12, 0x8a, 0xc3, 0x2e, 0x9e, 0xb2, 0x89, 0xc0, 0xbf, 0x51, 0x21, 0x97,\n  0x36, 0xea, 0x34, 0x27, 0x24, 0xf7, 0x1e, 0x6d, 0xa3, 0xfc, 0x65, 0x31,\n  0x56, 0xdc, 0x68, 0xb4, 0xd9, 0x3a, 0xab, 0x1b, 0x7b, 0x3a, 0x1a, 0xca,\n  0x22, 0x33, 0x3f, 0x75, 0x15, 0x97, 0xc4, 0x45, 0x7f, 0xc0, 0xe7, 0xd3,\n  0x86, 0x7c, 0xb5, 0x7d, 0xb6, 0x78, 0xc0, 0x1f, 0x69, 0xad, 0x4f, 0xb6,\n  0x5a, 0xf1, 0x67, 0x5e, 0xfb, 0x85, 0xc3, 0x13, 0x8f, 0xba, 0x4a, 0x61,\n  0x2f, 0xfe, 0x13, 0xa1, 0xef, 0x1b, 0xc9, 0x1e, 0x17, 0x62, 0xce, 0x4b,\n  0x61, 0xfe, 0xd6, 0x00, 0xa1, 0x54, 0xbf, 0xdb, 0x69, 0x54, 0x11, 0xbd,\n  0x9d, 0x87, 0x18, 0x63, 0x28, 0xab, 0x02, 0x57, 0xd1, 0xaa, 0xab, 0x72,\n  0x5e, 0x40, 0x11, 0x3d, 0x9b, 0x56, 0x3a, 0xae, 0x82, 0xde, 0x03, 0x0c,\n  0x20, 0xc7, 0x3e, 0xe5, 0xce, 0xae, 0x73, 0x0d, 0x57, 0x73, 0xb7, 0xa5,\n  0xde, 0xa3, 0x25, 0xae, 0x22, 0xab, 0x99, 0xd8, 0x5f, 0x02, 0x13, 0x42,\n  0x21, 0x51, 0xea, 0x59, 0xe9, 0x70, 0x3a, 0x21, 0x15, 0x0d, 0x8e, 0x60,\n  0x25, 0xe5, 0x32, 0x12, 0x8d, 0xb2, 0x41, 0xc4, 0x46, 0x94, 0x98, 0xb5,\n  0x3d, 0xc1, 0xb2, 0x12, 0xe3, 0xc2, 0x53, 0x3b, 0x7f, 0x7f, 0x97, 0xd9,\n  0xe5, 0xb2, 0x58, 0x8a, 0x7d, 0xf1, 0x58, 0x4d, 0xa8, 0x68, 0xdf, 0x2f,\n  0x77, 0x22, 0xef, 0xf5, 0x66, 0xb7, 0x5b, 0xed, 0x32, 0x19, 0x4b, 0xf1,\n  0x77, 0x9d, 0x35, 0xd1, 0xd7, 0xd0, 0x6c, 0x36, 0x9d, 0x7d, 0x22, 0x56,\n  0x66, 0x12, 0x3a, 0x75, 0x81, 0x81, 0xe6, 0x57, 0xb3, 0x73, 0x28, 0x8b,\n  0x22, 0x65, 0x55, 0x9c, 0xd0, 0x25, 0xa8, 0x01, 0xd2, 0x3b, 0xc8, 0xfa,\n  0x07, 0xe5, 0x1c, 0xae, 0x20, 0xd3, 0x92, 0x6e, 0x14, 0xa5, 0xec, 0x21,\n  0x16, 0xe2, 0x64, 0x59, 0x21, 0xdf, 0xe9, 0xc7, 0xf3, 0xd2, 0x31, 0x0f,\n  0xac, 0xe2, 0x28, 0x1e, 0x29, 0x2e, 0x2e, 0x0e, 0x16, 0x07, 0x02, 0x84,\n  0x28, 0xcb, 0x4b, 0x69, 0x3b, 0x63, 0xd9, 0xf3, 0x26, 0x9b, 0xe8, 0x41,\n  0x7b, 0xd0, 0xaa, 0x58, 0xe8, 0xb9, 0x84, 0xae, 0x1d, 0xdf, 0xb9, 0xe3,\n  0xe6, 0xc1, 0xf4, 0xe0, 0xf8, 0x5d, 0x57, 0xdd, 0x37, 0x33, 0x73, 0x76,\n  0x73, 0x66, 0xcb, 0xe6, 0x53, 0x6f, 0xda, 0x3c, 0xb1, 0x79, 0x2b, 0xbe,\n  0xb8, 0x75, 0x3a, 0x3d, 0xae, 0xe5, 0x74, 0xa3, 0xc3, 0xf3, 0xf3, 0x7f,\n  0xc0, 0xb7, 0xb7, 0xb6, 0xb4, 0x34, 0x66, 0xbf, 0x99, 0x7d, 0xa5, 0xaf,\n  0xab, 0xad, 0x63, 0xf9, 0x6c, 0xe4, 0x59, 0x90, 0x4b, 0x6a, 0xa3, 0x9c,\n  0x3f, 0x69, 0x82, 0x33, 0x24, 0x1c, 0x61, 0xa0, 0x7f, 0xbb, 0xa8, 0xfd,\n  0x3c, 0x4a, 0x29, 0xd7, 0x69, 0x5e, 0x65, 0x84, 0xa9, 0x95, 0xaf, 0xdf,\n  0x2a, 0xd1, 0xf8, 0x52, 0x08, 0xdf, 0x8c, 0xbf, 0x81, 0xe5, 0x58, 0x04,\n  0x34, 0xc6, 0xfc, 0x93, 0x3c, 0x3e, 0x84, 0xfe, 0x40, 0xc7, 0xc7, 0xe4,\n  0xeb, 0x1f, 0xa3, 0xd7, 0x63, 0xe4, 0x7a, 0x19, 0xbd, 0x5e, 0xc1, 0x40,\n  0x7b, 0xfa, 0xb1, 0x6a, 0x69, 0x1e, 0x33, 0xe4, 0x3d, 0xa7, 0xe9, 0xf5,\n  0x46, 0x79, 0xfc, 0x1f, 0x15, 0x7d, 0x94, 0xf9, 0x47, 0xa5, 0xa7, 0x1c,\n  0x4d, 0xb2, 0xc2, 0xb9, 0xf0, 0x69, 0xda, 0x53, 0x4e, 0x74, 0xd2, 0x2e,\n  0x9f, 0xbb, 0x66, 0xe4, 0x98, 0x54, 0xfa, 0xd9, 0x7f, 0xa1, 0x3d, 0xdb,\n  0x23, 0x70, 0xc4, 0xc1, 0x88, 0x2a, 0x1b, 0x2a, 0x91, 0x3e, 0x83, 0xbc,\n  0x30, 0xc8, 0x3e, 0x81, 0xe9, 0x75, 0x24, 0x6a, 0xdf, 0x89, 0xde, 0xc9,\n  0x7c, 0x5c, 0x3a, 0x25, 0xfd, 0x38, 0x65, 0x39, 0xa2, 0x41, 0xfe, 0x89,\n  0xdc, 0x29, 0x63, 0x1f, 0xca, 0x8d, 0x79, 0x2f, 0x73, 0xf7, 0x9a, 0x31,\n  0xbf, 0x20, 0x77, 0x1a, 0xf3, 0xde, 0xf3, 0x1e, 0xe6, 0x9e, 0xcb, 0x8e,\n  0x79, 0x37, 0x73, 0xd7, 0x9a, 0x31, 0x1f, 0x25, 0x77, 0x1c, 0x79, 0x63,\n  0x1e, 0x47, 0x4f, 0x49, 0x63, 0x70, 0x6e, 0x0c, 0xb0, 0x2d, 0xf2, 0xb0,\n  0x6f, 0xca, 0x8d, 0x79, 0x3b, 0x73, 0xef, 0xca, 0x31, 0x0c, 0x07, 0x58,\n  0x40, 0x3e, 0xce, 0xc5, 0x68, 0x88, 0xb6, 0x1d, 0x20, 0x5a, 0xe5, 0x68,\n  0x9a, 0x68, 0x19, 0xb4, 0x2c, 0x03, 0x2d, 0xac, 0xa0, 0xa2, 0xb9, 0xe9,\n  0x3c, 0x62, 0x35, 0x9c, 0x9a, 0xc5, 0x02, 0x8b, 0x0f, 0x90, 0x6d, 0x22,\n  0x32, 0xac, 0x45, 0xa2, 0x18, 0x15, 0x47, 0x82, 0xc1, 0x22, 0xa7, 0x8e,\n  0x48, 0xa2, 0x60, 0x24, 0x08, 0x6a, 0xa8, 0xc7, 0x19, 0x28, 0x0a, 0x58,\n  0x4c, 0x5a, 0x87, 0xce, 0x01, 0x1d, 0xf7, 0x6c, 0x3a, 0x31, 0x57, 0xa2,\n  0xc2, 0x80, 0xc5, 0x75, 0x93, 0x9a, 0x09, 0x06, 0x36, 0x3b, 0x9b, 0x4c,\n  0x0b, 0xda, 0xba, 0x66, 0xe7, 0x6e, 0x39, 0x6d, 0xfc, 0x03, 0xf0, 0xd3,\n  0x56, 0x5c, 0xfc, 0xf6, 0x19, 0xf6, 0x76, 0x9d, 0xa7, 0x2f, 0xa0, 0xb1,\n  0xd4, 0xd5, 0x5a, 0x6e, 0x72, 0xba, 0xdd, 0x45, 0x45, 0x6e, 0x48, 0x4d,\n  0x96, 0x7e, 0xbe, 0xf6, 0x17, 0x09, 0x71, 0x64, 0x15, 0xdb, 0xc8, 0x6a,\n  0xbe, 0xc8, 0x3e, 0x90, 0x5b, 0xeb, 0x23, 0x6b, 0xe1, 0x4a, 0xe8, 0x64,\n  0x8c, 0xf9, 0x02, 0xd0, 0x89, 0x84, 0x5b, 0xed, 0x67, 0xd1, 0xa7, 0x28,\n  0x2c, 0xff, 0x0f, 0xf9, 0xeb, 0x0b, 0x79, 0xb0, 0x7c, 0x07, 0xfa, 0xc5,\n  0xca, 0x67, 0xc9, 0xe6, 0xd0, 0x47, 0xbe, 0xbf, 0xc6, 0xfe, 0x90, 0xc8,\n  0xd3, 0x22, 0x88, 0x48, 0x30, 0x91, 0xed, 0xd6, 0x28, 0x60, 0x1a, 0x7e,\n  0xc6, 0xd0, 0x5a, 0x00, 0xcb, 0x65, 0xc9, 0x20, 0x7c, 0x9e, 0x97, 0xb2,\n  0x36, 0xec, 0x76, 0x7b, 0x91, 0xbd, 0xc8, 0x1a, 0x8a, 0x10, 0x1e, 0xa4,\n  0x8d, 0x29, 0x45, 0x31, 0x18, 0x6d, 0x58, 0x8e, 0x74, 0x25, 0x10, 0x80,\n  0xe5, 0xbf, 0x56, 0x15, 0xe4, 0x1b, 0xc4, 0x50, 0x79, 0xd8, 0xa3, 0x2f,\n  0x56, 0x59, 0xc2, 0xad, 0x9d, 0x6f, 0x9b, 0x61, 0x6f, 0x89, 0xc4, 0x55,\n  0xc9, 0x49, 0xc1, 0xe9, 0x2c, 0x32, 0x61, 0x5c, 0x2f, 0x54, 0xbc, 0x36,\n  0xa1, 0xac, 0x75, 0x0d, 0x9d, 0x7d, 0xb8, 0x00, 0x0d, 0xbd, 0x4a, 0xe9,\n  0x75, 0x4b, 0x6e, 0xcc, 0x63, 0x6b, 0x69, 0x91, 0xa9, 0x5e, 0x0a, 0x31,\n  0x2f, 0xe4, 0xc1, 0xe3, 0x0b, 0xcc, 0x99, 0x4b, 0x5d, 0x5f, 0xfa, 0x3e,\n  0x79, 0x53, 0x1f, 0x7b, 0x5f, 0xee, 0x9d, 0x8f, 0xa2, 0x2f, 0xae, 0xf9,\n  0xdc, 0xef, 0x2d, 0xf5, 0xa3, 0xde, 0xbc, 0x67, 0x2f, 0x92, 0xb9, 0x01,\n  0x25, 0x79, 0x96, 0xfe, 0x42, 0x63, 0x18, 0x4d, 0x4c, 0x79, 0x3a, 0xa6,\n  0x28, 0x2b, 0xb4, 0xcf, 0xad, 0x94, 0x3b, 0x4c, 0x03, 0x89, 0x2a, 0x20,\n  0xe2, 0x4d, 0x0f, 0xd9, 0x1c, 0x26, 0x64, 0xe2, 0x56, 0xa6, 0x03, 0x4b,\n  0x71, 0x2f, 0xb7, 0x07, 0x93, 0x36, 0x67, 0xd2, 0xeb, 0xaa, 0xf4, 0xcc,\n  0xec, 0xd3, 0x1a, 0xb4, 0x19, 0x8d, 0xce, 0x56, 0x57, 0x89, 0xad, 0x8b,\n  0x7f, 0x9e, 0x9f, 0x93, 0xf8, 0x17, 0x3e, 0xe7, 0xb3, 0x14, 0x97, 0x36,\n  0x89, 0x77, 0x90, 0x75, 0xcd, 0xba, 0x09, 0x8f, 0xb3, 0x23, 0x34, 0x76,\n  0xaf, 0x5a, 0xe2, 0x71, 0xac, 0x53, 0xae, 0x73, 0xcd, 0xf4, 0x7a, 0xad,\n  0x7c, 0x5d, 0xea, 0xe7, 0xde, 0x4c, 0xbe, 0xdd, 0x40, 0x73, 0x32, 0xaa,\n  0xd3, 0x15, 0x39, 0xc3, 0x8a, 0xec, 0xa5, 0xb3, 0xb4, 0x4b, 0x3a, 0x44,\n  0xd1, 0xce, 0x2e, 0x07, 0x3f, 0xe4, 0x12, 0x33, 0x68, 0x2c, 0x68, 0x02,\n  0xfc, 0xc3, 0xd4, 0xb6, 0x6a, 0xfe, 0xd5, 0x0f, 0x7f, 0xf8, 0x2b, 0xd4,\n  0xd1, 0xff, 0xe1, 0xbe, 0x37, 0xf7, 0x2f, 0xfe, 0x0a, 0x3e, 0xaf, 0x81,\n  0xe8, 0x75, 0x11, 0xfc, 0x0a, 0xd1, 0xeb, 0x4e, 0x53, 0x1a, 0x4b, 0x92,\n  0xbf, 0xdf, 0x8f, 0x83, 0x4c, 0x98, 0x00, 0xe2, 0x5b, 0xd2, 0x46, 0xa6,\n  0x29, 0x41, 0x9c, 0x40, 0x40, 0xc9, 0x51, 0x4f, 0x83, 0xfc, 0x07, 0x4f,\n  0x3d, 0x0d, 0x3a, 0x38, 0x8e, 0x54, 0x43, 0xc4, 0x39, 0x27, 0x9c, 0x60,\n  0x54, 0x0c, 0x2b, 0xa8, 0xd8, 0x79, 0xe9, 0x20, 0x92, 0x76, 0x99, 0xa6,\n  0x4e, 0xa4, 0x39, 0x24, 0x85, 0x17, 0x15, 0xcb, 0xf9, 0x72, 0x74, 0x3c,\n  0x2b, 0x70, 0xa7, 0x2f, 0xfb, 0x40, 0x3a, 0x71, 0xa9, 0xb1, 0x34, 0x74,\n  0x89, 0x0e, 0xa5, 0x5b, 0xa9, 0xf2, 0x14, 0x44, 0x6b, 0x45, 0x23, 0x0c,\n  0x53, 0x16, 0x8f, 0x54, 0x44, 0x2b, 0xc8, 0x42, 0xc2, 0xa1, 0x80, 0x35,\n  0x1c, 0x0a, 0x51, 0x15, 0x49, 0xd1, 0xed, 0xf3, 0x5d, 0x98, 0xb9, 0xb4,\n  0x4a, 0x59, 0xdf, 0x57, 0xce, 0xf0, 0xf1, 0x05, 0xc3, 0x86, 0x96, 0x92,\n  0x72, 0x53, 0x78, 0xa0, 0xfa, 0xfa, 0x37, 0x36, 0x1f, 0xca, 0x2c, 0x9c,\n  0xc8, 0xde, 0x8d, 0xa6, 0x26, 0x6a, 0x47, 0xab, 0x38, 0xbf, 0xbb, 0x24,\n  0xa8, 0xcf, 0x7e, 0x6d, 0xc3, 0xa8, 0x80, 0x5c, 0x28, 0xfd, 0x41, 0x77,\n  0xa0, 0xae, 0xc7, 0x6c, 0x32, 0x99, 0xef, 0x3d, 0xbb, 0xf9, 0x96, 0xde,\n  0xf3, 0x47, 0xeb, 0xb7, 0xce, 0x11, 0x85, 0xcb, 0x1b, 0x28, 0x75, 0x79,\n  0x50, 0xc3, 0xc6, 0xf1, 0xbe, 0xed, 0x04, 0xce, 0xfe, 0xa5, 0x97, 0xd1,\n  0xd3, 0x44, 0x5b, 0x12, 0xd0, 0xf3, 0x14, 0x9f, 0x7e, 0x6a, 0x43, 0x07,\n  0xc8, 0x6e, 0xb1, 0x35, 0x3d, 0x95, 0x22, 0x5a, 0x1f, 0xd3, 0x60, 0xd1,\n  0xb2, 0x1c, 0x12, 0x1d, 0x3a, 0x8c, 0x85, 0x00, 0xe2, 0x78, 0x3f, 0x62,\n  0x39, 0x3e, 0xe7, 0xa8, 0x25, 0xda, 0x3e, 0xcf, 0x09, 0xfc, 0x3c, 0xe4,\n  0x2a, 0xef, 0x52, 0x49, 0x3d, 0xae, 0x97, 0x9d, 0xcb, 0x88, 0xa9, 0xaf,\n  0xab, 0xaa, 0x28, 0x8f, 0x47, 0x42, 0xbe, 0x12, 0x93, 0x41, 0x2d, 0x32,\n  0x8d, 0xa8, 0x51, 0x2d, 0x29, 0x0d, 0xce, 0x94, 0x1c, 0x02, 0xec, 0x94,\n  0xac, 0x7e, 0xb0, 0xc2, 0xec, 0x8a, 0x07, 0x2f, 0x67, 0xe3, 0xac, 0xf2,\n  0x96, 0xff, 0x5b, 0x66, 0x9f, 0x69, 0xde, 0xac, 0xf7, 0xda, 0x6d, 0x65,\n  0x56, 0x4b, 0x51, 0x6b, 0x69, 0xac, 0xc3, 0x1e, 0x16, 0xeb, 0xa3, 0xa5,\n  0x0d, 0xfe, 0xa3, 0xd7, 0x34, 0xef, 0xf0, 0x05, 0xb6, 0xa7, 0x5a, 0x37,\n  0x5e, 0xe8, 0x6f, 0xee, 0xd9, 0xb8, 0xa1, 0xa5, 0xa2, 0x2b, 0xe6, 0xdb,\n  0x84, 0x03, 0x75, 0x35, 0xc5, 0xad, 0x15, 0x01, 0xa3, 0xae, 0xd3, 0xe4,\n  0x68, 0xec, 0x55, 0x87, 0x2a, 0xb4, 0x9c, 0xba, 0xb4, 0x3e, 0xde, 0xb5,\n  0xd5, 0x6a, 0x1a, 0x35, 0xb9, 0xe3, 0x75, 0x33, 0xfd, 0xe1, 0xca, 0x48,\n  0xc4, 0x6c, 0xee, 0x0d, 0x13, 0x58, 0x24, 0x08, 0x2c, 0x16, 0x01, 0x16,\n  0x9c, 0xd4, 0x47, 0x99, 0xfc, 0xcd, 0x9a, 0x08, 0x2c, 0x82, 0x84, 0xe6,\n  0xc6, 0xd2, 0xc3, 0x50, 0xe0, 0x2c, 0xee, 0x2f, 0x75, 0x59, 0xcc, 0x1a,\n  0x4e, 0xc5, 0xa2, 0x32, 0x37, 0xa1, 0x72, 0xb0, 0xe6, 0x58, 0x86, 0xe3,\n  0x59, 0x2e, 0x77, 0x8e, 0x7d, 0x32, 0xaf, 0xe1, 0x37, 0x3d, 0x0f, 0x40,\n  0x4c, 0xa8, 0x22, 0x5c, 0x01, 0x67, 0xd7, 0x46, 0xbd, 0x9c, 0xcd, 0x2f,\n  0x07, 0xab, 0x86, 0x23, 0x79, 0x51, 0xfd, 0x6b, 0x00, 0x62, 0x13, 0xa2,\n  0x60, 0x1f, 0xf0, 0xc4, 0x30, 0x30, 0xed, 0xbf, 0x1a, 0x2d, 0xe8, 0x37,\n  0x75, 0xd3, 0x9c, 0xd9, 0xd4, 0x8e, 0x37, 0x38, 0x0e, 0xac, 0x04, 0x42,\n  0xe0, 0xc4, 0x75, 0xd5, 0xcd, 0x5e, 0x4d, 0xf6, 0xf7, 0xfc, 0x06, 0xcd,\n  0xb9, 0xab, 0xe7, 0x3a, 0xba, 0x69, 0xd6, 0xec, 0x8e, 0x19, 0xcf, 0xf2,\n  0xda, 0x55, 0x77, 0xbe, 0xaf, 0x3f, 0xd2, 0x36, 0x10, 0x18, 0x6c, 0x19,\n  0x90, 0xfb, 0x74, 0x33, 0x1f, 0x21, 0x7c, 0x2b, 0xf5, 0x9f, 0x85, 0x36,\n  0xe5, 0xb2, 0x1b, 0x8a, 0xf6, 0x9f, 0x4d, 0x04, 0xcd, 0x89, 0x8f, 0x4c,\n  0x4d, 0xd1, 0x5e, 0xdc, 0x68, 0xe9, 0x9f, 0x96, 0x4c, 0x74, 0xac, 0x71,\n  0x8d, 0x7c, 0x3a, 0xbc, 0x2c, 0x9f, 0x8e, 0x82, 0x7c, 0xa2, 0x71, 0x9c,\n  0x46, 0x64, 0xe4, 0xf4, 0xf9, 0xf2, 0x49, 0x12, 0x4f, 0x0e, 0x57, 0xc4,\n  0x60, 0x2c, 0xb5, 0x96, 0x96, 0x4d, 0xf5, 0xff, 0x41, 0xe4, 0xfb, 0x38,\n  0x21, 0x58, 0x8b, 0x0f, 0x2e, 0xbe, 0x75, 0x68, 0x92, 0xd2, 0x1d, 0x14,\n  0xc5, 0x5c, 0x22, 0x32, 0xc5, 0xca, 0x8c, 0x0c, 0x3d, 0x11, 0x87, 0x3a,\n  0x02, 0x02, 0x87, 0xb1, 0x5a, 0xc4, 0x54, 0xa0, 0x40, 0x60, 0xe0, 0xa1,\n  0x61, 0x95, 0x62, 0x6b, 0xae, 0xb9, 0x27, 0x45, 0x5d, 0x50, 0x33, 0xc4,\n  0x60, 0xb5, 0x98, 0xe5, 0x7f, 0x26, 0x8d, 0xde, 0x07, 0x4b, 0x91, 0x8f,\n  0xc5, 0xe4, 0x48, 0x1c, 0xf2, 0xdf, 0x47, 0xa6, 0xc6, 0xc7, 0xa7, 0x1e,\n  0x9f, 0x1a, 0x1b, 0x9b, 0x7a, 0x1c, 0xf7, 0x0f, 0xcc, 0x93, 0x7f, 0x03,\n  0x8b, 0x9f, 0xc4, 0xfd, 0x52, 0x0e, 0xd6, 0xcb, 0xf8, 0x4e, 0xbc, 0xc8,\n  0x44, 0x95, 0xce, 0x12, 0x36, 0x97, 0x5a, 0xc5, 0xf2, 0x18, 0x92, 0xba,\n  0x43, 0x48, 0x44, 0x61, 0x44, 0x6c, 0x21, 0x88, 0x9d, 0x5d, 0x7d, 0x99,\n  0x15, 0x73, 0xd9, 0x2d, 0x01, 0xea, 0xac, 0x25, 0x6c, 0x70, 0x68, 0x58,\n  0x80, 0xf8, 0x7a, 0xa8, 0x67, 0x71, 0x78, 0x98, 0x72, 0x08, 0xab, 0xc2,\n  0x8a, 0xcc, 0x29, 0x01, 0x1b, 0xac, 0xf0, 0x48, 0x1a, 0x0a, 0xa7, 0x30,\n  0xd4, 0x71, 0xc9, 0x06, 0xe3, 0x08, 0xbf, 0x71, 0x70, 0xb4, 0xb0, 0xfe,\n  0x30, 0x90, 0x30, 0xd0, 0x0b, 0x1d, 0x0e, 0x49, 0x9c, 0x76, 0xb3, 0x49,\n  0xaf, 0x15, 0x78, 0x26, 0x8a, 0xa2, 0xb2, 0x39, 0x1a, 0x49, 0x12, 0x48,\n  0xa4, 0x92, 0xf9, 0x09, 0x30, 0x40, 0x76, 0x14, 0x28, 0x39, 0xef, 0x26,\n  0xae, 0x2d, 0xeb, 0xab, 0xc8, 0x0c, 0x9b, 0x36, 0x44, 0x5b, 0x1b, 0xa6,\n  0x92, 0x5b, 0x9b, 0x87, 0x0f, 0x38, 0xde, 0xf6, 0xb6, 0xea, 0xb0, 0xad,\n  0x4c, 0x6f, 0xa8, 0xd7, 0x94, 0xf4, 0x77, 0xa0, 0xc6, 0xb2, 0xe0, 0x4e,\n  0xa7, 0xa7, 0xad, 0x61, 0xf1, 0x19, 0xdc, 0xd1, 0xb9, 0x31, 0xda, 0x54,\n  0x7b, 0x43, 0x77, 0xf6, 0x62, 0x6d, 0x35, 0x2d, 0x69, 0x25, 0xe3, 0xf1,\n  0x00, 0x81, 0x9f, 0x93, 0xe9, 0x4e, 0x9b, 0x89, 0x86, 0xc4, 0x38, 0x1d,\n  0x70, 0x6c, 0xa9, 0x46, 0x2a, 0x70, 0x02, 0x4b, 0xab, 0x36, 0x29, 0x0e,\n  0x90, 0x43, 0xb9, 0xf3, 0x50, 0x43, 0xae, 0x48, 0xa3, 0x74, 0xec, 0xf9,\n  0x94, 0x33, 0x1c, 0x82, 0x33, 0x3d, 0x6b, 0x4a, 0x69, 0x4b, 0x2e, 0x9f,\n  0x28, 0xa4, 0x9c, 0xd4, 0xcd, 0xc4, 0x8d, 0xef, 0x1a, 0xf3, 0xd5, 0x59,\n  0x9d, 0xa6, 0x32, 0x5b, 0xbc, 0xfa, 0x40, 0xe9, 0x1d, 0x53, 0x75, 0xe8,\n  0xfe, 0xca, 0xb3, 0xf3, 0x93, 0x5a, 0x55, 0x0f, 0xaf, 0xa9, 0xdf, 0x30,\n  0xd1, 0xd2, 0x98, 0xc9, 0xce, 0xa0, 0x6b, 0x3c, 0x4a, 0x8c, 0x1a, 0x9d,\n  0x93, 0x9d, 0xd9, 0x9c, 0xd6, 0x88, 0x44, 0x83, 0x53, 0x41, 0xdb, 0x62,\n  0x79, 0x32, 0x6e, 0x16, 0xbc, 0x15, 0x2b, 0xbc, 0x97, 0x87, 0xe4, 0xe0,\n  0xa3, 0x62, 0x62, 0x2b, 0xd1, 0x8e, 0xc4, 0x78, 0x21, 0x6f, 0x90, 0x9c,\n  0xda, 0xa0, 0x81, 0x7c, 0xd3, 0x70, 0xc0, 0x04, 0x61, 0x11, 0xd6, 0xc4,\n  0x0a, 0x7f, 0x8d, 0x4c, 0x65, 0xfa, 0x7e, 0xb4, 0x73, 0x79, 0x92, 0xf7,\n  0xdf, 0x3f, 0xd5, 0x8f, 0xbb, 0xf6, 0x6d, 0xa2, 0x33, 0x4c, 0xb4, 0xf7,\n  0x67, 0x79, 0xf4, 0x57, 0xc2, 0x7d, 0xe0, 0x9b, 0x8e, 0x12, 0x19, 0xa3,\n  0xa7, 0x55, 0x7b, 0x6a, 0xd2, 0x95, 0x1e, 0x13, 0xc1, 0x33, 0x5a, 0x96,\n  0x2a, 0xb9, 0x66, 0xf7, 0xd4, 0x2c, 0x93, 0x83, 0x49, 0x42, 0xf1, 0xb2,\n  0x70, 0x40, 0x3e, 0x63, 0x94, 0xdd, 0x0a, 0x70, 0xe6, 0x25, 0xda, 0xc4,\n  0x86, 0xe5, 0x23, 0x24, 0x67, 0xbd, 0xdc, 0xe7, 0x3b, 0x67, 0x6a, 0xd7,\n  0x35, 0xe0, 0xe8, 0x6d, 0x27, 0xfb, 0x8e, 0xa6, 0xcf, 0x9f, 0x1c, 0x38,\n  0xba, 0xe1, 0x4d, 0xc8, 0xe5, 0xca, 0x4c, 0x4c, 0x0c, 0x3a, 0x9c, 0xad,\n  0xb5, 0xd5, 0xe9, 0x54, 0x69, 0x51, 0x51, 0x69, 0x49, 0xb1, 0xcb, 0x87,\n  0xf4, 0xe7, 0xee, 0xef, 0xb8, 0x69, 0xfa, 0xdc, 0xbd, 0x1d, 0x37, 0xbc,\n  0xa4, 0x56, 0xb9, 0x37, 0xa5, 0x66, 0x0f, 0x1d, 0x9a, 0xad, 0x9f, 0x28,\n  0x16, 0x84, 0xba, 0x54, 0xaa, 0xce, 0x0d, 0x2d, 0x4c, 0xbc, 0x5e, 0x46,\n  0xca, 0xbb, 0x79, 0x99, 0xad, 0xc3, 0xaf, 0x31, 0x13, 0x68, 0x4c, 0xae,\n  0x6b, 0xd3, 0x58, 0x4a, 0xf8, 0xb2, 0x23, 0xd5, 0xe0, 0xe4, 0x78, 0xdc,\n  0x59, 0x4e, 0x0c, 0x64, 0xbe, 0x42, 0x0e, 0x36, 0x97, 0xa2, 0xca, 0x3d,\n  0x74, 0x40, 0xca, 0x89, 0x39, 0xdc, 0xd1, 0x40, 0xd6, 0x99, 0x37, 0x06,\n  0x32, 0xda, 0x57, 0xde, 0xd6, 0xac, 0xbc, 0x3d, 0x2d, 0x73, 0x57, 0x98,\n  0x51, 0xab, 0xe9, 0xfe, 0x72, 0x68, 0x58, 0xa3, 0xc2, 0x3c, 0x2f, 0xc5,\n  0x16, 0x9d, 0xa4, 0x0c, 0xc4, 0xec, 0x12, 0xb5, 0x39, 0x06, 0x83, 0x33,\n  0xf9, 0x9a, 0x35, 0x83, 0xa9, 0x84, 0xa6, 0xbf, 0xcb, 0x2a, 0xca, 0x9a,\n  0xe7, 0x60, 0xa2, 0x55, 0x04, 0xfe, 0x6a, 0xcc, 0xaa, 0x17, 0xae, 0xf0,\n  0xa9, 0x74, 0xb9, 0xf2, 0x00, 0xa3, 0xd1, 0xc8, 0xc3, 0xa1, 0xf8, 0x46,\n  0xc1, 0xd1, 0xd3, 0x10, 0xd7, 0x84, 0x98, 0xde, 0xee, 0xd6, 0xe6, 0x64,\n  0x7d, 0x0d, 0x2d, 0x37, 0x1d, 0xf0, 0x7b, 0x3d, 0x0e, 0x1b, 0x11, 0x9e,\n  0x13, 0x68, 0x42, 0xb7, 0x52, 0x78, 0xe6, 0x72, 0x86, 0x12, 0x75, 0xce,\n  0x9c, 0xff, 0x68, 0x25, 0xd3, 0x06, 0x57, 0x31, 0xb7, 0x2d, 0xcf, 0x75,\n  0x28, 0xe7, 0x26, 0xbd, 0xd8, 0x38, 0xee, 0x2b, 0xdd, 0x5a, 0xdd, 0xd5,\n  0xea, 0x68, 0x4a, 0xd6, 0x0f, 0xc6, 0x8e, 0xce, 0x44, 0x42, 0x86, 0xaa,\n  0x4c, 0x55, 0xdf, 0x94, 0x2d, 0xc7, 0xde, 0x45, 0x94, 0xf3, 0xf5, 0x55,\n  0xfe, 0xf2, 0x2a, 0xbd, 0xd5, 0x1b, 0x18, 0x8c, 0x36, 0x34, 0xb9, 0x5b,\n  0xeb, 0xea, 0x07, 0x22, 0x57, 0x69, 0x2c, 0xa6, 0x31, 0x53, 0x71, 0x79,\n  0xc8, 0x56, 0x5a, 0x6a, 0xb3, 0xc5, 0x1a, 0x2b, 0xba, 0x07, 0x85, 0x52,\n  0x5f, 0x43, 0x5f, 0xa8, 0xa9, 0x26, 0x8f, 0xf9, 0x73, 0xc2, 0xa1, 0xb8,\n  0x3e, 0x66, 0xab, 0x72, 0xf6, 0x1a, 0x6c, 0x41, 0xaf, 0xc3, 0x57, 0x62,\n  0xb5, 0xc6, 0x9b, 0xca, 0x47, 0xc6, 0x40, 0xff, 0x7d, 0x91, 0xec, 0x23,\n  0xd7, 0xa0, 0x19, 0xd4, 0xcb, 0x0c, 0x33, 0xef, 0x8a, 0x3f, 0x1c, 0xd9,\n  0x27, 0x77, 0x94, 0x7f, 0x97, 0x7c, 0x0e, 0x66, 0x23, 0xfb, 0xef, 0x20,\n  0xe1, 0x53, 0x2f, 0x73, 0x9f, 0x84, 0x6a, 0x53, 0x11, 0xd1, 0x35, 0x9c,\n  0x1a, 0xcc, 0x42, 0xb0, 0x92, 0x1a, 0x31, 0x03, 0xc5, 0xf9, 0x97, 0xe0,\n  0xd4, 0x38, 0x57, 0x31, 0xd6, 0xa1, 0xa4, 0x26, 0x1d, 0x92, 0x0a, 0x07,\n  0xa1, 0x5c, 0xec, 0x3d, 0x65, 0xf2, 0xbc, 0xbb, 0x34, 0x88, 0x5e, 0xe6,\n  0x2a, 0x7a, 0x84, 0x56, 0x44, 0x84, 0x16, 0x8b, 0x39, 0x76, 0x61, 0xf5,\n  0xad, 0xe9, 0xe9, 0x7f, 0x08, 0x87, 0xc3, 0x21, 0xf9, 0x54, 0x26, 0x1a,\n  0x94, 0xa3, 0xe8, 0xe5, 0x3d, 0x6d, 0x45, 0x04, 0x0f, 0x1a, 0xec, 0xd1,\n  0xf1, 0xc5, 0x23, 0x8d, 0x86, 0x80, 0x91, 0x6c, 0x3a, 0xc6, 0xee, 0xc9,\n  0x60, 0xb5, 0x35, 0x68, 0x36, 0x1a, 0x1a, 0x5d, 0x63, 0xe3, 0x3b, 0x6a,\n  0x53, 0x2c, 0xbb, 0x91, 0xe5, 0x76, 0x8f, 0xa2, 0x2d, 0xb5, 0x75, 0x3c,\n  0xdf, 0x2d, 0xa8, 0x87, 0xa7, 0x95, 0xdc, 0x25, 0x3f, 0xde, 0xc4, 0x98,\n  0x89, 0x75, 0xd9, 0x95, 0x4e, 0xcb, 0x61, 0x05, 0x0b, 0x6b, 0x73, 0x98,\n  0x0a, 0x67, 0x2e, 0x05, 0xac, 0x81, 0x02, 0x99, 0x4b, 0x4a, 0x88, 0x41,\n  0xe1, 0xcc, 0xa5, 0xdb, 0x43, 0x25, 0xbb, 0x93, 0x35, 0x4d, 0x6d, 0x63,\n  0x23, 0xde, 0xae, 0x5e, 0x87, 0xa9, 0xa2, 0x66, 0x2e, 0x18, 0xc9, 0x64,\n  0x3a, 0xd1, 0x64, 0x7c, 0x2c, 0xe8, 0xef, 0xec, 0x6b, 0xf2, 0x37, 0x87,\n  0xb2, 0x1f, 0x2a, 0x0b, 0xc4, 0xd2, 0x9d, 0x9d, 0xcd, 0x89, 0x3e, 0x82,\n  0x93, 0x72, 0xe6, 0x02, 0xda, 0x89, 0xa3, 0x64, 0x8e, 0xab, 0x72, 0x96,\n  0xa8, 0x50, 0x82, 0x9c, 0x25, 0x93, 0x01, 0x8a, 0xf5, 0x28, 0x07, 0x74,\n  0x61, 0x59, 0x1a, 0xe5, 0x25, 0x2d, 0x55, 0xed, 0x3c, 0x51, 0x7b, 0xcd,\n  0xf5, 0x3d, 0x1d, 0x1f, 0x3a, 0x38, 0x69, 0xb8, 0x90, 0xdc, 0x9a, 0x9a,\n  0x39, 0x9c, 0x79, 0xc3, 0x50, 0x6f, 0x95, 0x92, 0xd3, 0x6d, 0xc2, 0x2e,\n  0xb2, 0xef, 0x07, 0x98, 0xe3, 0x6b, 0x6b, 0x65, 0x81, 0x1e, 0x50, 0xaa,\n  0xe0, 0x94, 0x9e, 0x6d, 0x9e, 0xcc, 0x8b, 0x13, 0x17, 0x14, 0x67, 0x6d,\n  0x69, 0xde, 0x5d, 0xd9, 0xf9, 0xbf, 0x72, 0x08, 0x75, 0x5d, 0x49, 0x75,\n  0x27, 0x68, 0x3e, 0x7c, 0x00, 0x05, 0xc4, 0x55, 0xa9, 0x4e, 0x79, 0x69,\n  0xd3, 0x42, 0x2e, 0x6f, 0xda, 0x26, 0xa0, 0x3b, 0xed, 0x31, 0x83, 0xa9,\n  0xc4, 0x54, 0x1a, 0xba, 0x66, 0x4b, 0xdf, 0xd4, 0x14, 0x91, 0x46, 0x25,\n  0x5b, 0xda, 0xa6, 0x77, 0xf5, 0xfc, 0x41, 0x10, 0xfa, 0x39, 0x21, 0x5a,\n  0x85, 0xde, 0x73, 0xdb, 0xdc, 0x2e, 0xc8, 0xa2, 0xfe, 0x96, 0xab, 0x49,\n  0x5b, 0x15, 0x9f, 0xdd, 0x9b, 0x1d, 0xee, 0x99, 0x84, 0x75, 0x99, 0x96,\n  0x8c, 0x44, 0x3d, 0x78, 0x90, 0xa9, 0x64, 0xe6, 0xd3, 0x7b, 0xac, 0x7a,\n  0xb2, 0xcd, 0xc7, 0x11, 0x0f, 0x8a, 0x93, 0x8a, 0x2c, 0x90, 0xf1, 0x12,\n  0x95, 0xa1, 0x04, 0x09, 0xa2, 0x40, 0xe4, 0x3c, 0xc7, 0x9e, 0x63, 0x78,\n  0x28, 0x73, 0xa0, 0x5a, 0x50, 0x23, 0x39, 0x99, 0xfd, 0xf0, 0x30, 0x6d,\n  0xdd, 0x35, 0x27, 0xa5, 0x27, 0x42, 0x95, 0x3c, 0x46, 0x10, 0x8e, 0x0a,\n  0x04, 0xda, 0xe5, 0x65, 0xb1, 0x48, 0xa0, 0xd4, 0xe3, 0x86, 0x3a, 0x49,\n  0x26, 0x23, 0xd5, 0xb7, 0x2a, 0x51, 0x25, 0x84, 0x42, 0x86, 0x97, 0x43,\n  0x20, 0x40, 0x14, 0xa4, 0x12, 0x76, 0x3f, 0x3d, 0x34, 0x70, 0x08, 0x42,\n  0x74, 0x65, 0xfc, 0x49, 0xca, 0x6f, 0xb6, 0x21, 0xae, 0xa8, 0xcc, 0x6a,\n  0x4d, 0xfa, 0xfa, 0x46, 0x33, 0x63, 0xa5, 0xf5, 0xb8, 0xf5, 0xf7, 0x77,\n  0x5c, 0x8b, 0x36, 0x5c, 0xb3, 0xf1, 0xd0, 0x78, 0xd5, 0xf6, 0xca, 0x99,\n  0xa9, 0xb9, 0xe3, 0xad, 0xbf, 0xc8, 0x26, 0x36, 0x88, 0x7c, 0xb7, 0xa8,\n  0x19, 0xda, 0x8a, 0x52, 0x65, 0xfe, 0x6b, 0x6e, 0x68, 0xfd, 0xab, 0x78,\n  0xcd, 0xde, 0xde, 0x23, 0x6d, 0x28, 0x38, 0xee, 0xb0, 0xed, 0x1c, 0x18,\n  0x18, 0xef, 0xfc, 0x73, 0xf6, 0x1b, 0xbb, 0x60, 0xad, 0x55, 0x04, 0x87,\n  0x26, 0x62, 0x9b, 0xf9, 0x20, 0x96, 0x03, 0x8e, 0xae, 0x75, 0x5a, 0x11,\n  0x7c, 0xe7, 0xc8, 0x49, 0xf0, 0x59, 0x44, 0xf3, 0x0a, 0x81, 0xb2, 0x89,\n  0xde, 0x78, 0x5a, 0xd9, 0xf9, 0x4f, 0xe6, 0xa7, 0x12, 0x86, 0x42, 0x41,\n  0xbb, 0x15, 0x98, 0x2c, 0xbc, 0x6e, 0xe6, 0x96, 0x64, 0x15, 0xa1, 0xc8,\n  0x4f, 0x7f, 0x3c, 0x74, 0xa0, 0xd6, 0x57, 0x3d, 0x91, 0x7a, 0x10, 0xa9,\n  0x7a, 0xaf, 0x9e, 0xdb, 0xb6, 0xbd, 0xee, 0x60, 0xcd, 0xe4, 0xd9, 0xb3,\n  0x6f, 0xbc, 0xf5, 0xd9, 0x47, 0xbb, 0xae, 0x71, 0x95, 0x76, 0x16, 0x17,\n  0x6d, 0xfc, 0x62, 0xf7, 0x58, 0x67, 0xf7, 0xa8, 0xdd, 0x39, 0x1a, 0xbf,\n  0x6a, 0xef, 0xde, 0xc3, 0xc0, 0x67, 0xd6, 0x25, 0x13, 0xfa, 0x1c, 0x76,\n  0xd1, 0xbc, 0x2d, 0x32, 0xc3, 0xa2, 0x35, 0x79, 0x5b, 0xa0, 0x42, 0x1e,\n  0x06, 0xda, 0xc1, 0x3b, 0x57, 0x87, 0x9e, 0x31, 0x8c, 0xcd, 0x2a, 0x27,\n  0x6d, 0x09, 0x85, 0x93, 0xb6, 0xd8, 0x84, 0x92, 0x99, 0x84, 0x3e, 0xd7,\n  0x9f, 0x71, 0x94, 0x19, 0xcd, 0x7e, 0x53, 0x20, 0x9e, 0xfd, 0x20, 0x9a,\n  0x78, 0x75, 0x49, 0xca, 0x46, 0xc2, 0xae, 0xc5, 0xfb, 0x7a, 0x26, 0x65,\n  0x8a, 0x19, 0x6f, 0x47, 0x3f, 0xca, 0x56, 0xbf, 0x17, 0x32, 0x90, 0xca,\n  0xbd, 0x52, 0x7d, 0x21, 0x32, 0x3f, 0xbc, 0x83, 0xcc, 0x4f, 0xca, 0xd9,\n  0xfa, 0x89, 0x14, 0x73, 0x6b, 0xf3, 0xc8, 0xd3, 0x0c, 0xa8, 0x20, 0x39,\n  0x4b, 0xfc, 0xff, 0x68, 0x7b, 0x0f, 0xf8, 0x48, 0x8a, 0x2b, 0x7f, 0xbc,\n  0xab, 0xbb, 0x67, 0x7a, 0x72, 0x8e, 0x9a, 0xa4, 0xc9, 0x23, 0x8d, 0xf2,\n  0x68, 0x24, 0xad, 0xe2, 0x68, 0x95, 0xb3, 0xb4, 0x5a, 0xe5, 0xdd, 0x55,\n  0xd8, 0x9c, 0xd8, 0x44, 0xd8, 0x25, 0x99, 0xb0, 0xcb, 0x12, 0x0c, 0x18,\n  0xb0, 0x31, 0xd8, 0x60, 0x1b, 0x83, 0xed, 0x03, 0x9b, 0x33, 0xc6, 0x80,\n  0x71, 0xe6, 0xce, 0xd8, 0x67, 0xe3, 0x83, 0x33, 0xc7, 0xad, 0x6d, 0x7c,\n  0xd8, 0xc6, 0x38, 0x80, 0x03, 0x36, 0x60, 0x1f, 0x5e, 0x30, 0x1a, 0xfd,\n  0xea, 0x55, 0x75, 0xf7, 0xcc, 0x48, 0x5a, 0xe0, 0xee, 0xf3, 0xff, 0x03,\n  0xbb, 0x48, 0xdd, 0xd5, 0xdd, 0x55, 0xaf, 0x5e, 0xbd, 0x7a, 0xaf, 0xde,\n  0x7b, 0xdf, 0x27, 0xe6, 0x6c, 0xb9, 0x0a, 0x2f, 0x43, 0xc6, 0xc7, 0xa0,\n  0x80, 0xff, 0x1e, 0x10, 0x43, 0x75, 0x4b, 0x19, 0x18, 0x0a, 0xa4, 0xf9,\n  0xb1, 0x0b, 0x6a, 0x05, 0x0b, 0xa3, 0xd1, 0xd0, 0xcc, 0x2d, 0x58, 0x0a,\n  0x85, 0x5e, 0x0e, 0xba, 0xc0, 0x12, 0xeb, 0x3f, 0x41, 0xd2, 0xb7, 0x0e,\n  0xe5, 0x93, 0xc2, 0x93, 0x89, 0xe1, 0x1b, 0x0c, 0x09, 0x05, 0x5b, 0xfb,\n  0x4c, 0x5e, 0x43, 0xbc, 0xbd, 0xb9, 0x82, 0x41, 0x46, 0xcc, 0xf2, 0x72,\n  0x39, 0x09, 0x4e, 0x13, 0x50, 0x50, 0x0b, 0x82, 0xd4, 0xbe, 0x86, 0x82,\n  0xe0, 0x12, 0x88, 0xe6, 0xa8, 0x98, 0x4b, 0xef, 0x7a, 0xa2, 0x7b, 0x48,\n  0xa4, 0x67, 0x02, 0xe8, 0x39, 0x77, 0x5d, 0x36, 0x24, 0x92, 0x14, 0xc5,\n  0xa5, 0xfc, 0xae, 0xfe, 0xbe, 0xad, 0x05, 0x94, 0xed, 0xed, 0x15, 0x69,\n  0x9b, 0xdd, 0xaa, 0x8e, 0x4e, 0x45, 0x34, 0xb6, 0x0d, 0x4d, 0x4e, 0xcc,\n  0xa3, 0x23, 0x98, 0x51, 0x2f, 0xc7, 0x34, 0x56, 0x33, 0x61, 0x2c, 0x2f,\n  0x38, 0x10, 0xf9, 0x54, 0xe1, 0x9b, 0xcf, 0x37, 0x7e, 0x24, 0x1f, 0x7c,\n  0x0a, 0x02, 0xf6, 0x49, 0x5c, 0xf9, 0xc7, 0x07, 0x51, 0xe5, 0xaf, 0xcf,\n  0x9c, 0x61, 0xdd, 0x99, 0xc7, 0x49, 0x2c, 0x41, 0x62, 0xe5, 0x2c, 0xba,\n  0x02, 0xeb, 0x6b, 0x71, 0x88, 0x4e, 0x71, 0x63, 0xfe, 0x2e, 0x52, 0xb2,\n  0x34, 0xa3, 0x05, 0x2c, 0x41, 0x4e, 0x3a, 0x02, 0xc8, 0x8b, 0x07, 0x4b,\n  0x46, 0x42, 0x24, 0xe5, 0xa2, 0x30, 0x0c, 0x4c, 0xda, 0xd2, 0x57, 0xed,\n  0xd4, 0xe8, 0x8a, 0x3d, 0x93, 0xdb, 0x9a, 0xc3, 0x43, 0xc9, 0x54, 0x4b,\n  0x67, 0x7d, 0xa4, 0x2d, 0xb6, 0x38, 0x52, 0x32, 0x10, 0x2d, 0x0a, 0xb7,\n  0x04, 0xca, 0xea, 0xbd, 0xe9, 0x48, 0x49, 0x7b, 0xf4, 0xe6, 0xde, 0x11,\n  0x4f, 0xaf, 0xd1, 0x56, 0x96, 0x28, 0x2d, 0x75, 0x18, 0xa2, 0x4d, 0xe5,\n  0x9d, 0x43, 0x66, 0x53, 0x8b, 0xd1, 0x58, 0x12, 0xf3, 0x86, 0xdd, 0x46,\n  0x73, 0x9c, 0xa0, 0xf3, 0x56, 0x60, 0xbd, 0xac, 0x01, 0xaf, 0xc7, 0x1a,\n  0xa6, 0x85, 0xe9, 0x65, 0x3e, 0x9c, 0xb1, 0x57, 0x19, 0xf1, 0x96, 0x58,\n  0x69, 0xc0, 0x1a, 0x38, 0x8f, 0xd4, 0x28, 0xe0, 0x62, 0x35, 0x6a, 0x5e,\n  0xf4, 0x85, 0x45, 0xb1, 0x05, 0xa3, 0x45, 0x6a, 0x0d, 0x52, 0xef, 0x56,\n  0x41, 0x68, 0xd3, 0x22, 0xa7, 0x67, 0x61, 0x79, 0x02, 0x30, 0x3a, 0xbf,\n  0x48, 0x10, 0x06, 0xf6, 0x83, 0xc3, 0xa3, 0xe4, 0x1c, 0xed, 0xf0, 0xa2,\n  0xd9, 0x4f, 0x1a, 0x53, 0x84, 0xbf, 0x23, 0xa0, 0x1a, 0x07, 0x41, 0xb7,\n  0xc9, 0xb4, 0x36, 0x6d, 0x48, 0xa7, 0xca, 0x93, 0x58, 0xbb, 0x09, 0xf9,\n  0x3c, 0xd8, 0x0a, 0x30, 0xeb, 0x34, 0x82, 0x82, 0xa9, 0x41, 0x35, 0x06,\n  0x31, 0x68, 0xd1, 0x5e, 0x57, 0x5f, 0x5f, 0x18, 0x07, 0x6b, 0x96, 0x37,\n  0x59, 0x92, 0xb5, 0x90, 0xae, 0x85, 0x06, 0xe2, 0x7d, 0xab, 0x20, 0xb9,\n  0xe3, 0xd3, 0xd1, 0xdc, 0x8f, 0xc8, 0xb7, 0xb0, 0xbd, 0x75, 0xef, 0x5c,\n  0x63, 0xba, 0x74, 0x30, 0xe8, 0x09, 0x2f, 0xd4, 0x2e, 0x6d, 0xcb, 0x98,\n  0xf9, 0xf0, 0x50, 0x67, 0xfd, 0x66, 0x8b, 0x27, 0xd5, 0x5a, 0x36, 0xba,\n  0xe5, 0xad, 0xa5, 0xc3, 0xd1, 0xa1, 0xb8, 0xbf, 0x6c, 0xdb, 0x5d, 0x23,\n  0x9b, 0xb7, 0xa4, 0x2b, 0x7a, 0x26, 0xd0, 0xcc, 0xc8, 0x8e, 0xa1, 0xfa,\n  0x64, 0xe7, 0x2c, 0x1b, 0xde, 0xba, 0xd8, 0xe5, 0xe3, 0xb8, 0xe2, 0x8e,\n  0x5a, 0xb7, 0x69, 0xa3, 0xd5, 0x33, 0xb9, 0x2d, 0x7b, 0xdb, 0x60, 0x59,\n  0x69, 0x79, 0x45, 0x30, 0x61, 0xd9, 0x34, 0x7c, 0xaf, 0x92, 0x0b, 0x5c,\n  0x66, 0xb7, 0x6d, 0xb4, 0x3b, 0xb3, 0xbf, 0xe1, 0xb8, 0x9a, 0xa6, 0x64,\n  0xf9, 0x58, 0x5f, 0x15, 0xc7, 0x37, 0xa4, 0xca, 0x4b, 0x07, 0x86, 0x45,\n  0x1a, 0x9f, 0xc0, 0x34, 0x0e, 0x62, 0x09, 0xdf, 0x00, 0xd8, 0x2f, 0xa0,\n  0x35, 0x1a, 0x03, 0x48, 0xc1, 0xf8, 0xb1, 0x0c, 0x57, 0x18, 0x90, 0x52,\n  0x05, 0x7e, 0x18, 0xf9, 0x8a, 0x40, 0xaf, 0x88, 0xd9, 0x95, 0x21, 0xcc,\n  0x7f, 0x2a, 0x25, 0xaf, 0xda, 0x4d, 0x8f, 0x0a, 0x90, 0x86, 0xd0, 0x12,\n  0xfc, 0x69, 0xec, 0x22, 0x27, 0x41, 0x20, 0x94, 0x4b, 0x8d, 0x98, 0xbc,\n  0x36, 0xc4, 0xde, 0x5b, 0xaf, 0x3d, 0xc1, 0x7e, 0xa9, 0xc3, 0xea, 0x64,\n  0x59, 0x69, 0x2c, 0xe2, 0x2d, 0x72, 0x11, 0x82, 0x2b, 0x38, 0x39, 0x50,\n  0xbe, 0xc6, 0x29, 0x87, 0xc5, 0xd1, 0x92, 0xb0, 0x6b, 0x08, 0x9c, 0x9f,\n  0x1d, 0x98, 0x4f, 0xe1, 0xcb, 0xcb, 0x36, 0x9e, 0xc0, 0xe6, 0xc2, 0xe9,\n  0x63, 0x5d, 0x07, 0x8b, 0x91, 0x77, 0x57, 0xf7, 0xf4, 0x36, 0x99, 0xa8,\n  0x67, 0x07, 0x36, 0x8d, 0x0d, 0x82, 0x0d, 0xb1, 0x45, 0xa4, 0x2e, 0x1b,\n  0x1e, 0x19, 0x6e, 0xbf, 0x64, 0xe6, 0xd4, 0xad, 0xad, 0x8d, 0x8d, 0xad,\n  0x05, 0x54, 0xfc, 0xc3, 0xfc, 0xa1, 0x43, 0xf3, 0xd8, 0x94, 0xd8, 0x29,\n  0x51, 0x93, 0xc6, 0xd8, 0x01, 0x1d, 0x07, 0x31, 0x1d, 0x13, 0x4c, 0x0a,\n  0x2c, 0x6e, 0x38, 0x88, 0x33, 0xc6, 0x90, 0xc0, 0x44, 0xf1, 0xee, 0xe8,\n  0x30, 0x62, 0x11, 0x47, 0xa8, 0x88, 0xaf, 0xb0, 0x79, 0x57, 0x44, 0x4f,\n  0x56, 0x88, 0x51, 0x32, 0x2a, 0x4c, 0x56, 0x7a, 0xf8, 0xc4, 0x4a, 0x44,\n  0xc1, 0x0a, 0xc4, 0x22, 0x09, 0x24, 0xde, 0xcf, 0x49, 0xa9, 0x09, 0x31,\n  0xb9, 0x25, 0x39, 0xb3, 0x80, 0xe6, 0x1a, 0xb4, 0x4e, 0x6b, 0x2c, 0x3e,\n  0xcf, 0xd1, 0x90, 0xe8, 0x14, 0xd0, 0x9a, 0x46, 0x61, 0x1d, 0xe1, 0x41,\n  0xca, 0x61, 0x8a, 0x57, 0x57, 0x26, 0x4b, 0xc2, 0xc1, 0x80, 0x0f, 0x20,\n  0x28, 0xc4, 0x44, 0xea, 0x04, 0x4a, 0x68, 0x25, 0x16, 0xb7, 0x49, 0xe7,\n  0x1f, 0x32, 0x67, 0xaf, 0x43, 0xf8, 0x42, 0x76, 0xde, 0xd0, 0x82, 0x35,\n  0x8d, 0x6e, 0xbd, 0xa2, 0x68, 0xae, 0x25, 0x33, 0x65, 0x0b, 0xcd, 0x37,\n  0xaf, 0xc3, 0xc4, 0xc0, 0xbb, 0x1f, 0xeb, 0xed, 0x58, 0x5a, 0x40, 0x8e,\n  0xe5, 0x57, 0x7a, 0x4b, 0x13, 0x35, 0xa9, 0x74, 0xd5, 0xa6, 0xe1, 0x7b,\n  0x54, 0x6b, 0x79, 0x56, 0xa2, 0xb1, 0x0d, 0xd3, 0x38, 0x84, 0x79, 0xf5,\n  0x5b, 0x22, 0x8d, 0x2d, 0x78, 0x37, 0x36, 0xe3, 0x0d, 0xd0, 0x83, 0xf7,\n  0x40, 0x25, 0xa1, 0x31, 0xbe, 0xc2, 0xe7, 0x5d, 0x11, 0x69, 0x5c, 0x0c,\n  0xce, 0x7c, 0x01, 0x29, 0x77, 0xcb, 0xae, 0x40, 0x91, 0x07, 0x55, 0x0a,\n  0xd9, 0x60, 0x02, 0x0a, 0x47, 0xe4, 0x76, 0xe4, 0xd8, 0x57, 0x0c, 0xa7,\n  0x5a, 0xdd, 0x16, 0x10, 0x3f, 0xd7, 0x6d, 0xa6, 0xa2, 0xf0, 0x02, 0xd0,\n  0x98, 0x91, 0xce, 0x32, 0x2c, 0x0c, 0x93, 0x2c, 0x89, 0x42, 0xb7, 0x43,\n  0x45, 0xd1, 0x50, 0x38, 0x02, 0x89, 0x8b, 0xc1, 0xf5, 0x38, 0x97, 0xe2,\n  0x7c, 0x0a, 0x14, 0x7f, 0x02, 0x71, 0x79, 0xe4, 0xbc, 0xc7, 0xca, 0x47,\n  0xc7, 0xda, 0x06, 0xe7, 0x64, 0x02, 0x56, 0x2f, 0x6c, 0xe7, 0x38, 0xad,\n  0x4b, 0x7f, 0xef, 0x62, 0xf6, 0xad, 0x53, 0x22, 0x31, 0x47, 0x2b, 0x93,\n  0xf9, 0x9c, 0xba, 0x75, 0xf1, 0xf3, 0x0d, 0x29, 0x5f, 0x93, 0x07, 0x4d,\n  0x2e, 0xbf, 0x82, 0x84, 0x1c, 0x1d, 0x39, 0x99, 0x8e, 0x3e, 0x72, 0x0a,\n  0xfe, 0x7c, 0x01, 0x25, 0x79, 0xd6, 0x8f, 0x58, 0xb5, 0x4a, 0xa2, 0xa4,\n  0x22, 0xef, 0x8a, 0x48, 0xc9, 0x04, 0x5e, 0xce, 0x82, 0x8a, 0xc7, 0x7b,\n  0x27, 0x56, 0x02, 0xd5, 0x48, 0x45, 0x29, 0xaa, 0xa0, 0x14, 0x55, 0xab,\n  0x31, 0xa3, 0x29, 0x0b, 0x28, 0x5a, 0xb6, 0xa6, 0x3d, 0x39, 0xf4, 0xc9,\n  0x51, 0xb6, 0xe0, 0x19, 0x6c, 0xe9, 0xbe, 0x7b, 0x73, 0x0d, 0x22, 0xe8,\n  0x29, 0xf0, 0x90, 0x4c, 0x61, 0x3b, 0xc3, 0x54, 0x96, 0x83, 0xf9, 0x89,\n  0x87, 0xe4, 0x33, 0x5b, 0x81, 0xc8, 0x70, 0x1a, 0x7d, 0x6e, 0x22, 0xa7,\n  0xea, 0x53, 0x28, 0x9e, 0x22, 0x49, 0xa2, 0x76, 0x5b, 0xfc, 0x3d, 0x08,\n  0x7d, 0xfe, 0x3c, 0x26, 0x72, 0x15, 0x50, 0xbb, 0x64, 0x66, 0xfa, 0x5c,\n  0xb4, 0xb6, 0xfd, 0xdb, 0xf2, 0x2b, 0x23, 0x98, 0xda, 0x13, 0x5b, 0x1b,\n  0x4e, 0x15, 0xf2, 0xac, 0x81, 0xd0, 0xba, 0x92, 0x69, 0x64, 0x3e, 0x27,\n  0x22, 0xe1, 0xe5, 0xf1, 0xac, 0x4a, 0x28, 0x45, 0x4a, 0x06, 0xab, 0xd4,\n  0x4a, 0x82, 0x84, 0x97, 0xc7, 0xbb, 0xf9, 0x77, 0x64, 0xca, 0x63, 0x7b,\n  0x4a, 0x85, 0x84, 0x02, 0x1e, 0x06, 0x9d, 0x88, 0x21, 0x67, 0xf4, 0x22,\n  0xb2, 0xda, 0x21, 0x38, 0xf0, 0x29, 0x93, 0x9b, 0xae, 0x62, 0xe3, 0xf5,\n  0x9a, 0xcf, 0x64, 0x74, 0x91, 0x70, 0x24, 0x22, 0x32, 0x67, 0x20, 0xa9,\n  0x78, 0x6f, 0xe6, 0x94, 0x20, 0xed, 0x40, 0xab, 0xb5, 0xbe, 0x27, 0xa3,\n  0xaa, 0xac, 0xfa, 0xcf, 0x2f, 0x66, 0xbf, 0x6d, 0x2e, 0x6d, 0xab, 0xb2,\n  0x06, 0xcd, 0xf6, 0x50, 0x69, 0x89, 0x5d, 0x21, 0x12, 0xd2, 0xbe, 0x73,\n  0x1d, 0xae, 0x75, 0x54, 0x79, 0xd0, 0x9e, 0xe5, 0x0b, 0x42, 0x8d, 0x61,\n  0x25, 0x3f, 0xa0, 0x2e, 0x2b, 0x45, 0x53, 0x39, 0x92, 0x8a, 0x67, 0xfd,\n  0xf7, 0x93, 0xf3, 0xed, 0xaf, 0x12, 0xdb, 0x4b, 0x4d, 0xb0, 0x92, 0xce,\n  0x32, 0x1e, 0x6c, 0xa3, 0xa8, 0xb1, 0x69, 0xa4, 0x84, 0x80, 0x48, 0xd1,\n  0xec, 0xf2, 0xaa, 0x04, 0x38, 0x87, 0x02, 0x04, 0x37, 0x40, 0x45, 0x3d,\n  0x30, 0x44, 0xd4, 0x24, 0x39, 0x5b, 0x24, 0x54, 0x78, 0x9b, 0x82, 0xba,\n  0xee, 0x2f, 0x68, 0x34, 0x93, 0x31, 0x11, 0xf4, 0x0f, 0x0f, 0x56, 0xaa,\n  0xac, 0x96, 0x22, 0x12, 0xf9, 0x87, 0x48, 0x2a, 0xbf, 0x90, 0xc2, 0xca,\n  0x5d, 0x7d, 0x4a, 0x00, 0x24, 0x57, 0x39, 0x6b, 0x01, 0x6d, 0xff, 0x0a,\n  0x87, 0x78, 0xa5, 0xcb, 0xad, 0xfe, 0xfc, 0xee, 0xe7, 0x5f, 0xd9, 0xf7,\n  0xb5, 0x96, 0xa9, 0xc1, 0xc1, 0x29, 0xf6, 0x13, 0xed, 0x6f, 0x98, 0x6a,\n  0xad, 0x2a, 0x7f, 0x40, 0xf3, 0xe8, 0x6f, 0xb3, 0x4f, 0xbf, 0x9d, 0xfe,\n  0x2e, 0xbb, 0xb5, 0x7d, 0x76, 0x56, 0xc4, 0x65, 0xa4, 0x7d, 0x1f, 0xce,\n  0x98, 0x00, 0x70, 0xca, 0x6e, 0xb3, 0x6a, 0x49, 0xde, 0x29, 0x2b, 0x0d,\n  0xc1, 0x4c, 0x8f, 0xf2, 0x40, 0x90, 0x4b, 0x99, 0xf8, 0x19, 0x27, 0x81,\n  0xa4, 0x25, 0xbf, 0x16, 0xdc, 0x99, 0x79, 0xcc, 0x51, 0x44, 0x53, 0x63,\n  0xeb, 0xeb, 0x49, 0xa7, 0xe0, 0xc4, 0x5a, 0xea, 0xa7, 0x94, 0x9d, 0xf5,\n  0x72, 0x57, 0x47, 0xcb, 0xd4, 0x54, 0xae, 0x97, 0x7d, 0x7b, 0xe2, 0xfb,\n  0x2e, 0xde, 0x37, 0xd6, 0xb5, 0xb7, 0x6e, 0x0e, 0x77, 0xec, 0x6c, 0xf6,\n  0x98, 0xdc, 0xd5, 0x85, 0xb1, 0xea, 0x4d, 0xf7, 0x1c, 0x4c, 0xe7, 0xd1,\n  0x18, 0xb0, 0xa0, 0x4d, 0xe1, 0x50, 0xc0, 0xef, 0xf3, 0x7a, 0xac, 0xa4,\n  0x9f, 0x4a, 0xa9, 0x9f, 0x1e, 0x9a, 0x26, 0xab, 0xa4, 0x8e, 0xb3, 0x03,\n  0xc0, 0x61, 0x07, 0xa5, 0x54, 0x59, 0x4f, 0x26, 0x58, 0x70, 0x97, 0x99,\n  0x17, 0x68, 0xdf, 0xf3, 0xda, 0xcc, 0x64, 0xb4, 0x8e, 0xa2, 0x5c, 0x46,\n  0xad, 0x38, 0x80, 0x5c, 0x2e, 0xc8, 0x39, 0x06, 0x82, 0xc9, 0xfb, 0x95,\n  0xaf, 0x9c, 0x6b, 0x30, 0x40, 0xe5, 0x3c, 0xd2, 0xe7, 0xc6, 0x03, 0xc6,\n  0xad, 0x02, 0x8f, 0x47, 0x60, 0x52, 0x19, 0x35, 0x70, 0x00, 0xcf, 0xc8,\n  0x3c, 0xa3, 0xa5, 0x04, 0x17, 0x3b, 0xae, 0x65, 0x28, 0x40, 0x3e, 0xe9,\n  0xe2, 0x23, 0x56, 0x0b, 0xf8, 0x15, 0xac, 0xf5, 0x70, 0x78, 0x4b, 0x7c,\n  0x0b, 0xd3, 0xd3, 0xe8, 0x1b, 0xc1, 0x6c, 0x18, 0x7d, 0x30, 0x88, 0x6e,\n  0x84, 0xbc, 0x20, 0xdc, 0xf0, 0x0d, 0xfc, 0x5e, 0x2d, 0xd3, 0x4e, 0x5f,\n  0x66, 0xcf, 0x25, 0x0f, 0x53, 0xaa, 0x88, 0xaf, 0x2d, 0xbc, 0x2e, 0xe5,\n  0x58, 0xcd, 0x64, 0xd4, 0xf4, 0xc8, 0x1f, 0x0e, 0x45, 0x53, 0x79, 0xa3,\n  0x7f, 0x70, 0xba, 0xbb, 0x7b, 0xba, 0xab, 0x8b, 0xdd, 0x96, 0x99, 0x9d,\n  0xcd, 0xd0, 0x7c, 0x5b, 0xf6, 0x7c, 0xac, 0xbf, 0x5b, 0x18, 0x37, 0xb6,\n  0xb6, 0xce, 0x99, 0x6f, 0x7b, 0xac, 0x20, 0xdf, 0xd6, 0x53, 0x84, 0x8d,\n  0x40, 0xc6, 0xef, 0x2b, 0x2a, 0xf6, 0x14, 0x63, 0x4d, 0xd6, 0x6d, 0x03,\n  0x5b, 0xd2, 0x12, 0x32, 0xe3, 0xff, 0x20, 0xdf, 0x36, 0x9d, 0x16, 0xcf,\n  0x7f, 0xf1, 0xf7, 0x44, 0xd4, 0x9f, 0xfa, 0x82, 0x74, 0xdb, 0x5e, 0xcd,\n  0xd5, 0xfb, 0x76, 0x5c, 0xa3, 0xcd, 0xb4, 0x29, 0xaf, 0x39, 0xd8, 0xb9,\n  0x7f, 0x23, 0xff, 0x66, 0x5f, 0xbf, 0x80, 0xea, 0x84, 0xc1, 0xde, 0xc1,\n  0x41, 0x3e, 0xfb, 0x7d, 0x7e, 0xf0, 0x6f, 0x1b, 0x8f, 0x5e, 0x7c, 0xf1,\n  0xd1, 0x8d, 0x17, 0x9f, 0x6c, 0x3a, 0x3a, 0xf6, 0x9b, 0x89, 0xa1, 0xa1,\n  0x89, 0xec, 0xee, 0xc5, 0xcd, 0x9b, 0x01, 0xae, 0x98, 0xf8, 0x3d, 0xbf,\n  0x85, 0xe5, 0xa0, 0x87, 0x64, 0xd3, 0x7e, 0x4c, 0xcc, 0xed, 0xd2, 0x20,\n  0x5e, 0xe1, 0x20, 0xe9, 0x1d, 0x24, 0x5f, 0x53, 0x10, 0x7f, 0x11, 0x73,\n  0xbb, 0x42, 0x6a, 0x84, 0xcd, 0x1b, 0x25, 0xcf, 0xed, 0x05, 0xf5, 0x92,\n  0x22, 0x4d, 0xd0, 0x0d, 0x20, 0xcf, 0xa3, 0x50, 0x26, 0x37, 0x62, 0x72,\n  0x6d, 0x48, 0x86, 0xc8, 0x3a, 0xcd, 0x67, 0x32, 0x81, 0x44, 0x1c, 0x32,\n  0x59, 0x2b, 0xca, 0xe2, 0x35, 0x89, 0x9a, 0x50, 0xb1, 0x37, 0xe6, 0x8b,\n  0x41, 0x1e, 0x06, 0xcd, 0x65, 0xd5, 0x4a, 0x0e, 0x06, 0x6a, 0xd1, 0xe4,\n  0x81, 0x2f, 0xc6, 0xc9, 0xff, 0xad, 0x35, 0xf2, 0xa1, 0x34, 0x97, 0x97,\n  0xe3, 0x80, 0x4a, 0x7b, 0x0f, 0xb5, 0x5e, 0x71, 0xbc, 0x7e, 0x22, 0xa0,\n  0xab, 0x4f, 0x34, 0xb6, 0x7b, 0xd3, 0x71, 0x87, 0x99, 0x6b, 0x3c, 0xef,\n  0x07, 0x4d, 0x01, 0x8f, 0xd7, 0xe7, 0x7b, 0x67, 0x74, 0x60, 0x70, 0x74,\n  0x70, 0x64, 0x58, 0xd3, 0x79, 0xd9, 0xe4, 0x15, 0xb7, 0x87, 0x03, 0xbe,\n  0x68, 0x77, 0x43, 0x71, 0x63, 0x44, 0x69, 0x77, 0x8c, 0x9c, 0xe8, 0x44,\n  0xfb, 0x36, 0xfa, 0xc2, 0x61, 0x9f, 0x2f, 0x9a, 0x7d, 0xf1, 0xf0, 0xd6,\n  0xf9, 0x83, 0x7b, 0xb7, 0x6f, 0x3b, 0x44, 0x7d, 0xdc, 0xf5, 0x78, 0x8f,\n  0xfe, 0x16, 0x0b, 0xd1, 0x1a, 0x9b, 0x48, 0xee, 0xf1, 0x26, 0xf4, 0x51,\n  0xa2, 0x67, 0xb2, 0xd8, 0xc6, 0xae, 0xc2, 0xd7, 0x7d, 0xd8, 0xc2, 0xbe,\n  0xe2, 0x31, 0x8b, 0x02, 0xef, 0xcc, 0x12, 0x38, 0x45, 0x1c, 0x72, 0x8a,\n  0xb0, 0x38, 0x53, 0x32, 0x0a, 0xc8, 0xc1, 0x52, 0x51, 0x0a, 0x1c, 0x1c,\n  0x92, 0x8e, 0x8e, 0x89, 0xcc, 0x3f, 0x04, 0x69, 0xab, 0xc9, 0xbc, 0x96,\n  0x44, 0xd4, 0x41, 0x73, 0xc9, 0xe4, 0x5b, 0xd5, 0x1a, 0xdb, 0xc0, 0x01,\n  0x6c, 0xdf, 0xc7, 0x22, 0xfe, 0x64, 0x20, 0x49, 0xf6, 0x57, 0xb3, 0x33,\n  0x12, 0x31, 0x9b, 0x75, 0x58, 0x0c, 0x92, 0x28, 0x38, 0x29, 0xea, 0xde,\n  0x96, 0x43, 0x5c, 0x16, 0xf3, 0x98, 0x29, 0xe0, 0x72, 0x8a, 0xc2, 0x2f,\n  0xb3, 0xe3, 0x14, 0x78, 0x79, 0xfb, 0x89, 0x13, 0x3b, 0x28, 0xe0, 0xf2,\n  0xe3, 0x8f, 0x4f, 0xff, 0x05, 0xe0, 0x96, 0xa7, 0x01, 0x78, 0xf9, 0x43,\n  0xed, 0xec, 0xee, 0xbe, 0x70, 0xd5, 0xf5, 0x37, 0x5c, 0x77, 0x13, 0x81,\n  0x5b, 0x6e, 0x6a, 0x5f, 0x58, 0x60, 0xf7, 0x10, 0xb0, 0x65, 0x02, 0xbb,\n  0x4c, 0x73, 0x83, 0x4c, 0xec, 0x6d, 0x98, 0x87, 0x4a, 0x98, 0x3a, 0xe6,\n  0x47, 0x19, 0x53, 0x0c, 0x29, 0x84, 0x8a, 0x30, 0xab, 0x52, 0x98, 0x20,\n  0x3c, 0x1f, 0xce, 0xd9, 0x34, 0x54, 0xdd, 0x00, 0xdc, 0xb6, 0xa3, 0x00,\n  0x85, 0x8d, 0x14, 0xdc, 0x5e, 0x70, 0x68, 0x33, 0x8b, 0x4a, 0x35, 0xb5,\n  0x3a, 0x80, 0x2a, 0x12, 0x56, 0x16, 0xc4, 0x52, 0x51, 0xca, 0x95, 0x4b,\n  0x39, 0xd0, 0xef, 0xef, 0xa1, 0x4c, 0xf5, 0xea, 0xf6, 0x44, 0x8c, 0xd1,\n  0x87, 0xd4, 0x68, 0xbd, 0x67, 0xe0, 0xa4, 0x1c, 0x60, 0x89, 0x53, 0xd5,\n  0xa5, 0x75, 0xc9, 0xba, 0x68, 0x24, 0x14, 0x28, 0x72, 0xdb, 0xcc, 0x46,\n  0x80, 0xbe, 0x2f, 0x41, 0x25, 0xda, 0xbc, 0x1c, 0x6a, 0x82, 0xbd, 0x05,\n  0xd0, 0xef, 0xf2, 0x11, 0x78, 0x58, 0x66, 0x48, 0x4a, 0x6c, 0x27, 0xf8,\n  0x8f, 0x28, 0x4e, 0x48, 0x2d, 0xfa, 0xc6, 0xce, 0xa3, 0x75, 0x7b, 0xfa,\n  0xab, 0x87, 0xb0, 0xc9, 0x3d, 0xad, 0xb1, 0xaa, 0x82, 0x21, 0x25, 0x3f,\n  0xc8, 0x0b, 0x5d, 0x83, 0x6a, 0x8b, 0xba, 0x0f, 0xeb, 0xde, 0x63, 0x25,\n  0xe3, 0x9d, 0xba, 0xca, 0x26, 0x7f, 0x7f, 0x2f, 0x1b, 0xbe, 0xf1, 0xba,\n  0xf1, 0xcb, 0xbb, 0x8b, 0x8c, 0xb1, 0x4a, 0xc7, 0x7d, 0x28, 0x8a, 0x50,\n  0x38, 0x60, 0x2c, 0x32, 0x68, 0xfd, 0x96, 0x96, 0x01, 0xcc, 0x25, 0x1f,\n  0xeb, 0x8f, 0x97, 0xf7, 0xcf, 0x6f, 0x7b, 0x58, 0xb0, 0x19, 0x0f, 0xce,\n  0x3f, 0x8d, 0x69, 0xad, 0x5e, 0x31, 0x71, 0x95, 0x98, 0xd6, 0x49, 0x6c,\n  0x15, 0x5e, 0x23, 0xa6, 0x3c, 0x68, 0xb1, 0x20, 0x2c, 0x77, 0x3b, 0x34,\n  0xbc, 0x92, 0x29, 0x8d, 0xb3, 0x3c, 0x51, 0xb7, 0xe1, 0x22, 0x5b, 0x78,\n  0x51, 0x3c, 0xc9, 0xf6, 0x81, 0x58, 0x47, 0x8b, 0x1c, 0xcb, 0x92, 0x15,\n  0x29, 0x66, 0xe4, 0x92, 0x58, 0x02, 0xa2, 0xa2, 0x04, 0xc9, 0xbe, 0x25,\n  0x36, 0x42, 0xeb, 0xb5, 0xc1, 0x1b, 0x42, 0x24, 0x6d, 0x49, 0x47, 0x5c,\n  0xd1, 0x18, 0x81, 0x58, 0x80, 0x50, 0xec, 0xc2, 0x1c, 0x69, 0xa7, 0xc3,\n  0x99, 0xcf, 0x80, 0x84, 0x7a, 0x98, 0xf3, 0x62, 0x56, 0xbb, 0x18, 0x50,\n  0x02, 0xcd, 0x51, 0x49, 0x7b, 0xbf, 0x4f, 0xcc, 0x98, 0x3e, 0x5d, 0x9b,\n  0xe1, 0x15, 0x7d, 0x06, 0xbe, 0x68, 0x53, 0xd3, 0xce, 0xa3, 0xed, 0x57,\n  0xef, 0xb0, 0x55, 0x38, 0xa7, 0x3d, 0xc7, 0xdc, 0x55, 0xd6, 0xbe, 0x99,\n  0xc4, 0xcd, 0xe3, 0x9d, 0x36, 0x4f, 0xc7, 0xf6, 0xde, 0x83, 0xa3, 0x4a,\n  0xbe, 0x5b, 0xa1, 0xba, 0xed, 0xc4, 0xe8, 0x94, 0x13, 0x4f, 0xf3, 0x77,\n  0x30, 0x69, 0x3e, 0x78, 0xcd, 0xe6, 0x2b, 0x7a, 0x58, 0xf6, 0x0f, 0x7f,\n  0x57, 0x22, 0xe3, 0x8f, 0x39, 0xae, 0x7e, 0x5b, 0xf3, 0xf7, 0xe7, 0xa9,\n  0xdd, 0x57, 0x8f, 0x79, 0x72, 0x07, 0x59, 0x8f, 0xa5, 0x78, 0x3d, 0x5a,\n  0x95, 0x2c, 0xd6, 0x59, 0xd7, 0x59, 0x8f, 0x78, 0x55, 0x51, 0x0b, 0xf7,\n  0xd8, 0x10, 0x5d, 0x9a, 0x94, 0x37, 0xd6, 0x5b, 0x8f, 0xe4, 0x08, 0x0f,\n  0x9a, 0x33, 0xeb, 0xb6, 0xce, 0xad, 0xc7, 0xd2, 0x40, 0x29, 0x5d, 0x8f,\n  0x66, 0x5b, 0x24, 0x2e, 0xad, 0xc7, 0x5c, 0x8c, 0xae, 0xc8, 0x33, 0x10,\n  0xa1, 0x4b, 0xd7, 0x63, 0x1c, 0x32, 0x00, 0x24, 0x99, 0xf5, 0xce, 0xb7,\n  0x58, 0x4e, 0xe9, 0x1c, 0xcb, 0x2c, 0x9e, 0xb8, 0x64, 0xa9, 0x6d, 0xd4,\n  0xc5, 0xeb, 0xbb, 0x37, 0x6d, 0x9a, 0xbe, 0x63, 0xbc, 0x0b, 0x75, 0x4e,\n  0xf5, 0x76, 0xf7, 0xdc, 0x9c, 0xe9, 0xb4, 0x54, 0x99, 0x43, 0x55, 0x37,\n  0x5c, 0x7f, 0xfd, 0x8d, 0x55, 0xe1, 0xbe, 0xe5, 0x3b, 0x33, 0x8b, 0x8b,\n  0xcf, 0xcc, 0x6d, 0xb3, 0xec, 0xda, 0x7b, 0x64, 0x7e, 0x7e, 0x3f, 0x1d,\n  0xb7, 0x8e, 0x7d, 0x8d, 0x0d, 0x91, 0xb5, 0x78, 0x63, 0xc6, 0x6d, 0x43,\n  0xbc, 0xe0, 0x12, 0x58, 0x25, 0x97, 0xe0, 0x21, 0x1b, 0x1e, 0x6f, 0x6d,\n  0x0c, 0x3f, 0xc8, 0x22, 0x45, 0x9f, 0xe4, 0xeb, 0x92, 0x64, 0x74, 0x4e,\n  0x30, 0x93, 0xa8, 0x5b, 0xaa, 0x8b, 0x82, 0xd5, 0x44, 0x78, 0xa2, 0x44,\n  0x6e, 0x27, 0x9a, 0xad, 0xe2, 0x26, 0xb6, 0xb6, 0xed, 0x4c, 0xc6, 0x91,\n  0x2c, 0x65, 0x98, 0x9a, 0x2a, 0x58, 0x4f, 0xb8, 0x17, 0x25, 0x66, 0xa7,\n  0x2d, 0x52, 0xaa, 0x81, 0xc4, 0xf4, 0xb4, 0x10, 0xaf, 0x5f, 0x8f, 0x0a,\n  0xf5, 0xd4, 0xa7, 0x18, 0xa7, 0xac, 0x22, 0x08, 0x66, 0x2e, 0x9f, 0x20,\n  0xe8, 0x6b, 0xff, 0x12, 0x7b, 0x85, 0x65, 0x0b, 0x69, 0xb2, 0x14, 0xf3,\n  0x27, 0x4b, 0x50, 0x66, 0xc8, 0x16, 0xf3, 0x9d, 0x7e, 0x4d, 0x22, 0xce,\n  0x6b, 0x5f, 0xfb, 0x56, 0xf4, 0xd7, 0x06, 0x8f, 0x56, 0x26, 0x4f, 0x76,\n  0xd3, 0x42, 0xac, 0xb6, 0x38, 0x5a, 0x92, 0xee, 0xde, 0x10, 0xae, 0xad,\n  0xf0, 0x9d, 0xca, 0xfe, 0x05, 0x55, 0xe6, 0x88, 0x85, 0x18, 0x08, 0x78,\n  0x7d, 0x96, 0x75, 0x33, 0xb6, 0x73, 0xe7, 0x76, 0x1f, 0x14, 0x73, 0xbb,\n  0x23, 0xab, 0x73, 0xbb, 0xb1, 0x9a, 0x23, 0x87, 0x8e, 0x84, 0x8b, 0xbf,\n  0xbd, 0xb4, 0xbf, 0xb9, 0xe6, 0xb6, 0xa5, 0xab, 0xcf, 0xdf, 0xde, 0x90,\n  0x69, 0x69, 0xdc, 0xc1, 0xba, 0x47, 0x87, 0x1a, 0x07, 0xcc, 0xbf, 0x7b,\n  0xbe, 0xbd, 0xa6, 0xa2, 0x8a, 0xe6, 0x7d, 0xc6, 0x57, 0x2e, 0x60, 0xeb,\n  0xf0, 0xbc, 0x14, 0x43, 0x65, 0x00, 0x03, 0xc9, 0xf9, 0xa4, 0xe9, 0xdd,\n  0x1c, 0x60, 0xa8, 0x89, 0x40, 0xb3, 0xa2, 0x31, 0x00, 0xe7, 0x9e, 0x08,\n  0x2b, 0x62, 0xe4, 0xcb, 0x90, 0xdd, 0x8d, 0xd9, 0x88, 0x44, 0xb4, 0x2b,\n  0x48, 0x76, 0xb7, 0xe8, 0x82, 0x2d, 0x48, 0xee, 0x16, 0xb5, 0x11, 0xf4,\n  0xdc, 0x78, 0xf6, 0x73, 0xd7, 0xa6, 0xba, 0x2b, 0xa2, 0xcd, 0xcd, 0x55,\n  0xe1, 0x4d, 0x4d, 0x83, 0xd3, 0x5d, 0x2d, 0xbb, 0x5f, 0xd9, 0xbc, 0xb4,\n  0xfd, 0x86, 0x1b, 0x5a, 0x6f, 0xa8, 0x9d, 0xaa, 0x89, 0x26, 0x53, 0x8d,\n  0xfe, 0xf8, 0x48, 0x67, 0xeb, 0x62, 0xd3, 0x5e, 0xee, 0xc6, 0x1b, 0xfb,\n  0xa4, 0x1a, 0x14, 0xf7, 0xa2, 0x77, 0xd8, 0x0f, 0x30, 0x76, 0xc8, 0x5f,\n  0xd2, 0x6b, 0x04, 0x1e, 0x20, 0x69, 0x01, 0xcc, 0x04, 0xb1, 0xa7, 0xe0,\n  0x30, 0x62, 0x3f, 0x85, 0x34, 0x01, 0x61, 0x70, 0x90, 0x80, 0xc2, 0xda,\n  0x19, 0x7b, 0x91, 0xc5, 0x62, 0x81, 0xfc, 0xa5, 0x94, 0x98, 0xa7, 0x6d,\n  0x4d, 0x71, 0x80, 0x07, 0x42, 0x32, 0xa3, 0xb9, 0x1f, 0xfa, 0x1a, 0xd3,\n  0x9b, 0x6e, 0xd9, 0xb6, 0xf5, 0x78, 0xc3, 0x87, 0xb5, 0x76, 0x9e, 0xe7,\n  0x8d, 0x56, 0xe1, 0xe8, 0xb6, 0x7f, 0x1f, 0xfe, 0xfc, 0x9b, 0xe8, 0x03,\n  0xd9, 0x15, 0xb4, 0x27, 0xdb, 0x17, 0xe8, 0xb6, 0x9b, 0x6b, 0xea, 0xec,\n  0xa8, 0x79, 0xf9, 0x15, 0xf0, 0x9f, 0xe3, 0xb5, 0xfa, 0x0f, 0x3c, 0x0f,\n  0x29, 0xc8, 0x7b, 0x2f, 0x0f, 0xd9, 0x38, 0x96, 0x33, 0x08, 0xf8, 0xe3,\n  0xca, 0x5c, 0xce, 0xf6, 0xc1, 0x35, 0x39, 0xdb, 0xa9, 0x9a, 0x92, 0x04,\n  0x28, 0xbb, 0x91, 0xb0, 0x12, 0x2b, 0x7e, 0x8a, 0x7c, 0xdc, 0xe9, 0x7a,\n  0xae, 0x82, 0x8b, 0x87, 0x0d, 0x9c, 0x9c, 0xb8, 0x4d, 0xbb, 0x95, 0xc3,\n  0x90, 0x64, 0x17, 0x8b, 0x1a, 0xfb, 0x6a, 0x22, 0xc5, 0xfa, 0x80, 0xa9,\n  0x22, 0x6d, 0xd5, 0xcc, 0xf2, 0x3a, 0x9d, 0x06, 0x7f, 0x44, 0xa3, 0xd7,\n  0xf1, 0xd3, 0x5b, 0xef, 0x9c, 0x1d, 0x34, 0x58, 0x78, 0x4e, 0x69, 0xd0,\n  0x71, 0x5b, 0xe7, 0xa6, 0x0d, 0x36, 0x7c, 0xc3, 0x6a, 0xec, 0x9f, 0x56,\n  0xce, 0xed, 0x2a, 0x51, 0xf7, 0x72, 0x7c, 0xa6, 0x3d, 0x8c, 0x62, 0x86,\n  0xb2, 0xea, 0x12, 0x8d, 0xba, 0xa4, 0xa6, 0xc2, 0x98, 0xfd, 0x25, 0xeb,\n  0xce, 0xfe, 0xae, 0x7a, 0xde, 0x1b, 0x68, 0xad, 0xd1, 0xa2, 0xb2, 0xec,\n  0x4f, 0x92, 0x73, 0x4e, 0xdb, 0xe2, 0x06, 0xe4, 0x82, 0x7c, 0x67, 0xa2,\n  0x13, 0x9c, 0x65, 0x82, 0x4c, 0x05, 0x73, 0xe1, 0x63, 0x1e, 0xa5, 0xa8,\n  0x13, 0x80, 0xf6, 0x59, 0x82, 0xed, 0x72, 0x25, 0x62, 0x05, 0xca, 0x6a,\n  0x07, 0x60, 0x5f, 0x12, 0x16, 0xf1, 0xba, 0x3a, 0x96, 0xb3, 0xa0, 0x61,\n  0xb0, 0x87, 0x10, 0x5d, 0x7c, 0x1c, 0x7f, 0x2a, 0xef, 0x81, 0x73, 0xb6,\n  0x9d, 0xc9, 0x18, 0xca, 0x93, 0x98, 0x59, 0x08, 0x46, 0x54, 0x08, 0xa2,\n  0x53, 0x90, 0xb8, 0xfb, 0xfb, 0x59, 0xfb, 0x1a, 0x9d, 0xbd, 0x2e, 0xe7,\n  0xbc, 0x17, 0xf5, 0x01, 0xb6, 0xea, 0xc4, 0x76, 0xbc, 0xc0, 0x94, 0x78,\n  0x05, 0x4c, 0x0f, 0x0d, 0x4d, 0x3f, 0xfe, 0x38, 0xde, 0x4c, 0x5d, 0xc3,\n  0x99, 0xed, 0x27, 0xe6, 0xba, 0xfb, 0x37, 0x75, 0x62, 0x8d, 0xa0, 0xbf,\n  0x0b, 0xe9, 0xaf, 0xbb, 0xa9, 0xa2, 0x58, 0x28, 0x0e, 0x69, 0x5f, 0xe4,\n  0x86, 0xdb, 0xe6, 0xe6, 0xda, 0xba, 0x0d, 0xe5, 0xfa, 0x50, 0xd5, 0x07,\n  0xaf, 0xdd, 0xb9, 0x73, 0xcb, 0x16, 0xeb, 0xf6, 0xfd, 0xfb, 0x57, 0x8d,\n  0xfb, 0xf2, 0xc7, 0x3c, 0x86, 0xbc, 0x71, 0x97, 0x62, 0x71, 0x4a, 0x2a,\n  0x8f, 0x71, 0x8c, 0x3c, 0x70, 0xc9, 0xb5, 0xa6, 0x56, 0xd3, 0x8c, 0x2e,\n  0x79, 0xe0, 0xa5, 0x0c, 0xaf, 0xe0, 0x4f, 0xe5, 0x3f, 0x71, 0xce, 0xc6,\n  0x33, 0x19, 0x1b, 0xc3, 0x94, 0x27, 0x63, 0x11, 0xfc, 0xd1, 0xa0, 0x48,\n  0x01, 0x48, 0x14, 0x57, 0xe4, 0xa5, 0x89, 0xe7, 0x1c, 0x6f, 0x79, 0x44,\n  0x41, 0xf9, 0xe3, 0x47, 0x3b, 0x1f, 0x87, 0x71, 0x4b, 0xa3, 0x96, 0x89,\n  0x81, 0x12, 0xf2, 0xf8, 0xe7, 0x5a, 0xa7, 0xa6, 0x5a, 0xb9, 0xf1, 0x17,\n  0xe9, 0xa8, 0xaf, 0x93, 0x88, 0x31, 0x80, 0xf6, 0xca, 0x04, 0x90, 0xfd,\n  0x8e, 0x2a, 0xcc, 0xd3, 0x7a, 0xc6, 0x9b, 0x71, 0x03, 0x10, 0x8d, 0x98,\n  0x53, 0x7e, 0x50, 0xcc, 0x29, 0x77, 0x99, 0xcd, 0x24, 0xa7, 0x5c, 0x32,\n  0x05, 0x9d, 0xc0, 0x97, 0x10, 0x12, 0xc5, 0xf3, 0x86, 0xc0, 0x53, 0xbb,\n  0xf8, 0x3f, 0x71, 0xea, 0xec, 0xbf, 0x15, 0x37, 0xb8, 0x50, 0x55, 0x35,\n  0xea, 0xc3, 0xef, 0x33, 0xaf, 0x98, 0xd0, 0x73, 0x78, 0xdf, 0x8f, 0x41,\n  0x7e, 0x92, 0x1e, 0xcb, 0x0f, 0x28, 0xbb, 0xe6, 0xc4, 0x64, 0x21, 0xe1,\n  0xf9, 0x58, 0x5d, 0x27, 0x21, 0x73, 0x12, 0x6e, 0x90, 0x74, 0xaa, 0x20,\n  0x26, 0xa0, 0x81, 0x0f, 0xac, 0x2c, 0x12, 0x0e, 0x92, 0x24, 0x4d, 0x05,\n  0xf5, 0xd6, 0xe6, 0xcb, 0x90, 0xfc, 0x38, 0x75, 0xe9, 0xf8, 0x00, 0x1d,\n  0xff, 0xde, 0xd0, 0xe0, 0xe3, 0xfd, 0x1b, 0x36, 0x0f, 0x15, 0x97, 0xed,\n  0x6a, 0xad, 0x9f, 0xad, 0xdb, 0xb8, 0xb1, 0x7f, 0xec, 0xf4, 0xa5, 0x8d,\n  0x5b, 0x4a, 0xb6, 0xcc, 0x4d, 0xcc, 0x69, 0x6e, 0xef, 0xb9, 0xbe, 0x39,\n  0x53, 0xdf, 0x1e, 0x08, 0x96, 0x6c, 0x6e, 0xef, 0xdc, 0x62, 0x56, 0x18,\n  0xb7, 0x0d, 0x1e, 0x3c, 0x61, 0xb7, 0x8d, 0x56, 0x8e, 0x93, 0xfd, 0x77,\n  0xe5, 0x35, 0xdc, 0xdf, 0xa7, 0xd8, 0x5f, 0x10, 0xbb, 0xe2, 0x20, 0x44,\n  0xc5, 0xd0, 0xe5, 0x0c, 0x51, 0x31, 0x4e, 0x72, 0xb4, 0x2a, 0x08, 0x62,\n  0x6e, 0x9c, 0x02, 0x41, 0x7f, 0x55, 0x4a, 0xba, 0xca, 0xf3, 0xdd, 0x41,\n  0xc5, 0x70, 0x51, 0x81, 0xa8, 0xd3, 0x5a, 0x6e, 0x9f, 0xef, 0x08, 0xca,\n  0x98, 0x7d, 0xde, 0x70, 0x10, 0x8c, 0x85, 0x48, 0xd8, 0x6c, 0x8d, 0x84,\n  0x20, 0xbd, 0xdc, 0x99, 0x37, 0x88, 0x34, 0x61, 0xf9, 0x5c, 0xb6, 0x79,\n  0x7d, 0x2e, 0xbb, 0xfc, 0x57, 0x03, 0x93, 0xd6, 0x2a, 0x7d, 0x30, 0x58,\n  0x51, 0x72, 0xfc, 0xf8, 0xc4, 0xc8, 0xd0, 0xe8, 0x96, 0xf1, 0xc6, 0x7a,\n  0x9a, 0x5b, 0xde, 0x37, 0x3c, 0x23, 0xf0, 0x3d, 0xea, 0x9a, 0x06, 0xf4,\n  0x56, 0x4f, 0x65, 0xff, 0xd2, 0x40, 0x7b, 0xc7, 0x78, 0x4f, 0x69, 0xd4,\n  0x17, 0xab, 0x6e, 0x10, 0x71, 0x36, 0xd3, 0x78, 0x6e, 0x9d, 0xe4, 0x6c,\n  0xfe, 0xdd, 0x73, 0xcb, 0x0b, 0x26, 0x00, 0x6a, 0xee, 0x14, 0xb9, 0xcf,\n  0x95, 0x5b, 0xee, 0x2c, 0x08, 0xcc, 0xa4, 0xa9, 0xe5, 0x24, 0xb7, 0xbc,\n  0xb8, 0xb7, 0xaf, 0xbb, 0xdd, 0x5f, 0x69, 0x45, 0xf6, 0x86, 0xf8, 0xc2,\n  0x79, 0x1b, 0xf6, 0xf5, 0x1f, 0x39, 0xf9, 0xf9, 0x2f, 0x4d, 0x1d, 0x6d,\n  0x18, 0x41, 0xcf, 0xef, 0x9e, 0x1e, 0xdf, 0x6c, 0xd4, 0x0e, 0x68, 0x0d,\n  0x17, 0x9f, 0xbf, 0xe9, 0xf8, 0xc6, 0xcf, 0x7c, 0xf2, 0x2f, 0x2f, 0xf6,\n  0x0e, 0x7d, 0xfe, 0x83, 0x17, 0x5f, 0x2d, 0xea, 0x3f, 0xdb, 0x39, 0x15,\n  0x5e, 0x83, 0x01, 0xa6, 0x0c, 0xf9, 0x33, 0x5a, 0x6c, 0x8c, 0x69, 0xd0,\n  0xa0, 0x17, 0x8a, 0x06, 0xc8, 0xaa, 0xb5, 0x86, 0xd3, 0xf0, 0xdc, 0x15,\n  0xd8, 0x86, 0x11, 0x20, 0xfb, 0xf7, 0x00, 0x54, 0xef, 0x90, 0x6c, 0x53,\n  0x35, 0xb6, 0x57, 0x39, 0x66, 0x41, 0xa5, 0x84, 0x0a, 0xf4, 0x34, 0xcc,\n  0xc1, 0x43, 0x6a, 0x33, 0xbe, 0xe7, 0x43, 0xca, 0x05, 0x15, 0x39, 0x08,\n  0x14, 0x5f, 0xb1, 0xa4, 0x95, 0x63, 0x60, 0x61, 0xf9, 0xa7, 0xdf, 0xed,\n  0x05, 0x70, 0x54, 0x29, 0x3f, 0x8e, 0x40, 0xb4, 0x49, 0x0f, 0xe3, 0xe7,\n  0x60, 0x2f, 0x2a, 0x7c, 0xf8, 0xbd, 0x9f, 0x83, 0x38, 0x98, 0x60, 0xb0,\n  0x18, 0x31, 0x89, 0x18, 0xe4, 0x71, 0xe7, 0xa1, 0xd6, 0x9b, 0x8c, 0x06,\n  0x3c, 0x0b, 0x01, 0x14, 0xd0, 0xcb, 0xb0, 0x9e, 0x44, 0x1b, 0x89, 0x41,\n  0xb5, 0x27, 0x33, 0x56, 0x4a, 0x20, 0x69, 0x14, 0x6f, 0x6c, 0xe4, 0x54,\n  0x3d, 0x2e, 0x97, 0x7e, 0x02, 0x75, 0xc4, 0xba, 0xe3, 0x38, 0x36, 0x94,\n  0x46, 0xdc, 0x4a, 0xa4, 0x98, 0x6e, 0xe8, 0xe8, 0xec, 0xb8, 0xf8, 0xce,\n  0x8e, 0xae, 0xce, 0x05, 0x3d, 0xef, 0x1a, 0xad, 0x9e, 0xe8, 0xda, 0x38,\n  0xd3, 0xd3, 0xd3, 0xa3, 0x01, 0xf5, 0xa3, 0x22, 0xa8, 0x4f, 0x19, 0x7f,\n  0xbc, 0x3c, 0x7a, 0xd7, 0x5d, 0xbd, 0x77, 0xdf, 0xdd, 0x1b, 0xaa, 0xea,\n  0xdb, 0xba, 0xcd, 0xb4, 0x63, 0xff, 0x91, 0xf9, 0x85, 0x7d, 0x92, 0x7c,\n  0xd8, 0x8e, 0x3e, 0x8b, 0xe7, 0x47, 0xcf, 0x8c, 0x53, 0xd2, 0x04, 0x60,\n  0xf1, 0x2a, 0x18, 0x74, 0x05, 0xa0, 0x03, 0x5f, 0x83, 0x19, 0x87, 0x86,\n  0xec, 0xb1, 0x0b, 0xbc, 0x74, 0x26, 0xe6, 0x05, 0x78, 0xef, 0x53, 0x24,\n  0x35, 0x80, 0xb4, 0x29, 0xb8, 0x4d, 0x03, 0xc6, 0xcc, 0x24, 0x07, 0xd1,\n  0x97, 0x8c, 0xca, 0x03, 0x80, 0x74, 0x5c, 0x94, 0x14, 0xbb, 0x79, 0xfe,\n  0x74, 0xd3, 0x6f, 0xa0, 0x3f, 0xec, 0xd9, 0xe5, 0x51, 0xda, 0x07, 0xbe,\n  0x0d, 0xeb, 0x24, 0x49, 0xe6, 0xe6, 0xc7, 0x12, 0x21, 0x96, 0x15, 0x72,\n  0x45, 0xb6, 0xf0, 0xcf, 0x78, 0x07, 0xbe, 0x02, 0x12, 0x7f, 0xaf, 0x51,\n  0x13, 0xfb, 0x49, 0xa7, 0xd5, 0x73, 0x60, 0x41, 0x81, 0x16, 0xc0, 0x2f,\n  0x68, 0x54, 0x10, 0xfb, 0x4c, 0x3c, 0x77, 0x15, 0x05, 0x8d, 0x19, 0xad,\n  0x16, 0xf2, 0xbb, 0xc8, 0x13, 0xd4, 0x83, 0xb7, 0xea, 0x01, 0xe2, 0xbe,\n  0x8b, 0x47, 0x83, 0xc5, 0x01, 0xbf, 0xc7, 0x0d, 0x6e, 0x3b, 0x19, 0x71,\n  0x04, 0x80, 0x17, 0x93, 0x28, 0x29, 0xb9, 0xef, 0xf2, 0xa7, 0x41, 0x0e,\n  0x9f, 0xa8, 0x2d, 0xcc, 0x29, 0x87, 0xbf, 0xd9, 0x7b, 0xe6, 0x66, 0x93,\n  0xd2, 0x44, 0x6c, 0x3f, 0x38, 0xdc, 0x31, 0x75, 0xde, 0x58, 0xeb, 0x74,\n  0x8f, 0x5e, 0xe1, 0x9e, 0xa8, 0xba, 0x3c, 0xa6, 0xf0, 0x6c, 0x65, 0x43,\n  0x5b, 0xf7, 0x64, 0xff, 0x48, 0x26, 0x02, 0xcd, 0x7c, 0x60, 0x76, 0x32,\n  0xfb, 0x53, 0xfc, 0xbf, 0x1d, 0xdb, 0xb2, 0x7f, 0x60, 0x5d, 0x7d, 0xa5,\n  0x25, 0xb3, 0x15, 0x65, 0xe2, 0x7c, 0x90, 0x58, 0x5c, 0x1f, 0x73, 0xd5,\n  0xa3, 0x45, 0x28, 0x47, 0x8a, 0x78, 0xe1, 0xe8, 0x88, 0x25, 0xa9, 0xc9,\n  0x1b, 0x17, 0x16, 0x51, 0x22, 0x1d, 0x92, 0x85, 0x2d, 0xd5, 0xea, 0x02,\n  0xff, 0x4e, 0x61, 0x6b, 0xe2, 0xda, 0x01, 0x6e, 0x5c, 0x35, 0x7c, 0x1f,\n  0xf2, 0x69, 0xdf, 0x6d, 0xf8, 0x34, 0x23, 0x7d, 0x6a, 0x61, 0x69, 0x83,\n  0x34, 0xe0, 0x23, 0xc7, 0x67, 0x3a, 0x61, 0xb0, 0x45, 0x5b, 0xf2, 0x87,\n  0x39, 0x75, 0xa5, 0x3c, 0x3e, 0xf1, 0x4c, 0xed, 0x4f, 0xec, 0x57, 0x19,\n  0x17, 0x73, 0x07, 0x8d, 0x5a, 0xd3, 0x81, 0x50, 0xb5, 0xe9, 0x94, 0x1c,\n  0xa4, 0xa9, 0x7b, 0xe0, 0x57, 0x85, 0xfc, 0xeb, 0x0c, 0x8d, 0x68, 0xf2,\n  0x42, 0x94, 0x93, 0x98, 0xe8, 0x04, 0x60, 0x13, 0x4a, 0x05, 0x35, 0x17,\n  0xe9, 0x60, 0xe9, 0x6b, 0x8a, 0x40, 0xd2, 0x00, 0x1e, 0xc5, 0x3a, 0x2d,\n  0x32, 0x7e, 0xf9, 0xa6, 0x18, 0x4b, 0x8a, 0x5b, 0xa0, 0x5c, 0x03, 0xbc,\n  0x34, 0x35, 0x36, 0xb3, 0x1d, 0xff, 0x4b, 0x18, 0x16, 0xa5, 0x04, 0x07,\n  0x71, 0x55, 0x83, 0x3a, 0xa9, 0xcc, 0x8d, 0xb5, 0x1e, 0x9d, 0x6e, 0xaf,\n  0xb1, 0x97, 0xd9, 0xd5, 0xae, 0x3a, 0x77, 0x66, 0x63, 0x5b, 0xfb, 0xc0,\n  0x74, 0xb7, 0x56, 0xe1, 0x1f, 0xdf, 0xc0, 0x7e, 0xf5, 0xa3, 0x58, 0x75,\n  0x1e, 0xc7, 0x7a, 0xea, 0xbf, 0x7e, 0x5b, 0xb3, 0xad, 0x27, 0xfb, 0x2b,\n  0xd6, 0xbd, 0xad, 0xba, 0x96, 0xa3, 0xb6, 0x1f, 0x9e, 0x4b, 0xf6, 0x25,\n  0x52, 0x5b, 0x2c, 0xc8, 0x0c, 0x66, 0xfa, 0xd4, 0x24, 0x29, 0x91, 0x61,\n  0xd5, 0x82, 0x9a, 0x15, 0xa4, 0xd9, 0x61, 0x04, 0xa4, 0x16, 0x76, 0x63,\n  0x21, 0x22, 0xaa, 0xf9, 0x74, 0x7e, 0xb4, 0x12, 0x97, 0x32, 0x4c, 0x30,\n  0xe0, 0x71, 0xe3, 0x37, 0xb8, 0xe8, 0xaa, 0x72, 0x06, 0x75, 0x58, 0xff,\n  0x96, 0x91, 0xbf, 0x04, 0x67, 0x81, 0x8c, 0xb0, 0xcb, 0x05, 0xba, 0x26,\n  0x5e, 0x9b, 0xdc, 0x13, 0xd9, 0x50, 0xbc, 0xa7, 0x4e, 0x9a, 0x9f, 0xc1,\n  0xeb, 0xaf, 0xba, 0xbc, 0xb5, 0xab, 0xb6, 0xf5, 0x66, 0xd6, 0x35, 0x36,\n  0x54, 0xd9, 0x16, 0x56, 0xdd, 0x49, 0x66, 0xe8, 0xcc, 0x19, 0xe4, 0x2f,\n  0xaf, 0x88, 0x55, 0x51, 0xdc, 0xba, 0x95, 0x37, 0xd9, 0x6f, 0xb2, 0x2f,\n  0x31, 0x61, 0xac, 0x2f, 0x9d, 0xc9, 0x18, 0x3c, 0x08, 0xa9, 0xcc, 0x88,\n  0x47, 0xe0, 0x74, 0x90, 0x52, 0x4a, 0xcb, 0x19, 0x41, 0xa3, 0xd2, 0x08,\n  0xaa, 0x2b, 0xa0, 0xc7, 0x44, 0xbe, 0x61, 0xf1, 0x80, 0x15, 0x13, 0xa4,\n  0x5a, 0xd4, 0xa9, 0x59, 0x95, 0x8a, 0x46, 0x97, 0x2c, 0x29, 0x44, 0x59,\n  0x41, 0xcb, 0xa0, 0x54, 0xbf, 0xf7, 0x43, 0x22, 0x14, 0xaa, 0x62, 0x89,\n  0x21, 0xbe, 0x75, 0x4f, 0xa6, 0x52, 0x7a, 0x06, 0x9a, 0x6b, 0x04, 0x46,\n  0xb3, 0xf7, 0xdd, 0x9f, 0x00, 0x11, 0x0b, 0x21, 0xe8, 0xc9, 0x92, 0x48,\n  0x45, 0xb4, 0x02, 0x2f, 0x6a, 0x5f, 0x91, 0xdb, 0x61, 0x33, 0xea, 0x45,\n  0x0c, 0xa1, 0x30, 0x0a, 0xeb, 0xf3, 0x30, 0x84, 0x20, 0x6c, 0xd5, 0x6c,\n  0x4b, 0xad, 0x89, 0x24, 0x82, 0x3d, 0xda, 0x99, 0xdb, 0x9b, 0xd9, 0xda,\n  0xd6, 0x81, 0x89, 0x09, 0xff, 0xf4, 0xef, 0x47, 0xf3, 0x83, 0x88, 0x7e,\n  0x3f, 0x90, 0xaa, 0x09, 0xf9, 0xbd, 0x81, 0x20, 0xfb, 0x52, 0xcf, 0x86,\n  0xb6, 0xd1, 0x6c, 0x39, 0x7a, 0x2e, 0xfb, 0xf4, 0x62, 0x41, 0x0c, 0x51,\n  0xa8, 0x67, 0xe1, 0x07, 0xe5, 0x3e, 0x67, 0xa4, 0xbc, 0x16, 0x92, 0x4a,\n  0xdb, 0x31, 0xdf, 0xff, 0x8c, 0x3d, 0xc3, 0xf8, 0x99, 0x52, 0xb0, 0x2c,\n  0xa2, 0xb0, 0xe0, 0x94, 0x4a, 0x30, 0xf3, 0x48, 0x4c, 0x37, 0x85, 0x81,\n  0x18, 0x92, 0x82, 0x34, 0xb0, 0xad, 0x55, 0x1c, 0x40, 0x4c, 0xa0, 0xb4,\n  0xb8, 0x14, 0x2a, 0xc4, 0x31, 0x7e, 0xe4, 0x57, 0xd2, 0x54, 0x02, 0xd0,\n  0x8e, 0x68, 0xe6, 0x80, 0x64, 0xf2, 0x01, 0x22, 0x19, 0x39, 0xfd, 0x71,\n  0xd2, 0xa3, 0x20, 0xb2, 0x57, 0xbf, 0x3d, 0x3e, 0x53, 0x19, 0xab, 0x68,\n  0xf1, 0x5f, 0x78, 0xf8, 0xa1, 0xcf, 0xf5, 0x8c, 0x34, 0x55, 0x7f, 0x7c,\n  0xc3, 0xf5, 0x2d, 0xfd, 0x8b, 0xa3, 0xc9, 0xca, 0xba, 0xba, 0x12, 0x7f,\n  0x05, 0x7b, 0x66, 0x62, 0xb0, 0x7e, 0x34, 0xe6, 0xdf, 0xd0, 0x59, 0x31,\n  0xbd, 0x6b, 0xa4, 0xa6, 0xb9, 0xa6, 0x35, 0x70, 0x7b, 0xeb, 0x35, 0xf1,\n  0x4d, 0x1b, 0x7b, 0x66, 0xba, 0x2a, 0x4a, 0xcb, 0x1a, 0x8a, 0xe3, 0xf5,\n  0x91, 0x92, 0x6a, 0x39, 0x17, 0x25, 0xc4, 0xfe, 0x18, 0x9b, 0x59, 0x41,\n  0xb0, 0x4c, 0x4d, 0x46, 0x16, 0xf5, 0x43, 0xea, 0x37, 0x56, 0x84, 0xf6,\n  0x12, 0x7c, 0x18, 0xd1, 0xc3, 0xe6, 0x74, 0xf8, 0x3c, 0x8e, 0xa0, 0x33,\n  0x68, 0x8f, 0x2a, 0xb0, 0x09, 0x84, 0x24, 0xfd, 0x8d, 0xa0, 0x47, 0x90,\n  0x38, 0x42, 0xa7, 0xa3, 0xf0, 0x3c, 0xf4, 0x7b, 0xe5, 0x95, 0x57, 0x5e,\n  0xd4, 0x7b, 0xa8, 0xf5, 0xf2, 0x13, 0x57, 0x4d, 0x34, 0x7b, 0x5a, 0x2b,\n  0x4b, 0x96, 0x8e, 0x8f, 0xf5, 0xc3, 0x21, 0xe8, 0x00, 0x3a, 0x53, 0xba,\n  0xbb, 0xfb, 0x92, 0x1b, 0xdb, 0x8e, 0x0d, 0x9f, 0x7f, 0x9a, 0x9d, 0xdb,\n  0x11, 0x71, 0x37, 0xc5, 0x82, 0xdd, 0xd9, 0x9e, 0x3d, 0x13, 0xa3, 0xbb,\n  0x16, 0x66, 0x36, 0xed, 0x91, 0x75, 0x5a, 0x74, 0x03, 0xd6, 0x7b, 0x1c,\n  0xcc, 0xe5, 0x94, 0x2b, 0xb5, 0x78, 0xd5, 0x30, 0x56, 0x9e, 0xa5, 0x60,\n  0x1c, 0xf8, 0x37, 0x85, 0xf4, 0x9b, 0x78, 0xd6, 0xe4, 0xcd, 0x01, 0xbe,\n  0x1c, 0x1b, 0x92, 0xa0, 0xd2, 0x09, 0xff, 0x88, 0x08, 0xef, 0x44, 0x36,\n  0x48, 0x91, 0x74, 0x6b, 0x9b, 0x90, 0xc0, 0xba, 0x3c, 0x0c, 0x71, 0x07,\n  0x72, 0x08, 0x52, 0xfd, 0x85, 0x1c, 0x04, 0x8c, 0x5d, 0x12, 0x8c, 0x83,\n  0x86, 0x90, 0x51, 0xad, 0x2f, 0x36, 0x76, 0x4c, 0x3e, 0xfd, 0x34, 0x08,\n  0x0a, 0xef, 0x10, 0x1b, 0x26, 0xa1, 0x91, 0x4b, 0xa3, 0x3f, 0xeb, 0x7a,\n  0x8d, 0x53, 0x6f, 0xab, 0xae, 0x87, 0x33, 0x5c, 0xbc, 0xea, 0xd8, 0x62,\n  0x4e, 0x85, 0x8c, 0x8a, 0x29, 0xb6, 0x9f, 0x75, 0xc9, 0x78, 0x2a, 0x2e,\n  0x31, 0x4e, 0x74, 0x82, 0xe4, 0x23, 0xb8, 0x0b, 0x73, 0x17, 0x0e, 0x49,\n  0xb9, 0x0b, 0x4e, 0x9a, 0xbb, 0x80, 0x5f, 0x27, 0xe9, 0xf9, 0xb7, 0x93,\n  0xd8, 0xb4, 0x6d, 0x19, 0xad, 0x5b, 0xc7, 0xf2, 0x4c, 0x11, 0x54, 0x31,\n  0x91, 0xb1, 0x55, 0xf0, 0xa7, 0xc8, 0xf9, 0xd2, 0xc1, 0x21, 0x09, 0xcd,\n  0x29, 0x67, 0xdf, 0x04, 0x0a, 0x0a, 0x33, 0x1c, 0x5b, 0xd3, 0x62, 0x26,\n  0xa3, 0x8e, 0x46, 0x22, 0x66, 0x2b, 0xa9, 0x06, 0x10, 0x4d, 0xaf, 0x05,\n  0x54, 0xb1, 0xe7, 0x2d, 0x25, 0xf4, 0x2f, 0x4d, 0x6d, 0xe3, 0xd4, 0xb1,\n  0xbf, 0x25, 0xbd, 0x6d, 0x7b, 0xbb, 0xc9, 0x6b, 0x32, 0x24, 0x1c, 0x3d,\n  0x1b, 0xaf, 0x7f, 0xb2, 0xb7, 0x63, 0x7e, 0xfb, 0xf2, 0x5b, 0x9c, 0xba,\n  0x37, 0x19, 0x9f, 0xdf, 0xf9, 0x1f, 0x00, 0x42, 0x28, 0x28, 0xc7, 0xf2,\n  0xe7, 0xd3, 0xc2, 0xec, 0xca, 0x9b, 0x4f, 0x63, 0xde, 0x7c, 0x72, 0xd2,\n  0x6f, 0x32, 0xba, 0x8a, 0x0c, 0xac, 0x72, 0x4c, 0x3e, 0x75, 0x75, 0x30,\n  0xb2, 0xe6, 0xce, 0xa3, 0xdc, 0x0d, 0x82, 0xae, 0x22, 0xce, 0x9b, 0x05,\n  0x59, 0x14, 0x85, 0xf3, 0x66, 0x5e, 0x3b, 0x67, 0xab, 0x66, 0x6c, 0xf9,\n  0x75, 0x3a, 0x61, 0x88, 0x29, 0x5e, 0x79, 0x13, 0xdb, 0x12, 0x6e, 0xc6,\n  0x09, 0x18, 0xb0, 0x36, 0x2c, 0x19, 0xed, 0x24, 0x29, 0x4b, 0x06, 0xed,\n  0x39, 0xb8, 0x0a, 0xb7, 0xdd, 0x62, 0xd2, 0x91, 0x0d, 0x15, 0x20, 0xe7,\n  0x73, 0xb8, 0xed, 0x22, 0x54, 0x4f, 0x3e, 0x5a, 0x7b, 0xf9, 0x85, 0x57,\n  0x35, 0xd6, 0x9d, 0x42, 0x0f, 0x1c, 0xd9, 0xb6, 0x7f, 0x72, 0x34, 0xda,\n  0x59, 0xec, 0xeb, 0xd6, 0x5c, 0x73, 0x62, 0xf4, 0x90, 0xaf, 0xb7, 0x77,\n  0xff, 0xbe, 0xa9, 0x9d, 0x56, 0xd3, 0xb0, 0x09, 0xca, 0xba, 0xac, 0xbc,\n  0xb5, 0x32, 0x86, 0xae, 0xc7, 0xba, 0x9a, 0x8f, 0x49, 0x30, 0xc7, 0x33,\n  0x06, 0x2d, 0x12, 0x90, 0x13, 0xb3, 0xba, 0x0b, 0x32, 0x82, 0xe5, 0x28,\n  0x52, 0x84, 0xb7, 0x19, 0x0e, 0x09, 0x7b, 0x55, 0x08, 0x82, 0x58, 0x15,\n  0x00, 0x3c, 0xa9, 0x60, 0x94, 0x0a, 0x25, 0x04, 0xb3, 0x1e, 0x60, 0x49,\n  0x68, 0x02, 0xd1, 0x61, 0xd7, 0x6b, 0xa7, 0x54, 0x2a, 0x66, 0x44, 0x40,\n  0x13, 0x85, 0x72, 0x6c, 0x26, 0x63, 0x09, 0xf8, 0xa3, 0x61, 0x7f, 0x22,\n  0x90, 0xc0, 0x56, 0x0d, 0x36, 0x6b, 0x82, 0x1a, 0x38, 0x43, 0x34, 0xe7,\n  0x4e, 0xcd, 0xcc, 0xe4, 0xe8, 0x90, 0xc4, 0x67, 0x8b, 0xb3, 0xcf, 0xd1,\n  0x71, 0x61, 0x39, 0x1a, 0xfb, 0x5c, 0x75, 0x6b, 0x5b, 0x5b, 0xca, 0xea,\n  0xd3, 0x4d, 0xef, 0xde, 0x1d, 0x29, 0xf3, 0xf9, 0xb5, 0x95, 0xd6, 0xb1,\n  0xae, 0x0d, 0xee, 0xa2, 0xb0, 0x3f, 0xe9, 0xd5, 0xa0, 0x54, 0x73, 0x45,\n  0x6d, 0xbd, 0x56, 0x8b, 0x4c, 0xd9, 0xdd, 0x75, 0xd9, 0x67, 0x2b, 0xab,\n  0xd5, 0xdd, 0x0a, 0x61, 0x92, 0xf5, 0x7b, 0x1d, 0x6e, 0x8f, 0xb9, 0x22,\n  0x2e, 0xad, 0xf3, 0x66, 0x76, 0x14, 0xeb, 0x42, 0x4e, 0x66, 0xe2, 0x51,\n  0x1d, 0x29, 0x13, 0x24, 0x95, 0x95, 0x25, 0x23, 0x22, 0xe5, 0x96, 0x88,\n  0x9b, 0xfb, 0x60, 0x0e, 0x9e, 0xc1, 0x27, 0xdd, 0x13, 0x79, 0x81, 0x98,\n  0x3d, 0xc7, 0x72, 0xc8, 0x0c, 0x1a, 0x3c, 0x0e, 0xb3, 0x95, 0xa6, 0x33,\n  0x04, 0xd7, 0xe8, 0x71, 0xa4, 0x86, 0x50, 0x18, 0x65, 0x9b, 0x65, 0x6d,\n  0x26, 0xb5, 0xb0, 0x54, 0xbf, 0x29, 0x5f, 0x8f, 0xc1, 0xca, 0xcd, 0xef,\n  0xb3, 0x6f, 0x8a, 0xe7, 0x55, 0x6f, 0xa2, 0xa7, 0xc9, 0x59, 0x5a, 0x57,\n  0x66, 0xa3, 0x1a, 0xab, 0x32, 0x9a, 0xf7, 0xc2, 0x8b, 0x39, 0xb6, 0x0a,\n  0x2f, 0xa6, 0x98, 0x29, 0x8e, 0x86, 0xcc, 0xe6, 0x28, 0xc5, 0x8b, 0x49,\n  0x8b, 0x78, 0xb6, 0x94, 0x37, 0x57, 0xe3, 0xc5, 0xc4, 0xe2, 0x3d, 0xaa,\n  0xce, 0xfd, 0x1b, 0x4b, 0x06, 0x5d, 0x1e, 0x57, 0xc6, 0x7b, 0x83, 0xf9,\n  0xe9, 0xff, 0xe0, 0x87, 0x7a, 0xcb, 0x3a, 0xbc, 0x9e, 0xf6, 0x8a, 0xae,\n  0x03, 0x19, 0xfe, 0xef, 0xed, 0x9b, 0x76, 0x57, 0x9b, 0x75, 0x7d, 0x6a,\n  0xd3, 0xdd, 0xed, 0xd3, 0x5b, 0x2d, 0xfa, 0x61, 0x83, 0xb1, 0xfe, 0xc8,\n  0x0c, 0xcd, 0x72, 0xc6, 0xb2, 0x61, 0x1e, 0xf7, 0x13, 0x72, 0x0a, 0xeb,\n  0x98, 0x2b, 0x32, 0x45, 0x55, 0x95, 0xa5, 0x25, 0x51, 0x3f, 0xac, 0x09,\n  0x01, 0x31, 0x7a, 0xa5, 0xc2, 0x8e, 0x79, 0xc0, 0x46, 0x20, 0x3b, 0x44,\n  0xac, 0x77, 0x31, 0x5c, 0x8b, 0xae, 0xa2, 0xdc, 0xa9, 0xbb, 0x18, 0xf7,\n  0x47, 0x56, 0x5b, 0x94, 0x08, 0x24, 0xda, 0x90, 0x39, 0x67, 0xbb, 0x99,\n  0x8c, 0x29, 0x1e, 0xab, 0xad, 0x81, 0x4c, 0xc0, 0x44, 0x38, 0x6e, 0x0b,\n  0xab, 0xe0, 0xe8, 0xb2, 0x5e, 0xc6, 0x86, 0x20, 0x15, 0x92, 0xc4, 0x80,\n  0xc1, 0x1c, 0x82, 0x04, 0xc9, 0x0a, 0x83, 0x24, 0xc0, 0x68, 0x2c, 0xe6,\n  0xac, 0x85, 0xc4, 0x30, 0xb8, 0xc7, 0xd5, 0xa2, 0xf3, 0x77, 0xa7, 0x27,\n  0xfc, 0x0a, 0x5d, 0xf7, 0xd0, 0xd0, 0x05, 0x97, 0x5c, 0x38, 0x30, 0x72,\n  0x51, 0xd7, 0x08, 0x8b, 0xf8, 0xba, 0xc3, 0x5b, 0x0e, 0xeb, 0x1b, 0x90,\n  0x37, 0xd3, 0xc7, 0xa3, 0xa8, 0xae, 0x7f, 0x2e, 0xfb, 0x53, 0xa1, 0xb7,\n  0x75, 0xac, 0x1f, 0x71, 0x9a, 0x0f, 0xdc, 0x9e, 0x28, 0xe9, 0xf9, 0xb2,\n  0xa1, 0xcd, 0x90, 0x7d, 0xf6, 0xd8, 0xf9, 0xa1, 0xb1, 0xd2, 0xb1, 0x6e,\n  0xbb, 0xae, 0x5c, 0x3d, 0x76, 0x64, 0xb7, 0x06, 0xd9, 0x16, 0x67, 0xea,\n  0xba, 0x5b, 0x9f, 0x56, 0x2a, 0xea, 0x87, 0xc7, 0xa7, 0x16, 0x45, 0x5c,\n  0x1a, 0x07, 0x5e, 0x5b, 0x45, 0xe0, 0x67, 0x07, 0xd5, 0x81, 0xd8, 0x66,\n  0x80, 0x4b, 0x83, 0x72, 0x7e, 0x76, 0x92, 0xc9, 0x53, 0x10, 0x1f, 0xe0,\n  0x04, 0xc1, 0xba, 0x5e, 0x50, 0xc0, 0x63, 0x36, 0xbb, 0xdb, 0x42, 0xfd,\n  0xec, 0xf4, 0x60, 0xa5, 0x9e, 0x20, 0xd8, 0x08, 0x78, 0xc0, 0x10, 0x0e,\n  0x00, 0x25, 0xc9, 0x04, 0x6e, 0xd3, 0x14, 0x8b, 0x8c, 0xda, 0x80, 0xe6,\n  0xf3, 0xbb, 0x9f, 0xfd, 0xfd, 0xd3, 0x4f, 0xee, 0xfb, 0xb2, 0xab, 0x6c,\n  0x6a, 0xd3, 0xb2, 0x19, 0xfd, 0x21, 0x7b, 0x4c, 0x5f, 0x66, 0xe1, 0x8c,\n  0x31, 0xed, 0xa3, 0x2f, 0x54, 0xb7, 0x25, 0xb3, 0xcb, 0xaf, 0x29, 0x62,\n  0xdf, 0xfd, 0x0f, 0x33, 0xd9, 0x93, 0xa1, 0x9f, 0xbb, 0xf0, 0x5c, 0x3a,\n  0xb0, 0x14, 0xc0, 0x0b, 0xd4, 0x53, 0xe4, 0x10, 0x41, 0x74, 0xf0, 0x22,\n  0xd6, 0xb3, 0xbc, 0xb4, 0x44, 0xac, 0x14, 0x3e, 0x0c, 0x21, 0xaa, 0x53,\n  0xe6, 0xf5, 0xf6, 0x20, 0xc9, 0xf1, 0x14, 0xb9, 0x51, 0x0e, 0x61, 0xd0,\n  0xbb, 0x9c, 0x4e, 0x9f, 0xcb, 0x67, 0x75, 0x44, 0xc8, 0x69, 0x2a, 0x74,\n  0x5a, 0x5a, 0x11, 0x04, 0xf4, 0xc6, 0xac, 0x80, 0x0e, 0x93, 0x39, 0x49,\n  0xd7, 0x72, 0x9b, 0xa4, 0xa5, 0x31, 0x34, 0x34, 0x95, 0xfd, 0xe3, 0xf4,\n  0x26, 0xd4, 0x33, 0xd5, 0x85, 0x90, 0x3d, 0x6b, 0x44, 0x5a, 0x58, 0x21,\n  0x3b, 0x80, 0xe4, 0xbf, 0x40, 0x96, 0xda, 0x5f, 0x3c, 0x63, 0x44, 0xee,\n  0x85, 0xb9, 0x5a, 0xe5, 0x95, 0x24, 0xbf, 0x2e, 0x8b, 0xff, 0xba, 0x05,\n  0xf7, 0xbd, 0x88, 0xd9, 0x2f, 0xf6, 0x12, 0x13, 0x1a, 0xdb, 0xc1, 0x3a,\n  0x70, 0x6f, 0x60, 0xad, 0x62, 0x10, 0xeb, 0x7a, 0xfd, 0x9e, 0x8c, 0x15,\n  0xfc, 0x48, 0x05, 0x77, 0x64, 0xb9, 0x6f, 0x96, 0x73, 0x1e, 0x0e, 0x8a,\n  0xb8, 0x9d, 0x00, 0x51, 0x21, 0x02, 0x4e, 0x4a, 0x2b, 0x8c, 0xe2, 0x79,\n  0x3e, 0xe6, 0x8c, 0x46, 0xc8, 0x04, 0xc4, 0x73, 0x63, 0x11, 0x85, 0xbe,\n  0x92, 0x14, 0xe7, 0xc2, 0xe3, 0x61, 0xa7, 0x7a, 0x35, 0x7c, 0xd1, 0xa6,\n  0x06, 0x63, 0x58, 0xaf, 0xd5, 0x07, 0x0c, 0x25, 0xbd, 0xc9, 0xdf, 0xfc,\n  0x66, 0x7a, 0x6a, 0xd9, 0x82, 0xd4, 0x4b, 0x65, 0x19, 0x8e, 0x1b, 0xe3,\n  0xf8, 0xf2, 0x91, 0x74, 0x55, 0x5b, 0xd5, 0x4b, 0x3f, 0xb2, 0x88, 0x98,\n  0x37, 0xe8, 0x05, 0x62, 0xa7, 0xd6, 0x65, 0x52, 0x1a, 0x04, 0x41, 0xea,\n  0x00, 0x22, 0x64, 0xd3, 0x12, 0xcc, 0x9b, 0xe2, 0x02, 0xcc, 0x9b, 0x63,\n  0xab, 0x30, 0x6f, 0x62, 0x79, 0x98, 0x37, 0x85, 0x90, 0x37, 0xf5, 0xeb,\n  0x41, 0xde, 0xc4, 0x05, 0xee, 0x92, 0x48, 0xfc, 0xd0, 0x6c, 0xf5, 0x44,\n  0x94, 0x66, 0xa8, 0x34, 0xf4, 0xfc, 0xf8, 0x58, 0x38, 0x76, 0xfe, 0x92,\n  0x94, 0xde, 0x92, 0xea, 0xfb, 0x05, 0x52, 0xb8, 0xec, 0xf5, 0xc9, 0xce,\n  0x7e, 0xab, 0x99, 0xe4, 0xa0, 0x14, 0xc7, 0x3d, 0xa5, 0x6d, 0x0e, 0x7b,\n  0x43, 0x72, 0x78, 0x54, 0x4c, 0x63, 0xc1, 0x82, 0x96, 0xe0, 0x84, 0x4c,\n  0x10, 0x2c, 0x89, 0x65, 0x56, 0x89, 0x2e, 0x27, 0xbe, 0xe3, 0xc6, 0x95,\n  0x37, 0xb9, 0x61, 0xbc, 0xdf, 0x2a, 0xd5, 0xcd, 0x44, 0x8e, 0x4d, 0x62,\n  0x9e, 0xfa, 0x35, 0xc9, 0x6d, 0x2e, 0xff, 0x92, 0x72, 0x47, 0x67, 0x26,\n  0x04, 0x75, 0xc9, 0x58, 0x74, 0x8a, 0x40, 0xa7, 0xb2, 0x53, 0x44, 0xd5,\n  0x5b, 0x00, 0xe6, 0x1b, 0xcd, 0xc5, 0x1e, 0x7c, 0x49, 0xc9, 0x74, 0x06,\n  0x83, 0x04, 0x64, 0x8b, 0xfc, 0xcb, 0xfe, 0x7a, 0xf9, 0xd8, 0xc0, 0x8f,\n  0xfb, 0x7f, 0x32, 0xc0, 0xba, 0xb2, 0x09, 0xf4, 0x53, 0xf8, 0x23, 0x9e,\n  0x51, 0x81, 0x0e, 0xb9, 0x8c, 0x6d, 0x8a, 0x64, 0x26, 0xb1, 0xaa, 0x26,\n  0x94, 0x94, 0x2c, 0x9f, 0x03, 0xa5, 0x8a, 0xe4, 0x2a, 0x42, 0x71, 0x76,\n  0xdb, 0x9a, 0x82, 0x50, 0x79, 0xb0, 0x77, 0xe8, 0xe2, 0xc0, 0xc0, 0xae,\n  0x16, 0xcf, 0xf0, 0xd8, 0xe0, 0x60, 0xcf, 0x46, 0x47, 0xb1, 0xd6, 0x10,\n  0x2b, 0x5a, 0xba, 0xe0, 0xaa, 0xa3, 0x83, 0x87, 0x5b, 0xfa, 0x6f, 0x61,\n  0x97, 0xeb, 0x13, 0xfb, 0x2e, 0xbc, 0x28, 0xbd, 0x70, 0xe1, 0xb6, 0xb1,\n  0xd1, 0x79, 0x41, 0x81, 0xb7, 0x96, 0x2b, 0x0f, 0x1f, 0xbb, 0xa6, 0xeb,\n  0x03, 0x93, 0xbb, 0xbf, 0xf9, 0x31, 0xbc, 0x8f, 0xbe, 0x89, 0xe9, 0xa1,\n  0xc0, 0xfb, 0xb8, 0x15, 0xaf, 0xa1, 0xb2, 0x4c, 0x89, 0x47, 0xab, 0x94,\n  0xeb, 0x40, 0x1d, 0xa4, 0x58, 0xc6, 0xbc, 0x94, 0xe8, 0xe9, 0x72, 0x98,\n  0x8c, 0x2a, 0x81, 0xb1, 0x22, 0x6b, 0xae, 0x0e, 0x14, 0x29, 0x03, 0x85,\n  0x39, 0x0a, 0x3c, 0x0c, 0x4a, 0xa5, 0x54, 0x04, 0x4a, 0xa9, 0x5c, 0xaa,\n  0x6a, 0x3e, 0xb6, 0xf3, 0x89, 0xf9, 0x4b, 0x9c, 0x6a, 0xce, 0x68, 0xb9,\n  0x64, 0xdb, 0x4f, 0x4b, 0x66, 0xf7, 0xba, 0x4c, 0x8e, 0x48, 0xd4, 0xdd,\n  0x37, 0xf5, 0x5a, 0x63, 0x6a, 0x68, 0xda, 0x8c, 0x7e, 0x97, 0xfd, 0x42,\n  0x73, 0x4d, 0x73, 0x0a, 0x8d, 0x2f, 0xff, 0xf0, 0xc0, 0x9e, 0xa3, 0x76,\n  0xa7, 0xb7, 0xbb, 0x45, 0x9b, 0xa6, 0xfe, 0xfc, 0x30, 0xd6, 0xf5, 0x7e,\n  0xcf, 0x9e, 0x65, 0x63, 0x10, 0xc1, 0x0d, 0xf8, 0x18, 0xcc, 0x29, 0x46,\n  0x9a, 0x3b, 0x37, 0xa6, 0x60, 0x8c, 0x19, 0x13, 0x71, 0x33, 0x9a, 0xc5,\n  0x78, 0xd2, 0x08, 0x7a, 0x91, 0x85, 0x93, 0xed, 0x0d, 0xcc, 0xad, 0x19,\n  0x87, 0x13, 0x4b, 0x70, 0x07, 0x66, 0xc0, 0x62, 0xa4, 0x12, 0x92, 0x48,\n  0x89, 0xca, 0x10, 0xde, 0x05, 0x45, 0x59, 0x50, 0x02, 0xb8, 0x36, 0x2a,\n  0x96, 0x04, 0xb3, 0x4b, 0xc5, 0xf5, 0xc0, 0x69, 0x88, 0x37, 0x54, 0x54,\n  0x46, 0x8b, 0xe3, 0xe6, 0xd5, 0x3a, 0x95, 0xda, 0x2a, 0xf1, 0x35, 0x25,\n  0xb3, 0x33, 0xef, 0x19, 0x85, 0x22, 0x2e, 0xfb, 0xad, 0xcb, 0x10, 0xad,\n  0xc9, 0x59, 0x9f, 0xae, 0xae, 0x2c, 0x89, 0xc3, 0x11, 0x0a, 0x94, 0xd0,\n  0x55, 0x2b, 0x99, 0x0a, 0x54, 0x21, 0xd6, 0xe4, 0x04, 0x4a, 0x89, 0x87,\n  0x89, 0xeb, 0xc6, 0x3f, 0x93, 0xa8, 0x30, 0x71, 0x7b, 0xcb, 0x0f, 0x11,\n  0x2b, 0x4f, 0xd7, 0x78, 0xed, 0x46, 0x73, 0xdf, 0xc2, 0xe5, 0x57, 0xaf,\n  0x8a, 0x77, 0xb6, 0x5a, 0x92, 0xe5, 0xe5, 0x66, 0xa7, 0xca, 0xe0, 0xed,\n  0x15, 0x63, 0x9b, 0x5f, 0xa8, 0x29, 0x0b, 0xb4, 0xb8, 0xd1, 0xd0, 0xa6,\n  0xd1, 0x29, 0xbe, 0x30, 0xc0, 0xd9, 0x65, 0x2c, 0xed, 0x2e, 0x29, 0xe7,\n  0xd9, 0x06, 0x5e, 0x81, 0x5e, 0x92, 0xe2, 0x99, 0x49, 0xdc, 0x44, 0x04,\n  0xf3, 0x36, 0xd0, 0xb3, 0x57, 0xc4, 0x09, 0x79, 0x98, 0xd0, 0xd9, 0xb3,\n  0x12, 0x61, 0x9e, 0x60, 0x7f, 0x85, 0xaf, 0x0f, 0x52, 0x5c, 0x91, 0xbf,\n  0x52, 0x1d, 0x64, 0x04, 0xb7, 0xb7, 0x93, 0xba, 0x97, 0xe7, 0xd1, 0xbc,\n  0x9d, 0x30, 0xa6, 0x2e, 0xb6, 0x33, 0x95, 0xd2, 0x5e, 0xe9, 0xe3, 0x69,\n  0x09, 0x70, 0x38, 0x58, 0xc8, 0xa3, 0xa8, 0x20, 0x51, 0xd4, 0x0f, 0x71,\n  0xa0, 0x40, 0x49, 0xb1, 0x1d, 0xa1, 0xa2, 0x08, 0x9b, 0x49, 0xa8, 0x68,\n  0x87, 0x52, 0x96, 0x20, 0x46, 0xcc, 0x46, 0xbd, 0x4e, 0x4d, 0x8a, 0x58,\n  0xaa, 0x72, 0x14, 0x0c, 0x11, 0xeb, 0x34, 0x45, 0x8c, 0x55, 0x29, 0xbe,\n  0x36, 0x9f, 0x72, 0xa8, 0x33, 0x5d, 0x13, 0x72, 0x73, 0xdc, 0xe2, 0xd2,\n  0xcc, 0x45, 0x33, 0x5d, 0xd3, 0xbd, 0x7a, 0xde, 0x1e, 0xa9, 0xac, 0xa4,\n  0x54, 0x02, 0xea, 0x34, 0xbb, 0xb7, 0xee, 0x42, 0xf3, 0xd9, 0xcf, 0x5d,\n  0xb1, 0x63, 0x1b, 0x72, 0x2e, 0xbf, 0xd2, 0x13, 0xb4, 0x47, 0x32, 0x41,\n  0x4a, 0x17, 0x32, 0xbe, 0x7e, 0xfc, 0xf7, 0xa7, 0xd9, 0x66, 0x19, 0x1f,\n  0x05, 0xcd, 0xaf, 0x8f, 0x8f, 0xd2, 0x3f, 0xcd, 0x36, 0x2f, 0x3f, 0x49,\n  0x79, 0xb5, 0x0b, 0x37, 0x33, 0x70, 0x16, 0x36, 0xa6, 0x3a, 0x0a, 0x34,\n  0xd4, 0x6d, 0x59, 0xd9, 0x4f, 0x71, 0x1f, 0xf0, 0x75, 0x27, 0x67, 0xa6,\n  0xd7, 0x91, 0xa0, 0x5b, 0x58, 0x19, 0x65, 0x6c, 0x14, 0x77, 0xc1, 0x26,\n  0x61, 0x43, 0x3c, 0x8d, 0xef, 0x14, 0x73, 0x31, 0xb9, 0xcd, 0xb6, 0x95,\n  0x91, 0x35, 0x6d, 0x5e, 0xc6, 0x77, 0x78, 0xf6, 0x55, 0xf9, 0xfd, 0x33,\n  0xb8, 0x0d, 0x7c, 0x77, 0x23, 0xfe, 0xed, 0x7e, 0x4e, 0x10, 0x9f, 0x55,\n  0xea, 0x66, 0x5f, 0xcf, 0x7b, 0x12, 0x3f, 0xf7, 0x03, 0x7c, 0xff, 0xcb,\n  0x9c, 0x5d, 0x7e, 0x6e, 0x6e, 0x65, 0x82, 0x3c, 0xd7, 0xbf, 0xf2, 0x77,\n  0x56, 0x85, 0xc7, 0x28, 0x5e, 0x57, 0x5d, 0xc6, 0xbc, 0x4a, 0xbe, 0xf3,\n  0x73, 0xfc, 0x16, 0x3d, 0xfb, 0x03, 0xb9, 0x2f, 0xdb, 0x57, 0xa6, 0x19,\n  0x0d, 0x7d, 0xa3, 0x46, 0xc2, 0x89, 0x70, 0x60, 0xbe, 0xf8, 0x3a, 0xdb,\n  0x2c, 0xbe, 0x53, 0xa9, 0xdb, 0xa1, 0x20, 0x34, 0x58, 0xf9, 0x36, 0x7e,\n  0xa2, 0x0a, 0xef, 0x4c, 0xd2, 0xb3, 0x4b, 0x2b, 0x63, 0x85, 0xcf, 0x62,\n  0xda, 0x7a, 0x56, 0xfe, 0x8e, 0x3c, 0xf8, 0xbb, 0x86, 0xd5, 0xf9, 0xe4,\n  0x44, 0xff, 0xce, 0xc7, 0xbb, 0xd0, 0x42, 0xca, 0x80, 0x01, 0x19, 0x72,\n  0x78, 0x17, 0x72, 0x3a, 0xf9, 0x45, 0xde, 0x32, 0x5b, 0x49, 0x49, 0x45,\n  0xc9, 0xd4, 0xa4, 0x5a, 0x50, 0xf7, 0x59, 0x53, 0xb5, 0xe8, 0x8e, 0xec,\n  0xe1, 0xf9, 0x49, 0xca, 0xb3, 0x7f, 0x47, 0x77, 0x10, 0x5a, 0x5e, 0x46,\n  0xe8, 0xb1, 0xed, 0xdf, 0xf2, 0x29, 0x49, 0xea, 0xba, 0xb0, 0x26, 0xb6,\n  0x95, 0x11, 0x18, 0x13, 0x78, 0x54, 0x75, 0x88, 0x67, 0x50, 0xae, 0x76,\n  0x13, 0xbe, 0xdb, 0x39, 0x04, 0x92, 0x1e, 0x75, 0xa1, 0x61, 0x95, 0x8a,\n  0x61, 0x54, 0x26, 0x95, 0x09, 0x8e, 0xb4, 0x01, 0xb7, 0x42, 0xed, 0x4e,\n  0x56, 0x5b, 0x53, 0x58, 0x53, 0x09, 0x0b, 0xf5, 0x52, 0xcd, 0x91, 0x9f,\n  0x6e, 0x3f, 0xb3, 0xb0, 0xe1, 0xbf, 0x9b, 0x97, 0xeb, 0x05, 0xb3, 0x42,\n  0x69, 0x54, 0x35, 0xb0, 0xad, 0xcb, 0xff, 0x7a, 0xef, 0xbd, 0x7f, 0xfa,\n  0x94, 0xbd, 0xca, 0xe5, 0xaa, 0x70, 0x7d, 0x32, 0x87, 0x59, 0x65, 0x22,\n  0xbc, 0xf1, 0x01, 0x42, 0xaf, 0x2d, 0x2b, 0xf9, 0xd7, 0x55, 0xf4, 0x3a,\n  0x5e, 0x42, 0x43, 0x03, 0x11, 0xdc, 0x57, 0x16, 0x3d, 0x14, 0x21, 0x73,\n  0x27, 0xde, 0x0f, 0xc9, 0xf7, 0xfb, 0x9b, 0xd6, 0xb9, 0x4f, 0x78, 0x82,\n  0xbe, 0x77, 0xe6, 0xd7, 0xf9, 0xef, 0xb5, 0xcb, 0xd7, 0xe7, 0x7e, 0x9f,\n  0x77, 0x9d, 0xcc, 0x2d, 0x7d, 0xdf, 0xe0, 0xd0, 0xaa, 0xf7, 0xe1, 0x75,\n  0x8d, 0x69, 0x23, 0x3e, 0x87, 0xe5, 0x00, 0x6a, 0xc8, 0x7b, 0xdf, 0x84,\n  0xfc, 0xdc, 0xc8, 0x85, 0xe4, 0x39, 0xb6, 0xb0, 0x9f, 0xff, 0x24, 0x3e,\n  0x17, 0xd3, 0x2d, 0xbe, 0xf1, 0x08, 0x9e, 0xfd, 0x2d, 0x98, 0x87, 0x6f,\n  0x67, 0xcc, 0xb8, 0xdd, 0xe3, 0x2b, 0x8f, 0xe0, 0x86, 0x5f, 0xe2, 0xd1,\n  0x43, 0xb7, 0x53, 0x36, 0x90, 0x9f, 0xe1, 0xe4, 0x77, 0x8e, 0x95, 0xe6,\n  0xf5, 0x05, 0xef, 0x47, 0x58, 0x2f, 0x62, 0x6f, 0xc2, 0x7c, 0x62, 0xc4,\n  0x3b, 0x52, 0x03, 0xf8, 0x26, 0x18, 0x85, 0x9a, 0x87, 0x98, 0x10, 0xa8,\n  0xa7, 0xc9, 0xec, 0xc6, 0x16, 0x1a, 0x47, 0xec, 0xcb, 0x4e, 0x10, 0x2d,\n  0xd4, 0x21, 0x8f, 0xa7, 0x2c, 0x3f, 0xff, 0x5f, 0x1d, 0x48, 0x46, 0xc3,\n  0x42, 0xd8, 0x2a, 0x26, 0xf3, 0xe0, 0x3f, 0x50, 0x12, 0x3e, 0x85, 0xe6,\n  0xbe, 0xd2, 0xb5, 0xb8, 0x82, 0x6e, 0x79, 0xe1, 0x99, 0x67, 0x5e, 0xc8,\n  0x3e, 0x1d, 0x3f, 0x7a, 0xe7, 0xbd, 0xf7, 0xb2, 0xcd, 0x3d, 0xf7, 0x77,\n  0x7f, 0xbb, 0x07, 0xfd, 0x2d, 0xfb, 0x16, 0xe1, 0x63, 0xf2, 0x6d, 0x32,\n  0x5f, 0xd7, 0xd3, 0xf9, 0xda, 0x4a, 0x73, 0xb5, 0xb0, 0x5c, 0x40, 0xbf,\n  0x22, 0x7d, 0x72, 0x32, 0x01, 0xc0, 0x99, 0x54, 0x42, 0xa2, 0xdb, 0xa0,\n  0x80, 0x55, 0x02, 0x05, 0xcf, 0x2a, 0x68, 0x4c, 0x22, 0x1c, 0x96, 0x74,\n  0x0e, 0xa9, 0x48, 0x98, 0x00, 0x43, 0x3a, 0xe5, 0x76, 0x99, 0x4d, 0x90,\n  0xb8, 0xe9, 0x0a, 0xb8, 0x03, 0x0e, 0x9b, 0xc9, 0x69, 0x76, 0x1a, 0x74,\n  0x00, 0x94, 0xa0, 0x56, 0xcb, 0x27, 0x58, 0x12, 0x0e, 0x95, 0xd9, 0x49,\n  0x33, 0x36, 0xed, 0x34, 0x6a, 0x2e, 0x6c, 0x7f, 0xfb, 0xd8, 0x9e, 0xe6,\n  0xea, 0x86, 0xf6, 0x63, 0xf3, 0xdf, 0x7d, 0xbc, 0xbd, 0xe1, 0xca, 0x99,\n  0x7d, 0x97, 0x65, 0x3a, 0xb7, 0xb3, 0xcd, 0xfd, 0x3d, 0xb5, 0x19, 0x35,\n  0xa7, 0x69, 0x69, 0xdb, 0x34, 0xce, 0x36, 0xff, 0xad, 0xbc, 0x6c, 0xf2,\n  0x8b, 0xd9, 0xe5, 0x9d, 0x65, 0x35, 0xdf, 0x21, 0xf9, 0x78, 0x67, 0xd1,\n  0xcb, 0x6c, 0x27, 0xe3, 0x06, 0x34, 0x1e, 0x07, 0xd6, 0xcf, 0x9c, 0x6a,\n  0x96, 0x3a, 0xc1, 0xb8, 0x41, 0x5e, 0x72, 0x7e, 0x75, 0x0f, 0x49, 0x80,\n  0x15, 0x3d, 0x90, 0xc5, 0x69, 0xb7, 0xea, 0xb5, 0x78, 0xad, 0xb9, 0x91,\n  0x5b, 0xa1, 0x2e, 0x04, 0x55, 0xce, 0xc1, 0xd6, 0x81, 0x72, 0x86, 0xba,\n  0x67, 0x97, 0xb6, 0x6e, 0x8b, 0x76, 0x05, 0xdb, 0x66, 0x66, 0x2e, 0x6c,\n  0xea, 0xb8, 0x6c, 0x72, 0x7a, 0xc0, 0x17, 0xd8, 0x88, 0xde, 0xbe, 0x68,\n  0xe7, 0xee, 0x0b, 0x8c, 0xfa, 0x21, 0x77, 0xff, 0xa9, 0xe9, 0xc9, 0x93,\n  0x03, 0x91, 0x1e, 0xa3, 0x85, 0xce, 0x31, 0xe9, 0x0b, 0xa1, 0xe3, 0x8d,\n  0x94, 0x8e, 0xe5, 0xf9, 0xd7, 0x43, 0xf4, 0x3a, 0x9e, 0xfb, 0x81, 0xdd,\n  0x11, 0xba, 0x46, 0x45, 0x7e, 0xaa, 0x58, 0x31, 0xc1, 0x18, 0xc4, 0xe7,\n  0x04, 0xe6, 0x62, 0xe6, 0x7b, 0xeb, 0x3e, 0xd7, 0xbf, 0x77, 0xf5, 0x73,\n  0x30, 0xf6, 0xbf, 0x4a, 0xcf, 0xe9, 0x66, 0x99, 0x2f, 0x13, 0xbd, 0x00,\n  0xcf, 0x1b, 0xeb, 0xc4, 0xf3, 0xa6, 0xc2, 0x6b, 0x3e, 0x40, 0x4e, 0xcf,\n  0xc9, 0xd4, 0x74, 0x0e, 0x49, 0x41, 0xa4, 0x5d, 0xcc, 0x70, 0x30, 0x12,\n  0x0c, 0xf1, 0xea, 0x22, 0xe2, 0x94, 0x87, 0xaa, 0x11, 0xc4, 0xf9, 0x0e,\n  0x3f, 0xb0, 0xce, 0x4f, 0x7c, 0xe8, 0x93, 0xff, 0xfc, 0xc1, 0xdb, 0xe6,\n  0x76, 0x2d, 0x8d, 0xf7, 0x3e, 0x87, 0xa2, 0xb7, 0x7c, 0x98, 0x6d, 0xbe,\n  0xf9, 0x86, 0x3d, 0x7b, 0xb3, 0x93, 0x14, 0x27, 0x5a, 0x7c, 0xb7, 0x8e,\n  0xe2, 0x1f, 0x91, 0x3a, 0x4c, 0x0c, 0x0f, 0x9e, 0x5e, 0x85, 0x42, 0x62,\n  0x50, 0xc8, 0x4b, 0x05, 0x86, 0xed, 0x02, 0x80, 0x59, 0xe2, 0xe6, 0xc2,\n  0x7a, 0x01, 0x7e, 0x42, 0x1b, 0x34, 0x9b, 0xd5, 0x58, 0xaa, 0xa4, 0xa8,\n  0x13, 0x5c, 0x46, 0x4a, 0xa7, 0x53, 0x8f, 0x79, 0xb6, 0xbf, 0xb5, 0x15,\n  0x7f, 0xf9, 0x13, 0x1f, 0xea, 0xed, 0x7d, 0x0e, 0x7f, 0x7d, 0xcf, 0x9e,\n  0x7f, 0xb4, 0x23, 0xe6, 0xe6, 0x6b, 0x6f, 0xf9, 0x70, 0xdf, 0xf3, 0x7b,\n  0xf6, 0x7e, 0xa5, 0x9d, 0xca, 0x71, 0xf8, 0x3e, 0xa1, 0xc9, 0x6d, 0x94,\n  0x96, 0xa3, 0x85, 0x6b, 0x5a, 0xec, 0x1f, 0xab, 0x54, 0x7d, 0x58, 0xda,\n  0xdb, 0xd0, 0xad, 0xb8, 0xbf, 0x5a, 0x38, 0xbd, 0xcc, 0x87, 0x7e, 0x9e,\n  0x27, 0xb2, 0x0f, 0x8e, 0xb9, 0x00, 0x61, 0xa2, 0x4b, 0x31, 0x2c, 0xea,\n  0xb5, 0x6a, 0x6f, 0x32, 0x7f, 0x09, 0xf5, 0xa3, 0xde, 0xd7, 0x5f, 0x7a,\n  0xe9, 0xf5, 0xec, 0xe3, 0xe2, 0xa2, 0x11, 0xfb, 0x80, 0x6e, 0x25, 0xf3,\n  0xfc, 0x51, 0x3a, 0xcf, 0xbf, 0x63, 0x98, 0xdc, 0x75, 0x15, 0xbd, 0x0e,\n  0xf2, 0xad, 0xa6, 0x70, 0xbe, 0x00, 0x74, 0xe3, 0x63, 0xa4, 0xef, 0xf4,\n  0xfe, 0x40, 0x71, 0xe1, 0x7d, 0x78, 0xfe, 0xae, 0xbc, 0xfb, 0xfd, 0xa1,\n  0xb5, 0xf7, 0x6f, 0x25, 0xf2, 0x8f, 0x7e, 0x77, 0xe6, 0xa9, 0xfc, 0xef,\n  0x2a, 0xc4, 0xe7, 0x04, 0xbc, 0x6f, 0xdf, 0xc1, 0xe4, 0x3d, 0x49, 0xda,\n  0x74, 0x92, 0x36, 0x76, 0xf9, 0xd9, 0xb9, 0x1f, 0xe5, 0x3d, 0x4b, 0x64,\n  0x24, 0xfd, 0xe6, 0x60, 0xed, 0xaa, 0x6f, 0x62, 0x1d, 0xf3, 0x56, 0xb2,\n  0xf7, 0x7d, 0x94, 0xea, 0x44, 0x97, 0x30, 0x32, 0x5d, 0x6f, 0xc1, 0x74,\n  0xa5, 0x39, 0x86, 0xeb, 0xd1, 0xb5, 0x8b, 0x17, 0x73, 0x0c, 0xd5, 0x9e,\n  0x1c, 0x45, 0xc3, 0xfd, 0xa8, 0xe7, 0xb5, 0x5f, 0xfd, 0x6a, 0x0a, 0x53,\n  0xf3, 0x89, 0x9e, 0x3f, 0xe3, 0xf7, 0x54, 0xae, 0x9c, 0x65, 0x6d, 0x6c,\n  0x07, 0xe3, 0x01, 0x7c, 0x3b, 0x1d, 0x5e, 0xb6, 0x10, 0x8b, 0x04, 0x9a,\n  0x2c, 0xd8, 0x5a, 0x3c, 0xc4, 0x23, 0xf1, 0x9c, 0x22, 0x77, 0x78, 0xd2,\n  0x2d, 0xd7, 0x19, 0xe9, 0x61, 0x86, 0x01, 0x64, 0x37, 0x1a, 0x82, 0x19,\n  0x8b, 0xe6, 0xb9, 0xac, 0xf1, 0xca, 0x95, 0x4e, 0xd6, 0x00, 0xcc, 0x36,\n  0xc5, 0xda, 0x92, 0xbb, 0x37, 0x9c, 0xfa, 0x48, 0xe7, 0x35, 0x8b, 0x3b,\n  0x07, 0xfd, 0xdd, 0xc3, 0x3b, 0xf7, 0xed, 0xd9, 0xd1, 0x52, 0xfe, 0xa1,\n  0xdf, 0x78, 0x4c, 0xd6, 0xdb, 0x6f, 0x9e, 0x3c, 0x39, 0x18, 0xee, 0x09,\n  0x5e, 0xbc, 0x74, 0xf0, 0xb0, 0xe9, 0x63, 0x3d, 0x22, 0xe6, 0x15, 0xee,\n  0x0f, 0x99, 0xc3, 0x4f, 0x13, 0x5a, 0x0e, 0x31, 0x57, 0xad, 0xa1, 0x25,\n  0x6d, 0x13, 0x12, 0xdb, 0xe0, 0x79, 0x3a, 0x9a, 0xdf, 0x82, 0xc5, 0xf7,\n  0xc3, 0xe2, 0x98, 0xe2, 0x80, 0xa3, 0xb6, 0x7a, 0x54, 0x61, 0x1f, 0xab,\n  0x14, 0x14, 0xf2, 0xd0, 0x54, 0x48, 0xc0, 0xea, 0xa1, 0x72, 0xfb, 0xba,\n  0x43, 0xf4, 0x7a, 0xbd, 0x71, 0x6f, 0xdc, 0x41, 0x47, 0xaa, 0x56, 0xfb,\n  0xde, 0x75, 0xa4, 0x1c, 0xc0, 0xab, 0x91, 0x6c, 0xd2, 0x73, 0x8c, 0xf9,\n  0x46, 0xde, 0x1d, 0xb4, 0x54, 0xa9, 0xcc, 0x06, 0x76, 0xed, 0xe8, 0xb3,\n  0xb7, 0xa8, 0x2d, 0xf5, 0x0d, 0x0e, 0x9d, 0x39, 0xbd, 0xc1, 0x2e, 0x8d,\n  0x91, 0xc8, 0x96, 0x4f, 0x8b, 0xb2, 0xe5, 0x1b, 0xd2, 0xbc, 0xb3, 0x3a,\n  0xb2, 0x9e, 0xe2, 0x04, 0xa8, 0x85, 0x94, 0x02, 0x51, 0x42, 0xf5, 0xb5,\n  0x4e, 0x72, 0xc0, 0xd6, 0x55, 0x58, 0xf0, 0x5c, 0x0d, 0xc5, 0x99, 0xc5,\n  0x2a, 0xf4, 0xf6, 0x60, 0x9a, 0xd5, 0x4d, 0x65, 0xff, 0x34, 0x35, 0x85,\n  0x6c, 0xa0, 0x48, 0x22, 0x45, 0xf6, 0x1f, 0x6c, 0xf3, 0x9f, 0xff, 0x2c,\n  0xd7, 0x26, 0xc2, 0xc2, 0x1d, 0xef, 0x7e, 0x4e, 0xe0, 0x04, 0xb5, 0xc0,\n  0x2a, 0x34, 0x3c, 0xcb, 0x68, 0x15, 0xcc, 0x6e, 0x1d, 0x49, 0x74, 0xd0,\n  0xb2, 0xbb, 0xc1, 0xad, 0xde, 0x49, 0xbc, 0x63, 0x78, 0x97, 0xb1, 0xd9,\n  0x6c, 0x4e, 0x1b, 0x81, 0xef, 0x95, 0xb7, 0x40, 0x3d, 0xde, 0x02, 0x51,\n  0x58, 0xfc, 0x1c, 0x8d, 0x2f, 0x22, 0x85, 0x46, 0x84, 0x74, 0xd0, 0xce,\n  0x8e, 0x77, 0xc3, 0xa7, 0xbb, 0xbb, 0xf1, 0xc7, 0xa7, 0xba, 0xef, 0xce,\n  0xfe, 0x09, 0x7d, 0x26, 0x3b, 0x87, 0x98, 0x15, 0x06, 0x7d, 0xa6, 0x0d,\n  0x02, 0xf4, 0x3f, 0x31, 0x3f, 0x2f, 0xcb, 0x17, 0x1d, 0x99, 0xdb, 0xcf,\n  0xd1, 0xb9, 0xdd, 0x9a, 0x3f, 0xb7, 0x88, 0x89, 0xc2, 0xb2, 0x21, 0xe3,\n  0x8f, 0x65, 0xc2, 0x70, 0xb2, 0xcb, 0x73, 0x04, 0x63, 0x05, 0x70, 0xf2,\n  0x98, 0x4e, 0x02, 0x2c, 0xd8, 0x25, 0xd5, 0x65, 0xb7, 0x73, 0x6a, 0xac,\n  0x38, 0xcb, 0x65, 0x1a, 0x9c, 0xf6, 0x68, 0x7b, 0xfb, 0xcf, 0xda, 0xdb,\n  0x6b, 0x4c, 0xe8, 0x2b, 0xc6, 0xda, 0x5a, 0x63, 0xb6, 0xcf, 0x44, 0x6b,\n  0xfe, 0x46, 0x09, 0x8e, 0x1b, 0xc8, 0x93, 0x07, 0xa8, 0x3c, 0x39, 0x4d,\n  0xf5, 0xcb, 0x7f, 0xe0, 0xeb, 0x35, 0x84, 0x17, 0x1f, 0xa0, 0xf2, 0xe4,\n  0xb9, 0x82, 0xb5, 0xb9, 0xf2, 0x47, 0x7c, 0xb5, 0x85, 0xf4, 0x95, 0xde,\n  0xef, 0xff, 0x4e, 0xe1, 0xda, 0x05, 0xdc, 0xbf, 0x62, 0x22, 0x2f, 0x1e,\n  0x10, 0x75, 0xe8, 0xfd, 0xd2, 0xf7, 0x98, 0x15, 0x22, 0x2f, 0xe8, 0x73,\n  0xc3, 0x1b, 0x0a, 0xdf, 0xfb, 0x5b, 0x72, 0xdf, 0x2e, 0x3f, 0x37, 0xb7,\n  0x72, 0x84, 0x3e, 0xb7, 0xb2, 0x84, 0xbe, 0x47, 0x74, 0x68, 0x72, 0x5d,\n  0xf5, 0x28, 0x0a, 0x93, 0x7e, 0x2e, 0xe3, 0xb7, 0xc4, 0x88, 0x0c, 0xa1,\n  0xef, 0x1b, 0x3c, 0x53, 0xd8, 0x8f, 0x28, 0xd6, 0x9f, 0x57, 0x88, 0x0c,\n  0x79, 0x80, 0xca, 0x10, 0x27, 0x1d, 0xdf, 0xcf, 0x70, 0xeb, 0x3e, 0xa2,\n  0x13, 0xd1, 0xe7, 0xc6, 0x1e, 0x2e, 0xa0, 0xf5, 0xca, 0xd7, 0x57, 0x96,\n  0x98, 0x7b, 0x89, 0xee, 0x9c, 0xc8, 0x44, 0xa1, 0x1a, 0x07, 0x4b, 0x75,\n  0x67, 0xc0, 0xd9, 0x43, 0x04, 0x99, 0xa1, 0x93, 0xcd, 0x57, 0x9c, 0xf1,\n  0x66, 0x2e, 0x84, 0x0a, 0x70, 0x98, 0x50, 0x99, 0xcb, 0xe8, 0x33, 0x80,\n  0xe2, 0xfc, 0x09, 0x4d, 0x27, 0xa7, 0x48, 0xd5, 0xb2, 0xe5, 0xcb, 0xff,\n  0x3d, 0x3f, 0x89, 0xbf, 0x8d, 0xdf, 0x8d, 0xc2, 0x84, 0x76, 0x8f, 0x52,\n  0xda, 0xdd, 0x5f, 0x38, 0xcf, 0x20, 0xdf, 0xde, 0x26, 0xdf, 0x2e, 0xce,\n  0xf8, 0x74, 0x5a, 0x15, 0xcb, 0x4b, 0xd0, 0xd0, 0x9d, 0xe4, 0xc4, 0xac,\n  0x8b, 0xc5, 0xca, 0x97, 0xdd, 0x04, 0x5b, 0xa8, 0x55, 0x44, 0xa6, 0x86,\n  0x1a, 0x3b, 0x02, 0x96, 0x70, 0xd3, 0x7a, 0xbf, 0xe1, 0xab, 0x3b, 0x7e,\n  0xf2, 0xfc, 0xce, 0x2f, 0x67, 0xb0, 0xc1, 0x94, 0xfd, 0x83, 0x39, 0x64,\n  0x7a, 0xee, 0x6c, 0xf6, 0x1b, 0x48, 0x97, 0x7a, 0x9e, 0xfa, 0x84, 0xfb,\n  0x57, 0xc2, 0xe2, 0xbb, 0x8b, 0xa0, 0x32, 0x8c, 0xf8, 0x76, 0x87, 0x89,\n  0xe5, 0x45, 0x6c, 0x67, 0x5e, 0xc1, 0x6f, 0x2f, 0xf8, 0x94, 0xd1, 0x68,\n  0x2c, 0x32, 0x16, 0x41, 0x31, 0x3d, 0x13, 0x2c, 0xa9, 0x55, 0x5f, 0x54,\n  0xc8, 0xeb, 0xbe, 0xe0, 0xdb, 0x78, 0x69, 0x4a, 0xcb, 0x7d, 0x55, 0x37,\n  0x5a, 0x72, 0x4b, 0x5d, 0x92, 0xe5, 0x9f, 0xc2, 0xfd, 0x51, 0x80, 0xb6,\n  0x00, 0x5f, 0xec, 0x24, 0x41, 0x96, 0x0b, 0x8c, 0xc4, 0xcb, 0xa4, 0x94,\n  0x3b, 0xaf, 0x76, 0x25, 0xad, 0xb0, 0x8a, 0xcd, 0xf7, 0xac, 0x64, 0x1f,\n  0xc0, 0x6f, 0xd4, 0xf7, 0xe1, 0x67, 0xa4, 0x3d, 0xe4, 0x53, 0x84, 0x7f,\n  0xbf, 0x2a, 0xda, 0x82, 0x47, 0x24, 0x3d, 0x04, 0xdd, 0x4b, 0xde, 0x6b,\n  0x06, 0x6f, 0x89, 0x9e, 0x04, 0xcf, 0x91, 0xcc, 0xf1, 0x79, 0x5a, 0x30,\n  0xbe, 0xe0, 0x3b, 0xa4, 0x74, 0xbc, 0x59, 0x69, 0xd6, 0x69, 0xc5, 0xd2,\n  0xf1, 0xf2, 0xf7, 0x72, 0xe3, 0x83, 0x2f, 0xa3, 0x19, 0xde, 0xe9, 0x37,\n  0x56, 0x09, 0x7a, 0x2d, 0x2b, 0x76, 0x02, 0xa9, 0x2d, 0x75, 0x1b, 0x1c,\n  0x3a, 0x6b, 0xba, 0xde, 0x2e, 0xd3, 0xf7, 0x53, 0xe2, 0x77, 0xeb, 0x32,\n  0x29, 0xf8, 0x2e, 0x4f, 0x8d, 0x1e, 0x8e, 0xe7, 0xb6, 0x2b, 0xd0, 0xfb,\n  0xfe, 0xb0, 0xb5, 0xe0, 0xc3, 0xbf, 0xcf, 0x27, 0x27, 0x7c, 0x77, 0xf9,\n  0x74, 0x1e, 0x1d, 0x25, 0x3a, 0x10, 0x3e, 0xff, 0xaa, 0xb8, 0x0f, 0xbf,\n  0x96, 0xbd, 0x83, 0xd6, 0x02, 0xce, 0xde, 0x41, 0xfd, 0x79, 0x04, 0xb3,\n  0xf1, 0x1e, 0xdc, 0x37, 0x3d, 0x9c, 0x3a, 0x41, 0xb0, 0x85, 0x52, 0xc1,\n  0xe3, 0x25, 0x0e, 0x21, 0xae, 0xa0, 0xa1, 0x71, 0xe2, 0x39, 0x9b, 0x28,\n  0x47, 0xf5, 0x8c, 0xde, 0x4e, 0x08, 0x1f, 0xc5, 0x92, 0x4c, 0x80, 0x53,\n  0x4c, 0x00, 0x85, 0xb2, 0xa3, 0x7b, 0xb2, 0x0f, 0xa4, 0xa2, 0xd3, 0x53,\n  0x17, 0xc6, 0xee, 0xea, 0xeb, 0xfb, 0x55, 0xa8, 0xa9, 0x1e, 0x69, 0x7f,\n  0x3e, 0xd4, 0xb8, 0xfd, 0x7b, 0xa2, 0x7c, 0xfe, 0x08, 0x7e, 0xbf, 0x13,\n  0x30, 0x4c, 0xec, 0x80, 0xbc, 0x4f, 0x83, 0x56, 0x41, 0x34, 0xb1, 0xd2,\n  0x6b, 0x9d, 0x0c, 0x56, 0xca, 0x9d, 0x66, 0x25, 0xe8, 0x7f, 0x14, 0x1c,\n  0xab, 0x1e, 0xaa, 0x63, 0x86, 0x6d, 0x22, 0x78, 0x3e, 0xb6, 0xfa, 0xd8,\n  0x8f, 0x6c, 0x02, 0x1d, 0xfa, 0xa1, 0xc1, 0x87, 0xf0, 0x3c, 0x8d, 0x9c,\n  0xf8, 0x02, 0xfb, 0x79, 0x22, 0xb2, 0x77, 0xdb, 0xaa, 0x4b, 0x35, 0xd9,\n  0x62, 0xf4, 0x2b, 0x4d, 0xb2, 0xc6, 0x99, 0xbd, 0x1b, 0x13, 0xa2, 0x0a,\n  0xc0, 0xf4, 0xe8, 0x77, 0x23, 0xf8, 0xbb, 0x66, 0xa8, 0x5f, 0xa3, 0xe3,\n  0x58, 0x48, 0x4d, 0xc3, 0xa2, 0x11, 0x48, 0x8d, 0xe4, 0x6d, 0xc1, 0xcc,\n  0x98, 0xcd, 0x0e, 0xb3, 0x42, 0x0d, 0xd8, 0x12, 0xf9, 0x50, 0xfd, 0x80,\n  0xe8, 0xc3, 0x46, 0xf6, 0x67, 0x7f, 0xc1, 0xb3, 0xfc, 0xc8, 0x7e, 0x14,\n  0x84, 0xe7, 0xe0, 0x6b, 0x3f, 0xf2, 0x8c, 0x15, 0x67, 0xbf, 0x81, 0x3f,\n  0x52, 0x63, 0x1f, 0x0e, 0xa3, 0x5e, 0x49, 0x3e, 0x47, 0x08, 0xaf, 0x3d,\n  0x51, 0xa0, 0x63, 0xd3, 0xeb, 0x21, 0x7a, 0x1d, 0x74, 0xab, 0xc3, 0x85,\n  0x7b, 0x32, 0xe6, 0x09, 0xb1, 0x7f, 0x3e, 0x66, 0x43, 0xa6, 0x8e, 0xf4,\n  0xd0, 0x6d, 0x25, 0x2b, 0x4e, 0x10, 0x57, 0x9c, 0xb2, 0xa0, 0xbb, 0x16,\n  0xac, 0xd4, 0x5b, 0x7c, 0x16, 0x9f, 0xcb, 0x29, 0x76, 0x5b, 0xb5, 0x6e,\n  0xb7, 0xf3, 0xf6, 0xdc, 0xc2, 0x01, 0xcc, 0xe7, 0x71, 0xcb, 0xda, 0xa1,\n  0x14, 0xb0, 0x0e, 0xa1, 0xdf, 0xca, 0x12, 0xe9, 0x9f, 0x17, 0x24, 0x82,\n  0x13, 0x3f, 0xc4, 0xe9, 0x73, 0x61, 0xc7, 0xe0, 0x67, 0xc2, 0x02, 0x4f,\n  0x9c, 0x48, 0x86, 0x88, 0x04, 0xfc, 0x94, 0x97, 0xf1, 0x9a, 0x5d, 0x91,\n  0x30, 0x9d, 0xc6, 0x3c, 0xc8, 0x85, 0xfa, 0x35, 0xa4, 0x9d, 0x1a, 0x2a,\n  0x07, 0x41, 0x98, 0x28, 0xe5, 0xb3, 0xff, 0x0e, 0x5d, 0xdc, 0x8b, 0x65,\n  0x1f, 0xa1, 0x31, 0x16, 0x86, 0x20, 0x18, 0x4b, 0xca, 0xd0, 0x73, 0x52,\n  0x07, 0x7b, 0xed, 0x23, 0x61, 0x54, 0x9d, 0xa3, 0x29, 0x27, 0xd3, 0x74,\n  0x6c, 0xb1, 0x90, 0xa6, 0x55, 0x58, 0x47, 0xe8, 0x65, 0xbb, 0xb0, 0x7d,\n  0xe8, 0xa1, 0x95, 0x1e, 0x38, 0x49, 0x81, 0x11, 0xe3, 0x02, 0x7a, 0xa0,\n  0x16, 0x5c, 0x2c, 0x2c, 0xda, 0x19, 0xe7, 0x2e, 0x9a, 0xd6, 0xdb, 0x78,\n  0xe1, 0xdc, 0xec, 0xf1, 0xa6, 0xa6, 0xe3, 0xb3, 0x73, 0x17, 0x36, 0x66,\n  0x3b, 0x27, 0xe6, 0xb6, 0x6c, 0x9e, 0x9e, 0x9e, 0x9b, 0x40, 0x81, 0xe9,\n  0x53, 0xfd, 0xfd, 0xd7, 0x4c, 0x4f, 0x9d, 0xec, 0xef, 0x3f, 0x35, 0xb5,\n  0xe3, 0xf8, 0xf1, 0x1d, 0x7b, 0x8e, 0x5d, 0x04, 0x3e, 0x73, 0xf8, 0x2e,\n  0xe1, 0x81, 0xef, 0x51, 0x1e, 0xa8, 0xa6, 0x3c, 0x40, 0xaf, 0xab, 0xe8,\n  0x75, 0xd8, 0x2f, 0x2f, 0x2f, 0xb4, 0x0d, 0xe8, 0xfd, 0x90, 0x7c, 0xbf,\n  0xff, 0xbc, 0x75, 0xee, 0x93, 0xfd, 0x92, 0xbe, 0x77, 0xc6, 0x9e, 0xff,\n  0x5e, 0xbb, 0x7c, 0x7d, 0xce, 0x93, 0x7f, 0x5d, 0x7a, 0x9f, 0x80, 0x36,\n  0x31, 0x77, 0x32, 0x79, 0x27, 0x05, 0xb9, 0x36, 0x64, 0x6f, 0xa4, 0x6d,\n  0x06, 0x99, 0x2b, 0x98, 0x7c, 0xcb, 0x1f, 0xec, 0xec, 0xaa, 0x95, 0x3f,\n  0xe0, 0x36, 0x9b, 0x49, 0x8c, 0x50, 0x29, 0xd3, 0x9c, 0xd9, 0x80, 0xb5,\n  0x1a, 0x2c, 0x29, 0x63, 0x51, 0x9f, 0x17, 0x2f, 0x21, 0xb5, 0x4a, 0xc9,\n  0x01, 0x54, 0xb7, 0x0d, 0xa1, 0x7e, 0x6c, 0x6b, 0xf5, 0xad, 0xab, 0x27,\n  0xc6, 0xcb, 0x4b, 0xf3, 0xc8, 0x2c, 0x87, 0x84, 0x88, 0x58, 0x8b, 0x02,\n  0xa1, 0xb7, 0xd3, 0x0a, 0xc4, 0x56, 0xd4, 0xc6, 0xe2, 0x1c, 0x09, 0xb0,\n  0x06, 0xaa, 0x4f, 0x34, 0x86, 0xaa, 0xc2, 0x89, 0x38, 0xa6, 0x7c, 0x59,\n  0x9f, 0x2f, 0x56, 0x19, 0x8f, 0x45, 0xb3, 0x9d, 0x56, 0xeb, 0xeb, 0x25,\n  0xcd, 0x73, 0x53, 0x68, 0xc9, 0x66, 0x7d, 0x35, 0xda, 0xb2, 0x95, 0x4e,\n  0x43, 0xb8, 0x3a, 0x54, 0x1d, 0x3f, 0xd6, 0x87, 0xa7, 0xc2, 0x66, 0xae,\n  0x0d, 0x34, 0xc4, 0x8e, 0xf4, 0x54, 0x0c, 0xfa, 0xd0, 0x84, 0xef, 0xf8,\n  0xf6, 0xca, 0xde, 0xa2, 0xec, 0x83, 0xde, 0x13, 0x64, 0xac, 0x78, 0x1c,\n  0x9c, 0x15, 0x8f, 0xf5, 0x19, 0x72, 0x16, 0xb5, 0x25, 0x85, 0xf0, 0x48,\n  0x39, 0xf4, 0x10, 0xca, 0xa7, 0x3f, 0x27, 0xd3, 0x7f, 0x6c, 0x6b, 0xc1,\n  0x19, 0x08, 0xbe, 0xff, 0x16, 0xfb, 0x6d, 0xac, 0x37, 0xbb, 0x98, 0x28,\n  0x12, 0x32, 0x9a, 0x30, 0xe2, 0xd8, 0x90, 0x18, 0xc0, 0x10, 0x22, 0xb5,\n  0x2a, 0x29, 0x4e, 0xdc, 0x6e, 0xbc, 0x5f, 0x12, 0x17, 0x10, 0xc4, 0xbe,\n  0x75, 0x0f, 0xa9, 0x11, 0xb8, 0x53, 0xa1, 0x2c, 0x69, 0x17, 0x29, 0xcf,\n  0x18, 0x17, 0x21, 0xcd, 0xf2, 0x9b, 0x42, 0xdc, 0x5b, 0xf7, 0x10, 0xf9,\n  0x45, 0x34, 0x85, 0x57, 0x3f, 0x55, 0x81, 0x9f, 0x6a, 0x78, 0x7f, 0x4f,\n  0xcd, 0x33, 0xf8, 0x21, 0xf2, 0x23, 0x09, 0x7d, 0xef, 0x11, 0x00, 0x24,\n  0x55, 0x7e, 0x94, 0x00, 0xd0, 0xd0, 0x27, 0xf3, 0x0c, 0x6f, 0xf9, 0x31,\n  0x46, 0xad, 0x96, 0x9e, 0x82, 0x90, 0xd0, 0x40, 0x91, 0x1b, 0x4a, 0x66,\n  0xba, 0xa3, 0x45, 0x51, 0x4b, 0x7e, 0xf4, 0x1d, 0xc7, 0xb8, 0x90, 0x4b,\n  0xa7, 0xa6, 0x61, 0x0a, 0x79, 0xe6, 0x68, 0x6e, 0x11, 0x39, 0xe5, 0x63,\n  0x0b, 0x73, 0x2c, 0x86, 0xea, 0xcd, 0x15, 0x36, 0x94, 0xfe, 0xdd, 0x4f,\n  0x7e, 0xf2, 0xbb, 0xec, 0xf7, 0x4d, 0xe5, 0xb6, 0xc9, 0x0b, 0x9a, 0x9a,\n  0x2e, 0x98, 0x9d, 0x9e, 0x9c, 0x98, 0x76, 0x46, 0x0d, 0xfa, 0x28, 0xdb,\n  0xc1, 0x73, 0x3d, 0xff, 0xd4, 0xf3, 0xed, 0x1e, 0x9e, 0xeb, 0x3f, 0x35,\n  0x3d, 0x75, 0x75, 0x5f, 0xdf, 0x05, 0xbb, 0xf6, 0x5c, 0xa0, 0x10, 0xd0,\n  0xa7, 0x14, 0x82, 0xb8, 0x4f, 0x3f, 0x89, 0x65, 0x8f, 0x06, 0x6b, 0xdf,\n  0xe5, 0x80, 0xaa, 0xc3, 0xc0, 0x31, 0x25, 0xcd, 0x3b, 0x51, 0x10, 0x35,\n  0x84, 0x8a, 0x1c, 0xc4, 0x58, 0xcd, 0x7a, 0x2d, 0x89, 0xa5, 0xd2, 0x20,\n  0x8d, 0x52, 0x3e, 0xce, 0x21, 0xf5, 0xd8, 0x64, 0x40, 0xf1, 0xbf, 0xec,\n  0xdf, 0x77, 0xf8, 0x40, 0xcf, 0xd4, 0x54, 0x6b, 0xfb, 0x00, 0xfe, 0x8f,\n  0x6d, 0x9e, 0xde, 0x3c, 0xb1, 0xf4, 0x3c, 0x96, 0x2b, 0xbf, 0xa9, 0x68,\n  0x49, 0xa7, 0x65, 0xbd, 0xe0, 0x49, 0x72, 0x86, 0x40, 0x2a, 0x80, 0xe0,\n  0xef, 0xe1, 0x01, 0x2b, 0x76, 0x13, 0x3c, 0x45, 0x9e, 0xc4, 0x8c, 0x77,\n  0x0e, 0xd1, 0xad, 0x39, 0x12, 0x0a, 0x9a, 0xcd, 0xc4, 0xc2, 0x43, 0xe2,\n  0x67, 0x48, 0x85, 0x35, 0x85, 0xf4, 0x2d, 0xf4, 0x24, 0xf9, 0xd4, 0xf0,\n  0xfe, 0x7d, 0xd9, 0x9f, 0xd3, 0xef, 0xa1, 0xd0, 0xc4, 0xd2, 0x7e, 0xb6,\n  0xf9, 0xbc, 0xe9, 0x27, 0xc5, 0xcf, 0x11, 0xbe, 0x3a, 0x4e, 0xe4, 0x94,\n  0x85, 0xf1, 0xc3, 0x29, 0x2c, 0x07, 0x58, 0xd6, 0x04, 0xd6, 0x1a, 0x6a,\n  0x09, 0x91, 0x63, 0xa1, 0x6e, 0xf9, 0x38, 0xbe, 0x07, 0x81, 0xc8, 0x0a,\n  0xda, 0xc0, 0x6a, 0x45, 0x62, 0x6e, 0xcd, 0x39, 0xc5, 0xd6, 0xd0, 0xc4,\n  0xb5, 0x17, 0x1e, 0x30, 0xe6, 0x24, 0x57, 0xf7, 0xe6, 0xb9, 0xad, 0xe3,\n  0x53, 0x44, 0x72, 0xed, 0xf8, 0xb0, 0xef, 0xd6, 0x2b, 0x72, 0xb2, 0xeb,\n  0xc4, 0xf1, 0x9d, 0x7b, 0x8e, 0x1d, 0x17, 0xc7, 0xfe, 0x37, 0x71, 0xec,\n  0x58, 0x37, 0x81, 0x6a, 0x65, 0xa4, 0xaa, 0x0d, 0x1c, 0xc7, 0x12, 0xf0,\n  0x13, 0xf1, 0x40, 0x4d, 0xb4, 0x72, 0xe0, 0xb0, 0x4a, 0x0c, 0x60, 0x53,\n  0x32, 0x3a, 0xa4, 0x13, 0x08, 0xd1, 0xa5, 0xa4, 0x9f, 0x7c, 0xb2, 0xff,\n  0xfe, 0xe7, 0x75, 0x4d, 0x9f, 0xdc, 0x7e, 0xdd, 0xee, 0xa9, 0xa9, 0x91,\n  0xa6, 0x8d, 0x9d, 0xed, 0x3d, 0x6c, 0xf3, 0xbd, 0xf5, 0xa3, 0xb6, 0xec,\n  0x2b, 0xaf, 0x60, 0xd2, 0xbf, 0x51, 0x55, 0x5b, 0x9f, 0xdb, 0x27, 0xd1,\n  0xdf, 0x88, 0xec, 0x3c, 0x43, 0x65, 0xe7, 0xdf, 0xf2, 0xaf, 0x87, 0xe8,\n  0x75, 0xd8, 0x3f, 0x6b, 0xf2, 0xd7, 0x26, 0x47, 0x74, 0x2a, 0xa9, 0xdf,\n  0x41, 0x66, 0x20, 0xd3, 0x0b, 0x3d, 0xf7, 0x39, 0xb1, 0x25, 0xcb, 0xca,\n  0xdd, 0x57, 0x4b, 0x96, 0x2c, 0x0c, 0x43, 0x95, 0x3f, 0x0c, 0x87, 0x03,\n  0x31, 0x8e, 0xa0, 0x23, 0xe8, 0xf5, 0x14, 0x0e, 0x47, 0x73, 0xce, 0xe1,\n  0xe4, 0x54, 0xaf, 0xd5, 0x03, 0x7b, 0x20, 0x6f, 0x63, 0x5d, 0x35, 0xc4,\n  0xe5, 0xa7, 0xf3, 0x76, 0x55, 0xc4, 0x94, 0xac, 0x9c, 0x45, 0x9f, 0x66,\n  0x3b, 0xf3, 0xf0, 0x8b, 0xf0, 0x96, 0xca, 0x29, 0x0b, 0xf0, 0x8b, 0xba,\n  0xe5, 0x18, 0xfe, 0x1e, 0x11, 0xbf, 0x48, 0x2d, 0xe2, 0x17, 0x49, 0x27,\n  0xf0, 0x58, 0x5e, 0xae, 0x53, 0xa5, 0x84, 0x00, 0x18, 0x7d, 0xfa, 0xbc,\n  0xa5, 0xfa, 0xd1, 0xd0, 0xd0, 0x96, 0xf4, 0xc6, 0x8e, 0xf6, 0xde, 0xe1,\n  0xda, 0x99, 0x86, 0xca, 0xf1, 0xb0, 0x37, 0xd2, 0x53, 0x5c, 0xdd, 0xe4,\n  0x6f, 0x2a, 0x29, 0xef, 0x8e, 0x7f, 0xa2, 0x7f, 0x8b, 0xc1, 0x30, 0x1a,\n  0x29, 0x2f, 0x4d, 0x26, 0x9d, 0x45, 0xdd, 0x5d, 0x35, 0x5d, 0x11, 0x9b,\n  0xb1, 0xcb, 0x64, 0x2e, 0x8d, 0xfb, 0x22, 0x45, 0x26, 0x73, 0xa2, 0x09,\n  0xd3, 0x9d, 0xf4, 0x91, 0xcc, 0xc7, 0xf3, 0x74, 0x3e, 0x7e, 0x4a, 0xe7,\n  0x83, 0x5e, 0x0f, 0xd1, 0xeb, 0x30, 0x1f, 0xfe, 0x42, 0x9b, 0xaa, 0x64,\n  0xc5, 0x04, 0x63, 0x93, 0x9e, 0x63, 0x2e, 0x3e, 0xbc, 0xfe, 0x73, 0xfd,\n  0xc5, 0x85, 0x7b, 0x76, 0x09, 0x9e, 0x47, 0x4a, 0x93, 0x14, 0xb3, 0x31,\n  0xd3, 0x56, 0x40, 0x95, 0xca, 0x12, 0xac, 0x0f, 0xf1, 0xb2, 0x05, 0xb2,\n  0x2e, 0x89, 0x12, 0x89, 0x44, 0x2a, 0x91, 0x0a, 0x00, 0xa5, 0xc0, 0x12,\n  0x79, 0x9f, 0x94, 0xca, 0x69, 0x49, 0xef, 0x49, 0xb3, 0xab, 0xe5, 0xe9,\n  0x7d, 0x2f, 0xea, 0x65, 0xdf, 0x5c, 0xa5, 0x43, 0x75, 0xe1, 0xfd, 0xa3,\n  0x0c, 0x8f, 0x2d, 0xc2, 0xdc, 0x40, 0x83, 0x82, 0x6d, 0x11, 0x3b, 0xcb,\n  0xf0, 0x6a, 0x2c, 0xcd, 0x00, 0xff, 0x0c, 0xb6, 0x50, 0x06, 0x0d, 0x78,\n  0x0a, 0x2e, 0x2b, 0xa4, 0xcb, 0x33, 0xf4, 0x11, 0x08, 0x15, 0xc6, 0xba,\n  0x21, 0x07, 0xb5, 0x50, 0x48, 0x90, 0x0e, 0x15, 0xe3, 0xc4, 0xad, 0xd7,\n  0x83, 0x48, 0xed, 0x97, 0xb5, 0x0d, 0x14, 0x8a, 0x2e, 0x39, 0xf8, 0xa0,\n  0x07, 0xfc, 0x79, 0x9a, 0xb0, 0x35, 0x82, 0xff, 0xc1, 0xc6, 0x9a, 0x4f,\n  0x8e, 0x85, 0x2c, 0x84, 0xa5, 0xcb, 0x43, 0xa6, 0x05, 0x6a, 0xa1, 0xcb,\n  0xb6, 0x8d, 0x1d, 0x5c, 0xda, 0x5c, 0xe7, 0xdd, 0x18, 0xad, 0xef, 0x6e,\n  0x9b, 0xf1, 0x9f, 0xa7, 0xaf, 0x2b, 0x6d, 0xed, 0x98, 0x3e, 0xba, 0x6b,\n  0x6a, 0xc9, 0x8a, 0x5a, 0xf8, 0xcd, 0x3d, 0xfd, 0x73, 0x96, 0x41, 0x9d,\n  0xb6, 0xaa, 0xbc, 0xa6, 0xb6, 0xe1, 0xf2, 0xe2, 0xc8, 0x50, 0x7f, 0xf6,\n  0xe3, 0x68, 0xcf, 0x9e, 0x63, 0x03, 0x00, 0xab, 0x08, 0x35, 0x40, 0xd0,\n  0x63, 0x78, 0x6d, 0x0a, 0x4c, 0x30, 0xe3, 0x87, 0x43, 0x18, 0x6e, 0x1e,\n  0x22, 0xa2, 0x24, 0x21, 0x4a, 0xce, 0x94, 0xc1, 0xa3, 0x43, 0x14, 0x6f,\n  0x8a, 0xd7, 0x9a, 0x46, 0x8f, 0x3d, 0x30, 0x85, 0x8d, 0xb8, 0x81, 0xac,\n  0x11, 0xbd, 0x3e, 0x90, 0xf7, 0x0e, 0x23, 0x60, 0x9b, 0x2b, 0xa0, 0xee,\n  0x37, 0xde, 0x02, 0xd8, 0xdd, 0x20, 0x8c, 0x04, 0xbc, 0x96, 0x05, 0x81,\n  0x9c, 0x1e, 0x93, 0x13, 0x5d, 0xdc, 0xc6, 0x28, 0x1e, 0xb9, 0xc0, 0x89,\n  0x14, 0x92, 0x8e, 0xf6, 0x44, 0x84, 0x73, 0xfc, 0xe6, 0x63, 0xc7, 0xa6,\n  0x8e, 0x1d, 0x83, 0xb7, 0x3f, 0xd6, 0x71, 0xf6, 0x6c, 0xc7, 0x63, 0x03,\n  0xb4, 0x4e, 0x09, 0x7a, 0x8c, 0xf0, 0xe5, 0x8b, 0x94, 0x9f, 0x0d, 0x85,\n  0xfc, 0xac, 0xc5, 0xfc, 0xfc, 0x18, 0xb1, 0x9d, 0x5e, 0xa4, 0xfc, 0x7c,\n  0x84, 0xca, 0x6e, 0x2d, 0xe6, 0x57, 0x3a, 0x36, 0xe2, 0x17, 0x31, 0xaa,\n  0xa1, 0x2c, 0x8b, 0xac, 0xb2, 0xd3, 0xc1, 0x2a, 0xf3, 0x06, 0x4b, 0x9c,\n  0x58, 0x56, 0x95, 0xd5, 0xa0, 0x17, 0x07, 0xad, 0xca, 0x1f, 0x74, 0x8e,\n  0x0d, 0x61, 0xf8, 0xc8, 0x9e, 0x27, 0x4a, 0x28, 0x25, 0xd6, 0xe8, 0xe5,\n  0x5d, 0x58, 0x67, 0x31, 0x12, 0xbb, 0x01, 0xd3, 0x16, 0xce, 0x7a, 0x50,\n  0x67, 0xbe, 0x7a, 0x4b, 0x8d, 0x9a, 0xb0, 0x35, 0x4c, 0x8d, 0x1a, 0x9b,\n  0x52, 0x72, 0xd5, 0xd2, 0x33, 0x08, 0xd6, 0x78, 0xfc, 0xf0, 0xc1, 0x0b,\n  0xa6, 0xfb, 0xba, 0x3b, 0xb1, 0x3c, 0xce, 0xde, 0xb1, 0xfb, 0x82, 0x63,\n  0x7b, 0xd0, 0xde, 0xec, 0xc7, 0xfb, 0x86, 0x86, 0x7a, 0xf0, 0xfe, 0x4a,\n  0xfc, 0xa8, 0xf0, 0x7e, 0xb2, 0xfe, 0x7f, 0x4b, 0xd7, 0x7f, 0x31, 0x93,\n  0x77, 0x5d, 0x45, 0xaf, 0x83, 0x2e, 0x7b, 0xa0, 0x90, 0x5e, 0xf4, 0x7e,\n  0x48, 0xbe, 0xdf, 0xbf, 0x65, 0x9d, 0xfb, 0x44, 0x97, 0xa5, 0xef, 0x9d,\n  0xe1, 0xf3, 0xdf, 0x6b, 0x97, 0xaf, 0xcf, 0x69, 0x72, 0xd7, 0x1d, 0xf2,\n  0xfb, 0x40, 0x97, 0x3d, 0x4d, 0xcf, 0x3d, 0xf3, 0x74, 0x59, 0xfa, 0xce,\n  0x1f, 0xc8, 0xdf, 0x1c, 0x3c, 0xaf, 0xf0, 0xcc, 0xa4, 0x6b, 0x25, 0x42,\n  0x68, 0x15, 0x61, 0x6a, 0x32, 0x95, 0x46, 0x04, 0x33, 0x45, 0xcb, 0xfb,\n  0x71, 0x83, 0xb4, 0x66, 0xd9, 0x4e, 0x05, 0x9d, 0x29, 0x71, 0xd7, 0xed,\n  0x61, 0x87, 0xad, 0x61, 0x6b, 0x2c, 0x1a, 0x84, 0x0d, 0x5e, 0x61, 0x2b,\n  0xa8, 0x6b, 0x59, 0xbf, 0x8a, 0x92, 0xf8, 0x07, 0x41, 0xa9, 0x44, 0x87,\n  0xa9, 0x57, 0xdb, 0x96, 0xae, 0xa9, 0x28, 0x0a, 0x26, 0x44, 0xd2, 0x4e,\n  0x77, 0x97, 0x97, 0x9d, 0x5f, 0xae, 0x40, 0x0d, 0xbc, 0xa2, 0xa6, 0x2c,\n  0xd2, 0xe1, 0x54, 0xe5, 0x53, 0x39, 0x7b, 0xc7, 0xe1, 0xc6, 0xa6, 0xae,\n  0xbc, 0xb1, 0x4f, 0xc8, 0x63, 0x1c, 0x61, 0x3e, 0xba, 0xfe, 0x18, 0x89,\n  0x8e, 0x4a, 0xc7, 0x38, 0x36, 0x50, 0x38, 0x46, 0x18, 0xc8, 0x3f, 0xc8,\n  0x3e, 0x88, 0xf9, 0x41, 0x89, 0xd6, 0x1c, 0x0a, 0xe1, 0xfb, 0x3a, 0x46,\n  0xe7, 0x22, 0x46, 0x7b, 0x2a, 0xaf, 0x54, 0x2f, 0xf7, 0xf4, 0xd3, 0x0b,\n  0x97, 0xea, 0x8c, 0x4a, 0x85, 0x45, 0x73, 0xe9, 0xe2, 0x33, 0x98, 0x19,\n  0xae, 0x0f, 0xd7, 0x38, 0x9d, 0x0d, 0x3e, 0x74, 0x21, 0x78, 0xd4, 0x11,\n  0xe6, 0x22, 0xa8, 0x43, 0xd5, 0xcc, 0x04, 0x40, 0x23, 0x72, 0x19, 0xb1,\n  0x02, 0x08, 0xa5, 0x20, 0x59, 0xc2, 0x6f, 0x0a, 0x5e, 0xb6, 0xdc, 0x03,\n  0x4c, 0xc0, 0xed, 0x32, 0xbb, 0xc0, 0xe4, 0x0b, 0x72, 0xd4, 0x27, 0xbb,\n  0x7e, 0x45, 0x60, 0x0e, 0xfd, 0x63, 0x49, 0xa5, 0xe7, 0x78, 0xad, 0x6a,\n  0x69, 0xfe, 0x8e, 0xc9, 0x49, 0xb5, 0x85, 0x57, 0x1a, 0x35, 0x73, 0x13,\n  0x5b, 0xd5, 0x66, 0x05, 0xab, 0xd1, 0x72, 0x5b, 0x27, 0xee, 0x44, 0xfb,\n  0x8b, 0x9b, 0x9c, 0xee, 0x0d, 0xde, 0xec, 0x2d, 0xb8, 0x37, 0x0f, 0x85,\n  0x47, 0x7d, 0xde, 0x8e, 0x04, 0x9a, 0xc9, 0xde, 0x17, 0xea, 0xf5, 0x98,\n  0xca, 0x4a, 0xf5, 0xe8, 0xbc, 0xe5, 0x27, 0x31, 0x3d, 0x48, 0xbf, 0x08,\n  0x7f, 0xbe, 0x4e, 0xf9, 0xf3, 0x38, 0xe5, 0x17, 0x7a, 0x3d, 0x44, 0xaf,\n  0x63, 0x5a, 0xf6, 0x33, 0x5f, 0x5a, 0x73, 0x4e, 0x4e, 0xc7, 0xf4, 0xaa,\n  0xfc, 0xec, 0xcc, 0x96, 0xfc, 0x67, 0xed, 0xf2, 0xf5, 0xb9, 0x25, 0xb1,\n  0xa6, 0x1d, 0xfe, 0xeb, 0x35, 0x72, 0xb6, 0x8a, 0xad, 0x49, 0xb5, 0x92,\n  0xe3, 0xa4, 0x44, 0xc5, 0x4e, 0x02, 0x5d, 0x43, 0x8c, 0x72, 0x8b, 0x19,\n  0x36, 0xe8, 0x7a, 0x21, 0x6c, 0xe5, 0x52, 0xce, 0xfa, 0x14, 0x67, 0x0d,\n  0x9f, 0xfd, 0xc8, 0xd2, 0xbf, 0x7c, 0x69, 0xe1, 0xda, 0x6b, 0x17, 0x1f,\n  0xfd, 0xce, 0x8e, 0x97, 0x5f, 0x46, 0x71, 0x64, 0xff, 0xd9, 0xcf, 0xb2,\n  0xaf, 0x64, 0x5f, 0x10, 0xf3, 0x89, 0xf1, 0x5f, 0xcf, 0x13, 0x5f, 0x58,\n  0x38, 0x53, 0x2c, 0x60, 0xb1, 0x98, 0x47, 0x57, 0xf9, 0x98, 0x45, 0xc5,\n  0xa8, 0x2c, 0x16, 0x98, 0x31, 0xc4, 0x61, 0x31, 0x06, 0x19, 0xc4, 0xe8,\n  0xf9, 0x27, 0x66, 0x9e, 0x58, 0xb8, 0xf1, 0x26, 0x4c, 0x9a, 0x4f, 0xff,\n  0xe2, 0x67, 0x68, 0x29, 0xfb, 0x17, 0x64, 0x96, 0xfc, 0xb8, 0xe8, 0x79,\n  0x42, 0x8f, 0xbf, 0x53, 0x7a, 0xbc, 0xc4, 0xe4, 0x5d, 0x0f, 0xd1, 0xeb,\n  0xb0, 0x1e, 0x57, 0xed, 0xd7, 0xb4, 0x1f, 0xaf, 0xca, 0xcf, 0xcd, 0x7c,\n  0x2f, 0xff, 0x39, 0xbb, 0x7c, 0x7d, 0xee, 0xdf, 0x69, 0xbf, 0x7d, 0xf8,\n  0xaf, 0xef, 0x10, 0xff, 0x0a, 0x96, 0xc7, 0xb0, 0x39, 0x23, 0x52, 0xc7,\n  0x91, 0x44, 0x67, 0x30, 0xa2, 0x10, 0xa2, 0x62, 0x9e, 0xca, 0x64, 0x35,\n  0xa3, 0xb6, 0x98, 0x2d, 0x0a, 0xe2, 0x5d, 0x43, 0xc1, 0x74, 0xd0, 0x8e,\n  0x82, 0x76, 0x1f, 0xaa, 0xcc, 0xbe, 0x80, 0x6e, 0xcb, 0x3e, 0x8b, 0xea,\n  0x1b, 0xd0, 0xd7, 0xfb, 0x36, 0x64, 0xbb, 0x29, 0x36, 0x12, 0x79, 0x37,\n  0x19, 0xc3, 0x3b, 0x74, 0x0c, 0xbf, 0x65, 0xf2, 0xae, 0x87, 0xe8, 0x75,\n  0x90, 0xd1, 0xc1, 0xc2, 0x31, 0xd0, 0xfb, 0x0a, 0xf1, 0x3e, 0x9c, 0x6f,\n  0xdd, 0xb9, 0x66, 0xce, 0x53, 0x28, 0xc0, 0x5c, 0xc8, 0x3e, 0x8f, 0x7a,\n  0x20, 0x86, 0x06, 0x05, 0x72, 0xc8, 0xc7, 0x28, 0x40, 0xcd, 0x5d, 0x90,\n  0x13, 0x48, 0xc9, 0xbc, 0x86, 0xbe, 0x81, 0xe7, 0xd9, 0x05, 0x91, 0x7b,\n  0x78, 0xfd, 0xcc, 0x88, 0x55, 0x3c, 0x19, 0x34, 0x16, 0x09, 0x11, 0xf0,\n  0x9c, 0xda, 0x5c, 0xac, 0x57, 0x17, 0x36, 0x4b, 0x2b, 0x2b, 0x63, 0xf1,\n  0x4a, 0xb4, 0x58, 0x59, 0x56, 0x56, 0x89, 0xff, 0xe0, 0xef, 0xd4, 0x30,\n  0x6f, 0xb2, 0xef, 0xa0, 0xb3, 0xe8, 0x34, 0x53, 0xc6, 0xd4, 0xb0, 0x58,\n  0x68, 0x3e, 0xc1, 0x64, 0xe0, 0xed, 0xb4, 0xfa, 0x55, 0xb1, 0xec, 0x77,\n  0x77, 0xe2, 0x17, 0x7f, 0x96, 0x7d, 0x0a, 0xcb, 0xea, 0x12, 0x56, 0x90,\n  0x5a, 0x41, 0x3f, 0xf1, 0xf5, 0x77, 0xc8, 0xf5, 0x14, 0xbb, 0x35, 0xef,\n  0x3a, 0x00, 0xd1, 0x94, 0x92, 0x7a, 0x5a, 0x55, 0x50, 0xbb, 0x7b, 0x4d,\n  0xfd, 0xd2, 0x04, 0x39, 0xab, 0xbf, 0x07, 0xf7, 0xbd, 0x38, 0xe3, 0xa3,\n  0x65, 0x03, 0x39, 0x56, 0xc5, 0x90, 0xf3, 0x3b, 0x19, 0x02, 0xc8, 0x4e,\n  0x82, 0xf3, 0x83, 0x41, 0x72, 0xf4, 0x1f, 0x84, 0xa3, 0x7f, 0x54, 0x9a,\n  0xcd, 0x6e, 0xde, 0x8c, 0xd8, 0xcd, 0x9b, 0x6b, 0xad, 0x9c, 0xc5, 0x56,\n  0x5b, 0x6b, 0x7b, 0xe7, 0xcf, 0x56, 0x86, 0x62, 0x01, 0xf1, 0xa3, 0xb8,\n  0x1f, 0x25, 0x4c, 0x69, 0x26, 0x1e, 0xf5, 0x1a, 0x95, 0xb0, 0xf2, 0x07,\n  0x59, 0x5a, 0xb0, 0x1c, 0x0c, 0x41, 0x12, 0xc9, 0x88, 0x5f, 0x5b, 0xc2,\n  0x94, 0xb8, 0xcd, 0x78, 0xed, 0x93, 0x72, 0x22, 0xd6, 0xf5, 0x56, 0x7c,\n  0x38, 0x57, 0x22, 0x5c, 0x94, 0x0c, 0xc6, 0x6f, 0x2d, 0x1d, 0xd2, 0xd3,\n  0xfa, 0xdf, 0x33, 0x50, 0xff, 0x9b, 0xd3, 0xe8, 0x14, 0x27, 0x66, 0xbe,\n  0xbd, 0xf5, 0x94, 0x42, 0xaf, 0xe1, 0x38, 0xb3, 0x70, 0x6a, 0xeb, 0x5e,\n  0x83, 0x4b, 0xa1, 0xb4, 0xeb, 0x0e, 0xad, 0x2d, 0xff, 0x9d, 0x4e, 0x5b,\n  0xd1, 0x8f, 0x97, 0xeb, 0xd0, 0xaf, 0x6c, 0x35, 0x55, 0x26, 0x17, 0x94,\n  0x08, 0x47, 0xf7, 0xd5, 0xed, 0x0e, 0x47, 0xe7, 0xab, 0xb2, 0xa3, 0x40,\n  0x7f, 0xd4, 0x8f, 0xe9, 0x7f, 0x1f, 0x3a, 0x8d, 0xf5, 0xfc, 0x1a, 0x56,\n  0xb1, 0x8a, 0xfe, 0x0a, 0x79, 0xae, 0x43, 0x2b, 0x71, 0x36, 0x8a, 0xc7,\n  0x17, 0x62, 0x4e, 0x53, 0x2b, 0xde, 0x62, 0x43, 0x1c, 0x6f, 0xa4, 0x38,\n  0x4f, 0xb0, 0x31, 0x20, 0x65, 0x9f, 0xa7, 0xe0, 0x22, 0xa2, 0x17, 0x67,\n  0x68, 0x73, 0x1f, 0x48, 0x57, 0x25, 0x43, 0x82, 0xb9, 0x09, 0x5c, 0x70,\n  0x6c, 0x48, 0xf2, 0x34, 0xc7, 0x21, 0x9c, 0x35, 0x8c, 0x65, 0x09, 0x6e,\n  0x72, 0x94, 0xd4, 0xe1, 0x53, 0xee, 0x58, 0xb7, 0x15, 0xd6, 0xc7, 0x26,\n  0xa0, 0x22, 0x67, 0x30, 0x2c, 0x08, 0x00, 0x80, 0x41, 0x14, 0x54, 0x51,\n  0x15, 0x0b, 0x8a, 0xab, 0x25, 0x87, 0x17, 0x89, 0xf5, 0xb2, 0x1e, 0x4d,\n  0x63, 0x5d, 0xa0, 0xbb, 0xad, 0xa9, 0xbc, 0xae, 0x2d, 0xfb, 0x14, 0x3a,\n  0x99, 0xbd, 0x01, 0xfd, 0x36, 0x7b, 0xc9, 0x53, 0x83, 0xd3, 0xb1, 0xa9,\n  0xf1, 0xd6, 0x1d, 0xbe, 0x40, 0xef, 0xf3, 0xbd, 0x2a, 0xa3, 0x10, 0xf1,\n  0x16, 0x07, 0x5b, 0xd8, 0xb6, 0xe1, 0x96, 0xe5, 0x7f, 0x89, 0x66, 0x92,\n  0x4d, 0x83, 0x4a, 0x5d, 0xfe, 0x78, 0x4b, 0x01, 0x27, 0x93, 0x8c, 0xd7,\n  0x85, 0x14, 0x4a, 0x23, 0x94, 0xe4, 0x44, 0x1a, 0x32, 0x5e, 0x0d, 0x8c,\n  0x37, 0xef, 0x22, 0xa2, 0x17, 0xc5, 0xf1, 0xc6, 0x05, 0xc4, 0xab, 0x10,\n  0xa7, 0xe6, 0xb9, 0xdd, 0x30, 0x72, 0x0d, 0xa3, 0xd9, 0x2e, 0x1d, 0x1e,\n  0xc4, 0x08, 0xe4, 0x87, 0x3c, 0xf2, 0x72, 0x71, 0xe4, 0xb9, 0x07, 0x18,\n  0x08, 0x7c, 0xd0, 0xec, 0x58, 0xb7, 0xfd, 0x4c, 0xc6, 0x54, 0x12, 0x09,\n  0xf8, 0xcc, 0xe0, 0x2d, 0x03, 0x4a, 0x68, 0x85, 0xc0, 0x1a, 0x4a, 0xd4,\n  0x63, 0x05, 0xae, 0x1e, 0xa8, 0xc1, 0x41, 0x36, 0xd9, 0xb9, 0x29, 0xf2,\n  0xf9, 0xeb, 0xbe, 0xf9, 0x19, 0xa0, 0xc9, 0x97, 0xae, 0xfd, 0xc6, 0xa7,\n  0xd6, 0xa5, 0x4a, 0x76, 0xf0, 0x7f, 0x86, 0x5b, 0xb2, 0x6f, 0x0f, 0xbe,\n  0x2a, 0x12, 0x06, 0xf3, 0x4b, 0xf9, 0xca, 0x9b, 0x58, 0xb6, 0xff, 0x17,\n  0x5e, 0x6f, 0x75, 0x6c, 0x58, 0xe6, 0x16, 0x5a, 0x83, 0xfc, 0x18, 0xa9,\n  0xd9, 0x87, 0xf7, 0x3d, 0x3d, 0xe4, 0xed, 0x29, 0xa4, 0x92, 0xba, 0xa4,\n  0x52, 0x17, 0x04, 0x6e, 0x2c, 0xe1, 0x21, 0x94, 0xb1, 0xc3, 0xd1, 0xa8,\n  0x95, 0x13, 0xdc, 0x49, 0xb9, 0xea, 0x79, 0x5e, 0x5c, 0xfc, 0x25, 0x23,\n  0x67, 0x47, 0x62, 0x15, 0xb6, 0xb0, 0xd5, 0x50, 0xe7, 0x1c, 0x1c, 0xbb,\n  0x1b, 0xbd, 0x44, 0x0a, 0x9e, 0x07, 0xab, 0x2b, 0x05, 0x45, 0xb7, 0xa0,\n  0xc6, 0x2f, 0x81, 0xba, 0x5d, 0xec, 0x49, 0xfc, 0x1d, 0x2f, 0x9c, 0xfe,\n  0x7a, 0xd4, 0xac, 0x02, 0x8e, 0x00, 0x14, 0x1c, 0x78, 0x60, 0xaf, 0x60,\n  0x49, 0x90, 0x3e, 0xa7, 0x60, 0xb8, 0x3d, 0xf8, 0x73, 0x31, 0x82, 0x79,\n  0x11, 0xe7, 0xc5, 0x13, 0x56, 0x6b, 0xd8, 0x4e, 0x34, 0x5d, 0xcc, 0x39,\n  0x56, 0x19, 0xb2, 0x80, 0xa0, 0xef, 0x48, 0x19, 0x62, 0x61, 0x50, 0x57,\n  0xd2, 0x1f, 0xf9, 0xe2, 0xec, 0x83, 0x0f, 0x1e, 0xb9, 0x60, 0x76, 0x7e,\n  0xeb, 0xec, 0xc2, 0xec, 0xc5, 0x87, 0x59, 0xdf, 0xe0, 0xe2, 0xe2, 0xe0,\n  0xa2, 0xfe, 0x83, 0x07, 0x1f, 0x7b, 0x70, 0x61, 0xc7, 0xe2, 0xfc, 0x97,\n  0xbe, 0x72, 0xf8, 0x3a, 0xdd, 0x22, 0x23, 0xd6, 0x6d, 0x84, 0x5a, 0xdb,\n  0x50, 0xd7, 0xad, 0x18, 0xce, 0x5b, 0xfc, 0x1e, 0x23, 0xc7, 0x43, 0x58,\n  0x16, 0x00, 0x9b, 0x30, 0x3c, 0x07, 0xfd, 0x81, 0x91, 0xe7, 0x02, 0x04,\n  0x1d, 0x61, 0x47, 0xcc, 0xac, 0x10, 0x3c, 0x49, 0x44, 0xa0, 0x2d, 0xe8,\n  0xac, 0xd0, 0x28, 0x54, 0x4e, 0x3a, 0x90, 0x00, 0x4c, 0x1b, 0xac, 0x20,\n  0x9d, 0xfe, 0xea, 0xe2, 0x77, 0x2e, 0xba, 0xe8, 0xbe, 0xfb, 0xee, 0xbd,\n  0xef, 0xa2, 0x8b, 0x9e, 0xd8, 0x5e, 0x7d, 0xf8, 0xf8, 0x89, 0xf3, 0xb6,\n  0x6e, 0x99, 0x5d, 0x9c, 0x43, 0x8f, 0x20, 0x47, 0xf6, 0x37, 0xa6, 0x63,\n  0x13, 0x3b, 0x2e, 0xbd, 0x74, 0xc7, 0xc4, 0x31, 0x13, 0xf2, 0x66, 0x0d,\n  0x1d, 0xa3, 0xa3, 0x1d, 0x6d, 0xfd, 0xc2, 0x35, 0xd7, 0x08, 0xc4, 0x1d,\n  0x22, 0xd5, 0x71, 0x63, 0xea, 0x98, 0xf1, 0xcc, 0x68, 0x42, 0x8b, 0x37,\n  0xc9, 0xb8, 0x8e, 0xe5, 0x59, 0x8f, 0x8b, 0xe5, 0xf8, 0x34, 0x75, 0xc7,\n  0xf3, 0x2c, 0xa0, 0xc7, 0x5f, 0xa1, 0x04, 0x5f, 0xdc, 0x22, 0x04, 0x21,\n  0x25, 0x87, 0x68, 0xfe, 0x9a, 0x0a, 0x70, 0x90, 0x48, 0x1c, 0x5b, 0x6d,\n  0x4d, 0x59, 0x69, 0x34, 0x1c, 0x20, 0xb9, 0x77, 0xa4, 0x0e, 0x4e, 0x1d,\n  0xaa, 0x13, 0xc3, 0x41, 0xd7, 0x1a, 0x87, 0xa4, 0xe2, 0x6c, 0xca, 0xee,\n  0x70, 0xac, 0xae, 0x13, 0x2f, 0x61, 0x6a, 0x29, 0xd1, 0xf8, 0xd6, 0x4b,\n  0x5b, 0x5a, 0xcf, 0x1f, 0x8d, 0x0d, 0xf8, 0x43, 0x8e, 0x5a, 0xdf, 0xa6,\n  0xd9, 0x5d, 0x3b, 0x03, 0xf5, 0xee, 0xd9, 0xa2, 0x86, 0xe2, 0x9d, 0xbb,\n  0xe6, 0x36, 0xf9, 0x52, 0xce, 0x90, 0x7f, 0x20, 0x36, 0x7a, 0x7e, 0x6b,\n  0xcb, 0x25, 0x5b, 0xf7, 0xf4, 0xf4, 0x68, 0xe6, 0xef, 0x3f, 0x74, 0xf0,\n  0x9e, 0x19, 0x97, 0xbd, 0xc3, 0x6c, 0xbb, 0xf3, 0xe4, 0xe9, 0x4f, 0xba,\n  0xac, 0x3f, 0xf9, 0x89, 0xcd, 0xf9, 0xc9, 0xd3, 0x27, 0xef, 0xb4, 0x99,\n  0x3b, 0xec, 0xae, 0x99, 0x7b, 0x0e, 0x1e, 0xba, 0x7f, 0xbe, 0xb5, 0x95,\n  0xe2, 0x02, 0xbc, 0x82, 0xff, 0x3a, 0x4c, 0xea, 0x87, 0xfb, 0x99, 0x54,\n  0xa6, 0x0a, 0xf0, 0xb1, 0x41, 0xa3, 0x83, 0xe8, 0x3c, 0x31, 0xc0, 0x49,\n  0xac, 0x2d, 0x9d, 0x94, 0xb1, 0xd6, 0xe3, 0xdc, 0x70, 0x24, 0x18, 0x09,\n  0x47, 0x70, 0x3f, 0xbd, 0x78, 0x93, 0x12, 0x3b, 0x4c, 0xf1, 0x22, 0xa5,\n  0xbc, 0x7e, 0xc9, 0xc8, 0xbb, 0x37, 0x52, 0xe3, 0x88, 0x59, 0x1d, 0x15,\n  0xad, 0x9b, 0x27, 0xf6, 0x5f, 0x73, 0xd5, 0x95, 0x57, 0xfe, 0x70, 0x76,\n  0xef, 0xe4, 0xd4, 0xe2, 0xe4, 0x3c, 0xeb, 0x4a, 0x37, 0xab, 0x14, 0x3d,\n  0xe6, 0xcd, 0x3b, 0x2f, 0xdd, 0xbb, 0xb4, 0xf3, 0xd0, 0x60, 0xa6, 0x77,\n  0xb0, 0x56, 0xaa, 0xfd, 0xca, 0x25, 0x31, 0x5f, 0xe8, 0x18, 0x13, 0xe3,\n  0x86, 0x73, 0x60, 0x08, 0xc4, 0x55, 0x42, 0x20, 0x2e, 0xec, 0xfa, 0x3c,\n  0x02, 0xde, 0x84, 0xea, 0x9c, 0xf3, 0x6a, 0x85, 0x8a, 0x23, 0x7d, 0xd1,\n  0xeb, 0x19, 0xc6, 0xed, 0xb4, 0x9a, 0xf5, 0x26, 0xbd, 0xc9, 0x68, 0x10,\n  0x43, 0x6c, 0x34, 0x78, 0x91, 0xa4, 0xcc, 0x50, 0x6a, 0x4a, 0xec, 0x12,\n  0x84, 0x68, 0x47, 0xa5, 0x5e, 0x3d, 0xf8, 0x00, 0xe2, 0xf7, 0x5d, 0x73,\n  0xe5, 0x15, 0x57, 0xa1, 0xb9, 0xd9, 0xe5, 0x17, 0xf6, 0x6e, 0x9e, 0xda,\n  0x36, 0xb9, 0xc0, 0x5e, 0x3a, 0x9c, 0x3d, 0x03, 0x7d, 0x81, 0xd2, 0x62,\n  0x52, 0x7f, 0x88, 0x8d, 0xc3, 0xb9, 0x49, 0xfd, 0xe5, 0x00, 0xd3, 0x92,\n  0x69, 0xe4, 0x20, 0xd6, 0x07, 0xeb, 0xf4, 0x50, 0x17, 0x84, 0xd1, 0xa8,\n  0x15, 0x9a, 0xdd, 0x22, 0xa3, 0xaa, 0xd5, 0xca, 0x05, 0xad, 0x8a, 0x55,\n  0x2a, 0xe3, 0x90, 0xd0, 0x12, 0x80, 0xa2, 0x98, 0x80, 0x82, 0x1d, 0x09,\n  0x12, 0x1b, 0x51, 0x27, 0x90, 0x64, 0x55, 0x09, 0x16, 0x46, 0xa6, 0x13,\n  0xb6, 0xc8, 0x64, 0x52, 0x2d, 0xce, 0xde, 0x36, 0xfb, 0xfb, 0xdf, 0x93,\n  0x6e, 0xfd, 0xe0, 0xb6, 0x57, 0xc5, 0x4e, 0x3d, 0xb5, 0xb0, 0xb0, 0xd0,\n  0x7f, 0x25, 0xe9, 0x56, 0xf1, 0xf2, 0x8b, 0x52, 0xb7, 0xe8, 0xfa, 0xe1,\n  0x1e, 0x61, 0xcf, 0x40, 0x5d, 0x68, 0xb0, 0xf4, 0xed, 0x24, 0x63, 0x1d,\n  0x31, 0xbc, 0x00, 0x5d, 0x83, 0xc0, 0x5b, 0xe8, 0x57, 0x12, 0x32, 0x9e,\n  0x29, 0xe6, 0x68, 0x5c, 0xc6, 0xc6, 0x0d, 0xcb, 0xcd, 0x48, 0xbd, 0x31,\n  0x11, 0x30, 0x68, 0x55, 0xd3, 0x4c, 0xfc, 0x5c, 0xad, 0xf0, 0x7d, 0x68,\n  0x4a, 0x12, 0xe3, 0xca, 0x48, 0xbe, 0xa9, 0x16, 0x33, 0x32, 0x60, 0x3e,\n  0x86, 0x55, 0x78, 0x94, 0x56, 0xf1, 0x90, 0xd0, 0x49, 0xca, 0x4e, 0x9b,\n  0xc3, 0x04, 0x00, 0x33, 0x16, 0xad, 0x15, 0x13, 0x0e, 0x6c, 0x14, 0x6f,\n  0xaa, 0xa5, 0xf3, 0xfa, 0x3d, 0xdb, 0x4e, 0x0e, 0xa8, 0x1e, 0x9e, 0x9d,\n  0x7d, 0x88, 0xeb, 0x3d, 0xbd, 0x63, 0xcf, 0xf5, 0x5d, 0xac, 0xa1, 0x62,\n  0x61, 0xa0, 0x7f, 0xa1, 0xbc, 0x7c, 0x7e, 0x70, 0x60, 0xbe, 0x02, 0xed,\n  0x3a, 0xf8, 0x99, 0xad, 0xc3, 0x1f, 0x9c, 0x47, 0x15, 0x78, 0xfb, 0x1d,\n  0xde, 0xf5, 0xf1, 0xa9, 0xad, 0x9f, 0x3d, 0x38, 0x79, 0x55, 0x6f, 0xef,\n  0x95, 0x53, 0x53, 0xf8, 0xef, 0xab, 0x18, 0x79, 0x6e, 0xfe, 0x9d, 0x7d,\n  0x1a, 0xeb, 0x0f, 0x6e, 0xf0, 0x18, 0xd9, 0x11, 0x84, 0x20, 0xa8, 0x60,\n  0xfb, 0x84, 0x52, 0x9d, 0x7b, 0xe8, 0xcc, 0xa8, 0x05, 0x05, 0xe5, 0x13,\n  0x6c, 0xa5, 0x9a, 0xf2, 0xcc, 0x76, 0x0d, 0x16, 0x66, 0xd0, 0xc7, 0xa0,\n  0x35, 0x85, 0x88, 0xe3, 0xcf, 0x1a, 0x34, 0xa3, 0x14, 0xc4, 0x78, 0x62,\n  0xfb, 0x78, 0x71, 0x16, 0xc5, 0x4e, 0x6c, 0x45, 0xf6, 0x2d, 0x27, 0x7e,\n  0x79, 0xc9, 0x96, 0x2b, 0xb3, 0x6f, 0xa1, 0x8b, 0xee, 0x4f, 0x0a, 0x45,\n  0x2a, 0xce, 0x68, 0x56, 0x62, 0x2d, 0xe1, 0x19, 0x94, 0x5e, 0x4e, 0xa1,\n  0xfe, 0xec, 0x63, 0xe4, 0xcf, 0x1d, 0x87, 0x6d, 0x5d, 0x2e, 0x43, 0xb2,\n  0xd4, 0x48, 0xf8, 0x17, 0x3a, 0x76, 0x03, 0xee, 0x13, 0x47, 0x38, 0xb8,\n  0x1a, 0xb2, 0xf1, 0xa1, 0x3b, 0x2c, 0xbf, 0x47, 0x41, 0x79, 0x57, 0x0c,\n  0x3f, 0x8b, 0x33, 0x84, 0x71, 0x29, 0xd3, 0xaa, 0x55, 0x24, 0xc6, 0x58,\n  0x10, 0x9c, 0x49, 0x84, 0x82, 0xc8, 0x09, 0x51, 0xa6, 0xd0, 0x15, 0x4e,\n  0x08, 0xc6, 0xd1, 0x85, 0xc8, 0xbe, 0x7c, 0x01, 0x72, 0x57, 0x08, 0x4e,\n  0x55, 0xf7, 0x8f, 0x3b, 0x04, 0xd7, 0x87, 0xba, 0xd1, 0x9d, 0x5d, 0xec,\n  0xd3, 0xcb, 0x29, 0xf6, 0xe9, 0xcd, 0x8e, 0x4e, 0xc7, 0x63, 0x8f, 0xd9,\n  0x3a, 0xb3, 0x9f, 0x79, 0xfc, 0x71, 0xfc, 0x06, 0x48, 0x8e, 0xfb, 0x4f,\n  0xcc, 0xab, 0x4e, 0xa6, 0x08, 0xeb, 0xa4, 0x5d, 0x99, 0x8d, 0x26, 0x3d,\n  0xab, 0xe4, 0xcd, 0x3a, 0x16, 0x2f, 0xa0, 0x41, 0x35, 0x12, 0x94, 0x2a,\n  0x25, 0x24, 0x1f, 0xab, 0x20, 0x84, 0x40, 0x45, 0x70, 0x3c, 0x45, 0x3d,\n  0x81, 0x44, 0xbf, 0xc6, 0xd1, 0xb0, 0xd7, 0x53, 0x1c, 0xf0, 0x44, 0xbc,\n  0x61, 0x8b, 0xd3, 0x49, 0xc2, 0x29, 0x31, 0x89, 0xa2, 0xe4, 0x50, 0x43,\n  0x08, 0xd7, 0x63, 0xfd, 0x8a, 0xe8, 0x71, 0x7e, 0xd6, 0xe9, 0x0c, 0xa3,\n  0xfa, 0xa0, 0x15, 0x4f, 0xa7, 0x10, 0xac, 0x60, 0xc3, 0x6c, 0xf7, 0x83,\n  0x63, 0x0f, 0x56, 0xcf, 0x75, 0x5b, 0x2a, 0xfb, 0x1b, 0x9f, 0x62, 0xdb,\n  0x7f, 0xd8, 0xd8, 0x57, 0x69, 0xe9, 0x9d, 0xcb, 0xbe, 0xf5, 0xcf, 0xd9,\n  0xfb, 0x3e, 0x52, 0xd5, 0x5a, 0x62, 0x46, 0x57, 0x1b, 0x13, 0xad, 0x55,\n  0x9f, 0xc1, 0xff, 0xfc, 0xa2, 0x71, 0xb4, 0x5c, 0xf1, 0x4e, 0x6d, 0xed,\n  0x3b, 0x8a, 0xf2, 0xa1, 0x0d, 0x2f, 0xa1, 0x4f, 0xbd, 0x90, 0xfd, 0x95,\n  0xb9, 0xaa, 0xba, 0xa2, 0xda, 0xca, 0x70, 0xf2, 0x5c, 0x6a, 0xb1, 0x24,\n  0x72, 0x03, 0xa6, 0x8a, 0x99, 0xcc, 0x26, 0xb6, 0x9c, 0xa1, 0x0a, 0xad,\n  0x20, 0x4f, 0x27, 0x70, 0x29, 0x5e, 0xfb, 0x2c, 0x99, 0x52, 0x87, 0x83,\n  0x61, 0x1c, 0x6e, 0x87, 0xdb, 0xe5, 0xd4, 0xeb, 0xe4, 0x78, 0x1b, 0x2d,\n  0xde, 0x23, 0xa4, 0x89, 0x0d, 0xe6, 0x4d, 0xaa, 0x91, 0x0d, 0xc6, 0xa5,\n  0x79, 0x5d, 0xbe, 0xa0, 0x70, 0x52, 0xbb, 0xb7, 0xa1, 0x3b, 0xb7, 0x14,\n  0xcc, 0xac, 0x3c, 0xab, 0xdf, 0x7c, 0xe7, 0x1d, 0x52, 0x53, 0x68, 0xe5,\n  0x72, 0xf6, 0xd3, 0xec, 0x0f, 0xb1, 0x94, 0x5c, 0xc8, 0x68, 0x1c, 0x78,\n  0x83, 0xb6, 0x93, 0xda, 0x73, 0x62, 0x99, 0x1b, 0x00, 0x1c, 0xbc, 0x06,\n  0xce, 0x79, 0x25, 0xa5, 0x03, 0xb2, 0xc1, 0x20, 0xf4, 0x32, 0x2e, 0xd6,\n  0xab, 0xe0, 0x0b, 0x6f, 0xe3, 0x1b, 0x32, 0x16, 0x49, 0x1c, 0xd2, 0x6a,\n  0x35, 0xd6, 0x68, 0xdc, 0x6c, 0xb6, 0x99, 0x04, 0x42, 0x72, 0xd0, 0x5d,\n  0xc9, 0x69, 0x0d, 0x30, 0x82, 0x04, 0x21, 0x4b, 0x31, 0x64, 0x53, 0xec,\n  0xa7, 0xb7, 0x9e, 0x67, 0x72, 0xaa, 0xd4, 0x33, 0x6a, 0xc1, 0x6d, 0x88,\n  0x59, 0x62, 0xf5, 0x15, 0xb6, 0x62, 0xad, 0xd6, 0xa1, 0x0d, 0x87, 0x5d,\n  0x5f, 0xdc, 0x8a, 0x50, 0xa6, 0x66, 0x3c, 0xb1, 0xfc, 0x21, 0xf6, 0x70,\n  0xd9, 0x52, 0xf9, 0xf9, 0x0d, 0x33, 0x29, 0x81, 0xef, 0xe7, 0x15, 0xad,\n  0xdd, 0x2c, 0xd1, 0xeb, 0xed, 0x2b, 0x9d, 0x64, 0xff, 0xef, 0x41, 0xdf,\n  0x66, 0x7f, 0x2b, 0xeb, 0x1f, 0x2c, 0xa3, 0x5c, 0xe9, 0xe4, 0x8e, 0x93,\n  0xbd, 0xd8, 0x0d, 0x31, 0x0a, 0x80, 0xd9, 0xc7, 0x8e, 0x43, 0xe0, 0xbe,\n  0x72, 0x1e, 0x00, 0xc5, 0x62, 0x43, 0x2a, 0x80, 0x12, 0x90, 0x64, 0x3f,\n  0x96, 0xb6, 0x2e, 0xab, 0x85, 0x38, 0x84, 0xc5, 0x85, 0xe4, 0x4d, 0x22,\n  0x3b, 0xc8, 0x57, 0x92, 0xd0, 0x69, 0x4e, 0xb5, 0x72, 0xf5, 0x4e, 0x40,\n  0x7b, 0x0a, 0x72, 0xc7, 0xb3, 0x3f, 0x9c, 0x9d, 0xcc, 0xda, 0x27, 0xeb,\n  0x23, 0xed, 0x35, 0xc5, 0xfc, 0xeb, 0x9f, 0xe6, 0x03, 0x95, 0x1b, 0x8a,\n  0xd1, 0x10, 0xfb, 0xd4, 0xd0, 0xf2, 0x73, 0xd9, 0xbf, 0x7d, 0xe3, 0x1b,\n  0x48, 0xd7, 0xfa, 0xb1, 0xfb, 0x1f, 0x18, 0x19, 0x6b, 0xbc, 0xf5, 0xce,\n  0x9b, 0xea, 0xa4, 0x9a, 0xee, 0xff, 0xc3, 0xdd, 0x8e, 0xfb, 0xe2, 0x63,\n  0x26, 0x32, 0x1a, 0x23, 0xe2, 0x90, 0x01, 0x12, 0xad, 0x07, 0x45, 0x44,\n  0x60, 0x58, 0x43, 0x92, 0x6e, 0x0b, 0x3b, 0x2e, 0x2b, 0x91, 0xd8, 0x93,\n  0x7f, 0x87, 0x50, 0x57, 0x3c, 0xb8, 0x2d, 0x63, 0x09, 0x56, 0xa8, 0x13,\n  0x93, 0xd7, 0x04, 0xfb, 0x55, 0x90, 0xc8, 0xa4, 0x02, 0xa2, 0xd6, 0x01,\n  0x6f, 0x07, 0xed, 0x41, 0x76, 0xfb, 0x96, 0x17, 0xd5, 0x0e, 0x87, 0x56,\n  0x1f, 0x6b, 0xc3, 0x63, 0xd1, 0x6b, 0xbd, 0x26, 0x7f, 0xd8, 0x26, 0xa8,\n  0x9c, 0x1e, 0x03, 0xfb, 0xb5, 0xec, 0xd3, 0xec, 0x25, 0xfd, 0xf7, 0x7e,\n  0xb8, 0xb6, 0x63, 0x5b, 0x95, 0xa0, 0x18, 0x50, 0x08, 0xd5, 0x7d, 0x91,\n  0xd8, 0x6d, 0x4f, 0x1e, 0x1a, 0x92, 0x6a, 0xab, 0xf2, 0xdd, 0x64, 0xdd,\n  0x61, 0x4d, 0xc6, 0x8e, 0x95, 0x59, 0x86, 0x20, 0x97, 0x71, 0x34, 0x87,\n  0x20, 0x46, 0x4c, 0x18, 0xd2, 0x4f, 0x31, 0xec, 0xc0, 0x6c, 0x35, 0x3b,\n  0x04, 0xcc, 0xa5, 0x41, 0x2e, 0x9c, 0x0b, 0x36, 0x08, 0x42, 0xa8, 0xb2,\n  0x19, 0xf2, 0xfe, 0x38, 0x74, 0xd7, 0x1f, 0x79, 0x8e, 0x1f, 0x3f, 0xf5,\n  0x02, 0xff, 0x22, 0xfa, 0x54, 0xf6, 0x37, 0x33, 0x0a, 0x96, 0xff, 0x33,\n  0x7b, 0x34, 0xb0, 0x77, 0x43, 0x76, 0x04, 0x6f, 0x4e, 0x5f, 0x61, 0xfb,\n  0x86, 0x96, 0xaf, 0x46, 0x5f, 0xa9, 0xdd, 0x55, 0xbc, 0x7c, 0xb3, 0x54,\n  0x7b, 0x96, 0xfd, 0x11, 0x7b, 0x86, 0x05, 0xc4, 0x50, 0x6c, 0x93, 0x32,\n  0x66, 0xcc, 0x9e, 0xb5, 0xd8, 0x0a, 0x61, 0xd1, 0xe3, 0xa8, 0x96, 0x58,\n  0x21, 0xbc, 0xd4, 0x86, 0xf8, 0xa9, 0xe1, 0xdc, 0xbb, 0x2f, 0xd3, 0x2d,\n  0x20, 0x85, 0x56, 0xa9, 0xe1, 0xf0, 0x26, 0xcf, 0xef, 0x95, 0x14, 0xad,\n  0xe4, 0x90, 0x9a, 0x24, 0xb4, 0xab, 0x68, 0x44, 0x7e, 0x49, 0xc2, 0xe7,\n  0x85, 0x40, 0xe6, 0xca, 0xf2, 0x44, 0xaa, 0x24, 0x15, 0x0e, 0x7a, 0xe3,\n  0xbe, 0xb8, 0xd3, 0x6e, 0xf2, 0x98, 0x3d, 0x58, 0xa7, 0x31, 0x22, 0xa3,\n  0xae, 0x50, 0xa7, 0x21, 0x0a, 0x4b, 0x3c, 0x2f, 0xc3, 0xbd, 0xfe, 0x1c,\n  0x75, 0x4e, 0xd1, 0xe9, 0x43, 0xb7, 0xf5, 0xf6, 0xde, 0x76, 0x78, 0xff,\n  0xad, 0x03, 0x03, 0xb7, 0x1e, 0xb8, 0xf8, 0xf0, 0xe1, 0x13, 0x27, 0x8e,\n  0x1d, 0x75, 0x38, 0xbc, 0x5e, 0x87, 0xd3, 0xe7, 0xbb, 0xdf, 0xe9, 0xf5,\n  0x3a, 0xf1, 0x1f, 0xcd, 0x96, 0xcf, 0x1e, 0x3a, 0xef, 0xbe, 0x2d, 0x73,\n  0x9f, 0x39, 0x74, 0xe8, 0x33, 0x5b, 0x86, 0x3f, 0x7e, 0xfa, 0xf4, 0x9d,\n  0x77, 0x9e, 0x3e, 0xfd, 0xf1, 0x3f, 0x78, 0xbc, 0x5e, 0x4f, 0xfe, 0x1f,\n  0xb9, 0xfe, 0x2e, 0xbf, 0x82, 0xc7, 0x17, 0x57, 0xfb, 0x58, 0xa8, 0x64,\n  0xa9, 0x54, 0xfb, 0x24, 0xde, 0x66, 0xef, 0xe6, 0xee, 0x60, 0x2c, 0x58,\n  0x26, 0x62, 0xad, 0x97, 0x51, 0x28, 0x15, 0xa7, 0x20, 0xab, 0x1a, 0x8d,\n  0x43, 0x99, 0x15, 0x89, 0xbf, 0xe1, 0x70, 0x49, 0xb2, 0x12, 0x18, 0xa6,\n  0xc8, 0x4d, 0x6b, 0x80, 0x38, 0x72, 0xfc, 0x5d, 0xc0, 0xdd, 0x78, 0x13,\n  0xa7, 0x0c, 0xce, 0x6e, 0x9c, 0x23, 0xec, 0x1d, 0x6e, 0xab, 0x09, 0x2a,\n  0x26, 0xee, 0xce, 0xf1, 0xf7, 0xf2, 0x35, 0x94, 0xbd, 0x5b, 0x3e, 0x72,\n  0xdf, 0x67, 0x87, 0x7e, 0xf9, 0x8c, 0xcc, 0xe0, 0x50, 0x43, 0xcb, 0x84,\n  0xde, 0xc4, 0xfa, 0x56, 0x12, 0x22, 0x87, 0x89, 0xe7, 0x81, 0x67, 0xa5,\n  0x02, 0x38, 0x12, 0xcf, 0x26, 0x73, 0xc9, 0xdb, 0xa5, 0xa0, 0x4d, 0x42,\n  0x29, 0x41, 0x95, 0x12, 0xb0, 0x58, 0x14, 0xc2, 0xfa, 0xa5, 0xa2, 0xd6,\n  0x7a, 0x1b, 0x60, 0x26, 0xde, 0x6e, 0xd9, 0x11, 0x4b, 0x6c, 0xaf, 0xef,\n  0xdf, 0x52, 0x31, 0x58, 0x51, 0xb1, 0x39, 0xdd, 0xba, 0x37, 0xd3, 0xb4,\n  0x90, 0xf4, 0x27, 0x87, 0x4b, 0xda, 0x37, 0x95, 0xf6, 0x96, 0x55, 0xcf,\n  0x34, 0x64, 0x8e, 0xbc, 0x56, 0x64, 0x9f, 0x74, 0x15, 0x4f, 0x8f, 0xd5,\n  0xf4, 0x34, 0xfa, 0x03, 0x9d, 0x4b, 0xfd, 0xfd, 0xfb, 0x37, 0x78, 0x9d,\n  0x7d, 0x4e, 0xf7, 0xe6, 0xa1, 0x74, 0x77, 0xda, 0x1f, 0xec, 0xd9, 0xda,\n  0xb9, 0xe9, 0x58, 0x13, 0xf4, 0x3b, 0x86, 0xe9, 0xfb, 0x51, 0xdc, 0xef,\n  0x34, 0x73, 0x5d, 0xc6, 0x5d, 0x89, 0x8d, 0x2c, 0xbd, 0x46, 0xc0, 0xd6,\n  0x42, 0x11, 0x12, 0x14, 0x6e, 0x52, 0x0b, 0xaf, 0x0a, 0x5b, 0x71, 0x22,\n  0x96, 0x51, 0x58, 0x8d, 0x8d, 0x09, 0xa4, 0x10, 0x00, 0xa5, 0x51, 0xa3,\n  0x41, 0xf3, 0xa0, 0x45, 0x23, 0x51, 0x74, 0x2b, 0x79, 0x56, 0xd4, 0x30,\n  0x92, 0xb9, 0x56, 0x74, 0x99, 0xe0, 0xb6, 0xda, 0x45, 0x46, 0xab, 0x4d,\n  0x0e, 0xc1, 0x91, 0x4e, 0x5c, 0xae, 0x83, 0x53, 0x06, 0x60, 0x8e, 0x96,\n  0xda, 0x9a, 0xf2, 0x64, 0x3c, 0x1a, 0x89, 0x46, 0xcc, 0x70, 0x00, 0x66,\n  0xd5, 0x09, 0x04, 0x4c, 0x4d, 0x00, 0x49, 0x8f, 0x52, 0x08, 0x85, 0x21,\n  0x88, 0x27, 0xbc, 0x26, 0x7f, 0x70, 0x55, 0x3d, 0x49, 0xa0, 0x13, 0x2b,\n  0x94, 0x46, 0x7f, 0x3c, 0x8b, 0x9a, 0x76, 0x61, 0xb3, 0xb6, 0xf3, 0x40,\n  0xf6, 0x9b, 0xb3, 0xdf, 0xec, 0xfa, 0xd0, 0x87, 0x1a, 0xf7, 0x96, 0x57,\n  0x1e, 0x02, 0x0c, 0xf3, 0x3d, 0xbb, 0x16, 0xf7, 0xed, 0x1d, 0xcd, 0x74,\n  0xcc, 0x94, 0x26, 0x4b, 0x2f, 0x19, 0x3a, 0xff, 0x38, 0x1b, 0xae, 0xea,\n  0x76, 0xa0, 0x54, 0xf6, 0xb3, 0x68, 0x36, 0xfb, 0x99, 0xec, 0x2d, 0x68,\n  0x5f, 0xf6, 0x76, 0x34, 0x5c, 0x31, 0xb9, 0xed, 0x42, 0xb3, 0x63, 0x93,\n  0xc3, 0xdd, 0xbb, 0xb1, 0xb3, 0x75, 0xa0, 0xa7, 0xb9, 0xae, 0x31, 0xe4,\n  0x69, 0x09, 0x24, 0x77, 0x60, 0x3a, 0x0d, 0xe0, 0x7d, 0xec, 0x47, 0x58,\n  0x16, 0x84, 0x61, 0xef, 0x0f, 0x3a, 0xb0, 0xa1, 0x20, 0xb0, 0xe0, 0x18,\n  0x84, 0xd0, 0x2b, 0x30, 0x55, 0x79, 0xb4, 0x57, 0x80, 0xdd, 0x8b, 0x8a,\n  0x29, 0x66, 0xd8, 0x0a, 0x75, 0xa8, 0x23, 0x21, 0x13, 0xe8, 0x4e, 0x58,\n  0x36, 0xe5, 0x95, 0x0c, 0x90, 0xce, 0x7d, 0xeb, 0xf3, 0x7e, 0x34, 0xa7,\n  0xb8, 0x1f, 0xcd, 0x1e, 0x5c, 0xac, 0x19, 0xf5, 0x64, 0x2e, 0x4f, 0x2f,\n  0xed, 0x9f, 0x6d, 0xeb, 0xae, 0x99, 0xac, 0x57, 0xcf, 0xb6, 0x75, 0xd4,\n  0x6e, 0xaa, 0x9d, 0x45, 0x25, 0x55, 0x3e, 0x6f, 0x51, 0x60, 0x6e, 0x0e,\n  0x79, 0xb2, 0xff, 0xd3, 0xd4, 0x62, 0xb5, 0xf9, 0xc3, 0xf0, 0x53, 0x73,\n  0xb3, 0xdd, 0x8e, 0x66, 0xe8, 0x5a, 0xd8, 0xc0, 0xed, 0xc6, 0x7d, 0xab,\n  0x64, 0xea, 0x99, 0xef, 0x50, 0x57, 0x8f, 0x25, 0x88, 0x94, 0x0a, 0x05,\n  0x3d, 0x78, 0xe0, 0x0c, 0xd8, 0xce, 0x84, 0x9a, 0x33, 0xab, 0x2e, 0x0a,\n  0x2c, 0xa9, 0x74, 0x48, 0xca, 0xab, 0xe9, 0x01, 0xd3, 0x4c, 0xc9, 0x28,\n  0xf6, 0xca, 0x35, 0xb4, 0xa0, 0x24, 0x22, 0x8b, 0x76, 0xe2, 0x79, 0x53,\n  0xcf, 0x63, 0x2d, 0x38, 0x36, 0xa4, 0xd3, 0xb0, 0x2a, 0x15, 0xd9, 0xe8,\n  0xe2, 0x80, 0xd9, 0x99, 0x5e, 0xfb, 0x88, 0x80, 0x54, 0xc2, 0x14, 0xa9,\n  0xb3, 0x77, 0xce, 0xe7, 0x08, 0x2a, 0x51, 0x7d, 0x5d, 0x75, 0x55, 0x45,\n  0x79, 0x59, 0x32, 0x1e, 0x8b, 0x46, 0xc2, 0xa1, 0x62, 0xbf, 0xc7, 0x0d,\n  0x55, 0x2e, 0xf4, 0x5a, 0xa6, 0x12, 0x55, 0x1a, 0x04, 0xa8, 0x80, 0x84,\n  0xe7, 0x5b, 0xc6, 0x49, 0x2b, 0xac, 0x21, 0x4a, 0xe1, 0xd4, 0xec, 0x74,\n  0xc9, 0x62, 0xf1, 0x6e, 0x4e, 0xd5, 0x71, 0x74, 0xcd, 0xbe, 0x56, 0xd9,\n  0xd6, 0x58, 0x1c, 0xee, 0xe8, 0x68, 0x4e, 0x3a, 0xaa, 0x3d, 0x91, 0xd2,\n  0x4d, 0xf1, 0xd8, 0xb0, 0xdf, 0x17, 0x4e, 0x2c, 0x7f, 0x6b, 0x2a, 0x5d,\n  0x3e, 0x58, 0xab, 0x46, 0x5b, 0x86, 0x63, 0xcf, 0x3c, 0xae, 0xf4, 0x95,\n  0xd6, 0xfa, 0xd1, 0xd4, 0x96, 0x58, 0xb8, 0x06, 0xef, 0x16, 0xc5, 0x9e,\n  0x68, 0xb5, 0x2d, 0xad, 0xd1, 0xdb, 0xad, 0x89, 0xb2, 0xa8, 0xde, 0x6a,\n  0x29, 0xfa, 0x36, 0xd2, 0x6f, 0x7a, 0xf6, 0xe5, 0xa3, 0xcb, 0x27, 0x0d,\n  0x6c, 0x71, 0xe6, 0xb6, 0xdb, 0x3f, 0xb8, 0x81, 0xac, 0x6d, 0xed, 0x8a,\n  0x89, 0xbd, 0x9b, 0xd8, 0xd7, 0x4d, 0x99, 0x06, 0x27, 0x36, 0x14, 0x1c,\n  0x88, 0xb8, 0x86, 0x15, 0x0c, 0xc1, 0x4d, 0x87, 0xc4, 0x37, 0xb2, 0x89,\n  0x12, 0x8b, 0x3e, 0xc7, 0xdf, 0xa5, 0xca, 0xe1, 0x30, 0xb5, 0x13, 0x42,\n  0xc0, 0x05, 0x51, 0x92, 0x84, 0x10, 0xa6, 0xf2, 0x06, 0x5b, 0x0a, 0xf6,\n  0xfc, 0xc4, 0x70, 0xb6, 0xa3, 0xa9, 0xed, 0x6b, 0xb3, 0x0f, 0xa0, 0xd7,\n  0x5f, 0xfd, 0xee, 0x0f, 0x36, 0x4d, 0x56, 0xf9, 0xfd, 0xe1, 0xd2, 0xea,\n  0x77, 0x5a, 0xaa, 0xb3, 0xb7, 0x63, 0xf3, 0x65, 0xf8, 0xbb, 0x8f, 0x65,\n  0xff, 0x6d, 0x7c, 0xa7, 0x66, 0x50, 0xdd, 0xd0, 0x24, 0xf6, 0xe7, 0x4d,\n  0xd6, 0x89, 0xfb, 0x63, 0x01, 0x8f, 0xbf, 0x1e, 0x6f, 0x4b, 0x06, 0xd0,\n  0x44, 0x07, 0x61, 0xd3, 0x24, 0x07, 0xa8, 0x31, 0xb9, 0x28, 0x53, 0x19,\n  0x3f, 0x0c, 0xd0, 0x06, 0xc4, 0xbe, 0xae, 0x17, 0x25, 0x5d, 0x5e, 0x3e,\n  0xc8, 0xaf, 0x7e, 0xcc, 0xea, 0x5e, 0x48, 0x95, 0x9b, 0x83, 0x26, 0x6f,\n  0xe5, 0xf8, 0xb6, 0xef, 0xa3, 0x47, 0x86, 0x87, 0xb3, 0x7d, 0xdd, 0x4d,\n  0x4a, 0x7e, 0x50, 0xb7, 0x13, 0x7f, 0x67, 0x61, 0x25, 0xc1, 0x3e, 0x89,\n  0xbf, 0x13, 0x65, 0xbe, 0xff, 0xa8, 0x1f, 0xf1, 0x04, 0xe8, 0xdc, 0x20,\n  0xd6, 0x88, 0x20, 0x1e, 0x34, 0xc8, 0x8e, 0x27, 0x46, 0x04, 0xbf, 0x00,\n  0x0a, 0x0f, 0x55, 0x82, 0x55, 0x62, 0x66, 0xe0, 0xc0, 0x43, 0x26, 0x48,\n  0xb5, 0x97, 0xda, 0x32, 0x9c, 0x0a, 0xb2, 0xd0, 0xb7, 0xaf, 0x7a, 0x86,\n  0x97, 0xca, 0xf6, 0xbe, 0xbf, 0x97, 0xbe, 0x8f, 0xf7, 0xcd, 0xd0, 0xf2,\n  0x99, 0x50, 0x3c, 0x13, 0x2b, 0x90, 0x76, 0xb3, 0x41, 0x03, 0x41, 0x1d,\n  0x51, 0x14, 0x51, 0x0b, 0x52, 0x86, 0x6b, 0x0a, 0x6f, 0xca, 0xd4, 0x44,\n  0x0f, 0x8a, 0xe7, 0x43, 0xa0, 0x57, 0xe2, 0x3f, 0xa2, 0x69, 0xfe, 0x2f,\n  0xd5, 0x55, 0x95, 0x95, 0xa8, 0x35, 0xfb, 0x8c, 0xd5, 0x6c, 0xb6, 0xa3,\n  0xea, 0xea, 0xce, 0xaa, 0x0d, 0xd9, 0xe9, 0x59, 0xb4, 0x38, 0x1b, 0x4b,\n  0x84, 0xc7, 0xba, 0x7f, 0x5a, 0x16, 0x8d, 0x95, 0xa7, 0x4d, 0x06, 0x9d,\n  0x21, 0x96, 0x0c, 0x97, 0xe3, 0x4d, 0xe1, 0x24, 0x7b, 0xe9, 0xf2, 0x41,\n  0x73, 0xa6, 0xa4, 0xa4, 0x33, 0x21, 0xce, 0x4f, 0x2b, 0x99, 0x1f, 0x37,\n  0x58, 0x96, 0x58, 0x3e, 0x60, 0x7e, 0x51, 0xf0, 0x4e, 0x00, 0xa1, 0xc0,\n  0x3c, 0xa3, 0xc4, 0xff, 0x67, 0x76, 0xca, 0x98, 0x1a, 0xb1, 0x21, 0xda,\n  0x6b, 0xc4, 0x40, 0x22, 0x09, 0x8d, 0x91, 0x81, 0xec, 0x1d, 0x41, 0xee,\n  0xac, 0x34, 0x6f, 0x64, 0x0f, 0x10, 0x8f, 0x85, 0xce, 0x54, 0xb6, 0xf5,\n  0xd4, 0x3d, 0xcf, 0xea, 0x9e, 0xaf, 0xab, 0x4a, 0x36, 0xe8, 0x8a, 0xd4,\n  0xfa, 0xc0, 0xbf, 0x36, 0xd4, 0x36, 0x74, 0xf1, 0xec, 0xd8, 0xf0, 0xf0,\n  0xf2, 0xc9, 0xf2, 0xc0, 0x06, 0x05, 0xd7, 0x0c, 0x09, 0x90, 0xc4, 0xf7,\n  0xc9, 0xbe, 0x49, 0x74, 0x18, 0xbc, 0x2f, 0x69, 0xf1, 0xca, 0x34, 0x21,\n  0x05, 0x2b, 0x9f, 0x02, 0xec, 0xc5, 0x16, 0x84, 0x04, 0xa4, 0x2f, 0xf5,\n  0x84, 0x2a, 0x33, 0x61, 0x6c, 0xf7, 0x99, 0xcd, 0x2a, 0x38, 0x09, 0x20,\n  0xfc, 0x2a, 0xc9, 0x29, 0xcc, 0xc0, 0x54, 0x8c, 0xa5, 0xb5, 0xf8, 0xf3,\n  0x1d, 0x3d, 0xe9, 0xf9, 0xcc, 0xec, 0xec, 0xc6, 0x23, 0xe9, 0x1d, 0x07,\n  0x80, 0x53, 0xbf, 0xd9, 0xd4, 0x62, 0x73, 0xa0, 0x19, 0x6c, 0xdb, 0x95,\n  0xb8, 0x5c, 0x73, 0x73, 0x4f, 0x33, 0x92, 0x1e, 0xc5, 0xee, 0xc7, 0x7b,\n  0x8c, 0x5f, 0xcc, 0xaa, 0x61, 0xa0, 0x76, 0x27, 0xe6, 0x59, 0xd6, 0x8b,\n  0x65, 0x11, 0xd4, 0x14, 0x63, 0xc0, 0x90, 0xda, 0x2b, 0x79, 0xe2, 0xe9,\n  0xb1, 0x0b, 0xde, 0x4b, 0xac, 0x21, 0x6b, 0x34, 0x2a, 0x9e, 0x46, 0xd0,\n  0x6a, 0x89, 0x22, 0x16, 0x8d, 0x94, 0x65, 0x4b, 0xe0, 0x2d, 0x04, 0x73,\n  0x78, 0x71, 0xc7, 0x54, 0x51, 0x4c, 0x6f, 0x0c, 0xdb, 0x2a, 0x37, 0x64,\n  0x0e, 0xd6, 0xec, 0x3c, 0x30, 0x7b, 0x7d, 0xed, 0x5c, 0xcb, 0x2c, 0xca,\n  0x1e, 0xdc, 0xab, 0x50, 0x8c, 0xf0, 0x8a, 0x96, 0x9e, 0x79, 0xe8, 0x4d,\n  0xf6, 0xb7, 0x48, 0x7b, 0xdc, 0xe6, 0xc8, 0x7e, 0x8e, 0xf4, 0x69, 0x25,\n  0xc1, 0x9d, 0xc5, 0x74, 0x89, 0x33, 0xff, 0xf5, 0x68, 0x30, 0x8f, 0xb7,\n  0x63, 0x12, 0x7f, 0x41, 0x94, 0x3e, 0x66, 0x2c, 0x88, 0xcb, 0xcf, 0x67,\n  0x44, 0x4d, 0x01, 0x77, 0x87, 0x73, 0xdc, 0xa8, 0x21, 0xdc, 0xb8, 0xe6,\n  0x29, 0x99, 0xbf, 0xdf, 0xef, 0x8b, 0xdf, 0xd7, 0x3b, 0x67, 0x68, 0xd1,\n  0x9a, 0x62, 0x52, 0x86, 0x80, 0xc0, 0xed, 0xd9, 0x4c, 0x7a, 0xc2, 0xe7,\n  0x71, 0x14, 0xd3, 0xca, 0xd9, 0xb5, 0x84, 0xcf, 0xd7, 0x61, 0x73, 0xc2,\n  0xea, 0x84, 0xd3, 0xd1, 0x11, 0xc2, 0xea, 0x8f, 0x64, 0x67, 0xa2, 0x66,\n  0x07, 0x7a, 0x04, 0x73, 0x7a, 0xe3, 0x72, 0x74, 0x16, 0xf9, 0xe6, 0x90,\n  0x6f, 0x76, 0x58, 0xe6, 0x75, 0x7f, 0x01, 0xab, 0xc3, 0x9f, 0x03, 0xe1,\n  0x49, 0xcc, 0xed, 0x54, 0x3f, 0x53, 0x28, 0xb1, 0x8e, 0xaa, 0x14, 0x9e,\n  0x25, 0xc1, 0xd4, 0x39, 0x7d, 0xd4, 0x86, 0xf9, 0xdf, 0x8f, 0xf7, 0x4b,\n  0x90, 0x99, 0x56, 0xbc, 0x57, 0x06, 0x7d, 0x2c, 0x41, 0x93, 0x51, 0xb2,\n  0xac, 0x02, 0x6f, 0x3d, 0xd8, 0x76, 0xda, 0x43, 0x8f, 0x9f, 0x88, 0x46,\n  0x5a, 0x54, 0x64, 0x32, 0x15, 0x07, 0x8a, 0xfc, 0x45, 0x7e, 0x87, 0xdd,\n  0x64, 0x33, 0xd9, 0x62, 0x61, 0x95, 0xe0, 0x5a, 0x13, 0x59, 0x09, 0xc0,\n  0x65, 0xf6, 0x60, 0x2a, 0x8d, 0xed, 0x27, 0xac, 0x0d, 0xa5, 0x83, 0x61,\n  0xcc, 0x0a, 0xec, 0x8f, 0xb0, 0xaa, 0x29, 0xab, 0x9d, 0x8b, 0xaa, 0x6d,\n  0x5b, 0xb3, 0xaf, 0x3f, 0xb9, 0x75, 0x5e, 0xa5, 0x58, 0x98, 0x47, 0xc6,\n  0x27, 0xe7, 0x17, 0xd0, 0x2e, 0xac, 0x66, 0x4a, 0x2a, 0xe7, 0xc6, 0x3d,\n  0x1f, 0xd0, 0xbc, 0xfe, 0xba, 0xf6, 0xf2, 0xc7, 0xce, 0xbb, 0x46, 0xbb,\n  0xb2, 0xa2, 0x3d, 0x45, 0x70, 0x1b, 0xfe, 0xb8, 0x52, 0xcb, 0x5e, 0x4e,\n  0xce, 0x82, 0x6a, 0x32, 0x95, 0x16, 0xa4, 0xe4, 0xb0, 0xa2, 0xad, 0x24,\n  0x38, 0x93, 0x70, 0xde, 0xb0, 0x1b, 0x4a, 0x63, 0x2b, 0x15, 0x3b, 0xe5,\n  0x93, 0x4b, 0xcc, 0x99, 0xd1, 0x30, 0x4d, 0x01, 0x81, 0x23, 0x77, 0x91,\n  0x9e, 0x90, 0x99, 0x91, 0xa7, 0xa4, 0x6c, 0x9b, 0x45, 0x07, 0x66, 0x67,\n  0xb3, 0x1f, 0x1e, 0xc8, 0x38, 0x82, 0x5a, 0x6c, 0x72, 0x34, 0xb7, 0x70,\n  0x42, 0xf6, 0x59, 0x54, 0x09, 0xc7, 0x1e, 0xd9, 0x8b, 0xfa, 0x7a, 0x55,\n  0x7c, 0x1f, 0xaf, 0xa4, 0x7a, 0xac, 0xe2, 0x12, 0xfc, 0x6d, 0x3f, 0x13,\n  0x83, 0x7c, 0x1a, 0xad, 0x4a, 0x81, 0xb5, 0x2f, 0x92, 0x70, 0x41, 0xd0,\n  0xb0, 0xc1, 0xba, 0x17, 0xc6, 0x19, 0x9d, 0x0e, 0xcd, 0x1b, 0xb4, 0x98,\n  0x2b, 0xb0, 0x6c, 0xd7, 0x6b, 0x58, 0x38, 0x27, 0x53, 0x89, 0x0a, 0x17,\n  0xee, 0x54, 0xb4, 0x38, 0x80, 0x9f, 0xf7, 0x03, 0x1b, 0x40, 0xaf, 0x40,\n  0x8f, 0x32, 0x1b, 0x41, 0x8f, 0x22, 0x1d, 0x93, 0xb5, 0xa8, 0xa0, 0x7d,\n  0xad, 0x29, 0xc7, 0x6e, 0x44, 0x55, 0xf9, 0x3a, 0x53, 0xf6, 0x47, 0x73,\n  0xeb, 0x1a, 0x76, 0xd9, 0x7f, 0x43, 0x1b, 0x0a, 0x74, 0xa5, 0xbe, 0xb7,\n  0xd6, 0x33, 0xf4, 0x38, 0x3c, 0x9e, 0x0c, 0xfb, 0x49, 0x3c, 0x1e, 0x17,\n  0x53, 0x8c, 0xd7, 0xd6, 0x50, 0xa6, 0xdf, 0xab, 0x67, 0x05, 0x55, 0x58,\n  0xc1, 0x6a, 0x60, 0xc7, 0x14, 0x18, 0x0d, 0x23, 0x68, 0xf6, 0x6a, 0x95,\n  0x78, 0xfe, 0xf9, 0xcd, 0x90, 0x6c, 0x2f, 0x9a, 0x52, 0x6a, 0x0e, 0x6b,\n  0xea, 0x8a, 0x05, 0xc8, 0x1e, 0x87, 0x02, 0xf3, 0xd1, 0x48, 0x28, 0x08,\n  0x08, 0x67, 0x22, 0x30, 0x9c, 0xc3, 0x69, 0xd6, 0x61, 0x29, 0x80, 0x49,\n  0x8d, 0x8d, 0xba, 0x18, 0xd5, 0x9b, 0xc0, 0x43, 0x24, 0x19, 0xa7, 0xd6,\n  0x3a, 0x90, 0x92, 0x98, 0x2a, 0xc1, 0x34, 0x24, 0x8f, 0x2b, 0x0f, 0x38,\n  0x4b, 0x2c, 0x9d, 0x03, 0x13, 0x53, 0xbe, 0x18, 0x8f, 0xe2, 0xa3, 0x53,\n  0x59, 0xfb, 0x99, 0xba, 0x89, 0xfa, 0x6b, 0x14, 0xc5, 0x17, 0xa3, 0xd8,\n  0xf9, 0xbb, 0x4d, 0xb1, 0x27, 0x90, 0x21, 0x36, 0x57, 0xad, 0x9f, 0x1e,\n  0x40, 0x45, 0xd9, 0xbf, 0x6e, 0xb1, 0xcd, 0x7f, 0x6f, 0x7a, 0xf9, 0x64,\n  0xf6, 0x8d, 0x27, 0x9e, 0x60, 0x15, 0xac, 0xcd, 0x8a, 0x0c, 0x3d, 0xf7,\n  0x64, 0xbf, 0xf6, 0xdf, 0x65, 0x5c, 0xd5, 0x34, 0xb5, 0x5b, 0x33, 0xec,\n  0x23, 0x78, 0x3c, 0x01, 0x64, 0xa7, 0xe5, 0xe8, 0x35, 0x16, 0x2c, 0xb8,\n  0xcc, 0x08, 0x54, 0x3f, 0x0f, 0x15, 0x19, 0x70, 0x45, 0x29, 0x5f, 0xb1,\n  0xae, 0x6a, 0x93, 0x7f, 0x7b, 0x66, 0x46, 0xac, 0x69, 0xef, 0x03, 0xd3,\n  0x6d, 0x1c, 0xca, 0x5d, 0x42, 0x82, 0x5e, 0x6c, 0x48, 0x00, 0xbc, 0x42,\n  0x0a, 0x03, 0x1f, 0x47, 0xc3, 0xe2, 0x7b, 0xfd, 0x02, 0x82, 0xe8, 0x7d,\n  0x82, 0x58, 0x2d, 0xb6, 0x63, 0x0a, 0x5b, 0x59, 0xdf, 0xcf, 0xab, 0xec,\n  0xef, 0xe3, 0x55, 0x99, 0xd0, 0x3a, 0x0d, 0x88, 0x2e, 0x23, 0xd6, 0x80,\n  0x2f, 0xe3, 0x40, 0xe6, 0xcc, 0x64, 0x8c, 0xd4, 0x4f, 0x0f, 0x66, 0x37,\n  0xdd, 0x1d, 0xa2, 0x78, 0x02, 0xce, 0x65, 0x7a, 0x9b, 0xd9, 0x47, 0xa6,\n  0x36, 0xbf, 0xb4, 0xbe, 0xe9, 0x8d, 0x4e, 0x0f, 0x65, 0xff, 0xfa, 0xc4,\n  0xba, 0xc6, 0xf7, 0xf2, 0xd5, 0xd4, 0x57, 0xc9, 0x7c, 0x9d, 0x7d, 0x8a,\n  0x55, 0xc2, 0xce, 0x2f, 0xe6, 0xfb, 0x78, 0xb9, 0x0f, 0xb2, 0x31, 0xf8,\n  0x1d, 0x09, 0xda, 0xbb, 0x98, 0x0f, 0x31, 0x0f, 0xd3, 0xf8, 0x86, 0x87,\n  0x25, 0xff, 0xac, 0x77, 0xe5, 0x7f, 0xd0, 0x46, 0xf2, 0x8c, 0x4d, 0xf2,\n  0x77, 0xe6, 0xde, 0x81, 0xe7, 0x32, 0xbc, 0x52, 0x82, 0x7e, 0xc8, 0xba,\n  0x99, 0x10, 0xf3, 0x2c, 0x3d, 0xdf, 0xb1, 0x00, 0x30, 0x90, 0xa9, 0xd0,\n  0x5f, 0x37, 0xf0, 0x50, 0x79, 0xe1, 0x1d, 0x21, 0xe7, 0xc9, 0xcb, 0xbb,\n  0x28, 0x79, 0xf2, 0xc4, 0x42, 0x70, 0x7e, 0xb2, 0xab, 0x29, 0x19, 0xe5,\n  0x4e, 0xc9, 0x4b, 0x97, 0x28, 0xf0, 0xe5, 0xd1, 0xb7, 0x86, 0x19, 0x41,\n  0xc9, 0x08, 0x33, 0xa2, 0xdb, 0xef, 0x1c, 0x4d, 0xb1, 0x26, 0xc4, 0x90,\n  0x76, 0x7b, 0xa9, 0xdf, 0x6f, 0xfd, 0x66, 0x70, 0x3e, 0x1b, 0x8c, 0x80,\n  0xe7, 0xaf, 0x9a, 0x9c, 0xcf, 0x8a, 0xfe, 0xae, 0x9c, 0x79, 0x24, 0xbb,\n  0xfe, 0x64, 0x3f, 0x57, 0x4a, 0x88, 0x45, 0x5c, 0x89, 0xf2, 0x60, 0xb2,\n  0xad, 0xa2, 0xe7, 0x37, 0x28, 0x94, 0x7d, 0x03, 0x5d, 0x94, 0x7d, 0xf1,\n  0xd2, 0xfd, 0x93, 0x9b, 0x47, 0xeb, 0x47, 0x83, 0xb6, 0x8a, 0x9f, 0x74,\n  0xab, 0x75, 0x1c, 0xe7, 0x0b, 0x05, 0x22, 0x75, 0xe8, 0xae, 0x9e, 0x0d,\n  0xd9, 0xdd, 0xbd, 0x9d, 0x2d, 0x3d, 0x4a, 0x4d, 0x1e, 0xdd, 0x4a, 0x99,\n  0x37, 0x45, 0xba, 0xb9, 0xb1, 0x80, 0x34, 0x15, 0xfa, 0xfd, 0x44, 0xba,\n  0xe5, 0xee, 0x68, 0x73, 0x1e, 0xc1, 0xbc, 0x8b, 0x92, 0x47, 0x50, 0xa4,\n  0x5b, 0xa2, 0xc0, 0x25, 0xa8, 0xc5, 0xaf, 0xd3, 0xec, 0x94, 0x7c, 0x7c,\n  0x89, 0x02, 0x9f, 0x20, 0x7d, 0x7f, 0x79, 0x9e, 0x47, 0x50, 0xab, 0x61,\n  0xb4, 0x33, 0xa2, 0x23, 0xf1, 0x1c, 0x0f, 0x65, 0x2a, 0xf2, 0xda, 0x33,\n  0xe4, 0x89, 0xbd, 0xd4, 0x93, 0xb8, 0xfe, 0x03, 0x50, 0xad, 0xac, 0x24,\n  0x1e, 0x8b, 0x14, 0xfb, 0x45, 0x67, 0x62, 0x75, 0x58, 0x97, 0x73, 0x26,\n  0xe6, 0x85, 0xb8, 0x49, 0xde, 0x44, 0x41, 0xf4, 0x26, 0xae, 0x4f, 0xe4,\n  0xd3, 0x7b, 0x6f, 0x3f, 0x0f, 0xc8, 0x7c, 0x7c, 0xe7, 0xad, 0x97, 0xac,\n  0x4b, 0xe8, 0x27, 0x32, 0x98, 0xd2, 0x0f, 0x64, 0xbe, 0x28, 0x92, 0x5a,\n  0xf4, 0x25, 0x7e, 0x81, 0x0d, 0x31, 0x3d, 0xcc, 0x24, 0xfa, 0x65, 0x9e,\n  0xef, 0x7e, 0x13, 0xbe, 0xde, 0xcb, 0xba, 0x58, 0x25, 0xf1, 0xc3, 0x23,\n  0x66, 0x14, 0xeb, 0x54, 0x01, 0x3c, 0x27, 0xef, 0xed, 0xf3, 0x4b, 0xfc,\n  0xdf, 0x7c, 0x7e, 0x97, 0xdc, 0x3c, 0x7d, 0xd3, 0x4d, 0xb3, 0xdb, 0xa7,\n  0xbb, 0xfb, 0xfa, 0x7a, 0xa6, 0x97, 0xa6, 0xd1, 0xa9, 0xf6, 0xf1, 0xf1,\n  0xf6, 0x61, 0xf5, 0xae, 0x85, 0x3d, 0x3b, 0x7a, 0x3b, 0x3a, 0x7a, 0x77,\n  0xec, 0x99, 0xdf, 0xa5, 0x19, 0xa6, 0xe7, 0x8c, 0x21, 0xdc, 0xb7, 0xef,\n  0xb2, 0x67, 0xc1, 0xe3, 0x07, 0x71, 0xbf, 0x71, 0xb7, 0x49, 0xc9, 0x73,\n  0x12, 0xb0, 0x3d, 0x64, 0xb4, 0x9d, 0xca, 0xe1, 0x40, 0xe2, 0xad, 0x3e,\n  0x84, 0x4d, 0xc0, 0x60, 0x79, 0xa8, 0xdc, 0x6e, 0xd3, 0x69, 0x99, 0x62,\n  0x54, 0xac, 0xcc, 0xa9, 0xba, 0x15, 0x5c, 0x3a, 0x65, 0xa3, 0x4e, 0xff,\n  0x14, 0x16, 0x29, 0xf4, 0xb8, 0x83, 0x1e, 0x3c, 0xc5, 0x0d, 0xf8, 0x17,\n  0xc7, 0xab, 0x13, 0x5b, 0x9a, 0x5b, 0xcb, 0x1b, 0x8b, 0xf5, 0xd3, 0x96,\n  0x9a, 0x8a, 0xd2, 0x7a, 0x2f, 0x9a, 0x43, 0xd1, 0x9e, 0x74, 0x4d, 0xda,\n  0x5e, 0x32, 0xd2, 0x98, 0xac, 0xab, 0xaa, 0x89, 0x25, 0x4d, 0x75, 0x9a,\n  0xa9, 0xae, 0xfa, 0xc5, 0x8d, 0x25, 0x5d, 0x9d, 0x43, 0x35, 0x75, 0x43,\n  0x9d, 0x65, 0x15, 0x33, 0xc7, 0x36, 0x4f, 0x9c, 0x3c, 0xd2, 0x58, 0xd6,\n  0xdf, 0x19, 0x2d, 0xeb, 0x4d, 0x76, 0x54, 0x95, 0x24, 0x47, 0xca, 0xe2,\n  0x0d, 0x65, 0x8e, 0x64, 0x0a, 0xd3, 0x51, 0xc2, 0x0a, 0xaa, 0x65, 0x36,\n  0x67, 0xc6, 0x62, 0x6a, 0xac, 0xa7, 0x44, 0x35, 0x2c, 0xcf, 0xba, 0x1d,\n  0x2c, 0xa6, 0xe5, 0x60, 0x0d, 0x00, 0x39, 0xaf, 0x75, 0x0c, 0x96, 0xaf,\n  0x71, 0x0c, 0x56, 0x55, 0x94, 0x26, 0xc2, 0x41, 0x9f, 0xc7, 0xe5, 0xb4,\n  0x59, 0x08, 0xf2, 0x74, 0x2d, 0xaa, 0xcd, 0xe1, 0xc4, 0xbc, 0x3f, 0xb7,\n  0xa0, 0x78, 0xc6, 0xa1, 0x54, 0xa2, 0xe2, 0xfd, 0x97, 0x1c, 0xdd, 0x11,\n  0x6a, 0x70, 0xfb, 0x5d, 0x25, 0xb6, 0x96, 0xd6, 0xe1, 0x8e, 0x50, 0xad,\n  0x77, 0xda, 0x5b, 0x17, 0xea, 0x1c, 0x68, 0x6b, 0xb1, 0x96, 0x3a, 0x03,\n  0xee, 0x0d, 0xa1, 0x1d, 0x47, 0x2f, 0xd9, 0xdf, 0x30, 0xe6, 0xf1, 0x8e,\n  0x6a, 0x6e, 0x3e, 0x79, 0xed, 0xad, 0x66, 0x43, 0x87, 0x56, 0xbf, 0x6f,\n  0xe7, 0xb6, 0x03, 0x6e, 0xef, 0xdd, 0x77, 0xf9, 0xdc, 0x07, 0xb6, 0xed,\n  0xdc, 0xa7, 0xd7, 0x76, 0x18, 0xcc, 0xb7, 0x5e, 0x7b, 0xf2, 0xe6, 0x44,\n  0x28, 0x94, 0x10, 0x71, 0xb5, 0x0e, 0xe0, 0x71, 0xae, 0xe7, 0x0f, 0xe4,\n  0x15, 0x2c, 0x2f, 0xfb, 0x03, 0x09, 0x10, 0x8e, 0x74, 0x26, 0x1c, 0x0c,\n  0x87, 0xc3, 0xd1, 0x42, 0x7f, 0xa0, 0xe4, 0x10, 0x24, 0x7e, 0xae, 0x28,\n  0xcd, 0x6e, 0xaf, 0xa9, 0x7b, 0x28, 0x58, 0x6e, 0x8b, 0x60, 0x9d, 0xb2,\n  0xd6, 0x37, 0x3a, 0x72, 0xeb, 0x7f, 0xee, 0x3f, 0xef, 0xd7, 0x68, 0x69,\n  0x63, 0xeb, 0xf5, 0x37, 0x36, 0xb7, 0xa3, 0xe3, 0x15, 0x69, 0x41, 0xd1,\n  0x25, 0xa8, 0x86, 0xb6, 0x36, 0xdd, 0x31, 0x34, 0xf3, 0xd9, 0xea, 0xf0,\n  0xa3, 0x55, 0x0c, 0xf1, 0xa2, 0x30, 0x9c, 0x11, 0xf3, 0xaf, 0x16, 0x6b,\n  0x8a, 0xae, 0x75, 0xfd, 0x81, 0x89, 0x55, 0xfe, 0x40, 0x1d, 0x7e, 0xc4,\n  0xe5, 0xb0, 0x98, 0x74, 0x46, 0x9d, 0xd1, 0xa0, 0xc7, 0x0f, 0x6a, 0xf2,\n  0xfc, 0x81, 0x29, 0xb1, 0x47, 0x05, 0xee, 0xc0, 0x2f, 0x7f, 0x6e, 0xe5,\n  0x6a, 0xdc, 0x17, 0x54, 0x35, 0xbd, 0xfc, 0xce, 0x65, 0x4d, 0x1d, 0x1b,\n  0x5b, 0x2f, 0x41, 0xcf, 0x75, 0xff, 0x37, 0xee, 0x05, 0xeb, 0x5e, 0x7e,\n  0xb9, 0xab, 0xb2, 0xba, 0x3a, 0x22, 0xe2, 0xd8, 0x82, 0xc3, 0x94, 0xbd,\n  0x8a, 0xd0, 0xa6, 0x3b, 0xd3, 0x91, 0xef, 0x01, 0x54, 0xce, 0x53, 0xe7,\n  0xdf, 0x90, 0x40, 0x40, 0x20, 0x38, 0xda, 0xaf, 0x42, 0xa7, 0xa0, 0xdf,\n  0xeb, 0x72, 0x40, 0xa9, 0x06, 0x73, 0xf8, 0x5c, 0x4e, 0xc1, 0x35, 0x3e,\n  0xc1, 0x89, 0xe9, 0x8f, 0x4f, 0x7f, 0xfd, 0xeb, 0x37, 0xe2, 0xce, 0xfd,\n  0xe2, 0xe3, 0x7f, 0xbd, 0xb6, 0xa9, 0xa3, 0xb3, 0xf5, 0x24, 0x7b, 0xd5,\n  0xde, 0xbd, 0x7b, 0xbb, 0x6e, 0xc7, 0xbd, 0x43, 0xff, 0x95, 0x2d, 0xa3,\n  0xbd, 0xa3, 0x75, 0x90, 0xd8, 0xbf, 0x80, 0x3c, 0x40, 0x2f, 0x73, 0x9d,\n  0x79, 0x67, 0xfb, 0x13, 0xf8, 0xfa, 0x3b, 0x04, 0x0f, 0xb3, 0x94, 0xf9,\n  0x4e, 0xc6, 0x60, 0x45, 0x0a, 0x0e, 0xeb, 0x19, 0x0a, 0x2f, 0x52, 0x91,\n  0x8a, 0xdb, 0x76, 0xb2, 0xdb, 0xf0, 0x58, 0xe2, 0xaa, 0x78, 0x04, 0xb1,\n  0xf7, 0xdc, 0x22, 0x44, 0x92, 0x26, 0x48, 0x3d, 0x15, 0x66, 0x5e, 0x60,\n  0x35, 0xf4, 0xe4, 0xda, 0x23, 0x41, 0x28, 0xa9, 0x31, 0xc9, 0xd5, 0x47,\n  0x21, 0xe9, 0xf9, 0x3d, 0x1e, 0xc8, 0x54, 0xaf, 0x6e, 0x0b, 0xad, 0x24,\n  0xd8, 0xbf, 0x72, 0x4c, 0x28, 0x2c, 0x49, 0x87, 0x72, 0xa9, 0x22, 0x65,\n  0xa4, 0x42, 0x61, 0x00, 0xe0, 0xc1, 0xb1, 0x5c, 0x2d, 0x0d, 0x96, 0x7a,\n  0x8a, 0x9c, 0x76, 0x6c, 0x3c, 0x8b, 0xd9, 0x20, 0x00, 0x0e, 0xae, 0x93,\n  0x16, 0x4a, 0x3d, 0xcd, 0x82, 0x08, 0x16, 0x14, 0xdd, 0x33, 0xe7, 0xc0,\n  0xc1, 0x29, 0x8a, 0x12, 0x7a, 0x7d, 0x70, 0x2e, 0xf9, 0xfd, 0xe9, 0x69,\n  0x74, 0x36, 0x57, 0x63, 0xaf, 0x0d, 0xea, 0xee, 0xc5, 0x7b, 0x26, 0xa0,\n  0xaa, 0x9e, 0x66, 0xd3, 0x70, 0x4b, 0xec, 0x2d, 0xd6, 0xfd, 0xdf, 0x61,\n  0xa9, 0xa4, 0x5e, 0xf6, 0xe3, 0xa3, 0x95, 0xc9, 0xee, 0xb1, 0xbe, 0x6a,\n  0x5a, 0x46, 0x4f, 0xf2, 0xe7, 0x59, 0x09, 0xf6, 0xa8, 0x9e, 0x31, 0x83,\n  0x5d, 0xaa, 0x26, 0xf1, 0x8e, 0xb2, 0x57, 0x0f, 0xdf, 0xa7, 0xa0, 0x47,\n  0xf3, 0x0a, 0xaa, 0x23, 0x19, 0x0c, 0x0c, 0x63, 0x30, 0x1b, 0xcc, 0x26,\n  0xa3, 0x82, 0x97, 0xbd, 0x7a, 0x80, 0x21, 0x43, 0xfd, 0x50, 0xb8, 0x8b,\n  0xe0, 0x88, 0xfa, 0xc9, 0x8e, 0x9f, 0x66, 0x1f, 0xbc, 0xd5, 0xaf, 0x72,\n  0xab, 0x39, 0xa1, 0x48, 0x5d, 0x97, 0x46, 0x15, 0xb5, 0xc0, 0x6c, 0xc8,\n  0x38, 0x66, 0xef, 0xf0, 0xb9, 0x3b, 0xdd, 0xb7, 0xdd, 0x70, 0x03, 0xc5,\n  0x1f, 0x11, 0xf0, 0xf7, 0xa1, 0x56, 0xb4, 0x5d, 0x42, 0x4f, 0x36, 0xea,\n  0x58, 0x25, 0xef, 0x34, 0x69, 0x39, 0x70, 0xea, 0x69, 0xd6, 0x38, 0xf5,\n  0xe0, 0x40, 0x5b, 0xd4, 0x02, 0x24, 0xaf, 0x5e, 0x91, 0xdb, 0xe1, 0xf0,\n  0xfb, 0xdc, 0xc1, 0xa2, 0x62, 0x87, 0x0b, 0xff, 0x0b, 0xba, 0xbf, 0x49,\n  0x0b, 0x2a, 0x99, 0xe4, 0xda, 0xc3, 0x6a, 0x18, 0x71, 0xed, 0x61, 0x81,\n  0xea, 0x0c, 0x23, 0x67, 0xbd, 0x40, 0x5c, 0x7b, 0x58, 0x0e, 0xa1, 0xdf,\n  0xdc, 0xd8, 0x7b, 0x53, 0xc9, 0x58, 0x8b, 0xb3, 0xbd, 0xe3, 0x6e, 0xf4,\n  0xd2, 0x27, 0x9a, 0x3b, 0xbc, 0x2d, 0x63, 0xd9, 0xbb, 0xaf, 0xbb, 0xf6,\n  0x53, 0x25, 0xa9, 0x80, 0x0e, 0x35, 0x9b, 0xeb, 0x5b, 0x2f, 0xc0, 0xff,\n  0xdc, 0xb7, 0xb1, 0x47, 0x78, 0xbc, 0xbc, 0xfc, 0x71, 0x55, 0x5b, 0xef,\n  0x67, 0xd0, 0x4f, 0xef, 0xb9, 0xe7, 0xa7, 0xfa, 0x60, 0xa0, 0x1c, 0x6a,\n  0x2e, 0x6f, 0xc6, 0x03, 0x68, 0x23, 0x6b, 0x17, 0x7c, 0x7a, 0x78, 0xff,\n  0x51, 0xe2, 0x2d, 0x55, 0xc5, 0x72, 0x58, 0x53, 0xda, 0xa3, 0x06, 0x97,\n  0x52, 0x02, 0xce, 0xc0, 0xd8, 0x79, 0x38, 0x18, 0xc3, 0x9b, 0x6a, 0xce,\n  0x9b, 0x67, 0x31, 0x17, 0x78, 0xf3, 0xac, 0x50, 0x87, 0xd2, 0x1a, 0x24,\n  0xb3, 0xae, 0x08, 0x4b, 0xce, 0x51, 0x41, 0x08, 0xc6, 0xbf, 0xf0, 0xf6,\n  0xd6, 0x1d, 0x3f, 0x5d, 0x7e, 0x75, 0xdb, 0x2f, 0xa6, 0xd1, 0x4b, 0x9c,\n  0xe0, 0xd6, 0xd8, 0xae, 0xb0, 0x0b, 0x45, 0xdb, 0x33, 0x28, 0xd5, 0xce,\n  0xba, 0x5f, 0x79, 0x65, 0xf9, 0xe5, 0x3f, 0xfd, 0x89, 0x75, 0x67, 0x30,\n  0x39, 0xd3, 0x75, 0xf6, 0x8e, 0x67, 0x1f, 0x78, 0x80, 0xe8, 0xe9, 0x26,\n  0xd6, 0x47, 0xf6, 0xc3, 0xc5, 0x8c, 0x01, 0xb0, 0x4b, 0xd1, 0x20, 0x66,\n  0x7e, 0x2b, 0x36, 0xa5, 0x07, 0xe8, 0x11, 0xa7, 0x07, 0xcb, 0x36, 0xa2,\n  0xd9, 0x26, 0x28, 0x8a, 0x29, 0x1c, 0x79, 0xc4, 0x21, 0xd2, 0xb0, 0x94,\n  0x25, 0x10, 0xb1, 0xb9, 0xbb, 0xe4, 0xba, 0xa4, 0xf7, 0x8a, 0x2d, 0x66,\n  0x32, 0x6a, 0x6b, 0x24, 0x61, 0xb6, 0x89, 0xbe, 0x26, 0x32, 0xe3, 0x56,\n  0xfc, 0xaf, 0x92, 0x94, 0xd8, 0xcd, 0x65, 0x27, 0x5a, 0x53, 0xac, 0x6f,\n  0xcb, 0xb0, 0xde, 0xa2, 0x50, 0x73, 0xd3, 0x9c, 0x4a, 0xa9, 0xd7, 0x05,\n  0x5d, 0x98, 0x87, 0x5d, 0x6a, 0xb3, 0x50, 0xe4, 0xd5, 0xde, 0xb0, 0xf0,\n  0x4a, 0xa2, 0xcd, 0xbe, 0xfc, 0x05, 0x76, 0x73, 0x51, 0x5d, 0x6c, 0xf7,\n  0x60, 0x87, 0xaa, 0x97, 0x67, 0x53, 0x01, 0xbc, 0xa1, 0xe3, 0x75, 0x6e,\n  0x59, 0xe9, 0x66, 0xc3, 0xac, 0x0b, 0xaf, 0xf3, 0x5f, 0xb2, 0xc7, 0xf3,\n  0xd6, 0xb9, 0x15, 0x5f, 0x3f, 0x83, 0xc7, 0x65, 0xc6, 0x7c, 0x22, 0xfb,\n  0xf0, 0x54, 0xb2, 0x0f, 0x2f, 0x31, 0x24, 0x14, 0xfa, 0xf0, 0x00, 0x76,\n  0x1f, 0x37, 0x36, 0xe6, 0xfb, 0xf0, 0xc2, 0x39, 0x2f, 0x07, 0x66, 0x89,\n  0x54, 0x9a, 0x4b, 0x81, 0xc2, 0xce, 0x9e, 0x79, 0x63, 0x78, 0x22, 0x7b,\n  0xc3, 0xe6, 0x64, 0x57, 0x17, 0xfa, 0xd7, 0x37, 0xde, 0x38, 0x9f, 0x0f,\n  0xa5, 0x59, 0x77, 0x77, 0xf6, 0xa2, 0xec, 0x3b, 0x5f, 0xfb, 0x1a, 0xe2,\n  0xe7, 0xff, 0x7a, 0x29, 0xca, 0x56, 0xa3, 0xeb, 0x3a, 0x6f, 0x39, 0x49,\n  0xf4, 0x0d, 0x61, 0xe5, 0x2d, 0xf6, 0x77, 0xa4, 0xb6, 0xf9, 0x61, 0x1a,\n  0xcc, 0xa5, 0x31, 0x10, 0xb8, 0x25, 0x3d, 0x42, 0x58, 0xc3, 0xd3, 0xca,\n  0xbf, 0x90, 0x64, 0x03, 0xb8, 0xef, 0x02, 0xf1, 0xa9, 0x98, 0x87, 0x62,\n  0xd2, 0x89, 0x55, 0xc6, 0x86, 0xb7, 0xe0, 0xd6, 0x6a, 0x33, 0x23, 0x83,\n  0x17, 0x1a, 0xfe, 0x8c, 0x8d, 0xd8, 0xd8, 0xe0, 0x4e, 0x13, 0x23, 0xdc,\n  0x0b, 0xfc, 0xa5, 0xa9, 0x34, 0xfb, 0xbb, 0x37, 0x16, 0x3e, 0xa1, 0xaf,\n  0x18, 0x6c, 0xd4, 0xbb, 0x55, 0x4a, 0x83, 0x50, 0xd7, 0x6e, 0x7e, 0x03,\n  0xba, 0x5f, 0x8e, 0xfe, 0xe3, 0xfe, 0xff, 0xd8, 0xc6, 0xf1, 0x1b, 0x59,\n  0xf6, 0x77, 0x7f, 0x43, 0x22, 0xce, 0x2a, 0xe6, 0xd7, 0xd3, 0x04, 0xd7,\n  0xb6, 0x3c, 0x53, 0x6a, 0xd3, 0xa9, 0x38, 0x11, 0xd2, 0x80, 0x9f, 0x27,\n  0x75, 0xb1, 0x13, 0x43, 0x24, 0x66, 0x96, 0x62, 0x82, 0x39, 0xb1, 0x1c,\n  0xb7, 0x3b, 0xf2, 0x3f, 0x5c, 0x2b, 0x26, 0x10, 0x8b, 0x1e, 0x3d, 0x6b,\n  0x2a, 0xce, 0x9d, 0xfe, 0xeb, 0x08, 0xc7, 0x72, 0x5f, 0xec, 0x7f, 0x80,\n  0xe3, 0x46, 0x2e, 0xb8, 0xff, 0x0b, 0x4e, 0x44, 0xbf, 0x3c, 0x69, 0xaf,\n  0x70, 0x64, 0xc7, 0xd0, 0x17, 0xcb, 0x2b, 0xb3, 0x0f, 0xb2, 0x2e, 0xf8,\n  0x09, 0x91, 0xb5, 0x0e, 0x32, 0x3c, 0x8e, 0x65, 0xb8, 0x1e, 0xaf, 0x96,\n  0x28, 0xd4, 0xb2, 0x60, 0x14, 0x2a, 0x54, 0xe0, 0x9e, 0xa3, 0x62, 0x93,\n  0xa2, 0x33, 0x63, 0x81, 0xe9, 0x29, 0x32, 0x1a, 0x00, 0x35, 0xad, 0x28,\n  0xea, 0x89, 0xda, 0xad, 0x06, 0xb7, 0x11, 0x0f, 0x91, 0xd1, 0x23, 0xbd,\n  0x5a, 0xc8, 0xaf, 0xcf, 0x07, 0x0a, 0xc3, 0xb9, 0x9c, 0x72, 0xa8, 0xbc,\n  0xe7, 0x50, 0xe6, 0x9a, 0x63, 0x50, 0xee, 0xf9, 0x08, 0xad, 0xec, 0x3c,\n  0x30, 0xe9, 0xf0, 0xfb, 0x1d, 0xb6, 0x40, 0x40, 0xd3, 0x7e, 0xd9, 0xcc,\n  0xa9, 0x0f, 0x91, 0xe2, 0xce, 0x7d, 0xa4, 0x92, 0xf3, 0xfc, 0xfc, 0xa1,\n  0x5b, 0xbd, 0x5e, 0x9f, 0xc7, 0xe3, 0xf3, 0x7a, 0x81, 0x2a, 0x04, 0xd3,\n  0x70, 0x23, 0xde, 0x5b, 0x68, 0x7f, 0xab, 0x81, 0x6a, 0x58, 0x2a, 0x0a,\n  0x50, 0x48, 0x49, 0x91, 0xd7, 0x65, 0x29, 0x55, 0x00, 0x77, 0x18, 0x12,\n  0x42, 0x22, 0xd1, 0x28, 0x39, 0xe7, 0x46, 0x32, 0x88, 0xe1, 0xea, 0xa4,\n  0x32, 0x67, 0x5e, 0xe0, 0x6b, 0x7d, 0xde, 0xcf, 0xec, 0xc6, 0xeb, 0x3e,\n  0x30, 0x7c, 0x01, 0xfe, 0x6b, 0xec, 0x82, 0xb6, 0x6c, 0xef, 0xc4, 0xd6,\n  0x2d, 0x13, 0x93, 0x5b, 0xa6, 0x67, 0x92, 0x1e, 0x87, 0xb3, 0xa8, 0xc8,\n  0xe9, 0xf0, 0x3c, 0x80, 0x7f, 0xf0, 0x78, 0xf0, 0x0f, 0x48, 0x7f, 0xc5,\n  0x47, 0x49, 0x11, 0xc1, 0xce, 0xcb, 0x26, 0xb6, 0x1d, 0x22, 0xf5, 0x02,\n  0xe7, 0xa0, 0xdb, 0x1e, 0x0f, 0xf9, 0x0b, 0xfe, 0x2f, 0xd7, 0x0e, 0xfc,\n  0x26, 0xd4, 0x76, 0x57, 0xf7, 0xa3, 0xdb, 0x89, 0xcf, 0xb0, 0x5f, 0x5e,\n  0x4b, 0xd5, 0xec, 0xaf, 0x49, 0x04, 0x52, 0x81, 0xcf, 0x70, 0xb3, 0xec,\n  0x33, 0x4c, 0x88, 0x3e, 0xc3, 0x05, 0xc9, 0x67, 0xe8, 0x76, 0x61, 0xa1,\n  0x65, 0x62, 0x4c, 0xb6, 0xf5, 0x7c, 0x86, 0x75, 0x75, 0xd4, 0x67, 0x68,\n  0x07, 0xfb, 0x37, 0x85, 0x7e, 0x4d, 0xd7, 0x53, 0xa6, 0x4b, 0x31, 0x7a,\n  0xe1, 0x85, 0x48, 0x11, 0x4c, 0x87, 0xff, 0x07, 0xb3, 0x41, 0x0d, 0x5d,\n  0x50, 0x33, 0x2f, 0x1e, 0x7b, 0xf5, 0x87, 0x5d, 0xa8, 0xf3, 0x96, 0xab,\n  0xab, 0x80, 0x27, 0x93, 0x2b, 0x26, 0xf4, 0x30, 0xa9, 0xe5, 0x57, 0x91,\n  0x49, 0x7a, 0x10, 0xc7, 0x7a, 0xd7, 0xe6, 0x6f, 0x95, 0xcb, 0xc9, 0x49,\n  0xa5, 0xcc, 0x70, 0xb4, 0x2c, 0x1a, 0xe2, 0x85, 0xa2, 0xa4, 0x62, 0x95,\n  0x27, 0xec, 0x9c, 0x15, 0xe8, 0x1f, 0x3e, 0xb4, 0xbb, 0x7e, 0x2a, 0x1c,\n  0x9b, 0x2d, 0x6d, 0xef, 0x2a, 0x6e, 0x2e, 0xa9, 0x1c, 0x28, 0x3d, 0x36,\n  0x5d, 0xb9, 0xb9, 0xd4, 0xe3, 0xef, 0x2a, 0x69, 0x6c, 0xf3, 0x35, 0x55,\n  0x94, 0xf5, 0x97, 0x79, 0xb7, 0x1f, 0xb1, 0x59, 0x06, 0xcd, 0x45, 0x5d,\n  0x8d, 0xc9, 0xa6, 0x0a, 0xb7, 0xb7, 0x61, 0xb8, 0x65, 0x7e, 0xc9, 0xe1,\n  0x6a, 0xb7, 0x3a, 0x36, 0xd6, 0x26, 0x52, 0xa5, 0x3e, 0x4f, 0xc3, 0x08,\n  0x5d, 0x3f, 0x41, 0x4c, 0xcf, 0x33, 0x98, 0x9e, 0xb5, 0xc8, 0x4a, 0xd5,\n  0x05, 0x57, 0x0a, 0x5b, 0x77, 0x35, 0xd8, 0x9a, 0x33, 0xe9, 0x35, 0xb8,\n  0xcf, 0x7e, 0xa4, 0x52, 0xfa, 0xb0, 0x9d, 0xa5, 0x80, 0xf3, 0x8f, 0x90,\n  0x78, 0x9f, 0x5d, 0xf7, 0xfe, 0x3a, 0xb7, 0xd4, 0xf4, 0xd6, 0x8c, 0x08,\n  0x81, 0x1a, 0xd1, 0x60, 0xe5, 0x02, 0x61, 0x93, 0x5d, 0x89, 0x2d, 0x3c,\n  0x2d, 0x33, 0xcf, 0xb1, 0x3a, 0x8e, 0xec, 0xc5, 0x2a, 0x15, 0x3f, 0x2f,\n  0xc0, 0x7a, 0xa5, 0x67, 0xaa, 0xf0, 0x9d, 0xb2, 0x5c, 0x5b, 0x8e, 0xa2,\n  0x0f, 0xe2, 0x27, 0x16, 0x75, 0x78, 0x11, 0x95, 0x13, 0x14, 0xd8, 0xb8,\n  0x5c, 0xef, 0xa9, 0x4c, 0x20, 0x9a, 0x8b, 0x12, 0xb7, 0x9e, 0x02, 0x64,\n  0x53, 0xb5, 0x0a, 0xa9, 0xdf, 0xc7, 0x33, 0xa0, 0xb9, 0x50, 0xe5, 0x3e,\n  0x1e, 0x0d, 0x15, 0x7b, 0xdc, 0x50, 0xd3, 0xc4, 0x88, 0x75, 0x17, 0x92,\n  0xe3, 0x87, 0x55, 0x7c, 0xbd, 0x20, 0xc3, 0x7e, 0x61, 0x6d, 0xcf, 0x6c,\n  0x85, 0x98, 0x7d, 0x0e, 0x4e, 0x44, 0xd6, 0x20, 0x9e, 0xae, 0x72, 0x58,\n  0xbe, 0xb4, 0xe5, 0xa0, 0xdd, 0x76, 0xef, 0xf4, 0x6f, 0x17, 0x7e, 0x7b,\n  0x76, 0xd7, 0x1b, 0xd3, 0x77, 0x3a, 0x3c, 0x87, 0x2e, 0x6c, 0xdc, 0x16,\n  0x08, 0x6d, 0xad, 0x6f, 0x1e, 0xbf, 0xb3, 0xb7, 0xb1, 0x6b, 0xbc, 0xad,\n  0xa9, 0xac, 0x23, 0x11, 0xd8, 0xcc, 0x86, 0xfa, 0x3a, 0xfd, 0xe5, 0xc6,\n  0x9f, 0x67, 0xdf, 0x41, 0x7c, 0x36, 0x9b, 0xfd, 0x03, 0x32, 0x65, 0x5f,\n  0x7b, 0xdb, 0x54, 0x13, 0xe9, 0x98, 0xb3, 0x9a, 0x46, 0x4c, 0x45, 0x25,\n  0x35, 0xb3, 0xbd, 0xd1, 0xf2, 0x58, 0xcc, 0x6c, 0xee, 0x8e, 0xe2, 0x79,\n  0xea, 0xc5, 0xc2, 0x66, 0x37, 0x96, 0x73, 0x61, 0xb0, 0xc2, 0xcc, 0x02,\n  0xd6, 0x67, 0x74, 0x88, 0x63, 0xc0, 0x45, 0xc9, 0xf0, 0x08, 0xf2, 0xba,\n  0xf6, 0xa9, 0x04, 0x6c, 0x27, 0xc2, 0xf6, 0x2c, 0x72, 0x37, 0x6e, 0x1a,\n  0xc6, 0xbb, 0x18, 0x1c, 0xf6, 0x83, 0x41, 0x88, 0x64, 0xf3, 0xc4, 0x0c,\n  0x01, 0x97, 0x10, 0xa2, 0x48, 0xcf, 0xfa, 0x53, 0x76, 0xc9, 0x65, 0x99,\n  0x66, 0xd9, 0xda, 0xda, 0xb2, 0xd1, 0x92, 0xe9, 0xe9, 0xd2, 0xb9, 0xba,\n  0xfd, 0x89, 0xca, 0x5d, 0x8d, 0x9b, 0xa6, 0xa7, 0xc9, 0x15, 0x8e, 0x75,\n  0x7f, 0xbd, 0xbe, 0xc6, 0xe7, 0xfb, 0xc3, 0xf2, 0xcb, 0x7f, 0xf6, 0x17,\n  0xf7, 0x04, 0x63, 0x93, 0xe3, 0x4f, 0xe0, 0x0b, 0x5e, 0x9f, 0xcd, 0xf9,\n  0x04, 0xdd, 0xcb, 0x2c, 0x2b, 0xad, 0x2c, 0x16, 0xd2, 0x4c, 0x05, 0xb6,\n  0xb6, 0xfe, 0xff, 0xf2, 0x53, 0x26, 0xfe, 0x8f, 0x7e, 0xca, 0xc4, 0x3a,\n  0x7e, 0xca, 0xda, 0x54, 0x55, 0x65, 0x79, 0x59, 0xb2, 0x74, 0x8d, 0x9f,\n  0xb2, 0x02, 0x55, 0xfc, 0x6f, 0xfc, 0x94, 0xf4, 0xa4, 0xb2, 0x8e, 0x03,\n  0x6d, 0x21, 0xc8, 0x7e, 0xa0, 0xa2, 0xb9, 0xc1, 0x1f, 0xce, 0xb4, 0xb7,\n  0xc4, 0xed, 0x55, 0x45, 0xe1, 0xc4, 0x48, 0x2c, 0xd6, 0xef, 0xf5, 0xfa,\n  0x03, 0xd9, 0xf8, 0xa6, 0x78, 0x6b, 0x87, 0x02, 0xa5, 0x9a, 0xa2, 0x8f,\n  0x7f, 0x48, 0xd5, 0x50, 0x83, 0xd8, 0x89, 0x68, 0xa8, 0x1a, 0x2b, 0x85,\n  0x81, 0xa2, 0x48, 0x85, 0x35, 0xa5, 0xd1, 0xdb, 0x2c, 0xf1, 0xd2, 0x88,\n  0xce, 0xa2, 0x2b, 0xfa, 0x1a, 0x42, 0x33, 0xaf, 0x5f, 0x9b, 0xad, 0x30,\n  0xa0, 0x4b, 0x8f, 0x7d, 0x6f, 0x0c, 0xcf, 0xbb, 0x1d, 0xeb, 0x3e, 0xb7,\n  0x90, 0x79, 0xef, 0xcb, 0x74, 0x73, 0x58, 0xf7, 0xf1, 0x23, 0x05, 0x6f,\n  0x46, 0x9c, 0xc2, 0x04, 0x95, 0x40, 0xc9, 0x39, 0x36, 0xe6, 0xec, 0xbd,\n  0xb9, 0x7c, 0xb7, 0x1c, 0x4c, 0x27, 0x91, 0x33, 0xa5, 0x12, 0x2b, 0x98,\n  0xad, 0xd1, 0x28, 0x60, 0x75, 0x0b, 0x34, 0xf3, 0x4d, 0x02, 0xbf, 0xcf,\n  0x67, 0x64, 0x91, 0x83, 0x49, 0x91, 0x33, 0xf4, 0xdc, 0xc3, 0xe1, 0xa9,\n  0x86, 0xad, 0x8b, 0x5d, 0x7d, 0xf6, 0x84, 0xc1, 0xe4, 0x33, 0x15, 0x47,\n  0x36, 0x34, 0xa6, 0x47, 0x8b, 0xa7, 0x1f, 0xc1, 0xdb, 0xe1, 0x57, 0xdd,\n  0xc1, 0x2d, 0xf3, 0x7f, 0xe9, 0x9a, 0x50, 0x2a, 0x7b, 0x79, 0x65, 0xbc,\n  0xe2, 0xc5, 0xf6, 0xc6, 0x80, 0xfd, 0xc7, 0xd8, 0xfc, 0x62, 0x48, 0x7f,\n  0xdf, 0x44, 0xcf, 0x11, 0x7c, 0xda, 0xf5, 0xfd, 0x97, 0x89, 0x7c, 0xff,\n  0x65, 0xf4, 0x5c, 0xfe, 0x4b, 0xe8, 0xd5, 0xf7, 0xbe, 0x84, 0xbe, 0xf5,\n  0x68, 0x49, 0x85, 0xa5, 0xd8, 0xa4, 0xaf, 0xb6, 0x4c, 0x0e, 0xdc, 0x8d,\n  0xea, 0xba, 0xbb, 0xb3, 0x67, 0x1a, 0xaa, 0x79, 0xbe, 0x87, 0x57, 0xce,\n  0x50, 0x8c, 0xf5, 0x04, 0xd1, 0xb3, 0xc3, 0xcc, 0xf7, 0x1f, 0xf5, 0x9e,\n  0xcb, 0x87, 0x99, 0xf8, 0x3f, 0xf8, 0x30, 0x13, 0xef, 0xe5, 0xc3, 0x4c,\n  0xfc, 0xef, 0x7c, 0x98, 0x89, 0x75, 0x7c, 0x98, 0x62, 0x25, 0x25, 0xab,\n  0xe8, 0xdb, 0x09, 0xa3, 0x50, 0x9e, 0x0f, 0x13, 0x9b, 0x96, 0xc4, 0xb7,\n  0x43, 0x79, 0x6d, 0x95, 0x07, 0xf3, 0x9b, 0xe0, 0xd6, 0xf9, 0xc3, 0xcf,\n  0xa3, 0x66, 0xfb, 0x99, 0xa3, 0xc9, 0xa6, 0xec, 0x17, 0xa6, 0x91, 0x77,\n  0x3a, 0xe0, 0x0f, 0x0e, 0x77, 0x49, 0x0e, 0x1d, 0xd3, 0x64, 0xb8, 0x94,\n  0x75, 0x67, 0x2b, 0xd1, 0xb3, 0x59, 0x8b, 0x69, 0x43, 0x94, 0xba, 0x2e,\n  0xc9, 0xdc, 0xb4, 0x92, 0xb9, 0x79, 0x3f, 0xbe, 0xcb, 0xc4, 0xff, 0xc9,\n  0x77, 0xf9, 0xed, 0xca, 0xb6, 0xce, 0xda, 0x47, 0xd0, 0xb7, 0x1e, 0xae,\n  0xcc, 0xf3, 0x5d, 0xd6, 0x75, 0x29, 0xd1, 0x3f, 0xe1, 0xb9, 0x2b, 0xcf,\n  0xf7, 0x5d, 0xda, 0xb1, 0xd0, 0xf8, 0x04, 0xd1, 0xdb, 0xaa, 0x33, 0x15,\n  0x2a, 0x2c, 0xb5, 0xf5, 0x90, 0xba, 0x29, 0xf9, 0x65, 0xf6, 0x42, 0xfa,\n  0x3e, 0x3b, 0xaf, 0x94, 0xe0, 0x69, 0xb1, 0xfa, 0x0b, 0x3e, 0x4b, 0x6b,\n  0x98, 0x04, 0xdb, 0xa1, 0xf0, 0x6a, 0x59, 0x86, 0x65, 0x17, 0xee, 0x0c,\n  0x7a, 0xee, 0xcb, 0x58, 0x9c, 0xcd, 0x56, 0x4e, 0x4f, 0x57, 0xec, 0x6c,\n  0x19, 0x9f, 0xfb, 0x32, 0xfa, 0x16, 0x7a, 0xee, 0x82, 0xfa, 0x1a, 0xbf,\n  0x97, 0x8a, 0xad, 0xc9, 0xf1, 0x8b, 0xbb, 0x25, 0x9d, 0x91, 0x75, 0x13,\n  0x5c, 0xe7, 0x54, 0xa6, 0x4a, 0xf2, 0x59, 0xe2, 0x35, 0xc5, 0xd3, 0x7c,\n  0x3f, 0x2c, 0x3c, 0xf6, 0x4a, 0xa9, 0x7e, 0x09, 0xd9, 0x5f, 0x19, 0xb6,\n  0x96, 0x14, 0xf8, 0x2b, 0xa5, 0xda, 0x19, 0xb9, 0x8a, 0x78, 0xa0, 0x4f,\n  0x8a, 0xd9, 0xb1, 0x13, 0xc3, 0xdd, 0xbe, 0x6a, 0x93, 0xd1, 0x14, 0xb6,\n  0x85, 0x42, 0x1c, 0x52, 0xf8, 0x26, 0x5b, 0x66, 0x17, 0xa7, 0x1b, 0x9b,\n  0xa7, 0x7a, 0xa6, 0xd9, 0xed, 0x63, 0x7d, 0x6a, 0xa1, 0x4b, 0x21, 0x94,\n  0xc4, 0x86, 0x1d, 0x35, 0xda, 0x8a, 0x92, 0xf9, 0x9d, 0xd9, 0xfb, 0x51,\n  0x77, 0x6f, 0xc7, 0xe2, 0x62, 0xf6, 0x75, 0xca, 0xd3, 0xdc, 0x3e, 0x4c,\n  0x97, 0x77, 0xf7, 0x5d, 0x26, 0xfe, 0x4f, 0xbe, 0xcb, 0xc4, 0x7b, 0xfb,\n  0x2e, 0x13, 0xff, 0x5b, 0xdf, 0x65, 0xe2, 0xff, 0x2b, 0xdf, 0xa5, 0xf4,\n  0xaf, 0xe8, 0xbb, 0xdc, 0x50, 0x5d, 0x55, 0x51, 0x89, 0x8e, 0x64, 0xef,\n  0x8a, 0x5a, 0xec, 0x68, 0x67, 0x3d, 0xd6, 0x62, 0x96, 0xef, 0x99, 0xfe,\n  0xfd, 0xf4, 0x2b, 0xd3, 0xcd, 0xc1, 0x91, 0x1c, 0xa3, 0x97, 0x95, 0xca,\n  0x9c, 0x0e, 0x7f, 0xcc, 0xa1, 0x01, 0xc2, 0xec, 0xb9, 0x1a, 0xd3, 0xac,\n  0x52, 0x95, 0x21, 0xbe, 0xcb, 0x9c, 0x9e, 0x6e, 0xc1, 0x06, 0x48, 0x11,\n  0x13, 0x80, 0x2c, 0x72, 0x3b, 0xb6, 0x94, 0x18, 0x8f, 0x9b, 0xc4, 0xfa,\n  0x08, 0xd8, 0x50, 0x50, 0xa8, 0x58, 0xcc, 0x84, 0xfc, 0x1e, 0x25, 0xd1,\n  0x18, 0x68, 0x0e, 0x83, 0xd3, 0x69, 0xc5, 0x96, 0x66, 0xc0, 0xef, 0x2c,\n  0x72, 0x16, 0x59, 0x1d, 0x56, 0x87, 0xc5, 0x9c, 0xd3, 0xd7, 0x51, 0x4d,\n  0x7e, 0xbd, 0x18, 0x08, 0x01, 0x4e, 0xa5, 0x62, 0x71, 0x6c, 0x94, 0x3b,\n  0xd3, 0xe0, 0xc2, 0x0a, 0xa3, 0x2a, 0x50, 0xd2, 0x8f, 0x81, 0xba, 0xbe,\n  0xa9, 0xa5, 0x4d, 0x79, 0xd5, 0xbf, 0x1a, 0x8e, 0x7e, 0x57, 0x75, 0xc9,\n  0xc6, 0xd6, 0x56, 0xfe, 0x0a, 0x36, 0x44, 0xb4, 0x74, 0xa2, 0xaf, 0x0f,\n  0x0a, 0xa3, 0x3d, 0x37, 0x58, 0xee, 0xee, 0xbb, 0xcb, 0xf2, 0xcf, 0xff,\n  0xac, 0x99, 0x26, 0x3c, 0xb8, 0x72, 0x06, 0xcb, 0xfd, 0x00, 0xb1, 0xc9,\n  0xda, 0x33, 0xad, 0xd8, 0xe2, 0x55, 0x88, 0xf8, 0xbb, 0x1c, 0xa3, 0x54,\n  0x70, 0xca, 0xdd, 0xf9, 0x80, 0xcc, 0xa0, 0x47, 0x0a, 0x52, 0xdc, 0x99,\n  0x55, 0xaa, 0xf4, 0xa2, 0xa1, 0xa5, 0x5e, 0x54, 0xf9, 0xd1, 0x67, 0x69,\n  0x72, 0x00, 0x43, 0x63, 0xec, 0x6d, 0x4a, 0xb7, 0x35, 0x6c, 0x30, 0x78,\n  0xcc, 0x1d, 0xd3, 0xc8, 0x37, 0x3d, 0x9d, 0xfd, 0x75, 0xe7, 0x6b, 0x02,\n  0xf8, 0x2d, 0x67, 0xd9, 0x9d, 0xbf, 0xfc, 0xe5, 0xf2, 0xcb, 0x7f, 0xcb,\n  0x7e, 0x67, 0x60, 0x0b, 0xd5, 0xab, 0x71, 0x67, 0x5d, 0xd8, 0xf6, 0x0e,\n  0xbf, 0x2f, 0x1f, 0x66, 0x62, 0xad, 0x0f, 0x33, 0x1c, 0xf2, 0xfb, 0xe0,\n  0x74, 0x7a, 0xad, 0x0f, 0xd3, 0x5e, 0xa8, 0x58, 0xd9, 0xf3, 0x95, 0x6f,\n  0xa7, 0xa8, 0x77, 0xbf, 0x2a, 0x29, 0x52, 0xaf, 0xca, 0x16, 0xed, 0x77,\n  0x2f, 0xc2, 0xf6, 0x2c, 0xe8, 0xdf, 0xbf, 0xfc, 0x65, 0xbe, 0xf2, 0x74,\n  0xf6, 0x9f, 0x65, 0xf3, 0xb6, 0x0b, 0x9b, 0xb6, 0x55, 0xc4, 0x3e, 0x03,\n  0xdb, 0xbb, 0x8d, 0xc8, 0x19, 0xf0, 0xc2, 0x0e, 0x65, 0xfa, 0x8b, 0x74,\n  0xac, 0xa0, 0x0a, 0xf2, 0xef, 0xea, 0xb3, 0x4c, 0xac, 0xf6, 0x59, 0x46,\n  0xc2, 0xc5, 0x01, 0x2f, 0x56, 0x11, 0x68, 0x28, 0xa8, 0xd9, 0x69, 0x97,\n  0x7d, 0x96, 0xf5, 0xa2, 0x06, 0x55, 0xe8, 0xb2, 0xac, 0x4f, 0x83, 0x3e,\n  0x40, 0x7c, 0xd9, 0x4a, 0xa5, 0x65, 0x28, 0xea, 0xbe, 0x7c, 0x28, 0x1c,\n  0xb7, 0x61, 0xb3, 0xd9, 0xdc, 0x3f, 0x96, 0xbd, 0xe0, 0x93, 0xa3, 0x03,\n  0x17, 0xf1, 0xe6, 0xb9, 0x97, 0x13, 0x53, 0xd5, 0x5a, 0xcf, 0xd7, 0x10,\n  0x97, 0x6e, 0x71, 0x7d, 0xf8, 0xe1, 0xcf, 0x57, 0xd6, 0x69, 0x32, 0x37,\n  0x0d, 0x66, 0xab, 0xb2, 0xcb, 0x78, 0x10, 0x8f, 0x70, 0x0d, 0x77, 0x35,\n  0x1e, 0x78, 0xe9, 0x01, 0x9f, 0x8f, 0xf5, 0xd5, 0x53, 0x1b, 0xbd, 0x9b,\n  0x6d, 0xc0, 0xf3, 0xe0, 0x60, 0xee, 0xa3, 0xea, 0x12, 0x98, 0xe5, 0xac,\n  0x68, 0x96, 0x53, 0x23, 0x5d, 0x99, 0x33, 0xd2, 0xfd, 0x6b, 0x9c, 0x87,\n  0x89, 0xb5, 0xce, 0xc3, 0xd0, 0x7a, 0xce, 0xc3, 0xc4, 0x7b, 0x39, 0x0f,\n  0xd7, 0xb1, 0xea, 0xa9, 0xeb, 0xd0, 0xc1, 0x38, 0x2c, 0x64, 0x43, 0x2f,\n  0x70, 0x1d, 0xe6, 0xd9, 0xf5, 0x41, 0x33, 0xdb, 0x30, 0x36, 0x5e, 0x68,\n  0xd7, 0xa3, 0x8e, 0xee, 0x15, 0xe6, 0x6b, 0xf9, 0x76, 0x7d, 0xb6, 0x82,\n  0xe8, 0x93, 0x75, 0x78, 0xbd, 0xc6, 0xb0, 0x8c, 0x86, 0xda, 0xd3, 0xae,\n  0x8c, 0xdd, 0x81, 0xa0, 0x7c, 0x13, 0x92, 0x6c, 0xd2, 0x58, 0xa4, 0x82,\n  0x85, 0xc0, 0x7b, 0x27, 0x71, 0x1c, 0x40, 0x8d, 0xa6, 0xbc, 0xb2, 0x4d,\n  0x34, 0xba, 0x92, 0x23, 0xb7, 0xa8, 0x5e, 0xce, 0xea, 0x34, 0x7b, 0x3e,\n  0x3c, 0xe2, 0x6b, 0xab, 0xd9, 0xbe, 0xef, 0xba, 0x23, 0x3d, 0x87, 0xdb,\n  0x76, 0xcc, 0x04, 0x1b, 0x82, 0x23, 0x0f, 0xb7, 0x97, 0x0c, 0x55, 0x8f,\n  0xf5, 0x0d, 0x6d, 0x1a, 0x61, 0x97, 0x87, 0x74, 0xb6, 0x62, 0xbf, 0xcd,\n  0x17, 0x70, 0x57, 0x5d, 0xb4, 0xed, 0xe8, 0xa5, 0xe9, 0x3d, 0x03, 0xb3,\n  0x17, 0x16, 0x81, 0x87, 0xa8, 0x76, 0x63, 0x22, 0xfb, 0xb0, 0xa6, 0x6c,\n  0x24, 0xd3, 0x3b, 0x39, 0x35, 0xd4, 0x3f, 0xc9, 0xac, 0xf5, 0x3d, 0xe2,\n  0xdf, 0x93, 0x2b, 0x27, 0xb8, 0x1e, 0xf6, 0xbf, 0x98, 0x4a, 0xb5, 0x8f,\n  0x15, 0x98, 0x6b, 0xbd, 0xfb, 0xe0, 0x27, 0x6c, 0x58, 0x8a, 0x3f, 0xa1,\n  0xeb, 0xd0, 0xad, 0xe2, 0x4f, 0x5a, 0xf9, 0xee, 0x4d, 0xf2, 0xb5, 0xeb,\n  0x56, 0x2e, 0xf3, 0xee, 0x43, 0x46, 0xb8, 0x06, 0x3f, 0x31, 0xcd, 0x5f,\n  0x62, 0xb8, 0x87, 0xae, 0x05, 0x20, 0x66, 0x4e, 0xfc, 0xbf, 0x92, 0x7b,\n  0x1c, 0xdd, 0x0a, 0x3f, 0xa8, 0xc5, 0x0b, 0x3a, 0xe9, 0x82, 0x91, 0x7b,\n  0x7c, 0xe5, 0x32, 0xf8, 0xc1, 0x22, 0xfe, 0x40, 0xfa, 0xf3, 0x79, 0x76,\n  0x3f, 0xba, 0x9d, 0x8b, 0x33, 0x82, 0xee, 0x04, 0x0a, 0x32, 0xb4, 0xcf,\n  0x3a, 0x14, 0x40, 0xf7, 0xb0, 0x8b, 0xa8, 0x07, 0xfd, 0x7a, 0xfd, 0xfc,\n  0x56, 0x90, 0x99, 0xb8, 0xcd, 0x02, 0x69, 0xf3, 0xdb, 0x73, 0xe6, 0xc0,\n  0xe2, 0xb1, 0xa3, 0x9b, 0xd8, 0xa7, 0xf0, 0xca, 0x69, 0xa4, 0x05, 0xd2,\n  0xac, 0xc4, 0x7d, 0xcb, 0x11, 0xf8, 0x9b, 0x5a, 0xe0, 0x8d, 0x34, 0xb0,\n  0x4d, 0xee, 0xaa, 0xa8, 0x4f, 0xd4, 0xa2, 0xe1, 0x99, 0xc7, 0xe0, 0x14,\n  0x93, 0x57, 0x15, 0x51, 0xb0, 0x4b, 0x28, 0xaa, 0x78, 0xd3, 0x73, 0xb3,\n  0xb3, 0xcf, 0xa1, 0xe1, 0xec, 0xc3, 0xec, 0x53, 0xd9, 0xff, 0x24, 0xef,\n  0xf7, 0x93, 0xb3, 0xd3, 0xa7, 0x18, 0x2d, 0xd3, 0x4f, 0xdf, 0x5f, 0x04,\n  0xc7, 0x62, 0xb0, 0x29, 0x5f, 0x01, 0x87, 0xb5, 0xe4, 0x30, 0xac, 0x16,\n  0xce, 0xf1, 0xd2, 0xb0, 0x27, 0xb9, 0xe5, 0x9b, 0xf8, 0xca, 0xc9, 0x5c,\n  0x03, 0x52, 0xf7, 0x49, 0x04, 0xc6, 0x55, 0xd1, 0x00, 0x72, 0x3b, 0x81,\n  0xd7, 0x4c, 0x87, 0xd1, 0xfe, 0xd9, 0x07, 0xfa, 0xd8, 0x4c, 0xdf, 0x03,\n  0xec, 0xa5, 0x2f, 0xa2, 0x8a, 0xec, 0x7f, 0xbe, 0x48, 0xc7, 0xbe, 0x84,\n  0xbf, 0xfb, 0x29, 0x98, 0x53, 0xf4, 0x25, 0x3a, 0x4e, 0x2c, 0x7f, 0x77,\n  0xe1, 0x7e, 0x14, 0x31, 0xbb, 0x32, 0x4e, 0x97, 0x45, 0xaf, 0xc3, 0xe2,\n  0x4c, 0xab, 0x60, 0x01, 0xf6, 0x06, 0xcc, 0x78, 0x37, 0xfe, 0xee, 0x00,\n  0xed, 0xa0, 0x13, 0x22, 0x5f, 0x6b, 0xc1, 0xec, 0x4a, 0x53, 0x59, 0x0c,\n  0xba, 0xcb, 0x06, 0x86, 0x94, 0x2c, 0x91, 0x72, 0x9d, 0x6b, 0x0b, 0xee,\n  0xcc, 0x64, 0xcc, 0x88, 0xc1, 0xb2, 0x10, 0xb2, 0x48, 0x04, 0xa6, 0x08,\n  0x15, 0x29, 0x55, 0xf4, 0xec, 0x47, 0x5a, 0x29, 0x9c, 0x40, 0xe8, 0x43,\n  0xf2, 0x64, 0x21, 0x35, 0xa6, 0xb1, 0x6a, 0x32, 0x63, 0x2e, 0xd9, 0xde,\n  0x32, 0x79, 0x9e, 0xfd, 0xef, 0xe3, 0xb3, 0xb3, 0xe6, 0x52, 0xeb, 0x5f,\n  0xf6, 0x66, 0x5f, 0x45, 0xae, 0xaa, 0xd7, 0x4c, 0x0e, 0x61, 0xc8, 0x52,\n  0xd4, 0x31, 0x86, 0xf6, 0x76, 0x65, 0xff, 0x80, 0x89, 0x78, 0x97, 0x2d,\n  0x65, 0x43, 0xea, 0xec, 0xbf, 0x67, 0xf7, 0xbd, 0x46, 0xb1, 0x2a, 0x1f,\n  0x5e, 0xd9, 0xc8, 0x3c, 0x06, 0xe3, 0x62, 0xca, 0xdf, 0xdb, 0x8f, 0x8e,\n  0xdb, 0xaf, 0xe0, 0xc1, 0xdb, 0xd8, 0xd7, 0x98, 0x98, 0x0a, 0xcd, 0x40,\n  0xae, 0xf4, 0xf8, 0x0a, 0xbb, 0xf2, 0x43, 0x8a, 0x05, 0xb8, 0xf2, 0x43,\n  0xe0, 0x82, 0xf7, 0xe9, 0xaf, 0x87, 0x7f, 0xfe, 0x8e, 0xd7, 0x44, 0x4c,\n  0xf9, 0x8b, 0xaf, 0x3e, 0x03, 0x66, 0x7c, 0xb3, 0x98, 0x63, 0xbb, 0xf2,\n  0x4c, 0x3e, 0xb6, 0x38, 0xf3, 0x36, 0xb4, 0x11, 0x5c, 0x5f, 0x26, 0x6d,\n  0xda, 0xd6, 0x6d, 0x83, 0x20, 0x86, 0x39, 0xae, 0x7c, 0x75, 0x65, 0xc7,\n  0xca, 0x33, 0x48, 0xc0, 0xdf, 0x7c, 0x81, 0x11, 0xab, 0x8d, 0xad, 0xdb,\n  0xee, 0xed, 0x95, 0xf3, 0xde, 0xa3, 0xdd, 0xc7, 0x49, 0xbb, 0x3f, 0xaf,\n  0x8c, 0x8a, 0xed, 0x5e, 0x7c, 0xd7, 0x76, 0xff, 0x78, 0xb7, 0x76, 0x04,\n  0xef, 0xff, 0x1b, 0x5c, 0x29, 0x6e, 0xf7, 0x97, 0x95, 0x23, 0xb4, 0x1d,\n  0xb8, 0xad, 0xdf, 0xa5, 0xdd, 0x3b, 0xef, 0xd9, 0x4e, 0x0d, 0xb1, 0x6b,\n  0x82, 0x6e, 0x25, 0xb4, 0x42, 0xa8, 0x32, 0x5c, 0x40, 0x15, 0xb1, 0x8d,\n  0x40, 0xda, 0x38, 0xb3, 0x67, 0x69, 0x9b, 0xc1, 0xd5, 0x6d, 0xfe, 0x4a,\n  0xf2, 0xbd, 0x6f, 0x97, 0xe7, 0xe8, 0x5e, 0xe6, 0x26, 0x3a, 0x47, 0x48,\n  0x9e, 0xa3, 0x95, 0xb7, 0xf1, 0x9d, 0x30, 0x37, 0x25, 0xb7, 0xf9, 0xec,\n  0xea, 0x36, 0x62, 0xdd, 0xcb, 0x05, 0xbc, 0x7f, 0x0a, 0xcc, 0x46, 0xca,\n  0xee, 0x36, 0x51, 0x45, 0xde, 0x0d, 0x7c, 0x5d, 0x4f, 0xd8, 0x1e, 0x0e,\n  0xd9, 0xe5, 0xcb, 0x32, 0xcf, 0xd7, 0xc3, 0xc9, 0xba, 0x2e, 0x07, 0xe2,\n  0xa2, 0x72, 0x83, 0x53, 0x80, 0x54, 0x9a, 0x7b, 0xf0, 0xcb, 0x5f, 0x9e,\n  0x66, 0xdd, 0x2f, 0x76, 0xfd, 0x0d, 0xbf, 0x18, 0x7f, 0xc3, 0x81, 0xff,\n  0x7a, 0x8b, 0xfd, 0xc7, 0xbb, 0xae, 0xf9, 0xba, 0xf7, 0x5a, 0xf3, 0x75,\n  0xeb, 0xae, 0x79, 0x50, 0x27, 0xf0, 0x9a, 0x4f, 0xcf, 0x5c, 0x3c, 0x88,\n  0x7e, 0x3d, 0x78, 0x9c, 0x7d, 0xe4, 0xbe, 0x3f, 0xfe, 0xf1, 0x3e, 0x52,\n  0x9b, 0x04, 0xaf, 0xf7, 0x72, 0xe2, 0x73, 0x7f, 0x56, 0x96, 0x3b, 0x6d,\n  0xa4, 0x1e, 0x56, 0x3a, 0x53, 0xe3, 0x01, 0x08, 0x43, 0x48, 0x64, 0x92,\n  0xcb, 0xca, 0x81, 0xbe, 0x45, 0xdd, 0x45, 0xfb, 0x01, 0xdc, 0x0a, 0x54,\n  0x5b, 0xb3, 0x11, 0x8c, 0x22, 0x70, 0x72, 0xe7, 0xca, 0x10, 0x3b, 0x9c,\n  0xf8, 0x73, 0xa9, 0xbc, 0x33, 0x5c, 0x88, 0x21, 0x48, 0xd3, 0x2a, 0xc4,\n  0x15, 0x63, 0x83, 0xa1, 0x86, 0xc0, 0x9f, 0xae, 0xda, 0x47, 0x14, 0xc2,\n  0xba, 0xd4, 0x55, 0x7f, 0xaa, 0xea, 0x1d, 0x40, 0xcf, 0xef, 0x18, 0x4d,\n  0x6d, 0xe9, 0x30, 0x74, 0xf5, 0x4d, 0x9c, 0xbe, 0xe8, 0x9a, 0x96, 0xc3,\n  0x23, 0xfd, 0x07, 0xe2, 0x7d, 0x5d, 0x8e, 0x0b, 0x26, 0x47, 0xb7, 0xe7,\n  0x7c, 0x81, 0xfd, 0x78, 0x1f, 0xb4, 0xe3, 0x6d, 0x0f, 0x5b, 0x6d, 0x24,\n  0x91, 0x11, 0x3a, 0x86, 0x4d, 0x16, 0x05, 0x29, 0x0c, 0x4a, 0xc0, 0x98,\n  0xf7, 0xe6, 0x25, 0xdd, 0x3a, 0x1d, 0x50, 0xac, 0x17, 0x32, 0x59, 0x1d,\n  0x65, 0xce, 0x32, 0xa3, 0x9e, 0xb1, 0x23, 0xbb, 0x2a, 0xa7, 0xac, 0xe6,\n  0x6a, 0x54, 0xa7, 0xcd, 0x14, 0x8e, 0x0d, 0x1b, 0x2c, 0xb6, 0xd5, 0xa1,\n  0xf7, 0xa8, 0xb3, 0x63, 0x4f, 0xd3, 0x70, 0xff, 0xdc, 0xd6, 0x93, 0x17,\n  0x5d, 0x78, 0xb2, 0xf5, 0x40, 0x47, 0xa2, 0xb3, 0x64, 0x64, 0x62, 0x7c,\n  0x78, 0x61, 0x38, 0x9d, 0x1c, 0xee, 0x1d, 0x62, 0x97, 0x93, 0x9b, 0x33,\n  0xbd, 0x9b, 0x75, 0xbc, 0x66, 0x69, 0x6e, 0xf7, 0x79, 0xe7, 0xed, 0x46,\n  0x83, 0x63, 0x3b, 0xab, 0xfa, 0xbc, 0xdd, 0x6d, 0xd9, 0x6f, 0x75, 0x0f,\n  0x0d, 0x75, 0x8f, 0xf4, 0xf5, 0xf7, 0xb7, 0xb4, 0x36, 0x8b, 0xb9, 0xb9,\n  0x67, 0xd9, 0x8b, 0xd9, 0x33, 0xcc, 0x00, 0xd3, 0x93, 0xe9, 0x2c, 0x42,\n  0x2c, 0xd7, 0x53, 0xc1, 0xf2, 0x2c, 0x3b, 0x18, 0x72, 0x63, 0x99, 0xaa,\n  0x80, 0x4d, 0x9d, 0x43, 0xa4, 0x14, 0xef, 0x29, 0x48, 0xb8, 0x3a, 0x05,\n  0x58, 0x6a, 0xfc, 0x8c, 0x54, 0x8a, 0x8e, 0x67, 0xc6, 0x10, 0xd3, 0xb1,\n  0xb1, 0xa9, 0x31, 0xe0, 0x73, 0x39, 0x98, 0x01, 0x34, 0xa0, 0x54, 0x82,\n  0xa0, 0x24, 0x1b, 0x3c, 0x44, 0x21, 0x39, 0x5b, 0xb9, 0x7a, 0x3f, 0x97,\n  0xaa, 0xa9, 0x77, 0xd2, 0x94, 0x45, 0x1a, 0x47, 0x40, 0xab, 0x8b, 0xc6,\n  0x6b, 0x5a, 0x59, 0x38, 0x42, 0x4d, 0xd7, 0xd6, 0x87, 0xe8, 0x65, 0x12,\n  0xbb, 0xe4, 0x04, 0x34, 0x96, 0x0f, 0x34, 0x1c, 0x9d, 0xdf, 0xe0, 0x71,\n  0x7b, 0x5a, 0x9a, 0x1c, 0x6e, 0x73, 0x73, 0x67, 0x83, 0x9e, 0x35, 0x58,\n  0x9d, 0x5a, 0x83, 0x43, 0x65, 0xac, 0x2c, 0xd5, 0xa8, 0x83, 0x01, 0x95,\n  0xb2, 0xc8, 0x6e, 0x34, 0xd4, 0x4f, 0x56, 0xf2, 0xbc, 0x2f, 0xec, 0x36,\n  0x5b, 0x74, 0x86, 0xca, 0xaa, 0xe0, 0xe6, 0x8f, 0x6c, 0xe7, 0xcb, 0x9b,\n  0xdc, 0xaa, 0x4f, 0x5b, 0x4a, 0x54, 0xa5, 0x63, 0x17, 0x0c, 0x8c, 0x1d,\n  0xa8, 0xb5, 0x44, 0x8b, 0xd5, 0x56, 0x9d, 0x3f, 0xe0, 0xe4, 0x85, 0x58,\n  0x69, 0x40, 0xeb, 0x50, 0x59, 0x75, 0xe1, 0x2a, 0x0b, 0xd2, 0x79, 0x5c,\n  0x9e, 0x96, 0xd6, 0x40, 0x69, 0x26, 0xa6, 0x70, 0x69, 0xec, 0x31, 0x5f,\n  0xb2, 0x3d, 0x65, 0x77, 0x19, 0x0c, 0x15, 0x5b, 0x86, 0x97, 0xae, 0xef,\n  0xb5, 0xf9, 0xf5, 0xf6, 0x83, 0x90, 0x5b, 0x04, 0x7e, 0xad, 0x93, 0xec,\n  0x17, 0xd8, 0x67, 0x98, 0x9d, 0xcc, 0xc3, 0x99, 0xe2, 0x5e, 0xa4, 0x54,\n  0x8c, 0x98, 0x31, 0x0d, 0x4a, 0xb0, 0x21, 0x1a, 0x2c, 0x76, 0xf1, 0x3c,\n  0x4d, 0x31, 0x51, 0x0c, 0xb6, 0x67, 0x1a, 0x38, 0x05, 0x5e, 0x19, 0x6a,\n  0xbc, 0x32, 0xe0, 0x60, 0x5b, 0x50, 0x1c, 0x06, 0xb8, 0xb2, 0x53, 0x52,\n  0xec, 0x02, 0xc3, 0x01, 0xe6, 0xd1, 0xe5, 0xa4, 0x20, 0x11, 0x73, 0x39,\n  0xac, 0xe5, 0x93, 0x8c, 0xc0, 0xb2, 0xc2, 0x0c, 0x38, 0xea, 0x96, 0x18,\n  0x56, 0x60, 0x37, 0x41, 0xf5, 0x67, 0x38, 0x11, 0xff, 0xdf, 0x3e, 0x47,\n  0x4e, 0x2a, 0x26, 0x37, 0x77, 0x75, 0xb4, 0x34, 0xc5, 0xa3, 0x3e, 0x8f,\n  0x51, 0x8f, 0x8d, 0x8a, 0x9d, 0x68, 0xa7, 0x9a, 0x4c, 0x03, 0x29, 0x8f,\n  0x89, 0x89, 0x1a, 0xc7, 0xba, 0x18, 0x0d, 0xda, 0x74, 0x28, 0x05, 0xa1,\n  0x82, 0x85, 0xa4, 0x51, 0x21, 0xde, 0xca, 0x11, 0x0c, 0x47, 0xe0, 0x7d,\n  0x98, 0x2f, 0x98, 0x29, 0x96, 0xce, 0x80, 0x58, 0x11, 0x8e, 0x4c, 0x8a,\n  0xb3, 0x95, 0x4f, 0xd5, 0xf8, 0x59, 0xa7, 0x9f, 0xbc, 0xc2, 0xc0, 0xa1,\n  0x1f, 0x5b, 0x4b, 0x6c, 0xb5, 0xc6, 0x22, 0x6b, 0xb8, 0x81, 0x45, 0x81,\n  0x96, 0xca, 0xfa, 0xee, 0x62, 0x83, 0x19, 0x2f, 0x46, 0xf6, 0x66, 0xde,\n  0x1f, 0x31, 0xea, 0x43, 0x5e, 0x85, 0x51, 0x19, 0x4a, 0x96, 0x1a, 0x1d,\n  0x09, 0xbb, 0x20, 0x58, 0x62, 0x35, 0xb1, 0x68, 0x43, 0x73, 0xa5, 0xda,\n  0x5a, 0x57, 0x6b, 0xb4, 0x06, 0x8b, 0xd4, 0xa6, 0x96, 0x71, 0x85, 0xb5,\n  0x65, 0x83, 0x51, 0xeb, 0xb3, 0x79, 0x9d, 0x9a, 0x92, 0x9a, 0xaa, 0x90,\n  0x42, 0x28, 0x6d, 0x6c, 0xf5, 0x68, 0xf4, 0x78, 0xe5, 0x3a, 0x8d, 0x8d,\n  0x5d, 0x21, 0xdd, 0xa5, 0x06, 0x53, 0x97, 0xd5, 0x7e, 0xe5, 0x07, 0xb7,\n  0xed, 0x2a, 0x41, 0xa8, 0xb9, 0xc1, 0xdf, 0x58, 0xa4, 0x2e, 0x16, 0x1e,\n  0x54, 0xfa, 0xdc, 0x56, 0x97, 0x60, 0x56, 0x45, 0x13, 0xde, 0x80, 0x5d,\n  0xa5, 0x8a, 0xfa, 0x8a, 0x06, 0x26, 0x67, 0x4b, 0x03, 0x99, 0xa6, 0x9a,\n  0x20, 0xaf, 0xf3, 0x58, 0xad, 0x2e, 0x95, 0x31, 0x93, 0xb6, 0x17, 0xa9,\n  0xb5, 0xf1, 0x94, 0xcf, 0xd1, 0x5d, 0xa1, 0x0e, 0x95, 0xc4, 0x5c, 0x9c,\n  0xee, 0xff, 0xd1, 0xf6, 0x1e, 0xf0, 0x91, 0x5d, 0xf5, 0xbd, 0xf8, 0x3d,\n  0xb7, 0xce, 0xdc, 0xe9, 0xbd, 0xd7, 0x3b, 0x55, 0x53, 0xa4, 0x69, 0x1a,\n  0x95, 0x91, 0x34, 0xea, 0xbd, 0xad, 0xb4, 0x2b, 0x69, 0xbb, 0xb6, 0x69,\n  0xb5, 0x7d, 0xd7, 0xdd, 0x6b, 0xaf, 0xd7, 0x3d, 0xe0, 0x02, 0x98, 0x62,\n  0x63, 0xca, 0xf3, 0x1f, 0x88, 0x53, 0x08, 0x24, 0xb1, 0xb1, 0x03, 0x31,\n  0x09, 0x21, 0xf0, 0x48, 0x82, 0x8d, 0x29, 0x31, 0x84, 0x10, 0x6a, 0x08,\n  0xc1, 0x24, 0x0f, 0xe2, 0x38, 0x60, 0xf3, 0x80, 0x1d, 0xbd, 0xf3, 0x3b,\n  0xf7, 0xce, 0x68, 0xb4, 0xd6, 0x12, 0x5e, 0xfe, 0x79, 0xfb, 0x59, 0x49,\n  0x33, 0xf7, 0x9c, 0x7b, 0xef, 0x39, 0xbf, 0x73, 0xce, 0xaf, 0x9c, 0xf3,\n  0xfb, 0x7d, 0x7f, 0x0e, 0xab, 0x77, 0x71, 0x87, 0x73, 0xf0, 0xd6, 0x74,\n  0x5b, 0xd1, 0x81, 0x17, 0x23, 0x15, 0xc4, 0x73, 0xdd, 0x4b, 0x7f, 0x09,\n  0xdb, 0x3a, 0xe3, 0xd4, 0x72, 0x75, 0xa7, 0xc9, 0x88, 0xe9, 0xda, 0xd5,\n  0x49, 0x83, 0x59, 0xc4, 0x61, 0xaa, 0x10, 0x90, 0xb2, 0x10, 0xe2, 0xd0,\n  0x24, 0xc9, 0xd9, 0x86, 0xf0, 0x08, 0xd0, 0x0c, 0xc7, 0xd0, 0xdc, 0x65,\n  0x82, 0x23, 0xc8, 0x5e, 0x02, 0x5f, 0x9e, 0x7b, 0x88, 0xda, 0xb4, 0xa2,\n  0xe4, 0x95, 0xa2, 0x98, 0x79, 0xbf, 0x2f, 0x93, 0xf2, 0x8d, 0xfb, 0xc7,\n  0xa5, 0x98, 0x14, 0x13, 0x78, 0x77, 0xca, 0x12, 0x97, 0x49, 0xb6, 0x49,\n  0x4b, 0x99, 0xe2, 0x16, 0xa0, 0xa9, 0x10, 0x27, 0xf9, 0xe9, 0xe4, 0x52,\n  0x79, 0xf6, 0xc3, 0x32, 0x81, 0xa3, 0x75, 0xd9, 0xdf, 0x46, 0xd0, 0xd3,\n  0x05, 0x0b, 0x6d, 0x09, 0xb4, 0x14, 0x7c, 0xee, 0x4a, 0xa5, 0xdd, 0x62,\n  0x4e, 0x86, 0xd5, 0xba, 0xb1, 0x19, 0xbd, 0xba, 0xa5, 0xbd, 0xdd, 0x16,\n  0xa9, 0x24, 0xdf, 0x65, 0xcc, 0x26, 0xd5, 0x39, 0xe3, 0x71, 0x56, 0x64,\n  0x18, 0x8d, 0x3d, 0xea, 0xcf, 0x17, 0xcd, 0xa2, 0x26, 0x52, 0x68, 0xd3,\n  0x6a, 0xc3, 0x61, 0x95, 0x5a, 0x65, 0xef, 0x6a, 0x8f, 0x64, 0x03, 0xe8,\n  0x55, 0x95, 0x3a, 0xd7, 0xd3, 0x19, 0xb3, 0xfb, 0xec, 0x0e, 0x0f, 0x6f,\n  0x2e, 0x97, 0x8d, 0x36, 0x63, 0xa6, 0xe7, 0xca, 0x4f, 0x6c, 0x1e, 0x55,\n  0xca, 0x78, 0x1b, 0xa7, 0x0d, 0x67, 0xc3, 0x85, 0x85, 0xd6, 0xcc, 0xbe,\n  0x79, 0xb7, 0x26, 0xd6, 0x22, 0xa9, 0x4c, 0xee, 0xb8, 0x49, 0x5d, 0x99,\n  0x9d, 0xf5, 0xc6, 0x86, 0x06, 0xa2, 0x4e, 0x07, 0x4f, 0xf8, 0x9a, 0x73,\n  0xe3, 0x75, 0x66, 0x12, 0xf3, 0x85, 0x0b, 0xd4, 0x7d, 0xd4, 0x1d, 0xd5,\n  0xdb, 0xe6, 0xaa, 0x34, 0x47, 0x5f, 0x87, 0x54, 0x7c, 0xaa, 0x85, 0x46,\n  0xaa, 0xd5, 0x03, 0xfb, 0x19, 0x01, 0x19, 0x31, 0x97, 0xe3, 0xa6, 0x0e,\n  0xaa, 0x04, 0x06, 0xd3, 0x93, 0xa3, 0xd5, 0x34, 0xa7, 0xbe, 0x4c, 0xa9,\n  0x79, 0x5a, 0xcd, 0x5f, 0xa2, 0x78, 0x15, 0xd6, 0x58, 0x2e, 0x51, 0x2a,\n  0x44, 0xab, 0x60, 0x06, 0x63, 0x7e, 0x2d, 0x5c, 0xc2, 0x82, 0x06, 0xab,\n  0xdf, 0x97, 0x40, 0x2a, 0x10, 0x58, 0x7f, 0xcc, 0x46, 0x68, 0x9a, 0x30,\n  0x13, 0x7a, 0x55, 0xc4, 0x8a, 0x1b, 0x3d, 0x7f, 0xf9, 0xd2, 0xcd, 0x37,\n  0xad, 0xaf, 0xed, 0xdd, 0xbd, 0x73, 0x71, 0x66, 0x0a, 0xe6, 0x74, 0x36,\n  0x26, 0x69, 0x78, 0x57, 0xca, 0x41, 0x28, 0x88, 0xa7, 0x2c, 0x4d, 0xa2,\n  0xa0, 0x31, 0x6b, 0x61, 0x60, 0xd2, 0xca, 0xc1, 0xcf, 0x40, 0x37, 0x6c,\n  0x89, 0xc6, 0x81, 0x9b, 0xc8, 0x96, 0x45, 0x59, 0xa9, 0x07, 0x7f, 0x70,\n  0xe9, 0x66, 0xf6, 0x79, 0xe2, 0xd3, 0x24, 0x7f, 0x01, 0x07, 0x87, 0x92,\n  0x1c, 0x40, 0x2d, 0x10, 0xff, 0x49, 0x70, 0x63, 0x2d, 0x83, 0x81, 0x42,\n  0x36, 0x59, 0xf5, 0x34, 0x5e, 0x2b, 0x7f, 0xcd, 0x7b, 0x83, 0x06, 0x67,\n  0xd0, 0x61, 0xb4, 0x17, 0xdb, 0x8c, 0x86, 0x80, 0x57, 0xe5, 0xb0, 0x8b,\n  0x4e, 0xbb, 0x3e, 0x54, 0xec, 0x74, 0xda, 0x32, 0x7e, 0x7f, 0xcc, 0xef,\n  0x89, 0x47, 0x35, 0x46, 0xd1, 0x6d, 0xf1, 0x46, 0xbd, 0xee, 0x90, 0xa8,\n  0x4b, 0xf7, 0xc4, 0x92, 0xe3, 0x45, 0x8d, 0xa5, 0x63, 0x2a, 0x27, 0xc5,\n  0x4c, 0xac, 0x46, 0xa7, 0x91, 0x44, 0x75, 0x69, 0x77, 0xde, 0x94, 0x0e,\n  0xb9, 0xa2, 0x86, 0xa0, 0xa0, 0x7f, 0x78, 0x88, 0x16, 0xfc, 0xad, 0xee,\n  0x68, 0x85, 0x67, 0x4c, 0x1e, 0xab, 0xb3, 0xb7, 0xf2, 0x0d, 0xcb, 0x60,\n  0xe0, 0x4d, 0x1e, 0xaf, 0x68, 0xf3, 0x59, 0xb3, 0x2d, 0x98, 0xf9, 0xf2,\n  0x6a, 0x95, 0xc7, 0xee, 0x74, 0x1a, 0xbc, 0xed, 0x51, 0xa7, 0x4f, 0xd4,\n  0x5b, 0xd4, 0xa1, 0xde, 0x63, 0x33, 0x93, 0x6b, 0x55, 0xaf, 0x33, 0xe1,\n  0xb2, 0x25, 0x12, 0x29, 0xa7, 0x29, 0x11, 0x0f, 0xa8, 0xcc, 0x82, 0xd3,\n  0xa7, 0x73, 0x45, 0x23, 0x49, 0xaf, 0xb5, 0x35, 0x21, 0xea, 0xe2, 0xc1,\n  0xd4, 0x70, 0xd2, 0x37, 0x9c, 0x77, 0x45, 0x63, 0x7a, 0xbf, 0xd1, 0xa5,\n  0x61, 0x9d, 0xce, 0x4c, 0x0c, 0x19, 0xad, 0xea, 0xbb, 0xde, 0x6e, 0x13,\n  0x4c, 0xd7, 0xdf, 0xaa, 0xea, 0x4c, 0x0d, 0x56, 0x8c, 0x3a, 0xda, 0x35,\n  0x35, 0x17, 0x74, 0x96, 0x73, 0xe8, 0x7a, 0xd1, 0x2d, 0x0c, 0x3b, 0x25,\n  0xbd, 0xc3, 0xd7, 0xe2, 0x49, 0x17, 0x1c, 0x99, 0x39, 0x25, 0x6e, 0xe2,\n  0x2d, 0xb4, 0x8b, 0x81, 0x7c, 0x6d, 0xf7, 0x54, 0xef, 0x2c, 0x61, 0x95,\n  0x25, 0x22, 0xe1, 0xc1, 0xb1, 0x8a, 0x6a, 0xcc, 0xe4, 0x18, 0x82, 0xd1,\n  0x50, 0x6e, 0xa7, 0xd5, 0x13, 0x94, 0x5a, 0xa5, 0x52, 0x9f, 0xa3, 0x04,\n  0x5e, 0xe4, 0x05, 0xf1, 0x32, 0x25, 0x72, 0xbc, 0xc8, 0x5d, 0xc2, 0xcb,\n  0x83, 0xc7, 0xcb, 0x03, 0x0f, 0x27, 0xcf, 0xd2, 0x97, 0x30, 0xb7, 0xe2,\n  0x69, 0x18, 0x74, 0x86, 0x47, 0x0c, 0x9e, 0x02, 0x98, 0xa7, 0xa9, 0xf8,\n  0x13, 0x04, 0x84, 0x60, 0x85, 0x04, 0x98, 0x6a, 0x60, 0x75, 0x61, 0xc1,\n  0x31, 0x33, 0xd5, 0xdf, 0xd7, 0x5b, 0xc9, 0xb7, 0x65, 0xd3, 0xb1, 0x68,\n  0x28, 0xe0, 0xb4, 0x1b, 0x74, 0x02, 0x47, 0xed, 0x42, 0xbb, 0xb4, 0xbc,\n  0xbc, 0x25, 0xa2, 0x9c, 0xd7, 0x90, 0xd1, 0x04, 0x56, 0x04, 0xcc, 0x0c,\n  0x46, 0x5e, 0xbe, 0x5c, 0xae, 0x7f, 0x94, 0xed, 0x4a, 0x79, 0x11, 0xc1,\n  0xe0, 0x92, 0xda, 0x7a, 0x46, 0x50, 0x86, 0x1f, 0x4f, 0x8e, 0x2f, 0xda,\n  0x4b, 0x0e, 0x95, 0x43, 0xef, 0x36, 0x68, 0x0d, 0xe9, 0xb2, 0xcf, 0xec,\n  0xc1, 0x1a, 0x89, 0xcf, 0xde, 0x36, 0x98, 0x74, 0xa8, 0x76, 0x8d, 0x84,\n  0xf3, 0x1a, 0x6d, 0xab, 0xa3, 0x3d, 0x1f, 0x8c, 0x75, 0x69, 0xdb, 0xda,\n  0x74, 0x91, 0x90, 0x6a, 0xd2, 0xc2, 0x8a, 0xb1, 0xd6, 0x58, 0x5b, 0x28,\n  0xd7, 0x16, 0xc8, 0xb6, 0x49, 0x2c, 0xef, 0xf6, 0xa9, 0xda, 0x7a, 0x23,\n  0xfa, 0x8e, 0xfd, 0x37, 0x9e, 0x17, 0xc4, 0xee, 0x36, 0x9d, 0xda, 0x22,\n  0x7a, 0x6d, 0x7a, 0xbb, 0xc1, 0x6f, 0xf6, 0x1b, 0x62, 0xd5, 0xc9, 0xc9,\n  0xc0, 0xf0, 0xa4, 0x91, 0xd7, 0xf5, 0x23, 0x77, 0xba, 0x2b, 0xe4, 0x0d,\n  0x71, 0xac, 0xce, 0xa2, 0x3e, 0xa5, 0xe5, 0x4c, 0x2a, 0x51, 0x2f, 0xb4,\n  0xe4, 0xe3, 0xfd, 0x85, 0xa8, 0x15, 0xa2, 0x11, 0x03, 0xad, 0x79, 0xeb,\n  0xd9, 0x47, 0x16, 0x61, 0x97, 0xce, 0x84, 0x6d, 0x17, 0x06, 0x53, 0x22,\n  0x4d, 0x3d, 0x50, 0x75, 0xcb, 0xb9, 0x3d, 0x19, 0x1a, 0x30, 0xb5, 0x53,\n  0x48, 0x60, 0x83, 0x88, 0x17, 0x02, 0x88, 0xe3, 0xf9, 0xa9, 0xfa, 0xfe,\n  0x1f, 0x6c, 0x54, 0xb3, 0x60, 0xaa, 0xb1, 0x98, 0xee, 0xac, 0xb0, 0x5e,\n  0x47, 0x04, 0x3c, 0x05, 0xbb, 0xd6, 0x04, 0x33, 0xe0, 0x2c, 0x47, 0x5c,\n  0x57, 0xe5, 0xfd, 0xbf, 0xf5, 0x37, 0xde, 0xb0, 0x59, 0x8d, 0x08, 0x8c,\n  0x96, 0x44, 0x24, 0xec, 0xf3, 0x38, 0xec, 0x8a, 0xbb, 0x5c, 0x1a, 0xa5,\n  0xd5, 0x90, 0x04, 0x7a, 0x1b, 0x77, 0xb9, 0xc2, 0x76, 0xf9, 0x03, 0xc1,\n  0x07, 0xf3, 0xfb, 0xc7, 0x4f, 0x1c, 0x99, 0x0b, 0xb7, 0x7b, 0xdd, 0x4e,\n  0xc9, 0xd1, 0x5a, 0x19, 0x98, 0xfe, 0xd1, 0xbf, 0xdc, 0xfe, 0xae, 0xb7,\n  0x3c, 0xd8, 0x73, 0x3c, 0x95, 0x3b, 0x99, 0x3f, 0xb4, 0xff, 0xc4, 0xf5,\n  0x83, 0x2f, 0xa3, 0xf7, 0xee, 0x5b, 0x59, 0xd8, 0xaf, 0xd1, 0x54, 0xd5,\n  0xea, 0xf6, 0x52, 0x77, 0x57, 0xe5, 0x65, 0xf6, 0xc8, 0xb1, 0x63, 0x37,\n  0xd9, 0x2c, 0x0b, 0x0e, 0xe7, 0x5c, 0x5f, 0xef, 0xf8, 0xe0, 0x0f, 0x65,\n  0x7b, 0xd5, 0xb1, 0x61, 0x40, 0xdf, 0xa1, 0x3f, 0x49, 0xa5, 0xa8, 0x07,\n  0xab, 0x1e, 0xcc, 0x2e, 0x90, 0x1a, 0xd3, 0xc2, 0x8a, 0x69, 0x11, 0xc0,\n  0x74, 0xf0, 0x63, 0x3a, 0x70, 0x53, 0x2d, 0x88, 0x05, 0x5b, 0x2e, 0xf2,\n  0x6b, 0x89, 0x71, 0xe2, 0xbf, 0x4a, 0x8c, 0x64, 0x5c, 0x0a, 0x79, 0xdd,\n  0x76, 0x1b, 0x1c, 0x2e, 0xf1, 0x2c, 0x04, 0x84, 0xca, 0xc4, 0xb8, 0x06,\n  0x2d, 0xec, 0x7c, 0xfc, 0x6a, 0x5a, 0x7c, 0xef, 0xf3, 0xfb, 0x17, 0x22,\n  0x9d, 0xf8, 0x19, 0x71, 0x77, 0xa6, 0x32, 0x38, 0xfc, 0xdc, 0x57, 0xef,\n  0xbe, 0x0f, 0xbd, 0xf9, 0x62, 0xc7, 0xbe, 0x58, 0x7a, 0x77, 0x76, 0x69,\n  0xe5, 0xc0, 0xc9, 0xe1, 0xcf, 0xa3, 0x63, 0xbf, 0x3b, 0xb7, 0x5f, 0x2b,\n  0xf6, 0xa8, 0x55, 0xe5, 0x62, 0x57, 0xb6, 0xfc, 0x25, 0x74, 0x6c, 0xef,\n  0xbe, 0xf3, 0xc8, 0x64, 0x98, 0xb1, 0x98, 0x86, 0xab, 0x95, 0x91, 0xde,\n  0xbf, 0x92, 0x69, 0x41, 0x63, 0x9e, 0x3b, 0x88, 0x6d, 0x9a, 0xf7, 0x51,\n  0xf7, 0x56, 0xef, 0x9a, 0x43, 0xac, 0xea, 0x91, 0xc5, 0xf9, 0x19, 0x89,\n  0xe3, 0xd9, 0x3d, 0x48, 0xa3, 0x3d, 0x73, 0x1a, 0xf7, 0xd4, 0x8c, 0x44,\n  0x9a, 0x9b, 0xa2, 0x78, 0x56, 0xcb, 0xf2, 0xda, 0xcb, 0x94, 0x56, 0xc3,\n  0x6a, 0x35, 0x97, 0x28, 0x0d, 0xc7, 0x6a, 0x38, 0x58, 0x69, 0x2c, 0xaf,\n  0x62, 0x41, 0xe5, 0x14, 0x10, 0x47, 0x3c, 0x98, 0x69, 0x11, 0x28, 0x20,\n  0x32, 0x94, 0xb8, 0xd2, 0xb4, 0xfe, 0xd4, 0x3a, 0x5a, 0x5e, 0x80, 0x6f,\n  0xba, 0xff, 0xee, 0x3b, 0x6f, 0xbc, 0xfe, 0xd8, 0x91, 0xa9, 0x89, 0xfe,\n  0xbe, 0x8e, 0x72, 0x21, 0x17, 0x8f, 0x42, 0x4a, 0x42, 0x6c, 0xf2, 0xbe,\n  0x0f, 0xbd, 0x4f, 0x4f, 0x16, 0xa1, 0x7c, 0xbc, 0x2d, 0xeb, 0xa5, 0xa0,\n  0x0f, 0x28, 0x62, 0x0d, 0xcb, 0x2c, 0xfc, 0x5f, 0x86, 0x9f, 0x10, 0x94,\n  0x6c, 0x8a, 0x98, 0xff, 0x92, 0x8a, 0x44, 0xd3, 0x23, 0x62, 0x4d, 0x8e,\n  0xa0, 0x95, 0x39, 0xaf, 0xa2, 0xf4, 0xf9, 0x19, 0xa5, 0x02, 0x89, 0x2a,\n  0x29, 0x3b, 0xea, 0x7b, 0x40, 0x65, 0x99, 0x1b, 0xc7, 0xeb, 0x28, 0x7d,\n  0x70, 0x23, 0x51, 0x0f, 0xe3, 0x78, 0x21, 0x13, 0xa9, 0xf8, 0xee, 0x42,\n  0xc5, 0x2f, 0xe6, 0xc2, 0x11, 0x4f, 0xd0, 0xae, 0x71, 0x9b, 0x79, 0x6b,\n  0x2a, 0xd2, 0xbb, 0x32, 0x95, 0xb4, 0xb7, 0x74, 0x26, 0xd9, 0x40, 0x31,\n  0x6c, 0x6b, 0x97, 0x7a, 0xce, 0xef, 0xf1, 0x1a, 0x4a, 0x9d, 0xf1, 0x88,\n  0x47, 0x9a, 0xac, 0x26, 0x0d, 0x9c, 0x2a, 0xd0, 0x39, 0xdb, 0x56, 0xec,\n  0x8a, 0x77, 0x75, 0x5a, 0x3a, 0xde, 0xbb, 0x27, 0x31, 0xe8, 0x75, 0xbb,\n  0x55, 0x2a, 0x83, 0xaa, 0x35, 0x5e, 0x9e, 0x4f, 0x88, 0xd1, 0x98, 0x3b,\n  0x3d, 0xb6, 0x23, 0xee, 0x0b, 0x6a, 0x35, 0x99, 0x9c, 0xd6, 0x9a, 0xf1,\n  0x7b, 0x74, 0xee, 0xb2, 0xc7, 0xec, 0xd0, 0x1a, 0x39, 0x5d, 0x08, 0x9b,\n  0xde, 0x21, 0x95, 0xd1, 0xc1, 0x59, 0x73, 0x92, 0xda, 0x9a, 0xab, 0x24,\n  0x42, 0x76, 0xce, 0xa0, 0xf2, 0xef, 0xb9, 0x43, 0xed, 0xcf, 0xe6, 0xad,\n  0x89, 0x32, 0x8a, 0x19, 0x82, 0x5e, 0x06, 0x4e, 0xd1, 0x59, 0x97, 0xd7,\n  0x3a, 0xff, 0xc0, 0x72, 0x66, 0x61, 0x25, 0xcf, 0x47, 0xb3, 0x16, 0x15,\n  0xef, 0x94, 0x4c, 0xea, 0x48, 0x69, 0xa4, 0x25, 0x99, 0xc8, 0xee, 0x38,\n  0xdd, 0x67, 0xcc, 0x79, 0xa3, 0x73, 0x23, 0xa9, 0x62, 0x31, 0x35, 0xde,\n  0x95, 0xd0, 0x84, 0xb2, 0x1a, 0xb5, 0x96, 0x37, 0xd1, 0x3c, 0x63, 0xed,\n  0x4f, 0xb6, 0x8e, 0x15, 0xcd, 0x8c, 0x35, 0xd2, 0x99, 0x8c, 0xcf, 0x0f,\n  0xb7, 0xb8, 0x22, 0x46, 0x31, 0xdd, 0x13, 0x32, 0x69, 0x5b, 0x0a, 0x1e,\n  0xaf, 0xab, 0xb3, 0x14, 0x99, 0x2f, 0xfb, 0xfd, 0x00, 0x30, 0xc1, 0xa9,\n  0x0d, 0x02, 0x4b, 0xab, 0xbb, 0x76, 0xe5, 0x6d, 0x05, 0xb3, 0x7b, 0xe6,\n  0xf0, 0x0d, 0xfd, 0xc6, 0xa4, 0xa9, 0x7a, 0xbc, 0x17, 0x5c, 0x26, 0x7f,\n  0xb5, 0xf1, 0x1a, 0xdb, 0x45, 0xff, 0x33, 0xb6, 0x08, 0x9f, 0xa0, 0x2e,\n  0x55, 0x2f, 0x2e, 0x22, 0x5e, 0x5b, 0x89, 0xd3, 0x02, 0xd7, 0x8d, 0x58,\n  0xe1, 0xbe, 0x15, 0x0f, 0x83, 0x58, 0x3f, 0xa2, 0xc5, 0x73, 0x66, 0xac,\n  0x4a, 0xf2, 0x53, 0x24, 0x6f, 0x95, 0x48, 0x5f, 0xc6, 0x53, 0x44, 0xcb,\n  0xab, 0xb4, 0xeb, 0x10, 0x55, 0x83, 0x1f, 0xbf, 0x8e, 0x25, 0x32, 0x8b,\n  0x59, 0xce, 0x7a, 0x7d, 0xb1, 0xe0, 0xb5, 0x07, 0xb3, 0x44, 0x4d, 0x1c,\n  0x6c, 0x35, 0xf5, 0x69, 0xf2, 0x9e, 0x77, 0xdf, 0x79, 0xc7, 0xad, 0xb7,\n  0x5c, 0x7f, 0xe1, 0xd0, 0xc1, 0x99, 0xa9, 0x81, 0x6a, 0x47, 0x7b, 0x26,\n  0xa5, 0x4c, 0x93, 0x87, 0xd1, 0xc3, 0xcd, 0xd3, 0x24, 0x7f, 0xf5, 0x34,\n  0x21, 0x6a, 0x26, 0x5d, 0x06, 0x5f, 0x38, 0x3d, 0xa3, 0xcc, 0x0a, 0x85,\n  0x67, 0x2b, 0xfa, 0x27, 0xb9, 0x43, 0xce, 0x38, 0x08, 0x61, 0x31, 0x78,\n  0xb0, 0x61, 0x76, 0x31, 0xf2, 0xa3, 0x78, 0x59, 0xe5, 0xb4, 0xf1, 0x84,\n  0xef, 0x97, 0x0b, 0x7a, 0x56, 0x41, 0x27, 0x52, 0x54, 0xd1, 0xf6, 0xf6,\n  0x4d, 0x19, 0x80, 0x2f, 0xbd, 0xbb, 0xb3, 0xdf, 0x2b, 0x34, 0x66, 0x88,\n  0xe0, 0xc8, 0xa5, 0x3a, 0x26, 0x7a, 0x23, 0x7d, 0x73, 0x2e, 0xbd, 0xb1,\n  0x63, 0x34, 0xa1, 0x09, 0xce, 0xf6, 0x39, 0xbb, 0xbb, 0x0b, 0x46, 0x9b,\n  0xcb, 0xee, 0xb5, 0xb3, 0x6a, 0xeb, 0xc0, 0x54, 0x54, 0x6f, 0xef, 0xe8,\n  0xe9, 0x72, 0xba, 0xac, 0x2c, 0x67, 0x32, 0xba, 0x45, 0x31, 0x37, 0x38,\n  0x39, 0xe6, 0x17, 0x83, 0x99, 0x70, 0xd0, 0x1a, 0xcd, 0x06, 0xa3, 0x7b,\n  0x8f, 0x1c, 0x4a, 0x85, 0xa3, 0xc5, 0xd3, 0xcb, 0x96, 0x56, 0xb7, 0x37,\n  0x13, 0x34, 0x21, 0x8d, 0xde, 0x90, 0x6a, 0x4b, 0x87, 0x04, 0xab, 0x20,\n  0xb5, 0x16, 0x0b, 0xb6, 0x50, 0x57, 0x2a, 0x72, 0x1a, 0x6b, 0xbe, 0x86,\n  0xca, 0xca, 0x2d, 0xb4, 0x46, 0xef, 0xf3, 0x4a, 0x33, 0xc3, 0x69, 0x87,\n  0x41, 0x6c, 0x1d, 0xcd, 0x3a, 0x5a, 0xc4, 0x78, 0x7b, 0xab, 0x3a, 0x51,\n  0x8e, 0xcb, 0x53, 0x45, 0x34, 0xb2, 0x6e, 0x9f, 0x7d, 0xf0, 0xa6, 0x69,\n  0x47, 0xbf, 0x57, 0x6f, 0xc9, 0xa6, 0x75, 0xec, 0xe0, 0xc3, 0xd3, 0xf6,\n  0xb6, 0x16, 0xb7, 0xc7, 0xaa, 0x4b, 0xa4, 0x82, 0x1c, 0xcd, 0x65, 0x67,\n  0x0b, 0x1a, 0x7f, 0xb5, 0x1c, 0xb6, 0x39, 0x58, 0xd1, 0xef, 0x70, 0x04,\n  0x55, 0xa2, 0x3f, 0x5f, 0xe9, 0xf3, 0xea, 0xc2, 0x43, 0x73, 0x87, 0xfb,\n  0x35, 0x06, 0x71, 0xe8, 0xee, 0x93, 0x55, 0x29, 0xe4, 0xd9, 0x7b, 0x28,\n  0xaa, 0x32, 0xa9, 0x7b, 0x6e, 0x3a, 0x3c, 0xa4, 0xe1, 0x75, 0x9e, 0x44,\n  0x3a, 0xa2, 0x12, 0x13, 0xb9, 0x8c, 0xaf, 0x7b, 0x20, 0x79, 0x71, 0x38,\n  0xcc, 0xaa, 0xb8, 0xc2, 0xc9, 0x7d, 0x9d, 0xe8, 0x03, 0x9c, 0x46, 0x6b,\n  0xa8, 0x4e, 0x8f, 0xbb, 0x4c, 0x46, 0xcb, 0xe0, 0x68, 0x64, 0x8e, 0x52,\n  0xe6, 0x0b, 0xc3, 0x61, 0x7d, 0xae, 0x97, 0x9a, 0x85, 0x73, 0x82, 0x21,\n  0x6c, 0xcd, 0x64, 0x10, 0xe2, 0x5d, 0x24, 0xa1, 0x19, 0xc5, 0x73, 0x98,\n  0xd3, 0xa2, 0xcb, 0x90, 0x1d, 0x8e, 0x07, 0x3f, 0xa3, 0x06, 0xf3, 0x6c,\n  0x30, 0x0d, 0x41, 0x11, 0xda, 0xc5, 0x02, 0x1c, 0xc8, 0xdb, 0xad, 0x06,\n  0x1d, 0x9e, 0x00, 0xbd, 0xa8, 0x57, 0x75, 0xf5, 0x04, 0x50, 0xbc, 0x60,\n  0xc8, 0x04, 0x50, 0xf4, 0x31, 0xcc, 0x08, 0x6c, 0xf2, 0x3a, 0x86, 0xf1,\n  0xc7, 0x56, 0x09, 0xd1, 0xd8, 0xf4, 0x98, 0x89, 0x30, 0xe5, 0x3a, 0x03,\n  0xb1, 0xbf, 0xbb, 0xd4, 0x17, 0x20, 0x0b, 0x5c, 0x72, 0x78, 0x1d, 0xa6,\n  0x7c, 0x3e, 0x35, 0xd4, 0xe3, 0xcf, 0x74, 0x79, 0xbb, 0xef, 0x3b, 0xdb,\n  0x7f, 0xb9, 0x5c, 0xe8, 0x6f, 0x6b, 0x0b, 0x72, 0x66, 0x21, 0xdc, 0x97,\n  0xe4, 0xcc, 0x9c, 0x36, 0xd4, 0x5f, 0xf2, 0x1d, 0xbc, 0xfb, 0x36, 0xff,\n  0xe0, 0xdc, 0x6a, 0x8f, 0xab, 0xcb, 0xd1, 0x73, 0x6e, 0xb9, 0xe0, 0x89,\n  0x8b, 0xa1, 0x7c, 0xde, 0x48, 0x48, 0x1e, 0xd0, 0x19, 0xb4, 0xb1, 0x40,\n  0x69, 0x5f, 0xb7, 0x58, 0x1a, 0x0c, 0x74, 0x9c, 0x3a, 0x92, 0x74, 0x38,\n  0x0c, 0x4c, 0xe5, 0xc4, 0xdb, 0x56, 0x0c, 0x71, 0x83, 0x98, 0x1a, 0x2d,\n  0xe1, 0xb1, 0x34, 0xf9, 0xed, 0x9d, 0x5d, 0x39, 0x7d, 0xe7, 0xfa, 0xc0,\n  0xbf, 0x75, 0xdf, 0x75, 0xf9, 0x42, 0x8a, 0x35, 0xa8, 0x6c, 0xd3, 0x87,\n  0xd7, 0xdb, 0x22, 0x31, 0xb3, 0xec, 0x23, 0xaa, 0xc1, 0xf4, 0x8a, 0x61,\n  0x5e, 0x3c, 0x45, 0xed, 0xc6, 0xb2, 0xe3, 0x44, 0x75, 0xcd, 0x8b, 0x58,\n  0x26, 0xe9, 0xc3, 0x3a, 0xd1, 0x20, 0x42, 0xf4, 0xfe, 0x89, 0x6e, 0x91,\n  0xe5, 0x45, 0x88, 0x9f, 0x64, 0x61, 0x9b, 0xff, 0x32, 0x87, 0x18, 0x70,\n  0x2b, 0x63, 0xc8, 0x5a, 0x12, 0x79, 0x24, 0xae, 0x6b, 0xd5, 0x34, 0x6c,\n  0xcc, 0xaf, 0xc0, 0x5f, 0xc8, 0xd9, 0xa9, 0xa1, 0xf1, 0xaa, 0x9b, 0xdf,\n  0xbb, 0x07, 0x51, 0x87, 0x0e, 0xee, 0x59, 0xdb, 0xbb, 0xb6, 0xb4, 0x73,\n  0x6c, 0xa4, 0xaf, 0xa7, 0x2d, 0x0b, 0xae, 0x0d, 0x26, 0x23, 0xb6, 0xdb,\n  0xa6, 0xd0, 0x94, 0x4e, 0xd6, 0x7c, 0xea, 0x1c, 0x90, 0x90, 0x0e, 0xfc,\n  0xf2, 0x8b, 0xa0, 0xcb, 0x90, 0xac, 0x4c, 0xf2, 0xea, 0x22, 0x56, 0x99,\n  0x4c, 0x45, 0xd9, 0xb2, 0x93, 0x8d, 0x0d, 0x79, 0x37, 0x1f, 0xdb, 0xcf,\n  0xc0, 0xa1, 0x15, 0x3d, 0x16, 0x81, 0xe7, 0x48, 0xdd, 0x35, 0xe9, 0xa1,\n  0x70, 0x77, 0xb4, 0x27, 0x1a, 0x5b, 0x4c, 0x9a, 0x02, 0x16, 0x56, 0xcd,\n  0x0e, 0xec, 0x48, 0x19, 0x8a, 0x7b, 0x6e, 0xa8, 0x66, 0x32, 0x6c, 0x26,\n  0xd9, 0x75, 0x78, 0x3c, 0x11, 0xc4, 0x96, 0xba, 0xa7, 0x67, 0x68, 0x6a,\n  0x31, 0x93, 0x8a, 0xb5, 0xee, 0x3c, 0x3f, 0x68, 0x71, 0x8d, 0x26, 0x42,\n  0x15, 0x67, 0x68, 0x6c, 0xc0, 0x69, 0x32, 0xf7, 0xef, 0xcc, 0xc7, 0x86,\n  0x83, 0xa9, 0x25, 0x34, 0x30, 0x50, 0x09, 0xf4, 0xa5, 0x5d, 0x96, 0x28,\n  0xd6, 0xdd, 0x6a, 0x37, 0xa7, 0x3b, 0x6d, 0x91, 0xf1, 0xa4, 0xa7, 0x18,\n  0x29, 0x88, 0x96, 0xa8, 0x5b, 0x0a, 0x06, 0x6d, 0xee, 0xb1, 0x94, 0x68,\n  0x11, 0x99, 0x96, 0xee, 0x5e, 0x57, 0xe9, 0xe0, 0x64, 0x4a, 0x6d, 0x56,\n  0x67, 0x67, 0x0e, 0x95, 0xd2, 0x1d, 0x41, 0x1d, 0x5d, 0xb9, 0xfd, 0xfc,\n  0xee, 0x62, 0x4b, 0x20, 0xb2, 0x76, 0x6a, 0xaf, 0xab, 0x30, 0xb8, 0xe2,\n  0x33, 0x39, 0x63, 0x43, 0x19, 0x41, 0x9a, 0x2e, 0xba, 0xcc, 0x4e, 0x0b,\n  0x1a, 0xf0, 0x96, 0x3c, 0x4b, 0x47, 0xdb, 0x1c, 0x9e, 0xa1, 0xf3, 0x0f,\n  0xd5, 0x7e, 0xcb, 0xe7, 0xb5, 0x87, 0xed, 0x1e, 0xbb, 0x57, 0x4f, 0xc6,\n  0x03, 0xe2, 0x58, 0x7f, 0x97, 0xec, 0x6b, 0x83, 0xd7, 0x7a, 0xa9, 0x9a,\n  0xa7, 0xb0, 0xf1, 0x41, 0x43, 0x28, 0xe3, 0x1a, 0x9c, 0x94, 0x23, 0x76,\n  0x89, 0x27, 0x5e, 0xe2, 0x2a, 0x86, 0xc6, 0x5f, 0x67, 0x29, 0xaa, 0x8e,\n  0x7a, 0xaf, 0x6c, 0x6f, 0xa9, 0x79, 0x70, 0x56, 0x27, 0x09, 0x9c, 0x4c,\n  0x71, 0xc8, 0xc3, 0x8e, 0x7f, 0x56, 0xe9, 0xd1, 0x8f, 0xfc, 0xf8, 0xe6,\n  0xc1, 0x41, 0xf4, 0xf8, 0xe0, 0x20, 0x20, 0x54, 0xd1, 0xef, 0xbc, 0x72,\n  0xb2, 0x44, 0x1f, 0xbc, 0xf2, 0x04, 0x7d, 0x90, 0x9c, 0xf1, 0xc1, 0x9a,\n  0xd9, 0x8f, 0xe7, 0xc0, 0xe3, 0xc0, 0x61, 0x6f, 0x45, 0x82, 0xe6, 0xd2,\n  0xc5, 0x9b, 0xa7, 0x59, 0xb5, 0x70, 0x8f, 0x13, 0x5b, 0xbc, 0xef, 0x42,\n  0x1c, 0xdb, 0x83, 0xb4, 0x1c, 0x16, 0xc7, 0x6a, 0x81, 0x16, 0xd4, 0x98,\n  0xbb, 0x6a, 0x28, 0x41, 0xad, 0x01, 0x95, 0x84, 0x42, 0x2a, 0xc8, 0x3d,\n  0xac, 0xa2, 0x44, 0x56, 0x25, 0x82, 0xef, 0x0b, 0xa7, 0x85, 0x55, 0xa5,\n  0xe5, 0x29, 0xed, 0x0a, 0x45, 0x66, 0x05, 0x01, 0x7f, 0x62, 0x74, 0x64,\n  0x4e, 0x20, 0xea, 0xad, 0x0f, 0xdf, 0x78, 0xfd, 0xc9, 0xf5, 0x43, 0xab,\n  0xfb, 0xf6, 0xcc, 0xcf, 0x0e, 0xf6, 0x77, 0x77, 0x01, 0xd4, 0x19, 0x5e,\n  0x62, 0x1a, 0xea, 0x71, 0xf4, 0xb8, 0x9e, 0xaf, 0xfb, 0x1d, 0xca, 0x02,\n  0x31, 0xdc, 0x2c, 0x22, 0xf1, 0xd4, 0x68, 0x48, 0x48, 0xe9, 0x5a, 0xd2,\n  0x5a, 0x16, 0xd8, 0xff, 0xd7, 0xd2, 0x5a, 0x89, 0x00, 0x91, 0xab, 0x13,\n  0xe6, 0x4c, 0x9f, 0x0b, 0x44, 0x0d, 0xce, 0x90, 0x13, 0xab, 0xf7, 0x26,\n  0x8d, 0xca, 0x6d, 0x17, 0x34, 0x4e, 0x8d, 0x36, 0xdb, 0x16, 0x6e, 0x6b,\n  0x12, 0x92, 0x3b, 0xb7, 0x70, 0x61, 0x95, 0x3d, 0x13, 0xe9, 0x9d, 0x1b,\n  0x48, 0x06, 0x97, 0x7a, 0x9b, 0xc5, 0x74, 0x77, 0x35, 0x73, 0x95, 0x98,\n  0xce, 0xf4, 0xf7, 0x6d, 0x11, 0xd3, 0x9d, 0x1d, 0x67, 0x4f, 0xbb, 0x6d,\n  0x8c, 0xcb, 0xa5, 0x11, 0xb5, 0x21, 0x29, 0x68, 0xa7, 0x8d, 0x42, 0xa4,\n  0xd0, 0x2b, 0x62, 0x01, 0xeb, 0x19, 0x1e, 0xe9, 0xb1, 0xe9, 0x8d, 0x2c,\n  0xb6, 0xaf, 0xf4, 0xbc, 0x46, 0xc5, 0x38, 0xb3, 0x83, 0x99, 0xfd, 0xc1,\n  0x26, 0xe9, 0x18, 0x2b, 0x65, 0xd5, 0x57, 0x4b, 0xe9, 0xc1, 0xdb, 0x97,\n  0x07, 0x1f, 0x9b, 0xda, 0x14, 0xd2, 0xe9, 0xfe, 0x99, 0x37, 0x08, 0xe9,\n  0xf9, 0xe1, 0x5c, 0x93, 0x90, 0x76, 0xcd, 0x24, 0xab, 0xc7, 0xdd, 0xd6,\n  0x54, 0x58, 0xe5, 0x9b, 0x18, 0xb2, 0xeb, 0x6c, 0xee, 0x44, 0x32, 0xc8,\n  0xaa, 0xc5, 0x52, 0x4f, 0x7a, 0x0b, 0xfe, 0x27, 0x32, 0x00, 0xfe, 0xe7,\n  0xd5, 0x78, 0x9e, 0x4a, 0x5e, 0xce, 0x4b, 0xcc, 0x19, 0xcc, 0x03, 0xee,\n  0x27, 0xf6, 0x74, 0x7e, 0xe3, 0x35, 0x7a, 0x04, 0xf3, 0x5f, 0x37, 0x15,\n  0x04, 0x2f, 0x54, 0x88, 0x06, 0xf7, 0x7a, 0x1c, 0x66, 0x93, 0x96, 0x67,\n  0x68, 0x27, 0xa2, 0x48, 0x76, 0xef, 0x37, 0x30, 0x5d, 0x56, 0x61, 0xba,\n  0x00, 0x6e, 0x2f, 0x9f, 0x44, 0x70, 0xfc, 0xd5, 0x80, 0x77, 0x24, 0x0a,\n  0xbb, 0xee, 0x96, 0x13, 0x37, 0x11, 0x27, 0xfd, 0x4b, 0x67, 0xdf, 0x31,\n  0x3e, 0xfb, 0xf8, 0x99, 0xb6, 0x7d, 0x6d, 0xee, 0xb9, 0x9d, 0xa9, 0xc9,\n  0x40, 0xef, 0x52, 0x72, 0xb9, 0xa5, 0x75, 0xd7, 0x2b, 0x0b, 0x49, 0x71,\n  0xf7, 0x93, 0xe7, 0x4e, 0x3d, 0xb9, 0x4f, 0x6b, 0xe9, 0x08, 0x5b, 0x4c,\n  0x57, 0x5e, 0x0c, 0xe8, 0x34, 0xdd, 0xa2, 0xea, 0x56, 0xf4, 0x4f, 0x0b,\n  0xef, 0x9f, 0xbd, 0xb8, 0x65, 0x9d, 0x69, 0x48, 0xc6, 0xd0, 0xbe, 0x6a,\n  0x85, 0x46, 0x94, 0x1a, 0x72, 0x31, 0x0a, 0x00, 0x03, 0xc9, 0xe2, 0x45,\n  0x06, 0xe9, 0xd2, 0x18, 0x86, 0x5f, 0x02, 0xbf, 0x02, 0xe6, 0x80, 0xc8,\n  0xd1, 0x0c, 0xcf, 0xe0, 0xf5, 0x56, 0x3f, 0xd8, 0xde, 0xf4, 0x32, 0xe7,\n  0x65, 0xcc, 0x28, 0x05, 0xb4, 0x6c, 0x73, 0xd5, 0x7d, 0xe4, 0xc7, 0x1f,\n  0x69, 0x5a, 0x76, 0xb5, 0xcf, 0xa1, 0xae, 0x2b, 0xed, 0x68, 0x4f, 0xed,\n  0xb7, 0x37, 0x97, 0x9e, 0x8c, 0x43, 0x46, 0xff, 0x1e, 0x6e, 0x87, 0x9a,\n  0xd2, 0x41, 0x46, 0x34, 0x72, 0x60, 0xce, 0xf0, 0x0a, 0x2c, 0x32, 0x4d,\n  0xdd, 0x4b, 0x72, 0x00, 0xdd, 0x28, 0x03, 0xd4, 0x9a, 0xcc, 0x26, 0x8e,\n  0x2c, 0xef, 0x02, 0xf1, 0x0f, 0x45, 0xa6, 0x68, 0x09, 0xd9, 0x56, 0xa7,\n  0xd0, 0x5f, 0x95, 0xa6, 0x6b, 0x5d, 0xe8, 0xdb, 0xb5, 0x30, 0x7e, 0x8b,\n  0x1d, 0xfd, 0x0b, 0x7e, 0xcb, 0xbf, 0xd6, 0x6c, 0xa5, 0x43, 0xa8, 0x46,\n  0xf6, 0x6e, 0x59, 0xf2, 0x8e, 0xbd, 0x8d, 0xbe, 0x12, 0x84, 0x2c, 0x97,\n  0x95, 0xe6, 0x20, 0x71, 0x02, 0x85, 0x3b, 0xca, 0x51, 0x04, 0x91, 0x0e,\n  0x31, 0x1c, 0x04, 0x5a, 0xd0, 0x34, 0xb3, 0x44, 0x52, 0x4c, 0x09, 0x08,\n  0xeb, 0x54, 0x57, 0x75, 0x38, 0x1a, 0xc2, 0xf3, 0x0a, 0xf8, 0x8b, 0xac,\n  0xb8, 0x48, 0x72, 0x6f, 0x2d, 0xf0, 0x03, 0x9a, 0x6d, 0x7c, 0x15, 0x31,\n  0x97, 0x6f, 0x1e, 0x38, 0xd9, 0x7b, 0x18, 0x77, 0xfb, 0xe6, 0x07, 0x1e,\n  0xf8, 0x74, 0xa4, 0x75, 0x81, 0xfe, 0xfc, 0xe9, 0x3d, 0xbd, 0x07, 0xda,\n  0x6b, 0x5f, 0xc6, 0xdd, 0xae, 0x7d, 0x11, 0xe5, 0x6a, 0xdf, 0x35, 0x55,\n  0x2b, 0x27, 0xbd, 0x72, 0x1c, 0xf7, 0x2e, 0x86, 0xc2, 0x73, 0xc5, 0x48,\n  0x79, 0xa8, 0x30, 0x95, 0xa4, 0x5a, 0x41, 0x62, 0x47, 0xa4, 0xb0, 0x17,\n  0x40, 0x74, 0x54, 0x0c, 0x9b, 0x36, 0xd0, 0x80, 0xdf, 0x54, 0xf7, 0xc5,\n  0x51, 0x11, 0xdf, 0x55, 0x8e, 0xa1, 0xb0, 0xea, 0x4f, 0xd3, 0xdc, 0x12,\n  0x89, 0x54, 0x84, 0xfd, 0x67, 0x7a, 0xd6, 0x6c, 0xa2, 0xa8, 0xd6, 0x6c,\n  0xaa, 0xc5, 0x69, 0x37, 0x79, 0xcc, 0x1e, 0xf0, 0xa5, 0x8d, 0x62, 0x4e,\n  0xe8, 0x4c, 0x71, 0xf1, 0x2d, 0xf8, 0x42, 0x82, 0x23, 0x9a, 0x87, 0x74,\n  0x1f, 0x52, 0x18, 0x4f, 0xa5, 0x28, 0xd1, 0xc5, 0xe3, 0xc8, 0x24, 0x07,\n  0x7c, 0x14, 0x00, 0xf1, 0x15, 0x7d, 0xf7, 0xe4, 0x7b, 0xde, 0x37, 0xf9,\n  0xf6, 0xd3, 0x27, 0x1f, 0x99, 0xdc, 0x33, 0xfe, 0x52, 0xed, 0xfe, 0xe9,\n  0xb2, 0xb7, 0x3f, 0x36, 0xd3, 0x51, 0x46, 0x42, 0x26, 0x9b, 0xc9, 0xd6,\n  0x1e, 0xca, 0x66, 0x32, 0xe8, 0xc8, 0x6d, 0xbf, 0xa5, 0x4b, 0x18, 0x7e,\n  0xff, 0x09, 0xd5, 0x67, 0x9e, 0x3c, 0xf3, 0xa1, 0xbd, 0x7b, 0x7f, 0xfb,\n  0xcc, 0xdd, 0x1f, 0x8c, 0x7d, 0xf6, 0x4b, 0x1e, 0x7a, 0x4c, 0xaf, 0xf7,\n  0x5d, 0xf9, 0x53, 0x6f, 0x5f, 0xf2, 0xee, 0x9d, 0x3b, 0xef, 0x4a, 0xd6,\n  0x28, 0x54, 0x4b, 0xde, 0xb5, 0xb0, 0x78, 0x77, 0xed, 0xf5, 0x4b, 0x2c,\n  0x78, 0x45, 0xe0, 0xfe, 0xc2, 0x38, 0x3c, 0x87, 0xc7, 0x01, 0xa2, 0x41,\n  0x6c, 0x94, 0x97, 0x0a, 0x51, 0xdf, 0x94, 0x77, 0x53, 0x35, 0x5e, 0x3b,\n  0xcd, 0x73, 0xd8, 0x2a, 0xe4, 0x49, 0x78, 0xaf, 0xd8, 0x74, 0x49, 0x0d,\n  0x97, 0xb6, 0x54, 0x00, 0x27, 0x56, 0x35, 0xb1, 0x11, 0xc1, 0xfe, 0x01,\n  0xe7, 0x07, 0x70, 0x39, 0xa5, 0x59, 0x9e, 0xc6, 0x14, 0x22, 0x12, 0x42,\n  0x4e, 0x26, 0x2b, 0xca, 0x12, 0x42, 0x79, 0x5e, 0x9a, 0xa2, 0xd5, 0xac,\n  0x9a, 0xbe, 0xd0, 0x74, 0x13, 0x85, 0x25, 0xb6, 0x7a, 0xfb, 0x7b, 0x7e,\n  0xd3, 0x87, 0xaf, 0xac, 0x54, 0x9d, 0x14, 0x15, 0x0a, 0xfa, 0x7d, 0x10,\n  0x13, 0x00, 0xf3, 0x04, 0x52, 0x6e, 0x99, 0xec, 0x21, 0x8d, 0x2c, 0x86,\n  0x64, 0x55, 0xd9, 0x22, 0x31, 0x57, 0x4d, 0x94, 0x58, 0x1c, 0xf2, 0xbe,\n  0x0b, 0x64, 0xba, 0x0c, 0xf6, 0x7c, 0xe7, 0x33, 0x9f, 0x4a, 0x35, 0x26,\n  0x4c, 0x4b, 0x72, 0x68, 0xe2, 0x0f, 0xfd, 0x01, 0xfa, 0xf3, 0x87, 0xf7,\n  0x0c, 0xec, 0x73, 0xd4, 0x7e, 0x1f, 0xf5, 0xd4, 0x3e, 0x03, 0x53, 0xe7,\n  0x5b, 0x48, 0xaa, 0xfd, 0xc4, 0x54, 0xa9, 0x94, 0x3b, 0x75, 0x57, 0x3e,\n  0x8c, 0x2c, 0xbc, 0x9c, 0x9a, 0x99, 0xc2, 0x0d, 0xa5, 0x67, 0x95, 0xf5,\n  0x43, 0x90, 0x1f, 0xe0, 0xa0, 0x97, 0x9e, 0xa4, 0x00, 0x06, 0x15, 0x2f,\n  0x69, 0x70, 0x50, 0xc1, 0x93, 0x79, 0x49, 0xc6, 0x4f, 0xe1, 0xb1, 0xcd,\n  0x0d, 0x6b, 0x18, 0x56, 0x99, 0x82, 0xf8, 0x2c, 0xf0, 0xcd, 0x88, 0xcf,\n  0xd1, 0x02, 0x92, 0x62, 0xe8, 0x4c, 0xed, 0x29, 0x5a, 0x5d, 0x7b, 0x37,\n  0xda, 0x57, 0xf3, 0x8d, 0xa3, 0x13, 0xa3, 0xf8, 0xed, 0xa5, 0xd2, 0x95,\n  0x27, 0x4a, 0x25, 0x79, 0xcd, 0xb2, 0x54, 0x04, 0xbf, 0xf3, 0x79, 0xe5,\n  0x9d, 0x36, 0x3c, 0x77, 0x3b, 0xaa, 0x25, 0x8f, 0x19, 0xb6, 0x57, 0xf1,\n  0x7a, 0xe2, 0x88, 0x13, 0x2c, 0xbc, 0x16, 0xb7, 0x63, 0x49, 0x3e, 0xae,\n  0xe1, 0xc1, 0x7b, 0x14, 0xbf, 0xd6, 0x66, 0x31, 0xea, 0x95, 0x57, 0xab,\n  0x42, 0x02, 0xef, 0x00, 0x1c, 0x62, 0x65, 0x21, 0xc5, 0x0b, 0x98, 0x48,\n  0x85, 0x7c, 0xd9, 0x02, 0xa9, 0x3b, 0xc8, 0x52, 0x8a, 0x3c, 0x7a, 0xe5,\n  0xce, 0x47, 0x56, 0x9f, 0xbb, 0xff, 0xb3, 0x83, 0x77, 0x0e, 0xaa, 0x17,\n  0xf7, 0x8c, 0x9e, 0xcf, 0x4d, 0x9e, 0xf8, 0xe3, 0xfe, 0x81, 0x28, 0xfd,\n  0xf9, 0x07, 0xdf, 0x76, 0xdb, 0x5f, 0x9e, 0x25, 0x4c, 0x24, 0x4c, 0x7b,\n  0xa4, 0x2b, 0x2f, 0x17, 0x9e, 0xd8, 0x7f, 0xb0, 0xa3, 0xce, 0x4b, 0x00,\n  0x6f, 0x92, 0xc3, 0x2f, 0x48, 0x57, 0x93, 0xb8, 0xa9, 0x08, 0xf0, 0xba,\n  0x9b, 0x17, 0x35, 0xa7, 0x2c, 0x6a, 0xe2, 0x5c, 0x4c, 0xb2, 0xb5, 0xf1,\n  0xf2, 0x82, 0xb6, 0x85, 0xc8, 0x08, 0xad, 0xa2, 0x8f, 0xd7, 0x7e, 0x76,\n  0x33, 0xf0, 0xab, 0x12, 0xd1, 0x11, 0x88, 0x0c, 0x90, 0x7d, 0x20, 0x5e,\n  0xc2, 0xd2, 0xe2, 0x48, 0xfd, 0xac, 0x96, 0x3e, 0x49, 0xce, 0x72, 0x65,\n  0x1f, 0x09, 0xef, 0xc6, 0xff, 0xa6, 0x8f, 0xd2, 0x5f, 0xc7, 0xd7, 0x4f,\n  0x51, 0x37, 0x56, 0xaf, 0x0b, 0xf8, 0xb1, 0x7e, 0xa8, 0x42, 0x1a, 0xee,\n  0xc4, 0x91, 0x0a, 0x23, 0x6a, 0x76, 0xcc, 0xd3, 0x82, 0x8a, 0x6d, 0xac,\n  0x62, 0xcc, 0x7b, 0x69, 0x8e, 0x21, 0x27, 0x46, 0x1a, 0x91, 0xd3, 0xac,\n  0xeb, 0x90, 0x88, 0xa7, 0x98, 0xc8, 0xaf, 0x03, 0x55, 0x04, 0xb5, 0x0a,\n  0x8c, 0x35, 0x8a, 0xec, 0xfd, 0x13, 0x8f, 0x69, 0x81, 0x9a, 0x3f, 0x7c,\n  0x08, 0x51, 0xeb, 0xc7, 0x0f, 0x9d, 0x3a, 0x7c, 0x6a, 0xf7, 0xf2, 0xcc,\n  0xd4, 0xc8, 0x50, 0x57, 0x47, 0x21, 0x8f, 0x15, 0xb7, 0x88, 0xcb, 0x61,\n  0xd4, 0x53, 0xab, 0x68, 0x55, 0xbf, 0xa9, 0x4d, 0xb6, 0x37, 0xd2, 0x36,\n  0xc9, 0x42, 0x5d, 0x31, 0xa4, 0x1a, 0x7b, 0x66, 0xa5, 0x06, 0x96, 0xa4,\n  0x0c, 0x73, 0x05, 0x7a, 0xa4, 0xac, 0x96, 0x17, 0xf2, 0x0d, 0x9b, 0x0d,\n  0xf6, 0x42, 0x36, 0x99, 0x86, 0x9e, 0x26, 0xb9, 0x95, 0x21, 0x68, 0xc8,\n  0x6e, 0xff, 0xc7, 0x9e, 0x95, 0xb6, 0xe1, 0xf3, 0x83, 0x3a, 0x5f, 0xf7,\n  0xd1, 0xbe, 0xb6, 0x4a, 0x58, 0xe7, 0x6c, 0x8b, 0x86, 0x23, 0x52, 0x86,\n  0xb3, 0xc4, 0xdd, 0x96, 0x70, 0x2e, 0x94, 0xb5, 0xb6, 0x4e, 0xa6, 0x78,\n  0x4f, 0x49, 0xf2, 0x9a, 0x2c, 0x9d, 0x36, 0xa9, 0xbf, 0xe0, 0x0f, 0x16,\n  0xbc, 0x89, 0xe9, 0xbe, 0x58, 0xc4, 0xe3, 0xab, 0x48, 0xbc, 0x99, 0xa5,\n  0xa3, 0x7d, 0x89, 0xa8, 0xa4, 0x49, 0x0c, 0x2f, 0x5f, 0x0c, 0x46, 0x35,\n  0x6a, 0xbb, 0xca, 0x18, 0x14, 0x8a, 0x7b, 0xbb, 0x7b, 0x8e, 0x8f, 0xa8,\n  0xf5, 0xc5, 0x96, 0xcc, 0x8e, 0x12, 0x98, 0xde, 0x8e, 0xae, 0x64, 0xd2,\n  0xe7, 0xab, 0x98, 0x45, 0x63, 0x5b, 0xd0, 0xeb, 0x2a, 0x17, 0xd2, 0x05,\n  0x7b, 0xfb, 0xea, 0xa0, 0xc3, 0x84, 0xd4, 0x66, 0x83, 0x51, 0xb4, 0xda,\n  0xc4, 0xf2, 0xcc, 0xee, 0xd6, 0x52, 0xc9, 0x1c, 0x68, 0x1f, 0x4b, 0x44,\n  0xe3, 0xed, 0x2b, 0x25, 0xd6, 0x1c, 0x31, 0x27, 0x06, 0x12, 0x52, 0x46,\n  0x9f, 0x99, 0xed, 0x0a, 0xa1, 0x87, 0x44, 0x95, 0x0e, 0x42, 0x78, 0x2c,\n  0x7a, 0xc5, 0x1e, 0x9a, 0xa3, 0xff, 0x9e, 0x2a, 0x53, 0xf7, 0x50, 0x8f,\n  0x55, 0xdf, 0x69, 0xb5, 0x60, 0x45, 0xbe, 0xad, 0x15, 0x4f, 0x82, 0x43,\n  0x48, 0xc3, 0x5c, 0x8f, 0xd9, 0xe9, 0x4e, 0x24, 0x88, 0xb7, 0xae, 0x2c,\n  0x33, 0x2a, 0x61, 0x12, 0xe1, 0x59, 0x31, 0x75, 0x0c, 0x92, 0x79, 0x50,\n  0x1a, 0x86, 0x63, 0x34, 0xdc, 0x65, 0x4a, 0x4b, 0x89, 0x94, 0x16, 0x36,\n  0x40, 0x05, 0xfc, 0x1f, 0x8e, 0x68, 0xb0, 0x11, 0xc0, 0x82, 0xe6, 0xc7,\n  0x68, 0x68, 0x06, 0x8f, 0xa1, 0x0e, 0x51, 0x5a, 0x8e, 0x82, 0x31, 0x53,\n  0xa9, 0x05, 0x3c, 0x76, 0x6a, 0x9e, 0x57, 0xaf, 0x40, 0xec, 0xe2, 0xaa,\n  0x1e, 0xf1, 0x6a, 0x7e, 0xbe, 0xb3, 0x03, 0x51, 0x77, 0x5c, 0x3a, 0x77,\n  0x66, 0xdf, 0xde, 0xf9, 0xd9, 0xf1, 0x31, 0x6c, 0x55, 0xdf, 0xd3, 0x79,\n  0x4f, 0x3c, 0xea, 0xf7, 0xba, 0x1c, 0x26, 0x83, 0x56, 0xa4, 0xca, 0xa8,\n  0x6c, 0xe0, 0x61, 0x17, 0x4a, 0x3e, 0x9a, 0x51, 0x4e, 0x0c, 0x64, 0x0d,\n  0x1f, 0x36, 0xbe, 0xeb, 0x07, 0x66, 0xc4, 0xfe, 0x85, 0x63, 0x1e, 0x18,\n  0x0f, 0x26, 0x0c, 0xa6, 0xc2, 0x36, 0x0a, 0x60, 0xdd, 0x10, 0x87, 0xa3,\n  0x06, 0x6c, 0x32, 0x94, 0x37, 0x6d, 0x6c, 0xc1, 0x0e, 0x26, 0x04, 0xbe,\n  0x1e, 0x06, 0x4c, 0xc4, 0xaf, 0x84, 0xe2, 0x26, 0xce, 0xdb, 0xb5, 0xf7,\n  0xf2, 0x42, 0xa1, 0x9a, 0xcd, 0x86, 0xa3, 0x92, 0xce, 0xa4, 0x8e, 0xe6,\n  0xfc, 0xb1, 0xa1, 0xc1, 0x91, 0x44, 0xfb, 0xe9, 0x95, 0x76, 0x57, 0x50,\n  0xe5, 0xcc, 0xa7, 0x25, 0x2c, 0x22, 0xf5, 0x26, 0xbd, 0xab, 0x30, 0x71,\n  0x32, 0xdb, 0x1d, 0x32, 0xb0, 0x4d, 0x26, 0x77, 0x26, 0x9e, 0x1e, 0xe9,\n  0xf1, 0x07, 0x3b, 0x76, 0xd8, 0x0d, 0xda, 0xc2, 0x44, 0xd6, 0x5b, 0xde,\n  0xd1, 0xaf, 0x8b, 0xc6, 0x1c, 0x26, 0x1f, 0x67, 0xe2, 0x68, 0x9d, 0xcd,\n  0x6b, 0xd2, 0xab, 0x47, 0x39, 0x56, 0xa3, 0xa1, 0x67, 0x34, 0x2e, 0x0b,\n  0x6d, 0x09, 0x32, 0xfe, 0x83, 0x6f, 0x46, 0x25, 0x77, 0x34, 0x22, 0x86,\n  0x76, 0x2c, 0x8c, 0xa4, 0xf0, 0x53, 0xcd, 0x7a, 0xd1, 0x9a, 0xf2, 0x63,\n  0x1d, 0x33, 0x3b, 0x7b, 0xb4, 0x3d, 0x16, 0xd5, 0x48, 0xe5, 0xfe, 0x8a,\n  0x5d, 0x74, 0x3a, 0x04, 0x5f, 0x25, 0xe4, 0x1b, 0xea, 0x8d, 0xd7, 0x3e,\n  0xed, 0x49, 0xa6, 0x24, 0x61, 0x8b, 0x7e, 0xe7, 0x09, 0xd8, 0xdb, 0xf7,\n  0x77, 0xf7, 0x0b, 0x39, 0x9f, 0xd6, 0x1c, 0x0f, 0x30, 0x5d, 0x47, 0x0f,\n  0xb4, 0x8a, 0x91, 0xdd, 0x47, 0x4b, 0xb0, 0x1d, 0xcd, 0x05, 0x22, 0x6e,\n  0x93, 0xda, 0xdf, 0x21, 0x84, 0xe3, 0x21, 0xde, 0x6e, 0x69, 0xcb, 0xe8,\n  0x19, 0x71, 0xf1, 0xde, 0x29, 0xaa, 0xae, 0xdf, 0xb3, 0x77, 0x61, 0x39,\n  0x7b, 0x91, 0xaa, 0x56, 0x7b, 0xc6, 0x46, 0x5b, 0x0c, 0x80, 0x26, 0x36,\n  0x75, 0x61, 0x4f, 0xbb, 0x8f, 0x85, 0x83, 0x4f, 0x1a, 0xdd, 0xcb, 0x00,\n  0x5e, 0x3a, 0xbd, 0x42, 0xb2, 0x27, 0x1e, 0xe2, 0x58, 0x1e, 0xaf, 0x51,\n  0x6a, 0x07, 0xa2, 0x8e, 0x1d, 0x99, 0x9e, 0x1c, 0x1a, 0xb0, 0x9a, 0x05,\n  0x8e, 0xba, 0x88, 0x2e, 0x0a, 0x7c, 0xc3, 0x2f, 0x38, 0xdf, 0xd8, 0xd0,\n  0x90, 0x57, 0x8e, 0x4c, 0x72, 0x4e, 0xd0, 0xb3, 0x02, 0x56, 0xa1, 0x65,\n  0x5d, 0x1c, 0x76, 0x39, 0xf4, 0x2c, 0x71, 0xc9, 0xad, 0xdb, 0x6c, 0xe4,\n  0xf8, 0xad, 0x97, 0x2d, 0xeb, 0xc9, 0x29, 0xdb, 0x26, 0xec, 0x0a, 0x18,\n  0xc8, 0x50, 0x9b, 0xb9, 0xab, 0x67, 0xbc, 0x90, 0x08, 0x39, 0x92, 0x59,\n  0x9d, 0xca, 0xdc, 0x12, 0x29, 0x1f, 0xd8, 0xb5, 0xd4, 0xda, 0x77, 0xdb,\n  0xba, 0x64, 0x64, 0x9d, 0x41, 0x29, 0x60, 0x67, 0x58, 0x47, 0x20, 0xe0,\n  0xe0, 0x9c, 0x9d, 0x7d, 0xbd, 0xde, 0x74, 0x4f, 0xb8, 0xe3, 0x98, 0xdf,\n  0x64, 0x6a, 0x6b, 0xcf, 0x9b, 0xb5, 0xe1, 0x48, 0xc0, 0xaa, 0x32, 0x77,\n  0xf4, 0xb9, 0xb5, 0xae, 0x6a, 0xd5, 0x1d, 0x4e, 0xb8, 0x62, 0xe9, 0xb8,\n  0xd6, 0xd0, 0x5a, 0x6c, 0x93, 0x78, 0xe3, 0xce, 0x5b, 0x46, 0x7b, 0x56,\n  0x24, 0x7f, 0xc1, 0x6a, 0xb7, 0xf2, 0xce, 0xd1, 0x11, 0x73, 0x5b, 0x5b,\n  0x84, 0x0f, 0x2d, 0xac, 0xcc, 0xf9, 0x13, 0xf3, 0x4b, 0x6b, 0xe2, 0x44,\n  0x57, 0x4b, 0xb7, 0x64, 0x75, 0x24, 0x78, 0xa4, 0x51, 0xf3, 0x61, 0x7f,\n  0xcf, 0xd1, 0x4b, 0xd5, 0x5d, 0xef, 0x38, 0xe9, 0x14, 0xc5, 0xd2, 0xd8,\n  0xcc, 0x68, 0x5e, 0x25, 0x76, 0xcc, 0xec, 0x9c, 0xf5, 0x39, 0x77, 0x1e,\n  0x3b, 0x12, 0xaf, 0xcc, 0x46, 0x2a, 0x0b, 0x66, 0xa3, 0x73, 0xe1, 0xf0,\n  0xc1, 0x98, 0x6b, 0x62, 0x71, 0xae, 0x6a, 0xd2, 0x67, 0x47, 0xc2, 0xa2,\n  0x34, 0x9e, 0x2f, 0x8f, 0xf9, 0x26, 0xe7, 0x26, 0x2b, 0x46, 0x5b, 0x67,\n  0x6f, 0x47, 0x82, 0xd7, 0x0c, 0x5f, 0x3e, 0xb2, 0xeb, 0xd1, 0x52, 0xa6,\n  0x27, 0x56, 0xb4, 0xd8, 0xf7, 0x3d, 0x76, 0xca, 0x3b, 0x32, 0x98, 0x57,\n  0x39, 0x77, 0x9f, 0x5c, 0x8f, 0xb7, 0xdf, 0x74, 0xbc, 0x9f, 0xe8, 0x9e,\n  0x22, 0xa6, 0xf5, 0x7b, 0x30, 0x9f, 0x0e, 0x62, 0x9d, 0x27, 0x4f, 0xdd,\n  0xf1, 0x8c, 0x01, 0xb8, 0xf4, 0x94, 0x8c, 0xda, 0x91, 0x50, 0x63, 0xfb,\n  0x5b, 0x60, 0xd8, 0x0b, 0x9c, 0x1c, 0xef, 0xc8, 0x42, 0xa6, 0x1c, 0xc8,\n  0x58, 0x2f, 0xef, 0xfd, 0x42, 0xc8, 0x23, 0x45, 0x63, 0xee, 0x3b, 0xe3,\n  0xa9, 0x26, 0x95, 0xaa, 0xc2, 0xe5, 0xff, 0xac, 0xee, 0x4a, 0xd5, 0xd5,\n  0xd2, 0x42, 0x51, 0x2d, 0xf9, 0x96, 0x5c, 0x26, 0x05, 0x1b, 0xc1, 0xf8,\n  0xd5, 0xc1, 0x50, 0x3a, 0x14, 0xd5, 0xe8, 0xdc, 0x29, 0x99, 0x65, 0x16,\n  0xea, 0x09, 0xc5, 0x05, 0x9b, 0xcc, 0x19, 0x15, 0x87, 0x6a, 0xbb, 0xa3,\n  0x11, 0x50, 0x6c, 0x32, 0x29, 0x9f, 0x6c, 0xac, 0x30, 0x3c, 0x66, 0x7a,\n  0xe1, 0xbe, 0x37, 0x8d, 0x0c, 0x64, 0xc6, 0x5b, 0xee, 0xbd, 0xee, 0x97,\n  0xb6, 0x80, 0x5f, 0x60, 0x3e, 0x70, 0xcf, 0xde, 0xa1, 0x85, 0x3d, 0x37,\n  0xbe, 0xf5, 0xc0, 0xc4, 0xf4, 0xe1, 0x1f, 0x68, 0x82, 0xda, 0xfe, 0x1e,\n  0xd4, 0x36, 0x7b, 0xa8, 0x6f, 0x41, 0xcb, 0x09, 0xb1, 0x91, 0x8e, 0xd5,\n  0x13, 0x68, 0xd6, 0xeb, 0x34, 0x06, 0x84, 0x67, 0xba, 0xbb, 0xba, 0x0b,\n  0xb5, 0xaf, 0xd4, 0xae, 0x4c, 0x54, 0x3a, 0x86, 0xe5, 0xf9, 0xf9, 0x93,\n  0x8d, 0x22, 0xfa, 0x37, 0x82, 0xe7, 0x22, 0xfb, 0x98, 0xd2, 0xb2, 0x8f,\n  0x29, 0x96, 0xd6, 0xe0, 0x10, 0xcd, 0xd0, 0x58, 0x23, 0x57, 0xc9, 0x19,\n  0x6b, 0x39, 0x8e, 0xc4, 0xa7, 0x9e, 0xe0, 0x20, 0xb1, 0x97, 0x75, 0x8b,\n  0x8f, 0xa9, 0x13, 0x39, 0x61, 0x43, 0xbb, 0xc9, 0xc7, 0x14, 0x92, 0xa4,\n  0x83, 0x5c, 0x2b, 0x80, 0x43, 0x3f, 0xdf, 0x6a, 0x93, 0x31, 0x72, 0x2e,\n  0x5c, 0x40, 0x0f, 0xd7, 0x9e, 0xff, 0xcc, 0x67, 0x26, 0x5f, 0x20, 0xf0,\n  0x38, 0x43, 0xe8, 0xf4, 0x34, 0x9a, 0x9e, 0xde, 0xa0, 0xa6, 0x6b, 0xef,\n  0x1c, 0x1f, 0x93, 0x75, 0x8a, 0x1c, 0x96, 0x77, 0x77, 0x60, 0x7b, 0xd8,\n  0x8d, 0x35, 0xd2, 0xbb, 0xab, 0x7a, 0x13, 0xe2, 0x39, 0x01, 0x61, 0x79,\n  0x8d, 0x58, 0x01, 0xe2, 0x9e, 0x5d, 0xc4, 0x5d, 0x9f, 0xa7, 0x04, 0x96,\n  0xc7, 0x46, 0x30, 0xc7, 0xa1, 0x55, 0xf0, 0xd5, 0x3c, 0x37, 0x8d, 0x87,\n  0x03, 0x62, 0x3e, 0x55, 0x78, 0x29, 0x9d, 0x07, 0x07, 0x91, 0x64, 0xa3,\n  0x0e, 0x4d, 0x9f, 0x98, 0x26, 0x15, 0x29, 0xa8, 0x87, 0x05, 0xf1, 0x49,\n  0xa5, 0x32, 0x1c, 0x76, 0x9f, 0x07, 0x47, 0x2c, 0x8f, 0xd7, 0x83, 0xa8,\n  0x74, 0x0b, 0x8c, 0x8d, 0xa7, 0xd5, 0xdb, 0x8a, 0x07, 0x02, 0x9b, 0x42,\n  0x60, 0x08, 0x89, 0xba, 0x86, 0x21, 0x54, 0x2e, 0x35, 0x76, 0x4c, 0x0a,\n  0xe5, 0x42, 0x53, 0xc8, 0x72, 0x71, 0x73, 0xeb, 0x9e, 0xb8, 0xeb, 0xa3,\n  0xce, 0xd9, 0x9b, 0x06, 0xf6, 0xac, 0xcc, 0x4e, 0xde, 0x71, 0x76, 0xf7,\n  0x39, 0x3f, 0xab, 0x9d, 0x19, 0xb7, 0xf0, 0xde, 0x53, 0x93, 0x27, 0xcf,\n  0x5d, 0x77, 0x66, 0x76, 0x6e, 0x69, 0x2d, 0xd9, 0xf2, 0xd5, 0x13, 0x62,\n  0xdb, 0xbe, 0x81, 0xd1, 0x3d, 0x3a, 0xc6, 0x30, 0x3f, 0xbc, 0x70, 0xb4,\n  0x2f, 0x75, 0xf0, 0x4a, 0xfb, 0x6a, 0x4b, 0xff, 0xe4, 0x8d, 0xb7, 0x5f,\n  0xb8, 0xe1, 0x74, 0x6f, 0xbe, 0x6f, 0x60, 0xe2, 0xae, 0xb1, 0x81, 0x4d,\n  0x5a, 0x80, 0x3f, 0x93, 0x15, 0xcf, 0x55, 0x6c, 0x37, 0xf0, 0x88, 0x93,\n  0xf3, 0xad, 0x6d, 0x89, 0xd3, 0x3b, 0xd7, 0x14, 0x5a, 0x88, 0xbb, 0x63,\n  0xb7, 0x21, 0x2a, 0x2a, 0x85, 0x83, 0x5e, 0xb7, 0x2d, 0x69, 0x4f, 0xea,\n  0xb5, 0x94, 0x15, 0x59, 0x55, 0xba, 0xba, 0xd3, 0xf5, 0x66, 0x37, 0x9a,\n  0x20, 0x3f, 0xe3, 0x5b, 0x3a, 0x60, 0x47, 0x03, 0x77, 0x3f, 0x0c, 0x1d,\n  0xb8, 0x7c, 0xc7, 0xf9, 0xb7, 0x8f, 0x8f, 0x3f, 0x7a, 0xe1, 0xb6, 0x1b,\n  0x6f, 0xb8, 0x65, 0x7e, 0x81, 0x34, 0x3d, 0xb7, 0x20, 0x9e, 0x59, 0x55,\n  0x9a, 0xbe, 0xe3, 0xd8, 0x9e, 0xdf, 0x3e, 0x73, 0xfa, 0xc9, 0x7d, 0x33,\n  0x8f, 0x3e, 0xf0, 0xa6, 0x47, 0x51, 0x4f, 0xa9, 0xa7, 0x7f, 0xe2, 0xae,\n  0xb6, 0x6e, 0xaf, 0x9c, 0x0f, 0x14, 0xc6, 0x10, 0xb0, 0x14, 0xd7, 0xab,\n  0x22, 0x28, 0x65, 0x41, 0x12, 0xff, 0x21, 0x8f, 0x9e, 0x47, 0x49, 0xb8,\n  0xbe, 0x0e, 0x8e, 0x34, 0x27, 0xe4, 0x58, 0x5d, 0x5e, 0xa8, 0x8f, 0x5b,\n  0xe0, 0xaa, 0x52, 0x9e, 0x3f, 0x29, 0x57, 0x11, 0xea, 0xa3, 0x65, 0x03,\n  0x47, 0x6c, 0x1f, 0x16, 0x62, 0x56, 0x33, 0x16, 0x63, 0x1a, 0x4a, 0x42,\n  0x52, 0xa3, 0x7f, 0xe5, 0x12, 0x96, 0x65, 0x72, 0x30, 0x53, 0x3d, 0x7a,\n  0x42, 0xce, 0xbf, 0x43, 0xc6, 0x0b, 0x75, 0x9d, 0xbb, 0xfc, 0xb1, 0xf6,\n  0xd9, 0xf4, 0x9e, 0xf5, 0x1b, 0x02, 0x2d, 0x5f, 0xdd, 0x33, 0xbe, 0x7e,\n  0xdd, 0xca, 0xb8, 0x19, 0x0f, 0x8e, 0xb8, 0xb6, 0xe7, 0xfd, 0x7e, 0x46,\n  0x6c, 0x99, 0x1b, 0x7c, 0xf0, 0xad, 0xcb, 0x93, 0x13, 0x0f, 0xf7, 0xf4,\n  0xdf, 0x78, 0x3b, 0x7a, 0x17, 0x19, 0x15, 0x59, 0xe7, 0x54, 0x6f, 0xbc,\n  0x4e, 0xdf, 0x45, 0xff, 0x9c, 0x78, 0x8d, 0x4b, 0x54, 0x0a, 0x32, 0xc8,\n  0x45, 0x8d, 0x1a, 0xbc, 0xf8, 0x11, 0xc1, 0x59, 0x43, 0x80, 0xb6, 0x8e,\n  0xb5, 0x25, 0x16, 0xc1, 0xc9, 0x0f, 0x03, 0x3b, 0x2f, 0x32, 0x18, 0xbe,\n  0x0c, 0xe8, 0x8d, 0xe7, 0x19, 0xd9, 0x80, 0x09, 0x06, 0x20, 0xd6, 0x03,\n  0xcf, 0x2d, 0xbc, 0x6a, 0xb0, 0xa1, 0x6d, 0x46, 0x66, 0x75, 0x9d, 0xa9,\n  0x93, 0xe3, 0x47, 0x07, 0xa4, 0xc1, 0xc0, 0x62, 0xb4, 0x8c, 0xd5, 0x51,\n  0xa4, 0x38, 0xae, 0x80, 0xe1, 0xcd, 0x58, 0x88, 0x24, 0x7e, 0xbc, 0x3a,\n  0x1f, 0x1e, 0x38, 0x5c, 0x2d, 0x0e, 0x69, 0x06, 0x3e, 0xf2, 0x81, 0x8f,\n  0xd8, 0xe3, 0x3b, 0x3e, 0x30, 0xf8, 0xe0, 0x40, 0xed, 0xfd, 0xad, 0xf3,\n  0x95, 0x10, 0x16, 0x39, 0xac, 0x9a, 0x7b, 0x78, 0x25, 0xdc, 0x13, 0x73,\n  0xaa, 0xf7, 0xee, 0x19, 0xb8, 0xfb, 0x74, 0x7f, 0x39, 0x81, 0xda, 0xaf,\n  0xa8, 0x8e, 0x16, 0xbb, 0xba, 0xe8, 0x47, 0xae, 0x1c, 0xef, 0x3d, 0x74,\n  0x36, 0x1f, 0xec, 0x8e, 0x21, 0x54, 0x9b, 0x44, 0x4f, 0xda, 0x76, 0xdd,\n  0x32, 0x95, 0xed, 0x96, 0xfb, 0xf5, 0x1a, 0xfa, 0x29, 0x1d, 0xa6, 0x1c,\n  0xd8, 0x02, 0x4c, 0xe0, 0xf5, 0x56, 0xaa, 0xe6, 0x5b, 0x12, 0x5e, 0xab,\n  0x81, 0x23, 0xea, 0x34, 0xe0, 0xf7, 0x22, 0x08, 0xc0, 0x02, 0xe9, 0x44,\n  0x62, 0x41, 0x59, 0xb0, 0x8a, 0xa1, 0x27, 0x7e, 0xb3, 0x11, 0xf7, 0xc0,\n  0x81, 0x1c, 0xdc, 0x96, 0x1e, 0x00, 0x07, 0x13, 0xc8, 0x36, 0x01, 0x96,\n  0x2f, 0x0c, 0x28, 0x05, 0xb1, 0x30, 0xf4, 0xc0, 0x41, 0x94, 0x6a, 0x6c,\n  0x37, 0xc0, 0x3c, 0x7b, 0xf9, 0xf4, 0x85, 0x96, 0x85, 0x9b, 0x67, 0xc6,\n  0x0e, 0xbe, 0xe5, 0xfd, 0xf1, 0x40, 0x36, 0xb3, 0x3f, 0xc3, 0xa5, 0x76,\n  0x8f, 0x7b, 0x8b, 0x8e, 0x28, 0xee, 0x82, 0x23, 0x65, 0xbd, 0x18, 0x49,\n  0xb6, 0xd6, 0xfe, 0x71, 0xaa, 0xb3, 0xdf, 0x2e, 0x9e, 0xde, 0x57, 0xbd,\n  0x7d, 0xad, 0xb7, 0xd2, 0x3b, 0x70, 0x44, 0xff, 0xe7, 0xa2, 0xdb, 0xde,\n  0x67, 0xb1, 0xa2, 0x22, 0xad, 0xe6, 0xfe, 0x18, 0xa9, 0x54, 0x6f, 0x31,\n  0x66, 0x02, 0x71, 0x73, 0xed, 0x14, 0x3a, 0x9b, 0xbc, 0x7f, 0x2c, 0x5e,\n  0xc1, 0x7d, 0x09, 0xe2, 0x89, 0xb7, 0x0b, 0xf3, 0x2e, 0x91, 0xc4, 0xac,\n  0xfb, 0xc0, 0xcb, 0xbb, 0xde, 0x03, 0x35, 0x38, 0x08, 0x60, 0xe5, 0x89,\n  0x5a, 0x57, 0xce, 0xe7, 0xf0, 0xb8, 0x70, 0x1c, 0xbf, 0x04, 0xa7, 0x74,\n  0x07, 0x44, 0x38, 0xfe, 0x9b, 0xb5, 0xdb, 0xb5, 0x1a, 0x19, 0x52, 0x50,\n  0x0e, 0x64, 0x37, 0x19, 0x34, 0x36, 0xad, 0x4d, 0xce, 0x15, 0xa9, 0xe1,\n  0x37, 0xcf, 0x2d, 0xeb, 0x11, 0xb9, 0xf2, 0x9a, 0x67, 0xf0, 0x88, 0x81,\n  0xf1, 0xf0, 0xf3, 0x70, 0x26, 0xdf, 0x3a, 0xd5, 0x1d, 0x30, 0xb8, 0x82,\n  0x56, 0x9b, 0xe5, 0xc5, 0xf3, 0x1f, 0xbd, 0x70, 0x66, 0x70, 0xef, 0x20,\n  0x3d, 0x17, 0x8b, 0xb6, 0x54, 0x46, 0x0b, 0xe5, 0xbc, 0xd3, 0x1e, 0xf0,\n  0x98, 0x8c, 0xa6, 0x2b, 0x97, 0x68, 0xe7, 0x95, 0x97, 0x73, 0xe8, 0x29,\n  0x4c, 0xfb, 0x8d, 0xb3, 0x1b, 0xc6, 0x46, 0x7b, 0xe3, 0x54, 0x86, 0x5a,\n  0xaa, 0x2e, 0xba, 0x11, 0x27, 0xb8, 0x10, 0x64, 0xf5, 0xdd, 0xda, 0x72,\n  0x1e, 0x5a, 0x8e, 0xd9, 0x19, 0xc7, 0xe3, 0x96, 0x73, 0x2c, 0xcb, 0xad,\n  0x10, 0x08, 0x6a, 0x11, 0x57, 0x65, 0xe7, 0x1d, 0xa4, 0xe5, 0x99, 0x74,\n  0x38, 0xe4, 0xf7, 0xda, 0xe3, 0x8e, 0xf8, 0x6f, 0xd6, 0x72, 0xd4, 0x70,\n  0xdc, 0x81, 0xe4, 0x2b, 0x7a, 0xa2, 0x36, 0x5c, 0xdd, 0x8f, 0xda, 0x97,\n  0xad, 0x09, 0xab, 0x46, 0xef, 0x33, 0x79, 0xb2, 0xe2, 0x6f, 0x7d, 0xf4,\n  0x16, 0x21, 0xda, 0xb7, 0xaf, 0xe8, 0x2f, 0xeb, 0xd6, 0x07, 0xde, 0xd0,\n  0xb1, 0x5f, 0x3d, 0x2c, 0xa8, 0x4b, 0xbc, 0x4a, 0x6a, 0xa5, 0xef, 0xb8,\n  0xf2, 0xc5, 0xe0, 0xc4, 0x60, 0xcb, 0xb4, 0xb5, 0xbf, 0x82, 0x7e, 0x46,\n  0x78, 0x18, 0x07, 0xe7, 0xd0, 0xb4, 0x93, 0x64, 0x5e, 0xcc, 0x55, 0xb3,\n  0x6e, 0xbb, 0xc8, 0xb2, 0x30, 0xbd, 0xc0, 0x36, 0xa4, 0xef, 0x83, 0xfc,\n  0x5a, 0x0c, 0xb5, 0x84, 0x48, 0x2a, 0x34, 0x70, 0x75, 0xc1, 0xe6, 0x91,\n  0xd7, 0x03, 0x60, 0x1b, 0x2e, 0x1b, 0x87, 0x8d, 0x23, 0x07, 0x28, 0x28,\n  0xa8, 0x29, 0x4f, 0x0c, 0x5e, 0x0a, 0x16, 0x88, 0x0c, 0x60, 0x24, 0x87,\n  0x9f, 0xf9, 0x5b, 0x9d, 0xc3, 0x50, 0xdb, 0xf8, 0x93, 0x4b, 0x82, 0x89,\n  0x46, 0x82, 0x9a, 0x39, 0xd4, 0xf9, 0xd7, 0x06, 0xbb, 0x16, 0x2b, 0x58,\n  0x66, 0xf1, 0xff, 0x1b, 0x3a, 0xab, 0x76, 0x7b, 0xac, 0xaf, 0x78, 0x17,\n  0xf7, 0x25, 0x69, 0x73, 0xed, 0xe7, 0xfa, 0xa8, 0x86, 0x71, 0x7a, 0x04,\n  0xa4, 0xbe, 0xf2, 0xb3, 0xc4, 0xde, 0xa5, 0x30, 0x4a, 0x6b, 0x8b, 0x7e,\n  0x34, 0xfd, 0xb2, 0xa5, 0xdc, 0x9d, 0xc3, 0x6f, 0x05, 0x3e, 0x7b, 0x05,\n  0xb7, 0xd1, 0x87, 0xdb, 0x58, 0xa4, 0xf6, 0x54, 0x97, 0xdd, 0x88, 0x07,\n  0x78, 0x1b, 0x16, 0x22, 0x1d, 0x58, 0xc4, 0x03, 0x08, 0x06, 0x8f, 0x75,\n  0x70, 0x5e, 0xc4, 0x16, 0x93, 0x9a, 0xa6, 0xb0, 0x96, 0x0d, 0xa9, 0x47,\n  0x05, 0x7a, 0x0d, 0x7f, 0x55, 0x13, 0x53, 0x49, 0x4d, 0xcd, 0x4b, 0x61,\n  0x44, 0x65, 0x33, 0x89, 0x58, 0xb8, 0x28, 0x15, 0x43, 0xc1, 0x80, 0x1f,\n  0xab, 0xd9, 0x46, 0x83, 0x82, 0x83, 0x41, 0xf9, 0x90, 0x4f, 0xd9, 0x64,\n  0x05, 0x2e, 0x0c, 0x46, 0xb9, 0x45, 0x2a, 0x97, 0x43, 0x82, 0xc4, 0x28,\n  0xe6, 0x11, 0x2c, 0x99, 0x28, 0x59, 0xf9, 0x78, 0xd9, 0x10, 0x75, 0x0d,\n  0x6a, 0x91, 0x42, 0xda, 0x57, 0x99, 0x17, 0xd9, 0xee, 0xdf, 0x3a, 0xf6,\n  0x91, 0x63, 0xd7, 0xb1, 0xb3, 0xf4, 0x2d, 0x9a, 0x53, 0xdd, 0x2c, 0xe7,\n  0x34, 0x41, 0x2c, 0x4a, 0xa5, 0x36, 0x81, 0x67, 0x1a, 0x9a, 0xd4, 0xfb,\n  0x45, 0x81, 0xcd, 0x05, 0xd4, 0x5d, 0xfd, 0x15, 0x56, 0x55, 0x10, 0x87,\n  0xbb, 0xad, 0x25, 0x3b, 0xd2, 0xd7, 0x7c, 0xe8, 0xfb, 0x66, 0xa9, 0x54,\n  0x7b, 0xd5, 0xe6, 0xd3, 0x98, 0x0d, 0xe2, 0x6d, 0x82, 0xaa, 0x1b, 0x3d,\n  0x55, 0x1b, 0x66, 0x50, 0xb4, 0xc5, 0xeb, 0x88, 0xe3, 0xf2, 0x1f, 0x59,\n  0x53, 0x8e, 0x98, 0x8c, 0x69, 0xe9, 0xc2, 0x83, 0xe5, 0xc4, 0x3c, 0xce,\n  0x0b, 0x18, 0x79, 0x3c, 0xa2, 0x95, 0x2c, 0xa3, 0xf7, 0x72, 0x2c, 0x0d,\n  0x03, 0x45, 0x81, 0x23, 0xda, 0x0a, 0x16, 0x37, 0xe0, 0x91, 0x84, 0x98,\n  0x79, 0x19, 0x6b, 0x28, 0x6a, 0x8f, 0x63, 0x1b, 0xd6, 0x0d, 0xb6, 0x34,\n  0x28, 0x95, 0x85, 0x3a, 0xcc, 0x8d, 0x80, 0xbb, 0x57, 0x8f, 0x85, 0x65,\n  0x5c, 0x37, 0x2f, 0x4b, 0x8c, 0x8a, 0xe3, 0xbd, 0xcb, 0x6d, 0x2b, 0x07,\n  0x68, 0xba, 0xbc, 0xd4, 0xce, 0x14, 0x3a, 0x76, 0x2d, 0xe8, 0xd3, 0xf4,\n  0xcf, 0xbf, 0x63, 0x89, 0x18, 0x13, 0xf1, 0xa9, 0x49, 0xd1, 0xa1, 0xad,\n  0x7d, 0x10, 0x2d, 0x99, 0x8d, 0xd9, 0xdc, 0xd1, 0xfd, 0xb5, 0x7f, 0x85,\n  0x17, 0x3b, 0x71, 0x7b, 0x62, 0xb8, 0x3d, 0x61, 0xea, 0xba, 0x67, 0x74,\n  0x88, 0x17, 0xea, 0x31, 0x50, 0x71, 0x48, 0x1c, 0x43, 0x9f, 0x53, 0xab,\n  0x68, 0xac, 0xc4, 0x02, 0x36, 0x3b, 0x66, 0x4a, 0x58, 0x05, 0x3b, 0x4e,\n  0x71, 0x82, 0x40, 0x16, 0x06, 0x84, 0xf6, 0x72, 0xc2, 0x3c, 0x6c, 0xa3,\n  0x00, 0x3c, 0xd1, 0x7f, 0x5a, 0x71, 0xa5, 0x6a, 0xc2, 0x9d, 0x09, 0x53,\n  0xe1, 0x88, 0x3d, 0x26, 0xc7, 0x80, 0xf3, 0x7e, 0xdc, 0x21, 0xa9, 0x8c,\n  0xe5, 0xbc, 0x50, 0x10, 0x24, 0xe1, 0x8d, 0xfd, 0x22, 0xdd, 0x72, 0xde,\n  0x32, 0xa6, 0x9e, 0x30, 0x2f, 0x9b, 0xff, 0x5a, 0xfd, 0x79, 0x93, 0x4a,\n  0xc3, 0x45, 0xf6, 0xf7, 0x8f, 0xcd, 0x33, 0xec, 0xe0, 0x72, 0x95, 0x3f,\n  0xb0, 0xb4, 0xdb, 0xda, 0x4e, 0x1f, 0xe8, 0xdd, 0xb3, 0xa7, 0x77, 0x21,\n  0x92, 0x48, 0xa5, 0x06, 0x47, 0x74, 0x7e, 0x53, 0xed, 0x0f, 0x51, 0x9f,\n  0xcf, 0xb3, 0x73, 0x75, 0xb5, 0xf6, 0x9a, 0xe2, 0xfb, 0xf4, 0x1a, 0xfa,\n  0x04, 0x7a, 0x1b, 0xe6, 0xbb, 0x45, 0x90, 0xed, 0x2a, 0xc4, 0x90, 0xa4,\n  0x8e, 0x10, 0xdd, 0xc3, 0xd2, 0x58, 0x5a, 0x5e, 0x6e, 0xd8, 0xec, 0x9b,\n  0xfc, 0x97, 0x53, 0xf8, 0x6f, 0xae, 0x35, 0x1a, 0x09, 0x05, 0xcc, 0x46,\n  0x2a, 0x81, 0x12, 0xfc, 0xe6, 0xd9, 0x58, 0x99, 0x18, 0x60, 0x9b, 0xb6,\n  0xb3, 0x50, 0xb7, 0xbc, 0xdb, 0x01, 0x6c, 0x29, 0x0e, 0x76, 0x1c, 0x58,\n  0x75, 0x7f, 0x16, 0xcb, 0x79, 0x35, 0x1a, 0x75, 0xda, 0xa0, 0x0a, 0x85,\n  0xf8, 0xf2, 0xfd, 0x83, 0xd1, 0x90, 0xe8, 0xe8, 0x3a, 0x36, 0x2b, 0x88,\n  0x7a, 0x93, 0x6f, 0x66, 0x87, 0x64, 0xf7, 0xef, 0xd8, 0x9b, 0xe9, 0x9e,\n  0x4a, 0x99, 0xdc, 0xae, 0x7c, 0x26, 0x2a, 0x7a, 0x92, 0x69, 0xa3, 0x37,\n  0x62, 0x2b, 0xe9, 0xc4, 0x44, 0x4c, 0xe8, 0x9f, 0x71, 0x07, 0x35, 0x8e,\n  0xae, 0xae, 0xbc, 0xc1, 0x90, 0xb0, 0x58, 0x3c, 0xa9, 0xa9, 0xd6, 0xe4,\n  0xae, 0xce, 0xff, 0x61, 0xa9, 0x54, 0x8b, 0x5a, 0x4f, 0x7e, 0x72, 0xb6,\n  0xde, 0xaf, 0x7f, 0xc0, 0xfd, 0x92, 0xa8, 0x6e, 0xc8, 0xc4, 0xa2, 0xc2,\n  0xc2, 0x11, 0xab, 0x5b, 0x74, 0xdc, 0x41, 0xf0, 0x96, 0x28, 0x9a, 0x03,\n  0x30, 0xa2, 0xcb, 0xc4, 0x61, 0x95, 0x01, 0x9b, 0x16, 0x92, 0xe6, 0xac,\n  0x0b, 0xf2, 0x99, 0xb0, 0x40, 0xce, 0x84, 0x79, 0xb2, 0x21, 0x1d, 0x8d,\n  0x20, 0xaa, 0xbd, 0x98, 0x4d, 0x47, 0xba, 0xa3, 0xdd, 0x5e, 0x8f, 0x51,\n  0x4f, 0xe4, 0xfc, 0x96, 0xbe, 0x2a, 0x2e, 0x58, 0xe4, 0x10, 0x17, 0xf0,\n  0xa4, 0xe4, 0x1e, 0xc7, 0xf3, 0xca, 0x3e, 0x44, 0x21, 0x4f, 0xc4, 0x0e,\n  0x99, 0x83, 0x98, 0x0e, 0xcf, 0x45, 0xdb, 0xe4, 0x5e, 0xcf, 0xf9, 0xa7,\n  0x16, 0x62, 0xa9, 0xac, 0xc5, 0x57, 0x08, 0x1b, 0x5b, 0x73, 0x16, 0x8b,\n  0xbd, 0xa5, 0xda, 0xe2, 0xe9, 0xf6, 0x5b, 0x92, 0x56, 0x5e, 0x15, 0x36,\n  0xeb, 0x84, 0x60, 0xca, 0xad, 0xf7, 0x4d, 0x97, 0x53, 0x9b, 0x3d, 0x3f,\n  0x10, 0x19, 0x48, 0xfa, 0x52, 0x36, 0xdf, 0xce, 0xdd, 0x51, 0xd6, 0x91,\n  0x8d, 0xd1, 0xf1, 0x5c, 0x9c, 0x71, 0x05, 0xcc, 0x76, 0x0b, 0xa3, 0x15,\n  0xad, 0x1e, 0x26, 0x77, 0x36, 0x15, 0x35, 0xef, 0x3b, 0xb9, 0x90, 0x8d,\n  0xe3, 0x3e, 0x6c, 0x7c, 0xb8, 0x76, 0x91, 0x9e, 0x47, 0x0f, 0x61, 0xdb,\n  0x62, 0x98, 0x5a, 0xa4, 0xd6, 0xaa, 0x47, 0x00, 0x4b, 0x9a, 0x8f, 0x38,\n  0xb0, 0x51, 0xcf, 0x4e, 0xca, 0xb0, 0x72, 0x0c, 0xcd, 0xd3, 0x0c, 0x8f,\n  0x69, 0xc0, 0xc3, 0x41, 0xe8, 0x65, 0x00, 0x89, 0xc4, 0x66, 0x24, 0x66,\n  0xf6, 0x1c, 0x85, 0x04, 0x0e, 0xad, 0x8b, 0x88, 0xec, 0xc2, 0xe0, 0x3f,\n  0x02, 0xd1, 0x1e, 0x04, 0x6a, 0x7e, 0x74, 0xa4, 0x58, 0x40, 0xd4, 0xc8,\n  0xe2, 0xe8, 0x62, 0x4f, 0x77, 0x61, 0xb8, 0x38, 0x9c, 0x4c, 0x48, 0xe1,\n  0x80, 0x0f, 0x53, 0x25, 0x8f, 0xf2, 0x0a, 0x97, 0x97, 0x0d, 0xbc, 0x72,\n  0xc3, 0xf3, 0xa1, 0x0c, 0xee, 0x67, 0xf2, 0x6c, 0xb0, 0x95, 0x0b, 0x8c,\n  0x82, 0xb8, 0x85, 0xed, 0x3c, 0x8b, 0x7c, 0x5e, 0x43, 0x26, 0x03, 0x0b,\n  0x52, 0x8c, 0x98, 0xef, 0x7a, 0x0e, 0x7f, 0x54, 0x87, 0x5a, 0x2c, 0xa5,\n  0x85, 0x03, 0x4b, 0xde, 0xb0, 0x2a, 0x52, 0xf0, 0x47, 0xa2, 0x7a, 0x9b,\n  0xae, 0x5f, 0x27, 0x75, 0xfb, 0xa4, 0xfd, 0x5d, 0xc9, 0x78, 0xf6, 0xc6,\n  0x17, 0xe3, 0x03, 0x59, 0xd1, 0xca, 0x15, 0x16, 0xdb, 0x67, 0xcc, 0xdd,\n  0x93, 0xcb, 0xb7, 0x87, 0x06, 0xba, 0x6d, 0xa6, 0x40, 0xd8, 0xd6, 0x96,\n  0xcb, 0x48, 0x36, 0xf3, 0x6f, 0x87, 0x4b, 0x39, 0xd7, 0xac, 0xd0, 0x3a,\n  0x30, 0xd2, 0x13, 0x0b, 0xd4, 0x2e, 0x86, 0xd3, 0xc6, 0xd0, 0x50, 0x7f,\n  0x67, 0x4a, 0x37, 0xaa, 0x0e, 0x38, 0x93, 0x1d, 0x76, 0x4f, 0x87, 0xb1,\n  0xaa, 0x8b, 0x0d, 0x85, 0x93, 0x5d, 0xa1, 0x44, 0xb5, 0xf6, 0x98, 0xa3,\n  0xab, 0xa4, 0xd3, 0xf6, 0x8d, 0x7b, 0xdf, 0x1e, 0x5f, 0x1c, 0xcf, 0xa0,\n  0xb7, 0x96, 0x17, 0xd3, 0xe1, 0x89, 0x60, 0x22, 0x35, 0x3c, 0x37, 0xd3,\n  0xad, 0xd3, 0xa9, 0x6a, 0x77, 0x65, 0x66, 0x73, 0x8f, 0x33, 0xee, 0x44,\n  0xa1, 0xbb, 0x1a, 0x0a, 0x58, 0xf1, 0x3c, 0x29, 0x6f, 0x74, 0xa1, 0x4f,\n  0x61, 0x5d, 0x25, 0x46, 0x4d, 0x54, 0x47, 0xe1, 0x64, 0xc3, 0xa1, 0xc5,\n  0xab, 0x25, 0x4a, 0x9c, 0x78, 0x38, 0xca, 0x8f, 0x65, 0x21, 0x07, 0x80,\n  0xcd, 0x58, 0x24, 0x1e, 0xad, 0xbb, 0xeb, 0x5c, 0x27, 0xe7, 0x1a, 0x50,\n  0x14, 0x63, 0x44, 0x81, 0x0f, 0x0e, 0x6c, 0x03, 0x62, 0xd5, 0x25, 0x86,\n  0x62, 0x82, 0x6e, 0x9b, 0xb4, 0x3e, 0x8a, 0xa7, 0x48, 0xb3, 0x37, 0x52,\n  0xa9, 0xc4, 0xa3, 0xf4, 0xe8, 0xd9, 0xbe, 0x81, 0xf3, 0x63, 0xc9, 0x29,\n  0xa7, 0xc7, 0x59, 0xf5, 0xbe, 0x7f, 0x7a, 0x2a, 0x3d, 0xe8, 0xed, 0xac,\n  0x58, 0x02, 0xa2, 0xca, 0x6d, 0x6c, 0x73, 0x8b, 0x5d, 0xb7, 0x1e, 0x38,\n  0x7c, 0x5b, 0x97, 0x49, 0x3b, 0xae, 0x36, 0x3e, 0xbf, 0xba, 0x66, 0xd6,\n  0x7d, 0xa0, 0x3a, 0x8c, 0xed, 0x1b, 0x86, 0x2f, 0x56, 0x59, 0xd9, 0x7f,\n  0x7e, 0xa3, 0x8b, 0x1e, 0xc6, 0xbc, 0x2c, 0x42, 0xdd, 0x59, 0xd5, 0x3b,\n  0x11, 0x36, 0x1b, 0x15, 0x3b, 0x0b, 0x2c, 0x9a, 0x24, 0xd9, 0x4e, 0x16,\n  0x18, 0x9a, 0x11, 0x60, 0xd1, 0x37, 0x8c, 0xad, 0x53, 0xd0, 0x7a, 0x82,\n  0xb9, 0x24, 0x7b, 0x9e, 0x13, 0xb3, 0xf3, 0x8d, 0x15, 0x1b, 0x75, 0xc8,\n  0x8e, 0xbc, 0x52, 0x91, 0x38, 0x1d, 0x85, 0x82, 0x3e, 0x0f, 0xd8, 0x69,\n  0x90, 0xb3, 0x18, 0xdb, 0x68, 0x11, 0x14, 0x51, 0xcb, 0x5d, 0xae, 0xf7,\n  0x4b, 0x86, 0xd7, 0x25, 0xa8, 0x27, 0x36, 0x6b, 0x23, 0x80, 0xb5, 0x00,\n  0xe8, 0x22, 0x5f, 0x52, 0xfa, 0x56, 0xbc, 0x79, 0xf7, 0xe0, 0xf2, 0x32,\n  0xc7, 0xbb, 0x57, 0x8a, 0x87, 0x0e, 0xa5, 0x3b, 0x3f, 0x27, 0x77, 0x6b,\n  0x04, 0x2d, 0xdd, 0x09, 0x7c, 0x1a, 0x33, 0xf0, 0x84, 0x94, 0x6c, 0xd9,\n  0xb7, 0x56, 0xfb, 0xd7, 0x37, 0x55, 0x87, 0x29, 0x25, 0x66, 0xeb, 0x02,\n  0xa3, 0x25, 0x7d, 0xcd, 0x51, 0xbf, 0x53, 0xb5, 0x45, 0x68, 0x5a, 0x40,\n  0x39, 0xb3, 0x9e, 0xe1, 0x05, 0x37, 0x66, 0x03, 0x1e, 0x6c, 0xc2, 0xb0,\n  0x8a, 0x21, 0x10, 0x06, 0x4b, 0x86, 0xe5, 0x8e, 0xe2, 0xdb, 0x4e, 0x81,\n  0xc1, 0x5c, 0x1f, 0x33, 0x9e, 0xa7, 0x57, 0x61, 0x33, 0xe4, 0x3c, 0x01,\n  0x05, 0x94, 0xc9, 0xb3, 0x7d, 0x4d, 0xb0, 0xe5, 0x48, 0x75, 0x4a, 0xae,\n  0xbd, 0x59, 0x71, 0xb3, 0x8e, 0xac, 0x58, 0x6c, 0xad, 0x08, 0xd8, 0x8a,\n  0xd1, 0x44, 0x24, 0x66, 0x8d, 0x86, 0x8d, 0x2a, 0x9d, 0x3f, 0x85, 0x0a,\n  0xb6, 0xf6, 0xcd, 0x8c, 0x61, 0x71, 0x49, 0x90, 0x4c, 0x75, 0xa9, 0xbc,\n  0x99, 0xd3, 0xd3, 0xd1, 0xb4, 0x89, 0x29, 0xa0, 0xe2, 0x72, 0x26, 0x77,\n  0xe2, 0x8e, 0xce, 0xeb, 0x4e, 0x55, 0x66, 0xed, 0xbc, 0xa5, 0x6f, 0x66,\n  0x65, 0xd7, 0x50, 0x2a, 0x61, 0x6c, 0xf7, 0xac, 0xdd, 0x76, 0xff, 0x4d,\n  0xcb, 0x7d, 0x3b, 0x87, 0xa7, 0xe2, 0xcb, 0xe3, 0x39, 0x2c, 0xe1, 0xbe,\n  0x2d, 0x8c, 0xdd, 0x3e, 0x7b, 0xef, 0x23, 0xb9, 0xd0, 0x18, 0x7a, 0x3a,\n  0xf6, 0xe8, 0x75, 0x47, 0xd6, 0x74, 0x23, 0x9c, 0xea, 0xa1, 0xbb, 0x1f,\n  0xf9, 0x5c, 0xcb, 0xbf, 0xaf, 0x9f, 0x58, 0x3f, 0x52, 0xd9, 0x53, 0x50,\n  0xc9, 0x7e, 0x59, 0x06, 0xfc, 0xeb, 0x6e, 0xfa, 0x0a, 0x15, 0xa0, 0x2e,\n  0x56, 0x0d, 0x16, 0x6c, 0xf5, 0x5a, 0xc1, 0x3b, 0x47, 0xa3, 0x98, 0xbd,\n  0x3e, 0xa0, 0x82, 0xa8, 0xc6, 0x33, 0x1e, 0xc9, 0x11, 0x55, 0x8a, 0x83,\n  0xd9, 0xa9, 0x69, 0x38, 0x12, 0x10, 0x0e, 0xe0, 0x0e, 0x9f, 0x86, 0xf0,\n  0xa2, 0x93, 0x88, 0xf8, 0xa5, 0x71, 0x14, 0x8f, 0xb5, 0xc5, 0xf5, 0xa6,\n  0x1b, 0xde, 0x50, 0x6d, 0xa5, 0x6a, 0x96, 0xa1, 0x3e, 0x01, 0x13, 0x40,\n  0x3e, 0x4b, 0xd3, 0x05, 0x1a, 0xc9, 0x66, 0x21, 0x17, 0x6e, 0x79, 0xab,\n  0x77, 0x1a, 0x09, 0xdb, 0x40, 0x3d, 0x37, 0x2f, 0xef, 0xdb, 0xb7, 0x7f,\n  0xff, 0xde, 0x1d, 0xc1, 0x92, 0xc5, 0x61, 0x6c, 0xb1, 0xa7, 0x53, 0xf7,\n  0xdf, 0x8f, 0xe6, 0xab, 0x90, 0x62, 0xb2, 0x7a, 0x77, 0xd2, 0x1f, 0x38,\n  0xbe, 0x47, 0x23, 0x0c, 0x73, 0x62, 0x77, 0x9f, 0x34, 0x74, 0x37, 0x99,\n  0x0f, 0x29, 0x2c, 0x0f, 0x7e, 0x41, 0x4b, 0xa0, 0x57, 0x80, 0x3d, 0x6f,\n  0x51, 0xec, 0x79, 0xd7, 0xaf, 0xb5, 0xe7, 0xaf, 0xfb, 0xb5, 0xf6, 0xfc,\n  0xe9, 0x86, 0x3d, 0x7f, 0xdd, 0xf6, 0xf6, 0xbc, 0xdf, 0x87, 0x35, 0xb1,\n  0x74, 0x2a, 0x19, 0x95, 0x7c, 0x79, 0x7f, 0x1e, 0xac, 0x2e, 0xcc, 0x29,\n  0xbd, 0xc8, 0x2b, 0xea, 0x1a, 0x9b, 0xd5, 0x8a, 0x21, 0xac, 0xa4, 0x3c,\n  0xba, 0xb6, 0x45, 0x0f, 0x1f, 0x5e, 0x29, 0xee, 0x2e, 0x77, 0x0f, 0xe6,\n  0xcb, 0xe5, 0x85, 0x54, 0x79, 0x38, 0xa9, 0x65, 0xb4, 0xc3, 0x55, 0x0b,\n  0x67, 0x5b, 0xca, 0xee, 0x1e, 0x9a, 0x5c, 0xe8, 0xa8, 0xf4, 0x8f, 0xe8,\n  0xdd, 0xa3, 0x43, 0x63, 0x62, 0x70, 0xa8, 0x54, 0x18, 0xd7, 0x71, 0xfa,\n  0xde, 0x74, 0xbe, 0xcf, 0xe7, 0x8a, 0xdb, 0x26, 0xaf, 0xfc, 0x70, 0x3a,\n  0xde, 0x36, 0x76, 0x64, 0x9f, 0xfd, 0xc4, 0xfe, 0x96, 0x78, 0x22, 0x39,\n  0x90, 0x4f, 0xa7, 0xf2, 0xf2, 0xb9, 0x6e, 0x06, 0xeb, 0x9b, 0x21, 0x88,\n  0x4b, 0x66, 0x49, 0xee, 0x48, 0xaa, 0x42, 0x68, 0x04, 0x58, 0x3c, 0xd8,\n  0x5e, 0xc6, 0x22, 0x82, 0x0e, 0x5f, 0xcb, 0x5e, 0x3e, 0xfd, 0x6b, 0xed,\n  0xe5, 0xd3, 0xd7, 0xb0, 0x97, 0x41, 0x1b, 0xf5, 0xb8, 0x6c, 0x16, 0xb3,\n  0x51, 0xa7, 0xa5, 0xa2, 0x28, 0xaa, 0xba, 0x8a, 0x0e, 0x9b, 0x16, 0x33,\n  0x7f, 0x95, 0xc9, 0xfc, 0x1f, 0x85, 0x1d, 0xb9, 0x5c, 0x39, 0xd7, 0xb1,\n  0xd0, 0x37, 0xa9, 0xb5, 0x0e, 0x76, 0xf4, 0x16, 0x97, 0x47, 0x16, 0xfb,\n  0x2d, 0xac, 0x7d, 0xa7, 0x28, 0x0d, 0xe7, 0x0a, 0x23, 0x46, 0x4e, 0x3f,\n  0x50, 0x3d, 0x75, 0xac, 0xda, 0x41, 0x3a, 0x77, 0x64, 0x1f, 0x72, 0x93,\n  0x4e, 0x43, 0x1f, 0x25, 0xe4, 0xc2, 0x3c, 0xef, 0x18, 0x1a, 0x45, 0xd6,\n  0xe6, 0x38, 0x42, 0x66, 0x33, 0x8e, 0x10, 0x6b, 0xfb, 0x98, 0x0e, 0x2b,\n  0x98, 0xa7, 0x47, 0xb0, 0x4d, 0x9d, 0xa7, 0xde, 0x5d, 0xd5, 0x6b, 0x11,\n  0xad, 0x0e, 0x61, 0x21, 0xe9, 0xc1, 0x42, 0xaf, 0x3e, 0x3b, 0xe2, 0x22,\n  0x47, 0xd3, 0x5a, 0x9e, 0x06, 0xff, 0xee, 0x35, 0x3d, 0xd6, 0xb7, 0x99,\n  0x55, 0x88, 0x8a, 0xb8, 0x6e, 0xda, 0xa0, 0xc1, 0xe2, 0x8c, 0x3a, 0xa4,\n  0xd2, 0xd5, 0x69, 0x91, 0x6a, 0xae, 0x89, 0x89, 0x70, 0x7a, 0x5a, 0xae,\n  0x4e, 0x6d, 0x53, 0x7b, 0xa5, 0x9a, 0xcc, 0xa4, 0x63, 0x58, 0x7c, 0xb4,\n  0xb5, 0xa6, 0xf3, 0x99, 0x7c, 0x32, 0x11, 0x4d, 0xc5, 0x52, 0x01, 0x9f,\n  0xc3, 0x2e, 0xef, 0x6b, 0x61, 0x86, 0x09, 0xb9, 0x5f, 0x30, 0xcf, 0x34,\n  0x2a, 0x3c, 0x13, 0xaf, 0x89, 0xf6, 0xfa, 0xf6, 0x0f, 0x59, 0x0a, 0xcd,\n  0x30, 0x15, 0x40, 0x2a, 0x26, 0x4c, 0xb0, 0xd7, 0xb0, 0x34, 0x2d, 0x85,\n  0xec, 0x76, 0x64, 0x39, 0x78, 0x13, 0x57, 0x6c, 0x57, 0xdf, 0xb8, 0xb7,\n  0x77, 0xd6, 0xc5, 0xea, 0x47, 0x86, 0x87, 0x9d, 0x26, 0x95, 0x99, 0x15,\n  0x82, 0xa6, 0x58, 0x5e, 0xc3, 0x3a, 0xe7, 0xf2, 0x7d, 0xc3, 0x2a, 0x14,\n  0xe3, 0x87, 0x67, 0x76, 0x0e, 0xd7, 0xfe, 0x8e, 0x1d, 0x15, 0xef, 0xbc,\n  0xdc, 0x7b, 0xc3, 0xcd, 0xd9, 0xd0, 0xf0, 0xf7, 0x7b, 0xef, 0x0c, 0xb8,\n  0x58, 0x54, 0x65, 0xd5, 0x91, 0x6c, 0xb8, 0x0d, 0x7d, 0x7f, 0x79, 0x6a,\n  0x76, 0x67, 0xed, 0xd8, 0xbe, 0x3d, 0xcb, 0x07, 0x31, 0xbd, 0xb2, 0x1b,\n  0xaf, 0x31, 0xb3, 0x04, 0x53, 0xa8, 0x88, 0xb5, 0x2b, 0xac, 0x5b, 0x38,\n  0x75, 0x58, 0x39, 0x77, 0x99, 0xb5, 0x98, 0x5d, 0xc6, 0x91, 0x4a, 0x43,\n  0xce, 0xf7, 0xd5, 0x1a, 0xa4, 0x06, 0x73, 0x45, 0xa3, 0xe2, 0x35, 0x6b,\n  0x1c, 0x1c, 0xbd, 0x29, 0xf4, 0xd2, 0x8b, 0x3a, 0x06, 0x40, 0xfb, 0x04,\n  0xad, 0x4c, 0x82, 0xf6, 0x52, 0xaa, 0x05, 0x51, 0x9d, 0x1d, 0xa5, 0xee,\n  0xf6, 0xee, 0xb6, 0x6c, 0x4b, 0x31, 0x55, 0x8c, 0x4a, 0xc1, 0x80, 0xcf,\n  0x63, 0xb7, 0x9a, 0x0c, 0xb8, 0xff, 0x2c, 0x95, 0x44, 0x49, 0x83, 0x4e,\n  0xb1, 0xef, 0xcb, 0xe5, 0x26, 0xcc, 0x3e, 0x47, 0x7b, 0x13, 0x5a, 0xbb,\n  0x10, 0x6a, 0xe0, 0x5a, 0x36, 0x61, 0xf8, 0x71, 0x32, 0x19, 0xbe, 0x31,\n  0x7d, 0xe0, 0xb5, 0xd5, 0x33, 0xd1, 0xa9, 0xb8, 0x2f, 0xb5, 0x3f, 0x77,\n  0x5b, 0x22, 0x70, 0x68, 0xa8, 0xb4, 0xa3, 0x25, 0x3b, 0x93, 0x9f, 0x5f,\n  0xa6, 0xd1, 0x85, 0xf3, 0xc7, 0x07, 0x4e, 0x78, 0xa4, 0xc3, 0xdd, 0x43,\n  0x3b, 0x66, 0x76, 0xec, 0x29, 0xa1, 0x67, 0x87, 0xaa, 0xb5, 0x1f, 0xf2,\n  0x73, 0xe2, 0x8e, 0x99, 0x0f, 0xf2, 0x4c, 0xf4, 0x26, 0xab, 0xa5, 0x6a,\n  0x73, 0xec, 0x4b, 0xe7, 0x8c, 0xd6, 0x31, 0xab, 0xf9, 0xf0, 0x9e, 0xe2,\n  0xd9, 0xfb, 0x7a, 0x2b, 0x3d, 0x3d, 0x9b, 0x20, 0x7f, 0xf4, 0xfe, 0x91,\n  0xf9, 0x05, 0x59, 0xe6, 0x74, 0x6d, 0xfc, 0x08, 0x5d, 0x46, 0x57, 0x28,\n  0x0f, 0xd6, 0x0e, 0x02, 0x55, 0xaf, 0xe4, 0xf3, 0xb8, 0x2d, 0x1c, 0x22,\n  0xc7, 0xf8, 0x68, 0x9c, 0x58, 0x31, 0x98, 0x57, 0xdc, 0xd8, 0xe2, 0x81,\n  0xc4, 0xa6, 0x8e, 0x38, 0x78, 0x8c, 0xc1, 0xcc, 0x2f, 0x17, 0x48, 0xc8,\n  0xb0, 0x20, 0x28, 0xe7, 0x1e, 0x71, 0x5b, 0x19, 0xb6, 0x29, 0xe2, 0x7a,\n  0xfa, 0x87, 0x1e, 0x36, 0x32, 0x9c, 0x51, 0x3b, 0x7e, 0xcf, 0x7e, 0x90,\n  0x61, 0xb5, 0x9f, 0x45, 0xe1, 0xb4, 0xc1, 0x1a, 0x0f, 0x5a, 0x5f, 0x3c,\n  0x22, 0xb0, 0x23, 0x26, 0x3d, 0xed, 0xd0, 0xe9, 0x74, 0xd1, 0xe1, 0xca,\n  0x43, 0xce, 0xa0, 0xf1, 0xc2, 0x5b, 0x58, 0x6c, 0xd9, 0xa8, 0xdf, 0xe1,\n  0x8d, 0x98, 0x74, 0x5e, 0xfb, 0x3f, 0xdd, 0x32, 0x81, 0xcd, 0x25, 0xfe,\n  0xb4, 0xd6, 0xe4, 0x22, 0xed, 0x82, 0xf9, 0x5d, 0xc0, 0xe3, 0x15, 0xc2,\n  0x16, 0xfe, 0x58, 0x75, 0xd8, 0x85, 0x85, 0x1f, 0xb6, 0x2c, 0xc1, 0xbe,\n  0x57, 0xe3, 0x52, 0x35, 0xbd, 0xc6, 0x40, 0x0c, 0x17, 0xf1, 0x01, 0x10,\n  0x91, 0x4a, 0x55, 0x67, 0x69, 0x0a, 0xd4, 0xe2, 0x79, 0x7e, 0x46, 0x0a,\n  0x47, 0x23, 0xe1, 0xb8, 0x14, 0x37, 0x47, 0xc3, 0x26, 0x9b, 0x39, 0x6a,\n  0xd4, 0x60, 0x61, 0x55, 0x2e, 0x14, 0xeb, 0x2a, 0x4b, 0x08, 0x48, 0x6d,\n  0x0b, 0xd9, 0x42, 0xf6, 0x2d, 0x73, 0x11, 0x85, 0xe5, 0x89, 0xd8, 0x75,\n  0x6a, 0xea, 0xc8, 0x05, 0xb6, 0xf6, 0x08, 0x56, 0x87, 0x3e, 0x54, 0x3b,\n  0x6c, 0xd8, 0x55, 0xcd, 0xcd, 0x66, 0x5b, 0x76, 0x94, 0xd6, 0xee, 0x36,\n  0x77, 0xa2, 0xc8, 0xc9, 0x20, 0x12, 0xc5, 0x9e, 0x9f, 0x8a, 0xe2, 0xae,\n  0x3b, 0x46, 0x6e, 0x3d, 0xab, 0xf7, 0xe9, 0x05, 0xbe, 0x5c, 0xad, 0x9a,\n  0xac, 0x63, 0x16, 0xd3, 0xda, 0x41, 0x14, 0x3e, 0xdd, 0x2a, 0xe7, 0x19,\n  0xa4, 0x1c, 0xb8, 0x0f, 0xdf, 0xc0, 0x6b, 0x34, 0x4b, 0x95, 0xa8, 0xdf,\n  0x91, 0xe3, 0xc5, 0x2d, 0x3e, 0x44, 0x63, 0xd3, 0x83, 0xa7, 0x93, 0x36,\n  0x2c, 0xa2, 0xec, 0x98, 0x57, 0x01, 0xa8, 0x0f, 0x5c, 0xe5, 0xae, 0xba,\n  0xaa, 0x40, 0xc5, 0x25, 0xd4, 0x60, 0x7a, 0xd1, 0x3c, 0xc4, 0xaa, 0x61,\n  0x36, 0x8e, 0x75, 0x81, 0xf5, 0xe6, 0xfe, 0x2a, 0x58, 0x30, 0xe7, 0x59,\n  0x92, 0x18, 0x94, 0xa3, 0x29, 0x6e, 0x45, 0x0d, 0xd0, 0x1f, 0xb8, 0xfe,\n  0xda, 0xaf, 0xaf, 0xbf, 0x52, 0xb5, 0xb4, 0xb5, 0x16, 0xf2, 0xad, 0xa5,\n  0xb6, 0x12, 0x81, 0x27, 0xb3, 0x46, 0xc2, 0x84, 0x44, 0x75, 0xd7, 0x36,\n  0x22, 0xd4, 0xb7, 0x92, 0x07, 0x0e, 0x13, 0xeb, 0x7c, 0x4e, 0xb9, 0x84,\n  0xe4, 0x95, 0xeb, 0x58, 0x18, 0x72, 0xb7, 0x79, 0x74, 0x97, 0x0e, 0x0c,\n  0x1f, 0x2e, 0xd5, 0xde, 0x46, 0xaf, 0xcc, 0x15, 0x66, 0x5b, 0x92, 0x73,\n  0xe5, 0xc9, 0x0b, 0x83, 0xb4, 0xb3, 0xc5, 0x1d, 0x6d, 0x93, 0xa4, 0x88,\n  0x45, 0xed, 0x75, 0x0d, 0x0d, 0xa2, 0x1f, 0xf4, 0x8d, 0x0b, 0xc8, 0x84,\n  0x7a, 0xff, 0xa2, 0x67, 0x94, 0xa3, 0x4f, 0xdd, 0x52, 0x39, 0x3d, 0x5e,\n  0xda, 0x73, 0xc0, 0x62, 0x9e, 0x36, 0x9b, 0x2a, 0xd7, 0xef, 0xa2, 0xd9,\n  0x60, 0xd0, 0x2b, 0x89, 0x03, 0x2c, 0x37, 0x84, 0x16, 0xe7, 0xc7, 0x86,\n  0x76, 0xca, 0xf2, 0x5d, 0xa4, 0x2a, 0x44, 0xbe, 0x3b, 0xa8, 0xdd, 0x00,\n  0xad, 0xc7, 0xb1, 0x06, 0xc4, 0x90, 0x3c, 0x64, 0x3e, 0x92, 0x87, 0x0c,\n  0xcf, 0xd6, 0xfb, 0xea, 0x89, 0xc5, 0x4e, 0x4d, 0x6f, 0xa6, 0x86, 0x3f,\n  0x0d, 0x8c, 0xcd, 0x2d, 0x17, 0xb3, 0x80, 0xff, 0xcb, 0xad, 0x6f, 0x29,\n  0x24, 0x19, 0xc8, 0x20, 0xe0, 0xde, 0x28, 0xe8, 0x7c, 0x72, 0x4c, 0x35,\n  0x48, 0xef, 0xab, 0x24, 0x37, 0x9a, 0xba, 0x7f, 0xf9, 0xf0, 0xe1, 0x66,\n  0xa1, 0x8d, 0x5e, 0xaa, 0x1d, 0x47, 0x8f, 0x8d, 0x6e, 0xca, 0x6b, 0xc0,\n  0x7d, 0x2c, 0x6d, 0xe8, 0x68, 0x6c, 0x3f, 0x60, 0x6e, 0xdc, 0x89, 0xad,\n  0x97, 0x47, 0xaa, 0xf6, 0x84, 0x87, 0xe6, 0xb9, 0x1e, 0x1b, 0xd6, 0x38,\n  0x55, 0x6a, 0x3c, 0x2e, 0x98, 0x27, 0x63, 0x65, 0x7a, 0x5c, 0xe6, 0xcb,\n  0x09, 0x3c, 0x34, 0x10, 0x85, 0x01, 0xce, 0x88, 0x2a, 0x01, 0xa9, 0xc0,\n  0x7e, 0xe1, 0xea, 0xbc, 0x46, 0xb6, 0x5d, 0x70, 0xc7, 0xcf, 0x42, 0xfb,\n  0xd3, 0x57, 0x57, 0x25, 0xcc, 0x59, 0xae, 0x4f, 0x5d, 0x5d, 0x7d, 0xa5,\n  0xea, 0xec, 0xee, 0xca, 0xa4, 0xfb, 0xfb, 0xba, 0x86, 0xbb, 0x87, 0x0b,\n  0xb9, 0x74, 0x67, 0xa6, 0xd3, 0x12, 0x4d, 0x45, 0x52, 0x1a, 0x9d, 0x27,\n  0x15, 0xb5, 0x42, 0x84, 0x99, 0x40, 0x9c, 0xb8, 0xe3, 0x9b, 0x2e, 0x8c,\n  0x64, 0x39, 0x4b, 0x75, 0x4d, 0x0d, 0x18, 0x14, 0xd8, 0xee, 0x60, 0xf7,\n  0x11, 0xeb, 0x17, 0x44, 0x3a, 0xd3, 0xe4, 0xa2, 0x48, 0xeb, 0x93, 0xa2,\n  0x99, 0xab, 0xb0, 0x3a, 0xde, 0x3b, 0xdd, 0xbd, 0xb4, 0x7f, 0x69, 0xa6,\n  0xbc, 0xe2, 0x13, 0x69, 0xc4, 0xf8, 0x76, 0x75, 0x1c, 0x3d, 0x9f, 0x5b,\n  0x1d, 0x3b, 0xdd, 0xc9, 0x8a, 0x93, 0x2f, 0x4f, 0x4e, 0x20, 0x34, 0x31,\n  0xd6, 0x39, 0xe8, 0xed, 0x3f, 0x59, 0xe8, 0x33, 0xda, 0x27, 0x5a, 0xf3,\n  0xe9, 0xa2, 0xb0, 0xd8, 0x6f, 0x4c, 0x59, 0x1c, 0x5a, 0xbf, 0x68, 0xf5,\n  0x23, 0xd4, 0x55, 0xee, 0xec, 0x0c, 0xf9, 0x22, 0xd1, 0x90, 0x35, 0x66,\n  0x4b, 0xb7, 0xdc, 0x77, 0x71, 0xfa, 0xe6, 0xa1, 0x85, 0xf1, 0xfe, 0xc3,\n  0xcb, 0xbb, 0x0f, 0x65, 0x66, 0x8b, 0xa6, 0x9d, 0xab, 0x57, 0x6e, 0x71,\n  0x5a, 0xdc, 0x92, 0xc7, 0x69, 0x0f, 0x50, 0x88, 0xc4, 0x54, 0x7f, 0x08,\n  0xeb, 0xc5, 0x79, 0xea, 0xf6, 0xaa, 0xd6, 0xeb, 0xa2, 0x39, 0x26, 0x0f,\n  0xaa, 0x31, 0xad, 0x58, 0x00, 0x29, 0x6c, 0x03, 0x32, 0x2c, 0x0f, 0xe1,\n  0x60, 0x02, 0x25, 0x40, 0x5c, 0x2b, 0x83, 0x8d, 0x41, 0x06, 0x11, 0x4f,\n  0x7b, 0x9a, 0x13, 0x4e, 0x90, 0x79, 0x21, 0x67, 0x68, 0xf6, 0xfc, 0x46,\n  0xb5, 0x49, 0xb6, 0xc2, 0x93, 0x40, 0x4f, 0x4d, 0x24, 0x21, 0x59, 0x22,\n  0x49, 0x89, 0xe8, 0xba, 0x05, 0xc9, 0x54, 0xa7, 0x83, 0x63, 0x33, 0x19,\n  0x2b, 0x90, 0x91, 0x80, 0x0b, 0x29, 0xf9, 0x58, 0xf1, 0xb5, 0x4d, 0xc0,\n  0xe2, 0x8d, 0x65, 0x9d, 0x43, 0x13, 0xf2, 0xa8, 0x74, 0x0e, 0xad, 0xde,\n  0x5b, 0x18, 0xcb, 0x6a, 0xdc, 0x3a, 0x7c, 0x45, 0xeb, 0xc3, 0x57, 0x9c,\n  0x1e, 0x5f, 0xbe, 0xaf, 0xa0, 0x75, 0xeb, 0xd0, 0x1f, 0x33, 0xac, 0x64,\n  0xd5, 0x07, 0xf4, 0x4e, 0xa3, 0xd6, 0x38, 0xd4, 0x59, 0xe9, 0x64, 0x18,\n  0x24, 0xd6, 0xbe, 0xcb, 0x30, 0x61, 0xab, 0xc9, 0xa7, 0x73, 0x98, 0xbc,\n  0x03, 0x1d, 0x1d, 0x7d, 0x0c, 0xb3, 0x99, 0xd7, 0xfc, 0x56, 0x4c, 0x8b,\n  0x32, 0xf5, 0xa1, 0xaa, 0xdd, 0xe7, 0xa6, 0x19, 0x2e, 0xa9, 0xa7, 0x59,\n  0xa1, 0x05, 0xcb, 0x66, 0xba, 0x1d, 0xbc, 0xc8, 0x59, 0x85, 0x2a, 0x79,\n  0x4a, 0x80, 0xcd, 0x03, 0x81, 0x5d, 0xd7, 0xc0, 0x21, 0xa9, 0x08, 0x1b,\n  0xa1, 0xa2, 0x16, 0x21, 0x9d, 0x88, 0xe0, 0xb0, 0x8d, 0x98, 0x48, 0x1c,\n  0x56, 0xfc, 0x38, 0x0e, 0x64, 0xbd, 0x4e, 0x77, 0x52, 0x87, 0x89, 0xf3,\n  0x6b, 0x6f, 0xda, 0xac, 0x8f, 0xef, 0xd7, 0x1d, 0x50, 0x6e, 0x5a, 0xc1,\n  0x4b, 0x8c, 0xc2, 0xcd, 0x29, 0x97, 0x0a, 0xb9, 0xb6, 0x6c, 0x3a, 0x11,\n  0x33, 0x4b, 0xe6, 0xb0, 0x39, 0x12, 0x36, 0x4b, 0x06, 0xac, 0x14, 0x17,\n  0x64, 0x8a, 0x09, 0x12, 0x99, 0x5a, 0xa5, 0x2d, 0x5f, 0x14, 0x9a, 0x95,\n  0x0b, 0x04, 0x4d, 0xcd, 0xb6, 0xe5, 0xcb, 0xdb, 0x44, 0x8b, 0xc6, 0xea,\n  0x11, 0x0a, 0x6c, 0x25, 0x63, 0x36, 0x37, 0x7f, 0x5e, 0x16, 0x2d, 0xa2,\n  0x0d, 0x7f, 0xe1, 0xba, 0xd3, 0x16, 0xf3, 0xe6, 0x67, 0xab, 0x09, 0x19,\n  0x05, 0x95, 0x3f, 0xd2, 0x3b, 0x28, 0x9e, 0xe3, 0xd5, 0xfe, 0x68, 0xef,\n  0x90, 0xf8, 0x4a, 0xed, 0x87, 0x82, 0x2a, 0x10, 0xa9, 0x0e, 0x88, 0x67,\n  0x05, 0x75, 0x50, 0xaa, 0x0e, 0x68, 0x5e, 0xc6, 0x43, 0x1d, 0xc0, 0xf4,\n  0x3b, 0x81, 0xe9, 0x07, 0x98, 0xa1, 0x01, 0xaa, 0x5c, 0xd5, 0xf9, 0xbc,\n  0xd8, 0x70, 0xd3, 0xa8, 0xe4, 0x5c, 0xde, 0x32, 0xe9, 0x34, 0x72, 0xf0,\n  0x8e, 0x32, 0x61, 0xe0, 0x5b, 0x63, 0x42, 0x7c, 0xcc, 0x49, 0x52, 0x7c,\n  0x17, 0xa4, 0x92, 0xa2, 0x02, 0x16, 0xe4, 0x70, 0x60, 0x21, 0x8e, 0xe7,\n  0x44, 0x89, 0xe7, 0x1d, 0x90, 0x90, 0xb7, 0xbd, 0xfd, 0xdf, 0x97, 0xdb,\n  0x87, 0x86, 0x4b, 0xcb, 0xed, 0x83, 0x43, 0xa5, 0xc7, 0xa3, 0x3e, 0x7f,\n  0xe4, 0x1f, 0x22, 0x3e, 0x5f, 0xe4, 0xdb, 0xba, 0x9d, 0x3d, 0x95, 0x45,\n  0xfd, 0xb7, 0xbe, 0xad, 0xdb, 0xd5, 0x55, 0xd9, 0xa9, 0x7b, 0xbf, 0x54,\n  0xd6, 0x7d, 0x41, 0x5b, 0x96, 0xa4, 0x76, 0xdd, 0x0b, 0xda, 0xb2, 0x12,\n  0xab, 0xcc, 0xbc, 0x1b, 0xf3, 0x90, 0x56, 0xcc, 0x43, 0x1e, 0xa9, 0x9a,\n  0x82, 0x6e, 0x1a, 0xd1, 0x2d, 0x09, 0x5a, 0x44, 0x99, 0x14, 0xad, 0x16,\n  0xeb, 0x4a, 0x1d, 0x84, 0xce, 0x88, 0x6a, 0x24, 0xae, 0x83, 0xc1, 0xca,\n  0xaf, 0xaa, 0x04, 0x9a, 0xe7, 0x4f, 0x4f, 0x6b, 0x61, 0x37, 0xf5, 0x00,\n  0xc7, 0x68, 0x18, 0xa5, 0xd9, 0xe9, 0x7a, 0x35, 0x0a, 0x8a, 0xa1, 0xae,\n  0xb0, 0x0a, 0xf8, 0x66, 0xd7, 0x11, 0x44, 0xa6, 0x93, 0xf2, 0x0d, 0x10,\n  0xeb, 0x25, 0xab, 0x74, 0xa1, 0x5c, 0x1b, 0xa2, 0x4a, 0xc5, 0xb6, 0xce,\n  0x5c, 0x27, 0x84, 0x3e, 0x03, 0xd6, 0x8c, 0xc5, 0x64, 0xd0, 0x6b, 0xd4,\n  0x3c, 0x07, 0xa9, 0xa7, 0x74, 0x4d, 0xc7, 0x60, 0x75, 0x90, 0xa6, 0x4d,\n  0x13, 0xd8, 0x51, 0x90, 0x39, 0x87, 0x02, 0x8a, 0x06, 0x6c, 0x26, 0x2e,\n  0xef, 0x99, 0x97, 0x64, 0xae, 0xf1, 0x7c, 0xae, 0x3a, 0x3e, 0x57, 0x6a,\n  0x1f, 0x1f, 0x5c, 0x3e, 0x39, 0xd9, 0xbf, 0x3c, 0xac, 0xe7, 0x1c, 0x8b,\n  0x6d, 0xb7, 0xc5, 0x79, 0xf7, 0x72, 0x71, 0x65, 0x4f, 0xde, 0x6b, 0xf1,\n  0xf9, 0xbb, 0xa7, 0x3d, 0xb6, 0x0e, 0xc9, 0x26, 0x62, 0x82, 0xf6, 0xb0,\n  0x17, 0x47, 0x06, 0x96, 0x57, 0x6a, 0x5f, 0x47, 0xbb, 0xef, 0x38, 0x70,\n  0xb8, 0xf6, 0x23, 0xda, 0x35, 0x96, 0x4c, 0xae, 0xa4, 0x33, 0xfb, 0xd6,\n  0x1e, 0x52, 0xe9, 0xda, 0xb5, 0xfc, 0xec, 0x62, 0x4f, 0x2c, 0x6b, 0x0d,\n  0x39, 0x2c, 0xbe, 0x7a, 0x7c, 0xf7, 0x1a, 0xd1, 0x13, 0x52, 0xd4, 0xbd,\n  0x55, 0xa3, 0x19, 0x21, 0xda, 0xeb, 0xc6, 0xcc, 0x21, 0xe0, 0xa3, 0xf9,\n  0x26, 0x2b, 0x09, 0x2b, 0x0b, 0x3c, 0x22, 0x16, 0x10, 0xbb, 0x0a, 0x48,\n  0x86, 0xc0, 0x42, 0x89, 0x8b, 0x6f, 0x93, 0x95, 0x54, 0xaf, 0x03, 0xa5,\n  0x80, 0xd6, 0x02, 0x46, 0x62, 0xc3, 0x4a, 0x52, 0x4e, 0xa3, 0x14, 0x2b,\n  0x09, 0xf6, 0xab, 0xe3, 0xb1, 0x70, 0x4a, 0x4a, 0x39, 0x6c, 0xa0, 0xf3,\n  0x12, 0x32, 0x85, 0x50, 0x48, 0xdc, 0x8e, 0x4c, 0x85, 0x6b, 0x13, 0x06,\n  0xbd, 0x1b, 0x08, 0xd3, 0xd9, 0xb3, 0x3c, 0xb2, 0x3c, 0xa2, 0xe3, 0xdc,\n  0x7b, 0x2b, 0x2b, 0xab, 0x98, 0x1c, 0x01, 0x4f, 0x65, 0xca, 0x63, 0xed,\n  0x08, 0x2b, 0xe4, 0xb8, 0x79, 0x6c, 0xf0, 0xd0, 0x41, 0x42, 0x87, 0x96,\n  0xc4, 0x81, 0xa3, 0x6f, 0x20, 0x02, 0xd0, 0x40, 0x4b, 0xef, 0xc2, 0x34,\n  0x88, 0x52, 0x6d, 0xd4, 0xcd, 0x55, 0x0b, 0x64, 0xd8, 0xd3, 0x61, 0x4b,\n  0x20, 0x8d, 0xa7, 0x87, 0x80, 0xd5, 0x74, 0xbe, 0xbe, 0x6b, 0x20, 0x6d,\n  0x43, 0x86, 0xba, 0x7d, 0xbf, 0x29, 0x71, 0xe2, 0xbf, 0x8e, 0x10, 0x4d,\n  0x35, 0x31, 0x73, 0x94, 0x5a, 0x22, 0x26, 0x4b, 0x24, 0x12, 0x01, 0xe6,\n  0xc8, 0x35, 0x47, 0x07, 0x39, 0x4c, 0x6f, 0xec, 0xbd, 0x09, 0x0b, 0x20,\n  0x47, 0x54, 0xc1, 0x4a, 0xc4, 0x85, 0x74, 0xc0, 0x60, 0xb3, 0x0c, 0xb4,\n  0x75, 0x0c, 0x0f, 0xb4, 0x27, 0xe3, 0x5d, 0x15, 0x42, 0x02, 0xde, 0xbd,\n  0x07, 0x93, 0x80, 0x4f, 0x78, 0x6a, 0x3f, 0x70, 0xf8, 0x7c, 0x2d, 0x42,\n  0x48, 0x0a, 0x04, 0x7e, 0x9a, 0x0c, 0x87, 0x62, 0x95, 0x62, 0xa9, 0x62,\n  0x41, 0xd7, 0x8f, 0xf4, 0x37, 0x51, 0xa2, 0x76, 0x51, 0xf2, 0xe7, 0x47,\n  0x57, 0xad, 0xa1, 0x64, 0xd2, 0x15, 0x80, 0xb9, 0x90, 0xc6, 0xba, 0xec,\n  0xc7, 0xb0, 0x2e, 0xeb, 0xc6, 0x5a, 0x7e, 0xb9, 0xaa, 0x37, 0x83, 0x4f,\n  0xdd, 0x94, 0xcf, 0x6b, 0x81, 0xdc, 0xe2, 0x13, 0x72, 0xb4, 0x9e, 0x06,\n  0xd4, 0x81, 0x7b, 0xeb, 0x4b, 0x5b, 0x5d, 0xff, 0x76, 0xe3, 0xca, 0x33,\n  0x21, 0x3c, 0x63, 0x74, 0x00, 0x89, 0x23, 0xd4, 0xf1, 0x70, 0x78, 0x41,\n  0x90, 0xb2, 0x74, 0xbc, 0x24, 0x4b, 0xc1, 0x78, 0x59, 0x90, 0xf9, 0x95,\n  0xcc, 0xe4, 0x63, 0x68, 0x12, 0x0f, 0xbb, 0x4b, 0x65, 0x8f, 0xe5, 0x67,\n  0x92, 0x4e, 0x3f, 0xca, 0x4d, 0xa6, 0xf5, 0x6a, 0x9a, 0xf9, 0x9d, 0x4c,\n  0x3a, 0xc5, 0x09, 0x0e, 0x4b, 0x4c, 0x67, 0xb4, 0xa2, 0x2b, 0x5e, 0xc1,\n  0x9e, 0xd2, 0x87, 0x07, 0x13, 0xa9, 0xd9, 0x1d, 0x59, 0x8f, 0xca, 0xe5,\n  0xd1, 0xf8, 0x39, 0x4f, 0xf4, 0xc3, 0xb6, 0xa4, 0xd5, 0x6b, 0xae, 0x7d,\n  0xcd, 0x6e, 0x0e, 0x76, 0x45, 0xb3, 0x13, 0x76, 0x5f, 0x04, 0xec, 0xb9,\n  0xf4, 0xc6, 0x57, 0xd0, 0xa7, 0x68, 0x2b, 0x15, 0xc6, 0xf3, 0xb8, 0x9d,\n  0x1a, 0xa9, 0x7a, 0xdd, 0x4e, 0x87, 0x8d, 0x85, 0x0e, 0xb4, 0xb5, 0xc6,\n  0xa2, 0x11, 0x0f, 0xe0, 0x81, 0xd3, 0x48, 0x8b, 0x26, 0xec, 0x44, 0x8b,\n  0xf8, 0xb5, 0x7d, 0x79, 0xb6, 0x98, 0x37, 0x9b, 0x68, 0x00, 0x55, 0x20,\n  0x9d, 0x29, 0x3b, 0x84, 0xcd, 0x0e, 0xc9, 0x41, 0xce, 0xb1, 0xa6, 0x5e,\n  0xd9, 0xca, 0x44, 0xb1, 0x03, 0xce, 0xa5, 0x44, 0x2a, 0x40, 0xd7, 0x58,\n  0x35, 0x57, 0x89, 0x8e, 0xa1, 0x7a, 0xf7, 0x5a, 0xa5, 0x74, 0x34, 0x6a,\n  0xb3, 0xc9, 0x5d, 0x3c, 0x80, 0x18, 0x64, 0xb4, 0x2e, 0xe9, 0x54, 0xd7,\n  0x27, 0x5b, 0xa0, 0xb3, 0xd0, 0x51, 0xb5, 0x49, 0xb5, 0xd7, 0x75, 0x86,\n  0x6e, 0x74, 0xd6, 0xa9, 0x1d, 0x74, 0x75, 0xf2, 0xfc, 0x66, 0x87, 0xbf,\n  0xfb, 0x08, 0xcd, 0xd1, 0xbe, 0xc8, 0x17, 0x5d, 0x69, 0xcb, 0x1f, 0xdb,\n  0x4c, 0xc1, 0x2e, 0x3c, 0x5e, 0x99, 0x8d, 0x1f, 0xd2, 0x06, 0xba, 0x95,\n  0x0a, 0x52, 0x09, 0x92, 0xfd, 0xd6, 0x20, 0x62, 0x51, 0x1c, 0x91, 0x82,\n  0x3e, 0xb3, 0x9a, 0xa1, 0x55, 0x0c, 0x85, 0x17, 0x32, 0xcd, 0x30, 0x53,\n  0x46, 0xac, 0x4c, 0x78, 0x10, 0x3d, 0x5e, 0x47, 0xe1, 0xbf, 0xae, 0x01,\n  0xce, 0x78, 0x9e, 0x9e, 0x49, 0x27, 0xa3, 0x51, 0x16, 0xbc, 0x41, 0xec,\n  0x98, 0xe8, 0x44, 0xba, 0x90, 0x7c, 0x14, 0xd0, 0xe9, 0x3a, 0xf6, 0x24,\n  0xf4, 0x37, 0x16, 0x8f, 0x16, 0xe3, 0x0c, 0xf4, 0xee, 0x56, 0x95, 0xed,\n  0xdb, 0xe6, 0xac, 0x2f, 0x31, 0x12, 0xf4, 0x0d, 0x67, 0xe7, 0xcb, 0xf1,\n  0x42, 0x8b, 0x2f, 0x78, 0xd7, 0x4d, 0x93, 0xf8, 0x43, 0xd2, 0xec, 0x55,\n  0xa1, 0xfb, 0x1c, 0xdf, 0x94, 0x4a, 0x73, 0x93, 0xdf, 0x6c, 0xf3, 0xa3,\n  0x8c, 0xde, 0x68, 0x36, 0xcd, 0x18, 0x0d, 0x89, 0x62, 0xb4, 0x23, 0x72,\n  0xb8, 0xf7, 0xf2, 0xa3, 0xb1, 0x52, 0xb4, 0xc3, 0x5a, 0x0a, 0xac, 0x8e,\n  0xe4, 0x6a, 0x7f, 0xe7, 0x39, 0x27, 0xef, 0x47, 0xb4, 0x53, 0x88, 0xb9,\n  0x44, 0xa7, 0x65, 0x5b, 0x9d, 0x0e, 0x57, 0x29, 0xd9, 0xd3, 0x9c, 0xf9,\n  0x38, 0x1d, 0x56, 0x6c, 0x75, 0x96, 0x1a, 0xdc, 0xf8, 0x1e, 0xf3, 0x00,\n  0x9d, 0xc2, 0xb3, 0x32, 0x87, 0x39, 0x7b, 0x95, 0xba, 0x50, 0x3d, 0xeb,\n  0x72, 0x68, 0x19, 0x9a, 0x29, 0x67, 0xdc, 0x66, 0x0d, 0xd6, 0xee, 0x3b,\n  0xd2, 0x71, 0x46, 0x50, 0x47, 0xc2, 0x58, 0x4d, 0x64, 0xa7, 0xa2, 0x78,\n  0xe9, 0x4e, 0x3a, 0x11, 0x33, 0x21, 0xe1, 0x91, 0x06, 0xa3, 0x54, 0xc0,\n  0x46, 0x29, 0xdf, 0x64, 0x8c, 0x6a, 0xb1, 0xb5, 0x0a, 0x3a, 0x1f, 0x27,\n  0xca, 0xbc, 0xab, 0xbb, 0xab, 0x90, 0x47, 0x54, 0x6f, 0x4f, 0x57, 0xb5,\n  0xbb, 0x9a, 0xef, 0x2c, 0x74, 0xb6, 0x65, 0x43, 0x01, 0x39, 0x05, 0x3b,\n  0x47, 0x0c, 0xd1, 0x3a, 0xef, 0x2e, 0x85, 0x9a, 0x08, 0x24, 0xab, 0xf8,\n  0x57, 0x93, 0x09, 0x2f, 0x61, 0x8b, 0x15, 0x13, 0x12, 0x57, 0xb3, 0x80,\n  0x36, 0x83, 0x49, 0xc6, 0x01, 0xf2, 0x14, 0xe6, 0x54, 0xde, 0xa3, 0xd7,\n  0xa3, 0x23, 0xf4, 0xc2, 0x74, 0x71, 0x26, 0x91, 0x9c, 0x2e, 0x0d, 0xad,\n  0x07, 0x02, 0xc7, 0x06, 0x66, 0xbb, 0x42, 0xc5, 0xb8, 0x37, 0x70, 0xf7,\n  0x85, 0xa1, 0x42, 0xbc, 0x98, 0x32, 0x68, 0x7c, 0xfb, 0x7f, 0xd7, 0xf3,\n  0x8d, 0x48, 0xf7, 0xcc, 0xd8, 0x63, 0xb3, 0x23, 0xe6, 0x97, 0x82, 0xb5,\n  0x8f, 0x55, 0x46, 0xf8, 0xda, 0x2f, 0x2b, 0xc2, 0x3d, 0xa7, 0x4b, 0x07,\n  0x77, 0x13, 0x25, 0xbf, 0xdc, 0x51, 0xee, 0x48, 0xb4, 0x4a, 0x1d, 0xd2,\n  0xa1, 0xde, 0x7b, 0xde, 0x1a, 0xec, 0x90, 0x7a, 0x4d, 0xd6, 0x52, 0x27,\n  0x72, 0xee, 0xc9, 0xa3, 0x4e, 0xff, 0xb1, 0xda, 0x17, 0xd6, 0x8e, 0x4c,\n  0xb4, 0xd6, 0xbe, 0x64, 0x45, 0x33, 0x13, 0xc3, 0x0b, 0x75, 0xda, 0xfd,\n  0x6f, 0x4c, 0xbb, 0x08, 0xe6, 0xef, 0x70, 0xca, 0xde, 0x0e, 0x91, 0x3e,\n  0x5a, 0x44, 0x33, 0x66, 0x0d, 0x2d, 0xd0, 0x01, 0xd9, 0x6e, 0x17, 0xb0,\n  0xdd, 0x2e, 0xa8, 0xc1, 0x8d, 0x40, 0xa3, 0x42, 0x9a, 0x35, 0x1d, 0x4f,\n  0x6f, 0xd2, 0xca, 0x20, 0xea, 0x89, 0xe1, 0xce, 0x29, 0x86, 0x7b, 0xae,\n  0xad, 0x25, 0x09, 0xcc, 0xbb, 0x58, 0x68, 0x6b, 0xcf, 0xb5, 0x67, 0xd2,\n  0xc9, 0xd6, 0x16, 0xbc, 0xbc, 0xc2, 0x09, 0x29, 0x01, 0xc6, 0xbb, 0x42,\n  0x33, 0xcc, 0xc8, 0x8d, 0xd7, 0xa6, 0x99, 0xbd, 0x29, 0x19, 0x45, 0x63,\n  0xdf, 0xa2, 0x8c, 0x0d, 0xa5, 0x5f, 0x47, 0xa9, 0x91, 0xd3, 0x7d, 0x77,\n  0x5f, 0xe8, 0x3b, 0xe2, 0xf7, 0xed, 0x47, 0xbd, 0xa3, 0xe3, 0x1c, 0x4a,\n  0xf1, 0x63, 0x23, 0xe3, 0x23, 0x5c, 0xed, 0xab, 0xfc, 0x78, 0xed, 0xf9,\n  0x6d, 0xa9, 0xd4, 0x7f, 0xdb, 0xee, 0x7b, 0xde, 0xda, 0xd1, 0x8e, 0xa9,\n  0xf3, 0x8f, 0xbb, 0x16, 0x17, 0x77, 0xd5, 0xd6, 0x96, 0x76, 0x2d, 0xed,\n  0xaa, 0x13, 0x86, 0x06, 0x1c, 0x6a, 0xe6, 0x46, 0xc2, 0xf3, 0x73, 0x60,\n  0x1f, 0x43, 0x00, 0xa1, 0x5d, 0x43, 0x33, 0x74, 0x84, 0xc4, 0x2a, 0x08,\n  0x24, 0x1d, 0x07, 0x2b, 0x6f, 0x07, 0xf2, 0x34, 0x6c, 0xe5, 0x73, 0x8a,\n  0xa4, 0x8b, 0xc7, 0x10, 0x95, 0x49, 0xc5, 0x72, 0xf1, 0x1c, 0xec, 0xe9,\n  0x43, 0x88, 0xb1, 0x8a, 0x87, 0x8d, 0xad, 0x26, 0x87, 0x9d, 0x46, 0xe0,\n  0x42, 0x03, 0xd9, 0xb6, 0xb8, 0xd9, 0xef, 0x38, 0x5f, 0x6e, 0xc2, 0xd5,\n  0x46, 0x99, 0xa9, 0xb3, 0x3d, 0xf7, 0xdc, 0xe0, 0x49, 0x5b, 0x7c, 0xde,\n  0xd8, 0xf8, 0xdc, 0xcc, 0x8e, 0x48, 0x8f, 0x2b, 0x74, 0xf9, 0xe6, 0xe9,\n  0xd3, 0xdd, 0x77, 0xde, 0xb4, 0xd6, 0x5f, 0xfd, 0x97, 0xb9, 0xc9, 0xa9,\n  0xb9, 0xa9, 0xd9, 0x49, 0x71, 0xf4, 0xf6, 0x1d, 0xf7, 0xbd, 0x4d, 0x25,\n  0x8c, 0x6a, 0x4f, 0x1c, 0xde, 0x7f, 0xc6, 0xed, 0x18, 0xd8, 0x4d, 0x80,\n  0xaa, 0x2f, 0x3f, 0xda, 0xd7, 0x37, 0x41, 0xb0, 0xaa, 0x0f, 0xef, 0x3f,\n  0x2b, 0xef, 0x6b, 0x95, 0x36, 0xfe, 0x11, 0xf7, 0xab, 0x13, 0xdb, 0xcc,\n  0x65, 0xbc, 0x52, 0x76, 0x57, 0x97, 0x82, 0x01, 0x9f, 0xc8, 0xd2, 0xa8,\n  0xaf, 0x17, 0xb7, 0x40, 0xc3, 0x33, 0x74, 0x26, 0xd5, 0x92, 0x60, 0xa1,\n  0x8f, 0xd8, 0x8a, 0x98, 0x48, 0xe2, 0x25, 0xc2, 0x37, 0xf7, 0x55, 0xd8,\n  0xd2, 0x57, 0xf0, 0xe2, 0xec, 0xa8, 0x76, 0x56, 0xdb, 0x8b, 0xf1, 0x68,\n  0xa3, 0xaf, 0x59, 0x94, 0xfd, 0x4f, 0xfb, 0xfa, 0xc6, 0x75, 0x61, 0xb1,\n  0xda, 0x9b, 0xd6, 0x45, 0x0c, 0x2f, 0x8c, 0x6b, 0x74, 0xbd, 0x94, 0xb6,\n  0x95, 0x6d, 0x99, 0xb6, 0x3b, 0x6f, 0xea, 0xc8, 0xda, 0xca, 0x76, 0x9e,\n  0xaf, 0xce, 0x58, 0x2c, 0xcf, 0x78, 0x23, 0x53, 0xb3, 0xef, 0x9d, 0x9b,\n  0xb4, 0xd9, 0x9e, 0xf1, 0x6d, 0x47, 0x0a, 0x53, 0xdc, 0x9f, 0x88, 0xdc,\n  0x30, 0x7d, 0xf9, 0x51, 0x4b, 0xdc, 0xdf, 0xc2, 0xf1, 0x7d, 0xc8, 0xd1,\n  0x3a, 0xed, 0x46, 0xbb, 0xb4, 0xeb, 0xb5, 0x2f, 0x9d, 0xdb, 0x97, 0x9f,\n  0x71, 0xd7, 0x7e, 0x47, 0xdf, 0x9c, 0xd7, 0x06, 0x4b, 0x89, 0x6a, 0x00,\n  0x86, 0x15, 0x29, 0x29, 0x97, 0x29, 0xd8, 0xbf, 0x04, 0xdb, 0x16, 0x4b,\n  0x02, 0xc9, 0x66, 0x33, 0x11, 0x86, 0xa8, 0xe4, 0xaa, 0x29, 0x34, 0x27,\n  0xb0, 0xf9, 0xdd, 0xe5, 0x43, 0xcb, 0xcb, 0x4a, 0xe2, 0x9a, 0x1b, 0x6f,\n  0xbc, 0xf5, 0xc0, 0x31, 0xf1, 0x4b, 0x5f, 0x52, 0x1f, 0x3b, 0x78, 0xeb,\n  0x8d, 0x63, 0x43, 0x43, 0xf2, 0x9e, 0xc5, 0xd2, 0x86, 0x91, 0xde, 0x47,\n  0x43, 0x76, 0xba, 0x38, 0x35, 0x54, 0xed, 0xf7, 0x22, 0xac, 0x5d, 0xe2,\n  0x29, 0x25, 0x80, 0xb7, 0xc1, 0x14, 0xd8, 0xa2, 0x0c, 0x2f, 0x43, 0xb8,\n  0x12, 0x87, 0xb6, 0xba, 0xfe, 0xa0, 0x70, 0xe6, 0xb3, 0x68, 0x26, 0x18,\n  0x90, 0x42, 0x81, 0x78, 0x30, 0x1e, 0x32, 0x01, 0xe4, 0x39, 0xd8, 0x9d,\n  0x0d, 0x70, 0x53, 0x02, 0x33, 0x4a, 0x92, 0xa2, 0x48, 0x75, 0x9f, 0x3d,\n  0xbb, 0x9d, 0x21, 0x29, 0x52, 0x00, 0x31, 0xe7, 0x3b, 0x03, 0x46, 0xaf,\n  0xd1, 0x10, 0xb7, 0x8f, 0x0e, 0xf6, 0x8d, 0xcd, 0x2f, 0x7f, 0xfa, 0xd0,\n  0x7a, 0x7b, 0x6b, 0x6b, 0xfe, 0x0b, 0x87, 0x8f, 0x74, 0xf6, 0xf6, 0x4e,\n  0x3c, 0x31, 0xc7, 0xb3, 0xa3, 0x02, 0x3f, 0x3f, 0xf8, 0xfe, 0xe9, 0x89,\n  0xbf, 0xa7, 0x5d, 0x33, 0xd3, 0xe5, 0x41, 0x8b, 0x71, 0x0e, 0x0d, 0x3d,\n  0x97, 0xcf, 0xb6, 0x6d, 0xe2, 0x2c, 0x15, 0xe8, 0x00, 0xa5, 0x85, 0x68,\n  0x14, 0x15, 0xc9, 0xa3, 0x8e, 0xf9, 0xc4, 0x04, 0x05, 0x07, 0xd9, 0x14,\n  0xba, 0x2c, 0x6f, 0x7d, 0x93, 0xdd, 0x7b, 0x93, 0xc5, 0xc8, 0xe8, 0x5c,\n  0x29, 0xc4, 0x6f, 0xaa, 0x27, 0x65, 0x54, 0xe8, 0x1d, 0x5b, 0x1e, 0xd1,\n  0x70, 0xae, 0xde, 0x1c, 0x7a, 0x91, 0x3d, 0x34, 0x5e, 0xfb, 0x1e, 0xed,\n  0xda, 0x9f, 0x2e, 0xb2, 0x0d, 0x8c, 0x7c, 0x82, 0xf9, 0xee, 0xa7, 0x6e,\n  0x92, 0x15, 0x29, 0xbd, 0xd7, 0x03, 0xd8, 0x32, 0x56, 0x35, 0x8b, 0xff,\n  0x40, 0x9c, 0x83, 0x89, 0x41, 0x2c, 0xe5, 0xf5, 0xd0, 0x88, 0x95, 0xaf,\n  0x31, 0x53, 0x0a, 0x62, 0xb7, 0x15, 0xb6, 0xe4, 0xf1, 0x84, 0x04, 0xd7,\n  0x54, 0x4a, 0xd6, 0xa1, 0x20, 0x0f, 0xb0, 0x93, 0xd0, 0x4e, 0x29, 0x83,\n  0x90, 0x80, 0x7a, 0xd1, 0x4a, 0xd5, 0x82, 0x28, 0x97, 0x03, 0x76, 0x52,\n  0xb5, 0xa2, 0x00, 0x87, 0x73, 0x7e, 0x82, 0x8e, 0xd4, 0x08, 0x25, 0x92,\n  0xdd, 0xc0, 0x9b, 0xf4, 0x2a, 0x07, 0xa4, 0xf9, 0x63, 0xf4, 0x61, 0x83,\n  0xe8, 0xcf, 0xd8, 0xcb, 0xee, 0x50, 0x57, 0xa8, 0x4b, 0x82, 0xae, 0x78,\n  0xc7, 0xd3, 0xd6, 0x98, 0xd1, 0xdd, 0x4f, 0x4b, 0x0c, 0xb3, 0x20, 0xe8,\n  0xcc, 0xde, 0xf4, 0x6c, 0x91, 0x74, 0xab, 0x54, 0xe0, 0x55, 0xad, 0xde,\n  0x10, 0x9c, 0x8d, 0x6f, 0xbc, 0x86, 0x5e, 0xc4, 0xfd, 0x0a, 0x52, 0x2d,\n  0xd4, 0xe3, 0x72, 0x7b, 0x6d, 0x80, 0xf9, 0xee, 0x03, 0x2f, 0x13, 0x9d,\n  0x06, 0xdb, 0xd9, 0x26, 0x3d, 0xcd, 0x73, 0xb0, 0x43, 0x65, 0x83, 0x0e,\n  0xbe, 0xe1, 0xba, 0xd2, 0xc9, 0x00, 0x5e, 0xb7, 0x1c, 0xcf, 0x70, 0x72,\n  0x96, 0x4a, 0x56, 0x90, 0xfb, 0xc3, 0xf3, 0x00, 0x82, 0x23, 0x1f, 0x2e,\n  0x49, 0x8d, 0x1a, 0x64, 0xce, 0xd4, 0x11, 0x37, 0xb7, 0xd4, 0x22, 0xdb,\n  0xed, 0x89, 0x58, 0x38, 0x04, 0xc8, 0xa7, 0x36, 0x0b, 0x5e, 0xa9, 0x41,\n  0x14, 0x54, 0x35, 0x3a, 0x2f, 0x6f, 0xc7, 0xc8, 0x3b, 0x18, 0x75, 0xd3,\n  0xbb, 0x2c, 0x53, 0x81, 0x69, 0xec, 0xbd, 0xa3, 0xb7, 0x60, 0x42, 0xa8,\n  0x75, 0x41, 0xc3, 0xe0, 0xae, 0xbc, 0xcf, 0x62, 0x08, 0xe8, 0xbb, 0x86,\n  0xb1, 0x82, 0x3d, 0x0b, 0xe4, 0x98, 0xfe, 0x14, 0x56, 0xa8, 0xed, 0x1e,\n  0x2b, 0xa1, 0x07, 0xc3, 0x1e, 0x9a, 0x9b, 0xc6, 0x8a, 0x34, 0xaf, 0x66,\n  0x66, 0x17, 0x89, 0x92, 0x8d, 0x06, 0xf7, 0xe7, 0xca, 0xb5, 0x9b, 0x41,\n  0xa3, 0x8e, 0x65, 0x65, 0xda, 0xd0, 0xf7, 0x62, 0xda, 0xa4, 0xb1, 0xcc,\n  0xf9, 0xb0, 0x82, 0xec, 0xde, 0x92, 0x84, 0x51, 0x0f, 0xe3, 0x11, 0x66,\n  0x91, 0xd9, 0x88, 0xad, 0x64, 0xbb, 0x85, 0x56, 0x09, 0x40, 0x1e, 0x0f,\n  0x83, 0x38, 0xaa, 0x25, 0x89, 0x15, 0xcd, 0xab, 0x4b, 0xb9, 0x3a, 0x91,\n  0x42, 0xe0, 0x40, 0xa5, 0x62, 0x85, 0x75, 0x79, 0xd4, 0x79, 0x4e, 0x2d,\n  0xcf, 0x08, 0x95, 0x8a, 0x39, 0x84, 0xc7, 0xfe, 0x3c, 0x4c, 0x8b, 0x68,\n  0xbd, 0x0e, 0x05, 0x56, 0xb6, 0x52, 0x51, 0x4d, 0x5f, 0x55, 0x6f, 0xa5,\n  0xea, 0xc2, 0x02, 0x2c, 0x9f, 0xcd, 0xc4, 0xa3, 0x70, 0x3a, 0xe1, 0x76,\n  0x92, 0x99, 0x92, 0x46, 0x69, 0x71, 0x9b, 0x99, 0xb2, 0x3d, 0xc5, 0x94,\n  0x79, 0x83, 0x1a, 0x84, 0xa3, 0x47, 0xb6, 0xce, 0xa0, 0xab, 0xa9, 0x47,\n  0x26, 0x93, 0xa7, 0x5a, 0xbb, 0xbe, 0x89, 0x88, 0xca, 0xa4, 0x7a, 0x03,\n  0x1d, 0xc9, 0x04, 0xf3, 0x05, 0x1b, 0xc4, 0xa4, 0x14, 0xbc, 0x62, 0x74,\n  0x18, 0xd3, 0x53, 0x8f, 0x35, 0x3d, 0xad, 0x5e, 0x45, 0x43, 0xa4, 0x18,\n  0x60, 0xfe, 0x60, 0xbd, 0x3c, 0x88, 0xa9, 0x63, 0xac, 0x27, 0x4c, 0xd8,\n  0x3c, 0x8a, 0x83, 0xb8, 0x52, 0xcc, 0xd3, 0x60, 0xe7, 0x8b, 0x1c, 0xba,\n  0x3d, 0x23, 0x59, 0x42, 0xb0, 0x70, 0x2d, 0x72, 0xb6, 0x55, 0x25, 0xd7,\n  0x6a, 0xdc, 0xb6, 0x6b, 0x47, 0x68, 0x29, 0xbb, 0x6c, 0x0f, 0xdb, 0x53,\n  0x8b, 0x49, 0x5a, 0x72, 0xeb, 0x74, 0x57, 0xbe, 0x85, 0x9e, 0x67, 0x59,\n  0x9d, 0x8e, 0xf0, 0x33, 0xc8, 0x07, 0x7c, 0x00, 0xbf, 0xd7, 0x4d, 0xc5,\n  0xa8, 0xd3, 0x55, 0x23, 0x88, 0x12, 0xda, 0x44, 0x8e, 0x88, 0x8c, 0x1a,\n  0x9a, 0x56, 0xde, 0xee, 0x07, 0x97, 0x43, 0x8e, 0x04, 0x07, 0x23, 0xa2,\n  0x58, 0x92, 0x63, 0xb2, 0xc6, 0xf1, 0xb7, 0xa7, 0xea, 0x85, 0x98, 0x51,\n  0x06, 0x62, 0x46, 0xeb, 0x15, 0x9b, 0x8a, 0xc9, 0x9a, 0x05, 0xa3, 0x59,\n  0x11, 0x30, 0x6e, 0xe4, 0x56, 0x0e, 0xc8, 0x4b, 0x4a, 0x1b, 0x4b, 0x72,\n  0x93, 0x1b, 0xbe, 0xa3, 0xe5, 0xe2, 0xa6, 0xc4, 0x41, 0x7f, 0xb2, 0x70,\n  0x58, 0x6e, 0x3c, 0xe9, 0x48, 0xb2, 0x33, 0x37, 0x91, 0x4c, 0x4e, 0x25,\n  0x8b, 0xc9, 0x64, 0xb1, 0x94, 0x88, 0xb7, 0x8b, 0xc7, 0x97, 0x91, 0x0d,\n  0x7a, 0x33, 0x82, 0x7b, 0x56, 0x7b, 0x35, 0x95, 0x9a, 0xc8, 0xb4, 0x4d,\n  0xa5, 0x7f, 0x27, 0x59, 0xee, 0x4c, 0x26, 0x3a, 0xcb, 0x32, 0x6d, 0x2d,\n  0x78, 0x1d, 0x1f, 0xa3, 0x6b, 0x94, 0x93, 0x9a, 0xae, 0x1a, 0xcc, 0xb8,\n  0x9d, 0x96, 0xcd, 0x7c, 0x09, 0x93, 0x7f, 0xe4, 0x81, 0x65, 0x5d, 0xd7,\n  0x98, 0x4f, 0x35, 0xd2, 0x26, 0x90, 0x7e, 0x59, 0x60, 0xa7, 0x1d, 0x41,\n  0x44, 0xc4, 0xe6, 0xd5, 0x95, 0x67, 0xa3, 0x52, 0x34, 0x4c, 0x44, 0x48,\n  0xf3, 0x51, 0xbe, 0xa9, 0xd8, 0x38, 0xb7, 0xb0, 0xfd, 0x68, 0x70, 0xdc,\n  0x16, 0x33, 0x60, 0x76, 0x3d, 0xf0, 0xa0, 0x23, 0xa6, 0xd5, 0xf9, 0xf1,\n  0xdf, 0x81, 0x45, 0x5e, 0x18, 0x65, 0xf9, 0x39, 0xf4, 0x8d, 0x77, 0xa8,\n  0x38, 0xf8, 0x00, 0xf2, 0x0a, 0xd3, 0xde, 0x4a, 0xe4, 0xd5, 0xee, 0x67,\n  0x30, 0x4f, 0x64, 0x91, 0x62, 0x87, 0xfa, 0x08, 0x85, 0x39, 0x72, 0xf2,\n  0x08, 0xee, 0x6b, 0x27, 0x65, 0x67, 0x03, 0x84, 0x14, 0x53, 0xc6, 0xb3,\n  0x59, 0x4e, 0xf6, 0x5d, 0xa6, 0xeb, 0xfe, 0xba, 0xe7, 0xe1, 0xec, 0x15,\n  0xc6, 0xd5, 0x4a, 0x59, 0x25, 0x4b, 0xc4, 0xc4, 0xe3, 0x46, 0x22, 0xf9,\n  0xb4, 0xad, 0x39, 0x7b, 0x78, 0xa9, 0x44, 0x5b, 0xc1, 0x9c, 0xde, 0xd3,\n  0xb3, 0xb2, 0xba, 0xdc, 0xd9, 0xb3, 0x34, 0x8a, 0x46, 0x6b, 0x9f, 0xc0,\n  0x26, 0xe3, 0xc1, 0x23, 0xe8, 0x40, 0xed, 0x29, 0xb0, 0xa6, 0x87, 0xc9,\n  0xdc, 0x60, 0x71, 0xfb, 0x8e, 0x10, 0x6c, 0xdb, 0x00, 0x75, 0xdd, 0x33,\n  0x7a, 0xa4, 0xe6, 0xea, 0x2d, 0x4c, 0xb0, 0x78, 0x3a, 0x8a, 0x2a, 0x9a,\n  0x53, 0x43, 0x24, 0x19, 0x39, 0x1d, 0x04, 0x67, 0x01, 0x01, 0x91, 0x33,\n  0x42, 0x08, 0x13, 0x21, 0x1f, 0x01, 0x43, 0x3f, 0xb6, 0x6d, 0xd5, 0x03,\n  0x94, 0x52, 0x93, 0x64, 0x4b, 0x38, 0x2f, 0xe0, 0x76, 0x1b, 0x03, 0x7e,\n  0xaf, 0x1b, 0x37, 0x5a, 0x86, 0xd8, 0x83, 0x13, 0x63, 0x0b, 0x64, 0xc1,\n  0x0a, 0x29, 0x99, 0xb0, 0x1a, 0xbd, 0x28, 0x49, 0xf2, 0x71, 0x79, 0x39,\n  0xc4, 0x4e, 0x2d, 0x23, 0xeb, 0xf2, 0xdc, 0x5c, 0xbd, 0x2f, 0x53, 0x1f,\n  0xea, 0xec, 0x99, 0x19, 0xe7, 0x6b, 0x3f, 0x46, 0x81, 0x5f, 0xfc, 0x22,\n  0x91, 0x18, 0xf8, 0x16, 0xe9, 0x93, 0x64, 0x1e, 0x1b, 0x9c, 0x9d, 0x81,\n  0xfe, 0x60, 0x7a, 0x33, 0x23, 0x78, 0xae, 0x6b, 0xb0, 0xf6, 0x74, 0xef,\n  0xb3, 0xa9, 0x28, 0xcd, 0x36, 0x3a, 0x14, 0xa1, 0x30, 0x39, 0x11, 0xc7,\n  0x5e, 0x26, 0x9b, 0x59, 0x02, 0x03, 0x19, 0xab, 0x4e, 0x93, 0xe4, 0x77,\n  0xf4, 0x21, 0x35, 0xd6, 0xa2, 0x15, 0x3e, 0x9d, 0xae, 0x57, 0x03, 0x77,\n  0x22, 0x85, 0x51, 0x8b, 0x48, 0xe1, 0x3f, 0x27, 0xeb, 0xf5, 0xf1, 0xc2,\n  0x91, 0x19, 0x76, 0x40, 0xa7, 0x25, 0x68, 0x35, 0x12, 0x78, 0x50, 0xba,\n  0x5d, 0x76, 0x2b, 0x96, 0x5a, 0x59, 0x5d, 0x16, 0x73, 0x23, 0x0d, 0xd2,\n  0x68, 0x65, 0x6e, 0xd4, 0xd8, 0x27, 0x65, 0xb6, 0x8c, 0x50, 0x81, 0xa8,\n  0x05, 0x8d, 0xc3, 0x52, 0xac, 0x67, 0x81, 0x97, 0xf1, 0xf3, 0xae, 0x40,\n  0xc0, 0x85, 0x7f, 0x3e, 0xba, 0x7b, 0xf7, 0x72, 0xb1, 0xac, 0x6c, 0x17,\n  0x8d, 0xe8, 0x39, 0x3b, 0x6c, 0x17, 0x09, 0xae, 0x65, 0xbc, 0xbe, 0x83,\n  0x01, 0xb7, 0x3b, 0x10, 0x74, 0x5f, 0xf9, 0xdb, 0x7d, 0x6b, 0x78, 0x34,\n  0xff, 0x10, 0xb6, 0x8a, 0xce, 0x7f, 0xf0, 0x8e, 0x03, 0x87, 0x91, 0xe3,\n  0xca, 0x0f, 0xc7, 0x12, 0x2d, 0xcb, 0x29, 0x19, 0xa7, 0x73, 0x11, 0xd3,\n  0x62, 0x82, 0x96, 0x90, 0x41, 0xfd, 0x12, 0xf3, 0x38, 0xed, 0xfa, 0x0b,\n  0x05, 0x29, 0x92, 0x76, 0x11, 0xab, 0x8c, 0xac, 0x19, 0x7a, 0x9e, 0xe4,\n  0x08, 0xdb, 0x5d, 0xd5, 0x78, 0x70, 0xa7, 0xdd, 0x5a, 0x92, 0x82, 0x57,\n  0x26, 0x97, 0x83, 0x80, 0xf8, 0x2a, 0xe7, 0xc2, 0x98, 0xb4, 0xc4, 0xa9,\n  0xe2, 0x64, 0x3d, 0x19, 0x12, 0x39, 0x49, 0xae, 0xef, 0x8a, 0xe0, 0xeb,\n  0xd3, 0x0a, 0xda, 0x98, 0xcc, 0x9c, 0xd5, 0x91, 0x68, 0xc4, 0x64, 0x91,\n  0x78, 0x9d, 0x37, 0x65, 0xb9, 0xea, 0x48, 0xb8, 0xae, 0x01, 0x11, 0x83,\n  0x02, 0x2f, 0xa7, 0x1f, 0xc0, 0xe4, 0x84, 0xfe, 0xb9, 0x60, 0xe7, 0x27,\n  0x14, 0xd4, 0xfb, 0xf4, 0xa1, 0x74, 0xef, 0x28, 0x7a, 0xeb, 0xff, 0x84,\n  0x49, 0x4a, 0x7a, 0x04, 0x23, 0xfc, 0x52, 0x4b, 0x8c, 0xe3, 0x06, 0x74,\n  0x13, 0x80, 0x39, 0xf9, 0x33, 0xac, 0x9f, 0x85, 0x68, 0x0f, 0xcd, 0xa3,\n  0xb7, 0x13, 0xdc, 0x88, 0x9f, 0x6d, 0x68, 0xe9, 0x9b, 0xe9, 0x20, 0xb6,\n  0x8f, 0x32, 0xd4, 0x63, 0xf2, 0x91, 0x91, 0x59, 0x8f, 0x57, 0xb4, 0xd3,\n  0xa6, 0x13, 0x58, 0x8e, 0xa3, 0x5d, 0x88, 0xe7, 0x18, 0xc8, 0x1b, 0x81,\n  0x2f, 0xb2, 0x5b, 0x2f, 0x2a, 0x27, 0x4c, 0x41, 0xc5, 0xe5, 0xe1, 0x04,\n  0xb5, 0x69, 0x36, 0x91, 0x28, 0x36, 0x04, 0x5a, 0x34, 0xd9, 0x12, 0x8a,\n  0x34, 0xaa, 0x28, 0x5b, 0x42, 0xca, 0xd9, 0xc3, 0x96, 0x6a, 0xc4, 0x71,\n  0x26, 0xdd, 0x12, 0x8b, 0x00, 0x74, 0x91, 0x19, 0xab, 0x2f, 0xf2, 0x96,\n  0x58, 0xdd, 0x71, 0x26, 0xce, 0x48, 0x16, 0x72, 0x7e, 0x54, 0xb7, 0xa5,\n  0xc0, 0x67, 0xdb, 0x51, 0xf7, 0x0e, 0xdc, 0xc2, 0x11, 0x5f, 0xa9, 0x8c,\n  0xf8, 0xc7, 0x9e, 0xd9, 0xff, 0x2f, 0xfb, 0x74, 0x7e, 0xab, 0xd9, 0x69,\n  0x08, 0x9a, 0x72, 0x19, 0xe3, 0xcc, 0x7b, 0xf7, 0x7e, 0x69, 0xde, 0x54,\n  0x0c, 0x77, 0x8f, 0x8d, 0x30, 0x51, 0x9f, 0x5f, 0x8a, 0xf8, 0x7c, 0xd1,\n  0x9f, 0x8e, 0xcc, 0x3d, 0x57, 0x7b, 0x1a, 0xbd, 0xff, 0x5f, 0xc3, 0x5e,\n  0x7e, 0x88, 0xe3, 0x73, 0xd9, 0x17, 0x50, 0xa4, 0xf6, 0xc0, 0xe7, 0xec,\n  0xee, 0xb1, 0xf6, 0xae, 0x89, 0xbb, 0x7d, 0x91, 0x48, 0x20, 0x10, 0x91,\n  0x28, 0xb4, 0xf1, 0x2f, 0x98, 0x66, 0x49, 0x4c, 0xa3, 0x2c, 0xb2, 0x2b,\n  0xa7, 0x70, 0x26, 0x4c, 0xa1, 0xa4, 0xc7, 0x69, 0x14, 0xb1, 0x08, 0x92,\n  0xc2, 0x98, 0x98, 0xcc, 0x94, 0x92, 0x44, 0x13, 0x8a, 0xd8, 0xab, 0x8b,\n  0xaa, 0xf6, 0xe6, 0xab, 0x61, 0xc4, 0x21, 0x09, 0x11, 0xfd, 0x47, 0x49,\n  0x59, 0x1b, 0x04, 0x49, 0x85, 0xa8, 0x0b, 0x4d, 0x14, 0x84, 0xb9, 0xc3,\n  0x1f, 0x22, 0x9b, 0xb3, 0x67, 0xf9, 0x3a, 0x5a, 0x74, 0xa8, 0x49, 0x1d,\n  0xbd, 0x66, 0x45, 0x68, 0x45, 0xb4, 0x51, 0x71, 0x2b, 0xc1, 0xaf, 0xaa,\n  0x5c, 0x6d, 0xbb, 0x46, 0x3d, 0x6a, 0xb3, 0x9a, 0x7c, 0x26, 0x5a, 0xbf,\n  0x05, 0x00, 0xe6, 0x8d, 0x78, 0xe2, 0x64, 0xa9, 0x4c, 0x24, 0x62, 0x8d,\n  0x24, 0xcc, 0x26, 0xb5, 0xce, 0x97, 0x12, 0x94, 0xe5, 0xd8, 0x5e, 0x2e,\n  0xbf, 0x71, 0x88, 0xea, 0x27, 0x80, 0x20, 0x0a, 0xe2, 0x80, 0x63, 0x60,\n  0xef, 0x30, 0x0a, 0x7a, 0xbb, 0xe5, 0xf6, 0x55, 0x3c, 0x3c, 0x26, 0xa7,\n  0x21, 0x60, 0xce, 0xa5, 0x4d, 0xb3, 0x8f, 0xef, 0x7d, 0x71, 0x9f, 0x29,\n  0x16, 0x12, 0x6d, 0x5a, 0x4f, 0xbc, 0xab, 0xdb, 0xdd, 0xbf, 0xe2, 0x8c,\n  0x65, 0xa3, 0xaf, 0xfc, 0xe9, 0xac, 0x57, 0x2d, 0xc5, 0xff, 0xfd, 0x35,\n  0x79, 0x80, 0xda, 0x5a, 0xbf, 0x88, 0xe2, 0xb5, 0xfb, 0xbf, 0x9f, 0xea,\n  0xa0, 0xe9, 0x21, 0x71, 0x62, 0xe4, 0x8f, 0xfe, 0x24, 0x5f, 0xf1, 0x90,\n  0xdc, 0x27, 0xaf, 0xd1, 0xeb, 0x04, 0xab, 0x3d, 0x4c, 0x9d, 0xad, 0x1a,\n  0x75, 0xa2, 0x00, 0x7e, 0x9c, 0x98, 0x0d, 0xe9, 0xc9, 0x3c, 0xad, 0xfb,\n  0x72, 0xc8, 0xe0, 0x27, 0x27, 0x60, 0x29, 0x9e, 0x96, 0x37, 0x22, 0x51,\n  0x93, 0x2f, 0xc7, 0xd6, 0x52, 0xac, 0x32, 0xc8, 0x55, 0xb6, 0xf8, 0x72,\n  0x04, 0x3c, 0x2e, 0x3c, 0x31, 0x35, 0x6a, 0x15, 0x9e, 0x9a, 0x80, 0xed,\n  0x5e, 0x9f, 0x9a, 0x82, 0x64, 0x61, 0x0a, 0x8e, 0xf2, 0xb5, 0xe6, 0xe3,\n  0x4f, 0x32, 0x5d, 0xb6, 0x13, 0x6f, 0x3f, 0xfc, 0x67, 0xcf, 0x1c, 0x7d,\n  0xd3, 0x9b, 0x0e, 0x7f, 0x6c, 0x4c, 0x5f, 0x8c, 0x96, 0x07, 0xfb, 0xd9,\n  0xb0, 0xd7, 0x1b, 0x86, 0x1f, 0x31, 0x19, 0x78, 0xcf, 0xdf, 0x23, 0x0b,\n  0xe2, 0x5f, 0x78, 0xa1, 0xf6, 0x8b, 0x63, 0x9e, 0xc0, 0x60, 0xa1, 0x7d,\n  0xf8, 0x56, 0x5f, 0x28, 0xec, 0xf3, 0x49, 0x61, 0x39, 0x4e, 0xe8, 0x0e,\n  0x3c, 0xff, 0x28, 0x92, 0x13, 0x4e, 0xaa, 0x06, 0xd5, 0x3c, 0x16, 0xc5,\n  0x72, 0x98, 0x3c, 0x75, 0x5a, 0x61, 0x1f, 0x0c, 0x73, 0x96, 0x99, 0x01,\n  0x58, 0x77, 0x90, 0xba, 0x4a, 0x53, 0x2c, 0x52, 0x1c, 0x49, 0x2f, 0x7d,\n  0xe2, 0xc8, 0x9b, 0xdf, 0x74, 0xf8, 0x99, 0xbf, 0x38, 0xfa, 0x70, 0xed,\n  0xab, 0x87, 0x91, 0x1e, 0x69, 0xe0, 0x1d, 0xb5, 0x1f, 0xbf, 0x54, 0xab,\n  0xc0, 0xda, 0x87, 0xe7, 0x9e, 0x50, 0xe8, 0x36, 0x58, 0xad, 0x0a, 0x24,\n  0x91, 0x8d, 0x0d, 0x71, 0xb4, 0x8a, 0xd0, 0x0d, 0x3c, 0xc8, 0x79, 0x9a,\n  0x3b, 0xa1, 0xbc, 0x89, 0xe7, 0x65, 0x1e, 0x45, 0xd2, 0x35, 0x9e, 0x85,\n  0x94, 0xa7, 0x40, 0x0f, 0x80, 0x1d, 0x8f, 0x44, 0xcc, 0x66, 0x15, 0x7e,\n  0x33, 0x66, 0xfa, 0x5b, 0xa9, 0x40, 0x86, 0x1c, 0xa1, 0x26, 0x5a, 0xdc,\n  0x89, 0x76, 0xca, 0x4d, 0x1a, 0x97, 0xa9, 0xd0, 0x95, 0xe9, 0xb6, 0xae,\n  0xd5, 0xbe, 0x46, 0x4f, 0xd4, 0xa9, 0xf1, 0x0a, 0xaa, 0xc9, 0xad, 0x54,\n  0x28, 0x91, 0x0c, 0xbc, 0xab, 0x56, 0x41, 0x07, 0xb7, 0xd0, 0xe3, 0x16,\n  0x85, 0x1e, 0x4e, 0xea, 0x48, 0x55, 0x0d, 0x09, 0x3c, 0x58, 0x40, 0x62,\n  0x97, 0x97, 0x92, 0x9f, 0x44, 0xff, 0x52, 0x17, 0x94, 0x71, 0x64, 0xd9,\n  0x93, 0x30, 0x98, 0xdc, 0x21, 0x48, 0x88, 0x46, 0x90, 0xc3, 0x02, 0x50,\n  0x81, 0xc5, 0x53, 0xfe, 0x1a, 0x35, 0xe4, 0x1c, 0x69, 0x4e, 0xca, 0x61,\n  0x36, 0xdb, 0xcd, 0x26, 0x01, 0x5b, 0xa0, 0x9b, 0xb3, 0x7b, 0x93, 0xb4,\n  0x0c, 0x9e, 0xc7, 0xf7, 0x77, 0xe8, 0x78, 0xad, 0xd3, 0xf1, 0x77, 0x9f,\n  0x3c, 0xfa, 0xe0, 0xfd, 0x87, 0x9f, 0xfa, 0xb3, 0xa3, 0x0f, 0x7e, 0xda,\n  0x97, 0xca, 0x84, 0x61, 0xce, 0x6a, 0xa3, 0x12, 0x5a, 0x41, 0xba, 0x2f,\n  0x7e, 0xb1, 0xf6, 0xf3, 0xda, 0xbf, 0x7d, 0xa5, 0xf6, 0x57, 0xd9, 0x1e,\n  0x3f, 0xb1, 0xbf, 0x71, 0xbb, 0xad, 0x24, 0x47, 0x72, 0xa5, 0xda, 0x89,\n  0x95, 0x48, 0x0e, 0xd2, 0xeb, 0x28, 0x69, 0xa9, 0x94, 0xf4, 0xb2, 0x14,\n  0x11, 0x9b, 0x4a, 0xf2, 0x8b, 0xf3, 0x0d, 0x65, 0x0b, 0xb3, 0x47, 0x8b,\n  0x64, 0x49, 0x44, 0xc3, 0x20, 0x15, 0xb8, 0xab, 0x92, 0xc6, 0xc0, 0xf9,\n  0xeb, 0x56, 0xf5, 0xa5, 0x40, 0x5b, 0xaf, 0xbf, 0xd8, 0x75, 0xa8, 0x25,\n  0xbd, 0xd6, 0x39, 0x01, 0x49, 0x6b, 0xca, 0xb7, 0x2a, 0x8a, 0xcc, 0xb2,\n  0xea, 0xec, 0x2d, 0x26, 0xe3, 0x0e, 0x8b, 0x63, 0x76, 0x54, 0x6d, 0x6d,\n  0xb1, 0xed, 0xdc, 0xd4, 0x68, 0x76, 0xe1, 0xd1, 0x2e, 0x2b, 0x3e, 0x41,\n  0x80, 0xf9, 0x7e, 0xba, 0xaa, 0x35, 0x22, 0x06, 0xb9, 0x4d, 0x6a, 0x80,\n  0xc8, 0x54, 0xd6, 0x90, 0x1b, 0x4e, 0xbe, 0xeb, 0x6e, 0x62, 0x70, 0x94,\n  0xa7, 0x58, 0x6b, 0x64, 0x09, 0xf9, 0x9b, 0x0b, 0x09, 0x59, 0xe5, 0x1a,\n  0x8d, 0x15, 0xe4, 0x0a, 0xf8, 0x21, 0x4f, 0xa5, 0xbf, 0x25, 0xd0, 0xe2,\n  0x72, 0xda, 0x2c, 0x04, 0x9b, 0xce, 0x87, 0x7c, 0x6a, 0x5d, 0x73, 0x2a,\n  0xd7, 0x42, 0xb3, 0x7f, 0x8b, 0x6d, 0x1b, 0xd7, 0x30, 0x64, 0x3d, 0x72,\n  0xcb, 0xcd, 0x47, 0xfa, 0xe6, 0x9c, 0xac, 0x26, 0x1f, 0x33, 0x05, 0x05,\n  0xd6, 0xac, 0x32, 0x39, 0x47, 0xf4, 0xac, 0x6b, 0x36, 0xbf, 0x32, 0x30,\n  0xbc, 0x73, 0x6c, 0x74, 0x54, 0x7c, 0xe8, 0xcd, 0x6f, 0x7e, 0xa0, 0x55,\n  0x6a, 0x95, 0x54, 0x5c, 0x95, 0x66, 0x5c, 0x81, 0xda, 0xfe, 0xe1, 0x50,\n  0x76, 0xfc, 0xe4, 0x11, 0xe3, 0xfe, 0x7d, 0x27, 0x0e, 0x1e, 0x38, 0xaf,\n  0x60, 0xad, 0x6f, 0x3c, 0x81, 0xf6, 0xa1, 0xe3, 0x68, 0x84, 0x9a, 0xa4,\n  0x9e, 0xa8, 0x7b, 0x48, 0xa1, 0x8f, 0x6f, 0x3c, 0xa1, 0xe0, 0x7b, 0x40,\n  0xf9, 0x4e, 0x52, 0x3e, 0x73, 0xad, 0x72, 0xea, 0x1c, 0x29, 0x9f, 0xbd,\n  0x56, 0x39, 0x9d, 0xa2, 0x5e, 0xc6, 0xe5, 0x73, 0xd7, 0x7c, 0xfe, 0x3e,\n  0x52, 0x3e, 0x7f, 0x8d, 0x72, 0x23, 0x3a, 0x45, 0xca, 0x17, 0x36, 0xcb,\n  0xe9, 0xcd, 0xf2, 0xd0, 0xc6, 0xe3, 0xc8, 0x4d, 0xca, 0x77, 0x6d, 0x7b,\n  0xbf, 0xb8, 0xf1, 0x38, 0xf5, 0x4d, 0x94, 0xc2, 0xe5, 0x4b, 0xdb, 0x96,\n  0x87, 0xa9, 0xb7, 0xa0, 0xbd, 0xf4, 0x1a, 0x1a, 0x55, 0xcd, 0x36, 0xfb,\n  0x88, 0xa1, 0x66, 0x3c, 0x7a, 0x7c, 0x1d, 0x7d, 0x8f, 0x7e, 0x1e, 0x8d,\n  0x52, 0x2f, 0x5f, 0x1b, 0xb3, 0x1e, 0x3f, 0x67, 0x1f, 0xfd, 0x43, 0xfc,\n  0x9c, 0xd4, 0xb5, 0x9e, 0xb3, 0xb1, 0x81, 0x9f, 0x63, 0x82, 0x3a, 0xea,\n  0xe7, 0xae, 0xf9, 0x2e, 0x06, 0x05, 0xa8, 0x57, 0xa1, 0x0e, 0xdb, 0x72,\n  0xcd, 0x3a, 0x5a, 0xe4, 0x42, 0x77, 0x42, 0x9b, 0xd5, 0x5f, 0xdb, 0xbe,\n  0x0e, 0x5e, 0x63, 0xdf, 0xa6, 0x6f, 0x40, 0xab, 0xcc, 0x3f, 0x61, 0x9d,\n  0x9c, 0x7f, 0x5a, 0x4b, 0xa1, 0x7c, 0x0a, 0xd9, 0x1a, 0xe8, 0xab, 0x42,\n  0xa9, 0x8e, 0x86, 0xdb, 0x8e, 0x0e, 0x4a, 0x01, 0xab, 0xc7, 0x3a, 0x50,\n  0x8d, 0x04, 0x6c, 0x6e, 0x5b, 0x3f, 0xf3, 0x4f, 0x45, 0xc1, 0x67, 0x35,\n  0x85, 0x23, 0x71, 0x5b, 0xa6, 0x87, 0xcf, 0xab, 0x7c, 0x16, 0xb3, 0x24,\n  0xc5, 0x6d, 0xe9, 0x5e, 0xf2, 0xde, 0x3e, 0xdc, 0xb6, 0x5b, 0x81, 0x0e,\n  0x04, 0xa7, 0x7b, 0xfb, 0xb6, 0x99, 0x91, 0x93, 0xfa, 0x32, 0xa9, 0x63,\n  0xbd, 0x46, 0xdb, 0xe4, 0xf5, 0x65, 0xa2, 0xbf, 0x4a, 0x72, 0xff, 0x05,\n  0xb0, 0x4d, 0xa8, 0x58, 0x25, 0xa9, 0xad, 0xd9, 0xfe, 0xa2, 0x12, 0xa4,\n  0xa2, 0x43, 0xd6, 0x26, 0x9f, 0x8a, 0x2d, 0x99, 0xfe, 0x68, 0x53, 0xdb,\n  0xf1, 0x5d, 0xb7, 0x5c, 0xd7, 0x7a, 0x7c, 0xe7, 0xcd, 0x37, 0xd6, 0x2e,\n  0x0d, 0xce, 0xcf, 0x0d, 0x0f, 0xcf, 0xcd, 0x0f, 0xa2, 0x63, 0xd7, 0xfd,\n  0xf6, 0xf2, 0x67, 0x3e, 0x72, 0xfd, 0x87, 0x96, 0x3e, 0xfd, 0xd1, 0xb7,\n  0x3f, 0xf2, 0xb6, 0x77, 0x3c, 0xf2, 0xc8, 0x23, 0xf5, 0xd8, 0x12, 0x24,\n  0xd1, 0x9f, 0xa7, 0xb4, 0x54, 0xa8, 0xea, 0x57, 0xab, 0xd8, 0x7a, 0x7e,\n  0xc6, 0x18, 0xd9, 0x1e, 0x90, 0xf3, 0x32, 0x6a, 0x29, 0xad, 0x9b, 0x11,\n  0x1c, 0xa9, 0x02, 0xe4, 0x63, 0x84, 0x53, 0x9e, 0x78, 0xb9, 0x60, 0xfa,\n  0x02, 0x4d, 0x1b, 0xdd, 0xd6, 0xa9, 0xec, 0xa7, 0xc7, 0xd1, 0x7f, 0xa4,\n  0x8a, 0x5e, 0xa3, 0xdd, 0xd4, 0xdb, 0xfd, 0xae, 0x2b, 0xed, 0xf0, 0xcc,\n  0x18, 0xfe, 0x55, 0xa3, 0x5f, 0xa2, 0x3c, 0x54, 0x5b, 0x35, 0xa3, 0xd3,\n  0x82, 0x2d, 0x8e, 0x25, 0x07, 0x3d, 0x55, 0xdf, 0xc6, 0x23, 0x1d, 0x92,\n  0x41, 0xc8, 0x49, 0x02, 0x12, 0x5c, 0xd1, 0x13, 0x8f, 0x26, 0x38, 0xc8,\n  0x27, 0x5c, 0xaa, 0x43, 0x57, 0x35, 0x65, 0x66, 0xc6, 0x6f, 0xb4, 0x85,\n  0x6c, 0xb1, 0xe7, 0xda, 0x27, 0x62, 0x23, 0x1d, 0xc5, 0xd9, 0x64, 0x6b,\n  0xcb, 0xe9, 0xa1, 0x23, 0xd7, 0x67, 0x77, 0x94, 0xdf, 0x89, 0xd6, 0xc7,\n  0xff, 0xac, 0x7d, 0x71, 0xbe, 0xad, 0xbb, 0x27, 0x12, 0xec, 0x96, 0x72,\n  0x47, 0x57, 0x3a, 0x0e, 0x1d, 0x68, 0x7f, 0x3b, 0x3b, 0x27, 0x8f, 0x35,\n  0xf8, 0x72, 0x32, 0xb8, 0x1d, 0x2d, 0x10, 0xdf, 0x1d, 0x81, 0xfc, 0x41,\n  0x58, 0x2d, 0x33, 0x60, 0x9e, 0xaa, 0xc7, 0x9d, 0x84, 0x83, 0x10, 0x16,\n  0x4d, 0x02, 0xec, 0x02, 0x02, 0xd8, 0x05, 0x45, 0xe3, 0x4e, 0x4d, 0x37,\n  0xa5, 0xb1, 0x88, 0x46, 0x42, 0x91, 0x68, 0x0b, 0x24, 0x15, 0x42, 0x0d,\n  0x60, 0xee, 0x37, 0x60, 0x61, 0x5e, 0x9d, 0x4a, 0x1a, 0xfd, 0x78, 0x6e,\n  0x68, 0xd7, 0x62, 0xd7, 0x2d, 0x07, 0x3a, 0x0e, 0xa6, 0x33, 0xc7, 0xdb,\n  0x0e, 0xee, 0x5c, 0x3f, 0x30, 0x3c, 0xb2, 0xbc, 0x67, 0xa4, 0xd2, 0xb5,\n  0x23, 0x91, 0x8e, 0x9d, 0x1f, 0x3b, 0x77, 0x9a, 0x96, 0xc6, 0x76, 0xea,\n  0x59, 0x71, 0x79, 0xb4, 0x77, 0xb5, 0xdd, 0x64, 0xdf, 0x61, 0x77, 0x4d,\n  0x0e, 0x0c, 0x76, 0x4f, 0x4e, 0xf4, 0x14, 0x3b, 0xc3, 0xee, 0x8a, 0x3f,\n  0x7d, 0x04, 0xe6, 0x02, 0xe4, 0x5f, 0x4a, 0xd0, 0x2f, 0x52, 0x22, 0xb6,\n  0x45, 0xcb, 0xd5, 0xa2, 0x01, 0x02, 0x7e, 0x11, 0x26, 0xdb, 0x14, 0xa0,\n  0x5e, 0x31, 0x24, 0x64, 0x0e, 0x12, 0x8c, 0xc7, 0xea, 0x09, 0xc6, 0x35,\n  0x1a, 0x8a, 0xd2, 0x58, 0x35, 0x56, 0x48, 0xc8, 0x6e, 0x32, 0x99, 0x4d,\n  0x2a, 0x3c, 0x47, 0x42, 0xa5, 0x50, 0x09, 0x41, 0x36, 0x64, 0xc9, 0x16,\n  0x57, 0xdc, 0x70, 0x04, 0x06, 0x9d, 0xac, 0xfd, 0x3e, 0x9a, 0xdb, 0x73,\n  0xfc, 0xf8, 0x4e, 0x9a, 0x66, 0xc5, 0xa0, 0xe6, 0xf9, 0x0f, 0x4c, 0xa2,\n  0xef, 0xd5, 0xa4, 0xd9, 0x0f, 0xfc, 0xfb, 0xf7, 0x8a, 0xd3, 0x2e, 0x4b,\n  0xde, 0x50, 0xfb, 0x7b, 0xa0, 0x5d, 0x1f, 0xa1, 0xdd, 0xe7, 0x29, 0x3f,\n  0xd9, 0xa5, 0x75, 0xd0, 0x0c, 0x65, 0x17, 0xf1, 0x8b, 0xd5, 0xe0, 0x1d,\n  0x2f, 0x03, 0xaf, 0xd3, 0x10, 0x55, 0xad, 0xec, 0xd3, 0xc6, 0xa6, 0xeb,\n  0x8e, 0xfd, 0x69, 0x80, 0x5f, 0x87, 0xd4, 0x42, 0x0a, 0xb8, 0x28, 0x6c,\n  0x30, 0x0a, 0x4d, 0x86, 0x5a, 0x13, 0xe9, 0x80, 0x62, 0x96, 0x90, 0x2d,\n  0x24, 0xb4, 0xb7, 0x23, 0xcb, 0x99, 0xbb, 0x1e, 0xba, 0x54, 0x5e, 0x0d,\n  0x45, 0xd6, 0x5a, 0x67, 0x57, 0x77, 0xed, 0xf3, 0x8e, 0xd9, 0xd3, 0x1e,\n  0x74, 0xac, 0xf6, 0x03, 0x93, 0xa9, 0x0b, 0x3d, 0x7b, 0xe6, 0xc8, 0xd9,\n  0x3b, 0xac, 0x96, 0x05, 0x4c, 0xa7, 0xd9, 0x91, 0x49, 0x91, 0xf3, 0xa2,\n  0xf9, 0xb9, 0x2f, 0x32, 0xaa, 0xcd, 0x35, 0xa3, 0xc3, 0x63, 0xec, 0xc7,\n  0xe3, 0xd5, 0x5b, 0xed, 0x86, 0x9d, 0x59, 0x35, 0xc9, 0x16, 0xc5, 0x2a,\n  0x1a, 0x0a, 0x4b, 0x73, 0x8d, 0xdd, 0x87, 0x14, 0xa1, 0x56, 0x3d, 0x2f,\n  0x4a, 0x30, 0x10, 0x8b, 0x04, 0xd2, 0xc1, 0x74, 0x24, 0x1e, 0x8d, 0x08,\n  0x98, 0x5c, 0x16, 0x25, 0xd6, 0x93, 0xc8, 0x16, 0x48, 0x6e, 0xd3, 0xa4,\n  0xa6, 0xc4, 0x1c, 0xf5, 0x36, 0x93, 0xd8, 0xfe, 0xb2, 0x67, 0xf4, 0xf2,\n  0x51, 0x5b, 0xc1, 0x68, 0xce, 0x38, 0x86, 0xf7, 0x96, 0x9c, 0x0c, 0xef,\n  0xd8, 0x51, 0xdd, 0x77, 0xe1, 0xe2, 0xf1, 0xa1, 0x33, 0xfd, 0xaf, 0xf6,\n  0xcd, 0x0c, 0x0f, 0xb7, 0x8e, 0xc4, 0xc3, 0x43, 0x28, 0x37, 0xfd, 0xce,\n  0x5b, 0xc6, 0x58, 0x6e, 0x92, 0xe7, 0xb3, 0x73, 0xc7, 0xf1, 0xf4, 0x3c,\n  0x7f, 0xfc, 0xdc, 0xe5, 0xa1, 0x07, 0xef, 0x9b, 0xdf, 0x39, 0x34, 0x17,\n  0xaf, 0x04, 0x53, 0x3b, 0xcb, 0xe0, 0x73, 0x85, 0x89, 0xfd, 0x43, 0x4c,\n  0x67, 0x9e, 0x8a, 0x56, 0xc3, 0x1c, 0x39, 0x51, 0xa6, 0x94, 0x54, 0x6c,\n  0xb1, 0x69, 0x06, 0xd5, 0x73, 0x05, 0xf2, 0x14, 0x6f, 0x32, 0xb1, 0x82,\n  0x33, 0x55, 0x90, 0x21, 0x59, 0x8e, 0xa0, 0x68, 0xed, 0x0e, 0xf4, 0x9d,\n  0xda, 0xb7, 0xe9, 0x5b, 0xe7, 0x86, 0xae, 0xdc, 0x2a, 0x9f, 0x6d, 0x74,\n  0x61, 0x5a, 0x58, 0xc8, 0xba, 0x4b, 0x50, 0x25, 0x88, 0x18, 0x6d, 0xb3,\n  0x09, 0x58, 0x19, 0x84, 0x48, 0x58, 0x5a, 0x59, 0x78, 0x5b, 0x92, 0xc1,\n  0xb7, 0x24, 0x11, 0x95, 0x2c, 0xb5, 0x94, 0xa4, 0x90, 0x41, 0x47, 0x79,\n  0x90, 0x87, 0x6f, 0x24, 0x80, 0xda, 0xc4, 0x0b, 0x51, 0x70, 0x3b, 0x81,\n  0x3d, 0x32, 0xed, 0x9b, 0xe7, 0x32, 0x76, 0xe5, 0x98, 0x22, 0x2e, 0x83,\n  0x04, 0x25, 0xaf, 0xbb, 0x2d, 0x39, 0x14, 0x2f, 0x8e, 0x77, 0x1c, 0xec,\n  0xd9, 0x7f, 0x73, 0xb4, 0x17, 0x72, 0xbd, 0xdf, 0x71, 0xa2, 0x38, 0x3a,\n  0xd2, 0x55, 0x1e, 0x95, 0x2a, 0xa1, 0xf1, 0xe9, 0x1d, 0x43, 0xc6, 0x81,\n  0xe1, 0x09, 0xf1, 0xe8, 0x9e, 0xdc, 0x58, 0xd1, 0xec, 0xdf, 0x39, 0x50,\n  0x9e, 0x4c, 0x2c, 0x2f, 0xa4, 0xaa, 0x39, 0x8b, 0xad, 0x34, 0x92, 0xdb,\n  0xbd, 0x8e, 0x9e, 0xb4, 0xf7, 0xb6, 0xe7, 0x4b, 0xa5, 0x7c, 0x34, 0x2f,\n  0xd5, 0xde, 0x3a, 0x5c, 0x2e, 0x0e, 0xbb, 0x79, 0xef, 0x38, 0xfe, 0x43,\n  0x35, 0xb0, 0xb3, 0x54, 0x9b, 0x63, 0x6c, 0xc4, 0x9a, 0x3b, 0xcc, 0x43,\n  0x95, 0xa2, 0x19, 0xe1, 0x05, 0xcc, 0xd1, 0xeb, 0x8d, 0x91, 0xdd, 0xb2,\n  0x82, 0xeb, 0x63, 0x1c, 0x8d, 0x47, 0xc8, 0x18, 0x23, 0x6b, 0x3d, 0xe5,\n  0x0d, 0x81, 0x67, 0x68, 0x76, 0x4c, 0xb3, 0xdb, 0xe3, 0x75, 0x2d, 0x94,\n  0x84, 0x12, 0xd0, 0x2a, 0xcf, 0xe8, 0x9d, 0x47, 0xad, 0x25, 0x53, 0x3c,\n  0x37, 0xb2, 0xa7, 0xdd, 0x49, 0xf3, 0xf6, 0x85, 0xfe, 0xbd, 0xe7, 0x3b,\n  0x8f, 0x0d, 0x0f, 0x9d, 0xa9, 0xbe, 0xda, 0x3b, 0x3b, 0x38, 0xd2, 0x46,\n  0x06, 0xf9, 0xdd, 0x30, 0xc8, 0x1c, 0x37, 0xa9, 0xcb, 0xce, 0xae, 0x77,\n  0x85, 0x73, 0xe7, 0xd7, 0x26, 0x4f, 0x75, 0x0d, 0x3f, 0x70, 0xdf, 0x8e,\n  0xc5, 0xa1, 0xd9, 0x18, 0x1e, 0xe4, 0xc5, 0x0e, 0xaa, 0x91, 0x2f, 0xc7,\n  0x46, 0xf2, 0xba, 0xda, 0x21, 0xa7, 0xeb, 0x66, 0x26, 0x57, 0x0e, 0x29,\n  0xe1, 0xbb, 0xd0, 0x5c, 0x48, 0x3d, 0x6b, 0x31, 0xe9, 0xed, 0x06, 0xbb,\n  0x9c, 0xc4, 0x8a, 0xdf, 0x26, 0xe9, 0x2c, 0x38, 0xfb, 0x02, 0xcd, 0x23,\n  0x73, 0x27, 0x8a, 0x17, 0x6f, 0x9c, 0x5b, 0x2f, 0xdd, 0x72, 0xd3, 0x3b,\n  0xdf, 0xf5, 0x8e, 0x09, 0x71, 0xf4, 0xd2, 0xc2, 0xa5, 0x47, 0x47, 0x6e,\n  0x5b, 0xb8, 0xe3, 0xdd, 0x13, 0x2f, 0x3e, 0xff, 0xfc, 0x91, 0x13, 0x0a,\n  0xbe, 0x2e, 0xfe, 0xd5, 0x8e, 0xdf, 0xab, 0xa5, 0x72, 0x7f, 0x22, 0xaa,\n  0x39, 0x46, 0xf6, 0x42, 0xca, 0x28, 0x5e, 0x48, 0x72, 0xc6, 0xe5, 0x2d,\n  0x5e, 0x48, 0x71, 0xf0, 0x42, 0x72, 0x1b, 0x69, 0x3c, 0xd7, 0x42, 0x52,\n  0x13, 0xc3, 0x47, 0xed, 0x2b, 0x0c, 0xad, 0x0e, 0x5a, 0x0f, 0xa7, 0xbe,\n  0x3a, 0x81, 0x7a, 0xe3, 0x93, 0x6e, 0xd1, 0xab, 0x1f, 0xef, 0x7e, 0x0f,\n  0xbc, 0x23, 0x8d, 0x7f, 0xbd, 0x86, 0xdf, 0xe1, 0xa1, 0x5a, 0xaa, 0x71,\n  0xbd, 0x0e, 0x50, 0xcc, 0x90, 0x0c, 0x50, 0x85, 0xea, 0xb9, 0x54, 0x21,\n  0x53, 0x99, 0xfc, 0x70, 0xcc, 0xe8, 0x8d, 0x20, 0xc0, 0x42, 0xa1, 0x6b,\n  0xb0, 0x7a, 0x47, 0x08, 0xbd, 0x56, 0x6b, 0xff, 0x6c, 0xb1, 0xcf, 0xdb,\n  0xdd, 0x9b, 0x5c, 0x4c, 0x66, 0x0b, 0x67, 0xfb, 0xf7, 0xae, 0x49, 0x83,\n  0xb9, 0x07, 0x10, 0xea, 0x1b, 0x7d, 0x20, 0x9a, 0x6b, 0x0d, 0xa6, 0x8b,\n  0xc1, 0x70, 0x4f, 0x3a, 0xba, 0x73, 0x3c, 0x33, 0x54, 0x09, 0x1f, 0x65,\n  0x48, 0x3f, 0x7d, 0x1b, 0x0b, 0xe8, 0x9b, 0xb8, 0x0d, 0x09, 0xd0, 0x9d,\n  0x23, 0x78, 0xf5, 0x4b, 0x98, 0xdf, 0x63, 0xdb, 0x95, 0xd1, 0xe1, 0x46,\n  0x68, 0x09, 0x4e, 0x7f, 0x83, 0xd5, 0x83, 0x94, 0xa6, 0x8e, 0xd6, 0x39,\n  0x7e, 0x86, 0x9d, 0x89, 0x44, 0x31, 0x9f, 0x4f, 0xc8, 0x7c, 0x7e, 0x33,\n  0xff, 0xc2, 0xd5, 0x5c, 0x7e, 0x93, 0xcd, 0x03, 0x97, 0xff, 0xdc, 0x03,\n  0x0b, 0x33, 0x6f, 0xbe, 0xb1, 0x6f, 0x25, 0x1e, 0xd9, 0x5f, 0x5c, 0x58,\n  0x59, 0xdb, 0xd3, 0xd3, 0xdb, 0x36, 0xdb, 0x36, 0x56, 0x2a, 0x8c, 0xa7,\n  0x12, 0xbb, 0x2e, 0xed, 0xbd, 0x01, 0xdd, 0xf4, 0x5b, 0x41, 0x46, 0xdc,\n  0x31, 0x71, 0xe4, 0xac, 0xdd, 0x32, 0x6b, 0xf1, 0x4e, 0x0c, 0xf5, 0x76,\n  0x4d, 0xb8, 0x3a, 0xdb, 0x8a, 0x1d, 0x1e, 0x5f, 0x65, 0x78, 0x0f, 0xa5,\n  0xc4, 0x19, 0x2e, 0x63, 0x1e, 0x2f, 0x11, 0x1e, 0x7f, 0xa9, 0x2a, 0x1a,\n  0x10, 0x0b, 0x9b, 0xaa, 0x6c, 0xdd, 0xf3, 0xd4, 0x29, 0xbb, 0x96, 0x42,\n  0x8a, 0x77, 0x92, 0x2b, 0x99, 0x3a, 0x08, 0x47, 0x70, 0x72, 0xe2, 0x78,\n  0x18, 0x40, 0x3b, 0x29, 0x87, 0x22, 0x08, 0x24, 0x61, 0xb1, 0x3c, 0xc0,\n  0x55, 0x19, 0x62, 0xc2, 0x60, 0x51, 0x77, 0x6f, 0xa3, 0x14, 0x1b, 0x34,\n  0x4b, 0x9b, 0x0f, 0x60, 0xa9, 0x39, 0x6c, 0xa3, 0xeb, 0x35, 0x1a, 0x90,\n  0x16, 0x58, 0x50, 0x98, 0x8c, 0x90, 0x6e, 0x99, 0xe4, 0x2d, 0x97, 0xa5,\n  0x85, 0xd4, 0x10, 0x15, 0x74, 0xe2, 0xf4, 0xae, 0xda, 0xd3, 0x68, 0x7c,\n  0xf7, 0xe9, 0xcf, 0xd0, 0x0c, 0x2b, 0xf8, 0xec, 0xcf, 0x99, 0x3e, 0xf1,\n  0x89, 0x2e, 0xf4, 0xf5, 0x5a, 0xe9, 0x85, 0xf4, 0x74, 0x52, 0x97, 0x0b,\n  0xd6, 0x5e, 0x21, 0xb4, 0xef, 0xde, 0x58, 0xc0, 0x94, 0x86, 0x18, 0xdd,\n  0xfe, 0x6a, 0xef, 0xb5, 0x65, 0x85, 0x92, 0xf4, 0x53, 0x11, 0x19, 0x09,\n  0x6e, 0xab, 0xa0, 0xc0, 0x9a, 0xfe, 0x7f, 0x2e, 0x28, 0x90, 0xe9, 0xe4,\n  0xbd, 0x6f, 0xbd, 0xbd, 0x7c, 0x40, 0x6a, 0xdd, 0xd7, 0x3a, 0x7f, 0x60,\n  0xef, 0x0e, 0xdf, 0x50, 0x28, 0xe1, 0x41, 0x27, 0x6a, 0x3f, 0x30, 0xf7,\n  0x21, 0x6e, 0xed, 0xf8, 0xf9, 0x0b, 0x76, 0xcb, 0x9c, 0xc3, 0x35, 0x36,\n  0x35, 0x3a, 0xaa, 0x56, 0x3b, 0xd0, 0xce, 0x99, 0x2f, 0x6b, 0x81, 0xce,\n  0x1d, 0x78, 0xed, 0x19, 0xe9, 0xaf, 0x51, 0x90, 0xb5, 0x0f, 0xf3, 0x8f,\n  0x7a, 0x46, 0x41, 0xed, 0x6f, 0x20, 0x23, 0x3c, 0xee, 0x50, 0xc0, 0x1d,\n  0xf7, 0x60, 0xee, 0x11, 0x0d, 0xcb, 0x32, 0xa2, 0xdd, 0x51, 0x17, 0x11,\n  0xcc, 0x76, 0x02, 0x22, 0x26, 0x0b, 0x88, 0x8e, 0x8f, 0xbe, 0xd7, 0x91,\n  0xb6, 0x5b, 0xb3, 0xee, 0x7f, 0xd6, 0xf3, 0xc1, 0x95, 0xe2, 0x91, 0x33,\n  0x37, 0x9f, 0x9a, 0x3f, 0xdd, 0xfe, 0xea, 0xe0, 0xe4, 0xe8, 0x40, 0x62,\n  0x2c, 0x1d, 0x1d, 0x42, 0xad, 0x5f, 0xfb, 0x32, 0xb6, 0x7e, 0xc6, 0x79,\n  0xae, 0xf6, 0xf7, 0xd9, 0xd6, 0xeb, 0x8f, 0x9f, 0xbe, 0x67, 0xee, 0xe1,\n  0x77, 0xec, 0xdc, 0x31, 0x32, 0x8b, 0x62, 0x3d, 0x52, 0x7a, 0x67, 0x3b,\n  0xa1, 0xab, 0x79, 0x63, 0x1f, 0xfa, 0x37, 0x4c, 0xd7, 0x26, 0xd9, 0x00,\n  0x80, 0x34, 0xf4, 0x7d, 0x75, 0x09, 0x91, 0xa0, 0xb6, 0xc8, 0x06, 0x87,\n  0x2c, 0x1b, 0xae, 0x43, 0xae, 0xda, 0x7d, 0xe8, 0x5b, 0xb5, 0x1f, 0x7c,\n  0x90, 0x3e, 0x33, 0xdd, 0x71, 0xe5, 0x76, 0x22, 0x1b, 0x20, 0x8e, 0x5a,\n  0x54, 0x64, 0x43, 0x11, 0x72, 0xd4, 0xe6, 0x25, 0x9b, 0xc0, 0x82, 0x70,\n  0xd8, 0x64, 0x40, 0xa9, 0xe9, 0xa6, 0x34, 0x25, 0x3e, 0x2f, 0x9c, 0xe3,\n  0x7b, 0x13, 0xbe, 0xc4, 0xa6, 0x70, 0x40, 0xcd, 0xe2, 0x40, 0xda, 0x22,\n  0x29, 0x1c, 0x4a, 0x7e, 0x15, 0xb2, 0x4a, 0x98, 0xba, 0x3a, 0x0a, 0x3e,\n  0x0c, 0xbe, 0x86, 0x44, 0x38, 0xd9, 0x90, 0x12, 0x15, 0x90, 0x0b, 0x11,\n  0x2c, 0x20, 0xbe, 0x38, 0x31, 0x3d, 0x3e, 0x3d, 0xb7, 0x6b, 0x60, 0x98,\n  0x7e, 0xa9, 0x59, 0x20, 0x34, 0x0b, 0x8a, 0x51, 0x22, 0x16, 0x8c, 0x44,\n  0x42, 0xd4, 0x12, 0xc5, 0xe1, 0xe1, 0x72, 0x61, 0x38, 0xe4, 0x1d, 0xc7,\n  0xe3, 0xd6, 0xba, 0xb1, 0x88, 0xe5, 0x02, 0x9c, 0xbd, 0x24, 0xa8, 0xee,\n  0x6a, 0x87, 0x0e, 0xcb, 0x85, 0x66, 0x8b, 0x59, 0x96, 0x0b, 0xca, 0x6a,\n  0x6f, 0x0c, 0x2a, 0x5e, 0xee, 0x5e, 0x4f, 0x38, 0xe8, 0x49, 0x78, 0x13,\n  0xd1, 0xa8, 0x3c, 0xa8, 0xd1, 0xe6, 0x09, 0xb7, 0x55, 0x26, 0x5c, 0x2d,\n  0x12, 0x7e, 0xef, 0x43, 0x9e, 0x36, 0x08, 0xb7, 0xba, 0xfe, 0x6e, 0x81,\n  0xf5, 0xef, 0xea, 0x5f, 0x3d, 0x5d, 0x5e, 0x1b, 0x39, 0x7f, 0xcf, 0x7f,\n  0x0c, 0x4d, 0x8c, 0x0e, 0x26, 0x46, 0x32, 0xe1, 0xc1, 0x97, 0xbf, 0xf2,\n  0x97, 0x3c, 0x1e, 0x55, 0xe1, 0x2d, 0x8f, 0xe4, 0xb3, 0xe7, 0xd7, 0xc6,\n  0x4e, 0x56, 0xde, 0xbb, 0x63, 0xd7, 0xd4, 0xd8, 0x74, 0xa8, 0x92, 0xc8,\n  0xec, 0x28, 0xd4, 0xc7, 0x41, 0x43, 0x74, 0x7c, 0x1b, 0x96, 0x67, 0x89,\n  0x6a, 0xd4, 0xe5, 0x34, 0x19, 0xd9, 0xad, 0x42, 0x9a, 0x9c, 0x56, 0xc8,\n  0xf2, 0x2b, 0x1e, 0xdb, 0x5e, 0xdd, 0x77, 0x20, 0x58, 0x16, 0x5c, 0x31,\n  0x8e, 0x48, 0xa3, 0x69, 0x4d, 0xb3, 0xce, 0xcf, 0x20, 0x43, 0x78, 0x2f,\n  0x56, 0xf9, 0x93, 0x6c, 0xed, 0xc7, 0xc6, 0xbe, 0xc2, 0xdc, 0x70, 0xb3,\n  0xf2, 0x9f, 0x8e, 0x20, 0xc3, 0xd1, 0x47, 0x1e, 0x29, 0xa7, 0x6a, 0x3f,\n  0xee, 0xea, 0x7a, 0x1b, 0xb1, 0x4d, 0xc2, 0xb8, 0x4d, 0x08, 0xd3, 0x91,\n  0x57, 0xff, 0xf2, 0x7f, 0xc1, 0x77, 0x88, 0xcb, 0x38, 0x4e, 0xbe, 0xff,\n  0x2a, 0x0f, 0xdf, 0x5b, 0x49, 0xfe, 0x1f, 0xf8, 0x7e, 0x85, 0x81, 0xef,\n  0x71, 0xcc, 0x6b, 0xff, 0x99, 0x7c, 0xaf, 0x89, 0xf0, 0x9d, 0xc3, 0x7c,\n  0xcc, 0x46, 0xbe, 0x6f, 0xfc, 0x18, 0xbe, 0xb7, 0xe1, 0xf2, 0xd7, 0x60,\n  0xde, 0x8a, 0xd4, 0xcf, 0xe0, 0x7b, 0x02, 0x3f, 0x9f, 0xc2, 0xeb, 0x8f,\n  0x17, 0xd1, 0x2b, 0xf0, 0x3d, 0x88, 0xe7, 0xf5, 0x15, 0x52, 0x4e, 0xeb,\n  0xe1, 0x7b, 0x74, 0xe3, 0x35, 0x62, 0x2f, 0xf0, 0x22, 0xf3, 0x53, 0xb9,\n  0x3d, 0x8b, 0xe8, 0x97, 0xf0, 0x3c, 0x91, 0xfd, 0x0f, 0xf8, 0x6e, 0xd9,\n  0xb8, 0x11, 0x4d, 0xa0, 0x3c, 0x23, 0x08, 0xb8, 0x25, 0x57, 0xbe, 0x2d,\n  0xdb, 0x98, 0x57, 0xbe, 0xdd, 0xb0, 0xad, 0xa2, 0x1b, 0x97, 0xa8, 0x57,\n  0x50, 0x0b, 0x23, 0x50, 0x17, 0xeb, 0xe5, 0xa8, 0xb9, 0xdc, 0xb9, 0x71,\n  0x09, 0x15, 0x50, 0x01, 0x97, 0x5f, 0xbf, 0x6d, 0xb9, 0x09, 0x3f, 0xbf,\n  0x9f, 0x94, 0xdf, 0xb0, 0x6d, 0xb9, 0x88, 0xef, 0xdf, 0x89, 0x32, 0x8c,\n  0x40, 0xc7, 0xb7, 0x7d, 0xbf, 0x7f, 0xe3, 0x06, 0x54, 0x85, 0xf7, 0xd3,\n  0x89, 0x6d, 0xef, 0xb7, 0xe2, 0xe7, 0x4f, 0x91, 0xf6, 0xb7, 0x6d, 0x7b,\n  0xbf, 0x17, 0x3f, 0x7f, 0x90, 0xdc, 0x9f, 0xdc, 0xf6, 0x7e, 0x17, 0xbe,\n  0x7f, 0x18, 0xee, 0xa7, 0x5b, 0xea, 0xe5, 0xcc, 0xd5, 0xed, 0x1f, 0x47,\n  0x45, 0xfc, 0xfc, 0xdc, 0xb6, 0xcf, 0xb7, 0x6c, 0xfc, 0x1c, 0xd3, 0xef,\n  0x63, 0x32, 0xfd, 0x6a, 0x07, 0xe5, 0xf2, 0xda, 0xc1, 0x4d, 0xfa, 0xe1,\n  0x3f, 0xaf, 0xa0, 0x3f, 0x90, 0xe9, 0x27, 0x97, 0xa3, 0xe6, 0x72, 0x27,\n  0xf8, 0x3e, 0xa0, 0x67, 0x64, 0xfa, 0x6d, 0x53, 0x6e, 0xc2, 0xcf, 0xef,\n  0x27, 0xe5, 0x37, 0x6c, 0x5b, 0x2e, 0xe2, 0xfb, 0x77, 0xa2, 0x3f, 0x94,\n  0xe9, 0xb7, 0xcd, 0xfb, 0xfd, 0x1b, 0xaf, 0x63, 0xfa, 0xfd, 0x81, 0x4c,\n  0xbf, 0x6d, 0xee, 0xb7, 0xe2, 0xe7, 0x4f, 0x91, 0xf6, 0xb7, 0x6d, 0x7b,\n  0x3f, 0x00, 0xdb, 0x0c, 0x92, 0xfb, 0x93, 0xdb, 0xde, 0xef, 0xc2, 0xf7,\n  0x0f, 0xc3, 0xfd, 0x40, 0x3f, 0xb9, 0x9c, 0xb9, 0xba, 0xfd, 0xe3, 0xe8,\n  0x59, 0x99, 0x7e, 0xdb, 0x3c, 0xdf, 0x82, 0xec, 0x68, 0x82, 0xfe, 0x8a,\n  0x4c, 0x3f, 0x3c, 0xd7, 0xe4, 0x9d, 0x96, 0x4b, 0x9b, 0xf4, 0x43, 0x7e,\n  0xea, 0x15, 0xfa, 0xf3, 0x32, 0xfd, 0xe4, 0x72, 0xd4, 0x5c, 0xee, 0x44,\n  0x7e, 0x54, 0xa0, 0xff, 0x56, 0xa6, 0xdf, 0x36, 0xe5, 0x26, 0xfc, 0xfc,\n  0x7e, 0x52, 0x7e, 0xc3, 0xb6, 0xe5, 0x22, 0xbe, 0x7f, 0x27, 0xfd, 0x05,\n  0x99, 0x7e, 0xdb, 0xbc, 0xdf, 0x8f, 0x6c, 0xa8, 0x0a, 0xef, 0x07, 0xfa,\n  0x6d, 0x73, 0xbf, 0x15, 0x3f, 0x7f, 0x8a, 0xb4, 0xbf, 0x6d, 0xdb, 0xfb,\n  0xbd, 0xf8, 0xf9, 0x83, 0xe4, 0xfe, 0xe4, 0xb6, 0xf7, 0xbb, 0xf0, 0xfd,\n  0xc3, 0x70, 0x3f, 0xd0, 0x4f, 0x2e, 0x67, 0xae, 0x6e, 0xff, 0x38, 0xfd,\n  0x92, 0x4c, 0xbf, 0xed, 0xe8, 0x83, 0x85, 0xf0, 0x3a, 0xb6, 0x71, 0x62,\n  0x22, 0xcc, 0x34, 0x81, 0xc6, 0xf6, 0x42, 0x7d, 0x5e, 0x32, 0xa3, 0xf4,\n  0x57, 0xf0, 0xf5, 0x08, 0xe8, 0x86, 0xf8, 0xfa, 0x1a, 0x94, 0x8b, 0x3e,\n  0x40, 0xce, 0x26, 0xeb, 0xfa, 0x75, 0xfa, 0x97, 0x8d, 0xfb, 0xa0, 0x3c,\n  0x41, 0xca, 0x03, 0xe8, 0x39, 0x65, 0x5d, 0xbf, 0xce, 0x04, 0xe8, 0xbf,\n  0xc5, 0xe5, 0x31, 0xa5, 0xfc, 0xb0, 0x52, 0xfe, 0x1d, 0x65, 0x5c, 0x5f,\n  0x67, 0x7a, 0x48, 0x79, 0x5c, 0x29, 0x3f, 0xa5, 0x94, 0x5f, 0x51, 0xd6,\n  0xf5, 0xeb, 0x4c, 0x84, 0xfe, 0x02, 0x2e, 0x4f, 0x28, 0xe5, 0xfb, 0x95,\n  0xf2, 0x7f, 0x52, 0xde, 0xff, 0x73, 0xfa, 0xdf, 0xb6, 0xbc, 0x3f, 0x49,\n  0xca, 0x83, 0xe8, 0x83, 0xca, 0xbc, 0xfd, 0x39, 0xbe, 0x1f, 0xca, 0x93,\n  0x5b, 0xda, 0x1f, 0x44, 0x5f, 0xaf, 0xf7, 0x9b, 0xb1, 0x6d, 0xd3, 0xfe,\n  0x10, 0xfa, 0x4a, 0xfd, 0xf9, 0x58, 0x9e, 0xbf, 0xb1, 0x5c, 0x42, 0x1f,\n  0x6f, 0x94, 0xff, 0xe2, 0x0d, 0xe5, 0x71, 0xd1, 0x83, 0x1e, 0x22, 0xf5,\n  0xdc, 0xf4, 0x1f, 0x91, 0x7a, 0x86, 0x8d, 0xeb, 0xd8, 0x69, 0xfa, 0xe7,\n  0x58, 0xbb, 0xd1, 0x21, 0x1f, 0xd1, 0xb2, 0x75, 0x1b, 0xff, 0x5c, 0xeb,\n  0x41, 0x02, 0xa5, 0xa3, 0xe7, 0x6b, 0x3d, 0x94, 0x19, 0xb2, 0x03, 0xd6,\n  0x7a, 0x20, 0x0f, 0x25, 0xad, 0x7c, 0x90, 0x6d, 0x12, 0x2a, 0x86, 0xcd,\n  0x4b, 0x27, 0x64, 0x05, 0x00, 0x0d, 0x03, 0xb0, 0xcc, 0xf1, 0xd5, 0xc3,\n  0x0d, 0x97, 0x2f, 0x06, 0x6b, 0x68, 0x80, 0x91, 0x82, 0xb5, 0x33, 0x15,\n  0x52, 0x71, 0x3a, 0x7b, 0x2a, 0xaa, 0xa4, 0x07, 0x96, 0xc1, 0x7c, 0xd5,\n  0x6b, 0xa7, 0xce, 0x9f, 0x44, 0xb6, 0x27, 0x0e, 0x1f, 0x8e, 0xdd, 0x70,\n  0xd7, 0x7d, 0x37, 0xd4, 0xf4, 0x83, 0xe8, 0x34, 0x3c, 0x77, 0x19, 0x3f,\n  0x77, 0x5c, 0x79, 0x6e, 0xa4, 0x1a, 0x82, 0xe7, 0x62, 0x75, 0xeb, 0x70,\n  0xdd, 0x08, 0x38, 0x0d, 0x7b, 0x3e, 0xf0, 0x5c, 0x5c, 0x41, 0x08, 0x71,\n  0x3a, 0x47, 0xaa, 0xac, 0x20, 0xa2, 0x4a, 0xf0, 0xd8, 0x65, 0x64, 0x3b,\n  0x79, 0xfe, 0xd4, 0xda, 0xf7, 0xf0, 0x53, 0xd1, 0xab, 0x37, 0xdc, 0x77,\n  0xd7, 0x0d, 0xe4, 0xa9, 0x20, 0xc4, 0x67, 0x37, 0x0e, 0xa1, 0x14, 0xc1,\n  0xeb, 0x8d, 0x11, 0x8f, 0x1f, 0xf0, 0x94, 0x00, 0x84, 0x5e, 0xfc, 0x1f,\n  0xd2, 0x9f, 0xca, 0xf8, 0x6e, 0xf4, 0x8c, 0x92, 0x63, 0x0e, 0x76, 0xc2,\n  0x25, 0x02, 0x72, 0x46, 0x7e, 0x50, 0xea, 0x9b, 0xdf, 0x7c, 0x08, 0xff,\n  0x7b, 0x3f, 0x73, 0x7c, 0xb8, 0xf6, 0xb1, 0xa1, 0xda, 0x53, 0xf2, 0x33,\n  0x9d, 0x1b, 0x87, 0xa8, 0x5f, 0x90, 0x67, 0x02, 0x32, 0x28, 0x4d, 0x92,\n  0x6d, 0xad, 0x01, 0xfc, 0x2f, 0x47, 0x71, 0xd0, 0x62, 0x19, 0x57, 0x8d,\n  0xec, 0x52, 0xd5, 0x81, 0x8d, 0x61, 0xcf, 0xdf, 0x41, 0xb2, 0xf4, 0xca,\n  0x3f, 0xee, 0x37, 0x3f, 0xf8, 0xe0, 0x9b, 0xbf, 0xfb, 0xfe, 0x31, 0x34,\n  0x31, 0x82, 0xc6, 0xc6, 0x7e, 0xf5, 0x18, 0x79, 0xae, 0x75, 0xc3, 0x88,\n  0x2e, 0x52, 0xf3, 0x58, 0x39, 0x0b, 0x55, 0xfd, 0x1c, 0x92, 0x77, 0xd5,\n  0x10, 0x75, 0x2f, 0x83, 0xdb, 0x09, 0x7e, 0x6c, 0x0d, 0xbd, 0x0d, 0xe2,\n  0x1e, 0x2d, 0x05, 0x8b, 0x14, 0x17, 0xac, 0x4f, 0x24, 0xfe, 0x47, 0xe5,\n  0xc6, 0x5b, 0x5e, 0x41, 0xfd, 0xb5, 0x4f, 0xfd, 0xf4, 0xa7, 0xb8, 0xb2,\n  0x11, 0x3f, 0x63, 0x0d, 0x3d, 0x42, 0x09, 0xe0, 0x8f, 0xc7, 0x93, 0x70,\n  0x71, 0x79, 0x73, 0xa0, 0xe9, 0x21, 0x02, 0x25, 0x98, 0xe5, 0x87, 0x20,\n  0x72, 0xf0, 0x20, 0x18, 0x91, 0xab, 0xf7, 0xb1, 0xcb, 0x95, 0x03, 0xc7,\n  0x5e, 0xa1, 0xef, 0xaa, 0x3d, 0x59, 0xfb, 0xfa, 0xcb, 0x2f, 0xcb, 0x76,\n  0x20, 0x3d, 0x42, 0x4f, 0x30, 0x4e, 0xdc, 0x09, 0x7f, 0xd5, 0xc3, 0x73,\n  0x88, 0x21, 0xd1, 0x97, 0x88, 0x64, 0xb2, 0x02, 0xb5, 0x83, 0x42, 0xf3,\n  0x91, 0x30, 0x84, 0x9e, 0x58, 0xc0, 0xbc, 0x51, 0xfc, 0xa1, 0xfa, 0x5b,\n  0x56, 0x3f, 0xfe, 0x89, 0xd5, 0x64, 0xec, 0xce, 0x89, 0xf1, 0xcb, 0xf4,\n  0x88, 0xfd, 0x93, 0x9f, 0xb4, 0xcf, 0xcd, 0xcc, 0x28, 0xf8, 0xd7, 0x1b,\n  0x46, 0xf2, 0xbc, 0x98, 0x08, 0xf8, 0xd6, 0xbc, 0x58, 0xa5, 0x64, 0x7a,\n  0x56, 0xf0, 0xaf, 0x30, 0x9e, 0x8b, 0x6a, 0xaa, 0x58, 0x15, 0xd5, 0x10,\n  0xa9, 0xcb, 0xfd, 0x66, 0x81, 0x2f, 0x36, 0x13, 0xbc, 0x1d, 0x59, 0x24,\n  0x8b, 0x50, 0x72, 0xc4, 0x0b, 0x02, 0x32, 0x58, 0x56, 0x2c, 0x4f, 0x3c,\n  0x81, 0x7f, 0xa1, 0xd7, 0x6b, 0x6a, 0xf4, 0xba, 0x76, 0x56, 0xff, 0xc2,\n  0x0b, 0xf2, 0x3b, 0xb0, 0xd6, 0x82, 0x6e, 0xaf, 0xbf, 0x43, 0xc0, 0xef,\n  0x40, 0x24, 0xa2, 0xb4, 0xfe, 0x0e, 0x82, 0x44, 0xa0, 0x38, 0xf9, 0x68,\n  0xea, 0xaa, 0x32, 0x78, 0xf8, 0x7c, 0xcc, 0x66, 0x26, 0x3d, 0x2c, 0xe1,\n  0xc7, 0x97, 0x6d, 0x71, 0x8b, 0xf4, 0x21, 0xcb, 0xb2, 0xf9, 0xc9, 0x27,\n  0xcd, 0xcb, 0xe8, 0xf5, 0xd2, 0x0b, 0x2f, 0xe8, 0x67, 0xb5, 0x35, 0x35,\n  0xc1, 0x23, 0x8e, 0x6f, 0xfc, 0x2b, 0xfd, 0x1a, 0xfd, 0x6d, 0x4c, 0x2b,\n  0x07, 0x05, 0xd1, 0x32, 0xdd, 0xd4, 0x4b, 0x93, 0x7f, 0xe4, 0xc0, 0xcf,\n  0xce, 0xaa, 0x91, 0x60, 0x54, 0x19, 0xb0, 0x95, 0x26, 0xf0, 0xeb, 0x32,\n  0x6c, 0x8d, 0x06, 0x51, 0x6b, 0x3a, 0xa4, 0x31, 0x6b, 0x4d, 0x8c, 0xc8,\n  0x69, 0xc4, 0x75, 0xe2, 0x03, 0xa3, 0xc7, 0xaa, 0xfd, 0x49, 0x0e, 0xec,\n  0xb4, 0xc8, 0x6f, 0x76, 0x17, 0xdc, 0x40, 0x40, 0x09, 0x4f, 0xc1, 0x11,\n  0x54, 0x81, 0xa2, 0x05, 0x8e, 0x5e, 0xfa, 0x8d, 0x5e, 0xc6, 0x1d, 0xc0,\n  0xf7, 0xd2, 0x1c, 0x20, 0x0e, 0x67, 0x73, 0x6d, 0xd1, 0x88, 0xcb, 0xa9,\n  0xc3, 0x36, 0x4f, 0xb9, 0xd4, 0xd6, 0x9d, 0xeb, 0x4e, 0x25, 0x23, 0xad,\n  0xd1, 0xd6, 0x80, 0xcf, 0x29, 0xb9, 0x24, 0x8b, 0x49, 0xeb, 0xd0, 0x39,\n  0x1a, 0x73, 0xd8, 0x82, 0xe7, 0x30, 0x67, 0xc2, 0xe6, 0x82, 0x49, 0xc6,\n  0x02, 0x44, 0x4d, 0xf8, 0x95, 0xa1, 0xa6, 0xcf, 0xd7, 0xbc, 0x7e, 0xbc,\n  0xf6, 0x29, 0xd4, 0x3f, 0x85, 0x06, 0x6a, 0x7f, 0x5e, 0xfb, 0x85, 0x3b,\n  0x18, 0x74, 0xbb, 0x03, 0x01, 0xf4, 0xa4, 0xf2, 0xa1, 0x16, 0xab, 0x5f,\n  0x79, 0x9f, 0xf2, 0xc1, 0x86, 0x16, 0xa7, 0xd0, 0x42, 0xed, 0x23, 0x53,\n  0xb5, 0x3f, 0xa0, 0xc3, 0xfe, 0x60, 0xc8, 0xe7, 0x0b, 0x05, 0xfd, 0xf5,\n  0xbf, 0xb5, 0x62, 0x20, 0x00, 0x9f, 0x02, 0x81, 0xfa, 0x5f, 0xbc, 0xb6,\n  0xf1, 0x44, 0xc7, 0x3c, 0xe4, 0xf3, 0xf8, 0x93, 0x01, 0xdb, 0x2c, 0xb3,\n  0xf2, 0xd8, 0xfa, 0xe0, 0x14, 0x16, 0x01, 0xc0, 0x1e, 0x45, 0x9d, 0x68,\n  0x78, 0xe9, 0x6f, 0xba, 0x74, 0x35, 0xe2, 0xf1, 0xb7, 0xd6, 0x53, 0x40,\n  0x15, 0xd4, 0x91, 0x48, 0x44, 0x92, 0x19, 0x03, 0x56, 0x67, 0x24, 0xcb,\n  0x66, 0xc6, 0x8a, 0x18, 0xd7, 0xf4, 0x99, 0xd6, 0xf4, 0xd6, 0xaa, 0x3d,\n  0x7e, 0xaf, 0xdd, 0xe1, 0xf5, 0x3a, 0xec, 0x5e, 0xb4, 0xbb, 0xfe, 0x09,\n  0x52, 0x04, 0xa0, 0x97, 0xdc, 0x7e, 0xbf, 0xdb, 0xe5, 0xf7, 0xff, 0x4f,\n  0xf2, 0x17, 0x37, 0x15, 0x7c, 0x8a, 0xa9, 0x56, 0x5a, 0xa0, 0xff, 0x14,\n  0x13, 0xd7, 0x8c, 0x75, 0xfa, 0x1d, 0x55, 0xb3, 0x11, 0x4f, 0x6c, 0xb3,\n  0xc9, 0xa0, 0xd7, 0x91, 0x90, 0x0a, 0x86, 0x86, 0x33, 0x66, 0x48, 0xf9,\n  0x6c, 0x86, 0xf6, 0xd1, 0xcc, 0xd1, 0xba, 0xad, 0x79, 0x02, 0x11, 0x5f,\n  0xcd, 0x7a, 0x4e, 0x7b, 0x40, 0x64, 0x5e, 0x51, 0x0e, 0xd9, 0x69, 0x66,\n  0x7e, 0xe5, 0xd9, 0x48, 0x2a, 0x42, 0x1c, 0xa5, 0x9a, 0x9b, 0xca, 0x94,\n  0xa2, 0xd1, 0x12, 0x67, 0x6b, 0x6e, 0xf1, 0x57, 0xdd, 0x36, 0x87, 0xcb,\n  0xe5, 0xb0, 0xb9, 0x9f, 0x40, 0xf7, 0xd4, 0x6e, 0x43, 0x5f, 0xa9, 0xbd,\n  0xe8, 0xb5, 0x58, 0xbd, 0x70, 0x81, 0xbe, 0xd7, 0xe9, 0xf3, 0x39, 0xf1,\n  0x4f, 0xcd, 0xd5, 0xfd, 0xe1, 0x3f, 0xed, 0xfe, 0x7e, 0xec, 0xa7, 0x6e,\n  0xfc, 0xcf, 0xe5, 0xf5, 0xca, 0x3e, 0xde, 0xc8, 0x85, 0xfe, 0x02, 0xeb,\n  0xe5, 0x39, 0xaa, 0x87, 0x9a, 0xab, 0x4e, 0x7b, 0x49, 0xee, 0x4a, 0xcc,\n  0x55, 0x05, 0x6c, 0x47, 0x5d, 0xa6, 0x10, 0x8f, 0x2d, 0x29, 0xfa, 0x32,\n  0x44, 0xec, 0x91, 0x29, 0x48, 0xc1, 0x86, 0x1b, 0x4d, 0xf0, 0x4f, 0x88,\n  0x21, 0x75, 0x8e, 0x9b, 0x81, 0xb8, 0x80, 0xce, 0x72, 0xbe, 0xa7, 0xd0,\n  0x13, 0x8b, 0x04, 0xfd, 0x2e, 0x87, 0x4e, 0xa3, 0xe2, 0xa9, 0x1c, 0xca,\n  0x81, 0xa3, 0xa0, 0xa5, 0x9e, 0x13, 0xc4, 0xd1, 0x08, 0x5c, 0xdc, 0xe2,\n  0xe7, 0xbd, 0x19, 0xec, 0xab, 0x04, 0x8f, 0x94, 0x9b, 0xa6, 0xd7, 0xd3,\n  0x89, 0x4e, 0x9f, 0x41, 0x27, 0x5a, 0xf4, 0xce, 0x98, 0x57, 0xd2, 0xab,\n  0xd4, 0xc6, 0xd1, 0xee, 0x78, 0xc1, 0xad, 0x33, 0xa8, 0x8d, 0x82, 0xd6,\n  0x65, 0xf3, 0xc7, 0xf5, 0x6a, 0x95, 0xd1, 0xd5, 0xf9, 0x61, 0xab, 0xd3,\n  0x69, 0xb5, 0xba, 0x5c, 0xb8, 0x1b, 0xee, 0xb0, 0x56, 0x6b, 0xd2, 0xe9,\n  0x6d, 0xe1, 0x84, 0x35, 0xeb, 0xf2, 0x74, 0x78, 0x4a, 0x7d, 0x8e, 0x80,\n  0x56, 0x65, 0x56, 0xf1, 0x6a, 0x43, 0x20, 0xe8, 0x6c, 0x73, 0x39, 0xcb,\n  0xae, 0x60, 0x77, 0xe4, 0x39, 0xe8, 0xbc, 0x0b, 0xff, 0x92, 0xf9, 0xc8,\n  0x3d, 0x54, 0x91, 0x7e, 0x13, 0xdd, 0x49, 0x19, 0x29, 0xfe, 0x69, 0x0d,\n  0x42, 0xf9, 0x54, 0x94, 0x87, 0x56, 0x95, 0x1d, 0xbc, 0xdd, 0x81, 0x1c,\n  0xd8, 0xb2, 0x2a, 0xa3, 0xbf, 0x1a, 0xbe, 0xa9, 0x50, 0x08, 0x05, 0xc2,\n  0x06, 0xbd, 0x84, 0xee, 0xf1, 0xd7, 0x6e, 0x4b, 0xce, 0x24, 0x17, 0x02,\n  0xa1, 0x42, 0xe1, 0xa6, 0xe1, 0x30, 0xfe, 0x48, 0x2e, 0x49, 0x7a, 0x03,\n  0x20, 0xc8, 0xd7, 0xbe, 0xcb, 0x32, 0x6c, 0x42, 0xc1, 0x30, 0x77, 0xe1,\n  0x39, 0x51, 0xa5, 0x26, 0xa9, 0x59, 0x6a, 0x81, 0x5a, 0xa2, 0x8e, 0x51,\n  0xcf, 0x55, 0x3f, 0x1e, 0x44, 0x2a, 0x3d, 0xb6, 0xdf, 0xb1, 0xad, 0x3d,\n  0xb1, 0x67, 0x37, 0xed, 0x50, 0x62, 0xdf, 0x1d, 0x76, 0xc7, 0x7d, 0x14,\n  0x72, 0x02, 0xe4, 0x0c, 0x8d, 0x45, 0x99, 0x1b, 0x81, 0x1b, 0xcc, 0x1a,\n  0xe6, 0xea, 0x7a, 0x95, 0xa0, 0x5f, 0xd7, 0x69, 0x69, 0x95, 0x51, 0x43,\n  0xab, 0x0d, 0x2a, 0xf5, 0x1a, 0x5e, 0x07, 0xa2, 0xc9, 0x80, 0xd7, 0xbc,\n  0xc9, 0x83, 0xcc, 0x16, 0x93, 0x79, 0x8d, 0xb2, 0x78, 0x91, 0xd5, 0x66,\n  0xb1, 0xae, 0x51, 0x36, 0x1f, 0xb2, 0x3b, 0x6c, 0xf6, 0x35, 0x17, 0xd8,\n  0xb8, 0x80, 0xa8, 0x72, 0x82, 0x9d, 0x59, 0x5c, 0x9c, 0x9b, 0x9b, 0x9a,\n  0xb2, 0xdb, 0xcd, 0x66, 0xbd, 0xfe, 0xe8, 0xe1, 0xc5, 0xa5, 0xc5, 0xa5,\n  0x5d, 0x3b, 0xe7, 0x16, 0xe6, 0x16, 0x76, 0xcc, 0x4f, 0xcd, 0x4e, 0xcd,\n  0xce, 0x4c, 0x4f, 0x8c, 0x0f, 0x0f, 0xf6, 0xf5, 0x74, 0x76, 0x14, 0x0b,\n  0xf9, 0x5c, 0x26, 0x15, 0x8b, 0x46, 0xc2, 0x78, 0xc6, 0x13, 0x7c, 0x3d,\n  0xb3, 0xcd, 0x6c, 0xb3, 0x5a, 0xf4, 0x26, 0xbd, 0xc9, 0xd2, 0xe2, 0x07,\n  0x96, 0x5c, 0x2c, 0xdb, 0x78, 0x39, 0x6d, 0x27, 0x1e, 0x35, 0x38, 0xec,\n  0xe6, 0x4a, 0x21, 0xf9, 0xa7, 0x81, 0x78, 0x4b, 0xe2, 0xdc, 0xeb, 0x7b,\n  0x02, 0x65, 0xcc, 0x56, 0x62, 0x65, 0xab, 0xa3, 0xb0, 0xb9, 0x5d, 0x4c,\n  0x66, 0x40, 0x5c, 0xe2, 0x1b, 0x77, 0xe2, 0xa7, 0x08, 0x56, 0xa1, 0xa4,\n  0xe4, 0x40, 0x24, 0x1b, 0x6a, 0x5f, 0x3e, 0xd3, 0x6e, 0x77, 0x64, 0x5c,\n  0x01, 0xef, 0xb3, 0xb5, 0xbf, 0x44, 0x9f, 0xbb, 0xf2, 0x14, 0xfd, 0xb5,\n  0xda, 0x52, 0xd4, 0xe5, 0x8e, 0xb0, 0x34, 0x7a, 0xae, 0x36, 0x4c, 0xb3,\n  0x11, 0xb7, 0x2b, 0xca, 0xd7, 0xca, 0xe8, 0x6f, 0x78, 0x9f, 0xb6, 0x45,\n  0x6b, 0xd1, 0xeb, 0x2d, 0xf0, 0xa3, 0x4d, 0x69, 0x6a, 0xcf, 0xd2, 0x5f,\n  0xbb, 0xf2, 0x14, 0xfa, 0x5c, 0xed, 0x2f, 0x9f, 0x4d, 0x9f, 0xc1, 0x46,\n  0xbc, 0xd3, 0xea, 0x0e, 0x30, 0x7f, 0x3e, 0xeb, 0x09, 0x9a, 0xbd, 0x3a,\n  0xb5, 0xd6, 0x1c, 0x97, 0xee, 0x4f, 0xa5, 0xee, 0x49, 0xa5, 0x1e, 0x4e,\n  0xa5, 0x26, 0xdd, 0x91, 0x88, 0x5b, 0xd0, 0xf1, 0x29, 0x5e, 0x27, 0xb8,\n  0xa2, 0x51, 0x97, 0x5e, 0x9b, 0xd2, 0xea, 0x4d, 0x6a, 0xb5, 0x09, 0x3f,\n  0xeb, 0xb4, 0x0e, 0x3a, 0xad, 0x56, 0xdf, 0x4f, 0x6a, 0xe2, 0xfa, 0x0f,\n  0xcd, 0x78, 0xc9, 0x13, 0x74, 0x26, 0x8b, 0x55, 0x22, 0x32, 0x6f, 0x6c,\n  0xe3, 0x55, 0xfa, 0xad, 0x90, 0x0f, 0x19, 0xb2, 0xa0, 0x82, 0x54, 0xa6,\n  0x7e, 0x4e, 0xe4, 0x45, 0x71, 0xe3, 0x15, 0x3c, 0x7c, 0x5f, 0xc7, 0x57,\n  0x0c, 0xc4, 0xd7, 0x2f, 0x4e, 0x70, 0xda, 0x58, 0x1a, 0xb8, 0x38, 0xa3,\n  0x6a, 0xf2, 0x7e, 0x3c, 0x07, 0x6e, 0x6e, 0xea, 0x55, 0x4a, 0xad, 0x3e,\n  0xaf, 0x9e, 0x89, 0x47, 0xc3, 0xca, 0xbf, 0x90, 0x08, 0xf0, 0x2e, 0x45,\n  0x00, 0x02, 0x94, 0xc2, 0x9c, 0xf2, 0x37, 0x7a, 0xd5, 0x5f, 0x41, 0xf9,\n  0x8b, 0xf6, 0x76, 0x76, 0x75, 0x75, 0xd6, 0xbe, 0x0e, 0xbf, 0xe9, 0xdd,\n  0xe4, 0xf3, 0x97, 0xc8, 0x67, 0xf2, 0xeb, 0xbd, 0x95, 0x4a, 0xf7, 0x06,\n  0xfe, 0xe9, 0x56, 0x7e, 0x7e, 0x59, 0xa9, 0x54, 0x48, 0x1b, 0x4b, 0xb8,\n  0x8d, 0xaa, 0xab, 0xdb, 0x58, 0xcf, 0xf7, 0xc3, 0x10, 0x4f, 0x60, 0xd8,\n  0x5d, 0x3c, 0x37, 0x0d, 0x69, 0x1d, 0x84, 0x55, 0x2c, 0x7b, 0xc0, 0xab,\n  0xf0, 0xaa, 0x36, 0x5a, 0xae, 0x6a, 0x53, 0xbd, 0xad, 0xe8, 0xaa, 0xeb,\n  0x25, 0xd2, 0x96, 0x83, 0xa4, 0x71, 0x7f, 0x43, 0x7e, 0xff, 0x1d, 0xb9,\n  0xb2, 0xd4, 0x68, 0x23, 0xb4, 0xed, 0x35, 0xdc, 0xb6, 0xda, 0x95, 0x8a,\n  0xfc, 0x4f, 0xde, 0xc3, 0xfd, 0x15, 0xed, 0x46, 0xff, 0x1b, 0xb7, 0xaf,\n  0x54, 0xc5, 0xcf, 0xb1, 0x18, 0x0d, 0x7a, 0x9e, 0x61, 0xd5, 0x2a, 0xd8,\n  0xa7, 0xe2, 0x31, 0xef, 0x99, 0x02, 0xbc, 0x52, 0x05, 0x64, 0x07, 0xc0,\n  0xf6, 0x65, 0xc6, 0x6e, 0xb5, 0x9a, 0xac, 0x56, 0xc2, 0xd5, 0xa3, 0x92,\n  0x43, 0x88, 0xdb, 0xe2, 0x25, 0x21, 0x5e, 0xc6, 0x7a, 0x59, 0xbc, 0x8c,\n  0x95, 0x34, 0x5b, 0xd9, 0x21, 0x14, 0x68, 0xf7, 0x53, 0x97, 0x32, 0x97,\n  0xfa, 0x2e, 0xa5, 0x2f, 0x3d, 0xfd, 0x34, 0xfe, 0xd5, 0x77, 0x47, 0xfa,\n  0xd2, 0x53, 0xff, 0x00, 0xdf, 0xd0, 0x53, 0x77, 0x64, 0xe0, 0xeb, 0x1d,\n  0x4f, 0x3f, 0x8d, 0x7f, 0xc9, 0xf1, 0xcf, 0xb5, 0x8f, 0x33, 0x2f, 0x6f,\n  0x3c, 0x81, 0xe9, 0x84, 0x75, 0x4c, 0xfc, 0x5e, 0x6a, 0x5c, 0xc6, 0x80,\n  0x5e, 0x22, 0x18, 0xd0, 0x07, 0x48, 0xf2, 0x89, 0x59, 0x59, 0xef, 0xb2,\n  0x10, 0xbd, 0x8b, 0xb3, 0x85, 0x38, 0x78, 0x1f, 0xf3, 0xf2, 0x95, 0xdb,\n  0x6b, 0x7f, 0xe2, 0x7a, 0xfd, 0x17, 0x07, 0x8b, 0x1f, 0x6b, 0xbd, 0xb7,\n  0x08, 0xb1, 0x45, 0xa5, 0x8d, 0x9f, 0xd1, 0x2b, 0xf4, 0x8f, 0x1b, 0x7a,\n  0xc4, 0x78, 0x75, 0x04, 0xf7, 0x40, 0x64, 0xd5, 0x0c, 0x2d, 0x30, 0x90,\n  0x38, 0x40, 0x39, 0x0f, 0x25, 0xc0, 0x49, 0xfc, 0xaa, 0x06, 0x11, 0x60,\n  0x09, 0x59, 0x86, 0x23, 0xea, 0x8d, 0xd2, 0xbb, 0xc9, 0xef, 0xb1, 0x89,\n  0x57, 0x32, 0xd7, 0x10, 0xd1, 0xcd, 0xd7, 0xd1, 0xa0, 0x22, 0x88, 0x7f,\n  0x52, 0x97, 0xcc, 0x8f, 0x2a, 0x1f, 0x5e, 0x57, 0xfe, 0xd2, 0xe7, 0xfd,\n  0x41, 0x10, 0xc9, 0x58, 0x1c, 0xff, 0xc5, 0x1b, 0x04, 0xf4, 0x67, 0xeb,\n  0x9f, 0xe4, 0x98, 0xa9, 0xab, 0xe7, 0x7b, 0xa6, 0xda, 0xc2, 0x22, 0x1a,\n  0x77, 0x8d, 0xdf, 0x3a, 0xd7, 0x61, 0x22, 0xc9, 0xde, 0xa9, 0xf5, 0x49,\n  0x44, 0x10, 0x9d, 0xae, 0x31, 0xd1, 0xb9, 0x6b, 0x4f, 0xf0, 0x17, 0xdf,\n  0x30, 0xb7, 0xe5, 0x79, 0x0d, 0x6b, 0x92, 0x7a, 0x9a, 0xfa, 0x2c, 0xea,\n  0xc2, 0xb6, 0x33, 0x40, 0x05, 0x7e, 0x9a, 0x52, 0x61, 0xdb, 0xf5, 0x8f,\n  0x3e, 0x8d, 0x2d, 0x1c, 0xd8, 0x77, 0xa2, 0x7e, 0x80, 0xdc, 0xd8, 0xf2,\n  0xe6, 0x29, 0x23, 0x19, 0xdb, 0x23, 0x1b, 0x01, 0xea, 0xcb, 0x1b, 0xaf,\n  0x62, 0xab, 0x64, 0x54, 0xf6, 0xcb, 0xb6, 0x82, 0xaf, 0x8f, 0xb2, 0x39,\n  0x4d, 0xd7, 0x23, 0x4c, 0x3c, 0x55, 0x57, 0xd3, 0x65, 0x6c, 0xb9, 0xac,\n  0x28, 0x85, 0x34, 0x9a, 0x97, 0x13, 0x66, 0x6b, 0x29, 0xad, 0xc9, 0x6a,\n  0xe2, 0x74, 0x2e, 0x6c, 0x06, 0xc8, 0x32, 0xb8, 0x04, 0xfc, 0xed, 0x48,\n  0xae, 0x52, 0xc9, 0xf9, 0xe2, 0xed, 0x89, 0x8e, 0x7c, 0xae, 0x23, 0x2e,\n  0x05, 0x06, 0x40, 0x37, 0xb0, 0x6e, 0xfc, 0x0c, 0xbd, 0x0f, 0xf3, 0x0c,\n  0x0b, 0xe5, 0xa3, 0x92, 0xd4, 0x40, 0xb5, 0x0f, 0x53, 0x8a, 0xb2, 0x42,\n  0x4e, 0x4d, 0x1a, 0xe6, 0x33, 0xa4, 0x3d, 0x45, 0xec, 0xe5, 0xfa, 0x01,\n  0xff, 0x39, 0x70, 0x8c, 0x61, 0x56, 0xc1, 0x53, 0xe6, 0x3c, 0x33, 0x13,\n  0xc0, 0xf4, 0x8e, 0x4a, 0xfe, 0x64, 0x20, 0xe9, 0xf3, 0xe2, 0x07, 0x58,\n  0x62, 0x02, 0xd8, 0x4a, 0xcc, 0x96, 0xe3, 0x12, 0x3d, 0x6d, 0xb3, 0xc5,\n  0x95, 0x7c, 0x4f, 0xf1, 0xe6, 0x21, 0x7f, 0xbb, 0x25, 0x96, 0xf0, 0xb7,\n  0xed, 0x2e, 0x1e, 0x38, 0xe5, 0x2e, 0x25, 0xec, 0x21, 0xb3, 0x4e, 0xe7,\n  0x49, 0x44, 0x35, 0x83, 0xa5, 0x10, 0x1e, 0x6c, 0x18, 0xf0, 0xe7, 0xd1,\n  0x9f, 0xab, 0xad, 0x9d, 0x0e, 0xe7, 0x9e, 0x85, 0x4c, 0x7f, 0xd9, 0x67,\n  0x94, 0xf2, 0x09, 0xed, 0x7b, 0x6c, 0xf6, 0x40, 0x6b, 0xc6, 0x5d, 0xea,\n  0x60, 0xae, 0x1c, 0xf0, 0x07, 0x82, 0x3e, 0x5f, 0x10, 0xb7, 0x00, 0xd3,\n  0x31, 0x80, 0xfb, 0xf0, 0xbb, 0xf4, 0x4b, 0xc8, 0x20, 0x2e, 0xa2, 0x4f,\n  0xd2, 0x7f, 0xd3, 0x88, 0x40, 0xfc, 0x1b, 0xc5, 0x57, 0xc4, 0xb1, 0xe1,\n  0xa6, 0x27, 0x36, 0xfe, 0x17, 0x1a, 0x05, 0x5b, 0xa0, 0xf6, 0xab, 0x7a,\n  0x8c, 0x22, 0x36, 0x35, 0x7f, 0xd5, 0xf0, 0x6d, 0xb8, 0x88, 0xac, 0xe8,\n  0x2c, 0xc9, 0xc1, 0x60, 0xa0, 0x1e, 0x78, 0x16, 0x36, 0x3c, 0x59, 0xf0,\n  0x8e, 0x07, 0xd8, 0x48, 0x33, 0xf8, 0x1c, 0x50, 0xf7, 0x41, 0x84, 0x95,\n  0xac, 0xcf, 0x21, 0xd0, 0x9c, 0x8d, 0xe0, 0x26, 0x2b, 0x97, 0x34, 0x8d,\n  0x02, 0xb1, 0x24, 0xe7, 0x3d, 0x72, 0x80, 0xea, 0x76, 0x37, 0x5e, 0xf3,\n  0x1e, 0xf0, 0x4c, 0x34, 0x09, 0x3c, 0x45, 0xe9, 0x34, 0xbc, 0x41, 0x30,\n  0x40, 0x92, 0x07, 0xb0, 0x68, 0x2d, 0x26, 0xcc, 0x21, 0x4c, 0xe5, 0x06,\n  0x12, 0xeb, 0xc5, 0x6f, 0xb8, 0x3f, 0x75, 0x17, 0xe8, 0x15, 0x19, 0xdc,\n  0xe0, 0xae, 0xdb, 0xb2, 0x27, 0x6b, 0xdf, 0xbf, 0x17, 0xb4, 0x86, 0x42,\n  0x51, 0xd6, 0x19, 0x7a, 0x37, 0x3e, 0x8a, 0x9e, 0x45, 0x31, 0x3c, 0xb2,\n  0xfc, 0xd3, 0x34, 0xf8, 0x8f, 0x70, 0xa8, 0x8c, 0xd0, 0x23, 0xb5, 0x3f,\n  0x88, 0xa2, 0x85, 0x1d, 0x68, 0x31, 0x52, 0xfb, 0x88, 0x52, 0x0f, 0xed,\n  0x40, 0xcf, 0x12, 0xfd, 0x55, 0xa9, 0x87, 0x36, 0xeb, 0xa1, 0x46, 0x45,\n  0x44, 0x5d, 0xc6, 0xaf, 0xb9, 0x9e, 0xd0, 0xc5, 0x5c, 0x35, 0x60, 0x6b,\n  0x89, 0x66, 0xa9, 0x09, 0x08, 0xb2, 0x35, 0x22, 0x3c, 0xd6, 0x16, 0x09,\n  0x5a, 0xf7, 0x4c, 0x09, 0xb7, 0x49, 0x69, 0x0d, 0xb9, 0x67, 0x53, 0x6f,\n  0xeb, 0xad, 0x76, 0x37, 0xb4, 0x36, 0x40, 0xa0, 0xc6, 0x5a, 0x1b, 0x5e,\n  0x87, 0x90, 0x83, 0x95, 0xbf, 0x5a, 0x57, 0x03, 0xd7, 0xaa, 0x66, 0x1d,\n  0x4d, 0xf8, 0xaf, 0xe8, 0x68, 0xbf, 0x99, 0x5e, 0xf6, 0x1b, 0xeb, 0x63,\n  0xb8, 0x2f, 0x4f, 0x6e, 0x18, 0xd0, 0x0d, 0xd8, 0x96, 0x23, 0xf9, 0xeb,\n  0x93, 0x64, 0x4d, 0xca, 0x79, 0x90, 0xd6, 0x88, 0x1d, 0x07, 0x3e, 0x22,\n  0x67, 0x19, 0x39, 0x7f, 0x3d, 0xc1, 0x0a, 0x92, 0xcb, 0x94, 0xcb, 0x5b,\n  0xf2, 0xd7, 0xc3, 0x72, 0x34, 0x11, 0x6f, 0x07, 0xd3, 0x93, 0xe5, 0xc7,\n  0x1e, 0xfb, 0x77, 0xe6, 0x47, 0xb5, 0x48, 0xae, 0x16, 0xc1, 0xf3, 0x33,\n  0xb9, 0xd1, 0x89, 0x7e, 0x45, 0xfd, 0x12, 0xf3, 0x08, 0x1d, 0x9e, 0x9f,\n  0x8c, 0x32, 0x37, 0x99, 0xc6, 0xfe, 0xd4, 0x27, 0x37, 0x5e, 0x45, 0x1d,\n  0xd4, 0x2d, 0xd8, 0x20, 0x37, 0x5d, 0x2f, 0xc7, 0x08, 0xbe, 0x42, 0x6f,\n  0x34, 0xf8, 0x9b, 0x54, 0x0d, 0x6e, 0xf2, 0x34, 0x92, 0x2f, 0x65, 0x95,\n  0x93, 0xd7, 0xa7, 0xcc, 0xd3, 0x88, 0x3d, 0x71, 0x0d, 0x41, 0x88, 0x96,\n  0x09, 0xff, 0xfa, 0xd6, 0x55, 0xd2, 0xef, 0xca, 0xf3, 0x0d, 0xa9, 0x07,\n  0xdd, 0x7a, 0x92, 0x62, 0xe9, 0x31, 0x7a, 0x1f, 0xf5, 0x37, 0xdc, 0x4f,\n  0x64, 0x27, 0xc5, 0xde, 0x33, 0x88, 0xe3, 0x57, 0x96, 0x69, 0x96, 0x9b,\n  0x42, 0x0c, 0x7b, 0x5f, 0x5f, 0x6f, 0x02, 0x1b, 0x35, 0x39, 0x17, 0xad,\n  0xa3, 0xdb, 0x22, 0x34, 0xd2, 0x3d, 0x89, 0x0c, 0xe8, 0x0f, 0xac, 0x16,\n  0xc6, 0x6c, 0xfa, 0xcb, 0x4f, 0xf2, 0x8c, 0x05, 0x96, 0x81, 0x45, 0x9c,\n  0x92, 0x44, 0xda, 0x80, 0x26, 0x4f, 0x22, 0x61, 0xc2, 0x23, 0xaf, 0xab,\n  0x9e, 0xff, 0xca, 0x53, 0xf0, 0xfd, 0xf0, 0x20, 0x7a, 0x12, 0x3f, 0xc4,\n  0xf2, 0xdf, 0xd2, 0x14, 0x9b, 0xd2, 0x14, 0xf5, 0xff, 0x9f, 0xa6, 0x84,\n  0xaf, 0x7a, 0x88, 0xf8, 0x5f, 0x79, 0x48, 0xa6, 0xe9, 0x21, 0x9a, 0xab,\n  0x1f, 0xa2, 0xff, 0x8d, 0x1e, 0x52, 0xad, 0x5e, 0xfb, 0x7e, 0x64, 0xd4,\n  0x45, 0x10, 0x32, 0x6e, 0xf7, 0x08, 0xcd, 0xe6, 0x23, 0x56, 0xc8, 0x3f,\n  0x79, 0x9c, 0x97, 0x54, 0xd8, 0xb0, 0x12, 0xee, 0xc5, 0x06, 0x16, 0xc7,\n  0xdf, 0xab, 0x11, 0x71, 0xcf, 0x00, 0x7a, 0xf5, 0x32, 0xf8, 0xd7, 0xeb,\n  0x18, 0x5a, 0x77, 0x99, 0xd2, 0x21, 0x46, 0x87, 0x2e, 0x61, 0x73, 0xd2,\n  0xc0, 0x20, 0xc3, 0x25, 0xca, 0x60, 0x62, 0x0c, 0xa6, 0x4b, 0x94, 0xc9,\n  0xcc, 0x98, 0xcc, 0x97, 0x28, 0x33, 0x7e, 0x87, 0xe5, 0x12, 0xb6, 0x2f,\n  0xb1, 0x6c, 0x60, 0x2c, 0x72, 0x4c, 0x97, 0xb2, 0xb7, 0x22, 0x4f, 0x80,\n  0x3d, 0x94, 0x4a, 0x50, 0xdd, 0x4b, 0xfd, 0xbf, 0x7a, 0x85, 0xe5, 0xff,\n  0x6d, 0x0f, 0x60, 0xde, 0x1c, 0xd8, 0xec, 0x01, 0xc5, 0xab, 0xff, 0x1b,\n  0xde, 0xa0, 0x56, 0x13, 0x10, 0xaf, 0xa6, 0xd7, 0x40, 0xf8, 0xd2, 0xd1,\n  0xab, 0x5f, 0x83, 0x79, 0xaa, 0xc8, 0xb1, 0x90, 0xdf, 0x85, 0xe1, 0x44,\n  0xe6, 0xd2, 0x7f, 0xdb, 0xcb, 0x60, 0x13, 0xe0, 0xe4, 0xb5, 0x5f, 0xa6,\n  0xe5, 0x44, 0xed, 0x25, 0x4a, 0xcb, 0x70, 0xda, 0xff, 0xcb, 0x77, 0x52,\n  0xd7, 0x7e, 0x65, 0x78, 0x9b, 0x57, 0x52, 0x6a, 0x4e, 0xfd, 0xdf, 0xfb,\n  0xde, 0x2d, 0xaf, 0x84, 0x75, 0x76, 0xd3, 0x76, 0xaf, 0x84, 0x4c, 0xc5,\n  0x9c, 0x06, 0x20, 0x86, 0xe1, 0xc5, 0x97, 0xb6, 0xbe, 0x18, 0x73, 0x76,\n  0x3d, 0x43, 0xeb, 0x2f, 0x53, 0x7a, 0x1d, 0xa3, 0xd7, 0x5d, 0xfa, 0xaf,\n  0xbe, 0xbe, 0xfa, 0x7f, 0x98, 0x7b, 0x0f, 0xf8, 0xb8, 0x8a, 0x6b, 0x61,\n  0x7c, 0x66, 0xee, 0xee, 0xde, 0xed, 0xbd, 0x57, 0x6d, 0xd3, 0xaa, 0x97,\n  0xad, 0xea, 0x5a, 0xad, 0x8a, 0x2d, 0x4b, 0x96, 0xe4, 0x86, 0x2d, 0x83,\n  0x2b, 0x6e, 0x32, 0xcd, 0xa6, 0x18, 0xd3, 0x0d, 0xc1, 0xa6, 0x18, 0x30,\n  0x1d, 0x63, 0x4a, 0x0c, 0x98, 0xe6, 0x04, 0x02, 0x84, 0x96, 0x10, 0x5a,\n  0x42, 0x12, 0x6c, 0xe0, 0x85, 0x80, 0x21, 0x84, 0x90, 0x84, 0x24, 0xa4,\n  0xbe, 0xef, 0xf1, 0x52, 0x5e, 0x02, 0x2f, 0x41, 0x77, 0xff, 0x67, 0xe6,\n  0xde, 0x2d, 0x92, 0x65, 0xc7, 0x76, 0xf2, 0xfd, 0xbe, 0xbf, 0xec, 0xdd,\n  0xbd, 0xf5, 0xcc, 0x99, 0x76, 0xda, 0x9c, 0x39, 0xe7, 0x92, 0x7f, 0xbd,\n  0x64, 0x23, 0xa7, 0x33, 0x5e, 0x8a, 0x8c, 0x98, 0x33, 0xd2, 0x3c, 0xe6,\n  0xc7, 0x55, 0xfe, 0xb8, 0xf4, 0x97, 0x0d, 0xbd, 0xfe, 0xfd, 0x57, 0x5f,\n  0x7e, 0xea, 0x89, 0x07, 0x1f, 0xb8, 0x6f, 0xef, 0x9d, 0x77, 0xdc, 0x76,\n  0xeb, 0xce, 0x6b, 0x2e, 0xbd, 0xf8, 0xc2, 0x0b, 0xce, 0xde, 0x54, 0x55,\n  0x5b, 0x5b, 0x5b, 0xef, 0x6d, 0xf0, 0x18, 0xad, 0xa0, 0x4f, 0x81, 0xd8,\n  0x11, 0x2b, 0xa4, 0x49, 0x65, 0x5c, 0xd8, 0xee, 0xc8, 0x88, 0x39, 0x7c,\n  0xe0, 0xc4, 0x4f, 0x1c, 0xf4, 0x0e, 0x13, 0xe7, 0xd8, 0x8d, 0x62, 0x8e,\n  0x55, 0x38, 0x29, 0xee, 0x2d, 0xb7, 0x97, 0x9d, 0x4c, 0xb9, 0x43, 0x4f,\n  0xa8, 0x3f, 0x1b, 0x55, 0xcf, 0xcb, 0xbc, 0x6b, 0xe2, 0xd2, 0x31, 0x5f,\n  0x7e, 0xa2, 0x98, 0x7a, 0x66, 0x20, 0xec, 0x50, 0xcc, 0x2f, 0xca, 0x32,\n  0x05, 0x89, 0x19, 0x26, 0x79, 0xde, 0x2e, 0x5e, 0xa7, 0x49, 0x6a, 0x2a,\n  0x63, 0x3f, 0xd6, 0x86, 0xe4, 0x06, 0xa7, 0x1e, 0x83, 0x96, 0xa6, 0xa6,\n  0xfb, 0x3f, 0x74, 0xbc, 0x93, 0xd3, 0xe8, 0x94, 0x0a, 0xa5, 0x52, 0x49,\n  0xb0, 0x52, 0xa3, 0x30, 0xc9, 0x94, 0x72, 0x4e, 0x0b, 0x52, 0x09, 0xcf,\n  0x9b, 0x89, 0x4a, 0xa9, 0x55, 0xd0, 0x78, 0xdf, 0xa0, 0x33, 0xe9, 0x65,\n  0x4a, 0x8e, 0xfa, 0x60, 0x5a, 0x64, 0x1a, 0x1d, 0x8d, 0x38, 0xcd, 0x6b,\n  0xb1, 0x4c, 0xa5, 0x90, 0xd3, 0x64, 0x5c, 0x5a, 0x8b, 0x46, 0xe7, 0xd4,\n  0x59, 0x9c, 0x6a, 0xb5, 0xcc, 0x57, 0xa9, 0xb7, 0x6b, 0xfc, 0x3e, 0x5e,\n  0xa1, 0x89, 0xfa, 0x1a, 0x95, 0x06, 0x79, 0xb8, 0x5a, 0xab, 0x56, 0x58,\n  0xa3, 0x01, 0xaf, 0xd2, 0x66, 0x8e, 0x05, 0x01, 0xbc, 0xa3, 0x6e, 0xc0,\n  0xaa, 0xab, 0xaf, 0xd3, 0x68, 0x83, 0xcd, 0xcd, 0x46, 0x33, 0xe7, 0x8f,\n  0x45, 0xb5, 0x1a, 0x33, 0xc6, 0x51, 0x9f, 0xa5, 0x36, 0x28, 0xd7, 0xbb,\n  0x32, 0x8d, 0x5a, 0xad, 0xaf, 0xca, 0x14, 0xa9, 0x93, 0xc9, 0x2c, 0x3a,\n  0x63, 0xc8, 0x69, 0xe9, 0x6a, 0xd3, 0x2a, 0x2c, 0x3a, 0x95, 0x23, 0x65,\n  0x6d, 0x94, 0x05, 0xab, 0xa3, 0x2a, 0x85, 0x4e, 0xaf, 0x55, 0x54, 0xf8,\n  0x39, 0x8f, 0xa1, 0x2a, 0xaa, 0xb2, 0x1a, 0x79, 0x4d, 0xa3, 0xc6, 0xc3,\n  0x47, 0x6b, 0xf5, 0x16, 0x8d, 0x59, 0xa3, 0x09, 0x79, 0xbd, 0x9a, 0x56,\n  0x97, 0x0f, 0xaa, 0xe3, 0x6c, 0xc6, 0x7e, 0x75, 0xad, 0xd9, 0xa6, 0xd3,\n  0x6b, 0x54, 0x1e, 0xa3, 0x45, 0x19, 0x56, 0xab, 0x41, 0x84, 0x82, 0xd6,\n  0x50, 0xb9, 0xad, 0x3a, 0xde, 0x6f, 0xe5, 0x9c, 0x6a, 0xa2, 0x70, 0x58,\n  0x70, 0x54, 0xa5, 0x92, 0xa9, 0x8c, 0x20, 0xff, 0x70, 0xa0, 0xbd, 0x41,\n  0x6b, 0x18, 0x94, 0x72, 0x25, 0x09, 0x6b, 0xd4, 0x2a, 0xa2, 0xd2, 0x2b,\n  0xb5, 0x11, 0x83, 0x41, 0xab, 0x30, 0x9b, 0x0c, 0x9c, 0x8f, 0xa8, 0xb5,\n  0x2a, 0x39, 0xaf, 0xb6, 0x72, 0x44, 0xa5, 0x22, 0x36, 0x99, 0x5a, 0xa7,\n  0x53, 0x1a, 0xb5, 0x6c, 0xff, 0xbb, 0xa8, 0x7f, 0xe6, 0x4f, 0x67, 0xfa,\n  0x27, 0x47, 0x3d, 0x80, 0xe9, 0xa6, 0x1f, 0x84, 0x17, 0xb3, 0x8d, 0xba,\n  0x2b, 0xd8, 0x0a, 0x88, 0x18, 0x9b, 0xd3, 0xc4, 0x81, 0x70, 0x08, 0x8a,\n  0x27, 0x28, 0x9d, 0x5f, 0x38, 0x57, 0x26, 0x93, 0xd4, 0xf7, 0x39, 0xff,\n  0x67, 0xae, 0x13, 0xf4, 0x8c, 0x18, 0x0a, 0xe1, 0x07, 0xd9, 0xe2, 0x42,\n  0x48, 0xf4, 0x89, 0xce, 0xff, 0x99, 0x2c, 0x67, 0x36, 0x8b, 0x10, 0x13,\n  0x95, 0x64, 0x78, 0x0f, 0xbb, 0x5e, 0x8d, 0xf4, 0xe8, 0x15, 0x10, 0x63,\n  0xa8, 0x8c, 0x83, 0xd0, 0x2e, 0x51, 0x6f, 0xda, 0x25, 0xea, 0x4d, 0xb3,\n  0xd1, 0xe5, 0xa0, 0x53, 0x29, 0x25, 0x9d, 0xaa, 0xec, 0x1e, 0x88, 0x94,\n  0x61, 0x10, 0x44, 0xdf, 0x66, 0x79, 0x58, 0x2d, 0x28, 0x96, 0x8d, 0x50,\n  0xd3, 0x02, 0x0d, 0xe0, 0x8e, 0x99, 0xf5, 0x9a, 0x65, 0x73, 0x61, 0x71,\n  0xf2, 0xce, 0x91, 0x8f, 0x44, 0xc2, 0x85, 0x65, 0x18, 0x1a, 0xfa, 0x2e,\n  0x15, 0xb4, 0x85, 0x1d, 0x65, 0x36, 0x4b, 0x6c, 0x4d, 0x7d, 0x0b, 0x3f,\n  0xf6, 0xad, 0x59, 0xcc, 0x80, 0x67, 0xb5, 0x3a, 0x01, 0xec, 0xe5, 0xa9,\n  0xd4, 0x43, 0xcc, 0x3c, 0x59, 0xb0, 0xcf, 0x95, 0xca, 0x62, 0x56, 0x52,\n  0x5c, 0x5e, 0x12, 0xa6, 0xcb, 0x3c, 0x46, 0x6a, 0x1c, 0x2d, 0x40, 0x97,\n  0x20, 0x8a, 0x80, 0x98, 0xce, 0xd1, 0x81, 0x47, 0xf1, 0x73, 0x4c, 0x06,\n  0xe7, 0x51, 0x35, 0x8d, 0x39, 0x2f, 0xae, 0x43, 0x31, 0x1f, 0x48, 0xba,\n  0xee, 0xb0, 0x91, 0x1b, 0x91, 0x51, 0xef, 0x28, 0x5e, 0xc6, 0x2b, 0xe4,\n  0xac, 0x5d, 0x15, 0x54, 0xe8, 0x36, 0x05, 0x4d, 0x18, 0x3e, 0x1d, 0xf8,\n  0x22, 0xe1, 0x9b, 0xd8, 0x04, 0x30, 0x2e, 0x12, 0xb6, 0xe3, 0x01, 0x1a,\n  0x46, 0x17, 0x2a, 0x1b, 0xcf, 0xff, 0x89, 0xb3, 0x90, 0xf7, 0xca, 0xd6,\n  0x06, 0x56, 0x64, 0x4f, 0xb1, 0x98, 0x8d, 0x06, 0x19, 0xc2, 0x0e, 0xab,\n  0x49, 0x0f, 0xd2, 0x80, 0xdd, 0xa6, 0xe3, 0x68, 0x6c, 0xa8, 0x19, 0x75,\n  0xfd, 0x4d, 0x53, 0x74, 0x7d, 0xd1, 0x62, 0x8f, 0x67, 0xb0, 0xd7, 0xcf,\n  0xac, 0xeb, 0xe3, 0x18, 0x53, 0x23, 0x1c, 0x18, 0xf3, 0x58, 0x7e, 0x0c,\n  0x26, 0x7b, 0x7c, 0xaf, 0xd7, 0xe5, 0xf2, 0xfa, 0xdc, 0x6e, 0xe1, 0xe9,\n  0x06, 0x1c, 0x17, 0xde, 0x6a, 0xc0, 0x49, 0x9c, 0x6a, 0x10, 0xde, 0xc4,\n  0xf1, 0x06, 0xe1, 0x2d, 0xe1, 0x7b, 0x4e, 0xbf, 0xdf, 0xe9, 0xf2, 0xfb,\n  0xc9, 0xc9, 0xd2, 0x81, 0xf0, 0xa8, 0xf4, 0x38, 0x59, 0x5e, 0xe1, 0xf5,\n  0x54, 0x54, 0x78, 0xbc, 0x15, 0x93, 0xf7, 0x37, 0xe0, 0x34, 0x4e, 0x35,\n  0x0a, 0x6f, 0xe0, 0x64, 0x83, 0xf0, 0x86, 0x70, 0x00, 0x4e, 0xf5, 0x9e,\n  0x40, 0xc0, 0xeb, 0x0d, 0x04, 0x3c, 0x85, 0x5f, 0xe1, 0x60, 0xe1, 0xf1,\n  0x69, 0x36, 0x14, 0x7f, 0xd6, 0xc3, 0x8b, 0x51, 0x66, 0x60, 0x18, 0xb3,\n  0xe5, 0x1e, 0x6a, 0xbf, 0x41, 0xa3, 0xd0, 0x77, 0x2c, 0x46, 0x42, 0x34,\n  0xc8, 0xc6, 0x05, 0xf7, 0xa6, 0xf0, 0xdc, 0xe4, 0x25, 0xdc, 0xef, 0xfe,\n  0xfe, 0x99, 0xf0, 0xfc, 0xd3, 0xc9, 0xe4, 0x76, 0x18, 0x83, 0xcb, 0xf3,\n  0x97, 0x93, 0x61, 0xd0, 0x0b, 0x66, 0xa1, 0xad, 0xe4, 0x4b, 0x08, 0x34,\n  0xca, 0xac, 0x28, 0xab, 0x87, 0x41, 0x56, 0xff, 0x1a, 0x8c, 0xe7, 0x59,\n  0x30, 0xce, 0x5f, 0x28, 0xbb, 0x5e, 0x97, 0xbf, 0x0c, 0xfd, 0x80, 0x54,\n  0xc2, 0x75, 0x3f, 0xfa, 0xb4, 0x70, 0x1d, 0xc6, 0xc0, 0x56, 0x18, 0x0f,\n  0x17, 0x33, 0xfd, 0xca, 0x44, 0xb5, 0xfe, 0x4a, 0xba, 0x4b, 0x85, 0xda,\n  0x30, 0x76, 0x14, 0x17, 0x0c, 0x45, 0x95, 0x9b, 0x6e, 0x6b, 0x93, 0x89,\n  0xd6, 0x78, 0x7a, 0x93, 0xa3, 0x69, 0x62, 0x64, 0x13, 0x65, 0xab, 0x8a,\n  0xe3, 0xcf, 0xd1, 0x01, 0x6d, 0x94, 0xeb, 0x3c, 0x54, 0x2d, 0x9b, 0x36,\n  0x9a, 0x1f, 0x4b, 0x61, 0xd9, 0x0f, 0x86, 0xca, 0xc6, 0xf2, 0xb3, 0xa9,\n  0x3b, 0x99, 0xa5, 0xd9, 0xe5, 0x82, 0xea, 0x96, 0x70, 0x70, 0x65, 0xed,\n  0x14, 0xa9, 0x1d, 0x53, 0x56, 0x2b, 0x59, 0xb8, 0x08, 0x11, 0x26, 0x83,\n  0xc3, 0x5e, 0xa7, 0x8f, 0x5d, 0x09, 0x47, 0x5b, 0x25, 0xdc, 0xff, 0x9f,\n  0xeb, 0xcc, 0x26, 0xde, 0x54, 0xd0, 0x99, 0xb1, 0x29, 0x96, 0x71, 0x98,\n  0x62, 0xe5, 0xe3, 0xac, 0xef, 0x15, 0xf7, 0x87, 0xcf, 0x15, 0xcc, 0xf1,\n  0x56, 0xec, 0x3b, 0xad, 0xe1, 0x62, 0xe1, 0x7b, 0xdb, 0x8b, 0xe6, 0xf6,\n  0x19, 0xf4, 0x66, 0x47, 0x0c, 0x3b, 0x56, 0x47, 0xf0, 0x82, 0xe8, 0x7c,\n  0xd0, 0x88, 0x23, 0x33, 0xeb, 0xcc, 0x96, 0xc2, 0x33, 0x58, 0x7a, 0xa8,\n  0x5c, 0x5f, 0x76, 0x66, 0x6d, 0xac, 0x49, 0xd0, 0x1c, 0x4a, 0x25, 0xb7,\n  0x30, 0x2b, 0xa7, 0x9c, 0x14, 0xd1, 0xc3, 0x59, 0x40, 0xa9, 0x88, 0xca,\n  0x34, 0xbd, 0xb9, 0x25, 0x9b, 0xa2, 0xde, 0x61, 0xa0, 0x2c, 0x6f, 0x43,\n  0x74, 0xf9, 0x50, 0x76, 0x29, 0x4d, 0x6d, 0x0b, 0x7d, 0xbe, 0x56, 0x4a,\n  0xa3, 0xc1, 0x6d, 0xa2, 0x7e, 0xec, 0x75, 0x35, 0xb1, 0xa8, 0xc7, 0x45,\n  0x1d, 0x14, 0x0b, 0x1a, 0x33, 0x96, 0x42, 0x33, 0x97, 0xd2, 0x17, 0x94,\n  0xb9, 0x65, 0x15, 0x73, 0xbf, 0x25, 0xe2, 0x99, 0x22, 0xcb, 0xc5, 0x3d,\n  0x0d, 0xad, 0x2e, 0xa3, 0x52, 0xa5, 0xaf, 0xf2, 0xdb, 0x9c, 0x5a, 0xde,\n  0xa8, 0x32, 0xe8, 0xdc, 0xc9, 0xca, 0xf6, 0x59, 0xc0, 0x2a, 0xf4, 0x21,\n  0x6f, 0xa5, 0xd3, 0x60, 0x51, 0xeb, 0x0c, 0x3e, 0xd0, 0x99, 0x23, 0xed,\n  0x15, 0xae, 0x8c, 0xd3, 0xd5, 0xe4, 0xac, 0x08, 0x18, 0x54, 0x0a, 0xd0,\n  0x95, 0xb5, 0x01, 0x47, 0x77, 0x0a, 0x74, 0x67, 0x57, 0x83, 0xb5, 0x2a,\n  0x64, 0xd3, 0xeb, 0x4c, 0x5a, 0x6d, 0xc8, 0x4d, 0xeb, 0xf1, 0x14, 0xe8,\n  0xcc, 0x97, 0x4f, 0xd7, 0x99, 0x11, 0xf4, 0xe1, 0x7a, 0xb6, 0xfa, 0x58,\n  0xa6, 0x33, 0xd3, 0x2c, 0x1b, 0x85, 0x7b, 0x47, 0xd0, 0x99, 0xe5, 0x6c,\n  0x0d, 0x3b, 0x61, 0xc2, 0x73, 0x76, 0xef, 0xce, 0xfc, 0x09, 0x7f, 0xd4,\n  0x8c, 0x3f, 0xfa, 0xc2, 0x21, 0xce, 0x9d, 0x75, 0xe8, 0x41, 0xfc, 0x23,\n  0xe2, 0x00, 0x0e, 0x11, 0xa0, 0x9e, 0xbd, 0xd0, 0x5c, 0x32, 0xd1, 0xaa,\n  0x20, 0x79, 0x09, 0x9e, 0xc1, 0x8d, 0x98, 0x8c, 0x34, 0x9c, 0x88, 0x31,\n  0x60, 0x0a, 0xa8, 0x80, 0x93, 0x60, 0x83, 0x42, 0x74, 0x12, 0x28, 0x4f,\n  0x2e, 0x4b, 0xb7, 0x67, 0x95, 0x25, 0x98, 0xb4, 0xdb, 0x71, 0x20, 0xb1,\n  0x30, 0x1e, 0x5f, 0x98, 0x48, 0x2c, 0x88, 0xc7, 0x17, 0x24, 0xc2, 0x2d,\n  0xa1, 0x50, 0x4b, 0x38, 0xdc, 0x1a, 0x0a, 0xb5, 0x3e, 0x08, 0x17, 0x93,\n  0xf4, 0x62, 0x12, 0x1e, 0xe8, 0x08, 0xb5, 0x86, 0x8b, 0xf7, 0x44, 0xbb,\n  0xe3, 0x61, 0x36, 0xec, 0x6c, 0xa4, 0xdc, 0x72, 0x4d, 0x5d, 0xfc, 0xe4,\n  0xab, 0x68, 0xec, 0x98, 0xcd, 0xf2, 0x29, 0x16, 0xc7, 0xe9, 0x66, 0xeb,\n  0xa3, 0x98, 0xab, 0x27, 0xf7, 0xce, 0x60, 0xa8, 0x2e, 0xa9, 0xeb, 0x94,\n  0x03, 0xbf, 0xcf, 0xdd, 0x8d, 0xcf, 0x83, 0xf2, 0xe3, 0xd9, 0x46, 0xba,\n  0xae, 0xcf, 0x21, 0xcc, 0x4d, 0x50, 0x6b, 0x0b, 0x41, 0xe3, 0xd4, 0xd7,\n  0x95, 0xac, 0xa2, 0x16, 0x3e, 0x32, 0x0f, 0x23, 0x2b, 0x70, 0x05, 0x6a,\n  0x6d, 0x91, 0x71, 0x34, 0x1d, 0x93, 0x18, 0x66, 0x45, 0x0a, 0x40, 0x49,\n  0x73, 0x38, 0x4a, 0x71, 0x2a, 0xfd, 0x84, 0xfc, 0xba, 0xa5, 0x5b, 0x9b,\n  0x54, 0x9f, 0x35, 0xd4, 0x7a, 0xe1, 0x05, 0xe7, 0x26, 0x32, 0x59, 0x4d,\n  0x52, 0x73, 0xe6, 0x50, 0xfb, 0x05, 0xe7, 0x9f, 0x8d, 0x5d, 0x89, 0xe8,\n  0xdc, 0x11, 0x6f, 0xc4, 0x9b, 0x8c, 0xce, 0x1d, 0x85, 0x1f, 0xc9, 0x36,\n  0x01, 0x3c, 0xb1, 0xd0, 0x06, 0x8c, 0xab, 0x49, 0x4b, 0x9e, 0x25, 0xbb,\n  0xab, 0xe4, 0xd8, 0x5c, 0x68, 0x85, 0x29, 0x16, 0x0a, 0xf9, 0x74, 0x6b,\n  0xeb, 0xb2, 0x92, 0xb5, 0x15, 0x57, 0x4d, 0xb1, 0xb3, 0x4a, 0x6b, 0x07,\n  0x04, 0xc5, 0x71, 0x80, 0xa8, 0x48, 0x3f, 0xdd, 0x5f, 0x4a, 0xe3, 0xa8,\n  0x59, 0xb0, 0x8c, 0x26, 0x76, 0x20, 0x64, 0xd8, 0x8f, 0x39, 0x3c, 0x64,\n  0xc6, 0x72, 0x16, 0x3a, 0x8d, 0xa3, 0x4b, 0x98, 0x32, 0x22, 0x97, 0x8d,\n  0x17, 0x53, 0x99, 0x8a, 0x88, 0xc8, 0xe4, 0xf3, 0x22, 0xf4, 0x8f, 0x6d,\n  0x4e, 0x2c, 0x5f, 0xca, 0x74, 0x54, 0x96, 0xb6, 0xaa, 0x97, 0x6f, 0x03,\n  0xfe, 0x4f, 0x97, 0xcd, 0xea, 0x76, 0x5b, 0x6d, 0xae, 0x50, 0xa4, 0xd1,\n  0xee, 0xed, 0x72, 0x36, 0xcd, 0xf6, 0xb5, 0x36, 0x44, 0x1a, 0x6d, 0xbe,\n  0x2e, 0x67, 0xf3, 0x2c, 0x6f, 0x3b, 0xd1, 0xfa, 0x3d, 0x1e, 0xbf, 0xd7,\n  0xef, 0xfd, 0x9a, 0x51, 0x13, 0x72, 0x8d, 0xa4, 0xb4, 0x56, 0xfa, 0x3b,\n  0x37, 0xad, 0x63, 0xb8, 0xa2, 0x4b, 0x88, 0x0a, 0xdf, 0xcf, 0xb8, 0x33,\n  0xe0, 0x4a, 0xfd, 0x7c, 0x2d, 0x80, 0x1a, 0xcb, 0x9a, 0x47, 0x71, 0xa5,\n  0x89, 0x1d, 0xd9, 0x7c, 0x98, 0x28, 0xad, 0x15, 0xcb, 0x29, 0xce, 0x33,\n  0xe0, 0x8a, 0x8f, 0x80, 0x1f, 0x5f, 0x2e, 0xc7, 0xe8, 0x66, 0xc4, 0x71,\n  0xb4, 0x50, 0x05, 0xdc, 0x3d, 0x0d, 0xc9, 0xf3, 0x02, 0x1e, 0x2f, 0x45,\n  0x1e, 0x78, 0x96, 0xd8, 0xae, 0x37, 0x02, 0xd7, 0x82, 0x8e, 0x03, 0x8e,\n  0x3e, 0x8a, 0xae, 0xcb, 0xaf, 0x40, 0xaa, 0x27, 0x31, 0x79, 0x3e, 0xbf,\n  0x42, 0x8a, 0x23, 0x40, 0x73, 0xea, 0x12, 0xe2, 0x92, 0x78, 0x87, 0x24,\n  0xfd, 0x14, 0x94, 0x0d, 0x89, 0x77, 0x04, 0xc3, 0x74, 0x25, 0x9f, 0x90,\n  0x5e, 0x61, 0x2d, 0xfe, 0x19, 0x7e, 0xbf, 0x97, 0xb6, 0x43, 0x0e, 0x7d,\n  0x8a, 0x5f, 0x24, 0x5f, 0xa0, 0x0a, 0x54, 0x8f, 0x86, 0xb3, 0x5a, 0x2d,\n  0x8c, 0x8e, 0x5a, 0x1d, 0xc7, 0xc2, 0x09, 0x15, 0xd6, 0xa2, 0xa1, 0x55,\n  0x38, 0x52, 0x5c, 0x8b, 0x3e, 0xbd, 0xb8, 0x16, 0xcd, 0x3a, 0x92, 0x4a,\n  0xe3, 0xe3, 0xd2, 0x0a, 0x3b, 0x47, 0xe6, 0x8d, 0x3f, 0x1b, 0xad, 0x8d,\n  0x54, 0x4b, 0x6b, 0xd1, 0xc5, 0xcd, 0x21, 0x85, 0xb0, 0x39, 0x56, 0x7b,\n  0x31, 0x6d, 0x6c, 0x65, 0xa6, 0x98, 0x8b, 0x21, 0xa6, 0x50, 0xe4, 0xe2,\n  0xb1, 0xaa, 0x68, 0x7c, 0x51, 0x6a, 0x7c, 0xd4, 0x15, 0x1d, 0x88, 0x66,\n  0xda, 0xfa, 0x92, 0x0d, 0xa3, 0x4d, 0x27, 0xcf, 0xe9, 0x5f, 0xd9, 0x3c,\n  0xd4, 0x37, 0x5c, 0x57, 0xed, 0xeb, 0xeb, 0x0c, 0x54, 0xe1, 0x6b, 0x6b,\n  0xb2, 0x16, 0x7b, 0x3a, 0xd4, 0xd8, 0xee, 0x0b, 0xb5, 0x19, 0x4d, 0x95,\n  0x40, 0x3e, 0xac, 0xa6, 0xaa, 0x96, 0xda, 0xde, 0xb9, 0xb5, 0xb3, 0x92,\n  0xb5, 0x5d, 0x8d, 0x5e, 0x77, 0x24, 0x64, 0x53, 0x37, 0x00, 0xba, 0xb3,\n  0xf3, 0x7f, 0x46, 0xaf, 0xb1, 0x75, 0x76, 0xda, 0xbb, 0xa3, 0x62, 0x3d,\n  0x7c, 0xd3, 0x27, 0xc0, 0xc6, 0xf2, 0x09, 0x40, 0x7d, 0x02, 0x8a, 0xcb,\n  0xeb, 0x85, 0xfe, 0x2e, 0xde, 0x15, 0x7d, 0x02, 0x66, 0x18, 0x99, 0xb6,\n  0x23, 0x1c, 0xcf, 0x8e, 0xb8, 0xdc, 0xd1, 0xa8, 0xdb, 0x15, 0x99, 0xfe,\n  0x4b, 0xce, 0x8f, 0xfa, 0xfd, 0xd1, 0x48, 0x45, 0x85, 0x20, 0xfd, 0xfe,\n  0x43, 0xfa, 0xa5, 0xb2, 0xc9, 0x30, 0xc8, 0x26, 0xbf, 0x42, 0xe7, 0x62,\n  0x03, 0x50, 0x48, 0x6d, 0xfe, 0x2f, 0x05, 0xeb, 0x78, 0xfe, 0x2f, 0x92,\n  0xfd, 0x9c, 0x76, 0xf4, 0x7e, 0xf2, 0x39, 0x36, 0x10, 0x2d, 0xfe, 0x4f,\n  0xf2, 0x79, 0x31, 0x97, 0xfc, 0xe7, 0xd2, 0xfd, 0x39, 0xf9, 0xff, 0x45,\n  0xff, 0x45, 0xf6, 0xc2, 0xfb, 0x7e, 0xac, 0x25, 0x81, 0x62, 0xac, 0x89,\n  0x80, 0x74, 0xbf, 0x3a, 0xdf, 0x82, 0xbf, 0x20, 0x9f, 0x93, 0x18, 0xb3,\n  0x6f, 0x12, 0xac, 0xa0, 0xbf, 0x92, 0x95, 0x93, 0x48, 0xcf, 0x40, 0xdb,\n  0xe1, 0xb7, 0xd1, 0x05, 0xa0, 0x1f, 0x98, 0xb0, 0x96, 0xe9, 0x07, 0x26,\n  0x29, 0xce, 0xdb, 0x5f, 0xd1, 0x23, 0x92, 0x3c, 0x4b, 0xf7, 0x1c, 0x96,\n  0xa8, 0x88, 0xb4, 0xd9, 0x7f, 0x33, 0x37, 0x42, 0x5b, 0x68, 0xba, 0x1b,\n  0x82, 0xa9, 0xec, 0x38, 0xc5, 0x56, 0x90, 0xdc, 0xd2, 0x4a, 0x12, 0xfc,\n  0x92, 0x3b, 0xc4, 0xa5, 0x24, 0xff, 0xe4, 0xb7, 0xa4, 0x95, 0x24, 0x34,\n  0xa3, 0x5d, 0xb5, 0x9c, 0x7a, 0xcf, 0x48, 0xb5, 0x8e, 0x44, 0xb9, 0x53,\n  0x25, 0x2a, 0x2d, 0xbc, 0xd7, 0xd6, 0xda, 0xda, 0x36, 0x95, 0x56, 0x53,\n  0x7f, 0x27, 0xea, 0x9f, 0x94, 0xff, 0x25, 0xd4, 0x0b, 0xe6, 0x8d, 0x86,\n  0x57, 0x70, 0xcc, 0xac, 0x5e, 0x58, 0xe3, 0x11, 0x5d, 0x9d, 0xa4, 0x39,\n  0xed, 0xa0, 0xd1, 0x41, 0xb2, 0x95, 0x97, 0xcf, 0x99, 0x7d, 0x79, 0x65,\n  0xcd, 0x8a, 0x6f, 0x3e, 0xbf, 0xda, 0x3f, 0x36, 0x32, 0x32, 0x66, 0xff,\n  0xd6, 0xb7, 0xe8, 0xfc, 0xeb, 0x43, 0xbf, 0xc4, 0xb3, 0x09, 0x4d, 0x29,\n  0xa6, 0xf8, 0x3a, 0xa6, 0x32, 0x49, 0xc6, 0x24, 0xef, 0xc3, 0xb2, 0x5f,\n  0xe2, 0x28, 0xdb, 0x3f, 0x99, 0x7f, 0x24, 0x6f, 0x42, 0x8b, 0xf3, 0x2f,\n  0x43, 0x39, 0x8a, 0xaf, 0xab, 0xe4, 0x54, 0xae, 0xe1, 0x1d, 0x3c, 0x8d,\n  0xe9, 0x06, 0x32, 0x48, 0xe6, 0xa4, 0x44, 0x32, 0x92, 0x4c, 0x02, 0x7f,\n  0x8d, 0xc4, 0x13, 0xa7, 0x26, 0x13, 0x91, 0x44, 0x32, 0x04, 0xc7, 0x89,\n  0x04, 0xb4, 0x7e, 0x6f, 0x3e, 0x8e, 0x5e, 0xe6, 0x36, 0x94, 0xe9, 0x11,\n  0xb3, 0xd0, 0x99, 0xd9, 0xd3, 0x10, 0xd6, 0x62, 0x91, 0x3a, 0x71, 0x3a,\n  0x2c, 0xe5, 0x83, 0xd6, 0x63, 0x19, 0x2f, 0x07, 0x59, 0x94, 0x37, 0x60,\n  0x85, 0x8a, 0x3a, 0x62, 0x68, 0x4c, 0x58, 0xad, 0x51, 0xaf, 0x45, 0x2a,\n  0x95, 0x72, 0x95, 0x11, 0x2b, 0x95, 0x9b, 0x95, 0x23, 0x9d, 0x1d, 0x05,\n  0xe7, 0x1f, 0x8c, 0x7a, 0x7b, 0x3a, 0x66, 0x75, 0xce, 0x3a, 0x92, 0x0b,\n  0x90, 0xa8, 0x58, 0x98, 0x75, 0xa5, 0xf4, 0x73, 0x4c, 0x6e, 0xf9, 0x17,\n  0x8e, 0x2f, 0xa7, 0xab, 0xea, 0xc7, 0xf1, 0x21, 0x9f, 0x54, 0x84, 0xa2,\n  0x3e, 0x5f, 0x34, 0x54, 0xf1, 0x52, 0x20, 0x4c, 0x0f, 0xc2, 0x01, 0x38,\n  0x88, 0xf8, 0xfd, 0x91, 0x70, 0xe0, 0xe5, 0xc2, 0xad, 0x6f, 0x14, 0xae,\n  0xbc, 0x54, 0xb8, 0x22, 0xea, 0x84, 0xc3, 0xc2, 0x8b, 0xd8, 0xcd, 0x8d,\n  0xa0, 0x21, 0xda, 0xaf, 0xcd, 0x1a, 0xc2, 0x36, 0xcc, 0x15, 0x22, 0x93,\n  0x36, 0x35, 0xba, 0x68, 0x8c, 0xd5, 0x8c, 0xd5, 0xcf, 0x31, 0x23, 0x85,\n  0xb8, 0x9f, 0x97, 0xa3, 0xd9, 0x97, 0xa6, 0xfe, 0xa6, 0x59, 0xc0, 0x38,\n  0x1b, 0x7b, 0x8e, 0xe6, 0xb9, 0x16, 0x7f, 0xaf, 0xf6, 0xd5, 0xd5, 0xf9,\n  0xd2, 0xcb, 0xda, 0x7b, 0xe6, 0xd1, 0x83, 0xe9, 0x9f, 0x19, 0x6f, 0xc8,\n  0x2d, 0x1e, 0xa7, 0xbf, 0x3e, 0x1c, 0xef, 0x0e, 0xc8, 0xda, 0xf9, 0xba,\n  0xb0, 0xc3, 0xeb, 0xf0, 0xd5, 0x45, 0x2a, 0xeb, 0x3c, 0x16, 0x87, 0xd5,\n  0xe1, 0xb2, 0x38, 0x6b, 0xa3, 0xd1, 0x5a, 0x97, 0xd9, 0x6d, 0xb7, 0xd2,\n  0xa7, 0x42, 0x89, 0xae, 0x0a, 0x8e, 0x3e, 0x65, 0xf7, 0x89, 0x4f, 0xb9,\n  0x2d, 0x20, 0x2f, 0x3b, 0x2d, 0x9e, 0xba, 0x68, 0xb4, 0xc6, 0x69, 0x71,\n  0x33, 0x19, 0xa7, 0x0d, 0xf4, 0x9e, 0xbd, 0x20, 0xdb, 0x55, 0xa2, 0x0e,\n  0x34, 0x80, 0x86, 0xd1, 0x87, 0x59, 0x68, 0xe8, 0x4a, 0x8d, 0x52, 0xae,\n  0x50, 0xe2, 0x39, 0x83, 0xfd, 0x7d, 0xdd, 0x16, 0xa3, 0x41, 0x0b, 0x1d,\n  0x5f, 0x8b, 0x79, 0x55, 0x0d, 0x56, 0xf0, 0x01, 0xb7, 0xc3, 0x2a, 0x93,\n  0x29, 0xe4, 0x52, 0x20, 0xa6, 0x6a, 0x39, 0xdd, 0xe6, 0xba, 0x03, 0xa9,\n  0x10, 0x0f, 0x63, 0x65, 0xa3, 0x1a, 0x68, 0x81, 0x8c, 0x53, 0xc8, 0x58,\n  0x60, 0xfa, 0xd3, 0xe7, 0x6a, 0x0a, 0x91, 0xfa, 0x37, 0x2a, 0x0b, 0xf9,\n  0x7b, 0x62, 0xd2, 0x0b, 0x18, 0xee, 0xa9, 0x68, 0xf8, 0xf7, 0x19, 0xdf,\n  0xa4, 0x76, 0xb5, 0x46, 0xa6, 0xba, 0x6d, 0x3f, 0xf2, 0xf3, 0x80, 0xc6,\n  0x38, 0xfc, 0x28, 0xa8, 0x01, 0x40, 0x21, 0x03, 0xe5, 0x21, 0xeb, 0xed,\n  0xea, 0xac, 0x8a, 0xf5, 0x66, 0x3b, 0x07, 0xba, 0x06, 0x1a, 0xeb, 0x63,\n  0x1d, 0x55, 0x1d, 0x7e, 0x9f, 0xd7, 0xe3, 0x72, 0x9a, 0x83, 0x46, 0x2d,\n  0xd5, 0xfe, 0x12, 0x36, 0x16, 0xa6, 0xdb, 0x26, 0xc5, 0x8d, 0x37, 0x89,\n  0xbd, 0xc2, 0xd3, 0xd0, 0x5b, 0x34, 0x58, 0xbe, 0x94, 0x03, 0xd9, 0x02,\n  0x53, 0x34, 0x05, 0x52, 0xa4, 0x14, 0xf6, 0x58, 0x4c, 0x7d, 0x6d, 0x09,\n  0xf1, 0xa6, 0x38, 0x88, 0xd9, 0xa6, 0x4a, 0xde, 0xea, 0x30, 0x81, 0x94,\n  0x9d, 0xeb, 0xe4, 0xe2, 0xcd, 0x9d, 0xa1, 0x6e, 0x9f, 0xdb, 0xdb, 0xec,\n  0x08, 0xb4, 0x7b, 0x3c, 0x6d, 0x15, 0x9d, 0xf1, 0x64, 0xe7, 0x05, 0xbb,\n  0x7a, 0xb7, 0xce, 0x6d, 0x19, 0x3c, 0xb7, 0x2e, 0xb9, 0x39, 0xbe, 0xe9,\n  0xc2, 0xf1, 0x59, 0xad, 0x2b, 0x5a, 0x33, 0x5b, 0x76, 0x39, 0xed, 0x0a,\n  0x45, 0x63, 0xad, 0xe7, 0xaf, 0x67, 0x34, 0x76, 0x91, 0xcf, 0xb3, 0xf2,\n  0xfe, 0x61, 0x85, 0x5e, 0x35, 0xc0, 0x6b, 0x65, 0xc2, 0xb7, 0xe5, 0x26,\n  0xed, 0x8d, 0x6a, 0x83, 0x42, 0xf8, 0x3f, 0x58, 0x2b, 0x17, 0xfe, 0x17,\n  0xab, 0xb5, 0xd7, 0x5e, 0x33, 0xba, 0x29, 0xa7, 0x12, 0x14, 0x46, 0x5d,\n  0xa5, 0x4e, 0x87, 0x4f, 0x59, 0x7f, 0xf2, 0x46, 0x8b, 0x4e, 0xd5, 0xbe,\n  0xaa, 0xb7, 0x7f, 0xa2, 0x03, 0x3f, 0x29, 0x13, 0x1e, 0x97, 0xe1, 0x31,\n  0xf2, 0xe2, 0x85, 0x4e, 0xdc, 0x66, 0x5b, 0xc8, 0xf4, 0xd0, 0x66, 0xa0,\n  0xf5, 0xaf, 0xa3, 0x73, 0x61, 0x36, 0x1b, 0xd0, 0x9f, 0xca, 0xf4, 0xd0,\n  0x5e, 0xec, 0xc3, 0x1f, 0x43, 0xbf, 0xd2, 0xf9, 0xde, 0xf3, 0xa4, 0x62,\n  0x4d, 0x5f, 0x36, 0x6d, 0x33, 0xa8, 0x38, 0x19, 0x5d, 0xbc, 0x33, 0x2b,\n  0x08, 0x9e, 0x03, 0xba, 0x17, 0x4b, 0x22, 0x2b, 0x5f, 0xcf, 0x63, 0xb6,\n  0x65, 0x8b, 0x67, 0xf1, 0xa9, 0xe8, 0x56, 0x5f, 0x34, 0x6a, 0x16, 0xff,\n  0x4c, 0x4a, 0xde, 0x5f, 0xfb, 0xa4, 0x02, 0xf5, 0xe1, 0x58, 0x38, 0x13,\n  0x4b, 0x64, 0x1c, 0x09, 0xde, 0x11, 0xe6, 0x33, 0x89, 0x58, 0x26, 0x1c,\n  0xe3, 0xc3, 0x0e, 0x3e, 0x81, 0xcd, 0x7d, 0x3b, 0xfb, 0xfb, 0x77, 0xf6,\n  0xf5, 0xee, 0x1c, 0x18, 0xd8, 0xd9, 0x5b, 0x7f, 0x6a, 0x3c, 0x7e, 0x6a,\n  0x7d, 0xfd, 0x9a, 0x78, 0x7c, 0x0d, 0xf6, 0x9d, 0xb7, 0xf5, 0x82, 0xf3,\n  0xce, 0xbb, 0x60, 0x6b, 0xdd, 0xc8, 0x49, 0x8b, 0x47, 0x46, 0x16, 0x9f,\n  0x44, 0xe7, 0xd2, 0x85, 0xa8, 0x86, 0x5c, 0x46, 0x1a, 0x99, 0xff, 0x13,\n  0xcf, 0x68, 0x5b, 0x0c, 0x44, 0x1e, 0x3e, 0x96, 0xa6, 0xd2, 0x0e, 0xfc,\n  0x54, 0xc6, 0x76, 0xfb, 0xf1, 0x95, 0xd5, 0x23, 0xd5, 0xa1, 0x92, 0x17,\n  0x54, 0x0d, 0x5c, 0x09, 0xeb, 0x0d, 0xa1, 0x92, 0x13, 0x94, 0xa8, 0x7f,\n  0xcf, 0xc6, 0x3e, 0xf4, 0x1a, 0xde, 0x47, 0x14, 0xc0, 0x63, 0xc4, 0x3d,\n  0x22, 0x19, 0xf4, 0x5d, 0x3c, 0xca, 0xf1, 0xea, 0xbb, 0x80, 0x27, 0x8d,\n  0x49, 0xdc, 0x68, 0xac, 0xb8, 0xe6, 0xe6, 0x83, 0xfb, 0x2f, 0xb0, 0xfb,\n  0x77, 0x1f, 0x7e, 0x9f, 0xc5, 0xc2, 0x58, 0x8d, 0x93, 0xd8, 0x0d, 0x72,\n  0x0f, 0xf5, 0x20, 0x16, 0xd7, 0xfe, 0x40, 0x31, 0xa5, 0x46, 0x04, 0xb2,\n  0x92, 0x6e, 0x30, 0x24, 0x63, 0xa2, 0xc6, 0x27, 0xb9, 0xd0, 0xb2, 0x95,\n  0xbf, 0xb1, 0xec, 0xbe, 0x7b, 0x01, 0xca, 0x15, 0x6d, 0x22, 0x0c, 0x57,\n  0x7e, 0x35, 0x9a, 0x64, 0x30, 0xfc, 0x54, 0x0c, 0x20, 0x00, 0x83, 0x6a,\n  0xb8, 0x8b, 0xa9, 0x86, 0xbb, 0x92, 0xae, 0xe7, 0x8f, 0x15, 0x94, 0x6f,\n  0xe6, 0xc8, 0xfb, 0x62, 0xf6, 0x93, 0x7d, 0xd8, 0x2d, 0xcc, 0x6e, 0x63,\n  0xe5, 0x63, 0x33, 0x4e, 0xfe, 0x73, 0x9d, 0x3d, 0x61, 0x0b, 0xdf, 0x48,\n  0x5f, 0x33, 0xe3, 0xe7, 0xdb, 0xc4, 0x32, 0xb1, 0x19, 0x4d, 0xb2, 0xf7,\n  0x80, 0x9b, 0x4e, 0xdd, 0xad, 0xb5, 0x91, 0xed, 0xd6, 0x2a, 0xa2, 0x6c,\n  0x61, 0x8a, 0xd7, 0x8b, 0xfb, 0x3e, 0x81, 0x97, 0x2f, 0x6d, 0x13, 0x66,\n  0x8b, 0xed, 0x52, 0x05, 0xf5, 0xfe, 0x0d, 0xbc, 0x1f, 0x83, 0x91, 0xf2,\n  0x01, 0xe3, 0xd3, 0x1a, 0x69, 0x0f, 0xc3, 0x6a, 0xd0, 0xc5, 0x0e, 0x02,\n  0x5d, 0xd0, 0xfe, 0x83, 0xaa, 0x6f, 0x5a, 0xf4, 0x2e, 0x2b, 0xef, 0x5d,\n  0xf4, 0x2a, 0x67, 0x25, 0x1c, 0x72, 0xa1, 0x0b, 0x25, 0xcb, 0x00, 0xbb,\n  0xcc, 0xbc, 0xad, 0x45, 0x59, 0x91, 0x2b, 0x58, 0x06, 0x9c, 0x54, 0x02,\n  0x02, 0x69, 0x6e, 0x3d, 0x73, 0xfc, 0x5d, 0x2c, 0xa1, 0x85, 0xf0, 0x68,\n  0xc1, 0x34, 0x30, 0xc3, 0x9b, 0x47, 0x7e, 0x69, 0x7c, 0x7c, 0xfc, 0xd9,\n  0xe6, 0x74, 0x73, 0x82, 0x99, 0xe0, 0x68, 0xa6, 0xf9, 0xa0, 0x2d, 0x28,\n  0xa6, 0xab, 0x17, 0x0f, 0xf5, 0xd0, 0xd4, 0xd5, 0xfd, 0x4b, 0x1a, 0xb1,\n  0x5f, 0xf8, 0x65, 0x72, 0xc3, 0xc2, 0x44, 0x7c, 0xd1, 0xfa, 0x14, 0x3d,\n  0x6e, 0x5c, 0xd2, 0x5f, 0x8d, 0x57, 0xd7, 0x35, 0x5a, 0xb8, 0x26, 0x85,\n  0x2f, 0xd7, 0xd1, 0x91, 0xf3, 0x29, 0x9a, 0x38, 0x0b, 0xdd, 0x62, 0x84,\n  0x0e, 0x41, 0x5d, 0x6c, 0xac, 0x2e, 0x57, 0x8a, 0x75, 0xb1, 0x30, 0x47,\n  0x0c, 0xc4, 0x9d, 0x5a, 0x14, 0x7c, 0x8b, 0x66, 0x0e, 0x57, 0xc9, 0x57,\n  0x9b, 0x66, 0x29, 0x65, 0xb9, 0xc4, 0xd8, 0xb3, 0x85, 0xda, 0xcc, 0xf8,\n  0xee, 0x51, 0x5e, 0xa3, 0xb6, 0x0e, 0x2a, 0x18, 0xb9, 0x90, 0x03, 0xaa,\n  0x45, 0x35, 0xe3, 0x4c, 0x2a, 0xc8, 0x52, 0xfd, 0x82, 0xb2, 0x06, 0xe2,\n  0x75, 0x9c, 0x4a, 0xb8, 0x7a, 0x12, 0x3e, 0x84, 0xfd, 0xb4, 0x0a, 0xb4,\n  0x6a, 0xc2, 0x2f, 0xb1, 0x3f, 0xb5, 0x5e, 0xac, 0xda, 0xab, 0xb4, 0x12,\n  0x75, 0x53, 0xaa, 0xc5, 0x9a, 0x33, 0x86, 0x7e, 0x8b, 0xbe, 0x4b, 0xf2,\n  0x20, 0x91, 0x39, 0xb3, 0xb6, 0xe9, 0x6d, 0x68, 0xb7, 0x10, 0xad, 0x93,\n  0x49, 0xd4, 0x09, 0xa6, 0x1a, 0x3b, 0x68, 0xf8, 0xec, 0xc6, 0xfa, 0x5c,\n  0x63, 0x73, 0x53, 0x53, 0xae, 0xb6, 0x19, 0xff, 0x65, 0xc1, 0xf6, 0x64,\n  0x7a, 0xe7, 0xd0, 0xe0, 0x75, 0x99, 0xa6, 0x6b, 0xa8, 0x7f, 0x14, 0xc0,\n  0x7a, 0xa1, 0x08, 0xab, 0x64, 0x53, 0x63, 0x96, 0x61, 0x09, 0x96, 0x95,\n  0xa9, 0x95, 0x74, 0x29, 0x3f, 0x61, 0xb7, 0xbf, 0xd0, 0x54, 0x97, 0x6b,\n  0x6e, 0x6c, 0x6e, 0xcc, 0xd5, 0x37, 0xe2, 0xbf, 0x2e, 0xdc, 0x91, 0xcc,\n  0x5c, 0x3f, 0x38, 0x74, 0x6d, 0x3a, 0x79, 0x0d, 0xdd, 0x33, 0x80, 0x7e,\n  0x8d, 0xab, 0xf0, 0x1f, 0x40, 0xf7, 0x30, 0x52, 0xdd, 0x03, 0x6d, 0xcc,\n  0x5f, 0x98, 0x37, 0x4a, 0xba, 0x87, 0x51, 0x92, 0x19, 0xa7, 0xf8, 0xcf,\n  0xcc, 0x7c, 0xae, 0xfe, 0x23, 0x4e, 0xa0, 0x18, 0x21, 0x74, 0x67, 0x09,\n  0xfd, 0xe5, 0xa8, 0xf7, 0xbb, 0x82, 0x90, 0xc2, 0x7d, 0x7e, 0x89, 0x78,\n  0x7f, 0xfa, 0x75, 0xec, 0x06, 0x28, 0x31, 0xe6, 0x97, 0xf3, 0x2e, 0x16,\n  0xfd, 0x73, 0x98, 0x95, 0xf9, 0x5d, 0x46, 0x00, 0xf2, 0xf9, 0xfc, 0x6f,\n  0xf0, 0xeb, 0x78, 0x0d, 0x9d, 0x07, 0xea, 0x7d, 0xe8, 0x01, 0xe6, 0x61,\n  0xbe, 0x8f, 0xc9, 0x5b, 0x70, 0x1d, 0xbd, 0xca, 0x6c, 0x44, 0x6c, 0x5e,\n  0x62, 0xb4, 0x83, 0x5a, 0xc7, 0x37, 0x32, 0x5f, 0xf8, 0x82, 0x65, 0xdc,\n  0x62, 0x09, 0x73, 0xd9, 0xcb, 0xdb, 0xee, 0x23, 0x07, 0x05, 0x81, 0x3a,\n  0x6f, 0x31, 0x7a, 0x84, 0x5f, 0x87, 0x61, 0x0c, 0xf3, 0x87, 0x98, 0x18,\n  0xa6, 0x26, 0xb4, 0x5f, 0xfc, 0xc5, 0x0b, 0xd9, 0x9e, 0x14, 0x13, 0x16,\n  0x0a, 0xe5, 0x12, 0x85, 0x58, 0x2e, 0xee, 0x67, 0xbb, 0x2d, 0xca, 0xca,\n  0x07, 0x38, 0x1d, 0xf9, 0xcb, 0xf0, 0x4e, 0x4a, 0xdf, 0x89, 0x06, 0xef,\n  0x2f, 0xd2, 0x77, 0xba, 0x8f, 0xe0, 0x32, 0xec, 0x23, 0x5d, 0x28, 0x40,\n  0xf7, 0x11, 0x18, 0x68, 0xba, 0x48, 0xea, 0xaa, 0x2f, 0xe7, 0x90, 0x9c,\n  0xc5, 0x74, 0xe4, 0x4a, 0xa9, 0x0f, 0xfb, 0xc8, 0x88, 0xcd, 0xe4, 0x33,\n  0xd9, 0x8c, 0x0a, 0x95, 0xb7, 0x36, 0x23, 0x45, 0xe8, 0xa1, 0xd2, 0x88,\n  0x4d, 0x8a, 0x31, 0x41, 0x07, 0x82, 0x4d, 0x8c, 0xe4, 0x16, 0x73, 0xd6,\n  0xc5, 0x07, 0x97, 0xd7, 0x36, 0xc7, 0xea, 0x6a, 0xaa, 0x9b, 0x6b, 0x97,\n  0x0f, 0xa6, 0xaa, 0xf3, 0x91, 0xe8, 0x85, 0x5d, 0x9d, 0xb8, 0x07, 0xfb,\n  0x22, 0xe7, 0x34, 0xc4, 0x95, 0x1c, 0xdf, 0xdc, 0xb8, 0x25, 0xec, 0x25,\n  0xd9, 0xb6, 0xdc, 0x96, 0x58, 0x44, 0x5a, 0x43, 0xf0, 0x00, 0x2e, 0x15,\n  0x25, 0x5c, 0x10, 0xf5, 0x0f, 0x91, 0x03, 0x0d, 0x93, 0xa3, 0xe2, 0x26,\n  0x5c, 0x29, 0x4f, 0x4f, 0x1f, 0x57, 0x86, 0x4b, 0x54, 0xc4, 0x21, 0x2c,\n  0x86, 0x6e, 0x97, 0xd2, 0x8f, 0x01, 0x0e, 0xd4, 0xc7, 0x89, 0x1a, 0xb5,\n  0x70, 0x45, 0x75, 0x72, 0x68, 0x59, 0x5d, 0x53, 0x4d, 0x75, 0x75, 0x4d,\n  0x73, 0xed, 0x29, 0xc3, 0xf1, 0xda, 0x17, 0x71, 0x24, 0xb6, 0x25, 0xd7,\n  0x96, 0x25, 0xde, 0xf0, 0x96, 0xc6, 0x66, 0x9e, 0x53, 0x36, 0x36, 0x9f,\n  0x13, 0xf6, 0xe3, 0x9e, 0xae, 0xae, 0x0b, 0x2b, 0xc3, 0xd2, 0x7e, 0x00,\n  0xe0, 0x87, 0x7f, 0x22, 0x39, 0xa0, 0x58, 0x5e, 0x36, 0xf9, 0x38, 0xc2,\n  0x66, 0x24, 0xb3, 0xbf, 0xf7, 0x49, 0x46, 0x7c, 0x15, 0xa8, 0x16, 0xd2,\n  0x3e, 0x8d, 0x8e, 0x67, 0x4e, 0x3b, 0xed, 0x19, 0x92, 0xeb, 0x9a, 0x7c,\n  0xbe, 0x53, 0x7c, 0xdf, 0x0e, 0xef, 0xbf, 0x51, 0x7c, 0x9f, 0xa9, 0xac,\n  0xa7, 0x16, 0x08, 0x6a, 0x1f, 0x2a, 0xbd, 0x2f, 0x6d, 0xc6, 0xb8, 0xfc,\n  0xb4, 0x67, 0x9e, 0x39, 0x8d, 0xc8, 0xba, 0x26, 0x3b, 0x3b, 0x91, 0xa4,\n  0xdf, 0x7c, 0x86, 0xee, 0x25, 0x1d, 0xcc, 0x8f, 0x5c, 0xd2, 0x6f, 0x58,\n  0xd1, 0x45, 0xfd, 0x66, 0x16, 0x47, 0x57, 0x2a, 0x24, 0x24, 0xb8, 0x70,\n  0xb9, 0x6e, 0xdf, 0xba, 0xca, 0xd0, 0x6b, 0xf1, 0x39, 0x1d, 0x3e, 0x9f,\n  0xc3, 0xe9, 0x23, 0x1d, 0xc2, 0x19, 0x97, 0xf8, 0x5c, 0x2e, 0x9f, 0xc7,\n  0xed, 0x86, 0x71, 0x00, 0x70, 0xf1, 0x3a, 0x80, 0x1b, 0x53, 0x7f, 0x15,\n  0xf8, 0x3d, 0x1d, 0x1f, 0x5f, 0x95, 0xf6, 0xf9, 0x9f, 0x87, 0xbe, 0x8c,\n  0x9f, 0xa7, 0x1e, 0xc1, 0x74, 0xd7, 0x46, 0xd1, 0xd8, 0x40, 0xf5, 0xe9,\n  0xc5, 0x12, 0x65, 0xe5, 0xc8, 0xa8, 0xc9, 0x0c, 0x2a, 0x15, 0x2d, 0xb2,\n  0x2c, 0xcb, 0x0b, 0x17, 0xb6, 0x24, 0xbe, 0x1c, 0xb0, 0xdb, 0xfd, 0xb4,\n  0x38, 0x39, 0x94, 0x8d, 0xbf, 0xe4, 0x77, 0x3a, 0xfd, 0x50, 0xde, 0xe4,\n  0x8f, 0xf0, 0x4d, 0x00, 0x29, 0x80, 0x6a, 0xd0, 0x2f, 0xf0, 0x97, 0xe8,\n  0xc6, 0x91, 0xaf, 0x2b, 0x38, 0x6a, 0x1f, 0xa5, 0xba, 0x46, 0x2a, 0xf3,\n  0x8b, 0x75, 0xeb, 0xda, 0xaf, 0xba, 0x0a, 0xaf, 0xda, 0xb9, 0x33, 0xf8,\n  0x90, 0xe6, 0x11, 0xb1, 0xdd, 0x68, 0x8c, 0xa6, 0x9f, 0x97, 0x3f, 0x9b,\n  0xa1, 0x1a, 0x89, 0x8d, 0xf7, 0x6d, 0xd8, 0x00, 0xcf, 0x0e, 0xed, 0xdc,\n  0x19, 0x7a, 0x44, 0xfd, 0x30, 0x85, 0x99, 0xbf, 0x02, 0xfd, 0x0a, 0xda,\n  0x57, 0x87, 0x2c, 0x59, 0x63, 0x59, 0xc7, 0x00, 0x39, 0x51, 0x39, 0x69,\n  0xb6, 0xa6, 0x32, 0xd2, 0x14, 0xe8, 0x68, 0x1b, 0x69, 0x07, 0x65, 0x6b,\n  0x6e, 0x7b, 0xfb, 0xcf, 0xd7, 0x3e, 0x3f, 0x30, 0xe7, 0x1b, 0x2b, 0x97,\n  0x7f, 0x7d, 0xb8, 0xef, 0x19, 0x71, 0x7f, 0x09, 0xc0, 0xf9, 0x49, 0x11,\n  0x4e, 0xa9, 0x83, 0x24, 0x38, 0x53, 0xc8, 0xd2, 0x4f, 0x3a, 0xda, 0x87,\n  0xdb, 0x32, 0x99, 0xf6, 0xb9, 0x5d, 0xad, 0x3f, 0x5f, 0xf3, 0x6c, 0xef,\n  0xf0, 0xd7, 0x97, 0xaf, 0xfc, 0xc6, 0x9c, 0xc1, 0x6f, 0xb0, 0xf6, 0xd3,\n  0x41, 0xbb, 0x2e, 0x25, 0x7d, 0xc8, 0x23, 0x7a, 0xa8, 0xea, 0x30, 0xd5,\n  0x88, 0x80, 0x8b, 0x0e, 0x4b, 0x7c, 0x68, 0x5b, 0x41, 0x8b, 0x1b, 0x28,\n  0x26, 0x9b, 0x9a, 0x25, 0x83, 0x1e, 0x74, 0x45, 0xaa, 0xe5, 0x2a, 0x0f,\n  0x43, 0x58, 0x8a, 0x2a, 0x50, 0xf2, 0x92, 0xa3, 0x46, 0x59, 0xdb, 0x94,\n  0x9e, 0x3d, 0xd7, 0x5b, 0x1b, 0x0e, 0xaa, 0x92, 0xd5, 0x6d, 0xfd, 0x81,\n  0xea, 0xe1, 0x86, 0xb1, 0xa5, 0xf1, 0x66, 0x7f, 0xb0, 0x4f, 0x5f, 0xe8,\n  0xea, 0x97, 0xeb, 0x3a, 0xbd, 0xce, 0x48, 0xd0, 0x5c, 0x19, 0x0b, 0x77,\n  0x5a, 0xed, 0x73, 0x7a, 0x93, 0xfd, 0x41, 0x6b, 0x4d, 0xad, 0xa6, 0xd0,\n  0xfb, 0xd2, 0xde, 0xfd, 0x33, 0xf0, 0x1a, 0xd6, 0xcf, 0x55, 0xd4, 0x5b,\n  0xd5, 0x85, 0x89, 0xcc, 0x2d, 0x06, 0xb9, 0x91, 0xd1, 0xc8, 0x9f, 0x2c,\n  0x47, 0x30, 0x30, 0x20, 0x54, 0xe6, 0xd5, 0xbf, 0x9a, 0x0e, 0xfe, 0xf9,\n  0xae, 0x68, 0x6d, 0x24, 0x44, 0x51, 0xc5, 0x65, 0x5d, 0xcf, 0x5b, 0x99,\n  0x27, 0x9f, 0x55, 0xd2, 0x47, 0x0b, 0xc1, 0x74, 0xe9, 0x44, 0x4c, 0x60,\n  0x6d, 0x01, 0x2f, 0x83, 0xa7, 0x36, 0x1c, 0x52, 0xa7, 0xab, 0x02, 0x9d,\n  0xe1, 0x40, 0xd5, 0xdc, 0x86, 0x51, 0x8a, 0x76, 0x45, 0x1f, 0xbe, 0xd2,\n  0xeb, 0x76, 0x83, 0x58, 0xed, 0x7a, 0xbc, 0xbe, 0xdd, 0xe7, 0x88, 0x84,\n  0x2c, 0xd1, 0x4a, 0x93, 0xa9, 0xd3, 0x66, 0x1d, 0xcc, 0xa5, 0xfa, 0x82,\n  0xb6, 0x9a, 0x1a, 0xad, 0x14, 0x1f, 0xf7, 0x0d, 0x7c, 0x08, 0x9f, 0x0c,\n  0xfd, 0x23, 0xfa, 0xb5, 0x02, 0x15, 0xd8, 0x81, 0x98, 0xd1, 0x92, 0xc5,\n  0x9f, 0x44, 0xd4, 0x64, 0x09, 0x47, 0x3a, 0xa4, 0x0b, 0x99, 0x43, 0x72,\n  0x05, 0x70, 0x3f, 0x31, 0xd0, 0x56, 0x58, 0xb4, 0x81, 0xd9, 0xbc, 0x17,\n  0xce, 0x5a, 0x70, 0x81, 0x3d, 0x65, 0x1a, 0xcf, 0x25, 0x57, 0xda, 0xde,\n  0x98, 0xdb, 0x3b, 0x6b, 0xb0, 0xba, 0xb1, 0xba, 0x51, 0xa4, 0xad, 0xe7,\n  0x93, 0x9b, 0xf1, 0x41, 0x4e, 0x8e, 0x78, 0xed, 0x56, 0x1c, 0x94, 0xf6,\n  0x01, 0xd9, 0xf2, 0x7f, 0x23, 0xc3, 0xe4, 0x56, 0xe4, 0x47, 0x37, 0x4b,\n  0x31, 0xad, 0x69, 0xf8, 0x1a, 0x2b, 0xd0, 0x7a, 0x1b, 0x06, 0x6d, 0x7c,\n  0xd8, 0x53, 0x7e, 0x41, 0xa5, 0x28, 0x06, 0xb4, 0x8e, 0x51, 0x9b, 0x00,\n  0xbf, 0x4a, 0xad, 0x22, 0x3c, 0xbf, 0x79, 0xae, 0x52, 0x4e, 0x7d, 0x6f,\n  0x59, 0xea, 0x54, 0x16, 0x61, 0x8e, 0x5f, 0x2d, 0xde, 0xe0, 0x69, 0xd0,\n  0xc8, 0x29, 0x37, 0xe9, 0x6b, 0xaa, 0x15, 0x6a, 0xac, 0x52, 0x9d, 0x26,\n  0x3e, 0x58, 0x08, 0x8b, 0x4a, 0xa5, 0x1a, 0x3f, 0xf2, 0x5b, 0xa2, 0x21,\n  0xb6, 0xef, 0x85, 0xa5, 0xd2, 0xa4, 0xa4, 0x22, 0x43, 0x73, 0x05, 0x8a,\n  0xf9, 0x02, 0x4d, 0xe5, 0x11, 0xc4, 0x41, 0xf1, 0x58, 0x35, 0x3c, 0x56,\n  0x91, 0xbc, 0xb3, 0x22, 0xb5, 0x67, 0xcf, 0xa8, 0xb3, 0xc6, 0x6a, 0x4d,\n  0x05, 0x66, 0x8d, 0xde, 0x86, 0xdf, 0xad, 0xf1, 0x5e, 0x04, 0x7f, 0x03,\n  0xc2, 0x5b, 0xab, 0x78, 0x79, 0x1f, 0xaf, 0x1e, 0x3a, 0x19, 0x67, 0x84,\n  0x7a, 0x31, 0xfe, 0x01, 0xa0, 0xf1, 0x7b, 0xe0, 0x19, 0x1e, 0x94, 0xc8,\n  0x36, 0x59, 0x18, 0xed, 0xa7, 0x5a, 0x93, 0x5c, 0x86, 0x58, 0x40, 0x6a,\n  0x69, 0x99, 0x89, 0xa7, 0x71, 0xf2, 0x4f, 0x2b, 0xc4, 0x3b, 0x32, 0xd9,\n  0xad, 0x26, 0x93, 0x55, 0xa9, 0xf3, 0xd6, 0x26, 0x98, 0x96, 0x03, 0x6a,\n  0x10, 0x08, 0x18, 0x2c, 0x8e, 0x3a, 0x68, 0x42, 0x61, 0x13, 0xf5, 0xeb,\n  0x6c, 0xef, 0xf8, 0xd2, 0xe9, 0x4b, 0xd6, 0x6c, 0xcf, 0x8d, 0x37, 0x2e,\n  0x1b, 0x58, 0x32, 0xb4, 0xac, 0xe6, 0x96, 0x0b, 0xef, 0x18, 0x52, 0xbc,\n  0xf7, 0x9e, 0x62, 0xf0, 0xb6, 0x8b, 0x6e, 0xbf, 0xf5, 0xd4, 0x2d, 0x19,\n  0xb9, 0xf0, 0x0f, 0x2c, 0x97, 0xb7, 0x6c, 0x59, 0x75, 0x9b, 0x48, 0xeb,\n  0xd4, 0x2c, 0x7e, 0xfb, 0x41, 0x64, 0x07, 0x4a, 0xd1, 0x99, 0x6d, 0x53,\n  0x61, 0x4e, 0x4e, 0xc3, 0x06, 0x91, 0xf5, 0x0a, 0xba, 0x5e, 0x88, 0x94,\n  0x74, 0x81, 0x40, 0xad, 0x16, 0x77, 0xb4, 0x31, 0x5d, 0xf0, 0x34, 0x25,\n  0x60, 0x13, 0xf0, 0xb9, 0x1c, 0x34, 0x4a, 0x9f, 0xc9, 0x14, 0x09, 0xd2,\n  0x26, 0xd2, 0xd2, 0x4c, 0x54, 0x29, 0x31, 0xcf, 0x68, 0x42, 0x0a, 0xa4,\n  0x1e, 0x0e, 0xb3, 0x18, 0xb2, 0xa6, 0x42, 0x38, 0x8c, 0x55, 0x8b, 0xe1,\n  0xef, 0x5b, 0x5f, 0xba, 0xec, 0xda, 0x1d, 0x0b, 0x1f, 0x7c, 0x70, 0xd6,\n  0xc9, 0x6b, 0x17, 0x8e, 0x2f, 0xbd, 0xba, 0x67, 0x7c, 0x18, 0x9f, 0xb2,\n  0x71, 0xed, 0xba, 0x73, 0xc6, 0x7b, 0xae, 0xc6, 0x67, 0x76, 0x8c, 0xf4,\n  0xe5, 0x58, 0xfe, 0x1c, 0xf8, 0xfa, 0x0f, 0xc0, 0x49, 0x87, 0xbc, 0x34,\n  0x32, 0x07, 0xc2, 0x32, 0xaa, 0xe3, 0x30, 0x87, 0xd7, 0x15, 0xd4, 0x5c,\n  0xce, 0xac, 0x75, 0x2c, 0x1c, 0x32, 0xb7, 0x92, 0x57, 0x16, 0x5a, 0xc8,\n  0xeb, 0xb6, 0xdb, 0xcc, 0x46, 0x83, 0x9e, 0x8e, 0xc7, 0xb0, 0x25, 0xa8,\n  0x02, 0x69, 0x4c, 0x44, 0x85, 0x66, 0x05, 0x82, 0xf2, 0x4d, 0x96, 0x84,\n  0x49, 0x0a, 0x7c, 0x4a, 0x37, 0xc6, 0x87, 0x17, 0xfd, 0xf6, 0xcc, 0x0d,\n  0xf3, 0x86, 0xfa, 0xae, 0x5b, 0x3b, 0xef, 0xea, 0xe1, 0xb9, 0xf3, 0x1a,\n  0xd6, 0xcc, 0xfb, 0x98, 0x1c, 0xbc, 0x78, 0xad, 0xf0, 0x16, 0x8e, 0x8f,\n  0x8c, 0x4e, 0x5e, 0x44, 0xac, 0x42, 0xf3, 0xbc, 0xb9, 0xf8, 0xb7, 0x82,\n  0xab, 0x67, 0x7d, 0x3b, 0xcc, 0x4f, 0x7b, 0xfe, 0x49, 0xf2, 0x30, 0x39,\n  0x84, 0x06, 0xd1, 0x7c, 0x74, 0x32, 0xb4, 0xc9, 0x69, 0xd9, 0x0d, 0xd5,\n  0x58, 0xc6, 0xd5, 0x80, 0xaa, 0xb5, 0x6a, 0xfc, 0xa4, 0x61, 0xa7, 0x51,\n  0xcd, 0x6b, 0x54, 0xb3, 0xfb, 0xbb, 0xda, 0xb1, 0x5c, 0xa1, 0x91, 0x0d,\n  0xeb, 0x94, 0x3c, 0x27, 0x57, 0xc8, 0x77, 0xd0, 0x48, 0x98, 0x5a, 0xbd,\n  0x9a, 0x53, 0x69, 0x90, 0x6a, 0xa2, 0xb0, 0x68, 0xb8, 0x69, 0x2e, 0xd2,\n  0x68, 0x0a, 0x39, 0x01, 0x17, 0x2e, 0x40, 0x68, 0xdd, 0x9a, 0x95, 0xcb,\n  0x16, 0x9c, 0xbc, 0xf0, 0xe4, 0x79, 0xa3, 0x00, 0x7f, 0xb0, 0xaf, 0x37,\n  0xd7, 0xdd, 0xd9, 0xd1, 0x50, 0x17, 0x8b, 0x46, 0xa2, 0x95, 0x06, 0xe6,\n  0x31, 0x5c, 0x39, 0x25, 0x94, 0x5d, 0x31, 0x77, 0x8f, 0x68, 0x32, 0x65,\n  0x4e, 0x1e, 0xe5, 0x09, 0xe2, 0x68, 0x4c, 0x05, 0x31, 0x38, 0x19, 0x8c,\n  0x0d, 0x96, 0xba, 0x8a, 0xa6, 0x86, 0x8a, 0xd9, 0x62, 0x56, 0x87, 0xb8,\n  0x02, 0x95, 0x81, 0x87, 0xe0, 0x99, 0x54, 0xd2, 0x61, 0xa3, 0xeb, 0x4e,\n  0xe2, 0xc5, 0xcd, 0x35, 0xcd, 0x15, 0x21, 0x4f, 0x48, 0xc9, 0x99, 0x1a,\n  0xdc, 0x39, 0x2b, 0x31, 0x35, 0xdb, 0x1b, 0x9a, 0xe6, 0xd6, 0x8c, 0xa6,\n  0x13, 0x0b, 0xe2, 0x9d, 0x13, 0xb9, 0xe4, 0xaa, 0xe6, 0x40, 0xc3, 0xfc,\n  0xea, 0xae, 0x91, 0xaa, 0xd9, 0x8d, 0x2d, 0x8b, 0xe3, 0xf3, 0x46, 0xd3,\n  0xa1, 0x4a, 0x97, 0x2b, 0x5d, 0xd1, 0xe5, 0x5d, 0xdb, 0xa8, 0x35, 0xa9,\n  0x95, 0x5f, 0x89, 0x06, 0xbd, 0x5d, 0x15, 0x69, 0x87, 0xbd, 0x36, 0xe4,\n  0xf4, 0x79, 0xab, 0x47, 0x2f, 0xb0, 0xb7, 0x57, 0xba, 0x6b, 0x1d, 0x6e,\n  0x9f, 0x2d, 0xe1, 0x75, 0x34, 0x77, 0xa4, 0x83, 0x43, 0x35, 0xa9, 0x98,\n  0xd5, 0x12, 0x1f, 0x6e, 0xef, 0x58, 0x54, 0x6f, 0xb7, 0xcd, 0xb6, 0x58,\n  0xdb, 0x52, 0x55, 0x4d, 0x21, 0x8b, 0x3d, 0x31, 0xd4, 0x36, 0xb0, 0xd2,\n  0xba, 0x60, 0x50, 0x86, 0x07, 0x86, 0x38, 0xad, 0xea, 0xd4, 0x3f, 0x46,\n  0x3d, 0x9a, 0xea, 0xa8, 0x5e, 0xdf, 0x9a, 0x56, 0x6a, 0xb9, 0xce, 0xc1,\n  0xf1, 0x66, 0xac, 0xe8, 0xae, 0xf2, 0x37, 0xd2, 0x71, 0x01, 0x52, 0x18,\n  0x31, 0x31, 0x39, 0x4e, 0x83, 0x86, 0xc4, 0xdd, 0x75, 0x9e, 0x02, 0xfb,\n  0xd9, 0xc8, 0xc2, 0x14, 0x15, 0x12, 0x00, 0x48, 0x81, 0x71, 0x5d, 0xd4,\n  0xc5, 0x95, 0x23, 0x32, 0x6e, 0x7d, 0xe9, 0x31, 0x24, 0x65, 0x54, 0x56,\n  0x95, 0xb6, 0x7c, 0xd2, 0x38, 0x21, 0x05, 0x8f, 0x00, 0x13, 0x41, 0x02,\n  0xc2, 0xf5, 0x4b, 0xdf, 0x25, 0xe8, 0x5d, 0x72, 0x70, 0x64, 0xf2, 0x4a,\n  0xfc, 0xf1, 0xc8, 0x08, 0x94, 0xa8, 0xcf, 0x7f, 0x46, 0xfe, 0x97, 0xfc,\n  0x10, 0x38, 0x64, 0x0a, 0x0d, 0xa0, 0x45, 0xd9, 0xf9, 0x03, 0xfd, 0x7d,\n  0xbd, 0x3e, 0x8f, 0x42, 0x89, 0xfc, 0x40, 0xa6, 0x95, 0x35, 0x11, 0x2f,\n  0xdd, 0x48, 0x13, 0x65, 0xf9, 0x90, 0x91, 0x12, 0x71, 0x32, 0x25, 0x47,\n  0xb3, 0x5c, 0x49, 0xeb, 0xf7, 0x2c, 0xff, 0xe1, 0x2a, 0xbe, 0x10, 0x1d,\n  0xb2, 0x60, 0xb4, 0xcc, 0x76, 0x85, 0x23, 0xd1, 0x48, 0x55, 0x34, 0x14,\n  0x89, 0xd2, 0xad, 0x12, 0xc0, 0x6d, 0x69, 0xa8, 0xe5, 0x62, 0xdc, 0xc2,\n  0x60, 0xc9, 0xa7, 0x36, 0xc6, 0x4b, 0x89, 0x70, 0xa4, 0xa0, 0xa7, 0x5c,\n  0x29, 0xab, 0xad, 0x5c, 0x8c, 0x79, 0x02, 0x5d, 0x1f, 0xb4, 0x59, 0x1d,\n  0x19, 0x47, 0xe6, 0xa1, 0xe8, 0xb8, 0xc6, 0x3c, 0xb2, 0x6a, 0xb0, 0xa5,\n  0x6b, 0x18, 0x63, 0xe5, 0xe8, 0xf2, 0x9a, 0xe6, 0xa6, 0x50, 0xdc, 0x6e,\n  0x5a, 0x34, 0xe7, 0x24, 0xf3, 0xc9, 0xc3, 0x15, 0x5d, 0xd1, 0xd6, 0x81,\n  0x35, 0x17, 0x7a, 0xbd, 0x95, 0x3e, 0x57, 0x28, 0x5a, 0xdb, 0x80, 0x2f,\n  0x31, 0x05, 0xad, 0x6e, 0x13, 0xee, 0x19, 0x11, 0xfe, 0x8b, 0xdb, 0x38,\n  0x30, 0xb6, 0xbc, 0x71, 0xa8, 0x75, 0xf0, 0xcc, 0x9e, 0xe1, 0x96, 0xbe,\n  0xc5, 0x1b, 0x52, 0x8b, 0x9a, 0xbb, 0x46, 0xc3, 0x0e, 0xf3, 0xd8, 0xfc,\n  0x39, 0x43, 0xdd, 0x2a, 0xcd, 0x88, 0x65, 0xc1, 0x28, 0xde, 0xdd, 0x9c,\n  0xf1, 0xfb, 0xc2, 0xd5, 0x3f, 0xb5, 0x04, 0x9a, 0x23, 0x4d, 0xd9, 0x4d,\n  0x95, 0x15, 0x4b, 0x47, 0x87, 0x28, 0x3d, 0xa3, 0xc9, 0xc2, 0x66, 0x73,\n  0x8d, 0xa8, 0x9a, 0xfa, 0x17, 0x5b, 0x4c, 0x30, 0xfa, 0x49, 0x85, 0xcf,\n  0x6e, 0x85, 0xba, 0x92, 0x61, 0x8e, 0x9a, 0x29, 0x64, 0x30, 0x8d, 0xd7,\n  0x23, 0x69, 0xcb, 0x22, 0x50, 0x36, 0x68, 0x11, 0xe5, 0x0a, 0xc4, 0xe8,\n  0x89, 0xa9, 0xd2, 0xdc, 0xec, 0x30, 0xf5, 0x38, 0x8c, 0x2a, 0xda, 0x08,\n  0x89, 0x62, 0x16, 0xb3, 0xb4, 0x64, 0xea, 0x71, 0xd8, 0x2a, 0xd9, 0x10,\n  0x06, 0xfe, 0x4c, 0x07, 0x34, 0x1d, 0xdf, 0x89, 0x84, 0x2d, 0x98, 0x79,\n  0x69, 0xee, 0xba, 0xcd, 0x67, 0x74, 0x98, 0xcc, 0x0e, 0x7b, 0x47, 0x75,\n  0xac, 0x3a, 0xd6, 0x61, 0x34, 0xba, 0x1c, 0x1d, 0xdb, 0x07, 0xb7, 0x2f,\n  0xdd, 0x3e, 0xf9, 0xdf, 0x23, 0x55, 0xbb, 0x37, 0x5d, 0xfe, 0x88, 0xeb,\n  0xac, 0x75, 0x18, 0xaf, 0x3b, 0x43, 0xa9, 0x9f, 0xab, 0xe7, 0x7f, 0xf4,\n  0x33, 0xcc, 0x7d, 0xf4, 0x56, 0xf2, 0xc5, 0xc5, 0x57, 0xcd, 0x1d, 0x11,\n  0xf9, 0xcd, 0xb2, 0xbc, 0x91, 0xc5, 0x90, 0x08, 0xa3, 0x91, 0xec, 0x10,\n  0x4d, 0x32, 0x50, 0x21, 0x03, 0x79, 0x3b, 0x00, 0x23, 0xc6, 0x8e, 0xe5,\n  0x9c, 0x4d, 0xcc, 0x41, 0x4e, 0xa3, 0xed, 0xca, 0x89, 0x38, 0x82, 0x58,\n  0xdc, 0xc9, 0xda, 0xa2, 0xc3, 0x4a, 0x8d, 0x6c, 0x04, 0x23, 0xbf, 0xcf,\n  0xed, 0xb4, 0x98, 0xf4, 0x3a, 0x2d, 0xf5, 0x91, 0xa6, 0x49, 0xed, 0xf9,\n  0xa9, 0xd9, 0x01, 0x18, 0xaf, 0x28, 0x0f, 0x4e, 0x63, 0x12, 0x53, 0x31,\n  0xe3, 0x3b, 0x2a, 0x92, 0x16, 0xbb, 0xb1, 0xda, 0x56, 0x5b, 0x7d, 0xd5,\n  0xf6, 0xc5, 0x63, 0x96, 0xb0, 0xde, 0x50, 0x61, 0xac, 0xa9, 0x9a, 0x98,\n  0x58, 0x42, 0x0e, 0xe9, 0xf9, 0x3e, 0xb9, 0xa6, 0xa1, 0xab, 0xbf, 0x4f,\n  0xa8, 0x59, 0x35, 0x2a, 0x97, 0x0d, 0xca, 0xe4, 0x75, 0xed, 0xf8, 0xfd,\n  0x6a, 0x7f, 0xcf, 0x86, 0x11, 0x71, 0x0f, 0xf9, 0x5f, 0xc9, 0x2f, 0xc8,\n  0x41, 0x6c, 0x20, 0x15, 0x1c, 0x4f, 0x0e, 0x16, 0x6d, 0xff, 0x07, 0xa5,\n  0xf5, 0x9f, 0x68, 0xfe, 0x37, 0x24, 0x0b, 0xf2, 0x83, 0x1f, 0x55, 0x64,\n  0x7d, 0x7e, 0x8f, 0x59, 0xaf, 0x91, 0x29, 0xa8, 0xcd, 0xd3, 0x20, 0xae,\n  0x64, 0x89, 0x76, 0x4f, 0xbf, 0x83, 0x28, 0x9c, 0xb5, 0xf2, 0x06, 0x12,\n  0x53, 0x30, 0x39, 0x8b, 0xe6, 0x23, 0xca, 0xd8, 0xa9, 0xff, 0x57, 0x8a,\n  0x26, 0x96, 0x87, 0x23, 0xa2, 0xa9, 0x5c, 0x31, 0x91, 0xc9, 0x26, 0x65,\n  0x83, 0x5c, 0xef, 0x68, 0xe5, 0x60, 0x45, 0xba, 0xe7, 0xe6, 0xde, 0x58,\n  0xb3, 0x6b, 0x44, 0x16, 0xc9, 0x36, 0x34, 0x8e, 0x05, 0xdd, 0xa9, 0xcb,\n  0xae, 0xca, 0x2e, 0xf9, 0xe6, 0xd8, 0xf2, 0x43, 0xa7, 0xd6, 0x0e, 0xfa,\n  0x92, 0x9d, 0x0f, 0x9d, 0xd4, 0xb0, 0x71, 0x7d, 0x55, 0xe6, 0xe2, 0xad,\n  0xcd, 0x1d, 0x67, 0x34, 0x30, 0x1e, 0x4f, 0x00, 0xcf, 0x87, 0xe9, 0x1e,\n  0x00, 0xa4, 0x22, 0x1f, 0x15, 0xf0, 0xe4, 0x4a, 0x78, 0x86, 0xe0, 0xeb,\n  0x0f, 0xa4, 0x1f, 0x34, 0xb9, 0xda, 0x6c, 0x55, 0x41, 0xc9, 0xa6, 0xc6,\n  0x2b, 0x19, 0x5a, 0xcc, 0x51, 0x51, 0x68, 0x85, 0x1c, 0x86, 0x8d, 0x8c,\n  0x3a, 0x30, 0x19, 0x91, 0xd1, 0x1a, 0xa4, 0xe1, 0xf5, 0xdd, 0xc0, 0x67,\n  0x82, 0x26, 0x29, 0xbc, 0x92, 0x9d, 0xe5, 0x37, 0x0f, 0xe1, 0x74, 0xff,\n  0xd2, 0xcb, 0x2f, 0x5f, 0xb8, 0xa6, 0x6e, 0x6e, 0x27, 0xae, 0x5e, 0x32,\n  0xa7, 0xb3, 0x76, 0xdd, 0xb8, 0xf0, 0xcb, 0x4e, 0x31, 0xbe, 0x19, 0x9f,\n  0xff, 0x2b, 0x3e, 0x83, 0xad, 0x55, 0xd0, 0x3d, 0xa1, 0x27, 0x89, 0x7a,\n  0xbe, 0x93, 0x75, 0xa6, 0x82, 0x23, 0xd2, 0x22, 0x02, 0x59, 0x2d, 0x2f,\n  0xc4, 0xd2, 0xae, 0xa0, 0xfb, 0x28, 0x36, 0xce, 0x9d, 0xb2, 0xa6, 0xc1,\n  0x52, 0x30, 0xcb, 0x57, 0x17, 0xd6, 0x7f, 0x8c, 0x5a, 0xad, 0xdb, 0x69,\n  0x35, 0x6b, 0x0d, 0x5a, 0x83, 0x25, 0x12, 0xe2, 0xa9, 0x51, 0xa7, 0x4c,\n  0x4c, 0x8c, 0xe2, 0x30, 0xe6, 0xca, 0xce, 0x95, 0x85, 0x05, 0x0e, 0xbc,\n  0x56, 0xf8, 0xed, 0x5c, 0xec, 0xaa, 0x3c, 0x6c, 0xc1, 0x63, 0xc1, 0x64,\n  0x9a, 0x1c, 0x9c, 0x9c, 0x90, 0xce, 0x68, 0x2b, 0x40, 0xbb, 0x3c, 0x0d,\n  0xed, 0x22, 0xee, 0x27, 0xa2, 0x96, 0x86, 0x1d, 0x87, 0x79, 0xc3, 0x94,\n  0xd6, 0xe3, 0x41, 0xee, 0x0a, 0x9a, 0x98, 0x4f, 0x8c, 0x09, 0x87, 0x84,\n  0x8f, 0xf1, 0x53, 0x73, 0x89, 0xb2, 0xb3, 0x73, 0xf2, 0xf3, 0x82, 0xef,\n  0xcb, 0x77, 0x71, 0x23, 0xda, 0xc0, 0xf1, 0xea, 0x77, 0x0b, 0x36, 0x33,\n  0x52, 0xb2, 0x99, 0x51, 0xdf, 0xac, 0xf3, 0x70, 0x23, 0x71, 0x32, 0x7f,\n  0xa7, 0xc6, 0x6c, 0x1d, 0x8b, 0x74, 0x0b, 0x3d, 0xb1, 0x9e, 0x89, 0xa0,\n  0x8b, 0x59, 0xcc, 0x45, 0x4a, 0x42, 0xb9, 0xd1, 0xe9, 0x5e, 0x4f, 0x5a,\n  0xd0, 0x99, 0xa5, 0x9d, 0x79, 0x61, 0xac, 0x15, 0xfe, 0x07, 0x44, 0xee,\n  0x5f, 0x27, 0x12, 0x9b, 0x92, 0xd2, 0x9e, 0x07, 0x65, 0xfe, 0xf7, 0xb8,\n  0x9f, 0x8c, 0x21, 0x37, 0x72, 0x64, 0xad, 0x0e, 0xad, 0x86, 0xfa, 0x5c,\n  0x20, 0xea, 0xd6, 0x03, 0x43, 0xcf, 0x6e, 0xc3, 0x0a, 0x3b, 0x70, 0xb5,\n  0x2e, 0x8e, 0xe9, 0x8a, 0xb1, 0x94, 0x43, 0xd2, 0x60, 0x1d, 0xe1, 0x18,\n  0x30, 0x2d, 0x65, 0xa6, 0x2f, 0xaa, 0xb3, 0xfb, 0x16, 0x5e, 0xd6, 0xec,\n  0x55, 0x2b, 0xda, 0x67, 0x55, 0x45, 0xdd, 0x8e, 0xd9, 0xc1, 0xa6, 0xda,\n  0x54, 0xec, 0xee, 0x60, 0x85, 0xda, 0xdb, 0x57, 0x6d, 0x9c, 0x95, 0xdd,\n  0x68, 0xad, 0xb5, 0xbe, 0xfb, 0x74, 0xa8, 0xd3, 0x24, 0xd5, 0x71, 0x12,\n  0xea, 0xd8, 0x0c, 0x75, 0x7c, 0x7f, 0x46, 0xbb, 0x60, 0x18, 0x3f, 0x86,\n  0x1b, 0xf1, 0x2f, 0xe8, 0x6a, 0x92, 0xe8, 0xcd, 0xc3, 0xc4, 0xdb, 0x15,\n  0xd4, 0x08, 0xb0, 0x93, 0x1a, 0x78, 0x4c, 0x65, 0x36, 0x16, 0xea, 0x3e,\n  0x87, 0x47, 0xc7, 0xb3, 0xea, 0x82, 0x6d, 0xc0, 0x20, 0xd6, 0x13, 0xea,\n  0x88, 0x1f, 0x63, 0x95, 0x53, 0xd1, 0x18, 0x91, 0xf2, 0x0f, 0x81, 0x6e,\n  0x68, 0x61, 0x58, 0xd2, 0x38, 0x42, 0x69, 0x04, 0x4a, 0x0b, 0x5a, 0x82,\n  0x56, 0xa3, 0x1f, 0x8a, 0x02, 0x69, 0x8b, 0x43, 0x6d, 0x57, 0xda, 0xe4,\n  0x0a, 0xb7, 0xd1, 0xa5, 0x77, 0xca, 0xb5, 0x72, 0x85, 0x76, 0x23, 0x28,\n  0xd3, 0x58, 0x27, 0xc7, 0x13, 0x56, 0x96, 0x61, 0xc0, 0xc2, 0x99, 0x39,\n  0x3a, 0xb8, 0x4c, 0x06, 0xa2, 0xd3, 0x91, 0x55, 0x1a, 0x15, 0xcf, 0x49,\n  0xe3, 0x2f, 0x7b, 0xe4, 0x57, 0x2d, 0x6c, 0x64, 0x8a, 0x00, 0xcc, 0xb8,\n  0x38, 0x36, 0x19, 0x0c, 0x1e, 0x60, 0x10, 0x49, 0x7a, 0x1d, 0x5a, 0x3a,\n  0x3e, 0x36, 0x3a, 0xd0, 0xdf, 0x92, 0xa9, 0xa9, 0xf6, 0x7a, 0xcc, 0x26,\n  0x1d, 0xe8, 0x43, 0x2b, 0x97, 0x8f, 0xaf, 0x5e, 0xba, 0xfa, 0xa4, 0x85,\n  0xa3, 0x4b, 0xc6, 0x96, 0x0c, 0xcf, 0xe9, 0x1f, 0x19, 0x18, 0xe9, 0xee,\n  0xcc, 0xf4, 0xb5, 0xf4, 0x35, 0x37, 0x56, 0xa7, 0x6b, 0xd2, 0xe1, 0x20,\n  0x8d, 0x6c, 0xe4, 0xb4, 0x9b, 0xdc, 0x66, 0xb7, 0xce, 0xa8, 0x03, 0x19,\n  0x0a, 0x48, 0x99, 0x16, 0x6b, 0x3d, 0x74, 0xc1, 0x27, 0x5e, 0xda, 0xa4,\n  0x99, 0xa6, 0x31, 0xc6, 0xe5, 0xd2, 0xe6, 0xcc, 0x54, 0x52, 0x5e, 0xbc,\n  0x45, 0xef, 0x05, 0x8f, 0x72, 0x56, 0x7a, 0x27, 0x38, 0xc3, 0xd1, 0x77,\n  0xd2, 0x7d, 0x15, 0x73, 0xe7, 0xce, 0x1e, 0x99, 0x43, 0xdc, 0xc2, 0xb9,\n  0x43, 0xf8, 0x3a, 0xe1, 0x52, 0x98, 0xdd, 0x95, 0xc3, 0xb2, 0xe6, 0x54,\n  0x5f, 0xc5, 0xf0, 0xdc, 0x54, 0x6f, 0x60, 0x68, 0xf2, 0x46, 0xf6, 0x48,\n  0x12, 0x0e, 0xf1, 0xa3, 0x65, 0x87, 0xec, 0xb9, 0x2f, 0x3e, 0x67, 0x3f,\n  0xd8, 0xcc, 0x7e, 0xc8, 0xa1, 0xb6, 0x35, 0x3d, 0x67, 0x9c, 0x7b, 0xfe,\n  0xc6, 0xd3, 0xce, 0x55, 0xd3, 0x79, 0xd5, 0x32, 0x32, 0x3a, 0x3a, 0xf6,\n  0xe5, 0x7b, 0x3e, 0x6a, 0x5b, 0x9b, 0x3d, 0xe3, 0xdc, 0xf6, 0x75, 0xd9,\n  0xd3, 0xcf, 0x99, 0xe9, 0xa8, 0x77, 0xee, 0xd8, 0xe8, 0xe8, 0xbd, 0xf7,\n  0x94, 0x7f, 0xb3, 0x71, 0x75, 0x03, 0x8c, 0xab, 0xbd, 0x30, 0xae, 0x7e,\n  0x7c, 0x84, 0x71, 0xd5, 0x05, 0x73, 0x67, 0xac, 0x10, 0x07, 0x02, 0xcb,\n  0xe9, 0x8e, 0x3f, 0xba, 0xe7, 0x5e, 0x2e, 0xba, 0xd5, 0xc8, 0x41, 0x5a,\n  0xa5, 0xfb, 0xec, 0xcb, 0xe3, 0x40, 0x68, 0x3d, 0x30, 0x9c, 0xa8, 0xa0,\n  0x2c, 0x66, 0x58, 0xd8, 0x75, 0xfa, 0xe9, 0xc9, 0xd3, 0x4f, 0xc7, 0x5d,\n  0x67, 0x25, 0xcf, 0x82, 0xff, 0xd4, 0x66, 0x0b, 0x80, 0xbf, 0x02, 0x32,\n  0xce, 0x2c, 0xd4, 0x48, 0xb4, 0x45, 0x5b, 0x11, 0x87, 0xdc, 0x79, 0x23,\n  0x39, 0x9d, 0xc5, 0x9c, 0x30, 0x20, 0x0b, 0xcd, 0xae, 0xa5, 0x03, 0xc1,\n  0x97, 0x8e, 0x60, 0xb9, 0x82, 0x31, 0x58, 0x3c, 0x54, 0x36, 0x75, 0x91,\n  0x42, 0x4e, 0x14, 0xc0, 0x6c, 0x39, 0x4e, 0xbe, 0x98, 0x4a, 0xc9, 0x2b,\n  0x78, 0xe0, 0x61, 0x1c, 0xe0, 0x21, 0x66, 0x43, 0xa7, 0xd8, 0x98, 0x41,\n  0x91, 0x50, 0x50, 0xd1, 0x12, 0x63, 0x18, 0xdd, 0x41, 0x0b, 0x0e, 0xda,\n  0xb8, 0x0c, 0x17, 0xe6, 0x80, 0x90, 0xb8, 0x71, 0xa7, 0xf0, 0x03, 0x92,\n  0x16, 0x6e, 0xf9, 0x87, 0xf0, 0x1e, 0x7e, 0xec, 0x4f, 0xf5, 0x9f, 0x0f,\n  0xe9, 0xf1, 0x27, 0xc2, 0xa2, 0x3f, 0x76, 0xe3, 0xd5, 0xf8, 0x97, 0x99,\n  0x8c, 0xb0, 0x59, 0x78, 0xea, 0x21, 0x7c, 0xa0, 0x19, 0x5f, 0xf3, 0xc5,\n  0x93, 0x62, 0x2c, 0xdb, 0x7e, 0x90, 0x8d, 0x6e, 0x27, 0xef, 0x01, 0x9d,\n  0xaf, 0x21, 0xef, 0x92, 0x37, 0x8a, 0xfc, 0xe8, 0x0d, 0xc9, 0x26, 0x28,\n  0xd5, 0x09, 0xee, 0x43, 0x9d, 0xa6, 0xf3, 0x2b, 0x1a, 0x13, 0x18, 0x08,\n  0x51, 0x9a, 0xdd, 0xef, 0xa0, 0xbf, 0xd3, 0xf8, 0x19, 0x4c, 0x14, 0xa8,\n  0xfb, 0xfc, 0x62, 0xdd, 0xfb, 0xb3, 0x39, 0x83, 0x8a, 0xe3, 0x10, 0x56,\n  0xb3, 0xba, 0x2b, 0xc5, 0xba, 0x43, 0x95, 0x91, 0x62, 0xbd, 0xac, 0xe0,\n  0xeb, 0x59, 0x39, 0xb7, 0x50, 0x6f, 0xae, 0x86, 0x2a, 0x07, 0xb4, 0xe2,\n  0x7a, 0x1d, 0xeb, 0x06, 0xba, 0x22, 0xe2, 0xaa, 0xb5, 0xa5, 0x82, 0xd8,\n  0xc2, 0x42, 0x9f, 0x61, 0xf8, 0x1f, 0xe6, 0xb8, 0x60, 0x2c, 0x88, 0x1f,\n  0x13, 0xde, 0xfb, 0x87, 0x70, 0x0b, 0x54, 0xfd, 0x07, 0xd0, 0x04, 0x5f,\n  0xc6, 0xf6, 0xa1, 0xcf, 0x6f, 0xc1, 0x9f, 0xb4, 0x42, 0xd5, 0x1f, 0xc2,\n  0x23, 0x78, 0x17, 0x54, 0xdd, 0x2f, 0xdc, 0xdb, 0x8d, 0x0f, 0xe0, 0x6f,\n  0x0a, 0xe7, 0x0b, 0x6d, 0x5d, 0x92, 0x4f, 0xac, 0x9f, 0x7b, 0x84, 0x3c,\n  0x89, 0xaf, 0x42, 0x49, 0x22, 0xe4, 0x7f, 0x81, 0x10, 0xdb, 0xc9, 0x26,\n  0xad, 0xb6, 0xe7, 0x7f, 0x51, 0xcc, 0xb7, 0x57, 0x01, 0x6d, 0xb4, 0x8f,\n  0xbc, 0x03, 0x6d, 0xe1, 0x03, 0x8a, 0xd1, 0x83, 0x6e, 0xce, 0xee, 0x72,\n  0x60, 0x99, 0xc2, 0x8e, 0x39, 0x19, 0x68, 0x5a, 0xca, 0x38, 0xd6, 0xa8,\n  0xbb, 0x12, 0x44, 0xab, 0xe9, 0xc6, 0x72, 0xad, 0x62, 0x58, 0x4f, 0x57,\n  0xd2, 0x90, 0x82, 0xa6, 0xc6, 0x50, 0x12, 0x25, 0xdd, 0x51, 0x2f, 0xd7,\n  0xaa, 0xb4, 0x72, 0xd5, 0x36, 0x1d, 0x65, 0x8b, 0x1c, 0x92, 0x51, 0x03,\n  0x21, 0xaf, 0xe4, 0xf8, 0x09, 0x90, 0x35, 0x89, 0x5a, 0x49, 0x26, 0x40,\n  0x91, 0xd3, 0x68, 0xd5, 0x9a, 0x09, 0x04, 0x4f, 0x69, 0xc7, 0x91, 0x56,\n  0xab, 0x5a, 0x65, 0xc0, 0x2a, 0xad, 0x6a, 0x5e, 0x4d, 0xb5, 0xdb, 0x8d,\n  0x51, 0x47, 0x5b, 0x26, 0xd5, 0xd4, 0x50, 0xdd, 0x53, 0xd3, 0x43, 0x77,\n  0x74, 0xb9, 0x7d, 0x6e, 0x9f, 0xd7, 0x63, 0x35, 0x1b, 0x74, 0x6a, 0x25,\n  0x68, 0x9c, 0x2e, 0xec, 0x32, 0x2a, 0xd8, 0x54, 0x07, 0x65, 0xb2, 0x90,\n  0x31, 0x33, 0x93, 0x29, 0xc5, 0x59, 0x64, 0xf3, 0xbe, 0xe0, 0xa6, 0x96,\n  0x4e, 0x15, 0xbd, 0x45, 0x45, 0x21, 0x47, 0x32, 0x41, 0x80, 0x2e, 0xfc,\n  0x64, 0x4f, 0xae, 0x51, 0x6b, 0x6d, 0xa9, 0x6c, 0x6c, 0xb9, 0xb7, 0xa5,\n  0xc6, 0xe7, 0x8d, 0x3b, 0xec, 0xee, 0x1e, 0xfc, 0x17, 0x61, 0x78, 0x08,\n  0x3f, 0x2d, 0xbc, 0xdc, 0xd4, 0x51, 0xe3, 0x73, 0x25, 0xea, 0xf1, 0x9c,\n  0xfe, 0xa5, 0xcb, 0x06, 0xdc, 0x49, 0xb3, 0xd5, 0x54, 0x6b, 0x1a, 0xaf,\n  0xad, 0x71, 0x37, 0xda, 0x2d, 0xf5, 0xe4, 0x9d, 0x74, 0xfb, 0x47, 0x35,\n  0x36, 0x4f, 0x73, 0xfc, 0x54, 0x05, 0xb1, 0x07, 0xdd, 0x06, 0x4d, 0xb3,\n  0xce, 0xa8, 0xa4, 0xf3, 0x77, 0x3f, 0x21, 0x01, 0x8f, 0xcb, 0xd1, 0x58,\n  0x35, 0xf9, 0xe9, 0x82, 0x25, 0xa7, 0xcc, 0xd7, 0xaa, 0x32, 0x0a, 0xcd,\n  0x39, 0x99, 0x36, 0x9d, 0xba, 0x43, 0xad, 0x29, 0xb4, 0xeb, 0xf9, 0xc5,\n  0x76, 0x1d, 0x41, 0xd7, 0x67, 0xaf, 0x2d, 0x6f, 0xd7, 0x1e, 0xac, 0xd5,\n  0xe4, 0x1a, 0x89, 0x5a, 0xdb, 0x80, 0xe5, 0xea, 0x19, 0xdb, 0x55, 0xad,\n  0x52, 0x1f, 0xa9, 0x5d, 0x35, 0xb4, 0x5d, 0x35, 0x08, 0x9a, 0x55, 0x0b,\n  0xed, 0x2b, 0x57, 0xa9, 0xc7, 0x41, 0x15, 0xa6, 0x5b, 0xb1, 0xd5, 0xaa,\n  0x79, 0xb4, 0x51, 0x07, 0xfa, 0xba, 0x3b, 0x13, 0xcd, 0x34, 0xbd, 0xc4,\n  0x4c, 0x4d, 0x6a, 0x38, 0xae, 0x26, 0xb5, 0x4e, 0x09, 0x5f, 0x18, 0xab,\n  0xac, 0x9c, 0x9a, 0xf3, 0x9b, 0x79, 0xcb, 0xcc, 0xd8, 0xbc, 0x87, 0xc4,\n  0xe6, 0xfd, 0x59, 0xa1, 0x79, 0x2f, 0xbf, 0x21, 0xd4, 0xe2, 0xf0, 0x74,\n  0x79, 0x2b, 0xa3, 0x95, 0x75, 0xcd, 0x2d, 0x83, 0xad, 0xfe, 0x56, 0xaf,\n  0xd5, 0x9e, 0xf4, 0x06, 0x7c, 0xb1, 0x3a, 0x7f, 0xa3, 0xe7, 0x18, 0x1a,\n  0x5a, 0x58, 0xb8, 0x4e, 0xa3, 0x6e, 0xd1, 0x1a, 0x5c, 0x56, 0x87, 0xd3,\n  0x64, 0xae, 0xad, 0x6b, 0xac, 0xd5, 0x68, 0xe3, 0x6a, 0x9d, 0xcd, 0x64,\n  0xb7, 0x1b, 0x35, 0xce, 0x28, 0x34, 0x50, 0x55, 0xfe, 0xef, 0xe4, 0xaf,\n  0x4c, 0x0f, 0xf3, 0xa2, 0x46, 0x1c, 0x1f, 0x7a, 0x42, 0x4d, 0xd7, 0x4e,\n  0x74, 0xa0, 0x0e, 0xbb, 0xf4, 0x44, 0x2e, 0x73, 0x63, 0x22, 0xaf, 0xc0,\n  0x48, 0x25, 0xa3, 0xf9, 0x2b, 0x34, 0xd2, 0x2d, 0x3c, 0xfd, 0xd6, 0x8c,\n  0x2f, 0xd0, 0x4d, 0x4e, 0x14, 0x58, 0x9b, 0x06, 0x63, 0x0e, 0x6f, 0xd7,\n  0xa9, 0x89, 0x92, 0xa8, 0x88, 0x52, 0xb5, 0x4d, 0x41, 0x73, 0x4e, 0xaa,\n  0x10, 0xbf, 0xad, 0x94, 0xec, 0x48, 0x8b, 0x89, 0x92, 0xc6, 0xea, 0x83,\n  0xab, 0xaa, 0x71, 0x29, 0xab, 0x8d, 0x8a, 0x9f, 0x27, 0x95, 0x99, 0x9e,\n  0xe1, 0x5d, 0x4e, 0x43, 0x63, 0x59, 0x82, 0x4c, 0x79, 0x94, 0xb7, 0xff,\n  0x95, 0xa2, 0xc7, 0xc7, 0xb3, 0x11, 0x9f, 0x0f, 0x7a, 0x1f, 0xf9, 0x1a,\n  0x7d, 0x8d, 0x75, 0x35, 0x55, 0xb1, 0x48, 0x28, 0xe0, 0x77, 0xd8, 0xcc,\n  0x46, 0x8d, 0x4a, 0xe6, 0x95, 0x7b, 0x99, 0x40, 0xa1, 0x57, 0x38, 0x6a,\n  0x81, 0xe0, 0xe0, 0x23, 0x4e, 0x22, 0x39, 0x0b, 0x50, 0xcf, 0xd2, 0xb2,\n  0x48, 0x09, 0x69, 0x52, 0xe4, 0x42, 0xb1, 0x93, 0x77, 0xcf, 0x34, 0x75,\n  0x8c, 0x9d, 0x32, 0x59, 0x65, 0x47, 0xb6, 0x67, 0x76, 0x36, 0x1e, 0xa3,\n  0xe1, 0x46, 0xc8, 0x41, 0xe1, 0x81, 0xc3, 0xa6, 0x4a, 0x85, 0xf0, 0xf5,\n  0xda, 0xe6, 0xb6, 0xec, 0x8f, 0x0f, 0xcd, 0x6a, 0x4d, 0x3d, 0x26, 0xc6,\n  0x82, 0xff, 0x1b, 0xf7, 0x06, 0xf3, 0xf1, 0x3f, 0x9b, 0x89, 0x92, 0x95,\n  0xf8, 0x6c, 0x26, 0x0f, 0xd2, 0xb4, 0x21, 0x95, 0xd0, 0xb7, 0x2e, 0x38,\n  0x02, 0x4a, 0xcb, 0xb8, 0x8c, 0xdf, 0x67, 0xd5, 0x83, 0x72, 0x6b, 0x03,\n  0x8e, 0x26, 0xe3, 0x86, 0xe9, 0x62, 0xc0, 0xf6, 0xf2, 0xa0, 0x29, 0x34,\n  0x1a, 0x00, 0x52, 0x00, 0x05, 0x5e, 0x4c, 0xb3, 0x5b, 0xac, 0xa0, 0xeb,\n  0x8f, 0xa3, 0x26, 0x8b, 0xc9, 0x6a, 0x72, 0x1a, 0x79, 0x85, 0x8f, 0x06,\n  0x6d, 0x2d, 0xe5, 0xa5, 0x96, 0x16, 0xed, 0xa1, 0x9e, 0x3c, 0xe8, 0xdc,\n  0x30, 0xaa, 0x41, 0xa4, 0x27, 0x95, 0xc2, 0xcd, 0x83, 0xa3, 0xf3, 0x07,\n  0x72, 0xb9, 0x06, 0x93, 0xbd, 0xd1, 0xdd, 0x9c, 0x8a, 0x27, 0x71, 0x9d,\n  0xd0, 0x52, 0xd7, 0xd0, 0x50, 0xf7, 0x9c, 0xfe, 0xf4, 0x93, 0x97, 0x9e,\n  0xa6, 0x3b, 0x7d, 0x03, 0xb1, 0x27, 0x34, 0x1a, 0x2c, 0x7c, 0x93, 0x58,\n  0x93, 0x36, 0x72, 0x3e, 0x9e, 0x9f, 0x9d, 0xaf, 0xc7, 0xed, 0xba, 0x31,\n  0x91, 0xb6, 0x82, 0xa0, 0x2e, 0x5f, 0x4d, 0xde, 0x62, 0xfb, 0x0b, 0x7c,\n  0x50, 0xa3, 0x43, 0x59, 0x63, 0xd0, 0x48, 0x34, 0x6a, 0x8b, 0x0e, 0x08,\n  0xaa, 0x1a, 0xeb, 0xb4, 0x34, 0x96, 0x8a, 0x0a, 0x06, 0x45, 0x3d, 0x4c,\n  0x4d, 0x3d, 0x47, 0x03, 0xff, 0xec, 0x50, 0xf1, 0x54, 0xfc, 0x57, 0x6b,\n  0x88, 0x7a, 0x3d, 0x9d, 0xe2, 0x3a, 0x8d, 0x76, 0x3d, 0xf5, 0x80, 0xd2,\n  0x2d, 0x46, 0x3a, 0x1d, 0xad, 0x83, 0x0e, 0xd1, 0x45, 0x41, 0x3a, 0x16,\n  0x9b, 0x41, 0x05, 0x24, 0xdb, 0xcb, 0xdf, 0x24, 0x0a, 0x78, 0x51, 0x71,\n  0x94, 0x17, 0x8f, 0xb3, 0x20, 0x18, 0x37, 0xd0, 0xec, 0x95, 0x51, 0x1f,\n  0xcd, 0x32, 0xe7, 0xa4, 0x69, 0xdc, 0x69, 0x20, 0x18, 0x9a, 0x13, 0x44,\n  0x92, 0xf1, 0x0d, 0x54, 0xc6, 0x8f, 0x85, 0xf9, 0xb0, 0x25, 0x61, 0x09,\n  0x02, 0xaf, 0xa2, 0xa9, 0x41, 0x2c, 0x96, 0x04, 0x87, 0x99, 0x03, 0x38,\n  0x5d, 0x03, 0x89, 0x32, 0xd7, 0x39, 0x9e, 0x4f, 0x70, 0xcd, 0xe9, 0xb7,\n  0xd2, 0x2b, 0x0f, 0x2d, 0x79, 0x1b, 0xff, 0xc7, 0xfa, 0x4b, 0x2e, 0x5b,\n  0xf5, 0xe8, 0x9d, 0x6b, 0xce, 0x3e, 0x67, 0xd5, 0x03, 0x5f, 0xc8, 0xc7,\n  0xf1, 0xd0, 0x9f, 0x7f, 0xf4, 0x23, 0xfc, 0x37, 0x99, 0x41, 0xc9, 0xeb,\n  0x15, 0x99, 0x7d, 0x6f, 0xbe, 0x49, 0xde, 0x9a, 0x4c, 0xe0, 0x0a, 0x50,\n  0x18, 0xce, 0xc6, 0x4b, 0x84, 0xbf, 0x60, 0x9d, 0xf0, 0xa8, 0x70, 0x3d,\n  0x39, 0x38, 0x37, 0x8f, 0xe6, 0xbe, 0x60, 0xe9, 0x0d, 0xf8, 0x7a, 0x1d,\n  0x6f, 0x8b, 0xb1, 0xf8, 0x11, 0xb7, 0xa0, 0x6c, 0x9c, 0x54, 0xd3, 0x78,\n  0x69, 0x70, 0x9d, 0xaa, 0xd0, 0xcf, 0x80, 0x16, 0xaa, 0xa0, 0x51, 0x77,\n  0x60, 0x34, 0xf0, 0x30, 0x9e, 0xbc, 0xe4, 0x73, 0x14, 0x45, 0x71, 0xb4,\n  0x3e, 0xbb, 0xc6, 0xcb, 0x11, 0xad, 0x0e, 0x0f, 0x2b, 0xd9, 0x1e, 0x3f,\n  0x10, 0x4f, 0xb4, 0x20, 0x4f, 0xa2, 0x6d, 0xd0, 0x74, 0x72, 0x35, 0xe8,\n  0xd8, 0x1a, 0x39, 0xa1, 0x8d, 0x01, 0x3a, 0xb3, 0x6e, 0xc2, 0x40, 0xbd,\n  0x97, 0xb4, 0xe3, 0xf0, 0xa3, 0x45, 0xab, 0xf4, 0x70, 0x88, 0xe6, 0x49,\n  0xe9, 0x40, 0xe3, 0xb1, 0x78, 0x30, 0xc0, 0x9a, 0x43, 0x14, 0x5b, 0x74,\n  0x34, 0xfe, 0x17, 0xcd, 0x39, 0x4c, 0x53, 0x83, 0x52, 0x86, 0x45, 0xf3,\n  0xa4, 0x40, 0xa3, 0x98, 0xd8, 0x3f, 0x51, 0xa4, 0x92, 0xc4, 0x2a, 0xd0,\n  0x22, 0x8a, 0x81, 0x56, 0x63, 0xc5, 0xd4, 0xa0, 0x36, 0xbb, 0x9d, 0x64,\n  0x33, 0x0b, 0xdd, 0xbc, 0xb9, 0x6b, 0xcf, 0xe2, 0xe1, 0xe1, 0xc5, 0x7b,\n  0x96, 0x3c, 0xfa, 0x28, 0x47, 0x64, 0xbe, 0xb1, 0xd6, 0x89, 0xb3, 0xcf,\n  0xbe, 0x68, 0xd6, 0xd0, 0x9c, 0x59, 0x0b, 0x7a, 0x70, 0x4e, 0x5d, 0x5f,\n  0x39, 0x48, 0x96, 0x4c, 0x3e, 0x42, 0x96, 0x74, 0xaf, 0x82, 0xbf, 0xee,\n  0x0a, 0x5f, 0xce, 0x57, 0xd7, 0x70, 0xcd, 0x55, 0x17, 0xdf, 0x3a, 0xb8,\n  0x6e, 0xd5, 0xda, 0x95, 0xeb, 0x56, 0xa8, 0x4f, 0x59, 0x25, 0xca, 0x7f,\n  0xee, 0xbc, 0x01, 0xff, 0x8a, 0xbc, 0x8b, 0x82, 0xd4, 0x1e, 0x54, 0x81,\n  0x15, 0x3c, 0x08, 0x7f, 0x94, 0x36, 0x70, 0x1a, 0xba, 0x47, 0x7f, 0xd8,\n  0x01, 0xdd, 0x3f, 0x04, 0x4d, 0xa6, 0x00, 0x3a, 0xbf, 0x5e, 0xa5, 0x24,\n  0x72, 0x3a, 0x59, 0x64, 0x74, 0x8f, 0xf2, 0x8c, 0x71, 0x02, 0xe0, 0x7a,\n  0x10, 0x51, 0x6b, 0xaa, 0x39, 0x12, 0x89, 0x9a, 0xd5, 0x0a, 0x7f, 0x2d,\n  0xb6, 0xd1, 0x84, 0x9f, 0x76, 0xea, 0xc7, 0x32, 0x25, 0xae, 0x70, 0x26,\n  0x98, 0x4a, 0xd0, 0x80, 0x29, 0x36, 0x1e, 0x1f, 0xfc, 0x3f, 0x3b, 0x2e,\n  0xc5, 0xdd, 0x5b, 0x17, 0x6c, 0x1e, 0x69, 0x5c, 0x5e, 0x7f, 0xf2, 0xf8,\n  0xda, 0xcd, 0xb9, 0x8f, 0x84, 0x9f, 0x4f, 0xbc, 0x20, 0x7c, 0x84, 0xbf,\n  0xfc, 0x16, 0x7e, 0xab, 0xe3, 0xc7, 0xdc, 0xfa, 0x95, 0x3d, 0x6b, 0x5b,\n  0x71, 0x68, 0xcc, 0x66, 0x59, 0xd0, 0xd7, 0xd3, 0xdb, 0xf3, 0xe6, 0xd0,\n  0x37, 0x87, 0x3b, 0x68, 0xe4, 0xf0, 0xba, 0xfc, 0xdf, 0xc8, 0x16, 0xd0,\n  0x8b, 0x57, 0x42, 0xbf, 0x5e, 0x86, 0xb6, 0xa3, 0x1b, 0xd0, 0x5e, 0xf4,\n  0x54, 0xf6, 0x6b, 0x29, 0x8f, 0xdd, 0x20, 0x23, 0xd8, 0x0b, 0x2a, 0x5f,\n  0x7b, 0x9a, 0x68, 0xf8, 0xab, 0xb6, 0x5f, 0x71, 0xe9, 0x25, 0x5b, 0x16,\n  0x0f, 0x2a, 0xb5, 0xba, 0xbb, 0x6e, 0x5b, 0xca, 0xcb, 0x0c, 0x5a, 0xf9,\n  0x30, 0xf0, 0x4f, 0xb5, 0x4c, 0xa1, 0xa6, 0xbc, 0x13, 0xab, 0xe5, 0x78,\n  0x1b, 0xd2, 0xf0, 0x3a, 0x5e, 0xa3, 0xdb, 0x86, 0x54, 0x06, 0xbd, 0x41,\n  0xa5, 0xdf, 0x06, 0xac, 0x53, 0x2d, 0x57, 0xaa, 0x29, 0x6d, 0xa0, 0xde,\n  0xdf, 0xcc, 0x89, 0x92, 0xa7, 0xb4, 0x82, 0x87, 0x1e, 0xe7, 0x75, 0x1b,\n  0xa9, 0x33, 0xa1, 0x41, 0xa5, 0x35, 0x4c, 0x98, 0xb1, 0x1e, 0x21, 0xfd,\n  0x38, 0xfc, 0xe8, 0xd1, 0x2a, 0x23, 0x46, 0x7a, 0x34, 0xef, 0xc6, 0x5d,\n  0xe7, 0x9d, 0x83, 0xd1, 0x9e, 0xdb, 0x77, 0xed, 0xbd, 0x71, 0xef, 0xc5,\n  0xe7, 0x9f, 0x73, 0xd9, 0x79, 0x97, 0x6d, 0xde, 0xb4, 0x71, 0xc3, 0xbc,\n  0xb1, 0x5c, 0xb6, 0x2d, 0xd3, 0x58, 0x5f, 0x5b, 0x1d, 0x8b, 0x02, 0xab,\n  0x05, 0xe5, 0x1b, 0xad, 0xc4, 0x2b, 0x2d, 0x8a, 0x62, 0xa0, 0x6b, 0xc9,\n  0xbb, 0x34, 0x93, 0x61, 0x4e, 0xd2, 0xa2, 0x37, 0xbd, 0x63, 0x4a, 0x9c,\n  0xee, 0x44, 0xbc, 0xe8, 0x5c, 0xce, 0xf3, 0x70, 0x14, 0x77, 0x48, 0x2c,\n  0x56, 0x34, 0x94, 0x4a, 0xb9, 0xa8, 0xc3, 0x74, 0x1d, 0x88, 0x4e, 0x24,\n  0xf1, 0xdc, 0x22, 0xe6, 0x76, 0xa0, 0x4e, 0xe8, 0x0e, 0xb6, 0x9f, 0x9d,\n  0x8f, 0xc7, 0x33, 0xb1, 0x10, 0xe3, 0xe1, 0xbc, 0x3d, 0xc3, 0x6c, 0x26,\n  0x7c, 0x46, 0xf2, 0x2e, 0x92, 0x82, 0xd7, 0x86, 0xc4, 0x34, 0xbc, 0x34,\n  0xda, 0xb6, 0xbb, 0x36, 0x61, 0xe7, 0xe5, 0x4d, 0xb3, 0x6b, 0xb3, 0x41,\n  0x93, 0x2a, 0x14, 0xd1, 0x1a, 0x0c, 0x1a, 0x83, 0x4a, 0x8d, 0x65, 0x1a,\n  0x45, 0xa8, 0xda, 0x59, 0xa1, 0x75, 0xfb, 0x2c, 0x6a, 0x15, 0xa7, 0xb1,\n  0xe8, 0xb5, 0x9c, 0x45, 0xc3, 0x85, 0xad, 0x4a, 0x93, 0x1a, 0xe3, 0x78,\n  0x6f, 0xdd, 0x40, 0x1c, 0xb4, 0x36, 0xbd, 0xc1, 0x19, 0x50, 0x47, 0xd4,\n  0x15, 0x1e, 0x43, 0x68, 0x6d, 0x27, 0xaf, 0xb6, 0xc7, 0x0f, 0xc9, 0x15,\n  0x2a, 0x47, 0x7d, 0x24, 0x56, 0x09, 0x00, 0xb8, 0xba, 0x55, 0xdf, 0x57,\n  0x99, 0x94, 0x4a, 0xb5, 0x59, 0x65, 0xf4, 0x68, 0x15, 0x15, 0x5b, 0xcf,\n  0x8d, 0x04, 0x4f, 0x6e, 0xfa, 0xba, 0x31, 0xd9, 0xa4, 0xd5, 0x55, 0xdf,\n  0xe8, 0x0b, 0xc8, 0x39, 0xa5, 0x59, 0x69, 0xac, 0xb4, 0x62, 0x0e, 0x60,\n  0xb4, 0x05, 0xad, 0xe3, 0x29, 0x65, 0x4d, 0x55, 0x45, 0xb5, 0x53, 0x7e,\n  0xa3, 0x5c, 0xaf, 0x36, 0xa9, 0x95, 0x16, 0x62, 0xc6, 0xb8, 0xda, 0xef,\n  0x0f, 0x68, 0x1c, 0x0e, 0xab, 0x45, 0x6f, 0xe4, 0x74, 0x15, 0xa6, 0x6b,\n  0x39, 0xec, 0x6b, 0x34, 0xce, 0x5a, 0x14, 0xcb, 0x8d, 0x56, 0x7b, 0x93,\n  0x0e, 0x7d, 0xc4, 0x66, 0xaf, 0x09, 0xf0, 0x7c, 0xa0, 0xc6, 0xe1, 0xb1,\n  0x45, 0xe3, 0x9a, 0xcc, 0x12, 0x53, 0xb0, 0x2d, 0x82, 0x5f, 0xb2, 0x54,\n  0x3b, 0xbc, 0x3d, 0x6d, 0xd1, 0xea, 0xae, 0x0a, 0x73, 0xdc, 0xc7, 0x99,\n  0x1f, 0xc2, 0xfb, 0x41, 0xe4, 0x7e, 0x98, 0xe3, 0x9d, 0x2b, 0x2c, 0x56,\n  0xd9, 0xbd, 0x7b, 0x54, 0xa1, 0x0a, 0x05, 0xef, 0xf1, 0x09, 0x3f, 0x4f,\n  0xd6, 0xea, 0x4e, 0x6a, 0x85, 0x01, 0x1e, 0x5f, 0xe4, 0xa8, 0x4d, 0x22,\n  0x16, 0xa9, 0x82, 0xac, 0x00, 0xbe, 0x62, 0x03, 0x0a, 0x3d, 0x27, 0x3b,\n  0x0b, 0xa4, 0x76, 0x85, 0xd9, 0xa0, 0x55, 0xc9, 0x88, 0x8c, 0xc6, 0xfc,\n  0x56, 0x80, 0xb0, 0x26, 0xdb, 0xa6, 0x04, 0x85, 0x05, 0xce, 0xa9, 0xf3,\n  0x0b, 0xaf, 0x40, 0xfc, 0x7a, 0x04, 0x17, 0x19, 0x53, 0xa1, 0x66, 0x5d,\n  0x05, 0xb5, 0x03, 0xf9, 0x3c, 0x4e, 0x3b, 0x80, 0xb0, 0x99, 0xcd, 0x66,\n  0x47, 0x50, 0xa5, 0xf0, 0xd4, 0x16, 0x16, 0x1b, 0x78, 0x47, 0x86, 0xfa,\n  0x35, 0xc5, 0xf8, 0x70, 0x26, 0x16, 0x36, 0x99, 0xa8, 0x5a, 0x49, 0x97,\n  0x1c, 0xbe, 0x71, 0xed, 0x95, 0xc3, 0xfd, 0xad, 0x2d, 0x8b, 0xd6, 0x6d,\n  0x38, 0xb9, 0x67, 0x60, 0xe1, 0x39, 0x23, 0xb7, 0xac, 0xdb, 0xbf, 0x7c,\n  0x7c, 0x9c, 0x1c, 0x5c, 0xb7, 0xae, 0xff, 0x54, 0xc7, 0xb2, 0xa5, 0xb7,\n  0x3f, 0x74, 0xda, 0x69, 0x8f, 0x5e, 0x26, 0x7c, 0x80, 0xcf, 0xb9, 0x6a,\n  0x4e, 0x9b, 0x68, 0x0f, 0x01, 0xea, 0x46, 0x6e, 0xe4, 0x8c, 0xc8, 0x0c,\n  0x1c, 0x70, 0x56, 0xb6, 0x8f, 0x2e, 0xbf, 0x6d, 0x47, 0xa0, 0x68, 0xc8,\n  0xb1, 0x62, 0x9b, 0x0c, 0x13, 0x15, 0x46, 0x4a, 0x82, 0xa8, 0x74, 0x28,\n  0xc7, 0x4a, 0xca, 0xf6, 0x78, 0x9e, 0x61, 0xc8, 0xaf, 0x50, 0xd3, 0x4d,\n  0xcd, 0x80, 0xa2, 0xcb, 0x69, 0xb5, 0xc0, 0xdb, 0xa0, 0x5f, 0x31, 0x85,\n  0x4f, 0x43, 0x39, 0x20, 0xa3, 0x50, 0x94, 0x36, 0x89, 0xb8, 0xda, 0x40,\n  0xeb, 0x10, 0x37, 0x83, 0x60, 0xdd, 0x86, 0xdc, 0xfe, 0xdc, 0xcd, 0x57,\n  0x5f, 0x7d, 0x33, 0x0d, 0xe0, 0x77, 0xd6, 0xba, 0xd5, 0xe7, 0x90, 0x6b,\n  0x05, 0x3b, 0x89, 0x0c, 0x0f, 0x2f, 0x3f, 0xe3, 0xd4, 0xf3, 0xf0, 0x27,\n  0x1d, 0x78, 0x9c, 0x0c, 0x2c, 0x1c, 0x9a, 0x23, 0xea, 0x80, 0xab, 0xf2,\n  0x67, 0x91, 0x15, 0x30, 0x8f, 0x1c, 0xc0, 0x9b, 0x2b, 0xe9, 0x1e, 0x32,\n  0x1e, 0x38, 0x32, 0x8a, 0x84, 0x03, 0x9c, 0x42, 0xae, 0xc3, 0x9c, 0xc2,\n  0x08, 0x92, 0x8b, 0x6c, 0x98, 0xc6, 0xcf, 0x93, 0xa1, 0x39, 0x32, 0x9a,\n  0x3f, 0x83, 0xa3, 0x22, 0x2e, 0x21, 0x57, 0xb2, 0x95, 0x1c, 0xb9, 0x82,\n  0x66, 0x03, 0x54, 0x70, 0x1c, 0xc3, 0x98, 0x06, 0x7d, 0x52, 0x70, 0xa3,\n  0x74, 0x27, 0x99, 0xc7, 0xed, 0xac, 0x70, 0x55, 0x88, 0x74, 0x16, 0xb4,\n  0x43, 0x07, 0x76, 0xa8, 0x14, 0xd4, 0x88, 0xe9, 0xc8, 0xc4, 0x32, 0x72,\n  0x5e, 0x9c, 0x19, 0x16, 0xc6, 0x76, 0x68, 0x3d, 0x1c, 0x50, 0x95, 0xa6,\n  0x78, 0xc2, 0x52, 0xe9, 0x48, 0xc6, 0x68, 0x1a, 0x86, 0xca, 0xc6, 0x98,\n  0xfe, 0x23, 0x3d, 0x36, 0xb8, 0x2f, 0xa8, 0xe9, 0x89, 0xbc, 0x36, 0xf1,\n  0xd0, 0xba, 0xcc, 0x86, 0x95, 0x4b, 0x5f, 0x59, 0x77, 0x1a, 0x91, 0x75,\n  0xfa, 0xaf, 0x68, 0xca, 0xa4, 0xe2, 0xe4, 0xa0, 0xa2, 0x33, 0x99, 0xec,\n  0x3b, 0xab, 0xe6, 0xfa, 0xd6, 0xe1, 0x7a, 0x9d, 0xf0, 0x0a, 0xf6, 0x0a,\n  0x0b, 0x40, 0x8f, 0xfe, 0x31, 0x39, 0x38, 0x22, 0x7c, 0x06, 0x68, 0x5f,\n  0x3e, 0xe8, 0xff, 0xbd, 0xa6, 0x87, 0xd9, 0x35, 0xff, 0x46, 0xda, 0xc9,\n  0x21, 0xa2, 0xc0, 0xdf, 0x63, 0x7d, 0xd1, 0x82, 0x4f, 0x25, 0xbf, 0x04,\n  0xfa, 0x1a, 0x45, 0x6d, 0xb4, 0xb6, 0x0e, 0xa8, 0x5d, 0xaa, 0xb9, 0xda,\n  0x49, 0x6d, 0xfa, 0x1c, 0xa6, 0x49, 0xd0, 0x40, 0x94, 0x23, 0xd4, 0xbc,\n  0xbf, 0x4d, 0xad, 0xe4, 0x59, 0x6e, 0x49, 0x05, 0xda, 0x56, 0xca, 0x1e,\n  0xa9, 0x40, 0x78, 0x9c, 0xd9, 0xf1, 0x54, 0xd4, 0x62, 0x36, 0xaf, 0x12,\n  0xb8, 0x4a, 0x65, 0x5b, 0x65, 0x5b, 0x32, 0x51, 0x5f, 0x57, 0x0b, 0xb2,\n  0x99, 0xd7, 0xcd, 0x12, 0xba, 0x02, 0x2f, 0xd1, 0x28, 0x98, 0x63, 0x6b,\n  0x99, 0xf8, 0x5d, 0xdc, 0x5d, 0x5b, 0x90, 0xcd, 0xc4, 0x58, 0x16, 0x19,\n  0x13, 0x65, 0xbb, 0x26, 0x31, 0xda, 0x39, 0x28, 0xcb, 0x61, 0x6a, 0xb7,\n  0xfa, 0xb2, 0x37, 0x65, 0xb2, 0x64, 0x7c, 0xb1, 0xaa, 0xaa, 0x2a, 0x67,\n  0x73, 0x68, 0x56, 0xbb, 0x3f, 0x61, 0x33, 0x58, 0xea, 0x5d, 0xfd, 0xd5,\n  0x55, 0xc9, 0xcc, 0xdc, 0xab, 0x97, 0x2f, 0x5f, 0x75, 0x72, 0x96, 0x60,\n  0xd9, 0xda, 0xd4, 0x4a, 0x19, 0xdd, 0x48, 0xa8, 0x52, 0xa6, 0x78, 0xbd,\n  0xc7, 0xe1, 0x72, 0xeb, 0x55, 0x8e, 0x9a, 0x50, 0x53, 0x93, 0x46, 0xd5,\n  0xac, 0xd2, 0xc5, 0x5d, 0x4e, 0x3d, 0x48, 0xda, 0x89, 0x24, 0x8f, 0x57,\n  0x0a, 0x7f, 0xc2, 0x06, 0x61, 0xef, 0x9b, 0xca, 0x46, 0x2d, 0x3d, 0x32,\n  0x56, 0x29, 0x7e, 0x48, 0x65, 0x9c, 0xfc, 0x9f, 0xf3, 0x9f, 0xc9, 0x6c,\n  0x24, 0x00, 0x7c, 0xf7, 0x14, 0xb4, 0x11, 0x6d, 0x45, 0xf3, 0xb3, 0xa3,\n  0x67, 0xad, 0x5a, 0x30, 0xa7, 0xab, 0xa5, 0xae, 0xd2, 0xa5, 0x92, 0x69,\n  0x8c, 0x6a, 0xaa, 0xbd, 0x90, 0x61, 0xca, 0x61, 0x75, 0x5a, 0xa2, 0x91,\n  0xc9, 0x35, 0x13, 0x6a, 0xa5, 0x82, 0xa3, 0x46, 0xbb, 0x71, 0x76, 0x00,\n  0x62, 0x12, 0x47, 0x30, 0xdd, 0xa3, 0x36, 0xef, 0xfc, 0xf3, 0x26, 0xd6,\n  0x9f, 0x3c, 0x3e, 0x32, 0xdc, 0xdf, 0x1b, 0x8b, 0xc5, 0xaa, 0x82, 0x91,\n  0x48, 0xa4, 0x42, 0xaf, 0x08, 0xd4, 0xca, 0x45, 0xca, 0x35, 0xe5, 0x9b,\n  0x05, 0xb1, 0x2f, 0x6c, 0x23, 0x66, 0x03, 0x41, 0x5c, 0x85, 0xa0, 0x57,\n  0x8e, 0x72, 0x21, 0xc1, 0x59, 0x45, 0x53, 0x32, 0x63, 0xbc, 0xf2, 0x23,\n  0x9e, 0xc8, 0x6c, 0xfa, 0xcc, 0xa2, 0x8a, 0xe0, 0x49, 0x69, 0xfa, 0xbd,\n  0x38, 0x9d, 0x3e, 0xa9, 0x22, 0x38, 0x3f, 0xa5, 0xd7, 0x87, 0xfb, 0x1d,\n  0x81, 0xb0, 0xbe, 0xbb, 0xeb, 0x52, 0x43, 0x24, 0xe8, 0x98, 0x1d, 0x09,\n  0xcd, 0xb2, 0x07, 0x42, 0xfa, 0x4b, 0x2e, 0x31, 0x84, 0x2b, 0x1c, 0xb3,\n  0x22, 0xa1, 0x7e, 0x38, 0xd3, 0x5d, 0x7a, 0x89, 0x3e, 0x12, 0xb4, 0xf7,\n  0x85, 0xf5, 0x7f, 0x57, 0xf9, 0xfd, 0x7e, 0x9f, 0x2a, 0x10, 0x8d, 0x56,\n  0x4c, 0xce, 0x55, 0xf9, 0x7d, 0x7e, 0xbf, 0x3a, 0x18, 0x8d, 0x06, 0xf0,\n  0x52, 0x95, 0x8f, 0x5e, 0xaf, 0x80, 0xca, 0xa9, 0x6c, 0x16, 0x8b, 0x4d,\n  0xfc, 0x98, 0xed, 0x09, 0x83, 0x3a, 0xb4, 0xe4, 0xe4, 0xd8, 0x39, 0x67,\n  0x7c, 0x5c, 0x39, 0x7e, 0x52, 0x94, 0x86, 0x47, 0x0b, 0x2d, 0x3e, 0x25,\n  0xf6, 0xf1, 0xc7, 0x95, 0x27, 0x2f, 0x0e, 0xd1, 0xb3, 0xc8, 0x92, 0xf1,\n  0xe2, 0x19, 0x76, 0x87, 0xe7, 0x8f, 0x06, 0x02, 0xa3, 0xf3, 0xc3, 0x0b,\n  0xe7, 0xcf, 0x5f, 0x78, 0x84, 0x63, 0x71, 0x6e, 0x9a, 0xf0, 0x46, 0xce,\n  0x2f, 0xed, 0x71, 0x75, 0xa1, 0x85, 0xd9, 0x79, 0x34, 0xab, 0xab, 0x9c,\n  0x10, 0xa0, 0x61, 0x08, 0x26, 0x1d, 0x28, 0x95, 0x0a, 0x7e, 0xbd, 0x06,\n  0x2b, 0x39, 0x4e, 0xb9, 0x98, 0x2e, 0xa3, 0x72, 0x2b, 0x0c, 0x5a, 0xbd,\n  0x4a, 0x07, 0x94, 0x9a, 0x1b, 0xb5, 0x5a, 0x95, 0x4a, 0x84, 0xac, 0x2e,\n  0x2b, 0x13, 0xfe, 0x94, 0x16, 0x65, 0x99, 0xbc, 0x23, 0x49, 0x80, 0x46,\n  0x90, 0x00, 0x2d, 0xd2, 0x0a, 0x95, 0x98, 0x9d, 0x45, 0xfc, 0x24, 0xd8,\n  0xd9, 0x96, 0xb5, 0x58, 0xbd, 0x6e, 0xc7, 0xbb, 0xb7, 0x5e, 0x7d, 0xf5,\n  0xad, 0xb9, 0xee, 0x5d, 0x78, 0x23, 0xae, 0x49, 0xa7, 0x85, 0xf7, 0xf1,\n  0xca, 0xf4, 0xd2, 0xf4, 0x9a, 0x34, 0x0c, 0xa9, 0xf7, 0xd3, 0xd2, 0x3e,\n  0xe1, 0xb3, 0xc8, 0x12, 0x98, 0x19, 0x36, 0xba, 0x07, 0xc8, 0x66, 0x36,\n  0xf0, 0x32, 0x16, 0x03, 0x93, 0x0d, 0x8b, 0x39, 0x6c, 0x3b, 0xdf, 0x76,\n  0x49, 0xb8, 0x27, 0x5b, 0xcc, 0x66, 0x93, 0x47, 0xa6, 0x70, 0xd7, 0x62,\n  0x20, 0x01, 0x1c, 0x8b, 0xd1, 0x9e, 0xa1, 0xae, 0x2e, 0x62, 0x5a, 0x3a,\n  0x0b, 0x5e, 0xf1, 0xa1, 0x11, 0x6b, 0x77, 0x6b, 0x4d, 0xd0, 0xdb, 0xc6,\n  0xbd, 0x2b, 0xf2, 0x4b, 0x7d, 0x9d, 0x99, 0x85, 0xdf, 0x5e, 0xbe, 0x93,\n  0x7c, 0xd1, 0x96, 0x18, 0x9e, 0xfc, 0x7e, 0x38, 0xeb, 0x0b, 0x8f, 0xd4,\n  0xe3, 0xd7, 0x27, 0xd3, 0xf3, 0x7f, 0x85, 0x3b, 0x48, 0x40, 0x38, 0x8f,\n  0xcd, 0xe7, 0xba, 0xbc, 0x81, 0xd3, 0x93, 0xab, 0xd0, 0x28, 0x5a, 0x46,\n  0x73, 0xc3, 0x2d, 0x9c, 0xdd, 0xaa, 0x64, 0x51, 0xcc, 0x61, 0x8e, 0xce,\n  0x41, 0x30, 0x8d, 0x65, 0xa2, 0xab, 0x86, 0x8c, 0x88, 0x7a, 0x38, 0x56,\n  0x70, 0x20, 0x3c, 0x28, 0xe4, 0x72, 0xc5, 0x38, 0xd0, 0x2b, 0xba, 0x66,\n  0xa6, 0x90, 0xcf, 0x3b, 0x65, 0x69, 0x5d, 0x75, 0x75, 0x24, 0x56, 0xcf,\n  0x2b, 0xbc, 0xb5, 0x16, 0x07, 0x63, 0xbd, 0x14, 0xb7, 0x02, 0x73, 0x67,\n  0x99, 0x3a, 0x4a, 0x1e, 0xe7, 0xa2, 0x28, 0xc0, 0x3c, 0xb8, 0x89, 0xb8,\n  0xf3, 0x8e, 0x67, 0x6e, 0xde, 0xe1, 0x32, 0xb1, 0xa1, 0x8b, 0x58, 0xc4,\n  0x8d, 0x27, 0x6c, 0x5d, 0x29, 0x9e, 0xfe, 0xd4, 0x58, 0x9d, 0xb0, 0xeb,\n  0xb4, 0x55, 0x4b, 0xab, 0xe6, 0xef, 0x8c, 0x75, 0x2f, 0xa8, 0x8e, 0x0c,\n  0x6c, 0xe8, 0x9f, 0xbf, 0xac, 0x36, 0xea, 0xf4, 0xd7, 0xb8, 0xb9, 0x6c,\n  0x55, 0x22, 0x57, 0x65, 0x51, 0x28, 0xec, 0x0d, 0xb1, 0x86, 0x89, 0x54,\n  0xd3, 0xd2, 0xa8, 0x3d, 0xd5, 0x14, 0xe8, 0x4d, 0x37, 0x8f, 0x36, 0x44,\n  0x3c, 0xae, 0x60, 0x75, 0x67, 0x36, 0x14, 0x49, 0x7b, 0xed, 0xce, 0xca,\n  0xb4, 0xc3, 0xe1, 0x26, 0x57, 0xd9, 0x2b, 0xc7, 0x56, 0xf5, 0x78, 0x53,\n  0xee, 0xf4, 0xb2, 0xd0, 0x40, 0x47, 0xef, 0x99, 0xb9, 0xcc, 0xa6, 0x65,\n  0x2d, 0x0b, 0x7a, 0xe3, 0x69, 0x8f, 0xa3, 0xc2, 0xc3, 0xa9, 0x34, 0xd5,\n  0xd5, 0xc9, 0xb1, 0x05, 0x39, 0x8d, 0x3e, 0xd3, 0x5e, 0x93, 0xae, 0xab,\n  0x5a, 0x93, 0xae, 0x1c, 0x9c, 0x3d, 0x18, 0xcb, 0xce, 0x6f, 0x5a, 0x98,\n  0x8a, 0x9f, 0xd6, 0x54, 0xbb, 0x2c, 0xd9, 0xb1, 0x76, 0x2c, 0x33, 0x89,\n  0xab, 0x47, 0xe7, 0xd5, 0xd6, 0x2e, 0x08, 0x37, 0xe6, 0xc2, 0x21, 0x84,\n  0xf3, 0x37, 0xa2, 0xfd, 0xe8, 0x6f, 0xf8, 0x72, 0x64, 0x44, 0x29, 0xe6,\n  0x11, 0x5c, 0xa3, 0x67, 0x31, 0xfe, 0x75, 0x2c, 0x6a, 0xaa, 0xb8, 0x51,\n  0x49, 0xa2, 0x7a, 0x6c, 0x9d, 0x60, 0x1e, 0x46, 0x1a, 0x15, 0x32, 0x62,\n  0x60, 0xf1, 0x76, 0xe6, 0x05, 0x4c, 0xc3, 0x07, 0xf0, 0xb1, 0x4c, 0x71,\n  0x1b, 0x83, 0xe2, 0x8a, 0xaa, 0x1e, 0xdb, 0x6a, 0xf3, 0x53, 0x26, 0x9d,\n  0xdf, 0x66, 0xad, 0xb1, 0x98, 0x9d, 0x1d, 0xfb, 0x5b, 0x06, 0x5c, 0x7d,\n  0x0d, 0x1d, 0x75, 0x21, 0x83, 0x36, 0x67, 0x64, 0xee, 0x72, 0x20, 0xeb,\n  0xe3, 0xb7, 0xc9, 0x13, 0xc0, 0xf4, 0xaa, 0xb2, 0x51, 0x39, 0xdd, 0xeb,\n  0x33, 0xcc, 0x3c, 0x94, 0xd8, 0x26, 0xf3, 0xf2, 0x9c, 0x4c, 0x4a, 0xa4,\n  0x34, 0x9b, 0x4c, 0x34, 0x27, 0x53, 0x90, 0x03, 0xca, 0x61, 0xa1, 0x5b,\n  0x04, 0x6f, 0xf8, 0xd6, 0x95, 0x5f, 0xbf, 0x3e, 0x47, 0xce, 0xcc, 0x09,\n  0xf5, 0xf8, 0xdd, 0xc9, 0xb1, 0x72, 0x78, 0x2a, 0x3a, 0x0e, 0x15, 0x40,\n  0xac, 0x8f, 0x08, 0x50, 0x85, 0x54, 0x66, 0x93, 0x99, 0x01, 0x34, 0xc5,\n  0x00, 0x22, 0x0d, 0xa1, 0x8b, 0x6f, 0xd8, 0x7f, 0xfb, 0xe3, 0x37, 0xe7,\n  0xf0, 0x6b, 0xc0, 0x38, 0x6f, 0x9e, 0x1c, 0x3b, 0x51, 0x78, 0xa9, 0x12,\n  0x86, 0xdf, 0xb8, 0x0a, 0x30, 0x7c, 0x03, 0x3f, 0x90, 0x13, 0x9e, 0xc1,\n  0x43, 0x14, 0xc5, 0x13, 0xc6, 0x91, 0x2b, 0xe2, 0xf8, 0xf4, 0x75, 0x14,\n  0xc7, 0xd5, 0x58, 0x9b, 0xfb, 0xe0, 0x83, 0x49, 0x29, 0xb7, 0x14, 0x8d,\n  0x47, 0xd4, 0x0c, 0x30, 0x15, 0xd4, 0x3f, 0x99, 0x25, 0x3c, 0x61, 0x4e,\n  0x1f, 0x73, 0x8a, 0xab, 0x11, 0xb1, 0x42, 0x8c, 0x5f, 0x2b, 0x4b, 0x9d,\n  0xc5, 0x65, 0x28, 0x7e, 0x9f, 0x7e, 0xd8, 0x7d, 0x57, 0x2f, 0xd9, 0x63,\n  0x17, 0x2a, 0xf0, 0xc7, 0x62, 0xfb, 0xe9, 0x8b, 0xfd, 0x11, 0xc8, 0x7a,\n  0x95, 0x34, 0x2e, 0x58, 0x39, 0x20, 0xc4, 0xe0, 0x98, 0xac, 0x34, 0x1b,\n  0x0b, 0x05, 0x41, 0x19, 0x96, 0xe9, 0xd3, 0x8f, 0x3b, 0x1f, 0xd8, 0x9b,\n  0xcb, 0x91, 0x3b, 0x1d, 0x22, 0x18, 0xfc, 0xb1, 0x94, 0xe7, 0x85, 0xc2,\n  0xe1, 0x69, 0x24, 0x67, 0x8c, 0xcb, 0xb7, 0x45, 0x30, 0x7f, 0x69, 0x29,\n  0x8f, 0x10, 0xa5, 0x40, 0x16, 0x99, 0x04, 0x8d, 0x12, 0x9c, 0xff, 0x3c,\n  0xd4, 0xfd, 0xdd, 0x73, 0x72, 0x80, 0xd2, 0xe4, 0xcd, 0xe4, 0x4c, 0xa9,\n  0xbd, 0x34, 0xc5, 0xf6, 0xf2, 0x65, 0xdd, 0x2a, 0x3a, 0xad, 0xe5, 0xc5,\n  0xd0, 0xc3, 0x12, 0x46, 0xb6, 0x22, 0x46, 0x29, 0x86, 0xd2, 0xaf, 0xba,\n  0x1e, 0xb9, 0x07, 0x50, 0xda, 0xed, 0x10, 0x1c, 0xf8, 0x2b, 0xdd, 0x80,\n  0xd3, 0x13, 0x54, 0xa7, 0x2a, 0xc2, 0xf1, 0x66, 0x81, 0xb1, 0x71, 0xd4,\n  0x9c, 0x7e, 0x04, 0x30, 0x19, 0x9a, 0xc2, 0x36, 0xf5, 0xe9, 0xa1, 0xae,\n  0x67, 0xb7, 0x01, 0x98, 0x3d, 0xb6, 0xc9, 0x37, 0x2f, 0xc4, 0x2f, 0x4c,\n  0x8e, 0x89, 0xb1, 0x94, 0x8f, 0x03, 0x8e, 0x84, 0xce, 0xa1, 0xae, 0x07,\n  0x6e, 0x11, 0xe1, 0x08, 0xb8, 0x09, 0x46, 0x2a, 0xce, 0x16, 0xd6, 0x28,\n  0x9b, 0x0b, 0x6d, 0x24, 0x23, 0x62, 0x5b, 0x73, 0x87, 0x77, 0x1a, 0x34,\n  0x92, 0x4d, 0xcc, 0x77, 0xc6, 0x62, 0x08, 0x9a, 0x3e, 0x7d, 0xb3, 0x6e,\n  0x6f, 0x2f, 0x7e, 0xed, 0x85, 0xe6, 0x9b, 0x6e, 0x62, 0x63, 0xb4, 0xb2,\n  0xd8, 0x67, 0xe1, 0x6c, 0x85, 0x7c, 0x6a, 0xfb, 0x94, 0xa0, 0xc0, 0x04,\n  0xb2, 0x53, 0x28, 0x41, 0x13, 0x9d, 0xa3, 0x19, 0x3a, 0x90, 0xf6, 0xbe,\n  0x5e, 0x7f, 0xd7, 0xde, 0x1c, 0x59, 0x74, 0xfb, 0x4b, 0x8d, 0x37, 0xdf,\n  0x2e, 0xf6, 0x7f, 0xa8, 0x08, 0x0b, 0xc6, 0x11, 0xf0, 0x98, 0x23, 0xa0,\n  0x54, 0x04, 0xc6, 0x01, 0x2c, 0x71, 0xa4, 0x3f, 0xfa, 0x9d, 0xba, 0x77,\n  0xce, 0xcc, 0xe1, 0xef, 0x3d, 0x1f, 0xff, 0x9e, 0xf0, 0x1e, 0xfe, 0x93,\n  0xd4, 0x77, 0x55, 0xc5, 0xb6, 0x1a, 0x7e, 0x56, 0x74, 0xf3, 0x1a, 0x16,\n  0xd7, 0xc9, 0xec, 0xc5, 0xa4, 0x21, 0x53, 0xb2, 0xaf, 0x79, 0xa6, 0x6c,\n  0x1e, 0x2e, 0x5e, 0x16, 0x7d, 0xa1, 0x61, 0x3a, 0x98, 0x2c, 0x22, 0x0d,\n  0x30, 0x85, 0xa1, 0xe0, 0x04, 0x9b, 0x0e, 0x4f, 0x3d, 0xdd, 0xb4, 0xf7,\n  0xf6, 0x1c, 0x3e, 0xf0, 0xf5, 0xc6, 0xbd, 0x0f, 0x4e, 0x69, 0x0f, 0x15,\n  0x6d, 0x57, 0x85, 0x34, 0x86, 0x65, 0x87, 0x57, 0x02, 0xc0, 0x39, 0x58,\n  0x25, 0x52, 0xb4, 0x16, 0x0e, 0x93, 0xd8, 0x24, 0x55, 0xef, 0x9d, 0x96,\n  0x3b, 0x07, 0x0f, 0xbd, 0x94, 0xfc, 0xfe, 0xaf, 0xf0, 0xfe, 0x29, 0xf0,\n  0x58, 0xdc, 0x6b, 0xb6, 0xc7, 0x7b, 0x86, 0xe6, 0x2d, 0x74, 0x52, 0xd0,\n  0x84, 0x33, 0x98, 0x81, 0x12, 0x76, 0x37, 0xe0, 0xb6, 0x1c, 0xf6, 0xe3,\n  0xe5, 0x0d, 0xc2, 0x21, 0x1c, 0x17, 0xdb, 0xd7, 0x7c, 0xbc, 0x7d, 0x9e,\n  0x92, 0x66, 0xea, 0x47, 0x1d, 0x7b, 0x7b, 0xcf, 0x27, 0x41, 0xa7, 0xb0,\n  0x15, 0x5f, 0x2d, 0xb5, 0xad, 0xb9, 0xd8, 0x57, 0x95, 0xd9, 0xb0, 0xbc,\n  0x80, 0x97, 0xec, 0x28, 0xbd, 0x65, 0xe2, 0xc4, 0x49, 0x0b, 0xf5, 0x04,\n  0x78, 0xd0, 0xf5, 0x48, 0xd8, 0x4a, 0x2a, 0xca, 0x61, 0x3a, 0x8a, 0x30,\n  0x2b, 0xb2, 0x3e, 0xa9, 0xff, 0x8f, 0x04, 0x2d, 0x06, 0xc0, 0xa4, 0x56,\n  0xfb, 0x51, 0xd7, 0x0f, 0x37, 0xe4, 0xf6, 0xe2, 0xbf, 0x7a, 0x04, 0xfb,\n  0x04, 0x59, 0x30, 0x0d, 0x3f, 0x15, 0xdd, 0x19, 0x4d, 0x03, 0xaa, 0x88,\n  0xe3, 0xf2, 0x68, 0x3d, 0x21, 0x22, 0xc8, 0xba, 0xf5, 0xae, 0x5f, 0x74,\n  0x3d, 0x02, 0xdd, 0xfa, 0x5d, 0xe1, 0x20, 0xe1, 0xdd, 0xc2, 0x25, 0xb8,\n  0x6e, 0x71, 0x81, 0xd6, 0x59, 0x8a, 0x70, 0xeb, 0xb3, 0x35, 0x1c, 0x8d,\n  0x0c, 0x00, 0x30, 0xc9, 0x9c, 0x99, 0xc6, 0xcd, 0xd4, 0x41, 0x93, 0x0a,\n  0x4b, 0x54, 0x06, 0xdf, 0xf0, 0xe4, 0xc1, 0xf6, 0x17, 0xbf, 0x94, 0x7b,\n  0x10, 0xff, 0xc5, 0x49, 0x43, 0xb8, 0x96, 0xfa, 0xe6, 0x78, 0xf1, 0xe5,\n  0x25, 0x62, 0x81, 0x6f, 0x78, 0xe0, 0xc7, 0x1d, 0xcf, 0xec, 0xcc, 0xe1,\n  0xc8, 0x3e, 0xe2, 0x74, 0x0a, 0x83, 0x3b, 0x70, 0x33, 0x1b, 0x3b, 0xf6,\n  0xe3, 0x9e, 0xe3, 0x52, 0x7f, 0x7f, 0xd0, 0x02, 0x73, 0x3c, 0x82, 0x27,\n  0xc2, 0xc2, 0xdf, 0xb0, 0x5a, 0xc4, 0xcf, 0xfd, 0x2f, 0xf4, 0xf7, 0xfd,\n  0xef, 0x24, 0x69, 0x7f, 0x37, 0x0a, 0x7f, 0xc6, 0x13, 0x95, 0x05, 0x90,\n  0x74, 0x9d, 0x51, 0x82, 0x79, 0x8c, 0x7c, 0x23, 0x58, 0x1c, 0xdc, 0xb7,\n  0xb5, 0xe1, 0xe6, 0x1c, 0xd9, 0x15, 0x9c, 0xfc, 0x90, 0x54, 0x4a, 0xb0,\n  0xdc, 0x27, 0xda, 0x7e, 0x29, 0x09, 0xc3, 0xaf, 0xde, 0x0a, 0xf4, 0x63,\n  0x1f, 0x9e, 0x88, 0x0a, 0x1f, 0xdf, 0x72, 0xbd, 0x58, 0x67, 0xfb, 0x71,\n  0xcf, 0xe5, 0xd2, 0xa8, 0x7c, 0xec, 0x8d, 0xb6, 0xef, 0x5e, 0x90, 0xbb,\n  0xf2, 0x31, 0xbc, 0x2c, 0x24, 0x7c, 0xe5, 0x02, 0xfc, 0x1f, 0x85, 0xf1,\n  0x13, 0x3b, 0xd1, 0xf1, 0x63, 0x2a, 0x8d, 0x9f, 0x47, 0x5e, 0x6e, 0x79,\n  0xfc, 0xf2, 0x1c, 0x1e, 0xc0, 0xb3, 0xc2, 0xa0, 0xe3, 0x57, 0xb1, 0xbe,\n  0x2e, 0xf1, 0x60, 0x77, 0xd6, 0xa1, 0xc0, 0x64, 0x3a, 0x57, 0x30, 0x33,\n  0xae, 0x10, 0x63, 0x4c, 0x73, 0x41, 0xf7, 0x87, 0xbd, 0xbd, 0x76, 0xb2,\n  0x87, 0xb1, 0xcb, 0x29, 0xfc, 0x12, 0x78, 0x1c, 0x66, 0x38, 0x51, 0x56,\n  0x89, 0x11, 0x59, 0x2f, 0xbd, 0x6d, 0x32, 0x73, 0x34, 0x21, 0xa5, 0xf8,\n  0x7a, 0xf8, 0xa4, 0xee, 0x43, 0xbf, 0xce, 0x9d, 0xc3, 0x00, 0x90, 0x33,\n  0x8f, 0x8f, 0x6f, 0xc7, 0x2c, 0x74, 0x80, 0x85, 0xb9, 0xa1, 0xce, 0x8f,\n  0x81, 0x6d, 0xef, 0x75, 0x90, 0x3b, 0xcb, 0xf8, 0x76, 0xa9, 0x0f, 0x61,\n  0xfe, 0xab, 0x94, 0x12, 0x6f, 0x3b, 0x12, 0x20, 0x96, 0x76, 0xc0, 0x14,\n  0x5b, 0xd2, 0x75, 0x08, 0x20, 0x6d, 0x03, 0x6c, 0x76, 0xef, 0x06, 0x38,\n  0x2f, 0x5c, 0x88, 0xa6, 0xf1, 0x6d, 0x3a, 0x1e, 0x8a, 0x7c, 0x49, 0x7e,\n  0x54, 0x4a, 0xcc, 0x89, 0xe8, 0xc1, 0xfc, 0xdf, 0xdf, 0xf5, 0xab, 0xbd,\n  0xb9, 0xb3, 0xf1, 0x65, 0x82, 0xd1, 0x41, 0x76, 0x0b, 0xe7, 0xe3, 0x6b,\n  0x0a, 0xfd, 0x77, 0x7c, 0x38, 0xb2, 0xca, 0x16, 0x70, 0xdc, 0x05, 0x38,\n  0x52, 0xdd, 0x17, 0xb0, 0xf4, 0xff, 0x69, 0xaa, 0xfc, 0xd9, 0x90, 0xad,\n  0xe5, 0x25, 0x39, 0x05, 0x93, 0x15, 0x80, 0x2d, 0xc8, 0x28, 0x74, 0x5f,\n  0x7b, 0xe1, 0x98, 0x48, 0x33, 0xcb, 0x24, 0x4a, 0xa1, 0xc0, 0x7b, 0x58,\n  0x4f, 0x70, 0x23, 0x57, 0x7e, 0x2b, 0x97, 0xa3, 0x52, 0x28, 0xc0, 0x7c,\n  0x57, 0xa8, 0x9f, 0x22, 0xdf, 0x35, 0x66, 0xeb, 0x94, 0x1c, 0xf9, 0x67,\n  0x40, 0xe9, 0x08, 0x33, 0x17, 0x81, 0xa6, 0x44, 0xa8, 0xdb, 0x5f, 0x60,\n  0x50, 0x95, 0xeb, 0x00, 0xec, 0xb5, 0xc2, 0x16, 0xf4, 0xaf, 0xc2, 0x15,\n  0x25, 0x1a, 0x7e, 0xe4, 0xf6, 0xfd, 0xb9, 0xdc, 0xcd, 0xb9, 0xfd, 0xf8,\n  0xb5, 0xc9, 0x31, 0x96, 0x72, 0xf5, 0xdf, 0x85, 0xef, 0xce, 0x67, 0x72,\n  0xb9, 0xeb, 0x72, 0x78, 0xf3, 0x24, 0xe0, 0xeb, 0x11, 0x7e, 0x3d, 0x95,\n  0xd7, 0x79, 0xb2, 0x4e, 0x5e, 0xa2, 0x7d, 0xe5, 0x5d, 0x64, 0x91, 0xba,\n  0x88, 0x81, 0x18, 0xe9, 0xf8, 0xa8, 0xb7, 0xd7, 0x49, 0xe6, 0x0f, 0x00,\n  0x80, 0xa7, 0xa6, 0xf1, 0x22, 0x98, 0x4f, 0xfc, 0xe1, 0xf3, 0xa9, 0xf0,\n  0x7a, 0x86, 0xbe, 0xce, 0x2f, 0xea, 0xfa, 0x11, 0x74, 0xf0, 0x06, 0x0f,\n  0xfe, 0xeb, 0x5e, 0x98, 0x13, 0x0b, 0x26, 0xd0, 0x34, 0x1e, 0x09, 0xb2,\n  0x9a, 0x72, 0x0a, 0xef, 0x9e, 0x71, 0x52, 0x00, 0x16, 0x74, 0x52, 0x38,\n  0x49, 0x05, 0x70, 0x46, 0x04, 0xa8, 0x5c, 0x3d, 0x9d, 0xe7, 0xf4, 0x3e,\n  0x43, 0xf3, 0xc8, 0x61, 0x29, 0x6c, 0x81, 0xad, 0x90, 0x45, 0xa4, 0x6a,\n  0x6e, 0x61, 0x63, 0x57, 0x8c, 0xfa, 0xda, 0x58, 0x24, 0x53, 0xfc, 0xfa,\n  0xb2, 0xab, 0xe3, 0xcf, 0x52, 0x0b, 0x3c, 0x4d, 0x9f, 0x45, 0x67, 0x31,\n  0xab, 0x74, 0x78, 0xa4, 0xfd, 0xbd, 0x87, 0x72, 0xb9, 0xf3, 0x9d, 0xc4,\n  0x08, 0x1c, 0x18, 0xff, 0x66, 0x1a, 0xdf, 0xa4, 0xf2, 0xae, 0x72, 0x26,\n  0x79, 0x77, 0x0a, 0xd2, 0x29, 0x6e, 0xac, 0xeb, 0x37, 0xb7, 0xe7, 0x72,\n  0x37, 0xb9, 0x89, 0x45, 0x78, 0x9d, 0xca, 0xa9, 0xab, 0x70, 0xfd, 0xf1,\n  0xc1, 0x71, 0x88, 0x93, 0x64, 0xa4, 0xe3, 0xc7, 0x0f, 0xe4, 0x72, 0x3b,\n  0x9d, 0xc4, 0xb9, 0x0f, 0x47, 0x00, 0x9f, 0xe6, 0x1d, 0x53, 0xe5, 0xd4,\n  0xa3, 0xf7, 0xa3, 0x38, 0xc4, 0x46, 0xea, 0xde, 0xec, 0xed, 0x6d, 0x7e,\n  0x81, 0x0e, 0xb0, 0x9b, 0xc4, 0xb6, 0x0b, 0x1d, 0x5b, 0x3f, 0x66, 0xa4,\n  0xf9, 0x54, 0xf7, 0x9d, 0x47, 0x73, 0xb9, 0x33, 0xe3, 0xcf, 0xe3, 0xef,\n  0x01, 0x06, 0x7f, 0x12, 0xde, 0x43, 0xe8, 0xf8, 0x65, 0x5c, 0xa6, 0x87,\n  0x8a, 0xa2, 0xc9, 0x5d, 0xf5, 0xaf, 0xef, 0xcd, 0xdd, 0x7e, 0x73, 0xe3,\n  0x4b, 0xb7, 0x93, 0x45, 0x22, 0x4f, 0x29, 0xc9, 0x87, 0x50, 0x9f, 0x02,\n  0xad, 0x9c, 0xa1, 0x55, 0x32, 0xe2, 0xc0, 0xe4, 0x47, 0xaa, 0x00, 0x42,\n  0xee, 0xb4, 0xe4, 0x4b, 0x78, 0xe8, 0x1c, 0x40, 0x69, 0xff, 0xaf, 0xa6,\n  0xc8, 0xb5, 0x35, 0xd9, 0x18, 0xa0, 0xc3, 0x74, 0xb8, 0x63, 0x10, 0x40,\n  0x58, 0xae, 0x62, 0x8a, 0xd7, 0xed, 0x7b, 0x9b, 0x9e, 0x7e, 0x2a, 0xf7,\n  0xf0, 0xfd, 0x8d, 0xcf, 0xe0, 0xef, 0x4b, 0xfc, 0xf3, 0x78, 0xe5, 0xcc,\n  0x98, 0xc4, 0x8a, 0xbf, 0xd7, 0x80, 0x37, 0xe4, 0x70, 0x5c, 0x38, 0xd4,\n  0x80, 0x97, 0x63, 0x7f, 0x89, 0x6f, 0x1e, 0xd3, 0xdc, 0x63, 0x1d, 0x3f,\n  0xd2, 0xf2, 0x41, 0x6f, 0x6f, 0x18, 0x4f, 0xb0, 0x4e, 0x57, 0x4f, 0x95,\n  0x0b, 0x8e, 0xca, 0xcb, 0x30, 0x7d, 0x7b, 0x59, 0x1b, 0x3e, 0x2d, 0x97,\n  0x0b, 0x92, 0x5d, 0x30, 0xef, 0x2a, 0xa7, 0xc8, 0x29, 0xc7, 0x38, 0xe7,\n  0x92, 0xef, 0xdc, 0x0f, 0x73, 0xae, 0x12, 0x4f, 0x08, 0x7f, 0x26, 0x8d,\n  0x22, 0x06, 0x53, 0x79, 0xff, 0xd1, 0xfb, 0x89, 0x09, 0x10, 0xd0, 0x4f,\n  0x63, 0x6d, 0x6f, 0x3c, 0x96, 0xcb, 0x5d, 0x10, 0xc2, 0xcb, 0x1e, 0xbb,\n  0x12, 0xa0, 0xfc, 0xc7, 0x05, 0x53, 0x78, 0xc5, 0xb1, 0xcd, 0x81, 0x54,\n  0x4c, 0xc4, 0xe6, 0xd6, 0x28, 0x9e, 0xd8, 0x47, 0x47, 0xe0, 0xf5, 0xb7,\n  0x4c, 0x93, 0x19, 0x60, 0xfc, 0x89, 0x04, 0x60, 0x86, 0x19, 0x5e, 0x3e,\n  0xbf, 0x59, 0xc3, 0x86, 0x57, 0xb4, 0xbc, 0xfc, 0x48, 0x2e, 0x77, 0x79,\n  0x18, 0xaf, 0xa5, 0x42, 0x02, 0x1e, 0x60, 0x3e, 0xb4, 0x45, 0x39, 0x21,\n  0x98, 0xf5, 0x73, 0xe5, 0x7d, 0x33, 0x83, 0xa2, 0x6e, 0x62, 0x23, 0xe6,\n  0xd3, 0xbb, 0x1a, 0x0e, 0xf4, 0x92, 0x05, 0x37, 0x24, 0x9e, 0x97, 0xc6,\n  0x4a, 0xac, 0x38, 0x56, 0x40, 0x6e, 0xa3, 0xb4, 0x59, 0x1a, 0x7f, 0xd0,\n  0x51, 0xeb, 0xa7, 0xa8, 0xd7, 0x16, 0x96, 0x8a, 0x11, 0x44, 0x17, 0x06,\n  0x07, 0xc6, 0x1d, 0x8c, 0xb8, 0xff, 0x21, 0x67, 0xde, 0xd7, 0xf4, 0x75,\n  0x26, 0xb3, 0x34, 0x1c, 0xb7, 0x4c, 0xc9, 0x01, 0x20, 0x91, 0x43, 0x3f,\n  0x73, 0x65, 0xec, 0xc0, 0x1d, 0x39, 0x92, 0xd9, 0x1c, 0x7f, 0x5e, 0xa8,\n  0xc1, 0xef, 0x33, 0x78, 0xd1, 0xe3, 0xe7, 0xf9, 0x26, 0x36, 0x59, 0x99,\n  0x0c, 0x78, 0xdf, 0x5d, 0xf5, 0x07, 0xf6, 0xe6, 0xf0, 0x4b, 0x77, 0xec,\n  0x8a, 0x3f, 0x7f, 0xfb, 0xed, 0x05, 0x7e, 0x1f, 0x3d, 0x11, 0x39, 0xa2,\n  0x88, 0xe5, 0x37, 0x77, 0x54, 0x1f, 0xa0, 0x72, 0xc4, 0x1b, 0x5b, 0x13,\n  0xcf, 0x0b, 0xe7, 0x60, 0x49, 0xae, 0x3c, 0x11, 0x3c, 0x4b, 0x30, 0x9f,\n  0xd8, 0x55, 0x43, 0xf1, 0xd4, 0xe3, 0xd6, 0x2b, 0x00, 0xe8, 0x6f, 0xb1,\n  0x8b, 0xd5, 0xdd, 0x7d, 0x3c, 0xfd, 0x2a, 0x89, 0xf9, 0x87, 0xba, 0x6e,\n  0xef, 0x25, 0x5b, 0xec, 0xc2, 0x2c, 0xfc, 0xd3, 0x22, 0x8c, 0x63, 0x99,\n  0x3b, 0x45, 0xe3, 0xcb, 0xa1, 0xce, 0x3b, 0xa8, 0xf1, 0xe5, 0x3c, 0xa7,\n  0xd0, 0x2b, 0x09, 0x71, 0x53, 0x64, 0xa4, 0xe3, 0xb5, 0xbf, 0x00, 0x42,\n  0x07, 0xce, 0xc8, 0x01, 0x46, 0x93, 0xcf, 0x16, 0xed, 0x2f, 0xee, 0xe3,\n  0xb7, 0xbf, 0x1c, 0xea, 0xdc, 0x73, 0x8f, 0x88, 0x55, 0xeb, 0xbf, 0xc1,\n  0xfe, 0x02, 0xd8, 0xfc, 0xf7, 0x8c, 0xf6, 0x97, 0x63, 0xc7, 0x47, 0x34,\n  0xc0, 0x40, 0x43, 0x07, 0x0b, 0x06, 0x98, 0x72, 0xd9, 0x6f, 0xe8, 0x19,\n  0x51, 0xe4, 0x16, 0x79, 0xfa, 0x89, 0x98, 0x26, 0x98, 0x60, 0x28, 0x59,\n  0xea, 0xf8, 0x30, 0x88, 0x5b, 0x74, 0x98, 0x5c, 0xf2, 0x9d, 0x87, 0xf6,\n  0xe4, 0xc8, 0xc2, 0x33, 0x73, 0x57, 0x4f, 0xb1, 0x25, 0xd2, 0xf2, 0x44,\n  0x53, 0xe7, 0xbf, 0x54, 0xde, 0xe1, 0xe6, 0xd0, 0x87, 0xf6, 0x1c, 0xdc,\n  0x92, 0xc3, 0xbf, 0xc9, 0x09, 0x8f, 0x88, 0xe6, 0xbc, 0x29, 0xb2, 0xdd,\n  0xf0, 0xb3, 0x92, 0xa9, 0xf1, 0xc4, 0x0b, 0x9d, 0xd9, 0xc4, 0xf9, 0xd8,\n  0x2d, 0x2f, 0x6c, 0xcf, 0xdd, 0x81, 0x47, 0x73, 0x42, 0xbe, 0x24, 0xa3,\n  0xff, 0xdf, 0x2a, 0x57, 0x34, 0xd5, 0xb2, 0x72, 0x1f, 0xbf, 0x99, 0xea,\n  0x8b, 0xf5, 0xdf, 0xc8, 0xdd, 0x85, 0xc3, 0xac, 0x7d, 0x03, 0x45, 0x9e,\n  0x77, 0x0c, 0xfc, 0xb3, 0x68, 0x58, 0xf9, 0x41, 0xdb, 0x6d, 0xbd, 0xb7,\n  0xe0, 0x3b, 0xfc, 0xc2, 0x47, 0xf8, 0x3a, 0x91, 0x36, 0x38, 0x8e, 0xd3,\n  0x9e, 0x56, 0x32, 0xaa, 0xfc, 0xa8, 0x75, 0xf7, 0x43, 0x39, 0x42, 0x84,\n  0x8b, 0xf1, 0x43, 0x61, 0xe1, 0x5d, 0x2c, 0xd9, 0xd4, 0x02, 0x45, 0x78,\n  0x34, 0xf7, 0x1a, 0x5d, 0x39, 0x3d, 0x26, 0xa3, 0xca, 0xfd, 0x6f, 0xb5,\n  0xbd, 0x7e, 0x06, 0x34, 0xec, 0x2d, 0x7e, 0x61, 0xeb, 0xa9, 0xa2, 0x51,\n  0x05, 0xb3, 0xdc, 0x92, 0x62, 0xbb, 0x02, 0xdd, 0x57, 0x30, 0xe4, 0x14,\n  0x33, 0x80, 0x9b, 0xc9, 0xa0, 0xb2, 0xf7, 0x9d, 0xd6, 0x3b, 0x81, 0x68,\n  0xbd, 0x26, 0xbc, 0x82, 0xf7, 0x84, 0x40, 0x69, 0xcd, 0x2e, 0x91, 0xc6,\n  0x48, 0x60, 0x9a, 0x2c, 0xc3, 0x94, 0xcf, 0xe3, 0x31, 0xa6, 0xec, 0xff,\n  0x6e, 0xdb, 0xd7, 0xaf, 0xc8, 0x3d, 0x8c, 0xbf, 0xe4, 0x17, 0xee, 0x63,\n  0xd2, 0x4c, 0x39, 0xcc, 0x63, 0xc4, 0xb3, 0x64, 0x48, 0xb9, 0xeb, 0x50,\n  0xdb, 0xfe, 0x9d, 0x20, 0xcf, 0xec, 0xc7, 0xf7, 0xfb, 0x85, 0xa7, 0xee,\n  0xc4, 0xbe, 0x72, 0x3e, 0x70, 0xec, 0xfd, 0x6b, 0x12, 0x25, 0xc0, 0x4f,\n  0x0f, 0x34, 0xdc, 0xd5, 0x8b, 0x6b, 0x0f, 0x34, 0xdf, 0x85, 0x2b, 0xa7,\n  0xf1, 0xce, 0x63, 0xee, 0x5f, 0x6a, 0xe3, 0x64, 0x2d, 0xf8, 0xfd, 0xc6,\n  0xeb, 0xbe, 0x4a, 0x8d, 0x28, 0x7f, 0x7a, 0xa3, 0x69, 0x17, 0x95, 0x95,\n  0xa6, 0xf2, 0xa7, 0x63, 0xea, 0xdf, 0x32, 0x53, 0xe3, 0x81, 0xfa, 0x77,\n  0x36, 0x42, 0x3d, 0x5f, 0x6f, 0x7e, 0xe7, 0x00, 0xa9, 0x90, 0x70, 0x8b,\n  0x1e, 0x77, 0xbb, 0x51, 0x63, 0xae, 0xd8, 0xbf, 0x07, 0x1a, 0xf7, 0x40,\n  0xff, 0xbe, 0x05, 0xbf, 0x77, 0x7e, 0x79, 0xfb, 0x34, 0x78, 0xc7, 0x26,\n  0x53, 0xa6, 0x8a, 0xe6, 0x9d, 0x3b, 0x1a, 0x70, 0x7b, 0xee, 0x46, 0x3c,\n  0xd1, 0x2c, 0x7c, 0x17, 0xbf, 0x2a, 0xc1, 0x0a, 0x9d, 0xd0, 0x38, 0x11,\n  0x2d, 0xb5, 0x0c, 0xea, 0xeb, 0xfb, 0x9a, 0x6e, 0xde, 0x9f, 0xc3, 0x03,\n  0xcf, 0xd6, 0xdf, 0xc7, 0x4c, 0x26, 0x65, 0xba, 0xc5, 0xb1, 0xc9, 0x42,\n  0x1c, 0x95, 0xab, 0x3e, 0xbd, 0xb1, 0xe3, 0xcd, 0x5e, 0x98, 0x64, 0x0f,\n  0x3a, 0x99, 0x95, 0xb9, 0x24, 0xab, 0x1e, 0xbb, 0x2c, 0xc4, 0xe0, 0xe0,\n  0x1b, 0xce, 0xfd, 0x56, 0xfb, 0xeb, 0xbf, 0x26, 0x67, 0x0a, 0xad, 0xce,\n  0xa2, 0xbd, 0x3a, 0x74, 0xfc, 0xf2, 0x50, 0xd1, 0x62, 0xf1, 0xd0, 0xb5,\n  0x1d, 0x6f, 0x42, 0x07, 0xfc, 0x45, 0x78, 0x1a, 0xe0, 0x15, 0x96, 0x54,\n  0xa6, 0xb4, 0xdb, 0x71, 0xc8, 0x44, 0x9c, 0x68, 0x5d, 0xc1, 0x37, 0xec,\n  0x7c, 0xb0, 0xe3, 0xc0, 0x03, 0x39, 0xfc, 0xd4, 0x76, 0x61, 0x13, 0x80,\n  0xdd, 0xb7, 0xaf, 0xdc, 0x4e, 0xff, 0xe4, 0x09, 0xda, 0x56, 0xee, 0xbf,\n  0x81, 0x62, 0x3a, 0x17, 0x3f, 0x21, 0xec, 0x77, 0xe2, 0x3f, 0x0b, 0x27,\n  0xe3, 0x7d, 0x85, 0xb1, 0x7c, 0xa2, 0xb8, 0x8a, 0x70, 0x6f, 0xbb, 0x8b,\n  0xb5, 0x40, 0xcd, 0x5f, 0x84, 0x6b, 0x69, 0x13, 0xfc, 0x1d, 0x2b, 0xca,\n  0x6d, 0x6e, 0xc7, 0xdc, 0xcf, 0xd2, 0xcc, 0xfd, 0x7e, 0xfd, 0x9e, 0xde,\n  0xe7, 0x12, 0xd7, 0x17, 0xed, 0xc9, 0xd1, 0x63, 0xd5, 0x2b, 0xd8, 0x74,\n  0x05, 0xae, 0x7f, 0xa0, 0xfe, 0x92, 0x97, 0x73, 0xb9, 0xe7, 0xe3, 0xe7,\n  0x90, 0x56, 0x60, 0xf9, 0x3f, 0x9b, 0x2a, 0x37, 0x43, 0xff, 0xd2, 0x1d,\n  0xb4, 0xff, 0x54, 0x30, 0x92, 0x46, 0x2f, 0x60, 0xf3, 0xfc, 0x15, 0xb9,\n  0xe7, 0x12, 0x8f, 0x48, 0x62, 0xd1, 0x94, 0xb9, 0xfa, 0x4f, 0xe4, 0x10,\n  0x8a, 0x50, 0x4a, 0xc2, 0xe8, 0x8a, 0x6f, 0x52, 0x8c, 0x2e, 0xc0, 0xbf,\n  0x58, 0x0e, 0x28, 0xdd, 0x77, 0xdc, 0x70, 0x24, 0xc1, 0xe8, 0x40, 0xfd,\n  0x5d, 0xf7, 0x51, 0x38, 0xbb, 0xee, 0xc0, 0x2f, 0x4d, 0x8e, 0xdd, 0x7e,\n  0x02, 0xf8, 0x98, 0x24, 0x7c, 0x76, 0x3e, 0x49, 0xe1, 0x6c, 0xc3, 0x2d,\n  0x58, 0x0f, 0x08, 0xb9, 0x0a, 0x3c, 0xe6, 0x38, 0xe8, 0x2c, 0xc7, 0x0c,\n  0x38, 0x9f, 0xee, 0x6e, 0x7b, 0xa7, 0x17, 0xff, 0x50, 0xf8, 0x91, 0x1f,\n  0xdf, 0x3d, 0x22, 0x8e, 0xd1, 0xee, 0x72, 0xba, 0x28, 0xe3, 0x30, 0x77,\n  0xf4, 0x55, 0x29, 0x8e, 0x59, 0x72, 0xf0, 0x0d, 0x67, 0x3c, 0xd2, 0xf6,\n  0xd8, 0xfd, 0x39, 0xb2, 0xe0, 0x54, 0xe1, 0x39, 0x3f, 0x5e, 0x78, 0xc7,\n  0x54, 0xbe, 0x77, 0x8c, 0x34, 0xbb, 0x34, 0xd4, 0x1f, 0xb9, 0xa9, 0xf5,\n  0x1d, 0x18, 0x92, 0x2f, 0x0b, 0xbf, 0x0b, 0xe3, 0x3d, 0xc2, 0x22, 0xfc,\n  0xd9, 0x54, 0xdc, 0xa4, 0x75, 0xa9, 0x7f, 0x59, 0x3e, 0x29, 0x33, 0x11,\n  0x8b, 0xb6, 0x1d, 0x7c, 0xc3, 0xd9, 0x0f, 0xb4, 0x3d, 0xb3, 0x07, 0xc4,\n  0x31, 0xe1, 0x55, 0x3f, 0x3e, 0xb5, 0xb0, 0xbe, 0x72, 0xbc, 0xfc, 0xbb,\n  0x6c, 0xd2, 0xee, 0xbb, 0x8d, 0xd6, 0x64, 0x09, 0x3e, 0x4b, 0xf8, 0x98,\n  0x56, 0x65, 0x37, 0x7e, 0xfa, 0x04, 0x61, 0x8a, 0xc4, 0x85, 0xc1, 0xbc,\n  0xf5, 0x41, 0xd6, 0x3a, 0xd1, 0x6f, 0x0b, 0xaf, 0x84, 0xf1, 0x9d, 0x3f,\n  0x14, 0xad, 0x07, 0x53, 0xed, 0xa2, 0xd5, 0xd9, 0x4a, 0xc9, 0x1e, 0x3d,\n  0x33, 0xa9, 0x2f, 0x97, 0x7c, 0x99, 0x50, 0x48, 0xe1, 0x9e, 0xf6, 0xde,\n  0x83, 0x77, 0xe5, 0xf0, 0xc7, 0xc2, 0xf7, 0x73, 0x92, 0x3c, 0x30, 0x05,\n  0x9e, 0xb4, 0xce, 0x7f, 0x44, 0x78, 0x05, 0xc9, 0xb6, 0x24, 0xeb, 0xb1,\n  0x25, 0xef, 0x87, 0x73, 0x57, 0x91, 0x91, 0xc3, 0xe4, 0x5a, 0xe0, 0x45,\n  0xd4, 0x3e, 0x71, 0x54, 0x5e, 0x64, 0x2e, 0x17, 0xcd, 0x45, 0x69, 0xe8,\n  0xbc, 0x37, 0x1e, 0xb8, 0x27, 0x87, 0xaf, 0xf9, 0x65, 0x0e, 0x37, 0xdd,\n  0xf1, 0xaf, 0xc3, 0x14, 0x25, 0x97, 0x9b, 0x1f, 0xbf, 0xee, 0xe9, 0x1c,\n  0xce, 0xdd, 0x95, 0x7b, 0x19, 0x2b, 0xcb, 0x68, 0xd6, 0x71, 0xcc, 0x25,\n  0x9e, 0x19, 0xd1, 0x98, 0xb6, 0x0f, 0x70, 0x9a, 0x0f, 0x50, 0x4b, 0x35,\n  0x83, 0x33, 0xeb, 0xf8, 0xe6, 0x12, 0xcf, 0xac, 0x69, 0xf8, 0x86, 0x8d,\n  0x4f, 0xd6, 0x3d, 0xbc, 0x37, 0x47, 0x2a, 0x0e, 0x3c, 0xd1, 0xf4, 0xb0,\n  0xb8, 0x04, 0x39, 0x05, 0xd6, 0xb1, 0xcd, 0xa5, 0xa2, 0xda, 0xfb, 0xd8,\n  0xe9, 0x0d, 0x00, 0x0d, 0x07, 0x2e, 0x68, 0x7e, 0x5e, 0xf8, 0x23, 0x69,\n  0x2e, 0x8c, 0x95, 0x59, 0xc7, 0x6d, 0xb7, 0x62, 0x3d, 0x20, 0xfc, 0xba,\n  0x0e, 0xcf, 0xca, 0xe1, 0x5f, 0x0a, 0xdf, 0x6d, 0xc2, 0x13, 0x9b, 0xa6,\n  0xe1, 0x76, 0xcc, 0xf3, 0xa3, 0x64, 0xe9, 0xbb, 0xf7, 0x12, 0x5a, 0xd7,\n  0x7b, 0x6e, 0xdb, 0xd9, 0xf4, 0xfc, 0xed, 0xf8, 0xb9, 0xc3, 0xe0, 0x1d,\n  0x8f, 0x9d, 0xce, 0x54, 0xb2, 0xd3, 0x5d, 0x7f, 0x43, 0xdd, 0xde, 0x87,\n  0x41, 0x66, 0xf9, 0x72, 0xd3, 0x93, 0x05, 0x99, 0x25, 0x71, 0x9c, 0xf6,\n  0x1b, 0x2a, 0xb3, 0x6c, 0x4f, 0xbf, 0xd0, 0x4b, 0xe2, 0x3f, 0x8d, 0xe2,\n  0xf4, 0x54, 0xfb, 0xc3, 0x71, 0xcb, 0x2c, 0xd7, 0x3d, 0x9c, 0x7e, 0xee,\n  0x7f, 0x40, 0x66, 0xf9, 0x5d, 0x44, 0x04, 0x35, 0x85, 0x2f, 0x1e, 0x87,\n  0x0d, 0x47, 0x22, 0x2a, 0x8f, 0xed, 0x48, 0xbf, 0x73, 0x47, 0x8e, 0x78,\n  0xbf, 0x07, 0xe0, 0x24, 0x23, 0xce, 0x89, 0xda, 0x5c, 0xa8, 0x1d, 0x47,\n  0x92, 0x59, 0x6e, 0xfd, 0x72, 0x9a, 0xd9, 0x71, 0xae, 0xfb, 0x1f, 0x00,\n  0x2b, 0x19, 0x72, 0x4e, 0xd8, 0x8e, 0x23, 0x61, 0xfa, 0xf8, 0xf6, 0x34,\n  0xb3, 0xe3, 0x3c, 0xf1, 0x26, 0x45, 0x55, 0x34, 0xe4, 0x9c, 0xb0, 0x1d,\n  0xa7, 0x40, 0x52, 0x77, 0xa5, 0x45, 0x3b, 0x4e, 0xf8, 0x27, 0x14, 0xa8,\n  0x68, 0xc8, 0x11, 0x63, 0x56, 0x9d, 0x80, 0x2d, 0xe7, 0xdd, 0xcc, 0xdd,\n  0xbd, 0x78, 0x4d, 0x54, 0xf8, 0x8c, 0x34, 0x31, 0xdc, 0x3c, 0xc7, 0x6c,\n  0xcb, 0x11, 0xe5, 0x95, 0xcf, 0x3e, 0xca, 0x80, 0x78, 0x9c, 0x03, 0x10,\n  0x9f, 0x12, 0x1b, 0x30, 0xe3, 0xf7, 0xcb, 0x60, 0x1c, 0xbb, 0xbc, 0x52,\n  0x30, 0xe4, 0xbc, 0x9b, 0x79, 0xf5, 0x22, 0x0a, 0x4b, 0xf8, 0x86, 0x28,\n  0xb1, 0x94, 0x60, 0x1d, 0x83, 0xdd, 0xa4, 0x20, 0xaf, 0xbc, 0x9b, 0xbe,\n  0xf9, 0x2b, 0x0c, 0xa3, 0xbf, 0xe2, 0xfd, 0x67, 0x03, 0x4a, 0xd7, 0x8b,\n  0xf1, 0xbc, 0xf2, 0xc7, 0x04, 0xc7, 0x51, 0x32, 0xe4, 0xbc, 0x9b, 0x79,\n  0xe4, 0x56, 0x80, 0x83, 0xd7, 0x46, 0x85, 0x5f, 0xdd, 0x83, 0x1f, 0x9e,\n  0x1c, 0x7b, 0xe4, 0xf8, 0xf0, 0x91, 0x56, 0xf1, 0x00, 0x9f, 0xbb, 0xef,\n  0x63, 0xf8, 0x80, 0x6c, 0x19, 0x28, 0x48, 0x2c, 0x27, 0x46, 0x67, 0x53,\n  0x05, 0x3a, 0xfb, 0xe3, 0xbb, 0xe3, 0x07, 0xb6, 0x4e, 0x1f, 0xf7, 0xc7,\n  0xd2, 0xef, 0x8c, 0x94, 0x31, 0x4a, 0xf6, 0x62, 0x25, 0x9e, 0xc8, 0x91,\n  0x71, 0xe1, 0xbf, 0xe3, 0xd3, 0xe7, 0xf7, 0x71, 0xd3, 0xd8, 0xef, 0x6f,\n  0x8a, 0x3f, 0x03, 0x4c, 0xe4, 0xed, 0x6b, 0xeb, 0x7f, 0x22, 0x9c, 0x42,\n  0x14, 0x87, 0xcb, 0xe5, 0xff, 0x6e, 0x79, 0x85, 0x52, 0x3a, 0x36, 0x69,\n  0xef, 0x01, 0x12, 0xf7, 0x02, 0xc8, 0x2b, 0x4f, 0xd4, 0x7f, 0xf7, 0xea,\n  0x69, 0x73, 0xeb, 0x58, 0x65, 0x95, 0x69, 0x06, 0xd2, 0x6b, 0x0a, 0xf6,\n  0xd1, 0x7b, 0x4f, 0x08, 0x9e, 0xa9, 0x44, 0xdb, 0x25, 0xc3, 0x70, 0x2b,\n  0x35, 0x0c, 0xdf, 0x81, 0xbd, 0x62, 0x1b, 0xd7, 0x1f, 0x9f, 0xbd, 0x47,\n  0xd2, 0x2a, 0x5e, 0xad, 0xbf, 0xb5, 0xf7, 0xf6, 0x57, 0xe3, 0xb7, 0x52,\n  0x7b, 0xa2, 0xd8, 0xb6, 0x35, 0x27, 0x6a, 0x0f, 0xb8, 0xfb, 0xf5, 0x86,\n  0x2b, 0x9e, 0xce, 0x11, 0x85, 0x70, 0xd3, 0xab, 0x0d, 0x17, 0xe3, 0x87,\n  0xa6, 0xc3, 0x3b, 0xa6, 0x31, 0x54, 0xd4, 0xb8, 0xef, 0x6e, 0xc0, 0xe9,\n  0x1c, 0x5e, 0xd2, 0x20, 0xbc, 0x4f, 0x16, 0x8a, 0xf5, 0xab, 0x39, 0x6e,\n  0x5b, 0x8f, 0xa4, 0x68, 0xe0, 0x1b, 0xf6, 0xbe, 0xd6, 0xb0, 0xe3, 0x89,\n  0x1c, 0x7e, 0x46, 0xf8, 0xcd, 0x8b, 0x0d, 0x97, 0xe3, 0xd4, 0x16, 0xd6,\n  0xfe, 0x35, 0x27, 0x68, 0xe7, 0x29, 0xea, 0xef, 0x4f, 0x3c, 0xdd, 0x74,\n  0x3f, 0x88, 0x61, 0x4f, 0xd5, 0xdf, 0x53, 0x5c, 0xb3, 0xaa, 0x3d, 0x21,\n  0x7b, 0x85, 0x68, 0xff, 0xf8, 0x4e, 0xfd, 0xed, 0xd0, 0xa7, 0x8d, 0x77,\n  0xbc, 0x18, 0xbf, 0xf9, 0x36, 0xd1, 0x38, 0x73, 0xa2, 0x72, 0x27, 0x5f,\n  0x90, 0x3b, 0x37, 0xff, 0xe0, 0xe1, 0x3b, 0x41, 0xdc, 0xf9, 0x30, 0x57,\n  0xe0, 0xd5, 0x27, 0x24, 0x77, 0x72, 0x45, 0xb9, 0xf3, 0x91, 0xdd, 0xaf,\n  0x6c, 0x03, 0xe6, 0x9f, 0xfb, 0x5c, 0x34, 0xd0, 0xfc, 0x6b, 0x32, 0x22,\n  0xeb, 0x99, 0x2d, 0x07, 0xbf, 0x76, 0x53, 0x0e, 0x7f, 0xfb, 0xe2, 0xdc,\n  0x9d, 0xbb, 0x0e, 0xb7, 0x95, 0x8a, 0x30, 0x8f, 0x2e, 0xa3, 0x14, 0x2d,\n  0xb0, 0x25, 0xe9, 0xf8, 0xb1, 0x5b, 0x1e, 0xbb, 0x25, 0xb7, 0xeb, 0xb9,\n  0xdc, 0x1e, 0xfc, 0xed, 0x02, 0xcc, 0xaa, 0xfc, 0xbd, 0x38, 0x8e, 0x1e,\n  0x46, 0x06, 0x16, 0xff, 0xa4, 0x90, 0xc2, 0x92, 0x03, 0xa0, 0x8b, 0xd9,\n  0x8a, 0xb5, 0x8c, 0x66, 0x8a, 0x18, 0xc5, 0x48, 0xaf, 0x55, 0x2b, 0x79,\n  0x39, 0x4d, 0x95, 0x21, 0xa7, 0x71, 0x33, 0x44, 0x07, 0xe7, 0x84, 0x8d,\n  0x6e, 0x4c, 0x80, 0x9f, 0xa7, 0x7b, 0x07, 0x67, 0xf7, 0x5d, 0x7a, 0xe9,\n  0x8a, 0x15, 0x97, 0xae, 0xee, 0xcf, 0xf6, 0xf4, 0xd6, 0x2c, 0x3d, 0xb9,\n  0x06, 0x11, 0x80, 0x1d, 0x93, 0x60, 0x5b, 0xc4, 0x18, 0x5a, 0x05, 0xe8,\n  0x34, 0x65, 0x09, 0x4b, 0x86, 0x2c, 0x97, 0xcb, 0x16, 0xd3, 0xb8, 0x26,\n  0x2b, 0x78, 0x2c, 0x97, 0xc9, 0x47, 0x8d, 0x46, 0x8c, 0x8c, 0x16, 0xa3,\n  0xc5, 0x6c, 0x2a, 0x15, 0xa7, 0x9c, 0xa1, 0x38, 0x1a, 0xf0, 0xa3, 0x54,\n  0x64, 0x1e, 0x00, 0x17, 0x8b, 0x3d, 0xbf, 0xa6, 0x46, 0x8c, 0xd5, 0x89,\n  0x41, 0x8e, 0x25, 0x4f, 0x70, 0xbc, 0xe6, 0x0a, 0x60, 0x80, 0x2a, 0x69,\n  0x37, 0xbf, 0xaa, 0x18, 0xc7, 0xb7, 0x0a, 0x37, 0x49, 0xf7, 0xbf, 0x54,\n  0xb8, 0x4f, 0x8a, 0xf7, 0x69, 0xbb, 0x88, 0xef, 0x03, 0xee, 0x55, 0xd9,\n  0xe8, 0x11, 0x83, 0xaf, 0xc2, 0xa1, 0x01, 0xe9, 0x83, 0xa1, 0x20, 0x8d,\n  0x80, 0x02, 0x33, 0x2a, 0x9e, 0x4a, 0x8a, 0x41, 0x61, 0xa8, 0x7f, 0x77,\n  0x15, 0x45, 0xee, 0xd2, 0xbe, 0xd9, 0x83, 0xbd, 0xf8, 0x61, 0x8a, 0x5a,\n  0x5f, 0x4f, 0x4f, 0x2f, 0xf3, 0x41, 0x97, 0xca, 0x66, 0xed, 0xd2, 0x9a,\n  0x4d, 0x97, 0xa0, 0x2b, 0x30, 0x27, 0xa3, 0x0b, 0x85, 0x87, 0xb7, 0x0b,\n  0x92, 0xda, 0x45, 0x2a, 0x4e, 0x39, 0x43, 0x71, 0x3c, 0x34, 0x4a, 0xa1,\n  0x48, 0x68, 0x19, 0x98, 0x5c, 0xc5, 0x52, 0x69, 0xa3, 0xb0, 0x18, 0xbd,\n  0xac, 0xaf, 0xb1, 0x41, 0x73, 0x05, 0x5e, 0x8a, 0xfa, 0x5f, 0x91, 0x62,\n  0x97, 0xf6, 0x4b, 0xb1, 0x4b, 0x0b, 0xfd, 0x05, 0x6d, 0x72, 0x15, 0x42,\n  0x93, 0x9f, 0x89, 0x6d, 0x32, 0xf9, 0x59, 0x31, 0x4e, 0x0b, 0x1d, 0x7f,\n  0x0b, 0x01, 0x6f, 0x1a, 0x93, 0xb2, 0x21, 0x5b, 0xcb, 0x72, 0xed, 0xec,\n  0xe0, 0xc4, 0x14, 0x22, 0x1c, 0x8b, 0x2e, 0x25, 0x67, 0x29, 0x44, 0xe8,\n  0xee, 0x63, 0x8d, 0x4a, 0x66, 0x90, 0x1b, 0xc4, 0x30, 0x2d, 0x0a, 0x3a,\n  0x9f, 0x41, 0xff, 0x2f, 0x4f, 0xbc, 0x63, 0xce, 0xbd, 0x63, 0xf7, 0xfb,\n  0xed, 0xb6, 0x40, 0x80, 0x3c, 0x31, 0x39, 0x46, 0xba, 0xbd, 0x5e, 0x9f,\n  0xc7, 0xe3, 0xf3, 0x7a, 0xa7, 0x97, 0xd3, 0x9c, 0x6d, 0xa0, 0x5b, 0x1b,\n  0xb6, 0x8b, 0x85, 0x95, 0xa5, 0x77, 0x80, 0xa2, 0xb8, 0x13, 0x29, 0x0a,\n  0x3f, 0x51, 0x2a, 0xea, 0xff, 0x7a, 0x59, 0x15, 0xff, 0xe6, 0xb2, 0x62,\n  0x47, 0x2e, 0xeb, 0xc6, 0xb2, 0xa2, 0xa6, 0x95, 0x55, 0x9f, 0xad, 0x61,\n  0x65, 0x01, 0xa1, 0xc0, 0xac, 0x14, 0xbc, 0x4a, 0x4e, 0x98, 0x6e, 0x78,\n  0xa4, 0x72, 0xc2, 0x47, 0x2e, 0xa7, 0x58, 0xcc, 0xbf, 0x34, 0x1e, 0x28,\n  0x9f, 0x28, 0x8f, 0xe3, 0x3f, 0x92, 0xbb, 0x11, 0xe0, 0xdb, 0xa0, 0x1c,\n  0x36, 0x1c, 0xb2, 0x1e, 0x1f, 0x2d, 0xc5, 0xe7, 0xf9, 0x37, 0xb4, 0xdb,\n  0xd1, 0x8b, 0xc2, 0x4f, 0x94, 0x15, 0xf5, 0x7f, 0xbb, 0xac, 0x8a, 0x7f,\n  0x77, 0x59, 0x99, 0x23, 0x96, 0x75, 0x63, 0xb1, 0xa8, 0x7f, 0x65, 0x2c,\n  0xb0, 0xad, 0x3d, 0x47, 0x2c, 0xa3, 0x58, 0x84, 0xb8, 0x17, 0x9b, 0x96,\n  0x81, 0x0d, 0xb2, 0x7b, 0xf0, 0xfd, 0xe4, 0x89, 0x62, 0xfc, 0x94, 0x27,\n  0xa4, 0xf8, 0x2a, 0xa5, 0xfb, 0x77, 0x1f, 0x7e, 0x5f, 0xe2, 0x6d, 0x0b,\n  0x99, 0x8c, 0x06, 0xbc, 0x8d, 0xc5, 0x4d, 0xa7, 0xa9, 0xcc, 0x69, 0xd0,\n  0xa9, 0x42, 0xf4, 0xf4, 0x15, 0x34, 0x2b, 0xd4, 0xd4, 0x98, 0x53, 0x09,\n  0x29, 0x6f, 0xf2, 0x48, 0xee, 0xb5, 0xd7, 0xc8, 0x13, 0xc2, 0x07, 0x39,\n  0xe1, 0x9b, 0x53, 0xcb, 0xda, 0x73, 0xd4, 0xb2, 0x66, 0x8a, 0xd1, 0xbe,\n  0x82, 0xc5, 0x68, 0x1f, 0x2d, 0x06, 0x3c, 0x57, 0x38, 0xa5, 0x52, 0xa0,\n  0x0c, 0xa8, 0xf3, 0xcd, 0x39, 0x80, 0x7f, 0x13, 0xde, 0x87, 0x5f, 0x27,\n  0x9f, 0xa0, 0x4a, 0x3c, 0x77, 0x02, 0xe1, 0x59, 0x78, 0x2e, 0x9a, 0x90,\n  0x5d, 0x2d, 0x65, 0x0f, 0xc7, 0xf8, 0x79, 0xd9, 0xd5, 0x52, 0xcc, 0x98,\n  0xea, 0xfc, 0xe7, 0x64, 0x31, 0xe9, 0x45, 0x7e, 0x90, 0xa8, 0x92, 0xe8,\n  0xa2, 0xac, 0xc1, 0xac, 0x20, 0x44, 0xd6, 0xd8, 0xe0, 0x75, 0x59, 0xe4,\n  0x34, 0x0d, 0x91, 0x28, 0x98, 0x47, 0x68, 0xa8, 0x4d, 0x29, 0x32, 0x2c,\n  0x4d, 0xa7, 0xce, 0x29, 0x08, 0x42, 0xb3, 0xe6, 0xd2, 0x7c, 0x50, 0x85,\n  0x13, 0x9a, 0xc6, 0x20, 0x38, 0xe5, 0x31, 0xba, 0x73, 0x92, 0xeb, 0x97,\n  0x1e, 0xa2, 0xf1, 0x28, 0xe1, 0x99, 0xf1, 0xac, 0xa3, 0xae, 0x16, 0x24,\n  0xad, 0x64, 0x5d, 0xb2, 0x32, 0xe2, 0x71, 0xdb, 0x6d, 0x3a, 0x0d, 0xf2,\n  0x63, 0xbf, 0x52, 0x55, 0x60, 0xa0, 0x65, 0x39, 0x36, 0x15, 0xbc, 0x83,\n  0x45, 0xc8, 0xa5, 0xfb, 0x55, 0x15, 0x0a, 0xae, 0x90, 0x16, 0xcc, 0x66,\n  0xa5, 0x7b, 0x88, 0x33, 0xe2, 0x46, 0xa4, 0xdf, 0x8d, 0xaf, 0xeb, 0xe9,\n  0x0c, 0x87, 0x17, 0x0d, 0xf6, 0xcf, 0xeb, 0xc9, 0xdc, 0x18, 0xb3, 0x2c,\n  0xd2, 0xd5, 0xfb, 0xce, 0x3e, 0xa3, 0xbb, 0xf2, 0xa4, 0x9e, 0xea, 0xa6,\n  0xea, 0x60, 0xa4, 0x3a, 0xe8, 0xaf, 0xee, 0xf5, 0xee, 0x8d, 0x25, 0xbb,\n  0x95, 0x8b, 0x06, 0xdb, 0x87, 0x82, 0xc1, 0xae, 0xaa, 0xf6, 0xbe, 0x9e,\n  0xce, 0xe6, 0x01, 0xdf, 0xf5, 0x89, 0xe1, 0xe4, 0xb2, 0xf0, 0x59, 0xdd,\n  0xa1, 0x28, 0x5e, 0x6b, 0x6f, 0x0a, 0x05, 0xc2, 0x91, 0x0a, 0x5f, 0x93,\n  0xf0, 0x9a, 0xc7, 0x7d, 0xaf, 0xbd, 0xb1, 0xae, 0x21, 0xc9, 0x78, 0x8d,\n  0x25, 0xff, 0x0f, 0xac, 0x22, 0x3e, 0x6c, 0xc0, 0xdb, 0xf1, 0xc9, 0xc4,\n  0x52, 0xec, 0x23, 0x8b, 0x38, 0x5e, 0xf2, 0xe7, 0x90, 0xf3, 0xd1, 0x75,\n  0xe4, 0x43, 0xe8, 0xec, 0x8d, 0xc2, 0xcf, 0x10, 0xe3, 0xd9, 0xf9, 0xb7,\n  0xc8, 0x66, 0x94, 0x24, 0xbf, 0x00, 0x36, 0x39, 0xf2, 0x20, 0x9c, 0x0b,\n  0x16, 0xb2, 0x5c, 0xf8, 0x88, 0x08, 0xf0, 0x4c, 0xef, 0xe4, 0x7f, 0x8a,\n  0xcf, 0x08, 0x2f, 0x90, 0xe5, 0xf9, 0x2b, 0xd9, 0xb5, 0x2d, 0xc2, 0x2d,\n  0xd2, 0x7b, 0x57, 0x90, 0xe5, 0xe8, 0xf7, 0xf4, 0x1a, 0x9e, 0x9f, 0x5f,\n  0x2a, 0x5d, 0x1b, 0x87, 0x6b, 0x5f, 0x61, 0xd7, 0xe6, 0xe4, 0x9b, 0xa5,\n  0x6b, 0x8b, 0xe1, 0xda, 0xa3, 0xec, 0xda, 0x50, 0xbe, 0x51, 0xba, 0xb6,\n  0x16, 0xae, 0xdd, 0x0d, 0x7d, 0xcd, 0xe3, 0xb9, 0xf9, 0x4e, 0xe9, 0xda,\n  0xad, 0x70, 0x6d, 0x13, 0xd7, 0x0c, 0xd7, 0x46, 0xf3, 0xa7, 0x4b, 0xe5,\n  0xda, 0x58, 0xb9, 0x3f, 0x87, 0x6b, 0xf3, 0x26, 0xff, 0x4b, 0x7a, 0xee,\n  0x74, 0x78, 0xee, 0x36, 0xf2, 0x20, 0x5c, 0x1b, 0xce, 0xf7, 0x89, 0xf1,\n  0x65, 0xf3, 0x4d, 0x20, 0x41, 0xfc, 0x90, 0x9b, 0x03, 0xa3, 0xa3, 0x82,\n  0xed, 0x9d, 0x3a, 0x2c, 0xb6, 0xba, 0xc9, 0x48, 0x53, 0xbc, 0xd0, 0x6d,\n  0x52, 0x5c, 0xd0, 0x16, 0x7c, 0x1b, 0xdf, 0x27, 0xac, 0xe0, 0xe6, 0xcc,\n  0x62, 0xef, 0x7e, 0x40, 0x16, 0xa2, 0x2a, 0xf2, 0x39, 0xbc, 0x1b, 0x63,\n  0xef, 0x1e, 0x3d, 0xcf, 0x26, 0x05, 0x61, 0xb1, 0x85, 0x53, 0x55, 0x63,\n  0xe4, 0xf3, 0x7d, 0xfb, 0x80, 0xde, 0xe4, 0xaf, 0x86, 0xf7, 0xb7, 0xb2,\n  0xf7, 0x79, 0x94, 0x64, 0x10, 0xaa, 0xe5, 0x9c, 0x8c, 0x63, 0x30, 0xd8,\n  0x41, 0x31, 0xb2, 0xdb, 0x0c, 0xe9, 0x25, 0x19, 0x46, 0x00, 0x2e, 0xc1,\n  0x40, 0xfe, 0x91, 0x01, 0xa5, 0x60, 0x11, 0x99, 0xfc, 0x3b, 0xd4, 0x7d,\n  0x15, 0xb4, 0x9b, 0x1a, 0xd9, 0x50, 0x27, 0x83, 0x1b, 0xb7, 0xea, 0x55,\n  0x20, 0xca, 0x60, 0x3c, 0x7c, 0x84, 0x02, 0x34, 0x1a, 0xa0, 0x35, 0x36,\n  0x8d, 0xcd, 0x68, 0x80, 0xb7, 0xd4, 0xd6, 0x62, 0x01, 0x76, 0xbb, 0xc3,\n  0x16, 0x6e, 0x20, 0xb1, 0x54, 0xb8, 0x78, 0xf4, 0x57, 0x63, 0xb3, 0x2d,\n  0x6e, 0x4f, 0x37, 0x68, 0x46, 0x0b, 0x07, 0x44, 0x08, 0x2d, 0xf2, 0x69,\n  0xcd, 0xad, 0x6d, 0x26, 0x75, 0xf1, 0x80, 0xd6, 0x6f, 0x0d, 0xb4, 0xf7,\n  0x5d, 0xdc, 0x30, 0xcd, 0x9d, 0x83, 0xfa, 0x19, 0x1e, 0x6d, 0xbc, 0x9c,\n  0x4a, 0xc9, 0x40, 0xec, 0x68, 0x08, 0x15, 0x44, 0x03, 0x40, 0xd2, 0x5c,\n  0x5f, 0x84, 0xe5, 0xcd, 0xa2, 0xd1, 0x83, 0x65, 0x64, 0x9e, 0x96, 0xc6,\n  0x7e, 0x70, 0x69, 0x5d, 0x0e, 0x9b, 0xc5, 0x6c, 0xd4, 0x8b, 0x69, 0x66,\n  0x94, 0xd2, 0x4e, 0x35, 0x4b, 0xbc, 0x14, 0x78, 0x4c, 0xdc, 0xcb, 0x4f,\n  0xe3, 0x40, 0xd3, 0x5d, 0x6b, 0xd8, 0x1a, 0x08, 0x58, 0x81, 0x0e, 0x3e,\n  0x21, 0x9f, 0x37, 0x7b, 0xce, 0x90, 0x2c, 0x2d, 0x8f, 0x37, 0xc4, 0x5a,\n  0xe5, 0xdc, 0x30, 0x65, 0x8d, 0x94, 0x45, 0x6e, 0xe8, 0x98, 0x33, 0xd8,\n  0x59, 0x6d, 0x77, 0xc6, 0xa0, 0xdf, 0x18, 0x5e, 0x30, 0x86, 0x74, 0x28,\n  0xce, 0xb0, 0x8a, 0x31, 0x5f, 0xf2, 0x1d, 0x32, 0x91, 0x53, 0xca, 0x70,\n  0x31, 0x90, 0x31, 0x46, 0x1a, 0x35, 0xcb, 0xbb, 0xa6, 0xc3, 0x3a, 0x79,\n  0x09, 0x85, 0x42, 0x30, 0xe3, 0x70, 0x3a, 0x4d, 0x68, 0x59, 0xb2, 0x04,\n  0x2d, 0x2b, 0x23, 0x9f, 0x47, 0x3e, 0x99, 0xdd, 0x45, 0xcb, 0xe8, 0x98,\n  0xc3, 0xc6, 0xdb, 0x93, 0xf8, 0x3d, 0x34, 0x9b, 0x1c, 0x44, 0x0a, 0x22,\n  0xa7, 0xf3, 0x23, 0xff, 0x34, 0x9c, 0x0f, 0xb1, 0x73, 0xc5, 0x23, 0x85,\n  0xfb, 0x83, 0xec, 0x5c, 0xc9, 0xee, 0x3f, 0x0b, 0xe7, 0x73, 0xc5, 0xfb,\n  0xfb, 0xe9, 0xf9, 0xdd, 0xf9, 0x24, 0x5a, 0x9b, 0x3f, 0x84, 0x61, 0x3e,\n  0xe5, 0xcf, 0xfd, 0xe2, 0x7d, 0x71, 0x46, 0x7e, 0xf1, 0x7e, 0x41, 0x66,\n  0x2e, 0xbb, 0xbf, 0xe5, 0xf0, 0xfb, 0x2c, 0xa7, 0x50, 0x25, 0x5a, 0x92,\n  0xff, 0x84, 0xd2, 0x70, 0x56, 0xcf, 0x00, 0x93, 0x6b, 0x17, 0x4f, 0xf3,\n  0x7f, 0x03, 0xea, 0x5a, 0x48, 0x81, 0x4a, 0xeb, 0xc7, 0x27, 0xd8, 0x90,\n  0x0a, 0x2f, 0x39, 0x33, 0x97, 0x3b, 0x73, 0x59, 0xcf, 0x4b, 0x3d, 0x47,\n  0x82, 0x45, 0x75, 0x87, 0xc5, 0x54, 0x33, 0xc1, 0x1c, 0x53, 0x77, 0xe8,\n  0x7c, 0x21, 0x78, 0x0a, 0x2c, 0x47, 0x98, 0x0d, 0xd0, 0x04, 0x83, 0x75,\n  0x67, 0x11, 0xd6, 0x53, 0xe4, 0x25, 0xf4, 0x14, 0xf7, 0x38, 0x50, 0xf4,\n  0x4a, 0x06, 0xcb, 0x83, 0x8a, 0x51, 0xa4, 0x17, 0x33, 0x9f, 0x65, 0xda,\n  0xf8, 0xa3, 0x52, 0x72, 0x0c, 0x69, 0xe6, 0x01, 0x46, 0x23, 0x18, 0xe5,\n  0x5e, 0xe2, 0x1e, 0xff, 0xe3, 0xd3, 0x14, 0xc6, 0x9d, 0xa4, 0x16, 0x9d,\n  0x0e, 0x73, 0x47, 0x89, 0x9c, 0x0c, 0x86, 0x4e, 0x09, 0x2f, 0xb1, 0x48,\n  0x82, 0x16, 0x5c, 0x18, 0xbc, 0x40, 0x45, 0x13, 0x30, 0x4a, 0xf8, 0xf5,\n  0x89, 0x8e, 0x65, 0xbc, 0x7e, 0xd9, 0x06, 0x32, 0xa1, 0xec, 0xeb, 0xd5,\n  0x8c, 0xad, 0xd3, 0xc2, 0xfb, 0x6f, 0xe4, 0x03, 0xa8, 0x25, 0xff, 0x67,\n  0xa4, 0x2d, 0x6f, 0x1b, 0xa8, 0xd1, 0x04, 0xd3, 0xb5, 0x28, 0x23, 0xa6,\n  0xe1, 0x09, 0x38, 0x34, 0xcf, 0x62, 0xb2, 0x96, 0xea, 0x23, 0xb2, 0x5e,\n  0x1b, 0x25, 0xcc, 0x89, 0x96, 0xe6, 0x8e, 0x8e, 0x66, 0x67, 0x45, 0xcb,\n  0x2f, 0x5a, 0xe2, 0xf1, 0x4c, 0xdc, 0xe7, 0xce, 0xb0, 0xba, 0xdd, 0x91,\n  0x6f, 0x42, 0x13, 0xf9, 0xb7, 0xa1, 0x9d, 0x16, 0x50, 0xb8, 0x62, 0x7e,\n  0x76, 0x17, 0xd5, 0x4e, 0x10, 0xb7, 0x89, 0xce, 0x35, 0xb6, 0x5b, 0x10,\n  0x9e, 0x5c, 0x49, 0xa9, 0xcb, 0x98, 0x27, 0xeb, 0x64, 0x9a, 0xcb, 0xf6,\n  0xc3, 0x6f, 0x4d, 0x4f, 0xb0, 0xc8, 0x10, 0xa0, 0x5b, 0x7c, 0x53, 0x89,\n  0x54, 0x70, 0xf6, 0x3b, 0xb3, 0x9b, 0xd6, 0x74, 0x74, 0xac, 0x99, 0x56,\n  0xe6, 0xbc, 0x52, 0x99, 0x4e, 0xb1, 0xcc, 0xcd, 0x87, 0x45, 0x89, 0xf4,\n  0x64, 0x1d, 0x47, 0x88, 0x1f, 0x39, 0x53, 0x89, 0x7c, 0x8a, 0x91, 0x18,\n  0x1b, 0x2d, 0xf1, 0x6d, 0x56, 0x22, 0x2d, 0xcf, 0x0b, 0xe5, 0x7d, 0x02,\n  0xf3, 0x5a, 0xa2, 0x5a, 0xf0, 0xb2, 0x8c, 0x92, 0x3d, 0x1a, 0x63, 0x4e,\n  0xd4, 0x98, 0x30, 0xa6, 0xf1, 0x19, 0xb0, 0x6c, 0x4a, 0x9c, 0x3b, 0x9d,\n  0x47, 0x02, 0x59, 0x08, 0xc9, 0x12, 0x4e, 0x4d, 0xcc, 0xce, 0xcd, 0x9e,\n  0x9d, 0xbb, 0xb7, 0x63, 0x60, 0x00, 0xfe, 0xd3, 0x31, 0x7d, 0x43, 0x7e,\n  0x35, 0x3a, 0x1b, 0xf4, 0x22, 0x5e, 0x76, 0x73, 0x7e, 0x93, 0xb0, 0x40,\n  0x8a, 0xaf, 0xb7, 0xa0, 0x38, 0xa6, 0x47, 0xf3, 0x34, 0x10, 0x77, 0x0d,\n  0xd2, 0xa3, 0x16, 0x56, 0x76, 0xbd, 0x8c, 0x39, 0x75, 0xc2, 0x08, 0x1a,\n  0x2e, 0x66, 0xa9, 0x14, 0x37, 0xbb, 0xae, 0x66, 0xbb, 0x97, 0xe7, 0x8b,\n  0x73, 0x18, 0xe9, 0xb1, 0x5e, 0x26, 0xcd, 0x60, 0xbe, 0xb0, 0xad, 0x9f,\n  0x05, 0x53, 0x52, 0x9c, 0x67, 0x09, 0xa8, 0x95, 0x6e, 0x63, 0xd3, 0x68,\n  0xeb, 0xa7, 0x4a, 0xd9, 0x20, 0xa7, 0x48, 0xee, 0xbe, 0x25, 0xdb, 0x2f,\n  0xed, 0x8d, 0x36, 0xa3, 0x27, 0xcb, 0xcb, 0xd2, 0xc0, 0x38, 0xd5, 0x52,\n  0x2a, 0x51, 0x0c, 0x78, 0x84, 0x58, 0xb4, 0x16, 0x56, 0x16, 0xa1, 0x65,\n  0xa9, 0x78, 0x90, 0xda, 0xca, 0xca, 0x72, 0x94, 0x42, 0x36, 0xd1, 0x38,\n  0x4e, 0xe7, 0x75, 0xb4, 0x8e, 0x36, 0x19, 0xdd, 0x4a, 0x75, 0xe0, 0xd3,\n  0xfe, 0xec, 0x2d, 0xbb, 0x93, 0x0a, 0x6e, 0x50, 0xa6, 0xa4, 0x65, 0x09,\n  0xf7, 0xe5, 0xc7, 0xf2, 0xaa, 0xfc, 0x2b, 0xd0, 0x58, 0x12, 0x2f, 0x99,\n  0x61, 0xd7, 0xae, 0x48, 0x0b, 0x0b, 0xbb, 0x76, 0xcb, 0xf3, 0xf6, 0x0a,\n  0xef, 0x51, 0x31, 0x10, 0x3e, 0x25, 0x65, 0x8a, 0xf2, 0xec, 0xfc, 0x3c,\n  0x74, 0x1d, 0x50, 0x1d, 0xc6, 0xb3, 0xbf, 0xf8, 0x50, 0xd4, 0x1f, 0xbf,\n  0xf8, 0xb0, 0x48, 0x3f, 0x6e, 0xcd, 0xfb, 0xd0, 0xa6, 0xfc, 0x1f, 0x31,\n  0xe3, 0x9b, 0x5f, 0xbc, 0x2c, 0xdd, 0x7f, 0xb9, 0x78, 0xff, 0xde, 0xbc,\n  0x11, 0xad, 0x61, 0x36, 0xaf, 0x0b, 0x6f, 0xa4, 0xe7, 0x8f, 0xe7, 0x23,\n  0x68, 0x01, 0xc8, 0xac, 0x0a, 0x3c, 0xb6, 0x83, 0x9e, 0x7f, 0x00, 0xf4,\n  0xa7, 0x2a, 0xff, 0x01, 0xe8, 0xa7, 0x8f, 0x20, 0xf4, 0xc5, 0xc7, 0x12,\n  0xfd, 0xf9, 0xb8, 0xd8, 0x57, 0x23, 0x40, 0x33, 0x9e, 0x62, 0xe3, 0x72,\n  0xb0, 0x34, 0x2e, 0x1d, 0x94, 0xd8, 0x12, 0xbc, 0x79, 0xfa, 0x74, 0xf7,\n  0x64, 0xed, 0x22, 0x19, 0x9e, 0x7e, 0x83, 0x79, 0xdf, 0x97, 0xc8, 0x13,\n  0x23, 0x05, 0xb6, 0xf0, 0x53, 0x78, 0x4d, 0xee, 0xe3, 0x5c, 0xd3, 0xfe,\n  0x33, 0xcf, 0x14, 0xcb, 0xea, 0xcd, 0x8f, 0xa2, 0x97, 0xf2, 0xdf, 0x41,\n  0x76, 0xd4, 0xce, 0xda, 0xaf, 0x49, 0x4e, 0xb9, 0xcc, 0x30, 0x4f, 0x97,\n  0x16, 0x38, 0x42, 0xb3, 0x4d, 0xd1, 0x69, 0xcd, 0x52, 0x36, 0xaf, 0x62,\n  0xd9, 0x36, 0x69, 0x6c, 0x1d, 0x3b, 0xb2, 0x07, 0xcd, 0x41, 0x73, 0x28,\n  0x44, 0xe3, 0xa7, 0xb3, 0xee, 0xa2, 0xcc, 0x25, 0xc6, 0x18, 0x4c, 0x82,\n  0x85, 0xd9, 0x12, 0xbf, 0x5f, 0xea, 0x6a, 0x4a, 0xbb, 0xdd, 0xe9, 0xe6,\n  0x8e, 0x74, 0xc6, 0x15, 0x68, 0x6a, 0x71, 0x05, 0x3a, 0xdb, 0xda, 0xc2,\n  0xe1, 0xb6, 0xb6, 0x5c, 0x45, 0x08, 0xfe, 0xb3, 0xb6, 0x5a, 0x92, 0x6f,\n  0x45, 0xfb, 0xf3, 0x3f, 0xc6, 0x54, 0x56, 0x69, 0xfa, 0xe2, 0x27, 0x52,\n  0x5b, 0xfc, 0xa4, 0xd8, 0x96, 0x8b, 0xf3, 0x2d, 0xe8, 0xd1, 0xfc, 0x07,\n  0x98, 0xca, 0x37, 0x8d, 0x62, 0x5f, 0xe0, 0xf2, 0xbe, 0x58, 0x93, 0x9f,\n  0x85, 0xee, 0xca, 0xbf, 0x85, 0xa9, 0x5c, 0xd3, 0xf1, 0xc5, 0xef, 0xa5,\n  0xfb, 0xbf, 0x2f, 0xbb, 0x3f, 0x00, 0xf7, 0xdf, 0x84, 0xb6, 0xfe, 0x2a,\n  0xb4, 0xf5, 0xef, 0xa4, 0xfb, 0xbf, 0x2b, 0xde, 0x9f, 0x9d, 0x9f, 0x8d,\n  0x9e, 0xcb, 0x1f, 0x80, 0xf7, 0xe7, 0xe5, 0x2b, 0xbe, 0xf8, 0x83, 0x74,\n  0xff, 0x0f, 0xc5, 0xfb, 0xa7, 0xe7, 0xcf, 0x40, 0xb7, 0xd1, 0xb1, 0x40,\n  0x65, 0x9f, 0x49, 0x83, 0x78, 0x7f, 0xd2, 0x50, 0xec, 0xab, 0x8a, 0xfc,\n  0x3a, 0xf4, 0x71, 0xfe, 0xa1, 0x32, 0x39, 0x68, 0x5a, 0x5e, 0x98, 0x92,\n  0x1c, 0xe4, 0x08, 0xa6, 0x82, 0x1f, 0x0b, 0x59, 0xfc, 0xca, 0x1e, 0x31,\n  0x67, 0x72, 0xbe, 0x39, 0x1f, 0x42, 0x6f, 0xe7, 0x7f, 0x83, 0x78, 0x22,\n  0xcb, 0x27, 0x24, 0x59, 0x6b, 0x04, 0xfd, 0x00, 0xbd, 0x88, 0xc7, 0x18,\n  0x3e, 0x95, 0xc2, 0x66, 0x69, 0x1e, 0x6f, 0x2e, 0xe2, 0xd3, 0x04, 0x9a,\n  0xe8, 0x0f, 0xf1, 0x20, 0xd4, 0xe7, 0x61, 0x84, 0x26, 0xf3, 0x12, 0x3e,\n  0xf9, 0x02, 0x3e, 0xc2, 0x6e, 0xf4, 0xbf, 0x78, 0x03, 0xce, 0x02, 0x3e,\n  0x05, 0x1e, 0x31, 0x3d, 0x1e, 0xeb, 0x34, 0xd1, 0x2a, 0x9a, 0x0a, 0xda,\n  0x84, 0xdd, 0xe4, 0xed, 0xff, 0x9d, 0x45, 0x97, 0x0e, 0xf3, 0x67, 0xa1,\n  0xe7, 0xd0, 0xcd, 0xf8, 0x3a, 0x96, 0x03, 0x18, 0xc6, 0x55, 0xbc, 0x36,\n  0x96, 0x71, 0xf0, 0x37, 0x09, 0xd1, 0xfc, 0x5f, 0xee, 0xec, 0xdc, 0x0d,\n  0xf7, 0xdb, 0xf2, 0xdf, 0x43, 0xdf, 0x23, 0x7f, 0xa3, 0xf9, 0xd1, 0x19,\n  0x7c, 0x2b, 0x03, 0xca, 0xa2, 0x20, 0x4f, 0x97, 0xd9, 0x70, 0x18, 0x7f,\n  0x4f, 0x78, 0x65, 0x18, 0x67, 0xc9, 0xdf, 0xbe, 0x78, 0x9b, 0x6b, 0x12,\n  0xdb, 0xeb, 0x70, 0xfe, 0x71, 0x84, 0x10, 0x4e, 0xe5, 0xfc, 0x83, 0x17,\n  0xc5, 0x97, 0x14, 0x0d, 0x28, 0x12, 0x4e, 0x49, 0xfc, 0x43, 0xdf, 0x12,\n  0x6f, 0x6e, 0x29, 0xf2, 0x8f, 0xa3, 0xcd, 0x99, 0x4d, 0x8c, 0xe0, 0xd0,\n  0x00, 0xbc, 0x68, 0x25, 0xd5, 0x57, 0xc7, 0x0a, 0x73, 0x66, 0xfb, 0xf4,\n  0x1b, 0x53, 0xe7, 0x0c, 0x74, 0x18, 0x0b, 0x83, 0xf5, 0x94, 0x70, 0x37,\n  0xcc, 0x99, 0x0f, 0xa5, 0x39, 0x43, 0x60, 0xce, 0x78, 0xd1, 0x8b, 0x40,\n  0xc7, 0xb9, 0x29, 0x12, 0x02, 0x35, 0x7c, 0xaf, 0x2f, 0x01, 0x5c, 0x41,\n  0x01, 0x8e, 0x4e, 0x03, 0x17, 0x94, 0xc3, 0xe7, 0x45, 0x61, 0x07, 0xbe,\n  0x50, 0x78, 0x09, 0xab, 0x85, 0xbf, 0x7d, 0xf2, 0xfa, 0x2d, 0xcb, 0x8f,\n  0x38, 0x0f, 0xa9, 0x59, 0x54, 0x9a, 0x87, 0x3b, 0xe8, 0xd4, 0xe3, 0xd0,\n  0x38, 0x95, 0x93, 0xb9, 0x55, 0xf4, 0x16, 0x37, 0xe3, 0x3c, 0x64, 0x39,\n  0x36, 0x1c, 0x8c, 0xb8, 0x85, 0x93, 0x54, 0x0f, 0x12, 0xbf, 0x5f, 0x9c,\n  0x3e, 0x0f, 0x9f, 0x6c, 0x6f, 0x2d, 0x9f, 0x87, 0x50, 0xfe, 0x1e, 0xd2,\n  0x8e, 0xd6, 0x71, 0x3c, 0xcb, 0xa3, 0xc8, 0xd3, 0x7e, 0xe7, 0x32, 0x8e,\n  0x4c, 0x21, 0x97, 0xe2, 0xba, 0x9a, 0x8e, 0xf6, 0xda, 0x8e, 0x8e, 0xda,\n  0xf6, 0x8e, 0x9a, 0x76, 0xf2, 0x51, 0xe1, 0xa8, 0xbd, 0xa6, 0x43, 0xc4,\n  0xfd, 0x15, 0x92, 0x45, 0x59, 0x6e, 0x35, 0x48, 0xcd, 0xa5, 0x3e, 0x9d,\n  0x31, 0x8b, 0xa9, 0xc9, 0x69, 0x32, 0x17, 0x5a, 0x83, 0x2b, 0x08, 0x04,\n  0xf6, 0x52, 0xdf, 0x56, 0x56, 0x76, 0xf7, 0xb7, 0xf9, 0x7c, 0x3e, 0x6f,\n  0x5f, 0x3b, 0x7c, 0xf9, 0x38, 0x63, 0xb8, 0x31, 0x6e, 0xd7, 0xeb, 0x23,\n  0xf5, 0xee, 0x70, 0x53, 0xc2, 0xae, 0x33, 0x45, 0xeb, 0xc4, 0x39, 0x40,\n  0xbe, 0x40, 0x3f, 0xe0, 0x5e, 0xc1, 0x74, 0xde, 0xc4, 0x39, 0x89, 0x3e,\n  0x73, 0x25, 0x9a, 0xb0, 0x12, 0xe4, 0xd4, 0x6a, 0x51, 0x9f, 0x02, 0xea,\n  0x21, 0x5e, 0xfb, 0x00, 0xae, 0xdd, 0x07, 0xd7, 0x14, 0x68, 0xcb, 0x13,\n  0x14, 0xe7, 0x4a, 0x32, 0x86, 0x3e, 0x24, 0x7f, 0xff, 0xb7, 0xd2, 0x58,\n  0x26, 0x6e, 0xc1, 0xe7, 0x43, 0xfc, 0x74, 0x4e, 0x78, 0x3b, 0x47, 0xfe,\n  0x4e, 0x47, 0x0c, 0xc5, 0x17, 0xe6, 0xf9, 0x0f, 0xa4, 0x79, 0x1e, 0x97,\n  0xf0, 0xb9, 0x1a, 0x78, 0xc0, 0x56, 0xc6, 0x03, 0x1e, 0x2d, 0xf0, 0x00,\n  0x52, 0xce, 0x03, 0x1e, 0x00, 0x1e, 0xb2, 0x2c, 0xff, 0x1a, 0xc8, 0x7a,\n  0x03, 0x22, 0x7e, 0x6a, 0xb6, 0xf6, 0x75, 0x04, 0xf4, 0x6c, 0x33, 0x4a,\n  0x82, 0xe3, 0xcf, 0x94, 0xc9, 0x82, 0x3c, 0x93, 0x4e, 0x97, 0x7d, 0x33,\n  0xb7, 0xb5, 0xe3, 0xe9, 0xad, 0x62, 0x19, 0xb3, 0x49, 0x2b, 0x7a, 0x0e,\n  0xe4, 0x8e, 0x00, 0x1a, 0x65, 0xfd, 0xd6, 0x67, 0xb7, 0x10, 0x19, 0x47,\n  0x43, 0xec, 0x81, 0x54, 0x60, 0xb3, 0x12, 0x6e, 0x8e, 0x5c, 0x46, 0x85,\n  0x43, 0x90, 0xec, 0x65, 0xe3, 0x6c, 0x3c, 0x22, 0x1a, 0x45, 0x84, 0x86,\n  0xbf, 0x21, 0xa0, 0xcf, 0xcb, 0x28, 0x6f, 0xf5, 0x79, 0xdd, 0x4e, 0x93,\n  0x41, 0xa7, 0x55, 0x2b, 0x51, 0x00, 0x07, 0xf8, 0x82, 0xb0, 0x2f, 0x46,\n  0xc6, 0x28, 0x8a, 0xfb, 0x34, 0xfc, 0x0f, 0x8c, 0x26, 0x51, 0xe5, 0x00,\n  0x75, 0x7d, 0x8e, 0x25, 0x62, 0x8a, 0xd6, 0x47, 0x54, 0x26, 0xa5, 0xd3,\n  0xc9, 0x27, 0x14, 0xad, 0x8d, 0xa6, 0xa0, 0x21, 0x54, 0x1f, 0xd4, 0x58,\n  0xd5, 0x0e, 0x17, 0x1f, 0x57, 0xb4, 0x90, 0x15, 0x7a, 0x55, 0xa7, 0xa7,\n  0x5d, 0x26, 0xf7, 0xf9, 0xda, 0xfb, 0x35, 0xca, 0x56, 0x4f, 0x8b, 0x9c,\n  0xf7, 0xf9, 0xda, 0x06, 0x58, 0x7c, 0x18, 0xc0, 0xbb, 0x07, 0xf0, 0xbe,\n  0x1b, 0xc6, 0x6a, 0x10, 0xd5, 0xa3, 0x53, 0x18, 0xee, 0xf3, 0xd4, 0x94,\n  0xee, 0xca, 0x61, 0xd0, 0x69, 0x78, 0x02, 0xda, 0x1e, 0x91, 0xd3, 0x9c,\n  0x01, 0x32, 0x4c, 0x94, 0x0a, 0x32, 0xa1, 0xc5, 0x4a, 0x95, 0x4a, 0x39,\n  0x0e, 0x3f, 0x4a, 0x1a, 0x72, 0x54, 0xa9, 0x9a, 0x17, 0x0e, 0x51, 0x75,\n  0xa9, 0x3a, 0x16, 0xaa, 0x0f, 0xd7, 0x6b, 0x83, 0xda, 0x60, 0xc0, 0xe7,\n  0x71, 0x39, 0xec, 0xd6, 0xa2, 0xe2, 0xa4, 0x93, 0x2a, 0x62, 0x3a, 0x4c,\n  0x71, 0x2a, 0xab, 0x12, 0xab, 0x0d, 0x5f, 0xf6, 0x84, 0xc5, 0xeb, 0xb5,\n  0x58, 0x3c, 0x9e, 0x83, 0x8a, 0x96, 0x46, 0x6f, 0xaa, 0xd9, 0x2e, 0xd5,\n  0xcd, 0x9f, 0x6a, 0xb2, 0x41, 0xb5, 0xb6, 0xb3, 0xbb, 0x5e, 0x2f, 0x77,\n  0xb7, 0xc3, 0xed, 0x82, 0x3f, 0xb7, 0xe3, 0x8c, 0xb6, 0x01, 0xaf, 0x8f,\n  0xd6, 0x10, 0xc6, 0xba, 0x6f, 0x67, 0xe1, 0xaa, 0x48, 0x63, 0x96, 0x90,\n  0x65, 0xe8, 0x11, 0xee, 0x14, 0x98, 0x53, 0xb5, 0x85, 0x1a, 0x96, 0xf5,\n  0x00, 0xd1, 0x12, 0xa4, 0x92, 0xa1, 0x09, 0xa4, 0xe6, 0x15, 0xea, 0x71,\n  0x0d, 0x16, 0x93, 0x40, 0xc2, 0xa9, 0x5a, 0xb1, 0x4a, 0xa9, 0x23, 0x0a,\n  0xb5, 0x62, 0x9e, 0xc3, 0x0e, 0xf5, 0xab, 0xaa, 0x8c, 0x84, 0x2a, 0xfc,\n  0x50, 0x37, 0x7b, 0xad, 0xa3, 0x96, 0xaa, 0x85, 0x6c, 0x39, 0x82, 0x43,\n  0x36, 0x6c, 0xd3, 0x97, 0xba, 0x6a, 0x7a, 0x95, 0xa8, 0x3d, 0x65, 0xc6,\n  0xab, 0xb3, 0x5c, 0xf1, 0x06, 0x9b, 0xdd, 0xac, 0x48, 0xc8, 0x9b, 0x6b,\n  0xbd, 0xf1, 0x06, 0x8b, 0xcd, 0xcc, 0xc7, 0xe5, 0x4d, 0x75, 0x33, 0x5e,\n  0x25, 0x7f, 0x70, 0x3a, 0xdd, 0x8e, 0x54, 0xa7, 0xd3, 0xe9, 0xb1, 0x27,\n  0xbb, 0xae, 0x2b, 0x3f, 0xa1, 0x63, 0x6f, 0x5e, 0x3e, 0x8a, 0xbe, 0x96,\n  0xff, 0x29, 0x52, 0xa1, 0x26, 0x56, 0xbb, 0x28, 0xcd, 0xe5, 0xcd, 0xf6,\n  0x25, 0xa3, 0x39, 0x2a, 0x05, 0xc1, 0x83, 0xd3, 0xed, 0x09, 0x56, 0x73,\n  0x81, 0x8f, 0xf2, 0x19, 0x20, 0xca, 0x0e, 0x10, 0xb0, 0x6d, 0x5f, 0xbb,\n  0x64, 0xcd, 0x25, 0x97, 0xac, 0xb9, 0xec, 0x94, 0xae, 0xae, 0x53, 0xe0,\n  0xc3, 0xc6, 0xf4, 0x83, 0x6c, 0xde, 0xfc, 0x16, 0xe6, 0x79, 0x94, 0xc1,\n  0x75, 0xd3, 0xbd, 0xe7, 0x98, 0x4a, 0x99, 0xdb, 0xa9, 0xf3, 0xc0, 0x16,\n  0x71, 0x29, 0xd2, 0xcc, 0x32, 0x00, 0x4a, 0x72, 0x7a, 0x06, 0xd4, 0xad,\n  0x8a, 0xf6, 0x53, 0x4e, 0x69, 0xff, 0xe3, 0xd6, 0x15, 0x2b, 0xb6, 0x22,\n  0xa7, 0x70, 0x17, 0x00, 0x5a, 0xcb, 0x72, 0x08, 0x6a, 0x0a, 0x99, 0xce,\n  0x51, 0x23, 0xca, 0xa0, 0x6e, 0x34, 0x0b, 0x0d, 0xa1, 0x51, 0xc0, 0x6a,\n  0x05, 0x68, 0x6e, 0x67, 0xa1, 0xf3, 0xd1, 0x65, 0xe8, 0x2a, 0xb4, 0x0b,\n  0xdd, 0x81, 0xee, 0x41, 0x0f, 0xa0, 0x87, 0xc9, 0x8f, 0xc4, 0x99, 0x4a,\n  0xa3, 0x96, 0xdf, 0xab, 0x80, 0x99, 0x93, 0xe6, 0x39, 0x0e, 0xba, 0x06,\n  0xaf, 0x47, 0xaa, 0x8c, 0x32, 0x25, 0x4f, 0xca, 0x89, 0x41, 0x45, 0xd6,\n  0xeb, 0xb0, 0xa6, 0x55, 0xdb, 0xc2, 0xa9, 0xf5, 0x1a, 0xf5, 0x84, 0x09,\n  0x1b, 0xda, 0x8d, 0x6d, 0x9c, 0xde, 0x62, 0xd0, 0x4f, 0xd8, 0xb0, 0xa5,\n  0xd3, 0xda, 0xc1, 0x99, 0x3d, 0x16, 0xf3, 0x84, 0x0f, 0x7b, 0x7a, 0xbc,\n  0x59, 0xce, 0x1d, 0xf0, 0xb8, 0x27, 0x9c, 0xd8, 0xde, 0xed, 0xea, 0xe2,\n  0x1c, 0x7e, 0xbb, 0x63, 0x7d, 0x10, 0x07, 0x7a, 0x2b, 0x72, 0x9c, 0x3f,\n  0x1c, 0xf0, 0x4f, 0x44, 0x71, 0xb8, 0x3f, 0xd2, 0xc7, 0x85, 0x6a, 0xc3,\n  0xa1, 0x89, 0x6a, 0x1c, 0x9b, 0x55, 0x35, 0xc0, 0x55, 0xd6, 0xc4, 0x2a,\n  0x27, 0x1a, 0xeb, 0x49, 0xed, 0x6c, 0x5c, 0x53, 0x57, 0x5b, 0x33, 0x11,\n  0x6f, 0x22, 0x34, 0xf2, 0xe7, 0x62, 0xfa, 0x5b, 0xd7, 0xb0, 0x72, 0x28,\n  0x31, 0xa7, 0x79, 0x50, 0xde, 0x50, 0xd7, 0x30, 0xe6, 0x11, 0xb3, 0x95,\n  0x3e, 0x08, 0x48, 0x71, 0x44, 0xa3, 0xd4, 0x10, 0xe5, 0xb6, 0xe9, 0x08,\n  0x63, 0xa5, 0x41, 0xa5, 0x9c, 0xf8, 0xff, 0x05, 0xb2, 0xd9, 0xaf, 0x96,\n  0xe1, 0xd9, 0x88, 0xeb, 0x6b, 0x2b, 0x6b, 0xeb, 0x2b, 0xff, 0x1f, 0x21,\n  0x8c, 0xfe, 0x29, 0xba, 0xe3, 0xe3, 0xd9, 0x03, 0xfb, 0xf6, 0xdd, 0x7b,\n  0xef, 0xee, 0xdd, 0x37, 0xdd, 0x78, 0xcd, 0xd5, 0x97, 0x6f, 0xbb, 0x60,\n  0xeb, 0xe6, 0x4d, 0x13, 0x1b, 0x56, 0xad, 0x1c, 0x5f, 0x32, 0x6f, 0x6c,\n  0x78, 0x78, 0xf6, 0xec, 0x9e, 0x6c, 0x6b, 0x4b, 0x73, 0x53, 0x75, 0x55,\n  0xb0, 0xc2, 0xe5, 0x34, 0x19, 0xb5, 0x5a, 0x85, 0x02, 0xa1, 0x7d, 0x0f,\n  0xef, 0x7b, 0xf8, 0xa1, 0x07, 0xef, 0x7d, 0xe0, 0xde, 0x07, 0xee, 0xbf,\n  0x6f, 0xef, 0x97, 0x77, 0xdf, 0xb3, 0xfb, 0x9e, 0xbb, 0xef, 0xda, 0x73,\n  0xe7, 0x6d, 0xb7, 0xdc, 0x78, 0xc7, 0x4d, 0x77, 0x5c, 0xbf, 0xf3, 0xea,\n  0x5d, 0xd7, 0xec, 0xda, 0xfe, 0xa5, 0x6d, 0x57, 0x5d, 0x7e, 0xd5, 0x25,\n  0x17, 0x6d, 0xbd, 0xec, 0x82, 0xcb, 0xce, 0x3b, 0x67, 0xd3, 0xf9, 0x9b,\n  0xcf, 0x3f, 0xe3, 0xb4, 0x0d, 0x67, 0x4d, 0x9c, 0xb5, 0xf6, 0xd4, 0x95,\n  0xeb, 0x57, 0xad, 0x5f, 0x76, 0xf2, 0x92, 0x15, 0xe3, 0x2b, 0x16, 0x2d,\n  0x18, 0x5b, 0x3c, 0x6f, 0xf1, 0xf0, 0xe8, 0xf0, 0xe8, 0xc8, 0xdc, 0xd9,\n  0x43, 0xb3, 0x87, 0xe6, 0x0c, 0xf6, 0xf7, 0x66, 0x67, 0xf5, 0xcc, 0xea,\n  0x6c, 0x6f, 0xe9, 0x6e, 0xed, 0x4e, 0x25, 0x9a, 0x32, 0xcd, 0x99, 0xfa,\n  0xda, 0xaa, 0xc6, 0xea, 0xc6, 0x68, 0xb8, 0x22, 0x16, 0x8c, 0xf9, 0x3c,\n  0xce, 0x80, 0x2b, 0x60, 0xb3, 0x18, 0x1d, 0x26, 0x07, 0xcd, 0xc0, 0xa0,\n  0xd7, 0x29, 0x34, 0x0a, 0x16, 0x17, 0x54, 0x34, 0x1a, 0x0f, 0x4b, 0x73,\n  0x04, 0x8b, 0x9a, 0x2c, 0xd3, 0x68, 0xa3, 0xf0, 0xe1, 0x43, 0x62, 0x7c,\n  0x32, 0x87, 0xf4, 0x1b, 0x9e, 0x76, 0x1e, 0x94, 0x7e, 0xe5, 0xd3, 0xce,\n  0x41, 0x81, 0xb5, 0x51, 0x91, 0x2a, 0xfa, 0x4f, 0x9e, 0x3b, 0xec, 0xbd,\n  0x23, 0x94, 0xe3, 0x60, 0x0a, 0x31, 0x13, 0xd2, 0x58, 0xb4, 0x52, 0xe1,\n  0xae, 0xbb, 0xd7, 0x91, 0x15, 0xeb, 0xef, 0x16, 0x86, 0xef, 0x1d, 0xf5,\n  0x78, 0x3c, 0xed, 0xf0, 0xf9, 0x3e, 0x7c, 0x3e, 0x80, 0x8f, 0xf0, 0x15,\n  0xf8, 0xc2, 0x23, 0xf4, 0x68, 0x1e, 0x7c, 0x3d, 0x9f, 0x26, 0x2b, 0x52,\n  0x93, 0xaf, 0xd2, 0x6b, 0xf7, 0xd2, 0x6b, 0x5d, 0xf4, 0xe8, 0x02, 0x7a,\n  0x74, 0x31, 0x3d, 0x0a, 0xc0, 0xd7, 0x6a, 0xe9, 0x6d, 0x0a, 0xe5, 0xf1,\n  0xf5, 0xa9, 0xc9, 0x74, 0x7a, 0xdd, 0x85, 0xf7, 0x92, 0x86, 0xbb, 0xd3,\n  0xeb, 0xd6, 0xa5, 0xef, 0x5e, 0x97, 0x4e, 0x6f, 0x82, 0xeb, 0x1e, 0xa3,\n  0x47, 0xfa, 0x6b, 0x28, 0x1c, 0x0c, 0x14, 0x0e, 0xae, 0xb9, 0x07, 0xfe,\n  0x12, 0x85, 0xb3, 0x93, 0x0e, 0xbb, 0x5f, 0x7c, 0x83, 0xc1, 0xd8, 0x94,\n  0x5e, 0x7f, 0xcf, 0x3d, 0xeb, 0xd3, 0xe9, 0x34, 0xa5, 0x61, 0x5f, 0x25,\n  0x23, 0x68, 0x8c, 0xb3, 0x23, 0x33, 0x6a, 0x66, 0x34, 0xac, 0xd2, 0xa4,\n  0xd7, 0xc8, 0x65, 0x72, 0x6a, 0x86, 0x9c, 0xd1, 0x52, 0x6a, 0x46, 0x66,\n  0x57, 0x41, 0xea, 0xe6, 0xfc, 0xc4, 0x61, 0xd3, 0x13, 0x9e, 0x66, 0x11,\n  0xa4, 0x21, 0x35, 0x53, 0x83, 0xd6, 0x54, 0x8b, 0xd3, 0xd9, 0x92, 0xb2,\n  0x6a, 0xcc, 0x0d, 0x5e, 0x6f, 0x9d, 0x95, 0xb3, 0xab, 0xdd, 0x4e, 0xbe,\n  0x4f, 0xe1, 0x70, 0x69, 0x12, 0x5a, 0xa7, 0x4e, 0xef, 0xd0, 0xc5, 0xa9,\n  0x3c, 0xf2, 0x0e, 0x59, 0x80, 0xba, 0xb9, 0x4a, 0xac, 0x90, 0x5d, 0xf2,\n  0xb4, 0x55, 0x5c, 0x4f, 0xb5, 0x8a, 0xc2, 0x48, 0xc1, 0x1e, 0x39, 0x1b,\n  0xe9, 0x90, 0x0b, 0xe5, 0x18, 0x46, 0x19, 0x05, 0x75, 0x1a, 0xa1, 0xe1,\n  0x9f, 0x69, 0x90, 0x31, 0xe0, 0xb7, 0x34, 0x4f, 0x36, 0x96, 0xc9, 0xc7,\n  0x59, 0x3a, 0x17, 0x9e, 0x26, 0x99, 0x9a, 0x67, 0xd0, 0x23, 0x64, 0xb3,\n  0xe8, 0x5d, 0x06, 0x97, 0x94, 0xd5, 0x4c, 0x59, 0xb0, 0x4a, 0x4d, 0xc9,\n  0x6c, 0xe6, 0x28, 0x53, 0xc7, 0xef, 0x96, 0x8c, 0x90, 0xa2, 0x61, 0x70,\n  0x2d, 0x5d, 0xad, 0xb3, 0x06, 0x02, 0xe4, 0xdb, 0x1d, 0x73, 0x44, 0xfb,\n  0xe0, 0x9a, 0xf2, 0xb5, 0x41, 0x9c, 0xbf, 0x2f, 0x1f, 0x44, 0x2b, 0xf2,\n  0x3f, 0x2f, 0xc9, 0xac, 0x7c, 0x99, 0xcc, 0xba, 0xa2, 0x26, 0xd1, 0xdc,\n  0xd8, 0x1c, 0x67, 0xdf, 0x43, 0x35, 0x71, 0xf8, 0x4e, 0xb0, 0x6f, 0xda,\n  0xbe, 0xc0, 0x23, 0xc6, 0xf2, 0x1f, 0x40, 0xbb, 0x49, 0xbc, 0x47, 0x6c,\n  0x5f, 0xd1, 0x8d, 0xe3, 0x70, 0x6d, 0xa9, 0xbc, 0x79, 0x1d, 0xd4, 0x92,\n  0xdb, 0x45, 0x32, 0x09, 0x1b, 0x0b, 0xce, 0xe7, 0xb0, 0xf5, 0x5b, 0xd2,\n  0xb4, 0x79, 0xd3, 0x16, 0xa9, 0x79, 0xff, 0x28, 0xb5, 0xae, 0x5b, 0x9d,\n  0xd0, 0x3a, 0xf4, 0x3a, 0xa7, 0x2e, 0x2e, 0xe2, 0x5a, 0x2a, 0xf3, 0xf8,\n  0xfb, 0x94, 0xff, 0x67, 0x7d, 0x5a, 0x75, 0x78, 0x97, 0xd2, 0x7e, 0x9b,\n  0x0d, 0x65, 0x7e, 0x87, 0x95, 0x19, 0x45, 0xff, 0x55, 0x92, 0x72, 0x75,\n  0x41, 0xaf, 0x85, 0x95, 0xae, 0xa4, 0xa5, 0x7b, 0xc4, 0x54, 0xaf, 0x65,\n  0x17, 0x09, 0xbb, 0x68, 0x39, 0xfc, 0xc9, 0x69, 0x0f, 0x8d, 0xd3, 0x08,\n  0xe3, 0x14, 0xa0, 0x9d, 0xc8, 0x89, 0x58, 0x05, 0x39, 0xad, 0x0b, 0x0d,\n  0x9d, 0xc0, 0x0c, 0x66, 0x22, 0x64, 0x2f, 0xf5, 0xf1, 0x04, 0xb6, 0xbe,\n  0x4d, 0xce, 0x52, 0x2a, 0x2c, 0x96, 0xe3, 0xa9, 0xcf, 0x58, 0x8e, 0x02,\n  0xe1, 0xe8, 0x2f, 0xd3, 0x94, 0xb1, 0x46, 0x84, 0xa2, 0x11, 0xbf, 0xcf,\n  0xe9, 0x60, 0x2d, 0xa6, 0x38, 0x52, 0x8b, 0x39, 0x68, 0x9f, 0xd1, 0x8b,\n  0x61, 0x31, 0xb8, 0x73, 0xf8, 0x31, 0x6b, 0xaa, 0xd5, 0xe1, 0x68, 0x2d,\n  0x36, 0xe1, 0x53, 0x6a, 0xb7, 0x0b, 0x9a, 0xd0, 0xee, 0xd6, 0x24, 0x74,\n  0x1e, 0xb5, 0xc6, 0xa5, 0x4b, 0x1c, 0xde, 0xa8, 0xdf, 0xb0, 0x64, 0x73,\n  0x0e, 0x47, 0x2e, 0x6b, 0xd1, 0x9a, 0x73, 0x5e, 0x6f, 0xd6, 0x3a, 0x75,\n  0xde, 0x5c, 0x3c, 0x75, 0xde, 0xe4, 0xf3, 0xe8, 0x4b, 0x64, 0x33, 0xfa,\n  0x83, 0xb8, 0xce, 0x73, 0x32, 0x1d, 0x03, 0xb7, 0x43, 0x7f, 0x6c, 0xcc,\n  0x7f, 0x88, 0xf4, 0x28, 0xcc, 0xc6, 0x80, 0xb3, 0x14, 0x86, 0x19, 0x6a,\n  0xa4, 0x13, 0xcd, 0xb0, 0xc6, 0x82, 0x19, 0x96, 0x4f, 0xf0, 0x99, 0xb2,\n  0x64, 0xf6, 0xe1, 0x01, 0x5d, 0x97, 0x7d, 0x20, 0xd1, 0x12, 0x08, 0xb4,\n  0x24, 0x06, 0xec, 0x5d, 0x95, 0x03, 0xa1, 0x9c, 0xba, 0xa9, 0x26, 0x9b,\n  0xad, 0x69, 0x52, 0xe7, 0x42, 0xa2, 0x5c, 0x9c, 0x05, 0xf8, 0x2f, 0xe7,\n  0x7f, 0x85, 0x2c, 0x20, 0xb1, 0xd4, 0xa2, 0x39, 0xac, 0x8c, 0x6e, 0x98,\n  0xa7, 0x48, 0x8b, 0x69, 0x68, 0x58, 0xac, 0xa4, 0x11, 0x14, 0x59, 0x56,\n  0x3c, 0x98, 0xa1, 0x74, 0xf1, 0x80, 0xa6, 0xb8, 0x26, 0xab, 0x38, 0x7a,\n  0x17, 0x44, 0xf9, 0x9a, 0xaa, 0x48, 0xc8, 0xef, 0x75, 0xda, 0x0d, 0x3a,\n  0x8d, 0x0a, 0x64, 0x44, 0x0b, 0xb6, 0xa8, 0x0a, 0x96, 0x3f, 0x49, 0xa7,\n  0x2c, 0x59, 0x79, 0x40, 0x1a, 0xb6, 0x16, 0x82, 0x28, 0xc3, 0x24, 0x2e,\n  0x66, 0xd0, 0x8a, 0xa7, 0x17, 0xb4, 0x78, 0x5c, 0xad, 0x54, 0x45, 0x6f,\n  0x71, 0x7b, 0x33, 0xf0, 0x7b, 0x6f, 0xc0, 0xe5, 0xf1, 0x55, 0x38, 0x9d,\n  0x15, 0x29, 0xfa, 0x05, 0xa2, 0x68, 0xc0, 0x17, 0x8b, 0x65, 0xe2, 0xf1,\n  0x96, 0xaa, 0x2a, 0x6a, 0x00, 0x9e, 0x70, 0xfb, 0xfd, 0xee, 0xb2, 0x0f,\n  0x9b, 0xd7, 0x64, 0x21, 0x5a, 0xc1, 0x19, 0x40, 0x37, 0x3b, 0x45, 0x1c,\n  0xb5, 0x74, 0x88, 0xf8, 0x59, 0x16, 0x9d, 0x4d, 0x6c, 0x82, 0x6e, 0x96,\n  0x61, 0xba, 0xec, 0xbb, 0x98, 0xfa, 0x09, 0x51, 0xab, 0x2f, 0x47, 0x0d,\n  0xc2, 0x5e, 0xaa, 0x62, 0x6e, 0x67, 0x29, 0x69, 0x0f, 0xbf, 0x3d, 0x93,\n  0x89, 0xd6, 0xc2, 0x87, 0x33, 0xe1, 0x4c, 0x82, 0x5f, 0x11, 0x4a, 0x98,\n  0x2f, 0x82, 0x0f, 0x79, 0x73, 0x6b, 0xef, 0xd6, 0x5e, 0x84, 0x85, 0xcb,\n  0xf2, 0x6e, 0x7c, 0x45, 0xfe, 0x7d, 0x20, 0x5b, 0xd2, 0x5c, 0x2d, 0x33,\n  0x16, 0x30, 0xb3, 0xe5, 0x2a, 0xba, 0xe4, 0x81, 0x66, 0x5c, 0xe6, 0x70,\n  0x94, 0x96, 0x56, 0x40, 0x60, 0x96, 0xdd, 0x74, 0xb0, 0x66, 0x20, 0x7c,\n  0xf7, 0x65, 0xa7, 0x3d, 0x58, 0x3d, 0x90, 0x38, 0xf0, 0x9b, 0x15, 0xcb,\n  0xd2, 0x5d, 0x99, 0xce, 0x35, 0x4b, 0xf2, 0x79, 0xe1, 0x32, 0x32, 0x84,\n  0xaf, 0xe0, 0x78, 0xd0, 0xff, 0xfe, 0x0c, 0x5d, 0xd7, 0x2c, 0xda, 0x71,\n  0xb8, 0xe6, 0xa2, 0x1d, 0xe7, 0x10, 0xd9, 0x8c, 0xeb, 0xc8, 0xbe, 0x63,\n  0xb1, 0x2b, 0xe1, 0x60, 0x2a, 0x88, 0xeb, 0x68, 0x90, 0x6d, 0xb2, 0x39,\n  0x41, 0xd7, 0xf0, 0x0e, 0xe5, 0xbf, 0x84, 0xeb, 0xf2, 0xcf, 0x02, 0xec,\n  0xff, 0x41, 0x68, 0xd2, 0x2c, 0xd9, 0x88, 0xcc, 0x45, 0xd8, 0x97, 0x91,\n  0x15, 0xf8, 0x0a, 0xf2, 0x31, 0x48, 0xb6, 0x05, 0x3b, 0x34, 0xd3, 0xf0,\n  0x14, 0x85, 0x35, 0x26, 0x49, 0xc5, 0xa3, 0x99, 0xcf, 0xa9, 0x95, 0xc1,\n  0x81, 0x1c, 0xe1, 0x90, 0x39, 0x1c, 0x2a, 0xd8, 0xa1, 0x31, 0xd5, 0x83,\n  0xc4, 0x18, 0x90, 0x4c, 0x3d, 0xf0, 0x13, 0xb6, 0x90, 0x74, 0x85, 0x76,\n  0xd9, 0xac, 0xd6, 0xf5, 0x6b, 0xd6, 0xb7, 0x76, 0xb4, 0xf2, 0x09, 0xed,\n  0xb2, 0xd9, 0x2d, 0xeb, 0xd6, 0x6c, 0xa0, 0xc7, 0xe4, 0xe3, 0xde, 0x4e,\n  0xb3, 0xd3, 0x1c, 0xf4, 0xf6, 0x75, 0xb0, 0x1f, 0x11, 0x87, 0x4b, 0xc9,\n  0x2d, 0xf8, 0x72, 0x6e, 0xf4, 0xc4, 0xd6, 0x92, 0xb8, 0x29, 0x6b, 0x49,\n  0xb2, 0x9b, 0x0f, 0x40, 0x23, 0xdf, 0xb5, 0x6d, 0xe3, 0x43, 0xb4, 0x91,\n  0xb9, 0xd1, 0x42, 0x2b, 0xb3, 0x72, 0x6e, 0xc9, 0x47, 0xf1, 0xed, 0xa0,\n  0x67, 0x28, 0x50, 0x03, 0x2b, 0x27, 0xcc, 0xe1, 0x42, 0xf0, 0x1c, 0x19,\n  0x9e, 0x41, 0xcb, 0x28, 0xb6, 0xaa, 0x3c, 0x48, 0x75, 0x8c, 0xa0, 0x70,\n  0x0b, 0xd9, 0x71, 0xc9, 0x25, 0x93, 0x17, 0xae, 0xa2, 0x2a, 0x06, 0xb3,\n  0x1b, 0x2c, 0x40, 0x1f, 0xd2, 0xf5, 0x51, 0xca, 0x73, 0x68, 0x5e, 0x57,\n  0x8e, 0x39, 0xf8, 0x39, 0xf8, 0xdc, 0x96, 0xd0, 0x4d, 0x3b, 0xe1, 0x43,\n  0x6e, 0xcd, 0x76, 0x0f, 0xf7, 0xc0, 0x47, 0xa4, 0xfb, 0x1b, 0x60, 0x2c,\n  0xdf, 0x4a, 0x7e, 0x06, 0x02, 0x55, 0x41, 0x1f, 0x21, 0x54, 0xa5, 0x9e,\n  0xd6, 0x99, 0x96, 0x62, 0xb1, 0x16, 0xe6, 0x9f, 0x7a, 0xeb, 0xae, 0x8b,\n  0x42, 0x3b, 0xef, 0x23, 0x77, 0xf4, 0x76, 0x0f, 0x4d, 0x91, 0x07, 0x8e,\n  0x9b, 0x5f, 0x59, 0xfe, 0x19, 0xbf, 0x22, 0x23, 0x33, 0x31, 0xac, 0xa9,\n  0xbc, 0xe3, 0xbf, 0x8f, 0x9d, 0x77, 0x70, 0xc7, 0xc2, 0x3b, 0xb8, 0x32,\n  0xde, 0xe1, 0x90, 0x71, 0x72, 0x71, 0x61, 0x95, 0x1d, 0x94, 0x56, 0x5b,\n  0x24, 0xe6, 0x21, 0x63, 0xde, 0xa4, 0x1c, 0x63, 0x00, 0x5c, 0x91, 0x01,\n  0x14, 0x9f, 0xb1, 0x1c, 0x0d, 0xc4, 0xd1, 0xdf, 0x3e, 0x0e, 0xee, 0x21,\n  0xa7, 0x27, 0xb4, 0x25, 0x13, 0x62, 0xf4, 0xd6, 0xc4, 0x74, 0xee, 0x81,\n  0x2f, 0x62, 0xec, 0x43, 0xee, 0x38, 0x1a, 0xfb, 0x70, 0x4d, 0x67, 0x1f,\n  0x30, 0x57, 0x27, 0xdf, 0x23, 0xa7, 0xe7, 0xf3, 0xe4, 0xcf, 0x28, 0x86,\n  0x87, 0x85, 0xc7, 0xd1, 0x5c, 0x6a, 0xc7, 0x9e, 0x7c, 0x0c, 0x38, 0x84,\n  0x91, 0x72, 0x92, 0xb9, 0x30, 0x65, 0x9f, 0xc4, 0xf8, 0x09, 0x3d, 0x9d,\n  0xba, 0x58, 0xf8, 0x31, 0x39, 0x0f, 0xc7, 0xc8, 0xb3, 0x40, 0x13, 0x9c,\n  0x33, 0xae, 0xb7, 0x2b, 0x9c, 0xb5, 0x38, 0x68, 0x0b, 0xc2, 0x73, 0x23,\n  0x93, 0x4f, 0x91, 0x67, 0x7b, 0x28, 0x0f, 0x92, 0x93, 0xb3, 0x71, 0x03,\n  0xf9, 0x06, 0x56, 0xe0, 0xe1, 0x9f, 0x4e, 0xe3, 0x4f, 0xc2, 0x4f, 0xc9,\n  0xd9, 0x48, 0x01, 0xf7, 0x78, 0x28, 0xfb, 0x19, 0x54, 0x7e, 0x97, 0xcb,\n  0xf7, 0x92, 0xf3, 0xd1, 0x8b, 0x5c, 0x18, 0x64, 0x2b, 0x1b, 0x0a, 0xa2,\n  0xdd, 0xe2, 0x08, 0xa8, 0x82, 0xd6, 0x56, 0x9b, 0xb1, 0x1c, 0xeb, 0xa0,\n  0x35, 0x09, 0x74, 0x2a, 0x3d, 0x21, 0xe2, 0xc9, 0xb8, 0x78, 0xdb, 0x07,\n  0x23, 0x9d, 0x93, 0x8f, 0x13, 0x9a, 0xa6, 0x50, 0xcc, 0xbc, 0x2c, 0x97,\n  0x73, 0xab, 0x94, 0x32, 0x50, 0xd4, 0xe4, 0xdc, 0x3c, 0x4f, 0xb6, 0x96,\n  0xe6, 0x76, 0xc2, 0x44, 0xbe, 0x8d, 0x67, 0xf1, 0x93, 0x39, 0x10, 0x20,\n  0xe5, 0x88, 0x0a, 0x8e, 0x65, 0xcf, 0xcb, 0x56, 0x29, 0x99, 0x04, 0x39,\n  0x9e, 0xf5, 0x38, 0xec, 0xd4, 0x4e, 0xe3, 0xf3, 0xd8, 0x83, 0x8e, 0xa0,\n  0xd6, 0xa6, 0xb5, 0x99, 0x8c, 0xa2, 0x7d, 0x46, 0x55, 0xb2, 0x5e, 0x94,\n  0x5c, 0x41, 0x68, 0x77, 0xb1, 0x81, 0xce, 0x97, 0x5d, 0xdd, 0x65, 0x75,\n  0xbb, 0xad, 0x66, 0xaf, 0xf7, 0xd7, 0x1a, 0x0f, 0xbf, 0xd2, 0x98, 0xf6,\n  0x9d, 0x67, 0xf1, 0x78, 0xa8, 0x91, 0x86, 0xbc, 0x42, 0x8d, 0x2d, 0xd4,\n  0xe8, 0xd2, 0xab, 0xf5, 0x2f, 0x0c, 0xa9, 0x03, 0x0b, 0xc3, 0x8a, 0xc2,\n  0x15, 0xa8, 0xff, 0x22, 0xa8, 0xff, 0x57, 0x8a, 0xf5, 0xdf, 0x53, 0x56,\n  0x7f, 0x2b, 0x96, 0x21, 0x03, 0x75, 0xae, 0xa1, 0xf5, 0x87, 0x13, 0x4e,\n  0x3c, 0x91, 0xea, 0xef, 0x07, 0xd4, 0x31, 0x65, 0xad, 0x9c, 0x82, 0x2e,\n  0xf1, 0x82, 0x9c, 0x32, 0xa1, 0x64, 0x5c, 0x56, 0xce, 0xb8, 0xac, 0x27,\n  0x5b, 0x57, 0xaa, 0xb8, 0xd4, 0x12, 0xf4, 0x0d, 0x39, 0x90, 0x5f, 0x5c,\n  0xf6, 0x3c, 0x8d, 0xd0, 0x2b, 0x93, 0x1f, 0x53, 0x0b, 0x94, 0xd9, 0x9f,\n  0xd8, 0x0c, 0xa7, 0x12, 0x4e, 0xaa, 0xdc, 0x2a, 0x75, 0x09, 0xd4, 0xde,\n  0x0c, 0xad, 0xb0, 0x54, 0xe9, 0xd6, 0xd4, 0x78, 0x33, 0xc6, 0x3a, 0xa9,\n  0x05, 0xb8, 0x70, 0xc1, 0xe4, 0xa4, 0x08, 0x2d, 0xf4, 0x6b, 0xc3, 0x0b,\n  0x03, 0xea, 0xde, 0x32, 0x23, 0x14, 0x16, 0x4e, 0x21, 0xcb, 0xf1, 0x97,\n  0x89, 0x00, 0xf2, 0x44, 0x35, 0xa3, 0x3b, 0x7e, 0xbd, 0x0a, 0xe8, 0x30,\n  0xa1, 0xf1, 0xfc, 0x80, 0x32, 0x6f, 0xa7, 0x62, 0x2b, 0xb5, 0xa7, 0x58,\n  0x90, 0xc5, 0x6e, 0x2b, 0xd8, 0x53, 0x2c, 0xe5, 0x42, 0x56, 0xaa, 0x8b,\n  0xcb, 0xc4, 0x23, 0x67, 0x5f, 0x3f, 0xa7, 0x63, 0xf9, 0x33, 0x63, 0x8b,\n  0x9f, 0x5f, 0xda, 0x5e, 0xb3, 0x7e, 0xc3, 0x29, 0x01, 0x22, 0x58, 0xe3,\n  0x69, 0xb7, 0xda, 0xda, 0xe8, 0xf5, 0x36, 0x5a, 0xd5, 0xfa, 0xca, 0xea,\n  0x6a, 0xa3, 0x48, 0x2b, 0xcb, 0x69, 0xab, 0x0c, 0x51, 0xda, 0x2a, 0x92,\n  0xd6, 0xd8, 0xe0, 0x4d, 0xa1, 0x2d, 0x3b, 0xe1, 0x43, 0x16, 0x0c, 0x77,\n  0x67, 0x7b, 0xe0, 0x53, 0xa0, 0xad, 0xcb, 0x81, 0xb6, 0xfe, 0x6e, 0x0a,\n  0x6d, 0x95, 0xc2, 0xf6, 0x1e, 0x81, 0xb6, 0x52, 0xcf, 0xee, 0x5b, 0xef,\n  0xdb, 0x19, 0xba, 0x68, 0x17, 0x59, 0x3e, 0xd4, 0x0d, 0xbc, 0x3e, 0x6f,\n  0xcf, 0x57, 0xa0, 0x3f, 0x00, 0xb4, 0x00, 0x9a, 0x60, 0x30, 0x34, 0x46,\n  0x03, 0x0d, 0x42, 0x47, 0x3b, 0x71, 0x58, 0x24, 0x41, 0x01, 0x36, 0xd3,\n  0x36, 0xd1, 0xb5, 0x5a, 0xb8, 0xbc, 0xb1, 0x94, 0x4f, 0x7a, 0x15, 0x4b,\n  0xe6, 0x07, 0x5d, 0xea, 0x97, 0x7c, 0xaf, 0x8e, 0xf0, 0xc0, 0x78, 0x56,\n  0x65, 0x0e, 0xd7, 0x86, 0x43, 0x2c, 0x3f, 0x2a, 0xc5, 0x23, 0x9c, 0xe0,\n  0x0b, 0x6c, 0x93, 0x06, 0x48, 0xcf, 0x48, 0xe9, 0xdd, 0x24, 0x96, 0xba,\n  0xb3, 0xab, 0xa1, 0x22, 0x1c, 0x68, 0xac, 0xaa, 0x76, 0x39, 0xdd, 0x01,\n  0xbb, 0xad, 0xaa, 0xa9, 0xad, 0x29, 0x92, 0xa9, 0xaf, 0xb6, 0xc7, 0xea,\n  0x8d, 0xdd, 0x67, 0x98, 0x6d, 0x5e, 0x9b, 0xc7, 0x66, 0xf7, 0x28, 0xea,\n  0xd4, 0xad, 0x35, 0x0d, 0x19, 0x87, 0xdf, 0x51, 0x15, 0x61, 0x6d, 0x41,\n  0x7d, 0x74, 0x76, 0x4f, 0x6b, 0x0b, 0xba, 0x25, 0x68, 0x2a, 0x91, 0x28,\n  0xb5, 0x05, 0x97, 0x80, 0x86, 0x0d, 0x4b, 0x7c, 0xe6, 0x41, 0xc6, 0x67,\n  0x26, 0x7f, 0x4d, 0x46, 0x80, 0x16, 0xfd, 0x02, 0xa8, 0x8f, 0xc4, 0x93,\n  0x09, 0x4d, 0xbf, 0x46, 0x65, 0x83, 0xf5, 0x88, 0x8a, 0x52, 0x74, 0x55,\n  0x95, 0x26, 0xdd, 0xc5, 0x6c, 0xf1, 0x41, 0x8f, 0xf4, 0xa0, 0xd4, 0x99,\n  0x14, 0x92, 0xf1, 0x1b, 0xa7, 0x82, 0x45, 0xb1, 0x07, 0xa4, 0xc4, 0xc9,\n  0x5f, 0xe3, 0xa8, 0xa2, 0xb9, 0xaa, 0x32, 0x2e, 0x6f, 0x95, 0xcd, 0xed,\n  0x5b, 0x13, 0x25, 0x7b, 0x7b, 0x1a, 0xc2, 0xa1, 0xc6, 0xfe, 0x91, 0xf9,\n  0x48, 0xc2, 0x77, 0x21, 0xe0, 0x3b, 0x95, 0x2f, 0x1e, 0xce, 0x8e, 0xcb,\n  0xf1, 0x85, 0x71, 0x10, 0x96, 0xfa, 0xee, 0x67, 0xac, 0xef, 0x84, 0x3b,\n  0x89, 0x2b, 0xdf, 0xc1, 0xa9, 0x91, 0x09, 0xd5, 0x31, 0x18, 0x41, 0x39,\n  0x8b, 0xfb, 0x62, 0xd0, 0xc3, 0x28, 0x1d, 0x2c, 0x5b, 0x07, 0xa6, 0xdd,\n  0x33, 0x2f, 0x12, 0x2c, 0xca, 0x4b, 0x49, 0x90, 0x65, 0x52, 0xc5, 0xe4,\n  0xe4, 0xb1, 0x74, 0x5a, 0xf8, 0x5b, 0xa3, 0xc7, 0xa2, 0xf5, 0x5b, 0x1a,\n  0x33, 0xa9, 0xba, 0xba, 0x50, 0x94, 0xdc, 0xdd, 0xcc, 0xb7, 0xcb, 0xe4,\n  0xc9, 0x86, 0xaa, 0x41, 0xbf, 0xbe, 0x82, 0xc5, 0xfb, 0xce, 0xbf, 0x96,\n  0xaf, 0x43, 0x71, 0x90, 0x09, 0x63, 0x05, 0x99, 0xc9, 0x02, 0xf2, 0x8a,\n  0x19, 0xd8, 0x0b, 0xcb, 0x8c, 0x0e, 0xfd, 0x8c, 0x0f, 0xf3, 0x80, 0x08,\n  0x44, 0x1a, 0xca, 0x3c, 0x20, 0x68, 0xf2, 0x0c, 0xba, 0xc2, 0x21, 0xfe,\n  0x16, 0xd2, 0xa3, 0xd3, 0x20, 0xef, 0xd2, 0x12, 0x08, 0x4b, 0x4c, 0x55,\n  0xb7, 0xd8, 0x0d, 0x7f, 0x1e, 0xaf, 0xd3, 0x61, 0x93, 0xa9, 0x83, 0xc6,\n  0x84, 0xcb, 0xe5, 0x80, 0x3f, 0xab, 0xf3, 0x50, 0x40, 0xa3, 0xe1, 0x65,\n  0x0a, 0x99, 0x4a, 0xad, 0xd6, 0x69, 0xe4, 0x4a, 0xb5, 0x47, 0xa6, 0xf2,\n  0x1b, 0x8d, 0x20, 0x17, 0xc9, 0x55, 0xa0, 0x42, 0x00, 0xc9, 0xa4, 0x12,\n  0x93, 0x68, 0xd3, 0x5f, 0x89, 0x9e, 0x26, 0x1f, 0x42, 0x9b, 0xa4, 0x19,\n  0x9e, 0xb5, 0x34, 0xf8, 0x37, 0x07, 0x02, 0x15, 0x91, 0x33, 0x45, 0x6a,\n  0x82, 0xba, 0x4a, 0xae, 0xa6, 0x32, 0xf1, 0x7c, 0x8c, 0x0c, 0x7a, 0x2d,\n  0xa8, 0x1f, 0x72, 0x1a, 0x71, 0x1d, 0xfa, 0xb1, 0x40, 0x51, 0x15, 0x52,\n  0xc2, 0x24, 0x2b, 0xcb, 0xf3, 0x91, 0xb0, 0x3d, 0x9e, 0x98, 0x3f, 0x58,\n  0x99, 0xea, 0xcc, 0x26, 0xbd, 0x7d, 0x4b, 0x5a, 0x94, 0x64, 0x8f, 0xcf,\n  0x97, 0x4e, 0x19, 0x5a, 0xbd, 0x9e, 0x2e, 0xca, 0x43, 0x9e, 0x01, 0x1a,\n  0x31, 0x1f, 0x68, 0x44, 0x0c, 0xcf, 0x11, 0xae, 0xa7, 0xc6, 0x55, 0x3c,\n  0xe7, 0x03, 0x84, 0x64, 0xc2, 0x67, 0x70, 0x5d, 0xcd, 0x65, 0x80, 0x7e,\n  0x3a, 0x50, 0x18, 0x35, 0xa2, 0x45, 0x0c, 0x1b, 0x3a, 0x39, 0x39, 0x98,\n  0x15, 0x13, 0x2a, 0xa0, 0x86, 0x20, 0x4c, 0xf3, 0x58, 0xae, 0x51, 0xa8,\n  0x39, 0x9a, 0xcb, 0x85, 0x5e, 0x02, 0xc9, 0x5a, 0xc9, 0x24, 0xeb, 0x68,\n  0xc4, 0xe5, 0xd4, 0x01, 0xd9, 0xab, 0xad, 0x8e, 0x34, 0x46, 0x1b, 0x03,\n  0x3e, 0x67, 0xd8, 0x15, 0xb6, 0x98, 0xb4, 0x0e, 0x9d, 0x43, 0x24, 0x7e,\n  0xda, 0x82, 0x20, 0x58, 0x46, 0xe8, 0x4b, 0xb9, 0x69, 0xac, 0xf6, 0x72,\n  0x06, 0x10, 0x2c, 0xf7, 0x01, 0x8e, 0x77, 0x75, 0x37, 0xc7, 0xbb, 0xbb,\n  0xe3, 0x9e, 0x8a, 0xa0, 0xdb, 0x1d, 0xac, 0x78, 0xc5, 0xea, 0x72, 0x59,\n  0x6d, 0x2e, 0x17, 0x7e, 0x00, 0xbe, 0x6c, 0x40, 0x23, 0xc9, 0xf2, 0xf6,\n  0x78, 0xbc, 0xad, 0x2d, 0x1e, 0x6f, 0x6f, 0xae, 0xf0, 0x7a, 0x82, 0x41,\n  0x8f, 0xb7, 0x42, 0xe6, 0x76, 0x79, 0x9d, 0x6e, 0xb7, 0xcb, 0x5d, 0xf8,\n  0x65, 0xba, 0x96, 0x97, 0x9c, 0x82, 0x3e, 0xe1, 0x06, 0x90, 0x13, 0x6a,\n  0xd7, 0x50, 0xa8, 0x5d, 0x9d, 0xc7, 0xc0, 0x01, 0xed, 0x66, 0x04, 0x92,\n  0x7a, 0xbc, 0x13, 0xf9, 0x84, 0x5a, 0xa1, 0x92, 0x12, 0x07, 0xd0, 0x03,\n  0x10, 0xab, 0xa9, 0x16, 0x26, 0xa3, 0x35, 0x74, 0xbb, 0x58, 0xfd, 0x1a,\n  0xa2, 0x0d, 0x01, 0x9f, 0x2b, 0xec, 0x86, 0xfa, 0xe9, 0x34, 0x50, 0x3b,\n  0x27, 0x76, 0x6a, 0xca, 0x56, 0x51, 0x14, 0xa5, 0x24, 0xf5, 0x8e, 0xc2,\n  0x90, 0x55, 0x44, 0xe3, 0x99, 0x42, 0x2a, 0x33, 0xb9, 0x54, 0x6b, 0x20,\n  0xfd, 0xe7, 0x54, 0xa5, 0xed, 0xb6, 0x4c, 0x24, 0xde, 0xd3, 0x9d, 0x8c,\n  0x66, 0xec, 0xd6, 0x74, 0x55, 0xbc, 0xdb, 0x17, 0x17, 0xfe, 0xd1, 0x50,\n  0x65, 0xad, 0xf2, 0x04, 0x22, 0x21, 0x4c, 0xfc, 0xd1, 0x68, 0x45, 0x6d,\n  0x8d, 0xb5, 0x86, 0x9c, 0x52, 0x17, 0xf0, 0xd4, 0x77, 0xa7, 0x9a, 0x7a,\n  0xab, 0x83, 0xbe, 0xba, 0x6c, 0x32, 0x90, 0x0a, 0x26, 0xfa, 0x43, 0xc1,\n  0x2a, 0x9f, 0xa7, 0x8a, 0x54, 0xf9, 0x7c, 0xb1, 0xbe, 0xa0, 0x48, 0x53,\n  0x6e, 0x85, 0x39, 0x7a, 0x3a, 0x37, 0x1b, 0xc6, 0x92, 0x44, 0x0f, 0x8c,\n  0x3a, 0xad, 0x5c, 0x86, 0x15, 0x47, 0x34, 0x5a, 0x98, 0x90, 0xc9, 0x59,\n  0x72, 0xd9, 0x4b, 0x33, 0xd7, 0x0d, 0x9e, 0xf1, 0x23, 0x9a, 0x21, 0xdb,\n  0x65, 0xaa, 0xb3, 0x87, 0x9a, 0x4d, 0x46, 0x63, 0x3c, 0xe4, 0xac, 0x33,\n  0x70, 0xb3, 0x6f, 0xd5, 0x00, 0x05, 0x72, 0x24, 0x3d, 0x9e, 0xa4, 0x23,\n  0xcc, 0x3b, 0xd5, 0xb7, 0xb2, 0x76, 0x3d, 0x9b, 0x6c, 0x41, 0xbb, 0xb8,\n  0x8b, 0x0b, 0xe3, 0x86, 0x95, 0xcb, 0xb0, 0xa1, 0x9c, 0x11, 0x46, 0x31,\n  0xa5, 0xad, 0x34, 0xe3, 0x7c, 0x81, 0xb8, 0x46, 0xe8, 0x5f, 0xa8, 0x40,\n  0x59, 0xcb, 0x93, 0xc5, 0xf2, 0x65, 0xc7, 0x99, 0xb2, 0xe3, 0x06, 0xd6,\n  0xd1, 0xd0, 0xeb, 0x2b, 0x59, 0xd7, 0xdb, 0xac, 0xae, 0x57, 0x0b, 0x57,\n  0xb8, 0xd9, 0x52, 0x4f, 0xef, 0x98, 0xda, 0xe3, 0x6e, 0x71, 0x4d, 0x26,\n  0x0e, 0x32, 0xf1, 0x1b, 0xcc, 0xd7, 0xc4, 0x81, 0x94, 0xcf, 0xd8, 0x4c,\n  0x2a, 0x39, 0x89, 0xd7, 0xf2, 0x25, 0x15, 0x3d, 0x23, 0x2f, 0x3b, 0x0e,\n  0xa4, 0x52, 0xe1, 0x64, 0x26, 0x98, 0x81, 0xef, 0x14, 0x56, 0x27, 0x53,\n  0x20, 0x4c, 0x06, 0xd3, 0x70, 0x92, 0x5e, 0x05, 0x37, 0x52, 0xec, 0x46,\n  0x2a, 0x15, 0x2c, 0x3b, 0x16, 0xf5, 0x22, 0xa3, 0xf0, 0x19, 0xfe, 0x63,\n  0xfe, 0x5b, 0xa8, 0x07, 0xf5, 0xb2, 0xba, 0xb7, 0x80, 0xa2, 0x8e, 0xd4,\n  0x4a, 0x02, 0xd2, 0x81, 0x62, 0x02, 0x84, 0x5b, 0xb9, 0x1c, 0x8f, 0xd3,\n  0x14, 0x95, 0xf2, 0x55, 0x5a, 0x8d, 0x8a, 0x26, 0x1d, 0x90, 0x53, 0x5a,\n  0xdc, 0x83, 0x7a, 0xba, 0x3a, 0x5a, 0xd2, 0xd0, 0x12, 0x16, 0xd6, 0x20,\n  0x3a, 0x5d, 0x40, 0x24, 0x75, 0x5d, 0x1c, 0x30, 0x1a, 0x8e, 0x86, 0xed,\n  0x2f, 0xfd, 0xda, 0x25, 0xe5, 0x49, 0xcf, 0x01, 0xcf, 0xe1, 0x4a, 0xbf,\n  0xd0, 0x57, 0x82, 0x91, 0xe8, 0x03, 0xe9, 0xda, 0x8a, 0x9a, 0x80, 0xdb,\n  0x67, 0x73, 0x7a, 0x2c, 0xce, 0xea, 0x48, 0xa4, 0xda, 0x69, 0x75, 0x3b,\n  0x6d, 0x3e, 0x77, 0xa0, 0xae, 0x22, 0xd9, 0xee, 0xe5, 0x52, 0x7c, 0x55,\n  0xa5, 0xc3, 0xef, 0xf2, 0xd7, 0x85, 0x2b, 0xeb, 0x5c, 0x16, 0xa7, 0xcd,\n  0xe6, 0xb4, 0xb8, 0x6b, 0x2b, 0x43, 0xf5, 0x7e, 0xb7, 0xdf, 0xe1, 0x09,\n  0x9b, 0x61, 0xe6, 0xbb, 0x7b, 0xbb, 0xab, 0x7d, 0x35, 0x35, 0xbe, 0xf2,\n  0x4f, 0xc7, 0xd2, 0xc6, 0xb6, 0x85, 0xd3, 0x2f, 0xd6, 0xf6, 0x88, 0x6b,\n  0xcf, 0x07, 0xf3, 0x6e, 0x94, 0xce, 0xff, 0x16, 0xa9, 0x0a, 0x3e, 0x0b,\n  0xaa, 0x42, 0xfc, 0x2e, 0x89, 0x91, 0x8b, 0x14, 0xbc, 0xc4, 0x0c, 0x0a,\n  0xde, 0x41, 0x30, 0x25, 0x92, 0x2d, 0xfd, 0x56, 0xcb, 0x6f, 0x92, 0xb5,\n  0x67, 0xae, 0x70, 0xbb, 0x40, 0x28, 0xc9, 0x9f, 0x0b, 0xb0, 0x76, 0x32,\n  0x58, 0x96, 0x02, 0x57, 0xb0, 0xa8, 0xd8, 0x2e, 0x52, 0x4e, 0x1c, 0xb1,\n  0xb4, 0xf1, 0x0a, 0xae, 0x41, 0x16, 0x9b, 0xa5, 0xe4, 0x63, 0x50, 0x84,\n  0x59, 0x82, 0x5e, 0x91, 0x68, 0x05, 0xe8, 0x5f, 0x49, 0x66, 0xfa, 0x2d,\n  0xc5, 0x32, 0x5a, 0x0b, 0x65, 0xe1, 0xfc, 0x1e, 0x18, 0x0f, 0x8b, 0x50,\n  0x15, 0x50, 0x58, 0x17, 0x2b, 0x49, 0x2f, 0xc9, 0x01, 0x78, 0x4b, 0x49,\n  0x39, 0xcf, 0x24, 0xb8, 0xb0, 0x3f, 0x73, 0x65, 0xa6, 0x4a, 0xf8, 0x1d,\n  0xab, 0xeb, 0xbe, 0xbc, 0x83, 0xbd, 0xa3, 0x2b, 0xf9, 0x67, 0x10, 0x78,\n  0x67, 0x9a, 0xf3, 0x83, 0x35, 0x5a, 0x5c, 0xb7, 0xcd, 0x24, 0xf8, 0x92,\n  0x28, 0x97, 0xf0, 0x67, 0x96, 0xf0, 0x5e, 0xab, 0xcd, 0xe3, 0xb6, 0x54,\n  0x7d, 0x4b, 0x6b, 0x71, 0x7b, 0xdd, 0x5e, 0x2f, 0xdb, 0x5b, 0x90, 0x4f,\n  0x90, 0x53, 0xd1, 0x9b, 0x5c, 0x2f, 0x1b, 0x9b, 0xa5, 0x95, 0x2f, 0xca,\n  0x4d, 0x99, 0x6a, 0x24, 0x69, 0x87, 0x56, 0xbb, 0xd5, 0x52, 0xb6, 0x00,\n  0x0f, 0xbc, 0xda, 0x66, 0xa5, 0x83, 0x21, 0x6a, 0xa5, 0x9a, 0x74, 0x2a,\n  0x49, 0x4d, 0x17, 0x6f, 0xb9, 0xdc, 0xf1, 0xa6, 0xa6, 0x38, 0x90, 0xa7,\n  0x3b, 0x0b, 0x47, 0xe4, 0xff, 0x63, 0xed, 0x3d, 0xe0, 0xab, 0x28, 0xba,\n  0xc7, 0xef, 0xd9, 0xdd, 0x7b, 0x73, 0x93, 0x90, 0x84, 0xf4, 0xde, 0x3b,\n  0x24, 0x40, 0x42, 0x08, 0x09, 0xa1, 0x85, 0xde, 0x42, 0x0a, 0x10, 0x7a,\n  0x0b, 0x2d, 0x20, 0x45, 0x40, 0x44, 0xaa, 0x82, 0x48, 0x47, 0x45, 0x40,\n  0xc5, 0x0a, 0x0a, 0xfa, 0x80, 0x8d, 0x2e, 0x2d, 0x02, 0x22, 0x22, 0x22,\n  0x16, 0xec, 0x22, 0x0a, 0x76, 0x1e, 0x45, 0x45, 0x45, 0x45, 0x84, 0xbb,\n  0xff, 0xef, 0xcc, 0xdd, 0x1b, 0x42, 0x89, 0x3e, 0xbf, 0xf7, 0xf3, 0xaa,\n  0xc7, 0xd9, 0x3b, 0x73, 0xe6, 0xf4, 0x99, 0x39, 0x33, 0x5b, 0xf2, 0x5e,\n  0x7c, 0x41, 0x68, 0x56, 0x61, 0xab, 0xc6, 0x61, 0x05, 0xb1, 0x71, 0xcd,\n  0xc2, 0xb2, 0x98, 0x40, 0xc3, 0xd4, 0xdf, 0xf8, 0xb1, 0x39, 0xf7, 0xea,\n  0xc3, 0xb5, 0xf6, 0x16, 0x5f, 0x39, 0xcf, 0x5b, 0x23, 0xd6, 0x61, 0x93,\n  0x7f, 0x55, 0x14, 0xee, 0xea, 0x02, 0xfe, 0xf2, 0x70, 0xc1, 0x92, 0x40,\n  0xfe, 0x1b, 0xe4, 0xe9, 0x1b, 0x6b, 0x2d, 0xc6, 0x37, 0x96, 0xc2, 0x5e,\n  0x4b, 0xbd, 0x73, 0x6f, 0xb5, 0x50, 0x8b, 0xdd, 0x57, 0x97, 0x7f, 0xfe,\n  0x1f, 0x45, 0x8e, 0xbb, 0x41, 0x9d, 0x69, 0x9a, 0x39, 0x66, 0xa0, 0x38,\n  0x66, 0xfe, 0x6a, 0x38, 0x7c, 0xc2, 0x85, 0xb8, 0xb4, 0xc9, 0xba, 0x17,\n  0xbf, 0xa9, 0xfa, 0x79, 0x82, 0x87, 0xf4, 0xd1, 0xe2, 0x1e, 0xa3, 0xa3,\n  0xd6, 0xc9, 0x16, 0x64, 0xce, 0xd1, 0xc7, 0x45, 0xbf, 0x19, 0xf1, 0xb0,\n  0xf5, 0x9e, 0xd5, 0xb8, 0x6a, 0x9c, 0xa7, 0xc1, 0x99, 0x65, 0x3c, 0xaa,\n  0x75, 0x12, 0x1d, 0x6a, 0xc5, 0x79, 0x52, 0xf7, 0x11, 0x77, 0x19, 0x8f,\n  0x6b, 0x9d, 0xb4, 0xdb, 0xcd, 0x59, 0xb5, 0xe2, 0x8c, 0x16, 0x13, 0x15,\n  0xaf, 0x28, 0x73, 0x69, 0x2d, 0x38, 0x87, 0xf4, 0x71, 0x62, 0xac, 0xa4,\n  0x23, 0xba, 0x98, 0x2f, 0x5d, 0xc1, 0xd1, 0x6a, 0xe2, 0xec, 0x00, 0x67,\n  0x88, 0x94, 0xc7, 0xab, 0x4a, 0x5e, 0xdf, 0x10, 0x67, 0xb6, 0x9e, 0x2e,\n  0x66, 0xb0, 0x86, 0x55, 0x8a, 0x1e, 0xe6, 0x9d, 0x2e, 0x1c, 0xad, 0x93,\n  0x4f, 0xa8, 0xf9, 0xac, 0xbe, 0x48, 0xe1, 0x07, 0x56, 0xf3, 0xdd, 0xa2,\n  0xd3, 0x71, 0x91, 0xb5, 0x6f, 0x44, 0x57, 0x1f, 0x74, 0x45, 0x46, 0xd1,\n  0xb3, 0x56, 0x5d, 0x5f, 0x01, 0xa7, 0x4c, 0xca, 0x68, 0x6b, 0x6b, 0xbe,\n  0x53, 0x0b, 0xff, 0x49, 0xf0, 0xbf, 0xd9, 0x68, 0x0b, 0xff, 0xbe, 0xe6,\n  0x1d, 0x35, 0xf8, 0xaf, 0xb9, 0xc2, 0xdf, 0xc2, 0x97, 0xaf, 0x23, 0x5c,\n  0xe1, 0x3f, 0x18, 0xdd, 0x5e, 0x34, 0xda, 0xc1, 0xbf, 0xbf, 0xd9, 0xaf,\n  0x16, 0xda, 0x4f, 0x60, 0xc7, 0x11, 0xc6, 0x72, 0x70, 0x9e, 0x36, 0x97,\n  0x5d, 0xc1, 0xb1, 0xd5, 0xc4, 0x79, 0x04, 0x9c, 0x19, 0x0a, 0x67, 0x97,\n  0x5b, 0xff, 0xeb, 0x70, 0xd6, 0x81, 0x73, 0xb3, 0xc2, 0xd9, 0xe7, 0x96,\n  0xd1, 0xfa, 0xcb, 0xeb, 0x57, 0x70, 0x1e, 0xd4, 0xde, 0x11, 0x63, 0xf4,\n  0x89, 0x86, 0xa3, 0xce, 0x2e, 0x86, 0xe2, 0x5a, 0x4b, 0x96, 0xb5, 0xee,\n  0x76, 0xe7, 0x57, 0xda, 0x11, 0x4d, 0xfd, 0x3d, 0x1b, 0x47, 0xaa, 0xb3,\n  0xca, 0xf5, 0xfc, 0xbc, 0x73, 0xb3, 0x99, 0xa6, 0x95, 0x98, 0xc7, 0x58,\n  0x32, 0xd3, 0xd5, 0x88, 0x89, 0x51, 0x33, 0xd2, 0x82, 0x1a, 0xaf, 0xb3,\n  0xc8, 0x1c, 0xad, 0x8c, 0xf9, 0xbc, 0x7a, 0x86, 0xb2, 0x27, 0x59, 0xb3,\n  0xb4, 0x75, 0x53, 0x5e, 0x2b, 0x69, 0x6b, 0x6f, 0xd2, 0xbd, 0x7f, 0x66,\n  0xfb, 0x69, 0xc5, 0x1e, 0x6d, 0xbc, 0x9f, 0x7d, 0x64, 0xd8, 0x8a, 0xf2,\n  0x4f, 0x62, 0x53, 0x82, 0x3d, 0x7d, 0xd2, 0x33, 0xca, 0x4b, 0xe3, 0x3b,\n  0xbb, 0xd6, 0xac, 0x41, 0x66, 0xa8, 0x58, 0x67, 0xfe, 0xc9, 0xe8, 0x6c,\n  0x24, 0x2a, 0x14, 0xa7, 0xde, 0xf2, 0x8b, 0xb4, 0x41, 0x6c, 0x42, 0x3d,\n  0x34, 0xbb, 0x11, 0xa7, 0x79, 0xd8, 0x33, 0x34, 0xd6, 0x91, 0xa2, 0xfa,\n  0x6c, 0x46, 0xbb, 0x05, 0x6a, 0x5a, 0xd7, 0x58, 0xcd, 0xd1, 0xc5, 0x7a,\n  0x1b, 0x53, 0xfd, 0xb9, 0x39, 0xbb, 0xae, 0x9e, 0xa4, 0x70, 0x78, 0xf4,\n  0x93, 0x3b, 0x75, 0x07, 0x99, 0x9a, 0xfc, 0x1b, 0x5d, 0x15, 0xc2, 0xe1,\n  0xe1, 0x70, 0xad, 0xbe, 0xac, 0x3a, 0xee, 0xd1, 0xec, 0xfa, 0x0b, 0xab,\n  0x24, 0xd7, 0x32, 0x5d, 0x09, 0xb5, 0xfe, 0x0a, 0xa7, 0x5c, 0x8b, 0x6b,\n  0xa9, 0xf7, 0x89, 0x48, 0xac, 0x1b, 0x54, 0x2f, 0x20, 0xb1, 0x71, 0x70,\n  0x5a, 0x7c, 0x78, 0xb2, 0x5f, 0x70, 0x7a, 0x40, 0x52, 0x36, 0x97, 0xae,\n  0xda, 0x84, 0x9c, 0xea, 0x5a, 0x89, 0x50, 0x56, 0xc7, 0x11, 0x16, 0x50,\n  0x90, 0xec, 0xe9, 0xeb, 0xed, 0x19, 0xe6, 0x5f, 0x90, 0xe4, 0x39, 0xb5,\n  0xe6, 0xef, 0x66, 0xc9, 0x9e, 0x2e, 0x5f, 0x3c, 0x86, 0xbf, 0xa6, 0xa9,\n  0x31, 0x76, 0xd4, 0x9c, 0x57, 0x4b, 0x6c, 0xbe, 0x40, 0xfc, 0x4c, 0x33,\n  0xda, 0x82, 0xf3, 0x86, 0xb9, 0xa8, 0x16, 0x9f, 0xbe, 0x0d, 0xce, 0x30,\n  0x85, 0x73, 0xcc, 0xdc, 0x58, 0x4b, 0x8c, 0x2d, 0xd7, 0x13, 0xc5, 0x3c,\n  0x85, 0xf3, 0xa6, 0xb9, 0xb0, 0x16, 0x5e, 0x15, 0xd0, 0xd9, 0xa2, 0x70,\n  0xde, 0x96, 0xd7, 0x37, 0xa4, 0xf3, 0xac, 0x8a, 0x55, 0xc6, 0x93, 0xf6,\n  0x8e, 0xf9, 0x68, 0x2d, 0x38, 0xbb, 0xa1, 0x33, 0x4b, 0xd1, 0x79, 0xcf,\n  0x5c, 0x59, 0x0b, 0xce, 0x52, 0x7d, 0x8c, 0x18, 0xa5, 0x70, 0xde, 0xaf,\n  0xa9, 0xd7, 0x55, 0x38, 0xd4, 0x8b, 0xa5, 0x0a, 0xe7, 0x03, 0x73, 0x58,\n  0xad, 0x63, 0x67, 0x9c, 0xb8, 0x45, 0xe1, 0x7c, 0x68, 0xce, 0xac, 0x05,\n  0xc7, 0x35, 0x76, 0xa4, 0xcc, 0x1f, 0xd5, 0x1c, 0x3b, 0x57, 0xe9, 0xbe,\n  0x1e, 0x3a, 0x13, 0x15, 0x9d, 0x8f, 0xcd, 0xdb, 0x6b, 0xa1, 0x53, 0x3d,\n  0x97, 0x68, 0x9f, 0xd4, 0x3a, 0x97, 0xec, 0x84, 0x57, 0xa5, 0xc2, 0x39,\n  0x61, 0x3e, 0x5e, 0x0b, 0x9d, 0x0d, 0xf0, 0x1a, 0xa7, 0x78, 0x7d, 0xca,\n  0xfc, 0x51, 0x9b, 0xcc, 0xe3, 0xc4, 0x74, 0x85, 0xf3, 0x79, 0xad, 0x36,\n  0x7c, 0x12, 0x9f, 0x2e, 0x57, 0x38, 0xa7, 0x6a, 0xce, 0xd1, 0xd7, 0xd9,\n  0x67, 0x82, 0xc2, 0x39, 0x5d, 0x53, 0xe6, 0xab, 0x70, 0x46, 0x81, 0xf3,\n  0xbc, 0xc2, 0xf9, 0xc2, 0x2c, 0xac, 0x05, 0x67, 0x04, 0xbc, 0xde, 0x52,\n  0x38, 0x5f, 0x9a, 0xad, 0xfe, 0xcd, 0xce, 0xfa, 0x90, 0x9a, 0x76, 0xbe,\n  0x12, 0xab, 0xe4, 0x14, 0x85, 0xe0, 0x6c, 0x64, 0x0d, 0x0e, 0x17, 0xf3,\n  0x5d, 0xe7, 0x54, 0x0d, 0xe4, 0x39, 0x55, 0x88, 0x66, 0xd7, 0x43, 0xd9,\n  0xc0, 0xab, 0x73, 0x2a, 0xd7, 0x0f, 0xc6, 0xb2, 0x3c, 0xa7, 0x92, 0xcd,\n  0x51, 0x42, 0x53, 0x7b, 0x42, 0xbd, 0x92, 0x51, 0x2d, 0xd4, 0x8d, 0x5b,\n  0xd7, 0x5b, 0x5a, 0x76, 0x51, 0x16, 0x55, 0x98, 0xc8, 0xb0, 0x17, 0xec,\n  0x0b, 0xe7, 0xd4, 0xc0, 0x32, 0xdc, 0x58, 0xa4, 0xa2, 0x20, 0xf5, 0x2b,\n  0x0c, 0xd2, 0x44, 0x50, 0x80, 0x9f, 0xeb, 0x0e, 0x96, 0xda, 0xb7, 0x38,\n  0x1c, 0x57, 0xed, 0xca, 0x5c, 0x4f, 0xaa, 0xd7, 0xfc, 0x73, 0xbc, 0x3d,\n  0xb2, 0x5a, 0x15, 0x66, 0x5f, 0x28, 0x49, 0x9b, 0xd7, 0x29, 0x29, 0x31,\n  0x38, 0xd6, 0xc7, 0x27, 0x46, 0x1f, 0x9d, 0xdb, 0xac, 0x20, 0x27, 0x76,\n  0xd7, 0xae, 0x92, 0xd4, 0xfa, 0x9e, 0xf6, 0x38, 0xf9, 0x28, 0x44, 0xf5,\n  0xdc, 0x2d, 0xfd, 0xfd, 0x7a, 0xcd, 0xb9, 0xfb, 0x9a, 0xd8, 0x1a, 0x2d,\n  0x26, 0x2b, 0x9c, 0xb7, 0x6a, 0x5d, 0x27, 0x9f, 0xc4, 0x07, 0x93, 0xe5,\n  0x3a, 0xe1, 0x55, 0x50, 0x6b, 0xfc, 0x6d, 0x82, 0xce, 0x38, 0xb5, 0x4e,\n  0x36, 0x37, 0xd7, 0xd6, 0x42, 0x87, 0x79, 0x5f, 0xcc, 0x91, 0x38, 0x3e,\n  0xbb, 0x6a, 0x8e, 0x87, 0xab, 0x70, 0xa6, 0x40, 0xe7, 0x79, 0x25, 0xcf,\n  0x77, 0x66, 0x71, 0x2d, 0x38, 0x93, 0xc1, 0x59, 0x6f, 0x74, 0x82, 0x57,\n  0x1b, 0xb3, 0xa8, 0x16, 0x1c, 0x74, 0x11, 0x8b, 0x64, 0x4c, 0xe8, 0x3d,\n  0xcd, 0xc5, 0xb5, 0xe0, 0xcc, 0x06, 0xe7, 0x01, 0x85, 0xd3, 0xc7, 0x9c,\n  0x51, 0x0b, 0xce, 0x24, 0x70, 0x0e, 0x2b, 0x9c, 0x7e, 0x66, 0xb7, 0x1b,\n  0xe3, 0x38, 0x6f, 0x33, 0x75, 0xca, 0x7d, 0x5a, 0x27, 0xc7, 0x54, 0xf3,\n  0x6f, 0xdd, 0xcb, 0x7a, 0xf3, 0xef, 0xaa, 0xf7, 0xcb, 0xcd, 0xbf, 0x4d,\n  0x5d, 0xbb, 0x0b, 0x9c, 0xba, 0x8e, 0xa9, 0xf2, 0xfd, 0xf2, 0xab, 0x31,\n  0xe4, 0x7d, 0x2c, 0x33, 0x0e, 0xbc, 0x35, 0x86, 0xc3, 0x31, 0x8d, 0xdc,\n  0xe9, 0x80, 0xf5, 0xfc, 0xf4, 0x81, 0xea, 0xf7, 0xd3, 0x85, 0x19, 0xaf,\n  0xcd, 0x35, 0xd7, 0xd2, 0x7f, 0x9a, 0x7a, 0x54, 0xd4, 0xea, 0xaf, 0x99,\n  0xd6, 0xfb, 0x94, 0xde, 0x66, 0x77, 0x2d, 0xc7, 0x5c, 0xa5, 0x9e, 0xaf,\n  0xfe, 0xf2, 0xd2, 0xcf, 0x56, 0xff, 0x9f, 0xaf, 0xac, 0x9d, 0x66, 0x77,\n  0xe1, 0xe3, 0x6a, 0x77, 0xee, 0xbd, 0x41, 0xfb, 0x27, 0x66, 0x37, 0x2d,\n  0xcd, 0x5c, 0xc6, 0xda, 0xeb, 0x84, 0xff, 0xf5, 0xef, 0xf2, 0x34, 0xd7,\n  0x07, 0x60, 0x87, 0x7c, 0x91, 0x22, 0x72, 0xd4, 0xea, 0x97, 0xee, 0x90,\n  0x7f, 0x47, 0x55, 0x9e, 0xf0, 0x8d, 0xb1, 0xbb, 0x9e, 0xa9, 0xb5, 0xab,\n  0x67, 0x6a, 0x3d, 0xd4, 0x33, 0xb5, 0xc9, 0x01, 0xc1, 0xc9, 0x40, 0xf5,\n  0x7a, 0x16, 0x54, 0x7d, 0x93, 0x33, 0xf7, 0xca, 0x81, 0xaa, 0xfb, 0x5e,\n  0x67, 0x88, 0x7b, 0x63, 0x1e, 0x91, 0x10, 0x1d, 0x1d, 0x17, 0x1f, 0x99,\n  0xdd, 0xaa, 0x65, 0x4e, 0x76, 0x4b, 0xae, 0xe3, 0xe3, 0xa2, 0xb2, 0x5b,\n  0xb6, 0x6c, 0x9c, 0xdd, 0x4a, 0x7f, 0x3b, 0x2e, 0x39, 0x21, 0x2a, 0x32,\n  0x21, 0xbb, 0x79, 0x76, 0x56, 0xcb, 0x66, 0xd9, 0xb1, 0xc9, 0x89, 0x91,\n  0x91, 0x89, 0x59, 0xcd, 0x1b, 0x37, 0x6a, 0x59, 0x20, 0x65, 0x5b, 0xa9,\n  0xdb, 0xc4, 0x14, 0x23, 0x4f, 0xc4, 0x8a, 0x66, 0x4a, 0xb6, 0x86, 0x75,\n  0x10, 0xcc, 0x47, 0x9d, 0x26, 0x47, 0x47, 0xe9, 0x7a, 0x17, 0xeb, 0x25,\n  0xa1, 0x31, 0xea, 0xa9, 0x4f, 0x79, 0x94, 0x25, 0x6f, 0x89, 0x69, 0xba,\n  0x5c, 0x75, 0x13, 0xdd, 0x49, 0x41, 0xd0, 0x95, 0x5b, 0xaf, 0x72, 0x84,\n  0x25, 0x5d, 0x73, 0x1e, 0xde, 0x3a, 0x29, 0x32, 0x2a, 0x36, 0x36, 0x38,\n  0xa4, 0x8e, 0x47, 0x90, 0x57, 0x83, 0x66, 0xf2, 0xec, 0x23, 0x2f, 0x3f,\n  0x3a, 0x56, 0xdf, 0x91, 0x99, 0x92, 0x10, 0x19, 0x1d, 0xeb, 0xc8, 0xb6,\n  0x19, 0x05, 0xd9, 0x59, 0x2d, 0xda, 0xb4, 0x6e, 0x35, 0xaa, 0x6e, 0x96,\n  0x5f, 0x67, 0xec, 0xb9, 0xc6, 0x8c, 0x26, 0x67, 0xf8, 0x48, 0x73, 0xd4,\n  0xf9, 0xc5, 0xe9, 0xbc, 0x74, 0xc4, 0xb2, 0xe7, 0x11, 0xf7, 0xbb, 0xf3,\n  0xce, 0xb1, 0x62, 0xac, 0xb6, 0x4a, 0xeb, 0xf6, 0x7f, 0xd8, 0x67, 0xa4,\n  0xd4, 0x96, 0xc9, 0x8f, 0x75, 0xe7, 0xea, 0x46, 0x3d, 0xf7, 0xd5, 0xa7,\n  0xb5, 0xec, 0x33, 0x74, 0xb1, 0x5a, 0x5f, 0xa8, 0xed, 0xd0, 0x7f, 0x54,\n  0x7c, 0x63, 0x0a, 0x23, 0x5d, 0xaf, 0xfd, 0xf4, 0x53, 0x0f, 0x0d, 0x54,\n  0xa8, 0x5b, 0x7a, 0x2e, 0xab, 0x78, 0x45, 0x66, 0x04, 0xd5, 0xb2, 0xef,\n  0x5f, 0x1d, 0x19, 0x2c, 0x77, 0xf9, 0xc1, 0x91, 0x07, 0x22, 0x5d, 0xdb,\n  0xfd, 0x48, 0x7d, 0x4f, 0x54, 0x78, 0x84, 0xda, 0xe6, 0x5b, 0xa5, 0xdc,\n  0x13, 0xea, 0xf3, 0xc4, 0x2e, 0xfd, 0x37, 0xf8, 0xc4, 0xfd, 0xd3, 0xbb,\n  0x24, 0x5e, 0xea, 0xaf, 0x5c, 0x56, 0x9b, 0x7a, 0xbe, 0xfb, 0x51, 0x95,\n  0x79, 0x57, 0x9e, 0x50, 0xd1, 0xc4, 0x14, 0xfd, 0x56, 0x6d, 0xb0, 0x11,\n  0x02, 0x2d, 0x24, 0xf6, 0xd6, 0xac, 0xfb, 0x75, 0x62, 0xbe, 0x3c, 0x34,\n  0x99, 0xea, 0x7a, 0xc1, 0x27, 0xd9, 0xf0, 0x0a, 0xcb, 0xd0, 0xd4, 0xad,\n  0x25, 0x79, 0x70, 0xae, 0x45, 0x45, 0x14, 0x36, 0x0f, 0x9a, 0xe4, 0x97,\n  0xd1, 0x30, 0x50, 0xbf, 0x35, 0x38, 0x3f, 0x3f, 0xd8, 0x33, 0x38, 0x2f,\n  0x2f, 0xa8, 0x0e, 0x9d, 0x4e, 0xe8, 0x93, 0xb5, 0x75, 0x46, 0x20, 0x7d,\n  0x62, 0x0b, 0xa3, 0x1c, 0xae, 0xef, 0x22, 0x5d, 0xf5, 0xe8, 0x3d, 0xc4,\n  0x42, 0x14, 0x31, 0xd7, 0x9d, 0xab, 0x56, 0x7a, 0x9e, 0xb6, 0xce, 0xa7,\n  0x71, 0xb3, 0xf0, 0x82, 0xba, 0x49, 0x89, 0x75, 0x8c, 0x40, 0xef, 0xc0,\n  0x66, 0xcd, 0x02, 0x7d, 0x82, 0x9a, 0xe4, 0x85, 0xba, 0xec, 0xb9, 0x46,\n  0xbf, 0x55, 0x4f, 0x40, 0x36, 0xf9, 0xae, 0x63, 0x76, 0x61, 0x43, 0x9f,\n  0xea, 0xbf, 0x84, 0x53, 0xfd, 0x36, 0xd5, 0x10, 0xd7, 0x2b, 0x8f, 0xda,\n  0x75, 0xef, 0x38, 0xc2, 0x24, 0xc8, 0x75, 0xab, 0x05, 0x4e, 0x39, 0xd5,\n  0x57, 0x6b, 0x42, 0x9a, 0x85, 0x55, 0x06, 0x36, 0xcd, 0x0f, 0x9d, 0x23,\n  0x2f, 0x02, 0x9a, 0x36, 0x0b, 0xd5, 0x6f, 0xad, 0x13, 0x51, 0x9a, 0xe9,\n  0x19, 0x95, 0x9f, 0x13, 0x58, 0x7d, 0x21, 0x0d, 0x70, 0x3b, 0xba, 0x1c,\n  0x47, 0x97, 0xba, 0xf2, 0x7b, 0x31, 0x75, 0x1c, 0xc6, 0x0d, 0xee, 0x29,\n  0xd4, 0x15, 0x75, 0x83, 0x83, 0x6d, 0x5e, 0xe1, 0x19, 0x9a, 0xeb, 0x96,\n  0x46, 0x9a, 0x87, 0xa5, 0xd3, 0xc0, 0xc0, 0xc2, 0xa4, 0x82, 0xe6, 0x4d,\n  0xf2, 0xf3, 0x9a, 0x07, 0x66, 0x66, 0xf8, 0x1a, 0x81, 0x71, 0xa5, 0xa9,\n  0x75, 0x1a, 0x15, 0xb4, 0xcc, 0xac, 0x13, 0x94, 0x9b, 0x1f, 0x52, 0x83,\n  0xb6, 0xbf, 0xa4, 0xed, 0xe7, 0x25, 0xef, 0xfa, 0xc9, 0xbf, 0xca, 0xa8,\n  0xd7, 0xb0, 0x94, 0xbf, 0xf0, 0x0f, 0x0e, 0x51, 0xb4, 0x95, 0xa9, 0xe4,\n  0xf1, 0x94, 0xba, 0xaf, 0x97, 0xa7, 0x1d, 0x0f, 0x68, 0x50, 0xdf, 0x77,\n  0x74, 0x50, 0x61, 0x52, 0xf3, 0x98, 0xfc, 0x88, 0xa6, 0x05, 0xd2, 0x6a,\n  0x4d, 0xf3, 0xc2, 0xe2, 0x4b, 0x53, 0xbd, 0xc3, 0x9a, 0xc4, 0xb4, 0xc8,\n  0x94, 0xb2, 0x2f, 0xd4, 0x27, 0x6a, 0xaf, 0xe9, 0x97, 0xe5, 0xfe, 0xbd,\n  0x30, 0xc9, 0xf5, 0x4d, 0x99, 0x9a, 0x0f, 0x06, 0x48, 0xd3, 0xca, 0x03,\n  0x19, 0xd7, 0x13, 0x4f, 0x76, 0xaf, 0x88, 0x0c, 0xed, 0xea, 0xd7, 0x2d,\n  0x5f, 0x73, 0xf4, 0xec, 0xd4, 0xa5, 0xcc, 0x9e, 0xef, 0xd1, 0x34, 0xb3,\n  0x5e, 0x9e, 0x43, 0xbf, 0xdc, 0xb6, 0x5b, 0xd7, 0x76, 0x0d, 0x62, 0xe2,\n  0x32, 0x64, 0xc7, 0xa7, 0xf4, 0x7e, 0xda, 0x32, 0xeb, 0xcc, 0x34, 0xb1,\n  0xf6, 0x37, 0xeb, 0xdc, 0x81, 0xae, 0x05, 0x5f, 0x19, 0xee, 0x35, 0x9f,\n  0xc0, 0xd0, 0x96, 0xb5, 0x69, 0xdc, 0xa4, 0xb0, 0xb0, 0x49, 0xe3, 0x36,\n  0x79, 0x72, 0xbe, 0x61, 0x02, 0x4a, 0xd4, 0x5f, 0x6f, 0xd2, 0xa2, 0x45,\n  0x4e, 0x0e, 0x10, 0x15, 0x1f, 0x1f, 0x15, 0x1d, 0x1f, 0xaf, 0xde, 0xd3,\n  0x9a, 0xa0, 0x4f, 0xd1, 0x4e, 0xe9, 0x17, 0xe0, 0x96, 0x59, 0x58, 0xcf,\n  0x75, 0xf7, 0xdf, 0xa6, 0xee, 0xfe, 0xcb, 0xf3, 0xca, 0x5a, 0x9e, 0x01,\n  0xf0, 0x8a, 0xca, 0xa8, 0xe5, 0xfe, 0xff, 0x29, 0x47, 0xab, 0xcc, 0x90,\n  0xb4, 0xe4, 0xc4, 0xc0, 0xa0, 0x38, 0x8f, 0x26, 0xf6, 0x56, 0x0d, 0xb9,\n  0x4e, 0x0a, 0x08, 0x8a, 0x75, 0xe8, 0x17, 0xda, 0xb6, 0x0d, 0x89, 0x0c,\n  0x49, 0x48, 0x6a, 0xd3, 0x8e, 0x22, 0x31, 0xd1, 0xf5, 0x5d, 0x92, 0xf9,\n  0xfa, 0x0c, 0xc6, 0xf3, 0xfe, 0x5a, 0xef, 0x65, 0xe2, 0x9e, 0xa0, 0x84,\n  0x90, 0x84, 0xf9, 0x5a, 0x96, 0xf3, 0x1d, 0x7d, 0xbf, 0xeb, 0xbd, 0xb2,\n  0x00, 0x33, 0x59, 0xbc, 0xa8, 0xbe, 0x36, 0x22, 0xbf, 0xbd, 0xa3, 0xc6,\n  0x53, 0x80, 0x3f, 0x79, 0x89, 0xeb, 0x36, 0x47, 0x3f, 0x89, 0x53, 0x21,\n  0xfb, 0x97, 0xa5, 0x24, 0xc8, 0xfe, 0x61, 0xee, 0xb7, 0xc7, 0xac, 0x3f,\n  0x5d, 0x2d, 0xff, 0x42, 0x63, 0xbf, 0x06, 0x01, 0x61, 0x9e, 0x7e, 0xd1,\n  0xc1, 0xb9, 0x8d, 0x63, 0x32, 0x82, 0xb3, 0x12, 0x13, 0xa7, 0x34, 0xb0,\n  0x6b, 0xf9, 0x36, 0x7b, 0xe3, 0xcc, 0x98, 0xa6, 0x99, 0x7e, 0x75, 0xe3,\n  0x73, 0xd5, 0x9a, 0x77, 0x59, 0xbf, 0xa0, 0xfd, 0x69, 0x14, 0xe8, 0x1e,\n  0x62, 0x92, 0xeb, 0x1d, 0x21, 0x7d, 0xb0, 0xd8, 0xe9, 0x7a, 0x27, 0xda,\n  0x8c, 0x17, 0xee, 0x77, 0x1e, 0xea, 0x8b, 0x7c, 0xf6, 0x74, 0x75, 0xdc,\n  0xcf, 0x15, 0xd4, 0x18, 0x93, 0xd7, 0x9d, 0x8b, 0xaa, 0xb1, 0x59, 0x7d,\n  0x2e, 0xea, 0x1e, 0x9f, 0xf9, 0xb6, 0xb0, 0xd8, 0xba, 0x59, 0x0e, 0xdf,\n  0x3a, 0xba, 0x7e, 0xd4, 0x2b, 0x90, 0xf1, 0xe2, 0x13, 0x94, 0x9b, 0x17,\n  0xc2, 0x1c, 0xdc, 0x45, 0xbf, 0xcd, 0x9c, 0xc3, 0xbe, 0xdc, 0xa1, 0xf5,\n  0xba, 0xbc, 0xdf, 0x7a, 0x5f, 0xe0, 0x13, 0x74, 0x1f, 0x69, 0x1e, 0x64,\n  0xd7, 0x75, 0xca, 0xf9, 0x85, 0xb5, 0x87, 0xcc, 0xd5, 0x0b, 0xc8, 0x75,\n  0x8f, 0x8a, 0x40, 0xd1, 0xdf, 0x95, 0xf7, 0x45, 0xa9, 0x1b, 0xb0, 0xf2,\n  0x2c, 0x69, 0xa2, 0xfa, 0xc4, 0xcb, 0x24, 0x75, 0xdb, 0x46, 0x1e, 0xa1,\n  0x19, 0x43, 0xe5, 0xad, 0x70, 0xa3, 0x34, 0x8a, 0xc4, 0x4f, 0xbd, 0xee,\n  0x87, 0xe1, 0x17, 0x5c, 0xd7, 0xea, 0x7a, 0x4a, 0x26, 0x50, 0x04, 0x24,\n  0x26, 0x27, 0xca, 0x6f, 0xee, 0x54, 0x3f, 0xed, 0xe1, 0xca, 0xe7, 0xac,\n  0x1b, 0x16, 0x49, 0xce, 0x15, 0x46, 0x48, 0x58, 0x44, 0x48, 0x48, 0xe4,\n  0x49, 0x23, 0x34, 0xac, 0x51, 0x68, 0xa4, 0x3e, 0x3a, 0x34, 0x9c, 0xe9,\n  0x33, 0x24, 0x2c, 0xac, 0x71, 0x14, 0x63, 0xd0, 0x99, 0xaf, 0x0f, 0x67,\n  0xdf, 0xfc, 0x19, 0x84, 0xdc, 0xf7, 0x20, 0xe4, 0x8d, 0x31, 0xb5, 0xd0,\n  0xca, 0x7b, 0x6b, 0x63, 0xd4, 0x17, 0x00, 0x98, 0xb4, 0x6d, 0x1a, 0x13,\n  0xaa, 0xbf, 0x9f, 0x3c, 0xc8, 0xb4, 0xdb, 0x44, 0xa0, 0x16, 0xe8, 0xe1,\n  0xa8, 0x7e, 0xbe, 0x23, 0x24, 0x24, 0x49, 0x85, 0xb4, 0xf5, 0x67, 0x73,\n  0x9b, 0xbe, 0x95, 0xdb, 0xa2, 0x75, 0x5c, 0x48, 0x74, 0x87, 0x3e, 0xf9,\n  0x9e, 0x1e, 0x39, 0x3d, 0xba, 0xe8, 0x9f, 0xe5, 0xe6, 0xfa, 0x27, 0x87,\n  0x46, 0x47, 0xb7, 0x8e, 0x8e, 0x51, 0xb6, 0xd8, 0xa0, 0x0f, 0x34, 0xe3,\n  0x0d, 0x6f, 0x06, 0x9e, 0xf5, 0x5e, 0xab, 0x4f, 0x1d, 0xeb, 0xbd, 0xd6,\n  0x44, 0xcd, 0x11, 0xe6, 0x3e, 0x6a, 0x72, 0xdf, 0x70, 0x09, 0x0b, 0x49,\n  0x75, 0x6e, 0x48, 0x8c, 0xce, 0x0a, 0x0f, 0x2f, 0x98, 0xa6, 0xbf, 0x11,\n  0x9d, 0x94, 0x16, 0xe0, 0xeb, 0xe5, 0x1b, 0x1d, 0x98, 0xe2, 0xa2, 0xb5,\n  0xf1, 0x5a, 0x5a, 0xae, 0x67, 0x36, 0xa0, 0x55, 0xdf, 0x4d, 0xcb, 0x08,\n  0x66, 0x75, 0x75, 0xdd, 0xce, 0x61, 0xf4, 0x9d, 0xbe, 0xad, 0x20, 0x3c,\n  0x3c, 0x2b, 0x3a, 0x41, 0x7f, 0xa3, 0x47, 0x4c, 0x4a, 0x60, 0x34, 0xb4,\n  0x02, 0xd2, 0x92, 0xdc, 0xf7, 0x63, 0x2e, 0x88, 0xed, 0xc6, 0xe4, 0x1a,\n  0xf7, 0x63, 0xe4, 0xbd, 0x22, 0x57, 0xd2, 0xa1, 0x5e, 0x7b, 0x92, 0xab,\n  0xba, 0xfc, 0x6b, 0xc6, 0xf2, 0x49, 0x17, 0x3f, 0xf9, 0x1e, 0x85, 0x7c,\n  0xd6, 0x45, 0xde, 0x8f, 0xb9, 0x62, 0x8b, 0x50, 0xf5, 0xc5, 0x20, 0xf5,\n  0xd7, 0x93, 0xe5, 0x9f, 0x4b, 0xee, 0x98, 0xda, 0xa5, 0x47, 0x8e, 0x87,\n  0x67, 0x7e, 0xdf, 0xf6, 0xd1, 0x4d, 0x0a, 0x5b, 0x1a, 0x93, 0x63, 0x62,\n  0x5a, 0x45, 0x47, 0x35, 0xab, 0x9b, 0x2b, 0x9f, 0x1d, 0x75, 0x5e, 0xd2,\n  0x0b, 0x35, 0x9b, 0xfe, 0x24, 0xb2, 0x97, 0x5d, 0x89, 0x89, 0x70, 0x5d,\n  0xbb, 0x26, 0x1c, 0x86, 0x28, 0x87, 0xcb, 0x77, 0x5a, 0x65, 0x53, 0xcd,\n  0x50, 0xb0, 0x5a, 0x5c, 0xa1, 0x20, 0xa7, 0xb1, 0xc6, 0x09, 0xee, 0x50,\n  0x30, 0x3c, 0xd4, 0x13, 0xb8, 0x09, 0xea, 0x51, 0xdc, 0xb4, 0x1d, 0x5a,\n  0x6a, 0x7a, 0xba, 0xb6, 0xb3, 0x5e, 0x7a, 0x9a, 0xa6, 0x4f, 0x68, 0xd8,\n  0x28, 0x27, 0xa7, 0x51, 0x43, 0xf9, 0xae, 0x36, 0x39, 0xee, 0x4d, 0x2a,\n  0x0f, 0x3e, 0x2b, 0xf7, 0x5b, 0x37, 0xcc, 0xb9, 0xd9, 0x9f, 0x91, 0xf7,\n  0xc8, 0x7d, 0xcf, 0x71, 0x73, 0x7a, 0x2d, 0x38, 0x6f, 0x80, 0xd3, 0x45,\n  0x9e, 0xbb, 0x68, 0x3f, 0xd7, 0x3c, 0x3f, 0xba, 0xfa, 0xdc, 0x85, 0xbd,\n  0xe3, 0x6c, 0x45, 0xe7, 0x24, 0xd7, 0x37, 0xa6, 0x73, 0x2b, 0x74, 0xee,\n  0x51, 0x38, 0x5f, 0x99, 0xe3, 0x6b, 0xc9, 0x95, 0xe7, 0x82, 0xb3, 0x52,\n  0xe1, 0x7c, 0x6d, 0x0e, 0xa8, 0x85, 0xd7, 0x33, 0xe0, 0xdc, 0xa6, 0x70,\n  0xbe, 0x31, 0xef, 0xaa, 0x85, 0xce, 0x50, 0x70, 0x36, 0xcb, 0xfd, 0x86,\n  0xde, 0xdd, 0xec, 0x7b, 0x23, 0x79, 0x88, 0x87, 0xde, 0xfa, 0x0a, 0xf6,\n  0x6a, 0x76, 0x2c, 0x6b, 0xcd, 0x1b, 0xff, 0xba, 0x86, 0x58, 0xc6, 0x0f,\n  0xba, 0x6a, 0x1d, 0xd9, 0x68, 0x2b, 0xeb, 0x5d, 0x5e, 0x62, 0x6b, 0x6b,\n  0x6b, 0xd4, 0x24, 0xbb, 0xb1, 0xcd, 0xb0, 0xe7, 0x14, 0xb6, 0x6c, 0x9a,\n  0x94, 0x94, 0xec, 0x3a, 0x4f, 0x5f, 0xa2, 0x8f, 0x15, 0xb7, 0x1a, 0x69,\n  0xcc, 0x93, 0x05, 0x8a, 0x47, 0x23, 0x79, 0xa8, 0xa4, 0x15, 0xd9, 0x6d,\n  0x3a, 0x53, 0xbc, 0x7a, 0xf7, 0x5c, 0x3e, 0x6a, 0x71, 0x93, 0xfc, 0xed,\n  0x7e, 0x4f, 0xcd, 0x75, 0x1b, 0x5f, 0xfe, 0x51, 0x72, 0x0f, 0x47, 0x64,\n  0xf5, 0xd3, 0x71, 0xee, 0x3b, 0x81, 0xd6, 0x0e, 0x2e, 0xef, 0xd6, 0x26,\n  0xad, 0x82, 0xbc, 0xe2, 0xc2, 0x52, 0xd2, 0x5b, 0xd7, 0xf5, 0x0d, 0x8e,\n  0xf7, 0x0d, 0x30, 0xd2, 0xaa, 0x3a, 0xda, 0x1c, 0xf5, 0x1a, 0xd5, 0x4b,\n  0x0f, 0x09, 0xf0, 0x72, 0xb4, 0x92, 0xf7, 0x6f, 0x9a, 0x8a, 0x99, 0xe2,\n  0x75, 0xfd, 0x22, 0xf1, 0x1e, 0x2e, 0xe2, 0xdc, 0xf7, 0x4a, 0x23, 0x23,\n  0xc2, 0x03, 0xfd, 0xbd, 0x1d, 0x9a, 0xe7, 0x3f, 0xdf, 0x39, 0x72, 0xb8,\n  0x67, 0xc8, 0x50, 0xd7, 0x9f, 0x76, 0x4f, 0xca, 0x75, 0xfd, 0x65, 0xe1,\n  0xdc, 0x10, 0xd7, 0xcd, 0xd1, 0xbc, 0x10, 0x75, 0x0b, 0x35, 0xae, 0x67,\n  0x9f, 0xde, 0xbd, 0x5a, 0xf5, 0xe8, 0xd7, 0xbb, 0x3c, 0x3b, 0x3f, 0x3f,\n  0xbb, 0x55, 0x76, 0x5e, 0x9e, 0x7e, 0x71, 0xb1, 0x63, 0x70, 0x51, 0xd1,\n  0x60, 0xc7, 0xaa, 0x55, 0x1e, 0x43, 0x8a, 0xba, 0x0f, 0x72, 0x2c, 0x7e,\n  0xc9, 0xd6, 0x36, 0x2f, 0xaf, 0xad, 0xfd, 0xef, 0xbf, 0xed, 0xb2, 0xc4,\n  0x37, 0x8b, 0x89, 0xcb, 0x27, 0xd4, 0x3e, 0xba, 0xcc, 0x1c, 0x5e, 0x8b,\n  0x6f, 0x46, 0xe9, 0xcd, 0xc5, 0x43, 0x8c, 0x1d, 0x2f, 0xd1, 0xb1, 0xdb,\n  0xe6, 0x18, 0xf9, 0x64, 0x91, 0x7a, 0xa3, 0x6a, 0xd2, 0x75, 0x5f, 0x55,\n  0x89, 0x92, 0x5f, 0x21, 0xd4, 0xc5, 0x82, 0xeb, 0x1a, 0xfa, 0x15, 0xd6,\n  0x71, 0x7d, 0xb4, 0x2c, 0x31, 0x51, 0x7e, 0x71, 0xc5, 0xf0, 0x70, 0x8d,\n  0x98, 0x9c, 0x90, 0x16, 0xb6, 0xd0, 0x90, 0x46, 0xcd, 0x2e, 0xea, 0x95,\n  0xe1, 0xc1, 0x39, 0x4d, 0x9a, 0xc3, 0xab, 0x92, 0x2d, 0xf5, 0xc3, 0xfa,\n  0x5b, 0x35, 0x79, 0x49, 0xb3, 0x4c, 0xbc, 0xf2, 0x0e, 0xd7, 0x50, 0x95,\n  0x11, 0xc9, 0x77, 0x15, 0xad, 0xef, 0x5f, 0x5e, 0xd3, 0xe0, 0xe6, 0xe5,\n  0x99, 0xa0, 0xbe, 0xee, 0x62, 0xe4, 0xe6, 0x58, 0xd3, 0xf3, 0x43, 0x1f,\n  0x78, 0xd4, 0x6b, 0x14, 0x9e, 0xa8, 0x57, 0x36, 0xcf, 0x6c, 0x1c, 0x11,\n  0xcd, 0x72, 0x76, 0xc2, 0xf9, 0x91, 0x9e, 0x6c, 0xb4, 0x17, 0x8d, 0x44,\n  0x73, 0xe7, 0x28, 0xb3, 0x43, 0xe0, 0xaf, 0xf2, 0x4a, 0x7c, 0xe7, 0xbe,\n  0xba, 0xfc, 0x89, 0xd8, 0xe4, 0xba, 0x32, 0x9f, 0x73, 0x7e, 0xe4, 0xba,\n  0xd2, 0xa6, 0xb9, 0xeb, 0x9c, 0xa3, 0xf4, 0xba, 0xee, 0x1e, 0xf2, 0x4a,\n  0xab, 0x2b, 0xf1, 0xf4, 0x49, 0xd4, 0x75, 0x94, 0xf6, 0x33, 0x3b, 0x58,\n  0xe7, 0xb3, 0xae, 0x0b, 0x5d, 0xdb, 0x2c, 0x0f, 0xce, 0xb7, 0x18, 0xda,\n  0x2e, 0xe7, 0x47, 0xf2, 0xc2, 0x66, 0x55, 0xd8, 0x31, 0xb5, 0x7c, 0x6d,\n  0x76, 0x8b, 0x87, 0xfb, 0xc2, 0xc1, 0xc5, 0x24, 0xf7, 0xb3, 0x48, 0x45,\n  0xce, 0x53, 0xda, 0x76, 0x23, 0x53, 0xfc, 0x47, 0xb4, 0xd2, 0x42, 0x9d,\n  0xf7, 0x0a, 0xa1, 0x76, 0xa3, 0x42, 0x5b, 0x28, 0x7f, 0x1b, 0xb3, 0x04,\n  0xbf, 0xe4, 0x6f, 0xd7, 0x99, 0xb0, 0xf3, 0x5e, 0x8b, 0xa7, 0x31, 0xcb,\n  0xe5, 0x3c, 0xef, 0xcb, 0x2b, 0x9d, 0x8c, 0x4a, 0x63, 0x91, 0x7a, 0x63,\n  0x27, 0x88, 0x74, 0x25, 0x8a, 0xe8, 0x4b, 0x12, 0x69, 0x22, 0x03, 0xc9,\n  0x1f, 0x51, 0x51, 0xb8, 0x5c, 0x7e, 0x02, 0x4e, 0x3d, 0x45, 0x2c, 0x8f,\n  0x3c, 0x74, 0xf2, 0x9d, 0x4a, 0x4f, 0xcd, 0x23, 0xc2, 0x8b, 0xb8, 0xf3,\n  0xf6, 0x70, 0x54, 0xfa, 0x68, 0xde, 0x51, 0xbe, 0x91, 0x46, 0x1d, 0x3f,\n  0xef, 0x3a, 0x95, 0xfe, 0x9a, 0x5f, 0x4c, 0x40, 0xb4, 0x51, 0x37, 0xd0,\n  0xaf, 0x6e, 0x65, 0x68, 0xb0, 0x1e, 0x18, 0x14, 0x14, 0xd8, 0x47, 0x96,\n  0x81, 0x41, 0x43, 0xc2, 0x42, 0xf4, 0xa0, 0xc0, 0xa0, 0x92, 0xf8, 0xf8,\n  0xe8, 0xe8, 0xf0, 0xf0, 0xe0, 0x60, 0x7f, 0x7f, 0x1f, 0x9f, 0x46, 0x0d,\n  0x1b, 0x64, 0x66, 0xd4, 0x67, 0x1e, 0x4c, 0x4d, 0x49, 0x8e, 0x4f, 0x8a,\n  0x4f, 0x4a, 0x4c, 0x88, 0x8e, 0x8b, 0x8e, 0x8b, 0x8d, 0x09, 0x8f, 0x0a,\n  0x8f, 0x8a, 0x8c, 0x08, 0x0e, 0x0b, 0x0e, 0x0b, 0x0d, 0x71, 0x7d, 0xf5,\n  0x4c, 0xbe, 0x64, 0x11, 0xa8, 0xde, 0xe9, 0xf7, 0x8f, 0x75, 0xc4, 0xb8,\n  0x82, 0xdd, 0x3a, 0x25, 0x91, 0xaf, 0x32, 0x68, 0xb9, 0x64, 0x3c, 0x80,\n  0xfd, 0xda, 0x32, 0x27, 0x20, 0x49, 0xfe, 0xe1, 0x29, 0xf9, 0xd1, 0xd4,\n  0x90, 0xf9, 0xf3, 0xb3, 0xf8, 0xef, 0xf2, 0xed, 0x5a, 0x73, 0x7d, 0xb8,\n  0xd6, 0xfc, 0xef, 0xb4, 0xab, 0x4b, 0x27, 0xfb, 0x28, 0xe7, 0xbd, 0x59,\n  0x59, 0xbb, 0xb2, 0xb2, 0x74, 0x67, 0xd6, 0xe2, 0xc5, 0x59, 0x4b, 0x9c,\n  0x69, 0x59, 0xfc, 0xb3, 0xbb, 0xfa, 0x7f, 0xb7, 0x3b, 0x5f, 0x05, 0x4d,\n  0x81, 0xfb, 0x7e, 0xc3, 0x58, 0x75, 0xbf, 0x21, 0xa1, 0xe6, 0x79, 0xc3,\n  0x55, 0x73, 0xe8, 0x5b, 0xcc, 0x6b, 0x23, 0xe4, 0xdc, 0x67, 0x1b, 0x2c,\n  0xcf, 0xd9, 0x6e, 0x88, 0x73, 0x37, 0x38, 0x0b, 0x15, 0xce, 0x0f, 0xf2,\n  0xec, 0xab, 0x96, 0xb3, 0x35, 0x79, 0x1e, 0x23, 0x71, 0x72, 0x6a, 0x3d,\n  0x5b, 0xdb, 0xaa, 0xce, 0x5a, 0x24, 0x4e, 0xeb, 0x5a, 0xcf, 0x7e, 0xaa,\n  0xcf, 0x87, 0x44, 0xfb, 0x5a, 0x71, 0x06, 0x81, 0xf3, 0xa2, 0xc2, 0xd9,\n  0xc0, 0x1a, 0x7c, 0xe3, 0x39, 0xbd, 0x1b, 0x38, 0x87, 0xe5, 0x79, 0x8c,\n  0x67, 0x8e, 0xd9, 0xb4, 0x16, 0x9c, 0x09, 0xe0, 0x54, 0x29, 0x9c, 0xdc,\n  0x9a, 0xf7, 0x1a, 0xae, 0x39, 0x9f, 0xf4, 0x71, 0x9d, 0x4f, 0x8a, 0x8d,\n  0x35, 0xcf, 0x27, 0x6f, 0x7c, 0x86, 0x29, 0x3a, 0xd6, 0x7a, 0x86, 0xf9,\n  0x90, 0xba, 0xd7, 0x20, 0xef, 0x21, 0x75, 0xaa, 0xf5, 0x2c, 0xb4, 0xfa,\n  0xdc, 0x4b, 0x74, 0xae, 0xf5, 0xdc, 0xcb, 0x75, 0x66, 0x28, 0xef, 0x0f,\n  0x6d, 0xad, 0xed, 0x6c, 0xd6, 0xf9, 0xad, 0x3e, 0x58, 0x8b, 0x75, 0x7d,\n  0xfb, 0x89, 0x14, 0xd3, 0xa1, 0x75, 0x77, 0xee, 0xb3, 0x64, 0xf0, 0x41,\n  0x06, 0x49, 0xbf, 0x6b, 0xad, 0x32, 0x3c, 0x85, 0x8f, 0x26, 0x29, 0x39,\n  0xbb, 0xd5, 0xbc, 0x27, 0x72, 0x95, 0x2e, 0xbf, 0x81, 0x93, 0x60, 0xac,\n  0x04, 0xa7, 0xa8, 0xe6, 0xfa, 0x7d, 0x9d, 0x9c, 0xd3, 0x8d, 0x7b, 0xb0,\n  0x6d, 0xdf, 0x5a, 0xcf, 0xea, 0xb9, 0x16, 0xb7, 0x2b, 0x5e, 0xc5, 0xe6,\n  0x8a, 0x5a, 0x78, 0xfd, 0x01, 0x4e, 0xac, 0xc2, 0x29, 0xa9, 0xf5, 0x5e,\n  0xd3, 0x77, 0x2a, 0x86, 0xe5, 0x7d, 0x81, 0x42, 0xf3, 0xe5, 0x5a, 0x70,\n  0xe4, 0x7d, 0xa5, 0x5d, 0x4a, 0xf7, 0x52, 0x33, 0xbf, 0x16, 0x1c, 0x97,\n  0xee, 0x12, 0xa7, 0xac, 0x56, 0xdd, 0xab, 0xcf, 0x6c, 0xaf, 0xdc, 0x57,\n  0xbb, 0x4e, 0xaf, 0xd7, 0x9d, 0xdf, 0x8b, 0xde, 0xe6, 0x21, 0x70, 0xca,\n  0xcd, 0x75, 0xce, 0xef, 0xaf, 0xd0, 0x71, 0x5e, 0xf9, 0xf6, 0xc0, 0x7b,\n  0xf0, 0x1a, 0xaa, 0xe8, 0x94, 0x9b, 0xcf, 0xd7, 0xc2, 0xeb, 0x79, 0x75,\n  0xc6, 0x4e, 0xce, 0xe1, 0xd9, 0xb1, 0xd6, 0x73, 0xef, 0x1d, 0xc8, 0x53,\n  0xa1, 0xe8, 0xf4, 0xae, 0x35, 0xf6, 0x0e, 0x80, 0xd3, 0xc3, 0x98, 0x02,\n  0x4e, 0x1f, 0x79, 0xaf, 0xe1, 0x86, 0x38, 0xae, 0x7b, 0x61, 0x8c, 0xcd,\n  0x2b, 0xf7, 0xeb, 0xae, 0xc3, 0x59, 0x8d, 0x3c, 0x2a, 0x27, 0x13, 0xfd,\n  0xe4, 0xf5, 0x3f, 0x9f, 0xc3, 0x8b, 0x01, 0xb5, 0x9e, 0xc3, 0x6f, 0x75,\n  0xdf, 0x7f, 0x11, 0x83, 0x6a, 0x9e, 0xcb, 0xd6, 0xc4, 0x61, 0x75, 0x88,\n  0xd3, 0x16, 0xe8, 0x6f, 0x80, 0xd3, 0x4c, 0x5e, 0xd7, 0x7b, 0x38, 0x75,\n  0x94, 0x75, 0xba, 0x18, 0x57, 0x8d, 0x53, 0x4e, 0xf1, 0xbc, 0x1e, 0xae,\n  0x7b, 0x78, 0xc6, 0xb9, 0xec, 0x6e, 0xfa, 0x5b, 0xbf, 0xe3, 0x55, 0x7b,\n  0x14, 0xfb, 0xaa, 0x03, 0xfc, 0x4e, 0x95, 0xed, 0xf2, 0x0b, 0x1d, 0xbf,\n  0xb9, 0x72, 0x01, 0x89, 0x77, 0x41, 0x0f, 0x67, 0x25, 0x69, 0x59, 0x58,\n  0x70, 0xe5, 0x5b, 0x29, 0x76, 0xcd, 0x90, 0x1f, 0x41, 0x35, 0x58, 0xbd,\n  0x6d, 0x36, 0xf5, 0x27, 0x30, 0x45, 0x85, 0x43, 0x93, 0x1f, 0x56, 0x29,\n  0xd6, 0x44, 0x30, 0x53, 0xbc, 0x7f, 0x5d, 0xf9, 0x52, 0x87, 0xa7, 0x87,\n  0x08, 0xd3, 0xc2, 0x3c, 0x1d, 0xea, 0x8b, 0x65, 0xae, 0x8f, 0xa6, 0x34,\n  0xcd, 0x0d, 0x48, 0x72, 0x7f, 0xc0, 0x25, 0x20, 0xd8, 0x23, 0x34, 0x22,\n  0x95, 0xfd, 0x66, 0x50, 0x7c, 0xfd, 0x6e, 0xdd, 0xfa, 0x76, 0xeb, 0xd6,\n  0xf9, 0x9c, 0xc3, 0xde, 0xc9, 0xe6, 0x91, 0x94, 0xad, 0x75, 0xeb, 0xf4,\n  0xc9, 0x27, 0x9d, 0x9c, 0xbb, 0xba, 0x95, 0x0b, 0xdd, 0x7c, 0xc2, 0x92,\n  0xc1, 0x9f, 0xd5, 0x2c, 0xbf, 0x30, 0xd7, 0x90, 0xcf, 0xd4, 0xca, 0x77,\n  0xae, 0xc6, 0x90, 0x0a, 0xa4, 0x77, 0xf7, 0x54, 0xdf, 0x4c, 0xb3, 0x98,\n  0x07, 0x06, 0x68, 0x22, 0x2c, 0x24, 0x20, 0x2a, 0x30, 0xca, 0xd7, 0x7d,\n  0x20, 0xef, 0xaf, 0xf9, 0x7b, 0x39, 0xae, 0x7c, 0x73, 0xd4, 0xf5, 0x89,\n  0x39, 0x3f, 0x5d, 0x3e, 0x26, 0x95, 0xeb, 0x3a, 0x2b, 0x48, 0x6f, 0xd1,\n  0xad, 0xb0, 0x4b, 0x06, 0xec, 0xb5, 0x94, 0xe6, 0xf5, 0xc3, 0xa2, 0x53,\n  0xc3, 0x93, 0x82, 0xce, 0xb5, 0x6d, 0x92, 0xd7, 0x4e, 0x0f, 0xbf, 0x7c,\n  0xa6, 0x73, 0xdb, 0x2e, 0x31, 0x9d, 0x93, 0x33, 0x02, 0x82, 0xa3, 0x83,\n  0x62, 0xa4, 0xdd, 0x4e, 0x8a, 0x7b, 0xc5, 0x44, 0xbd, 0x82, 0x38, 0x8b,\n  0xaf, 0xcd, 0xd6, 0xd7, 0xd9, 0x36, 0xcf, 0x5c, 0x2b, 0x26, 0x8a, 0x2f,\n  0xb5, 0x8e, 0xd8, 0x76, 0xed, 0x95, 0x1e, 0xe6, 0x5a, 0xeb, 0xfb, 0x75,\n  0xe5, 0x66, 0x01, 0xab, 0x56, 0x38, 0xeb, 0x75, 0x6e, 0x61, 0x63, 0x2f,\n  0x72, 0x54, 0x6f, 0x75, 0xf6, 0x29, 0x84, 0x4d, 0x7e, 0x0c, 0x67, 0x8e,\n  0xfa, 0xea, 0x92, 0x3e, 0x0a, 0x85, 0xa5, 0xa5, 0xdd, 0x5f, 0x84, 0x25,\n  0x4d, 0x0d, 0x4a, 0x71, 0xa5, 0xa9, 0x41, 0x01, 0x39, 0x57, 0xee, 0x2d,\n  0xa8, 0x4c, 0x35, 0x29, 0xe0, 0xf9, 0xcc, 0xa8, 0x08, 0x9f, 0x28, 0x87,\n  0x77, 0x52, 0x50, 0x76, 0x61, 0xae, 0x1e, 0xee, 0xcc, 0x5e, 0x98, 0x14,\n  0xe3, 0x61, 0x74, 0xf0, 0xf0, 0x68, 0xd9, 0xb5, 0x35, 0xac, 0xd4, 0x39,\n  0x82, 0x87, 0x16, 0x27, 0x9e, 0xd0, 0x2b, 0xc8, 0x15, 0x32, 0xe5, 0xbb,\n  0x0f, 0x86, 0x66, 0xeb, 0x23, 0x4f, 0x3f, 0x74, 0xcd, 0xf5, 0x49, 0x26,\n  0x76, 0xa7, 0x43, 0xe4, 0x7d, 0x8f, 0xab, 0xbe, 0xc1, 0xe3, 0x88, 0xca,\n  0x08, 0xba, 0xb2, 0x52, 0x87, 0x3c, 0x91, 0xdd, 0x2c, 0x3b, 0xbb, 0x99,\n  0xf6, 0x79, 0xfd, 0xfb, 0xef, 0xaf, 0x3f, 0x6f, 0x1e, 0xba, 0x1f, 0xc4,\n  0x3e, 0x4f, 0x48, 0xfb, 0xf8, 0x6c, 0xa8, 0x69, 0x1f, 0xfd, 0x6a, 0xfb,\n  0x74, 0xd6, 0xf2, 0xdd, 0xb1, 0xa6, 0xbe, 0xf0, 0xf1, 0x84, 0xfa, 0xe2,\n  0x88, 0xe6, 0xfe, 0xe2, 0x08, 0x36, 0x2b, 0x35, 0x4b, 0xc5, 0xae, 0xea,\n  0x78, 0x74, 0xd4, 0xd9, 0xa7, 0x6d, 0x52, 0xdf, 0xd5, 0xc8, 0x35, 0xff,\n  0xd0, 0x9c, 0xc4, 0x60, 0xac, 0xa8, 0x27, 0x72, 0x45, 0xef, 0xc2, 0x9e,\n  0x89, 0x9a, 0xdd, 0x16, 0xa2, 0xe9, 0xf6, 0x08, 0xcd, 0xc3, 0x68, 0xa0,\n  0x39, 0x3c, 0x6c, 0x45, 0x42, 0xf3, 0xb4, 0xc2, 0x83, 0xf4, 0xc6, 0xb0,\n  0xcb, 0x83, 0x23, 0x2f, 0xcd, 0xc3, 0x61, 0x78, 0x8c, 0x11, 0x0e, 0x48,\n  0xf5, 0x13, 0x0e, 0x87, 0xdc, 0x5c, 0x38, 0x44, 0x59, 0x46, 0xfd, 0xf8,\n  0xb8, 0xec, 0x46, 0xf5, 0x73, 0x33, 0x72, 0x53, 0x93, 0xe3, 0xea, 0xc5,\n  0xd7, 0x4b, 0x4f, 0x4e, 0x4d, 0xf2, 0xf6, 0x88, 0xcc, 0x48, 0x09, 0xb6,\n  0x36, 0xfb, 0xad, 0xf4, 0xea, 0x63, 0xd3, 0x34, 0x36, 0xa2, 0xae, 0x27,\n  0xcf, 0x8c, 0x44, 0x0f, 0xf5, 0x06, 0x3f, 0x29, 0xb8, 0xfb, 0x52, 0xa6,\n  0xe3, 0x9a, 0xb3, 0x7e, 0x9f, 0x0e, 0xb3, 0x16, 0xd6, 0x2b, 0x1a, 0xdb,\n  0xb6, 0xb8, 0x64, 0x70, 0xd7, 0x8c, 0x3e, 0xc9, 0x61, 0xba, 0xee, 0x19,\n  0x3f, 0xb4, 0xfe, 0xc0, 0x8a, 0x0d, 0x39, 0xdd, 0x23, 0xa2, 0xcb, 0xe2,\n  0x47, 0x64, 0x76, 0x4d, 0x2c, 0x8f, 0x0e, 0xee, 0x94, 0xdb, 0xb6, 0x69,\n  0xb3, 0x55, 0x19, 0x9d, 0x33, 0x5e, 0xa9, 0xea, 0xb5, 0x7c, 0x5c, 0x8b,\n  0xee, 0xb9, 0x85, 0x1d, 0xfc, 0xfd, 0xba, 0xf5, 0x6a, 0x9d, 0x13, 0x18,\n  0xde, 0x53, 0x3b, 0xd3, 0xa6, 0x89, 0x9f, 0x5f, 0xd7, 0xf8, 0x34, 0x67,\n  0xbd, 0xb0, 0xc0, 0xb6, 0x9d, 0xb2, 0xd3, 0x32, 0x1b, 0xba, 0xce, 0x29,\n  0x83, 0x4c, 0x7f, 0x3d, 0x1b, 0xc7, 0xf9, 0x8a, 0x60, 0x6b, 0x0c, 0xe8,\n  0xda, 0x02, 0x42, 0x5f, 0x78, 0x08, 0xbb, 0x47, 0xa5, 0xc3, 0xa6, 0xab,\n  0xb4, 0x58, 0x96, 0xee, 0xaf, 0x1e, 0x08, 0xc6, 0x61, 0x5d, 0x3f, 0xb9,\n  0x7b, 0x52, 0x9e, 0xf3, 0xf2, 0x88, 0xca, 0xd0, 0xd4, 0xc7, 0xd4, 0x13,\n  0x80, 0x1c, 0x79, 0x0c, 0x94, 0x24, 0xcf, 0x2d, 0xb5, 0xaf, 0x8a, 0xcb,\n  0x9d, 0x4b, 0x7b, 0x65, 0x74, 0xe8, 0xa0, 0xbd, 0x7a, 0x9b, 0x2d, 0x31,\n  0x37, 0xe9, 0x77, 0xa2, 0xa5, 0xbf, 0xf3, 0x71, 0x2d, 0xdc, 0x79, 0x46,\n  0x1b, 0xd6, 0xe7, 0xf3, 0x49, 0x1d, 0x5a, 0xcd, 0x9d, 0x9a, 0xa9, 0x64,\n  0xc8, 0xc3, 0xf6, 0xf7, 0xe9, 0x89, 0xea, 0xfd, 0xc7, 0xc4, 0xea, 0x6f,\n  0x7d, 0x8c, 0xb9, 0x76, 0xcb, 0x96, 0x9c, 0x92, 0x42, 0xd6, 0xef, 0x3e,\n  0x97, 0xb3, 0x0e, 0xe6, 0x42, 0x1d, 0x35, 0xde, 0x93, 0xd2, 0xee, 0x1b,\n  0x5c, 0x9a, 0xd3, 0x3d, 0x73, 0x50, 0x19, 0xff, 0x33, 0xd3, 0x32, 0xea,\n  0xa7, 0xa7, 0x67, 0xd4, 0x4f, 0xd3, 0x7c, 0x57, 0xcd, 0x6b, 0x3a, 0x73,\n  0xd4, 0xaa, 0xb9, 0x4d, 0xa7, 0x8f, 0x9a, 0x30, 0x74, 0xe8, 0x84, 0x09,\n  0x83, 0x06, 0xc1, 0x01, 0x9e, 0x7a, 0x1b, 0x78, 0x46, 0x89, 0x82, 0xc2,\n  0x3c, 0xf9, 0xfd, 0xa4, 0x70, 0x1f, 0x22, 0x34, 0x42, 0xee, 0xe3, 0x8b,\n  0x6e, 0x70, 0x30, 0xa8, 0x3e, 0x6f, 0x5c, 0xa6, 0x89, 0xd0, 0x60, 0x7f,\n  0x3f, 0x2f, 0x87, 0x88, 0xd2, 0xa2, 0xe4, 0xe7, 0x8d, 0xed, 0x2e, 0x31,\n  0xd4, 0x5d, 0x77, 0x47, 0xea, 0x95, 0x13, 0x42, 0x39, 0x5e, 0xb4, 0xd9,\n  0xc3, 0x57, 0x96, 0xf6, 0x58, 0x39, 0xb4, 0xe5, 0xe8, 0xf8, 0xa8, 0xe4,\n  0xbe, 0xf5, 0x67, 0xde, 0x32, 0x71, 0x7c, 0xeb, 0x21, 0xe9, 0xc9, 0x7d,\n  0xbc, 0x0b, 0x66, 0x0c, 0x19, 0x3e, 0xab, 0x20, 0xc0, 0xa7, 0x8b, 0x8f,\n  0xef, 0xa8, 0x91, 0x15, 0x95, 0x81, 0xbe, 0xc5, 0x7e, 0x75, 0x5d, 0x73,\n  0xe2, 0x0e, 0xf5, 0xbd, 0x49, 0xf9, 0x5e, 0x7c, 0x4a, 0x61, 0xa2, 0x7a,\n  0xd1, 0x4a, 0xee, 0x7a, 0x34, 0xbd, 0x8f, 0x7c, 0xb3, 0xde, 0xfa, 0x8c,\n  0x59, 0xcd, 0x0f, 0x4e, 0x6a, 0x46, 0x52, 0x50, 0x42, 0xae, 0xd6, 0x6b,\n  0x4e, 0xdf, 0x5b, 0x9c, 0x87, 0xf5, 0xa3, 0x97, 0x9b, 0xea, 0x73, 0xba,\n  0xaa, 0x71, 0x8f, 0xd8, 0x99, 0xf8, 0xb4, 0x8e, 0xfa, 0xfe, 0xb3, 0xdd,\n  0x30, 0xae, 0xf9, 0x78, 0x85, 0xfc, 0x08, 0x80, 0x7e, 0xd5, 0xe8, 0xc3,\n  0x87, 0x39, 0xca, 0x7f, 0xae, 0x7f, 0xcb, 0xf5, 0x8f, 0xfa, 0x7e, 0xd7,\n  0xf7, 0x8c, 0x9c, 0xa7, 0xb4, 0xb7, 0x9c, 0x8d, 0x25, 0xc8, 0x67, 0x1d,\n  0xde, 0xe3, 0x7f, 0xed, 0xf4, 0x0b, 0xc2, 0x47, 0x84, 0xc8, 0xef, 0x11,\n  0xcb, 0x5b, 0x3a, 0xba, 0x90, 0x53, 0xb5, 0x90, 0x6f, 0xa4, 0xca, 0xa7,\n  0x98, 0xed, 0x9a, 0x66, 0xef, 0x23, 0xec, 0x76, 0x29, 0xac, 0x5d, 0x2b,\n  0xf1, 0xf3, 0x65, 0xe7, 0x59, 0xd7, 0x37, 0xc4, 0x2f, 0x84, 0x3e, 0x3e,\n  0x01, 0xc9, 0xae, 0xef, 0x11, 0x07, 0x58, 0xb1, 0x0f, 0xa7, 0x5c, 0x2d,\n  0x29, 0xc4, 0xe5, 0xbd, 0x0f, 0x57, 0x4d, 0x18, 0x3b, 0x6a, 0xca, 0x0f,\n  0xcf, 0x6a, 0xab, 0xee, 0x5b, 0xd5, 0xbc, 0x53, 0x5b, 0xfd, 0x82, 0xb3,\n  0x7d, 0xf7, 0x6e, 0xdd, 0xfa, 0xe9, 0x2f, 0x74, 0xbd, 0x7c, 0xf1, 0xd9,\n  0xf4, 0xac, 0xac, 0x24, 0x58, 0x79, 0xc1, 0xbf, 0x83, 0xfe, 0x17, 0x9b,\n  0xd9, 0x48, 0xd1, 0xae, 0xb0, 0x90, 0xc1, 0x27, 0x3c, 0xe6, 0xdb, 0xe5,\n  0x37, 0xbe, 0x5c, 0xbb, 0x0e, 0xdd, 0x5b, 0x73, 0x78, 0xea, 0x8e, 0x4a,\n  0xe1, 0x69, 0x18, 0x9e, 0x7d, 0x84, 0xa7, 0xa7, 0xfc, 0xfa, 0xa5, 0xa7,\n  0x51, 0x12, 0x14, 0x28, 0x70, 0x5c, 0x60, 0x64, 0x50, 0xa4, 0xdc, 0x07,\n  0x07, 0x04, 0x24, 0x25, 0x04, 0x04, 0xd4, 0xf1, 0x88, 0x66, 0xc2, 0x91,\n  0x9b, 0x03, 0xd7, 0xa6, 0x2e, 0x49, 0xad, 0x1e, 0x41, 0x6e, 0x71, 0x3e,\n  0xd8, 0xb8, 0xf1, 0xc1, 0x4f, 0x2a, 0xa7, 0x9c, 0xbd, 0xf5, 0xd6, 0x6f,\n  0xef, 0xbd, 0xaf, 0x79, 0xf7, 0x4e, 0xfa, 0x5f, 0x5f, 0x74, 0x59, 0xf5,\n  0x60, 0xb7, 0x7e, 0xda, 0xdb, 0x5d, 0xbe, 0xb8, 0xfc, 0x97, 0x4b, 0x20,\n  0x15, 0xbb, 0xd9, 0xc4, 0x51, 0x1a, 0x36, 0x09, 0x10, 0x31, 0xf2, 0x9b,\n  0xa9, 0x75, 0x0d, 0xdd, 0xe6, 0x3a, 0xe7, 0xb7, 0x89, 0xf9, 0x72, 0x9e,\n  0x9d, 0x7f, 0xed, 0x13, 0x27, 0xc9, 0x49, 0xa1, 0xa9, 0x01, 0x76, 0x39,\n  0x68, 0x82, 0x72, 0x8c, 0xd0, 0x2b, 0x8f, 0x9e, 0xe5, 0x19, 0x39, 0x01,\n  0x35, 0x43, 0xb9, 0xe1, 0x23, 0x83, 0xf7, 0x0c, 0xea, 0x3f, 0xe3, 0xf6,\n  0xdb, 0x67, 0xf4, 0x1b, 0xb8, 0x6b, 0x70, 0x51, 0x59, 0xcf, 0xae, 0xc5,\n  0xc5, 0x25, 0x25, 0xda, 0x39, 0xcd, 0xd3, 0xf9, 0x4d, 0xc0, 0xdc, 0xc1,\n  0x13, 0x16, 0x2f, 0x9e, 0x30, 0x78, 0x4e, 0xa0, 0x16, 0x75, 0xf9, 0xcf,\n  0xee, 0x23, 0x86, 0x17, 0x97, 0x0e, 0xae, 0x70, 0xcd, 0xbd, 0xf2, 0x33,\n  0x40, 0xe7, 0xf5, 0x08, 0x5c, 0x1b, 0x5f, 0x18, 0x23, 0x57, 0x2a, 0xf9,\n  0xea, 0xa3, 0xa7, 0xf5, 0x17, 0xb8, 0xc7, 0xcb, 0x3f, 0xbd, 0x3d, 0x56,\n  0x14, 0x87, 0xa8, 0xc7, 0xe7, 0x72, 0x92, 0x72, 0xf3, 0x02, 0xd2, 0xe4,\n  0xfb, 0xe6, 0x01, 0x61, 0xe7, 0x0f, 0x35, 0x6f, 0xce, 0x7f, 0x59, 0x3e,\n  0xda, 0x13, 0x3e, 0x59, 0x59, 0x3e, 0xce, 0x21, 0x3e, 0xc4, 0x7b, 0x4f,\n  0x14, 0x3c, 0x07, 0x2d, 0x6f, 0xe1, 0x27, 0x42, 0x45, 0xd3, 0xc2, 0x1c,\n  0x39, 0xb7, 0xdb, 0x35, 0x8f, 0x4a, 0x79, 0x2b, 0x0a, 0x5a, 0x76, 0xbb,\n  0x3e, 0x54, 0xbe, 0x79, 0xa2, 0xeb, 0x63, 0xf5, 0x62, 0x79, 0x17, 0x23,\n  0x34, 0x38, 0xa0, 0x6e, 0x1d, 0xbf, 0x3a, 0xac, 0xd0, 0xf4, 0xf1, 0x4a,\n  0x08, 0xf0, 0xf2, 0x95, 0x7f, 0x69, 0x84, 0x25, 0xd9, 0xe5, 0x70, 0xf9,\n  0xc5, 0xe0, 0x3c, 0x35, 0xbf, 0x25, 0x25, 0x69, 0x6d, 0xfb, 0xae, 0x18,\n  0x3d, 0x70, 0xd4, 0x04, 0x67, 0x5e, 0xdf, 0x9f, 0xef, 0x9a, 0xd6, 0xb2,\n  0x60, 0xbe, 0x1e, 0xf1, 0x49, 0x59, 0x97, 0x92, 0x3e, 0x7a, 0xc4, 0xe5,\n  0xef, 0xda, 0x0f, 0x69, 0x9c, 0x26, 0x6d, 0xdb, 0xd3, 0xfc, 0xc3, 0x30,\n  0x18, 0xa3, 0xd1, 0x22, 0x49, 0x0b, 0x73, 0x7d, 0xf7, 0xc1, 0x5b, 0xde,\n  0x48, 0xf1, 0x25, 0x3f, 0xd0, 0xe5, 0x7b, 0x50, 0x89, 0x57, 0x6a, 0xe4,\n  0x77, 0x52, 0xa3, 0xd4, 0x0f, 0x9b, 0xeb, 0x87, 0x7c, 0x01, 0x4a, 0xf6,\n  0x48, 0xf2, 0xd2, 0x1c, 0x32, 0x40, 0x1c, 0x5a, 0x65, 0x1d, 0xcd, 0xd3,\n  0x53, 0x54, 0x78, 0x78, 0x33, 0xaf, 0xdc, 0xd2, 0xdd, 0xfd, 0x02, 0x81,\n  0x31, 0xc9, 0x28, 0xb6, 0x3e, 0xd7, 0x90, 0x56, 0x1b, 0xaa, 0xdd, 0x3e,\n  0xd6, 0x85, 0x2f, 0xdc, 0xe8, 0x92, 0x73, 0xc6, 0x15, 0x74, 0xe1, 0xe1,\n  0x31, 0xbe, 0xbb, 0xab, 0x8f, 0xfc, 0x4e, 0xca, 0x0d, 0xba, 0x14, 0x66,\n  0x13, 0xbe, 0x9a, 0xcd, 0x0b, 0x5c, 0x87, 0xb0, 0xe9, 0x0e, 0xdb, 0xbf,\n  0xf7, 0x91, 0x2f, 0x50, 0xb1, 0xcd, 0xd5, 0x44, 0x42, 0x7c, 0x4c, 0x52,\n  0x6c, 0x52, 0x64, 0x44, 0x38, 0x1b, 0xdd, 0xe0, 0xa0, 0x80, 0xba, 0xde,\n  0x9e, 0x1e, 0x76, 0x11, 0xad, 0x45, 0xcb, 0xa7, 0xb4, 0x35, 0xa6, 0xc0,\n  0x90, 0x90, 0x84, 0xd0, 0x1a, 0xcb, 0x74, 0x1a, 0xcb, 0xa8, 0x34, 0x7a,\n  0xd3, 0xa6, 0x61, 0x2c, 0x23, 0x09, 0xa9, 0xa9, 0x7a, 0x6a, 0x87, 0xe1,\n  0xb9, 0xce, 0xfb, 0xf4, 0x7e, 0xa5, 0x39, 0x25, 0xf5, 0xeb, 0x95, 0xe6,\n  0x4d, 0xb8, 0xc7, 0xe3, 0x9e, 0xbe, 0x7d, 0xef, 0xf3, 0xb9, 0x7d, 0x48,\n  0xeb, 0x2e, 0x0e, 0x2d, 0x40, 0x6b, 0xa5, 0x27, 0xb6, 0x18, 0xdf, 0x25,\n  0x77, 0xc0, 0x90, 0xa0, 0xc0, 0xee, 0x81, 0x01, 0x73, 0x67, 0x13, 0x3f,\n  0xa7, 0xc6, 0xcf, 0xec, 0x5c, 0xd6, 0xb9, 0x7d, 0xb9, 0xca, 0x33, 0x1a,\n  0xe2, 0x87, 0x74, 0x5d, 0x3e, 0x7d, 0xd8, 0x51, 0xfb, 0x51, 0x8f, 0x38,\n  0xc0, 0xda, 0x2a, 0x3a, 0x6b, 0x69, 0xc2, 0x7d, 0xaf, 0x3a, 0x42, 0xad,\n  0xc0, 0x3a, 0xbb, 0x83, 0x3f, 0x8c, 0x0d, 0xe0, 0xc5, 0xb0, 0x86, 0xde,\n  0x66, 0xf9, 0x4b, 0x03, 0xd7, 0x57, 0xb3, 0x39, 0x94, 0x77, 0xf8, 0x61,\n  0xb8, 0x7e, 0x58, 0xce, 0x89, 0x94, 0x6b, 0xe6, 0x10, 0x4f, 0xbb, 0x7c,\n  0x86, 0x71, 0x7c, 0x77, 0xb2, 0x2f, 0x9b, 0x56, 0x21, 0x0f, 0xae, 0x26,\n  0x69, 0x58, 0x2c, 0xd6, 0x93, 0xa4, 0xc1, 0x20, 0xce, 0x5c, 0xeb, 0x2a,\n  0x16, 0xba, 0x0a, 0xa1, 0x5f, 0x21, 0xc3, 0x3a, 0x3d, 0x35, 0x31, 0x1e,\n  0x7e, 0x31, 0x49, 0x41, 0xc9, 0x29, 0x89, 0x5e, 0xbe, 0x8c, 0xaa, 0x10,\n  0xb5, 0x2a, 0xb8, 0xd7, 0x56, 0x35, 0xb8, 0x02, 0xdc, 0x23, 0x2b, 0x20,\n  0xa8, 0xc6, 0x08, 0xd3, 0x83, 0x5a, 0x0d, 0xeb, 0x3e, 0xa1, 0x60, 0xce,\n  0xb4, 0x0e, 0xe3, 0xe2, 0xc2, 0x86, 0x15, 0x57, 0x0e, 0xef, 0x5b, 0xd0,\n  0xb1, 0x5d, 0xd9, 0x80, 0x6e, 0x65, 0xa5, 0xdd, 0x8a, 0x4a, 0x8b, 0x4a,\n  0xf4, 0x88, 0x7a, 0x39, 0x1d, 0x66, 0xf7, 0xba, 0x63, 0x75, 0xeb, 0xfc,\n  0x26, 0xed, 0x2a, 0x46, 0x68, 0x83, 0x9d, 0xdb, 0xbb, 0x74, 0xe8, 0x57,\n  0xa1, 0xc5, 0x3b, 0xcf, 0x0f, 0x9e, 0x7c, 0xcb, 0xa0, 0xc1, 0x93, 0xc6,\n  0xaa, 0xbc, 0xa1, 0x82, 0x8c, 0x3f, 0xdc, 0x68, 0x24, 0x12, 0x45, 0x86,\n  0x68, 0x22, 0x1e, 0x2a, 0xac, 0xeb, 0xeb, 0xad, 0x7b, 0x69, 0x41, 0x5a,\n  0x1d, 0xcf, 0x28, 0x4d, 0x78, 0x1b, 0x45, 0xae, 0xb7, 0xf0, 0x1a, 0xd9,\n  0xd4, 0x44, 0x3e, 0xd1, 0x47, 0x7e, 0x3b, 0x47, 0xd8, 0x27, 0x09, 0x4f,\n  0x5f, 0xad, 0x8e, 0xb7, 0x67, 0x9d, 0x4a, 0xe1, 0xe5, 0xa5, 0x8e, 0xea,\n  0xb5, 0x9b, 0xba, 0x0b, 0x6f, 0x6f, 0x31, 0x44, 0xbe, 0xa4, 0x34, 0x56,\n  0x7e, 0xc6, 0xb7, 0x81, 0x3a, 0xb3, 0x9e, 0xaf, 0x3a, 0xd8, 0x17, 0xfc,\n  0x1b, 0x7e, 0xbf, 0xc2, 0xd8, 0x4c, 0xd6, 0xd2, 0xcc, 0x26, 0x99, 0x39,\n  0x8d, 0x1a, 0x64, 0xd4, 0x4b, 0x49, 0x42, 0x9e, 0xc4, 0x84, 0xd8, 0x98,\n  0xe8, 0x40, 0xa6, 0xba, 0x00, 0x3f, 0xec, 0x12, 0x46, 0xee, 0xa6, 0xb2,\n  0xe3, 0xc6, 0x61, 0xfc, 0xdf, 0x3a, 0x00, 0x8c, 0xd5, 0xad, 0x73, 0xc0,\n  0xc4, 0xa4, 0xa4, 0x10, 0xc3, 0xb2, 0x4c, 0x52, 0x40, 0x80, 0x75, 0xf5,\n  0xd2, 0xc0, 0x81, 0x85, 0x9e, 0x89, 0xd1, 0x85, 0xad, 0xdb, 0xb4, 0x2c,\n  0x48, 0x6f, 0x9d, 0x52, 0xd2, 0xb1, 0xd0, 0xe1, 0x99, 0xd7, 0x76, 0x60,\n  0x8f, 0x96, 0xdd, 0x7a, 0x14, 0x8f, 0xee, 0xd9, 0xb6, 0x7d, 0xdf, 0x61,\n  0xc3, 0xf4, 0xa3, 0x23, 0x47, 0x1a, 0xa3, 0x27, 0xfb, 0x97, 0x74, 0x68,\n  0xdd, 0xd3, 0xc7, 0xee, 0x48, 0xed, 0x98, 0x5f, 0x3c, 0x3c, 0x60, 0xec,\n  0xb0, 0x61, 0xda, 0xa5, 0xe6, 0x05, 0xcd, 0x73, 0x9c, 0xef, 0x3a, 0x2f,\n  0x77, 0x6d, 0x91, 0xdf, 0x41, 0xfd, 0x7d, 0xf3, 0x6f, 0x8c, 0x03, 0xda,\n  0x87, 0xcc, 0x93, 0xa9, 0x85, 0x49, 0xe2, 0xea, 0x6f, 0x83, 0x0d, 0x51,\n  0x5f, 0x29, 0x2c, 0x91, 0xf7, 0x2a, 0xc8, 0xab, 0x03, 0xb4, 0x00, 0xf9,\n  0x95, 0xc2, 0x9a, 0x9f, 0xac, 0x96, 0xab, 0x6a, 0x42, 0xc8, 0xc9, 0x01,\n  0xfd, 0x32, 0x22, 0xc2, 0x12, 0xec, 0x21, 0xe9, 0xfa, 0xd7, 0xdf, 0x94,\n  0xb7, 0x6b, 0x90, 0x19, 0x93, 0xe4, 0x13, 0xea, 0x15, 0x96, 0x50, 0xac,\n  0xbe, 0x95, 0x6f, 0xbe, 0xae, 0x25, 0x5a, 0xdf, 0xac, 0xf5, 0xdc, 0x21,\n  0xbf, 0x5d, 0xa2, 0x37, 0xce, 0x08, 0x4a, 0xcb, 0x0b, 0x93, 0xef, 0x38,\n  0xf5, 0xcc, 0xd8, 0xd6, 0xe9, 0x6d, 0x40, 0xfb, 0x29, 0xf6, 0x6c, 0xfd,\n  0x4b, 0x7f, 0xf3, 0x3f, 0x35, 0x57, 0xca, 0x3f, 0x0b, 0x7e, 0x41, 0xad,\n  0x93, 0xf2, 0x6f, 0x60, 0xc9, 0xe7, 0x70, 0x5c, 0xdf, 0xd7, 0x37, 0x8c,\n  0x74, 0x39, 0x51, 0xa6, 0x89, 0x62, 0xd7, 0x59, 0x92, 0x87, 0x23, 0x5a,\n  0x4e, 0x96, 0xd5, 0xdb, 0x8b, 0xe7, 0xfb, 0xaa, 0x4d, 0xc5, 0x05, 0xb9,\n  0x95, 0x90, 0x74, 0xf2, 0xc8, 0x77, 0xc9, 0xdd, 0xe5, 0x37, 0xdb, 0xfe,\n  0xe9, 0x5b, 0xbb, 0x8e, 0x30, 0xd6, 0xbe, 0xa4, 0x80, 0x89, 0xcd, 0xf4,\n  0x0a, 0xe7, 0x3e, 0xad, 0xad, 0x6b, 0xfd, 0x90, 0xd9, 0xbe, 0x4c, 0x9c,\n  0xa5, 0xdc, 0x69, 0x85, 0xc9, 0xea, 0x6f, 0x29, 0xd0, 0xa0, 0xfe, 0xf8,\n  0x8a, 0xc6, 0x4a, 0x6d, 0xfd, 0xc1, 0x0b, 0xf9, 0x0a, 0xbb, 0xa2, 0x62,\n  0x97, 0x7f, 0x7a, 0x84, 0x95, 0x23, 0x2d, 0x27, 0x28, 0x29, 0x7e, 0xd2,\n  0x0b, 0x93, 0x27, 0xb4, 0x1b, 0xa8, 0xf6, 0x13, 0xd9, 0xda, 0x56, 0xf5,\n  0x3c, 0xe2, 0xcd, 0xa6, 0xbf, 0xa2, 0x17, 0xc0, 0xce, 0xaa, 0xb1, 0x8c,\n  0x3b, 0x79, 0xe3, 0x41, 0x7d, 0x85, 0x92, 0xa9, 0x74, 0x88, 0xda, 0xd8,\n  0xa8, 0x4d, 0x95, 0xcd, 0xbd, 0xa9, 0x0a, 0x0b, 0x55, 0xdb, 0x29, 0xac,\n  0x6e, 0x67, 0x37, 0x23, 0xbf, 0x41, 0x99, 0xe7, 0x9a, 0x4c, 0x60, 0xe2,\n  0x67, 0xe4, 0x91, 0xcf, 0x05, 0x25, 0xb5, 0x09, 0x4e, 0x0f, 0xae, 0xe3,\n  0x17, 0x13, 0x10, 0xd5, 0xd0, 0x7b, 0xd1, 0x0b, 0xd3, 0x1d, 0x29, 0xad,\n  0x07, 0x35, 0x89, 0xcd, 0xf3, 0x1d, 0xd3, 0xf6, 0x9c, 0xc3, 0x2b, 0xd7,\n  0xc3, 0x33, 0xa9, 0x91, 0x7e, 0xc7, 0xe5, 0xb7, 0xe3, 0xbb, 0xb6, 0xab,\n  0xdf, 0x3d, 0xb8, 0x4d, 0x0b, 0xed, 0x77, 0x95, 0xcb, 0x9c, 0x64, 0xaf,\n  0xc2, 0xde, 0x84, 0x95, 0x23, 0xa3, 0x30, 0xfd, 0xba, 0x6f, 0x61, 0xba,\n  0xbe, 0x82, 0xe9, 0x12, 0xa0, 0x8e, 0x37, 0x4e, 0x97, 0x9f, 0xa6, 0xac,\n  0xde, 0xcd, 0xa9, 0xa1, 0xca, 0x98, 0xf5, 0xf0, 0xf3, 0x8f, 0xf0, 0x0a,\n  0x0e, 0x0b, 0x89, 0x6a, 0xd6, 0xf0, 0x9c, 0xcd, 0xc8, 0xf0, 0x08, 0x89,\n  0xd1, 0xa6, 0x38, 0xef, 0x69, 0x90, 0xa3, 0xbe, 0x81, 0x89, 0xed, 0xe6,\n  0xb5, 0xc8, 0x8e, 0x76, 0x0e, 0xa9, 0xdb, 0xe2, 0x77, 0xe1, 0x30, 0xe4,\n  0xd3, 0xdf, 0xe2, 0x93, 0x16, 0x2d, 0x5e, 0x53, 0xe5, 0xd6, 0x37, 0x42,\n  0x2e, 0xaf, 0x74, 0xce, 0xf4, 0x3e, 0x67, 0xcb, 0x50, 0x1f, 0x24, 0xd2,\n  0x55, 0x0f, 0xd5, 0xcf, 0xd6, 0xc0, 0xf9, 0x29, 0x99, 0x4f, 0xf8, 0xe5,\n  0x95, 0x97, 0x57, 0x79, 0x9f, 0xb3, 0xea, 0xab, 0xff, 0xf1, 0x79, 0x4d,\n  0xef, 0x2b, 0x5c, 0x9f, 0x8c, 0xb3, 0x59, 0xe0, 0xcb, 0x5c, 0xb7, 0x5a,\n  0xb4, 0xd1, 0x17, 0x88, 0x08, 0xbd, 0x85, 0x68, 0x65, 0xb4, 0x16, 0xd9,\n  0xfa, 0x49, 0xf6, 0x08, 0x5f, 0x88, 0x36, 0x5a, 0xa6, 0x48, 0x07, 0x62,\n  0xf5, 0x34, 0x51, 0x8f, 0xb6, 0xc6, 0x9a, 0x8f, 0xa8, 0x87, 0x63, 0xd3,\n  0x29, 0x3b, 0x6b, 0x53, 0x84, 0x37, 0x75, 0xd9, 0x40, 0x3f, 0x20, 0x0b,\n  0x68, 0x00, 0x84, 0x00, 0xad, 0x81, 0x3c, 0x20, 0xd3, 0x6a, 0x6f, 0xac,\n  0xf0, 0x7d, 0x44, 0x9c, 0xbc, 0x06, 0xf2, 0x55, 0xdd, 0x56, 0xe1, 0x63,\n  0xcc, 0x13, 0x05, 0xfa, 0x1d, 0xa8, 0xba, 0x44, 0x54, 0xe8, 0xd3, 0x44,\n  0x4b, 0xfd, 0x04, 0x65, 0x26, 0xc0, 0x84, 0xa8, 0x7f, 0xcc, 0xef, 0x6f,\n  0x44, 0x85, 0xd6, 0x13, 0x7e, 0x01, 0xec, 0xe7, 0xc7, 0x52, 0xe7, 0x23,\n  0x2a, 0x8c, 0xa5, 0x94, 0x17, 0x28, 0x7d, 0x69, 0x1f, 0x64, 0x95, 0x13,\n  0xa8, 0x4b, 0x11, 0x39, 0xf4, 0xf5, 0xd6, 0x3f, 0x15, 0xfd, 0xd1, 0x51,\n  0x18, 0x4f, 0x0a, 0x1f, 0xbd, 0x2b, 0x4b, 0x51, 0x53, 0xe8, 0xb7, 0x10,\n  0xa9, 0x5a, 0x17, 0x51, 0x2a, 0x65, 0xa6, 0x8c, 0x50, 0xbf, 0xab, 0x4c,\n  0xa7, 0x16, 0x21, 0xd2, 0xf5, 0x6c, 0xd1, 0x90, 0x14, 0xaf, 0x5c, 0x3b,\n  0x8d, 0xcc, 0x95, 0x40, 0x13, 0xe2, 0xbd, 0xaf, 0xa8, 0xab, 0xae, 0x6f,\n  0xa2, 0x5e, 0xc7, 0x89, 0xba, 0xf9, 0xba, 0x1e, 0xaa, 0xae, 0xcb, 0x8d,\n  0xff, 0x88, 0x72, 0x59, 0x0f, 0x6f, 0x89, 0x5f, 0x2e, 0xf1, 0xb4, 0xc7,\n  0x68, 0x3b, 0x25, 0x72, 0xb4, 0x31, 0xc2, 0x9f, 0xb6, 0x12, 0xed, 0x12,\n  0xfc, 0x03, 0x45, 0x1d, 0x3d, 0x40, 0x04, 0x6a, 0x4e, 0xc2, 0xe1, 0x43,\n  0x91, 0xa6, 0xcd, 0x12, 0xd1, 0xd8, 0xf1, 0x67, 0xca, 0x78, 0xa5, 0xbf,\n  0x65, 0x7b, 0xae, 0x07, 0x00, 0xb2, 0xae, 0x39, 0xe0, 0x27, 0x71, 0x48,\n  0xaf, 0x9a, 0xeb, 0xed, 0xc5, 0xfd, 0x46, 0xa1, 0xc8, 0xd6, 0x46, 0x8a,\n  0x78, 0xed, 0x32, 0x72, 0xca, 0x3e, 0xd8, 0x5e, 0xd5, 0x9d, 0x37, 0x2f,\n  0x6b, 0xcf, 0x29, 0x1b, 0x37, 0xd6, 0x06, 0x8b, 0x70, 0x20, 0x40, 0xe9,\n  0x72, 0x33, 0xf2, 0xdc, 0x8b, 0x3c, 0xd8, 0x1b, 0xff, 0xf9, 0x51, 0x9f,\n  0xa2, 0x4d, 0x53, 0xfd, 0xd3, 0xf4, 0xff, 0x8a, 0x44, 0x06, 0x5f, 0x28,\n  0xf6, 0xaa, 0x8b, 0xed, 0xc3, 0x95, 0xdd, 0x6f, 0x00, 0xc6, 0x24, 0xd3,\n  0x54, 0xbe, 0xc8, 0xb4, 0x7c, 0x61, 0x01, 0x7e, 0x48, 0x53, 0xbe, 0xe8,\n  0x49, 0xc6, 0xd7, 0x53, 0xc4, 0xe0, 0xab, 0x58, 0xb7, 0x1f, 0xae, 0x05,\n  0xe4, 0x2a, 0x54, 0xa5, 0xf4, 0x45, 0x4d, 0x90, 0xbe, 0xc0, 0x67, 0xfa,\n  0x6d, 0xc8, 0x29, 0xed, 0x7e, 0x03, 0x30, 0x86, 0x8a, 0x86, 0xca, 0x17,\n  0x4d, 0xae, 0x06, 0x7c, 0xe0, 0xc4, 0xfe, 0x1d, 0x28, 0x4f, 0x00, 0xe7,\n  0x95, 0xfd, 0xdd, 0x7e, 0xb8, 0x16, 0x64, 0x9c, 0xb9, 0xda, 0x4b, 0x6a,\n  0x82, 0xf4, 0x85, 0xf2, 0xb5, 0x2c, 0xa5, 0xbe, 0x92, 0xe7, 0xb5, 0x25,\n  0xba, 0x2b, 0xfe, 0xb5, 0x95, 0x32, 0x46, 0x2b, 0x55, 0x19, 0xcb, 0x16,\n  0x2a, 0x4f, 0xd9, 0xa7, 0xc9, 0xff, 0x50, 0xca, 0x78, 0xae, 0xfc, 0x87,\n  0x92, 0x58, 0xd7, 0x6f, 0x32, 0x3f, 0xa5, 0x14, 0xc8, 0xea, 0xa5, 0xf5,\n  0x34, 0x7f, 0x95, 0x71, 0x87, 0xad, 0xd9, 0xa6, 0x9b, 0x67, 0x29, 0x83,\n  0x28, 0xbf, 0x57, 0x3e, 0xd0, 0xd9, 0xa1, 0x51, 0xea, 0x23, 0x00, 0x1b,\n  0xf1, 0xc9, 0xf8, 0x50, 0x31, 0x2a, 0xc7, 0x08, 0x71, 0xaa, 0xc0, 0x87,\n  0x78, 0xc7, 0x5e, 0x72, 0xcc, 0x50, 0xb6, 0xb1, 0xca, 0x72, 0x55, 0xfa,\n  0xa8, 0xd2, 0x97, 0x3e, 0x7f, 0x4a, 0x1f, 0x2a, 0x3b, 0x5e, 0x5b, 0x6e,\n  0xc6, 0x46, 0xd6, 0xb5, 0x35, 0xd6, 0xf2, 0xae, 0x2b, 0xd7, 0xe2, 0xef,\n  0xad, 0xa2, 0xa9, 0x1c, 0x7f, 0x72, 0x0c, 0x58, 0x65, 0x2b, 0xab, 0xec,\n  0x24, 0xc7, 0xa4, 0x1c, 0x17, 0xb5, 0x96, 0x8c, 0x57, 0x35, 0x66, 0xae,\n  0x2d, 0x65, 0xac, 0x48, 0x9f, 0xfd, 0x8f, 0xa5, 0x1c, 0xeb, 0x6a, 0xbc,\n  0xa9, 0x5b, 0xd8, 0xc8, 0xed, 0x1e, 0xf3, 0x8c, 0xbb, 0x6b, 0x4b, 0xad,\n  0x23, 0xfe, 0x7f, 0xdc, 0xfc, 0x4d, 0x9f, 0xe3, 0xf2, 0xb7, 0x8c, 0x77,\n  0x19, 0x73, 0x6e, 0x9d, 0xdc, 0xb2, 0x69, 0x4f, 0x62, 0x67, 0x09, 0xd3,\n  0x81, 0x85, 0xac, 0xef, 0x3b, 0xd5, 0x5c, 0x98, 0x2e, 0x7e, 0xa7, 0xdc,\n  0x0f, 0xf0, 0x5b, 0x6f, 0x23, 0x2e, 0x03, 0x4b, 0x64, 0xec, 0xc8, 0x31,\n  0xa7, 0xcf, 0x85, 0x56, 0x81, 0xfc, 0x6b, 0x6f, 0x94, 0xcd, 0x19, 0x47,\n  0xc7, 0x29, 0x73, 0xcc, 0x0b, 0x5a, 0x7f, 0xf3, 0x87, 0xea, 0x79, 0x0e,\n  0xfb, 0xeb, 0x1d, 0x44, 0xb0, 0x8a, 0x0b, 0x64, 0x92, 0x7e, 0x97, 0xbc,\n  0x95, 0x3f, 0xa5, 0xff, 0x86, 0x32, 0x06, 0xad, 0x39, 0x4e, 0xcf, 0x10,\n  0x49, 0xd6, 0x38, 0xaa, 0x50, 0xe3, 0xa6, 0x40, 0x24, 0xab, 0x39, 0x0e,\n  0xfd, 0x8c, 0x64, 0xec, 0xc7, 0xfc, 0x46, 0x99, 0x6b, 0xf8, 0xa1, 0x9b,\n  0x1c, 0x93, 0x52, 0x6f, 0x39, 0x1f, 0x7d, 0x25, 0x32, 0xd4, 0xdc, 0xd5,\n  0x5f, 0xf4, 0xd0, 0x47, 0x62, 0x27, 0x19, 0x5f, 0x72, 0xcc, 0x79, 0x08,\n  0xbb, 0x3e, 0x50, 0x34, 0x95, 0xed, 0xda, 0xd7, 0xd6, 0xf8, 0xe9, 0x09,\n  0xbe, 0xc4, 0x93, 0x31, 0x13, 0x6b, 0x5e, 0x54, 0x73, 0x88, 0xfc, 0x0b,\n  0xd1, 0x9f, 0xe1, 0x57, 0x69, 0x8f, 0x95, 0xcc, 0xa3, 0x83, 0x18, 0x3b,\n  0x12, 0x9f, 0x78, 0xc7, 0x36, 0xde, 0x8a, 0xe6, 0x07, 0xfc, 0x4e, 0x33,\n  0x7f, 0x67, 0xbf, 0x5a, 0x02, 0xff, 0x7c, 0x74, 0xfc, 0x5d, 0xd5, 0xcb,\n  0x3e, 0x23, 0x5d, 0x75, 0x4a, 0xc7, 0x6f, 0xc0, 0x97, 0x3a, 0xcf, 0x43,\n  0x0f, 0x69, 0x5b, 0xd7, 0x1c, 0x12, 0x23, 0x63, 0xd6, 0xd8, 0xc0, 0x96,\n  0x71, 0x9f, 0x85, 0x73, 0x13, 0xe5, 0x44, 0x7c, 0x28, 0x75, 0xbd, 0x43,\n  0xe9, 0x51, 0x51, 0x6d, 0xaf, 0x6d, 0xc2, 0x43, 0xd2, 0x32, 0x7a, 0xab,\n  0x35, 0x36, 0x95, 0x6c, 0x7a, 0x98, 0x04, 0xd5, 0xe7, 0x10, 0x34, 0x96,\n  0x2a, 0x1a, 0x15, 0x57, 0xd9, 0xca, 0x35, 0x87, 0x79, 0x4b, 0x9a, 0x6e,\n  0x5b, 0xa9, 0x31, 0xb6, 0x47, 0x94, 0xda, 0x7c, 0x49, 0x10, 0x02, 0xb8,\n  0xde, 0xce, 0x56, 0xba, 0x3f, 0xe5, 0x9d, 0xc0, 0x74, 0x11, 0x6b, 0x8b,\n  0x56, 0xbc, 0x43, 0xd5, 0x3c, 0xd0, 0x47, 0x34, 0xd3, 0x0b, 0xb1, 0xe1,\n  0x16, 0xec, 0xd1, 0x41, 0x04, 0xa9, 0x31, 0xfc, 0x13, 0x73, 0xf9, 0xf7,\n  0x22, 0x01, 0x5d, 0xca, 0x15, 0x04, 0x00, 0x6d, 0x85, 0x43, 0xff, 0x9e,\n  0x72, 0xb6, 0x35, 0x17, 0x4d, 0x54, 0x6b, 0x82, 0x5a, 0x4f, 0xb4, 0x93,\n  0x22, 0x58, 0xc5, 0xe3, 0x07, 0xd8, 0x92, 0xb5, 0x00, 0x99, 0xca, 0xb1,\n  0x4d, 0x57, 0xe3, 0x4e, 0xc6, 0xd4, 0x12, 0xae, 0x77, 0x89, 0x40, 0xc3,\n  0x9b, 0xb2, 0x07, 0xf8, 0x3f, 0x89, 0x18, 0xa3, 0x3d, 0xd7, 0x8d, 0x88,\n  0xff, 0x26, 0xca, 0x37, 0x5e, 0x92, 0xb7, 0xf6, 0xb3, 0xb2, 0x79, 0x8e,\n  0xb5, 0x0e, 0x9d, 0x97, 0xe3, 0xdc, 0xe8, 0x4a, 0x46, 0x30, 0x55, 0xad,\n  0x43, 0x5e, 0x52, 0x06, 0xc5, 0x63, 0x32, 0xbf, 0x83, 0x19, 0x77, 0xdb,\n  0xa1, 0x6d, 0x8d, 0x87, 0x6b, 0x4b, 0xf7, 0xf8, 0xd0, 0xce, 0xb3, 0x8e,\n  0x9c, 0x71, 0x81, 0xf6, 0x88, 0xe9, 0x14, 0x9b, 0x84, 0x8f, 0x82, 0x8b,\n  0x22, 0x4e, 0x96, 0xe4, 0x88, 0x2e, 0x58, 0xcb, 0x9a, 0x2d, 0x98, 0x3b,\n  0x84, 0x68, 0xc1, 0x3a, 0xd2, 0xdd, 0x08, 0x13, 0x9d, 0x6d, 0x0f, 0x89,\n  0x6c, 0x71, 0x86, 0x71, 0xb4, 0x1a, 0x68, 0x4a, 0xff, 0xa6, 0x94, 0xbf,\n  0xb1, 0xde, 0xdc, 0x69, 0xb6, 0xd1, 0x56, 0xa8, 0xb9, 0x57, 0xe6, 0x01,\n  0x09, 0x86, 0xa7, 0x28, 0xa2, 0x0c, 0x33, 0x72, 0xe9, 0xef, 0x29, 0x9a,\n  0x1a, 0x97, 0xc8, 0x83, 0xc9, 0x7e, 0x65, 0xac, 0x12, 0xe7, 0x8d, 0x8d,\n  0x56, 0x22, 0x1e, 0x08, 0x00, 0x92, 0x00, 0xf6, 0xf5, 0xe6, 0x01, 0xd6,\n  0x2b, 0x6f, 0x20, 0x16, 0x88, 0x06, 0x22, 0x90, 0x53, 0xc8, 0xcc, 0xa7,\n  0xba, 0x94, 0x69, 0xeb, 0x45, 0xe0, 0x3f, 0x6a, 0x7c, 0xcb, 0x31, 0x27,\n  0xc4, 0xd3, 0xc0, 0x88, 0x2b, 0x19, 0x0e, 0x78, 0xf5, 0x24, 0x48, 0x3b,\n  0x49, 0x5d, 0x88, 0x67, 0x0f, 0x89, 0x6b, 0xf4, 0xc5, 0x0e, 0xc4, 0x89,\n  0x5a, 0xbf, 0xad, 0xb9, 0x1e, 0x7a, 0xf9, 0x86, 0x3f, 0x71, 0x32, 0x9a,\n  0xb9, 0xcc, 0x87, 0xb9, 0xe4, 0x49, 0xe2, 0x57, 0xc6, 0x99, 0x8c, 0x2d,\n  0xe9, 0x03, 0x7c, 0x6c, 0x3c, 0x28, 0x22, 0x8c, 0x10, 0x7c, 0xb7, 0x0e,\n  0x5b, 0xcf, 0x10, 0x5e, 0xc6, 0xc3, 0xc4, 0xc8, 0xb7, 0xd0, 0x78, 0x56,\n  0xc9, 0x60, 0x33, 0x9e, 0x00, 0x5f, 0xce, 0xa7, 0x9f, 0x60, 0xdf, 0x39,\n  0xc2, 0xc3, 0xf8, 0x98, 0xdf, 0x65, 0xfc, 0xee, 0x86, 0x1e, 0xdf, 0x63,\n  0x77, 0xc6, 0xa7, 0x35, 0x46, 0x5c, 0xf3, 0xcb, 0x4c, 0xfa, 0xb1, 0xf6,\n  0xbb, 0x4b, 0xdb, 0x21, 0xd1, 0xd2, 0xd6, 0x09, 0xfe, 0xb9, 0xb4, 0xaf,\n  0x14, 0x79, 0x64, 0xf6, 0x2d, 0x8d, 0x45, 0xa2, 0xa0, 0x9a, 0xef, 0x3c,\n  0x6c, 0x7f, 0x96, 0x7e, 0x15, 0x22, 0xc7, 0xf8, 0x4c, 0x04, 0x1b, 0x55,\n  0x80, 0x8c, 0xdd, 0x95, 0x2a, 0xce, 0xc2, 0x88, 0x1d, 0x2f, 0x62, 0xaa,\n  0x42, 0xe5, 0x22, 0x81, 0x22, 0x8c, 0xb5, 0xdd, 0x53, 0x97, 0xe3, 0x21,\n  0x04, 0xd9, 0x17, 0x31, 0x36, 0xa2, 0x5d, 0x63, 0x46, 0xc5, 0xed, 0xe3,\n  0xd4, 0x37, 0x50, 0x71, 0x53, 0xa1, 0x62, 0xf7, 0x26, 0xe1, 0xcb, 0xb8,\n  0xf7, 0xd2, 0x77, 0x10, 0xc3, 0x37, 0xc3, 0xeb, 0x37, 0xea, 0xef, 0xa3,\n  0x5f, 0x23, 0xca, 0x2f, 0x45, 0xb9, 0x2d, 0x1e, 0x5d, 0x86, 0xf0, 0xbb,\n  0x0e, 0xb2, 0xdd, 0x59, 0x63, 0x0d, 0xcc, 0x24, 0x36, 0x3f, 0x65, 0x0e,\n  0x93, 0xf1, 0x44, 0xae, 0x53, 0x5d, 0xde, 0xc6, 0x18, 0x4b, 0x27, 0xa6,\n  0x07, 0x43, 0xf3, 0x7d, 0xda, 0xf7, 0x8b, 0x52, 0x7d, 0xbc, 0xe8, 0x2a,\n  0xc7, 0x9c, 0x3e, 0x58, 0x95, 0xae, 0xf5, 0xa4, 0x4c, 0x44, 0xe9, 0x0f,\n  0x91, 0x8b, 0x58, 0xa5, 0x9c, 0x13, 0xd4, 0xd8, 0x66, 0x7c, 0x31, 0x26,\n  0x2a, 0xf4, 0x2c, 0x64, 0x7b, 0x9b, 0xeb, 0x6e, 0xc8, 0x25, 0xc7, 0xf3,\n  0x78, 0x7e, 0x9f, 0xa7, 0x7c, 0x80, 0x52, 0xd2, 0x92, 0x63, 0xe8, 0x7e,\n  0x7e, 0xff, 0x46, 0xec, 0xcb, 0x79, 0xf3, 0x9a, 0x35, 0xdc, 0x3d, 0xa7,\n  0x57, 0xaf, 0xbd, 0x5f, 0x91, 0x4f, 0x35, 0x61, 0x0e, 0xb0, 0xca, 0x6a,\n  0x5e, 0x6e, 0xbb, 0x74, 0x16, 0x49, 0xda, 0xaf, 0xc2, 0x4f, 0xf9, 0x5d,\n  0xfa, 0xdc, 0x5d, 0xba, 0xd7, 0x39, 0xbf, 0xab, 0x4b, 0x39, 0x57, 0xc8,\n  0xf1, 0x2a, 0xe7, 0x16, 0x35, 0xf6, 0xae, 0x2d, 0x2d, 0x19, 0xf1, 0x47,\n  0x85, 0x1c, 0xc3, 0x72, 0x8e, 0x51, 0xe3, 0xdc, 0xed, 0x9f, 0x69, 0xd8,\n  0x29, 0x15, 0x7b, 0x77, 0x15, 0x86, 0x9a, 0x17, 0x2a, 0x59, 0x33, 0x99,\n  0xa3, 0x8d, 0x05, 0xe4, 0xdf, 0xf3, 0x18, 0x2b, 0x8b, 0x19, 0x13, 0xf5,\n  0x18, 0x27, 0xd3, 0x45, 0x92, 0x1e, 0xc1, 0x7c, 0x77, 0x82, 0xf8, 0x1d,\n  0xc0, 0x98, 0xff, 0x13, 0x3a, 0xf7, 0xab, 0x35, 0xda, 0xe5, 0x8f, 0x37,\n  0xb0, 0xf3, 0x72, 0xec, 0xdc, 0x5d, 0xe4, 0xaa, 0x39, 0xff, 0x08, 0xbc,\n  0x99, 0x1b, 0x6a, 0xcd, 0x6d, 0x5c, 0x65, 0xe0, 0xbf, 0xb4, 0xff, 0x7b,\n  0xf9, 0xef, 0x39, 0x4f, 0x2a, 0x65, 0x5c, 0x6d, 0xed, 0x56, 0x0e, 0xd3,\n  0xc2, 0x2a, 0x8b, 0x6b, 0xcd, 0x2f, 0x5c, 0x65, 0xbd, 0x5a, 0xdb, 0xdd,\n  0x63, 0xf7, 0x5f, 0xca, 0xeb, 0xf2, 0x05, 0x6b, 0xac, 0xff, 0x5b, 0x59,\n  0x33, 0x9f, 0xb8, 0xaa, 0x74, 0xe5, 0x7d, 0xae, 0x5c, 0xa5, 0x12, 0x1f,\n  0x9c, 0x60, 0x9d, 0xa9, 0xb4, 0xc6, 0xe0, 0x4c, 0xfa, 0x8e, 0x60, 0x3d,\n  0x9d, 0x86, 0xfe, 0x72, 0xbc, 0xfc, 0xe9, 0xca, 0x15, 0x8d, 0xfa, 0x0a,\n  0x27, 0x47, 0xad, 0xc5, 0xac, 0xc1, 0xf4, 0x6f, 0xa1, 0xe2, 0xb1, 0x88,\n  0xeb, 0xee, 0xe6, 0xcf, 0x2a, 0x0f, 0x2c, 0xc0, 0xcf, 0x4f, 0x13, 0xd3,\n  0x03, 0x45, 0x7f, 0x6c, 0x93, 0xe8, 0xce, 0xe7, 0xb0, 0x51, 0x5d, 0xb9,\n  0x36, 0xdb, 0x3c, 0xa0, 0x7d, 0x81, 0x75, 0x56, 0x8e, 0x21, 0x62, 0xd1,\n  0x96, 0xc3, 0x5c, 0xd1, 0x1d, 0x7a, 0xcf, 0x2b, 0xda, 0xe5, 0xd6, 0x3e,\n  0xa8, 0x11, 0xeb, 0x45, 0x03, 0x99, 0x2b, 0x68, 0x23, 0xc9, 0x3d, 0xa4,\n  0x8c, 0x85, 0x57, 0xf2, 0x2b, 0xfa, 0xa5, 0x28, 0x3b, 0x14, 0xe2, 0xcb,\n  0x58, 0x74, 0x71, 0xe7, 0x47, 0x8c, 0x01, 0x20, 0x8f, 0x71, 0x90, 0x08,\n  0x44, 0xd3, 0x3f, 0x4b, 0x8d, 0x0b, 0xc6, 0x87, 0xf6, 0x36, 0x79, 0x47,\n  0x37, 0xe4, 0x28, 0x15, 0x73, 0xc9, 0x49, 0xe6, 0x32, 0x6f, 0xb5, 0x91,\n  0x7b, 0x17, 0x3b, 0x6b, 0xb3, 0x6d, 0x33, 0xd0, 0x12, 0x5b, 0xc7, 0x10,\n  0x9b, 0x7e, 0xf0, 0xb7, 0x31, 0x6f, 0x78, 0x71, 0x7d, 0x11, 0x18, 0x57,\n  0x63, 0xae, 0xed, 0x29, 0x9f, 0x73, 0x32, 0x3f, 0xae, 0xce, 0xb3, 0xfe,\n  0xd7, 0x1c, 0xaf, 0xb6, 0xb1, 0x7d, 0x6d, 0xfe, 0xac, 0x6c, 0x75, 0x85,\n  0x7e, 0x35, 0x1f, 0x6b, 0x6c, 0xd7, 0x94, 0xd5, 0xdd, 0xc7, 0x78, 0x86,\n  0x3e, 0xf7, 0x5b, 0xb9, 0xd6, 0x4d, 0x57, 0x64, 0xad, 0x11, 0xe7, 0x65,\n  0x57, 0xc7, 0xad, 0x79, 0x14, 0x1d, 0x9e, 0x40, 0x17, 0x3f, 0xca, 0x6f,\n  0xae, 0xe3, 0x35, 0x41, 0xf4, 0x21, 0xef, 0xf5, 0xb7, 0xf2, 0xdf, 0x5e,\n  0xd7, 0xe9, 0xd2, 0x1a, 0x5b, 0x9f, 0x63, 0xdf, 0xe0, 0xca, 0xf5, 0x3f,\n  0x51, 0x39, 0xcb, 0x10, 0xfa, 0xad, 0x61, 0x1f, 0xdc, 0x4b, 0xed, 0x8d,\n  0x5d, 0xbe, 0xb8, 0x66, 0x9c, 0xfd, 0xcb, 0xf8, 0xc8, 0xab, 0x5e, 0xd7,\n  0x67, 0x33, 0xf6, 0xff, 0x8b, 0x9f, 0xee, 0x62, 0x2e, 0x3b, 0x46, 0x3b,\n  0xa0, 0x68, 0xb9, 0xe7, 0x6d, 0x1f, 0xe2, 0x44, 0xc6, 0xad, 0xcc, 0x27,\n  0x64, 0x2e, 0x7c, 0x40, 0xe8, 0xe4, 0x0b, 0x3e, 0xe4, 0x59, 0x75, 0x91,\n  0xd1, 0x5b, 0xe6, 0x9e, 0xd5, 0xba, 0xba, 0xf7, 0x14, 0xa6, 0x65, 0xdf,\n  0x09, 0xf4, 0x7b, 0xcc, 0x95, 0x7b, 0xaa, 0x31, 0x90, 0x8d, 0x6d, 0x2a,\n  0xd5, 0x1e, 0xd8, 0xcf, 0xca, 0x77, 0x12, 0xf4, 0x20, 0x62, 0xa6, 0xb2,\n  0x7a, 0x1f, 0x9d, 0x23, 0x41, 0xcd, 0x4b, 0x7d, 0xd5, 0xfe, 0xed, 0x75,\n  0xea, 0x9b, 0xaa, 0xb6, 0x56, 0xfc, 0xbe, 0x24, 0xd7, 0x0c, 0xf3, 0x32,\n  0x76, 0x29, 0x53, 0xb6, 0x77, 0xed, 0xb5, 0xbd, 0x65, 0x2e, 0xaa, 0x15,\n  0x12, 0xbb, 0x33, 0x84, 0x5d, 0x1b, 0x6c, 0xfe, 0xa1, 0x69, 0xb4, 0xdd,\n  0xa7, 0xf6, 0xdd, 0x65, 0x16, 0x80, 0x6b, 0x7e, 0xa5, 0xfa, 0x4c, 0x73,\n  0xe5, 0x5c, 0xc4, 0x43, 0x9e, 0xca, 0x37, 0xc9, 0xb3, 0x90, 0xb1, 0x6e,\n  0x0d, 0x28, 0x57, 0x20, 0x69, 0xf6, 0x67, 0xde, 0x6b, 0xa4, 0xf2, 0x2b,\n  0xd7, 0x5e, 0x5d, 0x37, 0xbf, 0xb2, 0x40, 0xee, 0xb3, 0x56, 0x30, 0x3e,\n  0x42, 0xad, 0xfd, 0xbb, 0x37, 0x34, 0x63, 0x99, 0xbf, 0xcb, 0xdc, 0xfb,\n  0x78, 0xf4, 0x15, 0x1a, 0x73, 0xb0, 0xf2, 0x4d, 0x2c, 0x76, 0x23, 0x9e,\n  0xb4, 0x5f, 0xd9, 0x93, 0x3d, 0x43, 0x8e, 0xf4, 0x8c, 0x88, 0x54, 0xe5,\n  0x07, 0x96, 0x3f, 0xc8, 0x19, 0xd1, 0xb7, 0x81, 0xd4, 0x51, 0xe6, 0x84,\n  0x32, 0x5e, 0xe4, 0x1a, 0xab, 0x6d, 0xb3, 0xce, 0x0a, 0xac, 0x3e, 0xc6,\n  0x01, 0xf0, 0xe9, 0x63, 0xf3, 0x04, 0xef, 0x4f, 0xe1, 0xcf, 0x1e, 0xdd,\n  0x9f, 0x75, 0x53, 0x42, 0x5d, 0xb5, 0xce, 0x0d, 0xa0, 0xef, 0x65, 0xfc,\n  0x51, 0xcc, 0xf5, 0x2d, 0xe6, 0x59, 0x09, 0x32, 0xbf, 0x92, 0x20, 0x36,\n  0x98, 0x27, 0xc9, 0x7d, 0xe4, 0x3e, 0xdf, 0x5b, 0xc1, 0x58, 0xae, 0x4d,\n  0xf9, 0xf7, 0xb5, 0x84, 0xe6, 0xce, 0xdf, 0xaa, 0x73, 0xba, 0x8d, 0x22,\n  0x56, 0x82, 0x96, 0x20, 0x3c, 0x81, 0x60, 0x2d, 0x86, 0xbc, 0xca, 0x05,\n  0x41, 0x80, 0xaf, 0x58, 0xcb, 0x1c, 0x1c, 0xe1, 0x02, 0x75, 0x3d, 0xfd,\n  0xca, 0x6f, 0xad, 0xad, 0xe8, 0x2c, 0x41, 0xbc, 0x44, 0x1b, 0xa0, 0xf9,\n  0x41, 0xc7, 0x0d, 0xf1, 0x40, 0x34, 0x75, 0xf2, 0xef, 0x86, 0x6f, 0x80,\n  0x7f, 0x1e, 0xf3, 0x44, 0x5f, 0x78, 0x87, 0x88, 0x00, 0xf6, 0x4d, 0xc5,\n  0xff, 0x00, 0xe9, 0xe4, 0xb4, 0xe9, 0x2a, 0xbf, 0x7c, 0x9c, 0x52, 0x42,\n  0x37, 0x0b, 0x22, 0x5c, 0xfb, 0x2a, 0x05, 0xfb, 0xad, 0x73, 0xa6, 0x58,\n  0xca, 0x1a, 0xa0, 0xfb, 0x59, 0x10, 0x8a, 0x4c, 0xc2, 0xb9, 0x54, 0x90,\n  0x13, 0x49, 0x60, 0x1f, 0x76, 0x41, 0xc6, 0xa0, 0xca, 0xbb, 0x65, 0x29,\n  0xcf, 0x9b, 0x8a, 0x19, 0x53, 0x2f, 0x9b, 0x67, 0x64, 0xfe, 0xa7, 0x72,\n  0xf0, 0x25, 0xe6, 0xdf, 0xfa, 0xdf, 0xd6, 0x98, 0x19, 0xc9, 0x98, 0x90,\n  0x7b, 0x9a, 0x50, 0xc6, 0xea, 0x1b, 0xa2, 0xb7, 0xf6, 0x33, 0x6d, 0x99,\n  0xc4, 0x6f, 0x99, 0xf9, 0x87, 0xee, 0x65, 0xee, 0x50, 0xb8, 0x83, 0x14,\n  0x2d, 0x15, 0xbb, 0x72, 0xbe, 0x55, 0xb9, 0xb8, 0x5c, 0xf7, 0x07, 0x59,\n  0x73, 0x3d, 0xe3, 0x4a, 0xed, 0x3d, 0x3e, 0x54, 0x71, 0x68, 0x73, 0xcf,\n  0xf9, 0xb2, 0x54, 0xb1, 0x20, 0xe7, 0x18, 0x77, 0xee, 0x5d, 0x97, 0xb8,\n  0x7a, 0x95, 0xfd, 0xc6, 0x50, 0xc6, 0x05, 0xf3, 0xb1, 0xee, 0xcd, 0xdc,\n  0xdf, 0x4b, 0xf4, 0x06, 0x92, 0xb5, 0xe3, 0xf0, 0x97, 0xf3, 0x6c, 0x10,\n  0xe5, 0x00, 0x64, 0x16, 0x94, 0xbb, 0x45, 0x08, 0xf3, 0x54, 0x6f, 0xe2,\n  0xb1, 0x37, 0x79, 0x67, 0x73, 0xf0, 0x93, 0xc8, 0xa1, 0x02, 0x81, 0x08,\n  0xc0, 0x60, 0xdf, 0xdd, 0x44, 0x4f, 0x63, 0x8f, 0x22, 0xdb, 0x00, 0xed,\n  0x0f, 0xf0, 0xea, 0x8a, 0x70, 0x09, 0xd0, 0x0b, 0x81, 0xae, 0x1c, 0x57,\n  0xa9, 0x46, 0x10, 0x7d, 0x6e, 0xc2, 0x76, 0xa7, 0xb0, 0xc1, 0x11, 0x62,\n  0x45, 0x8e, 0x7b, 0xc9, 0xeb, 0x98, 0xc8, 0xd4, 0xfe, 0x22, 0xee, 0x76,\n  0xc3, 0xeb, 0x57, 0xe4, 0x41, 0x16, 0x45, 0x63, 0x29, 0xf9, 0x6a, 0x3b,\n  0xe2, 0x7b, 0x0d, 0xf8, 0x2d, 0xd9, 0xcb, 0xfe, 0x47, 0xb4, 0x06, 0x7c,\n  0xc9, 0xf7, 0x5a, 0x33, 0x3e, 0x24, 0xa4, 0x69, 0x9f, 0x40, 0xef, 0x4b,\n  0xd1, 0x5a, 0x9c, 0x14, 0x91, 0x62, 0x8b, 0xf9, 0x26, 0x31, 0xd9, 0x5a,\n  0x2b, 0x17, 0xad, 0xb1, 0x77, 0x6b, 0xec, 0xe3, 0x82, 0x4b, 0xe0, 0x6c,\n  0x67, 0x3e, 0x5b, 0xcc, 0xf5, 0x2a, 0xd5, 0xcf, 0x01, 0x8d, 0xe6, 0xd8,\n  0xc9, 0x53, 0x1b, 0x4f, 0xec, 0x8c, 0x27, 0x67, 0x59, 0xce, 0xba, 0xd2,\n  0x18, 0x59, 0x96, 0x63, 0x57, 0xae, 0xb5, 0x9b, 0x15, 0x24, 0x68, 0x05,\n  0xe4, 0xff, 0xad, 0x44, 0x88, 0xac, 0x13, 0xdb, 0xd8, 0x5b, 0x0e, 0xc0,\n  0x4f, 0x43, 0x5d, 0xb1, 0x0f, 0xbd, 0x64, 0x2d, 0x9f, 0xb6, 0x47, 0xa1,\n  0x2d, 0x81, 0xbe, 0xe2, 0x07, 0xf4, 0x5a, 0xc1, 0x98, 0x5e, 0x81, 0x6d,\n  0x86, 0x42, 0x57, 0xde, 0x26, 0xee, 0x4c, 0xdd, 0xc3, 0xe0, 0x97, 0x09,\n  0x83, 0x3e, 0x49, 0xda, 0x47, 0xf4, 0x1b, 0x65, 0xfe, 0x45, 0xac, 0xe6,\n  0xa8, 0xb1, 0x23, 0xf1, 0x25, 0xde, 0x15, 0x9c, 0x1c, 0x37, 0x0e, 0x3e,\n  0x63, 0x6e, 0x33, 0x4f, 0xa9, 0xf1, 0xda, 0x97, 0xdf, 0xff, 0x31, 0x7f,\n  0x61, 0xce, 0xf9, 0x85, 0xba, 0x93, 0xda, 0x63, 0xe6, 0x67, 0xec, 0x75,\n  0x3f, 0xd3, 0x4e, 0x99, 0x17, 0xb5, 0x31, 0xe6, 0x0f, 0xd8, 0x33, 0x51,\n  0xcd, 0x7f, 0x8f, 0x23, 0x63, 0x57, 0x51, 0xdf, 0x78, 0x0f, 0x9b, 0xca,\n  0xf9, 0xab, 0x3f, 0x7b, 0xed, 0x4a, 0x65, 0x57, 0x39, 0x9f, 0x78, 0x57,\n  0x9f, 0x15, 0xf6, 0x15, 0x75, 0xc9, 0x2f, 0xf2, 0xac, 0x75, 0x3d, 0xbd,\n  0xfa, 0x3c, 0xb1, 0x52, 0xcd, 0x55, 0xe9, 0x6a, 0x6e, 0xda, 0xc0, 0xbc,\n  0x24, 0xf3, 0x69, 0x79, 0x7e, 0x28, 0xe7, 0x1c, 0xd7, 0x19, 0xe5, 0x95,\n  0xf3, 0xc9, 0x1f, 0xd9, 0xbf, 0xcb, 0xbc, 0x75, 0xb1, 0xb5, 0x2f, 0x94,\n  0xf1, 0xae, 0xab, 0x39, 0xb1, 0x44, 0xf9, 0x76, 0x39, 0xf3, 0x4d, 0x3e,\n  0x32, 0xf4, 0x13, 0x71, 0xca, 0x5e, 0xad, 0x45, 0x88, 0x38, 0x2d, 0xbc,\n  0xd5, 0xbc, 0x21, 0xed, 0xbc, 0x42, 0xe4, 0x62, 0x07, 0x87, 0xf8, 0x82,\n  0xf2, 0x1d, 0x11, 0xa6, 0x60, 0x83, 0x79, 0x90, 0x7d, 0x15, 0x73, 0x0b,\n  0xf3, 0x59, 0x94, 0xcb, 0xde, 0xca, 0x96, 0x2b, 0xcc, 0x1f, 0x95, 0xdd,\n  0x1f, 0xb1, 0x6c, 0xff, 0x11, 0xb6, 0x64, 0xac, 0x83, 0xff, 0xa3, 0x65,\n  0x77, 0x07, 0xf5, 0xc1, 0xda, 0x3c, 0x70, 0xef, 0xb1, 0x6c, 0xdf, 0x98,\n  0xf9, 0x45, 0xc2, 0x50, 0xa0, 0x3d, 0xb2, 0xcc, 0xc3, 0xcf, 0x4b, 0xac,\n  0x31, 0x73, 0x6d, 0x79, 0xfd, 0xb9, 0xda, 0x3f, 0x97, 0xff, 0xeb, 0x79,\n  0x9b, 0x83, 0x71, 0x2d, 0xcf, 0x71, 0xaf, 0x3a, 0x5f, 0xc3, 0xaf, 0xdf,\n  0x58, 0x6b, 0xbd, 0x6b, 0x0d, 0xfe, 0x9d, 0x32, 0x85, 0xdf, 0x61, 0xee,\n  0xfa, 0x1a, 0xe7, 0x6e, 0x31, 0xea, 0x9c, 0xd1, 0x95, 0x83, 0x75, 0xa8,\n  0x3e, 0x5b, 0x73, 0x97, 0xae, 0xf3, 0xb4, 0x22, 0xdd, 0xc7, 0xfc, 0x53,\n  0x9e, 0xcf, 0xb9, 0x7e, 0x57, 0x97, 0x27, 0xdc, 0x7b, 0xcd, 0xea, 0x3d,\n  0x67, 0x6d, 0xe7, 0x6c, 0xff, 0x76, 0xc6, 0xe6, 0x5e, 0xe3, 0xdd, 0x73,\n  0x8e, 0xbb, 0xbc, 0xfa, 0xcc, 0xad, 0xcb, 0x35, 0xa5, 0xff, 0xbf, 0x9e,\n  0xbd, 0xfd, 0xdb, 0x19, 0xdc, 0xff, 0xf5, 0x2c, 0xae, 0xaf, 0xb5, 0x07,\n  0xb4, 0xca, 0xeb, 0xce, 0x1e, 0xe4, 0xf9, 0x4b, 0x80, 0xda, 0xf3, 0xb8,\n  0x4a, 0x77, 0x1e, 0x51, 0xcb, 0x39, 0x9d, 0xf2, 0x05, 0xfc, 0xad, 0xf5,\n  0x57, 0x53, 0x39, 0x64, 0x47, 0xd7, 0x18, 0xfa, 0x47, 0x70, 0x9f, 0x65,\n  0x7f, 0x0d, 0x9c, 0x05, 0xde, 0x06, 0xde, 0x01, 0xde, 0x37, 0xbf, 0x93,\n  0xa0, 0xce, 0xbe, 0x6e, 0x00, 0xac, 0xd5, 0x42, 0x02, 0x7b, 0x06, 0xc1,\n  0x7e, 0x57, 0x7e, 0xbe, 0x42, 0x81, 0x3b, 0x37, 0xa9, 0x0d, 0xe4, 0x1f,\n  0x26, 0x32, 0x9a, 0x01, 0xfb, 0x81, 0x5d, 0xc0, 0x11, 0xe0, 0x65, 0xe0,\n  0xb8, 0xf9, 0x9d, 0xf1, 0x06, 0xfc, 0xfa, 0x33, 0x3e, 0xfb, 0x8b, 0x4e,\n  0x80, 0x06, 0x08, 0x20, 0x40, 0xe6, 0x22, 0xcc, 0x21, 0x1f, 0x02, 0x47,\n  0x35, 0xf0, 0xb5, 0x83, 0x2e, 0xbb, 0xe9, 0x5d, 0x80, 0xd1, 0x16, 0xdc,\n  0x84, 0xbc, 0x63, 0x81, 0x1b, 0x9d, 0x6f, 0xcb, 0xb8, 0x90, 0x67, 0x80,\n  0x25, 0xc0, 0x37, 0xc0, 0x69, 0xe0, 0x79, 0xe0, 0x05, 0xfa, 0xc9, 0x33,\n  0xb8, 0x7f, 0x82, 0x7d, 0x56, 0xbf, 0xe1, 0xc0, 0x32, 0xf3, 0x6f, 0x99,\n  0x37, 0xfd, 0x23, 0xe4, 0x82, 0xd7, 0x01, 0xf8, 0x02, 0xf8, 0x0c, 0xd8,\n  0x69, 0xe9, 0xb9, 0x1d, 0xfd, 0x3e, 0x64, 0x8d, 0xb4, 0xec, 0x5e, 0x6d,\n  0x47, 0x77, 0x2e, 0xd7, 0x9f, 0x39, 0x5c, 0x9e, 0x2b, 0xba, 0x65, 0xb6,\n  0xf8, 0xbb, 0xe9, 0xfe, 0x9b, 0x1f, 0x0d, 0xfc, 0x26, 0xc1, 0xd6, 0x04,\n  0x68, 0x05, 0xb0, 0xda, 0xdb, 0xea, 0xcb, 0xdf, 0xe6, 0x77, 0x12, 0xfe,\n  0xcd, 0x2f, 0xb6, 0x07, 0xc0, 0x5d, 0x2e, 0x84, 0x3d, 0x0d, 0x48, 0x05,\n  0xa2, 0x2d, 0x68, 0x64, 0x7e, 0x67, 0x4f, 0x41, 0xf6, 0x7f, 0xd1, 0xdb,\n  0xf6, 0x04, 0xfd, 0x37, 0x81, 0xdf, 0xdc, 0x82, 0x58, 0x20, 0x01, 0x08,\n  0xa0, 0x7f, 0x34, 0xfc, 0xff, 0x97, 0x18, 0x74, 0xdf, 0x53, 0xf9, 0x44,\n  0x7d, 0x80, 0xac, 0x93, 0xca, 0x51, 0x64, 0x59, 0x26, 0x26, 0xe9, 0xed,\n  0xc5, 0xd4, 0x1b, 0xca, 0x7e, 0x0b, 0xb4, 0x27, 0x9a, 0x7f, 0x1a, 0xd9,\n  0xe6, 0x2f, 0x46, 0x73, 0xf3, 0x0f, 0x5b, 0x6b, 0xc6, 0x7b, 0x1b, 0xf1,\n  0x28, 0xb0, 0x99, 0x7e, 0x53, 0xe5, 0x59, 0x32, 0xf0, 0x23, 0xf0, 0x39,\n  0xf0, 0xa9, 0x8a, 0xa1, 0xfe, 0xe6, 0x47, 0xea, 0xfe, 0x80, 0xbc, 0x57,\n  0xb0, 0x93, 0x98, 0xdb, 0x07, 0x8d, 0x36, 0x62, 0x85, 0xbb, 0xcf, 0x75,\n  0x31, 0x30, 0xc8, 0x02, 0xf7, 0xef, 0xa6, 0xae, 0x33, 0x1c, 0xfd, 0x35,\n  0xfa, 0xbd, 0x6d, 0x5e, 0xd0, 0xb7, 0x71, 0xdd, 0x46, 0xcc, 0xb4, 0xe0,\n  0xd5, 0x1b, 0xda, 0x68, 0xa0, 0x79, 0xce, 0x68, 0x80, 0x1d, 0x7b, 0x9a,\n  0x67, 0x8c, 0x46, 0xe6, 0x2f, 0xb6, 0xd1, 0xec, 0xf9, 0xdb, 0x88, 0x9f,\n  0xd1, 0xaf, 0xfb, 0x95, 0xd3, 0x38, 0x93, 0x11, 0x68, 0x66, 0x30, 0xa6,\n  0xd3, 0xc9, 0x55, 0xe6, 0xaa, 0xbc, 0xd4, 0x55, 0x27, 0xff, 0x12, 0xd3,\n  0xb2, 0x6a, 0x78, 0x1a, 0x7e, 0x9d, 0xc9, 0x2b, 0xe4, 0x7d, 0x2d, 0x79,\n  0xef, 0xea, 0x4a, 0xdb, 0xd2, 0x1a, 0xb0, 0x4c, 0x1b, 0x8c, 0x8e, 0x83,\n  0x59, 0x6b, 0xe4, 0xfd, 0x2e, 0x99, 0x43, 0xc8, 0x7c, 0x41, 0xae, 0x49,\n  0x32, 0xef, 0x24, 0x6f, 0x80, 0x4f, 0x32, 0x90, 0x23, 0xef, 0x31, 0xaa,\n  0x39, 0xb7, 0x05, 0xfb, 0xdd, 0x36, 0xa2, 0xa7, 0xfe, 0xb8, 0xba, 0x57,\n  0x59, 0x17, 0x08, 0x32, 0x8e, 0x92, 0x23, 0xb5, 0x60, 0xcf, 0x43, 0x9b,\n  0x5a, 0x1b, 0xe4, 0x9e, 0x27, 0x85, 0xf9, 0x69, 0x9a, 0xba, 0x6f, 0xc5,\n  0xc8, 0x30, 0x43, 0xe5, 0x3d, 0x36, 0xf9, 0x6d, 0x49, 0x6d, 0x07, 0xfb,\n  0xf6, 0x56, 0x22, 0xd4, 0x58, 0x40, 0x4e, 0x25, 0xf7, 0x37, 0x3d, 0xc8,\n  0x0f, 0x65, 0xbe, 0xad, 0xcb, 0x33, 0x6d, 0xf6, 0x2e, 0x72, 0x5d, 0x97,\n  0x7b, 0x6e, 0x39, 0x37, 0xc9, 0xb9, 0x52, 0x9e, 0x9f, 0xc9, 0x73, 0xd9,\n  0x65, 0x94, 0x8d, 0x14, 0x7f, 0xd7, 0x5c, 0x26, 0xf7, 0x50, 0x36, 0xe2,\n  0xe0, 0x0d, 0xe6, 0xc2, 0x86, 0xcc, 0x67, 0x97, 0xe8, 0x17, 0xc2, 0x3c,\n  0xfd, 0x0e, 0x38, 0xec, 0x01, 0xb4, 0x1e, 0xe4, 0x0c, 0xb9, 0xac, 0xfd,\n  0x23, 0x81, 0x31, 0x40, 0x7f, 0xe0, 0x5b, 0xd1, 0x51, 0x81, 0xbc, 0x3f,\n  0xeb, 0x86, 0x17, 0xa9, 0x7f, 0xd1, 0xba, 0x2f, 0x21, 0x73, 0xe3, 0xfd,\n  0xa2, 0x31, 0xf5, 0x65, 0x12, 0xc8, 0x85, 0x67, 0x21, 0xfb, 0xdf, 0x94,\n  0x77, 0xa8, 0x5b, 0xef, 0xff, 0x32, 0xbe, 0x88, 0x99, 0x9f, 0xaf, 0x01,\n  0x19, 0x53, 0x67, 0xad, 0xf2, 0xc7, 0x7f, 0x9b, 0x47, 0xc0, 0xf9, 0xc9,\n  0x02, 0xe6, 0x38, 0x72, 0xec, 0x6b, 0x71, 0x8e, 0x8b, 0x61, 0x6a, 0x6d,\n  0x3b, 0x2c, 0x06, 0x90, 0xab, 0x0a, 0xa3, 0x9e, 0x70, 0x18, 0xa9, 0xac,\n  0x85, 0x8d, 0x99, 0x33, 0x97, 0x61, 0xd3, 0x89, 0x6a, 0xaf, 0xa5, 0xce,\n  0x21, 0x8d, 0x5f, 0x84, 0x46, 0xbd, 0xc3, 0xd6, 0x8e, 0xf6, 0xb1, 0xd8,\n  0xe4, 0xbf, 0xea, 0x7e, 0x81, 0x3c, 0x53, 0x95, 0x67, 0xf3, 0xd2, 0x8e,\n  0xc1, 0xfa, 0x66, 0xfc, 0xd7, 0xdf, 0x05, 0xd0, 0x53, 0x80, 0x5d, 0x2b,\n  0x8c, 0x3b, 0xc0, 0x79, 0x95, 0x35, 0xe8, 0x0e, 0x86, 0xd8, 0x67, 0xd8,\n  0x79, 0x20, 0xb6, 0x35, 0xe1, 0x9d, 0x44, 0x1c, 0xb4, 0x11, 0x89, 0xec,\n  0x23, 0x3b, 0x6a, 0xaf, 0xe0, 0xcf, 0x2f, 0xc0, 0x6d, 0x4b, 0x5b, 0x09,\n  0xd7, 0x19, 0xe4, 0xd2, 0x13, 0x44, 0x92, 0x1a, 0xe3, 0x8b, 0x81, 0x5e,\n  0xc8, 0x27, 0xe7, 0xfe, 0xb9, 0xae, 0x52, 0xe5, 0xf1, 0x63, 0x85, 0xaf,\n  0x5a, 0xeb, 0x65, 0x39, 0x46, 0xdd, 0x87, 0x90, 0xf7, 0x4e, 0x85, 0xb1,\n  0x41, 0xb4, 0xb4, 0xb7, 0x53, 0x6b, 0xb2, 0xbf, 0xfe, 0x82, 0xb0, 0x1b,\n  0xbd, 0x84, 0xaf, 0xba, 0xef, 0xb9, 0x8f, 0xba, 0xae, 0xec, 0xfb, 0xee,\n  0x22, 0x27, 0x1f, 0x0c, 0xde, 0xc3, 0x4a, 0x56, 0x4f, 0x05, 0x7d, 0xa8,\n  0xaf, 0x47, 0xbe, 0x7d, 0x91, 0x9c, 0xb0, 0xb7, 0x68, 0x62, 0x78, 0x11,\n  0xaf, 0xdf, 0x89, 0x81, 0x7a, 0x4f, 0x70, 0x25, 0xf8, 0x88, 0x08, 0x23,\n  0x4e, 0x0c, 0x54, 0x75, 0x13, 0xf1, 0x8f, 0x94, 0x55, 0xbe, 0x3e, 0x5d,\n  0x69, 0x9a, 0xfa, 0x7b, 0xe8, 0x35, 0x4a, 0x18, 0xfa, 0xef, 0xc0, 0x38,\n  0x20, 0x89, 0xdc, 0xbf, 0x07, 0x32, 0x15, 0x31, 0xde, 0x4e, 0xc3, 0xb3,\n  0xc2, 0xbc, 0x88, 0x8c, 0x72, 0xdf, 0x5e, 0x47, 0x4b, 0x30, 0x9f, 0xd2,\n  0x17, 0xa8, 0x7b, 0x5b, 0x83, 0xe5, 0x39, 0xb2, 0xba, 0x77, 0x72, 0xc1,\n  0xba, 0x9f, 0xe2, 0xba, 0x87, 0x9b, 0x2e, 0xd7, 0x6b, 0xf6, 0x7d, 0xf2,\n  0x3e, 0x48, 0x05, 0x25, 0xd7, 0xe6, 0x6f, 0xc0, 0xb7, 0x16, 0x6c, 0xa2,\n  0xce, 0xa0, 0x34, 0x29, 0x07, 0x5a, 0xed, 0x7f, 0x51, 0x76, 0xb2, 0xf0,\n  0x2e, 0x72, 0xdd, 0xc8, 0x05, 0xe6, 0xc7, 0xc0, 0x47, 0xe4, 0x1a, 0xd1,\n  0x12, 0x8c, 0x8d, 0xa2, 0xc2, 0x76, 0x3f, 0x34, 0x8f, 0x8b, 0x02, 0x75,\n  0xbe, 0xf5, 0x38, 0xb9, 0xa0, 0xcc, 0x51, 0xf7, 0x03, 0xf2, 0xcc, 0xd5,\n  0x5f, 0xe5, 0xaa, 0xe5, 0xea, 0x1c, 0xc0, 0x46, 0x0e, 0xf0, 0x04, 0xd7,\n  0x1d, 0x85, 0x0d, 0xf0, 0x55, 0xeb, 0x59, 0x67, 0x91, 0xa3, 0xf2, 0xd3,\n  0x35, 0x8c, 0xef, 0x0e, 0xf8, 0xec, 0x3e, 0xd6, 0x92, 0x31, 0xc4, 0x46,\n  0x3a, 0x76, 0x6e, 0x40, 0xfe, 0x1b, 0x24, 0x82, 0xd8, 0x5f, 0x04, 0xd1,\n  0x5e, 0xa2, 0x3d, 0x45, 0xde, 0xbc, 0x58, 0x34, 0x34, 0x36, 0x01, 0x4f,\n  0x00, 0xc1, 0x57, 0x40, 0x8d, 0x53, 0x79, 0xa6, 0xed, 0xba, 0x0f, 0xea,\n  0x45, 0x0e, 0xec, 0x3a, 0x3f, 0x9b, 0x82, 0x0d, 0x9e, 0x14, 0xb9, 0xc6,\n  0xef, 0x2a, 0xfe, 0x75, 0xf9, 0x1c, 0xaa, 0x31, 0x0a, 0x3c, 0x39, 0x1e,\n  0xe4, 0xbe, 0xee, 0x84, 0x88, 0xd7, 0xdb, 0x32, 0x07, 0xfd, 0x89, 0xef,\n  0x3c, 0x91, 0xa9, 0x12, 0xbf, 0x49, 0xf0, 0xa4, 0xbf, 0xc9, 0x7c, 0x73,\n  0xc2, 0x3c, 0xa7, 0x77, 0xa3, 0x7f, 0x38, 0xb8, 0x2f, 0xb2, 0xbe, 0x94,\n  0x22, 0x5b, 0x3c, 0x6d, 0x7f, 0xc0, 0xe7, 0x57, 0xe0, 0x65, 0xe4, 0xf4,\n  0x13, 0x6d, 0xf0, 0x75, 0x2e, 0x32, 0x96, 0x13, 0x0b, 0x59, 0xea, 0xec,\n  0xe2, 0x19, 0x70, 0xf8, 0x8d, 0x2d, 0xe2, 0xb5, 0xfb, 0xcc, 0xbf, 0xe4,\n  0xfc, 0x80, 0x8c, 0x72, 0x7c, 0x1a, 0x7a, 0x24, 0x30, 0x06, 0x7b, 0xaf,\n  0x31, 0x9d, 0xda, 0xe7, 0x5c, 0xdf, 0xa6, 0xce, 0xec, 0x0b, 0x8c, 0x14,\n  0xf6, 0x61, 0xa5, 0xec, 0xc3, 0xec, 0xe6, 0x1f, 0xc8, 0x9e, 0xa4, 0xd6,\n  0x05, 0xb9, 0x07, 0x50, 0xf7, 0xc1, 0x45, 0x94, 0xcc, 0xb7, 0xc4, 0x8f,\n  0xa2, 0x2b, 0xd0, 0x41, 0xfc, 0x68, 0x7e, 0x04, 0xbc, 0x09, 0x7c, 0xc7,\n  0xef, 0xb6, 0x94, 0xaf, 0xd3, 0x97, 0x36, 0xf3, 0x33, 0x7e, 0x87, 0x52,\n  0xee, 0xd7, 0x86, 0x8b, 0x28, 0x09, 0x3a, 0xb9, 0xcd, 0xff, 0x0c, 0x7b,\n  0x4d, 0xa7, 0x02, 0x5f, 0xd1, 0x55, 0xd7, 0xe1, 0x7d, 0x23, 0xe8, 0x48,\n  0x5b, 0x47, 0xe6, 0x52, 0xab, 0x64, 0x3e, 0xea, 0x5a, 0x03, 0x3a, 0x5f,\n  0xf3, 0xbb, 0x7d, 0xf5, 0xf5, 0x7a, 0xf0, 0x4b, 0x45, 0xa3, 0xeb, 0xa0,\n  0x0f, 0xf5, 0x7d, 0x18, 0x23, 0x94, 0x5a, 0x92, 0x48, 0x71, 0x81, 0xf9,\n  0x37, 0xf0, 0x03, 0xd7, 0x86, 0xf5, 0xfb, 0x1b, 0xec, 0x2c, 0xcb, 0xcb,\n  0xd6, 0xef, 0x13, 0xe2, 0x07, 0x73, 0xaf, 0x04, 0xc6, 0x57, 0x57, 0x05,\n  0x3b, 0x6f, 0x04, 0x8c, 0x8b, 0xd3, 0xd0, 0xbf, 0xb9, 0x16, 0x98, 0xc6,\n  0xdc, 0xfe, 0xbf, 0xc2, 0x59, 0x7c, 0xfb, 0x03, 0x34, 0x7f, 0x70, 0xf5,\n  0x23, 0x3f, 0xed, 0x7a, 0x15, 0xbc, 0x2a, 0xea, 0xdd, 0x08, 0xd0, 0xab,\n  0x83, 0x76, 0x80, 0x71, 0x7a, 0x0d, 0xb0, 0x47, 0xec, 0xf0, 0xbf, 0x82,\n  0xc6, 0x0c, 0xaf, 0xee, 0xa3, 0x5d, 0x03, 0x1a, 0x73, 0xa8, 0x26, 0xf3,\n  0x8c, 0x6b, 0xe1, 0x14, 0xfb, 0x98, 0x1a, 0xa0, 0xf6, 0xbf, 0xb9, 0xa2,\n  0x03, 0xeb, 0x50, 0x63, 0xf6, 0x48, 0x61, 0x8c, 0xbd, 0x1c, 0xb9, 0x47,\n  0x91, 0x73, 0x83, 0x6d, 0x08, 0xf3, 0xaa, 0xac, 0x67, 0xde, 0x54, 0x90,\n  0x24, 0x1a, 0x68, 0x0b, 0x45, 0x26, 0x6b, 0x61, 0x7f, 0xe6, 0xac, 0x96,\n  0x6a, 0x4e, 0x59, 0xc5, 0x7a, 0xbf, 0x9a, 0x39, 0xa8, 0x1b, 0xe3, 0x3d,\n  0x84, 0x79, 0xef, 0x18, 0x73, 0x09, 0xab, 0x33, 0x73, 0x56, 0x5d, 0x75,\n  0xbd, 0x8e, 0xb1, 0xf3, 0x8d, 0x08, 0x31, 0x96, 0x0b, 0x0f, 0xf2, 0x51,\n  0x8d, 0xb9, 0xd5, 0xf5, 0x8c, 0x08, 0xfd, 0xed, 0xf9, 0xf4, 0x97, 0xf7,\n  0x72, 0x99, 0x9b, 0x6d, 0xf7, 0x89, 0x54, 0x5b, 0x96, 0xe8, 0xc6, 0x5c,\n  0xe6, 0xa1, 0x7f, 0x85, 0x0d, 0x12, 0x81, 0x0f, 0xc5, 0x50, 0x59, 0x1a,\n  0xbd, 0xb9, 0xde, 0x01, 0xfd, 0x3a, 0xa2, 0x42, 0xce, 0xb5, 0xea, 0xbe,\n  0xcb, 0x49, 0xf3, 0x07, 0xfb, 0x4c, 0x70, 0x77, 0x00, 0xaf, 0xa3, 0x6b,\n  0x8c, 0x9a, 0xbf, 0x0c, 0x35, 0xff, 0xc8, 0xeb, 0x8f, 0xd9, 0x97, 0x4a,\n  0x38, 0x85, 0xcc, 0x32, 0xef, 0xbc, 0x59, 0x94, 0x6a, 0x1f, 0x88, 0x44,\n  0xe3, 0x4e, 0xe6, 0xa3, 0x27, 0x90, 0x77, 0x38, 0x6b, 0x6f, 0x36, 0xe3,\n  0xab, 0x3d, 0x73, 0x4d, 0x11, 0xe3, 0x29, 0x48, 0xe5, 0xca, 0x0e, 0xd6,\n  0xf7, 0x5e, 0x7a, 0x0c, 0x73, 0xec, 0x34, 0xf6, 0x24, 0xdf, 0x33, 0xc7,\n  0xfc, 0x4d, 0xdd, 0xa3, 0xd6, 0xbd, 0xdc, 0xdb, 0x18, 0xef, 0xe7, 0x29,\n  0x3b, 0x30, 0xef, 0x7c, 0x2e, 0x32, 0x8c, 0x4f, 0x45, 0x82, 0x51, 0x25,\n  0x3a, 0xeb, 0x1f, 0x81, 0xfb, 0x05, 0xb9, 0xd6, 0x19, 0x11, 0xa2, 0xdf,\n  0xca, 0x78, 0x96, 0xe5, 0x6f, 0x80, 0x9c, 0xaf, 0xe4, 0xbd, 0xdd, 0xdf,\n  0xad, 0x9c, 0x77, 0xb2, 0xf9, 0x81, 0x6d, 0x19, 0x34, 0x7b, 0xaa, 0x7d,\n  0x8f, 0x43, 0xdd, 0x7b, 0x97, 0xe7, 0xe4, 0x93, 0x98, 0xdb, 0xda, 0x8a,\n  0x67, 0xb5, 0x43, 0x8c, 0x99, 0x3b, 0x19, 0xd3, 0x7b, 0xb1, 0xdb, 0x2c,\n  0x72, 0x0d, 0x79, 0xdf, 0x69, 0x14, 0xba, 0xc8, 0xb3, 0x57, 0xb7, 0x5e,\n  0x53, 0xd5, 0x5c, 0x2c, 0xbf, 0x9e, 0x2d, 0xb4, 0x81, 0xc0, 0x5f, 0x16,\n  0x5c, 0x76, 0x81, 0x1e, 0x4b, 0xce, 0x06, 0x68, 0xec, 0x15, 0xb4, 0x31,\n  0x80, 0x7b, 0x9e, 0x5e, 0x88, 0x0e, 0xfe, 0x22, 0x54, 0xad, 0xa3, 0xf2,\n  0x3c, 0x53, 0xde, 0xff, 0x5f, 0x8b, 0x1d, 0x3f, 0x47, 0xd7, 0x46, 0x22,\n  0xde, 0x28, 0x23, 0x0f, 0xea, 0x8a, 0x9d, 0x93, 0x89, 0x1d, 0xa7, 0x08,\n  0x33, 0x3a, 0x0a, 0xdd, 0x96, 0x68, 0x5e, 0xd2, 0xbf, 0x33, 0x2f, 0x91,\n  0x33, 0xd5, 0x31, 0xe4, 0x19, 0xfe, 0x68, 0x7e, 0xcb, 0x18, 0x71, 0x9d,\n  0x21, 0x37, 0x56, 0x75, 0xde, 0xc8, 0x7a, 0xaf, 0x75, 0xaf, 0xfd, 0xa8,\n  0xca, 0x77, 0x52, 0xd9, 0x9b, 0x27, 0xeb, 0xe9, 0x5c, 0xcb, 0x7b, 0x19,\n  0x72, 0xcd, 0x1c, 0xc0, 0x7a, 0x90, 0x6f, 0x5e, 0xb2, 0xcd, 0xa3, 0xff,\n  0x71, 0xd6, 0x5c, 0x2f, 0xf3, 0x27, 0xc6, 0x5e, 0xb6, 0xfe, 0x3e, 0x20,\n  0xc7, 0x60, 0x3b, 0xe6, 0xe5, 0xdf, 0x80, 0x3e, 0xcc, 0x89, 0x7d, 0xcc,\n  0x9b, 0xf5, 0x38, 0xe6, 0x62, 0x2f, 0xda, 0x6e, 0x12, 0x11, 0xcc, 0x8b,\n  0xe1, 0xda, 0x5b, 0x2a, 0xdf, 0x0a, 0xd7, 0xdb, 0x9b, 0xcf, 0xaa, 0xb3,\n  0x01, 0xb9, 0xcf, 0x6a, 0x83, 0xed, 0xba, 0x31, 0x8f, 0x97, 0xa8, 0xf3,\n  0xe4, 0x06, 0x94, 0x2d, 0xc0, 0x4d, 0x92, 0xf3, 0xa8, 0x31, 0x8f, 0x79,\n  0x5f, 0x9e, 0xa1, 0x37, 0xe5, 0xba, 0xae, 0x08, 0x23, 0x1f, 0xf4, 0xd6,\n  0x87, 0x31, 0x0f, 0x3f, 0x85, 0xed, 0x66, 0x60, 0xa7, 0xc5, 0x22, 0x8e,\n  0xf5, 0xb8, 0x5c, 0xfa, 0x47, 0x82, 0xf6, 0x06, 0x6b, 0x31, 0x80, 0x1c,\n  0x0d, 0xe4, 0xf3, 0x2b, 0xc6, 0x01, 0xd1, 0x4e, 0xc1, 0xb3, 0xf8, 0x1b,\n  0x90, 0xb1, 0x43, 0x1c, 0xf6, 0x51, 0xfb, 0x4d, 0xe6, 0x79, 0xed, 0x4b,\n  0xf4, 0x5f, 0x05, 0x9d, 0x9d, 0xf8, 0x78, 0x1a, 0x63, 0x76, 0x14, 0x3e,\n  0x1d, 0x03, 0xce, 0x18, 0x61, 0x83, 0x6e, 0x29, 0xd0, 0x4b, 0x7f, 0x9a,\n  0x3a, 0xf9, 0x3c, 0x44, 0x27, 0xa0, 0x91, 0xf9, 0xbd, 0x3e, 0x19, 0x9f,\n  0x07, 0x9a, 0x77, 0x10, 0x03, 0x77, 0x50, 0x4e, 0x57, 0xf8, 0x95, 0xd6,\n  0x19, 0xd6, 0x00, 0x75, 0xce, 0x72, 0xe5, 0x4c, 0x6b, 0xb9, 0xeb, 0xfc,\n  0x54, 0x9d, 0xa7, 0xdc, 0x4e, 0xce, 0x02, 0x3f, 0xd6, 0xbf, 0x3c, 0x2d,\n  0xd0, 0x34, 0xc5, 0x1f, 0xf8, 0x7e, 0x37, 0x73, 0x6c, 0x1b, 0xf1, 0xb9,\n  0xd8, 0x2d, 0x5a, 0x6b, 0xfe, 0xd0, 0x95, 0xf7, 0x69, 0x76, 0x63, 0xab,\n  0x0c, 0x6c, 0x7f, 0xcd, 0x73, 0x77, 0xac, 0x55, 0x9e, 0x7a, 0x77, 0x6c,\n  0x21, 0x9f, 0x81, 0xea, 0x86, 0xcd, 0xee, 0xc5, 0x7f, 0x89, 0xe8, 0x1a,\n  0x2a, 0x62, 0xf4, 0x7c, 0x6c, 0xda, 0x48, 0x34, 0xd7, 0x5b, 0xb3, 0xff,\n  0xf2, 0x86, 0x8e, 0x7c, 0x3e, 0xaf, 0x35, 0xf3, 0xae, 0x2c, 0x93, 0xd4,\n  0x78, 0xef, 0x22, 0x9f, 0x83, 0x06, 0xd2, 0x00, 0x3b, 0x90, 0x05, 0xc8,\n  0x67, 0xa3, 0xe3, 0x81, 0x14, 0x89, 0x63, 0xe5, 0xe0, 0x29, 0xd5, 0xcf,\n  0x9d, 0x5d, 0xb9, 0x67, 0x1f, 0x5c, 0x7d, 0xdf, 0xde, 0x55, 0xff, 0xff,\n  0x2f, 0xde, 0xb3, 0x22, 0xc5, 0x18, 0x41, 0xfe, 0x1e, 0x41, 0xd9, 0x55,\n  0x84, 0x1b, 0x03, 0x98, 0xf7, 0xc8, 0xe7, 0xd8, 0xa3, 0xa7, 0xb0, 0x17,\n  0x8e, 0x65, 0x1f, 0x9e, 0x62, 0x84, 0x88, 0x14, 0x1b, 0x6b, 0x83, 0x4d,\n  0x9e, 0xa1, 0xdf, 0x41, 0x2c, 0xde, 0x21, 0xfa, 0x6a, 0xed, 0xc9, 0x17,\n  0xda, 0x43, 0xfb, 0x5e, 0xe8, 0x4d, 0x65, 0x8d, 0xae, 0x50, 0x73, 0x5e,\n  0x98, 0xb6, 0x4d, 0xb4, 0xc0, 0x86, 0xf7, 0x19, 0xd1, 0xe8, 0x7a, 0xbf,\n  0x28, 0xd2, 0x9b, 0x13, 0x2f, 0xe7, 0xf1, 0xfd, 0x4f, 0xe2, 0x2e, 0x5b,\n  0x20, 0xfd, 0x9f, 0x11, 0x9d, 0xd9, 0xfb, 0x36, 0x31, 0x5a, 0x52, 0xd7,\n  0x42, 0xc4, 0xc8, 0xe7, 0x0f, 0xf4, 0x7b, 0x88, 0x8f, 0xa6, 0xa2, 0x89,\n  0xca, 0xbd, 0xe5, 0x73, 0x90, 0xb9, 0x62, 0x84, 0x56, 0x05, 0xdd, 0x2a,\n  0xf2, 0x45, 0x49, 0xf3, 0xbc, 0x98, 0x09, 0xb4, 0xb2, 0x60, 0x8e, 0xa2,\n  0x97, 0x26, 0x9e, 0x96, 0xcf, 0x4f, 0x72, 0x5d, 0x65, 0x34, 0x51, 0xf4,\n  0x9f, 0x96, 0xb4, 0x8c, 0x3e, 0xf8, 0xf4, 0x3f, 0x8c, 0x7f, 0xf9, 0x4c,\n  0xa5, 0xa4, 0x77, 0x9e, 0xb9, 0xcb, 0x05, 0x2d, 0xd8, 0x6f, 0x37, 0x56,\n  0xfc, 0xee, 0x15, 0x83, 0x99, 0x1b, 0x92, 0x58, 0xc7, 0x33, 0xa9, 0x9f,\n  0x66, 0xc1, 0x5d, 0x37, 0xe0, 0xb1, 0x15, 0x19, 0x47, 0x49, 0x59, 0xe9,\n  0x57, 0xa2, 0xdb, 0xa9, 0x6b, 0xae, 0xee, 0x27, 0xb9, 0xa0, 0x23, 0xe3,\n  0x53, 0x88, 0xb6, 0xd6, 0x73, 0x98, 0x45, 0xcc, 0x8b, 0x19, 0x94, 0x5d,\n  0xd5, 0x73, 0x9d, 0xe1, 0xec, 0xb7, 0x3e, 0xa3, 0x9f, 0x94, 0x0d, 0xdb,\n  0x68, 0x13, 0x45, 0x7b, 0xf6, 0x11, 0x1b, 0xc8, 0x5d, 0xda, 0x11, 0xe7,\n  0x45, 0xe4, 0xd6, 0x05, 0xe2, 0x17, 0x15, 0x1f, 0xed, 0x90, 0x7d, 0x86,\n  0xda, 0x9f, 0x7d, 0x29, 0xd2, 0x80, 0x18, 0xad, 0x3b, 0x73, 0x6c, 0x77,\n  0xfc, 0xe3, 0x2e, 0xe5, 0x99, 0xef, 0x25, 0x72, 0xd9, 0x33, 0xe2, 0x3d,\n  0xe0, 0xfd, 0x6a, 0xbc, 0xb6, 0xa2, 0xae, 0xb2, 0x17, 0x50, 0x27, 0x5c,\n  0xa4, 0x3b, 0xe6, 0x70, 0xdd, 0x0a, 0xd8, 0x65, 0x7e, 0x2b, 0xce, 0x98,\n  0xdf, 0x92, 0xb7, 0xa5, 0xe9, 0xfd, 0xc9, 0x3f, 0x9f, 0xc1, 0x27, 0xc4,\n  0xa8, 0xd6, 0x8c, 0x7c, 0xc5, 0xc1, 0xb5, 0x83, 0xfc, 0xe5, 0x3d, 0xfc,\n  0xf2, 0x88, 0xc8, 0xa5, 0x6c, 0x2a, 0x4c, 0x11, 0x07, 0xc4, 0x88, 0xbf,\n  0x28, 0xff, 0x42, 0xd6, 0x49, 0xc2, 0x17, 0x08, 0x27, 0xb7, 0x0a, 0x61,\n  0x3e, 0xbd, 0x4d, 0x9b, 0x62, 0x9d, 0xa3, 0xdc, 0x00, 0x6e, 0xf4, 0x8f,\n  0x3e, 0x9e, 0x75, 0xaa, 0x3e, 0xe3, 0xa1, 0x23, 0x71, 0x14, 0xc7, 0x58,\n  0xff, 0x90, 0xf9, 0x32, 0x91, 0xb8, 0xf2, 0x15, 0x7e, 0x2a, 0x0f, 0x6f,\n  0x21, 0x06, 0xb1, 0x97, 0x88, 0xc5, 0x2e, 0x29, 0xfa, 0x49, 0x72, 0xc6,\n  0x40, 0xe2, 0x7f, 0x8a, 0x70, 0x68, 0x47, 0x85, 0xce, 0x9e, 0x2d, 0x49,\n  0xc1, 0x34, 0xe1, 0xe9, 0xbe, 0xf6, 0xf0, 0x64, 0xed, 0xb1, 0xae, 0x65,\n  0x4e, 0x4f, 0xbe, 0x1e, 0x49, 0xfe, 0xde, 0x41, 0x5d, 0xcb, 0xfd, 0xf5,\n  0x38, 0xb5, 0x7f, 0xa8, 0xc7, 0xbc, 0x19, 0xaf, 0x3f, 0xc8, 0x1c, 0x3c,\n  0x88, 0x3c, 0xf6, 0x2b, 0xf8, 0xb4, 0x14, 0xf1, 0xf6, 0xe1, 0xcc, 0xa9,\n  0x37, 0xa9, 0xfc, 0xae, 0x98, 0x35, 0xd1, 0xa1, 0x47, 0xd0, 0xf7, 0x5e,\n  0xc6, 0xed, 0x38, 0xe6, 0xd3, 0x4d, 0x62, 0x38, 0x6b, 0xbf, 0x7a, 0x46,\n  0x09, 0x79, 0xf3, 0x6d, 0x0e, 0xf3, 0x57, 0xf2, 0xe2, 0x00, 0xb5, 0xcf,\n  0x68, 0x2f, 0x32, 0xc5, 0x1f, 0xe6, 0x72, 0x3d, 0x56, 0x14, 0xd7, 0x04,\n  0xed, 0x0e, 0xf6, 0x4c, 0xb1, 0xe8, 0x11, 0x4b, 0xbc, 0xc7, 0x32, 0xcf,\n  0xc7, 0x42, 0x0f, 0xa0, 0x3e, 0x91, 0x32, 0x15, 0x90, 0x65, 0xba, 0x75,\n  0x9d, 0x4a, 0x7d, 0x20, 0x65, 0xa0, 0x85, 0x2f, 0xcb, 0x20, 0x59, 0x6a,\n  0xf2, 0x79, 0x28, 0x57, 0xdf, 0x24, 0xab, 0x0c, 0x55, 0xf7, 0xc0, 0x5c,\n  0xf4, 0xc3, 0x2c, 0x1e, 0x91, 0x35, 0x78, 0x5c, 0x2b, 0xc7, 0x75, 0x34,\n  0x2d, 0xba, 0x89, 0x96, 0x0c, 0xa9, 0x16, 0xa4, 0x5b, 0x72, 0x84, 0x5e,\n  0xc3, 0x2b, 0xd2, 0xe2, 0x97, 0x22, 0x4b, 0xa0, 0x21, 0x90, 0xe2, 0x06,\n  0xea, 0x23, 0xdd, 0xba, 0x5d, 0x03, 0xd7, 0xca, 0x11, 0x67, 0xc9, 0x21,\n  0xcb, 0x68, 0xab, 0x8c, 0xab, 0x41, 0x37, 0xa5, 0x06, 0x24, 0x5a, 0xf2,\n  0x25, 0x59, 0x32, 0x56, 0x03, 0xf5, 0x6e, 0xdc, 0xb4, 0x6b, 0xe4, 0x90,\n  0x34, 0x5b, 0x5b, 0xb4, 0xdd, 0x65, 0xf4, 0x0d, 0xe4, 0x90, 0xf8, 0x9d,\n  0xae, 0x05, 0xea, 0x73, 0xae, 0x91, 0xc1, 0x4d, 0x37, 0x8a, 0xf2, 0x3a,\n  0xb0, 0xe8, 0x54, 0xcb, 0x5b, 0x03, 0xbf, 0x01, 0x65, 0xfd, 0x6b, 0x20,\n  0xe3, 0x3a, 0x39, 0xfa, 0x5b, 0xe7, 0x0c, 0xb5, 0xc1, 0x3f, 0xdf, 0xc3,\n  0xfb, 0x47, 0x60, 0x7d, 0xba, 0x4f, 0x1f, 0xc2, 0xbc, 0x36, 0x40, 0x90,\n  0x65, 0x99, 0xb7, 0x00, 0x6f, 0x0a, 0xe1, 0xe4, 0xda, 0xb9, 0x97, 0xeb,\n  0x3b, 0x01, 0xb2, 0x19, 0xb3, 0x0f, 0x30, 0x12, 0x60, 0x65, 0x75, 0x86,\n  0x50, 0x32, 0x3a, 0x4c, 0xf9, 0x1c, 0xd8, 0xc7, 0xc0, 0x22, 0x21, 0x2e,\n  0x5f, 0xa4, 0x1c, 0x61, 0xc1, 0x16, 0x60, 0xbb, 0x55, 0xbe, 0x08, 0x3c,\n  0x6a, 0xc1, 0x06, 0x0b, 0xb6, 0x02, 0x0f, 0x01, 0x6f, 0x00, 0x0f, 0xd6,\n  0x80, 0x7b, 0x80, 0x12, 0xd7, 0x68, 0x77, 0x3e, 0x61, 0xc9, 0x02, 0x3f,\n  0xf3, 0x71, 0xe0, 0x05, 0x8b, 0x57, 0x31, 0xd0, 0x0e, 0xe8, 0x6b, 0xc9,\n  0xe4, 0xe6, 0xd9, 0xd9, 0x92, 0x49, 0xbe, 0x8d, 0x9c, 0x6d, 0xe1, 0x21,\n  0x9f, 0x73, 0x35, 0xe5, 0xcd, 0x40, 0x81, 0xc5, 0xcf, 0xdd, 0x5f, 0xc2,\n  0xc3, 0xf2, 0x39, 0x36, 0x4b, 0x8f, 0xa1, 0x16, 0xfd, 0x54, 0xeb, 0x37,\n  0x3a, 0x99, 0xeb, 0x2c, 0xba, 0x9d, 0x2d, 0x7e, 0x65, 0xc0, 0x53, 0xd0,\n  0x7c, 0x84, 0xf2, 0x39, 0xe0, 0x5d, 0x8b, 0xf7, 0x13, 0xd6, 0xef, 0xe7,\n  0x2c, 0x5c, 0xea, 0xc5, 0x3c, 0xca, 0x07, 0x80, 0x42, 0x57, 0xbb, 0x3c,\n  0xe7, 0x51, 0xf0, 0xbe, 0x05, 0xf2, 0xfa, 0x76, 0x60, 0xa5, 0xc5, 0x73,\n  0xf4, 0x95, 0xfe, 0x97, 0x3f, 0xa0, 0xfe, 0x13, 0xf5, 0x72, 0xa5, 0x70,\n  0x7e, 0x66, 0xc9, 0x5a, 0xce, 0xf5, 0xc0, 0x1a, 0xb8, 0xa1, 0x2e, 0x7d,\n  0x2f, 0x7f, 0xe3, 0x2a, 0x9d, 0xd2, 0x9e, 0x87, 0x5c, 0xfd, 0x9d, 0x3b,\n  0x00, 0x76, 0xc6, 0x66, 0xb4, 0x65, 0xbf, 0xc9, 0x40, 0x63, 0xea, 0xd8,\n  0x29, 0x9a, 0x47, 0x81, 0x29, 0x96, 0xee, 0xeb, 0x81, 0x1c, 0xcb, 0xcf,\n  0x39, 0x96, 0x4f, 0x9e, 0x06, 0x9e, 0xb4, 0x40, 0xd2, 0x83, 0x96, 0x39,\n  0xdb, 0xaa, 0x7f, 0x05, 0x90, 0x5f, 0x49, 0x1b, 0x6c, 0xe9, 0xfc, 0x88,\n  0x65, 0x23, 0x7c, 0xe7, 0xfc, 0x0a, 0xd8, 0xcc, 0xf5, 0x20, 0xe0, 0x31,\n  0xcb, 0x5f, 0x6f, 0x03, 0xcb, 0x81, 0x0a, 0xe0, 0x59, 0x60, 0xb7, 0x75,\n  0x36, 0xb8, 0xa8, 0x46, 0xff, 0xf5, 0x16, 0xed, 0x9d, 0x56, 0x6c, 0x3c,\n  0x62, 0xf1, 0x96, 0xed, 0xa3, 0x2c, 0xfb, 0x3e, 0x72, 0xc5, 0x8e, 0x0a,\n  0x5f, 0xb6, 0x6f, 0x02, 0xee, 0xb0, 0x74, 0x99, 0x6c, 0xd1, 0x9d, 0xed,\n  0x92, 0x4f, 0xc5, 0xcf, 0x6d, 0x35, 0xcf, 0xd7, 0xe4, 0x57, 0x63, 0x2c,\n  0x19, 0xb1, 0xab, 0xd9, 0x1c, 0xc0, 0xee, 0xce, 0x35, 0xc0, 0x58, 0xbd,\n  0x58, 0xac, 0x66, 0x1e, 0x2f, 0xd3, 0xbb, 0x88, 0x29, 0x7a, 0x7b, 0x71,\n  0x82, 0xfd, 0xc3, 0x1a, 0xea, 0x6e, 0x57, 0xd0, 0x5d, 0x2c, 0xd4, 0x73,\n  0xc5, 0x53, 0x94, 0x13, 0x58, 0xa3, 0xe7, 0x8b, 0xc3, 0xe4, 0x36, 0xe7,\n  0xcd, 0xcb, 0x96, 0x9f, 0x89, 0x1d, 0x67, 0x17, 0x4a, 0x68, 0x3a, 0x73,\n  0x81, 0x7c, 0x00, 0x1d, 0x9c, 0x1b, 0x2d, 0x3f, 0x5c, 0xb2, 0xc6, 0xc1,\n  0x9a, 0x1a, 0xb1, 0x7e, 0x2b, 0x30, 0x17, 0x78, 0xc6, 0x8a, 0xb9, 0xde,\n  0xc0, 0x12, 0x80, 0x15, 0xc7, 0x5c, 0x6c, 0xe9, 0x5c, 0x89, 0x5f, 0x4f,\n  0xd0, 0xbf, 0x88, 0x72, 0xa5, 0xa5, 0xef, 0x5b, 0xc0, 0xdd, 0xd6, 0xf5,\n  0x56, 0xcb, 0x16, 0xd2, 0xd6, 0xdd, 0x80, 0x09, 0x96, 0xfd, 0x76, 0x5a,\n  0x3e, 0x5c, 0xef, 0xb2, 0x99, 0xf3, 0x5b, 0xeb, 0x37, 0x31, 0x6b, 0xfe,\n  0x66, 0xd9, 0x71, 0x17, 0xf0, 0x07, 0xf0, 0x9d, 0xe5, 0xc7, 0xa7, 0xac,\n  0xfa, 0xd7, 0x81, 0xf7, 0x80, 0xe7, 0x2d, 0x9f, 0x1f, 0xb0, 0x7c, 0xbb,\n  0xda, 0x6a, 0xdf, 0x2a, 0xdf, 0xda, 0x75, 0x9f, 0x09, 0xa9, 0x67, 0xda,\n  0x55, 0x89, 0x1c, 0xf2, 0x1c, 0x48, 0x3e, 0xbf, 0xb9, 0x41, 0xad, 0x87,\n  0xe5, 0x94, 0x1e, 0xf2, 0xfe, 0xa4, 0x85, 0x57, 0xaa, 0x37, 0x24, 0x57,\n  0x91, 0x7b, 0xb2, 0x23, 0xac, 0x9d, 0xc3, 0xc0, 0x59, 0x60, 0xee, 0x90,\n  0xfb, 0x2e, 0x7d, 0xba, 0xf9, 0x9e, 0x7c, 0x46, 0x93, 0xf5, 0x3e, 0x5b,\n  0x23, 0x77, 0x35, 0x52, 0x44, 0x4f, 0xf2, 0xb5, 0x9e, 0xe4, 0x8a, 0x0d,\n  0x8d, 0xcf, 0xc9, 0x8b, 0x5a, 0xb0, 0xc6, 0x9e, 0x51, 0xcf, 0x2c, 0xc8,\n  0xe7, 0xce, 0xbc, 0x15, 0x7d, 0x6b, 0x0f, 0x22, 0x79, 0x5a, 0x7e, 0xed,\n  0x75, 0x0d, 0x30, 0x86, 0x84, 0x7c, 0x5a, 0x05, 0x1b, 0xe8, 0x5c, 0x1b,\n  0xf2, 0x0f, 0xd4, 0x5c, 0x60, 0x28, 0x31, 0xa6, 0xed, 0xd3, 0x00, 0xf4,\n  0xf2, 0xe0, 0xda, 0x63, 0x0e, 0x70, 0x44, 0xbe, 0x20, 0x0f, 0x10, 0x5b,\n  0xf2, 0x8b, 0xb5, 0x8e, 0xb3, 0x42, 0x78, 0xb6, 0x00, 0xe4, 0x87, 0x6b,\n  0x67, 0x01, 0xf4, 0xf3, 0x5e, 0x2b, 0x44, 0x1d, 0xfc, 0x54, 0x07, 0x5a,\n  0x3e, 0x77, 0x09, 0xe1, 0x8b, 0x5f, 0x7d, 0xf1, 0xa9, 0x5f, 0x32, 0x50,\n  0x0a, 0xe0, 0x6f, 0x3f, 0xc6, 0x73, 0x5d, 0xe2, 0xdc, 0xff, 0x6b, 0x21,\n  0x02, 0x86, 0xca, 0x6f, 0xea, 0x01, 0xcb, 0x00, 0xe8, 0x05, 0x91, 0x9f,\n  0x05, 0xd1, 0x16, 0x0c, 0xcf, 0x60, 0x78, 0x06, 0xbf, 0x23, 0x44, 0x48,\n  0x13, 0x80, 0xba, 0x90, 0x63, 0x42, 0x84, 0xc2, 0x3b, 0x14, 0x1e, 0x61,\n  0xe1, 0x00, 0x75, 0xe1, 0xd0, 0x0d, 0x67, 0x1c, 0x45, 0x30, 0xd6, 0x23,\n  0xb0, 0x7d, 0x04, 0xba, 0x44, 0x32, 0xf7, 0x44, 0x9e, 0x17, 0x22, 0x8a,\n  0x78, 0x88, 0x62, 0x3c, 0x47, 0x41, 0x37, 0x3a, 0x13, 0x60, 0x6c, 0x44,\n  0xa3, 0x67, 0x34, 0x6d, 0x31, 0xd0, 0x8f, 0x41, 0xbe, 0xd8, 0x89, 0x42,\n  0xc4, 0x31, 0x3f, 0xc4, 0x51, 0x17, 0x7f, 0x4e, 0x88, 0x04, 0x68, 0x24,\n  0xc2, 0x23, 0x49, 0x02, 0xb6, 0x48, 0x86, 0x57, 0x0a, 0x90, 0x8a, 0x0c,\n  0xa9, 0x8c, 0x9d, 0x34, 0x62, 0x36, 0x0d, 0x39, 0xd2, 0x69, 0xaf, 0x87,\n  0x0c, 0xf5, 0xa0, 0x5d, 0x9f, 0x3e, 0x19, 0xc8, 0x9d, 0x81, 0x5e, 0x99,\n  0xf0, 0xc8, 0x64, 0x1e, 0x68, 0x40, 0xd9, 0x80, 0xd8, 0x69, 0x88, 0x7d,\n  0x1a, 0x22, 0x43, 0x23, 0x70, 0x1b, 0x21, 0x63, 0x23, 0x32, 0xdf, 0xac,\n  0x29, 0x16, 0x40, 0x27, 0x1b, 0x79, 0x1a, 0x23, 0x67, 0x0e, 0x7a, 0xe4,\n  0x30, 0xe7, 0xe7, 0x20, 0x7f, 0x2e, 0xf3, 0x4e, 0x2e, 0xba, 0x37, 0x85,\n  0x6e, 0x1e, 0xbf, 0xf3, 0xe1, 0x95, 0x8f, 0xac, 0xf9, 0xd0, 0x69, 0x86,\n  0x5d, 0x9b, 0x41, 0xa3, 0x80, 0x39, 0xac, 0x00, 0x7e, 0xcd, 0xd1, 0xb5,\n  0x05, 0xf3, 0x56, 0x0b, 0xf4, 0x68, 0xc9, 0x5c, 0xde, 0x12, 0x5b, 0xb7,\n  0xa4, 0xbe, 0x15, 0x34, 0x5b, 0x61, 0xeb, 0xd6, 0xc8, 0xdd, 0x1a, 0x5f,\n  0x15, 0x82, 0xd7, 0x06, 0x19, 0xdb, 0xe2, 0xa3, 0x76, 0xc8, 0xd2, 0x0e,\n  0xb9, 0xda, 0x61, 0xfb, 0x76, 0xd0, 0x6d, 0x07, 0x5e, 0x3b, 0x64, 0x69,\n  0x87, 0xfe, 0xed, 0xa1, 0xd3, 0x9e, 0xf9, 0xa6, 0x3d, 0x7c, 0xda, 0x63,\n  0xfb, 0xf6, 0xd8, 0xa5, 0x03, 0xf8, 0x1d, 0xc0, 0xef, 0x00, 0x7e, 0x07,\n  0xf0, 0x3b, 0x80, 0xdf, 0x11, 0x3b, 0x74, 0x44, 0x9f, 0x8e, 0xc8, 0xd9,\n  0x11, 0x1d, 0x3a, 0x12, 0x1b, 0x1d, 0xb1, 0x45, 0x27, 0x64, 0xef, 0x04,\n  0xef, 0xce, 0xc1, 0x00, 0x38, 0x9d, 0xc1, 0xe9, 0x0c, 0x4e, 0x67, 0x70,\n  0x3a, 0x83, 0xd3, 0x85, 0xba, 0xae, 0xd4, 0x75, 0x45, 0xff, 0xae, 0xf8,\n  0xbc, 0x2b, 0xf5, 0x5d, 0xab, 0x00, 0x64, 0xee, 0x4a, 0xff, 0x22, 0xf8,\n  0x14, 0x11, 0x97, 0x45, 0xe8, 0x57, 0x04, 0xaf, 0x22, 0x6c, 0x52, 0x84,\n  0x4e, 0x45, 0xc8, 0x57, 0x44, 0xbc, 0x14, 0x61, 0x8f, 0xee, 0xd0, 0xee,\n  0x0e, 0x7e, 0x77, 0xf0, 0x8b, 0x6d, 0x00, 0xfa, 0x17, 0xa3, 0x67, 0x31,\n  0x7c, 0x8b, 0xb1, 0xbb, 0x5c, 0x12, 0x4b, 0xa0, 0x59, 0x02, 0x4e, 0x09,\n  0x38, 0xa5, 0xe0, 0x94, 0x82, 0x53, 0x0a, 0x4e, 0x19, 0xd7, 0x65, 0x5c,\n  0x97, 0x61, 0xd3, 0x32, 0x6c, 0x52, 0x46, 0xdc, 0x96, 0x61, 0xd7, 0x32,\n  0xf4, 0x2d, 0xc3, 0x6f, 0x65, 0xd8, 0x56, 0xfe, 0x15, 0xae, 0x1e, 0xf8,\n  0xa3, 0x07, 0xb2, 0xf4, 0x40, 0xe7, 0x1e, 0xd8, 0xaf, 0x07, 0x72, 0xf4,\n  0x40, 0x8e, 0x1e, 0xc4, 0x44, 0x2f, 0xfa, 0xf7, 0x22, 0x9e, 0xca, 0x69,\n  0x2b, 0x47, 0xc6, 0x72, 0xda, 0xca, 0x19, 0x03, 0xe5, 0xb4, 0x95, 0x23,\n  0x5f, 0x6f, 0xe4, 0xeb, 0x4d, 0x7b, 0x1f, 0x78, 0xf4, 0x41, 0x9e, 0x3e,\n  0xf0, 0xe8, 0x43, 0x0c, 0xf5, 0x21, 0x1e, 0xfa, 0x30, 0x0e, 0xfb, 0x60,\n  0xd3, 0xbe, 0xd8, 0xb4, 0x2f, 0x31, 0xd8, 0x0f, 0x1e, 0xfd, 0xa1, 0xdb,\n  0x9f, 0xbe, 0xfd, 0xe9, 0x3b, 0x00, 0x5b, 0x0d, 0x24, 0x1e, 0x07, 0x62,\n  0x9b, 0x81, 0xd8, 0x66, 0x20, 0x36, 0x1b, 0x78, 0x5a, 0x88, 0x41, 0xc8,\n  0x3d, 0x08, 0xbe, 0x83, 0xd0, 0x61, 0x10, 0x7a, 0x0e, 0xc2, 0x4f, 0x83,\n  0xf0, 0xd3, 0x20, 0xe8, 0x0e, 0x42, 0xee, 0x41, 0xd0, 0x1d, 0x8c, 0x1e,\n  0x43, 0x18, 0x13, 0x43, 0xa0, 0x33, 0x94, 0x58, 0x18, 0x8a, 0xbf, 0x87,\n  0xd2, 0xb7, 0x02, 0x9a, 0x15, 0xd4, 0x0d, 0x43, 0xd6, 0x61, 0xf8, 0x6e,\n  0x18, 0xb6, 0x1c, 0x8e, 0x7c, 0xc3, 0x91, 0x7b, 0x38, 0x72, 0x0f, 0x87,\n  0xf7, 0x08, 0xfa, 0x8e, 0x94, 0x80, 0x8c, 0x23, 0xf1, 0xfb, 0x48, 0xec,\n  0x30, 0x0a, 0xfa, 0x95, 0xf8, 0xa2, 0x12, 0xfd, 0x2b, 0xa1, 0x5b, 0x89,\n  0x9c, 0x95, 0xf4, 0xad, 0x24, 0x4e, 0x46, 0x7b, 0x0a, 0x31, 0x06, 0xfa,\n  0x37, 0x21, 0xff, 0x4d, 0xd8, 0xe1, 0x26, 0x70, 0xc6, 0x22, 0xd3, 0x38,\n  0xe4, 0x1e, 0xc7, 0x78, 0x1c, 0x87, 0xdc, 0xe3, 0xb0, 0xfd, 0x78, 0xe4,\n  0x1e, 0x9f, 0x0e, 0x60, 0x8b, 0xf1, 0xd8, 0x7b, 0x3c, 0x38, 0xe3, 0xe1,\n  0x33, 0x1e, 0x7b, 0x4f, 0x60, 0x6e, 0xb8, 0x99, 0xfa, 0x9b, 0xb1, 0xd1,\n  0x44, 0x74, 0x9e, 0x48, 0x9f, 0x49, 0xd0, 0x99, 0x84, 0x5c, 0x93, 0xe0,\n  0x35, 0x09, 0xb9, 0x26, 0xc1, 0x6b, 0x32, 0xf6, 0x9c, 0x8c, 0xbc, 0x93,\n  0x99, 0x3f, 0x26, 0x83, 0x37, 0x19, 0x1e, 0x93, 0xb1, 0xcd, 0x2d, 0xd0,\n  0xba, 0x05, 0x19, 0x6f, 0x81, 0xd6, 0x2d, 0xd8, 0xe0, 0x16, 0x64, 0x26,\n  0xac, 0xc4, 0x14, 0x7c, 0x37, 0x05, 0xda, 0x53, 0x90, 0x6b, 0x0a, 0x3a,\n  0x4f, 0x81, 0xde, 0x14, 0xf4, 0x9c, 0x02, 0xbd, 0x5b, 0x89, 0xbd, 0xa9,\n  0xd8, 0xef, 0x36, 0xda, 0xa7, 0x11, 0x4f, 0xd3, 0xd1, 0x63, 0x3a, 0xb6,\n  0x9a, 0x8e, 0x2e, 0xd3, 0x69, 0x9b, 0x41, 0xdc, 0xcd, 0x44, 0x86, 0x99,\n  0xb4, 0xcd, 0x82, 0xdf, 0x2c, 0x64, 0x9d, 0xc5, 0x98, 0x99, 0x4d, 0x9f,\n  0xd9, 0xd8, 0xe5, 0x76, 0xe4, 0xbd, 0x9d, 0xd8, 0xba, 0x83, 0xfe, 0x77,\n  0x20, 0xc3, 0x1c, 0xda, 0xe7, 0x60, 0xb3, 0x39, 0xc4, 0xda, 0x1c, 0xf0,\n  0xe6, 0xe2, 0xa3, 0xb9, 0xe0, 0xcc, 0x45, 0xa7, 0xb9, 0xc8, 0x39, 0x17,\n  0x5b, 0xcc, 0x45, 0xaf, 0xb9, 0xf0, 0x9e, 0x8b, 0x7c, 0x77, 0xc2, 0xe7,\n  0x4e, 0x70, 0xef, 0x84, 0xfe, 0x9d, 0xc4, 0xc1, 0x3c, 0xec, 0x33, 0x0f,\n  0xf9, 0xe6, 0xa1, 0xc3, 0x3c, 0xe8, 0xde, 0x85, 0x7f, 0xef, 0x02, 0xe7,\n  0x2e, 0xec, 0x7e, 0x17, 0xba, 0xcb, 0xef, 0xf2, 0xce, 0x87, 0xd6, 0x7c,\n  0x14, 0x5b, 0x80, 0xac, 0x0b, 0x88, 0x9b, 0x05, 0xd8, 0x73, 0xa1, 0x0f,\n  0x00, 0xaf, 0x85, 0xf4, 0x59, 0x84, 0xbc, 0x8b, 0xa0, 0xb1, 0x08, 0x1d,\n  0x17, 0xc1, 0x67, 0x11, 0xfd, 0x16, 0x83, 0xbb, 0x18, 0xbd, 0x16, 0x33,\n  0xde, 0x96, 0x10, 0x67, 0x4b, 0xf9, 0xbd, 0x94, 0x38, 0x58, 0x06, 0x6d,\n  0xf9, 0xa7, 0xc8, 0xee, 0x46, 0xee, 0x7b, 0xf0, 0xc7, 0x3d, 0xe0, 0xde,\n  0x0b, 0xaf, 0x7b, 0xe1, 0xb1, 0x9c, 0xf6, 0xe5, 0xf8, 0xf9, 0x3e, 0xda,\n  0xef, 0x43, 0xe6, 0xfb, 0xa0, 0xb5, 0x02, 0x7f, 0xaf, 0xa4, 0x4d, 0xfe,\n  0x01, 0xaa, 0x55, 0xb4, 0xaf, 0x22, 0x8e, 0xee, 0xc7, 0x46, 0x0f, 0xc0,\n  0xfb, 0x01, 0xf4, 0x78, 0x10, 0x7f, 0xac, 0xc6, 0x3f, 0xab, 0xf1, 0xcf,\n  0x6a, 0x68, 0xaf, 0xc6, 0x86, 0xab, 0x91, 0x75, 0x35, 0xba, 0xaf, 0x46,\n  0xf7, 0x87, 0xa0, 0xf7, 0x10, 0xbe, 0x7c, 0x98, 0xfa, 0x87, 0xe9, 0xf7,\n  0x30, 0x63, 0xe1, 0x61, 0x62, 0xf6, 0x61, 0xda, 0x1e, 0x05, 0xe7, 0x31,\n  0xf4, 0x79, 0x0c, 0x1f, 0x3d, 0x46, 0x5c, 0x3e, 0x8e, 0x1e, 0x8f, 0xc3,\n  0xf7, 0x71, 0xf8, 0xae, 0xc1, 0xf6, 0x6b, 0xf0, 0xdf, 0x1a, 0x7c, 0xbc,\n  0x06, 0x3b, 0xad, 0xc5, 0x4e, 0x6b, 0x69, 0x7f, 0x02, 0x5d, 0x9e, 0x40,\n  0x98, 0x27, 0xb1, 0xf1, 0x93, 0xd0, 0x5e, 0x47, 0xfc, 0xad, 0xc3, 0x37,\n  0xeb, 0xa0, 0xbf, 0x0e, 0xfa, 0xeb, 0xa0, 0xbf, 0x0e, 0xba, 0xeb, 0xb0,\n  0xc7, 0x3a, 0x6c, 0xba, 0x1e, 0xfd, 0xd7, 0xe3, 0xab, 0xf5, 0xe8, 0xba,\n  0x1e, 0x9e, 0x4f, 0x21, 0xf7, 0x53, 0xe0, 0x3d, 0x85, 0xec, 0x4f, 0xd3,\n  0xef, 0x69, 0xca, 0xff, 0x40, 0xeb, 0x3f, 0xf8, 0x66, 0x03, 0x63, 0x65,\n  0x23, 0xba, 0x6e, 0x44, 0xfe, 0x67, 0xd0, 0xe7, 0x19, 0x62, 0xea, 0x59,\n  0xf8, 0x3e, 0x8b, 0xde, 0xcf, 0xc2, 0xeb, 0x39, 0x6c, 0xf8, 0x1c, 0xf2,\n  0x3d, 0x4f, 0xdb, 0xf3, 0xf4, 0x7b, 0x81, 0x38, 0x7b, 0x81, 0xdf, 0x9b,\n  0xe0, 0xb1, 0x09, 0x9e, 0x9b, 0xe0, 0xb9, 0x09, 0xbf, 0x6e, 0x42, 0xde,\n  0xcd, 0xf4, 0xdb, 0x8c, 0x3d, 0x36, 0x63, 0xdb, 0xcd, 0xd0, 0xde, 0x4c,\n  0x6c, 0x6c, 0x81, 0xdf, 0x16, 0x62, 0x65, 0x2b, 0x73, 0xe4, 0x56, 0x74,\n  0xd9, 0x4a, 0xdd, 0x36, 0xe4, 0xdd, 0x06, 0xdf, 0xed, 0xc4, 0xf1, 0x0e,\n  0xe4, 0xdc, 0x81, 0x3f, 0x77, 0x40, 0xfb, 0x45, 0x6c, 0xf0, 0x22, 0xbe,\n  0xd9, 0xc9, 0x1a, 0xb0, 0x13, 0xdb, 0xec, 0xa4, 0xdf, 0x4e, 0xe2, 0x6f,\n  0x27, 0xb8, 0xbb, 0xd1, 0x61, 0x37, 0x75, 0xbb, 0xa9, 0xdb, 0x4d, 0xdd,\n  0x1e, 0x70, 0xf6, 0xc0, 0x63, 0x2f, 0xb1, 0xb3, 0x17, 0xdb, 0xee, 0x45,\n  0xee, 0xbd, 0xcc, 0x07, 0xf2, 0xcf, 0xa9, 0x54, 0x61, 0xdf, 0x2a, 0x6c,\n  0x54, 0x85, 0x1c, 0x55, 0xf0, 0xac, 0x42, 0x8f, 0x2a, 0x64, 0x7e, 0x89,\n  0xb6, 0x97, 0x90, 0xe3, 0x25, 0x6c, 0xfc, 0x12, 0x71, 0xfc, 0x12, 0xfd,\n  0xf7, 0xa1, 0xdf, 0x3e, 0x64, 0xdc, 0x07, 0xdd, 0xfd, 0xc4, 0xd8, 0x7e,\n  0xe4, 0xd9, 0x8f, 0xef, 0x0e, 0x60, 0x9f, 0x03, 0xf8, 0xe8, 0x00, 0x78,\n  0x07, 0xd1, 0xf9, 0x20, 0xb4, 0x0e, 0xca, 0x6b, 0x78, 0x1f, 0x24, 0x1e,\n  0x5e, 0xc1, 0xff, 0xaf, 0xd0, 0xef, 0x15, 0x7c, 0xf5, 0x0a, 0xf2, 0x1d,\n  0x42, 0xb6, 0xc3, 0xd0, 0x3e, 0x8c, 0x7e, 0x47, 0xb0, 0xc3, 0x11, 0xe4,\n  0x79, 0x9d, 0xba, 0xa3, 0xe0, 0x1c, 0xc5, 0x4f, 0x6f, 0x80, 0x7f, 0x0c,\n  0x1f, 0xbc, 0x85, 0x7f, 0xde, 0x81, 0xce, 0x71, 0x68, 0xbc, 0x8b, 0x7f,\n  0xde, 0x45, 0xef, 0xf7, 0xb0, 0xfd, 0x7b, 0xe0, 0xbf, 0xbf, 0xfc, 0xff,\n  0x1b, 0x7c, 0x82, 0xcc, 0x27, 0xd0, 0xf9, 0x04, 0x71, 0x72, 0x02, 0xb9,\n  0x3f, 0xc5, 0x07, 0x27, 0xe1, 0xfb, 0x19, 0xf2, 0x7c, 0x86, 0x7d, 0x3e,\n  0x93, 0xd7, 0xf8, 0xf8, 0x33, 0xec, 0xfe, 0x39, 0x36, 0xf8, 0x1c, 0x5e,\n  0xa7, 0xf8, 0x7d, 0x1a, 0x99, 0x4e, 0x13, 0xeb, 0xa7, 0xb1, 0xf9, 0x17,\n  0x5c, 0x7f, 0x81, 0x8f, 0xbf, 0xa0, 0xef, 0x17, 0xd8, 0xe5, 0x4b, 0x74,\n  0xff, 0x8a, 0xfe, 0x5f, 0x61, 0xdb, 0xaf, 0xb1, 0xcd, 0x37, 0xe0, 0x7d,\n  0x0b, 0x9d, 0x6f, 0x19, 0x6f, 0xdf, 0x21, 0xf7, 0x77, 0xe0, 0x9c, 0x21,\n  0x26, 0xff, 0x8b, 0x9d, 0xbf, 0xc7, 0x06, 0x3f, 0x60, 0xd3, 0xb3, 0x18,\n  0xff, 0x27, 0xfa, 0xfc, 0xc4, 0x18, 0xfc, 0x09, 0x59, 0x7e, 0xc2, 0x56,\n  0x3f, 0x33, 0x56, 0xce, 0x21, 0xdb, 0x39, 0x7c, 0x7b, 0x0e, 0x9d, 0x7f,\n  0x81, 0xcf, 0xaf, 0xd8, 0xe7, 0x57, 0xfc, 0xf9, 0x2b, 0x73, 0xe5, 0x6f,\n  0xd8, 0xe8, 0x77, 0xda, 0xff, 0x20, 0x96, 0xfe, 0x24, 0x56, 0x2f, 0xd0,\n  0xe7, 0x2f, 0x68, 0xfd, 0x45, 0xdb, 0x45, 0x74, 0xb9, 0x84, 0x9c, 0x97,\n  0xb7, 0x5b, 0xf7, 0xc2, 0x65, 0x7e, 0xff, 0x8e, 0xd0, 0xc4, 0x50, 0xe0,\n  0x82, 0xd0, 0xb4, 0x4b, 0x24, 0x9b, 0x03, 0xd5, 0x1b, 0x26, 0x9a, 0xb1,\n  0x5a, 0x68, 0xb6, 0x42, 0xe0, 0x7d, 0xa1, 0xd9, 0x69, 0xf7, 0x58, 0x26,\n  0x34, 0xc7, 0x66, 0xa1, 0x79, 0xc6, 0x03, 0x5c, 0x7b, 0x91, 0xee, 0x79,\n  0x4d, 0x03, 0xce, 0x09, 0xcd, 0x7b, 0x22, 0x00, 0x5e, 0x9d, 0x7c, 0x60,\n  0xbd, 0xd0, 0x7c, 0x7c, 0x80, 0x71, 0xc0, 0x11, 0xa1, 0xf9, 0x3e, 0x27,\n  0x34, 0x3f, 0xfa, 0xd7, 0x1d, 0x2d, 0x34, 0xff, 0xed, 0x42, 0x0b, 0x58,\n  0x2b, 0xb4, 0xc0, 0x45, 0xc0, 0x69, 0xa1, 0x05, 0x81, 0x1f, 0xd4, 0x19,\n  0xa0, 0x4f, 0xb0, 0x3f, 0x00, 0xdd, 0x60, 0x64, 0x08, 0x01, 0x37, 0x04,\n  0x7a, 0xe4, 0x69, 0x5a, 0x28, 0x34, 0xc2, 0xc0, 0x09, 0xfb, 0x58, 0x68,\n  0xe1, 0xd4, 0x87, 0x53, 0x1f, 0xfe, 0xb5, 0xd0, 0x22, 0xce, 0x0a, 0x2d,\n  0x12, 0x99, 0xa3, 0xc3, 0x85, 0x16, 0x93, 0x0e, 0x40, 0x2b, 0xe6, 0xbc,\n  0xd0, 0x62, 0x91, 0x31, 0x0e, 0x3a, 0xf1, 0xd4, 0x91, 0x8b, 0x69, 0x09,\n  0xe0, 0x27, 0xf2, 0x3b, 0x09, 0xbc, 0xa4, 0x59, 0x00, 0x7d, 0x93, 0x91,\n  0x27, 0x19, 0xfe, 0x29, 0xc8, 0x98, 0x02, 0x0e, 0xdb, 0x3b, 0x2d, 0xf5,\n  0x80, 0xd0, 0xd2, 0xe0, 0x9d, 0x8e, 0x7e, 0xe9, 0xd0, 0x4a, 0x87, 0x67,\n  0x7a, 0x5f, 0x00, 0x1e, 0xf5, 0xc0, 0xad, 0x0f, 0x8d, 0xfa, 0x8f, 0x02,\n  0xe0, 0xd5, 0x47, 0x96, 0xfa, 0xe0, 0x66, 0x04, 0x03, 0xe0, 0x66, 0x94,\n  0x02, 0xd0, 0xcd, 0x9c, 0x03, 0xa0, 0x4b, 0x66, 0x15, 0x40, 0x9f, 0x4c,\n  0xfa, 0x36, 0x88, 0x06, 0x9a, 0x00, 0xed, 0x81, 0x5e, 0x00, 0x36, 0x6b,\n  0xb0, 0x1c, 0xc0, 0x16, 0x0d, 0x8e, 0x01, 0xf0, 0x6f, 0xe8, 0x09, 0x64,\n  0x02, 0xe0, 0x34, 0x44, 0xc7, 0x86, 0xd0, 0x69, 0x08, 0x9d, 0x86, 0xd0,\n  0x69, 0x84, 0x5d, 0x1a, 0x21, 0x6f, 0xa3, 0xbb, 0x00, 0xf8, 0x67, 0x61,\n  0x93, 0x2c, 0x78, 0x65, 0x63, 0xc3, 0xc6, 0xc9, 0x00, 0x7e, 0xca, 0xb1,\n  0x01, 0xe8, 0x96, 0x83, 0x8c, 0x4d, 0x90, 0x27, 0x17, 0xfb, 0x37, 0x85,\n  0x6f, 0xd3, 0x93, 0x42, 0xcb, 0x83, 0x17, 0xb9, 0x9f, 0xd6, 0x4c, 0x02,\n  0xfc, 0x0a, 0xc0, 0x6b, 0x0e, 0xaf, 0xe6, 0x87, 0x84, 0xd6, 0x02, 0xb9,\n  0x5b, 0x60, 0xdf, 0x96, 0xf4, 0x69, 0x89, 0xac, 0xad, 0x90, 0xa3, 0x35,\n  0x6d, 0x85, 0xc8, 0x58, 0x48, 0xbf, 0xc2, 0x0d, 0x42, 0x6b, 0xc3, 0x75,\n  0x5b, 0x70, 0xda, 0x21, 0x4b, 0x07, 0x68, 0x74, 0x44, 0xc6, 0x4e, 0xd8,\n  0xb4, 0x0b, 0x65, 0x37, 0x7e, 0x17, 0x21, 0x6f, 0x31, 0xb6, 0x2d, 0xe6,\n  0x37, 0x79, 0x93, 0x56, 0x32, 0x50, 0xfe, 0xa5, 0x00, 0xa1, 0xf5, 0x80,\n  0x7f, 0x4f, 0xe4, 0x2c, 0xc7, 0x8e, 0x7d, 0x90, 0xb5, 0x2f, 0xb4, 0xfa,\n  0xa3, 0x53, 0x7f, 0xe2, 0xad, 0x3f, 0x3a, 0x0f, 0x80, 0xd7, 0x00, 0x6c,\n  0x3d, 0x80, 0xdf, 0x03, 0x91, 0x6b, 0x20, 0x75, 0x83, 0xa8, 0x23, 0x07,\n  0xd1, 0xe4, 0x57, 0x13, 0x86, 0x9c, 0x11, 0x5a, 0x05, 0x74, 0x87, 0x11,\n  0x5b, 0x23, 0xd0, 0x67, 0x24, 0xd7, 0xa3, 0xa0, 0x3f, 0x0a, 0xb9, 0x46,\n  0xe1, 0xe3, 0x4a, 0x7c, 0x53, 0x09, 0x6e, 0x25, 0x3e, 0x1f, 0x4d, 0xfb,\n  0x68, 0x78, 0x8e, 0x6e, 0x21, 0xb4, 0x31, 0x5c, 0x8f, 0xc1, 0x3f, 0x37,\n  0x41, 0x73, 0x2c, 0x32, 0x8f, 0xc3, 0x5f, 0xe3, 0xd1, 0xf5, 0xe6, 0x2c,\n  0xa1, 0x4d, 0x5c, 0x25, 0xb4, 0x49, 0xd4, 0x4d, 0xa6, 0xdf, 0x2d, 0xf0,\n  0xba, 0x85, 0x18, 0xb9, 0xa5, 0x08, 0x80, 0x2e, 0x39, 0x80, 0x76, 0x0b,\n  0xb1, 0x39, 0x85, 0x7e, 0xb7, 0x82, 0x7f, 0x2b, 0xfc, 0xa7, 0x22, 0xc7,\n  0x54, 0xf8, 0x4e, 0xa5, 0xef, 0x54, 0xf4, 0x98, 0x8a, 0x1f, 0x6e, 0xe3,\n  0xf7, 0x34, 0x78, 0x4c, 0xa3, 0x6e, 0x1a, 0x75, 0xd3, 0x88, 0xa1, 0x69,\n  0xf8, 0x66, 0x3a, 0xbe, 0x99, 0x01, 0xed, 0x19, 0xf8, 0x7d, 0x06, 0xb6,\n  0x9c, 0x89, 0xdf, 0x66, 0x42, 0x7f, 0x26, 0x36, 0x9a, 0x09, 0x7d, 0x86,\n  0x9b, 0x36, 0x0b, 0xb9, 0x66, 0x11, 0x37, 0xb3, 0x89, 0x9b, 0xd9, 0xd8,\n  0x79, 0x36, 0x36, 0x9b, 0x8d, 0xbd, 0x6e, 0xc7, 0x6f, 0x77, 0x48, 0x80,\n  0xc6, 0x1c, 0xc6, 0xcb, 0x5c, 0x68, 0xcf, 0xc5, 0x1e, 0x77, 0x12, 0x07,\n  0xf3, 0xc0, 0x61, 0x3d, 0xd7, 0x58, 0xcf, 0xe5, 0x27, 0x6a, 0xb5, 0xf9,\n  0xf0, 0x5a, 0x80, 0xcf, 0x17, 0x30, 0x46, 0x17, 0x42, 0x67, 0x21, 0x7a,\n  0x2f, 0x64, 0x2c, 0xb0, 0x7e, 0x6b, 0x8b, 0xb1, 0xc9, 0x62, 0xe8, 0x2f,\n  0x85, 0xef, 0x52, 0xec, 0xb4, 0x0c, 0x1d, 0xef, 0x46, 0x8e, 0xbb, 0xb1,\n  0xf1, 0x3d, 0xf4, 0xbf, 0x17, 0x9c, 0xe5, 0xc8, 0xb3, 0x1c, 0xfd, 0x97,\n  0xd3, 0x67, 0x39, 0xb8, 0xf7, 0xd1, 0xb6, 0x82, 0xfa, 0x95, 0xd4, 0xaf,\n  0x22, 0x1e, 0x56, 0x21, 0xff, 0xfd, 0xd8, 0xe9, 0x01, 0xf0, 0x1f, 0x20,\n  0x5e, 0x1f, 0x44, 0x96, 0x07, 0xf1, 0xe3, 0x6a, 0xfc, 0xf0, 0x10, 0xbf,\n  0x1f, 0xc2, 0x3e, 0x0f, 0xe3, 0xf3, 0x47, 0xf0, 0xdd, 0x23, 0x5c, 0x3f,\n  0x4a, 0x6c, 0x3c, 0x46, 0xdf, 0xc7, 0xd0, 0xfd, 0x31, 0x7e, 0x3f, 0x0e,\n  0xde, 0x1a, 0x78, 0xae, 0x41, 0xd7, 0xb5, 0xe8, 0xf2, 0x04, 0x36, 0x7a,\n  0x02, 0x9a, 0x4f, 0x62, 0xdf, 0x75, 0xe0, 0xad, 0x93, 0x25, 0x76, 0x5e,\n  0x8f, 0xaf, 0xd6, 0x63, 0xfb, 0xf5, 0xf0, 0x5e, 0x8f, 0x3e, 0xeb, 0xd1,\n  0x67, 0x3d, 0xb2, 0xac, 0xc7, 0xee, 0x6c, 0x8f, 0xb5, 0xa7, 0xb0, 0xf3,\n  0x53, 0xf0, 0x7e, 0x8a, 0xfe, 0xac, 0xb5, 0xda, 0x53, 0xe8, 0xfd, 0x14,\n  0x31, 0xf4, 0x14, 0xfe, 0x7c, 0x0a, 0x79, 0x9e, 0x42, 0xf6, 0xa7, 0x91,\n  0xe1, 0x69, 0x62, 0xf7, 0x3f, 0xd8, 0x61, 0x03, 0x38, 0xac, 0xbb, 0xda,\n  0x33, 0xf0, 0x7d, 0x16, 0x1a, 0xcf, 0x43, 0xf7, 0x05, 0x64, 0x61, 0x2d,\n  0xd5, 0x36, 0x53, 0xb7, 0x15, 0x9d, 0xb6, 0xe1, 0xbf, 0xed, 0xc4, 0xce,\n  0x76, 0xe2, 0x77, 0x3b, 0xfa, 0xef, 0x80, 0xe7, 0x4e, 0xf8, 0xec, 0x44,\n  0x96, 0x9d, 0xe8, 0xb6, 0x93, 0x3e, 0x3b, 0xf1, 0xc1, 0x4e, 0xc6, 0xe6,\n  0x4e, 0x74, 0xd9, 0x89, 0x1f, 0x77, 0xd1, 0xbe, 0x8b, 0xf6, 0x5d, 0xb4,\n  0xef, 0x82, 0xc7, 0x2e, 0xe4, 0xd8, 0x05, 0xce, 0x2e, 0xe4, 0xd8, 0x05,\n  0xdd, 0xdd, 0xf8, 0x6d, 0x0f, 0x7a, 0xed, 0x81, 0xf7, 0x1e, 0xc6, 0xd6,\n  0x1e, 0x74, 0xdb, 0x03, 0xdd, 0x3d, 0xd8, 0x78, 0x0f, 0xb1, 0xb9, 0x97,\n  0xfe, 0x7b, 0xd1, 0x63, 0x2f, 0xfd, 0xf7, 0xd2, 0x7f, 0x2f, 0x7e, 0xd9,\n  0x8b, 0x1e, 0x7b, 0xa1, 0xbf, 0x17, 0xd9, 0xaa, 0xf0, 0x51, 0x15, 0x7a,\n  0x54, 0x61, 0xef, 0x2a, 0x62, 0xa1, 0x0a, 0x9f, 0x57, 0x61, 0x8f, 0x2a,\n  0xec, 0x59, 0x85, 0x9c, 0x55, 0xc8, 0xc0, 0x1a, 0xab, 0xbd, 0x44, 0x0c,\n  0xbc, 0x84, 0xbd, 0x58, 0x63, 0xb5, 0x7d, 0xc8, 0xb0, 0x0f, 0x1a, 0xfb,\n  0xa0, 0xb1, 0x1f, 0x9a, 0x2f, 0x23, 0xf7, 0x41, 0xda, 0x59, 0x43, 0xb5,\n  0x57, 0xa8, 0x7f, 0x05, 0xfe, 0xaf, 0xc0, 0xff, 0x15, 0xf8, 0x1f, 0x22,\n  0x56, 0x0f, 0x11, 0x23, 0xaf, 0x22, 0xc7, 0x61, 0xf4, 0x78, 0x0d, 0xbc,\n  0x23, 0xc4, 0xc7, 0x11, 0x68, 0x1d, 0x41, 0xe6, 0xd7, 0x91, 0xed, 0x75,\n  0x78, 0x1c, 0x65, 0xbc, 0x1e, 0xa5, 0xed, 0x28, 0xd7, 0xc7, 0x90, 0xe7,\n  0x18, 0x3e, 0x7b, 0x93, 0xeb, 0xb7, 0xe0, 0xf7, 0x36, 0x3e, 0x7e, 0x07,\n  0x38, 0x8e, 0x4c, 0xef, 0x42, 0xe7, 0x5d, 0xc6, 0xc7, 0x7b, 0xe8, 0xff,\n  0x3e, 0xf6, 0x7c, 0x1f, 0x1b, 0x7c, 0x00, 0xad, 0x0f, 0xe1, 0xf3, 0x21,\n  0xba, 0x7f, 0x88, 0x7d, 0x3f, 0x3a, 0x60, 0xdd, 0x5c, 0xc7, 0xd7, 0x27,\n  0xe8, 0xf7, 0x29, 0xb2, 0x9c, 0x84, 0xce, 0x67, 0xc8, 0xfd, 0x39, 0x31,\n  0xf6, 0x39, 0x72, 0x9f, 0x42, 0xcf, 0x53, 0xe0, 0x9f, 0x06, 0xe7, 0x34,\n  0x32, 0x7f, 0x81, 0xae, 0x5f, 0x22, 0xcf, 0x57, 0xf8, 0xfb, 0x6b, 0xe8,\n  0x7e, 0x83, 0x9d, 0xbe, 0xa1, 0x9e, 0x35, 0x52, 0xfb, 0x16, 0xbb, 0x7c,\n  0x87, 0x6e, 0xdf, 0x61, 0x97, 0x33, 0xc4, 0xc8, 0x19, 0x64, 0xfb, 0x2f,\n  0xb4, 0xbe, 0x67, 0x0c, 0xfd, 0x80, 0xdc, 0x3f, 0xa0, 0xd7, 0x0f, 0xc4,\n  0xc3, 0x59, 0xe0, 0x27, 0xe6, 0xc2, 0x9f, 0xc0, 0xfd, 0x09, 0xbb, 0xfc,\n  0x8c, 0x6e, 0x3f, 0xa3, 0xc3, 0x39, 0xfc, 0xf2, 0x0b, 0x31, 0xfb, 0x0b,\n  0xbc, 0x7e, 0x45, 0xf7, 0xdf, 0xb0, 0xc7, 0x6f, 0xd8, 0xe6, 0x3c, 0x76,\n  0x62, 0xad, 0xd4, 0x7e, 0xa7, 0xee, 0x0f, 0xda, 0xfe, 0xc4, 0x8f, 0x7f,\n  0x22, 0xdf, 0x9f, 0xc4, 0xcd, 0x05, 0xe2, 0xea, 0x02, 0x32, 0xff, 0x45,\n  0xdc, 0x5c, 0xc4, 0xbe, 0x17, 0xe1, 0xf9, 0x37, 0xb2, 0xfd, 0x8d, 0x3e,\n  0x7f, 0x13, 0x3b, 0x97, 0xd0, 0xe1, 0x32, 0x3a, 0x38, 0x91, 0xd9, 0x09,\n  0x0f, 0xf3, 0x6b, 0x21, 0xff, 0xec, 0xac, 0x4e, 0x92, 0xab, 0x6b, 0x7d,\n  0x81, 0xb3, 0x42, 0x67, 0x1d, 0xd5, 0xf5, 0x8f, 0x81, 0x0b, 0x42, 0x37,\n  0xc2, 0x81, 0x11, 0xae, 0x17, 0x5b, 0x6d, 0x1b, 0x00, 0xda, 0xec, 0x9b,\n  0x85, 0xee, 0xd1, 0x1e, 0x18, 0x08, 0x9c, 0x13, 0xba, 0xe3, 0x2e, 0xe0,\n  0x51, 0xe0, 0x39, 0xa1, 0x7b, 0x42, 0xc3, 0x0b, 0x7c, 0xaf, 0x29, 0x42,\n  0xf7, 0x3e, 0x04, 0x40, 0xbf, 0x4e, 0xbc, 0xd0, 0x7d, 0xb2, 0x00, 0x68,\n  0xfb, 0x42, 0xa3, 0xee, 0x50, 0xa1, 0x07, 0xc0, 0x2f, 0x88, 0xf6, 0x90,\n  0x74, 0xa1, 0x87, 0x8e, 0x13, 0x7a, 0xd8, 0x31, 0xa1, 0x47, 0x8c, 0x16,\n  0x7a, 0x24, 0x74, 0xa2, 0xc0, 0x8d, 0x3a, 0x29, 0xf4, 0xe8, 0x42, 0xa1,\n  0xc7, 0x24, 0x0b, 0x3d, 0x16, 0x5e, 0xb1, 0xb4, 0xc5, 0x2e, 0x03, 0xe0,\n  0x1d, 0xfb, 0x3e, 0x80, 0x6c, 0x71, 0xd1, 0x00, 0x38, 0x71, 0xf0, 0x8b,\n  0x5b, 0x04, 0xac, 0x06, 0xa0, 0x1f, 0x87, 0x8c, 0x71, 0x47, 0x84, 0x1e,\n  0x0f, 0xdf, 0xf8, 0x69, 0xc0, 0x79, 0xa1, 0x27, 0xf8, 0x00, 0x99, 0x40,\n  0x11, 0x00, 0x5e, 0x02, 0x38, 0x09, 0x97, 0x84, 0x9e, 0x48, 0x7d, 0x22,\n  0x74, 0x12, 0xd1, 0x25, 0x71, 0x16, 0xb0, 0x1c, 0x58, 0x0f, 0xd0, 0x27,\n  0x89, 0xfe, 0x49, 0xd0, 0x4f, 0x42, 0xde, 0xa4, 0x39, 0xc0, 0x5a, 0xe0,\n  0x00, 0x40, 0xbf, 0x64, 0x7f, 0xa0, 0x09, 0x80, 0xbe, 0xc9, 0xf4, 0x4b,\n  0xa6, 0x2d, 0x19, 0x7d, 0x52, 0xa8, 0x4f, 0x41, 0x9e, 0x14, 0xe8, 0xa7,\n  0x42, 0x3b, 0xb5, 0x14, 0x40, 0xd7, 0xd4, 0xd3, 0x42, 0x97, 0xdf, 0x06,\n  0x4b, 0x83, 0x66, 0x1a, 0xfa, 0xa5, 0x21, 0x57, 0x1a, 0xb4, 0xd2, 0xce,\n  0x08, 0x3d, 0x9d, 0x3e, 0xe9, 0xd4, 0xa5, 0xf7, 0x02, 0xb0, 0x5b, 0x3a,\n  0xf8, 0xe9, 0xe8, 0x99, 0x8e, 0x0c, 0xf5, 0xe0, 0x5f, 0x0f, 0xdd, 0xea,\n  0xa1, 0x4f, 0x7d, 0xf8, 0xd5, 0x47, 0xf6, 0xfa, 0xd4, 0x67, 0x60, 0xb3,\n  0x0c, 0x70, 0x32, 0x3d, 0x01, 0x7c, 0x94, 0x89, 0x1d, 0x33, 0xd1, 0x2d,\n  0x73, 0x22, 0x80, 0xac, 0x0d, 0x28, 0x1b, 0x80, 0xdb, 0xa0, 0x0a, 0xc0,\n  0xb6, 0x8d, 0xa0, 0xd3, 0x88, 0x7e, 0x59, 0xb4, 0x65, 0x63, 0xd3, 0x6c,\n  0x6c, 0xd8, 0x18, 0xba, 0x8d, 0x91, 0x2b, 0x07, 0xbf, 0x35, 0x81, 0x6f,\n  0x2e, 0xb2, 0xe5, 0x62, 0xff, 0xa6, 0xe0, 0xe7, 0x61, 0xc7, 0x3c, 0x74,\n  0xc8, 0x83, 0x6f, 0x1e, 0xb1, 0x90, 0x87, 0x9c, 0x79, 0xd8, 0x3c, 0x1f,\n  0x7e, 0xf9, 0xf0, 0xcb, 0x87, 0x5f, 0x3e, 0xfa, 0x36, 0xc3, 0x36, 0x05,\n  0xd8, 0xaf, 0x00, 0xdb, 0x16, 0xe0, 0xa7, 0x02, 0xec, 0x58, 0x80, 0x6c,\n  0xac, 0xd7, 0x7a, 0x01, 0xfe, 0x2a, 0x80, 0x5e, 0x73, 0xfa, 0x34, 0x27,\n  0x46, 0x5a, 0x20, 0x4b, 0x4b, 0xfc, 0xd8, 0x12, 0x39, 0x5a, 0x61, 0x97,\n  0x56, 0xd0, 0x65, 0xdd, 0xd6, 0x5b, 0x13, 0x17, 0x85, 0xfc, 0x2e, 0x44,\n  0x9f, 0x36, 0xd8, 0xac, 0x0d, 0xfd, 0xdb, 0xe0, 0xff, 0xb6, 0x2d, 0x80,\n  0xed, 0x42, 0x6f, 0x47, 0xd9, 0x0e, 0x9b, 0xb6, 0x83, 0x5e, 0x3b, 0xf9,\n  0x1b, 0xd9, 0xdb, 0x23, 0x7b, 0x7b, 0x64, 0xef, 0x90, 0x0f, 0xd0, 0xaf,\n  0x23, 0xb6, 0xe9, 0x08, 0xfd, 0x8e, 0xc8, 0xd8, 0x09, 0x19, 0x3a, 0xc1,\n  0xaf, 0x13, 0x7a, 0xb1, 0xe6, 0xeb, 0x9d, 0x90, 0xbd, 0x33, 0x7d, 0x3b,\n  0x23, 0x4b, 0x17, 0xec, 0xdc, 0x05, 0xda, 0x5d, 0x69, 0xef, 0x8a, 0xfc,\n  0xdd, 0xd0, 0xa5, 0x1b, 0x3e, 0xec, 0x86, 0x5c, 0xdd, 0xa8, 0x2f, 0xc2,\n  0x3e, 0x45, 0xf8, 0xbf, 0x08, 0xbd, 0x8b, 0x90, 0xab, 0x3b, 0x38, 0xdd,\n  0xe9, 0x5f, 0x8c, 0x5c, 0xc5, 0xf4, 0x2d, 0xc6, 0x47, 0xc5, 0xf8, 0xae,\n  0x18, 0x5a, 0xc5, 0xf8, 0xaf, 0x98, 0xf8, 0x2e, 0x41, 0xbf, 0x12, 0xf4,\n  0x28, 0x41, 0x87, 0x12, 0x6c, 0x57, 0xc2, 0x98, 0x28, 0x0d, 0x06, 0x90,\n  0xad, 0x14, 0x59, 0x4a, 0xa1, 0x59, 0x0a, 0xcd, 0x52, 0x68, 0x96, 0x42,\n  0xb3, 0x0c, 0x7f, 0x97, 0x21, 0x6f, 0x19, 0x7c, 0xcb, 0xb0, 0x53, 0x19,\n  0xb1, 0x53, 0x06, 0x9f, 0x32, 0xf8, 0xf4, 0x80, 0x4f, 0x0f, 0xf8, 0xf4,\n  0x80, 0x4f, 0x0f, 0xf8, 0xf4, 0x80, 0x4f, 0x0f, 0xf8, 0xf4, 0x80, 0x4f,\n  0x4f, 0xf8, 0xf4, 0x84, 0x4f, 0x4f, 0xf8, 0xf4, 0xc4, 0x5f, 0x3d, 0xf1,\n  0x6f, 0x4f, 0x74, 0xee, 0x89, 0x1d, 0x7a, 0x31, 0x86, 0x7b, 0xe1, 0x93,\n  0x5e, 0xc4, 0x40, 0x2f, 0x7c, 0xdf, 0x8b, 0x18, 0xea, 0x85, 0xff, 0x7a,\n  0xa1, 0x53, 0x39, 0x71, 0x57, 0x8e, 0xcf, 0xcb, 0xf1, 0x4f, 0x39, 0x76,\n  0x2c, 0x47, 0xf7, 0x72, 0xe4, 0x29, 0x87, 0x67, 0x39, 0x74, 0x7b, 0xd3,\n  0xb7, 0x37, 0xed, 0xbd, 0x69, 0xef, 0xd3, 0x59, 0xe8, 0x7d, 0xe1, 0xd7,\n  0x1f, 0x1e, 0x03, 0xa0, 0x33, 0x90, 0xeb, 0x41, 0xc8, 0x3d, 0x04, 0x99,\n  0x87, 0x22, 0xd7, 0x50, 0xec, 0x3b, 0x0c, 0xfc, 0xe1, 0xd0, 0x1c, 0x4e,\n  0xff, 0xe1, 0xf4, 0x1f, 0x81, 0x5c, 0x23, 0xf0, 0xcb, 0x28, 0x68, 0x56,\n  0x62, 0xcf, 0x4a, 0x64, 0x1e, 0x8d, 0x5c, 0x63, 0xd0, 0xef, 0x26, 0xf4,\n  0x1c, 0x8b, 0x9c, 0xe3, 0xd1, 0x6b, 0x02, 0x70, 0x33, 0xfc, 0x27, 0xc2,\n  0x67, 0x22, 0x32, 0x4f, 0xc2, 0x4e, 0x93, 0xf1, 0xcf, 0x2d, 0xc4, 0xc3,\n  0x14, 0xe8, 0xde, 0x8a, 0x6d, 0xa6, 0x32, 0xb6, 0x6e, 0xa3, 0xff, 0x34,\n  0xfa, 0x4d, 0x83, 0xfe, 0x0c, 0x68, 0xcc, 0x44, 0xd7, 0x59, 0xe8, 0x32,\n  0x1b, 0x9d, 0x6e, 0x47, 0xf6, 0x3b, 0xf8, 0x3d, 0x87, 0xb8, 0x9b, 0x0b,\n  0xde, 0x9d, 0x94, 0xf3, 0x90, 0xf9, 0x2e, 0x6c, 0x3d, 0x1f, 0x39, 0xe6,\n  0x63, 0x9f, 0xf9, 0xc8, 0x3e, 0x1f, 0x9c, 0xf9, 0xf0, 0x9d, 0x8f, 0x1c,\n  0xf3, 0xe1, 0xb5, 0x00, 0x99, 0x17, 0x60, 0x9f, 0x05, 0xd8, 0x67, 0x01,\n  0x7a, 0x2d, 0x80, 0x16, 0xb9, 0x88, 0xbe, 0x00, 0xfb, 0x2c, 0x44, 0x17,\n  0xf2, 0x11, 0x7d, 0x21, 0x74, 0x16, 0x12, 0x7b, 0x0b, 0x99, 0x03, 0x16,\n  0xa2, 0xcf, 0x42, 0xe2, 0x73, 0x21, 0xf2, 0x2c, 0x62, 0x5c, 0x2c, 0x42,\n  0xe6, 0x45, 0xc4, 0xc8, 0x22, 0xe2, 0x68, 0x11, 0xf1, 0xb6, 0x08, 0xb9,\n  0x17, 0x21, 0xf3, 0x62, 0x62, 0x7f, 0x31, 0x63, 0x6b, 0x31, 0x7a, 0x2d,\n  0x26, 0x26, 0x17, 0x13, 0x73, 0x8b, 0xdf, 0x01, 0xd0, 0x69, 0x09, 0xb6,\n  0x58, 0x42, 0xec, 0x2e, 0x41, 0xc6, 0x25, 0xf8, 0x72, 0x09, 0x74, 0x97,\n  0x30, 0xae, 0x96, 0x10, 0x23, 0x4b, 0xd0, 0x7d, 0x29, 0x7d, 0x97, 0xd2,\n  0xbe, 0x94, 0xf6, 0xa5, 0xb4, 0x93, 0xfb, 0xe8, 0x4b, 0x69, 0x5f, 0x4a,\n  0xfb, 0x52, 0xda, 0x97, 0xad, 0x95, 0x0f, 0x26, 0x00, 0xd0, 0xb9, 0x07,\n  0xdb, 0xdf, 0x43, 0x7c, 0x2c, 0x47, 0xce, 0xe5, 0xc8, 0xb5, 0x82, 0xf8,\n  0x5a, 0x81, 0xae, 0x2b, 0x90, 0x6b, 0x05, 0x31, 0xb6, 0x82, 0x18, 0x5b,\n  0x01, 0xef, 0x15, 0xf4, 0x5d, 0x41, 0xdf, 0x95, 0xb4, 0xaf, 0xc4, 0x26,\n  0x2b, 0xb1, 0xc5, 0x4a, 0x6c, 0xb1, 0x12, 0x5b, 0xac, 0x44, 0xee, 0x95,\n  0xf8, 0x72, 0x25, 0x76, 0x5e, 0x85, 0x3f, 0x57, 0x61, 0x8f, 0x55, 0xc8,\n  0xbe, 0x0a, 0x1b, 0xaf, 0xc2, 0x26, 0xab, 0x90, 0x7f, 0x15, 0x34, 0xee,\n  0x47, 0x8e, 0x07, 0xa0, 0xf7, 0x00, 0xfe, 0x7c, 0x00, 0xfc, 0x07, 0xb0,\n  0xdf, 0x03, 0xe8, 0xfa, 0x20, 0x7d, 0x1e, 0xc4, 0x2f, 0x0f, 0x62, 0xc3,\n  0x07, 0xd1, 0xf7, 0x41, 0xf0, 0x1e, 0xc4, 0xbe, 0x0f, 0xd2, 0xbe, 0x1a,\n  0xfb, 0xae, 0x46, 0x9f, 0xd5, 0xd0, 0x5b, 0x4d, 0xdb, 0x6a, 0xe2, 0x7a,\n  0x35, 0x36, 0x5e, 0x0d, 0xbd, 0xd5, 0xd8, 0x63, 0x35, 0xb2, 0x3f, 0x84,\n  0x2e, 0x0f, 0xa1, 0xcb, 0x43, 0xe8, 0xfc, 0x10, 0x3a, 0x3f, 0x84, 0xce,\n  0x0f, 0x41, 0xe3, 0x61, 0xf8, 0x3c, 0x82, 0xbd, 0x1f, 0x45, 0xae, 0xc7,\n  0xb1, 0xf5, 0xe3, 0xd8, 0x6e, 0x0d, 0xfc, 0xd6, 0xa2, 0xcb, 0x13, 0xf4,\n  0x7d, 0x82, 0xdf, 0x4f, 0x12, 0x3b, 0x4f, 0x62, 0x83, 0x27, 0xf1, 0xd1,\n  0x93, 0xf8, 0xe8, 0x49, 0xe2, 0xe0, 0x49, 0xfc, 0xff, 0x24, 0xfd, 0x9e,\n  0x84, 0xff, 0x3a, 0x68, 0xaf, 0xc3, 0x36, 0xeb, 0x68, 0x5f, 0x47, 0xfb,\n  0x3a, 0xda, 0xd7, 0xd1, 0xbe, 0x8e, 0xf6, 0xf5, 0xf8, 0xea, 0x69, 0xfa,\n  0xfe, 0x87, 0xfa, 0x0d, 0xe0, 0x6e, 0x84, 0xd6, 0x46, 0x6c, 0xb7, 0x11,\n  0xdb, 0x6c, 0x44, 0xef, 0x8d, 0xe8, 0xbd, 0x11, 0x5b, 0x6f, 0x24, 0xde,\n  0x36, 0x12, 0x0f, 0x1b, 0xe1, 0xf7, 0x0c, 0x72, 0x3e, 0x43, 0x9f, 0x67,\n  0xa0, 0xf7, 0x0c, 0xfd, 0x9e, 0x81, 0xde, 0x33, 0xd0, 0x7b, 0x86, 0xf1,\n  0xf0, 0x2c, 0x3a, 0x3f, 0x4f, 0xac, 0x3d, 0x4f, 0xec, 0x6f, 0xc2, 0x1e,\n  0x9b, 0xb0, 0xdf, 0x26, 0xe8, 0x6c, 0x82, 0xce, 0x26, 0xe8, 0x6c, 0x82,\n  0xce, 0x26, 0xe8, 0x6c, 0x82, 0xce, 0x66, 0x78, 0x6d, 0x86, 0xce, 0x66,\n  0xe8, 0x6c, 0x86, 0xce, 0x66, 0xe8, 0x6c, 0xc6, 0xc7, 0x9b, 0xa1, 0xb3,\n  0x99, 0xfe, 0x9b, 0x89, 0xaf, 0x2d, 0xf8, 0x6a, 0x0b, 0xf2, 0x6c, 0xc1,\n  0x97, 0x5b, 0xf0, 0xe5, 0x16, 0xfc, 0xb5, 0x05, 0x7f, 0x6d, 0xc1, 0x5f,\n  0x5b, 0xb0, 0xff, 0x16, 0x64, 0xde, 0x8a, 0x7d, 0xb7, 0x62, 0xdf, 0xad,\n  0xf0, 0xdb, 0x8a, 0xfd, 0xb7, 0x62, 0xe3, 0xad, 0xd8, 0x98, 0xfc, 0x50,\n  0xdf, 0x8a, 0x8d, 0xb7, 0xc2, 0x73, 0x2b, 0x36, 0xde, 0x06, 0xbf, 0x6d,\n  0xf0, 0xdb, 0xc6, 0xfc, 0xb1, 0x0d, 0xfb, 0x6e, 0x43, 0xe6, 0x6d, 0xf0,\n  0xda, 0x06, 0xaf, 0x6d, 0xf0, 0xda, 0x0e, 0xaf, 0xed, 0xf0, 0xda, 0x0e,\n  0xaf, 0xed, 0xf0, 0xda, 0x0e, 0xaf, 0xed, 0xf0, 0xda, 0x8e, 0x4e, 0xdb,\n  0xc1, 0xd9, 0x41, 0xff, 0x1d, 0xf0, 0xd8, 0x41, 0xdb, 0x0e, 0xda, 0x76,\n  0x10, 0xef, 0x3b, 0xf0, 0xcf, 0x0e, 0xda, 0x77, 0x60, 0xc7, 0x1d, 0xf8,\n  0xe8, 0x45, 0x64, 0x79, 0x11, 0x59, 0x5e, 0xc4, 0xd7, 0x2f, 0x22, 0xc7,\n  0x8b, 0xe0, 0xbc, 0x88, 0x9d, 0x5f, 0x44, 0xe7, 0x9d, 0xb4, 0xed, 0x84,\n  0x3e, 0x79, 0xa9, 0xbe, 0x13, 0x7d, 0x77, 0xa2, 0x2f, 0xb9, 0xa9, 0x4e,\n  0x6e, 0xaa, 0x93, 0x9b, 0xea, 0x3b, 0xe1, 0xb1, 0x13, 0x39, 0x76, 0x21,\n  0xc7, 0x2e, 0xe2, 0x73, 0x17, 0x7c, 0xc8, 0x4d, 0xf5, 0x5d, 0xe8, 0xb0,\n  0xeb, 0x7d, 0xf9, 0xe7, 0x95, 0x85, 0xbe, 0x1b, 0x3f, 0xee, 0x46, 0xc7,\n  0xdd, 0xd0, 0xde, 0x8d, 0x8e, 0xbb, 0xd1, 0x71, 0x37, 0xed, 0xbb, 0xd1,\n  0x71, 0x37, 0x3c, 0xf6, 0xe0, 0xeb, 0x3d, 0xe0, 0xec, 0x01, 0x67, 0x0f,\n  0x32, 0xee, 0x81, 0xfe, 0x1e, 0xda, 0xf6, 0xc8, 0x36, 0x6c, 0xbe, 0x17,\n  0x1d, 0xf6, 0xd2, 0xbe, 0x97, 0x38, 0x23, 0x7f, 0xd5, 0xc9, 0x5f, 0xf5,\n  0xbd, 0xf0, 0x20, 0x7f, 0xd5, 0xf7, 0x12, 0x4f, 0x7b, 0x89, 0xad, 0x2a,\n  0xe4, 0xaf, 0x42, 0xcf, 0x2a, 0x68, 0x54, 0xc1, 0xa7, 0x0a, 0x3e, 0x55,\n  0xf0, 0xa9, 0x82, 0x4f, 0x15, 0xb4, 0xaa, 0xa0, 0xf5, 0x12, 0x7c, 0x5e,\n  0x82, 0x0e, 0xf9, 0xab, 0xfe, 0x12, 0x7c, 0x5e, 0x82, 0xcf, 0x4b, 0xb4,\n  0xbd, 0x84, 0x0d, 0xf6, 0x31, 0x16, 0xf6, 0x31, 0x7e, 0xf6, 0x61, 0x83,\n  0x7d, 0xf8, 0x7f, 0x1f, 0xfe, 0xdf, 0x87, 0xff, 0xf7, 0xe1, 0xff, 0x7d,\n  0xcc, 0x2b, 0xfb, 0xe0, 0xb3, 0x0f, 0x7f, 0xec, 0x87, 0xc6, 0x7e, 0x62,\n  0x69, 0x3f, 0x3e, 0xd9, 0x4f, 0x0c, 0xec, 0x27, 0xee, 0xf7, 0x33, 0xb6,\n  0xf6, 0x83, 0xb7, 0x1f, 0x9b, 0xee, 0x67, 0x2c, 0xef, 0x47, 0xe6, 0x03,\n  0xd0, 0x3b, 0x80, 0xdd, 0x0e, 0x80, 0x73, 0x00, 0x5e, 0x07, 0x68, 0x3f,\n  0x80, 0xbd, 0x0e, 0x20, 0xeb, 0xcb, 0xc8, 0xf0, 0x32, 0xb1, 0xfa, 0x32,\n  0x32, 0xbe, 0x8c, 0x0e, 0x2f, 0x13, 0x13, 0x2f, 0x43, 0xfb, 0x20, 0x31,\n  0x78, 0x10, 0x19, 0x0e, 0xd2, 0xe7, 0x20, 0x73, 0xd3, 0x41, 0xf8, 0x1f,\n  0xa4, 0xfd, 0x20, 0x76, 0x7c, 0x05, 0xbe, 0xaf, 0xc0, 0xf3, 0x15, 0xf8,\n  0xbd, 0xc2, 0x18, 0x7b, 0x85, 0x18, 0x78, 0x85, 0x79, 0xe1, 0x10, 0xe3,\n  0xeb, 0x10, 0x32, 0x1f, 0xa2, 0xfe, 0x10, 0xf4, 0x0e, 0xe1, 0xfb, 0x43,\n  0xf8, 0xe6, 0x10, 0xf2, 0x1e, 0x42, 0xaf, 0x57, 0xa1, 0xf9, 0x2a, 0x76,\n  0x79, 0x95, 0xf6, 0x57, 0xe9, 0xf7, 0x2a, 0xfd, 0x5e, 0xa5, 0xdf, 0x61,\n  0xfa, 0x1d, 0x46, 0x86, 0xc3, 0xc8, 0x7e, 0x98, 0x3e, 0x87, 0x89, 0xcd,\n  0xc3, 0xc8, 0x77, 0x18, 0x7f, 0xbe, 0x26, 0x5f, 0x30, 0x41, 0x47, 0x72,\n  0x74, 0xfd, 0x35, 0x6c, 0xf1, 0x1a, 0x74, 0x5f, 0x43, 0xfe, 0xd7, 0xb0,\n  0xd5, 0x6b, 0xd8, 0xf1, 0x08, 0x7e, 0x38, 0xc2, 0xf5, 0x11, 0xe4, 0x3a,\n  0x02, 0xfe, 0xeb, 0xe8, 0xfd, 0x3a, 0xf5, 0xaf, 0xa3, 0xf7, 0x51, 0xe2,\n  0xe0, 0x28, 0x7a, 0x1f, 0xc5, 0xc6, 0x47, 0xb1, 0xe1, 0x51, 0x7c, 0x70,\n  0x14, 0xfb, 0x1d, 0xa5, 0xfd, 0x28, 0xed, 0x6f, 0x60, 0x9f, 0x63, 0xe0,\n  0xbf, 0x49, 0x2c, 0xbf, 0x89, 0x3c, 0x6f, 0xa2, 0xdf, 0x9b, 0xc8, 0xf4,\n  0x26, 0xf5, 0x6f, 0x22, 0xd7, 0x5b, 0xc8, 0xfb, 0x16, 0xfd, 0xdf, 0x42,\n  0xb6, 0xb7, 0xb0, 0xdb, 0x5b, 0xc8, 0xf6, 0x36, 0xfc, 0xdf, 0x41, 0xfe,\n  0xe3, 0xf8, 0xf8, 0x38, 0x32, 0x1d, 0x87, 0xf6, 0x71, 0x7c, 0x7c, 0x9c,\n  0xfa, 0xe3, 0xd0, 0x3f, 0x8e, 0x8f, 0x8f, 0x23, 0xcf, 0x71, 0x78, 0xbc,\n  0x8b, 0xec, 0xef, 0x62, 0xdf, 0x77, 0xc1, 0x79, 0x97, 0xfe, 0xef, 0xd2,\n  0xff, 0x3d, 0x6c, 0xf9, 0x3e, 0xbf, 0xdf, 0xe7, 0xfa, 0x7d, 0x6c, 0xf3,\n  0x3e, 0x7a, 0xbe, 0x7f, 0x46, 0xbe, 0x68, 0x0c, 0x60, 0x87, 0x0f, 0x18,\n  0x3b, 0x1f, 0x80, 0xf3, 0x01, 0x71, 0xff, 0x01, 0x76, 0xf8, 0x00, 0x7f,\n  0x7c, 0x88, 0xfe, 0x1f, 0xce, 0xaa, 0x01, 0x8c, 0xd9, 0x8f, 0xc0, 0xfb,\n  0x88, 0xeb, 0x8f, 0xe0, 0xf9, 0x31, 0x7d, 0x3f, 0xe6, 0xf7, 0xc7, 0xf8,\n  0xe8, 0x63, 0x6c, 0xfd, 0x09, 0xf2, 0x7e, 0xf2, 0x8e, 0x0b, 0x4e, 0x60,\n  0x9f, 0x13, 0xf0, 0xfb, 0x94, 0xb1, 0xf0, 0x29, 0x3e, 0x38, 0x89, 0x1d,\n  0x4e, 0x42, 0xf7, 0x24, 0xfa, 0x7d, 0x86, 0xaf, 0x3e, 0x83, 0xfe, 0xe7,\n  0x94, 0xa7, 0x18, 0x5b, 0xa7, 0x90, 0xfb, 0x14, 0x36, 0x3c, 0xcd, 0xf5,\n  0x69, 0xe4, 0x3e, 0x0d, 0xcd, 0xd3, 0xe8, 0xf6, 0x05, 0x76, 0xfc, 0x92,\n  0xf1, 0xf4, 0x15, 0xb1, 0xfe, 0x35, 0x71, 0xfa, 0x0d, 0xf6, 0xfa, 0x16,\n  0x1b, 0x7d, 0x07, 0xee, 0x19, 0x6c, 0x71, 0x86, 0xf2, 0x7b, 0x78, 0xfc,\n  0x40, 0x9f, 0xb3, 0xc4, 0xda, 0x8f, 0xe8, 0xf1, 0x23, 0xfe, 0xf8, 0x09,\n  0xf8, 0x19, 0x7b, 0x9f, 0x43, 0x9e, 0x73, 0xf4, 0x65, 0xbf, 0xa1, 0xff,\n  0xc6, 0xf8, 0xf9, 0x8d, 0x3e, 0xe7, 0xd1, 0xfd, 0x0f, 0xec, 0xfd, 0x07,\n  0xed, 0x7f, 0x31, 0x7e, 0x2e, 0xa2, 0xc3, 0x45, 0x6c, 0xf2, 0x37, 0xf2,\n  0xfe, 0xcd, 0x38, 0xbd, 0x84, 0x5f, 0x9c, 0xc8, 0x65, 0x62, 0x63, 0x13,\n  0x39, 0xcc, 0xf3, 0xc2, 0x10, 0xe3, 0x84, 0xa1, 0x85, 0x03, 0x73, 0x80,\n  0x33, 0xc2, 0xd0, 0xab, 0x80, 0x63, 0xc2, 0x30, 0x00, 0x1b, 0xd7, 0xf6,\n  0x65, 0xc0, 0xfb, 0xc2, 0xf0, 0x88, 0x06, 0xf8, 0xcd, 0xfe, 0xc1, 0x70,\n  0xf4, 0x05, 0x76, 0x09, 0xc3, 0x33, 0x18, 0x98, 0x06, 0x3c, 0x07, 0x9c,\n  0x16, 0x86, 0x57, 0x21, 0xb0, 0x16, 0x38, 0x00, 0x80, 0xe7, 0x1d, 0x0f,\n  0x50, 0xe7, 0xbd, 0x01, 0xb8, 0x24, 0x8c, 0x3a, 0xe9, 0xc0, 0x50, 0x60,\n  0xb3, 0x30, 0x7c, 0x6c, 0x00, 0xd7, 0x3e, 0xd0, 0xf4, 0x5b, 0x2d, 0x0c,\n  0xff, 0xd1, 0xc2, 0x08, 0x6c, 0x2f, 0x8c, 0x60, 0x64, 0x09, 0x85, 0x6e,\n  0xb8, 0xbf, 0x30, 0x22, 0x7d, 0x84, 0x11, 0xed, 0x29, 0x8c, 0x98, 0x89,\n  0xc2, 0x88, 0x45, 0x9e, 0xf8, 0x26, 0xc2, 0x48, 0x58, 0x2e, 0x8c, 0x24,\n  0x70, 0xc8, 0xdf, 0x8d, 0x54, 0xe8, 0xa5, 0x41, 0xab, 0x1e, 0xbf, 0xeb,\n  0x23, 0x47, 0x06, 0x32, 0x34, 0x80, 0x5f, 0xc3, 0x23, 0xc2, 0xc8, 0x2a,\n  0x15, 0x46, 0xf6, 0x49, 0x61, 0xe4, 0x40, 0xb7, 0x09, 0xb2, 0x36, 0x85,\n  0x4e, 0xde, 0x22, 0x61, 0x34, 0xa3, 0x2c, 0x18, 0x21, 0x8c, 0xe6, 0xc8,\n  0xd8, 0xb2, 0x48, 0x18, 0xe4, 0xb4, 0x46, 0x6b, 0xe4, 0x6f, 0x8d, 0x1c,\n  0x85, 0xeb, 0x85, 0xd1, 0xe6, 0x51, 0x61, 0xb4, 0x85, 0x5f, 0x3b, 0x01,\n  0x5c, 0x10, 0x46, 0x7b, 0x64, 0xef, 0x98, 0x0f, 0xd0, 0xd6, 0x09, 0xb9,\n  0xc8, 0x49, 0x8d, 0x2e, 0xd8, 0x83, 0x5c, 0xd4, 0xe8, 0x46, 0x59, 0x94,\n  0x05, 0x60, 0xa3, 0xee, 0xc8, 0xdb, 0x7d, 0x95, 0x30, 0x8a, 0x5b, 0x00,\n  0xbd, 0x00, 0xec, 0x5a, 0x7c, 0x17, 0x40, 0xbf, 0x62, 0x70, 0x4b, 0xb0,\n  0x5f, 0x09, 0x72, 0x90, 0x53, 0x1a, 0xa5, 0xd8, 0xb9, 0x0c, 0x59, 0x7a,\n  0x20, 0x7f, 0x8f, 0xce, 0xc2, 0x20, 0x37, 0x34, 0x7a, 0xa1, 0x7b, 0x2f,\n  0x6c, 0x56, 0x8e, 0x4c, 0xe5, 0xc8, 0x54, 0x8e, 0xbd, 0x7a, 0xa3, 0x5b,\n  0x1f, 0x68, 0xf5, 0x45, 0xe7, 0xbe, 0xc8, 0xd1, 0xef, 0x1d, 0x61, 0xf4,\n  0x47, 0xef, 0x01, 0xd8, 0x61, 0x00, 0xba, 0x0d, 0x84, 0xf6, 0x40, 0x68,\n  0x0f, 0x82, 0xc6, 0x20, 0xca, 0xc1, 0x03, 0x01, 0xf0, 0x86, 0x60, 0xdb,\n  0x21, 0xe8, 0x37, 0x04, 0x3a, 0x43, 0xa0, 0x39, 0x14, 0x39, 0x2a, 0xd0,\n  0x79, 0x18, 0xf4, 0x86, 0x53, 0x8e, 0x80, 0xd7, 0x08, 0xae, 0x47, 0xc2,\n  0x6b, 0x24, 0x31, 0x30, 0x0a, 0xdd, 0x2b, 0xe1, 0x31, 0x1a, 0x7f, 0x8d,\n  0x46, 0x87, 0x31, 0xd4, 0x8f, 0x81, 0xff, 0x4d, 0xf0, 0x1a, 0x0b, 0xff,\n  0x71, 0xe8, 0x3d, 0x0e, 0xb9, 0xc7, 0x21, 0xf7, 0x78, 0xec, 0x37, 0x1e,\n  0x5e, 0x13, 0xb0, 0xeb, 0x84, 0xb3, 0xc2, 0xb8, 0x19, 0x59, 0x6e, 0x86,\n  0xe7, 0x44, 0xec, 0x3d, 0x09, 0x7f, 0x4d, 0x82, 0xd7, 0x64, 0xf4, 0x22,\n  0x4f, 0x34, 0x6e, 0xc1, 0xaf, 0x53, 0xe0, 0x35, 0x05, 0x1a, 0xb7, 0xc2,\n  0x77, 0x2a, 0x76, 0x9c, 0x4a, 0xec, 0x4c, 0xc5, 0x57, 0xb7, 0xd1, 0x6f,\n  0x9a, 0x04, 0xf4, 0x98, 0x06, 0x9d, 0xe9, 0xc8, 0x3c, 0x1d, 0x1b, 0x4d,\n  0xa7, 0x6e, 0x3a, 0xfc, 0xa7, 0x83, 0x3f, 0x7d, 0x16, 0x80, 0x9c, 0xd3,\n  0xe1, 0x3d, 0x1d, 0x9c, 0x19, 0xd8, 0x78, 0x06, 0xed, 0xe4, 0x98, 0xc6,\n  0x0c, 0xda, 0x66, 0x20, 0xdf, 0x4c, 0xe4, 0x98, 0x89, 0xfd, 0x67, 0x62,\n  0x8b, 0x99, 0xe0, 0xcd, 0x82, 0xd7, 0x2c, 0xe8, 0xcf, 0xc2, 0x4f, 0xb3,\n  0xb6, 0x03, 0xc4, 0xcd, 0x2c, 0x6c, 0x30, 0x1b, 0xb9, 0x67, 0xe3, 0x57,\n  0x72, 0x52, 0x63, 0x36, 0xfe, 0x9e, 0x8d, 0x0e, 0xb7, 0xc3, 0xef, 0xf6,\n  0x4c, 0x61, 0xdc, 0x81, 0xcc, 0x77, 0x50, 0x3f, 0x07, 0x1b, 0xcc, 0x81,\n  0xe6, 0x5c, 0x68, 0xcf, 0x45, 0xa7, 0x3b, 0xd1, 0xe7, 0x4e, 0xea, 0xe7,\n  0xa1, 0xcb, 0x5d, 0xf0, 0x99, 0x8f, 0x8c, 0xf3, 0xb1, 0xeb, 0x42, 0xe8,\n  0x2d, 0x42, 0x96, 0xc5, 0xc4, 0xc8, 0x62, 0xf8, 0x2e, 0xa1, 0x7e, 0x09,\n  0x7a, 0x2c, 0x85, 0xff, 0x32, 0xf0, 0xee, 0x86, 0xd7, 0x3d, 0xf8, 0xff,\n  0x1e, 0xf8, 0xdf, 0x8b, 0xac, 0xcb, 0xb1, 0xef, 0x0a, 0x70, 0x56, 0xd2,\n  0xb6, 0x0a, 0x7d, 0x1e, 0x80, 0xef, 0x83, 0xc8, 0xf2, 0x20, 0x63, 0x6e,\n  0x35, 0xf1, 0xb2, 0xfa, 0x6b, 0x61, 0x3c, 0x04, 0xee, 0xc3, 0xf0, 0x7b,\n  0x98, 0x58, 0x78, 0x24, 0x59, 0x18, 0x8f, 0xa2, 0xc7, 0xa3, 0xd0, 0x78,\n  0x8c, 0x3e, 0x8f, 0xc3, 0x7f, 0x0d, 0xfe, 0x58, 0x8b, 0xaf, 0x9e, 0xc4,\n  0x47, 0x4f, 0xa2, 0xef, 0x3a, 0x6c, 0xbc, 0x0e, 0x19, 0xd7, 0x43, 0xe3,\n  0x29, 0xf4, 0x7d, 0x1a, 0x99, 0x9f, 0x46, 0xd7, 0xff, 0x50, 0x6e, 0x80,\n  0xe7, 0x06, 0xf0, 0xc9, 0x7f, 0x8c, 0x67, 0xc1, 0x7f, 0x0e, 0x1d, 0xc9,\n  0x7f, 0x8c, 0xe7, 0x89, 0xe7, 0x17, 0xe8, 0xb3, 0x19, 0xb9, 0x37, 0x13,\n  0x8b, 0x5b, 0xf0, 0xd9, 0x56, 0xc6, 0xce, 0x56, 0xfc, 0x42, 0x7e, 0x62,\n  0x6c, 0x03, 0x77, 0x1b, 0x3a, 0x6c, 0x27, 0x9e, 0x76, 0x50, 0xb7, 0x83,\n  0xf8, 0x79, 0x11, 0xfa, 0x3b, 0xd1, 0x71, 0x17, 0x3e, 0xd9, 0x0d, 0x8d,\n  0xdd, 0xb4, 0xef, 0xa1, 0x6e, 0x0f, 0xb6, 0xda, 0x83, 0xad, 0xf6, 0xc0,\n  0x67, 0x2f, 0xd7, 0x55, 0xc8, 0x5c, 0x85, 0x2e, 0x55, 0xc8, 0xfd, 0x12,\n  0xf2, 0xbd, 0x44, 0x9f, 0x97, 0xd0, 0x7b, 0x1f, 0x32, 0xb0, 0xb6, 0x1a,\n  0xac, 0xad, 0xc6, 0x7e, 0xf4, 0x63, 0x5d, 0x35, 0x58, 0x57, 0x8d, 0xfd,\n  0xe8, 0xc5, 0xba, 0x6a, 0xec, 0x27, 0x46, 0x58, 0x57, 0x8d, 0xfd, 0xe8,\n  0xb8, 0x1f, 0xf9, 0x0e, 0x20, 0xfb, 0x01, 0xf4, 0x39, 0x80, 0xbf, 0x5f,\n  0xc6, 0x66, 0xac, 0xa5, 0xc6, 0xcb, 0xc4, 0xd0, 0xcb, 0xc4, 0xf6, 0xcb,\n  0xd8, 0xe6, 0x65, 0xfc, 0xf1, 0x32, 0xfe, 0x7b, 0x19, 0x5d, 0x0f, 0xa2,\n  0xc7, 0x41, 0x64, 0x3e, 0x08, 0x8f, 0x83, 0xd8, 0xef, 0x15, 0xfa, 0xbe,\n  0x82, 0x2d, 0x5f, 0x41, 0xa6, 0x43, 0xd8, 0xf8, 0x10, 0xb1, 0x72, 0x08,\n  0x79, 0x0e, 0x61, 0xc7, 0x43, 0xc8, 0xfd, 0x2a, 0x7c, 0x5f, 0x85, 0xef,\n  0xab, 0xd0, 0x7f, 0x95, 0xfe, 0xaf, 0x82, 0x7b, 0x18, 0x1e, 0x87, 0xe1,\n  0x71, 0x18, 0x1e, 0x87, 0xe1, 0xc1, 0x7a, 0x69, 0xb0, 0x5e, 0x1a, 0x87,\n  0xb1, 0xcf, 0x61, 0xe4, 0x66, 0x9d, 0x34, 0x5e, 0xc3, 0x66, 0xaf, 0x81,\n  0xff, 0x1a, 0x32, 0x1d, 0xc1, 0x7f, 0x47, 0xa0, 0xf5, 0x3a, 0x7c, 0x5f,\n  0xa7, 0xfe, 0x75, 0xae, 0x8f, 0xc2, 0xeb, 0x28, 0xbc, 0x8e, 0xc2, 0xeb,\n  0x28, 0x32, 0x1e, 0x45, 0xff, 0xa3, 0xc8, 0x78, 0x94, 0x18, 0x63, 0x5d,\n  0x34, 0x8e, 0x22, 0xcf, 0x1b, 0x8c, 0xa1, 0x37, 0xc0, 0x79, 0x03, 0x5b,\n  0xbd, 0x01, 0x8d, 0x63, 0xd8, 0xe2, 0x18, 0x72, 0x1f, 0xa3, 0xfd, 0x18,\n  0x7e, 0x7d, 0x13, 0x19, 0xdf, 0x44, 0x1e, 0xd6, 0x47, 0xe3, 0x2d, 0x64,\n  0x7c, 0x8b, 0xb9, 0xec, 0x6d, 0xe4, 0x7d, 0x9b, 0x39, 0xf2, 0x6d, 0x64,\n  0x7a, 0x07, 0x7e, 0xef, 0xa0, 0xe3, 0x3b, 0xd8, 0x89, 0xf5, 0xd1, 0x60,\n  0x7d, 0x34, 0x8e, 0x13, 0xb7, 0xc7, 0xb1, 0xf3, 0x71, 0xec, 0x77, 0x5c,\n  0xd6, 0x63, 0xbf, 0x77, 0x91, 0xe5, 0x5d, 0xe8, 0xbc, 0x87, 0x5e, 0xef,\n  0xa1, 0xd7, 0xfb, 0xf0, 0xf8, 0x00, 0x5e, 0x1f, 0x10, 0x17, 0x1f, 0x42,\n  0xfb, 0x43, 0xe6, 0x9d, 0x0f, 0xf1, 0xdb, 0x87, 0xc4, 0xf1, 0x47, 0xc8,\n  0xfa, 0x31, 0xfa, 0x7d, 0x8c, 0x4f, 0x3e, 0x26, 0x16, 0x3e, 0x86, 0x2f,\n  0xeb, 0x9d, 0xf1, 0x09, 0xb4, 0x4f, 0x60, 0x8b, 0x13, 0xe0, 0x7d, 0x8a,\n  0x8d, 0x3f, 0x85, 0xf7, 0xa7, 0xc4, 0xc3, 0xa7, 0xd8, 0xe4, 0x24, 0xf8,\n  0x27, 0xc1, 0x3f, 0x09, 0x3e, 0xeb, 0x9e, 0x71, 0x12, 0xfc, 0x93, 0xe0,\n  0x9d, 0x44, 0xd7, 0x93, 0xf0, 0xfd, 0x0c, 0x99, 0x3e, 0xc3, 0x2e, 0xac,\n  0x81, 0xc6, 0xe7, 0xf4, 0xfb, 0x9c, 0x3e, 0x9f, 0x63, 0xc7, 0xcf, 0xd1,\n  0xf1, 0x14, 0x72, 0x9c, 0x42, 0xa6, 0x53, 0xd8, 0xff, 0x14, 0xed, 0xa7,\n  0x4e, 0xbb, 0x5e, 0x98, 0x3e, 0x0d, 0xcd, 0xd3, 0xd0, 0x3c, 0x8d, 0xdd,\n  0x4e, 0xa3, 0xcf, 0x69, 0x68, 0x9d, 0x26, 0x5e, 0xbe, 0x00, 0xff, 0x0b,\n  0xf8, 0x7c, 0x01, 0xfe, 0x17, 0xd8, 0xed, 0x0b, 0xe8, 0x7e, 0x41, 0xbf,\n  0x2f, 0xc1, 0xff, 0x12, 0x9a, 0x5f, 0xa2, 0xef, 0x57, 0x67, 0x5c, 0x2f,\n  0x5e, 0x7f, 0x43, 0xdd, 0x37, 0xd8, 0xe9, 0x5b, 0xfa, 0x7c, 0x0b, 0x8d,\n  0xef, 0x88, 0x93, 0x33, 0xf0, 0x3a, 0x83, 0xcd, 0xfe, 0x8b, 0xbd, 0xbe,\n  0x87, 0xce, 0xf7, 0xc8, 0xf7, 0x03, 0xf6, 0x3c, 0x8b, 0x8d, 0xce, 0x62,\n  0xb3, 0x1f, 0xc1, 0xff, 0x11, 0x5f, 0xff, 0x04, 0xde, 0x4f, 0xc4, 0xfa,\n  0xcf, 0xc4, 0xcf, 0xcf, 0xd8, 0xe9, 0x1c, 0xba, 0x9f, 0xc3, 0x36, 0xbf,\n  0x60, 0xc3, 0x5f, 0xc0, 0xfb, 0x95, 0x7e, 0xbf, 0x81, 0x7b, 0x1e, 0x79,\n  0x7f, 0x47, 0xe7, 0xdf, 0xc1, 0xfd, 0x93, 0xf1, 0xff, 0x27, 0xb6, 0xbd,\n  0x80, 0x8e, 0x17, 0xe0, 0xf1, 0x17, 0x3e, 0xbe, 0x08, 0xef, 0x8b, 0xd8,\n  0x95, 0xf5, 0xd6, 0xb8, 0xc4, 0xf5, 0x25, 0x7c, 0xeb, 0x24, 0x26, 0x9c,\n  0xd8, 0xd3, 0x89, 0x9d, 0x9c, 0xf0, 0x72, 0xa2, 0x83, 0x79, 0x5a, 0xd8,\n  0xb4, 0x22, 0x60, 0x04, 0x30, 0x45, 0xc8, 0x3f, 0x79, 0x61, 0x63, 0xdd,\n  0xb5, 0x19, 0xeb, 0x85, 0xcd, 0xd6, 0x04, 0x38, 0x20, 0x6c, 0xf6, 0x81,\n  0x00, 0x6d, 0x1e, 0xdb, 0x85, 0xcd, 0x41, 0x9d, 0xe3, 0x9c, 0xb0, 0x79,\n  0xde, 0x25, 0x6c, 0x5e, 0xed, 0x01, 0xda, 0xbc, 0xbe, 0x16, 0x36, 0xef,\n  0xb5, 0xc2, 0x56, 0x27, 0x1e, 0x78, 0x47, 0xd8, 0x7c, 0x96, 0x03, 0x1b,\n  0x84, 0xcd, 0x17, 0x5c, 0x5f, 0xe8, 0xd7, 0x5d, 0x24, 0x6c, 0xfe, 0xe9,\n  0xc2, 0x16, 0x30, 0x47, 0xd8, 0x02, 0xb3, 0x80, 0x47, 0x85, 0x2d, 0xe8,\n  0x98, 0xb0, 0x05, 0xf7, 0x05, 0xde, 0x17, 0xb6, 0x90, 0x89, 0xc2, 0x16,\n  0xba, 0x0b, 0x38, 0x22, 0x6c, 0x61, 0xd3, 0x84, 0x2d, 0x1c, 0x19, 0xc2,\n  0xe1, 0x1b, 0x41, 0xbf, 0x48, 0x7e, 0x47, 0x05, 0x03, 0xc9, 0x00, 0xfc,\n  0xa3, 0xc0, 0x89, 0x3a, 0x2b, 0x6c, 0xd1, 0xfe, 0x00, 0xfd, 0xa2, 0xcf,\n  0x00, 0x17, 0x84, 0x2d, 0x06, 0xfc, 0x18, 0x78, 0xc7, 0xc0, 0x2f, 0x06,\n  0xf9, 0x62, 0xe9, 0x13, 0x9b, 0x0f, 0x20, 0x5f, 0x2c, 0x7c, 0x63, 0x91,\n  0x27, 0x96, 0xf6, 0x58, 0x70, 0xe3, 0x90, 0x33, 0xae, 0x33, 0x40, 0xff,\n  0xb8, 0x55, 0x00, 0xbc, 0xe3, 0x4e, 0x0a, 0x5b, 0x3c, 0x7c, 0xe3, 0xb1,\n  0x43, 0xfc, 0xc7, 0x00, 0x74, 0x13, 0xe8, 0x97, 0x58, 0x28, 0x6c, 0x49,\n  0xd0, 0x48, 0xc9, 0x14, 0xb6, 0x54, 0xe4, 0x4d, 0xa7, 0x5f, 0x3d, 0xe4,\n  0xa8, 0x0f, 0xbf, 0x0c, 0x74, 0x68, 0x00, 0xbd, 0x2c, 0x74, 0xcb, 0xa6,\n  0xad, 0x31, 0x7d, 0x72, 0xc0, 0xcd, 0x45, 0xe6, 0xdc, 0xd5, 0x00, 0x3c,\n  0x9b, 0x96, 0x02, 0xd0, 0xcb, 0x6b, 0x01, 0xa0, 0x6b, 0xfe, 0x21, 0x61,\n  0x2b, 0x08, 0x07, 0x96, 0x09, 0x5b, 0x73, 0x74, 0x6a, 0x3e, 0x0b, 0x90,\n  0xd7, 0xd8, 0xa4, 0x25, 0xf2, 0xb6, 0x06, 0xaf, 0x10, 0xba, 0x6d, 0x90,\n  0xa7, 0xed, 0x38, 0x61, 0x6b, 0x07, 0xad, 0xf6, 0xd8, 0xac, 0x03, 0xb2,\n  0x75, 0x80, 0x0e, 0x6b, 0xbf, 0xad, 0x53, 0x2f, 0x61, 0xeb, 0x0c, 0x5e,\n  0x67, 0x74, 0xed, 0x82, 0xed, 0xbb, 0xe2, 0x9b, 0x6e, 0xd4, 0x15, 0x21,\n  0x63, 0x77, 0x80, 0xb5, 0xde, 0x56, 0x82, 0xdc, 0xa5, 0x5c, 0x97, 0xa1,\n  0x4f, 0x0f, 0x70, 0x7b, 0x22, 0x47, 0xcf, 0xa1, 0xc2, 0xd6, 0x0b, 0x9f,\n  0xf4, 0x42, 0xd6, 0x72, 0x6c, 0xdb, 0x1b, 0x9f, 0xf5, 0x81, 0x67, 0x9f,\n  0x4b, 0xc2, 0xd6, 0x0f, 0x5f, 0xf6, 0x43, 0xfe, 0x01, 0x94, 0x03, 0xc1,\n  0x1d, 0x84, 0x0f, 0x07, 0xd3, 0x7f, 0x08, 0x7d, 0x86, 0x42, 0xa3, 0x02,\n  0x59, 0x86, 0xa1, 0xe7, 0xf0, 0x68, 0x00, 0xbe, 0x23, 0x6c, 0xc2, 0x36,\n  0x12, 0x1e, 0xa3, 0xa0, 0x55, 0x89, 0x7c, 0xa3, 0x89, 0xa1, 0xd1, 0x9b,\n  0x85, 0x6d, 0xcc, 0x68, 0x00, 0x1d, 0x6f, 0x42, 0x9f, 0xb1, 0xd8, 0x95,\n  0x35, 0xda, 0x36, 0x1e, 0x3b, 0x4e, 0x80, 0xc6, 0x04, 0xf8, 0xdc, 0x4c,\n  0xfd, 0x44, 0x68, 0x4d, 0x42, 0xaf, 0x49, 0xd8, 0x68, 0x32, 0xbc, 0x26,\n  0xc3, 0xe3, 0x16, 0x64, 0xbe, 0x15, 0x7b, 0x4c, 0x85, 0xee, 0x54, 0x6c,\n  0x78, 0x1b, 0xfe, 0xbb, 0x0d, 0x3b, 0x4c, 0x03, 0x77, 0x3a, 0x3c, 0xa6,\n  0x83, 0x3f, 0x1d, 0xfc, 0xe9, 0xd0, 0x9c, 0x8e, 0x1d, 0xa6, 0x63, 0xf7,\n  0x19, 0xd8, 0x71, 0x06, 0xf2, 0xb3, 0x06, 0xdb, 0x58, 0x83, 0x6d, 0xac,\n  0xc1, 0xb6, 0x19, 0xf0, 0x9e, 0x81, 0x1e, 0x33, 0x7d, 0x00, 0xe4, 0x9a,\n  0x09, 0xdd, 0x99, 0xf8, 0x61, 0x26, 0xb4, 0x66, 0x21, 0xef, 0x2c, 0xfc,\n  0x3d, 0x1b, 0x1d, 0x66, 0x43, 0xe3, 0x76, 0xfa, 0xdd, 0x81, 0x5d, 0xef,\n  0xc0, 0x97, 0x73, 0xc0, 0x9f, 0x83, 0x2d, 0x59, 0x6b, 0x6d, 0x77, 0x12,\n  0x1f, 0x77, 0xd2, 0x6f, 0x1e, 0xb2, 0xcf, 0x63, 0x2c, 0xdc, 0xc5, 0xf5,\n  0x7c, 0x64, 0x9b, 0x8f, 0x4f, 0x16, 0x60, 0x83, 0x05, 0xe8, 0xb1, 0x10,\n  0x5d, 0x17, 0x61, 0xab, 0x45, 0xd8, 0x7d, 0x11, 0xba, 0x2d, 0xc2, 0x07,\n  0x8b, 0xc0, 0x5b, 0x04, 0xfd, 0x45, 0xf8, 0x68, 0x11, 0x31, 0xb2, 0x08,\n  0x59, 0x16, 0xe1, 0xf3, 0x45, 0xd0, 0x5d, 0x8c, 0x5e, 0x8b, 0xa1, 0xb1,\n  0x98, 0x3e, 0x8b, 0xc1, 0x5f, 0x0c, 0x2e, 0xeb, 0xb5, 0x6d, 0x31, 0x38,\n  0x8b, 0x69, 0x67, 0xdd, 0xb6, 0x2d, 0xa1, 0x7d, 0x09, 0xed, 0x4b, 0x68,\n  0x5f, 0x42, 0xfb, 0x12, 0xda, 0x97, 0xd0, 0xbe, 0x84, 0xf6, 0xa5, 0xb4,\n  0x2f, 0xa5, 0x7d, 0x29, 0xed, 0x4b, 0x69, 0x5f, 0x4a, 0xfb, 0x52, 0xda,\n  0x97, 0xd2, 0xbe, 0x94, 0xf6, 0x65, 0xb4, 0x2f, 0xa3, 0x7d, 0x19, 0xed,\n  0xcb, 0x68, 0x5f, 0x46, 0xfb, 0x32, 0xda, 0x97, 0x21, 0xff, 0x32, 0xe4,\n  0x5e, 0x86, 0xcc, 0x77, 0xa3, 0xf7, 0xdd, 0xc4, 0xc2, 0xdd, 0xd8, 0xf7,\n  0x6e, 0xec, 0x75, 0x37, 0xbe, 0xb8, 0x9b, 0xf6, 0xbb, 0x69, 0xbf, 0x87,\n  0xfe, 0xf7, 0xd0, 0x76, 0x0f, 0xf2, 0xdf, 0xc3, 0xf8, 0xba, 0x17, 0x5b,\n  0xdd, 0x8b, 0xbd, 0xef, 0xa5, 0x6d, 0x39, 0x3a, 0x2f, 0xc7, 0xfe, 0xcb,\n  0x89, 0x89, 0xe5, 0xe7, 0x85, 0xed, 0x3e, 0x74, 0x5e, 0x81, 0xfd, 0x56,\n  0xc2, 0x63, 0x15, 0x7d, 0xee, 0x97, 0x40, 0x3c, 0x3d, 0x88, 0xaf, 0x1e,\n  0xa4, 0x6e, 0x35, 0xf8, 0xab, 0xb1, 0xf7, 0x43, 0xf8, 0xf6, 0x21, 0x78,\n  0x90, 0x47, 0xd8, 0x1e, 0xc1, 0xce, 0x8f, 0xc0, 0xff, 0x11, 0x62, 0xea,\n  0x11, 0xfc, 0xf4, 0x28, 0x32, 0x3e, 0x0a, 0xee, 0xa3, 0xd8, 0xfb, 0x31,\n  0xc6, 0xe1, 0x63, 0xf0, 0x7a, 0x0c, 0x3f, 0x3c, 0x06, 0xfd, 0xc7, 0x29,\n  0xd7, 0xa0, 0xcb, 0x1a, 0x74, 0x59, 0x03, 0xaf, 0x35, 0xe8, 0xf8, 0x1f,\n  0xc6, 0xee, 0x06, 0xfc, 0xb1, 0x01, 0xdf, 0x6c, 0xc0, 0xe7, 0x1b, 0xa8,\n  0xdf, 0x40, 0xbf, 0x0d, 0xc8, 0xb7, 0x11, 0xba, 0x1b, 0xb9, 0x7e, 0x06,\n  0xd9, 0x9f, 0x41, 0xae, 0x67, 0x18, 0xff, 0xcf, 0x82, 0x4b, 0xbe, 0x61,\n  0x7b, 0x16, 0x1b, 0x3c, 0x0b, 0xce, 0x73, 0xf0, 0x79, 0x0e, 0x99, 0x9e,\n  0xa3, 0xed, 0x79, 0x64, 0x78, 0x1e, 0x3e, 0x2f, 0x60, 0x87, 0x17, 0xd0,\n  0x75, 0x13, 0x7d, 0x37, 0x51, 0xbf, 0x19, 0x99, 0xb6, 0x30, 0xaf, 0x6c,\n  0xc1, 0x26, 0x5b, 0x88, 0x71, 0xf2, 0x11, 0xdb, 0x56, 0xda, 0xb7, 0x41,\n  0x63, 0x1b, 0x32, 0x6c, 0xc3, 0xce, 0xdb, 0xb1, 0xd3, 0x76, 0xf4, 0xdb,\n  0x8e, 0x7d, 0xb6, 0x3f, 0x27, 0x6c, 0x3b, 0xc0, 0xd9, 0x41, 0xfc, 0xee,\n  0x20, 0xc6, 0x77, 0x10, 0x9b, 0x2f, 0x42, 0x67, 0x27, 0xb2, 0xee, 0xc6,\n  0x56, 0xbb, 0xe1, 0xb9, 0x07, 0xdb, 0xec, 0xc1, 0x36, 0x7b, 0xd0, 0x6f,\n  0x0f, 0xed, 0x7b, 0x90, 0x6f, 0x2f, 0xf2, 0xee, 0x25, 0xf6, 0xc8, 0x55,\n  0x6c, 0x7b, 0xc1, 0xdd, 0x4b, 0xbc, 0x56, 0x61, 0x9f, 0x2a, 0xe4, 0x7b,\n  0x09, 0xdb, 0xbc, 0x04, 0xcf, 0x7d, 0xe8, 0xb8, 0x0f, 0xf9, 0xf6, 0x61,\n  0xd3, 0x7d, 0xf8, 0x8a, 0xdc, 0xc5, 0xb6, 0x8f, 0x98, 0xda, 0x47, 0xff,\n  0x7d, 0xf0, 0xd8, 0x8f, 0x0c, 0xfb, 0xb1, 0xef, 0x7e, 0x64, 0xdf, 0x0f,\n  0xfd, 0x03, 0x8c, 0x17, 0xf6, 0xfd, 0xb6, 0x03, 0xc8, 0xfd, 0x32, 0x7a,\n  0xbf, 0x8c, 0xbf, 0x5e, 0x86, 0xfe, 0xcb, 0xd0, 0x3a, 0x88, 0x8c, 0x07,\n  0x91, 0x97, 0x3d, 0xbe, 0xed, 0x20, 0xfc, 0x5e, 0xa1, 0xed, 0x10, 0xfd,\n  0x0f, 0x61, 0x7f, 0xf6, 0xf0, 0xff, 0x67, 0x78, 0x95, 0x7e, 0x87, 0x19,\n  0x2f, 0x87, 0xe1, 0xc7, 0xbe, 0xdd, 0x76, 0x04, 0xbd, 0x5e, 0xa7, 0x24,\n  0xe7, 0xb0, 0xbd, 0x81, 0xdd, 0xdf, 0xc0, 0x7f, 0x6f, 0x20, 0xc7, 0x31,\n  0xe6, 0x82, 0x63, 0xf0, 0x3c, 0x86, 0x0c, 0x6f, 0x82, 0xfb, 0x26, 0xe5,\n  0x5b, 0xf4, 0x7b, 0x0b, 0x3b, 0xbf, 0x85, 0x1c, 0x6f, 0xa1, 0xc7, 0xdb,\n  0xc8, 0x75, 0x1c, 0x59, 0x8e, 0x33, 0xaf, 0x1e, 0x47, 0xc7, 0xe3, 0xe8,\n  0xf8, 0x2e, 0x7a, 0xbd, 0x8b, 0x5e, 0xef, 0x22, 0xff, 0xbb, 0x8c, 0xb3,\n  0xf7, 0x98, 0x5b, 0xde, 0x23, 0x86, 0xd8, 0x4b, 0xdb, 0x3e, 0x04, 0xff,\n  0x63, 0x7c, 0xf0, 0x31, 0x36, 0x64, 0x2f, 0x6c, 0x3b, 0x81, 0x2f, 0x4f,\n  0x10, 0x27, 0x27, 0xe0, 0xfd, 0x29, 0x34, 0x4e, 0xd2, 0xf6, 0x39, 0xb8,\n  0xa7, 0x68, 0x3f, 0x85, 0x5c, 0xa7, 0x91, 0xf7, 0x34, 0x7e, 0xf8, 0x02,\n  0xba, 0x5f, 0x81, 0xf3, 0x15, 0xf3, 0xc6, 0xd7, 0xe8, 0xff, 0x0d, 0x3e,\n  0xfe, 0x96, 0xf9, 0xe1, 0x5b, 0xfc, 0xf6, 0x2d, 0x74, 0xbe, 0x23, 0xde,\n  0xbe, 0xa3, 0xfe, 0x3b, 0x64, 0x3f, 0x83, 0x0e, 0x67, 0xc0, 0x3d, 0x83,\n  0x3c, 0xec, 0x7d, 0x6d, 0xff, 0x85, 0xc7, 0x7f, 0xa1, 0xf9, 0x5f, 0xda,\n  0xbe, 0x27, 0x3e, 0xbe, 0x47, 0xff, 0xef, 0x19, 0xd7, 0x3f, 0x60, 0xe7,\n  0x1f, 0xf0, 0xcf, 0x0f, 0xd4, 0x9f, 0x45, 0xaf, 0xb3, 0xe8, 0xc5, 0x5a,\n  0x6e, 0xfb, 0x11, 0x9c, 0x1f, 0xf1, 0xdd, 0x8f, 0xc8, 0xfe, 0x23, 0xe3,\n  0xee, 0x27, 0xf4, 0xf9, 0x89, 0x18, 0xfa, 0x89, 0xeb, 0x9f, 0xf1, 0xeb,\n  0xcf, 0xf0, 0xf9, 0x99, 0x3e, 0xe7, 0xe8, 0x73, 0x8e, 0x3e, 0xe7, 0xc0,\n  0x63, 0x7d, 0xb7, 0xfd, 0x42, 0x9f, 0x5f, 0x90, 0xf3, 0x57, 0xea, 0x7f,\n  0x45, 0xe7, 0x5f, 0xd1, 0xff, 0x57, 0xfc, 0xfd, 0x1b, 0xfa, 0xfd, 0xc6,\n  0x1a, 0xf1, 0x1b, 0x3c, 0xcf, 0xe3, 0xe7, 0xf3, 0xc4, 0xce, 0x79, 0xe8,\n  0x9d, 0x27, 0x6e, 0x7e, 0x27, 0xbe, 0x7e, 0xc7, 0xc6, 0xbf, 0xb3, 0x2e,\n  0xfe, 0x01, 0x8d, 0x3f, 0xe8, 0xf7, 0x07, 0xfd, 0xfe, 0xa0, 0xdf, 0x9f,\n  0xe8, 0xf4, 0x27, 0x3e, 0xf8, 0x73, 0xb3, 0x7a, 0x34, 0xd9, 0x76, 0x01,\n  0x9d, 0x2e, 0x60, 0x8b, 0x0b, 0xc8, 0xf1, 0x17, 0x76, 0xfc, 0x8b, 0x7e,\n  0x7f, 0x41, 0xf3, 0x22, 0xb6, 0xba, 0x88, 0x1c, 0x17, 0x89, 0xe7, 0xbf,\n  0xb9, 0xfe, 0x9b, 0xfe, 0x97, 0xb0, 0xc1, 0x25, 0xe2, 0xee, 0x12, 0x71,\n  0x7f, 0x19, 0x9e, 0x97, 0x89, 0xf1, 0xcb, 0xc8, 0xe6, 0xa4, 0xde, 0x89,\n  0x9c, 0x4e, 0xf8, 0x3b, 0x19, 0x43, 0x26, 0x74, 0x4c, 0xf0, 0xcd, 0x93,\n  0xc2, 0x2e, 0xb2, 0x80, 0x29, 0xc0, 0x01, 0x61, 0xd7, 0x82, 0x81, 0xd1,\n  0x00, 0xd7, 0x7a, 0xb8, 0xfa, 0xc2, 0xb4, 0x5d, 0x5f, 0x0b, 0x9c, 0x15,\n  0x76, 0xa3, 0x09, 0x30, 0x0b, 0x38, 0x24, 0xec, 0x36, 0x1f, 0xa0, 0x2f,\n  0xb0, 0x41, 0xd8, 0xed, 0xf1, 0x00, 0xfd, 0xed, 0x47, 0x84, 0xdd, 0x83,\n  0x3e, 0x1e, 0xf4, 0x67, 0x9f, 0x6f, 0x77, 0xf8, 0x03, 0xe0, 0x38, 0xd6,\n  0x03, 0xe7, 0x85, 0xdd, 0xb3, 0x10, 0x58, 0x0e, 0x7c, 0x2d, 0xec, 0x5e,\n  0xe9, 0x00, 0x7d, 0xbc, 0xe8, 0xe3, 0x1d, 0x0d, 0x4c, 0x04, 0xb8, 0xae,\n  0x03, 0xdd, 0x3a, 0xa5, 0xc0, 0xa3, 0x00, 0x78, 0x3e, 0x99, 0xc0, 0x34,\n  0x00, 0x79, 0x7c, 0x3d, 0x01, 0xe8, 0xf9, 0x1e, 0x13, 0x76, 0x3f, 0xfa,\n  0xf8, 0x8d, 0x03, 0xb6, 0x0b, 0x7b, 0x5d, 0x1b, 0x50, 0x04, 0xd0, 0xa7,\n  0xee, 0x39, 0x61, 0xf7, 0x87, 0x8f, 0x3f, 0x7c, 0xfc, 0x4f, 0x0b, 0x7b,\n  0x00, 0x32, 0x07, 0x2c, 0x02, 0xa0, 0x15, 0x38, 0x14, 0x98, 0x03, 0xa0,\n  0x4f, 0xe0, 0x25, 0x61, 0x0f, 0x82, 0x7f, 0xd0, 0x2a, 0x00, 0x1a, 0xc1,\n  0xd0, 0x0b, 0x06, 0x2f, 0x18, 0x39, 0x43, 0xc0, 0x0b, 0x41, 0xc7, 0x50,\n  0x78, 0x87, 0xae, 0x16, 0xf6, 0x30, 0xe8, 0x87, 0xc1, 0x2b, 0xec, 0x1d,\n  0x00, 0xfa, 0xe1, 0xe8, 0x15, 0x8e, 0x5d, 0xc2, 0xb1, 0x45, 0x38, 0x7a,\n  0x86, 0x43, 0x3b, 0x52, 0x00, 0xd8, 0x21, 0x12, 0x7e, 0x91, 0xed, 0x01,\n  0xe4, 0x8c, 0xa4, 0x4f, 0x24, 0xfc, 0x22, 0xe1, 0x11, 0x89, 0x9d, 0x22,\n  0xc1, 0x8d, 0x84, 0x46, 0xa4, 0xc4, 0xbf, 0x20, 0xec, 0x51, 0xe0, 0x46,\n  0x21, 0x43, 0x14, 0xfa, 0x44, 0xf7, 0x02, 0xb0, 0x71, 0x0c, 0x65, 0xcc,\n  0x08, 0x80, 0xfa, 0x98, 0xbb, 0x00, 0xfa, 0xc6, 0x20, 0x5f, 0xcc, 0xfb,\n  0xc2, 0x1e, 0x0b, 0xfd, 0x58, 0x68, 0xc6, 0x6e, 0x06, 0x90, 0x83, 0x5c,\n  0xc8, 0x1e, 0x07, 0xcd, 0x78, 0xe4, 0x8c, 0x47, 0xf6, 0x78, 0x78, 0x24,\n  0xe0, 0x3f, 0xf2, 0x1f, 0x7b, 0x02, 0xf8, 0x09, 0xe8, 0x92, 0xc8, 0xef,\n  0xc4, 0x64, 0x00, 0x5e, 0x89, 0xd0, 0x4e, 0xc4, 0x8e, 0x49, 0xd8, 0x27,\n  0x09, 0x1d, 0x93, 0xc0, 0x4b, 0xc2, 0x16, 0x49, 0xb2, 0x0e, 0x5b, 0x25,\n  0xa3, 0x43, 0x72, 0x0b, 0x00, 0xfb, 0x27, 0xe3, 0x8f, 0x64, 0x6c, 0x98,\n  0x8c, 0xbc, 0xc9, 0xf0, 0x4a, 0x21, 0x46, 0x52, 0xe0, 0x91, 0x02, 0xcd,\n  0x54, 0xf8, 0xa6, 0xe2, 0xab, 0x34, 0xec, 0x92, 0x86, 0x9c, 0x69, 0xc8,\n  0x98, 0x06, 0xef, 0xb4, 0x5d, 0xc2, 0x9e, 0x0e, 0xaf, 0xf4, 0x7c, 0x00,\n  0xfd, 0xd3, 0x91, 0xad, 0x1e, 0xed, 0xf5, 0xb9, 0xce, 0xa0, 0x2e, 0x03,\n  0x7a, 0x19, 0xc8, 0x95, 0x85, 0x1c, 0x59, 0xf4, 0xcf, 0xc2, 0x0e, 0xd9,\n  0xd8, 0x30, 0x1b, 0xfd, 0x1a, 0x13, 0x0f, 0x8d, 0xf1, 0x5f, 0x13, 0x64,\n  0x68, 0x82, 0x2f, 0x9a, 0xa0, 0x53, 0x93, 0x65, 0xc2, 0x9e, 0x0b, 0x6e,\n  0x2e, 0x7d, 0x9a, 0xd2, 0xbf, 0x29, 0x74, 0x9a, 0xc2, 0xab, 0x29, 0xf8,\n  0x79, 0xfc, 0xce, 0x43, 0xf6, 0x3c, 0x64, 0xcb, 0xc7, 0x2e, 0xf9, 0xd8,\n  0x2c, 0xff, 0x63, 0x61, 0x2f, 0x40, 0xb7, 0x02, 0x6c, 0x54, 0x40, 0x5b,\n  0x01, 0xfc, 0x0b, 0xa8, 0x6b, 0x0e, 0xb4, 0x20, 0xce, 0x5b, 0x12, 0x23,\n  0x2d, 0xe1, 0xd7, 0x12, 0x7d, 0x5b, 0xa1, 0x4b, 0x2b, 0xec, 0xde, 0x1a,\n  0x3a, 0xad, 0xa9, 0x6b, 0x7d, 0x46, 0xd8, 0x0b, 0x91, 0xaf, 0x0d, 0xfc,\n  0xdb, 0x10, 0xc3, 0x6d, 0xf0, 0x4f, 0x5b, 0xfa, 0xb4, 0xc3, 0x16, 0xed,\n  0xf0, 0x4b, 0x7b, 0xca, 0x0e, 0xf8, 0xb5, 0x03, 0x38, 0x1d, 0x88, 0x9d,\n  0x8e, 0xd8, 0xa3, 0x23, 0x34, 0x3a, 0x81, 0xdf, 0x89, 0x58, 0xe9, 0x84,\n  0x2e, 0x9d, 0x89, 0xcf, 0xce, 0xc8, 0xdd, 0x19, 0xdc, 0xce, 0xe8, 0xdd,\n  0x99, 0xd8, 0xe9, 0x8c, 0x0c, 0x9d, 0xb1, 0x59, 0x17, 0x68, 0x76, 0xc1,\n  0xb6, 0x5d, 0xa8, 0xef, 0x42, 0x7d, 0x17, 0xea, 0xbb, 0x60, 0xf3, 0xae,\n  0xd8, 0xb0, 0x2b, 0x36, 0xeb, 0x8a, 0x1c, 0x5d, 0x91, 0xb9, 0x1b, 0xf4,\n  0xbb, 0xa1, 0x5f, 0x37, 0x64, 0xee, 0x06, 0x9f, 0x22, 0x74, 0x2b, 0x82,\n  0x6f, 0x11, 0x63, 0xaa, 0x08, 0x7b, 0x14, 0xe1, 0xfb, 0x22, 0xec, 0x51,\n  0x84, 0x7c, 0xdd, 0xb1, 0x53, 0x77, 0xf4, 0xed, 0x8e, 0xee, 0xdd, 0x91,\n  0xa5, 0xfb, 0x73, 0x00, 0xfe, 0xea, 0x0e, 0xbf, 0x62, 0xf8, 0x15, 0xc3,\n  0xaf, 0x18, 0x3f, 0x93, 0x57, 0xda, 0x4b, 0xb0, 0x63, 0x09, 0xe3, 0xa8,\n  0x04, 0x1b, 0x97, 0xa0, 0x7f, 0x09, 0xf2, 0x96, 0x22, 0x2f, 0xb9, 0xa6,\n  0xbd, 0x14, 0x79, 0x4b, 0x91, 0xab, 0x14, 0xb9, 0x4a, 0xab, 0x2c, 0x40,\n  0xb6, 0x32, 0x74, 0x2b, 0x83, 0x7f, 0x19, 0x3c, 0xca, 0xa0, 0x53, 0x46,\n  0xbc, 0x94, 0x21, 0x23, 0x79, 0xa9, 0xbd, 0x07, 0x7c, 0x7a, 0x60, 0xfb,\n  0x9e, 0xc8, 0xd5, 0x93, 0xeb, 0x5e, 0xc8, 0xd2, 0x8b, 0xeb, 0x5e, 0xc4,\n  0x40, 0x39, 0xb1, 0x56, 0x8e, 0x1e, 0xe5, 0xb4, 0xf7, 0xc6, 0xe6, 0xbd,\n  0xa1, 0x47, 0xbe, 0x6a, 0xef, 0x83, 0x5f, 0xfa, 0x20, 0x7b, 0x1f, 0x78,\n  0xf7, 0x41, 0xfe, 0xbe, 0xc8, 0xd4, 0x97, 0x3e, 0x7d, 0xb1, 0x7f, 0x3f,\n  0xe2, 0xb4, 0x1f, 0x3a, 0xf4, 0xa3, 0xbd, 0x3f, 0x3c, 0xfb, 0xd3, 0x7f,\n  0x00, 0xe3, 0x6c, 0x00, 0xb4, 0x06, 0xe0, 0xf7, 0x01, 0xe0, 0x0c, 0x80,\n  0xf7, 0x00, 0x6c, 0x3d, 0x00, 0x5f, 0x0d, 0x64, 0x9e, 0x18, 0x88, 0x0f,\n  0x06, 0x12, 0x0f, 0x83, 0xc0, 0x1b, 0x44, 0xfc, 0x0d, 0xc2, 0x9f, 0x83,\n  0xe1, 0x33, 0x98, 0xf9, 0x66, 0x08, 0x31, 0x3a, 0x04, 0x7a, 0x43, 0xd1,\n  0x75, 0x28, 0xfc, 0x2a, 0xd0, 0xb5, 0x02, 0x5d, 0x2b, 0xd0, 0xb5, 0x02,\n  0x5d, 0x2b, 0xd0, 0xb5, 0x02, 0xb9, 0x2a, 0xd0, 0x73, 0x18, 0x3e, 0x20,\n  0x47, 0xb6, 0x0f, 0x43, 0xd6, 0x61, 0xc4, 0xfd, 0x30, 0x68, 0x0e, 0x43,\n  0x8f, 0x61, 0xe8, 0x35, 0x0c, 0x5b, 0x0e, 0xc7, 0x96, 0xc3, 0xd1, 0x79,\n  0x38, 0x36, 0x18, 0x8e, 0x2d, 0x87, 0xc3, 0x6b, 0x38, 0xbc, 0x86, 0xa3,\n  0xdf, 0x08, 0xe4, 0x1e, 0x01, 0xcf, 0x11, 0xcc, 0x07, 0x23, 0xb0, 0xcf,\n  0x08, 0x78, 0x8f, 0x20, 0xb6, 0x47, 0x10, 0x33, 0x23, 0x91, 0x6b, 0x24,\n  0xf2, 0x8f, 0x44, 0xfe, 0x91, 0xc8, 0x3f, 0x12, 0xf9, 0x47, 0xe2, 0xbf,\n  0x91, 0xc8, 0x34, 0x12, 0xff, 0x8e, 0xa2, 0xcf, 0x28, 0x74, 0xa9, 0x44,\n  0x97, 0x4a, 0xec, 0x57, 0x09, 0x8f, 0x4a, 0x7c, 0x3f, 0x1a, 0x59, 0x47,\n  0x23, 0xeb, 0x68, 0x64, 0x1d, 0x8d, 0x7d, 0xc6, 0xc0, 0x77, 0x0c, 0x3a,\n  0xdc, 0x04, 0x9d, 0x9b, 0xa0, 0x3b, 0x16, 0x9a, 0x63, 0x89, 0x85, 0x71,\n  0xf4, 0x1b, 0x07, 0xcd, 0xf1, 0xd8, 0x61, 0x3c, 0xf4, 0xc7, 0x13, 0x2f,\n  0x37, 0x23, 0xdf, 0xcd, 0xc4, 0xc1, 0x44, 0xea, 0x27, 0x21, 0xc7, 0x64,\n  0xf4, 0x9a, 0x0c, 0x9f, 0xc9, 0xc8, 0x35, 0x19, 0x5d, 0x6f, 0x01, 0xf7,\n  0x16, 0x74, 0x9b, 0x12, 0x2e, 0xff, 0x9a, 0x8c, 0xcf, 0x6b, 0xe2, 0xa8,\n  0x08, 0xd7, 0xc2, 0x45, 0x88, 0xd0, 0xc5, 0x6a, 0x71, 0x49, 0x3e, 0x2a,\n  0xad, 0x2d, 0xf6, 0x0b, 0x11, 0x9e, 0xfc, 0x2b, 0x44, 0x5d, 0xb1, 0x47,\n  0xfe, 0x7d, 0x78, 0x9b, 0x17, 0xd7, 0x83, 0xd5, 0x5f, 0x06, 0x92, 0xd7,\n  0x9a, 0x08, 0xe4, 0x97, 0xeb, 0x5a, 0x17, 0x7e, 0x62, 0xa2, 0x75, 0x6d,\n  0x88, 0xa6, 0xe2, 0x76, 0xeb, 0xda, 0x26, 0x12, 0xc5, 0x76, 0xeb, 0xda,\n  0x2e, 0x3a, 0x8a, 0x0f, 0xad, 0x6b, 0x0f, 0x11, 0xaf, 0x45, 0x5b, 0xd7,\n  0x0e, 0xd1, 0x5e, 0x6b, 0x61, 0x5d, 0x7b, 0x8a, 0xfa, 0xf2, 0xf4, 0x58,\n  0x5d, 0x7b, 0x89, 0x74, 0xed, 0x19, 0xeb, 0xda, 0x5b, 0xb4, 0xfd, 0x7f,\n  0xac, 0xbd, 0x07, 0x98, 0x1b, 0xc5, 0x19, 0x37, 0xbe, 0xbd, 0x68, 0xcb,\n  0xb9, 0x63, 0x63, 0xca, 0x19, 0xd3, 0x5d, 0xb8, 0x2d, 0x5a, 0x49, 0x74,\n  0x95, 0x5d, 0xdb, 0xd8, 0xd8, 0xc6, 0x05, 0x6c, 0xaa, 0x75, 0x77, 0xf2,\n  0x9d, 0x6c, 0x9d, 0x74, 0x9c, 0x74, 0x36, 0x76, 0xe8, 0xbd, 0x97, 0xd0,\n  0x7b, 0xef, 0x01, 0xce, 0x10, 0x7a, 0xef, 0x84, 0x5e, 0x42, 0x0a, 0x90,\n  0x84, 0x92, 0x42, 0x42, 0x09, 0x69, 0x84, 0x14, 0xc2, 0x37, 0xbb, 0xfb,\n  0xdb, 0x3d, 0xdd, 0xc5, 0xfa, 0xf2, 0xff, 0x9e, 0xe7, 0xef, 0x7b, 0xac,\n  0x77, 0x66, 0x76, 0xe6, 0xfd, 0xbd, 0x33, 0x3b, 0xfb, 0xbe, 0xef, 0xcc,\n  0xec, 0xce, 0xd0, 0x6f, 0x23, 0xac, 0x50, 0x7b, 0x33, 0x13, 0x10, 0x56,\n  0xa9, 0x3d, 0x99, 0x25, 0x08, 0x6b, 0xcc, 0x25, 0xcc, 0xb9, 0x08, 0xeb,\n  0x94, 0x4d, 0xd4, 0x58, 0x9e, 0xaa, 0x11, 0xa9, 0x36, 0x50, 0x03, 0x54,\n  0x99, 0xea, 0xa1, 0x7a, 0x89, 0x6d, 0x6b, 0xa7, 0x4c, 0x62, 0xe5, 0x0c,\n  0x2a, 0x43, 0x42, 0x73, 0xc8, 0xd5, 0x1a, 0x49, 0xaf, 0x50, 0x25, 0x12,\n  0x9b, 0x47, 0x55, 0xa9, 0x2e, 0x6a, 0x36, 0x09, 0x65, 0x49, 0x4a, 0x85,\n  0xd0, 0x25, 0x71, 0xa9, 0x7a, 0x10, 0x2b, 0x11, 0x5a, 0x22, 0xbc, 0xd6,\n  0x91, 0xdf, 0x6e, 0x92, 0x73, 0x21, 0x29, 0xdd, 0x20, 0xff, 0xdb, 0xa9,\n  0xa5, 0x54, 0x91, 0x94, 0xae, 0x07, 0x79, 0x7a, 0xa8, 0x41, 0x52, 0xba,\n  0x48, 0xf2, 0x99, 0x24, 0x4f, 0x47, 0x80, 0xb6, 0x07, 0xc1, 0x5a, 0x44,\n  0xfe, 0xe6, 0x90, 0x50, 0x54, 0x2a, 0x2a, 0x33, 0x6b, 0x54, 0xa9, 0xff,\n  0xe6, 0xda, 0x3e, 0x2a, 0xc7, 0x81, 0x81, 0x14, 0x75, 0x22, 0x5d, 0x8d,\n  0x5c, 0x6f, 0x1f, 0x81, 0xd3, 0x4e, 0xca, 0x36, 0xa8, 0xd5, 0x24, 0xdf,\n  0x60, 0xc0, 0xa5, 0x97, 0xe4, 0xaa, 0x06, 0xf5, 0xde, 0x99, 0xc8, 0x6d,\n  0x90, 0x9c, 0x69, 0xf2, 0xdf, 0xa4, 0x76, 0xf9, 0x7f, 0x90, 0xa3, 0x1c,\n  0xc8, 0x50, 0x0c, 0x78, 0x0f, 0x10, 0xda, 0x4d, 0xf2, 0xf5, 0x05, 0x79,\n  0xd6, 0x92, 0xb4, 0x1a, 0x41, 0x6b, 0xd5, 0x96, 0xfb, 0x07, 0x12, 0xfa,\n  0x7c, 0x36, 0x90, 0xfb, 0x10, 0x5e, 0xf1, 0x4b, 0xf6, 0x04, 0x52, 0xf5,\n  0xfc, 0x5f, 0x73, 0x16, 0x82, 0xf6, 0xf6, 0xef, 0x80, 0x5f, 0xc7, 0x65,\n  0x24, 0x56, 0x24, 0x65, 0x9b, 0x53, 0xfd, 0xbb, 0xd0, 0x4e, 0x75, 0x92,\n  0x12, 0xed, 0x9b, 0x29, 0xdf, 0x3d, 0xa2, 0x7c, 0x03, 0xe5, 0x67, 0x07,\n  0xf7, 0xb3, 0x41, 0xf2, 0xec, 0x4e, 0xed, 0x46, 0xfe, 0xd6, 0x07, 0x7f,\n  0xb3, 0x49, 0xae, 0x61, 0xf9, 0x67, 0x13, 0x89, 0x6a, 0x24, 0xef, 0x6e,\n  0x24, 0x5e, 0x22, 0x79, 0x77, 0x03, 0xe7, 0x1a, 0x09, 0x6d, 0xbe, 0x74,\n  0xdf, 0x28, 0xf4, 0x61, 0x0e, 0x75, 0x92, 0x36, 0x48, 0x64, 0xf1, 0xef,\n  0xd5, 0xb2, 0xe0, 0x6e, 0xf8, 0x6d, 0xe9, 0x05, 0xf9, 0x1b, 0xc1, 0x3d,\n  0xf6, 0xdb, 0xaf, 0x41, 0xb8, 0xf8, 0xed, 0x59, 0x8a, 0x5b, 0xbb, 0x42,\n  0x68, 0x17, 0x89, 0x57, 0x83, 0x3e, 0xe7, 0xd7, 0x73, 0x90, 0x84, 0xbb,\n  0x83, 0x3b, 0xef, 0xd7, 0xa6, 0x37, 0xc8, 0xbb, 0x94, 0xb4, 0xdf, 0x02,\n  0x42, 0x17, 0x05, 0xa8, 0xd5, 0x11, 0x9c, 0x17, 0x8c, 0xe0, 0x30, 0x93,\n  0xa4, 0x8c, 0xee, 0x37, 0x7e, 0x6f, 0x30, 0x82, 0x1e, 0xff, 0xff, 0x22,\n  0x59, 0x77, 0x40, 0x1b, 0xc1, 0x33, 0xd5, 0x19, 0xf4, 0xb2, 0x50, 0xbe,\n  0x90, 0x67, 0x31, 0xf8, 0xdd, 0x8e, 0x3c, 0x43, 0x4b, 0x83, 0xbb, 0xbb,\n  0x94, 0x84, 0xdb, 0xa9, 0x5c, 0x10, 0xf7, 0x63, 0xbe, 0x1c, 0x07, 0x91,\n  0xd0, 0x32, 0x6a, 0x2e, 0x91, 0x7a, 0x39, 0xa1, 0x7e, 0x3c, 0x4b, 0xfa,\n  0xde, 0x12, 0xf2, 0xbb, 0x90, 0xc4, 0xe7, 0x51, 0x6e, 0x50, 0x76, 0x11,\n  0x49, 0x69, 0x27, 0x4f, 0xf0, 0x22, 0x92, 0x5a, 0x08, 0x4a, 0xcc, 0x0b,\n  0xc2, 0xe1, 0x35, 0x2f, 0x78, 0x4e, 0x17, 0x52, 0x2b, 0x09, 0x9d, 0x4f,\n  0xae, 0xf8, 0x79, 0x7c, 0xde, 0x25, 0x22, 0x55, 0xd8, 0x3a, 0x03, 0x41,\n  0xec, 0x28, 0xd2, 0x32, 0x03, 0x41, 0x4f, 0xa8, 0x07, 0x32, 0x0e, 0x04,\n  0xf5, 0xe8, 0x23, 0xa9, 0x7e, 0x0b, 0x87, 0xcf, 0xb1, 0x5f, 0xd7, 0x52,\n  0x50, 0xc3, 0xff, 0xf7, 0x76, 0x6d, 0x27, 0x6d, 0x54, 0x1b, 0x71, 0x4f,\n  0xea, 0x41, 0x99, 0x2e, 0x92, 0x6b, 0x75, 0x90, 0xb3, 0x3d, 0x78, 0x9e,\n  0xaa, 0xc1, 0x93, 0x55, 0x0c, 0x7a, 0x94, 0x2f, 0x67, 0x7f, 0x20, 0x61,\n  0x5f, 0xd0, 0x96, 0xd1, 0x1d, 0xa9, 0xa3, 0xfd, 0xba, 0x71, 0xff, 0xfb,\n  0x82, 0xba, 0x14, 0xc9, 0xff, 0xe1, 0xeb, 0x7e, 0x3f, 0x5d, 0x17, 0x94,\n  0xad, 0xc6, 0xcf, 0xd0, 0x06, 0x92, 0x36, 0x18, 0xc8, 0x30, 0x08, 0x99,\n  0xc2, 0x67, 0xb2, 0xf1, 0xff, 0xe1, 0xae, 0x8e, 0x7e, 0x1e, 0xea, 0x44,\n  0x62, 0xff, 0xce, 0xf6, 0x07, 0x5a, 0x6f, 0x76, 0x20, 0x5b, 0x85, 0x50,\n  0xbf, 0x8e, 0x3d, 0xe4, 0xba, 0xdf, 0xf2, 0x0b, 0x82, 0x73, 0xcc, 0xc2,\n  0x9d, 0x00, 0xaf, 0x22, 0xba, 0x64, 0x33, 0xff, 0x88, 0x3d, 0xf1, 0x8f,\n  0xcb, 0x63, 0x89, 0x36, 0x26, 0x36, 0x95, 0x68, 0x7b, 0x91, 0x68, 0x76,\n  0x5f, 0x8b, 0x2b, 0x44, 0x63, 0x6b, 0x44, 0x3b, 0xb7, 0x51, 0x63, 0xa8,\n  0xb1, 0xc4, 0x7e, 0x8c, 0xa7, 0x26, 0x10, 0x9b, 0x33, 0x89, 0xda, 0x82,\n  0x9a, 0x4c, 0x4d, 0xa1, 0xb6, 0xa4, 0xa6, 0x52, 0x5b, 0x51, 0x5b, 0x53,\n  0xdb, 0x50, 0xdb, 0x12, 0x59, 0xa7, 0x91, 0xbe, 0x33, 0x9d, 0xda, 0x9e,\n  0xda, 0x81, 0xda, 0x91, 0xda, 0x89, 0xe8, 0xaf, 0x5d, 0xa8, 0x5d, 0xa9,\n  0x19, 0xa4, 0xf5, 0x66, 0x11, 0x79, 0x76, 0x0b, 0xf4, 0x9d, 0x49, 0x59,\n  0x94, 0x4d, 0x25, 0x89, 0xbd, 0x49, 0x11, 0xbd, 0x96, 0x21, 0x75, 0xd8,\n  0x83, 0xda, 0x93, 0xda, 0x8b, 0xda, 0x9b, 0xda, 0x87, 0xda, 0x97, 0xf4,\n  0x8f, 0x1c, 0xe9, 0x3f, 0x05, 0xd2, 0x9f, 0x3c, 0xa2, 0x9f, 0xe6, 0x92,\n  0x7b, 0xba, 0x1f, 0xe9, 0x2b, 0x0b, 0x88, 0xae, 0x58, 0x48, 0xea, 0xb1,\n  0x98, 0x3a, 0x80, 0xf4, 0xb0, 0xa5, 0xa4, 0x5f, 0x2d, 0x27, 0x4f, 0xc6,\n  0x41, 0xd4, 0x0a, 0xd2, 0x97, 0x0e, 0xa6, 0x0e, 0xa1, 0x0e, 0xa5, 0x0e,\n  0x23, 0x56, 0xed, 0x08, 0x6a, 0x15, 0x55, 0x54, 0x7f, 0x46, 0xdd, 0x48,\n  0x9d, 0x4c, 0x9d, 0x42, 0x3d, 0x4e, 0x5d, 0x42, 0x7d, 0x4a, 0x9d, 0x4a,\n  0x9d, 0x4b, 0x9d, 0x45, 0x5d, 0x4d, 0xdd, 0x4e, 0xdd, 0x44, 0xf3, 0xd4,\n  0x99, 0xb4, 0x40, 0x9d, 0x44, 0x5d, 0xa8, 0xfe, 0x5c, 0x7d, 0x8f, 0x3a,\n  0x47, 0x7d, 0x9f, 0x3a, 0x9d, 0x7a, 0x96, 0xfa, 0xa5, 0xfa, 0x01, 0x75,\n  0x0d, 0x75, 0x07, 0xf5, 0x37, 0xea, 0xaf, 0xd4, 0xd7, 0xd4, 0x0d, 0xd4,\n  0x5d, 0xd4, 0x8f, 0xa8, 0x17, 0xa9, 0xbb, 0xc9, 0x73, 0xd2, 0x45, 0x9d,\n  0x4f, 0xee, 0xeb, 0x2b, 0xa4, 0xc5, 0x5f, 0x22, 0x96, 0xf6, 0x0d, 0xea,\n  0x55, 0xea, 0x35, 0xea, 0x75, 0xea, 0xf7, 0xe4, 0x5e, 0xbc, 0x43, 0xbd,\n  0x49, 0xbd, 0x45, 0xdd, 0x43, 0x5a, 0xf7, 0x2b, 0xea, 0x02, 0x62, 0x1f,\n  0x7f, 0x4c, 0xbd, 0x4b, 0xee, 0xc9, 0x67, 0xd4, 0x17, 0xd4, 0x19, 0xd4,\n  0x1a, 0xd2, 0xfa, 0x6b, 0x49, 0x3f, 0xa8, 0x90, 0xbb, 0x77, 0x1d, 0xb9,\n  0x07, 0x47, 0x06, 0xbd, 0xb9, 0x1e, 0x3c, 0x75, 0xeb, 0xc8, 0x3d, 0xfc,\n  0x03, 0xe9, 0xdf, 0x1b, 0xc9, 0xfd, 0xff, 0x1e, 0x75, 0x0c, 0x75, 0x34,\n  0xf5, 0x10, 0x75, 0x3d, 0x75, 0x1c, 0xb1, 0xbc, 0xc7, 0x53, 0x27, 0x50,\n  0x9f, 0x53, 0x5f, 0x52, 0x8f, 0xd0, 0x12, 0x2d, 0xd3, 0x09, 0x5a, 0xa1,\n  0x55, 0x5a, 0xa3, 0xbe, 0xa5, 0xfe, 0x43, 0xeb, 0x74, 0x1b, 0x3d, 0x86,\n  0x1e, 0x4b, 0x7d, 0x47, 0x53, 0xf4, 0x38, 0x7a, 0x3c, 0x3d, 0x81, 0xa6,\n  0xe9, 0x89, 0xf4, 0x24, 0x7a, 0x0b, 0x7a, 0x32, 0x3d, 0x85, 0xde, 0x92,\n  0x9e, 0x4a, 0x6f, 0x45, 0x6f, 0x4d, 0x6f, 0x43, 0x6f, 0x4b, 0xb7, 0x53,\n  0xdf, 0x50, 0xff, 0xa0, 0xa7, 0xd1, 0xdb, 0xa9, 0xbf, 0x50, 0x7f, 0x49,\n  0xef, 0x40, 0xef, 0x48, 0xef, 0x44, 0xef, 0x4c, 0xef, 0x42, 0xef, 0x4a,\n  0xcf, 0xa0, 0x67, 0xd2, 0xb3, 0xe8, 0xd9, 0xf4, 0x6e, 0x74, 0x07, 0xf5,\n  0x4f, 0xda, 0xa0, 0x4d, 0xda, 0xa2, 0x6d, 0xf5, 0x57, 0xea, 0x87, 0x74,\n  0x8a, 0x4e, 0xd3, 0x19, 0xf5, 0x23, 0xf5, 0x63, 0x7a, 0x4f, 0x7a, 0x2f,\n  0x7a, 0x6f, 0x7a, 0x1f, 0xea, 0x63, 0xea, 0x13, 0x7a, 0x5f, 0x3a, 0xab,\n  0x7e, 0xa2, 0xfe, 0x9a, 0x2e, 0xd0, 0x2e, 0xed, 0xd1, 0x73, 0xe8, 0xb9,\n  0xf4, 0x3c, 0x7a, 0x3f, 0x7a, 0x3e, 0xbd, 0x80, 0xde, 0x9f, 0x5e, 0x48,\n  0x0d, 0x51, 0x9b, 0xe8, 0x45, 0xf4, 0x62, 0xf5, 0x37, 0xea, 0x6f, 0xe9,\n  0xa5, 0xf4, 0x32, 0x7a, 0x39, 0x7d, 0x20, 0x7d, 0x10, 0xbd, 0x82, 0xfa,\n  0x17, 0xf1, 0x41, 0x7e, 0x4d, 0xfd, 0x46, 0xfd, 0x9d, 0xfa, 0x29, 0x7d,\n  0x08, 0x7d, 0x28, 0x7d, 0x18, 0x7d, 0x38, 0x7d, 0x04, 0xbd, 0x8a, 0x2e,\n  0xd2, 0x9d, 0x74, 0x17, 0xdd, 0x4d, 0x97, 0xe8, 0xd5, 0x74, 0x0f, 0xdd,\n  0x4b, 0x97, 0xe9, 0x35, 0xf4, 0x5a, 0xba, 0x42, 0xf7, 0xd1, 0x55, 0xea,\n  0x51, 0xba, 0x46, 0xf7, 0xd3, 0x47, 0xd2, 0x03, 0xd4, 0x6f, 0xa9, 0xdf,\n  0xd1, 0x75, 0xea, 0x16, 0xba, 0x41, 0x0f, 0xd2, 0xeb, 0xe8, 0xf5, 0xf4,\n  0x51, 0xf4, 0x06, 0xf5, 0xf7, 0xea, 0x1f, 0xa8, 0x9f, 0x51, 0x1f, 0x51,\n  0xef, 0x51, 0xef, 0x53, 0x1f, 0x50, 0xbf, 0xa0, 0x3e, 0xa4, 0x7e, 0x4e,\n  0xfd, 0x8a, 0x3e, 0x9a, 0x3e, 0x86, 0x3e, 0x96, 0x3e, 0x8e, 0x3e, 0x9e,\n  0x3e, 0x81, 0x3e, 0x91, 0x3e, 0x89, 0x3e, 0x99, 0x3e, 0x85, 0x3e, 0x95,\n  0x3e, 0x8d, 0x3e, 0x9d, 0x3e, 0x43, 0xfd, 0x8c, 0x3e, 0x93, 0x3e, 0x8b,\n  0x3e, 0x9b, 0x3e, 0x87, 0x3e, 0x97, 0x3e, 0x8f, 0x3e, 0x9f, 0xbe, 0x80,\n  0xfe, 0x3e, 0x7d, 0x21, 0x7d, 0x11, 0x7d, 0x31, 0x7d, 0x09, 0x7d, 0x29,\n  0x7d, 0x19, 0x7d, 0x39, 0x7d, 0x05, 0x7d, 0x25, 0x7d, 0x95, 0xfa, 0x39,\n  0x7d, 0x35, 0x7d, 0x0d, 0x7d, 0x2d, 0x7d, 0x1d, 0x7d, 0x3d, 0x7d, 0x03,\n  0x7d, 0x23, 0x7d, 0x13, 0x7d, 0x33, 0x7d, 0x0b, 0x7d, 0x2b, 0x7d, 0x1b,\n  0x7d, 0x3b, 0x7d, 0x07, 0x7d, 0x27, 0xfd, 0x03, 0xfa, 0x2e, 0xfa, 0x6e,\n  0xf5, 0x0b, 0xfa, 0x1e, 0x7a, 0x88, 0xde, 0x44, 0x5d, 0x49, 0xdf, 0xab,\n  0x7e, 0x49, 0xff, 0x90, 0xbe, 0x9f, 0x7e, 0x80, 0x7e, 0x90, 0x7e, 0x88,\n  0x7e, 0x98, 0x7e, 0x84, 0x7e, 0x94, 0x7e, 0x8c, 0x7e, 0x9c, 0x7e, 0x82,\n  0x7e, 0x52, 0xfd, 0xa3, 0xfa, 0x95, 0xfa, 0x27, 0xf5, 0xcf, 0xea, 0x5f,\n  0xd4, 0xbf, 0xaa, 0x7f, 0x53, 0xbf, 0x56, 0xff, 0xae, 0x7e, 0xa3, 0xfe,\n  0x43, 0xfd, 0xa7, 0xfa, 0x2f, 0xf5, 0xdf, 0xea, 0xb7, 0xea, 0x7f, 0xd4,\n  0xef, 0x34, 0x4a, 0xa3, 0x35, 0x46, 0x63, 0x35, 0x4e, 0xe3, 0x35, 0x41,\n  0x13, 0x35, 0x49, 0x93, 0xb5, 0x84, 0xa6, 0x68, 0xaa, 0xa6, 0x69, 0xba,\n  0xd6, 0xa6, 0x8d, 0xd1, 0xc6, 0x6a, 0xe3, 0xb4, 0xf1, 0xda, 0x04, 0x6d,\n  0xa2, 0x36, 0x49, 0xdb, 0x42, 0x9b, 0xac, 0x4d, 0xd1, 0xb6, 0xd4, 0xa6,\n  0x6a, 0x5b, 0x69, 0x5b, 0x6b, 0xdb, 0x68, 0xdb, 0x6a, 0xed, 0xda, 0x34,\n  0x6d, 0x3b, 0x6d, 0xba, 0xb6, 0xbd, 0xb6, 0x83, 0xb6, 0xa3, 0xb6, 0x93,\n  0xb6, 0xb3, 0xb6, 0x8b, 0xb6, 0xab, 0x36, 0x43, 0x9b, 0xa9, 0xcd, 0xd2,\n  0x66, 0x6b, 0xbb, 0x69, 0x1d, 0x9a, 0xa1, 0x99, 0x9a, 0xa5, 0xd9, 0x5a,\n  0x52, 0x73, 0xb4, 0x94, 0x96, 0xd6, 0x32, 0xda, 0xee, 0xda, 0x1e, 0xda,\n  0x9e, 0xda, 0x5e, 0xda, 0xde, 0xda, 0x3e, 0xda, 0xbe, 0x5a, 0x56, 0xcb,\n  0x69, 0x79, 0xad, 0xa0, 0xb9, 0x9a, 0xa7, 0xcd, 0xd1, 0xe6, 0x6a, 0xf3,\n  0xb4, 0xfd, 0xb4, 0xf9, 0xda, 0x02, 0x66, 0x1b, 0x66, 0x5b, 0xa6, 0x9d,\n  0x99, 0xc6, 0x6c, 0xc7, 0x4c, 0x67, 0xb6, 0x67, 0x76, 0xa0, 0xee, 0xa5,\n  0xee, 0xd3, 0xf6, 0x67, 0x76, 0xa2, 0x1e, 0xa0, 0x1e, 0xa4, 0x9e, 0x63,\n  0x76, 0x26, 0x7e, 0xe0, 0xfd, 0xd4, 0xf3, 0xd4, 0x89, 0xd4, 0x33, 0xd4,\n  0x69, 0xd4, 0x9d, 0xd4, 0x0b, 0xcc, 0x2e, 0xcc, 0xae, 0xd4, 0x13, 0xd4,\n  0x93, 0xcc, 0x0c, 0xea, 0x31, 0x6d, 0x21, 0xf5, 0x77, 0x66, 0x16, 0x33,\n  0x9b, 0xd9, 0x4d, 0x5b, 0xa4, 0x2d, 0xd6, 0x0e, 0xa0, 0xce, 0xd6, 0x96,\n  0x30, 0x36, 0x93, 0x64, 0x1c, 0x26, 0xc5, 0xa4, 0xb5, 0xa5, 0xda, 0x32,\n  0x6d, 0xb9, 0x76, 0xa0, 0x76, 0x10, 0xb3, 0x37, 0xb3, 0x0f, 0xb3, 0x2f,\n  0x93, 0x65, 0x72, 0x4c, 0x9e, 0x29, 0x30, 0x2e, 0xe3, 0x31, 0x73, 0x98,\n  0xb9, 0xcc, 0x3c, 0x66, 0x3f, 0x66, 0x3e, 0xb3, 0x80, 0xd9, 0x9f, 0x59,\n  0xc8, 0x2c, 0x62, 0x16, 0x33, 0x07, 0x30, 0x4b, 0x98, 0xa5, 0xcc, 0x32,\n  0x66, 0x39, 0x73, 0x20, 0x73, 0x10, 0xb3, 0x82, 0x59, 0xc9, 0x1c, 0xcc,\n  0x1c, 0xc2, 0x1c, 0xca, 0x1c, 0xc6, 0x1c, 0xce, 0x1c, 0xc1, 0xac, 0x62,\n  0x8a, 0x4c, 0x27, 0xd3, 0xc5, 0x74, 0x33, 0x25, 0x66, 0x35, 0xd3, 0xc3,\n  0xf4, 0x32, 0x65, 0x66, 0x0d, 0xb3, 0x96, 0xa9, 0x30, 0x7d, 0x4c, 0x95,\n  0xa9, 0x31, 0xfd, 0xcc, 0x91, 0xcc, 0x00, 0x53, 0x67, 0x1a, 0xcc, 0x20,\n  0xb3, 0x8e, 0x59, 0xcf, 0x1c, 0xc5, 0x6c, 0x60, 0x36, 0x32, 0xdf, 0x63,\n  0x8e, 0x66, 0x8e, 0x61, 0x8e, 0x65, 0x8e, 0x63, 0x8e, 0x67, 0x4e, 0x60,\n  0x4e, 0x64, 0x4e, 0x62, 0x4e, 0x66, 0x4e, 0x61, 0x4e, 0x65, 0x4e, 0x63,\n  0x4e, 0x67, 0xce, 0x60, 0xce, 0x64, 0xce, 0x62, 0xce, 0x66, 0xce, 0x61,\n  0xce, 0x65, 0xce, 0x63, 0xce, 0x67, 0x2e, 0x60, 0xbe, 0xcf, 0x5c, 0xc8,\n  0x5c, 0xc4, 0x5c, 0x4c, 0x3c, 0xd2, 0x4b, 0x99, 0xcb, 0x98, 0xcb, 0x99,\n  0x2b, 0x98, 0x2b, 0x99, 0xab, 0x98, 0xab, 0x99, 0x6b, 0x98, 0x6b, 0x99,\n  0xeb, 0x98, 0xeb, 0x99, 0x1b, 0x98, 0x1b, 0x99, 0x9b, 0x98, 0x9b, 0x99,\n  0x5b, 0x98, 0x5b, 0x99, 0xdb, 0x98, 0xdb, 0x99, 0x3b, 0x98, 0x3b, 0x99,\n  0x1f, 0x30, 0x77, 0x31, 0x77, 0x33, 0xf7, 0x30, 0x43, 0xcc, 0x26, 0xe6,\n  0x5e, 0xe6, 0x3e, 0xe6, 0x87, 0xcc, 0xfd, 0xcc, 0x03, 0xcc, 0x83, 0xcc,\n  0x43, 0xcc, 0xc3, 0xcc, 0x23, 0xcc, 0xa3, 0xcc, 0x63, 0xcc, 0xe3, 0xcc,\n  0x13, 0xcc, 0x93, 0xcc, 0x53, 0xcc, 0xd3, 0xcc, 0x33, 0xcc, 0xb3, 0xcc,\n  0x73, 0xcc, 0xf3, 0xcc, 0x0b, 0xcc, 0x8b, 0xcc, 0x4b, 0xcc, 0x8f, 0x98,\n  0x97, 0x99, 0x57, 0x98, 0x57, 0x99, 0xd7, 0x98, 0xd7, 0x99, 0x37, 0x98,\n  0x37, 0x99, 0xb7, 0x98, 0xb7, 0x99, 0x77, 0x98, 0x1f, 0x33, 0xef, 0x32,\n  0x3f, 0x61, 0x7e, 0xca, 0xfc, 0x8c, 0xf9, 0x39, 0xf3, 0x1e, 0xf3, 0x3e,\n  0xf3, 0x01, 0xf3, 0x0b, 0xe6, 0x97, 0xcc, 0xaf, 0x98, 0x0f, 0x99, 0x8f,\n  0x98, 0x8f, 0x99, 0x4f, 0x98, 0x5f, 0x33, 0xbf, 0x61, 0x7e, 0xcb, 0xfc,\n  0x8e, 0xf9, 0x94, 0xf9, 0x3d, 0xf3, 0x07, 0xe6, 0x33, 0xe6, 0x73, 0xe6,\n  0x0b, 0xe6, 0x4b, 0xe6, 0x8f, 0xcc, 0x57, 0xcc, 0x9f, 0x98, 0x3f, 0x33,\n  0x7f, 0x61, 0xfe, 0xca, 0xfc, 0x8d, 0xf9, 0x9a, 0xf9, 0x3b, 0xf3, 0x0d,\n  0xf3, 0x0f, 0xe6, 0x9f, 0xcc, 0xbf, 0x98, 0x7f, 0x33, 0xdf, 0x32, 0xff,\n  0x61, 0xbe, 0x23, 0x4a, 0x9d, 0x66, 0x19, 0x96, 0x65, 0x39, 0x96, 0x67,\n  0x05, 0x56, 0x64, 0x25, 0x56, 0x66, 0x13, 0xac, 0xc2, 0xaa, 0xac, 0xc6,\n  0xea, 0x6c, 0x1b, 0x3b, 0x86, 0x1d, 0xcb, 0x8e, 0x63, 0xc7, 0xb3, 0x13,\n  0xd8, 0x89, 0xec, 0x24, 0x76, 0x0b, 0x76, 0x32, 0x3b, 0x85, 0xdd, 0x92,\n  0x9d, 0xca, 0x6e, 0xc5, 0x6e, 0xcd, 0x6e, 0xc3, 0x6e, 0xcb, 0xb6, 0xb3,\n  0xd3, 0xd8, 0xed, 0xd8, 0xe9, 0xec, 0xf6, 0xec, 0x0e, 0xec, 0x8e, 0xec,\n  0x4e, 0xec, 0xce, 0xec, 0x2e, 0xec, 0xae, 0xec, 0x0c, 0x76, 0x26, 0x3b,\n  0x8b, 0x9d, 0xcd, 0xee, 0xc6, 0x76, 0xb0, 0x06, 0x6b, 0xb2, 0x16, 0x6b,\n  0xb3, 0x49, 0xd6, 0x61, 0x53, 0x6c, 0x9a, 0xcd, 0xb0, 0xbb, 0xb3, 0x7b,\n  0xb0, 0x7b, 0xb2, 0x7b, 0xb1, 0x7b, 0xb3, 0xfb, 0xb0, 0xfb, 0xb2, 0x59,\n  0x36, 0xc7, 0xe6, 0xd9, 0x02, 0xeb, 0xb2, 0x1e, 0x3b, 0x87, 0x9d, 0xcb,\n  0xce, 0x63, 0xf7, 0x63, 0xe7, 0xb3, 0x0b, 0xd8, 0xfd, 0xd9, 0x85, 0xec,\n  0x22, 0x76, 0x31, 0x7b, 0x00, 0xbb, 0x84, 0x5d, 0xca, 0x2e, 0x63, 0x97,\n  0xb3, 0x07, 0xb2, 0x07, 0xb1, 0x2b, 0xd8, 0x95, 0xec, 0xc1, 0xec, 0x21,\n  0xec, 0xa1, 0xec, 0x61, 0xec, 0xe1, 0xec, 0x11, 0xec, 0x2a, 0xb6, 0xc8,\n  0x76, 0xb2, 0x5d, 0x6c, 0xb7, 0xb6, 0x42, 0x5b, 0xc9, 0xf6, 0xb0, 0xbd,\n  0x6c, 0x99, 0x5d, 0xc3, 0xae, 0x65, 0x2b, 0x6c, 0x1f, 0x5b, 0x65, 0x6b,\n  0x6c, 0x3f, 0x7b, 0x24, 0x3b, 0xc0, 0xd6, 0xd9, 0x06, 0x3b, 0xc8, 0xae,\n  0x63, 0xd7, 0xb3, 0x47, 0xb1, 0x1b, 0xd8, 0x8d, 0xec, 0xf7, 0xd8, 0xa3,\n  0xd9, 0x63, 0xd8, 0x63, 0xd9, 0xe3, 0xd8, 0xe3, 0xd9, 0x13, 0xd8, 0x13,\n  0xd9, 0x93, 0xd8, 0x93, 0xd9, 0x53, 0xd8, 0x53, 0xd9, 0xd3, 0xd8, 0xd3,\n  0xd9, 0x33, 0xd8, 0x33, 0xd9, 0xb3, 0xd8, 0xb3, 0xd9, 0x73, 0xd8, 0x73,\n  0xd9, 0xf3, 0xd8, 0xf3, 0xd9, 0x0b, 0xd8, 0xef, 0xb3, 0x17, 0xb2, 0x17,\n  0xb1, 0x17, 0xb3, 0x97, 0xb0, 0x97, 0xb2, 0x97, 0xb1, 0x97, 0xb3, 0x57,\n  0xb0, 0x57, 0xb2, 0x57, 0xb1, 0x57, 0xb3, 0xd7, 0xb0, 0xd7, 0xb2, 0xd7,\n  0xb1, 0xd7, 0xb3, 0x37, 0xb0, 0x37, 0xb2, 0x37, 0xb1, 0x37, 0xb3, 0xb7,\n  0xb0, 0xb7, 0xb2, 0xb7, 0xb1, 0xb7, 0xb3, 0x77, 0xb0, 0x77, 0xb2, 0x3f,\n  0x60, 0xef, 0x62, 0xef, 0x66, 0xef, 0x61, 0x87, 0xd8, 0x4d, 0xec, 0xbd,\n  0xec, 0x7d, 0xec, 0x0f, 0xd9, 0xfb, 0xd9, 0x07, 0xd8, 0x07, 0xd9, 0x87,\n  0xd8, 0x87, 0xd9, 0x47, 0xd8, 0x47, 0xd9, 0xc7, 0xd8, 0xc7, 0xd9, 0x27,\n  0xd8, 0x27, 0xd9, 0xa7, 0xd8, 0xa7, 0xd9, 0x67, 0xd8, 0x67, 0xd9, 0xe7,\n  0xd8, 0xe7, 0xd9, 0x17, 0xd8, 0x17, 0xd9, 0x97, 0xd8, 0x1f, 0xb1, 0x2f,\n  0xb3, 0xaf, 0xb0, 0xaf, 0xb2, 0xaf, 0xb1, 0xaf, 0xb3, 0x6f, 0xb0, 0x6f,\n  0xb2, 0x6f, 0xb1, 0x6f, 0xb3, 0xef, 0xb0, 0x3f, 0x66, 0xdf, 0x65, 0x7f,\n  0xc2, 0xfe, 0x94, 0xfd, 0x19, 0xfb, 0x73, 0xf6, 0x3d, 0xf6, 0x7d, 0xf6,\n  0x03, 0xf6, 0x17, 0xec, 0x2f, 0xd9, 0x5f, 0xb1, 0x1f, 0xb2, 0x1f, 0xb1,\n  0x1f, 0xb3, 0x9f, 0xb0, 0xbf, 0x66, 0x7f, 0xc3, 0xfe, 0x96, 0xfd, 0x1d,\n  0xfb, 0x29, 0xfb, 0x7b, 0xf6, 0x0f, 0xec, 0x67, 0xec, 0xe7, 0xec, 0x17,\n  0xec, 0x97, 0xec, 0x1f, 0xd9, 0xaf, 0xd8, 0x3f, 0xb1, 0x7f, 0x66, 0xff,\n  0xc2, 0xfe, 0x95, 0xfd, 0x1b, 0xfb, 0x35, 0xfb, 0x77, 0xf6, 0x1b, 0xf6,\n  0x1f, 0xec, 0x3f, 0xd9, 0x7f, 0xb1, 0xff, 0x66, 0xbf, 0x65, 0xff, 0xc3,\n  0x7e, 0xc7, 0x51, 0x1c, 0xcd, 0x31, 0x1c, 0xcb, 0x71, 0x1c, 0xcf, 0x09,\n  0x9c, 0xc8, 0x49, 0x9c, 0xcc, 0x25, 0x38, 0x85, 0x53, 0x39, 0x8d, 0xd3,\n  0xb9, 0x36, 0x6e, 0x0c, 0x37, 0x96, 0x1b, 0xc7, 0x8d, 0xe7, 0x26, 0x70,\n  0x13, 0xb9, 0x49, 0xdc, 0x16, 0xdc, 0x64, 0x6e, 0x0a, 0xb7, 0x25, 0x37,\n  0x95, 0xdb, 0x8a, 0xdb, 0x9a, 0xdb, 0x86, 0xdb, 0x96, 0x6b, 0xe7, 0xa6,\n  0x71, 0xdb, 0x71, 0xd3, 0xb9, 0xed, 0xb9, 0x1d, 0xb8, 0x1d, 0xb9, 0x9d,\n  0xb8, 0x9d, 0xb9, 0x5d, 0xb8, 0x5d, 0xb9, 0x19, 0xdc, 0x4c, 0x6e, 0x16,\n  0x37, 0x9b, 0xdb, 0x8d, 0xeb, 0xe0, 0x0c, 0xce, 0xe4, 0x2c, 0xce, 0xe6,\n  0x92, 0x9c, 0xc3, 0xa5, 0xb8, 0x34, 0x97, 0xe1, 0x76, 0xe7, 0xf6, 0xe0,\n  0xf6, 0xe4, 0xf6, 0xe2, 0xf6, 0xe6, 0xf6, 0xe1, 0xf6, 0xe5, 0xb2, 0x5c,\n  0x8e, 0xcb, 0x73, 0x05, 0xce, 0xe5, 0x3c, 0x6e, 0x0e, 0x37, 0x97, 0x9b,\n  0xc7, 0xed, 0xc7, 0xcd, 0xe7, 0x16, 0x70, 0xfb, 0x6b, 0x07, 0x73, 0x8b,\n  0xb8, 0xc5, 0xda, 0x21, 0xdc, 0x12, 0x6e, 0x29, 0xb7, 0x8c, 0x5b, 0xce,\n  0x1d, 0xa8, 0x1d, 0xaa, 0x1d, 0xa6, 0x1d, 0xce, 0x1d, 0xcc, 0x1d, 0xc2,\n  0x1d, 0xca, 0x1d, 0xc6, 0x1d, 0xce, 0x1d, 0xc1, 0xad, 0xe2, 0x8a, 0x5c,\n  0x27, 0xd7, 0xc5, 0x75, 0x6b, 0x47, 0x70, 0xab, 0xb9, 0x1e, 0xae, 0x57,\n  0x5b, 0xc5, 0xad, 0xe1, 0xd6, 0x6a, 0x45, 0xae, 0x8f, 0xab, 0x72, 0x35,\n  0xad, 0x93, 0x3b, 0x52, 0xeb, 0xe2, 0xea, 0x5c, 0x83, 0x1b, 0xe4, 0xd6,\n  0x71, 0xeb, 0xb9, 0xa3, 0xb8, 0x0d, 0xdc, 0x46, 0xee, 0x7b, 0xdc, 0xd1,\n  0xdc, 0x31, 0xdc, 0xb1, 0xdc, 0x71, 0xdc, 0xf1, 0xdc, 0x09, 0xdc, 0x89,\n  0xdc, 0x49, 0xdc, 0xc9, 0xdc, 0x29, 0xdc, 0xa9, 0xdc, 0x69, 0xdc, 0xe9,\n  0xdc, 0x19, 0xdc, 0x99, 0xdc, 0x59, 0xdc, 0xd9, 0xdc, 0x39, 0xdc, 0xb9,\n  0xdc, 0x79, 0xdc, 0xf9, 0xdc, 0x05, 0xdc, 0xf7, 0xb9, 0x0b, 0xb9, 0x8b,\n  0xb8, 0x8b, 0xb9, 0x4b, 0xb8, 0x4b, 0xb9, 0xcb, 0xb8, 0xcb, 0xb9, 0x2b,\n  0xb8, 0x2b, 0xb9, 0xab, 0xb8, 0xab, 0xb9, 0x6b, 0xb8, 0x6b, 0xb9, 0xeb,\n  0xb8, 0xeb, 0xb9, 0x1b, 0xb8, 0x1b, 0xb9, 0x9b, 0xb8, 0x9b, 0xb9, 0x5b,\n  0xb8, 0x5b, 0xb9, 0xdb, 0xb8, 0xdb, 0xb9, 0x3b, 0xb8, 0x3b, 0xb9, 0x1f,\n  0x70, 0x77, 0x71, 0x77, 0x73, 0xf7, 0x70, 0x43, 0xdc, 0x26, 0xee, 0x5e,\n  0xee, 0x3e, 0xee, 0x87, 0xdc, 0xfd, 0xdc, 0x03, 0xdc, 0x83, 0xdc, 0x43,\n  0xdc, 0xc3, 0xdc, 0x23, 0xdc, 0xa3, 0xdc, 0x63, 0xdc, 0xe3, 0xdc, 0x13,\n  0xdc, 0x93, 0xdc, 0x53, 0xdc, 0xd3, 0xdc, 0x33, 0xdc, 0xb3, 0xdc, 0x73,\n  0xdc, 0xf3, 0xdc, 0x0b, 0xdc, 0x8b, 0xdc, 0x4b, 0xdc, 0x8f, 0xb8, 0x97,\n  0xb9, 0x57, 0xb8, 0x57, 0xb9, 0xd7, 0xb8, 0xd7, 0xb9, 0x37, 0xb8, 0x37,\n  0xb5, 0x6e, 0xee, 0x6d, 0xee, 0x1d, 0xee, 0xc7, 0xdc, 0xbb, 0xdc, 0x4f,\n  0xb8, 0x9f, 0x72, 0x3f, 0xe3, 0x7e, 0xce, 0xbd, 0xc7, 0xbd, 0xcf, 0x7d,\n  0xc0, 0xfd, 0x82, 0xfb, 0x25, 0xf7, 0x2b, 0xee, 0x43, 0xee, 0x23, 0xee,\n  0x63, 0xee, 0x13, 0xee, 0xd7, 0xdc, 0x6f, 0xb8, 0xdf, 0x72, 0xbf, 0xe3,\n  0x3e, 0xe5, 0x7e, 0xcf, 0xfd, 0x81, 0xfb, 0x8c, 0xfb, 0x9c, 0xfb, 0x82,\n  0xfb, 0x92, 0xfb, 0x23, 0xf7, 0x15, 0xf7, 0x27, 0xee, 0xcf, 0xdc, 0x5f,\n  0xb8, 0xbf, 0x72, 0x7f, 0xe3, 0xbe, 0xe6, 0xfe, 0xce, 0x7d, 0xc3, 0xfd,\n  0x83, 0xfb, 0x27, 0xf7, 0x2f, 0xee, 0xdf, 0xdc, 0xb7, 0xdc, 0x7f, 0xb8,\n  0xef, 0x78, 0x8a, 0xa7, 0x79, 0x86, 0x67, 0x79, 0x8e, 0xe7, 0x79, 0x81,\n  0x17, 0x79, 0x89, 0x97, 0xf9, 0x04, 0xaf, 0xf0, 0x2a, 0xaf, 0xf1, 0x3a,\n  0xdf, 0xc6, 0x8f, 0xe1, 0xc7, 0xf2, 0xe3, 0xf8, 0xf1, 0xfc, 0x04, 0x7e,\n  0x22, 0x3f, 0x89, 0xdf, 0x82, 0x9f, 0xcc, 0x4f, 0xe1, 0xb7, 0xe4, 0xa7,\n  0xf2, 0x5b, 0xf1, 0x5b, 0xf3, 0xdb, 0xf0, 0xdb, 0xf2, 0xed, 0xfc, 0x34,\n  0x7e, 0x3b, 0x7e, 0x3a, 0xbf, 0x3d, 0xbf, 0x03, 0xbf, 0x23, 0xbf, 0x13,\n  0xbf, 0x33, 0xbf, 0x0b, 0xbf, 0x2b, 0x3f, 0x83, 0x9f, 0xc9, 0xcf, 0xe2,\n  0x67, 0xf3, 0xbb, 0xf1, 0x1d, 0xbc, 0xc1, 0x9b, 0xbc, 0xc5, 0xdb, 0x7c,\n  0x92, 0x77, 0xf8, 0x14, 0x9f, 0xe6, 0x33, 0xfc, 0xee, 0xfc, 0x1e, 0xfc,\n  0x9e, 0xfc, 0x5e, 0xfc, 0xde, 0xfc, 0x3e, 0xfc, 0xbe, 0x7c, 0x96, 0xcf,\n  0xf1, 0x79, 0xbe, 0xc0, 0xbb, 0xbc, 0xc7, 0xcf, 0xe1, 0xe7, 0xf2, 0xf3,\n  0xf8, 0xfd, 0xf8, 0xf9, 0xfc, 0x02, 0x7e, 0x7f, 0x7e, 0x21, 0xbf, 0x88,\n  0x5f, 0xcc, 0x1f, 0xc0, 0x2f, 0xe1, 0x97, 0xf2, 0xcb, 0xf8, 0xe5, 0xfc,\n  0x81, 0xfc, 0x41, 0xfc, 0x0a, 0x7e, 0x25, 0x7f, 0x30, 0x7f, 0x08, 0x7f,\n  0x28, 0x7f, 0x18, 0x7f, 0x38, 0x7f, 0x04, 0xbf, 0x8a, 0x2f, 0xf2, 0x9d,\n  0x7c, 0x17, 0xdf, 0xcd, 0x97, 0xf8, 0xd5, 0x7c, 0x0f, 0xdf, 0xcb, 0x97,\n  0xf9, 0x35, 0xfc, 0x5a, 0xbe, 0xc2, 0xf7, 0xf1, 0x55, 0xbe, 0xc6, 0xf7,\n  0xf3, 0x47, 0xf2, 0x03, 0x7c, 0x9d, 0x6f, 0xf0, 0x83, 0xfc, 0x3a, 0x7e,\n  0x3d, 0x7f, 0x14, 0xbf, 0x81, 0xdf, 0xc8, 0x7f, 0x8f, 0x3f, 0x9a, 0x3f,\n  0x86, 0x3f, 0x96, 0x3f, 0x8e, 0x3f, 0x9e, 0x3f, 0x81, 0x3f, 0x91, 0x3f,\n  0x89, 0x3f, 0x99, 0x3f, 0x85, 0x3f, 0x95, 0x3f, 0x8d, 0x3f, 0x9d, 0x3f,\n  0x83, 0x3f, 0x93, 0x3f, 0x8b, 0x3f, 0x9b, 0x3f, 0x87, 0x3f, 0x97, 0x3f,\n  0x8f, 0x3f, 0x9f, 0xbf, 0x80, 0xff, 0x3e, 0x7f, 0x21, 0x7f, 0x11, 0x7f,\n  0x31, 0x7f, 0x09, 0x7f, 0x29, 0x7f, 0x19, 0x7f, 0x39, 0x7f, 0x05, 0x7f,\n  0x25, 0x7f, 0x15, 0x7f, 0x35, 0x7f, 0x0d, 0x7f, 0x2d, 0x7f, 0x1d, 0x7f,\n  0x3d, 0x7f, 0x03, 0x7f, 0x23, 0x7f, 0x13, 0x7f, 0x33, 0x7f, 0x0b, 0x7f,\n  0x2b, 0x7f, 0x1b, 0x7f, 0x3b, 0x7f, 0x07, 0x7f, 0x27, 0xff, 0x03, 0xfe,\n  0x2e, 0xfe, 0x6e, 0xfe, 0x1e, 0x7e, 0x88, 0xdf, 0xc4, 0xdf, 0xcb, 0xdf,\n  0xc7, 0xff, 0x90, 0xbf, 0x9f, 0x7f, 0x80, 0x7f, 0x90, 0x7f, 0x88, 0x7f,\n  0x98, 0x7f, 0x84, 0x7f, 0x94, 0x7f, 0x8c, 0x7f, 0x9c, 0x7f, 0x82, 0x7f,\n  0x92, 0x7f, 0x8a, 0x7f, 0x9a, 0x7f, 0x86, 0x7f, 0x96, 0x7f, 0x8e, 0x7f,\n  0x9e, 0x7f, 0x81, 0x7f, 0x91, 0x7f, 0x89, 0xff, 0x11, 0xff, 0x32, 0xff,\n  0x0a, 0xff, 0x2a, 0xff, 0x1a, 0xff, 0x3a, 0xff, 0x06, 0xff, 0x26, 0xff,\n  0x16, 0xff, 0x36, 0xff, 0x0e, 0xff, 0x63, 0xfe, 0x5d, 0xfe, 0x27, 0xfc,\n  0x4f, 0xf9, 0x9f, 0xf1, 0x3f, 0xe7, 0xdf, 0xe3, 0xdf, 0xe7, 0x3f, 0xe0,\n  0x7f, 0xc1, 0xff, 0x92, 0xff, 0x15, 0xff, 0x21, 0xff, 0x11, 0xff, 0x31,\n  0xff, 0x09, 0xff, 0x6b, 0xfe, 0x37, 0xfc, 0x6f, 0xf9, 0xdf, 0xf1, 0x9f,\n  0xf2, 0xbf, 0xe7, 0xff, 0xc0, 0x7f, 0xc6, 0x7f, 0xce, 0x7f, 0xc1, 0x7f,\n  0xc9, 0xff, 0x91, 0xff, 0x8a, 0xff, 0x13, 0xff, 0x67, 0xfe, 0x2f, 0xfc,\n  0x5f, 0xf9, 0xbf, 0xf1, 0x5f, 0xf3, 0x7f, 0xe7, 0xbf, 0xe1, 0xff, 0xc1,\n  0xff, 0x93, 0xff, 0x17, 0xff, 0x6f, 0xfe, 0x5b, 0xfe, 0x3f, 0xfc, 0x77,\n  0x02, 0x25, 0xd0, 0x02, 0x23, 0xb0, 0x02, 0x27, 0xf0, 0x82, 0x20, 0x88,\n  0x82, 0x24, 0xc8, 0x42, 0x42, 0x50, 0x04, 0x55, 0xd0, 0x04, 0x5d, 0x68,\n  0x13, 0xc6, 0x08, 0x63, 0x85, 0x71, 0xc2, 0x78, 0x61, 0x82, 0x30, 0x51,\n  0x98, 0x24, 0x6c, 0x21, 0x4c, 0x16, 0xa6, 0x08, 0x5b, 0x0a, 0x53, 0x85,\n  0xad, 0x84, 0xad, 0x85, 0x6d, 0x84, 0x6d, 0x85, 0x76, 0x61, 0x9a, 0xb0,\n  0x9d, 0x30, 0x5d, 0xd8, 0x5e, 0xd8, 0x41, 0xd8, 0x51, 0xd8, 0x49, 0xd8,\n  0x59, 0xd8, 0x45, 0xd8, 0x55, 0x98, 0x21, 0xcc, 0x14, 0x66, 0x09, 0xb3,\n  0x85, 0xdd, 0x84, 0x0e, 0xc1, 0x10, 0x4c, 0xc1, 0x12, 0x6c, 0x21, 0x29,\n  0x38, 0x42, 0x4a, 0x48, 0x0b, 0x19, 0x61, 0x77, 0x61, 0x0f, 0x61, 0x4f,\n  0x61, 0x2f, 0x61, 0x6f, 0x61, 0x1f, 0x61, 0x5f, 0x21, 0x2b, 0xe4, 0x84,\n  0xbc, 0x50, 0x10, 0x5c, 0xc1, 0x13, 0xe6, 0x08, 0x73, 0x85, 0x79, 0xc2,\n  0x7e, 0xc2, 0x7c, 0x61, 0x81, 0xb0, 0xbf, 0xb0, 0x50, 0x58, 0x24, 0x2c,\n  0x16, 0x0e, 0x10, 0x96, 0x08, 0x4b, 0x85, 0x65, 0xc2, 0x72, 0xe1, 0x40,\n  0xe1, 0x20, 0x61, 0x85, 0xb0, 0x52, 0x38, 0x58, 0x38, 0x44, 0x38, 0x54,\n  0x38, 0x4c, 0x38, 0x5c, 0x38, 0x42, 0x58, 0x25, 0x14, 0x85, 0x4e, 0xa1,\n  0x4b, 0xe8, 0x16, 0x4a, 0xc2, 0x6a, 0xa1, 0x47, 0xe8, 0x15, 0xca, 0xc2,\n  0x1a, 0x61, 0xad, 0x50, 0x11, 0xfa, 0x84, 0xaa, 0x50, 0x13, 0xfa, 0x85,\n  0x23, 0x85, 0x01, 0xa1, 0x2e, 0x34, 0x84, 0x41, 0x61, 0x9d, 0xb0, 0x5e,\n  0x38, 0x4a, 0xd8, 0x20, 0x6c, 0x14, 0xbe, 0x27, 0x1c, 0x2d, 0x1c, 0x23,\n  0x1c, 0x2b, 0x1c, 0x27, 0x1c, 0x2f, 0x9c, 0x20, 0x9c, 0x28, 0x9c, 0x24,\n  0x9c, 0x2c, 0x9c, 0x22, 0x9c, 0x2a, 0x9c, 0x26, 0x9c, 0x2e, 0x9c, 0x21,\n  0x9c, 0x29, 0x9c, 0x25, 0x9c, 0x2d, 0x9c, 0x23, 0x9c, 0x2b, 0x9c, 0x27,\n  0x9c, 0x2f, 0x5c, 0x20, 0x7c, 0x5f, 0xb8, 0x50, 0xb8, 0x48, 0xb8, 0x58,\n  0xb8, 0x44, 0xb8, 0x54, 0xb8, 0x4c, 0xb8, 0x5c, 0xb8, 0x42, 0xb8, 0x52,\n  0xb8, 0x4a, 0xb8, 0x5a, 0xb8, 0x46, 0xb8, 0x56, 0xb8, 0x4e, 0xb8, 0x5e,\n  0xb8, 0x41, 0xb8, 0x51, 0xb8, 0x49, 0xb8, 0x59, 0xb8, 0x45, 0xb8, 0x55,\n  0xb8, 0x4d, 0xb8, 0x5d, 0xb8, 0x43, 0xb8, 0x53, 0xf8, 0x81, 0x70, 0x97,\n  0x70, 0xb7, 0x70, 0x8f, 0x30, 0x24, 0x6c, 0x12, 0xee, 0x15, 0xee, 0x13,\n  0x7e, 0x28, 0xdc, 0x2f, 0x3c, 0x20, 0x3c, 0x28, 0x3c, 0x24, 0x3c, 0x2c,\n  0x3c, 0x22, 0x3c, 0x2a, 0x3c, 0x26, 0x3c, 0x2e, 0x3c, 0x21, 0x3c, 0x29,\n  0x3c, 0x25, 0x3c, 0x2d, 0x3c, 0x23, 0x3c, 0x2b, 0x3c, 0x27, 0x3c, 0x2f,\n  0xbc, 0x20, 0xbc, 0x28, 0xbc, 0x24, 0xfc, 0x48, 0x78, 0x59, 0x78, 0x45,\n  0x78, 0x55, 0x78, 0x4d, 0x78, 0x5d, 0x78, 0x43, 0x78, 0x53, 0x78, 0x4b,\n  0x78, 0x5b, 0x78, 0x47, 0xf8, 0xb1, 0xf0, 0xae, 0xf0, 0x13, 0xe1, 0xa7,\n  0xc2, 0xcf, 0x84, 0x9f, 0x0b, 0xef, 0x09, 0xef, 0x0b, 0x1f, 0x08, 0xbf,\n  0x10, 0x7e, 0x29, 0xfc, 0x4a, 0xf8, 0x50, 0xf8, 0x48, 0xf8, 0x58, 0xf8,\n  0x44, 0xf8, 0xb5, 0xf0, 0x1b, 0xe1, 0xb7, 0xc2, 0xef, 0x84, 0x4f, 0x85,\n  0xdf, 0x0b, 0x7f, 0x10, 0x3e, 0x13, 0x3e, 0x17, 0xbe, 0x10, 0xbe, 0x14,\n  0xfe, 0x28, 0x7c, 0x25, 0xfc, 0x49, 0xf8, 0xb3, 0xf0, 0x17, 0xe1, 0xaf,\n  0xc2, 0xdf, 0x84, 0xaf, 0x85, 0xbf, 0x0b, 0xdf, 0x08, 0xff, 0x10, 0xfe,\n  0x29, 0xfc, 0x4b, 0xf8, 0xb7, 0xf0, 0xad, 0xf0, 0x1f, 0xe1, 0x3b, 0x91,\n  0x12, 0x69, 0x91, 0x11, 0x59, 0x91, 0x13, 0x79, 0x51, 0x10, 0x45, 0x51,\n  0x12, 0x65, 0x31, 0x21, 0x2a, 0xa2, 0x2a, 0x6a, 0xa2, 0x2e, 0xb6, 0x89,\n  0x63, 0xc4, 0xb1, 0xe2, 0x38, 0x71, 0xbc, 0x38, 0x41, 0x9c, 0x28, 0x4e,\n  0x12, 0xb7, 0x10, 0x27, 0x8b, 0x53, 0xc4, 0x2d, 0xc5, 0xa9, 0xe2, 0x56,\n  0xe2, 0xd6, 0xe2, 0x36, 0xe2, 0xb6, 0x62, 0xbb, 0x38, 0x4d, 0xdc, 0x4e,\n  0x9c, 0x2e, 0x6e, 0x2f, 0xee, 0x20, 0xee, 0x28, 0xee, 0x24, 0xee, 0x2c,\n  0xee, 0x22, 0xee, 0x2a, 0xce, 0x10, 0x67, 0x8a, 0xb3, 0xc4, 0xd9, 0xe2,\n  0x6e, 0x62, 0x87, 0x68, 0x88, 0xa6, 0x68, 0x89, 0xb6, 0x98, 0x14, 0x1d,\n  0x31, 0x25, 0xa6, 0xc5, 0x8c, 0xb8, 0xbb, 0xb8, 0x87, 0xb8, 0xa7, 0xb8,\n  0x97, 0xb8, 0xb7, 0xb8, 0x8f, 0xb8, 0xaf, 0x98, 0xd5, 0x4a, 0xda, 0x6a,\n  0xad, 0x47, 0x74, 0x45, 0x4f, 0x9c, 0x23, 0xce, 0x15, 0xe7, 0x89, 0xfb,\n  0x89, 0xf3, 0xc5, 0x05, 0xe2, 0xfe, 0xe2, 0x42, 0x71, 0x91, 0xb8, 0x58,\n  0x3c, 0x40, 0x5c, 0x22, 0x2e, 0x15, 0x97, 0x89, 0xcb, 0xc5, 0x03, 0xc5,\n  0x83, 0xc4, 0x15, 0xe2, 0x4a, 0xf1, 0x60, 0xf1, 0x10, 0xf1, 0x50, 0xf1,\n  0x30, 0xf1, 0x70, 0xad, 0x57, 0x2b, 0x8b, 0x45, 0xb1, 0x53, 0xec, 0x12,\n  0xbb, 0xc5, 0x92, 0xb8, 0x5a, 0xec, 0x11, 0x7b, 0xc5, 0xb2, 0xb8, 0x46,\n  0x5c, 0x2b, 0x56, 0xc4, 0x3e, 0xb1, 0x2a, 0xd6, 0xc4, 0x7e, 0xf1, 0x48,\n  0x71, 0x40, 0xac, 0x8b, 0x0d, 0x71, 0x50, 0x5c, 0x27, 0xae, 0x17, 0x8f,\n  0x12, 0x37, 0x88, 0x1b, 0xc5, 0xef, 0x89, 0x47, 0x8b, 0xc7, 0x88, 0xc7,\n  0x8a, 0xc7, 0x89, 0xc7, 0x8b, 0x27, 0x88, 0x27, 0x8a, 0x27, 0x89, 0x27,\n  0x8b, 0xa7, 0x88, 0xa7, 0x8a, 0xa7, 0x89, 0xa7, 0x8b, 0x67, 0x88, 0x67,\n  0x8a, 0x67, 0x89, 0x67, 0x8b, 0xe7, 0x88, 0xe7, 0x8a, 0xe7, 0x89, 0xe7,\n  0x8b, 0x17, 0x88, 0xdf, 0x17, 0x2f, 0x14, 0x2f, 0x12, 0x2f, 0x16, 0x2f,\n  0x11, 0x2f, 0x15, 0x2f, 0x13, 0x2f, 0x17, 0xaf, 0x10, 0xaf, 0x14, 0xaf,\n  0x12, 0xaf, 0x16, 0xaf, 0x11, 0xaf, 0x15, 0xaf, 0x13, 0xaf, 0x17, 0x6f,\n  0x10, 0x6f, 0x14, 0x6f, 0x12, 0x6f, 0x16, 0x6f, 0x11, 0x6f, 0x15, 0x6f,\n  0x13, 0x6f, 0x17, 0xef, 0x10, 0xef, 0x14, 0x7f, 0x20, 0xde, 0x25, 0xde,\n  0x2d, 0xde, 0x23, 0x0e, 0x89, 0x9b, 0xc4, 0x7b, 0xc5, 0xfb, 0xc4, 0x1f,\n  0x8a, 0xf7, 0x8b, 0x0f, 0x88, 0x0f, 0x8a, 0x0f, 0x89, 0x0f, 0x8b, 0x8f,\n  0x88, 0x8f, 0x8a, 0x8f, 0x89, 0x8f, 0x8b, 0x4f, 0x88, 0x4f, 0x8a, 0x4f,\n  0x89, 0x4f, 0x53, 0x4f, 0x51, 0x4f, 0x8b, 0xcf, 0x88, 0xcf, 0x6a, 0x6b,\n  0xb4, 0xb5, 0x5a, 0x45, 0x7c, 0x51, 0xeb, 0xd3, 0xaa, 0xe2, 0xcb, 0xe2,\n  0x2b, 0xe2, 0xab, 0xe2, 0x6b, 0xe2, 0xeb, 0xe2, 0x1b, 0xe2, 0x9b, 0xe2,\n  0x5b, 0xe2, 0xdb, 0xe2, 0x3b, 0xe2, 0x8f, 0xc5, 0x77, 0xc5, 0x9f, 0x88,\n  0x3f, 0x15, 0x7f, 0x26, 0xfe, 0x5c, 0x7c, 0x4f, 0x7c, 0x5f, 0xfc, 0x40,\n  0xfc, 0x85, 0xf8, 0x4b, 0xf1, 0x57, 0xe2, 0x87, 0xe2, 0x47, 0xe2, 0xc7,\n  0xe2, 0x27, 0xe2, 0xaf, 0xc5, 0xdf, 0x88, 0xbf, 0x15, 0x7f, 0x27, 0x7e,\n  0x2a, 0xfe, 0x5e, 0xfc, 0x83, 0xf8, 0x99, 0xf8, 0xb9, 0xf8, 0x85, 0xf8,\n  0xa5, 0xf8, 0x47, 0xf1, 0x2b, 0xf1, 0x4f, 0xe2, 0x9f, 0xc5, 0xbf, 0x88,\n  0x7f, 0x15, 0xff, 0x26, 0x7e, 0x2d, 0xfe, 0x5d, 0xfc, 0x46, 0xfc, 0x87,\n  0xf8, 0x4f, 0xf1, 0x5f, 0xe2, 0xbf, 0xc5, 0x6f, 0xc5, 0xff, 0x88, 0xdf,\n  0x49, 0x94, 0x44, 0x4b, 0x8c, 0xc4, 0x4a, 0x9c, 0xc4, 0x4b, 0x82, 0x24,\n  0x4a, 0x92, 0x24, 0x4b, 0x09, 0x49, 0xd1, 0x6a, 0x5a, 0xbf, 0xa4, 0x4b,\n  0x6d, 0xd2, 0x18, 0x69, 0xac, 0x34, 0x4e, 0x1a, 0x2f, 0x4d, 0x90, 0x26,\n  0x4a, 0x93, 0xa4, 0x2d, 0xa4, 0xc9, 0xd2, 0x14, 0x69, 0x4b, 0x69, 0xaa,\n  0xb4, 0x95, 0xb4, 0xb5, 0xb4, 0x8d, 0xb4, 0xad, 0xd4, 0x2e, 0x4d, 0x93,\n  0xb6, 0x93, 0xa6, 0x4b, 0xdb, 0x4b, 0x3b, 0x48, 0x3b, 0x4a, 0x3b, 0x49,\n  0x3b, 0x4b, 0xbb, 0x48, 0xbb, 0x6a, 0x47, 0x6a, 0x03, 0x5a, 0x5d, 0x6b,\n  0x68, 0x83, 0xd4, 0x4f, 0xb5, 0x75, 0xda, 0x7a, 0xc9, 0xd2, 0x8e, 0xd2,\n  0x36, 0x68, 0x1b, 0xa5, 0x94, 0x94, 0xd6, 0xbe, 0x27, 0xed, 0x2e, 0xed,\n  0x21, 0xed, 0x29, 0xed, 0x25, 0xed, 0x2d, 0xed, 0x23, 0xed, 0x2b, 0x65,\n  0xa5, 0x9c, 0x94, 0x97, 0x0a, 0x92, 0x2b, 0x79, 0xd2, 0x1c, 0x69, 0xae,\n  0x34, 0x4f, 0xda, 0x4f, 0x9a, 0x2f, 0x2d, 0x90, 0xf6, 0x97, 0x16, 0x4a,\n  0x8b, 0xa4, 0xc5, 0xd2, 0x01, 0xd2, 0x12, 0x69, 0xa9, 0xb4, 0x4c, 0x5a,\n  0x2e, 0x1d, 0x28, 0x1d, 0x24, 0xad, 0x90, 0x56, 0x4a, 0x07, 0x4b, 0x87,\n  0x48, 0x87, 0x4a, 0x87, 0x49, 0x87, 0x4b, 0x47, 0x48, 0xab, 0xa4, 0xa2,\n  0xd4, 0x29, 0x75, 0x49, 0xdd, 0x52, 0x49, 0x5a, 0x2d, 0xf5, 0x48, 0xbd,\n  0x52, 0x59, 0x5a, 0x23, 0xad, 0x95, 0x2a, 0x52, 0x9f, 0x54, 0x95, 0x6a,\n  0x52, 0xbf, 0x74, 0xa4, 0x34, 0x20, 0xd5, 0xa5, 0x86, 0x34, 0x28, 0xad,\n  0x93, 0xd6, 0x4b, 0x47, 0x49, 0x1b, 0xa4, 0x8d, 0xda, 0xd1, 0xda, 0x31,\n  0xda, 0xb1, 0xda, 0x71, 0xd2, 0x71, 0xd2, 0xf1, 0xd2, 0x09, 0xd2, 0x89,\n  0xd2, 0x49, 0xd2, 0xc9, 0xd2, 0x29, 0xd2, 0xa9, 0xd2, 0x69, 0xd2, 0xe9,\n  0xd2, 0x19, 0xd2, 0x99, 0xd2, 0x59, 0xd2, 0xd9, 0xd2, 0x39, 0xd2, 0xb9,\n  0xd2, 0x79, 0xd2, 0xf9, 0xd2, 0x05, 0xd2, 0xf7, 0xa5, 0x0b, 0xa5, 0x8b,\n  0xa4, 0x8b, 0xa5, 0x4b, 0xa4, 0x4b, 0xa5, 0xcb, 0xa4, 0xcb, 0xa5, 0x2b,\n  0xa4, 0x2b, 0xa5, 0xab, 0xa4, 0xab, 0xa5, 0x6b, 0xa4, 0x6b, 0xa5, 0xeb,\n  0xa4, 0xeb, 0xa5, 0x1b, 0xa4, 0x1b, 0xa5, 0x9b, 0xa4, 0x9b, 0xa5, 0x5b,\n  0xa4, 0x5b, 0xa5, 0xdb, 0xa4, 0xdb, 0xa5, 0x3b, 0xa4, 0x3b, 0xa5, 0x1f,\n  0x48, 0x77, 0x49, 0x77, 0x4b, 0xf7, 0x48, 0x43, 0xd2, 0x26, 0xe9, 0x5e,\n  0xe9, 0x3e, 0xe9, 0x87, 0xd2, 0xfd, 0xda, 0xf1, 0xd2, 0x83, 0xd2, 0x43,\n  0xd2, 0xc3, 0xd2, 0x23, 0xd2, 0xa3, 0xd2, 0x63, 0xd2, 0xe3, 0xd2, 0x13,\n  0xd2, 0x93, 0xda, 0x09, 0xd2, 0xd3, 0xd2, 0x33, 0xd2, 0xb3, 0xd2, 0x73,\n  0xd2, 0xf3, 0xd2, 0x0b, 0xd2, 0x8b, 0xd2, 0x4b, 0xda, 0x89, 0xd2, 0xcb,\n  0xd2, 0x2b, 0xd2, 0xab, 0xda, 0x49, 0xd2, 0xeb, 0xd2, 0x1b, 0xd2, 0x9b,\n  0xd2, 0x5b, 0xd2, 0xdb, 0xd2, 0x3b, 0xda, 0xc9, 0xd2, 0xbb, 0xd2, 0x4f,\n  0xa4, 0x9f, 0x4a, 0x3f, 0x93, 0x7e, 0x2e, 0xbd, 0x27, 0xbd, 0x2f, 0x7d,\n  0x20, 0xfd, 0x42, 0xfa, 0xa5, 0xf4, 0x2b, 0xe9, 0x43, 0xe9, 0x23, 0xe9,\n  0x63, 0xe9, 0x13, 0xe9, 0xd7, 0xd2, 0x6f, 0xa4, 0xdf, 0x4a, 0xbf, 0x93,\n  0x3e, 0xd5, 0x4e, 0x91, 0xfe, 0x20, 0x7d, 0x26, 0x7d, 0x2e, 0x7d, 0x21,\n  0x7d, 0xa9, 0x9d, 0x2a, 0x7d, 0x25, 0xfd, 0x49, 0xfa, 0xb3, 0xf4, 0x17,\n  0xed, 0x34, 0xed, 0x74, 0xe9, 0x6b, 0xe9, 0xef, 0xd2, 0x37, 0xd2, 0x3f,\n  0xa4, 0x7f, 0x4a, 0xff, 0x92, 0xfe, 0x2d, 0x7d, 0x2b, 0xfd, 0x47, 0xfa,\n  0x4e, 0xa6, 0x64, 0x5a, 0x66, 0x64, 0x56, 0xe6, 0x64, 0x5e, 0x16, 0x64,\n  0x51, 0x96, 0x64, 0x59, 0x4e, 0xc8, 0x8a, 0xac, 0xca, 0x9a, 0xac, 0xcb,\n  0x6d, 0xf2, 0x18, 0xed, 0x0c, 0x79, 0x9c, 0x3c, 0x5e, 0x9e, 0x20, 0x4f,\n  0x94, 0x27, 0xc9, 0x5b, 0xc8, 0x93, 0xe5, 0x29, 0xf2, 0x96, 0xf2, 0x54,\n  0x79, 0x2b, 0x79, 0x6b, 0x79, 0x1b, 0x79, 0x5b, 0xb9, 0x5d, 0x9e, 0x26,\n  0x6f, 0x27, 0x4f, 0x97, 0xb7, 0x97, 0x77, 0x90, 0x77, 0x94, 0x77, 0x92,\n  0x77, 0x96, 0x77, 0x91, 0x77, 0x95, 0x67, 0xc8, 0x33, 0xe5, 0x59, 0xf2,\n  0x6c, 0x79, 0x37, 0xb9, 0x43, 0x36, 0x64, 0x53, 0xb6, 0x64, 0x5b, 0x4e,\n  0xca, 0x8e, 0x9c, 0x92, 0xd3, 0x72, 0x46, 0xde, 0x5d, 0xde, 0x43, 0xde,\n  0x53, 0xde, 0x4b, 0xde, 0x5b, 0xde, 0x47, 0xde, 0x57, 0xce, 0xca, 0x39,\n  0xed, 0x4c, 0xed, 0x2c, 0xed, 0x6c, 0xd9, 0x93, 0xe7, 0xc8, 0x73, 0xe5,\n  0x79, 0xf2, 0x7e, 0xf2, 0x7c, 0x79, 0x81, 0xbc, 0xbf, 0xbc, 0x50, 0x5e,\n  0x24, 0x2f, 0x96, 0x0f, 0x90, 0x97, 0xc8, 0x4b, 0xe5, 0x65, 0xf2, 0x72,\n  0xf9, 0x40, 0xf9, 0x20, 0x79, 0x85, 0xbc, 0x52, 0x3e, 0x58, 0x3e, 0x44,\n  0x3e, 0x54, 0x3e, 0x4c, 0x3e, 0x5c, 0x3e, 0x42, 0x5e, 0x25, 0x17, 0xe5,\n  0x4e, 0xb9, 0x4b, 0xee, 0x96, 0x4b, 0xf2, 0x6a, 0xb9, 0x47, 0xee, 0x95,\n  0xcb, 0xf2, 0x1a, 0x79, 0xad, 0x5c, 0x91, 0xfb, 0xe4, 0xaa, 0x5c, 0xd3,\n  0xce, 0x91, 0x8f, 0x94, 0x07, 0xe4, 0xba, 0xdc, 0x90, 0x07, 0xb5, 0x73,\n  0xb5, 0xf3, 0xb4, 0xf3, 0xb5, 0x0b, 0xe4, 0x8d, 0xf2, 0xf7, 0xe4, 0xa3,\n  0xe5, 0x63, 0xe4, 0x63, 0xe5, 0xe3, 0xe4, 0xe3, 0xe5, 0x13, 0xe4, 0x13,\n  0xe5, 0x93, 0xe4, 0x93, 0xe5, 0x53, 0xe4, 0x53, 0xe5, 0xd3, 0xe4, 0xd3,\n  0xe5, 0x33, 0xe4, 0x33, 0xb5, 0xef, 0x6b, 0x17, 0x6a, 0x17, 0xc9, 0xe7,\n  0xca, 0xe7, 0xc9, 0xe7, 0xcb, 0x17, 0x68, 0x17, 0x6b, 0x97, 0xc8, 0x17,\n  0xc9, 0x17, 0xcb, 0x97, 0x68, 0x97, 0x6a, 0x97, 0x69, 0x97, 0x6b, 0x57,\n  0xc8, 0x57, 0x6a, 0x57, 0xca, 0x57, 0x6b, 0x57, 0xc9, 0xd7, 0xca, 0xd7,\n  0xc9, 0xd7, 0xcb, 0x37, 0xc8, 0x37, 0xca, 0x37, 0xc9, 0x37, 0xcb, 0xb7,\n  0xc8, 0xb7, 0x6a, 0x57, 0x6b, 0xd7, 0x68, 0xd7, 0x6a, 0xd7, 0x69, 0xd7,\n  0xcb, 0x77, 0xc9, 0x77, 0xcb, 0xf7, 0xc8, 0x43, 0xf2, 0x26, 0xf9, 0x5e,\n  0xf9, 0x3e, 0xf9, 0x87, 0xf2, 0xfd, 0xf2, 0x03, 0xf2, 0x83, 0xda, 0x0d,\n  0xda, 0x8d, 0xf2, 0x23, 0xf2, 0xa3, 0xf2, 0x63, 0xf2, 0xe3, 0xf2, 0x13,\n  0xf2, 0x93, 0xf2, 0x53, 0xf2, 0xd3, 0xf2, 0x33, 0xf2, 0xb3, 0xf2, 0x73,\n  0xf2, 0xf3, 0xf2, 0x0b, 0xf2, 0x8b, 0xf2, 0x4b, 0xf2, 0x8f, 0xe4, 0x97,\n  0xe5, 0x57, 0xe4, 0x57, 0xe5, 0xd7, 0xe4, 0xd7, 0xe5, 0x37, 0xe4, 0x37,\n  0xe5, 0xb7, 0xe4, 0xb7, 0xe5, 0x77, 0xe4, 0x1f, 0xcb, 0xef, 0xca, 0x3f,\n  0x91, 0x7f, 0x2a, 0xff, 0x4c, 0xfe, 0xb9, 0xfc, 0x9e, 0xfc, 0xbe, 0xfc,\n  0x81, 0xfc, 0x0b, 0xf9, 0x97, 0xf2, 0xaf, 0xe4, 0x0f, 0xe5, 0x8f, 0xe4,\n  0x8f, 0xe5, 0x4f, 0xe4, 0x5f, 0xcb, 0xbf, 0x91, 0x7f, 0x2b, 0xff, 0x4e,\n  0xfe, 0x54, 0xfe, 0xbd, 0xfc, 0x07, 0xf9, 0x33, 0xf9, 0x73, 0xf9, 0x0b,\n  0xf9, 0x4b, 0xf9, 0x8f, 0xf2, 0x57, 0xda, 0x4d, 0xda, 0xcd, 0xda, 0x2d,\n  0xda, 0xad, 0xda, 0x6d, 0xda, 0xed, 0xda, 0x1d, 0xda, 0x9d, 0xf2, 0x3f,\n  0xe4, 0x7f, 0xca, 0xff, 0x92, 0xff, 0x2d, 0x7f, 0x2b, 0xff, 0x47, 0xfb,\n  0x41, 0x82, 0x4a, 0xd0, 0x09, 0x26, 0xc1, 0x26, 0xb8, 0x04, 0x9f, 0x10,\n  0x12, 0x62, 0x42, 0x4a, 0xc8, 0x89, 0x44, 0x42, 0x49, 0xa8, 0x09, 0x2d,\n  0xa1, 0x27, 0xda, 0x12, 0x63, 0x12, 0x63, 0x13, 0xe3, 0x12, 0xe3, 0x13,\n  0x13, 0x12, 0x13, 0x13, 0x93, 0x12, 0x5b, 0x24, 0x26, 0x27, 0xa6, 0x24,\n  0xb6, 0x4c, 0x4c, 0x4d, 0x6c, 0x95, 0xd8, 0x3a, 0xb1, 0x4d, 0x62, 0xdb,\n  0x44, 0xbb, 0x76, 0x97, 0x76, 0xb7, 0x76, 0x8f, 0x36, 0xa4, 0x6d, 0xd2,\n  0xee, 0xd5, 0xee, 0xd3, 0x7e, 0xa8, 0xdd, 0xaf, 0x3d, 0x90, 0x98, 0x91,\n  0x98, 0x99, 0x98, 0x95, 0x98, 0x9d, 0xd8, 0x2d, 0xd1, 0x91, 0x30, 0x12,\n  0x66, 0xc2, 0x4a, 0xd8, 0x89, 0x64, 0xc2, 0x49, 0xa4, 0x12, 0xe9, 0x44,\n  0x26, 0xb1, 0x7b, 0x62, 0x8f, 0xc4, 0x9e, 0x89, 0xbd, 0x12, 0x7b, 0x6b,\n  0x0f, 0x6a, 0x0f, 0x69, 0x0f, 0x6b, 0x8f, 0x68, 0x8f, 0x6a, 0x8f, 0x69,\n  0x8f, 0x6b, 0x4f, 0x68, 0x4f, 0x6a, 0x4f, 0x69, 0x4f, 0x6b, 0xcf, 0x68,\n  0xcf, 0x6a, 0xcf, 0x69, 0xcf, 0x6b, 0x2f, 0x24, 0x16, 0x69, 0x2f, 0x6a,\n  0x2f, 0x69, 0x3f, 0xd2, 0x5e, 0xd6, 0x5e, 0xd1, 0x5e, 0xd5, 0x5e, 0xd3,\n  0x5e, 0xd7, 0xde, 0x48, 0xac, 0xd4, 0xde, 0xd4, 0xde, 0xd2, 0xde, 0xd6,\n  0xde, 0xd1, 0x7e, 0xac, 0xbd, 0xab, 0xfd, 0x44, 0xfb, 0xa9, 0xf6, 0x33,\n  0xed, 0xe7, 0xda, 0x7b, 0xda, 0xfb, 0xda, 0x07, 0xda, 0x2f, 0xb4, 0x5f,\n  0x6a, 0xbf, 0xd2, 0x3e, 0xd4, 0x3e, 0xd2, 0x3e, 0xd6, 0x3e, 0xd1, 0x7e,\n  0x9d, 0xa8, 0x25, 0xfa, 0xb5, 0xdf, 0x68, 0xbf, 0xd5, 0x7e, 0xa7, 0x7d,\n  0xaa, 0xfd, 0x5e, 0xfb, 0x83, 0xf6, 0x99, 0xf6, 0xb9, 0xf6, 0x85, 0xf6,\n  0xa5, 0xf6, 0xc7, 0xc4, 0xd1, 0x89, 0x63, 0xb4, 0xaf, 0xb4, 0x3f, 0x69,\n  0x7f, 0xd6, 0xfe, 0xa2, 0xfd, 0x55, 0xfb, 0x9b, 0xf6, 0xb5, 0xf6, 0x77,\n  0xed, 0x1b, 0xed, 0x1f, 0x89, 0xd3, 0xb5, 0x7f, 0x6a, 0xff, 0xd2, 0xfe,\n  0xad, 0x7d, 0xab, 0xfd, 0x47, 0xfb, 0x4e, 0xa7, 0x74, 0x5a, 0x67, 0x74,\n  0x56, 0xe7, 0x74, 0x3e, 0x71, 0xb1, 0x2e, 0x24, 0x2e, 0xd5, 0xc5, 0xc4,\n  0xe5, 0x89, 0x2b, 0x12, 0x57, 0x26, 0xae, 0x4a, 0x5c, 0x9d, 0xb8, 0x26,\n  0x71, 0x6d, 0xe2, 0x3a, 0x5d, 0xd2, 0x65, 0x3d, 0x91, 0xb8, 0x29, 0x71,\n  0x73, 0xe2, 0x96, 0xc4, 0xad, 0x89, 0xdb, 0x12, 0xb7, 0xeb, 0x8a, 0xae,\n  0xea, 0x9a, 0xae, 0xeb, 0x6d, 0xfa, 0x18, 0x7d, 0xac, 0x3e, 0x4e, 0x1f,\n  0x9f, 0xb8, 0x4f, 0x9f, 0xa0, 0x4f, 0xd4, 0x27, 0xe9, 0x5b, 0x24, 0x1e,\n  0x4a, 0x3c, 0x9c, 0x78, 0x24, 0xf1, 0x68, 0xe2, 0xb1, 0xc4, 0xe3, 0x89,\n  0x27, 0x12, 0x4f, 0x26, 0x9e, 0x4a, 0x3c, 0x9d, 0x78, 0x26, 0xf1, 0x6c,\n  0xe2, 0xb9, 0xc4, 0xf3, 0x89, 0x17, 0x12, 0x2f, 0xea, 0x93, 0xf5, 0x29,\n  0xfa, 0x96, 0xfa, 0x54, 0x7d, 0x2b, 0x7d, 0x6b, 0x7d, 0x9b, 0xc4, 0x1b,\n  0x89, 0x37, 0x13, 0x6f, 0x25, 0xde, 0xd6, 0xb7, 0xd5, 0xdb, 0xf5, 0x69,\n  0xfa, 0x76, 0xfa, 0x74, 0x7d, 0x7b, 0x7d, 0x87, 0xc4, 0x7b, 0x89, 0xf7,\n  0x13, 0x1f, 0xe8, 0x3b, 0xea, 0x3b, 0xe9, 0x3b, 0xeb, 0xbb, 0xe8, 0xbb,\n  0xea, 0x33, 0xf4, 0x99, 0xfa, 0x2c, 0x7d, 0xb6, 0xbe, 0x9b, 0xde, 0xa1,\n  0x1b, 0xba, 0xa9, 0x5b, 0x89, 0xcf, 0x12, 0x9f, 0x27, 0xbe, 0x48, 0x7c,\n  0x99, 0xf8, 0x63, 0xe2, 0xab, 0xc4, 0x9f, 0x74, 0x5b, 0x4f, 0xea, 0x8e,\n  0x9e, 0xd2, 0xd3, 0x7a, 0x46, 0xdf, 0x5d, 0xdf, 0x43, 0xdf, 0x53, 0xdf,\n  0x4b, 0xdf, 0x3b, 0xf1, 0xad, 0xbe, 0x8f, 0xbe, 0xaf, 0x9e, 0xd5, 0x73,\n  0x0a, 0xa3, 0xe7, 0xf5, 0x82, 0xc2, 0xeb, 0xae, 0x22, 0x2a, 0x92, 0x22,\n  0x2b, 0x09, 0x45, 0x51, 0x54, 0x45, 0x53, 0x74, 0xa5, 0x4d, 0x19, 0xa3,\n  0x8c, 0x55, 0xc6, 0x29, 0xe3, 0x95, 0x09, 0xca, 0x44, 0x65, 0x92, 0xb2,\n  0x85, 0x32, 0x59, 0x99, 0xa2, 0x6c, 0xa9, 0x4c, 0x55, 0xb6, 0x52, 0xb6,\n  0x56, 0xb6, 0x51, 0xb6, 0x55, 0xda, 0x95, 0x69, 0xca, 0x76, 0xca, 0x74,\n  0x65, 0x7b, 0x65, 0x07, 0x65, 0x47, 0x65, 0x27, 0x65, 0x67, 0x65, 0x17,\n  0x65, 0x57, 0x65, 0x86, 0x32, 0x53, 0x99, 0xa5, 0xcc, 0x56, 0x76, 0x53,\n  0x3a, 0x14, 0x43, 0x31, 0x15, 0x4b, 0xb1, 0x95, 0xa4, 0xe2, 0x28, 0x29,\n  0x25, 0xad, 0x64, 0x94, 0xdd, 0x95, 0x3d, 0x94, 0x3d, 0x95, 0xbd, 0x94,\n  0xbd, 0x95, 0x7d, 0x94, 0x7d, 0x95, 0xac, 0x92, 0x53, 0xf2, 0x4a, 0x41,\n  0x71, 0x15, 0x4f, 0x99, 0xa3, 0xcc, 0x55, 0xe6, 0x29, 0xfb, 0x29, 0xf3,\n  0x95, 0x05, 0xca, 0xfe, 0xca, 0x42, 0x65, 0x91, 0xb2, 0x58, 0x39, 0x40,\n  0x59, 0xa2, 0x2c, 0x55, 0x96, 0x29, 0xcb, 0x95, 0x03, 0x95, 0x83, 0x94,\n  0x15, 0xca, 0x4a, 0xe5, 0x60, 0xe5, 0x10, 0xe5, 0x50, 0xe5, 0x30, 0xe5,\n  0x70, 0xe5, 0x08, 0x65, 0x95, 0x52, 0x54, 0x3a, 0x95, 0x2e, 0xa5, 0x5b,\n  0x29, 0x29, 0xab, 0x95, 0x1e, 0xa5, 0x57, 0x29, 0x2b, 0x6b, 0x94, 0xb5,\n  0x4a, 0x45, 0xe9, 0x53, 0xaa, 0x4a, 0x4d, 0xe9, 0x57, 0x8e, 0x54, 0x06,\n  0x94, 0xba, 0xd2, 0x50, 0x06, 0x95, 0x75, 0xca, 0x7a, 0xe5, 0x28, 0x65,\n  0x83, 0xb2, 0x51, 0xf9, 0x9e, 0x72, 0xb4, 0x72, 0x8c, 0x72, 0xac, 0x72,\n  0x9c, 0x72, 0xbc, 0x72, 0x82, 0x72, 0xa2, 0x72, 0x92, 0x72, 0xb2, 0x72,\n  0x8a, 0x72, 0xaa, 0x72, 0x9a, 0x72, 0xba, 0x72, 0x86, 0x72, 0xa6, 0x72,\n  0x96, 0x72, 0xb6, 0x72, 0x8e, 0x72, 0xae, 0x72, 0x9e, 0x72, 0xbe, 0x72,\n  0x81, 0xf2, 0x7d, 0xe5, 0x42, 0xe5, 0x22, 0xe5, 0x62, 0xe5, 0x12, 0xe5,\n  0x52, 0xe5, 0x32, 0xe5, 0x72, 0xe5, 0x0a, 0xe5, 0x4a, 0xe5, 0x2a, 0xe5,\n  0x6a, 0xe5, 0x1a, 0xe5, 0x5a, 0xe5, 0x3a, 0xe5, 0x7a, 0xe5, 0x06, 0xe5,\n  0x46, 0xe5, 0x26, 0xe5, 0x66, 0xe5, 0x16, 0xe5, 0x56, 0xe5, 0x36, 0xe5,\n  0x76, 0xe5, 0x0e, 0xe5, 0x4e, 0xdd, 0xd3, 0xe7, 0xe8, 0x73, 0x95, 0x7b,\n  0x94, 0x21, 0x7d, 0x9e, 0xbe, 0x9f, 0x3e, 0x5f, 0x5f, 0xa0, 0xef, 0xaf,\n  0x3c, 0xa0, 0x2f, 0xd4, 0x17, 0xe9, 0x8b, 0xf5, 0x03, 0xf4, 0x25, 0xfa,\n  0x52, 0x7d, 0x99, 0xbe, 0x5c, 0x3f, 0x50, 0x3f, 0x48, 0x5f, 0xa1, 0xaf,\n  0xd4, 0x0f, 0xd6, 0x0f, 0xd1, 0x0f, 0xd5, 0x0f, 0xd3, 0x0f, 0xd7, 0x8f,\n  0xd0, 0x57, 0xe9, 0x45, 0xbd, 0x53, 0xef, 0x52, 0x5e, 0x53, 0x5e, 0x57,\n  0xde, 0xd0, 0xbb, 0xf5, 0x92, 0xbe, 0x5a, 0xef, 0xd1, 0x7b, 0xf5, 0xb2,\n  0xbe, 0x46, 0x5f, 0xab, 0x57, 0xf4, 0x3e, 0xbd, 0xaa, 0xd7, 0xf4, 0x7e,\n  0xfd, 0x48, 0x7d, 0x40, 0xaf, 0x2b, 0x1f, 0x2a, 0x1f, 0x29, 0x1f, 0x2b,\n  0x9f, 0xe8, 0x0d, 0x7d, 0x50, 0x5f, 0xa7, 0xaf, 0xd7, 0x8f, 0xd2, 0x37,\n  0xe8, 0x1b, 0xf5, 0xef, 0xe9, 0x47, 0xeb, 0xc7, 0xe8, 0xc7, 0xea, 0xc7,\n  0xe9, 0xc7, 0xeb, 0x27, 0xe8, 0x27, 0xea, 0x27, 0xe9, 0x27, 0xeb, 0xa7,\n  0xe8, 0xa7, 0xea, 0xa7, 0xe9, 0xa7, 0xeb, 0x67, 0xe8, 0x67, 0xea, 0x67,\n  0xe9, 0x67, 0xeb, 0xe7, 0xe8, 0xe7, 0xea, 0xe7, 0xe9, 0xe7, 0xeb, 0x17,\n  0xe8, 0xdf, 0xd7, 0x2f, 0xd4, 0x2f, 0xd2, 0x2f, 0xd6, 0x2f, 0xd1, 0x2f,\n  0xd5, 0x2f, 0xd3, 0x2f, 0x57, 0x13, 0xaa, 0xa2, 0x5f, 0xa1, 0x5f, 0xa9,\n  0xea, 0x6a, 0x9b, 0x3a, 0x46, 0x1d, 0xab, 0x8e, 0x53, 0xc7, 0xab, 0x13,\n  0xd4, 0x89, 0xea, 0x24, 0xfd, 0x2a, 0xfd, 0x6a, 0x75, 0x8a, 0x7e, 0x8d,\n  0x3a, 0x55, 0xdd, 0x4a, 0xdd, 0x5a, 0xdd, 0x46, 0xdd, 0x56, 0x6d, 0x57,\n  0xa7, 0xa9, 0xdb, 0xa9, 0xd3, 0xd5, 0xed, 0xd5, 0x1d, 0xd4, 0x1d, 0xd5,\n  0x9d, 0xd4, 0x9d, 0xd5, 0x5d, 0xd4, 0x5d, 0xd5, 0x19, 0xea, 0x4c, 0x75,\n  0x96, 0x3a, 0x5b, 0xdd, 0x4d, 0xed, 0x50, 0x0d, 0xd5, 0x54, 0x2d, 0xd5,\n  0x56, 0x93, 0xaa, 0xa3, 0xa6, 0xd4, 0xb4, 0x9a, 0x51, 0x77, 0x57, 0xf7,\n  0x50, 0xf7, 0x54, 0xf7, 0x52, 0xf7, 0x56, 0xf7, 0x51, 0xf7, 0x55, 0xb3,\n  0x6a, 0x4e, 0xcd, 0xab, 0x05, 0xd5, 0x55, 0x3d, 0x75, 0x8e, 0x3a, 0x57,\n  0x9d, 0xa7, 0xee, 0xa7, 0xce, 0x57, 0x17, 0xa8, 0xfb, 0xab, 0x0b, 0xd5,\n  0x45, 0xea, 0x62, 0xf5, 0x00, 0x75, 0x89, 0xba, 0x54, 0x5d, 0xa6, 0x2e,\n  0x57, 0x0f, 0x54, 0x0f, 0x52, 0x57, 0xa8, 0x2b, 0xd5, 0x83, 0xd5, 0x43,\n  0xd4, 0x43, 0xd5, 0xc3, 0xd4, 0xc3, 0xd5, 0x23, 0xd4, 0x55, 0x6a, 0x51,\n  0xed, 0x54, 0xbb, 0xd4, 0x6e, 0xb5, 0xa4, 0xae, 0x56, 0x7b, 0xd4, 0x5e,\n  0xb5, 0xac, 0x5f, 0xab, 0x5f, 0xa7, 0x56, 0xd4, 0x3e, 0xfd, 0x7a, 0xfd,\n  0x06, 0xfd, 0x46, 0xfd, 0x26, 0xfd, 0x66, 0xb5, 0xae, 0xdf, 0xa2, 0xdf,\n  0xaa, 0xae, 0xd3, 0x6f, 0xd3, 0x6f, 0xd7, 0xef, 0xd0, 0xef, 0xd4, 0x7f,\n  0xa0, 0xdf, 0xa5, 0xdf, 0xad, 0xdf, 0xa3, 0x0f, 0xa9, 0xc7, 0xab, 0x27,\n  0xa8, 0x27, 0xaa, 0x27, 0xa9, 0x27, 0xab, 0xa7, 0xa8, 0xa7, 0xaa, 0xa7,\n  0xa9, 0xa7, 0xab, 0x67, 0xa8, 0x67, 0xaa, 0x67, 0xa9, 0x67, 0xab, 0xe7,\n  0xa8, 0xe7, 0xaa, 0xe7, 0xa9, 0xe7, 0xab, 0x17, 0xe8, 0x9b, 0xf4, 0x7b,\n  0xf5, 0xfb, 0xf4, 0x1f, 0xea, 0xf7, 0xeb, 0x0f, 0xe8, 0x0f, 0xea, 0x0f,\n  0xe9, 0x0f, 0xeb, 0x8f, 0xe8, 0x8f, 0xea, 0x8f, 0xe9, 0x8f, 0xeb, 0x4f,\n  0xa8, 0xd7, 0xe9, 0x4f, 0xea, 0x4f, 0xe9, 0x4f, 0xeb, 0xcf, 0xe8, 0xcf,\n  0xea, 0xcf, 0xe9, 0xcf, 0xeb, 0x2f, 0xe8, 0x2f, 0xea, 0x2f, 0xe9, 0x3f,\n  0xd2, 0x5f, 0xd6, 0x5f, 0xd1, 0x5f, 0xd5, 0x5f, 0xd3, 0x5f, 0xd7, 0xdf,\n  0xd0, 0xdf, 0xd4, 0xdf, 0xd2, 0xdf, 0x56, 0xef, 0x57, 0x1f, 0x50, 0x1f,\n  0x54, 0x1f, 0x52, 0x1f, 0x56, 0x1f, 0x51, 0x1f, 0x55, 0x1f, 0x53, 0x1f,\n  0x57, 0x9f, 0x50, 0x9f, 0x54, 0x9f, 0x52, 0x9f, 0x56, 0x9f, 0x51, 0x9f,\n  0x55, 0x9f, 0x53, 0x9f, 0x57, 0x5f, 0x50, 0x5f, 0x54, 0x5f, 0x52, 0x7f,\n  0xa4, 0xbe, 0xac, 0xbe, 0xa2, 0xbe, 0xaa, 0xbe, 0xa6, 0xbe, 0xae, 0xbe,\n  0xa1, 0xbe, 0xa9, 0xbe, 0xa5, 0xbe, 0xad, 0xbe, 0xa3, 0xfe, 0x58, 0x7d,\n  0x57, 0xfd, 0x89, 0xfa, 0x53, 0x6e, 0xe1, 0xf2, 0x05, 0x0b, 0x98, 0xfc,\n  0x12, 0xb1, 0xda, 0x59, 0xef, 0x2f, 0x76, 0x95, 0xc4, 0xc1, 0x6a, 0xb9,\n  0xa3, 0x23, 0x5b, 0x90, 0x6b, 0xeb, 0x4a, 0x03, 0xf5, 0xae, 0xda, 0x40,\n  0x89, 0xef, 0x2b, 0x77, 0x0d, 0xd4, 0xc4, 0x6c, 0x5f, 0x91, 0x90, 0xaa,\n  0x58, 0x0c, 0xa9, 0x90, 0xed, 0x1c, 0x28, 0xad, 0x2b, 0x09, 0xc5, 0x80,\n  0x88, 0xd9, 0x5a, 0x4f, 0xad, 0x5a, 0x5a, 0x2b, 0x16, 0x43, 0xaa, 0xe4,\n  0xbb, 0xca, 0x03, 0x5d, 0x83, 0x7d, 0xab, 0x2b, 0xa5, 0xa3, 0x94, 0xae,\n  0xe1, 0x30, 0x97, 0xef, 0xae, 0x35, 0xb8, 0x2e, 0xf2, 0x23, 0x14, 0xba,\n  0x8a, 0x3e, 0x9b, 0xee, 0x90, 0x14, 0x08, 0xcf, 0x62, 0x43, 0x74, 0x01,\n  0x52, 0x02, 0x88, 0x1b, 0x82, 0x94, 0x02, 0x92, 0x70, 0x49, 0xb9, 0x62,\n  0x57, 0x57, 0xa9, 0xda, 0x48, 0x94, 0xe2, 0xa0, 0xe8, 0x02, 0xba, 0x14,\n  0x52, 0xc1, 0x0d, 0x39, 0x96, 0x02, 0xa2, 0xcc, 0x69, 0x12, 0xa4, 0xa7,\n  0x49, 0x90, 0x39, 0xbe, 0x20, 0x3d, 0xe4, 0x47, 0x9d, 0xd3, 0x55, 0xeb,\n  0xeb, 0x2b, 0x86, 0xcc, 0xd4, 0x9e, 0xa6, 0x88, 0x32, 0xb7, 0xa9, 0x6c,\n  0x6f, 0x53, 0xd9, 0xb9, 0x9d, 0xc5, 0x01, 0xae, 0x97, 0xfc, 0x08, 0xf3,\n  0x1a, 0xe5, 0x4a, 0x77, 0x49, 0x28, 0x07, 0x44, 0x9c, 0x07, 0xe9, 0xcb,\n  0x90, 0x7e, 0x5e, 0x28, 0x7d, 0x39, 0x6c, 0xa2, 0x79, 0x90, 0xb3, 0x1c,\n  0x52, 0x66, 0xde, 0x7e, 0x4c, 0x79, 0x8d, 0xb2, 0x5f, 0x13, 0xc6, 0x9a,\n  0xe1, 0xb0, 0x3a, 0xbf, 0x59, 0xaa, 0xb5, 0x23, 0x22, 0x3d, 0x03, 0xa5,\n  0x52, 0xb5, 0x52, 0xac, 0x76, 0x97, 0xbb, 0x84, 0x05, 0xc5, 0xae, 0xc1,\n  0x46, 0x49, 0xa8, 0x04, 0x44, 0x5d, 0xd0, 0x9c, 0xaf, 0xd2, 0x14, 0x11,\n  0x16, 0x84, 0x8d, 0x52, 0x09, 0x08, 0xb7, 0xc0, 0xaf, 0x7c, 0xc5, 0xbf,\n  0x0b, 0x0b, 0xc3, 0xf2, 0xd5, 0xb0, 0xfc, 0xc2, 0xe6, 0xf2, 0xd5, 0xe6,\n  0xf2, 0x0b, 0xc3, 0xf2, 0xd5, 0xb0, 0x51, 0xab, 0xc5, 0xfe, 0x5a, 0xbd,\n  0x31, 0x50, 0xeb, 0xef, 0x2d, 0xb1, 0x6e, 0xb5, 0x87, 0x2d, 0x55, 0x7b,\n  0xc4, 0x45, 0xa8, 0x7c, 0x0d, 0x95, 0x5f, 0x14, 0x56, 0xbe, 0x16, 0x10,\n  0x6d, 0x51, 0xef, 0x60, 0xb5, 0xa7, 0x38, 0x30, 0xd8, 0x57, 0x29, 0x0e,\n  0x36, 0xb4, 0x5a, 0x73, 0x4c, 0x58, 0x12, 0xca, 0x30, 0x10, 0xca, 0xb0,\n  0xa4, 0x59, 0x86, 0x81, 0x66, 0x19, 0x96, 0x84, 0x32, 0x0c, 0x84, 0x64,\n  0x69, 0x58, 0xaa, 0x1e, 0x10, 0x65, 0x69, 0x53, 0x33, 0xd6, 0x9b, 0x9a,\n  0x71, 0x59, 0x33, 0xb7, 0x46, 0x33, 0xb7, 0x65, 0x21, 0x9b, 0x46, 0xd8,\n  0x22, 0xcb, 0xfc, 0x5b, 0xda, 0xf0, 0x6f, 0xe9, 0xf2, 0xf0, 0x96, 0x0e,\n  0x86, 0xb7, 0x74, 0x39, 0x6a, 0x35, 0x88, 0x5a, 0x2d, 0x0f, 0x6b, 0x35,\n  0x18, 0x10, 0x7e, 0xf9, 0x40, 0xb9, 0xda, 0xc3, 0x0f, 0xfa, 0xbf, 0xda,\n  0xf2, 0x11, 0x35, 0x1c, 0x6c, 0x8e, 0x89, 0xcb, 0x71, 0xeb, 0x07, 0xf1,\n  0x74, 0x1c, 0xd4, 0x24, 0xed, 0xfa, 0xa6, 0xf0, 0xca, 0xa6, 0xf0, 0x86,\n  0xe1, 0xb0, 0x70, 0x70, 0x58, 0xd7, 0x8d, 0x01, 0x49, 0x1c, 0x3c, 0xfc,\n  0x18, 0x6c, 0x8c, 0x83, 0x7c, 0xa5, 0x56, 0xed, 0xa9, 0x27, 0xb2, 0xbe,\n  0x2c, 0x61, 0xb6, 0x62, 0x1c, 0x14, 0xb3, 0x6e, 0x48, 0x8b, 0xa5, 0xb0,\n  0xb5, 0x16, 0xd5, 0x2b, 0xc5, 0x7a, 0x6f, 0x18, 0xae, 0x0d, 0x87, 0xd5,\n  0xa5, 0xcd, 0xad, 0x55, 0x6f, 0x8a, 0xf0, 0x8d, 0x5a, 0xb5, 0x56, 0xd7,\n  0xba, 0xcb, 0xa5, 0x81, 0x52, 0xbd, 0x5c, 0x0f, 0x62, 0x89, 0x6c, 0xa5,\n  0xbf, 0xb7, 0x18, 0x04, 0xe5, 0x62, 0xb5, 0xd6, 0x28, 0x55, 0x4a, 0xe5,\n  0xa2, 0xea, 0xf6, 0xd7, 0xcb, 0x44, 0x94, 0x20, 0x59, 0x72, 0x1b, 0xb8,\n  0x3e, 0xaf, 0x86, 0x90, 0xba, 0x28, 0xd0, 0x26, 0xe1, 0x75, 0x75, 0x79,\n  0x53, 0xe6, 0xc4, 0xa2, 0xbe, 0x52, 0x4f, 0x98, 0x69, 0x6c, 0x99, 0x64,\n  0x1f, 0x81, 0xc5, 0x07, 0x58, 0x5c, 0xae, 0xd4, 0x28, 0xf2, 0x73, 0x8a,\n  0x44, 0x2c, 0x11, 0x38, 0xdc, 0xc1, 0x24, 0x89, 0x25, 0x38, 0xfc, 0xb2,\n  0x5e, 0x12, 0xe2, 0x7c, 0x20, 0x7e, 0x7e, 0xb1, 0xbf, 0xbf, 0x48, 0x1e,\n  0x8d, 0xbe, 0xce, 0xee, 0x22, 0xb3, 0xff, 0x20, 0xb3, 0x70, 0x90, 0x59,\n  0x51, 0x16, 0x81, 0xcc, 0x2c, 0x2e, 0xb3, 0x4b, 0x7a, 0x6b, 0xfc, 0xd2,\n  0x72, 0x4f, 0x5f, 0x91, 0x5d, 0x56, 0x1c, 0x14, 0x21, 0x05, 0xbb, 0xb8,\n  0xb7, 0xcc, 0xe6, 0xc9, 0xff, 0xc5, 0xf5, 0xb2, 0x3a, 0xaf, 0x49, 0x82,\n  0x36, 0x64, 0x88, 0xe2, 0x89, 0x62, 0x5c, 0x71, 0xb5, 0xd4, 0x5c, 0xdd,\n  0x52, 0x54, 0xdd, 0x72, 0x54, 0xdd, 0x09, 0x83, 0x23, 0x8b, 0x86, 0x95,\n  0x09, 0xca, 0x73, 0x9d, 0x7e, 0x65, 0x7a, 0xfc, 0xca, 0xf0, 0xdd, 0xa5,\n  0x4a, 0xa3, 0x28, 0x82, 0x17, 0xb7, 0xd1, 0xaf, 0x92, 0x7f, 0xb1, 0x11,\n  0x54, 0xc9, 0x67, 0xc6, 0xaf, 0x0d, 0xaa, 0x54, 0x09, 0xab, 0x54, 0x1d,\n  0x64, 0x8e, 0x2a, 0x93, 0x07, 0x2d, 0xa8, 0x0f, 0x3b, 0xd0, 0x5b, 0x13,\n  0xea, 0x7e, 0x65, 0x0c, 0x3e, 0x20, 0x6c, 0x83, 0xd4, 0x09, 0xb8, 0x6c,\n  0x3f, 0xa9, 0x4f, 0x17, 0xf9, 0x4f, 0xa2, 0x7c, 0xcd, 0x6f, 0x60, 0xb5,\n  0xb9, 0x6d, 0xdb, 0x46, 0x89, 0xa7, 0xd6, 0x9a, 0xef, 0xce, 0x60, 0xf3,\n  0xdd, 0xa9, 0xc5, 0x77, 0x47, 0x2e, 0xae, 0x2e, 0x97, 0x8d, 0x8e, 0x0e,\n  0xd3, 0x8a, 0x42, 0x49, 0x23, 0x0e, 0x99, 0x71, 0x68, 0xf8, 0xaa, 0x1d,\n  0x87, 0x92, 0x71, 0xc8, 0x89, 0x43, 0xa9, 0x38, 0x94, 0x8e, 0x43, 0x99,\n  0x28, 0xe4, 0x74, 0xc4, 0xa1, 0x18, 0xc3, 0x89, 0x30, 0x0c, 0x3b, 0xe6,\n  0x67, 0xc4, 0x5c, 0x8c, 0x98, 0x8b, 0x11, 0x73, 0x31, 0x63, 0x2e, 0x66,\n  0xcc, 0xc5, 0x8c, 0x25, 0x35, 0x63, 0xf9, 0xcc, 0x98, 0x9f, 0x19, 0xcb,\n  0x67, 0xc6, 0x9c, 0xcd, 0x98, 0xb3, 0x19, 0x73, 0xb6, 0x62, 0xce, 0x56,\n  0xcc, 0xd9, 0x8a, 0x39, 0x5b, 0x71, 0x1b, 0x58, 0x31, 0x86, 0x15, 0x63,\n  0x58, 0x31, 0x86, 0x15, 0x63, 0x58, 0x31, 0x86, 0x15, 0x63, 0xd8, 0x31,\n  0x86, 0x1d, 0x63, 0xd8, 0x31, 0x86, 0x1d, 0x63, 0xd8, 0x31, 0xc6, 0x70,\n  0xbb, 0xd8, 0x31, 0x86, 0x1d, 0x63, 0xd8, 0x31, 0x86, 0x3d, 0xdc, 0xce,\n  0x71, 0x09, 0x27, 0x2e, 0xe1, 0xc4, 0x25, 0x9c, 0xb8, 0x84, 0x13, 0x97,\n  0x48, 0xc5, 0x52, 0xa5, 0x62, 0x59, 0x52, 0xb1, 0x2c, 0xa9, 0x58, 0x96,\n  0x54, 0xcc, 0x39, 0x15, 0x73, 0x4e, 0xc5, 0x9c, 0x53, 0x31, 0xe7, 0x54,\n  0xcc, 0x39, 0x1d, 0x73, 0x4e, 0xc7, 0xf5, 0x4d, 0xc7, 0x18, 0xe9, 0x18,\n  0x23, 0x1d, 0x63, 0xa4, 0x63, 0x8c, 0x74, 0x8c, 0x91, 0x8e, 0x31, 0xd2,\n  0x31, 0x46, 0x3a, 0xc6, 0xc8, 0xc4, 0x18, 0x99, 0x18, 0x23, 0x13, 0x63,\n  0x64, 0x62, 0x8c, 0x4c, 0x8c, 0x91, 0x89, 0x31, 0x32, 0x31, 0x46, 0x66,\n  0xb8, 0x1e, 0xc3, 0x5c, 0x22, 0x0c, 0x12, 0x8e, 0x43, 0x46, 0x1c, 0x8a,\n  0xfb, 0x6e, 0x87, 0x15, 0x87, 0xec, 0x38, 0x94, 0x8c, 0x43, 0x4e, 0x1c,\n  0x4a, 0xc5, 0xa1, 0x74, 0x1c, 0x8a, 0x31, 0x8c, 0x18, 0x63, 0x58, 0xe6,\n  0xe4, 0x70, 0xdd, 0xd2, 0xc2, 0x41, 0x3d, 0x03, 0x45, 0x62, 0xaf, 0xd6,\n  0x87, 0xe4, 0xa0, 0xd0, 0x8e, 0xac, 0x0f, 0x88, 0x7c, 0x50, 0xf4, 0xd8,\n  0xcb, 0xeb, 0xa3, 0x90, 0xb0, 0x32, 0xcc, 0xb8, 0x21, 0x20, 0x01, 0x1f,\n  0xff, 0xf1, 0x49, 0x6b, 0x83, 0xd5, 0x6e, 0xb8, 0x83, 0xdd, 0x9d, 0x15,\n  0xed, 0xc8, 0x41, 0xa2, 0xee, 0x7d, 0x0b, 0x38, 0x50, 0x2f, 0x75, 0x0b,\n  0x7d, 0xe5, 0x6a, 0x60, 0x89, 0x4b, 0x5d, 0x44, 0x93, 0xc8, 0xa5, 0xa3,\n  0xba, 0x88, 0x9a, 0x22, 0xb9, 0xe4, 0x6a, 0x7d, 0xb0, 0xbf, 0x34, 0x50,\n  0xae, 0x0d, 0x84, 0x7c, 0xd2, 0x19, 0xdb, 0x10, 0xfa, 0x4b, 0x75, 0x5f,\n  0xa7, 0xb9, 0x83, 0x03, 0xb5, 0x20, 0xd5, 0x31, 0x4c, 0xf4, 0x47, 0x12,\n  0xc2, 0xfd, 0x71, 0x0c, 0x2b, 0x69, 0xb2, 0x8b, 0x7a, 0xfb, 0xe4, 0x52,\n  0xbd, 0x41, 0x7c, 0xa9, 0x46, 0xa9, 0x5b, 0x26, 0x66, 0xb3, 0x54, 0xee,\n  0xe9, 0x6d, 0xf4, 0xaa, 0x8d, 0x5e, 0xe2, 0xfe, 0x84, 0xe1, 0xba, 0xb2,\n  0xba, 0xbc, 0x2e, 0x0a, 0xab, 0x75, 0x22, 0x4f, 0x35, 0xba, 0xd0, 0x6c,\n  0xc8, 0x56, 0xd7, 0x06, 0x07, 0x22, 0x51, 0x54, 0xbf, 0x44, 0x14, 0xd1,\n  0x82, 0x22, 0x71, 0x2c, 0x28, 0x1b, 0xc5, 0x7c, 0x3f, 0xd8, 0xec, 0xe8,\n  0xe8, 0x00, 0x35, 0x40, 0x4d, 0x50, 0x0b, 0xd4, 0x06, 0x4d, 0x82, 0x3a,\n  0xa0, 0x29, 0xd0, 0x34, 0x68, 0x06, 0x34, 0x0b, 0x9a, 0xf3, 0xa9, 0xe7,\n  0x7a, 0x5e, 0x40, 0x3d, 0x2f, 0x0f, 0x5a, 0x08, 0xfc, 0x6f, 0xc3, 0x0b,\n  0x70, 0x3b, 0xcc, 0x5c, 0x90, 0xde, 0x61, 0x15, 0x0c, 0x50, 0x13, 0x34,\n  0xc0, 0x31, 0x5c, 0xcb, 0x05, 0xf5, 0x42, 0x1a, 0xca, 0x4b, 0x68, 0x98,\n  0xdf, 0xf4, 0x2c, 0x7e, 0x51, 0x6f, 0x6d, 0xa0, 0xca, 0xd7, 0x82, 0xdf,\n  0xe5, 0xc1, 0xef, 0xa0, 0xff, 0x1b, 0x5c, 0xb7, 0xc3, 0xfc, 0x84, 0x86,\n  0xb8, 0x76, 0x12, 0xf1, 0x24, 0xe2, 0x0e, 0xe2, 0x8e, 0x01, 0x6a, 0x82,\n  0x5a, 0xa0, 0x36, 0x68, 0x12, 0xd4, 0x01, 0x4d, 0x81, 0xa6, 0x41, 0x33,\n  0xa0, 0x59, 0xd0, 0x1c, 0x68, 0x1e, 0x34, 0xc2, 0x73, 0x41, 0xbd, 0x90,\n  0xa6, 0x80, 0x9f, 0x02, 0x7e, 0x0a, 0xf8, 0x29, 0xe0, 0xa7, 0x80, 0x9f,\n  0x02, 0x7e, 0x0a, 0xf8, 0x29, 0xe0, 0xa7, 0x80, 0x9f, 0x02, 0x7e, 0x0a,\n  0xf8, 0x29, 0xe0, 0xa7, 0x80, 0x9f, 0x02, 0x7e, 0x0a, 0xf8, 0x29, 0xe0,\n  0xa7, 0x81, 0x9f, 0x06, 0x7e, 0x1a, 0xf8, 0x69, 0xf0, 0x4d, 0x83, 0x6f,\n  0x1a, 0x7c, 0xd3, 0xe0, 0x9b, 0x06, 0xdf, 0x34, 0xf8, 0xa6, 0xc1, 0x37,\n  0x0d, 0xbe, 0x19, 0xf0, 0xc9, 0xa0, 0x1e, 0x19, 0xd4, 0x23, 0x83, 0x7a,\n  0x64, 0x50, 0x8f, 0x0c, 0xea, 0x91, 0x01, 0x5e, 0x06, 0x78, 0x19, 0xe0,\n  0x65, 0x80, 0x97, 0x01, 0x5e, 0x06, 0x78, 0x19, 0xe0, 0x65, 0x80, 0x97,\n  0x45, 0x3d, 0xb2, 0xa8, 0x47, 0x16, 0xf8, 0x59, 0xe0, 0x67, 0x81, 0x9f,\n  0x05, 0x7e, 0x16, 0xf8, 0x59, 0xe0, 0x67, 0x81, 0x9f, 0x05, 0x7e, 0x16,\n  0xf8, 0x59, 0xe0, 0x67, 0x81, 0x9f, 0x05, 0x7e, 0x16, 0xf8, 0x59, 0xe0,\n  0xe7, 0x80, 0x9f, 0x03, 0x7e, 0x0e, 0xf8, 0x39, 0xe0, 0xe7, 0x80, 0x9f,\n  0x03, 0x7e, 0x0e, 0xf8, 0x39, 0xe0, 0xe7, 0x80, 0x9f, 0x03, 0x7e, 0x0e,\n  0xf8, 0x39, 0xe0, 0xe3, 0x39, 0xb1, 0x73, 0xc0, 0xcf, 0x01, 0x3f, 0x07,\n  0xfc, 0x3c, 0xf0, 0xf3, 0xc0, 0xcf, 0x03, 0x3f, 0x0f, 0xfc, 0x3c, 0xf0,\n  0xf3, 0xc0, 0xcf, 0x03, 0x3f, 0x0f, 0xfc, 0x3c, 0xf0, 0xf3, 0xc0, 0xcf,\n  0x03, 0x3f, 0x0f, 0xfc, 0x3c, 0xf0, 0xf3, 0xc0, 0xcf, 0x03, 0x3f, 0x0f,\n  0xfc, 0x02, 0xf0, 0xf1, 0x1c, 0xdb, 0x78, 0x8e, 0xed, 0x02, 0xf0, 0x0b,\n  0xc0, 0x2f, 0x00, 0xbf, 0x00, 0xfc, 0x02, 0xf0, 0x0b, 0xc0, 0x2f, 0x00,\n  0xbf, 0x00, 0xfc, 0x02, 0xf0, 0x0b, 0xc0, 0x2f, 0x00, 0xbf, 0x00, 0xfc,\n  0x02, 0xf0, 0x5d, 0xe0, 0xbb, 0xc0, 0x77, 0x81, 0xef, 0x02, 0xdf, 0x05,\n  0xbe, 0x0b, 0x7c, 0x17, 0xf8, 0x2e, 0xf0, 0x5d, 0xe0, 0xbb, 0xc0, 0x77,\n  0x81, 0xef, 0x02, 0xdf, 0x05, 0xbe, 0x0b, 0x7c, 0x17, 0xf8, 0x2e, 0xf0,\n  0xa1, 0xcf, 0x6c, 0x0f, 0xf8, 0x1e, 0xf0, 0x3d, 0xe0, 0x7b, 0xc0, 0xf7,\n  0x80, 0xef, 0x01, 0xdf, 0x03, 0xbe, 0x07, 0x7c, 0x0f, 0xf8, 0x1e, 0xf0,\n  0x3d, 0xe0, 0x7b, 0xc0, 0x87, 0xfe, 0xb4, 0x3d, 0xe0, 0x87, 0xfa, 0x95,\n  0x98, 0xc4, 0x0e, 0x50, 0x03, 0xd4, 0x04, 0xb5, 0x40, 0x6d, 0xd0, 0x24,\n  0xa8, 0x03, 0x9a, 0x02, 0x4d, 0x83, 0x66, 0x40, 0xb3, 0xa0, 0x39, 0xd0,\n  0x3c, 0x68, 0x01, 0xd4, 0x05, 0x05, 0xbe, 0x01, 0x7c, 0x03, 0xf8, 0x06,\n  0xf0, 0x0d, 0x2b, 0xd4, 0xd7, 0x59, 0xe8, 0xed, 0xf0, 0xf9, 0x24, 0xd4,\n  0x04, 0x8d, 0xae, 0xdb, 0xa0, 0x49, 0x50, 0xe8, 0xff, 0xf0, 0xf9, 0x24,\n  0x34, 0x0d, 0x9a, 0x01, 0xcd, 0x82, 0xe6, 0x40, 0xf3, 0xa0, 0x05, 0x50,\n  0xd8, 0x8d, 0x2c, 0xec, 0x46, 0x0e, 0xf8, 0x39, 0xe0, 0xe7, 0x80, 0x9f,\n  0x03, 0x7e, 0x0e, 0xf8, 0x39, 0xe0, 0xe7, 0x80, 0x9f, 0x03, 0x7e, 0x0e,\n  0xf8, 0x39, 0xe0, 0xe7, 0x80, 0x9f, 0x03, 0x7e, 0x0e, 0xf8, 0x39, 0xe0,\n  0xe7, 0x80, 0x9f, 0x03, 0x7e, 0x1e, 0xf8, 0x79, 0xe0, 0xe7, 0x81, 0x9f,\n  0x07, 0x7e, 0x1e, 0xf8, 0x79, 0xe0, 0xe7, 0x81, 0x9f, 0x07, 0x7e, 0x1e,\n  0xf8, 0x79, 0xe0, 0xe7, 0x81, 0x9f, 0x07, 0x7e, 0x1e, 0xf8, 0x79, 0xe0,\n  0xe7, 0x81, 0x9f, 0x07, 0x7e, 0x01, 0xf8, 0x05, 0xe0, 0x17, 0x80, 0x5f,\n  0x00, 0x7e, 0x01, 0xf8, 0x05, 0xe0, 0x47, 0xf6, 0xb7, 0x00, 0xfc, 0x02,\n  0xf0, 0x0b, 0xc0, 0x2f, 0x00, 0xbf, 0x00, 0xfc, 0x02, 0xf0, 0x0b, 0xc0,\n  0x2f, 0x00, 0xbf, 0x00, 0x7c, 0x17, 0xf8, 0x2e, 0xf0, 0x5d, 0xe0, 0xbb,\n  0xc0, 0x77, 0x81, 0xef, 0x02, 0xdf, 0x05, 0xbe, 0x0b, 0x7c, 0x17, 0xf8,\n  0x2e, 0xf0, 0x5d, 0xe0, 0xbb, 0xc0, 0x77, 0x81, 0xef, 0x02, 0xdf, 0x05,\n  0xbe, 0x0b, 0x7c, 0x0f, 0xf8, 0x1e, 0xf0, 0x3d, 0xe0, 0x79, 0xc0, 0xf3,\n  0x80, 0xe7, 0x01, 0xcf, 0x03, 0x9e, 0x07, 0xbf, 0x26, 0x9b, 0x93, 0x96,\n  0x75, 0x95, 0xba, 0xcb, 0x95, 0x4a, 0x51, 0x6a, 0x20, 0x10, 0x7a, 0x32,\n  0xb0, 0xa0, 0x06, 0x2c, 0xa8, 0x01, 0x0b, 0x6a, 0xa4, 0x2d, 0x50, 0x1b,\n  0x34, 0x09, 0xea, 0x80, 0xa6, 0x40, 0xd3, 0xa0, 0x19, 0xd0, 0x2c, 0x68,\n  0x0e, 0x34, 0x0f, 0x0a, 0xcf, 0x09, 0x96, 0xd6, 0x80, 0xa5, 0x35, 0x32,\n  0xc0, 0xcf, 0x00, 0x1f, 0x16, 0xd7, 0x80, 0xc5, 0x35, 0x60, 0x71, 0x0d,\n  0x58, 0x5c, 0x03, 0x16, 0xd7, 0x80, 0xc5, 0x35, 0x60, 0x71, 0x0d, 0x58,\n  0x5c, 0x03, 0x16, 0xd7, 0x80, 0xc5, 0x35, 0x60, 0x71, 0x0d, 0x58, 0x5c,\n  0x03, 0x16, 0xd7, 0x80, 0x85, 0x35, 0x60, 0x61, 0x0d, 0x58, 0x58, 0x03,\n  0x16, 0xd6, 0x80, 0x85, 0x35, 0x60, 0x61, 0x0d, 0x58, 0x58, 0x03, 0x16,\n  0xd6, 0x80, 0x85, 0x35, 0x60, 0x61, 0x0d, 0x58, 0x58, 0x03, 0x16, 0xd6,\n  0x80, 0x85, 0x35, 0x60, 0x51, 0x0d, 0x58, 0x54, 0x03, 0x16, 0xd5, 0x80,\n  0x45, 0x35, 0x60, 0x51, 0x0d, 0x58, 0x54, 0x03, 0x16, 0xd5, 0x80, 0x45,\n  0x35, 0x60, 0x51, 0x0d, 0x58, 0x54, 0x03, 0x16, 0xd5, 0x80, 0x45, 0x35,\n  0x60, 0x51, 0x8d, 0x5c, 0x84, 0x87, 0xfa, 0xc1, 0xa2, 0x1a, 0xb0, 0xa8,\n  0x06, 0x2c, 0xaa, 0x01, 0x8b, 0x6a, 0xc0, 0xa2, 0x1a, 0xb0, 0xa8, 0x06,\n  0x2c, 0xaa, 0x01, 0x8b, 0x6a, 0xc0, 0xa2, 0x1a, 0xb0, 0xa8, 0x06, 0x2c,\n  0xaa, 0x01, 0x8b, 0x6a, 0xc0, 0xa2, 0x1a, 0xb0, 0xa8, 0x06, 0x2c, 0xaa,\n  0x01, 0x8b, 0x6a, 0xc0, 0xa2, 0x1a, 0xb0, 0xa8, 0x06, 0x2c, 0xaa, 0x01,\n  0x8b, 0x6a, 0xc0, 0xa2, 0x1a, 0xb0, 0xa8, 0x06, 0x2c, 0xaa, 0x01, 0x8b,\n  0x6a, 0xc0, 0xa2, 0x1a, 0xb0, 0xa8, 0x06, 0x2c, 0xaa, 0x01, 0x8b, 0x6a,\n  0xc0, 0xa2, 0x1a, 0xb0, 0xa4, 0x06, 0x2c, 0xa9, 0x01, 0x4b, 0x6a, 0xc0,\n  0x92, 0x1a, 0xb0, 0xa4, 0x06, 0x2c, 0xa9, 0x01, 0x4b, 0x6a, 0xc0, 0x92,\n  0x1a, 0xb0, 0xa4, 0x06, 0x2c, 0xa9, 0x01, 0x4b, 0x6a, 0xc0, 0x92, 0x1a,\n  0xb0, 0xa4, 0x06, 0x2c, 0xa9, 0x01, 0x4b, 0x6a, 0xc0, 0x92, 0x1a, 0xb0,\n  0xa4, 0x06, 0x2c, 0xa9, 0x01, 0x0b, 0x6a, 0xc0, 0x82, 0x1a, 0xb0, 0xa0,\n  0x06, 0x2c, 0xa8, 0x01, 0x0b, 0x6a, 0xc0, 0x82, 0x1a, 0xb0, 0xa0, 0x06,\n  0x2c, 0xa8, 0x01, 0x0b, 0x6a, 0xc2, 0x22, 0x9a, 0xd1, 0x48, 0x01, 0x16,\n  0xd1, 0x84, 0x45, 0x34, 0x61, 0x11, 0x4d, 0x58, 0x44, 0x13, 0x16, 0xd1,\n  0x84, 0x45, 0x34, 0x61, 0x11, 0xcd, 0x8e, 0x88, 0x5f, 0x16, 0x34, 0x07,\n  0x9a, 0x07, 0x2d, 0x80, 0xba, 0xa0, 0x61, 0x3d, 0x4c, 0x58, 0x44, 0x13,\n  0x16, 0xd1, 0x84, 0x45, 0x34, 0x0d, 0xe0, 0x1b, 0xc0, 0x37, 0x80, 0x6f,\n  0x00, 0xdf, 0x00, 0xbe, 0x01, 0xfe, 0x06, 0xf8, 0x1b, 0xe0, 0x6f, 0x80,\n  0xbf, 0x09, 0xfe, 0x26, 0xf8, 0x9b, 0xe0, 0x6f, 0x82, 0xbf, 0x09, 0xfe,\n  0x26, 0xf8, 0x9b, 0xe0, 0x6f, 0x82, 0xbf, 0x89, 0xfa, 0x99, 0xa8, 0x9f,\n  0x89, 0xfa, 0x99, 0xa8, 0x9f, 0x09, 0x7c, 0x13, 0xf8, 0x26, 0xf0, 0x4d,\n  0xe0, 0x5b, 0xc0, 0xb7, 0x80, 0x6f, 0x01, 0xdf, 0x02, 0xbe, 0x05, 0x7c,\n  0x0b, 0xf8, 0x16, 0xf0, 0x2d, 0xe0, 0x5a, 0xc0, 0xb5, 0x80, 0x6b, 0x01,\n  0xd7, 0x02, 0xae, 0x05, 0x5c, 0x0b, 0xb8, 0x16, 0x70, 0x6d, 0xe0, 0xda,\n  0xc0, 0xb5, 0x81, 0x6b, 0x03, 0xd7, 0x06, 0xae, 0x0d, 0x5c, 0x1b, 0xb8,\n  0x36, 0xea, 0x6d, 0x03, 0xdf, 0x06, 0xbe, 0x0d, 0x7c, 0x1b, 0xf8, 0x36,\n  0xf0, 0x6d, 0xe0, 0xdb, 0xc0, 0xb7, 0x81, 0x8f, 0x11, 0xa4, 0x99, 0x04,\n  0x7e, 0x12, 0xf8, 0x49, 0xe0, 0x27, 0x81, 0x9f, 0x04, 0x7e, 0x12, 0xf8,\n  0x49, 0xe0, 0x27, 0x81, 0x9f, 0x04, 0x7e, 0x12, 0xb8, 0x49, 0xe0, 0x24,\n  0x81, 0x83, 0x91, 0xa9, 0x89, 0x91, 0xa9, 0x89, 0x91, 0xa9, 0x89, 0x91,\n  0xa9, 0x89, 0x91, 0xa9, 0x89, 0x91, 0xa9, 0x89, 0x91, 0xa9, 0x89, 0x91,\n  0xa9, 0xe9, 0xa4, 0x83, 0x59, 0xda, 0x05, 0xc5, 0x46, 0xb9, 0x8a, 0x14,\n  0xd4, 0x14, 0x63, 0x53, 0x13, 0x63, 0x53, 0x13, 0x63, 0x53, 0x13, 0x63,\n  0x53, 0x13, 0x63, 0x53, 0x13, 0x63, 0x53, 0x13, 0x63, 0x53, 0x13, 0x63,\n  0x53, 0x13, 0x63, 0x53, 0x13, 0x63, 0x53, 0x13, 0x63, 0x53, 0x33, 0xe5,\n  0x28, 0xc1, 0x24, 0x6a, 0x57, 0xa5, 0x56, 0x2f, 0x75, 0x23, 0x0d, 0xb5,\n  0xc5, 0xf8, 0xd4, 0xc4, 0xf8, 0xd4, 0x4c, 0xe5, 0xa4, 0x01, 0x7f, 0x42,\n  0xbf, 0x52, 0xea, 0x41, 0x02, 0x84, 0x48, 0xb9, 0x63, 0x07, 0x56, 0x97,\n  0xeb, 0xbd, 0xbd, 0xb5, 0xda, 0xda, 0x68, 0x02, 0x26, 0xbc, 0x02, 0x43,\n  0x6b, 0xc2, 0xd0, 0x9a, 0x30, 0xb4, 0x26, 0x0c, 0xad, 0x99, 0xb6, 0xc7,\n  0x94, 0xea, 0xbd, 0xf5, 0x23, 0x07, 0x8b, 0x8d, 0xb8, 0x20, 0x49, 0xe8,\n  0x1a, 0x1c, 0xa8, 0x88, 0x8d, 0xc6, 0xe0, 0x40, 0x35, 0x66, 0x04, 0x99,\n  0x60, 0x71, 0x4d, 0x58, 0x5c, 0x13, 0x16, 0xd7, 0x84, 0xc5, 0x35, 0x61,\n  0x71, 0x4d, 0x58, 0x5c, 0x13, 0x16, 0xd7, 0x84, 0xc5, 0x35, 0x61, 0x71,\n  0x4d, 0x32, 0xd6, 0x2d, 0x6d, 0x0c, 0x71, 0xc2, 0x38, 0xda, 0x25, 0x93,\n  0xd4, 0x7a, 0x2a, 0xb5, 0x46, 0xa3, 0x58, 0x09, 0xd1, 0x13, 0x5d, 0x75,\n  0x22, 0x59, 0xa3, 0xab, 0x37, 0x12, 0x04, 0x26, 0xd8, 0xcc, 0x64, 0x94,\n  0x52, 0xad, 0xbf, 0x54, 0x6d, 0x6e, 0x38, 0x98, 0x61, 0x13, 0x66, 0xd8,\n  0x24, 0x66, 0x78, 0x6d, 0x73, 0x25, 0x32, 0x1e, 0x7f, 0xa4, 0xdf, 0x46,\n  0x61, 0x0c, 0xc3, 0x5e, 0x33, 0x6b, 0xf2, 0xdd, 0x1b, 0x2b, 0x65, 0xb4,\n  0x69, 0xd6, 0x96, 0x83, 0x98, 0x2f, 0x1a, 0xdf, 0xa8, 0x0f, 0xa7, 0xa7,\n  0xe4, 0x46, 0x17, 0xd2, 0x91, 0x82, 0xa6, 0x80, 0x51, 0x36, 0x61, 0x94,\n  0x4d, 0x18, 0x65, 0x13, 0x46, 0xd9, 0x84, 0x51, 0x36, 0x31, 0xec, 0x35,\n  0x73, 0xd1, 0x34, 0x0e, 0xf0, 0x61, 0xa4, 0x4d, 0x18, 0x69, 0x13, 0x46,\n  0xda, 0x84, 0x91, 0x36, 0x61, 0xa4, 0x4d, 0x18, 0x69, 0x13, 0x46, 0xda,\n  0x84, 0x91, 0x36, 0x61, 0xa4, 0x4d, 0x18, 0x69, 0x13, 0xc6, 0xd9, 0x84,\n  0x71, 0x36, 0x61, 0x9c, 0x4d, 0x18, 0x67, 0x13, 0xc6, 0xd9, 0x84, 0x71,\n  0x36, 0x61, 0x9c, 0x4d, 0x18, 0x67, 0x13, 0xc6, 0xd9, 0x84, 0x31, 0x36,\n  0x61, 0x84, 0x4d, 0x18, 0x61, 0x13, 0x46, 0xd8, 0x84, 0x11, 0x36, 0x61,\n  0x84, 0x4d, 0x18, 0x61, 0x13, 0x46, 0xd8, 0x84, 0x11, 0x36, 0x61, 0x84,\n  0x4d, 0x18, 0x61, 0x13, 0x46, 0xd8, 0x84, 0x11, 0x36, 0x61, 0x84, 0x4d,\n  0x18, 0x61, 0x13, 0x46, 0xd5, 0x84, 0x51, 0x35, 0x61, 0x54, 0x4d, 0x18,\n  0x55, 0x13, 0x46, 0xd5, 0x84, 0x51, 0x35, 0x61, 0x54, 0x4d, 0x18, 0x55,\n  0x13, 0x46, 0xd5, 0x84, 0x51, 0x35, 0x61, 0x54, 0x4d, 0x18, 0x55, 0x13,\n  0x46, 0xd5, 0x84, 0x51, 0x35, 0x61, 0x54, 0x4d, 0x18, 0x55, 0x13, 0x46,\n  0xd5, 0x8c, 0xa6, 0xdb, 0xbc, 0x68, 0xda, 0x0c, 0xf8, 0x30, 0xaa, 0x26,\n  0x8c, 0xaa, 0x09, 0xa3, 0x6a, 0xc2, 0xa8, 0x9a, 0x30, 0xaa, 0x66, 0x64,\n  0x54, 0x31, 0x2c, 0x35, 0x31, 0x2c, 0x35, 0x31, 0x2c, 0x35, 0x31, 0x2c,\n  0x35, 0x31, 0x2c, 0x35, 0x3d, 0x4f, 0xf3, 0x3b, 0x67, 0xb1, 0xb3, 0xb6,\n  0xae, 0xd4, 0x55, 0xeb, 0xeb, 0x0c, 0x27, 0xf5, 0xa0, 0x30, 0x2c, 0x28,\n  0x0c, 0x0b, 0xca, 0xc0, 0xc2, 0x64, 0x95, 0x85, 0xc9, 0x2a, 0x0b, 0xba,\n  0xc0, 0xc2, 0x64, 0x95, 0x85, 0xbb, 0x60, 0xa1, 0xd5, 0xad, 0x82, 0xcd,\n  0xf5, 0xf7, 0x96, 0xa3, 0x19, 0xc3, 0x14, 0x68, 0x1a, 0x34, 0x03, 0x0a,\n  0xe6, 0xf0, 0x77, 0xac, 0x42, 0x34, 0xd3, 0x08, 0xe6, 0x85, 0x88, 0x79,\n  0xd8, 0x44, 0x16, 0x6e, 0x91, 0x85, 0x5b, 0x64, 0xa1, 0xc9, 0x2c, 0x2f,\n  0x8a, 0x63, 0x66, 0x12, 0xfe, 0x88, 0x85, 0xa6, 0xb3, 0xd0, 0x74, 0x16,\n  0x9a, 0xce, 0x42, 0xd3, 0x59, 0x68, 0x3a, 0x0b, 0x4d, 0x67, 0xa1, 0xe9,\n  0x2c, 0x34, 0x9d, 0x85, 0xa6, 0xb3, 0xd0, 0x74, 0x16, 0x9a, 0xce, 0x8a,\n  0x46, 0xf4, 0x06, 0x46, 0xe0, 0x06, 0x46, 0xe0, 0xf0, 0x07, 0x92, 0xa1,\n  0x3f, 0x40, 0xdc, 0xc3, 0x0e, 0x50, 0x03, 0xd4, 0x04, 0xb5, 0x40, 0x6d,\n  0xd0, 0x24, 0xa8, 0x03, 0x9a, 0x02, 0x4d, 0x83, 0x66, 0x40, 0xb3, 0xa0,\n  0x39, 0xd0, 0x3c, 0x68, 0x84, 0xe7, 0x82, 0x86, 0x23, 0xaa, 0x82, 0x01,\n  0x7c, 0x03, 0xf8, 0x06, 0xf0, 0x31, 0xe2, 0x2f, 0x18, 0xc0, 0x37, 0x80,\n  0x6f, 0x00, 0xdf, 0x00, 0xbe, 0x01, 0x7c, 0x03, 0xf8, 0x06, 0xf0, 0x0d,\n  0xe0, 0x1b, 0xc0, 0x8f, 0xea, 0x6b, 0x00, 0xdf, 0x00, 0xbe, 0x09, 0x7c,\n  0x13, 0xf8, 0x26, 0xf0, 0x4d, 0xe0, 0x9b, 0xc0, 0x37, 0x81, 0x6f, 0x02,\n  0xdf, 0x04, 0xbe, 0x09, 0x7c, 0x13, 0xf8, 0x26, 0xf0, 0x4d, 0xe0, 0x9b,\n  0xc0, 0x37, 0x81, 0x6f, 0x02, 0xdf, 0x04, 0xbe, 0x05, 0x7c, 0x0b, 0xf8,\n  0x16, 0xf0, 0x2d, 0xe0, 0x5b, 0xc0, 0xb7, 0x80, 0x6f, 0x01, 0xdf, 0x02,\n  0xbe, 0x05, 0x7c, 0x0b, 0xf8, 0x16, 0xf0, 0x2d, 0xe0, 0x5b, 0xc0, 0xb7,\n  0x80, 0x8f, 0x99, 0xf0, 0x02, 0x66, 0xc2, 0x0b, 0x36, 0xf0, 0x6d, 0xe0,\n  0xdb, 0xc0, 0xb7, 0x81, 0x6f, 0x03, 0xdf, 0x06, 0xbe, 0x0d, 0x7c, 0x1b,\n  0xf8, 0x36, 0xf0, 0x6d, 0xe0, 0xdb, 0xc0, 0xb7, 0x81, 0x6f, 0x03, 0xdf,\n  0x06, 0xbe, 0x0d, 0x7c, 0x1b, 0xf8, 0x49, 0xe0, 0x27, 0x81, 0x9f, 0x04,\n  0x7e, 0x12, 0xf8, 0x49, 0xe0, 0x27, 0x81, 0x9f, 0x04, 0x7e, 0x12, 0xf8,\n  0x49, 0xe0, 0x27, 0x81, 0x9f, 0x04, 0x7e, 0x12, 0xf8, 0x49, 0xe0, 0x27,\n  0x81, 0x9f, 0x04, 0x7e, 0x12, 0xf8, 0x0e, 0xf0, 0x1d, 0xe0, 0x3b, 0xc0,\n  0x77, 0x80, 0xef, 0x00, 0xdf, 0x01, 0xbe, 0x03, 0x7c, 0x07, 0xf8, 0x0e,\n  0xf0, 0x1d, 0xe0, 0x3b, 0xc0, 0x77, 0x80, 0xef, 0x00, 0xdf, 0x01, 0xbe,\n  0x03, 0x7c, 0x07, 0xf8, 0x29, 0xe0, 0xa7, 0x80, 0x9f, 0x02, 0x7e, 0x0a,\n  0xf8, 0x29, 0xe0, 0xa7, 0x80, 0x9f, 0x02, 0x7e, 0x0a, 0xf8, 0x29, 0xe0,\n  0xa7, 0x80, 0x9f, 0x02, 0x7e, 0x0a, 0xf8, 0x29, 0xe0, 0xa7, 0x80, 0x9f,\n  0x02, 0x7e, 0x0a, 0xf8, 0x69, 0xe0, 0xa7, 0x81, 0x9f, 0x06, 0x7e, 0x1a,\n  0xf8, 0x69, 0xe0, 0xa7, 0x81, 0x9f, 0x06, 0x7e, 0x1a, 0xf8, 0x69, 0xe0,\n  0xa7, 0x81, 0x9f, 0x06, 0x7e, 0x1a, 0xf8, 0x69, 0xe0, 0xa7, 0x81, 0x9f,\n  0x06, 0x7e, 0x1a, 0xf8, 0x19, 0xe0, 0x67, 0x80, 0x9f, 0x01, 0x7e, 0x06,\n  0xf8, 0x19, 0xe0, 0x67, 0x80, 0x9f, 0x01, 0x7e, 0x06, 0xf8, 0x19, 0xe0,\n  0x67, 0x80, 0x9f, 0x01, 0x7e, 0x06, 0xf8, 0x19, 0xe0, 0x67, 0x80, 0x9f,\n  0x01, 0x7e, 0x06, 0xf8, 0x98, 0x51, 0x2c, 0x60, 0x46, 0xb1, 0x80, 0x19,\n  0xc5, 0x02, 0x66, 0x14, 0x0b, 0x98, 0x51, 0x2c, 0x60, 0x46, 0xb1, 0x80,\n  0x19, 0xc5, 0x02, 0x66, 0x14, 0x0b, 0x98, 0x51, 0x2c, 0x60, 0x46, 0xb1,\n  0x80, 0x19, 0xc5, 0x02, 0x66, 0x14, 0x0b, 0x98, 0x51, 0x2c, 0x60, 0x46,\n  0xb1, 0x80, 0x19, 0xc5, 0x02, 0x66, 0x14, 0x0b, 0x98, 0x51, 0x2c, 0x60,\n  0x46, 0xb1, 0x80, 0x19, 0xc5, 0x02, 0x66, 0x14, 0x0b, 0x98, 0x51, 0x2c,\n  0x60, 0x46, 0xb1, 0x80, 0x19, 0xc5, 0x02, 0x66, 0x14, 0x0b, 0x98, 0x51,\n  0x2c, 0x60, 0x46, 0xb1, 0x80, 0x19, 0xc5, 0x02, 0x66, 0x14, 0x0b, 0x98,\n  0x51, 0x2c, 0x60, 0x46, 0xb1, 0x80, 0x19, 0xc5, 0x42, 0x34, 0xa3, 0x08,\n  0x7d, 0xef, 0x42, 0xdf, 0xbb, 0xd0, 0xf7, 0x2e, 0xf4, 0xbd, 0x0b, 0x7d,\n  0xef, 0x42, 0xdf, 0xbb, 0xd0, 0xf7, 0x2e, 0xf4, 0xbd, 0x0b, 0x7d, 0xef,\n  0x42, 0xdf, 0xbb, 0xd0, 0xf7, 0x2e, 0xf4, 0xbd, 0x0b, 0x7d, 0xef, 0x42,\n  0xdf, 0xbb, 0xd0, 0xf7, 0x2e, 0xf4, 0xbd, 0x0b, 0x7d, 0xef, 0x46, 0x33,\n  0xbc, 0xd0, 0xf7, 0x2e, 0xf4, 0xbd, 0x0b, 0x7d, 0xef, 0x42, 0xdf, 0xbb,\n  0xd0, 0xf7, 0x2e, 0xf4, 0xbd, 0x0b, 0x7d, 0xef, 0x42, 0xdf, 0xbb, 0xd0,\n  0xf7, 0x2e, 0xf4, 0xbd, 0x0b, 0x7d, 0xef, 0x42, 0xdf, 0xbb, 0xd0, 0xf7,\n  0x2e, 0xf4, 0xbd, 0x0b, 0x7d, 0xef, 0x42, 0xdf, 0xbb, 0xd0, 0xf7, 0x2e,\n  0xf4, 0xbd, 0x0b, 0x7d, 0xef, 0x42, 0xdf, 0xbb, 0xd0, 0xf7, 0x2e, 0xf4,\n  0xbd, 0x0b, 0x7d, 0xef, 0x42, 0xdf, 0xbb, 0xd0, 0xf7, 0x2e, 0xf4, 0xbd,\n  0x0b, 0x7d, 0xef, 0x42, 0xdf, 0xbb, 0xd0, 0xf7, 0x2e, 0xf4, 0xbd, 0x0b,\n  0x7d, 0xef, 0x42, 0xdf, 0xbb, 0xd0, 0xf7, 0x2e, 0xf4, 0xbd, 0x6b, 0x45,\n  0x2b, 0x98, 0xc0, 0x87, 0xbe, 0x77, 0xa1, 0xef, 0x5d, 0xe8, 0x7b, 0x17,\n  0xfa, 0xde, 0x85, 0xbe, 0x77, 0xa1, 0xef, 0x5d, 0xe8, 0x77, 0x17, 0xfa,\n  0xdd, 0x85, 0x7e, 0x77, 0xa1, 0xdf, 0x5d, 0xe8, 0x77, 0x17, 0xfa, 0xdd,\n  0x85, 0x7e, 0x77, 0xa1, 0xdf, 0x5d, 0xe8, 0x77, 0x17, 0xfa, 0xdd, 0x85,\n  0x7e, 0x77, 0xa1, 0xdf, 0x5d, 0xe8, 0x77, 0xd7, 0x8e, 0xf0, 0x50, 0x5f,\n  0xe8, 0x77, 0x17, 0xfa, 0xdd, 0x85, 0x7e, 0x77, 0xa1, 0xdf, 0x5d, 0xe8,\n  0x77, 0x17, 0xfa, 0xdd, 0x85, 0x7e, 0x77, 0xa1, 0xdf, 0x5d, 0xe8, 0x77,\n  0x17, 0xfa, 0xdd, 0x85, 0x7e, 0x77, 0xa1, 0xdf, 0x5d, 0xe8, 0x77, 0x17,\n  0xfa, 0xdd, 0x85, 0x7e, 0x77, 0xa1, 0xdf, 0x5d, 0xe8, 0x77, 0x17, 0xfa,\n  0xdd, 0x85, 0x7e, 0x77, 0xa1, 0xdf, 0x5d, 0xe8, 0x77, 0x17, 0xfa, 0xdd,\n  0x85, 0x7e, 0x77, 0xa1, 0xdf, 0x5d, 0xe8, 0x77, 0x17, 0xfa, 0xdd, 0x85,\n  0x7e, 0x77, 0xa1, 0xdf, 0x5d, 0xe8, 0x77, 0x17, 0xfa, 0xdd, 0x85, 0x7e,\n  0x77, 0xa1, 0xdf, 0x5d, 0xe8, 0x77, 0x17, 0xfa, 0xdd, 0x85, 0x7e, 0x77,\n  0xa1, 0xdf, 0x5d, 0xe8, 0x77, 0x17, 0xfa, 0xdd, 0x85, 0x7e, 0x77, 0xa1,\n  0xdf, 0x5d, 0xe8, 0x77, 0x17, 0xfa, 0xdd, 0x85, 0x7e, 0x77, 0xa1, 0xdf,\n  0x5d, 0xe8, 0x77, 0x17, 0xfa, 0xdd, 0x85, 0x7e, 0x77, 0xa1, 0xdf, 0x5d,\n  0xe8, 0x77, 0x17, 0xfa, 0xda, 0x85, 0xbe, 0x76, 0xa1, 0xaf, 0x5d, 0xe8,\n  0x6b, 0x17, 0xfa, 0xda, 0x85, 0xbe, 0x76, 0xa1, 0xaf, 0x5d, 0xe8, 0x6b,\n  0x17, 0xfa, 0xda, 0x85, 0xbe, 0x76, 0xa1, 0xaf, 0x5d, 0xe8, 0x6b, 0x17,\n  0xfa, 0xda, 0x85, 0xbe, 0x76, 0xa1, 0xaf, 0x5d, 0xe8, 0x6b, 0x17, 0xfa,\n  0xda, 0x85, 0xbe, 0x76, 0xa1, 0xaf, 0x5d, 0xe8, 0x6b, 0x17, 0xfa, 0xda,\n  0x85, 0xbe, 0xf6, 0xe0, 0x8f, 0x7a, 0xf0, 0x47, 0x3d, 0xe8, 0x27, 0x0f,\n  0xfa, 0xc9, 0x83, 0x7e, 0xf2, 0xa0, 0x9f, 0x3c, 0xe8, 0x27, 0x0f, 0xfa,\n  0xc9, 0x83, 0x7e, 0xf2, 0xa0, 0x9f, 0x3c, 0xe8, 0x27, 0xaf, 0x23, 0xe2,\n  0x9f, 0x07, 0x2d, 0x80, 0xba, 0xa0, 0x61, 0xfd, 0x3c, 0xe8, 0x27, 0x0f,\n  0xfa, 0xc9, 0x83, 0x7e, 0xf2, 0xa0, 0x9f, 0x3c, 0xe8, 0x27, 0x0f, 0xfa,\n  0xc9, 0x83, 0x3e, 0xf2, 0xa0, 0x8f, 0x3c, 0xe8, 0x23, 0x0f, 0xfa, 0xc8,\n  0x83, 0x3e, 0xf2, 0xa0, 0x8f, 0x3c, 0xe8, 0x1f, 0x0f, 0xfa, 0xc7, 0x83,\n  0xfe, 0xf1, 0xa0, 0x7f, 0x3c, 0xe8, 0x1f, 0x0f, 0xfa, 0xc7, 0x83, 0xfe,\n  0xf1, 0xa0, 0x7f, 0x3c, 0xe8, 0x1f, 0x0f, 0xfa, 0xc7, 0x83, 0xfe, 0xf1,\n  0xa0, 0x7f, 0x3c, 0xe8, 0x1f, 0xcf, 0x8c, 0xf0, 0x50, 0x3f, 0xe8, 0x1f,\n  0x0f, 0xfa, 0xc7, 0x83, 0xfe, 0xf1, 0xa0, 0x7f, 0x3c, 0xe8, 0x1f, 0x0f,\n  0xfa, 0xc7, 0x83, 0xfe, 0xf1, 0xa0, 0x7f, 0x3c, 0xe8, 0x1f, 0x0f, 0xfa,\n  0xc7, 0x83, 0xfe, 0xf1, 0xa0, 0x7f, 0x3c, 0xe8, 0x1f, 0x0f, 0xfa, 0xc7,\n  0x83, 0xfe, 0xf1, 0xe0, 0x6f, 0x7a, 0xf0, 0x37, 0x3d, 0xe8, 0x23, 0x0f,\n  0xfa, 0xc8, 0x83, 0x3e, 0xf2, 0xa0, 0x8f, 0x3c, 0xe8, 0x23, 0x0f, 0xfa,\n  0xc8, 0x83, 0xfe, 0xf1, 0xa0, 0x7f, 0x3c, 0xe8, 0x1f, 0x0f, 0xfa, 0xc7,\n  0x83, 0xfe, 0xf1, 0xa0, 0x7f, 0x3c, 0xe8, 0x1b, 0x0f, 0xfa, 0xc6, 0x83,\n  0xbe, 0xf1, 0xa0, 0x6f, 0x3c, 0xe8, 0x1b, 0x0f, 0xfa, 0xc6, 0x83, 0xbe,\n  0xf1, 0xa0, 0x6f, 0x3c, 0xe8, 0x19, 0x0f, 0xfa, 0xc5, 0x4b, 0x46, 0x7c,\n  0x21, 0x3f, 0xf4, 0x89, 0x07, 0x7d, 0xe2, 0x41, 0x9f, 0x78, 0xd0, 0x27,\n  0x1e, 0xf4, 0x89, 0x07, 0x7d, 0xe2, 0x41, 0x9f, 0x78, 0xd0, 0x27, 0x1e,\n  0xf4, 0x89, 0x07, 0x7d, 0xe2, 0x41, 0x9f, 0x78, 0xd0, 0x27, 0x1e, 0xf4,\n  0x89, 0x07, 0x7d, 0xe2, 0x41, 0x9f, 0x78, 0xd0, 0x27, 0x1e, 0xf4, 0x89,\n  0x07, 0x7d, 0xe2, 0x41, 0x9f, 0x78, 0xd0, 0x27, 0x1e, 0xf4, 0x89, 0x07,\n  0x7d, 0xe2, 0x41, 0x9f, 0x78, 0xd0, 0x27, 0x1e, 0xf4, 0x89, 0x07, 0x7d,\n  0xe2, 0x41, 0x9f, 0x78, 0xd0, 0x27, 0x1e, 0xf4, 0x89, 0x07, 0x7d, 0xe2,\n  0xc1, 0x3f, 0xf4, 0xe0, 0x1f, 0x7a, 0xf0, 0x0f, 0x3d, 0xf8, 0x87, 0x1e,\n  0xfc, 0x43, 0x0f, 0xfe, 0xa1, 0x07, 0x7d, 0xe3, 0x41, 0xdf, 0x78, 0xd0,\n  0x37, 0x1e, 0xf4, 0x8d, 0x07, 0x7d, 0xe3, 0x41, 0xdf, 0x78, 0xd0, 0x37,\n  0x5e, 0x3a, 0xc2, 0x43, 0x7d, 0xa1, 0x6f, 0x3c, 0xe8, 0x1b, 0x0f, 0xfa,\n  0xc6, 0x83, 0xbe, 0xf1, 0xa0, 0x6f, 0x3c, 0xe8, 0x1b, 0x0f, 0xfa, 0xc6,\n  0x83, 0xbe, 0xf1, 0xa0, 0x6f, 0x3c, 0xe8, 0x1b, 0x0f, 0xfa, 0xc6, 0x83,\n  0xbe, 0xf1, 0x22, 0x7d, 0x03, 0xff, 0xd0, 0x83, 0x7f, 0xe8, 0xc1, 0x3f,\n  0xf4, 0xe0, 0x1f, 0x7a, 0xf0, 0x0f, 0x3d, 0xf8, 0x87, 0x1e, 0xfc, 0x43,\n  0x0f, 0xfe, 0xa1, 0x07, 0xff, 0xd0, 0x83, 0x7f, 0xe8, 0xc1, 0x3f, 0xf4,\n  0xe0, 0x1f, 0x7a, 0xf0, 0x0f, 0x3d, 0xf8, 0x87, 0x1e, 0xfc, 0x43, 0x0f,\n  0xfe, 0xa1, 0x07, 0xff, 0xd0, 0x83, 0x7f, 0xe8, 0xc1, 0x3f, 0xf4, 0xe0,\n  0x1f, 0x7a, 0xf0, 0x0f, 0x3d, 0xf8, 0x87, 0x1e, 0xfc, 0x43, 0x0f, 0xfe,\n  0xa1, 0x07, 0xff, 0xd0, 0x83, 0x5f, 0xe8, 0xc1, 0x2f, 0xf4, 0xe0, 0x17,\n  0x7a, 0xf0, 0x0b, 0x3d, 0xf8, 0x85, 0x1e, 0xfc, 0x42, 0x0f, 0x7e, 0xa1,\n  0x07, 0xbf, 0xd0, 0x83, 0x5f, 0xe8, 0xc1, 0x2f, 0xf4, 0xb0, 0xd2, 0xec,\n  0x61, 0xa5, 0xd9, 0xc3, 0x4a, 0xb3, 0x87, 0x95, 0x66, 0x0f, 0x2b, 0xcd,\n  0x1e, 0x56, 0x98, 0x3d, 0xac, 0x30, 0x7b, 0x58, 0x61, 0xf6, 0xb0, 0xc2,\n  0xec, 0x61, 0x85, 0xd9, 0xc3, 0x0a, 0xb3, 0x87, 0x15, 0x66, 0x0f, 0x2b,\n  0xcc, 0x1e, 0x56, 0x98, 0x3d, 0xac, 0x30, 0x7b, 0x58, 0x61, 0xf6, 0xb0,\n  0xc2, 0xec, 0x61, 0x85, 0xd9, 0xc3, 0x0a, 0xb3, 0x87, 0x15, 0x65, 0x0f,\n  0x2b, 0xca, 0x1e, 0x56, 0x94, 0x3d, 0xac, 0x28, 0x7b, 0x58, 0x51, 0xf6,\n  0xb0, 0xa2, 0xec, 0x61, 0x25, 0xd9, 0xc3, 0x4a, 0xb2, 0x87, 0x95, 0x64,\n  0x0f, 0x2b, 0xc9, 0x1e, 0x56, 0x92, 0x3d, 0xac, 0x24, 0x7b, 0x58, 0x49,\n  0xf6, 0xb0, 0x92, 0xec, 0x61, 0x25, 0xd9, 0xc3, 0x4a, 0xb2, 0x87, 0x95,\n  0x64, 0x0f, 0x2b, 0xc9, 0x1e, 0x56, 0x92, 0x3d, 0xac, 0x24, 0x7b, 0x58,\n  0x49, 0xf6, 0xb0, 0x92, 0xec, 0x61, 0x25, 0xd9, 0xc3, 0x4a, 0xb2, 0x87,\n  0x95, 0x64, 0xcf, 0x03, 0x9e, 0x07, 0x3c, 0xac, 0x24, 0x7b, 0x58, 0x41,\n  0xf6, 0xb0, 0x82, 0xec, 0x61, 0x05, 0xd9, 0xf3, 0x80, 0xe3, 0x01, 0xc7,\n  0x03, 0x8e, 0x07, 0x1c, 0x0f, 0x38, 0xe1, 0xfc, 0x8f, 0xd9, 0x11, 0xda,\n  0x39, 0x42, 0x0b, 0xa0, 0x51, 0xba, 0x17, 0x52, 0x03, 0x6f, 0xe8, 0x19,\n  0x78, 0x13, 0xcf, 0x40, 0xba, 0x89, 0x37, 0xef, 0x42, 0x7b, 0x42, 0x28,\n  0xf8, 0x98, 0xe0, 0x63, 0x82, 0x8f, 0x89, 0xfc, 0x16, 0xde, 0xec, 0xb3,\n  0x90, 0x9e, 0x04, 0x75, 0xc0, 0xc7, 0x01, 0x1f, 0x07, 0x7c, 0x1c, 0xf0,\n  0x71, 0xa2, 0x7c, 0x9e, 0xba, 0xb1, 0x34, 0x50, 0x8b, 0x5e, 0x27, 0x54,\n  0xea, 0xe5, 0xa3, 0xe2, 0x77, 0x10, 0xab, 0xe5, 0x6a, 0x69, 0xe4, 0x7b,\n  0x86, 0x19, 0xbc, 0x67, 0x98, 0xc1, 0x7b, 0x86, 0x19, 0xd4, 0x22, 0x83,\n  0xf7, 0x0c, 0x33, 0x90, 0x26, 0x8b, 0x7c, 0x59, 0xe4, 0xcb, 0x22, 0x5f,\n  0x16, 0xef, 0x1f, 0x66, 0x51, 0xeb, 0x2c, 0xde, 0x3b, 0xcc, 0x46, 0xeb,\n  0xf3, 0x90, 0x2e, 0x0b, 0xe9, 0xb2, 0xa8, 0x65, 0x0e, 0xfc, 0x72, 0xe0,\n  0x97, 0x03, 0xbf, 0x1c, 0x70, 0x73, 0xc0, 0xcd, 0x81, 0x7f, 0x0e, 0xfc,\n  0xc2, 0xd9, 0x3f, 0xd3, 0x08, 0x47, 0x2f, 0xa6, 0x11, 0x5a, 0x29, 0x42,\n  0x5d, 0xa9, 0x56, 0x2d, 0x35, 0x7a, 0xcb, 0x03, 0xdd, 0x72, 0x63, 0x7d,\n  0x2d, 0x08, 0xd4, 0xc3, 0x4b, 0xa1, 0x42, 0x35, 0x93, 0xe1, 0x83, 0x62,\n  0xe6, 0x43, 0x83, 0x43, 0xa8, 0x01, 0x6a, 0x82, 0x5a, 0xa0, 0x36, 0x68,\n  0x12, 0xd4, 0x01, 0x4d, 0x81, 0xa6, 0x41, 0x33, 0xa0, 0x59, 0xd0, 0x1c,\n  0x68, 0x84, 0x13, 0x8a, 0x96, 0x4f, 0x01, 0x27, 0x05, 0x9c, 0x14, 0x70,\n  0x52, 0xc0, 0x49, 0x01, 0x27, 0x05, 0x9c, 0xd0, 0xb0, 0x98, 0x18, 0xa0,\n  0x65, 0x53, 0x31, 0x4d, 0x83, 0x66, 0x40, 0xb3, 0xa0, 0x39, 0xd0, 0x3c,\n  0x68, 0x01, 0xd4, 0x05, 0xf5, 0x42, 0x1a, 0x3a, 0x4a, 0x84, 0x1a, 0x21,\n  0x4d, 0x83, 0x5f, 0x1a, 0xfc, 0xd2, 0xe0, 0x97, 0x06, 0xbf, 0xd0, 0x90,\n  0x78, 0x18, 0xe0, 0x79, 0x18, 0xe0, 0x79, 0x18, 0xe0, 0x11, 0x6a, 0x8d,\n  0x0f, 0x26, 0x46, 0x73, 0x46, 0x87, 0xd5, 0x61, 0x77, 0x58, 0x86, 0x45,\n  0x68, 0xc7, 0x66, 0xd2, 0x8c, 0x51, 0x69, 0xf6, 0x66, 0xf2, 0xd9, 0xa3,\n  0xf2, 0x39, 0x9b, 0xe1, 0xe7, 0x6c, 0x86, 0x9f, 0xb3, 0x19, 0x7e, 0xce,\n  0x28, 0x7e, 0x99, 0xcd, 0xc8, 0x97, 0xd9, 0x8c, 0x7c, 0x99, 0xcd, 0xc8,\n  0x97, 0xd9, 0x8c, 0x7c, 0x99, 0xcd, 0xc8, 0x97, 0xd9, 0x8c, 0x7c, 0x99,\n  0xcd, 0xc8, 0x97, 0xf9, 0x6f, 0xf9, 0xf2, 0xc9, 0xff, 0x96, 0x6f, 0x44,\n  0xda, 0xe8, 0x7c, 0xf6, 0x66, 0xf2, 0x8d, 0xe6, 0xe7, 0x6c, 0x86, 0x9f,\n  0xb3, 0x19, 0x7e, 0xce, 0x66, 0xf8, 0x6d, 0xae, 0xfd, 0xd2, 0x21, 0xce,\n  0x88, 0x7a, 0x44, 0x69, 0xa3, 0xf3, 0x39, 0x9b, 0xc9, 0xe7, 0x8c, 0xc2,\n  0x1d, 0xc5, 0x6f, 0x44, 0xda, 0xe8, 0x7c, 0xce, 0x66, 0xf2, 0x05, 0xfc,\n  0x24, 0xb7, 0xda, 0x33, 0xbb, 0x58, 0x69, 0xc4, 0x01, 0x33, 0x0a, 0xe0,\n  0xed, 0x3a, 0xac, 0xe5, 0x27, 0xb1, 0x96, 0x9f, 0xc4, 0x5a, 0x7e, 0x12,\n  0x6b, 0xf9, 0x49, 0x03, 0x6f, 0xd7, 0x19, 0x78, 0xbb, 0x0e, 0x6b, 0xf9,\n  0x49, 0xac, 0xe5, 0x27, 0xb1, 0x96, 0x9f, 0xc4, 0x5a, 0x7e, 0x12, 0x6b,\n  0xf9, 0x49, 0xac, 0xe5, 0x27, 0xb1, 0x96, 0x9f, 0xc4, 0x5a, 0x7e, 0x12,\n  0x6b, 0xf9, 0x49, 0x13, 0x6f, 0x61, 0xe7, 0xb2, 0xec, 0xea, 0x23, 0x56,\n  0xf3, 0xe4, 0xff, 0x11, 0xe5, 0xe0, 0xb7, 0xa2, 0x2f, 0x58, 0x30, 0xab,\n  0xaf, 0xdc, 0xdd, 0x5d, 0x29, 0x1d, 0x54, 0xaa, 0xd4, 0x7b, 0xf9, 0xfd,\n  0xfd, 0xe5, 0x98, 0xc4, 0x9c, 0xd2, 0x40, 0x5f, 0xb1, 0xda, 0xdd, 0x59,\n  0xa9, 0x8b, 0xcb, 0x82, 0xb5, 0xc4, 0xa2, 0x76, 0xe0, 0x88, 0x6c, 0x2b,\n  0x2b, 0xb5, 0x5a, 0x3f, 0xd4, 0x03, 0xd4, 0x57, 0x38, 0x2e, 0x25, 0x34,\n  0x7a, 0xbc, 0x4d, 0x50, 0x1b, 0xd4, 0x01, 0xc5, 0x63, 0x6e, 0xe2, 0xf1,\n  0x36, 0xa1, 0x26, 0x4c, 0xa8, 0x07, 0x0b, 0xe5, 0x2c, 0x94, 0xb3, 0x50,\n  0xce, 0x42, 0x39, 0x0b, 0xe5, 0x2c, 0x94, 0xb3, 0x50, 0xce, 0x86, 0x3a,\n  0xb1, 0x51, 0xde, 0x46, 0x79, 0x1b, 0xe5, 0x6d, 0x94, 0xb7, 0x51, 0xde,\n  0x46, 0x79, 0x1b, 0xe5, 0x93, 0x28, 0x9f, 0x44, 0xf9, 0x24, 0xca, 0x27,\n  0x51, 0x3e, 0x89, 0xf2, 0x49, 0x94, 0x4f, 0xa2, 0x7c, 0x12, 0xe5, 0x1d,\n  0x94, 0x77, 0x50, 0xce, 0x41, 0x39, 0x07, 0xe5, 0x1c, 0x94, 0x73, 0x50,\n  0xce, 0x41, 0xb9, 0x14, 0xd4, 0x5d, 0x0a, 0x6a, 0x2e, 0x05, 0x75, 0x99,\n  0xc2, 0xf5, 0x34, 0xf8, 0xa6, 0x21, 0x57, 0x1a, 0xfc, 0xd3, 0xe0, 0x9f,\n  0x46, 0xfe, 0x0c, 0xf2, 0x65, 0x90, 0x2f, 0x8b, 0x78, 0x36, 0x8a, 0xa3,\n  0x5c, 0x16, 0xe5, 0xb2, 0x90, 0x2b, 0x0b, 0xb9, 0xb2, 0xc0, 0xcf, 0x42,\n  0xbe, 0x2c, 0xf8, 0xe6, 0xc0, 0x27, 0x07, 0x35, 0x9d, 0x03, 0xbf, 0xd0,\n  0x32, 0x12, 0x0a, 0xbe, 0x39, 0x67, 0x42, 0xf3, 0x57, 0x97, 0xb3, 0x2b,\n  0xb5, 0xae, 0xca, 0xfe, 0xd9, 0xb9, 0x13, 0x16, 0x6e, 0x26, 0xb1, 0x0d,\n  0x5f, 0xc9, 0x06, 0xf1, 0x85, 0xd9, 0x03, 0xdb, 0xdc, 0x51, 0xf1, 0x79,\n  0xa3, 0xe2, 0xcb, 0x47, 0xc6, 0x85, 0x79, 0xb3, 0xeb, 0xe4, 0xa9, 0x12,\n  0xe7, 0xed, 0x17, 0x50, 0x65, 0x5e, 0xf0, 0x1d, 0x07, 0xc2, 0xc1, 0x17,\n  0x89, 0x41, 0x58, 0xc5, 0x8b, 0x52, 0x41, 0x64, 0xcc, 0xbc, 0xe1, 0xef,\n  0x08, 0x87, 0xaf, 0x9a, 0x1d, 0xe9, 0x20, 0xa2, 0xcf, 0x8b, 0xbe, 0xfc,\n  0x88, 0xaf, 0xf9, 0x53, 0x7b, 0x41, 0xa4, 0x6d, 0x5e, 0xfc, 0x71, 0x61,\n  0xd3, 0xc5, 0x7c, 0x16, 0x78, 0xc1, 0x17, 0x22, 0xcd, 0x17, 0xd2, 0xcd,\n  0xec, 0xc3, 0x5c, 0x2a, 0xbe, 0x88, 0x45, 0x04, 0xb5, 0xf1, 0x23, 0x13,\n  0x10, 0x39, 0x02, 0x55, 0x03, 0xd3, 0xe0, 0xa3, 0xcb, 0x66, 0x51, 0xf2,\n  0x41, 0x44, 0x08, 0x2b, 0x3c, 0x66, 0xbf, 0xcd, 0xd5, 0xc5, 0xc8, 0xa7,\n  0x9a, 0x23, 0x21, 0x32, 0x1e, 0xe0, 0x52, 0x22, 0xf8, 0xb4, 0xae, 0xe2,\n  0xbf, 0xe5, 0x21, 0x94, 0xaa, 0xb5, 0x46, 0x57, 0xaf, 0x16, 0xbc, 0x4b,\n  0x10, 0xbd, 0x02, 0x31, 0x76, 0x44, 0x2c, 0x78, 0x63, 0xa0, 0x14, 0xbe,\n  0x47, 0x20, 0xd7, 0xbb, 0x7a, 0xd7, 0x17, 0xfd, 0x14, 0xa9, 0x4c, 0x1a,\n  0xa2, 0x52, 0xaa, 0xd7, 0xa5, 0x35, 0x08, 0xe8, 0x95, 0x4a, 0xb3, 0x5e,\n  0x10, 0x83, 0x6f, 0x2f, 0x8f, 0x68, 0x8c, 0x0f, 0x68, 0x77, 0xb9, 0x48,\n  0xaa, 0x56, 0xac, 0xf8, 0x1f, 0xc8, 0xae, 0x2d, 0xb5, 0x05, 0x69, 0xbd,\n  0xe5, 0x9e, 0xde, 0x30, 0xae, 0xd7, 0x2a, 0xb5, 0xf5, 0xfe, 0x97, 0x99,\n  0xe5, 0x6a, 0xbd, 0xdc, 0x5d, 0x62, 0x49, 0xb1, 0x44, 0x7d, 0xb0, 0xb3,\n  0xde, 0x35, 0x50, 0xee, 0x6f, 0xac, 0x51, 0x42, 0xec, 0x81, 0x46, 0xb1,\n  0x5c, 0x81, 0x7e, 0x40, 0x7f, 0x0b, 0x75, 0x1b, 0xa1, 0x70, 0x43, 0x4c,\n  0x3c, 0x3f, 0x26, 0xfa, 0xaf, 0x89, 0x7e, 0x6b, 0x42, 0x0f, 0x59, 0xe8,\n  0xbf, 0x16, 0xfa, 0xaf, 0x05, 0x3e, 0x16, 0xf8, 0x58, 0xe0, 0x63, 0x81,\n  0x8f, 0x05, 0x3e, 0x16, 0xf8, 0x58, 0xe0, 0x63, 0xa3, 0xbc, 0x8d, 0xf2,\n  0x36, 0xca, 0xdb, 0x28, 0x6f, 0xa3, 0xbc, 0x8d, 0xf2, 0x36, 0xca, 0xdb,\n  0x28, 0x9f, 0x44, 0xf9, 0x24, 0xca, 0x27, 0x51, 0x3e, 0x89, 0xf2, 0x49,\n  0x94, 0x4f, 0xa2, 0x7c, 0x12, 0xe5, 0x93, 0x28, 0xef, 0xa0, 0xbc, 0x83,\n  0x72, 0x0e, 0xca, 0x39, 0x28, 0xe7, 0xa0, 0x9c, 0x83, 0x72, 0x0e, 0xca,\n  0xa5, 0x50, 0x2e, 0x85, 0xe7, 0x36, 0x05, 0xfc, 0x14, 0x9e, 0xdb, 0x14,\n  0xf8, 0xa5, 0xa0, 0x17, 0x52, 0xe0, 0x9b, 0x82, 0x7e, 0x48, 0x41, 0x3f,\n  0xa4, 0xa0, 0x17, 0x22, 0xfd, 0x9e, 0x8e, 0xdc, 0x36, 0xf0, 0x4b, 0x83,\n  0x4f, 0x1a, 0xe5, 0xd3, 0xd0, 0x5f, 0x19, 0xe4, 0xcb, 0x20, 0x5f, 0x16,\n  0xf1, 0x6c, 0x14, 0x47, 0xb9, 0x2c, 0xca, 0x65, 0x51, 0x9f, 0x1c, 0xd2,\n  0x73, 0x48, 0xf7, 0xb2, 0xda, 0xba, 0x11, 0x36, 0x68, 0x83, 0x6f, 0x83,\n  0x26, 0x54, 0x36, 0xa7, 0x73, 0xaa, 0x9b, 0xd3, 0x39, 0xc5, 0x51, 0x3a,\n  0xa5, 0x34, 0x2a, 0x5e, 0x1e, 0x15, 0x1f, 0x1c, 0x19, 0x97, 0xcb, 0x47,\n  0xd4, 0xbb, 0x42, 0x5d, 0x51, 0x0e, 0xd4, 0xcd, 0x70, 0x34, 0xd0, 0x38,\n  0x51, 0x74, 0x7c, 0x79, 0xf8, 0xd9, 0x8c, 0xd2, 0xc6, 0x96, 0x23, 0xed,\n  0x12, 0xa5, 0x8c, 0x2b, 0xc7, 0x3a, 0x65, 0x98, 0x4f, 0xa0, 0x49, 0xa2,\n  0x68, 0xa2, 0xbc, 0x26, 0x0a, 0xb6, 0xe1, 0x3b, 0xfa, 0xe1, 0x38, 0x74,\n  0x46, 0x5c, 0x32, 0x50, 0x17, 0x51, 0x54, 0x8e, 0x0b, 0x8e, 0x5f, 0xf3,\n  0xdf, 0xb2, 0x70, 0xc5, 0xd9, 0xf5, 0x2e, 0xb9, 0x08, 0x8d, 0x49, 0x42,\n  0xd0, 0x97, 0x5d, 0x7a, 0xb1, 0x59, 0xa9, 0x74, 0xa9, 0xc5, 0x61, 0x8d,\n  0x48, 0x72, 0x41, 0xcb, 0x75, 0x25, 0x8a, 0x91, 0x26, 0x23, 0xc1, 0x48,\n  0x8f, 0x75, 0x49, 0xc1, 0x37, 0xd6, 0x24, 0xa0, 0x0d, 0x7f, 0x6c, 0x1d,\n  0x14, 0x83, 0x1e, 0xeb, 0xe2, 0x8b, 0x61, 0xe1, 0x52, 0x74, 0x89, 0xeb,\n  0xf4, 0x7f, 0xba, 0xfc, 0x4c, 0x5d, 0x71, 0xf6, 0xae, 0xe0, 0x1b, 0x74,\n  0x12, 0x52, 0xba, 0xf0, 0xee, 0xb4, 0x2f, 0x57, 0xd7, 0x08, 0xb9, 0x44,\n  0x7f, 0xd3, 0x04, 0xbf, 0x6c, 0x37, 0xf9, 0x11, 0xc8, 0x10, 0xcb, 0x2f,\n  0xd8, 0x1d, 0x15, 0x24, 0x21, 0x7f, 0xff, 0x04, 0xff, 0x7a, 0xc0, 0x31,\n  0xc6, 0x93, 0x4b, 0x51, 0x3d, 0xe5, 0x52, 0x94, 0x59, 0x2f, 0x8d, 0xac,\n  0x71, 0xa9, 0xa9, 0xc6, 0x5a, 0xa9, 0x49, 0xe9, 0x93, 0x32, 0x71, 0xfd,\n  0x4b, 0xc3, 0xf5, 0x2f, 0xc5, 0xf5, 0xe7, 0x56, 0xfb, 0x3f, 0x7e, 0x03,\n  0xc8, 0x3d, 0x71, 0x7b, 0xf6, 0x8c, 0xe0, 0xde, 0xd6, 0xbc, 0xa3, 0x82,\n  0x5f, 0x8f, 0x1e, 0xd4, 0xc3, 0xaf, 0x80, 0xe8, 0x6f, 0xa2, 0xe0, 0x97,\n  0xe9, 0x1d, 0x51, 0x86, 0x2b, 0xfb, 0x1c, 0xcb, 0x71, 0x1d, 0xca, 0x31,\n  0xef, 0xf2, 0x48, 0xc9, 0xcb, 0xcd, 0x92, 0x97, 0x47, 0x48, 0x5e, 0x8e,\n  0x24, 0xe7, 0xcb, 0x6b, 0x7c, 0xa1, 0xcb, 0xc3, 0xf2, 0x97, 0x63, 0xf9,\n  0xe5, 0x72, 0x74, 0xa3, 0x38, 0x3f, 0x93, 0xbe, 0x66, 0xa4, 0x18, 0x7e,\n  0x96, 0xb6, 0xb5, 0x23, 0xe5, 0xe7, 0x2a, 0x7e, 0xb9, 0x4a, 0x2c, 0x5b,\n  0x25, 0x6a, 0xd5, 0xb6, 0xca, 0xa8, 0x8a, 0x56, 0xc2, 0x8a, 0xca, 0x95,\n  0xe0, 0x03, 0x7b, 0xbf, 0x68, 0x9f, 0xff, 0x13, 0xdc, 0xae, 0x6a, 0x5c,\n  0xbe, 0x1a, 0x97, 0xaf, 0x8e, 0x2c, 0x4f, 0xcc, 0x55, 0xd0, 0xb0, 0xd5,\n  0x58, 0xc4, 0x9a, 0x1f, 0xad, 0xc5, 0x25, 0x6b, 0x71, 0xab, 0xd4, 0x46,\n  0xb6, 0x4a, 0xad, 0xb9, 0x07, 0xd7, 0xa2, 0x76, 0x18, 0x33, 0x62, 0xd3,\n  0x05, 0xbf, 0x1d, 0x6a, 0x71, 0x93, 0xc8, 0xb5, 0x48, 0x46, 0xbd, 0x69,\n  0x3b, 0x80, 0xe0, 0x42, 0xdc, 0x93, 0x6b, 0x81, 0x0c, 0xfd, 0x7e, 0xaf,\n  0x6f, 0xf8, 0x1f, 0x10, 0xfa, 0xb1, 0x23, 0xfd, 0x1f, 0xff, 0x06, 0xca,\n  0x03, 0x71, 0x89, 0x81, 0xb8, 0x42, 0x03, 0xa3, 0x5a, 0x2e, 0x90, 0xa7,\n  0x1e, 0x67, 0xac, 0xc7, 0xbd, 0xbe, 0xde, 0xd4, 0xeb, 0xeb, 0x23, 0x7b,\n  0x4f, 0x7d, 0x24, 0x0f, 0xad, 0x27, 0x76, 0xd1, 0x7d, 0x8e, 0x41, 0x3b,\n  0x37, 0xc2, 0x3e, 0x24, 0x37, 0x62, 0x7e, 0x8d, 0x61, 0x7e, 0x6d, 0x8d,\n  0x51, 0x42, 0x0c, 0xfa, 0x59, 0x07, 0x63, 0x21, 0x06, 0xe3, 0x46, 0x1c,\n  0x1c, 0xd9, 0x88, 0x83, 0xcd, 0x8d, 0x38, 0x18, 0x37, 0xe2, 0xe0, 0xe8,\n  0x46, 0x1c, 0x1c, 0xee, 0x57, 0x83, 0xc3, 0x7a, 0x61, 0x10, 0x7a, 0x41,\n  0x1e, 0x8c, 0xef, 0xde, 0x3a, 0xff, 0x67, 0xbd, 0x9f, 0xb6, 0x3e, 0x42,\n  0xd7, 0xd7, 0x8f, 0xc4, 0x5c, 0xdf, 0x8c, 0xb9, 0x3e, 0xc2, 0xe4, 0x82,\n  0xbe, 0xb8, 0xc1, 0x4f, 0xdb, 0x10, 0x97, 0xdc, 0x30, 0xb2, 0xe4, 0x86,\n  0xe6, 0x92, 0x1b, 0xe2, 0x92, 0x1b, 0xfd, 0xe8, 0xc6, 0xb8, 0xb2, 0x1b,\n  0xa3, 0x16, 0xd2, 0x36, 0x36, 0x3f, 0x2b, 0x5c, 0xb9, 0xaf, 0xd6, 0x0d,\n  0xeb, 0x05, 0x2b, 0xe7, 0x45, 0xd6, 0x07, 0xd6, 0xd5, 0x83, 0x15, 0xf4,\n  0x60, 0x65, 0x3d, 0x58, 0x39, 0xcf, 0x53, 0x91, 0x3f, 0xf4, 0xba, 0xfc,\n  0x88, 0x83, 0x21, 0x89, 0x83, 0x21, 0x89, 0x83, 0x21, 0x89, 0x83, 0x21,\n  0x89, 0x83, 0x21, 0x89, 0x83, 0x21, 0x89, 0x83, 0x21, 0x89, 0x83, 0x21,\n  0x89, 0x83, 0x21, 0x89, 0x83, 0x21, 0x89, 0x83, 0x21, 0x89, 0x83, 0x21,\n  0x89, 0x83, 0x21, 0x89, 0x83, 0x21, 0x89, 0x83, 0x21, 0x89, 0x83, 0x21,\n  0x89, 0x83, 0x21, 0x89, 0xe3, 0xa0, 0x3c, 0x86, 0x26, 0x0e, 0x86, 0x26,\n  0x0e, 0x86, 0x26, 0x0e, 0x86, 0x26, 0x0e, 0x86, 0x26, 0x0e, 0x86, 0x1c,\n  0x0e, 0x86, 0x1c, 0x0e, 0x86, 0x1c, 0x0e, 0x86, 0x1c, 0x0e, 0x66, 0x6a,\n  0x1c, 0xcc, 0xd0, 0x38, 0xe9, 0xa8, 0x1c, 0x70, 0x31, 0x14, 0x71, 0x30,\n  0x14, 0x71, 0x32, 0x28, 0x9f, 0x41, 0xf9, 0x0c, 0xca, 0xe3, 0x53, 0x92,\n  0x24, 0x5e, 0x31, 0x4f, 0x9a, 0x51, 0x1c, 0xaf, 0xb0, 0x99, 0xae, 0x1e,\n  0x6f, 0x98, 0x10, 0x1a, 0xba, 0x78, 0xd7, 0x84, 0x91, 0xd1, 0x26, 0xbf,\n  0xd7, 0xce, 0x77, 0x34, 0xdf, 0x01, 0x03, 0xd4, 0x02, 0x4d, 0x82, 0xa6,\n  0x40, 0x33, 0xa0, 0x39, 0xd0, 0x02, 0xa8, 0x87, 0x96, 0x44, 0x79, 0x38,\n  0x6d, 0x0e, 0x9c, 0x36, 0x07, 0x4e, 0x9b, 0x03, 0xa7, 0xcd, 0x81, 0xd3,\n  0xe6, 0xc0, 0x69, 0x73, 0xe0, 0xb4, 0x39, 0x70, 0xda, 0x1c, 0x07, 0xe5,\n  0xe1, 0xbc, 0x39, 0x70, 0xde, 0x1c, 0x38, 0x6f, 0x0e, 0x9c, 0x37, 0x07,\n  0xce, 0x9b, 0x03, 0xe7, 0xca, 0x81, 0x73, 0xe5, 0xc0, 0xb9, 0x72, 0xe0,\n  0x5c, 0x39, 0x98, 0x23, 0x73, 0x30, 0x37, 0xe6, 0xa4, 0xa3, 0x72, 0xc0,\n  0x85, 0xd3, 0xe5, 0xc0, 0xe9, 0x72, 0x32, 0x28, 0x9f, 0x41, 0xf9, 0x0c,\n  0xca, 0xe3, 0xed, 0xe1, 0x24, 0x5e, 0xee, 0x4f, 0x9a, 0x51, 0x1c, 0x9f,\n  0xef, 0x99, 0xde, 0xd8, 0x78, 0x3b, 0x84, 0xc0, 0x11, 0x5a, 0xba, 0x24,\n  0x87, 0x66, 0xf6, 0x9a, 0x9a, 0x19, 0x63, 0x59, 0x27, 0x15, 0xc1, 0xa3,\n  0x43, 0x64, 0x0a, 0xdc, 0xdc, 0x52, 0xa3, 0xa8, 0x66, 0x07, 0xba, 0x7a,\n  0x8b, 0xe5, 0xae, 0x7a, 0xb1, 0xaf, 0xbf, 0x3c, 0x76, 0x31, 0xf9, 0xed,\n  0xdd, 0x50, 0x29, 0xfb, 0xfb, 0xf6, 0x04, 0xbb, 0x7e, 0xc8, 0xf3, 0x8b,\n  0xe5, 0xa5, 0x1b, 0xfa, 0x3a, 0x6b, 0x15, 0xbc, 0xce, 0x19, 0x3c, 0x4b,\n  0x3e, 0x0d, 0xdd, 0x19, 0x7f, 0x0b, 0x12, 0x0c, 0xd2, 0xa2, 0xed, 0x44,\n  0x42, 0xaf, 0xaa, 0x79, 0x6f, 0x92, 0xe1, 0xb1, 0x92, 0x67, 0xa5, 0x9b,\n  0x23, 0x99, 0xe6, 0x48, 0xb6, 0x39, 0x92, 0x6b, 0x8e, 0xe4, 0x9b, 0x23,\n  0x85, 0xe6, 0x88, 0xdb, 0x1c, 0xf1, 0x9a, 0x22, 0x85, 0x66, 0x6e, 0x85,\n  0x66, 0x6e, 0x85, 0x66, 0x09, 0x0a, 0xa1, 0x04, 0x9c, 0xbf, 0x87, 0x89,\n  0x5a, 0x6c, 0x6e, 0x89, 0xfe, 0xd1, 0x2d, 0x11, 0xb4, 0x5a, 0xce, 0x49,\n  0x2a, 0x78, 0x9d, 0xd5, 0x9f, 0x3a, 0x92, 0xf2, 0xab, 0x07, 0x8a, 0xfe,\n  0x2b, 0xdd, 0xd2, 0xdc, 0x28, 0x30, 0x2f, 0x0a, 0x2c, 0x89, 0x02, 0x07,\n  0x23, 0x00, 0xd7, 0x1f, 0xae, 0x3e, 0xe9, 0x75, 0xb9, 0x70, 0x3c, 0x25,\n  0xce, 0x05, 0x9d, 0x07, 0xba, 0x20, 0xa4, 0xfa, 0xe2, 0x72, 0xa1, 0x36,\n  0xd8, 0x59, 0x29, 0x2d, 0x6d, 0x0c, 0x0c, 0x76, 0xad, 0x15, 0x97, 0xe0,\n  0x72, 0x38, 0x68, 0xf4, 0xa4, 0x22, 0x19, 0xb2, 0x91, 0xd1, 0x5a, 0x9f,\n  0x96, 0x6f, 0xce, 0xa6, 0xcd, 0x1d, 0x11, 0x5b, 0x38, 0x22, 0xb6, 0x78,\n  0x44, 0xec, 0x80, 0x11, 0xb1, 0x25, 0x23, 0x62, 0x07, 0x37, 0xc7, 0xc6,\n  0xcf, 0x23, 0xa3, 0xd3, 0x72, 0x57, 0xa1, 0x39, 0x6d, 0x6c, 0xb0, 0xc3,\n  0xcd, 0x88, 0x32, 0xa5, 0xc1, 0x4a, 0x89, 0x98, 0xd3, 0x6a, 0xbd, 0x51,\n  0xac, 0x36, 0x84, 0xb5, 0xa5, 0xca, 0xba, 0x72, 0x55, 0x74, 0x21, 0xb5,\n  0x07, 0xba, 0x3f, 0x68, 0x38, 0xee, 0xc0, 0xb8, 0x06, 0x4a, 0x27, 0x95,\n  0xc1, 0x78, 0x06, 0x7d, 0x34, 0x95, 0x71, 0x01, 0xdd, 0xbd, 0x19, 0x71,\n  0x4a, 0x9b, 0x49, 0x2b, 0x6f, 0x26, 0x6d, 0xcd, 0x08, 0xb1, 0x7b, 0x46,\n  0x8b, 0xad, 0xf7, 0x97, 0x47, 0x46, 0x2b, 0xc5, 0x6a, 0xd7, 0xda, 0xa8,\n  0x1a, 0x5b, 0x8c, 0x8c, 0xfa, 0xfb, 0x8d, 0x35, 0xd6, 0xd7, 0xfa, 0xcb,\n  0x62, 0x58, 0x8d, 0x12, 0x68, 0x0d, 0xb4, 0x07, 0x72, 0x63, 0xfc, 0x86,\n  0x47, 0x3b, 0x85, 0x47, 0x3b, 0x85, 0x47, 0x3b, 0x95, 0x81, 0xc5, 0xca,\n  0x44, 0xf3, 0x43, 0x91, 0x45, 0x0b, 0xaf, 0xe7, 0x30, 0x2e, 0xce, 0x61,\n  0x5c, 0x9c, 0xc3, 0xbc, 0x5b, 0x0e, 0xe3, 0xe3, 0x1c, 0xe6, 0xdf, 0x72,\n  0x18, 0x27, 0xe7, 0x30, 0x0f, 0x97, 0xc3, 0x78, 0x39, 0x87, 0xf9, 0xb8,\n  0x9c, 0x15, 0xf1, 0xcb, 0x82, 0xe6, 0x40, 0xf3, 0xa0, 0x05, 0x50, 0x17,\n  0x34, 0x94, 0x23, 0x07, 0xe3, 0x98, 0x83, 0x8a, 0xce, 0xc1, 0x48, 0xe6,\n  0xa0, 0xaa, 0x73, 0x30, 0x96, 0x39, 0xa8, 0xec, 0x1c, 0x8c, 0x66, 0x0e,\n  0xaa, 0x3b, 0x07, 0xe3, 0x99, 0x83, 0x0a, 0xcf, 0xc1, 0x88, 0xe6, 0xa0,\n  0xca, 0x73, 0x30, 0xa6, 0x39, 0xa8, 0xf4, 0x1c, 0x8c, 0x6a, 0x0e, 0xaa,\n  0x3d, 0x07, 0xe3, 0x9a, 0x83, 0x8a, 0xcf, 0xc1, 0xc8, 0xe6, 0xa0, 0xea,\n  0x73, 0x30, 0xb6, 0x39, 0xa8, 0xfc, 0x1c, 0x8c, 0x6e, 0x0e, 0xaa, 0x3f,\n  0x07, 0xe3, 0x9b, 0x83, 0x09, 0xc8, 0xc1, 0x08, 0xe7, 0x1c, 0x5b, 0xee,\n  0x2d, 0x57, 0x57, 0x87, 0xfb, 0x7d, 0xac, 0x8d, 0x43, 0x95, 0x38, 0xd4,\n  0x17, 0x87, 0xaa, 0x71, 0xa8, 0x3f, 0x0e, 0xd5, 0xe3, 0x50, 0x23, 0x0a,\n  0x61, 0xdc, 0x8d, 0x79, 0x0c, 0x2f, 0xc2, 0x45, 0xfd, 0x60, 0x72, 0x72,\n  0x30, 0xfa, 0xb9, 0xa4, 0xa7, 0xf9, 0x1d, 0xa8, 0xdc, 0x45, 0x74, 0x87,\n  0xef, 0x72, 0xa9, 0x78, 0xbb, 0x78, 0x58, 0x23, 0x15, 0xac, 0xd0, 0x7c,\n  0x8a, 0xfe, 0xba, 0xdc, 0xec, 0xca, 0x6a, 0x81, 0x38, 0x6b, 0x3e, 0x21,\n  0x9d, 0x8e, 0x10, 0x29, 0xd8, 0x57, 0x84, 0x04, 0x44, 0x7f, 0xbb, 0x90,\n  0x80, 0x96, 0xd7, 0x05, 0xd7, 0xeb, 0xe5, 0xa3, 0xfc, 0xeb, 0xc1, 0x5e,\n  0x21, 0x7e, 0x20, 0xd8, 0x26, 0xc4, 0xcf, 0xe0, 0x2f, 0xe3, 0xf9, 0x09,\n  0x01, 0xbf, 0x5a, 0x7d, 0xb5, 0xe8, 0x33, 0xf4, 0xa9, 0xcf, 0x91, 0x50,\n  0x39, 0x64, 0x49, 0x42, 0x52, 0xc0, 0x33, 0x08, 0xf8, 0x4c, 0xfd, 0x3c,\n  0x3e, 0x57, 0x3f, 0x4f, 0xc8, 0xd6, 0x0f, 0x85, 0x7c, 0xfd, 0x4c, 0x01,\n  0x63, 0x12, 0x48, 0x04, 0x9c, 0x03, 0x87, 0x5c, 0x0e, 0x82, 0x0d, 0xff,\n  0xaa, 0x8f, 0x12, 0x04, 0x7c, 0x18, 0x3f, 0x90, 0x08, 0x71, 0xfc, 0xa0,\n  0x1c, 0x00, 0x85, 0x21, 0x1f, 0x29, 0xc8, 0xe7, 0x43, 0x05, 0xf9, 0x42,\n  0xac, 0x20, 0x18, 0x82, 0x05, 0x19, 0x03, 0x34, 0x3f, 0x14, 0x2c, 0x58,\n  0x46, 0xad, 0xaf, 0x10, 0x98, 0x38, 0x4c, 0x90, 0xa2, 0xb0, 0x16, 0x80,\n  0x45, 0xb1, 0x60, 0x6f, 0x95, 0xe1, 0x08, 0x81, 0x8c, 0xcb, 0x10, 0xd4,\n  0xb8, 0x4c, 0x00, 0x1c, 0xc7, 0x02, 0xec, 0xb8, 0x90, 0x0f, 0x1f, 0xdf,\n  0xfc, 0xa0, 0x96, 0xdd, 0xd5, 0x5a, 0x5f, 0x50, 0xcb, 0x20, 0xe0, 0xd7,\n  0xd2, 0x0f, 0xa0, 0x96, 0x7e, 0x30, 0xac, 0x65, 0x18, 0xf2, 0x6b, 0x19,\n  0xe4, 0xf3, 0x6b, 0x19, 0xe4, 0x0b, 0x6b, 0x19, 0x04, 0xc3, 0x5a, 0x06,\n  0x19, 0x83, 0x5a, 0x06, 0xa1, 0x00, 0xa3, 0x3a, 0xd8, 0x37, 0x10, 0x60,\n  0x04, 0x01, 0x1f, 0xc3, 0x0f, 0x00, 0xc3, 0x0f, 0x86, 0x18, 0x61, 0xc8,\n  0xc7, 0x08, 0xf2, 0xf9, 0x18, 0x41, 0xbe, 0x10, 0x23, 0x08, 0x86, 0x18,\n  0x41, 0xc6, 0x00, 0xc3, 0x0f, 0xf9, 0x8d, 0x47, 0x4c, 0x53, 0x57, 0xa3,\n  0x5c, 0xab, 0x06, 0x78, 0xc1, 0x42, 0xa8, 0x8f, 0xb7, 0xba, 0xbc, 0xba,\n  0xd1, 0xeb, 0x2f, 0x8d, 0x06, 0x81, 0xba, 0x12, 0x00, 0x86, 0xe1, 0x84,\n  0x8f, 0x18, 0x06, 0xfd, 0x9c, 0x04, 0xab, 0xd1, 0x9b, 0x08, 0xb6, 0xab,\n  0xf1, 0x43, 0xf5, 0x84, 0x9f, 0xe6, 0xc3, 0x36, 0x7a, 0xfd, 0xcb, 0x04,\n  0x2b, 0x0c, 0x34, 0x82, 0x94, 0x62, 0xbd, 0x41, 0x5a, 0xb0, 0xde, 0xd7,\n  0xd6, 0x49, 0x86, 0xa6, 0x6b, 0x2b, 0xa5, 0xd5, 0x8d, 0xce, 0xc1, 0x4a,\n  0xa5, 0xd4, 0x18, 0x13, 0xc4, 0x07, 0x7c, 0x19, 0xc3, 0x84, 0x09, 0x9d,\n  0x44, 0xae, 0xb5, 0xa5, 0x86, 0x9f, 0x65, 0x7d, 0xb9, 0xd1, 0x7b, 0xe4,\n  0x20, 0x19, 0x29, 0x4d, 0x44, 0x62, 0x90, 0x2f, 0x4e, 0xe5, 0xc9, 0x70,\n  0xa1, 0xd4, 0x18, 0x1f, 0xfc, 0x96, 0xab, 0x75, 0xff, 0xe9, 0xaa, 0x55,\n  0xfb, 0x49, 0x4f, 0x68, 0xa8, 0xc4, 0x9a, 0xfb, 0xd5, 0xf3, 0x93, 0x4a,\n  0x62, 0xf0, 0x5d, 0xd6, 0x60, 0xff, 0xf8, 0xee, 0x62, 0x0f, 0x19, 0x9e,\n  0xf9, 0xc5, 0x7d, 0xe6, 0x3d, 0x83, 0xc5, 0x81, 0xee, 0x09, 0xc3, 0x69,\n  0x01, 0xef, 0x20, 0x51, 0x21, 0x83, 0x8f, 0x46, 0xc9, 0x9f, 0xb1, 0xa8,\n  0xd7, 0xd5, 0x30, 0x5c, 0xeb, 0x2c, 0x11, 0x26, 0x93, 0xc3, 0x48, 0x90,\n  0x33, 0xc0, 0xf1, 0xe7, 0x54, 0xfc, 0x8f, 0xe0, 0xa6, 0x84, 0x17, 0x1a,\n  0x03, 0xc5, 0x6a, 0xbd, 0xbf, 0x56, 0x2f, 0xfb, 0x82, 0xf4, 0x15, 0x07,\n  0xd6, 0x96, 0x06, 0xda, 0xba, 0x6b, 0xeb, 0xab, 0xeb, 0x09, 0xd3, 0x3a,\n  0xb1, 0x25, 0xb5, 0x81, 0xe2, 0x18, 0x32, 0xf2, 0x6b, 0xd4, 0x06, 0xca,\n  0x45, 0x32, 0x1a, 0x27, 0x63, 0x9d, 0x72, 0x7d, 0x7c, 0xb8, 0x1f, 0x51,\n  0xd1, 0x2f, 0x72, 0xe4, 0xa0, 0xbf, 0xa1, 0x50, 0xad, 0x1a, 0x6c, 0x1b,\n  0x44, 0x58, 0xfa, 0x2c, 0xc6, 0x21, 0xdc, 0x3f, 0x58, 0xed, 0x6a, 0x0c,\n  0x06, 0xd9, 0x26, 0xae, 0xae, 0xd4, 0xd6, 0x97, 0x06, 0x9a, 0x52, 0xfc,\n  0x8c, 0x63, 0x57, 0xd7, 0x08, 0x60, 0x77, 0x3f, 0xa9, 0x38, 0x19, 0x5f,\n  0xf5, 0xf7, 0xd6, 0xea, 0x8a, 0x7f, 0xc3, 0x62, 0x36, 0x61, 0xb8, 0xa9,\n  0xd0, 0x98, 0xde, 0x0d, 0xfd, 0xbd, 0xa5, 0x6a, 0x71, 0xb8, 0xd5, 0xc2,\n  0x84, 0xf0, 0x3e, 0xf8, 0x11, 0x32, 0x50, 0x27, 0xf7, 0xad, 0x56, 0x29,\n  0x29, 0xe4, 0x6a, 0x69, 0x60, 0xa0, 0xd6, 0x49, 0x6a, 0x3b, 0xbe, 0x5c,\n  0xf5, 0x15, 0x19, 0xa9, 0xc7, 0x70, 0xda, 0x98, 0x28, 0x2d, 0xd8, 0x86,\n  0x89, 0xb4, 0xf9, 0xd6, 0x7e, 0x0b, 0x87, 0x8d, 0xe2, 0x4f, 0x1e, 0x37,\n  0xca, 0x8d, 0x41, 0x1f, 0x06, 0xb7, 0x71, 0xb2, 0x7f, 0x95, 0xd4, 0xc1,\n  0x97, 0xb5, 0xbf, 0x77, 0xa0, 0x58, 0x2f, 0xe1, 0xc2, 0x14, 0xff, 0xc2,\n  0x40, 0xb1, 0x5c, 0x27, 0x35, 0xee, 0x2b, 0xd7, 0xeb, 0xc3, 0x45, 0xb6,\n  0xf0, 0xaf, 0xb4, 0x62, 0x35, 0xa2, 0xdd, 0x9b, 0x2f, 0x44, 0x1a, 0x97,\n  0x8c, 0xc0, 0xe3, 0x5e, 0xa3, 0x10, 0x60, 0xf4, 0xc6, 0xb5, 0x3a, 0xe9,\n  0x9f, 0x44, 0xca, 0x52, 0xb5, 0x52, 0x2a, 0x12, 0xc1, 0xb7, 0x0a, 0xa3,\n  0xb0, 0xf4, 0x24, 0x54, 0x6f, 0x6a, 0xae, 0x44, 0x7f, 0xb1, 0xd2, 0x47,\n  0x98, 0x57, 0xbb, 0x7a, 0x95, 0xa6, 0x46, 0xd6, 0xbb, 0x03, 0x0f, 0x22,\n  0xba, 0x75, 0xe3, 0xa3, 0x40, 0xd3, 0x6d, 0x55, 0xc2, 0x1a, 0x05, 0x03,\n  0x7d, 0x39, 0x0c, 0x13, 0xde, 0xdb, 0xc6, 0xa1, 0xa8, 0x2d, 0xfb, 0x6b,\n  0x95, 0xe2, 0x70, 0xcf, 0x99, 0x12, 0x5e, 0xdf, 0xcc, 0x15, 0x35, 0xbc,\n  0xe2, 0x7f, 0x2a, 0x39, 0x50, 0xd2, 0x06, 0x4a, 0x44, 0x37, 0x95, 0xaa,\n  0x5d, 0x25, 0xff, 0xe2, 0x94, 0x68, 0xa5, 0xe0, 0xbf, 0x3a, 0xc3, 0xd8,\n  0xe8, 0x4a, 0x9c, 0x36, 0x21, 0x4a, 0x89, 0x44, 0x0e, 0x7a, 0x51, 0x94,\n  0x58, 0x2f, 0xf5, 0x95, 0xbb, 0x6a, 0x95, 0x5a, 0x75, 0xbb, 0xa0, 0xbb,\n  0x07, 0xdd, 0xfc, 0xbf, 0x6f, 0x68, 0x28, 0xd0, 0x56, 0xc3, 0x59, 0xfe,\n  0xfb, 0xe2, 0x36, 0xc1, 0xc5, 0x96, 0x7d, 0x61, 0x4a, 0x70, 0x79, 0x73,\n  0x9d, 0x61, 0xcb, 0xe0, 0xca, 0x66, 0x7b, 0xc3, 0xe4, 0x81, 0x70, 0x2b,\n  0xac, 0x16, 0xdc, 0x36, 0xd7, 0x1f, 0xc2, 0x2b, 0x9b, 0xeb, 0x10, 0xb2,\n  0x3f, 0x17, 0x12, 0x3c, 0x00, 0x53, 0xc2, 0x26, 0xed, 0xfe, 0xef, 0x67,\n  0x45, 0xae, 0xaf, 0x1f, 0xac, 0xf6, 0x74, 0x13, 0x43, 0x37, 0x3e, 0xd0,\n  0x88, 0x23, 0xaf, 0x6a, 0x81, 0x45, 0xf7, 0xa7, 0x2c, 0xfc, 0x0f, 0xe6,\n  0xe2, 0x98, 0xaf, 0x33, 0xd6, 0xeb, 0x41, 0x2c, 0x98, 0x7d, 0xf5, 0x2f,\n  0x92, 0xa8, 0xff, 0xd8, 0x13, 0xf9, 0xca, 0x3d, 0x44, 0x37, 0x8e, 0x6b,\n  0xd4, 0xfa, 0x7b, 0x8b, 0x95, 0xd5, 0xf5, 0x52, 0xa0, 0x8b, 0xfd, 0x44,\n  0x89, 0x68, 0xb9, 0xa0, 0xe1, 0xb1, 0xd6, 0x12, 0x74, 0x1b, 0x35, 0x0c,\n  0x87, 0xda, 0xaa, 0x2d, 0x8c, 0xc4, 0x77, 0x68, 0x02, 0xe9, 0xac, 0x51,\n  0x8f, 0xae, 0x47, 0x35, 0xd4, 0xc3, 0x1e, 0x1c, 0x75, 0xed, 0xb1, 0x61,\n  0xb4, 0x49, 0xe8, 0xad, 0xd0, 0xc5, 0xfd, 0xde, 0x1e, 0xf6, 0xfb, 0xa6,\n  0x8b, 0x52, 0xf4, 0x20, 0xe3, 0xa5, 0xa3, 0xf0, 0x5d, 0x14, 0xbc, 0xe4,\n  0x6e, 0xe2, 0x25, 0x77, 0x13, 0xdb, 0x7b, 0x99, 0xd8, 0xde, 0xcb, 0x74,\n  0xa3, 0x71, 0x7d, 0xca, 0xd2, 0x06, 0xfb, 0x9b, 0xb4, 0xde, 0xa4, 0xf5,\n  0x35, 0x12, 0x2e, 0xf9, 0xb7, 0x98, 0x28, 0xbf, 0x70, 0xb5, 0x80, 0x00,\n  0x92, 0x91, 0xd6, 0x80, 0x2f, 0xe0, 0xea, 0xd8, 0xda, 0x8e, 0x0b, 0x52,\n  0x06, 0x9a, 0x0d, 0xf0, 0xf8, 0xe0, 0x06, 0xfa, 0x8d, 0xd4, 0x49, 0xfa,\n  0x50, 0xad, 0xcf, 0xcf, 0x3e, 0x61, 0x54, 0x5a, 0x50, 0x60, 0x4c, 0x9c,\n  0x48, 0x1a, 0xd5, 0xcf, 0x35, 0xb6, 0x39, 0x21, 0xc8, 0x32, 0x31, 0x54,\n  0x4b, 0xfe, 0x03, 0x1b, 0x00, 0x35, 0x7a, 0xfd, 0x31, 0xea, 0x24, 0xf4,\n  0xd0, 0x51, 0xc9, 0x13, 0x02, 0x95, 0x53, 0xee, 0x2e, 0xad, 0x2f, 0x6e,\n  0x20, 0x5d, 0x2d, 0xec, 0x46, 0x13, 0xc3, 0x9e, 0x37, 0x2a, 0x75, 0xb8,\n  0x22, 0xd1, 0x6b, 0x53, 0x4d, 0x15, 0x89, 0x92, 0xf4, 0x50, 0xbd, 0xc6,\n  0x9b, 0xda, 0x85, 0x51, 0x72, 0x17, 0xc6, 0x56, 0xfd, 0x5e, 0x5a, 0x2a,\n  0x12, 0xaf, 0xb4, 0x27, 0x4c, 0x0c, 0xcd, 0x6e, 0xa9, 0xcf, 0xef, 0x70,\n  0xbe, 0x31, 0x0e, 0x43, 0x68, 0xe3, 0x8e, 0xf1, 0x10, 0x75, 0xa0, 0xdc,\n  0x57, 0x5a, 0x82, 0xc7, 0x55, 0x1b, 0x11, 0xd3, 0x49, 0x3f, 0xee, 0x1e,\n  0x18, 0xec, 0x47, 0xa6, 0xf1, 0xa4, 0x4b, 0xf5, 0x8f, 0x2a, 0x00, 0x66,\n  0xa6, 0xea, 0x57, 0xa1, 0xe4, 0x8b, 0xee, 0xcf, 0xbb, 0x05, 0x91, 0x40,\n  0x6a, 0x7f, 0x12, 0xaf, 0xc9, 0x14, 0xfb, 0x53, 0x95, 0xcd, 0x46, 0x38,\n  0x98, 0x7c, 0x0f, 0x54, 0x5c, 0x30, 0x43, 0x1f, 0xed, 0xa9, 0x17, 0xcc,\n  0xd0, 0x87, 0x11, 0x62, 0xf7, 0xfc, 0x09, 0xc9, 0x1e, 0xf2, 0x88, 0x11,\n  0xe7, 0xb9, 0xa7, 0x02, 0x2e, 0x63, 0xe3, 0x84, 0x88, 0x8f, 0x1a, 0x37,\n  0x9e, 0x5f, 0x7a, 0xb8, 0xdd, 0xfc, 0x99, 0xd2, 0x48, 0x35, 0xf9, 0xf0,\n  0x51, 0x18, 0x9c, 0x83, 0x9e, 0x96, 0x31, 0xa3, 0x29, 0x0e, 0x77, 0x4c,\n  0x1f, 0x51, 0x96, 0x83, 0x7d, 0xc1, 0x26, 0xd1, 0xb3, 0x88, 0xe2, 0xed,\n  0xd5, 0x2a, 0xfe, 0x6b, 0x6c, 0x51, 0xa7, 0x1b, 0x17, 0xeb, 0xbd, 0x38,\n  0x69, 0xfc, 0x6a, 0xbf, 0xc3, 0x13, 0x8e, 0xc5, 0xfe, 0x7e, 0x32, 0x58,\n  0x0c, 0x1f, 0x65, 0x62, 0xc9, 0xca, 0xf5, 0xb2, 0xdf, 0xbc, 0x95, 0xc1,\n  0xfa, 0xb8, 0x38, 0x16, 0x17, 0xd2, 0xe3, 0xa4, 0x06, 0x69, 0xcd, 0x3a,\n  0x5e, 0xa6, 0xc3, 0x6b, 0x6d, 0x78, 0xf7, 0xab, 0x03, 0xef, 0x7e, 0x75,\n  0x38, 0x99, 0x84, 0xdf, 0xf3, 0xd7, 0x10, 0xe5, 0x52, 0x1a, 0x20, 0xf2,\n  0xac, 0x1b, 0x28, 0x2d, 0x23, 0xba, 0xa5, 0x5a, 0x2b, 0xd7, 0xf9, 0xbe,\n  0x22, 0x31, 0xbd, 0xfc, 0x80, 0x7f, 0x27, 0x85, 0x7a, 0x6f, 0xe9, 0xc8,\n  0x52, 0x45, 0xaa, 0xf7, 0x97, 0xea, 0x7d, 0xe5, 0x4a, 0x8d, 0x27, 0x8f,\n  0x6d, 0x0f, 0x1e, 0xbd, 0x1c, 0xde, 0xe3, 0xcb, 0xb9, 0x0a, 0x31, 0xfb,\n  0x44, 0x8f, 0xcc, 0xae, 0xd7, 0x3b, 0x2c, 0x65, 0x51, 0x6f, 0x5f, 0x64,\n  0x73, 0x95, 0x22, 0x11, 0xb6, 0xb7, 0x1e, 0xcc, 0xd4, 0xb4, 0x15, 0xfb,\n  0x48, 0x67, 0x23, 0x4f, 0x5d, 0x37, 0x16, 0x89, 0x3b, 0x4b, 0x8d, 0xf0,\n  0xca, 0x78, 0x5f, 0x8f, 0x90, 0x31, 0x3a, 0xf1, 0x3c, 0xf6, 0x2f, 0x57,\n  0x07, 0xeb, 0x4b, 0x89, 0xaa, 0x51, 0xba, 0x49, 0x51, 0x5c, 0xd7, 0x88,\n  0x09, 0x2b, 0x56, 0x86, 0x7d, 0x60, 0x3f, 0x16, 0xbf, 0x1c, 0xd8, 0x43,\n  0xaa, 0x5a, 0x41, 0x3e, 0x7f, 0x37, 0xc5, 0x78, 0x34, 0x14, 0xc6, 0xe2,\n  0x1e, 0xde, 0xef, 0x0b, 0x44, 0x1e, 0x9f, 0xda, 0xa0, 0x2f, 0x82, 0xea,\n  0x37, 0x61, 0xec, 0x47, 0xfb, 0x91, 0xf8, 0xe9, 0x88, 0xac, 0xcc, 0x52,\n  0xa2, 0x08, 0x97, 0x92, 0xa4, 0xd5, 0x0b, 0x26, 0xd6, 0x07, 0xfb, 0x42,\n  0x73, 0xd9, 0x3c, 0x24, 0x1f, 0x13, 0x56, 0x23, 0xce, 0x36, 0x67, 0x74,\n  0xc2, 0x82, 0xd1, 0x09, 0x2b, 0xa7, 0x6c, 0x96, 0xd1, 0xec, 0xbe, 0xf2,\n  0x80, 0xb4, 0xc4, 0x9f, 0xa7, 0x2a, 0x75, 0x1f, 0x20, 0x17, 0xbb, 0xba,\n  0x6a, 0x83, 0x64, 0x48, 0xbf, 0x7a, 0x62, 0xb1, 0xbb, 0x9b, 0x3c, 0x8d,\n  0x44, 0x92, 0x46, 0xcd, 0x7f, 0xea, 0x07, 0x3b, 0xd7, 0x10, 0x4d, 0x2c,\n  0x76, 0x15, 0xbb, 0x8b, 0x83, 0xd5, 0x62, 0xc2, 0x9f, 0x80, 0xf6, 0x17,\n  0x6a, 0xba, 0x4b, 0x63, 0xfc, 0xe0, 0x40, 0x29, 0xe8, 0x52, 0x41, 0x3b,\n  0xc8, 0xab, 0x8b, 0x5d, 0xf5, 0x32, 0xb9, 0x5b, 0xa5, 0xc4, 0xea, 0x22,\n  0x79, 0x5a, 0xab, 0xbd, 0xa5, 0x72, 0x63, 0x2c, 0xa9, 0x2d, 0xd1, 0x6f,\n  0x01, 0x7a, 0x9d, 0xdc, 0xe8, 0xae, 0x92, 0x52, 0xe9, 0x24, 0xb6, 0x26,\n  0x2c, 0xc2, 0x13, 0xcc, 0xae, 0x92, 0xe8, 0xdf, 0x20, 0xd2, 0xf8, 0x6a,\n  0x3f, 0x01, 0x0e, 0x66, 0x0e, 0x48, 0x66, 0x12, 0xa9, 0xf9, 0x8d, 0xb7,\n  0xc1, 0x07, 0x90, 0xc8, 0x85, 0x7e, 0xc2, 0x20, 0x98, 0x61, 0xf0, 0x1f,\n  0x62, 0x85, 0xf8, 0xb6, 0xeb, 0xca, 0xa1, 0x85, 0x9f, 0x1c, 0xf2, 0x22,\n  0x30, 0x75, 0xe2, 0x5e, 0x0c, 0x94, 0x89, 0xd9, 0x0d, 0x91, 0x64, 0x7f,\n  0x83, 0x63, 0x62, 0xe9, 0x49, 0x79, 0xbf, 0x6d, 0xcb, 0x5d, 0xa4, 0xdc,\n  0xfa, 0x12, 0x51, 0x36, 0x75, 0x62, 0x0e, 0xeb, 0x75, 0x6d, 0xa0, 0xb7,\n  0x46, 0x0c, 0x83, 0xff, 0xbe, 0x40, 0x5f, 0xad, 0x7b, 0x0b, 0x7c, 0xae,\n  0x7e, 0xc4, 0x48, 0x9a, 0x69, 0x91, 0xee, 0xb4, 0x48, 0x4f, 0xb7, 0x48,\n  0x4f, 0xb5, 0xfd, 0xdf, 0xf9, 0x66, 0xa2, 0xfc, 0x2d, 0xd2, 0x5b, 0xe5,\n  0x77, 0x5a, 0xa4, 0xa7, 0x5b, 0xa4, 0x8f, 0x96, 0x63, 0x74, 0x79, 0xa7,\n  0x85, 0x1c, 0x4e, 0x0b, 0x39, 0x9c, 0xff, 0xc1, 0x27, 0xdd, 0x22, 0x7d,\n  0xb4, 0x1c, 0xa3, 0xf3, 0xa5, 0x5b, 0xc8, 0x91, 0x6e, 0x21, 0x47, 0xba,\n  0x85, 0x1c, 0xe9, 0xff, 0xc1, 0x7f, 0xb4, 0x1c, 0xa9, 0x51, 0xf9, 0x52,\n  0x2d, 0xe4, 0x48, 0xb5, 0x90, 0x23, 0xd5, 0x42, 0x8e, 0x54, 0x0b, 0x39,\n  0x52, 0xa3, 0xe4, 0x18, 0xdd, 0x0f, 0x32, 0xa3, 0xfa, 0x51, 0xab, 0xf4,\n  0x4c, 0x8b, 0x74, 0xa7, 0x45, 0x7a, 0xba, 0x45, 0x7a, 0x6a, 0x54, 0x7a,\n  0x2b, 0x79, 0x32, 0x2d, 0xf8, 0x67, 0x5a, 0xf0, 0xcf, 0xb4, 0xa8, 0xe7,\n  0xe8, 0xf2, 0x4e, 0x0b, 0x3c, 0xa7, 0x45, 0x3d, 0x9d, 0xff, 0xc1, 0x27,\n  0xdd, 0x22, 0x7d, 0xb4, 0x1c, 0xa3, 0xf3, 0xa5, 0x5b, 0xc8, 0x91, 0x6e,\n  0x21, 0x47, 0xba, 0x85, 0x1c, 0xe9, 0xff, 0xc1, 0x7f, 0xb4, 0x1c, 0xa3,\n  0xdb, 0x3f, 0xd5, 0x42, 0x8e, 0x54, 0x0b, 0x39, 0x52, 0x2d, 0xe4, 0x48,\n  0xb5, 0x90, 0x63, 0x74, 0xff, 0x1b, 0xdd, 0xfe, 0x4e, 0x8b, 0xfe, 0xe7,\n  0xb4, 0xe8, 0x7f, 0x4e, 0x8b, 0xfe, 0xe7, 0xb4, 0xe8, 0x7f, 0x4e, 0x0b,\n  0x3d, 0xe9, 0xb4, 0xe0, 0x9b, 0x69, 0x21, 0x47, 0xe6, 0x7f, 0xe4, 0x77,\n  0x5a, 0xa4, 0xa7, 0x5b, 0xa4, 0xa7, 0x46, 0xa5, 0xb7, 0x6a, 0x97, 0x56,\n  0x72, 0x3a, 0x2d, 0xf8, 0x3b, 0x2d, 0xea, 0x39, 0x3a, 0x5f, 0xba, 0x05,\n  0x5e, 0xba, 0x05, 0x5e, 0xba, 0x45, 0x3d, 0xd3, 0xff, 0x83, 0xff, 0x68,\n  0x39, 0x46, 0xd7, 0x3b, 0xd5, 0x42, 0x8e, 0x54, 0x0b, 0x39, 0x52, 0x2d,\n  0xe4, 0x48, 0xb5, 0x90, 0x63, 0x74, 0xff, 0x1b, 0x5d, 0xef, 0x74, 0x8b,\n  0xfe, 0x97, 0x6e, 0xd1, 0xff, 0xd2, 0x2d, 0xfa, 0x5f, 0xba, 0x45, 0xff,\n  0x4b, 0xb7, 0xe8, 0x7f, 0xe9, 0x16, 0x7c, 0x33, 0x2d, 0xe4, 0xc8, 0xfc,\n  0x8f, 0xfc, 0x4e, 0x8b, 0xf4, 0x74, 0x8b, 0xf4, 0xd1, 0x72, 0x8c, 0x2e,\n  0xef, 0xb4, 0x90, 0xc3, 0x69, 0x21, 0x87, 0xf3, 0x3f, 0xf8, 0xa4, 0x5b,\n  0xa4, 0xa7, 0x46, 0xa5, 0xb7, 0xba, 0x3f, 0xad, 0xda, 0xab, 0x95, 0xfc,\n  0xe9, 0x16, 0xf5, 0x1c, 0x8d, 0x97, 0x6a, 0x81, 0x97, 0x6a, 0x81, 0x97,\n  0x6a, 0x81, 0x97, 0x6a, 0x51, 0xcf, 0xd1, 0xfd, 0x6f, 0x34, 0x5e, 0xaa,\n  0x45, 0xff, 0x4b, 0xb5, 0xe8, 0x7f, 0xa9, 0x16, 0xfd, 0x2f, 0xd5, 0xa2,\n  0xff, 0xa5, 0x5a, 0xf4, 0xbf, 0x54, 0x0b, 0xbe, 0x99, 0x16, 0x72, 0x64,\n  0xfe, 0x47, 0x7e, 0xa7, 0x45, 0x7a, 0xba, 0x45, 0xfa, 0x68, 0x39, 0x46,\n  0x97, 0x77, 0x5a, 0xc8, 0xe1, 0xb4, 0x90, 0xc3, 0xf9, 0x1f, 0x7c, 0xd2,\n  0x2d, 0xd2, 0x47, 0xcb, 0x31, 0x3a, 0x5f, 0xba, 0x85, 0x1c, 0xe9, 0x16,\n  0x72, 0xa4, 0x5b, 0xc8, 0x91, 0xfe, 0x1f, 0xfc, 0x53, 0xa3, 0xd2, 0x5b,\n  0xf5, 0x93, 0x56, 0xf7, 0xad, 0x55, 0x3b, 0xc6, 0x38, 0xe1, 0x9a, 0x59,\n  0x07, 0xd6, 0xce, 0x3a, 0xf0, 0xee, 0x69, 0x07, 0x16, 0xc8, 0x3b, 0xf0,\n  0x0e, 0x6a, 0x07, 0xd6, 0x52, 0x3b, 0xb0, 0x96, 0xda, 0x81, 0x35, 0xe3,\n  0x0e, 0xac, 0xa9, 0x76, 0x44, 0x7c, 0xb0, 0xb6, 0xda, 0x81, 0x35, 0xe4,\n  0x0e, 0xac, 0xb1, 0x76, 0x60, 0x2d, 0xb9, 0x03, 0x6b, 0xad, 0x1d, 0x78,\n  0x2b, 0xa8, 0x03, 0x6b, 0xae, 0x06, 0xf0, 0x0d, 0xe0, 0x1b, 0xc0, 0x37,\n  0x80, 0x6f, 0x00, 0xdf, 0x00, 0xbe, 0x11, 0xad, 0x35, 0xe6, 0xd4, 0x78,\n  0x9c, 0xed, 0xbf, 0x58, 0x15, 0x0e, 0x41, 0xfd, 0xed, 0xfa, 0xd4, 0x68,\n  0x76, 0xc7, 0xdf, 0x35, 0x4b, 0x8b, 0x5f, 0x62, 0xf2, 0x63, 0x72, 0xf0,\n  0xd6, 0x53, 0x10, 0x0a, 0x5e, 0x78, 0xf2, 0x43, 0x63, 0x9a, 0xdf, 0xd6,\n  0xf2, 0x13, 0xf4, 0xe1, 0xd7, 0xa6, 0x82, 0x9c, 0xc1, 0x0b, 0x51, 0x41,\n  0x28, 0x78, 0x0f, 0xcc, 0x0f, 0x49, 0xfe, 0x5c, 0x62, 0x90, 0x14, 0xcc,\n  0x2c, 0xfa, 0xa1, 0x44, 0xf8, 0x8e, 0x97, 0x1f, 0x54, 0xfc, 0xe9, 0x3c,\n  0x7f, 0x10, 0xd9, 0xd5, 0xd7, 0x39, 0x31, 0x9a, 0x0b, 0xf4, 0xe3, 0xf1,\n  0x5e, 0x5e, 0x93, 0xbb, 0x3b, 0x2b, 0x9b, 0xbd, 0xa0, 0x92, 0x0b, 0xb1,\n  0x8c, 0x6d, 0x5d, 0xa4, 0x6e, 0x03, 0xc5, 0x5c, 0xb9, 0xda, 0x3d, 0xe8,\n  0xc7, 0xc7, 0x06, 0xf8, 0xd1, 0x94, 0x83, 0x9f, 0x32, 0x21, 0x98, 0x98,\n  0x0c, 0xab, 0x1e, 0xf3, 0xd0, 0xc3, 0xb7, 0xd9, 0xa2, 0xe8, 0xa4, 0x20,\n  0x1a, 0x0d, 0xf6, 0xe3, 0xe4, 0xf1, 0xc3, 0xb9, 0x82, 0x99, 0x9e, 0xa0,\n  0x64, 0x00, 0x1d, 0x4c, 0x99, 0x06, 0xd1, 0xa0, 0x8d, 0xe2, 0xe8, 0xd8,\n  0x60, 0x9a, 0xbf, 0xd8, 0xb5, 0x36, 0x4e, 0x19, 0x17, 0xce, 0xf4, 0x8e,\n  0x48, 0xf2, 0x33, 0x05, 0xb3, 0xd0, 0x31, 0x92, 0xe4, 0xbf, 0x09, 0xe8,\n  0x07, 0x26, 0xfa, 0xad, 0xe6, 0x4f, 0x05, 0x06, 0x4b, 0x4f, 0x51, 0x89,\n  0xb6, 0xc1, 0xfe, 0x11, 0x1c, 0xc6, 0xfa, 0x73, 0x4b, 0x23, 0x52, 0x34,\n  0x7f, 0xda, 0x62, 0x58, 0xaa, 0x60, 0xba, 0x23, 0x8e, 0x4e, 0xf6, 0x47,\n  0xd3, 0xfd, 0xfe, 0xdb, 0xfb, 0xc5, 0x4a, 0x79, 0x63, 0xa9, 0x3b, 0xbe,\n  0x30, 0x29, 0xdc, 0xfe, 0xb0, 0x31, 0x50, 0xf3, 0xef, 0x64, 0x9c, 0xac,\n  0x46, 0x93, 0xc2, 0x21, 0x16, 0xba, 0xca, 0x30, 0x96, 0x2f, 0x63, 0x1c,\n  0x53, 0xf0, 0x92, 0x60, 0x70, 0x83, 0xc3, 0x37, 0xf7, 0x82, 0x8a, 0x34,\n  0xdf, 0xbb, 0xe1, 0x8a, 0x74, 0x0e, 0x94, 0xbb, 0x7b, 0x86, 0xe3, 0xfe,\n  0x4d, 0xf6, 0xdf, 0x69, 0x89, 0x6e, 0xd8, 0x70, 0x0d, 0x82, 0x1e, 0x15,\n  0x47, 0xc7, 0x0f, 0xf7, 0xb7, 0xe1, 0x2c, 0xc1, 0xad, 0x1e, 0xae, 0xcb,\n  0x88, 0x3b, 0x3f, 0x9c, 0x2b, 0xe8, 0x7d, 0xc3, 0x02, 0x84, 0x5d, 0x70,\n  0x58, 0x7a, 0x42, 0x83, 0x6e, 0xe8, 0x67, 0x25, 0xc2, 0x34, 0x45, 0xc7,\n  0x04, 0x25, 0x83, 0x7e, 0x5a, 0xdc, 0x10, 0x20, 0x84, 0x5f, 0x1e, 0xd4,\n  0xc9, 0xbd, 0x6a, 0x34, 0x25, 0x4f, 0x0c, 0x93, 0xfd, 0xef, 0x13, 0x46,\n  0xa4, 0xfa, 0xcb, 0xcd, 0xa3, 0xf3, 0x4e, 0x08, 0x52, 0x47, 0x65, 0x9d,\n  0x14, 0xdd, 0xf3, 0x70, 0x79, 0x31, 0x12, 0x6d, 0x8b, 0xb0, 0xad, 0xfe,\n  0xab, 0x46, 0x6d, 0xe1, 0xec, 0x7f, 0x1c, 0x1f, 0x53, 0x2f, 0x15, 0x7b,\n  0x06, 0x2b, 0x95, 0x38, 0x21, 0x71, 0x54, 0xdc, 0xaf, 0xc6, 0x06, 0x75,\n  0x88, 0x6e, 0x45, 0x50, 0x9a, 0x54, 0x32, 0x7e, 0xf6, 0xfc, 0x9b, 0x19,\n  0xf4, 0xe7, 0x46, 0x0d, 0xb1, 0xa0, 0x3b, 0x47, 0xb1, 0x31, 0x3d, 0xa1,\n  0x08, 0xc3, 0x8f, 0x4d, 0x30, 0xdd, 0x16, 0x03, 0x4d, 0x0d, 0x27, 0x78,\n  0x37, 0x7b, 0xa7, 0x87, 0x3b, 0xf9, 0x70, 0x4f, 0xaa, 0xd6, 0x1a, 0x81,\n  0x3c, 0xc3, 0x0f, 0x58, 0x6f, 0xad, 0xcf, 0x9f, 0xcf, 0xf2, 0x8b, 0xc7,\n  0xcf, 0x62, 0xb1, 0xd2, 0x57, 0xab, 0x37, 0x02, 0xa4, 0x46, 0x2d, 0x4e,\n  0xde, 0xa2, 0x38, 0x30, 0x40, 0xee, 0x8d, 0xbf, 0xee, 0x36, 0xa2, 0x95,\n  0xc6, 0x04, 0xe9, 0x83, 0xfd, 0xc3, 0xc0, 0xc1, 0xe4, 0x69, 0xa9, 0xaf,\n  0x14, 0xce, 0x66, 0x0e, 0x97, 0xed, 0x2d, 0x15, 0xc3, 0x25, 0xd1, 0x98,\n  0x67, 0x30, 0xcd, 0x1e, 0x36, 0x3c, 0x96, 0x3d, 0x82, 0x2e, 0xb1, 0xda,\n  0x7f, 0x37, 0xb6, 0x11, 0x76, 0xe8, 0xe1, 0xee, 0x36, 0x29, 0x66, 0x32,\n  0xe2, 0xd1, 0x1c, 0xc5, 0x3b, 0x4e, 0xdf, 0x7a, 0x64, 0xba, 0x1f, 0x68,\n  0x12, 0x32, 0x9c, 0xca, 0xff, 0x2f, 0xe8, 0xb1, 0xd1, 0xda, 0x4c, 0xac,\n  0x6e, 0xc6, 0x46, 0x0b, 0x26, 0xc3, 0x8f, 0x42, 0xd8, 0xe8, 0x23, 0x9e,\n  0xc1, 0xb6, 0x8d, 0xe5, 0x9e, 0x8d, 0xc5, 0x61, 0x3e, 0x13, 0xc2, 0x3c,\n  0x23, 0x1f, 0x90, 0xb6, 0xa6, 0xc4, 0xa0, 0xe5, 0xc2, 0xf8, 0xb0, 0x4e,\n  0x9e, 0xd8, 0x9c, 0x30, 0x5c, 0x0c, 0xcb, 0x44, 0xfe, 0x25, 0x74, 0xcb,\n  0xa6, 0xe7, 0x6c, 0x38, 0x7d, 0x4a, 0x50, 0xe1, 0x48, 0xb8, 0xe6, 0xa6,\n  0x68, 0x0b, 0x3a, 0x55, 0xd0, 0xcf, 0xc2, 0xa3, 0xd2, 0x82, 0xdf, 0x10,\n  0x66, 0x64, 0xab, 0xc6, 0x15, 0x98, 0xfa, 0xdf, 0xad, 0xe7, 0xab, 0xbc,\n  0x80, 0xa5, 0x12, 0x08, 0x10, 0x16, 0x9f, 0xe2, 0x67, 0x2e, 0x57, 0x03,\n  0x4b, 0x53, 0xf5, 0x6f, 0x38, 0x09, 0x85, 0x57, 0xb6, 0x88, 0xaf, 0x84,\n  0xf1, 0xe8, 0x56, 0x4f, 0x1e, 0x95, 0x1e, 0xdf, 0x08, 0xac, 0xa6, 0x87,\n  0x12, 0x86, 0xe1, 0x40, 0x64, 0xb4, 0xca, 0xb0, 0x02, 0x0a, 0x84, 0x6c,\n  0x1b, 0xae, 0x4e, 0x10, 0x52, 0x82, 0xdf, 0x90, 0xa5, 0xd2, 0xa4, 0x2b,\n  0xa1, 0x6f, 0x62, 0x4b, 0xaa, 0xa0, 0x75, 0xfd, 0x2a, 0xe0, 0x5a, 0x6c,\n  0xcb, 0x94, 0x50, 0x7b, 0x06, 0xfc, 0x13, 0xf5, 0x6a, 0x71, 0x6d, 0x78,\n  0xef, 0xf4, 0xfa, 0x60, 0xbd, 0xbf, 0x54, 0xad, 0x63, 0xa5, 0x32, 0xf8,\n  0x8c, 0x3f, 0x8b, 0x6d, 0x1f, 0xb2, 0xd8, 0xf6, 0x21, 0x8b, 0x6d, 0x1f,\n  0xb2, 0xd8, 0xf6, 0x21, 0x8b, 0x6d, 0x1f, 0xb2, 0xd8, 0x16, 0x2c, 0x8b,\n  0xed, 0x1f, 0xb2, 0xd8, 0xfe, 0x21, 0x8b, 0xed, 0x1f, 0xb2, 0xd8, 0xfe,\n  0x21, 0x8b, 0xed, 0x1f, 0xb2, 0xd8, 0xfe, 0x21, 0x8b, 0xed, 0x1f, 0xb2,\n  0xd1, 0xb6, 0x60, 0xd8, 0xd6, 0xa0, 0x80, 0x6d, 0x0d, 0x0a, 0xd8, 0xd6,\n  0xa0, 0x80, 0x6d, 0x0d, 0x0a, 0xd8, 0xd6, 0xa0, 0x80, 0x6d, 0x0d, 0x0a,\n  0x6e, 0x54, 0x0e, 0xdb, 0x89, 0x61, 0x5b, 0x83, 0x02, 0x36, 0xc8, 0x2f,\n  0x60, 0x83, 0xfc, 0x02, 0xb6, 0x39, 0x28, 0x60, 0x9b, 0x83, 0x02, 0xb6,\n  0x39, 0x28, 0x60, 0xc3, 0xfc, 0x02, 0xb6, 0x31, 0x28, 0x60, 0x1b, 0x83,\n  0x42, 0xf8, 0xe2, 0xb4, 0x59, 0x08, 0xb7, 0x67, 0x20, 0xd4, 0x00, 0x35,\n  0x41, 0x2d, 0x50, 0x1b, 0x34, 0x09, 0xea, 0x80, 0xa6, 0x40, 0xd3, 0xa0,\n  0x19, 0xd0, 0x2c, 0x68, 0x0e, 0x34, 0x0f, 0x1a, 0xe1, 0xb9, 0xa0, 0xe1,\n  0x0a, 0x22, 0xea, 0x61, 0xa2, 0x1e, 0x26, 0xea, 0x61, 0xa2, 0x1e, 0x26,\n  0xea, 0x61, 0xa2, 0x1e, 0x84, 0x02, 0xdf, 0x03, 0xbe, 0x07, 0x7c, 0x6c,\n  0xfc, 0x5f, 0xf0, 0x80, 0xef, 0x01, 0xdf, 0x03, 0x7e, 0x54, 0x5f, 0x6c,\n  0xdb, 0x50, 0xc0, 0x41, 0x47, 0x38, 0xa0, 0xc8, 0xc3, 0xb6, 0x63, 0x1e,\n  0xb6, 0x1d, 0xf3, 0xb0, 0xed, 0x98, 0x87, 0x6d, 0xc7, 0x3c, 0x6c, 0x3b,\n  0xe6, 0x61, 0xdb, 0x31, 0x2f, 0xd8, 0x76, 0x6c, 0x20, 0xe8, 0x61, 0xe2,\n  0x60, 0x3d, 0xa0, 0x4a, 0xa8, 0x3b, 0x82, 0xae, 0x86, 0x7b, 0xee, 0xb6,\n  0x35, 0xbb, 0x87, 0xfe, 0xea, 0xd8, 0x08, 0x0f, 0xd1, 0x5f, 0x0b, 0x8b,\n  0x3b, 0x6d, 0xf0, 0xa9, 0x4f, 0xd4, 0xbb, 0x49, 0x64, 0xfc, 0x68, 0x57,\n  0xd1, 0x5f, 0x4b, 0x1b, 0xe9, 0x2d, 0xfa, 0x45, 0x62, 0x87, 0xd1, 0x8f,\n  0xc4, 0x2a, 0xc9, 0x5f, 0x4a, 0x8b, 0xdc, 0x46, 0xff, 0x42, 0xec, 0x39,\n  0xfa, 0x2b, 0x6e, 0xc3, 0x8a, 0xca, 0x8f, 0x0d, 0x7b, 0x1a, 0xc1, 0xa7,\n  0x1a, 0xd1, 0x21, 0xab, 0xfe, 0x02, 0x9c, 0xbf, 0x76, 0x53, 0xef, 0xaf,\n  0xf5, 0x95, 0xaa, 0xe5, 0xe0, 0xb1, 0x5a, 0x1b, 0xbe, 0xc1, 0x12, 0x18,\n  0x87, 0xee, 0x72, 0xb1, 0xb2, 0xa1, 0x51, 0x5e, 0x1b, 0xbe, 0x07, 0x1c,\n  0x68, 0xd8, 0x0d, 0xfd, 0xb5, 0x1e, 0xff, 0x21, 0xee, 0x8b, 0x0a, 0x10,\n  0xd8, 0x46, 0xa5, 0xe6, 0x87, 0x66, 0x75, 0x6d, 0x98, 0x18, 0xfb, 0x4d,\n  0xc1, 0x6a, 0x09, 0x52, 0x27, 0x74, 0x17, 0xeb, 0xe5, 0x62, 0x7f, 0xb5,\n  0x34, 0x18, 0x59, 0x0a, 0x3f, 0xd1, 0x3f, 0xe7, 0xaf, 0x3c, 0x2a, 0xb1,\n  0xad, 0x9f, 0x78, 0x58, 0x04, 0xb1, 0x84, 0x38, 0xde, 0x78, 0xc6, 0x9b,\n  0xce, 0xf8, 0x8a, 0xce, 0xc1, 0x57, 0x74, 0x0e, 0xbe, 0xa2, 0x73, 0xf0,\n  0x15, 0x9d, 0x83, 0xaf, 0xe8, 0x1c, 0x7c, 0xe5, 0xeb, 0xe0, 0x6b, 0x3a,\n  0x07, 0x5f, 0xfb, 0x3a, 0xf8, 0xaa, 0xce, 0xc1, 0x57, 0xbf, 0x4e, 0x26,\n  0x7a, 0x85, 0x1e, 0xdd, 0x24, 0x5c, 0x76, 0xf4, 0xb0, 0xbb, 0x1c, 0xc9,\n  0x87, 0x57, 0xeb, 0x53, 0xd1, 0x02, 0xb8, 0xc9, 0xfb, 0xc7, 0xb6, 0x76,\n  0xf2, 0x0b, 0x82, 0xdf, 0xfd, 0x83, 0xdf, 0x85, 0xc1, 0xef, 0x92, 0xe0,\n  0x37, 0xa8, 0x86, 0x50, 0x2c, 0x85, 0xa4, 0x16, 0x92, 0x75, 0x41, 0x2b,\n  0x75, 0x35, 0x39, 0x7e, 0x7c, 0x57, 0xf0, 0x1b, 0x38, 0xdc, 0x7c, 0xb8,\n  0x15, 0x6f, 0xa9, 0xd1, 0x1b, 0x98, 0xab, 0xd5, 0xa4, 0xf9, 0x1a, 0x25,\n  0x7f, 0xe1, 0x9e, 0x28, 0xb1, 0xd0, 0x99, 0xe6, 0x83, 0x1b, 0xcc, 0x07,\n  0xd7, 0xf9, 0xb0, 0xc9, 0xcb, 0xd5, 0xfa, 0x20, 0xf1, 0x04, 0x43, 0x06,\n  0xc1, 0x6d, 0xe5, 0x03, 0x77, 0x45, 0x0e, 0x3e, 0xfb, 0x0c, 0xe2, 0x7d,\n  0xc1, 0x6f, 0x70, 0x07, 0xf8, 0x40, 0x90, 0xc4, 0x40, 0xac, 0x66, 0xf9,\n  0xc0, 0xce, 0xab, 0xc4, 0x68, 0x34, 0x06, 0xab, 0xdd, 0xa1, 0x48, 0x61,\n  0xa9, 0xa0, 0x0f, 0xf2, 0xc1, 0xd8, 0x80, 0x0f, 0xe4, 0xe6, 0x83, 0x3e,\n  0xc8, 0x6f, 0xf4, 0x7f, 0xb9, 0x03, 0xfb, 0x6a, 0xdd, 0x63, 0xe2, 0x93,\n  0xe4, 0xf0, 0x55, 0x6a, 0x9c, 0x90, 0x8c, 0x3e, 0x53, 0xc5, 0x97, 0x4e,\n  0x51, 0x14, 0x1b, 0xbb, 0x8f, 0x88, 0x66, 0x0a, 0x23, 0xa2, 0x39, 0xb3,\n  0x39, 0x6a, 0x79, 0x56, 0x53, 0xd4, 0xdf, 0x44, 0x74, 0x44, 0x34, 0xe3,\n  0x8c, 0x88, 0x66, 0xed, 0x91, 0xd1, 0x74, 0x73, 0x94, 0x3c, 0xc1, 0x23,\n  0xa2, 0xf9, 0x1c, 0xa2, 0xc1, 0xb3, 0x9b, 0xc7, 0x76, 0x4c, 0x79, 0x6c,\n  0xc7, 0x94, 0xc7, 0x76, 0x4c, 0x79, 0x6c, 0xc7, 0x94, 0xc7, 0x76, 0x4c,\n  0x79, 0x6c, 0xc7, 0x94, 0xc7, 0x76, 0x4c, 0x79, 0x6c, 0xc7, 0x94, 0x8f,\n  0x76, 0xd1, 0xc8, 0xe2, 0x75, 0x50, 0x7c, 0x03, 0x92, 0xc3, 0x97, 0x08,\n  0x39, 0xbc, 0x1b, 0x9e, 0x73, 0xa2, 0x8d, 0x4d, 0xa2, 0x37, 0x2a, 0xf0,\n  0xe6, 0x85, 0x6d, 0xeb, 0xd8, 0x16, 0x1e, 0x62, 0x29, 0xfe, 0x47, 0x31,\n  0x08, 0x6f, 0xb9, 0x99, 0x37, 0xa0, 0x47, 0x5e, 0x5a, 0xb3, 0x99, 0x4b,\n  0x63, 0x87, 0x3f, 0xeb, 0x6d, 0xaa, 0x6a, 0x07, 0xf6, 0x70, 0xe9, 0xc0,\n  0x5e, 0x2b, 0x1d, 0xd8, 0x6b, 0xa5, 0x03, 0x7b, 0xac, 0x74, 0x74, 0x44,\n  0x27, 0x72, 0x60, 0x97, 0x03, 0x03, 0xbb, 0x1c, 0x18, 0x38, 0x21, 0xc0,\n  0xb0, 0x70, 0xa2, 0x03, 0x4e, 0x04, 0x30, 0x70, 0x22, 0x80, 0x81, 0x1d,\n  0xfd, 0x0d, 0xec, 0xe8, 0x6f, 0x24, 0x23, 0x1a, 0x9d, 0x98, 0x80, 0xcd,\n  0xa9, 0xb1, 0x63, 0xb2, 0x89, 0x5d, 0x17, 0x4c, 0xec, 0xba, 0x60, 0x61,\n  0x5f, 0x76, 0x0b, 0x9b, 0x9d, 0x5b, 0xd1, 0xd9, 0x73, 0xd1, 0x59, 0x59,\n  0x38, 0x29, 0xc2, 0xee, 0x88, 0xe2, 0x38, 0xbb, 0x09, 0x27, 0x45, 0xd8,\n  0x38, 0x29, 0xc2, 0xc6, 0x49, 0x11, 0x36, 0x4e, 0x8a, 0xb0, 0x71, 0x52,\n  0x84, 0x8d, 0x93, 0x22, 0x6c, 0x9c, 0x14, 0x61, 0xe3, 0xa4, 0x08, 0x1b,\n  0x27, 0x45, 0xd8, 0x38, 0x21, 0xc2, 0xc6, 0x09, 0x11, 0x36, 0x4e, 0x88,\n  0xb0, 0x71, 0x42, 0x84, 0x8d, 0x13, 0x22, 0x6c, 0x9c, 0x10, 0x61, 0x63,\n  0x57, 0x09, 0x1b, 0xbb, 0x4a, 0xd8, 0xd8, 0x55, 0xc2, 0xc6, 0xae, 0x12,\n  0x36, 0xea, 0x67, 0xa3, 0x7e, 0x36, 0xea, 0x6f, 0xa3, 0xfe, 0x36, 0x76,\n  0x8c, 0xb6, 0x71, 0x82, 0x84, 0x8d, 0x5d, 0x27, 0x6c, 0xec, 0x3a, 0x61,\n  0x63, 0xd7, 0x09, 0x1b, 0xbb, 0x4e, 0xd8, 0xb8, 0x1f, 0x36, 0xee, 0x87,\n  0x8d, 0x5d, 0x27, 0x6c, 0xec, 0x3a, 0x61, 0x63, 0xd7, 0x09, 0x1b, 0x27,\n  0x48, 0xd8, 0xf8, 0xbc, 0xc7, 0xc6, 0x47, 0x26, 0x36, 0x3e, 0xf3, 0xb1,\n  0xf1, 0xb1, 0x89, 0x8d, 0xcf, 0x7d, 0x6c, 0x7c, 0x74, 0x62, 0xe3, 0x04,\n  0x09, 0x1b, 0x27, 0x48, 0xd8, 0x38, 0x41, 0xc2, 0xc6, 0x09, 0x12, 0x36,\n  0x4e, 0x90, 0xb0, 0x71, 0x82, 0x84, 0x8d, 0x13, 0x24, 0x6c, 0x9c, 0x20,\n  0x61, 0xa3, 0x7f, 0xd8, 0xe8, 0x1f, 0x36, 0x4e, 0x92, 0xb0, 0x71, 0x92,\n  0x84, 0x8d, 0x93, 0x24, 0x6c, 0xf4, 0x1b, 0x1b, 0xfd, 0xc6, 0xc6, 0x49,\n  0x12, 0x36, 0x4e, 0x92, 0xb0, 0x71, 0x92, 0x84, 0x8d, 0x93, 0x24, 0x6c,\n  0x9c, 0x24, 0x61, 0xe3, 0x24, 0x09, 0x1b, 0x27, 0x49, 0xd8, 0x38, 0x49,\n  0xc2, 0x46, 0xbf, 0xb3, 0xd1, 0xef, 0x6c, 0x9c, 0x24, 0x61, 0xe3, 0x24,\n  0x09, 0x1b, 0x27, 0x49, 0xd8, 0x38, 0x49, 0xc2, 0xc6, 0x49, 0x12, 0x36,\n  0x4e, 0x92, 0xb0, 0x71, 0x92, 0x84, 0x8d, 0x93, 0x24, 0x6c, 0x9c, 0x24,\n  0x61, 0xe3, 0x04, 0x09, 0x1b, 0x27, 0x48, 0xd8, 0x38, 0x41, 0xc2, 0xc6,\n  0x09, 0x12, 0x36, 0x4e, 0x90, 0xb0, 0xd1, 0xcf, 0x6d, 0xf4, 0x73, 0x1b,\n  0x27, 0x48, 0xd8, 0x38, 0x41, 0xc2, 0x4e, 0x02, 0x17, 0x27, 0x49, 0xd8,\n  0x49, 0xe0, 0xe2, 0x44, 0x09, 0x3b, 0x19, 0x9d, 0xc9, 0x87, 0xfa, 0x46,\n  0x7b, 0x30, 0x19, 0xd8, 0xf3, 0x28, 0xfc, 0xba, 0xc7, 0x34, 0x70, 0xc6,\n  0xa3, 0x11, 0xf6, 0x3f, 0x42, 0x43, 0xd7, 0xc8, 0xc0, 0x7d, 0xb7, 0x4c,\n  0xbc, 0xa4, 0x82, 0x0d, 0x85, 0x3a, 0x52, 0x51, 0x79, 0xbc, 0xb4, 0x82,\n  0xb3, 0x1e, 0x0c, 0x9c, 0x54, 0x61, 0x44, 0x27, 0x55, 0x60, 0x5b, 0x77,\n  0x13, 0x67, 0x0e, 0x9a, 0x38, 0x09, 0xc9, 0xc4, 0x49, 0x48, 0x26, 0x4e,\n  0x42, 0x32, 0x71, 0x72, 0x91, 0x99, 0x89, 0xe2, 0x78, 0x9e, 0x33, 0xd1,\n  0xa1, 0x03, 0xd1, 0x36, 0xf0, 0x11, 0x2e, 0xf6, 0x76, 0x4a, 0x45, 0x72,\n  0x85, 0x2e, 0x9b, 0x91, 0x84, 0xfc, 0xd1, 0x0e, 0xa5, 0x5e, 0xb4, 0x71,\n  0x12, 0x76, 0xc4, 0xc4, 0x4e, 0x71, 0x2e, 0x5c, 0x57, 0xd7, 0x73, 0xdb,\n  0xa0, 0x6f, 0xe2, 0x6f, 0xca, 0xa1, 0x6f, 0xa2, 0x38, 0x76, 0x40, 0x89,\n  0x4e, 0xee, 0x40, 0x7d, 0x70, 0x86, 0xa4, 0x81, 0x1d, 0xe5, 0xcd, 0x64,\n  0x74, 0x92, 0x49, 0x74, 0x86, 0x14, 0x76, 0xe6, 0xc4, 0x4e, 0x75, 0x6e,\n  0x26, 0xda, 0xa8, 0x09, 0xf2, 0x44, 0x3b, 0x83, 0x62, 0x07, 0x30, 0xd7,\n  0xf3, 0x20, 0x47, 0x7e, 0x94, 0x1c, 0x4e, 0x14, 0x4f, 0x40, 0x5f, 0x06,\n  0x9f, 0x06, 0x07, 0x89, 0xcb, 0x96, 0xcc, 0x0f, 0xbe, 0xcc, 0x0c, 0xf5,\n  0xe6, 0x70, 0x30, 0x1f, 0x07, 0x49, 0xe9, 0x28, 0x98, 0x8c, 0x33, 0x10,\n  0x9d, 0x18, 0xa7, 0x3a, 0xd6, 0x70, 0x6a, 0x0e, 0xef, 0x45, 0x91, 0xc6,\n  0x34, 0x54, 0x28, 0xbb, 0xa6, 0x6f, 0xf0, 0x3a, 0x9a, 0x3f, 0xc8, 0xc3,\n  0x0e, 0x1b, 0x6d, 0x78, 0x86, 0xa3, 0xcf, 0xc8, 0xf0, 0xad, 0x17, 0xee,\n  0x15, 0xce, 0x0c, 0xb1, 0x70, 0x6e, 0xa5, 0x85, 0x83, 0x15, 0x2c, 0x9c,\n  0x29, 0x62, 0xe1, 0x2c, 0x11, 0x0b, 0x7d, 0xc8, 0x08, 0x75, 0x21, 0xa1,\n  0x79, 0xf4, 0x3d, 0xd0, 0x50, 0x97, 0x92, 0xf4, 0x68, 0x5f, 0x2e, 0x13,\n  0x14, 0xe9, 0xd8, 0xf5, 0xcc, 0xc0, 0xb9, 0xa4, 0x06, 0x76, 0x43, 0x33,\n  0x2c, 0xe4, 0xb7, 0xc0, 0xd7, 0x42, 0xdf, 0xc0, 0xae, 0x6a, 0x46, 0xb4,\n  0xab, 0x5a, 0x06, 0x7d, 0x2a, 0x83, 0xbe, 0x94, 0x41, 0x9f, 0xce, 0xe0,\n  0x45, 0xac, 0x0c, 0xf6, 0x05, 0xcb, 0x60, 0x77, 0xb4, 0x0c, 0xde, 0xaa,\n  0xca, 0xe0, 0x85, 0xc6, 0x68, 0x57, 0xb5, 0x34, 0xfa, 0x64, 0x1a, 0xcf,\n  0x58, 0x1a, 0xfb, 0x8d, 0xa5, 0x61, 0x96, 0xb1, 0x49, 0x58, 0x47, 0x1a,\n  0x78, 0x69, 0xe0, 0xa5, 0x81, 0x97, 0x06, 0x5e, 0x3a, 0xea, 0xcb, 0x78,\n  0x36, 0xe3, 0x38, 0x9e, 0xd1, 0x24, 0x9e, 0xcd, 0x24, 0xea, 0x1b, 0xea,\n  0x04, 0x42, 0xa3, 0x7c, 0xa8, 0x7f, 0x12, 0xf5, 0x4f, 0xa2, 0xfe, 0x49,\n  0xc8, 0x63, 0x47, 0x14, 0xbb, 0xbb, 0x61, 0x7f, 0xb3, 0x0e, 0x1b, 0x72,\n  0xd9, 0x90, 0xcb, 0x46, 0x3d, 0x6c, 0xd4, 0x0b, 0xfc, 0xb0, 0xbb, 0xb1,\n  0x89, 0xdd, 0x8d, 0x49, 0x3a, 0xda, 0x01, 0xba, 0x03, 0xbb, 0x3f, 0x9b,\n  0xd8, 0x75, 0xda, 0x74, 0xa3, 0x5d, 0xec, 0x42, 0x5d, 0x69, 0xba, 0xd1,\n  0xae, 0x74, 0x90, 0xb7, 0x03, 0xf5, 0xc2, 0x2e, 0xd3, 0x24, 0x8e, 0xf6,\n  0x45, 0xbd, 0x3a, 0xa2, 0x9d, 0x8e, 0x22, 0x77, 0x26, 0xda, 0x05, 0x2f,\n  0x7a, 0x91, 0xd4, 0x40, 0xbe, 0xf0, 0x99, 0x37, 0xb1, 0x1b, 0xb6, 0x89,\n  0x5d, 0xa5, 0x4d, 0xec, 0x6e, 0x6d, 0x62, 0xd7, 0x6c, 0x13, 0xbb, 0x60,\n  0x9b, 0xd8, 0x74, 0x8c, 0xf0, 0xc5, 0x8b, 0xa8, 0x06, 0xd2, 0xa3, 0x7e,\n  0x61, 0x47, 0xb8, 0xa8, 0x07, 0x76, 0xcd, 0xc3, 0xae, 0xcf, 0x26, 0x76,\n  0xd7, 0x36, 0xb1, 0xdb, 0xb6, 0x89, 0xdd, 0xb4, 0x89, 0x5c, 0x39, 0xf0,\n  0x8b, 0xda, 0x0f, 0xee, 0x18, 0xce, 0xd9, 0xc5, 0x30, 0xd1, 0xc4, 0x6e,\n  0xdd, 0x26, 0x76, 0xbd, 0x36, 0xb1, 0xfb, 0xb6, 0x89, 0x5d, 0xbd, 0x4d,\n  0xec, 0xd2, 0x6d, 0x62, 0x53, 0x34, 0x13, 0xbb, 0x50, 0x93, 0x7a, 0xa2,\n  0x3f, 0xa1, 0x1f, 0x60, 0xb7, 0x6c, 0x13, 0xbb, 0x65, 0x9b, 0xd8, 0x55,\n  0x9b, 0xe0, 0xa2, 0xbc, 0x15, 0xb5, 0x73, 0xf4, 0xe2, 0x2d, 0xda, 0xc1,\n  0x8a, 0xea, 0x85, 0xfb, 0x8e, 0x7e, 0xd2, 0x81, 0xfe, 0xd3, 0x11, 0xbd,\n  0x98, 0x6b, 0x45, 0xfd, 0x19, 0xf7, 0x2d, 0x0d, 0x3c, 0xd8, 0x04, 0x37,\n  0xba, 0x3f, 0x29, 0x5c, 0x4f, 0x45, 0xf2, 0x80, 0x4f, 0x74, 0x5f, 0x8d,\n  0xa8, 0x1e, 0x68, 0x1f, 0x2b, 0xc2, 0x41, 0x7f, 0x8b, 0xe5, 0x00, 0xbf,\n  0xb8, 0x7f, 0x45, 0xbb, 0x1c, 0x46, 0xfd, 0x01, 0xf5, 0xc1, 0xe6, 0x7a,\n  0x1d, 0xd8, 0x4c, 0xaf, 0x23, 0x72, 0x7f, 0xb1, 0xd9, 0x5e, 0x87, 0x13,\n  0xed, 0xff, 0x07, 0xfe, 0x39, 0xf4, 0xf7, 0x5c, 0xb4, 0x5f, 0x20, 0xf0,\n  0x73, 0xd1, 0x4e, 0x5a, 0x78, 0x8e, 0x50, 0x1f, 0x03, 0xf2, 0x18, 0x36,\n  0xf4, 0x4b, 0x24, 0x27, 0x9e, 0x23, 0xc3, 0x8a, 0x9e, 0x57, 0xf0, 0x4d,\n  0x41, 0x5f, 0x45, 0x72, 0xa7, 0x71, 0x1f, 0x52, 0x51, 0xbf, 0x88, 0xda,\n  0x11, 0xb8, 0xb0, 0x05, 0x06, 0xfa, 0x83, 0x81, 0xfe, 0x61, 0xa0, 0x3f,\n  0x19, 0x1d, 0x91, 0xbe, 0xb2, 0xc1, 0x37, 0xd2, 0x73, 0x78, 0xce, 0x71,\n  0x5f, 0x0d, 0x03, 0xd7, 0xcd, 0x48, 0x5e, 0xc8, 0x81, 0xfb, 0x6f, 0x18,\n  0x91, 0x8d, 0x8f, 0xea, 0x07, 0x3c, 0xf4, 0xab, 0xc8, 0x07, 0x37, 0x0b,\n  0xd0, 0x8b, 0xf0, 0xe9, 0x2c, 0xf8, 0xb6, 0x16, 0x7c, 0x5d, 0x0b, 0x3e,\n  0xad, 0x05, 0x1f, 0xd9, 0x82, 0x6f, 0x6b, 0xc1, 0x27, 0xb6, 0xe0, 0xfb,\n  0x5a, 0xf0, 0x99, 0x2d, 0xf8, 0xcc, 0x16, 0x4e, 0x49, 0xb3, 0xe0, 0x03,\n  0x5b, 0xf0, 0x81, 0x2d, 0xf8, 0xc0, 0x16, 0x7c, 0x60, 0x0b, 0x3e, 0xb0,\n  0x05, 0x1f, 0xd8, 0x82, 0x0f, 0x6c, 0xc1, 0x07, 0xb6, 0xe0, 0x03, 0x5b,\n  0xf0, 0x81, 0x2d, 0xf8, 0xc0, 0x56, 0xe4, 0xe3, 0xc3, 0x07, 0xb6, 0xe0,\n  0x03, 0x5b, 0xf0, 0x81, 0x2d, 0xf8, 0xc0, 0x16, 0x7c, 0x60, 0x0b, 0x3e,\n  0xb0, 0x05, 0x1f, 0xd8, 0x82, 0xaf, 0x6b, 0xc1, 0xd7, 0xb5, 0xe0, 0xe3,\n  0x5a, 0xf0, 0x71, 0xad, 0xa8, 0x3d, 0xe0, 0xe3, 0x5a, 0xf0, 0x71, 0x2d,\n  0xf8, 0xb8, 0x16, 0x7c, 0x5c, 0x0b, 0x3e, 0xae, 0x05, 0x1f, 0xd7, 0x82,\n  0x8f, 0x6b, 0xc1, 0xc7, 0xb5, 0xe0, 0xe3, 0x5a, 0xf0, 0x71, 0x2d, 0xf8,\n  0xb8, 0x16, 0x7c, 0x58, 0x0b, 0x3e, 0xac, 0x05, 0x1f, 0xd6, 0x82, 0x0f,\n  0x6b, 0xc1, 0x87, 0xb5, 0xe0, 0xc3, 0x5a, 0xf0, 0x61, 0x2d, 0xf8, 0xb0,\n  0x16, 0x7c, 0x58, 0x0b, 0x3e, 0xaa, 0x05, 0x1f, 0xd5, 0x82, 0x8f, 0x6a,\n  0xc1, 0x47, 0xb5, 0xe0, 0xa3, 0x5a, 0xf0, 0x51, 0x2d, 0xf8, 0xa8, 0x16,\n  0x7c, 0x54, 0x0b, 0x3e, 0xaa, 0x05, 0x1f, 0xd5, 0xc2, 0x69, 0x67, 0x16,\n  0x7c, 0x55, 0x0b, 0xbe, 0xaa, 0x05, 0x5f, 0xd5, 0x82, 0xaf, 0x6a, 0xc1,\n  0x57, 0xb5, 0xe0, 0xab, 0x5a, 0xf0, 0x55, 0x2d, 0xf8, 0xaa, 0x16, 0x7c,\n  0x55, 0x0b, 0x3e, 0x92, 0x05, 0x5f, 0xd5, 0x82, 0x2f, 0x65, 0xc1, 0x97,\n  0xb2, 0xe0, 0xb3, 0x5a, 0xf0, 0x59, 0x2d, 0x9c, 0x82, 0x66, 0xe1, 0x14,\n  0x34, 0x2b, 0x3a, 0xe5, 0xc3, 0xc3, 0xf4, 0xa5, 0x87, 0xe9, 0x4b, 0xec,\n  0x3e, 0x5b, 0xc0, 0xee, 0xb6, 0x85, 0xbc, 0x93, 0x40, 0xff, 0x8d, 0x9c,\n  0x1b, 0xab, 0x23, 0x35, 0x1c, 0xcc, 0x0d, 0x07, 0xcd, 0xe1, 0x60, 0x7e,\n  0x38, 0xe8, 0x0c, 0x07, 0xb3, 0xc3, 0x41, 0x3b, 0x0e, 0x9a, 0x69, 0x78,\n  0x4a, 0xa4, 0xa9, 0xd0, 0x24, 0x18, 0x36, 0x58, 0x18, 0x36, 0x58, 0xd1,\n  0xb0, 0x01, 0xe7, 0x93, 0xd9, 0x38, 0x08, 0xd4, 0x4e, 0x47, 0xe9, 0x70,\n  0xeb, 0xa3, 0x03, 0x39, 0xb0, 0xf1, 0x6d, 0x01, 0x1b, 0xde, 0x16, 0xb0,\n  0xe1, 0x2d, 0x66, 0x52, 0x0d, 0xcc, 0xa4, 0x92, 0x26, 0xc0, 0x8c, 0x2c,\n  0x8e, 0x6c, 0x2d, 0xe0, 0xc8, 0xd6, 0x02, 0x36, 0xd8, 0x2d, 0x44, 0x07,\n  0x22, 0xe1, 0x68, 0x72, 0x0b, 0x47, 0x93, 0x5b, 0xd1, 0x81, 0x28, 0xd8,\n  0x70, 0xb7, 0x10, 0x1d, 0x90, 0xe4, 0x44, 0x34, 0xe2, 0x83, 0x99, 0x64,\n  0x1c, 0xe9, 0x5a, 0x28, 0x44, 0x33, 0xc6, 0xb8, 0xc5, 0xd1, 0x01, 0x29,\n  0xd1, 0x81, 0x49, 0xd1, 0xc1, 0x2a, 0xf9, 0x88, 0x4f, 0x34, 0xd3, 0x0c,\n  0x39, 0x71, 0xb6, 0x95, 0x85, 0x63, 0xe6, 0x2c, 0x27, 0x92, 0x0f, 0xb7,\n  0x3a, 0x3a, 0x50, 0xc5, 0x8d, 0xf6, 0x25, 0x2d, 0x50, 0x14, 0x4d, 0xd1,\n  0xdf, 0x7d, 0x47, 0xb5, 0x51, 0xff, 0x7f, 0xfc, 0x3b, 0x84, 0xfc, 0xcd,\n  0xa3, 0xe6, 0x31, 0x2f, 0x53, 0x14, 0x33, 0x99, 0xa2, 0xbe, 0x1b, 0xc3,\n  0xfc, 0xf8, 0xbb, 0xaf, 0x99, 0xed, 0xbe, 0xfb, 0xfa, 0xbb, 0x31, 0xc3,\n  0xd7, 0x48, 0xca, 0x37, 0xcc, 0x64, 0x3f, 0x8d, 0x79, 0x97, 0x84, 0xbf,\n  0xc5, 0xf5, 0x43, 0xc9, 0xdf, 0x7c, 0x6a, 0x3e, 0xb3, 0x27, 0x29, 0xeb,\n  0x7e, 0xf7, 0xcd, 0x70, 0xdc, 0x4f, 0x21, 0x69, 0x7b, 0x32, 0x85, 0xef,\n  0xbe, 0x21, 0xe9, 0x73, 0xc9, 0xdf, 0xde, 0xd4, 0xde, 0x74, 0x2f, 0xf5,\n  0xe9, 0x77, 0xd7, 0x7d, 0x37, 0x26, 0xa0, 0x57, 0x90, 0xf2, 0x51, 0xfa,\n  0xb6, 0xf4, 0xb6, 0x23, 0xe4, 0xf8, 0x1c, 0x92, 0xf8, 0x58, 0x9f, 0x03,\n  0x6b, 0x0f, 0xf2, 0x37, 0x93, 0x9a, 0x49, 0xef, 0xfa, 0xdd, 0xb1, 0x74,\n  0x91, 0xfa, 0x38, 0xe0, 0x63, 0x7e, 0xb7, 0x8e, 0x84, 0x43, 0x5e, 0xb8,\n  0xce, 0xbc, 0x42, 0x5f, 0xc7, 0x7c, 0xc8, 0x14, 0x09, 0xc7, 0xf3, 0x98,\n  0x0f, 0xe9, 0xcb, 0x48, 0xb8, 0x87, 0x9e, 0x42, 0x9d, 0x37, 0x44, 0xcd,\n  0x6c, 0x1f, 0xa2, 0x96, 0xaf, 0x70, 0x57, 0xb6, 0xb7, 0xcf, 0x7f, 0x88,\n  0xd2, 0x0f, 0x98, 0x3f, 0x24, 0x2c, 0x3d, 0x78, 0xc5, 0x90, 0x3d, 0x75,\n  0x68, 0xe7, 0x95, 0xab, 0x56, 0xb7, 0x9f, 0xb9, 0x7c, 0xc5, 0x10, 0xb3,\n  0x43, 0xf1, 0x61, 0x89, 0x92, 0xa8, 0xae, 0xae, 0xe9, 0x9d, 0x53, 0xa7,\n  0x4d, 0x1b, 0xa2, 0x56, 0x0e, 0x51, 0xf9, 0xe9, 0x85, 0x7b, 0x49, 0x7b,\n  0xe7, 0x57, 0xe5, 0x66, 0x0d, 0xd1, 0x33, 0x87, 0xda, 0x57, 0xad, 0x9e,\n  0x35, 0xc4, 0xcc, 0x9c, 0x3e, 0x6d, 0xfa, 0xb4, 0x59, 0x43, 0xec, 0xcc,\n  0xf6, 0xee, 0xfb, 0xd8, 0x09, 0x13, 0xa9, 0x5c, 0x7e, 0x68, 0x7c, 0xbe,\n  0x7d, 0xd5, 0xaa, 0xdc, 0x26, 0x66, 0x42, 0x3e, 0xb7, 0x69, 0x07, 0x36,\n  0x3f, 0xc4, 0xe4, 0x97, 0x1d, 0xd5, 0x3e, 0xa4, 0x4e, 0x27, 0x81, 0x7c,\n  0xb1, 0x7b, 0x88, 0x5b, 0x7c, 0xd4, 0xbd, 0x0c, 0xc3, 0x10, 0x36, 0x43,\n  0xd3, 0x4a, 0x5b, 0x4d, 0xf3, 0x53, 0xef, 0xd5, 0x27, 0xd2, 0xb9, 0xad,\n  0xda, 0x49, 0x70, 0x7a, 0xee, 0xde, 0xf1, 0xf4, 0x78, 0x72, 0x6d, 0xfa,\n  0x10, 0xb5, 0x78, 0x45, 0x69, 0xe5, 0xbd, 0x93, 0x68, 0x26, 0x00, 0xe4,\n  0x66, 0x0e, 0xb1, 0x33, 0x86, 0x26, 0xe6, 0x57, 0xf8, 0x78, 0x43, 0x93,\n  0xf2, 0x79, 0x64, 0x98, 0xda, 0xde, 0xdd, 0x3e, 0xf4, 0xd4, 0xe2, 0x21,\n  0x6e, 0xc7, 0x83, 0xef, 0xdd, 0x99, 0xd6, 0xf2, 0x6e, 0x97, 0x3b, 0x24,\n  0xb8, 0x2b, 0xa6, 0x0d, 0xb1, 0x3b, 0xac, 0x5c, 0x72, 0xc8, 0x0a, 0x92,\n  0x79, 0xea, 0x99, 0x2b, 0xda, 0x87, 0x16, 0x2f, 0x26, 0x49, 0xfb, 0x92,\n  0xdc, 0x43, 0x69, 0x3f, 0x94, 0x5e, 0xb9, 0xb2, 0x7d, 0x53, 0x98, 0x9b,\n  0x48, 0xb4, 0x33, 0x49, 0x42, 0xac, 0x7d, 0xa8, 0xc3, 0xbf, 0xde, 0xe1,\n  0xe7, 0x7c, 0x6a, 0xf1, 0x8a, 0x76, 0xd2, 0x1a, 0x67, 0x16, 0xdb, 0x87,\n  0x12, 0x8b, 0x57, 0xac, 0x22, 0x29, 0xed, 0xfe, 0xb5, 0x84, 0x1f, 0x72,\n  0xfc, 0x90, 0xb3, 0x6a, 0xea, 0xaa, 0x95, 0x2b, 0x57, 0x4e, 0x25, 0xad,\n  0x35, 0xa4, 0xe6, 0xbb, 0x86, 0xa8, 0x25, 0x2b, 0x86, 0xa8, 0xf9, 0x7e,\n  0xe6, 0x69, 0x24, 0x3e, 0x75, 0xfe, 0xd0, 0x36, 0x7e, 0x68, 0x9b, 0xf9,\n  0xc5, 0x87, 0xc6, 0x50, 0x5d, 0x7e, 0x8e, 0x87, 0x78, 0xaa, 0x73, 0xe5,\n  0xca, 0xee, 0xe2, 0xca, 0x21, 0x7a, 0xc6, 0xca, 0x95, 0xa8, 0xc1, 0xca,\n  0xf6, 0x6e, 0x52, 0x9f, 0xe9, 0xb9, 0x95, 0xb3, 0x86, 0xf8, 0x99, 0xed,\n  0x44, 0x02, 0x6e, 0x87, 0x22, 0xa9, 0x93, 0x98, 0x5f, 0xbc, 0x62, 0x48,\n  0x9c, 0x9e, 0x1b, 0x92, 0xa6, 0xe7, 0xc8, 0x1d, 0x20, 0x45, 0x56, 0xcd,\n  0x1a, 0x12, 0x82, 0xe6, 0x26, 0x2d, 0xd1, 0xde, 0xbd, 0x49, 0xec, 0xcc,\n  0xb5, 0xfb, 0x17, 0xfd, 0xea, 0x4e, 0x0d, 0xc5, 0xf7, 0x7f, 0x87, 0xe4,\n  0x55, 0x6e, 0xd7, 0x10, 0xbf, 0xeb, 0x34, 0x72, 0x31, 0xdf, 0x7e, 0x66,\n  0xfb, 0x99, 0x04, 0x6b, 0x53, 0x07, 0xbf, 0x03, 0x69, 0xa1, 0x03, 0x56,\n  0xac, 0x5a, 0x3c, 0xb5, 0xb8, 0x64, 0xe5, 0x8a, 0xe9, 0x2b, 0xa7, 0xad,\n  0x6c, 0x1f, 0xda, 0x77, 0xe9, 0x0a, 0x72, 0x6d, 0xaa, 0xdf, 0x2e, 0x10,\n  0x65, 0xd6, 0x90, 0x38, 0x73, 0x48, 0xce, 0xcf, 0xb8, 0x97, 0x62, 0xc2,\n  0xdb, 0x2c, 0x91, 0xe8, 0xf4, 0xdc, 0x74, 0xd2, 0x5d, 0xa6, 0xe7, 0x8a,\n  0x43, 0x4c, 0xe7, 0xea, 0x21, 0xba, 0x8b, 0x08, 0x32, 0x24, 0xee, 0x3a,\n  0x6b, 0x48, 0x9e, 0xd9, 0xee, 0x4b, 0xab, 0x93, 0x6a, 0x71, 0x54, 0x67,\n  0xbb, 0xcf, 0x61, 0x68, 0xdf, 0x55, 0x2b, 0xfd, 0x2c, 0xab, 0x0a, 0x81,\n  0xb4, 0x89, 0x99, 0xf7, 0xca, 0x3a, 0x95, 0x77, 0x73, 0xbb, 0x4e, 0x8b,\n  0x3b, 0x8e, 0x32, 0x73, 0x64, 0x47, 0x52, 0x43, 0x2e, 0xf4, 0x0c, 0x22,\n  0x42, 0x9e, 0x54, 0x7d, 0x55, 0xbb, 0x7b, 0xe6, 0xf4, 0xa2, 0x7f, 0x53,\n  0x83, 0xc6, 0xa6, 0xa6, 0xfa, 0x37, 0x64, 0xa8, 0x7d, 0x2a, 0x11, 0x32,\n  0x92, 0x92, 0xdc, 0xda, 0xe9, 0xc5, 0x42, 0x08, 0xa1, 0xb5, 0x28, 0x3e,\n  0xb4, 0x3d, 0x29, 0x45, 0x4d, 0x1d, 0xae, 0x5a, 0x73, 0x21, 0x7d, 0x66,\n  0x50, 0xa1, 0xfb, 0x34, 0x95, 0x62, 0x5d, 0x82, 0x32, 0x75, 0xfa, 0xb4,\n  0x95, 0xbb, 0x92, 0x4e, 0xdc, 0x36, 0x73, 0x13, 0xc3, 0xb8, 0x43, 0xdd,\n  0xc5, 0xc2, 0xac, 0xa1, 0x31, 0x33, 0x49, 0xd6, 0xf6, 0xf6, 0xa1, 0xb6,\n  0xfc, 0x7e, 0x3e, 0x03, 0x12, 0x20, 0x77, 0x68, 0x68, 0x8c, 0x1f, 0x5b,\n  0x42, 0x62, 0x63, 0x82, 0xfb, 0x35, 0x96, 0x30, 0x1a, 0x13, 0x34, 0x4a,\n  0x3b, 0x69, 0x83, 0x2e, 0x82, 0x3c, 0x34, 0x36, 0xbf, 0xaa, 0xfd, 0xcc,\n  0x55, 0xed, 0x43, 0x63, 0x49, 0xb3, 0xcd, 0x1a, 0x1a, 0x37, 0x73, 0xfe,\n  0xb2, 0x15, 0x9b, 0xb8, 0xee, 0xc2, 0xca, 0xed, 0x87, 0xb4, 0xd2, 0xf4,\n  0xa3, 0x66, 0x0d, 0x8d, 0x9f, 0x39, 0xff, 0x80, 0x15, 0xf3, 0x97, 0x86,\n  0x89, 0x53, 0xa7, 0x91, 0xf4, 0xf1, 0x41, 0xfa, 0x84, 0x99, 0x9b, 0xa8,\n  0x71, 0xf9, 0xe5, 0x2b, 0x36, 0x8d, 0x1b, 0x97, 0x1f, 0xa2, 0x8b, 0xb9,\n  0xa1, 0xb1, 0x33, 0xfc, 0x47, 0x8e, 0x74, 0xad, 0xdc, 0xa6, 0x36, 0xff,\n  0x67, 0x0c, 0xf9, 0x19, 0xa2, 0x27, 0x91, 0x7b, 0xc1, 0xee, 0xb0, 0x78,\n  0xc5, 0x26, 0xbf, 0xf9, 0x48, 0x7d, 0x73, 0x67, 0x92, 0x3b, 0x4c, 0x60,\n  0xc7, 0xec, 0x3a, 0x6d, 0x3a, 0x29, 0x16, 0x85, 0xa7, 0x86, 0xd7, 0xfd,\n  0x22, 0xe4, 0x49, 0xf6, 0x53, 0x56, 0x92, 0x9a, 0xcc, 0x21, 0xf2, 0xcf,\n  0x21, 0xa9, 0x23, 0x6f, 0x56, 0x8b, 0x5b, 0xb8, 0x89, 0xa2, 0xc6, 0x4f,\n  0x27, 0xed, 0x95, 0x1f, 0xa2, 0xf6, 0xbe, 0x97, 0xa6, 0xe9, 0xe0, 0x6e,\n  0x4d, 0x9c, 0x49, 0x6d, 0x22, 0xfa, 0x6d, 0xd9, 0x8a, 0xa1, 0x71, 0xd3,\n  0x73, 0xed, 0xee, 0x90, 0x4e, 0xba, 0x9f, 0x36, 0x9d, 0x74, 0x39, 0xd2,\n  0x15, 0x27, 0x90, 0x94, 0x55, 0x44, 0x86, 0x07, 0x27, 0x4f, 0xa6, 0xa9,\n  0xb1, 0xd4, 0x78, 0x2a, 0x97, 0xcb, 0xf9, 0x2d, 0x31, 0x81, 0x08, 0x42,\n  0xae, 0x6d, 0x9a, 0x20, 0xcd, 0x18, 0x3a, 0x6b, 0xc6, 0xd4, 0xed, 0x48,\n  0xbb, 0x4d, 0x22, 0x95, 0x9d, 0x38, 0x63, 0xd6, 0xd0, 0x16, 0x33, 0x37,\n  0xd1, 0x3e, 0x9d, 0x4c, 0x1a, 0xde, 0xa7, 0x53, 0x66, 0x6e, 0x62, 0x7d,\n  0xba, 0xe5, 0xcc, 0x4d, 0x9c, 0x4f, 0xa7, 0xce, 0xdc, 0xc4, 0xfb, 0x74,\n  0xab, 0x99, 0x9b, 0x04, 0x9f, 0x6e, 0x3d, 0x73, 0x93, 0xe8, 0xd3, 0x6d,\n  0x66, 0x6e, 0x92, 0x7c, 0xba, 0xed, 0xcc, 0x4d, 0xb2, 0x4f, 0x67, 0xcc,\n  0x9c, 0x1e, 0xdd, 0x88, 0x21, 0x61, 0x15, 0x69, 0xf2, 0xe9, 0xed, 0xb3,\n  0x87, 0xe8, 0xc3, 0xfc, 0xc7, 0x66, 0xd6, 0xd0, 0xcc, 0xa6, 0x8b, 0x93,\n  0xe2, 0x8b, 0x47, 0x86, 0x17, 0x67, 0x35, 0x5d, 0xdc, 0x31, 0xbe, 0x38,\n  0x10, 0x5e, 0x6c, 0x9f, 0x49, 0x0d, 0xb5, 0xcd, 0x68, 0x55, 0x61, 0xbf,\n  0xae, 0xf7, 0xff, 0x9f, 0xd6, 0xab, 0xb5, 0xa9, 0x8d, 0x2a, 0x0c, 0xef,\n  0xc2, 0x66, 0x9b, 0x4b, 0xa7, 0xd3, 0xb1, 0x09, 0xd4, 0x66, 0xc6, 0x59,\n  0xba, 0x84, 0x56, 0xb2, 0x2c, 0xb4, 0xd2, 0x36, 0x85, 0x40, 0x97, 0x5c,\n  0x4b, 0x6d, 0x35, 0x20, 0xd6, 0x44, 0x5b, 0x4d, 0x4a, 0xd0, 0x5a, 0x6f,\n  0x68, 0xbd, 0x60, 0xbd, 0xa1, 0xb5, 0x1a, 0xe3, 0xe8, 0x38, 0xe3, 0x1f,\n  0x39, 0x21, 0x7e, 0xa8, 0x7e, 0xca, 0x47, 0xff, 0x95, 0x3e, 0xcf, 0x39,\n  0x9b, 0x18, 0x20, 0xe0, 0x38, 0x23, 0xcc, 0x70, 0x9e, 0x73, 0xce, 0x73,\n  0xce, 0x79, 0xef, 0xef, 0xa2, 0x74, 0xa5, 0xa2, 0xfd, 0xfa, 0x8d, 0x41,\n  0x3f, 0x0b, 0x72, 0x9d, 0x86, 0x7e, 0x1c, 0x6d, 0xe8, 0xc7, 0x71, 0x1c,\n  0xfa, 0x71, 0x4c, 0x40, 0x3f, 0x8e, 0x13, 0xd0, 0x8f, 0xe3, 0x19, 0xe8,\n  0xc7, 0xf1, 0x2c, 0xf4, 0xe3, 0xf8, 0x34, 0xf4, 0xe3, 0x38, 0x09, 0xfd,\n  0x38, 0xba, 0x8e, 0x95, 0x96, 0x91, 0x3b, 0xed, 0xe0, 0xd9, 0x93, 0x55,\n  0x0b, 0xd5, 0x4f, 0xaf, 0x66, 0xa5, 0x6f, 0x91, 0x8d, 0x2e, 0x83, 0x77,\n  0xc6, 0x11, 0xd3, 0x49, 0x31, 0x8d, 0xc4, 0x3c, 0x87, 0x9c, 0x28, 0x5a,\n  0x07, 0xb8, 0xd5, 0xae, 0xa5, 0x6c, 0x56, 0xf8, 0x43, 0x19, 0x71, 0x6a,\n  0x7f, 0xbe, 0xeb, 0xeb, 0xd6, 0x31, 0x33, 0xcf, 0xd0, 0x13, 0xe7, 0x26,\n  0x5b, 0x01, 0x3d, 0x96, 0x2f, 0xa3, 0x3a, 0x52, 0xcb, 0x67, 0xfa, 0xcc,\n  0x73, 0x10, 0x67, 0xd6, 0xb1, 0x2e, 0x48, 0xc9, 0x2f, 0xe0, 0x36, 0xc5,\n  0xc9, 0xef, 0x7f, 0x13, 0xf9, 0x3b, 0x50, 0x16, 0xae, 0x6b, 0x23, 0xbf,\n  0xc9, 0xe6, 0x9c, 0x5b, 0xb4, 0x53, 0xad, 0x59, 0x3d, 0x46, 0x5d, 0x2f,\n  0xc2, 0x1e, 0x50, 0x60, 0xb0, 0xfc, 0xc8, 0x9a, 0x5a, 0x6a, 0x4a, 0x5c,\n  0x72, 0xdc, 0xd1, 0xf4, 0x94, 0x48, 0xfd, 0x1b, 0x15, 0x11, 0xbe, 0x0e,\n  0xfa, 0x65, 0xb8, 0x48, 0x1b, 0x49, 0x58, 0xae, 0x55, 0x64, 0x6d, 0x80,\n  0x69, 0x97, 0x9b, 0xcd, 0xa2, 0x5d, 0x44, 0x31, 0x29, 0xa3, 0x03, 0xa2,\n  0xfc, 0xa2, 0x35, 0xa5, 0x74, 0x3d, 0x16, 0x85, 0x85, 0xe7, 0x50, 0xc4,\n  0x46, 0xc4, 0x28, 0x68, 0x06, 0xea, 0x6a, 0x42, 0xd2, 0x5a, 0x47, 0xb5,\n  0x8c, 0x88, 0x64, 0x93, 0x1b, 0x4d, 0xd7, 0xb6, 0xac, 0x74, 0x13, 0x77,\n  0xce, 0xef, 0xa6, 0x59, 0xae, 0xba, 0x4f, 0x98, 0xc8, 0x06, 0x9f, 0x6d,\n  0x89, 0x2a, 0x8b, 0x8b, 0xb7, 0x52, 0x6e, 0x1b, 0x56, 0xc0, 0x8a, 0xb7,\n  0x8d, 0x89, 0xc0, 0xa9, 0x4a, 0x86, 0x25, 0x37, 0x8c, 0xea, 0x6d, 0xcb,\n  0x13, 0x76, 0xa1, 0x2a, 0xcc, 0xec, 0xde, 0xbc, 0xad, 0xb2, 0xec, 0xa9,\n  0xf6, 0x64, 0x64, 0xab, 0x75, 0x5b, 0x04, 0xd0, 0x5d, 0xb1, 0x6d, 0x64,\n  0x6b, 0x71, 0xe0, 0x2a, 0x4b, 0xde, 0xde, 0x33, 0x35, 0x88, 0x86, 0x46,\n  0x60, 0x17, 0xe0, 0x63, 0x1b, 0x2f, 0x14, 0xd8, 0xba, 0xc2, 0x59, 0xf9,\n  0x0a, 0xee, 0x1b, 0xf0, 0x88, 0xad, 0x8a, 0xab, 0x89, 0x24, 0x86, 0x33,\n  0x02, 0x08, 0xb8, 0xc0, 0xbe, 0x5b, 0x71, 0x23, 0x85, 0x48, 0x50, 0x88,\n  0x61, 0xfc, 0xf5, 0x4b, 0xea, 0x3f, 0x6f, 0x21, 0x10, 0xd2, 0x5d, 0x5b,\n  0x58, 0x58, 0x0d, 0x4c, 0xf8, 0xb6, 0xb0, 0xd3, 0x30, 0xd3, 0x42, 0x6f,\n  0x4b, 0x84, 0xe5, 0x7e, 0xc1, 0x2e, 0xf2, 0x51, 0x7a, 0x71, 0xb1, 0x67,\n  0x42, 0x2a, 0xa3, 0x2c, 0x2d, 0xb4, 0xb5, 0xb2, 0x6b, 0xa5, 0xd1, 0xd9,\n  0x29, 0xbd, 0xbf, 0x68, 0x51, 0x2e, 0xdf, 0x15, 0xc2, 0x4c, 0x60, 0xb6,\n  0xdc, 0xff, 0x11, 0xa3, 0x9c, 0x38, 0x28, 0xda, 0x7d, 0x6f, 0xd9, 0x0c,\n  0xf9, 0x2b, 0x7d, 0x92, 0x64, 0xbb, 0xee, 0xaa, 0xf2, 0x4b, 0x67, 0xaf,\n  0xca, 0x5d, 0x17, 0x7b, 0xa8, 0x1f, 0x2e, 0xad, 0x58, 0x10, 0xa3, 0xd9,\n  0x72, 0x29, 0x8e, 0xe6, 0x6a, 0xa5, 0x2b, 0x6e, 0x6b, 0x46, 0x8f, 0x22,\n  0x6f, 0x97, 0x76, 0xed, 0xae, 0xc6, 0x4b, 0xbb, 0x76, 0x33, 0x03, 0xcf,\n  0x1e, 0x76, 0x22, 0xeb, 0x88, 0xb9, 0xe4, 0x61, 0x0f, 0xe6, 0x1c, 0x31,\n  0x9f, 0x6c, 0x42, 0x36, 0xc6, 0x18, 0x94, 0x3a, 0x90, 0x0a, 0x87, 0xba,\n  0x62, 0x06, 0x27, 0xf2, 0x52, 0x65, 0xc6, 0xe7, 0x84, 0xb2, 0x7c, 0x0d,\n  0x5f, 0x6a, 0x19, 0xa5, 0x3a, 0x03, 0xd4, 0x46, 0xfa, 0xb8, 0xc8, 0x3c,\n  0x75, 0x7f, 0xc1, 0x69, 0x85, 0xd1, 0x74, 0xba, 0x47, 0xfe, 0x63, 0x48,\n  0x17, 0xff, 0xaf, 0x28, 0xa6, 0x4e, 0xac, 0x63, 0x69, 0x1b, 0xa5, 0xaa,\n  0x2f, 0x5e, 0xc6, 0x2a, 0xbe, 0x9c, 0x45, 0x14, 0xe0, 0xb9, 0x64, 0xd7,\n  0x2a, 0x57, 0x31, 0x9b, 0x4f, 0x8e, 0xd9, 0xbe, 0x5d, 0x7c, 0x6d, 0x7a,\n  0x26, 0x58, 0x86, 0x09, 0x62, 0x2a, 0xed, 0xf1, 0x59, 0x82, 0x0c, 0x3f,\n  0xe1, 0x8a, 0x8b, 0xc8, 0xf2, 0x6b, 0x07, 0xac, 0x3f, 0x8b, 0xeb, 0xf4,\n  0xe8, 0x09, 0x71, 0x09, 0xf8, 0xba, 0x23, 0x2e, 0x63, 0xb8, 0x41, 0x2b,\n  0xe6, 0x61, 0x6e, 0xab, 0x80, 0x0e, 0xdc, 0xb5, 0xd6, 0x73, 0x0e, 0x03,\n  0x5a, 0xdc, 0x00, 0x7c, 0xde, 0xd9, 0xd1, 0xb4, 0x02, 0x40, 0x09, 0x40,\n  0x27, 0x58, 0x71, 0x76, 0x74, 0xb9, 0xb2, 0x0a, 0x20, 0x57, 0x5e, 0x20,\n  0xa7, 0x08, 0xb0, 0x46, 0x0e, 0xc1, 0x8b, 0xe4, 0x10, 0xdc, 0x24, 0x87,\n  0xe0, 0x25, 0xa7, 0x8d, 0x5a, 0x98, 0x05, 0x2a, 0x03, 0xe9, 0x12, 0x55,\n  0x9c, 0xb6, 0xae, 0xd6, 0x5e, 0x06, 0x52, 0x6b, 0xaf, 0x90, 0xa7, 0x13,\n  0xdd, 0x22, 0x4f, 0xa2, 0xdb, 0xe4, 0x49, 0xf4, 0x2a, 0x79, 0x12, 0xbd,\n  0xc6, 0x37, 0xf3, 0x00, 0x55, 0xbe, 0x49, 0x50, 0xe3, 0x9b, 0x04, 0x77,\n  0xf8, 0x26, 0xc1, 0x3a, 0x39, 0x57, 0x01, 0xea, 0xe4, 0x10, 0x6c, 0x90,\n  0x43, 0xf0, 0x3a, 0x39, 0x04, 0x6f, 0x48, 0xb9, 0x72, 0x40, 0x77, 0xa5,\n  0x5c, 0x44, 0x6f, 0x4a, 0xb9, 0x88, 0xee, 0x49, 0xb9, 0x88, 0xde, 0x92,\n  0x72, 0x11, 0xbd, 0x2d, 0xe5, 0x22, 0x7a, 0x47, 0xca, 0x45, 0xf4, 0xae,\n  0x94, 0x8b, 0xe8, 0x3d, 0xd8, 0x38, 0xdd, 0x73, 0xe0, 0xa6, 0x9c, 0x09,\n  0x0f, 0xf0, 0x7d, 0x05, 0x97, 0x00, 0x3f, 0xa0, 0xd1, 0xe5, 0x2c, 0x83,\n  0xd9, 0x7d, 0xf4, 0x5a, 0x9f, 0xf3, 0xa1, 0x82, 0xe4, 0x7c, 0x24, 0x39,\n  0xba, 0xcf, 0xf9, 0x18, 0x87, 0x17, 0x7a, 0xb7, 0x7e, 0x22, 0x67, 0xf2,\n  0xc4, 0x96, 0x82, 0x3c, 0xf1, 0xa9, 0x82, 0xa4, 0x3f, 0xc0, 0x3d, 0x3e,\n  0xe1, 0x33, 0x05, 0x49, 0xf8, 0x5c, 0x41, 0x12, 0xbe, 0x00, 0x77, 0xb1,\n  0x77, 0xdf, 0x97, 0x72, 0x26, 0xe9, 0x5f, 0x29, 0x48, 0xfa, 0xb6, 0x82,\n  0xa4, 0x7f, 0x8d, 0x93, 0x3e, 0xe1, 0x1b, 0x05, 0x49, 0x78, 0xa8, 0x20,\n  0x09, 0xdf, 0x82, 0x7b, 0xa5, 0x77, 0xdf, 0x23, 0x39, 0x93, 0xf4, 0xef,\n  0x14, 0x24, 0xfd, 0x7b, 0x05, 0x49, 0x6f, 0xe0, 0xa4, 0x4f, 0xf8, 0x41,\n  0x41, 0x12, 0x9a, 0x0a, 0x92, 0xf0, 0xa3, 0xb3, 0x13, 0x91, 0x9f, 0xb8,\n  0xc2, 0x8c, 0xef, 0x18, 0x43, 0xc3, 0x79, 0xfc, 0xf7, 0x84, 0x32, 0x58,\n  0xc9, 0x24, 0x45, 0x70, 0x43, 0x0c, 0x8f, 0x97, 0xb6, 0xba, 0xcd, 0x7a,\n  0x8a, 0x2d, 0x16, 0xff, 0x0c, 0xfe, 0xb9, 0x8a, 0x4f, 0x4b, 0xfd, 0x67,\n  0xb4, 0x3b, 0x55, 0x39, 0x37, 0x5b, 0xda, 0x91, 0x8c, 0x17, 0xf9, 0xf5,\n  0xe1, 0x7d, 0xed, 0xf6, 0x8a, 0xb6, 0x30, 0x15, 0xd2, 0x26, 0xe5, 0x4a,\n  0xb4, 0x11, 0xdc, 0x0a, 0xde, 0x0d, 0xde, 0x19, 0xba, 0x69, 0x5e, 0x33,\n  0x33, 0xc6, 0xf9, 0xe0, 0xf8, 0x91, 0x50, 0xd8, 0xdf, 0xfa, 0xc5, 0xdc,\n  0x36, 0x37, 0xcd, 0x0d, 0xed, 0x96, 0x51, 0x32, 0x0a, 0x43, 0x73, 0x66,\n  0x32, 0x20, 0xb7, 0x8e, 0x67, 0x96, 0x22, 0xa7, 0xbd, 0xa7, 0xbc, 0x53,\n  0xde, 0xc9, 0x4e, 0xac, 0xf3, 0x44, 0xe7, 0x78, 0xe7, 0x68, 0x27, 0xe4,\n  0x69, 0x21, 0x2d, 0x82, 0xcd, 0x27, 0xb1, 0xa9, 0x79, 0xfb, 0x7e, 0xb9,\n  0xf9, 0xbb, 0x36, 0x8c, 0x28, 0x6a, 0x8d, 0xeb, 0x8d, 0x15, 0x54, 0x80,\n  0x46, 0x99, 0xf3, 0x7a, 0xae, 0x75, 0x96, 0xf3, 0xc7, 0x41, 0x4d, 0x2d,\n  0x68, 0xf8, 0x98, 0x6e, 0x9d, 0xe1, 0xd2, 0x1f, 0xc1, 0x6d, 0x4d, 0x37,\n  0xbc, 0xc6, 0xfa, 0x5a, 0x77, 0x83, 0x3f, 0x5e, 0xb4, 0x69, 0x3e, 0x30,\n  0xef, 0x99, 0x75, 0xbd, 0x6c, 0x5c, 0x37, 0x72, 0x43, 0xb3, 0xe6, 0x44,\n  0x20, 0x74, 0x6c, 0xf2, 0xb1, 0xfe, 0xd7, 0x23, 0x61, 0xfc, 0x84, 0xd6,\n  0x9f, 0x6b, 0x07, 0xea, 0xa6, 0x96, 0xcb, 0xc1, 0x0c, 0x7f, 0x03, 0x58,\n  0xbb, 0x58, 0xe7, 0x98, 0xc7, 0x07, 0x00\n};\nunsigned int NotoSans_Regular_ttf_gzip_len = 255211;\n"
  },
  {
    "path": "src/modules/font/Rasterizer.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"Rasterizer.h\"\n\n// UTF-8\n#include \"libraries/utf8/utf8.h\"\n\nnamespace love\n{\nnamespace font\n{\n\nlove::Type Rasterizer::type(\"Rasterizer\", &Object::type);\n\nRasterizer::~Rasterizer()\n{\n}\n\nint Rasterizer::getHeight() const\n{\n\treturn metrics.height;\n}\n\nint Rasterizer::getAdvance() const\n{\n\treturn metrics.advance;\n}\n\nint Rasterizer::getAscent() const\n{\n\treturn metrics.ascent;\n}\n\nint Rasterizer::getDescent() const\n{\n\treturn metrics.descent;\n}\n\nGlyphData *Rasterizer::getGlyphData(uint32 glyph) const\n{\n\treturn getGlyphDataForIndex(getGlyphIndex(glyph));\n}\n\nGlyphData *Rasterizer::getGlyphData(const std::string &text) const\n{\n\tuint32 codepoint = 0;\n\n\ttry\n\t{\n\t\tcodepoint = utf8::peek_next(text.begin(), text.end());\n\t}\n\tcatch (utf8::exception &e)\n\t{\n\t\tthrow love::Exception(\"UTF-8 decoding error: %s\", e.what());\n\t}\n\n\treturn getGlyphData(codepoint);\n}\n\nbool Rasterizer::hasGlyphs(const std::string &text) const\n{\n\tif (text.size() == 0)\n\t\treturn false;\n\n\ttry\n\t{\n\t\tutf8::iterator<std::string::const_iterator> i(text.begin(), text.begin(), text.end());\n\t\tutf8::iterator<std::string::const_iterator> end(text.end(), text.begin(), text.end());\n\n\t\twhile (i != end)\n\t\t{\n\t\t\tuint32 codepoint = *i++;\n\n\t\t\tif (!hasGlyph(codepoint))\n\t\t\t\treturn false;\n\t\t}\n\t}\n\tcatch (utf8::exception &e)\n\t{\n\t\tthrow love::Exception(\"UTF-8 decoding error: %s\", e.what());\n\t}\n\n\treturn true;\n}\n\nfloat Rasterizer::getKerning(uint32 /*leftglyph*/, uint32 /*rightglyph*/) const\n{\n\treturn 0.0f;\n}\n\nfloat Rasterizer::getDPIScale() const\n{\n\treturn dpiScale;\n}\n\n} // font\n} // love\n"
  },
  {
    "path": "src/modules/font/Rasterizer.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_FONT_RASTERIZER_H\n#define LOVE_FONT_RASTERIZER_H\n\n// LOVE\n#include \"common/Object.h\"\n#include \"common/int.h\"\n#include \"GlyphData.h\"\n\nnamespace love\n{\nnamespace font\n{\n\nclass TextShaper;\n\n/**\n * Holds the specific font metrics.\n **/\nstruct FontMetrics\n{\n\tint advance;\n\tint ascent;\n\tint descent;\n\tint height;\n};\n\n/**\n * Holds data for a font object.\n **/\nclass Rasterizer : public Object\n{\npublic:\n\n\tenum DataType\n\t{\n\t\tDATA_TRUETYPE,\n\t\tDATA_IMAGE,\n\t};\n\n\tstatic love::Type type;\n\n\tvirtual ~Rasterizer();\n\n\t/**\n\t * Gets the max height of the glyphs.\n\t **/\n\tvirtual int getHeight() const;\n\n\t/**\n\t * Gets the max advance of the glyphs.\n\t **/\n\tvirtual int getAdvance() const;\n\n\t/**\n\t * Gets the max ascent (height above baseline) for the font.\n\t **/\n\tvirtual int getAscent() const;\n\n\t/**\n\t * Gets the max descent (height below baseline) for the font.\n\t **/\n\tvirtual int getDescent() const;\n\n\t/**\n\t * Gets the line height of the font.\n\t **/\n\tvirtual int getLineHeight() const = 0;\n\n\t/**\n\t * Gets the spacing of the given unicode glyph.\n\t **/\n\tvirtual int getGlyphSpacing(uint32 glyph) const = 0;\n\n\t/**\n\t * Gets a rasterizer-specific index associated with the given glyph.\n\t **/\n\tvirtual int getGlyphIndex(uint32 glyph) const = 0;\n\n\t/**\n\t * Gets a specific glyph.\n\t * @param glyph The (UNICODE) glyph codepoint to get data for.\n\t **/\n\tGlyphData *getGlyphData(uint32 glyph) const;\n\n\t/**\n\t * Gets a specific glyph.\n\t * @param text The (UNICODE) glyph character to get the data for.\n\t **/\n\tGlyphData *getGlyphData(const std::string &text) const;\n\n\t/**\n\t * Gets a specific glyph for the given rasterizer glyph index.\n\t **/\n\tvirtual GlyphData *getGlyphDataForIndex(int index) const = 0;\n\n\t/**\n\t * Gets the number of glyphs the rasterizer has data for.\n\t **/\n\tvirtual int getGlyphCount() const = 0;\n\n\t/**\n\t * Gets whether this Rasterizer has a specific glyph.\n\t * @param glyph The (UNICODE) glyph codepoint.\n\t **/\n\tvirtual bool hasGlyph(uint32 glyph) const = 0;\n\n\t/**\n\t * Gets whether this Rasterizer has all the glyphs in a string.\n\t * @param text The (UTF-8) string.\n\t **/\n\tvirtual bool hasGlyphs(const std::string &text) const;\n\n\t/**\n\t * Gets the amount of horizontal kerning between two glyphs.\n\t **/\n\tvirtual float getKerning(uint32 leftglyph, uint32 rightglyph) const;\n\n\tvirtual DataType getDataType() const = 0;\n\n\tvirtual ptrdiff_t getHandle() const { return 0; }\n\n\tvirtual TextShaper *newTextShaper() = 0;\n\n\tfloat getDPIScale() const;\n\nprotected:\n\n\tFontMetrics metrics = {};\n\tfloat dpiScale = 1.0f;\n\tbool sdf = false;\n\n}; // Rasterizer\n\n} // font\n} // love\n\n#endif // LOVE_FONT_RASTERIZER_H\n"
  },
  {
    "path": "src/modules/font/TextShaper.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"TextShaper.h\"\n#include \"Rasterizer.h\"\n#include \"common/Exception.h\"\n\n#include \"libraries/utf8/utf8.h\"\n\nnamespace love\n{\nnamespace font\n{\n\nvoid getCodepointsFromString(const std::string &text, std::vector<uint32> &codepoints)\n{\n\tcodepoints.reserve(text.size());\n\n\ttry\n\t{\n\t\tutf8::iterator<std::string::const_iterator> i(text.begin(), text.begin(), text.end());\n\t\tutf8::iterator<std::string::const_iterator> end(text.end(), text.begin(), text.end());\n\n\t\twhile (i != end)\n\t\t{\n\t\t\tuint32 g = *i++;\n\t\t\tcodepoints.push_back(g);\n\t\t}\n\t}\n\tcatch (utf8::exception &e)\n\t{\n\t\tthrow love::Exception(\"UTF-8 decoding error: %s\", e.what());\n\t}\n}\n\nvoid getCodepointsFromString(const std::vector<ColoredString> &strs, ColoredCodepoints &codepoints)\n{\n\tif (strs.empty())\n\t\treturn;\n\n\tcodepoints.cps.reserve(strs[0].str.size());\n\n\tfor (const ColoredString &cstr : strs)\n\t{\n\t\t// No need to add the color if the string is empty anyway, and the code\n\t\t// further on assumes no two colors share the same starting position.\n\t\tif (cstr.str.size() == 0)\n\t\t\tcontinue;\n\n\t\tIndexedColor c = { cstr.color, (int)codepoints.cps.size() };\n\t\tcodepoints.colors.push_back(c);\n\n\t\tgetCodepointsFromString(cstr.str, codepoints.cps);\n\t}\n\n\tif (codepoints.colors.size() == 1)\n\t{\n\t\tIndexedColor c = codepoints.colors[0];\n\n\t\tif (c.index == 0 && c.color == Colorf(1.0f, 1.0f, 1.0f, 1.0f))\n\t\t\tcodepoints.colors.pop_back();\n\t}\n}\n\nlove::Type TextShaper::type(\"TextShaper\", &Object::type);\n\nTextShaper::TextShaper(Rasterizer *rasterizer)\n\t: rasterizers{rasterizer}\n\t, dpiScales{rasterizer->getDPIScale()}\n\t, height(floorf(rasterizer->getHeight() / rasterizer->getDPIScale() + 0.5f))\n\t, pixelHeight(rasterizer->getHeight())\n\t, lineHeight(1)\n\t, useSpacesForTab(false)\n{\n\tif (!rasterizer->hasGlyph('\\t'))\n\t\tuseSpacesForTab = true;\n}\n\nTextShaper::~TextShaper()\n{\n}\n\nfloat TextShaper::getHeight() const\n{\n\treturn height;\n}\n\nfloat TextShaper::getPixelHeight() const\n{\n\treturn pixelHeight;\n}\n\nfloat TextShaper::getCombinedHeight() const\n{\n\treturn floorf(pixelHeight * lineHeight + 0.5f) / rasterizers[0]->getDPIScale();\n}\n\nvoid TextShaper::setLineHeight(float h)\n{\n\tlineHeight = h;\n}\n\nfloat TextShaper::getLineHeight() const\n{\n\treturn lineHeight;\n}\n\nfloat TextShaper::getAscent() const\n{\n\treturn rasterizers[0]->getAscent() / rasterizers[0]->getDPIScale();\n}\n\nfloat TextShaper::getDescent() const\n{\n\treturn rasterizers[0]->getDescent() / rasterizers[0]->getDPIScale();\n}\n\nfloat TextShaper::getBaseline() const\n{\n\tfloat ascent = getAscent();\n\tif (ascent != 0.0f)\n\t\treturn ascent;\n\telse if (rasterizers[0]->getDataType() == font::Rasterizer::DATA_TRUETYPE)\n\t\treturn floorf(getPixelHeight() / 1.25f + 0.5f) / rasterizers[0]->getDPIScale(); // 1.25 is magic line height for true type fonts\n\telse\n\t\treturn 0.0f;\n}\n\nbool TextShaper::hasGlyph(uint32 glyph) const\n{\n\tfor (const StrongRef<Rasterizer> &r : rasterizers)\n\t{\n\t\tif (r->hasGlyph(glyph))\n\t\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool TextShaper::hasGlyphs(const std::string &text) const\n{\n\tif (text.size() == 0)\n\t\treturn false;\n\n\ttry\n\t{\n\t\tutf8::iterator<std::string::const_iterator> i(text.begin(), text.begin(), text.end());\n\t\tutf8::iterator<std::string::const_iterator> end(text.end(), text.begin(), text.end());\n\n\t\twhile (i != end)\n\t\t{\n\t\t\tuint32 codepoint = *i++;\n\n\t\t\tif (!hasGlyph(codepoint))\n\t\t\t\treturn false;\n\t\t}\n\t}\n\tcatch (utf8::exception &e)\n\t{\n\t\tthrow love::Exception(\"UTF-8 decoding error: %s\", e.what());\n\t}\n\n\treturn true;\n}\n\nfloat TextShaper::getKerning(uint32 leftglyph, uint32 rightglyph)\n{\n\tuint64 packedglyphs = ((uint64)leftglyph << 32) | (uint64)rightglyph;\n\n\tconst auto it = kerning.find(packedglyphs);\n\tif (it != kerning.end())\n\t\treturn it->second;\n\n\tfloat k = 0.0f;\n\tbool found = false;\n\n\tfor (const auto &r : rasterizers)\n\t{\n\t\tif (r->hasGlyph(leftglyph) && r->hasGlyph(rightglyph))\n\t\t{\n\t\t\tfound = true;\n\t\t\tk = r->getKerning(leftglyph, rightglyph) / r->getDPIScale();\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (!found)\n\t\tk = rasterizers[0]->getKerning(leftglyph, rightglyph) / rasterizers[0]->getDPIScale();\n\n\tkerning[packedglyphs] = k;\n\treturn k;\n}\n\nfloat TextShaper::getKerning(const std::string &leftchar, const std::string &rightchar)\n{\n\tuint32 left = 0;\n\tuint32 right = 0;\n\n\ttry\n\t{\n\t\tleft = utf8::peek_next(leftchar.begin(), leftchar.end());\n\t\tright = utf8::peek_next(rightchar.begin(), rightchar.end());\n\t}\n\tcatch (utf8::exception &e)\n\t{\n\t\tthrow love::Exception(\"UTF-8 decoding error: %s\", e.what());\n\t}\n\n\treturn getKerning(left, right);\n}\n\nfloat TextShaper::getGlyphAdvance(uint32 glyph, GlyphIndex *glyphindex)\n{\n\tconst auto it = glyphAdvances.find(glyph);\n\tif (it != glyphAdvances.end())\n\t{\n\t\tif (glyphindex)\n\t\t\t*glyphindex = it->second.second;\n\t\treturn it->second.first;\n\t}\n\n\tint rasterizeri = 0;\n\tuint32 realglyph = glyph;\n\n\tif (glyph == '\\t' && isUsingSpacesForTab())\n\t\trealglyph = ' ';\n\n\tfor (size_t i = 0; i < rasterizers.size(); i++)\n\t{\n\t\tif (rasterizers[i]->hasGlyph(realglyph))\n\t\t{\n\t\t\trasterizeri = (int) i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tconst auto &r = rasterizers[rasterizeri];\n\tfloat advance = r->getGlyphSpacing(realglyph) / r->getDPIScale();\n\n\tif (glyph == '\\t' && realglyph == ' ')\n\t\tadvance *= SPACES_PER_TAB;\n\n\tGlyphIndex glyphi = {r->getGlyphIndex(realglyph), rasterizeri};\n\n\tglyphAdvances[glyph] = std::make_pair(advance, glyphi);\n\tif (glyphindex)\n\t\t*glyphindex = glyphi;\n\treturn advance;\n}\n\nfloat TextShaper::getWidth(const std::string& str)\n{\n\tif (str.size() == 0) return 0;\n\n\tColoredCodepoints codepoints;\n\tgetCodepointsFromString(str, codepoints.cps);\n\n\tTextInfo info;\n\tcomputeGlyphPositions(codepoints, Range(), Vector2(0.0f, 0.0f), 0.0f, nullptr, nullptr, &info);\n\n\treturn info.width;\n}\n\nstatic size_t findNewline(const ColoredCodepoints &codepoints, size_t start)\n{\n\tfor (size_t i = start; i < codepoints.cps.size(); i++)\n\t{\n\t\tif (codepoints.cps[i] == '\\n')\n\t\t{\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn codepoints.cps.size();\n}\n\nvoid TextShaper::getWrap(const ColoredCodepoints &codepoints, float wraplimit, std::vector<Range> &lineranges, std::vector<float> *linewidths)\n{\n\tsize_t nextnewline = findNewline(codepoints, 0);\n\n\tfor (size_t i = 0; i < codepoints.cps.size();)\n\t{\n\t\tif (nextnewline < i)\n\t\t\tnextnewline = findNewline(codepoints, i);\n\n\t\tif (nextnewline == i) // Empty line.\n\t\t{\n\t\t\tlineranges.push_back(Range());\n\t\t\tif (linewidths)\n\t\t\t\tlinewidths->push_back(0);\n\t\t\ti++;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRange r(i, nextnewline - i);\n\t\t\tfloat width = 0.0f;\n\t\t\tint wrapindex = computeWordWrapIndex(codepoints, r, wraplimit, &width);\n\n\t\t\tif (wrapindex > (int) i)\n\t\t\t{\n\t\t\t\tr = Range(i, (size_t) wrapindex - i);\n\t\t\t\ti = (size_t)wrapindex;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tr = Range();\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t\t// We've already handled this line, skip the newline character.\n\t\t\tif (nextnewline == i)\n\t\t\t\ti++;\n\n\t\t\tlineranges.push_back(r);\n\t\t\tif (linewidths)\n\t\t\t\tlinewidths->push_back(width);\n\t\t}\n\t}\n}\n\nvoid TextShaper::getWrap(const std::vector<ColoredString> &text, float wraplimit, std::vector<std::string> &lines, std::vector<float> *linewidths)\n{\n\tColoredCodepoints cps;\n\tgetCodepointsFromString(text, cps);\n\n\tstd::vector<Range> codepointranges;\n\tgetWrap(cps, wraplimit, codepointranges, linewidths);\n\n\tstd::string line;\n\n\tfor (const auto &range : codepointranges)\n\t{\n\t\tline.clear();\n\n\t\tif (range.isValid())\n\t\t{\n\t\t\tline.reserve(range.getSize());\n\n\t\t\tfor (size_t i = range.getMin(); i <= range.getMax(); i++)\n\t\t\t{\n\t\t\t\tchar character[5] = { '\\0' };\n\t\t\t\tchar *end = utf8::unchecked::append(cps.cps[i], character);\n\t\t\t\tline.append(character, end - character);\n\t\t\t}\n\t\t}\n\n\t\tlines.push_back(line);\n\t}\n}\n\nvoid TextShaper::setFallbacks(const std::vector<Rasterizer*> &fallbacks)\n{\n\tfor (Rasterizer *r : fallbacks)\n\t{\n\t\tif (r->getDataType() != rasterizers[0]->getDataType())\n\t\t\tthrow love::Exception(\"Font fallbacks must be of the same font type.\");\n\t}\n\n\t// Clear caches.\n\tkerning.clear();\n\tglyphAdvances.clear();\n\n\trasterizers.resize(1);\n\tdpiScales.resize(1);\n\n\tfor (Rasterizer *r : fallbacks)\n\t{\n\t\trasterizers.push_back(r);\n\t\tdpiScales.push_back(r->getDPIScale());\n\t}\n}\n\n} // font\n} // love\n"
  },
  {
    "path": "src/modules/font/TextShaper.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/Object.h\"\n#include \"common/Vector.h\"\n#include \"common/int.h\"\n#include \"common/Color.h\"\n#include \"common/Range.h\"\n\n#include <vector>\n#include <string>\n#include <unordered_map>\n\nnamespace love\n{\nnamespace font\n{\n\nclass Rasterizer;\n\nstruct ColoredString\n{\n\tstd::string str;\n\tColorf color;\n};\n\nstruct IndexedColor\n{\n\tColorf color;\n\tint index;\n};\n\nstruct ColoredCodepoints\n{\n\tstd::vector<uint32> cps;\n\tstd::vector<IndexedColor> colors;\n};\n\nvoid getCodepointsFromString(const std::string &str, std::vector<uint32> &codepoints);\nvoid getCodepointsFromString(const std::vector<ColoredString> &strs, ColoredCodepoints &codepoints);\n\nclass TextShaper : public Object\n{\npublic:\n\n\tstruct GlyphIndex\n\t{\n\t\tint index;\n\t\tint rasterizerIndex;\n\t};\n\n\tstruct GlyphPosition\n\t{\n\t\tVector2 position;\n\t\tGlyphIndex glyphIndex;\n\t};\n\n\tstruct TextInfo\n\t{\n\t\tfloat width;\n\t\tfloat height;\n\t};\n\n\t// This will be used if the Rasterizer doesn't have a tab character itself.\n\tstatic const int SPACES_PER_TAB = 4;\n\n\tstatic love::Type type;\n\n\tvirtual ~TextShaper();\n\n\tconst std::vector<StrongRef<Rasterizer>> &getRasterizers() const { return rasterizers; }\n\tbool isUsingSpacesForTab() const { return useSpacesForTab; }\n\n\tfloat getHeight() const;\n\tfloat getPixelHeight() const;\n\n\tfloat getCombinedHeight() const;\n\n\t/**\n\t * Sets the line height (which should be a number to multiply the font size by,\n\t * example: line height = 1.2 and size = 12 means that rendered line height = 12*1.2)\n\t * @param height The new line height.\n\t **/\n\tvoid setLineHeight(float height);\n\n\t/**\n\t * Returns the line height.\n\t **/\n\tfloat getLineHeight() const;\n\n\t// Extra font metrics\n\tfloat getAscent() const;\n\tfloat getDescent() const;\n\tfloat getBaseline() const;\n\n\tbool hasGlyph(uint32 glyph) const;\n\tbool hasGlyphs(const std::string &text) const;\n\n\tfloat getKerning(uint32 leftglyph, uint32 rightglyph);\n\tfloat getKerning(const std::string &leftchar, const std::string &rightchar);\n\n\tfloat getGlyphAdvance(uint32 glyph, GlyphIndex *glyphindex = nullptr);\n\n\tfloat getWidth(const std::string &str);\n\n\tvoid getWrap(const std::vector<ColoredString> &text, float wraplimit, std::vector<std::string> &lines, std::vector<float> *linewidths = nullptr);\n\tvoid getWrap(const ColoredCodepoints &codepoints, float wraplimit, std::vector<Range> &lineranges, std::vector<float> *linewidths = nullptr);\n\n\tvirtual void setFallbacks(const std::vector<Rasterizer *> &fallbacks);\n\n\tvirtual void computeGlyphPositions(const ColoredCodepoints &codepoints, Range range, Vector2 offset, float extraspacing, std::vector<GlyphPosition> *positions, std::vector<IndexedColor> *colors, TextInfo *info) = 0;\n\tvirtual int computeWordWrapIndex(const ColoredCodepoints &codepoints, Range range, float wraplimit, float *width) = 0;\n\nprotected:\n\n\tTextShaper(Rasterizer *rasterizer);\n\n\tstatic inline bool isWhitespace(uint32 codepoint) { return codepoint == ' ' || codepoint == '\\t'; }\n\n\tstd::vector<StrongRef<Rasterizer>> rasterizers;\n\tstd::vector<float> dpiScales;\n\nprivate:\n\n\tint height;\n\tint pixelHeight;\n\tfloat lineHeight;\n\n\tbool useSpacesForTab;\n\n\t// maps glyphs to advance and glyph+rasterizer index.\n\tstd::unordered_map<uint32, std::pair<float, GlyphIndex>> glyphAdvances;\n\n\t// map of left/right glyph pairs to horizontal kerning.\n\tstd::unordered_map<uint64, float> kerning;\n\n}; // TextShaper\n\n} // font\n} // love\n"
  },
  {
    "path": "src/modules/font/TrueTypeRasterizer.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"TrueTypeRasterizer.h\"\n\nnamespace love\n{\nnamespace font\n{\n\nbool TrueTypeRasterizer::getConstant(const char *in, Hinting &out)\n{\n\treturn hintings.find(in, out);\n}\n\nbool TrueTypeRasterizer::getConstant(Hinting in, const char *&out)\n{\n\treturn hintings.find(in, out);\n}\n\nstd::vector<std::string> TrueTypeRasterizer::getConstants(Hinting)\n{\n\treturn hintings.getNames();\n}\n\nStringMap<TrueTypeRasterizer::Hinting, TrueTypeRasterizer::HINTING_MAX_ENUM>::Entry TrueTypeRasterizer::hintingEntries[] =\n{\n\t{\"normal\", HINTING_NORMAL},\n\t{\"light\", HINTING_LIGHT},\n\t{\"mono\", HINTING_MONO},\n\t{\"none\", HINTING_NONE},\n};\n\nStringMap<TrueTypeRasterizer::Hinting, TrueTypeRasterizer::HINTING_MAX_ENUM> TrueTypeRasterizer::hintings(TrueTypeRasterizer::hintingEntries, sizeof(TrueTypeRasterizer::hintingEntries));\n\n} // font\n} // love\n"
  },
  {
    "path": "src/modules/font/TrueTypeRasterizer.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_FONT_TRUE_TYPE_RASTERIZER_H\n#define LOVE_FONT_TRUE_TYPE_RASTERIZER_H\n\n// LOVE\n#include \"Rasterizer.h\"\n#include \"common/StringMap.h\"\n#include \"common/Optional.h\"\n\nnamespace love\n{\nnamespace font\n{\n\nclass TrueTypeRasterizer : public Rasterizer\n{\npublic:\n\n\t// Types of hinting for TrueType font glyphs.\n\tenum Hinting\n\t{\n\t\tHINTING_NORMAL,\n\t\tHINTING_LIGHT,\n\t\tHINTING_MONO,\n\t\tHINTING_NONE,\n\t\tHINTING_MAX_ENUM\n\t};\n\n\tstruct Settings\n\t{\n\t\tHinting hinting = HINTING_NORMAL;\n\t\tOptionalFloat dpiScale;\n\t\tbool sdf = false;\n\t};\n\n\tvirtual ~TrueTypeRasterizer() {}\n\n\tstatic bool getConstant(const char *in, Hinting &out);\n\tstatic bool getConstant(Hinting in, const char *&out);\n\tstatic std::vector<std::string> getConstants(Hinting);\n\nprivate:\n\n\tstatic StringMap<Hinting, HINTING_MAX_ENUM>::Entry hintingEntries[];\n\tstatic StringMap<Hinting, HINTING_MAX_ENUM> hintings;\n\n}; // TrueTypeRasterizer\n\n} // font\n} // love\n\n#endif // LOVE_FONT_TRUE_TYPE_RASTERIZER_H\n"
  },
  {
    "path": "src/modules/font/freetype/Font.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Font.h\"\n\n// LOVE\n#include \"TrueTypeRasterizer.h\"\n#include \"font/BMFontRasterizer.h\"\n#include \"window/Window.h\"\n\n// C++\n#include <string.h>\n\nnamespace love\n{\nnamespace font\n{\nnamespace freetype\n{\n\nFont::Font()\n\t: love::font::Font(\"love.font.freetype\")\n{\n\tif (FT_Init_FreeType(&library))\n\t\tthrow love::Exception(\"TrueTypeFont Loading error: FT_Init_FreeType failed\");\n}\n\nFont::~Font()\n{\n\tFT_Done_FreeType(library);\n}\n\nRasterizer *Font::newRasterizer(love::filesystem::FileData *data)\n{\n\tif (TrueTypeRasterizer::accepts(library, data))\n\t\treturn newTrueTypeRasterizer(data, 12, font::TrueTypeRasterizer::Settings());\n\telse if (BMFontRasterizer::accepts(data))\n\t\treturn newBMFontRasterizer(data, {}, 1.0f);\n\n\tthrow love::Exception(\"Invalid font file: %s\", data->getFilename().c_str());\n}\n\nRasterizer *Font::newTrueTypeRasterizer(love::Data *data, int size, const font::TrueTypeRasterizer::Settings &settings)\n{\n\tfloat defaultdpiscale = 1.0f;\n\tauto window = Module::getInstance<window::Window>(Module::M_WINDOW);\n\tif (window != nullptr)\n\t\tdefaultdpiscale = window->getDPIScale();\n\n\treturn new TrueTypeRasterizer(library, data, size, settings, defaultdpiscale);\n}\n\n} // freetype\n} // font\n} // love\n"
  },
  {
    "path": "src/modules/font/freetype/Font.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_FONT_FREETYPE_FONT_H\n#define LOVE_FONT_FREETYPE_FONT_H\n\n// LOVE\n#include \"font/Font.h\"\n\n// FreeType2\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_GLYPH_H\n\nnamespace love\n{\nnamespace font\n{\nnamespace freetype\n{\n\nclass Font : public love::font::Font\n{\npublic:\n\n\tFont();\n\tvirtual ~Font();\n\n\t// Implements Font\n\tRasterizer *newRasterizer(love::filesystem::FileData *data) override;\n\tRasterizer *newTrueTypeRasterizer(love::Data *data, int size, const font::TrueTypeRasterizer::Settings &settings) override;\n\nprivate:\n\n\t// FreeType library\n\tFT_Library library;\n\n}; // Font\n\n} // freetype\n} // font\n} // love\n\n#endif // LOVE_FONT_FREETYPE_FONT_H\n"
  },
  {
    "path": "src/modules/font/freetype/HarfbuzzShaper.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"HarfbuzzShaper.h\"\n#include \"TrueTypeRasterizer.h\"\n#include \"common/Optional.h\"\n\n// harfbuzz\n#include <hb.h>\n#include <hb-ft.h>\n\n#include <algorithm>\n\nnamespace love\n{\nnamespace font\n{\nnamespace freetype\n{\n\nHarfbuzzShaper::HarfbuzzShaper(TrueTypeRasterizer *rasterizer)\n\t: TextShaper(rasterizer)\n\t, spaceGlyphIndex()\n\t, tabSpacesAdvanceX(0)\n\t, tabSpacesAdvanceY(0)\n{\n\thbFonts.push_back(hb_ft_font_create_referenced((FT_Face)rasterizer->getHandle()));\n\thbBuffers.push_back(hb_buffer_create());\n\n\tif (hbFonts[0] == nullptr || hbFonts[0] == hb_font_get_empty())\n\t\tthrow love::Exception(\"Could not create Harfbuzz font object.\");\n\n\tif (hbBuffers[0] == nullptr || hbBuffers[0] == hb_buffer_get_empty())\n\t\tthrow love::Exception(\"Could not create Harfbuzz buffer object.\");\n\n\tupdateSpacesForTabInfo();\n}\n\nHarfbuzzShaper::~HarfbuzzShaper()\n{\n\tfor (hb_buffer_t *buffer : hbBuffers)\n\t\thb_buffer_destroy(buffer);\n\tfor (hb_font_t *font : hbFonts)\n\t\thb_font_destroy(font);\n}\n\nvoid HarfbuzzShaper::setFallbacks(const std::vector<Rasterizer*> &fallbacks)\n{\n\tfor (size_t i = 1; i < rasterizers.size(); i++)\n\t{\n\t\thb_buffer_destroy(hbBuffers[i]);\n\t\thb_font_destroy(hbFonts[i]);\n\t}\n\n\tTextShaper::setFallbacks(fallbacks);\n\n\thbFonts.resize(rasterizers.size());\n\thbBuffers.resize(rasterizers.size());\n\n\tfor (size_t i = 1; i < rasterizers.size(); i++)\n\t{\n\t\thbFonts[i] = hb_ft_font_create_referenced((FT_Face)rasterizers[i]->getHandle());\n\t\thbBuffers[i] = hb_buffer_create();\n\t}\n\n\tupdateSpacesForTabInfo();\n}\n\nvoid HarfbuzzShaper::updateSpacesForTabInfo()\n{\n\tif (!isUsingSpacesForTab())\n\t\treturn;\n\n\thb_codepoint_t glyphid = 0;\n\tfor (size_t i = 0; i < hbFonts.size(); i++)\n\t{\n\t\thb_font_t *hbfont = hbFonts[i];\n\t\tif (hb_font_get_glyph(hbfont, ' ', 0, &glyphid))\n\t\t{\n\t\t\tspaceGlyphIndex.index = glyphid;\n\t\t\tspaceGlyphIndex.rasterizerIndex = i;\n\t\t\ttabSpacesAdvanceX = hb_font_get_glyph_h_advance(hbfont, glyphid) * SPACES_PER_TAB;\n\t\t\ttabSpacesAdvanceY = hb_font_get_glyph_v_advance(hbfont, glyphid) * SPACES_PER_TAB;\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nbool HarfbuzzShaper::isValidGlyph(uint32 glyphindex, const std::vector<uint32> &codepoints, uint32 codepointindex)\n{\n\tif (glyphindex != 0)\n\t\treturn true;\n\n\tuint32 codepoint = codepoints[codepointindex];\n\tif (codepoint == '\\n' || codepoint == '\\r' || (codepoint == '\\t' && isUsingSpacesForTab()))\n\t\treturn true;\n\n\treturn false;\n}\n\nvoid HarfbuzzShaper::computeBufferRanges(const ColoredCodepoints &codepoints, Range range, std::vector<BufferRange> &bufferranges)\n{\n\tbufferranges.clear();\n\n\tif (codepoints.cps.size() == 0)\n\t\treturn;\n\n\t// Less computation for the typical case (no fallback fonts).\n\tif (rasterizers.size() == 1)\n\t{\n\t\thb_buffer_reset(hbBuffers[0]);\n\t\thb_buffer_add_codepoints(hbBuffers[0], codepoints.cps.data(), codepoints.cps.size(), (unsigned int)range.getOffset(), (int)range.getSize());\n\n\t\t// TODO: Expose APIs for direction and script?\n\t\thb_buffer_guess_segment_properties(hbBuffers[0]);\n\n\t\thb_shape(hbFonts[0], hbBuffers[0], nullptr, 0);\n\n\t\tbufferranges.push_back({0, (int) range.first, Range(0, hb_buffer_get_length(hbBuffers[0]))});\n\t\treturn;\n\t}\n\n\tstd::vector<Range> fallbackranges = { range };\n\n\t// For each font, figure out the ranges of valid glyphs in the given string,\n\t// and add the rest to a list to be shaped by the next fallback font.\n\t// Harfbuzz doesn't have its own fallback API.\n\tfor (size_t rasti = 0; rasti < rasterizers.size(); rasti++)\n\t{\n\t\thb_buffer_t *hbb = hbBuffers[rasti];\n\t\thb_buffer_reset(hbb);\n\n\t\tfor (Range r : fallbackranges)\n\t\t\thb_buffer_add_codepoints(hbb, codepoints.cps.data(), codepoints.cps.size(), (unsigned int)r.getOffset(), (int)r.getSize());\n\n\t\thb_buffer_guess_segment_properties(hbb);\n\n\t\thb_shape(hbFonts[rasti], hbb, nullptr, 0);\n\n\t\tsize_t glyphcount = (size_t)hb_buffer_get_length(hbb);\n\t\tconst hb_glyph_info_t *glyphinfos = hb_buffer_get_glyph_infos(hbb, nullptr);\n\t\thb_direction_t direction = hb_buffer_get_direction(hbb);\n\n\t\tfallbackranges.clear();\n\n\t\tfor (size_t i = 0; i < glyphcount; i++)\n\t\t{\n\t\t\tif (isValidGlyph(glyphinfos[i].codepoint, codepoints.cps, glyphinfos[i].cluster))\n\t\t\t{\n\t\t\t\tif (bufferranges.empty() || bufferranges.back().index != rasti || bufferranges.back().range.getMax() + 1 != i)\n\t\t\t\t\tbufferranges.push_back({rasti, (int)glyphinfos[i].cluster, Range(i, 1)});\n\t\t\t\telse\n\t\t\t\t\tbufferranges.back().range.last++;\n\t\t\t}\n\t\t\telse if (rasti == rasterizers.size() - 1)\n\t\t\t{\n\t\t\t\t// Use the first font for remaining invalid glyphs when no\n\t\t\t\t// fallback font supports them.\n\t\t\t\tif (bufferranges.empty() || bufferranges.back().index != 0 || bufferranges.back().range.getMax() + 1 != i)\n\t\t\t\t\tbufferranges.push_back({0, (int)glyphinfos[i].cluster, Range(i, 1)});\n\t\t\t\telse\n\t\t\t\t\tbufferranges.back().range.last++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Harfbuzz puts RTL text into the buffer in reverse order, so\n\t\t\t\t// it'll start with the last cluster (character index).\n\t\t\t\tif (fallbackranges.empty() || (direction == HB_DIRECTION_RTL ? fallbackranges.back().getMin() : fallbackranges.back().getMax()) != glyphinfos[i - 1].cluster)\n\t\t\t\t\tfallbackranges.push_back(Range(glyphinfos[i].cluster, 1));\n\t\t\t\telse\n\t\t\t\t\tfallbackranges.back().encapsulate(glyphinfos[i].cluster);\n\t\t\t}\n\t\t}\n\t}\n\n\tstd::sort(bufferranges.begin(), bufferranges.end(), [](const BufferRange &a, const BufferRange &b)\n\t{\n\t\tif (a.codepointStart != b.codepointStart)\n\t\t\treturn a.codepointStart < b.codepointStart;\n\t\tif (a.index != b.index)\n\t\t\treturn a.index < b.index;\n\t\treturn a.range.first < b.range.first;\n\t});\n}\n\nvoid HarfbuzzShaper::computeGlyphPositions(const ColoredCodepoints &codepoints, Range range, Vector2 offset, float extraspacing, std::vector<GlyphPosition> *positions, std::vector<IndexedColor> *colors, TextInfo *info)\n{\n\tif (!range.isValid() && !codepoints.cps.empty())\n\t\trange = Range(0, codepoints.cps.size());\n\n\toffset.y += getBaseline();\n\tVector2 curpos = offset;\n\tfloat spacingremainder = 0;\n\n\tint colorindex = 0;\n\tint ncolors = (int)codepoints.colors.size();\n\tOptional<Colorf> colorToAdd;\n\n\t// Make sure the right color is applied to the start of the glyph list,\n\t// when the start isn't 0.\n\tif (colors && range.getOffset() > 0 && !codepoints.colors.empty())\n\t{\n\t\tfor (; colorindex < ncolors; colorindex++)\n\t\t{\n\t\t\tif (codepoints.colors[colorindex].index >= (int) range.getOffset())\n\t\t\t\tbreak;\n\t\t\tcolorToAdd.set(codepoints.colors[colorindex].color);\n\t\t}\n\t}\n\n\tstd::vector<BufferRange> bufferranges;\n\tcomputeBufferRanges(codepoints, range, bufferranges);\n\n\tfloat maxwidth = curpos.x;\n\n\tfor (const auto &bufferrange : bufferranges)\n\t{\n\t\tif (positions)\n\t\t\tpositions->reserve(positions->size() + bufferrange.range.getSize());\n\n\t\thb_buffer_t *hbbuffer = hbBuffers[bufferrange.index];\n\n\t\tconst hb_glyph_info_t *glyphinfos = hb_buffer_get_glyph_infos(hbbuffer, nullptr);\n\t\thb_glyph_position_t *glyphpositions = hb_buffer_get_glyph_positions(hbbuffer, nullptr);\n\t\thb_direction_t direction = hb_buffer_get_direction(hbbuffer);\n\n\t\tfor (size_t i = bufferrange.range.first; i <= bufferrange.range.last; i++)\n\t\t{\n\t\t\tconst hb_glyph_info_t &info = glyphinfos[i];\n\t\t\thb_glyph_position_t &glyphpos = glyphpositions[i];\n\n\t\t\t// TODO: this doesn't handle situations where the user inserted a color\n\t\t\t// change in the middle of some characters that get combined into a single\n\t\t\t// cluster.\n\t\t\tif (colors && colorindex < ncolors && codepoints.colors[colorindex].index == (int)info.cluster)\n\t\t\t{\n\t\t\t\tcolorToAdd.set(codepoints.colors[colorindex].color);\n\t\t\t\tcolorindex++;\n\t\t\t}\n\n\t\t\tuint32 clustercodepoint = codepoints.cps[info.cluster];\n\n\t\t\t// Harfbuzz doesn't handle newlines itself, but it does leave them in\n\t\t\t// the glyph list so we can do it manually.\n\t\t\tif (clustercodepoint == '\\n')\n\t\t\t{\n\t\t\t\tmaxwidth = std::max(maxwidth, curpos.x);\n\n\t\t\t\t// Wrap newline, but do not output a position for it.\n\t\t\t\tcurpos.y += getCombinedHeight();\n\t\t\t\tcurpos.x = offset.x;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Ignore carriage returns\n\t\t\tif (clustercodepoint == '\\r')\n\t\t\t\tcontinue;\n\n\t\t\t// This is a glyph index at this point, despite the name.\n\t\t\tGlyphIndex gindex = { (int) info.codepoint, (int) bufferrange.index };\n\n\t\t\tif (clustercodepoint == '\\t' && isUsingSpacesForTab())\n\t\t\t{\n\t\t\t\tgindex = spaceGlyphIndex;\n\n\t\t\t\t// This should be safe to overwrite.\n\t\t\t\t// TODO: RTL support?\n\t\t\t\tglyphpos.x_offset = 0;\n\t\t\t\tglyphpos.y_offset = 0;\n\t\t\t\tglyphpos.x_advance = HB_DIRECTION_IS_HORIZONTAL(direction) ? tabSpacesAdvanceX : 0;\n\t\t\t\tglyphpos.y_advance = HB_DIRECTION_IS_VERTICAL(direction) ? tabSpacesAdvanceY : 0;\n\t\t\t}\n\n\t\t\tif (colorToAdd.hasValue && colors && positions)\n\t\t\t{\n\t\t\t\tIndexedColor c = {colorToAdd.value, (int) positions->size()};\n\t\t\t\tcolors->push_back(c);\n\t\t\t\tcolorToAdd.clear();\n\t\t\t}\n\n\t\t\tif (positions)\n\t\t\t{\n\t\t\t\tGlyphPosition p = { curpos, gindex };\n\n\t\t\t\t// Harfbuzz position coordinate systems are based on the given font.\n\t\t\t\t// Freetype uses 26.6 fixed point coordinates, so harfbuzz does too.\n\t\t\t\tp.position.x += (glyphpos.x_offset >> 6) / dpiScales[bufferrange.index];\n\t\t\t\tp.position.y += (glyphpos.y_offset >> 6) / dpiScales[bufferrange.index];\n\n\t\t\t\tpositions->push_back(p);\n\t\t\t}\n\n\t\t\tcurpos.x += (glyphpos.x_advance >> 6) / dpiScales[bufferrange.index];\n\t\t\tcurpos.y += (glyphpos.y_advance >> 6) / dpiScales[bufferrange.index];\n\n\t\t\t// Account for extra spacing given to space characters.\n\t\t\tif (clustercodepoint == ' ' && extraspacing != 0.0f)\n\t\t\t{\n\t\t\t\tspacingremainder += fmod(extraspacing, 1);\n\t\t\t\tcurpos.x += floorf(extraspacing) + floorf(spacingremainder);\n\t\t\t\tspacingremainder = fmod(spacingremainder, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\tmaxwidth = std::max(maxwidth, curpos.x);\n\n\tif (info != nullptr)\n\t{\n\t\tinfo->width = maxwidth - offset.x;\n\t\tinfo->height = curpos.y - offset.y;\n\t\tif (curpos.x > offset.x)\n\t\t\tinfo->height += getCombinedHeight();\n\t}\n}\n\nint HarfbuzzShaper::computeWordWrapIndex(const ColoredCodepoints &codepoints, Range range, float wraplimit, float *width)\n{\n\tif (!range.isValid())\n\t\trange = Range(0, codepoints.cps.size());\n\n\tfloat w = 0.0f;\n\tfloat outwidth = 0.0f;\n\tfloat widthbeforelastspace = 0.0f;\n\tint firstindexafterspace = -1;\n\n\tuint32 prevcodepoint = 0;\n\n\tstd::vector<BufferRange> bufferranges;\n\tcomputeBufferRanges(codepoints, range, bufferranges);\n\n\tfor (const auto &bufferrange : bufferranges)\n\t{\n\t\thb_buffer_t *hbbuffer = hbBuffers[bufferrange.index];\n\n\t\tconst hb_glyph_info_t *glyphinfos = hb_buffer_get_glyph_infos(hbbuffer, nullptr);\n\t\thb_glyph_position_t *glyphpositions = hb_buffer_get_glyph_positions(hbbuffer, nullptr);\n\t\thb_direction_t direction = hb_buffer_get_direction(hbbuffer);\n\n\t\tfor (size_t i = bufferrange.range.first; i <= bufferrange.range.last; i++)\n\t\t{\n\t\t\tconst hb_glyph_info_t &info = glyphinfos[i];\n\t\t\thb_glyph_position_t &glyphpos = glyphpositions[i];\n\n\t\t\tuint32 clustercodepoint = codepoints.cps[info.cluster];\n\n\t\t\tif (clustercodepoint == '\\r')\n\t\t\t{\n\t\t\t\tprevcodepoint = clustercodepoint;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (clustercodepoint == '\\t' && isUsingSpacesForTab())\n\t\t\t{\n\t\t\t\t// This should be safe to overwrite.\n\t\t\t\t// TODO: RTL support?\n\t\t\t\tglyphpos.x_offset = 0;\n\t\t\t\tglyphpos.y_offset = 0;\n\t\t\t\tglyphpos.x_advance = HB_DIRECTION_IS_HORIZONTAL(direction) ? tabSpacesAdvanceX : 0;\n\t\t\t\tglyphpos.y_advance = HB_DIRECTION_IS_VERTICAL(direction) ? tabSpacesAdvanceY : 0;\n\t\t\t}\n\n\t\t\tfloat newwidth = w + (glyphpos.x_advance >> 6) / dpiScales[bufferrange.index];\n\n\t\t\t// Don't count trailing spaces in the output width.\n\t\t\tif (isWhitespace(clustercodepoint))\n\t\t\t{\n\t\t\t\tif (!isWhitespace(prevcodepoint))\n\t\t\t\t\twidthbeforelastspace = w;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (isWhitespace(prevcodepoint))\n\t\t\t\t\tfirstindexafterspace = info.cluster;\n\n\t\t\t\t// Only wrap when there's a non-space character.\n\t\t\t\tif (newwidth > wraplimit)\n\t\t\t\t{\n\t\t\t\t\t// If this is the first character, wrap from the next one instead of this one.\n\t\t\t\t\tint wrapindex = (int)info.cluster > (int)range.first ? (int)info.cluster : (int)range.first + 1;\n\n\t\t\t\t\t// Rewind to after the last seen space when wrapping.\n\t\t\t\t\tif (firstindexafterspace != -1)\n\t\t\t\t\t{\n\t\t\t\t\t\twrapindex = firstindexafterspace;\n\t\t\t\t\t\toutwidth = widthbeforelastspace;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (width)\n\t\t\t\t\t\t*width = outwidth;\n\n\t\t\t\t\treturn wrapindex;\n\t\t\t\t}\n\n\t\t\t\toutwidth = newwidth;\n\t\t\t}\n\n\t\t\tw = newwidth;\n\t\t\tprevcodepoint = clustercodepoint;\n\t\t}\n\t}\n\n\tif (width)\n\t\t*width = outwidth;\n\n\t// There wasn't any wrap in the middle of the range.\n\treturn (int) range.last + 1;\n}\n\n} // freetype\n} // font\n} // love\n"
  },
  {
    "path": "src/modules/font/freetype/HarfbuzzShaper.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"font/TextShaper.h\"\n\nextern \"C\"\n{\ntypedef struct hb_font_t hb_font_t;\ntypedef struct hb_buffer_t hb_buffer_t;\n}\n\nnamespace love\n{\nnamespace font\n{\nnamespace freetype\n{\n\nclass TrueTypeRasterizer;\n\nclass HarfbuzzShaper : public love::font::TextShaper\n{\npublic:\n\n\tHarfbuzzShaper(TrueTypeRasterizer *rasterizer);\n\tvirtual ~HarfbuzzShaper();\n\n\tvoid setFallbacks(const std::vector<Rasterizer *> &fallbacks) override;\n\tvoid computeGlyphPositions(const ColoredCodepoints &codepoints, Range range, Vector2 offset, float extraspacing, std::vector<GlyphPosition> *positions, std::vector<IndexedColor> *colors, TextInfo *info) override;\n\tint computeWordWrapIndex(const ColoredCodepoints &codepoints, Range range, float wraplimit, float *width) override;\n\nprivate:\n\n\tstruct BufferRange\n\t{\n\t\tsize_t index;\n\t\tint codepointStart;\n\t\tRange range;\n\t};\n\n\tvoid updateSpacesForTabInfo();\n\tbool isValidGlyph(uint32 glyphindex, const std::vector<uint32> &codepoints, uint32 codepointindex);\n\tvoid computeBufferRanges(const ColoredCodepoints &codepoints, Range range, std::vector<BufferRange> &bufferranges);\n\n\tstd::vector<hb_font_t *> hbFonts;\n\tstd::vector<hb_buffer_t *> hbBuffers;\n\n\tGlyphIndex spaceGlyphIndex;\n\tint tabSpacesAdvanceX;\n\tint tabSpacesAdvanceY;\n\n}; // HarfbuzzShaper\n\n} // freetype\n} // font\n} // love\n"
  },
  {
    "path": "src/modules/font/freetype/TrueTypeRasterizer.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"TrueTypeRasterizer.h\"\n#include \"HarfbuzzShaper.h\"\n#include \"common/Exception.h\"\n\n// C\n#include <math.h>\n\nnamespace love\n{\nnamespace font\n{\nnamespace freetype\n{\n\nTrueTypeRasterizer::TrueTypeRasterizer(FT_Library library, love::Data *data, int size, const Settings &settings, float defaultdpiscale)\n\t: data(data)\n\t, hinting(settings.hinting)\n{\n\tdpiScale = settings.dpiScale.get(defaultdpiscale);\n\n\tsdf = settings.sdf;\n\n\tif (size <= 0)\n\t\tthrow love::Exception(\"Invalid TrueType font size: %d\", size);\n\n\tFT_Error err = FT_Err_Ok;\n\terr = FT_New_Memory_Face(library,\n\t                         (const FT_Byte *)data->getData(), /* first byte in memory */\n\t                         data->getSize(),                  /* size in bytes        */\n\t                         0,                                /* face_index           */\n\t                         &face);\n\n\tif (err != FT_Err_Ok)\n\t\tthrow love::Exception(\"TrueType Font loading error: FT_New_Face failed: 0x%x (problem with font file?)\", err);\n\n\terr = FT_Set_Char_Size(face, size << 6, size << 6, 72 * dpiScale, 72 * dpiScale);\n\n\tif (err != FT_Err_Ok)\n\t\tthrow love::Exception(\"TrueType Font loading error: FT_Set_Pixel_Sizes failed: 0x%x (invalid size?)\", err);\n\n\t// Set global metrics\n\tFT_Size_Metrics s = face->size->metrics;\n\tmetrics.advance = (int) (s.max_advance >> 6);\n\tmetrics.ascent  = (int) (s.ascender >> 6);\n\tmetrics.descent = (int) (s.descender >> 6);\n\tmetrics.height  = (int) (s.height >> 6);\n}\n\nTrueTypeRasterizer::~TrueTypeRasterizer()\n{\n\tFT_Done_Face(face);\n}\n\nint TrueTypeRasterizer::getLineHeight() const\n{\n\treturn (int)(getHeight() * 1.25);\n}\n\nint TrueTypeRasterizer::getGlyphSpacing(uint32 glyph) const\n{\n\tFT_Glyph ftglyph;\n\tFT_Error err = FT_Err_Ok;\n\tFT_UInt loadoption = hintingToLoadOption(hinting);\n\n\t// Initialize\n\terr = FT_Load_Glyph(face, FT_Get_Char_Index(face, glyph), FT_LOAD_DEFAULT | loadoption);\n\tif (err != FT_Err_Ok)\n\t\treturn 0;\n\n\terr = FT_Get_Glyph(face->glyph, &ftglyph);\n\tif (err != FT_Err_Ok)\n\t\treturn 0;\n\n\treturn (int)(ftglyph->advance.x >> 16);\n}\n\nint TrueTypeRasterizer::getGlyphIndex(uint32 glyph) const\n{\n\treturn FT_Get_Char_Index(face, glyph);\n}\n\nGlyphData *TrueTypeRasterizer::getGlyphDataForIndex(int index) const\n{\n\tlove::font::GlyphMetrics glyphMetrics = {};\n\tFT_Glyph ftglyph;\n\n\tFT_Error err = FT_Err_Ok;\n\tFT_UInt loadoption = hintingToLoadOption(hinting);\n\n\t// Initialize\n\terr = FT_Load_Glyph(face, index, FT_LOAD_DEFAULT | loadoption);\n\n\tif (err != FT_Err_Ok)\n\t\tthrow love::Exception(\"TrueType Font glyph error: FT_Load_Glyph failed (0x%x)\", err);\n\n\terr = FT_Get_Glyph(face->glyph, &ftglyph);\n\n\tif (err != FT_Err_Ok)\n\t\tthrow love::Exception(\"TrueType Font glyph error: FT_Get_Glyph failed (0x%x)\", err);\n\n\tFT_Render_Mode rendermode = FT_RENDER_MODE_NORMAL;\n\tif (sdf)\n\t\trendermode = FT_RENDER_MODE_SDF;\n\telse if (hinting == HINTING_MONO)\n\t\trendermode = FT_RENDER_MODE_MONO;\n\n\terr = FT_Glyph_To_Bitmap(&ftglyph, rendermode, 0, 1);\n\n\tif (err != FT_Err_Ok)\n\t{\n\t\tif (rendermode == FT_RENDER_MODE_SDF)\n\t\t{\n\t\t\terr = FT_Glyph_To_Bitmap(&ftglyph, FT_RENDER_MODE_NORMAL, 0, 1);\n\t\t\tif (err != FT_Err_Ok)\n\t\t\t\tthrow love::Exception(\"TrueType Font glyph error: FT_Glyph_To_Bitmap failed (0x%x)\", err);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthrow love::Exception(\"TrueType Font glyph error: FT_Glyph_To_Bitmap failed (0x%x)\", err);\n\t\t}\n\t}\n\n\tFT_BitmapGlyph bitmap_glyph = (FT_BitmapGlyph) ftglyph;\n\tconst FT_Bitmap &bitmap = bitmap_glyph->bitmap; //just to make things easier\n\n\t// Get metrics\n\tglyphMetrics.bearingX = bitmap_glyph->left;\n\tglyphMetrics.bearingY = bitmap_glyph->top;\n\tglyphMetrics.height = bitmap.rows;\n\tglyphMetrics.width = bitmap.width;\n\tglyphMetrics.advance = (int) (ftglyph->advance.x >> 16);\n\n\t// TODO: https://stackoverflow.com/questions/60526004/how-to-get-glyph-unicode-using-freetype/69730502#69730502\n\tGlyphData *glyphData = new GlyphData(0, glyphMetrics, PIXELFORMAT_LA8_UNORM);\n\n\tconst uint8 *pixels = bitmap.buffer;\n\tuint8 *dest = (uint8 *) glyphData->getData();\n\n\t// We treat the luminance of the FreeType bitmap as alpha in the GlyphData.\n\tif (bitmap.pixel_mode == FT_PIXEL_MODE_MONO)\n\t{\n\t\tfor (int y = 0; y < (int) bitmap.rows; y++)\n\t\t{\n\t\t\tfor (int x = 0; x < (int) bitmap.width; x++)\n\t\t\t{\n\t\t\t\t// Extract the 1-bit value and convert it to uint8.\n\t\t\t\tuint8 v = ((pixels[x / 8]) & (1 << (7 - (x % 8)))) ? 255 : 0;\n\t\t\t\tdest[2 * (y * bitmap.width + x) + 0] = 255;\n\t\t\t\tdest[2 * (y * bitmap.width + x) + 1] = v;\n\t\t\t}\n\n\t\t\tpixels += bitmap.pitch;\n\t\t}\n\t}\n\telse if (bitmap.pixel_mode == FT_PIXEL_MODE_GRAY)\n\t{\n\t\tfor (int y = 0; y < (int) bitmap.rows; y++)\n\t\t{\n\t\t\tfor (int x = 0; x < (int) bitmap.width; x++)\n\t\t\t{\n\t\t\t\tdest[2 * (y * bitmap.width + x) + 0] = 255;\n\t\t\t\tdest[2 * (y * bitmap.width + x) + 1] = pixels[x];\n\t\t\t}\n\n\t\t\tpixels += bitmap.pitch;\n\t\t}\n\t}\n\telse\n\t{\n\t\tdelete glyphData;\n\t\tFT_Done_Glyph(ftglyph);\n\t\tthrow love::Exception(\"Unknown TrueType glyph pixel mode.\");\n\t}\n\n\t// Having copied the data over, we can destroy the glyph.\n\tFT_Done_Glyph(ftglyph);\n\n\treturn glyphData;\n}\n\nint TrueTypeRasterizer::getGlyphCount() const\n{\n\treturn (int) face->num_glyphs;\n}\n\nbool TrueTypeRasterizer::hasGlyph(uint32 glyph) const\n{\n\treturn FT_Get_Char_Index(face, glyph) != 0;\n}\n\nfloat TrueTypeRasterizer::getKerning(uint32 leftglyph, uint32 rightglyph) const\n{\n\tFT_Vector kerning = {};\n\tFT_Get_Kerning(face,\n\t               FT_Get_Char_Index(face, leftglyph),\n\t               FT_Get_Char_Index(face, rightglyph),\n\t               FT_KERNING_DEFAULT,\n\t               &kerning);\n\treturn float(kerning.x >> 6);\n}\n\nRasterizer::DataType TrueTypeRasterizer::getDataType() const\n{\n\treturn DATA_TRUETYPE;\n}\n\nTextShaper *TrueTypeRasterizer::newTextShaper()\n{\n\treturn new HarfbuzzShaper(this);\n}\n\nbool TrueTypeRasterizer::accepts(FT_Library library, love::Data *data)\n{\n\tconst FT_Byte *fbase = (const FT_Byte *) data->getData();\n\tFT_Long fsize = (FT_Long) data->getSize();\n\n\t// Pasing in -1 for the face index lets us test if the data is valid.\n\treturn FT_New_Memory_Face(library, fbase, fsize, -1, nullptr) == 0;\n}\n\nFT_UInt TrueTypeRasterizer::hintingToLoadOption(Hinting hint)\n{\n\tswitch (hint)\n\t{\n\tcase HINTING_NORMAL:\n\tdefault:\n\t\treturn FT_LOAD_TARGET_NORMAL;\n\tcase HINTING_LIGHT:\n\t\treturn FT_LOAD_TARGET_LIGHT;\n\tcase HINTING_MONO:\n\t\treturn FT_LOAD_TARGET_MONO;\n\tcase HINTING_NONE:\n\t\treturn FT_LOAD_NO_HINTING;\n\t}\n}\n\n} // freetype\n} // font\n} // love\n"
  },
  {
    "path": "src/modules/font/freetype/TrueTypeRasterizer.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_FONT_FREETYPE_TRUE_TYPE_RASTERIZER_H\n#define LOVE_FONT_FREETYPE_TRUE_TYPE_RASTERIZER_H\n\n// LOVE\n#include \"filesystem/FileData.h\"\n#include \"font/TrueTypeRasterizer.h\"\n\n// FreeType2\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_GLYPH_H\n\nnamespace love\n{\nnamespace font\n{\nnamespace freetype\n{\n\n/**\n * Holds data for a font object.\n **/\nclass TrueTypeRasterizer : public love::font::TrueTypeRasterizer\n{\npublic:\n\n\tTrueTypeRasterizer(FT_Library library, love::Data *data, int size, const Settings &settings, float defaultdpiscale);\n\tvirtual ~TrueTypeRasterizer();\n\n\t// Implement Rasterizer\n\tint getLineHeight() const override;\n\tint getGlyphSpacing(uint32 glyph) const override;\n\tint getGlyphIndex(uint32 glyph) const override;\n\tGlyphData *getGlyphDataForIndex(int index) const override;\n\tint getGlyphCount() const override;\n\tbool hasGlyph(uint32 glyph) const override;\n\tfloat getKerning(uint32 leftglyph, uint32 rightglyph) const override;\n\tDataType getDataType() const override;\n\tTextShaper *newTextShaper() override;\n\n\tptrdiff_t getHandle() const override { return (ptrdiff_t) face; }\n\n\tstatic bool accepts(FT_Library library, love::Data *data);\n\nprivate:\n\n\tstatic FT_UInt hintingToLoadOption(Hinting hinting);\n\n\t// TrueType face\n\tFT_Face face;\n\n\t// Font data\n\tStrongRef<love::Data> data;\n\n\tHinting hinting;\n\n}; // TrueTypeRasterizer\n\n} // freetype\n} // font\n} // love\n\n#endif // LOVE_FONT_FREETYPE_TRUE_TYPE_RASTERIZER_H\n"
  },
  {
    "path": "src/modules/font/wrap_Font.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_Font.h\"\n\n#include \"Font.h\"\n#include \"freetype/Font.h\"\n\n#include \"wrap_GlyphData.h\"\n#include \"wrap_Rasterizer.h\"\n\n#include \"filesystem/wrap_Filesystem.h\"\n\nnamespace love\n{\nnamespace font\n{\n\n#define instance() (Module::getInstance<Font>(Module::M_FONT))\n\nint w_newRasterizer(lua_State *L)\n{\n\tif (lua_type(L, 1) == LUA_TNUMBER || lua_type(L, 2) == LUA_TNUMBER || lua_isnone(L, 1))\n\t{\n\t\t// First or second argument is a number: call newTrueTypeRasterizer.\n\t\treturn w_newTrueTypeRasterizer(L);\n\t}\n\telse if (lua_isnoneornil(L, 2))\n\t{\n\t\t// Single argument of another type: call Font::newRasterizer.\n\t\tRasterizer *t = nullptr;\n\t\tfilesystem::FileData *d = filesystem::luax_getfiledata(L, 1);\n\n\t\tluax_catchexcept(L,\n\t\t\t[&]() { t = instance()->newRasterizer(d); },\n\t\t\t[&](bool) { d->release(); }\n\t\t);\n\n\t\tluax_pushtype(L, t);\n\t\tt->release();\n\t\treturn 1;\n\t}\n\telse\n\t{\n\t\t// Otherwise call newBMFontRasterizer.\n\t\treturn w_newBMFontRasterizer(L);\n\t}\n}\n\nstatic TrueTypeRasterizer::Settings luax_checktruetypesettings(lua_State* L, int startidx)\n{\n\tTrueTypeRasterizer::Settings s;\n\n\tif (lua_type(L, startidx) == LUA_TSTRING)\n\t{\n\t\t// Legacy parameters.\n\t\tconst char *hintstr = lua_isnoneornil(L, startidx) ? nullptr : luaL_checkstring(L, startidx);\n\t\tif (hintstr && !TrueTypeRasterizer::getConstant(hintstr, s.hinting))\n\t\t\tluax_enumerror(L, \"TrueType font hinting mode\", TrueTypeRasterizer::getConstants(s.hinting), hintstr);\n\n\t\tif (!lua_isnoneornil(L, startidx + 1))\n\t\t\ts.dpiScale.set((float)luaL_checknumber(L, startidx + 1));\n\t}\n\telse\n\t{\n\t\tluaL_checktype(L, startidx, LUA_TTABLE);\n\n\t\tlua_getfield(L, startidx, \"hinting\");\n\t\tif (!lua_isnoneornil(L, -1))\n\t\t{\n\t\t\tconst char *hintstr = luaL_checkstring(L, -1);\n\t\t\tif (!TrueTypeRasterizer::getConstant(hintstr, s.hinting))\n\t\t\t\tluax_enumerror(L, \"TrueType font hinting mode\", TrueTypeRasterizer::getConstants(s.hinting), hintstr);\n\t\t}\n\t\tlua_pop(L, 1);\n\n\t\tlua_getfield(L, startidx, \"dpiscale\");\n\t\tif (!lua_isnoneornil(L, -1))\n\t\t\ts.dpiScale.set((float)luaL_checknumber(L, -1));\n\t\tlua_pop(L, 1);\n\n\t\tlua_getfield(L, startidx, \"sdf\");\n\t\tif (!lua_isnoneornil(L, -1))\n\t\t\ts.sdf = lua_toboolean(L, -1);\n\t\tlua_pop(L, 1);\n\t}\n\n\treturn s;\n}\n\nint w_newTrueTypeRasterizer(lua_State *L)\n{\n\tRasterizer *t = nullptr;\n\n\tif (lua_type(L, 1) == LUA_TNUMBER || lua_isnone(L, 1))\n\t{\n\t\t// First argument is a number: use the default TrueType font.\n\t\tint size = (int) luaL_optinteger(L, 1, 13);\n\n\t\tTrueTypeRasterizer::Settings settings;\n\t\tif (!lua_isnoneornil(L, 2))\n\t\t\tsettings = luax_checktruetypesettings(L, 2);\n\n\t\tluax_catchexcept(L, [&](){ t = instance()->newTrueTypeRasterizer(size, settings); });\n\t}\n\telse\n\t{\n\t\tint size = (int) luaL_optinteger(L, 2, 12);\n\n\t\tTrueTypeRasterizer::Settings settings;\n\t\tif (!lua_isnoneornil(L, 3))\n\t\t\tsettings = luax_checktruetypesettings(L, 3);\n\n\t\tlove::Data *d = nullptr;\n\n\t\tif (luax_istype(L, 1, love::Data::type))\n\t\t{\n\t\t\td = data::luax_checkdata(L, 1);\n\t\t\td->retain();\n\t\t}\n\t\telse\n\t\t\td = filesystem::luax_getfiledata(L, 1);\n\n\t\tluax_catchexcept(L,\n\t\t\t[&]() { t = instance()->newTrueTypeRasterizer(d, size, settings); },\n\t\t\t[&](bool) { d->release(); }\n\t\t);\n\t}\n\n\tluax_pushtype(L, t);\n\tt->release();\n\treturn 1;\n}\n\nstatic void convimagedata(lua_State *L, int idx)\n{\n\tif (lua_type(L, 1) == LUA_TSTRING || luax_istype(L, idx, love::filesystem::File::type) || luax_istype(L, idx, love::filesystem::FileData::type))\n\t\tluax_convobj(L, idx, \"image\", \"newImageData\");\n}\n\nint w_newBMFontRasterizer(lua_State *L)\n{\n\tRasterizer *t = nullptr;\n\n\tfilesystem::FileData *d = filesystem::luax_getfiledata(L, 1);\n\tstd::vector<image::ImageData *> images;\n\tfloat dpiscale = (float) luaL_optnumber(L, 3, 1.0);\n\n\tif (lua_istable(L, 2))\n\t{\n\t\tfor (int i = 1; i <= (int) luax_objlen(L, 2); i++)\n\t\t{\n\t\t\tlua_rawgeti(L, 2, i);\n\n\t\t\tconvimagedata(L, -1);\n\t\t\timage::ImageData *id = luax_checktype<image::ImageData>(L, -1);\n\t\t\timages.push_back(id);\n\t\t\tid->retain();\n\n\t\t\tlua_pop(L, 1);\n\t\t}\n\t}\n\telse if (!lua_isnoneornil(L, 2))\n\t{\n\t\tconvimagedata(L, 2);\n\t\timage::ImageData *id = luax_checktype<image::ImageData>(L, 2);\n\t\timages.push_back(id);\n\t\tid->retain();\n\t}\n\n\tluax_catchexcept(L,\n\t\t[&]() { t = instance()->newBMFontRasterizer(d, images, dpiscale); },\n\t\t[&](bool) { d->release(); for (auto id : images) id->release(); }\n\t);\n\n\tluax_pushtype(L, t);\n\tt->release();\n\treturn 1;\n}\n\nint w_newImageRasterizer(lua_State *L)\n{\n\tRasterizer *t = nullptr;\n\n\tconvimagedata(L, 1);\n\n\timage::ImageData *d = luax_checktype<image::ImageData>(L, 1);\n\tstd::string glyphs = luax_checkstring(L, 2);\n\tint extraspacing = (int) luaL_optinteger(L, 3, 0);\n\tfloat dpiscale = (float) luaL_optnumber(L, 4, 1.0);\n\n\tluax_catchexcept(L, [&](){ t = instance()->newImageRasterizer(d, glyphs, extraspacing, dpiscale); });\n\n\tluax_pushtype(L, t);\n\tt->release();\n\treturn 1;\n}\n\nint w_newGlyphData(lua_State *L)\n{\n\tRasterizer *r = luax_checkrasterizer(L, 1);\n\tGlyphData *t = nullptr;\n\n\t// newGlyphData accepts a unicode character or a codepoint number.\n\tif (lua_type(L, 2) == LUA_TSTRING)\n\t{\n\t\tstd::string glyph = luax_checkstring(L, 2);\n\t\tluax_catchexcept(L, [&](){ t = instance()->newGlyphData(r, glyph); });\n\t}\n\telse\n\t{\n\t\tuint32 g = (uint32) luaL_checknumber(L, 2);\n\t\tt = instance()->newGlyphData(r, g);\n\t}\n\n\tluax_pushtype(L, t);\n\tt->release();\n\treturn 1;\n}\n\n// List of functions to wrap.\nstatic const luaL_Reg functions[] =\n{\n\t{ \"newRasterizer\",  w_newRasterizer },\n\t{ \"newTrueTypeRasterizer\", w_newTrueTypeRasterizer },\n\t{ \"newBMFontRasterizer\", w_newBMFontRasterizer },\n\t{ \"newImageRasterizer\", w_newImageRasterizer },\n\t{ \"newGlyphData\",  w_newGlyphData },\n\t{ 0, 0 }\n};\n\nstatic const lua_CFunction types[] =\n{\n\tluaopen_glyphdata,\n\tluaopen_rasterizer,\n\t0\n};\n\nextern \"C\" int luaopen_love_font(lua_State *L)\n{\n\tFont *instance = instance();\n\tif (instance == nullptr)\n\t{\n\t\tluax_catchexcept(L, [&](){ instance = new freetype::Font(); });\n\t}\n\telse\n\t\tinstance->retain();\n\n\tWrappedModule w;\n\tw.module = instance;\n\tw.name = \"font\";\n\tw.type = &Module::type;\n\tw.functions = functions;\n\tw.types = types;\n\n\treturn luax_register_module(L, w);\n}\n\n} // font\n} // love\n"
  },
  {
    "path": "src/modules/font/wrap_Font.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_FONT_WRAP_FONT_H\n#define LOVE_FONT_WRAP_FONT_H\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/runtime.h\"\n\nnamespace love\n{\nnamespace font\n{\n\nint w_newRasterizer(lua_State *L);\nint w_newTrueTypeRasterizer(lua_State *L);\nint w_newBMFontRasterizer(lua_State *L);\nint w_newImageRasterizer(lua_State *L);\nint w_newGlyphData(lua_State *L);\nextern \"C\" LOVE_EXPORT int luaopen_love_font(lua_State *L);\n\n} // font\n} // love\n\n#endif // LOVE_FONT_WRAP_FONT_H\n"
  },
  {
    "path": "src/modules/font/wrap_GlyphData.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_GlyphData.h\"\n\nnamespace love\n{\nnamespace font\n{\n\nGlyphData *luax_checkglyphdata(lua_State *L, int idx)\n{\n\treturn luax_checktype<GlyphData>(L, idx);\n}\n\nint w_GlyphData_clone(lua_State *L)\n{\n\tGlyphData *t = luax_checkglyphdata(L, 1), *c = nullptr;\n\tluax_catchexcept(L, [&](){ c = t->clone(); });\n\tluax_pushtype(L, c);\n\tc->release();\n\treturn 1;\n}\n\nint w_GlyphData_getWidth(lua_State *L)\n{\n\tGlyphData *t = luax_checkglyphdata(L, 1);\n\tlua_pushinteger(L, t->getWidth());\n\treturn 1;\n}\n\nint w_GlyphData_getHeight(lua_State *L)\n{\n\tGlyphData *t = luax_checkglyphdata(L, 1);\n\tlua_pushinteger(L, t->getHeight());\n\treturn 1;\n}\n\nint w_GlyphData_getDimensions(lua_State *L)\n{\n\tGlyphData *t = luax_checkglyphdata(L, 1);\n\tlua_pushinteger(L, t->getWidth());\n\tlua_pushinteger(L, t->getHeight());\n\treturn 2;\n}\n\nint w_GlyphData_getGlyph(lua_State *L)\n{\n\tGlyphData *t = luax_checkglyphdata(L, 1);\n\tuint32 glyph = t->getGlyph();\n\tlua_pushnumber(L, (lua_Number) glyph);\n\treturn 1;\n}\n\nint w_GlyphData_getGlyphString(lua_State *L)\n{\n\tGlyphData *t = luax_checkglyphdata(L, 1);\n\n\tluax_catchexcept(L, [&](){ luax_pushstring(L, t->getGlyphString()); });\n\treturn 1;\n}\n\nint w_GlyphData_getAdvance(lua_State *L)\n{\n\tGlyphData *t = luax_checkglyphdata(L, 1);\n\tlua_pushinteger(L, t->getAdvance());\n\treturn 1;\n}\n\nint w_GlyphData_getBearing(lua_State *L)\n{\n\tGlyphData *t = luax_checkglyphdata(L, 1);\n\tlua_pushinteger(L, t->getBearingX());\n\tlua_pushinteger(L, t->getBearingY());\n\treturn 2;\n}\n\nint w_GlyphData_getBoundingBox(lua_State *L)\n{\n\tGlyphData *t = luax_checkglyphdata(L, 1);\n\n\tint minX = t->getMinX();\n\tint minY = t->getMinY();\n\tint maxX = t->getMaxX();\n\tint maxY = t->getMaxY();\n\n\tint width = maxX - minX;\n\tint height = maxY - minY;\n\n\tlua_pushinteger(L, minX);\n\tlua_pushinteger(L, minY);\n\tlua_pushinteger(L, width);\n\tlua_pushinteger(L, height);\n\n\treturn 4;\n}\n\nint w_GlyphData_getFormat(lua_State *L)\n{\n\tGlyphData *t = luax_checkglyphdata(L, 1);\n\n\tconst char *str;\n\tif (!getConstant(t->getFormat(), str))\n\t\treturn luax_enumerror(L, \"pixel format\", str);\n\n\tlua_pushstring(L, str);\n\treturn 1;\n}\n\nconst luaL_Reg w_GlyphData_functions[] =\n{\n\t{ \"clone\", w_GlyphData_clone },\n\t{ \"getWidth\", w_GlyphData_getWidth },\n\t{ \"getHeight\", w_GlyphData_getHeight },\n\t{ \"getDimensions\", w_GlyphData_getDimensions },\n\t{ \"getGlyph\", w_GlyphData_getGlyph },\n\t{ \"getGlyphString\", w_GlyphData_getGlyphString },\n\t{ \"getAdvance\", w_GlyphData_getAdvance },\n\t{ \"getBearing\", w_GlyphData_getBearing },\n\t{ \"getBoundingBox\", w_GlyphData_getBoundingBox },\n\t{ \"getFormat\", w_GlyphData_getFormat },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_glyphdata(lua_State *L)\n{\n\tint ret = luax_register_type(L, &GlyphData::type, data::w_Data_functions, w_GlyphData_functions, nullptr);\n\tlove::data::luax_rundatawrapper(L, GlyphData::type);\n\treturn ret;\n}\n\n} // font\n} // love\n"
  },
  {
    "path": "src/modules/font/wrap_GlyphData.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_FONT_WRAP_GLYPH_DATA_H\n#define LOVE_FONT_WRAP_GLYPH_DATA_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"data/wrap_Data.h\"\n\n#include \"GlyphData.h\"\n\nnamespace love\n{\nnamespace font\n{\n\nGlyphData *luax_checkglyphdata(lua_State *L, int idx);\nextern \"C\" int luaopen_glyphdata(lua_State *L);\n\n} // font\n} // love\n\n#endif // LOVE_FONT_WRAP_GLYPH_DATA_H\n"
  },
  {
    "path": "src/modules/font/wrap_Rasterizer.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_Rasterizer.h\"\n\n#include \"data/wrap_Data.h\"\n\nnamespace love\n{\nnamespace font\n{\n\nRasterizer *luax_checkrasterizer(lua_State *L, int idx)\n{\n\treturn luax_checktype<Rasterizer>(L, idx);\n}\n\nint w_Rasterizer_getHeight(lua_State *L)\n{\n\tRasterizer *t = luax_checkrasterizer(L, 1);\n\tlua_pushinteger(L, t->getHeight());\n\treturn 1;\n}\n\nint w_Rasterizer_getAdvance(lua_State *L)\n{\n\tRasterizer *t = luax_checkrasterizer(L, 1);\n\tlua_pushinteger(L, t->getAdvance());\n\treturn 1;\n}\n\nint w_Rasterizer_getAscent(lua_State *L)\n{\n\tRasterizer *t = luax_checkrasterizer(L, 1);\n\tlua_pushinteger(L, t->getAscent());\n\treturn 1;\n}\n\nint w_Rasterizer_getDescent(lua_State *L)\n{\n\tRasterizer *t = luax_checkrasterizer(L, 1);\n\tlua_pushinteger(L, t->getDescent());\n\treturn 1;\n}\n\nint w_Rasterizer_getLineHeight(lua_State *L)\n{\n\tRasterizer *t = luax_checkrasterizer(L, 1);\n\tlua_pushinteger(L, t->getLineHeight());\n\treturn 1;\n}\n\nint w_Rasterizer_getGlyphData(lua_State *L)\n{\n\tRasterizer *t = luax_checkrasterizer(L, 1);\n\tGlyphData *g = 0;\n\n\tluax_catchexcept(L, [&]() {\n\t\t// getGlyphData accepts a unicode character or a codepoint number.\n\t\tif (lua_type(L, 2) == LUA_TSTRING)\n\t\t{\n\t\t\tstd::string glyph = luax_checkstring(L, 2);\n\t\t\tg = t->getGlyphData(glyph);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tuint32 glyph = (uint32) luaL_checknumber(L, 2);\n\t\t\tg = t->getGlyphData(glyph);\n\t\t}\n\t});\n\n\tluax_pushtype(L, g);\n\tg->release();\n\treturn 1;\n}\n\nint w_Rasterizer_getGlyphCount(lua_State *L)\n{\n\tRasterizer *t = luax_checkrasterizer(L, 1);\n\tlua_pushinteger(L, t->getGlyphCount());\n\treturn 1;\n}\n\nint w_Rasterizer_hasGlyphs(lua_State *L)\n{\n\tRasterizer *t = luax_checkrasterizer(L, 1);\n\n\tbool hasglyph = false;\n\n\tint count = lua_gettop(L) - 1;\n\tcount = count < 1 ? 1 : count;\n\n\tluax_catchexcept(L, [&]() {\n\t\tfor (int i = 2; i < count + 2; i++)\n\t\t{\n\t\t\tif (lua_type(L, i) == LUA_TSTRING)\n\t\t\t\thasglyph = t->hasGlyphs(luax_checkstring(L, i));\n\t\t\telse\n\t\t\t\thasglyph = t->hasGlyph((uint32) luaL_checknumber(L, i));\n\n\t\t\tif (!hasglyph)\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\tluax_pushboolean(L, hasglyph);\n\treturn 1;\n}\n\nconst luaL_Reg w_Rasterizer_functions[] =\n{\n\t{ \"getHeight\", w_Rasterizer_getHeight },\n\t{ \"getAdvance\", w_Rasterizer_getAdvance },\n\t{ \"getAscent\", w_Rasterizer_getAscent },\n\t{ \"getDescent\", w_Rasterizer_getDescent },\n\t{ \"getLineHeight\", w_Rasterizer_getLineHeight },\n\t{ \"getGlyphData\", w_Rasterizer_getGlyphData },\n\t{ \"getGlyphCount\", w_Rasterizer_getGlyphCount },\n\t{ \"hasGlyphs\", w_Rasterizer_hasGlyphs },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_rasterizer(lua_State *L)\n{\n\treturn luax_register_type(L, &Rasterizer::type, w_Rasterizer_functions, nullptr);\n}\n\n} // font\n} // love\n"
  },
  {
    "path": "src/modules/font/wrap_Rasterizer.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_FONT_WRAP_RASTERIZER_H\n#define LOVE_FONT_WRAP_RASTERIZER_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"Rasterizer.h\"\n\nnamespace love\n{\nnamespace font\n{\n\nRasterizer *luax_checkrasterizer(lua_State *L, int idx);\nextern \"C\" int luaopen_rasterizer(lua_State *L);\n\n} // font\n} // love\n\n#endif // LOVE_FONT_WRAP_RASTERIZER_H\n"
  },
  {
    "path": "src/modules/graphics/Buffer.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Buffer.h\"\n#include \"Graphics.h\"\n#include \"common/memory.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nlove::Type Buffer::type(\"GraphicsBuffer\", &Object::type);\n\nint Buffer::bufferCount = 0;\nint64 Buffer::totalGraphicsMemory = 0;\n\nBuffer::Buffer(Graphics *gfx, const Settings &settings, const std::vector<DataDeclaration> &bufferformat, size_t size, size_t arraylength)\n\t: arrayLength(0)\n\t, arrayStride(0)\n\t, size(size)\n\t, usageFlags(settings.usageFlags)\n\t, dataUsage(settings.dataUsage)\n\t, debugName(settings.debugName)\n\t, mapped(false)\n\t, mappedType(MAP_WRITE_INVALIDATE)\n\t, immutable(false)\n{\n\tif (size == 0 && arraylength == 0)\n\t\tthrow love::Exception(\"Size or array length must be specified.\");\n\n\tif (bufferformat.size() == 0)\n\t\tthrow love::Exception(\"Data format must contain values.\");\n\n\tconst auto &caps = gfx->getCapabilities();\n\n\tbool indexbuffer = usageFlags & BUFFERUSAGEFLAG_INDEX;\n\tbool vertexbuffer = usageFlags & BUFFERUSAGEFLAG_VERTEX;\n\tbool texelbuffer = usageFlags & BUFFERUSAGEFLAG_TEXEL;\n\tbool storagebuffer = usageFlags & BUFFERUSAGEFLAG_SHADER_STORAGE;\n\tbool indirectbuffer = usageFlags & BUFFERUSAGEFLAG_INDIRECT_ARGUMENTS;\n\n\tif (texelbuffer && !caps.features[Graphics::FEATURE_TEXEL_BUFFER])\n\t\tthrow love::Exception(\"Texel buffers are not supported on this system.\");\n\n\tif (storagebuffer && !caps.features[Graphics::FEATURE_GLSL4])\n\t\tthrow love::Exception(\"Shader Storage buffers are not supported on this system (GLSL 4 support is necessary.)\");\n\n\tif (storagebuffer && dataUsage == BUFFERDATAUSAGE_STREAM)\n\t\tthrow love::Exception(\"Buffers created with 'stream' data usage cannot be used as a shader storage buffer.\");\n\n\tif (indirectbuffer && !caps.features[Graphics::FEATURE_INDIRECT_DRAW])\n\t\tthrow love::Exception(\"Indirect argument buffers are not supported on this system.\");\n\n\tif (dataUsage == BUFFERDATAUSAGE_READBACK && (indexbuffer || vertexbuffer || texelbuffer || storagebuffer || indirectbuffer))\n\t\tthrow love::Exception(\"Buffers created with 'readback' data usage cannot be index, vertex, texel, shaderstorage, or indirectarguments buffer types.\");\n\n\tsize_t offset = 0;\n\tsize_t stride = 0;\n\tsize_t structurealignment = 1;\n\n\tfor (const DataDeclaration &decl : bufferformat)\n\t{\n\t\tDataMember member(decl);\n\n\t\tDataFormat format = member.decl.format;\n\t\tconst DataFormatInfo &info = member.info;\n\n\t\tif (indexbuffer)\n\t\t{\n\t\t\tif (format != DATAFORMAT_UINT16 && format != DATAFORMAT_UINT32)\n\t\t\t\tthrow love::Exception(\"Index buffers only support uint16 and uint32 data types.\");\n\n\t\t\tif (bufferformat.size() > 1)\n\t\t\t\tthrow love::Exception(\"Index buffers only support a single value per element.\");\n\n\t\t\tif (decl.arrayLength > 0)\n\t\t\t\tthrow love::Exception(\"Arrays are not supported in index buffers.\");\n\t\t}\n\n\t\tif (vertexbuffer)\n\t\t{\n\t\t\tif (decl.arrayLength > 0)\n\t\t\t\tthrow love::Exception(\"Arrays are not supported in vertex buffers.\");\n\n\t\t\tif (info.isMatrix)\n\t\t\t\tthrow love::Exception(\"Matrix types are not supported in vertex buffers.\");\n\n\t\t\tif (info.baseType == DATA_BASETYPE_BOOL)\n\t\t\t\tthrow love::Exception(\"Bool types are not supported in vertex buffers.\");\n\n\t\t\tif (decl.bindingLocation < 0 || decl.bindingLocation >= (int) VertexAttributes::MAX)\n\t\t\t{\n\t\t\t\tif (decl.bindingLocation == -1 && !decl.name.empty())\n\t\t\t\t\tlegacyVertexBindings = true;\n\t\t\t\telse\n\t\t\t\t\tthrow love::Exception(\"Vertex buffer attributes must have a valid binding location value within [0, %d).\", VertexAttributes::MAX);\n\t\t\t}\n\t\t}\n\n\t\tif (texelbuffer)\n\t\t{\n\t\t\tif (format != bufferformat[0].format)\n\t\t\t\tthrow love::Exception(\"All values in a texel buffer must have the same format.\");\n\n\t\t\tif (decl.arrayLength > 0)\n\t\t\t\tthrow love::Exception(\"Arrays are not supported in texel buffers.\");\n\n\t\t\tif (info.isMatrix)\n\t\t\t\tthrow love::Exception(\"Matrix types are not supported in texel buffers.\");\n\n\t\t\tif (info.baseType == DATA_BASETYPE_BOOL)\n\t\t\t\tthrow love::Exception(\"Bool types are not supported in texel buffers.\");\n\n\t\t\tif (info.components == 3)\n\t\t\t\tthrow love::Exception(\"3-component formats are not supported in texel buffers.\");\n\n\t\t\tif (info.baseType == DATA_BASETYPE_SNORM)\n\t\t\t\tthrow love::Exception(\"Signed normalized formats are not supported in texel buffers.\");\n\t\t}\n\n\t\tsize_t memberoffset = offset;\n\t\tsize_t membersize = member.info.size;\n\n\t\t// Storage buffers are always treated as being an array of a structure.\n\t\t// The structure's contents are the buffer format declaration.\n\t\tif (storagebuffer)\n\t\t{\n\t\t\t// TODO: We can support these.\n\t\t\tif (decl.arrayLength > 0)\n\t\t\t\tthrow love::Exception(\"Arrays are not currently supported in shader storage buffers.\");\n\n\t\t\tif (info.baseType == DATA_BASETYPE_BOOL)\n\t\t\t\tthrow love::Exception(\"Bool types are not supported in shader storage buffers.\");\n\n\t\t\tif (info.baseType == DATA_BASETYPE_UNORM || info.baseType == DATA_BASETYPE_SNORM)\n\t\t\t\tthrow love::Exception(\"Normalized formats are not supported in shader storage buffers.\");\n\n\t\t\tsize_t alignment = 1;\n\n\t\t\t// GLSL's std430 packing rules. We also assume all matrices are\n\t\t\t// column-major.\n\t\t\t// https://www.khronos.org/registry/OpenGL/specs/gl/glspec46.core.pdf\n\n\t\t\t// \"If the member is a column-major matrix with C columns and R rows,\n\t\t\t// the matrix is stored identically to an array of C column vectors\n\t\t\t// with R components each\".\n\t\t\t// \"If the member is a three-component vector with components\n\t\t\t// consuming N basic machine units, the base alignment is 4N.\"\n\t\t\tint c = info.isMatrix ? info.matrixRows : info.components;\n\t\t\talignment = c == 3 ? 4 * info.componentSize : c * info.componentSize;\n\n\t\t\t// std430 will effectively turn a floatmat3x3 into a floatmat4x3\n\t\t\t// because of its vec3 padding rules. For now we'd rather not\n\t\t\t// support those formats at all, because it's not easy for users to\n\t\t\t// deal with.\n\t\t\tif (alignment != c * info.componentSize && (decl.arrayLength > 0 || info.isMatrix))\n\t\t\t{\n\t\t\t\tconst char *fstr = \"unknown\";\n\t\t\t\tgetConstant(decl.format, fstr);\n\t\t\t\tthrow love::Exception(\"Data format %s%s is not currently supported in shader storage buffers.\", fstr, decl.arrayLength > 0 ? \" array\" : \"\");\n\t\t\t}\n\n\t\t\t// \"If the member is a structure, the base alignment of the structure\n\t\t\t// is N, where N is the largest base alignment value of any of its\n\t\t\t// members\"\n\t\t\tstructurealignment = std::max(structurealignment, alignment);\n\n\t\t\tmemberoffset = alignUp(memberoffset, alignment);\n\n\t\t\tif (memberoffset != offset && (indexbuffer || vertexbuffer || texelbuffer))\n\t\t\t\tthrow love::Exception(\"Cannot create Buffer:\\nInternal alignment of member '%s' is preventing Buffer from being created as both a shader storage buffer and other buffer types\\nMember byte offset needed for shader storage buffer: %d\\nMember byte offset needed for other buffer types: %d\",\n\t\t\t\t\tmember.decl.name.c_str(), memberoffset, offset);\n\t\t}\n\n\t\tif (indirectbuffer)\n\t\t{\n\t\t\tif (info.isMatrix || info.components != 1\n\t\t\t\t|| (info.baseType != DATA_BASETYPE_UINT && info.baseType != DATA_BASETYPE_INT))\n\t\t\t{\n\t\t\t\tthrow love::Exception(\"Indirect argument buffers must use single-component int or uint types.\");\n\t\t\t}\n\n\t\t\tif (bufferformat.size() > 5)\n\t\t\t\tthrow love::Exception(\"Indirect argument buffers only support up to 5 values per array element.\");\n\t\t}\n\n\t\tmember.offset = memberoffset;\n\t\tmember.size = membersize;\n\n\t\toffset = member.offset + member.size;\n\n\t\tdataMembers.push_back(member);\n\t}\n\n\tstride = alignUp(offset, structurealignment);\n\n\tif (storagebuffer && (indexbuffer || vertexbuffer || texelbuffer))\n\t{\n\t\tif (stride != offset)\n\t\t\tthrow love::Exception(\"Cannot create Buffer:\\nBuffer used as a shader storage buffer would have a different number of bytes per array element (%d) than when used as other buffer types (%d)\",\n\t\t\t\tstride, offset);\n\t}\n\n\tif (storagebuffer && stride > SHADER_STORAGE_BUFFER_MAX_STRIDE)\n\t\tthrow love::Exception(\"Shader storage buffers cannot have more than %d bytes within each array element.\", SHADER_STORAGE_BUFFER_MAX_STRIDE);\n\n\tif (size != 0)\n\t{\n\t\tsize_t remainder = size % stride;\n\t\tif (remainder > 0)\n\t\t\tsize += stride - remainder;\n\t\tarraylength = size / stride;\n\t}\n\telse\n\t{\n\t\tsize = arraylength * stride;\n\t}\n\n\tthis->arrayStride = stride;\n\tthis->arrayLength = arraylength;\n\tthis->size = size;\n\n\tif (texelbuffer && arraylength * dataMembers.size() > caps.limits[Graphics::LIMIT_TEXEL_BUFFER_SIZE])\n\t\tthrow love::Exception(\"Cannot create texel buffer: total number of values in the buffer (%d * %d) is too large for this system (maximum %d).\",\n\t\t\t(int) dataMembers.size(), (int) arraylength, caps.limits[Graphics::LIMIT_TEXEL_BUFFER_SIZE]);\n\n\t++bufferCount;\n\ttotalGraphicsMemory += size;\n}\n\nBuffer::~Buffer()\n{\n\ttotalGraphicsMemory -= size;\n\t--bufferCount;\n}\n\nint Buffer::getDataMemberIndex(const std::string &name) const\n{\n\tfor (size_t i = 0; i < dataMembers.size(); i++)\n\t{\n\t\tif (dataMembers[i].decl.name == name)\n\t\t\treturn (int) i;\n\t}\n\n\treturn -1;\n}\n\nint Buffer::getDataMemberIndex(int bindingLocation) const\n{\n\tfor (size_t i = 0; i < dataMembers.size(); i++)\n\t{\n\t\tif (dataMembers[i].decl.bindingLocation == bindingLocation)\n\t\t\treturn (int)i;\n\t}\n\n\treturn -1;\n}\n\nvoid Buffer::clear(size_t offset, size_t size)\n{\n\tif (isImmutable())\n\t\tthrow love::Exception(\"Cannot clear an immutable Buffer.\");\n\telse if (isMapped())\n\t\tthrow love::Exception(\"Cannot clear a mapped Buffer.\");\n\telse if (offset + size > getSize())\n\t\tthrow love::Exception(\"The given offset and size parameters to clear() are not within the Buffer's size.\");\n\telse if (offset % 4 != 0 || size % 4 != 0)\n\t\tthrow love::Exception(\"clear() must be used with offset and size parameters that are multiples of 4 bytes.\");\n\n\tclearInternal(offset, size);\n}\n\nstd::vector<Buffer::DataDeclaration> Buffer::getCommonFormatDeclaration(CommonFormat format)\n{\n\tswitch (format)\n\t{\n\tcase CommonFormat::NONE:\n\t\treturn {};\n\tcase CommonFormat::XYf:\n\t\treturn {\n\t\t\t{ getConstant(ATTRIB_POS), DATAFORMAT_FLOAT_VEC2, 0, ATTRIB_POS }\n\t\t};\n\tcase CommonFormat::XYZf:\n\t\treturn {\n\t\t\t{ getConstant(ATTRIB_POS), DATAFORMAT_FLOAT_VEC3, 0, ATTRIB_POS }\n\t\t};\n\tcase CommonFormat::RGBAub:\n\t\treturn {\n\t\t\t{ getConstant(ATTRIB_COLOR), DATAFORMAT_UNORM8_VEC4, 0, ATTRIB_COLOR }\n\t\t};\n\tcase CommonFormat::STf_RGBAub:\n\t\treturn {\n\t\t\t{ getConstant(ATTRIB_TEXCOORD), DATAFORMAT_FLOAT_VEC2, 0, ATTRIB_TEXCOORD },\n\t\t\t{ getConstant(ATTRIB_COLOR), DATAFORMAT_UNORM8_VEC4, 0, ATTRIB_COLOR },\n\t\t};\n\tcase CommonFormat::STPf_RGBAub:\n\t\treturn {\n\t\t\t{ getConstant(ATTRIB_TEXCOORD), DATAFORMAT_FLOAT_VEC3, 0, ATTRIB_TEXCOORD },\n\t\t\t{ getConstant(ATTRIB_COLOR), DATAFORMAT_UNORM8_VEC4, 0, ATTRIB_COLOR },\n\t\t};\n\tcase CommonFormat::XYf_STf:\n\t\treturn {\n\t\t\t{ getConstant(ATTRIB_POS), DATAFORMAT_FLOAT_VEC2, 0, ATTRIB_POS },\n\t\t\t{ getConstant(ATTRIB_TEXCOORD), DATAFORMAT_FLOAT_VEC2, 0, ATTRIB_TEXCOORD },\n\t\t};\n\tcase CommonFormat::XYf_STPf:\n\t\treturn {\n\t\t\t{ getConstant(ATTRIB_POS), DATAFORMAT_FLOAT_VEC2, 0, ATTRIB_POS },\n\t\t\t{ getConstant(ATTRIB_TEXCOORD), DATAFORMAT_FLOAT_VEC3, 0, ATTRIB_TEXCOORD },\n\t\t};\n\tcase CommonFormat::XYf_STf_RGBAub:\n\t\treturn {\n\t\t\t{ getConstant(ATTRIB_POS), DATAFORMAT_FLOAT_VEC2, 0, ATTRIB_POS },\n\t\t\t{ getConstant(ATTRIB_TEXCOORD), DATAFORMAT_FLOAT_VEC2, 0, ATTRIB_TEXCOORD },\n\t\t\t{ getConstant(ATTRIB_COLOR), DATAFORMAT_UNORM8_VEC4, 0, ATTRIB_COLOR },\n\t\t};\n\tcase CommonFormat::XYf_STus_RGBAub:\n\t\treturn {\n\t\t\t{ getConstant(ATTRIB_POS), DATAFORMAT_FLOAT_VEC2, 0, ATTRIB_POS },\n\t\t\t{ getConstant(ATTRIB_TEXCOORD), DATAFORMAT_UNORM16_VEC2, 0, ATTRIB_TEXCOORD },\n\t\t\t{ getConstant(ATTRIB_COLOR), DATAFORMAT_UNORM8_VEC4, 0, ATTRIB_COLOR },\n\t\t};\n\tcase CommonFormat::XYf_STPf_RGBAub:\n\t\treturn {\n\t\t\t{ getConstant(ATTRIB_POS), DATAFORMAT_FLOAT_VEC2, 0, ATTRIB_POS },\n\t\t\t{ getConstant(ATTRIB_TEXCOORD), DATAFORMAT_FLOAT_VEC3, 0, ATTRIB_TEXCOORD },\n\t\t\t{ getConstant(ATTRIB_COLOR), DATAFORMAT_UNORM8_VEC4, 0, ATTRIB_COLOR },\n\t\t};\n\tcase CommonFormat::COUNT:\n\t\treturn {};\n\t}\n\n\treturn {};\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/Buffer.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/int.h\"\n#include \"common/Object.h\"\n#include \"common/Optional.h\"\n#include \"vertex.h\"\n#include \"Resource.h\"\n\n// C\n#include <stddef.h>\n#include <string>\n#include <vector>\n\nnamespace love\n{\nnamespace graphics\n{\n\nclass Graphics;\n\n/**\n * A block of GPU-owned memory.\n **/\nclass Buffer : public love::Object, public Resource\n{\npublic:\n\n\tstatic love::Type type;\n\n\tstatic int bufferCount;\n\tstatic int64 totalGraphicsMemory;\n\n\tstatic const size_t SHADER_STORAGE_BUFFER_MAX_STRIDE = 2048;\n\n\tenum MapType\n\t{\n\t\tMAP_WRITE_INVALIDATE,\n\t\tMAP_READ_ONLY,\n\t};\n\n\tstruct DataDeclaration\n\t{\n\t\tstd::string name;\n\t\tDataFormat format;\n\t\tint arrayLength;\n\t\tint bindingLocation;\n\n\t\tDataDeclaration(const std::string &name, DataFormat format, int arrayLength = 0, int bindingLocation = -1)\n\t\t\t: name(name)\n\t\t\t, format(format)\n\t\t\t, arrayLength(arrayLength)\n\t\t\t, bindingLocation(bindingLocation)\n\t\t{}\n\t};\n\n\tstruct DataMember\n\t{\n\t\tDataDeclaration decl;\n\t\tDataFormatInfo info;\n\t\tsize_t offset;\n\t\tsize_t size;\n\n\t\tDataMember(const DataDeclaration &decl)\n\t\t\t: decl(decl)\n\t\t\t, info(getDataFormatInfo(decl.format))\n\t\t\t, offset(0)\n\t\t\t, size(0)\n\t\t{}\n\t};\n\n\tstruct Settings\n\t{\n\t\tBufferUsageFlags usageFlags;\n\t\tBufferDataUsage dataUsage;\n\t\tbool zeroInitialize;\n\t\tstd::string debugName;\n\n\t\tSettings(uint32 usageflags, BufferDataUsage dataUsage)\n\t\t\t: usageFlags((BufferUsageFlags)usageflags)\n\t\t\t, dataUsage(dataUsage)\n\t\t\t, zeroInitialize(false)\n\t\t\t, debugName()\n\t\t{}\n\t};\n\n\tBuffer(Graphics *gfx, const Settings &settings, const std::vector<DataDeclaration> &format, size_t size, size_t arraylength);\n\tvirtual ~Buffer();\n\n\tsize_t getSize() const { return size; }\n\tBufferUsageFlags getUsageFlags() const { return usageFlags; }\n\tBufferDataUsage getDataUsage() const { return dataUsage; }\n\tbool isMapped() const { return mapped; }\n\n\tsize_t getArrayLength() const { return arrayLength; }\n\tsize_t getArrayStride() const { return arrayStride; }\n\tconst std::vector<DataMember> &getDataMembers() const { return dataMembers; }\n\tconst DataMember &getDataMember(int index) const { return dataMembers[index]; }\n\tsize_t getMemberOffset(int index) const { return dataMembers[index].offset; }\n\tint getDataMemberIndex(const std::string &name) const;\n\tint getDataMemberIndex(int bindingLocation) const;\n\tconst std::string &getDebugName() const { return debugName; }\n\n\tvoid setImmutable(bool immutable) { this->immutable = immutable; };\n\tbool isImmutable() const { return immutable; }\n\n\t/**\n\t * Map a portion of the Buffer to client memory.\n\t */\n\tvirtual void *map(MapType map, size_t offset, size_t size) = 0;\n\n\t/**\n\t * Unmap a previously mapped Buffer. The buffer must be unmapped when used\n\t * to draw.\n\t */\n\tvirtual void unmap(size_t usedoffset, size_t usedsize) = 0;\n\n\t/**\n\t * Fill a portion of the buffer with data.\n\t */\n\tvirtual bool fill(size_t offset, size_t size, const void *data) = 0;\n\n\t/**\n\t * Reset the given portion of this buffer's data to 0.\n\t */\n\tvoid clear(size_t offset, size_t size);\n\n\t/**\n\t * Copy a portion of this Buffer's data to another buffer, using the GPU.\n\t **/\n\tvirtual void copyTo(Buffer *dest, size_t sourceoffset, size_t destoffset, size_t size) = 0;\n\n\t/**\n\t * Texel buffers may use an additional texture handle as well as a buffer\n\t * handle.\n\t **/\n\tvirtual ptrdiff_t getTexelBufferHandle() const = 0;\n\n\tbool hasLegacyVertexBindings() const { return legacyVertexBindings; }\n\n\tstatic std::vector<DataDeclaration> getCommonFormatDeclaration(CommonFormat format);\n\n\tclass Mapper\n\t{\n\tpublic:\n\n\t\tMapper(Buffer &buffer, MapType maptype = MAP_WRITE_INVALIDATE)\n\t\t\t: buffer(buffer)\n\t\t{\n\t\t\tdata = buffer.map(maptype, 0, buffer.getSize());\n\t\t}\n\n\t\t~Mapper()\n\t\t{\n\t\t\tbuffer.unmap(0, buffer.getSize());\n\t\t}\n\n\t\tBuffer &buffer;\n\t\tvoid *data;\n\n\t}; // Mapper\n\nprotected:\n\n\tvirtual void clearInternal(size_t offset, size_t size) = 0;\n\n\tstd::vector<DataMember> dataMembers;\n\tsize_t arrayLength;\n\tsize_t arrayStride;\n\n\t// The size of the buffer, in bytes.\n\tsize_t size;\n\n\t// Bit flags describing how the buffer can be used.\n\tBufferUsageFlags usageFlags;\n\n\t// Usage hint. GL_[DYNAMIC, STATIC, STREAM]_DRAW.\n\tBufferDataUsage dataUsage;\n\n\tstd::string debugName;\n\n\tbool mapped;\n\tMapType mappedType;\n\tbool immutable;\n\n\tbool legacyVertexBindings = false;\n\t\n}; // Buffer\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/Deprecations.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"common/config.h\"\n#include \"Deprecations.h\"\n#include \"Graphics.h\"\n#include \"Font.h\"\n#include \"common/deprecation.h\"\n#include \"timer/Timer.h\"\n\n#include <algorithm>\n\nnamespace love\n{\nnamespace graphics\n{\n\nDeprecations::Deprecations()\n\t: currentDeprecationCount(0)\n\t, lastUpdatedTime(0.0)\n{\n}\n\nDeprecations::~Deprecations()\n{\n}\n\nvoid Deprecations::draw(Graphics *gfx)\n{\n\tif (!isDeprecationOutputEnabled())\n\t\treturn;\n\n\tGetDeprecated deprecations;\n\n\tif (deprecations.all.empty())\n\t\treturn;\n\n\tint total = (int) deprecations.all.size();\n\n\tif (total != currentDeprecationCount)\n\t{\n\t\tcurrentDeprecationCount = total;\n\t\tlastUpdatedTime = timer::Timer::getTime();\n\t}\n\n\tdouble showTime = 20.0;\n\tdouble fadeTime = 1.0;\n\n\tdouble delta = timer::Timer::getTime() - lastUpdatedTime;\n\n\tfloat alpha = 1.0f;\n\tif (delta > (showTime - fadeTime))\n\t\talpha = (float) (1.0 - (delta - (showTime - fadeTime)) / fadeTime);\n\n\tif (alpha <= 0.0f)\n\t\treturn;\n\n\tif (font.get() == nullptr)\n\t{\n\t\tfont::TrueTypeRasterizer::Settings settings;\n\n\t\tif (!isGammaCorrect() && gfx->getScreenDPIScale() <= 1.0)\n\t\t\tsettings.hinting = font::TrueTypeRasterizer::HINTING_LIGHT;\n\n\t\tfont.set(gfx->newDefaultFont(9, settings), Acquire::NORETAIN);\n\t}\n\n\tgfx->flushBatchedDraws();\n\n\tgfx->push(Graphics::STACK_ALL);\n\tgfx->reset();\n\n\tint maxcount = 4;\n\tint remaining = std::max(0, total - maxcount);\n\n\tstd::vector<font::ColoredString> strings;\n\tColorf white(1, 1, 1, 1);\n\n\t// Grab the newest deprecation notices first.\n\tfor (int i = total - 1; i >= remaining; --i)\n\t{\n\t\tif (!strings.empty())\n\t\t\tstrings.back().str += \"\\n\";\n\n\t\tconst DeprecationInfo *info = deprecations.all[i];\n\t\tstrings.push_back({getDeprecationNotice(*info, true), white});\n\t}\n\n\tif (remaining > 0)\n\t\tstrings.push_back({\"\\n(And \" + std::to_string(remaining) + \" more)\", white});\n\n\tint padding = 5;\n\tint width = 600;\n\n\tfor (const auto &coloredstr : strings)\n\t\twidth = std::max(width, font->getWidth(coloredstr.str) + padding * 2);\n\n\tfloat wraplimit = std::min(gfx->getWidth(), width - padding * 2);\n\n\tstd::vector<std::string> wrappedlines;\n\tfont->getWrap(strings, wraplimit, wrappedlines);\n\n\tint linecount = std::min((int) wrappedlines.size(), maxcount);\n\tint height = font->getHeight() * linecount + padding * 2;\n\n\tint x = 0;\n\tint y = std::max(gfx->getHeight() - height, 0);\n\n\tgfx->setColor(Colorf(0, 0, 0, 0.85 * alpha));\n\tgfx->rectangle(Graphics::DRAW_FILL, x, y, width, height);\n\n\tgfx->setColor(Colorf(1, 0.9, 0.8, 1 * alpha));\n\tgfx->setScissor({x, y, width, height});\n\n\tMatrix4 textm(x + padding, y + padding, 0, 1, 1, 0, 0, 0, 0);\n\tgfx->printf(strings, font.get(), wraplimit, Font::ALIGN_LEFT, textm);\n\n\tgfx->pop();\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/Deprecations.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"common/Object.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nclass Graphics;\nclass Font;\n\nclass Deprecations\n{\npublic:\n\n\tDeprecations();\n\t~Deprecations();\n\n\tvoid draw(Graphics *gfx);\n\nprivate:\n\n\tint currentDeprecationCount;\n\tdouble lastUpdatedTime;\n\tStrongRef<Font> font;\n\n}; // Deprecations\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/Drawable.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"Drawable.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nlove::Type Drawable::type(\"Drawable\", &Object::type);\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/Drawable.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_GRAPHICS_DRAWABLE_H\n#define LOVE_GRAPHICS_DRAWABLE_H\n\n// LOVE\n#include \"common/Object.h\"\n#include \"common/Matrix.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nclass Graphics;\n\n/**\n * A Drawable is anything that can be drawn on screen with a\n * position, scale and orientation.\n **/\nclass Drawable : public Object\n{\npublic:\n\n\tstatic love::Type type;\n\n\t/**\n\t * Destructor.\n\t **/\n\tvirtual ~Drawable() {}\n\n\t/**\n\t * Draws the object with the specified transformation matrix.\n\t **/\n\tvirtual void draw(Graphics *gfx, const Matrix4 &m) = 0;\n};\n\n} // graphics\n} // love\n\n#endif // LOVE_GRAPHICS_DRAWABLE_H\n"
  },
  {
    "path": "src/modules/graphics/Font.cpp",
    "content": "/**\n* Copyright (c) 2006-2026 LOVE Development Team\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n*\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n*\n* 1. The origin of this software must not be misrepresented; you must not\n*    claim that you wrote the original software. If you use this software\n*    in a product, an acknowledgment in the product documentation would be\n*    appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n*    misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n**/\n#include \"common/config.h\"\n#include \"Font.h\"\n#include \"font/GlyphData.h\"\n\n#include \"common/math.h\"\n#include \"common/Matrix.h\"\n#include \"Graphics.h\"\n\n#include <math.h>\n#include <sstream>\n#include <algorithm> // for max\n#include <limits>\n\nnamespace love\n{\nnamespace graphics\n{\n\nstatic inline uint16 normToUint16(double n)\n{\n\treturn (uint16) (n * LOVE_UINT16_MAX);\n}\n\nstatic inline uint64 packGlyphIndex(love::font::TextShaper::GlyphIndex glyphindex)\n{\n\treturn ((uint64)glyphindex.rasterizerIndex << 32) | (uint64)glyphindex.index;\n}\n\nstatic inline love::font::TextShaper::GlyphIndex unpackGlyphIndex(uint64 packedindex)\n{\n\treturn {(int) (packedindex & 0xFFFFFFFF), (int) (packedindex >> 32)};\n}\n\nlove::Type Font::type(\"Font\", &Object::type);\nint Font::fontCount = 0;\n\nconst CommonFormat Font::vertexFormat = CommonFormat::XYf_STus_RGBAub;\n\nFont::Font(love::font::Rasterizer *r, const SamplerState &s)\n\t: shaper(r->newTextShaper(), Acquire::NORETAIN)\n\t, textureWidth(128)\n\t, textureHeight(128)\n\t, samplerState()\n\t, dpiScale(r->getDPIScale())\n\t, textureCacheID(0)\n{\n\tsamplerState.minFilter = s.minFilter;\n\tsamplerState.magFilter = s.magFilter;\n\tsamplerState.maxAnisotropy = s.maxAnisotropy;\n\n\t// Try to find the best texture size match for the font size. default to the\n\t// largest texture size if no rough match is found.\n\twhile (true)\n\t{\n\t\tfloat dpiscale = r->getDPIScale();\n\t\tif ((shaper->getHeight() * 0.8 * dpiscale) * shaper->getHeight() * 30 * dpiscale <= textureWidth * textureHeight)\n\t\t\tbreak;\n\n\t\tTextureSize nextsize = getNextTextureSize();\n\n\t\tif (nextsize.width <= textureWidth && nextsize.height <= textureHeight)\n\t\t\tbreak;\n\n\t\ttextureWidth = nextsize.width;\n\t\ttextureHeight = nextsize.height;\n\t}\n\n\tlove::font::GlyphData *gd = r->getGlyphData(32); // Space character.\n\tpixelFormat = gd->getFormat();\n\tgd->release();\n\n\tauto gfx = Module::getInstance<Graphics>(Module::M_GRAPHICS);\n\tif (pixelFormat == PIXELFORMAT_LA8_UNORM && !gfx->isPixelFormatSupported(pixelFormat, PIXELFORMATUSAGEFLAGS_SAMPLE))\n\t\tpixelFormat = PIXELFORMAT_RGBA8_UNORM;\n\n\tvertexAttributesID = gfx->registerVertexAttributes(VertexAttributes(vertexFormat, 0));\n\n\tloadVolatile();\n\t++fontCount;\n}\n\nFont::~Font()\n{\n\t--fontCount;\n}\n\nFont::TextureSize Font::getNextTextureSize() const\n{\n\tTextureSize size = {textureWidth, textureHeight};\n\n\tint maxsize = 2048;\n\tauto gfx = Module::getInstance<Graphics>(Module::M_GRAPHICS);\n\tif (gfx != nullptr)\n\t{\n\t\tconst auto &caps = gfx->getCapabilities();\n\t\tmaxsize = (int) caps.limits[Graphics::LIMIT_TEXTURE_SIZE];\n\t}\n\n\tint maxwidth  = std::min(8192, maxsize);\n\tint maxheight = std::min(4096, maxsize);\n\n\tif (size.width * 2 <= maxwidth || size.height * 2 <= maxheight)\n\t{\n\t\t// {128, 128} -> {256, 128} -> {256, 256} -> {512, 256} -> etc.\n\t\tif (size.width == size.height)\n\t\t\tsize.width *= 2;\n\t\telse\n\t\t\tsize.height *= 2;\n\t}\n\n\treturn size;\n}\n\nbool Font::loadVolatile()\n{\n\ttextureCacheID++;\n\tglyphs.clear();\n\ttextures.clear();\n\tcreateTexture();\n\treturn true;\n}\n\nvoid Font::createTexture()\n{\n\tauto gfx = Module::getInstance<graphics::Graphics>(Module::M_GRAPHICS);\n\tgfx->flushBatchedDraws();\n\n\tTexture *texture = nullptr;\n\tTextureSize size = {textureWidth, textureHeight};\n\tTextureSize nextsize = getNextTextureSize();\n\tbool recreatetexture = false;\n\n\t// If we have an existing texture already, we'll try replacing it with a\n\t// larger-sized one rather than creating a second one. Having a single\n\t// texture reduces texture switches and draw calls when rendering.\n\tif ((nextsize.width > size.width || nextsize.height > size.height) && !textures.empty())\n\t{\n\t\trecreatetexture = true;\n\t\tsize = nextsize;\n\t\ttextures.pop_back();\n\t}\n\n\tTexture::Settings settings;\n\tsettings.format = pixelFormat;\n\tsettings.width = size.width;\n\tsettings.height = size.height;\n\ttexture = gfx->newTexture(settings, nullptr);\n\ttexture->setSamplerState(samplerState);\n\n\t{\n\t\tsize_t datasize = getPixelFormatSliceSize(pixelFormat, size.width, size.height);\n\t\tsize_t pixelcount = size.width * size.height;\n\n\t\t// Initialize the texture with transparent white for truetype fonts\n\t\t// (since we keep luminance constant and vary alpha in those glyphs),\n\t\t// and transparent black otherwise.\n\t\tstd::vector<uint8> emptydata(datasize, 0);\n\n\t\tif (shaper->getRasterizers()[0]->getDataType() == font::Rasterizer::DATA_TRUETYPE)\n\t\t{\n\t\t\tif (pixelFormat == PIXELFORMAT_LA8_UNORM)\n\t\t\t{\n\t\t\t\tfor (size_t i = 0; i < pixelcount; i++)\n\t\t\t\t\temptydata[i * 2 + 0] = 255;\n\t\t\t}\n\t\t\telse if (pixelFormat == PIXELFORMAT_RGBA8_UNORM)\n\t\t\t{\n\t\t\t\tfor (size_t i = 0; i < pixelcount; i++)\n\t\t\t\t{\n\t\t\t\t\temptydata[i * 4 + 0] = 255;\n\t\t\t\t\temptydata[i * 4 + 1] = 255;\n\t\t\t\t\temptydata[i * 4 + 2] = 255;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tRect rect = {0, 0, size.width, size.height};\n\t\ttexture->replacePixels(emptydata.data(), emptydata.size(), 0, 0, rect, false);\n\t}\n\n\ttextures.emplace_back(texture, Acquire::NORETAIN);\n\n\ttextureWidth  = size.width;\n\ttextureHeight = size.height;\n\n\trowHeight = textureX = textureY = TEXTURE_PADDING;\n\n\t// Re-add the old glyphs if we re-created the existing texture object.\n\tif (recreatetexture)\n\t{\n\t\ttextureCacheID++;\n\n\t\tstd::vector<love::font::TextShaper::GlyphIndex> glyphstoadd;\n\n\t\tfor (const auto &glyphpair : glyphs)\n\t\t\tglyphstoadd.push_back(unpackGlyphIndex(glyphpair.first));\n\n\t\tglyphs.clear();\n\t\t\n\t\tfor (auto glyphindex : glyphstoadd)\n\t\t\taddGlyph(glyphindex);\n\t}\n}\n\nvoid Font::unloadVolatile()\n{\n\tglyphs.clear();\n\ttextures.clear();\n}\n\nlove::font::GlyphData *Font::getRasterizerGlyphData(love::font::TextShaper::GlyphIndex glyphindex, float &dpiscale)\n{\n\tconst auto &r = shaper->getRasterizers()[glyphindex.rasterizerIndex];\n\tdpiscale = r->getDPIScale();\n\treturn r->getGlyphDataForIndex(glyphindex.index);\n}\n\nconst Font::Glyph &Font::addGlyph(love::font::TextShaper::GlyphIndex glyphindex)\n{\n\tfloat glyphdpiscale = getDPIScale();\n\tStrongRef<love::font::GlyphData> gd(getRasterizerGlyphData(glyphindex, glyphdpiscale), Acquire::NORETAIN);\n\n\tint w = gd->getWidth();\n\tint h = gd->getHeight();\n\n\tif (w + TEXTURE_PADDING * 2 < textureWidth && h + TEXTURE_PADDING * 2 < textureHeight)\n\t{\n\t\tif (textureX + w + TEXTURE_PADDING > textureWidth)\n\t\t{\n\t\t\t// Out of space - new row!\n\t\t\ttextureX = TEXTURE_PADDING;\n\t\t\ttextureY += rowHeight;\n\t\t\trowHeight = TEXTURE_PADDING;\n\t\t}\n\n\t\tif (textureY + h + TEXTURE_PADDING > textureHeight)\n\t\t{\n\t\t\t// Totally out of space - new texture!\n\t\t\tcreateTexture();\n\n\t\t\t// Makes sure the above code for checking if the glyph can fit at\n\t\t\t// the current position in the texture is run again for this glyph.\n\t\t\treturn addGlyph(glyphindex);\n\t\t}\n\t}\n\n\tGlyph g;\n\n\tg.texture = nullptr;\n\tmemset(g.vertices, 0, sizeof(GlyphVertex) * 4);\n\n\t// Don't waste space for empty glyphs.\n\tif (w > 0 && h > 0)\n\t{\n\t\tTexture *texture = textures.back();\n\t\tg.texture = texture;\n\n\t\tRect rect = {textureX, textureY, gd->getWidth(), gd->getHeight()};\n\n\t\tif (pixelFormat != gd->getFormat())\n\t\t{\n\t\t\tif (!(pixelFormat == PIXELFORMAT_RGBA8_UNORM && gd->getFormat() == PIXELFORMAT_LA8_UNORM))\n\t\t\t\tthrow love::Exception(\"Cannot upload font glyphs to texture atlas: unexpected format conversion.\");\n\n\t\t\tconst uint8 *src = (const uint8 *) gd->getData();\n\n\t\t\tsize_t dstsize = getPixelFormatSliceSize(pixelFormat, w, h);\n\t\t\tstd::vector<uint8> dst(dstsize, 0);\n\t\t\tuint8 *dstdata = dst.data();\n\n\t\t\tfor (int pixel = 0; pixel < w * h; pixel++)\n\t\t\t{\n\t\t\t\tdstdata[pixel * 4 + 0] = src[pixel * 2 + 0];\n\t\t\t\tdstdata[pixel * 4 + 1] = src[pixel * 2 + 0];\n\t\t\t\tdstdata[pixel * 4 + 2] = src[pixel * 2 + 0];\n\t\t\t\tdstdata[pixel * 4 + 3] = src[pixel * 2 + 1];\n\t\t\t}\n\n\t\t\ttexture->replacePixels(dstdata, dstsize, 0, 0, rect, false);\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttexture->replacePixels(gd->getData(), gd->getSize(), 0, 0, rect, false);\n\t\t}\n\n\t\tdouble tX     = (double) textureX,     tY      = (double) textureY;\n\t\tdouble tWidth = (double) textureWidth, tHeight = (double) textureHeight;\n\n\t\tColor32 c(255, 255, 255, 255);\n\n\t\t// Extrude the quad borders by 1 pixel. We have an extra pixel of\n\t\t// transparent padding in the texture atlas, so the quad extrusion will\n\t\t// add some antialiasing at the edges of the quad.\n\t\tfloat o = 1;\n\n\t\t// 0---2\n\t\t// | / |\n\t\t// 1---3\n\t\tconst GlyphVertex verts[4] =\n\t\t{\n\t\t\t{ -o,  -o, normToUint16((tX-o)/tWidth),   normToUint16((tY-o)/tHeight),   c},\n\t\t\t{ -o, h+o, normToUint16((tX-o)/tWidth),   normToUint16((tY+h+o)/tHeight), c},\n\t\t\t{w+o,  -o, normToUint16((tX+w+o)/tWidth), normToUint16((tY-o)/tHeight),   c},\n\t\t\t{w+o, h+o, normToUint16((tX+w+o)/tWidth), normToUint16((tY+h+o)/tHeight), c}\n\t\t};\n\n\t\t// Copy vertex data to the glyph and set proper bearing.\n\t\tfor (int i = 0; i < 4; i++)\n\t\t{\n\t\t\tg.vertices[i] = verts[i];\n\t\t\tg.vertices[i].x += gd->getBearingX();\n\t\t\tg.vertices[i].y -= gd->getBearingY();\n\t\t\tg.vertices[i].x /= glyphdpiscale;\n\t\t\tg.vertices[i].y /= glyphdpiscale;\n\t\t}\n\n\t\ttextureX += w + TEXTURE_PADDING;\n\t\trowHeight = std::max(rowHeight, h + TEXTURE_PADDING);\n\t}\n\n\tuint64 packedindex = packGlyphIndex(glyphindex);\n\tglyphs[packedindex] = g;\n\treturn glyphs[packedindex];\n}\n\nconst Font::Glyph &Font::findGlyph(love::font::TextShaper::GlyphIndex glyphindex)\n{\n\tuint64 packedindex = packGlyphIndex(glyphindex);\n\tconst auto it = glyphs.find(packedindex);\n\n\tif (it != glyphs.end())\n\t\treturn it->second;\n\n\treturn addGlyph(glyphindex);\n}\n\nfloat Font::getKerning(uint32 leftglyph, uint32 rightglyph)\n{\n\treturn shaper->getKerning(leftglyph, rightglyph);\n}\n\nfloat Font::getKerning(const std::string &leftchar, const std::string &rightchar)\n{\n\treturn shaper->getKerning(leftchar, rightchar);\n}\n\nfloat Font::getHeight() const\n{\n\treturn shaper->getHeight();\n}\n\nstd::vector<Font::DrawCommand> Font::generateVertices(const love::font::ColoredCodepoints &codepoints, Range range, const Colorf &constantcolor, std::vector<GlyphVertex> &vertices, float extra_spacing, Vector2 offset, love::font::TextShaper::TextInfo *info)\n{\n\tstd::vector<love::font::TextShaper::GlyphPosition> glyphpositions;\n\tstd::vector<love::font::IndexedColor> colors;\n\tshaper->computeGlyphPositions(codepoints, range, offset, extra_spacing, &glyphpositions, &colors, info);\n\n\tsize_t vertstartsize = vertices.size();\n\tvertices.reserve(vertstartsize + glyphpositions.size() * 4);\n\n\tColorf linearconstantcolor = gammaCorrectColor(constantcolor);\n\tColor32 curcolor = toColor32(constantcolor);\n\n\tint curcolori = 0;\n\tint ncolors = (int)colors.size();\n\n\t// Keeps track of when we need to switch textures in our vertex array.\n\tstd::vector<DrawCommand> commands;\n\n\tfor (int i = 0; i < (int) glyphpositions.size(); i++)\n\t{\n\t\tconst auto &info = glyphpositions[i];\n\n\t\tuint32 cacheid = textureCacheID;\n\n\t\tconst Glyph &glyph = findGlyph(info.glyphIndex);\n\n\t\t// If findGlyph invalidates the texture cache, restart the loop.\n\t\tif (cacheid != textureCacheID)\n\t\t{\n\t\t\ti = -1; // The next iteration will increment this to 0.\n\t\t\tcommands.clear();\n\t\t\tvertices.resize(vertstartsize);\n\t\t\tcurcolori = 0;\n\t\t\tcurcolor = toColor32(constantcolor);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (curcolori < ncolors && colors[curcolori].index == i)\n\t\t{\n\t\t\tColorf c = colors[curcolori].color;\n\n\t\t\tc.r = std::min(std::max(c.r, 0.0f), 1.0f);\n\t\t\tc.g = std::min(std::max(c.g, 0.0f), 1.0f);\n\t\t\tc.b = std::min(std::max(c.b, 0.0f), 1.0f);\n\t\t\tc.a = std::min(std::max(c.a, 0.0f), 1.0f);\n\n\t\t\tgammaCorrectColor(c);\n\t\t\tc *= linearconstantcolor;\n\t\t\tunGammaCorrectColor(c);\n\n\t\t\tcurcolor = toColor32(c);\n\t\t\tcurcolori++;\n\t\t}\n\n\t\tif (glyph.texture != nullptr)\n\t\t{\n\t\t\t// Copy the vertices and set their colors and relative positions.\n\t\t\tfor (int j = 0; j < 4; j++)\n\t\t\t{\n\t\t\t\tvertices.push_back(glyph.vertices[j]);\n\t\t\t\tvertices.back().x += info.position.x;\n\t\t\t\tvertices.back().y += info.position.y;\n\t\t\t\tvertices.back().color = curcolor;\n\t\t\t}\n\n\t\t\t// Check if glyph texture has changed since the last iteration.\n\t\t\tif (commands.empty() || commands.back().texture != glyph.texture)\n\t\t\t{\n\t\t\t\t// Add a new draw command if the texture has changed.\n\t\t\t\tDrawCommand cmd;\n\t\t\t\tcmd.startvertex = (int)vertices.size() - 4;\n\t\t\t\tcmd.vertexcount = 0;\n\t\t\t\tcmd.texture = glyph.texture;\n\t\t\t\tcommands.push_back(cmd);\n\t\t\t}\n\n\t\t\tcommands.back().vertexcount += 4;\n\t\t}\n\t}\n\n\tconst auto drawsort = [](const DrawCommand &a, const DrawCommand &b) -> bool\n\t{\n\t\t// Texture binds are expensive, so we should sort by that first.\n\t\tif (a.texture != b.texture)\n\t\t\treturn a.texture < b.texture;\n\t\telse\n\t\t\treturn a.startvertex < b.startvertex;\n\t};\n\n\tstd::sort(commands.begin(), commands.end(), drawsort);\n\n\treturn commands;\n}\n\nstd::vector<Font::DrawCommand> Font::generateVerticesFormatted(const love::font::ColoredCodepoints &text, const Colorf &constantcolor, float wrap, AlignMode align, std::vector<GlyphVertex> &vertices, love::font::TextShaper::TextInfo *info)\n{\n\twrap = std::max(wrap, 0.0f);\n\n\tuint32 cacheid = textureCacheID;\n\n\tstd::vector<DrawCommand> drawcommands;\n\tvertices.reserve(text.cps.size() * 4);\n\n\tstd::vector<Range> ranges;\n\tstd::vector<float> widths;\n\tshaper->getWrap(text, wrap, ranges, &widths);\n\n\tfloat y = 0.0f;\n\tfloat maxwidth = 0.0f;\n\n\tfor (int i = 0; i < (int)ranges.size(); i++)\n\t{\n\t\tconst auto &range = ranges[i];\n\n\t\tif (!range.isValid())\n\t\t{\n\t\t\ty += shaper->getCombinedHeight();\n\t\t\tcontinue;\n\t\t}\n\n\t\tfloat width = widths[i];\n\t\tlove::Vector2 offset(0.0f, floorf(y));\n\t\tfloat extraspacing = 0.0f;\n\n\t\tmaxwidth = std::max(width, maxwidth);\n\n\t\tswitch (align)\n\t\t{\n\t\t\tcase ALIGN_RIGHT:\n\t\t\t\toffset.x = floorf(wrap - width);\n\t\t\t\tbreak;\n\t\t\tcase ALIGN_CENTER:\n\t\t\t\toffset.x = floorf((wrap - width) / 2.0f);\n\t\t\t\tbreak;\n\t\t\tcase ALIGN_JUSTIFY:\n\t\t\t{\n\t\t\t\tauto start = text.cps.begin() + range.getOffset();\n\t\t\t\tauto end = start + range.getSize();\n\t\t\t\tfloat numspaces = std::count(start, end, ' ');\n\n\t\t\t\tif (text.cps[range.last] == ' ')\n\t\t\t\t\t--numspaces;\n\n\t\t\t\tif (width < wrap && numspaces >= 1)\n\t\t\t\t\textraspacing = (wrap - width) / numspaces;\n\t\t\t\telse\n\t\t\t\t\textraspacing = 0.0f;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ALIGN_LEFT:\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\tstd::vector<DrawCommand> newcommands = generateVertices(text, range, constantcolor, vertices, extraspacing, offset);\n\n\t\tif (!newcommands.empty())\n\t\t{\n\t\t\tauto firstcmd = newcommands.begin();\n\n\t\t\t// If the first draw command in the new list has the same texture\n\t\t\t// as the last one in the existing list we're building and its\n\t\t\t// vertices are in-order, we can combine them (saving a draw call.)\n\t\t\tif (!drawcommands.empty())\n\t\t\t{\n\t\t\t\tauto prevcmd = drawcommands.back();\n\t\t\t\tif (prevcmd.texture == firstcmd->texture && (prevcmd.startvertex + prevcmd.vertexcount) == firstcmd->startvertex)\n\t\t\t\t{\n\t\t\t\t\tdrawcommands.back().vertexcount += firstcmd->vertexcount;\n\t\t\t\t\t++firstcmd;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Append the new draw commands to the list we're building.\n\t\t\tdrawcommands.insert(drawcommands.end(), firstcmd, newcommands.end());\n\t\t}\n\n\t\ty += shaper->getCombinedHeight();\n\t}\n\n\tif (info != nullptr)\n\t{\n\t\tinfo->width = (int) maxwidth;\n\t\tinfo->height = (int) y;\n\t}\n\n\tif (cacheid != textureCacheID)\n\t{\n\t\tvertices.clear();\n\t\tdrawcommands = generateVerticesFormatted(text, constantcolor, wrap, align, vertices);\n\t}\n\n\treturn drawcommands;\n}\n\nvoid Font::printv(graphics::Graphics *gfx, const Matrix4 &t, const std::vector<DrawCommand> &drawcommands, const std::vector<GlyphVertex> &vertices)\n{\n\tif (vertices.empty() || drawcommands.empty())\n\t\treturn;\n\n\tMatrix4 m(gfx->getTransform(), t);\n\n\tfor (const DrawCommand &cmd : drawcommands)\n\t{\n\t\tGraphics::BatchedDrawCommand streamcmd;\n\t\tstreamcmd.formats[0] = vertexFormat;\n\t\tstreamcmd.indexMode = TRIANGLEINDEX_QUADS;\n\t\tstreamcmd.vertexCount = cmd.vertexcount;\n\t\tstreamcmd.texture = cmd.texture;\n\n\t\tGraphics::BatchedVertexData data = gfx->requestBatchedDraw(streamcmd);\n\t\tGlyphVertex *vertexdata = (GlyphVertex *) data.stream[0];\n\n\t\tmemcpy(vertexdata, &vertices[cmd.startvertex], sizeof(GlyphVertex) * cmd.vertexcount);\n\t\tm.transformXY(vertexdata, &vertices[cmd.startvertex], cmd.vertexcount);\n\t}\n}\n\nvoid Font::print(graphics::Graphics *gfx, const std::vector<love::font::ColoredString> &text, const Matrix4 &m, const Colorf &constantcolor)\n{\n\tlove::font::ColoredCodepoints codepoints;\n\tlove::font::getCodepointsFromString(text, codepoints);\n\n\tstd::vector<GlyphVertex> vertices;\n\tstd::vector<DrawCommand> drawcommands = generateVertices(codepoints, Range(), constantcolor, vertices);\n\n\tprintv(gfx, m, drawcommands, vertices);\n}\n\nvoid Font::printf(graphics::Graphics *gfx, const std::vector<love::font::ColoredString> &text, float wrap, AlignMode align, const Matrix4 &m, const Colorf &constantcolor)\n{\n\tlove::font::ColoredCodepoints codepoints;\n\tlove::font::getCodepointsFromString(text, codepoints);\n\n\tstd::vector<GlyphVertex> vertices;\n\tstd::vector<DrawCommand> drawcommands = generateVerticesFormatted(codepoints, constantcolor, wrap, align, vertices);\n\n\tprintv(gfx, m, drawcommands, vertices);\n}\n\nint Font::getWidth(const std::string &str)\n{\n\treturn shaper->getWidth(str);\n}\n\nint Font::getWidth(uint32 glyph)\n{\n\treturn shaper->getGlyphAdvance(glyph);\n}\n\nvoid Font::getWrap(const love::font::ColoredCodepoints &codepoints, float wraplimit, std::vector<Range> &ranges, std::vector<float> *linewidths)\n{\n\tshaper->getWrap(codepoints, wraplimit, ranges, linewidths);\n}\n\nvoid Font::getWrap(const std::vector<love::font::ColoredString> &text, float wraplimit, std::vector<std::string> &lines, std::vector<float> *linewidths)\n{\n\tshaper->getWrap(text, wraplimit, lines, linewidths);\n}\n\nvoid Font::setLineHeight(float height)\n{\n\tshaper->setLineHeight(height);\n}\n\nfloat Font::getLineHeight() const\n{\n\treturn shaper->getLineHeight();\n}\n\nvoid Font::setSamplerState(const SamplerState &s)\n{\n\tsamplerState.minFilter = s.minFilter;\n\tsamplerState.magFilter = s.magFilter;\n\tsamplerState.maxAnisotropy = s.maxAnisotropy;\n\n\tfor (const auto &texture : textures)\n\t\ttexture->setSamplerState(samplerState);\n}\n\nconst SamplerState &Font::getSamplerState() const\n{\n\treturn samplerState;\n}\n\nint Font::getAscent() const\n{\n\treturn shaper->getAscent();\n}\n\nint Font::getDescent() const\n{\n\treturn shaper->getDescent();\n}\n\nfloat Font::getBaseline() const\n{\n\treturn shaper->getBaseline();\n}\n\nbool Font::hasGlyph(uint32 glyph) const\n{\n\treturn shaper->hasGlyph(glyph);\n}\n\nbool Font::hasGlyphs(const std::string &text) const\n{\n\treturn shaper->hasGlyphs(text);\n}\n\nvoid Font::setFallbacks(const std::vector<Font *> &fallbacks)\n{\n\tstd::vector<love::font::Rasterizer*> rasterizerfallbacks;\n\tfor (const Font* f : fallbacks)\n\t\trasterizerfallbacks.push_back(f->shaper->getRasterizers()[0]);\n\n\tshaper->setFallbacks(rasterizerfallbacks);\n\n\t// Invalidate existing textures.\n\ttextureCacheID++;\n\tglyphs.clear();\n\twhile (textures.size() > 1)\n\t\ttextures.pop_back();\n\n\trowHeight = textureX = textureY = TEXTURE_PADDING;\n}\n\nfloat Font::getDPIScale() const\n{\n\treturn dpiScale;\n}\n\nuint32 Font::getTextureCacheID() const\n{\n\treturn textureCacheID;\n}\n\nbool Font::getConstant(const char *in, AlignMode &out)\n{\n\treturn alignModes.find(in, out);\n}\n\nbool Font::getConstant(AlignMode in, const char  *&out)\n{\n\treturn alignModes.find(in, out);\n}\n\nstd::vector<std::string> Font::getConstants(AlignMode)\n{\n\treturn alignModes.getNames();\n}\n\nStringMap<Font::AlignMode, Font::ALIGN_MAX_ENUM>::Entry Font::alignModeEntries[] =\n{\n\t{ \"left\", ALIGN_LEFT },\n\t{ \"right\", ALIGN_RIGHT },\n\t{ \"center\", ALIGN_CENTER },\n\t{ \"justify\", ALIGN_JUSTIFY },\n};\n\nStringMap<Font::AlignMode, Font::ALIGN_MAX_ENUM> Font::alignModes(Font::alignModeEntries, sizeof(Font::alignModeEntries));\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/Font.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n*    misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n**/\n\n#pragma once\n\n// STD\n#include <unordered_map>\n#include <string>\n#include <vector>\n#include <stddef.h>\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/Object.h\"\n#include \"common/Matrix.h\"\n#include \"common/Vector.h\"\n\n#include \"font/Rasterizer.h\"\n#include \"font/TextShaper.h\"\n#include \"Texture.h\"\n#include \"vertex.h\"\n#include \"Volatile.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nclass Graphics;\n\nclass Font : public Object, public Volatile\n{\npublic:\n\n\tstatic love::Type type;\n\n\ttypedef std::vector<uint32> Codepoints;\n\ttypedef XYf_STus_RGBAub GlyphVertex;\n\n\tstatic const CommonFormat vertexFormat;\n\n\tenum AlignMode\n\t{\n\t\tALIGN_LEFT,\n\t\tALIGN_CENTER,\n\t\tALIGN_RIGHT,\n\t\tALIGN_JUSTIFY,\n\t\tALIGN_MAX_ENUM\n\t};\n\n\t// Used to determine when to change textures in the generated vertex array.\n\tstruct DrawCommand\n\t{\n\t\tTexture *texture;\n\t\tint startvertex;\n\t\tint vertexcount;\n\t};\n\n\tFont(love::font::Rasterizer *r, const SamplerState &samplerState);\n\n\tvirtual ~Font();\n\n\tstd::vector<DrawCommand> generateVertices(const love::font::ColoredCodepoints &codepoints, Range range, const Colorf &constantColor, std::vector<GlyphVertex> &vertices,\n\t                                          float extra_spacing = 0.0f, Vector2 offset = {}, love::font::TextShaper::TextInfo *info = nullptr);\n\n\tstd::vector<DrawCommand> generateVerticesFormatted(const love::font::ColoredCodepoints &text, const Colorf &constantColor, float wrap, AlignMode align,\n\t                                                   std::vector<GlyphVertex> &vertices, love::font::TextShaper::TextInfo *info = nullptr);\n\n\t/**\n\t * Draws the specified text.\n\t **/\n\tvoid print(graphics::Graphics *gfx, const std::vector<love::font::ColoredString> &text, const Matrix4 &m, const Colorf &constantColor);\n\tvoid printf(graphics::Graphics *gfx, const std::vector<love::font::ColoredString> &text, float wrap, AlignMode align, const Matrix4 &m, const Colorf &constantColor);\n\n\t/**\n\t * Returns the height of the font.\n\t **/\n\tfloat getHeight() const;\n\n\t/**\n\t * Returns the width of the passed string.\n\t *\n\t * @param str A string of text.\n\t **/\n\tint getWidth(const std::string &str);\n\n\t/**\n\t * Returns the width of the passed glyph.\n\t **/\n\tint getWidth(uint32 glyph);\n\n\t/**\n\t * Returns the maximal width of a wrapped string\n\t * and optionally the number of lines\n\t *\n\t * @param text The input text\n\t * @param wraplimit The number of pixels to wrap at\n\t * @param max_width Optional output of the maximum width\n\t * Returns a vector with the lines.\n\t **/\n\tvoid getWrap(const std::vector<love::font::ColoredString> &text, float wraplimit, std::vector<std::string> &lines, std::vector<float> *line_widths = nullptr);\n\tvoid getWrap(const love::font::ColoredCodepoints &codepoints, float wraplimit, std::vector<Range> &ranges, std::vector<float> *line_widths = nullptr);\n\n\t/**\n\t * Sets the line height (which should be a number to multiply the font size by,\n\t * example: line height = 1.2 and size = 12 means that rendered line height = 12*1.2)\n\t * @param height The new line height.\n\t **/\n\tvoid setLineHeight(float height);\n\n\t/**\n\t * Returns the line height.\n\t **/\n\tfloat getLineHeight() const;\n\n\tvoid setSamplerState(const SamplerState &s);\n\tconst SamplerState &getSamplerState() const;\n\n\t// Extra font metrics\n\tint getAscent() const;\n\tint getDescent() const;\n\tfloat getBaseline() const;\n\n\tbool hasGlyph(uint32 glyph) const;\n\tbool hasGlyphs(const std::string &text) const;\n\n\tfloat getKerning(uint32 leftglyph, uint32 rightglyph);\n\tfloat getKerning(const std::string &leftchar, const std::string &rightchar);\n\n\tvoid setFallbacks(const std::vector<Font *> &fallbacks);\n\n\tfloat getDPIScale() const;\n\n\tuint32 getTextureCacheID() const;\n\n\tVertexAttributesID getVertexAttributesID() const { return vertexAttributesID; }\n\n\t// Implements Volatile.\n\tbool loadVolatile() override;\n\tvoid unloadVolatile() override;\n\n\tstatic bool getConstant(const char *in, AlignMode &out);\n\tstatic bool getConstant(AlignMode in, const char *&out);\n\tstatic std::vector<std::string> getConstants(AlignMode);\n\n\tstatic int fontCount;\n\nprivate:\n\n\tstruct Glyph\n\t{\n\t\tTexture *texture;\n\t\tGlyphVertex vertices[4];\n\t};\n\n\tstruct TextureSize\n\t{\n\t\tint width;\n\t\tint height;\n\t};\n\n\tvoid createTexture();\n\n\tTextureSize getNextTextureSize() const;\n\tlove::font::GlyphData *getRasterizerGlyphData(love::font::TextShaper::GlyphIndex glyphindex, float &dpiscale);\n\tconst Glyph &addGlyph(love::font::TextShaper::GlyphIndex glyphindex);\n\tconst Glyph &findGlyph(love::font::TextShaper::GlyphIndex glyphindex);\n\tvoid printv(Graphics *gfx, const Matrix4 &t, const std::vector<DrawCommand> &drawcommands, const std::vector<GlyphVertex> &vertices);\n\n\tStrongRef<love::font::TextShaper> shaper;\n\n\tint textureWidth;\n\tint textureHeight;\n\n\tstd::vector<StrongRef<Texture>> textures;\n\n\t// maps packed glyph index values to glyph texture information\n\tstd::unordered_map<uint64, Glyph> glyphs;\n\n\tPixelFormat pixelFormat;\n\n\tSamplerState samplerState;\n\n\tfloat dpiScale;\n\n\tint textureX, textureY;\n\tint rowHeight;\n\n\t// ID which is incremented when the texture cache is invalidated.\n\tuint32 textureCacheID;\n\n\tVertexAttributesID vertexAttributesID;\n\n\t// 1 pixel of transparent padding between glyphs (so quads won't pick up\n\t// other glyphs), plus one pixel of transparent padding that the quads will\n\t// use, for edge antialiasing.\n\tstatic const int TEXTURE_PADDING = 2;\n\n\tstatic StringMap<AlignMode, ALIGN_MAX_ENUM>::Entry alignModeEntries[];\n\tstatic StringMap<AlignMode, ALIGN_MAX_ENUM> alignModes;\n\t\n}; // Font\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/Graphics.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"Graphics.h\"\n#include \"Buffer.h\"\n#include \"math/MathModule.h\"\n#include \"data/DataModule.h\"\n#include \"Polyline.h\"\n#include \"font/Font.h\"\n#include \"window/Window.h\"\n#include \"SpriteBatch.h\"\n#include \"ParticleSystem.h\"\n#include \"Font.h\"\n#include \"Video.h\"\n#include \"TextBatch.h\"\n#include \"common/deprecation.h\"\n#include \"common/config.h\"\n\n// C++\n#include <algorithm>\n#include <stdlib.h>\n\nnamespace love\n{\nnamespace graphics\n{\n\nstatic bool gammaCorrect = false;\nstatic bool lowPowerPreferred = false;\nstatic bool debugMode = false;\nstatic bool debugModeQueried = false;\n\nvoid setGammaCorrect(bool gammacorrect)\n{\n\tgammaCorrect = gammacorrect;\n}\n\nbool isGammaCorrect()\n{\n\treturn gammaCorrect;\n}\n\nvoid gammaCorrectColor(Colorf &c)\n{\n\tif (isGammaCorrect())\n\t{\n\t\tc.r = math::gammaToLinear(c.r);\n\t\tc.g = math::gammaToLinear(c.g);\n\t\tc.b = math::gammaToLinear(c.b);\n\t}\n}\n\nColorf gammaCorrectColor(const Colorf &c)\n{\n\tColorf r = c;\n\tgammaCorrectColor(r);\n\treturn r;\n}\n\nvoid unGammaCorrectColor(Colorf &c)\n{\n\tif (isGammaCorrect())\n\t{\n\t\tc.r = math::linearToGamma(c.r);\n\t\tc.g = math::linearToGamma(c.g);\n\t\tc.b = math::linearToGamma(c.b);\n\t}\n}\n\nColorf unGammaCorrectColor(const Colorf &c)\n{\n\tColorf r = c;\n\tunGammaCorrectColor(r);\n\treturn r;\n}\n\nbool isDebugEnabled()\n{\n\tif (!debugModeQueried)\n\t{\n\t\tconst char *debugenv = getenv(\"LOVE_GRAPHICS_DEBUG\");\n\t\tdebugMode = debugenv != nullptr && debugenv[0] != '0';\n\t\tdebugModeQueried = true;\n\t}\n\n\treturn debugMode;\n}\n\nlove::Type Graphics::type(\"graphics\", &Module::type);\n\nnamespace opengl { extern love::graphics::Graphics *createInstance(); }\n#ifdef LOVE_GRAPHICS_METAL\nnamespace metal { extern love::graphics::Graphics *createInstance(); }\n#endif\n#ifdef LOVE_GRAPHICS_VULKAN\nnamespace vulkan { extern love::graphics::Graphics *createInstance(); }\n#endif\n\nstatic const Renderer rendererOrder[] = {\n\tRENDERER_METAL,\n#if defined(LOVE_ANDROID) || (defined(LOVE_WINDOWS) && defined(_M_ARM64))\n\t// Don't prioritize Vulkan by default yet on Android - it needs more testing.\n\t// Also don't prioritize Vulkan on Windows ARM64 because it doesn't work.\n\t// See https://github.com/love2d/love/issues/2196\n\tRENDERER_OPENGL,\n\tRENDERER_VULKAN,\n#else\n\tRENDERER_VULKAN,\n\tRENDERER_OPENGL,\n#endif\n};\n\nstatic std::vector<Renderer> defaultRenderers =\n{\n\tRENDERER_METAL,\n\tRENDERER_VULKAN,\n\tRENDERER_OPENGL,\n};\n\nstatic std::vector<Renderer> _renderers = defaultRenderers;\n\nconst std::vector<Renderer> &getDefaultRenderers()\n{\n\treturn defaultRenderers;\n}\n\nconst std::vector<Renderer> &getRenderers()\n{\n\treturn _renderers;\n}\n\nvoid setRenderers(const std::vector<Renderer> &renderers)\n{\n\t_renderers = renderers;\n}\n\nvoid setLowPowerPreferred(bool preferred)\n{\n\tlowPowerPreferred = preferred;\n}\n\nbool isLowPowerPreferred()\n{\n\treturn lowPowerPreferred;\n}\n\nGraphics *Graphics::createInstance()\n{\n\tGraphics *instance = Module::getInstance<Graphics>(M_GRAPHICS);\n\n\tif (instance != nullptr)\n\t\tinstance->retain();\n\telse\n\t{\n\t\tfor (auto r : rendererOrder)\n\t\t{\n\n\t\t\tif (std::find(_renderers.begin(), _renderers.end(), r) == _renderers.end())\n\t\t\t\tcontinue;\n\n#ifdef LOVE_GRAPHICS_VULKAN\n\t\t\tif (r == RENDERER_VULKAN)\n\t\t\t\tinstance = vulkan::createInstance();\n#endif\n\t\t\tif (r == RENDERER_OPENGL)\n\t\t\t\tinstance = opengl::createInstance();\n#ifdef LOVE_GRAPHICS_METAL\n\t\t\tif (r == RENDERER_METAL)\n\t\t\t\tinstance = metal::createInstance();\n#endif\n\t\t\tif (instance != nullptr)\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn instance;\n}\n\nGraphics::DisplayState::DisplayState()\n{\n\tdefaultSamplerState.mipmapFilter = SamplerState::MIPMAP_FILTER_LINEAR;\n}\n\nGraphics::Graphics(const char *name)\n\t: Module(M_GRAPHICS, name)\n\t, width(0)\n\t, height(0)\n\t, pixelWidth(0)\n\t, pixelHeight(0)\n\t, backbufferHasStencil(false)\n\t, backbufferHasDepth(false)\n\t, created(false)\n\t, active(true)\n\t, batchedDrawState()\n\t, deviceProjectionMatrix()\n\t, renderTargetSwitchCount(0)\n\t, drawCalls(0)\n\t, drawCallsBatched(0)\n\t, quadIndexBuffer(nullptr)\n\t, fanIndexBuffer(nullptr)\n\t, capabilities()\n\t, defaultTextures()\n\t, defaultTexelBuffers()\n\t, defaultStorageBuffer(nullptr)\n\t, cachedShaderStages()\n{\n\ttransformStack.reserve(16);\n\ttransformStack.push_back(Matrix4());\n\n\tpixelScaleStack.reserve(16);\n\tpixelScaleStack.push_back(1);\n\n\tstates.reserve(10);\n\tstates.push_back(DisplayState());\n\n\tnoAttributesID = registerVertexAttributes(VertexAttributes());\n\n\tif (!Shader::initialize())\n\t\tthrow love::Exception(\"Shader support failed to initialize.\");\n}\n\nGraphics::~Graphics()\n{\n\tif (quadIndexBuffer != nullptr)\n\t\tquadIndexBuffer->release();\n\tif (fanIndexBuffer != nullptr)\n\t\tfanIndexBuffer->release();\n\n\treleaseDefaultResources();\n\n\t// Clean up standard shaders before the active shader. If we do it after,\n\t// the active shader may try to activate a standard shader when deactivating\n\t// itself, which will cause problems since it calls Graphics methods in the\n\t// Graphics destructor.\n\tfor (int i = 0; i < Shader::STANDARD_MAX_ENUM; i++)\n\t{\n\t\tif (Shader::standardShaders[i])\n\t\t{\n\t\t\tShader::standardShaders[i]->release();\n\t\t\tShader::standardShaders[i] = nullptr;\n\t\t}\n\t}\n\n\tstates.clear();\n\n\tdefaultFont.set(nullptr);\n\n\tif (batchedDrawState.vb[0])\n\t\tbatchedDrawState.vb[0]->release();\n\tif (batchedDrawState.vb[1])\n\t\tbatchedDrawState.vb[1]->release();\n\tif (batchedDrawState.indexBuffer)\n\t\tbatchedDrawState.indexBuffer->release();\n\n\tfor (int i = 0; i < (int) SHADERSTAGE_MAX_ENUM; i++)\n\t\tcachedShaderStages[i].clear();\n\n\tpendingReadbacks.clear();\n\tclearTemporaryResources();\n\n\tShader::deinitialize();\n}\n\nvoid Graphics::createQuadIndexBuffer()\n{\n\tif (quadIndexBuffer != nullptr)\n\t\treturn;\n\n\tsize_t size = sizeof(uint16) * getIndexCount(TRIANGLEINDEX_QUADS, LOVE_UINT16_MAX);\n\n\tBuffer::Settings settings(BUFFERUSAGEFLAG_INDEX, BUFFERDATAUSAGE_STATIC);\n\tquadIndexBuffer = newBuffer(settings, DATAFORMAT_UINT16, nullptr, size, 0);\n\n\t{\n\t\tBuffer::Mapper map(*quadIndexBuffer);\n\t\tfillIndices(TRIANGLEINDEX_QUADS, 0, LOVE_UINT16_MAX, (uint16 *) map.data);\n\t}\n\n\tquadIndexBuffer->setImmutable(true);\n}\n\nvoid Graphics::createFanIndexBuffer()\n{\n\tif (fanIndexBuffer != nullptr)\n\t\treturn;\n\n\tsize_t size = sizeof(uint16) * getIndexCount(TRIANGLEINDEX_FAN, LOVE_UINT16_MAX);\n\n\tBuffer::Settings settings(BUFFERUSAGEFLAG_INDEX, BUFFERDATAUSAGE_STATIC);\n\tfanIndexBuffer = newBuffer(settings, DATAFORMAT_UINT16, nullptr, size, 0);\n\n\tBuffer::Mapper map(*fanIndexBuffer);\n\tfillIndices(TRIANGLEINDEX_FAN, 0, LOVE_UINT16_MAX, (uint16 *) map.data);\n\n\tfanIndexBuffer->setImmutable(true);\n}\n\nQuad *Graphics::newQuad(Quad::Viewport v, double sw, double sh)\n{\n\treturn new Quad(v, sw, sh);\n}\n\nFont *Graphics::newFont(love::font::Rasterizer *data)\n{\n\treturn new Font(data, states.back().defaultSamplerState);\n}\n\nFont *Graphics::newDefaultFont(int size, const font::TrueTypeRasterizer::Settings &settings)\n{\n\tauto fontmodule = Module::getInstance<font::Font>(M_FONT);\n\tif (!fontmodule)\n\t\tthrow love::Exception(\"Font module has not been loaded.\");\n\n\tStrongRef<font::Rasterizer> r(fontmodule->newTrueTypeRasterizer(size, settings), Acquire::NORETAIN);\n\treturn newFont(r.get());\n}\n\nVideo *Graphics::newVideo(love::video::VideoStream *stream, float dpiscale)\n{\n\treturn new Video(this, stream, dpiscale);\n}\n\nlove::graphics::SpriteBatch *Graphics::newSpriteBatch(Texture *texture, int size, BufferDataUsage usage)\n{\n\treturn new SpriteBatch(this, texture, size, usage);\n}\n\nlove::graphics::ParticleSystem *Graphics::newParticleSystem(Texture *texture, int size)\n{\n\treturn new ParticleSystem(texture, size);\n}\n\nShaderStage *Graphics::newShaderStage(ShaderStageType stage, const std::string &source, const Shader::CompileOptions &options, const Shader::SourceInfo &info, bool cache)\n{\n\tShaderStage *s = nullptr;\n\tstd::string cachekey;\n\n\t// Never cache if there are custom defines set... because hashing would get\n\t// more complicated/expensive, and there shouldn't be a lot of duplicate\n\t// shader stages with custom defines anyway.\n\tif (!options.defines.empty())\n\t\tcache = false;\n\n\tif (cache && !source.empty())\n\t{\n\t\tdata::HashFunction::Value hashvalue;\n\t\tdata::hash(data::HashFunction::FUNCTION_SHA1, source.c_str(), source.size(), hashvalue);\n\n\t\tcachekey = std::string(hashvalue.data, hashvalue.size);\n\n\t\tauto it = cachedShaderStages[stage].find(cachekey);\n\t\tif (it != cachedShaderStages[stage].end())\n\t\t{\n\t\t\ts = it->second;\n\t\t\ts->retain();\n\t\t}\n\t}\n\n\tif (s == nullptr)\n\t{\n\t\tbool glsles = usesGLSLES();\n\t\tstd::string glsl = Shader::createShaderStageCode(this, stage, source, options, info, glsles, true);\n\t\ts = newShaderStageInternal(stage, cachekey, glsl, glsles);\n\t\tif (cache && !cachekey.empty())\n\t\t\tcachedShaderStages[stage][cachekey] = s;\n\t}\n\n\treturn s;\n}\n\nShader *Graphics::newShader(const std::vector<std::string> &stagessource, const Shader::CompileOptions &options)\n{\n\tStrongRef<ShaderStage> stages[SHADERSTAGE_MAX_ENUM] = {};\n\n\tbool validstages[SHADERSTAGE_MAX_ENUM] = {};\n\tvalidstages[SHADERSTAGE_VERTEX] = true;\n\tvalidstages[SHADERSTAGE_PIXEL] = true;\n\n\tfor (const std::string &source : stagessource)\n\t{\n\t\tShader::SourceInfo info = Shader::getSourceInfo(source);\n\t\tbool isanystage = false;\n\n\t\tfor (int i = 0; i < SHADERSTAGE_MAX_ENUM; i++)\n\t\t{\n\t\t\tif (!validstages[i])\n\t\t\t\tcontinue;\n\n\t\t\tif (info.stages[i] != Shader::ENTRYPOINT_NONE)\n\t\t\t{\n\t\t\t\tisanystage = true;\n\t\t\t\tstages[i].set(newShaderStage((ShaderStageType) i, source, options, info, true), Acquire::NORETAIN);\n\t\t\t}\n\t\t}\n\n\t\tif (!isanystage)\n\t\t\tthrow love::Exception(\"Could not parse shader code (missing shader entry point function such as 'position' or 'effect')\");\n\t}\n\n\tfor (int i = 0; i < SHADERSTAGE_MAX_ENUM; i++)\n\t{\n\t\tauto stype = (ShaderStageType) i;\n\t\tif (validstages[i] && stages[i].get() == nullptr)\n\t\t{\n\t\t\tconst std::string &source = Shader::getDefaultCode(Shader::STANDARD_DEFAULT, stype);\n\t\t\tShader::SourceInfo info = Shader::getSourceInfo(source);\n\t\t\tShader::CompileOptions opts;\n\t\t\tstages[i].set(newShaderStage(stype, source, opts, info, true), Acquire::NORETAIN);\n\t\t}\n\n\t}\n\n\treturn newShaderInternal(stages, options);\n}\n\nShader *Graphics::newComputeShader(const std::string &source, const Shader::CompileOptions &options)\n{\n\tShader::SourceInfo info = Shader::getSourceInfo(source);\n\n\tif (info.stages[SHADERSTAGE_COMPUTE] == Shader::ENTRYPOINT_NONE)\n\t\tthrow love::Exception(\"Could not parse compute shader code (missing 'computemain' function?)\");\n\n\tStrongRef<ShaderStage> stages[SHADERSTAGE_MAX_ENUM];\n\n\t// Don't bother caching compute shader intermediate source, since there\n\t// shouldn't be much reuse.\n\tstages[SHADERSTAGE_COMPUTE].set(newShaderStage(SHADERSTAGE_COMPUTE, source, options, info, false));\n\n\treturn newShaderInternal(stages, options);\n}\n\nBuffer *Graphics::newBuffer(const Buffer::Settings &settings, DataFormat format, const void *data, size_t size, size_t arraylength)\n{\n\tstd::vector<Buffer::DataDeclaration> dataformat = {{\"\", format, 0}};\n\treturn newBuffer(settings, dataformat, data, size, arraylength);\n}\n\nMesh *Graphics::newMesh(const std::vector<Buffer::DataDeclaration> &vertexformat, int vertexcount, PrimitiveType drawmode, BufferDataUsage usage)\n{\n\treturn new Mesh(this, vertexformat, vertexcount, drawmode, usage);\n}\n\nMesh *Graphics::newMesh(const std::vector<Buffer::DataDeclaration> &vertexformat, const void *data, size_t datasize, PrimitiveType drawmode, BufferDataUsage usage)\n{\n\treturn new Mesh(this, vertexformat, data, datasize, drawmode, usage);\n}\n\nMesh *Graphics::newMesh(const std::vector<Mesh::BufferAttribute> &attributes, PrimitiveType drawmode)\n{\n\treturn new Mesh(attributes, drawmode);\n}\n\nlove::graphics::TextBatch *Graphics::newTextBatch(graphics::Font *font, const std::vector<love::font::ColoredString> &text)\n{\n\treturn new TextBatch(font, text);\n}\n\nlove::data::ByteData *Graphics::readbackBuffer(Buffer *buffer, size_t offset, size_t size, data::ByteData *dest, size_t destoffset)\n{\n\tStrongRef<GraphicsReadback> readback;\n\treadback.set(newReadbackInternal(READBACK_IMMEDIATE, buffer, offset, size, dest, destoffset), Acquire::NORETAIN);\n\n\tauto data = readback->getBufferData();\n\tif (data == nullptr)\n\t\tthrow love::Exception(\"love.graphics.readbackBuffer failed.\");\n\n\tdata->retain();\n\treturn data;\n}\n\nGraphicsReadback *Graphics::readbackBufferAsync(Buffer *buffer, size_t offset, size_t size, data::ByteData *dest, size_t destoffset)\n{\n\tauto readback = newReadbackInternal(READBACK_ASYNC, buffer, offset, size, dest, destoffset);\n\tpendingReadbacks.push_back(readback);\n\treturn readback;\n}\n\nimage::ImageData *Graphics::readbackTexture(Texture *texture, int slice, int mipmap, const Rect &rect, image::ImageData *dest, int destx, int desty)\n{\n\tStrongRef<GraphicsReadback> readback;\n\treadback.set(newReadbackInternal(READBACK_IMMEDIATE, texture, slice, mipmap, rect, dest, destx, desty), Acquire::NORETAIN);\n\n\tauto imagedata = readback->getImageData();\n\tif (imagedata == nullptr)\n\t\tthrow love::Exception(\"love.graphics.readbackTexture failed.\");\n\n\timagedata->retain();\n\treturn imagedata;\n}\n\nGraphicsReadback *Graphics::readbackTextureAsync(Texture *texture, int slice, int mipmap, const Rect &rect, image::ImageData *dest, int destx, int desty)\n{\n\tauto readback = newReadbackInternal(READBACK_ASYNC, texture, slice, mipmap, rect, dest, destx, desty);\n\tpendingReadbacks.push_back(readback);\n\treturn readback;\n}\n\nvoid Graphics::cleanupCachedShaderStage(ShaderStageType type, const std::string &hashkey)\n{\n\tcachedShaderStages[type].erase(hashkey);\n}\n\nbool Graphics::validateShader(bool gles, const std::vector<std::string> &stagessource, const Shader::CompileOptions &options, std::string &err)\n{\n\tStrongRef<ShaderStage> stages[SHADERSTAGE_MAX_ENUM] = {};\n\n\tbool validstages[SHADERSTAGE_MAX_ENUM] = {};\n\tvalidstages[SHADERSTAGE_VERTEX] = true;\n\tvalidstages[SHADERSTAGE_PIXEL] = true;\n\tvalidstages[SHADERSTAGE_COMPUTE] = true;\n\n\t// Don't use cached shader stages, since the gles flag may not match the\n\t// current renderer.\n\tfor (const std::string &source : stagessource)\n\t{\n\t\tShader::SourceInfo info = Shader::getSourceInfo(source);\n\t\tbool isanystage = false;\n\n\t\tfor (int i = 0; i < SHADERSTAGE_MAX_ENUM; i++)\n\t\t{\n\t\t\tauto stype = (ShaderStageType) i;\n\n\t\t\tif (!validstages[i])\n\t\t\t\tcontinue;\n\n\t\t\tif (info.stages[i] != Shader::ENTRYPOINT_NONE)\n\t\t\t{\n\t\t\t\tisanystage = true;\n\t\t\t\tstd::string glsl = Shader::createShaderStageCode(this, stype, source, options, info, gles, false);\n\t\t\t\tstages[i].set(new ShaderStageForValidation(this, stype, glsl, gles), Acquire::NORETAIN);\n\t\t\t}\n\t\t}\n\n\t\tif (!isanystage)\n\t\t{\n\t\t\terr = \"Could not parse shader code (missing 'position' or 'effect' function?)\";\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn Shader::validate(stages, err);\n}\n\nTexture *Graphics::getDefaultTexture(TextureType type, DataBaseType dataType, bool depthSample)\n{\n\tuint32 depthsampleindex = depthSample ? 1 : 0;\n\tTexture *tex = defaultTextures[type][dataType][depthsampleindex];\n\tif (tex != nullptr)\n\t\treturn tex;\n\n\tTexture::Settings settings;\n\tsettings.type = type;\n\tsettings.readable.set(true);\n\n\tswitch (dataType)\n\t{\n\tcase DATA_BASETYPE_INT:\n\t\tsettings.format = PIXELFORMAT_RGBA8_INT;\n\t\tbreak;\n\tcase DATA_BASETYPE_UINT:\n\t\tsettings.format = PIXELFORMAT_RGBA8_UINT;\n\t\tbreak;\n\tcase DATA_BASETYPE_FLOAT:\n\tdefault:\n\t\tsettings.format = PIXELFORMAT_RGBA8_UNORM;\n\t\tbreak;\n\t}\n\n\tif (depthSample)\n\t{\n\t\tsettings.renderTarget = true;\n\n\t\tif (isPixelFormatSupported(PIXELFORMAT_DEPTH16_UNORM, PIXELFORMATUSAGE_SAMPLE))\n\t\t\tsettings.format = PIXELFORMAT_DEPTH16_UNORM;\n\t\telse if (isPixelFormatSupported(PIXELFORMAT_DEPTH24_UNORM, PIXELFORMATUSAGE_SAMPLE))\n\t\t\tsettings.format = PIXELFORMAT_DEPTH24_UNORM;\n\t\telse if (isPixelFormatSupported(PIXELFORMAT_DEPTH32_FLOAT, PIXELFORMATUSAGE_SAMPLE))\n\t\t\tsettings.format = PIXELFORMAT_DEPTH32_FLOAT;\n\t\telse // TODO?\n\t\t\tsettings.format = PIXELFORMAT_DEPTH24_UNORM;\n\t}\n\n\tstd::string name = \"default_\";\n\n\tconst char *tname = \"unknown\";\n\tTexture::getConstant(type, tname);\n\tname += tname;\n\n\tconst char *formatname = \"unknown\";\n\tlove::getConstant(settings.format, formatname);\n\tname += std::string(\"_\") + formatname;\n\n\tsettings.debugName = name;\n\n\ttex = newTexture(settings);\n\n\tSamplerState s;\n\ts.minFilter = s.magFilter = SamplerState::FILTER_NEAREST;\n\ts.wrapU = s.wrapV = s.wrapW = SamplerState::WRAP_CLAMP;\n\n\tif (depthSample)\n\t\ts.depthSampleMode.set(COMPARE_ALWAYS);\n\n\ttex->setSamplerState(s);\n\n\tif (!depthSample)\n\t{\n\t\tuint8 pixel[] = {255, 255, 255, 255};\n\t\tif (isPixelFormatInteger(settings.format))\n\t\t\tpixel[0] = pixel[1] = pixel[2] = pixel[3] = 1;\n\n\t\tfor (int slice = 0; slice < (type == TEXTURE_CUBE ? 6 : 1); slice++)\n\t\t\ttex->replacePixels(pixel, sizeof(pixel), slice, 0, {0, 0, 1, 1}, false);\n\t}\n\n\tdefaultTextures[type][dataType][depthsampleindex] = tex;\n\n\treturn tex;\n}\n\nBuffer *Graphics::getDefaultTexelBuffer(DataBaseType dataType)\n{\n\tBuffer *buffer = defaultTexelBuffers[dataType];\n\tif (buffer != nullptr)\n\t\treturn buffer;\n\n\tBuffer::Settings settings(BUFFERUSAGEFLAG_TEXEL, BUFFERDATAUSAGE_STATIC);\n\tsettings.zeroInitialize = true;\n\tsettings.debugName = \"default_texelbuffer_\";\n\n\tDataFormat format = DATAFORMAT_FLOAT;\n\tswitch (dataType)\n\t{\n\tcase DATA_BASETYPE_FLOAT:\n\tdefault:\n\t\tformat = DATAFORMAT_FLOAT;\n\t\tsettings.debugName += \"float\";\n\t\tbreak;\n\tcase DATA_BASETYPE_INT:\n\t\tformat = DATAFORMAT_INT32;\n\t\tsettings.debugName += \"int\";\n\t\tbreak;\n\tcase DATA_BASETYPE_UINT:\n\t\tformat = DATAFORMAT_UINT32;\n\t\tsettings.debugName += \"uint\";\n\t\tbreak;\n\t}\n\n\tbuffer = newBuffer(settings, format, nullptr, sizeof(float), 1);\n\n\tdefaultTexelBuffers[dataType] = buffer;\n\n\treturn buffer;\n}\n\nBuffer *Graphics::getDefaultStorageBuffer()\n{\n\tif (defaultStorageBuffer != nullptr)\n\t\treturn defaultStorageBuffer;\n\n\tBuffer::Settings settings(BUFFERUSAGEFLAG_SHADER_STORAGE, BUFFERDATAUSAGE_STATIC);\n\tsettings.zeroInitialize = true;\n\tsettings.debugName = \"default_storagebuffer\";\n\n\tdefaultStorageBuffer = newBuffer(settings, DATAFORMAT_FLOAT, nullptr, Buffer::SHADER_STORAGE_BUFFER_MAX_STRIDE, 0);\n\n\treturn defaultStorageBuffer;\n}\n\nvoid Graphics::releaseDefaultResources()\n{\n\tfor (int type = 0; type < TEXTURE_MAX_ENUM; type++)\n\t{\n\t\tfor (int dataType = 0; dataType < DATA_BASETYPE_MAX_ENUM; dataType++)\n\t\t{\n\t\t\tfor (int depthsample = 0; depthsample < 2; depthsample++)\n\t\t\t{\n\t\t\t\tif (defaultTextures[type][dataType][depthsample])\n\t\t\t\t\tdefaultTextures[type][dataType][depthsample]->release();\n\t\t\t\tdefaultTextures[type][dataType][depthsample] = nullptr;\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (int dataType = 0; dataType < DATA_BASETYPE_MAX_ENUM; dataType++)\n\t{\n\t\tif (defaultTexelBuffers[dataType])\n\t\t\tdefaultTexelBuffers[dataType]->release();\n\t\tdefaultTexelBuffers[dataType] = nullptr;\n\t}\n\n\tif (defaultStorageBuffer)\n\t\tdefaultStorageBuffer->release();\n\tdefaultStorageBuffer = nullptr;\n}\n\nTexture *Graphics::getTextureOrDefaultForActiveShader(Texture *tex)\n{\n\tif (tex != nullptr)\n\t\treturn tex;\n\n\tShader *shader = Shader::current;\n\n\tif (shader != nullptr)\n\t{\n\t\tauto texinfo = shader->getMainTextureInfo();\n\t\tif (texinfo != nullptr && texinfo->textureType != TEXTURE_MAX_ENUM)\n\t\t\treturn getDefaultTexture(texinfo->textureType, texinfo->dataBaseType, texinfo->isDepthSampler);\n\t}\n\n\treturn getDefaultTexture(TEXTURE_2D, DATA_BASETYPE_FLOAT, false);\n}\n\nvoid Graphics::validateStencilState(const StencilState &s) const\n{\n\tif (s.action != STENCIL_KEEP)\n\t{\n\t\tconst auto &rts = states.back().renderTargets;\n\t\tlove::graphics::Texture *dstexture = rts.depthStencil.texture.get();\n\n\t\tif (!isRenderTargetActive() && !backbufferHasStencil)\n\t\t\tthrow love::Exception(\"The window must have stenciling enabled to draw to the main screen's stencil buffer.\");\n\t\telse if (isRenderTargetActive() && (rts.temporaryRTFlags & TEMPORARY_RT_STENCIL) == 0 && (dstexture == nullptr || !isPixelFormatStencil(dstexture->getPixelFormat())))\n\t\t\tthrow love::Exception(\"Drawing to the stencil buffer with a Canvas active requires either stencil=true or a custom stencil-type Canvas to be used, in setCanvas.\");\n\t}\n}\n\nvoid Graphics::validateDepthState(bool depthwrite) const\n{\n\tif (depthwrite)\n\t{\n\t\tconst auto &rts = states.back().renderTargets;\n\t\tlove::graphics::Texture *dstexture = rts.depthStencil.texture.get();\n\n\t\tif (!isRenderTargetActive() && !backbufferHasDepth)\n\t\t\tthrow love::Exception(\"The window must have depth enabled to draw to the main screen's depth buffer.\");\n\t\telse if (isRenderTargetActive() && (rts.temporaryRTFlags & TEMPORARY_RT_DEPTH) == 0 && (dstexture == nullptr || !isPixelFormatDepth(dstexture->getPixelFormat())))\n\t\t\tthrow love::Exception(\"Drawing to the depth buffer with a Canvas active requires either depth=true or a custom depth-type Canvas to be used, in setCanvas.\");\n\t}\n}\n\nint Graphics::getWidth() const\n{\n\treturn width;\n}\n\nint Graphics::getHeight() const\n{\n\treturn height;\n}\n\nint Graphics::getPixelWidth() const\n{\n\treturn pixelWidth;\n}\n\nint Graphics::getPixelHeight() const\n{\n\treturn pixelHeight;\n}\n\ndouble Graphics::getCurrentDPIScale() const\n{\n\tconst auto &rt = states.back().renderTargets.getFirstTarget();\n\tif (rt.texture.get())\n\t\treturn rt.texture->getDPIScale();\n\n\treturn getScreenDPIScale();\n}\n\ndouble Graphics::getScreenDPIScale() const\n{\n\treturn (double) getPixelHeight() / (double) getHeight();\n}\n\nbool Graphics::isCreated() const\n{\n\treturn created;\n}\n\nbool Graphics::isActive() const\n{\n\t// The graphics module is only completely 'active' if there's a window, a\n\t// context, and the active variable is set.\n\tauto window = getInstance<love::window::Window>(M_WINDOW);\n\treturn active && isCreated() && window != nullptr && window->isOpen();\n}\n\nvoid Graphics::reset()\n{\n\tDisplayState s;\n\trestoreState(s);\n\torigin();\n}\n\nvoid Graphics::backbufferChanged(int width, int height, int pixelwidth, int pixelheight)\n{\n\tbackbufferChanged(width, height, pixelwidth, pixelheight, backbufferHasStencil, backbufferHasDepth, getRequestedBackbufferMSAA());\n}\n\n/**\n * State functions.\n **/\n\nvoid Graphics::restoreState(const DisplayState &s)\n{\n\tsetColor(s.color);\n\tsetBackgroundColor(s.backgroundColor);\n\n\tsetBlendState(s.blend);\n\n\tsetLineWidth(s.lineWidth);\n\tsetLineStyle(s.lineStyle);\n\tsetLineJoin(s.lineJoin);\n\n\tsetPointSize(s.pointSize);\n\n\tif (s.scissor)\n\t\tsetScissor(s.scissorRect);\n\telse\n\t\tsetScissor();\n\n\tsetMeshCullMode(s.meshCullMode);\n\tsetFrontFaceWinding(s.winding);\n\n\tsetFont(s.font.get());\n\tsetShader(s.shader.get());\n\tsetRenderTargets(s.renderTargets);\n\n\tsetStencilState(s.stencil);\n\tsetDepthMode(s.depthTest, s.depthWrite);\n\n\tsetColorMask(s.colorMask);\n\tsetWireframe(s.wireframe);\n\n\tsetDefaultSamplerState(s.defaultSamplerState);\n\n\tif (s.useCustomProjection)\n\t\tupdateDeviceProjection(s.customProjection);\n\telse\n\t\tresetProjection();\n}\n\nvoid Graphics::restoreStateChecked(const DisplayState &s)\n{\n\tconst DisplayState &cur = states.back();\n\n\tif (s.color != cur.color)\n\t\tsetColor(s.color);\n\n\tsetBackgroundColor(s.backgroundColor);\n\n\tif (!(s.blend == cur.blend))\n\t\tsetBlendState(s.blend);\n\n\t// These are just simple assignments.\n\tsetLineWidth(s.lineWidth);\n\tsetLineStyle(s.lineStyle);\n\tsetLineJoin(s.lineJoin);\n\n\tif (s.pointSize != cur.pointSize)\n\t\tsetPointSize(s.pointSize);\n\n\tif (s.scissor != cur.scissor || (s.scissor && !(s.scissorRect == cur.scissorRect)))\n\t{\n\t\tif (s.scissor)\n\t\t\tsetScissor(s.scissorRect);\n\t\telse\n\t\t\tsetScissor();\n\t}\n\n\tsetMeshCullMode(s.meshCullMode);\n\n\tif (s.winding != cur.winding)\n\t\tsetFrontFaceWinding(s.winding);\n\n\tsetFont(s.font.get());\n\tsetShader(s.shader.get());\n\n\tconst auto &sRTs = s.renderTargets;\n\tconst auto &curRTs = cur.renderTargets;\n\n\tbool rtschanged = sRTs.colors.size() != curRTs.colors.size();\n\tif (!rtschanged)\n\t{\n\t\tfor (size_t i = 0; i < sRTs.colors.size() && i < curRTs.colors.size(); i++)\n\t\t{\n\t\t\tif (sRTs.colors[i] != curRTs.colors[i])\n\t\t\t{\n\t\t\t\trtschanged = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!rtschanged && sRTs.depthStencil != curRTs.depthStencil)\n\t\t\trtschanged = true;\n\n\t\tif (sRTs.temporaryRTFlags != curRTs.temporaryRTFlags)\n\t\t\trtschanged = true;\n\t}\n\n\tif (rtschanged)\n\t\tsetRenderTargets(s.renderTargets);\n\n\tif (!(s.stencil == cur.stencil))\n\t\tsetStencilState(s.stencil);\n\n\tif (s.depthTest != cur.depthTest || s.depthWrite != cur.depthWrite)\n\t\tsetDepthMode(s.depthTest, s.depthWrite);\n\n\tif (s.colorMask != cur.colorMask)\n\t\tsetColorMask(s.colorMask);\n\n\tif (s.wireframe != cur.wireframe)\n\t\tsetWireframe(s.wireframe);\n\n\tsetDefaultSamplerState(s.defaultSamplerState);\n\n\tif (s.useCustomProjection)\n\t\tsetProjection(s.customProjection);\n\telse if (cur.useCustomProjection)\n\t\tresetProjection();\n}\n\nColorf Graphics::getColor() const\n{\n\treturn states.back().color;\n}\n\nvoid Graphics::setBackgroundColor(Colorf c)\n{\n\tstates.back().backgroundColor = c;\n}\n\nColorf Graphics::getBackgroundColor() const\n{\n\treturn states.back().backgroundColor;\n}\n\nvoid Graphics::checkSetDefaultFont()\n{\n\t// We don't create or set the default Font if an existing font is in use.\n\tif (states.back().font.get() != nullptr)\n\t\treturn;\n\n\t// Create a new default font if we don't have one yet.\n\tif (!defaultFont.get())\n\t{\n\t\tfont::TrueTypeRasterizer::Settings settings;\n\t\tdefaultFont.set(newDefaultFont(13, settings), Acquire::NORETAIN);\n\t}\n\n\tstates.back().font.set(defaultFont.get());\n}\n\nvoid Graphics::setFont(love::graphics::Font *font)\n{\n\t// We don't need to set a default font here if null is passed in, since we\n\t// only care about the default font in getFont and print.\n\tDisplayState &state = states.back();\n\tstate.font.set(font);\n}\n\nlove::graphics::Font *Graphics::getFont()\n{\n\tcheckSetDefaultFont();\n\treturn states.back().font.get();\n}\n\nvoid Graphics::setShader(love::graphics::Shader *shader)\n{\n\tif (shader == nullptr)\n\t\treturn setShader();\n\n\tshader->attach();\n\tstates.back().shader.set(shader);\n}\n\nvoid Graphics::setShader()\n{\n\tShader::attachDefault(Shader::STANDARD_DEFAULT);\n\tstates.back().shader.set(nullptr);\n}\n\nlove::graphics::Shader *Graphics::getShader() const\n{\n\treturn states.back().shader.get();\n}\n\nvoid Graphics::setRenderTarget(RenderTarget rt, uint32 temporaryRTFlags)\n{\n\tif (rt.texture == nullptr)\n\t\treturn setRenderTarget();\n\n\tRenderTargets rts;\n\trts.colors.push_back(rt);\n\trts.temporaryRTFlags = temporaryRTFlags;\n\n\tsetRenderTargets(rts);\n}\n\nvoid Graphics::setRenderTargets(const RenderTargetsStrongRef &rts)\n{\n\tRenderTargets targets;\n\ttargets.colors.reserve(rts.colors.size());\n\n\tfor (const auto &rt : rts.colors)\n\t\ttargets.colors.emplace_back(rt.texture.get(), rt.slice, rt.mipmap);\n\n\ttargets.depthStencil = RenderTarget(rts.depthStencil.texture, rts.depthStencil.slice, rts.depthStencil.mipmap);\n\ttargets.temporaryRTFlags = rts.temporaryRTFlags;\n\n\treturn setRenderTargets(targets);\n}\n\nvoid Graphics::setRenderTargets(const RenderTargets &rts)\n{\n\tDisplayState &state = states.back();\n\tint rtcount = (int) rts.colors.size();\n\n\tRenderTarget firsttarget = rts.getFirstTarget();\n\tTexture *firsttex = firsttarget.texture;\n\n\tif (firsttex == nullptr)\n\t\treturn setRenderTarget();\n\n\tconst auto &prevRTsRef = state.renderTargets;\n\n\tif (rtcount == (int) prevRTsRef.colors.size())\n\t{\n\t\tbool modified = false;\n\n\t\tfor (int i = 0; i < rtcount; i++)\n\t\t{\n\t\t\tif (rts.colors[i] != prevRTsRef.colors[i])\n\t\t\t{\n\t\t\t\tmodified = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!modified && rts.depthStencil != prevRTsRef.depthStencil)\n\t\t\tmodified = true;\n\n\t\tif (rts.temporaryRTFlags != prevRTsRef.temporaryRTFlags)\n\t\t\tmodified = true;\n\n\t\tif (!modified)\n\t\t\treturn;\n\t}\n\n\tconst RenderTargetsStrongRef prevRTs = prevRTsRef;\n\n\tif (rtcount > capabilities.limits[LIMIT_RENDER_TARGETS])\n\t\tthrow love::Exception(\"This system can't simultaneously render to %d textures.\", rtcount);\n\n\tbool hasSRGBtexture = false;\n\tint pixelw = firsttex->getPixelWidth(firsttarget.mipmap);\n\tint pixelh = firsttex->getPixelHeight(firsttarget.mipmap);\n\tint reqmsaa = firsttex->getRequestedMSAA();\n\n\tfor (int i = 0; i < rtcount; i++)\n\t{\n\t\tTexture *c = rts.colors[i].texture;\n\t\tPixelFormat format = c->getPixelFormat();\n\t\tint mip = rts.colors[i].mipmap;\n\t\tint slice = rts.colors[i].slice;\n\n\t\tif (!c->isRenderTarget())\n\t\t\tthrow love::Exception(\"Texture must be created as a canvas to be used in setCanvas.\");\n\n\t\tif (mip < 0 || mip >= c->getMipmapCount())\n\t\t\tthrow love::Exception(\"Invalid mipmap level %d.\", mip + 1);\n\n\t\tif (!c->isValidSlice(slice, mip))\n\t\t\tthrow love::Exception(\"Invalid slice index: %d.\", slice + 1);\n\n\t\tif (c->getPixelWidth(mip) != pixelw || c->getPixelHeight(mip) != pixelh)\n\t\t\tthrow love::Exception(\"All textures must have the same pixel dimensions.\");\n\n\t\tif (c->getRequestedMSAA() != reqmsaa)\n\t\t\tthrow love::Exception(\"All textures must have the same MSAA value.\");\n\n\t\tif (isPixelFormatDepthStencil(format))\n\t\t\tthrow love::Exception(\"Depth/stencil format textures must be used with the 'depthstencil' field of the table passed into setCanvas.\");\n\n\t\tif (isPixelFormatSRGB(format))\n\t\t\thasSRGBtexture = true;\n\t}\n\n\tif (rts.depthStencil.texture != nullptr)\n\t{\n\t\tTexture *c = rts.depthStencil.texture;\n\t\tint mip = rts.depthStencil.mipmap;\n\t\tint slice = rts.depthStencil.slice;\n\n\t\tif (!c->isRenderTarget())\n\t\t\tthrow love::Exception(\"Texture must be created as a canvas to be used in setCanvas.\");\n\n\t\tif (!isPixelFormatDepthStencil(c->getPixelFormat()))\n\t\t\tthrow love::Exception(\"Only depth/stencil format textures can be used with the 'depthstencil' field of the table passed into setCanvas.\");\n\n\t\tif (c->getPixelWidth(mip) != pixelw || c->getPixelHeight(mip) != pixelh)\n\t\t\tthrow love::Exception(\"All Textures must have the same pixel dimensions.\");\n\n\t\tif (c->getRequestedMSAA() != firsttex->getRequestedMSAA())\n\t\t\tthrow love::Exception(\"All Textures must have the same MSAA value.\");\n\n\t\tif (mip < 0 || mip >= c->getMipmapCount())\n\t\t\tthrow love::Exception(\"Invalid mipmap level %d.\", mip + 1);\n\n\t\tif (!c->isValidSlice(slice, mip))\n\t\t\tthrow love::Exception(\"Invalid slice index: %d.\", slice + 1);\n\t}\n\n\tflushBatchedDraws();\n\n\tif (rts.depthStencil.texture == nullptr && rts.temporaryRTFlags != 0)\n\t{\n\t\tbool wantsdepth   = (rts.temporaryRTFlags & TEMPORARY_RT_DEPTH) != 0;\n\t\tbool wantsstencil = (rts.temporaryRTFlags & TEMPORARY_RT_STENCIL) != 0;\n\n\t\tPixelFormat dsformat = PIXELFORMAT_STENCIL8;\n\t\tif (wantsdepth && wantsstencil)\n\t\t{\n\t\t\tif (isPixelFormatSupported(PIXELFORMAT_DEPTH24_UNORM_STENCIL8, PIXELFORMATUSAGEFLAGS_RENDERTARGET))\n\t\t\t\tdsformat = PIXELFORMAT_DEPTH24_UNORM_STENCIL8;\n\t\t\telse if (isPixelFormatSupported(PIXELFORMAT_DEPTH32_FLOAT_STENCIL8, PIXELFORMATUSAGEFLAGS_RENDERTARGET))\n\t\t\t\tdsformat = PIXELFORMAT_DEPTH32_FLOAT_STENCIL8;\n\t\t\telse\n\t\t\t\tthrow love::Exception(\"Combined depth and stencil buffers are not supported on this system.\");\n\t\t}\n\t\telse if (wantsdepth)\n\t\t{\n\t\t\tif (isPixelFormatSupported(PIXELFORMAT_DEPTH24_UNORM, PIXELFORMATUSAGEFLAGS_RENDERTARGET))\n\t\t\t\tdsformat = PIXELFORMAT_DEPTH24_UNORM;\n\t\t\telse if (isPixelFormatSupported(PIXELFORMAT_DEPTH32_FLOAT, PIXELFORMATUSAGEFLAGS_RENDERTARGET))\n\t\t\t\tdsformat = PIXELFORMAT_DEPTH32_FLOAT;\n\t\t\telse if (isPixelFormatSupported(PIXELFORMAT_DEPTH16_UNORM, PIXELFORMATUSAGEFLAGS_RENDERTARGET))\n\t\t\t\tdsformat = PIXELFORMAT_DEPTH16_UNORM;\n\t\t\telse if (isPixelFormatSupported(PIXELFORMAT_DEPTH24_UNORM_STENCIL8, PIXELFORMATUSAGEFLAGS_RENDERTARGET))\n\t\t\t\tdsformat = PIXELFORMAT_DEPTH24_UNORM_STENCIL8;\n\t\t\telse if (isPixelFormatSupported(PIXELFORMAT_DEPTH32_FLOAT_STENCIL8, PIXELFORMATUSAGEFLAGS_RENDERTARGET))\n\t\t\t\tdsformat = PIXELFORMAT_DEPTH32_FLOAT_STENCIL8;\n\t\t\telse\n\t\t\t\tthrow love::Exception(\"Depth buffers are not supported on this system.\");\n\t\t}\n\t\telse if (wantsstencil)\n\t\t{\n\t\t\tif (isPixelFormatSupported(PIXELFORMAT_STENCIL8, PIXELFORMATUSAGEFLAGS_RENDERTARGET))\n\t\t\t\tdsformat = PIXELFORMAT_STENCIL8;\n\t\t\telse if (isPixelFormatSupported(PIXELFORMAT_DEPTH24_UNORM_STENCIL8, PIXELFORMATUSAGEFLAGS_RENDERTARGET))\n\t\t\t\tdsformat = PIXELFORMAT_DEPTH24_UNORM_STENCIL8;\n\t\t\telse if (isPixelFormatSupported(PIXELFORMAT_DEPTH32_FLOAT_STENCIL8, PIXELFORMATUSAGEFLAGS_RENDERTARGET))\n\t\t\t\tdsformat = PIXELFORMAT_DEPTH32_FLOAT_STENCIL8;\n\t\t\telse\n\t\t\t\tthrow love::Exception(\"Stencil buffers are not supported on this system.\");\n\t\t}\n\n\t\t// We want setRenderTargetsInternal to have a pointer to the temporary RT,\n\t\t// but we don't want to directly store it in the main graphics state.\n\t\tRenderTargets realRTs = rts;\n\n\t\trealRTs.depthStencil.texture = getTemporaryTexture(dsformat, pixelw, pixelh, reqmsaa);\n\t\trealRTs.depthStencil.slice = 0;\n\n\t\t// TODO: fix this to call release at the right time.\n\t\t// This only works here because nothing else calls getTemporaryTexture.\n\t\treleaseTemporaryTexture(realRTs.depthStencil.texture);\n\n\t\tsetRenderTargetsInternal(realRTs, pixelw, pixelh, hasSRGBtexture);\n\t}\n\telse\n\t\tsetRenderTargetsInternal(rts, pixelw, pixelh, hasSRGBtexture);\n\n\tRenderTargetsStrongRef refs;\n\trefs.colors.reserve(rts.colors.size());\n\n\tfor (auto c : rts.colors)\n\t\trefs.colors.emplace_back(c.texture, c.slice, c.mipmap);\n\n\trefs.depthStencil = RenderTargetStrongRef(rts.depthStencil.texture, rts.depthStencil.slice);\n\trefs.temporaryRTFlags = rts.temporaryRTFlags;\n\n\tstd::swap(state.renderTargets, refs);\n\n\trenderTargetSwitchCount++;\n\n\tresetProjection();\n\n\t// generateMipmaps can't be used for depth/stencil textures.\n\tfor (const auto &rt : prevRTs.colors)\n\t{\n\t\tif (rt.texture && rt.texture->getMipmapsMode() == Texture::MIPMAPS_AUTO && rt.mipmap == 0)\n\t\t\trt.texture->generateMipmaps();\n\t}\n\n\t// Clear/reset the temporary depth/stencil buffers.\n\t// TODO: make this deferred somehow to avoid double clearing if the user\n\t// also calls love.graphics.clear after setCanvas.\n\tif (rts.depthStencil.texture == nullptr && rts.temporaryRTFlags != 0)\n\t{\n\t\tOptionalColorD clearcolor;\n\t\tOptionalInt clearstencil(0);\n\t\tOptionalDouble cleardepth(1.0);\n\t\tclear(clearcolor, clearstencil, cleardepth);\n\t}\n}\n\nvoid Graphics::setRenderTarget()\n{\n\tDisplayState &state = states.back();\n\n\tif (state.renderTargets.colors.empty() && state.renderTargets.depthStencil.texture == nullptr)\n\t\treturn;\n\n\tconst RenderTargetsStrongRef prevRTs = state.renderTargets;\n\n\tflushBatchedDraws();\n\tsetRenderTargetsInternal(RenderTargets(), pixelWidth, pixelHeight, isGammaCorrect());\n\n\tstate.renderTargets = RenderTargetsStrongRef();\n\trenderTargetSwitchCount++;\n\n\tresetProjection();\n\n\t// generateMipmaps can't be used for depth/stencil textures.\n\tfor (const auto& rt : prevRTs.colors)\n\t{\n\t\tif (rt.texture && rt.texture->getMipmapsMode() == Texture::MIPMAPS_AUTO && rt.mipmap == 0)\n\t\t\trt.texture->generateMipmaps();\n\t}\n}\n\nGraphics::RenderTargets Graphics::getRenderTargets() const\n{\n\tconst auto &curRTs = states.back().renderTargets;\n\n\tRenderTargets rts;\n\trts.colors.reserve(curRTs.colors.size());\n\n\tfor (const auto &rt : curRTs.colors)\n\t\trts.colors.emplace_back(rt.texture.get(), rt.slice, rt.mipmap);\n\n\trts.depthStencil = RenderTarget(curRTs.depthStencil.texture, curRTs.depthStencil.slice, curRTs.depthStencil.mipmap);\n\trts.temporaryRTFlags = curRTs.temporaryRTFlags;\n\n\treturn rts;\n}\n\nbool Graphics::isRenderTargetActive() const\n{\n\tconst auto &rts = states.back().renderTargets;\n\treturn !rts.colors.empty() || rts.depthStencil.texture != nullptr;\n}\n\nbool Graphics::isRenderTargetActive(Texture *texture) const\n{\n\tTexture *roottexture = texture->getRootViewInfo().texture;\n\tconst auto &rts = states.back().renderTargets;\n\n\tfor (const auto &rt : rts.colors)\n\t{\n\t\tif (rt.texture.get() && rt.texture->getRootViewInfo().texture == roottexture)\n\t\t\treturn true;\n\t}\n\n\tif (rts.depthStencil.texture.get() && rts.depthStencil.texture->getRootViewInfo().texture == roottexture)\n\t\treturn true;\n\n\treturn false;\n}\n\nbool Graphics::isRenderTargetActive(Texture *texture, int slice) const\n{\n\tconst auto &rootinfo = texture->getRootViewInfo();\n\tslice += rootinfo.startLayer;\n\n\tconst auto &rts = states.back().renderTargets;\n\n\tfor (const auto &rt : rts.colors)\n\t{\n\t\tif (rt.texture.get())\n\t\t{\n\t\t\tconst auto &info = rt.texture->getRootViewInfo();\n\t\t\tif (rootinfo.texture == info.texture && rt.slice + info.startLayer == slice)\n\t\t\t\treturn true;\n\t\t}\n\t}\n\n\tif (rts.depthStencil.texture.get())\n\t{\n\t\tconst auto &info = rts.depthStencil.texture->getRootViewInfo();\n\t\tif (rootinfo.texture == info.texture && rts.depthStencil.slice + info.startLayer == slice)\n\t\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nTexture *Graphics::getTemporaryTexture(PixelFormat format, int w, int h, int samples)\n{\n\tTexture *texture = nullptr;\n\n\tfor (TemporaryTexture &temp : temporaryTextures)\n\t{\n\t\tif (temp.framesSinceUse < 0)\n\t\t\tcontinue;\n\n\t\tTexture *c = temp.texture;\n\t\tif (c->getPixelFormat() == format && c->getPixelWidth() == w\n\t\t\t&& c->getPixelHeight() == h && c->getRequestedMSAA() == samples)\n\t\t{\n\t\t\ttexture = c;\n\t\t\ttemp.framesSinceUse = -1;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (texture == nullptr)\n\t{\n\t\tTexture::Settings settings;\n\t\tsettings.renderTarget = true;\n\t\tsettings.format = format;\n\t\tsettings.width = w;\n\t\tsettings.height = h;\n\t\tsettings.msaa = samples;\n\n\t\ttexture = newTexture(settings);\n\n\t\ttemporaryTextures.emplace_back(texture);\n\t}\n\n\treturn texture;\n}\n\nvoid Graphics::releaseTemporaryTexture(Texture *texture)\n{\n\tfor (TemporaryTexture &temp : temporaryTextures)\n\t{\n\t\tif (temp.texture == texture)\n\t\t{\n\t\t\ttemp.framesSinceUse = 0;\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nBuffer *Graphics::getTemporaryBuffer(size_t size, DataFormat format, uint32 usageflags, BufferDataUsage datausage)\n{\n\tBuffer *buffer = nullptr;\n\n\tfor (TemporaryBuffer &temp : temporaryBuffers)\n\t{\n\t\tif (temp.framesSinceUse < 0)\n\t\t\tcontinue;\n\n\t\tBuffer *b = temp.buffer;\n\n\t\tif (temp.size == size && b->getDataMember(0).decl.format == format\n\t\t\t&& b->getUsageFlags() == usageflags && b->getDataUsage() == datausage)\n\t\t{\n\t\t\tbuffer = b;\n\t\t\ttemp.framesSinceUse = -1;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (buffer == nullptr)\n\t{\n\t\tBuffer::Settings settings(usageflags, datausage);\n\t\tbuffer = newBuffer(settings, format, nullptr, size, 0);\n\n\t\ttemporaryBuffers.emplace_back(buffer, size);\n\t}\n\n\treturn buffer;\n}\n\nvoid Graphics::releaseTemporaryBuffer(Buffer *buffer)\n{\n\tfor (TemporaryBuffer &temp : temporaryBuffers)\n\t{\n\t\tif (temp.buffer == buffer)\n\t\t{\n\t\t\ttemp.framesSinceUse = 0;\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nvoid Graphics::updateTemporaryResources()\n{\n\tfor (int i = (int) temporaryTextures.size() - 1; i >= 0; i--)\n\t{\n\t\tauto &t = temporaryTextures[i];\n\t\tif (t.framesSinceUse >= MAX_TEMPORARY_RESOURCE_UNUSED_FRAMES)\n\t\t{\n\t\t\tt.texture->release();\n\t\t\tt = temporaryTextures.back();\n\t\t\ttemporaryTextures.pop_back();\n\t\t}\n\t\telse if (t.framesSinceUse >= 0)\n\t\t\tt.framesSinceUse++;\n\t}\n\n\tfor (int i = (int) temporaryBuffers.size() - 1; i >= 0; i--)\n\t{\n\t\tauto &t = temporaryBuffers[i];\n\t\tif (t.framesSinceUse >= MAX_TEMPORARY_RESOURCE_UNUSED_FRAMES)\n\t\t{\n\t\t\tt.buffer->release();\n\t\t\tt = temporaryBuffers.back();\n\t\t\ttemporaryBuffers.pop_back();\n\t\t}\n\t\telse if (t.framesSinceUse >= 0)\n\t\t\tt.framesSinceUse++;\n\t}\n}\n\nvoid Graphics::clearTemporaryResources()\n{\n\tfor (auto temp :temporaryBuffers)\n\t\ttemp.buffer->release();\n\n\tfor (auto temp : temporaryTextures)\n\t\ttemp.texture->release();\n\n\ttemporaryBuffers.clear();\n\ttemporaryTextures.clear();\n}\n\nvoid Graphics::updatePendingReadbacks()\n{\n\tfor (int i = (int)pendingReadbacks.size() - 1; i >= 0; i--)\n\t{\n\t\tpendingReadbacks[i]->update();\n\t\tif (pendingReadbacks[i]->isComplete())\n\t\t{\n\t\t\tpendingReadbacks[i] = pendingReadbacks.back();\n\t\t\tpendingReadbacks.pop_back();\n\t\t}\n\t}\n}\n\nVertexAttributesID Graphics::registerVertexAttributes(const VertexAttributes &attributes)\n{\n\tfor (size_t i = 0; i < vertexAttributesDatabase.size(); i++)\n\t{\n\t\tif (attributes == vertexAttributesDatabase[i])\n\t\t\treturn { (int)i + 1 };\n\t}\n\n\tvertexAttributesDatabase.push_back(attributes);\n\treturn { (int)vertexAttributesDatabase.size() };\n}\n\nbool Graphics::findVertexAttributes(VertexAttributesID id, VertexAttributes &attributes)\n{\n\tint index = id.id - 1;\n\n\tif (index < 0 || index >= (int)vertexAttributesDatabase.size())\n\t\treturn false;\n\n\tattributes = vertexAttributesDatabase[index];\n\treturn true;\n}\n\nvoid Graphics::intersectScissor(const Rect &rect)\n{\n\tRect currect = states.back().scissorRect;\n\n\tif (!states.back().scissor)\n\t{\n\t\tcurrect.x = 0;\n\t\tcurrect.y = 0;\n\t\tcurrect.w = std::numeric_limits<int>::max();\n\t\tcurrect.h = std::numeric_limits<int>::max();\n\t}\n\n\tint x1 = std::max(currect.x, rect.x);\n\tint y1 = std::max(currect.y, rect.y);\n\n\tint x2 = std::min(currect.x + currect.w, rect.x + rect.w);\n\tint y2 = std::min(currect.y + currect.h, rect.y + rect.h);\n\n\tRect newrect = {x1, y1, std::max(0, x2 - x1), std::max(0, y2 - y1)};\n\tsetScissor(newrect);\n}\n\nbool Graphics::getScissor(Rect &rect) const\n{\n\tconst DisplayState &state = states.back();\n\trect = state.scissorRect;\n\treturn state.scissor;\n}\n\nvoid Graphics::setStencilMode(StencilMode mode, int value)\n{\n\tsetStencilState(computeStencilState(mode, value));\n\tif (mode == STENCIL_MODE_DRAW)\n\t\tsetColorMask({ false, false, false, false });\n\telse\n\t\tsetColorMask({ true, true, true, true });\n}\n\nvoid Graphics::setStencilMode()\n{\n\tsetStencilState(computeStencilState(STENCIL_MODE_OFF, 0));\n\tsetColorMask({ true, true, true, true });\n}\n\nStencilMode Graphics::getStencilMode(int &value) const\n{\n\tconst DisplayState& state = states.back();\n\tStencilMode mode = computeStencilMode(state.stencil);\n\tvalue = state.stencil.value;\n\treturn mode;\n}\n\nvoid Graphics::setStencilState()\n{\n\tStencilState s;\n\tsetStencilState(s);\n}\n\nconst StencilState &Graphics::getStencilState() const\n{\n\tconst DisplayState &state = states.back();\n\treturn state.stencil;\n}\n\nvoid Graphics::setDepthMode()\n{\n\tsetDepthMode(COMPARE_ALWAYS, false);\n}\n\nvoid Graphics::getDepthMode(CompareMode &compare, bool &write) const\n{\n\tconst DisplayState &state = states.back();\n\tcompare = state.depthTest;\n\twrite = state.depthWrite;\n}\n\nvoid Graphics::setMeshCullMode(CullMode cull)\n{\n\t// Handled inside the draw() graphics API implementations.\n\tstates.back().meshCullMode = cull;\n}\n\nCullMode Graphics::getMeshCullMode() const\n{\n\treturn states.back().meshCullMode;\n}\n\nWinding Graphics::getFrontFaceWinding() const\n{\n\treturn states.back().winding;\n}\n\nColorChannelMask Graphics::getColorMask() const\n{\n\treturn states.back().colorMask;\n}\n\nvoid Graphics::setBlendMode(BlendMode mode, BlendAlpha alphamode)\n{\n\tif (alphamode == BLENDALPHA_MULTIPLY && !isAlphaMultiplyBlendSupported(mode))\n\t{\n\t\tconst char *modestr = \"unknown\";\n\t\tlove::graphics::getConstant(mode, modestr);\n\t\tthrow love::Exception(\"The '%s' blend mode must be used with premultiplied alpha.\", modestr);\n\t}\n\n\tsetBlendState(computeBlendState(mode, alphamode));\n}\n\nBlendMode Graphics::getBlendMode(BlendAlpha &alphamode) const\n{\n\treturn computeBlendMode(states.back().blend, alphamode);\n}\n\nconst BlendState &Graphics::getBlendState() const\n{\n\treturn states.back().blend;\n}\n\nvoid Graphics::setDefaultSamplerState(const SamplerState &s)\n{\n\tstates.back().defaultSamplerState = s;\n}\n\nconst SamplerState &Graphics::getDefaultSamplerState() const\n{\n\treturn states.back().defaultSamplerState;\n}\n\nvoid Graphics::setLineWidth(float width)\n{\n\tstates.back().lineWidth = width;\n}\n\nvoid Graphics::setLineStyle(Graphics::LineStyle style)\n{\n\tstates.back().lineStyle = style;\n}\n\nvoid Graphics::setLineJoin(Graphics::LineJoin join)\n{\n\tstates.back().lineJoin = join;\n}\n\nfloat Graphics::getLineWidth() const\n{\n\treturn states.back().lineWidth;\n}\n\nGraphics::LineStyle Graphics::getLineStyle() const\n{\n\treturn states.back().lineStyle;\n}\n\nGraphics::LineJoin Graphics::getLineJoin() const\n{\n\treturn states.back().lineJoin;\n}\n\nfloat Graphics::getPointSize() const\n{\n\treturn states.back().pointSize;\n}\n\nbool Graphics::isWireframe() const\n{\n\treturn states.back().wireframe;\n}\n\nvoid Graphics::captureScreenshot(const ScreenshotInfo &info)\n{\n\tpendingScreenshotCallbacks.push_back(info);\n}\n\nvoid Graphics::copyBuffer(Buffer *source, Buffer *dest, size_t sourceoffset, size_t destoffset, size_t size)\n{\n\tRange sourcerange(sourceoffset, size);\n\tRange destrange(destoffset, size);\n\n\tif (dest->getDataUsage() == BUFFERDATAUSAGE_STREAM)\n\t\tthrow love::Exception(\"Buffers created with 'stream' data usage cannot be used as a copy destination.\");\n\n\tif (source->getDataUsage() == BUFFERDATAUSAGE_READBACK)\n\t\tthrow love::Exception(\"Buffers created with 'readback' data usage cannot be used as a copy source.\");\n\n\tif (sourcerange.getMax() >= source->getSize())\n\t\tthrow love::Exception(\"Buffer copy source offset and size doesn't fit within the source Buffer's size.\");\n\n\tif (destrange.getMax() >= dest->getSize())\n\t\tthrow love::Exception(\"Buffer copy destination offset and size doesn't fit within the destination buffer's size.\");\n\n\tif (source == dest && sourcerange.intersects(destrange))\n\t\tthrow love::Exception(\"Copying a portion of a buffer to the same buffer requires non-overlapping source and destination offsets.\");\n\n\tif (dest->isImmutable())\n\t\tthrow love::Exception(\"Cannot copy to an immutable buffer.\");\n\n\tif (sourceoffset % 4 != 0 || destoffset % 4 != 0 || size % 4 != 0)\n\t\tthrow love::Exception(\"Buffer copy source offset, destination offset, and size parameters must be multiples of 4 bytes.\");\n\n\tsource->copyTo(dest, sourceoffset, destoffset, size);\n}\n\nvoid Graphics::copyTextureToBuffer(Texture *source, Buffer *dest, int slice, int mipmap, const Rect &rect, size_t destoffset, int destwidth)\n{\n\tif (!capabilities.features[FEATURE_COPY_TEXTURE_TO_BUFFER])\n\t{\n\t\tif (!source->isRenderTarget())\n\t\t\tthrow love::Exception(\"Copying a non-render target Texture to a Buffer is not supported on this system.\");\n\t}\n\n\tPixelFormat format = source->getPixelFormat();\n\n\tif (isPixelFormatDepthStencil(format))\n\t\tthrow love::Exception(\"Copying a depth/stencil Texture to a Buffer is not supported.\");\n\n\tif (!source->isReadable())\n\t\tthrow love::Exception(\"copyTextureToBuffer can only be called on readable Textures.\");\n\n\tif (dest->getDataUsage() == BUFFERDATAUSAGE_STREAM)\n\t\tthrow love::Exception(\"Buffers created with 'stream' data usage cannot be used as a copy destination.\");\n\n\tif (dest->isImmutable())\n\t\tthrow love::Exception(\"Cannot copy to an immutable buffer.\");\n\n\tif (isRenderTargetActive(source))\n\t\tthrow love::Exception(\"copyTextureToBuffer cannot be called while the Texture is an active render target.\");\n\n\tif (mipmap < 0 || mipmap >= source->getMipmapCount())\n\t\tthrow love::Exception(\"Invalid texture mipmap index %d.\", mipmap + 1);\n\n\tTextureType textype = source->getTextureType();\n\tif (slice < 0 || (textype == TEXTURE_CUBE && slice >= 6)\n\t\t|| (textype == TEXTURE_VOLUME && slice >= source->getDepth(mipmap))\n\t\t|| (textype == TEXTURE_2D_ARRAY && slice >= source->getLayerCount()))\n\t{\n\t\tthrow love::Exception(\"Invalid texture slice index %d.\", slice + 1);\n\t}\n\n\tint mipw = source->getPixelWidth(mipmap);\n\tint miph = source->getPixelHeight(mipmap);\n\n\tif (rect.x < 0 || rect.y < 0 || rect.w <= 0 || rect.h <= 0\n\t\t|| (rect.x + rect.w) > mipw || (rect.y + rect.h) > miph)\n\t{\n\t\tthrow love::Exception(\"Invalid rectangle dimensions (x=%d, y=%d, w=%d, h=%d) for %dx%d texture.\", rect.x, rect.y, rect.w, rect.h, mipw, miph);\n\t}\n\n\tif (destwidth <= 0)\n\t\tdestwidth = rect.w;\n\n\tsize_t size = 0;\n\n\tif (isPixelFormatCompressed(format))\n\t{\n\t\tif (destwidth != rect.w) // OpenGL limitation...\n\t\t\tthrow love::Exception(\"Copying a compressed texture to a buffer cannot use a custom destination width.\");\n\n\t\tconst PixelFormatInfo &info = getPixelFormatInfo(format);\n\t\tint bw = (int) info.blockWidth;\n\t\tint bh = (int) info.blockHeight;\n\t\tif (rect.x % bw != 0 || rect.y % bh != 0 ||\n\t\t\t((rect.w % bw != 0 || rect.h % bh != 0) && rect.x + rect.w != source->getPixelWidth(mipmap)))\n\t\t{\n\t\t\tconst char *name = nullptr;\n\t\t\tlove::getConstant(format, name);\n\t\t\tthrow love::Exception(\"Compressed texture format %s only supports copying a sub-rectangle with offset and dimensions that are a multiple of %d x %d.\", name, bw, bh);\n\t\t}\n\n\t\t// Note: this will need to change if destwidth == rect.w restriction\n\t\t// is removed.\n\t\tsize = getPixelFormatSliceSize(format, destwidth, rect.h);\n\t}\n\telse\n\t{\n\t\t// Not the cleanest, but should work since uncompressed formats always\n\t\t// have 1x1 blocks.\n\t\tint pixels = (rect.h - 1) * destwidth + rect.w;\n\t\tsize = getPixelFormatUncompressedRowSize(format, pixels);\n\t}\n\n\tRange destrange(destoffset, size);\n\n\tif (destoffset % 4 != 0 || size % 4 != 0)\n\t\tthrow love::Exception(\"Buffer copy destination offset and computed byte size must be multiples of 4 bytes.\");\n\n\tif (destrange.getMax() >= dest->getSize())\n\t\tthrow love::Exception(\"Buffer copy destination offset and width/height doesn't fit within the destination Buffer.\");\n\n\tsource->copyToBuffer(dest, slice, mipmap, rect, destoffset, destwidth, size);\n}\n\nvoid Graphics::copyBufferToTexture(Buffer *source, Texture *dest, size_t sourceoffset, int sourcewidth, int slice, int mipmap, const Rect &rect)\n{\n\tif (source->getDataUsage() == BUFFERDATAUSAGE_READBACK)\n\t\tthrow love::Exception(\"Buffers created with 'readback' data usage cannot be used as a copy source.\");\n\n\tPixelFormat format = dest->getPixelFormat();\n\n\tif (isPixelFormatDepthStencil(format))\n\t\tthrow love::Exception(\"Copying a Buffer to a depth/stencil Texture is not supported.\");\n\n\tif (!dest->isReadable())\n\t\tthrow love::Exception(\"copyBufferToTexture can only be called on readable Textures.\");\n\n\tif (isRenderTargetActive(dest))\n\t\tthrow love::Exception(\"copyBufferToTexture cannot be called while the Texture is an active render target.\");\n\n\tif (mipmap < 0 || mipmap >= dest->getMipmapCount())\n\t\tthrow love::Exception(\"Invalid texture mipmap index %d.\", mipmap + 1);\n\n\tTextureType textype = dest->getTextureType();\n\tif (slice < 0 || (textype == TEXTURE_CUBE && slice >= 6)\n\t\t|| (textype == TEXTURE_VOLUME && slice >= dest->getDepth(mipmap))\n\t\t|| (textype == TEXTURE_2D_ARRAY && slice >= dest->getLayerCount()))\n\t{\n\t\tthrow love::Exception(\"Invalid texture slice index %d.\", slice + 1);\n\t}\n\n\tint mipw = dest->getPixelWidth(mipmap);\n\tint miph = dest->getPixelHeight(mipmap);\n\n\tif (rect.x < 0 || rect.y < 0 || rect.w <= 0 || rect.h <= 0\n\t\t|| (rect.x + rect.w) > mipw || (rect.y + rect.h) > miph)\n\t{\n\t\tthrow love::Exception(\"Invalid rectangle dimensions (x=%d, y=%d, w=%d, h=%d) for %dx%d texture.\", rect.x, rect.y, rect.w, rect.h, mipw, miph);\n\t}\n\n\tif (sourcewidth <= 0)\n\t\tsourcewidth = rect.w;\n\n\tsize_t size = 0;\n\n\tif (isPixelFormatCompressed(format))\n\t{\n\t\tif (sourcewidth != rect.w) // OpenGL limitation...\n\t\t\tthrow love::Exception(\"Copying a buffer to a compressed texture cannot use a custom source width.\");\n\n\t\tconst PixelFormatInfo &info = getPixelFormatInfo(format);\n\t\tint bw = (int) info.blockWidth;\n\t\tint bh = (int) info.blockHeight;\n\t\tif (rect.x % bw != 0 || rect.y % bh != 0 ||\n\t\t\t((rect.w % bw != 0 || rect.h % bh != 0) && rect.x + rect.w != dest->getPixelWidth(mipmap)))\n\t\t{\n\t\t\tconst char *name = nullptr;\n\t\t\tlove::getConstant(format, name);\n\t\t\tthrow love::Exception(\"Compressed texture format %s only supports copying a sub-rectangle with offset and dimensions that are a multiple of %d x %d.\", name, bw, bh);\n\t\t}\n\n\t\t// Note: this will need to change if sourcewidth == rect.w restriction\n\t\t// is removed.\n\t\tsize = getPixelFormatSliceSize(format, sourcewidth, rect.h);\n\t}\n\telse\n\t{\n\t\t// Not the cleanest, but should work since uncompressed formats always\n\t\t// have 1x1 blocks.\n\t\tint pixels = (rect.h - 1) * sourcewidth + rect.w;\n\t\tsize = getPixelFormatUncompressedRowSize(format, pixels);\n\t}\n\n\tRange sourcerange(sourceoffset, size);\n\n\tif (sourceoffset % 4 != 0 || size % 4 != 0)\n\t\tthrow love::Exception(\"Buffer copy source offset and computed byte size must be multiples of 4 bytes.\");\n\n\tif (sourcerange.getMax() >= source->getSize())\n\t\tthrow love::Exception(\"Buffer copy source offset and width/height doesn't fit within the source Buffer.\");\n\n\tdest->copyFromBuffer(source, sourceoffset, sourcewidth, size, slice, mipmap, rect);\n}\n\nstatic const char *getIndirectArgsTypeName(Graphics::IndirectArgsType argstype)\n{\n\tswitch (argstype)\n\t{\n\t\tcase Graphics::INDIRECT_ARGS_DISPATCH: return \"Compute shader threadgroup argument data\";\n\t\tcase Graphics::INDIRECT_ARGS_DRAW_VERTICES: return \"Draw vertices argument data\";\n\t\tcase Graphics::INDIRECT_ARGS_DRAW_INDICES: return \"Draw indices argument data\";\n\t}\n\n\treturn \"(Unknown argument data)\";\n}\n\nvoid Graphics::validateIndirectArgsBuffer(IndirectArgsType argstype, Buffer *indirectargs, int argsindex)\n{\n\tif (!capabilities.features[FEATURE_INDIRECT_DRAW])\n\t\tthrow love::Exception(\"Indirect draws and compute dispatches are not supported on this system.\");\n\n\tif ((indirectargs->getUsageFlags() & BUFFERUSAGEFLAG_INDIRECT_ARGUMENTS) == 0)\n\t\tthrow love::Exception(\"The given Buffer must be created with the indirectarguments usage flag set, to be used for indirect arguments.\");\n\n\tif (argsindex < 0)\n\t\tthrow love::Exception(\"The given indirect argument index cannot be negative.\");\n\n\tsize_t argelements = 0;\n\tif (argstype == INDIRECT_ARGS_DISPATCH)\n\t\targelements = 3;\n\telse if (argstype == INDIRECT_ARGS_DRAW_VERTICES)\n\t\targelements = 4;\n\telse if (argstype == INDIRECT_ARGS_DRAW_INDICES)\n\t\targelements = 5;\n\n\tsize_t totalmembers = indirectargs->getArrayLength() * indirectargs->getDataMembers().size();\n\n\tif (totalmembers % argelements != 0)\n\t\tthrow love::Exception(\"%s requires the given indirect argument Buffer to have a multiple of %ld int or uint values.\", getIndirectArgsTypeName(argstype), argelements);\n\n\tsize_t argsoffset = argsindex * indirectargs->getArrayStride();\n\n\tif (indirectargs->getSize() < argsoffset + sizeof(uint32) * argelements)\n\t\tthrow love::Exception(\"The given index into the indirect argument Buffer does not fit within the Buffer's size.\");\n}\n\nvoid Graphics::dispatchThreadgroups(Shader *shader, int x, int y, int z)\n{\n\tif (!shader->hasStage(SHADERSTAGE_COMPUTE))\n\t\tthrow love::Exception(\"Only compute shaders can have threads dispatched.\");\n\n\tif (x <= 0 || y <= 0 || z <= 0)\n\t\tthrow love::Exception(\"Threadgroup dispatch size must be positive.\");\n\n\tif (x > capabilities.limits[LIMIT_THREADGROUPS_X]\n\t\t|| y > capabilities.limits[LIMIT_THREADGROUPS_Y]\n\t\t|| z > capabilities.limits[LIMIT_THREADGROUPS_Z])\n\t{\n\t\tthrow love::Exception(\"Too many threadgroups dispatched.\");\n\t}\n\n\tflushBatchedDraws();\n\n\tauto prevshader = Shader::current;\n\tshader->attach();\n\n\tbool success = dispatch(shader, x, y, z);\n\n\tif (prevshader != nullptr)\n\t\tprevshader->attach();\n\n\tif (!success)\n\t\tthrow love::Exception(\"Compute shader must have resources bound to all writable texture and buffer variables.\");\n}\n\nvoid Graphics::dispatchIndirect(Shader *shader, Buffer *indirectargs, int argsindex)\n{\n\tif (!shader->hasStage(SHADERSTAGE_COMPUTE))\n\t\tthrow love::Exception(\"Only compute shaders can have threads dispatched.\");\n\n\tvalidateIndirectArgsBuffer(INDIRECT_ARGS_DISPATCH, indirectargs, argsindex);\n\n\tflushBatchedDraws();\n\n\tauto prevshader = Shader::current;\n\tshader->attach();\n\n\tbool success = dispatch(shader, indirectargs, argsindex * indirectargs->getArrayStride());\n\n\tif (prevshader != nullptr)\n\t\tprevshader->attach();\n\n\tif (!success)\n\t\tthrow love::Exception(\"Compute shader must have resources bound to all writable texture and buffer variables.\");\n}\n\nGraphics::BatchedVertexData Graphics::requestBatchedDraw(const BatchedDrawCommand &cmd)\n{\n\tBatchedDrawState &state = batchedDrawState;\n\n\tbool shouldflush = false;\n\tbool shouldresize = false;\n\n\tif (cmd.primitiveMode != state.primitiveMode\n\t\t|| cmd.formats[0] != state.formats[0] || cmd.formats[1] != state.formats[1]\n\t\t|| ((cmd.indexMode != TRIANGLEINDEX_NONE) != (state.indexCount > 0))\n\t\t|| cmd.texture != state.texture\n\t\t|| cmd.standardShaderType != state.standardShaderType)\n\t{\n\t\tshouldflush = true;\n\t}\n\n\tint totalvertices = state.vertexCount + cmd.vertexCount;\n\n\t// We only support uint16 index buffers for now.\n\tif (totalvertices > LOVE_UINT16_MAX && cmd.indexMode != TRIANGLEINDEX_NONE)\n\t\tshouldflush = true;\n\n\tint reqIndexCount = getIndexCount(cmd.indexMode, cmd.vertexCount);\n\tsize_t reqIndexSize = reqIndexCount * sizeof(uint16);\n\n\tsize_t newdatasizes[2] = {0, 0};\n\tsize_t buffersizes[3] = {0, 0, 0};\n\n\tfor (int i = 0; i < 2; i++)\n\t{\n\t\tif (cmd.formats[i] == CommonFormat::NONE)\n\t\t\tcontinue;\n\n\t\tsize_t stride = getFormatStride(cmd.formats[i]);\n\t\tsize_t datasize = stride * totalvertices;\n\n\t\tif (state.vbMap[i].data != nullptr && datasize > state.vbMap[i].size)\n\t\t\tshouldflush = true;\n\n\t\tif (datasize > state.vb[i]->getUsableSize())\n\t\t{\n\t\t\tbuffersizes[i] = std::max(datasize, state.vb[i]->getSize() * 2);\n\t\t\tshouldresize = true;\n\t\t}\n\n\t\tnewdatasizes[i] = stride * cmd.vertexCount;\n\t}\n\n\tif (cmd.indexMode != TRIANGLEINDEX_NONE)\n\t{\n\t\tsize_t datasize = (state.indexCount + reqIndexCount) * sizeof(uint16);\n\n\t\tif (state.indexBufferMap.data != nullptr && datasize > state.indexBufferMap.size)\n\t\t\tshouldflush = true;\n\n\t\tif (datasize > state.indexBuffer->getUsableSize())\n\t\t{\n\t\t\tbuffersizes[2] = std::max(datasize, state.indexBuffer->getSize() * 2);\n\t\t\tshouldresize = true;\n\t\t}\n\t}\n\n\tif (shouldflush || shouldresize)\n\t{\n\t\tflushBatchedDraws();\n\n\t\tstate.primitiveMode = cmd.primitiveMode;\n\t\tstate.formats[0] = cmd.formats[0];\n\t\tstate.formats[1] = cmd.formats[1];\n\t\tstate.texture = cmd.texture;\n\t\tstate.standardShaderType = cmd.standardShaderType;\n\t}\n\n\tif (state.vertexCount == 0)\n\t{\n\t\tif (Shader::isDefaultActive())\n\t\t\tShader::attachDefault(state.standardShaderType);\n\n\t\tif (Shader::current != nullptr)\n\t\t\tShader::current->validateDrawState(cmd.primitiveMode, cmd.texture);\n\t}\n\n\tif (shouldresize)\n\t{\n\t\tfor (int i = 0; i < 2; i++)\n\t\t{\n\t\t\tif (state.vb[i]->getSize() < buffersizes[i])\n\t\t\t{\n\t\t\t\tstate.vb[i]->release();\n\t\t\t\tstate.vb[i] = newStreamBuffer(BUFFERUSAGE_VERTEX, buffersizes[i]);\n\t\t\t}\n\t\t}\n\n\t\tif (state.indexBuffer->getSize() < buffersizes[2])\n\t\t{\n\t\t\tstate.indexBuffer->release();\n\t\t\tstate.indexBuffer = newStreamBuffer(BUFFERUSAGE_INDEX, buffersizes[2]);\n\t\t}\n\t}\n\n\tif (cmd.indexMode != TRIANGLEINDEX_NONE)\n\t{\n\t\tif (state.indexBufferMap.data == nullptr)\n\t\t\tstate.indexBufferMap = state.indexBuffer->map(reqIndexSize);\n\n\t\tuint16 *indices = (uint16 *) state.indexBufferMap.data;\n\t\tfillIndices(cmd.indexMode, state.vertexCount, cmd.vertexCount, indices);\n\n\t\tstate.indexBufferMap.data += reqIndexSize;\n\t}\n\n\tBatchedVertexData d;\n\n\tfor (int i = 0; i < 2; i++)\n\t{\n\t\tif (newdatasizes[i] > 0)\n\t\t{\n\t\t\tif (state.vbMap[i].data == nullptr)\n\t\t\t\tstate.vbMap[i] = state.vb[i]->map(newdatasizes[i]);\n\n\t\t\td.stream[i] = state.vbMap[i].data;\n\n\t\t\tstate.vbMap[i].data += newdatasizes[i];\n\t\t}\n\t}\n\n\tif (state.vertexCount > 0)\n\t\tdrawCallsBatched++;\n\n\tstate.vertexCount += cmd.vertexCount;\n\tstate.indexCount  += reqIndexCount;\n\n\treturn d;\n}\n\nvoid Graphics::flushBatchedDraws()\n{\n\tauto &sbstate = batchedDrawState;\n\n\tif ((sbstate.vertexCount == 0 && sbstate.indexCount == 0) || sbstate.flushing)\n\t\treturn;\n\n\tVertexAttributes attributes;\n\tBufferBindings buffers;\n\n\tVertexAttributesID attributesID = sbstate.attributesIDs[(int)sbstate.formats[0]][(int)sbstate.formats[1]];\n\n\tif (!findVertexAttributes(attributesID, attributes))\n\t{\n\t\tfor (int i = 0; i < 2; i++)\n\t\t\tattributes.setCommonFormat(sbstate.formats[i], (uint8)i);\n\t\t\n\t\tattributesID = registerVertexAttributes(attributes);\n\t\tsbstate.attributesIDs[(int)sbstate.formats[0]][(int)sbstate.formats[1]] = attributesID;\n\t}\n\n\tsize_t usedsizes[3] = {0, 0, 0};\n\n\tfor (int i = 0; i < 2; i++)\n\t{\n\t\tif (sbstate.formats[i] == CommonFormat::NONE)\n\t\t\tcontinue;\n\n\t\tusedsizes[i] = getFormatStride(sbstate.formats[i]) * sbstate.vertexCount;\n\n\t\tsize_t offset = sbstate.vb[i]->unmap(usedsizes[i]);\n\t\tbuffers.set(i, sbstate.vb[i], offset);\n\t\tsbstate.vbMap[i] = StreamBuffer::MapInfo();\n\t}\n\n\tif (attributes.enableBits == 0)\n\t\treturn;\n\n\tsbstate.flushing = true;\n\n\tColorf nc = getColor();\n\tif (attributes.isEnabled(ATTRIB_COLOR))\n\t\tsetColor(Colorf(1.0f, 1.0f, 1.0f, 1.0f));\n\n\tpushIdentityTransform();\n\n\tif (sbstate.indexCount > 0)\n\t{\n\t\tusedsizes[2] = sizeof(uint16) * sbstate.indexCount;\n\n\t\tDrawIndexedCommand cmd(attributesID, &buffers, sbstate.indexBuffer);\n\t\tcmd.primitiveType = sbstate.primitiveMode;\n\t\tcmd.indexCount = sbstate.indexCount;\n\t\tcmd.indexType = INDEX_UINT16;\n\t\tcmd.indexBufferOffset = sbstate.indexBuffer->unmap(usedsizes[2]);\n\t\tcmd.texture = getTextureOrDefaultForActiveShader(sbstate.texture);\n\t\tdraw(cmd);\n\n\t\tsbstate.indexBufferMap = StreamBuffer::MapInfo();\n\t}\n\telse\n\t{\n\t\tDrawCommand cmd(attributesID, &buffers);\n\t\tcmd.primitiveType = sbstate.primitiveMode;\n\t\tcmd.vertexStart = 0;\n\t\tcmd.vertexCount = sbstate.vertexCount;\n\t\tcmd.texture = getTextureOrDefaultForActiveShader(sbstate.texture);\n\t\tdraw(cmd);\n\t}\n\n\tfor (int i = 0; i < 2; i++)\n\t{\n\t\tif (usedsizes[i] > 0)\n\t\t\tsbstate.vb[i]->markUsed(usedsizes[i]);\n\t}\n\n\tif (usedsizes[2] > 0)\n\t\tsbstate.indexBuffer->markUsed(usedsizes[2]);\n\n\tpopTransform();\n\n\tif (attributes.isEnabled(ATTRIB_COLOR))\n\t\tsetColor(nc);\n\n\tsbstate.vertexCount = 0;\n\tsbstate.indexCount = 0;\n\tsbstate.flushing = false;\n}\n\nvoid Graphics::flushBatchedDrawsGlobal()\n{\n\tGraphics *instance = getInstance<Graphics>(M_GRAPHICS);\n\tif (instance != nullptr)\n\t\tinstance->flushBatchedDraws();\n}\n\n/**\n * Drawing\n **/\n\nvoid Graphics::draw(Drawable *drawable, const Matrix4 &m)\n{\n\tdrawable->draw(this, m);\n}\n\nvoid Graphics::draw(Texture *texture, Quad *quad, const Matrix4 &m)\n{\n\ttexture->draw(this, quad, m);\n}\n\nvoid Graphics::drawLayer(Texture *texture, int layer, const Matrix4 &m)\n{\n\ttexture->drawLayer(this, layer, m);\n}\n\nvoid Graphics::drawLayer(Texture *texture, int layer, Quad *quad, const Matrix4 &m)\n{\n\ttexture->drawLayer(this, layer, quad, m);\n}\n\nvoid Graphics::drawInstanced(Mesh *mesh, const Matrix4 &m, int instancecount)\n{\n\tmesh->drawInstanced(this, m, instancecount);\n}\n\nvoid Graphics::drawIndirect(Mesh *mesh, const Matrix4 &m, Buffer *indirectargs, int argsindex)\n{\n\tmesh->drawIndirect(this, m, indirectargs, argsindex);\n}\n\nvoid Graphics::drawFromShader(PrimitiveType primtype, int vertexcount, int instancecount, Texture *maintexture)\n{\n\tif (primtype == PRIMITIVE_TRIANGLE_FAN && vertexcount > LOVE_UINT16_MAX)\n\t\tthrow love::Exception(\"drawFromShader cannot draw more than %d vertices when the 'fan' draw mode is used.\", LOVE_UINT16_MAX);\n\n\t// Emulated triangle fan via an index buffer.\n\tif (primtype == PRIMITIVE_TRIANGLE_FAN && getFanIndexBuffer())\n\t{\n\t\tint indexcount = getIndexCount(TRIANGLEINDEX_FAN, vertexcount);\n\t\tdrawFromShader(getFanIndexBuffer(), indexcount, instancecount, 0, maintexture);\n\t\treturn;\n\t}\n\n\tflushBatchedDraws();\n\n\tif (Shader::isDefaultActive() || !Shader::current)\n\t\tthrow love::Exception(\"drawFromShader can only be used with a custom shader.\");\n\n\tif (vertexcount < 0 || instancecount < 0)\n\t\tthrow love::Exception(\"drawFromShader vertex and instance count parameters must not be negative.\");\n\n\tShader::current->validateDrawState(primtype, maintexture);\n\n\tBufferBindings buffers;\n\tDrawCommand cmd(noAttributesID, &buffers);\n\n\tcmd.primitiveType = primtype;\n\tcmd.vertexCount = vertexcount;\n\tcmd.instanceCount = std::max(1, instancecount);\n\tcmd.texture = getTextureOrDefaultForActiveShader(maintexture);\n\n\tdraw(cmd);\n}\n\nvoid Graphics::drawFromShader(Buffer *indexbuffer, int indexcount, int instancecount, int startindex, Texture *maintexture)\n{\n\tflushBatchedDraws();\n\n\tif (!(indexbuffer->getUsageFlags() & BUFFERUSAGEFLAG_INDEX))\n\t\tthrow love::Exception(\"The buffer passed to drawFromShader must be an index buffer.\");\n\n\tif (startindex < 0)\n\t\tthrow love::Exception(\"drawFromShader startindex parameter must not be negative.\");\n\n\tif (indexcount < 0 || instancecount < 0)\n\t\tthrow love::Exception(\"drawFromShader index and instance count parameters must not be negative.\");\n\n\tif ((size_t)(startindex + indexcount) > indexbuffer->getArrayLength() * indexbuffer->getDataMembers().size())\n\t\tthrow love::Exception(\"drawFromShader startindex and index count parameters do not fit in the given index buffer.\");\n\n\tif (Shader::isDefaultActive() || !Shader::current)\n\t\tthrow love::Exception(\"drawFromShader can only be used with a custom shader.\");\n\n\tShader::current->validateDrawState(PRIMITIVE_TRIANGLES, maintexture);\n\n\tBufferBindings buffers;\n\tDrawIndexedCommand cmd(noAttributesID, &buffers, indexbuffer);\n\n\tcmd.primitiveType = PRIMITIVE_TRIANGLES;\n\tcmd.indexCount = indexcount;\n\tcmd.instanceCount = std::max(1, instancecount);\n\n\tcmd.indexType = getIndexDataType(indexbuffer->getDataMember(0).decl.format);\n\tcmd.indexBufferOffset = startindex * getIndexDataSize(cmd.indexType);\n\n\tcmd.texture = getTextureOrDefaultForActiveShader(maintexture);\n\n\tdraw(cmd);\n}\n\nvoid Graphics::drawFromShaderIndirect(PrimitiveType primtype, Buffer *indirectargs, int argsindex, Texture *maintexture)\n{\n\tflushBatchedDraws();\n\n\tif (primtype == PRIMITIVE_TRIANGLE_FAN)\n\t\tthrow love::Exception(\"The fan draw mode is not supported in indirect draws.\");\n\n\tif (Shader::isDefaultActive() || !Shader::current)\n\t\tthrow love::Exception(\"drawFromShaderIndirect can only be used with a custom shader.\");\n\n\tvalidateIndirectArgsBuffer(INDIRECT_ARGS_DRAW_VERTICES, indirectargs, argsindex);\n\n\tShader::current->validateDrawState(primtype, maintexture);\n\n\tBufferBindings buffers;\n\tDrawCommand cmd(noAttributesID, &buffers);\n\n\tcmd.primitiveType = primtype;\n\tcmd.indirectBuffer = indirectargs;\n\tcmd.indirectBufferOffset = argsindex * indirectargs->getArrayStride();\n\tcmd.texture = getTextureOrDefaultForActiveShader(maintexture);\n\n\tdraw(cmd);\n}\n\nvoid Graphics::drawFromShaderIndirect(Buffer *indexbuffer, Buffer *indirectargs, int argsindex, Texture *maintexture)\n{\n\tflushBatchedDraws();\n\n\tif (!(indexbuffer->getUsageFlags() & BUFFERUSAGEFLAG_INDEX))\n\t\tthrow love::Exception(\"The buffer passed to the indexed variant of drawFromShaderIndirect must be an index buffer.\");\n\n\tif (Shader::isDefaultActive() || !Shader::current)\n\t\tthrow love::Exception(\"drawFromShaderIndirect can only be used with a custom shader.\");\n\n\tvalidateIndirectArgsBuffer(INDIRECT_ARGS_DRAW_INDICES, indirectargs, argsindex);\n\n\tShader::current->validateDrawState(PRIMITIVE_TRIANGLES, maintexture);\n\n\tBufferBindings buffers;\n\tDrawIndexedCommand cmd(noAttributesID, &buffers, indexbuffer);\n\n\tcmd.primitiveType = PRIMITIVE_TRIANGLES;\n\tcmd.indexType = getIndexDataType(indexbuffer->getDataMember(0).decl.format);\n\tcmd.indirectBuffer = indirectargs;\n\tcmd.indexBufferOffset = argsindex * indirectargs->getArrayStride();\n\tcmd.texture = getTextureOrDefaultForActiveShader(maintexture);\n\n\tdraw(cmd);\n}\n\nvoid Graphics::print(const std::vector<love::font::ColoredString> &str, const Matrix4 &m)\n{\n\tcheckSetDefaultFont();\n\n\tif (states.back().font.get() != nullptr)\n\t\tprint(str, states.back().font.get(), m);\n}\n\nvoid Graphics::print(const std::vector<love::font::ColoredString> &str, Font *font, const Matrix4 &m)\n{\n\tfont->print(this, str, m, states.back().color);\n}\n\nvoid Graphics::printf(const std::vector<love::font::ColoredString> &str, float wrap, Font::AlignMode align, const Matrix4 &m)\n{\n\tcheckSetDefaultFont();\n\n\tif (states.back().font.get() != nullptr)\n\t\tprintf(str, states.back().font.get(), wrap, align, m);\n}\n\nvoid Graphics::printf(const std::vector<love::font::ColoredString> &str, Font *font, float wrap, Font::AlignMode align, const Matrix4 &m)\n{\n\tfont->printf(this, str, wrap, align, m, states.back().color);\n}\n\n/**\n * Primitives (points, shapes, lines).\n **/\n\nvoid Graphics::points(const Vector2 *positions, const Colorf *colors, size_t numpoints)\n{\n\tconst Matrix4 &t = getTransform();\n\tbool is2D = t.isAffine2DTransform();\n\n\tBatchedDrawCommand cmd;\n\tcmd.primitiveMode = PRIMITIVE_POINTS;\n\tcmd.formats[0] = getSinglePositionFormat(is2D);\n\tcmd.formats[1] = CommonFormat::RGBAub;\n\tcmd.vertexCount = (int) numpoints;\n\tcmd.standardShaderType = Shader::STANDARD_POINTS;\n\n\tBatchedVertexData data = requestBatchedDraw(cmd);\n\n\tif (is2D)\n\t\tt.transformXY((Vector2 *) data.stream[0], positions, cmd.vertexCount);\n\telse\n\t\tt.transformXY0((Vector3 *) data.stream[0], positions, cmd.vertexCount);\n\n\tColor32 *colordata = (Color32 *) data.stream[1];\n\n\tif (colors)\n\t{\n\t\tColorf nc = getColor();\n\t\tgammaCorrectColor(nc);\n\n\t\tif (isGammaCorrect())\n\t\t{\n\t\t\tfor (int i = 0; i < cmd.vertexCount; i++)\n\t\t\t{\n\t\t\t\tColorf ci = colors[i];\n\t\t\t\tgammaCorrectColor(ci);\n\t\t\t\tci *= nc;\n\t\t\t\tunGammaCorrectColor(ci);\n\t\t\t\tcolordata[i] = toColor32(ci);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (int i = 0; i < cmd.vertexCount; i++)\n\t\t\t\tcolordata[i] = toColor32(nc * colors[i]);\n\t\t}\n\t}\n\telse\n\t{\n\t\tColor32 c = toColor32(getColor());\n\n\t\tfor (int i = 0; i < cmd.vertexCount; i++)\n\t\t\tcolordata[i] = c;\n\t}\n}\n\nint Graphics::calculateEllipsePoints(float rx, float ry) const\n{\n\tint points = (int) sqrtf(((rx + ry) / 2.0f) * 20.0f * (float) pixelScaleStack.back());\n\treturn std::max(points, 8);\n}\n\nvoid Graphics::polyline(const Vector2 *vertices, size_t count)\n{\n\tfloat halfwidth = getLineWidth() * 0.5f;\n\tLineJoin linejoin = getLineJoin();\n\tLineStyle linestyle = getLineStyle();\n\n\tfloat pixelsize = 1.0f / std::max((float) pixelScaleStack.back(), 0.000001f);\n\n\tif (linejoin == LINE_JOIN_NONE)\n\t{\n\t\tNoneJoinPolyline line;\n\t\tline.render(vertices, count, halfwidth, pixelsize, linestyle == LINE_SMOOTH);\n\t\tline.draw(this);\n\t}\n\telse if (linejoin == LINE_JOIN_BEVEL)\n\t{\n\t\tBevelJoinPolyline line;\n\t\tline.render(vertices, count, halfwidth, pixelsize, linestyle == LINE_SMOOTH);\n\t\tline.draw(this);\n\t}\n\telse if (linejoin == LINE_JOIN_MITER)\n\t{\n\t\tMiterJoinPolyline line;\n\t\tline.render(vertices, count, halfwidth, pixelsize, linestyle == LINE_SMOOTH);\n\t\tline.draw(this);\n\t}\n}\n\nvoid Graphics::rectangle(DrawMode mode, float x, float y, float w, float h)\n{\n\tVector2 coords[] = {Vector2(x,y), Vector2(x,y+h), Vector2(x+w,y+h), Vector2(x+w,y), Vector2(x,y)};\n\tpolygon(mode, coords, 5);\n}\n\nvoid Graphics::rectangle(DrawMode mode, float x, float y, float w, float h, float rx, float ry, int points)\n{\n\tif (rx <= 0 || ry <= 0)\n\t{\n\t\trectangle(mode, x, y, w, h);\n\t\treturn;\n\t}\n\n\t// Radius values that are more than half the rectangle's size aren't handled\n\t// correctly (for now)...\n\tif (w >= 0.02f)\n\t\trx = std::min(rx, w / 2.0f - 0.01f);\n\tif (h >= 0.02f)\n\t\try = std::min(ry, h / 2.0f - 0.01f);\n\n\tpoints = std::max(points / 4, 1);\n\n\tconst float half_pi = static_cast<float>(LOVE_M_PI / 2);\n\tfloat angle_shift = half_pi / ((float) points + 1.0f);\n\n\tint num_coords = (points + 2) * 4;\n\tVector2 *coords = getScratchBuffer<Vector2>(num_coords + 1);\n\tfloat phi = .0f;\n\n\tfor (int i = 0; i <= points + 2; ++i, phi += angle_shift)\n\t{\n\t\tcoords[i].x = x + rx * (1 - cosf(phi));\n\t\tcoords[i].y = y + ry * (1 - sinf(phi));\n\t}\n\n\tphi = half_pi;\n\n\tfor (int i = points + 2; i <= 2 * (points + 2); ++i, phi += angle_shift)\n\t{\n\t\tcoords[i].x = x + w - rx * (1 + cosf(phi));\n\t\tcoords[i].y = y +     ry * (1 - sinf(phi));\n\t}\n\n\tphi = 2 * half_pi;\n\n\tfor (int i = 2 * (points + 2); i <= 3 * (points + 2); ++i, phi += angle_shift)\n\t{\n\t\tcoords[i].x = x + w - rx * (1 + cosf(phi));\n\t\tcoords[i].y = y + h - ry * (1 + sinf(phi));\n\t}\n\n\tphi = 3 * half_pi;\n\n\tfor (int i = 3 * (points + 2); i <= 4 * (points + 2); ++i, phi += angle_shift)\n\t{\n\t\tcoords[i].x = x +     rx * (1 - cosf(phi));\n\t\tcoords[i].y = y + h - ry * (1 + sinf(phi));\n\t}\n\n\tcoords[num_coords] = coords[0];\n\n\tpolygon(mode, coords, num_coords + 1);\n}\n\nvoid Graphics::rectangle(DrawMode mode, float x, float y, float w, float h, float rx, float ry)\n{\n\tint points = calculateEllipsePoints(std::min(rx, std::abs(w/2)), std::min(ry, std::abs(h/2)));\n\trectangle(mode, x, y, w, h, rx, ry, points);\n}\n\nvoid Graphics::circle(DrawMode mode, float x, float y, float radius, int points)\n{\n\tellipse(mode, x, y, radius, radius, points);\n}\n\nvoid Graphics::circle(DrawMode mode, float x, float y, float radius)\n{\n\tellipse(mode, x, y, radius, radius);\n}\n\nvoid Graphics::ellipse(DrawMode mode, float x, float y, float a, float b, int points)\n{\n\tfloat two_pi = (float) (LOVE_M_PI * 2);\n\tif (points <= 0) points = 1;\n\tfloat angle_shift = (two_pi / points);\n\tfloat phi = .0f;\n\n\t// 1 extra point at the end for a closed loop, and 1 extra point at the\n\t// start in filled mode for the vertex in the center of the ellipse.\n\tint extrapoints = 1 + (mode == DRAW_FILL ? 1 : 0);\n\n\tVector2 *polygoncoords = getScratchBuffer<Vector2>(points + extrapoints);\n\tVector2 *coords = polygoncoords;\n\n\tif (mode == DRAW_FILL)\n\t{\n\t\tcoords[0].x = x;\n\t\tcoords[0].y = y;\n\t\tcoords++;\n\t}\n\n\tfor (int i = 0; i < points; ++i, phi += angle_shift)\n\t{\n\t\tcoords[i].x = x + a * cosf(phi);\n\t\tcoords[i].y = y + b * sinf(phi);\n\t}\n\n\tcoords[points] = coords[0];\n\n\t// Last argument to polygon(): don't skip the last vertex in fill mode.\n\tpolygon(mode, polygoncoords, points + extrapoints, false);\n}\n\nvoid Graphics::ellipse(DrawMode mode, float x, float y, float a, float b)\n{\n\tellipse(mode, x, y, a, b, calculateEllipsePoints(a, b));\n}\n\nvoid Graphics::arc(DrawMode drawmode, ArcMode arcmode, float x, float y, float radius, float angle1, float angle2, int points)\n{\n\t// Nothing to display with no points or equal angles. (Or is there with line mode?)\n\tif (points <= 0 || angle1 == angle2)\n\t\treturn;\n\n\t// Oh, you want to draw a circle?\n\tif (fabs(angle1 - angle2) >= 2.0f * (float) LOVE_M_PI)\n\t{\n\t\tcircle(drawmode, x, y, radius, points);\n\t\treturn;\n\t}\n\n\tfloat angle_shift = (angle2 - angle1) / points;\n\t// Bail on precision issues.\n\tif (angle_shift == 0.0)\n\t\treturn;\n\n\t// Prevent the connecting line from being drawn if a closed line arc has a\n\t// small angle. Avoids some visual issues when connected lines are at sharp\n\t// angles, due to the miter line join drawing code.\n\tif (drawmode == DRAW_LINE && arcmode == ARC_CLOSED && fabsf(angle1 - angle2) < LOVE_TORAD(4))\n\t\tarcmode = ARC_OPEN;\n\n\t// Quick fix for the last part of a filled open arc not being drawn (because\n\t// polygon(DRAW_FILL, ...) doesn't work without a closed loop of vertices.)\n\tif (drawmode == DRAW_FILL && arcmode == ARC_OPEN)\n\t\tarcmode = ARC_CLOSED;\n\n\tfloat phi = angle1;\n\n\tVector2 *coords = nullptr;\n\tint num_coords = 0;\n\n\tconst auto createPoints = [&](Vector2 *coordinates)\n\t{\n\t\tfor (int i = 0; i <= points; ++i, phi += angle_shift)\n\t\t{\n\t\t\tcoordinates[i].x = x + radius * cosf(phi);\n\t\t\tcoordinates[i].y = y + radius * sinf(phi);\n\t\t}\n\t};\n\n\tif (arcmode == ARC_PIE)\n\t{\n\t\tnum_coords = points + 3;\n\t\tcoords = getScratchBuffer<Vector2>(num_coords);\n\n\t\tcoords[0] = coords[num_coords - 1] = Vector2(x, y);\n\n\t\tcreatePoints(coords + 1);\n\t}\n\telse if (arcmode == ARC_OPEN)\n\t{\n\t\tnum_coords = points + 1;\n\t\tcoords = getScratchBuffer<Vector2>(num_coords);\n\n\t\tcreatePoints(coords);\n\t}\n\telse // ARC_CLOSED\n\t{\n\t\tnum_coords = points + 2;\n\t\tcoords = getScratchBuffer<Vector2>(num_coords);\n\n\t\tcreatePoints(coords);\n\n\t\t// Connect the ends of the arc.\n\t\tcoords[num_coords - 1] = coords[0];\n\t}\n\n\tpolygon(drawmode, coords, num_coords);\n}\n\nvoid Graphics::arc(DrawMode drawmode, ArcMode arcmode, float x, float y, float radius, float angle1, float angle2)\n{\n\tfloat points = (float) calculateEllipsePoints(radius, radius);\n\n\t// The amount of points is based on the fraction of the circle created by the arc.\n\tfloat angle = fabsf(angle1 - angle2);\n\tif (angle < 2.0f * (float) LOVE_M_PI)\n\t\tpoints *= angle / (2.0f * (float) LOVE_M_PI);\n\n\tarc(drawmode, arcmode, x, y, radius, angle1, angle2, (int) (points + 0.5f));\n}\n\nvoid Graphics::polygon(DrawMode mode, const Vector2 *coords, size_t count, bool skipLastFilledVertex)\n{\n\t// coords is an array of a closed loop of vertices, i.e.\n\t// coords[count-1] == coords[0]\n\tif (mode == DRAW_LINE)\n\t{\n\t\tpolyline(coords, count);\n\t}\n\telse\n\t{\n\t\tconst Matrix4 &t = getTransform();\n\t\tbool is2D = t.isAffine2DTransform();\n\n\t\tBatchedDrawCommand cmd;\n\t\tcmd.formats[0] = getSinglePositionFormat(is2D);\n\t\tcmd.formats[1] = CommonFormat::STf_RGBAub;\n\t\tcmd.indexMode = TRIANGLEINDEX_FAN;\n\t\tcmd.vertexCount = (int)count - (skipLastFilledVertex ? 1 : 0);\n\n\t\tBatchedVertexData data = requestBatchedDraw(cmd);\n\n\t\t// Compute texture coordinates.\n\t\tconstexpr float inf = std::numeric_limits<float>::infinity();\n\t\tVector2 mincoord(inf, inf);\n\t\tVector2 maxcoord(-inf, -inf);\n\n\t\tfor (int i = 0; i < cmd.vertexCount; i++)\n\t\t{\n\t\t\tVector2 v = coords[i];\n\t\t\tmincoord.x = std::min(mincoord.x, v.x);\n\t\t\tmincoord.y = std::min(mincoord.y, v.y);\n\t\t\tmaxcoord.x = std::max(maxcoord.x, v.x);\n\t\t\tmaxcoord.y = std::max(maxcoord.y, v.y);\n\t\t}\n\n\t\tVector2 invsize(1.0f / (maxcoord.x - mincoord.x), 1.0f / (maxcoord.y - mincoord.y));\n\t\tVector2 start(mincoord.x * invsize.x, mincoord.y * invsize.y);\n\n\t\tColor32 c = toColor32(getColor());\n\t\tSTf_RGBAub *attributes = (STf_RGBAub *) data.stream[1];\n\t\tfor (int i = 0; i < cmd.vertexCount; i++)\n\t\t{\n\t\t\tattributes[i].s = coords[i].x * invsize.x - start.x;\n\t\t\tattributes[i].t = coords[i].y * invsize.y - start.y;\n\t\t\tattributes[i].color = c;\n\t\t}\n\n\t\tif (is2D)\n\t\t\tt.transformXY((Vector2*)data.stream[0], coords, cmd.vertexCount);\n\t\telse\n\t\t\tt.transformXY0((Vector3*)data.stream[0], coords, cmd.vertexCount);\n\t}\n}\n\nconst Graphics::Capabilities &Graphics::getCapabilities() const\n{\n\treturn capabilities;\n}\n\nPixelFormat Graphics::getSizedFormat(PixelFormat format) const\n{\n\tswitch (format)\n\t{\n\tcase PIXELFORMAT_NORMAL:\n\t\tif (isGammaCorrect())\n\t\t\treturn PIXELFORMAT_RGBA8_sRGB;\n\t\telse\n\t\t\treturn PIXELFORMAT_RGBA8_UNORM;\n\tcase PIXELFORMAT_HDR:\n\t\treturn PIXELFORMAT_RGBA16_FLOAT;\n\tdefault:\n\t\treturn format;\n\t}\n}\n\nGraphics::Stats Graphics::getStats() const\n{\n\tStats stats;\n\n\tgetAPIStats(stats.shaderSwitches);\n\n\tstats.drawCalls = drawCalls;\n\tif (batchedDrawState.vertexCount > 0)\n\t\tstats.drawCalls++;\n\n\tstats.renderTargetSwitches = renderTargetSwitchCount;\n\tstats.drawCallsBatched = drawCallsBatched;\n\tstats.textures = Texture::textureCount;\n\tstats.fonts = Font::fontCount;\n\tstats.buffers = Buffer::bufferCount;\n\tstats.textureMemory = Texture::totalGraphicsMemory;\n\tstats.bufferMemory = Buffer::totalGraphicsMemory;\n\n\treturn stats;\n}\n\nsize_t Graphics::getStackDepth() const\n{\n\treturn stackTypeStack.size();\n}\n\nvoid Graphics::push(StackType type)\n{\n\tif (stackTypeStack.size() == MAX_USER_STACK_DEPTH)\n\t\tthrow Exception(\"Maximum stack depth reached (more pushes than pops?)\");\n\n\tpushTransform();\n\n\tpixelScaleStack.push_back(pixelScaleStack.back());\n\n\tif (type == STACK_ALL)\n\t\tstates.push_back(states.back());\n\n\tstackTypeStack.push_back(type);\n}\n\nvoid Graphics::pop()\n{\n\tif (stackTypeStack.size() < 1)\n\t\tthrow Exception(\"Minimum stack depth reached (more pops than pushes?)\");\n\n\tpopTransform();\n\tpixelScaleStack.pop_back();\n\n\tif (stackTypeStack.back() == STACK_ALL)\n\t{\n\t\tDisplayState &newstate = states[states.size() - 2];\n\n\t\trestoreStateChecked(newstate);\n\n\t\t// The last two states in the stack should be equal now.\n\t\tstates.pop_back();\n\t}\n\n\tstackTypeStack.pop_back();\n}\n\n/**\n * Transform and stack functions.\n **/\n\nconst Matrix4 &Graphics::getTransform() const\n{\n\treturn transformStack.back();\n}\n\nconst Matrix4 &Graphics::getDeviceProjection() const\n{\n\treturn deviceProjectionMatrix;\n}\n\nvoid Graphics::pushTransform()\n{\n\ttransformStack.push_back(transformStack.back());\n}\n\nvoid Graphics::pushIdentityTransform()\n{\n\ttransformStack.push_back(Matrix4());\n}\n\nvoid Graphics::popTransform()\n{\n\ttransformStack.pop_back();\n}\n\nvoid Graphics::rotate(float r)\n{\n\ttransformStack.back().rotate(r);\n}\n\nvoid Graphics::scale(float x, float y)\n{\n\ttransformStack.back().scale(x, y);\n\tpixelScaleStack.back() *= (fabs(x) + fabs(y)) / 2.0;\n}\n\nvoid Graphics::translate(float x, float y)\n{\n\ttransformStack.back().translate(x, y);\n}\n\nvoid Graphics::shear(float kx, float ky)\n{\n\ttransformStack.back().shear(kx, ky);\n}\n\nvoid Graphics::origin()\n{\n\ttransformStack.back().setIdentity();\n\tpixelScaleStack.back() = 1;\n}\n\nvoid Graphics::applyTransform(const Matrix4 &m)\n{\n\tMatrix4 &current = transformStack.back();\n\tcurrent *= m;\n\n\tfloat sx, sy;\n\tcurrent.getApproximateScale(sx, sy);\n\tpixelScaleStack.back() = (sx + sy) / 2.0;\n}\n\nvoid Graphics::replaceTransform(const Matrix4 &m)\n{\n\ttransformStack.back() = m;\n\n\tfloat sx, sy;\n\tm.getApproximateScale(sx, sy);\n\tpixelScaleStack.back() = (sx + sy) / 2.0;\n}\n\nVector2 Graphics::transformPoint(Vector2 point)\n{\n\tVector2 p;\n\ttransformStack.back().transformXY(&p, &point, 1);\n\treturn p;\n}\n\nVector2 Graphics::inverseTransformPoint(Vector2 point)\n{\n\tVector2 p;\n\t// TODO: We should probably cache the inverse transform so we don't have to\n\t// re-calculate it every time this is called.\n\ttransformStack.back().inverse().transformXY(&p, &point, 1);\n\treturn p;\n}\n\nvoid Graphics::setProjection(const Matrix4 &m)\n{\n\tflushBatchedDraws();\n\n\tauto &state = states.back();\n\n\tstate.useCustomProjection = true;\n\tstate.customProjection = m;\n\n\tupdateDeviceProjection(m);\n}\n\nvoid Graphics::resetProjection()\n{\n\tflushBatchedDraws();\n\n\tauto &state = states.back();\n\tint w = getWidth();\n\tint h = getHeight();\n\n\tconst auto &rt = state.renderTargets.getFirstTarget();\n\tif (rt.texture.get())\n\t{\n\t\tw = rt.texture->getWidth(rt.mipmap);\n\t\th = rt.texture->getHeight(rt.mipmap);\n\t}\n\n\tstate.useCustomProjection = false;\n\n\t// NDC is y-up. The ortho() parameter names assume that as well. We want\n\t// a y-down projection, so we set bottom to h and top to 0.\n\tupdateDeviceProjection(Matrix4::ortho(0.0f, w, h, 0.0f, -10.0f, 10.0f));\n}\n\nvoid Graphics::updateDeviceProjection(const Matrix4 &projection)\n{\n\tdeviceProjectionMatrix = projection;\n}\n\nSTRINGMAP_CLASS_BEGIN(Graphics, Graphics::DrawMode, Graphics::DRAW_MAX_ENUM, drawMode)\n{\n\t{ \"line\", Graphics::DRAW_LINE },\n\t{ \"fill\", Graphics::DRAW_FILL },\n}\nSTRINGMAP_CLASS_END(Graphics, Graphics::DrawMode, Graphics::DRAW_MAX_ENUM, drawMode)\n\nSTRINGMAP_CLASS_BEGIN(Graphics, Graphics::ArcMode, Graphics::ARC_MAX_ENUM, arcMode)\n{\n\t{ \"open\",   Graphics::ARC_OPEN   },\n\t{ \"closed\", Graphics::ARC_CLOSED },\n\t{ \"pie\",    Graphics::ARC_PIE    },\n}\nSTRINGMAP_CLASS_END(Graphics, Graphics::ArcMode, Graphics::ARC_MAX_ENUM, arcMode)\n\nSTRINGMAP_CLASS_BEGIN(Graphics, Graphics::LineStyle, Graphics::LINE_MAX_ENUM, lineStyle)\n{\n\t{ \"smooth\", Graphics::LINE_SMOOTH },\n\t{ \"rough\",  Graphics::LINE_ROUGH  }\n}\nSTRINGMAP_CLASS_END(Graphics, Graphics::LineStyle, Graphics::LINE_MAX_ENUM, lineStyle)\n\nSTRINGMAP_CLASS_BEGIN(Graphics, Graphics::LineJoin, Graphics::LINE_JOIN_MAX_ENUM, lineJoin)\n{\n\t{ \"none\",  Graphics::LINE_JOIN_NONE  },\n\t{ \"miter\", Graphics::LINE_JOIN_MITER },\n\t{ \"bevel\", Graphics::LINE_JOIN_BEVEL }\n}\nSTRINGMAP_CLASS_END(Graphics, Graphics::LineJoin, Graphics::LINE_JOIN_MAX_ENUM, lineJoin)\n\nSTRINGMAP_CLASS_BEGIN(Graphics, Graphics::Feature, Graphics::FEATURE_MAX_ENUM, feature)\n{\n\t{ \"multicanvasformats\",       Graphics::FEATURE_MULTI_RENDER_TARGET_FORMATS },\n\t{ \"clampzero\",                Graphics::FEATURE_CLAMP_ZERO           },\n\t{ \"clampone\",                 Graphics::FEATURE_CLAMP_ONE            },\n\t{ \"lighten\",                  Graphics::FEATURE_LIGHTEN              },\n\t{ \"fullnpot\",                 Graphics::FEATURE_FULL_NPOT            },\n\t{ \"pixelshaderhighp\",         Graphics::FEATURE_PIXEL_SHADER_HIGHP   },\n\t{ \"shaderderivatives\",        Graphics::FEATURE_SHADER_DERIVATIVES   },\n\t{ \"glsl3\",                    Graphics::FEATURE_GLSL3                },\n\t{ \"glsl4\",                    Graphics::FEATURE_GLSL4                },\n\t{ \"instancing\",               Graphics::FEATURE_INSTANCING           },\n\t{ \"texelbuffer\",              Graphics::FEATURE_TEXEL_BUFFER         },\n\t{ \"copytexturetobuffer\",      Graphics::FEATURE_COPY_TEXTURE_TO_BUFFER },\n\t{ \"indirectdraw\",             Graphics::FEATURE_INDIRECT_DRAW        },\n}\nSTRINGMAP_CLASS_END(Graphics, Graphics::Feature, Graphics::FEATURE_MAX_ENUM, feature)\n\nSTRINGMAP_CLASS_BEGIN(Graphics, Graphics::SystemLimit, Graphics::LIMIT_MAX_ENUM, systemLimit)\n{\n\t{ \"pointsize\",               Graphics::LIMIT_POINT_SIZE                 },\n\t{ \"texturesize\",             Graphics::LIMIT_TEXTURE_SIZE               },\n\t{ \"texturelayers\",           Graphics::LIMIT_TEXTURE_LAYERS             },\n\t{ \"volumetexturesize\",       Graphics::LIMIT_VOLUME_TEXTURE_SIZE        },\n\t{ \"cubetexturesize\",         Graphics::LIMIT_CUBE_TEXTURE_SIZE          },\n\t{ \"texelbuffersize\",         Graphics::LIMIT_TEXEL_BUFFER_SIZE          },\n\t{ \"shaderstoragebuffersize\", Graphics::LIMIT_SHADER_STORAGE_BUFFER_SIZE },\n\t{ \"threadgroupsx\",           Graphics::LIMIT_THREADGROUPS_X             },\n\t{ \"threadgroupsy\",           Graphics::LIMIT_THREADGROUPS_Y             },\n\t{ \"threadgroupsz\",           Graphics::LIMIT_THREADGROUPS_Z             },\n\t{ \"multicanvas\",             Graphics::LIMIT_RENDER_TARGETS             },\n\t{ \"texturemsaa\",             Graphics::LIMIT_TEXTURE_MSAA               },\n\t{ \"anisotropy\",              Graphics::LIMIT_ANISOTROPY                 },\n}\nSTRINGMAP_CLASS_END(Graphics, Graphics::SystemLimit, Graphics::LIMIT_MAX_ENUM, systemLimit)\n\nSTRINGMAP_CLASS_BEGIN(Graphics, Graphics::StackType, Graphics::STACK_MAX_ENUM, stackType)\n{\n\t{ \"all\",       Graphics::STACK_ALL       },\n\t{ \"transform\", Graphics::STACK_TRANSFORM },\n}\nSTRINGMAP_CLASS_END(Graphics, Graphics::StackType, Graphics::STACK_MAX_ENUM, stackType)\n\nSTRINGMAP_BEGIN(Renderer, RENDERER_MAX_ENUM, renderer)\n{\n\t{ \"opengl\", RENDERER_OPENGL },\n\t{ \"vulkan\", RENDERER_VULKAN },\n\t{ \"metal\",  RENDERER_METAL  },\n}\nSTRINGMAP_END(Renderer, RENDERER_MAX_ENUM, renderer)\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/Graphics.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_GRAPHICS_GRAPHICS_H\n#define LOVE_GRAPHICS_GRAPHICS_H\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/Module.h\"\n#include \"common/StringMap.h\"\n#include \"common/Vector.h\"\n#include \"common/Optional.h\"\n#include \"common/int.h\"\n#include \"common/Color.h\"\n#include \"StreamBuffer.h\"\n#include \"vertex.h\"\n#include \"Texture.h\"\n#include \"Font.h\"\n#include \"ShaderStage.h\"\n#include \"Shader.h\"\n#include \"Quad.h\"\n#include \"Mesh.h\"\n#include \"GraphicsReadback.h\"\n#include \"Deprecations.h\"\n#include \"renderstate.h\"\n#include \"math/Transform.h\"\n#include \"font/Rasterizer.h\"\n#include \"font/Font.h\"\n#include \"video/VideoStream.h\"\n#include \"data/HashFunction.h\"\n\n// C++\n#include <string>\n#include <vector>\n\nnamespace love\n{\n\nnamespace graphics\n{\n\nclass SpriteBatch;\nclass ParticleSystem;\nclass TextBatch;\nclass Video;\nclass Buffer;\n\ntypedef Optional<ColorD> OptionalColorD;\n\nconst int MAX_COLOR_RENDER_TARGETS = 8;\n\nenum Renderer\n{\n\tRENDERER_NONE,\n\tRENDERER_OPENGL,\n\tRENDERER_METAL,\n\tRENDERER_VULKAN,\n\tRENDERER_MAX_ENUM\n};\n\n/**\n * Globally sets whether gamma correction is enabled. Ideally this should be set\n * prior to using any Graphics module function.\n **/\nvoid setGammaCorrect(bool gammacorrect);\n\n/**\n * Gets whether global gamma correction is enabled.\n **/\nbool isGammaCorrect();\n\n/**\n * Gamma-corrects a color (converts it from sRGB to linear RGB, if\n * gamma correction is enabled.)\n * The color's components are expected to be in the range of [0, 1].\n **/\nvoid gammaCorrectColor(Colorf &c);\n\n/**\n * Un-gamma-corrects a color (converts it from linear RGB to sRGB, if\n * gamma correction is enabled.)\n * The color's components are expected to be in the range of [0, 1].\n **/\nvoid unGammaCorrectColor(Colorf &c);\n\nColorf gammaCorrectColor(const Colorf &c);\nColorf unGammaCorrectColor(const Colorf &c);\n\nbool isDebugEnabled();\n\nconst std::vector<Renderer> &getDefaultRenderers();\nconst std::vector<Renderer> &getRenderers();\nvoid setRenderers(const std::vector<Renderer> &renderers);\n\nvoid setLowPowerPreferred(bool preferred);\nbool isLowPowerPreferred();\n\nclass Graphics : public Module\n{\npublic:\n\n\tstatic love::Type type;\n\n\tenum DrawMode\n\t{\n\t\tDRAW_LINE,\n\t\tDRAW_FILL,\n\t\tDRAW_MAX_ENUM\n\t};\n\n\tenum ArcMode\n\t{\n\t\tARC_OPEN,\n\t\tARC_CLOSED,\n\t\tARC_PIE,\n\t\tARC_MAX_ENUM\n\t};\n\n\tenum LineStyle\n\t{\n\t\tLINE_ROUGH,\n\t\tLINE_SMOOTH,\n\t\tLINE_MAX_ENUM\n\t};\n\n\tenum LineJoin\n\t{\n\t\tLINE_JOIN_NONE,\n\t\tLINE_JOIN_MITER,\n\t\tLINE_JOIN_BEVEL,\n\t\tLINE_JOIN_MAX_ENUM\n\t};\n\n\tenum Feature\n\t{\n\t\tFEATURE_MULTI_RENDER_TARGET_FORMATS, // Deprecated\n\t\tFEATURE_CLAMP_ZERO,\n\t\tFEATURE_CLAMP_ONE,\n\t\tFEATURE_LIGHTEN, // Deprecated\n\t\tFEATURE_FULL_NPOT, // Deprecated\n\t\tFEATURE_PIXEL_SHADER_HIGHP, // Deprecated\n\t\tFEATURE_SHADER_DERIVATIVES, // Deprecated\n\t\tFEATURE_GLSL3, // Deprecated\n\t\tFEATURE_GLSL4,\n\t\tFEATURE_INSTANCING, // Deprecated\n\t\tFEATURE_TEXEL_BUFFER,\n\t\tFEATURE_COPY_TEXTURE_TO_BUFFER,\n\t\tFEATURE_INDIRECT_DRAW,\n\t\tFEATURE_MAX_ENUM\n\t};\n\n\tenum SystemLimit\n\t{\n\t\tLIMIT_POINT_SIZE,\n\t\tLIMIT_TEXTURE_SIZE,\n\t\tLIMIT_VOLUME_TEXTURE_SIZE,\n\t\tLIMIT_CUBE_TEXTURE_SIZE,\n\t\tLIMIT_TEXTURE_LAYERS,\n\t\tLIMIT_TEXEL_BUFFER_SIZE,\n\t\tLIMIT_SHADER_STORAGE_BUFFER_SIZE,\n\t\tLIMIT_THREADGROUPS_X,\n\t\tLIMIT_THREADGROUPS_Y,\n\t\tLIMIT_THREADGROUPS_Z,\n\t\tLIMIT_RENDER_TARGETS,\n\t\tLIMIT_TEXTURE_MSAA,\n\t\tLIMIT_ANISOTROPY,\n\t\tLIMIT_MAX_ENUM\n\t};\n\n\tenum StackType\n\t{\n\t\tSTACK_ALL,\n\t\tSTACK_TRANSFORM,\n\t\tSTACK_MAX_ENUM\n\t};\n\n\tenum TemporaryRenderTargetFlags\n\t{\n\t\tTEMPORARY_RT_DEPTH   = (1 << 0),\n\t\tTEMPORARY_RT_STENCIL = (1 << 1),\n\t};\n\n\tenum IndirectArgsType\n\t{\n\t\tINDIRECT_ARGS_DISPATCH,\n\t\tINDIRECT_ARGS_DRAW_VERTICES,\n\t\tINDIRECT_ARGS_DRAW_INDICES,\n\t};\n\n\tstruct Capabilities\n\t{\n\t\tdouble limits[LIMIT_MAX_ENUM];\n\t\tbool features[FEATURE_MAX_ENUM];\n\t\tbool textureTypes[TEXTURE_MAX_ENUM];\n\t};\n\n\tstruct RendererInfo\n\t{\n\t\tstd::string name;\n\t\tstd::string version;\n\t\tstd::string vendor;\n\t\tstd::string device;\n\t};\n\n\tstruct Stats\n\t{\n\t\tint drawCalls;\n\t\tint drawCallsBatched;\n\t\tint renderTargetSwitches;\n\t\tint shaderSwitches;\n\t\tint textures;\n\t\tint fonts;\n\t\tint buffers;\n\t\tint64 textureMemory;\n\t\tint64 bufferMemory;\n\t};\n\n\tstruct DrawCommand\n\t{\n\t\tPrimitiveType primitiveType = PRIMITIVE_TRIANGLES;\n\n\t\tVertexAttributesID attributesID;\n\t\tconst BufferBindings *buffers;\n\n\t\tint vertexStart = 0;\n\t\tint vertexCount = 0;\n\t\tint instanceCount = 1;\n\n\t\tBuffer *indirectBuffer = nullptr;\n\t\tsize_t indirectBufferOffset = 0;\n\n\t\tTexture *texture = nullptr;\n\n\t\t// TODO: This should be moved out to a state transition API?\n\t\tCullMode cullMode = CULL_NONE;\n\n\t\tDrawCommand(VertexAttributesID attributesID, const BufferBindings *buffers)\n\t\t\t: attributesID(attributesID)\n\t\t\t, buffers(buffers)\n\t\t{}\n\t};\n\n\tstruct DrawIndexedCommand\n\t{\n\t\tPrimitiveType primitiveType = PRIMITIVE_TRIANGLES;\n\n\t\tVertexAttributesID attributesID;\n\t\tconst BufferBindings *buffers;\n\n\t\tint indexCount = 0;\n\t\tint instanceCount = 1;\n\n\t\tIndexDataType indexType = INDEX_UINT16;\n\t\tResource *indexBuffer;\n\t\tsize_t indexBufferOffset = 0;\n\n\t\tBuffer *indirectBuffer = nullptr;\n\t\tsize_t indirectBufferOffset = 0;\n\n\t\tTexture *texture = nullptr;\n\n\t\t// TODO: This should be moved out to a state transition API?\n\t\tCullMode cullMode = CULL_NONE;\n\n\t\tDrawIndexedCommand(VertexAttributesID attributesID, const BufferBindings *buffers, Resource *indexbuffer)\n\t\t\t: attributesID(attributesID)\n\t\t\t, buffers(buffers)\n\t\t\t, indexBuffer(indexbuffer)\n\t\t{}\n\t};\n\n\tstruct BatchedDrawCommand\n\t{\n\t\tPrimitiveType primitiveMode = PRIMITIVE_TRIANGLES;\n\t\tCommonFormat formats[2];\n\t\tTriangleIndexMode indexMode = TRIANGLEINDEX_NONE;\n\t\tint vertexCount = 0;\n\t\tTexture *texture = nullptr;\n\t\tShader::StandardShader standardShaderType = Shader::STANDARD_DEFAULT;\n\n\t\tBatchedDrawCommand()\n\t\t{\n\t\t\t// VS2013 can't initialize arrays in the above manner...\n\t\t\tformats[1] = formats[0] = CommonFormat::NONE;\n\t\t}\n\t};\n\n\tstruct BatchedVertexData\n\t{\n\t\tvoid *stream[2];\n\t};\n\n\tclass TempTransform\n\t{\n\tpublic:\n\n\t\tTempTransform(Graphics *gfx)\n\t\t\t: gfx(gfx)\n\t\t{\n\t\t\tgfx->pushTransform();\n\t\t}\n\n\t\tTempTransform(Graphics *gfx, const Matrix4 &t)\n\t\t\t: gfx(gfx)\n\t\t{\n\t\t\tgfx->pushTransform();\n\t\t\tgfx->transformStack.back() *= t;\n\t\t}\n\n\t\t~TempTransform()\n\t\t{\n\t\t\tgfx->popTransform();\n\t\t}\n\n\tprivate:\n\t\tGraphics *gfx;\n\t};\n\n\tstruct ScreenshotInfo;\n\ttypedef void (*ScreenshotCallback)(const ScreenshotInfo *info, love::image::ImageData *i, void *ud);\n\n\tstruct ScreenshotInfo\n\t{\n\t\tScreenshotCallback callback = nullptr;\n\t\tvoid *data = nullptr;\n\t};\n\n\tstruct RenderTargetStrongRef;\n\n\tstruct RenderTarget\n\t{\n\t\tTexture *texture;\n\t\tint slice;\n\t\tint mipmap;\n\n\t\tRenderTarget(Texture *texture, int slice = 0, int mipmap = 0)\n\t\t\t: texture(texture)\n\t\t\t, slice(slice)\n\t\t\t, mipmap(mipmap)\n\t\t{}\n\n\t\tRenderTarget()\n\t\t\t: texture(nullptr)\n\t\t\t, slice(0)\n\t\t\t, mipmap(0)\n\t\t{}\n\n\t\tbool operator != (const RenderTarget &other) const\n\t\t{\n\t\t\treturn texture != other.texture || slice != other.slice || mipmap != other.mipmap;\n\t\t}\n\n\t\tbool operator != (const RenderTargetStrongRef &other) const\n\t\t{\n\t\t\treturn texture != other.texture.get() || slice != other.slice || mipmap != other.mipmap;\n\t\t}\n\t};\n\n\tstruct RenderTargetStrongRef\n\t{\n\t\tStrongRef<Texture> texture;\n\t\tint slice = 0;\n\t\tint mipmap = 0;\n\n\t\tRenderTargetStrongRef(Texture *texture, int slice = 0, int mipmap = 0)\n\t\t\t: texture(texture)\n\t\t\t, slice(slice)\n\t\t\t, mipmap(mipmap)\n\t\t{}\n\n\t\tbool operator != (const RenderTargetStrongRef &other) const\n\t\t{\n\t\t\treturn texture.get() != other.texture.get() || slice != other.slice || mipmap != other.mipmap;\n\t\t}\n\n\t\tbool operator != (const RenderTarget &other) const\n\t\t{\n\t\t\treturn texture.get() != other.texture || slice != other.slice || mipmap != other.mipmap;\n\t\t}\n\t};\n\n\tstruct RenderTargets\n\t{\n\t\tstd::vector<RenderTarget> colors;\n\t\tRenderTarget depthStencil;\n\t\tuint32 temporaryRTFlags;\n\n\t\tRenderTargets()\n\t\t\t: depthStencil(nullptr)\n\t\t\t, temporaryRTFlags(0)\n\t\t{}\n\n\t\tconst RenderTarget &getFirstTarget() const\n\t\t{\n\t\t\treturn colors.empty() ? depthStencil : colors[0];\n\t\t}\n\n\t\tbool operator == (const RenderTargets &other) const\n\t\t{\n\t\t\tsize_t ncolors = colors.size();\n\t\t\tif (ncolors != other.colors.size())\n\t\t\t\treturn false;\n\n\t\t\tfor (size_t i = 0; i < ncolors; i++)\n\t\t\t{\n\t\t\t\tif (colors[i] != other.colors[i])\n\t\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (depthStencil != other.depthStencil || temporaryRTFlags != other.temporaryRTFlags)\n\t\t\t\treturn false;\n\n\t\t\treturn true;\n\t\t}\n\t};\n\n\tstruct RenderTargetsStrongRef\n\t{\n\t\tstd::vector<RenderTargetStrongRef> colors;\n\t\tRenderTargetStrongRef depthStencil;\n\t\tuint32 temporaryRTFlags;\n\n\t\tRenderTargetsStrongRef()\n\t\t\t: depthStencil(nullptr)\n\t\t\t, temporaryRTFlags(0)\n\t\t{}\n\n\t\tconst RenderTargetStrongRef &getFirstTarget() const\n\t\t{\n\t\t\treturn colors.empty() ? depthStencil : colors[0];\n\t\t}\n\t};\n\n\tGraphics(const char *name);\n\tvirtual ~Graphics();\n\n\tvirtual Texture *newTexture(const Texture::Settings &settings, const Texture::Slices *data = nullptr) = 0;\n\tvirtual Texture *newTextureView(Texture *base, const Texture::ViewSettings &viewsettings) = 0;\n\n\tQuad *newQuad(Quad::Viewport v, double sw, double sh);\n\tFont *newFont(love::font::Rasterizer *data);\n\tFont *newDefaultFont(int size, const font::TrueTypeRasterizer::Settings &settings);\n\tVideo *newVideo(love::video::VideoStream *stream, float dpiscale);\n\n\tSpriteBatch *newSpriteBatch(Texture *texture, int size, BufferDataUsage usage);\n\tParticleSystem *newParticleSystem(Texture *texture, int size);\n\n\tShader *newShader(const std::vector<std::string> &stagessource, const Shader::CompileOptions &options);\n\tShader *newComputeShader(const std::string &source, const Shader::CompileOptions &options);\n\n\tvirtual Buffer *newBuffer(const Buffer::Settings &settings, const std::vector<Buffer::DataDeclaration> &format, const void *data, size_t size, size_t arraylength) = 0;\n\tvirtual Buffer *newBuffer(const Buffer::Settings &settings, DataFormat format, const void *data, size_t size, size_t arraylength);\n\n\tMesh *newMesh(const std::vector<Buffer::DataDeclaration> &vertexformat, int vertexcount, PrimitiveType drawmode, BufferDataUsage usage);\n\tMesh *newMesh(const std::vector<Buffer::DataDeclaration> &vertexformat, const void *data, size_t datasize, PrimitiveType drawmode, BufferDataUsage usage);\n\tMesh *newMesh(const std::vector<Mesh::BufferAttribute> &attributes, PrimitiveType drawmode);\n\n\tTextBatch *newTextBatch(Font *font, const std::vector<love::font::ColoredString> &text = {});\n\n\tdata::ByteData *readbackBuffer(Buffer *buffer, size_t offset, size_t size, data::ByteData *dest, size_t destoffset);\n\tGraphicsReadback *readbackBufferAsync(Buffer *buffer, size_t offset, size_t size, data::ByteData *dest, size_t destoffset);\n\n\timage::ImageData *readbackTexture(Texture *texture, int slice, int mipmap, const Rect &rect, image::ImageData *dest, int destx, int desty);\n\tGraphicsReadback *readbackTextureAsync(Texture *texture, int slice, int mipmap, const Rect &rect, image::ImageData *dest, int destx, int desty);\n\n\tbool validateShader(bool gles, const std::vector<std::string> &stages, const Shader::CompileOptions &options, std::string &err);\n\n\tTexture *getDefaultTexture(TextureType type, DataBaseType dataType, bool depthSample);\n\tBuffer *getDefaultTexelBuffer(DataBaseType dataType);\n\tBuffer *getDefaultStorageBuffer();\n\tTexture *getTextureOrDefaultForActiveShader(Texture *tex);\n\n\t/**\n\t * Resets the current color, background color, line style, and so forth.\n\t **/\n\tvoid reset();\n\n\tvirtual void clear(OptionalColorD color, OptionalInt stencil, OptionalDouble depth) = 0;\n\tvirtual void clear(const std::vector<OptionalColorD> &colors, OptionalInt stencil, OptionalDouble depth) = 0;\n\n\tvirtual void discard(const std::vector<bool> &colorbuffers, bool depthstencil) = 0;\n\n\t/**\n\t * Flips buffers. (Rendered geometry is presented on screen).\n\t **/\n\tvirtual void present(void *screenshotCallbackData) = 0;\n\n\t/**\n\t * Called when the backbuffer changes.\n\t **/\n\tvirtual void backbufferChanged(int width, int height, int pixelwidth, int pixelheight, bool backbufferstencil, bool backbufferdepth, int msaa) = 0;\n\tvoid backbufferChanged(int width, int height, int pixelwidth, int pixelheight);\n\n\t/**\n\t * Sets the current graphics display viewport and initializes the renderer.\n\t **/\n\tvirtual bool setMode(void *context, int width, int height, int pixelwidth, int pixelheight, bool backbufferstencil, bool backbufferdepth, int msaa) = 0;\n\n\t/**\n\t * Un-sets the current graphics display mode (uninitializing objects if\n\t * necessary.)\n\t **/\n\tvirtual void unSetMode() = 0;\n\n\t/**\n\t * Sets whether the module is active (internal use only.)\n\t **/\n\tvirtual void setActive(bool active) = 0;\n\n\t/**\n\t * Gets whether the module is active. Graphics module methods are only\n\t * guaranteed to work when it is active. Calling them otherwise may cause\n\t * the program to crash (or worse.)\n\t * Normally the module will always be active as long as a window exists, it\n\t * may be different on some platforms (especially mobile ones.)\n\t **/\n\tbool isActive() const;\n\n\t/**\n\t * True if a graphics viewport is set.\n\t **/\n\tbool isCreated() const;\n\n\tint getWidth() const;\n\tint getHeight() const;\n\tint getPixelWidth() const;\n\tint getPixelHeight() const;\n\n\tdouble getCurrentDPIScale() const;\n\tdouble getScreenDPIScale() const;\n\n\tvirtual int getRequestedBackbufferMSAA() const = 0;\n\tvirtual int getBackbufferMSAA() const = 0;\n\n\tBuffer *getQuadIndexBuffer() const { return quadIndexBuffer; }\n\tBuffer *getFanIndexBuffer() const { return fanIndexBuffer; }\n\n\t/**\n\t * Sets the current constant color.\n\t **/\n\tvirtual void setColor(Colorf c) = 0;\n\n\t/**\n\t * Gets current color.\n\t **/\n\tColorf getColor() const;\n\n\t/**\n\t * Sets the background Color.\n\t **/\n\tvoid setBackgroundColor(Colorf c);\n\n\t/**\n\t * Gets the current background color.\n\t **/\n\tColorf getBackgroundColor() const;\n\n\tvoid setFont(Font *font);\n\tFont *getFont();\n\n\tvoid setShader(Shader *shader);\n\tvoid setShader();\n\n\tShader *getShader() const;\n\n\tvoid setRenderTarget(RenderTarget rt, uint32 temporaryRTFlags);\n\tvoid setRenderTargets(const RenderTargets &rts);\n\tvoid setRenderTargets(const RenderTargetsStrongRef &rts);\n\tvoid setRenderTarget();\n\n\tRenderTargets getRenderTargets() const;\n\tbool isRenderTargetActive() const;\n\tbool isRenderTargetActive(Texture *texture) const;\n\tbool isRenderTargetActive(Texture *texture, int slice) const;\n\n\t/**\n\t * Scissor defines a box such that everything outside that box is discarded\n\t * and not drawn. Scissoring is automatically enabled.\n\t * @param rect The rectangle defining the scissor area.\n\t **/\n\tvirtual void setScissor(const Rect &rect) = 0;\n\tvoid intersectScissor(const Rect &rect);\n\n\t/**\n\t * Clears any scissor that has been created.\n\t **/\n\tvirtual void setScissor() = 0;\n\n\t/**\n\t * Gets the current scissor box.\n\t * @return Whether the scissor is enabled.\n\t */\n\tbool getScissor(Rect &rect) const;\n\n\tvoid setStencilMode(StencilMode mode, int value);\n\tvoid setStencilMode();\n\tStencilMode getStencilMode(int &value) const;\n\n\tvirtual void setStencilState(const StencilState &state) = 0;\n\tvoid setStencilState();\n\tconst StencilState &getStencilState() const;\n\n\tvirtual void setDepthMode(CompareMode compare, bool write) = 0;\n\tvoid setDepthMode();\n\tvoid getDepthMode(CompareMode &compare, bool &write) const;\n\n\tvoid setMeshCullMode(CullMode cull);\n\tCullMode getMeshCullMode() const;\n\n\t// Note: These are meant to be relative to the y-down default projection,\n\t// which may be flipped compared to device NDC. Implementations may have\n\t// to flip the winding internally.\n\tvirtual void setFrontFaceWinding(Winding winding) = 0;\n\tWinding getFrontFaceWinding() const;\n\n\t/**\n\t * Sets the enabled color components when rendering.\n\t **/\n\tvirtual void setColorMask(ColorChannelMask mask) = 0;\n\n\t/**\n\t * Gets the current color mask.\n\t **/\n\tColorChannelMask getColorMask() const;\n\n\t/**\n\t * High-level blend mode.\n\t **/\n\tvoid setBlendMode(BlendMode mode, BlendAlpha alphamode);\n\tBlendMode getBlendMode(BlendAlpha &alphamode) const;\n\n\t/**\n\t * Low-level blend state.\n\t **/\n\tvirtual void setBlendState(const BlendState &blend) = 0;\n\tconst BlendState &getBlendState() const;\n\n\t/**\n\t * Sets the default sampler state for textures, videos, and fonts.\n\t **/\n\tvoid setDefaultSamplerState(const SamplerState &s);\n\n\t/**\n\t * Gets the default sampler state for textures, videos, and fonts.\n\t **/\n\tconst SamplerState &getDefaultSamplerState() const;\n\n\t/**\n\t * Sets the line width.\n\t * @param width The new width of the line.\n\t **/\n\tvoid setLineWidth(float width);\n\tfloat getLineWidth() const;\n\n\t/**\n\t * Sets the line style.\n\t * @param style LINE_ROUGH or LINE_SMOOTH.\n\t **/\n\tvoid setLineStyle(LineStyle style);\n\tLineStyle getLineStyle() const;\n\n\t/**\n\t * Sets the line join mode.\n\t **/\n\tvoid setLineJoin(LineJoin style);\n\tLineJoin getLineJoin() const;\n\n\t/**\n\t * Sets the size of points.\n\t **/\n\tvirtual void setPointSize(float size) = 0;\n\n\t/**\n\t * Gets the point size.\n\t **/\n\tfloat getPointSize() const;\n\n\t/**\n\t * Sets whether graphics will be drawn as wireframe lines instead of filled\n\t * triangles (has no effect for drawn points.)\n\t * This should only be used as a debugging tool. The wireframe lines do not\n\t * behave the same as regular love.graphics lines.\n\t **/\n\tvirtual void setWireframe(bool enable) = 0;\n\n\t/**\n\t * Gets whether wireframe drawing mode is enabled.\n\t **/\n\tbool isWireframe() const;\n\n\tvoid captureScreenshot(const ScreenshotInfo &info);\n\n\tvoid copyBuffer(Buffer *source, Buffer *dest, size_t sourceoffset, size_t destoffset, size_t size);\n\tvoid copyTextureToBuffer(Texture *source, Buffer *dest, int slice, int mipmap, const Rect &rect, size_t destoffset, int destwidth);\n\tvoid copyBufferToTexture(Buffer *source, Texture *dest, size_t sourceoffset, int sourcewidth, int slice, int mipmap, const Rect &rect);\n\n\tvoid dispatchThreadgroups(Shader *shader, int x, int y, int z);\n\tvoid dispatchIndirect(Shader *shader, Buffer *indirectargs, int argsindex);\n\n\tvoid draw(Drawable *drawable, const Matrix4 &m);\n\tvoid draw(Texture *texture, Quad *quad, const Matrix4 &m);\n\tvoid drawLayer(Texture *texture, int layer, const Matrix4 &m);\n\tvoid drawLayer(Texture *texture, int layer, Quad *quad, const Matrix4 &m);\n\tvoid drawInstanced(Mesh *mesh, const Matrix4 &m, int instancecount);\n\tvoid drawIndirect(Mesh *mesh, const Matrix4 &m, Buffer *indirectargs, int argsindex);\n\n\tvoid drawFromShader(PrimitiveType primtype, int vertexcount, int instancecount, Texture *maintexture);\n\tvoid drawFromShader(Buffer *indexbuffer, int indexcount, int instancecount, int startindex, Texture *maintexture);\n\tvoid drawFromShaderIndirect(PrimitiveType primtype, Buffer *indirectargs, int argsindex, Texture *maintexture);\n\tvoid drawFromShaderIndirect(Buffer *indexbuffer, Buffer *indirectargs, int argsindex, Texture *maintexture);\n\n\t/**\n\t * Draws text at the specified coordinates\n\t **/\n\tvoid print(const std::vector<love::font::ColoredString> &str, const Matrix4 &m);\n\tvoid print(const std::vector<love::font::ColoredString> &str, Font *font, const Matrix4 &m);\n\n\t/**\n\t * Draws formatted text on screen at the specified coordinates.\n\t **/\n\tvoid printf(const std::vector<love::font::ColoredString> &str, float wrap, Font::AlignMode align, const Matrix4 &m);\n\tvoid printf(const std::vector<love::font::ColoredString> &str, Font *font, float wrap, Font::AlignMode align, const Matrix4 &m);\n\n\t/**\n\t * Draws a series of points at the specified positions.\n\t **/\n\tvoid points(const Vector2 *positions, const Colorf *colors, size_t numpoints);\n\n\t/**\n\t * Draws a series of lines connecting the given vertices.\n\t * @param coords Vertex positions (v1, ..., vn). If v1 == vn the line will be drawn closed.\n\t * @param count Number of vertices.\n\t **/\n\tvoid polyline(const Vector2 *vertices, size_t count);\n\n\t/**\n\t * Draws a rectangle.\n\t * @param x Position along x-axis for top-left corner.\n\t * @param y Position along y-axis for top-left corner.\n\t * @param w The width of the rectangle.\n\t * @param h The height of the rectangle.\n\t **/\n\tvoid rectangle(DrawMode mode, float x, float y, float w, float h);\n\n\t/**\n\t * Variant of rectangle that draws a rounded rectangle.\n\t * @param mode The mode of drawing (line/filled).\n\t * @param x X-coordinate of top-left corner\n\t * @param y Y-coordinate of top-left corner\n\t * @param w The width of the rectangle.\n\t * @param h The height of the rectangle.\n\t * @param rx The radius of the corners on the x axis\n\t * @param ry The radius of the corners on the y axis\n\t * @param points The number of points to use per corner\n\t **/\n\tvoid rectangle(DrawMode mode, float x, float y, float w, float h, float rx, float ry, int points);\n\tvoid rectangle(DrawMode mode, float x, float y, float w, float h, float rx, float ry);\n\n\t/**\n\t * Draws a circle using the specified arguments.\n\t * @param mode The mode of drawing (line/filled).\n\t * @param x X-coordinate.\n\t * @param y Y-coordinate.\n\t * @param radius Radius of the circle.\n\t * @param points Number of points to use to draw the circle.\n\t **/\n\tvoid circle(DrawMode mode, float x, float y, float radius, int points);\n\tvoid circle(DrawMode mode, float x, float y, float radius);\n\n\t/**\n\t * Draws an ellipse using the specified arguments.\n\t * @param mode The mode of drawing (line/filled).\n\t * @param x X-coordinate of center\n\t * @param y Y-coordinate of center\n\t * @param a Radius in x-direction\n\t * @param b Radius in y-direction\n\t * @param points Number of points to use to draw the circle.\n\t **/\n\tvoid ellipse(DrawMode mode, float x, float y, float a, float b, int points);\n\tvoid ellipse(DrawMode mode, float x, float y, float a, float b);\n\n\t/**\n\t * Draws an arc using the specified arguments.\n\t * @param drawmode The mode of drawing (line/filled).\n\t * @param arcmode The type of arc.\n\t * @param x X-coordinate.\n\t * @param y Y-coordinate.\n\t * @param radius Radius of the arc.\n\t * @param angle1 The angle at which the arc begins.\n\t * @param angle2 The angle at which the arc terminates.\n\t * @param points Number of points to use to draw the arc.\n\t **/\n\tvoid arc(DrawMode drawmode, ArcMode arcmode, float x, float y, float radius, float angle1, float angle2, int points);\n\tvoid arc(DrawMode drawmode, ArcMode arcmode, float x, float y, float radius, float angle1, float angle2);\n\n\t/**\n\t * Draws a polygon with an arbitrary number of vertices.\n\t * @param mode The type of drawing (line/filled).\n\t * @param coords Vertex positions.\n\t * @param count Vertex array size.\n\t **/\n\tvoid polygon(DrawMode mode, const Vector2 *vertices, size_t count, bool skipLastFilledVertex = true);\n\n\t/**\n\t * Gets the graphics capabilities (feature support, limit values, and\n\t * supported texture types) of this system.\n\t **/\n\tconst Capabilities &getCapabilities() const;\n\n\t/**\n\t * Converts PIXELFORMAT_NORMAL and PIXELFORMAT_HDR into a real format.\n\t **/\n\tPixelFormat getSizedFormat(PixelFormat format) const;\n\n\t/**\n\t * Gets whether the specified pixel format usage is supported.\n\t **/\n\tvirtual bool isPixelFormatSupported(PixelFormat format, uint32 usage) = 0;\n\n\t/**\n\t * Gets the renderer used by love.graphics.\n\t **/\n\tvirtual Renderer getRenderer() const = 0;\n\n\t/**\n\t * Whether shaders will use GLSL ES or not (mobile shaders).\n\t **/\n\tvirtual bool usesGLSLES() const = 0;\n\n\t/**\n\t * Returns system-dependent renderer information.\n\t * Returned strings can vary greatly between systems! Do not rely on it for\n\t * anything!\n\t **/\n\tvirtual RendererInfo getRendererInfo() const = 0;\n\n\t/**\n\t * Returns performance-related statistics.\n\t **/\n\tStats getStats() const;\n\n\tsize_t getStackDepth() const;\n\tvoid push(StackType type = STACK_TRANSFORM);\n\tvoid pop();\n\n\tconst Matrix4 &getTransform() const;\n\tconst Matrix4 &getDeviceProjection() const;\n\n\tvoid rotate(float r);\n\tvoid scale(float x, float y = 1.0f);\n\tvoid translate(float x, float y);\n\tvoid shear(float kx, float ky);\n\tvoid origin();\n\n\tvoid applyTransform(const Matrix4 &m);\n\tvoid replaceTransform(const Matrix4 &m);\n\n\tVector2 transformPoint(Vector2 point);\n\tVector2 inverseTransformPoint(Vector2 point);\n\n\tvoid setProjection(const Matrix4 &m);\n\tvoid resetProjection();\n\n\tvirtual void draw(const DrawCommand &cmd) = 0;\n\tvirtual void draw(const DrawIndexedCommand &cmd) = 0;\n\tvirtual void drawQuads(int start, int count, VertexAttributesID attributesID, const BufferBindings &buffers, Texture *texture) = 0;\n\n\tvoid flushBatchedDraws();\n\tBatchedVertexData requestBatchedDraw(const BatchedDrawCommand &command);\n\n\tstatic void flushBatchedDrawsGlobal();\n\n\tTexture *getTemporaryTexture(PixelFormat format, int w, int h, int samples);\n\tvoid releaseTemporaryTexture(Texture *texture);\n\n\tBuffer *getTemporaryBuffer(size_t size, DataFormat format, uint32 usageflags, BufferDataUsage datausage);\n\tvoid releaseTemporaryBuffer(Buffer *buffer);\n\n\tvoid cleanupCachedShaderStage(ShaderStageType type, const std::string &cachekey);\n\n\tvoid validateIndirectArgsBuffer(IndirectArgsType argstype, Buffer *indirectargs, int argsindex);\n\n\tVertexAttributesID registerVertexAttributes(const VertexAttributes &attributes);\n\tbool findVertexAttributes(VertexAttributesID id, VertexAttributes &attributes);\n\n\ttemplate <typename T>\n\tT *getScratchBuffer(size_t count)\n\t{\n\t\tsize_t bytes = sizeof(T) * count;\n\n\t\tif (scratchBuffer.size() < bytes)\n\t\t\tscratchBuffer.resize(bytes);\n\n\t\treturn (T *) scratchBuffer.data();\n\t}\n\n\t// Workaround for some very old nvidia drivers that aren't compliant with the GLSL 3.30 spec.\n\tbool isUsingNoTextureCubeShadowBiasHack() const { return usingNoTextureCubeShadowBiasHack; }\n\n\tstatic Graphics *createInstance();\n\n\tSTRINGMAP_CLASS_DECLARE(DrawMode);\n\tSTRINGMAP_CLASS_DECLARE(ArcMode);\n\tSTRINGMAP_CLASS_DECLARE(LineStyle);\n\tSTRINGMAP_CLASS_DECLARE(LineJoin);\n\tSTRINGMAP_CLASS_DECLARE(Feature);\n\tSTRINGMAP_CLASS_DECLARE(SystemLimit);\n\tSTRINGMAP_CLASS_DECLARE(StackType);\n\nprotected:\n\n\tstruct DisplayState\n\t{\n\t\tDisplayState();\n\n\t\tColorf color = Colorf(1.0, 1.0, 1.0, 1.0);\n\t\tColorf backgroundColor = Colorf(0.0, 0.0, 0.0, 1.0);\n\n\t\tBlendState blend = computeBlendState(BLEND_ALPHA, BLENDALPHA_MULTIPLY);\n\n\t\tfloat lineWidth = 1.0f;\n\t\tLineStyle lineStyle = LINE_SMOOTH;\n\t\tLineJoin lineJoin = LINE_JOIN_MITER;\n\n\t\tfloat pointSize = 1.0f;\n\n\t\tbool scissor = false;\n\t\tRect scissorRect = Rect();\n\n\t\tStencilState stencil;\n\n\t\tCompareMode depthTest = COMPARE_ALWAYS;\n\t\tbool depthWrite = false;\n\n\t\tCullMode meshCullMode = CULL_NONE;\n\t\tWinding winding = WINDING_CCW;\n\n\t\tStrongRef<Font> font;\n\t\tStrongRef<Shader> shader;\n\n\t\tRenderTargetsStrongRef renderTargets;\n\n\t\tColorChannelMask colorMask;\n\n\t\tbool wireframe = false;\n\n\t\tbool useCustomProjection = false;\n\t\tMatrix4 customProjection;\n\n\t\t// Default mipmap filter is set in the DisplayState constructor.\n\t\tSamplerState defaultSamplerState = SamplerState();\n\t};\n\n\tstruct BatchedDrawState\n\t{\n\t\tStreamBuffer *vb[2] = {};\n\t\tStreamBuffer *indexBuffer = nullptr;\n\n\t\tPrimitiveType primitiveMode = PRIMITIVE_TRIANGLES;\n\t\tCommonFormat formats[2] = {};\n\t\tStrongRef<Texture> texture;\n\t\tShader::StandardShader standardShaderType = Shader::STANDARD_DEFAULT;\n\t\tint vertexCount = 0;\n\t\tint indexCount = 0;\n\n\t\tVertexAttributesID attributesIDs[(int)CommonFormat::COUNT][(int)CommonFormat::COUNT] = {};\n\n\t\tStreamBuffer::MapInfo vbMap[2] = {};\n\t\tStreamBuffer::MapInfo indexBufferMap = StreamBuffer::MapInfo();\n\n\t\tbool flushing = false;\n\t};\n\n\tstruct TemporaryBuffer\n\t{\n\t\tBuffer *buffer;\n\t\tsize_t size;\n\t\tint framesSinceUse;\n\n\t\tTemporaryBuffer(Buffer *buf, size_t size)\n\t\t\t: buffer(buf)\n\t\t\t, size(size)\n\t\t\t, framesSinceUse(-1)\n\t\t{}\n\t};\n\n\tstruct TemporaryTexture\n\t{\n\t\tTexture *texture;\n\t\tint framesSinceUse;\n\n\t\tTemporaryTexture(Texture *tex)\n\t\t\t: texture(tex)\n\t\t\t, framesSinceUse(-1)\n\t\t{}\n\t};\n\n\tShaderStage *newShaderStage(ShaderStageType stage, const std::string &source, const Shader::CompileOptions &options, const Shader::SourceInfo &info, bool cache);\n\tvirtual ShaderStage *newShaderStageInternal(ShaderStageType stage, const std::string &cachekey, const std::string &source, bool gles) = 0;\n\tvirtual Shader *newShaderInternal(StrongRef<ShaderStage> stages[SHADERSTAGE_MAX_ENUM], const Shader::CompileOptions &options) = 0;\n\tvirtual StreamBuffer *newStreamBuffer(BufferUsage type, size_t size) = 0;\n\n\tvirtual GraphicsReadback *newReadbackInternal(ReadbackMethod method, Buffer *buffer, size_t offset, size_t size, data::ByteData *dest, size_t destoffset) = 0;\n\tvirtual GraphicsReadback *newReadbackInternal(ReadbackMethod method, Texture *texture, int slice, int mipmap, const Rect &rect, image::ImageData *dest, int destx, int desty) = 0;\n\n\tvirtual bool dispatch(Shader *shader, int x, int y, int z) = 0;\n\tvirtual bool dispatch(Shader *shader, Buffer *indirectargs, size_t argsoffset) = 0;\n\n\tvirtual void setRenderTargetsInternal(const RenderTargets &rts, int pixelw, int pixelh, bool hasSRGBtexture) = 0;\n\n\tvirtual void initCapabilities() = 0;\n\tvirtual void getAPIStats(int &shaderswitches) const = 0;\n\n\tvoid createQuadIndexBuffer();\n\tvoid createFanIndexBuffer();\n\n\tvoid updateTemporaryResources();\n\tvoid clearTemporaryResources();\n\n\tvoid updatePendingReadbacks();\n\n\tvoid releaseDefaultResources();\n\n\tvoid validateStencilState(const StencilState &s) const;\n\tvoid validateDepthState(bool depthwrite) const;\n\n\tvoid restoreState(const DisplayState &s);\n\tvoid restoreStateChecked(const DisplayState &s);\n\n\tvoid pushTransform();\n\tvoid pushIdentityTransform();\n\tvoid popTransform();\n\n\tvoid updateDeviceProjection(const Matrix4 &projection);\n\n\tint width;\n\tint height;\n\tint pixelWidth;\n\tint pixelHeight;\n\n\tbool backbufferHasStencil;\n\tbool backbufferHasDepth;\n\n\tbool created;\n\tbool active;\n\n\tStrongRef<love::graphics::Font> defaultFont;\n\n\tstd::vector<ScreenshotInfo> pendingScreenshotCallbacks;\n\tstd::vector<StrongRef<GraphicsReadback>> pendingReadbacks;\n\n\tBatchedDrawState batchedDrawState;\n\n\tstd::vector<Matrix4> transformStack;\n\tMatrix4 deviceProjectionMatrix;\n\n\tstd::vector<double> pixelScaleStack;\n\n\tstd::vector<DisplayState> states;\n\tstd::vector<StackType> stackTypeStack;\n\n\tstd::vector<TemporaryBuffer> temporaryBuffers;\n\tstd::vector<TemporaryTexture> temporaryTextures;\n\n\tint renderTargetSwitchCount;\n\tint drawCalls;\n\tint drawCallsBatched;\n\n\tBuffer *quadIndexBuffer;\n\tBuffer *fanIndexBuffer;\n\n\tCapabilities capabilities;\n\n\tDeprecations deprecations;\n\n\tbool usingNoTextureCubeShadowBiasHack = false;\n\n\tstatic const size_t MAX_USER_STACK_DEPTH = 128;\n\tstatic const int MAX_TEMPORARY_RESOURCE_UNUSED_FRAMES = 16;\n\nprivate:\n\n\tvoid checkSetDefaultFont();\n\tint calculateEllipsePoints(float rx, float ry) const;\n\n\tTexture *defaultTextures[TEXTURE_MAX_ENUM][DATA_BASETYPE_MAX_ENUM][2];\n\tBuffer *defaultTexelBuffers[DATA_BASETYPE_MAX_ENUM];\n\tBuffer *defaultStorageBuffer;\n\n\tstd::vector<uint8> scratchBuffer;\n\n\tstd::unordered_map<std::string, ShaderStage *> cachedShaderStages[SHADERSTAGE_MAX_ENUM];\n\n\tstd::vector<VertexAttributes> vertexAttributesDatabase;\n\n\tVertexAttributesID noAttributesID;\n\n}; // Graphics\n\nSTRINGMAP_DECLARE(Renderer);\n\n} // graphics\n} // love\n\n#endif // LOVE_GRAPHICS_GRAPHICS_H\n"
  },
  {
    "path": "src/modules/graphics/GraphicsReadback.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"GraphicsReadback.h\"\n#include \"Buffer.h\"\n#include \"Texture.h\"\n#include \"Graphics.h\"\n#include \"data/ByteData.h\"\n#include \"image/ImageData.h\"\n#include \"image/Image.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nlove::Type GraphicsReadback::type(\"GraphicsReadback\", &Object::type);\n\nGraphicsReadback::GraphicsReadback(Graphics */*gfx*/, ReadbackMethod method, Buffer *buffer, size_t offset, size_t size, love::data::ByteData *dest, size_t destoffset)\n\t: dataType(DATA_BUFFER)\n\t, method(method)\n\t, bufferData(dest)\n{\n\tif (offset + size > buffer->getSize())\n\t\tthrow love::Exception(\"Invalid offset or size for the given Buffer.\");\n\n\tif (dest != nullptr && destoffset + size > dest->getSize())\n\t\tthrow love::Exception(\"Invalid destination offset or size for the given ByteData.\");\n\n\tbufferDataOffset = dest != nullptr ? destoffset : 0;\n}\n\nGraphicsReadback::GraphicsReadback(Graphics *gfx, ReadbackMethod method, Texture *texture, int slice, int mipmap, const Rect &rect, love::image::ImageData *dest, int destx, int desty)\n\t: dataType(DATA_TEXTURE)\n\t, method(method)\n\t, imageData(dest)\n\t, rect(rect)\n{\n\tconst auto &caps = gfx->getCapabilities();\n\n\tif (gfx->isRenderTargetActive(texture))\n\t\tthrow love::Exception(\"readbackTexture cannot be called while that Texture is an active render target.\");\n\n\tif (!texture->isReadable())\n\t\tthrow love::Exception(\"readbackTexture requires a readable Texture.\");\n\n\tint tw = texture->getPixelWidth(mipmap);\n\tint th = texture->getPixelHeight(mipmap);\n\tauto texType = texture->getTextureType();\n\n\tif (rect.x < 0 || rect.y < 0 || rect.w <= 0 || rect.h <= 0 || (rect.x + rect.w) > tw || (rect.y + rect.h) > th)\n\t\tthrow love::Exception(\"Invalid rectangle dimensions.\");\n\n\tif (slice < 0 || (texType == TEXTURE_VOLUME && slice >= texture->getDepth(mipmap))\n\t\t|| (texType == TEXTURE_2D_ARRAY && slice >= texture->getLayerCount())\n\t\t|| (texType == TEXTURE_CUBE && slice >= 6))\n\t{\n\t\tthrow love::Exception(\"Invalid slice index.\");\n\t}\n\n\ttextureFormat = getLinearPixelFormat(texture->getPixelFormat());\n\tisFormatLinear = isGammaCorrect() && !isPixelFormatSRGB(texture->getPixelFormat());\n\n\tif (!image::ImageData::validPixelFormat(textureFormat))\n\t{\n\t\tconst char *formatname = \"unknown\";\n\t\tlove::getConstant(textureFormat, formatname);\n\t\tthrow love::Exception(\"ImageData with the '%s' pixel format is not supported.\", formatname);\n\t}\n\n\tbool isRT = texture->isRenderTarget();\n\n\tif (method == READBACK_ASYNC)\n\t{\n\t\tif (!isRT && !caps.features[Graphics::FEATURE_COPY_TEXTURE_TO_BUFFER])\n\t\t\tthrow love::Exception(\"readbackTextureAsync with a non-render-target texture is not supported on this system.\");\n\t}\n\telse\n\t{\n\t\tif (!isRT && !caps.features[Graphics::FEATURE_COPY_TEXTURE_TO_BUFFER])\n\t\t\tthrow love::Exception(\"readbackTexture with a non-render-target texture is not supported on this system.\");\n\t}\n\n\tif (dest != nullptr)\n\t{\n\t\tif (getLinearPixelFormat(dest->getFormat()) != textureFormat)\n\t\t\tthrow love::Exception(\"Destination ImageData pixel format must match the source Texture's format.\");\n\n\t\tif (destx < 0 || desty < 0)\n\t\t\tthrow love::Exception(\"Invalid destination ImageData x/y coordinates.\");\n\n\t\tif (destx + rect.w > dest->getWidth() || desty + rect.h > dest->getHeight())\n\t\t\tthrow love::Exception(\"The specified rectangle does not fit within the destination ImageData's dimensions.\");\n\t}\n\n\timageDataX = dest != nullptr ? destx : 0;\n\timageDataY = dest != nullptr ? desty : 0;\n}\n\nGraphicsReadback::~GraphicsReadback()\n{\n}\n\nlove::data::ByteData *GraphicsReadback::getBufferData() const\n{\n\tif (!isComplete())\n\t\treturn nullptr;\n\treturn bufferData;\n}\n\nlove::image::ImageData *GraphicsReadback::getImageData() const\n{\n\tif (!isComplete())\n\t\treturn nullptr;\n\treturn imageData;\n}\n\nvoid *GraphicsReadback::prepareReadbackDest(size_t size)\n{\n\tif (dataType == DATA_TEXTURE)\n\t{\n\t\tif (imageData.get())\n\t\t{\n\t\t\t// Not the cleanest, but should work since uncompressed formats always\n\t\t\t// have 1x1 blocks.\n\t\t\tint pixels = imageDataY * imageData->getWidth() + imageDataX;\n\t\t\tsize_t offset = getPixelFormatUncompressedRowSize(textureFormat, pixels);\n\n\t\t\treturn (uint8 *) imageData->getData() + offset;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tauto module = Module::getInstance<image::Image>(Module::M_IMAGE);\n\t\t\tif (module == nullptr)\n\t\t\t\tthrow love::Exception(\"The love.image module must be loaded for readbackTexture.\");\n\n\t\t\timageData.set(module->newImageData(rect.w, rect.h, textureFormat, nullptr), Acquire::NORETAIN);\n\t\t\timageData->setLinear(isFormatLinear);\n\t\t\treturn imageData->getData();\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (!bufferData.get())\n\t\t\tbufferData.set(new love::data::ByteData(size, false), Acquire::NORETAIN);\n\n\t\treturn (uint8 *) bufferData->getData() + bufferDataOffset;\n\t}\n}\n\nGraphicsReadback::Status GraphicsReadback::readbackBuffer(Buffer *buffer, size_t offset, size_t size)\n{\n\tif (buffer == nullptr)\n\t\treturn STATUS_ERROR;\n\n\tconst void *data = buffer->map(Buffer::MAP_READ_ONLY, offset, size);\n\n\tif (data == nullptr)\n\t\treturn STATUS_ERROR;\n\n\tbool success = true;\n\n\ttry\n\t{\n\t\tvoid *dest = prepareReadbackDest(size);\n\t\tif (dest == nullptr)\n\t\t\treturn STATUS_ERROR;\n\n\t\tif (imageData.get())\n\t\t{\n\t\t\t// Always lock the mutex since the user can't know when to do it.\n\t\t\tlove::thread::Lock lock(imageData->getMutex());\n\n\t\t\tif (imageData->getWidth() != rect.w)\n\t\t\t{\n\t\t\t\t// Readback of compressed textures into ImageData isn't supported,\n\t\t\t\t// so this is fine.\n\t\t\t\tsize_t stride = getPixelFormatUncompressedRowSize(textureFormat, imageData->getWidth());\n\t\t\t\tsize_t rowsize = getPixelFormatUncompressedRowSize(textureFormat, rect.w);\n\n\t\t\t\tfor (int i = 0; i < rect.h; i++)\n\t\t\t\t{\n\t\t\t\t\tmemcpy(dest, data, rowsize);\n\t\t\t\t\tdest = (uint8 *) dest + stride;\n\t\t\t\t\tdata = (uint8 *) data + rowsize;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tmemcpy(dest, data, std::min(size, imageData->getSize()));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmemcpy(dest, data, std::min(size, bufferData->getSize()));\n\t\t}\n\t}\n\tcatch (love::Exception &)\n\t{\n\t\tsuccess = false;\n\t}\n\n\tbuffer->unmap(offset, size);\n\treturn success ? STATUS_COMPLETE : STATUS_ERROR;\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/GraphicsReadback.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/int.h\"\n#include \"common/math.h\"\n#include \"common/Object.h\"\n#include \"common/StringMap.h\"\n#include \"common/pixelformat.h\"\n\nnamespace love::image\n{\nclass ImageData;\nclass CompressedImageData;\n}\n\nnamespace love::data\n{\nclass ByteData;\n}\n\nnamespace love\n{\nnamespace graphics\n{\n\nclass Buffer;\nclass Texture;\nclass Graphics;\n\nenum ReadbackMethod\n{\n\tREADBACK_IMMEDIATE,\n\tREADBACK_ASYNC,\n};\n\nclass GraphicsReadback : public love::Object\n{\npublic:\n\n\tenum Status\n\t{\n\t\tSTATUS_WAITING,\n\t\tSTATUS_COMPLETE,\n\t\tSTATUS_ERROR,\n\t\tSTATUS_MAX_ENUM\n\t};\n\n\tstatic love::Type type;\n\n\tGraphicsReadback(Graphics *gfx, ReadbackMethod method, Buffer *buffer, size_t offset, size_t size, love::data::ByteData *dest, size_t destoffset);\n\tGraphicsReadback(Graphics *gfx, ReadbackMethod method, Texture *texture, int slice, int mipmap, const Rect &rect, love::image::ImageData *dest, int destx, int desty);\n\tvirtual ~GraphicsReadback();\n\n\tvirtual void wait() = 0;\n\tvirtual void update() = 0;\n\n\tbool isComplete() const { return status != STATUS_WAITING; }\n\tReadbackMethod getMethod() const { return method; }\n\tbool hasError() const { return status == STATUS_ERROR; }\n\n\tlove::data::ByteData *getBufferData() const;\n\tlove::image::ImageData *getImageData() const;\n\nprotected:\n\n\tenum DataType\n\t{\n\t\tDATA_BUFFER,\n\t\tDATA_TEXTURE,\n\t};\n\n\tvoid *prepareReadbackDest(size_t size);\n\tStatus readbackBuffer(Buffer *buffer, size_t offset, size_t size);\n\n\tDataType dataType;\n\tReadbackMethod method;\n\tStatus status = STATUS_WAITING;\n\n\tStrongRef<love::data::ByteData> bufferData;\n\tsize_t bufferDataOffset = 0;\n\n\tStrongRef<love::image::ImageData> imageData;\n\tRect rect = {};\n\tPixelFormat textureFormat = PIXELFORMAT_UNKNOWN;\n\tbool isFormatLinear = false;\n\tint imageDataX = 0;\n\tint imageDataY = 0;\n\n}; // GraphicsReadback\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/Mesh.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"Mesh.h\"\n#include \"common/Matrix.h\"\n#include \"common/Exception.h\"\n#include \"Shader.h\"\n#include \"Graphics.h\"\n\n// C++\n#include <algorithm>\n#include <limits>\n\nnamespace love\n{\nnamespace graphics\n{\n\nstatic_assert(offsetof(Vertex, x) == sizeof(float) * 0, \"Incorrect position offset in Vertex struct\");\nstatic_assert(offsetof(Vertex, s) == sizeof(float) * 2, \"Incorrect texture coordinate offset in Vertex struct\");\nstatic_assert(offsetof(Vertex, color.r) == sizeof(float) * 4, \"Incorrect color offset in Vertex struct\");\n\nstd::vector<Buffer::DataDeclaration> Mesh::getDefaultVertexFormat()\n{\n\treturn Buffer::getCommonFormatDeclaration(CommonFormat::XYf_STf_RGBAub);\n}\n\nlove::Type Mesh::type(\"Mesh\", &Drawable::type);\n\nMesh::Mesh(graphics::Graphics *gfx, const std::vector<Buffer::DataDeclaration> &vertexformat, const void *data, size_t datasize, PrimitiveType drawmode, BufferDataUsage usage)\n\t: primitiveType(drawmode)\n{\n\ttry\n\t{\n\t\tvertexData = new uint8[datasize];\n\t}\n\tcatch (std::exception &)\n\t{\n\t\tthrow love::Exception(\"Out of memory\");\n\t}\n\n\tmemcpy(vertexData, data, datasize);\n\n\tBuffer::Settings settings(BUFFERUSAGEFLAG_VERTEX, usage);\n\tvertexBuffer.set(gfx->newBuffer(settings, vertexformat, vertexData, datasize, 0), Acquire::NORETAIN);\n\n\tvertexCount = vertexBuffer->getArrayLength();\n\tvertexStride = vertexBuffer->getArrayStride();\n\tvertexFormat = vertexBuffer->getDataMembers();\n\n\tsetupAttachedAttributes();\n\n\tindexDataType = getIndexDataTypeFromMax(vertexCount);\n}\n\nMesh::Mesh(graphics::Graphics *gfx, const std::vector<Buffer::DataDeclaration> &vertexformat, int vertexcount, PrimitiveType drawmode, BufferDataUsage usage)\n\t: vertexCount((size_t) vertexcount)\n\t, indexDataType(getIndexDataTypeFromMax(vertexcount))\n\t, primitiveType(drawmode)\n{\n\tif (vertexcount <= 0)\n\t\tthrow love::Exception(\"Invalid number of vertices (%d).\", vertexcount);\n\n\tBuffer::Settings settings(BUFFERUSAGEFLAG_VERTEX, usage);\n\tvertexBuffer.set(gfx->newBuffer(settings, vertexformat, nullptr, 0, vertexcount), Acquire::NORETAIN);\n\n\tvertexStride = vertexBuffer->getArrayStride();\n\tvertexFormat = vertexBuffer->getDataMembers();\n\n\tsetupAttachedAttributes();\n\n\ttry\n\t{\n\t\tvertexData = new uint8[vertexBuffer->getSize()];\n\t}\n\tcatch (std::exception &)\n\t{\n\t\tthrow love::Exception(\"Out of memory\");\n\t}\n\n\tmemset(vertexData, 0, vertexBuffer->getSize());\n\tvertexBuffer->fill(0, vertexBuffer->getSize(), vertexData);\n}\n\nMesh::Mesh(const std::vector<Mesh::BufferAttribute> &attributes, PrimitiveType drawmode)\n\t: primitiveType(drawmode)\n{\n\tif (attributes.size() == 0)\n\t\tthrow love::Exception(\"At least one buffer attribute must be specified in this constructor.\");\n\n\tattachedAttributes = attributes;\n\tvertexCount = attachedAttributes.size() > 0 ? LOVE_UINT32_MAX : 0;\n\n\tfor (int i = 0; i < (int) attachedAttributes.size(); i++)\n\t{\n\t\tauto &attrib = attachedAttributes[i];\n\n\t\tfinalizeAttribute(attrib);\n\n\t\tif (attrib.bindingLocation >= 0)\n\t\t{\n\t\t\tint attributeIndex = getAttachedAttributeIndex(attrib.bindingLocation);\n\t\t\tif (attributeIndex != i && attributeIndex != -1)\n\t\t\t\tthrow love::Exception(\"Duplicate vertex attribute binding location: %d\", attrib.bindingLocation);\n\t\t}\n\n\t\tif (!attrib.name.empty())\n\t\t{\n\t\t\tint attributeIndex = getAttachedAttributeIndex(attrib.name);\n\t\t\tif (attributeIndex != i && attributeIndex != -1)\n\t\t\t\tthrow love::Exception(\"Duplicate vertex attribute name: %s\", attrib.name.c_str());\n\t\t}\n\n\t\tvertexCount = std::min(vertexCount, attrib.buffer->getArrayLength());\n\t}\n\n\tindexDataType = getIndexDataTypeFromMax(vertexCount);\n}\n\nMesh::~Mesh()\n{\n\tdelete vertexData;\n\tif (indexData != nullptr)\n\t\tfree(indexData);\n}\n\nvoid Mesh::setupAttachedAttributes()\n{\n\tfor (size_t i = 0; i < vertexFormat.size(); i++)\n\t{\n\t\tconst std::string &name = vertexFormat[i].decl.name;\n\t\tint bindingLocation = vertexFormat[i].decl.bindingLocation;\n\n\t\tif (bindingLocation >= 0)\n\t\t{\n\t\t\tif (getAttachedAttributeIndex(bindingLocation) != -1)\n\t\t\t\tthrow love::Exception(\"Duplicate vertex attribute binding location: %d\", bindingLocation);\n\t\t}\n\n\t\tif (!name.empty())\n\t\t{\n\t\t\tif (getAttachedAttributeIndex(name) != -1)\n\t\t\t\tthrow love::Exception(\"Duplicate vertex attribute name: %s\", name.c_str());\n\t\t}\n\n\t\tif (bindingLocation < 0)\n\t\t{\n\t\t\tBuiltinVertexAttribute builtinattrib;\n\t\t\tif (getConstant(name.c_str(), builtinattrib))\n\t\t\t\tbindingLocation = (int)builtinattrib;\n\t\t}\n\n\t\tattachedAttributes.push_back({name, vertexBuffer, nullptr, name, bindingLocation, (int) i, 0, STEP_PER_VERTEX, bindingLocation, true});\n\t}\n}\n\nint Mesh::getAttachedAttributeIndex(const std::string &name) const\n{\n\tfor (int i = 0; i < (int) attachedAttributes.size(); i++)\n\t{\n\t\tif (attachedAttributes[i].name == name)\n\t\t\treturn i;\n\t}\n\n\treturn -1;\n}\n\nint Mesh::getAttachedAttributeIndex(int bindingLocation) const\n{\n\tfor (int i = 0; i < (int)attachedAttributes.size(); i++)\n\t{\n\t\tif (attachedAttributes[i].bindingLocation == bindingLocation)\n\t\t\treturn i;\n\t}\n\n\treturn -1;\n}\n\nvoid Mesh::finalizeAttribute(BufferAttribute &attrib) const\n{\n\tif ((attrib.buffer->getUsageFlags() & BUFFERUSAGEFLAG_VERTEX) == 0)\n\t\tthrow love::Exception(\"Buffer must be created with vertex buffer support to be used as a Mesh vertex attribute.\");\n\n\tif (attrib.startArrayIndex < 0 || attrib.startArrayIndex >= (int)attrib.buffer->getArrayLength())\n\t\tthrow love::Exception(\"Invalid start array index %d.\", attrib.startArrayIndex + 1);\n\n\tif (attrib.bindingLocationInBuffer >= 0)\n\t{\n\t\tint indexInBuffer = attrib.buffer->getDataMemberIndex(attrib.bindingLocationInBuffer);\n\t\tif (indexInBuffer < 0)\n\t\t\tthrow love::Exception(\"Buffer does not have a vertex attribute with binding location %d.\", attrib.bindingLocationInBuffer);\n\t\tattrib.indexInBuffer = indexInBuffer;\n\t}\n\telse\n\t{\n\t\tint indexInBuffer = attrib.buffer->getDataMemberIndex(attrib.nameInBuffer);\n\t\tif (indexInBuffer < 0)\n\t\t\tthrow love::Exception(\"Buffer does not have a vertex attribute with name '%s'.\", attrib.nameInBuffer.c_str());\n\t\tattrib.indexInBuffer = indexInBuffer;\n\t}\n\n\tif (attrib.bindingLocation < 0)\n\t\tattrib.bindingLocation = attrib.buffer->getDataMember(attrib.indexInBuffer).decl.bindingLocation;\n\n\tif (attrib.bindingLocation < 0)\n\t{\n\t\tBuiltinVertexAttribute builtinattrib;\n\t\tif (getConstant(attrib.name.c_str(), builtinattrib))\n\t\t\tattrib.bindingLocation = (int)builtinattrib;\n\t}\n\n\tif (attrib.bindingLocation >= (int) VertexAttributes::MAX || (attrib.bindingLocation < 0 && attrib.name.empty()))\n\t\tthrow love::Exception(\"Vertex attributes must have a valid binding location value within [0, %d).\", VertexAttributes::MAX);\n}\n\nvoid *Mesh::checkVertexDataOffset(size_t vertindex, size_t *byteoffset)\n{\n\tif (vertindex >= vertexCount)\n\t\tthrow love::Exception(\"Invalid vertex index: %ld\", vertindex + 1);\n\n\tif (vertexData == nullptr)\n\t\tthrow love::Exception(\"Mesh must own its own vertex buffer.\");\n\n\tsize_t offset = vertindex * vertexStride;\n\n\tif (byteoffset != nullptr)\n\t\t*byteoffset = offset;\n\treturn vertexData + offset;\n}\n\nsize_t Mesh::getVertexCount() const\n{\n\treturn vertexCount;\n}\n\nsize_t Mesh::getVertexStride() const\n{\n\treturn vertexStride;\n}\n\nBuffer *Mesh::getVertexBuffer() const\n{\n\treturn vertexBuffer;\n}\n\nconst std::vector<Buffer::DataMember> &Mesh::getVertexFormat() const\n{\n\treturn vertexFormat;\n}\n\nvoid Mesh::setAttributeEnabled(const std::string &name, bool enable)\n{\n\tint index = getAttachedAttributeIndex(name);\n\tif (index == -1)\n\t\tthrow love::Exception(\"Mesh does not have an attached vertex attribute named '%s'\", name.c_str());\n\n\tattachedAttributes[index].enabled = enable;\n\tattributesID.invalidate();\n}\n\nbool Mesh::isAttributeEnabled(const std::string &name) const\n{\n\tint index = getAttachedAttributeIndex(name);\n\tif (index == -1)\n\t\tthrow love::Exception(\"Mesh does not have an attached vertex attribute named '%s'\", name.c_str());\n\n\treturn attachedAttributes[index].enabled;\n}\n\nvoid Mesh::setAttributeEnabled(int bindingLocation, bool enable)\n{\n\tint index = getAttachedAttributeIndex(bindingLocation);\n\tif (index == -1)\n\t\tthrow love::Exception(\"Mesh does not have an attached vertex attribute with binding location %d\", bindingLocation);\n\n\tattachedAttributes[index].enabled = enable;\n\tattributesID.invalidate();\n}\n\nbool Mesh::isAttributeEnabled(int bindingLocation) const\n{\n\tint index = getAttachedAttributeIndex(bindingLocation);\n\tif (index == -1)\n\t\tthrow love::Exception(\"Mesh does not have an attached vertex attribute with binding location %d\", bindingLocation);\n\n\treturn attachedAttributes[index].enabled;\n}\n\nvoid Mesh::attachAttribute(const std::string &name, Buffer *buffer, Mesh *mesh, const std::string &attachname, int startindex, AttributeStep step)\n{\n\tBufferAttribute oldattrib;\n\tBufferAttribute newattrib;\n\n\tint oldindex = getAttachedAttributeIndex(name);\n\tif (oldindex != -1)\n\t\toldattrib = attachedAttributes[oldindex];\n\telse if (attachedAttributes.size() + 1 > VertexAttributes::MAX)\n\t\tthrow love::Exception(\"A maximum of %d attributes can be attached at once.\", VertexAttributes::MAX);\n\n\tnewattrib.name = name;\n\tnewattrib.buffer = buffer;\n\tnewattrib.mesh = mesh;\n\tnewattrib.enabled = oldattrib.buffer.get() ? oldattrib.enabled : true;\n\tnewattrib.nameInBuffer = attachname;\n\tnewattrib.indexInBuffer = -1;\n\tnewattrib.startArrayIndex = startindex;\n\tnewattrib.step = step;\n\n\tfinalizeAttribute(newattrib);\n\n\tif (oldindex != -1)\n\t\tattachedAttributes[oldindex] = newattrib;\n\telse\n\t\tattachedAttributes.push_back(newattrib);\n\n\tattributesID.invalidate();\n}\n\nvoid Mesh::attachAttribute(int bindingLocation, Buffer *buffer, Mesh *mesh, int attachBindingLocation, int startindex, AttributeStep step)\n{\n\tBufferAttribute oldattrib;\n\tBufferAttribute newattrib;\n\n\tint oldindex = getAttachedAttributeIndex(bindingLocation);\n\tif (oldindex != -1)\n\t\toldattrib = attachedAttributes[oldindex];\n\telse if (attachedAttributes.size() + 1 > VertexAttributes::MAX)\n\t\tthrow love::Exception(\"A maximum of %d attributes can be attached at once.\", VertexAttributes::MAX);\n\n\tnewattrib.bindingLocation = bindingLocation;\n\tnewattrib.buffer = buffer;\n\tnewattrib.mesh = mesh;\n\tnewattrib.enabled = oldattrib.buffer.get() ? oldattrib.enabled : true;\n\tnewattrib.bindingLocationInBuffer = attachBindingLocation;\n\tnewattrib.indexInBuffer = -1;\n\tnewattrib.startArrayIndex = startindex;\n\tnewattrib.step = step;\n\n\tfinalizeAttribute(newattrib);\n\n\tif (oldindex != -1)\n\t\tattachedAttributes[oldindex] = newattrib;\n\telse\n\t\tattachedAttributes.push_back(newattrib);\n\n\tattributesID.invalidate();\n}\n\nbool Mesh::detachAttribute(const std::string &name)\n{\n\tint index = getAttachedAttributeIndex(name);\n\tif (index == -1)\n\t\treturn false;\n\n\tattachedAttributes.erase(attachedAttributes.begin() + index);\n\n\tif (vertexBuffer.get() && vertexBuffer->getDataMemberIndex(name) != -1)\n\t\tattachAttribute(name, vertexBuffer, nullptr, name);\n\n\tattributesID.invalidate();\n\treturn true;\n}\n\nbool Mesh::detachAttribute(int bindingLocation)\n{\n\tint index = getAttachedAttributeIndex(bindingLocation);\n\tif (index == -1)\n\t\treturn false;\n\n\tattachedAttributes.erase(attachedAttributes.begin() + index);\n\n\tif (vertexBuffer.get() && vertexBuffer->getDataMemberIndex(bindingLocation) != -1)\n\t\tattachAttribute(bindingLocation, vertexBuffer, nullptr, bindingLocation);\n\n\tattributesID.invalidate();\n\treturn true;\n}\n\nconst std::vector<Mesh::BufferAttribute> &Mesh::getAttachedAttributes() const\n{\n\treturn attachedAttributes;\n}\n\nvoid *Mesh::getVertexData() const\n{\n\treturn vertexData;\n}\n\nvoid Mesh::setVertexDataModified(size_t offset, size_t size)\n{\n\tif (vertexData != nullptr)\n\t\tmodifiedVertexData.encapsulate(offset, size);\n}\n\nvoid Mesh::flush()\n{\n\tif (vertexBuffer.get() && vertexData != nullptr && modifiedVertexData.isValid())\n\t{\n\t\tif (vertexBuffer->getDataUsage() == BUFFERDATAUSAGE_STREAM)\n\t\t{\n\t\t\tvertexBuffer->fill(0, vertexBuffer->getSize(), vertexData);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tsize_t offset = modifiedVertexData.getOffset();\n\t\t\tsize_t size = modifiedVertexData.getSize();\n\t\t\tvertexBuffer->fill(offset, size, vertexData + offset);\n\t\t}\n\n\t\tmodifiedVertexData.invalidate();\n\t}\n\n\tif (indexDataModified && indexData != nullptr && indexBuffer != nullptr)\n\t{\n\t\tindexBuffer->fill(0, indexBuffer->getSize(), indexData);\n\t\tindexDataModified = false;\n\t}\n}\n\n/**\n * Copies index data from a vector to a mapped index buffer.\n **/\ntemplate <typename T>\nstatic void copyToIndexBuffer(const std::vector<uint32> &indices, void *data, size_t maxval)\n{\n\tT *elems = (T *) data;\n\n\tfor (size_t i = 0; i < indices.size(); i++)\n\t{\n\t\tif (indices[i] >= maxval)\n\t\t\tthrow love::Exception(\"Invalid vertex map value: %d\", indices[i] + 1);\n\n\t\telems[i] = (T) indices[i];\n\t}\n}\n\nvoid Mesh::setVertexMap(const std::vector<uint32> &map)\n{\n\tif (map.empty())\n\t\tthrow love::Exception(\"Vertex map array must not be empty.\");\n\n\tsize_t maxval = getVertexCount();\n\n\tIndexDataType datatype = getIndexDataTypeFromMax(maxval);\n\tDataFormat dataformat = getIndexDataFormat(datatype);\n\n\t// Calculate the size in bytes of the index buffer data.\n\tsize_t size = map.size() * getIndexDataSize(datatype);\n\n\tbool recreate = indexData == nullptr || indexBuffer.get() == nullptr\n\t\t|| size > indexBuffer->getSize() || indexBuffer->getDataMember(0).decl.format != dataformat;\n\n\tif (recreate)\n\t{\n\t\tauto gfx = Module::getInstance<graphics::Graphics>(Module::M_GRAPHICS);\n\t\tauto usage = vertexBuffer.get() ? vertexBuffer->getDataUsage() : BUFFERDATAUSAGE_DYNAMIC;\n\t\tBuffer::Settings settings(BUFFERUSAGEFLAG_INDEX, usage);\n\t\tauto buffer = StrongRef<Buffer>(gfx->newBuffer(settings, dataformat, nullptr, size, 0), Acquire::NORETAIN);\n\n\t\tauto data = (uint8 *) realloc(indexData, size);\n\t\tif (data == nullptr)\n\t\t\tthrow love::Exception(\"Out of memory.\");\n\n\t\tindexData = data;\n\t\tindexBuffer = buffer;\n\t}\n\n\tindexCount = map.size();\n\tuseIndexBuffer = true;\n\tindexDataType = datatype;\n\n\tif (indexCount == 0)\n\t\treturn;\n\n\t// Fill the buffer with the index values from the vector.\n\tswitch (datatype)\n\t{\n\tcase INDEX_UINT16:\n\t\tcopyToIndexBuffer<uint16>(map, indexData, maxval);\n\t\tbreak;\n\tcase INDEX_UINT32:\n\tdefault:\n\t\tcopyToIndexBuffer<uint32>(map, indexData, maxval);\n\t\tbreak;\n\t}\n\n\tindexDataModified = true;\n}\n\nvoid Mesh::setVertexMap(IndexDataType datatype, const void *data, size_t datasize)\n{\n\tDataFormat dataformat = getIndexDataFormat(datatype);\n\n\tbool recreate = indexData == nullptr || indexBuffer.get() == nullptr\n\t\t|| datasize > indexBuffer->getSize() || indexBuffer->getDataMember(0).decl.format != dataformat;\n\n\tif (recreate)\n\t{\n\t\tauto gfx = Module::getInstance<graphics::Graphics>(Module::M_GRAPHICS);\n\t\tauto usage = vertexBuffer.get() ? vertexBuffer->getDataUsage() : BUFFERDATAUSAGE_DYNAMIC;\n\t\tBuffer::Settings settings(BUFFERUSAGEFLAG_INDEX, usage);\n\t\tauto buffer = StrongRef<Buffer>(gfx->newBuffer(settings, dataformat, nullptr, datasize, 0), Acquire::NORETAIN);\n\n\t\tauto data = (uint8 *) realloc(indexData, datasize);\n\t\tif (data == nullptr)\n\t\t\tthrow love::Exception(\"Out of memory.\");\n\n\t\tindexData = data;\n\t\tindexBuffer = buffer;\n\t}\n\n\tindexCount = datasize / getIndexDataSize(datatype);\n\tuseIndexBuffer = true;\n\tindexDataType = datatype;\n\n\tif (indexCount == 0)\n\t\treturn;\n\n\tmemcpy(indexData, data, datasize);\n\tindexDataModified = true;\n}\n\nvoid Mesh::setVertexMap()\n{\n\tuseIndexBuffer = false;\n}\n\n/**\n * Copies index data from a mapped buffer to a vector.\n **/\ntemplate <typename T>\nstatic void copyFromIndexBuffer(const void *buffer, size_t count, std::vector<uint32> &indices)\n{\n\tconst T *elems = (const T *) buffer;\n\tfor (size_t i = 0; i < count; i++)\n\t\tindices.push_back((uint32) elems[i]);\n}\n\nbool Mesh::getVertexMap(std::vector<uint32> &map) const\n{\n\tif (!useIndexBuffer)\n\t\treturn false;\n\n\tmap.clear();\n\n\tif (indexData == nullptr || indexCount == 0)\n\t\treturn true;\n\n\tmap.reserve(indexCount);\n\n\t// Fill the vector from the buffer.\n\tswitch (indexDataType)\n\t{\n\tcase INDEX_UINT16:\n\t\tcopyFromIndexBuffer<uint16>(indexData, indexCount, map);\n\t\tbreak;\n\tcase INDEX_UINT32:\n\tdefault:\n\t\tcopyFromIndexBuffer<uint32>(indexData, indexCount, map);\n\t\tbreak;\n\t}\n\n\treturn true;\n}\n\nvoid Mesh::setIndexBuffer(Buffer *buffer)\n{\n\t// Buffer constructor does the rest of the validation for index buffers\n\t// (data member formats, etc.)\n\tif (buffer != nullptr && (buffer->getUsageFlags() & BUFFERUSAGEFLAG_INDEX) == 0)\n\t\tthrow love::Exception(\"setIndexBuffer requires a Buffer created as an index buffer.\");\n\n\tindexBuffer.set(buffer);\n\tuseIndexBuffer = buffer != nullptr;\n\tindexCount = buffer != nullptr ? buffer->getArrayLength() : 0;\n\n\tif (buffer != nullptr)\n\t\tindexDataType = getIndexDataType(buffer->getDataMember(0).decl.format);\n\n\tif (indexData != nullptr)\n\t{\n\t\tfree(indexData);\n\t\tindexData = nullptr;\n\t}\n}\n\nBuffer *Mesh::getIndexBuffer() const\n{\n\treturn indexBuffer;\n}\n\nsize_t Mesh::getIndexCount() const\n{\n\treturn indexCount;\n}\n\nvoid Mesh::setTexture(Texture *tex)\n{\n\ttexture.set(tex);\n}\n\nvoid Mesh::setTexture()\n{\n\ttexture.set(nullptr);\n}\n\nTexture *Mesh::getTexture() const\n{\n\treturn texture.get();\n}\n\nvoid Mesh::setDrawMode(PrimitiveType mode)\n{\n\tprimitiveType = mode;\n}\n\nPrimitiveType Mesh::getDrawMode() const\n{\n\treturn primitiveType;\n}\n\nvoid Mesh::setDrawRange(int start, int count)\n{\n\tif (start < 0 || count <= 0)\n\t\tthrow love::Exception(\"Invalid draw range.\");\n\n\tdrawRange = Range(start, count);\n}\n\nvoid Mesh::setDrawRange()\n{\n\tdrawRange.invalidate();\n}\n\nbool Mesh::getDrawRange(int &start, int &count) const\n{\n\tif (!drawRange.isValid())\n\t\treturn false;\n\n\tstart = (int) drawRange.getOffset();\n\tcount = (int) drawRange.getSize();\n\treturn true;\n}\n\nvoid Mesh::updateVertexAttributes(Graphics *gfx)\n{\n\tVertexAttributes attributes;\n\tBufferBindings &buffers = bufferBindings;\n\n\tint activebuffers = 0;\n\n\tfor (const auto &attrib : attachedAttributes)\n\t{\n\t\tif (!attrib.enabled)\n\t\t\tcontinue;\n\n\t\tBuffer *buffer = attrib.buffer.get();\n\t\tint bindinglocation = attrib.bindingLocation;\n\n\t\t// Query the index from the shader as a fallback to support old code that\n\t\t// hasn't set a binding location.\n\t\tif (bindinglocation < 0 && Shader::current)\n\t\t\tbindinglocation = Shader::current->getVertexAttributeIndex(attrib.name);\n\n\t\tif (bindinglocation >= 0)\n\t\t{\n\t\t\tconst auto &member = buffer->getDataMember(attrib.indexInBuffer);\n\n\t\t\tuint16 offset = (uint16)member.offset;\n\t\t\tuint16 stride = (uint16)buffer->getArrayStride();\n\t\t\tsize_t bufferoffset = (size_t)stride * attrib.startArrayIndex;\n\n\t\t\tint bufferindex = activebuffers;\n\n\t\t\tfor (int i = 0; i < activebuffers; i++)\n\t\t\t{\n\t\t\t\tif (buffers.info[i].buffer == buffer && buffers.info[i].offset == bufferoffset\n\t\t\t\t\t&& attributes.bufferLayouts[i].stride == stride && attributes.getBufferStep(i) == attrib.step)\n\t\t\t\t{\n\t\t\t\t\tbufferindex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tattributes.set(bindinglocation, member.decl.format, offset, bufferindex);\n\t\t\tattributes.setBufferLayout(bufferindex, stride, attrib.step);\n\n\t\t\tbuffers.set(bufferindex, buffer, bufferoffset);\n\n\t\t\tactivebuffers = std::max(activebuffers, bufferindex + 1);\n\t\t}\n\t}\n\n\tattributesID = gfx->registerVertexAttributes(attributes);\n}\n\nvoid Mesh::draw(Graphics *gfx, const love::Matrix4 &m)\n{\n\tdrawInternal(gfx, m, 1, nullptr, 0);\n}\n\nvoid Mesh::drawInstanced(Graphics *gfx, const Matrix4 &m, int instancecount)\n{\n\tdrawInternal(gfx, m, instancecount, nullptr, 0);\n}\n\nvoid Mesh::drawIndirect(Graphics *gfx, const Matrix4 &m, Buffer *indirectargs, int argsindex)\n{\n\tdrawInternal(gfx, m, 0, indirectargs, argsindex);\n}\n\nvoid Mesh::drawInternal(Graphics *gfx, const Matrix4 &m, int instancecount, Buffer *indirectargs, int argsindex)\n{\n\tif (vertexCount <= 0 || (instancecount <= 0 && indirectargs == nullptr))\n\t\treturn;\n\n\tif (indirectargs != nullptr)\n\t{\n\t\tif (primitiveType == PRIMITIVE_TRIANGLE_FAN)\n\t\t\tthrow love::Exception(\"The fan draw mode is not supported in indirect draws.\");\n\n\t\tif (useIndexBuffer && indexBuffer != nullptr)\n\t\t\tgfx->validateIndirectArgsBuffer(Graphics::INDIRECT_ARGS_DRAW_INDICES, indirectargs, argsindex);\n\t\telse\n\t\t\tgfx->validateIndirectArgsBuffer(Graphics::INDIRECT_ARGS_DRAW_VERTICES, indirectargs, argsindex);\n\t}\n\n\t// Some graphics backends don't natively support triangle fans. So we'd\n\t// have to emulate them with triangles plus an index buffer... which doesn't\n\t// work so well when there's already a custom index buffer.\n\tif (primitiveType == PRIMITIVE_TRIANGLE_FAN && useIndexBuffer && indexBuffer != nullptr)\n\t\tthrow love::Exception(\"The 'fan' Mesh draw mode cannot be used with an index buffer / vertex map.\");\n\n\tgfx->flushBatchedDraws();\n\n\tflush();\n\n\tif (Shader::isDefaultActive())\n\t\tShader::attachDefault(primitiveType == PRIMITIVE_POINTS ? Shader::STANDARD_POINTS : Shader::STANDARD_DEFAULT);\n\n\tif (Shader::current)\n\t\tShader::current->validateDrawState(primitiveType, texture);\n\n\tbool attributesIDneedsupdate = !attributesID.isValid();\n\n\tfor (const auto &attrib : attachedAttributes)\n\t{\n\t\tif (!attrib.enabled)\n\t\t\tcontinue;\n\n\t\tif (attrib.mesh.get())\n\t\t\tattrib.mesh->flush();\n\n\t\t// Query the index from the shader as a fallback to support old code that\n\t\t// hasn't set a binding location.\n\t\tif (attrib.bindingLocation < 0)\n\t\t\tattributesIDneedsupdate = true;\n\t}\n\n\tif (attributesIDneedsupdate)\n\t\tupdateVertexAttributes(gfx);\n\n\tGraphics::TempTransform transform(gfx, m);\n\n\tBuffer *indexbuffer = useIndexBuffer ? indexBuffer : nullptr;\n\tint indexcount = (int) indexCount;\n\tRange range = drawRange;\n\n\t// Emulated triangle fan via an index buffer.\n\tif (primitiveType == PRIMITIVE_TRIANGLE_FAN && indexbuffer == nullptr && gfx->getFanIndexBuffer())\n\t{\n\t\tindexbuffer = gfx->getFanIndexBuffer();\n\t\tindexcount = graphics::getIndexCount(TRIANGLEINDEX_FAN, vertexCount);\n\t\tif (range.isValid())\n\t\t{\n\t\t\tint start = graphics::getIndexCount(TRIANGLEINDEX_FAN, (int) range.getOffset());\n\t\t\tint count = graphics::getIndexCount(TRIANGLEINDEX_FAN, (int) range.getSize());\n\t\t\trange = Range(start, count);\n\t\t}\n\t}\n\n\tif (indexbuffer != nullptr && (indexcount > 0 || indirectargs != nullptr))\n\t{\n\t\tRange r(0, indexcount);\n\t\tif (range.isValid())\n\t\t\tr.intersect(range);\n\n\t\tGraphics::DrawIndexedCommand cmd(attributesID, &bufferBindings, indexbuffer);\n\n\t\tcmd.primitiveType = primitiveType;\n\t\tcmd.indexType = indexDataType;\n\t\tcmd.instanceCount = instancecount;\n\t\tcmd.texture = gfx->getTextureOrDefaultForActiveShader(texture);\n\t\tcmd.cullMode = gfx->getMeshCullMode();\n\n\t\tcmd.indexBufferOffset = r.getOffset() * indexbuffer->getArrayStride();\n\t\tcmd.indexCount = (int) r.getSize();\n\n\t\tcmd.indirectBuffer = indirectargs;\n\t\tcmd.indirectBufferOffset = argsindex * (indirectargs != nullptr ? indirectargs->getArrayStride() : 0);\n\n\t\tif (cmd.indexCount > 0)\n\t\t\tgfx->draw(cmd);\n\t}\n\telse if (vertexCount > 0 || indirectargs != nullptr)\n\t{\n\t\tRange r(0, vertexCount);\n\t\tif (range.isValid())\n\t\t\tr.intersect(range);\n\n\t\tGraphics::DrawCommand cmd(attributesID, &bufferBindings);\n\n\t\tcmd.primitiveType = primitiveType;\n\t\tcmd.vertexStart = (int) r.getOffset();\n\t\tcmd.vertexCount = (int) r.getSize();\n\t\tcmd.instanceCount = instancecount;\n\t\tcmd.texture = gfx->getTextureOrDefaultForActiveShader(texture);\n\t\tcmd.cullMode = gfx->getMeshCullMode();\n\n\t\tcmd.indirectBuffer = indirectargs;\n\t\tcmd.indirectBufferOffset = argsindex * (indirectargs != nullptr ? indirectargs->getArrayStride() : 0);\n\n\t\tif (cmd.vertexCount > 0)\n\t\t\tgfx->draw(cmd);\n\t}\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/Mesh.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/int.h\"\n#include \"common/math.h\"\n#include \"common/StringMap.h\"\n#include \"common/Range.h\"\n#include \"Drawable.h\"\n#include \"Texture.h\"\n#include \"vertex.h\"\n#include \"Buffer.h\"\n\n// C++\n#include <vector>\n#include <unordered_map>\n\nnamespace love\n{\nnamespace graphics\n{\n\nclass Graphics;\n\n/**\n * Holds and draws arbitrary vertex geometry.\n * Each vertex in the Mesh has a collection of vertex attributes specified on\n * creation.\n **/\nclass Mesh : public Drawable\n{\npublic:\n\n\tstruct BufferAttribute\n\t{\n\t\tstd::string name;\n\t\tStrongRef<Buffer> buffer;\n\t\tStrongRef<Mesh> mesh;\n\t\tstd::string nameInBuffer;\n\t\tint bindingLocationInBuffer = -1;\n\t\tint indexInBuffer = 0;\n\t\tint startArrayIndex = 0;\n\t\tAttributeStep step = STEP_PER_VERTEX;\n\t\tint bindingLocation = -1;\n\t\tbool enabled = false;\n\t};\n\n\tstatic love::Type type;\n\n\tMesh(Graphics *gfx, const std::vector<Buffer::DataDeclaration> &vertexformat, const void *data, size_t datasize, PrimitiveType drawmode, BufferDataUsage usage);\n\tMesh(Graphics *gfx, const std::vector<Buffer::DataDeclaration> &vertexformat, int vertexcount, PrimitiveType drawmode, BufferDataUsage usage);\n\tMesh(const std::vector<BufferAttribute> &attributes, PrimitiveType drawmode);\n\n\tvirtual ~Mesh();\n\n\t/**\n\t * Validates a vertex index and whether the Mesh has its own vertex buffer,\n\t * and returns a pointer to the vertex data at the given vertex index.\n\t **/\n\tvoid *checkVertexDataOffset(size_t vertindex, size_t *byteoffset);\n\n\t/**\n\t * Gets the total number of vertices that can be used when drawing the Mesh.\n\t **/\n\tsize_t getVertexCount() const;\n\n\t/**\n\t * Gets the size in bytes of the start of one vertex to the start of the\n\t * next, in the buffer.\n\t **/\n\tsize_t getVertexStride() const;\n\n\t/**\n\t * Gets the Buffer that holds the Mesh's vertices.\n\t **/\n\tBuffer *getVertexBuffer() const;\n\n\t/**\n\t * Gets the format of each vertex attribute stored in the Mesh.\n\t **/\n\tconst std::vector<Buffer::DataMember> &getVertexFormat() const;\n\n\t/**\n\t * Sets whether a specific vertex attribute is used when drawing the Mesh.\n\t **/\n\tvoid setAttributeEnabled(const std::string &name, bool enable);\n\tbool isAttributeEnabled(const std::string &name) const;\n\tvoid setAttributeEnabled(int bindingLocation, bool enable);\n\tbool isAttributeEnabled(int bindingLocation) const;\n\n\t/**\n\t * Attaches a vertex attribute from another vertex buffer to this Mesh. The\n\t * attribute will be used when drawing this Mesh.\n\t * Attributes from other Meshes should also pass in the Mesh as an argument,\n\t * to make sure this Mesh knows to flush the passed in Mesh's data to its\n\t * buffer when drawing.\n\t **/\n\tvoid attachAttribute(const std::string &name, Buffer *buffer, Mesh *mesh, const std::string &attachname, int startindex = 0, AttributeStep step = STEP_PER_VERTEX);\n\tbool detachAttribute(const std::string &name);\n\tvoid attachAttribute(int bindingLocation, Buffer *buffer, Mesh *mesh, int attachBindingLocation, int startindex = 0, AttributeStep step = STEP_PER_VERTEX);\n\tbool detachAttribute(int bindingLocation);\n\tconst std::vector<BufferAttribute> &getAttachedAttributes() const;\n\n\tvoid *getVertexData() const;\n\tvoid setVertexDataModified(size_t offset, size_t size);\n\n\t/**\n\t * Flushes all modified data to the GPU.\n\t **/\n\tvoid flush();\n\n\t/**\n\t * Sets the vertex map to use when drawing the Mesh. The vertex map\n\t * determines the order in which vertices are used by the draw mode.\n\t * A 0-element vector is equivalent to the default vertex map:\n\t * {0, 1, 2, 3, 4, ...}\n\t **/\n\tvoid setVertexMap(const std::vector<uint32> &map);\n\tvoid setVertexMap(IndexDataType datatype, const void *data, size_t datasize);\n\tvoid setVertexMap();\n\n\t/**\n\t * Fills the uint32 vector passed into the method with the previously set\n\t * vertex map (index buffer) values.\n\t **/\n\tbool getVertexMap(std::vector<uint32> &map) const;\n\n\tvoid setIndexBuffer(Buffer *buffer);\n\tBuffer *getIndexBuffer() const;\n\n\t/**\n\t * Gets the total number of elements in the vertex map array.\n\t **/\n\tsize_t getIndexCount() const;\n\n\t/**\n\t * Sets the texture used when drawing the Mesh.\n\t **/\n\tvoid setTexture(Texture *texture);\n\n\t/**\n\t * Disables any texture from being used when drawing the Mesh.\n\t **/\n\tvoid setTexture();\n\n\t/**\n\t * Gets the texture used when drawing the Mesh. May return null if no\n\t * texture is set.\n\t **/\n\tTexture *getTexture() const;\n\n\t/**\n\t * Sets the draw mode used when drawing the Mesh.\n\t **/\n\tvoid setDrawMode(PrimitiveType mode);\n\tPrimitiveType getDrawMode() const;\n\n\tvoid setDrawRange(int start, int count);\n\tvoid setDrawRange();\n\tbool getDrawRange(int &start, int &count) const;\n\n\t// Implements Drawable.\n\tvoid draw(Graphics *gfx, const Matrix4 &m) override;\n\n\tvoid drawInstanced(Graphics *gfx, const Matrix4 &m, int instancecount);\n\tvoid drawIndirect(Graphics *gfx, const Matrix4 &m, Buffer *indirectargs, int argsindex);\n\n\tstatic std::vector<Buffer::DataDeclaration> getDefaultVertexFormat();\n\nprivate:\n\n\tfriend class SpriteBatch;\n\n\tvoid setupAttachedAttributes();\n\tint getAttachedAttributeIndex(const std::string &name) const;\n\tint getAttachedAttributeIndex(int bindingLocation) const;\n\tvoid finalizeAttribute(BufferAttribute &attrib) const;\n\n\tvoid updateVertexAttributes(Graphics *gfx);\n\n\tvoid drawInternal(Graphics *gfx, const Matrix4 &m, int instancecount, Buffer *indirectargs, int argsindex);\n\n\tstd::vector<Buffer::DataMember> vertexFormat;\n\n\tstd::vector<BufferAttribute> attachedAttributes;\n\n\tVertexAttributesID attributesID;\n\n\t// Vertex buffer, for the vertex data.\n\tStrongRef<Buffer> vertexBuffer;\n\tuint8 *vertexData = nullptr;\n\tRange modifiedVertexData = Range();\n\n\tsize_t vertexCount = 0;\n\tsize_t vertexStride = 0;\n\n\t// Index buffer, for the vertex map.\n\tStrongRef<Buffer> indexBuffer;\n\tuint8 *indexData = nullptr;\n\tbool indexDataModified = false;\n\tbool useIndexBuffer = false;\n\tsize_t indexCount = 0;\n\tIndexDataType indexDataType = INDEX_UINT16;\n\n\tPrimitiveType primitiveType = PRIMITIVE_TRIANGLES;\n\n\tRange drawRange = Range();\n\n\tStrongRef<Texture> texture;\n\n\tBufferBindings bufferBindings;\n\n}; // Mesh\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/ParticleSystem.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n//LOVE\n#include \"common/config.h\"\n#include \"ParticleSystem.h\"\n#include \"Graphics.h\"\n\n#include \"common/math.h\"\n#include \"modules/math/RandomGenerator.h\"\n\n// STD\n#include <algorithm>\n#include <cmath>\n#include <cstdlib>\n\nnamespace love\n{\nnamespace graphics\n{\n\nnamespace\n{\n\nlove::math::RandomGenerator rng;\n\nfloat calculate_variation(float inner, float outer, float var)\n{\n\tfloat low = inner - (outer/2.0f)*var;\n\tfloat high = inner + (outer/2.0f)*var;\n\tfloat r = (float) rng.random();\n\treturn low*(1-r)+high*r;\n}\n\n} // anonymous namespace\n\nlove::Type ParticleSystem::type(\"ParticleSystem\", &Drawable::type);\n\nParticleSystem::ParticleSystem(Texture *texture, uint32 size)\n\t: pMem(nullptr)\n\t, pFree(nullptr)\n\t, pHead(nullptr)\n\t, pTail(nullptr)\n\t, texture(texture)\n\t, active(true)\n\t, insertMode(INSERT_MODE_TOP)\n\t, maxParticles(0)\n\t, activeParticles(0)\n\t, emissionRate(0)\n\t, emitCounter(0)\n\t, emissionAreaDistribution(DISTRIBUTION_NONE)\n\t, emissionAreaAngle(0)\n\t, directionRelativeToEmissionCenter(false)\n\t, lifetime(-1)\n\t, life(0)\n\t, particleLifeMin(0)\n\t, particleLifeMax(0)\n\t, direction(0)\n\t, spread(0)\n\t, speedMin(0)\n\t, speedMax(0)\n\t, linearAccelerationMin(0, 0)\n\t, linearAccelerationMax(0, 0)\n\t, radialAccelerationMin(0)\n\t, radialAccelerationMax(0)\n\t, tangentialAccelerationMin(0)\n\t, tangentialAccelerationMax(0)\n\t, linearDampingMin(0.0f)\n\t, linearDampingMax(0.0f)\n\t, sizeVariation(0)\n\t, rotationMin(0)\n\t, rotationMax(0)\n\t, spinStart(0)\n\t, spinEnd(0)\n\t, spinVariation(0)\n\t, offset(float(texture->getWidth())*0.5f, float(texture->getHeight())*0.5f)\n\t, defaultOffset(true)\n\t, relativeRotation(false)\n\t, vertexAttributesID(Module::getInstance<Graphics>(Module::M_GRAPHICS)->registerVertexAttributes(VertexAttributes(CommonFormat::XYf_STf_RGBAub, 0)))\n\t, buffer(nullptr)\n{\n\tif (size == 0 || size > MAX_PARTICLES)\n\t\tthrow love::Exception(\"Invalid ParticleSystem size.\");\n\n\tif (texture->getTextureType() != TEXTURE_2D)\n\t\tthrow love::Exception(\"Only 2D textures can be used with ParticleSystems.\");\n\n\tsizes.push_back(1.0f);\n\tcolors.push_back(Colorf(1.0f, 1.0f, 1.0f, 1.0f));\n\n\tsetBufferSize(size);\n}\n\nParticleSystem::ParticleSystem(const ParticleSystem &p)\n\t: pMem(nullptr)\n\t, pFree(nullptr)\n\t, pHead(nullptr)\n\t, pTail(nullptr)\n\t, texture(p.texture)\n\t, active(p.active)\n\t, insertMode(p.insertMode)\n\t, maxParticles(p.maxParticles)\n\t, activeParticles(0)\n\t, emissionRate(p.emissionRate)\n\t, emitCounter(0.0f)\n\t, position(p.position)\n\t, prevPosition(p.prevPosition)\n\t, emissionAreaDistribution(p.emissionAreaDistribution)\n\t, emissionArea(p.emissionArea)\n\t, emissionAreaAngle(p.emissionAreaAngle)\n\t, directionRelativeToEmissionCenter(p.directionRelativeToEmissionCenter)\n\t, lifetime(p.lifetime)\n\t, life(p.lifetime) // Initialize with the maximum life time.\n\t, particleLifeMin(p.particleLifeMin)\n\t, particleLifeMax(p.particleLifeMax)\n\t, direction(p.direction)\n\t, spread(p.spread)\n\t, speedMin(p.speedMin)\n\t, speedMax(p.speedMax)\n\t, linearAccelerationMin(p.linearAccelerationMin)\n\t, linearAccelerationMax(p.linearAccelerationMax)\n\t, radialAccelerationMin(p.radialAccelerationMin)\n\t, radialAccelerationMax(p.radialAccelerationMax)\n\t, tangentialAccelerationMin(p.tangentialAccelerationMin)\n\t, tangentialAccelerationMax(p.tangentialAccelerationMax)\n\t, linearDampingMin(p.linearDampingMin)\n\t, linearDampingMax(p.linearDampingMax)\n\t, sizes(p.sizes)\n\t, sizeVariation(p.sizeVariation)\n\t, rotationMin(p.rotationMin)\n\t, rotationMax(p.rotationMax)\n\t, spinStart(p.spinStart)\n\t, spinEnd(p.spinEnd)\n\t, spinVariation(p.spinVariation)\n\t, offset(p.offset)\n\t, defaultOffset(p.defaultOffset)\n\t, colors(p.colors)\n\t, quads(p.quads)\n\t, relativeRotation(p.relativeRotation)\n\t, vertexAttributesID(p.vertexAttributesID)\n\t, buffer(nullptr)\n{\n\tsetBufferSize(maxParticles);\n}\n\nParticleSystem::~ParticleSystem()\n{\n\tdeleteBuffers();\n}\n\nParticleSystem *ParticleSystem::clone()\n{\n\treturn new ParticleSystem(*this);\n}\n\nvoid ParticleSystem::resetOffset()\n{\n\tif (quads.empty())\n\t\toffset = love::Vector2(float(texture->getWidth())*0.5f, float(texture->getHeight())*0.5f);\n\telse\n\t{\n\t\tQuad::Viewport v = quads[0]->getViewport();\n\t\toffset = love::Vector2(v.w*0.5f, v.h*0.5f);\n\t}\n}\n\nvoid ParticleSystem::createBuffers(size_t size)\n{\n\ttry\n\t{\n\t\tpFree = pMem = new Particle[size];\n\t\tmaxParticles = (uint32) size;\n\n\t\tauto gfx = Module::getInstance<Graphics>(Module::M_GRAPHICS);\n\n\t\tsize_t bytes = sizeof(Vertex) * size * 4;\n\t\tBuffer::Settings settings(BUFFERUSAGEFLAG_VERTEX, BUFFERDATAUSAGE_STREAM);\n\t\tauto decl = Buffer::getCommonFormatDeclaration(CommonFormat::XYf_STf_RGBAub);\n\t\tbuffer = gfx->newBuffer(settings, decl, nullptr, bytes, 0);\n\t}\n\tcatch (std::bad_alloc &)\n\t{\n\t\tdeleteBuffers();\n\t\tthrow love::Exception(\"Out of memory\");\n\t}\n}\n\nvoid ParticleSystem::deleteBuffers()\n{\n\tdelete[] pMem;\n\tif (buffer)\n\t\tbuffer->release();\n\n\tpMem = nullptr;\n\tbuffer = nullptr;\n\tmaxParticles = 0;\n\tactiveParticles = 0;\n}\n\nvoid ParticleSystem::setBufferSize(uint32 size)\n{\n\tif (size == 0 || size > MAX_PARTICLES)\n\t\tthrow love::Exception(\"Invalid buffer size\");\n\tdeleteBuffers();\n\tcreateBuffers(size);\n\treset();\n}\n\nuint32 ParticleSystem::getBufferSize() const\n{\n\treturn maxParticles;\n}\n\nvoid ParticleSystem::addParticle(float t)\n{\n\tif (isFull())\n\t\treturn;\n\n\t// Gets a free particle and updates the allocation pointer.\n\tParticle *p = pFree++;\n\tinitParticle(p, t);\n\n\tswitch (insertMode)\n\t{\n\tdefault:\n\tcase INSERT_MODE_TOP:\n\t\tinsertTop(p);\n\t\tbreak;\n\tcase INSERT_MODE_BOTTOM:\n\t\tinsertBottom(p);\n\t\tbreak;\n\tcase INSERT_MODE_RANDOM:\n\t\tinsertRandom(p);\n\t\tbreak;\n\t}\n\n\tactiveParticles++;\n}\n\nvoid ParticleSystem::initParticle(Particle *p, float t)\n{\n\tfloat min,max;\n\n\t// Linearly interpolate between the previous and current emitter position.\n\tlove::Vector2 pos = prevPosition + (position - prevPosition) * t;\n\n\tmin = particleLifeMin;\n\tmax = particleLifeMax;\n\tif (min == max)\n\t\tp->life = min;\n\telse\n\t\tp->life = (float) rng.random(min, max);\n\tp->lifetime = p->life;\n\n\tp->position = pos;\n\n\tmin = direction - spread/2.0f;\n\tmax = direction + spread/2.0f;\n\tfloat dir = (float) rng.random(min, max);\n\n\t// In this switch statement, variables 'rand_y', 'min', and 'max'\n\t// are sometimes reused as data stores for performance reasons\n\tfloat rand_x, rand_y;\n\tfloat c, s;\n\tswitch (emissionAreaDistribution)\n\t{\n\tcase DISTRIBUTION_UNIFORM:\n\t\tc = cosf(emissionAreaAngle); s = sinf(emissionAreaAngle);\n\t\trand_x = (float) rng.random(-emissionArea.x, emissionArea.x);\n\t\trand_y = (float) rng.random(-emissionArea.y, emissionArea.y);\n\t\tp->position.x += c * rand_x - s * rand_y;\n\t\tp->position.y += s * rand_x + c * rand_y;\n\t\tbreak;\n\tcase DISTRIBUTION_NORMAL:\n\t\tc = cosf(emissionAreaAngle); s = sinf(emissionAreaAngle);\n\t\trand_x = (float) rng.randomNormal(emissionArea.x);\n\t\trand_y = (float) rng.randomNormal(emissionArea.y);\n\t\tp->position.x += c * rand_x - s * rand_y;\n\t\tp->position.y += s * rand_x + c * rand_y;\n\t\tbreak;\n\tcase DISTRIBUTION_ELLIPSE:\n\t\tc = cosf(emissionAreaAngle); s = sinf(emissionAreaAngle);\n\t\trand_x = (float) rng.random(-1, 1);\n\t\trand_y = (float) rng.random(-1, 1);\n\t\tmin = emissionArea.x * (rand_x * sqrt(1 - 0.5f*pow(rand_y, 2)));\n\t\tmax = emissionArea.y * (rand_y * sqrt(1 - 0.5f*pow(rand_x, 2)));\n\t\tp->position.x += c * min - s * max;\n\t\tp->position.y += s * min + c * max;\n\t\tbreak;\n\tcase DISTRIBUTION_BORDER_ELLIPSE:\n\t\tc = cosf(emissionAreaAngle); s = sinf(emissionAreaAngle);\n\t\trand_x = (float) rng.random(0, LOVE_M_PI * 2);\n\t\tmin = cosf(rand_x) * emissionArea.x;\n\t\tmax = sinf(rand_x) * emissionArea.y;\n\t\tp->position.x += c * min - s * max;\n\t\tp->position.y += s * min + c * max;\n\t\tbreak;\n\tcase DISTRIBUTION_BORDER_RECTANGLE:\n\t\tc = cosf(emissionAreaAngle); s = sinf(emissionAreaAngle);\n\t\trand_x = (float) rng.random((emissionArea.x + emissionArea.y) * -2, (emissionArea.x + emissionArea.y) * 2);\n\t\trand_y = emissionArea.y * 2;\n\t\tif (rand_x < -rand_y)\n\t\t{\n\t\t\tmin = rand_x + rand_y + emissionArea.x;\n\t\t\tp->position.x += c * min - s * -emissionArea.y;\n\t\t\tp->position.y += s * min + c * -emissionArea.y;\n\t\t}\n\t\telse if (rand_x < 0)\n\t\t{\n\t\t\tmax = rand_x + emissionArea.y;\n\t\t\tp->position.x += c * -emissionArea.x - s * max;\n\t\t\tp->position.y += s * -emissionArea.x + c * max;\n\t\t}\n\t\telse if (rand_x < rand_y)\n\t\t{\n\t\t\tmax = rand_x - emissionArea.y;\n\t\t\tp->position.x += c * emissionArea.x - s * max;\n\t\t\tp->position.y += s * emissionArea.x + c * max;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmin = rand_x - rand_y - emissionArea.x;\n\t\t\tp->position.x += c * min - s * emissionArea.y;\n\t\t\tp->position.y += s * min + c * emissionArea.y;\n\t\t}\n\t\tbreak;\n\tcase DISTRIBUTION_NONE:\n\tdefault:\n\t\tbreak;\n\t}\n\n\t// Determine if the origin of each particle is the center of the area\n\tif (directionRelativeToEmissionCenter)\n\t\tdir += atan2(p->position.y - pos.y, p->position.x - pos.x);\n\n\tp->origin = pos;\n\n\tmin = speedMin;\n\tmax = speedMax;\n\tfloat speed = (float) rng.random(min, max);\n\n\tp->velocity = love::Vector2(cosf(dir), sinf(dir)) * speed;\n\n\tp->linearAcceleration.x = (float) rng.random(linearAccelerationMin.x, linearAccelerationMax.x);\n\tp->linearAcceleration.y = (float) rng.random(linearAccelerationMin.y, linearAccelerationMax.y);\n\n\tmin = radialAccelerationMin;\n\tmax = radialAccelerationMax;\n\tp->radialAcceleration = (float) rng.random(min, max);\n\n\tmin = tangentialAccelerationMin;\n\tmax = tangentialAccelerationMax;\n\tp->tangentialAcceleration = (float) rng.random(min, max);\n\n\tmin = linearDampingMin;\n\tmax = linearDampingMax;\n\tp->linearDamping = (float) rng.random(min, max);\n\n\tp->sizeOffset       = (float) rng.random(sizeVariation); // time offset for size change\n\tp->sizeIntervalSize = (1.0f - (float) rng.random(sizeVariation)) - p->sizeOffset;\n\tp->size = sizes[(size_t)(p->sizeOffset - .5f) * (sizes.size() - 1)];\n\n\tmin = rotationMin;\n\tmax = rotationMax;\n\tp->spinStart = calculate_variation(spinStart, spinEnd, spinVariation);\n\tp->spinEnd = calculate_variation(spinEnd, spinStart, spinVariation);\n\tp->rotation = (float) rng.random(min, max);\n\n\tp->angle = p->rotation;\n\tif (relativeRotation)\n\t\tp->angle += atan2f(p->velocity.y, p->velocity.x);\n\n\tp->color = colors[0];\n\n\tp->quadIndex = 0;\n}\n\nvoid ParticleSystem::insertTop(Particle *p)\n{\n\tif (pHead == nullptr)\n\t{\n\t\tpHead = p;\n\t\tp->prev = nullptr;\n\t}\n\telse\n\t{\n\t\tpTail->next = p;\n\t\tp->prev = pTail;\n\t}\n\tp->next = nullptr;\n\tpTail = p;\n}\n\nvoid ParticleSystem::insertBottom(Particle *p)\n{\n\tif (pTail == nullptr)\n\t{\n\t\tpTail = p;\n\t\tp->next = nullptr;\n\t}\n\telse\n\t{\n\t\tpHead->prev = p;\n\t\tp->next = pHead;\n\t}\n\tp->prev = nullptr;\n\tpHead = p;\n}\n\nvoid ParticleSystem::insertRandom(Particle *p)\n{\n\t// Nonuniform, but 64-bit is so large nobody will notice. Hopefully.\n\tuint64 pos = rng.rand() % ((int64) activeParticles + 1);\n\n\t// Special case where the particle gets inserted before the head.\n\tif (pos == activeParticles)\n\t{\n\t\tParticle *pA = pHead;\n\t\tif (pA)\n\t\t\tpA->prev = p;\n\t\tp->prev = nullptr;\n\t\tp->next = pA;\n\t\tpHead = p;\n\t\treturn;\n\t}\n\n\t// Inserts the particle after the randomly selected particle.\n\tParticle *pA = pMem + pos;\n\tParticle *pB = pA->next;\n\tpA->next = p;\n\tif (pB)\n\t\tpB->prev = p;\n\telse\n\t\tpTail = p;\n\tp->prev = pA;\n\tp->next = pB;\n}\n\nParticleSystem::Particle *ParticleSystem::removeParticle(Particle *p)\n{\n\t// The linked list is updated in this function and old pointers may be\n\t// invalidated. The returned pointer will inform the caller of the new\n\t// pointer to the next particle.\n\tParticle *pNext = nullptr;\n\n\t// Removes the particle from the linked list.\n\tif (p->prev)\n\t\tp->prev->next = p->next;\n\telse\n\t\tpHead = p->next;\n\n\tif (p->next)\n\t{\n\t\tp->next->prev = p->prev;\n\t\tpNext = p->next;\n\t}\n\telse\n\t\tpTail = p->prev;\n\n\t// The (in memory) last particle can now be moved into the free slot.\n\t// It will skip the moving if it happens to be the removed particle.\n\tpFree--;\n\tif (p != pFree)\n\t{\n\t\t*p = *pFree;\n\t\tif (pNext == pFree)\n\t\t\tpNext = p;\n\n\t\tif (p->prev)\n\t\t\tp->prev->next = p;\n\t\telse\n\t\t\tpHead = p;\n\n\t\tif (p->next)\n\t\t\tp->next->prev = p;\n\t\telse\n\t\t\tpTail = p;\n\t}\n\n\tactiveParticles--;\n\treturn pNext;\n}\n\nvoid ParticleSystem::setTexture(Texture *tex)\n{\n\tif (texture->getTextureType() != TEXTURE_2D)\n\t\tthrow love::Exception(\"Only 2D textures can be used with ParticleSystems.\");\n\n\ttexture.set(tex);\n\n\tif (defaultOffset)\n\t\tresetOffset();\n}\n\nTexture *ParticleSystem::getTexture() const\n{\n\treturn texture.get();\n}\n\nvoid ParticleSystem::setInsertMode(InsertMode mode)\n{\n\tinsertMode = mode;\n}\n\nParticleSystem::InsertMode ParticleSystem::getInsertMode() const\n{\n\treturn insertMode;\n}\n\nvoid ParticleSystem::setEmissionRate(float rate)\n{\n\tif (rate < 0.0f)\n\t\tthrow love::Exception(\"Invalid emission rate\");\n\temissionRate = rate;\n\n\t// Prevent an explosion when dramatically increasing the rate\n\temitCounter = std::min(emitCounter, 1.0f/rate);\n}\n\nfloat ParticleSystem::getEmissionRate() const\n{\n\treturn emissionRate;\n}\n\nvoid ParticleSystem::setEmitterLifetime(float life)\n{\n\tthis->life = lifetime = life;\n}\n\nfloat ParticleSystem::getEmitterLifetime() const\n{\n\treturn lifetime;\n}\n\nvoid ParticleSystem::setParticleLifetime(float min, float max)\n{\n\tparticleLifeMin = min;\n\tif (max == 0)\n\t\tparticleLifeMax = min;\n\telse\n\t\tparticleLifeMax = max;\n}\n\nvoid ParticleSystem::getParticleLifetime(float &min, float &max) const\n{\n\tmin = particleLifeMin;\n\tmax = particleLifeMax;\n}\n\nvoid ParticleSystem::setPosition(float x, float y)\n{\n\tposition = love::Vector2(x, y);\n\tprevPosition = position;\n}\n\nconst love::Vector2 &ParticleSystem::getPosition() const\n{\n\treturn position;\n}\n\nvoid ParticleSystem::moveTo(float x, float y)\n{\n\tposition = love::Vector2(x, y);\n}\n\nvoid ParticleSystem::setEmissionArea(AreaSpreadDistribution distribution, float x, float y, float angle, bool directionRelativeToCenter)\n{\n\temissionArea = love::Vector2(x, y);\n\temissionAreaDistribution = distribution;\n\temissionAreaAngle = angle;\n\tdirectionRelativeToEmissionCenter = directionRelativeToCenter;\n}\n\nParticleSystem::AreaSpreadDistribution ParticleSystem::getEmissionArea(love::Vector2 &params, float &angle, bool &directionRelativeToCenter) const\n{\n\tparams = emissionArea;\n\tangle = emissionAreaAngle;\n\tdirectionRelativeToCenter = directionRelativeToEmissionCenter;\n\treturn emissionAreaDistribution;\n}\n\nvoid ParticleSystem::setDirection(float direction)\n{\n\tthis->direction = direction;\n}\n\nfloat ParticleSystem::getDirection() const\n{\n\treturn direction;\n}\n\nvoid ParticleSystem::setSpread(float spread)\n{\n\tthis->spread = spread;\n}\n\nfloat ParticleSystem::getSpread() const\n{\n\treturn spread;\n}\n\nvoid ParticleSystem::setSpeed(float speed)\n{\n\tspeedMin = speedMax = speed;\n}\n\nvoid ParticleSystem::setSpeed(float min, float max)\n{\n\tspeedMin = min;\n\tspeedMax = max;\n}\n\nvoid ParticleSystem::getSpeed(float &min, float &max) const\n{\n\tmin = speedMin;\n\tmax = speedMax;\n}\n\nvoid ParticleSystem::setLinearAcceleration(float x, float y)\n{\n\tlinearAccelerationMin.x = linearAccelerationMax.x = x;\n\tlinearAccelerationMin.y = linearAccelerationMax.y = y;\n}\n\nvoid ParticleSystem::setLinearAcceleration(float xmin, float ymin, float xmax, float ymax)\n{\n\tlinearAccelerationMin = love::Vector2(xmin, ymin);\n\tlinearAccelerationMax = love::Vector2(xmax, ymax);\n}\n\nvoid ParticleSystem::getLinearAcceleration(love::Vector2 &min, love::Vector2 &max) const\n{\n\tmin = linearAccelerationMin;\n\tmax = linearAccelerationMax;\n}\n\nvoid ParticleSystem::setRadialAcceleration(float acceleration)\n{\n\tradialAccelerationMin = radialAccelerationMax = acceleration;\n}\n\nvoid ParticleSystem::setRadialAcceleration(float min, float max)\n{\n\tradialAccelerationMin = min;\n\tradialAccelerationMax = max;\n}\n\nvoid ParticleSystem::getRadialAcceleration(float &min, float &max) const\n{\n\tmin = radialAccelerationMin;\n\tmax = radialAccelerationMax;\n}\n\nvoid ParticleSystem::setTangentialAcceleration(float acceleration)\n{\n\ttangentialAccelerationMin = tangentialAccelerationMax = acceleration;\n}\n\nvoid ParticleSystem::setTangentialAcceleration(float min, float max)\n{\n\ttangentialAccelerationMin = min;\n\ttangentialAccelerationMax = max;\n}\n\nvoid ParticleSystem::getTangentialAcceleration(float &min, float &max) const\n{\n\tmin = tangentialAccelerationMin;\n\tmax = tangentialAccelerationMax;\n}\n\nvoid ParticleSystem::setLinearDamping(float min, float max)\n{\n\tlinearDampingMin = min;\n\tlinearDampingMax = max;\n}\n\nvoid ParticleSystem::getLinearDamping(float &min, float &max) const\n{\n\tmin = linearDampingMin;\n\tmax = linearDampingMax;\n}\n\nvoid ParticleSystem::setSize(float size)\n{\n\tsizes.resize(1);\n\tsizes[0] = size;\n}\n\nvoid ParticleSystem::setSizes(const std::vector<float> &newSizes)\n{\n\tsizes = newSizes;\n}\n\nconst std::vector<float> &ParticleSystem::getSizes() const\n{\n\treturn sizes;\n}\n\nvoid ParticleSystem::setSizeVariation(float variation)\n{\n\tsizeVariation = variation;\n}\n\nfloat ParticleSystem::getSizeVariation() const\n{\n\treturn sizeVariation;\n}\n\nvoid ParticleSystem::setRotation(float rotation)\n{\n\trotationMin = rotationMax = rotation;\n}\n\nvoid ParticleSystem::setRotation(float min, float max)\n{\n\trotationMin = min;\n\trotationMax = max;\n}\n\nvoid ParticleSystem::getRotation(float &min, float &max) const\n{\n\tmin = rotationMin;\n\tmax = rotationMax;\n}\n\nvoid ParticleSystem::setSpin(float spin)\n{\n\tspinStart = spin;\n\tspinEnd = spin;\n}\n\nvoid ParticleSystem::setSpin(float start, float end)\n{\n\tspinStart = start;\n\tspinEnd = end;\n}\n\nvoid ParticleSystem::getSpin(float &start, float &end) const\n{\n\tstart = spinStart;\n\tend = spinEnd;\n}\n\nvoid ParticleSystem::setSpinVariation(float variation)\n{\n\tspinVariation = variation;\n}\n\nfloat ParticleSystem::getSpinVariation() const\n{\n\treturn spinVariation;\n}\n\nvoid ParticleSystem::setOffset(float x, float y)\n{\n\toffset = love::Vector2(x, y);\n\tdefaultOffset = false;\n}\n\nlove::Vector2 ParticleSystem::getOffset() const\n{\n\treturn offset;\n}\n\nvoid ParticleSystem::setColor(const std::vector<Colorf> &newColors)\n{\n\tcolors = newColors;\n\n\t// We don't support colors outside of [0,1] when drawing the ParticleSystem.\n\tfor (auto &c : colors)\n\t{\n\t\tc.r = std::min(std::max(c.r, 0.0f), 1.0f);\n\t\tc.g = std::min(std::max(c.g, 0.0f), 1.0f);\n\t\tc.b = std::min(std::max(c.b, 0.0f), 1.0f);\n\t\tc.a = std::min(std::max(c.a, 0.0f), 1.0f);\n\t}\n}\n\nstd::vector<Colorf> ParticleSystem::getColor() const\n{\n\treturn colors;\n}\n\nvoid ParticleSystem::setQuads(const std::vector<Quad *> &newQuads)\n{\n\tstd::vector<StrongRef<Quad>> quadlist;\n\tquadlist.reserve(newQuads.size());\n\n\tfor (Quad *q : newQuads)\n\t\tquadlist.push_back(q);\n\n\tquads = quadlist;\n\n\tif (defaultOffset)\n\t\tresetOffset();\n}\n\nvoid ParticleSystem::setQuads()\n{\n\tquads.clear();\n}\n\nstd::vector<Quad *> ParticleSystem::getQuads() const\n{\n\tstd::vector<Quad *> quadlist;\n\tquadlist.reserve(quads.size());\n\n\tfor (const StrongRef<Quad> &q : quads)\n\t\tquadlist.push_back(q.get());\n\n\treturn quadlist;\n}\n\nvoid ParticleSystem::setRelativeRotation(bool enable)\n{\n\trelativeRotation = enable;\n}\n\nbool ParticleSystem::hasRelativeRotation() const\n{\n\treturn relativeRotation;\n}\n\nuint32 ParticleSystem::getCount() const\n{\n\treturn activeParticles;\n}\n\nvoid ParticleSystem::start()\n{\n\tactive = true;\n}\n\nvoid ParticleSystem::stop()\n{\n\tactive = false;\n\tlife = lifetime;\n\temitCounter = 0;\n}\n\nvoid ParticleSystem::pause()\n{\n\tactive = false;\n}\n\nvoid ParticleSystem::reset()\n{\n\tif (pMem == nullptr)\n\t\treturn;\n\n\tpFree = pMem;\n\tpHead = nullptr;\n\tpTail = nullptr;\n\tactiveParticles = 0;\n\tlife = lifetime;\n\temitCounter = 0;\n}\n\nvoid ParticleSystem::emit(uint32 num)\n{\n\tif (!active)\n\t\treturn;\n\n\tnum = std::min(num, maxParticles - activeParticles);\n\n\twhile (num--)\n\t\taddParticle(1.0f);\n}\n\nbool ParticleSystem::isActive() const\n{\n\treturn active;\n}\n\nbool ParticleSystem::isPaused() const\n{\n\treturn !active && life < lifetime;\n}\n\nbool ParticleSystem::isStopped() const\n{\n\treturn !active && life >= lifetime;\n}\n\nbool ParticleSystem::isEmpty() const\n{\n\treturn activeParticles == 0;\n}\n\nbool ParticleSystem::isFull() const\n{\n\treturn activeParticles == maxParticles;\n}\n\nvoid ParticleSystem::update(float dt)\n{\n\tif (pMem == nullptr || dt == 0.0f)\n\t\treturn;\n\n\t// Traverse all particles and update.\n\tParticle *p = pHead;\n\n\twhile (p)\n\t{\n\t\t// Decrease lifespan.\n\t\tp->life -= dt;\n\n\t\tif (p->life <= 0)\n\t\t\tp = removeParticle(p);\n\t\telse\n\t\t{\n\t\t\t// Temp variables.\n\t\t\tlove::Vector2 radial, tangential;\n\t\t\tlove::Vector2 ppos = p->position;\n\n\t\t\t// Get vector from particle center to particle.\n\t\t\tradial = ppos - p->origin;\n\t\t\tradial.normalize();\n\t\t\ttangential = radial;\n\n\t\t\t// Resize radial acceleration.\n\t\t\tradial *= p->radialAcceleration;\n\n\t\t\t// Calculate tangential acceleration.\n\t\t\t{\n\t\t\t\tfloat a = tangential.x;\n\t\t\t\ttangential.x = -tangential.y;\n\t\t\t\ttangential.y = a;\n\t\t\t}\n\n\t\t\t// Resize tangential.\n\t\t\ttangential *= p->tangentialAcceleration;\n\n\t\t\t// Update velocity.\n\t\t\tp->velocity += (radial + tangential + p->linearAcceleration) * dt;\n\n\t\t\t// Apply damping.\n\t\t\tp->velocity *= 1.0f / (1.0f + p->linearDamping * dt);\n\n\t\t\t// Modify position.\n\t\t\tppos += p->velocity * dt;\n\n\t\t\tp->position = ppos;\n\n\t\t\tconst float t = 1.0f - p->life / p->lifetime;\n\n\t\t\t// Rotate.\n\t\t\tp->rotation += (p->spinStart * (1.0f - t) + p->spinEnd * t) * dt;\n\n\t\t\tp->angle = p->rotation;\n\n\t\t\tif (relativeRotation)\n\t\t\t\tp->angle += atan2f(p->velocity.y, p->velocity.x);\n\n\t\t\t// Change size according to given intervals:\n\t\t\t// i = 0       1       2      3          n-1\n\t\t\t//     |-------|-------|------|--- ... ---|\n\t\t\t// t = 0    1/(n-1)        3/(n-1)        1\n\t\t\t//\n\t\t\t// `s' is the interpolation variable scaled to the current\n\t\t\t// interval width, e.g. if n = 5 and t = 0.3, then the current\n\t\t\t// indices are 1,2 and s = 0.3 - 0.25 = 0.05\n\t\t\tfloat s = p->sizeOffset + t * p->sizeIntervalSize; // size variation\n\t\t\ts *= (float)(sizes.size() - 1); // 0 <= s < sizes.size()\n\t\t\tsize_t i = (size_t)s;\n\t\t\tsize_t k = (i == sizes.size() - 1) ? i : i + 1; // boundary check (prevents failing on t = 1.0f)\n\t\t\ts -= (float)i; // transpose s to be in interval [0:1]: i <= s < i + 1 ~> 0 <= s < 1\n\t\t\tp->size = sizes[i] * (1.0f - s) + sizes[k] * s;\n\n\t\t\t// Update color according to given intervals (as above)\n\t\t\ts = t * (float)(colors.size() - 1);\n\t\t\ti = (size_t)s;\n\t\t\tk = (i == colors.size() - 1) ? i : i + 1;\n\t\t\ts -= (float)i;                            // 0 <= s <= 1\n\t\t\tp->color = colors[i] * (1.0f - s) + colors[k] * s;\n\n\t\t\t// Update the quad index.\n\t\t\tk = quads.size();\n\t\t\tif (k > 0)\n\t\t\t{\n\t\t\t\ts = t * (float) k; // [0:numquads-1] (clamped below)\n\t\t\t\ti = (s > 0.0f) ? (size_t) s : 0;\n\t\t\t\tp->quadIndex = (int) ((i < k) ? i : k - 1);\n\t\t\t}\n\n\t\t\t// Next particle.\n\t\t\tp = p->next;\n\t\t}\n\t}\n\n\t// Make some more particles.\n\tif (active)\n\t{\n\t\tfloat rate = 1.0f / emissionRate; // the amount of time between each particle emit\n\t\temitCounter += dt;\n\t\tfloat total = emitCounter - rate;\n\t\twhile (emitCounter > rate)\n\t\t{\n\t\t\taddParticle(1.0f - (emitCounter - rate) / total);\n\t\t\temitCounter -= rate;\n\t\t}\n\n\t\tlife -= dt;\n\t\tif (lifetime != -1 && life < 0)\n\t\t\tstop();\n\t}\n\n\tprevPosition = position;\n}\n\nvoid ParticleSystem::draw(Graphics *gfx, const Matrix4 &m)\n{\n\tuint32 pCount = getCount();\n\n\tif (pCount == 0 || texture.get() == nullptr || pMem == nullptr || buffer == nullptr)\n\t\treturn;\n\n\tgfx->flushBatchedDraws();\n\n\tif (Shader::isDefaultActive())\n\t\tShader::attachDefault(Shader::STANDARD_DEFAULT);\n\n\tif (Shader::current)\n\t\tShader::current->validateDrawState(PRIMITIVE_TRIANGLES, texture);\n\n\tconst Vector2 *positions = texture->getQuad()->getVertexPositions();\n\tconst Vector2 *texcoords = texture->getQuad()->getVertexTexCoords();\n\n\tVertex *pVerts = (Vertex *) buffer->map(Buffer::MAP_WRITE_INVALIDATE, 0, buffer->getSize());\n\tParticle *p = pHead;\n\n\tbool useQuads = !quads.empty();\n\n\tMatrix3 t;\n\n\t// set the vertex data for each particle (transformation, texcoords, color)\n\twhile (p)\n\t{\n\t\tif (useQuads)\n\t\t{\n\t\t\tpositions = quads[p->quadIndex]->getVertexPositions();\n\t\t\ttexcoords = quads[p->quadIndex]->getVertexTexCoords();\n\t\t}\n\n\t\t// particle vertices are image vertices transformed by particle info\n\t\tt.setTransformation(p->position.x, p->position.y, p->angle, p->size, p->size, offset.x, offset.y, 0.0f, 0.0f);\n\t\tt.transformXY(pVerts, positions, 4);\n\n\t\t// Particle colors are stored as floats (0-1) but vertex colors are\n\t\t// unsigned bytes (0-255).\n\t\tColor32 c = toColor32(p->color);\n\n\t\t// set the texture coordinate and color data for particle vertices\n\t\tfor (int v = 0; v < 4; v++)\n\t\t{\n\t\t\tpVerts[v].s = texcoords[v].x;\n\t\t\tpVerts[v].t = texcoords[v].y;\n\t\t\tpVerts[v].color = c;\n\t\t}\n\n\t\tpVerts += 4;\n\t\tp = p->next;\n\t}\n\n\tbuffer->unmap(0, pCount * sizeof(Vertex) * 4);\n\n\tGraphics::TempTransform transform(gfx, m);\n\n\tBufferBindings vertexbuffers;\n\tvertexbuffers.set(0, buffer, 0);\n\n\tTexture *tex = gfx->getTextureOrDefaultForActiveShader(texture);\n\tgfx->drawQuads(0, pCount, vertexAttributesID, vertexbuffers, tex);\n}\n\nbool ParticleSystem::getConstant(const char *in, AreaSpreadDistribution &out)\n{\n\treturn distributions.find(in, out);\n}\n\nbool ParticleSystem::getConstant(AreaSpreadDistribution in, const char *&out)\n{\n\treturn distributions.find(in, out);\n}\n\nstd::vector<std::string> ParticleSystem::getConstants(AreaSpreadDistribution)\n{\n\treturn distributions.getNames();\n}\n\nbool ParticleSystem::getConstant(const char *in, InsertMode &out)\n{\n\treturn insertModes.find(in, out);\n}\n\nbool ParticleSystem::getConstant(InsertMode in, const char *&out)\n{\n\treturn insertModes.find(in, out);\n}\n\nstd::vector<std::string> ParticleSystem::getConstants(InsertMode)\n{\n\treturn insertModes.getNames();\n}\n\nStringMap<ParticleSystem::AreaSpreadDistribution, ParticleSystem::DISTRIBUTION_MAX_ENUM>::Entry ParticleSystem::distributionsEntries[] =\n{\n\t{ \"none\",    DISTRIBUTION_NONE },\n\t{ \"uniform\", DISTRIBUTION_UNIFORM },\n\t{ \"normal\",  DISTRIBUTION_NORMAL },\n\t{ \"ellipse\",  DISTRIBUTION_ELLIPSE },\n\t{ \"borderellipse\",  DISTRIBUTION_BORDER_ELLIPSE },\n\t{ \"borderrectangle\",  DISTRIBUTION_BORDER_RECTANGLE }\n};\n\nStringMap<ParticleSystem::AreaSpreadDistribution, ParticleSystem::DISTRIBUTION_MAX_ENUM> ParticleSystem::distributions(ParticleSystem::distributionsEntries, sizeof(ParticleSystem::distributionsEntries));\n\nStringMap<ParticleSystem::InsertMode, ParticleSystem::INSERT_MODE_MAX_ENUM>::Entry ParticleSystem::insertModesEntries[] =\n{\n\t{ \"top\",    INSERT_MODE_TOP },\n\t{ \"bottom\", INSERT_MODE_BOTTOM },\n\t{ \"random\", INSERT_MODE_RANDOM },\n};\n\nStringMap<ParticleSystem::InsertMode, ParticleSystem::INSERT_MODE_MAX_ENUM> ParticleSystem::insertModes(ParticleSystem::insertModesEntries, sizeof(ParticleSystem::insertModesEntries));\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/ParticleSystem.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_GRAPHICS_PARTICLE_SYSTEM_H\n#define LOVE_GRAPHICS_PARTICLE_SYSTEM_H\n\n// LOVE\n#include \"common/int.h\"\n#include \"common/math.h\"\n#include \"common/Vector.h\"\n#include \"common/Color.h\"\n#include \"Drawable.h\"\n#include \"Quad.h\"\n#include \"Texture.h\"\n#include \"Buffer.h\"\n\n// STL\n#include <vector>\n\nnamespace love\n{\nnamespace graphics\n{\n\nclass Graphics;\n\n/**\n * A class for creating, moving and drawing particles.\n * A big thanks to bobthebloke.org\n **/\nclass ParticleSystem : public Drawable\n{\npublic:\n\n\tstatic love::Type type;\n\n\t/**\n\t * Type of distribution new particles are drawn from: None, uniform, normal, ellipse, borderellipse, borderrectangle.\n\t */\n\tenum AreaSpreadDistribution\n\t{\n\t\tDISTRIBUTION_NONE,\n\t\tDISTRIBUTION_UNIFORM,\n\t\tDISTRIBUTION_NORMAL,\n\t\tDISTRIBUTION_ELLIPSE,\n\t\tDISTRIBUTION_BORDER_ELLIPSE,\n\t\tDISTRIBUTION_BORDER_RECTANGLE,\n\t\tDISTRIBUTION_MAX_ENUM\n\t};\n\n\t/**\n\t * Insertion modes of new particles in the list: top, bottom, random.\n\t */\n\tenum InsertMode\n\t{\n\t\tINSERT_MODE_TOP,\n\t\tINSERT_MODE_BOTTOM,\n\t\tINSERT_MODE_RANDOM,\n\t\tINSERT_MODE_MAX_ENUM\n\t};\n\n\t/**\n\t * Maximum numbers of particles in a ParticleSystem.\n\t * This limit comes from the fact that a quad requires four vertices and the\n\t * OpenGL API where GLsizei is a signed int.\n\t **/\n\tstatic const uint32 MAX_PARTICLES = LOVE_INT32_MAX / 4;\n\n\t/**\n\t * Creates a particle system with the specified buffer size and texture.\n\t **/\n\tParticleSystem(Texture *texture, uint32 buffer);\n\tParticleSystem(const ParticleSystem &p);\n\n\t/**\n\t * Deletes any allocated memory.\n\t **/\n\tvirtual ~ParticleSystem();\n\n\t/**\n\t * Creates an identical copy of this ParticleSystem. The clone does not\n\t * duplicate any existing particles from this ParticleSystem, just the\n\t * settable parameters.\n\t **/\n\tParticleSystem *clone();\n\n\t/**\n\t * Sets the texture used in the particle system.\n\t * @param texture The new texture.\n\t **/\n\tvoid setTexture(Texture *texture);\n\n\t/**\n\t * Returns the texture used when drawing the particle system.\n\t **/\n\tTexture *getTexture() const;\n\n\t/**\n\t * Clears the current buffer and allocates the appropriate amount of space for the buffer.\n\t * @param size The new buffer size.\n\t **/\n\tvoid setBufferSize(uint32 size);\n\n\t/**\n\t * Returns the total amount of particles this ParticleSystem can have active\n\t * at any given point in time.\n\t **/\n\tuint32 getBufferSize() const;\n\n\t/**\n\t * Sets the insert mode for new particles.\n\t * @param mode The new insert mode.\n\t */\n\tvoid setInsertMode(InsertMode mode);\n\n\t/**\n\t * Returns the current insert mode.\n\t */\n\tInsertMode getInsertMode() const;\n\n\t/**\n\t * Sets the emission rate.\n\t * @param rate The amount of particles per second.\n\t **/\n\tvoid setEmissionRate(float rate);\n\n\t/**\n\t * Returns the number of particles created per second.\n\t **/\n\tfloat getEmissionRate() const;\n\n\t/**\n\t * Sets the lifetime of the particle emitter (-1 means eternal)\n\t * @param life The lifetime (in seconds).\n\t **/\n\tvoid setEmitterLifetime(float life);\n\n\t/**\n\t * Returns the lifetime of the particle emitter.\n\t **/\n\tfloat getEmitterLifetime() const;\n\n\t/**\n\t * Sets the life range of the particles.\n\t * @param min The minimum life.\n\t * @param max The maximum life (if 0, then becomes the same as minimum life).\n\t **/\n\tvoid setParticleLifetime(float min, float max = 0);\n\n\t/**\n\t * Gets the lifetime of a particle.\n\t * @param[out] min The minimum life.\n\t * @param[out] max The maximum life.\n\t **/\n\tvoid getParticleLifetime(float &min, float &max) const;\n\n\t/**\n\t * Sets the position of the center of the emitter.\n\t * Used to move the emitter without changing the position of already existing particles.\n\t * @param x The x-coordinate.\n\t * @param y The y-coordinate.\n\t **/\n\tvoid setPosition(float x, float y);\n\n\t/**\n\t * Returns the position of the emitter.\n\t **/\n\tconst love::Vector2 &getPosition() const;\n\n\t/**\n\t * Moves the position of the center of the emitter.\n\t * When update is called, newly spawned particles will appear in a line\n\t * between the old emitter position and where the emitter was moved to,\n\t * resulting in a smoother-feeling particle system if moveTo is called\n\t * repeatedly.\n\t **/\n\tvoid moveTo(float x, float y);\n\n\t/**\n\t * Sets the emission area spread parameters and distribution type. The interpretation of\n\t * the parameters depends on the distribution type:\n\t *\n\t * * None: Parameters are ignored. No area spread.\n\t * * Uniform: Parameters denote maximal (symmetric) displacement from emitter position.\n\t * * Normal: Parameters denote the standard deviation in x and y direction. x and y are assumed to be uncorrelated.\n\t * * borderellipse: Parameter causes particle distribution around outside of ellipse\n\t * * borderrectangle: Parameter causes particle distribution around outside of rectangle\n\t * @param distribution Distribution type\n\t * @param x First parameter. Interpretation depends on distribution type.\n\t * @param y Second parameter. Interpretation depends on distribution type.\n\t * @param angle The angle of the emission area (in radians).\n\t * @param directionRelativeToCenter whether the initial direction of\n\t *        particles points away from the center of the emission area.\n\t **/\n\tvoid setEmissionArea(AreaSpreadDistribution distribution, float x, float y, float angle, bool directionRelativeToCenter);\n\n\t/**\n\t * Returns area spread parameters.\n\t **/\n\tAreaSpreadDistribution getEmissionArea(love::Vector2 &params, float &angle, bool &directionRelativeToCenter) const;\n\n\t/**\n\t * Sets the direction of the particle emitter.\n\t * @param direction The direction (in degrees).\n\t **/\n\tvoid setDirection(float direction);\n\n\t/**\n\t * Returns the direction of the particle emitter (in radians).\n\t **/\n\tfloat getDirection() const;\n\n\t/**\n\t * Sets the spread of the particle emitter.\n\t * @param spread The spread (in radians).\n\t **/\n\tvoid setSpread(float spread);\n\n\t/**\n\t * Returns the directional spread of the emitter (in radians).\n\t **/\n\tfloat getSpread() const;\n\n\t/**\n\t * Sets the speed of the particles.\n\t * @param speed The speed.\n\t **/\n\tvoid setSpeed(float speed);\n\n\t/**\n\t * Sets the speed of the particles.\n\t * @param min The minimum speed.\n\t * @param max The maximum speed.\n\t **/\n\tvoid setSpeed(float min, float max);\n\n\t/**\n\t * Gets the speed of the particles.\n\t * @param[out] min The minimum speed.\n\t * @param[out] max The maximum speed.\n\t **/\n\tvoid getSpeed(float &min, float &max) const;\n\n\t/**\n\t * Sets the linear acceleration (the acceleration along the x and y axes).\n\t * @param x The acceleration along the x-axis.\n\t * @param y The acceleration along the y-axis.\n\t **/\n\tvoid setLinearAcceleration(float x, float y);\n\n\t/**\n\t * Sets the linear acceleration (the acceleration along the x and y axes).\n\t * @param xmin The minimum amount of acceleration along the x-axis.\n\t * @param ymin The minimum amount of acceleration along the y-axis.\n\t * @param xmax The maximum amount of acceleration along the x-axis.\n\t * @param ymax The maximum amount of acceleration along the y-axis.\n\t **/\n\tvoid setLinearAcceleration(float xmin, float ymin, float xmax, float ymax);\n\n\t/**\n\t * Gets the linear acceleration of the particles.\n\t * @param[out] min The minimum acceleration.\n\t * @param[out] max The maximum acceleration.\n\t **/\n\tvoid getLinearAcceleration(love::Vector2 &min, love::Vector2 &max) const;\n\n\t/**\n\t * Sets the radial acceleration (the acceleration towards the particle emitter).\n\t * @param acceleration The amount of acceleration.\n\t **/\n\tvoid setRadialAcceleration(float acceleration);\n\n\t/**\n\t * Sets the radial acceleration (the acceleration towards the particle emitter).\n\t * @param min The minimum acceleration.\n\t * @param max The maximum acceleration.\n\t **/\n\tvoid setRadialAcceleration(float min, float max);\n\n\t/**\n\t * Gets the radial acceleration.\n\t * @param[out] min The minimum amount of radial acceleration.\n\t * @param[out] max The maximum amount of radial acceleration.\n\t **/\n\tvoid getRadialAcceleration(float &min, float &max) const;\n\n\t/**\n\t * Sets the tangential acceleration (the acceleration perpendicular to the particle's direction).\n\t * @param acceleration The amount of acceleration.\n\t **/\n\tvoid setTangentialAcceleration(float acceleration);\n\n\t/**\n\t * Sets the tangential acceleration (the acceleration perpendicular to the particle's direction).\n\t * @param min The minimum acceleration.\n\t * @param max The maximum acceleration.\n\t **/\n\tvoid setTangentialAcceleration(float min, float max);\n\n\t/**\n\t * Gets the tangential acceleration.\n\t * @param[out] min The minimum tangential acceleration.\n\t * @param[out] max The maximum tangential acceleration.\n\t **/\n\tvoid getTangentialAcceleration(float &min, float &max) const;\n\n\t/**\n\t * Sets the amount of linear damping. Damping reduces the velocity of\n\t * particles over time. A value of 0 corresponds to no damping.\n\t **/\n\tvoid setLinearDamping(float min, float max);\n\n\t/**\n\t * Gets the current amount of linear damping.\n\t **/\n\tvoid getLinearDamping(float &min, float &max) const;\n\n\t/**\n\t * Sets the size of the sprite (1.0 being the default size).\n\t * @param size The size of the sprite.\n\t **/\n\tvoid setSize(float size);\n\n\t/**\n\t * Sets the sizes of the sprite upon creation and upon death (1.0 being the default size).\n\t * @param newSizes Array of sizes\n\t **/\n\tvoid setSizes(const std::vector<float> &newSizes);\n\n\t/**\n\t * Returns the sizes of the particle sprites.\n\t **/\n\tconst std::vector<float> &getSizes() const;\n\n\t/**\n\t * Sets the amount of variation to the sprite's beginning size (0 being no variation and 1.0 a random size between start and end).\n\t * @param variation The amount of variation.\n\t **/\n\tvoid setSizeVariation(float variation);\n\n\t/**\n\t * Returns the amount of initial size variation between particles.\n\t **/\n\tfloat getSizeVariation() const;\n\n\t/**\n\t * Sets the amount of rotation a sprite starts out with.\n\t * @param rotation The amount of rotation.\n\t **/\n\tvoid setRotation(float rotation);\n\n\t/**\n\t * Sets the amount of rotation a sprite starts out with (a random value between min and max).\n\t * @param min The minimum amount of rotation.\n\t * @param max The maximum amount of rotation.\n\t **/\n\tvoid setRotation(float min, float max);\n\n\t/**\n\t * Gets the initial amount of rotation of a particle, in radians.\n\t * @param[out] min The minimum initial rotation.\n\t * @param[out] max The maximum initial rotation.\n\t **/\n\tvoid getRotation(float &min, float &max) const;\n\n\t/**\n\t * Sets the spin of the sprite.\n\t * @param spin The spin of the sprite (in degrees).\n\t **/\n\tvoid setSpin(float spin);\n\n\t/**\n\t * Sets the spin of the sprite upon particle creation and death.\n\t * @param start The spin of the sprite upon creation (in radians / second).\n\t * @param end The spin of the sprite upon death (in radians / second).\n\t **/\n\tvoid setSpin(float start, float end);\n\n\t/**\n\t * Gets the amount of spin of a particle during its lifetime.\n\t * @param[out] start The initial spin, in radians / s.\n\t * @param[out] end The final spin, in radians / s.\n\t **/\n\tvoid getSpin(float &start, float &end) const;\n\n\t/**\n\t * Sets the variation of the start spin (0 being no variation and 1 being a random spin between start and end).\n\t * @param variation The variation.\n\t **/\n\tvoid setSpinVariation(float variation);\n\n\t/**\n\t * Returns the amount of variation of the start spin of a particle.\n\t **/\n\tfloat getSpinVariation() const;\n\n\t/**\n\t * Sets the particles' offsets for rotation.\n\t * @param x The x offset.\n\t * @param y The y offset.\n\t **/\n\tvoid setOffset(float x, float y);\n\n\t/**\n\t * Returns of the particle offset.\n\t **/\n\tlove::Vector2 getOffset() const;\n\n\t/**\n\t * Sets the color of the particles.\n\t * @param newColors Array of colors\n\t **/\n\tvoid setColor(const std::vector<Colorf> &newColors);\n\n\t/**\n\t * Returns the color of the particles.\n\t **/\n\tstd::vector<Colorf> getColor() const;\n\n\t/**\n\t * Sets a list of Quads to use for particles over their lifetime.\n\t **/\n\tvoid setQuads(const std::vector<Quad *> &newQuads);\n\tvoid setQuads();\n\n\t/**\n\t * Gets the Quads used when drawing the particles.\n\t **/\n\tstd::vector<Quad *> getQuads() const;\n\n\t/**\n\t * sets whether particle angles & rotations are relative to their velocities.\n\t **/\n\tvoid setRelativeRotation(bool enable);\n\tbool hasRelativeRotation() const;\n\n\t/**\n\t * Returns the amount of particles that are currently active in the system.\n\t **/\n\tuint32 getCount() const;\n\n\t/**\n\t * Starts/resumes the particle emitter.\n\t **/\n\tvoid start();\n\n\t/**\n\t * Stops the particle emitter and resets.\n\t **/\n\tvoid stop();\n\n\t/**\n\t * Pauses the particle emitter.\n\t **/\n\tvoid pause();\n\n\t/**\n\t * Resets the particle emitter.\n\t **/\n\tvoid reset();\n\n\t/**\n\t * Instantly emits a number of particles.\n\t * @param num The number of particles to emit.\n\t **/\n\tvoid emit(uint32 num);\n\n\t/**\n\t * Returns whether the particle emitter is active.\n\t **/\n\tbool isActive() const;\n\n\t/**\n\t * Returns whether the particle emitter is paused.\n\t **/\n\tbool isPaused() const;\n\n\tbool isStopped() const;\n\n\t/**\n\t * Returns whether the particle system is empty of particles or not.\n\t **/\n\tbool isEmpty() const;\n\n\t/**\n\t * Returns whether the amount of particles has reached the buffer limit or not.\n\t **/\n\tbool isFull() const;\n\n\t/**\n\t * Updates the particle system.\n\t * @param dt Time since last update.\n\t **/\n\tvoid update(float dt);\n\n\t// Implements Drawable.\n\tvoid draw(Graphics *gfx, const Matrix4 &m) override;\n\n\tstatic bool getConstant(const char *in, AreaSpreadDistribution &out);\n\tstatic bool getConstant(AreaSpreadDistribution in, const char *&out);\n\tstatic std::vector<std::string> getConstants(AreaSpreadDistribution);\n\n\tstatic bool getConstant(const char *in, InsertMode &out);\n\tstatic bool getConstant(InsertMode in, const char *&out);\n\tstatic std::vector<std::string> getConstants(InsertMode);\n\nprivate:\n\n\t// Represents a single particle.\n\tstruct Particle\n\t{\n\t\tParticle *prev;\n\t\tParticle *next;\n\n\t\tfloat lifetime;\n\t\tfloat life;\n\n\t\tlove::Vector2 position;\n\n\t\t// Particles gravitate towards this point.\n\t\tlove::Vector2 origin;\n\n\t\tlove::Vector2 velocity;\n\t\tlove::Vector2 linearAcceleration;\n\t\tfloat radialAcceleration;\n\t\tfloat tangentialAcceleration;\n\n\t\tfloat linearDamping;\n\n\t\tfloat size;\n\t\tfloat sizeOffset;\n\t\tfloat sizeIntervalSize;\n\n\t\tfloat rotation; // Amount of rotation applied to the final angle.\n\t\tfloat angle;\n\t\tfloat spinStart;\n\t\tfloat spinEnd;\n\n\t\tColorf color;\n\n\t\tint quadIndex;\n\t};\n\n\tvoid resetOffset();\n\n\tvoid createBuffers(size_t size);\n\tvoid deleteBuffers();\n\n\tvoid addParticle(float t);\n\tParticle *removeParticle(Particle *p);\n\n\t// Called by addParticle.\n\tvoid initParticle(Particle *p, float t);\n\tvoid insertTop(Particle *p);\n\tvoid insertBottom(Particle *p);\n\tvoid insertRandom(Particle *p);\n\n\t// Pointer to the beginning of the allocated memory.\n\tParticle *pMem;\n\n\t// Pointer to a free particle.\n\tParticle *pFree;\n\n\t// Pointer to the start of the linked list.\n\tParticle *pHead;\n\n\t// Pointer to the end of the linked list.\n\tParticle *pTail;\n\n\t// The texture to be drawn.\n\tStrongRef<Texture> texture;\n\n\t// Whether the particle emitter is active.\n\tbool active;\n\n\t// Insert mode of new particles.\n\tInsertMode insertMode;\n\n\t// The maximum number of particles.\n\tuint32 maxParticles;\n\n\t// The number of active particles.\n\tuint32 activeParticles;\n\n\t// The emission rate (particles/sec).\n\tfloat emissionRate;\n\n\t// Used to determine when a particle should be emitted.\n\tfloat emitCounter;\n\n\t// The relative position of the particle emitter.\n\tlove::Vector2 position;\n\tlove::Vector2 prevPosition;\n\n\t// Emission area spread.\n\tAreaSpreadDistribution emissionAreaDistribution;\n\tlove::Vector2 emissionArea;\n\tfloat emissionAreaAngle;\n\tbool directionRelativeToEmissionCenter;\n\n\t// The lifetime of the particle emitter (-1 means infinite) and the life it has left.\n\tfloat lifetime;\n\tfloat life;\n\n\t// The particle life.\n\tfloat particleLifeMin;\n\tfloat particleLifeMax;\n\n\t// The direction (and spread) the particles will be emitted in. Measured in radians.\n\tfloat direction;\n\tfloat spread;\n\n\t// The speed.\n\tfloat speedMin;\n\tfloat speedMax;\n\n\t// Acceleration along the x and y axes.\n\tlove::Vector2 linearAccelerationMin;\n\tlove::Vector2 linearAccelerationMax;\n\n\t// Acceleration towards the emitter's center\n\tfloat radialAccelerationMin;\n\tfloat radialAccelerationMax;\n\n\t// Acceleration perpendicular to the particle's direction.\n\tfloat tangentialAccelerationMin;\n\tfloat tangentialAccelerationMax;\n\n\tfloat linearDampingMin;\n\tfloat linearDampingMax;\n\n\t// Size.\n\tstd::vector<float> sizes;\n\tfloat sizeVariation;\n\n\t// Rotation\n\tfloat rotationMin;\n\tfloat rotationMax;\n\n\t// Spin.\n\tfloat spinStart;\n\tfloat spinEnd;\n\tfloat spinVariation;\n\n\t// Offsets\n\tlove::Vector2 offset;\n\n\t// Is the ParticleSystem using a default offset?\n\tbool defaultOffset;\n\n\t// Color.\n\tstd::vector<Colorf> colors;\n\n\t// Quads.\n\tstd::vector<StrongRef<Quad>> quads;\n\n\tbool relativeRotation;\n\n\tVertexAttributesID vertexAttributesID;\n\tBuffer *buffer;\n\n\tstatic StringMap<AreaSpreadDistribution, DISTRIBUTION_MAX_ENUM>::Entry distributionsEntries[];\n\tstatic StringMap<AreaSpreadDistribution, DISTRIBUTION_MAX_ENUM> distributions;\n\n\tstatic StringMap<InsertMode, INSERT_MODE_MAX_ENUM>::Entry insertModesEntries[];\n\tstatic StringMap<InsertMode, INSERT_MODE_MAX_ENUM> insertModes;\n};\n\n} // graphics\n} // love\n\n#endif // LOVE_GRAPHICS_PARTICLE_SYSTEM_H\n"
  },
  {
    "path": "src/modules/graphics/Polyline.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"Polyline.h\"\n#include \"graphics/Graphics.h\"\n\n// C++\n#include <algorithm>\n\n// treat adjacent segments with angles between their directions <5 degree as straight\nstatic const float LINES_PARALLEL_EPS = 0.05f;\n\nnamespace love\n{\nnamespace graphics\n{\n\nvoid Polyline::render(const Vector2 *coords, size_t count, size_t size_hint, float halfwidth, float pixel_size, bool draw_overdraw)\n{\n\tstatic std::vector<Vector2> anchors;\n\tanchors.clear();\n\tanchors.reserve(size_hint);\n\n\tstatic std::vector<Vector2> normals;\n\tnormals.clear();\n\tnormals.reserve(size_hint);\n\n\t// prepare vertex arrays\n\tif (draw_overdraw)\n\t\thalfwidth -= pixel_size * 0.3f;\n\n\t// compute sleeve\n\tbool is_looping = (coords[0] == coords[count - 1]);\n\tVector2 segment;\n\tif (!is_looping) // virtual starting point at second point mirrored on first point\n\t\tsegment = coords[1] - coords[0];\n\telse // virtual starting point at last vertex\n\t\tsegment = coords[0] - coords[count - 2];\n\n\tfloat segmentLength = segment.getLength();\n\tVector2 segmentNormal = segment.getNormal(halfwidth / segmentLength);\n\n\tVector2 pointA, pointB(coords[0]);\n\tfor (size_t i = 0; i + 1 < count; i++)\n\t{\n\t\tpointA = pointB;\n\t\tpointB = coords[i + 1];\n\t\trenderEdge(anchors, normals, segment, segmentLength, segmentNormal, pointA, pointB, halfwidth);\n\t}\n\n\tpointA = pointB;\n\tpointB = is_looping ? coords[1] : pointB + segment;\n\trenderEdge(anchors, normals, segment, segmentLength, segmentNormal, pointA, pointB, halfwidth);\n\n\tvertex_count = normals.size();\n\n\tsize_t extra_vertices = 0;\n\n\tif (draw_overdraw)\n\t{\n\t\tcalc_overdraw_vertex_count(is_looping);\n\n\t\t// When drawing overdraw lines using triangle strips, we want to add an\n\t\t// extra degenerate triangle in between the core line and the overdraw\n\t\t// line in order to break up the strip into two. This will let us draw\n\t\t// everything in one draw call.\n\t\tif (triangle_mode == TRIANGLEINDEX_STRIP)\n\t\t\textra_vertices = 2;\n\t}\n\n\t// Use a single linear array for both the regular and overdraw vertices.\n\tvertices = new Vector2[vertex_count + extra_vertices + overdraw_vertex_count];\n\n\tfor (size_t i = 0; i < vertex_count; ++i)\n\t\tvertices[i] = anchors[i] + normals[i];\n\n\tif (draw_overdraw)\n\t{\n\t\toverdraw = vertices + vertex_count + extra_vertices;\n\t\toverdraw_vertex_start = vertex_count + extra_vertices;\n\t\trender_overdraw(normals, pixel_size, is_looping);\n\t}\n\n\t// Add the degenerate triangle strip.\n\tif (extra_vertices && vertex_count > 0)\n\t{\n\t\tvertices[vertex_count + 0] = vertices[vertex_count - 1];\n\t\tvertices[vertex_count + 1] = vertices[overdraw_vertex_start];\n\t}\n}\n\nvoid NoneJoinPolyline::renderEdge(std::vector<Vector2> &anchors, std::vector<Vector2> &normals,\n                                Vector2 &segment, float &segmentLength, Vector2 &segmentNormal,\n                                const Vector2 &pointA, const Vector2 &pointB, float halfWidth)\n{\n\t//   ns1------ns2\n\t//    |        |\n\t//    q ------ r\n\t//    |        |\n\t// (-ns1)----(-ns2)\n\n\tanchors.push_back(pointA);\n\tanchors.push_back(pointA);\n\tnormals.push_back(segmentNormal);\n\tnormals.push_back(-segmentNormal);\n\n\tsegment = (pointB - pointA);\n\tsegmentLength = segment.getLength();\n\tsegmentNormal = segment.getNormal(halfWidth / segmentLength);\n\n\tanchors.push_back(pointA);\n\tanchors.push_back(pointA);\n\tnormals.push_back(segmentNormal);\n\tnormals.push_back(-segmentNormal);\n}\n\n\n/** Calculate line boundary points.\n *\n * Sketch:\n *\n *              u1\n * -------------+---...___\n *              |         ```'''--  ---\n * p- - - - - - q- - . _ _           | w/2\n *              |          ` ' ' r   +\n * -------------+---...___           | w/2\n *              u2         ```'''-- ---\n *\n * u1 and u2 depend on four things:\n *   - the half line width w/2\n *   - the previous line vertex p\n *   - the current line vertex q\n *   - the next line vertex r\n *\n * u1/u2 are the intersection points of the parallel lines to p-q and q-r,\n * i.e. the point where\n *\n *    (q + w/2 * ns) + lambda * (q - p) = (q + w/2 * nt) + mu * (r - q)   (u1)\n *    (q - w/2 * ns) + lambda * (q - p) = (q - w/2 * nt) + mu * (r - q)   (u2)\n *\n * with ns,nt being the normals on the segments s = p-q and t = q-r,\n *\n *    ns = perp(s) / |s|\n *    nt = perp(t) / |t|.\n *\n * Using the linear equation system (similar for u2)\n *\n *         q + w/2 * ns + lambda * s - (q + w/2 * nt + mu * t) = 0                 (u1)\n *    <=>  q-q + lambda * s - mu * t                          = (nt - ns) * w/2\n *    <=>  lambda * s   - mu * t                              = (nt - ns) * w/2\n *\n * the intersection points can be efficiently calculated using Cramer's rule.\n */\nvoid MiterJoinPolyline::renderEdge(std::vector<Vector2> &anchors, std::vector<Vector2> &normals,\n                                   Vector2 &segment, float &segmentLength, Vector2 &segmentNormal,\n                                   const Vector2 &pointA, const Vector2 &pointB, float halfwidth)\n{\n\tVector2 newSegment = (pointB - pointA);\n\tfloat newSegmentLength = newSegment.getLength();\n\tif (newSegmentLength == 0.0f)\n\t{\n\t\t// degenerate segment, skip it\n\t\treturn;\n\t}\n\n\tVector2 newSegmentNormal = newSegment.getNormal(halfwidth / newSegmentLength);\n\n\tanchors.push_back(pointA);\n\tanchors.push_back(pointA);\n\n\tfloat det = Vector2::cross(segment, newSegment);\n\tif (fabs(det) / (segmentLength * newSegmentLength) < LINES_PARALLEL_EPS)\n\t{\n\t\t// lines parallel, compute as u1 = q + ns * w/2, u2 = q - ns * w/2\n\t\tnormals.push_back(segmentNormal);\n\t\tnormals.push_back(-segmentNormal);\n\n\t\tif (Vector2::dot(segment, newSegment) < 0)\n\t\t{\n\t\t\t// line reverses direction; because the normal flips, the\n\t\t\t// triangle strip would twist here, so insert a zero-size\n\t\t\t// quad to contain the twist\n\t\t\t//  ____.___.____\n\t\t\t// |    |\\ /|    |\n\t\t\t// p    q X q    r\n\t\t\t// |____|/ \\|____|\n\t\t\tanchors.push_back(pointA);\n\t\t\tanchors.push_back(pointA);\n\t\t\tnormals.push_back(-segmentNormal);\n\t\t\tnormals.push_back(segmentNormal);\n\t\t}\n\t}\n\telse\n\t{\n\t\t// cramers rule\n\t\tfloat lambda = Vector2::cross((newSegmentNormal - segmentNormal), newSegment) / det;\n\t\tVector2 d = segmentNormal + segment * lambda;\n\t\tnormals.push_back(d);\n\t\tnormals.push_back(-d);\n\t}\n\n\tsegment = newSegment;\n\tsegmentNormal = newSegmentNormal;\n\tsegmentLength = newSegmentLength;\n}\n\n/** Calculate line boundary points.\n *\n * Sketch:\n *\n *     uh1___uh2\n *      .'   '.\n *    .'   q   '.\n *  .'   '   '   '.\n *.'   '  .'.  '   '.\n *   '  .' ul'.  '\n * p  .'       '.  r\n *\n *\n * ul can be found as above, uh1 and uh2 are much simpler:\n *\n * uh1 = q + ns * w/2, uh2 = q + nt * w/2\n */\nvoid BevelJoinPolyline::renderEdge(std::vector<Vector2> &anchors, std::vector<Vector2> &normals,\n                                   Vector2 &segment, float &segmentLength, Vector2 &segmentNormal,\n                                   const Vector2 &pointA, const Vector2 &pointB, float halfWidth)\n{\n\tVector2 newSegment = (pointB - pointA);\n\tfloat newSegmentLength = newSegment.getLength();\n\n\tfloat det = Vector2::cross(segment, newSegment);\n\tif (fabs(det) / (segmentLength * newSegmentLength) < LINES_PARALLEL_EPS)\n\t{\n\t\t// lines parallel, compute as u1 = q + ns * w/2, u2 = q - ns * w/2\n\t\tVector2 newSegmentNormal = newSegment.getNormal(halfWidth / newSegmentLength);\n\t\tanchors.push_back(pointA);\n\t\tanchors.push_back(pointA);\n\t\tnormals.push_back(segmentNormal);\n\t\tnormals.push_back(-segmentNormal);\n\n\t\tif (Vector2::dot(segment, newSegment) < 0)\n\t\t{\n\t\t\t// line reverses direction; same as for miter\n\t\t\tanchors.push_back(pointA);\n\t\t\tanchors.push_back(pointA);\n\t\t\tnormals.push_back(-segmentNormal);\n\t\t\tnormals.push_back(segmentNormal);\n\t\t}\n\n\t\tsegment = newSegment;\n\t\tsegmentLength = newSegmentLength;\n\t\tsegmentNormal = newSegmentNormal;\n\t\treturn; // early out\n\t}\n\n\t// cramers rule\n\tVector2 newSegmentNormal = newSegment.getNormal(halfWidth / newSegmentLength);\n\tfloat lambda = Vector2::cross((newSegmentNormal - segmentNormal), newSegment) / det;\n\tVector2 d = segmentNormal + segment * lambda;\n\n\tanchors.push_back(pointA);\n\tanchors.push_back(pointA);\n\tanchors.push_back(pointA);\n\tanchors.push_back(pointA);\n\tif (det > 0) // 'left' turn -> intersection on the top\n\t{\n\t\tnormals.push_back(d);\n\t\tnormals.push_back(-segmentNormal);\n\t\tnormals.push_back(d);\n\t\tnormals.push_back(-newSegmentNormal);\n\t}\n\telse\n\t{\n\t\tnormals.push_back(segmentNormal);\n\t\tnormals.push_back(-d);\n\t\tnormals.push_back(newSegmentNormal);\n\t\tnormals.push_back(-d);\n\t}\n\tsegment = newSegment;\n\tsegmentLength = newSegmentLength;\n\tsegmentNormal = newSegmentNormal;\n}\n\nvoid Polyline::calc_overdraw_vertex_count(bool is_looping)\n{\n\toverdraw_vertex_count = 2 * vertex_count + (is_looping ? 0 : 2);\n}\n\nvoid Polyline::render_overdraw(const std::vector<Vector2> &normals, float pixel_size, bool is_looping)\n{\n\t// upper segment\n\tfor (size_t i = 0; i + 1 < vertex_count; i += 2)\n\t{\n\t\toverdraw[i]   = vertices[i];\n\t\toverdraw[i+1] = vertices[i] + normals[i] * (pixel_size / normals[i].getLength());\n\t}\n\t// lower segment\n\tfor (size_t i = 0; i + 1 < vertex_count; i += 2)\n\t{\n\t\tsize_t k = vertex_count - i - 1;\n\t\toverdraw[vertex_count + i]   = vertices[k];\n\t\toverdraw[vertex_count + i+1] = vertices[k] + normals[k] * (pixel_size / normals[k].getLength());\n\t}\n\n\t// if not looping, the outer overdraw vertices need to be displaced\n\t// to cover the line endings, i.e.:\n\t// +- - - - //- - +         +- - - - - //- - - +\n\t// +-------//-----+         : +-------//-----+ :\n\t// | core // line |   -->   : | core // line | :\n\t// +-----//-------+         : +-----//-------+ :\n\t// +- - //- - - - +         +- - - //- - - - - +\n\tif (!is_looping)\n\t{\n\t\t// left edge\n\t\tVector2 spacer = (overdraw[1] - overdraw[3]);\n\t\tspacer.normalize(pixel_size);\n\t\toverdraw[1] += spacer;\n\t\toverdraw[overdraw_vertex_count - 3] += spacer;\n\n\t\t// right edge\n\t\tspacer = (overdraw[vertex_count-1] - overdraw[vertex_count-3]);\n\t\tspacer.normalize(pixel_size);\n\t\toverdraw[vertex_count-1] += spacer;\n\t\toverdraw[vertex_count+1] += spacer;\n\n\t\t// we need to draw two more triangles to close the\n\t\t// overdraw at the line start.\n\t\toverdraw[overdraw_vertex_count-2] = overdraw[0];\n\t\toverdraw[overdraw_vertex_count-1] = overdraw[1];\n\t}\n}\n\nvoid NoneJoinPolyline::calc_overdraw_vertex_count(bool /*is_looping*/)\n{\n\toverdraw_vertex_count = 4 * (vertex_count-2); // less than ideal\n}\n\nvoid NoneJoinPolyline::render_overdraw(const std::vector<Vector2> &/*normals*/, float pixel_size, bool /*is_looping*/)\n{\n\tfor (size_t i = 2; i + 3 < vertex_count; i += 4)\n\t{\n\t\t// v0-v2\n\t\t// | / | <- main quad line\n\t\t// v1-v3\n\n\t\tVector2 s = vertices[i+0] - vertices[i+2];\n\t\tVector2 t = vertices[i+0] - vertices[i+1];\n\t\ts.normalize(pixel_size);\n\t\tt.normalize(pixel_size);\n\n\t\tconst size_t k = 4 * (i - 2);\n\n\t\toverdraw[k+0] = vertices[i+0];\n\t\toverdraw[k+1] = vertices[i+1];\n\t\toverdraw[k+2] = vertices[i+0] + s + t;\n\t\toverdraw[k+3] = vertices[i+1] + s - t;\n\n\t\toverdraw[k+4] = vertices[i+1];\n\t\toverdraw[k+5] = vertices[i+3];\n\t\toverdraw[k+6] = vertices[i+1] + s - t;\n\t\toverdraw[k+7] = vertices[i+3] - s - t;\n\n\t\toverdraw[k+ 8] = vertices[i+3];\n\t\toverdraw[k+ 9] = vertices[i+2];\n\t\toverdraw[k+10] = vertices[i+3] - s - t;\n\t\toverdraw[k+11] = vertices[i+2] - s + t;\n\n\t\toverdraw[k+12] = vertices[i+2];\n\t\toverdraw[k+13] = vertices[i+0];\n\t\toverdraw[k+14] = vertices[i+2] - s + t;\n\t\toverdraw[k+15] = vertices[i+0] + s + t;\n\t}\n}\n\nPolyline::~Polyline()\n{\n\tif (vertices)\n\t\tdelete[] vertices;\n}\n\nvoid Polyline::draw(love::graphics::Graphics *gfx)\n{\n\tconst Matrix4 &t = gfx->getTransform();\n\tbool is2D = t.isAffine2DTransform();\n\tColor32 curcolor = toColor32(gfx->getColor());\n\n\tint overdraw_start = (int) overdraw_vertex_start;\n\tint overdraw_count = (int) overdraw_vertex_count;\n\n\tint total_vertex_count = (int) vertex_count;\n\tif (overdraw)\n\t\ttotal_vertex_count = overdraw_start + overdraw_count;\n\n\t// love's automatic batching can only deal with < 65k vertices per draw.\n\t// uint16_max - 3 is evenly divisible by 6 (needed for quads mode).\n\tint maxvertices = LOVE_UINT16_MAX - 3;\n\n\tint advance = maxvertices;\n\tif (triangle_mode == TRIANGLEINDEX_STRIP)\n\t\tadvance -= 2;\n\n\tfor (int vertex_start = 0; vertex_start < total_vertex_count; vertex_start += advance)\n\t{\n\t\tconst Vector2 *verts = vertices + vertex_start;\n\n\t\tGraphics::BatchedDrawCommand cmd;\n\t\tcmd.formats[0] = getSinglePositionFormat(is2D);\n\t\tcmd.formats[1] = CommonFormat::STf_RGBAub;\n\t\tcmd.indexMode = triangle_mode;\n\t\tcmd.vertexCount = std::min(maxvertices, total_vertex_count - vertex_start);\n\n\t\tGraphics::BatchedVertexData data = gfx->requestBatchedDraw(cmd);\n\n\t\tif (is2D)\n\t\t\tt.transformXY((Vector2 *) data.stream[0], verts, cmd.vertexCount);\n\t\telse\n\t\t\tt.transformXY0((Vector3 *) data.stream[0], verts, cmd.vertexCount);\n\n\t\tSTf_RGBAub *attributes = (STf_RGBAub *) data.stream[1];\n\n\t\tint draw_rough_count = std::min(cmd.vertexCount, (int) vertex_count - vertex_start);\n\n\t\t// Constant vertex color up to the overdraw vertices.\n\t\t// Texture coordinates are a constant value, we only have them to keep auto-batching\n\t\t// when drawing filled and line polygons together.\n\t\tfor (int i = 0; i < draw_rough_count; i++)\n\t\t{\n\t\t\tattributes[i].s = 0.0f;\n\t\t\tattributes[i].t = 0.0f;\n\t\t\tattributes[i].color = curcolor;\n\t\t}\n\n\t\tif (overdraw)\n\t\t{\n\t\t\tint draw_remaining_count = cmd.vertexCount - draw_rough_count;\n\n\t\t\tint draw_overdraw_begin = overdraw_start - vertex_start;\n\t\t\tint draw_overdraw_end = draw_overdraw_begin + overdraw_count;\n\n\t\t\tdraw_overdraw_begin = std::max(0, draw_overdraw_begin);\n\n\t\t\tint draw_overdraw_count = std::min(draw_remaining_count, draw_overdraw_end - draw_overdraw_begin);\n\n\t\t\tif (draw_overdraw_count > 0)\n\t\t\t{\n\t\t\t\tSTf_RGBAub *c = attributes + draw_overdraw_begin;\n\t\t\t\tfill_color_array(curcolor, c, draw_overdraw_count);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid Polyline::fill_color_array(Color32 constant_color, STf_RGBAub *attributes, int count)\n{\n\t// Note: assigning each element individually seems to be needed to avoid\n\t// performance issues in OpenGL + Windows. VS' compiler is likely doing\n\t// something that doesn't play nice with write-combined memory from the\n\t// graphics driver, when assigning a whole struct after modifying it, or\n\t// when using memcpy.\n\tfor (int i = 0; i < count; ++i)\n\t{\n\t\tattributes[i].s = 0.0f;\n\t\tattributes[i].t = 0.0f;\n\t\tattributes[i].color.r = constant_color.r;\n\t\tattributes[i].color.g = constant_color.g;\n\t\tattributes[i].color.b = constant_color.b;\n\t\tattributes[i].color.a = constant_color.a * ((i + 1) % 2); // avoids branching. equiv to if (i%2 == 1) c.a = 0;\n\t}\n}\n\nvoid NoneJoinPolyline::fill_color_array(Color32 constant_color, STf_RGBAub *attributes, int count)\n{\n\tfor (int i = 0; i < count; ++i)\n\t{\n\t\tattributes[i].s = 0.0f;\n\t\tattributes[i].t = 0.0f;\n\t\tattributes[i].color.r = constant_color.r;\n\t\tattributes[i].color.g = constant_color.g;\n\t\tattributes[i].color.b = constant_color.b;\n\t\tattributes[i].color.a = constant_color.a * ((i & 3) < 2); // if (i % 4 == 2 || i % 4 == 3) c.a = 0\n\t}\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/Polyline.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/Vector.h\"\n#include \"graphics/vertex.h\"\n\n// C++\n#include <vector>\n#include <string.h>\n\nnamespace love\n{\nnamespace graphics\n{\n\nclass Graphics;\n\n/**\n * Abstract base class for a chain of segments.\n * @author Matthias Richter\n **/\nclass Polyline\n{\npublic:\n\n\tPolyline(TriangleIndexMode mode = TRIANGLEINDEX_STRIP)\n\t\t: vertices(nullptr)\n\t\t, overdraw(nullptr)\n\t\t, vertex_count(0)\n\t\t, overdraw_vertex_count(0)\n\t\t, triangle_mode(mode)\n\t\t, overdraw_vertex_start(0)\n\t{}\n\n\tvirtual ~Polyline();\n\n\t/**\n\t * @param vertices      Vertices defining the core line segments\n\t * @param count         Number of vertices\n\t * @param size_hint     Expected number of vertices of the rendering sleeve around the core line.\n\t * @param halfwidth     linewidth / 2.\n\t * @param pixel_size    Dimension of one pixel on the screen in world coordinates.\n\t * @param draw_overdraw Fake antialias the line.\n\t */\n\tvoid render(const Vector2 *vertices, size_t count, size_t size_hint, float halfwidth, float pixel_size, bool draw_overdraw);\n\n\t/** Draws the line on the screen\n\t */\n\tvoid draw(love::graphics::Graphics *gfx);\n\nprotected:\n\n\tvirtual void calc_overdraw_vertex_count(bool is_looping);\n\tvirtual void render_overdraw(const std::vector<Vector2> &normals, float pixel_size, bool is_looping);\n\tvirtual void fill_color_array(Color32 constant_color, STf_RGBAub *attributes, int count);\n\n\t/** Calculate line boundary points.\n\t *\n\t * @param[out]    anchors       Anchor points defining the core line.\n\t * @param[out]    normals       Normals defining the edge of the sleeve.\n\t * @param[in,out] segment       Direction of segment pq (updated to the segment qr).\n\t * @param[in,out] segmentLength Length of segment pq (updated to the segment qr).\n\t * @param[in,out] segmentNormal Normal on the segment pq (updated to the segment qr).\n\t * @param[in]     pointA        Current point on the line (q).\n\t * @param[in]     pointB        Next point on the line (r).\n\t * @param[in]     halfWidth     Half line width (see Polyline.render()).\n\t */\n\tvirtual void renderEdge(std::vector<Vector2> &anchors, std::vector<Vector2> &normals,\n\t                        Vector2 &segment, float &segmentLength, Vector2 &segmentNormal,\n\t                        const Vector2 &pointA, const Vector2 &pointB, float halfWidth) = 0;\n\n\tVector2 *vertices;\n\tVector2 *overdraw;\n\tsize_t vertex_count;\n\tsize_t overdraw_vertex_count;\n\tTriangleIndexMode triangle_mode;\n\tsize_t overdraw_vertex_start;\n\n}; // Polyline\n\n\n/**\n * A Polyline whose segments are not connected.\n * @author Matthias Richter\n */\nclass NoneJoinPolyline : public Polyline\n{\npublic:\n\n\tNoneJoinPolyline()\n\t\t: Polyline(TRIANGLEINDEX_QUADS)\n\t{}\n\n\tvoid render(const Vector2 *vertices, size_t count, float halfwidth, float pixel_size, bool draw_overdraw)\n\t{\n\t\tPolyline::render(vertices, count, 4 * count - 4, halfwidth, pixel_size, draw_overdraw);\n\n\t\t// discard the first and last two vertices. (these are redundant)\n\t\tfor (size_t i = 0; i < vertex_count - 4; ++i)\n\t\t\tthis->vertices[i] = this->vertices[i+2];\n\n\t\t// The last quad is now garbage, so zero it out to make sure it doesn't\n\t\t// get rasterized. These vertices are in between the core line vertices\n\t\t// and the overdraw vertices in the combined vertex array, so they still\n\t\t// get \"rendered\" since we draw everything with one draw call.\n\t\tmemset(&this->vertices[vertex_count - 4], 0, sizeof(love::Vector2) * 4);\n\n\t\tvertex_count -= 4;\n\t}\n\nprotected:\n\n\tvoid calc_overdraw_vertex_count(bool is_looping) override;\n\tvoid render_overdraw(const std::vector<Vector2> &normals, float pixel_size, bool is_looping) override;\n\tvoid fill_color_array(Color32 constant_color, STf_RGBAub *attributes, int count) override;\n\tvoid renderEdge(std::vector<Vector2> &anchors, std::vector<Vector2> &normals,\n\t                Vector2 &s, float &len_s, Vector2 &ns, const Vector2 &q,\n\t                const Vector2 &r, float hw) override;\n\n}; // NoneJoinPolyline\n\n\n/**\n * A Polyline whose segments are connected by a sharp edge.\n * @author Matthias Richter\n */\nclass MiterJoinPolyline : public Polyline\n{\npublic:\n\n\tvoid render(const Vector2 *vertices, size_t count, float halfwidth, float pixel_size, bool draw_overdraw)\n\t{\n\t\tPolyline::render(vertices, count, 2 * count, halfwidth, pixel_size, draw_overdraw);\n\t}\n\nprotected:\n\n\tvoid renderEdge(std::vector<Vector2> &anchors, std::vector<Vector2> &normals,\n\t                Vector2 &s, float &len_s, Vector2 &ns, const Vector2 &q,\n\t                const Vector2 &r, float hw) override;\n\n}; // MiterJoinPolyline\n\n\n/**\n * A Polyline whose segments are connected by a flat edge.\n * @author Matthias Richter\n */\nclass BevelJoinPolyline : public Polyline\n{\npublic:\n\n\tvoid render(const Vector2 *vertices, size_t count, float halfwidth, float pixel_size, bool draw_overdraw)\n\t{\n\t\tPolyline::render(vertices, count, 4 * count - 4, halfwidth, pixel_size, draw_overdraw);\n\t}\n\nprotected:\n\n\tvoid renderEdge(std::vector<Vector2> &anchors, std::vector<Vector2> &normals,\n\t                Vector2 &s, float &len_s, Vector2 &ns, const Vector2 &q,\n\t                const Vector2 &r, float hw) override;\n\n}; // BevelJoinPolyline\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/Quad.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"Quad.h\"\n\n// C\n#include <cstring> // For memcpy\n\nnamespace love\n{\nnamespace graphics\n{\n\nlove::Type Quad::type(\"Quad\", &Object::type);\n\nQuad::Quad(const Quad::Viewport &v, double sw, double sh)\n\t: sw(sw)\n\t, sh(sh)\n{\n\tarrayLayer = 0;\n\trefresh(v, sw, sh);\n}\n\nQuad::~Quad()\n{\n}\n\nvoid Quad::refresh(const Quad::Viewport &v, double sw, double sh)\n{\n\tthis->viewport = v;\n\tthis->sw = sw;\n\tthis->sh = sh;\n\n\t// Vertices are ordered for use with triangle strips:\n\t// 0---2\n\t// | / |\n\t// 1---3\n\tvertexPositions[0] = Vector2(0.0f, 0.0f);\n\tvertexPositions[1] = Vector2(0.0f, (float) v.h);\n\tvertexPositions[2] = Vector2((float) v.w, 0.0f);\n\tvertexPositions[3] = Vector2((float) v.w, (float) v.h);\n\n\tvertexTexCoords[0] = Vector2((float) (v.x / sw), (float) (v.y / sh));\n\tvertexTexCoords[1] = Vector2((float) (v.x / sw), (float) ((v.y + v.h) / sh));\n\tvertexTexCoords[2] = Vector2((float) ((v.x + v.w) / sw), (float) (v.y / sh));\n\tvertexTexCoords[3] = Vector2((float) ((v.x + v.w) / sw), (float) ((v.y + v.h) / sh));\n}\n\nvoid Quad::setViewport(const Quad::Viewport &v)\n{\n\trefresh(v, sw, sh);\n}\n\nQuad::Viewport Quad::getViewport() const\n{\n\treturn viewport;\n}\n\ndouble Quad::getTextureWidth() const\n{\n\treturn sw;\n}\n\ndouble Quad::getTextureHeight() const\n{\n\treturn sh;\n}\n\nvoid Quad::setLayer(int layer)\n{\n\tarrayLayer = layer;\n}\n\nint Quad::getLayer() const\n{\n\treturn arrayLayer;\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/Quad.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_GRAPHICS_QUAD_H\n#define LOVE_GRAPHICS_QUAD_H\n\n// LOVE\n#include \"common/Object.h\"\n#include \"common/math.h\"\n#include \"common/Vector.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nclass Quad : public Object\n{\npublic:\n\n\tstatic love::Type type;\n\n\tstruct Viewport\n\t{\n\t\tdouble x, y;\n\t\tdouble w, h;\n\t};\n\n\tQuad(const Viewport &v, double sw, double sh);\n\tvirtual ~Quad();\n\n\tvoid refresh(const Viewport &v, double sw, double sh);\n\tvoid setViewport(const Viewport &v);\n\tViewport getViewport() const;\n\n\tdouble getTextureWidth() const;\n\tdouble getTextureHeight() const;\n\n\tconst Vector2 *getVertexPositions() const { return vertexPositions; }\n\tconst Vector2 *getVertexTexCoords() const { return vertexTexCoords; }\n\n\tvoid setLayer(int layer);\n\tint getLayer() const;\n\nprivate:\n\n\tVector2 vertexPositions[4];\n\tVector2 vertexTexCoords[4];\n\n\tint arrayLayer;\n\n\tViewport viewport;\n\tdouble sw;\n\tdouble sh;\n\n}; // Quad\n\n} // graphics\n} // love\n\n#endif // LOVE_GRAPHICS_QUAD_H\n"
  },
  {
    "path": "src/modules/graphics/Resource.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include <stddef.h>\n\nnamespace love\n{\nnamespace graphics\n{\n\nclass Resource\n{\npublic:\n\n\tvirtual ~Resource() {}\n\tvirtual ptrdiff_t getHandle() const = 0;\n\n}; // Resource\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/Shader.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n*    claim that you wrote the original software. If you use this software\n*    in a product, an acknowledgment in the product documentation would be\n*    appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n*    misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n**/\n\n// LOVE\n#include \"Shader.h\"\n#include \"Graphics.h\"\n#include \"math/MathModule.h\"\n#include \"common/Range.h\"\n\n// glslang\n#include \"libraries/glslang/glslang/Public/ShaderLang.h\"\n#include \"libraries/glslang/glslang/Public/ResourceLimits.h\"\n\n// Needed for reflection information.\n#include \"libraries/glslang/glslang/Include/Types.h\"\n#include \"libraries/glslang/glslang/MachineIndependent/localintermediate.h\"\n\n// C++\n#include <string>\n#include <regex>\n#include <sstream>\n\nnamespace love\n{\nnamespace graphics\n{\n\nnamespace glsl\n{\n\nstatic const char global_syntax[] = R\"(\n#define LOVE_HIGHP_OR_MEDIUMP highp\n#define number float\n#define Image sampler2D\n#define ArrayImage sampler2DArray\n#define CubeImage samplerCube\n#define VolumeImage sampler3D\n#define DepthImage sampler2DShadow\n#define DepthArrayImage sampler2DArrayShadow\n#define DepthCubeImage samplerCubeShadow\n#define extern uniform\n\n#if __VERSION__ >= 430 || (defined(GL_ES) && __VERSION__ >= 310)\n\tlayout (std430) buffer;\n#endif\n)\";\n\nstatic const char render_uniforms[] = R\"(\nuniform highp vec4 love_UniformsPerDraw[12];\n\n// Older GLSL doesn't support preprocessor line continuations...\n#define TransformMatrix mat4(love_UniformsPerDraw[0], love_UniformsPerDraw[1], love_UniformsPerDraw[2], love_UniformsPerDraw[3])\n#define ProjectionMatrix mat4(love_UniformsPerDraw[4], love_UniformsPerDraw[5], love_UniformsPerDraw[6], love_UniformsPerDraw[7])\n#define TransformProjectionMatrix (ProjectionMatrix * TransformMatrix)\n\n#define CurrentDPIScale (love_UniformsPerDraw[8].x)\n#define ConstantPointSize (love_UniformsPerDraw[8].y)\n#define love_ClipSpaceParams (love_UniformsPerDraw[9])\n#define ConstantColor (love_UniformsPerDraw[10])\n#define love_ScreenSize (love_UniformsPerDraw[11])\n\n// Alternate names\n#define ViewSpaceFromLocal TransformMatrix\n#define ClipSpaceFromView ProjectionMatrix\n#define ClipSpaceFromLocal TransformProjectionMatrix\n)\";\n\nstatic const char global_functions[] = R\"(\n#ifdef GL_ES\n\tprecision mediump sampler2D;\n\tprecision mediump sampler2DArray;\n\tprecision mediump sampler3D;\n\tprecision mediump samplerCube;\n\tprecision mediump sampler2DShadow;\n\tprecision mediump samplerCubeShadow;\n\tprecision mediump sampler2DArrayShadow;\n\n\tprecision highp isampler2D;\n\tprecision highp isampler2DArray;\n\tprecision highp isampler3D;\n\tprecision highp isamplerCube;\n\n\tprecision highp usampler2D;\n\tprecision highp usampler2DArray;\n\tprecision highp usampler3D;\n\tprecision highp usamplerCube;\n#endif\n\n// Avoid #define so legacy code that uses 'texture' as a variable can work...\n// Unfortunately it means these can't have variable precision.\nvec4 Texel(sampler2D s, highp vec2 c) { return texture(s, c); }\nivec4 Texel(isampler2D s, highp vec2 c) { return texture(s, c); }\nuvec4 Texel(usampler2D s, highp vec2 c) { return texture(s, c); }\n\nvec4 Texel(sampler3D s, highp vec3 c) { return texture(s, c); }\nivec4 Texel(isampler3D s, highp vec3 c) { return texture(s, c); }\nuvec4 Texel(usampler3D s, highp vec3 c) { return texture(s, c); }\n\nvec4 Texel(samplerCube s, highp vec3 c) { return texture(s, c); }\nivec4 Texel(isamplerCube s, highp vec3 c) { return texture(s, c); }\nuvec4 Texel(usamplerCube s, highp vec3 c) { return texture(s, c); }\n\nvec4 Texel(sampler2DArray s, highp vec3 c) { return texture(s, c); }\nivec4 Texel(isampler2DArray s, highp vec3 c) { return texture(s, c); }\nuvec4 Texel(usampler2DArray s, highp vec3 c) { return texture(s, c); }\n\nfloat Texel(sampler2DShadow s, highp vec3 c) { return texture(s, c); }\nfloat Texel(samplerCubeShadow s, highp vec4 c) { return texture(s, c); }\nfloat Texel(sampler2DArrayShadow s, highp vec4 c) { return texture(s, c); }\n\n#ifdef PIXEL\n\tvec4 Texel(sampler2D s, highp vec2 c, float b) { return texture(s, c, b); }\n\tivec4 Texel(isampler2D s, highp vec2 c, float b) { return texture(s, c, b); }\n\tuvec4 Texel(usampler2D s, highp vec2 c, float b) { return texture(s, c, b); }\n\n\tvec4 Texel(sampler3D s, highp vec3 c, float b) { return texture(s, c, b); }\n\tivec4 Texel(isampler3D s, highp vec3 c, float b) { return texture(s, c, b); }\n\tuvec4 Texel(usampler3D s, highp vec3 c, float b) { return texture(s, c, b); }\n\n\tvec4 Texel(samplerCube s, highp vec3 c, float b) { return texture(s, c, b); }\n\tivec4 Texel(isamplerCube s, highp vec3 c, float b) { return texture(s, c, b); }\n\tuvec4 Texel(usamplerCube s, highp vec3 c, float b) { return texture(s, c, b); }\n\n\tvec4 Texel(sampler2DArray s, highp vec3 c, float b) { return texture(s, c, b); }\n\tivec4 Texel(isampler2DArray s, highp vec3 c, float b) { return texture(s, c, b); }\n\tuvec4 Texel(usampler2DArray s, highp vec3 c, float b) { return texture(s, c, b); }\n\n\tfloat Texel(sampler2DShadow s, highp vec3 c, float b) { return texture(s, c, b); }\n#ifndef LOVE_NO_TEXTURECUBESHADOWBIAS_HACK\n\tfloat Texel(samplerCubeShadow s, highp vec4 c, float b) { return texture(s, c, b); }\n#endif\n#endif\n\nuniform mediump float deprecatedTextureCall;\n\nvec4 texture2DDeprecated(sampler2D s, vec2 c) { return texture(s, c) + deprecatedTextureCall; }\nvec4 textureCubeDeprecated(samplerCube s, vec3 c) { return texture(s, c) + deprecatedTextureCall; }\n\n#ifdef PIXEL\nvec4 texture2DDeprecated(sampler2D s, vec2 c, float b) { return texture(s, c, b) + deprecatedTextureCall; }\nvec4 textureCubeDeprecated(samplerCube s, vec3 c, float b) { return texture(s, c, b) + deprecatedTextureCall; }\n#endif\n\n#define texture2D texture2DDeprecated\n#define textureCube textureCubeDeprecated\n\nfloat gammaToLinearPrecise(float c) {\n\treturn c <= 0.04045 ? c / 12.92 : pow((c + 0.055) / 1.055, 2.4);\n}\nvec3 gammaToLinearPrecise(vec3 c) {\n\tbvec3 leq = lessThanEqual(c, vec3(0.04045));\n\tc.r = leq.r ? c.r / 12.92 : pow((c.r + 0.055) / 1.055, 2.4);\n\tc.g = leq.g ? c.g / 12.92 : pow((c.g + 0.055) / 1.055, 2.4);\n\tc.b = leq.b ? c.b / 12.92 : pow((c.b + 0.055) / 1.055, 2.4);\n\treturn c;\n}\nvec4 gammaToLinearPrecise(vec4 c) { return vec4(gammaToLinearPrecise(c.rgb), c.a); }\nfloat linearToGammaPrecise(float c) {\n\treturn c < 0.0031308 ? c * 12.92 : 1.055 * pow(c, 1.0 / 2.4) - 0.055;\n}\nvec3 linearToGammaPrecise(vec3 c) {\n\tbvec3 lt = lessThanEqual(c, vec3(0.0031308));\n\tc.r = lt.r ? c.r * 12.92 : 1.055 * pow(c.r, 1.0 / 2.4) - 0.055;\n\tc.g = lt.g ? c.g * 12.92 : 1.055 * pow(c.g, 1.0 / 2.4) - 0.055;\n\tc.b = lt.b ? c.b * 12.92 : 1.055 * pow(c.b, 1.0 / 2.4) - 0.055;\n\treturn c;\n}\nvec4 linearToGammaPrecise(vec4 c) { return vec4(linearToGammaPrecise(c.rgb), c.a); }\n\n// http://chilliant.blogspot.com.au/2012/08/srgb-approximations-for-hlsl.html?m=1\n\nmediump float gammaToLinearFast(mediump float c) { return c * (c * (c * 0.305306011 + 0.682171111) + 0.012522878); }\nmediump vec3 gammaToLinearFast(mediump vec3 c) { return c * (c * (c * 0.305306011 + 0.682171111) + 0.012522878); }\nmediump vec4 gammaToLinearFast(mediump vec4 c) { return vec4(gammaToLinearFast(c.rgb), c.a); }\n\nmediump float linearToGammaFast(mediump float c) { return max(1.055 * pow(max(c, 0.0), 0.41666666) - 0.055, 0.0); }\nmediump vec3 linearToGammaFast(mediump vec3 c) { return max(1.055 * pow(max(c, vec3(0.0)), vec3(0.41666666)) - 0.055, vec3(0.0)); }\nmediump vec4 linearToGammaFast(mediump vec4 c) { return vec4(linearToGammaFast(c.rgb), c.a); }\n\n#define gammaToLinear gammaToLinearFast\n#define linearToGamma linearToGammaFast\n\n#ifdef LOVE_GAMMA_CORRECT\n\t#define gammaCorrectColor gammaToLinear\n\t#define unGammaCorrectColor linearToGamma\n\t#define gammaCorrectColorPrecise gammaToLinearPrecise\n\t#define unGammaCorrectColorPrecise linearToGammaPrecise\n\t#define gammaCorrectColorFast gammaToLinearFast\n\t#define unGammaCorrectColorFast linearToGammaFast\n#else\n\t#define gammaCorrectColor\n\t#define unGammaCorrectColor\n\t#define gammaCorrectColorPrecise\n\t#define unGammaCorrectColorPrecise\n\t#define gammaCorrectColorFast\n\t#define unGammaCorrectColorFast\n#endif\n)\";\n\nstatic const char vertex_header[] = R\"(\n#define love_Position gl_Position\n#define love_PointSize gl_PointSize\n\n#define attribute in\n#define varying out\n#define love_VertexID gl_VertexID\n#define love_InstanceID gl_InstanceID\n)\";\n\nstatic const char vertex_functions[] = R\"(\nvec4 love_clipSpaceTransform(vec4 clipPosition) {\n\tclipPosition.y *= love_ClipSpaceParams.x;\n\tclipPosition.z = (love_ClipSpaceParams.y * clipPosition.z + love_ClipSpaceParams.z * clipPosition.w) * love_ClipSpaceParams.w;\n\treturn clipPosition;\n}\n)\";\n\nstatic const char vertex_main[] = R\"(\nlayout (location = 0) in vec4 VertexPosition;\nlayout (location = 1) in vec4 VertexTexCoord;\nlayout (location = 2) in vec4 VertexColor;\n\nout vec4 VaryingTexCoord;\nout vec4 VaryingColor;\n\nvec4 position(mat4 clipSpaceFromLocal, vec4 localPosition);\n\nvoid main() {\n\tVaryingTexCoord = VertexTexCoord;\n\tVaryingColor = gammaCorrectColor(VertexColor) * ConstantColor;\n\tlove_Position = position(ClipSpaceFromLocal, VertexPosition);\n\tlove_Position = love_clipSpaceTransform(love_Position);\n}\n)\";\n\nstatic const char vertex_main_raw[] = R\"(\nvoid vertexmain();\n\nvoid main() {\n\tvertexmain();\n\tlove_Position = love_clipSpaceTransform(love_Position);\n}\n)\";\n\nstatic const char pixel_header[] = R\"(\n#ifdef GL_ES\n\tprecision mediump float;\n#endif\n\n#define love_MaxRenderTargets gl_MaxDrawBuffers\n\n#define varying in\n\n// Legacy\n#define love_MaxCanvases love_MaxRenderTargets\n\n// See Shader::updateScreenParams in Shader.cpp.\n#define love_PixelCoord (vec2(gl_FragCoord.x, (gl_FragCoord.y * love_ScreenSize.z) + love_ScreenSize.w))\n)\";\n\nstatic const char pixel_functions[] = R\"(\nuniform sampler2D love_VideoYChannel;\nuniform sampler2D love_VideoCbChannel;\nuniform sampler2D love_VideoCrChannel;\n\nvec4 VideoTexel(vec2 texcoords) {\n\tvec3 yuv;\n\tyuv[0] = Texel(love_VideoYChannel, texcoords).r;\n\tyuv[1] = Texel(love_VideoCbChannel, texcoords).r;\n\tyuv[2] = Texel(love_VideoCrChannel, texcoords).r;\n\tyuv += vec3(-0.0627451017, -0.501960814, -0.501960814);\n\n\tvec4 color;\n\tcolor.r = dot(yuv, vec3(1.164,  0.000,  1.596));\n\tcolor.g = dot(yuv, vec3(1.164, -0.391, -0.813));\n\tcolor.b = dot(yuv, vec3(1.164,  2.018,  0.000));\n\tcolor.a = 1.0;\n\n\treturn gammaCorrectColor(color);\n}\n)\";\n\nstatic const char pixel_main[] = R\"(\nlayout (location = 0) out vec4 love_PixelColor;\n\nuniform sampler2D MainTex;\nin highp vec4 VaryingTexCoord;\nin mediump vec4 VaryingColor;\n\nvec4 effect(vec4 vcolor, Image tex, vec2 texcoord, vec2 pixcoord);\n\nvoid main() {\n\tlove_PixelColor = effect(VaryingColor, MainTex, VaryingTexCoord.st, love_PixelCoord);\n}\n)\";\n\nstatic const char pixel_main_custom[] = R\"(\n// Some drivers seem to make the pixel shader do more work when multiple\n// pixel shader outputs are defined, even when only one is actually used.\n// TODO: We should use reflection or something instead of this, to determine\n// how many outputs are actually used in the shader code.\n#ifdef LOVE_MULTI_RENDER_TARGETS\n\tlayout (location = 0) out vec4 love_RenderTargets[love_MaxRenderTargets];\n\t#define love_PixelColor love_RenderTargets[0]\n#else\n\tlayout (location = 0) out vec4 love_PixelColor;\n#endif\n\n// Legacy\n#define love_Canvases love_RenderTargets\n#ifdef LOVE_MULTI_RENDER_TARGETS\n#define LOVE_MULTI_CANVASES 1\n#endif\n\nin highp vec4 VaryingTexCoord;\nin mediump vec4 VaryingColor;\n\nvoid effect();\n\nvoid main() {\n\teffect();\n}\n)\";\n\nstatic const char pixel_main_raw[] = R\"(\nvoid pixelmain();\n\nvoid main() {\n\tpixelmain();\n}\n)\";\n\nstatic const char compute_header[] = R\"(\n#define love_ThreadGroupCount gl_NumWorkGroups\n#define love_ThreadGroupID gl_WorkGroupID\n#define love_LocalThreadID gl_LocalInvocationID\n#define love_GlobalThreadID gl_GlobalInvocationID\n#define love_LocalThreadIndex gl_LocalInvocationIndex\n#define love_ThreadGroupSize gl_WorkGroupSize\n)\";\n\nstatic const char compute_uniforms[] = R\"(\n)\";\n\nstatic const char compute_functions[] = R\"()\";\n\nstatic const char compute_main[] = R\"(\nvoid computemain();\n\nvoid main() {\n\tcomputemain();\n}\n)\";\n\nstruct StageInfo\n{\n\tconst char *name;\n\tconst char *header;\n\tconst char *uniforms;\n\tconst char *functions;\n\tconst char *main;\n\tconst char *main_custom;\n\tconst char *main_raw;\n};\n\nstatic const StageInfo stageInfo[] =\n{\n\t{ \"VERTEX\", vertex_header, render_uniforms, vertex_functions, vertex_main, vertex_main, vertex_main_raw },\n\t{ \"PIXEL\", pixel_header, render_uniforms, pixel_functions, pixel_main, pixel_main_custom, pixel_main_raw },\n\t{ \"COMPUTE\", compute_header, compute_uniforms, compute_functions, compute_main, compute_main, compute_main },\n};\n\nstatic_assert((sizeof(stageInfo) / sizeof(StageInfo)) == SHADERSTAGE_MAX_ENUM, \"Stages array size must match ShaderStage enum.\");\n\nstruct Version\n{\n\tstd::string glsl;\n\tstd::string glsles;\n};\n\n// Indexed by Shader::Version\nstatic const Version versions[] =\n{\n\t{ \"#version 330 core\", \"#version 300 es\" },\n\t{ \"#version 430 core\", \"#version 320 es\" },\n};\n\nenum CommentType\n{\n\tCOMMENT_NONE,\n\tCOMMENT_LINE,\n\tCOMMENT_BLOCK,\n};\n\nstatic void parseComments(const std::string &src, std::vector<Range> &comments)\n{\n\tCommentType commenttype = COMMENT_NONE;\n\tRange comment;\n\n\tconst char *srcbytes = src.data();\n\tsize_t len = src.length();\n\n\tfor (size_t i = 0; i < len; i++)\n\t{\n\t\tchar curchar = srcbytes[i];\n\n\t\tif (commenttype == COMMENT_NONE)\n\t\t{\n\t\t\tif (curchar == '/' && i + 1 < len)\n\t\t\t{\n\t\t\t\tchar nextchar = srcbytes[i + 1];\n\t\t\t\tif (nextchar == '/')\n\t\t\t\t{\n\t\t\t\t\tcommenttype = COMMENT_LINE;\n\t\t\t\t\tcomment = Range(i, 1);\n\t\t\t\t}\n\t\t\t\telse if (nextchar == '*')\n\t\t\t\t{\n\t\t\t\t\tcommenttype = COMMENT_BLOCK;\n\t\t\t\t\tcomment = Range(i, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (commenttype == COMMENT_LINE)\n\t\t{\n\t\t\tif (curchar == '\\n')\n\t\t\t{\n\t\t\t\tcommenttype = COMMENT_NONE;\n\t\t\t\tcomment.last = i;\n\t\t\t\tcomments.push_back(comment);\n\t\t\t}\n\t\t}\n\t\telse if (commenttype == COMMENT_BLOCK)\n\t\t{\n\t\t\tif (curchar == '/' && i > 0 && srcbytes[i - 1] == '*')\n\t\t\t{\n\t\t\t\tcommenttype = COMMENT_NONE;\n\t\t\t\tcomment.last = i;\n\t\t\t\tcomments.push_back(comment);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (commenttype == COMMENT_LINE)\n\t{\n\t\tcomment.last = len - 1;\n\t\tcomments.push_back(comment);\n\t}\n}\n\nstatic bool inComment(size_t i, const std::vector<Range> &comments)\n{\n\tRange r(i, 1);\n\n\tfor (const Range &comment : comments)\n\t{\n\t\tif (comment.contains(r))\n\t\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nstatic bool textSearch(const std::string &src, const std::string &str, const std::vector<Range> &comments)\n{\n\tsize_t start = 0;\n\tsize_t found = std::string::npos;\n\n\twhile ((found = src.find(str, start)) != std::string::npos)\n\t{\n\t\tif (!inComment(found, comments))\n\t\t\treturn true;\n\t\tstart = found + str.size();\n\t}\n\n\treturn false;\n}\n\nstatic bool regexSearch(const std::string &src, const std::string &rstr, const std::vector<Range> &comments)\n{\n\tstd::regex r(rstr);\n\n\tfor (auto it = std::sregex_iterator(src.begin(), src.end(), r); it != std::sregex_iterator(); it++)\n\t{\n\t\tconst std::smatch &m = *it;\n\t\tif (!inComment(m.position(), comments))\n\t\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nstatic Shader::Language getTargetLanguage(const std::string &src)\n{\n\tstd::regex r(\"^\\\\s*#pragma language (\\\\w+)\");\n\tstd::smatch m;\n\tstd::string langstr = std::regex_search(src, m, r) && m.size() > 1 ? m[1] : std::string(\"glsl3\");\n\tShader::Language lang = Shader::LANGUAGE_MAX_ENUM;\n\tShader::getConstant(langstr.c_str(), lang);\n\treturn lang;\n}\n\nstatic Shader::EntryPoint getVertexEntryPoint(const std::string &src, const std::vector<Range> &comments)\n{\n\tif (regexSearch(src, \"void\\\\s+vertexmain\\\\s*\\\\(\", comments))\n\t\treturn Shader::ENTRYPOINT_RAW;\n\n\tif (regexSearch(src, \"vec4\\\\s+position\\\\s*\\\\(\", comments))\n\t\treturn Shader::ENTRYPOINT_HIGHLEVEL;\n\n\treturn Shader::ENTRYPOINT_NONE;\n}\n\nstatic Shader::EntryPoint getPixelEntryPoint(const std::string &src, const std::vector<Range> &comments, bool &mrt)\n{\n\tmrt = false;\n\n\tif (regexSearch(src, \"void\\\\s+pixelmain\\\\s*\\\\(\", comments))\n\t\treturn Shader::ENTRYPOINT_RAW;\n\n\tif (regexSearch(src, \"vec4\\\\s+effect\\\\s*\\\\(\", comments))\n\t\treturn Shader::ENTRYPOINT_HIGHLEVEL;\n\n\tif (regexSearch(src, \"void\\\\s+effect\\\\s*\\\\(\", comments))\n\t{\n\t\tif (textSearch(src, \"love_RenderTargets\", comments) || textSearch(src, \"love_Canvases\", comments))\n\t\t\tmrt = true;\n\t\treturn Shader::ENTRYPOINT_CUSTOM;\n\t}\n\n\treturn Shader::ENTRYPOINT_NONE;\n}\n\nstatic Shader::EntryPoint getComputeEntryPoint(const std::string &src, const std::vector<Range> &comments)\n{\n\tif (regexSearch(src, \"void\\\\s+computemain\\\\s*\\\\(\", comments))\n\t\treturn Shader::ENTRYPOINT_RAW;\n\n\treturn Shader::ENTRYPOINT_NONE;\n}\n\n} // glsl\n\nstatic_assert(sizeof(Shader::BuiltinUniformData) == sizeof(float) * 4 * 12, \"Update the array in wrap_GraphicsShader.lua if this changes.\");\n\nlove::Type Shader::type(\"Shader\", &Object::type);\n\nShader *Shader::current = nullptr;\nShader *Shader::standardShaders[Shader::STANDARD_MAX_ENUM] = {nullptr};\n\nShader::SourceInfo Shader::getSourceInfo(const std::string &src)\n{\n\tstd::vector<Range> comments;\n\tglsl::parseComments(src, comments);\n\n\tSourceInfo info = {};\n\tinfo.language = glsl::getTargetLanguage(src);\n\tinfo.stages[SHADERSTAGE_VERTEX] = glsl::getVertexEntryPoint(src, comments);\n\tinfo.stages[SHADERSTAGE_PIXEL] = glsl::getPixelEntryPoint(src, comments, info.usesMRT);\n\tinfo.stages[SHADERSTAGE_COMPUTE] = glsl::getComputeEntryPoint(src, comments);\n\tif (info.stages[SHADERSTAGE_COMPUTE])\n\t\tinfo.language = LANGUAGE_GLSL4;\n\treturn info;\n}\n\nstd::string Shader::createShaderStageCode(Graphics *gfx, ShaderStageType stage, const std::string &code, const CompileOptions &options, const Shader::SourceInfo &info, bool gles, bool checksystemfeatures)\n{\n\tif (info.language == Shader::LANGUAGE_MAX_ENUM)\n\t\tthrow love::Exception(\"Invalid shader language\");\n\n\tif (info.stages[stage] == ENTRYPOINT_NONE)\n\t\tthrow love::Exception(\"Cannot find entry point for shader stage.\");\n\n\tif (stage == SHADERSTAGE_COMPUTE && info.language != LANGUAGE_GLSL4)\n\t\tthrow love::Exception(\"Compute shaders must use GLSL 4.\");\n\n\tif (checksystemfeatures)\n\t{\n\t\tconst auto &features = gfx->getCapabilities().features;\n\n\t\tif (stage == SHADERSTAGE_COMPUTE && !features[Graphics::FEATURE_GLSL4])\n\t\t\tthrow love::Exception(\"Compute shaders require GLSL 4 which is not supported on this system.\");\n\n\t\tif (info.language == LANGUAGE_GLSL4 && !features[Graphics::FEATURE_GLSL4])\n\t\t\tthrow love::Exception(\"GLSL 4 shaders are not supported on this system.\");\n\t}\n\n\tLanguage lang = info.language;\n\n\tglsl::StageInfo stageinfo = glsl::stageInfo[stage];\n\n\tstd::stringstream ss;\n\n\tss << (gles ? glsl::versions[lang].glsles : glsl::versions[lang].glsl) << \"\\n\";\n\n\tif (isGammaCorrect())\n\t\tss << \"#define LOVE_GAMMA_CORRECT 1\\n\";\n\tif (info.usesMRT)\n\t\tss << \"#define LOVE_MULTI_RENDER_TARGETS 1\\n\";\n\n\tif (gfx->isUsingNoTextureCubeShadowBiasHack())\n\t\tss << \"#define LOVE_NO_TEXTURECUBESHADOWBIAS_HACK 1\\n\";\n\n\tfor (const auto &def : options.defines)\n\t\tss << \"#define \" + def.first + \" \" + def.second + \"\\n\";\n\n\tss << \"#define \" << stageinfo.name << \" \" << stageinfo.name << \"\\n\";\n\tss << glsl::global_syntax;\n\tss << stageinfo.header;\n\tss << stageinfo.uniforms;\n\tss << glsl::global_functions;\n\tss << stageinfo.functions;\n\n\tif (info.stages[stage] == ENTRYPOINT_HIGHLEVEL)\n\t\tss << stageinfo.main;\n\telse if (info.stages[stage] == ENTRYPOINT_CUSTOM)\n\t\tss << stageinfo.main_custom;\n\telse if (info.stages[stage] == ENTRYPOINT_RAW)\n\t\tss << stageinfo.main_raw;\n\telse\n\t\tthrow love::Exception(\"Unknown shader entry point %d\", info.stages[stage]);\n\tss << \"#line 1\\n\";\n\tss << code;\n\n\treturn ss.str();\n}\n\nShader::Shader(StrongRef<ShaderStage> _stages[], const CompileOptions &options)\n\t: stages()\n\t, debugName(options.debugName)\n{\n\tstd::string err;\n\tif (!validateInternal(_stages, err, reflection))\n\t\tthrow love::Exception(\"%s\", err.c_str());\n\n\tstd::vector<std::string> unsetVertexInputLocations;\n\n\tfor (const auto &kvp : reflection.vertexInputs)\n\t{\n\t\tif (kvp.second < 0)\n\t\t\tunsetVertexInputLocations.push_back(kvp.first);\n\t}\n\n\tif (!unsetVertexInputLocations.empty())\n\t{\n\t\tstd::string str = unsetVertexInputLocations[0];\n\t\tfor (size_t i = 1; i < unsetVertexInputLocations.size(); i++)\n\t\t\tstr += \", \" + unsetVertexInputLocations[i];\n\t\tunsetVertexInputLocationsString = str;\n\t}\n\n\tactiveTextures.resize(reflection.textureCount);\n\tactiveBuffers.resize(reflection.bufferCount);\n\n\tauto gfx = Module::getInstance<Graphics>(Module::M_GRAPHICS);\n\n\t// Default bindings for read-only resources.\n\tfor (const auto &kvp : reflection.allUniforms)\n\t{\n\t\tconst auto &u = *kvp.second;\n\n\t\tif (u.resourceIndex < 0)\n\t\t\tcontinue;\n\n\t\tif ((u.access & ACCESS_WRITE) != 0)\n\t\t\tcontinue;\n\n\t\tif (u.baseType == UNIFORM_SAMPLER || u.baseType == UNIFORM_STORAGETEXTURE)\n\t\t{\n\t\t\tauto tex = gfx->getDefaultTexture(u.textureType, u.dataBaseType, u.isDepthSampler);\n\t\t\tfor (int i = 0; i < u.count; i++)\n\t\t\t{\n\t\t\t\ttex->retain();\n\t\t\t\tactiveTextures[u.resourceIndex + i] = tex;\n\t\t\t}\n\t\t}\n\t\telse if (u.baseType == UNIFORM_TEXELBUFFER || u.baseType == UNIFORM_STORAGEBUFFER)\n\t\t{\n\t\t\tauto buffer = u.baseType == UNIFORM_TEXELBUFFER\n\t\t\t\t? gfx->getDefaultTexelBuffer(u.dataBaseType)\n\t\t\t\t: gfx->getDefaultStorageBuffer();\n\n\t\t\tfor (int i = 0; i < u.count; i++)\n\t\t\t{\n\t\t\t\tbuffer->retain();\n\t\t\t\tactiveBuffers[u.resourceIndex + i] = buffer;\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (int i = 0; i < SHADERSTAGE_MAX_ENUM; i++)\n\t\tstages[i] = _stages[i];\n}\n\nShader::~Shader()\n{\n\tfor (int i = 0; i < STANDARD_MAX_ENUM; i++)\n\t{\n\t\tif (this == standardShaders[i])\n\t\t\tstandardShaders[i] = nullptr;\n\t}\n\n\tif (current == this)\n\t\tattachDefault(STANDARD_DEFAULT);\n\n\tfor (Texture *tex : activeTextures)\n\t{\n\t\tif (tex)\n\t\t\ttex->release();\n\t}\n\n\tfor (Buffer *buffer : activeBuffers)\n\t{\n\t\tif (buffer)\n\t\t\tbuffer->release();\n\t}\n}\n\nbool Shader::hasStage(ShaderStageType stage)\n{\n\treturn stages[stage] != nullptr;\n}\n\nvoid Shader::attachDefault(StandardShader defaultType)\n{\n\tShader *defaultshader = standardShaders[defaultType];\n\n\tif (defaultshader == nullptr)\n\t{\n\t\tcurrent = nullptr;\n\t\treturn;\n\t}\n\n\tif (current != defaultshader)\n\t\tdefaultshader->attach();\n}\n\nbool Shader::isDefaultActive()\n{\n\tfor (int i = 0; i < STANDARD_MAX_ENUM; i++)\n\t{\n\t\tif (current == standardShaders[i])\n\t\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nVector4 Shader::computeClipSpaceParams(uint32 clipSpaceTransformFlags)\n{\n\t// See the love_clipSpaceTransform vertex shader function.\n\tVector4 params(1.0f, 1.0f, 0.0f, 1.0f);\n\n\tif (clipSpaceTransformFlags & CLIP_TRANSFORM_FLIP_Y)\n\t\tparams.x = -1.0f;\n\n\tif (clipSpaceTransformFlags & CLIP_TRANSFORM_Z_NEG1_1_TO_0_1)\n\t{\n\t\tparams.z = 1.0f;\n\t\tparams.w = 0.5f;\n\t}\n\telse if (clipSpaceTransformFlags & CLIP_TRANSFORM_Z_0_1_TO_NEG1_1)\n\t{\n\t\tparams.y = 2.0f;\n\t\tparams.z = -1.0f;\n\t}\n\n\treturn params;\n}\n\nconst Shader::UniformInfo *Shader::getUniformInfo(const std::string &name) const\n{\n\tconst auto it = reflection.allUniforms.find(name);\n\treturn it != reflection.allUniforms.end() ? it->second : nullptr;\n}\n\nbool Shader::hasUniform(const std::string &name) const\n{\n\tconst auto it = reflection.allUniforms.find(name);\n\treturn it != reflection.allUniforms.end() && it->second->active;\n}\n\nvoid Shader::setVideoTextures(love::graphics::Texture *ytexture, love::graphics::Texture *cbtexture, love::graphics::Texture *crtexture)\n{\n\tconst BuiltinUniform builtins[3] = {\n\t\tBUILTIN_TEXTURE_VIDEO_Y,\n\t\tBUILTIN_TEXTURE_VIDEO_CB,\n\t\tBUILTIN_TEXTURE_VIDEO_CR,\n\t};\n\n\tlove::graphics::Texture *textures[3] = {ytexture, cbtexture, crtexture};\n\n\tfor (int i = 0; i < 3; i++)\n\t{\n\t\tconst UniformInfo *info = getUniformInfo(builtins[i]);\n\t\tif (info != nullptr)\n\t\t\tsendTextures(info, &textures[i], 1, true);\n\t}\n}\n\nvoid Shader::sendTextures(const UniformInfo *info, Texture **textures, int count)\n{\n\tShader::sendTextures(info, textures, count, false);\n}\n\nvoid Shader::sendBuffers(const UniformInfo *info, Buffer **buffers, int count)\n{\n\tShader::sendBuffers(info, buffers, count, false);\n}\n\nvoid Shader::sendTextures(const UniformInfo *info, Texture **textures, int count, bool internalUpdate)\n{\n\tUniformType basetype = info->baseType;\n\n\tif (basetype != UNIFORM_SAMPLER && basetype != UNIFORM_STORAGETEXTURE)\n\t\treturn;\n\n\tif (!internalUpdate && current == this)\n\t\tflushBatchedDraws();\n\n\tcount = std::min(count, info->count);\n\n\tfor (int i = 0; i < count; i++)\n\t{\n\t\tlove::graphics::Texture *tex = textures[i];\n\t\tbool isdefault = tex == nullptr;\n\n\t\tif (tex != nullptr)\n\t\t{\n\t\t\tif (!validateTexture(info, tex, internalUpdate))\n\t\t\t\tcontinue;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tauto gfx = Module::getInstance<love::graphics::Graphics>(Module::M_GRAPHICS);\n\t\t\ttex = gfx->getDefaultTexture(info->textureType, info->dataBaseType, info->isDepthSampler);\n\t\t}\n\n\t\ttex->retain();\n\n\t\tint resourceindex = info->resourceIndex + i;\n\n\t\tif (activeTextures[resourceindex] != nullptr)\n\t\t\tactiveTextures[resourceindex]->release();\n\n\t\tactiveTextures[resourceindex] = tex;\n\n\t\tapplyTexture(info, i, tex, basetype, isdefault);\n\t}\n}\n\nvoid Shader::sendBuffers(const UniformInfo *info, Buffer **buffers, int count, bool internalUpdate)\n{\n\tUniformType basetype = info->baseType;\n\n\tif (basetype != UNIFORM_TEXELBUFFER && basetype != UNIFORM_STORAGEBUFFER)\n\t\treturn;\n\n\tif (!internalUpdate && current == this)\n\t\tflushBatchedDraws();\n\n\tcount = std::min(count, info->count);\n\n\tfor (int i = 0; i < count; i++)\n\t{\n\t\tlove::graphics::Buffer *buffer = buffers[i];\n\t\tbool isdefault = buffer == nullptr;\n\n\t\tif (buffer != nullptr)\n\t\t{\n\t\t\tif (!validateBuffer(info, buffer, internalUpdate))\n\t\t\t\tcontinue;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tauto gfx = Module::getInstance<love::graphics::Graphics>(Module::M_GRAPHICS);\n\t\t\tif (basetype == UNIFORM_TEXELBUFFER)\n\t\t\t\tbuffer = gfx->getDefaultTexelBuffer(info->dataBaseType);\n\t\t\telse\n\t\t\t\tbuffer = gfx->getDefaultStorageBuffer();\n\t\t}\n\n\t\tbuffer->retain();\n\n\t\tint resourceindex = info->resourceIndex + i;\n\n\t\tif (activeBuffers[resourceindex] != nullptr)\n\t\t\tactiveBuffers[resourceindex]->release();\n\n\t\tactiveBuffers[resourceindex] = buffer;\n\n\t\tapplyBuffer(info, i, buffer, basetype, isdefault);\n\t}\n}\n\nvoid Shader::flushBatchedDraws() const\n{\n\tif (current == this)\n\t\tGraphics::flushBatchedDrawsGlobal();\n}\n\nconst Shader::UniformInfo *Shader::getMainTextureInfo() const\n{\n\treturn getUniformInfo(BUILTIN_TEXTURE_MAIN);\n}\n\nDataBaseType Shader::getDataBaseType(PixelFormat format)\n{\n\tswitch (getPixelFormatInfo(format).dataType)\n\t{\n\t\tcase PIXELFORMATTYPE_UNORM:\n\t\t\treturn DATA_BASETYPE_UNORM;\n\t\tcase PIXELFORMATTYPE_SNORM:\n\t\t\treturn DATA_BASETYPE_SNORM;\n\t\tcase PIXELFORMATTYPE_UFLOAT:\n\t\tcase PIXELFORMATTYPE_SFLOAT:\n\t\t\treturn DATA_BASETYPE_FLOAT;\n\t\tcase PIXELFORMATTYPE_SINT:\n\t\t\treturn DATA_BASETYPE_INT;\n\t\tcase PIXELFORMATTYPE_UINT:\n\t\t\treturn DATA_BASETYPE_UINT;\n\t\tdefault:\n\t\t\treturn DATA_BASETYPE_FLOAT;\n\t}\n}\n\nbool Shader::isResourceBaseTypeCompatible(DataBaseType a, DataBaseType b)\n{\n\tif (a == DATA_BASETYPE_FLOAT || a == DATA_BASETYPE_UNORM || a == DATA_BASETYPE_SNORM)\n\t\treturn b == DATA_BASETYPE_FLOAT || b == DATA_BASETYPE_UNORM || b == DATA_BASETYPE_SNORM;\n\n\tif (a == DATA_BASETYPE_INT && b == DATA_BASETYPE_INT)\n\t\treturn true;\n\n\tif (a == DATA_BASETYPE_UINT && b == DATA_BASETYPE_UINT)\n\t\treturn true;\n\n\treturn false;\n}\n\nvoid Shader::validateDrawState(PrimitiveType primtype, Texture *maintex) const\n{\n\tif ((primtype == PRIMITIVE_POINTS) != reflection.usesPointSize)\n\t{\n\t\tif (reflection.usesPointSize)\n\t\t\tthrow love::Exception(\"The active shader can only be used to draw points.\");\n\t\telse\n\t\t\tthrow love::Exception(\"The gl_PointSize variable must be set in a vertex shader when drawing points.\");\n\t}\n\n\tif (maintex == nullptr)\n\t\treturn;\n\n\tconst UniformInfo *info = getUniformInfo(BUILTIN_TEXTURE_MAIN);\n\n\tif (info == nullptr)\n\t\treturn;\n\n\tif (!maintex->isReadable())\n\t\tthrow love::Exception(\"Textures with non-readable formats cannot be sampled from in a shader.\");\n\n\tauto textype = maintex->getTextureType();\n\n\tif (info->textureType != TEXTURE_MAX_ENUM && info->textureType != textype)\n\t{\n\t\tconst char *textypestr = \"unknown\";\n\t\tconst char *shadertextypestr = \"unknown\";\n\t\tTexture::getConstant(textype, textypestr);\n\t\tTexture::getConstant(info->textureType, shadertextypestr);\n\t\tthrow love::Exception(\"Texture's type (%s) must match the type of the shader's main texture type (%s).\", textypestr, shadertextypestr);\n\t}\n\n\tif (!isResourceBaseTypeCompatible(info->dataBaseType, getDataBaseType(maintex->getPixelFormat())))\n\t\tthrow love::Exception(\"Main texture's data format base type must match the MainTex declaration in the shader (float, int, or uint).\");\n\n\tif (info->isDepthSampler != maintex->getSamplerState().depthSampleMode.hasValue)\n\t{\n\t\tif (info->isDepthSampler)\n\t\t\tthrow love::Exception(\"Depth comparison samplers in shaders can only be used with depth textures which have depth comparison set.\");\n\t\telse\n\t\t\tthrow love::Exception(\"Depth textures which have depth comparison set can only be used with depth/shadow samplers in shaders.\");\n\t}\n}\n\nvoid Shader::getLocalThreadgroupSize(int *x, int *y, int *z)\n{\n\t*x = reflection.localThreadgroupSize[0];\n\t*y = reflection.localThreadgroupSize[1];\n\t*z = reflection.localThreadgroupSize[2];\n}\n\nconst std::vector<Buffer::DataDeclaration> *Shader::getBufferFormat(const std::string &name) const\n{\n\tauto it = reflection.bufferFormats.find(name);\n\tif (it != reflection.bufferFormats.end())\n\t\treturn &it->second;\n\treturn nullptr;\n}\n\nbool Shader::isUsingDeprecatedTextureFunctions() const\n{\n\tauto it = reflection.localUniforms.find(\"deprecatedTextureCall\");\n\treturn it != reflection.localUniforms.end() && it->second.stageMask != 0;\n}\n\nbool Shader::isUsingDeprecatedTextureUniform() const\n{\n\tauto it = reflection.allUniforms.find(\"texture\");\n\treturn it != reflection.allUniforms.end() && it->second->stageMask != 0;\n}\n\nbool Shader::validate(StrongRef<ShaderStage> stages[], std::string& err)\n{\n\tReflection reflection;\n\treturn validateInternal(stages, err, reflection);\n}\n\nstatic DataBaseType getBaseType(glslang::TBasicType basictype)\n{\n\tswitch (basictype)\n\t{\n\t\tcase glslang::EbtInt: return DATA_BASETYPE_INT;\n\t\tcase glslang::EbtUint: return DATA_BASETYPE_UINT;\n\t\tcase glslang::EbtFloat: return DATA_BASETYPE_FLOAT;\n\t\tcase glslang::EbtBool: return DATA_BASETYPE_BOOL;\n\t\tdefault: return DATA_BASETYPE_FLOAT;\n\t}\n}\n\nstatic DataFormat getDataFormat(glslang::TBasicType basictype, int components, int rows, int columns, bool matrix)\n{\n\tif (matrix)\n\t{\n\t\tif (basictype != glslang::EbtFloat)\n\t\t\treturn DATAFORMAT_MAX_ENUM;\n\n\t\tif (rows == 2 && columns == 2)\n\t\t\treturn DATAFORMAT_FLOAT_MAT2X2;\n\t\telse if (rows == 2 && columns == 3)\n\t\t\treturn DATAFORMAT_FLOAT_MAT2X3;\n\t\telse if (rows == 2 && columns == 4)\n\t\t\treturn DATAFORMAT_FLOAT_MAT2X4;\n\t\telse if (rows == 3 && columns == 2)\n\t\t\treturn DATAFORMAT_FLOAT_MAT3X2;\n\t\telse if (rows == 3 && columns == 3)\n\t\t\treturn DATAFORMAT_FLOAT_MAT3X3;\n\t\telse if (rows == 3 && columns == 4)\n\t\t\treturn DATAFORMAT_FLOAT_MAT3X4;\n\t\telse if (rows == 4 && columns == 2)\n\t\t\treturn DATAFORMAT_FLOAT_MAT4X2;\n\t\telse if (rows == 4 && columns == 3)\n\t\t\treturn DATAFORMAT_FLOAT_MAT4X3;\n\t\telse if (rows == 4 && columns == 4)\n\t\t\treturn DATAFORMAT_FLOAT_MAT4X4;\n\t\telse\n\t\t\treturn DATAFORMAT_MAX_ENUM;\n\t}\n\telse if (basictype == glslang::EbtFloat)\n\t{\n\t\tif (components == 1)\n\t\t\treturn DATAFORMAT_FLOAT;\n\t\telse if (components == 2)\n\t\t\treturn DATAFORMAT_FLOAT_VEC2;\n\t\telse if (components == 3)\n\t\t\treturn DATAFORMAT_FLOAT_VEC3;\n\t\telse if (components == 4)\n\t\t\treturn DATAFORMAT_FLOAT_VEC4;\n\t}\n\telse if (basictype == glslang::EbtInt)\n\t{\n\t\tif (components == 1)\n\t\t\treturn DATAFORMAT_INT32;\n\t\telse if (components == 2)\n\t\t\treturn DATAFORMAT_INT32_VEC2;\n\t\telse if (components == 3)\n\t\t\treturn DATAFORMAT_INT32_VEC3;\n\t\telse if (components == 4)\n\t\t\treturn DATAFORMAT_INT32_VEC4;\n\t}\n\telse if (basictype == glslang::EbtUint || basictype == glslang::EbtBool)\n\t{\n\t\tif (components == 1)\n\t\t\treturn DATAFORMAT_UINT32;\n\t\telse if (components == 2)\n\t\t\treturn DATAFORMAT_UINT32_VEC2;\n\t\telse if (components == 3)\n\t\t\treturn DATAFORMAT_UINT32_VEC3;\n\t\telse if (components == 4)\n\t\t\treturn DATAFORMAT_UINT32_VEC4;\n\t}\n\n\treturn DATAFORMAT_MAX_ENUM;\n}\n\nstatic PixelFormat getPixelFormat(glslang::TLayoutFormat format)\n{\n\tusing namespace glslang;\n\n\tswitch (format)\n\t{\n\t\tcase ElfNone: return PIXELFORMAT_UNKNOWN;\n\t\tcase ElfRgba32f: return PIXELFORMAT_RGBA32_FLOAT;\n\t\tcase ElfRgba16f: return PIXELFORMAT_RGBA16_FLOAT;\n\t\tcase ElfR32f: return PIXELFORMAT_R32_FLOAT;\n\t\tcase ElfRgba8: return PIXELFORMAT_RGBA8_UNORM;\n\t\tcase ElfRgba8Snorm: return PIXELFORMAT_UNKNOWN; // no snorm yet\n\t\tcase ElfRg32f: return PIXELFORMAT_RG32_FLOAT;\n\t\tcase ElfRg16f: return PIXELFORMAT_RG16_FLOAT;\n\t\tcase ElfR11fG11fB10f: return PIXELFORMAT_RG11B10_FLOAT;\n\t\tcase ElfR16f: return PIXELFORMAT_R16_FLOAT;\n\t\tcase ElfRgba16: return PIXELFORMAT_RGBA16_UNORM;\n\t\tcase ElfRgb10A2: return PIXELFORMAT_RGB10A2_UNORM;\n\t\tcase ElfRg16: return PIXELFORMAT_RG16_UNORM;\n\t\tcase ElfRg8: return PIXELFORMAT_RG8_UNORM;\n\t\tcase ElfR8: return PIXELFORMAT_R8_UNORM;\n\t\tcase ElfRgba16Snorm: return PIXELFORMAT_UNKNOWN;\n\t\tcase ElfRg16Snorm: return PIXELFORMAT_UNKNOWN;\n\t\tcase ElfRg8Snorm: return PIXELFORMAT_UNKNOWN;\n\t\tcase ElfR16Snorm: return PIXELFORMAT_UNKNOWN;\n\t\tcase ElfR8Snorm: return PIXELFORMAT_UNKNOWN;\n\t\tcase ElfRgba32i: return PIXELFORMAT_RGBA32_INT;\n\t\tcase ElfRgba16i: return PIXELFORMAT_RGBA16_INT;\n\t\tcase ElfRgba8i: return PIXELFORMAT_RGBA8_INT;\n\t\tcase ElfR32i: return PIXELFORMAT_R32_INT;\n\t\tcase ElfRg32i: return PIXELFORMAT_RG32_INT;\n\t\tcase ElfRg16i: return PIXELFORMAT_RG16_INT;\n\t\tcase ElfRg8i: return PIXELFORMAT_RG8_INT;\n\t\tcase ElfR16i: return PIXELFORMAT_R16_INT;\n\t\tcase ElfR8i: return PIXELFORMAT_R8_INT;\n\t\tcase ElfRgba32ui: return PIXELFORMAT_RGBA32_UINT;\n\t\tcase ElfRgba16ui: return PIXELFORMAT_RGBA16_UINT;\n\t\tcase ElfRgba8ui: return PIXELFORMAT_RGBA8_UINT;\n\t\tcase ElfR32ui: return PIXELFORMAT_R32_UINT;\n\t\tcase ElfRg32ui: return PIXELFORMAT_RG32_UINT;\n\t\tcase ElfRg16ui: return PIXELFORMAT_RG16_UINT;\n\t\tcase ElfRgb10a2ui: return PIXELFORMAT_UNKNOWN;\n\t\tcase ElfRg8ui: return PIXELFORMAT_RG8_UINT;\n\t\tcase ElfR16ui: return PIXELFORMAT_R16_UINT;\n\t\tcase ElfR8ui: return PIXELFORMAT_R8_UINT;\n\t\tdefault: return PIXELFORMAT_UNKNOWN;\n\t}\n}\n\nstatic TextureType getTextureType(const glslang::TSampler &sampler)\n{\n\tif (sampler.is2D())\n\t\treturn sampler.isArrayed() ? TEXTURE_2D_ARRAY : TEXTURE_2D;\n\telse if (sampler.dim == glslang::EsdCube)\n\t\treturn sampler.isArrayed() ? TEXTURE_MAX_ENUM : TEXTURE_CUBE;\n\telse if (sampler.dim == glslang::Esd3D)\n\t\treturn TEXTURE_VOLUME;\n\telse\n\t\treturn TEXTURE_MAX_ENUM;\n}\n\nstatic uint32 getStageMask(EShLanguageMask mask)\n{\n\tuint32 m = 0;\n\tif (mask & EShLangVertexMask)\n\t\tm |= SHADERSTAGEMASK_VERTEX;\n\tif (mask & EShLangFragmentMask)\n\t\tm |= SHADERSTAGEMASK_PIXEL;\n\tif (mask & EShLangComputeMask)\n\t\tm |= SHADERSTAGEMASK_COMPUTE;\n\treturn m;\n}\n\ntemplate <typename T>\nstatic T convertData(const glslang::TConstUnion &data)\n{\n\tswitch (data.getType())\n\t{\n\t\tcase glslang::EbtInt: return (T) data.getIConst();\n\t\tcase glslang::EbtUint: return (T) data.getUConst();\n\t\tcase glslang::EbtDouble: return (T) data.getDConst();\n\t\tcase glslang::EbtInt8: return (T) data.getI8Const();\n\t\tcase glslang::EbtInt16: return (T) data.getI16Const();\n\t\tcase glslang::EbtInt64: return (T) data.getI64Const();\n\t\tcase glslang::EbtUint8: return (T) data.getU8Const();\n\t\tcase glslang::EbtUint16: return (T) data.getU16Const();\n\t\tcase glslang::EbtUint64: return (T) data.getU64Const();\n\t\tcase glslang::EbtBool: return (T)data.getBConst();\n\t\tdefault: return 0;\n\t}\n}\n\nstatic bool AddFieldsToFormat(std::vector<Buffer::DataDeclaration> &format, int level, const glslang::TType *type, int arraylength, const std::string &basename, std::string &err)\n{\n\tif (type->isStruct())\n\t{\n\t\tauto fields = type->getStruct();\n\n\t\tfor (int i = 0; i < std::max(arraylength, 1); i++)\n\t\t{\n\t\t\tstd::string name = basename;\n\t\t\tif (level > 0)\n\t\t\t{\n\t\t\t\tname += type->getFieldName().c_str();\n\t\t\t\tif (arraylength > 0)\n\t\t\t\t\tname += \"[\" + std::to_string(i) + \"]\";\n\t\t\t\tname += \".\";\n\t\t\t}\n\t\t\tfor (size_t fieldi = 0; fieldi < fields->size(); fieldi++)\n\t\t\t{\n\t\t\t\tconst glslang::TType *fieldtype = (*fields)[fieldi].type;\n\t\t\t\tint fieldlength = fieldtype->isSizedArray() ? fieldtype->getCumulativeArraySize() : 0;\n\n\t\t\t\tif (!AddFieldsToFormat(format, level + 1, fieldtype, fieldlength, name, err))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tDataFormat dataformat = getDataFormat(type->getBasicType(), type->getVectorSize(), type->getMatrixRows(), type->getMatrixCols(), type->isMatrix());\n\t\tif (dataformat == DATAFORMAT_MAX_ENUM)\n\t\t{\n\t\t\terr = \"Shader validation error:\\nUnhandled data format for type \" + std::to_string((int)type->getBasicType()) + std::string(\" with name \") + basename;\n\t\t\treturn false;\n\t\t}\n\n\t\tstd::string name = basename.empty() ? type->getFieldName().c_str() : basename + type->getFieldName().c_str();\n\t\tformat.emplace_back(name.c_str(), dataformat, arraylength);\n\t}\n\n\treturn true;\n}\n\nbool Shader::validateInternal(StrongRef<ShaderStage> stages[], std::string &err, Reflection &reflection)\n{\n\tglslang::TProgram program;\n\n\tfor (int i = 0; i < SHADERSTAGE_MAX_ENUM; i++)\n\t{\n\t\tif (stages[i] != nullptr)\n\t\t\tprogram.addShader(stages[i]->getGLSLangValidationShader());\n\t}\n\n\tif (!program.link((EShMessages)(EShMsgValidateCrossStageIO | EshMsgOverlappingLocations)))\n\t{\n\t\terr = \"Cannot compile shader:\\n\\n\" + std::string(program.getInfoLog()) + \"\\n\" + std::string(program.getInfoDebugLog());\n\t\treturn false;\n\t}\n\n\tif (!program.buildReflection(EShReflectionSeparateBuffers))\n\t{\n\t\terr = \"Cannot get reflection information for shader.\";\n\t\treturn false;\n\t}\n\n\tconst auto *vertintermediate = program.getIntermediate(EShLangVertex);\n\tif (vertintermediate != nullptr)\n\t{\n\t\t// NOTE: this doesn't check whether the use affects final output...\n\t\treflection.usesPointSize = vertintermediate->inIoAccessed(\"gl_PointSize\");\n\t}\n\n\tif (stages[SHADERSTAGE_COMPUTE] != nullptr)\n\t{\n\t\tfor (int i = 0; i < 3; i++)\n\t\t{\n\t\t\treflection.localThreadgroupSize[i] = program.getLocalSize(i);\n\n\t\t\tif (reflection.localThreadgroupSize[i] <= 0)\n\t\t\t{\n\t\t\t\terr = \"Shader validation error:\\nNegative local threadgroup size.\";\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (int i = 0; i < program.getNumPipeInputs(); i++)\n\t{\n\t\tconst glslang::TObjectReflection &info = program.getPipeInput(i);\n\n\t\t// Avoid builtins.\n\t\tif (info.name.rfind(\"gl_\", 0) == 0)\n\t\t\tcontinue;\n\n\t\tint location = info.layoutLocation();\n\t\tif (location == glslang::TQualifier::layoutLocationEnd)\n\t\t\tlocation = -1;\n\n\t\treflection.vertexInputs[info.name] = location;\n\t}\n\n\treflection.textureCount = 0;\n\treflection.bufferCount = 0;\n\n\tfor (int i = 0; i < program.getNumUniformVariables(); i++)\n\t{\n\t\tconst glslang::TObjectReflection &info = program.getUniform(i);\n\t\tconst glslang::TType *type = info.getType();\n\t\tif (type == nullptr)\n\t\t\tcontinue;\n\n\t\tconst glslang::TQualifier &qualifiers = type->getQualifier();\n\n\t\tUniformInfo u = {};\n\n\t\tu.name = canonicaliizeUniformName(info.name);\n\t\tu.location = -1;\n\t\tu.access = ACCESS_READ;\n\t\tu.stageMask = getStageMask(info.stages);\n\t\tu.components = 1;\n\t\tu.resourceIndex = -1;\n\n\t\tif (type->isSizedArray())\n\t\t\tu.count = type->getArraySizes()->getCumulativeSize();\n\t\telse\n\t\t\tu.count = 1;\n\n\t\tconst auto &sampler = type->getSampler();\n\n\t\tif (type->isTexture() && type->getSampler().isCombined() && !sampler.isBuffer())\n\t\t{\n\t\t\tu.baseType = UNIFORM_SAMPLER;\n\t\t\tu.dataBaseType = getBaseType(sampler.getBasicType());\n\t\t\tu.isDepthSampler = sampler.isShadow();\n\t\t\tu.textureType = getTextureType(sampler);\n\n\t\t\tif (u.textureType == TEXTURE_MAX_ENUM)\n\t\t\t\tcontinue;\n\n\t\t\tu.resourceIndex = reflection.textureCount;\n\t\t\treflection.textureCount += u.count;\n\n\t\t\treflection.sampledTextures[u.name] = u;\n\t\t}\n\t\telse if (type->isImage())\n\t\t{\n\t\t\tif ((info.stages & (~EShLangComputeMask)) != 0)\n\t\t\t{\n\t\t\t\terr = \"Shader validation error:\\nStorage Texture uniform variables (image2D, etc) are only allowed in compute shaders.\";\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (!qualifiers.hasFormat())\n\t\t\t{\n\t\t\t\terr = \"Shader validation error:\\nStorage Texture '\" + u.name + \"' must have an explicit format set in its layout declaration.\";\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tu.baseType = UNIFORM_STORAGETEXTURE;\n\t\t\tu.storageTextureFormat = getPixelFormat(qualifiers.getFormat());\n\t\t\tu.dataBaseType = getDataBaseType(u.storageTextureFormat);\n\t\t\tu.textureType = getTextureType(sampler);\n\n\t\t\tif (u.textureType == TEXTURE_MAX_ENUM)\n\t\t\t\tcontinue;\n\n\t\t\tu.resourceIndex = reflection.textureCount;\n\t\t\treflection.textureCount += u.count;\n\n\t\t\tif (qualifiers.isReadOnly())\n\t\t\t\tu.access = ACCESS_READ;\n\t\t\telse if (qualifiers.isWriteOnly())\n\t\t\t\tu.access = ACCESS_WRITE;\n\t\t\telse\n\t\t\t\tu.access = (Access)(ACCESS_READ | ACCESS_WRITE);\n\n\t\t\treflection.storageTextures[u.name] = u;\n\t\t}\n\t\telse if (type->getBasicType() == glslang::EbtSampler && sampler.isBuffer())\n\t\t{\n\t\t\tu.baseType = UNIFORM_TEXELBUFFER;\n\t\t\tu.dataBaseType = getBaseType(sampler.getBasicType());\n\n\t\t\tu.resourceIndex = reflection.bufferCount;\n\t\t\treflection.bufferCount += u.count;\n\n\t\t\treflection.texelBuffers[u.name] = u;\n\t\t}\n\t\telse if (!type->isOpaque())\n\t\t{\n\t\t\tstd::vector<LocalUniformValue> values;\n\t\t\tconst glslang::TConstUnionArray *constarray = info.getConstArray();\n\n\t\t\tif (type->isMatrix())\n\t\t\t{\n\t\t\t\tu.matrix.rows = type->getMatrixRows();\n\t\t\t\tu.matrix.columns = type->getMatrixCols();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu.components = type->getVectorSize();\n\t\t\t}\n\n\t\t\t// Store initializer values for local uniforms. Some love graphics\n\t\t\t// backends strip these out of the shader so we need to be able to\n\t\t\t// access them (to re-send them) by getting them here.\n\t\t\tswitch (type->getBasicType())\n\t\t\t{\n\t\t\tcase glslang::EbtFloat:\n\t\t\t\tu.baseType = type->isMatrix() ? UNIFORM_MATRIX : UNIFORM_FLOAT;\n\t\t\t\tu.dataBaseType = DATA_BASETYPE_FLOAT;\n\t\t\t\tif (constarray != nullptr)\n\t\t\t\t{\n\t\t\t\t\tvalues.resize(constarray->size());\n\t\t\t\t\tfor (int i = 0; i < constarray->size(); i++)\n\t\t\t\t\t\tvalues[i].f = convertData<float>((*constarray)[i]);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase glslang::EbtUint:\n\t\t\t\tu.baseType = UNIFORM_UINT;\n\t\t\t\tu.dataBaseType = DATA_BASETYPE_UINT;\n\t\t\t\tif (constarray != nullptr)\n\t\t\t\t{\n\t\t\t\t\tvalues.resize(constarray->size());\n\t\t\t\t\tfor (int i = 0; i < constarray->size(); i++)\n\t\t\t\t\t\tvalues[i].u = convertData<uint32>((*constarray)[i]);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase glslang::EbtBool:\n\t\t\t\tu.baseType = UNIFORM_BOOL;\n\t\t\t\tu.dataBaseType = DATA_BASETYPE_BOOL;\n\t\t\t\tif (constarray != nullptr)\n\t\t\t\t{\n\t\t\t\t\tvalues.resize(constarray->size());\n\t\t\t\t\tfor (int i = 0; i < constarray->size(); i++)\n\t\t\t\t\t\tvalues[i].u = convertData<uint32>((*constarray)[i]);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase glslang::EbtInt:\n\t\t\tdefault:\n\t\t\t\tu.baseType = UNIFORM_INT;\n\t\t\t\tu.dataBaseType = DATA_BASETYPE_INT;\n\t\t\t\tif (constarray != nullptr)\n\t\t\t\t{\n\t\t\t\t\tvalues.resize(constarray->size());\n\t\t\t\t\tfor (int i = 0; i < constarray->size(); i++)\n\t\t\t\t\t\tvalues[i].i = convertData<int32>((*constarray)[i]);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\treflection.localUniforms[u.name] = u;\n\t\t\treflection.localUniformInitializerValues[u.name] = values;\n\t\t}\n\t}\n\n\tfor (int i = 0; i < program.getNumBufferBlocks(); i++)\n\t{\n\t\tconst glslang::TObjectReflection &info = program.getBufferBlock(i);\n\t\tconst glslang::TType *type = info.getType();\n\t\tif (type != nullptr)\n\t\t{\n\t\t\tconst glslang::TQualifier &qualifiers = type->getQualifier();\n\n\t\t\tif ((!qualifiers.isReadOnly() || qualifiers.isWriteOnly()) && ((info.stages & (~EShLangComputeMask)) != 0))\n\t\t\t{\n\t\t\t\terr = \"Shader validation error:\\nStorage Buffer block '\" + info.name + \"' must be marked as readonly in vertex and pixel shaders.\";\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (qualifiers.layoutPacking != glslang::ElpStd430)\n\t\t\t{\n\t\t\t\terr = \"Shader validation error:\\nStorage Buffer block '\" + info.name + \"' must use the std430 packing layout.\";\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst glslang::TTypeList *structure = type->getStruct();\n\t\t\tif (structure == nullptr || structure->size() != 1)\n\t\t\t{\n\t\t\t\terr = \"Shader validation error:\\nStorage Buffer block '\" + info.name + \"' must contain a single unsized array of base types or structs.\";\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst glslang::TType* elementtype = (*structure)[0].type;\n\t\t\tif (elementtype == nullptr || !elementtype->isUnsizedArray())\n\t\t\t{\n\t\t\t\terr = \"Shader validation error:\\nStorage Buffer block '\" + info.name + \"' must contain a single unsized array of base types or structs.\";\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tUniformInfo u = {};\n\t\t\tu.name = canonicaliizeUniformName(info.name);\n\t\t\tu.location = -1;\n\t\t\tu.stageMask = getStageMask(info.stages);\n\t\t\tu.components = 1;\n\t\t\tu.baseType = UNIFORM_STORAGEBUFFER;\n\n\t\t\tif (type->isSizedArray())\n\t\t\t\tu.count = type->getArraySizes()->getCumulativeSize();\n\t\t\telse\n\t\t\t\tu.count = 1;\n\n\t\t\tu.bufferStride = (size_t) info.size;\n\t\t\tu.bufferMemberCount = (size_t) info.numMembers;\n\n\t\t\tu.resourceIndex = reflection.bufferCount;\n\t\t\treflection.bufferCount += u.count;\n\n\t\t\tif (qualifiers.isReadOnly())\n\t\t\t\tu.access = ACCESS_READ;\n\t\t\telse if (qualifiers.isWriteOnly())\n\t\t\t\tu.access = ACCESS_WRITE;\n\t\t\telse\n\t\t\t\tu.access = (Access)(ACCESS_READ | ACCESS_WRITE);\n\n\t\t\treflection.storageBuffers[u.name] = u;\n\n\t\t\tstd::vector<Buffer::DataDeclaration> format;\n\t\t\tif (!AddFieldsToFormat(format, 0, elementtype, 0, \"\", err))\n\t\t\t\treturn false;\n\n\t\t\treflection.bufferFormats[u.name] = format;\n\t\t}\n\t\telse\n\t\t{\n\t\t\terr = \"Shader validation error:\\nCannot retrieve type information for Storage Buffer Block '\" + info.name + \"'.\";\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tfor (auto &kvp : reflection.texelBuffers)\n\t\treflection.allUniforms[kvp.first] = &kvp.second;\n\n\tfor (auto &kvp : reflection.storageBuffers)\n\t\treflection.allUniforms[kvp.first] = &kvp.second;\n\n\tfor (auto &kvp : reflection.sampledTextures)\n\t\treflection.allUniforms[kvp.first] = &kvp.second;\n\n\tfor (auto &kvp : reflection.storageTextures)\n\t\treflection.allUniforms[kvp.first] = &kvp.second;\n\n\tfor (auto &kvp : reflection.localUniforms)\n\t\treflection.allUniforms[kvp.first] = &kvp.second;\n\n\treturn true;\n}\n\nbool Shader::validateTexture(const UniformInfo *info, Texture *tex, bool internalUpdate)\n{\n\tconst SamplerState &sampler = tex->getSamplerState();\n\tbool isstoragetex = info->baseType == UNIFORM_STORAGETEXTURE;\n\n\tif (!tex->isReadable())\n\t{\n\t\tif (internalUpdate)\n\t\t\treturn false;\n\t\telse\n\t\t\tthrow love::Exception(\"Textures with non-readable formats cannot be sampled from in a shader.\");\n\t}\n\telse if (info->isDepthSampler != sampler.depthSampleMode.hasValue)\n\t{\n\t\tif (internalUpdate)\n\t\t\treturn false;\n\t\telse if (info->isDepthSampler)\n\t\t\tthrow love::Exception(\"Depth comparison samplers in shaders can only be used with depth textures which have depth comparison set.\");\n\t\telse\n\t\t\tthrow love::Exception(\"Depth textures which have depth comparison set can only be used with depth/shadow samplers in shaders.\");\n\t}\n\telse if (tex->getTextureType() != info->textureType)\n\t{\n\t\tif (internalUpdate)\n\t\t\treturn false;\n\t\telse\n\t\t{\n\t\t\tconst char *textypestr = \"unknown\";\n\t\t\tconst char *shadertextypestr = \"unknown\";\n\t\t\tTexture::getConstant(tex->getTextureType(), textypestr);\n\t\t\tTexture::getConstant(info->textureType, shadertextypestr);\n\t\t\tthrow love::Exception(\"Texture's type (%s) must match the type of %s (%s).\", textypestr, info->name.c_str(), shadertextypestr);\n\t\t}\n\t}\n\telse if (!isResourceBaseTypeCompatible(info->dataBaseType, getDataBaseType(tex->getPixelFormat())))\n\t{\n\t\tif (internalUpdate)\n\t\t\treturn false;\n\t\telse\n\t\t\tthrow love::Exception(\"Texture's data format base type must match the uniform variable declared in the shader (float, int, or uint).\");\n\t}\n\telse if (isstoragetex && !tex->isComputeWritable())\n\t{\n\t\tif (internalUpdate)\n\t\t\treturn false;\n\t\telse\n\t\t\tthrow love::Exception(\"Texture must be created with the computewrite flag set to true in order to be used with a storage texture (image2D etc) shader uniform variable.\");\n\t}\n\telse if (isstoragetex && info->storageTextureFormat != tex->getPixelFormat())\n\t{\n\t\tif (internalUpdate)\n\t\t\treturn false;\n\t\telse\n\t\t{\n\t\t\tconst char *texpfstr = \"unknown\";\n\t\t\tconst char *shaderpfstr = \"unknown\";\n\t\t\tlove::getConstant(getLinearPixelFormat(tex->getPixelFormat()), texpfstr);\n\t\t\tlove::getConstant(info->storageTextureFormat, shaderpfstr);\n\t\t\tthrow love::Exception(\"Texture's pixel format (%s) must match the shader uniform variable %s's pixel format (%s)\", texpfstr, info->name.c_str(), shaderpfstr);\n\t\t}\n\t}\n\n\treturn true;\n}\n\nbool Shader::validateBuffer(const UniformInfo *info, Buffer *buffer, bool internalUpdate)\n{\n\tuint32 requiredtypeflags = 0;\n\n\tbool texelbinding = info->baseType == UNIFORM_TEXELBUFFER;\n\tbool storagebinding = info->baseType == UNIFORM_STORAGEBUFFER;\n\n\tif (texelbinding)\n\t\trequiredtypeflags = BUFFERUSAGEFLAG_TEXEL;\n\telse if (storagebinding)\n\t\trequiredtypeflags = BUFFERUSAGEFLAG_SHADER_STORAGE;\n\n\tif ((buffer->getUsageFlags() & requiredtypeflags) == 0)\n\t{\n\t\tif (internalUpdate)\n\t\t\treturn false;\n\t\telse if (texelbinding)\n\t\t\tthrow love::Exception(\"Shader uniform '%s' is a texel buffer, but the given Buffer was not created with texel buffer capabilities.\", info->name.c_str());\n\t\telse if (storagebinding)\n\t\t\tthrow love::Exception(\"Shader uniform '%s' is a shader storage buffer block, but the given Buffer was not created with shader storage buffer capabilities.\", info->name.c_str());\n\t\telse\n\t\t\tthrow love::Exception(\"Shader uniform '%s' does not match the types supported by the given Buffer.\", info->name.c_str());\n\t}\n\n\tif (texelbinding)\n\t{\n\t\tDataBaseType basetype = buffer->getDataMember(0).info.baseType;\n\t\tif (!isResourceBaseTypeCompatible(basetype, info->dataBaseType))\n\t\t{\n\t\t\tif (internalUpdate)\n\t\t\t\treturn false;\n\t\t\telse\n\t\t\t\tthrow love::Exception(\"Texel buffer's data format base type must match the variable declared in the shader.\");\n\t\t}\n\t}\n\telse if (storagebinding)\n\t{\n\t\tif (info->bufferStride != buffer->getArrayStride())\n\t\t{\n\t\t\t// Don't prevent this from working for internally bound default resources.\n\t\t\tif (!internalUpdate)\n\t\t\t\tthrow love::Exception(\"Shader storage block '%s' has an array stride of %d bytes, but the given Buffer has an array stride of %d bytes.\",\n\t\t\t\t\tinfo->name.c_str(), info->bufferStride, buffer->getArrayStride());\n\t\t}\n\t\telse if (info->bufferMemberCount != buffer->getDataMembers().size())\n\t\t{\n\t\t\t// Don't prevent this from working for internally bound default resources.\n\t\t\tif (!internalUpdate)\n\t\t\t\tthrow love::Exception(\"Shader storage block '%s' has a struct with %d fields, but the given Buffer has a format with %d members.\",\n\t\t\t\t\tinfo->name.c_str(), info->bufferMemberCount, buffer->getDataMembers().size());\n\t\t}\n\t}\n\n\treturn true;\n}\n\nstd::string Shader::getShaderStageDebugName(ShaderStageType stage) const\n{\n\tstd::string name = debugName;\n\n\tif (!name.empty())\n\t{\n\t\tconst char *stagename = \"unknown\";\n\t\tShaderStage::getConstant(stage, stagename);\n\t\tname += \" (\" + std::string(stagename) + \")\";\n\t}\n\n\treturn name;\n}\n\nstd::string Shader::canonicaliizeUniformName(const std::string &n)\n{\n\tstd::string name(n);\n\n\t// Some drivers/compilers append \"[0]\" to the end of array uniform names.\n\tif (name.length() > 3)\n\t{\n\t\tsize_t findpos = name.rfind(\"[0]\");\n\t\tif (findpos != std::string::npos && findpos == name.length() - 3)\n\t\t\tname.erase(name.length() - 3);\n\t}\n\n\treturn name;\n}\n\nvoid Shader::handleUnknownUniformName(const char */*name*/)\n{\n\t// TODO: do something here?\n}\n\nvoid Shader::copyToUniformBuffer(const UniformInfo *info, const void *src, void *dst, int count) const\n{\n\tcount = std::min(count, info->count);\n\n\tsize_t elementsize = info->components * 4;\n\tif (info->baseType == UNIFORM_MATRIX)\n\t\telementsize = info->matrix.columns * info->matrix.rows * 4;\n\n\t// Assuming std140 packing rules, the source data can only be direct-copied\n\t// to the uniform buffer in certain cases because it's tightly packed whereas\n\t// the buffer's data isn't.\n\tif (elementsize * info->count == info->dataSize || (count == 1 && info->baseType != UNIFORM_MATRIX))\n\t{\n\t\tmemcpy(dst, src, elementsize * count);\n\t}\n\telse\n\t{\n\t\tint veccount = count;\n\t\tint comp = info->components;\n\n\t\tif (info->baseType == UNIFORM_MATRIX)\n\t\t{\n\t\t\tveccount *= info->matrix.rows;\n\t\t\tcomp = info->matrix.columns;\n\t\t}\n\n\t\tconst int *isrc = (const int *) src;\n\t\tint *idst = (int *) dst;\n\n\t\tfor (int i = 0; i < veccount; i++)\n\t\t{\n\t\t\tfor (int c = 0; c < comp; c++)\n\t\t\t\tidst[i * 4 + c] = isrc[i * comp + c];\n\t\t}\n\t}\n}\n\nbool Shader::initialize()\n{\n\tbool success = glslang::InitializeProcess();\n\tif (!success)\n\t\treturn false;\n\n\tTBuiltInResource *resources = GetResources();\n\t*resources = *GetDefaultResources();\n\n\t// This is 32 in the default resource struct, which is too high for Metal.\n\t// TODO: Set this based on what the system actually supports?\n\tresources->maxDrawBuffers = 8;\n\n\treturn true;\n}\n\nvoid Shader::deinitialize()\n{\n\tglslang::FinalizeProcess();\n}\n\nstatic const std::string defaultVertex = R\"(\nvec4 position(mat4 clipSpaceFromLocal, vec4 localPosition)\n{\n\treturn clipSpaceFromLocal * localPosition;\n}\n)\";\n\nstatic const std::string defaultPointsVertex = R\"(\nvec4 position(mat4 clipSpaceFromLocal, vec4 localPosition)\n{\n\tlove_PointSize = ConstantPointSize * CurrentDPIScale;\n\treturn clipSpaceFromLocal * localPosition;\n}\n)\";\n\nstatic const std::string defaultStandardPixel = R\"(\nvec4 effect(vec4 vcolor, Image tex, vec2 texcoord, vec2 pixcoord)\n{\n\treturn Texel(tex, texcoord) * vcolor;\n}\n)\";\n\nstatic const std::string defaultVideoPixel = R\"(\nvoid effect()\n{\n\tlove_PixelColor = VideoTexel(VaryingTexCoord.xy) * VaryingColor;\n}\n)\";\n\nstatic const std::string defaultArrayPixel = R\"(\nuniform ArrayImage MainTex;\nvoid effect()\n{\n\tlove_PixelColor = Texel(MainTex, VaryingTexCoord.xyz) * VaryingColor;\n}\n)\";\n\nconst std::string &Shader::getDefaultCode(StandardShader shader, ShaderStageType stage)\n{\n\tif (stage == SHADERSTAGE_VERTEX)\n\t{\n\t\tif (shader == STANDARD_POINTS)\n\t\t\treturn defaultPointsVertex;\n\t\telse\n\t\t\treturn defaultVertex;\n\t}\n\n\tstatic std::string nocode = \"\";\n\n\tswitch (shader)\n\t{\n\t\tcase STANDARD_DEFAULT: return defaultStandardPixel;\n\t\tcase STANDARD_VIDEO: return defaultVideoPixel;\n\t\tcase STANDARD_ARRAY: return defaultArrayPixel;\n\t\tcase STANDARD_POINTS: return defaultStandardPixel;\n\t\tcase STANDARD_MAX_ENUM: return nocode;\n\t}\n\n\treturn nocode;\n}\n\nstatic StringMap<Shader::Language, Shader::LANGUAGE_MAX_ENUM>::Entry languageEntries[] =\n{\n\t{ \"glsl3\", Shader::LANGUAGE_GLSL3 },\n\t{ \"glsl4\", Shader::LANGUAGE_GLSL4 },\n};\n\nstatic StringMap<Shader::Language, Shader::LANGUAGE_MAX_ENUM> languages(languageEntries, sizeof(languageEntries));\n\nstatic StringMap<Shader::BuiltinUniform, Shader::BUILTIN_MAX_ENUM>::Entry builtinNameEntries[] =\n{\n\t{ \"MainTex\",               Shader::BUILTIN_TEXTURE_MAIN      },\n\t{ \"love_VideoYChannel\",    Shader::BUILTIN_TEXTURE_VIDEO_Y   },\n\t{ \"love_VideoCbChannel\",   Shader::BUILTIN_TEXTURE_VIDEO_CB  },\n\t{ \"love_VideoCrChannel\",   Shader::BUILTIN_TEXTURE_VIDEO_CR  },\n\t{ \"love_UniformsPerDraw\",  Shader::BUILTIN_UNIFORMS_PER_DRAW },\n};\n\nstatic StringMap<Shader::BuiltinUniform, Shader::BUILTIN_MAX_ENUM> builtinNames(builtinNameEntries, sizeof(builtinNameEntries));\n\nbool Shader::getConstant(const char *in, Language &out)\n{\n\treturn languages.find(in, out);\n}\n\nbool Shader::getConstant(Language in, const char *&out)\n{\n\treturn languages.find(in, out);\n}\n\nbool Shader::getConstant(const char *in, BuiltinUniform &out)\n{\n\treturn builtinNames.find(in, out);\n}\n\nbool Shader::getConstant(BuiltinUniform in, const char *&out)\n{\n\treturn builtinNames.find(in, out);\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/Shader.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/Object.h\"\n#include \"common/StringMap.h\"\n#include \"Texture.h\"\n#include \"ShaderStage.h\"\n#include \"Resource.h\"\n#include \"Buffer.h\"\n\n// STL\n#include <string>\n#include <map>\n#include <vector>\n#include <stddef.h>\n\nnamespace love\n{\nnamespace graphics\n{\n\nclass Graphics;\nclass Buffer;\n\n// A GLSL shader\nclass Shader : public Object, public Resource\n{\npublic:\n\n\tstatic love::Type type;\n\n\tenum Language\n\t{\n\t\tLANGUAGE_GLSL3,\n\t\tLANGUAGE_GLSL4,\n\t\tLANGUAGE_MAX_ENUM\n\t};\n\n\t// Built-in uniform variables.\n\tenum BuiltinUniform\n\t{\n\t\tBUILTIN_TEXTURE_MAIN,\n\t\tBUILTIN_TEXTURE_VIDEO_Y,\n\t\tBUILTIN_TEXTURE_VIDEO_CB,\n\t\tBUILTIN_TEXTURE_VIDEO_CR,\n\t\tBUILTIN_UNIFORMS_PER_DRAW,\n\t\tBUILTIN_MAX_ENUM\n\t};\n\n\t// Types of potential uniform variables used in love's shaders.\n\tenum UniformType\n\t{\n\t\tUNIFORM_FLOAT,\n\t\tUNIFORM_MATRIX,\n\t\tUNIFORM_INT,\n\t\tUNIFORM_UINT,\n\t\tUNIFORM_BOOL,\n\t\tUNIFORM_SAMPLER,\n\t\tUNIFORM_STORAGETEXTURE,\n\t\tUNIFORM_TEXELBUFFER,\n\t\tUNIFORM_STORAGEBUFFER,\n\t\tUNIFORM_UNKNOWN,\n\t\tUNIFORM_MAX_ENUM\n\t};\n\n\tenum StandardShader\n\t{\n\t\tSTANDARD_DEFAULT,\n\t\tSTANDARD_VIDEO,\n\t\tSTANDARD_ARRAY,\n\t\tSTANDARD_POINTS,\n\t\tSTANDARD_MAX_ENUM\n\t};\n\n\tenum EntryPoint\n\t{\n\t\tENTRYPOINT_NONE,\n\t\tENTRYPOINT_HIGHLEVEL,\n\t\tENTRYPOINT_CUSTOM,\n\t\tENTRYPOINT_RAW,\n\t};\n\n\tenum Access\n\t{\n\t\tACCESS_NONE = 0,\n\t\tACCESS_READ = (1 << 0),\n\t\tACCESS_WRITE = (1 << 1),\n\t};\n\n\tenum ClipSpaceTransformFlags\n\t{\n\t\tCLIP_TRANSFORM_NONE = 0,\n\t\tCLIP_TRANSFORM_FLIP_Y = 1 << 0,\n\t\tCLIP_TRANSFORM_Z_NEG1_1_TO_0_1 = 1 << 1,\n\t\tCLIP_TRANSFORM_Z_0_1_TO_NEG1_1 = 1 << 2,\n\t};\n\n\tstruct CompileOptions\n\t{\n\t\tstd::map<std::string, std::string> defines;\n\t\tstd::string debugName;\n\t};\n\n\tstruct SourceInfo\n\t{\n\t\tLanguage language;\n\t\tEntryPoint stages[SHADERSTAGE_MAX_ENUM];\n\t\tbool usesMRT;\n\t};\n\n\tstruct MatrixSize\n\t{\n\t\tshort columns;\n\t\tshort rows;\n\t};\n\n\tstruct UniformInfo\n\t{\n\t\tUniformType baseType;\n\t\tuint32 stageMask;\n\t\tbool active;\n\n\t\tint location;\n\t\tint count;\n\n\t\tunion\n\t\t{\n\t\t\tint components;\n\t\t\tMatrixSize matrix;\n\t\t};\n\n\t\tDataBaseType dataBaseType;\n\t\tTextureType textureType;\n\t\tAccess access;\n\t\tbool isDepthSampler;\n\t\tPixelFormat storageTextureFormat;\n\t\tsize_t bufferStride;\n\t\tsize_t bufferMemberCount;\n\t\tstd::string name;\n\n\t\tint resourceIndex;\n\t\tint bindingStartIndex;\n\n\t\tunion\n\t\t{\n\t\t\tvoid *data;\n\t\t\tfloat *floats;\n\t\t\tint *ints;\n\t\t\tunsigned int *uints;\n\t\t};\n\n\t\tsize_t dataSize;\n\t};\n\n\tunion LocalUniformValue\n\t{\n\t\tfloat f;\n\t\tint32 i;\n\t\tuint32 u;\n\t};\n\n\t// The members in here must respect uniform buffer alignment/padding rules.\n \tstruct BuiltinUniformData\n \t{\n \t\tMatrix4 transformMatrix;\n \t\tMatrix4 projectionMatrix;\n\t\tVector4 scaleParams;\n\t\tVector4 clipSpaceParams;\n \t\tColorf constantColor;\n\t\tVector4 screenSizeParams;\n \t};\n\n\t// Pointer to currently active Shader.\n\tstatic Shader *current;\n\n\t// Pointer to the default Shader.\n\tstatic Shader *standardShaders[STANDARD_MAX_ENUM];\n\n\tShader(StrongRef<ShaderStage> stages[], const CompileOptions &options);\n\tvirtual ~Shader();\n\n\t/**\n\t * Check whether a Shader has a stage.\n\t **/\n\tbool hasStage(ShaderStageType stage);\n\n\t/**\n\t * Binds this Shader's program to be used when rendering.\n\t **/\n\tvirtual void attach() = 0;\n\n\t/**\n\t * Attach a default shader.\n\t **/\n\tstatic void attachDefault(StandardShader defaultType);\n\n\t/**\n\t * Gets whether any of the default shaders are currently active.\n\t **/\n\tstatic bool isDefaultActive();\n\n\t/**\n\t * Used for transforming standardized post-projection clip space positions\n\t * into the backend's current clip space.\n\t * Right now, the standard is:\n\t *   NDC y is [-1, 1] starting at the bottom (y-up).\n\t *   NDC z is [-1, 1].\n\t *   Pixel coordinates are y-down.\n\t *   Pixel (0, 0) in a texture is the top-left.\n\t * Aside from NDC z, this matches Metal and D3D12.\n\t */\n\tstatic Vector4 computeClipSpaceParams(uint32 clipSpaceTransformFlags);\n\n\t/**\n\t * Returns any warnings this Shader may have generated.\n\t **/\n\tvirtual std::string getWarnings() const = 0;\n\n\tconst std::string &getDebugName() const { return debugName; }\n\n\tvirtual int getVertexAttributeIndex(const std::string &name) = 0;\n\n\tconst UniformInfo *getUniformInfo(const std::string &name) const;\n\tvirtual const UniformInfo *getUniformInfo(BuiltinUniform builtin) const = 0;\n\n\tvirtual void updateUniform(const UniformInfo *info, int count) = 0;\n\n\tvoid sendTextures(const UniformInfo *info, Texture **textures, int count);\n\tvoid sendBuffers(const UniformInfo *info, Buffer **buffers, int count);\n\n\t/**\n\t * Gets whether a uniform with the specified name exists and is actively\n\t * used in the shader.\n\t **/\n\tbool hasUniform(const std::string &name) const;\n\n\t/**\n\t * Sets the textures used when rendering a video. For internal use only.\n\t **/\n\tvoid setVideoTextures(Texture *ytexture, Texture *cbtexture, Texture *crtexture);\n\n\tconst UniformInfo *getMainTextureInfo() const;\n\tvoid validateDrawState(PrimitiveType primtype, Texture *maintexture) const;\n\n\tvoid getLocalThreadgroupSize(int *x, int *y, int *z);\n\n\tconst std::vector<Buffer::DataDeclaration> *getBufferFormat(const std::string &name) const;\n\n\tbool isUsingDeprecatedTextureFunctions() const;\n\tbool isUsingDeprecatedTextureUniform() const;\n\n\tconst std::string& getUnsetVertexInputLocationsString() const { return unsetVertexInputLocationsString; }\n\n\tstatic SourceInfo getSourceInfo(const std::string &src);\n\tstatic std::string createShaderStageCode(Graphics *gfx, ShaderStageType stage, const std::string &code, const CompileOptions &options, const SourceInfo &info, bool gles, bool checksystemfeatures);\n\n\tstatic bool validate(StrongRef<ShaderStage> stages[], std::string &err);\n\n\tstatic bool initialize();\n\tstatic void deinitialize();\n\n\tstatic const std::string &getDefaultCode(StandardShader shader, ShaderStageType stage);\n\n\tstatic bool getConstant(const char *in, Language &out);\n\tstatic bool getConstant(Language in, const char *&out);\n\n\tstatic bool getConstant(const char *in, BuiltinUniform &out);\n\tstatic bool getConstant(BuiltinUniform in, const char *&out);\n\nprotected:\n\n\tstruct Reflection\n\t{\n\t\tstd::map<std::string, int> vertexInputs;\n\n\t\tstd::map<std::string, UniformInfo> texelBuffers;\n\t\tstd::map<std::string, UniformInfo> storageBuffers;\n\t\tstd::map<std::string, UniformInfo> sampledTextures;\n\t\tstd::map<std::string, UniformInfo> storageTextures;\n\t\tstd::map<std::string, UniformInfo> localUniforms;\n\n\t\tstd::map<std::string, UniformInfo *> allUniforms;\n\n\t\tstd::map<std::string, std::vector<LocalUniformValue>> localUniformInitializerValues;\n\n\t\tstd::map<std::string, std::vector<Buffer::DataDeclaration>> bufferFormats;\n\n\t\tint textureCount;\n\t\tint bufferCount;\n\n\t\tint localThreadgroupSize[3];\n\t\tbool usesPointSize;\n\t};\n\n\tstd::string getShaderStageDebugName(ShaderStageType stage) const;\n\n\tvoid handleUnknownUniformName(const char *name);\n\n\t// std140 uniform buffer alignment-aware copy.\n\tvoid copyToUniformBuffer(const UniformInfo *info, const void *src, void *dst, int count) const;\n\n\tvoid sendTextures(const UniformInfo *info, Texture **textures, int count, bool internalupdate);\n\tvoid sendBuffers(const UniformInfo *info, Buffer **buffers, int count, bool internalupdate);\n\n\tvirtual void applyTexture(const UniformInfo *info, int i, Texture *texture, UniformType basetype, bool isdefault) = 0;\n\tvirtual void applyBuffer(const UniformInfo *info, int i, Buffer *buffer, UniformType basetype, bool isdefault) = 0;\n\n\tvoid flushBatchedDraws() const;\n\n\tstatic std::string canonicaliizeUniformName(const std::string &name);\n\tstatic bool validateInternal(StrongRef<ShaderStage> stages[], std::string& err, Reflection &reflection);\n\tstatic DataBaseType getDataBaseType(PixelFormat format);\n\tstatic bool isResourceBaseTypeCompatible(DataBaseType a, DataBaseType b);\n\n\tstatic bool validateTexture(const UniformInfo *info, Texture *tex, bool internalUpdate);\n\tstatic bool validateBuffer(const UniformInfo *info, Buffer *buffer, bool internalUpdate);\n\n\tStrongRef<ShaderStage> stages[SHADERSTAGE_MAX_ENUM];\n\n\tReflection reflection;\n\n\tstd::vector<Texture *> activeTextures;\n\tstd::vector<Buffer *> activeBuffers;\n\n\tstd::string debugName;\n\n\tstd::string unsetVertexInputLocationsString;\n\n}; // Shader\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/ShaderStage.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"ShaderStage.h\"\n#include \"common/Exception.h\"\n#include \"Graphics.h\"\n\n#include \"libraries/glslang/glslang/Public/ShaderLang.h\"\n#include \"libraries/glslang/glslang/Public/ResourceLimits.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nShaderStage::ShaderStage(Graphics */*gfx*/, ShaderStageType stage, const std::string &glsl, bool gles, const std::string &cachekey)\n\t: stageType(stage)\n\t, source(glsl)\n\t, cacheKey(cachekey)\n\t, glslangValidationShader(nullptr)\n{\n\tEShLanguage glslangStage = EShLangCount;\n\tif (stage == SHADERSTAGE_VERTEX)\n\t\tglslangStage = EShLangVertex;\n\telse if (stage == SHADERSTAGE_PIXEL)\n\t\tglslangStage = EShLangFragment;\n\telse if (stage == SHADERSTAGE_COMPUTE)\n\t\tglslangStage = EShLangCompute;\n\telse\n\t\tthrow love::Exception(\"Cannot compile shader stage: unknown stage type.\");\n\n\tauto glslangShader = new glslang::TShader(glslangStage);\n\n\tint defaultversion = gles ? 300 : 330;\n\tEProfile defaultprofile = gles ? EEsProfile : ECoreProfile;\n\n\tconst char *csrc = glsl.c_str();\n\tint srclen = (int) glsl.length();\n\tglslangShader->setStringsWithLengths(&csrc, &srclen, 1);\n\n\tbool forcedefault = false;\n\tbool forwardcompat = true;\n\n\tif (!glslangShader->parse(GetResources(), defaultversion, defaultprofile, forcedefault, forwardcompat, (EShMessages)(EShMsgSuppressWarnings | EshMsgOverlappingLocations)))\n\t{\n\t\tconst char *stagename = \"unknown\";\n\t\tgetConstant(stage, stagename);\n\n\t\tstd::string err = \"Error validating \" + std::string(stagename) + \" shader:\\n\\n\"\n\t\t\t+ std::string(glslangShader->getInfoLog()) + \"\\n\"\n\t\t\t+ std::string(glslangShader->getInfoDebugLog());\n\n\t\tdelete glslangShader;\n\t\tthrow love::Exception(\"%s\", err.c_str());\n\t}\n\n\tglslangValidationShader = glslangShader;\n}\n\nShaderStage::~ShaderStage()\n{\n\tif (!cacheKey.empty())\n\t{\n\t\tauto gfx = Module::getInstance<Graphics>(Module::M_GRAPHICS);\n\t\tif (gfx != nullptr)\n\t\t\tgfx->cleanupCachedShaderStage(stageType, cacheKey);\n\t}\n\n\tdelete glslangValidationShader;\n}\n\nbool ShaderStage::getConstant(const char *in, ShaderStageType &out)\n{\n\treturn stageNames.find(in, out);\n}\n\nbool ShaderStage::getConstant(ShaderStageType in, const char *&out)\n{\n\treturn stageNames.find(in, out);\n}\n\nconst char *ShaderStage::getConstant(ShaderStageType in)\n{\n\tconst char *name = nullptr;\n\tgetConstant(in, name);\n\treturn name;\n}\n\nStringMap<ShaderStageType, SHADERSTAGE_MAX_ENUM>::Entry ShaderStage::stageNameEntries[] =\n{\n\t{ \"vertex\",  SHADERSTAGE_VERTEX  },\n\t{ \"pixel\",   SHADERSTAGE_PIXEL   },\n\t{ \"compute\", SHADERSTAGE_COMPUTE },\n};\n\nStringMap<ShaderStageType, SHADERSTAGE_MAX_ENUM> ShaderStage::stageNames(ShaderStage::stageNameEntries, sizeof(ShaderStage::stageNameEntries));\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/ShaderStage.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"common/Object.h\"\n#include \"common/StringMap.h\"\n#include \"Resource.h\"\n\n#include <stddef.h>\n#include <string>\n\nnamespace glslang\n{\nclass TShader;\n}\n\nnamespace love\n{\nnamespace graphics\n{\n\nclass Graphics;\n\n// Order is used for stages array in ShaderStage.cpp\nenum ShaderStageType\n{\n\tSHADERSTAGE_VERTEX,\n\tSHADERSTAGE_PIXEL,\n\tSHADERSTAGE_COMPUTE,\n\tSHADERSTAGE_MAX_ENUM\n};\n\nenum ShaderStageMask\n{\n\tSHADERSTAGEMASK_NONE = 0,\n\tSHADERSTAGEMASK_VERTEX = 1 << SHADERSTAGE_VERTEX,\n\tSHADERSTAGEMASK_PIXEL = 1 << SHADERSTAGE_PIXEL,\n\tSHADERSTAGEMASK_COMPUTE = 1 << SHADERSTAGE_COMPUTE,\n};\n\nclass ShaderStage : public love::Object\n{\npublic:\n\n\tShaderStage(Graphics *gfx, ShaderStageType stage, const std::string &glsl, bool gles, const std::string &cachekey);\n\tvirtual ~ShaderStage();\n\n\tvirtual ptrdiff_t getHandle() const = 0;\n\n\tShaderStageType getStageType() const { return stageType; }\n\tconst std::string &getSource() const { return source; }\n\tconst std::string &getWarnings() const { return warnings; }\n\tglslang::TShader *getGLSLangValidationShader() const { return glslangValidationShader; }\n\n\tstatic bool getConstant(const char *in, ShaderStageType &out);\n\tstatic bool getConstant(ShaderStageType in, const char *&out);\n\tstatic const char *getConstant(ShaderStageType in);\n\nprotected:\n\n\tstd::string warnings;\n\nprivate:\n\n\tShaderStageType stageType;\n\tstd::string source;\n\tstd::string cacheKey;\n\tglslang::TShader *glslangValidationShader;\n\n\tstatic StringMap<ShaderStageType, SHADERSTAGE_MAX_ENUM>::Entry stageNameEntries[];\n\tstatic StringMap<ShaderStageType, SHADERSTAGE_MAX_ENUM> stageNames;\n\n}; // ShaderStage\n\nclass ShaderStageForValidation final : public ShaderStage\n{\npublic:\n\n\tShaderStageForValidation(Graphics *gfx, ShaderStageType stage, const std::string &glsl, bool gles)\n\t\t: ShaderStage(gfx, stage, glsl, gles, \"\")\n\t{}\n\tvirtual ~ShaderStageForValidation() {}\n\tptrdiff_t getHandle() const override { return 0; }\n\n}; // ShaderStageForValidation\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/SpriteBatch.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"common/config.h\"\n#include \"SpriteBatch.h\"\n\n// LOVE\n#include \"Texture.h\"\n#include \"Quad.h\"\n#include \"Graphics.h\"\n#include \"Buffer.h\"\n\n// C++\n#include <algorithm>\n\n// C\n#include <stddef.h>\n\nnamespace love\n{\nnamespace graphics\n{\n\nlove::Type SpriteBatch::type(\"SpriteBatch\", &Drawable::type);\n\nSpriteBatch::SpriteBatch(Graphics *gfx, Texture *texture, int size, BufferDataUsage usage)\n\t: texture(texture)\n\t, size(size)\n\t, next(0)\n\t, color(255, 255, 255, 255)\n\t, colorf(1.0f, 1.0f, 1.0f, 1.0f)\n\t, attributesID()\n\t, array_buf(nullptr)\n\t, vertex_data(nullptr)\n\t, modified_sprites()\n\t, range_start(-1)\n\t, range_count(-1)\n{\n\tif (size <= 0)\n\t\tthrow love::Exception(\"Invalid SpriteBatch size.\");\n\n\tif (texture == nullptr)\n\t\tthrow love::Exception(\"A texture must be used when creating a SpriteBatch.\");\n\n\tif (texture->getTextureType() == TEXTURE_2D_ARRAY)\n\t\tvertex_format = CommonFormat::XYf_STPf_RGBAub;\n\telse\n\t\tvertex_format = CommonFormat::XYf_STf_RGBAub;\n\n\tvertex_stride = getFormatStride(vertex_format);\n\n\tsize_t vertex_size = vertex_stride * 4 * size;\n\n\tvertex_data = (uint8 *) malloc(vertex_size);\n\tif (vertex_data == nullptr)\n\t\tthrow love::Exception(\"Out of memory.\");\n\n\tmemset(vertex_data, 0, vertex_size);\n\n\tBuffer::Settings settings(BUFFERUSAGEFLAG_VERTEX, usage);\n\tauto decl = Buffer::getCommonFormatDeclaration(vertex_format);\n\n\tarray_buf.set(gfx->newBuffer(settings, decl, nullptr, vertex_size, 0), Acquire::NORETAIN);\n}\n\nSpriteBatch::~SpriteBatch()\n{\n\tfree(vertex_data);\n}\n\nint SpriteBatch::add(const Matrix4 &m, int index /*= -1*/)\n{\n\treturn add(texture->getQuad(), m, index);\n}\n\nint SpriteBatch::add(Quad *quad, const Matrix4 &m, int index /*= -1*/)\n{\n\tif (vertex_format == CommonFormat::XYf_STPf_RGBAub)\n\t\treturn addLayer(quad->getLayer(), quad, m, index);\n\n\tif (index < -1 || index >= size)\n\t\tthrow love::Exception(\"Invalid sprite index: %d\", index + 1);\n\n\tif (index == -1 && next >= size)\n\t\tsetBufferSize(size * 2);\n\n\tconst Vector2 *quadpositions = quad->getVertexPositions();\n\tconst Vector2 *quadtexcoords = quad->getVertexTexCoords();\n\n\tint spriteindex = (index == -1 ? next : index);\n\n\tsize_t offset = spriteindex * vertex_stride * 4;\n\tauto verts = (XYf_STf_RGBAub *) (vertex_data + offset);\n\n\tm.transformXY(verts, quadpositions, 4);\n\n\tfor (int i = 0; i < 4; i++)\n\t{\n\t\tverts[i].s = quadtexcoords[i].x;\n\t\tverts[i].t = quadtexcoords[i].y;\n\t\tverts[i].color = color;\n\t}\n\n\tmodified_sprites.encapsulate(spriteindex);\n\n\t// Increment counter.\n\tif (index == -1)\n\t\treturn next++;\n\n\treturn index;\n}\n\nint SpriteBatch::addLayer(int layer, const Matrix4 &m, int index)\n{\n\treturn addLayer(layer, texture->getQuad(), m, index);\n}\n\nint SpriteBatch::addLayer(int layer, Quad *quad, const Matrix4 &m, int index)\n{\n\tif (vertex_format != CommonFormat::XYf_STPf_RGBAub)\n\t\tthrow love::Exception(\"addLayer can only be called on a SpriteBatch that uses an Array Texture.\");\n\n\tif (index < -1 || index >= size)\n\t\tthrow love::Exception(\"Invalid sprite index: %d\", index + 1);\n\n\tif (layer < 0 || layer >= texture->getLayerCount())\n\t\tthrow love::Exception(\"Invalid layer: %d (Texture has %d layers)\", layer + 1, texture->getLayerCount());\n\n\tif (index == -1 && next >= size)\n\t\tsetBufferSize(size * 2);\n\n\tconst Vector2 *quadpositions = quad->getVertexPositions();\n\tconst Vector2 *quadtexcoords = quad->getVertexTexCoords();\n\n\tint spriteindex = (index == -1 ? next : index);\n\n\tsize_t offset = spriteindex * vertex_stride * 4;\n\tauto verts = (XYf_STPf_RGBAub *) (vertex_data + offset);\n\n\tm.transformXY(verts, quadpositions, 4);\n\n\tfor (int i = 0; i < 4; i++)\n\t{\n\t\tverts[i].s = quadtexcoords[i].x;\n\t\tverts[i].t = quadtexcoords[i].y;\n\t\tverts[i].p = (float) layer;\n\t\tverts[i].color = color;\n\t}\n\n\tmodified_sprites.encapsulate(spriteindex);\n\n\t// Increment counter.\n\tif (index == -1)\n\t\treturn next++;\n\n\treturn index;\n}\n\nvoid SpriteBatch::clear()\n{\n\t// Reset the position of the next index.\n\tnext = 0;\n}\n\nvoid SpriteBatch::flush()\n{\n\tif (modified_sprites.isValid())\n\t{\n\t\tsize_t offset = modified_sprites.getOffset() * vertex_stride * 4;\n\t\tsize_t size = modified_sprites.getSize() * vertex_stride * 4;\n\n\t\tif (array_buf->getDataUsage() == BUFFERDATAUSAGE_STREAM)\n\t\t\tarray_buf->fill(0, array_buf->getSize(), vertex_data);\n\t\telse\n\t\t\tarray_buf->fill(offset, size, vertex_data + offset);\n\n\t\tmodified_sprites.invalidate();\n\t}\n}\n\nvoid SpriteBatch::setTexture(Texture *newtexture)\n{\n\tif (texture->getTextureType() != newtexture->getTextureType())\n\t\tthrow love::Exception(\"Texture must have the same type as the SpriteBatch's previous texture.\");\n\n\ttexture.set(newtexture);\n}\n\nTexture *SpriteBatch::getTexture() const\n{\n\treturn texture.get();\n}\n\nvoid SpriteBatch::setColor(const Colorf &c)\n{\n\tcolorf.r = std::min(std::max(c.r, 0.0f), 1.0f);\n\tcolorf.g = std::min(std::max(c.g, 0.0f), 1.0f);\n\tcolorf.b = std::min(std::max(c.b, 0.0f), 1.0f);\n\tcolorf.a = std::min(std::max(c.a, 0.0f), 1.0f);\n\n\tcolor = toColor32(colorf);\n}\n\nColorf SpriteBatch::getColor() const\n{\n\treturn colorf;\n}\n\nint SpriteBatch::getCount() const\n{\n\treturn next;\n}\n\nvoid SpriteBatch::setBufferSize(int newsize)\n{\n\tif (newsize <= 0)\n\t\tthrow love::Exception(\"Invalid SpriteBatch size.\");\n\n\tif (newsize == size)\n\t\treturn;\n\n\tsize_t vertex_size = vertex_stride * 4 * newsize;\n\n\tint new_next = std::min(next, newsize);\n\n\tvoid *new_vertex_data = realloc(vertex_data, vertex_size);\n\tif (new_vertex_data == nullptr)\n\t\tthrow love::Exception(\"Out of memory.\");\n\n\tauto gfx = Module::getInstance<graphics::Graphics>(Module::M_GRAPHICS);\n\tBuffer::Settings settings(array_buf->getUsageFlags(), array_buf->getDataUsage());\n\tauto decl = Buffer::getCommonFormatDeclaration(vertex_format);\n\n\tarray_buf.set(gfx->newBuffer(settings, decl, nullptr, vertex_size, 0), Acquire::NORETAIN);\n\n\tarray_buf->fill(0, vertex_stride * 4 * new_next, new_vertex_data);\n\n\tvertex_data = (uint8 *) new_vertex_data;\n\n\tsize = newsize;\n\tnext = new_next;\n\n\tattributesID.invalidate();\n}\n\nint SpriteBatch::getBufferSize() const\n{\n\treturn size;\n}\n\nvoid SpriteBatch::attachAttribute(const std::string &name, Buffer *buffer, Mesh *mesh)\n{\n\tif ((buffer->getUsageFlags() & BUFFERUSAGEFLAG_VERTEX) == 0)\n\t\tthrow love::Exception(\"GraphicsBuffer must be created with vertex buffer support to be used as a SpriteBatch vertex attribute.\");\n\n\tAttachedAttribute oldattrib = {};\n\tAttachedAttribute newattrib = {};\n\n\tif (buffer->getArrayLength() < (size_t) next * 4)\n\t\tthrow love::Exception(\"Buffer has too few vertices to be attached to this SpriteBatch (at least %d vertices are required)\", next*4);\n\n\tauto it = attached_attributes.find(name);\n\tif (it != attached_attributes.end())\n\t\toldattrib = it->second;\n\n\tnewattrib.index = buffer->getDataMemberIndex(name);\n\n\tif (newattrib.index < 0)\n\t\tthrow love::Exception(\"The specified Buffer does not have a vertex attribute named '%s'\", name.c_str());\n\n\tnewattrib.buffer = buffer;\n\tnewattrib.mesh = mesh;\n\tnewattrib.bindingIndex = buffer->getDataMember(newattrib.index).decl.bindingLocation;\n\n\tBuiltinVertexAttribute builtinattrib;\n\tif (newattrib.bindingIndex < 0 && getConstant(name.c_str(), builtinattrib))\n\t\tnewattrib.bindingIndex = (int)builtinattrib;\n\n\tattached_attributes[name] = newattrib;\n\n\tattributesID.invalidate();\n}\n\nvoid SpriteBatch::setDrawRange(int start, int count)\n{\n\tif (start < 0 || count <= 0)\n\t\tthrow love::Exception(\"Invalid draw range.\");\n\n\trange_start = start;\n\trange_count = count;\n}\n\nvoid SpriteBatch::setDrawRange()\n{\n\trange_start = range_count = -1;\n}\n\nbool SpriteBatch::getDrawRange(int &start, int &count) const\n{\n\tif (range_start < 0 || range_count <= 0)\n\t\treturn false;\n\n\tstart = range_start;\n\tcount = range_count;\n\treturn true;\n}\n\nvoid SpriteBatch::updateVertexAttributes(Graphics *gfx)\n{\n\tVertexAttributes attributes;\n\tBufferBindings &buffers = bufferBindings;\n\n\tbuffers.set(0, array_buf, 0);\n\tattributes.setCommonFormat(vertex_format, 0);\n\n\tint activebuffers = 1;\n\n\tfor (const auto &it : attached_attributes)\n\t{\n\t\tBuffer *buffer = it.second.buffer.get();\n\n\t\tint bindingindex = it.second.bindingIndex;\n\n\t\t// If the attribute is one of the LOVE-defined ones, use the constant\n\t\t// attribute index for it, otherwise query the index from the shader.\n\t\tif (bindingindex < 0 && Shader::current)\n\t\t\tbindingindex = Shader::current->getVertexAttributeIndex(it.first);\n\n\t\tif (bindingindex >= 0)\n\t\t{\n\t\t\tconst auto &member = buffer->getDataMember(it.second.index);\n\n\t\t\tuint16 offset = (uint16) buffer->getMemberOffset(it.second.index);\n\t\t\tuint16 stride = (uint16) buffer->getArrayStride();\n\n\t\t\tint bufferindex = activebuffers;\n\n\t\t\tfor (int i = 1; i < activebuffers; i++)\n\t\t\t{\n\t\t\t\tif (buffers.info[i].buffer == buffer && attributes.bufferLayouts[i].stride == stride)\n\t\t\t\t{\n\t\t\t\t\tbufferindex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tattributes.set(bindingindex, member.decl.format, offset, bufferindex);\n\t\t\tattributes.setBufferLayout(bufferindex, stride);\n\n\t\t\tbuffers.set(bufferindex, buffer, 0);\n\n\t\t\tactivebuffers = std::max(activebuffers, bufferindex + 1);\n\t\t}\n\t}\n\n\tattributesID = gfx->registerVertexAttributes(attributes);\n}\n\nvoid SpriteBatch::draw(Graphics *gfx, const Matrix4 &m)\n{\n\tif (next == 0)\n\t\treturn;\n\n\tgfx->flushBatchedDraws();\n\n\tif (texture.get())\n\t{\n\t\tif (Shader::isDefaultActive())\n\t\t{\n\t\t\tShader::StandardShader defaultshader = Shader::STANDARD_DEFAULT;\n\t\t\tif (texture->getTextureType() == TEXTURE_2D_ARRAY)\n\t\t\t\tdefaultshader = Shader::STANDARD_ARRAY;\n\n\t\t\tShader::attachDefault(defaultshader);\n\t\t}\n\t}\n\n\tif (Shader::current)\n\t\tShader::current->validateDrawState(PRIMITIVE_TRIANGLES, texture);\n\n\tflush(); // Upload any modified sprite data to the GPU.\n\n\tbool attributesIDneedsupdate = !attributesID.isValid();\n\n\tfor (const auto &it : attached_attributes)\n\t{\n\t\tBuffer *buffer = it.second.buffer.get();\n\n\t\t// We have to do this check here as wll because setBufferSize can be\n\t\t// called after attachAttribute.\n\t\tif (buffer->getArrayLength() < (size_t) next * 4)\n\t\t\tthrow love::Exception(\"Buffer with attribute '%s' attached to this SpriteBatch has too few vertices\", it.first.c_str());\n\n\t\t// If the attribute is one of the LOVE-defined ones, use the constant\n\t\t// attribute index for it, otherwise query the index from the shader.\n\t\tif (it.second.bindingIndex < 0)\n\t\t\tattributesIDneedsupdate = true;\n\n\t\tif (it.second.mesh.get())\n\t\t\tit.second.mesh->flush();\n\t}\n\n\tif (attributesIDneedsupdate)\n\t\tupdateVertexAttributes(gfx);\n\n\tGraphics::TempTransform transform(gfx, m);\n\n\tint start = std::min(std::max(0, range_start), next - 1);\n\n\tint count = next;\n\tif (range_count > 0)\n\t\tcount = std::min(count, range_count);\n\n\tcount = std::min(count, next - start);\n\n\tif (count > 0)\n\t{\n\t\tTexture *tex = gfx->getTextureOrDefaultForActiveShader(texture);\n\t\tgfx->drawQuads(start, count, attributesID, bufferBindings, tex);\n\t}\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/SpriteBatch.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// C\n#include <cstring>\n\n// C++\n#include <unordered_map>\n\n// LOVE\n#include \"common/math.h\"\n#include \"common/Matrix.h\"\n#include \"common/Color.h\"\n#include \"common/Range.h\"\n#include \"Drawable.h\"\n#include \"Mesh.h\"\n#include \"vertex.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\n// Forward declarations.\nclass Graphics;\nclass Texture;\nclass Quad;\nclass Buffer;\n\nclass SpriteBatch : public Drawable\n{\npublic:\n\n\tstatic love::Type type;\n\n\tSpriteBatch(Graphics *gfx, Texture *texture, int size, BufferDataUsage usage);\n\tvirtual ~SpriteBatch();\n\n\tint add(const Matrix4 &m, int index = -1);\n\tint add(Quad *quad, const Matrix4 &m, int index = -1);\n\tint addLayer(int layer, const Matrix4 &m, int index = -1);\n\tint addLayer(int layer, Quad *quad, const Matrix4 &m, int index = -1);\n\n\tvoid clear();\n\n\tvoid flush();\n\n\tvoid setTexture(Texture *newtexture);\n\tTexture *getTexture() const;\n\n\t/**\n\t * Set the current color for this SpriteBatch. The sprites added after this\n\t * call will use this color.\n\t *\n\t * @param color The color to use for the following sprites.\n\t */\n\tvoid setColor(const Colorf &color);\n\n\t/**\n\t * Get the current color for this SpriteBatch.\n\t **/\n\tColorf getColor() const;\n\n\t/**\n\t * Get the number of sprites currently in this SpriteBatch.\n\t **/\n\tint getCount() const;\n\n\t/**\n\t * Get the total number of sprites this SpriteBatch can currently hold.\n\t **/\n\tint getBufferSize() const;\n\n\t/**\n\t * Attaches a specific vertex attribute from a Buffer to this SpriteBatch.\n\t * The vertex attribute will be used when drawing the SpriteBatch.\n\t * If the attribute comes from a Mesh, it should be given as an argument as\n\t * well, to make sure the SpriteBatch flushes its data to its Buffer when\n\t * the SpriteBatch is drawn.\n\t **/\n\tvoid attachAttribute(const std::string &name, Buffer *buffer, Mesh *mesh);\n\n\tvoid setDrawRange(int start, int count);\n\tvoid setDrawRange();\n\tbool getDrawRange(int &start, int &count) const;\n\n\t// Implements Drawable.\n\tvoid draw(Graphics *gfx, const Matrix4 &m) override;\n\nprivate:\n\n\tvoid updateVertexAttributes(Graphics *gfx);\n\n\tstruct AttachedAttribute\n\t{\n\t\tStrongRef<Buffer> buffer;\n\t\tStrongRef<Mesh> mesh;\n\t\tint index;\n\t\tint bindingIndex;\n\t};\n\n\t/**\n\t * Sets the total number of sprites this SpriteBatch can hold.\n\t * Leaves existing sprite data intact when possible.\n\t **/\n\tvoid setBufferSize(int newsize);\n\n\tStrongRef<Texture> texture;\n\n\t// Max number of sprites in the batch.\n\tint size;\n\n\t// The next free element.\n\tint next;\n\n\t// Current color. This color will be applied to the next added sprite.\n\tColor32 color;\n\tColorf colorf;\n\n\tCommonFormat vertex_format;\n\tsize_t vertex_stride;\n\n\tVertexAttributesID attributesID;\n\tBufferBindings bufferBindings;\n\n\tStrongRef<love::graphics::Buffer> array_buf;\n\tuint8 *vertex_data;\n\n\tRange modified_sprites;\n\n\tstd::unordered_map<std::string, AttachedAttribute> attached_attributes;\n\t\n\tint range_start;\n\tint range_count;\n\t\n}; // SpriteBatch\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/StreamBuffer.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"StreamBuffer.h\"\n#include \"common/Exception.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nStreamBuffer::StreamBuffer(BufferUsage mode, size_t size)\n\t: bufferSize(size)\n\t, frameGPUReadOffset(0)\n\t, mode(mode)\n{\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/StreamBuffer.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/int.h\"\n#include \"common/Object.h\"\n#include \"vertex.h\"\n#include \"Resource.h\"\n\n// C\n#include <cstddef>\n\nnamespace love\n{\nnamespace graphics\n{\n\nclass StreamBuffer : public love::Object, public Resource\n{\npublic:\n\n\tstruct MapInfo\n\t{\n\t\tuint8 *data = nullptr;\n\t\tsize_t size = 0;\n\n\t\tMapInfo() {}\n\n\t\tMapInfo(uint8 *data, size_t size)\n\t\t\t: data(data)\n\t\t\t, size(size)\n\t\t{}\n\t};\n\n\tvirtual ~StreamBuffer() {}\n\n\tsize_t getSize() const { return bufferSize; }\n\tBufferUsage getMode() const { return mode; }\n\tsize_t getUsableSize() const { return bufferSize - frameGPUReadOffset; }\n\n\tvirtual size_t getGPUReadOffset() const = 0;\n\n\tvirtual MapInfo map(size_t minsize) = 0;\n\tvirtual size_t unmap(size_t usedsize) = 0;\n\tvirtual void markUsed(size_t usedsize) = 0;\n\n\tvirtual void nextFrame() {}\n\nprotected:\n\n\tStreamBuffer(BufferUsage mode, size_t size);\n\n\tsize_t bufferSize;\n\tsize_t frameGPUReadOffset;\n\tBufferUsage mode;\n\n}; // StreamBuffer\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/TextBatch.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"TextBatch.h\"\n#include \"Graphics.h\"\n\n#include <algorithm>\n\nnamespace love\n{\nnamespace graphics\n{\n\nlove::Type TextBatch::type(\"TextBatch\", &Drawable::type);\n\nTextBatch::TextBatch(Font *font, const std::vector<love::font::ColoredString> &text)\n\t: font(font)\n\t, vertexAttributesID(font->getVertexAttributesID())\n\t, vertexData(nullptr)\n\t, modifiedVertices()\n\t, vertOffset(0)\n\t, textureCacheID(font->getTextureCacheID())\n{\n\tset(text);\n}\n\nTextBatch::~TextBatch()\n{\n\tif (vertexData != nullptr)\n\t\tfree(vertexData);\n}\n\nvoid TextBatch::uploadVertices(const std::vector<Font::GlyphVertex> &vertices, size_t vertoffset)\n{\n\tsize_t offset = vertoffset * sizeof(Font::GlyphVertex);\n\tsize_t datasize = vertices.size() * sizeof(Font::GlyphVertex);\n\n\t// If we haven't created a VBO or the vertices are too big, make a new one.\n\tif (datasize > 0 && (!vertexBuffer || (offset + datasize) > vertexBuffer->getSize()))\n\t{\n\t\t// Make it bigger than necessary to reduce potential future allocations.\n\t\tsize_t newsize = size_t((offset + datasize) * 1.5);\n\n\t\tif (vertexBuffer != nullptr)\n\t\t\tnewsize = std::max(size_t(vertexBuffer->getSize() * 1.5), newsize);\n\n\t\tauto gfx = Module::getInstance<Graphics>(Module::M_GRAPHICS);\n\n\t\tBuffer::Settings settings(BUFFERUSAGEFLAG_VERTEX, BUFFERDATAUSAGE_DYNAMIC);\n\t\tauto decl = Buffer::getCommonFormatDeclaration(Font::vertexFormat);\n\n\t\tStrongRef<Buffer> newbuffer(gfx->newBuffer(settings, decl, nullptr, newsize, 0), Acquire::NORETAIN);\n\n\t\tvoid *newdata = nullptr;\n\t\tif (vertexData != nullptr)\n\t\t\tnewdata = realloc(vertexData, newsize);\n\t\telse\n\t\t\tnewdata = malloc(newsize);\n\n\t\tif (newdata == nullptr)\n\t\t\tthrow love::Exception(\"Out of memory.\");\n\t\telse\n\t\t\tvertexData = (uint8 *) newdata;\n\n\t\tvertexBuffer = newbuffer;\n\n\t\tvertexBuffers.set(0, vertexBuffer, 0);\n\t\tmodifiedVertices.encapsulate(0, newsize);\n\t}\n\n\tif (vertexData != nullptr && datasize > 0)\n\t{\n\t\tmemcpy(vertexData + offset, &vertices[0], datasize);\n\t\tmodifiedVertices.encapsulate(offset, datasize);\n\t}\n}\n\nvoid TextBatch::regenerateVertices()\n{\n\t// If the font's texture cache was invalidated then we need to recreate the\n\t// text's vertices, since glyph texcoords might have changed.\n\tif (font->getTextureCacheID() != textureCacheID)\n\t{\n\t\tstd::vector<TextData> textdata = textData;\n\n\t\tclear();\n\n\t\tfor (const TextData &t : textdata)\n\t\t\taddTextData(t);\n\n\t\ttextureCacheID = font->getTextureCacheID();\n\t}\n}\n\nvoid TextBatch::addTextData(const TextData &t)\n{\n\tstd::vector<Font::GlyphVertex> vertices;\n\tstd::vector<Font::DrawCommand> newcommands;\n\n\tlove::font::TextShaper::TextInfo textinfo;\n\n\tColorf constantcolor = Colorf(1.0f, 1.0f, 1.0f, 1.0f);\n\n\t// We only have formatted text if the align mode is valid.\n\tif (t.align == Font::ALIGN_MAX_ENUM)\n\t\tnewcommands = font->generateVertices(t.codepoints, Range(), constantcolor, vertices, 0.0f, Vector2(0.0f, 0.0f), &textinfo);\n\telse\n\t\tnewcommands = font->generateVerticesFormatted(t.codepoints, constantcolor, t.wrap, t.align, vertices, &textinfo);\n\n\tsize_t voffset = vertOffset;\n\n\tif (!t.appendVertices)\n\t{\n\t\tvoffset = 0;\n\t\tvertOffset = 0;\n\t\tdrawCommands.clear();\n\t\ttextData.clear();\n\t}\n\n\tif (t.useMatrix && !vertices.empty())\n\t\tt.matrix.transformXY(vertices.data(), vertices.data(), (int) vertices.size());\n\n\tuploadVertices(vertices, voffset);\n\n\tif (!newcommands.empty())\n\t{\n\t\t// The start vertex should be adjusted to account for the vertex offset.\n\t\tfor (Font::DrawCommand &cmd : newcommands)\n\t\t\tcmd.startvertex += (int) voffset;\n\n\t\tauto firstcmd = newcommands.begin();\n\n\t\t// If the first draw command in the new list has the same texture as the\n\t\t// last one in the existing list we're building and its vertices are\n\t\t// in-order, we can combine them (saving a draw call.)\n\t\tif (!drawCommands.empty())\n\t\t{\n\t\t\tauto prevcmd = drawCommands.back();\n\t\t\tif (prevcmd.texture == firstcmd->texture && (prevcmd.startvertex + prevcmd.vertexcount) == firstcmd->startvertex)\n\t\t\t{\n\t\t\t\tdrawCommands.back().vertexcount += firstcmd->vertexcount;\n\t\t\t\t++firstcmd;\n\t\t\t}\n\t\t}\n\n\t\t// Append the new draw commands to the list we're building.\n\t\tdrawCommands.insert(drawCommands.end(), firstcmd, newcommands.end());\n\t}\n\n\tvertOffset = voffset + vertices.size();\n\n\ttextData.push_back(t);\n\ttextData.back().textInfo = textinfo;\n\n\t// Font::generateVertices can invalidate the font's texture cache.\n\tif (font->getTextureCacheID() != textureCacheID)\n\t\tregenerateVertices();\n}\n\nvoid TextBatch::set(const std::vector<love::font::ColoredString> &text)\n{\n\treturn set(text, -1.0f, Font::ALIGN_MAX_ENUM);\n}\n\nvoid TextBatch::set(const std::vector<love::font::ColoredString> &text, float wrap, Font::AlignMode align)\n{\n\tif (text.empty() || (text.size() == 1 && text[0].str.empty()))\n\t\treturn clear();\n\n\tlove::font::ColoredCodepoints codepoints;\n\tlove::font::getCodepointsFromString(text, codepoints);\n\n\taddTextData({codepoints, wrap, align, {}, false, false, Matrix4()});\n}\n\nint TextBatch::add(const std::vector<love::font::ColoredString> &text, const Matrix4 &m)\n{\n\treturn addf(text, -1.0f, Font::ALIGN_MAX_ENUM, m);\n}\n\nint TextBatch::addf(const std::vector<love::font::ColoredString> &text, float wrap, Font::AlignMode align, const Matrix4 &m)\n{\n\tlove::font::ColoredCodepoints codepoints;\n\tlove::font::getCodepointsFromString(text, codepoints);\n\n\taddTextData({codepoints, wrap, align, {}, true, true, m});\n\n\treturn (int) textData.size() - 1;\n}\n\nvoid TextBatch::clear()\n{\n\ttextData.clear();\n\tdrawCommands.clear();\n\ttextureCacheID = font->getTextureCacheID();\n\tvertOffset = 0;\n}\n\nvoid TextBatch::setFont(Font *f)\n{\n\tfont.set(f);\n\t\n\t// Invalidate the texture cache ID since the font is different. We also have\n\t// to re-upload all the vertices based on the new font's textures.\n\ttextureCacheID = (uint32) -1;\n\tvertexAttributesID = font->getVertexAttributesID();\n\tregenerateVertices();\n}\n\nFont *TextBatch::getFont() const\n{\n\treturn font.get();\n}\n\nint TextBatch::getWidth(int index) const\n{\n\tif (index < 0)\n\t\tindex = std::max((int) textData.size() - 1, 0);\n\n\tif (index >= (int) textData.size())\n\t\treturn 0;\n\n\treturn textData[index].textInfo.width;\n}\n\nint TextBatch::getHeight(int index) const\n{\n\tif (index < 0)\n\t\tindex = std::max((int) textData.size() - 1, 0);\n\n\tif (index >= (int) textData.size())\n\t\treturn 0;\n\n\treturn textData[index].textInfo.height;\n}\n\nvoid TextBatch::draw(Graphics *gfx, const Matrix4 &m)\n{\n\tif (vertexBuffer == nullptr || vertexData == nullptr || drawCommands.empty())\n\t\treturn;\n\n\tgfx->flushBatchedDraws();\n\n\t// Re-generate the text if the Font's texture cache was invalidated.\n\tif (font->getTextureCacheID() != textureCacheID)\n\t\tregenerateVertices();\n\n\tif (Shader::isDefaultActive())\n\t\tShader::attachDefault(Shader::STANDARD_DEFAULT);\n\n\tTexture *firsttex = nullptr;\n\tif (!drawCommands.empty())\n\t\tfirsttex = drawCommands[0].texture;\n\n\tif (Shader::current)\n\t\tShader::current->validateDrawState(PRIMITIVE_TRIANGLES, firsttex);\n\n\tint totalverts = 0;\n\tfor (const Font::DrawCommand &cmd : drawCommands)\n\t\ttotalverts = std::max(cmd.startvertex + cmd.vertexcount, totalverts);\n\n\t// Make sure all pending data is uploaded to the GPU.\n\tif (modifiedVertices.isValid())\n\t{\n\t\tsize_t offset = modifiedVertices.getOffset();\n\t\tsize_t size = modifiedVertices.getSize();\n\n\t\tif (vertexBuffer->getDataUsage() == BUFFERDATAUSAGE_STREAM)\n\t\t\tvertexBuffer->fill(0, vertexBuffer->getSize(), vertexData);\n\t\telse\n\t\t\tvertexBuffer->fill(offset, size, vertexData + offset);\n\n\t\tmodifiedVertices.invalidate();\n\t}\n\n\tGraphics::TempTransform transform(gfx, m);\n\n\tfor (const Font::DrawCommand &cmd : drawCommands)\n\t{\n\t\tTexture *tex = gfx->getTextureOrDefaultForActiveShader(cmd.texture);\n\t\tgfx->drawQuads(cmd.startvertex / 4, cmd.vertexcount / 4, vertexAttributesID, vertexBuffers, tex);\n\t}\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/TextBatch.h",
    "content": "/**\n* Copyright (c) 2006-2026 LOVE Development Team\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n*\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n*\n* 1. The origin of this software must not be misrepresented; you must not\n*    claim that you wrote the original software. If you use this software\n*    in a product, an acknowledgment in the product documentation would be\n*    appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n*    misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n**/\n\n#pragma once\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/Range.h\"\n#include \"Drawable.h\"\n#include \"Font.h\"\n#include \"Buffer.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nclass Graphics;\n\nclass TextBatch : public Drawable\n{\npublic:\n\n\tstatic love::Type type;\n\n\tTextBatch(Font *font, const std::vector<love::font::ColoredString> &text = {});\n\tvirtual ~TextBatch();\n\n\tvoid set(const std::vector<love::font::ColoredString> &text);\n\tvoid set(const std::vector<love::font::ColoredString> &text, float wrap, Font::AlignMode align);\n\n\tint add(const std::vector<love::font::ColoredString> &text, const Matrix4 &m);\n\tint addf(const std::vector<love::font::ColoredString> &text, float wrap, Font::AlignMode align, const Matrix4 &m);\n\n\tvoid clear();\n\n\tvoid setFont(Font *f);\n\tFont *getFont() const;\n\n\t/**\n\t * Gets the width of the currently set text.\n\t **/\n\tint getWidth(int index = 0) const;\n\n\t/**\n\t * Gets the height of the currently set text.\n\t **/\n\tint getHeight(int index = 0) const;\n\n\t// Implements Drawable.\n\tvoid draw(love::graphics::Graphics *gfx, const Matrix4 &m) override;\n\nprivate:\n\n\tstruct TextData\n\t{\n\t\tlove::font::ColoredCodepoints codepoints;\n\t\tfloat wrap;\n\t\tFont::AlignMode align;\n\t\tlove::font::TextShaper::TextInfo textInfo;\n\t\tbool useMatrix;\n\t\tbool appendVertices;\n\t\tMatrix4 matrix;\n\t};\n\n\tvoid uploadVertices(const std::vector<Font::GlyphVertex> &vertices, size_t vertoffset);\n\tvoid regenerateVertices();\n\tvoid addTextData(const TextData &s);\n\n\tStrongRef<Font> font;\n\n\tVertexAttributesID vertexAttributesID;\n\tBufferBindings vertexBuffers;\n\n\tStrongRef<Buffer> vertexBuffer;\n\tuint8 *vertexData;\n\tRange modifiedVertices;\n\n\tstd::vector<Font::DrawCommand> drawCommands;\n\n\tstd::vector<TextData> textData;\n\n\tsize_t vertOffset;\n\t\n\t// Used so we know when the font's texture cache is invalidated.\n\tuint32 textureCacheID;\n\t\n}; // Text\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/Texture.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"common/config.h\"\n#include \"Texture.h\"\n#include \"Graphics.h\"\n\n// C\n#include <cmath>\n#include <algorithm>\n\n\nnamespace love\n{\nnamespace graphics\n{\n\nuint64 SamplerState::toKey() const\n{\n\tunion { float f; uint32 i; } conv;\n\tconv.f = lodBias;\n\n\tconst uint32 BITS_4 = 0xF;\n\n\treturn (minFilter << 0) | (magFilter << 1) | (mipmapFilter << 2)\n\t     | (wrapU << 4) | (wrapV << 7) | (wrapW << 10)\n\t     | (maxAnisotropy << 13) | ((BITS_4 & minLod) << 17) | ((BITS_4 & maxLod) << 21)\n\t     | (depthSampleMode.hasValue << 25) | (depthSampleMode.value << 26)\n\t     | ((uint64)conv.i << 32);\n}\n\nSamplerState SamplerState::fromKey(uint64 key)\n{\n\tconst uint32 BITS_1 = 0x1;\n\tconst uint32 BITS_2 = 0x3;\n\tconst uint32 BITS_3 = 0x7;\n\tconst uint32 BITS_4 = 0xF;\n\n\tSamplerState s;\n\n\ts.minFilter = (FilterMode) ((key >> 0) & BITS_1);\n\ts.magFilter = (FilterMode) ((key >> 1) & BITS_1);\n\ts.mipmapFilter = (MipmapFilterMode) ((key >> 2) & BITS_2);\n\n\ts.wrapU = (WrapMode) ((key >> 4 ) & BITS_3);\n\ts.wrapV = (WrapMode) ((key >> 7 ) & BITS_3);\n\ts.wrapW = (WrapMode) ((key >> 10) & BITS_3);\n\n\ts.maxAnisotropy = (key >> 13) & BITS_4;\n\n\ts.minLod = (key >> 17) & BITS_4;\n\ts.maxLod = (key >> 21) & BITS_4;\n\n\ts.depthSampleMode.hasValue = ((key >> 25) & BITS_1) != 0;\n\ts.depthSampleMode.value = (CompareMode) ((key >> 26) & BITS_4);\n\n\tunion { float f; uint32 i; } conv;\n\tconv.i = (uint32) (key >> 32);\n\ts.lodBias = conv.f;\n\n\treturn s;\n}\n\nbool SamplerState::isClampZeroOrOne(WrapMode w)\n{\n\treturn w == WRAP_CLAMP_ONE || w == WRAP_CLAMP_ZERO;\n}\n\nstatic StringMap<SamplerState::FilterMode, SamplerState::FILTER_MAX_ENUM>::Entry filterModeEntries[] =\n{\n\t{ \"linear\",  SamplerState::FILTER_LINEAR  },\n\t{ \"nearest\", SamplerState::FILTER_NEAREST },\n};\n\nstatic StringMap<SamplerState::FilterMode, SamplerState::FILTER_MAX_ENUM> filterModes(filterModeEntries, sizeof(filterModeEntries));\n\nstatic StringMap<SamplerState::MipmapFilterMode, SamplerState::MIPMAP_FILTER_MAX_ENUM>::Entry mipmapFilterModeEntries[] =\n{\n\t{ \"none\",    SamplerState::MIPMAP_FILTER_NONE    },\n\t{ \"linear\",  SamplerState::MIPMAP_FILTER_LINEAR  },\n\t{ \"nearest\", SamplerState::MIPMAP_FILTER_NEAREST },\n};\n\nstatic StringMap<SamplerState::MipmapFilterMode, SamplerState::MIPMAP_FILTER_MAX_ENUM> mipmapFilterModes(mipmapFilterModeEntries, sizeof(mipmapFilterModeEntries));\n\nstatic StringMap<SamplerState::WrapMode, SamplerState::WRAP_MAX_ENUM>::Entry wrapModeEntries[] =\n{\n\t{ \"clamp\",          SamplerState::WRAP_CLAMP           },\n\t{ \"clampzero\",      SamplerState::WRAP_CLAMP_ZERO      },\n\t{ \"clampone\",       SamplerState::WRAP_CLAMP_ONE       },\n\t{ \"repeat\",         SamplerState::WRAP_REPEAT          },\n\t{ \"mirroredrepeat\", SamplerState::WRAP_MIRRORED_REPEAT },\n};\n\nstatic StringMap<SamplerState::WrapMode, SamplerState::WRAP_MAX_ENUM> wrapModes(wrapModeEntries, sizeof(wrapModeEntries));\n\nbool SamplerState::getConstant(const char *in, FilterMode &out)\n{\n\treturn filterModes.find(in, out);\n}\n\nbool SamplerState::getConstant(FilterMode in, const char *&out)\n{\n\treturn filterModes.find(in, out);\n}\n\nstd::vector<std::string> SamplerState::getConstants(FilterMode)\n{\n\treturn filterModes.getNames();\n}\n\nbool SamplerState::getConstant(const char *in, MipmapFilterMode &out)\n{\n\treturn mipmapFilterModes.find(in, out);\n}\n\nbool SamplerState::getConstant(MipmapFilterMode in, const char *&out)\n{\n\treturn mipmapFilterModes.find(in, out);\n}\n\nstd::vector<std::string> SamplerState::getConstants(MipmapFilterMode)\n{\n\treturn mipmapFilterModes.getNames();\n}\n\nbool SamplerState::getConstant(const char *in, WrapMode &out)\n{\n\treturn wrapModes.find(in, out);\n}\n\nbool SamplerState::getConstant(WrapMode in, const char *&out)\n{\n\treturn wrapModes.find(in, out);\n}\n\nstd::vector<std::string> SamplerState::getConstants(WrapMode)\n{\n\treturn wrapModes.getNames();\n}\n\nlove::Type Texture::type(\"Texture\", &Drawable::type);\nint Texture::textureCount = 0;\nint64 Texture::totalGraphicsMemory = 0;\n\nTexture::Texture(Graphics *gfx, const Settings &settings, const Slices *slices)\n\t: texType(settings.type)\n\t, format(settings.format)\n\t, renderTarget(settings.renderTarget)\n\t, computeWrite(settings.computeWrite)\n\t, readable(true)\n\t, viewFormats(settings.viewFormats)\n\t, mipmapsMode(settings.mipmaps)\n\t, width(settings.width)\n\t, height(settings.height)\n\t, depth(settings.type == TEXTURE_VOLUME ? settings.layers : 1)\n\t, layers(settings.type == TEXTURE_2D_ARRAY ? settings.layers : 1)\n\t, mipmapCount(1)\n\t, pixelWidth(0)\n\t, pixelHeight(0)\n\t, requestedMSAA(settings.msaa > 1 ? settings.msaa : 0)\n\t, samplerState()\n\t, graphicsMemorySize(0)\n\t, debugName(settings.debugName)\n\t, rootView({this, 0, 0})\n\t, parentView({this, 0, 0})\n{\n\tconst auto &caps = gfx->getCapabilities();\n\tint requestedMipmapCount = settings.mipmapCount;\n\n\tif (slices != nullptr && slices->getMipmapCount() > 0 && slices->getSliceCount() > 0)\n\t{\n\t\ttexType = slices->getTextureType();\n\n\t\tif (requestedMSAA > 1)\n\t\t\tthrow love::Exception(\"MSAA textures cannot be created from image data.\");\n\n\t\tint dataMipmaps = 1;\n\t\tif (slices->validate() && slices->getMipmapCount() > 1)\n\t\t{\n\t\t\tdataMipmaps = slices->getMipmapCount();\n\n\t\t\tif (requestedMipmapCount > 0)\n\t\t\t\trequestedMipmapCount = std::min(requestedMipmapCount, dataMipmaps);\n\t\t\telse\n\t\t\t\trequestedMipmapCount = dataMipmaps;\n\t\t}\n\n\t\tlove::image::ImageDataBase *slice = slices->get(0, 0);\n\n\t\tformat = slice->getFormat();\n\t\tif (isGammaCorrect() && !slice->isLinear())\n\t\t\tformat = getSRGBPixelFormat(format);\n\n\t\tpixelWidth = slice->getWidth();\n\t\tpixelHeight = slice->getHeight();\n\n\t\tif (texType == TEXTURE_2D_ARRAY)\n\t\t\tlayers = slices->getSliceCount();\n\t\telse if (texType == TEXTURE_VOLUME)\n\t\t\tdepth = slices->getSliceCount();\n\n\t\twidth  = (int) (pixelWidth / settings.dpiScale + 0.5);\n\t\theight = (int) (pixelHeight / settings.dpiScale + 0.5);\n\n\t\tif (isCompressed() && dataMipmaps <= 1)\n\t\t\tmipmapsMode = MIPMAPS_NONE;\n\t}\n\telse\n\t{\n\t\tif (isCompressed())\n\t\t\tthrow love::Exception(\"Compressed textures must be created with initial data.\");\n\n\t\tpixelWidth = (int) ((width * settings.dpiScale) + 0.5);\n\t\tpixelHeight = (int) ((height * settings.dpiScale) + 0.5);\n\t}\n\n\tif (settings.readable.hasValue)\n\t\treadable = settings.readable.value;\n\telse\n\t\treadable = !renderTarget || !isPixelFormatDepthStencil(format);\n\n\tformat = gfx->getSizedFormat(format);\n\tif (!isGammaCorrect() || settings.linear)\n\t\tformat = getLinearPixelFormat(format);\n\n\tif (mipmapsMode == MIPMAPS_AUTO && isCompressed())\n\t\tmipmapsMode = MIPMAPS_MANUAL;\n\n\tif (mipmapsMode != MIPMAPS_NONE)\n\t{\n\t\tint totalMipmapCount = getTotalMipmapCount(pixelWidth, pixelHeight, depth);\n\n\t\tif (requestedMipmapCount > 0)\n\t\t\tmipmapCount = std::min(totalMipmapCount, requestedMipmapCount);\n\t\telse\n\t\t\tmipmapCount = totalMipmapCount;\n\t}\n\n\tconst char *miperr = nullptr;\n\tif (mipmapsMode == MIPMAPS_AUTO && !supportsGenerateMipmaps(miperr))\n\t{\n\t\tconst char *fstr = \"unknown\";\n\t\tlove::getConstant(format, fstr);\n\t\tthrow love::Exception(\"Automatic mipmap generation is not supported for textures with the %s pixel format.\", fstr);\n\t}\n\n\tif (pixelWidth <= 0 || pixelHeight <= 0 || layers <= 0 || depth <= 0)\n\t\tthrow love::Exception(\"Texture dimensions must be greater than 0.\");\n\n\tif (texType != TEXTURE_2D && requestedMSAA > 1)\n\t\tthrow love::Exception(\"MSAA is only supported for textures with the 2D texture type.\");\n\n\tif (!renderTarget && requestedMSAA > 1)\n\t\tthrow love::Exception(\"MSAA is only supported with render target textures.\");\n\n\tif (readable && isPixelFormatDepthStencil(format) && settings.msaa > 1)\n\t\tthrow love::Exception(\"Readable depth/stencil textures with MSAA are not currently supported.\");\n\n\tif ((!readable || settings.msaa > 1) && mipmapsMode != MIPMAPS_NONE)\n\t\tthrow love::Exception(\"Non-readable and MSAA textures cannot have mipmaps.\");\n\n\tif (!readable && texType != TEXTURE_2D)\n\t\tthrow love::Exception(\"Non-readable pixel formats are only supported for 2D texture types.\");\n\n\tif (isCompressed() && renderTarget)\n\t\tthrow love::Exception(\"Compressed textures cannot be render targets.\");\n\n\tif (isPixelFormatDepthStencil(format) && !renderTarget)\n\t\tthrow love::Exception(\"Depth or stencil pixel formats are only supported with render target textures.\");\n\n\tif (isPixelFormatDepthStencil(format) && texType == TEXTURE_VOLUME)\n\t\tthrow love::Exception(\"Volume texture types are not supported with depth or stencil pixel formats.\");\n\n\tfor (PixelFormat viewformat : viewFormats)\n\t{\n\t\tif (getLinearPixelFormat(viewformat) == getLinearPixelFormat(format))\n\t\t\tcontinue;\n\n\t\tif (isPixelFormatCompressed(format) || isPixelFormatCompressed(viewformat))\n\t\t\tthrow love::Exception(\"Compressed textures cannot use different pixel formats for texture views, aside from sRGB versus linear variants of the same pixel format.\");\n\n\t\tif (isPixelFormatColor(viewformat) != isPixelFormatColor(format))\n\t\t\tthrow love::Exception(\"Color-format textures cannot use depth/stencil pixel formats and vice versa, in texture views.\");\n\n\t\t// TODO: depth[24|32f]_stencil8 -> stencil8 can work.\n\t\tif (isPixelFormatDepthStencil(viewformat))\n\t\t\tthrow love::Exception(\"Using different pixel formats for texture views is not currently supported for depth or stencil formats.\");\n\n\t\tsize_t viewbytes = getPixelFormatBlockSize(viewformat);\n\t\tsize_t basebytes = getPixelFormatBlockSize(format);\n\n\t\tif (viewbytes != basebytes)\n\t\t\tthrow love::Exception(\"Texture view pixel formats must have the same bits per pixel as the base texture's pixel format.\");\n\t}\n\n\tvalidatePixelFormat(gfx);\n\n\tif (!caps.textureTypes[texType])\n\t{\n\t\tconst char *textypestr = \"unknown\";\n\t\tTexture::getConstant(texType, textypestr);\n\t\tthrow love::Exception(\"%s textures are not supported on this system.\", textypestr);\n\t}\n\n\tvalidateDimensions(true);\n\n\tsamplerState = gfx->getDefaultSamplerState();\n\n\tif (getMipmapCount() == 1)\n\t\tsamplerState.mipmapFilter = SamplerState::MIPMAP_FILTER_NONE;\n\n\tQuad::Viewport v = {0, 0, (double) width, (double) height};\n\tquad.set(new Quad(v, width, height), Acquire::NORETAIN);\n\n\t++textureCount;\n}\n\nTexture::Texture(Graphics *gfx, Texture *base, const ViewSettings &viewsettings)\n\t: texType(viewsettings.type.get(base->getTextureType()))\n\t, format(viewsettings.format.get(base->getPixelFormat()))\n\t, renderTarget(base->renderTarget)\n\t, computeWrite(base->computeWrite)\n\t, readable(base->readable)\n\t, viewFormats(base->viewFormats)\n\t, mipmapsMode(base->mipmapsMode)\n\t, width(1)\n\t, height(1)\n\t, depth(1)\n\t, layers(1)\n\t, mipmapCount(1)\n\t, pixelWidth(1)\n\t, pixelHeight(1)\n\t, requestedMSAA(base->requestedMSAA)\n\t, samplerState(base->samplerState)\n\t, quad(base->quad)\n\t, graphicsMemorySize(0)\n\t, debugName(viewsettings.debugName)\n\t, rootView({base->rootView.texture, 0, 0})\n\t, parentView({base, viewsettings.mipmapStart.get(0), viewsettings.layerStart.get(0)})\n{\n\twidth = base->getWidth(parentView.startMipmap);\n\theight = base->getHeight(parentView.startMipmap);\n\n\tif (texType == TEXTURE_VOLUME)\n\t\tdepth = base->getDepth(parentView.startMipmap);\n\n\tif (texType == TEXTURE_2D_ARRAY)\n\t{\n\t\tint baselayers = base->getTextureType() == TEXTURE_CUBE ? 6 : base->getLayerCount();\n\t\tlayers = viewsettings.layerCount.get(baselayers - parentView.startLayer);\n\t}\n\n\tmipmapCount = viewsettings.mipmapCount.get(base->getMipmapCount() - parentView.startMipmap);\n\n\tpixelWidth = base->getPixelWidth(parentView.startMipmap);\n\tpixelHeight = base->getPixelHeight(parentView.startMipmap);\n\n\tif (parentView.startMipmap < 0)\n\t\tthrow love::Exception(\"Invalid mipmap start value for texture view (out of range).\");\n\n\tif (mipmapCount < 0 || parentView.startMipmap + mipmapCount > base->getMipmapCount())\n\t\tthrow love::Exception(\"Invalid mipmap start or count value for texture view (out of range).\");\n\n\tif (parentView.startLayer < 0)\n\t\tthrow love::Exception(\"Invalid layer start value for texture view (out of range).\");\n\n\tint baseLayerCount = base->getTextureType() == TEXTURE_CUBE ? 6 : base->getLayerCount();\n\tif (layers < 0 || parentView.startLayer + layers > baseLayerCount)\n\t\tthrow love::Exception(\"Invalid layer start or count value for texture view (out of range).\");\n\n\tif (texType == TEXTURE_CUBE && parentView.startLayer + 6 > baseLayerCount)\n\t\tthrow love::Exception(\"Cube texture view cannot fit in the base texture's layers with the given start layer.\");\n\n\tViewInfo nextView = { this, 0, 0 };\n\twhile (nextView.texture != rootView.texture)\n\t{\n\t\tnextView = nextView.texture->parentView;\n\t\trootView.startMipmap += nextView.startMipmap;\n\t\trootView.startLayer += nextView.startLayer;\n\t}\n\n\tconst auto &caps = gfx->getCapabilities();\n\tif (!caps.features[Graphics::FEATURE_GLSL4])\n\t\tthrow love::Exception(\"Texture views are not supported on this system (GLSL 4 support is necessary.)\");\n\n\tvalidatePixelFormat(gfx);\n\n\tif (!caps.textureTypes[texType])\n\t{\n\t\tconst char *textypestr = \"unknown\";\n\t\tTexture::getConstant(texType, textypestr);\n\t\tthrow love::Exception(\"%s textures are not supported on this system.\", textypestr);\n\t}\n\n\tif (!readable)\n\t\tthrow love::Exception(\"Texture views are not supported for non-readable textures.\");\n\n\tif (base->getTextureType() == TEXTURE_2D)\n\t{\n\t\tif (texType != TEXTURE_2D && texType != TEXTURE_2D_ARRAY)\n\t\t\tthrow love::Exception(\"Texture views created from a 2D texture must use the 2d or array texture type.\");\n\t}\n\telse if (base->getTextureType() == TEXTURE_2D_ARRAY || base->getTextureType() == TEXTURE_CUBE)\n\t{\n\t\tif (texType != TEXTURE_2D && texType != TEXTURE_2D_ARRAY && texType != TEXTURE_CUBE)\n\t\t\tthrow love::Exception(\"Texture views created from an array or cube texture must use the 2d, array, or cube texture type.\");\n\t}\n\telse if (base->getTextureType() == TEXTURE_VOLUME)\n\t{\n\t\tif (texType != TEXTURE_VOLUME)\n\t\t\tthrow love::Exception(\"Texture views created from a volume texture must use the volume texture type.\");\n\t}\n\telse\n\t{\n\t\tthrow love::Exception(\"Unknown texture type.\");\n\t}\n\n\tif (format != base->getPixelFormat())\n\t{\n\t\tif (std::find(viewFormats.begin(), viewFormats.end(), format) == viewFormats.end())\n\t\t\tthrow love::Exception(\"Using a different pixel format in a texture view requires the original texture to be created with a 'viewformats' setting that includes the given format in its list.\");\n\t}\n\n\tconst char *miperr = nullptr;\n\tif (mipmapsMode == MIPMAPS_AUTO && !supportsGenerateMipmaps(miperr))\n\t\tmipmapsMode = MIPMAPS_MANUAL;\n\n\trootView.texture->retain();\n\tparentView.texture->retain();\n}\n\nTexture::~Texture()\n{\n\tupdateGraphicsMemorySize(false);\n\n\tif (this == rootView.texture)\n\t\t--textureCount;\n\n\tif (rootView.texture != this && rootView.texture != nullptr)\n\t\trootView.texture->release();\n\tif (parentView.texture != this && parentView.texture != nullptr)\n\t\tparentView.texture->release();\n}\n\nvoid Texture::updateGraphicsMemorySize(bool loaded)\n{\n\tint64 memsize = 0;\n\n\tif (loaded)\n\t{\n\t\tfor (int mip = 0; mip < getMipmapCount(); mip++)\n\t\t{\n\t\t\tint w = getPixelWidth(mip);\n\t\t\tint h = getPixelHeight(mip);\n\t\t\tint slices = getDepth(mip) * layers * (texType == TEXTURE_CUBE ? 6 : 1);\n\t\t\tmemsize += getPixelFormatSliceSize(format, w, h) * slices;\n\t\t}\n\n\t\tif (getMSAA() > 1 && isReadable())\n\t\t{\n\t\t\tint slices = depth * layers * (texType == TEXTURE_CUBE ? 6 : 1);\n\t\t\tmemsize += getPixelFormatSliceSize(format, pixelWidth, pixelHeight) * slices * getMSAA();\n\t\t}\n\t\telse if (getMSAA() > 1)\n\t\t\tmemsize *= getMSAA();\n\t}\n\n\ttotalGraphicsMemory = std::max(totalGraphicsMemory - graphicsMemorySize, (int64) 0);\n\n\tmemsize = std::max(memsize, (int64) 0);\n\tgraphicsMemorySize = memsize;\n\ttotalGraphicsMemory += memsize;\n}\n\nvoid Texture::draw(Graphics *gfx, const Matrix4 &m)\n{\n\tdraw(gfx, quad, m);\n}\n\nvoid Texture::draw(Graphics *gfx, Quad *q, const Matrix4 &localTransform)\n{\n\tif (texType == TEXTURE_2D_ARRAY)\n\t{\n\t\tdrawLayer(gfx, q->getLayer(), q, localTransform);\n\t\treturn;\n\t}\n\n\tif (!readable)\n\t\tthrow love::Exception(\"Textures with non-readable formats cannot be drawn.\");\n\n\tif (renderTarget && gfx->isRenderTargetActive(this))\n\t\tthrow love::Exception(\"Cannot render a Texture to itself.\");\n\n\tconst Matrix4 &tm = gfx->getTransform();\n\tbool is2D = tm.isAffine2DTransform();\n\n\tGraphics::BatchedDrawCommand cmd;\n\tcmd.formats[0] = getSinglePositionFormat(is2D);\n\tcmd.formats[1] = CommonFormat::STf_RGBAub;\n\tcmd.indexMode = TRIANGLEINDEX_QUADS;\n\tcmd.vertexCount = 4;\n\tcmd.texture = this;\n\n\tGraphics::BatchedVertexData data = gfx->requestBatchedDraw(cmd);\n\n\tMatrix4 t(tm, localTransform);\n\n\tif (is2D)\n\t\tt.transformXY((Vector2 *) data.stream[0], q->getVertexPositions(), 4);\n\telse\n\t\tt.transformXY0((Vector3 *) data.stream[0], q->getVertexPositions(), 4);\n\n\tconst Vector2 *texcoords = q->getVertexTexCoords();\n\tSTf_RGBAub *vertexdata = (STf_RGBAub *) data.stream[1];\n\n\tColor32 c = toColor32(gfx->getColor());\n\n\tfor (int i = 0; i < 4; i++)\n\t{\n\t\tvertexdata[i].s = texcoords[i].x;\n\t\tvertexdata[i].t = texcoords[i].y;\n\t\tvertexdata[i].color = c;\n\t}\n}\n\nvoid Texture::drawLayer(Graphics *gfx, int layer, const Matrix4 &m)\n{\n\tdrawLayer(gfx, layer, quad, m);\n}\n\nvoid Texture::drawLayer(Graphics *gfx, int layer, Quad *q, const Matrix4 &m)\n{\n\tif (!readable)\n\t\tthrow love::Exception(\"Textures with non-readable formats cannot be drawn.\");\n\n\tif (renderTarget && gfx->isRenderTargetActive(this, layer))\n\t\tthrow love::Exception(\"Cannot render a Texture to itself.\");\n\n\tif (texType != TEXTURE_2D_ARRAY)\n\t\tthrow love::Exception(\"drawLayer can only be used with Array Textures.\");\n\n\tif (layer < 0 || layer >= layers)\n\t\tthrow love::Exception(\"Invalid layer: %d (Texture has %d layers)\", layer + 1, layers);\n\n\tColor32 c = toColor32(gfx->getColor());\n\n\tconst Matrix4 &tm = gfx->getTransform();\n\tbool is2D = tm.isAffine2DTransform();\n\n\tMatrix4 t(tm, m);\n\n\tGraphics::BatchedDrawCommand cmd;\n\tcmd.formats[0] = getSinglePositionFormat(is2D);\n\tcmd.formats[1] = CommonFormat::STPf_RGBAub;\n\tcmd.indexMode = TRIANGLEINDEX_QUADS;\n\tcmd.vertexCount = 4;\n\tcmd.texture = this;\n\tcmd.standardShaderType = Shader::STANDARD_ARRAY;\n\n\tGraphics::BatchedVertexData data = gfx->requestBatchedDraw(cmd);\n\n\tif (is2D)\n\t\tt.transformXY((Vector2 *) data.stream[0], q->getVertexPositions(), 4);\n\telse\n\t\tt.transformXY0((Vector3 *) data.stream[0], q->getVertexPositions(), 4);\n\n\tconst Vector2 *texcoords = q->getVertexTexCoords();\n\tSTPf_RGBAub *vertexdata = (STPf_RGBAub *) data.stream[1];\n\n\tfor (int i = 0; i < 4; i++)\n\t{\n\t\tvertexdata[i].s = texcoords[i].x;\n\t\tvertexdata[i].t = texcoords[i].y;\n\t\tvertexdata[i].p = (float) layer;\n\t\tvertexdata[i].color = c;\n\t}\n}\n\nvoid Texture::uploadImageData(love::image::ImageDataBase *d, int level, int slice, int x, int y)\n{\n\tRect rect = {x, y, d->getWidth(), d->getHeight()};\n\tuploadByteData(d->getData(), d->getSize(), level, slice, rect);\n}\n\nvoid Texture::replacePixels(love::image::ImageDataBase *d, int slice, int mipmap, int x, int y, bool reloadmipmaps)\n{\n\tif (!isReadable())\n\t\tthrow love::Exception(\"replacePixels can only be called on readable Textures.\");\n\n\tif (getMSAA() > 1)\n\t\tthrow love::Exception(\"replacePixels cannot be called on a MSAA Texture.\");\n\n\tif (isPixelFormatDepthStencil(format))\n\t\tthrow love::Exception(\"replacePixels cannot be called on depth or stencil Textures.\");\n\n\tauto gfx = Module::getInstance<Graphics>(Module::M_GRAPHICS);\n\tif (gfx != nullptr && gfx->isRenderTargetActive(this))\n\t\tthrow love::Exception(\"replacePixels cannot be called on this Texture while it's an active render target.\");\n\n\t// No effect if the texture hasn't been created yet.\n\tif (getHandle() == 0)\n\t\treturn;\n\n\t// ImageData format might be linear but intended to be used as sRGB, so we\n\t// don't error if only the sRGBness is different.\n\tif (getLinearPixelFormat(d->getFormat()) != getLinearPixelFormat(getPixelFormat()))\n\t\tthrow love::Exception(\"Pixel formats must match.\");\n\n\tif (mipmap < 0 || mipmap >= getMipmapCount())\n\t\tthrow love::Exception(\"Invalid texture mipmap index %d.\", mipmap + 1);\n\n\tif (slice < 0 || (texType == TEXTURE_CUBE && slice >= 6)\n\t\t|| (texType == TEXTURE_VOLUME && slice >= getDepth(mipmap))\n\t\t|| (texType == TEXTURE_2D_ARRAY && slice >= getLayerCount()))\n\t{\n\t\tthrow love::Exception(\"Invalid texture slice index %d.\", slice + 1);\n\t}\n\n\tRect rect = {x, y, d->getWidth(), d->getHeight()};\n\n\tint mipw = getPixelWidth(mipmap);\n\tint miph = getPixelHeight(mipmap);\n\n\tif (rect.x < 0 || rect.y < 0 || rect.w <= 0 || rect.h <= 0\n\t\t|| (rect.x + rect.w) > mipw || (rect.y + rect.h) > miph)\n\t{\n\t\tthrow love::Exception(\"Invalid rectangle dimensions (x=%d, y=%d, w=%d, h=%d) for %dx%d Texture.\", rect.x, rect.y, rect.w, rect.h, mipw, miph);\n\t}\n\n\tif (isPixelFormatCompressed(d->getFormat()) && (rect.x != 0 || rect.y != 0 || rect.w != mipw || rect.h != miph))\n\t{\n\t\tconst PixelFormatInfo &info = getPixelFormatInfo(d->getFormat());\n\t\tint bw = (int) info.blockWidth;\n\t\tint bh = (int) info.blockHeight;\n\t\tif (rect.x % bw != 0 || rect.y % bh != 0 || rect.w % bw != 0 || rect.h % bh != 0)\n\t\t{\n\t\t\tconst char *name = nullptr;\n\t\t\tlove::getConstant(d->getFormat(), name);\n\t\t\tthrow love::Exception(\"Compressed texture format %s only supports replacing a sub-rectangle with offset and dimensions that are a multiple of %d x %d.\", name, bw, bh);\n\t\t}\n\t}\n\n\tGraphics::flushBatchedDrawsGlobal();\n\n\tuploadImageData(d, mipmap, slice, x, y);\n\n\tif (reloadmipmaps && mipmap == 0 && getMipmapCount() > 1)\n\t\tgenerateMipmaps();\n}\n\nvoid Texture::replacePixels(const void *data, size_t size, int slice, int mipmap, const Rect &rect, bool reloadmipmaps)\n{\n\tif (!isReadable() || getMSAA() > 1)\n\t\treturn;\n\n\tauto gfx = Module::getInstance<Graphics>(Module::M_GRAPHICS);\n\tif (gfx != nullptr && gfx->isRenderTargetActive(this))\n\t\treturn;\n\n\tGraphics::flushBatchedDrawsGlobal();\n\n\tuploadByteData(data, size, mipmap, slice, rect);\n\n\tif (reloadmipmaps && mipmap == 0 && getMipmapCount() > 1)\n\t\tgenerateMipmaps();\n}\n\nbool Texture::supportsGenerateMipmaps(const char *&outReason) const\n{\n\tif (getMipmapsMode() == MIPMAPS_NONE)\n\t{\n\t\toutReason = \"generateMipmaps can only be called on a Texture which was created with mipmaps enabled.\";\n\t\treturn false;\n\t}\n\n\tif (isPixelFormatCompressed(format))\n\t{\n\t\toutReason = \"generateMipmaps cannot be called on a compressed Texture.\";\n\t\treturn false;\n\t}\n\n\tif (isPixelFormatDepthStencil(format))\n\t{\n\t\toutReason = \"generateMipmaps cannot be called on a depth/stencil Texture.\";\n\t\treturn false;\n\t}\n\n\tif (isPixelFormatInteger(format))\n\t{\n\t\toutReason = \"generateMipmaps cannot be called on an integer Texture.\";\n\t\treturn false;\n\t}\n\n\t// This should be linear | rt because that's what metal needs, but the above\n\t// code handles textures can't be used as RTs in metal.\n\tauto gfx = Module::getInstance<Graphics>(Module::M_GRAPHICS);\n\tif (gfx != nullptr && !gfx->isPixelFormatSupported(format, PIXELFORMATUSAGEFLAGS_LINEAR))\n\t{\n\t\toutReason = \"generateMipmaps cannot be called on textures with formats that don't support linear filtering on this system.\";\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nvoid Texture::generateMipmaps()\n{\n\tconst char *err = nullptr;\n\tif (!supportsGenerateMipmaps(err))\n\t\tthrow love::Exception(\"%s\", err);\n\n\tauto gfx = Module::getInstance<Graphics>(Module::M_GRAPHICS);\n\tif (gfx != nullptr && gfx->isRenderTargetActive(this))\n\t\tthrow love::Exception(\"generateMipmaps cannot be called on this Texture while it's an active render target.\");\n\n\tgenerateMipmapsInternal();\n}\n\nbool Texture::isCompressed() const\n{\n\treturn isPixelFormatCompressed(format);\n}\n\nbool Texture::isFormatLinear() const\n{\n\treturn isGammaCorrect() && !isPixelFormatSRGB(format);\n}\n\nbool Texture::isValidSlice(int slice, int mip) const\n{\n\treturn slice >= 0 && slice < getSliceCount(mip);\n}\n\nint Texture::getSliceCount(int mip) const\n{\n\tif (texType == TEXTURE_2D)\n\t\treturn 1;\n\telse if (texType == TEXTURE_CUBE)\n\t\treturn 6;\n\telse if (texType == TEXTURE_2D_ARRAY)\n\t\treturn layers;\n\telse if (texType == TEXTURE_VOLUME)\n\t\treturn getDepth(mip);\n\treturn 1;\n}\n\nint Texture::getWidth(int mip) const\n{\n\treturn std::max(width >> mip, 1);\n}\n\nint Texture::getHeight(int mip) const\n{\n\treturn std::max(height >> mip, 1);\n}\n\nint Texture::getDepth(int mip) const\n{\n\treturn std::max(depth >> mip, 1);\n}\n\nint Texture::getLayerCount() const\n{\n\treturn layers;\n}\n\nint Texture::getMipmapCount() const\n{\n\treturn mipmapCount;\n}\n\nint Texture::getPixelWidth(int mip) const\n{\n\treturn std::max(pixelWidth >> mip, 1);\n}\n\nint Texture::getPixelHeight(int mip) const\n{\n\treturn std::max(pixelHeight >> mip, 1);\n}\n\nfloat Texture::getDPIScale() const\n{\n\treturn (float) pixelHeight / (float) height;\n}\n\nint Texture::getRequestedMSAA() const\n{\n\treturn requestedMSAA;\n}\n\nconst SamplerState &Texture::getSamplerState() const\n{\n\treturn samplerState;\n}\n\nSamplerState Texture::validateSamplerState(SamplerState s) const\n{\n\tif (!readable)\n\t\treturn s;\n\n\tif (s.depthSampleMode.hasValue && !isPixelFormatDepth(format))\n\t\tthrow love::Exception(\"Only depth textures can have a depth sample compare mode.\");\n\n\tif (s.mipmapFilter != SamplerState::MIPMAP_FILTER_NONE && getMipmapCount() == 1)\n\t\ts.mipmapFilter = SamplerState::MIPMAP_FILTER_NONE;\n\n\tif (texType == TEXTURE_CUBE)\n\t\ts.wrapU = s.wrapV = s.wrapW = SamplerState::WRAP_CLAMP;\n\n\tif (s.minFilter == SamplerState::FILTER_LINEAR || s.magFilter == SamplerState::FILTER_LINEAR || s.mipmapFilter == SamplerState::MIPMAP_FILTER_LINEAR)\n\t{\n\t\tauto gfx = Module::getInstance<Graphics>(Module::M_GRAPHICS);\n\t\tif (!gfx->isPixelFormatSupported(format, PIXELFORMATUSAGEFLAGS_LINEAR))\n\t\t{\n\t\t\ts.minFilter = s.magFilter = SamplerState::FILTER_NEAREST;\n\t\t\tif (s.mipmapFilter == SamplerState::MIPMAP_FILTER_LINEAR)\n\t\t\t\ts.mipmapFilter = SamplerState::MIPMAP_FILTER_NEAREST;\n\t\t}\n\t}\n\n\tGraphics::flushBatchedDrawsGlobal();\n\n\treturn s;\n}\n\nQuad *Texture::getQuad() const\n{\n\treturn quad;\n}\n\nint Texture::getTotalMipmapCount(int w, int h)\n{\n\treturn (int) log2(std::max(w, h)) + 1;\n}\n\nint Texture::getTotalMipmapCount(int w, int h, int d)\n{\n\treturn (int) log2(std::max(std::max(w, h), d)) + 1;\n}\n\nbool Texture::validateDimensions(bool throwException) const\n{\n\tbool success = true;\n\n\tauto gfx = Module::getInstance<Graphics>(Module::M_GRAPHICS);\n\tif (gfx == nullptr)\n\t\treturn false;\n\n\tconst Graphics::Capabilities &caps = gfx->getCapabilities();\n\n\tint max2Dsize   = (int) caps.limits[Graphics::LIMIT_TEXTURE_SIZE];\n\tint max3Dsize   = (int) caps.limits[Graphics::LIMIT_VOLUME_TEXTURE_SIZE];\n\tint maxcubesize = (int) caps.limits[Graphics::LIMIT_CUBE_TEXTURE_SIZE];\n\tint maxlayers   = (int) caps.limits[Graphics::LIMIT_TEXTURE_LAYERS];\n\n\tint largestdim = 0;\n\tconst char *largestname = nullptr;\n\n\tif ((texType == TEXTURE_2D || texType == TEXTURE_2D_ARRAY) && (pixelWidth > max2Dsize || pixelHeight > max2Dsize))\n\t{\n\t\tsuccess = false;\n\t\tlargestdim = std::max(pixelWidth, pixelHeight);\n\t\tlargestname = pixelWidth > pixelHeight ? \"pixel width\" : \"pixel height\";\n\t}\n\telse if (texType == TEXTURE_2D_ARRAY && layers > maxlayers)\n\t{\n\t\tsuccess = false;\n\t\tlargestdim = layers;\n\t\tlargestname = \"array layer count\";\n\t}\n\telse if (texType == TEXTURE_CUBE && (pixelWidth > maxcubesize || pixelWidth != pixelHeight))\n\t{\n\t\tsuccess = false;\n\t\tlargestdim = std::max(pixelWidth, pixelHeight);\n\t\tlargestname = pixelWidth > pixelHeight ? \"pixel width\" : \"pixel height\";\n\n\t\tif (throwException && pixelWidth != pixelHeight)\n\t\t\tthrow love::Exception(\"Cubemap textures must have equal width and height.\");\n\t}\n\telse if (texType == TEXTURE_VOLUME && (pixelWidth > max3Dsize || pixelHeight > max3Dsize || depth > max3Dsize))\n\t{\n\t\tsuccess = false;\n\t\tlargestdim = std::max(std::max(pixelWidth, pixelHeight), depth);\n\t\tif (largestdim == pixelWidth)\n\t\t\tlargestname = \"pixel width\";\n\t\telse if (largestdim == pixelHeight)\n\t\t\tlargestname = \"pixel height\";\n\t\telse\n\t\t\tlargestname = \"pixel depth\";\n\t}\n\n\tif (throwException && largestname != nullptr)\n\t\tthrow love::Exception(\"Cannot create texture: %s of %d is too large for this system.\", largestname, largestdim);\n\n\treturn success;\n}\n\nvoid Texture::validatePixelFormat(Graphics *gfx) const\n{\n\tuint32 usage = PIXELFORMATUSAGEFLAGS_NONE;\n\tif (renderTarget)\n\t\tusage |= PIXELFORMATUSAGEFLAGS_RENDERTARGET;\n\tif (readable)\n\t\tusage |= PIXELFORMATUSAGEFLAGS_SAMPLE;\n\tif (computeWrite)\n\t\tusage |= PIXELFORMATUSAGEFLAGS_COMPUTEWRITE;\n\n\tif (!gfx->isPixelFormatSupported(format, (PixelFormatUsageFlags) usage))\n\t{\n\t\tconst char *fstr = \"unknown\";\n\t\tlove::getConstant(format, fstr);\n\n\t\tconst char *readablestr = \"\";\n\t\tif (readable != !isPixelFormatDepthStencil(format))\n\t\t\treadablestr = readable ? \" readable\" : \" non-readable\";\n\n\t\tconst char *rtstr = \"\";\n\t\tif (computeWrite)\n\t\t\trtstr = \" as a compute shader-writable texture\";\n\t\telse if (renderTarget)\n\t\t\trtstr = \" as a render target\";\n\n\t\tthrow love::Exception(\"The %s%s pixel format is not supported%s on this system.\", fstr, readablestr, rtstr);\n\t}\n}\n\nTexture::Slices::Slices(TextureType textype)\n\t: textureType(textype)\n{\n}\n\nvoid Texture::Slices::clear()\n{\n\tdata.clear();\n}\n\nvoid Texture::Slices::set(int slice, int mipmap, love::image::ImageDataBase *d)\n{\n\tif (textureType == TEXTURE_VOLUME)\n\t{\n\t\tif (mipmap >= (int) data.size())\n\t\t\tdata.resize(mipmap + 1);\n\n\t\tif (slice >= (int) data[mipmap].size())\n\t\t\tdata[mipmap].resize(slice + 1);\n\n\t\tdata[mipmap][slice].set(d);\n\t}\n\telse\n\t{\n\t\tif (slice >= (int) data.size())\n\t\t\tdata.resize(slice + 1);\n\n\t\tif (mipmap >= (int) data[slice].size())\n\t\t\tdata[slice].resize(mipmap + 1);\n\n\t\tdata[slice][mipmap].set(d);\n\t}\n}\n\nlove::image::ImageDataBase *Texture::Slices::get(int slice, int mipmap) const\n{\n\tif (slice < 0 || slice >= getSliceCount(mipmap))\n\t\treturn nullptr;\n\n\tif (mipmap < 0 || mipmap >= getMipmapCount(slice))\n\t\treturn nullptr;\n\n\tif (textureType == TEXTURE_VOLUME)\n\t\treturn data[mipmap][slice].get();\n\telse\n\t\treturn data[slice][mipmap].get();\n}\n\nvoid Texture::Slices::add(love::image::CompressedImageData *cdata, int startslice, int startmip, bool addallslices, bool addallmips)\n{\n\tint slicecount = addallslices ? cdata->getSliceCount() : 1;\n\tint mipcount = addallmips ? cdata->getMipmapCount() : 1;\n\n\tfor (int mip = 0; mip < mipcount; mip++)\n\t{\n\t\tfor (int slice = 0; slice < slicecount; slice++)\n\t\t\tset(startslice + slice, startmip + mip, cdata->getSlice(slice, mip));\n\t}\n}\n\nint Texture::Slices::getSliceCount(int mip) const\n{\n\tif (textureType == TEXTURE_VOLUME)\n\t{\n\t\tif (mip < 0 || mip >= (int) data.size())\n\t\t\treturn 0;\n\n\t\treturn (int) data[mip].size();\n\t}\n\telse\n\t\treturn (int) data.size();\n}\n\nint Texture::Slices::getMipmapCount(int slice) const\n{\n\tif (textureType == TEXTURE_VOLUME)\n\t\treturn (int) data.size();\n\telse\n\t{\n\t\tif (slice < 0 || slice >= (int) data.size())\n\t\t\treturn 0;\n\n\t\treturn data[slice].size();\n\t}\n}\n\nbool Texture::Slices::validate() const\n{\n\tint slicecount = getSliceCount();\n\tint mipcount = getMipmapCount(0);\n\n\tif (slicecount == 0 || mipcount == 0)\n\t\tthrow love::Exception(\"At least one ImageData or CompressedImageData is required.\");\n\n\tif (textureType == TEXTURE_CUBE && slicecount != 6)\n\t\tthrow love::Exception(\"Cube textures must have exactly 6 sides.\");\n\n\timage::ImageDataBase *firstdata = get(0, 0);\n\n\tint w = firstdata->getWidth();\n\tint h = firstdata->getHeight();\n\tPixelFormat format = firstdata->getFormat();\n\tbool linear = firstdata->isLinear();\n\n\tif (textureType == TEXTURE_CUBE && w != h)\n\t\tthrow love::Exception(\"Cube textures must have equal widths and heights for each cube face.\");\n\n\tint mipw = w;\n\tint miph = h;\n\tint mipslices = slicecount;\n\n\tfor (int mip = 0; mip < mipcount; mip++)\n\t{\n\t\tif (textureType == TEXTURE_VOLUME)\n\t\t{\n\t\t\tslicecount = getSliceCount(mip);\n\n\t\t\tif (slicecount != mipslices)\n\t\t\t\tthrow love::Exception(\"Invalid number of image data layers in mipmap level %d (expected %d, got %d)\", mip+1, mipslices, slicecount);\n\t\t}\n\n\t\tfor (int slice = 0; slice < slicecount; slice++)\n\t\t{\n\t\t\tauto slicedata = get(slice, mip);\n\n\t\t\tif (slicedata == nullptr)\n\t\t\t\tthrow love::Exception(\"Missing image data (slice %d, mipmap level %d)\", slice+1, mip+1);\n\n\t\t\tint realw = slicedata->getWidth();\n\t\t\tint realh = slicedata->getHeight();\n\n\t\t\tif (getMipmapCount(slice) != mipcount)\n\t\t\t\tthrow love::Exception(\"All texture layers must have the same mipmap count.\");\n\n\t\t\tif (mipw != realw)\n\t\t\t\tthrow love::Exception(\"Width of image data (slice %d, mipmap level %d) is incorrect (expected %d, got %d)\", slice+1, mip+1, mipw, realw);\n\n\t\t\tif (miph != realh)\n\t\t\t\tthrow love::Exception(\"Height of image data (slice %d, mipmap level %d) is incorrect (expected %d, got %d)\", slice+1, mip+1, miph, realh);\n\n\t\t\tif (format != slicedata->getFormat())\n\t\t\t\tthrow love::Exception(\"All texture slices and mipmaps must have the same pixel format.\");\n\n\t\t\tif (linear != slicedata->isLinear())\n\t\t\t\tthrow love::Exception(\"All texture slices and mipmaps must have the same linear setting.\");\n\t\t}\n\n\t\tmipw = std::max(mipw / 2, 1);\n\t\tmiph = std::max(miph / 2, 1);\n\n\t\tif (textureType == TEXTURE_VOLUME)\n\t\t\tmipslices = std::max(mipslices / 2, 1);\n\t}\n\n\treturn true;\n}\n\nstatic StringMap<TextureType, TEXTURE_MAX_ENUM>::Entry texTypeEntries[] =\n{\n\t{ \"2d\",     TEXTURE_2D       },\n\t{ \"volume\", TEXTURE_VOLUME   },\n\t{ \"array\",  TEXTURE_2D_ARRAY },\n\t{ \"cube\",   TEXTURE_CUBE     },\n};\n\nstatic StringMap<TextureType, TEXTURE_MAX_ENUM> texTypes(texTypeEntries, sizeof(texTypeEntries));\n\nstatic StringMap<Texture::MipmapsMode, Texture::MIPMAPS_MAX_ENUM>::Entry mipmapEntries[] =\n{\n\t{ \"none\",   Texture::MIPMAPS_NONE   },\n\t{ \"manual\", Texture::MIPMAPS_MANUAL },\n\t{ \"auto\",   Texture::MIPMAPS_AUTO   },\n};\n\nstatic StringMap<Texture::MipmapsMode, Texture::MIPMAPS_MAX_ENUM> mipmapModes(mipmapEntries, sizeof(mipmapEntries));\n\nstatic StringMap<Texture::SettingType, Texture::SETTING_MAX_ENUM>::Entry settingTypeEntries[] =\n{\n\t{ \"width\",        Texture::SETTING_WIDTH         },\n\t{ \"height\",       Texture::SETTING_HEIGHT        },\n\t{ \"layers\",       Texture::SETTING_LAYERS        },\n\t{ \"mipmaps\",      Texture::SETTING_MIPMAPS       },\n\t{ \"mipmapcount\",  Texture::SETTING_MIPMAP_COUNT  },\n\t{ \"format\",       Texture::SETTING_FORMAT        },\n\t{ \"linear\",       Texture::SETTING_LINEAR        },\n\t{ \"type\",         Texture::SETTING_TYPE          },\n\t{ \"dpiscale\",     Texture::SETTING_DPI_SCALE     },\n\t{ \"msaa\",         Texture::SETTING_MSAA          },\n\t{ \"canvas\",       Texture::SETTING_RENDER_TARGET },\n\t{ \"computewrite\", Texture::SETTING_COMPUTE_WRITE },\n\t{ \"viewformats\",  Texture::SETTING_VIEW_FORMATS  },\n\t{ \"readable\",     Texture::SETTING_READABLE      },\n\t{ \"debugname\",    Texture::SETTING_DEBUGNAME     },\n};\n\nstatic StringMap<Texture::SettingType, Texture::SETTING_MAX_ENUM> settingTypes(settingTypeEntries, sizeof(settingTypeEntries));\n\nbool Texture::getConstant(const char *in, TextureType &out)\n{\n\treturn texTypes.find(in, out);\n}\n\nbool Texture::getConstant(TextureType in, const char *&out)\n{\n\treturn texTypes.find(in, out);\n}\n\nstd::vector<std::string> Texture::getConstants(TextureType)\n{\n\treturn texTypes.getNames();\n}\n\nbool Texture::getConstant(const char *in, MipmapsMode &out)\n{\n\treturn mipmapModes.find(in, out);\n}\n\nbool Texture::getConstant(MipmapsMode in, const char *&out)\n{\n\treturn mipmapModes.find(in, out);\n}\n\nstd::vector<std::string> Texture::getConstants(MipmapsMode)\n{\n\treturn mipmapModes.getNames();\n}\n\nbool Texture::getConstant(const char *in, SettingType &out)\n{\n\treturn settingTypes.find(in, out);\n}\n\nbool Texture::getConstant(SettingType in, const char *&out)\n{\n\treturn settingTypes.find(in, out);\n}\n\nconst char *Texture::getConstant(SettingType in)\n{\n\tconst char *name = nullptr;\n\tgetConstant(in, name);\n\treturn name;\n}\n\nstd::vector<std::string> Texture::getConstants(SettingType)\n{\n\treturn settingTypes.getNames();\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/Texture.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_GRAPHICS_TEXTURE_H\n#define LOVE_GRAPHICS_TEXTURE_H\n\n// LOVE\n#include \"common/StringMap.h\"\n#include \"common/math.h\"\n#include \"common/pixelformat.h\"\n#include \"common/Exception.h\"\n#include \"common/Optional.h\"\n#include \"common/int.h\"\n#include \"Drawable.h\"\n#include \"Quad.h\"\n#include \"vertex.h\"\n#include \"renderstate.h\"\n#include \"Resource.h\"\n#include \"image/ImageData.h\"\n#include \"image/Image.h\"\n#include \"image/CompressedImageData.h\"\n\n// C\n#include <stddef.h>\n#include <vector>\n\nnamespace love\n{\nnamespace graphics\n{\n\nclass Graphics;\nclass Buffer;\n\nenum TextureType\n{\n\tTEXTURE_2D,\n\tTEXTURE_VOLUME,\n\tTEXTURE_2D_ARRAY,\n\tTEXTURE_CUBE,\n\tTEXTURE_MAX_ENUM\n};\n\nenum PixelFormatUsage\n{\n\tPIXELFORMATUSAGE_SAMPLE,       // Any sampling in shaders.\n\tPIXELFORMATUSAGE_LINEAR,       // Linear filtering.\n\tPIXELFORMATUSAGE_RENDERTARGET, // Usable as a render target.\n\tPIXELFORMATUSAGE_BLEND,        // Blend support when used as a render target.\n\tPIXELFORMATUSAGE_MSAA,         // MSAA support when used as a render target.\n\tPIXELFORMATUSAGE_COMPUTEWRITE, // Writable in compute shaders via imageStore.\n\tPIXELFORMATUSAGE_MAX_ENUM\n};\n\nenum PixelFormatUsageFlags\n{\n\tPIXELFORMATUSAGEFLAGS_NONE = 0,\n\tPIXELFORMATUSAGEFLAGS_SAMPLE = (1 << PIXELFORMATUSAGE_SAMPLE),\n\tPIXELFORMATUSAGEFLAGS_LINEAR = (1 << PIXELFORMATUSAGE_LINEAR),\n\tPIXELFORMATUSAGEFLAGS_RENDERTARGET = (1 << PIXELFORMATUSAGE_RENDERTARGET),\n\tPIXELFORMATUSAGEFLAGS_BLEND = (1 << PIXELFORMATUSAGE_BLEND),\n\tPIXELFORMATUSAGEFLAGS_MSAA = (1 << PIXELFORMATUSAGE_MSAA),\n\tPIXELFORMATUSAGEFLAGS_COMPUTEWRITE = (1 << PIXELFORMATUSAGE_COMPUTEWRITE),\n};\n\nstruct SamplerState\n{\n\tenum WrapMode\n\t{\n\t\tWRAP_CLAMP,\n\t\tWRAP_CLAMP_ZERO,\n\t\tWRAP_CLAMP_ONE,\n\t\tWRAP_REPEAT,\n\t\tWRAP_MIRRORED_REPEAT,\n\t\tWRAP_MAX_ENUM\n\t};\n\n\tenum FilterMode\n\t{\n\t\tFILTER_LINEAR,\n\t\tFILTER_NEAREST,\n\t\tFILTER_MAX_ENUM\n\t};\n\n\tenum MipmapFilterMode\n\t{\n\t\tMIPMAP_FILTER_NONE,\n\t\tMIPMAP_FILTER_LINEAR,\n\t\tMIPMAP_FILTER_NEAREST,\n\t\tMIPMAP_FILTER_MAX_ENUM\n\t};\n\n\tFilterMode minFilter = FILTER_LINEAR;\n\tFilterMode magFilter = FILTER_LINEAR;\n\tMipmapFilterMode mipmapFilter = MIPMAP_FILTER_NONE;\n\n\tWrapMode wrapU = WRAP_CLAMP;\n\tWrapMode wrapV = WRAP_CLAMP;\n\tWrapMode wrapW = WRAP_CLAMP;\n\n\tfloat lodBias = 0.0f;\n\n\tuint8 maxAnisotropy = 1;\n\n\tuint8 minLod = 0;\n\tuint8 maxLod = LOVE_UINT8_MAX;\n\n\tOptional<CompareMode> depthSampleMode;\n\n\tuint64 toKey() const;\n\tstatic SamplerState fromKey(uint64 key);\n\n\tstatic bool isClampZeroOrOne(WrapMode w);\n\n\tstatic bool getConstant(const char *in, FilterMode &out);\n\tstatic bool getConstant(FilterMode in, const char *&out);\n\tstatic std::vector<std::string> getConstants(FilterMode);\n\n\tstatic bool getConstant(const char *in, MipmapFilterMode &out);\n\tstatic bool getConstant(MipmapFilterMode in, const char *&out);\n\tstatic std::vector<std::string> getConstants(MipmapFilterMode);\n\n\tstatic bool getConstant(const char *in, WrapMode &out);\n\tstatic bool getConstant(WrapMode in, const char *&out);\n\tstatic std::vector<std::string> getConstants(WrapMode);\n};\n\n/**\n * Base class for 2D textures. All textures can be drawn with Quads, have a\n * width and height, and have filter and wrap modes.\n **/\nclass Texture : public Drawable, public Resource\n{\npublic:\n\n\tstatic love::Type type;\n\tstatic int textureCount;\n\n\tenum MipmapsMode\n\t{\n\t\tMIPMAPS_NONE,\n\t\tMIPMAPS_MANUAL,\n\t\tMIPMAPS_AUTO,\n\t\tMIPMAPS_MAX_ENUM\n\t};\n\n\tenum SettingType\n\t{\n\t\tSETTING_WIDTH,\n\t\tSETTING_HEIGHT,\n\t\tSETTING_LAYERS,\n\t\tSETTING_MIPMAPS,\n\t\tSETTING_MIPMAP_COUNT,\n\t\tSETTING_FORMAT,\n\t\tSETTING_LINEAR,\n\t\tSETTING_TYPE,\n\t\tSETTING_DPI_SCALE,\n\t\tSETTING_MSAA,\n\t\tSETTING_RENDER_TARGET,\n\t\tSETTING_COMPUTE_WRITE,\n\t\tSETTING_VIEW_FORMATS,\n\t\tSETTING_READABLE,\n\t\tSETTING_DEBUGNAME,\n\t\tSETTING_MAX_ENUM\n\t};\n\n\t// Size and format will be overridden by ImageData when supplied.\n\tstruct Settings\n\t{\n\t\tint width  = 1;\n\t\tint height = 1;\n\t\tint layers = 1; // depth for 3D textures\n\t\tTextureType type = TEXTURE_2D;\n\t\tMipmapsMode mipmaps = MIPMAPS_NONE;\n\t\tint mipmapCount = 0; // only used when > 0.\n\t\tPixelFormat format = PIXELFORMAT_NORMAL;\n\t\tbool linear = false;\n\t\tfloat dpiScale = 1.0f;\n\t\tint msaa = 1;\n\t\tbool renderTarget = false;\n\t\tbool computeWrite = false;\n\t\tstd::vector<PixelFormat> viewFormats;\n\t\tOptionalBool readable;\n\t\tstd::string debugName;\n\t};\n\n\tstruct ViewSettings\n\t{\n\t\tOptional<PixelFormat> format;\n\t\tOptional<TextureType> type;\n\t\tOptionalInt mipmapStart;\n\t\tOptionalInt mipmapCount;\n\t\tOptionalInt layerStart;\n\t\tOptionalInt layerCount;\n\t\tstd::string debugName;\n\t};\n\n\tstruct Slices\n\t{\n\tpublic:\n\n\t\tSlices(TextureType textype);\n\n\t\tvoid clear();\n\t\tvoid set(int slice, int mipmap, love::image::ImageDataBase *data);\n\t\tlove::image::ImageDataBase *get(int slice, int mipmap) const;\n\n\t\tvoid add(love::image::CompressedImageData *cdata, int startslice, int startmip, bool addallslices, bool addallmips);\n\n\t\tint getSliceCount(int mip = 0) const;\n\t\tint getMipmapCount(int slice = 0) const;\n\n\t\tbool validate() const;\n\n\t\tTextureType getTextureType() const { return textureType; }\n\n\tprivate:\n\n\t\tTextureType textureType;\n\n\t\t// For 2D/Cube/2DArray texture types, each element in the data array has\n\t\t// an array of mipmap levels. For 3D texture types, each mipmap level\n\t\t// has an array of layers.\n\t\tstd::vector<std::vector<StrongRef<love::image::ImageDataBase>>> data;\n\n\t}; // Slices\n\n\tstruct ViewInfo\n\t{\n\t\tTexture *texture;\n\t\tint startMipmap;\n\t\tint startLayer;\n\t};\n\n\tstatic int64 totalGraphicsMemory;\n\n\t// Drawable.\n\tvoid draw(Graphics *gfx, const Matrix4 &m) override;\n\n\t/**\n\t * Draws the texture using the specified transformation with a Quad applied.\n\t **/\n\tvoid draw(Graphics *gfx, Quad *quad, const Matrix4 &m);\n\n\tvoid drawLayer(Graphics *gfx, int layer, const Matrix4 &m);\n\tvoid drawLayer(Graphics *gfx, int layer, Quad *quad, const Matrix4 &m);\n\n\tvoid replacePixels(love::image::ImageDataBase *d, int slice, int mipmap, int x, int y, bool reloadmipmaps);\n\tvoid replacePixels(const void *data, size_t size, int slice, int mipmap, const Rect &rect, bool reloadmipmaps);\n\n\tvoid generateMipmaps();\n\n\tvirtual void copyFromBuffer(Buffer *source, size_t sourceoffset, int sourcewidth, size_t size, int slice, int mipmap, const Rect &rect) = 0;\n\tvirtual void copyToBuffer(Buffer *dest, int slice, int mipmap, const Rect &rect, size_t destoffset, int destwidth, size_t size) = 0;\n\n\tvirtual ptrdiff_t getRenderTargetHandle() const = 0;\n\tvirtual ptrdiff_t getSamplerHandle() const = 0;\n\n\tTextureType getTextureType() const { return texType; }\n\tPixelFormat getPixelFormat() const { return format; }\n\tMipmapsMode getMipmapsMode() const { return mipmapsMode; }\n\n\tbool isRenderTarget() const { return renderTarget; }\n\tbool isComputeWritable() const { return computeWrite; }\n\tbool isReadable() const { return readable; }\n\n\tconst std::vector<PixelFormat> &getViewFormats() const { return viewFormats; }\n\n\tbool isCompressed() const;\n\tbool isFormatLinear() const;\n\n\tbool isValidSlice(int slice, int mip) const;\n\n\t// Number of array layers, cube faces, or volume layers for the given mip.\n\tint getSliceCount(int mip) const;\n\n\tint getWidth(int mip = 0) const;\n\tint getHeight(int mip = 0) const;\n\tint getDepth(int mip = 0) const;\n\tint getLayerCount() const;\n\tint getMipmapCount() const;\n\n\tint getPixelWidth(int mip = 0) const;\n\tint getPixelHeight(int mip = 0) const;\n\n\tfloat getDPIScale() const;\n\n\tint getRequestedMSAA() const;\n\tvirtual int getMSAA() const = 0;\n\n\tvirtual void setSamplerState(const SamplerState &s) = 0;\n\tconst SamplerState &getSamplerState() const;\n\n\tQuad *getQuad() const;\n\n\tconst ViewInfo &getRootViewInfo() const { return rootView; }\n\tconst ViewInfo &getParentViewInfo() const { return parentView; }\n\n\tconst std::string &getDebugName() const { return debugName; }\n\n\tstatic int getTotalMipmapCount(int w, int h);\n\tstatic int getTotalMipmapCount(int w, int h, int d);\n\n\tstatic bool getConstant(const char *in, TextureType &out);\n\tstatic bool getConstant(TextureType in, const char *&out);\n\tstatic std::vector<std::string> getConstants(TextureType);\n\n\tstatic bool getConstant(const char *in, MipmapsMode &out);\n\tstatic bool getConstant(MipmapsMode in, const char *&out);\n\tstatic std::vector<std::string> getConstants(MipmapsMode);\n\n\tstatic bool getConstant(const char *in, SettingType &out);\n\tstatic bool getConstant(SettingType in, const char *&out);\n\tstatic const char *getConstant(SettingType in);\n\tstatic std::vector<std::string> getConstants(SettingType);\n\nprotected:\n\n\tTexture(Graphics *gfx, const Settings &settings, const Slices *slices);\n\tTexture(Graphics *gfx, Texture *base, const ViewSettings &viewsettings);\n\tvirtual ~Texture();\n\n\tvoid updateGraphicsMemorySize(bool loaded);\n\n\tvoid uploadImageData(love::image::ImageDataBase *d, int level, int slice, int x, int y);\n\tvirtual void uploadByteData(const void *data, size_t size, int level, int slice, const Rect &r) = 0;\n\n\tbool supportsGenerateMipmaps(const char *&outReason) const;\n\tvirtual void generateMipmapsInternal() = 0;\n\n\tSamplerState validateSamplerState(SamplerState s) const;\n\n\tbool validateDimensions(bool throwException) const;\n\tvoid validatePixelFormat(Graphics *gfx) const;\n\n\tTextureType texType;\n\n\tPixelFormat format;\n\tbool renderTarget;\n\tbool computeWrite;\n\tbool readable;\n\n\tstd::vector<PixelFormat> viewFormats;\n\n\tMipmapsMode mipmapsMode;\n\n\tint width;\n\tint height;\n\n\tint depth;\n\tint layers;\n\tint mipmapCount;\n\n\tint pixelWidth;\n\tint pixelHeight;\n\n\tint requestedMSAA;\n\n\tSamplerState samplerState;\n\n\tStrongRef<Quad> quad;\n\n\tint64 graphicsMemorySize;\n\n\tstd::string debugName;\n\n\tViewInfo rootView;\n\tViewInfo parentView;\n\n}; // Texture\n\n} // graphics\n} // love\n\n#endif // LOVE_GRAPHICS_TEXTURE_H\n"
  },
  {
    "path": "src/modules/graphics/Video.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Video.h\"\n\n// LOVE\n#include \"Shader.h\"\n#include \"Graphics.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nlove::Type Video::type(\"Video\", &Drawable::type);\n\nVideo::Video(Graphics *gfx, love::video::VideoStream *stream, float dpiscale)\n\t: stream(stream)\n\t, width(stream->getWidth() / dpiscale)\n\t, height(stream->getHeight() / dpiscale)\n\t, samplerState()\n{\n\tconst SamplerState &defaultSampler = gfx->getDefaultSamplerState();\n\tsamplerState.minFilter = defaultSampler.minFilter;\n\tsamplerState.magFilter = defaultSampler.magFilter;\n\tsamplerState.wrapU = defaultSampler.wrapU;\n\tsamplerState.wrapV = defaultSampler.wrapV;\n\tsamplerState.maxAnisotropy = defaultSampler.maxAnisotropy;\n\n\tstream->fillBackBuffer();\n\n\tfor (int i = 0; i < 4; i++)\n\t\tvertices[i].color = Color32(255, 255, 255, 255);\n\n\t// Vertices are ordered for use with triangle strips:\n\t// 0---2\n\t// | / |\n\t// 1---3\n\tvertices[0].x = 0.0f;\n\tvertices[0].y = 0.0f;\n\tvertices[1].x = 0.0f;\n\tvertices[1].y = (float) height;\n\tvertices[2].x = (float) width;\n\tvertices[2].y = 0.0f;\n\tvertices[3].x = (float) width;\n\tvertices[3].y = (float) height;\n\n\tvertices[0].s = 0.0f;\n\tvertices[0].t = 0.0f;\n\tvertices[1].s = 0.0f;\n\tvertices[1].t = 1.0f;\n\tvertices[2].s = 1.0f;\n\tvertices[2].t = 0.0f;\n\tvertices[3].s = 1.0f;\n\tvertices[3].t = 1.0f;\n\n\t// Create the textures using the initial frame data.\n\tauto frame = (const love::video::VideoStream::Frame*) stream->getFrontBuffer();\n\n\tint widths[3]  = {frame->yw, frame->cw, frame->cw};\n\tint heights[3] = {frame->yh, frame->ch, frame->ch};\n\n\tconst unsigned char *data[3] = {frame->yplane, frame->cbplane, frame->crplane};\n\n\tTexture::Settings settings;\n\n\tfor (int i = 0; i < 3; i++)\n\t{\n\t\tsettings.width = widths[i];\n\t\tsettings.height = heights[i];\n\t\tsettings.format = PIXELFORMAT_R8_UNORM;\n\t\tTexture *tex = gfx->newTexture(settings, nullptr);\n\n\t\ttex->setSamplerState(samplerState);\n\n\t\tsize_t bpp = getPixelFormatBlockSize(PIXELFORMAT_R8_UNORM);\n\t\tsize_t size = bpp * widths[i] * heights[i];\n\n\t\tRect rect = {0, 0, widths[i], heights[i]};\n\t\ttex->replacePixels(data[i], size, 0, 0, rect, false);\n\n\t\ttextures[i].set(tex, Acquire::NORETAIN);\n\t}\n}\n\nVideo::~Video()\n{\n\tif (source)\n\t\tsource->stop();\n}\n\nlove::video::VideoStream *Video::getStream()\n{\n\treturn stream;\n}\n\nvoid Video::draw(Graphics *gfx, const Matrix4 &m)\n{\n\tupdate();\n\n\t// setVideoTextures may call flushBatchedDraws before setting the textures, so\n\t// we can't call it after requestBatchedDraw.\n\tauto shader = Shader::current;\n\tif (Shader::isDefaultActive())\n\t\tshader = Shader::standardShaders[Shader::STANDARD_VIDEO];\n\n\tif (shader != nullptr)\n\t\tshader->setVideoTextures(textures[0], textures[1], textures[2]);\n\n\tconst Matrix4 &tm = gfx->getTransform();\n\tbool is2D = tm.isAffine2DTransform();\n\n\tMatrix4 t(tm, m);\n\n\tGraphics::BatchedDrawCommand cmd;\n\tcmd.formats[0] = getSinglePositionFormat(is2D);\n\tcmd.formats[1] = CommonFormat::STf_RGBAub;\n\tcmd.indexMode = TRIANGLEINDEX_QUADS;\n\tcmd.vertexCount = 4;\n\tcmd.standardShaderType = Shader::STANDARD_VIDEO;\n\n\tGraphics::BatchedVertexData data = gfx->requestBatchedDraw(cmd);\n\n\tif (is2D)\n\t\tt.transformXY((Vector2 *) data.stream[0], vertices, 4);\n\telse\n\t\tt.transformXY0((Vector3 *) data.stream[0], vertices, 4);\n\n\tSTf_RGBAub *verts = (STf_RGBAub *) data.stream[1];\n\n\tColor32 c = toColor32(gfx->getColor());\n\n\tfor (int i = 0; i < 4; i++)\n\t{\n\t\tverts[i].s = vertices[i].s;\n\t\tverts[i].t = vertices[i].t;\n\t\tverts[i].color = c;\n\t}\n\n\tgfx->flushBatchedDraws();\n}\n\nvoid Video::update()\n{\n\tbool bufferschanged = stream->swapBuffers();\n\tstream->fillBackBuffer();\n\n\tif (bufferschanged)\n\t{\n\t\tauto frame = (const love::video::VideoStream::Frame*) stream->getFrontBuffer();\n\n\t\tint widths[3]  = {frame->yw, frame->cw, frame->cw};\n\t\tint heights[3] = {frame->yh, frame->ch, frame->ch};\n\n\t\tconst unsigned char *data[3] = {frame->yplane, frame->cbplane, frame->crplane};\n\n\t\tfor (int i = 0; i < 3; i++)\n\t\t{\n\t\t\tsize_t bpp = getPixelFormatBlockSize(PIXELFORMAT_R8_UNORM);\n\t\t\tsize_t size = bpp * widths[i] * heights[i];\n\n\t\t\tRect rect = {0, 0, widths[i], heights[i]};\n\t\t\ttextures[i]->replacePixels(data[i], size, 0, 0, rect, false);\n\t\t}\n\t}\n}\n\nlove::audio::Source *Video::getSource()\n{\n\treturn source;\n}\n\nvoid Video::setSource(love::audio::Source *source)\n{\n\tthis->source = source;\n}\n\nint Video::getWidth() const\n{\n\treturn width;\n}\n\nint Video::getHeight() const\n{\n\treturn height;\n}\n\nint Video::getPixelWidth() const\n{\n\treturn stream->getWidth();\n}\n\nint Video::getPixelHeight() const\n{\n\treturn stream->getHeight();\n}\n\nvoid Video::setSamplerState(const SamplerState &s)\n{\n\tsamplerState.minFilter = s.minFilter;\n\tsamplerState.magFilter = s.magFilter;\n\tsamplerState.wrapU = s.wrapU;\n\tsamplerState.wrapV = s.wrapV;\n\tsamplerState.maxAnisotropy = s.maxAnisotropy;\n\n\tfor (const auto &texture : textures)\n\t\ttexture->setSamplerState(samplerState);\n}\n\nconst SamplerState &Video::getSamplerState() const\n{\n\treturn samplerState;\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/Video.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/math.h\"\n#include \"Drawable.h\"\n#include \"Texture.h\"\n#include \"vertex.h\"\n#include \"video/VideoStream.h\"\n#include \"audio/Source.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nclass Graphics;\n\nclass Video : public Drawable\n{\npublic:\n\n\tstatic love::Type type;\n\n\tVideo(Graphics *gfx, love::video::VideoStream *stream, float dpiscale = 1.0f);\n\tvirtual ~Video();\n\n\t// Drawable\n\tvoid draw(Graphics *gfx, const Matrix4 &m) override;\n\n\tlove::video::VideoStream *getStream();\n\n\tlove::audio::Source *getSource();\n\tvoid setSource(love::audio::Source *source);\n\n\tint getWidth() const;\n\tint getHeight() const;\n\n\tint getPixelWidth() const;\n\tint getPixelHeight() const;\n\n\tvoid setSamplerState(const SamplerState &s);\n\tconst SamplerState &getSamplerState() const;\n\nprivate:\n\n\tvoid update();\n\n\tStrongRef<love::video::VideoStream> stream;\n\n\tint width;\n\tint height;\n\n\tSamplerState samplerState;\n\n\tVertex vertices[4];\n\n\tStrongRef<Texture> textures[3];\n\tStrongRef<love::audio::Source> source;\n\t\n}; // Video\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/Volatile.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Volatile.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\n// Static members.\nstd::list<Volatile *> Volatile::all;\n\nVolatile::Volatile()\n{\n\t// Insert this object into \"all\".\n\tall.push_back(this);\n}\n\nVolatile::~Volatile()\n{\n\t// Remove the pointer to this object.\n\tall.remove(this);\n}\n\nbool Volatile::loadAll()\n{\n\tbool success = true;\n\n\tfor (Volatile *v : all)\n\t\tsuccess = success && v->loadVolatile();\n\n\treturn success;\n}\n\nvoid Volatile::unloadAll()\n{\n\tfor (Volatile *v : all)\n\t\tv->unloadVolatile();\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/Volatile.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_GRAPHICS_VOLATILE_H\n#define LOVE_GRAPHICS_VOLATILE_H\n\n// STL\n#include <list>\n\nnamespace love\n{\nnamespace graphics\n{\n\n/**\n * This class is the superclass of all objects which must completely or\n * partially reload when the user changes the display resolution. All\n * volatile objects will be notified when the display mode changes.\n *\n * @author Anders Ruud\n **/\nclass Volatile\n{\nprivate:\n\n\t// A list of all Volatile object currently alive.\n\tstatic std::list<Volatile *> all;\n\npublic:\n\n\t/**\n\t * Constructor. Automatically adds \\c this into the list\n\t * of volatile objects.\n\t **/\n\tVolatile();\n\n\t/**\n\t * Destructor. Removes \\c this from the list of volatile\n\t * objects.\n\t **/\n\tvirtual ~Volatile();\n\n\t/**\n\t * Loads the part(s) of the object which is destroyed when\n\t * the display mode is changed.\n\t *\n\t * @return True if successful, false on errors.\n\t **/\n\tvirtual bool loadVolatile() = 0;\n\n\t/**\n\t * Unloads the part(s) of the objects which would be destroyed\n\t * anyway when the display mode is changed.\n\t **/\n\tvirtual void unloadVolatile() = 0;\n\n\t// Static:\n\n\t/**\n\t * Calls \\c loadVolatile() on each element in the list of volatiles.\n\t *\n\t * @return True if all elements succeeded, false if one or more failed.\n\t **/\n\tstatic bool loadAll();\n\n\t/**\n\t * Calls \\c unloadVolatile() on each element in the list of volatiles.\n\t **/\n\tstatic void unloadAll();\n\n}; // Volatile\n\n} // graphics\n} // love\n\n#endif // LOVE_GRAPHICS_VOLATILE_H\n"
  },
  {
    "path": "src/modules/graphics/metal/Buffer.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"graphics/Buffer.h\"\n#include \"Metal.h\"\n#include \"common/Range.h\"\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace metal\n{\n\nclass Buffer final : public love::graphics::Buffer\n{\npublic:\n\n\tBuffer(love::graphics::Graphics *gfx, id<MTLDevice> device, const Settings &settings, const std::vector<DataDeclaration> &format, const void *data, size_t size, size_t arraylength);\n\tvirtual ~Buffer();\n\n\tvoid *map(MapType map, size_t offset, size_t size) override;\n\tvoid unmap(size_t usedoffset, size_t usedsize) override;\n\tbool fill(size_t offset, size_t size, const void *data) override;\n\tvoid copyTo(love::graphics::Buffer *dest, size_t sourceoffset, size_t destoffset, size_t size) override;\n\n\tptrdiff_t getHandle() const override { return (ptrdiff_t) buffer; }\n\tptrdiff_t getTexelBufferHandle() const override { return (ptrdiff_t) texture; }\n\nprivate:\n\n\tvoid clearInternal(size_t offset, size_t size) override;\n\n\tid<MTLBuffer> buffer;\n\tid<MTLTexture> texture;\n\n\tid<MTLBuffer> mapBuffer;\n\n\tRange mappedRange;\n\n}; // Buffer\n\n} // metal\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/metal/Buffer.mm",
    "content": "/**\n* Copyright (c) 2006-2026 LOVE Development Team\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n*\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n*\n* 1. The origin of this software must not be misrepresented; you must not\n*    claim that you wrote the original software. If you use this software\n*    in a product, an acknowledgment in the product documentation would be\n*    appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n*    misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n**/\n\n#include \"Buffer.h\"\n#include \"Graphics.h\"\n\n#include \"common/memory.h\"\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace metal\n{\n\nstatic MTLPixelFormat getMTLPixelFormat(DataFormat format)\n{\n\tswitch (format)\n\t{\n\t\tcase DATAFORMAT_FLOAT: return MTLPixelFormatR32Float;\n\t\tcase DATAFORMAT_FLOAT_VEC2: return MTLPixelFormatRG32Float;\n\t\tcase DATAFORMAT_FLOAT_VEC4: return MTLPixelFormatRGBA32Float;\n\t\tcase DATAFORMAT_INT32: return MTLPixelFormatR32Sint;\n\t\tcase DATAFORMAT_INT32_VEC2: return MTLPixelFormatRG32Sint;\n\t\tcase DATAFORMAT_INT32_VEC4: return MTLPixelFormatRGBA32Sint;\n\t\tcase DATAFORMAT_UINT32: return MTLPixelFormatR32Uint;\n\t\tcase DATAFORMAT_UINT32_VEC2: return MTLPixelFormatRG32Uint;\n\t\tcase DATAFORMAT_UINT32_VEC4: return MTLPixelFormatRGBA32Uint;\n\t\tcase DATAFORMAT_UNORM8_VEC4: return MTLPixelFormatRGBA8Unorm;\n\t\tcase DATAFORMAT_SNORM8_VEC4: return MTLPixelFormatRGBA8Snorm;\n\t\tcase DATAFORMAT_INT8_VEC4: return MTLPixelFormatRGBA8Sint;\n\t\tcase DATAFORMAT_UINT8_VEC4: return MTLPixelFormatRGBA8Uint;\n\t\tcase DATAFORMAT_UNORM16_VEC2: return MTLPixelFormatRG16Unorm;\n\t\tcase DATAFORMAT_UNORM16_VEC4: return MTLPixelFormatRGBA16Unorm;\n\t\tcase DATAFORMAT_INT16_VEC2: return MTLPixelFormatRG16Sint;\n\t\tcase DATAFORMAT_INT16_VEC4: return MTLPixelFormatRGBA16Sint;\n\t\tcase DATAFORMAT_UINT16: return MTLPixelFormatR16Uint;\n\t\tcase DATAFORMAT_UINT16_VEC2: return MTLPixelFormatRG16Uint;\n\t\tcase DATAFORMAT_UINT16_VEC4: return MTLPixelFormatRGBA16Uint;\n\t\tdefault: return MTLPixelFormatInvalid;\n\t}\n}\n\nBuffer::Buffer(love::graphics::Graphics *gfx, id<MTLDevice> device, const Settings &settings, const std::vector<DataDeclaration> &format, const void *data, size_t size, size_t arraylength)\n\t: love::graphics::Buffer(gfx, settings, format, size, arraylength)\n\t, texture(nil)\n\t, mapBuffer(nil)\n\t, mappedRange()\n{ @autoreleasepool {\n\tsize = getSize();\n\tarraylength = getArrayLength();\n\n\tif (usageFlags & BUFFERUSAGEFLAG_TEXEL)\n\t{\n\t\tif (@available(iOS 12, macOS 10.14, *))\n\t\t{\n\t\t\tMTLPixelFormat pixformat = getMTLPixelFormat(getDataMember(0).decl.format);\n\t\t\tNSUInteger alignment = 1;\n\t\t\tif (pixformat != MTLPixelFormatInvalid)\n\t\t\t\talignment = [device minimumTextureBufferAlignmentForPixelFormat:pixformat];\n\n\t\t\tsize = alignUp(size, (size_t) alignment);\n\t\t}\n\t}\n\n\tMTLResourceOptions opts = 0;\n\tif (settings.dataUsage == BUFFERDATAUSAGE_READBACK)\n\t\topts |= MTLResourceStorageModeShared;\n\telse\n\t\topts |= MTLResourceStorageModePrivate;\n\n\tbuffer = [device newBufferWithLength:size options:opts];\n\n\tif (buffer == nil)\n\t\tthrow love::Exception(\"Could not create buffer with %d bytes (out of VRAM?)\", size);\n\n\tif (!debugName.empty())\n\t\tbuffer.label = @(debugName.c_str());\n\n\tif (usageFlags & BUFFERUSAGEFLAG_TEXEL)\n\t{\n\t\tif (@available(iOS 12, macOS 10.14, *))\n\t\t{\n\t\t\tMTLPixelFormat pixformat = getMTLPixelFormat(getDataMember(0).decl.format);\n\t\t\tif (pixformat == MTLPixelFormatInvalid)\n\t\t\t\tthrow love::Exception(\"Could not create Metal texel buffer: invalid format.\");\n\n\t\t\tsize_t width = arraylength * getDataMembers().size();\n\t\t\tauto desc = [MTLTextureDescriptor textureBufferDescriptorWithPixelFormat:pixformat\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   width:width\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t resourceOptions:opts\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   usage:MTLTextureUsageShaderRead];\n\t\t\ttexture = [buffer newTextureWithDescriptor:desc offset:0 bytesPerRow:size];\n\t\t}\n\n\t\tif (texture == nil)\n\t\t\tthrow love::Exception(\"Could not create Metal texel buffer.\");\n\t}\n\n\tif (data != nullptr)\n\t\tfill(0, size, data);\n\telse if (settings.zeroInitialize)\n\t{\n\t\tauto *mgfx = (Graphics *) gfx;\n\t\tauto encoder = mgfx->useBlitEncoder();\n\n\t\tsize_t clearsize = size;\n\n#ifdef LOVE_MACOS\n\t\t// Metal limitation on macOS.\n\t\tclearsize -= (clearsize % 4);\n#endif\n\n\t\tif (clearsize > 0)\n\t\t\t[encoder fillBuffer:buffer range:NSMakeRange(0, clearsize) value:0];\n\t}\n}}\n\nBuffer::~Buffer()\n{ @autoreleasepool {\n\tbuffer = nil;\n\ttexture = nil;\n}}\n\nvoid *Buffer::map(MapType map, size_t offset, size_t size)\n{ @autoreleasepool {\n\tif (size == 0)\n\t\treturn nullptr;\n\n\tif (map == MAP_WRITE_INVALIDATE && (isImmutable() || dataUsage == BUFFERDATAUSAGE_READBACK))\n\t\treturn nullptr;\n\n\tif (map == MAP_READ_ONLY && dataUsage != BUFFERDATAUSAGE_READBACK)\n\t\treturn nullptr;\n\n\tRange r(offset, size);\n\n\tif (!Range(0, getSize()).contains(r))\n\t\treturn nullptr;\n\n\tif (map == MAP_READ_ONLY)\n\t{\n\t\tmappedRange = r;\n\t\tmapped = true;\n\t\tmappedType = map;\n\t\treturn (char *) buffer.contents + offset;\n\t}\n\n\tauto gfx = Graphics::getInstance();\n\n\t// TODO: Don't create a new buffer every time, also do something for stream\n\t// buffers.\n\tmapBuffer = [gfx->device newBufferWithLength:size options:MTLResourceStorageModeShared];\n\n\tif (mapBuffer != nil)\n\t{\n\t\tmappedRange = r;\n\t\tmapped = true;\n\t\tmappedType = map;\n\t\treturn mapBuffer.contents;\n\t}\n\n\treturn nullptr;\n}}\n\nvoid Buffer::unmap(size_t usedoffset, size_t usedsize)\n{ @autoreleasepool {\n\tif (mappedType == MAP_READ_ONLY)\n\t{\n\t\tmapped = false;\n\t\treturn;\n\t}\n\n\tif (mapBuffer == nil)\n\t\treturn;\n\n\tRange r(usedoffset, usedsize);\n\n\tif (!mapped || !mappedRange.contains(r))\n\t\treturn;\n\n\tauto gfx = Graphics::getInstance();\n\tauto encoder = gfx->useBlitEncoder();\n\n\t[encoder copyFromBuffer:mapBuffer\n\t\t\t   sourceOffset:(usedoffset - mappedRange.getOffset())\n\t\t\t\t   toBuffer:buffer\n\t\t  destinationOffset:usedoffset\n\t\t\t\t\t   size:usedsize];\n\n\tmapBuffer = nil;\n\tmapped = false;\n}}\n\nbool Buffer::fill(size_t offset, size_t size, const void *data)\n{ @autoreleasepool {\n\tvoid *dest = map(MAP_WRITE_INVALIDATE, offset, size);\n\n\tif (dest == nullptr)\n\t\treturn false;\n\n\tmemcpy(dest, data, size);\n\n\tunmap(offset, size);\n\treturn true;\n}}\n\nvoid Buffer::clearInternal(size_t offset, size_t size)\n{ @autoreleasepool {\n\tauto gfx = Graphics::getInstance();\n\tauto encoder = gfx->useBlitEncoder();\n\n\t[encoder fillBuffer:buffer range:NSMakeRange(offset, size) value:0];\n}}\n\nvoid Buffer::copyTo(love::graphics::Buffer *dest, size_t sourceoffset, size_t destoffset, size_t size)\n{ @autoreleasepool {\n\tauto gfx = Graphics::getInstance();\n\tauto encoder = gfx->useBlitEncoder();\n\n\t[encoder copyFromBuffer:buffer\n\t\t\t   sourceOffset:sourceoffset\n\t\t\t\t   toBuffer:((Buffer *) dest)->buffer\n\t\t  destinationOffset:destoffset\n\t\t\t\t\t   size:size];\n}}\n\n} // metal\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/metal/Graphics.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"graphics/Graphics.h\"\n#include \"Metal.h\"\n#include \"Shader.h\"\n\n#include <map>\n\n@class CAMetalLayer;\n@protocol CAMetalDrawable;\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace metal\n{\n\nclass Graphics final : public love::graphics::Graphics\n{\npublic:\n\n\tenum SubmitType\n\t{\n\t\tSUBMIT_DONE,\n\t\tSUBMIT_STORE,\n\t};\n\n\tstruct RenderEncoderBindings\n\t{\n\t\tvoid *textures[32][SHADERSTAGE_MAX_ENUM];\n\t\tvoid *samplers[32][SHADERSTAGE_MAX_ENUM];\n\t\tstruct\n\t\t{\n\t\t\tvoid *buffer;\n\t\t\tsize_t offset;\n\t\t} buffers[32][SHADERSTAGE_MAX_ENUM];\n\t};\n\n\tGraphics();\n\tvirtual ~Graphics();\n\n\tlove::graphics::Texture *newTexture(const Texture::Settings &settings, const Texture::Slices *data = nullptr) override;\n\tlove::graphics::Texture *newTextureView(love::graphics::Texture *base, const Texture::ViewSettings &viewsettings) override;\n\tlove::graphics::Buffer *newBuffer(const Buffer::Settings &settings, const std::vector<Buffer::DataDeclaration> &format, const void *data, size_t size, size_t arraylength) override;\n\n\tvoid backbufferChanged(int width, int height, int pixelwidth, int pixelheight, bool backbufferstencil, bool backbufferdepth, int msaa) override;\n\tbool setMode(void *context, int width, int height, int pixelwidth, int pixelheight, bool backbufferstencil, bool backbufferdepth, int msaa) override;\n\tvoid unSetMode() override;\n\n\tvoid setActive(bool active) override;\n\n\tbool dispatch(love::graphics::Shader *shader, int x, int y, int z) override;\n\tbool dispatch(love::graphics::Shader *shader, love::graphics::Buffer *indirectargs, size_t argsoffset) override;\n\n\tvoid draw(const DrawCommand &cmd) override;\n\tvoid draw(const DrawIndexedCommand &cmd) override;\n\tvoid drawQuads(int start, int count, VertexAttributesID attributesID, const BufferBindings &buffers, love::graphics::Texture *texture) override;\n\n\tvoid clear(OptionalColorD color, OptionalInt stencil, OptionalDouble depth) override;\n\tvoid clear(const std::vector<OptionalColorD> &colors, OptionalInt stencil, OptionalDouble depth) override;\n\n\tvoid discard(const std::vector<bool> &colorbuffers, bool depthstencil) override;\n\n\tvoid present(void *screenshotCallbackData) override;\n\n\tint getRequestedBackbufferMSAA() const override;\n\tint getBackbufferMSAA() const override;\n\n\tvoid setColor(Colorf c) override;\n\n\tvoid setScissor(const Rect &rect) override;\n\tvoid setScissor() override;\n\n\tvoid setStencilState(const StencilState &s) override;\n\n\tvoid setDepthMode(CompareMode compare, bool write) override;\n\n\tvoid setFrontFaceWinding(Winding winding) override;\n\n\tvoid setColorMask(ColorChannelMask mask) override;\n\n\tvoid setBlendState(const BlendState &state) override;\n\n\tvoid setPointSize(float size) override;\n\n\tvoid setWireframe(bool enable) override;\n\t\n\tbool isPixelFormatSupported(PixelFormat format, uint32 usage) override;\n\tRenderer getRenderer() const override;\n\tbool usesGLSLES() const override;\n\tRendererInfo getRendererInfo() const override;\n\n\tvoid setShaderChanged();\n\n\tid<MTLCommandBuffer> useCommandBuffer();\n\tid<MTLCommandBuffer> getCommandBuffer() const { return commandBuffer; }\n\tvoid submitCommandBuffer(SubmitType type);\n\n\tvoid submitAllEncoders(SubmitType type);\n\n\tid<MTLRenderCommandEncoder> useRenderEncoder();\n\tid<MTLRenderCommandEncoder> getRenderEncoder() const { return renderEncoder; }\n\tvoid submitRenderEncoder(SubmitType type);\n\n\tid<MTLBlitCommandEncoder> useBlitEncoder();\n\tid<MTLBlitCommandEncoder> getBlitEncoder() const { return blitEncoder; }\n\tvoid submitBlitEncoder();\n\n\tid<MTLComputeCommandEncoder> useComputeEncoder();\n\tid<MTLComputeCommandEncoder> getComputeEncoder() const { return computeEncoder; }\n\tvoid submitComputeEncoder();\n\n\tid<MTLSamplerState> getCachedSampler(const SamplerState &s);\n\n\tbool isDepthCompareSamplerSupported() const;\n\n\tStreamBuffer *getUniformBuffer() const { return uniformBuffer; }\n\tBuffer *getDefaultAttributesBuffer() const { return defaultAttributesBuffer; }\n\n\tint getClosestMSAASamples(int requestedsamples);\n\n\tstatic Graphics *getInstance() { return graphicsInstance; }\n\n\tid<MTLDevice> device;\n\nprivate:\n\n\tstatic Graphics *graphicsInstance;\n\n\tenum StateType\n\t{\n\t\tSTATE_BLEND,\n\t\tSTATE_VIEWPORT,\n\t\tSTATE_SCISSOR,\n\t\tSTATE_STENCIL,\n\t\tSTATE_DEPTH,\n\t\tSTATE_SHADER,\n\t\tSTATE_COLORMASK,\n\t\tSTATE_CULLMODE,\n\t\tSTATE_FACEWINDING,\n\t\tSTATE_WIREFRAME,\n\t};\n\n\tenum StateBit\n\t{\n\t\tSTATEBIT_BLEND = 1 << STATE_BLEND,\n\t\tSTATEBIT_VIEWPORT = 1 << STATE_VIEWPORT,\n\t\tSTATEBIT_SCISSOR = 1 << STATE_SCISSOR,\n\t\tSTATEBIT_STENCIL = 1 << STATE_STENCIL,\n\t\tSTATEBIT_DEPTH = 1 << STATE_DEPTH,\n\t\tSTATEBIT_SHADER = 1 << STATE_SHADER,\n\t\tSTATEBIT_COLORMASK = 1 << STATE_COLORMASK,\n\t\tSTATEBIT_CULLMODE = 1 << STATE_CULLMODE,\n\t\tSTATEBIT_FACEWINDING = 1 << STATE_FACEWINDING,\n\t\tSTATEBIT_WIREFRAME = 1 << STATE_WIREFRAME,\n\t\tSTATEBIT_ALL = 0xFFFFFFFF\n\t};\n\n\tstruct DeviceFamilies\n\t{\n\t\t// All arrays are 1-indexed for convenience\n\t\tbool apple[7+1];\n\t\tbool mac[2+1];\n\t\tbool common[3+1];\n\t\tbool macCatalyst[2+1];\n\t};\n\n\tstruct AttachmentStoreActions\n\t{\n\t\tMTLStoreAction color[MAX_COLOR_RENDER_TARGETS];\n\t\tMTLStoreAction depth;\n\t\tMTLStoreAction stencil;\n\t};\n\n\tlove::graphics::ShaderStage *newShaderStageInternal(ShaderStageType stage, const std::string &cachekey, const std::string &source, bool gles) override;\n\tlove::graphics::Shader *newShaderInternal(StrongRef<love::graphics::ShaderStage> stages[SHADERSTAGE_MAX_ENUM], const Shader::CompileOptions &options) override;\n\tlove::graphics::StreamBuffer *newStreamBuffer(BufferUsage usage, size_t size) override;\n\n\tlove::graphics::GraphicsReadback *newReadbackInternal(ReadbackMethod method, love::graphics::Buffer *buffer, size_t offset, size_t size, data::ByteData *dest, size_t destoffset) override;\n\tlove::graphics::GraphicsReadback *newReadbackInternal(ReadbackMethod method, love::graphics::Texture *texture, int slice, int mipmap, const Rect &rect, image::ImageData *dest, int destx, int desty) override;\n\n\tvoid setRenderTargetsInternal(const RenderTargets &rts, int pixelw, int pixelh, bool hasSRGBcanvas) override;\n\tvoid initCapabilities() override;\n\tvoid getAPIStats(int &shaderswitches) const override;\n\n\tvoid processCompletedCommandBuffers();\n\n\tvoid endPass(bool presenting);\n\n\tid<MTLDepthStencilState> getCachedDepthStencilState(const DepthState &depth, const StencilState &stencil);\n\tvoid applyRenderState(id<MTLRenderCommandEncoder> renderEncoder, VertexAttributesID attributesID);\n\tbool applyShaderUniforms(id<MTLComputeCommandEncoder> encoder, love::graphics::Shader *shader);\n\tvoid applyShaderUniforms(id<MTLRenderCommandEncoder> renderEncoder, love::graphics::Shader *shader, Texture *maintex);\n\n\tid<MTLCommandQueue> commandQueue;\n\n\tid<MTLCommandBuffer> commandBuffer;\n\tid<MTLRenderCommandEncoder> renderEncoder;\n\tid<MTLBlitCommandEncoder> blitEncoder;\n\tid<MTLComputeCommandEncoder> computeEncoder;\n\n\tCAMetalLayer *metalLayer;\n\tid<CAMetalDrawable> activeDrawable;\n\tMTLRenderPassDescriptor *passDesc;\n\n\tuint32 dirtyRenderState;\n\tCullMode lastCullMode;\n\tShader::RenderPipelineKey lastRenderPipelineKey;\n\tint shaderSwitches;\n\n\tStrongRef<love::graphics::Texture> backbufferMSAA;\n\tStrongRef<love::graphics::Texture> backbufferDepthStencil;\n\tint requestedBackbufferMSAA;\n\n\tAttachmentStoreActions attachmentStoreActions;\n\n\tRenderEncoderBindings renderBindings;\n\n\tStreamBuffer *uniformBuffer;\n\tStreamBuffer::MapInfo uniformBufferData;\n\tsize_t uniformBufferOffset;\n\tsize_t uniformBufferGPUStart;\n\n\tBuffer *defaultAttributesBuffer;\n\n\tstd::map<uint64, void *> cachedSamplers;\n\tstd::unordered_map<uint64, void *> cachedDepthStencilStates;\n\n\tstd::vector<id<MTLCommandBuffer>> activeCommandBuffers;\n\n\tDeviceFamilies families;\n\n\tbool isVMDevice;\n\n}; // Graphics\n\n} // metal\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/metal/Graphics.mm",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Graphics.h\"\n#include \"StreamBuffer.h\"\n#include \"Buffer.h\"\n#include \"Texture.h\"\n#include \"GraphicsReadback.h\"\n#include \"Shader.h\"\n#include \"ShaderStage.h\"\n#include \"window/Window.h\"\n#include \"image/Image.h\"\n#include \"common/memory.h\"\n\n#import <QuartzCore/CAMetalLayer.h>\n\n#ifdef LOVE_MACOS\n// Needed for the GPU dynamic switching hack below.\n#define GL_SILENCE_DEPRECATION 1\n#import <Cocoa/Cocoa.h>\n#endif\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace metal\n{\n\nstatic MTLSamplerMinMagFilter getMTLSamplerFilter(SamplerState::FilterMode mode)\n{\n\tswitch (mode)\n\t{\n\t\tcase SamplerState::FILTER_LINEAR: return MTLSamplerMinMagFilterLinear;\n\t\tcase SamplerState::FILTER_NEAREST: return MTLSamplerMinMagFilterNearest;\n\t\tcase SamplerState::FILTER_MAX_ENUM: return MTLSamplerMinMagFilterLinear;\n\t}\n\treturn MTLSamplerMinMagFilterLinear;\n}\n\nstatic MTLSamplerMipFilter getMTLSamplerMipFilter(SamplerState::MipmapFilterMode mode)\n{\n\tswitch (mode)\n\t{\n\t\tcase SamplerState::MIPMAP_FILTER_NONE: return MTLSamplerMipFilterNotMipmapped;\n\t\tcase SamplerState::MIPMAP_FILTER_LINEAR: return MTLSamplerMipFilterLinear;\n\t\tcase SamplerState::MIPMAP_FILTER_NEAREST: return MTLSamplerMipFilterNearest;\n\t\tcase SamplerState::MIPMAP_FILTER_MAX_ENUM: return MTLSamplerMipFilterNotMipmapped;\n\t}\n\treturn MTLSamplerMipFilterNotMipmapped;\n}\n\nstatic MTLSamplerAddressMode getMTLSamplerAddressMode(SamplerState::WrapMode mode)\n{\n\tswitch (mode)\n\t{\n\t\tcase SamplerState::WRAP_CLAMP: return MTLSamplerAddressModeClampToEdge;\n\t\tcase SamplerState::WRAP_CLAMP_ZERO: return MTLSamplerAddressModeClampToZero;\n\t\tcase SamplerState::WRAP_CLAMP_ONE:\n\t\t\tif (@available(macOS 10.12, iOS 14.0, *))\n\t\t\t\treturn MTLSamplerAddressModeClampToBorderColor;\n\t\t\telse\n\t\t\t\treturn MTLSamplerAddressModeClampToZero;\n\t\tcase SamplerState::WRAP_REPEAT: return MTLSamplerAddressModeRepeat;\n\t\tcase SamplerState::WRAP_MIRRORED_REPEAT: return MTLSamplerAddressModeMirrorRepeat;\n\t\tcase SamplerState::WRAP_MAX_ENUM: return MTLSamplerAddressModeClampToEdge;\n\t}\n\treturn MTLSamplerAddressModeClampToEdge;\n}\n\nstatic MTLCompareFunction getMTLCompareFunction(CompareMode mode)\n{\n\tswitch (mode)\n\t{\n\t\tcase COMPARE_LESS: return MTLCompareFunctionLess;\n\t\tcase COMPARE_LEQUAL: return MTLCompareFunctionLessEqual;\n\t\tcase COMPARE_EQUAL: return MTLCompareFunctionEqual;\n\t\tcase COMPARE_GEQUAL: return MTLCompareFunctionGreaterEqual;\n\t\tcase COMPARE_GREATER: return MTLCompareFunctionGreater;\n\t\tcase COMPARE_NOTEQUAL: return MTLCompareFunctionNotEqual;\n\t\tcase COMPARE_ALWAYS: return MTLCompareFunctionAlways;\n\t\tcase COMPARE_NEVER: return MTLCompareFunctionNever;\n\t\tcase COMPARE_MAX_ENUM: return MTLCompareFunctionNever;\n\t}\n\treturn MTLCompareFunctionNever;\n}\n\nstatic MTLStencilOperation getMTLStencilOperation(StencilAction action)\n{\n\tswitch (action)\n\t{\n\t\tcase STENCIL_KEEP: return MTLStencilOperationKeep;\n\t\tcase STENCIL_ZERO: return MTLStencilOperationZero;\n\t\tcase STENCIL_REPLACE: return MTLStencilOperationReplace;\n\t\tcase STENCIL_INCREMENT: return MTLStencilOperationIncrementClamp;\n\t\tcase STENCIL_DECREMENT: return MTLStencilOperationDecrementClamp;\n\t\tcase STENCIL_INCREMENT_WRAP: return MTLStencilOperationIncrementWrap;\n\t\tcase STENCIL_DECREMENT_WRAP: return MTLStencilOperationDecrementWrap;\n\t\tcase STENCIL_INVERT: return MTLStencilOperationInvert;\n\t\tcase STENCIL_MAX_ENUM: return MTLStencilOperationKeep;\n\t}\n\treturn MTLStencilOperationKeep;\n}\n\nstatic MTLPrimitiveType getMTLPrimitiveType(PrimitiveType prim)\n{\n\tswitch (prim)\n\t{\n\t\tcase PRIMITIVE_TRIANGLES: return MTLPrimitiveTypeTriangle;\n\t\tcase PRIMITIVE_TRIANGLE_STRIP: return MTLPrimitiveTypeTriangleStrip;\n\t\tcase PRIMITIVE_TRIANGLE_FAN: return MTLPrimitiveTypeTriangle; // This is emulated with an index buffer.\n\t\tcase PRIMITIVE_POINTS: return MTLPrimitiveTypePoint;\n\t\tcase PRIMITIVE_MAX_ENUM: return MTLPrimitiveTypeTriangle;\n\t}\n\treturn MTLPrimitiveTypeTriangle;\n}\n\nstatic inline id<MTLTexture> getMTLTexture(love::graphics::Texture *tex)\n{\n\treturn tex ? (__bridge id<MTLTexture>)(void *) tex->getHandle() : nil;\n}\n\nstatic inline id<MTLTexture> getMTLRenderTarget(love::graphics::Texture *tex)\n{\n\treturn tex ? (__bridge id<MTLTexture>)(void *) tex->getRenderTargetHandle() : nil;\n}\n\nstatic inline id<MTLBuffer> getMTLBuffer(love::graphics::Resource *res)\n{\n\treturn res ? (__bridge id<MTLBuffer>)(void *) res->getHandle() : nil;\n}\n\nstatic inline void setBuffer(id<MTLRenderCommandEncoder> encoder, Graphics::RenderEncoderBindings &bindings, ShaderStageType stage, int index, id<MTLBuffer> buffer, size_t offset)\n{\n\tvoid *b = (__bridge void *)buffer;\n\tauto &binding = bindings.buffers[index][stage];\n\tif (binding.buffer != b)\n\t{\n\t\tbinding.buffer = b;\n\t\tbinding.offset = offset;\n\t\tif (stage == SHADERSTAGE_VERTEX)\n\t\t\t[encoder setVertexBuffer:buffer offset:offset atIndex:index];\n\t\telse if (stage == SHADERSTAGE_PIXEL)\n\t\t\t[encoder setFragmentBuffer:buffer offset:offset atIndex:index];\n\t}\n\telse if (binding.offset != offset)\n\t{\n\t\tbinding.offset = offset;\n\t\tif (stage == SHADERSTAGE_VERTEX)\n\t\t\t[encoder setVertexBufferOffset:offset atIndex:index];\n\t\telse if (stage == SHADERSTAGE_PIXEL)\n\t\t\t[encoder setFragmentBufferOffset:offset atIndex:index];\n\t}\n}\n\nstatic inline void setBuffer(id<MTLComputeCommandEncoder> encoder, Graphics::RenderEncoderBindings &bindings, int index, id<MTLBuffer> buffer, size_t offset)\n{\n\tvoid *b = (__bridge void *)buffer;\n\tauto &binding = bindings.buffers[index][SHADERSTAGE_COMPUTE];\n\tif (binding.buffer != b)\n\t{\n\t\tbinding.buffer = b;\n\t\tbinding.offset = offset;\n\t\t[encoder setBuffer:buffer offset:offset atIndex:index];\n\t}\n\telse if (binding.offset != offset)\n\t{\n\t\tbinding.offset = offset;\n\t\t[encoder setBufferOffset:offset atIndex:index];\n\t}\n}\n\nstatic inline void setTexture(id<MTLRenderCommandEncoder> encoder, Graphics::RenderEncoderBindings &bindings, ShaderStageType stage, int index, id<MTLTexture> texture)\n{\n\tvoid *t = (__bridge void *)texture;\n\tauto &binding = bindings.textures[index][stage];\n\tif (binding != t)\n\t{\n\t\tbinding = t;\n\t\tif (stage == SHADERSTAGE_VERTEX)\n\t\t\t[encoder setVertexTexture:texture atIndex:index];\n\t\telse if (stage == SHADERSTAGE_PIXEL)\n\t\t\t[encoder setFragmentTexture:texture atIndex:index];\n\t}\n}\n\nstatic inline void setTexture(id<MTLComputeCommandEncoder> encoder, Graphics::RenderEncoderBindings &bindings, int index, id<MTLTexture> texture)\n{\n\tvoid *t = (__bridge void *)texture;\n\tauto &binding = bindings.textures[index][SHADERSTAGE_COMPUTE];\n\tif (binding != t)\n\t{\n\t\tbinding = t;\n\t\t[encoder setTexture:texture atIndex:index];\n\t}\n}\n\nstatic inline void setSampler(id<MTLRenderCommandEncoder> encoder, Graphics::RenderEncoderBindings &bindings, ShaderStageType stage, int index, love::graphics::Texture *samplertex)\n{\n\tvoid *s = samplertex != nullptr ? (void *)samplertex->getSamplerHandle() : nullptr;\n\tauto &binding = bindings.samplers[index][stage];\n\tif (binding != s)\n\t{\n\t\tbinding = s;\n\t\tid<MTLSamplerState> sampler = (__bridge id<MTLSamplerState>) s;\n\t\tif (stage == SHADERSTAGE_VERTEX)\n\t\t\t[encoder setVertexSamplerState:sampler atIndex:index];\n\t\telse if (stage == SHADERSTAGE_PIXEL)\n\t\t\t[encoder setFragmentSamplerState:sampler atIndex:index];\n\t}\n}\n\nstatic inline void setSampler(id<MTLComputeCommandEncoder> encoder, Graphics::RenderEncoderBindings &bindings, int index, love::graphics::Texture *samplertex)\n{\n\tvoid *s = samplertex != nullptr ? (void *)samplertex->getSamplerHandle() : nullptr;\n\tauto &binding = bindings.samplers[index][SHADERSTAGE_COMPUTE];\n\tif (binding != s)\n\t{\n\t\tbinding = s;\n\t\tid<MTLSamplerState> sampler = (__bridge id<MTLSamplerState>) s;\n\t\t[encoder setSamplerState:sampler atIndex:index];\n\t}\n}\n\nlove::graphics::Graphics *createInstance()\n{\n\tlove::graphics::Graphics *instance = nullptr;\n\n\ttry\n\t{\n\t\tinstance = new Graphics();\n\t}\n\tcatch (love::Exception &e)\n\t{\n\t\tprintf(\"Cannot create Metal renderer: %s\\n\", e.what());\n\t}\n\n\treturn instance;\n}\n\nstruct DefaultVertexAttributes\n{\n\tfloat floats[4];\n\tint ints[4];\n\tfloat color[4];\n};\n\nGraphics *Graphics::graphicsInstance = nullptr;\n\nGraphics::Graphics()\n\t: love::graphics::Graphics(\"love.graphics.metal\")\n\t, device(nil)\n\t, commandQueue(nil)\n\t, commandBuffer(nil)\n\t, renderEncoder(nil)\n\t, blitEncoder(nil)\n\t, metalLayer(nil)\n\t, activeDrawable(nil)\n\t, passDesc(nil)\n\t, dirtyRenderState(STATEBIT_ALL)\n\t, lastCullMode(CULL_MAX_ENUM)\n\t, lastRenderPipelineKey()\n\t, shaderSwitches(0)\n\t, requestedBackbufferMSAA(0)\n\t, attachmentStoreActions()\n\t, renderBindings()\n\t, uniformBufferOffset(0)\n\t, uniformBufferGPUStart(0)\n\t, defaultAttributesBuffer(nullptr)\n\t, families()\n\t, isVMDevice(false)\n{ @autoreleasepool {\n\tif (@available(macOS 10.15, iOS 13.0, *))\n\t{\n\t\tgraphicsInstance = this;\n#ifdef LOVE_MACOS\n\t\tif (isLowPowerPreferred())\n\t\t{\n\t\t\tfor (id<MTLDevice> dev in MTLCopyAllDevices())\n\t\t\t{\n\t\t\t\tif (dev.isLowPower)\n\t\t\t\t{\n\t\t\t\t\tdevice = dev;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif\n\t\tif (device == nil)\n\t\t\tdevice = MTLCreateSystemDefaultDevice();\n\t\tif (device == nil)\n\t\t\tthrow love::Exception(\"Metal is not supported on this system.\");\n\t}\n\telse\n\t{\n\t\tthrow love::Exception(\"LOVE's Metal graphics backend requires macOS 10.15+ or iOS 13+.\");\n\t}\n\n\tisVMDevice = [device.name containsString:@(\"Apple Paravirtual device\")];\n\n#ifdef LOVE_MACOS\n\t// On multi-GPU macOS systems with a low and high power GPU (e.g. a 2016\n\t// Macbook Pro), the OS doesn't activate the high power GPU for final\n\t// monitor blitting even when MTLCreateSystemDefaultDevice is called, on\n\t// newer macOS versions. https://developer.apple.com/forums/thread/675411\n\t// But it does when an OpenGL context is created, so this big hack forces it\n\t// when we want it to happen.\n\tif (!device.isLowPower && MTLCopyAllDevices().count > 1)\n\t{\n\t\tNSOpenGLPixelFormatAttribute attributes[] =\n\t\t{\n\t\t\tNSOpenGLPFADoubleBuffer,\n\t\t\tNSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core,\n\t\t\tNSOpenGLPFAColorSize, 24,\n\t\t\tNSOpenGLPFAAlphaSize, 8,\n\t\t\tNSOpenGLPFADepthSize, 24,\n\t\t\tNSOpenGLPFAStencilSize, 8,\n\t\t\tNSOpenGLPFASampleBuffers, 0,\n\t\t\t0,\n\t\t};\n\n\t\tauto pixelformat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes];\n\t\tauto glcontext = [[NSOpenGLContext alloc] initWithFormat:pixelformat shareContext:nullptr];\n\t\tLOVE_UNUSED(glcontext);\n\t}\n#endif\n\n\tcommandQueue = [device newCommandQueue];\n\tpassDesc = [MTLRenderPassDescriptor new];\n\n\tinitCapabilities();\n\n\tuniformBuffer = CreateStreamBuffer(device, BUFFERUSAGE_UNIFORM, 1024 * 512 * 1);\n\n\t{\n\t\tstd::vector<Buffer::DataDeclaration> dataformat = {\n\t\t\t{\"floats\", DATAFORMAT_FLOAT_VEC4, 0},\n\t\t\t{\"ints\", DATAFORMAT_INT32_VEC4, 0},\n\t\t\t{\"color\", DATAFORMAT_FLOAT_VEC4, 0}\n\t\t};\n\n\t\tDefaultVertexAttributes defaults = {\n\t\t\t{0.0f, 0.0f, 0.0f, 1.0f},\n\t\t\t{0, 0, 0, 1},\n\t\t\t{1.0f, 1.0f, 1.0f, 1.0f}\n\t\t};\n\n\t\tBuffer::Settings attribsettings(BUFFERUSAGEFLAG_VERTEX, BUFFERDATAUSAGE_STATIC);\n\t\tattribsettings.debugName = \"Default Vertex Attributes\";\n\n\t\tdefaultAttributesBuffer = newBuffer(attribsettings, dataformat, &defaults, sizeof(DefaultVertexAttributes), 0);\n\t}\n\n\tif (batchedDrawState.vb[0] == nullptr)\n\t{\n\t\t// Initial sizes that should be good enough for most cases. It will\n\t\t// resize to fit if needed, later.\n\t\tbatchedDrawState.vb[0] = CreateStreamBuffer(device, BUFFERUSAGE_VERTEX, 1024 * 1024 * 1);\n\t\tbatchedDrawState.vb[1] = CreateStreamBuffer(device, BUFFERUSAGE_VERTEX, 256  * 1024 * 1);\n\t\tbatchedDrawState.indexBuffer = CreateStreamBuffer(device, BUFFERUSAGE_INDEX, sizeof(uint16) * LOVE_UINT16_MAX);\n\t}\n\n\tcreateQuadIndexBuffer();\n\tcreateFanIndexBuffer();\n\n\t// We always need a default shader.\n\tfor (int i = 0; i < Shader::STANDARD_MAX_ENUM; i++)\n\t{\n\t\tauto stype = (Shader::StandardShader) i;\n\t\tif (!Shader::standardShaders[i])\n\t\t{\n\t\t\tstd::vector<std::string> stages;\n\t\t\tShader::CompileOptions opts;\n\t\t\tstages.push_back(Shader::getDefaultCode(stype, SHADERSTAGE_VERTEX));\n\t\t\tstages.push_back(Shader::getDefaultCode(stype, SHADERSTAGE_PIXEL));\n\t\t\tShader::standardShaders[i] = newShader(stages, opts);\n\t\t}\n\t}\n\n\t// A shader should always be active, but the default shader shouldn't be\n\t// returned by getShader(), so we don't do setShader(defaultShader).\n\tif (!Shader::current)\n\t\tShader::standardShaders[Shader::STANDARD_DEFAULT]->attach();\n\n\tauto window = Module::getInstance<love::window::Window>(M_WINDOW);\n\n\tif (window != nullptr)\n\t{\n\t\twindow->setGraphics(this);\n\n\t\t// Recreate the window using the current renderer, if needed.\n\t\tif (window->isOpen())\n\t\t{\n\t\t\tint w, h;\n\t\t\tlove::window::WindowSettings settings;\n\t\t\twindow->getWindow(w, h, settings);\n\t\t\twindow->setWindow(w, h, &settings);\n\t\t}\n\t}\n}}\n\nGraphics::~Graphics()\n{ @autoreleasepool {\n\tsubmitCommandBuffer(SUBMIT_DONE);\n\tprocessCompletedCommandBuffers();\n\n\t// Wait for all active command buffers to complete before returning from\n\t// the destructor.\n\tfor (id<MTLCommandBuffer> cmd : activeCommandBuffers)\n\t{\n\t\tif (cmd.status == MTLCommandBufferStatusNotEnqueued || cmd.status == MTLCommandBufferStatusEnqueued)\n\t\t\t[cmd commit];\n\n\t\t[cmd waitUntilCompleted];\n\t}\n\n\tuniformBuffer->release();\n\tdefaultAttributesBuffer->release();\n\tpassDesc = nil;\n\tcommandQueue = nil;\n\tdevice = nil;\n\n\tfor (auto &kvp : cachedSamplers)\n\t\tCFBridgingRelease(kvp.second);\n\n\tfor (auto &kvp : cachedDepthStencilStates)\n\t\tCFBridgingRelease(kvp.second);\n\n\tgraphicsInstance = nullptr;\n}}\n\nlove::graphics::StreamBuffer *Graphics::newStreamBuffer(BufferUsage usage, size_t size)\n{\n\treturn CreateStreamBuffer(device, usage, size);\n}\n\nlove::graphics::Texture *Graphics::newTexture(const Texture::Settings &settings, const Texture::Slices *data)\n{\n\treturn new Texture(this, device, settings, data);\n}\n\nlove::graphics::Texture *Graphics::newTextureView(love::graphics::Texture *base, const Texture::ViewSettings &viewsettings)\n{\n\treturn new Texture(this, device, base, viewsettings);\n}\n\nlove::graphics::ShaderStage *Graphics::newShaderStageInternal(ShaderStageType stage, const std::string &cachekey, const std::string &source, bool gles)\n{\n\treturn new ShaderStage(this, stage, source, gles, cachekey);\n}\n\nlove::graphics::Shader *Graphics::newShaderInternal(StrongRef<love::graphics::ShaderStage> stages[SHADERSTAGE_MAX_ENUM], const Shader::CompileOptions &options)\n{\n\treturn new Shader(device, stages, options);\n}\n\nlove::graphics::Buffer *Graphics::newBuffer(const Buffer::Settings &settings, const std::vector<Buffer::DataDeclaration> &format, const void *data, size_t size, size_t arraylength)\n{\n\treturn new Buffer(this, device, settings, format, data, size, arraylength);\n}\n\nlove::graphics::GraphicsReadback *Graphics::newReadbackInternal(ReadbackMethod method, love::graphics::Buffer *buffer, size_t offset, size_t size, data::ByteData *dest, size_t destoffset)\n{\n\treturn new GraphicsReadback(this, method, buffer, offset, size, dest, destoffset);\n}\n\nlove::graphics::GraphicsReadback *Graphics::newReadbackInternal(ReadbackMethod method, love::graphics::Texture *texture, int slice, int mipmap, const Rect &rect, image::ImageData *dest, int destx, int desty)\n{\n\treturn new GraphicsReadback(this, method, texture, slice, mipmap, rect, dest, destx, desty);\n}\n\nvoid Graphics::backbufferChanged(int width, int height, int pixelwidth, int pixelheight, bool backbufferstencil, bool backbufferdepth, int msaa)\n{\n\tbool sizechanged = width != this->width || height != this->height\n\t\t|| pixelwidth != this->pixelWidth || pixelheight != this->pixelHeight;\n\n\tbool dschanged = backbufferstencil != this->backbufferHasStencil || backbufferdepth != this->backbufferHasDepth;\n\tbool msaachanged = msaa != this->requestedBackbufferMSAA;\n\n\tthis->width = width;\n\tthis->height = height;\n\tthis->pixelWidth = pixelwidth;\n\tthis->pixelHeight = pixelheight;\n\n\tthis->backbufferHasStencil = backbufferstencil;\n\tthis->backbufferHasDepth = backbufferdepth;\n\tthis->requestedBackbufferMSAA = msaa;\n\n\tif (!isRenderTargetActive())\n\t{\n\t\tdirtyRenderState |= STATEBIT_VIEWPORT | STATEBIT_SCISSOR;\n\t\tresetProjection();\n\t}\n\n\tTexture::Settings settings;\n\tsettings.width = width;\n\tsettings.height = height;\n\tsettings.dpiScale = (float)pixelheight / (float)height;\n\tsettings.msaa = getRequestedBackbufferMSAA();\n\tsettings.renderTarget = true;\n\tsettings.readable.set(false);\n\n\tif (sizechanged || msaachanged)\n\t{\n\t\tbackbufferMSAA.set(nullptr);\n\t\tif (settings.msaa > 1)\n\t\t{\n\t\t\tsettings.format = isGammaCorrect() ? PIXELFORMAT_BGRA8_sRGB : PIXELFORMAT_BGRA8_UNORM;\n\t\t\tbackbufferMSAA.set(newTexture(settings), Acquire::NORETAIN);\n\t\t}\n\t}\n\n\tif (sizechanged || msaachanged || dschanged)\n\t{\n\t\tbackbufferDepthStencil.set(nullptr);\n\t\tif (backbufferstencil || backbufferdepth)\n\t\t{\n\t\t\tif (backbufferstencil && backbufferdepth)\n\t\t\t\tsettings.format = PIXELFORMAT_DEPTH24_UNORM_STENCIL8;\n\t\t\telse if (backbufferstencil)\n\t\t\t\tsettings.format = PIXELFORMAT_STENCIL8;\n\t\t\telse if (backbufferdepth)\n\t\t\t\tsettings.format = PIXELFORMAT_DEPTH24_UNORM;\n\t\t\tbackbufferDepthStencil.set(newTexture(settings), Acquire::NORETAIN);\n\t\t}\n\t}\n}\n\nbool Graphics::setMode(void *context, int width, int height, int pixelwidth, int pixelheight, bool backbufferstencil, bool backbufferdepth, int msaa)\n{ @autoreleasepool {\n\tthis->width = width;\n\tthis->height = height;\n\tthis->metalLayer = (__bridge CAMetalLayer *) context;\n\n\tmetalLayer.device = device;\n\tmetalLayer.pixelFormat = isGammaCorrect() ? MTLPixelFormatBGRA8Unorm_sRGB : MTLPixelFormatBGRA8Unorm;\n\n\t// This is set to NO when there are pending screen captures.\n\tmetalLayer.framebufferOnly = YES;\n\n#ifdef LOVE_MACOS\n\t// Matches behaviour of SDL's OpenGL context when using the GL renderer.\n\tmetalLayer.magnificationFilter = kCAFilterNearest;\n#endif\n\n\tbackbufferChanged(width, height, pixelwidth, pixelheight, backbufferstencil, backbufferdepth, msaa);\n\n\tcreated = true;\n\n\t// Restore the graphics state.\n\trestoreState(states.back());\n\n\treturn true;\n}}\n\nvoid Graphics::unSetMode()\n{ @autoreleasepool {\n\tif (!isCreated())\n\t\treturn;\n\n\tflushBatchedDraws();\n\n\tsubmitCommandBuffer(SUBMIT_DONE);\n\n\tclearTemporaryResources();\n\n\tcreated = false;\n\tmetalLayer = nil;\n\tactiveDrawable = nil;\n}}\n\nvoid Graphics::setActive(bool enable)\n{\n\tflushBatchedDraws();\n\tactive = enable;\n}\n\nvoid Graphics::setShaderChanged()\n{\n\tdirtyRenderState |= STATEBIT_SHADER;\n\t++shaderSwitches;\n}\n\nid<MTLCommandBuffer> Graphics::useCommandBuffer()\n{\n\tif (commandBuffer == nil)\n\t{\n\t\tcommandBuffer = [commandQueue commandBuffer];\n\t\tactiveCommandBuffers.push_back(commandBuffer);\n\t}\n\n\treturn commandBuffer;\n}\n\nvoid Graphics::processCompletedCommandBuffers()\n{\n\tfor (int i = (int) activeCommandBuffers.size() - 1; i >= 0; i--)\n\t{\n\t\tauto status = activeCommandBuffers[i].status;\n\t\tif (status == MTLCommandBufferStatusCompleted || status == MTLCommandBufferStatusError)\n\t\t\tactiveCommandBuffers.erase(activeCommandBuffers.begin() + i);\n\t}\n}\n\nvoid Graphics::submitCommandBuffer(SubmitType type)\n{\n\tsubmitAllEncoders(type);\n\n\tif (commandBuffer != nil)\n\t{\n\t\t[commandBuffer commit];\n\t\tcommandBuffer = nil;\n\t}\n}\n\nvoid Graphics::submitAllEncoders(SubmitType type)\n{\n\tsubmitRenderEncoder(type);\n\tsubmitBlitEncoder();\n\tsubmitComputeEncoder();\n}\n\nstatic inline void setAttachment(const Graphics::RenderTarget &rt, MTLRenderPassAttachmentDescriptor *desc, MTLStoreAction &storeaction, bool setload = true)\n{\n\tbool isvolume = rt.texture->getTextureType() == TEXTURE_VOLUME;\n\n\tdesc.texture = getMTLRenderTarget(rt.texture);\n\tdesc.level = rt.mipmap;\n\tdesc.slice = isvolume ? 0 : rt.slice;\n\tdesc.depthPlane = isvolume ? rt.slice : 0;\n\n\tif (setload)\n\t{\n\t\t// Default to load until clear or discard is called.\n\t\tdesc.loadAction = MTLLoadActionLoad;\n\t}\n\n\tdesc.storeAction = MTLStoreActionUnknown;\n\tstoreaction = MTLStoreActionStore;\n\n\tdesc.resolveTexture = nil;\n\n\tif (rt.texture->getMSAA() > 1 && rt.texture->isReadable())\n\t{\n\t\tstoreaction = MTLStoreActionStoreAndMultisampleResolve;\n\t\tdesc.resolveTexture = getMTLTexture(rt.texture);\n\t}\n}\n\nid<MTLRenderCommandEncoder> Graphics::useRenderEncoder()\n{\n\tif (renderEncoder == nil)\n\t{\n\t\tsubmitAllEncoders(SUBMIT_STORE);\n\n\t\t// Pass desc info for non-backbuffer render targets are set up in\n\t\t// setRenderTargetsInternal.\n\t\tconst auto &rts = states.back().renderTargets;\n\t\tif (rts.getFirstTarget().texture.get() == nullptr)\n\t\t{\n\t\t\tif (activeDrawable == nil)\n\t\t\t{\n\t\t\t\t// This is reset to YES after each frame.\n\t\t\t\t// TODO: Does setting this reallocate memory?\n\t\t\t\tif (!pendingScreenshotCallbacks.empty())\n\t\t\t\t\tmetalLayer.framebufferOnly = NO;\n\n\t\t\t\tactiveDrawable = [metalLayer nextDrawable];\n\t\t\t}\n\n\t\t\tif (backbufferMSAA.get())\n\t\t\t{\n\t\t\t\tattachmentStoreActions.color[0] = MTLStoreActionMultisampleResolve;\n\t\t\t\tpassDesc.colorAttachments[0].texture = getMTLRenderTarget(backbufferMSAA);\n\t\t\t\tpassDesc.colorAttachments[0].resolveTexture = activeDrawable.texture;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tattachmentStoreActions.color[0] = MTLStoreActionStore;\n\t\t\t\tpassDesc.colorAttachments[0].texture = activeDrawable.texture;\n\t\t\t\tpassDesc.colorAttachments[0].resolveTexture = nil;\n\t\t\t}\n\n\t\t\tpassDesc.colorAttachments[0].storeAction = MTLStoreActionUnknown;\n\t\t\tpassDesc.colorAttachments[0].level = 0;\n\t\t\tpassDesc.colorAttachments[0].slice = 0;\n\t\t\tpassDesc.colorAttachments[0].depthPlane = 0;\n\n\t\t\tRenderTarget rt(backbufferDepthStencil);\n\t\t\tif (rt.texture != nullptr && isPixelFormatDepth(rt.texture->getPixelFormat()))\n\t\t\t\tsetAttachment(rt, passDesc.depthAttachment, attachmentStoreActions.depth, false);\n\t\t\tif (rt.texture != nullptr && isPixelFormatStencil(rt.texture->getPixelFormat()))\n\t\t\t\tsetAttachment(rt, passDesc.stencilAttachment, attachmentStoreActions.stencil, false);\n\t\t\tattachmentStoreActions.depth = MTLStoreActionDontCare;\n\t\t\tattachmentStoreActions.stencil = MTLStoreActionDontCare;\n\n\t\t\tauto &key = lastRenderPipelineKey;\n\t\t\tkey.colorRenderTargetFormats = isGammaCorrect() ? PIXELFORMAT_BGRA8_sRGB : PIXELFORMAT_BGRA8_UNORM;\n\t\t\tif (backbufferDepthStencil.get())\n\t\t\t\tkey.depthStencilFormat = backbufferDepthStencil->getPixelFormat();\n\t\t\telse\n\t\t\t\tkey.depthStencilFormat = PIXELFORMAT_UNKNOWN;\n\t\t\tkey.msaa = backbufferMSAA ? (uint8) backbufferMSAA->getMSAA() : 1;\n\t\t}\n\n\t\trenderEncoder = [useCommandBuffer() renderCommandEncoderWithDescriptor:passDesc];\n\n\t\trenderBindings = {};\n\n\t\tid<MTLBuffer> defaultbuffer = getMTLBuffer(defaultAttributesBuffer);\n\t\tsetBuffer(renderEncoder, renderBindings, SHADERSTAGE_VERTEX, DEFAULT_VERTEX_BUFFER_BINDING, defaultbuffer, 0);\n\n\t\tdirtyRenderState = STATEBIT_ALL;\n\t\tlastCullMode = CULL_MAX_ENUM;\n\t}\n\n\treturn renderEncoder;\n}\n\nvoid Graphics::submitRenderEncoder(SubmitType type)\n{\n\tif (renderEncoder != nil)\n\t{\n\t\tbool store = type == SUBMIT_STORE;\n\t\tconst auto &actions = attachmentStoreActions;\n\t\tconst auto &rts = states.back().renderTargets;\n\t\tbool isbackbuffer = rts.getFirstTarget().texture.get() == nullptr;\n\n\t\tif (isbackbuffer)\n\t\t\t[renderEncoder setColorStoreAction:(store ? MTLStoreActionStore : actions.color[0]) atIndex:0];\n\n\t\tfor (size_t i = 0; i < rts.colors.size(); i++)\n\t\t\t[renderEncoder setColorStoreAction:(store ? MTLStoreActionStore : actions.color[i]) atIndex:i];\n\n\t\tlove::graphics::Texture *ds = rts.depthStencil.texture.get();\n\t\tif (isbackbuffer)\n\t\t\tds = backbufferDepthStencil;\n\n\t\tif ((rts.temporaryRTFlags & TEMPORARY_RT_DEPTH) != 0 || (ds != nullptr && isPixelFormatDepth(ds->getPixelFormat())))\n\t\t\t[renderEncoder setDepthStoreAction:store ? MTLStoreActionStore : actions.depth];\n\n\t\tif ((rts.temporaryRTFlags & TEMPORARY_RT_STENCIL) != 0 || (ds != nullptr && isPixelFormatStencil(ds->getPixelFormat())))\n\t\t\t[renderEncoder setStencilStoreAction:store ? MTLStoreActionStore : actions.stencil];\n\n\t\t[renderEncoder endEncoding];\n\t\trenderEncoder = nil;\n\n\t\t// Reset actions to load. The next clear/discard/etc will set more\n\t\t// appropriate actions if necessary.\n\t\tfor (int i = 0; i < MAX_COLOR_RENDER_TARGETS; i++)\n\t\t{\n\t\t\tpassDesc.colorAttachments[i].loadAction = MTLLoadActionLoad;\n\t\t\tif (type == SUBMIT_DONE)\n\t\t\t{\n\t\t\t\tpassDesc.colorAttachments[i].texture = nil;\n\t\t\t\tpassDesc.colorAttachments[i].resolveTexture = nil;\n\t\t\t}\n\t\t}\n\n\t\tpassDesc.depthAttachment.loadAction = MTLLoadActionLoad;\n\t\tpassDesc.stencilAttachment.loadAction = MTLLoadActionLoad;\n\t\tif (type == SUBMIT_DONE)\n\t\t{\n\t\t\tpassDesc.depthAttachment.texture = nil;\n\t\t\tpassDesc.depthAttachment.resolveTexture = nil;\n\t\t\tpassDesc.stencilAttachment.texture = nil;\n\t\t\tpassDesc.stencilAttachment.resolveTexture = nil;\n\t\t}\n\t}\n}\n\nid<MTLBlitCommandEncoder> Graphics::useBlitEncoder()\n{\n\tif (blitEncoder == nil)\n\t{\n\t\tsubmitAllEncoders(SUBMIT_STORE);\n\t\tblitEncoder = [useCommandBuffer() blitCommandEncoder];\n\t}\n\n\treturn blitEncoder;\n}\n\nvoid Graphics::submitBlitEncoder()\n{\n\tif (blitEncoder != nil)\n\t{\n\t\t[blitEncoder endEncoding];\n\t\tblitEncoder = nil;\n\t}\n}\n\nid<MTLComputeCommandEncoder> Graphics::useComputeEncoder()\n{\n\tif (computeEncoder == nil)\n\t{\n\t\tsubmitAllEncoders(SUBMIT_STORE);\n\t\tcomputeEncoder = [useCommandBuffer() computeCommandEncoder];\n\t\trenderBindings = {};\n\t}\n\n\treturn computeEncoder;\n}\n\nvoid Graphics::submitComputeEncoder()\n{\n\tif (computeEncoder != nil)\n\t{\n\t\t[computeEncoder endEncoding];\n\t\tcomputeEncoder = nil;\n\t}\n}\n\nstatic bool isClampOne(SamplerState::WrapMode w)\n{\n\treturn w == SamplerState::WRAP_CLAMP_ONE;\n}\n\nid<MTLSamplerState> Graphics::getCachedSampler(const SamplerState &s)\n{ @autoreleasepool {\n\tuint64 key = s.toKey();\n\n\tauto it = cachedSamplers.find(key);\n\tif (it != cachedSamplers.end())\n\t\treturn (__bridge id<MTLSamplerState>) it->second;\n\n\tMTLSamplerDescriptor *desc = [MTLSamplerDescriptor new];\n\n\tdesc.minFilter = getMTLSamplerFilter(s.minFilter);\n\tdesc.magFilter = getMTLSamplerFilter(s.magFilter);\n\tdesc.mipFilter = getMTLSamplerMipFilter(s.mipmapFilter);\n\tdesc.maxAnisotropy = std::max(1.0f, std::min((float)s.maxAnisotropy, 16.0f));\n\n\tdesc.sAddressMode = getMTLSamplerAddressMode(s.wrapU);\n\tdesc.tAddressMode = getMTLSamplerAddressMode(s.wrapV);\n\tdesc.rAddressMode = getMTLSamplerAddressMode(s.wrapW);\n\n\tif (isClampOne(s.wrapU) || isClampOne(s.wrapV) || isClampOne(s.wrapW))\n\t{\n\t\tif (capabilities.features[FEATURE_CLAMP_ONE])\n\t\t\tdesc.borderColor = MTLSamplerBorderColorOpaqueWhite;\n\t\telse\n\t\t{\n\t\t\tif (isClampOne(s.wrapU))\n\t\t\t\tdesc.sAddressMode = MTLSamplerAddressModeClampToZero;\n\t\t\tif (isClampOne(s.wrapV))\n\t\t\t\tdesc.tAddressMode = MTLSamplerAddressModeClampToZero;\n\t\t\tif (isClampOne(s.wrapW))\n\t\t\t\tdesc.rAddressMode = MTLSamplerAddressModeClampToZero;\n\t\t}\n\t}\n\n\tdesc.lodMinClamp = s.minLod;\n\tdesc.lodMaxClamp = s.maxLod;\n\n\t// This isn't supported on some older iOS devices. Texture code checks for support.\n\tif (s.depthSampleMode.hasValue)\n\t\tdesc.compareFunction = getMTLCompareFunction(getReversedCompareMode(s.depthSampleMode.value));\n\n\tid<MTLSamplerState> sampler = [device newSamplerStateWithDescriptor:desc];\n\n\tif (sampler != nil)\n\t\tcachedSamplers[key] = (void *) CFBridgingRetain(sampler);\n\n\treturn sampler;\n}}\n\nbool Graphics::isDepthCompareSamplerSupported() const\n{\n\treturn families.mac[1] || families.macCatalyst[1] || families.apple[3];\n}\n\nid<MTLDepthStencilState> Graphics::getCachedDepthStencilState(const DepthState &depth, const StencilState &stencil)\n{\n\tuint64 key = (depth.compare << 0) | ((uint32)depth.write << 8)\n\t\t| (stencil.action << 16) | (stencil.compare << 24)\n\t\t| ((uint64)std::max(0, std::min(255, stencil.value)) << 32)\n\t\t| ((uint64)std::min(255u, stencil.readMask) << 40)\n\t\t| ((uint64)std::min(255u, stencil.writeMask) << 48);\n\n\tauto it = cachedDepthStencilStates.find(key);\n\tif (it != cachedDepthStencilStates.end())\n\t\treturn (__bridge id<MTLDepthStencilState>) it->second;\n\n\tMTLStencilDescriptor *stencildesc = [MTLStencilDescriptor new];\n\n\t/**\n\t * GPUs do the comparison opposite to what makes sense for love's API. For\n\t * example, if the compare function is GREATER then the stencil test will\n\t * pass if the reference value is greater than the value in the stencil\n\t * buffer. With our API it's more intuitive to assume that\n\t * setStencilState(STENCIL_KEEP, COMPARE_GREATER, 4) will make it pass if the\n\t * stencil buffer has a value greater than 4.\n\t **/\n\tstencildesc.stencilCompareFunction = getMTLCompareFunction(getReversedCompareMode(stencil.compare));\n\tstencildesc.stencilFailureOperation = MTLStencilOperationKeep;\n\tstencildesc.depthFailureOperation = MTLStencilOperationKeep;\n\tstencildesc.depthStencilPassOperation = getMTLStencilOperation(stencil.action);\n\tstencildesc.readMask = stencil.readMask;\n\tstencildesc.writeMask = stencil.writeMask;\n\n\tMTLDepthStencilDescriptor *desc = [MTLDepthStencilDescriptor new];\n\n\tdesc.depthCompareFunction = getMTLCompareFunction(depth.compare);\n\tdesc.depthWriteEnabled = depth.write;\n\tdesc.frontFaceStencil = stencildesc;\n\tdesc.backFaceStencil = stencildesc;\n\n\tid<MTLDepthStencilState> mtlstate = [device newDepthStencilStateWithDescriptor:desc];\n\n\tif (mtlstate != nil)\n\t\tcachedDepthStencilStates[key] = (void *) CFBridgingRetain(mtlstate);\n\n\treturn mtlstate;\n}\n\nvoid Graphics::applyRenderState(id<MTLRenderCommandEncoder> encoder, VertexAttributesID attributesID)\n{\n\tconst uint32 pipelineStateBits = STATEBIT_SHADER | STATEBIT_BLEND | STATEBIT_COLORMASK;\n\n\tuint32 dirtyState = dirtyRenderState;\n\tconst auto &state = states.back();\n\n\tif (dirtyState & (STATEBIT_VIEWPORT | STATEBIT_SCISSOR))\n\t{\n\t\tint rtw = 0;\n\t\tint rth = 0;\n\n\t\tconst auto &rt = state.renderTargets.getFirstTarget();\n\t\tif (rt.texture.get())\n\t\t{\n\t\t\trtw = rt.texture->getPixelWidth(rt.mipmap);\n\t\t\trth = rt.texture->getPixelHeight(rt.mipmap);\n\t\t}\n\t\telse\n\t\t{\n\t\t\trtw = getPixelWidth();\n\t\t\trth = getPixelHeight();\n\t\t}\n\n\t\tif (dirtyState & STATEBIT_VIEWPORT)\n\t\t{\n\t\t\tMTLViewport view;\n\t\t\tview.originX = 0.0;\n\t\t\tview.originY = 0.0;\n\t\t\tview.width = rtw;\n\t\t\tview.height = rth;\n\t\t\tview.znear = 0.0;\n\t\t\tview.zfar = 1.0;\n\t\t\t[encoder setViewport:view];\n\t\t}\n\n\t\tMTLScissorRect rect = {0, 0, (NSUInteger)rtw, (NSUInteger)rth};\n\n\t\tif (state.scissor)\n\t\t{\n\t\t\tdouble dpiscale = getCurrentDPIScale();\n\t\t\trect.x = (NSUInteger)(state.scissorRect.x*dpiscale);\n\t\t\trect.y = (NSUInteger)(state.scissorRect.y*dpiscale);\n\t\t\trect.width = (NSUInteger)(state.scissorRect.w*dpiscale);\n\t\t\trect.height = (NSUInteger)(state.scissorRect.h*dpiscale);\n\n\t\t\tif (rtw > 0 && (int)rect.x >= rtw)\n\t\t\t\trect.x = rtw - 1;\n\t\t\tif (rth > 0 && (int)rect.y >= rth)\n\t\t\t\trect.y = rth - 1;\n\n\t\t\trect.width = std::min(rect.width, rtw - rect.x);\n\t\t\trect.height = std::min(rect.height, rth - rect.y);\n\t\t}\n\n\t\t[encoder setScissorRect:rect];\n\t}\n\n\tif (dirtyState & STATEBIT_FACEWINDING)\n\t{\n\t\tauto winding = state.winding == WINDING_CCW ? MTLWindingCounterClockwise : MTLWindingClockwise;\n\t\t[encoder setFrontFacingWinding:winding];\n\t}\n\n\tif (dirtyState & STATEBIT_WIREFRAME)\n\t{\n\t\tauto mode = state.wireframe ? MTLTriangleFillModeLines : MTLTriangleFillModeFill;\n\t\t[encoder setTriangleFillMode:mode];\n\t}\n\n\tif (dirtyState & STATEBIT_CULLMODE)\n\t{\n\t\tauto mode = lastCullMode == CULL_BACK ? MTLCullModeBack :\n\t\t\tlastCullMode == CULL_FRONT ? MTLCullModeFront : MTLCullModeNone;\n\t\t[encoder setCullMode:mode];\n\t}\n\n\tif ((dirtyState & pipelineStateBits) != 0 || attributesID != lastRenderPipelineKey.vertexAttributesID)\n\t{\n\t\tauto &key = lastRenderPipelineKey;\n\n\t\tkey.vertexAttributesID = attributesID;\n\n\t\tShader *shader = (Shader *) Shader::current;\n\t\tid<MTLRenderPipelineState> pipeline = nil;\n\n\t\tif (shader)\n\t\t{\n\t\t\tkey.blendStateKey = state.blend.toKey();\n\t\t\tkey.colorChannelMask = state.colorMask;\n\n\t\t\tpipeline = shader->getCachedRenderPipeline(this, key);\n\t\t}\n\n\t\t[encoder setRenderPipelineState:pipeline];\n\t}\n\n\tif (dirtyState & (STATEBIT_DEPTH | STATEBIT_STENCIL))\n\t{\n\t\tDepthState depth;\n\t\tdepth.compare = state.depthTest;\n\t\tdepth.write = state.depthWrite;\n\n\t\tid<MTLDepthStencilState> mtlstate = getCachedDepthStencilState(depth, state.stencil);\n\n\t\t[encoder setDepthStencilState:mtlstate];\n\t}\n\n\tif (dirtyState & STATEBIT_STENCIL)\n\t\t[encoder setStencilReferenceValue:state.stencil.value];\n\n\tdirtyRenderState = 0;\n}\n\nbool Graphics::applyShaderUniforms(id<MTLComputeCommandEncoder> encoder, love::graphics::Shader *shader)\n{\n\tShader *s = (Shader *)shader;\n\n#if defined(LOVE_MACOS) || TARGET_OS_SIMULATOR || TARGET_OS_MACCATALYST\n\tsize_t alignment = 256;\n#else\n\tsize_t alignment = 16;\n#endif\n\n\tsize_t size = s->getLocalUniformBufferSize();\n\tuint8 *bufferdata = s->getLocalUniformBufferData();\n\n\tif (uniformBuffer->getSize() < uniformBufferOffset + size)\n\t{\n\t\tsize_t newsize = uniformBuffer->getSize() * 2;\n\t\tif (uniformBufferOffset > 0)\n\t\t\tuniformBuffer->nextFrame();\n\t\tuniformBuffer->release();\n\t\tuniformBuffer = CreateStreamBuffer(device, BUFFERUSAGE_UNIFORM, newsize);\n\t\tuniformBufferData = {};\n\t\tuniformBufferOffset = 0;\n\t}\n\n\tif (uniformBufferData.data == nullptr)\n\t{\n\t\tuniformBufferData = uniformBuffer->map(uniformBuffer->getSize());\n\t\tuniformBufferGPUStart = uniformBuffer->getGPUReadOffset();\n\t}\n\n\tmemcpy(uniformBufferData.data + uniformBufferOffset, bufferdata, size);\n\n\tid<MTLBuffer> buffer = getMTLBuffer(uniformBuffer);\n\tint uniformindex = Shader::getUniformBufferBinding();\n\n\tauto &bindings = renderBindings;\n\tsetBuffer(encoder, bindings, uniformindex, buffer, uniformBufferGPUStart + uniformBufferOffset);\n\n\tuniformBufferOffset += alignUp(size, alignment);\n\n\tbool allWritableVariablesSet = true;\n\n\tfor (const Shader::TextureBinding &b : s->getTextureBindings())\n\t{\n\t\tid<MTLTexture> texture = b.texture;\n\t\tauto samplertex = b.samplerTexture;\n\n\t\tuint8 texindex = b.textureStages[SHADERSTAGE_COMPUTE];\n\t\tuint8 sampindex = b.samplerStages[SHADERSTAGE_COMPUTE];\n\n\t\tif (texindex != LOVE_UINT8_MAX)\n\t\t{\n\t\t\tsetTexture(encoder, bindings, texindex, texture);\n\t\t\tif ((b.access & Shader::ACCESS_WRITE) != 0 && texture == nil)\n\t\t\t\tallWritableVariablesSet = false;\n\t\t}\n\n\t\tif (sampindex != LOVE_UINT8_MAX)\n\t\t\tsetSampler(encoder, bindings, sampindex, samplertex);\n\t}\n\n\tfor (const Shader::BufferBinding &b : s->getBufferBindings())\n\t{\n\t\tuint8 index = b.stages[SHADERSTAGE_COMPUTE];\n\t\tif (index != LOVE_UINT8_MAX)\n\t\t{\n\t\t\tsetBuffer(encoder, bindings, index, b.buffer, 0);\n\t\t\tif ((b.access & Shader::ACCESS_WRITE) != 0 && b.buffer == nil)\n\t\t\t\tallWritableVariablesSet = false;\n\t\t}\n\t}\n\n\treturn allWritableVariablesSet;\n}\n\nvoid Graphics::applyShaderUniforms(id<MTLRenderCommandEncoder> renderEncoder, love::graphics::Shader *shader, love::graphics::Texture *maintex)\n{\n\tShader *s = (Shader *)shader;\n\n#if defined(LOVE_MACOS) || TARGET_OS_SIMULATOR || TARGET_OS_MACCATALYST\n\tsize_t alignment = 256;\n#else\n\tsize_t alignment = 16;\n#endif\n\n\tsize_t size = s->getLocalUniformBufferSize();\n\tuint8 *bufferdata = s->getLocalUniformBufferData();\n\n\tauto builtins = (Shader::BuiltinUniformData *) (bufferdata + s->getBuiltinUniformDataOffset());\n\n\tbuiltins->transformMatrix = getTransform();\n\tbuiltins->projectionMatrix = getDeviceProjection();\n\n\tbuiltins->scaleParams.x = (float) getCurrentDPIScale();\n\tbuiltins->scaleParams.y = getPointSize();\n\n\tuint32 flags = Shader::CLIP_TRANSFORM_Z_NEG1_1_TO_0_1;\n\tbuiltins->clipSpaceParams = Shader::computeClipSpaceParams(flags);\n\n\tbuiltins->screenSizeParams = Vector4(getPixelWidth(), getPixelHeight(), 1.0f, 0.0f);\n\tauto rt = states.back().renderTargets.getFirstTarget();\n\tif (rt.texture.get())\n\t{\n\t\tbuiltins->screenSizeParams.x = rt.texture->getPixelWidth(rt.mipmap);\n\t\tbuiltins->screenSizeParams.y = rt.texture->getPixelHeight(rt.mipmap);\n\t}\n\n\tbuiltins->constantColor = getColor();\n\tgammaCorrectColor(builtins->constantColor);\n\n\tif (uniformBuffer->getSize() < uniformBufferOffset + size)\n\t{\n\t\tsize_t newsize = uniformBuffer->getSize() * 2;\n\t\tif (uniformBufferOffset > 0)\n\t\t\tuniformBuffer->nextFrame();\n\t\tuniformBuffer->release();\n\t\tuniformBuffer = CreateStreamBuffer(device, BUFFERUSAGE_UNIFORM, newsize);\n\t\tuniformBufferData = {};\n\t\tuniformBufferOffset = 0;\n\t}\n\n\tif (uniformBufferData.data == nullptr)\n\t{\n\t\tuniformBufferData = uniformBuffer->map(uniformBuffer->getSize());\n\t\tuniformBufferGPUStart = uniformBuffer->getGPUReadOffset();\n\t}\n\n\tmemcpy(uniformBufferData.data + uniformBufferOffset, bufferdata, size);\n\n\tid<MTLBuffer> buffer = getMTLBuffer(uniformBuffer);\n\tint uniformindex = Shader::getUniformBufferBinding();\n\n\tauto &bindings = renderBindings;\n\tsetBuffer(renderEncoder, bindings, SHADERSTAGE_VERTEX, uniformindex, buffer, uniformBufferGPUStart + uniformBufferOffset);\n\tsetBuffer(renderEncoder, bindings, SHADERSTAGE_PIXEL, uniformindex, buffer, uniformBufferGPUStart + uniformBufferOffset);\n\n\tuniformBufferOffset += alignUp(size, alignment);\n\n\tfor (const Shader::TextureBinding &b : s->getTextureBindings())\n\t{\n\t\tid<MTLTexture> texture = b.texture;\n\t\tauto samplertex = b.samplerTexture;\n\n\t\tif (b.isMainTexture)\n\t\t{\n\t\t\ttexture = getMTLTexture(maintex);\n\t\t\tsamplertex = maintex;\n\t\t}\n\n\t\tuint8 texindex = b.textureStages[SHADERSTAGE_VERTEX];\n\t\tuint8 sampindex = b.samplerStages[SHADERSTAGE_VERTEX];\n\n\t\tif (texindex != LOVE_UINT8_MAX)\n\t\t\tsetTexture(renderEncoder, bindings, SHADERSTAGE_VERTEX, texindex, texture);\n\t\tif (sampindex != LOVE_UINT8_MAX)\n\t\t\tsetSampler(renderEncoder, bindings, SHADERSTAGE_VERTEX, sampindex, samplertex);\n\n\t\ttexindex = b.textureStages[SHADERSTAGE_PIXEL];\n\t\tsampindex = b.samplerStages[SHADERSTAGE_PIXEL];\n\n\t\tif (texindex != LOVE_UINT8_MAX)\n\t\t\tsetTexture(renderEncoder, bindings, SHADERSTAGE_PIXEL, texindex, texture);\n\t\tif (sampindex != LOVE_UINT8_MAX)\n\t\t\tsetSampler(renderEncoder, bindings, SHADERSTAGE_PIXEL, sampindex, samplertex);\n\t}\n\n\tfor (const Shader::BufferBinding &b : s->getBufferBindings())\n\t{\n\t\tuint8 index = b.stages[SHADERSTAGE_VERTEX];\n\t\tif (index != LOVE_UINT8_MAX)\n\t\t\tsetBuffer(renderEncoder, bindings, SHADERSTAGE_VERTEX, index, b.buffer, 0);\n\t\tindex = b.stages[SHADERSTAGE_PIXEL];\n\t\tif (index != LOVE_UINT8_MAX)\n\t\t\tsetBuffer(renderEncoder, bindings, SHADERSTAGE_PIXEL, index, b.buffer, 0);\n\t}\n}\n\nstatic void setVertexBuffers(id<MTLRenderCommandEncoder> encoder, love::graphics::Shader *shader, const BufferBindings *buffers, Graphics::RenderEncoderBindings &bindings)\n{\n\tShader *s = (Shader *)shader;\n\tint firstBinding = s->getFirstVertexBufferBinding();\n\tuint32 allbits = buffers->useBits;\n\tuint32 i = 0;\n\twhile (allbits)\n\t{\n\t\tuint32 bit = 1u << i;\n\n\t\tif (buffers->useBits & bit)\n\t\t{\n\t\t\tauto b = buffers->info[i];\n\t\t\tid<MTLBuffer> buffer = getMTLBuffer(b.buffer);\n\t\t\tsetBuffer(encoder, bindings, SHADERSTAGE_VERTEX, firstBinding + i, buffer, b.offset);\n\t\t}\n\n\t\ti++;\n\t\tallbits >>= 1;\n\t}\n}\n\nvoid Graphics::draw(const DrawCommand &cmd)\n{ @autoreleasepool {\n\tid<MTLRenderCommandEncoder> encoder = useRenderEncoder();\n\n\tif (cmd.cullMode != lastCullMode)\n\t{\n\t\tlastCullMode = cmd.cullMode;\n\t\tdirtyRenderState |= STATEBIT_CULLMODE;\n\t}\n\n\tapplyRenderState(encoder, cmd.attributesID);\n\tapplyShaderUniforms(encoder, Shader::current, cmd.texture);\n\n\tsetVertexBuffers(encoder, Shader::current, cmd.buffers, renderBindings);\n\n\tif (cmd.indirectBuffer != nullptr)\n\t{\n\t\t[encoder drawPrimitives:getMTLPrimitiveType(cmd.primitiveType)\n\t\t\t\t indirectBuffer:getMTLBuffer(cmd.indirectBuffer)\n\t\t   indirectBufferOffset:cmd.indirectBufferOffset];\n\t}\n\telse\n\t{\n\t\t[encoder drawPrimitives:getMTLPrimitiveType(cmd.primitiveType)\n\t\t\t\t\tvertexStart:cmd.vertexStart\n\t\t\t\t\tvertexCount:cmd.vertexCount\n\t\t\t\t  instanceCount:cmd.instanceCount];\n\t}\n\n\t++drawCalls;\n}}\n\nvoid Graphics::draw(const DrawIndexedCommand &cmd)\n{ @autoreleasepool {\n\tid<MTLRenderCommandEncoder> encoder = useRenderEncoder();\n\n\tif (cmd.cullMode != lastCullMode)\n\t{\n\t\tlastCullMode = cmd.cullMode;\n\t\tdirtyRenderState |= STATEBIT_CULLMODE;\n\t}\n\n\tapplyRenderState(encoder, cmd.attributesID);\n\tapplyShaderUniforms(encoder, Shader::current, cmd.texture);\n\n\tsetVertexBuffers(encoder, Shader::current, cmd.buffers, renderBindings);\n\n\tauto indexType = cmd.indexType == INDEX_UINT32 ? MTLIndexTypeUInt32 : MTLIndexTypeUInt16;\n\n\tif (cmd.indirectBuffer != nullptr)\n\t{\n\t\t[encoder drawIndexedPrimitives:getMTLPrimitiveType(cmd.primitiveType)\n\t\t\t\t\t\t\t indexType:indexType\n\t\t\t\t\t\t   indexBuffer:getMTLBuffer(cmd.indexBuffer)\n\t\t\t\t\t indexBufferOffset:cmd.indexBufferOffset\n\t\t\t\t\t\tindirectBuffer:getMTLBuffer(cmd.indirectBuffer)\n\t\t\t\t  indirectBufferOffset:cmd.indexBufferOffset];\n\t}\n\telse\n\t{\n\t\t[encoder drawIndexedPrimitives:getMTLPrimitiveType(cmd.primitiveType)\n\t\t\t\t\t\t\tindexCount:cmd.indexCount\n\t\t\t\t\t\t\t indexType:indexType\n\t\t\t\t\t\t   indexBuffer:getMTLBuffer(cmd.indexBuffer)\n\t\t\t\t\t indexBufferOffset:cmd.indexBufferOffset\n\t\t\t\t\t\t instanceCount:cmd.instanceCount];\n\t}\n\n\t++drawCalls;\n}}\n\nstatic inline void advanceVertexOffsets(const VertexAttributes &attributes, BufferBindings &buffers, int vertexcount)\n{\n\t// TODO: Figure out a better way to avoid touching the same buffer multiple\n\t// times, if multiple attributes share the buffer.\n\tuint32 touchedbuffers = 0;\n\n\tfor (unsigned int i = 0; i < VertexAttributes::MAX; i++)\n\t{\n\t\tif (!attributes.isEnabled(i))\n\t\t\tcontinue;\n\n\t\tauto &attrib = attributes.attribs[i];\n\n\t\tuint32 bufferbit = 1u << attrib.bufferIndex;\n\t\tif ((touchedbuffers & bufferbit) == 0)\n\t\t{\n\t\t\ttouchedbuffers |= bufferbit;\n\t\t\tconst auto &layout = attributes.bufferLayouts[attrib.bufferIndex];\n\t\t\tbuffers.info[attrib.bufferIndex].offset += layout.stride * vertexcount;\n\t\t}\n\t}\n}\n\nvoid Graphics::drawQuads(int start, int count, VertexAttributesID attributesID, const BufferBindings &buffers, love::graphics::Texture *texture)\n{ @autoreleasepool {\n\tconst int MAX_VERTICES_PER_DRAW = LOVE_UINT16_MAX;\n\tconst int MAX_QUADS_PER_DRAW    = MAX_VERTICES_PER_DRAW / 4;\n\n\tid<MTLRenderCommandEncoder> encoder = useRenderEncoder();\n\n\tif (lastCullMode != CULL_NONE)\n\t{\n\t\tlastCullMode = CULL_NONE;\n\t\tdirtyRenderState |= STATEBIT_CULLMODE;\n\t}\n\n\tapplyRenderState(encoder, attributesID);\n\tapplyShaderUniforms(encoder, Shader::current, texture);\n\n\tid<MTLBuffer> ib = getMTLBuffer(quadIndexBuffer);\n\n\t// Some older iOS devices don't support base vertex rendering.\n\tif (families.apple[3] || families.mac[1] || families.macCatalyst[1])\n\t{\n\t\tsetVertexBuffers(encoder, Shader::current, &buffers, renderBindings);\n\n\t\tint basevertex = start * 4;\n\n\t\tfor (int quadindex = 0; quadindex < count; quadindex += MAX_QUADS_PER_DRAW)\n\t\t{\n\t\t\tint quadcount = std::min(MAX_QUADS_PER_DRAW, count - quadindex);\n\n\t\t\t[encoder drawIndexedPrimitives:MTLPrimitiveTypeTriangle\n\t\t\t\t\t\t\t\tindexCount:quadcount * 6\n\t\t\t\t\t\t\t\t indexType:MTLIndexTypeUInt16\n\t\t\t\t\t\t\t   indexBuffer:ib\n\t\t\t\t\t\t indexBufferOffset:0\n\t\t\t\t\t\t\t instanceCount:1\n\t\t\t\t\t\t\t\tbaseVertex:basevertex\n\t\t\t\t\t\t\t  baseInstance:0];\n\n\t\t\t++drawCalls;\n\t\t\tbasevertex += quadcount * 4;\n\t\t}\n\t}\n\telse\n\t{\n\t\tVertexAttributes attributes;\n\t\tfindVertexAttributes(attributesID, attributes);\n\n\t\tBufferBindings bufferscopy = buffers;\n\t\tif (start > 0)\n\t\t\tadvanceVertexOffsets(attributes, bufferscopy, start * 4);\n\n\t\tfor (int quadindex = 0; quadindex < count; quadindex += MAX_QUADS_PER_DRAW)\n\t\t{\n\t\t\tsetVertexBuffers(encoder, Shader::current, &bufferscopy, renderBindings);\n\n\t\t\tint quadcount = std::min(MAX_QUADS_PER_DRAW, count - quadindex);\n\n\t\t\t[encoder drawIndexedPrimitives:MTLPrimitiveTypeTriangle\n\t\t\t\t\t\t\t\tindexCount:quadcount * 6\n\t\t\t\t\t\t\t\t indexType:MTLIndexTypeUInt16\n\t\t\t\t\t\t\t   indexBuffer:ib\n\t\t\t\t\t\t indexBufferOffset:0];\n\n\t\t\t++drawCalls;\n\n\t\t\tif (count > MAX_QUADS_PER_DRAW)\n\t\t\t\tadvanceVertexOffsets(attributes, bufferscopy, quadcount * 4);\n\t\t}\n\t}\n}}\n\nbool Graphics::dispatch(love::graphics::Shader *s, int x, int y, int z)\n{ @autoreleasepool {\n\tauto shader = (Shader *) s;\n\n\tint tX, tY, tZ;\n\tshader->getLocalThreadgroupSize(&tX, &tY, &tZ);\n\n\tid<MTLComputePipelineState> pipeline = shader->getComputePipeline();\n\tif (pipeline == nil)\n\t\treturn false;\n\n\tid<MTLComputeCommandEncoder> computeEncoder = useComputeEncoder();\n\n\tif (!applyShaderUniforms(computeEncoder, shader))\n\t\treturn false;\n\n\t// TODO: track this state?\n\t[computeEncoder setComputePipelineState:pipeline];\n\n\t[computeEncoder dispatchThreadgroups:MTLSizeMake(x, y, z)\n\t\t\t\t   threadsPerThreadgroup:MTLSizeMake(tX, tY, tZ)];\n\n\treturn true;\n}}\n\nbool Graphics::dispatch(love::graphics::Shader *s, love::graphics::Buffer *indirectargs, size_t argsoffset)\n{\n\tauto shader = (Shader *) s;\n\n\tint tX, tY, tZ;\n\tshader->getLocalThreadgroupSize(&tX, &tY, &tZ);\n\n\tid<MTLComputePipelineState> pipeline = shader->getComputePipeline();\n\tif (pipeline == nil)\n\t\treturn false;\n\n\tid<MTLComputeCommandEncoder> computeEncoder = useComputeEncoder();\n\n\tif (!applyShaderUniforms(computeEncoder, shader))\n\t\treturn false;\n\n\t// TODO: track this state?\n\t[computeEncoder setComputePipelineState:pipeline];\n\n\t[computeEncoder dispatchThreadgroupsWithIndirectBuffer:getMTLBuffer(indirectargs)\n\t\t\t\t\t\t\t\t\t  indirectBufferOffset:argsoffset\n\t\t\t\t\t\t\t\t\t threadsPerThreadgroup:MTLSizeMake(tX, tY, tZ)];\n\n\treturn true;\n}\n\nvoid Graphics::setRenderTargetsInternal(const RenderTargets &rts, int /*pixelw*/, int /*pixelh*/, bool /*hasSRGBtexture*/)\n{ @autoreleasepool {\n\tendPass(false);\n\n\tbool isbackbuffer = rts.getFirstTarget().texture == nullptr;\n\n\t// Set up render pass descriptor for the next useRenderEncoder call.\n\t// The backbuffer will be set up in useRenderEncoder rather than here.\n\tfor (size_t i = 0; i < rts.colors.size(); i++)\n\t{\n\t\tauto desc = passDesc.colorAttachments[i];\n\t\tsetAttachment(rts.colors[i], desc, attachmentStoreActions.color[i]);\n\t\tpassDesc.colorAttachments[i] = desc;\n\t}\n\n\tfor (size_t i = rts.colors.size(); i < MAX_COLOR_RENDER_TARGETS; i++)\n\t{\n\t\tpassDesc.colorAttachments[i] = nil;\n\t\tpassDesc.colorAttachments[i].loadAction = MTLLoadActionLoad;\n\t}\n\n\tpassDesc.depthAttachment = nil;\n\tpassDesc.depthAttachment.loadAction = MTLLoadActionLoad;\n\tpassDesc.stencilAttachment = nil;\n\tpassDesc.stencilAttachment.loadAction = MTLLoadActionLoad;\n\n\tauto ds = rts.depthStencil.texture;\n\tif (isbackbuffer && ds == nullptr)\n\t\tds = backbufferDepthStencil;\n\n\tPixelFormat dsformat = PIXELFORMAT_UNKNOWN;\n\tif (ds != nullptr)\n\t{\n\t\tRenderTarget rt = rts.depthStencil;\n\t\trt.texture = ds;\n\t\tdsformat = ds->getPixelFormat();\n\n\t\tif (isPixelFormatDepth(dsformat))\n\t\t\tsetAttachment(rt, passDesc.depthAttachment, attachmentStoreActions.depth);\n\n\t\tif (isPixelFormatStencil(dsformat))\n\t\t\tsetAttachment(rt, passDesc.stencilAttachment, attachmentStoreActions.stencil);\n\t}\n\n\tif (!isbackbuffer)\n\t{\n\t\tlastRenderPipelineKey.colorRenderTargetFormats = 0;\n\t\tfor (size_t i = 0; i < rts.colors.size(); i++)\n\t\t\tlastRenderPipelineKey.colorRenderTargetFormats |= (rts.colors[i].texture->getPixelFormat()) << (8 * i);\n\n\t\tlastRenderPipelineKey.msaa = (uint8) rts.getFirstTarget().texture->getMSAA();\n\t}\n\n\tlastRenderPipelineKey.depthStencilFormat = dsformat;\n\tlastRenderPipelineKey.vertexAttributesID = VertexAttributesID();\n\n\tdirtyRenderState = STATEBIT_ALL;\n}}\n\nvoid Graphics::endPass(bool presenting)\n{\n\t// Make sure the encoder gets set up, if nothing else has done it yet.\n\tuseRenderEncoder();\n\n\tflushBatchedDraws();\n\n\tauto &rts = states.back().renderTargets;\n\tlove::graphics::Texture *depthstencil = rts.depthStencil.texture.get();\n\n\t// Discard the depth/stencil buffer if we're using an internal cached one,\n\t// or if we're presenting the backbuffer to the display.\n\tif ((depthstencil == nullptr && (rts.temporaryRTFlags & (TEMPORARY_RT_DEPTH | TEMPORARY_RT_STENCIL)) != 0)\n\t\t|| (presenting && !rts.getFirstTarget().texture.get()))\n\t{\n\t\tattachmentStoreActions.depth = MTLStoreActionDontCare;\n\t\tattachmentStoreActions.stencil = MTLStoreActionDontCare;\n\t}\n\n\tsubmitRenderEncoder(SUBMIT_DONE);\n}\n\nvoid Graphics::clear(OptionalColorD c, OptionalInt stencil, OptionalDouble depth)\n{ @autoreleasepool {\n\tif (c.hasValue || stencil.hasValue || depth.hasValue)\n\t{\n\t\tflushBatchedDraws();\n\n\t\t// Handle clearing mid-pass by starting a new pass.\n\t\tif (renderEncoder != nil)\n\t\t{\n\t\t\tsubmitRenderEncoder(SUBMIT_STORE);\n\t\t\tuseRenderEncoder();\n\t\t}\n\t}\n\n\tif (c.hasValue)\n\t{\n\t\tColorf cf((float)c.value.r, (float)c.value.g, (float)c.value.b, (float)c.value.a);\n\t\tgammaCorrectColor(cf);\n\t\tauto color = MTLClearColorMake(cf.r, cf.g, cf.b, cf.a);\n\t\tfor (int i = 0; i < MAX_COLOR_RENDER_TARGETS; i++)\n\t\t{\n\t\t\tpassDesc.colorAttachments[i].clearColor = color;\n\t\t\tpassDesc.colorAttachments[i].loadAction = MTLLoadActionClear;\n\t\t}\n\t}\n\n\tif (stencil.hasValue)\n\t{\n\t\tpassDesc.stencilAttachment.clearStencil = stencil.value;\n\t\tpassDesc.stencilAttachment.loadAction = MTLLoadActionClear;\n\t}\n\n\tif (depth.hasValue)\n\t{\n\t\tpassDesc.depthAttachment.clearDepth = depth.value;\n\t\tpassDesc.depthAttachment.loadAction = MTLLoadActionClear;\n\t}\n}}\n\nvoid Graphics::clear(const std::vector<OptionalColorD> &colors, OptionalInt stencil, OptionalDouble depth)\n{ @autoreleasepool {\n\tif (colors.size() == 0 && !stencil.hasValue && !depth.hasValue)\n\t\treturn;\n\n\tint ncolorcanvases = (int) states.back().renderTargets.colors.size();\n\tint ncolors = (int) colors.size();\n\n\tif (ncolors <= 1 && ncolorcanvases <= 1)\n\t{\n\t\tclear(ncolors > 0 ? colors[0] : OptionalColorD(), stencil, depth);\n\t\treturn;\n\t}\n\n\tflushBatchedDraws();\n\n\t// Handle clearing mid-pass by starting a new pass.\n\tif (renderEncoder != nil)\n\t{\n\t\tsubmitRenderEncoder(SUBMIT_STORE);\n\t\tuseRenderEncoder();\n\t}\n\n\tfor (int i = 0; i < ncolors; i++)\n\t{\n\t\tif (!colors[i].hasValue)\n\t\t\tcontinue;\n\n\t\tconst ColorD &cd = colors[i].value;\n\t\tColorf cf((float)cd.r, (float)cd.g, (float)cd.b, (float)cd.a);\n\t\tgammaCorrectColor(cf);\n\n\t\tpassDesc.colorAttachments[i].clearColor = MTLClearColorMake(cf.r, cf.g, cf.b, cf.a);\n\t\tpassDesc.colorAttachments[i].loadAction = MTLLoadActionClear;\n\t}\n\n\tif (stencil.hasValue)\n\t{\n\t\tpassDesc.stencilAttachment.clearStencil = stencil.value;\n\t\tpassDesc.stencilAttachment.loadAction = MTLLoadActionClear;\n\t}\n\n\tif (depth.hasValue)\n\t{\n\t\tpassDesc.depthAttachment.clearDepth = depth.value;\n\t\tpassDesc.depthAttachment.loadAction = MTLLoadActionClear;\n\t}\n}}\n\nvoid Graphics::discard(const std::vector<bool> &colorbuffers, bool depthstencil)\n{ @autoreleasepool {\n\tflushBatchedDraws();\n\n\t// TODO\n\tif (renderEncoder != nil)\n\t\treturn;\n\n\tsize_t maxcolor = isRenderTargetActive() ? states.back().renderTargets.colors.size() : 1;\n\tsize_t ncolor = std::min(maxcolor, colorbuffers.size());\n\n\tfor (size_t i = 0; i < ncolor; i++)\n\t{\n\t\tif (colorbuffers[i])\n\t\t\tpassDesc.colorAttachments[i].loadAction = MTLLoadActionDontCare;\n\t}\n\n\tif (depthstencil)\n\t{\n\t\tpassDesc.stencilAttachment.loadAction = MTLLoadActionDontCare;\n\t\tpassDesc.depthAttachment.loadAction = MTLLoadActionDontCare;\n\t}\n}}\n\nvoid Graphics::present(void *screenshotCallbackData)\n{ @autoreleasepool {\n\tif (!isActive())\n\t\treturn;\n\n\tif (isRenderTargetActive())\n\t\tthrow love::Exception(\"present cannot be called while a render target is active.\");\n\n\tdeprecations.draw(this);\n\n\t// endPass calls useRenderEncoder, which makes sure activeDrawable is set\n\t// when possible.\n\tendPass(true);\n\n\tid<MTLBuffer> screenshotbuffer = nil;\n\n\tint w = activeDrawable.texture.width;\n\tint h = activeDrawable.texture.height;\n\n\tif (!pendingScreenshotCallbacks.empty())\n\t{\n\t\tsize_t size = w * h * 4;\n\n\t\tscreenshotbuffer = [device newBufferWithLength:size options:MTLResourceStorageModeShared];\n\t\tif (screenshotbuffer == nil)\n\t\t\tthrow love::Exception(\"Out of graphics memory.\");\n\n\t\tauto blitencoder = useBlitEncoder();\n\n\t\t[blitencoder copyFromTexture:activeDrawable.texture\n\t\t\t\t\t\t sourceSlice:0\n\t\t\t\t\t\t sourceLevel:0\n\t\t\t\t\t\tsourceOrigin:MTLOriginMake(0, 0, 0)\n\t\t\t\t\t\t  sourceSize:MTLSizeMake(w, h, 1)\n\t\t\t\t\t\t\ttoBuffer:screenshotbuffer\n\t\t\t\t   destinationOffset:0\n\t\t\t  destinationBytesPerRow:w * 4\n\t\t\tdestinationBytesPerImage:size];\n\n\t\tsubmitBlitEncoder();\n\t}\n\n\tfor (StreamBuffer *buffer : batchedDrawState.vb)\n\t\tbuffer->nextFrame();\n\tbatchedDrawState.indexBuffer->nextFrame();\n\n\tuniformBuffer->nextFrame();\n\tuniformBufferData = {};\n\tuniformBufferOffset = 0;\n\n\tid<MTLCommandBuffer> cmd = getCommandBuffer();\n\n\tif (cmd != nil && activeDrawable != nil)\n\t\t[cmd presentDrawable:activeDrawable];\n\n\tsubmitCommandBuffer(SUBMIT_DONE);\n\n\tactiveDrawable = nil;\n\n\tif (!pendingScreenshotCallbacks.empty())\n\t{\n\t\t[cmd waitUntilCompleted];\n\n\t\tsize_t size = w * h * 4;\n\n\t\tauto imagemodule = Module::getInstance<love::image::Image>(M_IMAGE);\n\n\t\tfor (int i = 0; i < (int) pendingScreenshotCallbacks.size(); i++)\n\t\t{\n\t\t\tconst auto &info = pendingScreenshotCallbacks[i];\n\t\t\timage::ImageData *img = nullptr;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\timg = imagemodule->newImageData(w, h, PIXELFORMAT_RGBA8_UNORM, screenshotbuffer.contents);\n\t\t\t}\n\t\t\tcatch (love::Exception &)\n\t\t\t{\n\t\t\t\tinfo.callback(&info, nullptr, nullptr);\n\t\t\t\tfor (int j = i + 1; j < (int) pendingScreenshotCallbacks.size(); j++)\n\t\t\t\t{\n\t\t\t\t\tconst auto &ninfo = pendingScreenshotCallbacks[j];\n\t\t\t\t\tninfo.callback(&ninfo, nullptr, nullptr);\n\t\t\t\t}\n\t\t\t\tpendingScreenshotCallbacks.clear();\n\t\t\t\tthrow;\n\t\t\t}\n\n\t\t\tuint8 *screenshot = (uint8 *) img->getData();\n\n\t\t\t// Convert from BGRA to RGBA and replace alpha with full opacity.\n\t\t\tfor (size_t i = 0; i < size; i += 4)\n\t\t\t{\n\t\t\t\tuint8 r = screenshot[i + 2];\n\t\t\t\tscreenshot[i + 2] = screenshot[i + 0];\n\t\t\t\tscreenshot[i + 0] = r;\n\t\t\t\tscreenshot[i + 3] = 255;\n\t\t\t}\n\n\t\t\tinfo.callback(&info, img, screenshotCallbackData);\n\t\t\timg->release();\n\t\t}\n\n\t\tpendingScreenshotCallbacks.clear();\n\t}\n\n\tauto window = Module::getInstance<love::window::Window>(M_WINDOW);\n\tif (window != nullptr)\n\t\twindow->swapBuffers();\n\n\t// This is set to NO when there are pending screen captures.\n\tmetalLayer.framebufferOnly = YES;\n\n\t// Reset the per-frame stat counts.\n\tdrawCalls = 0;\n\tshaderSwitches = 0;\n\trenderTargetSwitchCount = 0;\n\tdrawCallsBatched = 0;\n\n\tupdatePendingReadbacks();\n\tupdateTemporaryResources();\n\tprocessCompletedCommandBuffers();\n}}\n\nint Graphics::getRequestedBackbufferMSAA() const\n{\n\treturn requestedBackbufferMSAA;\n}\n\nint Graphics::getBackbufferMSAA() const\n{\n\treturn backbufferMSAA.get() ? backbufferMSAA->getMSAA() : 0;\n}\n\nvoid Graphics::setColor(Colorf c)\n{\n\tc.r = std::min(std::max(c.r, 0.0f), 1.0f);\n\tc.g = std::min(std::max(c.g, 0.0f), 1.0f);\n\tc.b = std::min(std::max(c.b, 0.0f), 1.0f);\n\tc.a = std::min(std::max(c.a, 0.0f), 1.0f);\n\n\tstates.back().color = c;\n}\n\nvoid Graphics::setScissor(const Rect &rect)\n{\n\tflushBatchedDraws();\n\n\tDisplayState &state = states.back();\n\tstate.scissor = true;\n\tstate.scissorRect = rect;\n\tdirtyRenderState |= STATEBIT_SCISSOR;\n}\n\nvoid Graphics::setScissor()\n{\n\tDisplayState &state = states.back();\n\tif (state.scissor)\n\t{\n\t\tflushBatchedDraws();\n\t\tstate.scissor = false;\n\t\tdirtyRenderState |= STATEBIT_SCISSOR;\n\t}\n}\n\nvoid Graphics::setStencilState(const StencilState &s)\n{\n\tvalidateStencilState(s);\n\n\tflushBatchedDraws();\n\n\tstates.back().stencil = s;\n\tdirtyRenderState |= STATEBIT_STENCIL;\n}\n\nvoid Graphics::setDepthMode(CompareMode compare, bool write)\n{\n\tvalidateDepthState(write);\n\n\tDisplayState &state = states.back();\n\n\tif (state.depthTest != compare || state.depthWrite != write)\n\t{\n\t\tflushBatchedDraws();\n\t\tstate.depthTest = compare;\n\t\tstate.depthWrite = write;\n\t\tdirtyRenderState |= STATEBIT_DEPTH;\n\t}\n}\n\nvoid Graphics::setFrontFaceWinding(Winding winding)\n{\n\tif (states.back().winding != winding)\n\t{\n\t\tflushBatchedDraws();\n\t\tstates.back().winding = winding;\n\t\tdirtyRenderState |= STATEBIT_FACEWINDING;\n\t}\n}\n\nvoid Graphics::setColorMask(ColorChannelMask mask)\n{\n\tif (states.back().colorMask != mask)\n\t{\n\t\tflushBatchedDraws();\n\t\tstates.back().colorMask = mask;\n\t\tdirtyRenderState |= STATEBIT_COLORMASK;\n\t}\n}\n\nvoid Graphics::setBlendState(const BlendState &blend)\n{\n\tif (!(blend == states.back().blend))\n\t{\n\t\tflushBatchedDraws();\n\t\tstates.back().blend = blend;\n\t\tdirtyRenderState |= STATEBIT_BLEND;\n\t}\n}\n\nvoid Graphics::setPointSize(float size)\n{\n\tif (size != states.back().pointSize)\n\t\tflushBatchedDraws();\n\n\tstates.back().pointSize = size;\n}\n\nvoid Graphics::setWireframe(bool enable)\n{\n\tif (enable != states.back().wireframe)\n\t{\n\t\tflushBatchedDraws();\n\t\tstates.back().wireframe = enable;\n\t\tdirtyRenderState |= STATEBIT_WIREFRAME;\n\t}\n}\n\nbool Graphics::isPixelFormatSupported(PixelFormat format, uint32 usage)\n{\n\tformat = getSizedFormat(format);\n\n\tconst uint32 sample = PIXELFORMATUSAGEFLAGS_SAMPLE;\n\tconst uint32 filter = PIXELFORMATUSAGEFLAGS_LINEAR;\n\tconst uint32 rt = PIXELFORMATUSAGEFLAGS_RENDERTARGET;\n\tconst uint32 blend = PIXELFORMATUSAGEFLAGS_BLEND;\n\tconst uint32 msaa = PIXELFORMATUSAGEFLAGS_MSAA;\n\tconst uint32 commonsample = PIXELFORMATUSAGEFLAGS_SAMPLE | PIXELFORMATUSAGEFLAGS_LINEAR;\n\tconst uint32 commonrender = PIXELFORMATUSAGEFLAGS_RENDERTARGET | PIXELFORMATUSAGEFLAGS_BLEND | PIXELFORMATUSAGEFLAGS_MSAA;\n\tconst uint32 computewrite = PIXELFORMATUSAGEFLAGS_COMPUTEWRITE;\n\tconst uint32 all = commonsample | commonrender | computewrite;\n\n\tuint32 flags = PIXELFORMATUSAGEFLAGS_NONE;\n\n\tif (isPixelFormatCompressed(format) && (usage & rt) != 0)\n\t\treturn false;\n\n\t// https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf\n\tswitch (format)\n\t{\n\t\tcase PIXELFORMAT_UNKNOWN:\n\t\tcase PIXELFORMAT_NORMAL:\n\t\tcase PIXELFORMAT_HDR:\n\t\t\tbreak;\n\n\t\tcase PIXELFORMAT_R8_UNORM:\n\t\t\tflags |= all;\n\t\t\tbreak;\n\t\tcase PIXELFORMAT_R16_UNORM:\n\t\t\tif (families.apple[1])\n\t\t\t\tflags |= commonsample | commonrender | computewrite;\n\t\t\tif (families.mac[1] || families.macCatalyst[1])\n\t\t\t\tflags |= all;\n\t\t\tbreak;\n\t\tcase PIXELFORMAT_R16_FLOAT:\n\t\t\tflags |= all;\n\t\t\tbreak;\n\t\tcase PIXELFORMAT_R32_FLOAT:\n\t\t\tif (families.apple[1])\n\t\t\t\tflags |= sample | rt | blend | computewrite;\n\t\t\tif (families.mac[1] || families.macCatalyst[1])\n\t\t\t\tflags |= (all & ~(msaa | filter));\n\t\t\tif (@available(macOS 11.0, iOS 14.0, *))\n\t\t\t{\n\t\t\t\tif (device.supports32BitFloatFiltering)\n\t\t\t\t\tflags |= filter;\n\t\t\t\tif (device.supports32BitMSAA)\n\t\t\t\t\tflags |= msaa;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase PIXELFORMAT_RG8_UNORM:\n\t\t\tflags |= all;\n\t\t\tbreak;\n\t\tcase PIXELFORMAT_LA8_UNORM:\n\t\t\t// Requires texture swizzle support.\n\t\t\tif (@available(macOS 10.15, iOS 13, *))\n\t\t\t{\n\t\t\t\t// As of early 2024, the VM device doesn't properly support texture swizzles\n\t\t\t\t// (observed on GitHub's runners) which is required for LA8 support.\n\t\t\t\tif (!isVMDevice)\n\t\t\t\t{\n\t\t\t\t\tif (families.apple[1] || families.mac[2] || families.macCatalyst[2])\n\t\t\t\t\t\tflags |= commonsample;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase PIXELFORMAT_RG16_UNORM:\n\t\t\tif (families.apple[1])\n\t\t\t\tflags |= commonsample | rt | blend | msaa | computewrite;\n\t\t\tif (families.mac[1] || families.macCatalyst[1])\n\t\t\t\tflags |= all;\n\t\t\tbreak;\n\t\tcase PIXELFORMAT_RG16_FLOAT:\n\t\t\tflags |= all;\n\t\t\tbreak;\n\t\tcase PIXELFORMAT_RG32_FLOAT:\n\t\t\tif (families.apple[1])\n\t\t\t\tflags |= sample | rt | blend | computewrite;\n\t\t\tif (families.mac[1] || families.macCatalyst[1])\n\t\t\t\tflags |= (all & ~(msaa | filter));\n\t\t\tif (@available(macOS 11.0, iOS 14.0, *))\n\t\t\t{\n\t\t\t\tif (device.supports32BitFloatFiltering)\n\t\t\t\t\tflags |= filter;\n\t\t\t\tif (device.supports32BitMSAA)\n\t\t\t\t\tflags |= msaa;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase PIXELFORMAT_RGBA8_UNORM:\n\t\tcase PIXELFORMAT_BGRA8_UNORM:\n\t\t\tflags |= all;\n\t\t\tbreak;\n\t\tcase PIXELFORMAT_RGBA8_sRGB:\n\t\tcase PIXELFORMAT_BGRA8_sRGB:\n\t\t\tif (families.apple[1] || families.mac[1] || families.macCatalyst[1])\n\t\t\t\tflags |= commonsample | commonrender;\n\t\t\tif (families.apple[2])\n\t\t\t\tflags |= all;\n\t\t\tbreak;\n\n\t\tcase PIXELFORMAT_RGBA16_UNORM:\n\t\t\tif (families.apple[1])\n\t\t\t\tflags |= commonsample | rt | msaa | blend | computewrite;\n\t\t\tif (families.mac[1] || families.macCatalyst[1])\n\t\t\t\tflags |= all;\n\t\t\tbreak;\n\t\tcase PIXELFORMAT_RGBA16_FLOAT:\n\t\t\tflags |= all;\n\t\t\tbreak;\n\t\tcase PIXELFORMAT_RGBA32_FLOAT:\n\t\t\tif (families.apple[1])\n\t\t\t\tflags |= sample | rt | computewrite;\n\t\t\tif (families.mac[1] || families.macCatalyst[1])\n\t\t\t\tflags |= (all & ~(msaa | filter));\n\t\t\tif (@available(macOS 11.0, iOS 14.0, *))\n\t\t\t{\n\t\t\t\tif (device.supports32BitFloatFiltering)\n\t\t\t\t\tflags |= filter;\n\t\t\t\tif (device.supports32BitMSAA)\n\t\t\t\t\tflags |= msaa;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase PIXELFORMAT_R8_INT:\n\t\tcase PIXELFORMAT_R8_UINT:\n\t\tcase PIXELFORMAT_RG8_INT:\n\t\tcase PIXELFORMAT_RG8_UINT:\n\t\tcase PIXELFORMAT_RGBA8_INT:\n\t\tcase PIXELFORMAT_RGBA8_UINT:\n\t\tcase PIXELFORMAT_R16_INT:\n\t\tcase PIXELFORMAT_R16_UINT:\n\t\tcase PIXELFORMAT_RG16_INT:\n\t\tcase PIXELFORMAT_RG16_UINT:\n\t\tcase PIXELFORMAT_RGBA16_INT:\n\t\tcase PIXELFORMAT_RGBA16_UINT:\n\t\tcase PIXELFORMAT_R32_INT:\n\t\tcase PIXELFORMAT_R32_UINT:\n\t\tcase PIXELFORMAT_RG32_INT:\n\t\tcase PIXELFORMAT_RG32_UINT:\n\t\tcase PIXELFORMAT_RGBA32_INT:\n\t\tcase PIXELFORMAT_RGBA32_UINT:\n\t\t\t// If MSAA support for int formats is added this should be split up.\n\t\t\tflags |= sample | rt | computewrite;\n\t\t\tbreak;\n\n\t\tcase PIXELFORMAT_RGBA4_UNORM:\n\t\tcase PIXELFORMAT_RGB5A1_UNORM:\n\t\tcase PIXELFORMAT_RGB565_UNORM:\n\t\t\tif (families.apple[1])\n\t\t\t\tflags |= commonsample | rt | blend | msaa; // | resolve\n\t\t\tbreak;\n\t\tcase PIXELFORMAT_RGB10A2_UNORM:\n\t\tcase PIXELFORMAT_RG11B10_FLOAT:\n\t\t\tif (families.apple[1])\n\t\t\t\tflags |= commonsample | rt | blend | msaa; // | resolve\n\t\t\tif (families.apple[3])\n\t\t\t\tflags |= all;\n\t\t\tif (families.mac[1] || families.macCatalyst[1])\n\t\t\t\tflags |= all;\n\t\t\tbreak;\n\n\t\tcase PIXELFORMAT_STENCIL8:\n\t\t\tflags |= rt | sample | msaa;\n\t\t\tbreak;\n\t\tcase PIXELFORMAT_DEPTH16_UNORM:\n\t\t\tflags |= rt | commonsample | msaa;\n\t\t\t//if (families.apple[3] || families.mac[1] || families.macCatalyst[1])\n\t\t\t//\tflags |= resolve;\n\t\t\tbreak;\n\t\tcase PIXELFORMAT_DEPTH24_UNORM: // This is emulated via 32f.\n\t\tcase PIXELFORMAT_DEPTH32_FLOAT:\n\t\t\tif (families.apple[1])\n\t\t\t\tflags |= rt | sample | msaa;\n\t\t\tif (families.apple[3])\n\t\t\t\tflags |= rt | sample | msaa; // | resolve;\n\t\t\tif (families.mac[1] || families.macCatalyst[1])\n\t\t\t\tflags |= rt | commonsample | msaa; // | resolve;\n\t\t\tbreak;\n\t\tcase PIXELFORMAT_DEPTH24_UNORM_STENCIL8:\n\t\t\t// Note: this falls back to 32f_s8 on some systems.\n\t\t\tflags |= rt | sample | msaa;\n\t\t\tbreak;\n\t\tcase PIXELFORMAT_DEPTH32_FLOAT_STENCIL8:\n\t\t\tif (families.apple[1])\n\t\t\t\tflags |= rt | sample | msaa;\n\t\t\tif (families.apple[3])\n\t\t\t\tflags |= rt | sample | msaa; // | resolve\n\t\t\tif (families.mac[1] || families.macCatalyst[1])\n\t\t\t\tflags |= rt | commonsample | msaa; // | resolve\n\t\t\tbreak;\n\n\t\tcase PIXELFORMAT_DXT1_UNORM:\n\t\tcase PIXELFORMAT_DXT1_sRGB:\n\t\tcase PIXELFORMAT_DXT3_UNORM:\n\t\tcase PIXELFORMAT_DXT3_sRGB:\n\t\tcase PIXELFORMAT_DXT5_UNORM:\n\t\tcase PIXELFORMAT_DXT5_sRGB:\n\t\tcase PIXELFORMAT_BC4_UNORM:\n\t\tcase PIXELFORMAT_BC4_SNORM:\n\t\tcase PIXELFORMAT_BC5_UNORM:\n\t\tcase PIXELFORMAT_BC5_SNORM:\n\t\tcase PIXELFORMAT_BC6H_UFLOAT:\n\t\tcase PIXELFORMAT_BC6H_FLOAT:\n\t\tcase PIXELFORMAT_BC7_UNORM:\n\t\tcase PIXELFORMAT_BC7_sRGB:\n\t\t\tif (families.mac[1] || families.macCatalyst[1])\n\t\t\t\tflags |= commonsample;\n\t\t\tbreak;\n\n\t\tcase PIXELFORMAT_PVR1_RGB2_UNORM:\n\t\tcase PIXELFORMAT_PVR1_RGB2_sRGB:\n\t\tcase PIXELFORMAT_PVR1_RGB4_UNORM:\n\t\tcase PIXELFORMAT_PVR1_RGB4_sRGB:\n\t\tcase PIXELFORMAT_PVR1_RGBA2_UNORM:\n\t\tcase PIXELFORMAT_PVR1_RGBA2_sRGB:\n\t\tcase PIXELFORMAT_PVR1_RGBA4_UNORM:\n\t\tcase PIXELFORMAT_PVR1_RGBA4_sRGB:\n\t\t\tif (families.apple[1])\n\t\t\t\tflags |= commonsample;\n\t\t\tbreak;\n\n\t\tcase PIXELFORMAT_ETC1_UNORM:\n\t\tcase PIXELFORMAT_ETC2_RGB_UNORM:\n\t\tcase PIXELFORMAT_ETC2_RGB_sRGB:\n\t\tcase PIXELFORMAT_ETC2_RGBA_UNORM:\n\t\tcase PIXELFORMAT_ETC2_RGBA_sRGB:\n\t\tcase PIXELFORMAT_ETC2_RGBA1_UNORM:\n\t\tcase PIXELFORMAT_ETC2_RGBA1_sRGB:\n\t\tcase PIXELFORMAT_EAC_R_UNORM:\n\t\tcase PIXELFORMAT_EAC_R_SNORM:\n\t\tcase PIXELFORMAT_EAC_RG_UNORM:\n\t\tcase PIXELFORMAT_EAC_RG_SNORM:\n\t\t\tif (families.apple[1])\n\t\t\t\tflags |= commonsample;\n\t\t\tbreak;\n\n\t\tcase PIXELFORMAT_ASTC_4x4_UNORM:\n\t\tcase PIXELFORMAT_ASTC_5x4_UNORM:\n\t\tcase PIXELFORMAT_ASTC_5x5_UNORM:\n\t\tcase PIXELFORMAT_ASTC_6x5_UNORM:\n\t\tcase PIXELFORMAT_ASTC_6x6_UNORM:\n\t\tcase PIXELFORMAT_ASTC_8x5_UNORM:\n\t\tcase PIXELFORMAT_ASTC_8x6_UNORM:\n\t\tcase PIXELFORMAT_ASTC_8x8_UNORM:\n\t\tcase PIXELFORMAT_ASTC_10x5_UNORM:\n\t\tcase PIXELFORMAT_ASTC_10x6_UNORM:\n\t\tcase PIXELFORMAT_ASTC_10x8_UNORM:\n\t\tcase PIXELFORMAT_ASTC_10x10_UNORM:\n\t\tcase PIXELFORMAT_ASTC_12x10_UNORM:\n\t\tcase PIXELFORMAT_ASTC_12x12_UNORM:\n\t\tcase PIXELFORMAT_ASTC_4x4_sRGB:\n\t\tcase PIXELFORMAT_ASTC_5x4_sRGB:\n\t\tcase PIXELFORMAT_ASTC_5x5_sRGB:\n\t\tcase PIXELFORMAT_ASTC_6x5_sRGB:\n\t\tcase PIXELFORMAT_ASTC_6x6_sRGB:\n\t\tcase PIXELFORMAT_ASTC_8x5_sRGB:\n\t\tcase PIXELFORMAT_ASTC_8x6_sRGB:\n\t\tcase PIXELFORMAT_ASTC_8x8_sRGB:\n\t\tcase PIXELFORMAT_ASTC_10x5_sRGB:\n\t\tcase PIXELFORMAT_ASTC_10x6_sRGB:\n\t\tcase PIXELFORMAT_ASTC_10x8_sRGB:\n\t\tcase PIXELFORMAT_ASTC_10x10_sRGB:\n\t\tcase PIXELFORMAT_ASTC_12x10_sRGB:\n\t\tcase PIXELFORMAT_ASTC_12x12_sRGB:\n\t\t\tif (families.apple[2])\n\t\t\t\tflags |= commonsample;\n\t\t\tbreak;\n\n\t\tcase PIXELFORMAT_MAX_ENUM:\n\t\t\tbreak;\n\t}\n\n\treturn (usage & flags) == usage;\n}\n\nRenderer Graphics::getRenderer() const\n{\n\treturn RENDERER_METAL;\n}\n\nbool Graphics::usesGLSLES() const\n{\n#ifdef LOVE_IOS\n\treturn true;\n#else\n\treturn false;\n#endif\n}\n\nGraphics::RendererInfo Graphics::getRendererInfo() const\n{\n\tRendererInfo info;\n\tinfo.name = \"Metal\";\n\tinfo.version = \"2.1\"; // TODO\n\tinfo.vendor = \"\"; // TODO\n\tinfo.device = device.name.UTF8String;\n\treturn info;\n}\n\nint Graphics::getClosestMSAASamples(int requestedsamples)\n{\n\t// We currently rely on StoreAndMultisampleResolve (unfortunately), which\n\t// isn't supported by old phone GPUs.\n\tif (!families.apple[3] && !families.mac[1] && !families.macCatalyst[1])\n\t\treturn 1;\n\n\tconst int checkmsaa[] = {32, 16, 8, 4, 2};\n\tfor (int samples : checkmsaa)\n\t{\n\t\tif (samples <= requestedsamples && [device supportsTextureSampleCount:samples])\n\t\t\treturn samples;\n\t}\n\treturn 1;\n}\n\nvoid Graphics::initCapabilities()\n{\n\tif (@available(macOS 10.15, iOS 13.0, *))\n\t{\n\t\tfor (NSInteger i = 0; i < 7; i++)\n\t\t{\n\t\t\tMTLGPUFamily family = (MTLGPUFamily) (MTLGPUFamilyApple1 + i);\n\t\t\tif ([device supportsFamily:family])\n\t\t\t\tfamilies.apple[1 + i] = true;\n\t\t}\n\n\t\tfor (NSInteger i = 0; i < 2; i++)\n\t\t{\n\t\t\tMTLGPUFamily family = (MTLGPUFamily) (MTLGPUFamilyMac1 + i);\n\t\t\tif ([device supportsFamily:family])\n\t\t\t\tfamilies.mac[1 + i] = true;\n\t\t}\n\n\t\tfor (NSInteger i = 0; i < 3; i++)\n\t\t{\n\t\t\tMTLGPUFamily family = (MTLGPUFamily) (MTLGPUFamilyCommon1 + i);\n\t\t\tif ([device supportsFamily:family])\n\t\t\t\tfamilies.common[1 + i] = true;\n\t\t}\n\n\t\tfor (NSInteger i = 0; i < 2; i++)\n\t\t{\n\t\t\tMTLGPUFamily family = (MTLGPUFamily) (MTLGPUFamilyMacCatalyst1 + i);\n\t\t\tif ([device supportsFamily:family])\n\t\t\t\tfamilies.macCatalyst[1 + i] = true;\n\t\t}\n\t}\n\n\tcapabilities.features[FEATURE_MULTI_RENDER_TARGET_FORMATS] = true;\n\tcapabilities.features[FEATURE_CLAMP_ZERO] = true;\n\tcapabilities.features[FEATURE_CLAMP_ONE] = false;\n\tif (@available(macOS 10.12, iOS 14.0, *))\n\t{\n\t\t// Requires \"border color\" feature.\n\t\tif (families.mac[1] || families.macCatalyst[1] || families.apple[7])\n\t\t\tcapabilities.features[FEATURE_CLAMP_ONE] = true;\n\t}\n\tcapabilities.features[FEATURE_LIGHTEN] = true;\n\tcapabilities.features[FEATURE_FULL_NPOT] = true;\n\tcapabilities.features[FEATURE_PIXEL_SHADER_HIGHP] = true;\n\tcapabilities.features[FEATURE_SHADER_DERIVATIVES] = true;\n\tcapabilities.features[FEATURE_GLSL3] = true;\n\tcapabilities.features[FEATURE_GLSL4] = true;\n\tcapabilities.features[FEATURE_INSTANCING] = true;\n\tcapabilities.features[FEATURE_TEXEL_BUFFER] = true;\n\tcapabilities.features[FEATURE_COPY_TEXTURE_TO_BUFFER] = true;\n\n\tif (families.mac[1] || families.macCatalyst[1] || families.apple[3])\n\t\tcapabilities.features[FEATURE_INDIRECT_DRAW] = true;\n\telse\n\t\tcapabilities.features[FEATURE_INDIRECT_DRAW] = false;\n\t\n\tstatic_assert(FEATURE_MAX_ENUM == 13, \"Graphics::initCapabilities must be updated when adding a new graphics feature!\");\n\n\t// https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf\n\tcapabilities.limits[LIMIT_POINT_SIZE] = 511;\n\tcapabilities.limits[LIMIT_TEXTURE_LAYERS] = 2048;\n\tcapabilities.limits[LIMIT_VOLUME_TEXTURE_SIZE] = 2048;\n\tif (families.mac[1] || families.macCatalyst[1] || families.apple[3])\n\t{\n\t\tcapabilities.limits[LIMIT_TEXTURE_SIZE] = 16384;\n\t\tcapabilities.limits[LIMIT_CUBE_TEXTURE_SIZE] = 16384;\n\t}\n\telse\n\t{\n\t\tcapabilities.limits[LIMIT_TEXTURE_SIZE] = 8192;\n\t\tcapabilities.limits[LIMIT_CUBE_TEXTURE_SIZE] = 8192;\n\t}\n\n\t// TODO: metal doesn't have a good API to query this?\n\tcapabilities.limits[LIMIT_TEXEL_BUFFER_SIZE] = 128 * 1024 * 1024;\n\n\tif (@available(macOS 10.14, iOS 12.0, *))\n\t{\n\t\tNSUInteger buffersize = [device maxBufferLength];\n\t\tcapabilities.limits[LIMIT_SHADER_STORAGE_BUFFER_SIZE] = buffersize;\n\t}\n\telse\n\t{\n\t\tcapabilities.limits[LIMIT_SHADER_STORAGE_BUFFER_SIZE] = 128 * 1024 * 1024;\n\t}\n\n\tcapabilities.limits[LIMIT_THREADGROUPS_X] = LOVE_INT32_MAX; // TODO: is there a real limit?\n\tcapabilities.limits[LIMIT_THREADGROUPS_Y] = LOVE_INT32_MAX;\n\tcapabilities.limits[LIMIT_THREADGROUPS_Z] = LOVE_INT32_MAX;\n\n\tif (families.mac[1] || families.macCatalyst[1] || families.apple[2])\n\t\tcapabilities.limits[LIMIT_RENDER_TARGETS] = 8;\n\telse\n\t\tcapabilities.limits[LIMIT_RENDER_TARGETS] = 4;\n\tcapabilities.limits[LIMIT_TEXTURE_MSAA] = getClosestMSAASamples(32);\n\tcapabilities.limits[LIMIT_ANISOTROPY] = 16.0f;\n\tstatic_assert(LIMIT_MAX_ENUM == 13, \"Graphics::initCapabilities must be updated when adding a new system limit!\");\n\n\tfor (int i = 0; i < TEXTURE_MAX_ENUM; i++)\n\t\tcapabilities.textureTypes[i] = true;\n}\n\nvoid Graphics::getAPIStats(int &shaderswitches) const\n{\n\tshaderswitches = shaderSwitches;\n}\n\n} // metal\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/metal/GraphicsReadback.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"graphics/GraphicsReadback.h\"\n#include \"common/math.h\"\n\n#include <atomic>\n\n#import <Metal/MTLCommandBuffer.h>\n\nnamespace love::graphics::metal\n{\n\nclass GraphicsReadback final : public love::graphics::GraphicsReadback\n{\npublic:\n\n\tGraphicsReadback(love::graphics::Graphics *gfx, ReadbackMethod method, love::graphics::Buffer *buffer, size_t offset, size_t size, data::ByteData *dest, size_t destoffset);\n\tGraphicsReadback(love::graphics::Graphics *gfx, ReadbackMethod method, love::graphics::Texture *texture, int slice, int mipmap, const Rect &rect, image::ImageData *dest, int destx, int desty);\n\tvirtual ~GraphicsReadback();\n\n\tvoid wait() override;\n\tvoid update() override;\n\nprivate:\n\n\tid<MTLCommandBuffer> cmd;\n\tstd::atomic_bool done;\n\n\tStrongRef<love::graphics::Buffer> stagingBuffer;\n\n}; // GraphicsReadback\n\n} // love::graphics::metal\n"
  },
  {
    "path": "src/modules/graphics/metal/GraphicsReadback.mm",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"GraphicsReadback.h\"\n#include \"Buffer.h\"\n#include \"Texture.h\"\n#include \"Graphics.h\"\n#include \"data/ByteData.h\"\n\nnamespace love::graphics::metal\n{\n\nGraphicsReadback::GraphicsReadback(love::graphics::Graphics *gfx, ReadbackMethod method, love::graphics::Buffer *buffer, size_t offset, size_t size, data::ByteData *dest, size_t destoffset)\n\t: love::graphics::GraphicsReadback(gfx, method, buffer, offset, size, dest, destoffset)\n\t, done(false)\n{ @autoreleasepool {\n\tauto mgfx = (Graphics *) gfx;\n\n\t// Immediate readback of readback-type buffers doesn't need a staging buffer.\n\tif (method != READBACK_IMMEDIATE || buffer->getDataUsage() != BUFFERDATAUSAGE_READBACK)\n\t{\n\t\tstagingBuffer = gfx->getTemporaryBuffer(size, DATAFORMAT_FLOAT, 0, BUFFERDATAUSAGE_READBACK);\n\t\tgfx->copyBuffer(buffer, stagingBuffer, offset, 0, size);\n\t}\n\n\t// use instead of get, in case this was the first command in the frame.\n\tcmd = mgfx->useCommandBuffer();\n\n\tauto pthis = this;\n\tpthis->retain();\n\t[cmd addCompletedHandler:^(id<MTLCommandBuffer> _Nonnull)\n\t{\n\t\tpthis->done = true;\n\t\tpthis->release();\n\t}];\n\n\tif (method == READBACK_IMMEDIATE)\n\t{\n\t\twait();\n\n\t\tif (stagingBuffer.get())\n\t\t{\n\t\t\tstatus = readbackBuffer(stagingBuffer, 0, size);\n\t\t\tgfx->releaseTemporaryBuffer(stagingBuffer);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstatus = readbackBuffer(buffer, offset, size);\n\t\t}\n\t}\n}}\n\nGraphicsReadback::GraphicsReadback(love::graphics::Graphics *gfx, ReadbackMethod method, love::graphics::Texture *texture, int slice, int mipmap, const Rect &rect, image::ImageData *dest, int destx, int desty)\n\t: love::graphics::GraphicsReadback(gfx, method, texture, slice, mipmap, rect, dest, destx, desty)\n\t, done(false)\n{ @autoreleasepool {\n\tauto mgfx = (Graphics *) gfx;\n\tsize_t size = getPixelFormatSliceSize(textureFormat, rect.w, rect.h);\n\n\tstagingBuffer = gfx->getTemporaryBuffer(size, DATAFORMAT_FLOAT, 0, BUFFERDATAUSAGE_READBACK);\n\n\tgfx->copyTextureToBuffer(texture, stagingBuffer, slice, mipmap, rect, 0, 0);\n\n\tcmd = mgfx->getCommandBuffer();\n\n\tauto pthis = this;\n\tpthis->retain();\n\t[cmd addCompletedHandler:^(id<MTLCommandBuffer> _Nonnull)\n\t{\n\t\tpthis->done = true;\n\t\tpthis->release();\n\t}];\n\n\tif (method == READBACK_IMMEDIATE)\n\t{\n\t\twait();\n\t\tstatus = readbackBuffer(stagingBuffer, 0, size);\n\t\tgfx->releaseTemporaryBuffer(stagingBuffer);\n\t}\n}}\n\nGraphicsReadback::~GraphicsReadback()\n{ @autoreleasepool {\n\tcmd = nil;\n}}\n\nvoid GraphicsReadback::wait()\n{ @autoreleasepool {\n\tif (status != STATUS_WAITING || cmd == nil)\n\t\treturn;\n\n\tif (cmd.status == MTLCommandBufferStatusNotEnqueued)\n\t{\n\t\tauto gfx = Graphics::getInstance();\n\t\tgfx->submitCommandBuffer(Graphics::SUBMIT_STORE);\n\t}\n\n\t[cmd waitUntilCompleted];\n\tcmd = nil;\n\n\tupdate();\n}}\n\nvoid GraphicsReadback::update()\n{\n\tif (status != STATUS_WAITING)\n\t\treturn;\n\n\tif (done)\n\t{\n\t\tif (stagingBuffer.get())\n\t\t\tstatus = readbackBuffer(stagingBuffer, 0, stagingBuffer->getSize());\n\t\telse\n\t\t\tstatus = STATUS_ERROR;\n\n\t\tif (stagingBuffer.get())\n\t\t{\n\t\t\tauto gfx = Module::getInstance<love::graphics::Graphics>(Module::M_GRAPHICS);\n\t\t\tif (gfx != nullptr)\n\t\t\t\tgfx->releaseTemporaryBuffer(stagingBuffer);\n\t\t\tstagingBuffer.set(nullptr);\n\t\t}\n\t}\n}\n\n} // love::graphics::metal\n"
  },
  {
    "path": "src/modules/graphics/metal/Metal.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"graphics/Texture.h\"\n#include \"common/pixelformat.h\"\n\n#import <Metal/Metal.h>\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace metal\n{\n\nclass Metal\n{\npublic:\n\n\tstruct PixelFormatDesc\n\t{\n\t\tMTLPixelFormat format;\n\t\tbool swizzled = false;\n\t\tAPI_AVAILABLE(macos(10.15), ios(13.0)) MTLTextureSwizzleChannels swizzle;\n\t};\n\n\tstatic PixelFormatDesc convertPixelFormat(id<MTLDevice> device, PixelFormat format);\n\n}; // Metal\n\n} // metal\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/metal/Metal.mm",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Metal.h\"\n#include \"common/config.h\"\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace metal\n{\n\nMetal::PixelFormatDesc Metal::convertPixelFormat(id<MTLDevice> device, PixelFormat format)\n{\n\tMTLPixelFormat mtlformat = MTLPixelFormatInvalid;\n\tPixelFormatDesc desc = {};\n\n\tswitch (format)\n\t{\n\tcase PIXELFORMAT_R8_UNORM:\n\t\tmtlformat = MTLPixelFormatR8Unorm;\n\t\tbreak;\n\tcase PIXELFORMAT_RG8_UNORM:\n\t\tmtlformat = MTLPixelFormatRG8Unorm;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA8_UNORM:\n\t\tmtlformat = MTLPixelFormatRGBA8Unorm;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA8_sRGB:\n\t\tmtlformat = MTLPixelFormatRGBA8Unorm_sRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_BGRA8_UNORM:\n\t\tmtlformat = MTLPixelFormatBGRA8Unorm;\n\t\tbreak;\n\tcase PIXELFORMAT_BGRA8_sRGB:\n\t\tmtlformat = MTLPixelFormatBGRA8Unorm_sRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_R16_UNORM:\n\t\tmtlformat = MTLPixelFormatR16Unorm;\n\t\tbreak;\n\tcase PIXELFORMAT_RG16_UNORM:\n\t\tmtlformat = MTLPixelFormatRG16Unorm;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA16_UNORM:\n\t\tmtlformat = MTLPixelFormatRGBA16Unorm;\n\t\tbreak;\n\tcase PIXELFORMAT_R16_FLOAT:\n\t\tmtlformat = MTLPixelFormatR16Float;\n\t\tbreak;\n\tcase PIXELFORMAT_RG16_FLOAT:\n\t\tmtlformat = MTLPixelFormatRG16Float;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA16_FLOAT:\n\t\tmtlformat = MTLPixelFormatRGBA16Float;\n\t\tbreak;\n\tcase PIXELFORMAT_R32_FLOAT:\n\t\tmtlformat = MTLPixelFormatR32Float;\n\t\tbreak;\n\tcase PIXELFORMAT_RG32_FLOAT:\n\t\tmtlformat = MTLPixelFormatRG32Float;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA32_FLOAT:\n\t\tmtlformat = MTLPixelFormatRGBA32Float;\n\t\tbreak;\n\n\tcase PIXELFORMAT_R8_INT:\n\t\tmtlformat = MTLPixelFormatR8Sint;\n\t\tbreak;\n\tcase PIXELFORMAT_R8_UINT:\n\t\tmtlformat = MTLPixelFormatR8Uint;\n\t\tbreak;\n\tcase PIXELFORMAT_RG8_INT:\n\t\tmtlformat = MTLPixelFormatRG8Sint;\n\t\tbreak;\n\tcase PIXELFORMAT_RG8_UINT:\n\t\tmtlformat = MTLPixelFormatRG8Uint;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA8_INT:\n\t\tmtlformat = MTLPixelFormatRGBA8Sint;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA8_UINT:\n\t\tmtlformat = MTLPixelFormatRGBA8Uint;\n\t\tbreak;\n\tcase PIXELFORMAT_R16_INT:\n\t\tmtlformat = MTLPixelFormatR16Sint;\n\t\tbreak;\n\tcase PIXELFORMAT_R16_UINT:\n\t\tmtlformat = MTLPixelFormatR16Uint;\n\t\tbreak;\n\tcase PIXELFORMAT_RG16_INT:\n\t\tmtlformat = MTLPixelFormatRG16Sint;\n\t\tbreak;\n\tcase PIXELFORMAT_RG16_UINT:\n\t\tmtlformat = MTLPixelFormatRG16Uint;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA16_INT:\n\t\tmtlformat = MTLPixelFormatRGBA16Sint;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA16_UINT:\n\t\tmtlformat = MTLPixelFormatRGBA16Uint;\n\t\tbreak;\n\tcase PIXELFORMAT_R32_INT:\n\t\tmtlformat = MTLPixelFormatR32Sint;\n\t\tbreak;\n\tcase PIXELFORMAT_R32_UINT:\n\t\tmtlformat = MTLPixelFormatR32Uint;\n\t\tbreak;\n\tcase PIXELFORMAT_RG32_INT:\n\t\tmtlformat = MTLPixelFormatRG32Sint;\n\t\tbreak;\n\tcase PIXELFORMAT_RG32_UINT:\n\t\tmtlformat = MTLPixelFormatRG32Uint;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA32_INT:\n\t\tmtlformat = MTLPixelFormatRGBA32Sint;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA32_UINT:\n\t\tmtlformat = MTLPixelFormatRGBA32Uint;\n\t\tbreak;\n\n\tcase PIXELFORMAT_LA8_UNORM:\n\t\t// Only supported on some systems.\n\t\tif (@available(macOS 10.15, iOS 13, *))\n\t\t{\n\t\t\tmtlformat = MTLPixelFormatRG8Unorm;\n\t\t\tdesc.swizzled = true;\n\t\t\tdesc.swizzle.red = MTLTextureSwizzleRed;\n\t\t\tdesc.swizzle.green = MTLTextureSwizzleRed;\n\t\t\tdesc.swizzle.blue = MTLTextureSwizzleRed;\n\t\t\tdesc.swizzle.alpha = MTLTextureSwizzleGreen;\n\t\t}\n\t\tbreak;\n\n\tcase PIXELFORMAT_RGBA4_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatABGR4Unorm;\n\t\tbreak;\n\tcase PIXELFORMAT_RGB5A1_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatA1BGR5Unorm;\n\t\tbreak;\n\tcase PIXELFORMAT_RGB565_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatB5G6R5Unorm;\n\t\tbreak;\n\tcase PIXELFORMAT_RGB10A2_UNORM:\n\t\tmtlformat = MTLPixelFormatRGB10A2Unorm;\n\t\tbreak;\n\tcase PIXELFORMAT_RG11B10_FLOAT:\n\t\tmtlformat = MTLPixelFormatRG11B10Float;\n\t\tbreak;\n\n\tcase PIXELFORMAT_STENCIL8:\n\t\tmtlformat = MTLPixelFormatStencil8;\n\t\tbreak;\n\tcase PIXELFORMAT_DEPTH16_UNORM:\n\t\tif (@available(macOS 10.12, iOS 13.0, *))\n\t\t\tmtlformat = MTLPixelFormatDepth16Unorm;\n\t\telse\n\t\t\tmtlformat = MTLPixelFormatDepth32Float;\n\t\tbreak;\n\tcase PIXELFORMAT_DEPTH24_UNORM:\n\t\tmtlformat = MTLPixelFormatDepth32Float;\n\t\tbreak;\n\tcase PIXELFORMAT_DEPTH32_FLOAT:\n\t\tmtlformat = MTLPixelFormatDepth32Float;\n\t\tbreak;\n\tcase PIXELFORMAT_DEPTH24_UNORM_STENCIL8:\n#ifdef LOVE_IOS\n\t\tmtlformat = MTLPixelFormatDepth32Float_Stencil8;\n#else\n\t\tif ([device isDepth24Stencil8PixelFormatSupported])\n\t\t\tmtlformat = MTLPixelFormatDepth24Unorm_Stencil8;\n\t\telse\n\t\t\tmtlformat = MTLPixelFormatDepth32Float_Stencil8;\n#endif\n\t\tbreak;\n\tcase PIXELFORMAT_DEPTH32_FLOAT_STENCIL8:\n\t\tmtlformat = MTLPixelFormatDepth32Float_Stencil8;\n\t\tbreak;\n\n\tcase PIXELFORMAT_DXT1_UNORM:\n#ifndef LOVE_IOS\n\t\tmtlformat = MTLPixelFormatBC1_RGBA;\n#endif\n\t\tbreak;\n\tcase PIXELFORMAT_DXT1_sRGB:\n#ifndef LOVE_IOS\n\t\tmtlformat = MTLPixelFormatBC1_RGBA_sRGB;\n#endif\n\t\tbreak;\n\tcase PIXELFORMAT_DXT3_UNORM:\n#ifndef LOVE_IOS\n\t\tmtlformat = MTLPixelFormatBC2_RGBA;\n#endif\n\t\tbreak;\n\tcase PIXELFORMAT_DXT3_sRGB:\n#ifndef LOVE_IOS\n\t\tmtlformat = MTLPixelFormatBC2_RGBA_sRGB;\n#endif\n\t\tbreak;\n\tcase PIXELFORMAT_DXT5_UNORM:\n#ifndef LOVE_IOS\n\t\tmtlformat = MTLPixelFormatBC3_RGBA;\n#endif\n\t\tbreak;\n\tcase PIXELFORMAT_DXT5_sRGB:\n#ifndef LOVE_IOS\n\t\tmtlformat = MTLPixelFormatBC3_RGBA_sRGB;\n#endif\n\t\tbreak;\n\tcase PIXELFORMAT_BC4_UNORM:\n#ifndef LOVE_IOS\n\t\tmtlformat = MTLPixelFormatBC4_RUnorm;\n#endif\n\t\tbreak;\n\tcase PIXELFORMAT_BC4_SNORM:\n#ifndef LOVE_IOS\n\t\tmtlformat = MTLPixelFormatBC4_RSnorm;\n#endif\n\t\tbreak;\n\tcase PIXELFORMAT_BC5_UNORM:\n#ifndef LOVE_IOS\n\t\tmtlformat = MTLPixelFormatBC5_RGUnorm;\n#endif\n\t\tbreak;\n\tcase PIXELFORMAT_BC5_SNORM:\n#ifndef LOVE_IOS\n\t\tmtlformat = MTLPixelFormatBC5_RGSnorm;\n#endif\n\t\tbreak;\n\tcase PIXELFORMAT_BC6H_UFLOAT:\n#ifndef LOVE_IOS\n\t\tmtlformat = MTLPixelFormatBC6H_RGBUfloat;\n#endif\n\t\tbreak;\n\tcase PIXELFORMAT_BC6H_FLOAT:\n#ifndef LOVE_IOS\n\t\tmtlformat = MTLPixelFormatBC6H_RGBFloat;\n#endif\n\t\tbreak;\n\tcase PIXELFORMAT_BC7_UNORM:\n#ifndef LOVE_IOS\n\t\tmtlformat = MTLPixelFormatBC7_RGBAUnorm;\n#endif\n\t\tbreak;\n\tcase PIXELFORMAT_BC7_sRGB:\n#ifndef LOVE_IOS\n\t\tmtlformat = MTLPixelFormatBC7_RGBAUnorm_sRGB;\n#endif\n\t\tbreak;\n\n\tcase PIXELFORMAT_PVR1_RGB2_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatPVRTC_RGB_2BPP;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGB2_sRGB:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatPVRTC_RGB_2BPP_sRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGB4_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatPVRTC_RGB_4BPP;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGB4_sRGB:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatPVRTC_RGB_4BPP_sRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGBA2_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatPVRTC_RGBA_2BPP;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGBA2_sRGB:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatPVRTC_RGB_2BPP_sRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGBA4_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatPVRTC_RGBA_4BPP;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGBA4_sRGB:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatPVRTC_RGB_4BPP_sRGB;\n\t\tbreak;\n\n\tcase PIXELFORMAT_ETC1_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatETC2_RGB8;\n\t\tbreak;\n\tcase PIXELFORMAT_ETC2_RGB_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatETC2_RGB8;\n\t\tbreak;\n\tcase PIXELFORMAT_ETC2_RGB_sRGB:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat =  MTLPixelFormatETC2_RGB8_sRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_ETC2_RGBA_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatEAC_RGBA8;\n\t\tbreak;\n\tcase PIXELFORMAT_ETC2_RGBA_sRGB:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatEAC_RGBA8_sRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_ETC2_RGBA1_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatETC2_RGB8A1;\n\t\tbreak;\n\tcase PIXELFORMAT_ETC2_RGBA1_sRGB:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatETC2_RGB8A1_sRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_EAC_R_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatEAC_R11Unorm;\n\t\tbreak;\n\tcase PIXELFORMAT_EAC_R_SNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatEAC_R11Snorm;\n\t\tbreak;\n\tcase PIXELFORMAT_EAC_RG_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatEAC_RG11Unorm;\n\t\tbreak;\n\tcase PIXELFORMAT_EAC_RG_SNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatEAC_RG11Snorm;\n\t\tbreak;\n\n\tcase PIXELFORMAT_ASTC_4x4_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_4x4_LDR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_5x4_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_5x4_LDR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_5x5_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_5x5_LDR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_6x5_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_6x5_LDR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_6x6_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_6x6_LDR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_8x5_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_8x5_LDR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_8x6_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_8x6_LDR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_8x8_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_8x8_LDR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x5_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_10x5_LDR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x6_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_10x6_LDR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x8_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_10x8_LDR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x10_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_10x10_LDR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_12x10_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_12x10_LDR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_12x12_UNORM:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_12x12_LDR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_4x4_sRGB:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_4x4_sRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_5x4_sRGB:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_5x4_sRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_5x5_sRGB:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_5x5_sRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_6x5_sRGB:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_6x5_sRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_6x6_sRGB:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_6x6_sRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_8x5_sRGB:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_8x5_sRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_8x6_sRGB:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_8x6_sRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_8x8_sRGB:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_8x8_sRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x5_sRGB:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_10x5_sRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x6_sRGB:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_10x6_sRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x8_sRGB:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_10x8_sRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x10_sRGB:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_10x10_sRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_12x10_sRGB:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_12x10_sRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_12x12_sRGB:\n\t\tif (@available(macOS 11.0, iOS 8.0, *))\n\t\t\tmtlformat = MTLPixelFormatASTC_12x12_sRGB;\n\t\tbreak;\n\n\tcase PIXELFORMAT_UNKNOWN:\n\tcase PIXELFORMAT_NORMAL:\n\tcase PIXELFORMAT_HDR:\n\tcase PIXELFORMAT_MAX_ENUM:\n\t\tbreak;\n\t}\n\n\tdesc.format = mtlformat;\n\treturn desc;\n}\n\n} // metal\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/metal/Shader.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"libraries/xxHash/xxhash.h\"\n#include \"common/int.h\"\n#include \"graphics/Shader.h\"\n#include \"graphics/Graphics.h\"\n#include \"graphics/renderstate.h\"\n#include \"graphics/vertex.h\"\n#include \"Metal.h\"\n\n#import <Metal/MTLRenderPipeline.h>\n\n#include <unordered_map>\n#include <map>\n#include <string>\n\nnamespace glslang\n{\nclass TProgram;\n}\n\nnamespace spirv_cross\n{\nclass CompilerMSL;\nstruct SPIRType;\nstruct Resource;\n}\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace metal\n{\n\nstatic const int DEFAULT_VERTEX_BUFFER_BINDING = 1;\n\nclass Shader final : public love::graphics::Shader\n{\npublic:\n\n\tstruct RenderPipelineKey\n\t{\n\t\tVertexAttributesID vertexAttributesID;\n\t\tuint32 blendStateKey;\n\t\tuint64 colorRenderTargetFormats;\n\t\tuint32 depthStencilFormat;\n\t\tColorChannelMask colorChannelMask;\n\t\tuint8 msaa;\n\n\t\tRenderPipelineKey()\n\t\t{\n\t\t\tmemset(this, 0, sizeof(RenderPipelineKey));\n\t\t}\n\n\t\tbool operator == (const RenderPipelineKey &other) const\n\t\t{\n\t\t\treturn memcmp(this, &other, sizeof(RenderPipelineKey)) == 0;\n\t\t}\n\t};\n\n\tstruct TextureBinding\n\t{\n\t\tid<MTLTexture> texture;\n\n\t\t// Indirect sampler ref in case Texture's sampler state changes.\n\t\tTexture *samplerTexture;\n\n\t\tbool isMainTexture;\n\t\tAccess access;\n\n\t\tuint8 textureStages[SHADERSTAGE_MAX_ENUM];\n\t\tuint8 samplerStages[SHADERSTAGE_MAX_ENUM];\n\t};\n\n\tstruct BufferBinding\n\t{\n\t\tid<MTLBuffer> buffer;\n\t\tuint8 stages[SHADERSTAGE_MAX_ENUM];\n\t\tAccess access;\n\t};\n\n\tShader(id<MTLDevice> device, StrongRef<love::graphics::ShaderStage> stages[SHADERSTAGE_MAX_ENUM], const CompileOptions &options);\n\tvirtual ~Shader();\n\n\t// Implements Shader.\n\tvoid attach() override;\n\tstd::string getWarnings() const override { return \"\"; }\n\tint getVertexAttributeIndex(const std::string &name) override;\n\tconst UniformInfo *getUniformInfo(BuiltinUniform builtin) const override;\n\tvoid updateUniform(const UniformInfo *info, int count) override;\n\tptrdiff_t getHandle() const override { return 0; }\n\n\tid<MTLRenderPipelineState> getCachedRenderPipeline(Graphics *gfx, const RenderPipelineKey &key);\n\tid<MTLComputePipelineState> getComputePipeline() const { return computePipeline; }\n\n\tstatic int getUniformBufferBinding();\n\tint getFirstVertexBufferBinding() const { return firstVertexBufferBinding; }\n\n\tconst std::vector<TextureBinding> &getTextureBindings() const { return textureBindings; }\n\tconst std::vector<BufferBinding> &getBufferBindings() const { return bufferBindings; }\n\n\tuint8 *getLocalUniformBufferData() { return localUniformBufferData; }\n\tsize_t getLocalUniformBufferSize() const { return localUniformBufferSize; }\n\tsize_t getBuiltinUniformDataOffset() const { return builtinUniformDataOffset; }\n\nprivate:\n\n\tstruct AttributeInfo\n\t{\n\t\tint index;\n\t\tDataBaseType baseType;\n\t};\n\n\tstruct RenderPipelineHasher\n\t{\n\t\tsize_t operator() (const RenderPipelineKey &key) const\n\t\t{\n\t\t\treturn XXH32(&key, sizeof(RenderPipelineKey), 0);\n\t\t}\n\t};\n\n\tvoid buildLocalUniforms(const spirv_cross::CompilerMSL &msl, const spirv_cross::SPIRType &type, size_t baseoffset, const std::string &basename);\n\tvoid compileFromGLSLang(id<MTLDevice> device, const glslang::TProgram &program);\n\n\tvoid applyTexture(const UniformInfo *info, int i, love::graphics::Texture *texture, UniformType basetype, bool isdefault) override;\n\tvoid applyBuffer(const UniformInfo *info, int i, love::graphics::Buffer *buffer, UniformType basetype, bool isdefault) override;\n\n\tid<MTLFunction> functions[SHADERSTAGE_MAX_ENUM];\n\n\tUniformInfo *builtinUniformInfo[BUILTIN_MAX_ENUM];\n\n\tuint8 *localUniformStagingData;\n\tuint8 *localUniformBufferData;\n\tsize_t localUniformBufferSize;\n\tsize_t builtinUniformDataOffset;\n\n\tint firstVertexBufferBinding;\n\n\tstd::map<std::string, AttributeInfo> attributes;\n\n\tstd::vector<TextureBinding> textureBindings;\n\tstd::vector<BufferBinding> bufferBindings;\n\n\tstd::unordered_map<RenderPipelineKey, const void *, RenderPipelineHasher> cachedRenderPipelines;\n\tid<MTLComputePipelineState> computePipeline;\n\n}; // Metal\n\n} // metal\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/metal/Shader.mm",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Shader.h\"\n#include \"Graphics.h\"\n#include \"common/int.h\"\n\n// glslang\n#include \"libraries/glslang/glslang/Public/ShaderLang.h\"\n#include \"libraries/glslang/glslang/Public/ResourceLimits.h\"\n#include \"libraries/glslang/SPIRV/GlslangToSpv.h\"\n#include \"libraries/spirv_cross/spirv_msl.hpp\"\n#include \"libraries/spirv_cross/spirv_reflect.hpp\"\n\n#include <algorithm>\n#include <memory>\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace metal\n{\n\nstatic_assert(MAX_COLOR_RENDER_TARGETS <= 8, \"Metal pipeline cache key only stores 8 render target pixel formats.\");\n\nstatic MTLVertexFormat getMTLVertexFormat(DataFormat format)\n{\n\tswitch (format)\n\t{\n\t\tcase DATAFORMAT_FLOAT: return MTLVertexFormatFloat;\n\t\tcase DATAFORMAT_FLOAT_VEC2: return MTLVertexFormatFloat2;\n\t\tcase DATAFORMAT_FLOAT_VEC3: return MTLVertexFormatFloat3;\n\t\tcase DATAFORMAT_FLOAT_VEC4: return MTLVertexFormatFloat4;\n\n\t\tcase DATAFORMAT_INT32: return MTLVertexFormatInt;\n\t\tcase DATAFORMAT_INT32_VEC2: return MTLVertexFormatInt2;\n\t\tcase DATAFORMAT_INT32_VEC3: return MTLVertexFormatInt3;\n\t\tcase DATAFORMAT_INT32_VEC4: return MTLVertexFormatInt4;\n\n\t\tcase DATAFORMAT_UINT32: return MTLVertexFormatUInt;\n\t\tcase DATAFORMAT_UINT32_VEC2: return MTLVertexFormatUInt2;\n\t\tcase DATAFORMAT_UINT32_VEC3: return MTLVertexFormatUInt3;\n\t\tcase DATAFORMAT_UINT32_VEC4: return MTLVertexFormatUInt4;\n\n\t\tcase DATAFORMAT_SNORM8_VEC4: return MTLVertexFormatChar4Normalized;\n\t\tcase DATAFORMAT_UNORM8_VEC4: return MTLVertexFormatUChar4Normalized;\n\t\tcase DATAFORMAT_INT8_VEC4: return MTLVertexFormatChar4;\n\t\tcase DATAFORMAT_UINT8_VEC4: return MTLVertexFormatUChar4;\n\n\t\tcase DATAFORMAT_SNORM16_VEC2: return MTLVertexFormatShort2Normalized;\n\t\tcase DATAFORMAT_SNORM16_VEC4: return MTLVertexFormatShort4Normalized;\n\n\t\tcase DATAFORMAT_UNORM16_VEC2: return MTLVertexFormatUShort2Normalized;\n\t\tcase DATAFORMAT_UNORM16_VEC4: return MTLVertexFormatUShort4Normalized;\n\n\t\tcase DATAFORMAT_INT16_VEC2: return MTLVertexFormatShort2;\n\t\tcase DATAFORMAT_INT16_VEC4: return MTLVertexFormatShort4;\n\n\t\tcase DATAFORMAT_UINT16: return MTLVertexFormatUShort;\n\t\tcase DATAFORMAT_UINT16_VEC2: return MTLVertexFormatUShort2;\n\t\tcase DATAFORMAT_UINT16_VEC4: return MTLVertexFormatUShort4;\n\n\t\tdefault: return MTLVertexFormatInvalid;\n\t}\n}\n\nstatic MTLBlendOperation getMTLBlendOperation(BlendOperation op)\n{\n\tswitch (op)\n\t{\n\t\tcase BLENDOP_ADD: return MTLBlendOperationAdd;\n\t\tcase BLENDOP_SUBTRACT: return MTLBlendOperationSubtract;\n\t\tcase BLENDOP_REVERSE_SUBTRACT: return MTLBlendOperationReverseSubtract;\n\t\tcase BLENDOP_MIN: return MTLBlendOperationMin;\n\t\tcase BLENDOP_MAX: return MTLBlendOperationMax;\n\t\tcase BLENDOP_MAX_ENUM: return MTLBlendOperationAdd;\n\t}\n\treturn MTLBlendOperationAdd;\n}\n\nstatic MTLBlendFactor getMTLBlendFactor(BlendFactor factor)\n{\n\tswitch (factor)\n\t{\n\t\tcase BLENDFACTOR_ZERO: return MTLBlendFactorZero;\n\t\tcase BLENDFACTOR_ONE: return MTLBlendFactorOne;\n\t\tcase BLENDFACTOR_SRC_COLOR: return MTLBlendFactorSourceColor;\n\t\tcase BLENDFACTOR_ONE_MINUS_SRC_COLOR: return MTLBlendFactorOneMinusSourceColor;\n\t\tcase BLENDFACTOR_SRC_ALPHA: return MTLBlendFactorSourceAlpha;\n\t\tcase BLENDFACTOR_ONE_MINUS_SRC_ALPHA: return MTLBlendFactorOneMinusSourceAlpha;\n\t\tcase BLENDFACTOR_DST_COLOR: return MTLBlendFactorDestinationColor;\n\t\tcase BLENDFACTOR_ONE_MINUS_DST_COLOR: return MTLBlendFactorOneMinusDestinationColor;\n\t\tcase BLENDFACTOR_DST_ALPHA: return MTLBlendFactorDestinationAlpha;\n\t\tcase BLENDFACTOR_ONE_MINUS_DST_ALPHA: return MTLBlendFactorOneMinusDestinationAlpha;\n\t\tcase BLENDFACTOR_SRC_ALPHA_SATURATED: return MTLBlendFactorSourceAlphaSaturated;\n\t\tcase BLENDFACTOR_MAX_ENUM: return MTLBlendFactorZero;\n\t}\n\treturn MTLBlendFactorZero;\n}\n\nstatic inline id<MTLTexture> getMTLTexture(love::graphics::Texture *tex)\n{\n\treturn tex ? (__bridge id<MTLTexture>)(void *) tex->getHandle() : nil;\n}\n\nstatic inline id<MTLTexture> getMTLTexture(love::graphics::Buffer *buffer)\n{\n\treturn buffer ? (__bridge id<MTLTexture>)(void *) buffer->getTexelBufferHandle() : nil;\n}\n\nstatic inline id<MTLBuffer> getMTLBuffer(love::graphics::Buffer *buffer)\n{\n\treturn buffer ? (__bridge id<MTLBuffer>)(void *) buffer->getHandle() : nil;\n}\n\nstatic EShLanguage getGLSLangStage(ShaderStageType stage)\n{\n\tswitch (stage)\n\t{\n\t\tcase SHADERSTAGE_VERTEX: return EShLangVertex;\n\t\tcase SHADERSTAGE_PIXEL: return EShLangFragment;\n\t\tcase SHADERSTAGE_COMPUTE: return EShLangCompute;\n\t\tcase SHADERSTAGE_MAX_ENUM: return EShLangCount;\n\t}\n\treturn EShLangCount;\n}\n\nShader::Shader(id<MTLDevice> device, StrongRef<love::graphics::ShaderStage> stages[SHADERSTAGE_MAX_ENUM], const CompileOptions &options)\n\t: love::graphics::Shader(stages, options)\n\t, functions()\n\t, builtinUniformInfo()\n\t, localUniformStagingData(nullptr)\n\t, localUniformBufferData(nullptr)\n\t, localUniformBufferSize(0)\n\t, builtinUniformDataOffset(0)\n\t, firstVertexBufferBinding(DEFAULT_VERTEX_BUFFER_BINDING + 1)\n{ @autoreleasepool {\n\tusing namespace glslang;\n\n\tTShader *glslangShaders[SHADERSTAGE_MAX_ENUM] = {};\n\n\tTProgram *program = new TProgram();\n\n\tauto cleanup = [&]()\n\t{\n\t\tdelete program;\n\t\tfor (int i = 0; i < SHADERSTAGE_MAX_ENUM; i++)\n\t\t\tdelete glslangShaders[i];\n\t};\n\n\t// We can't do this in ShaderStage because the mapIO call modifies the\n\t// TShader internals in a manner that prevents it from being shared.\n\tfor (int i = 0; i < SHADERSTAGE_MAX_ENUM; i++)\n\t{\n\t\tif (!stages[i])\n\t\t\tcontinue;\n\n\t\tauto stage = (ShaderStageType) i;\n\t\tauto glslangstage = getGLSLangStage(stage);\n\t\tauto tshader = new TShader(glslangstage);\n\n\t\tglslangShaders[i] = tshader;\n\n\t\ttshader->setEnvInput(EShSourceGlsl, glslangstage, EShClientVulkan, 450);\n\t\ttshader->setEnvClient(EShClientVulkan, EShTargetVulkan_1_2);\n\t\ttshader->setEnvTarget(EShTargetSpv, EShTargetSpv_1_5);\n\t\ttshader->setAutoMapLocations(true);\n\t\ttshader->setAutoMapBindings(true);\n\n\t\t// Needed for local uniforms to work (they will be converted into a\n\t\t// uniform block).\n\t\t// https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GL_EXT_vulkan_glsl_relaxed.txt\n\t\ttshader->setEnvInputVulkanRulesRelaxed();\n\t\ttshader->setGlobalUniformBinding(0);\n\t\ttshader->setGlobalUniformSet(0);\n\n\t\tconst std::string &source = stages[i]->getSource();\n\t\tconst char *csrc = source.c_str();\n\t\tint srclen = (int) source.length();\n\t\ttshader->setStringsWithLengths(&csrc, &srclen, 1);\n\n\t\tint defaultversion = 450;\n\t\tEProfile defaultprofile = ECoreProfile;\n\t\tbool forcedefault = false;\n\t\tbool forwardcompat = true;\n\n#ifdef LOVE_IOS\n\t\tdefaultversion = 320;\n\t\tdefaultprofile = EEsProfile;\n\t\tforcedefault = true;\n#endif\n\n\t\tif (!tshader->parse(GetResources(), defaultversion, defaultprofile, forcedefault, forwardcompat, EShMsgSuppressWarnings))\n\t\t{\n\t\t\tconst char *stagename = \"unknown\";\n\t\t\tShaderStage::getConstant(stage, stagename);\n\n\t\t\tstd::string err = \"Error parsing \" + std::string(stagename) + \" shader:\\n\\n\"\n\t\t\t\t+ std::string(tshader->getInfoLog()) + \"\\n\"\n\t\t\t\t+ std::string(tshader->getInfoDebugLog());\n\n\t\t\tcleanup();\n\t\t\tthrow love::Exception(\"%s\", err.c_str());\n\t\t}\n\n\t\tprogram->addShader(tshader);\n\t}\n\n\tif (!program->link(EShMsgDefault))\n\t{\n\t\t//err = \"Cannot compile shader:\\n\\n\" + std::string(program->getInfoLog()) + \"\\n\" + std::string(program->getInfoDebugLog());\n\t\tcleanup();\n\t\tthrow love::Exception(\"link failed! %s\\n\", program->getInfoLog());\n\t}\n\n\tif (!program->mapIO())\n\t{\n\t\tcleanup();\n\t\tthrow love::Exception(\"mapIO failed\");\n\t}\n\n\ttry\n\t{\n\t\tcompileFromGLSLang(device, *program);\n\t}\n\tcatch (love::Exception &)\n\t{\n\t\tcleanup();\n\t\tthrow;\n\t}\n\n\tcleanup();\n\n\tif (functions[SHADERSTAGE_COMPUTE] != nil)\n\t{\n\t\tMTLComputePipelineDescriptor *desc = [MTLComputePipelineDescriptor new];\n\t\tdesc.computeFunction = functions[SHADERSTAGE_COMPUTE];\n\n\t\t// TODO: threadGroupSizeIsMultipleOfThreadExecutionWidth\n\n\t\tNSError *err = nil;\n\t\tcomputePipeline = [device newComputePipelineStateWithDescriptor:desc\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\toptions:MTLPipelineOptionNone\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t reflection:nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  error:&err];\n\t\tif (computePipeline == nil)\n\t\t{\n\t\t\tif (err != nil)\n\t\t\t\tthrow love::Exception(\"Error creating compute shader pipeline: %s\", err.localizedDescription.UTF8String);\n\t\t\telse\n\t\t\t\tthrow love::Exception(\"Error creating compute shader pipeline.\");\n\t\t}\n\t}\n}}\n\nvoid Shader::buildLocalUniforms(const spirv_cross::CompilerMSL &msl, const spirv_cross::SPIRType &type, size_t baseoffset, const std::string &basename)\n{\n\tusing namespace spirv_cross;\n\n\tconst auto &membertypes = type.member_types;\n\n\tfor (size_t uindex = 0; uindex < membertypes.size(); uindex++)\n\t{\n\t\tconst auto &membertype = msl.get_type(membertypes[uindex]);\n\t\tsize_t membersize = msl.get_declared_struct_member_size(type, uindex);\n\t\tsize_t offset = baseoffset + msl.type_struct_member_offset(type, uindex);\n\n\t\tstd::string name = basename + msl.get_member_name(type.self, uindex);\n\n\t\tswitch (membertype.basetype)\n\t\t{\n\t\t\tcase SPIRType::Struct:\n\t\t\t\tif (membertype.op == spv::OpTypeArray)\n\t\t\t\t{\n\t\t\t\t\tsize_t arraystride = msl.type_struct_member_array_stride(type, uindex);\n\t\t\t\t\tfor (uint32 i = 0; i < membertype.array[0]; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tstd::string structname = name + \"[\" + std::to_string(i) + \"].\";\n\t\t\t\t\t\tbuildLocalUniforms(msl, membertype, offset + i * arraystride, structname);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tstd::string structname = name + \".\";\n\t\t\t\t\tbuildLocalUniforms(msl, membertype, offset, structname);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\tcase SPIRType::Int:\n\t\t\tcase SPIRType::UInt:\n\t\t\tcase SPIRType::Float:\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tcontinue;\n\t\t}\n\n\t\tname = canonicaliizeUniformName(name);\n\n\t\tif (offset + membersize > localUniformBufferSize)\n\t\t\tthrow love::Exception(\"Invalid uniform offset + size for '%s' (offset=%d, size=%d, buffer size=%d)\", name.c_str(), (int)offset, (int)membersize, (int)localUniformBufferSize);\n\n\t\tauto uniformit = reflection.allUniforms.find(name);\n\t\tif (uniformit == reflection.allUniforms.end())\n\t\t{\n\t\t\thandleUnknownUniformName(name.c_str());\n\t\t\tcontinue;\n\t\t}\n\n\t\tUniformInfo &u = *(uniformit->second);\n\t\tu.active = true;\n\n\t\tif (u.dataSize > 0)\n\t\t\tcontinue;\n\n\t\tu.dataSize = membersize;\n\t\tu.data = localUniformStagingData + offset;\n\n\t\tconst auto &reflectionit = reflection.localUniformInitializerValues.find(u.name);\n\t\tif (reflectionit != reflection.localUniformInitializerValues.end())\n\t\t{\n\t\t\tconst auto &values = reflectionit->second;\n\t\t\tif (!values.empty())\n\t\t\t\tmemcpy(u.data, values.data(), std::min(u.dataSize, values.size() * sizeof(LocalUniformValue)));\n\t\t}\n\n\t\tBuiltinUniform builtin = BUILTIN_MAX_ENUM;\n\t\tif (getConstant(u.name.c_str(), builtin))\n\t\t{\n\t\t\tif (builtin == BUILTIN_UNIFORMS_PER_DRAW)\n\t\t\t\tbuiltinUniformDataOffset = offset;\n\t\t\tbuiltinUniformInfo[builtin] = &u;\n\t\t}\n\n\t\tupdateUniform(&u, u.count);\n\t}\n}\n\nvoid Shader::compileFromGLSLang(id<MTLDevice> device, const glslang::TProgram &program)\n{\n\tusing namespace glslang;\n\tusing namespace spirv_cross;\n\n\tstd::map<std::string, int> varyings;\n\tint nextVaryingLocation = 0;\n\n\tint metalBufferIndices[SHADERSTAGE_MAX_ENUM];\n\tfor (int i = 0; i < SHADERSTAGE_MAX_ENUM; i++)\n\t\tmetalBufferIndices[i] = getUniformBufferBinding() + 1;\n\tmetalBufferIndices[SHADERSTAGE_VERTEX] = DEFAULT_VERTEX_BUFFER_BINDING + 1;\n\n\tfor (int stageindex = 0; stageindex < SHADERSTAGE_MAX_ENUM; stageindex++)\n\t{\n\t\tauto glslangstage = getGLSLangStage((ShaderStageType) stageindex);\n\t\tauto intermediate = program.getIntermediate(glslangstage);\n\t\tif (intermediate == nullptr)\n\t\t\tcontinue;\n\n\t\tspv::SpvBuildLogger logger;\n\t\tglslang::SpvOptions opt;\n\t\topt.validate = true;\n\n\t\tstd::vector<unsigned int> spirv;\n\t\tGlslangToSpv(*intermediate, spirv, &logger, &opt);\n\n\t\tstd::string msgs = logger.getAllMessages();\n//\t\tprintf(\"spirv length: %ld, messages:\\n%s\\n\", spirv.size(), msgs.c_str());\n\n//\t\tprintf(\"GLSL INPUT SOURCE:\\n\\n%s\\n\\n\", pixel->getSource().c_str());\n\n\t\tstd::unique_ptr<CompilerMSL> mslpointer;\n\n\t\ttry\n\t\t{\n\t\t\tmslpointer.reset(new CompilerMSL(std::move(spirv)));\n\t\t}\n\t\tcatch (std::exception &e)\n\t\t{\n\t\t\tthrow love::Exception(\"Error parsing SPIR-V shader source: %s\", e.what());\n\t\t}\n\n\t\tauto &msl = *mslpointer;\n\n\t\tauto interfacevars = msl.get_active_interface_variables();\n\t\tShaderResources resources = msl.get_shader_resources(interfacevars);\n\n\t\tmsl.set_enabled_interface_variables(interfacevars);\n\n\t\tfor (const auto &resource : resources.uniform_buffers)\n\t\t{\n\t\t\tMSLResourceBinding binding;\n\t\t\tbinding.stage = msl.get_execution_model();\n\t\t\tbinding.binding = msl.get_decoration(resource.id, spv::DecorationBinding);\n\t\t\tbinding.desc_set = msl.get_decoration(resource.id, spv::DecorationDescriptorSet);\n\n\t\t\tif (resource.name == \"gl_DefaultUniformBlock\")\n\t\t\t{\n\t\t\t\tbinding.msl_buffer = getUniformBufferBinding();\n\t\t\t\tmsl.add_msl_resource_binding(binding);\n\n\t\t\t\tconst SPIRType &type = msl.get_type(resource.base_type_id);\n\t\t\t\tsize_t size = msl.get_declared_struct_size(type);\n\n\t\t\t\tif (localUniformBufferSize != 0)\n\t\t\t\t{\n\t\t\t\t\tif (localUniformBufferSize != size)\n\t\t\t\t\t\tthrow love::Exception(\"Local uniform buffer size mismatch\");\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlocalUniformStagingData = new uint8[size];\n\t\t\t\tlocalUniformBufferData = new uint8[size];\n\t\t\t\tlocalUniformBufferSize = size;\n\n\t\t\t\tmemset(localUniformStagingData, 0, size);\n\t\t\t\tmemset(localUniformBufferData, 0, size);\n\n\t\t\t\tstd::string basename(\"\");\n\t\t\t\tbuildLocalUniforms(msl, type, 0, basename);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbinding.msl_buffer = metalBufferIndices[stageindex]++;\n\t\t\t\tmsl.add_msl_resource_binding(binding);\n\t\t\t}\n\t\t}\n\n\t\tfor (const auto &resource : resources.storage_buffers)\n\t\t{\n\t\t\tMSLResourceBinding binding;\n\t\t\tbinding.stage = msl.get_execution_model();\n\t\t\tbinding.binding = msl.get_decoration(resource.id, spv::DecorationBinding);\n\t\t\tbinding.desc_set = msl.get_decoration(resource.id, spv::DecorationDescriptorSet);\n\t\t\tbinding.msl_buffer = metalBufferIndices[stageindex]++;\n\t\t\tmsl.add_msl_resource_binding(binding);\n\t\t}\n\n\t\tif (stageindex == SHADERSTAGE_VERTEX)\n\t\t{\n\t\t\tuint64 usedInputLocationBits = 0;\n\n\t\t\t// First pass: record active input locations that were set to a valid value\n\t\t\t// beforehand.\n\t\t\tfor (const auto &var : interfacevars)\n\t\t\t{\n\t\t\t\tif (msl.get_storage_class(var) == spv::StorageClassInput)\n\t\t\t\t{\n\t\t\t\t\tconst std::string &name = msl.get_name(var);\n\n\t\t\t\t\tauto it = reflection.vertexInputs.find(name);\n\t\t\t\t\tif (it != reflection.vertexInputs.end() && it->second >= 0)\n\t\t\t\t\t\tusedInputLocationBits |= (1ull << it->second);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Second pass: set input locations which were not part of the above pass,\n\t\t\t// they need to not overlap. And then store all input locations for later use.\n\t\t\tfor (const auto &var : interfacevars)\n\t\t\t{\n\t\t\t\tif (msl.get_storage_class(var) == spv::StorageClassInput)\n\t\t\t\t{\n\t\t\t\t\tconst std::string &name = msl.get_name(var);\n\n\t\t\t\t\tauto it = reflection.vertexInputs.find(name);\n\t\t\t\t\tif (it == reflection.vertexInputs.end() || it->second < 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (int i = 0; i < 64; i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ((usedInputLocationBits & (1ull << i)) == 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tusedInputLocationBits |= (1ull << i);\n\t\t\t\t\t\t\t\tmsl.set_decoration(var, spv::DecorationLocation, i);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tint location = (int)msl.get_decoration(var, spv::DecorationLocation);\n\t\t\t\t\tDataBaseType basetype = DATA_BASETYPE_FLOAT;\n\n\t\t\t\t\tswitch (msl.get_type_from_variable(var).basetype)\n\t\t\t\t\t{\n\t\t\t\t\tcase spirv_cross::SPIRType::Int:\n\t\t\t\t\t\tbasetype = DATA_BASETYPE_INT;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase spirv_cross::SPIRType::UInt:\n\t\t\t\t\t\tbasetype = DATA_BASETYPE_UINT;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tattributes[name] = { location, basetype };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const auto &varying : resources.stage_outputs)\n\t\t\t{\n\t\t\t\tvaryings[varying.name] = nextVaryingLocation;\n\t\t\t\tmsl.set_decoration(varying.id, spv::DecorationLocation, nextVaryingLocation);\n\n\t\t\t\tconst auto &type = msl.get_type(varying.base_type_id);\n\t\t\t\tint count = type.array.empty() ? 1 : type.array[0];\n\t\t\t\tif (type.op == spv::OpTypeMatrix)\n\t\t\t\t\tcount *= type.columns;\n\n\t\t\t\tnextVaryingLocation += count;\n\t\t\t}\n\t\t}\n\t\telse if (stageindex == SHADERSTAGE_PIXEL)\n\t\t{\n\t\t\tfor (const auto &varying : resources.stage_inputs)\n\t\t\t{\n\t\t\t\tconst auto it = varyings.find(varying.name);\n\t\t\t\tif (it != varyings.end())\n\t\t\t\t\tmsl.set_decoration(varying.id, spv::DecorationLocation, it->second);\n\t\t\t}\n\t\t}\n\n\t\tCompilerMSL::Options options;\n\t\toptions.set_msl_version(2, 1);\n\t\toptions.texture_buffer_native = true;\n#ifdef LOVE_IOS\n\t\toptions.platform = CompilerMSL::Options::iOS;\n#else\n\t\toptions.platform = CompilerMSL::Options::macOS;\n#endif\n\n\t\tmsl.set_msl_options(options);\n\n\t\tstd::string source = msl.compile();\n//\t\tprintf(\"// MSL SOURCE for stage %d:\\n\\n%s\\n\\n\", stageindex, source.c_str());\n\n\t\tNSString *nssource = [[NSString alloc] initWithBytes:source.c_str()\n\t\t\t\t\t\t\t\t\t\t\t\t\t  length:source.length()\n\t\t\t\t\t\t\t\t\t\t\t\t\tencoding:NSUTF8StringEncoding];\n\n\t\tMTLCompileOptions *opts = [MTLCompileOptions new];\n\n\t\t// Silences warning. We already only use metal on these OS versions.\n\t\tif (@available(macOS 10.14, iOS 12.0, *))\n\t\t\topts.languageVersion = MTLLanguageVersion2_1;\n\n\t\tNSError *err = nil;\n\t\tid<MTLLibrary> library = [device newLibraryWithSource:nssource options:opts error:&err];\n\t\tif (library == nil && err != nil)\n\t\t{\n\t\t\tNSLog(@\"errors: %@\", err);\n\t\t\tNSString *errorstr = err.localizedDescription;\n\t\t\tthrow love::Exception(\"Error compiling converted Metal shader code:\\n\\n%s\", errorstr.UTF8String);\n\t\t}\n\n\t\tfunctions[stageindex] = [library newFunctionWithName:library.functionNames[0]];\n\n\t\tstd::string debugname = getShaderStageDebugName((ShaderStageType)stageindex);\n\t\tif (!debugname.empty())\n\t\t\tfunctions[stageindex].label = @(debugname.c_str());\n\n\t\tauto setTextureBinding = [this](CompilerMSL &msl, int stageindex, const spirv_cross::Resource &resource) -> void\n\t\t{\n\t\t\tstd::string name = canonicaliizeUniformName(resource.name);\n\t\t\tauto it = reflection.allUniforms.find(name);\n\t\t\tif (it == reflection.allUniforms.end())\n\t\t\t{\n\t\t\t\thandleUnknownUniformName(name.c_str());\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tUniformInfo &u = *(it->second);\n\n\t\t\tuint32 texturebinding = msl.get_automatic_msl_resource_binding(resource.id);\n\t\t\tuint32 samplerbinding = msl.get_automatic_msl_resource_binding_secondary(resource.id);\n\n\t\t\tif (texturebinding == (uint32)-1)\n\t\t\t{\n\t\t\t\t// No valid binding, the uniform was likely optimized out because it's not used.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tu.active = true;\n\n\t\t\tif (u.location < 0)\n\t\t\t{\n\t\t\t\tu.location = (int)textureBindings.size();\n\t\t\t\tfor (int i = 0; i < u.count; i++)\n\t\t\t\t{\n\t\t\t\t\tTextureBinding b = {};\n\t\t\t\t\tb.access = u.access;\n\n\t\t\t\t\tif (u.baseType == UNIFORM_SAMPLER)\n\t\t\t\t\t{\n\t\t\t\t\t\tBuiltinUniform builtin = BUILTIN_MAX_ENUM;\n\t\t\t\t\t\tif (getConstant(u.name.c_str(), builtin) && builtin == BUILTIN_TEXTURE_MAIN)\n\t\t\t\t\t\t\tb.isMainTexture = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (uint8 &stagebinding : b.textureStages)\n\t\t\t\t\t\tstagebinding = LOVE_UINT8_MAX;\n\t\t\t\t\tfor (uint8 &stagebinding : b.samplerStages)\n\t\t\t\t\t\tstagebinding = LOVE_UINT8_MAX;\n\n\t\t\t\t\ttextureBindings.push_back(b);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (int i = 0; i < u.count; i++)\n\t\t\t{\n\t\t\t\tauto &b = textureBindings[u.location + i];\n\t\t\t\tb.textureStages[stageindex] = (uint8) texturebinding;\n\t\t\t\tb.samplerStages[stageindex] = (uint8) samplerbinding;\n\t\t\t}\n\n\t\t\tBuiltinUniform builtin;\n\t\t\tif (getConstant(name.c_str(), builtin))\n\t\t\t\tbuiltinUniformInfo[builtin] = &u;\n\t\t};\n\n\t\tfor (const auto &resource : resources.sampled_images)\n\t\t{\n\t\t\tsetTextureBinding(msl, stageindex, resource);\n\t\t}\n\n\t\tfor (const auto &resource : resources.storage_images)\n\t\t{\n\t\t\tsetTextureBinding(msl, stageindex, resource);\n\t\t}\n\n\t\tfor (const auto &resource : resources.storage_buffers)\n\t\t{\n\t\t\tstd::string name = canonicaliizeUniformName(resource.name);\n\t\t\tauto it = reflection.storageBuffers.find(name);\n\t\t\tif (it == reflection.storageBuffers.end())\n\t\t\t{\n\t\t\t\thandleUnknownUniformName(name.c_str());\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tUniformInfo &u = it->second;\n\n\t\t\tuint32 bufferbinding = msl.get_automatic_msl_resource_binding(resource.id);\n\t\t\tif (bufferbinding == (uint32)-1)\n\t\t\t{\n\t\t\t\t// No valid binding, the uniform was likely optimized out because it's not used.\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tu.active = true;\n\n\t\t\tif (u.location < 0)\n\t\t\t{\n\t\t\t\tu.location = (int)bufferBindings.size();\n\t\t\t\tfor (int i = 0; i < u.count; i++)\n\t\t\t\t{\n\t\t\t\t\tBufferBinding b = {};\n\t\t\t\t\tb.access = u.access;\n\n\t\t\t\t\tfor (uint8 &stagebinding : b.stages)\n\t\t\t\t\t\tstagebinding = LOVE_UINT8_MAX;\n\n\t\t\t\t\tbufferBindings.push_back(b);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (int i = 0; i < u.count; i++)\n\t\t\t\tbufferBindings[u.location + i].stages[stageindex] = (uint8) bufferbinding;\n\t\t}\n\t}\n\n\t// Initialize default resource bindings.\n\tfor (const auto &kvp : reflection.allUniforms)\n\t{\n\t\tconst UniformInfo *info = kvp.second;\n\t\tswitch (info->baseType)\n\t\t{\n\t\tcase UNIFORM_SAMPLER:\n\t\tcase UNIFORM_STORAGETEXTURE:\n\t\t\tsendTextures(info, &activeTextures[info->resourceIndex], info->count, true);\n\t\t\tbreak;\n\t\tcase UNIFORM_TEXELBUFFER:\n\t\tcase UNIFORM_STORAGEBUFFER:\n\t\t\tsendBuffers(info, &activeBuffers[info->resourceIndex], info->count, true);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tfirstVertexBufferBinding = metalBufferIndices[SHADERSTAGE_VERTEX];\n}\n\nShader::~Shader()\n{ @autoreleasepool {\n\tfor (int i = 0; i < SHADERSTAGE_MAX_ENUM; i++)\n\t\tfunctions[i] = nil;\n\n\tfor (const auto &kvp : cachedRenderPipelines)\n\t\tCFBridgingRelease(kvp.second);\n\n\tcachedRenderPipelines.clear();\n\n\tdelete[] localUniformStagingData;\n\tdelete[] localUniformBufferData;\n}}\n\nvoid Shader::attach()\n{\n\tif (current != this)\n\t{\n\t\tGraphics *gfx = Graphics::getInstance();\n\t\tgfx->flushBatchedDraws();\n\t\tgfx->setShaderChanged();\n\t\tcurrent = this;\n\t}\n}\n\nint Shader::getVertexAttributeIndex(const std::string &name)\n{\n\tconst auto it = attributes.find(name);\n\treturn it != attributes.end() ? it->second.index : -1;\n}\n\nconst Shader::UniformInfo *Shader::getUniformInfo(BuiltinUniform builtin) const\n{\n\treturn builtinUniformInfo[(int)builtin];\n}\n\nvoid Shader::updateUniform(const UniformInfo *info, int count)\n{\n\tif (info->dataSize == 0)\n\t\treturn;\n\n\tif (current == this)\n\t\tGraphics::flushBatchedDrawsGlobal();\n\n\tcount = std::min(count, info->count);\n\n\tsize_t offset = (const uint8 *)info->data - localUniformStagingData;\n\tuint8 *dst = localUniformBufferData + offset;\n\n\tcopyToUniformBuffer(info, info->data, dst, count);\n}\n\nvoid Shader::applyTexture(const UniformInfo *info, int i, love::graphics::Texture *texture, UniformType /*basetype*/, bool isdefault)\n{ @autoreleasepool {\n\tif (info->location < 0)\n\t\treturn;\n\n\tint bindingindex = info->location + i;\n\tif (bindingindex < 0)\n\t\treturn;\n\n\tauto &binding = textureBindings[bindingindex];\n\tif (isdefault && (binding.access & ACCESS_WRITE) != 0)\n\t{\n\t\tbinding.texture = nil;\n\t\tbinding.samplerTexture = nullptr;\n\t}\n\telse\n\t{\n\t\tbinding.texture = getMTLTexture(texture);\n\t\tbinding.samplerTexture = texture;\n\t}\n}}\n\nvoid Shader::applyBuffer(const UniformInfo *info, int i, love::graphics::Buffer *buffer, UniformType basetype, bool isdefault)\n{ @autoreleasepool {\n\tif (info->location < 0)\n\t\treturn;\n\n\tint bindingindex = info->location + i;\n\tif (basetype == UNIFORM_TEXELBUFFER && bindingindex >= 0)\n\t{\n\t\ttextureBindings[bindingindex].texture = getMTLTexture(buffer);\n\t}\n\telse if (basetype == UNIFORM_STORAGEBUFFER && bindingindex >= 0)\n\t{\n\t\tauto &binding = bufferBindings[bindingindex];\n\t\tif (isdefault && (binding.access & ACCESS_WRITE) != 0)\n\t\t\tbinding.buffer = nil;\n\t\telse\n\t\t\tbinding.buffer = getMTLBuffer(buffer);\n\t}\n}}\n\nid<MTLRenderPipelineState> Shader::getCachedRenderPipeline(graphics::Graphics *gfx, const RenderPipelineKey &key)\n{\n\tauto it = cachedRenderPipelines.find(key);\n\n\tif (it != cachedRenderPipelines.end())\n\t\treturn (__bridge id<MTLRenderPipelineState>) it->second;\n\n\tid<MTLDevice> device = Graphics::getInstance()->device;\n\n\tMTLRenderPipelineDescriptor *desc = [MTLRenderPipelineDescriptor new];\n\n\tdesc.vertexFunction = functions[SHADERSTAGE_VERTEX];\n\tdesc.fragmentFunction = functions[SHADERSTAGE_PIXEL];\n\n\tdesc.rasterSampleCount = std::max((int) key.msaa, 1);\n\n\tfor (int i = 0; i < MAX_COLOR_RENDER_TARGETS; i++)\n\t{\n\t\tPixelFormat format = (PixelFormat)((key.colorRenderTargetFormats >> (i * 8)) & 0xFF);\n\t\tif (format == PIXELFORMAT_UNKNOWN)\n\t\t\tcontinue;\n\n\t\tMTLRenderPipelineColorAttachmentDescriptor *attachment = desc.colorAttachments[i];\n\n\t\tauto formatdesc = Metal::convertPixelFormat(device, format);\n\t\tattachment.pixelFormat = formatdesc.format;\n\n\t\tBlendState blend = BlendState::fromKey(key.blendStateKey);\n\n\t\tif (blend.enable && gfx->isPixelFormatSupported(format, PIXELFORMATUSAGEFLAGS_BLEND))\n\t\t{\n\t\t\tattachment.blendingEnabled = YES;\n\t\t\tattachment.sourceRGBBlendFactor = getMTLBlendFactor(blend.srcFactorRGB);\n\t\t\tattachment.destinationRGBBlendFactor = getMTLBlendFactor(blend.dstFactorRGB);\n\t\t\tattachment.rgbBlendOperation = getMTLBlendOperation(blend.operationRGB);\n\t\t\tattachment.sourceAlphaBlendFactor = getMTLBlendFactor(blend.srcFactorA);\n\t\t\tattachment.destinationAlphaBlendFactor = getMTLBlendFactor(blend.dstFactorA);\n\t\t\tattachment.alphaBlendOperation = getMTLBlendOperation(blend.operationA);\n\t\t}\n\n\t\tMTLColorWriteMask writeMask = MTLColorWriteMaskNone;\n\t\tif (key.colorChannelMask.r)\n\t\t\twriteMask |= MTLColorWriteMaskRed;\n\t\tif (key.colorChannelMask.g)\n\t\t\twriteMask |= MTLColorWriteMaskGreen;\n\t\tif (key.colorChannelMask.b)\n\t\t\twriteMask |= MTLColorWriteMaskBlue;\n\t\tif (key.colorChannelMask.a)\n\t\t\twriteMask |= MTLColorWriteMaskAlpha;\n\n\t\tattachment.writeMask = writeMask;\n\n\t\tdesc.colorAttachments[i] = attachment;\n\t}\n\n\tauto dsformat = (PixelFormat) key.depthStencilFormat;\n\tif (isPixelFormatDepthStencil(dsformat))\n\t{\n\t\tif (@available(macOS 10.15, iOS 13, *))\n\t\t{\n\t\t\t// We already don't really support metal on older systems, this just\n\t\t\t// silences a compiler warning about it.\n\t\t\tauto formatdesc = Metal::convertPixelFormat(device, dsformat);\n\t\t\tif (isPixelFormatDepth(dsformat))\n\t\t\t\tdesc.depthAttachmentPixelFormat = formatdesc.format;\n\t\t\tif (isPixelFormatStencil(dsformat))\n\t\t\t\tdesc.stencilAttachmentPixelFormat = formatdesc.format;\n\t\t}\n\t}\n\n\tVertexAttributes attributes;\n\tgfx->findVertexAttributes(key.vertexAttributesID, attributes);\n\n\tMTLVertexDescriptor *vertdesc = [MTLVertexDescriptor vertexDescriptor];\n\n\tfor (const auto &pair : this->attributes)\n\t{\n\t\tint i = pair.second.index;\n\t\tuint32 bit = 1u << i;\n\n\t\tif (attributes.enableBits & bit)\n\t\t{\n\t\t\tconst auto &attrib = attributes.attribs[i];\n\t\t\tint metalBufferIndex = firstVertexBufferBinding + attrib.bufferIndex;\n\n\t\t\tvertdesc.attributes[i].format = getMTLVertexFormat(attrib.getFormat());\n\t\t\tvertdesc.attributes[i].offset = attrib.offsetFromVertex;\n\t\t\tvertdesc.attributes[i].bufferIndex = metalBufferIndex;\n\n\t\t\tconst auto &layout = attributes.bufferLayouts[attrib.bufferIndex];\n\n\t\t\tbool instanced = attributes.instanceBits & (1u << attrib.bufferIndex);\n\t\t\tauto step = instanced ? MTLVertexStepFunctionPerInstance : MTLVertexStepFunctionPerVertex;\n\n\t\t\tvertdesc.layouts[metalBufferIndex].stride = layout.stride;\n\t\t\tvertdesc.layouts[metalBufferIndex].stepFunction = step;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tswitch (pair.second.baseType)\n\t\t\t{\n\t\t\tcase DATA_BASETYPE_INT:\n\t\t\t\tvertdesc.attributes[i].format = MTLVertexFormatInt4;\n\t\t\t\tvertdesc.attributes[i].offset = sizeof(float) * 4;\n\t\t\t\tbreak;\n\t\t\tcase DATA_BASETYPE_UINT:\n\t\t\t\tvertdesc.attributes[i].format = MTLVertexFormatUInt4;\n\t\t\t\tvertdesc.attributes[i].offset = sizeof(float) * 4;\n\t\t\t\tbreak;\n\t\t\tcase DATA_BASETYPE_FLOAT:\n\t\t\t\tvertdesc.attributes[i].format = MTLVertexFormatFloat4;\n\t\t\t\tif (i == ATTRIB_COLOR)\n\t\t\t\t\tvertdesc.attributes[i].offset = sizeof(float) * 4 * 2;\n\t\t\t\telse\n\t\t\t\t\tvertdesc.attributes[i].offset = 0;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tvertdesc.attributes[i].bufferIndex = DEFAULT_VERTEX_BUFFER_BINDING;\n\n\t\t\tvertdesc.layouts[DEFAULT_VERTEX_BUFFER_BINDING].stride = sizeof(float) * 4;\n\t\t\tvertdesc.layouts[DEFAULT_VERTEX_BUFFER_BINDING].stepFunction = MTLVertexStepFunctionConstant;\n\t\t\tvertdesc.layouts[DEFAULT_VERTEX_BUFFER_BINDING].stepRate = 0;\n\t\t}\n\t}\n\n\tdesc.vertexDescriptor = vertdesc;\n\n\tNSError *err = nil;\n\tid<MTLRenderPipelineState> pipeline = [device newRenderPipelineStateWithDescriptor:desc error:&err];\n\n\tif (err != nil)\n\t{\n\t\tNSLog(@\"Error creating render pipeline: %@\", err);\n\t\treturn nil;\n\t}\n\n\tcachedRenderPipelines[key] = CFBridgingRetain(pipeline);\n\n\treturn pipeline;\n}\n\nint Shader::getUniformBufferBinding()\n{\n\treturn spirv_cross::ResourceBindingPushConstantBinding;\n}\n\n} // metal\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/metal/ShaderStage.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"graphics/ShaderStage.h\"\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace metal\n{\n\nclass ShaderStage final : public love::graphics::ShaderStage\n{\npublic:\n\n\tShaderStage(love::graphics::Graphics *gfx, ShaderStageType stage, const std::string &source, bool gles, const std::string &cachekey);\n\tvirtual ~ShaderStage();\n\tptrdiff_t getHandle() const override { return 0; }\n\n}; // ShaderStage\n\n} // metal\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/metal/ShaderStage.mm",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"ShaderStage.h\"\n\n#include \"libraries/glslang/glslang/Public/ShaderLang.h\"\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace metal\n{\n\nShaderStage::ShaderStage(love::graphics::Graphics *gfx, ShaderStageType stage, const std::string &source, bool gles, const std::string &cachekey)\n\t: love::graphics::ShaderStage(gfx, stage, source, gles, cachekey)\n{\n\t// Can't store anything in here since the next part of the compilation\n\t// pipeline (glslang to generate spir-v) requires linking stages together\n\t// destructively.\n}\n\nShaderStage::~ShaderStage()\n{\n}\n\n} // metal\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/metal/StreamBuffer.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"graphics/StreamBuffer.h\"\n#include \"Metal.h\"\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace metal\n{\n\nlove::graphics::StreamBuffer *CreateStreamBuffer(id<MTLDevice> device, BufferUsage usage, size_t size);\n\n} // metal\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/metal/StreamBuffer.mm",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"StreamBuffer.h\"\n#include \"Metal.h\"\n#include \"Graphics.h\"\n#include \"common/int.h\"\n\n#include <dispatch/semaphore.h>\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace metal\n{\n\nstatic const int BUFFER_FRAMES = 3;\n\nclass StreamBuffer final : public love::graphics::StreamBuffer\n{\npublic:\n\n\tStreamBuffer(id<MTLDevice> device, BufferUsage usage, size_t size)\n\t\t: love::graphics::StreamBuffer(usage, size)\n\t\t, frameIndex(0)\n\t\t, mappedFrames()\n\t{ @autoreleasepool {\n\t\tMTLResourceOptions opts = MTLResourceStorageModeShared;\n\t\tbuffer = [device newBufferWithLength:size * BUFFER_FRAMES options:opts];\n\t\tif (buffer == nil)\n\t\t\tthrow love::Exception(\"Out of graphics memory.\");\n\n\t\tbuffer.label = [NSString stringWithFormat:@\"StreamBuffer (usage: %d, size: %ld)\", usage, size];\n\n\t\tdata = (uint8 *) buffer.contents;\n\n\t\tfor (int i = 0; i < BUFFER_FRAMES; i++)\n\t\t\tframeSemaphores[i] = dispatch_semaphore_create(1);\n\t}}\n\n\tvirtual ~StreamBuffer()\n\t{ @autoreleasepool {\n\t\tbuffer = nil;\n\t\tfor (int i = 0; i < BUFFER_FRAMES; i++)\n\t\t{\n\t\t\tif (mappedFrames[i])\n\t\t\t\tdispatch_semaphore_signal(frameSemaphores[i]);\n\t\t\tframeSemaphores[i] = nil;\n\t\t}\n\t}}\n\n\tsize_t getGPUReadOffset() const override\n\t{\n\t\treturn (frameIndex * bufferSize) + frameGPUReadOffset;\n\t}\n\n\tMapInfo map(size_t /*minsize*/) override\n\t{\n\t\t// Make sure this frame's section of the buffer is done being used.\n\t\tif (!mappedFrames[frameIndex])\n\t\t{\n\t\t\tdispatch_semaphore_wait(frameSemaphores[frameIndex], DISPATCH_TIME_FOREVER);\n\t\t\tmappedFrames[frameIndex] = true;\n\t\t}\n\n\t\tMapInfo info;\n\t\tinfo.size = bufferSize - frameGPUReadOffset;\n\t\tinfo.data = data + (frameIndex * bufferSize) + frameGPUReadOffset;\n\t\treturn info;\n\t}\n\n\tsize_t unmap(size_t /*usedsize*/) override\n\t{\n\t\tsize_t offset = (frameIndex * bufferSize) + frameGPUReadOffset;\n\t\treturn offset;\n\t}\n\n\tvoid nextFrame() override\n\t{\n\t\tid<MTLCommandBuffer> cmd = Graphics::getInstance()->getCommandBuffer();\n\n\t\t// Insert a GPU fence for this frame's section of the data, we'll wait\n\t\t// for it when we try to map that data for writing in subsequent frames.\n\t\tif (mappedFrames[frameIndex])\n\t\t{\n\t\t\t/*__weak*/ dispatch_semaphore_t semaphore = frameSemaphores[frameIndex];\n\t\t\tStreamBuffer *pthis = this;\n\t\t\tpthis->retain();\n\t\t\t[cmd addCompletedHandler:^(id<MTLCommandBuffer> _Nonnull)\n\t\t\t{\n\t\t\t\tdispatch_semaphore_signal(semaphore);\n\t\t\t\tpthis->release();\n\t\t\t}];\n\t\t}\n\n\t\tmappedFrames[frameIndex] = false;\n\t\tframeIndex = (frameIndex + 1) % BUFFER_FRAMES;\n\t\tframeGPUReadOffset = 0;\n\t}\n\n\tvoid markUsed(size_t usedsize) override\n\t{\n\t\t// We insert a fence for all data from this frame at the end of the\n\t\t// frame (in nextFrame), rather than doing anything more fine-grained.\n\t\tframeGPUReadOffset += usedsize;\n\t}\n\n\tptrdiff_t getHandle() const override { return (ptrdiff_t)buffer; }\n\nprivate:\n\n\tid<MTLBuffer> buffer;\n\tuint8 *data;\n\n\tint frameIndex;\n\tdispatch_semaphore_t frameSemaphores[BUFFER_FRAMES];\n\tbool mappedFrames[BUFFER_FRAMES];\n\n}; // StreamBuffer\n\nlove::graphics::StreamBuffer *CreateStreamBuffer(id<MTLDevice> device, BufferUsage usage, size_t size)\n{\n\treturn new StreamBuffer(device, usage, size);\n}\n\n} // metal\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/metal/Texture.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"common/config.h\"\n#include \"common/Color.h\"\n#include \"common/int.h\"\n#include \"graphics/Texture.h\"\n#include \"Metal.h\"\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace metal\n{\n\nclass Texture final : public love::graphics::Texture\n{\npublic:\n\n\tTexture(love::graphics::Graphics *gfx, id<MTLDevice> device, const Settings &settings, const Slices *data);\n\tTexture(love::graphics::Graphics *gfx, id<MTLDevice> device, love::graphics::Texture *base, const Texture::ViewSettings &viewsettings);\n\tvirtual ~Texture();\n\n\tvoid copyFromBuffer(love::graphics::Buffer *source, size_t sourceoffset, int sourcewidth, size_t size, int slice, int mipmap, const Rect &rect) override;\n\tvoid copyToBuffer(love::graphics::Buffer *dest, int slice, int mipmap, const Rect &rect, size_t destoffset, int destwidth, size_t size) override;\n\n\tvoid setSamplerState(const SamplerState &s) override;\n\n\tptrdiff_t getHandle() const override { return (ptrdiff_t) texture; }\n\tptrdiff_t getRenderTargetHandle() const override { return msaaTexture != nil ? (ptrdiff_t) msaaTexture : (ptrdiff_t) texture; }\n\tptrdiff_t getSamplerHandle() const override { return (ptrdiff_t) sampler; }\n\n\tint getMSAA() const override { return actualMSAASamples; }\n\n\tid<MTLSamplerState> getMTLSampler() const { return sampler; }\n\nprivate:\n\n\tvoid uploadByteData(const void *data, size_t size, int level, int slice, const Rect &r) override;\n\tvoid generateMipmapsInternal() override;\n\n\tid<MTLTexture> texture = nil;\n\tid<MTLTexture> msaaTexture = nil;\n\tid<MTLSamplerState> sampler = nil;\n\n\tint actualMSAASamples = 1;\n\n}; // Texture\n\n} // metal\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/metal/Texture.mm",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Texture.h\"\n#include \"Graphics.h\"\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace metal\n{\n\nstatic MTLTextureType getMTLTextureType(TextureType type, int msaa)\n{\n\tswitch (type)\n\t{\n\t\tcase TEXTURE_2D: return msaa > 1 ? MTLTextureType2DMultisample : MTLTextureType2D;\n\t\tcase TEXTURE_VOLUME: return MTLTextureType3D;\n\t\tcase TEXTURE_2D_ARRAY: return MTLTextureType2DArray;\n\t\tcase TEXTURE_CUBE: return MTLTextureTypeCube;\n\t\tcase TEXTURE_MAX_ENUM: return MTLTextureType2D;\n\t}\n\treturn MTLTextureType2D;\n}\n\nTexture::Texture(love::graphics::Graphics *gfxbase, id<MTLDevice> device, const Settings &settings, const Slices *data)\n\t: love::graphics::Texture(gfxbase, settings, data)\n{ @autoreleasepool {\n\tauto gfx = (Graphics *) gfxbase;\n\n\tMTLTextureDescriptor *desc = [MTLTextureDescriptor new];\n\n\tint w = pixelWidth;\n\tint h = pixelHeight;\n\n\tdesc.width = w;\n\tdesc.height = h;\n\tdesc.depth = depth;\n\tdesc.arrayLength = layers;\n\tdesc.mipmapLevelCount = mipmapCount;\n\tdesc.textureType = getMTLTextureType(texType, 1);\n\n\tauto formatdesc = Metal::convertPixelFormat(device, format);\n\tdesc.pixelFormat = formatdesc.format;\n\tif (formatdesc.swizzled)\n\t{\n\t\t// Swizzled formats are already only used on supported systems, this\n\t\t// just silences a compiler warning about it.\n\t\tif (@available(macOS 10.15, iOS 13, *))\n\t\t\tdesc.swizzle = formatdesc.swizzle;\n\t}\n\n\tdesc.storageMode = MTLStorageModePrivate;\n\n\tif (readable)\n\t\tdesc.usage |= MTLTextureUsageShaderRead;\n\tif (renderTarget)\n\t\tdesc.usage |= MTLTextureUsageRenderTarget;\n\tif (computeWrite)\n\t\tdesc.usage |= MTLTextureUsageShaderWrite;\n\n\tfor (PixelFormat viewformat : viewFormats)\n\t{\n\t\tif (getLinearPixelFormat(viewformat) != getLinearPixelFormat(format))\n\t\t{\n\t\t\tdesc.usage |= MTLTextureUsagePixelFormatView;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\ttexture = [device newTextureWithDescriptor:desc];\n\n\tif (texture == nil)\n\t\tthrow love::Exception(\"Out of graphics memory.\");\n\n\tif (!debugName.empty())\n\t\ttexture.label = @(debugName.c_str());\n\n\tactualMSAASamples = gfx->getClosestMSAASamples(getRequestedMSAA());\n\n\tif (actualMSAASamples > 1)\n\t{\n\t\tdesc.sampleCount = actualMSAASamples;\n\t\tdesc.textureType = getMTLTextureType(texType, actualMSAASamples);\n\t\tdesc.usage &= ~MTLTextureUsageShaderRead;\n\n\t\tmsaaTexture = [device newTextureWithDescriptor:desc];\n\t\tif (msaaTexture == nil)\n\t\t{\n\t\t\ttexture = nil;\n\t\t\tthrow love::Exception(\"Out of graphics memory.\");\n\t\t}\n\n\t\tif (!debugName.empty())\n\t\t\tmsaaTexture.label = [@(debugName.c_str()) stringByAppendingString:@\" (MSAA buffer)\"];\n\t}\n\n\tint mipcount = getMipmapCount();\n\n\tbool cangeneratemips = true;\n\n\tif (isPixelFormatDepthStencil(format) || isPixelFormatCompressed(format))\n\t\tcangeneratemips = false;\n\n\t// generateMipmapsForTexture is only supported for color renderable +\n\t// filterable formats.\n\tuint32 genmipsflags = PIXELFORMATUSAGEFLAGS_LINEAR | PIXELFORMATUSAGEFLAGS_RENDERTARGET;\n\tif (!gfx->isPixelFormatSupported(format, (PixelFormatUsageFlags) genmipsflags))\n\t\tcangeneratemips = false;\n\n\tbool shouldgeneratemips = false;\n\n\tstd::vector<uint8> emptydata;\n\tMTLRenderPassDescriptor *passdesc = nil;\n\n\t// Initialize texture.\n\tfor (int mip = 0; mip < mipcount; mip++)\n\t{\n\t\tfor (int slice = 0; slice < getSliceCount(mip); slice++)\n\t\t{\n\t\t\tauto imgd = data != nullptr ? data->get(slice, mip) : nullptr;\n\t\t\tif (imgd != nullptr)\n\t\t\t{\n\t\t\t\tuploadImageData(imgd, mip, slice, 0, 0);\n\t\t\t}\n\t\t\telse if (mip > 0 && cangeneratemips)\n\t\t\t{\n\t\t\t\t// Handled in the generateMipmaps call below.\n\t\t\t\tshouldgeneratemips = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\telse if (getMSAA() <= 1 && !isPixelFormatDepthStencil(format) && !isPixelFormatCompressed(format))\n\t\t\t{\n\t\t\t\t// Initialize to transparent black.\n\t\t\t\tif (emptydata.empty())\n\t\t\t\t\temptydata.resize(getPixelFormatSliceSize(format, w, h));\n\n\t\t\t\tRect r = {0, 0, getPixelWidth(mip), getPixelHeight(mip)};\n\t\t\t\tuploadByteData(emptydata.data(), emptydata.size(), mip, slice, r);\n\t\t\t}\n\t\t\telse if (isRenderTarget())\n\t\t\t{\n\t\t\t\t// Clear to transparent black.\n\t\t\t\tgfx->submitAllEncoders(Graphics::SUBMIT_STORE);\n\t\t\t\tid<MTLCommandBuffer> cmd = gfx->useCommandBuffer();\n\n\t\t\t\tif (passdesc == nil)\n\t\t\t\t\tpassdesc = [MTLRenderPassDescriptor renderPassDescriptor];\n\n\t\t\t\tauto configattachment = [&](MTLRenderPassAttachmentDescriptor *attachment)\n\t\t\t\t{\n\t\t\t\t\tattachment.texture = texture;\n\t\t\t\t\tattachment.level = mip;\n\t\t\t\t\tattachment.slice = texType == TEXTURE_VOLUME ? 0 : slice;\n\t\t\t\t\tattachment.depthPlane = texType == TEXTURE_VOLUME ? slice : 0;\n\t\t\t\t\tattachment.loadAction = MTLLoadActionClear;\n\t\t\t\t\tattachment.storeAction = MTLStoreActionStore;\n\n\t\t\t\t\tif (actualMSAASamples > 1)\n\t\t\t\t\t{\n\t\t\t\t\t\tattachment.texture = msaaTexture;\n\t\t\t\t\t\tattachment.resolveTexture = texture;\n\t\t\t\t\t\tattachment.storeAction = MTLStoreActionStoreAndMultisampleResolve;\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tif (isPixelFormatDepth(format))\n\t\t\t\t{\n\t\t\t\t\tconfigattachment(passdesc.depthAttachment);\n\t\t\t\t\tpassdesc.depthAttachment.clearDepth = 1.0;\n\t\t\t\t}\n\t\t\t\tif (isPixelFormatStencil(format))\n\t\t\t\t{\n\t\t\t\t\tconfigattachment(passdesc.stencilAttachment);\n\t\t\t\t\tpassdesc.stencilAttachment.clearStencil = 0;\n\t\t\t\t}\n\t\t\t\tif (!isPixelFormatDepthStencil(format))\n\t\t\t\t{\n\t\t\t\t\tconfigattachment(passdesc.colorAttachments[0]);\n\t\t\t\t\tpassdesc.colorAttachments[0].clearColor = MTLClearColorMake(0, 0, 0, 0);\n\t\t\t\t}\n\n\t\t\t\tid<MTLRenderCommandEncoder> encoder = [cmd renderCommandEncoderWithDescriptor:passdesc];\n\t\t\t\t[encoder endEncoding];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Shouldn't be possible to get here.\n\t\t\t\tthrow love::Exception(\"Could not initialize texture to transparent black.\");\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateGraphicsMemorySize(true);\n\n\t// Non-readable textures can't have mipmaps (enforced in the base class),\n\t// so generateMipmaps here is fine - when they aren't already initialized.\n\tif (shouldgeneratemips)\n\t\tgenerateMipmaps();\n\n\tsetSamplerState(samplerState);\n}}\n\nTexture::Texture(love::graphics::Graphics *gfx, id<MTLDevice> device, love::graphics::Texture *base, const Texture::ViewSettings &viewsettings)\n\t: love::graphics::Texture(gfx, base, viewsettings)\n{\n\tid<MTLTexture> basetex = ((Texture *) base)->texture;\n\tauto formatdesc = Metal::convertPixelFormat(device, format);\n\tint slices = texType == TEXTURE_CUBE ? 6 : getLayerCount();\n\n\tif (formatdesc.swizzled)\n\t{\n\t\tif (@available(macOS 10.15, iOS 13, *))\n\t\t{\n\t\t\ttexture = [basetex newTextureViewWithPixelFormat:formatdesc.format\n\t\t\t\t\t\t\t\t\t\t\t\t textureType:getMTLTextureType(texType, 1)\n\t\t\t\t\t\t\t\t\t\t\t\t\t  levels:NSMakeRange(parentView.startMipmap, mipmapCount)\n\t\t\t\t\t\t\t\t\t\t\t\t\t  slices:NSMakeRange(parentView.startLayer, slices)\n\t\t\t\t\t\t\t\t\t\t\t\t\t swizzle:formatdesc.swizzle];\n\t\t}\n\t}\n\telse\n\t{\n\t\ttexture = [basetex newTextureViewWithPixelFormat:formatdesc.format\n\t\t\t\t\t\t\t\t\t\t\t textureType:getMTLTextureType(texType, 1)\n\t\t\t\t\t\t\t\t\t\t\t\t  levels:NSMakeRange(parentView.startMipmap, mipmapCount)\n\t\t\t\t\t\t\t\t\t\t\t\t  slices:NSMakeRange(parentView.startLayer, slices)];\n\t}\n\n\tif (texture == nil)\n\t\tthrow love::Exception(\"Could not create Metal texture view.\");\n\n\tif (!debugName.empty())\n\t\ttexture.label = @(debugName.c_str());\n\n\tsetSamplerState(samplerState);\n}\n\nTexture::~Texture()\n{ @autoreleasepool {\n\ttexture = nil;\n\tmsaaTexture = nil;\n\tsampler = nil;\n}}\n\nvoid Texture::uploadByteData(const void *data, size_t size, int level, int slice, const Rect &r)\n{ @autoreleasepool {\n\tauto gfx = Graphics::getInstance();\n\tid<MTLBuffer> buffer = [gfx->device newBufferWithBytes:data\n\t\t\t\t\t\t\t\t\t\t\t\t\tlength:size\n\t\t\t\t\t\t\t\t\t\t\t\t   options:MTLResourceStorageModeShared];\n\n\tid<MTLBlitCommandEncoder> encoder = gfx->useBlitEncoder();\n\n\tint z = 0;\n\tif (texType == TEXTURE_VOLUME)\n\t{\n\t\tz = slice;\n\t\tslice = 0;\n\t}\n\n\tMTLBlitOption options = MTLBlitOptionNone;\n\n\tswitch (format)\n\t{\n\tcase PIXELFORMAT_PVR1_RGB2_UNORM:\n\tcase PIXELFORMAT_PVR1_RGB4_UNORM:\n\tcase PIXELFORMAT_PVR1_RGBA2_UNORM:\n\tcase PIXELFORMAT_PVR1_RGBA4_UNORM:\n\t\tif (@available(macOS 11.0, iOS 9.0, *))\n\t\t\toptions |= MTLBlitOptionRowLinearPVRTC;\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\n\tsize_t rowSize = 0;\n\tif (isCompressed())\n\t\trowSize = getPixelFormatCompressedBlockRowSize(format, r.w);\n\telse\n\t\trowSize = getPixelFormatUncompressedRowSize(format, r.w);\n\n\t// TODO: Verify this is correct for compressed formats at small sizes.\n\tsize_t sliceSize = getPixelFormatSliceSize(format, r.w, r.h);\n\n\t[encoder copyFromBuffer:buffer\n\t\t\t   sourceOffset:0\n\t\t  sourceBytesPerRow:rowSize\n\t\tsourceBytesPerImage:sliceSize\n\t\t\t\t sourceSize:MTLSizeMake(r.w, r.h, 1)\n\t\t\t\t  toTexture:texture\n\t\t   destinationSlice:slice\n\t\t   destinationLevel:level\n\t\t  destinationOrigin:MTLOriginMake(r.x, r.y, z)\n\t\t\t\t\toptions:options];\n}}\n\nvoid Texture::generateMipmapsInternal()\n{ @autoreleasepool {\n\tid<MTLBlitCommandEncoder> encoder = Graphics::getInstance()->useBlitEncoder();\n\t[encoder generateMipmapsForTexture:texture];\n}}\n\nvoid Texture::copyFromBuffer(love::graphics::Buffer *source, size_t sourceoffset, int sourcewidth, size_t size, int slice, int mipmap, const Rect &rect)\n{ @autoreleasepool {\n\tid<MTLBlitCommandEncoder> encoder = Graphics::getInstance()->useBlitEncoder();\n\tid<MTLBuffer> buffer = (__bridge id<MTLBuffer>)(void *) source->getHandle();\n\n\tsize_t rowSize = 0;\n\tif (isCompressed())\n\t\trowSize = getPixelFormatCompressedBlockRowSize(format, sourcewidth);\n\telse\n\t\trowSize = getPixelFormatUncompressedRowSize(format, sourcewidth);\n\n\tint z = texType == TEXTURE_VOLUME ? slice : 0;\n\n\tMTLBlitOption options = MTLBlitOptionNone;\n\tif (isPixelFormatDepthStencil(format))\n\t\toptions = MTLBlitOptionDepthFromDepthStencil;\n\n\t[encoder copyFromBuffer:buffer\n\t\t\t   sourceOffset:sourceoffset\n\t\t  sourceBytesPerRow:rowSize\n\t\tsourceBytesPerImage:size\n\t\t\t\t sourceSize:MTLSizeMake(rect.w, rect.h, 1)\n\t\t\t\t  toTexture:texture\n\t\t   destinationSlice:texType == TEXTURE_VOLUME ? 0 : slice\n\t\t   destinationLevel:mipmap\n\t\t  destinationOrigin:MTLOriginMake(rect.x, rect.y, z)\n\t\t\t\t\toptions:options];\n}}\n\nvoid Texture::copyToBuffer(love::graphics::Buffer *dest, int slice, int mipmap, const Rect &rect, size_t destoffset, int destwidth, size_t size)\n{ @autoreleasepool {\n\tid<MTLBlitCommandEncoder> encoder = Graphics::getInstance()->useBlitEncoder();\n\tid<MTLBuffer> buffer = (__bridge id<MTLBuffer>)(void *) dest->getHandle();\n\n\tsize_t rowSize = 0;\n\tif (isCompressed())\n\t\trowSize = getPixelFormatCompressedBlockRowSize(format, destwidth);\n\telse\n\t\trowSize = getPixelFormatUncompressedRowSize(format, destwidth);\n\n\tint z = texType == TEXTURE_VOLUME ? slice : 0;\n\n\tMTLBlitOption options = MTLBlitOptionNone;\n\tif (isPixelFormatDepthStencil(format))\n\t\toptions = MTLBlitOptionDepthFromDepthStencil;\n\n\t[encoder copyFromTexture:texture\n\t\t\t\t sourceSlice:texType == TEXTURE_VOLUME ? 0 : slice\n\t\t\t\t sourceLevel:mipmap\n\t\t\t\tsourceOrigin:MTLOriginMake(rect.x, rect.y, z)\n\t\t\t\t  sourceSize:MTLSizeMake(rect.w, rect.h, 1)\n\t\t\t\t\ttoBuffer:buffer\n\t\t   destinationOffset:destoffset\n\t  destinationBytesPerRow:rowSize\n\tdestinationBytesPerImage:size\n\t\t\t\t\t options:options];\n}}\n\nvoid Texture::setSamplerState(const SamplerState &s)\n{ @autoreleasepool {\n\tif (s.depthSampleMode.hasValue && !Graphics::getInstance()->isDepthCompareSamplerSupported())\n\t\tthrow love::Exception(\"Depth comparison sampling in shaders is not supported on this system.\");\n\n\tsamplerState = validateSamplerState(s);\n\tsampler = Graphics::getInstance()->getCachedSampler(samplerState);\n}}\n\n} // metal\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/opengl/Buffer.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Buffer.h\"\n\n#include \"common/Exception.h\"\n#include \"graphics/vertex.h\"\n#include \"Graphics.h\"\n\n#include <cstdlib>\n#include <cstring>\n#include <algorithm>\n#include <limits>\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace opengl\n{\n\nstatic GLenum getGLFormat(DataFormat format)\n{\n\tswitch (format)\n\t{\n\t\tcase DATAFORMAT_FLOAT: return GL_R32F;\n\t\tcase DATAFORMAT_FLOAT_VEC2: return GL_RG32F;\n\t\tcase DATAFORMAT_FLOAT_VEC3: return GL_RGB32F;\n\t\tcase DATAFORMAT_FLOAT_VEC4: return GL_RGBA32F;\n\t\tcase DATAFORMAT_INT32: return GL_R32I;\n\t\tcase DATAFORMAT_INT32_VEC2: return GL_RG32I;\n\t\tcase DATAFORMAT_INT32_VEC3: return GL_RGB32I;\n\t\tcase DATAFORMAT_INT32_VEC4: return GL_RGBA32I;\n\t\tcase DATAFORMAT_UINT32: return GL_R32UI;\n\t\tcase DATAFORMAT_UINT32_VEC2: return GL_RG32UI;\n\t\tcase DATAFORMAT_UINT32_VEC3: return GL_RGB32UI;\n\t\tcase DATAFORMAT_UINT32_VEC4: return GL_RGBA32UI;\n\t\tcase DATAFORMAT_UNORM8_VEC4: return GL_RGBA8;\n\t\tcase DATAFORMAT_INT8_VEC4: return GL_RGBA8I;\n\t\tcase DATAFORMAT_UINT8_VEC4: return GL_RGBA8UI;\n\t\tcase DATAFORMAT_UNORM16_VEC2: return GL_RG16;\n\t\tcase DATAFORMAT_UNORM16_VEC4: return GL_RGBA16;\n\t\tcase DATAFORMAT_INT16_VEC2: return GL_RG16I;\n\t\tcase DATAFORMAT_INT16_VEC4: return GL_RGBA16I;\n\t\tcase DATAFORMAT_UINT16: return GL_R16UI;\n\t\tcase DATAFORMAT_UINT16_VEC2: return GL_RG16UI;\n\t\tcase DATAFORMAT_UINT16_VEC4: return GL_RGBA16UI;\n\t\tdefault: return GL_ZERO;\n\t}\n}\n\nBuffer::Buffer(love::graphics::Graphics *gfx, const Settings &settings, const std::vector<DataDeclaration> &format, const void *data, size_t size, size_t arraylength)\n\t: love::graphics::Buffer(gfx, settings, format, size, arraylength)\n{\n\tsize = getSize();\n\tarraylength = getArrayLength();\n\n\tif (usageFlags & BUFFERUSAGEFLAG_TEXEL)\n\t\tmapUsage = BUFFERUSAGE_TEXEL;\n\telse if (usageFlags & BUFFERUSAGEFLAG_VERTEX)\n\t\tmapUsage = BUFFERUSAGE_VERTEX;\n\telse if (usageFlags & BUFFERUSAGEFLAG_INDEX)\n\t\tmapUsage = BUFFERUSAGE_INDEX;\n\telse if (usageFlags & BUFFERUSAGEFLAG_SHADER_STORAGE)\n\t\tmapUsage = BUFFERUSAGE_SHADER_STORAGE;\n\telse if (usageFlags & BUFFERUSAGEFLAG_INDIRECT_ARGUMENTS)\n\t\tmapUsage = BUFFERUSAGE_INDIRECT_ARGUMENTS;\n\n\ttarget = OpenGL::getGLBufferType(mapUsage);\n\n\tif (dataUsage == BUFFERDATAUSAGE_STREAM)\n\t\townsMemoryMap = true;\n\n\tstd::vector<uint8> emptydata;\n\tif (settings.zeroInitialize && data == nullptr && !GLAD_VERSION_4_3)\n\t{\n\t\ttry\n\t\t{\n\t\t\temptydata.resize(getSize());\n\t\t\tdata = emptydata.data();\n\t\t}\n\t\tcatch (std::exception &)\n\t\t{\n\t\t\tdata = nullptr;\n\t\t}\n\t}\n\n\tif (!load(data))\n\t{\n\t\tunloadVolatile();\n\t\tthrow love::Exception(\"Could not create buffer with %d bytes (out of VRAM?)\", size);\n\t}\n\n\tif (settings.zeroInitialize && data == nullptr && GLAD_VERSION_4_3)\n\t{\n\t\tgl.bindBuffer(mapUsage, buffer);\n\t\tglClearBufferData(target, GL_R8UI, GL_RED, GL_UNSIGNED_BYTE, nullptr);\n\t}\n}\n\nBuffer::~Buffer()\n{\n\tunloadVolatile();\n\tif (memoryMap != nullptr && ownsMemoryMap)\n\t\tfree(memoryMap);\n}\n\nbool Buffer::loadVolatile()\n{\n\tif (buffer != 0)\n\t\treturn true;\n\n\treturn load(nullptr);\n}\n\nvoid Buffer::unloadVolatile()\n{\n\tmapped = false;\n\tif (buffer != 0)\n\t\tgl.deleteBuffer(buffer);\n\tbuffer = 0;\n\tif (texture != 0)\n\t\tgl.deleteTexture(texture);\n\ttexture = 0;\n}\n\nbool Buffer::load(const void *initialdata)\n{\n\twhile (glGetError() != GL_NO_ERROR)\n\t\t/* Clear the error buffer. */;\n\n\tglGenBuffers(1, &buffer);\n\tgl.bindBuffer(mapUsage, buffer);\n\n\tGLenum gldatausage = OpenGL::getGLBufferDataUsage(getDataUsage());\n\n\t// initialdata can be null.\n\tglBufferData(target, (GLsizeiptr) getSize(), initialdata, gldatausage);\n\n\tif (getUsageFlags() & BUFFERUSAGEFLAG_TEXEL)\n\t{\n\t\tglGenTextures(1, &texture);\n\t\tgl.bindBufferTextureToUnit(texture, 0, false, true);\n\n\t\tGLenum glformat = getGLFormat(getDataMember(0).decl.format);\n\n\t\tglTexBuffer(target, glformat, buffer);\n\t}\n\n\tif (!debugName.empty() && (GLAD_VERSION_4_3 || GLAD_ES_VERSION_3_2))\n\t\tglObjectLabel(GL_BUFFER, buffer, -1, debugName.c_str());\n\n\treturn (glGetError() == GL_NO_ERROR);\n}\n\nbool Buffer::supportsOrphan() const\n{\n\treturn dataUsage == BUFFERDATAUSAGE_STREAM || dataUsage == BUFFERDATAUSAGE_DYNAMIC;\n}\n\nvoid *Buffer::map(MapType map, size_t offset, size_t size)\n{\n\tif (size == 0)\n\t\treturn nullptr;\n\n\tif (map == MAP_WRITE_INVALIDATE && (isImmutable() || dataUsage == BUFFERDATAUSAGE_READBACK))\n\t\treturn nullptr;\n\n\tif (map == MAP_READ_ONLY && dataUsage != BUFFERDATAUSAGE_READBACK)\n\t\treturn  nullptr;\n\n\tRange r(offset, size);\n\n\tif (!Range(0, getSize()).contains(r))\n\t\treturn nullptr;\n\n\tchar *data = nullptr;\n\n\tif (map == MAP_READ_ONLY)\n\t{\n\t\tgl.bindBuffer(mapUsage, buffer);\n\t\tdata = (char *) glMapBufferRange(target, offset, size, GL_MAP_READ_BIT);\n\t}\n\telse if (ownsMemoryMap)\n\t{\n\t\tif (memoryMap == nullptr)\n\t\t\tmemoryMap = (char *) malloc(getSize());\n\t\tdata = memoryMap;\n\t}\n\telse\n\t{\n\t\tauto gfx = Module::getInstance<Graphics>(Module::M_GRAPHICS);\n\t\tdata = (char *) gfx->getBufferMapMemory(size);\n\t}\n\n\tif (data != nullptr)\n\t{\n\t\tmapped = true;\n\t\tmappedType = map;\n\t\tmappedRange = r;\n\t\tif (!ownsMemoryMap)\n\t\t\tmemoryMap = data;\n\t}\n\n\treturn data;\n}\n\nvoid Buffer::unmap(size_t usedoffset, size_t usedsize)\n{\n\tRange r(usedoffset, usedsize);\n\n\tif (!mapped || !mappedRange.contains(r))\n\t\treturn;\n\n\tmapped = false;\n\n\tif (mappedType == MAP_READ_ONLY)\n\t{\n\t\tgl.bindBuffer(mapUsage, buffer);\n\t\tglUnmapBuffer(target);\n\t\tif (!ownsMemoryMap)\n\t\t\tmemoryMap = nullptr;\n\t\treturn;\n\t}\n\n\t// Orphan optimization - see fill().\n\tif (supportsOrphan() && mappedRange.first == 0 && mappedRange.getSize() == getSize())\n\t{\n\t\tusedoffset = 0;\n\t\tusedsize = getSize();\n\t}\n\n\tchar *data = memoryMap + (usedoffset - mappedRange.getOffset());\n\n\tfill(usedoffset, usedsize, data);\n\n\tif (!ownsMemoryMap)\n\t{\n\t\tauto gfx = Module::getInstance<Graphics>(Module::M_GRAPHICS);\n\t\tgfx->releaseBufferMapMemory(memoryMap);\n\t\tmemoryMap = nullptr;\n\t}\n}\n\nbool Buffer::fill(size_t offset, size_t size, const void *data)\n{\n\tif (size == 0 || isImmutable() || dataUsage == BUFFERDATAUSAGE_READBACK)\n\t\treturn false;\n\n\tsize_t buffersize = getSize();\n\n\tif (!Range(0, buffersize).contains(Range(offset, size)))\n\t\treturn false;\n\n\tGLenum gldatausage = OpenGL::getGLBufferDataUsage(dataUsage);\n\n\tgl.bindBuffer(mapUsage, buffer);\n\n\tif (supportsOrphan() && size == buffersize)\n\t{\n\t\t// \"orphan\" current buffer to avoid implicit synchronisation on the GPU:\n\t\t// http://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-AsynchronousBufferTransfers.pdf\n\t\tglBufferData(target, (GLsizeiptr) buffersize, nullptr, gldatausage);\n\n#if LOVE_WINDOWS\n\t\t// TODO: Verify that this intel codepath is a useful optimization.\n\t\tif (gl.getVendor() == OpenGL::VENDOR_INTEL)\n\t\t\tglBufferData(target, (GLsizeiptr) buffersize, data, gldatausage);\n\t\telse\n#endif\n\t\t\tglBufferSubData(target, 0, (GLsizeiptr) buffersize, data);\n\t}\n\telse\n\t{\n\t\tglBufferSubData(target, (GLintptr) offset, (GLsizeiptr) size, data);\n\t}\n\n\treturn true;\n}\n\nvoid Buffer::clearInternal(size_t offset, size_t size)\n{\n\tif (GLAD_VERSION_4_3)\n\t{\n\t\tgl.bindBuffer(mapUsage, buffer);\n\t\tglClearBufferSubData(target, GL_R8UI, offset, size, GL_RED, GL_UNSIGNED_BYTE, nullptr);\n\t}\n\telse\n\t{\n\t\ttry\n\t\t{\n\t\t\tstd::vector<uint8> emptydata(getSize());\n\t\t\tfill(0, getSize(), emptydata.data());\n\t\t}\n\t\tcatch (std::exception &)\n\t\t{\n\t\t\tthrow love::Exception(\"Out of memory.\");\n\t\t}\n\t}\n}\n\nvoid Buffer::copyTo(love::graphics::Buffer *dest, size_t sourceoffset, size_t destoffset, size_t size)\n{\n\t// TODO: tracked state for these bind types?\n\tglBindBuffer(GL_COPY_READ_BUFFER, buffer);\n\tglBindBuffer(GL_COPY_WRITE_BUFFER, ((Buffer *) dest)->buffer);\n\n\tglCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, sourceoffset, destoffset, size);\n}\n\n} // opengl\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/opengl/Buffer.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/Range.h\"\n#include \"graphics/Buffer.h\"\n#include \"graphics/Volatile.h\"\n\n// OpenGL\n#include \"OpenGL.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nclass Graphics;\n\nnamespace opengl\n{\n\nclass Buffer final : public love::graphics::Buffer, public Volatile\n{\npublic:\n\n\tBuffer(love::graphics::Graphics *gfx, const Settings &settings, const std::vector<DataDeclaration> &format, const void *data, size_t size, size_t arraylength);\n\tvirtual ~Buffer();\n\n\t// Implements Volatile.\n\tbool loadVolatile() override;\n\tvoid unloadVolatile() override;\n\n\tvoid *map(MapType map, size_t offset, size_t size) override;\n\tvoid unmap(size_t usedoffset, size_t usedsize) override;\n\tbool fill(size_t offset, size_t size, const void *data) override;\n\tvoid copyTo(love::graphics::Buffer *dest, size_t sourceoffset, size_t destoffset, size_t size) override;\n\n\tptrdiff_t getHandle() const override { return buffer; };\n\tptrdiff_t getTexelBufferHandle() const override { return texture; };\n\n\tBufferUsage getMapUsage() const { return mapUsage; }\n\nprivate:\n\n\tbool load(const void *initialdata);\n\tbool supportsOrphan() const;\n\n\tvoid clearInternal(size_t offset, size_t size) override;\n\n\tBufferUsage mapUsage = BUFFERUSAGE_VERTEX;\n\tGLenum target = 0;\n\n\t// The buffer object identifier. Assigned by OpenGL.\n\tGLuint buffer = 0;\n\n\t// Used for Texel Buffer types.\n\tGLuint texture = 0;\n\n\t// A pointer to mapped memory.\n\tchar *memoryMap = nullptr;\n\tbool ownsMemoryMap = false;\n\n\tRange mappedRange;\n\n}; // Buffer\n\n} // opengl\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/opengl/FenceSync.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n\n#include \"FenceSync.h\"\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace opengl\n{\n\nFenceSync::~FenceSync()\n{\n\tcleanup();\n}\n\nbool FenceSync::fence()\n{\n\tbool wasActive = sync != 0;\n\n\tif (wasActive)\n\t\tcleanup();\n\n\tsync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);\n\n\treturn !wasActive;\n}\n\nbool FenceSync::isComplete() const\n{\n\tif (sync == 0)\n\t\treturn true;\n\n\tGLenum status = glClientWaitSync(sync, 0, 0);\n\n\tif (status == GL_ALREADY_SIGNALED || status == GL_CONDITION_SATISFIED)\n\t\treturn true;\n\n\tif (status == GL_WAIT_FAILED)\n\t\treturn true;\n\n\treturn false;\n}\n\nbool FenceSync::cpuWait()\n{\n\tif (sync == 0)\n\t\treturn false;\n\n\tGLbitfield flags = 0;\n\tGLuint64 duration = 0;\n\n\twhile (true)\n\t{\n\t\tGLenum status = glClientWaitSync(sync, flags, duration);\n\n\t\tif (status == GL_ALREADY_SIGNALED || status == GL_CONDITION_SATISFIED)\n\t\t\tbreak;\n\n\t\tif (status == GL_WAIT_FAILED)\n\t\t\tbreak;\n\n\t\tflags = GL_SYNC_FLUSH_COMMANDS_BIT;\n\t\tduration = 1000000000; // 1 second in nanoseconds.\n\t}\n\n\tcleanup();\n\n\treturn true;\n}\n\nvoid FenceSync::cleanup()\n{\n\tif (sync != 0)\n\t{\n\t\tglDeleteSync(sync);\n\t\tsync = 0;\n\t}\n}\n\n} // opengl\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/opengl/FenceSync.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"OpenGL.h\"\n\n// C\n#include <stddef.h>\n#include <vector>\n\n#pragma once\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace opengl\n{\n\nclass FenceSync\n{\npublic:\n\n\tFenceSync() : sync(0) {}\n\t~FenceSync();\n\n\tbool fence();\n\tbool isComplete() const;\n\tbool cpuWait();\n\tvoid cleanup();\n\nprivate:\n\n\tGLsync sync;\n\n}; // FenceSync\n\n} // opengl\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/opengl/Graphics.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/math.h\"\n#include \"common/Vector.h\"\n\n#include \"Graphics.h\"\n#include \"font/Font.h\"\n#include \"StreamBuffer.h\"\n#include \"GraphicsReadback.h\"\n#include \"math/MathModule.h\"\n#include \"window/Window.h\"\n#include \"Buffer.h\"\n#include \"ShaderStage.h\"\n\n#include \"libraries/xxHash/xxhash.h\"\n\n// C++\n#include <vector>\n#include <sstream>\n#include <algorithm>\n#include <iterator>\n\n// C\n#include <cmath>\n#include <cstdio>\n\n#ifdef LOVE_IOS\n#include <SDL3/SDL_video.h>\n#endif\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace opengl\n{\n\nstatic GLenum getGLBlendOperation(BlendOperation op)\n{\n\tswitch (op)\n\t{\n\t\tcase BLENDOP_ADD: return GL_FUNC_ADD;\n\t\tcase BLENDOP_SUBTRACT: return GL_FUNC_SUBTRACT;\n\t\tcase BLENDOP_REVERSE_SUBTRACT: return GL_FUNC_REVERSE_SUBTRACT;\n\t\tcase BLENDOP_MIN: return GL_MIN;\n\t\tcase BLENDOP_MAX: return GL_MAX;\n\t\tcase BLENDOP_MAX_ENUM: return 0;\n\t}\n\treturn 0;\n}\n\nstatic GLenum getGLBlendFactor(BlendFactor factor)\n{\n\tswitch (factor)\n\t{\n\t\tcase BLENDFACTOR_ZERO: return GL_ZERO;\n\t\tcase BLENDFACTOR_ONE: return GL_ONE;\n\t\tcase BLENDFACTOR_SRC_COLOR: return GL_SRC_COLOR;\n\t\tcase BLENDFACTOR_ONE_MINUS_SRC_COLOR: return GL_ONE_MINUS_SRC_COLOR;\n\t\tcase BLENDFACTOR_SRC_ALPHA: return GL_SRC_ALPHA;\n\t\tcase BLENDFACTOR_ONE_MINUS_SRC_ALPHA: return GL_ONE_MINUS_SRC_ALPHA;\n\t\tcase BLENDFACTOR_DST_COLOR: return GL_DST_COLOR;\n\t\tcase BLENDFACTOR_ONE_MINUS_DST_COLOR: return GL_ONE_MINUS_DST_COLOR;\n\t\tcase BLENDFACTOR_DST_ALPHA: return GL_DST_ALPHA;\n\t\tcase BLENDFACTOR_ONE_MINUS_DST_ALPHA: return GL_ONE_MINUS_DST_ALPHA;\n\t\tcase BLENDFACTOR_SRC_ALPHA_SATURATED: return GL_SRC_ALPHA_SATURATE;\n\t\tcase BLENDFACTOR_MAX_ENUM: return 0;\n\t}\n\treturn 0;\n}\n\nlove::graphics::Graphics *createInstance()\n{\n\tlove::graphics::Graphics *instance = nullptr;\n\n\ttry\n\t{\n\t\tinstance = new Graphics();\n\t}\n\tcatch (love::Exception &e)\n\t{\n\t\tprintf(\"Cannot create OpenGL renderer: %s\\n\", e.what());\n\t}\n\n\treturn instance;\n}\n\nGraphics::Graphics()\n\t: love::graphics::Graphics(\"love.graphics.opengl\")\n\t, windowHasStencil(false)\n\t, mainVAO(0)\n\t, internalBackbufferFBO(0)\n\t, requestedBackbufferMSAA(0)\n\t, bufferMapMemory(nullptr)\n\t, bufferMapMemorySize(2 * 1024 * 1024)\n\t, pixelFormatUsage()\n{\n\tgl = OpenGL();\n\n\ttry\n\t{\n\t\tbufferMapMemory = new char[bufferMapMemorySize];\n\t}\n\tcatch (std::exception &)\n\t{\n\t\t// Handled in getBufferMapMemory.\n\t}\n\n\tauto window = getInstance<love::window::Window>(M_WINDOW);\n\n\tif (window != nullptr)\n\t{\n\t\twindow->setGraphics(this);\n\n\t\t// Recreate the window using the current renderer, if needed.\n\t\tif (window->isOpen())\n\t\t{\n\t\t\tint w, h;\n\t\t\tlove::window::WindowSettings settings;\n\t\t\twindow->getWindow(w, h, settings);\n\t\t\twindow->setWindow(w, h, &settings);\n\t\t}\n\t}\n}\n\nGraphics::~Graphics()\n{\n\tdelete[] bufferMapMemory;\n}\n\nlove::graphics::StreamBuffer *Graphics::newStreamBuffer(BufferUsage type, size_t size)\n{\n\treturn CreateStreamBuffer(type, size);\n}\n\nlove::graphics::Texture *Graphics::newTexture(const Texture::Settings &settings, const Texture::Slices *data)\n{\n\treturn new Texture(this, settings, data);\n}\n\nlove::graphics::Texture *Graphics::newTextureView(love::graphics::Texture *base, const Texture::ViewSettings &viewsettings)\n{\n\treturn new Texture(this, base, viewsettings);\n}\n\nlove::graphics::ShaderStage *Graphics::newShaderStageInternal(ShaderStageType stage, const std::string &cachekey, const std::string &source, bool gles)\n{\n\treturn new ShaderStage(this, stage, source, gles, cachekey);\n}\n\nlove::graphics::Shader *Graphics::newShaderInternal(StrongRef<love::graphics::ShaderStage> stages[SHADERSTAGE_MAX_ENUM], const Shader::CompileOptions &options)\n{\n\treturn new Shader(stages, options);\n}\n\nlove::graphics::Buffer *Graphics::newBuffer(const Buffer::Settings &settings, const std::vector<Buffer::DataDeclaration> &format, const void *data, size_t size, size_t arraylength)\n{\n\treturn new Buffer(this, settings, format, data, size, arraylength);\n}\n\nlove::graphics::GraphicsReadback *Graphics::newReadbackInternal(ReadbackMethod method, love::graphics::Buffer *buffer, size_t offset, size_t size, data::ByteData *dest, size_t destoffset)\n{\n\treturn new GraphicsReadback(this, method, buffer, offset, size, dest, destoffset);\n}\n\nlove::graphics::GraphicsReadback *Graphics::newReadbackInternal(ReadbackMethod method, love::graphics::Texture *texture, int slice, int mipmap, const Rect &rect, image::ImageData *dest, int destx, int desty)\n{\n\treturn new GraphicsReadback(this, method, texture, slice, mipmap, rect, dest, destx, desty);\n}\n\nvoid Graphics::backbufferChanged(int width, int height, int pixelwidth, int pixelheight, bool backbufferstencil, bool backbufferdepth, int msaa)\n{\n\tbool changed = width != this->width || height != this->height\n\t\t|| pixelwidth != this->pixelWidth || pixelheight != this->pixelHeight;\n\n\tchanged |= backbufferstencil != this->backbufferHasStencil || backbufferdepth != this->backbufferHasDepth;\n\tchanged |= msaa != this->requestedBackbufferMSAA;\n\n\tthis->width = width;\n\tthis->height = height;\n\tthis->pixelWidth = pixelwidth;\n\tthis->pixelHeight = pixelheight;\n\n\tthis->backbufferHasStencil = backbufferstencil;\n\tthis->backbufferHasDepth = backbufferdepth;\n\tthis->requestedBackbufferMSAA = msaa;\n\n\tif (!isRenderTargetActive())\n\t{\n\t\t// Set the viewport to top-left corner.\n\t\tgl.setViewport({0, 0, pixelwidth, pixelheight});\n\n\t\t// Re-apply the scissor if it was active, since the rectangle passed to\n\t\t// glScissor is affected by the viewport dimensions.\n\t\tif (states.back().scissor)\n\t\t\tsetScissor(states.back().scissorRect);\n\n\t\tresetProjection();\n\t}\n\n\tif (!changed)\n\t\treturn;\n\n\tbool useinternalbackbuffer = false;\n\tif (msaa > 1)\n\t\tuseinternalbackbuffer = true;\n\n\tGLuint prevFBO = gl.getFramebuffer(OpenGL::FRAMEBUFFER_ALL);\n\tbool restoreFBO = prevFBO != getInternalBackbufferFBO();\n\n\tif (useinternalbackbuffer)\n\t{\n\t\tTexture::Settings settings;\n\t\tsettings.width = width;\n\t\tsettings.height = height;\n\t\tsettings.dpiScale = (float)pixelheight / (float)height;\n\t\tsettings.msaa = msaa;\n\t\tsettings.renderTarget = true;\n\t\tsettings.readable.set(false);\n\n\t\tsettings.format = isGammaCorrect() ? PIXELFORMAT_RGBA8_sRGB : PIXELFORMAT_RGBA8_UNORM;\n\t\tinternalBackbuffer.set(newTexture(settings), Acquire::NORETAIN);\n\n\t\tinternalBackbufferDepthStencil.set(nullptr);\n\t\tif (backbufferstencil || backbufferdepth)\n\t\t{\n\t\t\tif (backbufferstencil && backbufferdepth)\n\t\t\t\tsettings.format = PIXELFORMAT_DEPTH24_UNORM_STENCIL8;\n\t\t\telse if (backbufferstencil)\n\t\t\t\tsettings.format = PIXELFORMAT_STENCIL8;\n\t\t\telse if (backbufferdepth)\n\t\t\t\tsettings.format = PIXELFORMAT_DEPTH24_UNORM;\n\t\t\tinternalBackbufferDepthStencil.set(newTexture(settings), Acquire::NORETAIN);\n\t\t}\n\n\t\tRenderTargets rts;\n\t\trts.colors.push_back(internalBackbuffer.get());\n\t\trts.depthStencil.texture = internalBackbufferDepthStencil;\n\n\t\tinternalBackbufferFBO = bindCachedFBO(rts);\n\t}\n\telse\n\t{\n\t\tinternalBackbuffer.set(nullptr);\n\t\tinternalBackbufferDepthStencil.set(nullptr);\n\t\tinternalBackbufferFBO = 0;\n\t}\n\n\tif (restoreFBO)\n\t\tgl.bindFramebuffer(OpenGL::FRAMEBUFFER_ALL, prevFBO);\n}\n\nGLuint Graphics::getInternalBackbufferFBO() const\n{\n\tif (internalBackbufferFBO != 0)\n\t\treturn internalBackbufferFBO;\n\telse\n\t\treturn getSystemBackbufferFBO();\n}\n\nGLuint Graphics::getSystemBackbufferFBO() const\n{\n#ifdef LOVE_IOS\n\t// Hack: iOS uses a custom FBO.\n\tSDL_PropertiesID props = SDL_GetWindowProperties(SDL_GL_GetCurrentWindow());\n\tGLuint resolveframebuffer = (GLuint)SDL_GetNumberProperty(props, SDL_PROP_WINDOW_UIKIT_OPENGL_RESOLVE_FRAMEBUFFER_NUMBER, 0);\n\tif (resolveframebuffer != 0)\n\t\treturn resolveframebuffer;\n\telse\n\t\treturn (GLuint)SDL_GetNumberProperty(props, SDL_PROP_WINDOW_UIKIT_OPENGL_FRAMEBUFFER_NUMBER, 0);\n#else\n\treturn 0;\n#endif\n}\n\nbool Graphics::setMode(void */*context*/, int width, int height, int pixelwidth, int pixelheight, bool backbufferstencil, bool backbufferdepth, int msaa)\n{\n\t// Okay, setup OpenGL.\n\tgl.initContext();\n\n\tif (gl.isCoreProfile())\n\t{\n\t\tglGenVertexArrays(1, &mainVAO);\n\t\tglBindVertexArray(mainVAO);\n\t}\n\n\tgl.setupContext();\n\n\tcreated = true;\n\tinitCapabilities();\n\n\t// Enable blending\n\tgl.setEnableState(OpenGL::ENABLE_BLEND, true);\n\n\t// Auto-generated mipmaps should be the best quality possible\n\tif (!gl.isCoreProfile())\n\t\tglHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);\n\n\tif (!GLAD_ES_VERSION_2_0 && !gl.isCoreProfile())\n\t{\n\t\t// Make sure antialiasing works when set elsewhere\n\t\tglEnable(GL_MULTISAMPLE);\n\n\t\t// Enable texturing\n\t\tglEnable(GL_TEXTURE_2D);\n\t}\n\n\tif (!GLAD_ES_VERSION_2_0)\n\t\tglEnable(GL_VERTEX_PROGRAM_POINT_SIZE);\n\n\tgl.setTextureUnit(0);\n\n\t// Set pixel row alignment - code that calls glTexSubImage and glReadPixels\n\t// assumes there's no row alignment, but OpenGL defaults to 4 bytes.\n\tglPixelStorei(GL_UNPACK_ALIGNMENT, 1);\n\tglPixelStorei(GL_PACK_ALIGNMENT, 1);\n\n\t// Always enable seamless cubemap filtering when possible.\n\tif (GLAD_VERSION_3_2 || GLAD_ARB_seamless_cube_map)\n\t\tglEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);\n\n\t// Set whether drawing converts input from linear -> sRGB colorspace.\n\tif (!gl.bugs.brokenSRGB)\n\t{\n\t\tif (GLAD_VERSION_1_0 || GLAD_EXT_sRGB_write_control)\n\t\t\tgl.setEnableState(OpenGL::ENABLE_FRAMEBUFFER_SRGB, isGammaCorrect());\n\t}\n\telse\n\t\tsetGammaCorrect(false);\n\n\tsetDebug(isDebugEnabled());\n\n\tbackbufferChanged(width, height, pixelwidth, pixelheight, backbufferstencil, backbufferdepth, msaa);\n\n\tif (batchedDrawState.vb[0] == nullptr)\n\t{\n\t\t// Initial sizes that should be good enough for most cases. It will\n\t\t// resize to fit if needed, later.\n\t\tbatchedDrawState.vb[0] = CreateStreamBuffer(BUFFERUSAGE_VERTEX, 1024 * 1024 * 1);\n\t\tbatchedDrawState.vb[1] = CreateStreamBuffer(BUFFERUSAGE_VERTEX, 256  * 1024 * 1);\n\t\tbatchedDrawState.indexBuffer = CreateStreamBuffer(BUFFERUSAGE_INDEX, sizeof(uint16) * LOVE_UINT16_MAX);\n\t}\n\n\t// Reload all volatile objects.\n\tif (!Volatile::loadAll())\n\t\t::printf(\"Could not reload all volatile objects.\\n\");\n\n\tcreateQuadIndexBuffer();\n\n\t// Restore the graphics state.\n\trestoreState(states.back());\n\n\t// We always need a default shader.\n\tfor (int i = 0; i < Shader::STANDARD_MAX_ENUM; i++)\n\t{\n\t\tauto stype = (Shader::StandardShader) i;\n\n\t\tif (!Shader::standardShaders[i])\n\t\t{\n\t\t\tstd::vector<std::string> stages;\n\t\t\tShader::CompileOptions opts;\n\t\t\tstages.push_back(Shader::getDefaultCode(stype, SHADERSTAGE_VERTEX));\n\t\t\tstages.push_back(Shader::getDefaultCode(stype, SHADERSTAGE_PIXEL));\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tShader::standardShaders[i] = newShader(stages, opts);\n\t\t\t}\n\t\t\tcatch (love::Exception &)\n\t\t\t{\n\t\t\t\t// Attempted workaround for nvidia driver bug affecting old GPUs\n\t\t\t\t// on Windows (e.g. the 300 series).\n\t\t\t\tif (!isUsingNoTextureCubeShadowBiasHack())\n\t\t\t\t{\n\t\t\t\t\tusingNoTextureCubeShadowBiasHack = true;\n\t\t\t\t\tShader::standardShaders[i] = newShader(stages, opts);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthrow;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// A shader should always be active, but the default shader shouldn't be\n\t// returned by getShader(), so we don't do setShader(defaultShader).\n\tif (!Shader::current)\n\t\tShader::standardShaders[Shader::STANDARD_DEFAULT]->attach();\n\n\treturn true;\n}\n\nvoid Graphics::unSetMode()\n{\n\tif (!isCreated())\n\t\treturn;\n\n\tflushBatchedDraws();\n\n\tinternalBackbuffer.set(nullptr);\n\tinternalBackbufferDepthStencil.set(nullptr);\n\n\t// Unload all volatile objects. These must be reloaded after the display\n\t// mode change.\n\tVolatile::unloadAll();\n\n\tclearTemporaryResources();\n\n\tfor (const auto &pair : framebufferObjects)\n\t\tgl.deleteFramebuffer(pair.second);\n\n\tframebufferObjects.clear();\n\n\tif (mainVAO != 0)\n\t{\n\t\tglDeleteVertexArrays(1, &mainVAO);\n\t\tmainVAO = 0;\n\t}\n\n\tgl.deInitContext();\n\n\tcreated = false;\n}\n\nvoid Graphics::setActive(bool enable)\n{\n\tflushBatchedDraws();\n\n\t// Make sure all pending OpenGL commands have fully executed before\n\t// returning, when going from active to inactive. This is required on iOS.\n\tif (isCreated() && this->active && !enable)\n\t\tglFinish();\n\n\tactive = enable;\n}\n\nstatic bool computeDispatchBarriers(Shader *shader, GLbitfield &preDispatchBarriers, GLbitfield &postDispatchBarriers)\n{\n\tfor (auto buffer : shader->getActiveWritableStorageBuffers())\n\t{\n\t\tif (buffer == nullptr)\n\t\t\treturn false;\n\n\t\tauto usage = buffer->getUsageFlags();\n\n\t\tpostDispatchBarriers |= GL_BUFFER_UPDATE_BARRIER_BIT;\n\n\t\tif (usage & BUFFERUSAGEFLAG_SHADER_STORAGE)\n\t\t{\n\t\t\tpreDispatchBarriers |= GL_SHADER_STORAGE_BARRIER_BIT;\n\t\t\tpostDispatchBarriers |= GL_SHADER_STORAGE_BARRIER_BIT;\n\t\t}\n\n\t\t// TODO: does this need a pre dispatch barrier too?\n\t\tif (usage & BUFFERUSAGEFLAG_INDIRECT_ARGUMENTS)\n\t\t\tpostDispatchBarriers |= GL_COMMAND_BARRIER_BIT;\n\n\t\tif (usage & BUFFERUSAGEFLAG_TEXEL)\n\t\t\tpostDispatchBarriers |= GL_TEXTURE_FETCH_BARRIER_BIT;\n\n\t\tif (usage & BUFFERUSAGEFLAG_INDEX)\n\t\t\tpostDispatchBarriers |= GL_ELEMENT_ARRAY_BARRIER_BIT;\n\n\t\tif (usage & BUFFERUSAGEFLAG_VERTEX)\n\t\t\tpostDispatchBarriers |= GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT;\n\n\t\tpostDispatchBarriers |= GL_PIXEL_BUFFER_BARRIER_BIT;\n\t}\n\n\tfor (const auto &binding : shader->getStorageTextureBindings())\n\t{\n\t\tif (binding.texture == nullptr)\n\t\t\treturn false;\n\n\t\tif (binding.access == GL_READ_ONLY)\n\t\t\tcontinue;\n\n\t\tpreDispatchBarriers |= GL_SHADER_IMAGE_ACCESS_BARRIER_BIT;\n\n\t\tpostDispatchBarriers |= GL_SHADER_IMAGE_ACCESS_BARRIER_BIT\n\t\t\t| GL_TEXTURE_UPDATE_BARRIER_BIT\n\t\t\t| GL_TEXTURE_FETCH_BARRIER_BIT;\n\n\t\tif (binding.texture->isRenderTarget())\n\t\t\tpostDispatchBarriers |= GL_FRAMEBUFFER_BARRIER_BIT;\n\t}\n\n\treturn true;\n}\n\nbool Graphics::dispatch(love::graphics::Shader *s, int x, int y, int z)\n{\n\tauto shader = (Shader *) s;\n\n\tGLbitfield preDispatchBarriers = 0;\n\tGLbitfield postDispatchBarriers = 0;\n\n\tif (!computeDispatchBarriers(shader, preDispatchBarriers, postDispatchBarriers))\n\t\treturn false;\n\n\t// glMemoryBarrier before dispatch to make sure non-compute-read ->\n\t// compute-write is synced.\n\t// TODO: is this needed? spec language around GL_SHADER_IMAGE_ACCESS_BARRIER_BIT\n\t// makes me think so.\n\t// This is overly conservative (dispatch -> dispatch will have redundant\n\t// barriers).\n\tif (preDispatchBarriers != 0)\n\t\tglMemoryBarrier(preDispatchBarriers);\n\n\tglDispatchCompute(x, y, z);\n\n\t// Not as (theoretically) efficient as issuing the barrier right before\n\t// they're used later, but much less complicated.\n\tif (postDispatchBarriers != 0)\n\t\tglMemoryBarrier(postDispatchBarriers);\n\n\treturn true;\n}\n\nbool Graphics::dispatch(love::graphics::Shader *s, love::graphics::Buffer *indirectargs, size_t argsoffset)\n{\n\tauto shader = (Shader *) s;\n\n\tGLbitfield preDispatchBarriers = 0;\n\tGLbitfield postDispatchBarriers = 0;\n\n\tif (!computeDispatchBarriers(shader, preDispatchBarriers, postDispatchBarriers))\n\t\treturn false;\n\n\tif (preDispatchBarriers != 0)\n\t\tglMemoryBarrier(preDispatchBarriers);\n\n\t// Note: OpenGL has separate bind points for draw versus dispatch indirect\n\t// buffers. Our gl.bindBuffer wrapper uses the draw bind point, so we can't\n\t// use it here.\n\tglBindBuffer(GL_DISPATCH_INDIRECT_BUFFER, (GLuint)indirectargs->getHandle());\n\tglDispatchComputeIndirect(argsoffset);\n\n\t// Not as (theoretically) efficient as issuing the barrier right before\n\t// they're used later, but much less complicated.\n\tif (postDispatchBarriers != 0)\n\t\tglMemoryBarrier(postDispatchBarriers);\n\n\treturn true;\n}\n\nvoid Graphics::draw(const DrawCommand &cmd)\n{\n\tVertexAttributes attributes;\n\tfindVertexAttributes(cmd.attributesID, attributes);\n\n\tgl.prepareDraw(this);\n\tgl.setVertexAttributes(attributes, *cmd.buffers);\n\tgl.bindTextureToUnit(cmd.texture, 0, false);\n\tgl.setCullMode(cmd.cullMode);\n\n\tGLenum glprimitivetype = OpenGL::getGLPrimitiveType(cmd.primitiveType);\n\n\tif (cmd.indirectBuffer != nullptr)\n\t{\n\t\tgl.bindBuffer(BUFFERUSAGE_INDIRECT_ARGUMENTS, (GLuint) cmd.indirectBuffer->getHandle());\n\t\tglDrawArraysIndirect(glprimitivetype, BUFFER_OFFSET(cmd.indirectBufferOffset));\n\t}\n\telse if (cmd.instanceCount > 1)\n\t\tglDrawArraysInstanced(glprimitivetype, cmd.vertexStart, cmd.vertexCount, cmd.instanceCount);\n\telse\n\t\tglDrawArrays(glprimitivetype, cmd.vertexStart, cmd.vertexCount);\n\n\t++drawCalls;\n}\n\nvoid Graphics::draw(const DrawIndexedCommand &cmd)\n{\n\tVertexAttributes attributes;\n\tfindVertexAttributes(cmd.attributesID, attributes);\n\n\tgl.prepareDraw(this);\n\tgl.setVertexAttributes(attributes, *cmd.buffers);\n\tgl.bindTextureToUnit(cmd.texture, 0, false);\n\tgl.setCullMode(cmd.cullMode);\n\n\tconst void *gloffset = BUFFER_OFFSET(cmd.indexBufferOffset);\n\tGLenum glprimitivetype = OpenGL::getGLPrimitiveType(cmd.primitiveType);\n\tGLenum gldatatype = OpenGL::getGLIndexDataType(cmd.indexType);\n\n\tgl.bindBuffer(BUFFERUSAGE_INDEX, cmd.indexBuffer->getHandle());\n\n\tif (cmd.indirectBuffer != nullptr)\n\t{\n\t\t// Note: OpenGL doesn't support indirect indexed draws with a non-zero\n\t\t// index buffer offset.\n\t\tgl.bindBuffer(BUFFERUSAGE_INDIRECT_ARGUMENTS, (GLuint) cmd.indirectBuffer->getHandle());\n\t\tglDrawElementsIndirect(glprimitivetype, gldatatype, BUFFER_OFFSET(cmd.indirectBufferOffset));\n\t}\n\telse if (cmd.instanceCount > 1)\n\t\tglDrawElementsInstanced(glprimitivetype, cmd.indexCount, gldatatype, gloffset, cmd.instanceCount);\n\telse\n\t\tglDrawElements(glprimitivetype, cmd.indexCount, gldatatype, gloffset);\n\n\t++drawCalls;\n}\n\nstatic inline void advanceVertexOffsets(const VertexAttributes &attributes, BufferBindings &buffers, int vertexcount)\n{\n\t// TODO: Figure out a better way to avoid touching the same buffer multiple\n\t// times, if multiple attributes share the buffer.\n\tuint32 touchedbuffers = 0;\n\n\tfor (unsigned int i = 0; i < VertexAttributes::MAX; i++)\n\t{\n\t\tif (!attributes.isEnabled(i))\n\t\t\tcontinue;\n\n\t\tauto &attrib = attributes.attribs[i];\n\n\t\tuint32 bufferbit = 1u << attrib.bufferIndex;\n\t\tif ((touchedbuffers & bufferbit) == 0)\n\t\t{\n\t\t\ttouchedbuffers |= bufferbit;\n\t\t\tconst auto &layout = attributes.bufferLayouts[attrib.bufferIndex];\n\t\t\tbuffers.info[attrib.bufferIndex].offset += layout.stride * vertexcount;\n\t\t}\n\t}\n}\n\nvoid Graphics::drawQuads(int start, int count, VertexAttributesID attributesID, const BufferBindings &buffers, love::graphics::Texture *texture)\n{\n\tconst int MAX_VERTICES_PER_DRAW = LOVE_UINT16_MAX;\n\tconst int MAX_QUADS_PER_DRAW    = MAX_VERTICES_PER_DRAW / 4;\n\n\tVertexAttributes attributes;\n\tfindVertexAttributes(attributesID, attributes);\n\n\tgl.prepareDraw(this);\n\tgl.bindTextureToUnit(texture, 0, false);\n\tgl.setCullMode(CULL_NONE);\n\n\tgl.bindBuffer(BUFFERUSAGE_INDEX, quadIndexBuffer->getHandle());\n\n\tif (gl.isBaseVertexSupported())\n\t{\n\t\tgl.setVertexAttributes(attributes, buffers);\n\n\t\tint basevertex = start * 4;\n\n\t\tfor (int quadindex = 0; quadindex < count; quadindex += MAX_QUADS_PER_DRAW)\n\t\t{\n\t\t\tint quadcount = std::min(MAX_QUADS_PER_DRAW, count - quadindex);\n\n\t\t\tglDrawElementsBaseVertex(GL_TRIANGLES, quadcount * 6, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0), basevertex);\n\t\t\t++drawCalls;\n\n\t\t\tbasevertex += quadcount * 4;\n\t\t}\n\t}\n\telse\n\t{\n\t\tBufferBindings bufferscopy = buffers;\n\t\tif (start > 0)\n\t\t\tadvanceVertexOffsets(attributes, bufferscopy, start * 4);\n\n\t\tfor (int quadindex = 0; quadindex < count; quadindex += MAX_QUADS_PER_DRAW)\n\t\t{\n\t\t\tgl.setVertexAttributes(attributes, bufferscopy);\n\n\t\t\tint quadcount = std::min(MAX_QUADS_PER_DRAW, count - quadindex);\n\n\t\t\tglDrawElements(GL_TRIANGLES, quadcount * 6, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0));\n\t\t\t++drawCalls;\n\n\t\t\tif (count > MAX_QUADS_PER_DRAW)\n\t\t\t\tadvanceVertexOffsets(attributes, bufferscopy, quadcount * 4);\n\t\t}\n\t}\n}\n\nstatic void APIENTRY debugCB(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei /*len*/, const GLchar *msg, const GLvoid* /*usr*/)\n{\n\tif (severity == GL_DEBUG_SEVERITY_NOTIFICATION)\n\t\treturn;\n\n\t// Human-readable strings for the debug info.\n\tconst char *sourceStr = OpenGL::debugSourceString(source);\n\tconst char *typeStr = OpenGL::debugTypeString(type);\n\tconst char *severityStr = OpenGL::debugSeverityString(severity);\n\n\tconst char *fmt = \"OpenGL: [source=%s, type=%s, severity=%s, id=%d]: %s\\n\";\n\tprintf(fmt, sourceStr, typeStr, severityStr, id, msg);\n}\n\nvoid Graphics::setDebug(bool enable)\n{\n\t// Make sure debug output is supported. The AMD ext. is a bit different\n\t// so we don't make use of it, since AMD drivers now support KHR_debug.\n\tif (!(GLAD_VERSION_4_3 || GLAD_ES_VERSION_3_2 || GLAD_KHR_debug || GLAD_ARB_debug_output))\n\t\treturn;\n\n\t// TODO: We don't support GL_KHR_debug in GLES yet.\n\tif (GLAD_ES_VERSION_2_0 && !GLAD_ES_VERSION_3_2)\n\t\treturn;\n\n\t// Ugly hack to reduce code duplication.\n\tif (GLAD_ARB_debug_output && !(GLAD_VERSION_4_3 || GLAD_KHR_debug))\n\t{\n\t\tfp_glDebugMessageCallback = (pfn_glDebugMessageCallback) fp_glDebugMessageCallbackARB;\n\t\tfp_glDebugMessageControl = (pfn_glDebugMessageControl) fp_glDebugMessageControlARB;\n\t}\n\n\tif (!enable)\n\t{\n\t\t// Disable the debug callback function.\n\t\tglDebugMessageCallback(nullptr, nullptr);\n\n\t\t// We can disable debug output entirely with KHR_debug.\n\t\tif (GLAD_VERSION_4_3 || GLAD_ES_VERSION_3_2 || GLAD_KHR_debug)\n\t\t\tglDisable(GL_DEBUG_OUTPUT);\n\n\t\treturn;\n\t}\n\n\t// We don't want asynchronous debug output.\n\tglEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);\n\n\tglDebugMessageCallback(debugCB, nullptr);\n\n\t// Initially, enable everything.\n\tglDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, 0, GL_TRUE);\n\n\t// Disable messages about deprecated OpenGL functionality.\n\tglDebugMessageControl(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR, GL_DONT_CARE, 0, 0, GL_FALSE);\n\tglDebugMessageControl(GL_DEBUG_SOURCE_SHADER_COMPILER, GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR, GL_DONT_CARE, 0, 0, GL_FALSE);\n\n\tif (GLAD_VERSION_4_3 || GLAD_ES_VERSION_3_2 || GLAD_KHR_debug)\n\t\tglEnable(GL_DEBUG_OUTPUT);\n\n\t::printf(\"OpenGL debug output enabled (LOVE_GRAPHICS_DEBUG=1)\\n\");\n}\n\nvoid Graphics::setRenderTargetsInternal(const RenderTargets &rts, int pixelw, int pixelh, bool hasSRGBtexture)\n{\n\tconst DisplayState &state = states.back();\n\n\tOpenGL::TempDebugGroup debuggroup(\"setRenderTargets\");\n\n\tendPass(false);\n\n\tbool iswindow = rts.getFirstTarget().texture == nullptr;\n\tWinding vertexwinding = state.winding;\n\n\tif (iswindow)\n\t{\n\t\tgl.bindFramebuffer(OpenGL::FRAMEBUFFER_ALL, getInternalBackbufferFBO());\n\t}\n\telse\n\t{\n\t\tbindCachedFBO(rts);\n\n\t\t// Flip front face winding when rendering to a texture, since our\n\t\t// projection matrix is flipped.\n\t\t// Note: projection matrix is set at a higher level.\n\t\tvertexwinding = vertexwinding == WINDING_CW ? WINDING_CCW : WINDING_CW;\n\t}\n\n\tglFrontFace(vertexwinding == WINDING_CW ? GL_CW : GL_CCW);\n\n\tgl.setViewport({0, 0, pixelw, pixelh});\n\n\t// Re-apply the scissor if it was active, since the rectangle passed to\n\t// glScissor is affected by the viewport dimensions.\n\tif (state.scissor)\n\t\tsetScissor(state.scissorRect, !iswindow);\n\n\t// Make sure the correct sRGB setting is used when drawing to the textures.\n\tif (GLAD_VERSION_1_0 || GLAD_EXT_sRGB_write_control)\n\t{\n\t\tif (hasSRGBtexture != gl.isStateEnabled(OpenGL::ENABLE_FRAMEBUFFER_SRGB))\n\t\t\tgl.setEnableState(OpenGL::ENABLE_FRAMEBUFFER_SRGB, hasSRGBtexture);\n\t}\n}\n\nvoid Graphics::endPass(bool presenting)\n{\n\tauto &rts = states.back().renderTargets;\n\tlove::graphics::Texture *depthstencil = rts.depthStencil.texture.get();\n\n\t// Discard the depth/stencil buffer if we're using an internal cached one,\n\t// or if we're presenting the backbuffer to the display.\n\tif ((depthstencil == nullptr && (rts.temporaryRTFlags & (TEMPORARY_RT_DEPTH | TEMPORARY_RT_STENCIL)) != 0)\n\t\t|| (presenting && !rts.getFirstTarget().texture.get()))\n\t{\n\t\tdiscard({}, true);\n\t}\n\n\t// Resolve MSAA buffers. MSAA is only supported for 2D render targets so we\n\t// don't have to worry about resolving to slices.\n\tif (rts.colors.size() > 0 && rts.colors[0].texture->getMSAA() > 1)\n\t{\n\t\tint mip = rts.colors[0].mipmap;\n\t\tint w = rts.colors[0].texture->getPixelWidth(mip);\n\t\tint h = rts.colors[0].texture->getPixelHeight(mip);\n\n\t\tfor (int i = 0; i < (int) rts.colors.size(); i++)\n\t\t{\n\t\t\tTexture *c = (Texture *) rts.colors[i].texture.get();\n\n\t\t\tif (!c->isReadable())\n\t\t\t\tcontinue;\n\n\t\t\tglReadBuffer(GL_COLOR_ATTACHMENT0 + i);\n\n\t\t\tgl.bindFramebuffer(OpenGL::FRAMEBUFFER_DRAW, c->getFBO());\n\n\t\t\tif (GLAD_APPLE_framebuffer_multisample)\n\t\t\t\tglResolveMultisampleFramebufferAPPLE();\n\t\t\telse\n\t\t\t\tglBlitFramebuffer(0, 0, w, h, 0, 0, w, h, GL_COLOR_BUFFER_BIT, GL_NEAREST);\n\t\t}\n\t}\n\n\tif (depthstencil != nullptr && depthstencil->getMSAA() > 1 && depthstencil->isReadable())\n\t{\n\t\tgl.bindFramebuffer(OpenGL::FRAMEBUFFER_DRAW, ((Texture *) depthstencil)->getFBO());\n\n\t\tif (GLAD_APPLE_framebuffer_multisample)\n\t\t\tglResolveMultisampleFramebufferAPPLE();\n\t\telse\n\t\t{\n\t\t\tint mip = rts.depthStencil.mipmap;\n\t\t\tint w = depthstencil->getPixelWidth(mip);\n\t\t\tint h = depthstencil->getPixelHeight(mip);\n\t\t\tPixelFormat format = depthstencil->getPixelFormat();\n\n\t\t\tGLbitfield mask = 0;\n\n\t\t\tif (isPixelFormatDepth(format))\n\t\t\t\tmask |= GL_DEPTH_BUFFER_BIT;\n\t\t\tif (isPixelFormatStencil(format))\n\t\t\t\tmask |= GL_STENCIL_BUFFER_BIT;\n\n\t\t\tif (mask != 0)\n\t\t\t\tglBlitFramebuffer(0, 0, w, h, 0, 0, w, h, mask, GL_NEAREST);\n\t\t}\n\t}\n}\n\nvoid Graphics::clear(OptionalColorD c, OptionalInt stencil, OptionalDouble depth)\n{\n\tif (c.hasValue)\n\t{\n\t\tbool hasintegerformat = false;\n\n\t\tconst auto &rts = states.back().renderTargets;\n\t\tfor (const auto &rt : rts.colors)\n\t\t{\n\t\t\tif (rt.texture.get() && isPixelFormatInteger(rt.texture->getPixelFormat()))\n\t\t\t\thasintegerformat = true;\n\t\t}\n\n\t\t// This variant of clear() uses glClear() which can't clear integer formats,\n\t\t// so we switch to the MRT variant if needed.\n\t\tif (hasintegerformat)\n\t\t{\n\t\t\tstd::vector<OptionalColorD> colors(rts.colors.size());\n\t\t\tfor (size_t i = 0; i < colors.size(); i++)\n\t\t\t\tcolors[i] = c;\n\n\t\t\tclear(colors, stencil, depth);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (c.hasValue || stencil.hasValue || depth.hasValue)\n\t\tflushBatchedDraws();\n\n\tGLbitfield flags = 0;\n\n\tif (c.hasValue)\n\t{\n\t\tColorf cf((float)c.value.r, (float)c.value.g, (float)c.value.b, (float)c.value.a);\n\t\tgammaCorrectColor(cf);\n\t\tglClearColor(cf.r, cf.g, cf.b, cf.a);\n\t\tflags |= GL_COLOR_BUFFER_BIT;\n\t}\n\n\tif (stencil.hasValue)\n\t{\n\t\tglClearStencil(stencil.value);\n\t\tflags |= GL_STENCIL_BUFFER_BIT;\n\t}\n\n\tif (depth.hasValue)\n\t{\n\t\tgl.clearDepth(depth.value);\n\t\tflags |= GL_DEPTH_BUFFER_BIT;\n\t}\n\n\tif (flags != 0)\n\t{\n\t\tOpenGL::CleanClearState cs(flags);\n\t\tglClear(flags);\n\t}\n\n\tif (c.hasValue && gl.bugs.clearRequiresDriverTextureStateUpdate && Shader::current)\n\t{\n\t\t// This seems to be enough to fix the bug for me. Other methods I've\n\t\t// tried (e.g. dummy draws) don't work in all cases.\n\t\tgl.useProgram(0);\n\t\tgl.useProgram((GLuint) Shader::current->getHandle());\n\t}\n}\n\nvoid Graphics::clear(const std::vector<OptionalColorD> &colors, OptionalInt stencil, OptionalDouble depth)\n{\n\tif (colors.size() == 0 && !stencil.hasValue && !depth.hasValue)\n\t\treturn;\n\n\tconst auto &rts = states.back().renderTargets.colors;\n\n\tint ncolorRTs = (int) rts.size();\n\tint ncolors = (int) colors.size();\n\n\tif (ncolors <= 1 && (ncolorRTs == 0 || (ncolorRTs == 1 && rts[0].texture != nullptr && !isPixelFormatInteger(rts[0].texture->getPixelFormat()))))\n\t{\n\t\tclear(ncolors > 0 ? colors[0] : OptionalColorD(), stencil, depth);\n\t\treturn;\n\t}\n\n\tflushBatchedDraws();\n\n\tncolors = std::min(ncolors, ncolorRTs);\n\n\tfor (int i = 0; i < ncolors; i++)\n\t{\n\t\tif (!colors[i].hasValue)\n\t\t\tcontinue;\n\n\t\tPixelFormatType datatype = PIXELFORMATTYPE_UNORM;\n\t\tif (rts[i].texture != nullptr)\n\t\t\tdatatype = getPixelFormatInfo(rts[i].texture->getPixelFormat()).dataType;\n\n\t\tColorD c = colors[i].value;\n\n\t\tif (datatype == PIXELFORMATTYPE_SINT)\n\t\t{\n\t\t\tconst GLint carray[] = {(GLint)c.r, (GLint)c.g, (GLint)c.b, (GLint)c.a};\n\t\t\tglClearBufferiv(GL_COLOR, i, carray);\n\t\t}\n\t\telse if (datatype == PIXELFORMATTYPE_UINT)\n\t\t{\n\t\t\tconst GLuint carray[] = {(GLuint)c.r, (GLuint)c.g, (GLuint)c.b, (GLuint)c.a};\n\t\t\tglClearBufferuiv(GL_COLOR, i, carray);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tColorf cf((float)c.r, (float)c.g, (float)c.b, (float)c.a);\n\t\t\tgammaCorrectColor(cf);\n\t\t\tconst GLfloat carray[] = {cf.r, cf.g, cf.b, cf.a};\n\t\t\tglClearBufferfv(GL_COLOR, i, carray);\n\t\t}\n\t}\n\n\tGLbitfield flags = 0;\n\n\tif (stencil.hasValue)\n\t{\n\t\tglClearStencil(stencil.value);\n\t\tflags |= GL_STENCIL_BUFFER_BIT;\n\t}\n\n\tif (depth.hasValue)\n\t{\n\t\tgl.clearDepth(depth.value);\n\t\tflags |= GL_DEPTH_BUFFER_BIT;\n\t}\n\n\tif (flags != 0)\n\t{\n\t\tOpenGL::CleanClearState cs(flags);\n\t\tglClear(flags);\n\t}\n\n\tif (gl.bugs.clearRequiresDriverTextureStateUpdate && Shader::current)\n\t{\n\t\t// This seems to be enough to fix the bug for me. Other methods I've\n\t\t// tried (e.g. dummy draws) don't work in all cases.\n\t\tgl.useProgram(0);\n\t\tgl.useProgram((GLuint) Shader::current->getHandle());\n\t}\n}\n\nvoid Graphics::discard(const std::vector<bool> &colorbuffers, bool depthstencil)\n{\n\tflushBatchedDraws();\n\tdiscard(OpenGL::FRAMEBUFFER_ALL, colorbuffers, depthstencil);\n}\n\nvoid Graphics::discard(OpenGL::FramebufferTarget target, const std::vector<bool> &colorbuffers, bool depthstencil)\n{\n\tif (!(GLAD_VERSION_4_3 || GLAD_ARB_invalidate_subdata || GLAD_ES_VERSION_3_0 || GLAD_EXT_discard_framebuffer))\n\t\treturn;\n\n\tGLenum gltarget = GL_FRAMEBUFFER;\n\tif (target == OpenGL::FRAMEBUFFER_READ)\n\t\tgltarget = GL_READ_FRAMEBUFFER;\n\telse if (target == OpenGL::FRAMEBUFFER_DRAW)\n\t\tgltarget = GL_DRAW_FRAMEBUFFER;\n\n\tstd::vector<GLenum> attachments;\n\tattachments.reserve(colorbuffers.size());\n\n\t// glDiscardFramebuffer uses different attachment enums for the default FBO.\n\tif (gl.getFramebuffer(target) == 0)\n\t{\n\t\tif (colorbuffers.size() > 0 && colorbuffers[0])\n\t\t\tattachments.push_back(GL_COLOR);\n\n\t\tif (depthstencil)\n\t\t{\n\t\t\tattachments.push_back(GL_STENCIL);\n\t\t\tattachments.push_back(GL_DEPTH);\n\t\t}\n\t}\n\telse\n\t{\n\t\tint rendertargetcount = std::max((int) states.back().renderTargets.colors.size(), 1);\n\n\t\tfor (int i = 0; i < (int) colorbuffers.size(); i++)\n\t\t{\n\t\t\tif (colorbuffers[i] && i < rendertargetcount)\n\t\t\t\tattachments.push_back(GL_COLOR_ATTACHMENT0 + i);\n\t\t}\n\n\t\tif (depthstencil)\n\t\t{\n\t\t\tattachments.push_back(GL_STENCIL_ATTACHMENT);\n\t\t\tattachments.push_back(GL_DEPTH_ATTACHMENT);\n\t\t}\n\t}\n\n\t// Hint for the driver that it doesn't need to save these buffers.\n\tif (GLAD_VERSION_4_3 || GLAD_ARB_invalidate_subdata || GLAD_ES_VERSION_3_0)\n\t\tglInvalidateFramebuffer(gltarget, (GLint) attachments.size(), &attachments[0]);\n\telse if (GLAD_EXT_discard_framebuffer)\n\t\tglDiscardFramebufferEXT(gltarget, (GLint) attachments.size(), &attachments[0]);\n}\n\nvoid Graphics::cleanupRenderTexture(love::graphics::Texture *texture)\n{\n\tif (!texture->isRenderTarget())\n\t\treturn;\n\n\tfor (auto it = framebufferObjects.begin(); it != framebufferObjects.end(); /**/)\n\t{\n\t\tbool hastexture = false;\n\t\tconst auto &rts = it->first;\n\n\t\tfor (const RenderTarget &rt : rts.colors)\n\t\t{\n\t\t\tif (rt.texture == texture)\n\t\t\t{\n\t\t\t\thastexture = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\thastexture = hastexture || rts.depthStencil.texture == texture;\n\n\t\tif (hastexture)\n\t\t{\n\t\t\tif (isCreated())\n\t\t\t\tgl.deleteFramebuffer(it->second);\n\t\t\tit = framebufferObjects.erase(it);\n\t\t}\n\t\telse\n\t\t\t++it;\n\t}\n}\n\nGLuint Graphics::bindCachedFBO(const RenderTargets &targets)\n{\n\tGLuint fbo = framebufferObjects[targets];\n\n\tif (fbo != 0)\n\t{\n\t\tgl.bindFramebuffer(OpenGL::FRAMEBUFFER_ALL, fbo);\n\t}\n\telse\n\t{\n\t\tint msaa = targets.getFirstTarget().texture->getMSAA();\n\t\tbool hasDS = targets.depthStencil.texture != nullptr;\n\n\t\tglGenFramebuffers(1, &fbo);\n\t\tgl.bindFramebuffer(OpenGL::FRAMEBUFFER_ALL, fbo);\n\n\t\tint ncolortargets = 0;\n\t\tGLenum drawbuffers[MAX_COLOR_RENDER_TARGETS];\n\n\t\tauto attachRT = [&](const RenderTarget &rt)\n\t\t{\n\t\t\tbool renderbuffer = msaa > 1 || !rt.texture->isReadable();\n\t\t\tOpenGL::TextureFormat fmt = OpenGL::convertPixelFormat(rt.texture->getPixelFormat());\n\n\t\t\tif (fmt.framebufferAttachments[0] == GL_COLOR_ATTACHMENT0)\n\t\t\t{\n\t\t\t\tfmt.framebufferAttachments[0] = GL_COLOR_ATTACHMENT0 + ncolortargets;\n\t\t\t\tdrawbuffers[ncolortargets] = fmt.framebufferAttachments[0];\n\t\t\t\tncolortargets++;\n\t\t\t}\n\n\t\t\tGLuint handle = (GLuint) rt.texture->getRenderTargetHandle();\n\n\t\t\tfor (GLenum attachment : fmt.framebufferAttachments)\n\t\t\t{\n\t\t\t\tif (attachment == GL_NONE)\n\t\t\t\t\tcontinue;\n\t\t\t\telse if (renderbuffer)\n\t\t\t\t\tglFramebufferRenderbuffer(GL_FRAMEBUFFER, attachment, GL_RENDERBUFFER, handle);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tTextureType textype = rt.texture->getTextureType();\n\n\t\t\t\t\tint layer = textype == TEXTURE_CUBE ? 0 : rt.slice;\n\t\t\t\t\tint face = textype == TEXTURE_CUBE ? rt.slice : 0;\n\t\t\t\t\tint level = rt.mipmap;\n\n\t\t\t\t\tgl.framebufferTexture(attachment, textype, handle, level, layer, face);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tfor (const auto &rt : targets.colors)\n\t\t\tattachRT(rt);\n\n\t\tif (hasDS)\n\t\t\tattachRT(targets.depthStencil);\n\n\t\tif (ncolortargets > 1)\n\t\t\tglDrawBuffers(ncolortargets, drawbuffers);\n\t\telse if (ncolortargets == 0 && hasDS)\n\t\t{\n\t\t\tGLenum none = GL_NONE;\n\t\t\tglDrawBuffers(1, &none);\n\t\t\tglReadBuffer(GL_NONE);\n\t\t}\n\n\t\tGLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);\n\n\t\tif (status != GL_FRAMEBUFFER_COMPLETE)\n\t\t{\n\t\t\tgl.deleteFramebuffer(fbo);\n\t\t\tconst char *sstr = OpenGL::framebufferStatusString(status);\n\t\t\tthrow love::Exception(\"Could not create Framebuffer Object! %s\", sstr);\n\t\t}\n\n\t\tframebufferObjects[targets] = fbo;\n\t}\n\n\treturn fbo;\n}\n\nvoid Graphics::present(void *screenshotCallbackData)\n{\n\tif (!isActive())\n\t\treturn;\n\n\tif (isRenderTargetActive())\n\t\tthrow love::Exception(\"present cannot be called while a render target is active.\");\n\n\tdeprecations.draw(this);\n\n\tflushBatchedDraws();\n\n\tendPass(true);\n\n\tint w = getPixelWidth();\n\tint h = getPixelHeight();\n\n\tgl.bindFramebuffer(OpenGL::FRAMEBUFFER_ALL, getInternalBackbufferFBO());\n\n\t// Copy internal backbuffer to system backbuffer. When MSAA is used this\n\t// is a direct MSAA resolve.\n\tif (internalBackbuffer.get())\n\t{\n\t\tgl.bindFramebuffer(OpenGL::FRAMEBUFFER_DRAW, getSystemBackbufferFBO());\n\n\t\t// Discard system backbuffer to prevent it from copying its contents\n\t\t// from VRAM to chip memory.\n\t\tdiscard(OpenGL::FRAMEBUFFER_DRAW, {true}, true);\n\n\t\t// updateBackbuffer checks for glBlitFramebuffer support.\n\t\tif (GLAD_APPLE_framebuffer_multisample && internalBackbuffer->getMSAA() > 1)\n\t\t\tglResolveMultisampleFramebufferAPPLE();\n\t\telse\n\t\t\tglBlitFramebuffer(0, 0, w, h, 0, 0, w, h, GL_COLOR_BUFFER_BIT, GL_NEAREST);\n\n\t\t// Discarding the internal backbuffer directly after resolving it should\n\t\t// eliminate any copy back to vram it might need to do.\n\t\tdiscard(OpenGL::FRAMEBUFFER_READ, {true}, false);\n\t}\n\n\tif (!pendingScreenshotCallbacks.empty())\n\t{\n\t\tsize_t row = 4 * w;\n\t\tsize_t size = row * h;\n\n\t\tGLubyte *pixels = nullptr;\n\t\tGLubyte *screenshot = nullptr;\n\n\t\ttry\n\t\t{\n\t\t\tpixels = new GLubyte[size];\n\t\t\tscreenshot = new GLubyte[size];\n\t\t}\n\t\tcatch (std::exception &)\n\t\t{\n\t\t\tdelete[] pixels;\n\t\t\tdelete[] screenshot;\n\t\t\tthrow love::Exception(\"Out of memory.\");\n\t\t}\n\n\t\tgl.bindFramebuffer(OpenGL::FRAMEBUFFER_ALL, getSystemBackbufferFBO());\n\t\tglReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels);\n\n\t\t// Replace alpha values with full opacity.\n\t\tfor (size_t i = 3; i < size; i += 4)\n\t\t\tpixels[i] = 255;\n\n\t\t// OpenGL sucks and reads pixels from the lower-left. Let's fix that.\n\t\tGLubyte *src = pixels - row;\n\t\tGLubyte *dst = screenshot + size;\n\n\t\tfor (int i = 0; i < h; ++i)\n\t\t\tmemcpy(dst-=row, src+=row, row);\n\n\t\tdelete[] pixels;\n\n\t\tauto imagemodule = Module::getInstance<love::image::Image>(M_IMAGE);\n\n\t\tfor (int i = 0; i < (int) pendingScreenshotCallbacks.size(); i++)\n\t\t{\n\t\t\tconst auto &info = pendingScreenshotCallbacks[i];\n\t\t\timage::ImageData *img = nullptr;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\timg = imagemodule->newImageData(w, h, PIXELFORMAT_RGBA8_UNORM, screenshot);\n\t\t\t}\n\t\t\tcatch (love::Exception &)\n\t\t\t{\n\t\t\t\tdelete[] screenshot;\n\t\t\t\tinfo.callback(&info, nullptr, nullptr);\n\t\t\t\tfor (int j = i + 1; j < (int) pendingScreenshotCallbacks.size(); j++)\n\t\t\t\t{\n\t\t\t\t\tconst auto &ninfo = pendingScreenshotCallbacks[j];\n\t\t\t\t\tninfo.callback(&ninfo, nullptr, nullptr);\n\t\t\t\t}\n\t\t\t\tpendingScreenshotCallbacks.clear();\n\t\t\t\tthrow;\n\t\t\t}\n\n\t\t\tinfo.callback(&info, img, screenshotCallbackData);\n\t\t\timg->release();\n\t\t}\n\n\t\tdelete[] screenshot;\n\t\tpendingScreenshotCallbacks.clear();\n\t}\n\n#ifdef LOVE_IOS\n\t// Hack: SDL's color renderbuffer must be bound when swapBuffers is called.\n\tSDL_PropertiesID props = SDL_GetWindowProperties(SDL_GL_GetCurrentWindow());\n\tGLuint colorbuffer = (GLuint)SDL_GetNumberProperty(props, SDL_PROP_WINDOW_UIKIT_OPENGL_RENDERBUFFER_NUMBER, 0);\n\tglBindRenderbuffer(GL_RENDERBUFFER, colorbuffer);\n#endif\n\n\tfor (StreamBuffer *buffer : batchedDrawState.vb)\n\t\tbuffer->nextFrame();\n\tbatchedDrawState.indexBuffer->nextFrame();\n\n\tauto window = getInstance<love::window::Window>(M_WINDOW);\n\tif (window != nullptr)\n\t\twindow->swapBuffers();\n\n\tgl.bindFramebuffer(OpenGL::FRAMEBUFFER_ALL, getInternalBackbufferFBO());\n\n\t// Reset the per-frame stat counts.\n\tdrawCalls = 0;\n\tgl.stats.shaderSwitches = 0;\n\trenderTargetSwitchCount = 0;\n\tdrawCallsBatched = 0;\n\n\tupdatePendingReadbacks();\n\tupdateTemporaryResources();\n}\n\nint Graphics::getRequestedBackbufferMSAA() const\n{\n\treturn requestedBackbufferMSAA;\n}\n\nint Graphics::getBackbufferMSAA() const\n{\n\treturn internalBackbuffer.get() ? internalBackbuffer->getMSAA() : 0;\n}\n\nvoid Graphics::setScissor(const Rect &rect, bool rtActive)\n{\n\tflushBatchedDraws();\n\n\tDisplayState &state = states.back();\n\n\tif (!gl.isStateEnabled(OpenGL::ENABLE_SCISSOR_TEST))\n\t\tgl.setEnableState(OpenGL::ENABLE_SCISSOR_TEST, true);\n\n\tdouble dpiscale = getCurrentDPIScale();\n\n\tRect glrect;\n\tglrect.x = (int) (rect.x * dpiscale);\n\tglrect.y = (int) (rect.y * dpiscale);\n\tglrect.w = (int) (rect.w * dpiscale);\n\tglrect.h = (int) (rect.h * dpiscale);\n\n\t// OpenGL's reversed y-coordinate is compensated for in OpenGL::setScissor.\n\tgl.setScissor(glrect, rtActive);\n\n\tstate.scissor = true;\n\tstate.scissorRect = rect;\n}\n\nvoid Graphics::setScissor(const Rect &rect)\n{\n\tsetScissor(rect, isRenderTargetActive());\n}\n\nvoid Graphics::setScissor()\n{\n\tif (states.back().scissor)\n\t\tflushBatchedDraws();\n\n\tstates.back().scissor = false;\n\n\tif (gl.isStateEnabled(OpenGL::ENABLE_SCISSOR_TEST))\n\t\tgl.setEnableState(OpenGL::ENABLE_SCISSOR_TEST, false);\n}\n\nvoid Graphics::setStencilState(const StencilState &s)\n{\n\tvalidateStencilState(s);\n\n\tflushBatchedDraws();\n\n\tbool enablestencil = s.action != STENCIL_KEEP || s.compare != COMPARE_ALWAYS;\n\tif (enablestencil != gl.isStateEnabled(OpenGL::ENABLE_STENCIL_TEST))\n\t\tgl.setEnableState(OpenGL::ENABLE_STENCIL_TEST, enablestencil);\n\n\tGLenum glaction = GL_KEEP;\n\n\tswitch (s.action)\n\t{\n\tcase STENCIL_KEEP:\n\t\tglaction = GL_KEEP;\n\t\tbreak;\n\tcase STENCIL_ZERO:\n\t\tglaction = GL_ZERO;\n\t\tbreak;\n\tcase STENCIL_REPLACE:\n\t\tglaction = GL_REPLACE;\n\t\tbreak;\n\tcase STENCIL_INCREMENT:\n\t\tglaction = GL_INCR;\n\t\tbreak;\n\tcase STENCIL_DECREMENT:\n\t\tglaction = GL_DECR;\n\t\tbreak;\n\tcase STENCIL_INCREMENT_WRAP:\n\t\tglaction = GL_INCR_WRAP;\n\t\tbreak;\n\tcase STENCIL_DECREMENT_WRAP:\n\t\tglaction = GL_DECR_WRAP;\n\t\tbreak;\n\tcase STENCIL_INVERT:\n\t\tglaction = GL_INVERT;\n\t\tbreak;\n\tcase STENCIL_MAX_ENUM:\n\t\tglaction = GL_KEEP;\n\t\tbreak;\n\t}\n\n\t/**\n\t * GPUs do the comparison opposite to what makes sense for love's API. For\n\t * example, if the compare function is GREATER then the stencil test will\n\t * pass if the reference value is greater than the value in the stencil\n\t * buffer. With our API it's more intuitive to assume that\n\t * setStencilState(STENCIL_KEEP, COMPARE_GREATER, 4) will make it pass if the\n\t * stencil buffer has a value greater than 4.\n\t **/\n\tGLenum glcompare = OpenGL::getGLCompareMode(getReversedCompareMode(s.compare));\n\n\tif (enablestencil)\n\t{\n\t\tglStencilFunc(glcompare, s.value, s.readMask);\n\t\tglStencilOp(GL_KEEP, GL_KEEP, glaction);\n\t}\n\n\tif (s.writeMask != gl.getStencilWriteMask())\n\t\tgl.setStencilWriteMask(s.writeMask);\n\n\tstates.back().stencil = s;\n}\n\nvoid Graphics::setDepthMode(CompareMode compare, bool write)\n{\n\tvalidateDepthState(write);\n\n\tDisplayState &state = states.back();\n\n\tif (state.depthTest != compare || state.depthWrite != write)\n\t\tflushBatchedDraws();\n\n\tstate.depthTest = compare;\n\tstate.depthWrite = write;\n\n\tbool depthenable = compare != COMPARE_ALWAYS || write;\n\n\tif (depthenable != gl.isStateEnabled(OpenGL::ENABLE_DEPTH_TEST))\n\t\tgl.setEnableState(OpenGL::ENABLE_DEPTH_TEST, depthenable);\n\n\tif (depthenable)\n\t{\n\t\tglDepthFunc(OpenGL::getGLCompareMode(compare));\n\t\tgl.setDepthWrites(write);\n\t}\n}\n\nvoid Graphics::setFrontFaceWinding(Winding winding)\n{\n\tDisplayState &state = states.back();\n\n\tif (state.winding != winding)\n\t\tflushBatchedDraws();\n\n\tstate.winding = winding;\n\n\tif (isRenderTargetActive())\n\t\twinding = winding == WINDING_CW ? WINDING_CCW : WINDING_CW;\n\n\tglFrontFace(winding == WINDING_CW ? GL_CW : GL_CCW);\n}\n\nvoid Graphics::setColor(Colorf c)\n{\n\tc.r = std::min(std::max(c.r, 0.0f), 1.0f);\n\tc.g = std::min(std::max(c.g, 0.0f), 1.0f);\n\tc.b = std::min(std::max(c.b, 0.0f), 1.0f);\n\tc.a = std::min(std::max(c.a, 0.0f), 1.0f);\n\n\tstates.back().color = c;\n}\n\nvoid Graphics::setColorMask(ColorChannelMask mask)\n{\n\tflushBatchedDraws();\n\n\tuint32 maskbits =\n\t\t((mask.r ? 1 : 0) << 0) | ((mask.g ? 1 : 0) << 1) |\n\t\t((mask.b ? 1 : 0) << 2) | ((mask.a ? 1 : 0) << 3);\n\n\tgl.setColorWriteMask(maskbits);\n\tstates.back().colorMask = mask;\n}\n\nvoid Graphics::setBlendState(const BlendState &blend)\n{\n\tif (!(blend == states.back().blend))\n\t\tflushBatchedDraws();\n\n\tif (blend.enable != gl.isStateEnabled(OpenGL::ENABLE_BLEND))\n\t\tgl.setEnableState(OpenGL::ENABLE_BLEND, blend.enable);\n\n\tif (blend.enable)\n\t{\n\t\tGLenum opRGB  = getGLBlendOperation(blend.operationRGB);\n\t\tGLenum opA    = getGLBlendOperation(blend.operationA);\n\t\tGLenum srcRGB = getGLBlendFactor(blend.srcFactorRGB);\n\t\tGLenum srcA   = getGLBlendFactor(blend.srcFactorA);\n\t\tGLenum dstRGB = getGLBlendFactor(blend.dstFactorRGB);\n\t\tGLenum dstA   = getGLBlendFactor(blend.dstFactorA);\n\n\t\tglBlendEquationSeparate(opRGB, opA);\n\t\tglBlendFuncSeparate(srcRGB, dstRGB, srcA, dstA);\n\t}\n\n\tstates.back().blend = blend;\n}\n\nvoid Graphics::setPointSize(float size)\n{\n\tif (size != states.back().pointSize)\n\t\tflushBatchedDraws();\n\n\tstates.back().pointSize = size;\n}\n\nvoid Graphics::setWireframe(bool enable)\n{\n\t// Not supported in OpenGL ES.\n\tif (GLAD_ES_VERSION_2_0)\n\t\treturn;\n\n\tflushBatchedDraws();\n\n\tglPolygonMode(GL_FRONT_AND_BACK, enable ? GL_LINE : GL_FILL);\n\tstates.back().wireframe = enable;\n}\n\nvoid *Graphics::getBufferMapMemory(size_t size)\n{\n\t// We don't need anything more complicated because get/release calls are\n\t// never interleaved (as of when this comment was written.)\n\tif (bufferMapMemory == nullptr || size > bufferMapMemorySize)\n\t\treturn malloc(size);\n\treturn bufferMapMemory;\n}\n\nvoid Graphics::releaseBufferMapMemory(void *mem)\n{\n\tif (mem != bufferMapMemory)\n\t\tfree(mem);\n}\n\nRenderer Graphics::getRenderer() const\n{\n\treturn RENDERER_OPENGL;\n}\n\nbool Graphics::usesGLSLES() const\n{\n\treturn GLAD_ES_VERSION_2_0;\n}\n\nGraphics::RendererInfo Graphics::getRendererInfo() const\n{\n\tRendererInfo info;\n\n\tif (GLAD_ES_VERSION_2_0)\n\t\tinfo.name = \"OpenGL ES\";\n\telse\n\t\tinfo.name = \"OpenGL\";\n\n\tconst char *str = (const char *) glGetString(GL_VERSION);\n\tif (str)\n\t\tinfo.version = str;\n\telse\n\t\tthrow love::Exception(\"Cannot retrieve renderer version information.\");\n\n\tstr = (const char *) glGetString(GL_VENDOR);\n\tif (str)\n\t\tinfo.vendor = str;\n\telse\n\t\tthrow love::Exception(\"Cannot retrieve renderer vendor information.\");\n\n\tstr = (const char *) glGetString(GL_RENDERER);\n\tif (str)\n\t\tinfo.device = str;\n\telse\n\t\tthrow love::Exception(\"Cannot retrieve renderer device information.\");\n\n\treturn info;\n}\n\nvoid Graphics::getAPIStats(int &shaderswitches) const\n{\n\tshaderswitches = gl.stats.shaderSwitches;\n}\n\nvoid Graphics::initCapabilities()\n{\n\tcapabilities.features[FEATURE_MULTI_RENDER_TARGET_FORMATS] = true;\n\tcapabilities.features[FEATURE_CLAMP_ZERO] = gl.isClampZeroOneTextureWrapSupported();\n\tcapabilities.features[FEATURE_CLAMP_ONE] = gl.isClampZeroOneTextureWrapSupported();\n\tcapabilities.features[FEATURE_LIGHTEN] = true;\n\tcapabilities.features[FEATURE_FULL_NPOT] = true;\n\tcapabilities.features[FEATURE_PIXEL_SHADER_HIGHP] = true;\n\tcapabilities.features[FEATURE_SHADER_DERIVATIVES] = true;\n\tcapabilities.features[FEATURE_GLSL3] = true;\n\tcapabilities.features[FEATURE_GLSL4] = GLAD_ES_VERSION_3_1 || (gl.isCoreProfile() && GLAD_VERSION_4_3);\n\tcapabilities.features[FEATURE_INSTANCING] = true;\n\tcapabilities.features[FEATURE_TEXEL_BUFFER] = gl.isBufferUsageSupported(BUFFERUSAGE_TEXEL);\n\tcapabilities.features[FEATURE_COPY_TEXTURE_TO_BUFFER] = gl.isCopyTextureToBufferSupported();\n\tcapabilities.features[FEATURE_INDIRECT_DRAW] = capabilities.features[FEATURE_GLSL4];\n\tstatic_assert(FEATURE_MAX_ENUM == 13, \"Graphics::initCapabilities must be updated when adding a new graphics feature!\");\n\n\tcapabilities.limits[LIMIT_POINT_SIZE] = gl.getMaxPointSize();\n\tcapabilities.limits[LIMIT_TEXTURE_SIZE] = gl.getMax2DTextureSize();\n\tcapabilities.limits[LIMIT_TEXTURE_LAYERS] = gl.getMaxTextureLayers();\n\tcapabilities.limits[LIMIT_VOLUME_TEXTURE_SIZE] = gl.getMax3DTextureSize();\n\tcapabilities.limits[LIMIT_CUBE_TEXTURE_SIZE] = gl.getMaxCubeTextureSize();\n\tcapabilities.limits[LIMIT_TEXEL_BUFFER_SIZE] = gl.getMaxTexelBufferSize();\n\tcapabilities.limits[LIMIT_SHADER_STORAGE_BUFFER_SIZE] = gl.getMaxShaderStorageBufferSize();\n\tcapabilities.limits[LIMIT_THREADGROUPS_X] = gl.getMaxComputeWorkGroupsX();\n\tcapabilities.limits[LIMIT_THREADGROUPS_Y] = gl.getMaxComputeWorkGroupsY();\n\tcapabilities.limits[LIMIT_THREADGROUPS_Z] = gl.getMaxComputeWorkGroupsZ();\n\tcapabilities.limits[LIMIT_RENDER_TARGETS] = gl.getMaxRenderTargets();\n\tcapabilities.limits[LIMIT_TEXTURE_MSAA] = gl.getMaxSamples();\n\tcapabilities.limits[LIMIT_ANISOTROPY] = gl.getMaxAnisotropy();\n\tstatic_assert(LIMIT_MAX_ENUM == 13, \"Graphics::initCapabilities must be updated when adding a new system limit!\");\n\n\tfor (int i = 0; i < TEXTURE_MAX_ENUM; i++)\n\t\tcapabilities.textureTypes[i] = true;\n\n\tfor (int i = 0; i < PIXELFORMAT_MAX_ENUM; i++)\n\t{\n\t\tauto format = (PixelFormat) i;\n\t\tpixelFormatUsage[i][0] = computePixelFormatUsage(format, false);\n\t\tpixelFormatUsage[i][1] = computePixelFormatUsage(format, true);\n\t}\n\n#ifdef LOVE_ANDROID\n\t// This can't be done in initContext with the rest of the bug checks because\n\t// isPixelFormatSupported relies on state initialized here / after init.\n\tif (GLAD_ES_VERSION_3_0 && !isPixelFormatSupported(PIXELFORMAT_R8_UNORM, PIXELFORMATUSAGEFLAGS_SAMPLE | PIXELFORMATUSAGEFLAGS_RENDERTARGET))\n\t{\n\t\tgl.bugs.brokenR8PixelFormat = true;\n\t\tpixelFormatUsage[PIXELFORMAT_R8_UNORM][0] = computePixelFormatUsage(PIXELFORMAT_R8_UNORM, false);\n\t\tpixelFormatUsage[PIXELFORMAT_R8_UNORM][1] = computePixelFormatUsage(PIXELFORMAT_R8_UNORM, true);\n\t}\n#endif\n}\n\nuint32 Graphics::computePixelFormatUsage(PixelFormat format, bool readable)\n{\n\tuint32 usage = OpenGL::getPixelFormatUsageFlags(format);\n\n\tif (readable && (usage & PIXELFORMATUSAGEFLAGS_SAMPLE) == 0)\n\t\treturn 0;\n\n\t// Even though we might have the necessary OpenGL version or extension,\n\t// drivers are still allowed to throw FRAMEBUFFER_UNSUPPORTED when attaching\n\t// a texture to a FBO whose format the driver doesn't like. So we should\n\t// test with an actual FBO.\n\t// Avoid the test for depth/stencil formats - not every GL version\n\t// guarantees support for depth/stencil-only render targets (which we would\n\t// need for the test below to work), and we already do some finagling in\n\t// convertPixelFormat to try to use the best-supported internal\n\t// depth/stencil format for a particular driver.\n\tif ((usage & PIXELFORMATUSAGEFLAGS_RENDERTARGET) != 0 && !isPixelFormatDepthStencil(format))\n\t{\n\t\tGLuint texture = 0;\n\t\tGLuint renderbuffer = 0;\n\n\t\tOpenGL::TextureFormat fmt = OpenGL::convertPixelFormat(format);\n\n\t\tGLuint current_fbo = gl.getFramebuffer(OpenGL::FRAMEBUFFER_ALL);\n\n\t\tGLuint fbo = 0;\n\t\tglGenFramebuffers(1, &fbo);\n\t\tgl.bindFramebuffer(OpenGL::FRAMEBUFFER_ALL, fbo);\n\n\t\t// Make sure at least something is bound to a color attachment. I believe\n\t\t// this is required on ES2 but I'm not positive.\n\t\tif (isPixelFormatDepthStencil(format))\n\t\t{\n\t\t\tlove::graphics::Texture *tex = getDefaultTexture(TEXTURE_2D, DATA_BASETYPE_FLOAT, false);\n\t\t\tgl.framebufferTexture(GL_COLOR_ATTACHMENT0, TEXTURE_2D, (GLuint) tex->getHandle(), 0, 0, 0);\n\t\t}\n\n\t\tif (readable)\n\t\t{\n\t\t\tglGenTextures(1, &texture);\n\t\t\tgl.bindTextureToUnit(TEXTURE_2D, texture, 0, false);\n\n\t\t\tSamplerState s;\n\t\t\ts.minFilter = s.magFilter = SamplerState::FILTER_NEAREST;\n\t\t\tgl.setSamplerState(TEXTURE_2D, s);\n\n\t\t\tgl.rawTexStorage(TEXTURE_2D, 1, format, 1, 1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tglGenRenderbuffers(1, &renderbuffer);\n\t\t\tglBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);\n\t\t\tglRenderbufferStorage(GL_RENDERBUFFER, fmt.internalformat, 1, 1);\n\t\t}\n\n\t\tfor (GLenum attachment : fmt.framebufferAttachments)\n\t\t{\n\t\t\tif (attachment == GL_NONE)\n\t\t\t\tcontinue;\n\n\t\t\tif (readable)\n\t\t\t\tgl.framebufferTexture(attachment, TEXTURE_2D, texture, 0, 0, 0);\n\t\t\telse\n\t\t\t\tglFramebufferRenderbuffer(GL_FRAMEBUFFER, attachment, GL_RENDERBUFFER, renderbuffer);\n\t\t}\n\n\t\tif (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)\n\t\t\tusage &= ~PIXELFORMATUSAGEFLAGS_RENDERTARGET;\n\n\t\tgl.bindFramebuffer(OpenGL::FRAMEBUFFER_ALL, current_fbo);\n\t\tgl.deleteFramebuffer(fbo);\n\n\t\tif (texture != 0)\n\t\t\tgl.deleteTexture(texture);\n\n\t\tif (renderbuffer != 0)\n\t\t\tglDeleteRenderbuffers(1, &renderbuffer);\n\t}\n\n\treturn usage;\n}\n\nbool Graphics::isPixelFormatSupported(PixelFormat format, uint32 usage)\n{\n\tformat = getSizedFormat(format);\n\n\tbool readable = (usage & PIXELFORMATUSAGEFLAGS_SAMPLE) != 0;\n\treturn (usage & pixelFormatUsage[format][readable ? 1 : 0]) == usage;\n}\n\n} // opengl\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/opengl/Graphics.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_GRAPHICS_OPENGL_GRAPHICS_H\n#define LOVE_GRAPHICS_OPENGL_GRAPHICS_H\n\n// STD\n#include <stack>\n#include <vector>\n#include <unordered_map>\n\n// OpenGL\n#include \"OpenGL.h\"\n\n// LOVE\n#include \"graphics/Graphics.h\"\n#include \"common/Color.h\"\n\n#include \"image/Image.h\"\n#include \"image/ImageData.h\"\n\n#include \"Texture.h\"\n#include \"Shader.h\"\n\n#include \"libraries/xxHash/xxhash.h\"\n\nnamespace love\n{\n\nnamespace graphics\n{\nnamespace opengl\n{\n\nclass Graphics final : public love::graphics::Graphics\n{\npublic:\n\n\tGraphics();\n\tvirtual ~Graphics();\n\n\tlove::graphics::Texture *newTexture(const Texture::Settings &settings, const Texture::Slices *data = nullptr) override;\n\tlove::graphics::Texture *newTextureView(love::graphics::Texture *base, const Texture::ViewSettings &viewsettings) override;\n\tlove::graphics::Buffer *newBuffer(const Buffer::Settings &settings, const std::vector<Buffer::DataDeclaration> &format, const void *data, size_t size, size_t arraylength) override;\n\n\tvoid backbufferChanged(int width, int height, int pixelwidth, int pixelheight, bool backbufferstencil, bool backbufferdepth, int msaa) override;\n\tbool setMode(void *context, int width, int height, int pixelwidth, int pixelheight, bool backbufferstencil, bool backbufferdepth, int msaa) override;\n\tvoid unSetMode() override;\n\n\tvoid setActive(bool active) override;\n\n\tbool dispatch(love::graphics::Shader *shader, int x, int y, int z) override;\n\tbool dispatch(love::graphics::Shader *shader, love::graphics::Buffer *indirectargs, size_t argsoffset) override;\n\n\tvoid draw(const DrawCommand &cmd) override;\n\tvoid draw(const DrawIndexedCommand &cmd) override;\n\tvoid drawQuads(int start, int count, VertexAttributesID attributesID, const BufferBindings &buffers, love::graphics::Texture *texture) override;\n\n\tvoid clear(OptionalColorD color, OptionalInt stencil, OptionalDouble depth) override;\n\tvoid clear(const std::vector<OptionalColorD> &colors, OptionalInt stencil, OptionalDouble depth) override;\n\n\tvoid discard(const std::vector<bool> &colorbuffers, bool depthstencil) override;\n\n\tvoid present(void *screenshotCallbackData) override;\n\n\tint getRequestedBackbufferMSAA() const override;\n\tint getBackbufferMSAA() const override;\n\n\tvoid setColor(Colorf c) override;\n\n\tvoid setScissor(const Rect &rect) override;\n\tvoid setScissor() override;\n\n\tvoid setStencilState(const StencilState &s) override;\n\n\tvoid setDepthMode(CompareMode compare, bool write) override;\n\n\tvoid setFrontFaceWinding(Winding winding) override;\n\n\tvoid setColorMask(ColorChannelMask mask) override;\n\n\tvoid setBlendState(const BlendState &blend) override;\n\n\tvoid setPointSize(float size) override;\n\n\tvoid setWireframe(bool enable) override;\n\n\tbool isPixelFormatSupported(PixelFormat format, uint32 usage) override;\n\tRenderer getRenderer() const override;\n\tbool usesGLSLES() const override;\n\tRendererInfo getRendererInfo() const override;\n\n\t// Internal use.\n\tvoid cleanupRenderTexture(love::graphics::Texture *texture);\n\n\tvoid *getBufferMapMemory(size_t size);\n\tvoid releaseBufferMapMemory(void *mem);\n\nprivate:\n\n\tstruct CachedFBOHasher\n\t{\n\t\tsize_t operator() (const RenderTargets &rts) const\n\t\t{\n\t\t\tRenderTarget hashtargets[MAX_COLOR_RENDER_TARGETS + 1];\n\t\t\tint hashcount = 0;\n\n\t\t\tfor (size_t i = 0; i < rts.colors.size(); i++)\n\t\t\t\thashtargets[hashcount++] = rts.colors[i];\n\n\t\t\tif (rts.depthStencil.texture != nullptr)\n\t\t\t\thashtargets[hashcount++] = rts.depthStencil;\n\t\t\telse if (rts.temporaryRTFlags != 0)\n\t\t\t\thashtargets[hashcount++] = RenderTarget(nullptr, -1, rts.temporaryRTFlags);\n\n\t\t\treturn XXH32(hashtargets, sizeof(RenderTarget) * hashcount, 0);\n\t\t}\n\t};\n\n\tlove::graphics::ShaderStage *newShaderStageInternal(ShaderStageType stage, const std::string &cachekey, const std::string &source, bool gles) override;\n\tlove::graphics::Shader *newShaderInternal(StrongRef<love::graphics::ShaderStage> stages[SHADERSTAGE_MAX_ENUM], const Shader::CompileOptions &options) override;\n\tlove::graphics::StreamBuffer *newStreamBuffer(BufferUsage type, size_t size) override;\n\n\tlove::graphics::GraphicsReadback *newReadbackInternal(ReadbackMethod method, love::graphics::Buffer *buffer, size_t offset, size_t size, data::ByteData *dest, size_t destoffset) override;\n\tlove::graphics::GraphicsReadback *newReadbackInternal(ReadbackMethod method, love::graphics::Texture *texture, int slice, int mipmap, const Rect &rect, image::ImageData *dest, int destx, int desty) override;\n\n\tvoid setRenderTargetsInternal(const RenderTargets &rts, int pixelw, int pixelh, bool hasSRGBtexture) override;\n\tvoid initCapabilities() override;\n\tvoid getAPIStats(int &shaderswitches) const override;\n\n\tvoid endPass(bool presenting);\n\tGLuint bindCachedFBO(const RenderTargets &targets);\n\tvoid discard(OpenGL::FramebufferTarget target, const std::vector<bool> &colorbuffers, bool depthstencil);\n\n\tvoid updateBackbuffer(int width, int height, int pixelwidth, int pixelheight, int msaa);\n\tGLuint getInternalBackbufferFBO() const;\n\tGLuint getSystemBackbufferFBO() const;\n\n\tvoid setDebug(bool enable);\n\n\tvoid setScissor(const Rect &rect, bool rtActive);\n\n\tuint32 computePixelFormatUsage(PixelFormat format, bool readable);\n\n\tstd::unordered_map<RenderTargets, GLuint, CachedFBOHasher> framebufferObjects;\n\tbool windowHasStencil;\n\tGLuint mainVAO;\n\n\tStrongRef<love::graphics::Texture> internalBackbuffer;\n\tStrongRef<love::graphics::Texture> internalBackbufferDepthStencil;\n\tGLuint internalBackbufferFBO;\n\tint requestedBackbufferMSAA;\n\n\tchar *bufferMapMemory;\n\tsize_t bufferMapMemorySize;\n\n\t// [non-readable, readable]\n\tuint32 pixelFormatUsage[PIXELFORMAT_MAX_ENUM][2];\n\n}; // Graphics\n\n} // opengl\n} // graphics\n} // love\n\n#endif // LOVE_GRAPHICS_OPENGL_GRAPHICS_H\n"
  },
  {
    "path": "src/modules/graphics/opengl/GraphicsReadback.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"GraphicsReadback.h\"\n#include \"Buffer.h\"\n#include \"Texture.h\"\n#include \"graphics/Graphics.h\"\n#include \"data/ByteData.h\"\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace opengl\n{\n\nGraphicsReadback::GraphicsReadback(love::graphics::Graphics *gfx, ReadbackMethod method, love::graphics::Buffer *buffer, size_t offset, size_t size, data::ByteData *dest, size_t destoffset)\n\t: love::graphics::GraphicsReadback(gfx, method, buffer, offset, size, dest, destoffset)\n{\n\t// Immediate readback of readback-type buffers doesn't need a staging buffer.\n\tif (method != READBACK_IMMEDIATE || buffer->getDataUsage() != BUFFERDATAUSAGE_READBACK)\n\t{\n\t\tstagingBuffer = gfx->getTemporaryBuffer(size, DATAFORMAT_FLOAT, 0, BUFFERDATAUSAGE_READBACK);\n\t\tgfx->copyBuffer(buffer, stagingBuffer, offset, 0, size);\n\t}\n\n\tif (method == READBACK_IMMEDIATE)\n\t{\n\t\tif (stagingBuffer.get())\n\t\t{\n\t\t\tstatus = readbackBuffer(stagingBuffer, 0, size);\n\t\t\tgfx->releaseTemporaryBuffer(stagingBuffer);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstatus = readbackBuffer(buffer, offset, size);\n\t\t}\n\t}\n\telse\n\t{\n\t\tsync.fence();\n\t}\n}\n\nGraphicsReadback::GraphicsReadback(love::graphics::Graphics *gfx, ReadbackMethod method, love::graphics::Texture *texture, int slice, int mipmap, const Rect &rect, image::ImageData *dest, int destx, int desty)\n\t: love::graphics::GraphicsReadback(gfx, method, texture, slice, mipmap, rect, dest, destx, desty)\n{\n\tsize_t size = getPixelFormatSliceSize(textureFormat, rect.w, rect.h);\n\n\tif (method == READBACK_IMMEDIATE)\n\t{\n\t\tvoid *dest = prepareReadbackDest(size);\n\n\t\t// Direct readback without copying avoids the need for a staging buffer,\n\t\t// and lowers the system requirements of immediate RT readback.\n\t\tTexture *t = (Texture *) texture;\n\t\tt->readbackInternal(slice, mipmap, rect, imageData->getWidth(), size, dest);\n\n\t\tstatus = STATUS_COMPLETE;\n\t}\n\telse\n\t{\n\t\tstagingBuffer = gfx->getTemporaryBuffer(size, DATAFORMAT_FLOAT, 0, BUFFERDATAUSAGE_READBACK);\n\n\t\tgfx->copyTextureToBuffer(texture, stagingBuffer, slice, mipmap, rect, 0, 0);\n\t\tsync.fence();\n\t}\n}\n\nGraphicsReadback::~GraphicsReadback()\n{\n}\n\nvoid GraphicsReadback::wait()\n{\n\tif (status != STATUS_WAITING)\n\t\treturn;\n\n\tsync.cpuWait();\n\tupdate();\n}\n\nvoid GraphicsReadback::update()\n{\n\tif (status != STATUS_WAITING)\n\t\treturn;\n\n\tif (sync.isComplete())\n\t{\n\t\tif (stagingBuffer.get())\n\t\t\tstatus = readbackBuffer(stagingBuffer, 0, stagingBuffer->getSize());\n\t\telse\n\t\t\tstatus = STATUS_ERROR;\n\n\t\tif (stagingBuffer.get())\n\t\t{\n\t\t\tauto gfx = Module::getInstance<love::graphics::Graphics>(Module::M_GRAPHICS);\n\t\t\tif (gfx != nullptr)\n\t\t\t\tgfx->releaseTemporaryBuffer(stagingBuffer);\n\t\t\tstagingBuffer.set(nullptr);\n\t\t}\n\t}\n}\n\n} // opengl\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/opengl/GraphicsReadback.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"graphics/GraphicsReadback.h\"\n#include \"FenceSync.h\"\n#include \"common/math.h\"\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace opengl\n{\n\nclass GraphicsReadback final : public love::graphics::GraphicsReadback\n{\npublic:\n\n\tGraphicsReadback(love::graphics::Graphics *gfx, ReadbackMethod method, love::graphics::Buffer *buffer, size_t offset, size_t size, data::ByteData *dest, size_t destoffset);\n\tGraphicsReadback(love::graphics::Graphics *gfx, ReadbackMethod method, love::graphics::Texture *texture, int slice, int mipmap, const Rect &rect, image::ImageData *dest, int destx, int desty);\n\tvirtual ~GraphicsReadback();\n\n\tvoid wait() override;\n\tvoid update() override;\n\nprivate:\n\n\tFenceSync sync;\n\n\tStrongRef<love::graphics::Buffer> stagingBuffer;\n\n}; // GraphicsReadback\n\n} // opengl\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/opengl/OpenGL.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"common/config.h\"\n#include \"OpenGL.h\"\n\n#include \"Shader.h\"\n#include \"common/Exception.h\"\n\n#include \"graphics/Graphics.h\"\n#include \"graphics/Buffer.h\"\n\n// C++\n#include <algorithm>\n#include <limits>\n\n// C\n#include <cstring>\n#include <cstdio>\n\n// For SDL_GL_GetProcAddress.\n#include <SDL3/SDL_video.h>\n\n#ifdef LOVE_IOS\n#include <SDL3/SDL_video.h>\n#endif\n\n#ifdef LOVE_ANDROID\n#include <dlfcn.h>\n#endif\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace opengl\n{\n\nstatic void *LOVEGetProcAddress(const char *name)\n{\n#ifdef LOVE_ANDROID\n\tvoid *proc = dlsym(RTLD_DEFAULT, name);\n\tif (proc)\n\t\treturn proc;\n#endif\n\n\treturn (void *) SDL_GL_GetProcAddress(name);\n}\n\nOpenGL::TempDebugGroup::TempDebugGroup(const char *name)\n{\n\tif (isDebugEnabled())\n\t{\n\t\tif (GLAD_VERSION_4_3 || (GLAD_KHR_debug && !GLAD_ES_VERSION_2_0))\n\t\t\tglPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, 0, (const GLchar *) name);\n\t\telse if (GLAD_ES_VERSION_2_0 && GLAD_KHR_debug)\n\t\t\tglPushDebugGroupKHR(GL_DEBUG_SOURCE_APPLICATION, 0, 0, (const GLchar *) name);\n\t\telse if (GLAD_EXT_debug_marker)\n\t\t\tglPushGroupMarkerEXT(0, (const GLchar *) name);\n\t}\n}\n\nOpenGL::TempDebugGroup::~TempDebugGroup()\n{\n\tif (isDebugEnabled())\n\t{\n\t\tif (GLAD_VERSION_4_3 || (GLAD_KHR_debug && !GLAD_ES_VERSION_2_0))\n\t\t\tglPopDebugGroup();\n\t\telse if (GLAD_ES_VERSION_2_0 && GLAD_KHR_debug)\n\t\t\tglPopDebugGroupKHR();\n\t\telse if (GLAD_EXT_debug_marker)\n\t\t\tglPopGroupMarkerEXT();\n\t}\n}\n\nOpenGL::CleanClearState::CleanClearState(GLbitfield clearFlags)\n\t: clearFlags(clearFlags)\n\t, colorWriteMask(gl.getColorWriteMask())\n\t, stencilWriteMask(gl.getStencilWriteMask())\n\t, depthWrites(gl.hasDepthWrites())\n\t, scissor(gl.isStateEnabled(ENABLE_SCISSOR_TEST))\n{\n\tif ((clearFlags & GL_COLOR_BUFFER_BIT) != 0 && colorWriteMask != LOVE_UINT32_MAX)\n\t\tgl.setColorWriteMask(LOVE_UINT32_MAX);\n\n\tif ((clearFlags & GL_DEPTH_BUFFER_BIT) != 0 && !depthWrites)\n\t\tgl.setDepthWrites(true);\n\n\tif ((clearFlags & GL_STENCIL_BUFFER_BIT) != 0 && (stencilWriteMask & 0xFF) != 0xFF)\n\t\tgl.setStencilWriteMask(LOVE_UINT32_MAX);\n\n\tif (clearFlags != 0 && scissor)\n\t\tgl.setEnableState(ENABLE_SCISSOR_TEST, false);\n}\n\nOpenGL::CleanClearState::~CleanClearState()\n{\n\tif ((clearFlags & GL_COLOR_BUFFER_BIT) != 0 && colorWriteMask != LOVE_UINT32_MAX)\n\t\tgl.setColorWriteMask(colorWriteMask);\n\n\tif ((clearFlags & GL_DEPTH_BUFFER_BIT) != 0 && !depthWrites)\n\t\tgl.setDepthWrites(depthWrites);\n\n\tif ((clearFlags & GL_STENCIL_BUFFER_BIT) != 0 && (stencilWriteMask & 0xFF) != 0xFF)\n\t\tgl.setStencilWriteMask(stencilWriteMask);\n\n\tif (clearFlags != 0 && scissor)\n\t\tgl.setEnableState(ENABLE_SCISSOR_TEST, scissor);\n}\n\nOpenGL::OpenGL()\n\t: stats()\n\t, bugs()\n\t, contextInitialized(false)\n\t, baseVertexSupported(false)\n\t, maxAnisotropy(1.0f)\n\t, maxLODBias(0.0f)\n\t, max2DTextureSize(0)\n\t, max3DTextureSize(0)\n\t, maxCubeTextureSize(0)\n\t, maxTextureArrayLayers(0)\n\t, maxTexelBufferSize(0)\n\t, maxShaderStorageBufferSize(0)\n\t, maxComputeWorkGroupsX(0)\n\t, maxComputeWorkGroupsY(0)\n\t, maxComputeWorkGroupsZ(0)\n\t, maxRenderTargets(1)\n\t, maxSamples(1)\n\t, maxTextureUnits(1)\n\t, maxShaderStorageBufferBindings(0)\n\t, maxPointSize(1)\n\t, coreProfile(false)\n\t, vendor(VENDOR_UNKNOWN)\n\t, state()\n{\n}\n\nbool OpenGL::initContext()\n{\n\tif (contextInitialized)\n\t\treturn true;\n\n\tif (!gladLoadGLLoader(LOVEGetProcAddress))\n\t\treturn false;\n\n\tinitVendor();\n\n\tbugs = {};\n\n\tif (GLAD_VERSION_3_2)\n\t{\n\t\tGLint profileMask = 0;\n\t\tglGetIntegerv(GL_CONTEXT_PROFILE_MASK, &profileMask);\n\t\tcoreProfile = (profileMask & GL_CONTEXT_CORE_PROFILE_BIT);\n\t}\n\telse\n\t\tcoreProfile = false;\n\n\tinitOpenGLFunctions();\n\n#if defined(LOVE_WINDOWS) || defined(LOVE_LINUX)\n\t// See the comments in OpenGL.h.\n\tif (getVendor() == VENDOR_AMD)\n\t{\n\t\tbugs.clearRequiresDriverTextureStateUpdate = true;\n\t\tif (!gl.isCoreProfile() && !GLAD_ES_VERSION_2_0)\n\t\t\tbugs.generateMipmapsRequiresTexture2DEnable = true;\n\t}\n#endif\n\n#ifdef LOVE_WINDOWS\n\tif (getVendor() == VENDOR_INTEL && gl.isCoreProfile())\n\t{\n\t\tconst char *device = (const char *) glGetString(GL_RENDERER);\n\t\tif (strstr(device, \"HD Graphics 4000\") || strstr(device, \"HD Graphics 2500\"))\n\t\t\tbugs.clientWaitSyncStalls = true;\n\t}\n\n\tif (getVendor() == VENDOR_INTEL)\n\t{\n\t\tconst char *device = (const char *) glGetString(GL_RENDERER);\n\t\tif (strstr(device, \"HD Graphics 3000\") || strstr(device, \"HD Graphics 2000\")\n\t\t\t|| !strcmp(device, \"Intel(R) HD Graphics\") || !strcmp(device, \"Intel(R) HD Graphics Family\"))\n\t\t{\n\t\t\tbugs.brokenSRGB = true;\n\t\t}\n\t}\n#endif\n\n#ifdef LOVE_WINDOWS\n\tif (getVendor() == VENDOR_AMD)\n\t{\n\t\t// Radeon drivers switched from \"ATI Radeon\" to \"AMD Radeon\" around\n\t\t// the 7000 series. We'll assume this bug doesn't affect those newer\n\t\t// GPUs / drivers.\n\t\tconst char *device = (const char *) glGetString(GL_RENDERER);\n\t\tif (strstr(device, \"ATI Radeon\") || strstr(device, \"ATI Mobility Radeon\"))\n\t\t\tbugs.texStorageBreaksSubImage = true;\n\t}\n#endif\n\n\tcontextInitialized = true;\n\n\treturn true;\n}\n\nvoid OpenGL::setupContext()\n{\n\tif (!contextInitialized)\n\t\treturn;\n\n\tinitMaxValues();\n\n\tGLfloat glcolor[4] = {1.0f, 1.0f, 1.0f, 1.0f};\n\tglVertexAttrib4fv(ATTRIB_COLOR, glcolor);\n\n\tGLint maxvertexattribs = 1;\n\tglGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxvertexattribs);\n\n\tstate.enabledAttribArrays = (uint32) ((1ull << uint32(maxvertexattribs)) - 1);\n\tstate.instancedAttribArrays = 0;\n\n\tsetVertexAttributes(VertexAttributes(), BufferBindings());\n\n\t// Get the current viewport.\n\tglGetIntegerv(GL_VIEWPORT, (GLint *) &state.viewport.x);\n\n\t// And the current scissor - but we need to compensate for GL scissors\n\t// starting at the bottom left instead of top left.\n\tglGetIntegerv(GL_SCISSOR_BOX, (GLint *) &state.scissor.x);\n\tstate.scissor.y = state.viewport.h - (state.scissor.y + state.scissor.h);\n\n\tfor (int i = 0; i < 2; i++)\n\t\tstate.boundFramebuffers[i] = std::numeric_limits<GLuint>::max();\n\tbindFramebuffer(FRAMEBUFFER_ALL, getDefaultFBO());\n\n\tsetEnableState(ENABLE_BLEND, state.enableState[ENABLE_BLEND]);\n\tsetEnableState(ENABLE_DEPTH_TEST, state.enableState[ENABLE_DEPTH_TEST]);\n\tsetEnableState(ENABLE_STENCIL_TEST, state.enableState[ENABLE_STENCIL_TEST]);\n\tsetEnableState(ENABLE_SCISSOR_TEST, state.enableState[ENABLE_SCISSOR_TEST]);\n\tsetEnableState(ENABLE_FACE_CULL, state.enableState[ENABLE_FACE_CULL]);\n\n\tif (!bugs.brokenSRGB)\n\t\tsetEnableState(ENABLE_FRAMEBUFFER_SRGB, state.enableState[ENABLE_FRAMEBUFFER_SRGB]);\n\telse\n\t\tstate.enableState[ENABLE_FRAMEBUFFER_SRGB] = false;\n\n\tGLint faceCull = GL_BACK;\n\tglGetIntegerv(GL_CULL_FACE_MODE, &faceCull);\n\tstate.faceCullMode = faceCull;\n\n\tfor (int i = 0; i < (int) BUFFERUSAGE_MAX_ENUM; i++)\n\t{\n\t\tstate.boundBuffers[i] = 0;\n\t\tif (isBufferUsageSupported((BufferUsage) i))\n\t\t\tglBindBuffer(getGLBufferType((BufferUsage) i), 0);\n\t}\n\n\tif (isBufferUsageSupported(BUFFERUSAGE_SHADER_STORAGE))\n\t\tstate.boundIndexedBuffers[BUFFERUSAGE_SHADER_STORAGE].resize(maxShaderStorageBufferBindings, 0);\n\n\t// Initialize multiple texture unit support for shaders.\n\tfor (int i = 0; i < TEXTURE_MAX_ENUM + 1; i++)\n\t{\n\t\tstate.boundTextures[i].clear();\n\t\tstate.boundTextures[i].resize(maxTextureUnits, 0);\n\t}\n\n\tfor (int i = 0; i < maxTextureUnits; i++)\n\t{\n\t\tglActiveTexture(GL_TEXTURE0 + i);\n\n\t\tfor (int j = 0; j < TEXTURE_MAX_ENUM; j++)\n\t\t{\n\t\t\tTextureType textype = (TextureType) j;\n\t\t\tglBindTexture(getGLTextureType(textype), 0);\n\t\t}\n\t}\n\n\tglActiveTexture(GL_TEXTURE0);\n\tstate.curTextureUnit = 0;\n\n\tsetDepthWrites(state.depthWritesEnabled);\n\tsetStencilWriteMask(state.stencilWriteMask);\n\tsetColorWriteMask(state.colorWriteMask);\n\n\tcontextInitialized = true;\n}\n\nvoid OpenGL::deInitContext()\n{\n\tif (!contextInitialized)\n\t\treturn;\n\n\tcontextInitialized = false;\n}\n\nvoid OpenGL::initVendor()\n{\n\tconst char *vstr = (const char *) glGetString(GL_VENDOR);\n\tif (!vstr)\n\t{\n\t\tvendor = VENDOR_UNKNOWN;\n\t\treturn;\n\t}\n\n\t// http://feedback.wildfiregames.com/report/opengl/feature/GL_VENDOR\n\t// http://stackoverflow.com/questions/2093594/opengl-extensions-available-on-different-android-devices\n\t// https://opengl.gpuinfo.org/displaycapability.php?name=GL_VENDOR\n\tif (strstr(vstr, \"ATI Technologies\") || strstr(vstr, \"AMD\") || strstr(vstr, \"Advanced Micro Devices\"))\n\t\tvendor = VENDOR_AMD;\n\telse if (strstr(vstr, \"NVIDIA\"))\n\t\tvendor = VENDOR_NVIDIA;\n\telse if (strstr(vstr, \"Intel\"))\n\t\tvendor = VENDOR_INTEL;\n\telse if (strstr(vstr, \"Mesa\"))\n\t\tvendor = VENDOR_MESA_SOFT;\n\telse if (strstr(vstr, \"Apple Computer\") || strstr(vstr, \"Apple Inc.\"))\n\t\tvendor = VENDOR_APPLE;\n\telse if (strstr(vstr, \"Microsoft\"))\n\t\tvendor = VENDOR_MICROSOFT;\n\telse if (strstr(vstr, \"Imagination\"))\n\t\tvendor = VENDOR_IMGTEC;\n\telse if (strstr(vstr, \"ARM\"))\n\t\tvendor = VENDOR_ARM;\n\telse if (strstr(vstr, \"Qualcomm\"))\n\t\tvendor = VENDOR_QUALCOMM;\n\telse if (strstr(vstr, \"Broadcom\"))\n\t\tvendor = VENDOR_BROADCOM;\n\telse if (strstr(vstr, \"Vivante\"))\n\t\tvendor = VENDOR_VIVANTE;\n\telse\n\t\tvendor = VENDOR_UNKNOWN;\n}\n\nvoid OpenGL::initOpenGLFunctions()\n{\n\tif (!GLAD_VERSION_3_2 && !GLAD_ES_VERSION_3_2 && !GLAD_ARB_draw_elements_base_vertex)\n\t{\n\t\tif (GLAD_OES_draw_elements_base_vertex)\n\t\t{\n\t\t\tfp_glDrawElementsBaseVertex = fp_glDrawElementsBaseVertexOES;\n\n\t\t\tif (GLAD_ES_VERSION_3_0)\n\t\t\t{\n\t\t\t\tfp_glDrawRangeElementsBaseVertex = fp_glDrawRangeElementsBaseVertexOES;\n\t\t\t\tfp_glDrawElementsInstancedBaseVertex = fp_glDrawElementsInstancedBaseVertexOES;\n\t\t\t}\n\n\t\t}\n\t\telse if (GLAD_EXT_draw_elements_base_vertex)\n\t\t{\n\t\t\tfp_glDrawElementsBaseVertex = fp_glDrawElementsBaseVertexEXT;\n\n\t\t\tif (GLAD_ES_VERSION_3_0)\n\t\t\t{\n\t\t\t\tfp_glDrawRangeElementsBaseVertex = fp_glDrawRangeElementsBaseVertexEXT;\n\t\t\t\tfp_glDrawElementsInstancedBaseVertex = fp_glDrawElementsInstancedBaseVertexEXT;\n\t\t\t}\n\n\t\t}\n\t}\n}\n\nvoid OpenGL::initMaxValues()\n{\n\tbaseVertexSupported = GLAD_VERSION_3_2 || GLAD_ES_VERSION_3_2 || GLAD_ARB_draw_elements_base_vertex\n\t\t|| GLAD_OES_draw_elements_base_vertex || GLAD_EXT_draw_elements_base_vertex;\n\n\t// We'll need this value to clamp anisotropy.\n\tif (GLAD_EXT_texture_filter_anisotropic)\n\t\tglGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maxAnisotropy);\n\telse\n\t\tmaxAnisotropy = 1.0f;\n\n\tglGetIntegerv(GL_MAX_TEXTURE_SIZE, &max2DTextureSize);\n\tglGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &maxCubeTextureSize);\n\tglGetIntegerv(GL_MAX_3D_TEXTURE_SIZE, &max3DTextureSize);\n\tglGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, &maxTextureArrayLayers);\n\n\tif (isBufferUsageSupported(BUFFERUSAGE_TEXEL))\n\t\tglGetIntegerv(GL_MAX_TEXTURE_BUFFER_SIZE, &maxTexelBufferSize);\n\telse\n\t\tmaxTexelBufferSize = 0;\n\n\tif (isBufferUsageSupported(BUFFERUSAGE_SHADER_STORAGE))\n\t{\n\t\tglGetIntegerv(GL_MAX_SHADER_STORAGE_BLOCK_SIZE, &maxShaderStorageBufferSize);\n\t\tglGetIntegerv(GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS, &maxShaderStorageBufferBindings);\n\t}\n\telse\n\t{\n\t\tmaxShaderStorageBufferSize = 0;\n\t\tmaxShaderStorageBufferBindings = 0;\n\t}\n\n\tif (GLAD_ES_VERSION_3_1 || GLAD_VERSION_4_3)\n\t{\n\t\tglGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 0, &maxComputeWorkGroupsX);\n\t\tglGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 1, &maxComputeWorkGroupsY);\n\t\tglGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 2, &maxComputeWorkGroupsZ);\n\t}\n\telse\n\t{\n\t\tmaxComputeWorkGroupsX = 0;\n\t\tmaxComputeWorkGroupsY = 0;\n\t\tmaxComputeWorkGroupsZ = 0;\n\t}\n\n\tint maxattachments = 1;\n\tint maxdrawbuffers = 1;\n\tglGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, &maxattachments);\n\tglGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxdrawbuffers);\n\n\tmaxRenderTargets = std::max(std::min(maxattachments, maxdrawbuffers), 1);\n\n\tglGetIntegerv(GL_MAX_SAMPLES, &maxSamples);\n\n\tglGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxTextureUnits);\n\n\tGLfloat limits[2];\n\tif (GLAD_VERSION_3_0)\n\t\tglGetFloatv(GL_POINT_SIZE_RANGE, limits);\n\telse\n\t\tglGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, limits);\n\tmaxPointSize = limits[1];\n\n\tif (isSamplerLODBiasSupported())\n\t\tglGetFloatv(GL_MAX_TEXTURE_LOD_BIAS, &maxLODBias);\n\telse\n\t\tmaxLODBias = 0.0f;\n}\n\nvoid OpenGL::prepareDraw(love::graphics::Graphics *gfx)\n{\n\tTempDebugGroup debuggroup(\"Prepare OpenGL draw\");\n\n\t// Make sure the active shader's love-provided uniforms are up to date.\n\tif (Shader::current != nullptr)\n\t{\n\t\tRect viewport = getViewport();\n\t\t((Shader *)Shader::current)->updateBuiltinUniforms(gfx, viewport.w, viewport.h);\n\t}\n}\n\nGLenum OpenGL::getGLPrimitiveType(PrimitiveType type)\n{\n\tswitch (type)\n\t{\n\t\tcase PRIMITIVE_TRIANGLES: return GL_TRIANGLES;\n\t\tcase PRIMITIVE_TRIANGLE_STRIP: return GL_TRIANGLE_STRIP;\n\t\tcase PRIMITIVE_TRIANGLE_FAN: return GL_TRIANGLE_FAN;\n\t\tcase PRIMITIVE_POINTS: return GL_POINTS;\n\t\tcase PRIMITIVE_MAX_ENUM: return GL_ZERO;\n\t}\n\n\treturn GL_ZERO;\n}\n\nGLenum OpenGL::getGLBufferType(BufferUsage usage)\n{\n\tswitch (usage)\n\t{\n\t\tcase BUFFERUSAGE_VERTEX: return GL_ARRAY_BUFFER;\n\t\tcase BUFFERUSAGE_INDEX: return GL_ELEMENT_ARRAY_BUFFER;\n\t\tcase BUFFERUSAGE_TEXEL: return GL_TEXTURE_BUFFER;\n\t\tcase BUFFERUSAGE_UNIFORM: return GL_UNIFORM_BUFFER;\n\t\tcase BUFFERUSAGE_SHADER_STORAGE: return GL_SHADER_STORAGE_BUFFER;\n\t\tcase BUFFERUSAGE_INDIRECT_ARGUMENTS: return GL_DRAW_INDIRECT_BUFFER;\n\t\tcase BUFFERUSAGE_MAX_ENUM: return GL_ZERO;\n\t}\n\n\treturn GL_ZERO;\n}\n\nGLenum OpenGL::getGLTextureType(TextureType type)\n{\n\tswitch (type)\n\t{\n\t\tcase TEXTURE_2D: return GL_TEXTURE_2D;\n\t\tcase TEXTURE_VOLUME: return GL_TEXTURE_3D;\n\t\tcase TEXTURE_2D_ARRAY: return GL_TEXTURE_2D_ARRAY;\n\t\tcase TEXTURE_CUBE: return GL_TEXTURE_CUBE_MAP;\n\t\tcase TEXTURE_MAX_ENUM: return GL_TEXTURE_BUFFER; // Hack\n\t}\n\n\treturn GL_ZERO;\n}\n\nGLenum OpenGL::getGLIndexDataType(IndexDataType type)\n{\n\tswitch (type)\n\t{\n\t\tcase INDEX_UINT16: return GL_UNSIGNED_SHORT;\n\t\tcase INDEX_UINT32: return GL_UNSIGNED_INT;\n\t\tdefault: return GL_ZERO;\n\t}\n}\n\nGLenum OpenGL::getGLVertexDataType(DataFormat format, int &components, GLboolean &normalized, bool &intformat)\n{\n\tnormalized = GL_FALSE;\n\tintformat = false;\n\tcomponents = 1;\n\n\tswitch (format)\n\t{\n\tcase DATAFORMAT_FLOAT:\n\t\tcomponents = 1;\n\t\treturn GL_FLOAT;\n\tcase DATAFORMAT_FLOAT_VEC2:\n\t\tcomponents = 2;\n\t\treturn GL_FLOAT;\n\tcase DATAFORMAT_FLOAT_VEC3:\n\t\tcomponents = 3;\n\t\treturn GL_FLOAT;\n\tcase DATAFORMAT_FLOAT_VEC4:\n\t\tcomponents = 4;\n\t\treturn GL_FLOAT;\n\n\tcase DATAFORMAT_FLOAT_MAT2X2:\n\tcase DATAFORMAT_FLOAT_MAT2X3:\n\tcase DATAFORMAT_FLOAT_MAT2X4:\n\tcase DATAFORMAT_FLOAT_MAT3X2:\n\tcase DATAFORMAT_FLOAT_MAT3X3:\n\tcase DATAFORMAT_FLOAT_MAT3X4:\n\tcase DATAFORMAT_FLOAT_MAT4X2:\n\tcase DATAFORMAT_FLOAT_MAT4X3:\n\tcase DATAFORMAT_FLOAT_MAT4X4:\n\t\treturn GL_ZERO;\n\n\tcase DATAFORMAT_INT32:\n\t\tcomponents = 1;\n\t\tintformat = true;\n\t\treturn GL_INT;\n\tcase DATAFORMAT_INT32_VEC2:\n\t\tcomponents = 2;\n\t\tintformat = true;\n\t\treturn GL_INT;\n\tcase DATAFORMAT_INT32_VEC3:\n\t\tcomponents = 3;\n\t\tintformat = true;\n\t\treturn GL_INT;\n\tcase DATAFORMAT_INT32_VEC4:\n\t\tcomponents = 4;\n\t\tintformat = true;\n\t\treturn GL_INT;\n\n\tcase DATAFORMAT_UINT32:\n\t\tcomponents = 1;\n\t\tintformat = true;\n\t\treturn GL_UNSIGNED_INT;\n\tcase DATAFORMAT_UINT32_VEC2:\n\t\tcomponents = 2;\n\t\tintformat = true;\n\t\treturn GL_UNSIGNED_INT;\n\tcase DATAFORMAT_UINT32_VEC3:\n\t\tcomponents = 3;\n\t\tintformat = true;\n\t\treturn GL_UNSIGNED_INT;\n\tcase DATAFORMAT_UINT32_VEC4:\n\t\tcomponents = 4;\n\t\tintformat = true;\n\t\treturn GL_UNSIGNED_INT;\n\n\tcase DATAFORMAT_SNORM8_VEC4:\n\t\tcomponents = 4;\n\t\tnormalized = GL_TRUE;\n\t\treturn GL_BYTE;\n\n\tcase DATAFORMAT_UNORM8_VEC4:\n\t\tcomponents = 4;\n\t\tnormalized = GL_TRUE;\n\t\treturn GL_UNSIGNED_BYTE;\n\n\tcase DATAFORMAT_INT8_VEC4:\n\t\tcomponents = 4;\n\t\tintformat = true;\n\t\treturn GL_BYTE;\n\n\tcase DATAFORMAT_UINT8_VEC4:\n\t\tcomponents = 4;\n\t\tintformat = true;\n\t\treturn GL_UNSIGNED_BYTE;\n\n\tcase DATAFORMAT_SNORM16_VEC2:\n\t\tcomponents = 2;\n\t\tnormalized = GL_TRUE;\n\t\treturn GL_BYTE;\n\tcase DATAFORMAT_SNORM16_VEC4:\n\t\tcomponents = 4;\n\t\tnormalized = GL_TRUE;\n\t\treturn GL_BYTE;\n\n\tcase DATAFORMAT_UNORM16_VEC2:\n\t\tcomponents = 2;\n\t\tnormalized = GL_TRUE;\n\t\treturn GL_UNSIGNED_SHORT;\n\tcase DATAFORMAT_UNORM16_VEC4:\n\t\tcomponents = 4;\n\t\tnormalized = GL_TRUE;\n\t\treturn GL_UNSIGNED_SHORT;\n\n\tcase DATAFORMAT_INT16_VEC2:\n\t\tcomponents = 2;\n\t\tintformat = true;\n\t\treturn GL_SHORT;\n\tcase DATAFORMAT_INT16_VEC4:\n\t\tcomponents = 4;\n\t\tintformat = true;\n\t\treturn GL_SHORT;\n\n\tcase DATAFORMAT_UINT16:\n\t\tcomponents = 1;\n\t\tintformat = true;\n\t\treturn GL_UNSIGNED_SHORT;\n\tcase DATAFORMAT_UINT16_VEC2:\n\t\tcomponents = 2;\n\t\tintformat = true;\n\t\treturn GL_UNSIGNED_SHORT;\n\tcase DATAFORMAT_UINT16_VEC4:\n\t\tcomponents = 4;\n\t\tintformat = true;\n\t\treturn GL_UNSIGNED_SHORT;\n\n\tcase DATAFORMAT_BOOL:\n\tcase DATAFORMAT_BOOL_VEC2:\n\tcase DATAFORMAT_BOOL_VEC3:\n\tcase DATAFORMAT_BOOL_VEC4:\n\t\treturn GL_ZERO;\n\n\tcase DATAFORMAT_MAX_ENUM:\n\t\treturn GL_ZERO;\n\t}\n\n\treturn GL_ZERO;\n}\n\nGLenum OpenGL::getGLBufferDataUsage(BufferDataUsage usage)\n{\n\tswitch (usage)\n\t{\n\t\tcase BUFFERDATAUSAGE_STREAM: return GL_STREAM_DRAW;\n\t\tcase BUFFERDATAUSAGE_DYNAMIC: return GL_DYNAMIC_DRAW;\n\t\tcase BUFFERDATAUSAGE_STATIC: return GL_STATIC_DRAW;\n\t\tcase BUFFERDATAUSAGE_READBACK: return GL_STREAM_READ;\n\t\tdefault: return 0;\n\t}\n}\n\nvoid OpenGL::bindBuffer(BufferUsage type, GLuint buffer)\n{\n\tif (state.boundBuffers[type] != buffer)\n\t{\n\t\tglBindBuffer(getGLBufferType(type), buffer);\n\t\tstate.boundBuffers[type] = buffer;\n\t}\n}\n\nvoid OpenGL::deleteBuffer(GLuint buffer)\n{\n\tglDeleteBuffers(1, &buffer);\n\n\tfor (int i = 0; i < (int) BUFFERUSAGE_MAX_ENUM; i++)\n\t{\n\t\tif (state.boundBuffers[i] == buffer)\n\t\t\tstate.boundBuffers[i] = 0;\n\n\t\tfor (GLuint &bufferid : state.boundIndexedBuffers[i])\n\t\t{\n\t\t\tif (bufferid == buffer)\n\t\t\t\tbufferid = 0;\n\t\t}\n\t}\n}\n\nvoid OpenGL::setVertexAttributes(const VertexAttributes &attributes, const BufferBindings &buffers)\n{\n\tuint32 enablediff = attributes.enableBits ^ state.enabledAttribArrays;\n\tuint32 instanceattribbits = 0;\n\tuint32 allbits = attributes.enableBits | state.enabledAttribArrays;\n\n\tuint32 i = 0;\n\twhile (allbits)\n\t{\n\t\tuint32 bit = 1u << i;\n\n\t\tif (enablediff & bit)\n\t\t{\n\t\t\tif (attributes.enableBits & bit)\n\t\t\t\tglEnableVertexAttribArray(i);\n\t\t\telse\n\t\t\t\tglDisableVertexAttribArray(i);\n\t\t}\n\n\t\tif (attributes.enableBits & bit)\n\t\t{\n\t\t\tconst auto &attrib = attributes.attribs[i];\n\t\t\tconst auto &layout = attributes.bufferLayouts[attrib.bufferIndex];\n\t\t\tconst auto &bufferinfo = buffers.info[attrib.bufferIndex];\n\n\t\t\tuint32 bufferbit = 1u << attrib.bufferIndex;\n\t\t\tuint32 divisor = (attributes.instanceBits & bufferbit) != 0 ? 1 : 0;\n\t\t\tuint32 divisorbit = divisor << i;\n\t\t\tinstanceattribbits |= divisorbit;\n\n\t\t\tif ((state.instancedAttribArrays & bit) ^ divisorbit)\n\t\t\t\tglVertexAttribDivisor(i, divisor);\n\n\t\t\tint components = 0;\n\t\t\tGLboolean normalized = GL_FALSE;\n\t\t\tbool intformat = false;\n\t\t\tGLenum gltype = getGLVertexDataType(attrib.getFormat(), components, normalized, intformat);\n\n\t\t\tconst void *offsetpointer = reinterpret_cast<void*>(bufferinfo.offset + attrib.offsetFromVertex);\n\n\t\t\tbindBuffer(BUFFERUSAGE_VERTEX, (GLuint) bufferinfo.buffer->getHandle());\n\n\t\t\tif (intformat)\n\t\t\t\tglVertexAttribIPointer(i, components, gltype, layout.stride, offsetpointer);\n\t\t\telse\n\t\t\t\tglVertexAttribPointer(i, components, gltype, normalized, layout.stride, offsetpointer);\n\t\t}\n\n\t\ti++;\n\t\tallbits >>= 1;\n\t}\n\n\tstate.enabledAttribArrays = attributes.enableBits;\n\tstate.instancedAttribArrays = instanceattribbits | (state.instancedAttribArrays & (~attributes.enableBits));\n\n\t// glDisableVertexAttribArray will make the constant value for a vertex\n\t// attribute undefined. We rely on the per-vertex color attribute being\n\t// white when no per-vertex color is used, so we set it here.\n\t// FIXME: Is there a better place to do this?\n\tif ((enablediff & ATTRIBFLAG_COLOR) && !(attributes.enableBits & ATTRIBFLAG_COLOR))\n\t\tglVertexAttrib4f(ATTRIB_COLOR, 1.0f, 1.0f, 1.0f, 1.0f);\n}\n\nvoid OpenGL::setCullMode(CullMode mode)\n{\n\tbool enabled = mode != CULL_NONE;\n\n\tif (enabled != isStateEnabled(ENABLE_FACE_CULL))\n\t\tsetEnableState(ENABLE_FACE_CULL, enabled);\n\n\tif (enabled)\n\t{\n\t\tGLenum glmode = mode == CULL_BACK ? GL_BACK : GL_FRONT;\n\t\tif (glmode != state.faceCullMode)\n\t\t{\n\t\t\tglCullFace(glmode);\n\t\t\tstate.faceCullMode = glmode;\n\t\t}\n\t}\n}\n\nvoid OpenGL::clearDepth(double value)\n{\n\tif (GLAD_ES_VERSION_2_0)\n\t\tglClearDepthf((GLfloat) value);\n\telse\n\t\tglClearDepth(value);\n}\n\nvoid OpenGL::setViewport(const Rect &v)\n{\n\tglViewport(v.x, v.y, v.w, v.h);\n\tstate.viewport = v;\n}\n\nRect OpenGL::getViewport() const\n{\n\treturn state.viewport;\n}\n\nvoid OpenGL::setScissor(const Rect &v, bool rtActive)\n{\n\tif (rtActive)\n\t\tglScissor(v.x, v.y, v.w, v.h);\n\telse\n\t{\n\t\t// With no RT active, we need to compensate for glScissor starting\n\t\t// from the lower left of the viewport instead of the top left.\n\t\tglScissor(v.x, state.viewport.h - (v.y + v.h), v.w, v.h);\n\t}\n\n\tstate.scissor = v;\n}\n\nvoid OpenGL::setEnableState(EnableState enablestate, bool enable)\n{\n\tGLenum glstate = GL_NONE;\n\n\tswitch (enablestate)\n\t{\n\tcase ENABLE_BLEND:\n\t\tglstate = GL_BLEND;\n\t\tbreak;\n\tcase ENABLE_DEPTH_TEST:\n\t\tglstate = GL_DEPTH_TEST;\n\t\tbreak;\n\tcase ENABLE_STENCIL_TEST:\n\t\tglstate = GL_STENCIL_TEST;\n\t\tbreak;\n\tcase ENABLE_SCISSOR_TEST:\n\t\tglstate = GL_SCISSOR_TEST;\n\t\tbreak;\n\tcase ENABLE_FACE_CULL:\n\t\tglstate = GL_CULL_FACE;\n\t\tbreak;\n\tcase ENABLE_FRAMEBUFFER_SRGB:\n\t\tglstate = GL_FRAMEBUFFER_SRGB;\n\t\tbreak;\n\tcase ENABLE_MAX_ENUM:\n\t\tbreak;\n\t}\n\n\tif (enable)\n\t\tglEnable(glstate);\n\telse\n\t\tglDisable(glstate);\n\n\tstate.enableState[enablestate] = enable;\n}\n\nbool OpenGL::isStateEnabled(EnableState enablestate) const\n{\n\treturn state.enableState[enablestate];\n}\n\nvoid OpenGL::bindFramebuffer(FramebufferTarget target, GLuint framebuffer)\n{\n\tbool bindingmodified = false;\n\n\tif ((target & FRAMEBUFFER_DRAW) && state.boundFramebuffers[0] != framebuffer)\n\t{\n\t\tbindingmodified = true;\n\t\tstate.boundFramebuffers[0] = framebuffer;\n\t}\n\n\tif ((target & FRAMEBUFFER_READ) && state.boundFramebuffers[1] != framebuffer)\n\t{\n\t\tbindingmodified = true;\n\t\tstate.boundFramebuffers[1] = framebuffer;\n\t}\n\n\tif (bindingmodified)\n\t{\n\t\tGLenum gltarget = GL_FRAMEBUFFER;\n\t\tif (target == FRAMEBUFFER_DRAW)\n\t\t\tgltarget = GL_DRAW_FRAMEBUFFER;\n\t\telse if (target == FRAMEBUFFER_READ)\n\t\t\tgltarget = GL_READ_FRAMEBUFFER;\n\n\t\tglBindFramebuffer(gltarget, framebuffer);\n\t}\n}\n\nGLenum OpenGL::getFramebuffer(FramebufferTarget target) const\n{\n\tif (target & FRAMEBUFFER_DRAW)\n\t\treturn state.boundFramebuffers[0];\n\telse if (target & FRAMEBUFFER_READ)\n\t\treturn state.boundFramebuffers[1];\n\telse\n\t\treturn 0;\n}\n\nvoid OpenGL::deleteFramebuffer(GLuint framebuffer)\n{\n\tglDeleteFramebuffers(1, &framebuffer);\n\n\tfor (int i = 0; i < 2; i++)\n\t{\n\t\tif (state.boundFramebuffers[i] == framebuffer)\n\t\t\tstate.boundFramebuffers[i] = 0;\n\t}\n}\n\nvoid OpenGL::framebufferTexture(GLenum attachment, TextureType texType, GLuint texture, int level, int layer, int face)\n{\n\tGLenum textarget = getGLTextureType(texType);\n\n\tswitch (texType)\n\t{\n\tcase TEXTURE_2D:\n\t\tglFramebufferTexture2D(GL_FRAMEBUFFER, attachment, textarget, texture, level);\n\t\tbreak;\n\tcase TEXTURE_VOLUME:\n\t\tglFramebufferTexture3D(GL_FRAMEBUFFER, attachment, textarget, texture, level, layer);\n\t\tbreak;\n\tcase TEXTURE_2D_ARRAY:\n\t\tglFramebufferTextureLayer(GL_FRAMEBUFFER, attachment, texture, level, layer);\n\t\tbreak;\n\tcase TEXTURE_CUBE:\n\t\tglFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, texture, level);\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nvoid OpenGL::setDepthWrites(bool enable)\n{\n\tglDepthMask(enable ? GL_TRUE : GL_FALSE);\n\tstate.depthWritesEnabled = enable;\n}\n\nbool OpenGL::hasDepthWrites() const\n{\n\treturn state.depthWritesEnabled;\n}\n\nvoid OpenGL::setStencilWriteMask(uint32 mask)\n{\n\tglStencilMask(mask);\n\tstate.stencilWriteMask = mask;\n}\n\nuint32 OpenGL::getStencilWriteMask() const\n{\n\treturn state.stencilWriteMask;\n}\n\nvoid OpenGL::setColorWriteMask(uint32 mask)\n{\n\tGLboolean r = (mask & (1 << 0)) ? GL_TRUE : GL_FALSE;\n\tGLboolean g = (mask & (1 << 1)) ? GL_TRUE : GL_FALSE;\n\tGLboolean b = (mask & (1 << 2)) ? GL_TRUE : GL_FALSE;\n\tGLboolean a = (mask & (1 << 3)) ? GL_TRUE : GL_FALSE;\n\tglColorMask(r, g, b, a);\n\tstate.colorWriteMask = mask;\n}\n\nuint32 OpenGL::getColorWriteMask() const\n{\n\treturn state.colorWriteMask;\n}\n\nvoid OpenGL::useProgram(GLuint program)\n{\n\tglUseProgram(program);\n\t++stats.shaderSwitches;\n}\n\nGLuint OpenGL::getDefaultFBO() const\n{\n#ifdef LOVE_IOS\n\t// Hack: iOS uses a custom FBO.\n\tSDL_PropertiesID props = SDL_GetWindowProperties(SDL_GL_GetCurrentWindow());\n\treturn (GLuint)SDL_GetNumberProperty(props, SDL_PROP_WINDOW_UIKIT_OPENGL_FRAMEBUFFER_NUMBER, 0);\n#else\n\treturn 0;\n#endif\n}\n\nvoid OpenGL::setTextureUnit(int textureunit)\n{\n\tif (textureunit != state.curTextureUnit)\n\t\tglActiveTexture(GL_TEXTURE0 + textureunit);\n\n\tstate.curTextureUnit = textureunit;\n}\n\nvoid OpenGL::bindTextureToUnit(TextureType target, GLuint texture, int textureunit, bool restoreprev, bool bindforedit)\n{\n\tif (texture != state.boundTextures[target][textureunit])\n\t{\n\t\tint oldtextureunit = state.curTextureUnit;\n\t\tif (oldtextureunit != textureunit)\n\t\t\tglActiveTexture(GL_TEXTURE0 + textureunit);\n\n\t\tstate.boundTextures[target][textureunit] = texture;\n\t\tglBindTexture(getGLTextureType(target), texture);\n\n\t\tif (restoreprev && oldtextureunit != textureunit)\n\t\t\tglActiveTexture(GL_TEXTURE0 + oldtextureunit);\n\t\telse\n\t\t\tstate.curTextureUnit = textureunit;\n\t}\n\telse if (bindforedit && !restoreprev && textureunit != state.curTextureUnit)\n\t{\n\t\tglActiveTexture(GL_TEXTURE0 + textureunit);\n\t\tstate.curTextureUnit = textureunit;\n\t}\n}\n\nvoid OpenGL::bindBufferTextureToUnit(GLuint texture, int textureunit, bool restoreprev, bool bindforedit)\n{\n\tbindTextureToUnit(TEXTURE_MAX_ENUM, texture, textureunit, restoreprev, bindforedit);\n}\n\nvoid OpenGL::bindTextureToUnit(Texture *texture, int textureunit, bool restoreprev, bool bindforedit)\n{\n\tTextureType textype = texture->getTextureType();\n\tGLuint handle = (GLuint) texture->getHandle();\n\tbindTextureToUnit(textype, handle, textureunit, restoreprev, bindforedit);\n}\n\nvoid OpenGL::bindIndexedBuffer(GLuint buffer, BufferUsage type, int index)\n{\n\tauto &bindings = state.boundIndexedBuffers[type];\n\tif (bindings.size() > (size_t) index && buffer != bindings[index])\n\t{\n\t\tbindings[index] = buffer;\n\t\tglBindBufferBase(getGLBufferType(type), index, buffer);\n\n\t\t// glBindBufferBase affects glBindBuffer as well... for some reason.\n\t\tstate.boundBuffers[type] = buffer;\n\t}\n}\n\nvoid OpenGL::deleteTexture(GLuint texture)\n{\n\t// glDeleteTextures binds texture 0 to all texture units the deleted texture\n\t// was bound to before deletion.\n\tfor (int i = 0; i < TEXTURE_MAX_ENUM + 1; i++)\n\t{\n\t\tfor (GLuint &texid : state.boundTextures[i])\n\t\t{\n\t\t\tif (texid == texture)\n\t\t\t\ttexid = 0;\n\t\t}\n\t}\n\n\tglDeleteTextures(1, &texture);\n}\n\nGLint OpenGL::getGLWrapMode(SamplerState::WrapMode wmode)\n{\n\tswitch (wmode)\n\t{\n\tcase SamplerState::WRAP_CLAMP:\n\tdefault:\n\t\treturn GL_CLAMP_TO_EDGE;\n\tcase SamplerState::WRAP_CLAMP_ZERO:\n\tcase SamplerState::WRAP_CLAMP_ONE:\n\t\treturn GL_CLAMP_TO_BORDER;\n\tcase SamplerState::WRAP_REPEAT:\n\t\treturn GL_REPEAT;\n\tcase SamplerState::WRAP_MIRRORED_REPEAT:\n\t\treturn GL_MIRRORED_REPEAT;\n\t}\n}\n\nGLint OpenGL::getGLCompareMode(CompareMode mode)\n{\n\tswitch (mode)\n\t{\n\t\tcase COMPARE_LESS: return GL_LESS;\n\t\tcase COMPARE_LEQUAL: return GL_LEQUAL;\n\t\tcase COMPARE_EQUAL: return GL_EQUAL;\n\t\tcase COMPARE_GEQUAL: return GL_GEQUAL;\n\t\tcase COMPARE_GREATER: return GL_GREATER;\n\t\tcase COMPARE_NOTEQUAL: return GL_NOTEQUAL;\n\t\tcase COMPARE_ALWAYS: return GL_ALWAYS;\n\t\tcase COMPARE_NEVER: return GL_NEVER;\n\t\tdefault: return GL_NEVER;\n\t}\n}\n\nstatic bool isClampOne(SamplerState::WrapMode mode)\n{\n\treturn mode == SamplerState::WRAP_CLAMP_ONE;\n}\n\nvoid OpenGL::setSamplerState(TextureType target, SamplerState &s)\n{\n\tGLenum gltarget = getGLTextureType(target);\n\n\tGLint gmin = s.minFilter == SamplerState::FILTER_NEAREST ? GL_NEAREST : GL_LINEAR;\n\tGLint gmag = s.magFilter == SamplerState::FILTER_NEAREST ? GL_NEAREST : GL_LINEAR;\n\n\tif (s.mipmapFilter != SamplerState::MIPMAP_FILTER_NONE)\n\t{\n\t\tif (s.minFilter == SamplerState::FILTER_NEAREST && s.mipmapFilter == SamplerState::MIPMAP_FILTER_NEAREST)\n\t\t\tgmin = GL_NEAREST_MIPMAP_NEAREST;\n\t\telse if (s.minFilter == SamplerState::FILTER_NEAREST && s.mipmapFilter == SamplerState::MIPMAP_FILTER_LINEAR)\n\t\t\tgmin = GL_NEAREST_MIPMAP_LINEAR;\n\t\telse if (s.minFilter == SamplerState::FILTER_LINEAR && s.mipmapFilter == SamplerState::MIPMAP_FILTER_NEAREST)\n\t\t\tgmin = GL_LINEAR_MIPMAP_NEAREST;\n\t\telse if (s.minFilter == SamplerState::FILTER_LINEAR && s.mipmapFilter == SamplerState::MIPMAP_FILTER_LINEAR)\n\t\t\tgmin = GL_LINEAR_MIPMAP_LINEAR;\n\t}\n\n\tglTexParameteri(gltarget, GL_TEXTURE_MIN_FILTER, gmin);\n\tglTexParameteri(gltarget, GL_TEXTURE_MAG_FILTER, gmag);\n\n\tif (!isClampZeroOneTextureWrapSupported())\n\t{\n\t\tif (SamplerState::isClampZeroOrOne(s.wrapU)) s.wrapU = SamplerState::WRAP_CLAMP;\n\t\tif (SamplerState::isClampZeroOrOne(s.wrapV)) s.wrapV = SamplerState::WRAP_CLAMP;\n\t\tif (SamplerState::isClampZeroOrOne(s.wrapW)) s.wrapW = SamplerState::WRAP_CLAMP;\n\t}\n\n\tif (SamplerState::isClampZeroOrOne(s.wrapU) || SamplerState::isClampZeroOrOne(s.wrapV) || SamplerState::isClampZeroOrOne(s.wrapW))\n\t{\n\t\tGLfloat c[] = {0.0f, 0.0f, 0.0f, 0.0f};\n\t\tif (isClampOne(s.wrapU) || isClampOne(s.wrapU) || isClampOne(s.wrapV))\n\t\t\tc[0] = c[1] = c[2] = c[3] = 1.0f;\n\n\t\tglTexParameterfv(gltarget, GL_TEXTURE_BORDER_COLOR, c);\n\t}\n\n\tglTexParameteri(gltarget, GL_TEXTURE_WRAP_S, getGLWrapMode(s.wrapU));\n\tglTexParameteri(gltarget, GL_TEXTURE_WRAP_T, getGLWrapMode(s.wrapV));\n\n\tif (target == TEXTURE_VOLUME)\n\t\tglTexParameteri(gltarget, GL_TEXTURE_WRAP_R, getGLWrapMode(s.wrapW));\n\n\tif (isSamplerLODBiasSupported())\n\t{\n\t\tfloat maxbias = getMaxLODBias();\n\t\tif (maxbias > 0.01f)\n\t\t\tmaxbias -= 0.01f;\n\n\t\ts.lodBias = std::min(std::max(s.lodBias, -maxbias), maxbias);\n\n\t\tglTexParameterf(gltarget, GL_TEXTURE_LOD_BIAS, s.lodBias);\n\t}\n\telse\n\t{\n\t\ts.lodBias = 0.0f;\n\t}\n\n\tif (GLAD_EXT_texture_filter_anisotropic)\n\t{\n\t\tuint8 maxAniso = (uint8) std::min(maxAnisotropy, (float)LOVE_UINT8_MAX);\n\t\ts.maxAnisotropy = std::min(std::max(s.maxAnisotropy, (uint8)1), maxAniso);\n\t\tglTexParameteri(gltarget, GL_TEXTURE_MAX_ANISOTROPY_EXT, s.maxAnisotropy);\n\t}\n\telse\n\t{\n\t\ts.maxAnisotropy = 1;\n\t}\n\n\tglTexParameterf(gltarget, GL_TEXTURE_MIN_LOD, (float)s.minLod);\n\tglTexParameterf(gltarget, GL_TEXTURE_MAX_LOD, (float)s.maxLod);\n\n\tif (s.depthSampleMode.hasValue)\n\t{\n\t\t// See the comment in renderstate.h\n\t\tGLenum glmode = getGLCompareMode(getReversedCompareMode(s.depthSampleMode.value));\n\n\t\tglTexParameteri(gltarget, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);\n\t\tglTexParameteri(gltarget, GL_TEXTURE_COMPARE_FUNC, glmode);\n\t}\n\telse\n\t{\n\t\tglTexParameteri(gltarget, GL_TEXTURE_COMPARE_MODE, GL_NONE);\n\t}\n}\n\nbool OpenGL::rawTexStorage(TextureType target, int levels, PixelFormat pixelformat, int width, int height, int depth)\n{\n\tGLenum gltarget = getGLTextureType(target);\n\tTextureFormat fmt = convertPixelFormat(pixelformat);\n\tbool compressed = isPixelFormatCompressed(pixelformat);\n\n\t// This shouldn't be needed for glTexStorage, but some drivers don't follow\n\t// the spec apparently.\n\t// https://stackoverflow.com/questions/13859061/does-an-immutable-texture-need-a-gl-texture-max-level\n\tglTexParameteri(gltarget, GL_TEXTURE_MAX_LEVEL, levels - 1);\n\n\tif (fmt.swizzled)\n\t{\n\t\tglTexParameteri(gltarget, GL_TEXTURE_SWIZZLE_R, fmt.swizzle[0]);\n\t\tglTexParameteri(gltarget, GL_TEXTURE_SWIZZLE_G, fmt.swizzle[1]);\n\t\tglTexParameteri(gltarget, GL_TEXTURE_SWIZZLE_B, fmt.swizzle[2]);\n\t\tglTexParameteri(gltarget, GL_TEXTURE_SWIZZLE_A, fmt.swizzle[3]);\n\t}\n\n\tbool usetexstorage = isTexStorageSupported();\n\n\t// The fallback for bugs.brokenR8PixelFormat is GL_LUMINANCE, which doesn't have a sized\n\t// version in ES3 so it can't be used with glTexStorage.\n\tif (pixelformat == PIXELFORMAT_R8_UNORM && bugs.brokenR8PixelFormat && GLAD_ES_VERSION_3_0)\n\t{\n\t\tusetexstorage = false;\n\t\tfmt.internalformat = fmt.externalformat;\n\t}\n\n\tif (usetexstorage)\n\t{\n\t\tif (target == TEXTURE_2D || target == TEXTURE_CUBE)\n\t\t\tglTexStorage2D(gltarget, levels, fmt.internalformat, width, height);\n\t\telse if (target == TEXTURE_VOLUME || target == TEXTURE_2D_ARRAY)\n\t\t\tglTexStorage3D(gltarget, levels, fmt.internalformat, width, height, depth);\n\t}\n\telse\n\t{\n\t\tint w = width;\n\t\tint h = height;\n\t\tint d = depth;\n\n\t\tfor (int level = 0; level < levels; level++)\n\t\t{\n\t\t\tif (target == TEXTURE_2D || target == TEXTURE_CUBE)\n\t\t\t{\n\t\t\t\tint faces = target == TEXTURE_CUBE ? 6 : 1;\n\t\t\t\tfor (int face = 0; face < faces; face++)\n\t\t\t\t{\n\t\t\t\t\tif (target == TEXTURE_CUBE)\n\t\t\t\t\t\tgltarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X + face;\n\n\t\t\t\t\tif (compressed)\n\t\t\t\t\t{\n\t\t\t\t\t\tsize_t mipsize = faces * getPixelFormatSliceSize(pixelformat, w, h);\n\t\t\t\t\t\tglCompressedTexImage2D(gltarget, level, fmt.internalformat, w, h, 0, mipsize, nullptr);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tglTexImage2D(gltarget, level, fmt.internalformat, w, h, 0,\n\t\t\t\t\t\t             fmt.externalformat, fmt.type, nullptr);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (target == TEXTURE_2D_ARRAY || target == TEXTURE_VOLUME)\n\t\t\t{\n\t\t\t\tif (compressed)\n\t\t\t\t{\n\t\t\t\t\tsize_t mipsize = d * getPixelFormatSliceSize(pixelformat, w, h);\n\t\t\t\t\tglCompressedTexImage3D(gltarget, level, fmt.internalformat, w, h, d, 0, mipsize, nullptr);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tglTexImage3D(gltarget, level, fmt.internalformat, w, h, d,\n\t\t\t\t\t             0, fmt.externalformat, fmt.type, nullptr);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tw = std::max(w / 2, 1);\n\t\t\th = std::max(h / 2, 1);\n\n\t\t\tif (target == TEXTURE_VOLUME)\n\t\t\t\td = std::max(d / 2, 1);\n\t\t}\n\t}\n\n\treturn gltarget != GL_ZERO;\n}\n\nbool OpenGL::isTexStorageSupported()\n{\n\tif (gl.bugs.texStorageBreaksSubImage)\n\t\treturn false;\n\n\treturn GLAD_ES_VERSION_3_0 || GLAD_VERSION_4_2 || GLAD_ARB_texture_storage;\n}\n\nbool OpenGL::isBufferUsageSupported(BufferUsage usage) const\n{\n\tswitch (usage)\n\t{\n\tcase BUFFERUSAGE_VERTEX:\n\tcase BUFFERUSAGE_INDEX:\n\t\treturn true;\n\tcase BUFFERUSAGE_TEXEL:\n\t\treturn GLAD_VERSION_3_1 || GLAD_ES_VERSION_3_2;\n\tcase BUFFERUSAGE_UNIFORM:\n\t\treturn true;\n\tcase BUFFERUSAGE_SHADER_STORAGE:\n\t\treturn (GLAD_VERSION_4_3 && isCoreProfile()) || GLAD_ES_VERSION_3_1;\n\tcase BUFFERUSAGE_INDIRECT_ARGUMENTS:\n\t\treturn (GLAD_VERSION_4_0 && isCoreProfile()) || GLAD_ES_VERSION_3_1;\n\tcase BUFFERUSAGE_MAX_ENUM:\n\t\treturn false;\n\t}\n\treturn false;\n}\n\nbool OpenGL::isClampZeroOneTextureWrapSupported() const\n{\n\treturn GLAD_VERSION_1_3 || GLAD_EXT_texture_border_clamp || GLAD_NV_texture_border_clamp;\n}\n\nbool OpenGL::isSamplerLODBiasSupported() const\n{\n\treturn GLAD_VERSION_1_4;\n}\n\nbool OpenGL::isBaseVertexSupported() const\n{\n\treturn baseVertexSupported;\n}\n\nbool OpenGL::isCopyTextureToBufferSupported() const\n{\n\t// Requires glGetTextureSubImage support.\n\treturn GLAD_VERSION_4_5 || GLAD_ARB_get_texture_sub_image;\n}\n\nint OpenGL::getMax2DTextureSize() const\n{\n\treturn std::max(max2DTextureSize, 1);\n}\n\nint OpenGL::getMax3DTextureSize() const\n{\n\treturn std::max(max3DTextureSize, 1);\n}\n\nint OpenGL::getMaxCubeTextureSize() const\n{\n\treturn std::max(maxCubeTextureSize, 1);\n}\n\nint OpenGL::getMaxTextureLayers() const\n{\n\treturn std::max(maxTextureArrayLayers, 1);\n}\n\nint OpenGL::getMaxTexelBufferSize() const\n{\n\treturn maxTexelBufferSize;\n}\n\nint OpenGL::getMaxShaderStorageBufferSize() const\n{\n\treturn maxShaderStorageBufferSize;\n}\n\nint OpenGL::getMaxComputeWorkGroupsX() const\n{\n\treturn maxComputeWorkGroupsX;\n}\n\nint OpenGL::getMaxComputeWorkGroupsY() const\n{\n\treturn maxComputeWorkGroupsY;\n}\n\nint OpenGL::getMaxComputeWorkGroupsZ() const\n{\n\treturn maxComputeWorkGroupsZ;\n}\n\nint OpenGL::getMaxRenderTargets() const\n{\n\treturn std::min(maxRenderTargets, MAX_COLOR_RENDER_TARGETS);\n}\n\nint OpenGL::getMaxSamples() const\n{\n\treturn maxSamples;\n}\n\nint OpenGL::getMaxTextureUnits() const\n{\n\treturn maxTextureUnits;\n}\n\nint OpenGL::getMaxShaderStorageBufferBindings() const\n{\n\treturn maxShaderStorageBufferBindings;\n}\n\nfloat OpenGL::getMaxPointSize() const\n{\n\treturn maxPointSize;\n}\n\nfloat OpenGL::getMaxAnisotropy() const\n{\n\treturn maxAnisotropy;\n}\n\nfloat OpenGL::getMaxLODBias() const\n{\n\treturn maxLODBias;\n}\n\nbool OpenGL::isCoreProfile() const\n{\n\treturn coreProfile;\n}\n\nOpenGL::Vendor OpenGL::getVendor() const\n{\n\treturn vendor;\n}\n\nOpenGL::TextureFormat OpenGL::convertPixelFormat(PixelFormat pixelformat)\n{\n\tTextureFormat f;\n\n\tf.framebufferAttachments[0] = GL_COLOR_ATTACHMENT0;\n\tf.framebufferAttachments[1] = GL_NONE;\n\n\tif (pixelformat == PIXELFORMAT_ETC1_UNORM)\n\t{\n\t\t// The ETC2 format can load ETC1 textures.\n\t\tif (GLAD_ES_VERSION_3_0 || GLAD_VERSION_4_3 || GLAD_ARB_ES3_compatibility)\n\t\t\tpixelformat = PIXELFORMAT_ETC2_RGB_UNORM;\n\t}\n\n\tswitch (pixelformat)\n\t{\n\tcase PIXELFORMAT_R8_UNORM:\n\t\tif (!gl.bugs.brokenR8PixelFormat)\n\t\t{\n\t\t\tf.internalformat = GL_R8;\n\t\t\tf.externalformat = GL_RED;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tf.internalformat = GL_LUMINANCE8;\n\t\t\tf.externalformat = GL_LUMINANCE;\n\t\t}\n\t\tf.type = GL_UNSIGNED_BYTE;\n\t\tbreak;\n\tcase PIXELFORMAT_RG8_UNORM:\n\t\tf.internalformat = GL_RG8;\n\t\tf.externalformat = GL_RG;\n\t\tf.type = GL_UNSIGNED_BYTE;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA8_UNORM:\n\t\tf.internalformat = GL_RGBA8;\n\t\tf.externalformat = GL_RGBA;\n\t\tf.type = GL_UNSIGNED_BYTE;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA8_sRGB:\n\t\tf.internalformat = GL_SRGB8_ALPHA8;\n\t\tf.type = GL_UNSIGNED_BYTE;\n\t\tf.externalformat = GL_RGBA;\n\t\tbreak;\n\tcase PIXELFORMAT_BGRA8_UNORM:\n\tcase PIXELFORMAT_BGRA8_sRGB:\n\t\t// Not supported right now.\n\t\tbreak;\n\tcase PIXELFORMAT_R16_UNORM:\n\t\tf.internalformat = GL_R16;\n\t\tf.externalformat = GL_RED;\n\t\tf.type = GL_UNSIGNED_SHORT;\n\t\tbreak;\n\tcase PIXELFORMAT_RG16_UNORM:\n\t\tf.internalformat = GL_RG16;\n\t\tf.externalformat = GL_RG;\n\t\tf.type = GL_UNSIGNED_SHORT;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA16_UNORM:\n\t\tf.internalformat = GL_RGBA16;\n\t\tf.externalformat = GL_RGBA;\n\t\tf.type = GL_UNSIGNED_SHORT;\n\t\tbreak;\n\n\tcase PIXELFORMAT_R16_FLOAT:\n\t\tf.internalformat = GL_R16F;\n\t\tf.externalformat = GL_RED;\n\t\tif (GLAD_OES_texture_half_float)\n\t\t\tf.type = GL_HALF_FLOAT_OES;\n\t\telse\n\t\t\tf.type = GL_HALF_FLOAT;\n\t\tbreak;\n\tcase PIXELFORMAT_RG16_FLOAT:\n\t\tf.internalformat = GL_RG16F;\n\t\tf.externalformat = GL_RG;\n\t\tif (GLAD_OES_texture_half_float)\n\t\t\tf.type = GL_HALF_FLOAT_OES;\n\t\telse\n\t\t\tf.type = GL_HALF_FLOAT;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA16_FLOAT:\n\t\tf.internalformat = GL_RGBA16F;\n\t\tf.externalformat = GL_RGBA;\n\t\tif (GLAD_OES_texture_half_float)\n\t\t\tf.type = GL_HALF_FLOAT_OES;\n\t\telse\n\t\t\tf.type = GL_HALF_FLOAT;\n\t\tbreak;\n\tcase PIXELFORMAT_R32_FLOAT:\n\t\tf.internalformat = GL_R32F;\n\t\tf.externalformat = GL_RED;\n\t\tf.type = GL_FLOAT;\n\t\tbreak;\n\tcase PIXELFORMAT_RG32_FLOAT:\n\t\tf.internalformat = GL_RG32F;\n\t\tf.externalformat = GL_RG;\n\t\tf.type = GL_FLOAT;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA32_FLOAT:\n\t\tf.internalformat = GL_RGBA32F;\n\t\tf.externalformat = GL_RGBA;\n\t\tf.type = GL_FLOAT;\n\t\tbreak;\n\n\tcase PIXELFORMAT_R8_INT:\n\t\tf.internalformat = GL_R8I;\n\t\tf.externalformat = GL_RED_INTEGER;\n\t\tf.type = GL_BYTE;\n\t\tbreak;\n\tcase PIXELFORMAT_R8_UINT:\n\t\tf.internalformat = GL_R8UI;\n\t\tf.externalformat = GL_RED_INTEGER;\n\t\tf.type = GL_UNSIGNED_BYTE;\n\t\tbreak;\n\tcase PIXELFORMAT_RG8_INT:\n\t\tf.internalformat = GL_RG8I;\n\t\tf.externalformat = GL_RG_INTEGER;\n\t\tf.type = GL_BYTE;\n\t\tbreak;\n\tcase PIXELFORMAT_RG8_UINT:\n\t\tf.internalformat = GL_RG8UI;\n\t\tf.externalformat = GL_RG_INTEGER;\n\t\tf.type = GL_UNSIGNED_BYTE;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA8_INT:\n\t\tf.internalformat = GL_RGBA8I;\n\t\tf.externalformat = GL_RGBA_INTEGER;\n\t\tf.type = GL_BYTE;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA8_UINT:\n\t\tf.internalformat = GL_RGBA8UI;\n\t\tf.externalformat = GL_RGBA_INTEGER;\n\t\tf.type = GL_UNSIGNED_BYTE;\n\t\tbreak;\n\tcase PIXELFORMAT_R16_INT:\n\t\tf.internalformat = GL_R16I;\n\t\tf.externalformat = GL_RED_INTEGER;\n\t\tf.type = GL_SHORT;\n\t\tbreak;\n\tcase PIXELFORMAT_R16_UINT:\n\t\tf.internalformat = GL_R16UI;\n\t\tf.externalformat = GL_RED_INTEGER;\n\t\tf.type = GL_UNSIGNED_SHORT;\n\t\tbreak;\n\tcase PIXELFORMAT_RG16_INT:\n\t\tf.internalformat = GL_RG16I;\n\t\tf.externalformat = GL_RG_INTEGER;\n\t\tf.type = GL_SHORT;\n\t\tbreak;\n\tcase PIXELFORMAT_RG16_UINT:\n\t\tf.internalformat = GL_RG16UI;\n\t\tf.externalformat = GL_RG_INTEGER;\n\t\tf.type = GL_UNSIGNED_SHORT;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA16_INT:\n\t\tf.internalformat = GL_RGBA16I;\n\t\tf.externalformat = GL_RGBA_INTEGER;\n\t\tf.type = GL_SHORT;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA16_UINT:\n\t\tf.internalformat = GL_RGBA16UI;\n\t\tf.externalformat = GL_RGBA_INTEGER;\n\t\tf.type = GL_UNSIGNED_SHORT;\n\t\tbreak;\n\tcase PIXELFORMAT_R32_INT:\n\t\tf.internalformat = GL_R32I;\n\t\tf.externalformat = GL_RED_INTEGER;\n\t\tf.type = GL_INT;\n\t\tbreak;\n\tcase PIXELFORMAT_R32_UINT:\n\t\tf.internalformat = GL_R32UI;\n\t\tf.externalformat = GL_RED_INTEGER;\n\t\tf.type = GL_UNSIGNED_INT;\n\t\tbreak;\n\tcase PIXELFORMAT_RG32_INT:\n\t\tf.internalformat = GL_RG32I;\n\t\tf.externalformat = GL_RG_INTEGER;\n\t\tf.type = GL_INT;\n\t\tbreak;\n\tcase PIXELFORMAT_RG32_UINT:\n\t\tf.internalformat = GL_RG32UI;\n\t\tf.externalformat = GL_RG_INTEGER;\n\t\tf.type = GL_UNSIGNED_INT;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA32_INT:\n\t\tf.internalformat = GL_RGBA32I;\n\t\tf.externalformat = GL_RGBA_INTEGER;\n\t\tf.type = GL_INT;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA32_UINT:\n\t\tf.internalformat = GL_RGBA32UI;\n\t\tf.externalformat = GL_RGBA_INTEGER;\n\t\tf.type = GL_UNSIGNED_INT;\n\t\tbreak;\n\n\tcase PIXELFORMAT_LA8_UNORM:\n\t\tif (gl.isCoreProfile() || GLAD_ES_VERSION_3_0)\n\t\t{\n\t\t\tf.internalformat = GL_RG8;\n\t\t\tf.externalformat = GL_RG;\n\t\t\tf.type = GL_UNSIGNED_BYTE;\n\t\t\tf.swizzled = true;\n\t\t\tf.swizzle[0] = f.swizzle[1] = f.swizzle[2] = GL_RED;\n\t\t\tf.swizzle[3] = GL_GREEN;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tf.internalformat = GL_LUMINANCE8_ALPHA8;\n\t\t\tf.externalformat = GL_LUMINANCE_ALPHA;\n\t\t\tf.type = GL_UNSIGNED_BYTE;\n\t\t}\n\t\tbreak;\n\n\tcase PIXELFORMAT_RGBA4_UNORM:\n\t\tf.internalformat = GL_RGBA4;\n\t\tf.externalformat = GL_RGBA;\n\t\tf.type = GL_UNSIGNED_SHORT_4_4_4_4;\n\t\tbreak;\n\tcase PIXELFORMAT_RGB5A1_UNORM:\n\t\tf.internalformat = GL_RGB5_A1;\n\t\tf.externalformat = GL_RGBA;\n\t\tf.type = GL_UNSIGNED_SHORT_5_5_5_1;\n\t\tbreak;\n\tcase PIXELFORMAT_RGB565_UNORM:\n\t\tf.internalformat = GL_RGB565;\n\t\tf.externalformat = GL_RGB;\n\t\tf.type = GL_UNSIGNED_SHORT_5_6_5;\n\t\tbreak;\n\tcase PIXELFORMAT_RGB10A2_UNORM:\n\t\tf.internalformat = GL_RGB10_A2;\n\t\tf.externalformat = GL_RGBA;\n\t\tf.type = GL_UNSIGNED_INT_2_10_10_10_REV;\n\t\tbreak;\n\tcase PIXELFORMAT_RG11B10_FLOAT:\n\t\tf.internalformat = GL_R11F_G11F_B10F;\n\t\tf.externalformat = GL_RGB;\n\t\tf.type = GL_UNSIGNED_INT_10F_11F_11F_REV;\n\t\tbreak;\n\n\tcase PIXELFORMAT_STENCIL8:\n\t\t// Prefer a combined depth/stencil buffer due to driver issues.\n\t\tf.internalformat = GL_DEPTH24_STENCIL8;\n\t\tf.externalformat = GL_DEPTH_STENCIL;\n\t\tf.type = GL_UNSIGNED_INT_24_8;\n\t\tf.framebufferAttachments[0] = GL_DEPTH_STENCIL_ATTACHMENT;\n\t\tbreak;\n\n\tcase PIXELFORMAT_DEPTH16_UNORM:\n\t\tf.internalformat = GL_DEPTH_COMPONENT16;\n\t\tf.externalformat = GL_DEPTH_COMPONENT;\n\t\tf.type = GL_UNSIGNED_SHORT;\n\t\tf.framebufferAttachments[0] = GL_DEPTH_ATTACHMENT;\n\t\tbreak;\n\n\tcase PIXELFORMAT_DEPTH24_UNORM:\n\t\tf.internalformat = GL_DEPTH_COMPONENT24;\n\t\tf.externalformat = GL_DEPTH_COMPONENT;\n\t\tf.type = GL_UNSIGNED_INT;\n\t\tf.framebufferAttachments[0] = GL_DEPTH_ATTACHMENT;\n\t\tbreak;\n\n\tcase PIXELFORMAT_DEPTH32_FLOAT:\n\t\tf.internalformat = GL_DEPTH_COMPONENT32F;\n\t\tf.externalformat = GL_DEPTH_COMPONENT;\n\t\tf.type = GL_FLOAT;\n\t\tf.framebufferAttachments[0] = GL_DEPTH_ATTACHMENT;\n\t\tbreak;\n\n\tcase PIXELFORMAT_DEPTH24_UNORM_STENCIL8:\n\t\tf.internalformat = GL_DEPTH24_STENCIL8;\n\t\tf.externalformat = GL_DEPTH_STENCIL;\n\t\tf.type = GL_UNSIGNED_INT_24_8;\n\t\tf.framebufferAttachments[0] = GL_DEPTH_STENCIL_ATTACHMENT;\n\t\tbreak;\n\n\tcase PIXELFORMAT_DEPTH32_FLOAT_STENCIL8:\n\t\tf.internalformat = GL_DEPTH32F_STENCIL8;\n\t\tf.externalformat = GL_DEPTH_STENCIL;\n\t\tf.type = GL_FLOAT_32_UNSIGNED_INT_24_8_REV;\n\t\tf.framebufferAttachments[0] = GL_DEPTH_STENCIL_ATTACHMENT;\n\t\tbreak;\n\n\tcase PIXELFORMAT_DXT1_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\tbreak;\n\tcase PIXELFORMAT_DXT1_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\n\t\tbreak;\n\tcase PIXELFORMAT_DXT3_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\tbreak;\n\tcase PIXELFORMAT_DXT3_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;\n\t\tbreak;\n\tcase PIXELFORMAT_DXT5_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\t\tbreak;\n\tcase PIXELFORMAT_DXT5_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\n\t\tbreak;\n\tcase PIXELFORMAT_BC4_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RED_RGTC1;\n\t\tbreak;\n\tcase PIXELFORMAT_BC4_SNORM:\n\t\tf.internalformat = GL_COMPRESSED_SIGNED_RED_RGTC1;\n\t\tbreak;\n\tcase PIXELFORMAT_BC5_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RG_RGTC2;\n\t\tbreak;\n\tcase PIXELFORMAT_BC5_SNORM:\n\t\tf.internalformat = GL_COMPRESSED_SIGNED_RG_RGTC2;\n\t\tbreak;\n\tcase PIXELFORMAT_BC6H_UFLOAT:\n\t\tf.internalformat = GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT;\n\t\tbreak;\n\tcase PIXELFORMAT_BC6H_FLOAT:\n\t\tf.internalformat = GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT;\n\t\tbreak;\n\tcase PIXELFORMAT_BC7_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGBA_BPTC_UNORM;\n\t\tbreak;\n\tcase PIXELFORMAT_BC7_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM;\n\t\tbreak;\n\n\tcase PIXELFORMAT_PVR1_RGB2_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGB2_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGB4_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGB4_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGBA2_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGBA2_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGBA4_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGBA4_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT;\n\t\tbreak;\n\n\tcase PIXELFORMAT_ETC1_UNORM:\n\t\tf.internalformat = GL_ETC1_RGB8_OES;\n\t\tbreak;\n\tcase PIXELFORMAT_ETC2_RGB_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGB8_ETC2;\n\t\tbreak;\n\tcase PIXELFORMAT_ETC2_RGB_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB8_ETC2;\n\t\tbreak;\n\tcase PIXELFORMAT_ETC2_RGBA_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGBA8_ETC2_EAC;\n\t\tbreak;\n\tcase PIXELFORMAT_ETC2_RGBA_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;\n\t\tbreak;\n\tcase PIXELFORMAT_ETC2_RGBA1_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;\n\t\tbreak;\n\tcase PIXELFORMAT_ETC2_RGBA1_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2;\n\t\tbreak;\n\tcase PIXELFORMAT_EAC_R_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_R11_EAC;\n\t\tbreak;\n\tcase PIXELFORMAT_EAC_R_SNORM:\n\t\tf.internalformat = GL_COMPRESSED_SIGNED_R11_EAC;\n\t\tbreak;\n\tcase PIXELFORMAT_EAC_RG_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RG11_EAC;\n\t\tbreak;\n\tcase PIXELFORMAT_EAC_RG_SNORM:\n\t\tf.internalformat = GL_COMPRESSED_SIGNED_RG11_EAC;\n\t\tbreak;\n\n\tcase PIXELFORMAT_ASTC_4x4_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_4x4_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_5x4_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGBA_ASTC_5x4_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_5x4_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_5x5_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGBA_ASTC_5x5_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_5x5_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_6x5_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGBA_ASTC_6x5_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_6x5_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_6x6_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGBA_ASTC_6x6_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_6x6_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_8x5_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGBA_ASTC_8x5_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_8x5_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_8x6_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGBA_ASTC_8x6_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_8x6_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_8x8_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGBA_ASTC_8x8_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_8x8_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x5_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGBA_ASTC_10x5_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x5_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x6_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGBA_ASTC_10x6_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x6_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x8_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGBA_ASTC_10x8_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x8_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x10_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGBA_ASTC_10x10_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x10_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_12x10_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGBA_ASTC_12x10_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_12x10_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_12x12_UNORM:\n\t\tf.internalformat = GL_COMPRESSED_RGBA_ASTC_12x12_KHR;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_12x12_sRGB:\n\t\tf.internalformat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR;\n\t\tbreak;\n\n\tdefault:\n\t\tprintf(\"Unhandled pixel format %d when converting to OpenGL enums!\", pixelformat);\n\t\tbreak;\n\t}\n\n\treturn f;\n}\n\nuint32 OpenGL::getPixelFormatUsageFlags(PixelFormat pixelformat)\n{\n\tconst uint32 commonsample = PIXELFORMATUSAGEFLAGS_SAMPLE | PIXELFORMATUSAGEFLAGS_LINEAR;\n\tconst uint32 commonrender = PIXELFORMATUSAGEFLAGS_RENDERTARGET | PIXELFORMATUSAGEFLAGS_BLEND | PIXELFORMATUSAGEFLAGS_MSAA;\n\tconst uint32 computewrite = PIXELFORMATUSAGEFLAGS_COMPUTEWRITE;\n\n\tuint32 flags = PIXELFORMATUSAGEFLAGS_NONE;\n\n\tswitch (pixelformat)\n\t{\n\tcase PIXELFORMAT_R8_UNORM:\n\tcase PIXELFORMAT_RG8_UNORM:\n\t\tflags |= commonsample | commonrender;\n\t\tif (GLAD_VERSION_4_3)\n\t\t\tflags |= computewrite;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA8_UNORM:\n\t\tflags |= commonsample | commonrender;\n\t\tif (GLAD_VERSION_4_3 || GLAD_ES_VERSION_3_1)\n\t\t\tflags |= computewrite;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA8_sRGB:\n\t\tif (gl.bugs.brokenSRGB)\n\t\t\tbreak;\n\t\tflags |= commonsample | commonrender;\n\t\tbreak;\n\tcase PIXELFORMAT_BGRA8_UNORM:\n\tcase PIXELFORMAT_BGRA8_sRGB:\n\t\t// Not supported right now.\n\t\tbreak;\n\tcase PIXELFORMAT_R16_UNORM:\n\tcase PIXELFORMAT_RG16_UNORM:\n\t\tif (GLAD_VERSION_3_0 || (GLAD_EXT_texture_norm16 && GLAD_ES_VERSION_3_0))\n\t\t\tflags |= commonsample | commonrender;\n\t\tif (GLAD_VERSION_4_3)\n\t\t\tflags |= computewrite;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA16_UNORM:\n\t\tif (GLAD_VERSION_1_1 || GLAD_EXT_texture_norm16)\n\t\t\tflags |= commonsample | commonrender;\n\t\tif (GLAD_VERSION_4_3)\n\t\t\tflags |= computewrite;\n\t\tbreak;\n\tcase PIXELFORMAT_R16_FLOAT:\n\tcase PIXELFORMAT_RG16_FLOAT:\n\t\tflags |= commonsample;\n\t\tif (GLAD_VERSION_3_0)\n\t\t\tflags |= commonrender;\n\t\tif ((GLAD_EXT_color_buffer_half_float || GLAD_EXT_color_buffer_float) && GLAD_ES_VERSION_3_0)\n\t\t\tflags |= commonrender;\n\t\tif (GLAD_VERSION_4_3)\n\t\t\tflags |= computewrite;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA16_FLOAT:\n\t\tflags |= commonsample;\n\t\tif (GLAD_VERSION_3_0)\n\t\t\tflags |= commonrender;\n\t\tif (GLAD_EXT_color_buffer_half_float || GLAD_EXT_color_buffer_float)\n\t\t\tflags |= commonrender;\n\t\tif (GLAD_VERSION_4_3 || GLAD_ES_VERSION_3_1)\n\t\t\tflags |= computewrite;\n\t\tbreak;\n\tcase PIXELFORMAT_R32_FLOAT:\n\t\tif (GLAD_ES_VERSION_3_1)\n\t\t\tflags |= computewrite;\n\t\t// Fallthrough.\n\tcase PIXELFORMAT_RG32_FLOAT:\n\t\tflags |= commonsample;\n\t\tif (GLAD_VERSION_3_0)\n\t\t\tflags |= commonrender;\n\t\tif (GLAD_EXT_color_buffer_float)\n\t\t\tflags |= commonrender;\n\t\tif (!(GLAD_VERSION_1_1 || GLAD_OES_texture_float_linear))\n\t\t\tflags &= ~PIXELFORMATUSAGEFLAGS_LINEAR;\n\t\tif (GLAD_VERSION_4_3)\n\t\t\tflags |= computewrite;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA32_FLOAT:\n\t\tflags |= commonsample;\n\t\tif (GLAD_VERSION_3_0)\n\t\t\tflags |= commonrender;\n\t\tif (GLAD_EXT_color_buffer_float)\n\t\t\tflags |= commonrender;\n\t\tif (!(GLAD_VERSION_1_1 || GLAD_OES_texture_float_linear))\n\t\t\tflags &= ~PIXELFORMATUSAGEFLAGS_LINEAR;\n\t\tif (GLAD_VERSION_4_3 || GLAD_ES_VERSION_3_1)\n\t\t\tflags |= computewrite;\n\t\tbreak;\n\n\tcase PIXELFORMAT_R8_INT:\n\tcase PIXELFORMAT_R8_UINT:\n\tcase PIXELFORMAT_RG8_INT:\n\tcase PIXELFORMAT_RG8_UINT:\n\tcase PIXELFORMAT_RGBA8_INT:\n\tcase PIXELFORMAT_RGBA8_UINT:\n\tcase PIXELFORMAT_R16_INT:\n\tcase PIXELFORMAT_R16_UINT:\n\tcase PIXELFORMAT_RG16_INT:\n\tcase PIXELFORMAT_RG16_UINT:\n\tcase PIXELFORMAT_RGBA16_INT:\n\tcase PIXELFORMAT_RGBA16_UINT:\n\tcase PIXELFORMAT_R32_INT:\n\tcase PIXELFORMAT_R32_UINT:\n\tcase PIXELFORMAT_RG32_INT:\n\tcase PIXELFORMAT_RG32_UINT:\n\tcase PIXELFORMAT_RGBA32_INT:\n\tcase PIXELFORMAT_RGBA32_UINT:\n\t\tflags |= PIXELFORMATUSAGEFLAGS_SAMPLE | PIXELFORMATUSAGEFLAGS_RENDERTARGET;\n\t\tif (GLAD_VERSION_4_3)\n\t\t\tflags |= computewrite;\n\t\tif (GLAD_ES_VERSION_3_1)\n\t\t{\n\t\t\tswitch (pixelformat)\n\t\t\t{\n\t\t\tcase PIXELFORMAT_RGBA8_INT:\n\t\t\tcase PIXELFORMAT_RGBA8_UINT:\n\t\t\tcase PIXELFORMAT_RGBA16_INT:\n\t\t\tcase PIXELFORMAT_RGBA16_UINT:\n\t\t\tcase PIXELFORMAT_R32_INT:\n\t\t\tcase PIXELFORMAT_R32_UINT:\n\t\t\tcase PIXELFORMAT_RGBA32_INT:\n\t\t\tcase PIXELFORMAT_RGBA32_UINT:\n\t\t\t\tflags |= computewrite;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase PIXELFORMAT_LA8_UNORM:\n\t\tflags |= commonsample;\n\t\tbreak;\n\n\tcase PIXELFORMAT_RGBA4_UNORM:\n\tcase PIXELFORMAT_RGB5A1_UNORM:\n\t\tflags |= commonsample | commonrender;\n\t\tbreak;\n\tcase PIXELFORMAT_RGB565_UNORM:\n\t\tif (GLAD_ES_VERSION_2_0 || GLAD_VERSION_4_2 || GLAD_ARB_ES2_compatibility)\n\t\t\tflags |= commonsample | commonrender;\n\t\tbreak;\n\tcase PIXELFORMAT_RGB10A2_UNORM:\n\t\tflags |= commonsample | commonrender;\n\t\tif (GLAD_VERSION_4_3)\n\t\t\tflags |= computewrite;\n\t\tbreak;\n\tcase PIXELFORMAT_RG11B10_FLOAT:\n\t\tif (GLAD_ES_VERSION_3_1 || GLAD_VERSION_3_0 || GLAD_EXT_packed_float || GLAD_APPLE_texture_packed_float)\n\t\t\tflags |= commonsample;\n\t\tif (GLAD_VERSION_3_0 || GLAD_EXT_packed_float || GLAD_APPLE_color_buffer_packed_float)\n\t\t\tflags |= commonrender;\n\t\tif (GLAD_EXT_color_buffer_float)\n\t\t\tflags |= commonrender;\n\t\tif (GLAD_VERSION_4_3)\n\t\t\tflags |= computewrite;\n\t\tbreak;\n\n\tcase PIXELFORMAT_STENCIL8:\n\t\tflags |= PIXELFORMATUSAGEFLAGS_RENDERTARGET | PIXELFORMATUSAGEFLAGS_MSAA;\n\t\tbreak;\n\n\tcase PIXELFORMAT_DEPTH16_UNORM:\n\t\tflags |= commonsample | PIXELFORMATUSAGEFLAGS_RENDERTARGET | PIXELFORMATUSAGEFLAGS_MSAA;\n\t\tbreak;\n\n\tcase PIXELFORMAT_DEPTH24_UNORM:\n\t\tflags |= commonsample | PIXELFORMATUSAGEFLAGS_RENDERTARGET | PIXELFORMATUSAGEFLAGS_MSAA;\n\t\tbreak;\n\n\tcase PIXELFORMAT_DEPTH24_UNORM_STENCIL8:\n\t\tflags |= commonsample | PIXELFORMATUSAGEFLAGS_RENDERTARGET | PIXELFORMATUSAGEFLAGS_MSAA;\n\t\tbreak;\n\n\tcase PIXELFORMAT_DEPTH32_FLOAT:\n\tcase PIXELFORMAT_DEPTH32_FLOAT_STENCIL8:\n\t\tflags |= commonsample | PIXELFORMATUSAGEFLAGS_RENDERTARGET | PIXELFORMATUSAGEFLAGS_MSAA;\n\t\tbreak;\n\n\tcase PIXELFORMAT_DXT1_UNORM:\n\tcase PIXELFORMAT_DXT1_sRGB:\n\t\tif (GLAD_EXT_texture_compression_s3tc || GLAD_EXT_texture_compression_dxt1)\n\t\t\tflags |= commonsample;\n\t\tbreak;\n\tcase PIXELFORMAT_DXT3_UNORM:\n\tcase PIXELFORMAT_DXT3_sRGB:\n\t\tif (GLAD_EXT_texture_compression_s3tc || GLAD_ANGLE_texture_compression_dxt3)\n\t\t\tflags |= commonsample;\n\t\tbreak;\n\tcase PIXELFORMAT_DXT5_UNORM:\n\tcase PIXELFORMAT_DXT5_sRGB:\n\t\tif (GLAD_EXT_texture_compression_s3tc || GLAD_ANGLE_texture_compression_dxt5)\n\t\t\tflags |= commonsample;\n\t\tbreak;\n\tcase PIXELFORMAT_BC4_UNORM:\n\tcase PIXELFORMAT_BC4_SNORM:\n\tcase PIXELFORMAT_BC5_UNORM:\n\tcase PIXELFORMAT_BC5_SNORM:\n\t\tif (GLAD_VERSION_3_0 || GLAD_ARB_texture_compression_rgtc || GLAD_EXT_texture_compression_rgtc)\n\t\t\tflags |= commonsample;\n\t\tbreak;\n\tcase PIXELFORMAT_BC6H_UFLOAT:\n\tcase PIXELFORMAT_BC6H_FLOAT:\n\tcase PIXELFORMAT_BC7_UNORM:\n\tcase PIXELFORMAT_BC7_sRGB:\n\t\tif (GLAD_VERSION_4_2 || GLAD_ARB_texture_compression_bptc)\n\t\t\tflags |= commonsample;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGB2_UNORM:\n\tcase PIXELFORMAT_PVR1_RGB4_UNORM:\n\tcase PIXELFORMAT_PVR1_RGBA2_UNORM:\n\tcase PIXELFORMAT_PVR1_RGBA4_UNORM:\n\t\tif (GLAD_IMG_texture_compression_pvrtc)\n\t\t\tflags |= commonsample;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGB2_sRGB:\n\tcase PIXELFORMAT_PVR1_RGB4_sRGB:\n\tcase PIXELFORMAT_PVR1_RGBA2_sRGB:\n\tcase PIXELFORMAT_PVR1_RGBA4_sRGB:\n\t\tif (GLAD_EXT_pvrtc_sRGB)\n\t\t\tflags |= commonsample;\n\t\tbreak;\n\tcase PIXELFORMAT_ETC1_UNORM:\n\t\t// ETC2 support guarantees ETC1 support as well.\n\t\tif (GLAD_ES_VERSION_3_0 || GLAD_VERSION_4_3 || GLAD_ARB_ES3_compatibility)\n\t\t\tflags |= commonsample;\n\t\tbreak;\n\tcase PIXELFORMAT_ETC2_RGB_UNORM:\n\tcase PIXELFORMAT_ETC2_RGB_sRGB:\n\tcase PIXELFORMAT_ETC2_RGBA_UNORM:\n\tcase PIXELFORMAT_ETC2_RGBA_sRGB:\n\tcase PIXELFORMAT_ETC2_RGBA1_UNORM:\n\tcase PIXELFORMAT_ETC2_RGBA1_sRGB:\n\tcase PIXELFORMAT_EAC_R_UNORM:\n\tcase PIXELFORMAT_EAC_R_SNORM:\n\tcase PIXELFORMAT_EAC_RG_UNORM:\n\tcase PIXELFORMAT_EAC_RG_SNORM:\n\t\tif (GLAD_ES_VERSION_3_0 || GLAD_VERSION_4_3 || GLAD_ARB_ES3_compatibility)\n\t\t\tflags |= commonsample;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_4x4_UNORM:\n\tcase PIXELFORMAT_ASTC_5x4_UNORM:\n\tcase PIXELFORMAT_ASTC_5x5_UNORM:\n\tcase PIXELFORMAT_ASTC_6x5_UNORM:\n\tcase PIXELFORMAT_ASTC_6x6_UNORM:\n\tcase PIXELFORMAT_ASTC_8x5_UNORM:\n\tcase PIXELFORMAT_ASTC_8x6_UNORM:\n\tcase PIXELFORMAT_ASTC_8x8_UNORM:\n\tcase PIXELFORMAT_ASTC_10x5_UNORM:\n\tcase PIXELFORMAT_ASTC_10x6_UNORM:\n\tcase PIXELFORMAT_ASTC_10x8_UNORM:\n\tcase PIXELFORMAT_ASTC_10x10_UNORM:\n\tcase PIXELFORMAT_ASTC_12x10_UNORM:\n\tcase PIXELFORMAT_ASTC_12x12_UNORM:\n\tcase PIXELFORMAT_ASTC_4x4_sRGB:\n\tcase PIXELFORMAT_ASTC_5x4_sRGB:\n\tcase PIXELFORMAT_ASTC_5x5_sRGB:\n\tcase PIXELFORMAT_ASTC_6x5_sRGB:\n\tcase PIXELFORMAT_ASTC_6x6_sRGB:\n\tcase PIXELFORMAT_ASTC_8x5_sRGB:\n\tcase PIXELFORMAT_ASTC_8x6_sRGB:\n\tcase PIXELFORMAT_ASTC_8x8_sRGB:\n\tcase PIXELFORMAT_ASTC_10x5_sRGB:\n\tcase PIXELFORMAT_ASTC_10x6_sRGB:\n\tcase PIXELFORMAT_ASTC_10x8_sRGB:\n\tcase PIXELFORMAT_ASTC_10x10_sRGB:\n\tcase PIXELFORMAT_ASTC_12x10_sRGB:\n\tcase PIXELFORMAT_ASTC_12x12_sRGB:\n\t\tif (GLAD_ES_VERSION_3_2 || GLAD_KHR_texture_compression_astc_ldr)\n\t\t\tflags |= commonsample;\n\t\tbreak;\n\n\tcase PIXELFORMAT_UNKNOWN:\n\tcase PIXELFORMAT_NORMAL:\n\tcase PIXELFORMAT_HDR:\n\tcase PIXELFORMAT_MAX_ENUM:\n\t\tbreak;\n\t}\n\n\treturn flags;\n}\n\nconst char *OpenGL::errorString(GLenum errorcode)\n{\n\tswitch (errorcode)\n\t{\n\tcase GL_NO_ERROR:\n\t\treturn \"no error\";\n\tcase GL_INVALID_ENUM:\n\t\treturn \"invalid enum\";\n\tcase GL_INVALID_VALUE:\n\t\treturn \"invalid value\";\n\tcase GL_INVALID_OPERATION:\n\t\treturn \"invalid operation\";\n\tcase GL_OUT_OF_MEMORY:\n\t\treturn \"out of memory\";\n\tcase GL_INVALID_FRAMEBUFFER_OPERATION:\n\t\treturn \"invalid framebuffer operation\";\n\tcase GL_CONTEXT_LOST:\n\t\treturn \"OpenGL context has been lost\";\n\tdefault:\n\t\tbreak;\n\t}\n\n\tstatic char text[64] = {};\n\n\tsnprintf(text, sizeof(text), \"0x%x\", errorcode);\n\n\treturn text;\n}\n\nconst char *OpenGL::framebufferStatusString(GLenum status)\n{\n\tswitch (status)\n\t{\n\tcase GL_FRAMEBUFFER_COMPLETE:\n\t\treturn \"complete (success)\";\n\tcase GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:\n\t\treturn \"Texture format cannot be rendered to on this system.\";\n\tcase GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:\n\t\treturn \"Error in graphics driver (missing render texture attachment)\";\n\tcase GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER:\n\t\treturn \"Error in graphics driver (incomplete draw buffer)\";\n\tcase GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER:\n\t\treturn \"Error in graphics driver (incomplete read buffer)\";\n\tcase GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:\n\t\treturn \"Texture with the specified MSAA count cannot be rendered to on this system.\";\n\tcase GL_FRAMEBUFFER_UNSUPPORTED:\n\t\treturn \"Renderable textures are unsupported\";\n\tdefault:\n\t\tbreak;\n\t}\n\n\tstatic char text[64] = {};\n\n\tsnprintf(text, sizeof(text), \"0x%x\", status);\n\n\treturn text;\n}\n\nconst char *OpenGL::debugSeverityString(GLenum severity)\n{\n\tswitch (severity)\n\t{\n\tcase GL_DEBUG_SEVERITY_HIGH:\n\t\treturn \"high\";\n\tcase GL_DEBUG_SEVERITY_MEDIUM:\n\t\treturn \"medium\";\n\tcase GL_DEBUG_SEVERITY_LOW:\n\t\treturn \"low\";\n\tcase GL_DEBUG_SEVERITY_NOTIFICATION:\n\t\treturn \"notification\";\n\tdefault:\n\t\treturn \"unknown\";\n\t}\n}\n\nconst char *OpenGL::debugSourceString(GLenum source)\n{\n\tswitch (source)\n\t{\n\tcase GL_DEBUG_SOURCE_API:\n\t\treturn \"API\";\n\tcase GL_DEBUG_SOURCE_WINDOW_SYSTEM:\n\t\treturn \"window\";\n\tcase GL_DEBUG_SOURCE_SHADER_COMPILER:\n\t\treturn \"shader\";\n\tcase GL_DEBUG_SOURCE_THIRD_PARTY:\n\t\treturn \"external\";\n\tcase GL_DEBUG_SOURCE_APPLICATION:\n\t\treturn \"LOVE\";\n\tcase GL_DEBUG_SOURCE_OTHER:\n\t\treturn \"other\";\n\tdefault:\n\t\treturn \"unknown\";\n\t}\n}\n\nconst char *OpenGL::debugTypeString(GLenum type)\n{\n\tswitch (type)\n\t{\n\tcase GL_DEBUG_TYPE_ERROR:\n\t\treturn \"error\";\n\tcase GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:\n\t\treturn \"deprecated behavior\";\n\tcase GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:\n\t\treturn \"undefined behavior\";\n\tcase GL_DEBUG_TYPE_PERFORMANCE:\n\t\treturn \"performance\";\n\tcase GL_DEBUG_TYPE_PORTABILITY:\n\t\treturn \"portability\";\n\tcase GL_DEBUG_TYPE_OTHER:\n\t\treturn \"other\";\n\tdefault:\n\t\treturn \"unknown\";\n\t}\n}\n\n\n// OpenGL class instance singleton.\nOpenGL gl;\n\n} // opengl\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/opengl/OpenGL.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_GRAPHICS_OPENGL_OPENGL_H\n#define LOVE_GRAPHICS_OPENGL_OPENGL_H\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/int.h\"\n#include \"common/math.h\"\n#include \"common/Color.h\"\n#include \"graphics/Texture.h\"\n#include \"graphics/vertex.h\"\n#include \"graphics/renderstate.h\"\n#include \"common/Matrix.h\"\n\n// GLAD\n#include \"libraries/glad/gladfuncs.hpp\"\n\n// C++\n#include <vector>\n#include <stack>\n\n// The last argument to AttribPointer takes a buffer offset casted to a pointer.\n#define BUFFER_OFFSET(i) ((char *) NULL + (i))\n\nnamespace love\n{\nnamespace graphics\n{\n\nclass Resource;\nclass Buffer;\n\nnamespace opengl\n{\n\n// Awful, but the library uses the namespace in order to use the functions sanely\n// with proper autocomplete in IDEs while having name mangling safety -\n// no clashes with other GL libraries when linking, etc.\nusing namespace glad;\n\n/**\n * Thin layer between OpenGL and the rest of the program.\n * Internally shadows some OpenGL context state for improved efficiency and\n * accuracy (compared to glGet etc.)\n * A class is more convenient and readable than plain namespaced functions, but\n * typically only one OpenGL object should be used (singleton.)\n **/\nclass OpenGL\n{\npublic:\n\n\t// OpenGL GPU vendors.\n\tenum Vendor\n\t{\n\t\tVENDOR_AMD,\n\t\tVENDOR_NVIDIA,\n\t\tVENDOR_INTEL,\n\t\tVENDOR_MESA_SOFT, // Software renderer.\n\t\tVENDOR_APPLE,     // Software renderer on desktops.\n\t\tVENDOR_MICROSOFT, // Software renderer.\n\t\tVENDOR_IMGTEC,\n\t\tVENDOR_ARM,\n\t\tVENDOR_QUALCOMM,\n\t\tVENDOR_BROADCOM,\n\t\tVENDOR_VIVANTE,\n\t\tVENDOR_UNKNOWN\n\t};\n\n\tenum FramebufferTarget\n\t{\n\t\tFRAMEBUFFER_READ = (1 << 0),\n\t\tFRAMEBUFFER_DRAW = (1 << 1),\n\t\tFRAMEBUFFER_ALL  = (FRAMEBUFFER_READ | FRAMEBUFFER_DRAW),\n\t};\n\n\tenum EnableState\n\t{\n\t\tENABLE_BLEND,\n\t\tENABLE_DEPTH_TEST,\n\t\tENABLE_STENCIL_TEST,\n\t\tENABLE_SCISSOR_TEST,\n\t\tENABLE_FACE_CULL,\n\t\tENABLE_FRAMEBUFFER_SRGB,\n\t\tENABLE_MAX_ENUM\n\t};\n\n\tstruct TextureFormat\n\t{\n\t\tGLenum internalformat = 0;\n\t\tGLenum externalformat = 0;\n\t\tGLenum type = 0;\n\n\t\t// For depth/stencil formats.\n\t\tGLenum framebufferAttachments[2];\n\n\t\tbool swizzled = false;\n\t\tGLint swizzle[4];\n\t};\n\n\tclass TempDebugGroup\n\t{\n\tpublic:\n\n\t\tTempDebugGroup(const char *name);\n\t\t~TempDebugGroup();\n\t};\n\n\t// glClear() is affected by various OpenGL state...\n\tclass CleanClearState\n\t{\n\tpublic:\n\t\tCleanClearState(GLbitfield clearFlags);\n\t\t~CleanClearState();\n\n\tprivate:\n\t\tGLenum clearFlags;\n\t\tuint32 colorWriteMask;\n\t\tuint32 stencilWriteMask;\n\t\tbool depthWrites;\n\t\tbool scissor;\n\t};\n\n\tstruct Stats\n\t{\n\t\tint shaderSwitches;\n\t} stats;\n\n\tstruct Bugs\n\t{\n\t\t/**\n\t\t * On AMD's Windows (and probably Linux) drivers,\n\t\t * glBindFramebuffer + glClear + glBindFramebuffer + draw(fbo_tex) won't\n\t\t * work unless there's some kind of draw or state change which causes\n\t\t * the driver to update the texture's contents (just drawing the texture\n\t\t * won't always do it, with this driver bug).\n\t\t * Activating shader program 0 and then activating the actual program\n\t\t * seems to always 'fix' it for me.\n\t\t * Bug observed January 2016 with multiple AMD GPUs and driver versions.\n\t\t * https://love2d.org/forums/viewtopic.php?f=4&t=81496\n\t\t **/\n\t\tbool clearRequiresDriverTextureStateUpdate;\n\n\t\t/**\n\t\t * AMD's Windows drivers don't always properly generate mipmaps unless\n\t\t * glEnable(GL_TEXTURE_2D) is called directly before glGenerateMipmap.\n\t\t * This only applies to legacy and Compatibility Profile contexts, of\n\t\t * course.\n\t\t * https://www.opengl.org/wiki/Common_Mistakes#Automatic_mipmap_generation\n\t\t **/\n\t\tbool generateMipmapsRequiresTexture2DEnable;\n\n\t\t/**\n\t\t * Report: Intel HD 4000 on Windows hangs during glClientWaitSync.\n\t\t * I found this when googling the issue:\n\t\t * https://github.com/mjn33/planetgen/commit/235e23873a22e219fffdd9ede706c1051aa0f107\n\t\t **/\n\t\tbool clientWaitSyncStalls;\n\n\t\t/**\n\t\t * glTexStorage on some older AMD/ATI graphics drivers on Windows seems\n\t\t * to break subsequent sub-rectangle glTexSubImage calls after an\n\t\t * initial full-size one (determined after some investigation with an\n\t\t * affected user on Discord.)\n\t\t * https://bitbucket.org/rude/love/issues/1436/bug-with-lovegraphicsprint-on-older-ati\n\t\t * https://github.com/love2d/love/issues/1563\n\t\t **/\n\t\tbool texStorageBreaksSubImage;\n\n\t\t/**\n\t\t * An Android device with an Adreno 630 (supposedly GLES3.2-capable)\n\t\t * fails with GL_INVALID_OPERATION in glTexImage2D if the image is\n\t\t * GL_R8, despite the GLES 3.0 spec mandating support for that format.\n\t\t * It's possible more Adreno GPUs / drivers are affected as well.\n\t\t **/\n\t\tbool brokenR8PixelFormat;\n\n\t\t/**\n\t\t * Intel HD Graphics drivers on Windows prior to the HD 2500/4000 have\n\t\t * completely broken sRGB support.\n\t\t * https://github.com/love2d/love/issues/1592\n\t\t **/\n\t\tbool brokenSRGB;\n\n\t\t/**\n\t\t * Other bugs which have workarounds that don't use conditional code at\n\t\t * the moment:\n\t\t *\n\t\t * Kepler nvidia GPUs in at least OS X 10.10 and 10.11 fail to render\n\t\t * geometry with glDrawElements if index data comes from a Buffer Object\n\t\t * and vertex data doesn't. One workaround is to use a CPU-side index\n\t\t * array when there's also a CPU-side vertex array.\n\t\t * https://love2d.org/forums/viewtopic.php?f=4&t=81401&start=10\n\t\t *\n\t\t * Some android drivers don't seem to initialize the sampler index\n\t\t * values of sampler uniforms in shaders to 0 (which is required by the\n\t\t * GLSL ES specification) when linking the shader program. One\n\t\t * workaround is to always set the values of said sampler uniforms to 0\n\t\t * just after linking the shader program.\n\t\t * https://love2d.org/forums/viewtopic.php?f=4&t=81458\n\t\t **/\n\t} bugs;\n\n\tOpenGL();\n\n\t/**\n\t * Initializes the active OpenGL context.\n\t **/\n\tbool initContext();\n\n\t/**\n\t * Sets up some required context state based on current and default OpenGL\n\t * state. Call this directly after initializing an OpenGL context!\n\t **/\n\tvoid setupContext();\n\n\t/**\n\t * Marks current context state as invalid and deletes OpenGL objects owned\n\t * by this class instance. Call this directly before potentially deleting\n\t * an OpenGL context!\n\t **/\n\tvoid deInitContext();\n\n\t/**\n\t * Set up necessary state (LOVE-provided shader uniforms, etc.) for drawing.\n\t * This *MUST* be called directly before OpenGL drawing functions.\n\t **/\n\tvoid prepareDraw(love::graphics::Graphics *gfx);\n\n\t/**\n\t * State-tracked glBindBuffer.\n\t * NOTE: This does not account for multiple VAOs being used! Index buffer\n\t * bindings are per-VAO in OpenGL, but this doesn't know about that.\n\t **/\n\tvoid bindBuffer(BufferUsage type, GLuint buffer);\n\n\t/**\n\t * glDeleteBuffers which updates our shadowed state.\n\t **/\n\tvoid deleteBuffer(GLuint buffer);\n\n\t/**\n\t * Set all vertex attribute state.\n\t **/\n\tvoid setVertexAttributes(const VertexAttributes &attributes, const BufferBindings &buffers);\n\n\t/**\n\t * Wrapper for glCullFace which eliminates redundant state setting.\n\t **/\n\tvoid setCullMode(CullMode mode);\n\n\t/**\n\t * Wrapper for glClearDepth and glClearDepthf.\n\t **/\n\tvoid clearDepth(double value);\n\n\t/**\n\t * Sets the OpenGL rendering viewport to the specified rectangle.\n\t * The y-coordinate starts at the top.\n\t **/\n\tvoid setViewport(const Rect &v);\n\tRect getViewport() const;\n\n\t/**\n\t * Sets the scissor box to the specified rectangle.\n\t * The y-coordinate starts at the top and is flipped internally.\n\t **/\n\tvoid setScissor(const Rect &v, bool rtActive);\n\n\t/**\n\t * State-tracked version of glEnable.\n\t **/\n\tvoid setEnableState(EnableState state, bool enable);\n\tbool isStateEnabled(EnableState state) const;\n\n\t/**\n\t * Binds a Framebuffer Object to the specified target.\n\t **/\n\tvoid bindFramebuffer(FramebufferTarget target, GLuint framebuffer);\n\tGLuint getFramebuffer(FramebufferTarget target) const;\n\tvoid deleteFramebuffer(GLuint framebuffer);\n\n\tvoid framebufferTexture(GLenum attachment, TextureType texType, GLuint texture, int level, int layer = 0, int face = 0);\n\n\t/**\n\t * Calls glDepthMask.\n\t **/\n\tvoid setDepthWrites(bool enable);\n\tbool hasDepthWrites() const;\n\n\tvoid setStencilWriteMask(uint32 mask);\n\tuint32 getStencilWriteMask() const;\n\n\tvoid setColorWriteMask(uint32 mask);\n\tuint32 getColorWriteMask() const;\n\n\t/**\n\t * Calls glUseProgram.\n\t **/\n\tvoid useProgram(GLuint program);\n\n\t/**\n\t * This will usually be 0 (system drawable), but some platforms require a\n\t * non-zero FBO for rendering.\n\t **/\n\tGLuint getDefaultFBO() const;\n\n\t/**\n\t * Helper for setting the active texture unit.\n\t *\n\t * @param textureunit Index in the range of [0, maxtextureunits-1]\n\t **/\n\tvoid setTextureUnit(int textureunit);\n\n\t/**\n\t * Helper for binding a texture to a specific texture unit.\n\t *\n\t * @param textureunit Index in the range of [0, maxtextureunits-1]\n\t * @param restoreprev Restore previously bound texture unit when done.\n\t * @param bindforedit If false, the active texture unit may be left alone.\n\t **/\n\tvoid bindTextureToUnit(TextureType target, GLuint texture, int textureunit, bool restoreprev, bool bindforedit = true);\n\tvoid bindTextureToUnit(Texture *texture, int textureunit, bool restoreprev, bool bindforedit = true);\n\n\tvoid bindBufferTextureToUnit(GLuint texture, int textureunit, bool restoreprev, bool bindforedit);\n\n\tvoid bindIndexedBuffer(GLuint buffer, BufferUsage type, int index);\n\n\t/**\n\t * Helper for deleting an OpenGL texture.\n\t * Cleans up if the texture is currently bound.\n\t **/\n\tvoid deleteTexture(GLuint texture);\n\n\t/**\n\t * Sets sampler state parameters for the currently bound texture.\n\t **/\n\tvoid setSamplerState(TextureType target, SamplerState &s);\n\n\t/**\n\t * Equivalent to glTexStorage2D/3D on platforms that support it. Equivalent\n\t * to glTexImage2D/3D for all levels and slices of a texture otherwise.\n\t **/\n\tbool rawTexStorage(TextureType target, int levels, PixelFormat pixelformat, int width, int height, int depth = 1);\n\n\tbool isBufferUsageSupported(BufferUsage usage) const;\n\tbool isClampZeroOneTextureWrapSupported() const;\n\tbool isSamplerLODBiasSupported() const;\n\tbool isBaseVertexSupported() const;\n\tbool isCopyTextureToBufferSupported() const;\n\n\t/**\n\t * Returns the maximum supported width or height of a texture.\n\t **/\n\tint getMax2DTextureSize() const;\n\tint getMax3DTextureSize() const;\n\tint getMaxCubeTextureSize() const;\n\tint getMaxTextureLayers() const;\n\n\t/**\n\t * Returns the maximum number of values in a texel buffer.\n\t **/\n\tint getMaxTexelBufferSize() const;\n\n\t/**\n\t * Returns the maximum number of bytes in a shader storage buffer.\n\t **/\n\tint getMaxShaderStorageBufferSize() const;\n\n\t/**\n\t * Returns the maximum number of compute work groups that can be\n\t * dispatched in a given dimension.\n\t */\n\tint getMaxComputeWorkGroupsX() const;\n\tint getMaxComputeWorkGroupsY() const;\n\tint getMaxComputeWorkGroupsZ() const;\n\n\t/**\n\t * Returns the maximum supported number of simultaneous render targets.\n\t **/\n\tint getMaxRenderTargets() const;\n\n\t/**\n\t * Returns the maximum supported number of MSAA sampless.\n\t **/\n\tint getMaxSamples() const;\n\n\t/**\n\t * Returns the maximum number of accessible texture units.\n\t **/\n\tint getMaxTextureUnits() const;\n\n\t/**\n\t * Returns the maximum number of shader storage buffer bindings.\n\t **/\n\tint getMaxShaderStorageBufferBindings() const;\n\n\t/**\n\t * Returns the maximum point size.\n\t **/\n\tfloat getMaxPointSize() const;\n\n\t/**\n\t * Returns the maximum anisotropic filtering value that can be used for\n\t * Texture filtering.\n\t **/\n\tfloat getMaxAnisotropy() const;\n\n\tfloat getMaxLODBias() const;\n\n\t/**\n\t * Gets whether the context is Core Profile OpenGL 3.2+.\n\t **/\n\tbool isCoreProfile() const;\n\n\t/**\n\t * Get the GPU vendor of this OpenGL context.\n\t **/\n\tVendor getVendor() const;\n\n\tstatic GLenum getGLPrimitiveType(PrimitiveType type);\n\tstatic GLenum getGLBufferType(BufferUsage usage);\n\tstatic GLenum getGLIndexDataType(IndexDataType type);\n\tstatic GLenum getGLVertexDataType(DataFormat format, int &components, GLboolean &normalized, bool &intformat);\n\tstatic GLenum getGLBufferDataUsage(BufferDataUsage usage);\n\tstatic GLenum getGLTextureType(TextureType type);\n\tstatic GLint getGLWrapMode(SamplerState::WrapMode wmode);\n\tstatic GLint getGLCompareMode(CompareMode mode);\n\n\tstatic TextureFormat convertPixelFormat(PixelFormat pixelformat);\n\tstatic bool isTexStorageSupported();\n\tstatic uint32 getPixelFormatUsageFlags(PixelFormat pixelformat);\n\n\tstatic const char *errorString(GLenum errorcode);\n\tstatic const char *framebufferStatusString(GLenum status);\n\n\t// Get human-readable strings for debug info.\n\tstatic const char *debugSeverityString(GLenum severity);\n\tstatic const char *debugSourceString(GLenum source);\n\tstatic const char *debugTypeString(GLenum type);\n\nprivate:\n\n\tvoid initVendor();\n\tvoid initOpenGLFunctions();\n\tvoid initMaxValues();\n\n\tbool contextInitialized;\n\n\tbool baseVertexSupported;\n\n\tfloat maxAnisotropy;\n\tfloat maxLODBias;\n\tint max2DTextureSize;\n\tint max3DTextureSize;\n\tint maxCubeTextureSize;\n\tint maxTextureArrayLayers;\n\tint maxTexelBufferSize;\n\tint maxShaderStorageBufferSize;\n\tint maxComputeWorkGroupsX;\n\tint maxComputeWorkGroupsY;\n\tint maxComputeWorkGroupsZ;\n\tint maxRenderTargets;\n\tint maxSamples;\n\tint maxTextureUnits;\n\tint maxShaderStorageBufferBindings;\n\tfloat maxPointSize;\n\n\tbool coreProfile;\n\n\tVendor vendor;\n\n\t// Tracked OpenGL state.\n\tstruct\n\t{\n\t\tGLuint boundBuffers[BUFFERUSAGE_MAX_ENUM];\n\n\t\t// Texture unit state (currently bound texture for each texture unit.)\n\t\tstd::vector<GLuint> boundTextures[TEXTURE_MAX_ENUM + 1];\n\n\t\tstd::vector<GLuint> boundIndexedBuffers[BUFFERUSAGE_MAX_ENUM];\n\n\t\tbool enableState[ENABLE_MAX_ENUM];\n\n\t\tGLenum faceCullMode;\n\n\t\tint curTextureUnit;\n\n\t\tuint32 enabledAttribArrays;\n\t\tuint32 instancedAttribArrays;\n\n\t\tRect viewport;\n\t\tRect scissor;\n\n\t\tbool depthWritesEnabled = true;\n\t\tuint32 stencilWriteMask = LOVE_UINT32_MAX;\n\t\tuint32 colorWriteMask = LOVE_UINT32_MAX;\n\n\t\tGLuint boundFramebuffers[2];\n\n\t} state;\n\n}; // OpenGL\n\n// OpenGL class instance singleton.\nextern OpenGL gl;\n\n} // opengl\n} // graphics\n} // love\n\n#endif // LOVE_GRAPHICS_OPENGL_OPENGL_H\n"
  },
  {
    "path": "src/modules/graphics/opengl/Shader.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"common/config.h\"\n\n#include \"Shader.h\"\n#include \"ShaderStage.h\"\n#include \"Graphics.h\"\n#include \"graphics/vertex.h\"\n\n// C++\n#include <algorithm>\n#include <limits>\n#include <sstream>\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace opengl\n{\n\nShader::Shader(StrongRef<love::graphics::ShaderStage> stages[SHADERSTAGE_MAX_ENUM], const CompileOptions &options)\n\t: love::graphics::Shader(stages, options)\n\t, program(0)\n\t, builtinUniforms()\n\t, builtinUniformInfo()\n{\n\t// load shader source and create program object\n\tloadVolatile();\n}\n\nShader::~Shader()\n{\n\tunloadVolatile();\n\n\tfor (const auto &p : reflection.allUniforms)\n\t{\n\t\t// Allocated with malloc().\n\t\tif (p.second->data != nullptr)\n\t\t\tfree(p.second->data);\n\t}\n}\n\nvoid Shader::mapActiveUniforms()\n{\n\t// Built-in uniform locations default to -1 (nonexistent.)\n\tfor (int i = 0; i < int(BUILTIN_MAX_ENUM); i++)\n\t{\n\t\tbuiltinUniforms[i] = -1;\n\t\tbuiltinUniformInfo[i] = nullptr;\n\t}\n\n\t// Make sure all stored resources have their Volatiles loaded before\n\t// the sendTextures/sendBuffers calls below, since they call getHandle().\n\tfor (love::graphics::Texture *tex : activeTextures)\n\t{\n\t\tif (tex == nullptr)\n\t\t\tcontinue;\n\t\tVolatile *v = dynamic_cast<Volatile *>(tex);\n\t\tif (v != nullptr)\n\t\t\tv->loadVolatile();\n\t}\n\n\tfor (love::graphics::Buffer *buffer : activeBuffers)\n\t{\n\t\tif (buffer == nullptr)\n\t\t\tcontinue;\n\t\tVolatile *v = dynamic_cast<Volatile *>(buffer);\n\t\tif (v != nullptr)\n\t\t\tv->loadVolatile();\n\t}\n\n\tGLint activeprogram = 0;\n\tglGetIntegerv(GL_CURRENT_PROGRAM, &activeprogram);\n\n\tgl.useProgram(program);\n\n\tGLint numuniforms;\n\tglGetProgramiv(program, GL_ACTIVE_UNIFORMS, &numuniforms);\n\n\tGLchar cname[256];\n\tconst GLint bufsize = (GLint) (sizeof(cname) / sizeof(GLchar));\n\n\tfor (int uindex = 0; uindex < numuniforms; uindex++)\n\t{\n\t\tGLsizei namelen = 0;\n\t\tGLenum gltype = 0;\n\t\tint count = 0;\n\n\t\tglGetActiveUniform(program, (GLuint) uindex, bufsize, &namelen, &count, &gltype, cname);\n\n\t\tstd::string name(cname, (size_t) namelen);\n\t\tint location = glGetUniformLocation(program, name.c_str());\n\n\t\tif (location == -1)\n\t\t\tcontinue;\n\n\t\tname = canonicaliizeUniformName(name);\n\n\t\tconst auto &uniformit = reflection.allUniforms.find(name);\n\t\tif (uniformit == reflection.allUniforms.end())\n\t\t{\n\t\t\thandleUnknownUniformName(name.c_str());\n\t\t\tcontinue;\n\t\t}\n\n\t\tUniformInfo &u = *uniformit->second;\n\n\t\tu.active = true;\n\t\tu.location = location;\n\n\t\t// If this is a built-in (LOVE-created) uniform, store the location.\n\t\tBuiltinUniform builtin = BUILTIN_MAX_ENUM;\n\t\tif (getConstant(u.name.c_str(), builtin))\n\t\t\tbuiltinUniforms[int(builtin)] = u.location;\n\n\t\tif ((u.baseType == UNIFORM_SAMPLER && builtin != BUILTIN_TEXTURE_MAIN) || u.baseType == UNIFORM_TEXELBUFFER)\n\t\t{\n\t\t\tTextureUnit unit;\n\t\t\tunit.type = u.textureType;\n\t\t\tunit.active = true;\n\t\t\tunit.texture = 0; // Handled below.\n\t\t\tunit.isTexelBuffer = u.baseType == UNIFORM_TEXELBUFFER;\n\n\t\t\tfor (int i = 0; i < u.count; i++)\n\t\t\t\ttextureUnits.push_back(unit);\n\t\t}\n\t\telse if (u.baseType == UNIFORM_STORAGETEXTURE)\n\t\t{\n\t\t\tStorageTextureBinding binding = {};\n\t\t\tbinding.gltexture = 0; // Handled below.\n\t\t\tbinding.type = u.textureType;\n\n\t\t\tif ((u.access & (ACCESS_READ | ACCESS_WRITE)) != 0)\n\t\t\t\tbinding.access = GL_READ_WRITE;\n\t\t\telse if ((u.access & ACCESS_WRITE) != 0)\n\t\t\t\tbinding.access = GL_WRITE_ONLY;\n\t\t\telse if ((u.access & ACCESS_READ) != 0)\n\t\t\t\tbinding.access = GL_READ_ONLY;\n\n\t\t\tauto fmt = OpenGL::convertPixelFormat(u.storageTextureFormat);\n\t\t\tbinding.internalFormat = fmt.internalformat;\n\n\t\t\tfor (int i = 0; i < u.count; i++)\n\t\t\t\tstorageTextureBindings.push_back(binding);\n\t\t}\n\n\t\tif (u.dataSize == 0)\n\t\t{\n\t\t\tif (u.baseType == UNIFORM_MATRIX)\n\t\t\t\tu.dataSize = sizeof(uint32) * u.matrix.rows * u.matrix.columns * u.count;\n\t\t\telse\n\t\t\t\tu.dataSize = sizeof(uint32) * u.components * u.count;\n\n\t\t\tu.data = malloc(u.dataSize);\n\t\t\tmemset(u.data, 0, u.dataSize);\n\n\t\t\tconst auto &valuesit = reflection.localUniformInitializerValues.find(u.name);\n\t\t\tif (valuesit != reflection.localUniformInitializerValues.end())\n\t\t\t{\n\t\t\t\tconst auto &values = valuesit->second;\n\t\t\t\tif (!values.empty())\n\t\t\t\t\tmemcpy(u.data, values.data(), std::min(u.dataSize, sizeof(LocalUniformValue) * values.size()));\n\t\t\t}\n\t\t}\n\n\t\tif (u.baseType == UNIFORM_SAMPLER || u.baseType == UNIFORM_TEXELBUFFER)\n\t\t{\n\t\t\tint startunit = (int) textureUnits.size() - u.count;\n\n\t\t\tif (builtin == BUILTIN_TEXTURE_MAIN)\n\t\t\t\tstartunit = 0;\n\n\t\t\tfor (int i = 0; i < u.count; i++)\n\t\t\t\tu.ints[i] = startunit + i;\n\t\t}\n\t\telse if (u.baseType == UNIFORM_STORAGETEXTURE)\n\t\t{\n\t\t\tint startbinding = (int) storageTextureBindings.size() - u.count;\n\t\t\tfor (int i = 0; i < u.count; i++)\n\t\t\t\tu.ints[i] = startbinding + i;\n\t\t}\n\n\t\tupdateUniform(&u, u.count, true);\n\n\t\tif (builtin != BUILTIN_MAX_ENUM)\n\t\t\tbuiltinUniformInfo[(int)builtin] = &u;\n\n\t\tif (u.baseType == UNIFORM_SAMPLER || u.baseType == UNIFORM_STORAGETEXTURE)\n\t\t\tsendTextures(&u, &activeTextures[u.resourceIndex], u.count, true);\n\t\telse if (u.baseType == UNIFORM_TEXELBUFFER)\n\t\t\tsendBuffers(&u, &activeBuffers[u.resourceIndex], u.count, true);\n\t}\n\n\tif (gl.isBufferUsageSupported(BUFFERUSAGE_SHADER_STORAGE))\n\t{\n\t\tGLint numstoragebuffers = 0;\n\t\tglGetProgramInterfaceiv(program, GL_SHADER_STORAGE_BLOCK, GL_ACTIVE_RESOURCES, &numstoragebuffers);\n\n\t\tchar namebuffer[2048] = { '\\0' };\n\t\tint nextstoragebufferbinding = 0;\n\n\t\tfor (int sindex = 0; sindex < numstoragebuffers; sindex++)\n\t\t{\n\t\t\tGLsizei namelength = 0;\n\t\t\tglGetProgramResourceName(program, GL_SHADER_STORAGE_BLOCK, sindex, 2048, &namelength, namebuffer);\n\n\t\t\tstd::string name = canonicaliizeUniformName(std::string(namebuffer, namelength));\n\n\t\t\tconst auto &uniformit = reflection.storageBuffers.find(name);\n\t\t\tif (uniformit == reflection.storageBuffers.end())\n\t\t\t{\n\t\t\t\thandleUnknownUniformName(name.c_str());\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tUniformInfo &u = uniformit->second;\n\n\t\t\tu.active = true;\n\n\t\t\tif (u.dataSize == 0)\n\t\t\t{\n\t\t\t\tu.dataSize = sizeof(int) * u.count;\n\t\t\t\tu.data = malloc(u.dataSize);\n\t\t\t\tfor (int i = 0; i < u.count; i++)\n\t\t\t\t\tu.ints[i] = -1;\n\t\t\t}\n\n\t\t\t// Unlike local uniforms and attributes, OpenGL doesn't auto-assign storage\n\t\t\t// block bindings if they're unspecified in the shader. So we overwrite them\n\t\t\t// regardless, here.\n\t\t\tu.ints[0] = nextstoragebufferbinding++;\n\t\t\tglShaderStorageBlockBinding(program, sindex, u.ints[0]);\n\n\t\t\tBufferBinding binding;\n\t\t\tbinding.bindingindex = u.ints[0];\n\t\t\tbinding.buffer = 0;\n\n\t\t\tif (binding.bindingindex >= 0)\n\t\t\t{\n\t\t\t\tint activeindex = (int)activeStorageBufferBindings.size();\n\t\t\t\tactiveStorageBufferBindings.push_back(binding);\n\n\t\t\t\tauto p = std::make_pair(activeindex, -1);\n\n\t\t\t\tif (u.access & ACCESS_WRITE)\n\t\t\t\t{\n\t\t\t\t\tp.second = (int)activeWritableStorageBuffers.size();\n\t\t\t\t\tactiveWritableStorageBuffers.push_back(activeBuffers[u.resourceIndex]);\n\t\t\t\t}\n\n\t\t\t\tstorageBufferBindingIndexToActiveBinding[binding.bindingindex] = p;\n\t\t\t}\n\n\t\t\tsendBuffers(&u, &activeBuffers[u.resourceIndex], u.count, true);\n\t\t}\n\t}\n\n\tgl.useProgram(activeprogram);\n}\n\nbool Shader::loadVolatile()\n{\n\tOpenGL::TempDebugGroup debuggroup(\"Shader load\");\n\n\t// zero out active texture list\n\ttextureUnits.clear();\n\ttextureUnits.push_back(TextureUnit());\n\n\tactiveStorageBufferBindings.clear();\n\n\tstorageBufferBindingIndexToActiveBinding.resize(gl.getMaxShaderStorageBufferBindings(), std::make_pair(-1, -1));\n\tactiveStorageBufferBindings.clear();\n\tactiveWritableStorageBuffers.clear();\n\n\tfor (const auto &stage : stages)\n\t{\n\t\tif (stage.get() != nullptr)\n\t\t\t((ShaderStage*)stage.get())->loadVolatile();\n\t}\n\n\tprogram = glCreateProgram();\n\n\tif (program == 0)\n\t\tthrow love::Exception(\"Cannot create shader program object.\");\n\n\tif (!debugName.empty() && (GLAD_VERSION_4_3 || GLAD_ES_VERSION_3_2))\n\t\tglObjectLabel(GL_PROGRAM, program, -1, debugName.c_str());\n\n\tfor (const auto &stage : stages)\n\t{\n\t\tif (stage.get() != nullptr)\n\t\t\tglAttachShader(program, (GLuint) stage->getHandle());\n\t}\n\n\t// Bind generic vertex attribute indices to names in the shader.\n\tfor (int i = 0; i < int(ATTRIB_MAX_ENUM); i++)\n\t{\n\t\tconst char *name = nullptr;\n\t\tif (graphics::getConstant((BuiltinVertexAttribute) i, name))\n\t\t\tglBindAttribLocation(program, i, (const GLchar *) name);\n\t}\n\n\tglLinkProgram(program);\n\n\tGLint status;\n\tglGetProgramiv(program, GL_LINK_STATUS, &status);\n\n\tif (status == GL_FALSE)\n\t{\n\t\tstd::string warnings = getProgramWarnings();\n\t\tglDeleteProgram(program);\n\t\tprogram = 0;\n\t\tthrow love::Exception(\"Cannot link shader program object:\\n%s\", warnings.c_str());\n\t}\n\n\t// Get all active uniform variables in this shader from OpenGL.\n\tmapActiveUniforms();\n\n\tif (current == this)\n\t{\n\t\t// make sure glUseProgram gets called.\n\t\tcurrent = nullptr;\n\t\tattach();\n\t}\n\n\treturn true;\n}\n\nvoid Shader::unloadVolatile()\n{\n\tif (program != 0)\n\t{\n\t\tif (current == this)\n\t\t\tgl.useProgram(0);\n\n\t\tglDeleteProgram(program);\n\t\tprogram = 0;\n\t}\n\n\t// active texture list is probably invalid, clear it\n\ttextureUnits.clear();\n\ttextureUnits.push_back(TextureUnit());\n\n\tattributes.clear();\n\n\t// And the locations of any built-in uniform variables.\n\tfor (int i = 0; i < int(BUILTIN_MAX_ENUM); i++)\n\t\tbuiltinUniforms[i] = -1;\n}\n\nstd::string Shader::getProgramWarnings() const\n{\n\tGLint strsize, nullpos;\n\tglGetProgramiv(program, GL_INFO_LOG_LENGTH, &strsize);\n\n\tif (strsize == 0)\n\t\treturn \"\";\n\n\tchar *tempstr = new char[strsize];\n\t// be extra sure that the error string will be 0-terminated\n\tmemset(tempstr, '\\0', strsize);\n\tglGetProgramInfoLog(program, strsize, &nullpos, tempstr);\n\ttempstr[nullpos] = '\\0';\n\n\tstd::string warnings(tempstr);\n\tdelete[] tempstr;\n\n\treturn warnings;\n}\n\nstd::string Shader::getWarnings() const\n{\n\tstd::string warnings;\n\tconst char *stagestr;\n\n\tfor (const auto &stage : stages)\n\t{\n\t\tif (stage.get() == nullptr)\n\t\t\tcontinue;\n\n\t\tconst std::string &stagewarnings = stage->getWarnings();\n\n\t\tif (!stagewarnings.empty() && ShaderStage::getConstant(stage->getStageType(), stagestr))\n\t\t\twarnings += std::string(stagestr) + std::string(\" shader:\\n\") + stagewarnings;\n\t}\n\n\twarnings += getProgramWarnings();\n\n\treturn warnings;\n}\n\nvoid Shader::attach()\n{\n\tif (current != this)\n\t{\n\t\tGraphics::flushBatchedDrawsGlobal();\n\n\t\tgl.useProgram(program);\n\t\tcurrent = this;\n\t\t// retain/release happens in Graphics::setShader.\n\n\t\t// Make sure all textures are bound to their respective texture units.\n\t\tfor (int i = 0; i < (int) textureUnits.size(); i++)\n\t\t{\n\t\t\tconst TextureUnit &unit = textureUnits[i];\n\t\t\tif (unit.active)\n\t\t\t{\n\t\t\t\tif (unit.isTexelBuffer)\n\t\t\t\t\tgl.bindBufferTextureToUnit(unit.texture, i, false, false);\n\t\t\t\telse\n\t\t\t\t\tgl.bindTextureToUnit(unit.type, unit.texture, i, false, false);\n\t\t\t}\n\t\t}\n\n\t\tfor (size_t i = 0; i < storageTextureBindings.size(); i++)\n\t\t{\n\t\t\tconst auto &binding = storageTextureBindings[i];\n\t\t\tglBindImageTexture((GLuint) i, binding.gltexture, 0, GL_TRUE, 0, binding.access, binding.internalFormat);\n\t\t}\n\n\t\tfor (auto bufferbinding : activeStorageBufferBindings)\n\t\t\tgl.bindIndexedBuffer(bufferbinding.buffer, BUFFERUSAGE_SHADER_STORAGE, bufferbinding.bindingindex);\n\n\t\t// send any pending uniforms to the shader program.\n\t\tfor (const auto &p : pendingUniformUpdates)\n\t\t\tupdateUniform(p.first, p.second, true);\n\n\t\tpendingUniformUpdates.clear();\n\t}\n}\n\nconst Shader::UniformInfo *Shader::getUniformInfo(BuiltinUniform builtin) const\n{\n\treturn builtinUniformInfo[(int)builtin];\n}\n\nvoid Shader::updateUniform(const UniformInfo *info, int count)\n{\n\tupdateUniform(info, count, false);\n}\n\nvoid Shader::updateUniform(const UniformInfo *info, int count, bool internalupdate)\n{\n\tif (current != this && !internalupdate)\n\t{\n\t\tpendingUniformUpdates.push_back(std::make_pair(info, count));\n\t\treturn;\n\t}\n\n\tif (!internalupdate)\n\t\tflushBatchedDraws();\n\n\tint location = info->location;\n\tUniformType type = info->baseType;\n\n\tif (type == UNIFORM_FLOAT)\n\t{\n\t\tswitch (info->components)\n\t\t{\n\t\tcase 1:\n\t\t\tglUniform1fv(location, count, info->floats);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tglUniform2fv(location, count, info->floats);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tglUniform3fv(location, count, info->floats);\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tglUniform4fv(location, count, info->floats);\n\t\t\tbreak;\n\t\t}\n\t}\n\telse if (type == UNIFORM_INT || type == UNIFORM_BOOL || type == UNIFORM_SAMPLER || type == UNIFORM_STORAGETEXTURE || type == UNIFORM_TEXELBUFFER)\n\t{\n\t\tswitch (info->components)\n\t\t{\n\t\tcase 1:\n\t\t\tglUniform1iv(location, count, info->ints);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tglUniform2iv(location, count, info->ints);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tglUniform3iv(location, count, info->ints);\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tglUniform4iv(location, count, info->ints);\n\t\t\tbreak;\n\t\t}\n\t}\n\telse if (type == UNIFORM_UINT)\n\t{\n\t\tswitch (info->components)\n\t\t{\n\t\tcase 1:\n\t\t\tglUniform1uiv(location, count, info->uints);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tglUniform2uiv(location, count, info->uints);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tglUniform3uiv(location, count, info->uints);\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tglUniform4uiv(location, count, info->uints);\n\t\t\tbreak;\n\t\t}\n\t}\n\telse if (type == UNIFORM_MATRIX)\n\t{\n\t\tint columns = info->matrix.columns;\n\t\tint rows = info->matrix.rows;\n\n\t\tif (columns == 2 && rows == 2)\n\t\t\tglUniformMatrix2fv(location, count, GL_FALSE, info->floats);\n\t\telse if (columns == 3 && rows == 3)\n\t\t\tglUniformMatrix3fv(location, count, GL_FALSE, info->floats);\n\t\telse if (columns == 4 && rows == 4)\n\t\t\tglUniformMatrix4fv(location, count, GL_FALSE, info->floats);\n\t\telse if (columns == 2 && rows == 3)\n\t\t\tglUniformMatrix2x3fv(location, count, GL_FALSE, info->floats);\n\t\telse if (columns == 2 && rows == 4)\n\t\t\tglUniformMatrix2x4fv(location, count, GL_FALSE, info->floats);\n\t\telse if (columns == 3 && rows == 2)\n\t\t\tglUniformMatrix3x2fv(location, count, GL_FALSE, info->floats);\n\t\telse if (columns == 3 && rows == 4)\n\t\t\tglUniformMatrix3x4fv(location, count, GL_FALSE, info->floats);\n\t\telse if (columns == 4 && rows == 2)\n\t\t\tglUniformMatrix4x2fv(location, count, GL_FALSE, info->floats);\n\t\telse if (columns == 4 && rows == 3)\n\t\t\tglUniformMatrix4x3fv(location, count, GL_FALSE, info->floats);\n\t}\n}\n\nvoid Shader::applyTexture(const UniformInfo *info, int i, love::graphics::Texture *texture, UniformType basetype, bool isdefault)\n{\n\tbool shaderactive = current == this;\n\n\tif (basetype == UNIFORM_STORAGETEXTURE)\n\t{\n\t\tGLuint gltex = (GLuint) texture->getHandle();\n\n\t\tint bindingindex = info->ints[i];\n\t\tauto &binding = storageTextureBindings[bindingindex];\n\n\t\tif (isdefault && (info->access & ACCESS_WRITE) != 0)\n\t\t{\n\t\t\tbinding.texture = nullptr;\n\t\t\tbinding.gltexture = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbinding.texture = texture;\n\t\t\tbinding.gltexture = gltex;\n\n\t\t\tif (shaderactive)\n\t\t\t\tglBindImageTexture(bindingindex, binding.gltexture, 0, GL_TRUE, 0, binding.access, binding.internalFormat);\n\t\t}\n\t}\n\telse\n\t{\n\t\tGLuint gltex = (GLuint) texture->getHandle();\n\n\t\tint texunit = info->ints[i];\n\n\t\tif (shaderactive)\n\t\t\tgl.bindTextureToUnit(info->textureType, gltex, texunit, false, false);\n\n\t\t// Store texture id so it can be re-bound to the texture unit later.\n\t\ttextureUnits[texunit].texture = gltex;\n\t}\n}\n\nvoid Shader::applyBuffer(const UniformInfo *info, int i, love::graphics::Buffer *buffer, UniformType basetype, bool isdefault)\n{\n\tbool shaderactive = current == this;\n\n\tif (basetype == UNIFORM_TEXELBUFFER)\n\t{\n\t\tGLuint gltex = (GLuint) buffer->getTexelBufferHandle();\n\t\tint texunit = info->ints[i];\n\n\t\tif (shaderactive)\n\t\t\tgl.bindBufferTextureToUnit(gltex, texunit, false, false);\n\n\t\t// Store texture id so it can be re-bound to the texture unit later.\n\t\ttextureUnits[texunit].texture = gltex;\n\t}\n\telse if (basetype == UNIFORM_STORAGEBUFFER)\n\t{\n\t\tGLuint glbuffer = (GLuint)buffer->getHandle();\n\t\tint bindingindex = info->ints[i];\n\n\t\tif (shaderactive)\n\t\t\tgl.bindIndexedBuffer(glbuffer, BUFFERUSAGE_SHADER_STORAGE, bindingindex);\n\n\t\tauto activeindex = storageBufferBindingIndexToActiveBinding[bindingindex];\n\n\t\tif (activeindex.first >= 0)\n\t\t\tactiveStorageBufferBindings[activeindex.first].buffer = glbuffer;\n\n\t\tif (activeindex.second >= 0)\n\t\t\tactiveWritableStorageBuffers[activeindex.second] = isdefault ? nullptr : buffer;\n\t}\n}\n\nptrdiff_t Shader::getHandle() const\n{\n\treturn program;\n}\n\nint Shader::getVertexAttributeIndex(const std::string &name)\n{\n\tauto it = attributes.find(name);\n\tif (it != attributes.end())\n\t\treturn it->second;\n\n\tGLint location = glGetAttribLocation(program, name.c_str());\n\n\tattributes[name] = location;\n\treturn location;\n}\n\nvoid Shader::updateBuiltinUniforms(love::graphics::Graphics *gfx, int viewportW, int viewportH)\n{\n\tif (current != this)\n\t\treturn;\n\n\tbool rt = gfx->isRenderTargetActive();\n\n\tBuiltinUniformData data;\n\n\tdata.transformMatrix = gfx->getTransform();\n\tdata.projectionMatrix = gfx->getDeviceProjection();\n\n\tdata.scaleParams.x = (float) gfx->getCurrentDPIScale();\n\tdata.scaleParams.y = gfx->getPointSize();\n\n\t// Users expect to work with y-up NDC, y-down pixel coordinates and textures\n\t// (see graphics/Shader.h).\n\t// OpenGL has y-up NDC and y-up pixel coordinates and textures. If we just flip\n\t// NDC y when rendering to a texture, it's enough to make (0, 0) on the texture\n\t// match what we expect when sampling from it - so it's the same as if textures\n\t// are y-down with y-up NDC.\n\t// Windowing systems treat (0, 0) on the backbuffer texture as the bottom left,\n\t// so we don't need to do that there.\n\tuint32 clipflags = 0;\n\tif (rt)\n\t\tclipflags |= CLIP_TRANSFORM_FLIP_Y;\n\tdata.clipSpaceParams = computeClipSpaceParams(clipflags);\n\n\tdata.screenSizeParams.x = viewportW;\n\tdata.screenSizeParams.y = viewportH;\n\n\t// The shader does pixcoord.y = gl_FragCoord.y * params.z + params.w.\n\t// This lets us flip pixcoord.y when needed, to be consistent (drawing\n\t// with no RT active makes the pixel coordinates y-flipped.)\n\tif (rt)\n\t{\n\t\t// No flipping: pixcoord.y = gl_FragCoord.y * 1.0 + 0.0.\n\t\tdata.screenSizeParams.z = 1.0f;\n\t\tdata.screenSizeParams.w = 0.0f;\n\t}\n\telse\n\t{\n\t\t// gl_FragCoord.y is flipped when drawing to the screen, so we\n\t\t// un-flip: pixcoord.y = gl_FragCoord.y * -1.0 + height.\n\t\tdata.screenSizeParams.z = -1.0f;\n\t\tdata.screenSizeParams.w = viewportH;\n\t}\n\n\tdata.constantColor = gfx->getColor();\n\tgammaCorrectColor(data.constantColor);\n\n\tGLint location = builtinUniforms[BUILTIN_UNIFORMS_PER_DRAW];\n\tif (location >= 0)\n\t\tglUniform4fv(location, 12, (const GLfloat *) &data);\n}\n\n} // opengl\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/opengl/Shader.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"graphics/Shader.h\"\n#include \"graphics/Graphics.h\"\n#include \"graphics/Volatile.h\"\n#include \"OpenGL.h\"\n\n// STL\n#include <string>\n#include <map>\n#include <vector>\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace opengl\n{\n\n// A GLSL shader\nclass Shader final : public love::graphics::Shader, public Volatile\n{\npublic:\n\n\tstruct StorageTextureBinding\n\t{\n\t\tlove::graphics::Texture *texture = nullptr;\n\t\tGLuint gltexture = 0;\n\t\tTextureType type = TEXTURE_2D;\n\t\tGLenum access = GL_READ_ONLY;\n\t\tGLenum internalFormat;\n\t};\n\n\tShader(StrongRef<love::graphics::ShaderStage> stages[SHADERSTAGE_MAX_ENUM], const CompileOptions &options);\n\tvirtual ~Shader();\n\n\t// Implements Volatile\n\tbool loadVolatile() override;\n\tvoid unloadVolatile() override;\n\n\t// Implements Shader.\n\tvoid attach() override;\n\tstd::string getWarnings() const override;\n\tint getVertexAttributeIndex(const std::string &name) override;\n\tconst UniformInfo *getUniformInfo(BuiltinUniform builtin) const override;\n\tvoid updateUniform(const UniformInfo *info, int count) override;\n\tptrdiff_t getHandle() const override;\n\n\tvoid updateBuiltinUniforms(love::graphics::Graphics *gfx, int viewportW, int viewportH);\n\n\tconst std::vector<Buffer *> &getActiveWritableStorageBuffers() const { return activeWritableStorageBuffers; }\n\tconst std::vector<StorageTextureBinding> &getStorageTextureBindings() const { return storageTextureBindings; }\n\nprivate:\n\n\tstruct TextureUnit\n\t{\n\t\tGLuint texture = 0;\n\t\tTextureType type = TEXTURE_2D;\n\t\tbool isTexelBuffer = false;\n\t\tbool active = false;\n\t};\n\n\tstruct BufferBinding\n\t{\n\t\tint bindingindex = 0;\n\t\tGLuint buffer = 0;\n\t};\n\n\t// Map active uniform names to their locations.\n\tvoid mapActiveUniforms();\n\n\tvoid updateUniform(const UniformInfo *info, int count, bool internalupdate);\n\n\tvoid applyTexture(const UniformInfo *info, int i, love::graphics::Texture *texture, UniformType basetype, bool isdefault) override;\n\tvoid applyBuffer(const UniformInfo *info, int i, love::graphics::Buffer *buffer, UniformType basetype, bool isdefault) override;\n\n\t// Get any warnings or errors generated only by the shader program object.\n\tstd::string getProgramWarnings() const;\n\n\t// volatile\n\tGLuint program;\n\n\t// Location values for any built-in uniform variables.\n\tGLint builtinUniforms[BUILTIN_MAX_ENUM];\n\tUniformInfo *builtinUniformInfo[BUILTIN_MAX_ENUM];\n\n\tstd::map<std::string, GLint> attributes;\n\n\t// Texture unit pool for setting textures\n\tstd::vector<TextureUnit> textureUnits;\n\n\tstd::vector<StorageTextureBinding> storageTextureBindings;\n\n\tstd::vector<std::pair<int, int>> storageBufferBindingIndexToActiveBinding;\n\tstd::vector<BufferBinding> activeStorageBufferBindings;\n\n\tstd::vector<Buffer *> activeWritableStorageBuffers;\n\n\tstd::vector<std::pair<const UniformInfo *, int>> pendingUniformUpdates;\n\n}; // Shader\n\n} // opengl\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/opengl/ShaderStage.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"ShaderStage.h\"\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace opengl\n{\n\nShaderStage::ShaderStage(love::graphics::Graphics *gfx, ShaderStageType stage, const std::string &source, bool gles, const std::string &cachekey)\n\t: love::graphics::ShaderStage(gfx, stage, source, gles, cachekey)\n\t, glShader(0)\n{\n\tloadVolatile();\n}\n\nShaderStage::~ShaderStage()\n{\n\tunloadVolatile();\n}\n\nbool ShaderStage::loadVolatile()\n{\n\tif (glShader != 0)\n\t\treturn true;\n\n\tShaderStageType stage = getStageType();\n\tconst char *typestr = \"unknown\";\n\tgetConstant(stage, typestr);\n\n\tGLenum glstage = 0;\n\tif (stage == SHADERSTAGE_VERTEX)\n\t\tglstage = GL_VERTEX_SHADER;\n\telse if (stage == SHADERSTAGE_PIXEL)\n\t\tglstage = GL_FRAGMENT_SHADER;\n\telse if (stage == SHADERSTAGE_COMPUTE)\n\t\tglstage = GL_COMPUTE_SHADER;\n\telse\n\t\tthrow love::Exception(\"%s shader stage is not handled in OpenGL backend code.\", typestr);\n\n\tglShader = glCreateShader(glstage);\n\n\tif (glShader == 0)\n\t\tthrow love::Exception(\"Cannot create OpenGL %s shader object.\", typestr);\n\n\tconst std::string &sourcestring = getSource();\n\tconst char *src = sourcestring.c_str();\n\tGLint srclen = (GLint) sourcestring.length();\n\n\tglShaderSource(glShader, 1, (const GLchar **)&src, &srclen);\n\tglCompileShader(glShader);\n\n\tGLint infologlen;\n\tglGetShaderiv(glShader, GL_INFO_LOG_LENGTH, &infologlen);\n\n\tif (infologlen > 0)\n\t{\n\t\tGLchar *infolog = new GLchar[infologlen];\n\t\tglGetShaderInfoLog(glShader, infologlen, nullptr, infolog);\n\n\t\twarnings = infolog;\n\t\tdelete[] infolog;\n\t}\n\n\tGLint status = GL_FALSE;\n\tglGetShaderiv(glShader, GL_COMPILE_STATUS, &status);\n\n\tif (status == GL_FALSE)\n\t{\n\t\tglDeleteShader(glShader);\n\t\tthrow love::Exception(\"Cannot compile %s shader code:\\n%s\", typestr, warnings.c_str());\n\t}\n\n\treturn true;\n}\n\nvoid ShaderStage::unloadVolatile()\n{\n\tif (glShader != 0)\n\t\tglDeleteShader(glShader);\n\n\tglShader = 0;\n}\n\n} // opengl\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/opengl/ShaderStage.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"graphics/ShaderStage.h\"\n#include \"graphics/Volatile.h\"\n#include \"OpenGL.h\"\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace opengl\n{\n\nclass ShaderStage final : public love::graphics::ShaderStage, public Volatile\n{\npublic:\n\n\tShaderStage(love::graphics::Graphics *gfx, ShaderStageType stage, const std::string &source, bool gles, const std::string &cachekey);\n\tvirtual ~ShaderStage();\n\n\tptrdiff_t getHandle() const override { return glShader; }\n\n\t// Implements Volatile.\n\tbool loadVolatile() override;\n\tvoid unloadVolatile() override;\n\nprivate:\n\n\tGLuint glShader;\n\n}; // ShaderStage\n\n} // opengl\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/opengl/StreamBuffer.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"common/config.h\"\n#include \"StreamBuffer.h\"\n#include \"OpenGL.h\"\n#include \"FenceSync.h\"\n#include \"graphics/Volatile.h\"\n#include \"common/Exception.h\"\n#include \"common/memory.h\"\n\n#include <vector>\n#include <algorithm>\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace opengl\n{\n\n// Typically this should be 3 frames, but we only do per-frame syncing right now\n// so we add an extra frame to reduce the (small) chance of stalls.\nstatic const int BUFFER_FRAMES = 4;\n\nclass StreamBufferClientMemory final : public love::graphics::StreamBuffer\n{\npublic:\n\n\tStreamBufferClientMemory(BufferUsage mode, size_t size)\n\t\t: love::graphics::StreamBuffer(mode, size)\n\t\t, data(nullptr)\n\t{\n\t\ttry\n\t\t{\n\t\t\tdata = new uint8[size];\n\t\t}\n\t\tcatch (std::exception &)\n\t\t{\n\t\t\tthrow love::Exception(\"Out of memory.\");\n\t\t}\n\t}\n\n\tvirtual ~StreamBufferClientMemory()\n\t{\n\t\tdelete[] data;\n\t}\n\n\tsize_t getGPUReadOffset() const override\n\t{\n\t\treturn (size_t) data;\n\t}\n\n\tMapInfo map(size_t /*minsize*/) override\n\t{\n\t\treturn MapInfo(data, bufferSize);\n\t}\n\n\tsize_t unmap(size_t /*usedsize*/) override\n\t{\n\t\treturn (size_t) data;\n\t}\n\n\tvoid markUsed(size_t /*usedsize*/) override { }\n\tptrdiff_t getHandle() const override { return 0; }\n\nprivate:\n\n\tuint8 *data;\n\n}; // StreamBufferClientMemory\n\nclass StreamBufferSubDataOrphan final : public love::graphics::StreamBuffer, public Volatile\n{\npublic:\n\n\tStreamBufferSubDataOrphan(BufferUsage mode, size_t size)\n\t\t: love::graphics::StreamBuffer(mode, size)\n\t\t, vbo(0)\n\t\t, glMode(OpenGL::getGLBufferType(mode))\n\t\t, data(nullptr)\n\t\t, orphan(false)\n\t{\n\t\ttry\n\t\t{\n\t\t\tdata = new uint8[size];\n\t\t}\n\t\tcatch (std::exception &)\n\t\t{\n\t\t\tthrow love::Exception(\"Out of memory.\");\n\t\t}\n\n\t\tloadVolatile();\n\t}\n\n\tvirtual ~StreamBufferSubDataOrphan()\n\t{\n\t\tunloadVolatile();\n\t\tdelete[] data;\n\t}\n\n\tsize_t getGPUReadOffset() const override\n\t{\n\t\treturn frameGPUReadOffset;\n\t}\n\n\tMapInfo map(size_t /*minsize*/) override\n\t{\n\t\tif (orphan)\n\t\t{\n\t\t\torphan = false;\n\t\t\tframeGPUReadOffset = 0;\n\t\t\tgl.bindBuffer(mode, vbo);\n\t\t\tglBufferData(glMode, bufferSize, nullptr, GL_STREAM_DRAW);\n\t\t}\n\n\t\treturn MapInfo(data, bufferSize - frameGPUReadOffset);\n\t}\n\n\tsize_t unmap(size_t usedsize) override\n\t{\n\t\tgl.bindBuffer(mode, vbo);\n\t\tglBufferSubData(glMode, frameGPUReadOffset, usedsize, data);\n\t\treturn frameGPUReadOffset;\n\t}\n\n\tvoid markUsed(size_t usedsize) override\n\t{\n\t\tframeGPUReadOffset += usedsize;\n\t}\n\n\tvoid nextFrame() override\n\t{\n\t\t// Orphan the buffer before its first use in the next frame.\n\t\tframeGPUReadOffset = 0;\n\t\torphan = true;\n\t}\n\n\tptrdiff_t getHandle() const override { return vbo; }\n\n\tbool loadVolatile() override\n\t{\n\t\tif (vbo != 0)\n\t\t\treturn true;\n\n\t\tglGenBuffers(1, &vbo);\n\t\tgl.bindBuffer(mode, vbo);\n\t\tglBufferData(glMode, bufferSize, nullptr, GL_STREAM_DRAW);\n\n\t\tframeGPUReadOffset = 0;\n\t\torphan = false;\n\n\t\treturn true;\n\t}\n\n\tvoid unloadVolatile() override\n\t{\n\t\tif (vbo == 0)\n\t\t\treturn;\n\n\t\tgl.deleteBuffer(vbo);\n\t\tvbo = 0;\n\t}\n\nprotected:\n\n\tGLuint vbo;\n\tGLenum glMode;\n\n\tuint8 *data;\n\n\tbool orphan;\n\n}; // StreamBufferSubDataOrphan\n\nclass StreamBufferSync : public love::graphics::StreamBuffer\n{\npublic:\n\n\tStreamBufferSync(BufferUsage type, size_t size)\n\t\t: love::graphics::StreamBuffer(type, size)\n\t\t, frameIndex(0)\n\t\t, syncs()\n\t{}\n\n\tvirtual ~StreamBufferSync() {}\n\n\tsize_t getGPUReadOffset() const override\n\t{\n\t\treturn (frameIndex * bufferSize) + frameGPUReadOffset;\n\t}\n\n\tvoid nextFrame() override\n\t{\n\t\t// Insert a GPU fence for this frame's section of the data, we'll wait\n\t\t// for it when we try to map that data for writing in subsequent frames.\n\t\tsyncs[frameIndex].fence();\n\n\t\tframeIndex = (frameIndex + 1) % BUFFER_FRAMES;\n\t\tframeGPUReadOffset = 0;\n\t}\n\n\tvoid markUsed(size_t usedsize) override\n\t{\n\t\t// We insert a fence for all data from this frame at the end of the\n\t\t// frame (in nextFrame), rather than doing anything more fine-grained.\n\t\tframeGPUReadOffset += usedsize;\n\t}\n\nprotected:\n\n\tint frameIndex;\n\tFenceSync syncs[BUFFER_FRAMES];\n\n}; // StreamBufferSync\n\nclass StreamBufferMapSync final : public StreamBufferSync, public Volatile\n{\npublic:\n\n\tStreamBufferMapSync(BufferUsage type, size_t size)\n\t\t: StreamBufferSync(type, size)\n\t\t, vbo(0)\n\t\t, glMode(OpenGL::getGLBufferType(mode))\n\t{\n\t\tloadVolatile();\n\t}\n\n\t~StreamBufferMapSync()\n\t{\n\t\tunloadVolatile();\n\t}\n\n\tMapInfo map(size_t /*minsize*/) override\n\t{\n\t\tgl.bindBuffer(mode, vbo);\n\n\t\t// Make sure this frame's section of the buffer is done being used.\n\t\tsyncs[frameIndex].cpuWait();\n\n\t\tMapInfo info;\n\t\tinfo.size = bufferSize - frameGPUReadOffset;\n\n\t\tGLbitfield flags = GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_UNSYNCHRONIZED_BIT;\n\n\t\tsize_t mapoffset = (frameIndex * bufferSize) + frameGPUReadOffset;\n\t\tinfo.data = (uint8 *) glMapBufferRange(glMode, mapoffset, info.size, flags);\n\n\t\treturn info;\n\t}\n\n\tsize_t unmap(size_t usedsize) override\n\t{\n\t\tgl.bindBuffer(mode, vbo);\n\t\tglFlushMappedBufferRange(glMode, 0, usedsize);\n\t\tglUnmapBuffer(glMode);\n\n\t\treturn (frameIndex * bufferSize) + frameGPUReadOffset;\n\t}\n\n\tptrdiff_t getHandle() const override { return vbo; }\n\n\tbool loadVolatile() override\n\t{\n\t\tif (vbo != 0)\n\t\t\treturn true;\n\n\t\tglGenBuffers(1, &vbo);\n\t\tgl.bindBuffer(mode, vbo);\n\t\tglBufferData(glMode, bufferSize * BUFFER_FRAMES, nullptr, GL_STREAM_DRAW);\n\n\t\tframeGPUReadOffset = 0;\n\t\tframeIndex = 0;\n\n\t\treturn true;\n\t}\n\n\tvoid unloadVolatile() override\n\t{\n\t\tif (vbo != 0)\n\t\t{\n\t\t\tgl.deleteBuffer(vbo);\n\t\t\tvbo = 0;\n\t\t}\n\n\t\tfor (FenceSync &sync : syncs)\n\t\t\tsync.cleanup();\n\t}\n\nprivate:\n\n\tGLuint vbo;\n\tGLenum glMode;\n\n}; // StreamBufferMapSync\n\nclass StreamBufferPersistentMapSync final : public StreamBufferSync, public Volatile\n{\npublic:\n\n\t// Coherent mapping is supposedly faster on intel/nvidia aside from a couple\n\t// old nvidia GPUs.\n\tStreamBufferPersistentMapSync(BufferUsage type, size_t size, bool coherent = true)\n\t\t: StreamBufferSync(type, size)\n\t\t, vbo(0)\n\t\t, glMode(OpenGL::getGLBufferType(mode))\n\t\t, data(nullptr)\n\t\t, coherent(coherent)\n\t{\n\t\tloadVolatile();\n\t}\n\n\t~StreamBufferPersistentMapSync()\n\t{\n\t\tunloadVolatile();\n\t}\n\n\tMapInfo map(size_t /*minsize*/) override\n\t{\n\t\t// Make sure this frame's section of the buffer is done being used.\n\t\tsyncs[frameIndex].cpuWait();\n\n\t\tMapInfo info;\n\t\tinfo.size = bufferSize - frameGPUReadOffset;\n\t\tinfo.data = data + (frameIndex * bufferSize) + frameGPUReadOffset;\n\t\treturn info;\n\t}\n\n\tsize_t unmap(size_t usedsize) override\n\t{\n\t\tsize_t offset = (frameIndex * bufferSize) + frameGPUReadOffset;\n\n\t\tif (!coherent)\n\t\t{\n\t\t\tgl.bindBuffer(mode, vbo);\n\t\t\tglFlushMappedBufferRange(glMode, offset, usedsize);\n\t\t}\n\n\t\treturn offset;\n\t}\n\n\tptrdiff_t getHandle() const override { return vbo; }\n\n\tbool loadVolatile() override\n\t{\n\t\tif (vbo != 0)\n\t\t\treturn true;\n\n\t\tglGenBuffers(1, &vbo);\n\t\tgl.bindBuffer(mode, vbo);\n\n\t\tGLbitfield storageflags = GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT;\n\t\tGLbitfield mapflags = GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT;\n\n\t\tstorageflags |= (coherent ? GL_MAP_COHERENT_BIT : 0);\n\t\tmapflags |= (coherent ? GL_MAP_COHERENT_BIT : GL_MAP_FLUSH_EXPLICIT_BIT);\n\n\t\tglBufferStorage(glMode, bufferSize * BUFFER_FRAMES, nullptr, storageflags);\n\t\tdata = (uint8 *) glMapBufferRange(glMode, 0, bufferSize * BUFFER_FRAMES, mapflags);\n\n\t\tframeGPUReadOffset = 0;\n\t\tframeIndex = 0;\n\n\t\treturn true;\n\t}\n\n\tvoid unloadVolatile() override\n\t{\n\t\tif (vbo != 0)\n\t\t{\n\t\t\tgl.bindBuffer(mode, vbo);\n\t\t\tglUnmapBuffer(glMode);\n\t\t\tgl.deleteBuffer(vbo);\n\t\t\tvbo = 0;\n\t\t}\n\n\t\tfor (FenceSync &sync : syncs)\n\t\t\tsync.cleanup();\n\t}\n\nprivate:\n\n\tGLuint vbo;\n\tGLenum glMode;\n\tuint8 *data;\n\tbool coherent;\n\n}; // StreamBufferPersistentMapSync\n\nclass StreamBufferPinnedMemory final : public StreamBufferSync, public Volatile\n{\npublic:\n\n\tStreamBufferPinnedMemory(BufferUsage type, size_t size)\n\t\t: StreamBufferSync(type, size)\n\t\t, vbo(0)\n\t\t, glMode(OpenGL::getGLBufferType(mode))\n\t\t, data(nullptr)\n\t\t, alignedSize(0)\n\t{\n\t\tsize_t alignment = getPageSize();\n\t\talignedSize = alignUp(size * BUFFER_FRAMES, alignment);\n\n\t\tif (!alignedMalloc((void **) &data, alignedSize, alignment))\n\t\t\tthrow love::Exception(\"Out of memory.\");\n\n\t\tif (!loadVolatile())\n\t\t{\n\t\t\tptrdiff_t pointer = (ptrdiff_t) data;\n\t\t\talignedFree(data);\n\t\t\tthrow love::Exception(\"AMD Pinned Memory StreamBuffer implementation failed to create buffer (address: %p, alignment: %ld, aiigned size: %ld)\", pointer, alignment, alignedSize);\n\t\t}\n\t}\n\n\t~StreamBufferPinnedMemory()\n\t{\n\t\tunloadVolatile();\n\t\talignedFree(data);\n\t}\n\n\tMapInfo map(size_t /*minsize*/) override\n\t{\n\t\t// Make sure this frame's section of the buffer is done being used.\n\t\tsyncs[frameIndex].cpuWait();\n\n\t\tMapInfo info;\n\t\tinfo.size = bufferSize - frameGPUReadOffset;\n\t\tinfo.data = data + (frameIndex * bufferSize) + frameGPUReadOffset;\n\t\treturn info;\n\t}\n\n\tsize_t unmap(size_t /*usedsize*/) override\n\t{\n\t\tsize_t offset = (frameIndex * bufferSize) + frameGPUReadOffset;\n\t\treturn offset;\n\t}\n\n\tptrdiff_t getHandle() const override { return vbo; }\n\n\tbool loadVolatile() override\n\t{\n\t\tif (vbo != 0)\n\t\t\treturn true;\n\n\t\tglGenBuffers(1, &vbo);\n\n\t\twhile (glGetError() != GL_NO_ERROR)\n\t\t\t/* Clear errors. */;\n\n\t\tglBindBuffer(GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, vbo);\n\t\tglBufferData(GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, alignedSize, data, GL_STREAM_DRAW);\n\n\t\tif (glGetError() != GL_NO_ERROR)\n\t\t{\n\t\t\tgl.deleteBuffer(vbo);\n\t\t\tvbo = 0;\n\t\t\treturn false;\n\t\t}\n\n\t\tframeGPUReadOffset = 0;\n\t\tframeIndex = 0;\n\n\t\treturn true;\n\t}\n\n\tvoid unloadVolatile() override\n\t{\n\t\tif (vbo != 0)\n\t\t{\n\t\t\t// Make sure the GPU has completed all work before freeing the\n\t\t\t// memory. glFlush+sync.cpuWait doesn't seem to be enough.\n\t\t\tglFinish();\n\n\t\t\tgl.bindBuffer(mode, vbo);\n\t\t\tgl.deleteBuffer(vbo);\n\t\t\tvbo = 0;\n\t\t}\n\n\t\tfor (FenceSync &sync : syncs)\n\t\t\tsync.cleanup();\n\t}\n\nprivate:\n\n\tGLuint vbo;\n\tGLenum glMode;\n\tuint8 *data;\n\tsize_t alignedSize;\n\n}; // StreamBufferPinnedMemory\n\nlove::graphics::StreamBuffer *CreateStreamBuffer(BufferUsage mode, size_t size)\n{\n\tif (gl.isCoreProfile())\n\t{\n\t\tif (!gl.bugs.clientWaitSyncStalls)\n\t\t{\n\t\t\t// AMD's pinned memory seems to be faster than persistent mapping,\n\t\t\t// on AMD GPUs.\n\t\t\tif (GLAD_AMD_pinned_memory && gl.getVendor() == OpenGL::VENDOR_AMD)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\treturn new StreamBufferPinnedMemory(mode, size);\n\t\t\t\t}\n\t\t\t\tcatch (love::Exception &)\n\t\t\t\t{\n\t\t\t\t\t// According to the spec, pinned memory can fail if the RAM\n\t\t\t\t\t// allocation can't be mapped to the GPU's address space.\n\t\t\t\t\t// This seems to happen in practice on Mesa + amdgpu:\n\t\t\t\t\t// https://bitbucket.org/rude/love/issues/1540\n\t\t\t\t\t// Fall through to other implementations when that happens.\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (GLAD_VERSION_4_4 || GLAD_ARB_buffer_storage)\n\t\t\t\treturn new StreamBufferPersistentMapSync(mode, size);\n\n\t\t\t// Most modern drivers have a separate internal thread which queues\n\t\t\t// GL commands for the GPU. The queue causes mapping to stall until\n\t\t\t// the items in the queue are flushed, which makes this approach\n\t\t\t// slow on most drivers. On macOS, having a separate driver thread\n\t\t\t// is opt-in via an API, and we don't do it, so we can use this\n\t\t\t// instead of the (potentially slower) SubData approach.\n#ifdef LOVE_MACOS\n\t\t\treturn new StreamBufferMapSync(mode, size);\n#endif\n\t\t}\n\n\t\treturn new StreamBufferSubDataOrphan(mode, size);\n\t}\n\telse\n\t\treturn new StreamBufferClientMemory(mode, size);\n}\n\n} // opengl\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/opengl/StreamBuffer.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"graphics/StreamBuffer.h\"\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace opengl\n{\n\nlove::graphics::StreamBuffer *CreateStreamBuffer(BufferUsage mode, size_t size);\n\n} // opengl\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/opengl/Texture.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Texture.h\"\n\n#include \"graphics/Graphics.h\"\n#include \"Graphics.h\"\n#include \"Buffer.h\"\n#include \"common/int.h\"\n\n// STD\n#include <algorithm> // for min/max\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace opengl\n{\n\nstatic GLenum createFBO(GLuint &framebuffer, TextureType texType, PixelFormat format, GLuint texture, int mips, int layers, bool clear)\n{\n\t// get currently bound fbo to reset to it later\n\tGLuint current_fbo = gl.getFramebuffer(OpenGL::FRAMEBUFFER_ALL);\n\n\tglGenFramebuffers(1, &framebuffer);\n\tgl.bindFramebuffer(OpenGL::FRAMEBUFFER_ALL, framebuffer);\n\n\tif (texture != 0)\n\t{\n\t\tif (isPixelFormatDepthStencil(format))\n\t\t{\n\t\t\tGLenum none = GL_NONE;\n\t\t\tglDrawBuffers(1, &none);\n\t\t\tglReadBuffer(GL_NONE);\n\t\t}\n\n\t\tOpenGL::TextureFormat fmt = OpenGL::convertPixelFormat(format);\n\n\t\tint faces = texType == TEXTURE_CUBE ? 6 : 1;\n\n\t\t// Make sure all faces and layers of the texture are initialized to\n\t\t// transparent black. This is unfortunately probably pretty slow for\n\t\t// 2D-array and 3D textures with a lot of layers...\n\t\tfor (int mip = mips - 1; mip >= 0; mip--)\n\t\t{\n\t\t\tfor (int layer = layers - 1; layer >= 0; layer--)\n\t\t\t{\n\t\t\t\tfor (int face = faces - 1; face >= 0; face--)\n\t\t\t\t{\n\t\t\t\t\tfor (GLenum attachment : fmt.framebufferAttachments)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (attachment == GL_NONE)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tgl.framebufferTexture(attachment, texType, texture, mip, layer, face);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (clear && isPixelFormatInteger(format))\n\t\t\t\t\t{\n\t\t\t\t\t\tPixelFormatType datatype = getPixelFormatInfo(format).dataType;\n\t\t\t\t\t\tif (datatype == PIXELFORMATTYPE_SINT)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconst GLint carray[] = { 0, 0, 0, 0 };\n\t\t\t\t\t\t\tglClearBufferiv(GL_COLOR, 0, carray);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconst GLuint carray[] = { 0, 0, 0, 0 };\n\t\t\t\t\t\t\tglClearBufferuiv(GL_COLOR, 0, carray);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (clear)\n\t\t\t\t\t{\n\t\t\t\t\t\tbool ds = isPixelFormatDepthStencil(format);\n\n\t\t\t\t\t\tGLbitfield clearflags = ds ? GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT : GL_COLOR_BUFFER_BIT;\n\t\t\t\t\t\tOpenGL::CleanClearState cleanClearState(clearflags);\n\n\t\t\t\t\t\tif (ds)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tgl.clearDepth(1.0);\n\t\t\t\t\t\t\tglClearStencil(0);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tglClearColor(0.0f, 0.0f, 0.0f, 0.0f);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tglClear(clearflags);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tGLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);\n\n\tgl.bindFramebuffer(OpenGL::FRAMEBUFFER_ALL, current_fbo);\n\n\treturn status;\n}\n\nstatic GLenum newRenderbuffer(int width, int height, int &samples, PixelFormat pixelformat, GLuint &buffer)\n{\n\tOpenGL::TextureFormat fmt = OpenGL::convertPixelFormat(pixelformat);\n\n\tGLuint current_fbo = gl.getFramebuffer(OpenGL::FRAMEBUFFER_ALL);\n\n\t// Temporary FBO used to clear the renderbuffer.\n\tGLuint fbo = 0;\n\tglGenFramebuffers(1, &fbo);\n\tgl.bindFramebuffer(OpenGL::FRAMEBUFFER_ALL, fbo);\n\n\tif (isPixelFormatDepthStencil(pixelformat))\n\t{\n\t\tGLenum none = GL_NONE;\n\t\tglDrawBuffers(1, &none);\n\t\tglReadBuffer(GL_NONE);\n\t}\n\n\tglGenRenderbuffers(1, &buffer);\n\tglBindRenderbuffer(GL_RENDERBUFFER, buffer);\n\n\tif (samples > 1)\n\t\tglRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, fmt.internalformat, width, height);\n\telse\n\t\tglRenderbufferStorage(GL_RENDERBUFFER, fmt.internalformat, width, height);\n\n\tfor (GLenum attachment : fmt.framebufferAttachments)\n\t{\n\t\tif (attachment != GL_NONE)\n\t\t\tglFramebufferRenderbuffer(GL_FRAMEBUFFER, attachment, GL_RENDERBUFFER, buffer);\n\t}\n\n\tif (samples > 1)\n\t{\n\t\tglGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_SAMPLES, &samples);\n\t\tsamples = std::max(1, samples);\n\t}\n\n\tglBindRenderbuffer(GL_RENDERBUFFER, 0);\n\n\tGLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);\n\n\tif (status == GL_FRAMEBUFFER_COMPLETE)\n\t{\n\t\tif (isPixelFormatInteger(pixelformat))\n\t\t{\n\t\t\tPixelFormatType datatype = getPixelFormatInfo(pixelformat).dataType;\n\t\t\tif (datatype == PIXELFORMATTYPE_SINT)\n\t\t\t{\n\t\t\t\tconst GLint carray[] = { 0, 0, 0, 0 };\n\t\t\t\tglClearBufferiv(GL_COLOR, 0, carray);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tconst GLuint carray[] = { 0, 0, 0, 0 };\n\t\t\t\tglClearBufferuiv(GL_COLOR, 0, carray);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbool ds = isPixelFormatDepthStencil(pixelformat);\n\n\t\t\tGLbitfield clearflags = ds ? GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT : GL_COLOR_BUFFER_BIT;\n\t\t\tOpenGL::CleanClearState cleanClearState(clearflags);\n\n\t\t\tif (ds)\n\t\t\t{\n\t\t\t\tgl.clearDepth(1.0);\n\t\t\t\tglClearStencil(0);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Initialize the buffer to transparent black.\n\t\t\t\tglClearColor(0.0f, 0.0f, 0.0f, 0.0f);\n\t\t\t}\n\n\t\t\tglClear(clearflags);\n\t\t}\n\t}\n\telse\n\t{\n\t\tglDeleteRenderbuffers(1, &buffer);\n\t\tbuffer = 0;\n\t\tsamples = 1;\n\t}\n\n\tgl.bindFramebuffer(OpenGL::FRAMEBUFFER_ALL, current_fbo);\n\tgl.deleteFramebuffer(fbo);\n\n\treturn status;\n}\n\nTexture::Texture(love::graphics::Graphics *gfx, const Settings &settings, const Slices *data)\n\t: love::graphics::Texture(gfx, settings, data)\n\t, slices(settings.type)\n\t, fbo(0)\n\t, texture(0)\n\t, renderbuffer(0)\n\t, framebufferStatus(GL_FRAMEBUFFER_COMPLETE)\n\t, textureGLError(GL_NO_ERROR)\n\t, actualSamples(1)\n{\n\tif (data != nullptr)\n\t\tslices = *data;\n\n\tif (!loadVolatile())\n\t{\n\t\tif (framebufferStatus != GL_FRAMEBUFFER_COMPLETE)\n\t\t\tthrow love::Exception(\"Cannot create Texture (OpenGL framebuffer error: %s)\", OpenGL::framebufferStatusString(framebufferStatus));\n\t\tif (textureGLError != GL_NO_ERROR)\n\t\t\tthrow love::Exception(\"Cannot create Texture (OpenGL error: %s)\", OpenGL::errorString(textureGLError));\n\t}\n\n\t// ImageData is referenced by the first loadVolatile call, but we don't\n\t// hang on to it after that so we can save memory.\n\tslices.clear();\n}\n\nTexture::Texture(love::graphics::Graphics *gfx, love::graphics::Texture *base, const Texture::ViewSettings &viewsettings)\n\t: love::graphics::Texture(gfx, base, viewsettings)\n\t, slices(viewsettings.type.get(base->getTextureType()))\n\t, fbo(0)\n\t, texture(0)\n\t, renderbuffer(0)\n\t, framebufferStatus(GL_FRAMEBUFFER_COMPLETE)\n\t, textureGLError(GL_NO_ERROR)\n\t, actualSamples(1)\n{\n\tif (!loadVolatile())\n\t{\n\t\tif (framebufferStatus != GL_FRAMEBUFFER_COMPLETE)\n\t\t\tthrow love::Exception(\"Cannot create texture view (OpenGL framebuffer error: %s)\", OpenGL::framebufferStatusString(framebufferStatus));\n\t\tif (textureGLError != GL_NO_ERROR)\n\t\t\tthrow love::Exception(\"Cannot create texture view (OpenGL error: %s)\", OpenGL::errorString(textureGLError));\n\t}\n}\n\nTexture::~Texture()\n{\n\tunloadVolatile();\n}\n\nvoid Texture::createTexture()\n{\n\t// The base class handles some validation. For example, if ImageData is\n\t// given then it must exist for all mip levels, a render target can't use\n\t// a compressed format, etc.\n\tglGenTextures(1, &texture);\n\tGLenum gltype = OpenGL::getGLTextureType(texType);\n\n\tif (parentView.texture != this)\n\t{\n\t\tOpenGL::TextureFormat fmt = gl.convertPixelFormat(format);\n\t\tTexture *basetex = (Texture *) parentView.texture;\n\t\tint layers = texType == TEXTURE_CUBE ? 6 : getLayerCount();\n\n\t\tglTextureView(texture, gltype, basetex->texture, fmt.internalformat,\n\t\t              parentView.startMipmap, getMipmapCount(),\n\t\t              parentView.startLayer, layers);\n\n\t\tgl.bindTextureToUnit(this, 0, false);\n\t\tsetSamplerState(samplerState);\n\t\treturn;\n\t}\n\n\tgl.bindTextureToUnit(this, 0, false);\n\n\tif (renderTarget && GLAD_ANGLE_texture_usage)\n\t\tglTexParameteri(gltype, GL_TEXTURE_USAGE_ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE);\n\n\tsetSamplerState(samplerState);\n\n\tint mipcount = getMipmapCount();\n\tint slicecount = 1;\n\n\tif (texType == TEXTURE_VOLUME)\n\t\tslicecount = getDepth();\n\telse if (texType == TEXTURE_2D_ARRAY)\n\t\tslicecount = getLayerCount();\n\telse if (texType == TEXTURE_CUBE)\n\t\tslicecount = 6;\n\n\tgl.rawTexStorage(texType, mipcount, format, pixelWidth, pixelHeight, texType == TEXTURE_VOLUME ? depth : layers);\n\n\tint w = pixelWidth;\n\tint h = pixelHeight;\n\tint d = depth;\n\n\tfor (int mip = 0; mip < mipcount; mip++)\n\t{\n\t\tfor (int slice = 0; slice < slicecount; slice++)\n\t\t{\n\t\t\tlove::image::ImageDataBase *id = slices.get(slice, mip);\n\t\t\tif (id != nullptr)\n\t\t\t\tuploadImageData(id, mip, slice, 0, 0);\n\t\t}\n\n\t\tw = std::max(w / 2, 1);\n\t\th = std::max(h / 2, 1);\n\n\t\tif (texType == TEXTURE_VOLUME)\n\t\t\td = std::max(d / 2, 1);\n\t}\n\n\tbool hasdata = slices.get(0, 0) != nullptr;\n\n\t// All mipmap levels need to be initialized - for color formats we can clear\n\t// the base mip and use glGenerateMipmap after that's done. Depth and\n\t// stencil formats don't always support glGenerateMipmap so we need to\n\t// individually clear each mip level in that case. We avoid doing that for\n\t// color formats because of an Intel driver bug:\n\t// https://github.com/love2d/love/issues/1585\n\tint clearmips = 1;\n\tif (isPixelFormatDepthStencil(format))\n\t\tclearmips = mipmapCount;\n\n\t// Create a local FBO used for glReadPixels as well as MSAA blitting.\n\tif (isRenderTarget())\n\t{\n\t\tbool clear = !hasdata;\n\t\tint slices = texType == TEXTURE_VOLUME ? depth : layers;\n\t\tframebufferStatus = createFBO(fbo, texType, format, texture, clearmips, slices, clear);\n\t}\n\telse if (!hasdata)\n\t{\n\t\t// Initialize all slices to transparent black.\n\t\tfor (int mip = 0; mip < clearmips; mip++)\n\t\t{\n\t\t\tint mipw = getPixelWidth(mip);\n\t\t\tint miph = getPixelHeight(mip);\n\t\t\tstd::vector<uint8> emptydata(getPixelFormatSliceSize(format, mipw, miph));\n\n\t\t\tRect r = {0, 0, mipw, miph};\n\t\t\tint slices = texType == TEXTURE_VOLUME ? getDepth(mip) : layers;\n\t\t\tslices = texType == TEXTURE_CUBE ? 6 : slices;\n\t\t\tfor (int i = 0; i < slices; i++)\n\t\t\t\tuploadByteData(emptydata.data(), emptydata.size(), mip, i, r);\n\t\t}\n\t}\n\n\t// Non-readable textures can't have mipmaps (enforced in the base class),\n\t// so generateMipmaps here is fine - when they aren't already initialized.\n\tif (clearmips < mipmapCount && slices.getMipmapCount() <= 1 && getMipmapsMode() != MIPMAPS_NONE)\n\t\tgenerateMipmaps();\n}\n\nbool Texture::loadVolatile()\n{\n\tif (texture != 0 || renderbuffer != 0)\n\t\treturn true;\n\n\tif (parentView.texture != this)\n\t{\n\t\tTexture *basetex = (Texture *) parentView.texture;\n\t\tbasetex->loadVolatile();\n\t}\n\n\tOpenGL::TempDebugGroup debuggroup(\"Texture load\");\n\n\tactualSamples = std::max(1, std::min(getRequestedMSAA(), gl.getMaxSamples()));\n\n\twhile (glGetError() != GL_NO_ERROR); // Clear errors.\n\n\tframebufferStatus = GL_FRAMEBUFFER_COMPLETE;\n\ttextureGLError = GL_NO_ERROR;\n\n\tif (isReadable())\n\t\tcreateTexture();\n\n\tif (framebufferStatus == GL_FRAMEBUFFER_COMPLETE && (!isReadable() || actualSamples > 1))\n\t\tframebufferStatus = newRenderbuffer(pixelWidth, pixelHeight, actualSamples, format, renderbuffer);\n\n\ttextureGLError = glGetError();\n\n\tif (framebufferStatus != GL_FRAMEBUFFER_COMPLETE || textureGLError != GL_NO_ERROR)\n\t{\n\t\tunloadVolatile();\n\t\treturn false;\n\t}\n\n\tif (!debugName.empty() && (GLAD_VERSION_4_3 || GLAD_ES_VERSION_3_2))\n\t{\n\t\tif (texture)\n\t\t\tglObjectLabel(GL_TEXTURE, texture, -1, debugName.c_str());\n\n\t\tif (renderbuffer)\n\t\t{\n\t\t\tstd::string rname = debugName;\n\t\t\tif (actualSamples > 1)\n\t\t\t\trname += \" (MSAA buffer)\";\n\t\t\tglObjectLabel(GL_RENDERBUFFER, renderbuffer, -1, rname.c_str());\n\t\t}\n\t}\n\n\tif (parentView.texture == this)\n\t\tupdateGraphicsMemorySize(true);\n\n\treturn true;\n}\n\nvoid Texture::unloadVolatile()\n{\n\tif (isRenderTarget() && (fbo != 0 || renderbuffer != 0 || texture != 0))\n\t{\n\t\t// This is a bit ugly, but we need some way to destroy the cached FBO\n\t\t// when this texture's GL object is destroyed.\n\t\tauto gfx = Module::getInstance<Graphics>(Module::M_GRAPHICS);\n\t\tif (gfx != nullptr)\n\t\t\tgfx->cleanupRenderTexture(this);\n\t}\n\n\tif (fbo != 0)\n\t\tgl.deleteFramebuffer(fbo);\n\n\tif (renderbuffer != 0)\n\t\tglDeleteRenderbuffers(1, &renderbuffer);\n\n\tif (texture != 0)\n\t\tgl.deleteTexture(texture);\n\n\tfbo = 0;\n\trenderbuffer = 0;\n\ttexture = 0;\n\n\tupdateGraphicsMemorySize(false);\n}\n\nvoid Texture::uploadByteData(const void *data, size_t size, int level, int slice, const Rect &r)\n{\n\tOpenGL::TempDebugGroup debuggroup(\"Texture data upload\");\n\n\tgl.bindTextureToUnit(this, 0, false);\n\n\tOpenGL::TextureFormat fmt = OpenGL::convertPixelFormat(format);\n\tGLenum gltarget = OpenGL::getGLTextureType(texType);\n\n\tif (texType == TEXTURE_CUBE)\n\t\tgltarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X + slice;\n\n\tif (isPixelFormatCompressed(format))\n\t{\n\t\tif (texType == TEXTURE_2D || texType == TEXTURE_CUBE)\n\t\t\tglCompressedTexSubImage2D(gltarget, level, r.x, r.y, r.w, r.h, fmt.internalformat, size, data);\n\t\telse if (texType == TEXTURE_2D_ARRAY || texType == TEXTURE_VOLUME)\n\t\t\tglCompressedTexSubImage3D(gltarget, level, r.x, r.y, slice, r.w, r.h, 1, fmt.internalformat, size, data);\n\t}\n\telse\n\t{\n\t\tif (texType == TEXTURE_2D || texType == TEXTURE_CUBE)\n\t\t\tglTexSubImage2D(gltarget, level, r.x, r.y, r.w, r.h, fmt.externalformat, fmt.type, data);\n\t\telse if (texType == TEXTURE_2D_ARRAY || texType == TEXTURE_VOLUME)\n\t\t\tglTexSubImage3D(gltarget, level, r.x, r.y, slice, r.w, r.h, 1, fmt.externalformat, fmt.type, data);\n\t}\n}\n\nvoid Texture::generateMipmapsInternal()\n{\n\tgl.bindTextureToUnit(this, 0, false);\n\n\tGLenum gltextype = OpenGL::getGLTextureType(texType);\n\n\tif (gl.bugs.generateMipmapsRequiresTexture2DEnable)\n\t\tglEnable(gltextype);\n\n\tglGenerateMipmap(gltextype);\n}\n\nvoid Texture::readbackInternal(int slice, int mipmap, const Rect &rect, int destwidth, size_t size, void *dest)\n{\n\t// Not supported in GL with compressed textures...\n\tif (!isCompressed())\n\t\tglPixelStorei(GL_PACK_ROW_LENGTH, destwidth);\n\n\tgl.bindTextureToUnit(this, 0, false);\n\n\tOpenGL::TextureFormat fmt = gl.convertPixelFormat(format);\n\n\tif (gl.isCopyTextureToBufferSupported())\n\t{\n\t\tif (isCompressed())\n\t\t\tglGetCompressedTextureSubImage(texture, mipmap, rect.x, rect.y, slice, rect.w, rect.h, 1, size, dest);\n\t\telse\n\t\t\tglGetTextureSubImage(texture, mipmap, rect.x, rect.y, slice, rect.w, rect.h, 1, fmt.externalformat, fmt.type, size, dest);\n\t}\n\telse if (fbo)\n\t{\n\t\tGLuint current_fbo = gl.getFramebuffer(OpenGL::FRAMEBUFFER_ALL);\n\t\tgl.bindFramebuffer(OpenGL::FRAMEBUFFER_ALL, getFBO());\n\n\t\tif (slice > 0 || mipmap > 0)\n\t\t{\n\t\t\tint layer = texType == TEXTURE_CUBE ? 0 : slice;\n\t\t\tint face = texType == TEXTURE_CUBE ? slice : 0;\n\t\t\tgl.framebufferTexture(GL_COLOR_ATTACHMENT0, texType, texture, mipmap, layer, face);\n\t\t}\n\n\t\tglReadPixels(rect.x, rect.y, rect.w, rect.h, fmt.externalformat, fmt.type, dest);\n\n\t\tif (slice > 0 || mipmap > 0)\n\t\t\tgl.framebufferTexture(GL_COLOR_ATTACHMENT0, texType, texture, 0, 0, 0);\n\n\t\tgl.bindFramebuffer(OpenGL::FRAMEBUFFER_ALL, current_fbo);\n\t}\n\n\tif (!isCompressed())\n\t\tglPixelStorei(GL_PACK_ROW_LENGTH, 0);\n}\n\nvoid Texture::copyFromBuffer(love::graphics::Buffer *source, size_t sourceoffset, int sourcewidth, size_t size, int slice, int mipmap, const Rect &rect)\n{\n\t// Higher level code does validation.\n\n\tGLuint glbuffer = (GLuint) source->getHandle();\n\tglBindBuffer(GL_PIXEL_UNPACK_BUFFER, glbuffer);\n\n\tif (!isCompressed()) // Not supported in GL with compressed textures...\n\t\tglPixelStorei(GL_UNPACK_ROW_LENGTH, sourcewidth);\n\n\t// glTexSubImage and friends copy from the active pixel_unpack_buffer by\n\t// treating the pointer as a byte offset.\n\tconst uint8 *byteoffset = (const uint8 *)(ptrdiff_t)sourceoffset;\n\tuploadByteData(byteoffset, size, mipmap, slice, rect);\n\n\tglPixelStorei(GL_UNPACK_ROW_LENGTH, 0);\n\tglBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);\n}\n\nvoid Texture::copyToBuffer(love::graphics::Buffer *dest, int slice, int mipmap, const Rect &rect, size_t destoffset, int destwidth, size_t size)\n{\n\t// Higher level code does validation.\n\n\tGLuint glbuffer = (GLuint) dest->getHandle();\n\tglBindBuffer(GL_PIXEL_PACK_BUFFER, glbuffer);\n\n\t// glTexSubImage and friends copy to the active PIXEL_PACK_BUFFER by\n\t// treating the pointer as a byte offset.\n\tuint8 *byteoffset = (uint8 *)(ptrdiff_t)destoffset;\n\n\treadbackInternal(slice, mipmap, rect, destwidth, size, byteoffset);\n\n\tglBindBuffer(GL_PIXEL_PACK_BUFFER, 0);\n}\n\nvoid Texture::setSamplerState(const SamplerState &s)\n{\n\tsamplerState = validateSamplerState(s);\n\n\tgl.bindTextureToUnit(this, 0, false);\n\tgl.setSamplerState(texType, samplerState);\n}\n\nptrdiff_t Texture::getHandle() const\n{\n\treturn texture;\n}\n\nptrdiff_t Texture::getRenderTargetHandle() const\n{\n\treturn renderTarget ? (renderbuffer != 0 ? renderbuffer : texture) : 0;\n}\n\n} // opengl\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/opengl/Texture.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"graphics/Texture.h\"\n#include \"graphics/Volatile.h\"\n\n// OpenGL\n#include \"OpenGL.h\"\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace opengl\n{\n\nclass Texture final : public love::graphics::Texture, public Volatile\n{\npublic:\n\n\tTexture(love::graphics::Graphics *gfx, const Settings &settings, const Slices *data);\n\tTexture(love::graphics::Graphics *gfx, love::graphics::Texture *base, const Texture::ViewSettings &viewsettings);\n\n\tvirtual ~Texture();\n\n\t// Implements Volatile.\n\tbool loadVolatile() override;\n\tvoid unloadVolatile() override;\n\n\tvoid copyFromBuffer(love::graphics::Buffer *source, size_t sourceoffset, int sourcewidth, size_t size, int slice, int mipmap, const Rect &rect) override;\n\tvoid copyToBuffer(love::graphics::Buffer *dest, int slice, int mipmap, const Rect &rect, size_t destoffset, int destwidth, size_t size) override;\n\n\tvoid setSamplerState(const SamplerState &s) override;\n\n\tptrdiff_t getHandle() const override;\n\tptrdiff_t getRenderTargetHandle() const override;\n\tptrdiff_t getSamplerHandle() const override { return 0; }\n\tint getMSAA() const override { return actualSamples; }\n\n\tinline GLuint getFBO() const { return fbo; }\n\n\tvoid readbackInternal(int slice, int mipmap, const Rect &rect, int destwidth, size_t size, void *dest);\n\nprivate:\n\n\tvoid createTexture();\n\n\tvoid uploadByteData(const void *data, size_t size, int level, int slice, const Rect &r) override;\n\n\tvoid generateMipmapsInternal() override;\n\n\tSlices slices;\n\n\tGLuint fbo;\n\n\tGLuint texture;\n\tGLuint renderbuffer;\n\n\tGLenum framebufferStatus;\n\tGLenum textureGLError;\n\n\tint actualSamples;\n}; // Texture\n\n} // opengl\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/renderstate.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"renderstate.h\"\n#include \"common/StringMap.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\n// These are all with premultiplied alpha. computeBlendState adjusts for\n// alpha-multiply if needed.\nstatic const BlendState blendStates[BLEND_MAX_ENUM] =\n{\n\t// BLEND_ALPHA\n\t{BLENDOP_ADD, BLENDOP_ADD, BLENDFACTOR_ONE, BLENDFACTOR_ONE, BLENDFACTOR_ONE_MINUS_SRC_ALPHA, BLENDFACTOR_ONE_MINUS_SRC_ALPHA},\n\n\t// BLEND_ADD\n\t{BLENDOP_ADD, BLENDOP_ADD, BLENDFACTOR_ONE, BLENDFACTOR_ZERO, BLENDFACTOR_ONE, BLENDFACTOR_ONE},\n\n\t// BLEND_SUBTRACT\n\t{BLENDOP_REVERSE_SUBTRACT, BLENDOP_REVERSE_SUBTRACT, BLENDFACTOR_ONE, BLENDFACTOR_ZERO, BLENDFACTOR_ONE, BLENDFACTOR_ONE},\n\n\t// BLEND_MULTIPLY\n\t{BLENDOP_ADD, BLENDOP_ADD, BLENDFACTOR_DST_COLOR, BLENDFACTOR_DST_COLOR, BLENDFACTOR_ZERO, BLENDFACTOR_ZERO},\n\n\t// BLEND_LIGHTEN\n\t{BLENDOP_MAX, BLENDOP_MAX, BLENDFACTOR_ZERO, BLENDFACTOR_ZERO, BLENDFACTOR_ONE, BLENDFACTOR_ONE},\n\n\t// BLEND_DARKEN\n\t{BLENDOP_MIN, BLENDOP_MIN, BLENDFACTOR_ZERO, BLENDFACTOR_ZERO, BLENDFACTOR_ONE, BLENDFACTOR_ONE},\n\n\t// BLEND_SCREEN\n\t{BLENDOP_ADD, BLENDOP_ADD, BLENDFACTOR_ONE, BLENDFACTOR_ONE, BLENDFACTOR_ONE_MINUS_SRC_COLOR, BLENDFACTOR_ONE_MINUS_SRC_COLOR},\n\n\t// BLEND_REPLACE\n\t{BLENDOP_ADD, BLENDOP_ADD, BLENDFACTOR_ONE, BLENDFACTOR_ONE, BLENDFACTOR_ZERO, BLENDFACTOR_ZERO},\n\n\t// BLEND_NONE\n\t{},\n\n\t// BLEND_CUSTOM - N/A\n\t{},\n};\n\nBlendState computeBlendState(BlendMode mode, BlendAlpha alphamode)\n{\n\tBlendState s = blendStates[mode];\n\n\t// We can only do alpha-multiplication when srcRGB would have been unmodified.\n\tif (s.srcFactorRGB == BLENDFACTOR_ONE && alphamode == BLENDALPHA_MULTIPLY && mode != BLEND_NONE)\n\t\ts.srcFactorRGB = BLENDFACTOR_SRC_ALPHA;\n\n\treturn s;\n}\n\nBlendMode computeBlendMode(BlendState s, BlendAlpha &alphamode)\n{\n\tif (!s.enable)\n\t{\n\t\talphamode = BLENDALPHA_PREMULTIPLIED;\n\t\treturn BLEND_NONE;\n\t}\n\n\t// Temporarily disable alpha multiplication when comparing to our list.\n\tbool alphamultiply = s.srcFactorRGB == BLENDFACTOR_SRC_ALPHA;\n\tif (alphamultiply)\n\t\ts.srcFactorRGB = BLENDFACTOR_ONE;\n\n\tfor (int i = 0; i < (int) BLEND_MAX_ENUM; i++)\n\t{\n\t\tif (i != (int) BLEND_CUSTOM && blendStates[i] == s)\n\t\t{\n\t\t\talphamode = alphamultiply ? BLENDALPHA_MULTIPLY : BLENDALPHA_PREMULTIPLIED;\n\t\t\treturn (BlendMode) i;\n\t\t}\n\t}\n\n\talphamode = BLENDALPHA_PREMULTIPLIED;\n\treturn BLEND_CUSTOM;\n}\n\nbool isAlphaMultiplyBlendSupported(BlendMode mode)\n{\n\tswitch (mode)\n\t{\n\tcase BLEND_LIGHTEN:\n\tcase BLEND_DARKEN:\n\tcase BLEND_MULTIPLY:\n\t\treturn false;\n\tdefault:\n\t\treturn true;\n\t}\n}\n\nstatic const StencilState stencilStates[STENCIL_MODE_MAX_ENUM] =\n{\n\t// STENCIL_MODE_OFF\n\t{},\n\n\t// STENCIL_MODE_DRAW\n\t{COMPARE_ALWAYS, STENCIL_REPLACE},\n\n\t// STENCIL_MODE_TEST\n\t{COMPARE_EQUAL, STENCIL_KEEP},\n\n\t// STENCIL_MODE_CUSTOM - N/A\n\t{},\n};\n\nStencilState computeStencilState(StencilMode mode, int value)\n{\n\tStencilState s = stencilStates[mode];\n\ts.value = value;\n\treturn s;\n}\n\nStencilMode computeStencilMode(const StencilState &s)\n{\n\tfor (int i = 0; i < (int)STENCIL_MODE_MAX_ENUM; i++)\n\t{\n\t\tif (stencilStates[i].action == s.action && stencilStates[i].compare == s.compare)\n\t\t\treturn (StencilMode) i;\n\t}\n\n\treturn STENCIL_MODE_CUSTOM;\n}\n\nCompareMode getReversedCompareMode(CompareMode mode)\n{\n\tswitch (mode)\n\t{\n\t\tcase COMPARE_LESS: return COMPARE_GREATER;\n\t\tcase COMPARE_LEQUAL: return COMPARE_GEQUAL;\n\t\tcase COMPARE_GEQUAL: return COMPARE_LEQUAL;\n\t\tcase COMPARE_GREATER: return COMPARE_LESS;\n\t\tdefault: return mode;\n\t}\n}\n\nSTRINGMAP_BEGIN(BlendMode, BLEND_MAX_ENUM, blendMode)\n{\n\t{ \"alpha\",    BLEND_ALPHA    },\n\t{ \"add\",      BLEND_ADD      },\n\t{ \"subtract\", BLEND_SUBTRACT },\n\t{ \"multiply\", BLEND_MULTIPLY },\n\t{ \"lighten\",  BLEND_LIGHTEN  },\n\t{ \"darken\",   BLEND_DARKEN   },\n\t{ \"screen\",   BLEND_SCREEN   },\n\t{ \"replace\",  BLEND_REPLACE  },\n\t{ \"none\",     BLEND_NONE     },\n\t{ \"custom\",   BLEND_CUSTOM   },\n}\nSTRINGMAP_END(BlendMode, BLEND_MAX_ENUM, blendMode)\n\nSTRINGMAP_BEGIN(BlendAlpha, BLENDALPHA_MAX_ENUM, blendAlpha)\n{\n\t{ \"alphamultiply\", BLENDALPHA_MULTIPLY      },\n\t{ \"premultiplied\", BLENDALPHA_PREMULTIPLIED },\n}\nSTRINGMAP_END(BlendAlpha, BLENDALPHA_MAX_ENUM, blendAlpha)\n\nSTRINGMAP_BEGIN(BlendFactor, BLENDFACTOR_MAX_ENUM, blendFactor)\n{\n\t{ \"zero\",              BLENDFACTOR_ZERO                 },\n\t{ \"one\",               BLENDFACTOR_ONE                  },\n\t{ \"srccolor\",          BLENDFACTOR_SRC_COLOR            },\n\t{ \"oneminussrccolor\",  BLENDFACTOR_ONE_MINUS_SRC_COLOR  },\n\t{ \"srcalpha\",          BLENDFACTOR_SRC_ALPHA            },\n\t{ \"oneminussrcalpha\",  BLENDFACTOR_ONE_MINUS_SRC_ALPHA  },\n\t{ \"dstcolor\",          BLENDFACTOR_DST_COLOR            },\n\t{ \"oneminusdstcolor\",  BLENDFACTOR_ONE_MINUS_DST_COLOR  },\n\t{ \"dstalpha\",          BLENDFACTOR_DST_ALPHA            },\n\t{ \"oneminusdstalpha\",  BLENDFACTOR_ONE_MINUS_DST_ALPHA  },\n\t{ \"srcalphasaturated\", BLENDFACTOR_SRC_ALPHA_SATURATED  },\n}\nSTRINGMAP_END(BlendFactor, BLENDFACTOR_MAX_ENUM, blendFactor)\n\nSTRINGMAP_BEGIN(BlendOperation, BLENDOP_MAX_ENUM, blendOperation)\n{\n\t{ \"add\",             BLENDOP_ADD              },\n\t{ \"subtract\",        BLENDOP_SUBTRACT         },\n\t{ \"reversesubtract\", BLENDOP_REVERSE_SUBTRACT },\n\t{ \"min\",             BLENDOP_MIN              },\n\t{ \"max\",             BLENDOP_MAX              },\n}\nSTRINGMAP_END(BlendOperation, BLENDOP_MAX_ENUM, blendOperation)\n\nSTRINGMAP_BEGIN(StencilMode, STENCIL_MODE_MAX_ENUM, stencilMode)\n{\n\t{ \"off\",    STENCIL_MODE_OFF    },\n\t{ \"draw\",   STENCIL_MODE_DRAW   },\n\t{ \"test\",   STENCIL_MODE_TEST   },\n\t{ \"custom\", STENCIL_MODE_CUSTOM },\n}\nSTRINGMAP_END(StencilMode, STENCIL_MODE_MAX_ENUM, stencilMode)\n\nSTRINGMAP_BEGIN(StencilAction, STENCIL_MAX_ENUM, stencilAction)\n{\n\t{ \"keep\",          STENCIL_KEEP           },\n\t{ \"zero\",          STENCIL_ZERO           },\n\t{ \"replace\",       STENCIL_REPLACE        },\n\t{ \"increment\",     STENCIL_INCREMENT      },\n\t{ \"decrement\",     STENCIL_DECREMENT      },\n\t{ \"incrementwrap\", STENCIL_INCREMENT_WRAP },\n\t{ \"decrementwrap\", STENCIL_DECREMENT_WRAP },\n\t{ \"invert\",        STENCIL_INVERT         },\n}\nSTRINGMAP_END(StencilAction, STENCIL_MAX_ENUM, stencilAction)\n\nSTRINGMAP_BEGIN(CompareMode, COMPARE_MAX_ENUM, compareMode)\n{\n\t{ \"less\",     COMPARE_LESS     },\n\t{ \"lequal\",   COMPARE_LEQUAL   },\n\t{ \"equal\",    COMPARE_EQUAL    },\n\t{ \"gequal\",   COMPARE_GEQUAL   },\n\t{ \"greater\",  COMPARE_GREATER  },\n\t{ \"notequal\", COMPARE_NOTEQUAL },\n\t{ \"always\",   COMPARE_ALWAYS   },\n\t{ \"never\",    COMPARE_NEVER    },\n}\nSTRINGMAP_END(CompareMode, COMPARE_MAX_ENUM, compareMode)\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/renderstate.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"common/int.h\"\n#include \"common/math.h\"\n#include \"common/StringMap.h\"\n#include \"vertex.h\"\n\n#include <vector>\n#include <string>\n\nnamespace love\n{\nnamespace graphics\n{\n\nclass Shader;\n\nenum BlendMode // High level wrappers. Order is important (see renderstate.cpp)\n{\n\tBLEND_ALPHA,\n\tBLEND_ADD,\n\tBLEND_SUBTRACT,\n\tBLEND_MULTIPLY,\n\tBLEND_LIGHTEN,\n\tBLEND_DARKEN,\n\tBLEND_SCREEN,\n\tBLEND_REPLACE,\n\tBLEND_NONE,\n\tBLEND_CUSTOM,\n\tBLEND_MAX_ENUM\n};\n\nenum BlendAlpha // High level wrappers\n{\n\tBLENDALPHA_MULTIPLY,\n\tBLENDALPHA_PREMULTIPLIED,\n\tBLENDALPHA_MAX_ENUM\n};\n\nenum BlendFactor\n{\n\tBLENDFACTOR_ZERO,\n\tBLENDFACTOR_ONE,\n\tBLENDFACTOR_SRC_COLOR,\n\tBLENDFACTOR_ONE_MINUS_SRC_COLOR,\n\tBLENDFACTOR_SRC_ALPHA,\n\tBLENDFACTOR_ONE_MINUS_SRC_ALPHA,\n\tBLENDFACTOR_DST_COLOR,\n\tBLENDFACTOR_ONE_MINUS_DST_COLOR,\n\tBLENDFACTOR_DST_ALPHA,\n\tBLENDFACTOR_ONE_MINUS_DST_ALPHA,\n\tBLENDFACTOR_SRC_ALPHA_SATURATED,\n\tBLENDFACTOR_MAX_ENUM\n};\n\nenum BlendOperation\n{\n\tBLENDOP_ADD,\n\tBLENDOP_SUBTRACT,\n\tBLENDOP_REVERSE_SUBTRACT,\n\tBLENDOP_MIN,\n\tBLENDOP_MAX,\n\tBLENDOP_MAX_ENUM\n};\n\nenum StencilMode // High level wrappers.\n{\n\tSTENCIL_MODE_OFF,\n\tSTENCIL_MODE_DRAW,\n\tSTENCIL_MODE_TEST,\n\tSTENCIL_MODE_CUSTOM,\n\tSTENCIL_MODE_MAX_ENUM\n};\n\nenum StencilAction\n{\n\tSTENCIL_KEEP,\n\tSTENCIL_ZERO,\n\tSTENCIL_REPLACE,\n\tSTENCIL_INCREMENT,\n\tSTENCIL_DECREMENT,\n\tSTENCIL_INCREMENT_WRAP,\n\tSTENCIL_DECREMENT_WRAP,\n\tSTENCIL_INVERT,\n\tSTENCIL_MAX_ENUM\n};\n\nenum CompareMode\n{\n\tCOMPARE_LESS,\n\tCOMPARE_LEQUAL,\n\tCOMPARE_EQUAL,\n\tCOMPARE_GEQUAL,\n\tCOMPARE_GREATER,\n\tCOMPARE_NOTEQUAL,\n\tCOMPARE_ALWAYS,\n\tCOMPARE_NEVER,\n\tCOMPARE_MAX_ENUM\n};\n\nstruct BlendState\n{\n\tBlendOperation operationRGB = BLENDOP_ADD;\n\tBlendOperation operationA = BLENDOP_ADD;\n\tBlendFactor srcFactorRGB = BLENDFACTOR_ONE;\n\tBlendFactor srcFactorA = BLENDFACTOR_ONE;\n\tBlendFactor dstFactorRGB = BLENDFACTOR_ZERO;\n\tBlendFactor dstFactorA = BLENDFACTOR_ZERO;\n\tbool enable = false;\n\n\tBlendState() {}\n\n\tBlendState(BlendOperation opRGB, BlendOperation opA, BlendFactor srcRGB, BlendFactor srcA, BlendFactor dstRGB, BlendFactor dstA)\n\t\t: operationRGB(opRGB)\n\t\t, operationA(opA)\n\t\t, srcFactorRGB(srcRGB)\n\t\t, srcFactorA(srcA)\n\t\t, dstFactorRGB(dstRGB)\n\t\t, dstFactorA(dstA)\n\t\t, enable(true)\n\t{}\n\n\tbool operator == (const BlendState &b) const\n\t{\n\t\treturn enable == b.enable\n\t\t\t&& operationRGB == b.operationRGB && operationA == b.operationA\n\t\t\t&& srcFactorRGB == b.srcFactorRGB && srcFactorA == b.srcFactorA\n\t\t\t&& dstFactorRGB == b.dstFactorRGB && dstFactorA == b.dstFactorA;\n\t}\n\n\tuint32 toKey() const\n\t{\n\t\treturn (dstFactorA << 0) | (dstFactorRGB << 4) | (srcFactorA << 8) | (srcFactorRGB << 12)\n\t\t\t| (operationA << 16) | (operationRGB << 20) | ((enable ? 1 : 0) << 24);\n\t}\n\n\tstatic BlendState fromKey(uint32 key)\n\t{\n\t\tBlendState b;\n\t\tb.enable = (bool)((key >> 24) & 1);\n\t\tb.operationRGB = (BlendOperation)((key >> 20) & 0x7);\n\t\tb.operationA = (BlendOperation)((key >> 16) & 0x7);\n\t\tb.srcFactorRGB = (BlendFactor)((key >> 12) & 0xF);\n\t\tb.srcFactorA = (BlendFactor)((key >> 8) & 0xF);\n\t\tb.dstFactorRGB = (BlendFactor)((key >> 4) & 0xF);\n\t\tb.dstFactorA = (BlendFactor)((key >> 0) & 0xF);\n\t\treturn b;\n\t}\n};\n\nstruct DepthState\n{\n\tCompareMode compare = COMPARE_ALWAYS;\n\tbool write = false;\n\n\tbool operator == (const DepthState &d) const\n\t{\n\t\treturn compare == d.compare && write == d.write;\n\t}\n};\n\nstruct StencilState\n{\n\tCompareMode compare = COMPARE_ALWAYS;\n\tStencilAction action = STENCIL_KEEP;\n\tint value = 0;\n\tuint32 readMask = 0xFFFFFFFF;\n\tuint32 writeMask = 0xFFFFFFFF;\n\n\tbool operator == (const StencilState &s) const\n\t{\n\t\treturn compare == s.compare && action == s.action && value == s.value\n\t\t\t&& readMask == s.readMask && writeMask == s.writeMask;\n\t}\n};\n\nstruct ColorChannelMask\n{\n\tbool r = true;\n\tbool g = true;\n\tbool b = true;\n\tbool a = true;\n\n\tbool operator == (ColorChannelMask c) const\n\t{\n\t\treturn r == c.r && g == c.g && b == c.b && a == c.a;\n\t}\n\n\tbool operator != (ColorChannelMask c) const\n\t{\n\t\treturn !(operator==(c));\n\t}\n};\n\nstruct ScissorState\n{\n\tRect rect = {0, 0, 0, 0};\n\tbool enable = false;\n};\n\nBlendState computeBlendState(BlendMode mode, BlendAlpha alphamode);\nBlendMode computeBlendMode(BlendState s, BlendAlpha &alphamode);\nbool isAlphaMultiplyBlendSupported(BlendMode mode);\n\nStencilState computeStencilState(StencilMode mode, int value);\nStencilMode computeStencilMode(const StencilState &s);\n\n/**\n * GPU APIs do the comparison in the opposite way of what makes sense for some\n * of love's APIs. For example in OpenGL if the compare function is GL_GREATER,\n * then the stencil test will pass if the reference value is greater than the\n * value in the stencil buffer. With our stencil API it's more intuitive to\n * assume that setStencilTest(COMPARE_GREATER, 4) will make it pass if the\n * stencil buffer has a value greater than 4.\n **/\nCompareMode getReversedCompareMode(CompareMode mode);\n\nSTRINGMAP_DECLARE(BlendMode);\nSTRINGMAP_DECLARE(BlendAlpha);\nSTRINGMAP_DECLARE(BlendFactor);\nSTRINGMAP_DECLARE(BlendOperation);\nSTRINGMAP_DECLARE(StencilMode);\nSTRINGMAP_DECLARE(StencilAction);\nSTRINGMAP_DECLARE(CompareMode);\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/vertex.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"vertex.h\"\n#include \"common/StringMap.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nstatic_assert(sizeof(VertexAttributeInfo) == 4, \"Unexpected sizeof(VertexAttributeInfo)\");\n\nstatic_assert(sizeof(Color32) == 4, \"sizeof(Color32) incorrect!\");\nstatic_assert(sizeof(STf_RGBAub) == sizeof(float)*2 + sizeof(Color32), \"sizeof(STf_RGBAub) incorrect!\");\nstatic_assert(sizeof(STPf_RGBAub) == sizeof(float)*3 + sizeof(Color32), \"sizeof(STPf_RGBAub) incorrect!\");\nstatic_assert(sizeof(XYf_STf) == sizeof(float)*2 + sizeof(float)*2, \"sizeof(XYf_STf) incorrect!\");\nstatic_assert(sizeof(XYf_STPf) == sizeof(float)*2 + sizeof(float)*3, \"sizeof(XYf_STPf) incorrect!\");\nstatic_assert(sizeof(XYf_STf_RGBAub) == sizeof(float)*2 + sizeof(float)*2 + sizeof(Color32), \"sizeof(XYf_STf_RGBAub) incorrect!\");\nstatic_assert(sizeof(XYf_STus_RGBAub) == sizeof(float)*2 + sizeof(uint16)*2 + sizeof(Color32), \"sizeof(XYf_STus_RGBAub) incorrect!\");\nstatic_assert(sizeof(XYf_STPf_RGBAub) == sizeof(float)*2 + sizeof(float)*3 + sizeof(Color32), \"sizeof(XYf_STPf_RGBAub) incorrect!\");\n\nsize_t getFormatStride(CommonFormat format)\n{\n\tswitch (format)\n\t{\n\t\tcase CommonFormat::NONE: return 0;\n\t\tcase CommonFormat::XYf: return sizeof(float) * 2;\n\t\tcase CommonFormat::XYZf: return sizeof(float) * 3;\n\t\tcase CommonFormat::RGBAub: return sizeof(uint8) * 4;\n\t\tcase CommonFormat::STf_RGBAub: return sizeof(STf_RGBAub);\n\t\tcase CommonFormat::STPf_RGBAub: return sizeof(STPf_RGBAub);\n\t\tcase CommonFormat::XYf_STf: return sizeof(XYf_STf);\n\t\tcase CommonFormat::XYf_STPf: return sizeof(XYf_STPf);\n\t\tcase CommonFormat::XYf_STf_RGBAub: return sizeof(XYf_STf_RGBAub);\n\t\tcase CommonFormat::XYf_STus_RGBAub: return sizeof(XYf_STus_RGBAub);\n\t\tcase CommonFormat::XYf_STPf_RGBAub: return sizeof(XYf_STPf_RGBAub);\n\t\tcase CommonFormat::COUNT: return 0;\n\t}\n\treturn 0;\n}\n\nuint32 getFormatFlags(CommonFormat format)\n{\n\tswitch (format)\n\t{\n\tcase CommonFormat::NONE:\n\t\treturn 0;\n\tcase CommonFormat::XYf:\n\tcase CommonFormat::XYZf:\n\t\treturn ATTRIBFLAG_POS;\n\tcase CommonFormat::RGBAub:\n\t\treturn ATTRIBFLAG_COLOR;\n\tcase CommonFormat::STf_RGBAub:\n\tcase CommonFormat::STPf_RGBAub:\n\t\treturn ATTRIBFLAG_TEXCOORD | ATTRIBFLAG_COLOR;\n\tcase CommonFormat::XYf_STf:\n\tcase CommonFormat::XYf_STPf:\n\t\treturn ATTRIBFLAG_POS | ATTRIBFLAG_TEXCOORD;\n\tcase CommonFormat::XYf_STf_RGBAub:\n\tcase CommonFormat::XYf_STus_RGBAub:\n\tcase CommonFormat::XYf_STPf_RGBAub:\n\t\treturn ATTRIBFLAG_POS | ATTRIBFLAG_TEXCOORD | ATTRIBFLAG_COLOR;\n\tcase CommonFormat::COUNT:\n\t\treturn 0;\n\t}\n\treturn 0;\n}\n\nint getFormatPositionComponents(CommonFormat format)\n{\n\tswitch (format)\n\t{\n\tcase CommonFormat::NONE:\n\tcase CommonFormat::RGBAub:\n\tcase CommonFormat::STf_RGBAub:\n\tcase CommonFormat::STPf_RGBAub:\n\t\treturn 0;\n\tcase CommonFormat::XYf:\n\tcase CommonFormat::XYf_STf:\n\tcase CommonFormat::XYf_STPf:\n\tcase CommonFormat::XYf_STf_RGBAub:\n\tcase CommonFormat::XYf_STus_RGBAub:\n\tcase CommonFormat::XYf_STPf_RGBAub:\n\t\treturn 2;\n\tcase CommonFormat::XYZf:\n\t\treturn 3;\n\tcase CommonFormat::COUNT:\n\t\treturn 0;\n\t}\n\treturn 0;\n}\n\n// Order here relies on order of DataFormat enum.\nstatic const DataFormatInfo dataFormatInfo[]\n{\n\t// baseType, isMatrix, components, rows, columns, componentSize, size\n\t{ DATA_BASETYPE_FLOAT, false, 1, 0, 0, 4, 4  }, // DATAFORMAT_FLOAT\n\t{ DATA_BASETYPE_FLOAT, false, 2, 0, 0, 4, 8  }, // DATAFORMAT_FLOAT_VEC2\n\t{ DATA_BASETYPE_FLOAT, false, 3, 0, 0, 4, 12 }, // DATAFORMAT_FLOAT_VEC3\n\t{ DATA_BASETYPE_FLOAT, false, 4, 0, 0, 4, 16 }, // DATAFORMAT_FLOAT_VEC4\n\n\t{ DATA_BASETYPE_FLOAT, true, 4, 2, 2, 4, 16 }, // DATAFORMAT_FLOAT_MAT2X2\n\t{ DATA_BASETYPE_FLOAT, true, 6, 2, 3, 4, 24 }, // DATAFORMAT_FLOAT_MAT2X3\n\t{ DATA_BASETYPE_FLOAT, true, 8, 2, 4, 4, 32 }, // DATAFORMAT_FLOAT_MAT2X4\n\n\t{ DATA_BASETYPE_FLOAT, true, 6,  3, 2, 4, 24 }, // DATAFORMAT_FLOAT_MAT3X2\n\t{ DATA_BASETYPE_FLOAT, true, 9,  3, 3, 4, 36 }, // DATAFORMAT_FLOAT_MAT3X3\n\t{ DATA_BASETYPE_FLOAT, true, 12, 3, 4, 4, 48 }, // DATAFORMAT_FLOAT_MAT3X4\n\n\t{ DATA_BASETYPE_FLOAT, true, 8,  4, 2, 4, 32 }, // DATAFORMAT_FLOAT_MAT4X2\n\t{ DATA_BASETYPE_FLOAT, true, 12, 4, 3, 4, 48 }, // DATAFORMAT_FLOAT_MAT4X3\n\t{ DATA_BASETYPE_FLOAT, true, 16, 4, 4, 4, 64 }, // DATAFORMAT_FLOAT_MAT4X4\n\n\t{ DATA_BASETYPE_INT, false, 1, 0, 0, 4, 4  }, // DATAFORMAT_INT32\n\t{ DATA_BASETYPE_INT, false, 2, 0, 0, 4, 8  }, // DATAFORMAT_INT32_VEC2\n\t{ DATA_BASETYPE_INT, false, 3, 0, 0, 4, 12 }, // DATAFORMAT_INT32_VEC3\n\t{ DATA_BASETYPE_INT, false, 4, 0, 0, 4, 16 }, // DATAFORMAT_INT32_VEC4\n\n\t{ DATA_BASETYPE_UINT, false, 1, 0, 0, 4, 4  }, // DATAFORMAT_UINT32\n\t{ DATA_BASETYPE_UINT, false, 2, 0, 0, 4, 8  }, // DATAFORMAT_UINT32_VEC2\n\t{ DATA_BASETYPE_UINT, false, 3, 0, 0, 4, 12 }, // DATAFORMAT_UINT32_VEC3\n\t{ DATA_BASETYPE_UINT, false, 4, 0, 0, 4, 16 }, // DATAFORMAT_UINT32_VEC4\n\n\t{ DATA_BASETYPE_SNORM, false, 4, 0, 0, 1, 4 }, // DATAFORMAT_SNORM8_VEC4\n\t{ DATA_BASETYPE_UNORM, false, 4, 0, 0, 1, 4 }, // DATAFORMAT_UNORM8_VEC4\n\t{ DATA_BASETYPE_INT,   false, 4, 0, 0, 1, 4 }, // DATAFORMAT_INT8_VEC4\n\t{ DATA_BASETYPE_UINT,  false, 4, 0, 0, 1, 4 }, // DATAFORMAT_UINT8_VEC4\n\n\t{ DATA_BASETYPE_SNORM, false, 2, 0, 0, 2, 4 }, // DATAFORMAT_SNORM16_VEC2\n\t{ DATA_BASETYPE_SNORM, false, 4, 0, 0, 2, 8 }, // DATAFORMAT_SNORM16_VEC4\n\n\t{ DATA_BASETYPE_UNORM, false, 2, 0, 0, 2, 4 }, // DATAFORMAT_UNORM16_VEC2\n\t{ DATA_BASETYPE_UNORM, false, 4, 0, 0, 2, 8 }, // DATAFORMAT_UNORM16_VEC4\n\n\t{ DATA_BASETYPE_INT, false, 2, 0, 0, 2, 4 }, // DATAFORMAT_INT16_VEC2\n\t{ DATA_BASETYPE_INT, false, 4, 0, 0, 2, 8 }, // DATAFORMAT_INT16_VEC4\n\n\t{ DATA_BASETYPE_UINT, false, 1, 0, 0, 2, 2 }, // DATAFORMAT_UINT16\n\t{ DATA_BASETYPE_UINT, false, 2, 0, 0, 2, 4 }, // DATAFORMAT_UINT16_VEC2\n\t{ DATA_BASETYPE_UINT, false, 4, 0, 0, 2, 8 }, // DATAFORMAT_UINT16_VEC4\n\n\t{ DATA_BASETYPE_BOOL, false, 1, 0, 0, 4, 4  }, // DATAFORMAT_BOOL\n\t{ DATA_BASETYPE_BOOL, false, 2, 0, 0, 4, 8  }, // DATAFORMAT_BOOL_VEC2\n\t{ DATA_BASETYPE_BOOL, false, 3, 0, 0, 4, 12 }, // DATAFORMAT_BOOL_VEC3\n\t{ DATA_BASETYPE_BOOL, false, 4, 0, 0, 4, 16 }, // DATAFORMAT_BOOL_VEC4\n};\n\nstatic_assert((sizeof(dataFormatInfo) / sizeof(DataFormatInfo)) == DATAFORMAT_MAX_ENUM, \"dataFormatInfo array size must match number of DataFormat enum values.\");\n\nconst DataFormatInfo &getDataFormatInfo(DataFormat format)\n{\n\treturn dataFormatInfo[format];\n}\n\nsize_t getIndexDataSize(IndexDataType type)\n{\n\tswitch (type)\n\t{\n\t\tcase INDEX_UINT16: return sizeof(uint16);\n\t\tcase INDEX_UINT32: return sizeof(uint32);\n\t\tdefault: return 0;\n\t}\n}\n\nIndexDataType getIndexDataTypeFromMax(size_t maxvalue)\n{\n\treturn maxvalue > LOVE_UINT16_MAX ? INDEX_UINT32 : INDEX_UINT16;\n}\n\nDataFormat getIndexDataFormat(IndexDataType type)\n{\n\treturn type == INDEX_UINT32 ? DATAFORMAT_UINT32 : DATAFORMAT_UINT16;\n}\n\nIndexDataType getIndexDataType(DataFormat format)\n{\n\tswitch (format)\n\t{\n\t\tcase DATAFORMAT_UINT16: return INDEX_UINT16;\n\t\tcase DATAFORMAT_UINT32: return INDEX_UINT32;\n\t\tdefault: return INDEX_MAX_ENUM;\n\t}\n}\n\nint getIndexCount(TriangleIndexMode mode, int vertexCount)\n{\n\tswitch (mode)\n\t{\n\tcase TRIANGLEINDEX_NONE:\n\t\treturn 0;\n\tcase TRIANGLEINDEX_STRIP:\n\tcase TRIANGLEINDEX_FAN:\n\t\treturn 3 * (vertexCount - 2);\n\tcase TRIANGLEINDEX_QUADS:\n\t\treturn vertexCount * 6 / 4;\n\t}\n\treturn 0;\n}\n\ntemplate <typename T>\nstatic void fillIndicesT(TriangleIndexMode mode, T vertexStart, T vertexCount, T *indices)\n{\n\tswitch (mode)\n\t{\n\tcase TRIANGLEINDEX_NONE:\n\t\tbreak;\n\tcase TRIANGLEINDEX_STRIP:\n\t\t{\n\t\t\tint i = 0;\n\t\t\tfor (T index = 0; index < vertexCount - 2; index++)\n\t\t\t{\n\t\t\t\tindices[i++] = vertexStart + index;\n\t\t\t\tindices[i++] = vertexStart + index + 1 + (index & 1);\n\t\t\t\tindices[i++] = vertexStart + index + 2 - (index & 1);\n\t\t\t}\n\t\t}\n\t\tbreak;\n\tcase TRIANGLEINDEX_FAN:\n\t\t{\n\t\t\tint i = 0;\n\t\t\tfor (T index = 2; index < vertexCount; index++)\n\t\t\t{\n\t\t\t\tindices[i++] = vertexStart;\n\t\t\t\tindices[i++] = vertexStart + index - 1;\n\t\t\t\tindices[i++] = vertexStart + index;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\tcase TRIANGLEINDEX_QUADS:\n\t\t{\n\t\t\t// 0---2\n\t\t\t// | / |\n\t\t\t// 1---3\n\t\t\tint count = vertexCount / 4;\n\t\t\tfor (int i = 0; i < count; i++)\n\t\t\t{\n\t\t\t\tint ii = i * 6;\n\t\t\t\tT vi = T(vertexStart + i * 4);\n\n\t\t\t\tindices[ii + 0] = vi + 0;\n\t\t\t\tindices[ii + 1] = vi + 1;\n\t\t\t\tindices[ii + 2] = vi + 2;\n\n\t\t\t\tindices[ii + 3] = vi + 2;\n\t\t\t\tindices[ii + 4] = vi + 1;\n\t\t\t\tindices[ii + 5] = vi + 3;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\t}\n}\n\nvoid fillIndices(TriangleIndexMode mode, uint16 vertexStart, uint16 vertexCount, uint16 *indices)\n{\n\tfillIndicesT(mode, vertexStart, vertexCount, indices);\n}\n\nvoid fillIndices(TriangleIndexMode mode, uint32 vertexStart, uint32 vertexCount, uint32 *indices)\n{\n\tfillIndicesT(mode, vertexStart, vertexCount, indices);\n}\n\nvoid VertexAttributes::setCommonFormat(CommonFormat format, uint8 bufferindex)\n{\n\tsetBufferLayout(bufferindex, (uint16) getFormatStride(format));\n\n\tswitch (format)\n\t{\n\tcase CommonFormat::NONE:\n\t\tbreak;\n\tcase CommonFormat::XYf:\n\t\tset(ATTRIB_POS, DATAFORMAT_FLOAT_VEC2, 0, bufferindex);\n\t\tbreak;\n\tcase CommonFormat::XYZf:\n\t\tset(ATTRIB_POS, DATAFORMAT_FLOAT_VEC3, 0, bufferindex);\n\t\tbreak;\n\tcase CommonFormat::RGBAub:\n\t\tset(ATTRIB_COLOR, DATAFORMAT_UNORM8_VEC4, 0, bufferindex);\n\t\tbreak;\n\tcase CommonFormat::STf_RGBAub:\n\t\tset(ATTRIB_TEXCOORD, DATAFORMAT_FLOAT_VEC2, 0, bufferindex);\n\t\tset(ATTRIB_COLOR, DATAFORMAT_UNORM8_VEC4, uint16(sizeof(float) * 2), bufferindex);\n\t\tbreak;\n\tcase CommonFormat::STPf_RGBAub:\n\t\tset(ATTRIB_TEXCOORD, DATAFORMAT_FLOAT_VEC3, 0, bufferindex);\n\t\tset(ATTRIB_COLOR, DATAFORMAT_UNORM8_VEC4, uint16(sizeof(float) * 3), bufferindex);\n\t\tbreak;\n\tcase CommonFormat::XYf_STf:\n\t\tset(ATTRIB_POS, DATAFORMAT_FLOAT_VEC2, 0, bufferindex);\n\t\tset(ATTRIB_TEXCOORD, DATAFORMAT_FLOAT_VEC2, uint16(sizeof(float) * 2), bufferindex);\n\t\tbreak;\n\tcase CommonFormat::XYf_STPf:\n\t\tset(ATTRIB_POS, DATAFORMAT_FLOAT_VEC2, 0, bufferindex);\n\t\tset(ATTRIB_TEXCOORD, DATAFORMAT_FLOAT_VEC3, uint16(sizeof(float) * 2), bufferindex);\n\t\tbreak;\n\tcase CommonFormat::XYf_STf_RGBAub:\n\t\tset(ATTRIB_POS, DATAFORMAT_FLOAT_VEC2, 0, bufferindex);\n\t\tset(ATTRIB_TEXCOORD, DATAFORMAT_FLOAT_VEC2, uint16(sizeof(float) * 2), bufferindex);\n\t\tset(ATTRIB_COLOR, DATAFORMAT_UNORM8_VEC4, uint16(sizeof(float) * 4), bufferindex);\n\t\tbreak;\n\tcase CommonFormat::XYf_STus_RGBAub:\n\t\tset(ATTRIB_POS, DATAFORMAT_FLOAT_VEC2, 0, bufferindex);\n\t\tset(ATTRIB_TEXCOORD, DATAFORMAT_UNORM16_VEC2, uint16(sizeof(float) * 2), bufferindex);\n\t\tset(ATTRIB_COLOR, DATAFORMAT_UNORM8_VEC4, uint16(sizeof(float) * 2 + sizeof(uint16) * 2), bufferindex);\n\t\tbreak;\n\tcase CommonFormat::XYf_STPf_RGBAub:\n\t\tset(ATTRIB_POS, DATAFORMAT_FLOAT_VEC2, 0, bufferindex);\n\t\tset(ATTRIB_TEXCOORD, DATAFORMAT_FLOAT_VEC3, uint16(sizeof(float) * 2), bufferindex);\n\t\tset(ATTRIB_COLOR, DATAFORMAT_UNORM8_VEC4, uint16(sizeof(float) * 5), bufferindex);\n\t\tbreak;\n\tcase CommonFormat::COUNT:\n\t\tbreak;\n\t}\n}\n\nbool VertexAttributes::operator == (const VertexAttributes &other) const\n{\n\tif (enableBits != other.enableBits || instanceBits != other.instanceBits)\n\t\treturn false;\n\n\tuint32 allbits = enableBits;\n\tuint32 i = 0;\n\n\twhile (allbits)\n\t{\n\t\tif (isEnabled(i))\n\t\t{\n\t\t\tconst auto &a = attribs[i];\n\t\t\tconst auto &b = other.attribs[i];\n\t\t\tif (a.bufferIndex != b.bufferIndex || a.packedFormat != b.packedFormat || a.offsetFromVertex != b.offsetFromVertex)\n\t\t\t\treturn false;\n\n\t\t\tif (bufferLayouts[a.bufferIndex].stride != other.bufferLayouts[a.bufferIndex].stride)\n\t\t\t\treturn false;\n\t\t}\n\n\t\ti++;\n\t\tallbits >>= 1;\n\t}\n\n\treturn true;\n}\n\nSTRINGMAP_BEGIN(BuiltinVertexAttribute, ATTRIB_MAX_ENUM, attribName)\n{\n\t{ \"VertexPosition\", ATTRIB_POS           },\n\t{ \"VertexTexCoord\", ATTRIB_TEXCOORD      },\n\t{ \"VertexColor\",    ATTRIB_COLOR         },\n}\nSTRINGMAP_END(BuiltinVertexAttribute, ATTRIB_MAX_ENUM, attribName)\n\nconst char *getConstant(BuiltinVertexAttribute attrib)\n{\n\tconst char *name = nullptr;\n\tgetConstant(attrib, name);\n\treturn name;\n}\n\nSTRINGMAP_BEGIN(BufferUsage, BUFFERUSAGE_MAX_ENUM, bufferUsageName)\n{\n\t{ \"vertex\",            BUFFERUSAGE_VERTEX             },\n\t{ \"index\",             BUFFERUSAGE_INDEX              },\n\t{ \"texel\",             BUFFERUSAGE_TEXEL              },\n\t{ \"shaderstorage\",     BUFFERUSAGE_SHADER_STORAGE     },\n\t{ \"indirectarguments\", BUFFERUSAGE_INDIRECT_ARGUMENTS },\n}\nSTRINGMAP_END(BufferUsage, BUFFERUSAGE_MAX_ENUM, bufferUsageName)\n\nSTRINGMAP_BEGIN(IndexDataType, INDEX_MAX_ENUM, indexType)\n{\n\t{ \"uint16\", INDEX_UINT16 },\n\t{ \"uint32\", INDEX_UINT32 },\n}\nSTRINGMAP_END(IndexDataType, INDEX_MAX_ENUM, indexType)\n\nSTRINGMAP_BEGIN(BufferDataUsage, BUFFERDATAUSAGE_MAX_ENUM, bufferDataUsage)\n{\n\t{ \"stream\",   BUFFERDATAUSAGE_STREAM   },\n\t{ \"dynamic\",  BUFFERDATAUSAGE_DYNAMIC  },\n\t{ \"static\",   BUFFERDATAUSAGE_STATIC   },\n\t{ \"readback\", BUFFERDATAUSAGE_READBACK },\n}\nSTRINGMAP_END(BufferDataUsage, BUFFERDATAUSAGE_MAX_ENUM, bufferDataUsage)\n\nSTRINGMAP_BEGIN(PrimitiveType, PRIMITIVE_MAX_ENUM, primitiveType)\n{\n\t{ \"fan\",       PRIMITIVE_TRIANGLE_FAN   },\n\t{ \"strip\",     PRIMITIVE_TRIANGLE_STRIP },\n\t{ \"triangles\", PRIMITIVE_TRIANGLES      },\n\t{ \"points\",    PRIMITIVE_POINTS         },\n}\nSTRINGMAP_END(PrimitiveType, PRIMITIVE_MAX_ENUM, primitiveType)\n\nSTRINGMAP_BEGIN(AttributeStep, STEP_MAX_ENUM, attributeStep)\n{\n\t{ \"pervertex\",   STEP_PER_VERTEX   },\n\t{ \"perinstance\", STEP_PER_INSTANCE },\n}\nSTRINGMAP_END(AttributeStep, STEP_MAX_ENUM, attributeStep)\n\nSTRINGMAP_BEGIN(DataFormat, DATAFORMAT_MAX_ENUM, dataFormat)\n{\n\t{ \"float\",     DATAFORMAT_FLOAT      },\n\t{ \"floatvec2\", DATAFORMAT_FLOAT_VEC2 },\n\t{ \"floatvec3\", DATAFORMAT_FLOAT_VEC3 },\n\t{ \"floatvec4\", DATAFORMAT_FLOAT_VEC4 },\n\n\t{ \"floatmat2x2\", DATAFORMAT_FLOAT_MAT2X2 },\n\t{ \"floatmat2x3\", DATAFORMAT_FLOAT_MAT2X3 },\n\t{ \"floatmat2x4\", DATAFORMAT_FLOAT_MAT2X4 },\n\n\t{ \"floatmat3x2\", DATAFORMAT_FLOAT_MAT3X2 },\n\t{ \"floatmat3x3\", DATAFORMAT_FLOAT_MAT3X3 },\n\t{ \"floatmat3x4\", DATAFORMAT_FLOAT_MAT3X4 },\n\n\t{ \"floatmat4x2\", DATAFORMAT_FLOAT_MAT4X2 },\n\t{ \"floatmat4x3\", DATAFORMAT_FLOAT_MAT4X3 },\n\t{ \"floatmat4x4\", DATAFORMAT_FLOAT_MAT4X4 },\n\n\t{ \"int32\",     DATAFORMAT_INT32      },\n\t{ \"int32vec2\", DATAFORMAT_INT32_VEC2 },\n\t{ \"int32vec3\", DATAFORMAT_INT32_VEC3 },\n\t{ \"int32vec4\", DATAFORMAT_INT32_VEC4 },\n\n\t{ \"uint32\",     DATAFORMAT_UINT32      },\n\t{ \"uint32vec2\", DATAFORMAT_UINT32_VEC2 },\n\t{ \"uint32vec3\", DATAFORMAT_UINT32_VEC3 },\n\t{ \"uint32vec4\", DATAFORMAT_UINT32_VEC4 },\n\n\t{ \"snorm8vec4\", DATAFORMAT_SNORM8_VEC4 },\n\t{ \"unorm8vec4\", DATAFORMAT_UNORM8_VEC4 },\n\t{ \"int8vec4\",   DATAFORMAT_INT8_VEC4   },\n\t{ \"uint8vec4\",  DATAFORMAT_UINT8_VEC4  },\n\n\t{ \"snorm16vec2\", DATAFORMAT_SNORM16_VEC2 },\n\t{ \"snorm16vec4\", DATAFORMAT_SNORM16_VEC4 },\n\n\t{ \"unorm16vec2\", DATAFORMAT_UNORM16_VEC2 },\n\t{ \"unorm16vec4\", DATAFORMAT_UNORM16_VEC4 },\n\n\t{ \"int16vec2\", DATAFORMAT_INT16_VEC2 },\n\t{ \"int16vec4\", DATAFORMAT_INT16_VEC4 },\n\n\t{ \"uint16\",     DATAFORMAT_UINT16      },\n\t{ \"uint16vec2\", DATAFORMAT_UINT16_VEC2 },\n\t{ \"uint16vec4\", DATAFORMAT_UINT16_VEC4 },\n\n\t{ \"bool\",     DATAFORMAT_BOOL      },\n\t{ \"boolvec2\", DATAFORMAT_BOOL_VEC2 },\n\t{ \"boolvec3\", DATAFORMAT_BOOL_VEC3 },\n\t{ \"boolvec4\", DATAFORMAT_BOOL_VEC4 },\n}\nSTRINGMAP_END(DataFormat, DATAFORMAT_MAX_ENUM, dataFormat)\n\nSTRINGMAP_BEGIN(DataBaseType, DATA_BASETYPE_MAX_ENUM, dataBaseType)\n{\n\t{ \"float\", DATA_BASETYPE_FLOAT },\n\t{ \"int\",   DATA_BASETYPE_INT   },\n\t{ \"uint\",  DATA_BASETYPE_UINT  },\n\t{ \"snorm\", DATA_BASETYPE_SNORM },\n\t{ \"unorm\", DATA_BASETYPE_UNORM },\n\t{ \"bool\",  DATA_BASETYPE_BOOL  },\n}\nSTRINGMAP_END(DataBaseType, DATA_BASETYPE_MAX_ENUM, dataBaseType)\n\nSTRINGMAP_BEGIN(CullMode, CULL_MAX_ENUM, cullMode)\n{\n\t{ \"none\",  CULL_NONE  },\n\t{ \"back\",  CULL_BACK  },\n\t{ \"front\", CULL_FRONT },\n}\nSTRINGMAP_END(CullMode, CULL_MAX_ENUM, cullMode)\n\nSTRINGMAP_BEGIN(Winding, WINDING_MAX_ENUM, winding)\n{\n\t{ \"cw\",  WINDING_CW  },\n\t{ \"ccw\", WINDING_CCW },\n}\nSTRINGMAP_END(Winding, WINDING_MAX_ENUM, winding)\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/vertex.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/int.h\"\n#include \"common/Color.h\"\n#include \"common/StringMap.h\"\n\n// C\n#include <stddef.h>\n#include <string.h>\n#include <vector>\n#include <string>\n\nnamespace love\n{\nnamespace graphics\n{\n\nclass Resource;\n\n// Vertex attribute indices used in shaders by LOVE. The values map to GPU\n// generic vertex attribute indices.\nenum BuiltinVertexAttribute\n{\n\tATTRIB_POS = 0,\n\tATTRIB_TEXCOORD,\n\tATTRIB_COLOR,\n\tATTRIB_MAX_ENUM\n};\n\nenum BuiltinVertexAttributeFlags\n{\n\tATTRIBFLAG_POS = 1 << ATTRIB_POS,\n\tATTRIBFLAG_TEXCOORD = 1 << ATTRIB_TEXCOORD,\n\tATTRIBFLAG_COLOR = 1 << ATTRIB_COLOR,\n};\n\nenum BufferUsage\n{\n\tBUFFERUSAGE_VERTEX = 0,\n\tBUFFERUSAGE_INDEX,\n\tBUFFERUSAGE_TEXEL,\n\tBUFFERUSAGE_UNIFORM,\n\tBUFFERUSAGE_SHADER_STORAGE,\n\tBUFFERUSAGE_INDIRECT_ARGUMENTS,\n\tBUFFERUSAGE_MAX_ENUM\n};\n\nenum BufferUsageFlags\n{\n\tBUFFERUSAGEFLAG_NONE = 0,\n\tBUFFERUSAGEFLAG_VERTEX = 1 << BUFFERUSAGE_VERTEX,\n\tBUFFERUSAGEFLAG_INDEX = 1 << BUFFERUSAGE_INDEX,\n\tBUFFERUSAGEFLAG_TEXEL = 1 << BUFFERUSAGE_TEXEL,\n\tBUFFERUSAGEFLAG_SHADER_STORAGE = 1 << BUFFERUSAGE_SHADER_STORAGE,\n\tBUFFERUSAGEFLAG_INDIRECT_ARGUMENTS = 1 << BUFFERUSAGE_INDIRECT_ARGUMENTS,\n};\n\nenum IndexDataType\n{\n\tINDEX_UINT16,\n\tINDEX_UINT32,\n\tINDEX_MAX_ENUM\n};\n\n// http://escience.anu.edu.au/lecture/cg/surfaceModeling/image/surfaceModeling015.png\nenum PrimitiveType\n{\n\tPRIMITIVE_TRIANGLES,\n\tPRIMITIVE_TRIANGLE_STRIP,\n\tPRIMITIVE_TRIANGLE_FAN,\n\tPRIMITIVE_POINTS,\n\tPRIMITIVE_MAX_ENUM\n};\n\nenum AttributeStep\n{\n\tSTEP_PER_VERTEX,\n\tSTEP_PER_INSTANCE,\n\tSTEP_MAX_ENUM\n};\n\nenum CullMode\n{\n\tCULL_NONE,\n\tCULL_BACK,\n\tCULL_FRONT,\n\tCULL_MAX_ENUM\n};\n\n// The expected usage pattern of buffer data.\nenum BufferDataUsage\n{\n\tBUFFERDATAUSAGE_STREAM,\n\tBUFFERDATAUSAGE_DYNAMIC,\n\tBUFFERDATAUSAGE_STATIC,\n\tBUFFERDATAUSAGE_READBACK,\n\tBUFFERDATAUSAGE_MAX_ENUM\n};\n\n// Value types used when interfacing with the GPU (vertex and shader data).\n// The order of this enum affects the dataFormatInfo array.\nenum DataFormat\n{\n\tDATAFORMAT_FLOAT,\n\tDATAFORMAT_FLOAT_VEC2,\n\tDATAFORMAT_FLOAT_VEC3,\n\tDATAFORMAT_FLOAT_VEC4,\n\n\tDATAFORMAT_FLOAT_MAT2X2,\n\tDATAFORMAT_FLOAT_MAT2X3,\n\tDATAFORMAT_FLOAT_MAT2X4,\n\n\tDATAFORMAT_FLOAT_MAT3X2,\n\tDATAFORMAT_FLOAT_MAT3X3,\n\tDATAFORMAT_FLOAT_MAT3X4,\n\n\tDATAFORMAT_FLOAT_MAT4X2,\n\tDATAFORMAT_FLOAT_MAT4X3,\n\tDATAFORMAT_FLOAT_MAT4X4,\n\n\tDATAFORMAT_INT32,\n\tDATAFORMAT_INT32_VEC2,\n\tDATAFORMAT_INT32_VEC3,\n\tDATAFORMAT_INT32_VEC4,\n\n\tDATAFORMAT_UINT32,\n\tDATAFORMAT_UINT32_VEC2,\n\tDATAFORMAT_UINT32_VEC3,\n\tDATAFORMAT_UINT32_VEC4,\n\n\tDATAFORMAT_SNORM8_VEC4,\n\tDATAFORMAT_UNORM8_VEC4,\n\tDATAFORMAT_INT8_VEC4,\n\tDATAFORMAT_UINT8_VEC4,\n\n\tDATAFORMAT_SNORM16_VEC2,\n\tDATAFORMAT_SNORM16_VEC4,\n\n\tDATAFORMAT_UNORM16_VEC2,\n\tDATAFORMAT_UNORM16_VEC4,\n\n\tDATAFORMAT_INT16_VEC2,\n\tDATAFORMAT_INT16_VEC4,\n\n\tDATAFORMAT_UINT16,\n\tDATAFORMAT_UINT16_VEC2,\n\tDATAFORMAT_UINT16_VEC4,\n\n\tDATAFORMAT_BOOL,\n\tDATAFORMAT_BOOL_VEC2,\n\tDATAFORMAT_BOOL_VEC3,\n\tDATAFORMAT_BOOL_VEC4,\n\n\tDATAFORMAT_MAX_ENUM\n};\n\nenum DataBaseType\n{\n\tDATA_BASETYPE_FLOAT,\n\tDATA_BASETYPE_INT,\n\tDATA_BASETYPE_UINT,\n\tDATA_BASETYPE_SNORM,\n\tDATA_BASETYPE_UNORM,\n\tDATA_BASETYPE_BOOL,\n\tDATA_BASETYPE_MAX_ENUM\n};\n\nenum Winding\n{\n\tWINDING_CW,\n\tWINDING_CCW,\n\tWINDING_MAX_ENUM\n};\n\nenum TriangleIndexMode\n{\n\tTRIANGLEINDEX_NONE,\n\tTRIANGLEINDEX_STRIP,\n\tTRIANGLEINDEX_FAN,\n\tTRIANGLEINDEX_QUADS,\n};\n\nenum class CommonFormat\n{\n\tNONE,\n\tXYf,\n\tXYZf,\n\tRGBAub,\n\tSTf_RGBAub,\n\tSTPf_RGBAub,\n\tXYf_STf,\n\tXYf_STPf,\n\tXYf_STf_RGBAub,\n\tXYf_STus_RGBAub,\n\tXYf_STPf_RGBAub,\n\tCOUNT,\n};\n\nstruct DataFormatInfo\n{\n\tDataBaseType baseType;\n\tbool isMatrix;\n\tint components;\n\tint matrixRows;\n\tint matrixColumns;\n\tsize_t componentSize;\n\tsize_t size;\n};\n\nstruct STf_RGBAub\n{\n\tfloat s, t;\n\tColor32 color;\n};\n\nstruct STPf_RGBAub\n{\n\tfloat s, t, p;\n\tColor32 color;\n};\n\nstruct XYf_STf\n{\n\tfloat x, y;\n\tfloat s, t;\n};\n\nstruct XYf_STPf\n{\n\tfloat x, y;\n\tfloat s, t, p;\n};\n\nstruct XYf_STf_RGBAub\n{\n\tfloat x, y;\n\tfloat s, t;\n\tColor32 color;\n};\n\ntypedef XYf_STf_RGBAub Vertex;\n\nstruct XYf_STus_RGBAub\n{\n\tfloat  x, y;\n\tuint16 s, t;\n\tColor32 color;\n};\n\nstruct XYf_STPf_RGBAub\n{\n\tfloat x, y;\n\tfloat s, t, p;\n\tColor32 color;\n};\n\nstruct BufferBindings\n{\n\tstatic const uint32 MAX = 32;\n\n\tuint32 useBits = 0;\n\n\tstruct\n\t{\n\t\tResource *buffer;\n\t\tsize_t offset;\n\t} info[MAX];\n\n\tvoid set(uint32 index, Resource *r, size_t offset)\n\t{\n\t\tuseBits |= (1u << index);\n\t\tinfo[index] = {r, offset};\n\t}\n\n\tvoid disable(uint32 index) { useBits &= (1u << index); }\n\tvoid clear() { useBits = 0; }\n};\n\nstruct VertexAttributeInfo\n{\n\tuint16 offsetFromVertex;\n\tuint8 packedFormat;\n\tuint8 bufferIndex;\n\n\tvoid setFormat(DataFormat format) { packedFormat = (uint8)format; }\n\tDataFormat getFormat() const { return (DataFormat)packedFormat; }\n};\n\nstruct VertexBufferLayout\n{\n\t// Attribute step rate is stored outside this struct as a bitmask.\n\tuint16 stride;\n};\n\nstruct VertexAttributes\n{\n\tstatic const uint32 MAX = 30;\n\n\tuint32 enableBits = 0; // indexed by attribute\n\tuint32 instanceBits = 0; // indexed by buffer\n\n\tVertexAttributeInfo attribs[MAX];\n\tVertexBufferLayout bufferLayouts[BufferBindings::MAX];\n\n\tVertexAttributes()\n\t{\n\t\tmemset(this, 0, sizeof(VertexAttributes));\n\t}\n\n\tVertexAttributes(CommonFormat format, uint8 bufferindex)\n\t{\n\t\tmemset(this, 0, sizeof(VertexAttributes));\n\t\tsetCommonFormat(format, bufferindex);\n\t}\n\n\tvoid set(uint32 index, DataFormat format, uint16 offsetfromvertex, uint8 bufferindex)\n\t{\n\t\tenableBits |= (1u << index);\n\n\t\tattribs[index].bufferIndex = bufferindex;\n\t\tattribs[index].setFormat(format);\n\t\tattribs[index].offsetFromVertex = offsetfromvertex;\n\t}\n\n\tvoid setBufferLayout(uint32 bufferindex, uint16 stride, AttributeStep step = STEP_PER_VERTEX)\n\t{\n\t\tuint32 bufferbit = (1u << bufferindex);\n\n\t\tif (step == STEP_PER_INSTANCE)\n\t\t\tinstanceBits |= bufferbit;\n\t\telse\n\t\t\tinstanceBits &= ~bufferbit;\n\n\t\tbufferLayouts[bufferindex].stride = stride;\n\t}\n\n\tvoid disable(uint32 index)\n\t{\n\t\tenableBits &= ~(1u << index);\n\t}\n\n\tvoid clear()\n\t{\n\t\tenableBits = 0;\n\t}\n\n\tbool isEnabled(uint32 index) const\n\t{\n\t\treturn (enableBits & (1u << index)) != 0;\n\t}\n\n\tAttributeStep getBufferStep(uint32 index) const\n\t{\n\t\treturn (instanceBits & (1u << index)) != 0 ? STEP_PER_INSTANCE : STEP_PER_VERTEX;\n\t}\n\n\tvoid setCommonFormat(CommonFormat format, uint8 bufferindex);\n\n\tbool operator == (const VertexAttributes &other) const;\n};\n\nstruct VertexAttributesID\n{\n\tint id = 0;\n\n\tbool isValid() const { return id > 0; }\n\tvoid invalidate() { id = 0; }\n\n\tbool operator == (VertexAttributesID other) const { return other.id == id; }\n\tbool operator != (VertexAttributesID other) const { return other.id != id; }\n};\n\nsize_t getFormatStride(CommonFormat format);\n\nuint32 getFormatFlags(CommonFormat format);\n\nint getFormatPositionComponents(CommonFormat format);\n\ninline CommonFormat getSinglePositionFormat(bool is2D)\n{\n\treturn is2D ? CommonFormat::XYf : CommonFormat::XYZf;\n}\n\nconst DataFormatInfo &getDataFormatInfo(DataFormat format);\n\nsize_t getIndexDataSize(IndexDataType type);\nIndexDataType getIndexDataTypeFromMax(size_t maxvalue);\nDataFormat getIndexDataFormat(IndexDataType type);\nIndexDataType getIndexDataType(DataFormat format);\n\nint getIndexCount(TriangleIndexMode mode, int vertexCount);\n\nvoid fillIndices(TriangleIndexMode mode, uint16 vertexStart, uint16 vertexCount, uint16 *indices);\nvoid fillIndices(TriangleIndexMode mode, uint32 vertexStart, uint32 vertexCount, uint32 *indices);\n\nSTRINGMAP_DECLARE(BuiltinVertexAttribute);\nSTRINGMAP_DECLARE(BufferUsage);\nSTRINGMAP_DECLARE(IndexDataType);\nSTRINGMAP_DECLARE(BufferDataUsage);\nSTRINGMAP_DECLARE(PrimitiveType);\nSTRINGMAP_DECLARE(AttributeStep);\nSTRINGMAP_DECLARE(DataFormat);\nSTRINGMAP_DECLARE(DataBaseType);\nSTRINGMAP_DECLARE(CullMode);\nSTRINGMAP_DECLARE(Winding);\n\nconst char *getConstant(BuiltinVertexAttribute attrib);\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/vulkan/Buffer.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Buffer.h\"\n#include \"Graphics.h\"\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace vulkan\n{\n\nstatic VkBufferUsageFlags getUsageBit(BufferUsage mode)\n{\n\tswitch (mode)\n\t{\n\tcase BUFFERUSAGE_VERTEX: return VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;\n\tcase BUFFERUSAGE_INDEX: return VK_BUFFER_USAGE_INDEX_BUFFER_BIT;\n\tcase BUFFERUSAGE_UNIFORM: return VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;\n\tcase BUFFERUSAGE_TEXEL: return VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;\n\tcase BUFFERUSAGE_SHADER_STORAGE: return VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;\n\tcase BUFFERUSAGE_INDIRECT_ARGUMENTS: return VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;\n\tdefault:\n\t\tthrow love::Exception(\"Unsupported BufferUsage mode: %d\", mode);\n\t}\n}\n\nstatic VkBufferUsageFlags getVulkanUsageFlags(BufferUsageFlags flags)\n{\n\tVkBufferUsageFlags vkFlags = 0;\n\tfor (int i = 0; i < BUFFERUSAGE_MAX_ENUM; i++)\n\t{\n\t\tBufferUsageFlags flag = static_cast<BufferUsageFlags>(1u << i);\n\t\tif (flags & flag)\n\t\t\tvkFlags |= getUsageBit((BufferUsage)i);\n\t}\n\treturn vkFlags;\n}\n\nBuffer::Buffer(love::graphics::Graphics *gfx, const Settings &settings, const std::vector<DataDeclaration> &format, const void *data, size_t size, size_t arraylength)\n\t: love::graphics::Buffer(gfx, settings, format, size, arraylength)\n\t, zeroInitialize(settings.zeroInitialize)\n\t, initialData(data)\n\t, vgfx(dynamic_cast<Graphics*>(gfx))\n\t, usageFlags(settings.usageFlags)\n{\n\t// All buffers can be copied to and from.\n\tbarrierDstAccessFlags = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT;\n\tbarrierDstStageFlags = VK_PIPELINE_STAGE_TRANSFER_BIT;\n\n\tif (usageFlags & BUFFERUSAGEFLAG_VERTEX)\n\t{\n\t\tbarrierDstAccessFlags |= VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT;\n\t\tbarrierDstStageFlags |= VK_PIPELINE_STAGE_VERTEX_INPUT_BIT;\n\t}\n\tif (usageFlags & BUFFERUSAGEFLAG_INDEX)\n\t{\n\t\tbarrierDstAccessFlags |= VK_ACCESS_INDEX_READ_BIT;\n\t\tbarrierDstStageFlags |= VK_PIPELINE_STAGE_VERTEX_INPUT_BIT;\n\t}\n\tif (usageFlags & BUFFERUSAGEFLAG_TEXEL)\n\t{\n\t\tbarrierDstAccessFlags |= VK_ACCESS_SHADER_READ_BIT;\n\t\tbarrierDstStageFlags |= VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;\n\t}\n\tif (usageFlags & BUFFERUSAGEFLAG_SHADER_STORAGE)\n\t{\n\t\tbarrierDstAccessFlags |= VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT;\n\t\tbarrierDstStageFlags |= VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;\n\t}\n\tif (usageFlags & BUFFERUSAGEFLAG_INDIRECT_ARGUMENTS)\n\t{\n\t\tbarrierDstAccessFlags |= VK_ACCESS_INDIRECT_COMMAND_READ_BIT;\n\t\tbarrierDstStageFlags |= VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT;\n\t}\n\n\tloadVolatile();\n}\n\nbool Buffer::loadVolatile()\n{\n\tallocator = vgfx->getVmaAllocator();\n\n\tVkBufferCreateInfo bufferInfo{};\n\tbufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;\n\tbufferInfo.size = getSize();\n\tbufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | getVulkanUsageFlags(usageFlags);\n\n\tVmaAllocationCreateInfo allocCreateInfo{};\n\tallocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;\n\tif (dataUsage == BUFFERDATAUSAGE_READBACK)\n\t\tallocCreateInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT;\n\n\tauto result = vmaCreateBuffer(allocator, &bufferInfo, &allocCreateInfo, &buffer, &allocation, &allocInfo);\n\tif (result != VK_SUCCESS)\n\t\tthrow love::Exception(\"Failed to create Vulkan buffer: %s\", Vulkan::getErrorString(result));\n\n\tif (zeroInitialize)\n\t{\n\t\tauto cmd = vgfx->getCommandBufferForDataTransfer();\n\t\tvkCmdFillBuffer(cmd, buffer, 0, VK_WHOLE_SIZE, 0);\n\t\tpostGPUWriteBarrier(cmd);\n\t}\n\n\tif (initialData)\n\t\tfill(0, size, initialData);\n\n\tif (usageFlags & BUFFERUSAGEFLAG_TEXEL)\n\t{\n\t\tVkBufferViewCreateInfo bufferViewInfo{};\n\t\tbufferViewInfo.buffer = buffer;\n\t\tbufferViewInfo.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;\n\t\tbufferViewInfo.format = Vulkan::getVulkanVertexFormat(getDataMember(0).decl.format);\n\t\tbufferViewInfo.range = VK_WHOLE_SIZE;\n\n\t\tresult = vkCreateBufferView(vgfx->getDevice(), &bufferViewInfo, nullptr, &bufferView);\n\t\tif (result != VK_SUCCESS)\n\t\t\tthrow love::Exception(\"Failed to create Vulkan texel buffer view: %s\", Vulkan::getErrorString(result));\n\t}\n\n\tVkMemoryPropertyFlags memoryProperties;\n\tvmaGetAllocationMemoryProperties(allocator, allocation, &memoryProperties);\n\tif (memoryProperties & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)\n\t\tcoherent = true;\n\telse\n\t\tcoherent = false;\n\n\tif (!debugName.empty() && vgfx->getEnabledOptionalInstanceExtensions().debugInfo)\n\t{\n\t\tauto device = vgfx->getDevice();\n\n\t\tVkDebugUtilsObjectNameInfoEXT nameInfo{};\n\t\tnameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT;\n\t\tnameInfo.objectType = VK_OBJECT_TYPE_BUFFER;\n\t\tnameInfo.objectHandle = (uint64_t)buffer;\n\t\tnameInfo.pObjectName = debugName.c_str();\n\t\tvkSetDebugUtilsObjectNameEXT(device, &nameInfo);\n\t}\n\n\treturn true;\n}\n\nvoid Buffer::unloadVolatile()\n{\n\tif (buffer == VK_NULL_HANDLE)\n\t\treturn;\n\n\tauto device = vgfx->getDevice();\n\n\tvgfx->queueCleanUp(\n\t\t[device=device, allocator=allocator, buffer=buffer, allocation=allocation, bufferView=bufferView](){\n\t\tvkDeviceWaitIdle(device);\n\t\tvmaDestroyBuffer(allocator, buffer, allocation);\n\t\tif (bufferView)\n\t\t\tvkDestroyBufferView(device, bufferView, nullptr);\n\t});\n\n\tbuffer = VK_NULL_HANDLE;\n\tbufferView = VK_NULL_HANDLE;\n}\n\nBuffer::~Buffer()\n{\n\tunloadVolatile();\n}\n\nptrdiff_t Buffer::getHandle() const\n{\n\treturn (ptrdiff_t) buffer;\n}\n\nptrdiff_t Buffer::getTexelBufferHandle() const\n{\n\treturn (ptrdiff_t) bufferView;\n}\n\nvoid *Buffer::map(MapType map, size_t offset, size_t size)\n{\n\tif (size == 0)\n\t\treturn nullptr;\n\n\tif (map == MAP_WRITE_INVALIDATE && (isImmutable() || dataUsage == BUFFERDATAUSAGE_READBACK))\n\t\treturn nullptr;\n\n\tif (map == MAP_READ_ONLY && dataUsage != BUFFERDATAUSAGE_READBACK)\n\t\treturn  nullptr;\n\n\tmappedRange = Range(offset, size);\n\n\tif (!Range(0, getSize()).contains(mappedRange))\n\t\treturn nullptr;\n\n\tif (dataUsage == BUFFERDATAUSAGE_READBACK)\n\t{\n\t\tif (!coherent)\n\t\t\tvmaInvalidateAllocation(allocator, allocation, offset, size);\n\n\t\tchar *data = (char*)allocInfo.pMappedData;\n\t\treturn (void*) (data + offset);\n\t}\n\telse\n\t{\n\t\tVkBufferCreateInfo bufferInfo{};\n\t\tbufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;\n\t\tbufferInfo.size = size;\n\t\tbufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;\n\n\t\tVmaAllocationCreateInfo allocInfo{};\n\t\tallocInfo.usage = VMA_MEMORY_USAGE_AUTO;\n\t\tallocInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT;\n\n\t\tVkResult result = vmaCreateBuffer(allocator, &bufferInfo, &allocInfo, &stagingBuffer, &stagingAllocation, &stagingAllocInfo);\n\t\tif (result != VK_SUCCESS)\n\t\t\tthrow love::Exception(\"Failed to create Vulkan staging buffer: %s\", Vulkan::getErrorString(result));\n\n\t\treturn stagingAllocInfo.pMappedData;\n\t}\n}\n\nbool Buffer::fill(size_t offset, size_t size, const void *data)\n{\n\tif (size == 0 || isImmutable() || dataUsage == BUFFERDATAUSAGE_READBACK)\n\t\treturn false;\n\n\tif (!Range(0, getSize()).contains(Range(offset, size)))\n\t\treturn false;\n\n\tVkBufferCreateInfo bufferInfo{};\n\tbufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;\n\tbufferInfo.size = size;\n\tbufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;\n\n\tVmaAllocationCreateInfo allocInfo{};\n\tallocInfo.usage = VMA_MEMORY_USAGE_AUTO;\n\tallocInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT;\n\n\tVkBuffer fillBuffer;\n\tVmaAllocation fillAllocation;\n\tVmaAllocationInfo fillAllocInfo;\n\n\tVkResult result = vmaCreateBuffer(allocator, &bufferInfo, &allocInfo, &fillBuffer, &fillAllocation, &fillAllocInfo);\n\tif (result != VK_SUCCESS)\n\t\tthrow love::Exception(\"Failed to create Vulkan fill buffer: %s\", Vulkan::getErrorString(result));\n\n\tmemcpy(fillAllocInfo.pMappedData, data, size);\n\n\tVkMemoryPropertyFlags memoryProperties;\n\tvmaGetAllocationMemoryProperties(allocator, fillAllocation, &memoryProperties);\n\tif (~memoryProperties & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)\n\t\tvmaFlushAllocation(allocator, fillAllocation, 0, size);\n\n\tVkBufferCopy bufferCopy{};\n\tbufferCopy.srcOffset = 0;\n\tbufferCopy.dstOffset = offset;\n\tbufferCopy.size = size;\n\n\tauto cmd = vgfx->getCommandBufferForDataTransfer();\n\tvkCmdCopyBuffer(cmd, fillBuffer, buffer, 1, &bufferCopy);\n\n\tpostGPUWriteBarrier(cmd);\n\n\tvgfx->queueCleanUp([allocator = allocator, fillBuffer = fillBuffer, fillAllocation = fillAllocation]() {\n\t\tvmaDestroyBuffer(allocator, fillBuffer, fillAllocation);\n\t});\n\n\treturn true;\n}\n\nvoid Buffer::unmap(size_t usedoffset, size_t usedsize)\n{\n\tif (dataUsage != BUFFERDATAUSAGE_READBACK)\n\t{\n\t\tVkBufferCopy bufferCopy{};\n\t\tbufferCopy.srcOffset = usedoffset - mappedRange.getOffset();\n\t\tbufferCopy.dstOffset = usedoffset;\n\t\tbufferCopy.size = usedsize;\n\n\t\tVkMemoryPropertyFlags memoryProperties;\n\t\tvmaGetAllocationMemoryProperties(allocator, stagingAllocation, &memoryProperties);\n\t\tif (~memoryProperties & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)\n\t\t\tvmaFlushAllocation(allocator, stagingAllocation, bufferCopy.srcOffset, usedsize);\n\n\t\tauto cmd = vgfx->getCommandBufferForDataTransfer();\n\t\tvkCmdCopyBuffer(cmd, stagingBuffer, buffer, 1, &bufferCopy);\n\n\t\tpostGPUWriteBarrier(cmd);\n\n\t\tvgfx->queueCleanUp([allocator = allocator, stagingBuffer = stagingBuffer, stagingAllocation = stagingAllocation]() {\n\t\t\tvmaDestroyBuffer(allocator, stagingBuffer, stagingAllocation);\n\t\t});\n\t}\n}\n\nvoid Buffer::clearInternal(size_t offset, size_t size)\n{\n\tauto cmd = vgfx->getCommandBufferForDataTransfer();\n\tvkCmdFillBuffer(cmd, buffer, offset, size, 0);\n\tpostGPUWriteBarrier(cmd);\n}\n\nvoid Buffer::copyTo(love::graphics::Buffer *dest, size_t sourceoffset, size_t destoffset, size_t size)\n{\n\tauto commandBuffer = vgfx->getCommandBufferForDataTransfer();\n\n\tVkBufferCopy bufferCopy{};\n\tbufferCopy.srcOffset = sourceoffset;\n\tbufferCopy.dstOffset = destoffset;\n\tbufferCopy.size = size;\n\n\tvkCmdCopyBuffer(commandBuffer, buffer, (VkBuffer) dest->getHandle(), 1, &bufferCopy);\n\n\t((Buffer *)dest)->postGPUWriteBarrier(commandBuffer);\n}\n\nvoid Buffer::postGPUWriteBarrier(VkCommandBuffer cmd)\n{\n\tVkMemoryBarrier barrier{};\n\tbarrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;\n\tbarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;\n\tbarrier.dstAccessMask = barrierDstAccessFlags;\n\n\tvkCmdPipelineBarrier(cmd, VK_PIPELINE_STAGE_TRANSFER_BIT, barrierDstStageFlags, 0, 1, &barrier, 0, nullptr, 0, nullptr);\n}\n\n} // vulkan\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/vulkan/Buffer.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"common/Range.h\"\n\n#include \"graphics/Buffer.h\"\n#include \"graphics/Volatile.h\"\n\n#include \"VulkanWrapper.h\"\n\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace vulkan\n{\n\nclass Graphics;\n\nclass Buffer final\n\t: public love::graphics::Buffer\n\t, public Volatile\n{\npublic:\n\tBuffer(love::graphics::Graphics *gfx, const Settings &settings, const std::vector<DataDeclaration> &format, const void *data, size_t size, size_t arraylength);\n\tvirtual ~Buffer();\n\n\tvirtual bool loadVolatile() override;\n\tvirtual void unloadVolatile() override;\n\n\tvoid *map(MapType map, size_t offset, size_t size) override;\n\tvoid unmap(size_t usedoffset, size_t usedsize) override;\n\tbool fill(size_t offset, size_t size, const void *data) override;\n\tvoid copyTo(love::graphics::Buffer *dest, size_t sourceoffset, size_t destoffset, size_t size) override;\n\tptrdiff_t getHandle() const override;\n\tptrdiff_t getTexelBufferHandle() const override;\n\n\tvoid postGPUWriteBarrier(VkCommandBuffer cmd);\n\n\tVkAccessFlags getBarrierDstAccessFlags() const { return barrierDstAccessFlags; }\n\tVkPipelineStageFlags getBarrierDstStageFlags() const { return barrierDstStageFlags; }\n\nprivate:\n\n\tvoid clearInternal(size_t offset, size_t size) override;\n\n\tbool zeroInitialize;\n\tconst void *initialData;\n\tVkBuffer buffer = VK_NULL_HANDLE;\n\tVkBuffer stagingBuffer = VK_NULL_HANDLE;\n\tVkBufferView bufferView = VK_NULL_HANDLE;\n\tGraphics *vgfx = nullptr;\n\tVmaAllocator allocator;\n\tVmaAllocation allocation;\n\tVmaAllocation stagingAllocation;\n\tVmaAllocationInfo allocInfo;\n\tVmaAllocationInfo stagingAllocInfo;\n\tBufferUsageFlags usageFlags;\n\tRange mappedRange;\n\tbool coherent;\n\n\tVkAccessFlags barrierDstAccessFlags = 0;\n\tVkPipelineStageFlags barrierDstStageFlags = 0;\n};\n\n} // vulkan\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/vulkan/Graphics.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"common/Exception.h\"\n#include \"common/pixelformat.h\"\n#include \"common/version.h\"\n#include \"common/memory.h\"\n#include \"window/Window.h\"\n#include \"Buffer.h\"\n#include \"Graphics.h\"\n#include \"GraphicsReadback.h\"\n#include \"Shader.h\"\n#include \"Vulkan.h\"\n\n#include <SDL3/SDL_vulkan.h>\n#include <SDL3/SDL_hints.h>\n\n#include <algorithm>\n#include <vector>\n#include <cstring>\n#include <set>\n#include <sstream>\n#include <array>\n\n#define VOLK_IMPLEMENTATION\n#include \"libraries/volk/volk.h\"\n\n#define VMA_IMPLEMENTATION\n#include \"libraries/vma/vk_mem_alloc.h\"\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace vulkan\n{\n\nstatic const std::vector<const char*> validationLayers = {\n\t\"VK_LAYER_KHRONOS_validation\"\n};\n\nstatic const std::vector<const char*> deviceExtensions = {\n\tVK_KHR_SWAPCHAIN_EXTENSION_NAME,\n};\n\nconstexpr int DEFAULT_VERTEX_BUFFER_BINDING = 0;\nconstexpr int VERTEX_BUFFER_BINDING_START = 1;\n\nVkDevice Graphics::getDevice() const\n{\n\treturn device;\n}\n\nVmaAllocator Graphics::getVmaAllocator() const\n{\n\treturn vmaAllocator;\n}\n\nstatic void checkOptionalInstanceExtensions(OptionalInstanceExtensions& ext)\n{\n\tuint32_t count;\n\n\tvkEnumerateInstanceExtensionProperties(nullptr, &count, nullptr);\n\n\tstd::vector<VkExtensionProperties> extensions(count);\n\n\tvkEnumerateInstanceExtensionProperties(nullptr, &count, extensions.data());\n\n\tfor (const auto& extension : extensions)\n\t{\n\t\tif (strcmp(extension.extensionName, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME) == 0)\n\t\t\text.physicalDeviceProperties2 = true;\n\t\tif (strcmp(extension.extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME) == 0)\n\t\t\text.debugInfo = true;\n\t}\n}\n\nGraphics::Graphics()\n\t: love::graphics::Graphics(\"love.graphics.vulkan\")\n{\n\tif (!SDL_Vulkan_LoadLibrary(nullptr))\n\t\tthrow love::Exception(\"could not find vulkan\");\n\n\tvolkInitializeCustom((PFN_vkGetInstanceProcAddr)SDL_Vulkan_GetVkGetInstanceProcAddr());\n\n\tif (isDebugEnabled() && !checkValidationSupport())\n\t{\n\t\tSDL_Vulkan_UnloadLibrary();\n\t\tthrow love::Exception(\"validation layers requested, but not available\");\n\t}\n\n\tVkApplicationInfo appInfo{};\n\tappInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;\n\tappInfo.pApplicationName = \"LOVE\";\n\tappInfo.applicationVersion = VK_MAKE_API_VERSION(0, 1, 0, 0);\t// get this version from somewhere else?\n\tappInfo.pEngineName = \"LOVE Game Framework\";\n\tappInfo.engineVersion = VK_MAKE_API_VERSION(0, VERSION_MAJOR, VERSION_MINOR, VERSION_REV);\n\tappInfo.apiVersion = VK_API_VERSION_1_3;\n\n\tVkInstanceCreateInfo createInfo{};\n\tcreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;\n\tcreateInfo.pApplicationInfo = &appInfo;\n\tcreateInfo.pNext = nullptr;\n\n\t// GetInstanceExtensions works with a null window parameter as long as\n\t// SDL_Vulkan_LoadLibrary has been called (which we do earlier).\n\tunsigned int count = 0;\n\tchar const* const* extensions_string = SDL_Vulkan_GetInstanceExtensions(&count);\n\tif (extensions_string == nullptr)\n\t{\n\t\tSDL_Vulkan_UnloadLibrary();\n\t\tthrow love::Exception(\"couldn't retrieve sdl vulkan extensions\");\n\t}\n\n\tstd::vector<const char*> extensions(extensions_string, extensions_string + count);\n\n\tcheckOptionalInstanceExtensions(optionalInstanceExtensions);\n\n\tif (optionalInstanceExtensions.physicalDeviceProperties2)\n\t\textensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);\n\tif (optionalInstanceExtensions.debugInfo)\n\t\textensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);\n\n\tcreateInfo.enabledExtensionCount = static_cast<uint32_t>(extensions.size());\n\tcreateInfo.ppEnabledExtensionNames = extensions.data();\n\n\tif (isDebugEnabled())\n\t{\n\t\tcreateInfo.enabledLayerCount = static_cast<uint32_t>(validationLayers.size());\n\t\tcreateInfo.ppEnabledLayerNames = validationLayers.data();\n\t}\n\n\tif (vkCreateInstance(&createInfo, nullptr, &instance) != VK_SUCCESS)\n\t{\n\t\tSDL_Vulkan_UnloadLibrary();\n\t\tthrow love::Exception(\"couldn't create vulkan instance\");\n\t}\n\n\tvolkLoadInstance(instance);\n\n\tuint32_t deviceCount = 0;\n\tvkEnumeratePhysicalDevices(instance, &deviceCount, nullptr);\n\n\tint maxScore = 0;\n\n\tif (deviceCount > 0)\n\t{\n\t\tstd::vector<VkPhysicalDevice> devices(deviceCount);\n\t\tvkEnumeratePhysicalDevices(instance, &deviceCount, devices.data());\n\n\t\t// This is imperfect because we can't query a swap chain at this point.\n\t\t// In theory it could cause a device to have a non-zero score here and\n\t\t// no devices to have a non-zero score later in setMode, but hopefully\n\t\t// that won't happen in practice...\n\t\tfor (const auto &device : devices)\n\t\t\tmaxScore = std::max(maxScore, rateDeviceSuitability(device, false));\n\t}\n\n\t// Exit here if there are no suitable devices, to let other backends take over.\n\tif (maxScore == 0)\n\t{\n\t\tvkDestroyInstance(instance, nullptr);\n\t\tSDL_Vulkan_UnloadLibrary();\n\t\tthrow love::Exception(\"no suitable vulkan physical devices found\");\n\t}\n}\n\nGraphics::~Graphics()\n{\n\tdefaultVertexBuffer.set(nullptr);\n\tlocalUniformBuffer.set(nullptr);\n\n\tVolatile::unloadAll();\n\tcleanup();\n\tvkDestroyInstance(instance, nullptr);\n\n\tSDL_Vulkan_UnloadLibrary();\n}\n\n// START OVERRIDEN FUNCTIONS\n\nlove::graphics::Texture *Graphics::newTexture(const love::graphics::Texture::Settings &settings, const love::graphics::Texture::Slices *data)\n{\n\treturn new Texture(this, settings, data);\n}\n\nlove::graphics::Texture *Graphics::newTextureView(love::graphics::Texture *base, const Texture::ViewSettings &viewsettings)\n{\n\treturn new Texture(this, base, viewsettings);\n}\n\nlove::graphics::Buffer *Graphics::newBuffer(const love::graphics::Buffer::Settings &settings, const std::vector<love::graphics::Buffer::DataDeclaration> &format, const void *data, size_t size, size_t arraylength)\n{\n\treturn new Buffer(this, settings, format, data, size, arraylength);\n}\n\nvoid Graphics::clear(OptionalColorD color, OptionalInt stencil, OptionalDouble depth)\n{\n\tif (!color.hasValue && !stencil.hasValue && !depth.hasValue)\n\t\treturn;\n\n\tstd::vector<OptionalColorD> colors;\n\n\tif (color.hasValue)\n\t\tcolors.resize(std::max(1, (int)states.back().renderTargets.colors.size()), color);\n\n\tclear(colors, stencil, depth);\n}\n\nvoid Graphics::clear(const std::vector<OptionalColorD> &colors, OptionalInt stencil, OptionalDouble depth)\n{\n\tif (colors.empty() && !stencil.hasValue && !depth.hasValue)\n\t\treturn;\n\n\tflushBatchedDraws();\n\n\tconst auto &rts = states.back().renderTargets;\n\tbool rtactive = isRenderTargetActive();\n\tsize_t ncolorbuffers = rtactive ? rts.colors.size() : 1;\n\tsize_t ncolors = std::min(ncolorbuffers, colors.size());\n\n\tif (renderPassState.active)\n\t{\n\t\tstd::vector<VkClearAttachment> attachments;\n\t\tfor (size_t i = 0; i < ncolors; i++)\n\t\t{\n\t\t\tconst OptionalColorD &color = colors[i];\n\t\t\tVkClearAttachment attachment{};\n\t\t\tif (color.hasValue)\n\t\t\t{\n\t\t\t\tauto texture = i < rts.colors.size() ? rts.colors[i].texture.get() : nullptr;\n\t\t\t\tattachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;\n\t\t\t\tattachment.clearValue.color = Texture::getClearColor(texture, color.value);\n\t\t\t}\n\t\t\tattachments.push_back(attachment);\n\t\t}\n\n\t\tVkClearAttachment depthStencilAttachment{};\n\n\t\tauto dstexture = rts.depthStencil.texture.get();\n\n\t\tif (stencil.hasValue)\n\t\t{\n\t\t\tif ((!rtactive && backbufferHasStencil)\n\t\t\t\t|| (dstexture && isPixelFormatStencil(dstexture->getPixelFormat())) || (rts.temporaryRTFlags & TEMPORARY_RT_STENCIL) != 0)\n\t\t\t{\n\t\t\t\tdepthStencilAttachment.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT;\n\t\t\t\tdepthStencilAttachment.clearValue.depthStencil.stencil = static_cast<uint32_t>(stencil.value);\n\t\t\t}\n\t\t}\n\t\tif (depth.hasValue)\n\t\t{\n\t\t\tif ((!rtactive && backbufferHasDepth)\n\t\t\t\t|| (dstexture && isPixelFormatDepth(dstexture->getPixelFormat())) || (rts.temporaryRTFlags & TEMPORARY_RT_DEPTH) != 0)\n\t\t\t{\n\t\t\t\tdepthStencilAttachment.aspectMask |= VK_IMAGE_ASPECT_DEPTH_BIT;\n\t\t\t\tdepthStencilAttachment.clearValue.depthStencil.depth = static_cast<float>(depth.value);\n\t\t\t}\n\t\t}\n\n\t\tif (depthStencilAttachment.aspectMask != 0)\n\t\t\tattachments.push_back(depthStencilAttachment);\n\n\t\tVkClearRect rect{};\n\t\trect.layerCount = 1;\n\t\trect.rect.extent.width = static_cast<uint32_t>(renderPassState.width);\n\t\trect.rect.extent.height = static_cast<uint32_t>(renderPassState.height);\n\n\t\tvkCmdClearAttachments(\n\t\t\tcommandBuffers[currentFrame],\n\t\t\tstatic_cast<uint32_t>(attachments.size()), attachments.data(),\n\t\t\t1, &rect);\n\t}\n\telse\n\t{\n\t\tfor (size_t i = 0; i < ncolors; i++)\n\t\t{\n\t\t\tif (colors[i].hasValue)\n\t\t\t{\n\t\t\t\trenderPassState.renderPassConfiguration.colorAttachments[i].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;\n\n\t\t\t\tauto texture = i < rts.colors.size() ? rts.colors[i].texture.get() : nullptr;\n\t\t\t\trenderPassState.clearColors[i].color = Texture::getClearColor(texture, colors[i].value);\n\t\t\t}\n\t\t}\n\n\t\tif (depth.hasValue)\n\t\t{\n\t\t\trenderPassState.renderPassConfiguration.staticData.depthStencilAttachment.depthLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;\n\t\t\trenderPassState.clearColors[ncolorbuffers].depthStencil.depth = static_cast<float>(depth.value);\n\t\t}\n\n\t\tif (stencil.hasValue)\n\t\t{\n\t\t\trenderPassState.renderPassConfiguration.staticData.depthStencilAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;\n\t\t\trenderPassState.clearColors[ncolorbuffers].depthStencil.stencil = static_cast<uint32_t>(stencil.value);\n\t\t}\n\n\t\tif (renderPassState.isWindow)\n\t\t{\n\t\t\trenderPassState.windowClearRequested = true;\n\t\t\trenderPassState.mainWindowClearColorValue = colors.empty() ? OptionalColorD() : colors[0];\n\t\t\trenderPassState.mainWindowClearDepthValue = depth;\n\t\t\trenderPassState.mainWindowClearStencilValue = stencil;\n\t\t}\n\t\telse\n\t\t\tstartRenderPass();\n\t}\n}\n\nvoid Graphics::discard(const std::vector<bool> &colorbuffers, bool depthstencil)\n{\n\tif (renderPassState.active)\n\t\tendRenderPass();\n\n\tauto &renderPassConfiguration = renderPassState.renderPassConfiguration;\n\n\tfor (size_t i = 0; i < colorbuffers.size(); i++)\n\t{\n\t\tif (colorbuffers[i])\n\t\t\trenderPassConfiguration.colorAttachments[i].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;\n\t}\n\n\tif (depthstencil)\n\t{\n\t\trenderPassConfiguration.staticData.depthStencilAttachment.depthLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;\n\t\trenderPassConfiguration.staticData.depthStencilAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;\n\t}\n\n\tstartRenderPass();\n}\n\nvoid Graphics::submitGpuCommands(SubmitMode submitMode, void *screenshotCallbackData)\n{\n\tflushBatchedDraws();\n\n\tif (renderPassState.active)\n\t\tendRenderPass();\n\n\tVkBuffer screenshotBuffer = VK_NULL_HANDLE;\n\tVmaAllocation screenshotAllocation = VK_NULL_HANDLE;\n\tVmaAllocationInfo screenshotAllocationInfo = {};\n\n\tif (submitMode == SUBMIT_PRESENT)\n\t{\n\t\tVkImage backbufferImage = fakeBackbuffer != nullptr ? (VkImage)fakeBackbuffer->getRenderTargetHandle() : swapChainImages.at(imageIndex);\n\n\t\tif (pendingScreenshotCallbacks.empty())\n\t\t{\n\t\t\tif (fakeBackbuffer == nullptr)\n\t\t\t{\n\t\t\t\tVulkan::cmdTransitionImageLayout(\n\t\t\t\t\tcommandBuffers.at(currentFrame),\n\t\t\t\t\tbackbufferImage,\n\t\t\t\t\tswapChainPixelFormat, true,\n\t\t\t\t\tVK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,\n\t\t\t\t\tVK_IMAGE_LAYOUT_PRESENT_SRC_KHR);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tVkBufferCreateInfo bufferInfo{};\n\t\t\tbufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;\n\t\t\tbufferInfo.size = 4ll * swapChainExtent.width * swapChainExtent.height;\n\t\t\tbufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;\n\t\t\tbufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;\n\n\t\t\tVmaAllocationCreateInfo allocCreateInfo{};\n\t\t\tallocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;\n\t\t\tallocCreateInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT;\n\n\t\t\tauto result = vmaCreateBuffer(\n\t\t\t\tvmaAllocator,\n\t\t\t\t&bufferInfo,\n\t\t\t\t&allocCreateInfo,\n\t\t\t\t&screenshotBuffer,\n\t\t\t\t&screenshotAllocation,\n\t\t\t\t&screenshotAllocationInfo);\n\n\t\t\tif (result != VK_SUCCESS)\n\t\t\t\tthrow love::Exception(\"failed to create screenshot readback buffer\");\n\n\t\t\tVulkan::cmdTransitionImageLayout(\n\t\t\t\tcommandBuffers.at(currentFrame),\n\t\t\t\tbackbufferImage,\n\t\t\t\tswapChainPixelFormat, true,\n\t\t\t\tVK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,\n\t\t\t\tVK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);\n\n\t\t\tVkBufferImageCopy region{};\n\t\t\tregion.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;\n\t\t\tregion.imageSubresource.layerCount = 1;\n\t\t\tregion.imageExtent = {\n\t\t\t\tswapChainExtent.width,\n\t\t\t\tswapChainExtent.height,\n\t\t\t\t1\n\t\t\t};\n\n\t\t\tvkCmdCopyImageToBuffer(\n\t\t\t\tcommandBuffers.at(currentFrame),\n\t\t\t\tbackbufferImage,\n\t\t\t\tVK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,\n\t\t\t\tscreenshotBuffer,\n\t\t\t\t1, &region);\n\n\t\t\tVulkan::cmdTransitionImageLayout(\n\t\t\t\tcommandBuffers.at(currentFrame),\n\t\t\t\tbackbufferImage,\n\t\t\t\tswapChainPixelFormat, true,\n\t\t\t\tVK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,\n\t\t\t\tfakeBackbuffer == nullptr ? VK_IMAGE_LAYOUT_PRESENT_SRC_KHR : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);\n\t\t}\n\t}\n\n\tendRecordingGraphicsCommands();\n\n\tif (!imagesInFlight.empty())\n\t{\n\t\tif (imagesInFlight[imageIndex] != VK_NULL_HANDLE)\n\t\t\tvkWaitForFences(device, 1, &imagesInFlight.at(imageIndex), VK_TRUE, UINT64_MAX);\n\t\timagesInFlight[imageIndex] = inFlightFences[currentFrame];\n\t}\n\n\tstd::array<VkCommandBuffer, 1> submitCommandbuffers = { commandBuffers.at(currentFrame) };\n\n\tVkSubmitInfo submitInfo{};\n\tsubmitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;\n\n\tVkSemaphore waitSemaphores[] = { imageAvailableSemaphores.at(currentFrame) };\n\tVkPipelineStageFlags waitStages[] = { VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT };\n\n\tif (imageRequested)\n\t{\n\t\tsubmitInfo.waitSemaphoreCount = 1;\n\t\tsubmitInfo.pWaitSemaphores = waitSemaphores;\n\t\tsubmitInfo.pWaitDstStageMask = waitStages;\n\t\timageRequested = false;\n\t}\n\n\tsubmitInfo.commandBufferCount = static_cast<uint32_t>(submitCommandbuffers.size());\n\tsubmitInfo.pCommandBuffers = submitCommandbuffers.data();\n\n\tVkSemaphore signalSemaphores[] = { renderFinishedSemaphores.at(currentFrame) };\n\n\tVkFence fence = VK_NULL_HANDLE;\n\n\tif (submitMode == SUBMIT_PRESENT)\n\t{\n\t\tif (!swapChainImages.empty())\n\t\t{\n\t\t\tsubmitInfo.signalSemaphoreCount = 1;\n\t\t\tsubmitInfo.pSignalSemaphores = signalSemaphores;\n\t\t}\n\n\t\tvkResetFences(device, 1, &inFlightFences[currentFrame]);\n\t\tfence = inFlightFences[currentFrame];\n\t}\n\n\tif (vkQueueSubmit(graphicsQueue, 1, &submitInfo, fence) != VK_SUCCESS)\n\t\tthrow love::Exception(\"failed to submit draw command buffer\");\n\t\n\tif (submitMode == SUBMIT_NOPRESENT || submitMode == SUBMIT_RESTART || screenshotBuffer != VK_NULL_HANDLE)\n\t{\n\t\tvkQueueWaitIdle(graphicsQueue);\n\n\t\tfor (auto &callbacks : readbackCallbacks)\n\t\t{\n\t\t\tfor (const auto &callback : callbacks)\n\t\t\t\tcallback();\n\t\t\tcallbacks.clear();\n\t\t}\n\n\t\tif (screenshotBuffer != VK_NULL_HANDLE)\n\t\t{\n\t\t\tauto imageModule = Module::getInstance<love::image::Image>(M_IMAGE);\n\n\t\t\tfor (int i = 0; i < (int)pendingScreenshotCallbacks.size(); i++)\n\t\t\t{\n\t\t\t\tconst auto &info = pendingScreenshotCallbacks[i];\n\t\t\t\timage::ImageData *img = nullptr;\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\timg = imageModule->newImageData(\n\t\t\t\t\t\tswapChainExtent.width,\n\t\t\t\t\t\tswapChainExtent.height,\n\t\t\t\t\t\tPIXELFORMAT_RGBA8_UNORM,\n\t\t\t\t\t\tscreenshotAllocationInfo.pMappedData);\n\t\t\t\t}\n\t\t\t\tcatch (love::Exception &)\n\t\t\t\t{\n\t\t\t\t\tinfo.callback(&info, nullptr, nullptr);\n\t\t\t\t\tfor (int j = i + 1; j < (int)pendingScreenshotCallbacks.size(); j++)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst auto& ninfo = pendingScreenshotCallbacks[j];\n\t\t\t\t\t\tninfo.callback(&ninfo, nullptr, nullptr);\n\t\t\t\t\t}\n\t\t\t\t\tvmaDestroyBuffer(vmaAllocator, screenshotBuffer, screenshotAllocation);\n\t\t\t\t\tpendingScreenshotCallbacks.clear();\n\t\t\t\t\tthrow;\n\t\t\t\t}\n\n\t\t\t\tuint8 *screenshot = (uint8*)img->getData();\n\n\t\t\t\tif (swapChainImageFormat == VK_FORMAT_B8G8R8A8_UNORM || swapChainImageFormat == VK_FORMAT_B8G8R8A8_SRGB)\n\t\t\t\t{\n\t\t\t\t\t// Convert from BGRA to RGBA and replace alpha with full opacity.\n\t\t\t\t\tfor (size_t i = 0; i < img->getSize(); i += 4)\n\t\t\t\t\t{\n\t\t\t\t\t\tuint8 r = screenshot[i + 2];\n\t\t\t\t\t\tscreenshot[i + 2] = screenshot[i + 0];\n\t\t\t\t\t\tscreenshot[i + 0] = r;\n\t\t\t\t\t\tscreenshot[i + 3] = 255;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Replace alpha with full opacity.\n\t\t\t\t\tfor (size_t i = 0; i < img->getSize(); i += 4)\n\t\t\t\t\t\tscreenshot[i + 3] = 255;\n\t\t\t\t}\n\n\t\t\t\tinfo.callback(&info, img, screenshotCallbackData);\n\t\t\t\timg->release();\n\t\t\t}\n\n\t\t\tvmaDestroyBuffer(vmaAllocator, screenshotBuffer, screenshotAllocation);\n\t\t\tpendingScreenshotCallbacks.clear();\n\t\t}\n\n\t\tif (submitMode == SUBMIT_RESTART)\n\t\t\tstartRecordingGraphicsCommands();\n\t}\n}\n\nvoid Graphics::present(void *screenshotCallbackdata)\n{\n\tif (!isActive())\n\t\treturn;\n\n\tif (isRenderTargetActive())\n\t\tthrow love::Exception(\"present cannot be called while a render target is active.\");\n\n\tif (!renderPassState.active && renderPassState.windowClearRequested)\n\t\tstartRenderPass();\n\n\tdeprecations.draw(this);\n\n\tsubmitGpuCommands(SUBMIT_PRESENT, screenshotCallbackdata);\n\n\tVkResult result = VK_SUCCESS;\n\n\tif (!swapChainImages.empty())\n\t{\n\t\tVkPresentInfoKHR presentInfo{};\n\t\tpresentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;\n\t\tpresentInfo.waitSemaphoreCount = 1;\n\t\tpresentInfo.pWaitSemaphores = &renderFinishedSemaphores.at(currentFrame);\n\t\tpresentInfo.swapchainCount = 1;\n\t\tpresentInfo.pSwapchains = &swapChain;\n\t\tpresentInfo.pImageIndices = &imageIndex;\n\n\t\tresult = vkQueuePresentKHR(presentQueue, &presentInfo);\n\t}\n\telse\n\t{\n\t\t// Presenting without a real swap chain can happen if the window is minimized.\n\t\t// Check every frame to see if a proper one can be created, in this situation.\n\t\tVkSurfaceCapabilitiesKHR capabilities = {};\n\t\tif (vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, &capabilities) == VK_SUCCESS)\n\t\t{\n\t\t\tVkExtent2D extent = chooseSwapExtent(capabilities);\n\t\t\tif (extent.width > 0 && extent.height > 0)\n\t\t\t\tswapChainRecreationRequested = true;\n\t\t}\n\t}\n\n\tif (result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_SUBOPTIMAL_KHR || swapChainRecreationRequested)\n\t{\n\t\tswapChainRecreationRequested = false;\n\t\trecreateSwapChain();\n\t}\n\telse if (result != VK_SUCCESS)\n\t\tthrow love::Exception(\"failed to present swap chain image\");\n\n\tfor (love::graphics::StreamBuffer *buffer : batchedDrawState.vb)\n\t\tbuffer->nextFrame();\n\tbatchedDrawState.indexBuffer->nextFrame();\n\n\tdrawCalls = 0;\n\trenderTargetSwitchCount = 0;\n\tdrawCallsBatched = 0;\n\n\tupdatePendingReadbacks();\n\tupdateTemporaryResources();\n\n\tcurrentFrame = (currentFrame + 1) % MAX_FRAMES_IN_FLIGHT;\n\trealFrameIndex++;\n\n\tbeginFrame();\n}\n\nvoid Graphics::backbufferChanged(int width, int height, int pixelwidth, int pixelheight, bool backbufferstencil, bool backbufferdepth, int msaa)\n{\n\tif (swapChain != VK_NULL_HANDLE && (pixelwidth != this->pixelWidth || pixelheight != this->pixelHeight || width != this->width || height != this->height\n\t\t|| backbufferstencil != this->backbufferHasStencil || backbufferdepth != this->backbufferHasDepth || msaa != requestedMsaa))\n\t\trequestSwapchainRecreation();\n\n\tthis->width = width;\n\tthis->height = height;\n\tthis->pixelWidth = pixelwidth;\n\tthis->pixelHeight = pixelheight;\n\n\tthis->backbufferHasStencil = backbufferstencil;\n\tthis->backbufferHasDepth = backbufferdepth;\n\tthis->requestedMsaa = msaa;\n\n\tif (!isRenderTargetActive())\n\t\tresetProjection();\n\n\tif (swapChain != VK_NULL_HANDLE)\n\t\tmsaaSamples = getMsaaCount(requestedMsaa);\n\n\t// Don't wait until the next frame starts to recreate the swapchain - doing so\n\t// will cause a 1 frame delay in the backbuffer size on resize, and it can cause\n\t// MSAA state to get out of sync for a frame.\n\tif (swapChainRecreationRequested)\n\t{\n\t\tswapChainRecreationRequested = false;\n\t\tsubmitGpuCommands(SUBMIT_NOPRESENT);\n\t\trecreateSwapChain();\n\t\tbeginSwapChainFrame();\n\t}\n}\n\nbool Graphics::setMode(void *context, int width, int height, int pixelwidth, int pixelheight, bool backbufferstencil, bool backbufferdepth, int msaa)\n{\n\t// Must be called before the swapchain is created.\n\tbackbufferChanged(width, height, pixelwidth, pixelheight, backbufferstencil, backbufferdepth, msaa);\n\n\tcleanUpFunctions.clear();\n\tcleanUpFunctions.resize(MAX_FRAMES_IN_FLIGHT);\n\n\treadbackCallbacks.clear();\n\treadbackCallbacks.resize(MAX_FRAMES_IN_FLIGHT);\n\n\tbool createBaseObjects = physicalDevice == VK_NULL_HANDLE;\n\n\tcreateSurface();\n\n\tif (createBaseObjects)\n\t{\n\t\tpickPhysicalDevice();\n\t\tcreateLogicalDevice();\n\t\tcreatePipelineCache();\n\t\tinitVMA();\n\t\tinitCapabilities();\n\t}\n\n\tmsaaSamples = getMsaaCount(requestedMsaa);\n\n\tcreateSwapChain();\n\tcreateImageViews();\n\tcreateColorResources();\n\tcreateDepthResources();\n\ttransitionColorDepthLayouts = true;\n\n\tif (createBaseObjects)\n\t{\n\t\tcreateCommandPool();\n\t\tcreateCommandBuffers();\n\t\tcreateSyncObjects();\n\t}\n\n\tif (localUniformBuffer == nullptr)\n\t\tlocalUniformBuffer.set(new StreamBuffer(this, BUFFERUSAGE_UNIFORM, 1024 * 512 * 1), Acquire::NORETAIN);\n\n\tbeginFrame();\n\n\tif (createBaseObjects)\n\t{\n\t\tif (batchedDrawState.vb[0] == nullptr)\n\t\t{\n\t\t\t// Initial sizes that should be good enough for most cases. It will\n\t\t\t// resize to fit if needed, later.\n\t\t\tbatchedDrawState.vb[0] = new StreamBuffer(this, BUFFERUSAGE_VERTEX, 1024 * 1024 * 1);\n\t\t\tbatchedDrawState.vb[1] = new StreamBuffer(this, BUFFERUSAGE_VERTEX, 256 * 1024 * 1);\n\t\t\tbatchedDrawState.indexBuffer = new StreamBuffer(this, BUFFERUSAGE_INDEX, sizeof(uint16) * LOVE_UINT16_MAX);\n\t\t}\n\n\t\tif (defaultVertexBuffer == nullptr)\n\t\t{\n\t\t\tstruct DefaultData\n\t\t\t{\n\t\t\t\tfloat floats[4];\n\t\t\t\tint ints[4];\n\t\t\t\tfloat color[4];\n\t\t\t} data;\n\n\t\t\tdata.floats[0] = 0.0f;\n\t\t\tdata.floats[1] = 0.0f;\n\t\t\tdata.floats[2] = 0.0f;\n\t\t\tdata.floats[3] = 1.0f;\n\n\t\t\tdata.ints[0] = 0;\n\t\t\tdata.ints[1] = 0;\n\t\t\tdata.ints[2] = 0;\n\t\t\tdata.ints[3] = 1;\n\n\t\t\tdata.color[0] = 1.0f;\n\t\t\tdata.color[1] = 1.0f;\n\t\t\tdata.color[2] = 1.0f;\n\t\t\tdata.color[3] = 1.0f;\n\n\t\t\tstd::vector<Buffer::DataDeclaration> format = {\n\t\t\t\tBuffer::DataDeclaration(\"Floats\", DATAFORMAT_FLOAT_VEC4),\n\t\t\t\tBuffer::DataDeclaration(\"Ints\", DATAFORMAT_INT32_VEC4),\n\t\t\t\tBuffer::DataDeclaration(\"Color\", DATAFORMAT_FLOAT_VEC4)\n\t\t\t};\n\n\t\t\tBuffer::Settings settings(BUFFERUSAGEFLAG_VERTEX, BUFFERDATAUSAGE_STATIC);\n\t\t\tdefaultVertexBuffer.set(newBuffer(settings, format, &data, sizeof(DefaultData), 1), Acquire::NORETAIN);\n\n\t\t\tVkBuffer buffer = (VkBuffer)defaultVertexBuffer->getHandle();\n\t\t\tVkDeviceSize offset = 0;\n\t\t\tvkCmdBindVertexBuffers(commandBuffers.at(currentFrame), DEFAULT_VERTEX_BUFFER_BINDING, 1, &buffer, &offset);\n\t\t}\n\n\t\tcreateDefaultShaders();\n\t\tShader::current = Shader::standardShaders[Shader::StandardShader::STANDARD_DEFAULT];\n\t\tcreateQuadIndexBuffer();\n\t\tcreateFanIndexBuffer();\n\n\t\tcurrentFrame = 0;\n\t}\n\n\trestoreState(states.back());\n\n\tVulkan::resetShaderSwitches();\n\n\tcreated = true;\n\tdrawCalls = 0;\n\tdrawCallsBatched = 0;\n\n\treturn true;\n}\n\nvoid Graphics::initCapabilities()\n{\n\tcapabilities.features[FEATURE_MULTI_RENDER_TARGET_FORMATS] = true;\n\tcapabilities.features[FEATURE_CLAMP_ZERO] = true;\n\tcapabilities.features[FEATURE_CLAMP_ONE] = true;\n\tcapabilities.features[FEATURE_LIGHTEN] = true;\n\tcapabilities.features[FEATURE_FULL_NPOT] = true;\n\tcapabilities.features[FEATURE_PIXEL_SHADER_HIGHP] = true;\n\tcapabilities.features[FEATURE_SHADER_DERIVATIVES] = true;\n\tcapabilities.features[FEATURE_GLSL3] = true;\n\tcapabilities.features[FEATURE_GLSL4] = true;\n\tcapabilities.features[FEATURE_INSTANCING] = true;\n\tcapabilities.features[FEATURE_TEXEL_BUFFER] = true;\n\tcapabilities.features[FEATURE_COPY_TEXTURE_TO_BUFFER] = true;\n\tcapabilities.features[FEATURE_INDIRECT_DRAW] = true;\n\tstatic_assert(FEATURE_MAX_ENUM == 13, \"Graphics::initCapabilities must be updated when adding a new graphics feature!\");\n\n\tVkPhysicalDeviceProperties properties;\n\tvkGetPhysicalDeviceProperties(physicalDevice, &properties);\n\n\tcapabilities.limits[LIMIT_POINT_SIZE] = properties.limits.pointSizeRange[1];\n\tcapabilities.limits[LIMIT_TEXTURE_SIZE] = properties.limits.maxImageDimension2D;\n\tcapabilities.limits[LIMIT_TEXTURE_LAYERS] = properties.limits.maxImageArrayLayers;\n\tcapabilities.limits[LIMIT_VOLUME_TEXTURE_SIZE] = properties.limits.maxImageDimension3D;\n\tcapabilities.limits[LIMIT_CUBE_TEXTURE_SIZE] = properties.limits.maxImageDimensionCube;\n\tcapabilities.limits[LIMIT_TEXEL_BUFFER_SIZE] = properties.limits.maxTexelBufferElements;\n\tcapabilities.limits[LIMIT_SHADER_STORAGE_BUFFER_SIZE] = properties.limits.maxStorageBufferRange;\n\tcapabilities.limits[LIMIT_THREADGROUPS_X] = properties.limits.maxComputeWorkGroupCount[0];\n\tcapabilities.limits[LIMIT_THREADGROUPS_Y] = properties.limits.maxComputeWorkGroupCount[1];\n\tcapabilities.limits[LIMIT_THREADGROUPS_Z] = properties.limits.maxComputeWorkGroupCount[2];\n\tcapabilities.limits[LIMIT_RENDER_TARGETS] = properties.limits.maxColorAttachments;\n\tcapabilities.limits[LIMIT_TEXTURE_MSAA] = static_cast<double>(getMsaaCount(64));\n\tcapabilities.limits[LIMIT_ANISOTROPY] = properties.limits.maxSamplerAnisotropy;\n\tstatic_assert(LIMIT_MAX_ENUM == 13, \"Graphics::initCapabilities must be updated when adding a new system limit!\");\n\n\tcapabilities.textureTypes[TEXTURE_2D] = true;\n\tcapabilities.textureTypes[TEXTURE_2D_ARRAY] = true;\n\tcapabilities.textureTypes[TEXTURE_VOLUME] = true;\n\tcapabilities.textureTypes[TEXTURE_CUBE] = true;\n}\n\nvoid Graphics::getAPIStats(int &shaderswitches) const\n{\n\tshaderswitches = static_cast<int>(Vulkan::getNumShaderSwitches());\n}\n\nvoid Graphics::unSetMode()\n{\n\tif (created)\n\t\tsubmitGpuCommands(SUBMIT_NOPRESENT);\n\n\tcreated = false;\n\n\tcleanupSwapChain(true);\n\n\tif (surface != VK_NULL_HANDLE)\n\t{\n\t\tvkDestroySurfaceKHR(instance, surface, nullptr);\n\t\tsurface = VK_NULL_HANDLE;\n\t}\n}\n\nvoid Graphics::setActive(bool enable)\n{\n\tflushBatchedDraws();\n\tactive = enable;\n}\n\nint Graphics::getRequestedBackbufferMSAA() const\n{\n\treturn requestedMsaa;\n}\n\nint Graphics::getBackbufferMSAA() const\n{\n\treturn static_cast<int>(msaaSamples);\n}\n\nvoid Graphics::setFrontFaceWinding(Winding winding)\n{\n\tconst auto& currentState = states.back();\n\n\tif (currentState.winding == winding)\n\t\treturn;\n\n\tflushBatchedDraws();\n\n\tstates.back().winding = winding;\n\n\tif (optionalDeviceExtensions.extendedDynamicState)\n\t\tvkCmdSetFrontFaceEXT(\n\t\t\tcommandBuffers.at(currentFrame),\n\t\t\tVulkan::getFrontFace(winding));\n}\n\nvoid Graphics::setColorMask(ColorChannelMask mask)\n{\n\tflushBatchedDraws();\n\n\tstates.back().colorMask = mask;\n}\n\nvoid Graphics::setBlendState(const BlendState &blend)\n{\n\tflushBatchedDraws();\n\n\tstates.back().blend = blend;\n}\n\nvoid Graphics::setPointSize(float size)\n{\n\tif (size != states.back().pointSize)\n\t\tflushBatchedDraws();\n\n\tstates.back().pointSize = size;\n}\n\nbool Graphics::usesGLSLES() const\n{\n\treturn false;\n}\n\nGraphics::RendererInfo Graphics::getRendererInfo() const\n{\n\tVkPhysicalDeviceProperties deviceProperties;\n\tvkGetPhysicalDeviceProperties(physicalDevice, &deviceProperties);\n\n\tGraphics::RendererInfo info;\n\n\tinfo.name = \"Vulkan\";\n\tinfo.device = deviceProperties.deviceName;\n\tinfo.vendor = Vulkan::getVendorName(deviceProperties.vendorID);\n\tinfo.version = Vulkan::getVulkanApiVersion(deviceProperties.apiVersion);\n\n\treturn info;\n}\n\nvoid Graphics::draw(const DrawCommand &cmd)\n{\n\tprepareDraw(cmd.attributesID, *cmd.buffers, cmd.texture, cmd.primitiveType, cmd.cullMode);\n\n\tif (cmd.indirectBuffer != nullptr)\n\t{\n\t\tvkCmdDrawIndirect(\n\t\t\tcommandBuffers.at(currentFrame),\n\t\t\t(VkBuffer) cmd.indirectBuffer->getHandle(),\n\t\t\tcmd.indirectBufferOffset,\n\t\t\t1,\n\t\t\t0);\n\t}\n\telse\n\t{\n\t\tvkCmdDraw(\n\t\t\tcommandBuffers.at(currentFrame),\n\t\t\t(uint32) cmd.vertexCount,\n\t\t\t(uint32) cmd.instanceCount,\n\t\t\t(uint32) cmd.vertexStart,\n\t\t\t0);\n\t}\n\n\tdrawCalls++;\n}\n\nvoid Graphics::draw(const DrawIndexedCommand &cmd)\n{\n\tprepareDraw(cmd.attributesID, *cmd.buffers, cmd.texture, cmd.primitiveType, cmd.cullMode);\n\n\tvkCmdBindIndexBuffer(\n\t\tcommandBuffers.at(currentFrame),\n\t\t(VkBuffer) cmd.indexBuffer->getHandle(),\n\t\t(VkDeviceSize) cmd.indexBufferOffset,\n\t\tVulkan::getVulkanIndexBufferType(cmd.indexType));\n\n\tif (cmd.indirectBuffer != nullptr)\n\t{\n\t\tvkCmdDrawIndexedIndirect(\n\t\t\tcommandBuffers.at(currentFrame),\n\t\t\t(VkBuffer) cmd.indirectBuffer->getHandle(),\n\t\t\tcmd.indirectBufferOffset,\n\t\t\t1,\n\t\t\t0);\n\t}\n\telse\n\t{\n\t\tvkCmdDrawIndexed(\n\t\t\tcommandBuffers.at(currentFrame),\n\t\t\t(uint32) cmd.indexCount,\n\t\t\t(uint32) cmd.instanceCount,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0);\n\t}\n\n\tdrawCalls++;\n}\n\nvoid Graphics::drawQuads(int start, int count, VertexAttributesID attributesID, const BufferBindings &buffers, graphics::Texture *texture)\n{\n\tconst int MAX_VERTICES_PER_DRAW = LOVE_UINT16_MAX;\n\tconst int MAX_QUADS_PER_DRAW = MAX_VERTICES_PER_DRAW / 4;\n\n\tprepareDraw(attributesID, buffers, texture, PRIMITIVE_TRIANGLES, CULL_NONE);\n\n\tvkCmdBindIndexBuffer(\n\t\tcommandBuffers.at(currentFrame),\n\t\t(VkBuffer)quadIndexBuffer->getHandle(),\n\t\t0,\n\t\tVulkan::getVulkanIndexBufferType(INDEX_UINT16));\n\n\tint baseVertex = start * 4;\n\n\tfor (int quadindex = 0; quadindex < count; quadindex += MAX_QUADS_PER_DRAW)\n\t{\n\t\tint quadcount = std::min(MAX_QUADS_PER_DRAW, count - quadindex);\n\n\t\tvkCmdDrawIndexed(\n\t\t\tcommandBuffers.at(currentFrame),\n\t\t\tstatic_cast<uint32_t>(quadcount * 6),\n\t\t\t1,\n\t\t\t0,\n\t\t\tbaseVertex,\n\t\t\t0);\n\t\tbaseVertex += quadcount * 4;\n\n\t\tdrawCalls++;\n\t}\n}\n\nvoid Graphics::setColor(Colorf c)\n{\n\tc.r = std::min(std::max(c.r, 0.0f), 1.0f);\n\tc.g = std::min(std::max(c.g, 0.0f), 1.0f);\n\tc.b = std::min(std::max(c.b, 0.0f), 1.0f);\n\tc.a = std::min(std::max(c.a, 0.0f), 1.0f);\n\n\tstates.back().color = c;\n}\n\nvoid Graphics::applyScissor()\n{\n\tVkRect2D scissor{};\n\n\tbool win = renderPassState.isWindow;\n\tscissor.extent.width = win ? swapChainExtent.width : renderPassState.width;\n\tscissor.extent.height = win ? swapChainExtent.height : renderPassState.height;\n\n\tif (states.back().scissor)\n\t{\n\t\tconst Rect &rect = states.back().scissorRect;\n\t\tdouble dpiScale = getCurrentDPIScale();\n\n\t\tint minScissorX = (int)(rect.x * dpiScale);\n\t\tint minScissorY = (int)(rect.y * dpiScale);\n\n\t\tint maxScissorX = minScissorX + (int)(rect.w * dpiScale) - 1;\n\t\tint maxScissorY = minScissorY + (int)(rect.h * dpiScale) - 1;\n\n\t\t// Avoid negative offsets.\n\t\tint minX = std::max(scissor.offset.x, minScissorX);\n\t\tint minY = std::max(scissor.offset.y, minScissorY);\n\n\t\tint maxX = std::min(scissor.offset.x + (int)scissor.extent.width - 1, maxScissorX);\n\t\tint maxY = std::min(scissor.offset.y + (int)scissor.extent.height - 1, maxScissorY);\n\n\t\tif (maxX >= minX && maxY >= minY)\n\t\t{\n\t\t\tscissor.offset.x = minX;\n\t\t\tscissor.offset.y = minY;\n\t\t\tscissor.extent.width = (maxX - minX) + 1;\n\t\t\tscissor.extent.height = (maxY - minY) + 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tscissor.extent.width = 0;\n\t\t\tscissor.extent.height = 0;\n\t\t}\n\t}\n\n\tvkCmdSetScissor(commandBuffers.at(currentFrame), 0, 1, &scissor);\n}\n\nvoid Graphics::setScissor(const Rect &rect)\n{\n\tflushBatchedDraws();\n\n\tstates.back().scissor = true;\n\tstates.back().scissorRect = rect;\n\n\tif (renderPassState.active)\n\t\tapplyScissor();\n}\n\nvoid Graphics::setScissor()\n{\n\tflushBatchedDraws();\n\n\tstates.back().scissor = false;\n\n\tif (renderPassState.active)\n\t\tapplyScissor();\n}\n\nvoid Graphics::setStencilState(const StencilState &s)\n{\n\tvalidateStencilState(s);\n\n\tflushBatchedDraws();\n\n\tvkCmdSetStencilWriteMask(commandBuffers.at(currentFrame), VK_STENCIL_FRONT_AND_BACK, s.writeMask);\n\t\n\tvkCmdSetStencilCompareMask(commandBuffers.at(currentFrame), VK_STENCIL_FRONT_AND_BACK, s.readMask);\n\tvkCmdSetStencilReference(commandBuffers.at(currentFrame), VK_STENCIL_FRONT_AND_BACK, s.value);\n\n\tif (optionalDeviceExtensions.extendedDynamicState)\n\t\tvkCmdSetStencilOpEXT(\n\t\t\tcommandBuffers.at(currentFrame),\n\t\t\tVK_STENCIL_FRONT_AND_BACK,\n\t\t\tVK_STENCIL_OP_KEEP, Vulkan::getStencilOp(s.action),\n\t\t\tVK_STENCIL_OP_KEEP, Vulkan::getCompareOp(getReversedCompareMode(s.compare)));\n\n\tstates.back().stencil = s;\n}\n\nvoid Graphics::setDepthMode(CompareMode compare, bool write)\n{\n\tvalidateDepthState(write);\n\n\tflushBatchedDraws();\n\n\tif (optionalDeviceExtensions.extendedDynamicState)\n\t{\n\t\tvkCmdSetDepthCompareOpEXT(\n\t\t\tcommandBuffers.at(currentFrame), Vulkan::getCompareOp(compare));\n\n\t\tvkCmdSetDepthWriteEnableEXT(\n\t\t\tcommandBuffers.at(currentFrame), Vulkan::getBool(write));\n\t}\n\n\tstates.back().depthTest = compare;\n\tstates.back().depthWrite = write;\n}\n\nvoid Graphics::setWireframe(bool enable)\n{\n\tflushBatchedDraws();\n\n\tstates.back().wireframe = enable;\n}\n\nbool Graphics::isPixelFormatSupported(PixelFormat format, uint32 usage)\n{\n\tformat = getSizedFormat(format);\n\n\tswitch (format)\n\t{\n\tcase PIXELFORMAT_PVR1_RGB2_UNORM:\n\tcase PIXELFORMAT_PVR1_RGB2_sRGB:\n\tcase PIXELFORMAT_PVR1_RGB4_UNORM:\n\tcase PIXELFORMAT_PVR1_RGB4_sRGB:\n\tcase PIXELFORMAT_PVR1_RGBA2_UNORM:\n\tcase PIXELFORMAT_PVR1_RGBA2_sRGB:\n\tcase PIXELFORMAT_PVR1_RGBA4_UNORM:\n\tcase PIXELFORMAT_PVR1_RGBA4_sRGB:\n\t\t// Lets not support these in Vulkan - they're deprecated.\n\t\treturn false;\n\tdefault:\n\t\tbreak;\n\t}\n\n\tauto vulkanFormat = Vulkan::getTextureFormat(format);\n\n\tVkFormatProperties formatProperties;\n\tvkGetPhysicalDeviceFormatProperties(physicalDevice, vulkanFormat.internalFormat, &formatProperties);\n\n\tVkFormatFeatureFlags featureFlags = formatProperties.optimalTilingFeatures;\n\tVkImageUsageFlags usageFlags = 0;\n\n\tif (!featureFlags)\n\t\treturn false;\n\n\tif (usage & PIXELFORMATUSAGEFLAGS_SAMPLE)\n\t{\n\t\tusageFlags |= VK_IMAGE_USAGE_SAMPLED_BIT;\n\t\tif (!(featureFlags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT))\n\t\t\treturn false;\n\t}\n\n\tif (usage & PIXELFORMATUSAGEFLAGS_LINEAR)\n\t{\n\t\tif (!(featureFlags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT))\n\t\t\treturn false;\n\t}\n\n\tif (usage & PIXELFORMATUSAGEFLAGS_RENDERTARGET)\n\t{\n\t\tif (isPixelFormatDepth(format) || isPixelFormatDepthStencil(format))\n\t\t{\n\t\t\tusageFlags |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;\n\t\t\tif (!(featureFlags & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT))\n\t\t\t\treturn false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tusageFlags |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;\n\t\t\tif (!(featureFlags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT))\n\t\t\t\treturn false;\n\t\t}\n\t}\n\n\tif (usage & PIXELFORMATUSAGEFLAGS_BLEND)\n\t{\n\t\tif (!(featureFlags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT))\n\t\t\treturn false;\n\t}\n\n\tif (usage & PIXELFORMATUSAGEFLAGS_COMPUTEWRITE)\n\t{\n\t\tusageFlags |= VK_IMAGE_USAGE_STORAGE_BIT;\n\t\tif (!(featureFlags & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT))\n\t\t\treturn false;\n\t}\n\n\tif (usage & PIXELFORMATUSAGEFLAGS_MSAA)\n\t{\n\t\tVkImageFormatProperties properties;\n\n\t\tif (vkGetPhysicalDeviceImageFormatProperties(physicalDevice, vulkanFormat.internalFormat, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL, usageFlags, 0, &properties) != VK_SUCCESS)\n\t\t\treturn false;\n\n\t\tif (static_cast<uint32_t>(properties.sampleCounts) == 1)\n\t\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nRenderer Graphics::getRenderer() const\n{\n\treturn RENDERER_VULKAN;\n}\n\ngraphics::GraphicsReadback *Graphics::newReadbackInternal(ReadbackMethod method, love::graphics::Buffer *buffer, size_t offset, size_t size, data::ByteData *dest, size_t destoffset)\n{\n\treturn new GraphicsReadback(this, method, buffer, offset, size, dest, destoffset);\n}\n\ngraphics::GraphicsReadback *Graphics::newReadbackInternal(ReadbackMethod method, love::graphics::Texture *texture, int slice, int mipmap, const Rect &rect, image::ImageData *dest, int destx, int desty)\n{\n\treturn new GraphicsReadback(this, method, texture, slice, mipmap, rect, dest, destx, desty);\n}\n\ngraphics::ShaderStage *Graphics::newShaderStageInternal(ShaderStageType stage, const std::string &cachekey, const std::string &source, bool gles)\n{\n\treturn new ShaderStage(this, stage, source, gles, cachekey);\n}\n\ngraphics::Shader *Graphics::newShaderInternal(StrongRef<love::graphics::ShaderStage> stages[SHADERSTAGE_MAX_ENUM], const Shader::CompileOptions &options)\n{\n\treturn new Shader(stages, options);\n}\n\ngraphics::StreamBuffer *Graphics::newStreamBuffer(BufferUsage type, size_t size)\n{\n\treturn new StreamBuffer(this, type, size);\n}\n\nstatic bool computeDispatchBarrierFlags(Shader *shader, VkAccessFlags &dstAccessFlags, VkPipelineStageFlags &dstStageFlags)\n{\n\tfor (const auto &info : shader->getActiveTextureInfo())\n\t{\n\t\tif ((info.access & Shader::ACCESS_WRITE) == 0)\n\t\t\tcontinue;\n\n\t\tif (info.texture == nullptr)\n\t\t\treturn false;\n\n\t\tauto tex = (Texture *) info.texture;\n\n\t\t// All writable images use the GENERAL layout.\n\t\t// TODO: this is pretty messy.\n\t\tbool depthStencil  = isPixelFormatDepthStencil(tex->getPixelFormat());\n\t\tVulkan::addImageLayoutTransitionOptions(false, tex->isRenderTarget(), depthStencil, VK_IMAGE_LAYOUT_GENERAL, dstAccessFlags, dstStageFlags);\n\t}\n\n\tfor (const auto &info : shader->getActiveStorageBufferInfo())\n\t{\n\t\tif ((info.access & Shader::ACCESS_WRITE) == 0)\n\t\t\tcontinue;\n\n\t\tif (info.buffer == nullptr)\n\t\t\treturn false;\n\n\t\tauto b = (Buffer *) info.buffer;\n\t\tdstAccessFlags |= b->getBarrierDstAccessFlags();\n\t\tdstStageFlags |= b->getBarrierDstStageFlags();\n\t}\n\n\treturn true;\n}\n\nbool Graphics::dispatch(love::graphics::Shader *shader, int x, int y, int z)\n{\n\tauto computeShader = (Shader *) shader;\n\n\tVkMemoryBarrier barrier{};\n\tbarrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;\n\tbarrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;\n\tVkPipelineStageFlags dstStageMask = 0;\n\tif (!computeDispatchBarrierFlags(computeShader, barrier.dstAccessMask, dstStageMask))\n\t\treturn false;\n\n\tusedShadersInFrame.insert(computeShader);\n\n\tif (renderPassState.active)\n\t\tendRenderPass();\n\n\tvkCmdBindPipeline(commandBuffers.at(currentFrame), VK_PIPELINE_BIND_POINT_COMPUTE, computeShader->getComputePipeline());\n\n\tcomputeShader->cmdPushDescriptorSets(commandBuffers.at(currentFrame), VK_PIPELINE_BIND_POINT_COMPUTE);\n\n\tvkCmdDispatch(commandBuffers.at(currentFrame), (uint32) x, (uint32) y, (uint32) z);\n\n\t// Image layout transitions aren't needed, every writable image will be in the GENERAL layout.\n\tif (barrier.dstAccessMask != 0 || dstStageMask != 0)\n\t\tvkCmdPipelineBarrier(commandBuffers.at(currentFrame), VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, dstStageMask, 0, 1, &barrier, 0, nullptr, 0, nullptr);\n\n\treturn true;\n}\n\nbool Graphics::dispatch(love::graphics::Shader *shader, love::graphics::Buffer *indirectargs, size_t argsoffset)\n{\n\tauto computeShader = (Shader *) shader;\n\n\tVkMemoryBarrier barrier{};\n\tbarrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;\n\tbarrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;\n\tVkPipelineStageFlags dstStageMask = 0;\n\tif (!computeDispatchBarrierFlags(computeShader, barrier.dstAccessMask, dstStageMask))\n\t\treturn false;\n\n\tusedShadersInFrame.insert(computeShader);\n\n\tif (renderPassState.active)\n\t\tendRenderPass();\n\n\tvkCmdBindPipeline(commandBuffers.at(currentFrame), VK_PIPELINE_BIND_POINT_COMPUTE, computeShader->getComputePipeline());\n\n\tcomputeShader->cmdPushDescriptorSets(commandBuffers.at(currentFrame), VK_PIPELINE_BIND_POINT_COMPUTE);\n\n\tvkCmdDispatchIndirect(commandBuffers.at(currentFrame), (VkBuffer) indirectargs->getHandle(), argsoffset);\n\n\t// Image layout transitions aren't needed, every writable image will be in the GENERAL layout.\n\tif (barrier.dstAccessMask != 0 || dstStageMask != 0)\n\t\tvkCmdPipelineBarrier(commandBuffers.at(currentFrame), VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, dstStageMask, 0, 1, &barrier, 0, nullptr, 0, nullptr);\n\n\treturn true;\n}\n\nvoid Graphics::setRenderTargetsInternal(const RenderTargets &rts, int pixelw, int pixelh, bool hasSRGBtexture)\n{\n\tif (renderPassState.active)\n\t\tendRenderPass();\n\n\tbool isWindow = rts.getFirstTarget().texture == nullptr;\n\tif (isWindow)\n\t\tsetDefaultRenderPass();\n\telse\n\t\tsetRenderPass(rts, pixelw, pixelh);\n}\n\n// END IMPLEMENTATION OVERRIDDEN FUNCTIONS\n\nvoid Graphics::initDynamicState()\n{\n\tvkCmdSetStencilWriteMask(commandBuffers.at(currentFrame), VK_STENCIL_FRONT_AND_BACK, states.back().stencil.writeMask);\n\tvkCmdSetStencilCompareMask(commandBuffers.at(currentFrame), VK_STENCIL_FRONT_AND_BACK, states.back().stencil.readMask);\n\tvkCmdSetStencilReference(commandBuffers.at(currentFrame), VK_STENCIL_FRONT_AND_BACK, states.back().stencil.value);\n\n\tif (optionalDeviceExtensions.extendedDynamicState)\n\t{\n\t\t vkCmdSetStencilOpEXT(\n\t\t\tcommandBuffers.at(currentFrame),\n\t\t\tVK_STENCIL_FRONT_AND_BACK,\n\t\t\tVK_STENCIL_OP_KEEP, Vulkan::getStencilOp(states.back().stencil.action),\n\t\t\tVK_STENCIL_OP_KEEP, Vulkan::getCompareOp(getReversedCompareMode(states.back().stencil.compare)));\n\n\t\tvkCmdSetDepthCompareOpEXT(\n\t\t\tcommandBuffers.at(currentFrame), Vulkan::getCompareOp(states.back().depthTest));\n\n\t\tvkCmdSetDepthWriteEnableEXT(\n\t\t\tcommandBuffers.at(currentFrame), Vulkan::getBool(states.back().depthWrite));\n\n\t\tvkCmdSetFrontFaceEXT(\n\t\t\tcommandBuffers.at(currentFrame), Vulkan::getFrontFace(states.back().winding));\n\t}\n}\n\nvoid Graphics::beginSwapChainFrame()\n{\n\tif (swapChain != VK_NULL_HANDLE)\n\t{\n\t\twhile (true)\n\t\t{\n\t\t\tVkResult result = vkAcquireNextImageKHR(device, swapChain, UINT64_MAX, imageAvailableSemaphores[currentFrame], VK_NULL_HANDLE, &imageIndex);\n\t\t\tif (result == VK_ERROR_OUT_OF_DATE_KHR)\n\t\t\t{\n\t\t\t\trecreateSwapChain();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\telse if (result != VK_SUCCESS && result != VK_SUBOPTIMAL_KHR)\n\t\t\t\tthrow love::Exception(\"failed to acquire swap chain image\");\n\n\t\t\tbreak;\n\t\t}\n\n\t\timageRequested = true;\n\t}\n\telse\n\t{\n\t\timageRequested = false;\n\t}\n\n\tstartRecordingGraphicsCommands();\n\n\tif (!swapChainImages.empty())\n\t{\n\t\tVulkan::cmdTransitionImageLayout(\n\t\t\tcommandBuffers.at(currentFrame),\n\t\t\tswapChainImages[imageIndex],\n\t\t\tswapChainPixelFormat, true,\n\t\t\tVK_IMAGE_LAYOUT_UNDEFINED,\n\t\t\tVK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);\n\t}\n\n\tif (transitionColorDepthLayouts)\n\t{\n\t\tif (depthImage)\n\t\t\tVulkan::cmdTransitionImageLayout(\n\t\t\t\tcommandBuffers.at(currentFrame),\n\t\t\t\tdepthImage,\n\t\t\t\tdepthStencilPixelFormat, true,\n\t\t\t\tVK_IMAGE_LAYOUT_UNDEFINED,\n\t\t\t\tVK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);\n\n\t\tif (colorImage)\n\t\t\tVulkan::cmdTransitionImageLayout(\n\t\t\t\tcommandBuffers.at(currentFrame),\n\t\t\t\tcolorImage,\n\t\t\t\tswapChainPixelFormat, true,\n\t\t\t\tVK_IMAGE_LAYOUT_UNDEFINED,\n\t\t\t\tVK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);\n\n\t\ttransitionColorDepthLayouts = false;\n\t}\n}\n\nvoid Graphics::beginFrame()\n{\n\tvkWaitForFences(device, 1, &inFlightFences[currentFrame], VK_TRUE, UINT64_MAX);\n\n\tfor (auto &readbackCallback : readbackCallbacks.at(currentFrame))\n\t\treadbackCallback();\n\treadbackCallbacks.at(currentFrame).clear();\n\n\tfor (auto &cleanUpFn : cleanUpFunctions.at(currentFrame))\n\t\tcleanUpFn();\n\tcleanUpFunctions.at(currentFrame).clear();\n\n\tbeginSwapChainFrame();\n\n\tVulkan::resetShaderSwitches();\n\n\tfor (const auto &shader : usedShadersInFrame)\n\t\tshader->newFrame(realFrameIndex);\n\tusedShadersInFrame.clear();\n\n\tlocalUniformBuffer->nextFrame();\n}\n\nvoid Graphics::startRecordingGraphicsCommands()\n{\n\tVkCommandBufferBeginInfo beginInfo{};\n\tbeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;\n\tbeginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;\n\tbeginInfo.pInheritanceInfo = nullptr;\n\n\tVkResult result = vkBeginCommandBuffer(commandBuffers.at(currentFrame), &beginInfo);\n\tif (result != VK_SUCCESS)\n\t\tthrow love::Exception(\"Failed to begin recording Vulkan command buffer: %s\", Vulkan::getErrorString(result));\n\n\tinitDynamicState();\n\n\t// This must be done after vkBeginCommandBuffer (since newTexture needs an\n\t// active command buffer for layout transitions), and before setDefaultRenderPass\n\t// (since that tries to use fakeBackbuffer).\n\tif (swapChainImages.empty() && fakeBackbuffer == nullptr)\n\t{\n\t\tTexture::Settings settings;\n\t\tsettings.format = swapChainPixelFormat;\n\t\tsettings.width = swapChainExtent.width;\n\t\tsettings.height = swapChainExtent.height;\n\t\tsettings.renderTarget = true;\n\t\tsettings.readable.set(false);\n\t\tfakeBackbuffer.set((Texture*)newTexture(settings, nullptr), Acquire::NORETAIN);\n\t}\n\n\t// Update the pending render pass state with current backbuffer data if no RT is active.\n\t// If one is active, the state shouldn't need updating.\n\tif (!isRenderTargetActive())\n\t\tsetDefaultRenderPass();\n\n\tif (defaultVertexBuffer)\n\t{\n\t\tVkBuffer buffer = (VkBuffer)defaultVertexBuffer->getHandle();\n\t\tVkDeviceSize offset = 0;\n\t\tvkCmdBindVertexBuffers(commandBuffers.at(currentFrame), DEFAULT_VERTEX_BUFFER_BINDING, 1, &buffer, &offset);\n\t}\n}\n\nvoid Graphics::endRecordingGraphicsCommands()\n{\n\tif (renderPassState.active)\n\t\tendRenderPass();\n\n\tVkResult result = vkEndCommandBuffer(commandBuffers.at(currentFrame));\n\tif (result != VK_SUCCESS)\n\t\tthrow love::Exception(\"Failed to record Vulkan command buffer: %s\", Vulkan::getErrorString(result));\n}\n\nVkCommandBuffer Graphics::getCommandBufferForDataTransfer()\n{\n\tif (renderPassState.active)\n\t\tendRenderPass();\n\n\treturn commandBuffers.at(currentFrame);\n}\n\nvoid Graphics::queueCleanUp(std::function<void()> cleanUp)\n{\n\tcleanUpFunctions.at(currentFrame).push_back(cleanUp);\n}\n\nvoid Graphics::addReadbackCallback(std::function<void()> callback)\n{\n\treadbackCallbacks.at(currentFrame).push_back(callback);\n}\n\ngraphics::Shader::BuiltinUniformData Graphics::getCurrentBuiltinUniformData()\n{\n\tlove::graphics::Shader::BuiltinUniformData data;\n\n\tdata.transformMatrix = getTransform();\n\tdata.projectionMatrix = getDeviceProjection();\n\n\tdata.scaleParams.x = (float) getCurrentDPIScale();\n\tdata.scaleParams.y = getPointSize();\n\n\t// Flip y to convert input y-up [-1, 1] to vulkan's y-down [-1, 1].\n\t// Convert input z [-1, 1] to vulkan [0, 1].\n\tuint32 flags = Shader::CLIP_TRANSFORM_FLIP_Y | Shader::CLIP_TRANSFORM_Z_NEG1_1_TO_0_1;\n\tdata.clipSpaceParams = Shader::computeClipSpaceParams(flags);\n\n\tconst auto &rt = states.back().renderTargets.getFirstTarget();\n\tif (rt.texture != nullptr)\n\t{\n\t\tdata.screenSizeParams.x = rt.texture->getPixelWidth(rt.mipmap);\n\t\tdata.screenSizeParams.y = rt.texture->getPixelHeight(rt.mipmap);\n\t}\n\telse\n\t{\n\t\tdata.screenSizeParams.x = getPixelWidth();\n\t\tdata.screenSizeParams.y = getPixelHeight();\n\t}\n\n\tdata.screenSizeParams.z = 1.0f;\n\tdata.screenSizeParams.w = 0.0f;\n\n\tdata.constantColor = getColor();\n\tgammaCorrectColor(data.constantColor);\n\n\treturn data;\n}\n\nconst OptionalDeviceExtensions &Graphics::getEnabledOptionalDeviceExtensions() const\n{\n\treturn optionalDeviceExtensions;\n}\n\nconst OptionalInstanceExtensions &Graphics::getEnabledOptionalInstanceExtensions() const\n{\n\treturn optionalInstanceExtensions;\n}\n\nbool Graphics::checkValidationSupport()\n{\n\tuint32_t layerCount;\n\tvkEnumerateInstanceLayerProperties(&layerCount, nullptr);\n\n\tstd::vector<VkLayerProperties> availableLayers(layerCount);\n\tvkEnumerateInstanceLayerProperties(&layerCount, availableLayers.data());\n\n\tfor (const char *layerName : validationLayers)\n\t{\n\t\tbool layerFound = false;\n\n\t\tfor (const auto &layerProperties : availableLayers)\n\t\t{\n\t\t\tif (strcmp(layerName, layerProperties.layerName) == 0)\n\t\t\t{\n\t\t\t\tlayerFound = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!layerFound)\n\t\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nvoid Graphics::pickPhysicalDevice()\n{\n\tstruct DeviceRating\n\t{\n\t\tVkPhysicalDevice device;\n\t\tsize_t deviceIndex;\n\t\tint rating;\n\t};\n\n\tuint32_t deviceCount = 0;\n\tvkEnumeratePhysicalDevices(instance, &deviceCount, nullptr);\n\n\tif (deviceCount == 0)\n\t\tthrow love::Exception(\"failed to find GPUs with Vulkan support\");\n\n\tstd::vector<VkPhysicalDevice> devices(deviceCount);\n\tvkEnumeratePhysicalDevices(instance, &deviceCount, devices.data());\n\n\tstd::vector<DeviceRating> candidates;\n\n\tfor (size_t i = 0; i < devices.size(); i++)\n\t{\n\t\tDeviceRating r = {};\n\t\tr.device = devices[i];\n\t\tr.deviceIndex = i;\n\t\tr.rating = rateDeviceSuitability(devices[i], true);\n\t\tcandidates.push_back(r);\n\t}\n\n\tstd::sort(candidates.begin(), candidates.end(), [](const DeviceRating &a, const DeviceRating &b) -> bool\n\t{\n\t\tif (a.rating != b.rating)\n\t\t\treturn a.rating > b.rating;\n\t\treturn a.deviceIndex < b.deviceIndex;\n\t});\n\n\tif (!candidates.empty() && candidates[0].rating > 0)\n\t\tphysicalDevice = candidates[0].device;\n\telse\n\t\tthrow love::Exception(\"Vulkan: failed to find a suitable GPU.\");\n\n\tVkPhysicalDeviceProperties properties;\n\tvkGetPhysicalDeviceProperties(physicalDevice, &properties);\n\tminUniformBufferOffsetAlignment = properties.limits.minUniformBufferOffsetAlignment;\n\tdeviceApiVersion = properties.apiVersion;\n\n\tdepthStencilFormat = findDepthFormat();\n\tswitch (depthStencilFormat)\n\t{\n\tcase VK_FORMAT_D32_SFLOAT_S8_UINT:\n\t\tdepthStencilPixelFormat = PIXELFORMAT_DEPTH32_FLOAT_STENCIL8;\n\t\tbreak;\n\tcase VK_FORMAT_D24_UNORM_S8_UINT:\n\t\tdepthStencilPixelFormat = PIXELFORMAT_DEPTH24_UNORM_STENCIL8;\n\t\tbreak;\n\tdefault:\n\t\tthrow love::Exception(\"Failed to convert vulkan depth/stencil swapchain pixel format %d to love PixelFormat.\", depthStencilFormat);\n\t\tbreak;\n\t}\n}\n\n// if the score is nonzero then the device is suitable.\n// A higher rating means generally better performance\n// if the score is 0 the device is unsuitable\nint Graphics::rateDeviceSuitability(VkPhysicalDevice device, bool querySwapChain)\n{\n\tVkPhysicalDeviceProperties deviceProperties;\n\tVkPhysicalDeviceFeatures deviceFeatures;\n\tvkGetPhysicalDeviceProperties(device, &deviceProperties);\n\tvkGetPhysicalDeviceFeatures(device, &deviceFeatures);\n\n\tuint32_t extensionCount = 0;\n\tvkEnumerateDeviceExtensionProperties(device, nullptr, &extensionCount, nullptr);\n\n\tstd::vector<VkExtensionProperties> availableExtensions(extensionCount);\n\tvkEnumerateDeviceExtensionProperties(device, nullptr, &extensionCount, availableExtensions.data());\n\n\tbool hasMSFTLayeredDriver = false;\n\tfor (const auto &extension : availableExtensions)\n\t{\n\t\tif (strcmp(extension.extensionName, VK_MSFT_LAYERED_DRIVER_EXTENSION_NAME) == 0)\n\t\t{\n\t\t\thasMSFTLayeredDriver = true;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tVkPhysicalDeviceProperties2 deviceProperties2{};\n\tdeviceProperties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;\n\n\tVkPhysicalDeviceLayeredDriverPropertiesMSFT layeredDriverProperties{};\n\tlayeredDriverProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LAYERED_DRIVER_PROPERTIES_MSFT;\n\n\tif (deviceProperties.apiVersion >= VK_API_VERSION_1_1)\n\t{\n\t\tif (hasMSFTLayeredDriver)\n\t\t\tdeviceProperties2.pNext = &layeredDriverProperties;\n\n\t\tvkGetPhysicalDeviceProperties2(device, &deviceProperties2);\n\t}\n\n\tint score = 2;\n\n\t// optional\n\n\tif (deviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU)\n\t\tscore += isLowPowerPreferred() ? 100 : 1000;\n\tif (deviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU)\n\t\tscore += isLowPowerPreferred() ? 1000 : 100;\n\tif (deviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU)\n\t\tscore += 10;\n\n\t// Reduce the score if this is something like Vulkan-on-D3D12 rather than a native driver.\n\tif (hasMSFTLayeredDriver && layeredDriverProperties.underlyingAPI != VK_LAYERED_DRIVER_UNDERLYING_API_NONE_MSFT)\n\t\tscore /= 2;\n\n\t// definitely needed\n\n\tif (deviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_CPU)\n\t{\n\t\tif (!SDL_GetHintBoolean(\"LOVE_GRAPHICS_VULKAN_ALLOW_SOFTWARE\", false))\n\t\t\tscore = 0;\n\t}\n\n\tQueueFamilyIndices indices = findQueueFamilies(device);\n\tif (!indices.isComplete() && (querySwapChain || !indices.graphicsFamily.hasValue))\n\t\tscore = 0;\n\n\tstd::set<std::string> missingExtensions(deviceExtensions.begin(), deviceExtensions.end());\n\n\tfor (const auto &extension : availableExtensions)\n\t\tmissingExtensions.erase(extension.extensionName);\n\n\tif (!missingExtensions.empty())\n\t\tscore = 0;\n\n\tif (missingExtensions.empty() && querySwapChain)\n\t{\n\t\tauto swapChainSupport = querySwapChainSupport(device);\n\t\tbool swapChainAdequate = !swapChainSupport.formats.empty() && !swapChainSupport.presentModes.empty();\n\t\tif (!swapChainAdequate)\n\t\t\tscore = 0;\n\t}\n\n\tif (!deviceFeatures.samplerAnisotropy)\n\t\tscore = 0;\n\n\tif (!deviceFeatures.fillModeNonSolid)\n\t\tscore = 0;\n\n\treturn score;\n}\n\nQueueFamilyIndices Graphics::findQueueFamilies(VkPhysicalDevice device)\n{\n\tQueueFamilyIndices indices;\n\n\tuint32_t queueFamilyCount = 0;\n\tvkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, nullptr);\n\n\tstd::vector<VkQueueFamilyProperties> queueFamilies(queueFamilyCount);\n\tvkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.data());\n\n\tint i = 0;\n\tfor (const auto &queueFamily : queueFamilies)\n\t{\n\t\tif ((queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT) && (queueFamily.queueFlags & VK_QUEUE_COMPUTE_BIT))\n\t\t\tindices.graphicsFamily = i;\n\n\t\tif (surface != VK_NULL_HANDLE)\n\t\t{\n\t\t\tVkBool32 presentSupport = false;\n\t\t\tvkGetPhysicalDeviceSurfaceSupportKHR(device, i, surface, &presentSupport);\n\n\t\t\tif (presentSupport)\n\t\t\t\tindices.presentFamily = i;\n\t\t}\n\n\t\tif (indices.isComplete())\n\t\t\tbreak;\n\n\t\ti++;\n\t}\n\n\treturn indices;\n}\n\nstatic void findOptionalDeviceExtensions(VkPhysicalDevice physicalDevice, OptionalDeviceExtensions &optionalDeviceExtensions)\n{\n\tuint32_t extensionCount;\n\tvkEnumerateDeviceExtensionProperties(physicalDevice, nullptr, &extensionCount, nullptr);\n\n\tstd::vector<VkExtensionProperties> availableExtensions(extensionCount);\n\tvkEnumerateDeviceExtensionProperties(physicalDevice, nullptr, &extensionCount, availableExtensions.data());\n\n\tfor (const auto &extension : availableExtensions)\n\t{\n\t\tif (strcmp(extension.extensionName, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME) == 0)\n\t\t\toptionalDeviceExtensions.extendedDynamicState = true;\n\t\tif (strcmp(extension.extensionName, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME) == 0)\n\t\t\toptionalDeviceExtensions.memoryRequirements2 = true;\n\t\tif (strcmp(extension.extensionName, VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0)\n\t\t\toptionalDeviceExtensions.dedicatedAllocation = true;\n\t\tif (strcmp(extension.extensionName, VK_EXT_MEMORY_BUDGET_EXTENSION_NAME) == 0)\n\t\t\toptionalDeviceExtensions.memoryBudget = true;\n\t\tif (strcmp(extension.extensionName, VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME) == 0)\n\t\t\toptionalDeviceExtensions.shaderFloatControls = true;\n\t\tif (strcmp(extension.extensionName, VK_KHR_SPIRV_1_4_EXTENSION_NAME) == 0)\n\t\t\toptionalDeviceExtensions.spirv14 = true;\n\t}\n}\n\nvoid Graphics::createLogicalDevice()\n{\n\tQueueFamilyIndices indices = findQueueFamilies(physicalDevice);\n\n\tstd::vector<VkDeviceQueueCreateInfo> queueCreateInfos;\n\tstd::set<uint32_t> uniqueQueueFamilies = {\n\t\tindices.graphicsFamily.value,\n\t\tindices.presentFamily.value\n\t};\n\n\tfloat queuePriority = 1.0f;\n\tfor (uint32_t queueFamily : uniqueQueueFamilies)\n\t{\n\t\tVkDeviceQueueCreateInfo queueCreateInfo{};\n\t\tqueueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;\n\t\tqueueCreateInfo.queueFamilyIndex = queueFamily;\n\t\tqueueCreateInfo.queueCount = 1;\n\t\tqueueCreateInfo.pQueuePriorities = &queuePriority;\n\t\tqueueCreateInfos.push_back(queueCreateInfo);\n\t}\n\n\tfindOptionalDeviceExtensions(physicalDevice, optionalDeviceExtensions);\n\n\t// sanity check for dependencies.\n\n\tif (optionalDeviceExtensions.extendedDynamicState && !optionalInstanceExtensions.physicalDeviceProperties2)\n\t\toptionalDeviceExtensions.extendedDynamicState = false;\n\tif (optionalDeviceExtensions.dedicatedAllocation && !optionalDeviceExtensions.memoryRequirements2)\n\t\toptionalDeviceExtensions.dedicatedAllocation = false;\n\tif (optionalDeviceExtensions.memoryBudget && !optionalInstanceExtensions.physicalDeviceProperties2)\n\t\toptionalDeviceExtensions.memoryBudget = false;\n\tif (optionalDeviceExtensions.spirv14 && !optionalDeviceExtensions.shaderFloatControls)\n\t\toptionalDeviceExtensions.spirv14 = false;\n\tif (optionalDeviceExtensions.spirv14 && deviceApiVersion < VK_API_VERSION_1_1)\n\t\toptionalDeviceExtensions.spirv14 = false;\n\n\tVkPhysicalDeviceFeatures deviceFeatures{};\n\tdeviceFeatures.samplerAnisotropy = VK_TRUE;\n\tdeviceFeatures.fillModeNonSolid = VK_TRUE;\n\n\tVkDeviceCreateInfo createInfo{};\n\tcreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;\n\tcreateInfo.queueCreateInfoCount = static_cast<uint32_t>(queueCreateInfos.size());\n\tcreateInfo.pQueueCreateInfos = queueCreateInfos.data();\n\tcreateInfo.pEnabledFeatures = &deviceFeatures;\n\n\tstd::vector<const char*> enabledExtensions(deviceExtensions.begin(), deviceExtensions.end());\n\tif (optionalDeviceExtensions.extendedDynamicState)\n\t\tenabledExtensions.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);\n\tif (optionalDeviceExtensions.memoryRequirements2)\n\t\tenabledExtensions.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);\n\tif (optionalDeviceExtensions.dedicatedAllocation)\n\t\tenabledExtensions.push_back(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME);\n\tif (optionalDeviceExtensions.memoryBudget)\n\t\tenabledExtensions.push_back(VK_EXT_MEMORY_BUDGET_EXTENSION_NAME);\n\tif (optionalDeviceExtensions.shaderFloatControls)\n\t\tenabledExtensions.push_back(VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME);\n\tif (optionalDeviceExtensions.spirv14)\n\t\tenabledExtensions.push_back(VK_KHR_SPIRV_1_4_EXTENSION_NAME);\n\tif (deviceApiVersion >= VK_API_VERSION_1_1)\n\t\tenabledExtensions.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);\n\n\tcreateInfo.enabledExtensionCount = static_cast<uint32_t>(enabledExtensions.size());\n\tcreateInfo.ppEnabledExtensionNames = enabledExtensions.data();\n\n\tif (isDebugEnabled())\n\t{\n\t\tcreateInfo.enabledLayerCount = static_cast<uint32_t>(validationLayers.size());\n\t\tcreateInfo.ppEnabledLayerNames = validationLayers.data();\n\t}\n\n\tVkPhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures{};\n\textendedDynamicStateFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT;\n\textendedDynamicStateFeatures.extendedDynamicState = VK_TRUE;\n\textendedDynamicStateFeatures.pNext = nullptr;\n\n\tif (optionalDeviceExtensions.extendedDynamicState)\n\t\tcreateInfo.pNext = &extendedDynamicStateFeatures;\n\n\tVkResult result = vkCreateDevice(physicalDevice, &createInfo, nullptr, &device);\n\tif (result != VK_SUCCESS)\n\t\tthrow love::Exception(\"Failed to create Vulkan logical device: %s\", Vulkan::getErrorString(result));\n\n\tvolkLoadDevice(device);\n\n\tvkGetDeviceQueue(device, indices.graphicsFamily.value, 0, &graphicsQueue);\n\tvkGetDeviceQueue(device, indices.presentFamily.value, 0, &presentQueue);\n}\n\nvoid Graphics::createPipelineCache()\n{\n\tVkPipelineCacheCreateInfo cacheInfo{};\n\tcacheInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;\n\n\tVkResult result = vkCreatePipelineCache(device, &cacheInfo, nullptr, &pipelineCache);\n\tif (result != VK_SUCCESS)\n\t\tthrow love::Exception(\"Could not create Vulkan pipeline cache: %s\", Vulkan::getErrorString(result));\n}\n\nvoid Graphics::initVMA()\n{\n\tVmaAllocatorCreateInfo allocatorCreateInfo = {};\n\tallocatorCreateInfo.vulkanApiVersion = deviceApiVersion;\n\tallocatorCreateInfo.physicalDevice = physicalDevice;\n\tallocatorCreateInfo.device = device;\n\tallocatorCreateInfo.instance = instance;\n\n\t// Default of 256 MB is a little too wasteful for most love games.\n\t// TODO: Tune this more.\n\tallocatorCreateInfo.preferredLargeHeapBlockSize = 128 * 1024 * 1024;\n\n\tVmaVulkanFunctions vulkanFunctions{};\n\n\tvulkanFunctions.vkGetInstanceProcAddr = vkGetInstanceProcAddr;\n\tvulkanFunctions.vkGetDeviceProcAddr = vkGetDeviceProcAddr;\n\tvulkanFunctions.vkGetPhysicalDeviceProperties = vkGetPhysicalDeviceProperties;\n\tvulkanFunctions.vkGetPhysicalDeviceMemoryProperties = vkGetPhysicalDeviceMemoryProperties;\n\tvulkanFunctions.vkAllocateMemory = vkAllocateMemory;\n\tvulkanFunctions.vkFreeMemory = vkFreeMemory;\n\tvulkanFunctions.vkMapMemory = vkMapMemory;\n\tvulkanFunctions.vkUnmapMemory = vkUnmapMemory;\n\tvulkanFunctions.vkFlushMappedMemoryRanges = vkFlushMappedMemoryRanges;\n\tvulkanFunctions.vkInvalidateMappedMemoryRanges = vkInvalidateMappedMemoryRanges;\n\tvulkanFunctions.vkBindBufferMemory = vkBindBufferMemory;\n\tvulkanFunctions.vkBindImageMemory = vkBindImageMemory;\n\tvulkanFunctions.vkGetBufferMemoryRequirements = vkGetBufferMemoryRequirements;\n\tvulkanFunctions.vkGetImageMemoryRequirements = vkGetImageMemoryRequirements;\n\tvulkanFunctions.vkCreateBuffer = vkCreateBuffer;\n\tvulkanFunctions.vkCreateImage = vkCreateImage;\n\tvulkanFunctions.vkDestroyBuffer = vkDestroyBuffer;\n\tvulkanFunctions.vkDestroyImage = vkDestroyImage;\n\tvulkanFunctions.vkCmdCopyBuffer = vkCmdCopyBuffer;\n\n\tvulkanFunctions.vkGetBufferMemoryRequirements2KHR = vkGetBufferMemoryRequirements2KHR;\n\tvulkanFunctions.vkGetImageMemoryRequirements2KHR = vkGetImageMemoryRequirements2KHR;\n\tvulkanFunctions.vkBindBufferMemory2KHR = vkBindBufferMemory2KHR;\n\tvulkanFunctions.vkBindImageMemory2KHR = vkBindImageMemory2KHR;\n\tvulkanFunctions.vkGetPhysicalDeviceMemoryProperties2KHR = vkGetPhysicalDeviceMemoryProperties2KHR;\n\tvulkanFunctions.vkGetDeviceBufferMemoryRequirements = vkGetDeviceBufferMemoryRequirements;\n\tvulkanFunctions.vkGetDeviceImageMemoryRequirements = vkGetDeviceImageMemoryRequirements;\n\n\tallocatorCreateInfo.pVulkanFunctions = &vulkanFunctions;\n\n\tallocatorCreateInfo.flags |= VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT;\n\tif (optionalDeviceExtensions.dedicatedAllocation)\n\t\tallocatorCreateInfo.flags |= VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT;\n\tif (optionalDeviceExtensions.memoryBudget)\n\t\tallocatorCreateInfo.flags |= VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT;\n\n\tVkResult result = vmaCreateAllocator(&allocatorCreateInfo, &vmaAllocator);\n\tif (result != VK_SUCCESS)\n\t\tthrow love::Exception(\"Failed to create Vulkan VMA allocator: %s\", Vulkan::getErrorString(result));\n}\n\nvoid Graphics::createSurface()\n{\n\tauto window = Module::getInstance<love::window::Window>(M_WINDOW);\n\tconst void *handle = window->getHandle();\n\tif (!SDL_Vulkan_CreateSurface((SDL_Window*)handle, instance, nullptr, &surface))\n\t\tthrow love::Exception(\"Failed to create Vulkan window surface: %s\", SDL_GetError());\n}\n\nSwapChainSupportDetails Graphics::querySwapChainSupport(VkPhysicalDevice device)\n{\n\tSwapChainSupportDetails details;\n\n\tvkGetPhysicalDeviceSurfaceCapabilitiesKHR(device, surface, &details.capabilities);\n\n\tuint32_t formatCount;\n\tvkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &formatCount, nullptr);\n\n\tif (formatCount != 0)\n\t{\n\t\tdetails.formats.resize(formatCount);\n\t\tvkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &formatCount, details.formats.data());\n\t}\n\n\tuint32_t presentModeCount;\n\tvkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, &presentModeCount, nullptr);\n\n\tif (presentModeCount != 0)\n\t{\n\t\tdetails.presentModes.resize(presentModeCount);\n\t\tvkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, &presentModeCount, details.presentModes.data());\n\t}\n\n\treturn details;\n}\n\nvoid Graphics::createSwapChain()\n{\n\tSwapChainSupportDetails swapChainSupport = querySwapChainSupport(physicalDevice);\n\n\tVkSurfaceFormatKHR surfaceFormat = chooseSwapSurfaceFormat(swapChainSupport.formats);\n\tVkPresentModeKHR presentMode = chooseSwapPresentMode(swapChainSupport.presentModes);\n\tVkExtent2D extent = chooseSwapExtent(swapChainSupport.capabilities);\n\n\tif (extent.width > 0 && extent.height > 0)\n\t{\n\t\tuint32_t imageCount = swapChainSupport.capabilities.minImageCount + 1;\n\t\tif (swapChainSupport.capabilities.maxImageCount > 0 && imageCount > swapChainSupport.capabilities.maxImageCount)\n\t\t\timageCount = swapChainSupport.capabilities.maxImageCount;\n\n\t\tVkSwapchainCreateInfoKHR createInfo{};\n\t\tcreateInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;\n\t\tcreateInfo.surface = surface;\n\n\t\tcreateInfo.minImageCount = imageCount;\n\t\tcreateInfo.imageFormat = surfaceFormat.format;\n\t\tcreateInfo.imageColorSpace = surfaceFormat.colorSpace;\n\t\tcreateInfo.imageExtent = extent;\n\t\tcreateInfo.imageArrayLayers = 1;\n\t\tcreateInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;\n\n\t\tQueueFamilyIndices indices = findQueueFamilies(physicalDevice);\n\t\tuint32_t queueFamilyIndices[] = { indices.graphicsFamily.value, indices.presentFamily.value };\n\n\t\tif (indices.graphicsFamily.value != indices.presentFamily.value)\n\t\t{\n\t\t\tcreateInfo.imageSharingMode = VK_SHARING_MODE_CONCURRENT;\n\t\t\tcreateInfo.queueFamilyIndexCount = 2;\n\t\t\tcreateInfo.pQueueFamilyIndices = queueFamilyIndices;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcreateInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;\n\t\t\tcreateInfo.queueFamilyIndexCount = 0;\n\t\t\tcreateInfo.pQueueFamilyIndices = nullptr;\n\t\t}\n\n\t\tcreateInfo.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;\n\t\tcreateInfo.compositeAlpha = chooseCompositeAlpha(swapChainSupport.capabilities);\n\t\tcreateInfo.presentMode = presentMode;\n\t\tcreateInfo.clipped = VK_TRUE;\n\t\tcreateInfo.oldSwapchain = swapChain;\n\n\t\tVkSwapchainKHR newSwapChain = VK_NULL_HANDLE;\n\t\tVkResult result = vkCreateSwapchainKHR(device, &createInfo, nullptr, &newSwapChain);\n\n\t\tif (result != VK_SUCCESS)\n\t\t\tthrow love::Exception(\"Failed to create Vulkan swap chain: %s\", Vulkan::getErrorString(result));\n\n\t\tif (swapChain != VK_NULL_HANDLE)\n\t\t{\n\t\t\tvkDestroySwapchainKHR(device, swapChain, nullptr);\n\t\t\tswapChain = VK_NULL_HANDLE;\n\t\t}\n\n\t\tswapChain = newSwapChain;\n\n\t\tvkGetSwapchainImagesKHR(device, swapChain, &imageCount, nullptr);\n\t\tswapChainImages.resize(imageCount);\n\t\tvkGetSwapchainImagesKHR(device, swapChain, &imageCount, swapChainImages.data());\n\t}\n\telse\n\t{\n\t\tif (swapChain != VK_NULL_HANDLE)\n\t\t{\n\t\t\tvkDestroySwapchainKHR(device, swapChain, nullptr);\n\t\t\tswapChain = VK_NULL_HANDLE;\n\t\t}\n\n\t\t// Use a fake backbuffer. Creation is deferred until startRecordingGraphicsCommands\n\t\t// because newTexture needs an active command buffer to do its initial\n\t\t// layout transitions.\n\t\tswapChainImages.clear();\n\t\textent.width = std::max(1, pixelWidth);\n\t\textent.height = std::max(1, pixelHeight);\n\n\t\tif (isGammaCorrect())\n\t\t\tsurfaceFormat.format = VK_FORMAT_R8G8B8A8_SRGB;\n\t\telse\n\t\t\tsurfaceFormat.format = VK_FORMAT_R8G8B8A8_UNORM;\n\t}\n\n\tswapChainImageFormat = surfaceFormat.format;\n\tswapChainExtent = extent;\n\n\tswitch (swapChainImageFormat)\n\t{\n\tcase VK_FORMAT_B8G8R8A8_SRGB:\n\t\tswapChainPixelFormat = PIXELFORMAT_BGRA8_sRGB;\n\t\tbreak;\n\tcase VK_FORMAT_B8G8R8A8_UNORM:\n\t\tswapChainPixelFormat = PIXELFORMAT_BGRA8_UNORM;\n\t\tbreak;\n\tcase VK_FORMAT_R8G8B8A8_SRGB:\n\t\tswapChainPixelFormat = PIXELFORMAT_RGBA8_sRGB;\n\t\tbreak;\n\tcase VK_FORMAT_R8G8B8A8_UNORM:\n\t\tswapChainPixelFormat = PIXELFORMAT_RGBA8_UNORM;\n\t\tbreak;\n\tdefault:\n\t\tthrow love::Exception(\"Failed to convert vulkan depth/stencil swapchain image format %d to love PixelFormat.\", swapChainImageFormat);\n\t\tbreak;\n\t}\n}\n\nVkSurfaceFormatKHR Graphics::chooseSwapSurfaceFormat(const std::vector<VkSurfaceFormatKHR> &availableFormats)\n{\n\tstd::vector<VkFormat> formatOrder;\n\n\t// TODO: turn off GammaCorrect if a sRGB format can't be found?\n\t// TODO: does every platform have these formats?\n\tif (isGammaCorrect())\n\t{\n\t\tformatOrder = {\n\t\t\tVK_FORMAT_B8G8R8A8_SRGB,\n\t\t\tVK_FORMAT_R8G8B8A8_SRGB,\n\t\t};\n\t}\n\telse\n\t{\n\t\tformatOrder = {\n\t\t\tVK_FORMAT_B8G8R8A8_UNORM,\n\t\t\tVK_FORMAT_R8G8B8A8_SNORM,\n\t\t};\n\t}\n\n\tfor (const auto format : formatOrder)\n\t{\n\t\tfor (const auto &availableFormat : availableFormats)\n\t\t{\n\t\t\tif (availableFormat.format == format && availableFormat.colorSpace == VK_COLORSPACE_SRGB_NONLINEAR_KHR)\n\t\t\t\treturn availableFormat;\n\t\t}\n\t}\n\t\n\treturn availableFormats[0];\n}\n\nVkPresentModeKHR Graphics::chooseSwapPresentMode(const std::vector<VkPresentModeKHR> &availablePresentModes)\n{\n\tconst auto begin = availablePresentModes.begin();\n\tconst auto end = availablePresentModes.end();\n\n\tswitch (vsync)\n\t{\n\tcase -1:\n\t\tif (std::find(begin, end, VK_PRESENT_MODE_FIFO_RELAXED_KHR) != end)\n\t\t\treturn VK_PRESENT_MODE_FIFO_RELAXED_KHR;\n\t\telse\n\t\t\treturn VK_PRESENT_MODE_FIFO_KHR;\n\tcase 0:\n\t\t// Mailbox mode might be better than immediate mode for a lot of people.\n\t\t// But on at least some systems it acts as if vsync is enabled\n\t\t// https://github.com/love2d/love/issues/1852\n\t\t// TODO: is that a bug in love's code or the graphics driver / compositor?\n\t\t// Should love expose mailbox mode in an API to users in some manner,\n\t\t// instead of trying to guess what to do?\n\t\tif (std::find(begin, end, VK_PRESENT_MODE_IMMEDIATE_KHR) != end)\n\t\t\treturn VK_PRESENT_MODE_IMMEDIATE_KHR;\n\t\telse if (std::find(begin, end, VK_PRESENT_MODE_MAILBOX_KHR) != end)\n\t\t\treturn VK_PRESENT_MODE_MAILBOX_KHR;\n\t\telse\n\t\t\treturn VK_PRESENT_MODE_FIFO_KHR;\n\tdefault:\n\t\t// TODO: support for swap interval = 2, etc?\n\t\treturn VK_PRESENT_MODE_FIFO_KHR;\n\t}\n}\n\nstatic uint32_t clampuint32_t(uint32_t value, uint32_t min, uint32_t max)\n{\n\tif (value < min)\n\t\treturn min;\n\n\tif (value > max)\n\t\treturn max;\n\n\treturn value;\n}\n\nVkExtent2D Graphics::chooseSwapExtent(const VkSurfaceCapabilitiesKHR &capabilities)\n{\n\tif (capabilities.currentExtent.width != UINT32_MAX)\n\t\treturn capabilities.currentExtent;\n\telse\n\t{\n\t\tVkExtent2D actualExtent = {\n\t\t\tstatic_cast<uint32_t>(pixelWidth),\n\t\t\tstatic_cast<uint32_t>(pixelHeight)\n\t\t};\n\n\t\tactualExtent.width = clampuint32_t(actualExtent.width, capabilities.minImageExtent.width, capabilities.maxImageExtent.width);\n\t\tactualExtent.height = clampuint32_t(actualExtent.height, capabilities.minImageExtent.height, capabilities.maxImageExtent.height);\n\n\t\treturn actualExtent;\n\t}\n}\n\nVkCompositeAlphaFlagBitsKHR Graphics::chooseCompositeAlpha(const VkSurfaceCapabilitiesKHR &capabilities)\n{\n\tif (capabilities.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR)\n\t\treturn VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;\n\telse if (capabilities.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR)\n\t\treturn VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR;\n\telse if (capabilities.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR)\n\t\treturn VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR;\n\telse if (capabilities.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR)\n\t\treturn VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR;\n\telse\n\t\tthrow love::Exception(\"failed to find composite alpha\");\n}\n\nvoid Graphics::createImageViews()\n{\n\tswapChainImageViews.resize(swapChainImages.size());\n\n\tfor (size_t i = 0; i < swapChainImages.size(); i++)\n\t{\n\t\tVkImageViewCreateInfo createInfo{};\n\t\tcreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;\n\t\tcreateInfo.image = swapChainImages.at(i);\n\t\tcreateInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;\n\t\tcreateInfo.format = swapChainImageFormat;\n\t\tcreateInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;\n\t\tcreateInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;\n\t\tcreateInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;\n\t\tcreateInfo.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;\n\t\tcreateInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;\n\t\tcreateInfo.subresourceRange.baseMipLevel = 0;\n\t\tcreateInfo.subresourceRange.levelCount = 1;\n\t\tcreateInfo.subresourceRange.baseArrayLayer = 0;\n\t\tcreateInfo.subresourceRange.layerCount = 1;\n\n\t\tVkResult result = vkCreateImageView(device, &createInfo, nullptr, &swapChainImageViews.at(i));\n\t\tif (result != VK_SUCCESS)\n\t\t\tthrow love::Exception(\"Failed to create Vulkan swap chain image views: %s\", Vulkan::getErrorString(result));\n\t}\n}\n\nVkFramebuffer Graphics::createFramebuffer(FramebufferConfiguration &configuration)\n{\n\tstd::vector<VkImageView> attachments;\n\n\tfor (const auto &colorView : configuration.colorViews)\n\t\tattachments.push_back(colorView);\n\n\tif (configuration.staticData.depthView)\n\t\tattachments.push_back(configuration.staticData.depthView);\n\n\t// Resolve attachments after everything else to match createRenderPass.\n\tfor (const auto &colorResolveView : configuration.colorResolveViews)\n\t\tattachments.push_back(colorResolveView);\n\n\tVkFramebufferCreateInfo createInfo{};\n\tcreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;\n\tcreateInfo.renderPass = configuration.staticData.renderPass;\n\tcreateInfo.attachmentCount = static_cast<uint32_t>(attachments.size());\n\tcreateInfo.pAttachments = attachments.data();\n\tcreateInfo.width = configuration.staticData.width;\n\tcreateInfo.height = configuration.staticData.height;\n\tcreateInfo.layers = 1;\n\n\tVkFramebuffer frameBuffer;\n\tVkResult result = vkCreateFramebuffer(device, &createInfo, nullptr, &frameBuffer);\n\tif (result != VK_SUCCESS)\n\t\tthrow love::Exception(\"Failed to create Vulkan framebuffer: %s\", Vulkan::getErrorString(result));\n\treturn frameBuffer;\n}\n\nVkFramebuffer Graphics::getFramebuffer(FramebufferConfiguration &configuration)\n{\n\tVkFramebuffer framebuffer;\n\n\tauto it = framebuffers.find(configuration);\n\tif (it != framebuffers.end())\n\t\tframebuffer = it->second;\n\telse\n\t{\n\t\tframebuffer = createFramebuffer(configuration);\n\t\tframebuffers[configuration] = framebuffer;\n\t}\n\n\tframebufferUsages[framebuffer] = true;\n\n\treturn framebuffer;\n}\n\nvoid Graphics::cleanupFramebuffers(VkImageView imageView, PixelFormat format)\n{\n\tbool depthstencil = isPixelFormatDepthStencil(format);\n\n\tfor (auto it = framebuffers.begin(); it != framebuffers.end();)\n\t{\n\t\tbool foundView = false;\n\n\t\tif (depthstencil)\n\t\t{\n\t\t\tif (it->first.staticData.depthView == imageView)\n\t\t\t\tfoundView = true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (VkImageView view : it->first.colorViews)\n\t\t\t{\n\t\t\t\tif (view == imageView)\n\t\t\t\t{\n\t\t\t\t\tfoundView = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!foundView)\n\t\t\t{\n\t\t\t\tfor (VkImageView view : it->first.colorResolveViews)\n\t\t\t\t{\n\t\t\t\t\tif (view == imageView)\n\t\t\t\t\t{\n\t\t\t\t\t\tfoundView = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (foundView)\n\t\t{\n\t\t\tvkDestroyFramebuffer(device, it->second, nullptr);\n\t\t\tit = framebuffers.erase(it);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t++it;\n\t\t}\n\t}\n}\n\nvoid Graphics::createDefaultShaders()\n{\n\tfor (int i = 0; i < Shader::STANDARD_MAX_ENUM; i++)\n\t{\n\t\tauto stype = (Shader::StandardShader)i;\n\n\t\tif (!Shader::standardShaders[i])\n\t\t{\n\t\t\tstd::vector<std::string> stages;\n\t\t\tstages.push_back(Shader::getDefaultCode(stype, SHADERSTAGE_VERTEX));\n\t\t\tstages.push_back(Shader::getDefaultCode(stype, SHADERSTAGE_PIXEL));\n\t\t\tShader::standardShaders[i] = newShader(stages, {});\n\t\t}\n\t}\n}\n\nVkRenderPass Graphics::createRenderPass(RenderPassConfiguration &configuration)\n{\n\tVkSubpassDescription subPass{};\n\tsubPass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;\n\n\tVkSubpassDependency beginDependency{};\n\tbeginDependency.srcSubpass = VK_SUBPASS_EXTERNAL;\n\tbeginDependency.dstSubpass = 0;\n\tbeginDependency.srcStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT;\n\tbeginDependency.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;\n\tbeginDependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT\n\t\t| VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;\n\tbeginDependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT\n\t\t| VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;\n\n\tVkSubpassDependency endDependency{};\n\tendDependency.srcSubpass = 0;\n\tendDependency.dstSubpass = VK_SUBPASS_EXTERNAL;\n\tendDependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;\n\tendDependency.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT\n\t\t| VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;\n\tendDependency.dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT;\n\tendDependency.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;\n\n\tstd::vector<VkAttachmentDescription> attachments;\n\tstd::vector<VkAttachmentReference> colorAttachmentRefs;\n\tstd::vector<VkAttachmentReference> colorResolveAttachmentRefs;\n\n\tuint32_t attachment = 0;\n\tfor (const auto &colorAttachment : configuration.colorAttachments)\n\t{\n\t\tVkAttachmentReference reference{};\n\t\treference.attachment = attachment++;\n\t\treference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;\n\t\tcolorAttachmentRefs.push_back(reference);\n\n\t\tVkAttachmentDescription colorDescription{};\n\t\tcolorDescription.format = colorAttachment.format;\n\t\tcolorDescription.samples = colorAttachment.msaaSamples;\n\t\tcolorDescription.loadOp = colorAttachment.loadOp;\n\t\tcolorDescription.storeOp = VK_ATTACHMENT_STORE_OP_STORE;\n\t\tcolorDescription.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;\n\t\tcolorDescription.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;\n\t\tif (colorAttachment.msaaSamples > 1)\n\t\t{\n\t\t\tcolorDescription.initialLayout = colorAttachment.msaaLayout;\n\t\t\tcolorDescription.finalLayout = colorAttachment.msaaLayout;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcolorDescription.initialLayout = colorAttachment.layout;\n\t\t\tcolorDescription.finalLayout = colorAttachment.layout;\n\t\t}\n\t\tattachments.push_back(colorDescription);\n\n\t\t// I had a TODO here, but I don't remember why...\n\t\tif (colorAttachment.layout != VK_IMAGE_LAYOUT_UNDEFINED)\n\t\t{\n\t\t\tVulkan::addImageLayoutTransitionOptions(true, true, false, colorAttachment.layout, beginDependency.srcAccessMask, beginDependency.srcStageMask);\n\t\t\tVulkan::addImageLayoutTransitionOptions(false, true, false, colorAttachment.layout, endDependency.dstAccessMask, endDependency.dstStageMask);\n\t\t}\n\n\t\tif (colorAttachment.msaaLayout != VK_IMAGE_LAYOUT_UNDEFINED)\n\t\t{\n\t\t\tVulkan::addImageLayoutTransitionOptions(true, true, false, colorAttachment.msaaLayout, beginDependency.srcAccessMask, beginDependency.srcStageMask);\n\t\t\tVulkan::addImageLayoutTransitionOptions(false, true, false, colorAttachment.msaaLayout, endDependency.dstAccessMask, endDependency.dstStageMask);\n\t\t}\n\t}\n\n\tsubPass.colorAttachmentCount = static_cast<uint32_t>(configuration.colorAttachments.size());\n\tsubPass.pColorAttachments = colorAttachmentRefs.data();\n\n\tVkAttachmentReference depthStencilAttachmentRef{};\n\tif (configuration.staticData.depthStencilAttachment.format != VK_FORMAT_UNDEFINED)\n\t{\n\t\tdepthStencilAttachmentRef.attachment = attachment++;\n\t\tdepthStencilAttachmentRef.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;\n\t\tsubPass.pDepthStencilAttachment = &depthStencilAttachmentRef;\n\n\t\tVkAttachmentDescription depthStencilAttachment{};\n\t\tdepthStencilAttachment.format = configuration.staticData.depthStencilAttachment.format;\n\t\tdepthStencilAttachment.samples = configuration.staticData.depthStencilAttachment.msaaSamples;\n\t\tdepthStencilAttachment.loadOp = configuration.staticData.depthStencilAttachment.depthLoadOp;\n\t\tdepthStencilAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;\n\t\tdepthStencilAttachment.stencilLoadOp = configuration.staticData.depthStencilAttachment.stencilLoadOp;\n\t\tdepthStencilAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;\n\t\tdepthStencilAttachment.initialLayout = configuration.staticData.depthStencilAttachment.layout;\n\t\tdepthStencilAttachment.finalLayout = configuration.staticData.depthStencilAttachment.layout;\n\t\tattachments.push_back(depthStencilAttachment);\n\n\t\tVulkan::addImageLayoutTransitionOptions(true, true, true, configuration.staticData.depthStencilAttachment.layout, beginDependency.srcAccessMask, beginDependency.srcStageMask);\n\t\tVulkan::addImageLayoutTransitionOptions(false, true, true, configuration.staticData.depthStencilAttachment.layout, endDependency.dstAccessMask, endDependency.dstStageMask);\n\t}\n\n\t// Add resolve attachments after everything else to make pClearValues simpler to implement.\n\tif (configuration.staticData.resolve)\n\t{\n\t\tfor (const auto &colorAttachment : configuration.colorAttachments)\n\t\t{\n\t\t\tVkAttachmentReference reference{};\n\t\t\treference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;\n\n\t\t\tif (colorAttachment.layout == VK_IMAGE_LAYOUT_UNDEFINED)\n\t\t\t{\n\t\t\t\treference.attachment = VK_ATTACHMENT_UNUSED;\n\t\t\t\tcolorResolveAttachmentRefs.push_back(reference);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treference.attachment = attachment++;\n\t\t\t\tcolorResolveAttachmentRefs.push_back(reference);\n\n\t\t\t\tVkAttachmentDescription resolveDescription{};\n\t\t\t\tresolveDescription.format = colorAttachment.format;\n\t\t\t\tresolveDescription.samples = VK_SAMPLE_COUNT_1_BIT;\n\t\t\t\tresolveDescription.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;\n\t\t\t\tresolveDescription.storeOp = VK_ATTACHMENT_STORE_OP_STORE;\n\t\t\t\tresolveDescription.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;\n\t\t\t\tresolveDescription.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;\n\t\t\t\tresolveDescription.initialLayout = colorAttachment.layout;\n\t\t\t\tresolveDescription.finalLayout = colorAttachment.layout;\n\n\t\t\t\tattachments.push_back(resolveDescription);\n\t\t\t}\n\t\t}\n\n\t\tsubPass.pResolveAttachments = colorResolveAttachmentRefs.data();\n\t}\n\n\tstd::array<VkSubpassDependency, 2> dependencies = { beginDependency, endDependency };\n\n\tVkRenderPassCreateInfo createInfo{};\n\tcreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;\n\tcreateInfo.attachmentCount = static_cast<uint32_t>(attachments.size());\n\tcreateInfo.pAttachments = attachments.data();\n\tcreateInfo.subpassCount = 1;\n\tcreateInfo.pSubpasses = &subPass;\n\tcreateInfo.dependencyCount = static_cast<uint32_t>(dependencies.size());\n\tcreateInfo.pDependencies = dependencies.data();\n\n\tVkRenderPass renderPass;\n\tVkResult result = vkCreateRenderPass(device, &createInfo, nullptr, &renderPass);\n\tif (result != VK_SUCCESS)\n\t\tthrow love::Exception(\"Failed to create Vulkan render pass: %s\", Vulkan::getErrorString(result));\n\n\treturn renderPass;\n}\n\nVkRenderPass Graphics::getRenderPass(RenderPassConfiguration &configuration)\n{\n\tVkRenderPass renderPass;\n\tauto it = renderPasses.find(configuration);\n\tif (it != renderPasses.end())\n\t\trenderPass = it->second;\n\telse\n\t{\n\t\trenderPass = createRenderPass(configuration);\n\t\trenderPasses[configuration] = renderPass;\n\t}\n\n\treturn renderPass;\n}\n\nvoid Graphics::createVulkanVertexFormat(\n\tShader *shader,\n\tconst VertexAttributes &attributes,\n\tstd::vector<VkVertexInputBindingDescription> &bindingDescriptions,\n\tstd::vector<VkVertexInputAttributeDescription> &attributeDescriptions)\n{\n\tstd::set<uint32_t> usedBuffers;\n\n\tfor (const auto &pair : shader->getVertexAttributeIndices())\n\t{\n\t\tint i = pair.second.index;\n\t\tuint32 bit = 1u << i;\n\n\t\tVkVertexInputAttributeDescription attribdesc{};\n\t\tattribdesc.location = i;\n\n\t\tif (attributes.enableBits & bit)\n\t\t{\n\t\t\tconst auto &attrib = attributes.attribs[i];\n\n\t\t\tint bufferbinding = VERTEX_BUFFER_BINDING_START + attrib.bufferIndex;\n\n\t\t\tattribdesc.binding = bufferbinding;\n\t\t\tattribdesc.offset = attrib.offsetFromVertex;\n\t\t\tattribdesc.format = Vulkan::getVulkanVertexFormat(attrib.getFormat());\n\n\t\t\tif (usedBuffers.find(bufferbinding) == usedBuffers.end())\n\t\t\t{\n\t\t\t\tusedBuffers.insert(bufferbinding);\n\n\t\t\t\tVkVertexInputBindingDescription bindingdesc{};\n\t\t\t\tbindingdesc.binding = bufferbinding;\n\t\t\t\tif (attributes.instanceBits & (1u << attrib.bufferIndex))\n\t\t\t\t\tbindingdesc.inputRate = VK_VERTEX_INPUT_RATE_INSTANCE;\n\t\t\t\telse\n\t\t\t\t\tbindingdesc.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;\n\t\t\t\tbindingdesc.stride = attributes.bufferLayouts[attrib.bufferIndex].stride;\n\t\t\t\tbindingDescriptions.push_back(bindingdesc);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tattribdesc.binding = DEFAULT_VERTEX_BUFFER_BINDING;\n\n\t\t\t// Indices should match the creation parameters for defaultVertexBuffer.\n\t\t\tswitch (pair.second.baseType)\n\t\t\t{\n\t\t\tcase DATA_BASETYPE_INT:\n\t\t\t\tattribdesc.offset = defaultVertexBuffer->getDataMember(1).offset;\n\t\t\t\tattribdesc.format = Vulkan::getVulkanVertexFormat(DATAFORMAT_INT32_VEC4);\n\t\t\t\tbreak;\n\t\t\tcase DATA_BASETYPE_UINT:\n\t\t\t\tattribdesc.offset = defaultVertexBuffer->getDataMember(1).offset;\n\t\t\t\tattribdesc.format = Vulkan::getVulkanVertexFormat(DATAFORMAT_UINT32_VEC4);\n\t\t\t\tbreak;\n\t\t\tcase DATA_BASETYPE_FLOAT:\n\t\t\tdefault:\n\t\t\t\tif (i == ATTRIB_COLOR)\n\t\t\t\t\tattribdesc.offset = defaultVertexBuffer->getDataMember(2).offset;\n\t\t\t\telse\n\t\t\t\t\tattribdesc.offset = defaultVertexBuffer->getDataMember(0).offset;\n\t\t\t\tattribdesc.format = Vulkan::getVulkanVertexFormat(DATAFORMAT_FLOAT_VEC4);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (usedBuffers.find(DEFAULT_VERTEX_BUFFER_BINDING) == usedBuffers.end())\n\t\t\t{\n\t\t\t\tusedBuffers.insert(DEFAULT_VERTEX_BUFFER_BINDING);\n\n\t\t\t\tVkVertexInputBindingDescription bindingdesc{};\n\t\t\t\tbindingdesc.binding = DEFAULT_VERTEX_BUFFER_BINDING;\n\t\t\t\tbindingdesc.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;\n\t\t\t\tbindingdesc.stride = 0; // no stride, will always read the same coord multiple times.\n\t\t\t\tbindingDescriptions.push_back(bindingdesc);\n\t\t\t}\n\t\t}\n\n\t\tattributeDescriptions.push_back(attribdesc);\n\t}\n}\n\nvoid Graphics::prepareDraw(VertexAttributesID attributesID, const BufferBindings &buffers, graphics::Texture *texture, PrimitiveType primitiveType, CullMode cullmode)\n{\n\tif (!renderPassState.active)\n\t\tstartRenderPass();\n\n\tauto s = dynamic_cast<Shader*>(Shader::current);\n\n\tusedShadersInFrame.insert(s);\n\n\tGraphicsPipelineConfigurationFull configuration{};\n\n\tconfiguration.core.renderPass = renderPassState.beginInfo.renderPass;\n\tconfiguration.core.attributesID = attributesID;\n\tconfiguration.core.wireFrame = states.back().wireframe;\n\tconfiguration.core.blendStateKey = states.back().blend.toKey();\n\tconfiguration.core.colorChannelMask = states.back().colorMask;\n\tconfiguration.core.msaaSamples = renderPassState.msaa;\n\tconfiguration.core.numColorAttachments = renderPassState.numColorAttachments;\n\tconfiguration.core.packedColorAttachmentFormats = renderPassState.packedColorAttachmentFormats;\n\tconfiguration.core.primitiveType = primitiveType;\n\n\tVkPipeline pipeline = VK_NULL_HANDLE;\n\n\tif (optionalDeviceExtensions.extendedDynamicState)\n\t{\n\t\tvkCmdSetCullModeEXT(commandBuffers.at(currentFrame), Vulkan::getCullMode(cullmode));\n\t\tpipeline = s->getCachedGraphicsPipeline(this, configuration.core);\n\t}\n\telse\n\t{\n\t\tconfiguration.noDynamicState.winding = states.back().winding;\n\t\tconfiguration.noDynamicState.depthState.compare = states.back().depthTest;\n\t\tconfiguration.noDynamicState.depthState.write = states.back().depthWrite;\n\t\tconfiguration.noDynamicState.stencilAction = states.back().stencil.action;\n\t\tconfiguration.noDynamicState.stencilCompare = states.back().stencil.compare;\n\t\tconfiguration.noDynamicState.cullmode = cullmode;\n\n\t\tpipeline = s->getCachedGraphicsPipeline(this, configuration);\n\t}\n\n\tif (pipeline != renderPassState.pipeline)\n\t{\n\t\tvkCmdBindPipeline(commandBuffers.at(currentFrame), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);\n\t\trenderPassState.pipeline = pipeline;\n\t}\n\n\ts->setMainTex(texture);\n\ts->cmdPushDescriptorSets(commandBuffers.at(currentFrame), VK_PIPELINE_BIND_POINT_GRAPHICS);\n\n\tVkBuffer vkbuffers[BufferBindings::MAX];\n\tVkDeviceSize vkoffsets[BufferBindings::MAX];\n\tuint32 buffercount = 0;\n\n\tuint32 allbits = buffers.useBits;\n\tuint32 i = 0;\n\twhile (allbits)\n\t{\n\t\tuint32 bit = 1u << i;\n\n\t\t// TODO: handle split ranges.\n\t\tif (buffers.useBits & bit)\n\t\t{\n\t\t\tvkbuffers[buffercount] = (VkBuffer)buffers.info[i].buffer->getHandle();\n\t\t\tvkoffsets[buffercount] = (VkDeviceSize)buffers.info[i].offset;\n\t\t\tbuffercount++;\n\t\t}\n\n\t\ti++;\n\t\tallbits >>= 1;\n\t}\n\n\tif (buffercount > 0)\n\t\tvkCmdBindVertexBuffers(commandBuffers.at(currentFrame), VERTEX_BUFFER_BINDING_START, buffercount, vkbuffers, vkoffsets);\n}\n\nvoid Graphics::setDefaultRenderPass()\n{\n\tuint32_t numClearValues = 2;\n\trenderPassState.clearColors.resize(numClearValues);\n\n\trenderPassState.beginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;\n\trenderPassState.beginInfo.renderPass = VK_NULL_HANDLE;\n\trenderPassState.beginInfo.framebuffer = VK_NULL_HANDLE;\n\trenderPassState.beginInfo.renderArea.offset = { 0, 0 };\n\trenderPassState.beginInfo.renderArea.extent = swapChainExtent;\n\trenderPassState.beginInfo.clearValueCount = numClearValues;\n\trenderPassState.beginInfo.pClearValues = renderPassState.clearColors.data();\n\n\trenderPassState.isWindow = true;\n\trenderPassState.pipeline = VK_NULL_HANDLE;\n\trenderPassState.width = static_cast<float>(swapChainExtent.width);\n\trenderPassState.height = static_cast<float>(swapChainExtent.height);\n\trenderPassState.msaa = msaaSamples;\n\trenderPassState.numColorAttachments = 1;\n\trenderPassState.packedColorAttachmentFormats = (uint8)swapChainPixelFormat;\n\n\tRenderPassConfiguration renderPassConfiguration{};\n\n\tVkFormat dsformat = backbufferHasDepth || backbufferHasStencil ? depthStencilFormat : VK_FORMAT_UNDEFINED;\n\trenderPassConfiguration.staticData.depthStencilAttachment = { dsformat, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_LOAD_OP_LOAD, msaaSamples };\n\tif (msaaSamples & VK_SAMPLE_COUNT_1_BIT)\n\t\trenderPassConfiguration.staticData.resolve = false;\n\telse\n\t\trenderPassConfiguration.staticData.resolve = true;\n\n\tFramebufferConfiguration framebufferConfiguration{};\n\tframebufferConfiguration.staticData.depthView = depthImageView;\n\tframebufferConfiguration.staticData.width = swapChainExtent.width;\n\tframebufferConfiguration.staticData.height = swapChainExtent.height;\n\n\tif (msaaSamples & VK_SAMPLE_COUNT_1_BIT)\n\t{\n\t\trenderPassConfiguration.colorAttachments.push_back({ swapChainImageFormat, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_UNDEFINED, VK_ATTACHMENT_LOAD_OP_LOAD, msaaSamples });\n\n\t\tif (!swapChainImageViews.empty())\n\t\t\tframebufferConfiguration.colorViews.push_back(swapChainImageViews.at(imageIndex));\n\t\telse\n\t\t\tframebufferConfiguration.colorViews.push_back(fakeBackbuffer->getRenderTargetView(0, 0));\n\t}\n\telse\n\t{\n\t\trenderPassConfiguration.colorAttachments.push_back({ swapChainImageFormat, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_ATTACHMENT_LOAD_OP_LOAD, msaaSamples });\n\n\t\tframebufferConfiguration.colorViews.push_back(colorImageView);\n\t\tif (!swapChainImageViews.empty())\n\t\t\tframebufferConfiguration.colorResolveViews.push_back(swapChainImageViews.at(imageIndex));\n\t\telse\n\t\t\tframebufferConfiguration.colorResolveViews.push_back(fakeBackbuffer->getRenderTargetView(0, 0));\n\t}\n\n\trenderPassState.renderPassConfiguration = std::move(renderPassConfiguration);\n\trenderPassState.framebufferConfiguration = std::move(framebufferConfiguration);\n\n\t// Can't call clear() here because it depends on current RT state, which might not be\n\t// set yet when this is called from within setRenderTargetsInternal.\n\tif (renderPassState.windowClearRequested)\n\t{\n\t\tif (renderPassState.mainWindowClearColorValue.hasValue)\n\t\t{\n\t\t\trenderPassState.renderPassConfiguration.colorAttachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;\n\t\t\trenderPassState.clearColors[0].color = Texture::getClearColor(nullptr, renderPassState.mainWindowClearColorValue.value);\n\t\t}\n\n\t\tif (renderPassState.mainWindowClearDepthValue.hasValue && backbufferHasDepth)\n\t\t{\n\t\t\trenderPassState.renderPassConfiguration.staticData.depthStencilAttachment.depthLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;\n\t\t\trenderPassState.clearColors[1].depthStencil.depth = static_cast<float>(renderPassState.mainWindowClearDepthValue.value);\n\t\t}\n\n\t\tif (renderPassState.mainWindowClearStencilValue.hasValue && backbufferHasStencil)\n\t\t{\n\t\t\trenderPassState.renderPassConfiguration.staticData.depthStencilAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;\n\t\t\trenderPassState.clearColors[1].depthStencil.stencil = static_cast<uint32_t>(renderPassState.mainWindowClearStencilValue.value);\n\t\t}\n\t}\n}\n\nvoid Graphics::setRenderPass(const RenderTargets &rts, int pixelw, int pixelh)\n{\n\tRenderPassConfiguration renderPassConfiguration{};\n\tVkSampleCountFlagBits msaa = VK_SAMPLE_COUNT_1_BIT;\n\n\tfor (const auto &color : rts.colors)\n\t{\n\t\tauto tex = (Texture *)color.texture;\n\t\trenderPassConfiguration.colorAttachments.push_back({ \n\t\t\tVulkan::getTextureFormat(tex->getPixelFormat()).internalFormat,\n\t\t\ttex->getImageLayout(),\n\t\t\ttex->getMSAAImageLayout(),\n\t\t\tVK_ATTACHMENT_LOAD_OP_LOAD,\n\t\t\ttex->getMsaaSamples() });\n\n\t\tif (tex->getMSAAImageLayout() != VK_IMAGE_LAYOUT_UNDEFINED && tex->getImageLayout() != VK_IMAGE_LAYOUT_UNDEFINED)\n\t\t\trenderPassConfiguration.staticData.resolve = true;\n\n\t\tmsaa = tex->getMsaaSamples();\n\t}\n\n\tif (rts.depthStencil.texture != nullptr)\n\t{\n\t\tauto tex = (Texture *)rts.depthStencil.texture;\n\t\trenderPassConfiguration.staticData.depthStencilAttachment = {\n\t\t\tVulkan::getTextureFormat(rts.depthStencil.texture->getPixelFormat()).internalFormat,\n\t\t\ttex->getImageLayout(),\n\t\t\tVK_ATTACHMENT_LOAD_OP_LOAD,\n\t\t\tVK_ATTACHMENT_LOAD_OP_LOAD,\n\t\t\ttex->getMsaaSamples() };\n\n\t\tmsaa = tex->getMsaaSamples();\n\t}\n\n\tFramebufferConfiguration configuration{};\n\n\tfor (const auto &color : rts.colors)\n\t{\n\t\tauto tex = (Texture*)color.texture;\n\t\tif (tex->getMSAA() > 1)\n\t\t{\n\t\t\tconfiguration.colorViews.push_back(tex->getMSAARenderTargetView(color.mipmap, color.slice));\n\t\t\tconfiguration.colorResolveViews.push_back(tex->getRenderTargetView(color.mipmap, color.slice));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconfiguration.colorViews.push_back(tex->getRenderTargetView(color.mipmap, color.slice));\n\t\t}\n\t}\n\tif (rts.depthStencil.texture != nullptr)\n\t{\n\t\tauto tex = (Texture*)rts.depthStencil.texture;\n\t\tif (tex->getMSAA() > 1)\n\t\t\tconfiguration.staticData.depthView = tex->getMSAARenderTargetView(rts.depthStencil.mipmap, rts.depthStencil.slice);\n\t\telse\n\t\t\tconfiguration.staticData.depthView = tex->getRenderTargetView(rts.depthStencil.mipmap, rts.depthStencil.slice);\n\t}\n\n\tconfiguration.staticData.width = static_cast<uint32_t>(pixelw);\n\tconfiguration.staticData.height = static_cast<uint32_t>(pixelh);\n\n\tuint32_t numClearValues = static_cast<uint32_t>(rts.colors.size() + 1);\n\trenderPassState.clearColors.resize(numClearValues);\n\n\trenderPassState.beginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;\n\trenderPassState.beginInfo.renderPass = VK_NULL_HANDLE;\n\trenderPassState.beginInfo.framebuffer = VK_NULL_HANDLE;\n\trenderPassState.beginInfo.renderArea.offset = {0, 0};\n\trenderPassState.beginInfo.renderArea.extent.width = static_cast<uint32_t>(pixelw);\n\trenderPassState.beginInfo.renderArea.extent.height = static_cast<uint32_t>(pixelh);\n\trenderPassState.beginInfo.clearValueCount = numClearValues;\n\trenderPassState.beginInfo.pClearValues = renderPassState.clearColors.data();\n\n\trenderPassState.isWindow = false;\n\trenderPassState.renderPassConfiguration = renderPassConfiguration;\n\trenderPassState.framebufferConfiguration = configuration;\n\trenderPassState.pipeline = VK_NULL_HANDLE;\n\trenderPassState.width = static_cast<float>(pixelw);\n\trenderPassState.height = static_cast<float>(pixelh);\n\trenderPassState.msaa = msaa;\n\trenderPassState.numColorAttachments = static_cast<uint32_t>(rts.colors.size());\n\trenderPassState.packedColorAttachmentFormats = 0;\n\tfor (size_t i = 0; i < rts.colors.size(); i++)\n\t\trenderPassState.packedColorAttachmentFormats |= ((uint64)rts.colors[i].texture->getPixelFormat()) << (i * 8ull);\n}\n\nvoid Graphics::startRenderPass()\n{\n\trenderPassState.active = true;\n\n\tif (renderPassState.isWindow && renderPassState.windowClearRequested)\n\t\trenderPassState.windowClearRequested = false;\n\n\tVkViewport viewport{};\n\tviewport.x = 0.0f;\n\tviewport.y = 0.0f;\n\tviewport.width = renderPassState.width;\n\tviewport.height = renderPassState.height;\n\tviewport.minDepth = 0.0f;\n\tviewport.maxDepth = 1.0f;\n\n\tvkCmdSetViewport(commandBuffers.at(currentFrame), 0, 1, &viewport);\n\n\trenderPassState.beginInfo.renderPass = getRenderPass(renderPassState.renderPassConfiguration);\n\n\trenderPassState.framebufferConfiguration.staticData.renderPass = renderPassState.beginInfo.renderPass;\n\trenderPassState.beginInfo.framebuffer = getFramebuffer(renderPassState.framebufferConfiguration);\n\n\tvkCmdBeginRenderPass(commandBuffers.at(currentFrame), &renderPassState.beginInfo, VK_SUBPASS_CONTENTS_INLINE);\n\n\tapplyScissor();\n}\n\nvoid Graphics::endRenderPass()\n{\n\trenderPassState.active = false;\n\n\tvkCmdEndRenderPass(commandBuffers.at(currentFrame));\n\n\tfor (auto &colorAttachment : renderPassState.renderPassConfiguration.colorAttachments)\n\t\tcolorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;\n\n\trenderPassState.renderPassConfiguration.staticData.depthStencilAttachment.depthLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD;\n\trenderPassState.renderPassConfiguration.staticData.depthStencilAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD;\n}\n\nVkSampler Graphics::createSampler(const SamplerState &samplerState)\n{\n\tVkSamplerCreateInfo samplerInfo{};\n\tsamplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;\n\tsamplerInfo.magFilter = Vulkan::getFilter(samplerState.magFilter);\n\tsamplerInfo.minFilter = Vulkan::getFilter(samplerState.minFilter);\n\tsamplerInfo.addressModeU = Vulkan::getWrapMode(samplerState.wrapU);\n\tsamplerInfo.addressModeV = Vulkan::getWrapMode(samplerState.wrapV);\n\tsamplerInfo.addressModeW = Vulkan::getWrapMode(samplerState.wrapW);\n\tsamplerInfo.anisotropyEnable = samplerState.maxAnisotropy > 1 ? VK_TRUE : VK_FALSE;\n\tsamplerInfo.maxAnisotropy = static_cast<float>(samplerState.maxAnisotropy);\n\n\t// TODO: This probably needs to branch on a pixel format to determine whether\n\t// it should be float vs int, and opaque vs transparent.\n\tbool clampone = samplerState.wrapU == SamplerState::WRAP_CLAMP_ONE\n\t\t|| samplerState.wrapV == SamplerState::WRAP_CLAMP_ONE\n\t\t|| samplerState.wrapW == SamplerState::WRAP_CLAMP_ONE;\n\tsamplerInfo.borderColor = clampone ? VK_BORDER_COLOR_INT_OPAQUE_WHITE : VK_BORDER_COLOR_INT_OPAQUE_BLACK;\n\n\tsamplerInfo.unnormalizedCoordinates = VK_FALSE;\n\tif (samplerState.depthSampleMode.hasValue)\n\t{\n\t\tsamplerInfo.compareEnable = VK_TRUE;\n\t\t// See the comment in renderstate.h\n\t\tsamplerInfo.compareOp = Vulkan::getCompareOp(getReversedCompareMode(samplerState.depthSampleMode.value));\n\t}\n\telse\n\t{\n\t\tsamplerInfo.compareEnable = VK_FALSE;\n\t\tsamplerInfo.compareOp = VK_COMPARE_OP_ALWAYS;\n\t}\n\tsamplerInfo.mipmapMode = Vulkan::getMipMapMode(samplerState.mipmapFilter);\n\tsamplerInfo.mipLodBias = samplerState.lodBias;\n\tsamplerInfo.minLod = static_cast<float>(samplerState.minLod);\n\tsamplerInfo.maxLod = static_cast<float>(samplerState.maxLod);\n\n\tVkSampler sampler;\n\tVkResult result = vkCreateSampler(device, &samplerInfo, nullptr, &sampler);\n\tif (result != VK_SUCCESS)\n\t\tthrow love::Exception(\"Failed to create Vulkan sampler: %s\", Vulkan::getErrorString(result));\n\n\treturn sampler;\n}\n\nvoid Graphics::requestSwapchainRecreation()\n{\n\tif (swapChain != VK_NULL_HANDLE)\n\t{\n\t\tswapChainRecreationRequested = true;\n\t}\n}\n\nVkSampler Graphics::getCachedSampler(const SamplerState &samplerState)\n{\n\tauto samplerkey = samplerState.toKey();\n\tauto it = samplers.find(samplerkey);\n\tif (it != samplers.end())\n\t\treturn it->second;\n\telse\n\t{\n\t\tVkSampler sampler = createSampler(samplerState);\n\t\tsamplers.insert({ samplerkey, sampler });\n\t\treturn sampler;\n\t}\n}\n\nstatic uint64 getDescriptorPoolsKey(int dynamicUniformBuffers, int sampledTextures, int storageTextures, int texelBuffers, int storageBuffers)\n{\n\treturn (((int64)dynamicUniformBuffers & 0xFF) << 0)\n\t\t| (((int64)sampledTextures & 0xFF) << 8)\n\t\t| (((int64)storageTextures & 0xFF) << 16)\n\t\t| (((int64)texelBuffers    & 0xFF) << 24)\n\t\t| (((int64)storageBuffers  & 0xFF) << 32);\n}\n\nSharedDescriptorPools *Graphics::acquireDescriptorPools(int dynamicUniformBuffers, int sampledTextures, int storageTextures, int texelBuffers, int storageBuffers)\n{\n\tuint64 key = getDescriptorPoolsKey(dynamicUniformBuffers, sampledTextures, storageTextures, texelBuffers, storageBuffers);\n\n\tauto it = sharedDescriptorPools.find(key);\n\tif (it != sharedDescriptorPools.end())\n\t{\n\t\tit->second.referenceCount++;\n\t\treturn it->second.pools;\n\t}\n\n\tauto pools = new SharedDescriptorPools(device, dynamicUniformBuffers, sampledTextures, storageTextures, texelBuffers, storageBuffers);\n\n\tSharedDescriptorPoolsRef ref{};\n\tref.pools = pools;\n\tref.referenceCount = 1;\n\tsharedDescriptorPools[key] = ref;\n\n\treturn pools;\n}\n\nvoid Graphics::releaseDescriptorPools(SharedDescriptorPools *p)\n{\n\tuint64 key = getDescriptorPoolsKey(p->dynamicUniformBuffers, p->sampledTextures, p->storageTextures, p->texelBuffers, p->storageBuffers);\n\n\tauto it = sharedDescriptorPools.find(key);\n\tif (it != sharedDescriptorPools.end())\n\t{\n\t\tit->second.referenceCount--;\n\t\tif (it->second.referenceCount <= 0)\n\t\t{\n\t\t\tdelete it->second.pools;\n\t\t\tsharedDescriptorPools.erase(key);\n\t\t}\n\t}\n}\n\nVkPipeline Graphics::createGraphicsPipeline(Shader *shader, const GraphicsPipelineConfigurationCore &configuration, const GraphicsPipelineConfigurationNoDynamicState *noDynamicStateConfiguration)\n{\n\tVkGraphicsPipelineCreateInfo pipelineInfo{};\n\tpipelineInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;\n\n\tauto &shaderStages = shader->getShaderStages();\n\n\tstd::vector<VkVertexInputBindingDescription> bindingDescriptions;\n\tstd::vector<VkVertexInputAttributeDescription> attributeDescriptions;\n\n\tVertexAttributes vertexAttributes;\n\tfindVertexAttributes(configuration.attributesID, vertexAttributes);\n\n\tcreateVulkanVertexFormat(shader, vertexAttributes, bindingDescriptions, attributeDescriptions);\n\n\tVkPipelineVertexInputStateCreateInfo vertexInputInfo{};\n\tvertexInputInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;\n\tvertexInputInfo.vertexBindingDescriptionCount = static_cast<uint32_t>(bindingDescriptions.size());\n\tvertexInputInfo.pVertexBindingDescriptions = bindingDescriptions.data();\n\tvertexInputInfo.vertexAttributeDescriptionCount = static_cast<uint32_t>(attributeDescriptions.size());\n\tvertexInputInfo.pVertexAttributeDescriptions = attributeDescriptions.data();\n\n\tVkPipelineViewportStateCreateInfo viewportState{};\n\tviewportState.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;\n\tviewportState.viewportCount = 1;\n\tviewportState.scissorCount = 1;\n\n\tVkPipelineMultisampleStateCreateInfo multisampling{};\n\tmultisampling.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;\n\tmultisampling.sampleShadingEnable = VK_FALSE;\n\tmultisampling.rasterizationSamples = configuration.msaaSamples;\n\n\tVkPipelineRasterizationStateCreateInfo rasterizer{};\n\trasterizer.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;\n\trasterizer.depthClampEnable = VK_FALSE;\n\trasterizer.rasterizerDiscardEnable = VK_FALSE;\n\trasterizer.polygonMode = Vulkan::getPolygonMode(configuration.wireFrame);\n\trasterizer.lineWidth = 1.0f;\n\tif (!optionalDeviceExtensions.extendedDynamicState)\n\t{\n\t\trasterizer.cullMode = Vulkan::getCullMode(noDynamicStateConfiguration->cullmode);\n\t\trasterizer.frontFace = Vulkan::getFrontFace(noDynamicStateConfiguration->winding);\n\t}\n\n\trasterizer.depthBiasEnable = VK_FALSE;\n\trasterizer.depthBiasConstantFactor = 0.0f;\n\trasterizer.depthBiasClamp = 0.0f;\n\trasterizer.depthBiasSlopeFactor = 0.0f;\n\n\tVkPipelineInputAssemblyStateCreateInfo inputAssembly{};\n\tinputAssembly.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;\n\tinputAssembly.topology = Vulkan::getPrimitiveTypeTopology(configuration.primitiveType);\n\tinputAssembly.primitiveRestartEnable = VK_FALSE;\n\n\tVkPipelineDepthStencilStateCreateInfo depthStencil{};\n\tdepthStencil.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;\n\tdepthStencil.depthTestEnable = VK_TRUE;\n\tif (!optionalDeviceExtensions.extendedDynamicState)\n\t{\n\t\tdepthStencil.depthWriteEnable = Vulkan::getBool(noDynamicStateConfiguration->depthState.write);\n\t\tdepthStencil.depthCompareOp = Vulkan::getCompareOp(noDynamicStateConfiguration->depthState.compare);\n\t}\n\tdepthStencil.depthBoundsTestEnable = VK_FALSE;\n\tdepthStencil.minDepthBounds = 0.0f;\n\tdepthStencil.maxDepthBounds = 1.0f;\n\n\tdepthStencil.stencilTestEnable = VK_TRUE;\n\n\tif (!optionalDeviceExtensions.extendedDynamicState)\n\t{\n\t\tdepthStencil.front.failOp = VK_STENCIL_OP_KEEP;\n\t\tdepthStencil.front.passOp = Vulkan::getStencilOp(noDynamicStateConfiguration->stencilAction);\n\t\tdepthStencil.front.depthFailOp = VK_STENCIL_OP_KEEP;\n\t\tdepthStencil.front.compareOp = Vulkan::getCompareOp(getReversedCompareMode(noDynamicStateConfiguration->stencilCompare));\n\n\t\tdepthStencil.back.failOp = VK_STENCIL_OP_KEEP;\n\t\tdepthStencil.back.passOp = Vulkan::getStencilOp(noDynamicStateConfiguration->stencilAction);\n\t\tdepthStencil.back.depthFailOp = VK_STENCIL_OP_KEEP;\n\t\tdepthStencil.back.compareOp = Vulkan::getCompareOp(getReversedCompareMode(noDynamicStateConfiguration->stencilCompare));\n\t}\n\n\tpipelineInfo.pDepthStencilState = &depthStencil;\n\n\tBlendState blendState = BlendState::fromKey(configuration.blendStateKey);\n\n\tVkPipelineColorBlendAttachmentState colorBlendAttachment{};\n\tcolorBlendAttachment.colorWriteMask = Vulkan::getColorMask(configuration.colorChannelMask);\n\tcolorBlendAttachment.blendEnable = Vulkan::getBool(blendState.enable);\n\tcolorBlendAttachment.srcColorBlendFactor = Vulkan::getBlendFactor(blendState.srcFactorRGB);\n\tcolorBlendAttachment.dstColorBlendFactor = Vulkan::getBlendFactor(blendState.dstFactorRGB);\n\tcolorBlendAttachment.colorBlendOp = Vulkan::getBlendOp(blendState.operationRGB);\n\tcolorBlendAttachment.srcAlphaBlendFactor = Vulkan::getBlendFactor(blendState.srcFactorA);\n\tcolorBlendAttachment.dstAlphaBlendFactor = Vulkan::getBlendFactor(blendState.dstFactorA);\n\tcolorBlendAttachment.alphaBlendOp = Vulkan::getBlendOp(blendState.operationA);\n\n\tstd::vector<VkPipelineColorBlendAttachmentState> colorBlendAttachments(configuration.numColorAttachments, colorBlendAttachment);\n\n\tif (blendState.enable)\n\t{\n\t\tfor (uint32 i = 0; i < configuration.numColorAttachments; i++)\n\t\t{\n\t\t\tPixelFormat format = (PixelFormat)((configuration.packedColorAttachmentFormats >> (i * 8ull)) & 0xFF);\n\t\t\tif (!isPixelFormatSupported(format, PIXELFORMATUSAGEFLAGS_BLEND))\n\t\t\t\tcolorBlendAttachments[i].blendEnable = false;\n\t\t}\n\t}\n\n\tVkPipelineColorBlendStateCreateInfo colorBlending{};\n\tcolorBlending.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;\n\tcolorBlending.logicOpEnable = VK_FALSE;\n\tcolorBlending.logicOp = VK_LOGIC_OP_COPY;\n\tcolorBlending.attachmentCount = static_cast<uint32_t>(colorBlendAttachments.size());\n\tcolorBlending.pAttachments = colorBlendAttachments.data();\n\tcolorBlending.blendConstants[0] = 0.0f;\n\tcolorBlending.blendConstants[1] = 0.0f;\n\tcolorBlending.blendConstants[2] = 0.0f;\n\tcolorBlending.blendConstants[3] = 0.0f;\n\n\tstd::vector<VkDynamicState> dynamicStates;\n\n\tif (optionalDeviceExtensions.extendedDynamicState)\n\t\tdynamicStates = {\n\t\t\tVK_DYNAMIC_STATE_SCISSOR,\n\t\t\tVK_DYNAMIC_STATE_VIEWPORT,\n\t\t\tVK_DYNAMIC_STATE_STENCIL_WRITE_MASK,\n\t\t\tVK_DYNAMIC_STATE_STENCIL_COMPARE_MASK,\n\t\t\tVK_DYNAMIC_STATE_STENCIL_REFERENCE,\n\n\t\t\tVK_DYNAMIC_STATE_CULL_MODE_EXT,\n\t\t\tVK_DYNAMIC_STATE_FRONT_FACE_EXT,\n\t\t\tVK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT,\n\t\t\tVK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT,\n\t\t\tVK_DYNAMIC_STATE_STENCIL_OP_EXT,\n\t\t};\n\telse\n\t\tdynamicStates = {\n\t\t\tVK_DYNAMIC_STATE_SCISSOR,\n\t\t\tVK_DYNAMIC_STATE_VIEWPORT,\n\t\t\tVK_DYNAMIC_STATE_STENCIL_WRITE_MASK,\n\t\t\tVK_DYNAMIC_STATE_STENCIL_COMPARE_MASK,\n\t\t\tVK_DYNAMIC_STATE_STENCIL_REFERENCE,\n\t\t};\n\n\tVkPipelineDynamicStateCreateInfo dynamicState{};\n\tdynamicState.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;\n\tdynamicState.dynamicStateCount = static_cast<uint32_t>(dynamicStates.size());\n\tdynamicState.pDynamicStates = dynamicStates.data();\n\n\tpipelineInfo.stageCount = static_cast<uint32_t>(shaderStages.size());\n\tpipelineInfo.pStages = shaderStages.data();\n\tpipelineInfo.pVertexInputState = &vertexInputInfo;\n\tpipelineInfo.pInputAssemblyState = &inputAssembly;\n\tpipelineInfo.pViewportState = &viewportState;\n\tpipelineInfo.pRasterizationState = &rasterizer;\n\tpipelineInfo.pMultisampleState = &multisampling;\n\tpipelineInfo.pColorBlendState = &colorBlending;\n\tpipelineInfo.pDynamicState = &dynamicState;\n\tpipelineInfo.layout = shader->getGraphicsPipelineLayout();\n\tpipelineInfo.subpass = 0;\n\tpipelineInfo.basePipelineHandle = VK_NULL_HANDLE;\n\tpipelineInfo.basePipelineIndex = -1;\n\tpipelineInfo.renderPass = configuration.renderPass;\n\n\tVkPipeline graphicsPipeline;\n\tVkResult result = vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineInfo, nullptr, &graphicsPipeline);\n\tif (result != VK_SUCCESS)\n\t\tthrow love::Exception(\"Failed to create Vulkan graphics pipeline: %s\", Vulkan::getErrorString(result));\n\treturn graphicsPipeline;\n}\n\nVkSampleCountFlagBits Graphics::getMsaaCount(int requestedMsaa) const\n{\n\tVkPhysicalDeviceProperties physicalDeviceProperties;\n\tvkGetPhysicalDeviceProperties(physicalDevice, &physicalDeviceProperties);\n\n\tVkSampleCountFlags counts = physicalDeviceProperties.limits.framebufferColorSampleCounts & physicalDeviceProperties.limits.framebufferDepthSampleCounts;\n\n\tif (counts & VK_SAMPLE_COUNT_64_BIT && requestedMsaa >= 64)\n\t\treturn VK_SAMPLE_COUNT_64_BIT;\n\telse if (counts & VK_SAMPLE_COUNT_32_BIT && requestedMsaa >= 32)\n\t\treturn VK_SAMPLE_COUNT_32_BIT;\n\telse if (counts & VK_SAMPLE_COUNT_16_BIT && requestedMsaa >= 16)\n\t\treturn VK_SAMPLE_COUNT_16_BIT;\n\telse if (counts & VK_SAMPLE_COUNT_8_BIT && requestedMsaa >= 8)\n\t\treturn VK_SAMPLE_COUNT_8_BIT;\n\telse if (counts & VK_SAMPLE_COUNT_4_BIT && requestedMsaa >= 4)\n\t\treturn VK_SAMPLE_COUNT_4_BIT;\n\telse if (counts & VK_SAMPLE_COUNT_2_BIT && requestedMsaa >= 2)\n\t\treturn VK_SAMPLE_COUNT_2_BIT;\n\telse\n\t\treturn VK_SAMPLE_COUNT_1_BIT;\n}\n\nvoid Graphics::setVsync(int vsync)\n{\n\tif (vsync != this->vsync)\n\t{\n\t\tthis->vsync = vsync;\n\n\t\t// With the extension VK_EXT_swapchain_maintenance1 a swapchain recreation might not be needed\n\t\t// https://github.com/KhronosGroup/Vulkan-Docs/blob/main/proposals/VK_EXT_swapchain_maintenance1.adoc\n\t\t// However, there are not any drivers that support it, yet.\n\t\t// Reevaluate again in the future.\n\n\t\trequestSwapchainRecreation();\n\t}\n}\n\nint Graphics::getVsync() const\n{\n\treturn vsync;\n}\n\nvoid Graphics::mapLocalUniformData(void *data, size_t size, VkDescriptorBufferInfo &bufferInfo)\n{\n\tsize_t alignedSize = alignUp(size, minUniformBufferOffsetAlignment);\n\n\tif (localUniformBuffer->getUsableSize() < alignedSize)\n\t\tlocalUniformBuffer.set(new StreamBuffer(this, BUFFERUSAGE_UNIFORM, localUniformBuffer->getSize() * 2), Acquire::NORETAIN);\n\n\tauto mapInfo = localUniformBuffer->map(size);\n\tmemcpy(mapInfo.data, data, size);\n\n\tbufferInfo.buffer = (VkBuffer)localUniformBuffer->getHandle();\n\tbufferInfo.offset = localUniformBuffer->unmap(size);\n\tbufferInfo.range = size;\n\n\tlocalUniformBuffer->markUsed(alignedSize);\n}\n\nvoid Graphics::createColorResources()\n{\n\tif (msaaSamples & VK_SAMPLE_COUNT_1_BIT)\n\t{\n\t\tcolorImage = VK_NULL_HANDLE;\n\t\tcolorImageView = VK_NULL_HANDLE;\n\t} \n\telse\n\t{\n\t\tVkFormat colorFormat = swapChainImageFormat;\n\n\t\tVkImageCreateInfo imageInfo{};\n\t\timageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;\n\t\timageInfo.imageType = VK_IMAGE_TYPE_2D;\n\t\timageInfo.format = colorFormat;\n\t\timageInfo.extent.width = swapChainExtent.width;\n\t\timageInfo.extent.height = swapChainExtent.height;\n\t\timageInfo.extent.depth = 1;\n\t\timageInfo.mipLevels = 1;\n\t\timageInfo.arrayLayers = 1;\n\t\timageInfo.samples = msaaSamples;\n\t\timageInfo.tiling = VK_IMAGE_TILING_OPTIMAL;\n\t\timageInfo.usage = VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;\n\t\timageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;\n\t\timageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;\n\n\t\tVmaAllocationCreateInfo allocationInfo{};\n\t\tallocationInfo.usage = VMA_MEMORY_USAGE_AUTO;\n\t\tallocationInfo.flags = VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT;\n\n\t\tVkResult result = vmaCreateImage(vmaAllocator, &imageInfo, &allocationInfo, &colorImage, &colorImageAllocation, nullptr);\n\t\tif (result != VK_SUCCESS)\n\t\t\tthrow love::Exception(\"Failed to create Vulkan MSAA color image: %s\", Vulkan::getErrorString(result));\n\n\t\tVkImageViewCreateInfo imageViewInfo{};\n\t\timageViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;\n\t\timageViewInfo.image = colorImage;\n\t\timageViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;\n\t\timageViewInfo.format = colorFormat;\n\t\timageViewInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;\n\t\timageViewInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;\n\t\timageViewInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;\n\t\timageViewInfo.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;\n\t\timageViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;\n\t\timageViewInfo.subresourceRange.baseMipLevel = 0;\n\t\timageViewInfo.subresourceRange.levelCount = 1;\n\t\timageViewInfo.subresourceRange.baseArrayLayer = 0;\n\t\timageViewInfo.subresourceRange.layerCount = 1;\n\n\t\tresult = vkCreateImageView(device, &imageViewInfo, nullptr, &colorImageView);\n\t\tif (result != VK_SUCCESS)\n\t\t\tthrow love::Exception(\"Failed to create Vulkan MSAA color image view: %s\", Vulkan::getErrorString(result));\n\t}\n}\n\nVkFormat Graphics::findSupportedFormat(const std::vector<VkFormat> &candidates, VkImageTiling tiling, VkFormatFeatureFlags features)\n{\n\tfor (auto format : candidates)\n\t{\n\t\tVkFormatProperties properties;\n\t\tvkGetPhysicalDeviceFormatProperties(physicalDevice, format, &properties);\n\t\tif (tiling == VK_IMAGE_TILING_LINEAR && (properties.linearTilingFeatures & features) == features)\n\t\t\treturn format;\n\t\telse if (tiling == VK_IMAGE_TILING_OPTIMAL && (properties.optimalTilingFeatures & features) == features)\n\t\t\treturn format;\n\t}\n\n\tthrow love::Exception(\"failed to find supported format\");\n}\n\nVkFormat Graphics::findDepthFormat()\n{\n\treturn findSupportedFormat(\n\t\t{ VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT },\n\t\tVK_IMAGE_TILING_OPTIMAL,\n\t\tVK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT\n\t);\n}\n\nvoid Graphics::createDepthResources()\n{\n\tif (!backbufferHasDepth && !backbufferHasStencil)\n\t{\n\t\tdepthImage = VK_NULL_HANDLE;\n\t\tdepthImageView = VK_NULL_HANDLE;\n\t\treturn;\n\t}\n\n\tVkImageCreateInfo imageInfo{};\n\timageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;\n\timageInfo.imageType = VK_IMAGE_TYPE_2D;\n\timageInfo.format = depthStencilFormat;\n\timageInfo.extent.width = swapChainExtent.width;\n\timageInfo.extent.height = swapChainExtent.height;\n\timageInfo.extent.depth = 1;\n\timageInfo.mipLevels = 1;\n\timageInfo.arrayLayers = 1;\n\timageInfo.samples = msaaSamples;\n\timageInfo.tiling = VK_IMAGE_TILING_OPTIMAL;\n\timageInfo.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;\n\timageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;\n\timageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;\n\n\tVmaAllocationCreateInfo allocationInfo{};\n\tallocationInfo.usage = VMA_MEMORY_USAGE_AUTO;\n\tallocationInfo.flags = VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT;\n\n\tVkResult result = vmaCreateImage(vmaAllocator, &imageInfo, &allocationInfo, &depthImage, &depthImageAllocation, nullptr);\n\tif (result != VK_SUCCESS)\n\t\tthrow love::Exception(\"Failed to create Vulkan backbuffer depth image: %s\", Vulkan::getErrorString(result));\n\n\tVkImageViewCreateInfo imageViewInfo{};\n\timageViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;\n\timageViewInfo.image = depthImage;\n\timageViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;\n\timageViewInfo.format = depthStencilFormat;\n\timageViewInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;\n\timageViewInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;\n\timageViewInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;\n\timageViewInfo.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;\n\tif (backbufferHasDepth)\n\t\timageViewInfo.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_DEPTH_BIT;\n\tif (backbufferHasStencil)\n\t\timageViewInfo.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT;\n\timageViewInfo.subresourceRange.baseMipLevel = 0;\n\timageViewInfo.subresourceRange.levelCount = 1;\n\timageViewInfo.subresourceRange.baseArrayLayer = 0;\n\timageViewInfo.subresourceRange.layerCount = 1;\n\n\tresult = vkCreateImageView(device, &imageViewInfo, nullptr, &depthImageView);\n\tif (result != VK_SUCCESS)\n\t\tthrow love::Exception(\"Failed to create Vulkan backbuffer depth image view: %s\", Vulkan::getErrorString(result));\n}\n\nvoid Graphics::createCommandPool()\n{\n\tQueueFamilyIndices queueFamilyIndices = findQueueFamilies(physicalDevice);\n\n\tVkCommandPoolCreateInfo poolInfo{};\n\tpoolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;\n\tpoolInfo.queueFamilyIndex = queueFamilyIndices.graphicsFamily.value;\n\tpoolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT;\n\n\tVkResult result = vkCreateCommandPool(device, &poolInfo, nullptr, &commandPool);\n\tif (result != VK_SUCCESS)\n\t\tthrow love::Exception(\"Failed to create Vulkan command pool: %s\", Vulkan::getErrorString(result));\n}\n\nvoid Graphics::createCommandBuffers()\n{\n\tcommandBuffers.resize(MAX_FRAMES_IN_FLIGHT);\n\n\tVkCommandBufferAllocateInfo allocInfo{};\n\tallocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;\n\tallocInfo.commandPool = commandPool;\n\tallocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;\n\tallocInfo.commandBufferCount = static_cast<uint32_t>(MAX_FRAMES_IN_FLIGHT);\n\n\tVkResult result = vkAllocateCommandBuffers(device, &allocInfo, commandBuffers.data());\n\tif (result != VK_SUCCESS)\n\t\tthrow love::Exception(\"Failed to allocate Vulkan command buffers: %s\", Vulkan::getErrorString(result));\n}\n\nvoid Graphics::createSyncObjects()\n{\n\timageAvailableSemaphores.resize(MAX_FRAMES_IN_FLIGHT);\n\trenderFinishedSemaphores.resize(MAX_FRAMES_IN_FLIGHT);\n\tinFlightFences.resize(MAX_FRAMES_IN_FLIGHT);\n\timagesInFlight.resize(swapChainImages.size(), VK_NULL_HANDLE);\n\n\tVkSemaphoreCreateInfo semaphoreInfo{};\n\tsemaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;\n\n\tVkFenceCreateInfo fenceInfo{};\n\tfenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;\n\tfenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;\n\n\tfor (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++)\n\t\tif (vkCreateSemaphore(device, &semaphoreInfo, nullptr, &imageAvailableSemaphores.at(i)) != VK_SUCCESS ||\n\t\t\tvkCreateSemaphore(device, &semaphoreInfo, nullptr, &renderFinishedSemaphores.at(i)) != VK_SUCCESS ||\n\t\t\tvkCreateFence(device, &fenceInfo, nullptr, &inFlightFences.at(i)) != VK_SUCCESS)\n\t\t\tthrow love::Exception(\"Failed to create Vulkan synchronization objects for a frame!\");\n}\n\nvoid Graphics::cleanup()\n{\n\tfor (auto &cleanUpFns : cleanUpFunctions)\n\t\tfor (auto &cleanUpFn : cleanUpFns)\n\t\t\tcleanUpFn();\n\tcleanUpFunctions.clear();\n\n\tvmaDestroyAllocator(vmaAllocator);\n\n\tfor (const auto &s : renderFinishedSemaphores)\n\t\tvkDestroySemaphore(device, s, nullptr);\n\trenderFinishedSemaphores.clear();\n\n\tfor (const auto &s : imageAvailableSemaphores)\n\t\tvkDestroySemaphore(device, s, nullptr);\n\timageAvailableSemaphores.clear();\n\n\tfor (const auto &f : inFlightFences)\n\t\tvkDestroyFence(device, f, nullptr);\n\tinFlightFences.clear();\n\n\tif (!commandBuffers.empty())\n\t\tvkFreeCommandBuffers(device, commandPool, (uint32)commandBuffers.size(), commandBuffers.data());\n\tcommandBuffers.clear();\n\n\tfor (auto const &p : samplers)\n\t\tvkDestroySampler(device, p.second, nullptr);\n\tsamplers.clear();\n\n\tfor (const auto &entry : renderPasses)\n\t\tvkDestroyRenderPass(device, entry.second, nullptr);\n\trenderPasses.clear();\n\n\tfor (const auto &entry : framebuffers)\n\t\tvkDestroyFramebuffer(device, entry.second, nullptr);\n\tframebuffers.clear();\n\n\tif (commandPool != VK_NULL_HANDLE)\n\t{\n\t\tvkDestroyCommandPool(device, commandPool, nullptr);\n\t\tcommandPool = VK_NULL_HANDLE;\n\t}\n\n\tif (pipelineCache != VK_NULL_HANDLE)\n\t{\n\t\tvkDestroyPipelineCache(device, pipelineCache, nullptr);\n\t\tpipelineCache = VK_NULL_HANDLE;\n\t}\n\n\tif (device != VK_NULL_HANDLE)\n\t{\n\t\tvkDestroyDevice(device, nullptr);\n\t\tdevice = VK_NULL_HANDLE;\n\t}\n}\n\nvoid Graphics::cleanupSwapChain(bool destroySwapChainObject)\n{\n\tif (colorImage)\n\t{\n\t\tcleanupFramebuffers(colorImageView, swapChainPixelFormat);\n\n\t\tvkDestroyImageView(device, colorImageView, nullptr);\n\t\tcolorImageView = VK_NULL_HANDLE;\n\n\t\tvmaDestroyImage(vmaAllocator, colorImage, colorImageAllocation);\n\t\tcolorImage = VK_NULL_HANDLE;\n\t}\n\tif (depthImage)\n\t{\n\t\tcleanupFramebuffers(depthImageView, depthStencilPixelFormat);\n\n\t\tvkDestroyImageView(device, depthImageView, nullptr);\n\t\tdepthImageView = VK_NULL_HANDLE;\n\n\t\tvmaDestroyImage(vmaAllocator, depthImage, depthImageAllocation);\n\t\tdepthImage = VK_NULL_HANDLE;\n\t}\n\tfor (const auto &swapChainImageView : swapChainImageViews)\n\t{\n\t\tcleanupFramebuffers(swapChainImageView, swapChainPixelFormat);\n\t\tvkDestroyImageView(device, swapChainImageView, nullptr);\n\t}\n\tswapChainImageViews.clear();\n\tswapChainImages.clear();\n\tfakeBackbuffer.set(nullptr);\n\n\tif (destroySwapChainObject && swapChain != VK_NULL_HANDLE)\n\t{\n\t\tvkDestroySwapchainKHR(device, swapChain, nullptr);\n\t\tswapChain = VK_NULL_HANDLE;\n\t}\n}\n\nvoid Graphics::recreateSwapChain()\n{\n\tvkDeviceWaitIdle(device);\n\n\tcleanupSwapChain(false);\n\n\tcreateSwapChain();\n\tcreateImageViews();\n\tcreateColorResources();\n\tcreateDepthResources();\n\n\ttransitionColorDepthLayouts = true;\n}\n\nlove::graphics::Graphics *createInstance()\n{\n\tlove::graphics::Graphics *instance = nullptr;\n\n\ttry\n\t{\n\t\tinstance = new Graphics();\n\t}\n\tcatch (love::Exception &e)\n\t{\n\t\tif (isDebugEnabled())\n\t\t\tprintf(\"Cannot create Vulkan renderer: %s\\n\", e.what());\n\t}\n\n\treturn instance;\n}\n\n} // vulkan\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/vulkan/Graphics.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// löve\n#include \"common/config.h\"\n#include \"graphics/Graphics.h\"\n#include \"StreamBuffer.h\"\n#include \"ShaderStage.h\"\n#include \"Shader.h\"\n#include \"Texture.h\"\n\n// libraries\n#include \"VulkanWrapper.h\"\n#include \"libraries/xxHash/xxhash.h\"\n\n// c++\n#include <iostream>\n#include <memory>\n#include <functional>\n#include <set>\n#include <tuple>\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace vulkan\n{\n\nstruct ColorAttachment\n{\n\tVkFormat format = VK_FORMAT_UNDEFINED;\n\tVkImageLayout layout = VK_IMAGE_LAYOUT_UNDEFINED;\n\tVkImageLayout msaaLayout = VK_IMAGE_LAYOUT_UNDEFINED;\n\tVkAttachmentLoadOp loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;\n\tVkSampleCountFlagBits msaaSamples = VK_SAMPLE_COUNT_1_BIT;\n\n\tbool operator==(const ColorAttachment &attachment) const\n\t{\n\t\treturn format == attachment.format &&\n\t\t\tlayout == attachment.layout &&\n\t\t\tmsaaLayout == attachment.msaaLayout &&\n\t\t\tloadOp == attachment.loadOp &&\n\t\t\tmsaaSamples == attachment.msaaSamples;\n\t}\n};\n\nstruct DepthStencilAttachment\n{\n\tVkFormat format = VK_FORMAT_UNDEFINED;\n\tVkImageLayout layout = VK_IMAGE_LAYOUT_UNDEFINED;\n\tVkAttachmentLoadOp depthLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD;\n\tVkAttachmentLoadOp stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD;\n\tVkSampleCountFlagBits msaaSamples = VK_SAMPLE_COUNT_1_BIT;\n\n\tbool operator==(const DepthStencilAttachment &attachment) const\n\t{\n\t\treturn format == attachment.format &&\n\t\t\tlayout == attachment.layout &&\n\t\t\tdepthLoadOp == attachment.depthLoadOp &&\n\t\t\tstencilLoadOp == attachment.stencilLoadOp &&\n\t\t\tmsaaSamples == attachment.msaaSamples;\n\t}\n};\n\nstruct RenderPassConfiguration\n{\n\tstd::vector<ColorAttachment> colorAttachments;\n\n\tstruct StaticRenderPassConfiguration\n\t{\n\t\tDepthStencilAttachment depthStencilAttachment;\n\t\tbool resolve = false;\n\t} staticData;\n\n\tbool operator==(const RenderPassConfiguration &conf) const\n\t{\n\t\treturn colorAttachments == conf.colorAttachments && \n\t\t\t(memcmp(&staticData, &conf.staticData, sizeof(StaticRenderPassConfiguration)) == 0);\n\t}\n};\n\nstruct RenderPassConfigurationHasher\n{\n\tsize_t operator()(const RenderPassConfiguration &configuration) const\n\t{\n\t\tsize_t hashes[] = { \n\t\t\tXXH32(configuration.colorAttachments.data(), configuration.colorAttachments.size() * sizeof(ColorAttachment), 0),\n\t\t\tXXH32(&configuration.staticData, sizeof(configuration.staticData), 0),\n\t\t};\n\t\treturn XXH32(hashes, sizeof(hashes), 0);\n\t}\n};\n\nstruct FramebufferConfiguration\n{\n\tstd::vector<VkImageView> colorViews;\n\tstd::vector<VkImageView> colorResolveViews;\n\n\tstruct StaticFramebufferConfiguration\n\t{\n\t\tVkImageView depthView = VK_NULL_HANDLE;\n\n\t\tuint32_t width = 0;\n\t\tuint32_t height = 0;\n\n\t\tVkRenderPass renderPass = VK_NULL_HANDLE;\n\t} staticData;\n\n\tbool operator==(const FramebufferConfiguration &conf) const\n\t{\n\t\treturn colorViews == conf.colorViews && colorResolveViews == conf.colorResolveViews &&\n\t\t\t(memcmp(&staticData, &conf.staticData, sizeof(StaticFramebufferConfiguration)) == 0);\n\t}\n};\n\nstruct FramebufferConfigurationHasher\n{\n\tsize_t operator()(const FramebufferConfiguration &configuration) const\n\t{\n\t\tsize_t hashes[] = {\n\t\t\tXXH32(configuration.colorViews.data(), configuration.colorViews.size() * sizeof(VkImageView), 0),\n\t\t\tXXH32(configuration.colorResolveViews.data(), configuration.colorResolveViews.size() * sizeof(VkImageView), 0),\n\t\t\tXXH32(&configuration.staticData, sizeof(configuration.staticData), 0),\n\t\t};\n\n\t\treturn XXH32(hashes, sizeof(hashes), 0);\n\t}\n};\n\nstruct OptionalInstanceExtensions\n{\n\t// VK_KHR_get_physical_device_properties2\n\tbool physicalDeviceProperties2 = false;\n\n\t// VK_EXT_debug_info\n\tbool debugInfo = false;\n};\n\nstruct OptionalDeviceExtensions\n{\n\t// VK_EXT_extended_dynamic_state\n\tbool extendedDynamicState = false;\n\n\t// VK_KHR_get_memory_requirements2\n\tbool memoryRequirements2 = false;\n\n\t// VK_KHR_dedicated_allocation\n\tbool dedicatedAllocation = false;\n\n\t// VK_EXT_memory_budget\n\tbool memoryBudget = false;\n\n\t// VK_KHR_shader_float_controls\n\tbool shaderFloatControls = false;\n\n\t// VK_KHR_spirv_1_4\n\tbool spirv14 = false;\n};\n\nstruct QueueFamilyIndices\n{\n\tOptional<uint32_t> graphicsFamily;\n\tOptional<uint32_t> presentFamily;\n\n\tbool isComplete() const\n\t{\n\t\treturn graphicsFamily.hasValue && presentFamily.hasValue;\n\t}\n};\n\nstruct SwapChainSupportDetails\n{\n\tVkSurfaceCapabilitiesKHR capabilities{};\n\tstd::vector<VkSurfaceFormatKHR> formats;\n\tstd::vector<VkPresentModeKHR> presentModes;\n};\n\nstruct RenderpassState\n{\n\tbool active = false;\n\tVkRenderPassBeginInfo beginInfo{};\n\tbool isWindow = false;\n\tRenderPassConfiguration renderPassConfiguration{};\n\tFramebufferConfiguration framebufferConfiguration{};\n\tVkPipeline pipeline = VK_NULL_HANDLE;\n\tuint32_t numColorAttachments = 0;\n\tuint64 packedColorAttachmentFormats = 0;\n\tfloat width = 0.0f;\n\tfloat height = 0.0f;\n\tVkSampleCountFlagBits msaa = VK_SAMPLE_COUNT_1_BIT;\n\tstd::vector<VkClearValue> clearColors;\n\n\tbool windowClearRequested = false;\n\tOptionalColorD mainWindowClearColorValue;\n\tOptionalDouble mainWindowClearDepthValue;\n\tOptionalInt mainWindowClearStencilValue;\n};\n\nenum SubmitMode\n{\n\tSUBMIT_PRESENT,\n\tSUBMIT_NOPRESENT,\n\tSUBMIT_RESTART,\n\tSUBMIT_MAXENUM,\n};\n\nclass Graphics final : public love::graphics::Graphics\n{\npublic:\n\tGraphics();\n\t~Graphics();\n\n\t// implementation for virtual functions\n\tlove::graphics::Texture *newTexture(const love::graphics::Texture::Settings &settings, const love::graphics::Texture::Slices *data) override;\n\tlove::graphics::Texture *newTextureView(love::graphics::Texture *base, const Texture::ViewSettings &viewsettings) override;\n\tlove::graphics::Buffer *newBuffer(const love::graphics::Buffer::Settings &settings, const std::vector<love::graphics::Buffer::DataDeclaration>& format, const void *data, size_t size, size_t arraylength) override;\n\tgraphics::GraphicsReadback *newReadbackInternal(ReadbackMethod method, love::graphics::Buffer *buffer, size_t offset, size_t size, data::ByteData *dest, size_t destoffset) override;\n\tgraphics::GraphicsReadback *newReadbackInternal(ReadbackMethod method, love::graphics::Texture *texture, int slice, int mipmap, const Rect &rect, image::ImageData *dest, int destx, int desty) override;\n\tvoid clear(OptionalColorD color, OptionalInt stencil, OptionalDouble depth) override;\n\tvoid clear(const std::vector<OptionalColorD> &colors, OptionalInt stencil, OptionalDouble depth) override;\n\tvoid discard(const std::vector<bool>& colorbuffers, bool depthstencil) override;\n\tvoid present(void *screenshotCallbackdata) override;\n\tvoid backbufferChanged(int width, int height, int pixelwidth, int pixelheight, bool backbufferstencil, bool backbufferdepth, int msaa) override;\n\tbool setMode(void *context, int width, int height, int pixelwidth, int pixelheight, bool backbufferstencil, bool backbufferdepth, int msaa) override;\n\tvoid unSetMode() override;\n\tvoid setActive(bool active) override;\n\tint getRequestedBackbufferMSAA() const override;\n\tint getBackbufferMSAA() const  override;\n\tvoid setColor(Colorf c) override;\n\tvoid setScissor(const Rect &rect) override;\n\tvoid setScissor() override;\n\tvoid setStencilState(const StencilState &s) override;\n\tvoid setDepthMode(CompareMode compare, bool write) override;\n\tvoid setFrontFaceWinding(Winding winding) override;\n\tvoid setColorMask(ColorChannelMask mask) override;\n\tvoid setBlendState(const BlendState &blend) override;\n\tvoid setPointSize(float size) override;\n\tvoid setWireframe(bool enable) override;\n\tbool isPixelFormatSupported(PixelFormat format, uint32 usage) override;\n\tRenderer getRenderer() const override;\n\tbool usesGLSLES() const override;\n\tRendererInfo getRendererInfo() const override;\n\tvoid draw(const DrawCommand &cmd) override;\n\tvoid draw(const DrawIndexedCommand &cmd) override;\n\tvoid drawQuads(int start, int count, VertexAttributesID attributesID, const BufferBindings &buffers, graphics::Texture *texture) override;\n\n\t// internal functions.\n\n\tVkDevice getDevice() const;\n\tVmaAllocator getVmaAllocator() const;\n\tVkCommandBuffer getCommandBufferForDataTransfer();\n\tvoid queueCleanUp(std::function<void()> cleanUp);\n\tvoid addReadbackCallback(std::function<void()> callback);\n\tvoid submitGpuCommands(SubmitMode, void *screenshotCallbackData = nullptr);\n\tVkSampler getCachedSampler(const SamplerState &sampler);\n\tSharedDescriptorPools *acquireDescriptorPools(int dynamicUniformBuffers, int sampledTextures, int storageTextures, int texelBuffers, int storageBuffers);\n\tvoid releaseDescriptorPools(SharedDescriptorPools *pools);\n\tgraphics::Shader::BuiltinUniformData getCurrentBuiltinUniformData();\n\tconst OptionalDeviceExtensions &getEnabledOptionalDeviceExtensions() const;\n\tconst OptionalInstanceExtensions &getEnabledOptionalInstanceExtensions() const;\n\tVkSampleCountFlagBits getMsaaCount(int requestedMsaa) const;\n\tvoid setVsync(int vsync);\n\tint getVsync() const;\n\tvoid mapLocalUniformData(void *data, size_t size, VkDescriptorBufferInfo &bufferInfo);\n\n\tvoid cleanupFramebuffers(VkImageView imageView, PixelFormat format);\n\n\tVkPipeline createGraphicsPipeline(Shader *shader, const GraphicsPipelineConfigurationCore &configuration, const GraphicsPipelineConfigurationNoDynamicState *noDynamicStateConfiguration);\n\n\tuint32 getDeviceApiVersion() const { return deviceApiVersion; }\n\n\tuint64 getRealFrameIndex() const { return realFrameIndex; }\n\nprotected:\n\tgraphics::ShaderStage *newShaderStageInternal(ShaderStageType stage, const std::string &cachekey, const std::string &source, bool gles) override;\n\tgraphics::Shader *newShaderInternal(StrongRef<love::graphics::ShaderStage> stages[SHADERSTAGE_MAX_ENUM], const Shader::CompileOptions &options) override;\n\tgraphics::StreamBuffer *newStreamBuffer(BufferUsage type, size_t size) override;\n\tbool dispatch(love::graphics::Shader *shader, int x, int y, int z) override;\n\tbool dispatch(love::graphics::Shader *shader, love::graphics::Buffer *indirectargs, size_t argsoffset) override;\n\tvoid initCapabilities() override;\n\tvoid getAPIStats(int &shaderswitches) const override;\n\tvoid setRenderTargetsInternal(const RenderTargets &rts, int pixelw, int pixelh, bool hasSRGBtexture) override;\n\nprivate:\n\n\tstruct SharedDescriptorPoolsRef\n\t{\n\t\tSharedDescriptorPools *pools = nullptr;\n\t\tint referenceCount = 0;\n\t};\n\n\tbool checkValidationSupport();\n\tvoid pickPhysicalDevice();\n\tint rateDeviceSuitability(VkPhysicalDevice device, bool querySwapChain);\n\tQueueFamilyIndices findQueueFamilies(VkPhysicalDevice device);\n\tvoid createLogicalDevice();\n\tvoid createPipelineCache();\n\tvoid initVMA();\n\tvoid createSurface();\n\tSwapChainSupportDetails querySwapChainSupport(VkPhysicalDevice device);\n\tVkSurfaceFormatKHR chooseSwapSurfaceFormat(const std::vector<VkSurfaceFormatKHR> &availableFormats);\n\tVkPresentModeKHR chooseSwapPresentMode(const std::vector<VkPresentModeKHR> &availablePresentModes);\n\tVkExtent2D chooseSwapExtent(const VkSurfaceCapabilitiesKHR &capabilities);\n\tVkCompositeAlphaFlagBitsKHR chooseCompositeAlpha(const VkSurfaceCapabilitiesKHR &capabilities);\n\tvoid createSwapChain();\n\tvoid createImageViews();\n\tVkFramebuffer createFramebuffer(FramebufferConfiguration &configuration);\n\tVkFramebuffer getFramebuffer(FramebufferConfiguration &configuration);\n\tvoid createDefaultShaders();\n\tVkRenderPass createRenderPass(RenderPassConfiguration &configuration);\n\tVkRenderPass getRenderPass(RenderPassConfiguration &configuration);\n\tvoid createColorResources();\n\tVkFormat findSupportedFormat(const std::vector<VkFormat> &candidates, VkImageTiling tiling, VkFormatFeatureFlags features);\n\tVkFormat findDepthFormat();\n\tvoid createDepthResources();\n\tvoid createCommandPool();\n\tvoid createCommandBuffers();\n\tvoid createSyncObjects();\n\tvoid cleanup();\n\tvoid cleanupSwapChain(bool destroySwapChainObject);\n\tvoid recreateSwapChain();\n\tvoid initDynamicState();\n\tvoid beginSwapChainFrame();\n\tvoid beginFrame();\n\tvoid startRecordingGraphicsCommands();\n\tvoid endRecordingGraphicsCommands();\n\tvoid createVulkanVertexFormat(\n\t\tShader *shader,\n\t\tconst VertexAttributes &attributes, \n\t\tstd::vector<VkVertexInputBindingDescription> &bindingDescriptions, \n\t\tstd::vector<VkVertexInputAttributeDescription> &attributeDescriptions);\n\tvoid prepareDraw(\n\t\tVertexAttributesID attributesID,\n\t\tconst BufferBindings &buffers, graphics::Texture *texture,\n\t\tPrimitiveType, CullMode);\n\tvoid setRenderPass(const RenderTargets &rts, int pixelw, int pixelh);\n\tvoid setDefaultRenderPass();\n\tvoid startRenderPass();\n\tvoid endRenderPass();\n\tvoid applyScissor();\n\tVkSampler createSampler(const SamplerState &sampler);\n\tvoid requestSwapchainRecreation();\n\n\tVkInstance instance = VK_NULL_HANDLE;\n\tVkPhysicalDevice physicalDevice = VK_NULL_HANDLE;\n\tuint32_t deviceApiVersion = VK_API_VERSION_1_0;\n\tint requestedMsaa = 0;\n\tVkDevice device = VK_NULL_HANDLE; \n\tOptionalInstanceExtensions optionalInstanceExtensions;\n\tOptionalDeviceExtensions optionalDeviceExtensions;\n\tVkQueue graphicsQueue = VK_NULL_HANDLE;\n\tVkQueue presentQueue = VK_NULL_HANDLE;\n\tVkSurfaceKHR surface = VK_NULL_HANDLE;\n\tVkSwapchainKHR swapChain = VK_NULL_HANDLE;\n\tstd::vector<VkImage> swapChainImages;\n\tStrongRef<Texture> fakeBackbuffer;\n\tVkFormat swapChainImageFormat = VK_FORMAT_UNDEFINED;\n\tPixelFormat swapChainPixelFormat = PIXELFORMAT_UNKNOWN;\n\tVkFormat depthStencilFormat = VK_FORMAT_UNDEFINED;\n\tPixelFormat depthStencilPixelFormat = PIXELFORMAT_UNKNOWN;\n\tVkExtent2D swapChainExtent = VkExtent2D();\n\tstd::vector<VkImageView> swapChainImageViews;\n\tVkSampleCountFlagBits msaaSamples = VK_SAMPLE_COUNT_1_BIT;\n\tVkImage colorImage = VK_NULL_HANDLE;\n\tVkImageView colorImageView = VK_NULL_HANDLE;\n\tVmaAllocation colorImageAllocation = VK_NULL_HANDLE;\n\tVkImage depthImage = VK_NULL_HANDLE;\n\tVkImageView depthImageView = VK_NULL_HANDLE;\n\tVmaAllocation depthImageAllocation = VK_NULL_HANDLE;\n\tVkPipelineCache pipelineCache = VK_NULL_HANDLE;\n\tstd::unordered_map<RenderPassConfiguration, VkRenderPass, RenderPassConfigurationHasher> renderPasses;\n\tstd::unordered_map<FramebufferConfiguration, VkFramebuffer, FramebufferConfigurationHasher> framebuffers;\n\tstd::unordered_map<VkFramebuffer, bool> framebufferUsages;\n\tstd::unordered_map<uint64, VkSampler> samplers;\n\tstd::unordered_map<uint64, SharedDescriptorPoolsRef> sharedDescriptorPools;\n\tVkCommandPool commandPool = VK_NULL_HANDLE;\n\tstd::vector<VkCommandBuffer> commandBuffers;\n\tstd::vector<VkSemaphore> imageAvailableSemaphores;\n\tstd::vector<VkSemaphore> renderFinishedSemaphores;\n\tstd::vector<VkFence> inFlightFences;\n\tstd::vector<VkFence> imagesInFlight;\n\tint vsync = 1;\n\tVkDeviceSize minUniformBufferOffsetAlignment = 0;\n\tbool imageRequested = false;\n\tsize_t currentFrame = 0;\n\tuint32_t imageIndex = 0;\n\tuint64 realFrameIndex = 0;\n\tbool swapChainRecreationRequested = false;\n\tbool transitionColorDepthLayouts = false;\n\tVmaAllocator vmaAllocator = VK_NULL_HANDLE;\n\tStrongRef<love::graphics::Buffer> defaultVertexBuffer;\n\tStrongRef<StreamBuffer> localUniformBuffer;\n\t// functions that need to be called to cleanup objects that were needed for rendering a frame.\n\t// We need a vector for each frame in flight.\n\tstd::vector<std::vector<std::function<void()>>> cleanUpFunctions;\n\tstd::vector<std::vector<std::function<void()>>> readbackCallbacks;\n\tstd::set<StrongRef<Shader>> usedShadersInFrame;\n\tRenderpassState renderPassState;\n};\n\n} // vulkan\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/vulkan/GraphicsReadback.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"GraphicsReadback.h\"\n#include \"Buffer.h\"\n#include \"Texture.h\"\n#include \"Graphics.h\"\n#include \"data/ByteData.h\"\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace vulkan\n{\n\nGraphicsReadback::GraphicsReadback(love::graphics::Graphics *gfx, ReadbackMethod method, love::graphics::Buffer *buffer, size_t offset, size_t size, data::ByteData *dest, size_t destoffset)\n\t: graphics::GraphicsReadback(gfx, method, buffer, offset, size, dest, destoffset)\n\t, vgfx(dynamic_cast<Graphics*>(gfx))\n{\n\t// Immediate readback of readback-type buffers doesn't need a staging buffer.\n\tif (method != READBACK_IMMEDIATE || buffer->getDataUsage() != BUFFERDATAUSAGE_READBACK)\n\t{\n\t\tstagingBuffer = gfx->getTemporaryBuffer(size, DATAFORMAT_FLOAT, 0, BUFFERDATAUSAGE_READBACK);\n\t\tgfx->copyBuffer(buffer, stagingBuffer, offset, 0, size);\n\t}\n\n\tif (method == READBACK_IMMEDIATE)\n\t{\n\t\tvgfx->submitGpuCommands(SUBMIT_RESTART);\n\t\tif (stagingBuffer.get()) {\n\t\t\tstatus = readbackBuffer(stagingBuffer, 0, size);\n\t\t\tgfx->releaseTemporaryBuffer(stagingBuffer);\n\t\t}\n\t\telse\n\t\t\tstatus = readbackBuffer(buffer, offset, size);\n\t}\n\telse\n\t\tvgfx->addReadbackCallback([&]() {\n\t\t\tstatus = readbackBuffer(stagingBuffer, 0, stagingBuffer->getSize());\n\n\t\t\tvgfx->releaseTemporaryBuffer(stagingBuffer);\n\t\t\tstagingBuffer.set(nullptr);\n\t\t});\n}\n\nGraphicsReadback::GraphicsReadback(love::graphics::Graphics *gfx, ReadbackMethod method, love::graphics::Texture *texture, int slice, int mipmap, const Rect &rect, image::ImageData *dest, int destx, int desty)\n\t: graphics::GraphicsReadback(gfx, method, texture, slice, mipmap, rect, dest, destx, desty)\n\t, vgfx(dynamic_cast<Graphics*>(gfx))\n{\n\tsize_t size = getPixelFormatSliceSize(textureFormat, rect.w, rect.h);\n\n\tstagingBuffer = vgfx->getTemporaryBuffer(size, DATAFORMAT_FLOAT, 0, BUFFERDATAUSAGE_READBACK);\n\n\tvgfx->copyTextureToBuffer(texture, stagingBuffer, slice, mipmap, rect, 0, 0);\n\n\tvgfx->addReadbackCallback([&]() {\n\t\tstatus = readbackBuffer(stagingBuffer, 0, stagingBuffer->getSize());\n\n\t\tvgfx->releaseTemporaryBuffer(stagingBuffer);\n\t\tstagingBuffer.set(nullptr);\n\t});\n\n\tif (method == READBACK_IMMEDIATE)\n\t\tvgfx->submitGpuCommands(SUBMIT_RESTART);\n}\n\nGraphicsReadback::~GraphicsReadback()\n{\n}\n\nvoid GraphicsReadback::wait()\n{\n\tif (status == STATUS_WAITING)\n\t\tvgfx->submitGpuCommands(SUBMIT_RESTART);\n}\n\nvoid GraphicsReadback::update()\n{\n}\n\n} // vulkan\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/vulkan/GraphicsReadback.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"graphics/GraphicsReadback.h\"\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace vulkan\n{\n\nclass Graphics;\n\nclass GraphicsReadback final : public graphics::GraphicsReadback\n{\npublic:\n\tGraphicsReadback(love::graphics::Graphics *gfx, ReadbackMethod method, love::graphics::Buffer *buffer, size_t offset, size_t size, data::ByteData *dest, size_t destoffset);\n\tGraphicsReadback(love::graphics::Graphics *gfx, ReadbackMethod method, love::graphics::Texture *texture, int slice, int mipmap, const Rect &rect, image::ImageData *dest, int destx, int desty);\n\tvirtual ~GraphicsReadback();\n\n\tvoid wait() override;\n\tvoid update() override;\n\nprivate:\n\n\tGraphics *vgfx = nullptr;\n\tStrongRef<love::graphics::Buffer> stagingBuffer;\n};\n\n} // vulkan\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/vulkan/Shader.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"graphics/vertex.h\"\n#include \"Shader.h\"\n#include \"Graphics.h\"\n#include \"common/Range.h\"\n\n#include \"libraries/glslang/glslang/Public/ShaderLang.h\"\n#include \"libraries/glslang/glslang/Public/ResourceLimits.h\"\n#include \"libraries/glslang/SPIRV/GlslangToSpv.h\"\n\n#include <array>\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace vulkan\n{\n\nstatic const uint32_t DESCRIPTOR_POOL_SIZE = 1000;\n\nSharedDescriptorPools::SharedDescriptorPools(VkDevice device, int dynamicUniformBuffers, int sampledTextures, int storageTextures, int texelBuffers, int storageBuffers)\n\t: device(device)\n\t, dynamicUniformBuffers(dynamicUniformBuffers)\n\t, sampledTextures(sampledTextures)\n\t, storageTextures(storageTextures)\n\t, texelBuffers(texelBuffers)\n\t, storageBuffers(storageBuffers)\n{\n\tVkDescriptorPoolSize size{};\n\n\tif (dynamicUniformBuffers > 0)\n\t{\n\t\tsize.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;\n\t\tsize.descriptorCount = dynamicUniformBuffers;\n\t\tdescriptorPoolSizes.push_back(size);\n\t}\n\n\tif (sampledTextures > 0)\n\t{\n\t\tsize.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;\n\t\tsize.descriptorCount = sampledTextures;\n\t\tdescriptorPoolSizes.push_back(size);\n\t}\n\n\tif (storageTextures > 0)\n\t{\n\t\tsize.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;\n\t\tsize.descriptorCount = storageTextures;\n\t\tdescriptorPoolSizes.push_back(size);\n\t}\n\n\tif (texelBuffers > 0)\n\t{\n\t\tsize.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;\n\t\tsize.descriptorCount = texelBuffers;\n\t\tdescriptorPoolSizes.push_back(size);\n\t}\n\n\tif (storageBuffers > 0)\n\t{\n\t\tsize.type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;\n\t\tsize.descriptorCount = storageBuffers;\n\t\tdescriptorPoolSizes.push_back(size);\n\t}\n\n\tpools.resize(MAX_FRAMES_IN_FLIGHT);\n}\n\nSharedDescriptorPools::~SharedDescriptorPools()\n{\n\tauto vgfx = (Graphics *)Module::getInstance<Graphics>(Module::M_GRAPHICS);\n\tif (vgfx == nullptr)\n\t\treturn;\n\n\tvgfx->queueCleanUp([device = device, descriptorPools = pools]()\n\t{\n\t\tfor (const auto &pools : descriptorPools)\n\t\t{\n\t\t\tfor (const auto pool : pools)\n\t\t\t\tvkDestroyDescriptorPool(device, pool, nullptr);\n\t\t}\n\t});\n}\n\nvoid SharedDescriptorPools::newFrame(uint64 frameIndex)\n{\n\tif (!lastFrameIndex.hasValue || lastFrameIndex.value != frameIndex)\n\t{\n\t\tlastFrameIndex.set(frameIndex);\n\t\tcurrentFrame = (size_t)((currentFrame + 1) % MAX_FRAMES_IN_FLIGHT);\n\t\tcurrentPool = 0;\n\t\tfor (VkDescriptorPool pool : pools[currentFrame])\n\t\t\tvkResetDescriptorPool(device, pool, 0);\n\t}\n}\n\nvoid SharedDescriptorPools::createDescriptorPool()\n{\n\tVkDescriptorPoolCreateInfo createInfo{};\n\tcreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;\n\tcreateInfo.maxSets = DESCRIPTOR_POOL_SIZE;\n\tcreateInfo.poolSizeCount = static_cast<uint32_t>(descriptorPoolSizes.size());\n\tcreateInfo.pPoolSizes = descriptorPoolSizes.data();\n\n\tVkDescriptorPool pool;\n\tVkResult result = vkCreateDescriptorPool(device, &createInfo, nullptr, &pool);\n\tif (result != VK_SUCCESS)\n\t\tthrow love::Exception(\"Failed to create Vulkan descriptor pool: %s\", Vulkan::getErrorString(result));\n\n\tpools[currentFrame].push_back(pool);\n}\n\nVkDescriptorSet SharedDescriptorPools::allocateDescriptorSet(const VkDescriptorSetLayout &descriptorSetLayout)\n{\n\tif (pools[currentFrame].empty())\n\t\tcreateDescriptorPool();\n\n\twhile (true)\n\t{\n\t\tVkDescriptorSetAllocateInfo allocInfo{};\n\t\tallocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;\n\t\tallocInfo.descriptorPool = pools[currentFrame][currentPool];\n\t\tallocInfo.descriptorSetCount = 1;\n\t\tallocInfo.pSetLayouts = &descriptorSetLayout;\n\n\t\tVkDescriptorSet descriptorSet;\n\t\tVkResult result = vkAllocateDescriptorSets(device, &allocInfo, &descriptorSet);\n\n\t\tswitch (result)\n\t\t{\n\t\tcase VK_SUCCESS:\n\t\t\treturn descriptorSet;\n\t\tcase VK_ERROR_OUT_OF_POOL_MEMORY:\n\t\t\tcurrentPool++;\n\t\t\tif (pools[currentFrame].size() <= currentPool)\n\t\t\t\tcreateDescriptorPool();\n\t\t\tcontinue;\n\t\tdefault:\n\t\t\tthrow love::Exception(\"Failed to allocate Vulkan descriptor set: %s\", Vulkan::getErrorString(result));\n\t\t}\n\t}\n}\n\nclass BindingMapper\n{\npublic:\n\n\tBindingMapper(spv::Decoration decoration)\n\t\t: decoration(decoration)\n\t{}\n\n\tuint32_t operator()(spirv_cross::CompilerGLSL &comp, std::vector<uint32_t> &spirv, const std::string &name, int count, const spirv_cross::ID &id)\n\t{\n\t\tauto it = bindingMappings.find(name);\n\t\tif (it == bindingMappings.end())\n\t\t{\n\t\t\tauto binding = comp.get_decoration(id, decoration);\n\n\t\t\tif (isFreeBinding(binding, count))\n\t\t\t{\n\t\t\t\tbindingMappings[name] = Range(binding, count);\n\t\t\t\treturn binding;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tuint32_t freeBinding = getFreeBinding(count);\n\n\t\t\t\tuint32_t binaryBindingOffset;\n\t\t\t\tif (!comp.get_binary_offset_for_decoration(id, decoration, binaryBindingOffset))\n\t\t\t\t\tthrow love::Exception(\"could not get binary offset for uniform %s binding\", name.c_str());\n\n\t\t\t\tspirv[binaryBindingOffset] = freeBinding;\n\n\t\t\t\tbindingMappings[name] = Range(freeBinding, count);\n\n\t\t\t\treturn freeBinding;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tauto binding = (uint32_t)it->second.getOffset();\n\n\t\t\tuint32_t binaryBindingOffset;\n\t\t\tif (!comp.get_binary_offset_for_decoration(id, decoration, binaryBindingOffset))\n\t\t\t\tthrow love::Exception(\"could not get binary offset for uniform %s binding\", name.c_str());\n\n\t\t\tspirv[binaryBindingOffset] = binding;\n\n\t\t\treturn binding;\n\t\t}\n\t};\n\n\nprivate:\n\tuint32_t getFreeBinding(int count)\n\t{\n\t\tfor (uint32_t i = 0;; i++)\n\t\t{\n\t\t\tif (isFreeBinding(i, count))\n\t\t\t\treturn i;\n\t\t}\n\t}\n\n\tbool isFreeBinding(uint32_t binding, int count)\n\t{\n\t\tRange r(binding, count);\n\t\tfor (const auto &entry : bindingMappings)\n\t\t{\n\t\t\tif (entry.second.intersects(r))\n\t\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\tspv::Decoration decoration;\n\tstd::map<std::string, Range> bindingMappings;\n\n};\n\nstatic VkShaderStageFlagBits getStageBit(ShaderStageType type)\n{\n\tswitch (type)\n\t{\n\tcase SHADERSTAGE_VERTEX:\n\t\treturn VK_SHADER_STAGE_VERTEX_BIT;\n\tcase SHADERSTAGE_PIXEL:\n\t\treturn VK_SHADER_STAGE_FRAGMENT_BIT;\n\tcase SHADERSTAGE_COMPUTE:\n\t\treturn VK_SHADER_STAGE_COMPUTE_BIT;\n\tdefault:\n\t\tthrow love::Exception(\"Invalid shader stage type: %d\", type);\n\t}\n}\n\nstatic VkShaderStageFlags getStageFlags(ShaderStageMask mask)\n{\n\tVkShaderStageFlags flags = 0;\n\tif (mask & SHADERSTAGEMASK_VERTEX)\n\t\tflags |= VK_SHADER_STAGE_VERTEX_BIT;\n\tif (mask & SHADERSTAGEMASK_PIXEL)\n\t\tflags |= VK_SHADER_STAGE_FRAGMENT_BIT;\n\tif (mask & SHADERSTAGEMASK_COMPUTE)\n\t\tflags |= VK_SHADER_STAGE_COMPUTE_BIT;\n\treturn flags;\n}\n\nstatic EShLanguage getGlslShaderType(ShaderStageType stage)\n{\n\tswitch (stage)\n\t{\n\tcase SHADERSTAGE_VERTEX:\n\t\treturn EShLangVertex;\n\tcase SHADERSTAGE_PIXEL:\n\t\treturn EShLangFragment;\n\tcase SHADERSTAGE_COMPUTE:\n\t\treturn EShLangCompute;\n\tdefault:\n\t\tthrow love::Exception(\"Unknown shader stage type: %d\", stage);\n\t}\n}\n\nstatic bool usesLocalUniformData(const graphics::Shader::UniformInfo *info)\n{\n\treturn info->baseType == graphics::Shader::UNIFORM_BOOL ||\n\t\tinfo->baseType == graphics::Shader::UNIFORM_FLOAT ||\n\t\tinfo->baseType == graphics::Shader::UNIFORM_INT ||\n\t\tinfo->baseType == graphics::Shader::UNIFORM_MATRIX ||\n\t\tinfo->baseType == graphics::Shader::UNIFORM_UINT;\n}\n\nShader::Shader(StrongRef<love::graphics::ShaderStage> stages[], const CompileOptions &options)\n\t: graphics::Shader(stages, options)\n\t, builtinUniformInfo()\n{\n\tauto gfx = Module::getInstance<Graphics>(Module::ModuleType::M_GRAPHICS);\n\tvgfx = dynamic_cast<Graphics*>(gfx);\n\n\tloadVolatile();\n}\n\nbool Shader::loadVolatile()\n{\n\tdevice = vgfx->getDevice();\n\n\tcomputePipeline = VK_NULL_HANDLE;\n\n\tfor (int i = 0; i < BUILTIN_MAX_ENUM; i++)\n\t\tbuiltinUniformInfo[i] = nullptr;\n\n\tcompileShaders();\n\tcreateDescriptorSetLayout();\n\tcreatePipelineLayout();\n\tacquireDescriptorPools();\n\tnewFrame(vgfx->getRealFrameIndex());\n\n\treturn true;\n}\n\nvoid Shader::unloadVolatile()\n{\n\tif (shaderModules.empty())\n\t\treturn;\n\n\tvgfx->releaseDescriptorPools(descriptorPools);\n\tdescriptorPools = nullptr;\n\n\tvgfx->queueCleanUp([shaderModules = std::move(shaderModules), device = device, descriptorSetLayout = descriptorSetLayout, pipelineLayout = pipelineLayout,\n\t\tcomputePipeline = computePipeline,\n\t\tgraphicsPipelinesCore = std::move(graphicsPipelinesDynamicState), graphicsPipelinesFull = std::move(graphicsPipelinesNoDynamicState)]() {\n\t\tfor (const auto shaderModule : shaderModules)\n\t\t\tvkDestroyShaderModule(device, shaderModule, nullptr);\n\t\tvkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr);\n\t\tvkDestroyPipelineLayout(device, pipelineLayout, nullptr);\n\t\tif (computePipeline != VK_NULL_HANDLE)\n\t\t\tvkDestroyPipeline(device, computePipeline, nullptr);\n\t\tfor (const auto &kvp : graphicsPipelinesCore)\n\t\t\tvkDestroyPipeline(device, kvp.second, nullptr);\n\t\tfor (const auto &kvp : graphicsPipelinesFull)\n\t\t\tvkDestroyPipeline(device, kvp.second, nullptr);\n\t});\n\n\tshaderModules.clear();\n\tshaderStages.clear();\n}\n\nconst std::vector<VkPipelineShaderStageCreateInfo> &Shader::getShaderStages() const\n{\n\treturn shaderStages;\n}\n\nconst VkPipelineLayout Shader::getGraphicsPipelineLayout() const\n{\n\treturn pipelineLayout;\n}\n\nVkPipeline Shader::getComputePipeline() const\n{\n\treturn computePipeline;\n}\n\nvoid Shader::newFrame(uint64 graphicsFrameIndex)\n{\n\tcurrentDescriptorSet = VK_NULL_HANDLE;\n\tresourceDescriptorsDirty = true;\n\n\tdescriptorPools->newFrame(graphicsFrameIndex);\n}\n\nvoid Shader::cmdPushDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint bindPoint)\n{\n\tbool useLocalUniformOffset = false;\n\tuint32 localUniformOffset = 0;\n\n\tif (!localUniformData.empty())\n\t{\n\t\tif (builtinUniformDataOffset.hasValue)\n\t\t{\n\t\t\tauto builtinData = vgfx->getCurrentBuiltinUniformData();\n\t\t\tauto dst = (BuiltinUniformData *) (localUniformData.data() + builtinUniformDataOffset.value);\n\t\t\tmemcpy(dst, &builtinData, sizeof(builtinData));\n\t\t}\n\n\t\tVkDescriptorBufferInfo info = {};\n\t\tvgfx->mapLocalUniformData(localUniformData.data(), localUniformData.size(), info);\n\n\t\t// This is a dynamic uniform buffer, so the offset is specified in BindDescriptorSets\n\t\t// and it only needs to update the descriptor sets if the buffer changes.\n\t\tif (info.buffer != descriptorBuffers[0].buffer)\n\t\t\tresourceDescriptorsDirty = true;\n\n\t\tdescriptorBuffers[0].buffer = info.buffer;\n\t\tdescriptorBuffers[0].range = info.range;\n\t\tdescriptorBuffers[0].offset = 0;\n\n\t\tuseLocalUniformOffset = true;\n\t\tlocalUniformOffset = info.offset;\n\t}\n\n\t// Sampler updates need to happen here because the handles may change after sendTextures.\n\tfor (const auto &u : reflection.sampledTextures)\n\t{\n\t\tconst auto &info = u.second;\n\t\tif (!info.active)\n\t\t\tcontinue;\n\n\t\tfor (int i = 0; i < info.count; i++)\n\t\t{\n\t\t\tauto vkTexture = dynamic_cast<Texture*>(activeTextures[info.resourceIndex + i]);\n\n\t\t\tif (vkTexture == nullptr)\n\t\t\t\tthrow love::Exception(\"uniform variable %s is not set.\", info.name.c_str());\n\n\t\t\tauto sampler = (VkSampler)vkTexture->getSamplerHandle();\n\n\t\t\tVkDescriptorImageInfo &imageInfo = descriptorImages[info.bindingStartIndex + i];\n\t\t\tif (sampler != imageInfo.sampler)\n\t\t\t{\n\t\t\t\timageInfo.sampler = sampler;\n\t\t\t\tresourceDescriptorsDirty = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (resourceDescriptorsDirty || currentDescriptorSet == VK_NULL_HANDLE)\n\t{\n\t\tcurrentDescriptorSet = descriptorPools->allocateDescriptorSet(descriptorSetLayout);\n\n\t\tfor (auto &write : descriptorWrites)\n\t\t\twrite.dstSet = currentDescriptorSet;\n\n\t\tvkUpdateDescriptorSets(device, descriptorWrites.size(), descriptorWrites.data(), 0, nullptr);\n\t\tresourceDescriptorsDirty = false;\n\t}\n\n\tvkCmdBindDescriptorSets(commandBuffer, bindPoint, pipelineLayout, 0, 1, &currentDescriptorSet, useLocalUniformOffset ? 1 : 0, &localUniformOffset);\n}\n\nShader::~Shader()\n{\n\tunloadVolatile();\n}\n\nvoid Shader::attach()\n{\n\tif (!isCompute)\n\t{\n\t\tif (Shader::current != this)\n\t\t{\n\t\t\tGraphics::flushBatchedDrawsGlobal();\n\t\t\tShader::current = this;\n\t\t\tVulkan::shaderSwitch();\n\t\t}\n\t}\n}\n\nint Shader::getVertexAttributeIndex(const std::string &name)\n{\n\tauto it = attributes.find(name);\n\treturn it == attributes.end() ? -1 : it->second.index;\n}\n\nconst Shader::UniformInfo *Shader::getUniformInfo(BuiltinUniform builtin) const\n{\n\treturn builtinUniformInfo[builtin];\n}\n\nvoid Shader::updateUniform(const UniformInfo *info, int count)\n{\n\tif (current == this)\n\t\tGraphics::flushBatchedDrawsGlobal();\n\n\tcount = std::min(count, info->count);\n\n\tif (info->data != nullptr)\n\t{\n\t\tsize_t offset = (const uint8*)info->data - localUniformStagingData.data();\n\t\tuint8 *dst = localUniformData.data() + offset;\n\t\tcopyToUniformBuffer(info, info->data, dst, count);\n\t}\n}\n\nvoid Shader::applyTexture(const UniformInfo *info, int i, love::graphics::Texture *texture, UniformType /*basetype*/, bool isdefault)\n{\n\tsetTextureDescriptor(info, (isdefault && (info->access & ACCESS_WRITE) != 0) ? nullptr : texture, i);\n}\n\nvoid Shader::applyBuffer(const UniformInfo *info, int i, love::graphics::Buffer *buffer, UniformType /*basetype*/, bool isdefault)\n{\n\tsetBufferDescriptor(info, (isdefault && (info->access & ACCESS_WRITE) != 0) ? nullptr : buffer, i);\n}\n\nvoid Shader::buildLocalUniforms(spirv_cross::Compiler &comp, const spirv_cross::SPIRType &type, size_t baseoff, const std::string &basename)\n{\n\tusing namespace spirv_cross;\n\n\tconst auto &membertypes = type.member_types;\n\n\tfor (size_t uindex = 0; uindex < membertypes.size(); uindex++)\n\t{\n\t\tconst auto &memberType = comp.get_type(membertypes[uindex]);\n\t\tsize_t memberSize = comp.get_declared_struct_member_size(type, uindex);\n\t\tsize_t offset = baseoff + comp.type_struct_member_offset(type, uindex);\n\n\t\tstd::string name = basename + comp.get_member_name(type.self, uindex);\n\n\t\tswitch (memberType.basetype)\n\t\t{\n\t\tcase SPIRType::Struct:\n\t\t\tif (memberType.op == spv::OpTypeArray)\n\t\t\t{\n\t\t\t\tsize_t arraystride = comp.type_struct_member_array_stride(type, uindex);\n\t\t\t\tfor (uint32 i = 0; i < memberType.array[0]; i++)\n\t\t\t\t{\n\t\t\t\t\tstd::string structname = name + \"[\" + std::to_string(i) + \"].\";\n\t\t\t\t\tbuildLocalUniforms(comp, memberType, offset + i * arraystride, structname);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstd::string structname = name + \".\";\n\t\t\t\tbuildLocalUniforms(comp, memberType, offset, structname);\n\t\t\t}\n\t\t\tcontinue;\n\t\tcase SPIRType::Int:\n\t\tcase SPIRType::UInt:\n\t\tcase SPIRType::Float:\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tcontinue;\n\t\t}\n\n\t\tname = canonicaliizeUniformName(name);\n\n\t\tauto uniformit = reflection.allUniforms.find(name);\n\t\tif (uniformit == reflection.allUniforms.end())\n\t\t{\n\t\t\thandleUnknownUniformName(name.c_str());\n\t\t\tcontinue;\n\t\t}\n\n\t\tUniformInfo &u = *(uniformit->second);\n\n\t\tu.active = true;\n\t\tu.dataSize = memberSize;\n\t\tu.data = localUniformStagingData.data() + offset;\n\n\t\tconst auto &valuesit = reflection.localUniformInitializerValues.find(name);\n\t\tif (valuesit != reflection.localUniformInitializerValues.end())\n\t\t{\n\t\t\tconst auto &values = valuesit->second;\n\t\t\tif (!values.empty())\n\t\t\t{\n\t\t\t\tmemcpy(\n\t\t\t\t\tu.data,\n\t\t\t\t\tvalues.data(),\n\t\t\t\t\tstd::min(u.dataSize, values.size() * sizeof(LocalUniformValue)));\n\n\t\t\t\tuint8 *dst = localUniformData.data() + offset;\n\t\t\t\tcopyToUniformBuffer(&u, u.data, dst, u.count);\n\t\t\t}\n\t\t}\n\n\t\tBuiltinUniform builtin = BUILTIN_MAX_ENUM;\n\t\tif (getConstant(u.name.c_str(), builtin))\n\t\t{\n\t\t\tif (builtin == BUILTIN_UNIFORMS_PER_DRAW)\n\t\t\t\tbuiltinUniformDataOffset = offset;\n\t\t\tbuiltinUniformInfo[builtin] = &u;\n\t\t}\n\t}\n}\n\nvoid Shader::compileShaders()\n{\n\tusing namespace glslang;\n\tusing namespace spirv_cross;\n\n\tstd::vector<std::unique_ptr<TShader>> glslangShaders;\n\n\tauto program = std::make_unique<TProgram>();\n\n\tconst auto &enabledExtensions = vgfx->getEnabledOptionalDeviceExtensions();\n\n\tuint32 glslangOpts = EShMsgDefault;\n\tif (isDebugEnabled())\n\t\tglslangOpts |= EShMsgDebugInfo;\n\n\tfor (int i = 0; i < SHADERSTAGE_MAX_ENUM; i++)\n\t{\n\t\tif (!stages[i])\n\t\t\tcontinue;\n\n\t\tauto stage = (ShaderStageType)i;\n\n\t\tif (stage == SHADERSTAGE_COMPUTE)\n\t\t\tisCompute = true;\n\n\t\tauto glslangShaderStage = getGlslShaderType(stage);\n\t\tauto tshader = std::make_unique<TShader>(glslangShaderStage);\n\n\t\ttshader->setEnvInput(EShSourceGlsl, glslangShaderStage, EShClientVulkan, 450);\n\t\ttshader->setEnvClient(EShClientVulkan, EShTargetVulkan_1_2);\n\t\tif (enabledExtensions.spirv14)\n\t\t\ttshader->setEnvTarget(EshTargetSpv, EShTargetSpv_1_4);\n\t\telse\n\t\t\ttshader->setEnvTarget(EshTargetSpv, EShTargetSpv_1_0);\n\t\ttshader->setAutoMapLocations(true);\n\t\ttshader->setAutoMapBindings(true);\n\t\ttshader->setEnvInputVulkanRulesRelaxed();\n\t\ttshader->setGlobalUniformBinding(0);\n\t\ttshader->setGlobalUniformSet(0);\n\n\t\tauto &glsl = stages[i]->getSource();\n\t\tconst char *csrc = glsl.c_str();\n\t\tconst int sourceLength = static_cast<int>(glsl.length());\n\t\ttshader->setStringsWithLengths(&csrc, &sourceLength, 1);\n\n\t\tint defaultVersion = 450;\n\t\tEProfile defaultProfile = ECoreProfile;\n\t\tbool forceDefault = false;\n\t\tbool forwardCompat = true;\n\n\t\tif (!tshader->parse(GetResources(), defaultVersion, defaultProfile, forceDefault, forwardCompat, (EShMessages)(glslangOpts | EShMsgSuppressWarnings)))\n\t\t{\n\t\t\tconst char *stageName = \"unknown\";\n\t\t\tShaderStage::getConstant(stage, stageName);\n\n\t\t\tstd::string err = \"Error parsing \" + std::string(stageName) + \" shader:\\n\\n\"\n\t\t\t\t+ std::string(tshader->getInfoLog()) + \"\\n\"\n\t\t\t\t+ std::string(tshader->getInfoDebugLog());\n\n\t\t\tthrow love::Exception(\"%s\", err.c_str());\n\t\t}\n\n\t\tprogram->addShader(tshader.get());\n\t\tglslangShaders.push_back(std::move(tshader));\n\t}\n\n\tif (!program->link((EShMessages)(glslangOpts | EShMsgLinkTimeOptimization)))\n\t\tthrow love::Exception(\"link failed! %s\\n\", program->getInfoLog());\n\n\tif (!program->mapIO())\n\t\tthrow love::Exception(\"mapIO failed\");\n\n\tBindingMapper bindingMapper(spv::DecorationBinding);\n\tBindingMapper ioLocationMapper(spv::DecorationLocation);\n\tBindingMapper vertexInputLocationMapper(spv::DecorationLocation);\n\n\tfor (int i = 0; i < SHADERSTAGE_MAX_ENUM; i++)\n\t{\n\t\tauto shaderStage = (ShaderStageType)i;\n\t\tauto glslangStage = getGlslShaderType(shaderStage);\n\t\tauto intermediate = program->getIntermediate(glslangStage);\n\n\t\tif (intermediate == nullptr)\n\t\t\tcontinue;\n\n\t\tspv::SpvBuildLogger logger;\n\t\tglslang::SpvOptions opt;\n\t\topt.validate = true;\n\n\t\tif (isDebugEnabled())\n\t\t{\n\t\t\topt.generateDebugInfo = true;\n\t\t\topt.emitNonSemanticShaderDebugInfo = true;\n\t\t\topt.emitNonSemanticShaderDebugSource = true;\n\t\t}\n\n\t\tstd::vector<uint32> spirv;\n\n\t\tGlslangToSpv(*intermediate, spirv, &logger, &opt);\n\n\t\tauto compiler = std::make_unique<spirv_cross::CompilerGLSL>(spirv);\n\t\tauto &comp = *compiler;\n\n\t\t// We aren't recompiling the SPIR-V to something else, so\n\t\t// set_enabled_interface_variables wouldn't do much.\n\t\t// Vulkan has various rules about making sure bindings to inputs and\n\t\t// resources are valid, so we can't skip inactive ones here.\n\t\t// Unfortunately GlslangToSpv doesn't strip unused resources even\n\t\t// though it knows about them...\n\t\tauto active = compiler->get_active_interface_variables();\n\t\tauto shaderResources = comp.get_shader_resources();\n\n\t\tfor (const auto &resource : shaderResources.uniform_buffers)\n\t\t{\n\t\t\t// TODO: Do something smarter here.\n\t\t\tif (active.find(resource.id) == active.end())\n\t\t\t\tcontinue;\n\n\t\t\tif (resource.name == \"gl_DefaultUniformBlock\")\n\t\t\t{\n\t\t\t\tconst auto &type = comp.get_type(resource.base_type_id);\n\t\t\t\tsize_t defaultUniformBlockSize = comp.get_declared_struct_size(type);\n\n\t\t\t\tlocalUniformStagingData.resize(defaultUniformBlockSize);\n\t\t\t\tlocalUniformData.resize(defaultUniformBlockSize);\n\t\t\t\tlocalUniformLocation = bindingMapper(comp, spirv, resource.name, 1, resource.id);\n\n\t\t\t\tmemset(localUniformStagingData.data(), 0, defaultUniformBlockSize);\n\t\t\t\tmemset(localUniformData.data(), 0, defaultUniformBlockSize);\n\n\t\t\t\tstd::string basename(\"\");\n\t\t\t\tbuildLocalUniforms(comp, type, 0, basename);\n\t\t\t}\n\t\t\telse\n\t\t\t\tthrow love::Exception(\"unimplemented: non default uniform blocks.\");\n\t\t}\n\n\t\tfor (const auto &r : shaderResources.sampled_images)\n\t\t{\n\t\t\t// TODO: Do something smarter here.\n\t\t\tif (active.find(r.id) == active.end())\n\t\t\t\tcontinue;\n\n\t\t\tstd::string name = canonicaliizeUniformName(r.name);\n\t\t\tauto uniformit = reflection.allUniforms.find(name);\n\t\t\tif (uniformit == reflection.allUniforms.end())\n\t\t\t{\n\t\t\t\thandleUnknownUniformName(name.c_str());\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tUniformInfo &u = *(uniformit->second);\n\t\t\tu.active = true;\n\t\t\tu.location = bindingMapper(comp, spirv, name, u.count, r.id);\n\n\t\t\tBuiltinUniform builtin;\n\t\t\tif (getConstant(name.c_str(), builtin))\n\t\t\t\tbuiltinUniformInfo[builtin] = &u;\n\t\t}\n\n\t\tfor (const auto &r : shaderResources.storage_buffers)\n\t\t{\n\t\t\t// TODO: Do something smarter here.\n\t\t\tif (active.find(r.id) == active.end())\n\t\t\t\tcontinue;\n\n\t\t\tstd::string name = canonicaliizeUniformName(r.name);\n\t\t\tconst auto &uniformit = reflection.storageBuffers.find(name);\n\t\t\tif (uniformit == reflection.storageBuffers.end())\n\t\t\t{\n\t\t\t\thandleUnknownUniformName(name.c_str());\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tUniformInfo &u = uniformit->second;\n\t\t\tu.active = true;\n\t\t\tu.location = bindingMapper(comp, spirv, name, u.count, r.id);\n\t\t}\n\n\t\tfor (const auto &r : shaderResources.storage_images)\n\t\t{\n\t\t\t// TODO: Do something smarter here.\n\t\t\tif (active.find(r.id) == active.end())\n\t\t\t\tcontinue;\n\n\t\t\tstd::string name = canonicaliizeUniformName(r.name);\n\t\t\tconst auto &uniformit = reflection.storageTextures.find(name);\n\t\t\tif (uniformit == reflection.storageTextures.end())\n\t\t\t{\n\t\t\t\thandleUnknownUniformName(name.c_str());\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tUniformInfo &u = uniformit->second;\n\t\t\tu.active = true;\n\t\t\tu.location = bindingMapper(comp, spirv, name, u.count, r.id);\n\t\t}\n\n\t\tif (shaderStage == SHADERSTAGE_VERTEX)\n\t\t{\n\t\t\t// Use the mapper on known used inputs first, so their bindings get\n\t\t\t// put into the map without being changed.\n\t\t\tfor (const auto &r : shaderResources.stage_inputs)\n\t\t\t{\n\t\t\t\tauto it = reflection.vertexInputs.find(r.name);\n\t\t\t\tif (it != reflection.vertexInputs.end() && it->second >= 0)\n\t\t\t\t\tvertexInputLocationMapper(comp, spirv, r.name, 1, r.id);\n\t\t\t}\n\n\t\t\tfor (const auto &r : shaderResources.stage_inputs)\n\t\t\t{\n\t\t\t\t// Don't skip unused inputs, vulkan still needs to have valid\n\t\t\t\t// bindings for them. This will also avoid shuffling intentional\n\t\t\t\t// used bindings because of the earlier loop.\n\t\t\t\tint index = (int)vertexInputLocationMapper(comp, spirv, r.name, 1, r.id);\n\n\t\t\t\tDataBaseType basetype = DATA_BASETYPE_FLOAT;\n\n\t\t\t\tswitch (comp.get_type(r.base_type_id).basetype)\n\t\t\t\t{\n\t\t\t\tcase spirv_cross::SPIRType::Int:\n\t\t\t\t\tbasetype = DATA_BASETYPE_INT;\n\t\t\t\t\tbreak;\n\t\t\t\tcase spirv_cross::SPIRType::UInt:\n\t\t\t\t\tbasetype = DATA_BASETYPE_UINT;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tattributes[r.name] = { index, basetype };\n\t\t\t}\n\n\t\t\tfor (const auto &r : shaderResources.stage_outputs)\n\t\t\t{\n\t\t\t\tconst auto &type = comp.get_type(r.base_type_id);\n\t\t\t\tint count = type.array.empty() ? 1 : type.array[0];\n\t\t\t\tif (type.op == spv::OpTypeMatrix)\n\t\t\t\t\tcount *= type.columns;\n\n\t\t\t\tioLocationMapper(comp, spirv, r.name, count, r.id);\n\t\t\t}\n\t\t}\n\t\telse if (shaderStage == SHADERSTAGE_PIXEL)\n\t\t{\n\t\t\tfor (const auto &r : shaderResources.stage_inputs)\n\t\t\t{\n\t\t\t\tconst auto &type = comp.get_type(r.base_type_id);\n\t\t\t\tint count = type.array.empty() ? 1 : type.array[0];\n\t\t\t\tif (type.op == spv::OpTypeMatrix)\n\t\t\t\t\tcount *= type.columns;\n\n\t\t\t\tioLocationMapper(comp, spirv, r.name, count, r.id);\n\t\t\t}\n\t\t}\n\n\t\tVkShaderModuleCreateInfo createInfo{};\n\t\tcreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;\n\t\tcreateInfo.codeSize = spirv.size() * sizeof(uint32_t);\n\t\tcreateInfo.pCode = spirv.data();\n\n\t\tVkShaderModule shaderModule;\n\n\t\tVkResult result = vkCreateShaderModule(device, &createInfo, nullptr, &shaderModule);\n\t\tif (result != VK_SUCCESS)\n\t\t\tthrow love::Exception(\"Failed to create Vulkan shader module: %s\", Vulkan::getErrorString(result));\n\n\t\tstd::string debugname = getShaderStageDebugName(shaderStage);\n\t\tif (!debugname.empty() && vgfx->getEnabledOptionalInstanceExtensions().debugInfo)\n\t\t{\n\t\t\tauto device = vgfx->getDevice();\n\n\t\t\tVkDebugUtilsObjectNameInfoEXT nameInfo{};\n\t\t\tnameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT;\n\t\t\tnameInfo.objectType = VK_OBJECT_TYPE_SHADER_MODULE;\n\t\t\tnameInfo.objectHandle = (uint64_t)shaderModule;\n\t\t\tnameInfo.pObjectName = debugname.c_str();\n\t\t\tvkSetDebugUtilsObjectNameEXT(device, &nameInfo);\n\t\t}\n\n\t\tshaderModules.push_back(shaderModule);\n\n\t\tVkPipelineShaderStageCreateInfo shaderStageInfo{};\n\t\tshaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;\n\t\tshaderStageInfo.stage = getStageBit((ShaderStageType)i);\n\t\tshaderStageInfo.module = shaderModule;\n\t\tshaderStageInfo.pName = \"main\";\n\n\t\tshaderStages.push_back(shaderStageInfo);\n\t}\n\n\tint numBuffers = 0;\n\tint numTextures = 0;\n\tint numBufferViews = 0;\n\n\tif (localUniformData.size() > 0)\n\t\tnumBuffers++;\n\n\tfor (const auto &kvp : reflection.allUniforms)\n\t{\n\t\tif (!kvp.second->active)\n\t\t\tcontinue;\n\n\t\tswitch (kvp.second->baseType)\n\t\t{\n\t\tcase UNIFORM_SAMPLER:\n\t\tcase UNIFORM_STORAGETEXTURE:\n\t\t\tnumTextures += kvp.second->count;\n\t\t\tbreak;\n\t\tcase UNIFORM_STORAGEBUFFER:\n\t\t\tnumBuffers += kvp.second->count;\n\t\t\tbreak;\n\t\tcase UNIFORM_TEXELBUFFER:\n\t\t\tnumBufferViews += kvp.second->count;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tcontinue;\n\t\t}\n\t}\n\n\tdescriptorWrites.clear();\n\n\tdescriptorBuffers.clear();\n\tdescriptorBuffers.reserve(numBuffers);\n\n\tdescriptorImages.clear();\n\tdescriptorImages.reserve(numTextures);\n\n\tdescriptorBufferViews.clear();\n\tdescriptorBufferViews.reserve(numBufferViews);\n\n\tallTextureInfo.clear();\n\tallTextureInfo.reserve(numTextures);\n\tstorageBufferInfo.clear();\n\tstorageBufferInfo.reserve(numBuffers);\n\n\tif (localUniformData.size() > 0)\n\t{\n\t\tVkDescriptorBufferInfo bufferInfo{};\n\t\tbufferInfo.range = localUniformData.size();\n\n\t\tdescriptorBuffers.push_back(bufferInfo);\n\t\tstorageBufferInfo.push_back({ nullptr, ACCESS_READ }); // Dummy value.\n\n\t\tVkWriteDescriptorSet write{};\n\t\twrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\t\twrite.dstBinding = localUniformLocation;\n\t\twrite.dstArrayElement = 0;\n\t\twrite.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;\n\t\twrite.descriptorCount = 1;\n\t\twrite.pBufferInfo = &descriptorBuffers.back();\n\t\tdescriptorWrites.push_back(write);\n\t}\n\n\tfor (auto &u : reflection.sampledTextures)\n\t{\n\t\tUniformInfo &info = u.second;\n\t\tif (!info.active)\n\t\t\tcontinue;\n\n\t\tinfo.bindingStartIndex = (int)descriptorImages.size();\n\n\t\tfor (int i = 0; i < info.count; i++)\n\t\t{\n\t\t\tVkDescriptorImageInfo imageInfo{};\n\t\t\tdescriptorImages.push_back(imageInfo);\n\n\t\t\tallTextureInfo.push_back({ nullptr, info.access });\n\n\t\t\tauto texture = activeTextures[info.resourceIndex + i];\n\t\t\tif (texture != nullptr)\n\t\t\t\tsetTextureDescriptor(&info, texture, i);\n\t\t}\n\n\t\tVkWriteDescriptorSet write{};\n\t\twrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\t\twrite.dstBinding = info.location;\n\t\twrite.dstArrayElement = 0;\n\t\twrite.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;\n\t\twrite.descriptorCount = static_cast<uint32_t>(info.count);\n\t\twrite.pImageInfo = &descriptorImages[info.bindingStartIndex];\n\n\t\tdescriptorWrites.push_back(write);\n\t}\n\n\tfor (auto &u : reflection.storageTextures)\n\t{\n\t\tUniformInfo &info = u.second;\n\t\tif (!info.active)\n\t\t\tcontinue;\n\n\t\tinfo.bindingStartIndex = (int)descriptorImages.size();\n\n\t\tfor (int i = 0; i < info.count; i++)\n\t\t{\n\t\t\tVkDescriptorImageInfo imageInfo{};\n\t\t\tdescriptorImages.push_back(imageInfo);\n\n\t\t\tallTextureInfo.push_back({ nullptr, info.access });\n\n\t\t\tauto texture = activeTextures[info.resourceIndex + i];\n\t\t\tif (texture != nullptr)\n\t\t\t\tsetTextureDescriptor(&info, texture, i);\n\t\t}\n\n\t\tVkWriteDescriptorSet write{};\n\t\twrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\t\twrite.dstBinding = info.location;\n\t\twrite.dstArrayElement = 0;\n\t\twrite.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;\n\t\twrite.descriptorCount = static_cast<uint32_t>(info.count);\n\t\twrite.pImageInfo = &descriptorImages[info.bindingStartIndex];\n\n\t\tdescriptorWrites.push_back(write);\n\t}\n\n\tfor (auto &u : reflection.texelBuffers)\n\t{\n\t\tUniformInfo &info = u.second;\n\t\tif (!info.active)\n\t\t\tcontinue;\n\n\t\tinfo.bindingStartIndex = (int)descriptorBufferViews.size();\n\n\t\tfor (int i = 0; i < info.count; i++)\n\t\t{\n\t\t\tdescriptorBufferViews.push_back(VK_NULL_HANDLE);\n\n\t\t\tauto buffer = activeBuffers[info.resourceIndex + i];\n\t\t\tif (buffer != nullptr)\n\t\t\t\tsetBufferDescriptor(&info, buffer, i);\n\t\t}\n\n\t\tVkWriteDescriptorSet write{};\n\t\twrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\t\twrite.dstBinding = info.location;\n\t\twrite.dstArrayElement = 0;\n\t\twrite.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;\n\t\twrite.descriptorCount = info.count;\n\t\twrite.pTexelBufferView = &descriptorBufferViews[info.bindingStartIndex];\n\n\t\tdescriptorWrites.push_back(write);\n\t}\n\n\tfor (auto &u : reflection.storageBuffers)\n\t{\n\t\tUniformInfo &info = u.second;\n\t\tif (!info.active)\n\t\t\tcontinue;\n\n\t\tinfo.bindingStartIndex = (int)descriptorBuffers.size();\n\n\t\tfor (int i = 0; i < info.count; i++)\n\t\t{\n\t\t\tVkDescriptorBufferInfo bufferInfo{};\n\t\t\tdescriptorBuffers.push_back(bufferInfo);\n\n\t\t\tstorageBufferInfo.push_back({ nullptr, info.access });\n\n\t\t\tauto buffer = activeBuffers[info.resourceIndex + i];\n\t\t\tif (buffer != nullptr)\n\t\t\t\tsetBufferDescriptor(&info, buffer, i);\n\t\t}\n\n\t\tVkWriteDescriptorSet write{};\n\t\twrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\t\twrite.dstBinding = info.location;\n\t\twrite.dstArrayElement = 0;\n\t\twrite.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;\n\t\twrite.descriptorCount = info.count;\n\t\twrite.pBufferInfo = &descriptorBuffers[info.bindingStartIndex];\n\n\t\tdescriptorWrites.push_back(write);\n\t}\n\n\tresourceDescriptorsDirty = true;\n}\n\nvoid Shader::createDescriptorSetLayout()\n{\n\tstd::vector<VkDescriptorSetLayoutBinding> bindings;\n\n\tfor (auto const &entry : reflection.allUniforms)\n\t{\n\t\tif (!entry.second->active)\n\t\t\tcontinue;\n\n\t\tauto type = Vulkan::getDescriptorType(entry.second->baseType);\n\t\tif (type != VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)\n\t\t{\n\t\t\tVkDescriptorSetLayoutBinding layoutBinding{};\n\n\t\t\tlayoutBinding.binding = entry.second->location;\n\t\t\tlayoutBinding.descriptorType = type;\n\t\t\tlayoutBinding.descriptorCount = entry.second->count;\n\t\t\tlayoutBinding.stageFlags = getStageFlags((ShaderStageMask)entry.second->stageMask);\n\n\t\t\tbindings.push_back(layoutBinding);\n\t\t}\n\t}\n\n\tif (!localUniformStagingData.empty())\n\t{\n\t\tVkDescriptorSetLayoutBinding uniformBinding{};\n\t\tuniformBinding.binding = localUniformLocation;\n\t\tuniformBinding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;\n\t\tuniformBinding.descriptorCount = 1;\n\t\tif (isCompute)\n\t\t\tuniformBinding.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT;\n\t\telse\n\t\t\tuniformBinding.stageFlags = VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT;\n\t\tbindings.push_back(uniformBinding);\n\t}\n\n\tVkDescriptorSetLayoutCreateInfo layoutInfo{};\n\tlayoutInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;\n\tlayoutInfo.bindingCount = static_cast<uint32_t>(bindings.size());\n\tlayoutInfo.pBindings = bindings.data();\n\n\tVkResult result = vkCreateDescriptorSetLayout(device, &layoutInfo, nullptr, &descriptorSetLayout);\n\tif (result != VK_SUCCESS)\n\t\tthrow love::Exception(\"Failed to create Vulkan descriptor set layout: %s\", Vulkan::getErrorString(result));\n}\n\nvoid Shader::createPipelineLayout()\n{\n\tVkPipelineLayoutCreateInfo pipelineLayoutInfo{};\n\tpipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;\n\tpipelineLayoutInfo.setLayoutCount = 1;\n\tpipelineLayoutInfo.pSetLayouts = &descriptorSetLayout;\n\tpipelineLayoutInfo.pushConstantRangeCount = 0;\n\n\tVkResult result = vkCreatePipelineLayout(device, &pipelineLayoutInfo, nullptr, &pipelineLayout);\n\tif (result != VK_SUCCESS)\n\t\tthrow love::Exception(\"Failed to create Vulkan pipeline layout: %s\", Vulkan::getErrorString(result));\n\n\tif (isCompute)\n\t{\n\t\tassert(shaderStages.size() == 1);\n\n\t\tVkComputePipelineCreateInfo computeInfo{};\n\t\tcomputeInfo.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO;\n\t\tcomputeInfo.stage = shaderStages.at(0);\n\t\tcomputeInfo.layout = pipelineLayout;\n\n\t\tresult = vkCreateComputePipelines(device, VK_NULL_HANDLE, 1, &computeInfo, nullptr, &computePipeline);\n\t\tif (result != VK_SUCCESS)\n\t\t\tthrow love::Exception(\"Failed to create Vulkan compute pipeline: %s\", Vulkan::getErrorString(result));\n\t}\n}\n\nstatic int getDescriptorPoolSize(const std::map<std::string, Shader::UniformInfo> &uniforms)\n{\n\tint size = 0;\n\tfor (const auto &entry : uniforms)\n\t{\n\t\tif (entry.second.active)\n\t\t\tsize += entry.second.count;\n\t}\n\treturn size;\n}\n\nvoid Shader::acquireDescriptorPools()\n{\n\tint dynamicUniformBuffers = 0;\n\tif (!localUniformData.empty())\n\t\tdynamicUniformBuffers++;\n\n\tint sampledTextures = getDescriptorPoolSize(reflection.sampledTextures);\n\tint storageTextures = getDescriptorPoolSize(reflection.storageTextures);\n\tint texelBuffers = getDescriptorPoolSize(reflection.texelBuffers);\n\tint storageBuffers = getDescriptorPoolSize(reflection.storageBuffers);\n\n\tdescriptorPools = vgfx->acquireDescriptorPools(dynamicUniformBuffers, sampledTextures, storageTextures, texelBuffers, storageBuffers);\n}\n\nvoid Shader::setMainTex(graphics::Texture *texture)\n{\n\tconst UniformInfo *u = builtinUniformInfo[BUILTIN_TEXTURE_MAIN];\n\tif (u != nullptr)\n\t{\n\t\tauto prevtexture = activeTextures[u->resourceIndex];\n\t\tif (texture != nullptr)\n\t\t\ttexture->retain();\n\t\tif (prevtexture)\n\t\t\tprevtexture->release();\n\t\tactiveTextures[u->resourceIndex] = texture;\n\n\t\tif (texture != prevtexture)\n\t\t\tsetTextureDescriptor(u, texture, 0);\n\t}\n}\n\nvoid Shader::setTextureDescriptor(const UniformInfo *info, love::graphics::Texture *texture, int index)\n{\n\tauto vkTexture = dynamic_cast<Texture*>(texture);\n\n\tVkDescriptorImageInfo &imageInfo = descriptorImages[info->bindingStartIndex + index];\n\n\t// Samplers may change after this call, so they're set just before the\n\t// descriptor set is used instead of here.\n\tVkImageView view = vkTexture != nullptr ? (VkImageView)vkTexture->getHandle() : VK_NULL_HANDLE;\n\tif (view != imageInfo.imageView)\n\t{\n\t\timageInfo.imageLayout = vkTexture != nullptr ? vkTexture->getImageLayout() : VK_IMAGE_LAYOUT_UNDEFINED;\n\t\timageInfo.imageView = view;\n\t\tallTextureInfo[info->bindingStartIndex + index].texture = texture;\n\t\tresourceDescriptorsDirty = true;\n\t}\n}\n\nvoid Shader::setBufferDescriptor(const UniformInfo *info, love::graphics::Buffer *buffer, int index)\n{\n\tif (info->baseType == UNIFORM_STORAGEBUFFER)\n\t{\n\t\tVkDescriptorBufferInfo &bufferInfo = descriptorBuffers[info->bindingStartIndex + index];\n\t\tVkBuffer vkbuffer = buffer != nullptr ? (VkBuffer)buffer->getHandle() : VK_NULL_HANDLE;\n\t\tVkDeviceSize range = buffer != nullptr ? buffer->getSize() : 0;\n\t\tif (vkbuffer != bufferInfo.buffer || bufferInfo.offset != 0 || range != bufferInfo.range)\n\t\t{\n\t\t\tbufferInfo.buffer = vkbuffer;\n\t\t\tbufferInfo.offset = 0;\n\t\t\tbufferInfo.range = range;\n\t\t\tstorageBufferInfo[info->bindingStartIndex + index].buffer = buffer;\n\t\t\tresourceDescriptorsDirty = true;\n\t\t}\n\t}\n\telse if (info->baseType == UNIFORM_TEXELBUFFER)\n\t{\n\t\tVkBufferView view = buffer != nullptr ? (VkBufferView)buffer->getTexelBufferHandle() : VK_NULL_HANDLE;\n\t\tif (view != descriptorBufferViews[info->bindingStartIndex + index])\n\t\t{\n\t\t\tdescriptorBufferViews[info->bindingStartIndex + index] = view;\n\t\t\tresourceDescriptorsDirty = true;\n\t\t}\n\t}\n}\n\nVkPipeline Shader::getCachedGraphicsPipeline(Graphics *vgfx, const GraphicsPipelineConfigurationCore &configuration)\n{\n\tauto it = graphicsPipelinesDynamicState.find(configuration);\n\tif (it != graphicsPipelinesDynamicState.end())\n\t\treturn it->second;\n\n\tVkPipeline pipeline = vgfx->createGraphicsPipeline(this, configuration, nullptr);\n\tgraphicsPipelinesDynamicState.insert({ configuration, pipeline });\n\t\n\treturn pipeline;\n}\n\nVkPipeline Shader::getCachedGraphicsPipeline(Graphics *vgfx, const GraphicsPipelineConfigurationFull &configuration)\n{\n\tauto it = graphicsPipelinesNoDynamicState.find(configuration);\n\tif (it != graphicsPipelinesNoDynamicState.end())\n\t\treturn it->second;\n\n\tVkPipeline pipeline = vgfx->createGraphicsPipeline(this, configuration.core, &configuration.noDynamicState);\n\tgraphicsPipelinesNoDynamicState.insert({ configuration, pipeline });\n\t\n\treturn pipeline;\n}\n\n} // vulkan\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/vulkan/Shader.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LÖVE\n#include \"common/Optional.h\"\n#include \"graphics/Shader.h\"\n#include \"graphics/vulkan/ShaderStage.h\"\n#include \"Vulkan.h\"\n\n// Libraries\n#include \"VulkanWrapper.h\"\n#include \"libraries/spirv_cross/spirv_reflect.hpp\"\n#include \"libraries/xxHash/xxhash.h\"\n\n// C++\n#include <map>\n#include <memory>\n#include <unordered_map>\n#include <queue>\n#include <set>\n\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace vulkan\n{\n\nstruct GraphicsPipelineConfigurationCore\n{\n\tVkRenderPass renderPass;\n\tVertexAttributesID attributesID;\n\tbool wireFrame;\n\tuint32 blendStateKey;\n\tColorChannelMask colorChannelMask;\n\tVkSampleCountFlagBits msaaSamples;\n\tuint32_t numColorAttachments;\n\tPrimitiveType primitiveType;\n\tuint64 packedColorAttachmentFormats;\n\n\tGraphicsPipelineConfigurationCore()\n\t{\n\t\tmemset(this, 0, sizeof(GraphicsPipelineConfigurationCore));\n\t}\n\n\tbool operator==(const GraphicsPipelineConfigurationCore &other) const\n\t{\n\t\treturn memcmp(this, &other, sizeof(GraphicsPipelineConfigurationCore)) == 0;\n\t}\n};\n\nstruct GraphicsPipelineConfigurationCoreHasher\n{\n\tsize_t operator() (const GraphicsPipelineConfigurationCore &configuration) const\n\t{\n\t\treturn XXH32(&configuration, sizeof(GraphicsPipelineConfigurationCore), 0);\n\t}\n};\n\nstruct GraphicsPipelineConfigurationNoDynamicState\n{\n\tCullMode cullmode = CULL_NONE;\n\tWinding winding = WINDING_MAX_ENUM;\n\tStencilAction stencilAction = STENCIL_MAX_ENUM;\n\tCompareMode stencilCompare = COMPARE_MAX_ENUM;\n\tDepthState depthState{};\n};\n\nstruct GraphicsPipelineConfigurationFull\n{\n\tGraphicsPipelineConfigurationCore core;\n\tGraphicsPipelineConfigurationNoDynamicState noDynamicState;\n\n\tGraphicsPipelineConfigurationFull()\n\t{\n\t\tmemset(this, 0, sizeof(GraphicsPipelineConfigurationFull));\n\t}\n\n\tbool operator==(const GraphicsPipelineConfigurationFull &other) const\n\t{\n\t\treturn memcmp(this, &other, sizeof(GraphicsPipelineConfigurationFull)) == 0;\n\t}\n};\n\nstruct GraphicsPipelineConfigurationFullHasher\n{\n\tsize_t operator() (const GraphicsPipelineConfigurationFull &configuration) const\n\t{\n\t\treturn XXH32(&configuration, sizeof(GraphicsPipelineConfigurationFull), 0);\n\t}\n};\n\nclass Graphics;\n\nclass SharedDescriptorPools\n{\npublic:\n\n\tSharedDescriptorPools(VkDevice device, int dynamicUniformBuffers, int sampledTextures, int storageTextures, int texelBuffers, int storageBuffers);\n\tvirtual ~SharedDescriptorPools();\n\n\tVkDescriptorSet allocateDescriptorSet(const VkDescriptorSetLayout &descriptorSetLayout);\n\n\tvoid newFrame(uint64 frameIndex);\n\n\tint dynamicUniformBuffers = 0;\n\tint sampledTextures = 0;\n\tint storageTextures = 0;\n\tint texelBuffers = 0;\n\tint storageBuffers = 0;\n\nprivate:\n\n\tvoid createDescriptorPool();\n\n\tstd::vector<VkDescriptorPoolSize> descriptorPoolSizes;\n\tstd::vector<std::vector<VkDescriptorPool>> pools;\n\tOptional<uint64> lastFrameIndex;\n\tsize_t currentFrame = 0;\n\tuint32 currentPool = 0;\n\tVkDevice device = VK_NULL_HANDLE;\n\n};\n\nclass Shader final\n\t: public graphics::Shader\n\t, public Volatile\n{\npublic:\n\n\tstruct AttributeInfo\n\t{\n\t\tint index;\n\t\tDataBaseType baseType;\n\t};\n\n\tstruct TextureInfo\n\t{\n\t\tlove::graphics::Texture *texture;\n\t\tAccess access;\n\t};\n\n\tstruct BufferInfo\n\t{\n\t\tlove::graphics::Buffer *buffer;\n\t\tAccess access;\n\t};\n\n\tShader(StrongRef<love::graphics::ShaderStage> stages[], const CompileOptions &options);\n\tvirtual ~Shader();\n\n\tbool loadVolatile() override;\n\tvoid unloadVolatile() override;\n\n\tVkPipeline getComputePipeline() const;\n\n\tconst std::vector<VkPipelineShaderStageCreateInfo> &getShaderStages() const;\n\n\tconst VkPipelineLayout getGraphicsPipelineLayout() const;\n\n\tvoid newFrame(uint64 graphicsFrameIndex);\n\n\tvoid cmdPushDescriptorSets(VkCommandBuffer, VkPipelineBindPoint);\n\n\tvoid attach() override;\n\n\tptrdiff_t getHandle() const override { return 0; }\n\n\tstd::string getWarnings() const override { return \"\"; }\n\n\tint getVertexAttributeIndex(const std::string &name) override;\n\tconst std::unordered_map<std::string, AttributeInfo> getVertexAttributeIndices() const { return attributes; }\n\n\tconst UniformInfo *getUniformInfo(BuiltinUniform builtin) const override;\n\n\tvoid updateUniform(const UniformInfo *info, int count) override;\n\n\tvoid setMainTex(graphics::Texture *texture);\n\n\tVkPipeline getCachedGraphicsPipeline(Graphics *vgfx, const GraphicsPipelineConfigurationCore &configuration);\n\tVkPipeline getCachedGraphicsPipeline(Graphics *vgfx, const GraphicsPipelineConfigurationFull &configuration);\n\n\tconst std::vector<TextureInfo> &getActiveTextureInfo() const { return allTextureInfo; }\n\tconst std::vector<BufferInfo> &getActiveStorageBufferInfo() const { return storageBufferInfo; }\n\nprivate:\n\tvoid compileShaders();\n\tvoid createDescriptorSetLayout();\n\tvoid createPipelineLayout();\n\tvoid acquireDescriptorPools();\n\tvoid buildLocalUniforms(spirv_cross::Compiler &comp, const spirv_cross::SPIRType &type, size_t baseoff, const std::string &basename);\n\n\tvoid setTextureDescriptor(const UniformInfo *info, love::graphics::Texture *texture, int index);\n\tvoid setBufferDescriptor(const UniformInfo *info, love::graphics::Buffer *buffer, int index);\n\n\tvoid applyTexture(const UniformInfo *info, int i, love::graphics::Texture *texture, UniformType basetype, bool isdefault) override;\n\tvoid applyBuffer(const UniformInfo *info, int i, love::graphics::Buffer *buffer, UniformType basetype, bool isdefault) override;\n\n\tVkPipeline computePipeline = VK_NULL_HANDLE;\n\n\tVkDescriptorSetLayout descriptorSetLayout = VK_NULL_HANDLE;\n\tVkPipelineLayout pipelineLayout = VK_NULL_HANDLE;\n\n\tstd::vector<VkDescriptorBufferInfo> descriptorBuffers;\n\tstd::vector<VkDescriptorImageInfo> descriptorImages;\n\tstd::vector<VkBufferView> descriptorBufferViews;\n\tstd::vector<VkWriteDescriptorSet> descriptorWrites;\n\n\tstd::vector<VkPipelineShaderStageCreateInfo> shaderStages;\n\tstd::vector<VkShaderModule> shaderModules;\n\n\tstd::vector<TextureInfo> allTextureInfo;\n\tstd::vector<BufferInfo> storageBufferInfo;\n\n\tGraphics *vgfx = nullptr;\n\tVkDevice device = VK_NULL_HANDLE;\n\n\tSharedDescriptorPools *descriptorPools = nullptr;\n\n\tbool isCompute = false;\n\tbool resourceDescriptorsDirty = false;\n\tVkDescriptorSet currentDescriptorSet = VK_NULL_HANDLE;\n\n\tUniformInfo *builtinUniformInfo[BUILTIN_MAX_ENUM];\n\n\tstd::unique_ptr<StreamBuffer> uniformBufferObjectBuffer;\n\tstd::vector<uint8> localUniformData;\n\tstd::vector<uint8> localUniformStagingData;\n\tuint32_t localUniformLocation = 0;\n\tOptionalInt builtinUniformDataOffset;\n\n\tstd::unordered_map<std::string, AttributeInfo> attributes;\n\n\tstd::unordered_map<GraphicsPipelineConfigurationCore, VkPipeline, GraphicsPipelineConfigurationCoreHasher> graphicsPipelinesDynamicState;\n\tstd::unordered_map<GraphicsPipelineConfigurationFull, VkPipeline, GraphicsPipelineConfigurationFullHasher> graphicsPipelinesNoDynamicState;\n};\n\n}\n}\n}\n"
  },
  {
    "path": "src/modules/graphics/vulkan/ShaderStage.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"ShaderStage.h\"\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace vulkan\n{\n\nShaderStage::ShaderStage(love::graphics::Graphics *gfx, ShaderStageType stage, const std::string &glsl, bool gles, const std::string &cachekey)\n\t: love::graphics::ShaderStage(gfx, stage, glsl, gles, cachekey)\n{\n\t// the compilation is done in Shader.\n}\n\nptrdiff_t ShaderStage::getHandle() const\n{\n\treturn 0;\n}\n\n} // love\n} // graphics\n} // vulkan\n"
  },
  {
    "path": "src/modules/graphics/vulkan/ShaderStage.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"graphics/ShaderStage.h\"\n#include \"modules/graphics/Graphics.h\"\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace vulkan\n{\n\nclass ShaderStage final : public graphics::ShaderStage\n{\npublic:\n\tShaderStage(love::graphics::Graphics *gfx, ShaderStageType stage, const std::string &glsl, bool gles, const std::string &cachekey);\n\n\tptrdiff_t getHandle() const override;\n};\n\n}\n}\n}\n"
  },
  {
    "path": "src/modules/graphics/vulkan/StreamBuffer.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"StreamBuffer.h\"\n#include \"Graphics.h\"\n\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace vulkan\n{\n\nstatic VkBufferUsageFlags getUsageFlags(BufferUsage mode)\n{\n\tswitch (mode)\n\t{\n\tcase BUFFERUSAGE_VERTEX: return VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;\n\tcase BUFFERUSAGE_INDEX: return VK_BUFFER_USAGE_INDEX_BUFFER_BIT;\n\tcase BUFFERUSAGE_UNIFORM: return VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;\n\tdefault:\n\t\tthrow love::Exception(\"Unsupported BufferUsage mode: %d\", mode);\n\t}\n}\n\nStreamBuffer::StreamBuffer(graphics::Graphics *gfx, BufferUsage mode, size_t size)\n\t: love::graphics::StreamBuffer(mode, size)\n\t, vgfx(dynamic_cast<Graphics*>(gfx))\n{\n\tloadVolatile();\n}\n\nbool StreamBuffer::loadVolatile()\n{\n\tallocator = vgfx->getVmaAllocator();\n\n\tVkBufferCreateInfo bufferInfo{};\n\tbufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;\n\tbufferInfo.size = getSize() * MAX_FRAMES_IN_FLIGHT; // TODO: Is this sufficient or should it be +1?\n\tbufferInfo.usage = getUsageFlags(mode);\n\tbufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;\n\n\tVmaAllocationCreateInfo allocCreateInfo = {};\n\tallocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;\n\tallocCreateInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT;\n\n\tVkResult result = vmaCreateBuffer(allocator, &bufferInfo, &allocCreateInfo, &buffer, &allocation, &allocInfo);\n\tif (result != VK_SUCCESS)\n\t\tthrow love::Exception(\"Cannot create stream buffer: %s\", Vulkan::getErrorString(result));\n\n\tVkMemoryPropertyFlags properties;\n\tvmaGetAllocationMemoryProperties(allocator, allocation, &properties);\n\tif (properties & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)\n\t\tcoherent = true;\n\telse\n\t\tcoherent = false;\n\n\treturn true;\n}\n\nvoid StreamBuffer::unloadVolatile()\n{\n\tif (buffer == VK_NULL_HANDLE)\n\t\treturn;\n\n\tvgfx->queueCleanUp([allocator=allocator, buffer=buffer, allocation=allocation](){\n\t\tvmaDestroyBuffer(allocator, buffer, allocation);\n\t});\n\tbuffer = VK_NULL_HANDLE;\n}\n\nStreamBuffer::~StreamBuffer()\n{\n\tunloadVolatile();\n}\n\nptrdiff_t StreamBuffer::getHandle() const\n{\n\treturn (ptrdiff_t) buffer;\n}\n\nsize_t StreamBuffer::getGPUReadOffset() const\n{\n\treturn (frameIndex * bufferSize) + frameGPUReadOffset;\n}\n\nlove::graphics::StreamBuffer::MapInfo StreamBuffer::map(size_t /*minsize*/)\n{\n\t// TODO: do we also need to wait until a fence is complete, here?\n\n\tMapInfo info;\n\tinfo.size = bufferSize - frameGPUReadOffset;\n\tinfo.data = (uint8*)allocInfo.pMappedData + (frameIndex * bufferSize) + frameGPUReadOffset;\n\treturn info;\n}\n\nsize_t StreamBuffer::unmap(size_t usedSize)\n{\n\tsize_t offset = (frameIndex * bufferSize) + frameGPUReadOffset;\n\n\tif (!coherent)\n\t\tvmaFlushAllocation(allocator, allocation, offset, usedSize);\n\n\treturn offset;\n}\n\nvoid StreamBuffer::markUsed(size_t usedSize)\n{\n\tframeGPUReadOffset += usedSize;\n}\n\nvoid StreamBuffer::nextFrame()\n{\n\tframeIndex = (frameIndex + 1) % MAX_FRAMES_IN_FLIGHT;\n\tframeGPUReadOffset = 0;\n}\n\n} // vulkan\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/vulkan/StreamBuffer.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"graphics/Volatile.h\"\n#include \"graphics/StreamBuffer.h\"\n#include \"graphics/Graphics.h\"\n\n#include \"VulkanWrapper.h\"\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace vulkan\n{\n\nclass Graphics;\n\nclass StreamBuffer final\n\t: public love::graphics::StreamBuffer\n\t, public graphics::Volatile\n{\npublic:\n\tStreamBuffer(graphics::Graphics *gfx, BufferUsage mode, size_t size);\n\tvirtual ~StreamBuffer();\n\n\tvirtual bool loadVolatile() override;\n\n\tvirtual void unloadVolatile() override;\n\n\tsize_t getGPUReadOffset() const override;\n\tMapInfo map(size_t minsize) override;\n\tsize_t unmap(size_t usedSize) override;\n\tvoid markUsed(size_t usedSize) override;\n\n\tvoid nextFrame() override;\n\n\tptrdiff_t getHandle() const override;\n\nprivate:\n\tGraphics *vgfx = nullptr;\n\tVmaAllocator allocator;\n\tVmaAllocation allocation;\n\tVmaAllocationInfo allocInfo;\n\tVkBuffer buffer = VK_NULL_HANDLE;\n\tint frameIndex = 0;\n\tbool coherent;\n\n};\n\n} // vulkan\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/vulkan/Texture.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Texture.h\"\n#include \"Graphics.h\"\n#include \"Vulkan.h\"\n#include \"Buffer.h\"\n\n#include <limits>\n#include <array>\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace vulkan\n{\n\nTexture::Texture(love::graphics::Graphics *gfx, const Settings &settings, const Slices *data)\n\t: love::graphics::Texture(gfx, settings, data)\n\t, vgfx(dynamic_cast<Graphics*>(gfx))\n\t, slices(settings.type)\n\t, imageAspect(0)\n{\n\tif (data)\n\t\tslices = *data;\n\n\tloadVolatile();\n\n\t// ImageData is referenced by the first loadVolatile call, but we don't\n\t// hang on to it after that so we can save memory.\n\tslices.clear();\n}\n\nTexture::Texture(love::graphics::Graphics *gfx, love::graphics::Texture *base, const Texture::ViewSettings &viewsettings)\n\t: love::graphics::Texture(gfx, base, viewsettings)\n\t, vgfx(dynamic_cast<Graphics*>(gfx))\n\t, slices(viewsettings.type.get(base->getTextureType()))\n\t, imageAspect(0)\n{\n\tloadVolatile();\n}\n\nbool Texture::loadVolatile()\n{\n\tallocator = vgfx->getVmaAllocator();\n\tdevice = vgfx->getDevice();\n\n\tbool root = rootView.texture == this;\n\n\tif (isPixelFormatDepth(format))\n\t\timageAspect |= VK_IMAGE_ASPECT_DEPTH_BIT;\n\tif (isPixelFormatStencil(format))\n\t\timageAspect |= VK_IMAGE_ASPECT_STENCIL_BIT;\n\tif (isPixelFormatColor(format))\n\t\timageAspect |= VK_IMAGE_ASPECT_COLOR_BIT;\n\n\tauto vulkanFormat = Vulkan::getTextureFormat(format);\n\n\tVkImageUsageFlags usageFlags =\n\t\tVK_IMAGE_USAGE_TRANSFER_SRC_BIT |\n\t\tVK_IMAGE_USAGE_TRANSFER_DST_BIT;\n\n\tif (readable)\n\t\tusageFlags |= VK_IMAGE_USAGE_SAMPLED_BIT;\n\n\tif (computeWrite)\n\t\tusageFlags |= VK_IMAGE_USAGE_STORAGE_BIT;\n\n\tif (renderTarget)\n\t{\n\t\tif (isPixelFormatDepthStencil(format))\n\t\t\tusageFlags |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;\n\t\telse\n\t\t\tusageFlags |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;\n\t}\n\n\tlayerCount = 1;\n\n\tif (texType == TEXTURE_2D_ARRAY)\n\t\tlayerCount = getLayerCount();\n\telse if (texType == TEXTURE_CUBE)\n\t\tlayerCount = 6;\n\n\tif (root)\n\t{\n\t\tVkImageCreateFlags createFlags = 0;\n\t\tstd::vector<VkFormat> vkviewformats;\n\n\t\tfor (PixelFormat viewformat : viewFormats)\n\t\t{\n\t\t\tif (viewformat != format)\n\t\t\t{\n\t\t\t\tcreateFlags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;\n\t\t\t\tTextureFormat f = Vulkan::getTextureFormat(viewformat);\n\t\t\t\tvkviewformats.push_back(f.internalFormat);\n\t\t\t}\n\t\t}\n\n\t\tif (texType == TEXTURE_CUBE || (texType == TEXTURE_2D_ARRAY && layerCount >= 6 && pixelWidth == pixelHeight))\n\t\t\tcreateFlags |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;\n\n\t\tmsaaSamples = vgfx->getMsaaCount(requestedMSAA);\n\n\t\tVkImageCreateInfo imageInfo{};\n\t\timageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;\n\t\timageInfo.flags = createFlags;\n\t\timageInfo.imageType = Vulkan::getImageType(getTextureType());\n\t\timageInfo.extent.width = static_cast<uint32_t>(pixelWidth);\n\t\timageInfo.extent.height = static_cast<uint32_t>(pixelHeight);\n\t\timageInfo.extent.depth = static_cast<uint32_t>(depth);\n\t\timageInfo.arrayLayers = static_cast<uint32_t>(layerCount);\n\t\timageInfo.mipLevels = static_cast<uint32_t>(mipmapCount);\n\t\timageInfo.format = vulkanFormat.internalFormat;\n\t\timageInfo.tiling = VK_IMAGE_TILING_OPTIMAL;\n\t\timageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;\n\t\timageInfo.usage = usageFlags;\n\t\timageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;\n\t\timageInfo.samples = VK_SAMPLE_COUNT_1_BIT;\n\n\t\tVkImageFormatListCreateInfo viewFormatsInfo{};\n\t\tviewFormatsInfo.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO;\n\n\t\tif (!vkviewformats.empty() && vgfx->getDeviceApiVersion() >= VK_API_VERSION_1_2)\n\t\t{\n\t\t\tviewFormatsInfo.viewFormatCount = (uint32)vkviewformats.size();\n\t\t\tviewFormatsInfo.pViewFormats = vkviewformats.data();\n\n\t\t\timageInfo.pNext = &viewFormatsInfo;\n\t\t}\n\n\t\tVmaAllocationCreateInfo imageAllocationCreateInfo{};\n\n\t\t// Dedicated allocations are recommended for fullscreen RTs.\n\t\tif (renderTarget && pixelWidth >= vgfx->getPixelWidth() && pixelHeight >= vgfx->getPixelHeight())\n\t\t\timageAllocationCreateInfo.flags |= VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT;\n\n\t\timageAllocationCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;\n\n\t\tif ((msaaSamples & VK_SAMPLE_COUNT_1_BIT) != 0 || readable)\n\t\t{\n\t\t\tVkResult result = vmaCreateImage(allocator, &imageInfo, &imageAllocationCreateInfo, &imageData.image, &imageData.allocation, nullptr);\n\t\t\tif (result != VK_SUCCESS)\n\t\t\t\tthrow love::Exception(\"Failed to create Vulkan image: %s\", Vulkan::getErrorString(result));\n\t\t}\n\n\t\tif ((msaaSamples & VK_SAMPLE_COUNT_1_BIT) == 0)\n\t\t{\n\t\t\timageInfo.samples = msaaSamples;\n\t\t\tVkResult result = vmaCreateImage(allocator, &imageInfo, &imageAllocationCreateInfo, &msaaImageData.image, &msaaImageData.allocation, nullptr);\n\t\t\tif (result != VK_SUCCESS)\n\t\t\t\tthrow love::Exception(\"Failed to create Vulkan MSAA image: %s\", Vulkan::getErrorString(result));\n\t\t}\n\n\t\tauto commandBuffer = vgfx->getCommandBufferForDataTransfer();\n\n\t\tif (computeWrite)\n\t\t\timageData.layout = VK_IMAGE_LAYOUT_GENERAL;\n\t\telse if (readable)\n\t\t\timageData.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n\t\telse if (renderTarget && isPixelFormatDepthStencil(format))\n\t\t\timageData.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;\n\t\telse if (renderTarget)\n\t\t\timageData.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;\n\t\telse // TODO: is there a better layout for this situation?\n\t\t\timageData.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;\n\n\t\tif (imageData.image != VK_NULL_HANDLE)\n\t\t{\n\t\t\tVulkan::cmdTransitionImageLayout(commandBuffer, imageData.image, format, renderTarget,\n\t\t\t\tVK_IMAGE_LAYOUT_UNDEFINED, imageData.layout,\n\t\t\t\t0, VK_REMAINING_MIP_LEVELS,\n\t\t\t\t0, VK_REMAINING_ARRAY_LAYERS);\n\t\t}\n\n\t\tif (msaaImageData.image != VK_NULL_HANDLE)\n\t\t{\n\t\t\tif (renderTarget && isPixelFormatDepthStencil(format))\n\t\t\t\tmsaaImageData.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;\n\t\t\telse if (renderTarget)\n\t\t\t\tmsaaImageData.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;\n\t\t\telse // TODO: is there a better layout for this situation?\n\t\t\t\tmsaaImageData.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;\n\n\t\t\tVulkan::cmdTransitionImageLayout(commandBuffer, msaaImageData.image, format, renderTarget,\n\t\t\t\tVK_IMAGE_LAYOUT_UNDEFINED, msaaImageData.layout,\n\t\t\t\t0, VK_REMAINING_MIP_LEVELS,\n\t\t\t\t0, VK_REMAINING_ARRAY_LAYERS);\n\t\t}\n\n\t\tbool hasdata = slices.get(0, 0) != nullptr;\n\n\t\tif (hasdata)\n\t\t{\n\t\t\tfor (int mip = 0; mip < getMipmapCount(); mip++)\n\t\t\t{\n\t\t\t\tint sliceCount;\n\t\t\t\tif (texType == TEXTURE_CUBE)\n\t\t\t\t\tsliceCount = 6;\n\t\t\t\telse\n\t\t\t\t\tsliceCount = slices.getSliceCount();\n\n\t\t\t\tfor (int slice = 0; slice < sliceCount; slice++)\n\t\t\t\t{\n\t\t\t\t\tauto id = slices.get(slice, mip);\n\t\t\t\t\tif (id != nullptr)\n\t\t\t\t\t\tuploadImageData(id, mip, slice, 0, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (imageData.image != VK_NULL_HANDLE)\n\t\t\t\tclear(imageData);\n\t\t\tif (msaaImageData.image != VK_NULL_HANDLE)\n\t\t\t\tclear(msaaImageData);\n\t\t}\n\t}\n\telse\n\t{\n\t\tTexture *roottex = (Texture *) rootView.texture;\n\t\timageData = roottex->imageData;\n\t\tmsaaImageData = roottex->msaaImageData;\n\t\timageData.allocation = VK_NULL_HANDLE;\n\t\tmsaaImageData.allocation = VK_NULL_HANDLE;\n\t\tmsaaSamples = roottex->msaaSamples;\n\t}\n\n\tcreateTextureImageView();\n\tsetSamplerState(samplerState);\n\n\tif (root && !isPixelFormatDepthStencil(format) && slices.getMipmapCount() <= 1 && getMipmapsMode() != MIPMAPS_NONE)\n\t\tgenerateMipmaps();\n\n\tif (renderTarget)\n\t{\n\t\tcreateRenderTargetImageViews(imageData);\n\t\tcreateRenderTargetImageViews(msaaImageData);\n\t}\n\n\tif (!debugName.empty())\n\t{\n\t\tif (vgfx->getEnabledOptionalInstanceExtensions().debugInfo)\n\t\t{\n\t\t\tVkDebugUtilsObjectNameInfoEXT nameInfo{};\n\t\t\tnameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT;\n\t\t\tif (root)\n\t\t\t{\n\t\t\t\tnameInfo.objectType = VK_OBJECT_TYPE_IMAGE;\n\t\t\t\tnameInfo.objectHandle = (uint64_t)imageData.image;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tnameInfo.objectType = VK_OBJECT_TYPE_IMAGE_VIEW;\n\t\t\t\tnameInfo.objectHandle = (uint64_t)imageData.imageView;\n\t\t\t}\n\t\t\tnameInfo.pObjectName = debugName.c_str();\n\t\t\tvkSetDebugUtilsObjectNameEXT(device, &nameInfo);\n\n\t\t\tif (msaaImageData.image != VK_NULL_HANDLE && root)\n\t\t\t{\n\t\t\t\tnameInfo.objectType = VK_OBJECT_TYPE_IMAGE;\n\t\t\t\tnameInfo.objectHandle = (uint64_t)msaaImageData.image;\n\n\t\t\t\tstd::string msaaName = debugName + \" (MSAA buffer)\";\n\t\t\t\tnameInfo.pObjectName = msaaName.c_str();\n\t\t\t\tvkSetDebugUtilsObjectNameEXT(device, &nameInfo);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (root)\n\t\tupdateGraphicsMemorySize(true);\n\n\treturn true;\n}\n\nvoid Texture::unloadVolatile()\n{\n\tstd::array<VulkanImageData *, 2> datas = {&imageData, &msaaImageData};\n\n\tfor (const VulkanImageData *data : datas)\n\t{\n\t\tif (data->image == VK_NULL_HANDLE)\n\t\t\tcontinue;\n\n\t\tvgfx->queueCleanUp([\n\t\t\tdevice = device,\n\t\t\tallocator = allocator,\n\t\t\timageData = *data,\n\t\t\tvgfx = vgfx,\n\t\t\trenderTarget = renderTarget,\n\t\t\tformat = format] () {\n\t\t\tif (imageData.imageView != VK_NULL_HANDLE)\n\t\t\t{\n\t\t\t\tif (renderTarget)\n\t\t\t\t\tvgfx->cleanupFramebuffers(imageData.imageView, format);\n\t\t\t\tvkDestroyImageView(device, imageData.imageView, nullptr);\n\t\t\t}\n\t\t\tif (imageData.allocation != VK_NULL_HANDLE)\n\t\t\t\tvmaDestroyImage(allocator, imageData.image, imageData.allocation);\n\t\t\tfor (const auto &views : imageData.renderTargetImageViews)\n\t\t\t\tfor (const auto &view : views)\n\t\t\t\t\tvkDestroyImageView(device, view, nullptr);\n\t\t});\n\t}\n\n\timageData = {};\n\tmsaaImageData = {};\n\n\tupdateGraphicsMemorySize(false);\n}\n\nTexture::~Texture()\n{\n\tunloadVolatile();\n}\n\nptrdiff_t Texture::getRenderTargetHandle() const\n{\n\treturn (ptrdiff_t)imageData.image;\n}\n\nptrdiff_t Texture::getSamplerHandle() const\n{\n\treturn (ptrdiff_t)textureSampler;\n}\n\nVkImageView Texture::getRenderTargetView(int mip, int layer)\n{\n\tif (imageData.renderTargetImageViews.empty())\n\t\treturn imageData.imageView;\n\treturn imageData.renderTargetImageViews.at(mip).at(layer);\n}\n\nVkImageView Texture::getMSAARenderTargetView(int mip, int layer)\n{\n\tif (msaaImageData.renderTargetImageViews.empty())\n\t\treturn msaaImageData.imageView;\n\treturn msaaImageData.renderTargetImageViews.at(mip).at(layer);\n}\n\nVkSampleCountFlagBits Texture::getMsaaSamples() const\n{\n\treturn msaaSamples;\n}\n\nint Texture::getMSAA() const\n{\n\treturn static_cast<int>(msaaSamples);\n}\n\nptrdiff_t Texture::getHandle() const\n{\n\treturn (ptrdiff_t)imageData.imageView;\n}\n\nvoid Texture::setSamplerState(const SamplerState &s)\n{\n\tsamplerState = validateSamplerState(s);\n\ttextureSampler = vgfx->getCachedSampler(samplerState);\n}\n\nVkImageLayout Texture::getImageLayout() const\n{\n\treturn imageData.layout;\n}\n\nVkImageLayout Texture::getMSAAImageLayout() const\n{\n\treturn msaaImageData.layout;\n}\n\nvoid Texture::createTextureImageView()\n{\n\tauto vulkanFormat = Vulkan::getTextureFormat(format);\n\tVkImageViewCreateInfo viewInfo{};\n\tviewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;\n\tviewInfo.image = imageData.image;\n\tviewInfo.viewType = Vulkan::getImageViewType(getTextureType());\n\tviewInfo.format = vulkanFormat.internalFormat;\n\tviewInfo.subresourceRange.aspectMask = imageAspect;\n\t// This view is used in descriptor sets, where having both depth and\n\t// stencil aspects in the same view isn't allowed.\n\tif (imageAspect & VK_IMAGE_ASPECT_DEPTH_BIT)\n\t\tviewInfo.subresourceRange.aspectMask &= ~VK_IMAGE_ASPECT_STENCIL_BIT;\n\tviewInfo.subresourceRange.baseMipLevel = rootView.startMipmap;\n\tviewInfo.subresourceRange.levelCount = getMipmapCount();\n\tviewInfo.subresourceRange.baseArrayLayer = rootView.startLayer;\n\tviewInfo.subresourceRange.layerCount = layerCount;\n\tviewInfo.components.r = vulkanFormat.swizzleR;\n\tviewInfo.components.g = vulkanFormat.swizzleG;\n\tviewInfo.components.b = vulkanFormat.swizzleB;\n\tviewInfo.components.a = vulkanFormat.swizzleA;\n\n\timageData.imageView = VK_NULL_HANDLE;\n\tif (imageData.image != VK_NULL_HANDLE && readable)\n\t{\n\t\tVkResult result = vkCreateImageView(device, &viewInfo, nullptr, &imageData.imageView);\n\t\tif (result != VK_SUCCESS)\n\t\t\tthrow love::Exception(\"Could not create Vulkan texture image view: %s\", Vulkan::getErrorString(result));\n\t}\n}\n\nvoid Texture::createRenderTargetImageViews(VulkanImageData &data)\n{\n\tif (data.image == VK_NULL_HANDLE || (getMipmapCount() == 1 && layerCount == 1 && data.imageView != VK_NULL_HANDLE))\n\t{\n\t\t// Reuse the main image view in this situation, if it exists.\n\t\tdata.renderTargetImageViews.clear();\n\t\treturn;\n\t}\n\n\tauto vulkanFormat = Vulkan::getTextureFormat(format);\n\n\tdata.renderTargetImageViews.resize(getMipmapCount());\n\tfor (int mip = 0; mip < getMipmapCount(); mip++)\n\t{\n\t\tdata.renderTargetImageViews.at(mip).resize(layerCount);\n\n\t\tfor (int slice = 0; slice < layerCount; slice++)\n\t\t{\n\t\t\tVkImageViewCreateInfo viewInfo{};\n\t\t\tviewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;\n\t\t\tviewInfo.image = data.image;\n\t\t\tviewInfo.viewType = Vulkan::getImageViewType(getTextureType());\n\t\t\tif (viewInfo.viewType == VK_IMAGE_VIEW_TYPE_CUBE)\n\t\t\t\tviewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;\n\t\t\tviewInfo.format = vulkanFormat.internalFormat;\n\t\t\tviewInfo.subresourceRange.aspectMask = imageAspect;\n\t\t\tviewInfo.subresourceRange.baseMipLevel = mip + rootView.startMipmap;\n\t\t\tviewInfo.subresourceRange.levelCount = 1;\n\t\t\tviewInfo.subresourceRange.baseArrayLayer = slice + rootView.startLayer;\n\t\t\tviewInfo.subresourceRange.layerCount = 1;\n\t\t\tviewInfo.components.r = vulkanFormat.swizzleR;\n\t\t\tviewInfo.components.g = vulkanFormat.swizzleG;\n\t\t\tviewInfo.components.b = vulkanFormat.swizzleB;\n\t\t\tviewInfo.components.a = vulkanFormat.swizzleA;\n\n\t\t\tVkResult result = vkCreateImageView(device, &viewInfo, nullptr, &data.renderTargetImageViews.at(mip).at(slice));\n\t\t\tif (result != VK_SUCCESS)\n\t\t\t\tthrow love::Exception(\"Could not create Vulkan render target image view: %s\", Vulkan::getErrorString(result));\n\t\t}\n\t}\n}\n\nvoid Texture::clear(const VulkanImageData &data)\n{\n\tauto commandBuffer = vgfx->getCommandBufferForDataTransfer();\n\n\tVkImageSubresourceRange range{};\n\trange.aspectMask = imageAspect;\n\trange.baseMipLevel = 0;\n\trange.levelCount = VK_REMAINING_MIP_LEVELS;\n\trange.baseArrayLayer = 0;\n\trange.layerCount = VK_REMAINING_ARRAY_LAYERS;\n\n\tVkImageLayout clearLayout = data.layout == VK_IMAGE_LAYOUT_GENERAL ? data.layout : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;\n\n\tVulkan::cmdTransitionImageLayout(commandBuffer, data.image, format, renderTarget,\n\t\tdata.layout, clearLayout,\n\t\t0, VK_REMAINING_MIP_LEVELS, 0, VK_REMAINING_ARRAY_LAYERS);\n\n\tif (isPixelFormatDepthStencil(format))\n\t{\n\t\tVkClearDepthStencilValue depthStencilColor{};\n\t\tdepthStencilColor.depth = 0.0f;\n\t\tdepthStencilColor.stencil = 0;\n\t\tvkCmdClearDepthStencilImage(commandBuffer, data.image, clearLayout, &depthStencilColor, 1, &range);\n\t}\n\telse\n\t{\n\t\tauto clearColor = getClearColor(this, ColorD(0, 0, 0, 0));\n\t\tvkCmdClearColorImage(commandBuffer, data.image, clearLayout, &clearColor, 1, &range);\n\t}\n\n\tVulkan::cmdTransitionImageLayout(commandBuffer, data.image, format, renderTarget,\n\t\tclearLayout, data.layout,\n\t\t0, VK_REMAINING_MIP_LEVELS, 0, VK_REMAINING_ARRAY_LAYERS);\n}\n\nVkClearColorValue Texture::getClearColor(love::graphics::Texture *texture, const ColorD &color)\n{\n\tPixelFormatType formattype = PIXELFORMATTYPE_SFLOAT;\n\tif (texture != nullptr)\n\t\tformattype = getPixelFormatInfo(texture->getPixelFormat()).dataType;\n\n\tVkClearColorValue c{};\n\n\tswitch (formattype)\n\t{\n\tcase PIXELFORMATTYPE_SINT:\n\t\tc.int32[0] = (int32)color.r;\n\t\tc.int32[1] = (int32)color.g;\n\t\tc.int32[2] = (int32)color.b;\n\t\tc.int32[3] = (int32)color.a;\n\t\tbreak;\n\tcase PIXELFORMATTYPE_UINT:\n\t\tc.uint32[0] = (uint32)color.r;\n\t\tc.uint32[1] = (uint32)color.g;\n\t\tc.uint32[2] = (uint32)color.b;\n\t\tc.uint32[3] = (uint32)color.a;\n\t\tbreak;\n\tdefault:\n\t\t{\n\t\t\tColorf cf((float)color.r, (float)color.g, (float)color.b, (float)color.a);\n\t\t\tgammaCorrectColor(cf);\n\t\t\tc.float32[0] = cf.r;\n\t\t\tc.float32[1] = cf.g;\n\t\t\tc.float32[2] = cf.b;\n\t\t\tc.float32[3] = cf.a;\n\t\t}\n\t\tbreak;\n\t}\n\n\treturn c;\n}\n\nvoid Texture::generateMipmapsInternal()\n{\n\tauto commandBuffer = vgfx->getCommandBufferForDataTransfer();\n\n\tauto dstPipelineStages = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT\n\t\t| VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT;\n\n\tVulkan::cmdTransitionImageLayout(commandBuffer, imageData.image, format, renderTarget,\n\t\timageData.layout, imageData.layout == VK_IMAGE_LAYOUT_GENERAL ? imageData.layout : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,\n\t\trootView.startMipmap, static_cast<uint32_t>(getMipmapCount()),\n\t\trootView.startLayer, static_cast<uint32_t>(layerCount));\n\n\tVkImageMemoryBarrier barrier{};\n\tbarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;\n\tbarrier.image = imageData.image;\n\tbarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n\tbarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n\tbarrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;\n\tbarrier.subresourceRange.baseArrayLayer = rootView.startLayer;\n\tbarrier.subresourceRange.layerCount = static_cast<uint32_t>(layerCount);\n\tbarrier.subresourceRange.baseMipLevel = rootView.startMipmap;\n\tbarrier.subresourceRange.levelCount = 1u;\n\n\tuint32_t mipLevels = static_cast<uint32_t>(getMipmapCount());\n\n\tfor (uint32_t i = 1; i < mipLevels; i++)\n\t{\n\t\tbarrier.subresourceRange.baseMipLevel = rootView.startMipmap + i - 1;\n\t\tbarrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;\n\t\tbarrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;\n\t\tbarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;\n\t\tbarrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;\n\n\t\tif (imageData.layout != VK_IMAGE_LAYOUT_GENERAL)\n\t\t{\n\t\t\tvkCmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0,\n\t\t\t\t0, nullptr,\n\t\t\t\t0, nullptr,\n\t\t\t\t1, &barrier);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tVkMemoryBarrier memoryBarrier{};\n\t\t\tmemoryBarrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;\n\t\t\tmemoryBarrier.srcAccessMask = barrier.srcAccessMask;\n\t\t\tmemoryBarrier.dstAccessMask = barrier.dstAccessMask;\n\t\t\tvkCmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0,\n\t\t\t\t1, &memoryBarrier,\n\t\t\t\t0, nullptr,\n\t\t\t\t0, nullptr);\n\t\t}\n\n\t\tVkImageBlit blit{};\n\t\tblit.srcOffsets[0] = { 0, 0, 0 };\n\t\tblit.srcOffsets[1] = { getPixelWidth(i - 1), getPixelHeight(i - 1), getDepth(i - 1) };\n\t\tblit.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;\n\t\tblit.srcSubresource.mipLevel = rootView.startMipmap + i - 1;\n\t\tblit.srcSubresource.baseArrayLayer = rootView.startLayer;\n\t\tblit.srcSubresource.layerCount = static_cast<uint32_t>(layerCount);\n\n\t\tblit.dstOffsets[0] = { 0, 0, 0 };\n\t\tblit.dstOffsets[1] = { getPixelWidth(i), getPixelHeight(i), getDepth(i) };\n\t\tblit.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;\n\t\tblit.dstSubresource.mipLevel = rootView.startMipmap + i;\n\t\tblit.dstSubresource.baseArrayLayer = rootView.startLayer;\n\t\tblit.dstSubresource.layerCount = static_cast<uint32_t>(layerCount);\n\n\t\tif (imageData.layout != VK_IMAGE_LAYOUT_GENERAL)\n\t\t{\n\t\t\tvkCmdBlitImage(commandBuffer,\n\t\t\t\timageData.image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,\n\t\t\t\timageData.image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,\n\t\t\t\t1, &blit,\n\t\t\t\tVK_FILTER_LINEAR);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvkCmdBlitImage(commandBuffer,\n\t\t\t\timageData.image, VK_IMAGE_LAYOUT_GENERAL,\n\t\t\t\timageData.image, VK_IMAGE_LAYOUT_GENERAL,\n\t\t\t\t1, &blit,\n\t\t\t\tVK_FILTER_LINEAR);\n\t\t}\n\n\t\t// This sucks, but we want the whole texture to be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL because we\n\t\t// transition the whole thing back to the original layout after the loop.\n\t\tif (i == mipLevels - 1 && imageData.layout != VK_IMAGE_LAYOUT_GENERAL)\n\t\t{\n\t\t\tbarrier.subresourceRange.baseMipLevel = rootView.startMipmap + i;\n\t\t\tbarrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;\n\t\t\tbarrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;\n\t\t\tbarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;\n\t\t\tbarrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;\n\n\t\t\tvkCmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0,\n\t\t\t\t0, nullptr,\n\t\t\t\t0, nullptr,\n\t\t\t\t1, &barrier);\n\t\t}\n\t}\n\n\tVulkan::cmdTransitionImageLayout(commandBuffer, imageData.image, format, renderTarget,\n\t\timageData.layout == VK_IMAGE_LAYOUT_GENERAL ? imageData.layout : VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, imageData.layout,\n\t\trootView.startMipmap, static_cast<uint32_t>(getMipmapCount()),\n\t\trootView.startLayer, static_cast<uint32_t>(layerCount));\n}\n\nvoid Texture::uploadByteData(const void *data, size_t size, int level, int slice, const Rect &r)\n{\n\tVkBuffer stagingBuffer;\n\tVmaAllocation vmaAllocation;\n\n\tVkBufferCreateInfo bufferCreateInfo{};\n\tbufferCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;\n\tbufferCreateInfo.size = size;\n\tbufferCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;\n\n\tVmaAllocationCreateInfo allocCreateInfo = {};\n\tallocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;\n\tallocCreateInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT;\n\n\tVmaAllocationInfo allocInfo;\n\tVkResult result = vmaCreateBuffer(allocator, &bufferCreateInfo, &allocCreateInfo, &stagingBuffer, &vmaAllocation, &allocInfo);\n\tif (result != VK_SUCCESS)\n\t\tthrow love::Exception(\"Failed to create Vulkan staging buffer for texture data upload: %s\", Vulkan::getErrorString(result));\n\n\tmemcpy(allocInfo.pMappedData, data, size);\n\n\tVkBufferImageCopy region{};\n\tregion.bufferOffset = 0;\n\tregion.bufferRowLength = 0;\n\tregion.bufferImageHeight = 0;\n\n\tuint32_t baseLayer = rootView.startLayer;\n\tif (getTextureType() != TEXTURE_VOLUME)\n\t\tbaseLayer += slice;\n\n\tlevel += rootView.startMipmap;\n\n\tregion.imageSubresource.aspectMask = imageAspect;\n\tregion.imageSubresource.mipLevel = level;\n\tregion.imageSubresource.baseArrayLayer = baseLayer;\n\tregion.imageSubresource.layerCount = 1;\n\n\tregion.imageOffset = { r.x, r.y, 0 };\n\tregion.imageExtent = {\n\t\tstatic_cast<uint32_t>(r.w),\n\t\tstatic_cast<uint32_t>(r.h), 1\n\t};\n\n\tif (getTextureType() == TEXTURE_VOLUME)\n\t\tregion.imageOffset.z = slice;\n\n\tauto commandBuffer = vgfx->getCommandBufferForDataTransfer();\n\n\tVkImageLayout copyDstLayout = imageData.layout == VK_IMAGE_LAYOUT_GENERAL ? imageData.layout : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;\n\n\tVulkan::cmdTransitionImageLayout(commandBuffer, imageData.image, format, renderTarget,\n\t\timageData.layout, copyDstLayout,\n\t\tlevel, 1, baseLayer, 1);\n\n\tvkCmdCopyBufferToImage(\n\t\tcommandBuffer,\n\t\tstagingBuffer,\n\t\timageData.image,\n\t\tcopyDstLayout,\n\t\t1,\n\t\t&region\n\t);\n\n\tVulkan::cmdTransitionImageLayout(commandBuffer, imageData.image, format, renderTarget,\n\t\tcopyDstLayout, imageData.layout,\n\t\tlevel, 1, baseLayer, 1);\n\n\tvgfx->queueCleanUp([allocator = allocator, stagingBuffer, vmaAllocation]() {\n\t\tvmaDestroyBuffer(allocator, stagingBuffer, vmaAllocation);\n\t});\n}\n\nvoid Texture::copyFromBuffer(graphics::Buffer *source, size_t sourceoffset, int sourcewidth, size_t size, int slice, int mipmap, const Rect &rect)\n{\n\tauto commandBuffer = vgfx->getCommandBufferForDataTransfer();\n\n\tVkImageSubresourceLayers layers{};\n\tlayers.aspectMask = imageAspect;\n\tlayers.mipLevel = mipmap + rootView.startMipmap;\n\tlayers.baseArrayLayer = slice + rootView.startLayer;\n\tlayers.layerCount = 1;\n\n\tVkBufferImageCopy region{};\n\tregion.bufferOffset = sourceoffset;\n\tregion.bufferRowLength = sourcewidth;\n\tregion.bufferImageHeight = 1;\n\tregion.imageSubresource = layers;\n\tregion.imageOffset.x = rect.x;\n\tregion.imageOffset.y = rect.y;\n\tregion.imageExtent.width = static_cast<uint32_t>(rect.w);\n\tregion.imageExtent.height = static_cast<uint32_t>(rect.h);\n\n\tVkImageLayout copyDstLayout = imageData.layout == VK_IMAGE_LAYOUT_GENERAL ? imageData.layout : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;\n\tVulkan::cmdTransitionImageLayout(commandBuffer, imageData.image, format, renderTarget, imageData.layout, copyDstLayout, layers.mipLevel, 1, layers.baseArrayLayer, 1);\n\n\tvkCmdCopyBufferToImage(commandBuffer, (VkBuffer)source->getHandle(), imageData.image, copyDstLayout, 1, &region);\n\n\tVulkan::cmdTransitionImageLayout(commandBuffer, imageData.image, format, renderTarget, copyDstLayout, imageData.layout, layers.mipLevel, 1, layers.baseArrayLayer, 1);\n}\n\nvoid Texture::copyToBuffer(graphics::Buffer *dest, int slice, int mipmap, const Rect &rect, size_t destoffset, int destwidth, size_t size)\n{\n\tauto commandBuffer = vgfx->getCommandBufferForDataTransfer();\n\n\tVkImageSubresourceLayers layers{};\n\tlayers.aspectMask = imageAspect;\n\tlayers.mipLevel = mipmap + rootView.startMipmap;\n\tlayers.baseArrayLayer = slice + rootView.startLayer;\n\tlayers.layerCount = 1;\n\n\tVkBufferImageCopy region{};\n\tregion.bufferOffset = destoffset;\n\tregion.bufferRowLength = destwidth;\n\tregion.bufferImageHeight = 0;\n\tregion.imageSubresource = layers;\n\tregion.imageOffset.x = rect.x;\n\tregion.imageOffset.y = rect.y;\n\tregion.imageExtent.width = static_cast<uint32_t>(rect.w);\n\tregion.imageExtent.height = static_cast<uint32_t>(rect.h);\n\tregion.imageExtent.depth = 1;\n\n\tVkImageLayout copySrcLayout = imageData.layout == VK_IMAGE_LAYOUT_GENERAL ? imageData.layout : VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;\n\tVulkan::cmdTransitionImageLayout(commandBuffer, imageData.image, format, renderTarget, imageData.layout, copySrcLayout, layers.mipLevel, 1, layers.baseArrayLayer, 1);\n\n\tvkCmdCopyImageToBuffer(commandBuffer, imageData.image, copySrcLayout, (VkBuffer) dest->getHandle(), 1, &region);\n\n\tVulkan::cmdTransitionImageLayout(commandBuffer, imageData.image, format, renderTarget, copySrcLayout, imageData.layout, layers.mipLevel, 1, layers.baseArrayLayer, 1);\n\n\t// TODO: This could be combined with the cmdTransitionImageLayout barrier.\n\t((Buffer *)dest)->postGPUWriteBarrier(commandBuffer);\n}\n\n} // vulkan\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/vulkan/Texture.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"graphics/Texture.h\"\n#include \"graphics/Volatile.h\"\n\n#include \"VulkanWrapper.h\"\n\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace vulkan\n{\n\nclass Graphics;\n\nclass Texture final\n\t: public graphics::Texture\n\t, public Volatile\n{\npublic:\n\n\tTexture(love::graphics::Graphics *gfx, const Settings &settings, const Slices *data);\n\tTexture(love::graphics::Graphics *gfx, love::graphics::Texture *base, const Texture::ViewSettings &viewsettings);\n\tvirtual ~Texture();\n\n\tbool loadVolatile() override;\n\tvoid unloadVolatile() override;\n\t \n\tvoid setSamplerState(const SamplerState &s) override;\n\n\tVkImageLayout getImageLayout() const;\n\tVkImageLayout getMSAAImageLayout() const;\n\n\tvoid copyFromBuffer(graphics::Buffer *source, size_t sourceoffset, int sourcewidth, size_t size, int slice, int mipmap, const Rect &rect) override;\n\tvoid copyToBuffer(graphics::Buffer *dest, int slice, int mipmap, const Rect &rect, size_t destoffset, int destwidth, size_t size) override;\n\n\tptrdiff_t getRenderTargetHandle() const override;\n\tptrdiff_t getSamplerHandle() const override;\n\n\tVkImageView getRenderTargetView(int mip, int layer);\n\tVkImageView getMSAARenderTargetView(int mip, int layer);\n\tVkSampleCountFlagBits getMsaaSamples() const;\n\n\tvoid uploadByteData(const void *data, size_t size, int level, int slice, const Rect &r) override;\n\n\tvoid generateMipmapsInternal() override;\n\n\tint getMSAA() const override;\n\tptrdiff_t getHandle() const override;\n\n\tstatic VkClearColorValue getClearColor(love::graphics::Texture *texture, const ColorD &color);\n\nprivate:\n\n\tstruct VulkanImageData\n\t{\n\t\tVkImage image = VK_NULL_HANDLE;\n\t\tVkImageLayout layout = VK_IMAGE_LAYOUT_UNDEFINED;\n\t\tVmaAllocation allocation = VK_NULL_HANDLE;\n\t\tVkImageView imageView = VK_NULL_HANDLE;\n\t\tstd::vector<std::vector<VkImageView>> renderTargetImageViews;\n\t};\n\n\tvoid createTextureImageView();\n\tvoid createRenderTargetImageViews(VulkanImageData &data);\n\tvoid clear(const VulkanImageData &data);\n\n\tGraphics *vgfx = nullptr;\n\tVkDevice device = VK_NULL_HANDLE;\n\tVkImageAspectFlags imageAspect;\n\tVmaAllocator allocator = VK_NULL_HANDLE;\n\tVulkanImageData imageData;\n\tVulkanImageData msaaImageData;\n\tVkSampler textureSampler = VK_NULL_HANDLE;\n\tSlices slices;\n\tint layerCount = 0;\n\tVkSampleCountFlagBits msaaSamples = VK_SAMPLE_COUNT_1_BIT;\n};\n\n} // vulkan\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/vulkan/Vulkan.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Vulkan.h\"\n\n#include <sstream>\n\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace vulkan\n{\n\nstatic uint32_t numShaderSwitches;\n\nvoid Vulkan::shaderSwitch()\n{\n\tnumShaderSwitches++;\n}\n\nuint32_t Vulkan::getNumShaderSwitches()\n{\n\treturn numShaderSwitches;\n}\n\nvoid Vulkan::resetShaderSwitches()\n{\n\tnumShaderSwitches = 0;\n}\n\nconst char *Vulkan::getErrorString(VkResult result)\n{\n\tswitch (result)\n\t{\n\tcase VK_SUCCESS: return \"success\";\n\tcase VK_ERROR_OUT_OF_HOST_MEMORY: return \"out of host memory\";\n\tcase VK_ERROR_OUT_OF_DEVICE_MEMORY: return \"out of device graphics memory\";\n\tcase VK_ERROR_INITIALIZATION_FAILED: return \"initialization failed\";\n\tcase VK_ERROR_DEVICE_LOST: return \"device lost\";\n\tcase VK_ERROR_MEMORY_MAP_FAILED: return \"memory map failed\";\n\tcase VK_ERROR_LAYER_NOT_PRESENT: return \"layer not present\";\n\tcase VK_ERROR_EXTENSION_NOT_PRESENT: return \"extension not present\";\n\tcase VK_ERROR_FEATURE_NOT_PRESENT: return \"feature not present\";\n\tcase VK_ERROR_INCOMPATIBLE_DRIVER: return \"incompatible driver\";\n\tcase VK_ERROR_TOO_MANY_OBJECTS: return \"too many objects\";\n\tcase VK_ERROR_FORMAT_NOT_SUPPORTED: return \"format not supported\";\n\tcase VK_ERROR_FRAGMENTED_POOL: return \"fragmented pool\";\n\tcase VK_ERROR_UNKNOWN: return \"unknown error\";\n\tcase VK_ERROR_OUT_OF_POOL_MEMORY: return \"out of pool memory\";\n\tcase VK_ERROR_INVALID_EXTERNAL_HANDLE: return \"invalid external handle\";\n\tcase VK_ERROR_FRAGMENTATION: return \"fragmentation\";\n\tcase VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS: return \"invalid opaque capture address\";\n\tcase VK_ERROR_SURFACE_LOST_KHR: return \"surface lost\";\n\tcase VK_ERROR_NATIVE_WINDOW_IN_USE_KHR: return \"native window in use\";\n\tcase VK_ERROR_OUT_OF_DATE_KHR: return \"out of date\";\n\tcase VK_ERROR_INCOMPATIBLE_DISPLAY_KHR: return \"incompatible display\";\n\tcase VK_ERROR_VALIDATION_FAILED_EXT: return \"validation failed\";\n\tcase VK_ERROR_INVALID_SHADER_NV: return \"invalid shader\";\n\tdefault: return \"unhandled error code\";\n\t}\n}\n\nVkFormat Vulkan::getVulkanVertexFormat(DataFormat format)\n{\n\tswitch (format)\n\t{\n\tcase DATAFORMAT_FLOAT:\n\t\treturn VK_FORMAT_R32_SFLOAT;\n\tcase DATAFORMAT_FLOAT_VEC2:\n\t\treturn VK_FORMAT_R32G32_SFLOAT;\n\tcase DATAFORMAT_FLOAT_VEC3:\n\t\treturn VK_FORMAT_R32G32B32_SFLOAT;\n\tcase DATAFORMAT_FLOAT_VEC4:\n\t\treturn VK_FORMAT_R32G32B32A32_SFLOAT;\n\n\tcase DATAFORMAT_FLOAT_MAT2X2:\n\tcase DATAFORMAT_FLOAT_MAT2X3:\n\tcase DATAFORMAT_FLOAT_MAT2X4:\n\tcase DATAFORMAT_FLOAT_MAT3X2:\n\tcase DATAFORMAT_FLOAT_MAT3X3:\n\tcase DATAFORMAT_FLOAT_MAT3X4:\n\tcase DATAFORMAT_FLOAT_MAT4X2:\n\tcase DATAFORMAT_FLOAT_MAT4X3:\n\tcase DATAFORMAT_FLOAT_MAT4X4:\n\t\tthrow love::Exception(\"unimplemented data format (matnxm)\");\n\n\tcase DATAFORMAT_INT32:\n\t\treturn VK_FORMAT_R32_SINT;\n\tcase DATAFORMAT_INT32_VEC2:\n\t\treturn VK_FORMAT_R32G32_SINT;\n\tcase DATAFORMAT_INT32_VEC3:\n\t\treturn VK_FORMAT_R32G32B32_SINT;\n\tcase DATAFORMAT_INT32_VEC4:\n\t\treturn VK_FORMAT_R32G32B32A32_SINT;\n\n\tcase DATAFORMAT_UINT32:\n\t\treturn VK_FORMAT_R32_UINT;\n\tcase DATAFORMAT_UINT32_VEC2:\n\t\treturn VK_FORMAT_R32G32_UINT;\n\tcase DATAFORMAT_UINT32_VEC3:\n\t\treturn VK_FORMAT_R32G32B32_UINT;\n\tcase DATAFORMAT_UINT32_VEC4:\n\t\treturn VK_FORMAT_R32G32B32A32_UINT;\n\n\tcase DATAFORMAT_SNORM8_VEC4:\n\t\treturn VK_FORMAT_R8G8B8A8_SNORM;\n\tcase DATAFORMAT_UNORM8_VEC4:\n\t\treturn VK_FORMAT_R8G8B8A8_UNORM;\n\tcase DATAFORMAT_INT8_VEC4:\n\t\treturn VK_FORMAT_R8G8B8A8_SINT;\n\tcase DATAFORMAT_UINT8_VEC4:\n\t\treturn VK_FORMAT_R8G8B8A8_UINT;\n\n\tcase DATAFORMAT_SNORM16_VEC2:\n\t\treturn VK_FORMAT_R16G16_SNORM;\n\tcase DATAFORMAT_SNORM16_VEC4:\n\t\treturn VK_FORMAT_R16G16B16A16_SNORM;\n\tcase DATAFORMAT_UNORM16_VEC2:\n\t\treturn VK_FORMAT_R16G16_UNORM;\n\tcase DATAFORMAT_UNORM16_VEC4:\n\t\treturn VK_FORMAT_R16G16B16A16_UNORM;\n\n\tcase DATAFORMAT_INT16_VEC2:\n\t\treturn VK_FORMAT_R16G16_SINT;\n\tcase DATAFORMAT_INT16_VEC4:\n\t\treturn VK_FORMAT_R16G16B16A16_SINT;\n\n\tcase DATAFORMAT_UINT16:\n\t\treturn VK_FORMAT_R16_UINT;\n\tcase DATAFORMAT_UINT16_VEC2:\n\t\treturn VK_FORMAT_R16G16_UINT;\n\tcase DATAFORMAT_UINT16_VEC4:\n\t\treturn VK_FORMAT_R16G16B16A16_UINT;\n\n\tcase DATAFORMAT_BOOL:\n\tcase DATAFORMAT_BOOL_VEC2:\n\tcase DATAFORMAT_BOOL_VEC3:\n\tcase DATAFORMAT_BOOL_VEC4:\n\t\tthrow love::Exception(\"unimplemented data format (bool)\");\n\n\tdefault:\n\t\tthrow love::Exception(\"unknown data format\");\n\t}\n}\n\nTextureFormat Vulkan::getTextureFormat(PixelFormat format)\n{\n\tTextureFormat textureFormat{};\n\n\tswitch (format)\n\t{\n\tcase PIXELFORMAT_UNKNOWN:\n\t\tthrow love::Exception(\"unknown pixel format\");\n\tcase PIXELFORMAT_NORMAL:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R8G8B8A8_SRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_HDR:\n\t\tthrow love::Exception(\"unimplemented pixel format: hdr\");\n\tcase PIXELFORMAT_R8_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R8_UNORM;\n\t\tbreak;\n\tcase PIXELFORMAT_R8_INT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R8_SINT;\n\t\ttextureFormat.internalFormatRepresentation = FORMATREPRESENTATION_SINT;\n\t\tbreak;\n\tcase PIXELFORMAT_R8_UINT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R8_UINT;\n\t\ttextureFormat.internalFormatRepresentation = FORMATREPRESENTATION_UINT;\n\t\tbreak;\n\tcase PIXELFORMAT_R16_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R16_UNORM;\n\t\tbreak;\n\tcase PIXELFORMAT_R16_FLOAT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R16_SFLOAT;\n\t\tbreak;\n\tcase PIXELFORMAT_R16_INT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R16_SINT;\n\t\ttextureFormat.internalFormatRepresentation = FORMATREPRESENTATION_SINT;\n\t\tbreak;\n\tcase PIXELFORMAT_R16_UINT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R16_UINT;\n\t\ttextureFormat.internalFormatRepresentation = FORMATREPRESENTATION_UINT;\n\t\tbreak;\n\tcase PIXELFORMAT_R32_FLOAT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R32_SFLOAT;\n\t\tbreak;\n\tcase PIXELFORMAT_R32_INT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R32_SINT;\n\t\ttextureFormat.internalFormatRepresentation = FORMATREPRESENTATION_SINT;\n\t\tbreak;\n\tcase PIXELFORMAT_R32_UINT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R32_UINT;\n\t\ttextureFormat.internalFormatRepresentation = FORMATREPRESENTATION_UINT;\n\t\tbreak;\n\tcase PIXELFORMAT_RG8_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R8G8_UNORM;\n\t\tbreak;\n\tcase PIXELFORMAT_RG8_INT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R8G8_SINT;\n\t\ttextureFormat.internalFormatRepresentation = FORMATREPRESENTATION_SINT;\n\t\tbreak;\n\tcase PIXELFORMAT_RG8_UINT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R8G8_UINT;\n\t\ttextureFormat.internalFormatRepresentation = FORMATREPRESENTATION_UINT;\n\t\tbreak;\n\tcase PIXELFORMAT_LA8_UNORM: // Same as RG8: but accessed as (L: L: L: A)\n\t\ttextureFormat.internalFormat = VK_FORMAT_R8G8_UNORM;\n\t\ttextureFormat.swizzleR = VK_COMPONENT_SWIZZLE_R;\n\t\ttextureFormat.swizzleG = VK_COMPONENT_SWIZZLE_R;\n\t\ttextureFormat.swizzleB = VK_COMPONENT_SWIZZLE_R;\n\t\ttextureFormat.swizzleA = VK_COMPONENT_SWIZZLE_G;\n\t\tbreak;\n\tcase PIXELFORMAT_RG16_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R16G16_UNORM;\n\t\tbreak;\n\tcase PIXELFORMAT_RG16_FLOAT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R16G16_SFLOAT;\n\t\tbreak;\n\tcase PIXELFORMAT_RG16_INT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R16G16_SINT;\n\t\ttextureFormat.internalFormatRepresentation = FORMATREPRESENTATION_SINT;\n\t\tbreak;\n\tcase PIXELFORMAT_RG16_UINT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R16G16_UINT;\n\t\ttextureFormat.internalFormatRepresentation = FORMATREPRESENTATION_UINT;\n\t\tbreak;\n\tcase PIXELFORMAT_RG32_FLOAT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R32G32_SFLOAT;\n\t\tbreak;\n\tcase PIXELFORMAT_RG32_INT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R32G32_SINT;\n\t\ttextureFormat.internalFormatRepresentation = FORMATREPRESENTATION_SINT;\n\t\tbreak;\n\tcase PIXELFORMAT_RG32_UINT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R32G32_UINT;\n\t\ttextureFormat.internalFormatRepresentation = FORMATREPRESENTATION_UINT;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA8_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R8G8B8A8_UNORM;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA8_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R8G8B8A8_SRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_BGRA8_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_B8G8R8A8_UNORM;\n\t\tbreak;\n\tcase PIXELFORMAT_BGRA8_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_B8G8R8A8_SRGB;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA8_INT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R8G8B8A8_SINT;\n\t\ttextureFormat.internalFormatRepresentation = FORMATREPRESENTATION_SINT;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA8_UINT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R8G8B8A8_UINT;\n\t\ttextureFormat.internalFormatRepresentation = FORMATREPRESENTATION_UINT;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA16_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R16G16B16A16_UNORM;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA16_FLOAT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R16G16B16A16_SFLOAT;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA16_INT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R16G16B16A16_SINT;\n\t\ttextureFormat.internalFormatRepresentation = FORMATREPRESENTATION_SINT;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA16_UINT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R16G16B16A16_UINT;\n\t\ttextureFormat.internalFormatRepresentation = FORMATREPRESENTATION_UINT;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA32_FLOAT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R32G32B32A32_SFLOAT;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA32_INT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R32G32B32A32_SINT;\n\t\ttextureFormat.internalFormatRepresentation = FORMATREPRESENTATION_SINT;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA32_UINT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_R32G32B32A32_UINT;\n\t\ttextureFormat.internalFormatRepresentation = FORMATREPRESENTATION_UINT;\n\t\tbreak;\n\tcase PIXELFORMAT_RGBA4_UNORM:    // LSB->MSB: [a: b: g: r]\n\t\ttextureFormat.internalFormat = VK_FORMAT_R4G4B4A4_UNORM_PACK16;\n\t\tbreak;\n\tcase PIXELFORMAT_RGB5A1_UNORM:   // LSB->MSB: [a: b: g: r]\n\t\ttextureFormat.internalFormat = VK_FORMAT_R5G5B5A1_UNORM_PACK16;\n\t\tbreak;\n\tcase PIXELFORMAT_RGB565_UNORM:   // LSB->MSB: [b: g: r]\n\t\ttextureFormat.internalFormat = VK_FORMAT_R5G6B5_UNORM_PACK16;\n\t\tbreak;\n\tcase PIXELFORMAT_RGB10A2_UNORM:  // LSB->MSB: [r: g: b: a]\n\t\ttextureFormat.internalFormat = VK_FORMAT_A2B10G10R10_UNORM_PACK32;\n\t\tbreak;\n\tcase PIXELFORMAT_RG11B10_FLOAT:  // LSB->MSB: [r: g: b]\n\t\ttextureFormat.internalFormat = VK_FORMAT_B10G11R11_UFLOAT_PACK32;\n\t\tbreak;\n\tcase PIXELFORMAT_STENCIL8:\n\t\ttextureFormat.internalFormat = VK_FORMAT_S8_UINT;\n\t\ttextureFormat.internalFormatRepresentation = FORMATREPRESENTATION_UINT;\n\t\tbreak;\n\tcase PIXELFORMAT_DEPTH16_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_D16_UNORM;\n\t\ttextureFormat.internalFormatRepresentation = FORMATREPRESENTATION_UINT;\n\t\tbreak;\n\tcase PIXELFORMAT_DEPTH24_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_X8_D24_UNORM_PACK32;\n\t\ttextureFormat.internalFormatRepresentation = FORMATREPRESENTATION_UINT;\n\t\tbreak;\n\tcase PIXELFORMAT_DEPTH24_UNORM_STENCIL8:\n\t\ttextureFormat.internalFormat = VK_FORMAT_D24_UNORM_S8_UINT;\n\t\ttextureFormat.internalFormatRepresentation = FORMATREPRESENTATION_UINT;\n\t\tbreak;\n\tcase PIXELFORMAT_DEPTH32_FLOAT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_D32_SFLOAT;\n\t\tbreak;\n\tcase PIXELFORMAT_DEPTH32_FLOAT_STENCIL8:\n\t\ttextureFormat.internalFormat = VK_FORMAT_D32_SFLOAT_S8_UINT;\n\t\tbreak;\n\tcase PIXELFORMAT_DXT1_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_BC1_RGBA_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_DXT1_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_BC1_RGBA_SRGB_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_DXT3_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_BC2_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_DXT3_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_BC2_SRGB_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_DXT5_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_BC3_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_DXT5_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_BC3_SRGB_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_BC4_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_BC4_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_BC4_SNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_BC4_SNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_BC5_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_BC5_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_BC5_SNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_BC5_SNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_BC6H_UFLOAT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_BC6H_UFLOAT_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_BC6H_FLOAT:\n\t\ttextureFormat.internalFormat = VK_FORMAT_BC6H_SFLOAT_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_BC7_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_BC7_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_BC7_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_BC7_SRGB_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGB2_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGB2_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGB4_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGB4_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGBA2_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGBA2_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGBA4_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG;\n\t\tbreak;\n\tcase PIXELFORMAT_PVR1_RGBA4_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG;\n\t\tbreak;\n\tcase PIXELFORMAT_ETC1_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ETC2_RGB_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ETC2_RGB_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ETC2_RGBA_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ETC2_RGBA_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ETC2_RGBA1_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ETC2_RGBA1_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_EAC_R_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_EAC_R11_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_EAC_R_SNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_EAC_R11_SNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_EAC_RG_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_EAC_R11G11_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_EAC_RG_SNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_EAC_R11G11_SNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_4x4_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_5x4_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_5x4_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_5x5_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_5x5_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_6x5_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_6x5_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_6x6_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_6x6_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_8x5_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_8x5_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_8x6_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_8x6_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_8x8_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_8x8_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x5_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_10x5_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x6_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_10x6_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x8_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_10x8_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x10_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_10x10_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_12x10_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_12x10_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_12x12_UNORM:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_12x12_UNORM_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_4x4_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_4x4_SRGB_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_5x4_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_5x4_SRGB_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_5x5_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_5x5_SRGB_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_6x5_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_6x5_SRGB_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_6x6_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_6x6_SRGB_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_8x5_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_8x5_SRGB_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_8x6_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_8x6_SRGB_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_8x8_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_8x8_SRGB_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x5_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_10x5_SRGB_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x6_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_10x6_SRGB_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x8_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_10x8_SRGB_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_10x10_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_10x10_SRGB_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_12x10_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_12x10_SRGB_BLOCK;\n\t\tbreak;\n\tcase PIXELFORMAT_ASTC_12x12_sRGB:\n\t\ttextureFormat.internalFormat = VK_FORMAT_ASTC_12x12_SRGB_BLOCK;\n\t\tbreak;\n\tdefault:\n\t\tthrow love::Exception(\"unknown pixel format\");\n\t}\n\n\treturn textureFormat;\n}\n\n// values taken from https://pcisig.com/membership/member-companies and https://vulkan.gpuinfo.org/displaycoreproperty.php?name=vendorid&platform=all\n// as specified at https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VkPhysicalDeviceProperties.html\nstd::string Vulkan::getVendorName(uint32_t vendorId)\n{\n\tswitch (vendorId)\n\t{\n\tcase 4130:\n\tcase 4098:\n\t\treturn \"AMD\";\n\tcase 4318:\n\t\treturn \"Nvidia\";\n\tcase 32902:\n\t\treturn \"Intel\";\n\tcase 4203:\n\t\treturn \"Apple\";\n\tcase 5140:\n\t\treturn \"Microsoft\";\n\tcase 5045:\n\t\treturn \"ARM\";\n\tcase 20803:\n\t\treturn \"Qualcomm\";\n\tcase 5348:\n\t\treturn \"Broadcom\";\n\tcase 65541:\n\t\treturn \"Mesa\";\n\tdefault:\n\t\treturn \"unknown\";\n\t}\n}\n\nstd::string Vulkan::getVulkanApiVersion(uint32_t version)\n{\n\tstd::stringstream ss;\n\n\tss << VK_API_VERSION_MAJOR(version) \n\t\t<< \".\" << VK_API_VERSION_MINOR(version) \n\t\t<< \".\" << VK_API_VERSION_PATCH(version);\n\n\treturn ss.str();\n}\n\nVkPrimitiveTopology Vulkan::getPrimitiveTypeTopology(graphics::PrimitiveType primitiveType)\n{\n\tswitch (primitiveType)\n\t{\n\tcase PRIMITIVE_POINTS:\n\t\treturn VK_PRIMITIVE_TOPOLOGY_POINT_LIST;\n\tcase PRIMITIVE_TRIANGLES:\n\t\treturn VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;\n\tcase PRIMITIVE_TRIANGLE_FAN:\n\t\treturn VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN;\n\tcase PRIMITIVE_TRIANGLE_STRIP:\n\t\treturn VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;\n\tdefault:\n\t\tthrow love::Exception(\"unknown primitive type\");\n\t}\n}\n\nVkBlendFactor Vulkan::getBlendFactor(BlendFactor blendFactor)\n{\n\tswitch (blendFactor)\n\t{\n\tcase BLENDFACTOR_ZERO:\n\t\treturn VK_BLEND_FACTOR_ZERO;\n\tcase BLENDFACTOR_ONE:\n\t\treturn VK_BLEND_FACTOR_ONE;\n\tcase BLENDFACTOR_SRC_COLOR:\n\t\treturn VK_BLEND_FACTOR_SRC_COLOR;\n\tcase BLENDFACTOR_ONE_MINUS_SRC_COLOR:\n\t\treturn VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR;\n\tcase BLENDFACTOR_SRC_ALPHA:\n\t\treturn VK_BLEND_FACTOR_SRC_ALPHA;\n\tcase BLENDFACTOR_ONE_MINUS_SRC_ALPHA:\n\t\treturn VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;\n\tcase BLENDFACTOR_DST_COLOR:\n\t\treturn VK_BLEND_FACTOR_DST_COLOR;\n\tcase BLENDFACTOR_ONE_MINUS_DST_COLOR:\n\t\treturn VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR;\n\tcase BLENDFACTOR_DST_ALPHA:\n\t\treturn VK_BLEND_FACTOR_DST_ALPHA;\n\tcase BLENDFACTOR_ONE_MINUS_DST_ALPHA:\n\t\treturn VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA;\n\tcase BLENDFACTOR_SRC_ALPHA_SATURATED:\n\t\treturn VK_BLEND_FACTOR_SRC_ALPHA_SATURATE;\n\tdefault:\n\t\tthrow love::Exception(\"unknown blend factor\");\n\t}\n}\n\nVkBlendOp Vulkan::getBlendOp(BlendOperation op)\n{\n\tswitch (op)\n\t{\n\tcase BLENDOP_ADD:\n\t\treturn VK_BLEND_OP_ADD;\n\tcase BLENDOP_MAX:\n\t\treturn VK_BLEND_OP_MAX;\n\tcase BLENDOP_MIN:\n\t\treturn VK_BLEND_OP_MIN;\n\tcase BLENDOP_SUBTRACT:\n\t\treturn VK_BLEND_OP_SUBTRACT;\n\tcase BLENDOP_REVERSE_SUBTRACT:\n\t\treturn VK_BLEND_OP_REVERSE_SUBTRACT;\n\tdefault:\n\t\tthrow love::Exception(\"unknown blend operation\");\n\t}\n}\n\nVkBool32 Vulkan::getBool(bool b)\n{\n\tif (b)\n\t\treturn VK_TRUE;\n\telse\n\t\treturn VK_FALSE;\n}\n\nVkColorComponentFlags Vulkan::getColorMask(ColorChannelMask mask)\n{\n\tVkColorComponentFlags flags = 0;\n\n\tif (mask.r)\n\t\tflags |= VK_COLOR_COMPONENT_R_BIT;\n\tif (mask.g)\n\t\tflags |= VK_COLOR_COMPONENT_G_BIT;\n\tif (mask.b)\n\t\tflags |= VK_COLOR_COMPONENT_B_BIT;\n\tif (mask.a)\n\t\tflags |= VK_COLOR_COMPONENT_A_BIT;\n\n\treturn flags;\n}\n\nVkFrontFace Vulkan::getFrontFace(Winding winding)\n{\n\tswitch (winding)\n\t{\n\tcase WINDING_CW:\n\t\treturn VK_FRONT_FACE_CLOCKWISE;\n\tcase WINDING_CCW:\n\t\treturn VK_FRONT_FACE_COUNTER_CLOCKWISE;\n\tdefault:\n\t\tthrow love::Exception(\"unknown winding\");\n\t}\n}\n\nVkCullModeFlags Vulkan::getCullMode(CullMode cullmode)\n{\n\tswitch (cullmode)\n\t{\n\tcase CULL_BACK:\n\t\treturn VK_CULL_MODE_BACK_BIT;\n\tcase CULL_FRONT:\n\t\treturn VK_CULL_MODE_FRONT_BIT;\n\tcase CULL_NONE:\n\t\treturn VK_CULL_MODE_NONE;\n\tdefault:\n\t\tthrow love::Exception(\"unknown cull mode\");\n\t}\n}\n\nVkImageType Vulkan::getImageType(TextureType textureType)\n{\n\tswitch (textureType)\n\t{\n\tcase TEXTURE_2D:\n\tcase TEXTURE_2D_ARRAY:\n\tcase TEXTURE_CUBE:\n\t\treturn VK_IMAGE_TYPE_2D;\n\tcase TEXTURE_VOLUME:\n\t\treturn VK_IMAGE_TYPE_3D;\n\tdefault:\n\t\tthrow love::Exception(\"unknown texture type\");\n\t}\n}\n\nVkImageViewType Vulkan::getImageViewType(TextureType textureType)\n{\n\tswitch (textureType)\n\t{\n\tcase TEXTURE_2D:\n\t\treturn VK_IMAGE_VIEW_TYPE_2D;\n\tcase TEXTURE_2D_ARRAY:\n\t\treturn VK_IMAGE_VIEW_TYPE_2D_ARRAY;\n\tcase TEXTURE_CUBE:\n\t\treturn VK_IMAGE_VIEW_TYPE_CUBE;\n\tcase TEXTURE_VOLUME:\n\t\treturn VK_IMAGE_VIEW_TYPE_3D;\n\tdefault:\n\t\tthrow love::Exception(\"unknown texture type\");\n\t}\n}\n\nVkPolygonMode Vulkan::getPolygonMode(bool wireframe)\n{\n\tif (wireframe)\n\t\treturn VK_POLYGON_MODE_LINE;\n\telse\n\t\treturn VK_POLYGON_MODE_FILL;\n}\n\nVkFilter Vulkan::getFilter(SamplerState::FilterMode mode)\n{\n\tswitch (mode)\n\t{\n\tcase SamplerState::FILTER_LINEAR:\n\t\treturn VK_FILTER_LINEAR;\n\tcase SamplerState::FILTER_NEAREST:\n\t\treturn VK_FILTER_NEAREST;\n\tdefault:\n\t\tthrow love::Exception(\"unkonwn filter mode\");\n\t}\n}\n\nVkSamplerAddressMode Vulkan::getWrapMode(SamplerState::WrapMode mode)\n{\n\tswitch (mode)\n\t{\n\tcase SamplerState::WRAP_CLAMP:\n\t\treturn VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;\n\tcase SamplerState::WRAP_CLAMP_ZERO:\n\tcase SamplerState::WRAP_CLAMP_ONE:\n\t\treturn VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;\n\tcase SamplerState::WRAP_REPEAT:\n\t\treturn VK_SAMPLER_ADDRESS_MODE_REPEAT;\n\tcase SamplerState::WRAP_MIRRORED_REPEAT:\n\t\treturn VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT;\n\tdefault:\n\t\tthrow love::Exception(\"unknown wrap mode\");\n\t}\n}\n\nVkCompareOp Vulkan::getCompareOp(CompareMode mode)\n{\n\tswitch (mode)\n\t{\n\tcase COMPARE_LESS:\n\t\treturn VK_COMPARE_OP_LESS;\n\tcase COMPARE_LEQUAL:\n\t\treturn VK_COMPARE_OP_LESS_OR_EQUAL;\n\tcase COMPARE_EQUAL:\n\t\treturn VK_COMPARE_OP_EQUAL;\n\tcase COMPARE_GEQUAL:\n\t\treturn VK_COMPARE_OP_GREATER_OR_EQUAL;\n\tcase COMPARE_GREATER:\n\t\treturn VK_COMPARE_OP_GREATER;\n\tcase COMPARE_NOTEQUAL:\n\t\treturn VK_COMPARE_OP_NOT_EQUAL;\n\tcase COMPARE_ALWAYS:\n\t\treturn VK_COMPARE_OP_ALWAYS;\n\tcase COMPARE_NEVER:\n\t\treturn VK_COMPARE_OP_NEVER;\n\tdefault:\n\t\tthrow love::Exception(\"unknown compare mode\");\n\t}\n}\n\nVkSamplerMipmapMode Vulkan::getMipMapMode(SamplerState::MipmapFilterMode mode)\n{\n\tswitch (mode)\n\t{\n\tcase SamplerState::MIPMAP_FILTER_NONE:\n\tcase SamplerState::MIPMAP_FILTER_NEAREST:\n\t\treturn VK_SAMPLER_MIPMAP_MODE_NEAREST;\n\tcase SamplerState::MIPMAP_FILTER_LINEAR:\n\tdefault:\n\t\treturn VK_SAMPLER_MIPMAP_MODE_LINEAR;\n\t}\n}\n\nVkDescriptorType Vulkan::getDescriptorType(graphics::Shader::UniformType type)\n{\n\tswitch (type)\n\t{\n\tcase graphics::Shader::UniformType::UNIFORM_FLOAT:\n\tcase graphics::Shader::UniformType::UNIFORM_MATRIX:\n\tcase graphics::Shader::UniformType::UNIFORM_INT:\n\tcase graphics::Shader::UniformType::UNIFORM_UINT:\n\tcase graphics::Shader::UniformType::UNIFORM_BOOL:\n\t\treturn VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;\n\tcase graphics::Shader::UniformType::UNIFORM_SAMPLER:\n\t\treturn VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;\n\tcase graphics::Shader::UniformType::UNIFORM_STORAGETEXTURE:\n\t\treturn VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;\n\tcase graphics::Shader::UniformType::UNIFORM_TEXELBUFFER:\n\t\treturn VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;\n\tcase graphics::Shader::UniformType::UNIFORM_STORAGEBUFFER:\n\t\treturn VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;\n\tdefault:\n\t\tthrow love::Exception(\"unknown uniform type\");\n\t}\n}\n\nVkStencilOp Vulkan::getStencilOp(StencilAction action)\n{\n\tswitch (action)\n\t{\n\tcase STENCIL_KEEP:\n\t\treturn VK_STENCIL_OP_KEEP;\n\tcase STENCIL_ZERO:\n\t\treturn VK_STENCIL_OP_ZERO;\n\tcase STENCIL_REPLACE:\n\t\treturn VK_STENCIL_OP_REPLACE;\n\tcase STENCIL_INCREMENT:\n\t\treturn VK_STENCIL_OP_INCREMENT_AND_CLAMP;\n\tcase STENCIL_DECREMENT:\n\t\treturn VK_STENCIL_OP_DECREMENT_AND_CLAMP;\n\tcase STENCIL_INCREMENT_WRAP:\n\t\treturn VK_STENCIL_OP_INCREMENT_AND_WRAP;\n\tcase STENCIL_DECREMENT_WRAP:\n\t\treturn VK_STENCIL_OP_DECREMENT_AND_WRAP;\n\tcase STENCIL_INVERT:\n\t\treturn VK_STENCIL_OP_INVERT;\n\tdefault:\n\t\tthrow love::Exception(\"unknown stencil action\");\n\t}\n}\n\nVkIndexType Vulkan::getVulkanIndexBufferType(IndexDataType type)\n{\n\tswitch (type)\n\t{\n\tcase INDEX_UINT16: return VK_INDEX_TYPE_UINT16;\n\tcase INDEX_UINT32: return VK_INDEX_TYPE_UINT32;\n\tdefault:\n\t\tthrow love::Exception(\"unknown Index Data type\");\n\t}\n}\n\nvoid Vulkan::addImageLayoutTransitionOptions(bool previous, bool renderTarget, bool depthStencil, VkImageLayout layout, VkAccessFlags &accessMask, VkPipelineStageFlags &stageFlags)\n{\n\tswitch (layout)\n\t{\n\tcase VK_IMAGE_LAYOUT_UNDEFINED:\n\t\taccessMask |= 0;\n\t\tif (previous)\n\t\t\tstageFlags |= VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;\n\t\telse\n\t\t\tstageFlags |= VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;\n\t\tbreak;\n\tcase VK_IMAGE_LAYOUT_GENERAL:\n\t\t// We use the general image layout for images that are both compute write and readable.\n\t\t// todo: can we optimize this?\n\t\taccessMask |= VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT;\n\t\tstageFlags |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT;\n\t\tif (renderTarget)\n\t\t{\n\t\t\tif (depthStencil)\n\t\t\t{\n\t\t\t\taccessMask |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;\n\t\t\t\tstageFlags |= VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\taccessMask |= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;\n\t\t\t\tstageFlags |= VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\tcase VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:\n\t\taccessMask |= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;\n\t\tstageFlags |= VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;\n\t\tbreak;\n\tcase VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:\n\t\taccessMask |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;\n\t\tstageFlags |= VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;\n\t\tbreak;\n\tcase VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:\n\t\taccessMask |= VK_ACCESS_SHADER_READ_BIT;\n\t\tstageFlags |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;\n\t\tbreak;\n\tcase VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:\n\t\taccessMask |= VK_ACCESS_TRANSFER_READ_BIT;\n\t\tstageFlags |= VK_PIPELINE_STAGE_TRANSFER_BIT;\n\t\tbreak;\n\tcase VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:\n\t\taccessMask |= VK_ACCESS_TRANSFER_WRITE_BIT;\n\t\tstageFlags |= VK_PIPELINE_STAGE_TRANSFER_BIT;\n\t\tbreak;\n\tcase VK_IMAGE_LAYOUT_PRESENT_SRC_KHR:\n\t\taccessMask |= 0;\n\t\tstageFlags |= VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;\n\t\tbreak;\n\tdefault:\n\t\tthrow love::Exception(\"unimplemented image layout\");\n\t}\n}\n\nvoid Vulkan::cmdTransitionImageLayout(VkCommandBuffer commandBuffer, VkImage image, PixelFormat format, bool renderTarget, VkImageLayout oldLayout, VkImageLayout newLayout, uint32_t baseLevel, uint32_t levelCount, uint32_t baseLayer, uint32_t layerCount)\n{\n\tVkImageMemoryBarrier imageBarrier{};\n\timageBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;\n\timageBarrier.oldLayout = oldLayout;\n\timageBarrier.newLayout = newLayout;\n\timageBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n\timageBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n\timageBarrier.image = image;\n\timageBarrier.subresourceRange.baseMipLevel = baseLevel;\n\timageBarrier.subresourceRange.levelCount = levelCount;\n\timageBarrier.subresourceRange.baseArrayLayer = baseLayer;\n\timageBarrier.subresourceRange.layerCount = layerCount;\n\n\tconst PixelFormatInfo &info = getPixelFormatInfo(format);\n\n\tVkPipelineStageFlags sourceStage = 0;\n\tVkPipelineStageFlags destinationStage = 0;\n\n\taddImageLayoutTransitionOptions(true, renderTarget, info.depth || info.stencil, oldLayout, imageBarrier.srcAccessMask, sourceStage);\n\taddImageLayoutTransitionOptions(false, renderTarget, info.depth || info.stencil, newLayout, imageBarrier.dstAccessMask, destinationStage);\n\n\tif (info.color)\n\t\timageBarrier.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_COLOR_BIT;\n\tif (info.depth)\n\t\timageBarrier.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_DEPTH_BIT;\n\tif (info.stencil)\n\t\timageBarrier.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT;\n\n\tif (oldLayout != newLayout)\n\t{\n\t\tvkCmdPipelineBarrier(\n\t\t\tcommandBuffer,\n\t\t\tsourceStage, destinationStage,\n\t\t\t0,\n\t\t\t0, nullptr,\n\t\t\t0, nullptr,\n\t\t\t1, &imageBarrier\n\t\t);\n\t}\n\telse\n\t{\n\t\t// No layout transition needed, but we do still need a memory barrier.\n\t\tVkMemoryBarrier memoryBarrier{};\n\t\tmemoryBarrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;\n\t\tmemoryBarrier.srcAccessMask = imageBarrier.srcAccessMask;\n\t\tmemoryBarrier.dstAccessMask = imageBarrier.dstAccessMask;\n\n\t\tvkCmdPipelineBarrier(\n\t\t\tcommandBuffer,\n\t\t\tsourceStage, destinationStage,\n\t\t\t0,\n\t\t\t1, &memoryBarrier,\n\t\t\t0, nullptr,\n\t\t\t0, nullptr\n\t\t);\n\t}\n}\n\n} // vulkan\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/vulkan/Vulkan.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"graphics/Graphics.h\"\n#include \"VulkanWrapper.h\"\n\nnamespace love\n{\nnamespace graphics\n{\nnamespace vulkan \n{\n\nenum InternalFormatRepresentation\n{\n\tFORMATREPRESENTATION_FLOAT,\n\tFORMATREPRESENTATION_UINT,\n\tFORMATREPRESENTATION_SINT,\n\tFORMATREPRESENTATION_MAX_ENUM\n};\n\nstruct TextureFormat\n{\n\tInternalFormatRepresentation internalFormatRepresentation = FORMATREPRESENTATION_FLOAT;\n\tVkFormat internalFormat = VK_FORMAT_UNDEFINED;\n\n\tVkComponentSwizzle swizzleR = VK_COMPONENT_SWIZZLE_IDENTITY;\n\tVkComponentSwizzle swizzleG = VK_COMPONENT_SWIZZLE_IDENTITY;\n\tVkComponentSwizzle swizzleB = VK_COMPONENT_SWIZZLE_IDENTITY;\n\tVkComponentSwizzle swizzleA = VK_COMPONENT_SWIZZLE_IDENTITY;\n};\n\nconstexpr uint32_t MAX_FRAMES_IN_FLIGHT = 2;\n\nclass Vulkan\n{\npublic:\n\tstatic void shaderSwitch();\n\tstatic uint32_t getNumShaderSwitches();\n\tstatic void resetShaderSwitches();\n\n\tstatic const char *getErrorString(VkResult result);\n\tstatic VkFormat getVulkanVertexFormat(DataFormat format);\n\tstatic TextureFormat getTextureFormat(PixelFormat format);\n\tstatic std::string getVendorName(uint32_t vendorId);\n\tstatic std::string getVulkanApiVersion(uint32_t apiVersion);\n\tstatic VkPrimitiveTopology getPrimitiveTypeTopology(graphics::PrimitiveType);\n\tstatic VkBlendFactor getBlendFactor(BlendFactor);\n\tstatic VkBlendOp getBlendOp(BlendOperation);\n\tstatic VkBool32 getBool(bool);\n\tstatic VkColorComponentFlags getColorMask(ColorChannelMask);\n\tstatic VkFrontFace getFrontFace(Winding);\n\tstatic VkCullModeFlags getCullMode(CullMode);\n\tstatic VkImageType getImageType(TextureType);\n\tstatic VkImageViewType getImageViewType(TextureType);\n\tstatic VkPolygonMode getPolygonMode(bool wireframe);\n\tstatic VkFilter getFilter(SamplerState::FilterMode);\n\tstatic VkSamplerAddressMode getWrapMode(SamplerState::WrapMode);\n\tstatic VkCompareOp getCompareOp(CompareMode);\n\tstatic VkSamplerMipmapMode getMipMapMode(SamplerState::MipmapFilterMode);\n\tstatic VkDescriptorType getDescriptorType(graphics::Shader::UniformType);\n\tstatic VkStencilOp getStencilOp(StencilAction);\n\tstatic VkIndexType getVulkanIndexBufferType(IndexDataType type);\n\n\tstatic void addImageLayoutTransitionOptions(\n\t\tbool previous, bool renderTarget, bool depthStencil, VkImageLayout layout, VkAccessFlags& accessMask, VkPipelineStageFlags& stageFlags);\n\n\tstatic void cmdTransitionImageLayout(\n\t\tVkCommandBuffer, VkImage, PixelFormat format, bool renderTarget, VkImageLayout oldLayout, VkImageLayout newLayout,\n\t\tuint32_t baseLevel = 0, uint32_t levelCount = VK_REMAINING_MIP_LEVELS, uint32_t baseLayer = 0, uint32_t layerCount = VK_REMAINING_ARRAY_LAYERS);\n};\n\n} // vulkan\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/vulkan/VulkanWrapper.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#define VK_NO_PROTOTYPES\n#include \"libraries/vulkanheaders/vulkan.h\"\n\n#include \"libraries/volk/volk.h\"\n#define VMA_STATIC_VULKAN_FUNCTIONS 0\n#define VMA_DYNAMIC_VULKAN_FUNCTIONS 0\n#include \"libraries/vma/vk_mem_alloc.h\"\n"
  },
  {
    "path": "src/modules/graphics/wrap_Buffer.cpp",
    "content": "/**\n* Copyright (c) 2006-2026 LOVE Development Team\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n*\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n*\n* 1. The origin of this software must not be misrepresented; you must not\n*    claim that you wrote the original software. If you use this software\n*    in a product, an acknowledgment in the product documentation would be\n*    appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n*    misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n**/\n\n#include \"wrap_Buffer.h\"\n#include \"Buffer.h\"\n#include \"common/Data.h\"\n\n#include <limits>\n\nnamespace love\n{\nnamespace graphics\n{\n\nstatic const double defaultComponents[] = {0.0, 0.0, 0.0, 1.0};\n\ntemplate <typename T>\nstatic inline size_t writeData(lua_State *L, int startidx, int components, char *data)\n{\n\tauto componentdata = (T *) data;\n\n\tfor (int i = 0; i < components; i++)\n\t\tcomponentdata[i] = (T) (luaL_optnumber(L, startidx + i, defaultComponents[i]));\n\n\treturn sizeof(T) * components;\n}\n\ntemplate <typename T>\nstatic inline size_t writeSNormData(lua_State *L, int startidx, int components, char *data)\n{\n\tauto componentdata = (T *) data;\n\tconstexpr auto maxval = std::numeric_limits<T>::max();\n\n\tfor (int i = 0; i < components; i++)\n\t\tcomponentdata[i] = (T) (luax_optnumberclamped(L, startidx + i, -1.0, 1.0, defaultComponents[i]) * maxval);\n\n\treturn sizeof(T) * components;\n}\n\ntemplate <typename T>\nstatic inline size_t writeUNormData(lua_State *L, int startidx, int components, char *data)\n{\n\tauto componentdata = (T *) data;\n\tconstexpr auto maxval = std::numeric_limits<T>::max();\n\n\tfor (int i = 0; i < components; i++)\n\t\tcomponentdata[i] = (T) (luax_optnumberclamped01(L, startidx + i, 1.0) * maxval);\n\n\treturn sizeof(T) * components;\n}\n\ntemplate <typename T>\nstatic inline size_t writeDataRequired(lua_State *L, int startidx, int components, char *data)\n{\n\tauto componentdata = (T*)data;\n\n\tfor (int i = 0; i < components; i++)\n\t\tcomponentdata[i] = (T)(luaL_checknumber(L, startidx + i));\n\n\treturn sizeof(T) * components;\n}\n\nvoid luax_writebufferdata(lua_State *L, int startidx, DataFormat format, char *data)\n{\n\tswitch (format)\n\t{\n\t\tcase DATAFORMAT_FLOAT:      writeData<float>(L, startidx, 1, data); break;\n\t\tcase DATAFORMAT_FLOAT_VEC2: writeData<float>(L, startidx, 2, data); break;\n\t\tcase DATAFORMAT_FLOAT_VEC3: writeData<float>(L, startidx, 3, data); break;\n\t\tcase DATAFORMAT_FLOAT_VEC4: writeData<float>(L, startidx, 4, data); break;\n\n\t\tcase DATAFORMAT_FLOAT_MAT2X2: writeDataRequired<float>(L, startidx, 4, data); break;\n\t\tcase DATAFORMAT_FLOAT_MAT2X3: writeDataRequired<float>(L, startidx, 6, data); break;\n\t\tcase DATAFORMAT_FLOAT_MAT2X4: writeDataRequired<float>(L, startidx, 8, data); break;\n\n\t\tcase DATAFORMAT_FLOAT_MAT3X2: writeDataRequired<float>(L, startidx, 6, data); break;\n\t\tcase DATAFORMAT_FLOAT_MAT3X3: writeDataRequired<float>(L, startidx, 9, data); break;\n\t\tcase DATAFORMAT_FLOAT_MAT3X4: writeDataRequired<float>(L, startidx, 12, data); break;\n\n\t\tcase DATAFORMAT_FLOAT_MAT4X2: writeDataRequired<float>(L, startidx, 8, data); break;\n\t\tcase DATAFORMAT_FLOAT_MAT4X3: writeDataRequired<float>(L, startidx, 12, data); break;\n\t\tcase DATAFORMAT_FLOAT_MAT4X4: writeDataRequired<float>(L, startidx, 16, data); break;\n\n\t\tcase DATAFORMAT_INT32:      writeData<int32>(L, startidx, 1, data); break;\n\t\tcase DATAFORMAT_INT32_VEC2: writeData<int32>(L, startidx, 2, data); break;\n\t\tcase DATAFORMAT_INT32_VEC3: writeData<int32>(L, startidx, 3, data); break;\n\t\tcase DATAFORMAT_INT32_VEC4: writeData<int32>(L, startidx, 4, data); break;\n\n\t\tcase DATAFORMAT_UINT32:      writeData<uint32>(L, startidx, 1, data); break;\n\t\tcase DATAFORMAT_UINT32_VEC2: writeData<uint32>(L, startidx, 2, data); break;\n\t\tcase DATAFORMAT_UINT32_VEC3: writeData<uint32>(L, startidx, 3, data); break;\n\t\tcase DATAFORMAT_UINT32_VEC4: writeData<uint32>(L, startidx, 4, data); break;\n\n\t\tcase DATAFORMAT_SNORM8_VEC4: writeSNormData<int8>(L, startidx, 4, data); break;\n\t\tcase DATAFORMAT_UNORM8_VEC4: writeUNormData<uint8>(L, startidx, 4, data); break;\n\t\tcase DATAFORMAT_INT8_VEC4:   writeData<int8>(L, startidx, 4, data); break;\n\t\tcase DATAFORMAT_UINT8_VEC4:  writeData<uint8>(L, startidx, 4, data); break;\n\n\t\tcase DATAFORMAT_SNORM16_VEC2: writeSNormData<int16>(L, startidx, 2, data); break;\n\t\tcase DATAFORMAT_SNORM16_VEC4: writeSNormData<int16>(L, startidx, 4, data); break;\n\n\t\tcase DATAFORMAT_UNORM16_VEC2: writeUNormData<uint16>(L, startidx, 2, data); break;\n\t\tcase DATAFORMAT_UNORM16_VEC4: writeUNormData<uint16>(L, startidx, 4, data); break;\n\n\t\tcase DATAFORMAT_INT16_VEC2: writeData<int16>(L, startidx, 2, data); break;\n\t\tcase DATAFORMAT_INT16_VEC4: writeData<int16>(L, startidx, 4, data); break;\n\n\t\tcase DATAFORMAT_UINT16:      writeData<uint16>(L, startidx, 1, data); break;\n\t\tcase DATAFORMAT_UINT16_VEC2: writeData<uint16>(L, startidx, 2, data); break;\n\t\tcase DATAFORMAT_UINT16_VEC4: writeData<uint16>(L, startidx, 4, data); break;\n\n\t\tdefault: break;\n\t}\n}\n\ntemplate <typename T>\nstatic inline size_t readData(lua_State *L, int components, const char *data)\n{\n\tconst auto componentdata = (const T *) data;\n\n\tfor (int i = 0; i < components; i++)\n\t\tlua_pushnumber(L, (lua_Number) componentdata[i]);\n\n\treturn sizeof(T) * components;\n}\n\ntemplate <typename T>\nstatic inline size_t readSNormData(lua_State *L, int components, const char *data)\n{\n\tconst auto componentdata = (const T *) data;\n\tconstexpr auto maxval = std::numeric_limits<T>::max();\n\n\tfor (int i = 0; i < components; i++)\n\t\tlua_pushnumber(L, std::max(-1.0, (lua_Number) componentdata[i] / (lua_Number)maxval));\n\n\treturn sizeof(T) * components;\n}\n\ntemplate <typename T>\nstatic inline size_t readUNormData(lua_State *L, int components, const char *data)\n{\n\tconst auto componentdata = (const T *) data;\n\tconstexpr auto maxval = std::numeric_limits<T>::max();\n\n\tfor (int i = 0; i < components; i++)\n\t\tlua_pushnumber(L, (lua_Number) componentdata[i] / (lua_Number)maxval);\n\n\treturn sizeof(T) * components;\n}\n\nvoid luax_readbufferdata(lua_State *L, DataFormat format, const char *data)\n{\n\tswitch (format)\n\t{\n\t\tcase DATAFORMAT_FLOAT:      readData<float>(L, 1, data); break;\n\t\tcase DATAFORMAT_FLOAT_VEC2: readData<float>(L, 2, data); break;\n\t\tcase DATAFORMAT_FLOAT_VEC3: readData<float>(L, 3, data); break;\n\t\tcase DATAFORMAT_FLOAT_VEC4: readData<float>(L, 4, data); break;\n\n\t\tcase DATAFORMAT_INT32:      readData<int32>(L, 1, data); break;\n\t\tcase DATAFORMAT_INT32_VEC2: readData<int32>(L, 2, data); break;\n\t\tcase DATAFORMAT_INT32_VEC3: readData<int32>(L, 3, data); break;\n\t\tcase DATAFORMAT_INT32_VEC4: readData<int32>(L, 4, data); break;\n\n\t\tcase DATAFORMAT_UINT32:      readData<uint32>(L, 1, data); break;\n\t\tcase DATAFORMAT_UINT32_VEC2: readData<uint32>(L, 2, data); break;\n\t\tcase DATAFORMAT_UINT32_VEC3: readData<uint32>(L, 3, data); break;\n\t\tcase DATAFORMAT_UINT32_VEC4: readData<uint32>(L, 4, data); break;\n\n\t\tcase DATAFORMAT_SNORM8_VEC4: readSNormData<int8>(L, 4, data); break;\n\t\tcase DATAFORMAT_UNORM8_VEC4: readUNormData<uint8>(L, 4, data); break;\n\t\tcase DATAFORMAT_INT8_VEC4:   readData<int8>(L, 4, data); break;\n\t\tcase DATAFORMAT_UINT8_VEC4:  readData<uint8>(L, 4, data); break;\n\n\t\tcase DATAFORMAT_SNORM16_VEC2: readSNormData<int16>(L, 2, data); break;\n\t\tcase DATAFORMAT_SNORM16_VEC4: readSNormData<int16>(L, 4, data); break;\n\n\t\tcase DATAFORMAT_UNORM16_VEC2: readUNormData<uint16>(L, 2, data); break;\n\t\tcase DATAFORMAT_UNORM16_VEC4: readUNormData<uint16>(L, 4, data); break;\n\n\t\tcase DATAFORMAT_INT16_VEC2: readData<int16>(L, 2, data); break;\n\t\tcase DATAFORMAT_INT16_VEC4: readData<int16>(L, 4, data); break;\n\n\t\tcase DATAFORMAT_UINT16:      readData<uint16>(L, 1, data); break;\n\t\tcase DATAFORMAT_UINT16_VEC2: readData<uint16>(L, 2, data); break;\n\t\tcase DATAFORMAT_UINT16_VEC4: readData<uint16>(L, 4, data); break;\n\n\t\tdefault: break;\n\t}\n}\n\nBuffer *luax_checkbuffer(lua_State *L, int idx)\n{\n\treturn luax_checktype<Buffer>(L, idx);\n}\n\nstatic int w_Buffer_setArrayData(lua_State *L)\n{\n\tBuffer *t = luax_checkbuffer(L, 1);\n\n\tint sourceindex = (int) luaL_optnumber(L, 3, 1) - 1;\n\tint destindex = (int) luaL_optnumber(L, 4, 1) - 1;\n\n\tif (sourceindex < 0)\n\t\treturn luaL_error(L, \"Source start index must be at least 1.\");\n\n\tint count = -1;\n\tif (!lua_isnoneornil(L, 5))\n\t{\n\t\tcount = (int) luaL_checknumber(L, 5);\n\t\tif (count <= 0)\n\t\t\treturn luaL_error(L, \"Element count must be greater than 0.\");\n\t}\n\n\tsize_t stride = t->getArrayStride();\n\tsize_t bufferoffset = destindex * stride;\n\tint arraylength = (int) t->getArrayLength();\n\n\tif (destindex >= arraylength || destindex < 0)\n\t\treturn luaL_error(L, \"Invalid buffer start index (must be between 1 and %d)\", arraylength);\n\n\tif (luax_istype(L, 2, Data::type))\n\t{\n\t\tData *d = luax_checktype<Data>(L, 2);\n\n\t\tint dataarraylength = d->getSize() / stride;\n\n\t\tif (sourceindex >= dataarraylength)\n\t\t\treturn luaL_error(L, \"Invalid data start index (must be between 1 and %d)\", dataarraylength);\n\n\t\tint maxcount = std::min(dataarraylength - sourceindex, arraylength - destindex);\n\n\t\tif (count < 0)\n\t\t\tcount = maxcount;\n\n\t\tif (count > maxcount)\n\t\t\treturn luaL_error(L, \"Too many array elements (expected at most %d, got %d)\", maxcount, count);\n\n\t\tsize_t dataoffset = sourceindex * stride;\n\t\tsize_t datasize = std::min(d->getSize() - dataoffset, count * stride);\n\t\tconst void *sourcedata = (const uint8 *) d->getData() + dataoffset;\n\n\t\tt->fill(bufferoffset, datasize, sourcedata);\n\t\treturn 0;\n\t}\n\n\tconst std::vector<Buffer::DataMember> &members = t->getDataMembers();\n\n\tint ncomponents = 0;\n\tfor (const Buffer::DataMember &member : members)\n\t\tncomponents += member.info.components;\n\n\tluaL_checktype(L, 2, LUA_TTABLE);\n\tint tablelen = (int) luax_objlen(L, 2);\n\n\tlua_rawgeti(L, 2, 1);\n\tbool tableoftables = lua_istable(L, -1);\n\tlua_pop(L, 1);\n\n\tif (!tableoftables)\n\t{\n\t\tif (tablelen % ncomponents != 0)\n\t\t\treturn luaL_error(L, \"Array length in flat array variant of Buffer:setArrayData must be a multiple of the total number of components (%d)\", ncomponents);\n\t\ttablelen /= ncomponents;\n\t}\n\n\tif (sourceindex >= tablelen)\n\t\treturn luaL_error(L, \"Invalid data start index (must be between 1 and %d)\", tablelen);\n\n\tcount = count >= 0 ? std::min(count, tablelen - sourceindex) : tablelen - sourceindex;\n\n\tif (destindex + count > arraylength)\n\t\treturn luaL_error(L, \"Too many array elements (expected at most %d, got %d)\", arraylength - destindex, count);\n\n\tchar *data = (char *) t->map(Buffer::MAP_WRITE_INVALIDATE, bufferoffset, count * stride);\n\n\tif (tableoftables)\n\t{\n\t\tfor (int i = sourceindex; i < count; i++)\n\t\t{\n\t\t\t// get arraydata[index]\n\t\t\tlua_rawgeti(L, 2, i + 1);\n\t\t\tluaL_checktype(L, -1, LUA_TTABLE);\n\n\t\t\t// get arraydata[index][j]\n\t\t\tfor (int j = 1; j <= ncomponents; j++)\n\t\t\t\tlua_rawgeti(L, -j, j);\n\n\t\t\tint idx = -ncomponents;\n\n\t\t\tfor (const Buffer::DataMember &member : members)\n\t\t\t{\n\t\t\t\tluax_writebufferdata(L, idx, member.decl.format, data + member.offset);\n\t\t\t\tidx += member.info.components;\n\t\t\t}\n\n\t\t\tlua_pop(L, ncomponents + 1);\n\t\t\tdata += stride;\n\t\t}\n\t}\n\telse // Flat array\n\t{\n\t\tfor (int i = sourceindex; i < count; i++)\n\t\t{\n\t\t\t// get arraydata[arrayindex * ncomponents + componentindex]\n\t\t\tfor (int componentindex = 1; componentindex <= ncomponents; componentindex++)\n\t\t\t\tlua_rawgeti(L, 2, i * ncomponents + componentindex);\n\n\t\t\tint idx = -ncomponents;\n\n\t\t\tfor (const Buffer::DataMember &member : members)\n\t\t\t{\n\t\t\t\tluax_writebufferdata(L, idx, member.decl.format, data + member.offset);\n\t\t\t\tidx += member.info.components;\n\t\t\t}\n\n\t\t\tlua_pop(L, ncomponents);\n\t\t\tdata += stride;\n\t\t}\n\t}\n\n\tt->unmap(bufferoffset, count * stride);\n\n\treturn 0;\n}\n\nstatic int w_Buffer_clear(lua_State *L)\n{\n\tBuffer *t = luax_checkbuffer(L, 1);\n\tsize_t offset = 0;\n\tsize_t size = t->getSize();\n\tif (!lua_isnoneornil(L, 2))\n\t{\n\t\tlua_Number offsetp = luaL_checknumber(L, 2);\n\t\tlua_Number sizep = luaL_checknumber(L, 3);\n\t\tif (offsetp < 0 || sizep < 0)\n\t\t\treturn luaL_error(L, \"Offset and size parameters cannot be negative.\");\n\t\toffset = (size_t) offsetp;\n\t\tsize = (size_t) sizep;\n\t}\n\tluax_catchexcept(L, [&]() { t->clear(offset, size); });\n\treturn 0;\n}\n\nstatic int w_Buffer_getElementCount(lua_State *L)\n{\n\tBuffer *t = luax_checkbuffer(L, 1);\n\tlua_pushinteger(L, t->getArrayLength());\n\treturn 1;\n}\n\nstatic int w_Buffer_getElementStride(lua_State *L)\n{\n\tBuffer *t = luax_checkbuffer(L, 1);\n\tlua_pushinteger(L, t->getArrayStride());\n\treturn 1;\n}\n\nstatic int w_Buffer_getSize(lua_State *L)\n{\n\tBuffer *t = luax_checkbuffer(L, 1);\n\tlua_pushinteger(L, t->getSize());\n\treturn 1;\n}\n\nstatic int w_Buffer_getFormat(lua_State *L)\n{\n\tBuffer *t = luax_checkbuffer(L, 1);\n\tconst auto &members = t->getDataMembers();\n\n\tlua_createtable(L, (int) members.size(), 0);\n\n\tfor (size_t i = 0; i < members.size(); i++)\n\t{\n\t\tconst Buffer::DataMember &member = members[i];\n\n\t\tlua_createtable(L, 0, 4);\n\n\t\tlua_pushstring(L, member.decl.name.c_str());\n\t\tlua_setfield(L, -2, \"name\");\n\n\t\tconst char *formatstr = \"unknown\";\n\t\tgetConstant(member.decl.format, formatstr);\n\t\tlua_pushstring(L, formatstr);\n\t\tlua_setfield(L, -2, \"format\");\n\n\t\tlua_pushinteger(L, member.decl.arrayLength);\n\t\tlua_setfield(L, -2, \"arraylength\");\n\n\t\tlua_pushinteger(L, member.decl.bindingLocation);\n\t\tlua_setfield(L, -2, \"location\");\n\n\t\tlua_pushinteger(L, member.offset);\n\t\tlua_setfield(L, -2, \"offset\");\n\n\t\tlua_pushinteger(L, member.size);\n\t\tlua_setfield(L, -2, \"size\");\n\n\t\tlua_rawseti(L, -2, i + 1);\n\t}\n\n\treturn 1;\n}\n\nstatic int w_Buffer_isBufferType(lua_State *L)\n{\n\tBuffer *t = luax_checkbuffer(L, 1);\n\tBufferUsage bufferusage = BUFFERUSAGE_MAX_ENUM;\n\tconst char *typestr = luaL_checkstring(L, 2);\n\tif (!getConstant(typestr, bufferusage))\n\t\treturn luax_enumerror(L, \"buffer type\", getConstants(bufferusage), typestr);\n\tluax_pushboolean(L, (t->getUsageFlags() & (1 << bufferusage)) != 0);\n\treturn 1;\n}\n\nstatic int w_Buffer_getDebugName(lua_State *L)\n{\n\tBuffer *t = luax_checkbuffer(L, 1);\n\tconst std::string &debugName = t->getDebugName();\n\tif (debugName.empty())\n\t\tlua_pushnil(L);\n\telse\n\t\tluax_pushstring(L, debugName);\n\treturn 1;\n}\n\nstatic const luaL_Reg w_Buffer_functions[] =\n{\n\t{ \"setArrayData\", w_Buffer_setArrayData },\n\t{ \"clear\", w_Buffer_clear },\n\t{ \"getElementCount\", w_Buffer_getElementCount },\n\t{ \"getElementStride\", w_Buffer_getElementStride },\n\t{ \"getSize\", w_Buffer_getSize },\n\t{ \"getFormat\", w_Buffer_getFormat },\n\t{ \"isBufferType\", w_Buffer_isBufferType },\n\t{ \"getDebugName\", w_Buffer_getDebugName },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_graphicsbuffer(lua_State *L)\n{\n\treturn luax_register_type(L, &Buffer::type, w_Buffer_functions, nullptr);\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/wrap_Buffer.h",
    "content": "/**\n* Copyright (c) 2006-2026 LOVE Development Team\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n*\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n*\n* 1. The origin of this software must not be misrepresented; you must not\n*    claim that you wrote the original software. If you use this software\n*    in a product, an acknowledgment in the product documentation would be\n*    appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n*    misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n**/\n\n#pragma once\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"Buffer.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nvoid luax_writebufferdata(lua_State *L, int startidx, DataFormat format, char *data);\nvoid luax_readbufferdata(lua_State *L, DataFormat format, const char *data);\n\nBuffer *luax_checkbuffer(lua_State *L, int idx);\nextern \"C\" int luaopen_graphicsbuffer(lua_State *L);\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/wrap_Font.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"common/config.h\"\n#include \"wrap_Font.h\"\n\n// C++\n#include <algorithm>\n\nnamespace love\n{\nnamespace graphics\n{\n\nvoid luax_checkcoloredstring(lua_State *L, int idx, std::vector<love::font::ColoredString> &strings)\n{\n\tlove::font::ColoredString coloredstr;\n\tcoloredstr.color = Colorf(1.0f, 1.0f, 1.0f, 1.0f);\n\n\tif (lua_istable(L, idx))\n\t{\n\t\tint len = (int) luax_objlen(L, idx);\n\n\t\tfor (int i = 1; i <= len; i++)\n\t\t{\n\t\t\tlua_rawgeti(L, idx, i);\n\n\t\t\tif (lua_istable(L, -1))\n\t\t\t{\n\t\t\t\tfor (int j = 1; j <= 4; j++)\n\t\t\t\t\tlua_rawgeti(L, -j, j);\n\n\t\t\t\tcoloredstr.color.r = (float) luaL_checknumber(L, -4);\n\t\t\t\tcoloredstr.color.g = (float) luaL_checknumber(L, -3);\n\t\t\t\tcoloredstr.color.b = (float) luaL_checknumber(L, -2);\n\t\t\t\tcoloredstr.color.a = (float) luaL_optnumber(L, -1, 1.0);\n\n\t\t\t\tlua_pop(L, 4);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsize_t strl = 0;\n\t\t\t\tconst char *str = luaL_checklstring(L, -1, &strl);\n\t\t\t\tcoloredstr.str.assign(str, strl);\n\t\t\t\tstrings.push_back(coloredstr);\n\t\t\t}\n\n\t\t\tlua_pop(L, 1);\n\t\t}\n\t}\n\telse\n\t{\n\t\tsize_t strl = 0;\n\t\tconst char *str = luaL_checklstring(L, idx, &strl);\n\t\tcoloredstr.str.assign(str, strl);\n\t\tstrings.push_back(coloredstr);\n\t}\n}\n\nFont *luax_checkfont(lua_State *L, int idx)\n{\n\treturn luax_checktype<Font>(L, idx);\n}\n\nint w_Font_getHeight(lua_State *L)\n{\n\tFont *t = luax_checkfont(L, 1);\n\tlua_pushnumber(L, t->getHeight());\n\treturn 1;\n}\n\nint w_Font_getWidth(lua_State *L)\n{\n\tFont *t = luax_checkfont(L, 1);\n\tif (lua_type(L, 2) == LUA_TSTRING)\n\t{\n\t\tconst char *str = luaL_checkstring(L, 2);\n\t\tluax_catchexcept(L, [&](){ lua_pushinteger(L, t->getWidth(str)); });\n\t}\n\telse\n\t{\n\t\tuint32 glyph = (uint32) luaL_checknumber(L, 2);\n\t\tluax_catchexcept(L, [&](){ lua_pushinteger(L, t->getWidth(glyph)); });\n\t}\n\treturn 1;\n}\n\nint w_Font_getWrap(lua_State *L)\n{\n\tFont *t = luax_checkfont(L, 1);\n\n\tstd::vector<love::font::ColoredString> text;\n\tluax_checkcoloredstring(L, 2, text);\n\n\tfloat wrap = (float) luaL_checknumber(L, 3);\n\tfloat max_width = 0;\n\tstd::vector<std::string> lines;\n\tstd::vector<float> widths;\n\n\tluax_catchexcept(L, [&]() { t->getWrap(text, wrap, lines, &widths); });\n\n\tfor (float width : widths)\n\t\tmax_width = std::max(max_width, width);\n\n\tlua_pushnumber(L, max_width);\n\tlua_createtable(L, (int) lines.size(), 0);\n\n\tfor (int i = 0; i < (int) lines.size(); i++)\n\t{\n\t\tlua_pushstring(L, lines[i].c_str());\n\t\tlua_rawseti(L, -2, i + 1);\n\t}\n\n\treturn 2;\n}\n\nint w_Font_setLineHeight(lua_State *L)\n{\n\tFont *t = luax_checkfont(L, 1);\n\tfloat h = (float)luaL_checknumber(L, 2);\n\tt->setLineHeight(h);\n\treturn 0;\n}\n\nint w_Font_getLineHeight(lua_State *L)\n{\n\tFont *t = luax_checkfont(L, 1);\n\tlua_pushnumber(L, t->getLineHeight());\n\treturn 1;\n}\n\nint w_Font_setFilter(lua_State *L)\n{\n\tFont *t = luax_checkfont(L, 1);\n\tSamplerState s = t->getSamplerState();\n\n\tconst char *minstr = luaL_checkstring(L, 2);\n\tconst char *magstr = luaL_optstring(L, 3, minstr);\n\n\tif (!SamplerState::getConstant(minstr, s.minFilter))\n\t\treturn luax_enumerror(L, \"filter mode\", SamplerState::getConstants(s.minFilter), minstr);\n\tif (!SamplerState::getConstant(magstr, s.magFilter))\n\t\treturn luax_enumerror(L, \"filter mode\", SamplerState::getConstants(s.magFilter), magstr);\n\n\ts.maxAnisotropy = std::min(std::max(1, (int) luaL_optnumber(L, 4, 1.0)), LOVE_UINT8_MAX);\n\n\tluax_catchexcept(L, [&](){ t->setSamplerState(s); });\n\treturn 0;\n}\n\nint w_Font_getFilter(lua_State *L)\n{\n\tFont *t = luax_checkfont(L, 1);\n\tconst SamplerState &s = t->getSamplerState();\n\tconst char *minstr;\n\tconst char *magstr;\n\tSamplerState::getConstant(s.minFilter, minstr);\n\tSamplerState::getConstant(s.magFilter, magstr);\n\tlua_pushstring(L, minstr);\n\tlua_pushstring(L, magstr);\n\tlua_pushnumber(L, s.maxAnisotropy);\n\treturn 3;\n}\n\nint w_Font_getAscent(lua_State *L)\n{\n\tFont *t = luax_checkfont(L, 1);\n\tlua_pushnumber(L, t->getAscent());\n\treturn 1;\n}\n\nint w_Font_getDescent(lua_State *L)\n{\n\tFont *t = luax_checkfont(L, 1);\n\tlua_pushnumber(L, t->getDescent());\n\treturn 1;\n}\n\nint w_Font_getBaseline(lua_State *L)\n{\n\tFont *t = luax_checkfont(L, 1);\n\tlua_pushnumber(L, t->getBaseline());\n\treturn 1;\n}\n\nint w_Font_hasGlyphs(lua_State *L)\n{\n\tFont *t = luax_checkfont(L, 1);\n\tbool hasglyph = false;\n\n\tint count = std::max(lua_gettop(L) - 1, 1);\n\n\tluax_catchexcept(L, [&]() {\n\t\t for (int i = 2; i < count + 2; i++)\n\t\t {\n\t\t\t if (lua_type(L, i) == LUA_TSTRING)\n\t\t\t\t hasglyph = t->hasGlyphs(luax_checkstring(L, i));\n\t\t\t else\n\t\t\t\t hasglyph = t->hasGlyph((uint32) luaL_checknumber(L, i));\n\n\t\t\t if (!hasglyph)\n\t\t\t\t break;\n\t\t }\n\t});\n\n\tluax_pushboolean(L, hasglyph);\n\treturn 1;\n}\n\nint w_Font_getKerning(lua_State *L)\n{\n\tFont *t = luax_checkfont(L, 1);\n\tfloat kerning = 0.0f;\n\n\tluax_catchexcept(L, [&]() {\n\t\tif (lua_type(L, 2) == LUA_TSTRING)\n\t\t{\n\t\t\tstd::string left = luax_checkstring(L, 2);\n\t\t\tstd::string right = luax_checkstring(L, 3);\n\t\t\tkerning = t->getKerning(left, right);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tuint32 left = (uint32) luaL_checknumber(L, 2);\n\t\t\tuint32 right = (uint32) luaL_checknumber(L, 3);\n\t\t\tkerning = t->getKerning(left, right);\n\t\t}\n\t});\n\n\tlua_pushnumber(L, kerning);\n\treturn 1;\n}\n\nint w_Font_setFallbacks(lua_State *L)\n{\n\tFont *t = luax_checkfont(L, 1);\n\tstd::vector<graphics::Font *> fallbacks;\n\n\tfor (int i = 2; i <= lua_gettop(L); i++)\n\t\tfallbacks.push_back(luax_checkfont(L, i));\n\n\tluax_catchexcept(L, [&](){ t->setFallbacks(fallbacks); });\n\treturn 0;\n}\n\nint w_Font_getDPIScale(lua_State *L)\n{\n\tFont *t = luax_checkfont(L, 1);\n\tlua_pushnumber(L, t->getDPIScale());\n\treturn 1;\n}\n\nstatic const luaL_Reg w_Font_functions[] =\n{\n\t{ \"getHeight\", w_Font_getHeight },\n\t{ \"getWidth\", w_Font_getWidth },\n\t{ \"getWrap\", w_Font_getWrap },\n\t{ \"setLineHeight\", w_Font_setLineHeight },\n\t{ \"getLineHeight\", w_Font_getLineHeight },\n\t{ \"setFilter\", w_Font_setFilter },\n\t{ \"getFilter\", w_Font_getFilter },\n\t{ \"getAscent\", w_Font_getAscent },\n\t{ \"getDescent\", w_Font_getDescent },\n\t{ \"getBaseline\", w_Font_getBaseline },\n\t{ \"hasGlyphs\", w_Font_hasGlyphs },\n\t{ \"getKerning\", w_Font_getKerning },\n\t{ \"setFallbacks\", w_Font_setFallbacks },\n\t{ \"getDPIScale\", w_Font_getDPIScale },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_font(lua_State *L)\n{\n\treturn luax_register_type(L, &Font::type, w_Font_functions, nullptr);\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/wrap_Font.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"Font.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nFont *luax_checkfont(lua_State *L, int idx);\nvoid luax_checkcoloredstring(lua_State *L, int idx, std::vector<love::font::ColoredString> &strings);\nextern \"C\" int luaopen_font(lua_State *L);\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/wrap_Graphics.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"common/config.h\"\n#include \"wrap_Graphics.h\"\n#include \"Texture.h\"\n#include \"image/ImageData.h\"\n#include \"image/Image.h\"\n#include \"font/Rasterizer.h\"\n#include \"filesystem/Filesystem.h\"\n#include \"filesystem/wrap_Filesystem.h\"\n#include \"video/VideoStream.h\"\n#include \"image/wrap_Image.h\"\n#include \"common/Reference.h\"\n#include \"math/wrap_Transform.h\"\n#include \"thread/wrap_Channel.h\"\n\n#include \"opengl/Graphics.h\"\n\n#include <cassert>\n#include <cstring>\n#include <cstdlib>\n#include <sstream>\n\n#include <algorithm>\n\n// Shove the wrap_Graphics.lua code directly into a raw string literal.\nstatic const char graphics_lua[] =\n#include \"wrap_Graphics.lua\"\n;\n\nnamespace love\n{\nnamespace graphics\n{\n\n#define instance() (Module::getInstance<Graphics>(Module::M_GRAPHICS))\n\nstatic int luax_checkgraphicscreated(lua_State *L)\n{\n\tif (!instance()->isCreated())\n\t\treturn luaL_error(L, \"love.graphics cannot function without a window.\");\n\treturn 0;\n}\n\nint w_reset(lua_State *)\n{\n\tinstance()->reset();\n\treturn 0;\n}\n\nint w_clear(lua_State *L)\n{\n\tOptionalColorD color(ColorD(0.0, 0.0, 0.0, 0.0));\n\tstd::vector<OptionalColorD> colors;\n\n\tOptionalInt stencil(0);\n\tOptionalDouble depth(1.0);\n\n\tint argtype = lua_type(L, 1);\n\tint startidx = -1;\n\n\tif (argtype == LUA_TTABLE)\n\t{\n\t\tint maxn = lua_gettop(L);\n\t\tcolors.reserve(maxn);\n\n\t\tfor (int i = 0; i < maxn; i++)\n\t\t{\n\t\t\targtype = lua_type(L, i + 1);\n\n\t\t\tif (argtype == LUA_TNUMBER || argtype == LUA_TBOOLEAN)\n\t\t\t{\n\t\t\t\tstartidx = i + 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (argtype == LUA_TNIL || argtype == LUA_TNONE || luax_objlen(L, i + 1) == 0)\n\t\t\t{\n\t\t\t\tcolors.push_back(OptionalColorD());\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfor (int j = 1; j <= 4; j++)\n\t\t\t\tlua_rawgeti(L, i + 1, j);\n\n\t\t\tOptionalColorD c;\n\t\t\tc.hasValue = true;\n\t\t\tc.value.r = luaL_checknumber(L, -4);\n\t\t\tc.value.g = luaL_checknumber(L, -3);\n\t\t\tc.value.b = luaL_checknumber(L, -2);\n\t\t\tc.value.a = luaL_optnumber(L, -1, 1.0);\n\t\t\tcolors.push_back(c);\n\n\t\t\tlua_pop(L, 4);\n\t\t}\n\t}\n\telse if (argtype == LUA_TBOOLEAN)\n\t{\n\t\tcolor.hasValue = luax_toboolean(L, 1);\n\t\tstartidx = 2;\n\t}\n\telse if (argtype != LUA_TNONE && argtype != LUA_TNIL)\n\t{\n\t\tcolor.hasValue = true;\n\t\tcolor.value.r = (float) luaL_checknumber(L, 1);\n\t\tcolor.value.g = (float) luaL_checknumber(L, 2);\n\t\tcolor.value.b = (float) luaL_checknumber(L, 3);\n\t\tcolor.value.a = (float) luaL_optnumber(L, 4, 1.0);\n\t\tstartidx = 5;\n\t}\n\n\tif (startidx >= 0)\n\t{\n\t\targtype = lua_type(L, startidx);\n\t\tif (argtype == LUA_TBOOLEAN)\n\t\t\tstencil.hasValue = luax_toboolean(L, startidx);\n\t\telse if (argtype == LUA_TNUMBER)\n\t\t\tstencil.value = (int) luaL_checkinteger(L, startidx);\n\n\t\targtype = lua_type(L, startidx + 1);\n\t\tif (argtype == LUA_TBOOLEAN)\n\t\t\tdepth.hasValue = luax_toboolean(L, startidx + 1);\n\t\telse if (argtype == LUA_TNUMBER)\n\t\t\tdepth.value = luaL_checknumber(L, startidx + 1);\n\t}\n\n\tif (colors.empty())\n\t\tluax_catchexcept(L, [&]() { instance()->clear(color, stencil, depth); });\n\telse\n\t\tluax_catchexcept(L, [&]() { instance()->clear(colors, stencil, depth); });\n\n\treturn 0;\n}\n\nint w_discard(lua_State *L)\n{\n\tstd::vector<bool> colorbuffers;\n\n\tif (lua_istable(L, 1))\n\t{\n\t\tfor (size_t i = 1; i <= luax_objlen(L, 1); i++)\n\t\t{\n\t\t\tlua_rawgeti(L, 1, i);\n\t\t\tcolorbuffers.push_back(luax_optboolean(L, -1, true));\n\t\t\tlua_pop(L, 1);\n\t\t}\n\t}\n\telse\n\t{\n\t\tbool discardcolor = luax_optboolean(L, 1, true);\n\t\tsize_t numbuffers = std::max((size_t) 1, instance()->getRenderTargets().colors.size());\n\t\tcolorbuffers = std::vector<bool>(numbuffers, discardcolor);\n\t}\n\n\tbool depthstencil = luax_optboolean(L, 2, true);\n\tinstance()->discard(colorbuffers, depthstencil);\n\treturn 0;\n}\n\nint w_present(lua_State *L)\n{\n\tluax_catchexcept(L, [&]() { instance()->present(L); });\n\treturn 0;\n}\n\nint w_isCreated(lua_State *L)\n{\n\tluax_pushboolean(L, instance()->isCreated());\n\treturn 1;\n}\n\nint w_isActive(lua_State *L)\n{\n\tluax_pushboolean(L, instance()->isActive());\n\treturn 1;\n}\n\nint w_isGammaCorrect(lua_State *L)\n{\n\tluax_pushboolean(L, graphics::isGammaCorrect());\n\treturn 1;\n}\n\nint w_isLowPowerPreferred(lua_State *L)\n{\n\tluax_pushboolean(L, graphics::isLowPowerPreferred());\n\treturn 1;\n}\n\nint w_getWidth(lua_State *L)\n{\n\tlua_pushinteger(L, instance()->getWidth());\n\treturn 1;\n}\n\nint w_getHeight(lua_State *L)\n{\n\tlua_pushinteger(L, instance()->getHeight());\n\treturn 1;\n}\n\nint w_getDimensions(lua_State *L)\n{\n\tlua_pushinteger(L, instance()->getWidth());\n\tlua_pushinteger(L, instance()->getHeight());\n\treturn 2;\n}\n\nint w_getPixelWidth(lua_State *L)\n{\n\tlua_pushinteger(L, instance()->getPixelWidth());\n\treturn 1;\n}\n\nint w_getPixelHeight(lua_State *L)\n{\n\tlua_pushinteger(L, instance()->getPixelHeight());\n\treturn 1;\n}\n\nint w_getPixelDimensions(lua_State *L)\n{\n\tlua_pushinteger(L, instance()->getPixelWidth());\n\tlua_pushinteger(L, instance()->getPixelHeight());\n\treturn 2;\n}\n\nint w_getDPIScale(lua_State *L)\n{\n\tlua_pushnumber(L, instance()->getScreenDPIScale());\n\treturn 1;\n}\n\nint w_getQuadIndexBuffer(lua_State *L)\n{\n\tluax_pushtype(L, instance()->getQuadIndexBuffer());\n\treturn 1;\n}\n\nstatic Graphics::RenderTarget checkRenderTarget(lua_State *L, int idx)\n{\n\tlua_rawgeti(L, idx, 1);\n\tGraphics::RenderTarget target(luax_checktexture(L, -1), 0);\n\tlua_pop(L, 1);\n\n\tTextureType type = target.texture->getTextureType();\n\tif (type == TEXTURE_2D_ARRAY || type == TEXTURE_VOLUME)\n\t\ttarget.slice = luax_checkintflag(L, idx, \"layer\") - 1;\n\telse if (type == TEXTURE_CUBE)\n\t\ttarget.slice = luax_checkintflag(L, idx, \"face\") - 1;\n\n\ttarget.mipmap = luax_intflag(L, idx, \"mipmap\", 1) - 1;\n\n\treturn target;\n}\n\nint w_setCanvas(lua_State *L)\n{\n\t// called with none -> reset to default buffer\n\tif (lua_isnoneornil(L, 1))\n\t{\n\t\tinstance()->setRenderTarget();\n\t\treturn 0;\n\t}\n\n\tbool is_table = lua_istable(L, 1);\n\tGraphics::RenderTargets targets;\n\n\tif (is_table)\n\t{\n\t\tlua_rawgeti(L, 1, 1);\n\t\tbool table_of_tables = lua_istable(L, -1);\n\t\tlua_pop(L, 1);\n\n\t\tfor (int i = 1; i <= (int) luax_objlen(L, 1); i++)\n\t\t{\n\t\t\tlua_rawgeti(L, 1, i);\n\n\t\t\tif (table_of_tables)\n\t\t\t\ttargets.colors.push_back(checkRenderTarget(L, -1));\n\t\t\telse\n\t\t\t{\n\t\t\t\ttargets.colors.emplace_back(luax_checktexture(L, -1), 0);\n\n\t\t\t\tif (targets.colors.back().texture->getTextureType() != TEXTURE_2D)\n\t\t\t\t\treturn luaL_error(L, \"Non-2D textures must use the table-of-tables variant of setCanvas.\");\n\t\t\t}\n\n\t\t\tlua_pop(L, 1);\n\t\t}\n\n\t\tuint32 tempdepthflag   = Graphics::TEMPORARY_RT_DEPTH;\n\t\tuint32 tempstencilflag = Graphics::TEMPORARY_RT_STENCIL;\n\n\t\tlua_getfield(L, 1, \"depthstencil\");\n\t\tint dstype = lua_type(L, -1);\n\t\tif (dstype == LUA_TTABLE)\n\t\t\ttargets.depthStencil = checkRenderTarget(L, -1);\n\t\telse if (dstype == LUA_TBOOLEAN)\n\t\t\ttargets.temporaryRTFlags |= luax_toboolean(L, -1) ? (tempdepthflag | tempstencilflag) : 0;\n\t\telse if (dstype != LUA_TNONE && dstype != LUA_TNIL)\n\t\t\ttargets.depthStencil.texture = luax_checktexture(L, -1);\n\t\tlua_pop(L, 1);\n\n\t\tif (targets.depthStencil.texture == nullptr && (targets.temporaryRTFlags & tempdepthflag) == 0)\n\t\t\ttargets.temporaryRTFlags |= luax_boolflag(L, 1, \"depth\", false) ? tempdepthflag : 0;\n\n\t\tif (targets.depthStencil.texture == nullptr && (targets.temporaryRTFlags & tempstencilflag) == 0)\n\t\t\ttargets.temporaryRTFlags |= luax_boolflag(L, 1, \"stencil\", false) ? tempstencilflag : 0;\n\t}\n\telse\n\t{\n\t\tfor (int i = 1; i <= lua_gettop(L); i++)\n\t\t{\n\t\t\tGraphics::RenderTarget target(luax_checktexture(L, i), 0);\n\t\t\tTextureType type = target.texture->getTextureType();\n\n\t\t\tif (i == 1 && type != TEXTURE_2D)\n\t\t\t{\n\t\t\t\ttarget.slice = (int) luaL_checkinteger(L, i + 1) - 1;\n\t\t\t\ttarget.mipmap = (int) luaL_optinteger(L, i + 2, 1) - 1;\n\t\t\t\ttargets.colors.push_back(target);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (type == TEXTURE_2D && lua_isnumber(L, i + 1))\n\t\t\t{\n\t\t\t\ttarget.mipmap = (int) luaL_optinteger(L, i + 1, 1) - 1;\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t\tif (i > 1 && type != TEXTURE_2D)\n\t\t\t\treturn luaL_error(L, \"This variant of setCanvas only supports 2D texture types.\");\n\n\t\t\ttargets.colors.push_back(target);\n\t\t}\n\t}\n\n\tluax_catchexcept(L, [&]() {\n\t\tif (targets.getFirstTarget().texture != nullptr)\n\t\t\tinstance()->setRenderTargets(targets);\n\t\telse\n\t\t\tinstance()->setRenderTarget();\n\t});\n\t\n\treturn 0;\n}\n\nstatic void pushRenderTarget(lua_State *L, const Graphics::RenderTarget &rt)\n{\n\tlua_createtable(L, 1, 2);\n\n\tluax_pushtype(L, rt.texture);\n\tlua_rawseti(L, -2, 1);\n\n\tTextureType type = rt.texture->getTextureType();\n\n\tif (type == TEXTURE_2D_ARRAY || type == TEXTURE_VOLUME)\n\t{\n\t\tlua_pushnumber(L, rt.slice + 1);\n\t\tlua_setfield(L, -2, \"layer\");\n\t}\n\telse if (type == TEXTURE_CUBE)\n\t{\n\t\tlua_pushnumber(L, rt.slice + 1);\n\t\tlua_setfield(L, -2, \"face\");\n\t}\n\n\tlua_pushnumber(L, rt.mipmap + 1);\n\tlua_setfield(L, -2, \"mipmap\");\n}\n\nint w_getCanvas(lua_State *L)\n{\n\tGraphics::RenderTargets targets = instance()->getRenderTargets();\n\tint ntargets = (int) targets.colors.size();\n\n\tif (ntargets == 0)\n\t{\n\t\tlua_pushnil(L);\n\t\treturn 1;\n\t}\n\n\tbool shouldUseTablesVariant = targets.depthStencil.texture != nullptr;\n\n\tif (!shouldUseTablesVariant)\n\t{\n\t\tfor (const auto &rt : targets.colors)\n\t\t{\n\t\t\tif (rt.mipmap != 0 || rt.texture->getTextureType() != TEXTURE_2D)\n\t\t\t{\n\t\t\t\tshouldUseTablesVariant = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (shouldUseTablesVariant)\n\t{\n\t\tlua_createtable(L, ntargets, 0);\n\n\t\tfor (int i = 0; i < ntargets; i++)\n\t\t{\n\t\t\tpushRenderTarget(L, targets.colors[i]);\n\t\t\tlua_rawseti(L, -2, i + 1);\n\t\t}\n\n\t\tif (targets.depthStencil.texture != nullptr)\n\t\t{\n\t\t\tpushRenderTarget(L, targets.depthStencil);\n\t\t\tlua_setfield(L, -2, \"depthstencil\");\n\t\t}\n\n\t\treturn 1;\n\t}\n\telse\n\t{\n\t\tfor (const auto &rt : targets.colors)\n\t\t\tluax_pushtype(L, rt.texture);\n\n\t\treturn ntargets;\n\t}\n}\n\nstatic void screenshotFunctionCallback(const Graphics::ScreenshotInfo *info, love::image::ImageData *i, void *gd)\n{\n\tif (info == nullptr)\n\t\treturn;\n\n\tlua_State *L = (lua_State *) gd;\n\tReference *ref = (Reference *) info->data;\n\n\tif (i != nullptr && L != nullptr)\n\t{\n\t\tif (ref == nullptr)\n\t\t\tluaL_error(L, \"Internal error in screenshot callback.\");\n\n\t\tref->push(L);\n\t\tdelete ref;\n\t\tluax_pushtype(L, i);\n\t\tlua_call(L, 1, 0);\n\t}\n\telse\n\t\tdelete ref;\n}\n\nstruct ScreenshotFileInfo\n{\n\tstd::string filename;\n\timage::FormatHandler::EncodedFormat format;\n};\n\nstatic void screenshotFileCallback(const Graphics::ScreenshotInfo *info, love::image::ImageData *i, void * /*gd*/)\n{\n\tif (info == nullptr)\n\t\treturn;\n\n\tScreenshotFileInfo *fileinfo = (ScreenshotFileInfo *) info->data;\n\n\tif (i != nullptr && fileinfo != nullptr)\n\t{\n\t\ttry\n\t\t{\n\t\t\ti->encode(fileinfo->format, fileinfo->filename.c_str(), true);\n\t\t}\n\t\tcatch (love::Exception &e)\n\t\t{\n\t\t\tprintf(\"Screenshot encoding or saving failed: %s\", e.what());\n\t\t\t// Do nothing...\n\t\t}\n\t}\n\n\tdelete fileinfo;\n}\n\nstatic void screenshotChannelCallback(const Graphics::ScreenshotInfo *info, love::image::ImageData *i, void * /*gd*/)\n{\n\tif (info == nullptr)\n\t\treturn;\n\n\tauto *channel = (love::thread::Channel *) info->data;\n\n\tif (channel != nullptr)\n\t{\n\t\tif (i != nullptr)\n\t\t\tchannel->push(Variant(&love::image::ImageData::type, i));\n\n\t\tchannel->release();\n\t}\n}\n\nint w_captureScreenshot(lua_State *L)\n{\n\tGraphics::ScreenshotInfo info;\n\n\tif (lua_isfunction(L, 1))\n\t{\n\t\tlua_pushvalue(L, 1);\n\t\tinfo.data = luax_refif(L, LUA_TFUNCTION);\n\t\tlua_pop(L, 1);\n\t\tinfo.callback = screenshotFunctionCallback;\n\t}\n\telse if (lua_isstring(L, 1))\n\t{\n\t\tstd::string filename = luax_checkstring(L, 1);\n\t\tstd::string ext;\n\n\t\tsize_t dotpos = filename.rfind('.');\n\n\t\tif (dotpos != std::string::npos)\n\t\t\text = filename.substr(dotpos + 1);\n\n\t\tstd::transform(ext.begin(), ext.end(), ext.begin(), tolower);\n\n\t\timage::FormatHandler::EncodedFormat format;\n\t\tif (!image::ImageData::getConstant(ext.c_str(), format))\n\t\t\treturn luax_enumerror(L, \"encoded image format\", image::ImageData::getConstants(format), ext.c_str());\n\n\t\tScreenshotFileInfo *fileinfo = new ScreenshotFileInfo;\n\t\tfileinfo->filename = filename;\n\t\tfileinfo->format = format;\n\n\t\tinfo.data = fileinfo;\n\t\tinfo.callback = screenshotFileCallback;\n\t}\n\telse if (luax_istype(L, 1, love::thread::Channel::type))\n\t{\n\t\tauto *channel = love::thread::luax_checkchannel(L, 1);\n\t\tchannel->retain();\n\t\tinfo.data = channel;\n\t\tinfo.callback = screenshotChannelCallback;\n\t}\n\telse\n\t\treturn luax_typerror(L, 1, \"function, string, or Channel\");\n\n\tluax_catchexcept(L,\n\t\t[&]() { instance()->captureScreenshot(info); },\n\t\t[&](bool except) { if (except) info.callback(&info, nullptr, nullptr); }\n\t);\n\n\treturn 0;\n}\n\nint w_setScissor(lua_State *L)\n{\n\tint nargs = lua_gettop(L);\n\n\tif (nargs == 0 || (nargs == 4 && lua_isnil(L, 1) && lua_isnil(L, 2)\n\t\t&& lua_isnil(L, 3) && lua_isnil(L, 4)))\n\t{\n\t\tinstance()->setScissor();\n\t\treturn 0;\n\t}\n\n\tRect rect;\n\trect.x = (int) luaL_checkinteger(L, 1);\n\trect.y = (int) luaL_checkinteger(L, 2);\n\trect.w = (int) luaL_checkinteger(L, 3);\n\trect.h = (int) luaL_checkinteger(L, 4);\n\n\tif (rect.w < 0 || rect.h < 0)\n\t\treturn luaL_error(L, \"Can't set scissor with negative width and/or height.\");\n\n\tinstance()->setScissor(rect);\n\treturn 0;\n}\n\nint w_intersectScissor(lua_State *L)\n{\n\tRect rect;\n\trect.x = (int) luaL_checkinteger(L, 1);\n\trect.y = (int) luaL_checkinteger(L, 2);\n\trect.w = (int) luaL_checkinteger(L, 3);\n\trect.h = (int) luaL_checkinteger(L, 4);\n\n\tif (rect.w < 0 || rect.h < 0)\n\t\treturn luaL_error(L, \"Can't set scissor with negative width and/or height.\");\n\n\tinstance()->intersectScissor(rect);\n\treturn 0;\n}\n\nint w_getScissor(lua_State *L)\n{\n\tRect rect;\n\tif (!instance()->getScissor(rect))\n\t\treturn 0;\n\n\tlua_pushinteger(L, rect.x);\n\tlua_pushinteger(L, rect.y);\n\tlua_pushinteger(L, rect.w);\n\tlua_pushinteger(L, rect.h);\n\n\treturn 4;\n}\n\nint w_setStencilMode(lua_State *L)\n{\n\tif (lua_gettop(L) <= 1 && lua_isnoneornil(L, 1))\n\t{\n\t\tluax_catchexcept(L, [&]() { instance()->setStencilMode(); });\n\t\treturn 0;\n\t}\n\n\tStencilMode mode = STENCIL_MODE_OFF;\n\tconst char *modestr = luaL_checkstring(L, 1);\n\tif (!getConstant(modestr, mode))\n\t\treturn luax_enumerror(L, \"stencil mode\", getConstants(mode), modestr);\n\n\tint value = (int) luaL_optinteger(L, 2, 1);\n\n\tluax_catchexcept(L, [&]() { instance()->setStencilMode(mode, value); });\n\treturn 0;\n}\n\nint w_getStencilMode(lua_State *L)\n{\n\tint value = 0;\n\tStencilMode mode = instance()->getStencilMode(value);\n\n\tconst char *modestr;\n\tif (!getConstant(mode, modestr))\n\t\treturn luaL_error(L, \"Unknown stencil mode.\");\n\n\tlua_pushstring(L, modestr);\n\tlua_pushinteger(L, value);\n\treturn 2;\n}\n\nint w_setStencilState(lua_State *L)\n{\n\tif (lua_gettop(L) <= 1 && lua_isnoneornil(L, 1))\n\t{\n\t\tluax_catchexcept(L, [&](){ instance()->setStencilState(); });\n\t\treturn 0;\n\t}\n\n\tStencilState s;\n\n\tconst char *actionstr = luaL_checkstring(L, 1);\n\tif (!getConstant(actionstr, s.action))\n\t\treturn luax_enumerror(L, \"stencil draw action\", getConstants(s.action), actionstr);\n\n\tconst char *comparestr = luaL_checkstring(L, 2);\n\tif (!getConstant(comparestr, s.compare))\n\t\treturn luax_enumerror(L, \"compare mode\", getConstants(s.compare), comparestr);\n\n\ts.value = (int) luaL_optinteger(L, 3, 0);\n\ts.readMask = (uint32) luaL_optnumber(L, 4, LOVE_UINT32_MAX);\n\ts.writeMask = (uint32) luaL_optnumber(L, 5, LOVE_UINT32_MAX);\n\n\tluax_catchexcept(L, [&](){ instance()->setStencilState(s); });\n\treturn 0;\n}\n\nint w_getStencilState(lua_State *L)\n{\n\tconst StencilState &s = instance()->getStencilState();\n\n\tconst char *actionstr;\n\tif (!getConstant(s.action, actionstr))\n\t\treturn luaL_error(L, \"Unknown stencil draw action.\");\n\n\tconst char *comparestr;\n\tif (!getConstant(s.compare, comparestr))\n\t\treturn luaL_error(L, \"Unknown compare mode.\");\n\n\tlua_pushstring(L, actionstr);\n\tlua_pushstring(L, comparestr);\n\tlua_pushinteger(L, s.value);\n\tlua_pushnumber(L, s.readMask);\n\tlua_pushnumber(L, s.writeMask);\n\treturn 5;\n}\n\nstatic void parseDPIScale(Data *d, float *dpiscale)\n{\n\tauto fd = dynamic_cast<love::filesystem::FileData *>(d);\n\tif (fd == nullptr)\n\t\treturn;\n\n\t// Parse a density scale of 2.0 from \"image@2x.png\".\n\tconst std::string &fname = fd->getName();\n\n\tsize_t namelen = fname.length();\n\tsize_t atpos = fname.rfind('@');\n\n\tif (atpos != std::string::npos && atpos + 2 < namelen\n\t\t&& (fname[namelen - 1] == 'x' || fname[namelen - 1] == 'X'))\n\t{\n\t\tchar *end = nullptr;\n\t\tlong density = strtol(fname.c_str() + atpos + 1, &end, 10);\n\t\tif (end != nullptr && density > 0 && dpiscale != nullptr)\n\t\t\t*dpiscale = (float) density;\n\t}\n}\n\nstatic std::pair<StrongRef<image::ImageData>, StrongRef<image::CompressedImageData>>\ngetImageData(lua_State *L, int idx, bool allowcompressed, float *dpiscale)\n{\n\tStrongRef<image::ImageData> idata;\n\tStrongRef<image::CompressedImageData> cdata;\n\n\tif (luax_istype(L, idx, image::ImageData::type))\n\t\tidata.set(image::luax_checkimagedata(L, idx));\n\telse if (luax_istype(L, idx, image::CompressedImageData::type))\n\t\tcdata.set(image::luax_checkcompressedimagedata(L, idx));\n\telse if (filesystem::luax_cangetdata(L, idx))\n\t{\n\t\t// Convert to ImageData / CompressedImageData.\n\t\tauto imagemodule = Module::getInstance<image::Image>(Module::M_IMAGE);\n\t\tif (imagemodule == nullptr)\n\t\t\tluaL_error(L, \"Cannot load images without the love.image module.\");\n\n\t\tStrongRef<Data> fdata(filesystem::luax_getdata(L, idx), Acquire::NORETAIN);\n\n\t\tif (dpiscale != nullptr)\n\t\t\tparseDPIScale(fdata, dpiscale);\n\n\t\tif (allowcompressed && imagemodule->isCompressed(fdata))\n\t\t\tluax_catchexcept(L, [&]() { cdata.set(imagemodule->newCompressedData(fdata), Acquire::NORETAIN); });\n\t\telse\n\t\t\tluax_catchexcept(L, [&]() { idata.set(imagemodule->newImageData(fdata), Acquire::NORETAIN); });\n\t}\n\telse\n\t\tidata.set(image::luax_checkimagedata(L, idx));\n\n\treturn std::make_pair(idata, cdata);\n}\n\nstatic int w__pushNewTexture(lua_State *L, Texture::Slices *slices, const Texture::Settings &settings)\n{\n\tStrongRef<Texture> i;\n\tluax_catchexcept(L,\n\t\t[&]() { i.set(instance()->newTexture(settings, slices), Acquire::NORETAIN); },\n\t\t[&](bool) { if (slices) slices->clear(); }\n\t);\n\n\tluax_pushtype(L, i);\n\treturn 1;\n}\n\nstatic void luax_checktexturesettings(lua_State *L, int idx, bool opt, bool checkType, bool checkDimensions, OptionalBool forceRenderTarget, Texture::Settings &s, bool &setdpiscale)\n{\n\tsetdpiscale = false;\n\tif (forceRenderTarget.hasValue)\n\t\ts.renderTarget = forceRenderTarget.value;\n\n\tif (opt && lua_isnoneornil(L, idx))\n\t\treturn;\n\n\tluax_checktablefields<Texture::SettingType>(L, idx, \"texture setting name\", Texture::getConstant);\n\n\tif (!forceRenderTarget.hasValue)\n\t\ts.renderTarget = luax_boolflag(L, idx, Texture::getConstant(Texture::SETTING_RENDER_TARGET), s.renderTarget);\n\n\tlua_getfield(L, idx, Texture::getConstant(Texture::SETTING_DEBUGNAME));\n\tif (!lua_isnoneornil(L, -1))\n\t{\n\t\ts.debugName = luaL_checkstring(L, -1);\n\t}\n\tlua_pop(L, 1);\n\n\tlua_getfield(L, idx, Texture::getConstant(Texture::SETTING_FORMAT));\n\tif (!lua_isnoneornil(L, -1))\n\t{\n\t\tconst char *str = luaL_checkstring(L, -1);\n\t\tif (!getConstant(str, s.format))\n\t\t\tluax_enumerror(L, \"pixel format\", str);\n\t}\n\tlua_pop(L, 1);\n\n\tif (checkType)\n\t{\n\t\tlua_getfield(L, idx, Texture::getConstant(Texture::SETTING_TYPE));\n\t\tif (!lua_isnoneornil(L, -1))\n\t\t{\n\t\t\tconst char *str = luaL_checkstring(L, -1);\n\t\t\tif (!Texture::getConstant(str, s.type))\n\t\t\t\tluax_enumerror(L, \"texture type\", Texture::getConstants(s.type), str);\n\t\t}\n\t\tlua_pop(L, 1);\n\t}\n\n\tif (checkDimensions)\n\t{\n\t\ts.width = luax_checkintflag(L, idx, Texture::getConstant(Texture::SETTING_WIDTH));\n\t\ts.height = luax_checkintflag(L, idx, Texture::getConstant(Texture::SETTING_HEIGHT));\n\t\tif (s.type == TEXTURE_2D_ARRAY || s.type == TEXTURE_VOLUME)\n\t\t\ts.layers = luax_checkintflag(L, idx, Texture::getConstant(Texture::SETTING_LAYERS));\n\t}\n\telse\n\t{\n\t\ts.width = luax_intflag(L, idx, Texture::getConstant(Texture::SETTING_WIDTH), s.width);\n\t\ts.height = luax_intflag(L, idx, Texture::getConstant(Texture::SETTING_HEIGHT), s.height);\n\t\tif (s.type == TEXTURE_2D_ARRAY || s.type == TEXTURE_VOLUME)\n\t\t\ts.layers = luax_intflag(L, idx, Texture::getConstant(Texture::SETTING_LAYERS), s.layers);\n\t}\n\n\tlua_getfield(L, idx, Texture::getConstant(Texture::SETTING_MIPMAPS));\n\tif (!lua_isnoneornil(L, -1))\n\t{\n\t\tif (lua_type(L, -1) == LUA_TBOOLEAN)\n\t\t\ts.mipmaps = luax_toboolean(L, -1) ? Texture::MIPMAPS_MANUAL : Texture::MIPMAPS_NONE;\n\t\telse\n\t\t{\n\t\t\tconst char *str = luaL_checkstring(L, -1);\n\t\t\tif (!Texture::getConstant(str, s.mipmaps))\n\t\t\t\tluax_enumerror(L, \"Texture mipmap mode\", Texture::getConstants(s.mipmaps), str);\n\t\t}\n\t}\n\tlua_pop(L, 1);\n\n\tlua_getfield(L, idx, Texture::getConstant(Texture::SETTING_MIPMAP_COUNT));\n\tif (!lua_isnoneornil(L, -1))\n\t\ts.mipmapCount = (int) luaL_checkinteger(L, -1);\n\tlua_pop(L, 1);\n\n\ts.linear = luax_boolflag(L, idx, Texture::getConstant(Texture::SETTING_LINEAR), s.linear);\n\ts.msaa = luax_intflag(L, idx, Texture::getConstant(Texture::SETTING_MSAA), s.msaa);\n\n\ts.computeWrite = luax_boolflag(L, idx, Texture::getConstant(Texture::SETTING_COMPUTE_WRITE), s.computeWrite);\n\n\tlua_getfield(L, idx, Texture::getConstant(Texture::SETTING_VIEW_FORMATS));\n\tif (!lua_isnoneornil(L, -1))\n\t{\n\t\tif (lua_type(L, -1) != LUA_TTABLE)\n\t\t\tluaL_argerror(L, idx, \"expected field 'viewformats' to be a table type\");\n\n\t\tfor (int i = 1; i <= (int)luax_objlen(L, -1); i++)\n\t\t{\n\t\t\tlua_rawgeti(L, -1, i);\n\t\t\tconst char *str = luaL_checkstring(L, -1);\n\t\t\tPixelFormat viewformat = PIXELFORMAT_UNKNOWN;\n\t\t\tif (!getConstant(str, viewformat))\n\t\t\t\tluax_enumerror(L, \"pixel format\", str);\n\t\t\ts.viewFormats.push_back(viewformat);\n\t\t\tlua_pop(L, 1);\n\t\t}\n\t}\n\tlua_pop(L, 1);\n\n\tlua_getfield(L, idx, Texture::getConstant(Texture::SETTING_READABLE));\n\tif (!lua_isnoneornil(L, -1))\n\t\ts.readable.set(luax_checkboolean(L, -1));\n\tlua_pop(L, 1);\n\n\tlua_getfield(L, idx, Texture::getConstant(Texture::SETTING_DPI_SCALE));\n\tif (lua_isnumber(L, -1))\n\t{\n\t\ts.dpiScale = (float) lua_tonumber(L, -1);\n\t\tsetdpiscale = true;\n\t}\n\tlua_pop(L, 1);\n}\n\nint w_newCanvas(lua_State *L)\n{\n\tluax_checkgraphicscreated(L);\n\n\tTexture::Settings s;\n\n\tOptionalBool forceRenderTarget(true);\n\tbool setDPIScale = false;\n\n\tif (lua_istable(L, 1))\n\t{\n\t\tluax_checktexturesettings(L, 1, false, true, true, forceRenderTarget, s, setDPIScale);\n\t}\n\telse\n\t{\n\t\t// check if width and height are given. else default to screen dimensions.\n\t\ts.width  = (int) luaL_optinteger(L, 1, instance()->getWidth());\n\t\ts.height = (int) luaL_optinteger(L, 2, instance()->getHeight());\n\n\t\tint startidx = 3;\n\n\t\tif (lua_isnumber(L, 3))\n\t\t{\n\t\t\ts.layers = (int) luaL_checkinteger(L, 3);\n\t\t\ts.type = TEXTURE_2D_ARRAY;\n\t\t\tstartidx = 4;\n\t\t}\n\n\t\tluax_checktexturesettings(L, startidx, true, true, false, forceRenderTarget, s, setDPIScale);\n\t}\n\n\t// Default to the screen's current pixel density scale.\n\tif (!setDPIScale)\n\t\ts.dpiScale = instance()->getScreenDPIScale();\n\n\tTexture *texture = nullptr;\n\tluax_catchexcept(L, [&](){ texture = instance()->newTexture(s); });\n\n\tluax_pushtype(L, texture);\n\ttexture->release();\n\treturn 1;\n}\n\nint w_newTexture(lua_State *L)\n{\n\tluax_checkgraphicscreated(L);\n\n\tTexture::Slices slices(TEXTURE_2D);\n\tTexture::Slices *slicesref = &slices;\n\n\tTexture::Settings settings;\n\tsettings.type = TEXTURE_2D;\n\tbool dpiscaleset = false;\n\n\tif (lua_type(L, 1) == LUA_TNUMBER)\n\t{\n\t\tslicesref = nullptr;\n\n\t\tsettings.width = (int) luaL_checkinteger(L, 1);\n\t\tsettings.height = (int) luaL_checkinteger(L, 2);\n\n\t\tint startidx = 3;\n\n\t\tif (lua_type(L, 3) == LUA_TNUMBER)\n\t\t{\n\t\t\tsettings.layers = (int) luaL_checkinteger(L, 3);\n\t\t\tsettings.type = TEXTURE_2D_ARRAY;\n\t\t\tstartidx = 4;\n\t\t}\n\n\t\tluax_checktexturesettings(L, startidx, true, true, false, OptionalBool(), settings, dpiscaleset);\n\t}\n\telse\n\t{\n\t\tluax_checktexturesettings(L, 2, true, false, false, OptionalBool(), settings, dpiscaleset);\n\t\tfloat *autodpiscale = dpiscaleset ? nullptr : &settings.dpiScale;\n\n\t\tif (lua_istable(L, 1))\n\t\t{\n\t\t\tint n = std::max(1, (int) luax_objlen(L, 1));\n\t\t\tfor (int i = 0; i < n; i++)\n\t\t\t{\n\t\t\t\tlua_rawgeti(L, 1, i + 1);\n\t\t\t\tauto data = getImageData(L, -1, true, i == 0 ? autodpiscale : nullptr);\n\t\t\t\tif (data.first.get())\n\t\t\t\t\tslices.set(0, i, data.first);\n\t\t\t\telse\n\t\t\t\t\tslices.set(0, i, data.second->getSlice(0, 0));\n\t\t\t}\n\t\t\tlua_pop(L, n);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tauto data = getImageData(L, 1, true, autodpiscale);\n\t\t\tif (data.first.get())\n\t\t\t\tslices.set(0, 0, data.first);\n\t\t\telse\n\t\t\t\tslices.add(data.second, 0, 0, false, settings.mipmaps != Texture::MIPMAPS_NONE);\n\t\t}\n\t}\n\n\treturn w__pushNewTexture(L, slicesref, settings);\n}\n\nint w_newCubeTexture(lua_State *L)\n{\n\tluax_checkgraphicscreated(L);\n\n\tTexture::Slices slices(TEXTURE_CUBE);\n\tTexture::Slices *slicesref = &slices;\n\n\tTexture::Settings settings;\n\tsettings.type = TEXTURE_CUBE;\n\tbool dpiscaleset = false;\n\n\tif (lua_type(L, 1) == LUA_TNUMBER)\n\t{\n\t\tslicesref = nullptr;\n\t\tsettings.width = settings.height = (int) luaL_checkinteger(L, 1);\n\t\tluax_checktexturesettings(L, 2, true, false, false, OptionalBool(), settings, dpiscaleset);\n\t}\n\telse\n\t{\n\t\tluax_checktexturesettings(L, 2, true, false, false, OptionalBool(), settings, dpiscaleset);\n\t\tfloat *autodpiscale = dpiscaleset ? nullptr : &settings.dpiScale;\n\n\t\tauto imagemodule = Module::getInstance<love::image::Image>(Module::M_IMAGE);\n\n\t\tif (!lua_istable(L, 1))\n\t\t{\n\t\t\tauto data = getImageData(L, 1, true, autodpiscale);\n\n\t\t\tstd::vector<StrongRef<love::image::ImageData>> faces;\n\n\t\t\tif (data.first.get())\n\t\t\t{\n\t\t\t\tluax_catchexcept(L, [&](){ faces = imagemodule->newCubeFaces(data.first); });\n\n\t\t\t\tfor (int i = 0; i < (int) faces.size(); i++)\n\t\t\t\t\tslices.set(i, 0, faces[i]);\n\t\t\t}\n\t\t\telse\n\t\t\t\tslices.add(data.second, 0, 0, true, settings.mipmaps != Texture::MIPMAPS_NONE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tint tlen = (int) luax_objlen(L, 1);\n\n\t\t\tif (luax_isarrayoftables(L, 1))\n\t\t\t{\n\t\t\t\tif (tlen != 6)\n\t\t\t\t\treturn luaL_error(L, \"Cubemap images must have 6 faces.\");\n\n\t\t\t\tfor (int face = 0; face < tlen; face++)\n\t\t\t\t{\n\t\t\t\t\tlua_rawgeti(L, 1, face + 1);\n\t\t\t\t\tluaL_checktype(L, -1, LUA_TTABLE);\n\n\t\t\t\t\tint miplen = std::max(1, (int) luax_objlen(L, -1));\n\n\t\t\t\t\tfor (int mip = 0; mip < miplen; mip++)\n\t\t\t\t\t{\n\t\t\t\t\t\tlua_rawgeti(L, -1, mip + 1);\n\n\t\t\t\t\t\tauto data = getImageData(L, -1, true, face == 0 && mip == 0 ? autodpiscale : nullptr);\n\t\t\t\t\t\tif (data.first.get())\n\t\t\t\t\t\t\tslices.set(face, mip, data.first);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tslices.set(face, mip, data.second->getSlice(0, 0));\n\n\t\t\t\t\t\tlua_pop(L, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbool usemipmaps = false;\n\n\t\t\t\tfor (int i = 0; i < tlen; i++)\n\t\t\t\t{\n\t\t\t\t\tlua_rawgeti(L, 1, i + 1);\n\n\t\t\t\t\tauto data = getImageData(L, -1, true, i == 0 ? autodpiscale : nullptr);\n\n\t\t\t\t\tif (data.first.get())\n\t\t\t\t\t{\n\t\t\t\t\t\tif (usemipmaps || data.first->getWidth() != data.first->getHeight())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tusemipmaps = true;\n\n\t\t\t\t\t\t\tstd::vector<StrongRef<love::image::ImageData>> faces;\n\t\t\t\t\t\t\tluax_catchexcept(L, [&](){ faces = imagemodule->newCubeFaces(data.first); });\n\n\t\t\t\t\t\t\tfor (int face = 0; face < (int) faces.size(); face++)\n\t\t\t\t\t\t\t\tslices.set(face, i, faces[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tslices.set(i, 0, data.first);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tslices.add(data.second, i, 0, false, settings.mipmaps != Texture::MIPMAPS_NONE);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlua_pop(L, tlen);\n\t\t}\n\t}\n\n\treturn w__pushNewTexture(L, slicesref, settings);\n}\n\nint w_newArrayTexture(lua_State *L)\n{\n\tluax_checkgraphicscreated(L);\n\n\tTexture::Slices slices(TEXTURE_2D_ARRAY);\n\tTexture::Slices *slicesref = &slices;\n\n\tTexture::Settings settings;\n\tsettings.type = TEXTURE_2D_ARRAY;\n\tbool dpiscaleset = false;\n\n\tif (lua_type(L, 1) == LUA_TNUMBER)\n\t{\n\t\tslicesref = nullptr;\n\t\tsettings.width = (int) luaL_checkinteger(L, 1);\n\t\tsettings.height = (int) luaL_checkinteger(L, 2);\n\t\tsettings.layers = (int) luaL_checkinteger(L, 3);\n\t\tluax_checktexturesettings(L, 4, true, false, false, OptionalBool(), settings, dpiscaleset);\n\t}\n\telse\n\t{\n\t\tluax_checktexturesettings(L, 2, true, false, false, OptionalBool(), settings, dpiscaleset);\n\t\tfloat *autodpiscale = dpiscaleset ? nullptr : &settings.dpiScale;\n\n\t\tif (lua_istable(L, 1))\n\t\t{\n\t\t\tint tlen = std::max(1, (int) luax_objlen(L, 1));\n\n\t\t\tif (luax_isarrayoftables(L, 1))\n\t\t\t{\n\t\t\t\tfor (int slice = 0; slice < tlen; slice++)\n\t\t\t\t{\n\t\t\t\t\tlua_rawgeti(L, 1, slice + 1);\n\t\t\t\t\tluaL_checktype(L, -1, LUA_TTABLE);\n\n\t\t\t\t\tint miplen = std::max(1, (int) luax_objlen(L, -1));\n\n\t\t\t\t\tfor (int mip = 0; mip < miplen; mip++)\n\t\t\t\t\t{\n\t\t\t\t\t\tlua_rawgeti(L, -1, mip + 1);\n\n\t\t\t\t\t\tauto data = getImageData(L, -1, true, slice == 0 && mip == 0 ? autodpiscale : nullptr);\n\t\t\t\t\t\tif (data.first.get())\n\t\t\t\t\t\t\tslices.set(slice, mip, data.first);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tslices.set(slice, mip, data.second->getSlice(0, 0));\n\n\t\t\t\t\t\tlua_pop(L, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor (int slice = 0; slice < tlen; slice++)\n\t\t\t\t{\n\t\t\t\t\tlua_rawgeti(L, 1, slice + 1);\n\t\t\t\t\tauto data = getImageData(L, -1, true, slice == 0 ? autodpiscale : nullptr);\n\t\t\t\t\tif (data.first.get())\n\t\t\t\t\t\tslices.set(slice, 0, data.first);\n\t\t\t\t\telse\n\t\t\t\t\t\tslices.add(data.second, slice, 0, false, settings.mipmaps != Texture::MIPMAPS_NONE);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlua_pop(L, tlen);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tauto data = getImageData(L, 1, true, autodpiscale);\n\t\t\tif (data.first.get())\n\t\t\t\tslices.set(0, 0, data.first);\n\t\t\telse\n\t\t\t\tslices.add(data.second, 0, 0, true, settings.mipmaps != Texture::MIPMAPS_NONE);\n\t\t}\n\t}\n\n\treturn w__pushNewTexture(L, slicesref, settings);\n}\n\nint w_newVolumeTexture(lua_State *L)\n{\n\tluax_checkgraphicscreated(L);\n\n\tauto imagemodule = Module::getInstance<love::image::Image>(Module::M_IMAGE);\n\n\tTexture::Slices slices(TEXTURE_VOLUME);\n\tTexture::Slices *slicesref = &slices;\n\n\tTexture::Settings settings;\n\tsettings.type = TEXTURE_VOLUME;\n\tbool dpiscaleset = false;\n\n\tif (lua_type(L, 1) == LUA_TNUMBER)\n\t{\n\t\tslicesref = nullptr;\n\t\tsettings.width = (int) luaL_checkinteger(L, 1);\n\t\tsettings.height = (int) luaL_checkinteger(L, 2);\n\t\tsettings.layers = (int) luaL_checkinteger(L, 3);\n\t\tluax_checktexturesettings(L, 4, true, false, false, OptionalBool(), settings, dpiscaleset);\n\t}\n\telse\n\t{\n\t\tluax_checktexturesettings(L, 2, true, false, false, OptionalBool(), settings, dpiscaleset);\n\t\tfloat *autodpiscale = dpiscaleset ? nullptr : &settings.dpiScale;\n\n\t\tif (lua_istable(L, 1))\n\t\t{\n\t\t\tint tlen = std::max(1, (int) luax_objlen(L, 1));\n\n\t\t\tif (luax_isarrayoftables(L, 1))\n\t\t\t{\n\t\t\t\tfor (int mip = 0; mip < tlen; mip++)\n\t\t\t\t{\n\t\t\t\t\tlua_rawgeti(L, 1, mip + 1);\n\t\t\t\t\tluaL_checktype(L, -1, LUA_TTABLE);\n\n\t\t\t\t\tint slicelen = std::max(1, (int) luax_objlen(L, -1));\n\n\t\t\t\t\tfor (int slice = 0; slice < slicelen; slice++)\n\t\t\t\t\t{\n\t\t\t\t\t\tlua_rawgeti(L, -1, slice + 1);\n\n\t\t\t\t\t\tauto data = getImageData(L, -1, true, slice == 0 && mip == 0 ? autodpiscale : nullptr);\n\t\t\t\t\t\tif (data.first.get())\n\t\t\t\t\t\t\tslices.set(slice, mip, data.first);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tslices.set(slice, mip, data.second->getSlice(0, 0));\n\n\t\t\t\t\t\tlua_pop(L, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor (int layer = 0; layer < tlen; layer++)\n\t\t\t\t{\n\t\t\t\t\tlua_rawgeti(L, 1, layer + 1);\n\t\t\t\t\tauto data = getImageData(L, -1, true, layer == 0 ? autodpiscale : nullptr);\n\t\t\t\t\tif (data.first.get())\n\t\t\t\t\t\tslices.set(layer, 0, data.first);\n\t\t\t\t\telse\n\t\t\t\t\t\tslices.add(data.second, layer, 0, false, settings.mipmaps != Texture::MIPMAPS_NONE);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlua_pop(L, tlen);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tauto data = getImageData(L, 1, true, autodpiscale);\n\n\t\t\tif (data.first.get())\n\t\t\t{\n\t\t\t\tstd::vector<StrongRef<love::image::ImageData>> layers;\n\t\t\t\tluax_catchexcept(L, [&](){ layers = imagemodule->newVolumeLayers(data.first); });\n\n\t\t\t\tfor (int i = 0; i < (int) layers.size(); i++)\n\t\t\t\t\tslices.set(i, 0, layers[i]);\n\t\t\t}\n\t\t\telse\n\t\t\t\tslices.add(data.second, 0, 0, true, settings.mipmaps != Texture::MIPMAPS_NONE);\n\t\t}\n\t}\n\n\treturn w__pushNewTexture(L, slicesref, settings);\n}\n\nint w_newImage(lua_State *L)\n{\n\t//luax_markdeprecated(L, 1, \"love.graphics.newImage\", API_FUNCTION, DEPRECATED_RENAMED, \"love.graphics.newTexture\");\n\treturn w_newTexture(L);\n}\n\nint w_newCubeImage(lua_State *L)\n{\n\t//luax_markdeprecated(L, 1, \"love.graphics.newCubeImage\", API_FUNCTION, DEPRECATED_RENAMED, \"love.graphics.newCubeTexture\");\n\treturn w_newCubeTexture(L);\n}\n\nint w_newArrayImage(lua_State *L)\n{\n\t//luax_markdeprecated(L, 1, \"love.graphics.newArrayImage\", API_FUNCTION, DEPRECATED_RENAMED, \"love.graphics.newArrayTexture\");\n\treturn w_newArrayTexture(L);\n}\n\nint w_newVolumeImage(lua_State *L)\n{\n\t//luax_markdeprecated(L, 1, \"love.graphics.newVolumeImage\", API_FUNCTION, DEPRECATED_RENAMED, \"love.graphics.newVolumeTexture\");\n\treturn w_newVolumeTexture(L);\n}\n\nint w_newTextureView(lua_State *L)\n{\n\tTexture *base = luax_checktexture(L, 1);\n\tluaL_checktype(L, 2, LUA_TTABLE);\n\n\tTexture::ViewSettings settings;\n\n\tlua_getfield(L, 2, \"format\");\n\tif (!lua_isnoneornil(L, -1))\n\t{\n\t\tconst char *str = luaL_checkstring(L, -1);\n\t\tif (!getConstant(str, settings.format.value))\n\t\t\tluax_enumerror(L, \"pixel format\", str);\n\t\tsettings.format.hasValue = true;\n\t}\n\tlua_pop(L, 1);\n\n\tlua_getfield(L, 2, \"type\");\n\tif (!lua_isnoneornil(L, -1))\n\t{\n\t\tconst char *str = luaL_checkstring(L, -1);\n\t\tif (!Texture::getConstant(str, settings.type.value))\n\t\t\tluax_enumerror(L, \"texture type\", Texture::getConstants(settings.type.value), str);\n\t\tsettings.type.hasValue = true;\n\t}\n\tlua_pop(L, 1);\n\n\tlua_getfield(L, 2, \"mipmapstart\");\n\tif (!lua_isnoneornil(L, -1))\n\t\tsettings.mipmapStart.set(luax_checkint(L, -1) - 1);\n\tlua_pop(L, 1);\n\n\tlua_getfield(L, 2, \"mipmapcount\");\n\tif (!lua_isnoneornil(L, -1))\n\t\tsettings.mipmapCount.set(luax_checkint(L, -1));\n\tlua_pop(L, 1);\n\n\tlua_getfield(L, 2, \"layerstart\");\n\tif (!lua_isnoneornil(L, -1))\n\t\tsettings.layerStart.set(luax_checkint(L, -1) - 1);\n\tlua_pop(L, 1);\n\n\tlua_getfield(L, 2, \"layers\");\n\tif (!lua_isnoneornil(L, -1))\n\t\tsettings.layerCount.set(luax_checkint(L, -1));\n\tlua_pop(L, 1);\n\n\tlua_getfield(L, 2, \"debugname\");\n\tif (!lua_isnoneornil(L, -1))\n\t\tsettings.debugName = luaL_checkstring(L, -1);\n\tlua_pop(L, 1);\n\n\tTexture *t = nullptr;\n\tluax_catchexcept(L, [&]() { t = instance()->newTextureView(base, settings); });\n\n\tluax_pushtype(L, t);\n\tt->release();\n\treturn 1;\n}\n\nint w_newQuad(lua_State *L)\n{\n\tluax_checkgraphicscreated(L);\n\n\tQuad::Viewport v;\n\tv.x = luaL_checknumber(L, 1);\n\tv.y = luaL_checknumber(L, 2);\n\tv.w = luaL_checknumber(L, 3);\n\tv.h = luaL_checknumber(L, 4);\n\n\tdouble sw = 0.0f;\n\tdouble sh = 0.0f;\n\tint layer = 0;\n\n\tif (luax_istype(L, 5, Texture::type))\n\t{\n\t\tTexture *texture = luax_checktexture(L, 5);\n\t\tsw = texture->getWidth();\n\t\tsh = texture->getHeight();\n\t}\n\telse if (luax_istype(L, 6, Texture::type))\n\t{\n\t\tlayer = (int) luaL_checkinteger(L, 5) - 1;\n\t\tTexture *texture = luax_checktexture(L, 6);\n\t\tsw = texture->getWidth();\n\t\tsh = texture->getHeight();\n\t}\n\telse if (!lua_isnoneornil(L, 7))\n\t{\n\t\tlayer = (int) luaL_checkinteger(L, 5) - 1;\n\t\tsw = luaL_checknumber(L, 6);\n\t\tsh = luaL_checknumber(L, 7);\n\t}\n\telse\n\t{\n\t\tsw = luaL_checknumber(L, 5);\n\t\tsh = luaL_checknumber(L, 6);\n\t}\n\n\tQuad *quad = instance()->newQuad(v, sw, sh);\n\tquad->setLayer(layer);\n\n\tluax_pushtype(L, quad);\n\tquad->release();\n\treturn 1;\n}\n\nint w_newFont(lua_State *L)\n{\n\tluax_checkgraphicscreated(L);\n\n\tgraphics::Font *font = nullptr;\n\n\t// Convert to Rasterizer, if necessary.\n\tif (!luax_istype(L, 1, love::font::Rasterizer::type))\n\t{\n\t\tstd::vector<int> idxs;\n\t\tfor (int i = 0; i < lua_gettop(L); i++)\n\t\t\tidxs.push_back(i + 1);\n\n\t\tluax_convobj(L, idxs, \"font\", \"newRasterizer\");\n\t}\n\n\tlove::font::Rasterizer *rasterizer = luax_checktype<love::font::Rasterizer>(L, 1);\n\n\tluax_catchexcept(L, [&]() {\n\t\tfont = instance()->newFont(rasterizer); }\n\t);\n\n\t// Push the type.\n\tluax_pushtype(L, font);\n\tfont->release();\n\treturn 1;\n}\n\nint w_newImageFont(lua_State *L)\n{\n\tluax_checkgraphicscreated(L);\n\n\t// Convert to Rasterizer if necessary.\n\tif (!luax_istype(L, 1, love::font::Rasterizer::type))\n\t{\n\t\tluaL_checktype(L, 2, LUA_TSTRING);\n\n\t\tstd::vector<int> idxs;\n\t\tfor (int i = 0; i < lua_gettop(L); i++)\n\t\t\tidxs.push_back(i + 1);\n\n\t\tluax_convobj(L, idxs, \"font\", \"newImageRasterizer\");\n\t}\n\n\tlove::font::Rasterizer *rasterizer = luax_checktype<love::font::Rasterizer>(L, 1);\n\n\t// Create the font.\n\tFont *font = instance()->newFont(rasterizer);\n\n\t// Push the type.\n\tluax_pushtype(L, font);\n\tfont->release();\n\treturn 1;\n}\n\nint w_newSpriteBatch(lua_State *L)\n{\n\tluax_checkgraphicscreated(L);\n\n\tTexture *texture = luax_checktexture(L, 1);\n\tint size = (int) luaL_optinteger(L, 2, 1000);\n\tBufferDataUsage usage = BUFFERDATAUSAGE_DYNAMIC;\n\tif (lua_gettop(L) > 2)\n\t{\n\t\tconst char *usagestr = luaL_checkstring(L, 3);\n\t\tif (!getConstant(usagestr, usage))\n\t\t\treturn luax_enumerror(L, \"usage hint\", getConstants(usage), usagestr);\n\t}\n\n\tSpriteBatch *t = nullptr;\n\tluax_catchexcept(L,\n\t\t[&](){ t = instance()->newSpriteBatch(texture, size, usage); }\n\t);\n\n\tluax_pushtype(L, t);\n\tt->release();\n\treturn 1;\n}\n\nint w_newParticleSystem(lua_State *L)\n{\n\tluax_checkgraphicscreated(L);\n\n\tTexture *texture = luax_checktexture(L, 1);\n\tlua_Number size = luaL_optnumber(L, 2, 1000);\n\tParticleSystem *t = nullptr;\n\tif (size < 1.0 || size > ParticleSystem::MAX_PARTICLES)\n\t\treturn luaL_error(L, \"Invalid ParticleSystem size\");\n\n\tluax_catchexcept(L,\n\t\t[&](){ t = instance()->newParticleSystem(texture, int(size)); }\n\t);\n\n\tluax_pushtype(L, t);\n\tt->release();\n\treturn 1;\n}\n\nstatic int w_getShaderSource(lua_State *L, int startidx, std::vector<std::string> &stages, Shader::CompileOptions &options)\n{\n\tusing namespace love::filesystem;\n\n\tluax_checkgraphicscreated(L);\n\n\tauto fs = Module::getInstance<Filesystem>(Module::M_FILESYSTEM);\n\n\t// read any filepath arguments\n\tfor (int i = startidx; i < startidx + 2; i++)\n\t{\n\t\tif (!lua_isstring(L, i))\n\t\t{\n\t\t\tif (luax_cangetfiledata(L, i))\n\t\t\t{\n\t\t\t\tFileData *fd = luax_getfiledata(L, i);\n\n\t\t\t\tlua_pushlstring(L, (const char *) fd->getData(), fd->getSize());\n\t\t\t\tfd->release();\n\n\t\t\t\tlua_replace(L, i);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tsize_t slen = 0;\n\t\tconst char *str = lua_tolstring(L, i, &slen);\n\n\t\tFilesystem::Info info = {};\n\t\tif (fs != nullptr && fs->getInfo(str, info))\n\t\t{\n\t\t\tFileData *fd = nullptr;\n\t\t\tluax_catchexcept(L, [&](){ fd = fs->read(str); });\n\n\t\t\tlua_pushlstring(L, (const char *) fd->getData(), fd->getSize());\n\t\t\tfd->release();\n\n\t\t\tlua_replace(L, i);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Check if the argument looks like a filepath - we want a nicer\n\t\t\t// error for misspelled filepath arguments.\n\t\t\tif (slen > 0 && slen < 64 && !strchr(str, '\\n'))\n\t\t\t{\n\t\t\t\tconst char *ext = strchr(str, '.');\n\t\t\t\tif (ext != nullptr && !strchr(ext, ';') && !strchr(ext, ' '))\n\t\t\t\t\treturn luaL_error(L, \"Could not open file %s. Does not exist.\", str);\n\t\t\t}\n\t\t}\n\t}\n\n\tbool has_arg1 = lua_isstring(L, startidx + 0) != 0;\n\tbool has_arg2 = lua_isstring(L, startidx + 1) != 0;\n\n\t// require at least one string argument\n\tif (!(has_arg1 || has_arg2))\n\t\tluaL_checkstring(L, startidx);\n\n\tif (has_arg1)\n\t\tstages.push_back(luax_checkstring(L, startidx + 0));\n\tif (has_arg2)\n\t\tstages.push_back(luax_checkstring(L, startidx + 1));\n\n\tint optionsidx = has_arg2 ? startidx + 2 : startidx + 1;\n\tif (!lua_isnoneornil(L, optionsidx))\n\t{\n\t\tluaL_checktype(L, optionsidx, LUA_TTABLE);\n\t\tlua_getfield(L, optionsidx, \"defines\");\n\t\tif (!lua_isnoneornil(L, -1))\n\t\t{\n\t\t\tif (!lua_istable(L, -1))\n\t\t\t\tluaL_argerror(L, optionsidx, \"expected 'defines' field to be a table\");\n\n\t\t\tlua_pushnil(L);\n\t\t\twhile (lua_next(L, -2))\n\t\t\t{\n\t\t\t\tstd::string defname;\n\t\t\t\tstd::string defval;\n\n\t\t\t\tif (lua_type(L, -2) == LUA_TNUMBER && lua_type(L, -1) == LUA_TSTRING)\n\t\t\t\t\tdefname = luaL_checkstring(L, -1);\n\t\t\t\telse if (lua_type(L, -2) != LUA_TSTRING)\n\t\t\t\t\tluaL_argerror(L, optionsidx, \"all fields in the 'defines' table must use string keys.\");\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tdefname = luaL_checkstring(L, -2);\n\t\t\t\t\tif (lua_type(L, -1) == LUA_TBOOLEAN)\n\t\t\t\t\t\tdefval = luax_toboolean(L, -1) ? \"1\" : \"0\";\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tconst char *val = lua_tostring(L, -1);\n\t\t\t\t\t\tif (val == nullptr)\n\t\t\t\t\t\t\tluaL_argerror(L, optionsidx, \"'defines' table values must be strings, numbers, or booleans.\");\n\t\t\t\t\t\tdefval = val;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\toptions.defines[defname] = defval;\n\n\t\t\t\tlua_pop(L, 1);\n\t\t\t}\n\t\t}\n\t\tlua_pop(L, 1);\n\n\t\tlua_getfield(L, optionsidx, \"debugname\");\n\t\tif (!lua_isnoneornil(L, -1))\n\t\t\toptions.debugName = luax_checkstring(L, -1);\n\t\tlua_pop(L, 1);\n\t}\n\n\treturn 0;\n}\n\nint w_newShader(lua_State *L)\n{\n\tstd::vector<std::string> stages;\n\tShader::CompileOptions options;\n\tw_getShaderSource(L, 1, stages, options);\n\n\tbool should_error = false;\n\ttry\n\t{\n\t\tShader *shader = instance()->newShader(stages, options);\n\t\tif (shader->isUsingDeprecatedTextureFunctions())\n\t\t\tluax_markdeprecated(L, 1, \"texture2D() or textureCube() function calls in shader code\", API_CUSTOM, DEPRECATED_REPLACED, \"texture() function calls\");\n\t\tif (shader->isUsingDeprecatedTextureUniform())\n\t\t\tluax_markdeprecated(L, 1, \"'texture' uniform variable name in shader code\", API_CUSTOM, DEPRECATED_NO_REPLACEMENT, \"\");\n\t\tif (!shader->getUnsetVertexInputLocationsString().empty())\n\t\t{\n\t\t\tstd::string str = \"vertex input attribute(s) \" + shader->getUnsetVertexInputLocationsString() + \" without a 'location' layout qualifier in shader code\";\n\t\t\tluax_markdeprecated(L, 1, str.c_str(), API_CUSTOM, DEPRECATED_REPLACED, \"layout(location = #) qualifier for vertex inputs\");\n\t\t}\n\t\tluax_pushtype(L, shader);\n\t\tshader->release();\n\t}\n\tcatch (love::Exception &e)\n\t{\n\t\tluax_getfunction(L, \"graphics\", \"_transformGLSLErrorMessages\");\n\t\tlua_pushstring(L, e.what());\n\n\t\t// Function pushes the new error string onto the stack.\n\t\tlua_pcall(L, 1, 1, 0);\n\t\tshould_error = true;\n\t}\n\n\tif (should_error)\n\t\treturn lua_error(L);\n\n\treturn 1;\n}\n\nint w_newComputeShader(lua_State* L)\n{\n\tstd::vector<std::string> stages;\n\tShader::CompileOptions options;\n\tw_getShaderSource(L, 1, stages, options);\n\n\tbool should_error = false;\n\ttry\n\t{\n\t\tShader *shader = instance()->newComputeShader(stages[0], options);\n\t\tif (shader->isUsingDeprecatedTextureFunctions())\n\t\t\tluax_markdeprecated(L, 1, \"texture2D() or textureCube() function calls in shader code\", API_CUSTOM, DEPRECATED_REPLACED, \"texture() function calls\");\n\t\tif (shader->isUsingDeprecatedTextureUniform())\n\t\t\tluax_markdeprecated(L, 1, \"'texture' uniform variable name in shader code\", API_CUSTOM, DEPRECATED_NO_REPLACEMENT, \"\");\n\t\tif (!shader->getUnsetVertexInputLocationsString().empty())\n\t\t{\n\t\t\tstd::string str = \"vertex input attribute(s) \" + shader->getUnsetVertexInputLocationsString() + \" without a 'location' layout qualifier in shader code\";\n\t\t\tluax_markdeprecated(L, 1, str.c_str(), API_CUSTOM, DEPRECATED_REPLACED, \"layout(location = #) qualifier for vertex inputs\");\n\t\t}\n\t\tluax_pushtype(L, shader);\n\t\tshader->release();\n\t}\n\tcatch (love::Exception &e)\n\t{\n\t\tluax_getfunction(L, \"graphics\", \"_transformGLSLErrorMessages\");\n\t\tlua_pushstring(L, e.what());\n\n\t\t// Function pushes the new error string onto the stack.\n\t\tlua_pcall(L, 1, 1, 0);\n\t\tshould_error = true;\n\t}\n\n\tif (should_error)\n\t\treturn lua_error(L);\n\n\treturn 1;\n}\n\nint w_validateShader(lua_State *L)\n{\n\tbool gles = luax_checkboolean(L, 1);\n\n\tstd::vector<std::string> stages;\n\tShader::CompileOptions options;\n\tw_getShaderSource(L, 2, stages, options);\n\n\tbool success = true;\n\tstd::string err;\n\ttry\n\t{\n\t\tsuccess = instance()->validateShader(gles, stages, options, err);\n\t}\n\tcatch (love::Exception &e)\n\t{\n\t\tsuccess = false;\n\t\terr = e.what();\n\t}\n\n\tluax_pushboolean(L, success);\n\n\tif (!success)\n\t{\n\t\tluax_pushstring(L, err);\n\t\treturn 2;\n\t}\n\n\treturn 1;\n}\n\nstatic BufferDataUsage luax_optdatausage(lua_State *L, int idx, BufferDataUsage def)\n{\n\tconst char *usagestr = lua_isnoneornil(L, idx) ? nullptr : luaL_checkstring(L, idx);\n\n\tif (usagestr && !getConstant(usagestr, def))\n\t\tluax_enumerror(L, \"usage hint\", getConstants(def), usagestr);\n\n\treturn def;\n}\n\nstatic void luax_optbuffersettings(lua_State *L, int idx, Buffer::Settings &settings)\n{\n\tif (lua_isnoneornil(L, idx))\n\t\treturn;\n\n\tluaL_checktype(L, idx, LUA_TTABLE);\n\n\tlua_getfield(L, idx, \"usage\");\n\tsettings.dataUsage = luax_optdatausage(L, -1, settings.dataUsage);\n\tlua_pop(L, 1);\n\n\tlua_getfield(L, idx, \"debugname\");\n\tif (!lua_isnoneornil(L, -1))\n\t\tsettings.debugName = luax_checkstring(L, -1);\n\tlua_pop(L, 1);\n}\n\nstatic Buffer::DataDeclaration luax_checkdatadeclaration(lua_State* L, int formattableidx, int arrayindex, int declindex, bool requirename, bool requirelocation)\n{\n\tBuffer::DataDeclaration decl(\"\", DATAFORMAT_MAX_ENUM);\n\n\tlua_getfield(L, declindex, \"name\");\n\tif (requirename && lua_type(L, -1) != LUA_TSTRING)\n\t{\n\t\tstd::ostringstream ss;\n\t\tss << \"'name' field expected in array element #\";\n\t\tss << arrayindex;\n\t\tss << \" of format table\";\n\t\tstd::string str = ss.str();\n\t\tluaL_argerror(L, formattableidx, str.c_str());\n\t}\n\telse if (!lua_isnoneornil(L, -1))\n\t\tdecl.name = luax_checkstring(L, -1);\n\tlua_pop(L, 1);\n\n\tlua_getfield(L, declindex, \"format\");\n\tif (lua_type(L, -1) != LUA_TSTRING)\n\t{\n\t\tstd::ostringstream ss;\n\t\tss << \"'format' field expected in array element #\";\n\t\tss << arrayindex;\n\t\tss << \" of format table\";\n\t\tstd::string str = ss.str();\n\t\tluaL_argerror(L, formattableidx, str.c_str());\n\t}\n\tconst char* formatstr = luaL_checkstring(L, -1);\n\tif (!getConstant(formatstr, decl.format))\n\t\tluax_enumerror(L, \"data format\", getConstants(decl.format), formatstr);\n\tlua_pop(L, 1);\n\n\tdecl.arrayLength = luax_intflag(L, declindex, \"arraylength\", 0);\n\n\tlua_getfield(L, declindex, \"location\");\n\tif (requirelocation && lua_type(L, -1) != LUA_TNUMBER)\n\t{\n\t\tstd::ostringstream ss;\n\t\tss << \"'location' field expected in array element #\";\n\t\tss << arrayindex;\n\t\tss << \" of format table\";\n\t\tstd::string str = ss.str();\n\t\tluaL_argerror(L, formattableidx, str.c_str());\n\t}\n\telse if (!lua_isnoneornil(L, -1))\n\t\tdecl.bindingLocation = luax_checkint(L, -1);\n\tlua_pop(L, 1);\n\n\treturn decl;\n}\n\nstatic void luax_checkbufferformat(lua_State *L, int idx, const Buffer::Settings &settings, std::vector<Buffer::DataDeclaration> &format)\n{\n\tif (lua_type(L, idx) == LUA_TSTRING)\n\t{\n\t\tBuffer::DataDeclaration decl(\"\", DATAFORMAT_MAX_ENUM);\n\t\tconst char *formatstr = luaL_checkstring(L, idx);\n\t\tif (!getConstant(formatstr, decl.format))\n\t\t\tluax_enumerror(L, \"data format\", getConstants(decl.format), formatstr);\n\t\tformat.push_back(decl);\n\t\treturn;\n\t}\n\n\tbool requirelocation = (settings.usageFlags & BUFFERUSAGE_VERTEX) != 0;\n\n\tluaL_checktype(L, idx, LUA_TTABLE);\n\tint tablelen = luax_objlen(L, idx);\n\n\tfor (int i = 1; i <= tablelen; i++)\n\t{\n\t\tlua_rawgeti(L, idx, i);\n\t\tluaL_checktype(L, -1, LUA_TTABLE);\n\n\t\tBuffer::DataDeclaration decl = luax_checkdatadeclaration(L, idx, i, -1, false, requirelocation);\n\n\t\tformat.push_back(decl);\n\t\tlua_pop(L, 1);\n\t}\n}\n\nstatic void luax_validatebuffervertexbindings(lua_State *L, Buffer *buffer)\n{\n\tif (buffer->hasLegacyVertexBindings())\n\t{\n\t\tstd::string names;\n\n\t\tfor (const auto &member : buffer->getDataMembers())\n\t\t{\n\t\t\tif (member.decl.bindingLocation < 0)\n\t\t\t{\n\t\t\t\tif (names.empty())\n\t\t\t\t\tnames = member.decl.name;\n\t\t\t\telse\n\t\t\t\t\tnames += \", \" + member.decl.name;\n\t\t\t}\n\t\t}\n\n\t\tluax_markdeprecated(L, 1, \"vertex format 'name' fields in Meshes and Buffers\", API_CUSTOM, DEPRECATED_REPLACED, \"'location' field containing a binding location number value.\");\n\t}\n}\n\nstatic Buffer *luax_newbuffer(lua_State *L, int idx, Buffer::Settings settings, const std::vector<Buffer::DataDeclaration> &format)\n{\n\tsize_t arraylength = 0;\n\tsize_t bytesize = 0;\n\tData *data = nullptr;\n\tconst void *initialdata = nullptr;\n\n\tint ncomponents = 0;\n\tfor (const Buffer::DataDeclaration &decl : format)\n\t\tncomponents += getDataFormatInfo(decl.format).components;\n\n\tif (luax_istype(L, idx, Data::type))\n\t{\n\t\tdata = luax_checktype<Data>(L, idx);\n\t\tinitialdata = data->getData();\n\t\tbytesize = data->getSize();\n\t}\n\n\tbool tableoftables = false;\n\n\tif (lua_istable(L, idx))\n\t{\n\t\tarraylength = luax_objlen(L, idx);\n\n\t\tlua_rawgeti(L, idx, 1);\n\t\ttableoftables = lua_istable(L, -1);\n\t\tlua_pop(L, 1);\n\n\t\tif (!tableoftables)\n\t\t{\n\t\t\tif (arraylength % ncomponents != 0)\n\t\t\t\tluaL_error(L, \"Array length in flat array variant of newBuffer must be a multiple of the total number of components (%d)\", ncomponents);\n\t\t\tarraylength /= ncomponents;\n\t\t}\n\t}\n\telse if (data == nullptr)\n\t{\n\t\tlua_Integer len = luaL_checkinteger(L, idx);\n\t\tif (len <= 0)\n\t\t\tluaL_argerror(L, idx, \"number of elements must be greater than 0\");\n\t\tarraylength = (size_t) len;\n\t\tsettings.zeroInitialize = true;\n\t}\n\n\tBuffer *b = nullptr;\n\tluax_catchexcept(L, [&] { b = instance()->newBuffer(settings, format, initialdata, bytesize, arraylength); });\n\n\tluax_validatebuffervertexbindings(L, b);\n\n\tif (lua_istable(L, idx))\n\t{\n\t\tBuffer::Mapper mapper(*b);\n\t\tchar *data = (char *) mapper.data;\n\t\tconst auto &members = b->getDataMembers();\n\t\tsize_t stride = b->getArrayStride();\n\n\t\tif (tableoftables)\n\t\t{\n\t\t\tfor (size_t i = 0; i < arraylength; i++)\n\t\t\t{\n\t\t\t\t// get arraydata[index]\n\t\t\t\tlua_rawgeti(L, 2, i + 1);\n\t\t\t\tluaL_checktype(L, -1, LUA_TTABLE);\n\n\t\t\t\t// get arraydata[index][j]\n\t\t\t\tfor (int j = 1; j <= ncomponents; j++)\n\t\t\t\t\tlua_rawgeti(L, -j, j);\n\n\t\t\t\tint idx = -ncomponents;\n\n\t\t\t\tfor (const Buffer::DataMember &member : members)\n\t\t\t\t{\n\t\t\t\t\tluax_writebufferdata(L, idx, member.decl.format, data + member.offset);\n\t\t\t\t\tidx += member.info.components;\n\t\t\t\t}\n\n\t\t\t\tlua_pop(L, ncomponents + 1);\n\t\t\t\tdata += stride;\n\t\t\t}\n\t\t}\n\t\telse // Flat array\n\t\t{\n\t\t\tfor (size_t i = 0; i < arraylength; i++)\n\t\t\t{\n\t\t\t\t// get arraydata[arrayindex * ncomponents + componentindex]\n\t\t\t\tfor (int componentindex = 1; componentindex <= ncomponents; componentindex++)\n\t\t\t\t\tlua_rawgeti(L, 2, i * ncomponents + componentindex);\n\n\t\t\t\tint idx = -ncomponents;\n\n\t\t\t\tfor (const Buffer::DataMember &member : members)\n\t\t\t\t{\n\t\t\t\t\tluax_writebufferdata(L, idx, member.decl.format, data + member.offset);\n\t\t\t\t\tidx += member.info.components;\n\t\t\t\t}\n\n\t\t\t\tlua_pop(L, ncomponents);\n\t\t\t\tdata += stride;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn b;\n}\n\nint w_newBuffer(lua_State *L)\n{\n\tBuffer::Settings settings(0, BUFFERDATAUSAGE_DYNAMIC);\n\n\tluaL_checktype(L, 3, LUA_TTABLE);\n\n\tfor (int i = 0; i < BUFFERUSAGE_MAX_ENUM; i++)\n\t{\n\t\tBufferUsage bufferusage = (BufferUsage) i;\n\t\tconst char *tname = nullptr;\n\t\tif (!getConstant(bufferusage, tname))\n\t\t\tcontinue;\n\t\tif (luax_boolflag(L, 3, tname, false))\n\t\t\tsettings.usageFlags = (BufferUsageFlags)(settings.usageFlags | (1u << i));\n\t}\n\n\tluax_optbuffersettings(L, 3, settings);\n\n\tstd::vector<Buffer::DataDeclaration> format;\n\tluax_checkbufferformat(L, 1, settings, format);\n\n\tBuffer *b = luax_newbuffer(L, 2, settings, format);\n\n\tluax_pushtype(L, b);\n\tb->release();\n\treturn 1;\n}\n\nstatic PrimitiveType luax_checkmeshdrawmode(lua_State *L, int idx)\n{\n\tconst char *modestr = luaL_checkstring(L, idx);\n\n\tPrimitiveType mode = PRIMITIVE_TRIANGLES;\n\tif (!getConstant(modestr, mode))\n\t\tluax_enumerror(L, \"mesh draw mode\", getConstants(mode), modestr);\n\n\treturn mode;\n}\n\nstatic Mesh *newStandardMesh(lua_State *L)\n{\n\tMesh *t = nullptr;\n\n\tPrimitiveType drawmode = luax_checkmeshdrawmode(L, 2);\n\tBufferDataUsage usage = luax_optdatausage(L, 3, BUFFERDATAUSAGE_DYNAMIC);\n\n\tstd::vector<Buffer::DataDeclaration> format = Mesh::getDefaultVertexFormat();\n\n\t// First argument is a table of standard vertices, or the number of\n\t// standard vertices.\n\tif (lua_istable(L, 1))\n\t{\n\t\tsize_t vertexcount = luax_objlen(L, 1);\n\t\tstd::vector<Vertex> vertices;\n\t\tvertices.reserve(vertexcount);\n\n\t\t// Get the vertices from the table.\n\t\tfor (size_t i = 1; i <= vertexcount; i++)\n\t\t{\n\t\t\tlua_rawgeti(L, 1, (int) i);\n\n\t\t\tif (lua_type(L, -1) != LUA_TTABLE)\n\t\t\t{\n\t\t\t\tluax_typerror(L, 1, \"table of tables\");\n\t\t\t\treturn nullptr;\n\t\t\t}\n\n\t\t\tfor (int j = 1; j <= 8; j++)\n\t\t\t\tlua_rawgeti(L, -j, j);\n\n\t\t\tVertex v;\n\n\t\t\tv.x = (float) luaL_checknumber(L, -8);\n\t\t\tv.y = (float) luaL_checknumber(L, -7);\n\t\t\tv.s = (float) luaL_optnumber(L, -6, 0.0);\n\t\t\tv.t = (float) luaL_optnumber(L, -5, 0.0);\n\n\t\t\tv.color.r = (unsigned char) (luax_optnumberclamped01(L, -4, 1.0) * 255.0);\n\t\t\tv.color.g = (unsigned char) (luax_optnumberclamped01(L, -3, 1.0) * 255.0);\n\t\t\tv.color.b = (unsigned char) (luax_optnumberclamped01(L, -2, 1.0) * 255.0);\n\t\t\tv.color.a = (unsigned char) (luax_optnumberclamped01(L, -1, 1.0) * 255.0);\n\n\t\t\tlua_pop(L, 9);\n\t\t\tvertices.push_back(v);\n\t\t}\n\n\t\tluax_catchexcept(L, [&](){ t = instance()->newMesh(format, vertices.data(), vertices.size() * sizeof(Vertex), drawmode, usage); });\n\t}\n\telse\n\t{\n\t\tint count = (int) luaL_checkinteger(L, 1);\n\t\tluax_catchexcept(L, [&](){ t = instance()->newMesh(format, count, drawmode, usage); });\n\t}\n\n\treturn t;\n}\n\nstatic Mesh *newCustomMesh(lua_State *L)\n{\n\tMesh *t = nullptr;\n\n\t// First argument is the vertex format, second is a table of vertices or\n\t// the number of vertices.\n\tstd::vector<Buffer::DataDeclaration> vertexformat;\n\n\tPrimitiveType drawmode = luax_checkmeshdrawmode(L, 3);\n\tBufferDataUsage usage = luax_optdatausage(L, 4, BUFFERDATAUSAGE_DYNAMIC);\n\n\tlua_rawgeti(L, 1, 1);\n\tif (!lua_istable(L, -1))\n\t{\n\t\tluaL_argerror(L, 1, \"table of tables expected\");\n\t\treturn nullptr;\n\t}\n\tlua_pop(L, 1);\n\n\t// Per-vertex attribute data formats.\n\tfor (int i = 1; i <= (int) luax_objlen(L, 1); i++)\n\t{\n\t\tlua_rawgeti(L, 1, i);\n\n\t\tBuffer::DataDeclaration decl(\"\", DATAFORMAT_MAX_ENUM);\n\n\t\tlua_getfield(L, -1, \"format\");\n\t\tbool hasformatfield = !lua_isnoneornil(L, -1);\n\t\tlua_pop(L, 1);\n\n\t\tif (hasformatfield || luax_objlen(L, -1) == 0)\n\t\t\tdecl = luax_checkdatadeclaration(L, 1, i, -1, false, true);\n\t\telse\n\t\t{\n\t\t\t// Legacy format arguments: {name, datatype, components}\n\t\t\tfor (int j = 1; j <= 3; j++)\n\t\t\t\tlua_rawgeti(L, -j, j);\n\n\t\t\tdecl.name = luaL_checkstring(L, -3);\n\t\t\tconst char *tname = luaL_checkstring(L, -2);\n\t\t\tint components = (int)luaL_checkinteger(L, -1);\n\n\t\t\t// Check deprecated format names.\n\t\t\tif (strcmp(tname, \"byte\") == 0 || strcmp(tname, \"unorm8\") == 0)\n\t\t\t{\n\t\t\t\tif (components == 4)\n\t\t\t\t\tdecl.format = DATAFORMAT_UNORM8_VEC4;\n\t\t\t\telse\n\t\t\t\t\tluaL_error(L, \"Invalid component count (%d) for vertex data type %s\", components, tname);\n\t\t\t}\n\t\t\telse if (strcmp(tname, \"unorm16\") == 0)\n\t\t\t{\n\t\t\t\tif (components == 2)\n\t\t\t\t\tdecl.format = DATAFORMAT_UNORM16_VEC2;\n\t\t\t\telse if (components == 4)\n\t\t\t\t\tdecl.format = DATAFORMAT_UNORM16_VEC4;\n\t\t\t\telse\n\t\t\t\t\tluaL_error(L, \"Invalid component count (%d) for vertex data type %s\", components, tname);\n\n\t\t\t}\n\t\t\telse if (strcmp(tname, \"float\") == 0)\n\t\t\t{\n\t\t\t\tif (components == 1)\n\t\t\t\t\tdecl.format = DATAFORMAT_FLOAT;\n\t\t\t\telse if (components == 2)\n\t\t\t\t\tdecl.format = DATAFORMAT_FLOAT_VEC2;\n\t\t\t\telse if (components == 3)\n\t\t\t\t\tdecl.format = DATAFORMAT_FLOAT_VEC3;\n\t\t\t\telse if (components == 4)\n\t\t\t\t\tdecl.format = DATAFORMAT_FLOAT_VEC4;\n\t\t\t\telse\n\t\t\t\t\tluaL_error(L, \"Invalid component count (%d) for vertex data type %s\", components, tname);\n\t\t\t}\n\n\t\t\tif (decl.format == DATAFORMAT_MAX_ENUM)\n\t\t\t\tluax_enumerror(L, \"vertex data type\", {\"float\", \"byte\", \"unorm8\", \"unorm16\"}, tname);\n\n\t\t\tlua_pop(L, 3);\n\n\t\t\tluax_markdeprecated(L, 1, \"vertex format array values in love.graphics.newMesh\", API_CUSTOM, DEPRECATED_REPLACED, \"named table fields 'format' and 'location'\");\n\t\t}\n\n\t\tlua_pop(L, 1);\n\t\tvertexformat.push_back(decl);\n\t}\n\n\tif (lua_isnumber(L, 2))\n\t{\n\t\tint vertexcount = (int) luaL_checkinteger(L, 2);\n\t\tluax_catchexcept(L, [&](){ t = instance()->newMesh(vertexformat, vertexcount, drawmode, usage); });\n\t}\n\telse if (luax_istype(L, 2, Data::type))\n\t{\n\t\t// Vertex data comes directly from a Data object.\n\t\tData *data = luax_checktype<Data>(L, 2);\n\t\tluax_catchexcept(L, [&](){ t = instance()->newMesh(vertexformat, data->getData(), data->getSize(), drawmode, usage); });\n\t}\n\telse\n\t{\n\t\t// Table of vertices.\n\t\tlua_rawgeti(L, 2, 1);\n\t\tif (!lua_istable(L, -1))\n\t\t{\n\t\t\tluaL_argerror(L, 2, \"expected table of tables\");\n\t\t\treturn nullptr;\n\t\t}\n\t\tlua_pop(L, 1);\n\n\t\tsize_t numvertices = luax_objlen(L, 2);\n\n\t\tluax_catchexcept(L, [&](){ t = instance()->newMesh(vertexformat, numvertices, drawmode, usage); });\n\n\t\tchar *data = (char *) t->getVertexData();\n\t\tsize_t stride = t->getVertexStride();\n\t\tconst auto &members = t->getVertexFormat();\n\n\t\tfor (size_t vertindex = 0; vertindex < numvertices; vertindex++)\n\t\t{\n\t\t\t// get vertices[vertindex]\n\t\t\tlua_rawgeti(L, 2, vertindex + 1);\n\t\t\tluaL_checktype(L, -1, LUA_TTABLE);\n\n\t\t\tint n = 0;\n\t\t\tfor (size_t i = 0; i < vertexformat.size(); i++)\n\t\t\t{\n\t\t\t\tconst auto &member = members[i];\n\t\t\t\tconst auto &info = getDataFormatInfo(member.decl.format);\n\n\t\t\t\t// get vertices[vertindex][n]\n\t\t\t\tfor (int c = 0; c < info.components; c++)\n\t\t\t\t{\n\t\t\t\t\tn++;\n\t\t\t\t\tlua_rawgeti(L, -(c + 1), n);\n\t\t\t\t}\n\n\t\t\t\tsize_t offset = vertindex * stride + member.offset;\n\n\t\t\t\t// Fetch the values from Lua and store them in data buffer.\n\t\t\t\tluax_writebufferdata(L, -info.components, member.decl.format, data + offset);\n\n\t\t\t\tlua_pop(L, info.components);\n\t\t\t}\n\n\t\t\tlua_pop(L, 1); // pop vertices[vertindex]\n\t\t}\n\n\t\tt->setVertexDataModified(0, stride * numvertices);\n\t\tt->flush();\n\t}\n\n\tif (t->getVertexBuffer() != nullptr)\n\t\tluax_validatebuffervertexbindings(L, t->getVertexBuffer());\n\n\treturn t;\n}\n\nstatic bool luax_isbufferattributetable(lua_State* L, int idx)\n{\n\tif (lua_type(L, idx) != LUA_TTABLE)\n\t\treturn false;\n\n\tlua_rawgeti(L, idx, 1);\n\tif (lua_type(L, -1) != LUA_TTABLE)\n\t{\n\t\tlua_pop(L, 1);\n\t\treturn false;\n\t}\n\n\tlua_getfield(L, -1, \"buffer\");\n\tbool isbuffer = luax_istype(L, -1, Buffer::type);\n\tlua_pop(L, 2);\n\treturn isbuffer;\n}\n\nstatic Mesh::BufferAttribute luax_checkbufferattributetable(lua_State *L, int idx)\n{\n\tMesh::BufferAttribute attrib;\n\n\tattrib.step = STEP_PER_VERTEX;\n\tattrib.enabled = true;\n\n\tlua_getfield(L, idx, \"buffer\");\n\tattrib.buffer = luax_checkbuffer(L, -1);\n\tlua_pop(L, 1);\n\n\tlua_getfield(L, idx, \"location\");\n\tattrib.bindingLocation = luax_checkint(L, -1);\n\tlua_pop(L, 1);\n\n\tlua_getfield(L, idx, \"name\");\n\tif (!lua_isnoneornil(L, -1))\n\t\tattrib.name = luax_checkstring(L, -1);\n\tlua_pop(L, 1);\n\n\tlua_getfield(L, idx, \"step\");\n\tif (!lua_isnoneornil(L, -1))\n\t{\n\t\tconst char *stepstr = luaL_checkstring(L, -1);\n\t\tif (!getConstant(stepstr, attrib.step))\n\t\t\tluax_enumerror(L, \"vertex attribute step\", getConstants(attrib.step), stepstr);\n\t}\n\tlua_pop(L, 1);\n\n\tlua_getfield(L, idx, \"locationinbuffer\");\n\tif (!lua_isnoneornil(L, -1))\n\t\tattrib.bindingLocationInBuffer = luax_checkint(L, -1);\n\telse\n\t\tattrib.bindingLocationInBuffer = attrib.bindingLocation;\n\tlua_pop(L, 1);\n\n\tlua_getfield(L, idx, \"nameinbuffer\");\t\n\tif (!lua_isnoneornil(L, -1))\n\t\tattrib.nameInBuffer = luax_checkstring(L, -1);\n\telse\n\t\tattrib.nameInBuffer = attrib.name;\n\tlua_pop(L, 1);\n\n\tlua_getfield(L, idx, \"startindex\");\n\tattrib.startArrayIndex = (int) luaL_optinteger(L, -1, 1) - 1;\n\tlua_pop(L, 1);\n\n\treturn attrib;\n}\n\nstatic Mesh* newMeshFromBuffers(lua_State *L)\n{\n\tstd::vector<Mesh::BufferAttribute> attributes;\n\tfor (size_t i = 1; i <= luax_objlen(L, 1); i++)\n\t{\n\t\tlua_rawgeti(L, 1, i);\n\t\tattributes.push_back(luax_checkbufferattributetable(L, -1));\n\t\tlua_pop(L, 1);\n\t}\n\n\tPrimitiveType drawmode = luax_checkmeshdrawmode(L, 2);\n\n\tMesh *t = nullptr;\n\tluax_catchexcept(L, [&]() { t = instance()->newMesh(attributes, drawmode); });\n\n\tif (t->getVertexBuffer() != nullptr)\n\t\tluax_validatebuffervertexbindings(L, t->getVertexBuffer());\n\n\treturn t;\n}\n\nint w_newMesh(lua_State *L)\n{\n\tluax_checkgraphicscreated(L);\n\n\t// Check first argument: table or number of vertices.\n\tint arg1type = lua_type(L, 1);\n\tif (arg1type != LUA_TTABLE && arg1type != LUA_TNUMBER)\n\t\tluaL_argerror(L, 1, \"table or number expected\");\n\n\tMesh *t = nullptr;\n\n\tint arg2type = lua_type(L, 2);\n\tif (luax_isbufferattributetable(L, 1))\n\t\tt = newMeshFromBuffers(L);\n\telse if (arg1type == LUA_TTABLE && (arg2type == LUA_TTABLE || arg2type == LUA_TNUMBER || arg2type == LUA_TUSERDATA))\n\t\tt = newCustomMesh(L);\n\telse\n\t\tt = newStandardMesh(L);\n\n\tluax_pushtype(L, t);\n\tt->release();\n\treturn 1;\n}\n\nint w_newTextBatch(lua_State *L)\n{\n\tluax_checkgraphicscreated(L);\n\n\tgraphics::Font *font = luax_checkfont(L, 1);\n\tTextBatch *t = nullptr;\n\n\tif (lua_isnoneornil(L, 2))\n\t\tluax_catchexcept(L, [&](){ t = instance()->newTextBatch(font); });\n\telse\n\t{\n\t\tstd::vector<love::font::ColoredString> text;\n\t\tluax_checkcoloredstring(L, 2, text);\n\n\t\tluax_catchexcept(L, [&](){ t = instance()->newTextBatch(font, text); });\n\t}\n\n\tluax_pushtype(L, t);\n\tt->release();\n\treturn 1;\n}\n\nint w_newText(lua_State *L)\n{\n\tluax_markdeprecated(L, 1, \"love.graphics.newText\", API_FUNCTION, DEPRECATED_RENAMED, \"love.graphics.newTextBatch\");\n\treturn w_newTextBatch(L);\n}\n\nint w_newVideo(lua_State *L)\n{\n\tluax_checkgraphicscreated(L);\n\n\tif (!luax_istype(L, 1, love::video::VideoStream::type))\n\t\tluax_convobj(L, 1, \"video\", \"newVideoStream\");\n\n\tauto stream = luax_checktype<love::video::VideoStream>(L, 1);\n\tfloat dpiscale = (float) luaL_optnumber(L, 2, 1.0);\n\tVideo *video = nullptr;\n\n\tluax_catchexcept(L, [&]() { video = instance()->newVideo(stream, dpiscale); });\n\n\tluax_pushtype(L, video);\n\tvideo->release();\n\treturn 1;\n}\n\nint w_readbackBuffer(lua_State *L)\n{\n\tBuffer *b = luax_checkbuffer(L, 1);\n\tlua_Integer offset = luaL_optinteger(L, 2, 0);\n\tlua_Integer size = luaL_optinteger(L, 3, b->getSize() - offset);\n\n\tdata::ByteData *dest = nullptr;\n\tsize_t destoffset = 0;\n\tif (!lua_isnoneornil(L, 4))\n\t{\n\t\tdest = luax_checktype<data::ByteData>(L, 4);\n\t\tdestoffset = (size_t) luaL_optinteger(L, 5, 0);\n\t}\n\n\tlove::data::ByteData *data = nullptr;\n\tluax_catchexcept(L, [&]() { data = instance()->readbackBuffer(b, offset, size, dest, destoffset); });\n\n\tluax_pushtype(L, data);\n\tdata->release();\n\treturn 1;\n}\n\nint w_readbackBufferAsync(lua_State *L)\n{\n\tBuffer *b = luax_checkbuffer(L, 1);\n\tlua_Integer offset = luaL_optinteger(L, 2, 0);\n\tlua_Integer size = luaL_optinteger(L, 3, b->getSize() - offset);\n\n\tdata::ByteData *dest = nullptr;\n\tsize_t destoffset = 0;\n\tif (!lua_isnoneornil(L, 4))\n\t{\n\t\tdest = luax_checktype<data::ByteData>(L, 4);\n\t\tdestoffset = (size_t) luaL_optinteger(L, 5, 0);\n\t}\n\n\tGraphicsReadback *r = nullptr;\n\tluax_catchexcept(L, [&]() { r = instance()->readbackBufferAsync(b, offset, size, dest, destoffset); });\n\n\tluax_pushtype(L, r);\n\tr->release();\n\treturn 1;\n}\n\nint w_readbackTexture(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\n\tint slice = 0;\n\tif (t->getTextureType() != TEXTURE_2D)\n\t\tslice = (int) luaL_checkinteger(L, 2) - 1;\n\n\tint mipmap = (int) luaL_optinteger(L, 3, 1) - 1;\n\n\tRect rect = {0, 0, t->getPixelWidth(mipmap), t->getPixelHeight(mipmap)};\n\tif (!lua_isnoneornil(L, 4))\n\t{\n\t\trect.x = (int) luaL_checkinteger(L, 4);\n\t\trect.y = (int) luaL_checkinteger(L, 5);\n\t\trect.w = (int) luaL_checkinteger(L, 6);\n\t\trect.h = (int) luaL_checkinteger(L, 7);\n\t}\n\n\timage::ImageData *dest = nullptr;\n\tint destx = 0;\n\tint desty = 0;\n\n\tif (!lua_isnoneornil(L, 8))\n\t{\n\t\tdest = luax_checktype<image::ImageData>(L, 8);\n\t\tdestx = (int) luaL_optinteger(L, 9, 0);\n\t\tdesty = (int) luaL_optinteger(L, 10, 0);\n\t}\n\n\timage::ImageData *imagedata = nullptr;\n\tluax_catchexcept(L, [&]() { imagedata = instance()->readbackTexture(t, slice, mipmap, rect, dest, destx, desty); });\n\n\tluax_pushtype(L, imagedata);\n\timagedata->release();\n\treturn 1;\n}\n\nint w_readbackTextureAsync(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\n\tint slice = 0;\n\tif (t->getTextureType() != TEXTURE_2D)\n\t\tslice = (int) luaL_checkinteger(L, 2) - 1;\n\n\tint mipmap = (int) luaL_optinteger(L, 3, 1) - 1;\n\n\tRect rect = {0, 0, t->getPixelWidth(mipmap), t->getPixelHeight(mipmap)};\n\tif (!lua_isnoneornil(L, 4))\n\t{\n\t\trect.x = (int) luaL_checkinteger(L, 4);\n\t\trect.y = (int) luaL_checkinteger(L, 5);\n\t\trect.w = (int) luaL_checkinteger(L, 6);\n\t\trect.h = (int) luaL_checkinteger(L, 7);\n\t}\n\n\timage::ImageData *dest = nullptr;\n\tint destx = 0;\n\tint desty = 0;\n\n\tif (!lua_isnoneornil(L, 8))\n\t{\n\t\tdest = luax_checktype<image::ImageData>(L, 8);\n\t\tdestx = (int) luaL_optinteger(L, 9, 0);\n\t\tdesty = (int) luaL_optinteger(L, 10, 0);\n\t}\n\n\tGraphicsReadback *r = nullptr;\n\tluax_catchexcept(L, [&]() { r = instance()->readbackTextureAsync(t, slice, mipmap, rect, dest, destx, desty); });\n\n\tluax_pushtype(L, r);\n\tr->release();\n\treturn 1;\n}\n\nint w_setColor(lua_State *L)\n{\n\tColorf c;\n\tif (lua_istable(L, 1))\n\t{\n\t\tfor (int i = 1; i <= 4; i++)\n\t\t\tlua_rawgeti(L, 1, i);\n\n\t\tc.r = (float) luaL_checknumber(L, -4);\n\t\tc.g = (float) luaL_checknumber(L, -3);\n\t\tc.b = (float) luaL_checknumber(L, -2);\n\t\tc.a = (float) luaL_optnumber(L, -1, 1.0);\n\n\t\tlua_pop(L, 4);\n\t}\n\telse\n\t{\n\t\tc.r = (float) luaL_checknumber(L, 1);\n\t\tc.g = (float) luaL_checknumber(L, 2);\n\t\tc.b = (float) luaL_checknumber(L, 3);\n\t\tc.a = (float) luaL_optnumber(L, 4, 1.0);\n\t}\n\tinstance()->setColor(c);\n\treturn 0;\n}\n\nint w_getColor(lua_State *L)\n{\n\tColorf c = instance()->getColor();\n\tlua_pushnumber(L, c.r);\n\tlua_pushnumber(L, c.g);\n\tlua_pushnumber(L, c.b);\n\tlua_pushnumber(L, c.a);\n\treturn 4;\n}\n\nint w_setBackgroundColor(lua_State *L)\n{\n\tColorf c;\n\tif (lua_istable(L, 1))\n\t{\n\t\tfor (int i = 1; i <= 4; i++)\n\t\t\tlua_rawgeti(L, 1, i);\n\n\t\tc.r = (float) luaL_checknumber(L, -4);\n\t\tc.g = (float) luaL_checknumber(L, -3);\n\t\tc.b = (float) luaL_checknumber(L, -2);\n\t\tc.a = (float) luaL_optnumber(L, -1, 1.0);\n\n\t\tlua_pop(L, 4);\n\t}\n\telse\n\t{\n\t\tc.r = (float) luaL_checknumber(L, 1);\n\t\tc.g = (float) luaL_checknumber(L, 2);\n\t\tc.b = (float) luaL_checknumber(L, 3);\n\t\tc.a = (float) luaL_optnumber(L, 4, 1.0);\n\t}\n\tinstance()->setBackgroundColor(c);\n\treturn 0;\n}\n\nint w_getBackgroundColor(lua_State *L)\n{\n\tColorf c = instance()->getBackgroundColor();\n\tlua_pushnumber(L, c.r);\n\tlua_pushnumber(L, c.g);\n\tlua_pushnumber(L, c.b);\n\tlua_pushnumber(L, c.a);\n\treturn 4;\n}\n\nint w_setNewFont(lua_State *L)\n{\n\tluax_markdeprecated(L, 1, \"love.graphics.setNewFont\", API_FUNCTION, DEPRECATED_NO_REPLACEMENT, nullptr);\n\n\tint ret = w_newFont(L);\n\tFont *font = luax_checktype<Font>(L, -1);\n\tinstance()->setFont(font);\n\treturn ret;\n}\n\nint w_setFont(lua_State *L)\n{\n\tFont *font = luax_checktype<Font>(L, 1);\n\tinstance()->setFont(font);\n\treturn 0;\n}\n\nint w_getFont(lua_State *L)\n{\n\tluax_checkgraphicscreated(L);\n\n\tFont *f = nullptr;\n\tluax_catchexcept(L, [&](){ f = instance()->getFont(); });\n\n\tluax_pushtype(L, f);\n\treturn 1;\n}\n\nint w_setColorMask(lua_State *L)\n{\n\tColorChannelMask mask;\n\n\tif (lua_isnoneornil(L, 1))\n\t{\n\t\tmask.r = mask.g = mask.b = mask.a = true;\n\t}\n\telse if (lua_gettop(L) <= 1)\n\t{\n\t\t// Set all color components if a single argument is given.\n\t\tmask.r = mask.g = mask.b = mask.a = luax_checkboolean(L, 1);\n\t}\n\telse\n\t{\n\t\tmask.r = luax_checkboolean(L, 1);\n\t\tmask.g = luax_checkboolean(L, 2);\n\t\tmask.b = luax_checkboolean(L, 3);\n\t\tmask.a = luax_checkboolean(L, 4);\n\t}\n\n\tinstance()->setColorMask(mask);\n\n\treturn 0;\n}\n\nint w_getColorMask(lua_State *L)\n{\n\tColorChannelMask mask = instance()->getColorMask();\n\n\tluax_pushboolean(L, mask.r);\n\tluax_pushboolean(L, mask.g);\n\tluax_pushboolean(L, mask.b);\n\tluax_pushboolean(L, mask.a);\n\n\treturn 4;\n}\n\nint w_setBlendMode(lua_State *L)\n{\n\tBlendMode mode;\n\tconst char *str = luaL_checkstring(L, 1);\n\tif (!getConstant(str, mode))\n\t\treturn luax_enumerror(L, \"blend mode\", getConstants(mode), str);\n\n\tBlendAlpha alphamode = BLENDALPHA_MULTIPLY;\n\tif (!lua_isnoneornil(L, 2))\n\t{\n\t\tconst char *alphastr = luaL_checkstring(L, 2);\n\t\tif (!getConstant(alphastr, alphamode))\n\t\t\treturn luax_enumerror(L, \"blend alpha mode\", getConstants(alphamode), alphastr);\n\t}\n\n\tluax_catchexcept(L, [&](){ instance()->setBlendMode(mode, alphamode); });\n\treturn 0;\n}\n\nint w_getBlendMode(lua_State *L)\n{\n\tconst char *str;\n\tconst char *alphastr;\n\n\tBlendAlpha alphamode;\n\tBlendMode mode = instance()->getBlendMode(alphamode);\n\n\tif (!getConstant(mode, str))\n\t\treturn luaL_error(L, \"Unknown blend mode\");\n\n\tif (!getConstant(alphamode, alphastr))\n\t\treturn luaL_error(L, \"Unknown blend alpha mode\");\n\n\tlua_pushstring(L, str);\n\tlua_pushstring(L, alphastr);\n\treturn 2;\n}\n\nstatic BlendOperation luax_checkblendop(lua_State *L, int idx)\n{\n\tBlendOperation op = BLENDOP_ADD;\n\tconst char *str = luaL_checkstring(L, idx);\n\tif (!getConstant(str, op))\n\t\tluax_enumerror(L, \"blend operation\", getConstants(op), str);\n\treturn op;\n}\n\nstatic BlendFactor luax_checkblendfactor(lua_State *L, int idx)\n{\n\tBlendFactor factor = BLENDFACTOR_ZERO;\n\tconst char *str = luaL_checkstring(L, idx);\n\tif (!getConstant(str, factor))\n\t\tluax_enumerror(L, \"blend factor\", getConstants(factor), str);\n\treturn factor;\n}\n\nstatic void luax_pushblendop(lua_State *L, BlendOperation op)\n{\n\tconst char *str;\n\tif (!getConstant(op, str))\n\t\tluaL_error(L, \"unknown blend operation\");\n\tlua_pushstring(L, str);\n}\n\nstatic void luax_pushblendfactor(lua_State *L, BlendFactor factor)\n{\n\tconst char *str;\n\tif (!getConstant(factor, str))\n\t\tluaL_error(L, \"unknown blend factor\");\n\tlua_pushstring(L, str);\n}\n\nint w_setBlendState(lua_State *L)\n{\n\tBlendState state;\n\n\tif (!lua_isnoneornil(L, 1))\n\t{\n\t\tstate.enable = true;\n\t\tif (lua_gettop(L) >= 4)\n\t\t{\n\t\t\tstate.operationRGB = luax_checkblendop(L, 1);\n\t\t\tstate.operationA = luax_checkblendop(L, 2);\n\t\t\tstate.srcFactorRGB = luax_checkblendfactor(L, 3);\n\t\t\tstate.srcFactorA = luax_checkblendfactor(L, 4);\n\t\t\tstate.dstFactorRGB = luax_checkblendfactor(L, 5);\n\t\t\tstate.dstFactorA = luax_checkblendfactor(L, 6);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstate.operationRGB = state.operationA = luax_checkblendop(L, 1);\n\t\t\tstate.srcFactorRGB = state.srcFactorA = luax_checkblendfactor(L, 2);\n\t\t\tstate.dstFactorRGB = state.dstFactorA = luax_checkblendfactor(L, 3);\n\t\t}\n\t}\n\n\tluax_catchexcept(L, [&](){ instance()->setBlendState(state); });\n\treturn 0;\n}\n\nint w_getBlendState(lua_State *L)\n{\n\tconst BlendState &state = instance()->getBlendState();\n\n\tif (state.enable)\n\t{\n\t\tluax_pushblendop(L, state.operationRGB);\n\t\tluax_pushblendop(L, state.operationA);\n\t\tluax_pushblendfactor(L, state.srcFactorRGB);\n\t\tluax_pushblendfactor(L, state.srcFactorA);\n\t\tluax_pushblendfactor(L, state.dstFactorRGB);\n\t\tluax_pushblendfactor(L, state.dstFactorA);\n\t}\n\telse\n\t{\n\t\tfor (int i = 0; i < 6; i++)\n\t\t\tlua_pushnil(L);\n\t}\n\n\treturn 6;\n}\n\nint w_setDefaultFilter(lua_State *L)\n{\n\tSamplerState s = instance()->getDefaultSamplerState();\n\n\tconst char *minstr = luaL_checkstring(L, 1);\n\tconst char *magstr = luaL_optstring(L, 2, minstr);\n\n\tif (!SamplerState::getConstant(minstr, s.minFilter))\n\t\treturn luax_enumerror(L, \"filter mode\", SamplerState::getConstants(s.minFilter), minstr);\n\tif (!SamplerState::getConstant(magstr, s.magFilter))\n\t\treturn luax_enumerror(L, \"filter mode\", SamplerState::getConstants(s.magFilter), magstr);\n\n\ts.maxAnisotropy = std::min(std::max(1, (int) luaL_optnumber(L, 3, 1.0)), LOVE_UINT8_MAX);\n\n\tinstance()->setDefaultSamplerState(s);\n\treturn 0;\n}\n\nint w_getDefaultFilter(lua_State *L)\n{\n\tconst SamplerState &s = instance()->getDefaultSamplerState();\n\tconst char *minstr;\n\tconst char *magstr;\n\tif (!SamplerState::getConstant(s.minFilter, minstr))\n\t\treturn luaL_error(L, \"Unknown minification filter mode\");\n\tif (!SamplerState::getConstant(s.magFilter, magstr))\n\t\treturn luaL_error(L, \"Unknown magnification filter mode\");\n\tlua_pushstring(L, minstr);\n\tlua_pushstring(L, magstr);\n\tlua_pushnumber(L, s.maxAnisotropy);\n\treturn 3;\n}\n\nint w_setDefaultMipmapFilter(lua_State *L)\n{\n\tSamplerState s = instance()->getDefaultSamplerState();\n\ts.mipmapFilter = SamplerState::MIPMAP_FILTER_NONE;\n\tif (!lua_isnoneornil(L, 1))\n\t{\n\t\tconst char *str = luaL_checkstring(L, 1);\n\t\tif (!SamplerState::getConstant(str, s.mipmapFilter))\n\t\t\treturn luax_enumerror(L, \"filter mode\", SamplerState::getConstants(s.mipmapFilter), str);\n\t}\n\n\ts.lodBias = -((float) luaL_optnumber(L, 2, 0.0));\n\n\tinstance()->setDefaultSamplerState(s);\n\treturn 0;\n}\n\nint w_getDefaultMipmapFilter(lua_State *L)\n{\n\tconst SamplerState &s = instance()->getDefaultSamplerState();\n\n\tconst char *str;\n\tif (SamplerState::getConstant(s.mipmapFilter, str))\n\t\tlua_pushstring(L, str);\n\telse\n\t\tlua_pushnil(L);\n\n\tlua_pushnumber(L, -s.lodBias);\n\n\treturn 2;\n}\n\nint w_setLineWidth(lua_State *L)\n{\n\tfloat width = (float)luaL_checknumber(L, 1);\n\tinstance()->setLineWidth(width);\n\treturn 0;\n}\n\nint w_setLineStyle(lua_State *L)\n{\n\tGraphics::LineStyle style;\n\tconst char *str = luaL_checkstring(L, 1);\n\tif (!Graphics::getConstant(str, style))\n\t\treturn luax_enumerror(L, \"line style\", Graphics::getConstants(style), str);\n\n\tinstance()->setLineStyle(style);\n\treturn 0;\n}\n\nint w_setLineJoin(lua_State *L)\n{\n\tGraphics::LineJoin join;\n\tconst char *str = luaL_checkstring(L, 1);\n\tif (!Graphics::getConstant(str, join))\n\t\treturn luax_enumerror(L, \"line join\", Graphics::getConstants(join), str);\n\n\tinstance()->setLineJoin(join);\n\treturn 0;\n}\n\nint w_getLineWidth(lua_State *L)\n{\n\tlua_pushnumber(L, instance()->getLineWidth());\n\treturn 1;\n}\n\nint w_getLineStyle(lua_State *L)\n{\n\tGraphics::LineStyle style = instance()->getLineStyle();\n\tconst char *str;\n\tif (!Graphics::getConstant(style, str))\n\t\treturn luaL_error(L, \"Unknown line style\");\n\tlua_pushstring(L, str);\n\treturn 1;\n}\n\nint w_getLineJoin(lua_State *L)\n{\n\tGraphics::LineJoin join = instance()->getLineJoin();\n\tconst char *str;\n\tif (!Graphics::getConstant(join, str))\n\t\treturn luaL_error(L, \"Unknown line join\");\n\tlua_pushstring(L, str);\n\treturn 1;\n}\n\nint w_setPointSize(lua_State *L)\n{\n\tfloat size = (float)luaL_checknumber(L, 1);\n\tinstance()->setPointSize(size);\n\treturn 0;\n}\n\nint w_getPointSize(lua_State *L)\n{\n\tlua_pushnumber(L, instance()->getPointSize());\n\treturn 1;\n}\n\nint w_setDepthMode(lua_State *L)\n{\n\tif (lua_isnoneornil(L, 1) && lua_isnoneornil(L, 2))\n\t\tluax_catchexcept(L, [&]() { instance()->setDepthMode(); });\n\telse\n\t{\n\t\tCompareMode compare = COMPARE_ALWAYS;\n\t\tconst char *str = luaL_checkstring(L, 1);\n\t\tbool write = luax_checkboolean(L, 2);\n\n\t\tif (!getConstant(str, compare))\n\t\t\treturn luax_enumerror(L, \"compare mode\", getConstants(compare), str);\n\n\t\tluax_catchexcept(L, [&]() { instance()->setDepthMode(compare, write); });\n\t}\n\n\treturn 0;\n}\n\nint w_getDepthMode(lua_State *L)\n{\n\tCompareMode compare = COMPARE_ALWAYS;\n\tbool write = false;\n\tinstance()->getDepthMode(compare, write);\n\n\tconst char *str;\n\tif (!getConstant(compare, str))\n\t\treturn luaL_error(L, \"Unknown compare mode\");\n\n\tlua_pushstring(L, str);\n\tluax_pushboolean(L, write);\n\treturn 2;\n}\n\nint w_setMeshCullMode(lua_State *L)\n{\n\tconst char *str = luaL_checkstring(L, 1);\n\tCullMode mode;\n\n\tif (!getConstant(str, mode))\n\t\treturn luax_enumerror(L, \"cull mode\", getConstants(mode), str);\n\n\tluax_catchexcept(L, [&]() { instance()->setMeshCullMode(mode); });\n\treturn 0;\n}\n\nint w_getMeshCullMode(lua_State *L)\n{\n\tCullMode mode = instance()->getMeshCullMode();\n\tconst char *str;\n\tif (!getConstant(mode, str))\n\t\treturn luaL_error(L, \"Unknown cull mode\");\n\tlua_pushstring(L, str);\n\treturn 1;\n}\n\nint w_setFrontFaceWinding(lua_State *L)\n{\n\tconst char *str = luaL_checkstring(L, 1);\n\tWinding winding;\n\n\tif (!getConstant(str, winding))\n\t\treturn luax_enumerror(L, \"vertex winding\", getConstants(winding), str);\n\n\tluax_catchexcept(L, [&]() { instance()->setFrontFaceWinding(winding); });\n\treturn 0;\n}\n\nint w_getFrontFaceWinding(lua_State *L)\n{\n\tWinding winding = instance()->getFrontFaceWinding();\n\tconst char *str;\n\tif (!getConstant(winding, str))\n\t\treturn luaL_error(L, \"Unknown vertex winding\");\n\tlua_pushstring(L, str);\n\treturn 1;\n}\n\nint w_setWireframe(lua_State *L)\n{\n\tinstance()->setWireframe(luax_checkboolean(L, 1));\n\treturn 0;\n}\n\nint w_isWireframe(lua_State *L)\n{\n\tluax_pushboolean(L, instance()->isWireframe());\n\treturn 1;\n}\n\nint w_setShader(lua_State *L)\n{\n\tif (lua_isnoneornil(L,1))\n\t{\n\t\tinstance()->setShader();\n\t\treturn 0;\n\t}\n\n\tShader *shader = luax_checkshader(L, 1);\n\tinstance()->setShader(shader);\n\treturn 0;\n}\n\nint w_getShader(lua_State *L)\n{\n\tShader *shader = instance()->getShader();\n\tif (shader)\n\t\tluax_pushtype(L, shader);\n\telse\n\t\tlua_pushnil(L);\n\n\treturn 1;\n}\n\nint w_getSupported(lua_State *L)\n{\n\tconst Graphics::Capabilities &caps = instance()->getCapabilities();\n\n\tif (lua_istable(L, 1))\n\t\tlua_pushvalue(L, 1);\n\telse\n\t\tlua_createtable(L, 0, (int) Graphics::FEATURE_MAX_ENUM);\n\n\tfor (int i = 0; i < (int) Graphics::FEATURE_MAX_ENUM; i++)\n\t{\n\t\tauto feature = (Graphics::Feature) i;\n\t\tconst char *name = nullptr;\n\n\t\tif (!Graphics::getConstant(feature, name))\n\t\t\tcontinue;\n\n\t\tluax_pushboolean(L, caps.features[i]);\n\t\tlua_setfield(L, -2, name);\n\t}\n\n\treturn 1;\n}\n\nint w_getTextureFormats(lua_State *L)\n{\n\tluaL_checktype(L, 1, LUA_TTABLE);\n\n\tbool rt = luax_checkboolflag(L, 1, Texture::getConstant(Texture::SETTING_RENDER_TARGET));\n\tbool computewrite = luax_boolflag(L, 1, Texture::getConstant(Texture::SETTING_COMPUTE_WRITE), false);\n\n\tOptionalBool readable;\n\tlua_getfield(L, 1, Texture::getConstant(Texture::SETTING_READABLE));\n\tif (!lua_isnoneornil(L, -1))\n\t\treadable.set(luax_checkboolean(L, -1));\n\tlua_pop(L, 1);\n\n\tif (lua_istable(L, 2))\n\t\tlua_pushvalue(L, 2);\n\telse\n\t\tlua_createtable(L, 0, (int) PIXELFORMAT_MAX_ENUM);\n\n\tfor (int i = 0; i < (int) PIXELFORMAT_MAX_ENUM; i++)\n\t{\n\t\tPixelFormat format = (PixelFormat) i;\n\t\tconst char *name = nullptr;\n\n\t\tif (format == PIXELFORMAT_UNKNOWN || !love::getConstant(format, name))\n\t\t\tcontinue;\n\n\t\tuint32 usage = PIXELFORMATUSAGEFLAGS_NONE;\n\t\tif (rt)\n\t\t\tusage |= PIXELFORMATUSAGEFLAGS_RENDERTARGET;\n\t\tif (readable.get(!isPixelFormatDepthStencil(format)))\n\t\t\tusage |= PIXELFORMATUSAGEFLAGS_SAMPLE;\n\t\tif (computewrite)\n\t\t\tusage |= PIXELFORMATUSAGEFLAGS_COMPUTEWRITE;\n\n\t\tluax_pushboolean(L, instance()->isPixelFormatSupported(format, (PixelFormatUsageFlags) usage));\n\t\tlua_setfield(L, -2, name);\n\t}\n\n\treturn 1;\n}\n\nstatic int w__getFormats(lua_State *L, int idx, bool (*isFormatSupported)(PixelFormat), bool (*ignore)(PixelFormat))\n{\n\tif (lua_istable(L, idx))\n\t\tlua_pushvalue(L, idx);\n\telse\n\t\tlua_createtable(L, 0, (int) PIXELFORMAT_MAX_ENUM);\n\n\tfor (int i = 0; i < (int) PIXELFORMAT_MAX_ENUM; i++)\n\t{\n\t\tPixelFormat format = (PixelFormat) i;\n\t\tconst char *name = nullptr;\n\n\t\tif (format == PIXELFORMAT_UNKNOWN || !love::getConstant(format, name) || ignore(format))\n\t\t\tcontinue;\n\n\t\tluax_pushboolean(L, isFormatSupported(format));\n\t\tlua_setfield(L, -2, name);\n\t}\n\n\treturn 1;\n}\n\nint w_getCanvasFormats(lua_State *L)\n{\n\tluax_markdeprecated(L, 1, \"love.graphics.getCanvasFormats\", API_FUNCTION, DEPRECATED_REPLACED, \"love.graphics.getTextureFormats\");\n\n\tbool (*supported)(PixelFormat);\n\n\tint idx = 1;\n\tif (lua_type(L, 1) == LUA_TBOOLEAN)\n\t{\n\t\tidx = 2;\n\t\tif (luax_checkboolean(L, 1))\n\t\t{\n\t\t\tsupported = [](PixelFormat format) -> bool\n\t\t\t{\n\t\t\t\tconst uint32 usage = PIXELFORMATUSAGEFLAGS_SAMPLE | PIXELFORMATUSAGEFLAGS_RENDERTARGET;\n\t\t\t\treturn instance()->isPixelFormatSupported(format, (PixelFormatUsageFlags) usage);\n\t\t\t};\n\t\t}\n\t\telse\n\t\t{\n\t\t\tsupported = [](PixelFormat format) -> bool\n\t\t\t{\n\t\t\t\treturn instance()->isPixelFormatSupported(format, PIXELFORMATUSAGEFLAGS_RENDERTARGET);\n\t\t\t};\n\t\t}\n\t}\n\telse\n\t{\n\t\tsupported = [](PixelFormat format) -> bool\n\t\t{\n\t\t\tbool readable = !isPixelFormatDepthStencil(format);\n\t\t\tuint32 usage = PIXELFORMATUSAGEFLAGS_RENDERTARGET;\n\t\t\tif (readable)\n\t\t\t\tusage |= PIXELFORMATUSAGEFLAGS_SAMPLE;\n\t\t\treturn instance()->isPixelFormatSupported(format, (PixelFormatUsageFlags) usage);\n\t\t};\n\t}\n\n\treturn w__getFormats(L, idx, supported, isPixelFormatCompressed);\n}\n\nint w_getImageFormats(lua_State *L)\n{\n\tluax_markdeprecated(L, 1, \"love.graphics.getImageFormats\", API_FUNCTION, DEPRECATED_REPLACED, \"love.graphics.getTextureFormats\");\n\n\tconst auto supported = [](PixelFormat format) -> bool\n\t{\n\t\treturn instance()->isPixelFormatSupported(format, PIXELFORMATUSAGEFLAGS_SAMPLE);\n\t};\n\n\tconst auto ignore = [](PixelFormat format) -> bool\n\t{\n\t\treturn !(image::ImageData::validPixelFormat(format) || isPixelFormatCompressed(format));\n\t};\n\n\treturn w__getFormats(L, 1, supported, ignore);\n}\n\nint w_getTextureTypes(lua_State *L)\n{\n\tconst Graphics::Capabilities &caps = instance()->getCapabilities();\n\n\tif (lua_istable(L, 1))\n\t\tlua_pushvalue(L, 1);\n\telse\n\t\tlua_createtable(L, 0, (int) TEXTURE_MAX_ENUM);\n\n\tfor (int i = 0; i < (int) TEXTURE_MAX_ENUM; i++)\n\t{\n\t\tTextureType textype = (TextureType) i;\n\t\tconst char *name = nullptr;\n\n\t\tif (!Texture::getConstant(textype, name))\n\t\t\tcontinue;\n\n\t\tluax_pushboolean(L, caps.textureTypes[i]);\n\t\tlua_setfield(L, -2, name);\n\t}\n\n\treturn 1;\n}\n\nint w_getRendererInfo(lua_State *L)\n{\n\tGraphics::RendererInfo info;\n\tluax_catchexcept(L, [&](){ info = instance()->getRendererInfo(); });\n\n\tluax_pushstring(L, info.name);\n\tluax_pushstring(L, info.version);\n\tluax_pushstring(L, info.vendor);\n\tluax_pushstring(L, info.device);\n\treturn 4;\n}\n\nint w_getSystemLimits(lua_State *L)\n{\n\tconst Graphics::Capabilities &caps = instance()->getCapabilities();\n\n\tif (lua_istable(L, 1))\n\t\tlua_pushvalue(L, 1);\n\telse\n\t\tlua_createtable(L, 0, (int) Graphics::LIMIT_MAX_ENUM);\n\n\tfor (int i = 0; i < (int) Graphics::LIMIT_MAX_ENUM; i++)\n\t{\n\t\tGraphics::SystemLimit limittype = (Graphics::SystemLimit) i;\n\t\tconst char *name = nullptr;\n\n\t\tif (!Graphics::getConstant(limittype, name))\n\t\t\tcontinue;\n\n\t\tlua_pushnumber(L, caps.limits[i]);\n\t\tlua_setfield(L, -2, name);\n\t}\n\n\treturn 1;\n}\n\nint w_getStats(lua_State *L)\n{\n\tGraphics::Stats stats = instance()->getStats();\n\n\tif (lua_istable(L, 1))\n\t\tlua_pushvalue(L, 1);\n\telse\n\t\tlua_createtable(L, 0, 7);\n\n\tlua_pushinteger(L, stats.drawCalls);\n\tlua_setfield(L, -2, \"drawcalls\");\n\n\tlua_pushinteger(L, stats.drawCallsBatched);\n\tlua_setfield(L, -2, \"drawcallsbatched\");\n\n\tlua_pushinteger(L, stats.renderTargetSwitches);\n\tlua_setfield(L, -2, \"canvasswitches\");\n\n\tlua_pushinteger(L, stats.shaderSwitches);\n\tlua_setfield(L, -2, \"shaderswitches\");\n\n\tlua_pushinteger(L, stats.textures);\n\tlua_setfield(L, -2, \"textures\");\n\n\tlua_pushinteger(L, stats.fonts);\n\tlua_setfield(L, -2, \"fonts\");\n\n\tlua_pushinteger(L, stats.buffers);\n\tlua_setfield(L, -2, \"buffers\");\n\n\tlua_pushnumber(L, (lua_Number) stats.textureMemory);\n\tlua_setfield(L, -2, \"texturememory\");\n\n\tlua_pushnumber(L, (lua_Number) stats.bufferMemory);\n\tlua_setfield(L, -2, \"buffermemory\");\n\n\treturn 1;\n}\n\nint w_draw(lua_State *L)\n{\n\tDrawable *drawable = nullptr;\n\tTexture *texture = nullptr;\n\tQuad *quad = luax_totype<Quad>(L, 2);\n\tint startidx = 2;\n\n\tif (quad != nullptr)\n\t{\n\t\ttexture = luax_checktexture(L, 1);\n\t\tstartidx = 3;\n\t}\n\telse if (lua_isnil(L, 2) && !lua_isnoneornil(L, 3))\n\t{\n\t\treturn luax_typerror(L, 2, \"Quad\");\n\t}\n\telse\n\t{\n\t\tdrawable = luax_checktype<Drawable>(L, 1);\n\t\tstartidx = 2;\n\t}\n\n\tluax_checkstandardtransform(L, startidx, [&](const Matrix4 &m)\n\t{\n\t\tluax_catchexcept(L, [&]()\n\t\t{\n\t\t\tif (texture && quad)\n\t\t\t\tinstance()->draw(texture, quad, m);\n\t\t\telse\n\t\t\t\tinstance()->draw(drawable, m);\n\t\t});\n\t});\n\n\treturn 0;\n}\n\nint w_drawLayer(lua_State *L)\n{\n\tTexture *texture = luax_checktexture(L, 1);\n\tint layer = (int) luaL_checkinteger(L, 2) - 1;\n\n\tint startidx = 3;\n\tQuad *quad = luax_totype<Quad>(L, startidx);\n\n\tif (quad != nullptr)\n\t{\n\t\ttexture = luax_checktexture(L, 1);\n\t\tstartidx++;\n\t}\n\telse if (lua_isnil(L, startidx) && !lua_isnoneornil(L, startidx + 1))\n\t{\n\t\treturn luax_typerror(L, startidx, \"Quad\");\n\t}\n\n\tluax_checkstandardtransform(L, startidx, [&](const Matrix4 &m)\n\t{\n\t\tluax_catchexcept(L, [&]()\n\t\t{\n\t\t\tif (quad)\n\t\t\t\tinstance()->drawLayer(texture, layer, quad, m);\n\t\t\telse\n\t\t\t\tinstance()->drawLayer(texture, layer, m);\n\t\t});\n\t});\n\n\treturn 0;\n}\n\nint w_drawInstanced(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\tint instancecount = (int) luaL_checkinteger(L, 2);\n\n\tluax_checkstandardtransform(L, 3, [&](const Matrix4 &m)\n\t{\n\t\tluax_catchexcept(L, [&]() { instance()->drawInstanced(t, m, instancecount); });\n\t});\n\n\treturn 0;\n}\n\nint w_drawIndirect(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\tBuffer *argsbuffer = luax_checkbuffer(L, 2);\n\tint argsindex = (int) luaL_checkinteger(L, 3) - 1;\n\n\tluax_checkstandardtransform(L, 4, [&](const Matrix4 &m)\n\t{\n\t\tluax_catchexcept(L, [&]() { instance()->drawIndirect(t, m, argsbuffer, argsindex); });\n\t});\n\n\treturn 0;\n}\n\nint w_drawFromShader(lua_State *L)\n{\n\tif (luax_istype(L, 1, Buffer::type))\n\t{\n\t\t// Indexed drawing.\n\t\tBuffer *t = luax_checkbuffer(L, 1);\n\n\t\tint indexcount = (int) luaL_checkinteger(L, 2);\n\t\tint instancecount = (int) luaL_optinteger(L, 3, 1);\n\t\tint indexstart = (int) luaL_optinteger(L, 4, 1) - 1;\n\n\t\tTexture *tex = nullptr;\n\t\tif (!lua_isnoneornil(L, 5))\n\t\t\ttex = luax_checktexture(L, 5);\n\n\t\tluax_catchexcept(L, [&]() { instance()->drawFromShader(t, indexcount, instancecount, indexstart, tex); });\n\t}\n\telse\n\t{\n\t\tconst char *primstr = luaL_checkstring(L, 1);\n\t\tPrimitiveType primtype = PRIMITIVE_TRIANGLES;\n\t\tif (!getConstant(primstr, primtype))\n\t\t\treturn luax_enumerror(L, \"primitive type\", getConstants(primtype), primstr);\n\n\t\tint vertexcount = (int) luaL_checkinteger(L, 2);\n\t\tint instancecount = (int) luaL_optinteger(L, 3, 1);\n\n\t\tTexture *tex = nullptr;\n\t\tif (!lua_isnoneornil(L, 4))\n\t\t\ttex = luax_checktexture(L, 4);\n\n\t\tluax_catchexcept(L, [&]() { instance()->drawFromShader(primtype, vertexcount, instancecount, tex); });\n\t}\n\treturn 0;\n}\n\nint w_drawFromShaderIndirect(lua_State *L)\n{\n\tif (luax_istype(L, 1, Buffer::type))\n\t{\n\t\t// Indexed drawing.\n\t\tBuffer *t = luax_checkbuffer(L, 1);\n\t\tBuffer *argsbuffer = luax_checkbuffer(L, 2);\n\t\tint argsindex = (int) luaL_optinteger(L, 3, 1) - 1;\n\n\t\tTexture *tex = nullptr;\n\t\tif (!lua_isnoneornil(L, 4))\n\t\t\ttex = luax_checktexture(L, 4);\n\n\t\tluax_catchexcept(L, [&]() { instance()->drawFromShaderIndirect(t, argsbuffer, argsindex, tex); });\n\t}\n\telse\n\t{\n\t\tconst char *primstr = luaL_checkstring(L, 1);\n\t\tPrimitiveType primtype = PRIMITIVE_TRIANGLES;\n\t\tif (!getConstant(primstr, primtype))\n\t\t\treturn luax_enumerror(L, \"primitive type\", getConstants(primtype), primstr);\n\n\t\tBuffer *argsbuffer = luax_checkbuffer(L, 2);\n\t\tint argsindex = (int) luaL_optinteger(L, 3, 1) - 1;\n\n\t\tTexture *tex = nullptr;\n\t\tif (!lua_isnoneornil(L, 4))\n\t\t\ttex = luax_checktexture(L, 4);\n\n\t\tluax_catchexcept(L, [&]() { instance()->drawFromShaderIndirect(primtype, argsbuffer, argsindex, tex); });\n\t}\n\treturn 0;\n}\n\nint w_print(lua_State *L)\n{\n\tstd::vector<love::font::ColoredString> str;\n\tluax_checkcoloredstring(L, 1, str);\n\n\tif (luax_istype(L, 2, Font::type))\n\t{\n\t\tFont *font = luax_checkfont(L, 2);\n\n\t\tluax_checkstandardtransform(L, 3, [&](const Matrix4 &m)\n\t\t{\n\t\t\tluax_catchexcept(L, [&](){ instance()->print(str, font, m); });\n\t\t});\n\t}\n\telse\n\t{\n\t\tluax_checkstandardtransform(L, 2, [&](const Matrix4 &m)\n\t\t{\n\t\t\tluax_catchexcept(L, [&](){ instance()->print(str, m); });\n\t\t});\n\t}\n\n\treturn 0;\n}\n\nint w_printf(lua_State *L)\n{\n\tstd::vector<love::font::ColoredString> str;\n\tluax_checkcoloredstring(L, 1, str);\n\n\tFont *font = nullptr;\n\tint startidx = 2;\n\n\tif (luax_istype(L, startidx, Font::type))\n\t{\n\t\tfont = luax_checkfont(L, startidx);\n\t\tstartidx++;\n\t}\n\n\tFont::AlignMode align = Font::ALIGN_LEFT;\n\tMatrix4 m;\n\n\tint formatidx = startidx + 2;\n\n\tif (luax_istype(L, startidx, math::Transform::type))\n\t{\n\t\tmath::Transform *tf = luax_totype<math::Transform>(L, startidx);\n\t\tm = tf->getMatrix();\n\t\tformatidx = startidx + 1;\n\t}\n\telse\n\t{\n\t\tfloat x = (float)luaL_checknumber(L, startidx + 0);\n\t\tfloat y = (float)luaL_checknumber(L, startidx + 1);\n\n\t\tfloat angle = (float) luaL_optnumber(L, startidx + 4, 0.0f);\n\t\tfloat sx = (float) luaL_optnumber(L, startidx + 5, 1.0f);\n\t\tfloat sy = (float) luaL_optnumber(L, startidx + 6, sx);\n\t\tfloat ox = (float) luaL_optnumber(L, startidx + 7, 0.0f);\n\t\tfloat oy = (float) luaL_optnumber(L, startidx + 8, 0.0f);\n\t\tfloat kx = (float) luaL_optnumber(L, startidx + 9, 0.0f);\n\t\tfloat ky = (float) luaL_optnumber(L, startidx + 10, 0.0f);\n\n\t\tm = Matrix4(x, y, angle, sx, sy, ox, oy, kx, ky);\n\t}\n\n\tfloat wrap = (float)luaL_checknumber(L, formatidx);\n\n\tconst char *astr = lua_isnoneornil(L, formatidx + 1) ? nullptr : luaL_checkstring(L, formatidx + 1);\n\tif (astr != nullptr && !Font::getConstant(astr, align))\n\t\treturn luax_enumerror(L, \"alignment\", Font::getConstants(align), astr);\n\n\tif (font != nullptr)\n\t\tluax_catchexcept(L, [&](){ instance()->printf(str, font, wrap, align, m); });\n\telse\n\t\tluax_catchexcept(L, [&](){ instance()->printf(str, wrap, align, m); });\n\n\treturn 0;\n}\n\nint w_points(lua_State *L)\n{\n\t// love.graphics.points has 3 variants:\n\t// - points(x1, y1, x2, y2, ...)\n\t// - points({x1, y1, x2, y2, ...})\n\t// - points({{x1, y1 [, r, g, b, a]}, {x2, y2 [, r, g, b, a]}, ...})\n\n\tint args = lua_gettop(L);\n\tbool is_table = false;\n\tbool is_table_of_tables = false;\n\tif (args == 1 && lua_istable(L, 1))\n\t{\n\t\tis_table = true;\n\t\targs = (int) luax_objlen(L, 1);\n\n\t\tlua_rawgeti(L, 1, 1);\n\t\tis_table_of_tables = lua_istable(L, -1);\n\t\tlua_pop(L, 1);\n\t}\n\n\tif (args % 2 != 0 && !is_table_of_tables)\n\t\treturn luaL_error(L, \"Number of vertex components must be a multiple of two\");\n\n\tint numpositions = args / 2;\n\tif (is_table_of_tables)\n\t\tnumpositions = args;\n\n\tVector2 *positions = nullptr;\n\tColorf *colors = nullptr;\n\n\tif (is_table_of_tables)\n\t{\n\t\tsize_t datasize = (sizeof(Vector2) + sizeof(Colorf)) * numpositions;\n\t\tuint8 *data = instance()->getScratchBuffer<uint8>(datasize);\n\n\t\tpositions = (Vector2 *) data;\n\t\tcolors = (Colorf *) (data + sizeof(Vector2) * numpositions);\n\t}\n\telse\n\t\tpositions = instance()->getScratchBuffer<Vector2>(numpositions);\n\n\tif (is_table)\n\t{\n\t\tif (is_table_of_tables)\n\t\t{\n\t\t\t// points({{x1, y1 [, r, g, b, a]}, {x2, y2 [, r, g, b, a]}, ...})\n\t\t\tfor (int i = 0; i < args; i++)\n\t\t\t{\n\t\t\t\tlua_rawgeti(L, 1, i + 1);\n\t\t\t\tfor (int j = 1; j <= 6; j++)\n\t\t\t\t\tlua_rawgeti(L, -j, j);\n\n\t\t\t\tpositions[i].x = luax_checkfloat(L, -6);\n\t\t\t\tpositions[i].y = luax_checkfloat(L, -5);\n\n\t\t\t\tcolors[i].r = (float) luax_optnumberclamped01(L, -4, 1.0);\n\t\t\t\tcolors[i].g = (float) luax_optnumberclamped01(L, -3, 1.0);\n\t\t\t\tcolors[i].b = (float) luax_optnumberclamped01(L, -2, 1.0);\n\t\t\t\tcolors[i].a = (float) luax_optnumberclamped01(L, -1, 1.0);\n\n\t\t\t\tlua_pop(L, 7);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// points({x1, y1, x2, y2, ...})\n\t\t\tfor (int i = 0; i < numpositions; i++)\n\t\t\t{\n\t\t\t\tlua_rawgeti(L, 1, i * 2 + 1);\n\t\t\t\tlua_rawgeti(L, 1, i * 2 + 2);\n\t\t\t\tpositions[i].x = luax_checkfloat(L, -2);\n\t\t\t\tpositions[i].y = luax_checkfloat(L, -1);\n\t\t\t\tlua_pop(L, 2);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (int i = 0; i < numpositions; i++)\n\t\t{\n\t\t\tpositions[i].x = luax_checkfloat(L, i * 2 + 1);\n\t\t\tpositions[i].y = luax_checkfloat(L, i * 2 + 2);\n\t\t}\n\t}\n\n\tluax_catchexcept(L, [&](){ instance()->points(positions, colors, numpositions); });\n\treturn 0;\n}\n\nint w_line(lua_State *L)\n{\n\tint args = lua_gettop(L);\n\tint arg1type = lua_type(L, 1);\n\tbool is_table = false;\n\n\tif (args == 1 && arg1type == LUA_TTABLE)\n\t{\n\t\targs = (int) luax_objlen(L, 1);\n\t\tis_table = true;\n\t}\n\n\tif (arg1type != LUA_TTABLE && arg1type != LUA_TNUMBER)\n\t\treturn luax_typerror(L, 1, \"table or number\");\n\telse if (args % 2 != 0)\n\t\treturn luaL_error(L, \"Number of vertex components must be a multiple of two.\");\n\telse if (args < 4)\n\t\treturn luaL_error(L, \"Need at least two vertices to draw a line.\");\n\n\tint numvertices = args / 2;\n\n\tVector2 *coords = instance()->getScratchBuffer<Vector2>(numvertices);\n\tif (is_table)\n\t{\n\t\tfor (int i = 0; i < numvertices; ++i)\n\t\t{\n\t\t\tlua_rawgeti(L, 1, (i * 2) + 1);\n\t\t\tlua_rawgeti(L, 1, (i * 2) + 2);\n\t\t\tcoords[i].x = luax_checkfloat(L, -2);\n\t\t\tcoords[i].y = luax_checkfloat(L, -1);\n\t\t\tlua_pop(L, 2);\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (int i = 0; i < numvertices; ++i)\n\t\t{\n\t\t\tcoords[i].x = luax_checkfloat(L, (i * 2) + 1);\n\t\t\tcoords[i].y = luax_checkfloat(L, (i * 2) + 2);\n\t\t}\n\t}\n\n\tluax_catchexcept(L,\n\t\t[&](){ instance()->polyline(coords, numvertices); }\n\t);\n\n\treturn 0;\n}\n\nint w_rectangle(lua_State *L)\n{\n\tGraphics::DrawMode mode;\n\tconst char *str = luaL_checkstring(L, 1);\n\tif (!Graphics::getConstant(str, mode))\n\t\treturn luax_enumerror(L, \"draw mode\", Graphics::getConstants(mode), str);\n\n\tfloat x = (float)luaL_checknumber(L, 2);\n\tfloat y = (float)luaL_checknumber(L, 3);\n\tfloat w = (float)luaL_checknumber(L, 4);\n\tfloat h = (float)luaL_checknumber(L, 5);\n\n\tif (lua_isnoneornil(L, 6))\n\t{\n\t\tluax_catchexcept(L, [&](){ instance()->rectangle(mode, x, y, w, h); });\n\t\treturn 0;\n\t}\n\n\tfloat rx = (float)luaL_optnumber(L, 6, 0.0);\n\tfloat ry = (float)luaL_optnumber(L, 7, rx);\n\n\tif (lua_isnoneornil(L, 8))\n\t\tluax_catchexcept(L, [&](){ instance()->rectangle(mode, x, y, w, h, rx, ry); });\n\telse\n\t{\n\t\tint points = (int) luaL_checkinteger(L, 8);\n\t\tluax_catchexcept(L, [&](){ instance()->rectangle(mode, x, y, w, h, rx, ry, points); });\n\t}\n\n\treturn 0;\n}\n\nint w_circle(lua_State *L)\n{\n\tGraphics::DrawMode mode;\n\tconst char *str = luaL_checkstring(L, 1);\n\tif (!Graphics::getConstant(str, mode))\n\t\treturn luax_enumerror(L, \"draw mode\", Graphics::getConstants(mode), str);\n\n\tfloat x = (float)luaL_checknumber(L, 2);\n\tfloat y = (float)luaL_checknumber(L, 3);\n\tfloat radius = (float)luaL_checknumber(L, 4);\n\n\tif (lua_isnoneornil(L, 5))\n\t\tluax_catchexcept(L, [&](){ instance()->circle(mode, x, y, radius); });\n\telse\n\t{\n\t\tint points = (int) luaL_checkinteger(L, 5);\n\t\tluax_catchexcept(L, [&](){ instance()->circle(mode, x, y, radius, points); });\n\t}\n\n\treturn 0;\n}\n\nint w_ellipse(lua_State *L)\n{\n\tGraphics::DrawMode mode;\n\tconst char *str = luaL_checkstring(L, 1);\n\tif (!Graphics::getConstant(str, mode))\n\t\treturn luax_enumerror(L, \"draw mode\", Graphics::getConstants(mode), str);\n\n\tfloat x = (float)luaL_checknumber(L, 2);\n\tfloat y = (float)luaL_checknumber(L, 3);\n\tfloat a = (float)luaL_checknumber(L, 4);\n\tfloat b = (float)luaL_optnumber(L, 5, a);\n\n\tif (lua_isnoneornil(L, 6))\n\t\tluax_catchexcept(L, [&](){ instance()->ellipse(mode, x, y, a, b); });\n\telse\n\t{\n\t\tint points = (int) luaL_checkinteger(L, 6);\n\t\tluax_catchexcept(L, [&](){ instance()->ellipse(mode, x, y, a, b, points); });\n\t}\n\n\treturn 0;\n}\n\nint w_arc(lua_State *L)\n{\n\tGraphics::DrawMode drawmode;\n\tconst char *drawstr = luaL_checkstring(L, 1);\n\tif (!Graphics::getConstant(drawstr, drawmode))\n\t\treturn luax_enumerror(L, \"draw mode\", Graphics::getConstants(drawmode), drawstr);\n\n\tint startidx = 2;\n\n\tGraphics::ArcMode arcmode = Graphics::ARC_PIE;\n\n\tif (lua_type(L, 2) == LUA_TSTRING)\n\t{\n\t\tconst char *arcstr = luaL_checkstring(L, 2);\n\t\tif (!Graphics::getConstant(arcstr, arcmode))\n\t\t\treturn luax_enumerror(L, \"arc mode\", Graphics::getConstants(arcmode), arcstr);\n\n\t\tstartidx = 3;\n\t}\n\n\tfloat x = (float) luaL_checknumber(L, startidx + 0);\n\tfloat y = (float) luaL_checknumber(L, startidx + 1);\n\tfloat radius = (float) luaL_checknumber(L, startidx + 2);\n\tfloat angle1 = (float) luaL_checknumber(L, startidx + 3);\n\tfloat angle2 = (float) luaL_checknumber(L, startidx + 4);\n\n\tif (lua_isnoneornil(L, startidx + 5))\n\t\tluax_catchexcept(L, [&](){ instance()->arc(drawmode, arcmode, x, y, radius, angle1, angle2); });\n\telse\n\t{\n\t\tint points = (int) luaL_checkinteger(L, startidx + 5);\n\t\tluax_catchexcept(L, [&](){ instance()->arc(drawmode, arcmode, x, y, radius, angle1, angle2, points); });\n\t}\n\n\treturn 0;\n}\n\nint w_polygon(lua_State *L)\n{\n\tint args = lua_gettop(L) - 1;\n\n\tGraphics::DrawMode mode;\n\tconst char *str = luaL_checkstring(L, 1);\n\tif (!Graphics::getConstant(str, mode))\n\t\treturn luax_enumerror(L, \"draw mode\", Graphics::getConstants(mode), str);\n\n\tbool is_table = false;\n\tif (args == 1 && lua_istable(L, 2))\n\t{\n\t\targs = (int) luax_objlen(L, 2);\n\t\tis_table = true;\n\t}\n\n\tif (args % 2 != 0)\n\t\treturn luaL_error(L, \"Number of vertex components must be a multiple of two\");\n\telse if (args < 6)\n\t\treturn luaL_error(L, \"Need at least three vertices to draw a polygon\");\n\n\tint numvertices = args / 2;\n\n\t// fetch coords\n\tVector2 *coords = instance()->getScratchBuffer<Vector2>(numvertices + 1);\n\tif (is_table)\n\t{\n\t\tfor (int i = 0; i < numvertices; ++i)\n\t\t{\n\t\t\tlua_rawgeti(L, 2, (i * 2) + 1);\n\t\t\tlua_rawgeti(L, 2, (i * 2) + 2);\n\t\t\tcoords[i].x = luax_checkfloat(L, -2);\n\t\t\tcoords[i].y = luax_checkfloat(L, -1);\n\t\t\tlua_pop(L, 2);\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (int i = 0; i < numvertices; ++i)\n\t\t{\n\t\t\tcoords[i].x = luax_checkfloat(L, (i * 2) + 2);\n\t\t\tcoords[i].y = luax_checkfloat(L, (i * 2) + 3);\n\t\t}\n\t}\n\n\t// make a closed loop\n\tcoords[numvertices] = coords[0];\n\n\tluax_catchexcept(L, [&](){ instance()->polygon(mode, coords, numvertices+1); });\n\treturn 0;\n}\n\nint w_dispatchThreadgroups(lua_State* L)\n{\n\tShader *shader = luax_checkshader(L, 1);\n\tint x = (int) luaL_checkinteger(L, 2);\n\tint y = (int) luaL_optinteger(L, 3, 1);\n\tint z = (int) luaL_optinteger(L, 4, 1);\n\tluax_catchexcept(L, [&](){ instance()->dispatchThreadgroups(shader, x, y, z); });\n\treturn 0;\n}\n\nint w_dispatchIndirect(lua_State *L)\n{\n\tShader *shader = luax_checkshader(L, 1);\n\tBuffer *argsbuffer = luax_checkbuffer(L, 2);\n\tint argsindex = (int) luaL_optinteger(L, 3, 1) - 1;\n\tluax_catchexcept(L, [&]() { instance()->dispatchIndirect(shader, argsbuffer, argsindex); });\n\treturn 0;\n}\n\nint w_copyBuffer(lua_State *L)\n{\n\tBuffer *source = luax_checkbuffer(L, 1);\n\tBuffer *dest = luax_checkbuffer(L, 2);\n\n\tptrdiff_t sourceoffset = luaL_optinteger(L, 3, 0);\n\tptrdiff_t destoffset = luaL_optinteger(L, 4, 0);\n\n\tptrdiff_t size = std::min(source->getSize() - sourceoffset, dest->getSize() - destoffset);\n\tif (!lua_isnoneornil(L, 5))\n\t\tsize = luaL_checkinteger(L, 5);\n\n\tif (sourceoffset < 0 || destoffset < 0)\n\t\treturn luaL_error(L, \"copyBuffer offsets cannot be negative.\");\n\tif (size <= 0)\n\t\treturn luaL_error(L, \"copyBuffer size must be greater than 0.\");\n\n\tluax_catchexcept(L, [&](){ instance()->copyBuffer(source, dest, sourceoffset, destoffset, size); });\n\treturn 0;\n}\n\nint w_copyBufferToTexture(lua_State *L)\n{\n\tBuffer *source = luax_checkbuffer(L, 1);\n\tTexture *dest = luax_checktexture(L, 2);\n\n\tptrdiff_t sourceoffset = luaL_optinteger(L, 3, 0);\n\tif (sourceoffset < 0)\n\t\treturn luaL_error(L, \"copyBufferToTexture source offset cannot be negative.\");\n\n\tint sourcewidth = (int) luaL_optinteger(L, 4, 0);\n\n\tint slice = 0;\n\tint mipmap = 0;\n\n\tif (dest->getTextureType() != TEXTURE_2D)\n\t\tslice = (int) luaL_checkinteger(L, 5) - 1;\n\n\tmipmap = (int) luaL_optinteger(L, 6, 1) - 1;\n\n\tRect rect = {0, 0, dest->getPixelWidth(mipmap), dest->getPixelHeight(mipmap)};\n\tif (!lua_isnoneornil(L, 7))\n\t{\n\t\trect.x = (int) luaL_checkinteger(L, 7);\n\t\trect.y = (int) luaL_checkinteger(L, 8);\n\t\trect.w = (int) luaL_checkinteger(L, 9);\n\t\trect.h = (int) luaL_checkinteger(L, 10);\n\t}\n\n\tluax_catchexcept(L, [&](){ instance()->copyBufferToTexture(source, dest, sourceoffset, sourcewidth, slice, mipmap, rect); });\n\treturn 0;\n}\n\nint w_copyTextureToBuffer(lua_State *L)\n{\n\tTexture *source = luax_checktexture(L, 1);\n\tBuffer *dest = luax_checkbuffer(L, 2);\n\n\tint slice = 0;\n\tint mipmap = 0;\n\n\tif (source->getTextureType() != TEXTURE_2D)\n\t\tslice = (int) luaL_checkinteger(L, 3) - 1;\n\n\tmipmap = (int) luaL_optinteger(L, 4, 1) - 1;\n\n\tRect rect = {0, 0, source->getPixelWidth(mipmap), source->getPixelHeight(mipmap)};\n\tif (!lua_isnoneornil(L, 5))\n\t{\n\t\trect.x = (int) luaL_checkinteger(L, 5);\n\t\trect.y = (int) luaL_checkinteger(L, 6);\n\t\trect.w = (int) luaL_checkinteger(L, 7);\n\t\trect.h = (int) luaL_checkinteger(L, 8);\n\t}\n\n\tptrdiff_t destoffset = luaL_optinteger(L, 9, 0);\n\tif (destoffset < 0)\n\t\treturn luaL_error(L, \"copyTextureToBuffer dest offset cannot be negative.\");\n\n\tint destwidth = (int) luaL_optinteger(L, 10, 0);\n\n\tluax_catchexcept(L, [&](){ instance()->copyTextureToBuffer(source, dest, slice, mipmap, rect, destoffset, destwidth); });\n\treturn 0;\n}\n\nint w_flushBatch(lua_State *)\n{\n\tinstance()->flushBatchedDraws();\n\treturn 0;\n}\n\nint w_getStackDepth(lua_State *L)\n{\n\tlua_pushnumber(L, instance()->getStackDepth());\n\treturn 1;\n}\n\nint w_push(lua_State *L)\n{\n\tGraphics::StackType stype = Graphics::STACK_TRANSFORM;\n\tconst char *sname = lua_isnoneornil(L, 1) ? nullptr : luaL_checkstring(L, 1);\n\tif (sname && !Graphics::getConstant(sname, stype))\n\t\treturn luax_enumerror(L, \"graphics stack type\", Graphics::getConstants(stype), sname);\n\n\tluax_catchexcept(L, [&](){ instance()->push(stype); });\n\n\tif (luax_istype(L, 2, math::Transform::type))\n\t{\n\t\tmath::Transform *t = luax_totype<math::Transform>(L, 2);\n\t\tluax_catchexcept(L, [&]() { instance()->applyTransform(t->getMatrix()); });\n\t}\n\n\treturn 0;\n}\n\nint w_pop(lua_State *L)\n{\n\tluax_catchexcept(L, [&](){ instance()->pop(); });\n\treturn 0;\n}\n\nint w_rotate(lua_State *L)\n{\n\tfloat angle = (float)luaL_checknumber(L, 1);\n\tinstance()->rotate(angle);\n\treturn 0;\n}\n\nint w_scale(lua_State *L)\n{\n\tfloat sx = (float)luaL_optnumber(L, 1, 1.0f);\n\tfloat sy = (float)luaL_optnumber(L, 2, sx);\n\tinstance()->scale(sx, sy);\n\treturn 0;\n}\n\nint w_translate(lua_State *L)\n{\n\tfloat x = (float)luaL_checknumber(L, 1);\n\tfloat y = (float)luaL_checknumber(L, 2);\n\tinstance()->translate(x, y);\n\treturn 0;\n}\n\nint w_shear(lua_State *L)\n{\n\tfloat kx = (float)luaL_checknumber(L, 1);\n\tfloat ky = (float)luaL_checknumber(L, 2);\n\tinstance()->shear(kx, ky);\n\treturn 0;\n}\n\nint w_origin(lua_State * /*L*/)\n{\n\tinstance()->origin();\n\treturn 0;\n}\n\nint w_applyTransform(lua_State *L)\n{\n\tluax_checkstandardtransform(L, 1, [&](const Matrix4 &m)\n\t{\n\t\tluax_catchexcept(L, [&]() { instance()->applyTransform(m); });\n\t});\n\treturn 0;\n}\n\nint w_replaceTransform(lua_State *L)\n{\n\tluax_checkstandardtransform(L, 1, [&](const Matrix4 &m)\n\t{\n\t\tluax_catchexcept(L, [&]() { instance()->replaceTransform(m); });\n\t});\n\treturn 0;\n}\n\nint w_transformPoint(lua_State *L)\n{\n\tVector2 p;\n\tp.x = (float) luaL_checknumber(L, 1);\n\tp.y = (float) luaL_checknumber(L, 2);\n\tp = instance()->transformPoint(p);\n\tlua_pushnumber(L, p.x);\n\tlua_pushnumber(L, p.y);\n\treturn 2;\n}\n\nint w_inverseTransformPoint(lua_State *L)\n{\n\tVector2 p;\n\tp.x = (float) luaL_checknumber(L, 1);\n\tp.y = (float) luaL_checknumber(L, 2);\n\tp = instance()->inverseTransformPoint(p);\n\tlua_pushnumber(L, p.x);\n\tlua_pushnumber(L, p.y);\n\treturn 2;\n}\n\nint w_setProjection(lua_State *L)\n{\n\tmath::Transform *transform = luax_totype<math::Transform>(L, 1);\n\tif (transform != nullptr)\n\t{\n\t\tinstance()->setProjection(transform->getMatrix());\n\t\treturn 0;\n\t}\n\n\tmath::Transform::MatrixLayout layout = math::Transform::MATRIX_ROW_MAJOR;\n\n\tint idx = 1;\n\tif (lua_type(L, idx) == LUA_TSTRING)\n\t{\n\t\tconst char* layoutstr = lua_tostring(L, idx);\n\t\tif (!math::Transform::getConstant(layoutstr, layout))\n\t\t\treturn luax_enumerror(L, \"matrix layout\", math::Transform::getConstants(layout), layoutstr);\n\n\t\tidx++;\n\t}\n\n\tfloat elements[16];\n\tlove::math::luax_checkmatrix(L, idx, layout, elements);\n\n\tinstance()->setProjection(Matrix4(elements));\n\treturn 0;\n}\n\nint w_resetProjection(lua_State */*L*/)\n{\n\tinstance()->resetProjection();\n\treturn 0;\n}\n\n\n// List of functions to wrap.\nstatic const luaL_Reg functions[] =\n{\n\t{ \"reset\", w_reset },\n\t{ \"clear\", w_clear },\n\t{ \"discard\", w_discard },\n\t{ \"present\", w_present },\n\n\t{ \"newCanvas\", w_newCanvas },\n\t{ \"newTexture\", w_newTexture },\n\t{ \"newCubeTexture\", w_newCubeTexture },\n\t{ \"newArrayTexture\", w_newArrayTexture },\n\t{ \"newVolumeTexture\", w_newVolumeTexture },\n\t{ \"newTextureView\", w_newTextureView },\n\t{ \"newQuad\", w_newQuad },\n\t{ \"newFont\", w_newFont },\n\t{ \"newImageFont\", w_newImageFont },\n\t{ \"newSpriteBatch\", w_newSpriteBatch },\n\t{ \"newParticleSystem\", w_newParticleSystem },\n\t{ \"newShader\", w_newShader },\n\t{ \"newComputeShader\", w_newComputeShader },\n\t{ \"newBuffer\", w_newBuffer },\n\t{ \"newMesh\", w_newMesh },\n\t{ \"newTextBatch\", w_newTextBatch },\n\t{ \"_newVideo\", w_newVideo },\n\n\t{ \"readbackBuffer\", w_readbackBuffer },\n\t{ \"readbackBufferAsync\", w_readbackBufferAsync },\n\t{ \"readbackTexture\", w_readbackTexture },\n\t{ \"readbackTextureAsync\", w_readbackTextureAsync },\n\n\t{ \"validateShader\", w_validateShader },\n\n\t{ \"setCanvas\", w_setCanvas },\n\t{ \"getCanvas\", w_getCanvas },\n\n\t{ \"setColor\", w_setColor },\n\t{ \"getColor\", w_getColor },\n\t{ \"setBackgroundColor\", w_setBackgroundColor },\n\t{ \"getBackgroundColor\", w_getBackgroundColor },\n\n\t{ \"setNewFont\", w_setNewFont },\n\t{ \"setFont\", w_setFont },\n\t{ \"getFont\", w_getFont },\n\n\t{ \"setColorMask\", w_setColorMask },\n\t{ \"getColorMask\", w_getColorMask },\n\t{ \"setBlendMode\", w_setBlendMode },\n\t{ \"getBlendMode\", w_getBlendMode },\n\t{ \"setBlendState\", w_setBlendState },\n\t{ \"getBlendState\", w_getBlendState },\n\t{ \"setDefaultFilter\", w_setDefaultFilter },\n\t{ \"getDefaultFilter\", w_getDefaultFilter },\n\t{ \"setDefaultMipmapFilter\", w_setDefaultMipmapFilter },\n\t{ \"getDefaultMipmapFilter\", w_getDefaultMipmapFilter },\n\t{ \"setLineWidth\", w_setLineWidth },\n\t{ \"setLineStyle\", w_setLineStyle },\n\t{ \"setLineJoin\", w_setLineJoin },\n\t{ \"getLineWidth\", w_getLineWidth },\n\t{ \"getLineStyle\", w_getLineStyle },\n\t{ \"getLineJoin\", w_getLineJoin },\n\t{ \"setPointSize\", w_setPointSize },\n\t{ \"getPointSize\", w_getPointSize },\n\t{ \"setDepthMode\", w_setDepthMode },\n\t{ \"getDepthMode\", w_getDepthMode },\n\t{ \"setMeshCullMode\", w_setMeshCullMode },\n\t{ \"getMeshCullMode\", w_getMeshCullMode },\n\t{ \"setFrontFaceWinding\", w_setFrontFaceWinding },\n\t{ \"getFrontFaceWinding\", w_getFrontFaceWinding },\n\t{ \"setWireframe\", w_setWireframe },\n\t{ \"isWireframe\", w_isWireframe },\n\n\t{ \"setShader\", w_setShader },\n\t{ \"getShader\", w_getShader },\n\n\t{ \"getSupported\", w_getSupported },\n\t{ \"getTextureFormats\", w_getTextureFormats },\n\t{ \"getRendererInfo\", w_getRendererInfo },\n\t{ \"getSystemLimits\", w_getSystemLimits },\n\t{ \"getTextureTypes\", w_getTextureTypes },\n\t{ \"getStats\", w_getStats },\n\n\t{ \"captureScreenshot\", w_captureScreenshot },\n\n\t{ \"draw\", w_draw },\n\t{ \"drawLayer\", w_drawLayer },\n\t{ \"drawInstanced\", w_drawInstanced },\n\t{ \"drawIndirect\", w_drawIndirect },\n\t{ \"drawFromShader\", w_drawFromShader },\n\t{ \"drawFromShaderIndirect\", w_drawFromShaderIndirect },\n\n\t{ \"print\", w_print },\n\t{ \"printf\", w_printf },\n\n\t{ \"dispatchThreadgroups\", w_dispatchThreadgroups },\n\t{ \"dispatchIndirect\", w_dispatchIndirect },\n\n\t{ \"copyBuffer\", w_copyBuffer },\n\t{ \"copyBufferToTexture\", w_copyBufferToTexture },\n\t{ \"copyTextureToBuffer\", w_copyTextureToBuffer },\n\n\t{ \"isCreated\", w_isCreated },\n\t{ \"isActive\", w_isActive },\n\t{ \"isGammaCorrect\", w_isGammaCorrect },\n\t{ \"isLowPowerPreferred\", w_isLowPowerPreferred },\n\t{ \"getWidth\", w_getWidth },\n\t{ \"getHeight\", w_getHeight },\n\t{ \"getDimensions\", w_getDimensions },\n\t{ \"getPixelWidth\", w_getPixelWidth },\n\t{ \"getPixelHeight\", w_getPixelHeight },\n\t{ \"getPixelDimensions\", w_getPixelDimensions },\n\t{ \"getDPIScale\", w_getDPIScale },\n\t{ \"getQuadIndexBuffer\", w_getQuadIndexBuffer },\n\n\t{ \"setScissor\", w_setScissor },\n\t{ \"intersectScissor\", w_intersectScissor },\n\t{ \"getScissor\", w_getScissor },\n\n\t{ \"setStencilMode\", w_setStencilMode },\n\t{ \"getStencilMode\", w_getStencilMode },\n\t{ \"setStencilState\", w_setStencilState },\n\t{ \"getStencilState\", w_getStencilState },\n\n\t{ \"points\", w_points },\n\t{ \"line\", w_line },\n\t{ \"rectangle\", w_rectangle },\n\t{ \"circle\", w_circle },\n\t{ \"ellipse\", w_ellipse },\n\t{ \"arc\", w_arc },\n\t{ \"polygon\", w_polygon },\n\n\t{ \"flushBatch\", w_flushBatch },\n\n\t{ \"getStackDepth\", w_getStackDepth },\n\t{ \"push\", w_push },\n\t{ \"pop\", w_pop },\n\t{ \"rotate\", w_rotate },\n\t{ \"scale\", w_scale },\n\t{ \"translate\", w_translate },\n\t{ \"shear\", w_shear },\n\t{ \"origin\", w_origin },\n\t{ \"applyTransform\", w_applyTransform },\n\t{ \"replaceTransform\", w_replaceTransform },\n\t{ \"transformPoint\", w_transformPoint },\n\t{ \"inverseTransformPoint\", w_inverseTransformPoint },\n\n\t{ \"setProjection\", w_setProjection },\n\t{ \"resetProjection\", w_resetProjection },\n\n\t// Deprecated\n\t{ \"newImage\", w_newImage },\n\t{ \"newArrayImage\", w_newArrayImage },\n\t{ \"newVolumeImage\", w_newVolumeImage },\n\t{ \"newCubeImage\", w_newCubeImage },\n\t{ \"newText\", w_newText },\n\t{ \"getCanvasFormats\", w_getCanvasFormats },\n\t{ \"getImageFormats\", w_getImageFormats },\n\n\t{ 0, 0 }\n};\n\nstatic int luaopen_drawable(lua_State *L)\n{\n\treturn luax_register_type(L, &Drawable::type, nullptr);\n}\n\n// Types for this module.\nstatic const lua_CFunction types[] =\n{\n\tluaopen_drawable,\n\tluaopen_texture,\n\tluaopen_font,\n\tluaopen_quad,\n\tluaopen_graphicsbuffer,\n\tluaopen_graphicsreadback,\n\tluaopen_spritebatch,\n\tluaopen_particlesystem,\n\tluaopen_shader,\n\tluaopen_mesh,\n\tluaopen_textbatch,\n\tluaopen_video,\n\t0\n};\n\nextern \"C\" int luaopen_love_graphics(lua_State *L)\n{\n\tGraphics *instance = Graphics::createInstance();\n\n\tif (instance == nullptr)\n\t{\n\t\tprintf(\"Cannot create graphics: no supported renderer on this system.\\n\");\n\t\treturn luaL_error(L, \"Cannot create graphics: no supported renderer on this system.\");\n\t}\n\n\tWrappedModule w;\n\tw.module = instance;\n\tw.name = \"graphics\";\n\tw.type = &Graphics::type;\n\tw.functions = functions;\n\tw.types = types;\n\n\tint n = luax_register_module(L, w);\n\n\tif (luaL_loadbuffer(L, (const char *)graphics_lua, sizeof(graphics_lua), \"=[love \\\"wrap_Graphics.lua\\\"]\") == 0)\n\t\tlua_call(L, 0, 0);\n\telse\n\t\tlua_error(L);\n\n\treturn n;\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/wrap_Graphics.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/config.h\"\n#include \"wrap_Font.h\"\n#include \"wrap_Texture.h\"\n#include \"wrap_Quad.h\"\n#include \"wrap_SpriteBatch.h\"\n#include \"wrap_ParticleSystem.h\"\n#include \"wrap_Shader.h\"\n#include \"wrap_Mesh.h\"\n#include \"wrap_TextBatch.h\"\n#include \"wrap_Video.h\"\n#include \"wrap_Buffer.h\"\n#include \"wrap_GraphicsReadback.h\"\n#include \"Graphics.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nextern \"C\" LOVE_EXPORT int luaopen_love_graphics(lua_State *L);\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/wrap_Graphics.lua",
    "content": "R\"luastring\"--(\n-- DO NOT REMOVE THE ABOVE LINE. It is used to load this file as a C++ string.\n-- There is a matching delimiter at the bottom of the file.\n\n--[[\nCopyright (c) 2006-2024 LOVE Development Team\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\nclaim that you wrote the original software. If you use this software\nin a product, an acknowledgment in the product documentation would be\nappreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be\nmisrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n--]]\n\nlocal table_concat = table.concat\nlocal ipairs = ipairs\nlocal pcall, type, error = pcall, type, error\nlocal graphics = love.graphics\n\nfunction graphics.newVideo(file, settings)\n\tsettings = settings == nil and {} or settings\n\tif type(settings) ~= \"table\" then error(\"bad argument #2 to newVideo (expected table)\", 2) end\n\n\tlocal video = love.graphics._newVideo(file, settings.dpiscale)\n\tlocal source, success\n\n\tif settings.audio ~= false and love.audio then\n\t\tsuccess, source = pcall(love.audio.newSource, video:getStream():getFilename(), \"stream\", \"file\")\n\tend\n\tif success then\n\t\tvideo:setSource(source)\n\telseif settings.audio == true then\n\t\tif love.audio then\n\t\t\terror(\"Video had no audio track\", 2)\n\t\telse\n\t\t\terror(\"love.audio was not loaded\", 2)\n\t\tend\n\telse\n\t\tvideo:getStream():setSync()\n\tend\n\n\treturn video\nend\n\nfunction graphics.stencil(func, action, value, keepvalues)\n\tlove.markDeprecated(2, \"love.graphics.stencil\", \"function\", \"replaced\", \"love.graphics.setStencilMode or setStencilState\")\n\n\tif action == nil then action = \"replace\" end\n\t\n\tif not keepvalues then\n\t\tgraphics.clear(false, true, false)\n\tend\n\n\tif value == nil then value = 1 end\n\n\tlocal action2, mode2, value2, readmask2, writemask2 = graphics.getStencilState()\n\tlocal mr, mg, mb, ma = graphics.getColorMask()\n\n\tgraphics.setStencilState(action, \"always\", value)\n\tgraphics.setColorMask(false)\n\n\tlocal success, err = pcall(func)\n\n\tgraphics.setStencilState(action2, mode2, value2, readmask2, writemask2)\n\tgraphics.setColorMask(mr, mg, mb, ma)\n\n\tif not success then\n\t\terror(err, 2)\n\tend\nend\n\nfunction graphics.setStencilTest(mode, value)\n\tlove.markDeprecated(2, \"love.graphics.setStencilTest\", \"function\", \"replaced\", \"love.graphics.setStencilMode or setStencilState\")\n\n\tif mode ~= nil then\n\t\tgraphics.setStencilState(\"keep\", mode, value)\n\telse\n\t\tgraphics.setStencilState()\n\tend\nend\n\nfunction graphics.getStencilTest()\n\tlove.markDeprecated(2, \"love.graphics.getStencilTest\", \"function\", \"replaced\", \"love.graphics.getStencilMode or getStencilState\")\n\n\tlocal action, mode, value = graphics.getStencilState()\n\treturn mode, value\nend\n\nfunction graphics._transformGLSLErrorMessages(message)\n\tlocal shadertype = message:match(\"Cannot compile (%a+) shader code\")\n\tlocal compiling = shadertype ~= nil\n\tif not shadertype then\n\t\tshadertype = message:match(\"Error validating (%a+) shader\")\n\tend\n\tif not shadertype then return message end\n\tlocal lines = {}\n\tlocal prefix = compiling and \"Cannot compile \" or \"Error validating \"\n\tlines[#lines+1] = prefix..shadertype..\" shader code:\"\n\tfor l in message:gmatch(\"[^\\n]+\") do\n\t\t-- nvidia: 0(<linenumber>) : error/warning [NUMBER]: <error message>\n\t\tlocal linenumber, what, message = l:match(\"^0%((%d+)%)%s*:%s*(%w+)[^:]+:%s*(.+)$\")\n\t\tif not linenumber then\n\t\t\t-- AMD: ERROR 0:<linenumber>: error/warning(#[NUMBER]) [ERRORNAME]: <errormessage>\n\t\t\tlinenumber, what, message = l:match(\"^%w+: 0:(%d+):%s*(%w+)%([^%)]+%)%s*(.+)$\")\n\t\tend\n\t\tif not linenumber then\n\t\t\t-- macOS (?): ERROR: 0:<linenumber>: <errormessage>\n\t\t\twhat, linenumber, message = l:match(\"^(%w+): %d+:(%d+): (.+)$\")\n\t\tend\n\t\tif not linenumber and l:match(\"^ERROR:\") then\n\t\t\twhat = l\n\t\tend\n\t\tif linenumber and what and message then\n\t\t\tlines[#lines+1] = (\"Line %d: %s: %s\"):format(linenumber, what, message)\n\t\telseif what then\n\t\t\tlines[#lines+1] = what\n\t\tend\n\tend\n\t-- did not match any known error messages\n\tif #lines == 1 then return message end\n\treturn table_concat(lines, \"\\n\")\nend\n\n-- DO NOT REMOVE THE NEXT LINE. It is used to load this file as a C++ string.\n--)luastring\"--\"\n"
  },
  {
    "path": "src/modules/graphics/wrap_GraphicsReadback.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"wrap_GraphicsReadback.h\"\n#include \"data/ByteData.h\"\n#include \"image/ImageData.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nGraphicsReadback *luax_checkgraphicsreadback(lua_State *L, int idx)\n{\n\treturn luax_checktype<GraphicsReadback>(L, idx);\n}\n\nint w_GraphicsReadback_isComplete(lua_State *L)\n{\n\tGraphicsReadback *t = luax_checkgraphicsreadback(L, 1);\n\tluax_pushboolean(L, t->isComplete());\n\treturn 1;\n}\n\nint w_GraphicsReadback_hasError(lua_State *L)\n{\n\tGraphicsReadback *t = luax_checkgraphicsreadback(L, 1);\n\tluax_pushboolean(L, t->hasError());\n\treturn 1;\n}\n\nint w_GraphicsReadback_wait(lua_State *L)\n{\n\tGraphicsReadback *t = luax_checkgraphicsreadback(L, 1);\n\tt->wait();\n\treturn 0;\n}\n\nint w_GraphicsReadback_update(lua_State *L)\n{\n\tGraphicsReadback *t = luax_checkgraphicsreadback(L, 1);\n\tluax_catchexcept(L, [&]() { t->update(); });\n\treturn 0;\n}\n\nint w_GraphicsReadback_getBufferData(lua_State *L)\n{\n\tGraphicsReadback *t = luax_checkgraphicsreadback(L, 1);\n\tluax_pushtype(L, t->getBufferData());\n\treturn 1;\n}\n\nint w_GraphicsReadback_getImageData(lua_State *L)\n{\n\tGraphicsReadback *t = luax_checkgraphicsreadback(L, 1);\n\tluax_pushtype(L, t->getImageData());\n\treturn 1;\n}\n\nstatic const luaL_Reg w_GraphicsReadback_functions[] =\n{\n\t{ \"isComplete\", w_GraphicsReadback_isComplete },\n\t{ \"hasError\", w_GraphicsReadback_hasError },\n\t{ \"wait\", w_GraphicsReadback_wait },\n\t{ \"update\", w_GraphicsReadback_update },\n\t{ \"getBufferData\", w_GraphicsReadback_getBufferData },\n\t{ \"getImageData\", w_GraphicsReadback_getImageData },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_graphicsreadback(lua_State *L)\n{\n\treturn luax_register_type(L, &GraphicsReadback::type, w_GraphicsReadback_functions, nullptr);\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/wrap_GraphicsReadback.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"GraphicsReadback.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nGraphicsReadback *luax_checkgraphicsreadback(lua_State *L, int idx);\nextern \"C\" int luaopen_graphicsreadback(lua_State *L);\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/wrap_Mesh.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"wrap_Mesh.h\"\n#include \"wrap_Buffer.h\"\n#include \"Texture.h\"\n#include \"wrap_Texture.h\"\n\n// C++\n#include <algorithm>\n\nnamespace love\n{\nnamespace graphics\n{\n\nMesh *luax_checkmesh(lua_State *L, int idx)\n{\n\treturn luax_checktype<Mesh>(L, idx);\n}\n\nint w_Mesh_setVertices(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\n\tint vertstart = (int) luaL_optnumber(L, 3, 1) - 1;\n\n\tint vertcount = -1;\n\tif (!lua_isnoneornil(L, 4))\n\t{\n\t\tvertcount = (int) luaL_checknumber(L, 4);\n\t\tif (vertcount <= 0)\n\t\t\treturn luaL_error(L, \"Vertex count must be greater than 0.\");\n\t}\n\n\tsize_t stride = t->getVertexStride();\n\tsize_t byteoffset = vertstart * stride;\n\tint totalverts = (int) t->getVertexCount();\n\n\tif (vertstart >= totalverts || vertstart < 0)\n\t\treturn luaL_error(L, \"Invalid vertex start index (must be between 1 and %d)\", totalverts);\n\n\tif (luax_istype(L, 2, Data::type))\n\t{\n\t\tData *d = luax_checktype<Data>(L, 2);\n\n\t\tvertcount = vertcount >= 0 ? vertcount : (totalverts - vertstart);\n\t\tif (vertstart + vertcount > totalverts)\n\t\t\treturn luaL_error(L, \"Too many vertices (expected at most %d, got %d)\", totalverts - vertstart, vertcount);\n\n\t\tsize_t datasize = std::min(d->getSize(), vertcount * stride);\n\t\tchar *bytedata = (char *) t->getVertexData() + byteoffset;\n\n\t\tmemcpy(bytedata, d->getData(), datasize);\n\n\t\tt->setVertexDataModified(byteoffset, datasize);\n\t\tt->flush();\n\n\t\treturn 0;\n\t}\n\n\tluaL_checktype(L, 2, LUA_TTABLE);\n\tint tablelen = (int) luax_objlen(L, 2);\n\n\tvertcount = vertcount >= 0 ? std::min(vertcount, tablelen) : tablelen;\n\tif (vertstart + vertcount > totalverts)\n\t\treturn luaL_error(L, \"Too many vertices (expected at most %d, got %d)\", totalverts - vertstart, vertcount);\n\n\tconst std::vector<Buffer::DataMember> &vertexformat = t->getVertexFormat();\n\n\tint ncomponents = 0;\n\tfor (const Buffer::DataMember &member : vertexformat)\n\t\tncomponents += member.info.components;\n\n\tchar *data = (char *) t->getVertexData() + byteoffset;\n\n\tfor (int i = 0; i < vertcount; i++)\n\t{\n\t\t// get vertices[vertindex]\n\t\tlua_rawgeti(L, 2, i + 1);\n\t\tluaL_checktype(L, -1, LUA_TTABLE);\n\n\t\t// get vertices[vertindex][j]\n\t\tfor (int j = 1; j <= ncomponents; j++)\n\t\t\tlua_rawgeti(L, -j, j);\n\n\t\tint idx = -ncomponents;\n\n\t\tfor (const Buffer::DataMember &member : vertexformat)\n\t\t{\n\t\t\t// Fetch the values from Lua and store them in data buffer.\n\t\t\tluax_writebufferdata(L, idx, member.decl.format, data + member.offset);\n\t\t\tidx += member.info.components;\n\t\t}\n\n\t\tlua_pop(L, ncomponents + 1);\n\n\t\tdata += stride;\n\t}\n\n\tt->setVertexDataModified(byteoffset, vertcount * stride);\n\tt->flush();\n\n\treturn 0;\n}\n\nint w_Mesh_setVertex(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\tsize_t index = (size_t) luaL_checkinteger(L, 2) - 1;\n\n\tbool istable = lua_istable(L, 3);\n\n\tconst std::vector<Buffer::DataMember> &vertexformat = t->getVertexFormat();\n\n\tchar *data = nullptr;\n\tsize_t offset = 0;\n\tluax_catchexcept(L, [&](){ data = (char *) t->checkVertexDataOffset(index, &offset); });\n\n\tint idx = istable ? 1 : 3;\n\n\tif (istable)\n\t{\n\t\tfor (const Buffer::DataMember &member : vertexformat)\n\t\t{\n\t\t\tint components = member.info.components;\n\n\t\t\tfor (int i = idx; i < idx + components; i++)\n\t\t\t\tlua_rawgeti(L, 3, i);\n\n\t\t\t// Fetch the values from Lua and store them in data buffer.\n\t\t\tluax_writebufferdata(L, -components, member.decl.format, data + member.offset);\n\n\t\t\tidx += components;\n\t\t\tlua_pop(L, components);\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (const Buffer::DataMember &member : vertexformat)\n\t\t{\n\t\t\t// Fetch the values from Lua and store them in data buffer.\n\t\t\tluax_writebufferdata(L, idx, member.decl.format, data + member.offset);\n\t\t\tidx += member.info.components;\n\t\t}\n\t}\n\n\tt->setVertexDataModified(offset, t->getVertexStride());\n\treturn 0;\n}\n\nint w_Mesh_getVertex(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\tsize_t index = (size_t) luaL_checkinteger(L, 2) - 1;\n\n\tconst std::vector<Buffer::DataMember> &vertexformat = t->getVertexFormat();\n\n\tconst char *data = nullptr;\n\tluax_catchexcept(L, [&](){ data = (const char *) t->checkVertexDataOffset(index, nullptr); });\n\n\tint n = 0;\n\n\tfor (const Buffer::DataMember &member : vertexformat)\n\t{\n\t\tluax_readbufferdata(L, member.decl.format, data + member.offset);\n\t\tn += member.info.components;\n\t}\n\n\treturn n;\n}\n\nint w_Mesh_setVertexAttribute(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\tsize_t vertindex = (size_t) luaL_checkinteger(L, 2) - 1;\n\tint attribindex = (int) luaL_checkinteger(L, 3) - 1;\n\n\tconst auto &vertexformat = t->getVertexFormat();\n\n\tif (attribindex < 0 || attribindex >= (int) vertexformat.size())\n\t\treturn luaL_error(L, \"Invalid vertex attribute index: %d\", attribindex + 1);\n\n\tconst Buffer::DataMember &member = vertexformat[attribindex];\n\n\tchar *data = nullptr;\n\tsize_t offset = 0;\n\tluax_catchexcept(L, [&](){ data = (char *) t->checkVertexDataOffset(vertindex, &offset); });\n\n\t// Fetch the values from Lua and store them in the data buffer.\n\tluax_writebufferdata(L, 4, member.decl.format, data + member.offset);\n\n\tt->setVertexDataModified(offset + member.offset, member.size);\n\treturn 0;\n}\n\nint w_Mesh_getVertexAttribute(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\tsize_t vertindex = (size_t) luaL_checkinteger(L, 2) - 1;\n\tint attribindex = (int) luaL_checkinteger(L, 3) - 1;\n\n\tconst auto &vertexformat = t->getVertexFormat();\n\n\tif (attribindex < 0 || attribindex >= (int) vertexformat.size())\n\t\treturn luaL_error(L, \"Invalid vertex attribute index: %d\", attribindex + 1);\n\n\tconst Buffer::DataMember &member = vertexformat[attribindex];\n\n\tconst char *data = nullptr;\n\tluax_catchexcept(L, [&](){ data = (const char *) t->checkVertexDataOffset(vertindex, nullptr); });\n\n\tluax_readbufferdata(L, member.decl.format, data + member.offset);\n\treturn member.info.components;\n}\n\nint w_Mesh_getVertexCount(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\tlua_pushinteger(L, t->getVertexCount());\n\treturn 1;\n}\n\nint w_Mesh_getVertexFormat(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\n\tconst std::vector<Buffer::DataMember> &vertexformat = t->getVertexFormat();\n\tlua_createtable(L, (int) vertexformat.size(), 0);\n\n\tconst char *tname = nullptr;\n\n\tfor (size_t i = 0; i < vertexformat.size(); i++)\n\t{\n\t\tconst auto &member = vertexformat[i];\n\n\t\tif (!getConstant(member.decl.format, tname))\n\t\t\treturn luax_enumerror(L, \"vertex attribute data type\", getConstants(member.decl.format), tname);\n\n\t\tlua_createtable(L, 0, 4);\n\n\t\tlua_pushstring(L, member.decl.name.c_str());\n\t\tlua_setfield(L, -2, \"name\");\n\n\t\tlua_pushnumber(L, member.decl.bindingLocation);\n\t\tlua_setfield(L, -2, \"location\");\n\n\t\tconst char *formatstr = \"unknown\";\n\t\tgetConstant(member.decl.format, formatstr);\n\t\tlua_pushstring(L, formatstr);\n\t\tlua_setfield(L, -2, \"format\");\n\n\t\tlua_pushinteger(L, member.decl.arrayLength);\n\t\tlua_setfield(L, -2, \"arraylength\");\n\n\t\tlua_pushinteger(L, member.offset);\n\t\tlua_setfield(L, -2, \"offset\");\n\n\t\tlua_rawseti(L, -2, i + 1);\n\t}\n\n\treturn 1;\n}\n\nint w_Mesh_setAttributeEnabled(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\tbool enable = luax_checkboolean(L, 3);\n\tif (lua_type(L, 2) == LUA_TSTRING)\n\t{\n\t\tconst char *name = luaL_checkstring(L, 2);\n\t\tluax_catchexcept(L, [&](){ t->setAttributeEnabled(name, enable); });\n\t}\n\telse\n\t{\n\t\tint location = luax_checkint(L, 2);\n\t\tluax_catchexcept(L, [&](){ t->setAttributeEnabled(location, enable); });\n\t}\n\treturn 0;\n}\n\nint w_Mesh_isAttributeEnabled(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\tbool enabled = false;\n\tif (lua_type(L, 2) == LUA_TSTRING)\n\t{\n\t\tconst char *name = luaL_checkstring(L, 2);\n\t\tluax_catchexcept(L, [&](){ enabled = t->isAttributeEnabled(name); });\n\t}\n\telse\n\t{\n\t\tint location = luax_checkint(L, 2);\n\t\tluax_catchexcept(L, [&](){ enabled = t->isAttributeEnabled(location); });\n\t}\n\tlua_pushboolean(L, enabled);\n\treturn 1;\n}\n\nint w_Mesh_attachAttribute(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\n\tconst char *name = nullptr;\n\tint location = -1;\n\tif (lua_type(L, 2) == LUA_TSTRING)\n\t\tname = luaL_checkstring(L, 2);\n\telse\n\t\tlocation = luax_checkint(L, 2);\n\n\tBuffer *buffer = nullptr;\n\tMesh *mesh = nullptr;\n\tif (luax_istype(L, 3, Buffer::type))\n\t{\n\t\tbuffer = luax_checktype<Buffer>(L, 3);\n\t}\n\telse\n\t{\n\t\tmesh = luax_checkmesh(L, 3);\n\t\tbuffer = mesh->getVertexBuffer();\n\t\tif (buffer == nullptr)\n\t\t\treturn luaL_error(L, \"Mesh does not have its own vertex buffer.\");\n\t}\n\n\tAttributeStep step = STEP_PER_VERTEX;\n\tconst char *stepstr = lua_isnoneornil(L, 4) ? nullptr : luaL_checkstring(L, 4);\n\tif (stepstr != nullptr && !getConstant(stepstr, step))\n\t\treturn luax_enumerror(L, \"vertex attribute step\", getConstants(step), stepstr);\n\n\tconst char *attachname = name;\n\tint attachlocation = location;\n\tif (name != nullptr)\n\t\tattachname = luaL_optstring(L, 5, name);\n\telse\n\t\tattachlocation = luax_optint(L, 5, location);\n\n\tint startindex = (int) luaL_optinteger(L, 6, 1) - 1;\n\n\tif (name != nullptr)\n\t\tluax_catchexcept(L, [&](){ t->attachAttribute(name, buffer, mesh, attachname, startindex, step); });\n\telse\n\t\tluax_catchexcept(L, [&]() { t->attachAttribute(location, buffer, mesh, attachlocation, startindex, step); });\n\treturn 0;\n}\n\nint w_Mesh_detachAttribute(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\tconst char *name = luaL_checkstring(L, 2);\n\tbool success = false;\n\tluax_catchexcept(L, [&](){ success = t->detachAttribute(name); });\n\tluax_pushboolean(L, success);\n\treturn 1;\n}\n\nint w_Mesh_getAttachedAttributes(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\tconst auto &attributes = t->getAttachedAttributes();\n\n\tlua_createtable(L, (int) attributes.size(), 0);\n\n\tfor (int i = 0; i < (int) attributes.size(); i++)\n\t{\n\t\tconst auto &attrib = attributes[i];\n\n\t\tlua_createtable(L, 0, 7);\n\n\t\tluax_pushstring(L, attrib.name);\n\t\tlua_setfield(L, -2, \"name\");\n\n\t\tlua_pushnumber(L, attrib.bindingLocation);\n\t\tlua_setfield(L, -2, \"location\");\n\n\t\tluax_pushtype(L, attrib.buffer.get());\n\t\tlua_setfield(L, -2, \"buffer\");\n\n\t\tconst char *stepstr = nullptr;\n\t\tif (!getConstant(attrib.step, stepstr))\n\t\t\treturn luaL_error(L, \"Invalid vertex attribute step.\");\n\t\tlua_pushstring(L, stepstr);\n\t\tlua_setfield(L, -2, \"step\");\n\n\t\tconst Buffer::DataMember &member = attrib.buffer->getDataMember(attrib.indexInBuffer);\n\t\tluax_pushstring(L, member.decl.name);\n\t\tlua_setfield(L, -2, \"nameinbuffer\");\n\n\t\tlua_pushnumber(L, member.decl.bindingLocation);\n\t\tlua_setfield(L, -2, \"locationinbuffer\");\n\n\t\tlua_pushinteger(L, attrib.startArrayIndex + 1);\n\t\tlua_setfield(L, -2, \"startindex\");\n\n\t\tlua_rawseti(L, -1, i + 1);\n\t}\n\n\treturn 1;\n}\n\nint w_Mesh_getVertexBuffer(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\tluax_pushtype(L, t->getVertexBuffer());\n\treturn 1;\n}\n\nint w_Mesh_flush(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\tt->flush();\n\treturn 0;\n}\n\nint w_Mesh_setVertexMap(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\n\tif (lua_isnoneornil(L, 2))\n\t{\n\t\t// Disable the vertex map / index buffer.\n\t\tluax_catchexcept(L, [&](){ t->setVertexMap(); });\n\t\treturn 0;\n\t}\n\n\tif (luax_istype(L, 2, Data::type))\n\t{\n\t\tData *d = luax_totype<Data>(L, 2, Data::type);\n\n\t\tconst char *indextypestr = luaL_checkstring(L, 3);\n\t\tIndexDataType indextype;\n\t\tif (!getConstant(indextypestr, indextype))\n\t\t\treturn luax_enumerror(L, \"index data type\", getConstants(indextype), indextypestr);\n\n\t\tsize_t datatypesize = getIndexDataSize(indextype);\n\n\t\tint indexcount = (int) luaL_optinteger(L, 4, d->getSize() / datatypesize);\n\n\t\tif (indexcount < 1 || indexcount * datatypesize > d->getSize())\n\t\t\treturn luaL_error(L, \"Invalid index count: %d\", indexcount);\n\n\t\tluax_catchexcept(L, [&]() { t->setVertexMap(indextype, d->getData(), indexcount * datatypesize); });\n\t\treturn 0;\n\t}\n\n\tbool is_table = lua_istable(L, 2);\n\tint nargs = is_table ? (int) luax_objlen(L, 2) : lua_gettop(L) - 1;\n\n\tstd::vector<uint32> vertexmap;\n\tvertexmap.reserve(nargs);\n\n\tif (is_table)\n\t{\n\t\tfor (int i = 0; i < nargs; i++)\n\t\t{\n\t\t\tlua_rawgeti(L, 2, i + 1);\n\t\t\tvertexmap.push_back(uint32(luaL_checkinteger(L, -1) - 1));\n\t\t\tlua_pop(L, 1);\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (int i = 0; i < nargs; i++)\n\t\t\tvertexmap.push_back(uint32(luaL_checkinteger(L, i + 2) - 1));\n\t}\n\n\tluax_catchexcept(L, [&](){ t->setVertexMap(vertexmap); });\n\treturn 0;\n}\n\nint w_Mesh_getVertexMap(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\n\tstd::vector<uint32> vertex_map;\n\tbool has_vertex_map = false;\n\tluax_catchexcept(L, [&](){ has_vertex_map = t->getVertexMap(vertex_map); });\n\n\tif (!has_vertex_map)\n\t{\n\t\tlua_pushnil(L);\n\t\treturn 1;\n\t}\n\n\tint element_count = (int) vertex_map.size();\n\n\tlua_createtable(L, element_count, 0);\n\n\tfor (int i = 0; i < element_count; i++)\n\t{\n\t\tlua_pushinteger(L, lua_Integer(vertex_map[i]) + 1);\n\t\tlua_rawseti(L, -2, i + 1);\n\t}\n\n\treturn 1;\n}\n\nint w_Mesh_setIndexBuffer(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\tBuffer *b = nullptr;\n\tif (!lua_isnoneornil(L, 2))\n\t\tb = luax_checkbuffer(L, 2);\n\tluax_catchexcept(L, [&]() { t->setIndexBuffer(b); });\n\treturn 0;\n}\n\nint w_Mesh_getIndexBuffer(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\tluax_pushtype(L, t->getIndexBuffer());\n\treturn 1;\n}\n\nint w_Mesh_setTexture(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\n\tif (lua_isnoneornil(L, 2))\n\t\tt->setTexture();\n\telse\n\t{\n\t\tTexture *tex = luax_checktexture(L, 2);\n\t\tluax_catchexcept(L, [&](){ t->setTexture(tex); });\n\t}\n\n\treturn 0;\n}\n\nint w_Mesh_getTexture(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\tTexture *tex = t->getTexture();\n\n\tif (tex == nullptr)\n\t\treturn 0;\n\n\tluax_pushtype(L, tex);\n\treturn 1;\n}\n\nint w_Mesh_setDrawMode(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\tconst char *str = luaL_checkstring(L, 2);\n\tPrimitiveType mode;\n\n\tif (!getConstant(str, mode))\n\t\treturn luax_enumerror(L, \"mesh draw mode\", getConstants(mode), str);\n\n\tt->setDrawMode(mode);\n\treturn 0;\n}\n\nint w_Mesh_getDrawMode(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\tPrimitiveType mode = t->getDrawMode();\n\tconst char *str;\n\n\tif (!getConstant(mode, str))\n\t\treturn luaL_error(L, \"Unknown mesh draw mode.\");\n\n\tlua_pushstring(L, str);\n\treturn 1;\n}\n\nint w_Mesh_setDrawRange(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\n\tif (lua_isnoneornil(L, 2))\n\t\tt->setDrawRange();\n\telse\n\t{\n\t\tint start = (int) luaL_checkinteger(L, 2) - 1;\n\t\tint count = (int) luaL_checkinteger(L, 3);\n\t\tluax_catchexcept(L, [&](){ t->setDrawRange(start, count); });\n\t}\n\n\treturn 0;\n}\n\nint w_Mesh_getDrawRange(lua_State *L)\n{\n\tMesh *t = luax_checkmesh(L, 1);\n\n\tint start = 0;\n\tint count = 1;\n\tif (!t->getDrawRange(start, count))\n\t\treturn 0;\n\n\tlua_pushinteger(L, start + 1);\n\tlua_pushinteger(L, count);\n\treturn 2;\n}\n\nstatic const luaL_Reg w_Mesh_functions[] =\n{\n\t{ \"setVertices\", w_Mesh_setVertices },\n\t{ \"setVertex\", w_Mesh_setVertex },\n\t{ \"getVertex\", w_Mesh_getVertex },\n\t{ \"setVertexAttribute\", w_Mesh_setVertexAttribute },\n\t{ \"getVertexAttribute\", w_Mesh_getVertexAttribute },\n\t{ \"getVertexCount\", w_Mesh_getVertexCount },\n\t{ \"getVertexFormat\", w_Mesh_getVertexFormat },\n\t{ \"setAttributeEnabled\", w_Mesh_setAttributeEnabled },\n\t{ \"isAttributeEnabled\", w_Mesh_isAttributeEnabled },\n\t{ \"attachAttribute\", w_Mesh_attachAttribute },\n\t{ \"detachAttribute\", w_Mesh_detachAttribute },\n\t{ \"getAttachedAttributes\", w_Mesh_getAttachedAttributes },\n\t{ \"getVertexBuffer\", w_Mesh_getVertexBuffer },\n\t{ \"flush\", w_Mesh_flush },\n\t{ \"setVertexMap\", w_Mesh_setVertexMap },\n\t{ \"getVertexMap\", w_Mesh_getVertexMap },\n\t{ \"setIndexBuffer\", w_Mesh_setIndexBuffer },\n\t{ \"getIndexBuffer\", w_Mesh_getIndexBuffer },\n\t{ \"setTexture\", w_Mesh_setTexture },\n\t{ \"getTexture\", w_Mesh_getTexture },\n\t{ \"setDrawMode\", w_Mesh_setDrawMode },\n\t{ \"getDrawMode\", w_Mesh_getDrawMode },\n\t{ \"setDrawRange\", w_Mesh_setDrawRange },\n\t{ \"getDrawRange\", w_Mesh_getDrawRange },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_mesh(lua_State *L)\n{\n\treturn luax_register_type(L, &Mesh::type, w_Mesh_functions, nullptr);\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/wrap_Mesh.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/runtime.h\"\n#include \"Mesh.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nMesh *luax_checkmesh(lua_State *L, int idx);\nextern \"C\" int luaopen_mesh(lua_State *L);\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/wrap_ParticleSystem.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"wrap_ParticleSystem.h\"\n#include \"common/Vector.h\"\n\n#include \"Texture.h\"\n#include \"wrap_Texture.h\"\n\n// C\n#include <cstring>\n\nnamespace love\n{\nnamespace graphics\n{\n\nParticleSystem *luax_checkparticlesystem(lua_State *L, int idx)\n{\n\treturn luax_checktype<ParticleSystem>(L, idx);\n}\n\nint w_ParticleSystem_clone(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\n\tParticleSystem *clone = nullptr;\n\tluax_catchexcept(L, [&](){ clone = t->clone(); });\n\n\tluax_pushtype(L, clone);\n\tclone->release();\n\treturn 1;\n}\n\nint w_ParticleSystem_setTexture(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tTexture *tex = luax_checktexture(L, 2);\n\tluax_catchexcept(L, [&](){ t->setTexture(tex); });\n\treturn 0;\n}\n\nint w_ParticleSystem_getTexture(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tluax_pushtype(L, t->getTexture());\n\treturn 1;\n}\n\nint w_ParticleSystem_setBufferSize(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tlua_Number arg1 = luaL_checknumber(L, 2);\n\tif (arg1 < 1.0 || arg1 > ParticleSystem::MAX_PARTICLES)\n\t\treturn luaL_error(L, \"Invalid buffer size\");\n\n\tluax_catchexcept(L, [&](){ t->setBufferSize((uint32) arg1); });\n\treturn 0;\n}\n\nint w_ParticleSystem_getBufferSize(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tlua_pushinteger(L, t->getBufferSize());\n\treturn 1;\n}\n\nint w_ParticleSystem_setInsertMode(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tParticleSystem::InsertMode mode;\n\tconst char *str = luaL_checkstring(L, 2);\n\tif (!ParticleSystem::getConstant(str, mode))\n\t\treturn luax_enumerror(L, \"insert mode\", ParticleSystem::getConstants(mode), str);\n\tt->setInsertMode(mode);\n\treturn 0;\n}\n\nint w_ParticleSystem_getInsertMode(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tParticleSystem::InsertMode mode;\n\tmode = t->getInsertMode();\n\tconst char *str;\n\tif (!ParticleSystem::getConstant(mode, str))\n\t\treturn luaL_error(L, \"Unknown insert mode\");\n\tlua_pushstring(L, str);\n\treturn 1;\n}\n\nint w_ParticleSystem_setEmissionRate(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat arg1 = (float) luaL_checknumber(L, 2);\n\tluax_catchexcept(L, [&](){ t->setEmissionRate(arg1); });\n\treturn 0;\n}\n\nint w_ParticleSystem_getEmissionRate(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tlua_pushnumber(L, t->getEmissionRate());\n\treturn 1;\n}\n\nint w_ParticleSystem_setEmitterLifetime(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tt->setEmitterLifetime(arg1);\n\treturn 0;\n}\n\nint w_ParticleSystem_getEmitterLifetime(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tlua_pushnumber(L, t->getEmitterLifetime());\n\treturn 1;\n}\n\nint w_ParticleSystem_setParticleLifetime(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tfloat arg2 = (float)luaL_optnumber(L, 3, arg1);\n\n\tif (arg1 < 0.0f || arg2 < 0.0f)\n\t\treturn luaL_error(L, \"Invalid particle lifetime (must be >= 0)\");\n\n\tt->setParticleLifetime(arg1, arg2);\n\treturn 0;\n}\n\nint w_ParticleSystem_getParticleLifetime(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat min, max;\n\tt->getParticleLifetime(min, max);\n\tlua_pushnumber(L, min);\n\tlua_pushnumber(L, max);\n\treturn 2;\n}\n\nint w_ParticleSystem_setPosition(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tfloat arg2 = (float)luaL_checknumber(L, 3);\n\tt->setPosition(arg1, arg2);\n\treturn 0;\n}\n\nint w_ParticleSystem_getPosition(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tlove::Vector2 pos = t->getPosition();\n\tlua_pushnumber(L, pos.x);\n\tlua_pushnumber(L, pos.y);\n\treturn 2;\n}\n\nint w_ParticleSystem_moveTo(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tfloat arg2 = (float)luaL_checknumber(L, 3);\n\tt->moveTo(arg1, arg2);\n\treturn 0;\n}\n\nint w_ParticleSystem_setEmissionArea(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\n\tParticleSystem::AreaSpreadDistribution distribution = ParticleSystem::DISTRIBUTION_NONE;\n\tfloat x = 0.f, y = 0.f;\n\tfloat angle = 0.0f;\n\tbool directionRelativeToCenter = false;\n\n\tconst char *str = lua_isnoneornil(L, 2) ? nullptr : luaL_checkstring(L, 2);\n\tif (str && !ParticleSystem::getConstant(str, distribution))\n\t\treturn luax_enumerror(L, \"particle distribution\", ParticleSystem::getConstants(distribution), str);\n\n\tif (distribution != ParticleSystem::DISTRIBUTION_NONE)\n\t{\n\t\tx = (float) luaL_checknumber(L, 3);\n\t\ty = (float) luaL_checknumber(L, 4);\n\t\tif (x < 0.0f || y < 0.0f)\n\t\t\treturn luaL_error(L, \"Invalid area spread parameters (must be >= 0)\");\n\n\t\tangle = (float) luaL_optnumber(L, 5, 0.0f);\n\t\tdirectionRelativeToCenter = luax_optboolean(L, 6, false);\n\t}\n\n\tt->setEmissionArea(distribution, x, y, angle, directionRelativeToCenter);\n\treturn 0;\n}\n\nint w_ParticleSystem_getEmissionArea(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tlove::Vector2 p;\n\tfloat angle;\n\tbool directionRelativeToCenter;\n\tParticleSystem::AreaSpreadDistribution distribution = t->getEmissionArea(p, angle, directionRelativeToCenter);\n\tconst char *str;\n\tParticleSystem::getConstant(distribution, str);\n\n\tlua_pushstring(L, str);\n\tlua_pushnumber(L, p.x);\n\tlua_pushnumber(L, p.y);\n\tlua_pushnumber(L, angle);\n\tluax_pushboolean(L, directionRelativeToCenter);\n\n\treturn 5;\n}\n\nint w_ParticleSystem_setDirection(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tt->setDirection(arg1);\n\treturn 0;\n}\n\nint w_ParticleSystem_getDirection(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tlua_pushnumber(L, t->getDirection());\n\treturn 1;\n}\n\nint w_ParticleSystem_setSpread(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tt->setSpread(arg1);\n\treturn 0;\n}\n\nint w_ParticleSystem_getSpread(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tlua_pushnumber(L, t->getSpread());\n\treturn 1;\n}\n\nint w_ParticleSystem_setSpeed(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tfloat arg2 = (float)luaL_optnumber(L, 3, arg1);\n\tt->setSpeed(arg1, arg2);\n\treturn 0;\n}\n\nint w_ParticleSystem_getSpeed(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat min, max;\n\tt->getSpeed(min, max);\n\tlua_pushnumber(L, min);\n\tlua_pushnumber(L, max);\n\treturn 2;\n}\n\nint w_ParticleSystem_setLinearAcceleration(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat xmin = (float) luaL_checknumber(L, 2);\n\tfloat ymin = (float) luaL_checknumber(L, 3);\n\tfloat xmax = (float) luaL_optnumber(L, 4, xmin);\n\tfloat ymax = (float) luaL_optnumber(L, 5, ymin);\n\tt->setLinearAcceleration(xmin, ymin, xmax, ymax);\n\treturn 0;\n}\n\nint w_ParticleSystem_getLinearAcceleration(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tlove::Vector2 min, max;\n\tt->getLinearAcceleration(min, max);\n\tlua_pushnumber(L, min.x);\n\tlua_pushnumber(L, min.y);\n\tlua_pushnumber(L, max.x);\n\tlua_pushnumber(L, max.y);\n\treturn 4;\n}\n\nint w_ParticleSystem_setRadialAcceleration(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tfloat arg2 = (float)luaL_optnumber(L, 3, arg1);\n\tt->setRadialAcceleration(arg1, arg2);\n\treturn 0;\n}\n\nint w_ParticleSystem_getRadialAcceleration(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat min, max;\n\tt->getRadialAcceleration(min, max);\n\tlua_pushnumber(L, min);\n\tlua_pushnumber(L, max);\n\treturn 2;\n}\n\nint w_ParticleSystem_setTangentialAcceleration(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tfloat arg2 = (float)luaL_optnumber(L, 3, arg1);\n\tt->setTangentialAcceleration(arg1, arg2);\n\treturn 0;\n}\n\nint w_ParticleSystem_getTangentialAcceleration(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat min, max;\n\tt->getTangentialAcceleration(min, max);\n\tlua_pushnumber(L, min);\n\tlua_pushnumber(L, max);\n\treturn 2;\n}\n\nint w_ParticleSystem_setLinearDamping(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tfloat arg2 = (float)luaL_optnumber(L, 3, arg1);\n\tt->setLinearDamping(arg1, arg2);\n\treturn 0;\n}\n\nint w_ParticleSystem_getLinearDamping(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat min, max;\n\tt->getLinearDamping(min, max);\n\tlua_pushnumber(L, min);\n\tlua_pushnumber(L, max);\n\treturn 2;\n}\n\nint w_ParticleSystem_setSizes(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tsize_t nSizes = lua_gettop(L) - 1;\n\n\tif (nSizes > 8)\n\t\treturn luaL_error(L, \"At most eight (8) sizes may be used.\");\n\n\tif (nSizes <= 1)\n\t{\n\t\tfloat size = luax_checkfloat(L, 2);\n\t\tt->setSize(size);\n\t}\n\telse\n\t{\n\t\tstd::vector<float> sizes(nSizes);\n\t\tfor (size_t i = 0; i < nSizes; ++i)\n\t\t\tsizes[i] = luax_checkfloat(L, (int) (1 + i + 1));\n\n\t\tt->setSizes(sizes);\n\t}\n\treturn 0;\n}\n\nint w_ParticleSystem_getSizes(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tconst std::vector<float> &sizes = t->getSizes();\n\n\tfor (size_t i = 0; i < sizes.size(); i++)\n\t\tlua_pushnumber(L, sizes[i]);\n\n\treturn (int) sizes.size();\n}\n\nint w_ParticleSystem_setSizeVariation(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tif (arg1 < 0.0f || arg1 > 1.0f)\n\t\treturn luaL_error(L, \"Size variation has to be between 0 and 1, inclusive.\");\n\n\tt->setSizeVariation(arg1);\n\treturn 0;\n}\n\nint w_ParticleSystem_getSizeVariation(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tlua_pushnumber(L, t->getSizeVariation());\n\treturn 1;\n}\n\nint w_ParticleSystem_setRotation(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tfloat arg2 = (float)luaL_optnumber(L, 3, arg1);\n\tt->setRotation(arg1, arg2);\n\treturn 0;\n}\n\nint w_ParticleSystem_getRotation(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat min, max;\n\tt->getRotation(min, max);\n\tlua_pushnumber(L, min);\n\tlua_pushnumber(L, max);\n\treturn 2;\n}\n\nint w_ParticleSystem_setSpin(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tfloat arg2 = (float)luaL_optnumber(L, 3, arg1);\n\tt->setSpin(arg1, arg2);\n\treturn 0;\n}\n\nint w_ParticleSystem_getSpin(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat start, end;\n\tt->getSpin(start, end);\n\tlua_pushnumber(L, start);\n\tlua_pushnumber(L, end);\n\treturn 2;\n}\n\nint w_ParticleSystem_setSpinVariation(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tt->setSpinVariation(arg1);\n\treturn 0;\n}\n\nint w_ParticleSystem_getSpinVariation(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tlua_pushnumber(L, t->getSpinVariation());\n\treturn 1;\n}\n\nint w_ParticleSystem_setOffset(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat x = (float)luaL_checknumber(L, 2);\n\tfloat y = (float)luaL_checknumber(L, 3);\n\tt->setOffset(x, y);\n\treturn 0;\n}\n\nint w_ParticleSystem_getOffset(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tlove::Vector2 offset = t->getOffset();\n\tlua_pushnumber(L, offset.x);\n\tlua_pushnumber(L, offset.y);\n\treturn 2;\n}\n\nint w_ParticleSystem_setColors(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\n\tif (lua_istable(L, 2)) // setColors({r,g,b,a}, {r,g,b,a}, ...)\n\t{\n\t\tint nColors = (int) lua_gettop(L) - 1;\n\n\t\tif (nColors > 8)\n\t\t\treturn luaL_error(L, \"At most eight (8) colors may be used.\");\n\n\t\tstd::vector<Colorf> colors(nColors);\n\n\t\tfor (int i = 0; i < nColors; i++)\n\t\t{\n\t\t\tluaL_checktype(L, i + 2, LUA_TTABLE);\n\n\t\t\tif (luax_objlen(L, i + 2) < 3)\n\t\t\t\treturn luaL_argerror(L, i + 2, \"expected 4 color components\");\n\n\t\t\tfor (int j = 0; j < 4; j++)\n\t\t\t\t// push args[i+2][j+1] onto the stack\n\t\t\t\tlua_rawgeti(L, i + 2, j + 1);\n\n\t\t\tcolors[i].r = (float) luaL_checknumber(L, -4);\n\t\t\tcolors[i].g = (float) luaL_checknumber(L, -3);\n\t\t\tcolors[i].b = (float) luaL_checknumber(L, -2);\n\t\t\tcolors[i].a = (float) luaL_optnumber(L, -1, 1.0);\n\n\t\t\t// pop the color components from the stack\n\t\t\tlua_pop(L, 4);\n\t\t}\n\n\t\tt->setColor(colors);\n\t}\n\telse // setColors(r,g,b,a, r,g,b,a, ...)\n\t{\n\t\tint cargs = lua_gettop(L) - 1;\n\t\tint nColors = (cargs + 3) / 4; // nColors = ceil(color_args / 4)\n\n\t\tif (cargs != 3 && (cargs % 4 != 0 || cargs == 0))\n\t\t\treturn luaL_error(L, \"Expected red, green, blue, and alpha. Only got %d of 4 components.\", cargs % 4);\n\n\t\tif (nColors > 8)\n\t\t\treturn luaL_error(L, \"At most eight (8) colors may be used.\");\n\n\t\tstd::vector<Colorf> colors(nColors);\n\n\t\tfor (int i = 0; i < nColors; ++i)\n\t\t{\n\t\t\tcolors[i].r = (float) luaL_checknumber(L, 1 + i*4 + 1);\n\t\t\tcolors[i].g = (float) luaL_checknumber(L, 1 + i*4 + 2);\n\t\t\tcolors[i].b = (float) luaL_checknumber(L, 1 + i*4 + 3);\n\t\t\tcolors[i].a = (float) luaL_checknumber(L, 1 + i*4 + 4);\n\t\t}\n\n\t\tt->setColor(colors);\n\t}\n\n\treturn 0;\n}\n\nint w_ParticleSystem_getColors(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\n\tconst std::vector<Colorf> &colors =t->getColor();\n\n\tfor (size_t i = 0; i < colors.size(); i++)\n\t{\n\t\tlua_createtable(L, 4, 0);\n\n\t\tlua_pushnumber(L, colors[i].r);\n\t\tlua_rawseti(L, -2, 1);\n\t\tlua_pushnumber(L, colors[i].g);\n\t\tlua_rawseti(L, -2, 2);\n\t\tlua_pushnumber(L, colors[i].b);\n\t\tlua_rawseti(L, -2, 3);\n\t\tlua_pushnumber(L, colors[i].a);\n\t\tlua_rawseti(L, -2, 4);\n\t}\n\n\treturn (int) colors.size();\n}\n\nint w_ParticleSystem_setQuads(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tstd::vector<Quad *> quads;\n\n\tif (lua_istable(L, 2))\n\t{\n\t\tfor (int i = 1; i <= (int) luax_objlen(L, 2); i++)\n\t\t{\n\t\t\tlua_rawgeti(L, 2, i);\n\n\t\t\tQuad *q = luax_checktype<Quad>(L, -1);\n\t\t\tquads.push_back(q);\n\n\t\t\tlua_pop(L, 1);\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (int i = 2; i <= lua_gettop(L); i++)\n\t\t{\n\t\t\tQuad *q = luax_checktype<Quad>(L, i);\n\t\t\tquads.push_back(q);\n\t\t}\n\t}\n\n\tt->setQuads(quads);\n\treturn 0;\n}\n\nint w_ParticleSystem_getQuads(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tconst std::vector<Quad *> quads = t->getQuads();\n\n\tlua_createtable(L, (int) quads.size(), 0);\n\n\tfor (int i = 0; i < (int) quads.size(); i++)\n\t{\n\t\tluax_pushtype(L, quads[i]);\n\t\tlua_rawseti(L, -2, i + 1);\n\t}\n\n\treturn 1;\n}\n\nint w_ParticleSystem_setRelativeRotation(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tt->setRelativeRotation(luax_checkboolean(L, 2));\n\treturn 0;\n}\n\nint w_ParticleSystem_hasRelativeRotation(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tluax_pushboolean(L, t->hasRelativeRotation());\n\treturn 1;\n}\n\nint w_ParticleSystem_getCount(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tlua_pushnumber(L, t->getCount());\n\treturn 1;\n}\n\nint w_ParticleSystem_start(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tt->start();\n\treturn 0;\n}\n\nint w_ParticleSystem_stop(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tt->stop();\n\treturn 0;\n}\n\nint w_ParticleSystem_pause(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tt->pause();\n\treturn 0;\n}\n\nint w_ParticleSystem_reset(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tt->reset();\n\treturn 0;\n}\n\nint w_ParticleSystem_emit(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tint num = (int) luaL_checkinteger(L, 2);\n\tt->emit(num);\n\treturn 0;\n}\n\nint w_ParticleSystem_isActive(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tluax_pushboolean(L, t->isActive());\n\treturn 1;\n}\n\nint w_ParticleSystem_isPaused(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tluax_pushboolean(L, t->isPaused());\n\treturn 1;\n}\n\nint w_ParticleSystem_isStopped(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tluax_pushboolean(L, t->isStopped());\n\treturn 1;\n}\n\nint w_ParticleSystem_update(lua_State *L)\n{\n\tParticleSystem *t = luax_checkparticlesystem(L, 1);\n\tfloat dt = (float)luaL_checknumber(L, 2);\n\tt->update(dt);\n\treturn 0;\n}\n\nstatic const luaL_Reg w_ParticleSystem_functions[] =\n{\n\t{ \"clone\", w_ParticleSystem_clone },\n\t{ \"setTexture\", w_ParticleSystem_setTexture },\n\t{ \"getTexture\", w_ParticleSystem_getTexture },\n\t{ \"setBufferSize\", w_ParticleSystem_setBufferSize },\n\t{ \"getBufferSize\", w_ParticleSystem_getBufferSize },\n\t{ \"setInsertMode\", w_ParticleSystem_setInsertMode },\n\t{ \"getInsertMode\", w_ParticleSystem_getInsertMode },\n\t{ \"setEmissionRate\", w_ParticleSystem_setEmissionRate },\n\t{ \"getEmissionRate\", w_ParticleSystem_getEmissionRate },\n\t{ \"setEmitterLifetime\", w_ParticleSystem_setEmitterLifetime },\n\t{ \"getEmitterLifetime\", w_ParticleSystem_getEmitterLifetime },\n\t{ \"setParticleLifetime\", w_ParticleSystem_setParticleLifetime },\n\t{ \"getParticleLifetime\", w_ParticleSystem_getParticleLifetime },\n\t{ \"setPosition\", w_ParticleSystem_setPosition },\n\t{ \"getPosition\", w_ParticleSystem_getPosition },\n\t{ \"moveTo\", w_ParticleSystem_moveTo },\n\t{ \"setEmissionArea\", w_ParticleSystem_setEmissionArea },\n\t{ \"getEmissionArea\", w_ParticleSystem_getEmissionArea },\n\t{ \"setDirection\", w_ParticleSystem_setDirection },\n\t{ \"getDirection\", w_ParticleSystem_getDirection },\n\t{ \"setSpread\", w_ParticleSystem_setSpread },\n\t{ \"getSpread\", w_ParticleSystem_getSpread },\n\t{ \"setSpeed\", w_ParticleSystem_setSpeed },\n\t{ \"getSpeed\", w_ParticleSystem_getSpeed },\n\t{ \"setLinearAcceleration\", w_ParticleSystem_setLinearAcceleration },\n\t{ \"getLinearAcceleration\", w_ParticleSystem_getLinearAcceleration },\n\t{ \"setRadialAcceleration\", w_ParticleSystem_setRadialAcceleration },\n\t{ \"getRadialAcceleration\", w_ParticleSystem_getRadialAcceleration },\n\t{ \"setTangentialAcceleration\", w_ParticleSystem_setTangentialAcceleration },\n\t{ \"getTangentialAcceleration\", w_ParticleSystem_getTangentialAcceleration },\n\t{ \"setLinearDamping\", w_ParticleSystem_setLinearDamping },\n\t{ \"getLinearDamping\", w_ParticleSystem_getLinearDamping },\n\t{ \"setSizes\", w_ParticleSystem_setSizes },\n\t{ \"getSizes\", w_ParticleSystem_getSizes },\n\t{ \"setSizeVariation\", w_ParticleSystem_setSizeVariation },\n\t{ \"getSizeVariation\", w_ParticleSystem_getSizeVariation },\n\t{ \"setRotation\", w_ParticleSystem_setRotation },\n\t{ \"getRotation\", w_ParticleSystem_getRotation },\n\t{ \"setSpin\", w_ParticleSystem_setSpin },\n\t{ \"getSpin\", w_ParticleSystem_getSpin },\n\t{ \"setSpinVariation\", w_ParticleSystem_setSpinVariation },\n\t{ \"getSpinVariation\", w_ParticleSystem_getSpinVariation },\n\t{ \"setColors\", w_ParticleSystem_setColors },\n\t{ \"getColors\", w_ParticleSystem_getColors },\n\t{ \"setQuads\", w_ParticleSystem_setQuads },\n\t{ \"getQuads\", w_ParticleSystem_getQuads },\n\t{ \"setOffset\", w_ParticleSystem_setOffset },\n\t{ \"getOffset\", w_ParticleSystem_getOffset },\n\t{ \"setRelativeRotation\", w_ParticleSystem_setRelativeRotation },\n\t{ \"hasRelativeRotation\", w_ParticleSystem_hasRelativeRotation },\n\t{ \"getCount\", w_ParticleSystem_getCount },\n\t{ \"start\", w_ParticleSystem_start },\n\t{ \"stop\", w_ParticleSystem_stop },\n\t{ \"pause\", w_ParticleSystem_pause },\n\t{ \"reset\", w_ParticleSystem_reset },\n\t{ \"emit\", w_ParticleSystem_emit },\n\t{ \"isActive\", w_ParticleSystem_isActive },\n\t{ \"isPaused\", w_ParticleSystem_isPaused },\n\t{ \"isStopped\", w_ParticleSystem_isStopped },\n\t{ \"update\", w_ParticleSystem_update },\n\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_particlesystem(lua_State *L)\n{\n\treturn luax_register_type(L, &ParticleSystem::type, w_ParticleSystem_functions, nullptr);\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/wrap_ParticleSystem.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"ParticleSystem.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nParticleSystem *luax_checkparticlesystem(lua_State *L, int idx);\nextern \"C\" int luaopen_particlesystem(lua_State *L);\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/wrap_Quad.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"wrap_Quad.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nQuad *luax_checkquad(lua_State *L, int idx)\n{\n\treturn luax_checktype<Quad>(L, idx);\n}\n\nint w_Quad_setViewport(lua_State *L)\n{\n\tQuad *quad = luax_checkquad(L, 1);\n\n\tQuad::Viewport v;\n\tv.x = luaL_checknumber(L, 2);\n\tv.y = luaL_checknumber(L, 3);\n\tv.w = luaL_checknumber(L, 4);\n\tv.h = luaL_checknumber(L, 5);\n\n\tif (lua_isnoneornil(L, 6))\n\t\tquad->setViewport(v);\n\telse\n\t{\n\t\tdouble sw = luaL_checknumber(L, 6);\n\t\tdouble sh = luaL_checknumber(L, 7);\n\t\tquad->refresh(v, sw, sh);\n\t}\n\n\treturn 0;\n}\n\nint w_Quad_getViewport(lua_State *L)\n{\n\tQuad *quad = luax_checkquad(L, 1);\n\tQuad::Viewport v = quad->getViewport();\n\tlua_pushnumber(L, v.x);\n\tlua_pushnumber(L, v.y);\n\tlua_pushnumber(L, v.w);\n\tlua_pushnumber(L, v.h);\n\treturn 4;\n}\n\nint w_Quad_getTextureDimensions(lua_State *L)\n{\n\tQuad *quad = luax_checkquad(L, 1);\n\tdouble sw = quad->getTextureWidth();\n\tdouble sh = quad->getTextureHeight();\n\tlua_pushnumber(L, sw);\n\tlua_pushnumber(L, sh);\n\treturn 2;\n}\n\nint w_Quad_setLayer(lua_State *L)\n{\n\tQuad *quad = luax_checkquad(L, 1);\n\tint layer = (int) luaL_checkinteger(L, 2) - 1;\n\tquad->setLayer(layer);\n\treturn 0;\n}\n\nint w_Quad_getLayer(lua_State *L)\n{\n\tQuad *quad = luax_checkquad(L, 1);\n\tlua_pushnumber(L, quad->getLayer() + 1);\n\treturn 1;\n}\n\nstatic const luaL_Reg w_Quad_functions[] =\n{\n\t{ \"setViewport\", w_Quad_setViewport },\n\t{ \"getViewport\", w_Quad_getViewport },\n\t{ \"getTextureDimensions\", w_Quad_getTextureDimensions },\n\t{ \"setLayer\", w_Quad_setLayer },\n\t{ \"getLayer\", w_Quad_getLayer },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_quad(lua_State *L)\n{\n\treturn luax_register_type(L, &Quad::type, w_Quad_functions, nullptr);\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/wrap_Quad.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_GRAPHICS_WRAP_QUAD_H\n#define LOVE_GRAPHICS_WRAP_QUAD_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"Quad.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nQuad *luax_checkquad(lua_State *L, int idx);\nextern \"C\" int luaopen_quad(lua_State *L);\n\n} // graphics\n} // love\n\n#endif // LOVE_GRAPHICS_WRAP_QUAD_H\n"
  },
  {
    "path": "src/modules/graphics/wrap_Shader.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_Shader.h\"\n#include \"wrap_Texture.h\"\n#include \"math/MathModule.h\"\n#include \"math/Transform.h\"\n#include \"Graphics.h\"\n\n#include <string>\n#include <algorithm>\n#include <cmath>\n#include <limits>\n\nnamespace love\n{\nnamespace graphics\n{\n\nShader *luax_checkshader(lua_State *L, int idx)\n{\n\treturn luax_checktype<Shader>(L, idx);\n}\n\nint w_Shader_getWarnings(lua_State *L)\n{\n\tShader *shader = luax_checkshader(L, 1);\n\tstd::string warnings = shader->getWarnings();\n\tlua_pushstring(L, warnings.c_str());\n\treturn 1;\n}\n\nstatic int _getCount(lua_State *L, int startidx, const Shader::UniformInfo *info)\n{\n\treturn std::min(std::max(lua_gettop(L) - startidx + 1, 1), info->count);\n}\n\ntemplate <typename T, typename luaT, luaT (*checknum)(lua_State *, int)>\nstatic void _updateNumbers(lua_State *L, int startidx, T *values, int components, int count)\n{\n\tif (components == 1)\n\t{\n\t\tfor (int i = 0; i < count; ++i)\n\t\t\tvalues[i] = (T) checknum(L, startidx + i);\n\t}\n\telse\n\t{\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tluaL_checktype(L, startidx + i, LUA_TTABLE);\n\n\t\t\tfor (int k = 1; k <= components; k++)\n\t\t\t{\n\t\t\t\tlua_rawgeti(L, startidx + i, k);\n\t\t\t\tvalues[i * components + k - 1] = (T) checknum(L, -1);\n\t\t\t}\n\n\t\t\tlua_pop(L, components);\n\t\t}\n\t}\n}\n\nint w_Shader_sendFloats(lua_State *L, int startidx, Shader *shader, const Shader::UniformInfo *info, bool colors)\n{\n\tint count = _getCount(L, startidx, info);\n\tint components = info->components;\n\tfloat *values = info->floats;\n\n\tif (colors)\n\t\t_updateNumbers<float, lua_Number, luax_checknumberclamped01>(L, startidx, values, components, count);\n\telse\n\t\t_updateNumbers<float, lua_Number, luaL_checknumber>(L, startidx, values, components, count);\n\n\tif (colors && graphics::isGammaCorrect())\n\t{\n\t\t// alpha is always linear (when present).\n\t\tint gammacomponents = std::min(components, 3);\n\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tfor (int j = 0; j < gammacomponents; j++)\n\t\t\t\tvalues[i * components + j] = math::gammaToLinear(values[i * components + j]);\n\t\t}\n\t}\n\n\tluax_catchexcept(L, [&]() { shader->updateUniform(info, count); });\n\treturn 0;\n}\n\nint w_Shader_sendInts(lua_State *L, int startidx, Shader *shader, const Shader::UniformInfo *info)\n{\n\tint count = _getCount(L, startidx, info);\n\t_updateNumbers<int, lua_Integer, luaL_checkinteger>(L, startidx, info->ints, info->components, count);\n\tluax_catchexcept(L, [&]() { shader->updateUniform(info, count); });\n\treturn 0;\n}\n\nint w_Shader_sendUnsignedInts(lua_State *L, int startidx, Shader *shader, const Shader::UniformInfo *info)\n{\n\tint count = _getCount(L, startidx, info);\n\t_updateNumbers<unsigned int, lua_Integer, luaL_checkinteger>(L, startidx, info->uints, info->components, count);\n\tluax_catchexcept(L, [&]() { shader->updateUniform(info, count); });\n\treturn 0;\n}\n\nint w_Shader_sendBooleans(lua_State *L, int startidx, Shader *shader, const Shader::UniformInfo *info)\n{\n\tint count = _getCount(L, startidx, info);\n\tint components = info->components;\n\n\t// We have to send booleans as ints.\n\tint *values = info->ints;\n\n\tif (components == 1)\n\t{\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tluaL_checktype(L, startidx + i, LUA_TBOOLEAN);\n\t\t\tvalues[i] = (int) lua_toboolean(L, startidx + i);\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tluaL_checktype(L, startidx + i, LUA_TTABLE);\n\n\t\t\tfor (int k = 1; k <= components; k++)\n\t\t\t{\n\t\t\t\tlua_rawgeti(L, startidx + i, k);\n\t\t\t\tluaL_checktype(L, -1, LUA_TBOOLEAN);\n\t\t\t\tvalues[i * components + k - 1] = (int) lua_toboolean(L, -1);\n\t\t\t}\n\n\t\t\tlua_pop(L, components);\n\t\t}\n\t}\n\n\tluax_catchexcept(L, [&]() { shader->updateUniform(info, count); });\n\treturn 0;\n}\n\nint w_Shader_sendMatrices(lua_State *L, int startidx, Shader *shader, const Shader::UniformInfo *info)\n{\n\tbool columnmajor = false;\n\n\tif (lua_type(L, startidx) == LUA_TSTRING)\n\t{\n\t\tconst char *layoutstr = lua_tostring(L, startidx);\n\t\tmath::Transform::MatrixLayout layout;\n\t\tif (!math::Transform::getConstant(layoutstr, layout))\n\t\t\treturn luax_enumerror(L, \"matrix layout\", math::Transform::getConstants(layout), layoutstr);\n\n\t\tcolumnmajor = (layout == math::Transform::MATRIX_COLUMN_MAJOR);\n\t\tstartidx++;\n\t}\n\n\tint count = _getCount(L, startidx, info);\n\tint columns = info->matrix.columns;\n\tint rows = info->matrix.rows;\n\tint elements = columns * rows;\n\n\tfloat *values = info->floats;\n\n\tfor (int i = 0; i < count; i++)\n\t{\n\t\tif (columns == 4 && rows == 4 && luax_istype(L, startidx + i, math::Transform::type))\n\t\t{\n\t\t\tmath::Transform *t = luax_totype<math::Transform>(L, startidx + i);\n\t\t\tmemcpy(&values[i * 16], t->getMatrix().getElements(), sizeof(float) * 16);\n\t\t\tcontinue;\n\t\t}\n\n\t\tluaL_checktype(L, startidx + i, LUA_TTABLE);\n\n\t\tlua_rawgeti(L, startidx + i, 1);\n\t\tbool table_of_tables = lua_istable(L, -1);\n\t\tlua_pop(L, 1);\n\n\t\tif (table_of_tables)\n\t\t{\n\t\t\tint n = i * elements;\n\n\t\t\tif (columnmajor)\n\t\t\t{\n\t\t\t\tfor (int column = 0; column < columns; column++)\n\t\t\t\t{\n\t\t\t\t\tlua_rawgeti(L, startidx + i, column + 1);\n\n\t\t\t\t\tfor (int row = 0; row < rows; row++)\n\t\t\t\t\t{\n\t\t\t\t\t\tlua_rawgeti(L, -(row + 1), row + 1);\n\t\t\t\t\t\tvalues[n + (column * rows + row)] = (float) luaL_checknumber(L, -1);\n\t\t\t\t\t}\n\n\t\t\t\t\tlua_pop(L, rows + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor (int row = 0; row < rows; row++)\n\t\t\t\t{\n\t\t\t\t\tlua_rawgeti(L, startidx + i, row + 1);\n\n\t\t\t\t\tfor (int column = 0; column < columns; column++)\n\t\t\t\t\t{\n\t\t\t\t\t\t// The table has the matrix elements laid out in row-major\n\t\t\t\t\t\t// order, but we need to store them column-major in memory.\n\t\t\t\t\t\tlua_rawgeti(L, -(column + 1), column + 1);\n\t\t\t\t\t\tvalues[n + (column * rows + row)] = (float) luaL_checknumber(L, -1);\n\t\t\t\t\t}\n\n\t\t\t\t\tlua_pop(L, columns + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tint n = i * elements;\n\n\t\t\tif (columnmajor)\n\t\t\t{\n\t\t\t\tfor (int column = 0; column < columns; column++)\n\t\t\t\t{\n\t\t\t\t\tfor (int row = 0; row < rows; row++)\n\t\t\t\t\t{\n\t\t\t\t\t\tlua_rawgeti(L, startidx + i, column * rows + row + 1);\n\t\t\t\t\t\tvalues[n + (column * rows + row)] = (float) luaL_checknumber(L, -1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor (int column = 0; column < columns; column++)\n\t\t\t\t{\n\t\t\t\t\tfor (int row = 0; row < rows; row++)\n\t\t\t\t\t{\n\t\t\t\t\t\t// The table has the matrix elements laid out in row-major\n\t\t\t\t\t\t// order, but we need to store them column-major in memory.\n\t\t\t\t\t\tlua_rawgeti(L, startidx + i, row * columns + column + 1);\n\t\t\t\t\t\tvalues[n + (column * rows + row)] = (float) luaL_checknumber(L, -1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlua_pop(L, elements);\n\t\t}\n\t}\n\n\tshader->updateUniform(info, count);\n\treturn 0;\n}\n\nint w_Shader_sendTextures(lua_State *L, int startidx, Shader *shader, const Shader::UniformInfo *info)\n{\n\tint count = _getCount(L, startidx, info);\n\n\tstd::vector<Texture *> textures;\n\ttextures.reserve(count);\n\n\tfor (int i = 0; i < count; i++)\n\t{\n\t\tTexture *tex = luax_checktexture(L, startidx + i);\n\t\ttextures.push_back(tex);\n\t}\n\n\tluax_catchexcept(L, [&]() { shader->sendTextures(info, textures.data(), count); });\n\treturn 0;\n}\n\nint w_Shader_sendBuffers(lua_State *L, int startidx, Shader *shader, const Shader::UniformInfo *info)\n{\n\tint count = _getCount(L, startidx, info);\n\n\tstd::vector<Buffer *> buffers;\n\tbuffers.reserve(count);\n\n\tfor (int i = 0; i < count; i++)\n\t{\n\t\tBuffer *buffer = luax_checktype<Buffer>(L, startidx + i);\n\t\tbuffers.push_back(buffer);\n\t}\n\n\tluax_catchexcept(L, [&]() { shader->sendBuffers(info, buffers.data(), count); });\n\treturn 0;\n}\n\nstatic int w_Shader_sendLuaValues(lua_State *L, int startidx, Shader *shader, const Shader::UniformInfo *info, const char *name)\n{\n\tswitch (info->baseType)\n\t{\n\tcase Shader::UNIFORM_FLOAT:\n\t\treturn w_Shader_sendFloats(L, startidx, shader, info, false);\n\tcase Shader::UNIFORM_MATRIX:\n\t\treturn w_Shader_sendMatrices(L, startidx, shader, info);\n\tcase Shader::UNIFORM_INT:\n\t\treturn w_Shader_sendInts(L, startidx, shader, info);\n\tcase Shader::UNIFORM_UINT:\n\t\treturn w_Shader_sendUnsignedInts(L, startidx, shader, info);\n\tcase Shader::UNIFORM_BOOL:\n\t\treturn w_Shader_sendBooleans(L, startidx, shader, info);\n\tcase Shader::UNIFORM_SAMPLER:\n\tcase Shader::UNIFORM_STORAGETEXTURE:\n\t\treturn w_Shader_sendTextures(L, startidx, shader, info);\n\tcase Shader::UNIFORM_TEXELBUFFER:\n\tcase Shader::UNIFORM_STORAGEBUFFER:\n\t\treturn w_Shader_sendBuffers(L, startidx, shader, info);\n\tdefault:\n\t\treturn luaL_error(L, \"Unknown variable type for shader uniform '%s\", name);\n\t}\n}\n\nstatic int w_Shader_sendData(lua_State *L, int startidx, Shader *shader, const Shader::UniformInfo *info, bool colors)\n{\n\tif (info->baseType == Shader::UNIFORM_SAMPLER || info->baseType == Shader::UNIFORM_STORAGETEXTURE\n\t\t|| info->baseType == Shader::UNIFORM_TEXELBUFFER || info->baseType == Shader::UNIFORM_STORAGEBUFFER)\n\t\treturn luaL_error(L, \"Only value types (floats, ints, vectors, matrices, etc) be sent to Shaders via Data objects.\");\n\n\tmath::Transform::MatrixLayout layout = math::Transform::MATRIX_ROW_MAJOR;\n\tint dataidx = startidx;\n\tif (info->baseType == Shader::UNIFORM_MATRIX)\n\t{\n\t\tif (lua_type(L, startidx) == LUA_TSTRING)\n\t\t{\n\t\t\t// (matrixlayout, data, ...)\n\t\t\tconst char *layoutstr = lua_tostring(L, startidx);\n\t\t\tif (!math::Transform::getConstant(layoutstr, layout))\n\t\t\t\treturn luax_enumerror(L, \"matrix layout\", math::Transform::getConstants(layout), layoutstr);\n\n\t\t\tstartidx++;\n\t\t\tdataidx = startidx;\n\t\t}\n\t\telse if (lua_type(L, startidx + 1) == LUA_TSTRING)\n\t\t{\n\t\t\t// (data, matrixlayout, ...)\n\t\t\t// Should be deprecated in the future (doesn't match the argument\n\t\t\t// order of Shader:send(name, matrixlayout, table))\n\t\t\tconst char *layoutstr = lua_tostring(L, startidx + 1);\n\t\t\tif (!math::Transform::getConstant(layoutstr, layout))\n\t\t\t\treturn luax_enumerror(L, \"matrix layout\", math::Transform::getConstants(layout), layoutstr);\n\n\t\t\tstartidx++;\n\t\t}\n\t}\n\n\tbool columnmajor = (layout == math::Transform::MATRIX_COLUMN_MAJOR);\n\n\tData *data = luax_checktype<Data>(L, dataidx);\n\tsize_t size = data->getSize();\n\n\tptrdiff_t offset = (ptrdiff_t) luaL_optinteger(L, startidx + 1, 0);\n\tif (offset < 0)\n\t\treturn luaL_error(L, \"Offset cannot be negative.\");\n\telse if ((size_t) offset >= size)\n\t\treturn luaL_error(L, \"Offset must be less than the size of the Data.\");\n\n\tsize_t uniformstride = info->dataSize / info->count;\n\n\tif (!lua_isnoneornil(L, startidx + 2))\n\t{\n\t\tlua_Integer sizearg = luaL_checkinteger(L, startidx + 2);\n\t\tif (sizearg <= 0)\n\t\t\treturn luaL_error(L, \"Size must be greater than 0.\");\n\t\telse if ((size_t) sizearg > size - offset)\n\t\t\treturn luaL_error(L, \"Size and offset must fit within the Data's bounds.\");\n\t\telse if (sizearg % uniformstride != 0)\n\t\t\treturn luaL_error(L, \"Size (%d) must be a multiple of the uniform's size in bytes (%d).\", sizearg, uniformstride);\n\t\telse if ((size_t) sizearg > info->dataSize)\n\t\t\treturn luaL_error(L, \"Size must not be greater than the uniform's total size in bytes.\");\n\n\t\tsize = (size_t) sizearg;\n\t}\n\telse\n\t{\n\t\tsize -= offset;\n\t\tsize = std::min((size / uniformstride) * uniformstride, info->dataSize);\n\t}\n\n\tif (size == 0)\n\t\treturn luaL_error(L, \"Size to copy must be greater than 0.\");\n\n\tint count = (int) (size / uniformstride);\n\tconst char *mem = (const char *) data->getData() + offset;\n\n\tif (info->baseType != Shader::UNIFORM_MATRIX || columnmajor)\n\t\tmemcpy(info->data, mem, size);\n\telse\n\t{\n\t\tint columns = info->matrix.columns;\n\t\tint rows = info->matrix.rows;\n\n\t\tconst float *src = (const float *) mem;\n\t\tfloat *dst = info->floats;\n\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tfor (int row = 0; row < rows; row++)\n\t\t\t{\n\t\t\t\tfor (int column = 0; column < columns; column++)\n\t\t\t\t\tdst[column * rows + row] = src[row * columns + column];\n\t\t\t}\n\n\t\t\tsrc += columns * rows;\n\t\t\tdst += columns * rows;\n\t\t}\n\t}\n\n\tif (colors && graphics::isGammaCorrect())\n\t{\n\t\t// alpha is always linear (when present).\n\t\tint components = info->components;\n\t\tint gammacomponents = std::min(components, 3);\n\t\tfloat *values = info->floats;\n\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tfor (int j = 0; j < gammacomponents; j++)\n\t\t\t\tvalues[i * components + j] = math::gammaToLinear(values[i * components + j]);\n\t\t}\n\t}\n\n\tshader->updateUniform(info, count);\n\treturn 0;\n}\n\nint w_Shader_send(lua_State *L)\n{\n\tShader *shader = luax_checkshader(L, 1);\n\tconst char *name = luaL_checkstring(L, 2);\n\n\tconst Shader::UniformInfo *info = shader->getUniformInfo(name);\n\tif (info == nullptr || !info->active)\n\t\treturn luaL_error(L, \"Shader uniform '%s' does not exist.\\nA common error is to define but not use the variable.\", name);\n\n\tif (luax_istype(L, 3, Data::type) || (info->baseType == Shader::UNIFORM_MATRIX && luax_istype(L, 4, Data::type)))\n\t\treturn w_Shader_sendData(L, 3, shader, info, false);\n\telse\n\t\treturn w_Shader_sendLuaValues(L, 3, shader, info, name);\n}\n\nint w_Shader_sendColors(lua_State *L)\n{\n\tShader *shader = luax_checkshader(L, 1);\n\tconst char *name = luaL_checkstring(L, 2);\n\n\tconst Shader::UniformInfo *info = shader->getUniformInfo(name);\n\tif (info == nullptr || !info->active)\n\t\treturn luaL_error(L, \"Shader uniform '%s' does not exist.\\nA common error is to define but not use the variable.\", name);\n\n\tif (info->baseType != Shader::UNIFORM_FLOAT || info->components < 3)\n\t\treturn luaL_error(L, \"Shader:sendColor can only be used with vec3 or vec4 uniforms.\");\n\n\tif (luax_istype(L, 3, Data::type))\n\t\tw_Shader_sendData(L, 3, shader, info, true);\n\telse\n\t\tw_Shader_sendFloats(L, 3, shader, info, true);\n\n\tluax_pushboolean(L, true);\n\treturn 1;\n}\n\nint w_Shader_hasUniform(lua_State *L)\n{\n\tShader *shader = luax_checkshader(L, 1);\n\tconst char *name = luaL_checkstring(L, 2);\n\tluax_pushboolean(L, shader->hasUniform(name));\n\treturn 1;\n}\n\nint w_Shader_hasStage(lua_State* L)\n{\n\tShader *shader = luax_checkshader(L, 1);\n\tShaderStageType stage;\n\tconst char *str = luaL_checkstring(L, 2);\n\tif (!ShaderStage::getConstant(str, stage))\n\t\treturn luax_enumerror(L, \"shader stage\", str);\n\n\tluax_pushboolean(L, shader->hasStage(stage));\n\treturn 1;\n}\n\nint w_Shader_getLocalThreadgroupSize(lua_State* L)\n{\n\tShader *shader = luax_checkshader(L, 1);\n\n\tif (!shader->hasStage(SHADERSTAGE_COMPUTE))\n\t{\n\t\tlua_pushnil(L);\n\t\treturn 1;\n\t}\n\n\tint x, y, z;\n\tshader->getLocalThreadgroupSize(&x, &y, &z);\n\tlua_pushinteger(L, x);\n\tlua_pushinteger(L, y);\n\tlua_pushinteger(L, z);\n\treturn 3;\n}\n\nint w_Shader_getBufferFormat(lua_State *L)\n{\n\tShader *shader = luax_checkshader(L, 1);\n\tconst char *name = luaL_checkstring(L, 2);\n\tconst std::vector<Buffer::DataDeclaration> *format = shader->getBufferFormat(name);\n\tif (format != nullptr)\n\t{\n\t\tlua_createtable(L, (int)format->size(), 0);\n\n\t\tfor (size_t i = 0; i < format->size(); i++)\n\t\t{\n\t\t\tconst Buffer::DataDeclaration &member = (*format)[i];\n\n\t\t\tlua_createtable(L, 0, 3);\n\n\t\t\tlua_pushstring(L, member.name.c_str());\n\t\t\tlua_setfield(L, -2, \"name\");\n\n\t\t\tconst char* formatstr = \"unknown\";\n\t\t\tgetConstant(member.format, formatstr);\n\t\t\tlua_pushstring(L, formatstr);\n\t\t\tlua_setfield(L, -2, \"format\");\n\n\t\t\tlua_pushinteger(L, member.arrayLength);\n\t\t\tlua_setfield(L, -2, \"arraylength\");\n\n\t\t\tlua_rawseti(L, -2, i + 1);\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\treturn luaL_error(L, \"Buffer '%s' does not exist in the Shader.\", name);\n}\n\nint w_Shader_getDebugName(lua_State *L)\n{\n\tShader *shader = luax_checkshader(L, 1);\n\tconst std::string &debugName = shader->getDebugName();\n\tif (debugName.empty())\n\t\tlua_pushnil(L);\n\telse\n\t\tluax_pushstring(L, debugName);\n\treturn 1;\n}\n\nstatic const luaL_Reg w_Shader_functions[] =\n{\n\t{ \"getWarnings\",             w_Shader_getWarnings },\n\t{ \"send\",                    w_Shader_send },\n\t{ \"sendColor\",               w_Shader_sendColors },\n\t{ \"hasUniform\",              w_Shader_hasUniform },\n\t{ \"hasStage\",                w_Shader_hasStage },\n\t{ \"getLocalThreadgroupSize\", w_Shader_getLocalThreadgroupSize },\n\t{ \"getBufferFormat\",         w_Shader_getBufferFormat },\n\t{ \"getDebugName\",            w_Shader_getDebugName },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_shader(lua_State *L)\n{\n\treturn luax_register_type(L, &Shader::type, w_Shader_functions, nullptr);\n}\n\n} // graphics\n} // love\n\n"
  },
  {
    "path": "src/modules/graphics/wrap_Shader.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"common/runtime.h\"\n#include \"common/config.h\"\n#include \"Shader.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nShader *luax_checkshader(lua_State *L, int idx);\nextern \"C\" int luaopen_shader(lua_State *L);\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/wrap_SpriteBatch.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"wrap_SpriteBatch.h\"\n#include \"Texture.h\"\n#include \"wrap_Texture.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nSpriteBatch *luax_checkspritebatch(lua_State *L, int idx)\n{\n\treturn luax_checktype<SpriteBatch>(L, idx);\n}\n\nstatic inline int w_SpriteBatch_add_or_set(lua_State *L, SpriteBatch *t, int startidx, int index)\n{\n\tQuad *quad = luax_totype<Quad>(L, startidx);\n\n\tif (quad != nullptr)\n\t\tstartidx++;\n\telse if (lua_isnil(L, startidx) && !lua_isnoneornil(L, startidx + 1))\n\t\treturn luax_typerror(L, startidx, \"Quad\");\n\n\tluax_checkstandardtransform(L, startidx, [&](const Matrix4 &m)\n\t{\n\t\tluax_catchexcept(L, [&]()\n\t\t{\n\t\t\tif (quad)\n\t\t\t\tindex = t->add(quad, m, index);\n\t\t\telse\n\t\t\t\tindex = t->add(m, index);\n\t\t});\n\t});\n\n\treturn index;\n}\n\nstatic int w_SpriteBatch_addLayer_or_setLayer(lua_State *L, SpriteBatch *t, int startidx, int index)\n{\n\tint layer = (int) luaL_checkinteger(L, startidx) - 1;\n\tstartidx++;\n\n\tQuad *quad = luax_totype<Quad>(L, startidx);\n\n\tif (quad != nullptr)\n\t\tstartidx++;\n\telse if (lua_isnil(L, startidx) && !lua_isnoneornil(L, startidx + 1))\n\t\treturn luax_typerror(L, startidx, \"Quad\");\n\n\tluax_checkstandardtransform(L, startidx, [&](const Matrix4 &m)\n\t{\n\t\tluax_catchexcept(L, [&]()\n\t\t{\n\t\t\tif (quad)\n\t\t\t\tindex = t->addLayer(layer, quad, m, index);\n\t\t\telse\n\t\t\t\tindex = t->addLayer(layer, m, index);\n\t\t});\n\t});\n\n\treturn index;\n}\n\nint w_SpriteBatch_add(lua_State *L)\n{\n\tSpriteBatch *t = luax_checkspritebatch(L, 1);\n\n\tint index = w_SpriteBatch_add_or_set(L, t, 2, -1);\n\tlua_pushinteger(L, index + 1);\n\n\treturn 1;\n}\n\nint w_SpriteBatch_set(lua_State *L)\n{\n\tSpriteBatch *t = luax_checkspritebatch(L, 1);\n\tint index = (int) luaL_checkinteger(L, 2) - 1;\n\n\tw_SpriteBatch_add_or_set(L, t, 3, index);\n\n\treturn 0;\n}\n\nint w_SpriteBatch_addLayer(lua_State *L)\n{\n\tSpriteBatch *t = luax_checkspritebatch(L, 1);\n\n\tint index = w_SpriteBatch_addLayer_or_setLayer(L, t, 2, -1);\n\tlua_pushinteger(L, index + 1);\n\n\treturn 1;\n}\n\nint w_SpriteBatch_setLayer(lua_State *L)\n{\n\tSpriteBatch *t = luax_checkspritebatch(L, 1);\n\tint index = (int) luaL_checkinteger(L, 2) - 1;\n\n\tw_SpriteBatch_addLayer_or_setLayer(L, t, 3, index);\n\t\n\treturn 0;\n}\n\nint w_SpriteBatch_clear(lua_State *L)\n{\n\tSpriteBatch *t = luax_checkspritebatch(L, 1);\n\tt->clear();\n\treturn 0;\n}\n\nint w_SpriteBatch_flush(lua_State *L)\n{\n\tSpriteBatch *t = luax_checkspritebatch(L, 1);\n\tt->flush();\n\treturn 0;\n}\n\nint w_SpriteBatch_setTexture(lua_State *L)\n{\n\tSpriteBatch *t = luax_checkspritebatch(L, 1);\n\tTexture *tex = luax_checktexture(L, 2);\n\tluax_catchexcept(L, [&](){ t->setTexture(tex); });\n\treturn 0;\n}\n\nint w_SpriteBatch_getTexture(lua_State *L)\n{\n\tSpriteBatch *t = luax_checkspritebatch(L, 1);\n\tluax_pushtype(L, t->getTexture());\n\treturn 1;\n}\n\nint w_SpriteBatch_setColor(lua_State *L)\n{\n\tSpriteBatch *t = luax_checkspritebatch(L, 1);\n\tColorf c;\n\n\tif (lua_istable(L, 2))\n\t{\n\t\tfor (int i = 1; i <= 4; i++)\n\t\t\tlua_rawgeti(L, 2, i);\n\n\t\tc.r = (float) luaL_checknumber(L, -4);\n\t\tc.g = (float) luaL_checknumber(L, -3);\n\t\tc.b = (float) luaL_checknumber(L, -2);\n\t\tc.a = (float) luaL_optnumber(L, -1, 1.0);\n\n\t\tlua_pop(L, 4);\n\t}\n\telse\n\t{\n\t\tc.r = (float) luaL_checknumber(L, 2);\n\t\tc.g = (float) luaL_checknumber(L, 3);\n\t\tc.b = (float) luaL_checknumber(L, 4);\n\t\tc.a = (float) luaL_optnumber(L, 5, 1.0);\n\t}\n\n\tt->setColor(c);\n\n\treturn 0;\n}\n\nint w_SpriteBatch_getColor(lua_State *L)\n{\n\tSpriteBatch *t = luax_checkspritebatch(L, 1);\n\tColorf color = t->getColor();\n\n\tlua_pushnumber(L, color.r);\n\tlua_pushnumber(L, color.g);\n\tlua_pushnumber(L, color.b);\n\tlua_pushnumber(L, color.a);\n\treturn 4;\n}\n\nint w_SpriteBatch_getCount(lua_State *L)\n{\n\tSpriteBatch *t = luax_checkspritebatch(L, 1);\n\tlua_pushinteger(L, t->getCount());\n\treturn 1;\n}\n\nint w_SpriteBatch_getBufferSize(lua_State *L)\n{\n\tSpriteBatch *t = luax_checkspritebatch(L, 1);\n\tlua_pushinteger(L, t->getBufferSize());\n\treturn 1;\n}\n\nint w_SpriteBatch_attachAttribute(lua_State *L)\n{\n\tSpriteBatch *t = luax_checkspritebatch(L, 1);\n\tconst char *name = luaL_checkstring(L, 2);\n\n\tBuffer *buffer = nullptr;\n\tMesh *mesh = nullptr;\n\tif (luax_istype(L, 3, Buffer::type))\n\t{\n\t\tbuffer = luax_checktype<Buffer>(L, 3);\n\t}\n\telse\n\t{\n\t\tmesh = luax_checktype<Mesh>(L, 3);\n\t\tbuffer = mesh->getVertexBuffer();\n\t\tif (buffer == nullptr)\n\t\t\treturn luaL_error(L, \"Mesh does not have its own vertex buffer.\");\n\t}\n\n\tluax_catchexcept(L, [&](){ t->attachAttribute(name, buffer, mesh); });\n\treturn 0;\n}\n\nint w_SpriteBatch_setDrawRange(lua_State *L)\n{\n\tSpriteBatch *t = luax_checkspritebatch(L, 1);\n\n\tif (lua_isnoneornil(L, 2))\n\t\tt->setDrawRange();\n\telse\n\t{\n\t\tint start = (int) luaL_checkinteger(L, 2) - 1;\n\t\tint count = (int) luaL_checkinteger(L, 3);\n\t\tluax_catchexcept(L, [&](){ t->setDrawRange(start, count); });\n\t}\n\n\treturn 0;\n}\n\nint w_SpriteBatch_getDrawRange(lua_State *L)\n{\n\tSpriteBatch *t = luax_checkspritebatch(L, 1);\n\n\tint start = 0;\n\tint count = 1;\n\tif (!t->getDrawRange(start, count))\n\t\treturn 0;\n\n\tlua_pushnumber(L, start + 1);\n\tlua_pushnumber(L, count);\n\treturn 2;\n}\n\nstatic const luaL_Reg w_SpriteBatch_functions[] =\n{\n\t{ \"add\", w_SpriteBatch_add },\n\t{ \"set\", w_SpriteBatch_set },\n\t{ \"addLayer\", w_SpriteBatch_addLayer },\n\t{ \"setLayer\", w_SpriteBatch_setLayer },\n\t{ \"clear\", w_SpriteBatch_clear },\n\t{ \"flush\", w_SpriteBatch_flush },\n\t{ \"setTexture\", w_SpriteBatch_setTexture },\n\t{ \"getTexture\", w_SpriteBatch_getTexture },\n\t{ \"setColor\", w_SpriteBatch_setColor },\n\t{ \"getColor\", w_SpriteBatch_getColor },\n\t{ \"getCount\", w_SpriteBatch_getCount },\n\t{ \"getBufferSize\", w_SpriteBatch_getBufferSize },\n\t{ \"attachAttribute\", w_SpriteBatch_attachAttribute },\n\t{ \"setDrawRange\", w_SpriteBatch_setDrawRange },\n\t{ \"getDrawRange\", w_SpriteBatch_getDrawRange },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_spritebatch(lua_State *L)\n{\n\treturn luax_register_type(L, &SpriteBatch::type, w_SpriteBatch_functions, nullptr);\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/wrap_SpriteBatch.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"common/runtime.h\"\n#include \"SpriteBatch.h\"\n#include \"math/wrap_Transform.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\ntemplate <typename T>\nstatic void luax_checkstandardtransform(lua_State *L, int idx, const T &func)\n{\n\tmath::Transform *tf = luax_totype<math::Transform>(L, idx);\n\tif (tf != nullptr)\n\t{\n\t\tfunc(tf->getMatrix());\n\t}\n\telse\n\t{\n\t\tint nargs = lua_gettop(L);\n\t\tfloat x  = (float) luaL_optnumber(L, idx + 0, 0.0);\n\t\tfloat y  = (float) luaL_optnumber(L, idx + 1, 0.0);\n\t\tfloat a  = (float) luaL_optnumber(L, idx + 2, 0.0);\n\t\tfloat sx = (float) luaL_optnumber(L, idx + 3, 1.0);\n\t\tfloat sy = (float) luaL_optnumber(L, idx + 4, sx);\n\t\tfloat ox = 0.0f;\n\t\tfloat oy = 0.0f;\n\t\tif (nargs >= idx + 5)\n\t\t{\n\t\t\tox = (float) luaL_optnumber(L, idx + 5, 0.0);\n\t\t\toy = (float) luaL_optnumber(L, idx + 6, 0.0);\n\t\t}\n\t\tfloat kx = 0.0f;\n\t\tfloat ky = 0.0f;\n\t\tif (nargs >= idx + 7)\n\t\t{\n\t\t\tkx = (float) luaL_optnumber(L, idx + 7, 0.0);\n\t\t\tky = (float) luaL_optnumber(L, idx + 8, 0.0);\n\t\t}\n\t\tfunc(Matrix4(x, y, a, sx, sy, ox, oy, kx, ky));\n\t}\n}\n\nSpriteBatch *luax_checkspritebatch(lua_State *L, int idx);\nextern \"C\" int luaopen_spritebatch(lua_State *L);\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/wrap_TextBatch.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_TextBatch.h\"\n#include \"wrap_Font.h\"\n#include \"math/wrap_Transform.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nTextBatch *luax_checktextbatch(lua_State *L, int idx)\n{\n\treturn luax_checktype<TextBatch>(L, idx);\n}\n\nint w_TextBatch_set(lua_State *L)\n{\n\tTextBatch *t = luax_checktextbatch(L, 1);\n\n\tstd::vector<love::font::ColoredString> newtext;\n\tluax_checkcoloredstring(L, 2, newtext);\n\n\tluax_catchexcept(L, [&](){ t->set(newtext); });\n\treturn 0;\n}\n\nint w_TextBatch_setf(lua_State *L)\n{\n\tTextBatch *t = luax_checktextbatch(L, 1);\n\n\tfloat wraplimit = (float) luaL_checknumber(L, 3);\n\n\tFont::AlignMode align;\n\tconst char *alignstr = luaL_checkstring(L, 4);\n\tif (!Font::getConstant(alignstr, align))\n\t\treturn luax_enumerror(L, \"align mode\", Font::getConstants(align), alignstr);\n\n\tstd::vector<love::font::ColoredString> newtext;\n\tluax_checkcoloredstring(L, 2, newtext);\n\n\tluax_catchexcept(L, [&](){ t->set(newtext, wraplimit, align); });\n\n\treturn 0;\n}\n\nint w_TextBatch_add(lua_State *L)\n{\n\tTextBatch *t = luax_checktextbatch(L, 1);\n\n\tint index = 0;\n\n\tstd::vector<love::font::ColoredString> text;\n\tluax_checkcoloredstring(L, 2, text);\n\n\tif (luax_istype(L, 3, math::Transform::type))\n\t{\n\t\tmath::Transform *tf = luax_totype<math::Transform>(L, 3);\n\t\tluax_catchexcept(L, [&](){ index = t->add(text, tf->getMatrix()); });\n\t}\n\telse\n\t{\n\t\tfloat x  = (float) luaL_optnumber(L, 3, 0.0);\n\t\tfloat y  = (float) luaL_optnumber(L, 4, 0.0);\n\t\tfloat a  = (float) luaL_optnumber(L, 5, 0.0);\n\t\tfloat sx = (float) luaL_optnumber(L, 6, 1.0);\n\t\tfloat sy = (float) luaL_optnumber(L, 7, sx);\n\t\tfloat ox = (float) luaL_optnumber(L, 8, 0.0);\n\t\tfloat oy = (float) luaL_optnumber(L, 9, 0.0);\n\t\tfloat kx = (float) luaL_optnumber(L, 10, 0.0);\n\t\tfloat ky = (float) luaL_optnumber(L, 11, 0.0);\n\n\t\tMatrix4 m(x, y, a, sx, sy, ox, oy, kx, ky);\n\t\tluax_catchexcept(L, [&](){ index = t->add(text, m); });\n\t}\n\n\tlua_pushnumber(L, index + 1);\n\treturn 1;\n}\n\nint w_TextBatch_addf(lua_State *L)\n{\n\tTextBatch *t = luax_checktextbatch(L, 1);\n\n\tint index = 0;\n\n\tstd::vector<love::font::ColoredString> text;\n\tluax_checkcoloredstring(L, 2, text);\n\n\tfloat wrap = (float) luaL_checknumber(L, 3);\n\n\tFont::AlignMode align = Font::ALIGN_MAX_ENUM;\n\tconst char *alignstr = luaL_checkstring(L, 4);\n\n\tif (!Font::getConstant(alignstr, align))\n\t\treturn luax_enumerror(L, \"align mode\", Font::getConstants(align), alignstr);\n\n\tif (luax_istype(L, 5, math::Transform::type))\n\t{\n\t\tmath::Transform *tf = luax_totype<math::Transform>(L, 5);\n\t\tluax_catchexcept(L, [&](){ index = t->addf(text, wrap, align, tf->getMatrix()); });\n\t}\n\telse\n\t{\n\t\tfloat x  = (float) luaL_optnumber(L, 5, 0.0);\n\t\tfloat y  = (float) luaL_optnumber(L, 6, 0.0);\n\t\tfloat a  = (float) luaL_optnumber(L, 7, 0.0);\n\t\tfloat sx = (float) luaL_optnumber(L, 8, 1.0);\n\t\tfloat sy = (float) luaL_optnumber(L, 9, sx);\n\t\tfloat ox = (float) luaL_optnumber(L, 10, 0.0);\n\t\tfloat oy = (float) luaL_optnumber(L, 11, 0.0);\n\t\tfloat kx = (float) luaL_optnumber(L, 12, 0.0);\n\t\tfloat ky = (float) luaL_optnumber(L, 13, 0.0);\n\n\t\tMatrix4 m(x, y, a, sx, sy, ox, oy, kx, ky);\n\t\tluax_catchexcept(L, [&](){ index = t->addf(text, wrap, align, m); });\n\t}\n\n\tlua_pushnumber(L, index + 1);\n\treturn 1;\n}\n\nint w_TextBatch_clear(lua_State *L)\n{\n\tTextBatch *t = luax_checktextbatch(L, 1);\n\tluax_catchexcept(L, [&](){ t->clear(); });\n\treturn 0;\n}\n\nint w_TextBatch_setFont(lua_State *L)\n{\n\tTextBatch *t = luax_checktextbatch(L, 1);\n\tFont *f = luax_checktype<Font>(L, 2);\n\tluax_catchexcept(L, [&](){ t->setFont(f); });\n\treturn 0;\n}\n\nint w_TextBatch_getFont(lua_State *L)\n{\n\tTextBatch *t = luax_checktextbatch(L, 1);\n\tFont *f = t->getFont();\n\tluax_pushtype(L, f);\n\treturn 1;\n}\n\nint w_TextBatch_getWidth(lua_State *L)\n{\n\tTextBatch *t = luax_checktextbatch(L, 1);\n\tint index = (int) luaL_optinteger(L, 2, 0) - 1;\n\tlua_pushnumber(L, t->getWidth(index));\n\treturn 1;\n}\n\nint w_TextBatch_getHeight(lua_State *L)\n{\n\tTextBatch *t = luax_checktextbatch(L, 1);\n\tint index = (int) luaL_optinteger(L, 2, 0) - 1;\n\tlua_pushnumber(L, t->getHeight(index));\n\treturn 1;\n}\n\nint w_TextBatch_getDimensions(lua_State *L)\n{\n\tTextBatch *t = luax_checktextbatch(L, 1);\n\tint index = (int) luaL_optinteger(L, 2, 0) - 1;\n\tlua_pushnumber(L, t->getWidth(index));\n\tlua_pushnumber(L, t->getHeight(index));\n\treturn 2;\n}\n\nstatic const luaL_Reg w_TextBatch_functions[] =\n{\n\t{ \"set\", w_TextBatch_set },\n\t{ \"setf\", w_TextBatch_setf },\n\t{ \"add\", w_TextBatch_add },\n\t{ \"addf\", w_TextBatch_addf },\n\t{ \"clear\", w_TextBatch_clear },\n\t{ \"setFont\", w_TextBatch_setFont },\n\t{ \"getFont\", w_TextBatch_getFont },\n\t{ \"getWidth\", w_TextBatch_getWidth },\n\t{ \"getHeight\", w_TextBatch_getHeight },\n\t{ \"getDimensions\", w_TextBatch_getDimensions },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_textbatch(lua_State *L)\n{\n\treturn luax_register_type(L, &TextBatch::type, w_TextBatch_functions, nullptr);\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/wrap_TextBatch.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"TextBatch.h\"\n#include \"common/runtime.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nTextBatch *luax_checktextbatch(lua_State *L, int idx);\nextern \"C\" int luaopen_textbatch(lua_State *L);\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/wrap_Texture.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_Texture.h\"\n#include \"Graphics.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nTexture *luax_checktexture(lua_State *L, int idx)\n{\n\treturn luax_checktype<Texture>(L, idx);\n}\n\nint w_Texture_getTextureType(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tconst char *tstr;\n\tif (!Texture::getConstant(t->getTextureType(), tstr))\n\t\treturn luax_enumerror(L, \"texture type\", Texture::getConstants(TEXTURE_MAX_ENUM), tstr);\n\tlua_pushstring(L, tstr);\n\treturn 1;\n}\n\nstatic int w__optMipmap(lua_State *L, Texture *t, int idx)\n{\n\tint mipmap = 0;\n\n\tif (!lua_isnoneornil(L, idx))\n\t{\n\t\tmipmap = (int) luaL_checkinteger(L, idx) - 1;\n\n\t\tif (mipmap < 0 || mipmap >= t->getMipmapCount())\n\t\t\tluaL_error(L, \"Invalid mipmap index: %d\", mipmap + 1);\n\t}\n\n\treturn mipmap;\n}\n\nint w_Texture_getWidth(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tlua_pushnumber(L, t->getWidth(w__optMipmap(L, t, 2)));\n\treturn 1;\n}\n\nint w_Texture_getHeight(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tlua_pushnumber(L, t->getHeight(w__optMipmap(L, t, 2)));\n\treturn 1;\n}\n\nint w_Texture_getDimensions(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tint mipmap = w__optMipmap(L, t, 2);\n\tlua_pushnumber(L, t->getWidth(mipmap));\n\tlua_pushnumber(L, t->getHeight(mipmap));\n\treturn 2;\n}\n\nint w_Texture_getDepth(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tlua_pushnumber(L, t->getDepth(w__optMipmap(L, t, 2)));\n\treturn 1;\n}\n\nint w_Texture_getLayerCount(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tlua_pushnumber(L, t->getLayerCount());\n\treturn 1;\n}\n\nint w_Texture_getMipmapCount(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tlua_pushnumber(L, t->getMipmapCount());\n\treturn 1;\n}\n\nint w_Texture_getPixelWidth(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tlua_pushnumber(L, t->getPixelWidth(w__optMipmap(L, t, 2)));\n\treturn 1;\n}\n\nint w_Texture_getPixelHeight(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tlua_pushnumber(L, t->getPixelHeight(w__optMipmap(L, t, 2)));\n\treturn 1;\n}\n\nint w_Texture_getPixelDimensions(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tint mipmap = w__optMipmap(L, t, 2);\n\tlua_pushnumber(L, t->getPixelWidth(mipmap));\n\tlua_pushnumber(L, t->getPixelHeight(mipmap));\n\treturn 2;\n}\n\nint w_Texture_getDPIScale(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tlua_pushnumber(L, t->getDPIScale());\n\treturn 1;\n}\n\nint w_Texture_isFormatLinear(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tluax_pushboolean(L, t->isFormatLinear());\n\treturn 1;\n}\n\nint w_Texture_isCompressed(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tluax_pushboolean(L, t->isCompressed());\n\treturn 1;\n}\n\nint w_Texture_getMSAA(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tlua_pushinteger(L, t->getMSAA());\n\treturn 1;\n}\n\nint w_Texture_setFilter(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tSamplerState s = t->getSamplerState();\n\n\tconst char *minstr = luaL_checkstring(L, 2);\n\tconst char *magstr = luaL_optstring(L, 3, minstr);\n\n\tif (!SamplerState::getConstant(minstr, s.minFilter))\n\t\treturn luax_enumerror(L, \"filter mode\", SamplerState::getConstants(s.minFilter), minstr);\n\tif (!SamplerState::getConstant(magstr, s.magFilter))\n\t\treturn luax_enumerror(L, \"filter mode\", SamplerState::getConstants(s.magFilter), magstr);\n\n\ts.maxAnisotropy = std::min(std::max(1, (int) luaL_optnumber(L, 4, 1.0)), LOVE_UINT8_MAX);\n\n\tluax_catchexcept(L, [&](){ t->setSamplerState(s); });\n\treturn 0;\n}\n\nint w_Texture_getFilter(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tconst SamplerState &s = t->getSamplerState();\n\n\tconst char *minstr = nullptr;\n\tconst char *magstr = nullptr;\n\n\tif (!SamplerState::getConstant(s.minFilter, minstr))\n\t\treturn luaL_error(L, \"Unknown filter mode.\");\n\tif (!SamplerState::getConstant(s.magFilter, magstr))\n\t\treturn luaL_error(L, \"Unknown filter mode.\");\n\n\tlua_pushstring(L, minstr);\n\tlua_pushstring(L, magstr);\n\tlua_pushnumber(L, s.maxAnisotropy);\n\treturn 3;\n}\n\nint w_Texture_setMipmapFilter(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tSamplerState s = t->getSamplerState();\n\n\t// Mipmapping is disabled if no argument is given.\n\tif (lua_isnoneornil(L, 2))\n\t\ts.mipmapFilter = SamplerState::MIPMAP_FILTER_NONE;\n\telse\n\t{\n\t\tconst char *mipmapstr = luaL_checkstring(L, 2);\n\t\tif (!SamplerState::getConstant(mipmapstr, s.mipmapFilter))\n\t\t\treturn luax_enumerror(L, \"filter mode\", SamplerState::getConstants(s.mipmapFilter), mipmapstr);\n\t}\n\n\ts.lodBias = -((float) luaL_optnumber(L, 3, 0.0));\n\n\tluax_catchexcept(L, [&](){ t->setSamplerState(s); });\n\treturn 0;\n}\n\nint w_Texture_getMipmapFilter(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tconst SamplerState &s = t->getSamplerState();\n\n\tconst char *mipmapstr;\n\tif (SamplerState::getConstant(s.mipmapFilter, mipmapstr))\n\t\tlua_pushstring(L, mipmapstr);\n\telse\n\t\tlua_pushnil(L); // only return a mipmap filter if mipmapping is enabled\n\n\tlua_pushnumber(L, -s.lodBias);\n\treturn 2;\n}\n\nint w_Texture_setWrap(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tSamplerState s = t->getSamplerState();\n\n\tconst char *sstr = luaL_checkstring(L, 2);\n\tconst char *tstr = luaL_optstring(L, 3, sstr);\n\tconst char *rstr = luaL_optstring(L, 4, sstr);\n\n\tif (!SamplerState::getConstant(sstr, s.wrapU))\n\t\treturn luax_enumerror(L, \"wrap mode\", SamplerState::getConstants(s.wrapU), sstr);\n\tif (!SamplerState::getConstant(tstr, s.wrapV))\n\t\treturn luax_enumerror(L, \"wrap mode\", SamplerState::getConstants(s.wrapV), tstr);\n\tif (!SamplerState::getConstant(rstr, s.wrapW))\n\t\treturn luax_enumerror(L, \"wrap mode\", SamplerState::getConstants(s.wrapW), rstr);\n\n\tluax_catchexcept(L, [&](){ t->setSamplerState(s); });\n\treturn 0;\n}\n\nint w_Texture_getWrap(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tconst SamplerState &s = t->getSamplerState();\n\n\tconst char *sstr = nullptr;\n\tconst char *tstr = nullptr;\n\tconst char *rstr = nullptr;\n\n\tif (!SamplerState::getConstant(s.wrapU, sstr))\n\t\treturn luaL_error(L, \"Unknown wrap mode.\");\n\tif (!SamplerState::getConstant(s.wrapV, tstr))\n\t\treturn luaL_error(L, \"Unknown wrap mode.\");\n\tif (!SamplerState::getConstant(s.wrapW, rstr))\n\t\treturn luaL_error(L, \"Unknown wrap mode.\");\n\n\tlua_pushstring(L, sstr);\n\tlua_pushstring(L, tstr);\n\tlua_pushstring(L, rstr);\n\treturn 3;\n}\n\nint w_Texture_getFormat(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tPixelFormat format = t->getPixelFormat();\n\tconst char *str;\n\tif (!getConstant(format, str))\n\t\treturn luaL_error(L, \"Unknown pixel format.\");\n\n\tlua_pushstring(L, str);\n\treturn 1;\n}\n\nint w_Texture_isCanvas(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tluax_pushboolean(L, t->isRenderTarget());\n\treturn 1;\n}\n\nint w_Texture_isComputeWritable(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tluax_pushboolean(L, t->isComputeWritable());\n\treturn 1;\n}\n\nint w_Texture_isReadable(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tluax_pushboolean(L, t->isReadable());\n\treturn 1;\n}\n\nint w_Texture_getViewFormats(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tconst std::vector<PixelFormat> &viewformats = t->getViewFormats();\n\n\tlua_createtable(L, (int) viewformats.size(), 0);\n\tfor (int i = 0; i < (int) viewformats.size(); i++)\n\t{\n\t\tconst char *str = nullptr;\n\t\tif (!getConstant(viewformats[i], str))\n\t\t\treturn luaL_error(L, \"Unknown pixel format.\");\n\t\tlua_pushstring(L, str);\n\t\tlua_rawseti(L, -2, i + 1);\n\t}\n\n\treturn 1;\n}\n\nint w_Texture_setDepthSampleMode(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tSamplerState s = t->getSamplerState();\n\n\ts.depthSampleMode.hasValue = false;\n\tif (!lua_isnoneornil(L, 2))\n\t{\n\t\tconst char *str = luaL_checkstring(L, 2);\n\n\t\ts.depthSampleMode.hasValue = true;\n\t\tif (!getConstant(str, s.depthSampleMode.value))\n\t\t\treturn luax_enumerror(L, \"compare mode\", getConstants(s.depthSampleMode.value), str);\n\t}\n\n\tluax_catchexcept(L, [&](){ t->setSamplerState(s); });\n\treturn 0;\n}\n\nint w_Texture_getDepthSampleMode(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tconst SamplerState &s = t->getSamplerState();\n\n\tif (s.depthSampleMode.hasValue)\n\t{\n\t\tconst char *str = nullptr;\n\t\tif (!getConstant(s.depthSampleMode.value, str))\n\t\t\treturn luaL_error(L, \"Unknown compare mode.\");\n\t\tlua_pushstring(L, str);\n\t}\n\telse\n\t\tlua_pushnil(L);\n\n\treturn 1;\n}\n\nint w_Texture_getMipmapMode(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tconst char *str;\n\tif (!Texture::getConstant(t->getMipmapsMode(), str))\n\t\treturn luax_enumerror(L, \"mipmap mode\", Texture::getConstants(Texture::MIPMAPS_MAX_ENUM), str);\n\tlua_pushstring(L, str);\n\treturn 1;\n}\n\nint w_Texture_generateMipmaps(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tluax_catchexcept(L, [&]() { t->generateMipmaps(); });\n\treturn 0;\n}\n\nint w_Texture_replacePixels(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\n\tlove::image::ImageData *id = nullptr;\n\tlove::image::CompressedImageData *cid = nullptr;\n\n\tif (luax_istype(L, 2, love::image::CompressedImageData::type))\n\t\tcid = luax_checktype<love::image::CompressedImageData>(L, 2);\n\telse\n\t\tid = luax_checktype<love::image::ImageData>(L, 2);\n\n\tint slice = 0;\n\tint dstmip = 0;\n\tint x = 0;\n\tint y = 0;\n\tbool reloadmipmaps = t->getMipmapsMode() == Texture::MIPMAPS_AUTO;\n\n\tif (t->getTextureType() != TEXTURE_2D)\n\t\tslice = (int) luaL_checkinteger(L, 3) - 1;\n\n\tdstmip = (int) luaL_optinteger(L, 4, 1) - 1;\n\n\tif (!lua_isnoneornil(L, 5))\n\t{\n\t\tx = (int) luaL_checkinteger(L, 5);\n\t\ty = (int) luaL_checkinteger(L, 6);\n\n\t\tif (reloadmipmaps)\n\t\t\treloadmipmaps = luax_optboolean(L, 7, reloadmipmaps);\n\t}\n\n\tif (cid != nullptr)\n\t{\n\t\tint srcmip = 0;\n\n\t\tif (cid->getMipmapCount() > 1)\n\t\t\tsrcmip = (int) luaL_checkinteger(L, 8) - 1;\n\n\t\tif (srcmip < 0 || srcmip >= cid->getMipmapCount())\n\t\t\treturn luaL_error(L, \"Invalid source mipmap level.\");\n\n\t\tluax_catchexcept(L, [&](){ t->replacePixels(cid->getSlice(0, srcmip), slice, dstmip, x, y, reloadmipmaps); });\n\t}\n\telse\n\t{\n\t\tluax_catchexcept(L, [&](){ t->replacePixels(id, slice, dstmip, x, y, reloadmipmaps); });\n\t}\n\treturn 0;\n}\n\nint w_Texture_newImageData(lua_State *L)\n{\n\tluax_markdeprecated(L, 1, \"Texture:newImageData\", API_METHOD, DEPRECATED_RENAMED, \"love.graphics.readbackTexture\");\n\n\tTexture *t = luax_checktexture(L, 1);\n\n\tint slice = 0;\n\tif (t->getTextureType() != TEXTURE_2D)\n\t\tslice = (int) luaL_checkinteger(L, 2) - 1;\n\n\tint mipmap = (int) luaL_optinteger(L, 3, 1) - 1;\n\n\tRect rect = {0, 0, t->getPixelWidth(mipmap), t->getPixelHeight(mipmap)};\n\tif (!lua_isnoneornil(L, 4))\n\t{\n\t\trect.x = (int) luaL_checkinteger(L, 4);\n\t\trect.y = (int) luaL_checkinteger(L, 5);\n\t\trect.w = (int) luaL_checkinteger(L, 6);\n\t\trect.h = (int) luaL_checkinteger(L, 7);\n\t}\n\n\tauto gfx = Module::getInstance<Graphics>(Module::M_GRAPHICS);\n\tif (gfx == nullptr)\n\t\treturn luaL_error(L, \"Cannot find Graphics module.\");\n\n\tlove::image::ImageData *img = nullptr;\n\tluax_catchexcept(L, [&](){ img = gfx->readbackTexture(t, slice, mipmap, rect, nullptr, 0, 0); });\n\n\tluax_pushtype(L, img);\n\timg->release();\n\treturn 1;\n}\n\nint w_Texture_renderTo(lua_State *L)\n{\n\tGraphics::RenderTarget rt(luax_checktexture(L, 1));\n\n\tint args = lua_gettop(L);\n\n\tint startidx = 2;\n\n\tif (rt.texture->getTextureType() != TEXTURE_2D)\n\t{\n\t\trt.slice = (int) luaL_checkinteger(L, 2) - 1;\n\t\tstartidx++;\n\t}\n\n\tluaL_checktype(L, startidx, LUA_TFUNCTION);\n\n\tauto graphics = Module::getInstance<Graphics>(Module::M_GRAPHICS);\n\n\tif (graphics)\n\t{\n\t\t// Save the current render targets so we can restore them when we're done.\n\t\tGraphics::RenderTargets oldtargets = graphics->getRenderTargets();\n\n\t\tfor (auto c : oldtargets.colors)\n\t\t\tc.texture->retain();\n\n\t\tif (oldtargets.depthStencil.texture != nullptr)\n\t\t\toldtargets.depthStencil.texture->retain();\n\n\t\tluax_catchexcept(L,\n\t\t\t[&]() { graphics->setRenderTarget(rt, 0); },\n\t\t\t[&](bool err)\n\t\t\t{\n\t\t\t\tif (err)\n\t\t\t\t{\n\t\t\t\t\tfor (auto c : oldtargets.colors)\n\t\t\t\t\t\tc.texture->release();\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\n\t\tint status = lua_pcall(L, args - startidx, 0, 0);\n\n\t\tgraphics->setRenderTargets(oldtargets);\n\n\t\tfor (auto c : oldtargets.colors)\n\t\t\tc.texture->release();\n\n\t\tif (oldtargets.depthStencil.texture != nullptr)\n\t\t\toldtargets.depthStencil.texture->release();\n\n\t\tif (status != 0)\n\t\t\treturn lua_error(L);\n\t}\n\n\treturn 0;\n}\n\nstatic int w_Texture_getDebugName(lua_State *L)\n{\n\tTexture *t = luax_checktexture(L, 1);\n\tconst std::string &debugName = t->getDebugName();\n\tif (debugName.empty())\n\t\tlua_pushnil(L);\n\telse\n\t\tluax_pushstring(L, debugName);\n\treturn 1;\n}\n\nconst luaL_Reg w_Texture_functions[] =\n{\n\t{ \"getTextureType\", w_Texture_getTextureType },\n\t{ \"getWidth\", w_Texture_getWidth },\n\t{ \"getHeight\", w_Texture_getHeight },\n\t{ \"getDimensions\", w_Texture_getDimensions },\n\t{ \"getDepth\", w_Texture_getDepth },\n\t{ \"getLayerCount\", w_Texture_getLayerCount },\n\t{ \"getMipmapCount\", w_Texture_getMipmapCount },\n\t{ \"getPixelWidth\", w_Texture_getPixelWidth },\n\t{ \"getPixelHeight\", w_Texture_getPixelHeight },\n\t{ \"getPixelDimensions\", w_Texture_getPixelDimensions },\n\t{ \"getDPIScale\", w_Texture_getDPIScale },\n\t{ \"isFormatLinear\", w_Texture_isFormatLinear },\n\t{ \"isCompressed\", w_Texture_isCompressed },\n\t{ \"getMSAA\", w_Texture_getMSAA },\n\t{ \"setFilter\", w_Texture_setFilter },\n\t{ \"getFilter\", w_Texture_getFilter },\n\t{ \"setMipmapFilter\", w_Texture_setMipmapFilter },\n\t{ \"getMipmapFilter\", w_Texture_getMipmapFilter },\n\t{ \"setWrap\", w_Texture_setWrap },\n\t{ \"getWrap\", w_Texture_getWrap },\n\t{ \"getFormat\", w_Texture_getFormat },\n\t{ \"isCanvas\", w_Texture_isCanvas },\n\t{ \"isComputeWritable\", w_Texture_isComputeWritable },\n\t{ \"isReadable\", w_Texture_isReadable },\n\t{ \"getViewFormats\", w_Texture_getViewFormats },\n\t{ \"getMipmapMode\", w_Texture_getMipmapMode },\n\t{ \"getDepthSampleMode\", w_Texture_getDepthSampleMode },\n\t{ \"setDepthSampleMode\", w_Texture_setDepthSampleMode },\n\t{ \"generateMipmaps\", w_Texture_generateMipmaps },\n\t{ \"replacePixels\", w_Texture_replacePixels },\n\t{ \"renderTo\", w_Texture_renderTo },\n\t{ \"getDebugName\", w_Texture_getDebugName },\n\n\t// Deprecated\n\t{ \"newImageData\", w_Texture_newImageData },\n\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_texture(lua_State *L)\n{\n\treturn luax_register_type(L, &Texture::type, w_Texture_functions, nullptr);\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/wrap_Texture.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_GRAPHICS_WRAP_TEXTURE_H\n#define LOVE_GRAPHICS_WRAP_TEXTURE_H\n\n#include \"Texture.h\"\n#include \"common/runtime.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nTexture *luax_checktexture(lua_State *L, int idx);\nextern \"C\" int luaopen_texture(lua_State *L);\n\nextern const luaL_Reg w_Texture_functions[];\n\n} // graphics\n} // love\n\n#endif // LOVE_GRAPHICS_WRAP_TEXTURE_H\n"
  },
  {
    "path": "src/modules/graphics/wrap_Video.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_Video.h\"\n\n// Shove the wrap_Video.lua code directly into a raw string literal.\nstatic const char video_lua[] =\n#include \"wrap_Video.lua\"\n;\n\nnamespace love\n{\nnamespace graphics\n{\n\nVideo *luax_checkvideo(lua_State *L, int idx)\n{\n\treturn luax_checktype<Video>(L, idx);\n}\n\nint w_Video_getStream(lua_State *L)\n{\n\tVideo *video = luax_checkvideo(L, 1);\n\tluax_pushtype(L, video->getStream());\n\treturn 1;\n}\n\nint w_Video_getSource(lua_State *L)\n{\n\tVideo *video = luax_checkvideo(L, 1);\n\tauto source = video->getSource();\n\tif (source)\n\t\tluax_pushtype(L, video->getSource());\n\telse\n\t\tlua_pushnil(L);\n\treturn 1;\n}\n\nint w_Video_setSource(lua_State *L)\n{\n\tVideo *video = luax_checkvideo(L, 1);\n\tif (lua_isnoneornil(L, 2))\n\t\tvideo->setSource(nullptr);\n\telse\n\t{\n\t\tauto source = luax_checktype<love::audio::Source>(L, 2);\n\t\tvideo->setSource(source);\n\t}\n\treturn 0;\n}\n\nint w_Video_getWidth(lua_State *L)\n{\n\tVideo *video = luax_checkvideo(L, 1);\n\tlua_pushnumber(L, video->getWidth());\n\treturn 1;\n}\n\nint w_Video_getHeight(lua_State *L)\n{\n\tVideo *video = luax_checkvideo(L, 1);\n\tlua_pushnumber(L, video->getHeight());\n\treturn 1;\n}\n\nint w_Video_getDimensions(lua_State *L)\n{\n\tVideo *video = luax_checkvideo(L, 1);\n\tlua_pushnumber(L, video->getWidth());\n\tlua_pushnumber(L, video->getHeight());\n\treturn 2;\n}\n\nint w_Video_getPixelWidth(lua_State *L)\n{\n\tVideo *video = luax_checkvideo(L, 1);\n\tlua_pushnumber(L, video->getPixelWidth());\n\treturn 1;\n}\n\nint w_Video_getPixelHeight(lua_State *L)\n{\n\tVideo *video = luax_checkvideo(L, 1);\n\tlua_pushnumber(L, video->getPixelHeight());\n\treturn 1;\n}\n\nint w_Video_getPixelDimensions(lua_State *L)\n{\n\tVideo *video = luax_checkvideo(L, 1);\n\tlua_pushnumber(L, video->getPixelWidth());\n\tlua_pushnumber(L, video->getPixelHeight());\n\treturn 2;\n}\n\nint w_Video_setFilter(lua_State *L)\n{\n\tVideo *video = luax_checkvideo(L, 1);\n\tSamplerState s = video->getSamplerState();\n\n\tconst char *minstr = luaL_checkstring(L, 2);\n\tconst char *magstr = luaL_optstring(L, 3, minstr);\n\n\tif (!SamplerState::getConstant(minstr, s.minFilter))\n\t\treturn luax_enumerror(L, \"filter mode\", SamplerState::getConstants(s.minFilter), minstr);\n\tif (!SamplerState::getConstant(magstr, s.magFilter))\n\t\treturn luax_enumerror(L, \"filter mode\", SamplerState::getConstants(s.magFilter), magstr);\n\n\ts.maxAnisotropy = std::min(std::max(1, (int) luaL_optnumber(L, 4, 1.0)), LOVE_UINT8_MAX);\n\n\tluax_catchexcept(L, [&](){ video->setSamplerState(s); });\n\treturn 0;\n}\n\nint w_Video_getFilter(lua_State *L)\n{\n\tVideo *video = luax_checkvideo(L, 1);\n\tconst SamplerState &s = video->getSamplerState();\n\n\tconst char *minstr = nullptr;\n\tconst char *magstr = nullptr;\n\n\tif (!SamplerState::getConstant(s.minFilter, minstr))\n\t\treturn luaL_error(L, \"Unknown filter mode.\");\n\tif (!SamplerState::getConstant(s.magFilter, magstr))\n\t\treturn luaL_error(L, \"Unknown filter mode.\");\n\n\tlua_pushstring(L, minstr);\n\tlua_pushstring(L, magstr);\n\tlua_pushnumber(L, s.maxAnisotropy);\n\treturn 3;\n}\n\nstatic const luaL_Reg functions[] =\n{\n\t{ \"getStream\", w_Video_getStream },\n\t{ \"getSource\", w_Video_getSource },\n\t{ \"_setSource\", w_Video_setSource },\n\t{ \"getWidth\", w_Video_getWidth },\n\t{ \"getHeight\", w_Video_getHeight },\n\t{ \"getDimensions\", w_Video_getDimensions },\n\t{ \"getPixelWidth\", w_Video_getPixelWidth },\n\t{ \"getPixelHeight\", w_Video_getPixelHeight },\n\t{ \"getPixelDimensions\", w_Video_getPixelDimensions },\n\t{ \"setFilter\", w_Video_setFilter },\n\t{ \"getFilter\", w_Video_getFilter },\n\t{ 0, 0 }\n};\n\nint luaopen_video(lua_State *L)\n{\n\tint ret = luax_register_type(L, &Video::type, functions, nullptr);\n\n\tluaL_loadbuffer(L, video_lua, sizeof(video_lua), \"=[love \\\"Video.lua\\\"]\");\n\tluax_gettypemetatable(L, Video::type);\n\tlua_call(L, 1, 0);\n\n\treturn ret;\n}\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/wrap_Video.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"Video.h\"\n#include \"common/runtime.h\"\n\nnamespace love\n{\nnamespace graphics\n{\n\nint luaopen_video(lua_State *L);\n\n} // graphics\n} // love\n"
  },
  {
    "path": "src/modules/graphics/wrap_Video.lua",
    "content": "R\"luastring\"--(\n-- DO NOT REMOVE THE ABOVE LINE. It is used to load this file as a C++ string.\n-- There is a matching delimiter at the bottom of the file.\n\n--[[\nCopyright (c) 2006-2024 LOVE Development Team\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\nclaim that you wrote the original software. If you use this software\nin a product, an acknowledgment in the product documentation would be\nappreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be\nmisrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n--]]\n\nlocal Video_mt = ...\nlocal Video = Video_mt.__index\n\nfunction Video:setSource(source)\n\tself:_setSource(source)\n\tself:getStream():setSync(source)\nend\n\nfunction Video:play()\n\treturn self:getStream():play()\nend\n\nfunction Video:pause()\n\treturn self:getStream():pause()\nend\n\nfunction Video:seek(offset)\n\treturn self:getStream():seek(offset)\nend\n\nfunction Video:rewind()\n\treturn self:getStream():rewind()\nend\n\nfunction Video:tell()\n\treturn self:getStream():tell()\nend\n\nfunction Video:isPlaying()\n\treturn self:getStream():isPlaying()\nend\n\n-- DO NOT REMOVE THE NEXT LINE. It is used to load this file as a C++ string.\n--)luastring\"--\"\n"
  },
  {
    "path": "src/modules/image/CompressedImageData.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"CompressedImageData.h\"\n#include \"common/Exception.h\"\n\nnamespace love\n{\nnamespace image\n{\n\nlove::Type CompressedImageData::type(\"CompressedImageData\", &Data::type);\n\nCompressedImageData::CompressedImageData(const std::list<FormatHandler *> &formats, Data *filedata)\n\t: format(PIXELFORMAT_UNKNOWN)\n{\n\tFormatHandler *parser = nullptr;\n\n\tfor (FormatHandler *handler : formats)\n\t{\n\t\tif (handler->canParseCompressed(filedata))\n\t\t{\n\t\t\tparser = handler;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (parser == nullptr)\n\t\tthrow love::Exception(\"Could not parse compressed data: Unknown format.\");\n\n\tmemory = parser->parseCompressed(filedata, dataImages, format);\n\n\tif (memory == nullptr)\n\t\tthrow love::Exception(\"Could not parse compressed data.\");\n\n\tif (format == PIXELFORMAT_UNKNOWN)\n\t\tthrow love::Exception(\"Could not parse compressed data: Unknown format.\");\n\n\tif (dataImages.size() == 0 || memory->getSize() == 0)\n\t\tthrow love::Exception(\"Could not parse compressed data: No valid data?\");\n\n\t// This throws away some information the decoder could give us, but we\n\t// can't really rely on it I think...\n\tformat = getLinearPixelFormat(format);\n}\n\nCompressedImageData::CompressedImageData(const CompressedImageData &c)\n\t: format(c.format)\n{\n\tmemory.set(c.memory->clone(), Acquire::NORETAIN);\n\n\tfor (const auto &i : c.dataImages)\n\t{\n\t\tauto slice = new CompressedSlice(i->getFormat(), i->getWidth(), i->getHeight(), memory, i->getOffset(), i->getSize());\n\t\tdataImages.push_back(slice);\n\t\tslice->release();\n\t}\n}\n\nCompressedImageData *CompressedImageData::clone() const\n{\n\treturn new CompressedImageData(*this);\n}\n\nCompressedImageData::~CompressedImageData()\n{\n}\n\nsize_t CompressedImageData::getSize() const\n{\n\treturn memory->getSize();\n}\n\nvoid *CompressedImageData::getData() const\n{\n\treturn memory->getData();\n}\n\nint CompressedImageData::getMipmapCount() const\n{\n\treturn (int) dataImages.size();\n}\n\nint CompressedImageData::getSliceCount(int /*mip*/) const\n{\n\treturn 1;\n}\n\nsize_t CompressedImageData::getSize(int miplevel) const\n{\n\tcheckSliceExists(0, miplevel);\n\n\treturn dataImages[miplevel]->getSize();\n}\n\nvoid *CompressedImageData::getData(int miplevel) const\n{\n\tcheckSliceExists(0, miplevel);\n\n\treturn dataImages[miplevel]->getData();\n}\n\nint CompressedImageData::getWidth(int miplevel) const\n{\n\tcheckSliceExists(0, miplevel);\n\n\treturn dataImages[miplevel]->getWidth();\n}\n\nint CompressedImageData::getHeight(int miplevel) const\n{\n\tcheckSliceExists(0, miplevel);\n\n\treturn dataImages[miplevel]->getHeight();\n}\n\nPixelFormat CompressedImageData::getFormat() const\n{\n\treturn format;\n}\n\nvoid CompressedImageData::setLinear(bool linear)\n{\n\tfor (auto &slice : dataImages)\n\t\tslice->setLinear(linear);\n}\n\nbool CompressedImageData::isLinear() const\n{\n\treturn dataImages.empty() ? false : dataImages[0]->isLinear();\n}\n\nCompressedSlice *CompressedImageData::getSlice(int slice, int miplevel) const\n{\n\tcheckSliceExists(slice, miplevel);\n\n\treturn dataImages[miplevel].get();\n}\n\nvoid CompressedImageData::checkSliceExists(int slice, int miplevel) const\n{\n\tif (slice != 0)\n\t\tthrow love::Exception(\"Slice index %d does not exists\", slice + 1);\n\n\tif (miplevel < 0 || miplevel >= (int) dataImages.size())\n\t\tthrow love::Exception(\"Mipmap level %d does not exist\", miplevel + 1);\n}\n\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/CompressedImageData.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/Data.h\"\n#include \"common/StringMap.h\"\n#include \"common/int.h\"\n#include \"common/pixelformat.h\"\n#include \"CompressedSlice.h\"\n#include \"FormatHandler.h\"\n\n// STL\n#include <vector>\n#include <list>\n\nnamespace love\n{\nnamespace image\n{\n\n/**\n * CompressedImageData represents image data which is designed to be uploaded to\n * the GPU and rendered in its compressed form, without being decompressed.\n * http://renderingpipeline.com/2012/07/texture-compression/\n **/\nclass CompressedImageData : public Data\n{\npublic:\n\n\tstatic love::Type type;\n\n\tCompressedImageData(const std::list<FormatHandler *> &formats, Data *filedata);\n\tCompressedImageData(const CompressedImageData &c);\n\tvirtual ~CompressedImageData();\n\n\t// Implements Data.\n\tCompressedImageData *clone() const override;\n\tvoid *getData() const override;\n\tsize_t getSize() const override;\n\n\t/**\n\t * Gets the number of mipmaps in this Compressed Image Data.\n\t * Includes the base image level.\n\t **/\n\tint getMipmapCount() const;\n\n\t/**\n\t * Gets the number of slices (array layers, cube faces, 3D layers, etc.)\n\t **/\n\tint getSliceCount(int mip = 0) const;\n\n\t/**\n\t * Gets the size in bytes of a sub-image at the specified mipmap level.\n\t **/\n\tsize_t getSize(int miplevel) const;\n\n\t/**\n\t * Gets the byte data of a sub-image at the specified mipmap level.\n\t **/\n\tvoid *getData(int miplevel) const;\n\n\t/**\n\t * Gets the width of a sub-image at the specified mipmap level.\n\t **/\n\tint getWidth(int miplevel = 0) const;\n\n\t/**\n\t * Gets the height of a sub-image at the specified mipmap level.\n\t **/\n\tint getHeight(int miplevel = 0) const;\n\n\t/**\n\t * Gets the format of the compressed data.\n\t **/\n\tPixelFormat getFormat() const;\n\n\tvoid setLinear(bool linear);\n\tbool isLinear() const;\n\n\tCompressedSlice *getSlice(int slice, int miplevel) const;\n\nprotected:\n\n\tPixelFormat format;\n\n\t// Single block of memory containing all of the sub-images.\n\tStrongRef<ByteData> memory;\n\n\t// Texture info for each mipmap level.\n\tstd::vector<StrongRef<CompressedSlice>> dataImages;\n\n\tvoid checkSliceExists(int slice, int miplevel) const;\n\n}; // CompressedImageData\n\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/CompressedSlice.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"CompressedSlice.h\"\n#include \"common/Exception.h\"\n\nnamespace love\n{\nnamespace image\n{\n\nCompressedSlice::CompressedSlice(PixelFormat format, int width, int height, ByteData *memory, size_t offset, size_t size)\n\t: ImageDataBase(format, width, height)\n\t, memory(memory)\n\t, offset(offset)\n\t, dataSize(size)\n{\n}\n\nCompressedSlice::CompressedSlice(const CompressedSlice &s)\n\t: ImageDataBase(s.getFormat(), s.getWidth(), s.getHeight())\n\t, memory(s.memory)\n\t, offset(s.offset)\n\t, dataSize(s.dataSize)\n{\n}\n\nCompressedSlice::~CompressedSlice()\n{\n}\n\nCompressedSlice *CompressedSlice::clone() const\n{\n\treturn new CompressedSlice(*this);\n}\n\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/CompressedSlice.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/int.h\"\n#include \"common/pixelformat.h\"\n#include \"data/ByteData.h\"\n#include \"ImageDataBase.h\"\n\nnamespace love\n{\nnamespace image\n{\n\nusing ByteData = love::data::ByteData;\n\n// Compressed image data can have multiple mipmap levels, each represented by a\n// sub-image.\nclass CompressedSlice : public ImageDataBase\n{\npublic:\n\n\tCompressedSlice(PixelFormat format, int width, int height, ByteData *memory, size_t offset, size_t size);\n\tCompressedSlice(const CompressedSlice &slice);\n\tvirtual ~CompressedSlice();\n\n\tCompressedSlice *clone() const override;\n\tvoid *getData() const override { return (uint8 *) memory->getData() + offset; }\n\tsize_t getSize() const override { return dataSize; }\n\tsize_t getOffset() const { return offset; }\n\nprivate:\n\n\tStrongRef<ByteData> memory;\n\tsize_t offset;\n\tsize_t dataSize;\n\n}; // CompressedSlice\n\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/FormatHandler.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"FormatHandler.h\"\n#include \"common/Exception.h\"\n\nnamespace love\n{\nnamespace image\n{\n\nFormatHandler::FormatHandler()\n{\n}\n\nFormatHandler::~FormatHandler()\n{\n}\n\nbool FormatHandler::canDecode(Data* /*data*/)\n{\n\treturn false;\n}\n\nbool FormatHandler::canEncode(PixelFormat /*rawFormat*/, EncodedFormat /*encodedFormat*/)\n{\n\treturn false;\n}\n\nFormatHandler::DecodedImage FormatHandler::decode(Data* /*data*/)\n{\n\tthrow love::Exception(\"Image decoding is not implemented for this format backend.\");\n}\n\nFormatHandler::EncodedImage FormatHandler::encode(const DecodedImage& /*img*/, EncodedFormat /*format*/)\n{\n\tthrow love::Exception(\"Image encoding is not implemented for this format backend.\");\n}\n\nbool FormatHandler::canParseCompressed(Data* /*data*/)\n{\n\treturn false;\n}\n\nStrongRef<ByteData> FormatHandler::parseCompressed(Data* /*filedata*/, std::vector<StrongRef<CompressedSlice>>& /*images*/, PixelFormat& /*format*/)\n{\n\tthrow love::Exception(\"Compressed image parsing is not implemented for this format backend.\");\n}\n\nvoid FormatHandler::freeRawPixels(unsigned char *mem)\n{\n\tdelete[] mem;\n}\n\nvoid FormatHandler::freeEncodedImage(unsigned char *mem)\n{\n\tdelete[] mem;\n}\n\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/FormatHandler.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/Object.h\"\n#include \"common/Data.h\"\n#include \"common/pixelformat.h\"\n#include \"CompressedSlice.h\"\n\n#include <vector>\n\nnamespace love\n{\nnamespace image\n{\n\n/**\n * Base class for all ImageData and CompressedImageData encoder/decoder library\n * interfaces. We inherit from love::Object to take advantage of ref coounting.\n **/\nclass FormatHandler : public love::Object\n{\npublic:\n\n\tenum EncodedFormat\n\t{\n\t\tENCODED_TGA,\n\t\tENCODED_PNG,\n\t\tENCODED_EXR,\n\t\tENCODED_MAX_ENUM\n\t};\n\n\t// Raw RGBA pixel data.\n\tstruct DecodedImage\n\t{\n\t\tPixelFormat format = PIXELFORMAT_RGBA8_UNORM;\n\t\tint width   = 0;\n\t\tint height  = 0;\n\t\tsize_t size = 0;\n\t\tunsigned char *data = nullptr;\n\t};\n\n\t// Pixel data encoded in a particular format.\n\tstruct EncodedImage\n\t{\n\t\tsize_t size = 0;\n\t\tunsigned char *data = nullptr;\n\t};\n\n\t/**\n\t * The default constructor is called when the Image module is initialized.\n\t **/\n\tFormatHandler();\n\tvirtual ~FormatHandler();\n\n\t/**\n\t * Whether this format handler can decode the given Data into raw pixels.\n\t **/\n\tvirtual bool canDecode(Data *data);\n\n\t/**\n\t * Whether this format handler can encode raw pixels to a particular format.\n\t **/\n\tvirtual bool canEncode(PixelFormat rawFormat, EncodedFormat encodedFormat);\n\n\t/**\n\t * Decodes an image from its encoded form into raw pixel data.\n\t **/\n\tvirtual DecodedImage decode(Data *data);\n\n\t/**\n\t * Encodes an image from raw pixel data into a particular format.\n\t **/\n\tvirtual EncodedImage encode(const DecodedImage &img, EncodedFormat format);\n\n\t/**\n\t * Whether this format handler can parse the given Data into a\n\t * CompressedImageData object.\n\t **/\n\tvirtual bool canParseCompressed(Data *data);\n\n\t/**\n\t * Parses compressed image data into a list of sub-images and returns a\n\t * single block of memory containing all the images.\n\t *\n\t * @param[in] filedata The data to parse.\n\t * @param[out] images The list of sub-images generated. Byte data is a\n\t *             pointer to the returned data.\n\t * @param[out] format The format of the Compressed Data.\n\t *\n\t * @return The single block of memory containing the parsed images.\n\t **/\n\tvirtual StrongRef<ByteData> parseCompressed(Data *filedata,\n\t        std::vector<StrongRef<CompressedSlice>> &images,\n\t        PixelFormat &format);\n\n\t/**\n\t * Frees raw pixel memory allocated by the format handler.\n\t **/\n\tvirtual void freeRawPixels(unsigned char *mem);\n\n\t/**\n\t * Frees encoded image memory allocated by the format handler.\n\t **/\n\tvirtual void freeEncodedImage(unsigned char *mem);\n\n}; // FormatHandler\n\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/Image.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"Image.h\"\n#include \"common/config.h\"\n\n#include \"magpie/PNGHandler.h\"\n#include \"magpie/STBHandler.h\"\n#include \"magpie/EXRHandler.h\"\n\n#include \"magpie/ddsHandler.h\"\n#include \"magpie/PVRHandler.h\"\n#include \"magpie/KTXHandler.h\"\n#include \"magpie/PKMHandler.h\"\n#include \"magpie/ASTCHandler.h\"\n\nnamespace love\n{\nnamespace image\n{\n\nlove::Type Image::type(\"image\", &Module::type);\n\nImage::Image()\n\t: Module(M_IMAGE, \"love.image.magpie\")\n{\n\tusing namespace magpie;\n\n\tfloat16Init(); // Makes sure half-float conversions can be used.\n\n\tformatHandlers = {\n\t\tnew PNGHandler,\n\t\tnew STBHandler,\n\t\tnew EXRHandler,\n\t\tnew DDSHandler,\n\t\tnew PVRHandler,\n\t\tnew KTXHandler,\n\t\tnew PKMHandler,\n\t\tnew ASTCHandler,\n\t};\n}\n\nImage::~Image()\n{\n\t// ImageData objects reference the FormatHandlers in our list, so we should\n\t// release them instead of deleting them completely here.\n\tfor (FormatHandler *handler : formatHandlers)\n\t\thandler->release();\n}\n\nlove::image::ImageData *Image::newImageData(Data *data)\n{\n\treturn new ImageData(data);\n}\n\nlove::image::ImageData *Image::newImageData(int width, int height, PixelFormat format)\n{\n\treturn new ImageData(width, height, format);\n}\n\nlove::image::ImageData *Image::newImageData(int width, int height, PixelFormat format, void *data, bool own)\n{\n\treturn new ImageData(width, height, format, data, own);\n}\n\nlove::image::CompressedImageData *Image::newCompressedData(Data *data)\n{\n\treturn new CompressedImageData(formatHandlers, data);\n}\n\nbool Image::isCompressed(Data *data)\n{\n\tfor (FormatHandler *handler : formatHandlers)\n\t{\n\t\tif (handler->canParseCompressed(data))\n\t\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nconst std::list<FormatHandler *> &Image::getFormatHandlers() const\n{\n\treturn formatHandlers;\n}\n\nImageData *Image::newPastedImageData(ImageData *src, int sx, int sy, int w, int h)\n{\n\tImageData *res = newImageData(w, h, src->getFormat());\n\ttry\n\t{\n\t\tres->paste(src, 0, 0, sx, sy, w, h);\n\t}\n\tcatch (love::Exception &)\n\t{\n\t\tres->release();\n\t\tthrow;\n\t}\n\treturn res;\n}\n\nstd::vector<StrongRef<ImageData>> Image::newCubeFaces(love::image::ImageData *src)\n{\n\t// The faces array is always ordered +x, -x, +y, -y, +z, -z.\n\tstd::vector<StrongRef<ImageData>> faces;\n\n\tint totalW = src->getWidth();\n\tint totalH = src->getHeight();\n\n\tif (totalW % 3 == 0 && totalH % 4 == 0 && totalW / 3 == totalH / 4)\n\t{\n\t\t//    +y\n\t\t// +z +x -z\n\t\t//    -y\n\t\t//    -x\n\n\t\tint w = totalW / 3;\n\t\tint h = totalH / 4;\n\n\t\tfaces.emplace_back(newPastedImageData(src, 1*w, 1*h, w, h), Acquire::NORETAIN);\n\t\tfaces.emplace_back(newPastedImageData(src, 1*w, 3*h, w, h), Acquire::NORETAIN);\n\t\tfaces.emplace_back(newPastedImageData(src, 1*w, 0*h, w, h), Acquire::NORETAIN);\n\t\tfaces.emplace_back(newPastedImageData(src, 1*w, 2*h, w, h), Acquire::NORETAIN);\n\t\tfaces.emplace_back(newPastedImageData(src, 0*w, 1*h, w, h), Acquire::NORETAIN);\n\t\tfaces.emplace_back(newPastedImageData(src, 2*w, 1*h, w, h), Acquire::NORETAIN);\n\t}\n\telse if (totalW % 4 == 0 && totalH % 3 == 0 && totalW / 4 == totalH / 3)\n\t{\n\t\t//    +y\n\t\t// -x +z +x -z\n\t\t//    -y\n\n\t\tint w = totalW / 4;\n\t\tint h = totalH / 3;\n\n\t\tfaces.emplace_back(newPastedImageData(src, 2*w, 1*h, w, h), Acquire::NORETAIN);\n\t\tfaces.emplace_back(newPastedImageData(src, 0*w, 1*h, w, h), Acquire::NORETAIN);\n\t\tfaces.emplace_back(newPastedImageData(src, 1*w, 0*h, w, h), Acquire::NORETAIN);\n\t\tfaces.emplace_back(newPastedImageData(src, 1*w, 2*h, w, h), Acquire::NORETAIN);\n\t\tfaces.emplace_back(newPastedImageData(src, 1*w, 1*h, w, h), Acquire::NORETAIN);\n\t\tfaces.emplace_back(newPastedImageData(src, 3*w, 1*h, w, h), Acquire::NORETAIN);\n\t}\n\telse if (totalH % 6 == 0 && totalW == totalH / 6)\n\t{\n\t\t// +x\n\t\t// -x\n\t\t// +y\n\t\t// -y\n\t\t// +z\n\t\t// -z\n\n\t\tint w = totalW;\n\t\tint h = totalH / 6;\n\n\t\tfor (int i = 0; i < 6; i++)\n\t\t\tfaces.emplace_back(newPastedImageData(src, 0, i * h, w, h), Acquire::NORETAIN);\n\t}\n\telse if (totalW % 6 == 0 && totalW / 6 == totalH)\n\t{\n\t\t// +x -x +y -y +z -z\n\n\t\tint w = totalW / 6;\n\t\tint h = totalH;\n\n\t\tfor (int i = 0; i < 6; i++)\n\t\t\tfaces.emplace_back(newPastedImageData(src, i * w, 0, w, h), Acquire::NORETAIN);\n\t}\n\telse\n\t\tthrow love::Exception(\"Unknown cubemap image dimensions!\");\n\n\treturn faces;\n}\n\nstd::vector<StrongRef<ImageData>> Image::newVolumeLayers(ImageData *src)\n{\n\tstd::vector<StrongRef<ImageData>> layers;\n\n\tint totalW = src->getWidth();\n\tint totalH = src->getHeight();\n\n\tif (totalW % totalH == 0)\n\t{\n\t\tfor (int i = 0; i < totalW / totalH; i++)\n\t\t\tlayers.emplace_back(newPastedImageData(src, i * totalH, 0, totalH, totalH), Acquire::NORETAIN);\n\t}\n\telse if (totalH % totalW == 0)\n\t{\n\t\tfor (int i = 0; i < totalH / totalW; i++)\n\t\t\tlayers.emplace_back(newPastedImageData(src, 0, i * totalW, totalW, totalW), Acquire::NORETAIN);\n\t}\n\telse\n\t\tthrow love::Exception(\"Cannot extract volume layers from source ImageData.\");\n\n\treturn layers;\n}\n\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/Image.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_IMAGE_IMAGE_H\n#define LOVE_IMAGE_IMAGE_H\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/Module.h\"\n#include \"filesystem/File.h\"\n#include \"ImageData.h\"\n#include \"CompressedImageData.h\"\n\n// C++\n#include <list>\n\nnamespace love\n{\nnamespace image\n{\n\n/**\n * This module is responsible for decoding files such as PNG, GIF, JPEG\n * into raw pixel data, as well as parsing compressed formats which are designed\n * to be uploaded to the GPU and rendered without being un-compressed.\n * This module does not know how to draw images on screen; only love.graphics\n * knows that.\n **/\nclass Image : public Module\n{\npublic:\n\n\tstatic love::Type type;\n\n\tImage();\n\tvirtual ~Image();\n\n\t/**\n\t * Creates new ImageData from FileData.\n\t * @param data The FileData containing the encoded image data.\n\t * @return The new ImageData.\n\t **/\n\tImageData *newImageData(Data *data);\n\n\t/**\n\t * Creates empty ImageData with the given size.\n\t * @param width The width of the ImageData.\n\t * @param height The height of the ImageData.\n\t * @return The new ImageData.\n\t **/\n\tImageData *newImageData(int width, int height, PixelFormat format = PIXELFORMAT_RGBA8_UNORM);\n\n\t/**\n\t * Creates empty ImageData with the given size.\n\t * @param width The width of the ImageData.\n\t * @param height The height of the ImageData.\n\t * @param data The data to load into the ImageData.\n\t * @param own Whether the new ImageData should take ownership of the data or\n\t *        copy it.\n\t * @return The new ImageData.\n\t **/\n\tImageData *newImageData(int width, int height, PixelFormat format, void *data, bool own = false);\n\n\t/**\n\t * Creates new CompressedImageData from FileData.\n\t * @param data The FileData containing the compressed image data.\n\t * @return The new CompressedImageData.\n\t **/\n\tCompressedImageData *newCompressedData(Data *data);\n\n\t/**\n\t * Determines whether a FileData is Compressed image data or not.\n\t * @param data The FileData to test.\n\t **/\n\tbool isCompressed(Data *data);\n\n\tstd::vector<StrongRef<ImageData>> newCubeFaces(ImageData *src);\n\tstd::vector<StrongRef<ImageData>> newVolumeLayers(ImageData *src);\n\n\tconst std::list<FormatHandler *> &getFormatHandlers() const;\n\nprivate:\n\n\tImageData *newPastedImageData(ImageData *src, int sx, int sy, int w, int h);\n\n\t// Image format handlers we can use for decoding and encoding ImageData.\n\tstd::list<FormatHandler *> formatHandlers;\n\n}; // Image\n\n} // image\n} // love\n\n#endif // LOVE_IMAGE_IMAGE_H\n"
  },
  {
    "path": "src/modules/image/ImageData.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"ImageData.h\"\n#include \"Image.h\"\n#include \"filesystem/Filesystem.h\"\n\n#include <algorithm> // min/max\n\nusing love::thread::Lock;\n\nnamespace love\n{\nnamespace image\n{\n\nlove::Type ImageData::type(\"ImageData\", &Data::type);\n\nImageData::ImageData(Data *data)\n\t: ImageDataBase(PIXELFORMAT_UNKNOWN, 0, 0)\n{\n\tdecode(data);\n}\n\nImageData::ImageData(int width, int height, PixelFormat format)\n\t: ImageDataBase(format, width, height)\n{\n\tif (!validPixelFormat(format))\n\t\tthrow love::Exception(\"ImageData does not support the %s pixel format.\", getPixelFormatName(format));\n\n\tcreate(width, height, format);\n\n\t// Set to black/transparency.\n\tmemset(data, 0, getSize());\n}\n\nImageData::ImageData(int width, int height, PixelFormat format, void *data, bool own)\n\t: ImageDataBase(format, width, height)\n{\n\tif (!validPixelFormat(format))\n\t\tthrow love::Exception(\"ImageData does not support the %s pixel format.\", getPixelFormatName(format));\n\n\tif (own)\n\t\tthis->data = (unsigned char *) data;\n\telse\n\t\tcreate(width, height, format, data);\n}\n\nImageData::ImageData(const ImageData &c)\n\t: ImageDataBase(c.format, c.width, c.height)\n{\n\tcreate(width, height, format, c.getData());\n}\n\nImageData::~ImageData()\n{\n\tif (decodeHandler.get())\n\t\tdecodeHandler->freeRawPixels(data);\n\telse\n\t\tdelete[] data;\n}\n\nlove::image::ImageData *ImageData::clone() const\n{\n\treturn new ImageData(*this);\n}\n\nvoid ImageData::create(int width, int height, PixelFormat format, void *data)\n{\n\tsize_t datasize = getPixelFormatSliceSize(format, width, height);\n\n\ttry\n\t{\n\t\tthis->data = new unsigned char[datasize];\n\t}\n\tcatch(std::bad_alloc &)\n\t{\n\t\tthrow love::Exception(\"Out of memory\");\n\t}\n\n\tif (data)\n\t\tmemcpy(this->data, data, datasize);\n\n\tdecodeHandler = nullptr;\n\tthis->format = format;\n\n\tpixelSetFunction = getPixelSetFunction(format);\n\tpixelGetFunction = getPixelGetFunction(format);\n}\n\nvoid ImageData::decode(Data *data)\n{\n\tFormatHandler *decoder = nullptr;\n\tFormatHandler::DecodedImage decodedimage;\n\n\tauto module = Module::getInstance<Image>(Module::M_IMAGE);\n\n\tif (module == nullptr)\n\t\tthrow love::Exception(\"love.image must be loaded in order to decode an ImageData.\");\n\n\tfor (FormatHandler *handler : module->getFormatHandlers())\n\t{\n\t\tif (handler->canDecode(data))\n\t\t{\n\t\t\tdecoder = handler;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (decoder)\n\t\tdecodedimage = decoder->decode(data);\n\n\tif (decodedimage.data == nullptr)\n\t{\n\t\tauto filedata = dynamic_cast<filesystem::FileData *>(data);\n\n\t\tif (filedata != nullptr)\n\t\t{\n\t\t\tconst std::string &name = filedata->getFilename();\n\t\t\tthrow love::Exception(\"Could not decode file '%s' to ImageData: unsupported file format\", name.c_str());\n\t\t}\n\t\telse\n\t\t\tthrow love::Exception(\"Could not decode data to ImageData: unsupported encoded format\");\n\t}\n\n\tif (decodedimage.size != getPixelFormatSliceSize(decodedimage.format, decodedimage.width, decodedimage.height))\n\t{\n\t\tdecoder->freeRawPixels(decodedimage.data);\n\t\tthrow love::Exception(\"Could not convert image!\");\n\t}\n\n\t// Clean up any old data.\n\tif (decodeHandler)\n\t\tdecodeHandler->freeRawPixels(this->data);\n\telse\n\t\tdelete[] this->data;\n\n\t// This throws away some information the decoder could give us, but we\n\t// can't really rely on it I think...\n\tdecodedimage.format = getLinearPixelFormat(decodedimage.format);\n\n\tthis->width  = decodedimage.width;\n\tthis->height = decodedimage.height;\n\tthis->data   = decodedimage.data;\n\tthis->format = decodedimage.format;\n\n\tdecodeHandler = decoder;\n\n\tpixelSetFunction = getPixelSetFunction(format);\n\tpixelGetFunction = getPixelGetFunction(format);\n}\n\nlove::filesystem::FileData *ImageData::encode(FormatHandler::EncodedFormat encodedFormat, const char *filename, bool writefile) const\n{\n\tFormatHandler *encoder = nullptr;\n\tFormatHandler::EncodedImage encodedimage;\n\tFormatHandler::DecodedImage rawimage;\n\n\trawimage.width = width;\n\trawimage.height = height;\n\trawimage.size = getSize();\n\trawimage.data = data;\n\trawimage.format = format;\n\n\tauto module = Module::getInstance<Image>(Module::M_IMAGE);\n\n\tif (module == nullptr)\n\t\tthrow love::Exception(\"love.image must be loaded in order to encode an ImageData.\");\n\n\tfor (FormatHandler *handler : module->getFormatHandlers())\n\t{\n\t\tif (handler->canEncode(format, encodedFormat))\n\t\t{\n\t\t\tencoder = handler;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (encoder != nullptr)\n\t\tencodedimage = encoder->encode(rawimage, encodedFormat);\n\n\tif (encoder == nullptr || encodedimage.data == nullptr)\n\t\tthrow love::Exception(\"No suitable image encoder for the %s pixel format.\", getPixelFormatName(format));\n\n\tlove::filesystem::FileData *filedata = nullptr;\n\n\ttry\n\t{\n\t\tfiledata = new love::filesystem::FileData(encodedimage.size, filename);\n\t}\n\tcatch (love::Exception &)\n\t{\n\t\tencoder->freeEncodedImage(encodedimage.data);\n\t\tthrow;\n\t}\n\n\tmemcpy(filedata->getData(), encodedimage.data, encodedimage.size);\n\tencoder->freeEncodedImage(encodedimage.data);\n\n\tif (writefile)\n\t{\n\t\tauto fs = Module::getInstance<filesystem::Filesystem>(Module::M_FILESYSTEM);\n\n\t\tif (fs == nullptr)\n\t\t{\n\t\t\tfiledata->release();\n\t\t\tthrow love::Exception(\"love.filesystem must be loaded in order to write an encoded ImageData to a file.\");\n\t\t}\n\n\t\ttry\n\t\t{\n\t\t\tfs->write(filename, filedata->getData(), filedata->getSize());\n\t\t}\n\t\tcatch (love::Exception &)\n\t\t{\n\t\t\tfiledata->release();\n\t\t\tthrow;\n\t\t}\n\t}\n\n\treturn filedata;\n}\n\nsize_t ImageData::getSize() const\n{\n\treturn size_t(getWidth() * getHeight()) * getPixelSize();\n}\n\nvoid *ImageData::getData() const\n{\n\treturn data;\n}\n\nbool ImageData::inside(int x, int y) const\n{\n\treturn x >= 0 && x < getWidth() && y >= 0 && y < getHeight();\n}\n\nstatic float clamp01(float x)\n{\n\treturn std::min(std::max(x, 0.0f), 1.0f);\n}\n\nstatic void setPixelR8(const Colorf &c, ImageData::Pixel *p)\n{\n\tp->rgba8[0] = (uint8) (clamp01(c.r) * 255.0f + 0.5f);\n}\n\nstatic void setPixelRG8(const Colorf &c, ImageData::Pixel *p)\n{\n\tp->rgba8[0] = (uint8) (clamp01(c.r) * 255.0f + 0.5f);\n\tp->rgba8[1] = (uint8) (clamp01(c.g) * 255.0f + 0.5f);\n}\n\nstatic void setPixelRGBA8(const Colorf &c, ImageData::Pixel *p)\n{\n\tp->rgba8[0] = (uint8) (clamp01(c.r) * 255.0f + 0.5f);\n\tp->rgba8[1] = (uint8) (clamp01(c.g) * 255.0f + 0.5f);\n\tp->rgba8[2] = (uint8) (clamp01(c.b) * 255.0f + 0.5f);\n\tp->rgba8[3] = (uint8) (clamp01(c.a) * 255.0f + 0.5f);\n}\n\nstatic void setPixelR16(const Colorf &c, ImageData::Pixel *p)\n{\n\tp->rgba16[0] = (uint16) (clamp01(c.r) * 65535.0f + 0.5f);\n}\n\nstatic void setPixelRG16(const Colorf &c, ImageData::Pixel *p)\n{\n\tp->rgba16[0] = (uint16) (clamp01(c.r) * 65535.0f + 0.5f);\n\tp->rgba16[1] = (uint16) (clamp01(c.g) * 65535.0f + 0.5f);\n}\n\nstatic void setPixelRGBA16(const Colorf &c, ImageData::Pixel *p)\n{\n\tp->rgba16[0] = (uint16) (clamp01(c.r) * 65535.0f + 0.5f);\n\tp->rgba16[1] = (uint16) (clamp01(c.b) * 65535.0f + 0.5f);\n\tp->rgba16[2] = (uint16) (clamp01(c.g) * 65535.0f + 0.5f);\n\tp->rgba16[3] = (uint16) (clamp01(c.a) * 65535.0f + 0.5f);\n}\n\nstatic void setPixelR16F(const Colorf &c, ImageData::Pixel *p)\n{\n\tp->rgba16f[0] = float32to16(c.r);\n}\n\nstatic void setPixelRG16F(const Colorf &c, ImageData::Pixel *p)\n{\n\tp->rgba16f[0] = float32to16(c.r);\n\tp->rgba16f[1] = float32to16(c.g);\n}\n\nstatic void setPixelRGBA16F(const Colorf &c, ImageData::Pixel *p)\n{\n\tp->rgba16f[0] = float32to16(c.r);\n\tp->rgba16f[1] = float32to16(c.g);\n\tp->rgba16f[2] = float32to16(c.b);\n\tp->rgba16f[3] = float32to16(c.a);\n}\n\nstatic void setPixelR32F(const Colorf &c, ImageData::Pixel *p)\n{\n\tp->rgba32f[0] = c.r;\n}\n\nstatic void setPixelRG32F(const Colorf &c, ImageData::Pixel *p)\n{\n\tp->rgba32f[0] = c.r;\n\tp->rgba32f[1] = c.g;\n}\n\nstatic void setPixelRGBA32F(const Colorf &c, ImageData::Pixel *p)\n{\n\tp->rgba32f[0] = c.r;\n\tp->rgba32f[1] = c.g;\n\tp->rgba32f[2] = c.b;\n\tp->rgba32f[3] = c.a;\n}\n\nstatic void setPixelRGBA4(const Colorf &c, ImageData::Pixel *p)\n{\n\t// LSB->MSB: [a, b, g, r]\n\tuint16 r = (uint16) (clamp01(c.r) * 0xF + 0.5);\n\tuint16 g = (uint16) (clamp01(c.g) * 0xF + 0.5);\n\tuint16 b = (uint16) (clamp01(c.b) * 0xF + 0.5);\n\tuint16 a = (uint16) (clamp01(c.a) * 0xF + 0.5);\n\tp->packed16 = (r << 12) | (g << 8) | (b << 4) | (a << 0);\n}\n\nstatic void setPixelRGB5A1(const Colorf &c, ImageData::Pixel *p)\n{\n\t// LSB->MSB: [a, b, g, r]\n\tuint16 r = (uint16) (clamp01(c.r) * 0x1F + 0.5);\n\tuint16 g = (uint16) (clamp01(c.g) * 0x1F + 0.5);\n\tuint16 b = (uint16) (clamp01(c.b) * 0x1F + 0.5);\n\tuint16 a = (uint16) (clamp01(c.a) * 0x1 + 0.5);\n\tp->packed16 = (r << 11) | (g << 6) | (b << 1) | (a << 0);\n}\n\nstatic void setPixelRGB565(const Colorf &c, ImageData::Pixel *p)\n{\n\t// LSB->MSB: [b, g, r]\n\tuint16 r = (uint16) (clamp01(c.r) * 0x1F + 0.5);\n\tuint16 g = (uint16) (clamp01(c.g) * 0x3F + 0.5);\n\tuint16 b = (uint16) (clamp01(c.b) * 0x1F + 0.5);\n\tp->packed16 = (r << 11) | (g << 5) | (b << 0);\n}\n\nstatic void setPixelRGB10A2(const Colorf &c, ImageData::Pixel *p)\n{\n\t// LSB->MSB: [r, g, b, a]\n\tuint32 r = (uint32) (clamp01(c.r) * 0x3FF + 0.5);\n\tuint32 g = (uint32) (clamp01(c.g) * 0x3FF + 0.5);\n\tuint32 b = (uint32) (clamp01(c.b) * 0x3FF + 0.5);\n\tuint32 a = (uint32) (clamp01(c.a) * 0x3 + 0.5);\n\tp->packed32 = (r << 0) | (g << 10) | (b << 20) | (a << 30);\n}\n\nstatic void setPixelRG11B10F(const Colorf &c, ImageData::Pixel *p)\n{\n\t// LSB->MSB: [r, g, b]\n\tfloat11 r = float32to11(c.r);\n\tfloat11 g = float32to11(c.g);\n\tfloat10 b = float32to10(c.b);\n\tp->packed32 = (r << 0) | (g << 11) | (b << 22);\n}\n\nstatic void getPixelR8(const ImageData::Pixel *p, Colorf &c)\n{\n\tc.r = p->rgba8[0] / 255.0f;\n\tc.g = 0.0f;\n\tc.b = 0.0f;\n\tc.a = 1.0f;\n}\n\nstatic void getPixelRG8(const ImageData::Pixel *p, Colorf &c)\n{\n\tc.r = p->rgba8[0] / 255.0f;\n\tc.g = p->rgba8[1] / 255.0f;\n\tc.b = 0.0f;\n\tc.a = 1.0f;\n}\n\nstatic void getPixelRGBA8(const ImageData::Pixel *p, Colorf &c)\n{\n\tc.r = p->rgba8[0] / 255.0f;\n\tc.g = p->rgba8[1] / 255.0f;\n\tc.b = p->rgba8[2] / 255.0f;\n\tc.a = p->rgba8[3] / 255.0f;\n}\n\nstatic void getPixelR16(const ImageData::Pixel *p, Colorf &c)\n{\n\tc.r = p->rgba16[0] / 65535.0f;\n\tc.g = 0.0f;\n\tc.b = 0.0f;\n\tc.a = 1.0f;\n}\n\nstatic void getPixelRG16(const ImageData::Pixel *p, Colorf &c)\n{\n\tc.r = p->rgba16[0] / 65535.0f;\n\tc.g = p->rgba16[1] / 65535.0f;\n\tc.b = 0.0f;\n\tc.a = 1.0f;\n}\n\nstatic void getPixelRGBA16(const ImageData::Pixel *p, Colorf &c)\n{\n\tc.r = p->rgba16[0] / 65535.0f;\n\tc.g = p->rgba16[1] / 65535.0f;\n\tc.b = p->rgba16[2] / 65535.0f;\n\tc.a = p->rgba16[3] / 65535.0f;\n}\n\nstatic void getPixelR16F(const ImageData::Pixel *p, Colorf &c)\n{\n\tc.r = float16to32(p->rgba16f[0]);\n\tc.g = 0.0f;\n\tc.b = 0.0f;\n\tc.a = 1.0f;\n}\n\nstatic void getPixelRG16F(const ImageData::Pixel *p, Colorf &c)\n{\n\tc.r = float16to32(p->rgba16f[0]);\n\tc.g = float16to32(p->rgba16f[1]);\n\tc.b = 0.0f;\n\tc.a = 1.0f;\n}\n\nstatic void getPixelRGBA16F(const ImageData::Pixel *p, Colorf &c)\n{\n\tc.r = float16to32(p->rgba16f[0]);\n\tc.g = float16to32(p->rgba16f[1]);\n\tc.b = float16to32(p->rgba16f[2]);\n\tc.a = float16to32(p->rgba16f[3]);\n}\n\nstatic void getPixelR32F(const ImageData::Pixel *p, Colorf &c)\n{\n\tc.r = p->rgba32f[0];\n\tc.g = 0.0f;\n\tc.b = 0.0f;\n\tc.a = 1.0f;\n}\n\nstatic void getPixelRG32F(const ImageData::Pixel *p, Colorf &c)\n{\n\tc.r = p->rgba32f[0];\n\tc.g = p->rgba32f[1];\n\tc.b = 0.0f;\n\tc.a = 1.0f;\n}\n\nstatic void getPixelRGBA32F(const ImageData::Pixel *p, Colorf &c)\n{\n\tc.r = p->rgba32f[0];\n\tc.g = p->rgba32f[1];\n\tc.b = p->rgba32f[2];\n\tc.a = p->rgba32f[3];\n}\n\nstatic void getPixelRGBA4(const ImageData::Pixel *p, Colorf &c)\n{\n\t// LSB->MSB: [a, b, g, r]\n\tc.r = ((p->packed16 >> 12) & 0xF) / (float)0xF;\n\tc.g = ((p->packed16 >>  8) & 0xF) / (float)0xF;\n\tc.b = ((p->packed16 >>  4) & 0xF) / (float)0xF;\n\tc.a = ((p->packed16 >>  0) & 0xF) / (float)0xF;\n}\n\nstatic void getPixelRGB5A1(const ImageData::Pixel *p, Colorf &c)\n{\n\t// LSB->MSB: [a, b, g, r]\n\tc.r = ((p->packed16 >> 11) & 0x1F) / (float)0x1F;\n\tc.g = ((p->packed16 >>  6) & 0x1F) / (float)0x1F;\n\tc.b = ((p->packed16 >>  1) & 0x1F) / (float)0x1F;\n\tc.a = ((p->packed16 >>  0) & 0x1)  / (float)0x1;\n}\n\nstatic void getPixelRGB565(const ImageData::Pixel *p, Colorf &c)\n{\n\t// LSB->MSB: [b, g, r]\n\tc.r = ((p->packed16 >> 11) & 0x1F) / (float)0x1F;\n\tc.g = ((p->packed16 >>  5) & 0x3F) / (float)0x3F;\n\tc.b = ((p->packed16 >>  0) & 0x1F) / (float)0x1F;\n\tc.a = 1.0f;\n}\n\nstatic void getPixelRGB10A2(const ImageData::Pixel *p, Colorf &c)\n{\n\t// LSB->MSB: [r, g, b, a]\n\tc.r = ((p->packed32 >>  0) & 0x3FF) / (float)0x3FF;\n\tc.g = ((p->packed32 >> 10) & 0x3FF) / (float)0x3FF;\n\tc.b = ((p->packed32 >> 20) & 0x3FF) / (float)0x3FF;\n\tc.a = ((p->packed32 >> 30) & 0x3)   / (float)0x3;\n}\n\nstatic void getPixelRG11B10F(const ImageData::Pixel *p, Colorf &c)\n{\n\t// LSB->MSB: [r, g, b]\n\tc.r = float11to32((float11) ((p->packed32 >>  0) & 0x7FF));\n\tc.g = float11to32((float11) ((p->packed32 >> 11) & 0x7FF));\n\tc.b = float10to32((float10) ((p->packed32 >> 22) & 0x3FF));\n\tc.a = 1.0f;\n}\n\nvoid ImageData::setPixel(int x, int y, const Colorf &c)\n{\n\tif (!inside(x, y))\n\t\tthrow love::Exception(\"Attempt to set out-of-range pixel!\");\n\n\tsize_t pixelsize = getPixelSize();\n\tPixel *p = (Pixel *) (data + ((y * width + x) * pixelsize));\n\n\tif (pixelSetFunction == nullptr)\n\t\tthrow love::Exception(\"ImageData:setPixel does not currently support the %s pixel format.\", getPixelFormatName(format));\n\n\tpixelSetFunction(c, p);\n}\n\nvoid ImageData::getPixel(int x, int y, Colorf &c) const\n{\n\tif (!inside(x, y))\n\t\tthrow love::Exception(\"Attempt to get out-of-range pixel!\");\n\n\tsize_t pixelsize = getPixelSize();\n\tconst Pixel *p = (const Pixel *) (data + ((y * width + x) * pixelsize));\n\n\tif (pixelGetFunction == nullptr)\n\t\tthrow love::Exception(\"ImageData:getPixel does not currently support the %s pixel format.\", getPixelFormatName(format));\n\n\tpixelGetFunction(p, c);\n}\n\nColorf ImageData::getPixel(int x, int y) const\n{\n\tColorf c;\n\tgetPixel(x, y, c);\n\treturn c;\n}\n\nunion Row\n{\n\tuint8 *u8;\n\tuint16 *u16;\n\tfloat16 *f16;\n\tfloat *f32;\n};\n\nstatic void pasteRGBA8toRGBA16(Row src, Row dst, int w)\n{\n\tfor (int i = 0; i < w * 4; i++)\n\t\tdst.u16[i] = (uint16) src.u8[i] << 8u;\n}\n\nstatic void pasteRGBA8toRGBA16F(Row src, Row dst, int w)\n{\n\tfor (int i = 0; i < w * 4; i++)\n\t\tdst.f16[i] = float32to16(src.u8[i] / 255.0f);\n}\n\nstatic void pasteRGBA8toRGBA32F(Row src, Row dst, int w)\n{\n\tfor (int i = 0; i < w * 4; i++)\n\t\tdst.f32[i] = src.u8[i] / 255.0f;\n}\n\nstatic void pasteRGBA16toRGBA8(Row src, Row dst, int w)\n{\n\tfor (int i = 0; i < w * 4; i++)\n\t\tdst.u8[i] = src.u16[i] >> 8u;\n}\n\nstatic void pasteRGBA16toRGBA16F(Row src, Row dst, int w)\n{\n\tfor (int i = 0; i < w * 4; i++)\n\t\tdst.f16[i] = float32to16(src.u16[i] / 65535.0f);\n}\n\nstatic void pasteRGBA16toRGBA32F(Row src, Row dst, int w)\n{\n\tfor (int i = 0; i < w * 4; i++)\n\t\tdst.f32[i] = src.u16[i] / 65535.0f;\n}\n\nstatic void pasteRGBA16FtoRGBA8(Row src, Row dst, int w)\n{\n\tfor (int i = 0; i < w * 4; i++)\n\t\tdst.u8[i] = (uint8) (clamp01(float16to32(src.f16[i])) * 255.0f + 0.5f);\n}\n\nstatic void pasteRGBA16FtoRGBA16(Row src, Row dst, int w)\n{\n\tfor (int i = 0; i < w * 4; i++)\n\t\tdst.u16[i] = (uint16) (clamp01(float16to32(src.f16[i])) * 65535.0f + 0.5f);\n}\n\nstatic void pasteRGBA16FtoRGBA32F(Row src, Row dst, int w)\n{\n\tfor (int i = 0; i < w * 4; i++)\n\t\tdst.f32[i] = float16to32(src.f16[i]);\n}\n\nstatic void pasteRGBA32FtoRGBA8(Row src, Row dst, int w)\n{\n\tfor (int i = 0; i < w * 4; i++)\n\t\tdst.u8[i] = (uint8) (clamp01(src.f32[i]) * 255.0f + 0.5f);\n}\n\nstatic void pasteRGBA32FtoRGBA16(Row src, Row dst, int w)\n{\n\tfor (int i = 0; i < w * 4; i++)\n\t\tdst.u16[i] = (uint16) (clamp01(src.f32[i]) * 65535.0f + 0.5f);\n}\n\nstatic void pasteRGBA32FtoRGBA16F(Row src, Row dst, int w)\n{\n\tfor (int i = 0; i < w * 4; i++)\n\t\tdst.f16[i] = float32to16(src.f32[i]);\n}\n\nvoid ImageData::paste(ImageData *src, int dx, int dy, int sx, int sy, int sw, int sh)\n{\n\tPixelFormat dstformat = getFormat();\n\tPixelFormat srcformat = src->getFormat();\n\n\tint srcW = src->getWidth();\n\tint srcH = src->getHeight();\n\tint dstW = getWidth();\n\tint dstH = getHeight();\n\n\tsize_t srcpixelsize = src->getPixelSize();\n\tsize_t dstpixelsize = getPixelSize();\n\n\t// Check bounds; if the data ends up completely out of bounds, get out early.\n\tif (sx >= srcW || sx + sw < 0 || sy >= srcH || sy + sh < 0\n\t\t\t|| dx >= dstW || dx + sw < 0 || dy >= dstH || dy + sh < 0)\n\t\treturn;\n\n\t// Normalize values to the inside of both images.\n\tif (dx < 0)\n\t{\n\t\tsw += dx;\n\t\tsx -= dx;\n\t\tdx = 0;\n\t}\n\tif (dy < 0)\n\t{\n\t\tsh += dy;\n\t\tsy -= dy;\n\t\tdy = 0;\n\t}\n\tif (sx < 0)\n\t{\n\t\tsw += sx;\n\t\tdx -= sx;\n\t\tsx = 0;\n\t}\n\tif (sy < 0)\n\t{\n\t\tsh += sy;\n\t\tdy -= sy;\n\t\tsy = 0;\n\t}\n\n\tif (dx + sw > dstW)\n\t\tsw = dstW - dx;\n\n\tif (dy + sh > dstH)\n\t\tsh = dstH - dy;\n\n\tif (sx + sw > srcW)\n\t\tsw = srcW - sx;\n\n\tif (sy + sh > srcH)\n\t\tsh = srcH - sy;\n\n\tuint8 *s = (uint8 *) src->getData();\n\tuint8 *d = (uint8 *) getData();\n\n\tauto getfunction = src->pixelGetFunction;\n\tauto setfunction = pixelSetFunction;\n\n\t// If the dimensions match up, copy the entire memory stream in one go\n\tif (srcformat == dstformat && (sw == dstW && dstW == srcW && sh == dstH && dstH == srcH))\n\t{\n\t\tmemcpy(d, s, srcpixelsize * sw * sh);\n\t}\n\telse if (sw > 0)\n\t{\n\t\t// Otherwise, copy each row individually.\n\t\tfor (int i = 0; i < sh; i++)\n\t\t{\n\t\t\tRow rowsrc = {s + (sx + (i + sy) * srcW) * srcpixelsize};\n\t\t\tRow rowdst = {d + (dx + (i + dy) * dstW) * dstpixelsize};\n\n\t\t\tif (srcformat == dstformat)\n\t\t\t\tmemcpy(rowdst.u8, rowsrc.u8, srcpixelsize * sw);\n\n\t\t\telse if (srcformat == PIXELFORMAT_RGBA8_UNORM && dstformat == PIXELFORMAT_RGBA16_UNORM)\n\t\t\t\tpasteRGBA8toRGBA16(rowsrc, rowdst, sw);\n\t\t\telse if (srcformat == PIXELFORMAT_RGBA8_UNORM && dstformat == PIXELFORMAT_RGBA16_FLOAT)\n\t\t\t\tpasteRGBA8toRGBA16F(rowsrc, rowdst, sw);\n\t\t\telse if (srcformat == PIXELFORMAT_RGBA8_UNORM && dstformat == PIXELFORMAT_RGBA32_FLOAT)\n\t\t\t\tpasteRGBA8toRGBA32F(rowsrc, rowdst, sw);\n\n\t\t\telse if (srcformat == PIXELFORMAT_RGBA16_UNORM && dstformat == PIXELFORMAT_RGBA8_UNORM)\n\t\t\t\tpasteRGBA16toRGBA8(rowsrc, rowdst, sw);\n\t\t\telse if (srcformat == PIXELFORMAT_RGBA16_UNORM && dstformat == PIXELFORMAT_RGBA16_FLOAT)\n\t\t\t\tpasteRGBA16toRGBA16F(rowsrc, rowdst, sw);\n\t\t\telse if (srcformat == PIXELFORMAT_RGBA16_UNORM && dstformat == PIXELFORMAT_RGBA32_FLOAT)\n\t\t\t\tpasteRGBA16toRGBA32F(rowsrc, rowdst, sw);\n\n\t\t\telse if (srcformat == PIXELFORMAT_RGBA16_FLOAT && dstformat == PIXELFORMAT_RGBA8_UNORM)\n\t\t\t\tpasteRGBA16FtoRGBA8(rowsrc, rowdst, sw);\n\t\t\telse if (srcformat == PIXELFORMAT_RGBA16_FLOAT && dstformat == PIXELFORMAT_RGBA16_UNORM)\n\t\t\t\tpasteRGBA16FtoRGBA16(rowsrc, rowdst, sw);\n\t\t\telse if (srcformat == PIXELFORMAT_RGBA16_FLOAT && dstformat == PIXELFORMAT_RGBA32_FLOAT)\n\t\t\t\tpasteRGBA16FtoRGBA32F(rowsrc, rowdst, sw);\n\n\t\t\telse if (srcformat == PIXELFORMAT_RGBA32_FLOAT && dstformat == PIXELFORMAT_RGBA8_UNORM)\n\t\t\t\tpasteRGBA32FtoRGBA8(rowsrc, rowdst, sw);\n\t\t\telse if (srcformat == PIXELFORMAT_RGBA32_FLOAT && dstformat == PIXELFORMAT_RGBA16_UNORM)\n\t\t\t\tpasteRGBA32FtoRGBA16(rowsrc, rowdst, sw);\n\t\t\telse if (srcformat == PIXELFORMAT_RGBA32_FLOAT && dstformat == PIXELFORMAT_RGBA16_FLOAT)\n\t\t\t\tpasteRGBA32FtoRGBA16F(rowsrc, rowdst, sw);\n\n\t\t\telse if (getfunction != nullptr && setfunction != nullptr)\n\t\t\t{\n\t\t\t\t// Slow path: convert src -> Colorf -> dst.\n\t\t\t\tColorf c;\n\t\t\t\tfor (int x = 0; x < sw; x++)\n\t\t\t\t{\n\t\t\t\t\tauto srcp = (const Pixel *) (rowsrc.u8 + x * srcpixelsize);\n\t\t\t\t\tauto dstp = (Pixel *) (rowdst.u8 + x * dstpixelsize);\n\t\t\t\t\tgetfunction(srcp, c);\n\t\t\t\t\tsetfunction(c, dstp);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (getfunction == nullptr)\n\t\t\t\tthrow love::Exception(\"ImageData:paste does not currently support converting from the %s pixel format.\", getPixelFormatName(srcformat));\n\t\t\telse\n\t\t\t\tthrow love::Exception(\"ImageData:paste does not currently support converting to the %s pixel format.\", getPixelFormatName(dstformat));\n\t\t}\n\t}\n}\n\nsize_t ImageData::getPixelSize() const\n{\n\treturn getPixelFormatBlockSize(format);\n}\n\nbool ImageData::validPixelFormat(PixelFormat format)\n{\n\treturn isPixelFormatColor(format) && !isPixelFormatCompressed(format);\n}\n\nImageData::PixelSetFunction ImageData::getPixelSetFunction(PixelFormat format)\n{\n\tswitch (format)\n\t{\n\t\tcase PIXELFORMAT_R8_UNORM: return setPixelR8;\n\t\tcase PIXELFORMAT_RG8_UNORM: return setPixelRG8;\n\t\tcase PIXELFORMAT_RGBA8_UNORM: return setPixelRGBA8;\n\t\tcase PIXELFORMAT_R16_UNORM: return setPixelR16;\n\t\tcase PIXELFORMAT_RG16_UNORM: return setPixelRG16;\n\t\tcase PIXELFORMAT_RGBA16_UNORM: return setPixelRGBA16;\n\t\tcase PIXELFORMAT_R16_FLOAT: return setPixelR16F;\n\t\tcase PIXELFORMAT_RG16_FLOAT: return setPixelRG16F;\n\t\tcase PIXELFORMAT_RGBA16_FLOAT: return setPixelRGBA16F;\n\t\tcase PIXELFORMAT_R32_FLOAT: return setPixelR32F;\n\t\tcase PIXELFORMAT_RG32_FLOAT: return setPixelRG32F;\n\t\tcase PIXELFORMAT_RGBA32_FLOAT: return setPixelRGBA32F;\n\t\tcase PIXELFORMAT_RGBA4_UNORM: return setPixelRGBA4;\n\t\tcase PIXELFORMAT_RGB5A1_UNORM: return setPixelRGB5A1;\n\t\tcase PIXELFORMAT_RGB565_UNORM: return setPixelRGB565;\n\t\tcase PIXELFORMAT_RGB10A2_UNORM: return setPixelRGB10A2;\n\t\tcase PIXELFORMAT_RG11B10_FLOAT: return setPixelRG11B10F;\n\t\tdefault: return nullptr;\n\t}\n}\n\nImageData::PixelGetFunction ImageData::getPixelGetFunction(PixelFormat format)\n{\n\tswitch (format)\n\t{\n\t\tcase PIXELFORMAT_R8_UNORM: return getPixelR8;\n\t\tcase PIXELFORMAT_RG8_UNORM: return getPixelRG8;\n\t\tcase PIXELFORMAT_RGBA8_UNORM: return getPixelRGBA8;\n\t\tcase PIXELFORMAT_R16_UNORM: return getPixelR16;\n\t\tcase PIXELFORMAT_RG16_UNORM: return getPixelRG16;\n\t\tcase PIXELFORMAT_RGBA16_UNORM: return getPixelRGBA16;\n\t\tcase PIXELFORMAT_R16_FLOAT: return getPixelR16F;\n\t\tcase PIXELFORMAT_RG16_FLOAT: return getPixelRG16F;\n\t\tcase PIXELFORMAT_RGBA16_FLOAT: return getPixelRGBA16F;\n\t\tcase PIXELFORMAT_R32_FLOAT: return getPixelR32F;\n\t\tcase PIXELFORMAT_RG32_FLOAT: return getPixelRG32F;\n\t\tcase PIXELFORMAT_RGBA32_FLOAT: return getPixelRGBA32F;\n\t\tcase PIXELFORMAT_RGBA4_UNORM: return getPixelRGBA4;\n\t\tcase PIXELFORMAT_RGB5A1_UNORM: return getPixelRGB5A1;\n\t\tcase PIXELFORMAT_RGB565_UNORM: return getPixelRGB565;\n\t\tcase PIXELFORMAT_RGB10A2_UNORM: return getPixelRGB10A2;\n\t\tcase PIXELFORMAT_RG11B10_FLOAT: return getPixelRG11B10F;\n\t\tdefault: return nullptr;\n\t}\n}\n\nbool ImageData::getConstant(const char *in, FormatHandler::EncodedFormat &out)\n{\n\treturn encodedFormats.find(in, out);\n}\n\nbool ImageData::getConstant(FormatHandler::EncodedFormat in, const char *&out)\n{\n\treturn encodedFormats.find(in, out);\n}\n\nstd::vector<std::string> ImageData::getConstants(FormatHandler::EncodedFormat)\n{\n\treturn encodedFormats.getNames();\n}\n\nStringMap<FormatHandler::EncodedFormat, FormatHandler::ENCODED_MAX_ENUM>::Entry ImageData::encodedFormatEntries[] =\n{\n\t{\"tga\", FormatHandler::ENCODED_TGA},\n\t{\"png\", FormatHandler::ENCODED_PNG},\n\t{\"exr\", FormatHandler::ENCODED_EXR},\n};\n\nStringMap<FormatHandler::EncodedFormat, FormatHandler::ENCODED_MAX_ENUM> ImageData::encodedFormats(ImageData::encodedFormatEntries, sizeof(ImageData::encodedFormatEntries));\n\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/ImageData.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/Data.h\"\n#include \"common/StringMap.h\"\n#include \"common/int.h\"\n#include \"common/pixelformat.h\"\n#include \"common/floattypes.h\"\n#include \"common/Color.h\"\n#include \"filesystem/FileData.h\"\n#include \"thread/threads.h\"\n#include \"ImageDataBase.h\"\n#include \"FormatHandler.h\"\n\nusing love::thread::Mutex;\n\nnamespace love\n{\nnamespace image\n{\n\n/**\n * Represents raw pixel data.\n **/\nclass ImageData : public ImageDataBase\n{\npublic:\n\n\tunion Pixel\n\t{\n\t\tuint8   rgba8[4];\n\t\tuint16  rgba16[4];\n\t\tfloat16 rgba16f[4];\n\t\tfloat   rgba32f[4];\n\t\tuint16  packed16;\n\t\tuint32  packed32;\n\t};\n\n\ttypedef void (*PixelSetFunction)(const Colorf &c, Pixel *p);\n\ttypedef void (*PixelGetFunction)(const Pixel *p, Colorf &c);\n\n\tstatic love::Type type;\n\n\tImageData(Data *data);\n\tImageData(int width, int height, PixelFormat format);\n\tImageData(int width, int height, PixelFormat format, void *data, bool own);\n\tImageData(const ImageData &c);\n\tvirtual ~ImageData();\n\n\t/**\n\t * Paste part of one ImageData onto another. The subregion defined by the top-left\n\t * corner (sx, sy) and the size (sw,sh) will be pasted to (dx,dy) in this ImageData.\n\t * @param dx The destination x-coordinate.\n\t * @param dy The destination y-coordinate.\n\t * @param sx The source x-coordinate.\n\t * @param sy The source y-coordinate.\n\t * @param sw The source width.\n\t * @param sh The source height.\n\t **/\n\tvoid paste(ImageData *src, int dx, int dy, int sx, int sy, int sw, int sh);\n\n\t/**\n\t * Checks whether a position is inside this ImageData. Useful for checking bounds.\n\t * @param x The position along the x-axis.\n\t * @param y The position along the y-axis.\n\t **/\n\tbool inside(int x, int y) const;\n\n\t/**\n\t * Sets the pixel at location (x,y).\n\t * @param x The location along the x-axis.\n\t * @param y The location along the y-axis.\n\t * @param p The color to use for the given location.\n\t **/\n\tvoid setPixel(int x, int y, const Colorf &p);\n\n\t/**\n\t * Gets the pixel at location (x,y).\n\t * @param x The location along the x-axis.\n\t * @param y The location along the y-axis.\n\t * @return The color for the given location.\n\t **/\n\tvoid getPixel(int x, int y, Colorf &c) const;\n\tColorf getPixel(int x, int y) const;\n\n\t/**\n\t * Encodes raw pixel data into a given format.\n\t * @param f The file to save the encoded image data to.\n\t * @param format The format of the encoded data.\n\t **/\n\tlove::filesystem::FileData *encode(FormatHandler::EncodedFormat format, const char *filename, bool writefile) const;\n\n\t// Implements ImageDataBase.\n\tImageData *clone() const override;\n\tvoid *getData() const override;\n\tsize_t getSize() const override;\n\n\tsize_t getPixelSize() const;\n\n\tPixelSetFunction getPixelSetFunction() const { return pixelSetFunction; }\n\tPixelGetFunction getPixelGetFunction() const { return pixelGetFunction; }\n\n\tstatic bool validPixelFormat(PixelFormat format);\n\n\tstatic PixelSetFunction getPixelSetFunction(PixelFormat format);\n\tstatic PixelGetFunction getPixelGetFunction(PixelFormat format);\n\n\tstatic bool getConstant(const char *in, FormatHandler::EncodedFormat &out);\n\tstatic bool getConstant(FormatHandler::EncodedFormat in, const char *&out);\n\tstatic std::vector<std::string> getConstants(FormatHandler::EncodedFormat);\n\nprivate:\n\n\t// Create imagedata. Initialize with data if not null.\n\tvoid create(int width, int height, PixelFormat format, void *data = nullptr);\n\n\t// Decode and load an encoded format.\n\tvoid decode(Data *data);\n\n\t// The actual data.\n\tunsigned char *data = nullptr;\n\n\t// The format handler that was used to decode the ImageData. We need to know\n\t// this so we can properly delete memory allocated by the decoder.\n\tStrongRef<FormatHandler> decodeHandler;\n\n\tPixelSetFunction pixelSetFunction;\n\tPixelGetFunction pixelGetFunction;\n\n\tstatic StringMap<FormatHandler::EncodedFormat, FormatHandler::ENCODED_MAX_ENUM>::Entry encodedFormatEntries[];\n\tstatic StringMap<FormatHandler::EncodedFormat, FormatHandler::ENCODED_MAX_ENUM> encodedFormats;\n\n}; // ImageData\n\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/ImageDataBase.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"ImageDataBase.h\"\n\nnamespace love\n{\nnamespace image\n{\n\nImageDataBase::ImageDataBase(PixelFormat format, int width, int height)\n\t: format(format)\n\t, width(width)\n\t, height(height)\n\t, linear(false)\n{\n}\n\nPixelFormat ImageDataBase::getFormat() const\n{\n\treturn format;\n}\n\nint ImageDataBase::getWidth() const\n{\n\treturn width;\n}\n\nint ImageDataBase::getHeight() const\n{\n\treturn height;\n}\n\nvoid ImageDataBase::setLinear(bool linear)\n{\n\tthis->linear = linear;\n}\n\nbool ImageDataBase::isLinear() const\n{\n\treturn linear;\n}\n\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/ImageDataBase.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/Data.h\"\n#include \"common/pixelformat.h\"\n\nnamespace love\n{\nnamespace image\n{\n\nclass ImageDataBase : public Data\n{\npublic:\n\n\tvirtual ~ImageDataBase() {}\n\n\tPixelFormat getFormat() const;\n\n\tint getWidth() const;\n\tint getHeight() const;\n\n\tvoid setLinear(bool linear);\n\tbool isLinear() const;\n\nprotected:\n\n\tImageDataBase(PixelFormat format, int width, int height);\n\n\tPixelFormat format;\n\tint width;\n\tint height;\n\n\tbool linear;\n\n}; // ImageDataBase\n\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/magpie/ASTCHandler.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"ASTCHandler.h\"\n#include \"common/int.h\"\n#include \"common/Exception.h\"\n\nnamespace love\n{\nnamespace image\n{\nnamespace magpie\n{\n\nnamespace\n{\n\nstatic const uint32 ASTC_IDENTIFIER = 0x5CA1AB13;\n\n#pragma pack(push, 1)\nstruct ASTCHeader\n{\n\tuint8 identifier[4];\n\tuint8 blockdimX;\n\tuint8 blockdimY;\n\tuint8 blockdimZ;\n\tuint8 sizeX[3];\n\tuint8 sizeY[3];\n\tuint8 sizeZ[3];\n};\n#pragma pack(pop)\n\nstatic PixelFormat convertFormat(uint32 blockX, uint32 blockY, uint32 blockZ)\n{\n\tif (blockZ > 1)\n\t\treturn PIXELFORMAT_UNKNOWN;\n\n\tif (blockX == 4 && blockY == 4)\n\t\treturn PIXELFORMAT_ASTC_4x4_UNORM;\n\telse if (blockX == 5 && blockY == 4)\n\t\treturn PIXELFORMAT_ASTC_5x4_UNORM;\n\telse if (blockX == 5 && blockY == 5)\n\t\treturn PIXELFORMAT_ASTC_5x5_UNORM;\n\telse if (blockX == 6 && blockY == 5)\n\t\treturn PIXELFORMAT_ASTC_6x5_UNORM;\n\telse if (blockX == 6 && blockY == 6)\n\t\treturn PIXELFORMAT_ASTC_6x6_UNORM;\n\telse if (blockX == 8 && blockY == 5)\n\t\treturn PIXELFORMAT_ASTC_8x5_UNORM;\n\telse if (blockX == 8 && blockY == 6)\n\t\treturn PIXELFORMAT_ASTC_8x6_UNORM;\n\telse if (blockX == 8 && blockY == 8)\n\t\treturn PIXELFORMAT_ASTC_8x8_UNORM;\n\telse if (blockX == 10 && blockY == 5)\n\t\treturn PIXELFORMAT_ASTC_10x5_UNORM;\n\telse if (blockX == 10 && blockY == 6)\n\t\treturn PIXELFORMAT_ASTC_10x6_UNORM;\n\telse if (blockX == 10 && blockY == 8)\n\t\treturn PIXELFORMAT_ASTC_10x8_UNORM;\n\telse if (blockX == 10 && blockY == 10)\n\t\treturn PIXELFORMAT_ASTC_10x10_UNORM;\n\telse if (blockX == 12 && blockY == 10)\n\t\treturn PIXELFORMAT_ASTC_12x10_UNORM;\n\telse if (blockX == 12 && blockY == 12)\n\t\treturn PIXELFORMAT_ASTC_12x12_UNORM;\n\n\treturn PIXELFORMAT_UNKNOWN;\n}\n\n} // Anonymous namespace.\n\nbool ASTCHandler::canParseCompressed(Data *data)\n{\n\tif (data->getSize() <= sizeof(ASTCHeader))\n\t\treturn false;\n\n\tconst ASTCHeader *header = (const ASTCHeader *) data->getData();\n\n\tuint32 identifier =  (uint32) header->identifier[0]\n\t                  + ((uint32) header->identifier[1] << 8)\n\t                  + ((uint32) header->identifier[2] << 16)\n\t                  + ((uint32) header->identifier[3] << 24);\n\n\tif (identifier != ASTC_IDENTIFIER)\n\t\treturn false;\n\n\treturn true;\n}\n\nStrongRef<ByteData> ASTCHandler::parseCompressed(Data *filedata, std::vector<StrongRef<CompressedSlice>> &images, PixelFormat &format)\n{\n\tif (!canParseCompressed(filedata))\n\t\tthrow love::Exception(\"Could not decode compressed data (not an .astc file?)\");\n\n\tASTCHeader header = *(const ASTCHeader *) filedata->getData();\n\n\tPixelFormat cformat = convertFormat(header.blockdimX, header.blockdimY, header.blockdimZ);\n\n\tif (cformat == PIXELFORMAT_UNKNOWN)\n\t\tthrow love::Exception(\"Could not parse .astc file: unsupported ASTC format %dx%dx%d.\", header.blockdimX, header.blockdimY, header.blockdimZ);\n\n\tuint32 sizeX = header.sizeX[0] + (header.sizeX[1] << 8) + (header.sizeX[2] << 16);\n\tuint32 sizeY = header.sizeY[0] + (header.sizeY[1] << 8) + (header.sizeY[2] << 16);\n\tuint32 sizeZ = header.sizeZ[0] + (header.sizeZ[1] << 8) + (header.sizeZ[2] << 16);\n\n\tuint32 blocksX = (sizeX + header.blockdimX - 1) / header.blockdimX;\n\tuint32 blocksY = (sizeY + header.blockdimY - 1) / header.blockdimY;\n\tuint32 blocksZ = (sizeZ + header.blockdimZ - 1) / header.blockdimZ;\n\n\tsize_t totalsize = (size_t) blocksX * blocksY * blocksZ * 16;\n\n\tif (totalsize + sizeof(header) > filedata->getSize())\n\t\tthrow love::Exception(\"Could not parse .astc file: file is too small.\");\n\n\tStrongRef<ByteData> memory(new ByteData(totalsize, false), Acquire::NORETAIN);\n\n\t// .astc files only store a single mipmap level.\n\tmemcpy(memory->getData(), (uint8 *) filedata->getData() + sizeof(ASTCHeader), totalsize);\n\n\timages.emplace_back(new CompressedSlice(cformat, sizeX, sizeY, memory, 0, totalsize), Acquire::NORETAIN);\n\n\tformat = cformat;\n\treturn memory;\n}\n\n} // magpie\n} // image\n} // love\n\n"
  },
  {
    "path": "src/modules/image/magpie/ASTCHandler.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"common/config.h\"\n#include \"image/FormatHandler.h\"\n\nnamespace love\n{\nnamespace image\n{\nnamespace magpie\n{\n\n/**\n * Handles simple .astc files (generated by ARM's astcenc tool) with compressed\n * ASTC data inside.\n **/\nclass ASTCHandler : public FormatHandler\n{\npublic:\n\n\tvirtual ~ASTCHandler() {}\n\n\t// Implements FormatHandler.\n\tbool canParseCompressed(Data *data) override;\n\n\tStrongRef<ByteData> parseCompressed(Data *filedata,\n\t        std::vector<StrongRef<CompressedSlice>> &images,\n\t        PixelFormat &format) override;\n\n}; // ASTCHandler\n\n} // magpie\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/magpie/EXRHandler.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"EXRHandler.h\"\n#include \"common/floattypes.h\"\n#include \"common/Exception.h\"\n\n// zlib (for tinyexr)\n#include <zlib.h>\n\n// tinyexr\n#define TINYEXR_IMPLEMENTATION\n#define TINYEXR_USE_MINIZ 0\n#include \"libraries/tinyexr/tinyexr.h\"\n\n// C\n#include <cstdlib>\n\nnamespace love\n{\nnamespace image\n{\nnamespace magpie\n{\n\nbool EXRHandler::canDecode(Data *data)\n{\n\tEXRVersion version;\n\treturn ParseEXRVersionFromMemory(&version, (const unsigned char *) data->getData(), data->getSize()) == TINYEXR_SUCCESS;\n}\n\nbool EXRHandler::canEncode(PixelFormat rawFormat, EncodedFormat encodedFormat)\n{\n\tif (encodedFormat != ENCODED_EXR)\n\t\treturn false;\n\n\tswitch (rawFormat)\n\t{\n\tcase PIXELFORMAT_R16_FLOAT:\n\tcase PIXELFORMAT_R32_FLOAT:\n\tcase PIXELFORMAT_R32_UINT:\n\tcase PIXELFORMAT_RG16_FLOAT:\n\tcase PIXELFORMAT_RG32_FLOAT:\n\tcase PIXELFORMAT_RG32_UINT:\n\tcase PIXELFORMAT_RGBA16_FLOAT:\n\tcase PIXELFORMAT_RGBA32_FLOAT:\n\tcase PIXELFORMAT_RGBA32_UINT:\n\t\treturn true;\n\tdefault:\n\t\treturn false;\n\t}\n\n\treturn false;\n}\n\ntemplate <typename T>\nstatic void getEXRChannels(const EXRHeader &header, const EXRImage &image, T *rgba[4])\n{\n\tfor (int i = 0; i < header.num_channels; i++)\n\t{\n\t\tswitch (*header.channels[i].name)\n\t\t{\n\t\tcase 'R':\n\t\t\trgba[0] = (T *) image.images[i];\n\t\t\tbreak;\n\t\tcase 'G':\n\t\t\trgba[1] = (T *) image.images[i];\n\t\t\tbreak;\n\t\tcase 'B':\n\t\t\trgba[2] = (T *) image.images[i];\n\t\t\tbreak;\n\t\tcase 'A':\n\t\t\trgba[3] = (T *) image.images[i];\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\ntemplate <typename T>\nstatic T *readEXRChannels(int width, int height, T *rgba[4], T one)\n{\n\tT *data = nullptr;\n\n\ttry\n\t{\n\t\tdata = new T[width * height * 4];\n\t}\n\tcatch (std::exception &)\n\t{\n\t\tthrow love::Exception(\"Out of memory.\");\n\t}\n\n\tfor (int y = 0; y < height; y++)\n\t{\n\t\tfor (int x = 0; x < width; x++)\n\t\t{\n\t\t\tsize_t offset = y * width + x;\n\n\t\t\tdata[offset * 4 + 0] = rgba[0] != nullptr ? rgba[0][offset] : 0;\n\t\t\tdata[offset * 4 + 1] = rgba[1] != nullptr ? rgba[1][offset] : 0;\n\t\t\tdata[offset * 4 + 2] = rgba[2] != nullptr ? rgba[2][offset] : 0;\n\t\t\tdata[offset * 4 + 3] = rgba[3] != nullptr ? rgba[3][offset] : one;\n\t\t}\n\t}\n\n\treturn data;\n}\n\ntemplate <typename T>\nstatic void writeEXRChannels(int width, int height, int components, const int *channelmapping, const T *pixels, T *rgba[4])\n{\n\tfor (int y = 0; y < height; y++)\n\t{\n\t\tfor (int x = 0; x < width; x++)\n\t\t{\n\t\t\tsize_t offset = y * width + x;\n\t\t\tfor (int c = 0; c < components; c++)\n\t\t\t\trgba[channelmapping[c]][offset] = pixels[offset * components + c];\n\t\t}\n\t}\n}\n\nFormatHandler::DecodedImage EXRHandler::decode(Data *data)\n{\n\tconst char *err = \"unknown error\";\n\tauto mem = (const unsigned char *) data->getData();\n\tsize_t memsize = data->getSize();\n\tDecodedImage img;\n\n\tEXRHeader exrHeader;\n\tInitEXRHeader(&exrHeader);\n\n\tEXRImage exrImage;\n\tInitEXRImage(&exrImage);\n\n\ttry\n\t{\n\t\tEXRVersion exrVersion;\n\t\tif (ParseEXRVersionFromMemory(&exrVersion, mem, memsize) != TINYEXR_SUCCESS)\n\t\t\tthrow love::Exception(\"Could not parse EXR image header.\");\n\n\t\tif (exrVersion.multipart || exrVersion.non_image || exrVersion.tiled)\n\t\t\tthrow love::Exception(\"Multi-part, tiled, and non-image EXR files are not supported.\");\n\n\t\tif (ParseEXRHeaderFromMemory(&exrHeader, &exrVersion, mem, memsize, &err) != TINYEXR_SUCCESS)\n\t\t\tthrow love::Exception(\"Could not parse EXR image header: %s\", err);\n\n\t\tif (LoadEXRImageFromMemory(&exrImage, &exrHeader, mem, memsize, &err) != TINYEXR_SUCCESS)\n\t\t{\n\t\t\tFreeEXRHeader(&exrHeader);\n\t\t\tthrow love::Exception(\"Could not decode EXR image: %s\", err);\n\t\t}\n\t}\n\tcatch (love::Exception &)\n\t{\n\t\tFreeEXRErrorMessage(err);\n\t\tthrow;\n\t}\n\n\tint pixelType = exrHeader.pixel_types[0];\n\n\tfor (int i = 1; i < exrHeader.num_channels; i++)\n\t{\n\t\tif (pixelType != exrHeader.pixel_types[i])\n\t\t{\n\t\t\tFreeEXRHeader(&exrHeader);\n\t\t\tFreeEXRImage(&exrImage);\n\t\t\tthrow love::Exception(\"Could not decode EXR image: all channels must have the same data type.\");\n\t\t}\n\t}\n\n\timg.width  = exrImage.width;\n\timg.height = exrImage.height;\n\n\tif (pixelType == TINYEXR_PIXELTYPE_UINT)\n\t{\n\t\timg.format = PIXELFORMAT_RGBA32_UINT;\n\n\t\tuint32 *rgba[4] = {nullptr};\n\t\tgetEXRChannels(exrHeader, exrImage, rgba);\n\n\t\ttry\n\t\t{\n\t\t\timg.data = (unsigned char *) readEXRChannels(img.width, img.height, rgba, 1u);\n\t\t}\n\t\tcatch (love::Exception &)\n\t\t{\n\t\t\tFreeEXRHeader(&exrHeader);\n\t\t\tFreeEXRImage(&exrImage);\n\t\t\tthrow;\n\t\t}\n\t}\n\telse if (pixelType == TINYEXR_PIXELTYPE_HALF)\n\t{\n\t\timg.format = PIXELFORMAT_RGBA16_FLOAT;\n\n\t\tfloat16 *rgba[4] = {nullptr};\n\t\tgetEXRChannels(exrHeader, exrImage, rgba);\n\n\t\ttry\n\t\t{\n\t\t\timg.data = (unsigned char *) readEXRChannels(img.width, img.height, rgba, float32to16(1.0f));\n\t\t}\n\t\tcatch (love::Exception &)\n\t\t{\n\t\t\tFreeEXRHeader(&exrHeader);\n\t\t\tFreeEXRImage(&exrImage);\n\t\t\tthrow;\n\t\t}\n\t}\n\telse if (pixelType == TINYEXR_PIXELTYPE_FLOAT)\n\t{\n\t\timg.format = PIXELFORMAT_RGBA32_FLOAT;\n\n\t\tfloat *rgba[4] = {nullptr};\n\t\tgetEXRChannels(exrHeader, exrImage, rgba);\n\n\t\ttry\n\t\t{\n\t\t\timg.data = (unsigned char *) readEXRChannels(img.width, img.height, rgba, 1.0f);\n\t\t}\n\t\tcatch (love::Exception &)\n\t\t{\n\t\t\tFreeEXRHeader(&exrHeader);\n\t\t\tFreeEXRImage(&exrImage);\n\t\t\tthrow;\n\t\t}\n\t}\n\telse\n\t{\n\t\tFreeEXRHeader(&exrHeader);\n\t\tFreeEXRImage(&exrImage);\n\t\tthrow love::Exception(\"Could not decode EXR image: unknown pixel format.\");\n\t}\n\n\timg.size = getPixelFormatSliceSize(img.format, img.width, img.height);\n\n\tFreeEXRHeader(&exrHeader);\n\tFreeEXRImage(&exrImage);\n\n\treturn img;\n}\n\nFormatHandler::EncodedImage EXRHandler::encode(const DecodedImage &img, EncodedFormat encodedFormat)\n{\n\tif (!canEncode(img.format, encodedFormat))\n\t{\n\t\tif (encodedFormat != ENCODED_EXR)\n\t\t\tthrow love::Exception(\"EXR encoder cannot encode to non-EXR format.\");\n\t\telse\n\t\t\tthrow love::Exception(\"EXR encoder cannot encode the given pixel format.\");\n\t}\n\n\tconst auto &formatinfo = getPixelFormatInfo(img.format);\n\n\tEXRHeader exrHeader;\n\tInitEXRHeader(&exrHeader);\n\n\texrHeader.num_channels = formatinfo.components;\n\n\t// TODO: this could be configurable.\n\texrHeader.compression_type = TINYEXR_COMPRESSIONTYPE_ZIP;\n\n\t// TinyEXR expects malloc here because FreeEXRHeader uses free().\n\texrHeader.channels = (EXRChannelInfo *) malloc(sizeof(EXRChannelInfo) * exrHeader.num_channels);\n\texrHeader.pixel_types = (int *) malloc(sizeof(int) * exrHeader.num_channels);\n\texrHeader.requested_pixel_types = (int *) malloc(sizeof(int) * exrHeader.num_channels);\n\n\tint pixeltype = -1;\n\tif (formatinfo.dataType == PIXELFORMATTYPE_UINT)\n\t{\n\t\tpixeltype = TINYEXR_PIXELTYPE_UINT;\n\t}\n\telse if (formatinfo.dataType == PIXELFORMATTYPE_SFLOAT)\n\t{\n\t\tif (formatinfo.blockSize / formatinfo.components == 2)\n\t\t\tpixeltype = TINYEXR_PIXELTYPE_HALF;\n\t\telse if (formatinfo.blockSize / formatinfo.components == 4)\n\t\t\tpixeltype = TINYEXR_PIXELTYPE_FLOAT;\n\t}\n\n\tif (pixeltype == -1)\n\t{\n\t\tFreeEXRHeader(&exrHeader);\n\t\tthrow love::Exception(\"Cannot convert the given pixel format to an EXR pixel type.\");\n\t}\n\n\t// EXR parsers tend to only handle (A)BGR order,\n\t// the spec says channels should be stored alphabetically.\n\tconst int channelmappings[4][4] = {\n\t\t{0},\n\t\t{1, 0},\n\t\t{2, 1, 0},\n\t\t{3, 2, 1, 0},\n\t};\n\n\tconst int *channelmapping = channelmappings[exrHeader.num_channels - 1];\n\n\tfor (int i = 0; i < exrHeader.num_channels; i++)\n\t{\n\t\texrHeader.channels[i] = EXRChannelInfo();\n\n\t\tconst char names[] = {'R', 'G', 'B', 'A'};\n\t\texrHeader.channels[i].name[0] = names[channelmapping[i]];\n\n\t\texrHeader.pixel_types[i] = pixeltype;\n\t\texrHeader.requested_pixel_types[i] = pixeltype;\n\t}\n\n\tEXRImage exrImage;\n\tInitEXRImage(&exrImage);\n\n\texrImage.width = img.width;\n\texrImage.height = img.height;\n\texrImage.num_channels = exrHeader.num_channels;\n\n\texrImage.images = (unsigned char **) malloc(sizeof(unsigned char *) * exrImage.num_channels);\n\n\tfor (int i = 0; i < exrImage.num_channels; i++)\n\t{\n\t\tsize_t componentsize = pixeltype == TINYEXR_PIXELTYPE_HALF ? 2 : 4;\n\n\t\texrImage.images[i] = (unsigned char *) malloc(img.width * img.height * componentsize);\n\n\t\tif (exrImage.images[i] == nullptr)\n\t\t{\n\t\t\tFreeEXRHeader(&exrHeader);\n\t\t\tFreeEXRImage(&exrImage);\n\t\t\tthrow love::Exception(\"Out of memory.\");\n\t\t}\n\t}\n\n\tif (pixeltype == TINYEXR_PIXELTYPE_UINT)\n\t{\n\t\twriteEXRChannels(img.width, img.height, formatinfo.components, channelmapping, (const uint32 *) img.data, (uint32 **) exrImage.images);\n\t}\n\telse if (pixeltype == TINYEXR_PIXELTYPE_HALF)\n\t{\n\t\twriteEXRChannels(img.width, img.height, formatinfo.components, channelmapping, (const float16 *) img.data, (float16 **) exrImage.images);\n\t}\n\telse if (pixeltype == TINYEXR_PIXELTYPE_FLOAT)\n\t{\n\t\twriteEXRChannels(img.width, img.height, formatinfo.components, channelmapping, (const float *) img.data, (float **) exrImage.images);\n\t}\n\n\tEncodedImage encimg;\n\n\tconst char *err = nullptr;\n\tencimg.size = SaveEXRImageToMemory(&exrImage, &exrHeader, &encimg.data, &err);\n\n\tFreeEXRHeader(&exrHeader);\n\tFreeEXRImage(&exrImage);\n\n\tstd::string errstring;\n\tif (err != nullptr)\n\t{\n\t\terrstring = err;\n\t\tFreeEXRErrorMessage(err);\n\t}\n\n\tif (encimg.size == 0)\n\t{\n\t\tif (!errstring.empty())\n\t\t\tthrow love::Exception(\"Could not encode EXR image: %s\", errstring.c_str());\n\t\telse\n\t\t\tthrow love::Exception(\"Could not encode EXR image\");\n\t}\n\n\treturn encimg;\n}\n\nvoid EXRHandler::freeRawPixels(unsigned char *mem)\n{\n\tdelete[] mem;\n}\n\nvoid EXRHandler::freeEncodedImage(unsigned char *mem)\n{\n\t// SaveEXRImageToMemory uses malloc.\n\tif (mem != nullptr)\n\t\t::free(mem);\n}\n\n} // magpie\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/magpie/EXRHandler.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"image/FormatHandler.h\"\n\nnamespace love\n{\nnamespace image\n{\nnamespace magpie\n{\n\n/**\n * Interface between ImageData and TinyEXR library, for decoding exr files.\n **/\nclass EXRHandler : public FormatHandler\n{\npublic:\n\n\tvirtual ~EXRHandler() {}\n\n\t// Implements FormatHandler.\n\n\tbool canDecode(Data *data) override;\n\tbool canEncode(PixelFormat rawFormat, EncodedFormat encodedFormat) override;\n\n\tDecodedImage decode(Data *data) override;\n\tEncodedImage encode(const DecodedImage &img, EncodedFormat format) override;\n\n\tvoid freeRawPixels(unsigned char *mem) override;\n\tvoid freeEncodedImage(unsigned char *mem) override;\n\n}; // EXRHandler\n\n} // magpie\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/magpie/KTXHandler.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"KTXHandler.h\"\n#include \"common/int.h\"\n#include \"common/Exception.h\"\n\n// C\n#include <string.h>\n\n// C++\n#include <algorithm>\n\nnamespace love\n{\nnamespace image\n{\nnamespace magpie\n{\n\nnamespace\n{\n\n#define KTX_IDENTIFIER_REF {0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A}\n#define KTX_ENDIAN_REF     (0x04030201)\n#define KTX_ENDIAN_REF_REV (0x01020304)\n#define KTX_HEADER_SIZE    (64)\n\nstruct KTXHeader\n{\n\tuint8  identifier[12];\n\tuint32 endianness;\n\tuint32 glType;\n\tuint32 glTypeSize;\n\tuint32 glFormat;\n\tuint32 glInternalFormat;\n\tuint32 glBaseInternalFormat;\n\tuint32 pixelWidth;\n\tuint32 pixelHeight;\n\tuint32 pixelDepth;\n\tuint32 numberOfArrayElements;\n\tuint32 numberOfFaces;\n\tuint32 numberOfMipmapLevels;\n\tuint32 bytesOfKeyValueData;\n};\n\nstatic_assert(sizeof(KTXHeader) == KTX_HEADER_SIZE, \"Real size of KTX header doesn't match struct size!\");\n\nenum KTXGLInternalFormat\n{\n\tKTX_GL_ETC1_RGB8_OES = 0x8D64,\n\n\t// ETC2 and EAC.\n\tKTX_GL_COMPRESSED_R11_EAC                        = 0x9270,\n\tKTX_GL_COMPRESSED_SIGNED_R11_EAC                 = 0x9271,\n\tKTX_GL_COMPRESSED_RG11_EAC                       = 0x9272,\n\tKTX_GL_COMPRESSED_SIGNED_RG11_EAC                = 0x9273,\n\tKTX_GL_COMPRESSED_RGB8_ETC2                      = 0x9274,\n\tKTX_GL_COMPRESSED_SRGB8_ETC2                     = 0x9275,\n\tKTX_GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2  = 0x9276,\n\tKTX_GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9277,\n\tKTX_GL_COMPRESSED_RGBA8_ETC2_EAC                 = 0x9278,\n\tKTX_GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC          = 0x9279,\n\n\t// PVRTC1.\n\tKTX_GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG  = 0x8C00,\n\tKTX_GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG  = 0x8C01,\n\tKTX_GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 0x8C02,\n\tKTX_GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 0x8C03,\n\n\t// DXT1, DXT3, and DXT5.\n\tKTX_GL_COMPRESSED_RGB_S3TC_DXT1_EXT        = 0x83F0,\n\tKTX_GL_COMPRESSED_RGBA_S3TC_DXT3_EXT       = 0x83F2,\n\tKTX_GL_COMPRESSED_RGBA_S3TC_DXT5_EXT       = 0x83F3,\n\tKTX_GL_COMPRESSED_SRGB_S3TC_DXT1_EXT       = 0x8C4C,\n\tKTX_GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT = 0x8C4E,\n\tKTX_GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = 0x8C4F,\n\n\t// BC4 and BC5.\n\tKTX_GL_COMPRESSED_RED_RGTC1        = 0x8DBB,\n\tKTX_GL_COMPRESSED_SIGNED_RED_RGTC1 = 0x8DBC,\n\tKTX_GL_COMPRESSED_RG_RGTC2         = 0x8DBD,\n\tKTX_GL_COMPRESSED_SIGNED_RG_RGTC2  = 0x8DBE,\n\n\t// BC6 and BC7.\n\tKTX_GL_COMPRESSED_RGBA_BPTC_UNORM         = 0x8E8C,\n\tKTX_GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM   = 0x8E8D,\n\tKTX_GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT   = 0x8E8E,\n\tKTX_GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT = 0x8E8F,\n\n\t// ASTC.\n\tKTX_GL_COMPRESSED_RGBA_ASTC_4x4_KHR           = 0x93B0,\n\tKTX_GL_COMPRESSED_RGBA_ASTC_5x4_KHR           = 0x93B1,\n\tKTX_GL_COMPRESSED_RGBA_ASTC_5x5_KHR           = 0x93B2,\n\tKTX_GL_COMPRESSED_RGBA_ASTC_6x5_KHR           = 0x93B3,\n\tKTX_GL_COMPRESSED_RGBA_ASTC_6x6_KHR           = 0x93B4,\n\tKTX_GL_COMPRESSED_RGBA_ASTC_8x5_KHR           = 0x93B5,\n\tKTX_GL_COMPRESSED_RGBA_ASTC_8x6_KHR           = 0x93B6,\n\tKTX_GL_COMPRESSED_RGBA_ASTC_8x8_KHR           = 0x93B7,\n\tKTX_GL_COMPRESSED_RGBA_ASTC_10x5_KHR          = 0x93B8,\n\tKTX_GL_COMPRESSED_RGBA_ASTC_10x6_KHR          = 0x93B9,\n\tKTX_GL_COMPRESSED_RGBA_ASTC_10x8_KHR          = 0x93BA,\n\tKTX_GL_COMPRESSED_RGBA_ASTC_10x10_KHR         = 0x93BB,\n\tKTX_GL_COMPRESSED_RGBA_ASTC_12x10_KHR         = 0x93BC,\n\tKTX_GL_COMPRESSED_RGBA_ASTC_12x12_KHR         = 0x93BD,\n\tKTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR   = 0x93D0,\n\tKTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR   = 0x93D1,\n\tKTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR   = 0x93D2,\n\tKTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR   = 0x93D3,\n\tKTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR   = 0x93D4,\n\tKTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR   = 0x93D5,\n\tKTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR   = 0x93D6,\n\tKTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR   = 0x93D7,\n\tKTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR  = 0x93D8,\n\tKTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR  = 0x93D9,\n\tKTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR  = 0x93DA,\n\tKTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR = 0x93DB,\n\tKTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR = 0x93DC,\n\tKTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR = 0x93DD\n};\n\nPixelFormat convertFormat(uint32 glformat)\n{\n\t// hnnngg ASTC...\n\n\tswitch (glformat)\n\t{\n\tcase KTX_GL_ETC1_RGB8_OES:\n\t\treturn PIXELFORMAT_ETC1_UNORM;\n\n\t// EAC and ETC2.\n\tcase KTX_GL_COMPRESSED_R11_EAC:\n\t\treturn PIXELFORMAT_EAC_R_UNORM;\n\tcase KTX_GL_COMPRESSED_SIGNED_R11_EAC:\n\t\treturn PIXELFORMAT_EAC_R_SNORM;\n\tcase KTX_GL_COMPRESSED_RG11_EAC:\n\t\treturn PIXELFORMAT_EAC_RG_UNORM;\n\tcase KTX_GL_COMPRESSED_SIGNED_RG11_EAC:\n\t\treturn PIXELFORMAT_EAC_RG_SNORM;\n\tcase KTX_GL_COMPRESSED_RGB8_ETC2:\n\t\treturn PIXELFORMAT_ETC2_RGB_UNORM;\n\tcase KTX_GL_COMPRESSED_SRGB8_ETC2:\n\t\treturn PIXELFORMAT_ETC2_RGB_sRGB;\n\tcase KTX_GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:\n\t\treturn PIXELFORMAT_ETC2_RGBA1_UNORM;\n\tcase KTX_GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:\n\t\treturn PIXELFORMAT_ETC2_RGBA1_sRGB;\n\tcase KTX_GL_COMPRESSED_RGBA8_ETC2_EAC:\n\t\treturn PIXELFORMAT_ETC2_RGBA_UNORM;\n\tcase KTX_GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:\n\t\treturn PIXELFORMAT_ETC2_RGBA_sRGB;\n\n\t// PVRTC.\n\tcase KTX_GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG:\n\t\treturn PIXELFORMAT_PVR1_RGB4_UNORM;\n\tcase KTX_GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG:\n\t\treturn PIXELFORMAT_PVR1_RGB2_UNORM;\n\tcase KTX_GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:\n\t\treturn PIXELFORMAT_PVR1_RGBA4_UNORM;\n\tcase KTX_GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG:\n\t\treturn PIXELFORMAT_PVR1_RGBA2_UNORM;\n\n\t// DXT.\n\tcase KTX_GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:\n\t\treturn PIXELFORMAT_DXT1_sRGB;\n\tcase KTX_GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\n\t\treturn PIXELFORMAT_DXT1_UNORM;\n\tcase KTX_GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:\n\t\treturn PIXELFORMAT_DXT3_sRGB;\n\tcase KTX_GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:\n\t\treturn PIXELFORMAT_DXT3_UNORM;\n\tcase KTX_GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:\n\t\treturn PIXELFORMAT_DXT5_sRGB;\n\tcase KTX_GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:\n\t\treturn PIXELFORMAT_DXT5_UNORM;\n\n\t// BC4 and BC5.\n\tcase KTX_GL_COMPRESSED_RED_RGTC1:\n\t\treturn PIXELFORMAT_BC4_UNORM;\n\tcase KTX_GL_COMPRESSED_SIGNED_RED_RGTC1:\n\t\treturn PIXELFORMAT_BC4_SNORM;\n\tcase KTX_GL_COMPRESSED_RG_RGTC2:\n\t\treturn PIXELFORMAT_BC5_UNORM;\n\tcase KTX_GL_COMPRESSED_SIGNED_RG_RGTC2:\n\t\treturn PIXELFORMAT_BC5_SNORM;\n\n\t// BC6 and BC7.\n\tcase KTX_GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM:\n\t\treturn PIXELFORMAT_BC7_sRGB;\n\tcase KTX_GL_COMPRESSED_RGBA_BPTC_UNORM:\n\t\treturn PIXELFORMAT_BC7_UNORM;\n\tcase KTX_GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT:\n\t\treturn PIXELFORMAT_BC6H_FLOAT;\n\tcase KTX_GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT:\n\t\treturn PIXELFORMAT_BC6H_UFLOAT;\n\n\t// ASTC.\n\tcase KTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:\n\t\treturn PIXELFORMAT_ASTC_4x4_sRGB;\n\tcase KTX_GL_COMPRESSED_RGBA_ASTC_4x4_KHR:\n\t\treturn PIXELFORMAT_ASTC_4x4_UNORM;\n\tcase KTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:\n\t\treturn PIXELFORMAT_ASTC_5x4_sRGB;\n\tcase KTX_GL_COMPRESSED_RGBA_ASTC_5x4_KHR:\n\t\treturn PIXELFORMAT_ASTC_5x4_UNORM;\n\tcase KTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:\n\t\treturn PIXELFORMAT_ASTC_5x5_sRGB;\n\tcase KTX_GL_COMPRESSED_RGBA_ASTC_5x5_KHR:\n\t\treturn PIXELFORMAT_ASTC_5x5_UNORM;\n\tcase KTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:\n\t\treturn PIXELFORMAT_ASTC_6x5_sRGB;\n\tcase KTX_GL_COMPRESSED_RGBA_ASTC_6x5_KHR:\n\t\treturn PIXELFORMAT_ASTC_6x5_UNORM;\n\tcase KTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:\n\t\treturn PIXELFORMAT_ASTC_6x6_sRGB;\n\tcase KTX_GL_COMPRESSED_RGBA_ASTC_6x6_KHR:\n\t\treturn PIXELFORMAT_ASTC_6x6_UNORM;\n\tcase KTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:\n\t\treturn PIXELFORMAT_ASTC_8x5_sRGB;\n\tcase KTX_GL_COMPRESSED_RGBA_ASTC_8x5_KHR:\n\t\treturn PIXELFORMAT_ASTC_8x5_UNORM;\n\tcase KTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:\n\t\treturn PIXELFORMAT_ASTC_8x6_sRGB;\n\tcase KTX_GL_COMPRESSED_RGBA_ASTC_8x6_KHR:\n\t\treturn PIXELFORMAT_ASTC_8x6_UNORM;\n\tcase KTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:\n\t\treturn PIXELFORMAT_ASTC_8x8_sRGB;\n\tcase KTX_GL_COMPRESSED_RGBA_ASTC_8x8_KHR:\n\t\treturn PIXELFORMAT_ASTC_8x8_UNORM;\n\tcase KTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:\n\t\treturn PIXELFORMAT_ASTC_10x5_sRGB;\n\tcase KTX_GL_COMPRESSED_RGBA_ASTC_10x5_KHR:\n\t\treturn PIXELFORMAT_ASTC_10x5_UNORM;\n\tcase KTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:\n\t\treturn PIXELFORMAT_ASTC_10x6_sRGB;\n\tcase KTX_GL_COMPRESSED_RGBA_ASTC_10x6_KHR:\n\t\treturn PIXELFORMAT_ASTC_10x6_UNORM;\n\tcase KTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:\n\t\treturn PIXELFORMAT_ASTC_10x8_sRGB;\n\tcase KTX_GL_COMPRESSED_RGBA_ASTC_10x8_KHR:\n\t\treturn PIXELFORMAT_ASTC_10x8_UNORM;\n\tcase KTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:\n\t\treturn PIXELFORMAT_ASTC_10x10_sRGB;\n\tcase KTX_GL_COMPRESSED_RGBA_ASTC_10x10_KHR:\n\t\treturn PIXELFORMAT_ASTC_10x10_UNORM;\n\tcase KTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:\n\t\treturn PIXELFORMAT_ASTC_12x10_sRGB;\n\tcase KTX_GL_COMPRESSED_RGBA_ASTC_12x10_KHR:\n\t\treturn PIXELFORMAT_ASTC_12x10_UNORM;\n\tcase KTX_GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:\n\t\treturn PIXELFORMAT_ASTC_12x12_sRGB;\n\tcase KTX_GL_COMPRESSED_RGBA_ASTC_12x12_KHR:\n\t\treturn PIXELFORMAT_ASTC_12x12_UNORM;\n\tdefault:\n\t\treturn PIXELFORMAT_UNKNOWN;\n\t}\n}\n\n} // Anonymous namespace.\n\nbool KTXHandler::canParseCompressed(Data *data)\n{\n\tif (data->getSize() < sizeof(KTXHeader))\n\t\treturn false;\n\n\tKTXHeader *header = (KTXHeader *) data->getData();\n\tuint8 ktxidentifier[12] = KTX_IDENTIFIER_REF;\n\n\tif (memcmp(header->identifier, ktxidentifier, 12) != 0)\n\t\treturn false;\n\n\tif (header->endianness != KTX_ENDIAN_REF && header->endianness != KTX_ENDIAN_REF_REV)\n\t\treturn false;\n\n\treturn true;\n}\n\nStrongRef<ByteData> KTXHandler::parseCompressed(Data *filedata, std::vector<StrongRef<CompressedSlice>> &images, PixelFormat &format)\n{\n\tif (!canParseCompressed(filedata))\n\t\tthrow love::Exception(\"Could not decode compressed data (not a KTX file?)\");\n\n\tKTXHeader header = *(KTXHeader *) filedata->getData();\n\n\tif (header.endianness == KTX_ENDIAN_REF_REV)\n\t{\n\t\tuint32 *headerArray = (uint32 *) &header.glType;\n\t\tfor (int i = 0; i < 12; i++)\n\t\t\theaderArray[i] = swapuint32(headerArray[i]);\n\t}\n\n\theader.numberOfMipmapLevels = std::max(header.numberOfMipmapLevels, 1u);\n\n\tPixelFormat cformat = convertFormat(header.glInternalFormat);\n\n\tif (cformat == PIXELFORMAT_UNKNOWN)\n\t\tthrow love::Exception(\"Unsupported image format in KTX file.\");\n\n\tif (header.numberOfArrayElements > 0)\n\t\tthrow love::Exception(\"Texture arrays in KTX files are not supported.\");\n\n\tif (header.pixelDepth > 1)\n\t\tthrow love::Exception(\"3D textures in KTX files are not supported.\");\n\n\tif (header.numberOfFaces > 1)\n\t\tthrow love::Exception(\"Cubemap textures in KTX files are not supported.\");\n\n\tsize_t fileoffset = sizeof(KTXHeader) + header.bytesOfKeyValueData;\n\tconst uint8 *filebytes = (uint8 *) filedata->getData();\n\tsize_t totalsize = 0;\n\n\t// Calculate the total size needed to hold the data in memory.\n\tfor (int i = 0; i < (int) header.numberOfMipmapLevels; i++)\n\t{\n\t\tif (fileoffset + sizeof(uint32) > filedata->getSize())\n\t\t\tthrow love::Exception(\"Could not parse KTX file: unexpected EOF.\");\n\n\t\tuint32 mipsize = *(uint32 *) (filebytes + fileoffset);\n\n\t\tif (header.endianness == KTX_ENDIAN_REF_REV)\n\t\t\tmipsize = swapuint32(mipsize);\n\n\t\tfileoffset += sizeof(uint32);\n\n\t\t// All mipsize fields are at a file offset that's a multiple of 4, so\n\t\t// there might be some padding after the actual data in this mip level.\n\t\tuint32 mipsizepadded = (mipsize + 3) & ~uint32(3);\n\n\t\ttotalsize += mipsizepadded;\n\t\tfileoffset += mipsizepadded;\n\t}\n\n\tStrongRef<ByteData> memory(new ByteData(totalsize, false), Acquire::NORETAIN);\n\n\t// Reset the file offset to the start of the file's image data.\n\tfileoffset = sizeof(KTXHeader) + header.bytesOfKeyValueData;\n\tsize_t dataoffset = 0;\n\n\t// Copy each mipmap level of the image from the file to our block of memory.\n\tfor (int i = 0; i < (int) header.numberOfMipmapLevels; i++)\n\t{\n\t\tuint32 mipsize = *(uint32 *) (filebytes + fileoffset);\n\n\t\tif (header.endianness == KTX_ENDIAN_REF_REV)\n\t\t\tmipsize = swapuint32(mipsize);\n\n\t\tfileoffset += sizeof(uint32);\n\n\t\tuint32 mipsizepadded = (mipsize + 3) & ~uint32(3);\n\n\t\tint width = (int) std::max(header.pixelWidth >> i, 1u);\n\t\tint height = (int) std::max(header.pixelHeight >> i, 1u);\n\n\t\tmemcpy((uint8 *) memory->getData() + dataoffset, filebytes + fileoffset, mipsize);\n\n\t\tauto slice = new CompressedSlice(cformat, width, height, memory, dataoffset, mipsize);\n\t\timages.push_back(slice);\n\t\tslice->release();\n\n\t\tfileoffset += mipsizepadded;\n\t\tdataoffset += mipsizepadded;\n\t}\n\n\tformat = cformat;\n\treturn memory;\n}\n\n} // magpie\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/magpie/KTXHandler.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"common/config.h\"\n#include \"image/FormatHandler.h\"\n\nnamespace love\n{\nnamespace image\n{\nnamespace magpie\n{\n\n/**\n * Handles KTX files with compressed image data inside.\n **/\nclass KTXHandler : public FormatHandler\n{\npublic:\n\n\tvirtual ~KTXHandler() {}\n\n\t// Implements FormatHandler.\n\tbool canParseCompressed(Data *data) override;\n\n\tStrongRef<ByteData> parseCompressed(Data *filedata,\n\t        std::vector<StrongRef<CompressedSlice>> &images,\n\t        PixelFormat &format) override;\n\n}; // KTXHandler\n\n} // magpie\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/magpie/PKMHandler.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"PKMHandler.h\"\n#include \"common/int.h\"\n#include \"common/Exception.h\"\n\nnamespace love\n{\nnamespace image\n{\nnamespace magpie\n{\n\nnamespace\n{\n\n// Big endian to host (and vice versa.)\ninline uint16 swap16big(uint16 x)\n{\n#ifdef LOVE_BIG_ENDIAN\n\treturn x;\n#else\n\treturn swapuint16(x);\n#endif\n}\n\nstatic const uint8 pkmIdentifier[] = {'P','K','M',' '};\n\nstruct PKMHeader\n{\n\tuint8 identifier[4];\n\tuint8 version[2];\n\tuint16 textureFormatBig;\n\tuint16 extendedWidthBig;\n\tuint16 extendedHeightBig;\n\tuint16 widthBig;\n\tuint16 heightBig;\n};\n\nenum PKMTextureFormat\n{\n\tETC1_RGB_NO_MIPMAPS = 0,\n\tETC2PACKAGE_RGB_NO_MIPMAPS,\n\tETC2PACKAGE_RGBA_NO_MIPMAPS_OLD,\n\tETC2PACKAGE_RGBA_NO_MIPMAPS,\n\tETC2PACKAGE_RGBA1_NO_MIPMAPS,\n\tETC2PACKAGE_R_NO_MIPMAPS,\n\tETC2PACKAGE_RG_NO_MIPMAPS,\n\tETC2PACKAGE_R_SIGNED_NO_MIPMAPS,\n\tETC2PACKAGE_RG_SIGNED_NO_MIPMAPS\n};\n\nstatic PixelFormat convertFormat(uint16 texformat)\n{\n\tswitch (texformat)\n\t{\n\tcase ETC1_RGB_NO_MIPMAPS:\n\t\treturn PIXELFORMAT_ETC1_UNORM;\n\tcase ETC2PACKAGE_RGB_NO_MIPMAPS:\n\t\treturn PIXELFORMAT_ETC2_RGB_UNORM;\n\tcase ETC2PACKAGE_RGBA_NO_MIPMAPS_OLD:\n\tcase ETC2PACKAGE_RGBA_NO_MIPMAPS:\n\t\treturn PIXELFORMAT_ETC2_RGBA_UNORM;\n\tcase ETC2PACKAGE_RGBA1_NO_MIPMAPS:\n\t\treturn PIXELFORMAT_ETC2_RGBA1_UNORM;\n\tcase ETC2PACKAGE_R_NO_MIPMAPS:\n\t\treturn PIXELFORMAT_EAC_R_UNORM;\n\tcase ETC2PACKAGE_RG_NO_MIPMAPS:\n\t\treturn PIXELFORMAT_EAC_RG_UNORM;\n\tcase ETC2PACKAGE_R_SIGNED_NO_MIPMAPS:\n\t\treturn PIXELFORMAT_EAC_R_SNORM;\n\tcase ETC2PACKAGE_RG_SIGNED_NO_MIPMAPS:\n\t\treturn PIXELFORMAT_EAC_RG_SNORM;\n\tdefault:\n\t\treturn PIXELFORMAT_UNKNOWN;\n\t}\n}\n\n} // Anonymous namespace.\n\nbool PKMHandler::canParseCompressed(Data *data)\n{\n\tif (data->getSize() <= sizeof(PKMHeader))\n\t\treturn false;\n\n\tconst PKMHeader *header = (const PKMHeader *) data->getData();\n\n\tif (memcmp(header->identifier, pkmIdentifier, 4) != 0)\n\t\treturn false;\n\n\t// At the time of this writing, only v1.0 and v2.0 exist.\n\tif ((header->version[0] != '2' && header->version[0] != '1') || header->version[1] != '0')\n\t\treturn false;\n\n\treturn true;\n}\n\nStrongRef<ByteData> PKMHandler::parseCompressed(Data *filedata, std::vector<StrongRef<CompressedSlice>> &images, PixelFormat &format)\n{\n\tif (!canParseCompressed(filedata))\n\t\tthrow love::Exception(\"Could not decode compressed data (not a PKM file?)\");\n\n\tPKMHeader header = *(const PKMHeader *) filedata->getData();\n\n\theader.textureFormatBig = swap16big(header.textureFormatBig);\n\theader.extendedWidthBig = swap16big(header.extendedWidthBig);\n\theader.extendedHeightBig = swap16big(header.extendedHeightBig);\n\theader.widthBig = swap16big(header.widthBig);\n\theader.heightBig = swap16big(header.heightBig);\n\n\tPixelFormat cformat = convertFormat(header.textureFormatBig);\n\n\tif (cformat == PIXELFORMAT_UNKNOWN)\n\t\tthrow love::Exception(\"Could not parse PKM file: unsupported texture format.\");\n\n\t// The rest of the file after the header is all texture data.\n\tsize_t totalsize = filedata->getSize() - sizeof(PKMHeader);\n\n\tStrongRef<ByteData> memory(new ByteData(totalsize, false), Acquire::NORETAIN);\n\n\t// PKM files only store a single mipmap level.\n\tmemcpy(memory->getData(), (uint8 *) filedata->getData() + sizeof(PKMHeader), totalsize);\n\n\t// TODO: verify whether glCompressedTexImage works properly with the unpadded\n\t// width and height values (extended == padded.)\n\tint width = header.widthBig;\n\tint height = header.heightBig;\n\n\timages.emplace_back(new CompressedSlice(cformat, width, height, memory, 0, totalsize), Acquire::NORETAIN);\n\n\tformat = cformat;\n\treturn memory;\n}\n\n} // magpie\n} // image\n} // love\n\n"
  },
  {
    "path": "src/modules/image/magpie/PKMHandler.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"common/config.h\"\n#include \"image/FormatHandler.h\"\n\nnamespace love\n{\nnamespace image\n{\nnamespace magpie\n{\n\n/**\n * Handles PKM files with compressed ETC data inside.\n **/\nclass PKMHandler : public FormatHandler\n{\npublic:\n\n\tvirtual ~PKMHandler() {}\n\n\t// Implements FormatHandler.\n\tbool canParseCompressed(Data *data) override;\n\n\tStrongRef<ByteData> parseCompressed(Data *filedata,\n\t        std::vector<StrongRef<CompressedSlice>> &images,\n\t        PixelFormat &format) override;\n\n}; // PKMHandler\n\n} // magpie\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/magpie/PNGHandler.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"PNGHandler.h\"\n\n// LOVE\n#include \"common/Exception.h\"\n#include \"common/math.h\"\n\n// LodePNG\n#include \"lodepng/lodepng.h\"\n\n// zlib\n#include <zlib.h>\n\n// C++\n#include <algorithm>\n\n// C\n#include <cstdlib>\n\nnamespace love\n{\nnamespace image\n{\nnamespace magpie\n{\n\n// Custom PNG decompression function for LodePNG, using zlib.\nstatic unsigned zlibDecompress(unsigned char **out, size_t *outsize, const unsigned char *in,\n                               size_t insize, const LodePNGDecompressSettings* /*settings*/)\n{\n\tint status = Z_OK;\n\n\tuLongf outdatasize = insize;\n\tsize_t sizemultiplier = 0;\n\tunsigned char *outdata = out != nullptr ? *out : nullptr;\n\n\twhile (true)\n\t{\n\t\t// Enough size to hold the decompressed data, hopefully.\n\t\toutdatasize = insize << (++sizemultiplier);\n\n\t\t// LodePNG uses malloc, realloc, and free.\n\t\t// Since version 2014-08-23, LodePNG passes in an existing pointer in\n\t\t// the 'out' argument that it expects to be realloc'd. Not doing so can\n\t\t// result in a memory leak.\n\t\tif (outdata != nullptr)\n\t\t\toutdata = (unsigned char *) realloc(outdata, outdatasize);\n\t\telse\n\t\t\toutdata = (unsigned char *) malloc(outdatasize);\n\n\t\tif (!outdata)\n\t\t\treturn 83; // \"Memory allocation failed\" error code for LodePNG.\n\n\t\t// Use zlib to decompress the PNG data.\n\t\tstatus = uncompress(outdata, &outdatasize, in, insize);\n\n\t\t// If the out buffer was big enough, break out of the loop.\n\t\tif (status != Z_BUF_ERROR)\n\t\t\tbreak;\n\n\t\t// Otherwise delete the out buffer and try again with a larger size...\n\t\tfree(outdata);\n\t\toutdata = nullptr;\n\t}\n\n\tif (status != Z_OK)\n\t{\n\t\tfree(outdata);\n\t\treturn 10000; // \"Unknown error code\" for LodePNG.\n\t}\n\n\tif (out != nullptr)\n\t\t*out = outdata;\n\n\tif (outsize != nullptr)\n\t\t*outsize = outdatasize;\n\n\treturn 0; // Success.\n}\n\n// Custom PNG compression function for LodePNG, using zlib.\nstatic unsigned zlibCompress(unsigned char **out, size_t *outsize, const unsigned char *in,\n                             size_t insize, const LodePNGCompressSettings* /*settings*/)\n{\n\t// Get the maximum compressed size of the data.\n\tuLongf outdatasize = compressBound(insize);\n\n\t// LodePNG uses malloc, realloc, and free.\n\tunsigned char *outdata = (unsigned char *) malloc(outdatasize);\n\n\tif (!outdata)\n\t\treturn 83; // \"Memory allocation failed\" error code for LodePNG.\n\n\t// Use zlib to compress the PNG data.\n\tint status = compress(outdata, &outdatasize, in, insize);\n\n\tif (status != Z_OK)\n\t{\n\t\tfree(outdata);\n\t\treturn 10000; // \"Unknown error code\" for LodePNG.\n\t}\n\n\tif (out != nullptr)\n\t\t*out = outdata;\n\n\tif (outsize != nullptr)\n\t\t*outsize = (size_t) outdatasize;\n\n\treturn 0; // Success.\n}\n\nbool PNGHandler::canDecode(Data *data)\n{\n\tunsigned int width = 0, height = 0;\n\tunsigned char *indata = (unsigned char *) data->getData();\n\tsize_t insize = data->getSize();\n\n\tlodepng::State state;\n\tunsigned status = lodepng_inspect(&width, &height, &state, indata, insize);\n\n\treturn status == 0 && width > 0 && height > 0;\n}\n\nbool PNGHandler::canEncode(PixelFormat rawFormat, EncodedFormat encodedFormat)\n{\n\treturn encodedFormat == ENCODED_PNG\n\t\t&& (rawFormat == PIXELFORMAT_RGBA8_UNORM || rawFormat == PIXELFORMAT_RGBA16_UNORM);\n}\n\nPNGHandler::DecodedImage PNGHandler::decode(Data *fdata)\n{\n\tunsigned int width = 0, height = 0;\n\tunsigned char *indata = (unsigned char *) fdata->getData();\n\tsize_t insize = fdata->getSize();\n\n\tDecodedImage img;\n\n\tlodepng::State state;\n\tunsigned status = lodepng_inspect(&width, &height, &state, indata, insize);\n\n\tif (status != 0)\n\t{\n\t\tconst char *err = lodepng_error_text(status);\n\t\tthrow love::Exception(\"Could not decode PNG image (%s)\", err);\n\t}\n\n\tstate.decoder.zlibsettings.custom_zlib = zlibDecompress;\n\tstate.info_raw.colortype = LCT_RGBA;\n\n\tif (state.info_png.color.bitdepth == 16)\n\t\tstate.info_raw.bitdepth = 16;\n\telse\n\t\tstate.info_raw.bitdepth = 8;\n\n\tstatus = lodepng_decode(&img.data, &width, &height, &state, indata, insize);\n\n\tif (status != 0)\n\t{\n\t\tconst char *err = lodepng_error_text(status);\n\t\tthrow love::Exception(\"Could not decode PNG image (%s)\", err);\n\t}\n\n\timg.width  = (int) width;\n\timg.height = (int) height;\n\timg.size   = width * height * (state.info_raw.bitdepth * 4 / 8);\n\timg.format = state.info_raw.bitdepth == 16 ? PIXELFORMAT_RGBA16_UNORM : PIXELFORMAT_RGBA8_UNORM;\n\n\t// LodePNG keeps raw 16 bit images stored as big-endian.\n#ifndef LOVE_BIG_ENDIAN\n\tif (state.info_raw.bitdepth == 16)\n\t{\n\t\tuint16 *pixeldata = (uint16 *) img.data;\n\t\tsize_t numpixelcomponents = img.size / sizeof(uint16);\n\n\t\tfor (size_t i = 0; i < numpixelcomponents; i++)\n\t\t\tpixeldata[i] = swapuint16(pixeldata[i]);\n\t}\n#endif\n\n\treturn img;\n}\n\nFormatHandler::EncodedImage PNGHandler::encode(const DecodedImage &img, EncodedFormat encodedFormat)\n{\n\tif (!canEncode(img.format, encodedFormat))\n\t\tthrow love::Exception(\"PNG encoder cannot encode to non-PNG format.\");\n\n\tEncodedImage encimg;\n\n\tlodepng::State state;\n\n\tstate.info_raw.colortype = LCT_RGBA;\n\tstate.info_raw.bitdepth = img.format == PIXELFORMAT_RGBA16_UNORM ? 16 : 8;\n\n\tstate.info_png.color.colortype = LCT_RGBA;\n\tstate.info_png.color.bitdepth = state.info_raw.bitdepth;\n\n\tstate.encoder.zlibsettings.custom_zlib = zlibCompress;\n\n\tconst uint8 *data = img.data;\n\tuint16 *swappeddata = nullptr;\n\n\t// LodePNG expects big-endian raw pixel data when encoding a 16 bit image.\n#ifndef LOVE_BIG_ENDIAN\n\tif (state.info_raw.bitdepth == 16)\n\t{\n\t\ttry\n\t\t{\n\t\t\tswappeddata = new uint16[img.size / sizeof(uint16)];\n\t\t}\n\t\tcatch (std::exception &)\n\t\t{\n\t\t\tthrow love::Exception(\"Out of memory.\");\n\t\t}\n\n\t\tconst uint16 *rawdata = (const uint16 *) img.data;\n\t\tsize_t numpixelcomponents = img.size / sizeof(uint16);\n\n\t\tfor (size_t i = 0; i < numpixelcomponents; i++)\n\t\t\tswappeddata[i] = swapuint16(rawdata[i]);\n\n\t\tdata = (const uint8 *) swappeddata;\n\t}\n#endif\n\n\tunsigned status = lodepng_encode(&encimg.data, &encimg.size,\n\t                                 data, img.width, img.height, &state);\n\n\tif (swappeddata != nullptr)\n\t\tdelete[] swappeddata;\n\n\tif (status != 0)\n\t{\n\t\tconst char *err = lodepng_error_text(status);\n\t\tthrow love::Exception(\"Could not encode PNG image (%s)\", err);\n\t}\n\n\treturn encimg;\n}\n\nvoid PNGHandler::freeRawPixels(unsigned char *mem)\n{\n\t// LodePNG uses malloc, realloc, and free.\n\tif (mem)\n\t\t::free(mem);\n}\n\nvoid PNGHandler::freeEncodedImage(unsigned char *mem)\n{\n\tif (mem)\n\t\t::free(mem);\n}\n\n} // magpie\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/magpie/PNGHandler.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"image/FormatHandler.h\"\n\nnamespace love\n{\nnamespace image\n{\nnamespace magpie\n{\n\n/**\n * Interface between ImageData and LodePNG.\n **/\nclass PNGHandler : public FormatHandler\n{\npublic:\n\n\tvirtual ~PNGHandler() {}\n\n\t// Implements FormatHandler.\n\n\tbool canDecode(Data *data) override;\n\tbool canEncode(PixelFormat rawFormat, EncodedFormat encodedFormat) override;\n\n\tDecodedImage decode(Data *data) override;\n\tEncodedImage encode(const DecodedImage &img, EncodedFormat format) override;\n\n\tvoid freeRawPixels(unsigned char *mem) override;\n\tvoid freeEncodedImage(unsigned char *mem) override;\n\n}; // PNGHandler\n\n} // magpie\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/magpie/PVRHandler.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"PVRHandler.h\"\n#include \"common/int.h\"\n#include \"common/Exception.h\"\n\n// C++\n#include <algorithm>\n\nnamespace love\n{\nnamespace image\n{\nnamespace magpie\n{\n\nnamespace\n{\n\n// 'P' 'V' 'R' 3\nstatic const uint32 PVRTEX3_IDENT = 0x03525650;\nstatic const uint32 PVRTEX3_IDENT_REV = 0x50565203;\n\n#pragma pack(push, 4)\nstruct PVRTexHeaderV3\n{\n\tuint32 version;      /// Version of the file header, used to identify it.\n\tuint32 flags;        /// Various format flags.\n\tuint64 pixelFormat;  /// The pixel format, 8cc value storing the 4 channel identifiers and their respective sizes.\n\tuint32 colorSpace;   /// The Color Space of the texture, currently either linear RGB or sRGB.\n\tuint32 channelType;  /// Variable type that the channel is stored in. Supports signed/unsigned int/short/byte or float for now.\n\tuint32 height;       /// Height of the texture.\n\tuint32 width;        /// Width of the texture.\n\tuint32 depth;        /// Depth of the texture. (Z-slices)\n\tuint32 numSurfaces;  /// Number of members in a Texture Array.\n\tuint32 numFaces;     /// Number of faces in a Cube Map. Maybe be a value other than 6.\n\tuint32 numMipmaps;   /// Number of MIP Maps in the texture - NB: Includes top level.\n\tuint32 metaDataSize; /// Size of the accompanying meta data.\n};\n#pragma pack(pop)\n\nenum PVRV3PixelFormat\n{\n\tePVRTPF_PVRTCI_2bpp_RGB = 0,\n\tePVRTPF_PVRTCI_2bpp_RGBA,\n\tePVRTPF_PVRTCI_4bpp_RGB,\n\tePVRTPF_PVRTCI_4bpp_RGBA,\n\tePVRTPF_PVRTCII_2bpp = 4,\n\tePVRTPF_PVRTCII_4bpp,\n\tePVRTPF_ETC1 = 6,\n\tePVRTPF_DXT1 = 7,\n\tePVRTPF_DXT2,\n\tePVRTPF_DXT3,\n\tePVRTPF_DXT4,\n\tePVRTPF_DXT5,\n\tePVRTPF_BC4,\n\tePVRTPF_BC5,\n\tePVRTPF_BC6,\n\tePVRTPF_BC7,\n\tePVRTPF_ETC2_RGB = 22,\n\tePVRTPF_ETC2_RGBA,\n\tePVRTPF_ETC2_RGBA1,\n\tePVRTPF_EAC_R = 25,\n\tePVRTPF_EAC_RG,\n\tePVRTPF_ASTC_4x4 = 27,\n\tePVRTPF_ASTC_5x4,\n\tePVRTPF_ASTC_5x5,\n\tePVRTPF_ASTC_6x5,\n\tePVRTPF_ASTC_6x6,\n\tePVRTPF_ASTC_8x5,\n\tePVRTPF_ASTC_8x6,\n\tePVRTPF_ASTC_8x8,\n\tePVRTPF_ASTC_10x5,\n\tePVRTPF_ASTC_10x6,\n\tePVRTPF_ASTC_10x8,\n\tePVRTPF_ASTC_10x10,\n\tePVRTPF_ASTC_12x10,\n\tePVRTPF_ASTC_12x12,\n\tePVRTPF_UNKNOWN_FORMAT = 0x7F\n};\n\nenum PVRV3ChannelType\n{\n\tePVRTCT_UNORM8 = 0,\n\tePVRTCT_SNORM8,\n\tePVRTCT_UINT8,\n\tePVRTCT_SINT8,\n\tePVRTCT_UNORM16,\n\tePVRTCT_SNORM16,\n\tePVRTCT_UINT16,\n\tePVRTCT_SINT16,\n\tePVRTCT_UNORM32,\n\tePVRTCT_SNORM32,\n\tePVRTCT_UINT32,\n\tePVRTCT_SINT32,\n\tePVRTCT_FLOAT\n};\n\n// 'P' 'V' 'R' '!'\nstatic const uint32 PVRTEX2_IDENT = 0x21525650;\nstatic const uint32 PVRTEX2_IDENT_REV = 0x50565221;\n\nstruct PVRTexHeaderV2\n{\n\tuint32 headerSize;\n\tuint32 height;\n\tuint32 width;\n\tuint32 numMipmaps;\n\tuint32 flags;\n\tuint32 dataSize;\n\tuint32 bpp;\n\tuint32 bitmaskRed;\n\tuint32 bitmaskGreen;\n\tuint32 bitmaskBlue;\n\tuint32 bitmaskAlpha;\n\tuint32 pvrTag;\n\tuint32 numSurfaces;\n};\n\n// The legacy V2 pixel types we support.\nenum PVRPixelTypeV2\n{\n\tPixelTypePVRTC2 = 0x18,\n\tPixelTypePVRTC4,\n\tPixelTypePVRTCII2 = 0x1C,\n\tPixelTypePVRTCII4,\n\tPixelTypeDXT1 = 0x20,\n\tPixelTypeDXT3 = 0x22,\n\tPixelTypeDXT5 = 0x24,\n\tPixelTypeETC1 = 0x36\n};\n\n// Convert a V2 header to V3.\nvoid ConvertPVRHeader(PVRTexHeaderV2 header2, PVRTexHeaderV3 *header3)\n{\n\t// If the header's endianness doesn't match our own, we swap everything.\n\tif (header2.pvrTag == PVRTEX2_IDENT_REV)\n\t{\n\t\t// All of the struct's members are uint32 values, so we can do this.\n\t\tuint32 *headerArray = (uint32 *) &header2;\n\t\tfor (size_t i = 0; i < sizeof(PVRTexHeaderV2) / sizeof(uint32); i++)\n\t\t\theaderArray[i] = swapuint32(headerArray[i]);\n\t}\n\n\tmemset(header3, 0, sizeof(PVRTexHeaderV3));\n\n\theader3->version = PVRTEX3_IDENT;\n\theader3->height = header2.height;\n\theader3->width = header2.width;\n\theader3->depth = 1;\n\theader3->numSurfaces = header2.numSurfaces;\n\theader3->numFaces = 1;\n\theader3->numMipmaps = header2.numMipmaps;\n\theader3->metaDataSize = 0;\n\n\tswitch ((PVRPixelTypeV2) (header2.flags & 0xFF))\n\t{\n\tcase PixelTypePVRTC2:\n\t\theader3->pixelFormat = ePVRTPF_PVRTCI_2bpp_RGBA;\n\t\tbreak;\n\tcase PixelTypePVRTC4:\n\t\theader3->pixelFormat = ePVRTPF_PVRTCI_4bpp_RGBA;\n\t\tbreak;\n\tcase PixelTypePVRTCII2:\n\t\theader3->pixelFormat = ePVRTPF_PVRTCII_2bpp;\n\t\tbreak;\n\tcase PixelTypePVRTCII4:\n\t\theader3->pixelFormat = ePVRTPF_PVRTCII_4bpp;\n\t\tbreak;\n\tcase PixelTypeDXT1:\n\t\theader3->pixelFormat = ePVRTPF_DXT1;\n\t\tbreak;\n\tcase PixelTypeDXT3:\n\t\theader3->pixelFormat = ePVRTPF_DXT3;\n\t\tbreak;\n\tcase PixelTypeDXT5:\n\t\theader3->pixelFormat = ePVRTPF_DXT5;\n\t\tbreak;\n\tcase PixelTypeETC1:\n\t\theader3->pixelFormat = ePVRTPF_ETC1;\n\t\tbreak;\n\tdefault:\n\t\theader3->pixelFormat = ePVRTPF_UNKNOWN_FORMAT;\n\t\tbreak;\n\t}\n}\n\nstatic PixelFormat convertFormat(PVRV3PixelFormat format, PVRV3ChannelType channeltype)\n{\n\tbool snorm = false;\n\n\tswitch (channeltype)\n\t{\n\tcase ePVRTCT_SNORM8:\n\tcase ePVRTCT_SNORM16:\n\tcase ePVRTCT_SNORM32:\n\t\tsnorm = true;\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\n\tswitch (format)\n\t{\n\tcase ePVRTPF_PVRTCI_2bpp_RGB:\n\t\treturn PIXELFORMAT_PVR1_RGB2_UNORM;\n\tcase ePVRTPF_PVRTCI_2bpp_RGBA:\n\t\treturn PIXELFORMAT_PVR1_RGBA2_UNORM;\n\tcase ePVRTPF_PVRTCI_4bpp_RGB:\n\t\treturn PIXELFORMAT_PVR1_RGB4_UNORM;\n\tcase ePVRTPF_PVRTCI_4bpp_RGBA:\n\t\treturn PIXELFORMAT_PVR1_RGBA4_UNORM;\n\tcase ePVRTPF_ETC1:\n\t\treturn PIXELFORMAT_ETC1_UNORM;\n\tcase ePVRTPF_DXT1:\n\t\treturn PIXELFORMAT_DXT1_UNORM;\n\tcase ePVRTPF_DXT3:\n\t\treturn PIXELFORMAT_DXT3_UNORM;\n\tcase ePVRTPF_DXT5:\n\t\treturn PIXELFORMAT_DXT5_UNORM;\n\tcase ePVRTPF_BC4:\n\t\treturn snorm ? PIXELFORMAT_BC4_SNORM : PIXELFORMAT_BC4_UNORM;\n\tcase ePVRTPF_BC5:\n\t\treturn snorm ? PIXELFORMAT_BC5_SNORM : PIXELFORMAT_BC5_UNORM;\n\tcase ePVRTPF_BC6:\n\t\treturn snorm ? PIXELFORMAT_BC6H_FLOAT : PIXELFORMAT_BC6H_UFLOAT;\n\tcase ePVRTPF_BC7:\n\t\treturn PIXELFORMAT_BC7_UNORM;\n\tcase ePVRTPF_ETC2_RGB:\n\t\treturn PIXELFORMAT_ETC2_RGB_UNORM;\n\tcase ePVRTPF_ETC2_RGBA:\n\t\treturn PIXELFORMAT_ETC2_RGBA_UNORM;\n\tcase ePVRTPF_ETC2_RGBA1:\n\t\treturn PIXELFORMAT_ETC2_RGBA1_UNORM;\n\tcase ePVRTPF_EAC_R:\n\t\treturn snorm ? PIXELFORMAT_EAC_R_SNORM : PIXELFORMAT_EAC_R_UNORM;\n\tcase ePVRTPF_EAC_RG:\n\t\treturn snorm ? PIXELFORMAT_EAC_RG_SNORM : PIXELFORMAT_EAC_RG_UNORM;\n\tcase ePVRTPF_ASTC_4x4:\n\t\treturn PIXELFORMAT_ASTC_4x4_UNORM;\n\tcase ePVRTPF_ASTC_5x4:\n\t\treturn PIXELFORMAT_ASTC_5x4_UNORM;\n\tcase ePVRTPF_ASTC_5x5:\n\t\treturn PIXELFORMAT_ASTC_5x5_UNORM;\n\tcase ePVRTPF_ASTC_6x5:\n\t\treturn PIXELFORMAT_ASTC_6x5_UNORM;\n\tcase ePVRTPF_ASTC_6x6:\n\t\treturn PIXELFORMAT_ASTC_6x6_UNORM;\n\tcase ePVRTPF_ASTC_8x5:\n\t\treturn PIXELFORMAT_ASTC_8x5_UNORM;\n\tcase ePVRTPF_ASTC_8x6:\n\t\treturn PIXELFORMAT_ASTC_8x6_UNORM;\n\tcase ePVRTPF_ASTC_8x8:\n\t\treturn PIXELFORMAT_ASTC_8x8_UNORM;\n\tcase ePVRTPF_ASTC_10x5:\n\t\treturn PIXELFORMAT_ASTC_10x5_UNORM;\n\tcase ePVRTPF_ASTC_10x6:\n\t\treturn PIXELFORMAT_ASTC_10x6_UNORM;\n\tcase ePVRTPF_ASTC_10x8:\n\t\treturn PIXELFORMAT_ASTC_10x8_UNORM;\n\tcase ePVRTPF_ASTC_10x10:\n\t\treturn PIXELFORMAT_ASTC_10x10_UNORM;\n\tcase ePVRTPF_ASTC_12x10:\n\t\treturn PIXELFORMAT_ASTC_12x10_UNORM;\n\tcase ePVRTPF_ASTC_12x12:\n\t\treturn PIXELFORMAT_ASTC_12x12_UNORM;\n\tdefault:\n\t\treturn PIXELFORMAT_UNKNOWN;\n\t}\n}\n\nint getBitsPerPixel(uint64 pixelformat)\n{\n\t// Uncompressed formats have their bits per pixel stored in the high bits.\n\tif ((pixelformat & 0xFFFFFFFF) != pixelformat)\n\t{\n\t\tconst uint8 *charformat = (const uint8 *) &pixelformat;\n\t\treturn charformat[4] + charformat[5] + charformat[6] + charformat[7];\n\t}\n\n\tswitch (pixelformat)\n\t{\n\tcase ePVRTPF_PVRTCI_2bpp_RGB:\n\tcase ePVRTPF_PVRTCI_2bpp_RGBA:\n\tcase ePVRTPF_PVRTCII_2bpp:\n\t\treturn 2;\n\tcase ePVRTPF_PVRTCI_4bpp_RGB:\n\tcase ePVRTPF_PVRTCI_4bpp_RGBA:\n\tcase ePVRTPF_PVRTCII_4bpp:\n\tcase ePVRTPF_ETC1:\n\tcase ePVRTPF_DXT1:\n\tcase ePVRTPF_BC4:\n\tcase ePVRTPF_ETC2_RGB:\n\tcase ePVRTPF_ETC2_RGBA1:\n\tcase ePVRTPF_EAC_R:\n\t\treturn 4;\n\tcase ePVRTPF_DXT2:\n\tcase ePVRTPF_DXT3:\n\tcase ePVRTPF_DXT4:\n\tcase ePVRTPF_DXT5:\n\tcase ePVRTPF_BC5:\n\tcase ePVRTPF_BC6:\n\tcase ePVRTPF_BC7:\n\tcase ePVRTPF_ETC2_RGBA:\n\tcase ePVRTPF_EAC_RG:\n\t\treturn 8;\n\tdefault:\n\t\treturn 0;\n\t}\n}\n\nvoid getFormatMinDimensions(uint64 pixelformat, int &minX, int &minY, int &minZ)\n{\n\tminZ = 1;\n\n\tswitch (pixelformat)\n\t{\n\tcase ePVRTPF_PVRTCI_2bpp_RGB:\n\tcase ePVRTPF_PVRTCI_2bpp_RGBA:\n\t\tminX = 16;\n\t\tminY = 8;\n\t\tbreak;\n\tcase ePVRTPF_PVRTCI_4bpp_RGB:\n\tcase ePVRTPF_PVRTCI_4bpp_RGBA:\n\t\tminX = minY = 8;\n\t\tbreak;\n\tcase ePVRTPF_PVRTCII_2bpp:\n\t\tminX = 8;\n\t\tminY = 4;\n\t\tbreak;\n\tcase ePVRTPF_PVRTCII_4bpp:\n\t\tminX = minY = 4;\n\t\tbreak;\n\tcase ePVRTPF_DXT1:\n\tcase ePVRTPF_DXT2:\n\tcase ePVRTPF_DXT3:\n\tcase ePVRTPF_DXT4:\n\tcase ePVRTPF_DXT5:\n\tcase ePVRTPF_BC4:\n\tcase ePVRTPF_BC5:\n\tcase ePVRTPF_BC6:\n\tcase ePVRTPF_BC7:\n\tcase ePVRTPF_ETC1:\n\tcase ePVRTPF_ETC2_RGB:\n\tcase ePVRTPF_ETC2_RGBA:\n\tcase ePVRTPF_ETC2_RGBA1:\n\tcase ePVRTPF_EAC_R:\n\tcase ePVRTPF_EAC_RG:\n\t\tminX = minY = 4;\n\t\tbreak;\n\tcase ePVRTPF_ASTC_4x4:\n\t\tminX = 4;\n\t\tminY = 4;\n\t\tbreak;\n\tcase ePVRTPF_ASTC_5x4:\n\t\tminX = 5;\n\t\tminY = 4;\n\t\tbreak;\n\tcase ePVRTPF_ASTC_5x5:\n\t\tminX = 5;\n\t\tminY = 5;\n\t\tbreak;\n\tcase ePVRTPF_ASTC_6x5:\n\t\tminX = 6;\n\t\tminY = 5;\n\t\tbreak;\n\tcase ePVRTPF_ASTC_6x6:\n\t\tminX = 6;\n\t\tminY = 6;\n\t\tbreak;\n\tcase ePVRTPF_ASTC_8x5:\n\t\tminX = 8;\n\t\tminY = 5;\n\t\tbreak;\n\tcase ePVRTPF_ASTC_8x6:\n\t\tminX = 8;\n\t\tminY = 6;\n\t\tbreak;\n\tcase ePVRTPF_ASTC_8x8:\n\t\tminX = 8;\n\t\tminY = 8;\n\t\tbreak;\n\tcase ePVRTPF_ASTC_10x5:\n\t\tminX = 10;\n\t\tminY = 5;\n\t\tbreak;\n\tcase ePVRTPF_ASTC_10x6:\n\t\tminX = 10;\n\t\tminY = 6;\n\t\tbreak;\n\tcase ePVRTPF_ASTC_10x8:\n\t\tminX = 10;\n\t\tminY = 8;\n\t\tbreak;\n\tcase ePVRTPF_ASTC_10x10:\n\t\tminX = 10;\n\t\tminY = 10;\n\t\tbreak;\n\tcase ePVRTPF_ASTC_12x10:\n\t\tminX = 12;\n\t\tminY = 10;\n\t\tbreak;\n\tcase ePVRTPF_ASTC_12x12:\n\t\tminX = 12;\n\t\tminY = 12;\n\t\tbreak;\n\tdefault: // We don't handle all possible formats, but that's fine.\n\t\tminX = minY = 1;\n\t\tbreak;\n\t}\n}\n\nsize_t getMipLevelSize(const PVRTexHeaderV3 &header, int miplevel)\n{\n\tint smallestwidth = 1;\n\tint smallestheight = 1;\n\tint smallestdepth = 1;\n\tgetFormatMinDimensions(header.pixelFormat, smallestwidth, smallestheight, smallestdepth);\n\n\tint width = std::max((int) header.width >> miplevel, 1);\n\tint height = std::max((int) header.height >> miplevel, 1);\n\tint depth = std::max((int) header.depth >> miplevel, 1);\n\n\t// Pad the dimensions.\n\twidth = ((width + smallestwidth - 1) / smallestwidth) * smallestwidth;\n\theight = ((height + smallestheight - 1) / smallestheight) * smallestheight;\n\tdepth = ((depth + smallestdepth - 1) / smallestdepth) * smallestdepth;\n\n\tif (header.pixelFormat >= ePVRTPF_ASTC_4x4 && header.pixelFormat <= ePVRTPF_ASTC_12x12)\n\t\treturn (width / smallestwidth) * (height / smallestheight) * (depth / smallestdepth) * (128 / 8);\n\telse\n\t\treturn getBitsPerPixel(header.pixelFormat) * width * height * depth / 8;\n}\n\n} // Anonymous namespace.\n\n\nbool PVRHandler::canParseCompressed(Data *data)\n{\n\tif (data->getSize() < sizeof(PVRTexHeaderV2) || data->getSize() < sizeof(PVRTexHeaderV3))\n\t\treturn false;\n\n\tPVRTexHeaderV3 *header3 = (PVRTexHeaderV3 *) data->getData();\n\n\t// Magic number (FourCC identifier.)\n\tif (header3->version == PVRTEX3_IDENT || header3->version == PVRTEX3_IDENT_REV)\n\t\treturn true;\n\n\t// Maybe it has a V2 header.\n\tPVRTexHeaderV2 *header2 = (PVRTexHeaderV2 *) data->getData();\n\n\t// FourCC identifier.\n\tif (header2->pvrTag == PVRTEX2_IDENT || header2->pvrTag == PVRTEX2_IDENT_REV)\n\t\treturn true;\n\n\treturn false;\n}\n\nStrongRef<ByteData> PVRHandler::parseCompressed(Data *filedata, std::vector<StrongRef<CompressedSlice>> &images, PixelFormat &format)\n{\n\tif (!canParseCompressed(filedata))\n\t\tthrow love::Exception(\"Could not decode compressed data (not a PVR file?)\");\n\n\tPVRTexHeaderV3 header3 = *(PVRTexHeaderV3 *) filedata->getData();\n\n\t// If the header isn't the V3 format, assume it's V2 and convert.\n\tif (header3.version != PVRTEX3_IDENT && header3.version != PVRTEX3_IDENT_REV)\n\t\tConvertPVRHeader(*(PVRTexHeaderV2 *) filedata->getData(), &header3);\n\n\t// If the header's endianness doesn't match our own, then we swap everything.\n\tif (header3.version == PVRTEX3_IDENT_REV)\n\t{\n\t\theader3.version = PVRTEX3_IDENT;\n\t\theader3.flags = swapuint32(header3.flags);\n\t\theader3.pixelFormat = swapuint64(header3.pixelFormat);\n\t\theader3.colorSpace = swapuint32(header3.colorSpace);\n\t\theader3.channelType = swapuint32(header3.channelType);\n\t\theader3.height = swapuint32(header3.height);\n\t\theader3.width = swapuint32(header3.width);\n\t\theader3.depth = swapuint32(header3.depth);\n\t\theader3.numFaces = swapuint32(header3.numFaces);\n\t\theader3.numMipmaps = swapuint32(header3.numMipmaps);\n\t\theader3.metaDataSize = swapuint32(header3.metaDataSize);\n\t}\n\n\tif (header3.depth > 1)\n\t\tthrow love::Exception(\"Image depths greater than 1 in PVR files are unsupported.\");\n\n\tPVRV3PixelFormat pixelformat = (PVRV3PixelFormat) header3.pixelFormat;\n\tPVRV3ChannelType channeltype = (PVRV3ChannelType) header3.channelType;\n\n\tPixelFormat cformat = convertFormat(pixelformat, channeltype);\n\n\tif (header3.colorSpace == 1)\n\t\tcformat = getSRGBPixelFormat(cformat);\n\n\tif (cformat == PIXELFORMAT_UNKNOWN)\n\t\tthrow love::Exception(\"Could not parse PVR file: unsupported image format.\");\n\n\tsize_t totalsize = 0;\n\n\t// Ignore faces and surfaces except the first ones (for now.)\n\tfor (int i = 0; i < (int) header3.numMipmaps; i++)\n\t\ttotalsize += getMipLevelSize(header3, i);\n\n\tsize_t fileoffset = sizeof(PVRTexHeaderV3) + header3.metaDataSize;\n\n\t// Make sure the file actually holds this much data...\n\tif (filedata->getSize() < fileoffset + totalsize)\n\t\tthrow love::Exception(\"Could not parse PVR file: invalid size calculation.\");\n\n\t;\n\tStrongRef<ByteData> memory(new ByteData(totalsize, false), Acquire::NORETAIN);\n\n\tsize_t curoffset = 0;\n\tconst uint8 *filebytes = (uint8 *) filedata->getData() + fileoffset;\n\n\tfor (int i = 0; i < (int) header3.numMipmaps; i++)\n\t{\n\t\tsize_t mipsize = getMipLevelSize(header3, i);\n\n\t\tif (curoffset + mipsize > totalsize)\n\t\t\tbreak; // Just in case.\n\n\t\tint width = std::max((int) header3.width >> i, 1);\n\t\tint height = std::max((int) header3.height >> i, 1);\n\n\t\tmemcpy((uint8 *) memory->getData() + curoffset, filebytes + curoffset, mipsize);\n\n\t\tauto slice = new CompressedSlice(cformat, width, height, memory, curoffset, mipsize);\n\t\timages.push_back(slice);\n\t\tslice->release();\n\n\t\tcuroffset += mipsize;\n\t}\n\n\tformat = cformat;\n\treturn memory;\n}\n\n} // magpie\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/magpie/PVRHandler.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/config.h\"\n#include \"image/FormatHandler.h\"\n\nnamespace love\n{\nnamespace image\n{\nnamespace magpie\n{\n\nclass PVRHandler : public FormatHandler\n{\npublic:\n\n\tvirtual ~PVRHandler() {}\n\n\t// Implements FormatHandler.\n\tbool canParseCompressed(Data *data) override;\n\n\tStrongRef<ByteData> parseCompressed(Data *filedata,\n\t        std::vector<StrongRef<CompressedSlice>> &images,\n\t        PixelFormat &format) override;\n\n}; // PVRHandler\n\n} // magpie\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/magpie/STBHandler.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"STBHandler.h\"\n#include \"common/Exception.h\"\n#include \"common/Color.h\"\n\nstatic void loveSTBIAssert(bool test, const char *teststr)\n{\n\tif (!test)\n\t\tthrow love::Exception(\"Could not decode image (stb_image assertion '%s' failed)\", teststr);\n}\n\n// Workaround when building for iOS with deployment target=8.0\n#include \"common/config.h\"\n#if defined(LOVE_IOS)\n#define STBI_NO_THREAD_LOCALS\n#endif\n\n// stb_image\n#define STBI_ONLY_JPEG\n// #define STBI_ONLY_PNG\n#define STBI_ONLY_BMP\n#define STBI_ONLY_TGA\n#define STBI_ONLY_HDR\n#define STBI_NO_STDIO\n#define STB_IMAGE_STATIC\n#define STB_IMAGE_IMPLEMENTATION\n#define STBI_ASSERT(A) loveSTBIAssert((A), #A)\n#include \"libraries/stb/stb_image.h\"\n\n// C\n#include <cstdlib>\n\nnamespace love\n{\nnamespace image\n{\nnamespace magpie\n{\n\nstatic_assert(sizeof(Color32) == 4, \"sizeof(Color32) must equal 4 bytes!\");\n\nbool STBHandler::canDecode(Data *data)\n{\n\tint w = 0;\n\tint h = 0;\n\tint comp = 0;\n\n\tint status = stbi_info_from_memory((const stbi_uc *) data->getData(),\n\t                                   (int) data->getSize(), &w, &h, &comp);\n\n\treturn status == 1 && w > 0 && h > 0;\n}\n\nbool STBHandler::canEncode(PixelFormat rawFormat, EncodedFormat encodedFormat)\n{\n\treturn encodedFormat == ENCODED_TGA && rawFormat == PIXELFORMAT_RGBA8_UNORM;\n}\n\nFormatHandler::DecodedImage STBHandler::decode(Data *data)\n{\n\tDecodedImage img;\n\n\tconst stbi_uc *buffer = (const stbi_uc *) data->getData();\n\tint bufferlen = (int) data->getSize();\n\tint comp = 0;\n\n\tif (stbi_is_hdr_from_memory(buffer, bufferlen))\n\t{\n\t\timg.data = (unsigned char *) stbi_loadf_from_memory(buffer, bufferlen, &img.width, &img.height, &comp, 4);\n\t\timg.size = img.width * img.height * 4 * sizeof(float);\n\t\timg.format = PIXELFORMAT_RGBA32_FLOAT;\n\t}\n\telse\n\t{\n\t\timg.data = stbi_load_from_memory(buffer, bufferlen, &img.width, &img.height, &comp, 4);\n\t\timg.size = img.width * img.height * 4;\n\t\timg.format = PIXELFORMAT_RGBA8_UNORM;\n\t}\n\n\tif (img.data == nullptr || img.width <= 0 || img.height <= 0)\n\t{\n\t\tconst char *err = stbi_failure_reason();\n\t\tif (err == nullptr)\n\t\t\terr = \"unknown error\";\n\t\tthrow love::Exception(\"Could not decode image with stb_image (%s).\", err);\n\t}\n\n\treturn img;\n}\n\nFormatHandler::EncodedImage STBHandler::encode(const DecodedImage &img, EncodedFormat encodedFormat)\n{\n\tif (!canEncode(img.format, encodedFormat))\n\t\tthrow love::Exception(\"Invalid format.\");\n\n\t// We don't actually use stb_image for encoding, but this code is small\n\t// enough that it might as well stay here.\n\n\tEncodedImage encimg;\n\n\tconst size_t headerlen = 18;\n\tconst size_t bpp = 4;\n\n\tencimg.size = (img.width * img.height * bpp) + headerlen;\n\n\ttry\n\t{\n\t\tencimg.data = new unsigned char[encimg.size];\n\t}\n\tcatch (std::exception &)\n\t{\n\t\tthrow love::Exception(\"Out of memory.\");\n\t}\n\n\t// here's the header for the Targa file format.\n\tencimg.data[0]  = 0; // ID field size\n\tencimg.data[1]  = 0; // colormap type\n\tencimg.data[2]  = 2; // image type\n\tencimg.data[3]  = encimg.data[4] = 0; // colormap start\n\tencimg.data[5]  = encimg.data[6] = 0; // colormap length\n\tencimg.data[7]  = 32; // colormap bits\n\tencimg.data[8]  = encimg.data[9] = 0; // x origin\n\tencimg.data[10] = encimg.data[11] = 0; // y origin\n\t// Targa is little endian, so:\n\tencimg.data[12] = img.width & 255; // least significant byte of width\n\tencimg.data[13] = img.width >> 8; // most significant byte of width\n\tencimg.data[14] = img.height & 255; // least significant byte of height\n\tencimg.data[15] = img.height >> 8; // most significant byte of height\n\tencimg.data[16] = bpp * 8; // bits per pixel\n\tencimg.data[17] = 0x20; // descriptor bits (flip bits: 0x10 horizontal, 0x20 vertical)\n\n\t// header done. write the pixel data to TGA:\n\tmemcpy(encimg.data + headerlen, img.data, img.width * img.height * bpp);\n\n\t// convert the pixels from RGBA to BGRA.\n\tColor32 *encodedpixels = (Color32 *) (encimg.data + headerlen);\n\tfor (int y = 0; y < img.height; y++)\n\t{\n\t\tfor (int x = 0; x < img.width; x++)\n\t\t{\n\t\t\tunsigned char r = encodedpixels[y * img.width + x].r;\n\t\t\tunsigned char b = encodedpixels[y * img.width + x].b;\n\t\t\tencodedpixels[y * img.width + x].r = b;\n\t\t\tencodedpixels[y * img.width + x].b = r;\n\t\t}\n\t}\n\n\treturn encimg;\n}\n\nvoid STBHandler::freeRawPixels(unsigned char *mem)\n{\n\t// The STB decoder gave memory allocated directly by stb_image to the\n\t// ImageData, so we use stb_image_free to delete it.\n\tstbi_image_free(mem);\n}\n\nvoid STBHandler::freeEncodedImage(unsigned char *mem)\n{\n\tdelete[] mem;\n}\n\n} // magpie\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/magpie/STBHandler.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n#include \"image/FormatHandler.h\"\n\nnamespace love\n{\nnamespace image\n{\nnamespace magpie\n{\n\n/**\n * Interface between ImageData and the stb_image library, for decoding JPEG,\n * TGA, and BMP images.\n *\n * We could use stb_image to decode PNG as well, but performance and\n * comprehensive format support is lacking compared to some alternatives.\n **/\nclass STBHandler final : public FormatHandler\n{\npublic:\n\n\tvirtual ~STBHandler() {}\n\n\t// Implements FormatHandler.\n\n\tbool canDecode(Data *data) override;\n\tbool canEncode(PixelFormat rawFormat, EncodedFormat encodedFormat) override;\n\n\tDecodedImage decode(Data *data) override;\n\tEncodedImage encode(const DecodedImage &img, EncodedFormat format) override;\n\n\tvoid freeRawPixels(unsigned char *mem) override;\n\tvoid freeEncodedImage(unsigned char *mem) override;\n\n}; // STBHandler\n\n} // magpie\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/magpie/ddsHandler.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"ddsHandler.h\"\n#include \"common/Exception.h\"\n#include \"image/ImageData.h\"\n\n// dds parser\n#include \"ddsparse/ddsparse.h\"\n\nnamespace love\n{\nnamespace image\n{\nnamespace magpie\n{\n\nstatic PixelFormat convertFormat(dds::dxinfo::DXGIFormat dxformat)\n{\n\tusing namespace dds::dxinfo;\n\n\tswitch (dxformat)\n\t{\n\tcase DXGI_FORMAT_R32G32B32A32_TYPELESS:\n\tcase DXGI_FORMAT_R32G32B32A32_FLOAT:\n\t\treturn PIXELFORMAT_RGBA32_FLOAT;\n\n\tcase DXGI_FORMAT_R16G16B16A16_TYPELESS:\n\tcase DXGI_FORMAT_R16G16B16A16_FLOAT:\n\t\treturn PIXELFORMAT_RGBA16_FLOAT;\n\n\tcase DXGI_FORMAT_R16G16B16A16_UNORM:\n\t\treturn PIXELFORMAT_RGBA16_UNORM;\n\n\tcase DXGI_FORMAT_R32G32_TYPELESS:\n\tcase DXGI_FORMAT_R32G32_FLOAT:\n\t\treturn PIXELFORMAT_RG32_FLOAT;\n\n\tcase DXGI_FORMAT_R10G10B10A2_TYPELESS:\n\tcase DXGI_FORMAT_R10G10B10A2_UNORM:\n\t\treturn PIXELFORMAT_RGB10A2_UNORM;\n\n\tcase DXGI_FORMAT_R11G11B10_FLOAT:\n\t\treturn PIXELFORMAT_RG11B10_FLOAT;\n\n\tcase DXGI_FORMAT_R8G8B8A8_TYPELESS:\n\tcase DXGI_FORMAT_R8G8B8A8_UNORM:\n\t\treturn PIXELFORMAT_RGBA8_UNORM;\n\tcase DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:\n\t\treturn PIXELFORMAT_RGBA8_sRGB;\n\n\tcase DXGI_FORMAT_R16G16_TYPELESS:\n\tcase DXGI_FORMAT_R16G16_FLOAT:\n\t\treturn PIXELFORMAT_RG16_FLOAT;\n\n\tcase DXGI_FORMAT_R16G16_UNORM:\n\t\treturn PIXELFORMAT_RG16_UNORM;\n\n\tcase DXGI_FORMAT_R32_TYPELESS:\n\tcase DXGI_FORMAT_R32_FLOAT:\n\t\treturn PIXELFORMAT_R32_FLOAT;\n\n\tcase DXGI_FORMAT_R8G8_TYPELESS:\n\tcase DXGI_FORMAT_R8G8_UNORM:\n\t\treturn PIXELFORMAT_RG8_UNORM;\n\n\tcase DXGI_FORMAT_R16_TYPELESS:\n\tcase DXGI_FORMAT_R16_FLOAT:\n\t\treturn PIXELFORMAT_R16_FLOAT;\n\n\tcase DXGI_FORMAT_R16_UNORM:\n\t\treturn PIXELFORMAT_R16_UNORM;\n\n\tcase DXGI_FORMAT_R8_TYPELESS:\n\tcase DXGI_FORMAT_R8_UNORM:\n\tcase DXGI_FORMAT_A8_UNORM:\n\t\treturn PIXELFORMAT_R8_UNORM;\n\n\tcase DXGI_FORMAT_BC1_TYPELESS:\n\tcase DXGI_FORMAT_BC1_UNORM:\n\t\treturn PIXELFORMAT_DXT1_UNORM;\n\tcase DXGI_FORMAT_BC1_UNORM_SRGB:\n\t\treturn PIXELFORMAT_DXT1_sRGB;\n\n\tcase DXGI_FORMAT_BC2_TYPELESS:\n\tcase DXGI_FORMAT_BC2_UNORM:\n\t\treturn PIXELFORMAT_DXT3_UNORM;\n\tcase DXGI_FORMAT_BC2_UNORM_SRGB:\n\t\treturn PIXELFORMAT_DXT3_sRGB;\n\n\tcase DXGI_FORMAT_BC3_TYPELESS:\n\tcase DXGI_FORMAT_BC3_UNORM:\n\t\treturn PIXELFORMAT_DXT5_UNORM;\n\tcase DXGI_FORMAT_BC3_UNORM_SRGB:\n\t\treturn PIXELFORMAT_DXT5_sRGB;\n\n\tcase DXGI_FORMAT_BC4_TYPELESS:\n\tcase DXGI_FORMAT_BC4_UNORM:\n\t\treturn PIXELFORMAT_BC4_UNORM;\n\n\tcase DXGI_FORMAT_BC4_SNORM:\n\t\treturn PIXELFORMAT_BC4_SNORM;\n\n\tcase DXGI_FORMAT_BC5_TYPELESS:\n\tcase DXGI_FORMAT_BC5_UNORM:\n\t\treturn PIXELFORMAT_BC5_UNORM;\n\n\tcase DXGI_FORMAT_BC5_SNORM:\n\t\treturn PIXELFORMAT_BC5_SNORM;\n\n\tcase DXGI_FORMAT_B5G6R5_UNORM:\n\t\treturn PIXELFORMAT_RGB565_UNORM;\n\n\tcase DXGI_FORMAT_B5G5R5A1_UNORM:\n\t\treturn PIXELFORMAT_RGB5A1_UNORM;\n\n\tcase DXGI_FORMAT_B8G8R8A8_UNORM:\n\tcase DXGI_FORMAT_B8G8R8A8_TYPELESS:\n\t\treturn PIXELFORMAT_BGRA8_UNORM;\n\tcase DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:\n\t\treturn PIXELFORMAT_BGRA8_sRGB;\n\n\tcase DXGI_FORMAT_BC6H_TYPELESS:\n\tcase DXGI_FORMAT_BC6H_UF16:\n\t\treturn PIXELFORMAT_BC6H_UFLOAT;\n\n\tcase DXGI_FORMAT_BC6H_SF16:\n\t\treturn PIXELFORMAT_BC6H_FLOAT;\n\n\tcase DXGI_FORMAT_BC7_TYPELESS:\n\tcase DXGI_FORMAT_BC7_UNORM:\n\t\treturn PIXELFORMAT_BC7_UNORM;\n\tcase DXGI_FORMAT_BC7_UNORM_SRGB:\n\t\treturn PIXELFORMAT_BC7_sRGB;\n\n\tdefault:\n\t\treturn PIXELFORMAT_UNKNOWN;\n\t}\n}\n\nbool DDSHandler::canDecode(Data *data)\n{\n\tusing namespace dds::dxinfo;\n\n\tDXGIFormat dxformat = dds::getDDSPixelFormat(data->getData(), data->getSize());\n\tPixelFormat format = convertFormat(dxformat);\n\n\t// We convert BGRA to RGBA\n\tif (format == PIXELFORMAT_BGRA8_UNORM)\n\t\tformat = PIXELFORMAT_RGBA8_UNORM;\n\telse if (format == PIXELFORMAT_BGRA8_sRGB)\n\t\tformat = PIXELFORMAT_RGBA8_sRGB;\n\n\treturn ImageData::validPixelFormat(format);\n}\n\nFormatHandler::DecodedImage DDSHandler::decode(Data *data)\n{\n\tDecodedImage img;\n\n\tdds::Parser parser(data->getData(), data->getSize());\n\n\timg.format = convertFormat(parser.getFormat());\n\n\tbool bgra = false;\n\tif (img.format == PIXELFORMAT_BGRA8_UNORM)\n\t{\n\t\timg.format = PIXELFORMAT_RGBA8_UNORM;\n\t\tbgra = true;\n\t}\n\telse if (img.format == PIXELFORMAT_BGRA8_sRGB)\n\t{\n\t\timg.format = PIXELFORMAT_RGBA8_sRGB;\n\t\tbgra = true;\n\t}\n\n\tif (!ImageData::validPixelFormat(img.format))\n\t\tthrow love::Exception(\"Could not parse DDS pixel data: Unsupported format.\");\n\n\tif (parser.getMipmapCount() == 0)\n\t\tthrow love::Exception(\"Could not parse DDS pixel data: No readable texture data.\");\n\n\t// We only support the top mip level through this codepath.\n\tconst dds::Image *ddsimg = parser.getImageData(0);\n\n\ttry\n\t{\n\t\timg.data = new uint8[ddsimg->dataSize];\n\t}\n\tcatch (std::exception &)\n\t{\n\t\tthrow love::Exception(\"Out of memory.\");\n\t}\n\n\tmemcpy(img.data, ddsimg->data, ddsimg->dataSize);\n\n\timg.size = ddsimg->dataSize;\n\timg.width = ddsimg->width;\n\timg.height = ddsimg->height;\n\n\t// Swap red and blue channels for incoming BGRA data.\n\tif (bgra)\n\t{\n\t\tfor (int y = 0; y < img.height; y++)\n\t\t{\n\t\t\tfor (int x = 0; x < img.width; x++)\n\t\t\t{\n\t\t\t\tsize_t offset = (y * img.width + x) * 4;\n\t\t\t\tuint8 b = img.data[offset + 0];\n\t\t\t\tuint8 r = img.data[offset + 2];\n\t\t\t\timg.data[offset + 0] = r;\n\t\t\t\timg.data[offset + 2] = b;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn img;\n}\n\nbool DDSHandler::canParseCompressed(Data *data)\n{\n\treturn dds::isCompressedDDS(data->getData(), data->getSize());\n}\n\nStrongRef<ByteData> DDSHandler::parseCompressed(Data *filedata, std::vector<StrongRef<CompressedSlice>> &images, PixelFormat &format)\n{\n\tif (!dds::isCompressedDDS(filedata->getData(), filedata->getSize()))\n\t\tthrow love::Exception(\"Could not decode compressed data (not a DDS file?)\");\n\n\tPixelFormat texformat = PIXELFORMAT_UNKNOWN;\n\n\tsize_t dataSize = 0;\n\n\timages.clear();\n\n\t// Attempt to parse the dds file.\n\tdds::Parser parser(filedata->getData(), filedata->getSize());\n\n\ttexformat = convertFormat(parser.getFormat());\n\n\tif (texformat == PIXELFORMAT_UNKNOWN)\n\t\tthrow love::Exception(\"Could not parse compressed data: Unsupported format.\");\n\n\tif (parser.getMipmapCount() == 0)\n\t\tthrow love::Exception(\"Could not parse compressed data: No readable texture data.\");\n\n\t// Calculate the size of the block of memory we're returning.\n\tfor (size_t i = 0; i < parser.getMipmapCount(); i++)\n\t{\n\t\tconst dds::Image *img = parser.getImageData(i);\n\t\tdataSize += img->dataSize;\n\t}\n\n\tStrongRef<ByteData> memory(new ByteData(dataSize, false), Acquire::NORETAIN);\n\n\tsize_t dataOffset = 0;\n\n\t// Copy the parsed mipmap levels from the FileData to our CompressedImageData.\n\tfor (size_t i = 0; i < parser.getMipmapCount(); i++)\n\t{\n\t\t// Fetch the data for this mipmap level.\n\t\tconst dds::Image *img = parser.getImageData(i);\n\n\t\t// Copy the mipmap image from the FileData to our block of memory.\n\t\tmemcpy((uint8 *) memory->getData() + dataOffset, img->data, img->dataSize);\n\n\t\tauto slice = new CompressedSlice(texformat, img->width, img->height, memory, dataOffset, img->dataSize);\n\t\timages.emplace_back(slice, Acquire::NORETAIN);\n\n\t\tdataOffset += img->dataSize;\n\t}\n\n\tformat = texformat;\n\treturn memory;\n}\n\n} // magpie\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/magpie/ddsHandler.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"image/FormatHandler.h\"\n\n// STL\n#include <string>\n\nnamespace love\n{\nnamespace image\n{\nnamespace magpie\n{\n\n/**\n * Interface between CompressedImageData and the ddsparse library.\n **/\nclass DDSHandler : public FormatHandler\n{\npublic:\n\n\tvirtual ~DDSHandler() {}\n\n\t// Implements FormatHandler.\n\tbool canDecode(Data *data) override;\n\tDecodedImage decode(Data *data) override;\n\tbool canParseCompressed(Data *data) override;\n\tStrongRef<ByteData> parseCompressed(Data *filedata,\n\t        std::vector<StrongRef<CompressedSlice>> &images,\n\t        PixelFormat &format) override;\n\n}; // DDSHandler\n\n} // magpie\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/wrap_CompressedImageData.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_CompressedImageData.h\"\n#include \"data/wrap_Data.h\"\n\nnamespace love\n{\nnamespace image\n{\n\nCompressedImageData *luax_checkcompressedimagedata(lua_State *L, int idx)\n{\n\treturn luax_checktype<CompressedImageData>(L, idx);\n}\n\nint w_CompressedImageData_clone(lua_State *L)\n{\n\tCompressedImageData *t = luax_checkcompressedimagedata(L, 1), *c = nullptr;\n\tluax_catchexcept(L, [&](){ c = t->clone(); }); \n\tluax_pushtype(L, c);\n\tc->release();\n\treturn 1;\n}\n\nint w_CompressedImageData_getWidth(lua_State *L)\n{\n\tCompressedImageData *t = luax_checkcompressedimagedata(L, 1);\n\tint miplevel = (int) luaL_optinteger(L, 2, 1);\n\tint width = 0;\n\n\tluax_catchexcept(L, [&](){ width = t->getWidth(miplevel - 1); });\n\n\tlua_pushinteger(L, width);\n\treturn 1;\n}\n\nint w_CompressedImageData_getHeight(lua_State *L)\n{\n\tCompressedImageData *t = luax_checkcompressedimagedata(L, 1);\n\tint miplevel = (int) luaL_optinteger(L, 2, 1);\n\tint height = 0;\n\n\tluax_catchexcept(L, [&](){ height = t->getHeight(miplevel - 1); });\n\n\tlua_pushinteger(L, height);\n\treturn 1;\n}\n\nint w_CompressedImageData_getDimensions(lua_State *L)\n{\n\tCompressedImageData *t = luax_checkcompressedimagedata(L, 1);\n\tint miplevel = (int) luaL_optinteger(L, 2, 1);\n\tint width = 0, height = 0;\n\n\tluax_catchexcept(L, [&]()\n\t{\n\t\twidth = t->getWidth(miplevel - 1);\n\t\theight = t->getHeight(miplevel - 1);\n\t});\n\n\tlua_pushinteger(L, width);\n\tlua_pushinteger(L, height);\n\treturn 2;\n}\n\nint w_CompressedImageData_getMipmapCount(lua_State *L)\n{\n\tCompressedImageData *t = luax_checkcompressedimagedata(L, 1);\n\tlua_pushinteger(L, t->getMipmapCount());\n\treturn 1;\n}\n\nint w_CompressedImageData_getFormat(lua_State *L)\n{\n\tCompressedImageData *t = luax_checkcompressedimagedata(L, 1);\n\n\tPixelFormat format = t->getFormat();\n\tconst char *str;\n\n\tif (getConstant(format, str))\n\t\tlua_pushstring(L, str);\n\telse\n\t\tlua_pushstring(L, \"unknown\");\n\n\treturn 1;\n}\n\nint w_CompressedImageData_setLinear(lua_State *L)\n{\n\tCompressedImageData *t = luax_checkcompressedimagedata(L, 1);\n\tt->setLinear(luax_checkboolean(L, 2));\n\treturn 0;\n}\n\nint w_CompressedImageData_isLinear(lua_State *L)\n{\n\tCompressedImageData *t = luax_checkcompressedimagedata(L, 1);\n\tluax_pushboolean(L, t->isLinear());\n\treturn 1;\n}\n\nstatic const luaL_Reg w_CompressedImageData_functions[] =\n{\n\t{ \"clone\", w_CompressedImageData_clone },\n\t{ \"getWidth\", w_CompressedImageData_getWidth },\n\t{ \"getHeight\", w_CompressedImageData_getHeight },\n\t{ \"getDimensions\", w_CompressedImageData_getDimensions },\n\t{ \"getMipmapCount\", w_CompressedImageData_getMipmapCount },\n\t{ \"getFormat\", w_CompressedImageData_getFormat },\n\t{ \"setLinear\", w_CompressedImageData_setLinear },\n\t{ \"isLinear\", w_CompressedImageData_isLinear },\n\t{ 0, 0 },\n};\n\nextern \"C\" int luaopen_compressedimagedata(lua_State *L)\n{\n\tint ret = luax_register_type(L, &CompressedImageData::type, data::w_Data_functions, w_CompressedImageData_functions, nullptr);\n\tlove::data::luax_rundatawrapper(L, CompressedImageData::type);\n\treturn ret;\n}\n\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/wrap_CompressedImageData.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_IMAGE_WRAP_COMRESSED_IMAGE_DATA_H\n#define LOVE_IMAGE_WRAP_COMRESSED_IMAGE_DATA_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"CompressedImageData.h\"\n\nnamespace love\n{\nnamespace image\n{\n\nCompressedImageData *luax_checkcompressedimagedata(lua_State *L, int idx);\nextern \"C\" int luaopen_compressedimagedata(lua_State *L);\n\n} // image\n} // love\n\n#endif // LOVE_IMAGE_WRAP_COMRESSED_IMAGE_DATA_H\n"
  },
  {
    "path": "src/modules/image/wrap_Image.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_Image.h\"\n#include \"data/wrap_Data.h\"\n#include \"common/Data.h\"\n#include \"common/StringMap.h\"\n\n#include \"Image.h\"\n\n#include \"filesystem/wrap_Filesystem.h\"\n\nnamespace love\n{\nnamespace image\n{\n\n#define instance() (Module::getInstance<Image>(Module::M_IMAGE))\n\nint w_newImageData(lua_State *L)\n{\n\t// Case 1: width & height.\n\tif (lua_isnumber(L, 1))\n\t{\n\t\tint w = (int) luaL_checkinteger(L, 1);\n\t\tint h = (int) luaL_checkinteger(L, 2);\n\t\tif (w <= 0 || h <= 0)\n\t\t\treturn luaL_error(L, \"Invalid image size.\");\n\n\t\tPixelFormat format = PIXELFORMAT_RGBA8_UNORM;\n\n\t\tif (!lua_isnoneornil(L, 3))\n\t\t{\n\t\t\tconst char *fstr = luaL_checkstring(L, 3);\n\t\t\tif (!getConstant(fstr, format))\n\t\t\t\treturn luax_enumerror(L, \"pixel format\", fstr);\n\t\t}\n\n\t\tsize_t numbytes = 0;\n\t\tconst char *bytes = nullptr;\n\n\t\tif (luax_istype(L, 4, Data::type))\n\t\t{\n\t\t\tData *data = data::luax_checkdata(L, 4);\n\t\t\tbytes = (const char *) data->getData();\n\t\t\tnumbytes = data->getSize();\n\t\t}\n\t\telse if (!lua_isnoneornil(L, 4))\n\t\t\tbytes = luaL_checklstring(L, 4, &numbytes);\n\n\t\tImageData *t = nullptr;\n\t\tluax_catchexcept(L, [&](){ t = instance()->newImageData(w, h, format); });\n\n\t\tif (bytes)\n\t\t{\n\t\t\tif (numbytes != t->getSize())\n\t\t\t{\n\t\t\t\tt->release();\n\t\t\t\treturn luaL_error(L, \"The size of the raw byte string must match the ImageData's actual size in bytes.\");\n\t\t\t}\n\n\t\t\tmemcpy(t->getData(), bytes, t->getSize());\n\t\t}\n\n\t\tluax_pushtype(L, t);\n\t\tt->release();\n\t\treturn 1;\n\t}\n\telse if (filesystem::luax_cangetdata(L, 1)) // Case 2: File(Data).\n\t{\n\t\tData *data = love::filesystem::luax_getdata(L, 1);\n\n\t\tImageData *t = nullptr;\n\t\tluax_catchexcept(L,\n\t\t\t[&]() { t = instance()->newImageData(data); },\n\t\t\t[&](bool) { data->release(); }\n\t\t);\n\n\t\tluax_pushtype(L, t);\n\t\tt->release();\n\t\treturn 1;\n\t}\n\telse\n\t{\n\t\treturn luax_typerror(L, 1, \"value\");\n\t}\n}\n\nint w_newCompressedData(lua_State *L)\n{\n\tData *data = love::filesystem::luax_getdata(L, 1);\n\n\tCompressedImageData *t = nullptr;\n\tluax_catchexcept(L,\n\t\t[&]() { t = instance()->newCompressedData(data); },\n\t\t[&](bool) { data->release(); }\n\t);\n\n\tluax_pushtype(L, CompressedImageData::type, t);\n\tt->release();\n\treturn 1;\n}\n\nint w_isCompressed(lua_State *L)\n{\n\tData *data = love::filesystem::luax_getdata(L, 1);\n\tbool compressed = instance()->isCompressed(data);\n\tdata->release();\n\n\tluax_pushboolean(L, compressed);\n\treturn 1;\n}\n\nint w_newCubeFaces(lua_State *L)\n{\n\tImageData *id = luax_checkimagedata(L, 1);\n\tstd::vector<StrongRef<ImageData>> faces;\n\tluax_catchexcept(L, [&](){ faces = instance()->newCubeFaces(id); });\n\tfor (auto face : faces)\n\t\tluax_pushtype(L, face);\n\treturn (int) faces.size();\n}\n\n// List of functions to wrap.\nstatic const luaL_Reg functions[] =\n{\n\t{ \"newImageData\",  w_newImageData },\n\t{ \"newCompressedData\", w_newCompressedData },\n\t{ \"isCompressed\", w_isCompressed },\n\t{ \"newCubeFaces\", w_newCubeFaces },\n\t{ 0, 0 }\n};\n\nstatic const lua_CFunction types[] =\n{\n\tluaopen_imagedata,\n\tluaopen_compressedimagedata,\n\t0\n};\n\nextern \"C\" int luaopen_love_image(lua_State *L)\n{\n\tImage *instance = instance();\n\tif (instance == nullptr)\n\t{\n\t\tluax_catchexcept(L, [&](){ instance = new love::image::Image(); });\n\t}\n\telse\n\t\tinstance->retain();\n\n\tWrappedModule w;\n\tw.module = instance;\n\tw.name = \"image\";\n\tw.type = &Image::type;\n\tw.functions = functions;\n\tw.types = types;\n\n\treturn luax_register_module(L, w);\n}\n\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/wrap_Image.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_IMAGE_WRAP_IMAGE_H\n#define LOVE_IMAGE_WRAP_IMAGE_H\n\n// LOVE\n#include \"Image.h\"\n#include \"wrap_ImageData.h\"\n#include \"wrap_CompressedImageData.h\"\n\nnamespace love\n{\nnamespace image\n{\n\nextern \"C\" LOVE_EXPORT int luaopen_love_image(lua_State *L);\n\n} // image\n} // love\n\n#endif // LOVE_IMAGE_WRAP_IMAGE_H\n"
  },
  {
    "path": "src/modules/image/wrap_ImageData.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_ImageData.h\"\n\n#include \"data/wrap_Data.h\"\n#include \"filesystem/File.h\"\n#include \"filesystem/Filesystem.h\"\n\n// Shove the wrap_ImageData.lua code directly into a raw string literal.\nstatic const char imagedata_lua[] =\n#include \"wrap_ImageData.lua\"\n;\n\nnamespace love\n{\nnamespace image\n{\n\n/**\n * NOTE: Additional wrapper code is in wrap_ImageData.lua. Be sure to keep it\n * in sync with any changes made to this file!\n **/\n\nImageData *luax_checkimagedata(lua_State *L, int idx)\n{\n\treturn luax_checktype<ImageData>(L, idx);\n}\n\nint w_ImageData_clone(lua_State *L)\n{\n\tImageData *t = luax_checkimagedata(L, 1), *c = nullptr;\n\tluax_catchexcept(L, [&](){ c = t->clone(); });\n\tluax_pushtype(L, c);\n\tc->release();\n\treturn 1;\n}\n\nint w_ImageData_getFormat(lua_State *L)\n{\n\tImageData *t = luax_checkimagedata(L, 1);\n\tPixelFormat format = t->getFormat();\n\tconst char *fstr = nullptr;\n\n\tif (!getConstant(format, fstr))\n\t\treturn luaL_error(L, \"Unknown pixel format.\");\n\n\tlua_pushstring(L, fstr);\n\treturn 1;\n}\n\nint w_ImageData_setLinear(lua_State *L)\n{\n\tImageData *t = luax_checkimagedata(L, 1);\n\tt->setLinear(luax_checkboolean(L, 2));\n\treturn 0;\n}\n\nint w_ImageData_isLinear(lua_State *L)\n{\n\tImageData *t = luax_checkimagedata(L, 1);\n\tluax_pushboolean(L, t->isLinear());\n\treturn 1;\n}\n\nint w_ImageData_getWidth(lua_State *L)\n{\n\tImageData *t = luax_checkimagedata(L, 1);\n\tlua_pushinteger(L, t->getWidth());\n\treturn 1;\n}\n\nint w_ImageData_getHeight(lua_State *L)\n{\n\tImageData *t = luax_checkimagedata(L, 1);\n\tlua_pushinteger(L, t->getHeight());\n\treturn 1;\n}\n\nint w_ImageData_getDimensions(lua_State *L)\n{\n\tImageData *t = luax_checkimagedata(L, 1);\n\tlua_pushinteger(L, t->getWidth());\n\tlua_pushinteger(L, t->getHeight());\n\treturn 2;\n}\n\nint w_ImageData_getPixel(lua_State *L)\n{\n\tImageData *t = luax_checkimagedata(L, 1);\n\tint x = (int) luaL_checkinteger(L, 2);\n\tint y = (int) luaL_checkinteger(L, 3);\n\n\tColorf c;\n\tluax_catchexcept(L, [&](){ t->getPixel(x, y, c); });\n\n\tlua_pushnumber(L, c.r);\n\tlua_pushnumber(L, c.g);\n\tlua_pushnumber(L, c.b);\n\tlua_pushnumber(L, c.a);\n\treturn 4;\n}\n\nint w_ImageData_setPixel(lua_State *L)\n{\n\tImageData *t = luax_checkimagedata(L, 1);\n\tint x = (int) luaL_checkinteger(L, 2);\n\tint y = (int) luaL_checkinteger(L, 3);\n\n\tint components = getPixelFormatColorComponents(t->getFormat());\n\n\tColorf c;\n\n\tif (lua_istable(L, 4))\n\t{\n\t\tfor (int i = 1; i <= components; i++)\n\t\t\tlua_rawgeti(L, components, i);\n\n\t\tc.r = (float) luaL_checknumber(L, -components);\n\t\tif (components > 1)\n\t\t\tc.g = (float) luaL_checknumber(L, (-components) + 1);\n\t\tif (components > 2)\n\t\t\tc.b = (float) luaL_checknumber(L, (-components) + 2);\n\t\tif (components > 3)\n\t\t\tc.a = (float) luaL_optnumber(L, (-components) + 3, 1.0);\n\n\t\tlua_pop(L, components);\n\t}\n\telse\n\t{\n\t\tc.r = (float) luaL_checknumber(L, 4);\n\t\tif (components > 1)\n\t\t\tc.g = (float) luaL_checknumber(L, 5);\n\t\tif (components > 2)\n\t\t\tc.b = (float) luaL_checknumber(L, 6);\n\t\tif (components > 3)\n\t\t\tc.a = (float) luaL_optnumber(L, 7, 1.0);\n\t}\n\n\tluax_catchexcept(L, [&](){ t->setPixel(x, y, c); });\n\treturn 0;\n}\n\nint w_ImageData_mapPixel(lua_State *L)\n{\n\tImageData *t = luax_checkimagedata(L, 1);\n\tluaL_checktype(L, 2, LUA_TFUNCTION);\n\n\tint sx = luax_optint(L, 3, 0);\n\tint sy = luax_optint(L, 4, 0);\n\tint w  = luax_optint(L, 5, t->getWidth());\n\tint h  = luax_optint(L, 6, t->getHeight());\n\n\tif (!(t->inside(sx, sy) && t->inside(sx+w-1, sy+h-1)))\n\t\treturn luaL_error(L, \"Invalid rectangle dimensions.\");\n\n\tint iw = t->getWidth();\n\n\tPixelFormat format = t->getFormat();\n\tint components = getPixelFormatColorComponents(format);\n\n\tauto pixelsetfunction = t->getPixelSetFunction();\n\tauto pixelgetfunction = t->getPixelGetFunction();\n\n\tuint8 *data = (uint8 *) t->getData();\n\tsize_t pixelsize = t->getPixelSize();\n\n\tfor (int y = sy; y < sy+h; y++)\n\t{\n\t\tfor (int x = sx; x < sx+w; x++)\n\t\t{\n\t\t\tauto pixeldata = (ImageData::Pixel *) (data + (y * iw + x) * pixelsize);\n\n\t\t\tColorf c;\n\t\t\tpixelgetfunction(pixeldata, c);\n\n\t\t\tlua_pushvalue(L, 2); // ImageData\n\n\t\t\tlua_pushnumber(L, x);\n\t\t\tlua_pushnumber(L, y);\n\n\t\t\tlua_pushnumber(L, c.r);\n\t\t\tlua_pushnumber(L, c.g);\n\t\t\tlua_pushnumber(L, c.b);\n\t\t\tlua_pushnumber(L, c.a);\n\n\t\t\tlua_call(L, 6, 4);\n\n\t\t\tc.r = (float) luaL_checknumber(L, -4);\n\t\t\tif (components > 1)\n\t\t\t\tc.g = (float) luaL_checknumber(L, -3);\n\t\t\tif (components > 2)\n\t\t\t\tc.b = (float) luaL_checknumber(L, -2);\n\t\t\tif (components > 3)\n\t\t\t\tc.a = (float) luaL_optnumber(L, -1, 1.0);\n\n\t\t\tpixelsetfunction(c, pixeldata);\n\n\t\t\tlua_pop(L, 4); // Pop return values.\n\t\t}\n\t}\n\n\treturn 0;\n}\n\nint w_ImageData_paste(lua_State *L)\n{\n\tImageData *t = luax_checkimagedata(L, 1);\n\tImageData *src = luax_checkimagedata(L, 2);\n\tint dx = (int) luaL_checkinteger(L, 3);\n\tint dy = (int) luaL_checkinteger(L, 4);\n\tint sx = (int) luaL_optinteger(L, 5, 0);\n\tint sy = (int) luaL_optinteger(L, 6, 0);\n\tint sw = (int) luaL_optinteger(L, 7, src->getWidth());\n\tint sh = (int) luaL_optinteger(L, 8, src->getHeight());\n\tt->paste((love::image::ImageData *)src, dx, dy, sx, sy, sw, sh);\n\treturn 0;\n}\n\nint w_ImageData_encode(lua_State *L)\n{\n\tImageData *t = luax_checkimagedata(L, 1);\n\n\tFormatHandler::EncodedFormat format;\n\tconst char *fmt = luaL_checkstring(L, 2);\n\tif (!ImageData::getConstant(fmt, format))\n\t\treturn luax_enumerror(L, \"encoded image format\", ImageData::getConstants(format), fmt);\n\n\tbool hasfilename = false;\n\n\tstd::string filename = \"Image.\" + std::string(fmt);\n\tif (!lua_isnoneornil(L, 3))\n\t{\n\t\thasfilename = true;\n\t\tfilename = luax_checkstring(L, 3);\n\t}\n\n\tlove::filesystem::FileData *filedata = nullptr;\n\tluax_catchexcept(L, [&](){ filedata = t->encode(format, filename.c_str(), hasfilename); });\n\n\tluax_pushtype(L, filedata);\n\tfiledata->release();\n\n\treturn 1;\n}\n\n// C functions in a struct, necessary for the FFI versions of ImageData methods.\nstruct FFI_ImageData\n{\n\tfloat (*float16to32)(float16 f);\n\tfloat16 (*float32to16)(float f);\n\n\tfloat (*float11to32)(float11 f);\n\tfloat11 (*float32to11)(float f);\n\n\tfloat (*float10to32)(float10 f);\n\tfloat10 (*float32to10)(float f);\n};\n\nstatic FFI_ImageData ffifuncs =\n{\n\tfloat16to32,\n\tfloat32to16,\n\tfloat11to32,\n\tfloat32to11,\n\tfloat10to32,\n\tfloat32to10,\n};\n\nstatic const luaL_Reg w_ImageData_functions[] =\n{\n\t{ \"clone\", w_ImageData_clone },\n\t{ \"getFormat\", w_ImageData_getFormat },\n\t{ \"setLinear\", w_ImageData_setLinear },\n\t{ \"isLinear\", w_ImageData_isLinear },\n\t{ \"getWidth\", w_ImageData_getWidth },\n\t{ \"getHeight\", w_ImageData_getHeight },\n\t{ \"getDimensions\", w_ImageData_getDimensions },\n\t{ \"getPixel\", w_ImageData_getPixel },\n\t{ \"setPixel\", w_ImageData_setPixel },\n\t{ \"paste\", w_ImageData_paste },\n\t{ \"mapPixel\", w_ImageData_mapPixel },\n\t{ \"encode\", w_ImageData_encode },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_imagedata(lua_State *L)\n{\n\tint ret = luax_register_type(L, &ImageData::type, data::w_Data_functions, w_ImageData_functions, nullptr);\n\n\tlove::data::luax_rundatawrapper(L, ImageData::type);\n\tluax_runwrapper(L, imagedata_lua, sizeof(imagedata_lua), \"ImageData.lua\", ImageData::type, &ffifuncs);\n\n\treturn ret;\n}\n\n} // image\n} // love\n"
  },
  {
    "path": "src/modules/image/wrap_ImageData.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_IMAGE_WRAP_IMAGE_DATA_H\n#define LOVE_IMAGE_WRAP_IMAGE_DATA_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"ImageData.h\"\n\nnamespace love\n{\nnamespace image\n{\n\nImageData *luax_checkimagedata(lua_State *L, int idx);\nextern \"C\" int luaopen_imagedata(lua_State *L);\n\n} // image\n} // love\n\n#endif // LOVE_IMAGE_WRAP_IMAGE_DATA_H\n"
  },
  {
    "path": "src/modules/image/wrap_ImageData.lua",
    "content": "R\"luastring\"--(\r\n-- DO NOT REMOVE THE ABOVE LINE. It is used to load this file as a C++ string.\r\n-- There is a matching delimiter at the bottom of the file.\r\n\r\n--[[\r\nCopyright (c) 2006-2024 LOVE Development Team\r\n\r\nThis software is provided 'as-is', without any express or implied\r\nwarranty.  In no event will the authors be held liable for any damages\r\narising from the use of this software.\r\n\r\nPermission is granted to anyone to use this software for any purpose,\r\nincluding commercial applications, and to alter it and redistribute it\r\nfreely, subject to the following restrictions:\r\n\r\n1. The origin of this software must not be misrepresented; you must not\r\nclaim that you wrote the original software. If you use this software\r\nin a product, an acknowledgment in the product documentation would be\r\nappreciated but is not required.\r\n2. Altered source versions must be plainly marked as such, and must not be\r\nmisrepresented as being the original software.\r\n3. This notice may not be removed or altered from any source distribution.\r\n--]]\r\n\r\nlocal ImageData_mt, ffifuncspointer_str = ...\r\nlocal ImageData = ImageData_mt.__index\r\n\r\nlocal tonumber, assert, error = tonumber, assert, error\r\nlocal type, pcall = type, pcall\r\nlocal floor = math.floor\r\nlocal min, max = math.min, math.max\r\n\r\nlocal function inside(x, y, w, h)\r\n\treturn x >= 0 and x < w and y >= 0 and y < h\r\nend\r\n\r\nlocal function clamp01(x)\r\n\treturn min(max(x, 0), 1)\r\nend\r\n\r\n-- Everything below this point is efficient FFI replacements for existing\r\n-- ImageData functionality.\r\n\r\nif type(jit) ~= \"table\" or not jit.status() then\r\n\t-- LuaJIT's FFI is *much* slower than LOVE's regular methods when the JIT\r\n\t-- compiler is disabled.\r\n\treturn\r\nend\r\n\r\nlocal status, ffi = pcall(require, \"ffi\")\r\nif not status then return end\r\n\r\nlocal bitstatus, bit = pcall(require, \"bit\")\r\nif not bitstatus then return end\r\n\r\npcall(ffi.cdef, [[\r\ntypedef struct Proxy Proxy;\r\ntypedef uint16_t float16;\r\ntypedef uint16_t float11;\r\ntypedef uint16_t float10;\r\n\r\ntypedef struct FFI_ImageData\r\n{\r\n\tfloat (*float16to32)(float16 f);\r\n\tfloat16 (*float32to16)(float f);\r\n\r\n\tfloat (*float11to32)(float11 f);\r\n\tfloat11 (*float32to11)(float f);\r\n\r\n\tfloat (*float10to32)(float10 f);\r\n\tfloat10 (*float32to10)(float f);\r\n} FFI_ImageData;\r\n\r\nstruct ImageData_Pixel_R8 { uint8_t r; };\r\nstruct ImageData_Pixel_RG8 { uint8_t r, g; };\r\nstruct ImageData_Pixel_RGBA8 { uint8_t r, g, b, a; };\r\n\r\nstruct ImageData_Pixel_R16 { uint16_t r; };\r\nstruct ImageData_Pixel_RG16 { uint16_t r, g; };\r\nstruct ImageData_Pixel_RGBA16 { uint16_t r, g, b, a; };\r\n\r\nstruct ImageData_Pixel_R16F { float16 r; };\r\nstruct ImageData_Pixel_RG16F { float16 r, g; };\r\nstruct ImageData_Pixel_RGBA16F { float16 r, g, b, a; };\r\n\r\nstruct ImageData_Pixel_R32F { float r; };\r\nstruct ImageData_Pixel_RG32F { float r, g; };\r\nstruct ImageData_Pixel_RGBA32F { float r, g, b, a; };\r\n\r\nstruct ImageData_Pixel_RGBA4 { uint16_t rgba; };\r\nstruct ImageData_Pixel_RGB5A1 { uint16_t rgba; };\r\nstruct ImageData_Pixel_RGB565 { uint16_t rgb; };\r\nstruct ImageData_Pixel_RGB10A2 { uint32_t rgba; };\r\nstruct ImageData_Pixel_RG11B10F { uint32_t rgb; };\r\n]])\r\n\r\nlocal ffifuncs = ffi.cast(\"FFI_ImageData **\", ffifuncspointer_str)[0]\r\n\r\nlocal conversions = {\r\n\tr8 = {\r\n\t\tpointer = ffi.typeof(\"struct ImageData_Pixel_R8 *\"),\r\n\t\ttolua = function(self)\r\n\t\t\treturn tonumber(self.r) / 255, 0, 0, 1\r\n\t\tend,\r\n\t\tfromlua = function(self, r)\r\n\t\t\tself.r = (clamp01(r) * 255) + 0.5\r\n\t\tend,\r\n\t},\r\n\trg8 = {\r\n\t\tpointer = ffi.typeof(\"struct ImageData_Pixel_RG8 *\"),\r\n\t\ttolua = function(self)\r\n\t\t\treturn tonumber(self.r) / 255, tonumber(self.g) / 255, 0, 1\r\n\t\tend,\r\n\t\tfromlua = function(self, r, g)\r\n\t\t\tself.r = (clamp01(r) * 255) + 0.5\r\n\t\t\tself.g = (clamp01(g) * 255) + 0.5\r\n\t\tend,\r\n\t},\r\n\trgba8 = {\r\n\t\tpointer = ffi.typeof(\"struct ImageData_Pixel_RGBA8 *\"),\r\n\t\ttolua = function(self)\r\n\t\t\treturn tonumber(self.r) / 255, tonumber(self.g) / 255, tonumber(self.b) / 255, tonumber(self.a) / 255\r\n\t\tend,\r\n\t\tfromlua = function(self, r, g, b, a)\r\n\t\t\tself.r = (clamp01(r) * 255) + 0.5\r\n\t\t\tself.g = (clamp01(g) * 255) + 0.5\r\n\t\t\tself.b = (clamp01(b) * 255) + 0.5\r\n\t\t\tself.a = a == nil and 255 or (clamp01(a) * 255) + 0.5\r\n\t\tend,\r\n\t},\r\n\tr16 = {\r\n\t\tpointer = ffi.typeof(\"struct ImageData_Pixel_R16 *\"),\r\n\t\ttolua = function(self)\r\n\t\t\treturn tonumber(self.r) / 65535, 0, 0, 1\r\n\t\tend,\r\n\t\tfromlua = function(self, r)\r\n\t\t\tself.r = (clamp01(r) * 65535) + 0.5\r\n\t\tend,\r\n\t},\r\n\trg16 = {\r\n\t\tpointer = ffi.typeof(\"struct ImageData_Pixel_RG16 *\"),\r\n\t\ttolua = function(self)\r\n\t\t\treturn tonumber(self.r) / 65535, tonumber(self.g) / 65535, 0, 1\r\n\t\tend,\r\n\t\tfromlua = function(self, r, g)\r\n\t\t\tself.r = (clamp01(r) * 65535) + 0.5\r\n\t\t\tself.g = (clamp01(g) * 65535) + 0.5\r\n\t\tend,\r\n\t},\r\n\trgba16 = {\r\n\t\tpointer = ffi.typeof(\"struct ImageData_Pixel_RGBA16 *\"),\r\n\t\ttolua = function(self)\r\n\t\t\treturn tonumber(self.r) / 65535, tonumber(self.g) / 65535, tonumber(self.b) / 65535, tonumber(self.a) / 65535\r\n\t\tend,\r\n\t\tfromlua = function(self, r, g, b, a)\r\n\t\t\tself.r = (clamp01(r) * 65535) + 0.5\r\n\t\t\tself.g = (clamp01(g) * 65535) + 0.5\r\n\t\t\tself.b = (clamp01(b) * 65535) + 0.5\r\n\t\t\tself.a = a == nil and 65535 or (clamp01(a) * 65535) + 0.5\r\n\t\tend,\r\n\t},\r\n\tr16f = {\r\n\t\tpointer = ffi.typeof(\"struct ImageData_Pixel_R16F *\"),\r\n\t\ttolua = function(self)\r\n\t\t\treturn tonumber(ffifuncs.float16to32(self.r)), 0, 0, 1\r\n\t\tend,\r\n\t\tfromlua = function(self, r)\r\n\t\t\tself.r = ffifuncs.float32to16(r)\r\n\t\tend,\r\n\t},\r\n\trg16f = {\r\n\t\tpointer = ffi.typeof(\"struct ImageData_Pixel_RG16F *\"),\r\n\t\ttolua = function(self)\r\n\t\t\treturn tonumber(ffifuncs.float16to32(self.r)), tonumber(ffifuncs.float16to32(self.g)), 0, 1\r\n\t\tend,\r\n\t\tfromlua = function(self, r, g, b, a)\r\n\t\t\tself.r = ffifuncs.float32to16(r)\r\n\t\t\tself.g = ffifuncs.float32to16(g)\r\n\t\tend,\r\n\t},\r\n\trgba16f = {\r\n\t\tpointer = ffi.typeof(\"struct ImageData_Pixel_RGBA16F *\"),\r\n\t\ttolua = function(self)\r\n\t\t\treturn tonumber(ffifuncs.float16to32(self.r)),\r\n\t\t\t       tonumber(ffifuncs.float16to32(self.g)),\r\n\t\t\t       tonumber(ffifuncs.float16to32(self.b)),\r\n\t\t\t       tonumber(ffifuncs.float16to32(self.a))\r\n\t\tend,\r\n\t\tfromlua = function(self, r, g, b, a)\r\n\t\t\tself.r = ffifuncs.float32to16(r)\r\n\t\t\tself.g = ffifuncs.float32to16(g)\r\n\t\t\tself.b = ffifuncs.float32to16(b)\r\n\t\t\tself.a = ffifuncs.float32to16(a == nil and 1.0 or a)\r\n\t\tend,\r\n\t},\r\n\tr32f = {\r\n\t\tpointer = ffi.typeof(\"struct ImageData_Pixel_R32F *\"),\r\n\t\ttolua = function(self)\r\n\t\t\treturn tonumber(self.r), 0, 0, 1\r\n\t\tend,\r\n\t\tfromlua = function(self, r, g, b, a)\r\n\t\t\tself.r = r\r\n\t\tend,\r\n\t},\r\n\trg32f = {\r\n\t\tpointer = ffi.typeof(\"struct ImageData_Pixel_RG32F *\"),\r\n\t\ttolua = function(self)\r\n\t\t\treturn tonumber(self.r), tonumber(self.g), 0, 1\r\n\t\tend,\r\n\t\tfromlua = function(self, r, g, b, a)\r\n\t\t\tself.r = r\r\n\t\t\tself.g = g\r\n\t\tend,\r\n\t},\r\n\trgba32f = {\r\n\t\tpointer = ffi.typeof(\"struct ImageData_Pixel_RGBA32F *\"),\r\n\t\ttolua = function(self)\r\n\t\t\treturn tonumber(self.r), tonumber(self.g), tonumber(self.b), tonumber(self.a)\r\n\t\tend,\r\n\t\tfromlua = function(self, r, g, b, a)\r\n\t\t\tself.r = r\r\n\t\t\tself.g = g\r\n\t\t\tself.b = b\r\n\t\t\tself.a = a == nil and 1.0 or a\r\n\t\tend,\r\n\t},\r\n\trgba4 = {\r\n\t\t-- LSB->MSB: [a, b, g, r]\r\n\t\tpointer = ffi.typeof(\"struct ImageData_Pixel_RGBA4 *\"),\r\n\t\ttolua = function(self)\r\n\t\t\tlocal rgba = self.rgba\r\n\t\t\tlocal a = tonumber(bit.band(rgba, 0xF)) / 0xF\r\n\t\t\tlocal b = tonumber(bit.band(bit.rshift(rgba, 4), 0xF)) / 0xF\r\n\t\t\tlocal g = tonumber(bit.band(bit.rshift(rgba, 8), 0xF)) / 0xF\r\n\t\t\tlocal r = tonumber(bit.rshift(rgba, 12)) / 0xF\r\n\t\t\treturn r, g, b, a\r\n\t\tend,\r\n\t\tfromlua = function(self, r, g, b, a)\r\n\t\t\t-- bit functions round internally.\r\n\t\t\tr = clamp01(r) * 0xF\r\n\t\t\tg = clamp01(g) * 0xF\r\n\t\t\tb = clamp01(b) * 0xF\r\n\t\t\ta = a == nil and 0xF or clamp01(a) * 0xF\r\n\t\t\tself.rgba = bit.bor(bit.lshift(r, 12), bit.lshift(g, 8), bit.lshift(b, 4), a)\r\n\t\tend,\r\n\t},\r\n\trgb5a1 = {\r\n\t\t-- LSB->MSB: [a, b, g, r]\r\n\t\tpointer = ffi.typeof(\"struct ImageData_Pixel_RGB5A1 *\"),\r\n\t\ttolua = function(self)\r\n\t\t\tlocal rgba = self.rgba\r\n\t\t\tlocal r = tonumber(bit.band(bit.rshift(rgba, 11), 0x1F)) / 0x1F\r\n\t\t\tlocal g = tonumber(bit.band(bit.rshift(rgba,  6), 0x1F)) / 0x1F\r\n\t\t\tlocal b = tonumber(bit.band(bit.rshift(rgba,  1), 0x1F)) / 0x1F\r\n\t\t\tlocal a = tonumber(bit.band(rgba, 0x1))\r\n\t\t\treturn r, g, b, a\r\n\t\tend,\r\n\t\tfromlua = function(self, r, g, b, a)\r\n\t\t\t-- bit functions round internally.\r\n\t\t\tr = clamp01(r) * 0x1F\r\n\t\t\tg = clamp01(g) * 0x1F\r\n\t\t\tb = clamp01(b) * 0x1F\r\n\t\t\ta = a == nil and 1 or clamp01(a)\r\n\t\t\tself.rgba = bit.bor(bit.lshift(r, 11), bit.lshift(g, 6), bit.lshift(b, 1), a)\r\n\t\tend,\r\n\t},\r\n\trgb565 = {\r\n\t\t-- LSB->MSB: [b, g, r]\r\n\t\tpointer = ffi.typeof(\"struct ImageData_Pixel_RGB565 *\"),\r\n\t\ttolua = function(self)\r\n\t\t\tlocal rgb = self.rgb\r\n\t\t\tlocal r = bit.band(bit.rshift(rgb, 11), 0x1F) / 0x1F\r\n\t\t\tlocal g = bit.band(bit.rshift(rgb, 5), 0x3F) / 0x3F\r\n\t\t\tlocal b = bit.band(rgb, 0x1F) / 0x1F\r\n\t\t\treturn r, g, b, 1\r\n\t\tend,\r\n\t\tfromlua = function(self, r, g, b)\r\n\t\t\t-- bit functions round internally.\r\n\t\t\tr = clamp01(r) * 0x1F\r\n\t\t\tg = clamp01(g) * 0x3F\r\n\t\t\tb = clamp01(b) * 0x1F\r\n\t\t\tself.rgb = bit.bor(bit.lshift(r, 11), bit.lshift(g, 5), b)\r\n\t\tend,\r\n\t},\r\n\trgb10a2 = {\r\n\t\t-- LSB->MSB: [r, g, b, a]\r\n\t\tpointer = ffi.typeof(\"struct ImageData_Pixel_RGB10A2 *\"),\r\n\t\ttolua = function(self)\r\n\t\t\tlocal rgba = self.rgba\r\n\t\t\tlocal r = tonumber(bit.band(rgba, 0x3FF)) / 0x3FF\r\n\t\t\tlocal g = tonumber(bit.band(bit.rshift(rgba, 10), 0x3FF)) / 0x3FF\r\n\t\t\tlocal b = tonumber(bit.band(bit.rshift(rgba, 20), 0x3FF)) / 0x3FF\r\n\t\t\tlocal a = tonumber(bit.rshift(rgba, 30)) / 0x3\r\n\t\t\treturn r, g, b, a\r\n\t\tend,\r\n\t\tfromlua = function(self, r, g, b, a)\r\n\t\t\t-- bit functions round internally.\r\n\t\t\tr = clamp01(r) * 0x3FF\r\n\t\t\tg = clamp01(g) * 0x3FF\r\n\t\t\tb = clamp01(b) * 0x3FF\r\n\t\t\ta = a == nil and 0x3 or clamp01(a) * 0x3\r\n\t\t\tself.rgba = bit.bor(r, bit.lshift(g, 10), bit.lshift(b, 20), bit.lshift(a, 30))\r\n\t\tend,\r\n\t},\r\n\trg11b10f = {\r\n\t\t-- LSB->MSB: [r, g, b]\r\n\t\tpointer = ffi.typeof(\"struct ImageData_Pixel_RG11B10F *\"),\r\n\t\ttolua = function(self)\r\n\t\t\tlocal rgb = self.rgb\r\n\t\t\tlocal r = tonumber(ffifuncs.float11to32(bit.band(rgb, 0x7FF)))\r\n\t\t\tlocal g = tonumber(ffifuncs.float11to32(bit.band(bit.rshift(rgb, 11), 0x7FF)))\r\n\t\t\tlocal b = tonumber(ffifuncs.float10to32(bit.band(bit.rshift(rgb, 22), 0x3FF)))\r\n\t\t\treturn r, g, b, 1\r\n\t\tend,\r\n\t\tfromlua = function(self, r, g, b, a)\r\n\t\t\tself.rgb = bit.bor(\r\n\t\t\t\tffifuncs.float32to11(r),\r\n\t\t\t\tbit.lshift(ffifuncs.float32to11(g), 11),\r\n\t\t\t\tbit.lshift(ffifuncs.float32to10(b), 22)\r\n\t\t\t)\r\n\t\tend,\r\n\t},\r\n}\r\n\r\nlocal _getWidth = ImageData.getWidth\r\nlocal _getHeight = ImageData.getHeight\r\nlocal _getDimensions = ImageData.getDimensions\r\nlocal _getFormat = ImageData.getFormat\r\nlocal _release = ImageData.release\r\n\r\n-- Table which holds ImageData objects as keys, and information about the objects\r\n-- as values. Uses weak keys so the ImageData objects can still be GC'd properly.\r\nlocal objectcache = setmetatable({}, {\r\n\t__mode = \"k\",\r\n\t__index = function(self, imagedata)\r\n\t\tlocal width, height = _getDimensions(imagedata)\r\n\t\tlocal format = _getFormat(imagedata)\r\n\t\t\r\n\t\tlocal conv = conversions[format]\r\n\r\n\t\tlocal p = {\r\n\t\t\twidth = width,\r\n\t\t\theight = height,\r\n\t\t\tformat = format,\r\n\t\t\tpointer = conv ~= nil and ffi.cast(conv.pointer, imagedata:getFFIPointer()) or nil,\r\n\t\t\ttolua = conv ~= nil and conv.tolua or nil,\r\n\t\t\tfromlua = conv ~= nil and conv.fromlua or nil,\r\n\t\t}\r\n\r\n\t\tself[imagedata] = p\r\n\t\treturn p\r\n\tend,\r\n})\r\n\r\n\r\n-- Overwrite existing functions with new FFI versions.\r\n\r\nfunction ImageData:mapPixel(func, ix, iy, iw, ih)\r\n\tlocal p = objectcache[self]\r\n\tlocal idw, idh = p.width, p.height\r\n\r\n\tix = ix or 0\r\n\tiy = iy or 0\r\n\tiw = iw or idw\r\n\tih = ih or idh\r\n\r\n\tif type(ix) ~= \"number\" then error(\"bad argument #2 to ImageData:mapPixel (expected number)\", 2) end\r\n\tif type(iy) ~= \"number\" then error(\"bad argument #3 to ImageData:mapPixel (expected number)\", 2) end\r\n\tif type(iw) ~= \"number\" then error(\"bad argument #4 to ImageData:mapPixel (expected number)\", 2) end\r\n\tif type(ih) ~= \"number\" then error(\"bad argument #5 to ImageData:mapPixel (expected number)\", 2) end\r\n\r\n\tif type(func) ~= \"function\" then error(\"bad argument #1 to ImageData:mapPixel (expected function)\", 2) end\r\n\tif not (inside(ix, iy, idw, idh) and inside(ix+iw-1, iy+ih-1, idw, idh)) then error(\"Invalid rectangle dimensions\", 2) end\r\n\r\n\tif p.pointer == nil then error(\"ImageData:mapPixel does not currently support the \"..p.format..\" pixel format.\", 2) end\r\n\r\n\tix = floor(ix)\r\n\tiy = floor(iy)\r\n\tiw = floor(iw)\r\n\tih = floor(ih)\r\n\r\n\tlocal pixels = p.pointer\r\n\tlocal tolua = p.tolua\r\n\tlocal fromlua = p.fromlua\r\n\r\n\tfor y=iy, iy+ih-1 do\r\n\t\tfor x=ix, ix+iw-1 do\r\n\t\t\tlocal pixel = pixels[y*idw+x]\r\n\t\t\tlocal r, g, b, a = func(x, y, tolua(pixel))\r\n\t\t\tfromlua(pixel, r, g, b, a)\r\n\t\tend\r\n\tend\r\nend\r\n\r\nfunction ImageData:getPixel(x, y)\r\n\tif type(x) ~= \"number\" then error(\"bad argument #1 to ImageData:getPixel (expected number)\", 2) end\r\n\tif type(y) ~= \"number\" then error(\"bad argument #2 to ImageData:getPixel (expected number)\", 2) end\r\n\r\n\tx = floor(x)\r\n\ty = floor(y)\r\n\r\n\tlocal p = objectcache[self]\r\n\tif not inside(x, y, p.width, p.height) then error(\"Attempt to get out-of-range pixel!\", 2) end\r\n\r\n\tif p.pointer == nil then error(\"ImageData:getPixel does not currently support the \"..p.format..\" pixel format.\", 2) end\r\n\r\n\tlocal pixel = p.pointer[y * p.width + x]\r\n\treturn p.tolua(pixel)\r\nend\r\n\r\nfunction ImageData:setPixel(x, y, r, g, b, a)\r\n\tif type(x) ~= \"number\" then error(\"bad argument #1 to ImageData:setPixel (expected number)\", 2) end\r\n\tif type(y) ~= \"number\" then error(\"bad argument #2 to ImageData:setPixel (expected number)\", 2) end\r\n\r\n\tx = floor(x)\r\n\ty = floor(y)\r\n\r\n\tif type(r) == \"table\" then\r\n\t\tlocal t = r\r\n\t\tr, g, b, a = t[1], t[2], t[3], t[4]\r\n\tend\r\n\r\n\tif type(r) ~= \"number\" then error(\"bad red color component argument to ImageData:setPixel (expected number)\", 2) end\r\n\tif type(g) ~= \"number\" then error(\"bad green color component argument to ImageData:setPixel (expected number)\", 2) end\r\n\tif type(b) ~= \"number\" then error(\"bad blue color component argument to ImageData:setPixel (expected number)\", 2) end\r\n\tif a ~= nil and type(a) ~= \"number\" then error(\"bad alpha color component argument to ImageData:setPixel (expected number)\", 2) end\r\n\r\n\tlocal p = objectcache[self]\r\n\tif not inside(x, y, p.width, p.height) then error(\"Attempt to set out-of-range pixel!\", 2) end\r\n\r\n\tif p.pointer == nil then error(\"ImageData:setPixel does not currently support the \"..p.format..\" pixel format.\", 2) end\r\n\r\n\tp.fromlua(p.pointer[y * p.width + x], r, g, b, a)\r\nend\r\n\r\nfunction ImageData:getWidth()\r\n\treturn objectcache[self].width\r\nend\r\n\r\nfunction ImageData:getHeight()\r\n\treturn objectcache[self].height\r\nend\r\n\r\nfunction ImageData:getDimensions()\r\n\tlocal p = objectcache[self]\r\n\treturn p.width, p.height\r\nend\r\n\r\nfunction ImageData:getFormat()\r\n\treturn objectcache[self].format\r\nend\r\n\r\nfunction ImageData:release()\r\n\tobjectcache[self] = nil\r\n\treturn _release(self)\r\nend\r\n\r\n-- DO NOT REMOVE THE NEXT LINE. It is used to load this file as a C++ string.\r\n--)luastring\"--\"\r\n"
  },
  {
    "path": "src/modules/joystick/Joystick.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"Joystick.h\"\n\n// STL\n#include <cmath>\n\nnamespace love\n{\nnamespace joystick\n{\n\nlove::Type Joystick::type(\"Joystick\", &Object::type);\n\nfloat Joystick::clampval(float x)\n{\n\tif (fabsf(x) < 0.01)\n\t\treturn 0.0f;\n\n\tif (x < -0.99f) return -1.0f;\n\tif (x > 0.99f) return 1.0f;\n\n\treturn x;\n}\n\nSTRINGMAP_CLASS_BEGIN(Joystick, Joystick::Hat, Joystick::HAT_MAX_ENUM, hat)\n{\n\t{ \"c\",  Joystick::HAT_CENTERED  },\n\t{ \"u\",  Joystick::HAT_UP        },\n\t{ \"r\",  Joystick::HAT_RIGHT     },\n\t{ \"d\",  Joystick::HAT_DOWN      },\n\t{ \"l\",  Joystick::HAT_LEFT      },\n\t{ \"ru\", Joystick::HAT_RIGHTUP   },\n\t{ \"rd\", Joystick::HAT_RIGHTDOWN },\n\t{ \"lu\", Joystick::HAT_LEFTUP    },\n\t{ \"ld\", Joystick::HAT_LEFTDOWN  },\n}\nSTRINGMAP_CLASS_END(Joystick, Joystick::Hat, Joystick::HAT_MAX_ENUM, hat)\n\nSTRINGMAP_CLASS_BEGIN(Joystick, Joystick::JoystickType, Joystick::JOYSTICK_TYPE_MAX_ENUM, joystickType)\n{\n\t{ \"unknown\",     Joystick::JOYSTICK_TYPE_UNKNOWN      },\n\t{ \"gamepad\",     Joystick::JOYSTICK_TYPE_GAMEPAD      },\n\t{ \"wheel\",       Joystick::JOYSTICK_TYPE_WHEEL        },\n\t{ \"arcadestick\", Joystick::JOYSTICK_TYPE_ARCADE_STICK },\n\t{ \"flightstick\", Joystick::JOYSTICK_TYPE_FLIGHT_STICK },\n\t{ \"dancepad\",    Joystick::JOYSTICK_TYPE_DANCE_PAD    },\n\t{ \"guitar\",      Joystick::JOYSTICK_TYPE_GUITAR       },\n\t{ \"drumkit\",     Joystick::JOYSTICK_TYPE_DRUM_KIT     },\n\t{ \"arcadepad\",   Joystick::JOYSTICK_TYPE_ARCADE_PAD   },\n\t{ \"throttle\",    Joystick::JOYSTICK_TYPE_THROTTLE     },\n}\nSTRINGMAP_CLASS_END(Joystick, Joystick::JoystickType, Joystick::JOYSTICK_TYPE_MAX_ENUM, joystickType)\n\nSTRINGMAP_CLASS_BEGIN(Joystick, Joystick::GamepadType, Joystick::GAMEPAD_TYPE_MAX_ENUM, gamepadType)\n{\n\t{ \"unknown\",      Joystick::GAMEPAD_TYPE_UNKNOWN             },\n\t{ \"xbox360\",      Joystick::GAMEPAD_TYPE_XBOX360             },\n\t{ \"xboxone\",      Joystick::GAMEPAD_TYPE_XBOXONE             },\n\t{ \"ps3\",          Joystick::GAMEPAD_TYPE_PS3                 },\n\t{ \"ps4\",          Joystick::GAMEPAD_TYPE_PS4                 },\n\t{ \"ps5\",          Joystick::GAMEPAD_TYPE_PS5                 },\n\t{ \"switchpro\",    Joystick::GAMEPAD_TYPE_NINTENDO_SWITCH_PRO },\n\t{ \"amazonluna\",   Joystick::GAMEPAD_TYPE_AMAZON_LUNA         },\n\t{ \"stadia\",       Joystick::GAMEPAD_TYPE_STADIA              },\n\t{ \"virtual\",      Joystick::GAMEPAD_TYPE_VIRTUAL             },\n\t{ \"shield\",       Joystick::GAMEPAD_TYPE_NVIDIA_SHIELD       },\n\t{ \"joyconleft\",   Joystick::GAMEPAD_TYPE_JOYCON_LEFT         },\n\t{ \"joyconright\",  Joystick::GAMEPAD_TYPE_JOYCON_RIGHT        },\n\t{ \"joyconpair\",   Joystick::GAMEPAD_TYPE_JOYCON_PAIR         },\n}\nSTRINGMAP_CLASS_END(Joystick, Joystick::GamepadType, Joystick::GAMEPAD_TYPE_MAX_ENUM, gamepadType)\n\nSTRINGMAP_CLASS_BEGIN(Joystick, Joystick::GamepadAxis, Joystick::GAMEPAD_AXIS_MAX_ENUM, gpAxis)\n{\n\t{ \"leftx\",        Joystick::GAMEPAD_AXIS_LEFTX        },\n\t{ \"lefty\",        Joystick::GAMEPAD_AXIS_LEFTY        },\n\t{ \"rightx\",       Joystick::GAMEPAD_AXIS_RIGHTX       },\n\t{ \"righty\",       Joystick::GAMEPAD_AXIS_RIGHTY       },\n\t{ \"triggerleft\",  Joystick::GAMEPAD_AXIS_TRIGGERLEFT  },\n\t{ \"triggerright\", Joystick::GAMEPAD_AXIS_TRIGGERRIGHT },\n}\nSTRINGMAP_CLASS_END(Joystick, Joystick::GamepadAxis, Joystick::GAMEPAD_AXIS_MAX_ENUM, gpAxis)\n\nSTRINGMAP_CLASS_BEGIN(Joystick, Joystick::GamepadButton, Joystick::GAMEPAD_BUTTON_MAX_ENUM, gpButton)\n{\n\t{ \"a\",             Joystick::GAMEPAD_BUTTON_A             },\n\t{ \"b\",             Joystick::GAMEPAD_BUTTON_B             },\n\t{ \"x\",             Joystick::GAMEPAD_BUTTON_X             },\n\t{ \"y\",             Joystick::GAMEPAD_BUTTON_Y             },\n\t{ \"back\",          Joystick::GAMEPAD_BUTTON_BACK          },\n\t{ \"guide\",         Joystick::GAMEPAD_BUTTON_GUIDE         },\n\t{ \"start\",         Joystick::GAMEPAD_BUTTON_START         },\n\t{ \"leftstick\",     Joystick::GAMEPAD_BUTTON_LEFTSTICK     },\n\t{ \"rightstick\",    Joystick::GAMEPAD_BUTTON_RIGHTSTICK    },\n\t{ \"leftshoulder\",  Joystick::GAMEPAD_BUTTON_LEFTSHOULDER  },\n\t{ \"rightshoulder\", Joystick::GAMEPAD_BUTTON_RIGHTSHOULDER },\n\t{ \"dpup\",          Joystick::GAMEPAD_BUTTON_DPAD_UP       },\n\t{ \"dpdown\",        Joystick::GAMEPAD_BUTTON_DPAD_DOWN     },\n\t{ \"dpleft\",        Joystick::GAMEPAD_BUTTON_DPAD_LEFT     },\n\t{ \"dpright\",       Joystick::GAMEPAD_BUTTON_DPAD_RIGHT    },\n\t{ \"misc1\",         Joystick::GAMEPAD_BUTTON_MISC1         },\n\t{ \"paddle1\",       Joystick::GAMEPAD_BUTTON_PADDLE1       },\n\t{ \"paddle2\",       Joystick::GAMEPAD_BUTTON_PADDLE2       },\n\t{ \"paddle3\",       Joystick::GAMEPAD_BUTTON_PADDLE3       },\n\t{ \"paddle4\",       Joystick::GAMEPAD_BUTTON_PADDLE4       },\n\t{ \"touchpad\",      Joystick::GAMEPAD_BUTTON_TOUCHPAD      },\n}\nSTRINGMAP_CLASS_END(Joystick, Joystick::GamepadButton, Joystick::GAMEPAD_BUTTON_MAX_ENUM, gpButton)\n\nSTRINGMAP_CLASS_BEGIN(Joystick, Joystick::InputType, Joystick::INPUT_TYPE_MAX_ENUM, inputType)\n{\n\t{ \"axis\",   Joystick::INPUT_TYPE_AXIS   },\n\t{ \"button\", Joystick::INPUT_TYPE_BUTTON },\n\t{ \"hat\",    Joystick::INPUT_TYPE_HAT    },\n}\nSTRINGMAP_CLASS_END(Joystick, Joystick::InputType, Joystick::INPUT_TYPE_MAX_ENUM, inputType)\n\nSTRINGMAP_CLASS_BEGIN(Joystick, Joystick::PowerType, Joystick::POWER_MAX_ENUM, powerState)\n{\n\t{ \"unknown\",      Joystick::POWER_UNKNOWN      },\n\t{ \"onbattery\",    Joystick::POWER_ON_BATTERY   },\n\t{ \"nobattery\",    Joystick::POWER_NO_BATTERY   },\n\t{ \"charging\",     Joystick::POWER_CHARGING     },\n\t{ \"charged\",      Joystick::POWER_CHARGED      },\n}\nSTRINGMAP_CLASS_END(Joystick, Joystick::PowerType, Joystick::POWER_MAX_ENUM, powerState)\n\nSTRINGMAP_CLASS_BEGIN(Joystick, Joystick::ConnectionType, Joystick::CONNECTION_MAX_ENUM, connectionState)\n{\n\t{ \"unknown\",     Joystick::CONNECTION_UNKNOWN },\n\t{ \"wired\",       Joystick::CONNECTION_WIRED },\n\t{ \"wireless\",    Joystick::CONNECTION_WIRELESS },\n}\nSTRINGMAP_CLASS_END(Joystick, Joystick::ConnectionType, Joystick::CONNECTION_MAX_ENUM, connectionState)\n\n} // joystick\n} // love\n"
  },
  {
    "path": "src/modules/joystick/Joystick.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_JOYSTICK_JOYSTICK_H\n#define LOVE_JOYSTICK_JOYSTICK_H\n\n// LOVE\n#include \"common/Object.h\"\n#include \"common/StringMap.h\"\n#include \"common/int.h\"\n#include \"sensor/Sensor.h\"\n\n// stdlib\n#include <vector>\n#include <string>\n\nnamespace love\n{\nnamespace joystick\n{\n\nclass Joystick : public Object\n{\npublic:\n\n\tusing Sensor = love::sensor::Sensor;\n\n\tstatic love::Type type;\n\n\t// Joystick hat values.\n\tenum Hat\n\t{\n\t\tHAT_INVALID,\n\t\tHAT_CENTERED,\n\t\tHAT_UP,\n\t\tHAT_RIGHT,\n\t\tHAT_DOWN,\n\t\tHAT_LEFT,\n\t\tHAT_RIGHTUP,\n\t\tHAT_RIGHTDOWN,\n\t\tHAT_LEFTUP,\n\t\tHAT_LEFTDOWN,\n\t\tHAT_MAX_ENUM = 16\n\t};\n\n\tenum JoystickType\n\t{\n\t\tJOYSTICK_TYPE_UNKNOWN,\n\t\tJOYSTICK_TYPE_GAMEPAD,\n\t\tJOYSTICK_TYPE_WHEEL,\n\t\tJOYSTICK_TYPE_ARCADE_STICK,\n\t\tJOYSTICK_TYPE_FLIGHT_STICK,\n\t\tJOYSTICK_TYPE_DANCE_PAD,\n\t\tJOYSTICK_TYPE_GUITAR,\n\t\tJOYSTICK_TYPE_DRUM_KIT,\n\t\tJOYSTICK_TYPE_ARCADE_PAD,\n\t\tJOYSTICK_TYPE_THROTTLE,\n\t\tJOYSTICK_TYPE_MAX_ENUM\n\t};\n\n\tenum GamepadType\n\t{\n\t\tGAMEPAD_TYPE_UNKNOWN,\n\t\tGAMEPAD_TYPE_XBOX360,\n\t\tGAMEPAD_TYPE_XBOXONE,\n\t\tGAMEPAD_TYPE_PS3,\n\t\tGAMEPAD_TYPE_PS4,\n\t\tGAMEPAD_TYPE_PS5,\n\t\tGAMEPAD_TYPE_NINTENDO_SWITCH_PRO,\n\t\tGAMEPAD_TYPE_AMAZON_LUNA,\n\t\tGAMEPAD_TYPE_STADIA,\n\t\tGAMEPAD_TYPE_VIRTUAL,\n\t\tGAMEPAD_TYPE_NVIDIA_SHIELD,\n\t\tGAMEPAD_TYPE_JOYCON_LEFT,\n\t\tGAMEPAD_TYPE_JOYCON_RIGHT,\n\t\tGAMEPAD_TYPE_JOYCON_PAIR,\n\t\tGAMEPAD_TYPE_MAX_ENUM\n\t};\n\n\t// Valid Gamepad axes.\n\tenum GamepadAxis\n\t{\n\t\tGAMEPAD_AXIS_INVALID,\n\t\tGAMEPAD_AXIS_LEFTX,\n\t\tGAMEPAD_AXIS_LEFTY,\n\t\tGAMEPAD_AXIS_RIGHTX,\n\t\tGAMEPAD_AXIS_RIGHTY,\n\t\tGAMEPAD_AXIS_TRIGGERLEFT,\n\t\tGAMEPAD_AXIS_TRIGGERRIGHT,\n\t\tGAMEPAD_AXIS_MAX_ENUM\n\t};\n\n\t// Valid Gamepad buttons.\n\tenum GamepadButton\n\t{\n\t\tGAMEPAD_BUTTON_INVALID,\n\t\tGAMEPAD_BUTTON_A,\n\t\tGAMEPAD_BUTTON_B,\n\t\tGAMEPAD_BUTTON_X,\n\t\tGAMEPAD_BUTTON_Y,\n\t\tGAMEPAD_BUTTON_BACK,\n\t\tGAMEPAD_BUTTON_GUIDE,\n\t\tGAMEPAD_BUTTON_START,\n\t\tGAMEPAD_BUTTON_LEFTSTICK,\n\t\tGAMEPAD_BUTTON_RIGHTSTICK,\n\t\tGAMEPAD_BUTTON_LEFTSHOULDER,\n\t\tGAMEPAD_BUTTON_RIGHTSHOULDER,\n\t\tGAMEPAD_BUTTON_DPAD_UP,\n\t\tGAMEPAD_BUTTON_DPAD_DOWN,\n\t\tGAMEPAD_BUTTON_DPAD_LEFT,\n\t\tGAMEPAD_BUTTON_DPAD_RIGHT,\n\t\tGAMEPAD_BUTTON_MISC1, // Xbox Series X share button, PS5 mic button, Switch Pro capture button\n\t\tGAMEPAD_BUTTON_PADDLE1,\n\t\tGAMEPAD_BUTTON_PADDLE2,\n\t\tGAMEPAD_BUTTON_PADDLE3,\n\t\tGAMEPAD_BUTTON_PADDLE4,\n\t\tGAMEPAD_BUTTON_TOUCHPAD,\n\t\tGAMEPAD_BUTTON_MAX_ENUM\n\t};\n\n\t// Different types of inputs for a joystick.\n\tenum InputType\n\t{\n\t\tINPUT_TYPE_AXIS,\n\t\tINPUT_TYPE_BUTTON,\n\t\tINPUT_TYPE_HAT,\n\t\tINPUT_TYPE_MAX_ENUM\n\t};\n\n\tenum PowerType\n\t{\n\t\tPOWER_UNKNOWN,      /**< cannot determine power status */\n\t\tPOWER_ON_BATTERY,   /**< Not plugged in, running on the battery */\n\t\tPOWER_NO_BATTERY,   /**< Plugged in, no battery available */\n\t\tPOWER_CHARGING,     /**< Plugged in, charging battery */\n\t\tPOWER_CHARGED,       /**< Plugged in, battery charged */\n\t\tPOWER_MAX_ENUM\n\t};\n\n\tenum ConnectionType\n\t{\n\t\tCONNECTION_UNKNOWN,\n\t\tCONNECTION_WIRED,\n\t\tCONNECTION_WIRELESS,\n\t\tCONNECTION_MAX_ENUM\n\t};\n\n\t// Represents a gamepad input value, e.g. the \"x\" button or the left trigger.\n\tstruct GamepadInput\n\t{\n\t\tInputType type;\n\t\tunion\n\t\t{\n\t\t\tGamepadAxis axis;\n\t\t\tGamepadButton button;\n\t\t};\n\t};\n\n\t// Represents a joystick input value, e.g. button 6 or axis 1.\n\tstruct JoystickInput\n\t{\n\t\tInputType type;\n\t\tunion\n\t\t{\n\t\t\tint axis;\n\t\t\tint button;\n\t\t\tstruct\n\t\t\t{\n\t\t\t\tint index;\n\t\t\t\tHat value;\n\t\t\t} hat;\n\t\t};\n\t};\n\n\tvirtual ~Joystick() {}\n\n\tvirtual bool open(int64 deviceid) = 0;\n\tvirtual void close() = 0;\n\n\tvirtual bool isConnected() const = 0;\n\n\tvirtual const char *getName() const = 0;\n\n\tvirtual JoystickType getJoystickType() const = 0;\n\n\tvirtual int getAxisCount() const = 0;\n\tvirtual int getButtonCount() const = 0;\n\tvirtual int getHatCount() const = 0;\n\n\tvirtual float getAxis(int axisindex) const = 0;\n\tvirtual std::vector<float> getAxes() const = 0;\n\tvirtual Hat getHat(int hatindex) const = 0;\n\n\tvirtual bool isDown(const std::vector<int> &buttonlist) const = 0;\n\n\tvirtual void setPlayerIndex(int index) = 0;\n\tvirtual int getPlayerIndex() const = 0;\n\n\tvirtual bool openGamepad(int64 deviceid) = 0;\n\tvirtual bool isGamepad() const = 0;\n\n\tvirtual GamepadType getGamepadType() const = 0;\n\n\tvirtual float getGamepadAxis(GamepadAxis axis) const = 0;\n\tvirtual bool isGamepadDown(const std::vector<GamepadButton> &blist) const = 0;\n\n\tvirtual JoystickInput getGamepadMapping(const GamepadInput &input) const = 0;\n\tvirtual std::string getGamepadMappingString() const = 0;\n\n\tvirtual void *getHandle() const = 0;\n\n\tvirtual std::string getGUID() const = 0;\n\tvirtual int getInstanceID() const = 0;\n\tvirtual int getID() const = 0;\n\n\tvirtual void getDeviceInfo(int &vendorID, int &productID, int &productVersion) const = 0;\n\n\tvirtual bool isVibrationSupported() = 0;\n\tvirtual bool setVibration(float left, float right, float duration = -1.0f) = 0;\n\tvirtual bool setVibration() = 0;\n\tvirtual void getVibration(float &left, float &right) = 0;\n\n\tvirtual bool hasSensor(Sensor::SensorType type) const = 0;\n\tvirtual bool isSensorEnabled(Sensor::SensorType type) const = 0;\n\tvirtual void setSensorEnabled(Sensor::SensorType type, bool enabled) = 0;\n\tvirtual std::vector<float> getSensorData(Sensor::SensorType type) const = 0;\n\tvirtual PowerType getPowerInfo(int &batteryPercent) const = 0;\n\tvirtual ConnectionType getConnectionState() const = 0;\n\n\tSTRINGMAP_CLASS_DECLARE(Hat);\n\tSTRINGMAP_CLASS_DECLARE(JoystickType);\n\tSTRINGMAP_CLASS_DECLARE(GamepadType);\n\tSTRINGMAP_CLASS_DECLARE(GamepadAxis);\n\tSTRINGMAP_CLASS_DECLARE(GamepadButton);\n\tSTRINGMAP_CLASS_DECLARE(InputType);\n\tSTRINGMAP_CLASS_DECLARE(PowerType);\n\tSTRINGMAP_CLASS_DECLARE(ConnectionType);\n\n\tstatic float clampval(float x);\n\n}; // Joystick\n\n} // joystick\n} // love\n\n\n#endif // LOVE_JOYSTICK_JOYSTICK_H\n"
  },
  {
    "path": "src/modules/joystick/JoystickModule.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_JOYSTICK_JOYSTICK_MODULE_H\n#define LOVE_JOYSTICK_JOYSTICK_MODULE_H\n\n// LOVE\n#include \"common/Module.h\"\n#include \"Joystick.h\"\n\nnamespace love\n{\nnamespace joystick\n{\n\nclass JoystickModule : public Module\n{\npublic:\n\n\tvirtual ~JoystickModule() {}\n\n\t/**\n\t * Adds a connected Joystick device and opens it for use.\n\t * Returns NULL if the Joystick could not be added.\n\t **/\n\tvirtual Joystick *addJoystick(int64 deviceid) = 0;\n\n\t/**\n\t * Removes a disconnected Joystick device.\n\t **/\n\tvirtual void removeJoystick(Joystick *joystick) = 0;\n\n\t/**\n\t * Gets a connected Joystick from its unique Instance ID.\n\t * Returns NULL if the instance ID does not correspond to a connected stick.\n\t **/\n\tvirtual Joystick *getJoystickFromID(int instanceid) = 0;\n\n\t/**\n\t * Gets a connected Joystick.\n\t * Returns NULL if joyindex is not in the range of [0, getJoystickCount()).\n\t **/\n\tvirtual Joystick *getJoystick(int joyindex) = 0;\n\n\t/**\n\t * Gets the index of a connected joystick.\n\t * Returns -1 if the joystick is not connected.\n\t **/\n\tvirtual int getIndex(const Joystick *joystick) = 0;\n\n\t/**\n\t * Gets the number of currently connected Joysticks.\n\t **/\n\tvirtual int getJoystickCount() const = 0;\n\n\t/**\n\t * Sets the virtual Gamepad mapping for a joystick input value for all\n\t * joystick devices with the specified joystick product GUID.\n\t * If any joysticks with the specified GUID are connected, they will be\n\t * added as Gamepads if they aren't already, otherwise their Gamepad mapping\n\t * will be updated.\n\t **/\n\tvirtual bool setGamepadMapping(const std::string &pguid, Joystick::GamepadInput gpinput, Joystick::JoystickInput joyinput) = 0;\n\n\t/**\n\t * Loads a newline-separated list of virtual Gamepad mapping strings for\n\t * multiple joysticks at a time. The mapping strings must have been\n\t * generated with saveGamepadMappings, via Steam, or some other tool which\n\t * generates SDL GameController mappings.\n\t **/\n\tvirtual void loadGamepadMappings(const std::string &mappings) = 0;\n\n\t/**\n\t * Gets a newline-separated list of virtual Gamepad mapping strings for\n\t * all used or modified Joysticks which are identified as Gamepads.\n\t **/\n\tvirtual std::string saveGamepadMappings() = 0;\n\n\t/**\n\t * Gets the gamepad mapping string for the given GUID.\n\t **/\n\tvirtual std::string getGamepadMappingString(const std::string &guid) const = 0;\n\nprotected:\n\n\tJoystickModule(const char *name)\n\t\t: Module(M_JOYSTICK, name)\n\t{}\n\n}; // JoystickModule\n\n} // joystick\n} // love\n\n#endif // LOVE_JOYSTICK_JOYSTICK_MODULE_H\n"
  },
  {
    "path": "src/modules/joystick/sdl/Joystick.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"common/config.h\"\n#include \"Joystick.h\"\n#include \"common/int.h\"\n#include \"sensor/sdl/Sensor.h\"\n\n// SDL\n#include <SDL3/SDL_guid.h>\n\n// C++\n#include <algorithm>\n#include <limits>\n\nnamespace love\n{\nnamespace joystick\n{\nnamespace sdl\n{\n\nJoystick::Joystick(int id)\n\t: joyhandle(nullptr)\n\t, controller(nullptr)\n\t, joystickType(JOYSTICK_TYPE_UNKNOWN)\n\t, gamepadType(GAMEPAD_TYPE_UNKNOWN)\n\t, instanceid(-1)\n\t, id(id)\n{\n}\n\nJoystick::~Joystick()\n{\n\tclose();\n}\n\nbool Joystick::open(int64 deviceid)\n{\n\tclose();\n\n\tjoyhandle = SDL_OpenJoystick((SDL_JoystickID) deviceid);\n\n\tif (joyhandle)\n\t{\n\t\tinstanceid = SDL_GetJoystickID(joyhandle);\n\n\t\t// SDL_JoystickGetGUIDString uses 32 bytes plus the null terminator.\n\t\tchar cstr[33];\n\n\t\tSDL_GUID sdlguid = SDL_GetJoystickGUID(joyhandle);\n\t\tSDL_GUIDToString(sdlguid, cstr, (int) sizeof(cstr));\n\n\t\tpguid = std::string(cstr);\n\n\t\t// See if SDL thinks this is a Game Controller.\n\t\topenGamepad(deviceid);\n\n\t\t// Prefer the Joystick name for consistency.\n\t\tconst char *joyname = SDL_GetJoystickName(joyhandle);\n\t\tif (!joyname && controller)\n\t\t\tjoyname = SDL_GetGamepadName(controller);\n\n\t\tif (joyname)\n\t\t\tname = joyname;\n\n\t\tswitch (SDL_GetJoystickType(joyhandle))\n\t\t{\n\t\tcase SDL_JOYSTICK_TYPE_GAMEPAD:\n\t\t\tjoystickType = JOYSTICK_TYPE_GAMEPAD;\n\t\t\tbreak;\n\t\tcase SDL_JOYSTICK_TYPE_WHEEL:\n\t\t\tjoystickType = JOYSTICK_TYPE_WHEEL;\n\t\t\tbreak;\n\t\tcase SDL_JOYSTICK_TYPE_ARCADE_STICK:\n\t\t\tjoystickType = JOYSTICK_TYPE_ARCADE_STICK;\n\t\t\tbreak;\n\t\tcase SDL_JOYSTICK_TYPE_FLIGHT_STICK:\n\t\t\tjoystickType = JOYSTICK_TYPE_FLIGHT_STICK;\n\t\t\tbreak;\n\t\tcase SDL_JOYSTICK_TYPE_DANCE_PAD:\n\t\t\tjoystickType = JOYSTICK_TYPE_DANCE_PAD;\n\t\t\tbreak;\n\t\tcase SDL_JOYSTICK_TYPE_GUITAR:\n\t\t\tjoystickType = JOYSTICK_TYPE_GUITAR;\n\t\t\tbreak;\n\t\tcase SDL_JOYSTICK_TYPE_DRUM_KIT:\n\t\t\tjoystickType = JOYSTICK_TYPE_DRUM_KIT;\n\t\t\tbreak;\n\t\tcase SDL_JOYSTICK_TYPE_ARCADE_PAD:\n\t\t\tjoystickType = JOYSTICK_TYPE_ARCADE_PAD;\n\t\t\tbreak;\n\t\tcase SDL_JOYSTICK_TYPE_THROTTLE:\n\t\t\tjoystickType = JOYSTICK_TYPE_THROTTLE;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tjoystickType = JOYSTICK_TYPE_UNKNOWN;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (controller != nullptr)\n\t\t{\n\t\t\tswitch (SDL_GetGamepadType(controller))\n\t\t\t{\n\t\t\tcase SDL_GAMEPAD_TYPE_UNKNOWN:\n\t\t\t\tgamepadType = GAMEPAD_TYPE_UNKNOWN;\n\t\t\t\tbreak;\n\t\t\tcase SDL_GAMEPAD_TYPE_XBOX360:\n\t\t\t\tgamepadType = GAMEPAD_TYPE_XBOX360;\n\t\t\t\tbreak;\n\t\t\tcase SDL_GAMEPAD_TYPE_XBOXONE:\n\t\t\t\tgamepadType = GAMEPAD_TYPE_XBOXONE;\n\t\t\t\tbreak;\n\t\t\tcase SDL_GAMEPAD_TYPE_PS3:\n\t\t\t\tgamepadType = GAMEPAD_TYPE_PS3;\n\t\t\t\tbreak;\n\t\t\tcase SDL_GAMEPAD_TYPE_PS4:\n\t\t\t\tgamepadType = GAMEPAD_TYPE_PS4;\n\t\t\t\tbreak;\n\t\t\tcase SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_PRO:\n\t\t\t\tgamepadType = GAMEPAD_TYPE_NINTENDO_SWITCH_PRO;\n\t\t\t\tbreak;\n\t\t\tcase SDL_GAMEPAD_TYPE_PS5:\n\t\t\t\tgamepadType = GAMEPAD_TYPE_PS5;\n\t\t\t\tbreak;\n\t\t\tcase SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_LEFT:\n\t\t\t\tgamepadType = GAMEPAD_TYPE_JOYCON_LEFT;\n\t\t\t\tbreak;\n\t\t\tcase SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT:\n\t\t\t\tgamepadType = GAMEPAD_TYPE_JOYCON_RIGHT;\n\t\t\t\tbreak;\n\t\t\tcase SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_PAIR:\n\t\t\t\tgamepadType = GAMEPAD_TYPE_JOYCON_PAIR;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tgamepadType = GAMEPAD_TYPE_UNKNOWN;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tgamepadType = GAMEPAD_TYPE_UNKNOWN;\n\t}\n\n\treturn isConnected();\n}\n\nvoid Joystick::close()\n{\n\tif (controller)\n\t\tSDL_CloseGamepad(controller);\n\n\tif (joyhandle)\n\t\tSDL_CloseJoystick(joyhandle);\n\n\tjoyhandle = nullptr;\n\tcontroller = nullptr;\n\tinstanceid = -1;\n}\n\nbool Joystick::isConnected() const\n{\n\treturn joyhandle != nullptr && SDL_JoystickConnected(joyhandle);\n}\n\nconst char *Joystick::getName() const\n{\n\treturn name.c_str();\n}\n\nJoystick::JoystickType Joystick::getJoystickType() const\n{\n\treturn joystickType;\n}\n\nint Joystick::getAxisCount() const\n{\n\treturn isConnected() ? SDL_GetNumJoystickAxes(joyhandle) : 0;\n}\n\nint Joystick::getButtonCount() const\n{\n\treturn isConnected() ? SDL_GetNumJoystickButtons(joyhandle) : 0;\n}\n\nint Joystick::getHatCount() const\n{\n\treturn isConnected() ? SDL_GetNumJoystickHats(joyhandle) : 0;\n}\n\nfloat Joystick::getAxis(int axisindex) const\n{\n\tif (!isConnected() || axisindex < 0 || axisindex >= getAxisCount())\n\t\treturn 0;\n\n\treturn clampval(((float) SDL_GetJoystickAxis(joyhandle, axisindex))/32768.0f);\n}\n\nstd::vector<float> Joystick::getAxes() const\n{\n\tstd::vector<float> axes;\n\tint count = getAxisCount();\n\n\tif (!isConnected() || count <= 0)\n\t\treturn axes;\n\n\taxes.reserve(count);\n\n\tfor (int i = 0; i < count; i++)\n\t\taxes.push_back(clampval(((float) SDL_GetJoystickAxis(joyhandle, i))/32768.0f));\n\n\treturn axes;\n}\n\nJoystick::Hat Joystick::getHat(int hatindex) const\n{\n\tHat h = HAT_INVALID;\n\n\tif (!isConnected() || hatindex < 0 || hatindex >= getHatCount())\n\t\treturn h;\n\n\tgetConstant(SDL_GetJoystickHat(joyhandle, hatindex), h);\n\n\treturn h;\n}\n\nbool Joystick::isDown(const std::vector<int> &buttonlist) const\n{\n\tif (!isConnected())\n\t\treturn false;\n\n\tint numbuttons = getButtonCount();\n\n\tfor (int button : buttonlist)\n\t{\n\t\tif (button < 0 || button >= numbuttons)\n\t\t\tcontinue;\n\n\t\tif (SDL_GetJoystickButton(joyhandle, button))\n\t\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nvoid Joystick::setPlayerIndex(int index)\n{\n\tif (!isConnected())\n\t\treturn;\n\n\tSDL_SetJoystickPlayerIndex(joyhandle, index);\n}\n\nint Joystick::getPlayerIndex() const\n{\n\tif (!isConnected())\n\t\treturn -1;\n\n\treturn SDL_GetJoystickPlayerIndex(joyhandle);\n}\n\nbool Joystick::openGamepad(int64 deviceid)\n{\n\tif (!SDL_IsGamepad((SDL_JoystickID)deviceid))\n\t\treturn false;\n\n\tif (isGamepad())\n\t{\n\t\tSDL_CloseGamepad(controller);\n\t\tcontroller = nullptr;\n\t}\n\n\tcontroller = SDL_OpenGamepad((SDL_JoystickID)deviceid);\n\treturn isGamepad();\n}\n\nbool Joystick::isGamepad() const\n{\n\treturn controller != nullptr;\n}\n\nJoystick::GamepadType Joystick::getGamepadType() const\n{\n\treturn gamepadType;\n}\n\nfloat Joystick::getGamepadAxis(love::joystick::Joystick::GamepadAxis axis) const\n{\n\tif (!isConnected() || !isGamepad())\n\t\treturn 0.f;\n\n\tSDL_GamepadAxis sdlaxis;\n\tif (!getConstant(axis, sdlaxis))\n\t\treturn 0.f;\n\n\tSint16 value = SDL_GetGamepadAxis(controller, sdlaxis);\n\n\treturn clampval((float) value / 32768.0f);\n}\n\nbool Joystick::isGamepadDown(const std::vector<GamepadButton> &blist) const\n{\n\tif (!isConnected() || !isGamepad())\n\t\treturn false;\n\n\tSDL_GamepadButton sdlbutton;\n\n\tfor (GamepadButton button : blist)\n\t{\n\t\tif (!getConstant(button, sdlbutton))\n\t\t\tcontinue;\n\n\t\tif (SDL_GetGamepadButton(controller, sdlbutton))\n\t\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nJoystick::JoystickInput Joystick::getGamepadMapping(const GamepadInput &input) const\n{\n\tJoystick::JoystickInput jinput;\n\tjinput.type = INPUT_TYPE_MAX_ENUM;\n\n\tif (!isGamepad())\n\t\treturn jinput;\n\n\tSDL_GamepadButton sdlbutton = SDL_GAMEPAD_BUTTON_INVALID;\n\tSDL_GamepadAxis sdlaxis = SDL_GAMEPAD_AXIS_INVALID;\n\n\tswitch (input.type)\n\t{\n\tcase INPUT_TYPE_BUTTON:\n\t\tgetConstant(input.button, sdlbutton);\n\t\tbreak;\n\tcase INPUT_TYPE_AXIS:\n\t\tgetConstant(input.axis, sdlaxis);\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\n\tint bindcount = 0;\n\tSDL_GamepadBinding **sdlbindings = SDL_GetGamepadBindings(controller, &bindcount);\n\tfor (int i = 0; i < bindcount; i++)\n\t{\n\t\tconst SDL_GamepadBinding *b = sdlbindings[i];\n\t\tif ((input.type == INPUT_TYPE_BUTTON && b->output_type == SDL_GAMEPAD_BINDTYPE_BUTTON && b->output.button == sdlbutton)\n\t\t\t|| (input.type == INPUT_TYPE_AXIS && b->output_type == SDL_GAMEPAD_BINDTYPE_AXIS && b->output.axis.axis == sdlaxis))\n\t\t{\n\t\t\tswitch (b->input_type)\n\t\t\t{\n\t\t\tcase SDL_GAMEPAD_BINDTYPE_BUTTON:\n\t\t\t\tjinput.type = INPUT_TYPE_BUTTON;\n\t\t\t\tjinput.button = b->input.button;\n\t\t\t\tbreak;\n\t\t\tcase SDL_GAMEPAD_BINDTYPE_AXIS:\n\t\t\t\tjinput.type = INPUT_TYPE_AXIS;\n\t\t\t\tjinput.axis = b->input.axis.axis;\n\t\t\t\tbreak;\n\t\t\tcase SDL_GAMEPAD_BINDTYPE_HAT:\n\t\t\t\tif (getConstant(b->input.hat.hat_mask, jinput.hat.value))\n\t\t\t\t{\n\t\t\t\t\tjinput.type = INPUT_TYPE_HAT;\n\t\t\t\t\tjinput.hat.index = b->input.hat.hat;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase SDL_GAMEPAD_BINDTYPE_NONE:\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tSDL_free(sdlbindings);\n\n\treturn jinput;\n}\n\nstd::string Joystick::getGamepadMappingString() const\n{\n\tchar *sdlmapping = nullptr;\n\n\tif (controller != nullptr)\n\t\tsdlmapping = SDL_GetGamepadMapping(controller);\n\n\tif (sdlmapping == nullptr)\n\t{\n\t\tSDL_GUID sdlguid = SDL_StringToGUID(pguid.c_str());\n\t\tsdlmapping = SDL_GetGamepadMappingForGUID(sdlguid);\n\t}\n\n\tif (sdlmapping == nullptr)\n\t\treturn \"\";\n\n\tstd::string mappingstr(sdlmapping);\n\tSDL_free(sdlmapping);\n\n\t// Matches SDL_GameControllerAddMappingsFromRW.\n\tif (mappingstr.find_last_of(',') != mappingstr.length() - 1)\n\t\tmappingstr += \",\";\n\n\tif (mappingstr.find(\"platform:\") == std::string::npos)\n\t\tmappingstr += \"platform:\" + std::string(SDL_GetPlatform());\n\n\treturn mappingstr;\n}\n\nvoid *Joystick::getHandle() const\n{\n\treturn joyhandle;\n}\n\nstd::string Joystick::getGUID() const\n{\n\t// SDL2's GUIDs identify *classes* of devices, instead of unique devices.\n\treturn pguid;\n}\n\nint Joystick::getInstanceID() const\n{\n\treturn instanceid;\n}\n\nint Joystick::getID() const\n{\n\treturn id;\n}\n\nvoid Joystick::getDeviceInfo(int &vendorID, int &productID, int &productVersion) const\n{\n\tif (joyhandle != nullptr)\n\t{\n\t\tvendorID = SDL_GetJoystickVendor(joyhandle);\n\t\tproductID = SDL_GetJoystickProduct(joyhandle);\n\t\tproductVersion = SDL_GetJoystickProductVersion(joyhandle);\n\t}\n\telse\n\t{\n\t\tvendorID = 0;\n\t\tproductID = 0;\n\t\tproductVersion = 0;\n\t}\n}\n\nJoystick::PowerType Joystick::getPowerInfo(int& batteryPercent) const\n{\n\t// Gets the battery state of a joystick/gamepad\n\tJoystick::PowerType powerState = Joystick::PowerType::POWER_UNKNOWN;\n\tSDL_PowerState batteryState;\n\n\tif (!isConnected())\n\t\treturn powerState;\n\n\tbatteryState = SDL_GetJoystickPowerInfo(joyhandle, &batteryPercent);\n\n\tgetConstant(batteryState, powerState);\n\treturn powerState;\n}\n\nJoystick::ConnectionType Joystick::getConnectionState() const\n{\n\t// Gets the connection state of a joystick/gamepad (wired / wireless etc)\n\tJoystick::ConnectionType connectionState = Joystick::ConnectionType::CONNECTION_UNKNOWN;\n\tSDL_JoystickConnectionState sdlConnectionState;\n\n\tif (!isConnected())\n\t\treturn connectionState;\n\n\tsdlConnectionState = SDL_GetJoystickConnectionState(joyhandle);\n\n\tgetConstant(sdlConnectionState, connectionState);\n\treturn connectionState;\n}\n\nbool Joystick::isVibrationSupported()\n{\n\tif (!isConnected())\n\t\treturn false;\n\n\tSDL_PropertiesID props = SDL_GetJoystickProperties(joyhandle);\n\treturn SDL_GetBooleanProperty(props, SDL_PROP_JOYSTICK_CAP_RUMBLE_BOOLEAN, false);\n}\n\nbool Joystick::setVibration(float left, float right, float duration)\n{\n\tleft = std::min(std::max(left, 0.0f), 1.0f);\n\tright = std::min(std::max(right, 0.0f), 1.0f);\n\n\tif (left == 0.0f && right == 0.0f)\n\t\treturn setVibration();\n\n\tif (!isConnected())\n\t\treturn false;\n\n\tUint32 length = LOVE_UINT32_MAX;\n\tif (duration >= 0.0f)\n\t{\n\t\tfloat maxduration = (float) (std::numeric_limits<Uint32>::max() / 1000.0);\n\t\tlength = Uint32(std::min(duration, maxduration) * 1000);\n\t}\n\n\treturn SDL_RumbleJoystick(joyhandle, (Uint16)(left * LOVE_UINT16_MAX), (Uint16)(right * LOVE_UINT16_MAX), length);\n}\n\nbool Joystick::setVibration()\n{\n\treturn isConnected() && SDL_RumbleJoystick(joyhandle, 0, 0, 0);\n}\n\nvoid Joystick::getVibration(float &left, float &right)\n{\n\t// Deprecated.\n\tleft = 0.0f;\n\tright = 0.0f;\n}\n\nbool Joystick::hasSensor(Sensor::SensorType type) const\n{\n#if defined(LOVE_ENABLE_SENSOR)\n\tusing SDLSensor = love::sensor::sdl::Sensor;\n\n\tif (!isGamepad())\n\t\treturn false;\n\n\treturn SDL_GamepadHasSensor(controller, SDLSensor::convert(type));\n#else\n\treturn false;\n#endif\n}\n\nbool Joystick::isSensorEnabled(Sensor::SensorType type) const\n{\n#if defined(LOVE_ENABLE_SENSOR)\n\tusing SDLSensor = love::sensor::sdl::Sensor;\n\n\tif (!isGamepad())\n\t\treturn false;\n\n\treturn SDL_GamepadSensorEnabled(controller, SDLSensor::convert(type));\n#else\n\treturn false;\n#endif\n}\n\nvoid Joystick::setSensorEnabled(Sensor::SensorType type, bool enabled)\n{\n#if defined(LOVE_ENABLE_SENSOR)\n\tusing SDLSensor = love::sensor::sdl::Sensor;\n\n\tif (!isGamepad())\n\t\tthrow love::Exception(\"Sensor is only supported on gamepad\");\n\n\tif (!SDL_SetGamepadSensorEnabled(controller, SDLSensor::convert(type), enabled))\n\t{\n\t\tconst char *name = nullptr;\n\t\tSDLSensor::getConstant(type, name);\n\n\t\tthrow love::Exception(\"Could not open \\\"%s\\\" SDL gamepad sensor (%s)\", name, SDL_GetError());\n\t}\n#else\n\tthrow love::Exception(\"Compiled version of LOVE does not support gamepad sensor\");\n#endif\n}\n\nstd::vector<float> Joystick::getSensorData(Sensor::SensorType type) const\n{\n#if defined(LOVE_ENABLE_SENSOR)\n\tusing SDLSensor = love::sensor::sdl::Sensor;\n\n\tif (!isGamepad())\n\t\tthrow love::Exception(\"Sensor is only supported on gamepad\");\n\n\tstd::vector<float> data(3);\n\n\tif (!isSensorEnabled(type))\n\t{\n\t\tconst char *name = nullptr;\n\t\tSDLSensor::getConstant(type, name);\n\n\t\tthrow love::Exception(\"\\\"%s\\\" gamepad sensor is not enabled\", name);\n\t}\n\n\tif (!SDL_GetGamepadSensorData(controller, SDLSensor::convert(type), data.data(), (int) data.size()))\n\t{\n\t\tconst char *name = nullptr;\n\t\tSDLSensor::getConstant(type, name);\n\n\t\tthrow love::Exception(\"Could not get \\\"%s\\\" SDL gamepad sensor data (%s)\", name, SDL_GetError());\n\t}\n\n\treturn data;\n#else\n\tthrow love::Exception(\"Compiled version of LOVE does not support gamepad sensor\");\n#endif\n}\n\nbool Joystick::getConstant(Uint8 in, Joystick::Hat &out)\n{\n\treturn hats.find(in, out);\n}\n\nbool Joystick::getConstant(Joystick::Hat in, Uint8 &out)\n{\n\treturn hats.find(in, out);\n}\n\nbool Joystick::getConstant(SDL_GamepadAxis in, Joystick::GamepadAxis &out)\n{\n\treturn gpAxes.find(in, out);\n}\n\nbool Joystick::getConstant(Joystick::GamepadAxis in, SDL_GamepadAxis &out)\n{\n\treturn gpAxes.find(in, out);\n}\n\nbool Joystick::getConstant(SDL_GamepadButton in, Joystick::GamepadButton &out)\n{\n\treturn gpButtons.find(in, out);\n}\n\nbool Joystick::getConstant(Joystick::GamepadButton in, SDL_GamepadButton &out)\n{\n\treturn gpButtons.find(in, out);\n}\n\nbool Joystick::getConstant(SDL_PowerState in, Joystick::PowerType &out)\n{\n\treturn powerStates.find(in, out);\n}\n\nbool Joystick::getConstant(Joystick::PowerType in, SDL_PowerState &out)\n{\n\treturn powerStates.find(in, out);\n}\n\nbool Joystick::getConstant(SDL_JoystickConnectionState in, Joystick::ConnectionType &out)\n{\n\treturn connectionStates.find(in, out);\n}\n\nbool Joystick::getConstant(Joystick::ConnectionType in, SDL_JoystickConnectionState &out)\n{\n\treturn connectionStates.find(in, out);\n}\n\nEnumMap<Joystick::Hat, Uint8, Joystick::HAT_MAX_ENUM>::Entry Joystick::hatEntries[] =\n{\n\t{Joystick::HAT_CENTERED, SDL_HAT_CENTERED},\n\t{Joystick::HAT_UP, SDL_HAT_UP},\n\t{Joystick::HAT_RIGHT, SDL_HAT_RIGHT},\n\t{Joystick::HAT_DOWN, SDL_HAT_DOWN},\n\t{Joystick::HAT_LEFT, SDL_HAT_LEFT},\n\t{Joystick::HAT_RIGHTUP, SDL_HAT_RIGHTUP},\n\t{Joystick::HAT_RIGHTDOWN, SDL_HAT_RIGHTDOWN},\n\t{Joystick::HAT_LEFTUP, SDL_HAT_LEFTUP},\n\t{Joystick::HAT_LEFTDOWN, SDL_HAT_LEFTDOWN},\n};\n\nEnumMap<Joystick::Hat, Uint8, Joystick::HAT_MAX_ENUM> Joystick::hats(Joystick::hatEntries, sizeof(Joystick::hatEntries));\n\nEnumMap<Joystick::GamepadAxis, SDL_GamepadAxis, Joystick::GAMEPAD_AXIS_MAX_ENUM>::Entry Joystick::gpAxisEntries[] =\n{\n\t{Joystick::GAMEPAD_AXIS_LEFTX, SDL_GAMEPAD_AXIS_LEFTX},\n\t{Joystick::GAMEPAD_AXIS_LEFTY, SDL_GAMEPAD_AXIS_LEFTY},\n\t{Joystick::GAMEPAD_AXIS_RIGHTX, SDL_GAMEPAD_AXIS_RIGHTX},\n\t{Joystick::GAMEPAD_AXIS_RIGHTY, SDL_GAMEPAD_AXIS_RIGHTY},\n\t{Joystick::GAMEPAD_AXIS_TRIGGERLEFT, SDL_GAMEPAD_AXIS_LEFT_TRIGGER},\n\t{Joystick::GAMEPAD_AXIS_TRIGGERRIGHT, SDL_GAMEPAD_AXIS_RIGHT_TRIGGER},\n};\n\nEnumMap<Joystick::GamepadAxis, SDL_GamepadAxis, Joystick::GAMEPAD_AXIS_MAX_ENUM> Joystick::gpAxes(Joystick::gpAxisEntries, sizeof(Joystick::gpAxisEntries));\n\nEnumMap<Joystick::GamepadButton, SDL_GamepadButton, Joystick::GAMEPAD_BUTTON_MAX_ENUM>::Entry Joystick::gpButtonEntries[] =\n{\n\t{Joystick::GAMEPAD_BUTTON_A, SDL_GAMEPAD_BUTTON_SOUTH},\n\t{Joystick::GAMEPAD_BUTTON_B, SDL_GAMEPAD_BUTTON_EAST},\n\t{Joystick::GAMEPAD_BUTTON_X, SDL_GAMEPAD_BUTTON_WEST},\n\t{Joystick::GAMEPAD_BUTTON_Y, SDL_GAMEPAD_BUTTON_NORTH},\n\t{Joystick::GAMEPAD_BUTTON_BACK, SDL_GAMEPAD_BUTTON_BACK},\n\t{Joystick::GAMEPAD_BUTTON_GUIDE, SDL_GAMEPAD_BUTTON_GUIDE},\n\t{Joystick::GAMEPAD_BUTTON_START, SDL_GAMEPAD_BUTTON_START},\n\t{Joystick::GAMEPAD_BUTTON_LEFTSTICK, SDL_GAMEPAD_BUTTON_LEFT_STICK},\n\t{Joystick::GAMEPAD_BUTTON_RIGHTSTICK, SDL_GAMEPAD_BUTTON_RIGHT_STICK},\n\t{Joystick::GAMEPAD_BUTTON_LEFTSHOULDER, SDL_GAMEPAD_BUTTON_LEFT_SHOULDER},\n\t{Joystick::GAMEPAD_BUTTON_RIGHTSHOULDER, SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER},\n\t{Joystick::GAMEPAD_BUTTON_DPAD_UP, SDL_GAMEPAD_BUTTON_DPAD_UP},\n\t{Joystick::GAMEPAD_BUTTON_DPAD_DOWN, SDL_GAMEPAD_BUTTON_DPAD_DOWN},\n\t{Joystick::GAMEPAD_BUTTON_DPAD_LEFT, SDL_GAMEPAD_BUTTON_DPAD_LEFT},\n\t{Joystick::GAMEPAD_BUTTON_DPAD_RIGHT, SDL_GAMEPAD_BUTTON_DPAD_RIGHT},\n\t{Joystick::GAMEPAD_BUTTON_MISC1, SDL_GAMEPAD_BUTTON_MISC1},\n\t{Joystick::GAMEPAD_BUTTON_PADDLE1, SDL_GAMEPAD_BUTTON_LEFT_PADDLE1},\n\t{Joystick::GAMEPAD_BUTTON_PADDLE2, SDL_GAMEPAD_BUTTON_LEFT_PADDLE2},\n\t{Joystick::GAMEPAD_BUTTON_PADDLE3, SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1},\n\t{Joystick::GAMEPAD_BUTTON_PADDLE4, SDL_GAMEPAD_BUTTON_RIGHT_PADDLE2},\n\t{Joystick::GAMEPAD_BUTTON_TOUCHPAD, SDL_GAMEPAD_BUTTON_TOUCHPAD},\n};\n\nEnumMap<Joystick::GamepadButton, SDL_GamepadButton, Joystick::GAMEPAD_BUTTON_MAX_ENUM> Joystick::gpButtons(Joystick::gpButtonEntries, sizeof(Joystick::gpButtonEntries));\n\nEnumMap<Joystick::PowerType, SDL_PowerState, Joystick::POWER_MAX_ENUM>::Entry Joystick::powerEntries[] =\n{\n\t{Joystick::POWER_UNKNOWN, SDL_POWERSTATE_UNKNOWN},\n\t{Joystick::POWER_ON_BATTERY, SDL_POWERSTATE_ON_BATTERY},\n\t{Joystick::POWER_NO_BATTERY, SDL_POWERSTATE_NO_BATTERY},\n\t{Joystick::POWER_CHARGING, SDL_POWERSTATE_CHARGING},\n\t{Joystick::POWER_CHARGED, SDL_POWERSTATE_CHARGED},\n};\n\nEnumMap<Joystick::PowerType, SDL_PowerState, Joystick::POWER_MAX_ENUM> Joystick::powerStates(Joystick::powerEntries, sizeof(Joystick::powerEntries));\n\nEnumMap<Joystick::ConnectionType, SDL_JoystickConnectionState, Joystick::CONNECTION_MAX_ENUM>::Entry Joystick::connectionStateEntries[] =\n{\n\t{Joystick::CONNECTION_UNKNOWN, SDL_JOYSTICK_CONNECTION_UNKNOWN},\n\t{Joystick::CONNECTION_WIRED, SDL_JOYSTICK_CONNECTION_WIRED},\n\t{Joystick::CONNECTION_WIRELESS, SDL_JOYSTICK_CONNECTION_WIRELESS},\n};\n\nEnumMap<Joystick::ConnectionType, SDL_JoystickConnectionState, Joystick::CONNECTION_MAX_ENUM> Joystick::connectionStates(Joystick::connectionStateEntries, sizeof(Joystick::connectionStateEntries));\n\n} // sdl\n} // joystick\n} // love\n"
  },
  {
    "path": "src/modules/joystick/sdl/Joystick.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_JOYSTICK_SDL_JOYSTICK_H\n#define LOVE_JOYSTICK_SDL_JOYSTICK_H\n\n// LOVE\n#include \"joystick/Joystick.h\"\n#include \"common/EnumMap.h\"\n#include \"common/int.h\"\n\n// SDL\n#include <SDL3/SDL.h>\n\nnamespace love\n{\nnamespace joystick\n{\nnamespace sdl\n{\n\nclass Joystick : public love::joystick::Joystick\n{\npublic:\n\n\tJoystick(int id);\n\n\tvirtual ~Joystick();\n\n\tbool open(int64 deviceid) override;\n\tvoid close() override;\n\n\tbool isConnected() const override;\n\n\tconst char *getName() const override;\n\n\tJoystickType getJoystickType() const override;\n\n\tint getAxisCount() const override;\n\tint getButtonCount() const override;\n\tint getHatCount() const override;\n\n\tfloat getAxis(int axisindex) const override;\n\tstd::vector<float> getAxes() const override;\n\tHat getHat(int hatindex) const override;\n\n\tbool isDown(const std::vector<int> &buttonlist) const override;\n\n\tvoid setPlayerIndex(int index) override;\n\tint getPlayerIndex() const override;\n\n\tbool openGamepad(int64 deviceid) override;\n\tbool isGamepad() const override;\n\n\tGamepadType getGamepadType() const override;\n\n\tfloat getGamepadAxis(GamepadAxis axis) const override;\n\tbool isGamepadDown(const std::vector<GamepadButton> &blist) const override;\n\n\tJoystickInput getGamepadMapping(const GamepadInput &input) const override;\n\tstd::string getGamepadMappingString() const override;\n\n\tvoid *getHandle() const override;\n\n\tstd::string getGUID() const override;\n\tint getInstanceID() const override;\n\tint getID() const override;\n\n\tvoid getDeviceInfo(int &vendorID, int &productID, int &productVersion) const override;\n\tPowerType getPowerInfo(int& batteryPercent) const override;\n\tConnectionType getConnectionState() const override;\n\n\tbool isVibrationSupported() override;\n\tbool setVibration(float left, float right, float duration = -1.0f) override;\n\tbool setVibration() override;\n\tvoid getVibration(float &left, float &right) override;\n\n\tbool hasSensor(Sensor::SensorType type) const override;\n\tbool isSensorEnabled(Sensor::SensorType type) const override;\n\tvoid setSensorEnabled(Sensor::SensorType type, bool enabled) override;\n\tstd::vector<float> getSensorData(Sensor::SensorType type) const override;\n\n\tstatic bool getConstant(Hat in, Uint8 &out);\n\tstatic bool getConstant(Uint8 in, Hat &out);\n\n\tstatic bool getConstant(SDL_GamepadAxis in, GamepadAxis &out);\n\tstatic bool getConstant(GamepadAxis in, SDL_GamepadAxis &out);\n\n\tstatic bool getConstant(SDL_GamepadButton in, GamepadButton &out);\n\tstatic bool getConstant(GamepadButton in, SDL_GamepadButton &out);\n\n\tstatic bool getConstant(SDL_PowerState in, PowerType &out);\n\tstatic bool getConstant(PowerType in, SDL_PowerState &out);\n\n\tstatic bool getConstant(SDL_JoystickConnectionState in, ConnectionType &out);\n\tstatic bool getConstant(ConnectionType in, SDL_JoystickConnectionState &out);\n\nprivate:\n\n\tJoystick() {}\n\n\tSDL_Joystick *joyhandle;\n\tSDL_Gamepad *controller;\n\n\tJoystickType joystickType;\n\tGamepadType gamepadType;\n\n\tSDL_JoystickID instanceid;\n\tstd::string pguid;\n\tint id;\n\n\tstd::string name;\n\n\tstatic EnumMap<Hat, Uint8, Joystick::HAT_MAX_ENUM>::Entry hatEntries[];\n\tstatic EnumMap<Hat, Uint8, Joystick::HAT_MAX_ENUM> hats;\n\n\tstatic EnumMap<GamepadAxis, SDL_GamepadAxis, GAMEPAD_AXIS_MAX_ENUM>::Entry gpAxisEntries[];\n\tstatic EnumMap<GamepadAxis, SDL_GamepadAxis, GAMEPAD_AXIS_MAX_ENUM> gpAxes;\n\n\tstatic EnumMap<GamepadButton, SDL_GamepadButton, GAMEPAD_BUTTON_MAX_ENUM>::Entry gpButtonEntries[];\n\tstatic EnumMap<GamepadButton, SDL_GamepadButton, GAMEPAD_BUTTON_MAX_ENUM> gpButtons;\n\n\tstatic EnumMap<PowerType, SDL_PowerState, POWER_MAX_ENUM>::Entry powerEntries[];\n\tstatic EnumMap<PowerType, SDL_PowerState, POWER_MAX_ENUM> powerStates;\n\n\tstatic EnumMap<ConnectionType, SDL_JoystickConnectionState, CONNECTION_MAX_ENUM>::Entry connectionStateEntries[];\n\tstatic EnumMap<ConnectionType, SDL_JoystickConnectionState, CONNECTION_MAX_ENUM> connectionStates;\n};\n\n} // sdl\n} // joystick\n} // love\n\n#endif // LOVE_JOYSTICK_SDL_JOYSTICK_H\n"
  },
  {
    "path": "src/modules/joystick/sdl/JoystickModule.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"common/config.h\"\n#include \"JoystickModule.h\"\n#include \"Joystick.h\"\n\n// SDL\n#include <SDL3/SDL.h>\n\n// C++\n#include <sstream>\n#include <algorithm>\n\n// C\n#include <cstdlib>\n\nnamespace love\n{\nnamespace joystick\n{\nnamespace sdl\n{\n\nJoystickModule::JoystickModule()\n\t: love::joystick::JoystickModule(\"love.joystick.sdl\")\n{\n\tif (!SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMEPAD))\n\t\tthrow love::Exception(\"Could not initialize SDL joystick subsystem (%s)\", SDL_GetError());\n\n\t// Initialize any joysticks which are already connected.\n\tint count = 0;\n\tSDL_JoystickID *sticks = SDL_GetJoysticks(&count);\n\tfor (int i = 0; i < count; i++)\n\t\taddJoystick((int64)sticks[i]);\n\tSDL_free(sticks);\n\n\t// Start joystick event watching. Joysticks are automatically added and\n\t// removed via love.event.\n\tSDL_SetJoystickEventsEnabled(true);\n\tSDL_SetGamepadEventsEnabled(true);\n}\n\nJoystickModule::~JoystickModule()\n{\n\t// Close any open Joysticks.\n\tfor (auto stick : joysticks)\n\t{\n\t\tstick->close();\n\t\tstick->release();\n\t}\n\n\tSDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMEPAD);\n}\n\nlove::joystick::Joystick *JoystickModule::getJoystick(int joyindex)\n{\n\tif (joyindex < 0 || (size_t) joyindex >= activeSticks.size())\n\t\treturn nullptr;\n\n\treturn activeSticks[joyindex];\n}\n\nint JoystickModule::getIndex(const love::joystick::Joystick *joystick)\n{\n\tfor (int i = 0; i < (int) activeSticks.size(); i++)\n\t{\n\t\tif (activeSticks[i] == joystick)\n\t\t\treturn i;\n\t}\n\n\t// Joystick is not connected.\n\treturn -1;\n}\n\nint JoystickModule::getJoystickCount() const\n{\n\treturn (int) activeSticks.size();\n}\n\nlove::joystick::Joystick *JoystickModule::getJoystickFromID(int instanceid)\n{\n\tfor (auto stick : activeSticks)\n\t{\n\t\tif (stick->getInstanceID() == instanceid)\n\t\t\treturn stick;\n\t}\n\n\treturn nullptr;\n}\n\nlove::joystick::Joystick *JoystickModule::addJoystick(int64 deviceid)\n{\n\tif (deviceid == 0)\n\t\treturn nullptr;\n\n\tstd::string guidstr = getDeviceGUID(deviceid);\n\tjoystick::Joystick *joystick = 0;\n\tbool reused = false;\n\n\tfor (auto stick : joysticks)\n\t{\n\t\t// Try to re-use a disconnected Joystick with the same GUID.\n\t\tif (!stick->isConnected() && stick->getGUID() == guidstr)\n\t\t{\n\t\t\tjoystick = stick;\n\t\t\treused = true;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (!joystick)\n\t{\n\t\tjoystick = new Joystick((int) joysticks.size());\n\t\tjoysticks.push_back(joystick);\n\t}\n\n\t// Make sure the Joystick object isn't in the active list already.\n\tremoveJoystick(joystick);\n\n\tif (!joystick->open(deviceid))\n\t\treturn nullptr;\n\n\t// Make sure multiple instances of the same physical joystick aren't added\n\t// to the active list.\n\tfor (auto activestick : activeSticks)\n\t{\n\t\tif (joystick->getHandle() == activestick->getHandle())\n\t\t{\n\t\t\tjoystick->close();\n\n\t\t\t// If we just created the stick, remove it since it's a duplicate.\n\t\t\tif (!reused)\n\t\t\t{\n\t\t\t\tjoysticks.remove(joystick);\n\t\t\t\tjoystick->release();\n\t\t\t}\n\n\t\t\treturn activestick;\n\t\t}\n\t}\n\n\tif (joystick->isGamepad())\n\t\trecentGamepadGUIDs[joystick->getGUID()] = true;\n\n\tactiveSticks.push_back(joystick);\n\treturn joystick;\n}\n\nvoid JoystickModule::removeJoystick(love::joystick::Joystick *joystick)\n{\n\tif (!joystick)\n\t\treturn;\n\n\t// Close the Joystick and remove it from the active joystick list.\n\tauto it = std::find(activeSticks.begin(), activeSticks.end(), joystick);\n\tif (it != activeSticks.end())\n\t{\n\t\t(*it)->close();\n\t\tactiveSticks.erase(it);\n\t}\n}\n\nbool JoystickModule::setGamepadMapping(const std::string &guid, Joystick::GamepadInput gpinput, Joystick::JoystickInput joyinput)\n{\n\t// All SDL joystick GUID strings are 32 characters.\n\tif (guid.length() != 32)\n\t\tthrow love::Exception(\"Invalid joystick GUID: %s\", guid.c_str());\n\n\tSDL_GUID sdlguid = SDL_StringToGUID(guid.c_str());\n\tstd::string mapstr;\n\n\tchar *sdlmapstr = SDL_GetGamepadMappingForGUID(sdlguid);\n\tif (sdlmapstr)\n\t{\n\t\tmapstr = sdlmapstr;\n\t\tSDL_free(sdlmapstr);\n\t}\n\telse\n\t{\n\t\tstd::string name = \"Controller\";\n\n\t\tfor (love::joystick::Joystick *stick : joysticks)\n\t\t{\n\t\t\tif (stick->getGUID() == guid)\n\t\t\t{\n\t\t\t\tname = stick->getName();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tmapstr = guid + \",\" + name + \",\";\n\t}\n\n\tstd::stringstream joyinputstream;\n\tUint8 sdlhat;\n\n\t// We can't have negative int values in the bind string.\n\tswitch (joyinput.type)\n\t{\n\tcase Joystick::INPUT_TYPE_AXIS:\n\t\tif (joyinput.axis >= 0)\n\t\t\tjoyinputstream << \"a\" << joyinput.axis;\n\t\tbreak;\n\tcase Joystick::INPUT_TYPE_BUTTON:\n\t\tif (joyinput.button >= 0)\n\t\t\tjoyinputstream << \"b\" << joyinput.button;\n\t\tbreak;\n\tcase Joystick::INPUT_TYPE_HAT:\n\t\tif (joyinput.hat.index >= 0 && Joystick::getConstant(joyinput.hat.value, sdlhat))\n\t\t\tjoyinputstream << \"h\" << joyinput.hat.index << \".\" << int(sdlhat);\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\n\tstd::string joyinputstr = joyinputstream.str();\n\n\tif (joyinputstr.length() == 0)\n\t\tthrow love::Exception(\"Invalid joystick input value.\");\n\n\t// SDL's name for the gamepad input value, e.g. \"guide\".\n\tstd::string gpinputname = stringFromGamepadInput(gpinput);\n\n\t// We should remove any existing joystick bind for this gamepad buttton/axis\n\t// so SDL's parser doesn't get mixed up.\n\tremoveBindFromMapString(mapstr, joyinputstr);\n\n\t// The string we'll be adding to the mapping string, e.g. \"guide:b10,\"\n\tstd::string insertstr = gpinputname + \":\" + joyinputstr + \",\";\n\n\t// We should replace any existing gamepad bind.\n\tsize_t findpos = mapstr.find(\",\" + gpinputname + \":\");\n\tif (findpos != std::string::npos)\n\t{\n\t\t// The bind string ends at the next comma, or the end of the string.\n\t\tsize_t endpos = mapstr.find_first_of(',', findpos + 1);\n\t\tif (endpos == std::string::npos)\n\t\t\tendpos = mapstr.length() - 1;\n\n\t\tmapstr.replace(findpos + 1, endpos - findpos, insertstr);\n\t}\n\telse\n\t{\n\t\t// Just append to the end (or before the platform section if that exists),\n\t\t// if we don't need to replace anything.\n\t\tsize_t platformpos = mapstr.find(\"platform:\");\n\t\tif (platformpos != std::string::npos)\n\t\t\tmapstr.insert(platformpos, insertstr);\n\t\telse\n\t\t\tmapstr += insertstr;\n\t}\n\n\t// 1 == added, 0 == updated, -1 == error.\n\tint status = SDL_AddGamepadMapping(mapstr.c_str());\n\n\tif (status != -1)\n\t\trecentGamepadGUIDs[guid] = true;\n\n\t// FIXME: massive hack until missing APIs are added to SDL 2:\n\t// https://bugzilla.libsdl.org/show_bug.cgi?id=1975\n\tif (status == 1)\n\t\tcheckGamepads(guid);\n\n\treturn status >= 0;\n}\n\nstd::string JoystickModule::stringFromGamepadInput(Joystick::GamepadInput gpinput) const\n{\n\tSDL_GamepadAxis sdlaxis;\n\tSDL_GamepadButton sdlbutton;\n\n\tconst char *gpinputname = nullptr;\n\n\tswitch (gpinput.type)\n\t{\n\tcase Joystick::INPUT_TYPE_AXIS:\n\t\tif (Joystick::getConstant(gpinput.axis, sdlaxis))\n\t\t\tgpinputname = SDL_GetGamepadStringForAxis(sdlaxis);\n\t\tbreak;\n\tcase Joystick::INPUT_TYPE_BUTTON:\n\t\tif (Joystick::getConstant(gpinput.button, sdlbutton))\n\t\t\tgpinputname = SDL_GetGamepadStringForButton(sdlbutton);\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\n\tif (!gpinputname)\n\t\tthrow love::Exception(\"Invalid gamepad axis/button.\");\n\n\treturn std::string(gpinputname);\n}\n\nvoid JoystickModule::removeBindFromMapString(std::string &mapstr, const std::string &joybindstr) const\n{\n\t// Find the joystick part of the bind in the string.\n\tsize_t joybindpos = mapstr.find(joybindstr + \",\");\n\tif (joybindpos == std::string::npos)\n\t{\n\t\tjoybindpos = mapstr.rfind(joybindstr);\n\t\tif (joybindpos != mapstr.length() - joybindstr.length())\n\t\t\treturn;\n\t}\n\n\tif (joybindpos == std::string::npos)\n\t\treturn;\n\n\t// Find the start of the entire bind by looking for the separator between\n\t// the end of one section of the map string and the start of this section.\n\tsize_t bindstart = mapstr.rfind(',', joybindpos);\n\tif (bindstart != std::string::npos && bindstart < mapstr.length() - 1)\n\t{\n\t\t// The start of the bind is directly after the separator.\n\t\tbindstart++;\n\n\t\tsize_t bindend = mapstr.find(',', bindstart + 1);\n\t\tif (bindend == std::string::npos)\n\t\t\tbindend = mapstr.length() - 1;\n\n\t\t// Replace it with an empty string (remove it.)\n\t\tmapstr.replace(bindstart, bindend - bindstart + 1, \"\");\n\t}\n}\n\nvoid JoystickModule::checkGamepads(const std::string &guid) const\n{\n\t// FIXME: massive hack until missing APIs are added to SDL 2:\n\t// https://bugzilla.libsdl.org/show_bug.cgi?id=1975\n\n\t// Make sure all connected joysticks of a certain guid that are\n\t// gamepad-capable are opened as such.\n\tint count = 0;\n\tSDL_JoystickID *sdlsticks = SDL_GetJoysticks(&count);\n\tfor (int d_index = 0; d_index < count; d_index++)\n\t{\n\t\tif (!SDL_IsGamepad(sdlsticks[d_index]))\n\t\t\tcontinue;\n\n\t\tauto sdlid = sdlsticks[d_index];\n\n\t\tif (guid.compare(getDeviceGUID(sdlid)) != 0)\n\t\t\tcontinue;\n\n\t\tfor (auto stick : activeSticks)\n\t\t{\n\t\t\tif (guid.compare(stick->getGUID()) != 0)\n\t\t\t\tcontinue;\n\n\t\t\t// Big hack time: open the index as a game controller and compare\n\t\t\t// the underlying joystick handle to the active stick's.\n\t\t\tSDL_Gamepad *controller = SDL_OpenGamepad(sdlid);\n\t\t\tif (controller == nullptr)\n\t\t\t\tcontinue;\n\n\t\t\t// GameController objects are reference-counted in SDL, so we don't want to\n\t\t\t// have a joystick open when trying to re-initialize it\n\t\t\tSDL_Joystick *sdlstick = SDL_GetGamepadJoystick(controller);\n\t\t\tbool open_gamepad = (sdlstick == (SDL_Joystick *) stick->getHandle());\n\t\t\tSDL_CloseGamepad(controller);\n\n\t\t\t// open as gamepad if necessary\n\t\t\tif (open_gamepad)\n\t\t\t\tstick->openGamepad(sdlid);\n\t\t}\n\t}\n}\n\nstd::string JoystickModule::getDeviceGUID(int64 deviceid) const\n{\n\t// SDL_JoystickGetGUIDString uses 32 bytes plus the null terminator.\n\tchar guidstr[33] = {'\\0'};\n\n\tif (deviceid <= 0)\n\t\treturn std::string(\"\");\n\n\t// SDL's GUIDs identify *classes* of devices, instead of unique devices.\n\tSDL_GUID guid = SDL_GetJoystickGUIDForID((SDL_JoystickID)deviceid);\n\tSDL_GUIDToString(guid, guidstr, sizeof(guidstr));\n\n\treturn std::string(guidstr);\n}\n\nvoid JoystickModule::loadGamepadMappings(const std::string &mappings)\n{\n\t// TODO: We should use SDL_GameControllerAddMappingsFromRW. We're\n\t// duplicating its functionality for now because it was added after\n\t// SDL 2.0.0's release, and we want runtime compat with 2.0.0 on Linux...\n\n\tstd::stringstream ss(mappings);\n\tstd::string mapping;\n\tbool success = false;\n\n\t// The mappings string contains newline-separated mappings.\n\twhile (std::getline(ss, mapping))\n\t{\n\t\tif (mapping.empty())\n\t\t\tcontinue;\n\n\t\t// Lines starting with \"#\" are comments.\n\t\tif (mapping[0] == '#')\n\t\t\tcontinue;\n\n\t\t// Strip out and compare any \"platform:XYZ,\" in the mapping.\n\t\tsize_t pstartpos = mapping.find(\"platform:\");\n\t\tif (pstartpos != std::string::npos)\n\t\t{\n\t\t\tpstartpos += strlen(\"platform:\");\n\n\t\t\tsize_t pendpos = mapping.find_first_of(',', pstartpos);\n\t\t\tstd::string platform = mapping.substr(pstartpos, pendpos - pstartpos);\n\n\t\t\tif (platform.compare(SDL_GetPlatform()) != 0)\n\t\t\t{\n\t\t\t\t// Ignore the mapping but still acknowledge that it is one.\n\t\t\t\tsuccess = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tpstartpos -= strlen(\"platform:\");\n\t\t\tmapping.erase(pstartpos, pendpos - pstartpos + 1);\n\t\t}\n\n\t\tif (SDL_AddGamepadMapping(mapping.c_str()) != -1)\n\t\t{\n\t\t\tsuccess = true;\n\t\t\tstd::string guid = mapping.substr(0, mapping.find_first_of(','));\n\t\t\trecentGamepadGUIDs[guid] = true;\n\n\t\t\t// FIXME: massive hack until missing APIs are added to SDL 2:\n\t\t\t// https://bugzilla.libsdl.org/show_bug.cgi?id=1975\n\t\t\tcheckGamepads(guid);\n\t\t}\n\t}\n\n\t// Don't error when an empty string is given, since saveGamepadMappings can\n\t// produce an empty string if there are no recently seen gamepads to save.\n\tif (!success && !mappings.empty())\n\t\tthrow love::Exception(\"Invalid gamepad mappings.\");\n}\n\nstd::string JoystickModule::getGamepadMappingString(const std::string &guid) const\n{\n\tSDL_GUID sdlguid = SDL_StringToGUID(guid.c_str());\n\tchar *sdlmapping = SDL_GetGamepadMappingForGUID(sdlguid);\n\tif (sdlmapping == nullptr)\n\t\treturn \"\";\n\n\tstd::string mapping(sdlmapping);\n\tSDL_free(sdlmapping);\n\n\t// Matches SDL_GameControllerAddMappingsFromRW.\n\tif (mapping.find_last_of(',') != mapping.length() - 1)\n\t\tmapping += \",\";\n\n\tif (mapping.find(\"platform:\") == std::string::npos)\n\t\tmapping += \"platform:\" + std::string(SDL_GetPlatform());\n\n\treturn mapping;\n}\n\nstd::string JoystickModule::saveGamepadMappings()\n{\n\tstd::string mappings;\n\n\tfor (const auto &g : recentGamepadGUIDs)\n\t{\n\t\tSDL_GUID sdlguid = SDL_StringToGUID(g.first.c_str());\n\t\tchar *sdlmapping = SDL_GetGamepadMappingForGUID(sdlguid);\n\t\tif (sdlmapping == nullptr)\n\t\t\tcontinue;\n\n\t\tstd::string mapping = sdlmapping;\n\t\tSDL_free(sdlmapping);\n\n\t\tif (mapping.find_last_of(',') != mapping.length() - 1)\n\t\t\tmapping += \",\";\n\n\t\t// Matches SDL_GameControllerAddMappingsFromRW.\n\t\tif (mapping.find(\"platform:\") == std::string::npos)\n\t\t\tmapping += \"platform:\" + std::string(SDL_GetPlatform()) + \",\";\n\n\t\tmappings += mapping + \"\\n\";\n\t}\n\n\treturn mappings;\n}\n\n} // sdl\n} // joystick\n} // love\n"
  },
  {
    "path": "src/modules/joystick/sdl/JoystickModule.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_JOYSTICK_SDL_JOYSTICK_MODULE_H\n#define LOVE_JOYSTICK_SDL_JOYSTICK_MODULE_H\n\n// LOVE\n#include \"joystick/JoystickModule.h\"\n\n// C++\n#include <string>\n#include <vector>\n#include <list>\n#include <map>\n\nnamespace love\n{\nnamespace joystick\n{\nnamespace sdl\n{\n\nclass JoystickModule : public love::joystick::JoystickModule\n{\npublic:\n\n\tJoystickModule();\n\tvirtual ~JoystickModule();\n\n\t// Implements JoystickModule.\n\tlove::joystick::Joystick *addJoystick(int64 deviceid) override;\n\tvoid removeJoystick(love::joystick::Joystick *joystick) override;\n\tlove::joystick::Joystick *getJoystickFromID(int instanceid) override;\n\tlove::joystick::Joystick *getJoystick(int joyindex) override;\n\tint getIndex(const love::joystick::Joystick *joystick) override;\n\tint getJoystickCount() const override;\n\n\tbool setGamepadMapping(const std::string &guid, Joystick::GamepadInput gpinput, Joystick::JoystickInput joyinput) override;\n\tvoid loadGamepadMappings(const std::string &mappings) override;\n\n\tstd::string getGamepadMappingString(const std::string &guid) const override;\n\tstd::string saveGamepadMappings() override;\n\nprivate:\n\n\tstd::string stringFromGamepadInput(Joystick::GamepadInput gpinput) const;\n\tvoid removeBindFromMapString(std::string &mapstr, const std::string &joybindstr) const;\n\n\tvoid checkGamepads(const std::string &guid) const;\n\n\t// SDL2's GUIDs identify *classes* of devices, instead of unique devices.\n\tstd::string getDeviceGUID(int64 deviceid) const;\n\n\t// Lists of currently connected Joysticks.\n\tstd::vector<love::joystick::Joystick *> activeSticks;\n\n\t// Persistent list of all Joysticks which have been connected at some point.\n\tstd::list<love::joystick::Joystick *> joysticks;\n\n\t// Persistent map indicating GUIDs for Gamepads which have been connected or\n\t// modified at some point.\n\tstd::map<std::string, bool> recentGamepadGUIDs;\n\n}; // JoystickModule\n\n} // sdl\n} // joystick\n} // love\n\n#endif // LOVE_JOYSTICK_SDL_JOYSTICK_MODULE_H\n"
  },
  {
    "path": "src/modules/joystick/wrap_Joystick.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"wrap_Joystick.h\"\n#include \"wrap_JoystickModule.h\"\n#include \"sensor/Sensor.h\"\n\n#include <vector>\n\nnamespace love\n{\nnamespace joystick\n{\n\nJoystick *luax_checkjoystick(lua_State *L, int idx)\n{\n\treturn luax_checktype<Joystick>(L, idx);\n}\n\nint w_Joystick_isConnected(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\tluax_pushboolean(L, j->isConnected());\n\treturn 1;\n}\n\nint w_Joystick_getName(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\tlua_pushstring(L, j->getName());\n\treturn 1;\n}\n\nint w_Joystick_getID(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\n\t// IDs are 1-based in Lua.\n\tlua_pushinteger(L, j->getID() + 1);\n\n\tint instanceid = j->getInstanceID();\n\tif (instanceid >= 0)\n\t\tlua_pushinteger(L, instanceid + 1);\n\telse\n\t\tlua_pushnil(L);\n\n\treturn 2;\n}\n\nint w_Joystick_getGUID(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\tluax_pushstring(L, j->getGUID());\n\treturn 1;\n}\n\nint w_Joystick_getDeviceInfo(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\n\tint vendorID = 0, productID = 0, productVersion = 0;\n\tj->getDeviceInfo(vendorID, productID, productVersion);\n\n\tlua_pushnumber(L, vendorID);\n\tlua_pushnumber(L, productID);\n\tlua_pushnumber(L, productVersion);\n\n\treturn 3;\n}\n\nint w_Joystick_getJoystickType(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\tconst char* str = \"unknown\";\n\tJoystick::getConstant(j->getJoystickType(), str);\n\tlua_pushstring(L, str);\n\treturn 1;\n}\n\nint w_Joystick_getAxisCount(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\tlua_pushinteger(L, j->getAxisCount());\n\treturn 1;\n}\n\nint w_Joystick_getButtonCount(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\tlua_pushinteger(L, j->getButtonCount());\n\treturn 1;\n}\n\nint w_Joystick_getHatCount(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\tlua_pushinteger(L, j->getHatCount());\n\treturn 1;\n}\n\nint w_Joystick_getAxis(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\tint axisindex = (int) luaL_checkinteger(L, 2) - 1;\n\tlua_pushnumber(L, j->getAxis(axisindex));\n\treturn 1;\n}\n\nint w_Joystick_getAxes(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\tstd::vector<float> axes = j->getAxes();\n\n\tfor (float value : axes)\n\t\tlua_pushnumber(L, value);\n\n\treturn (int) axes.size();\n}\n\nint w_Joystick_getHat(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\tint hatindex = (int) luaL_checkinteger(L, 2) - 1;\n\n\tJoystick::Hat h = j->getHat(hatindex);\n\n\tconst char *direction = \"\";\n\tJoystick::getConstant(h, direction);\n\n\tlua_pushstring(L, direction);\n\treturn 1;\n}\n\nint w_Joystick_isDown(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\n\tbool istable = lua_istable(L, 2);\n\tint num = istable ? (int) luax_objlen(L, 2) : (lua_gettop(L) - 1);\n\n\tif (num == 0)\n\t\tluaL_checkinteger(L, 2);\n\n\tstd::vector<int> buttons;\n\tbuttons.reserve(num);\n\n\tif (istable)\n\t{\n\t\tfor (int i = 0; i < num; i++)\n\t\t{\n\t\t\tlua_rawgeti(L, 2, i + 1);\n\t\t\tbuttons.push_back((int) luaL_checkinteger(L, -1) - 1);\n\t\t\tlua_pop(L, 1);\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (int i = 0; i < num; i++)\n\t\t\tbuttons.push_back((int) luaL_checkinteger(L, i + 2) - 1);\n\t}\n\n\tluax_pushboolean(L, j->isDown(buttons));\n\treturn 1;\n}\n\nint w_Joystick_setPlayerIndex(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\tint index = (int) luaL_checkinteger(L, 2) - 1;\n\tj->setPlayerIndex(index);\n\treturn 0;\n}\n\nint w_Joystick_getPlayerIndex(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\tint index = j->getPlayerIndex();\n\tlua_pushinteger(L, index >= 0 ? index + 1 : index);\n\treturn 1;\n}\n\nint w_Joystick_isGamepad(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\tluax_pushboolean(L, j->isGamepad());\n\treturn 1;\n}\n\nint w_Joystick_getGamepadType(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\tconst char *str = \"unknown\";\n\tJoystick::getConstant(j->getGamepadType(), str);\n\tlua_pushstring(L, str);\n\treturn 1;\n}\n\nint w_Joystick_getGamepadAxis(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\n\tconst char *str = luaL_checkstring(L, 2);\n\tJoystick::GamepadAxis axis;\n\n\tif (!joystick::Joystick::getConstant(str, axis))\n\t\treturn luax_enumerror(L, \"gamepad axis\", str);\n\n\tlua_pushnumber(L, j->getGamepadAxis(axis));\n\treturn 1;\n}\n\nint w_Joystick_isGamepadDown(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\n\tbool istable = lua_istable(L, 2);\n\tint num = istable ? (int) luax_objlen(L, 2) : (lua_gettop(L) - 1);\n\n\tif (num == 0)\n\t\tluaL_checkstring(L, 2);\n\n\tstd::vector<Joystick::GamepadButton> buttons;\n\tbuttons.reserve(num);\n\n\tJoystick::GamepadButton button;\n\n\tif (istable)\n\t{\n\t\tfor (int i = 0; i < num; i++)\n\t\t{\n\t\t\tlua_rawgeti(L, 2, i + 1);\n\t\t\tconst char *str = luaL_checkstring(L, -1);\n\n\t\t\tif (!joystick::Joystick::getConstant(str, button))\n\t\t\t\treturn luax_enumerror(L, \"gamepad button\", str);\n\n\t\t\tbuttons.push_back(button);\n\n\t\t\tlua_pop(L, 1);\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (int i = 0; i < num; i++)\n\t\t{\n\t\t\tconst char *str = luaL_checkstring(L, i + 2);\n\n\t\t\tif (!joystick::Joystick::getConstant(str, button))\n\t\t\t\treturn luax_enumerror(L, \"gamepad button\", str);\n\n\t\t\tbuttons.push_back(button);\n\t\t}\n\t}\n\n\tluax_pushboolean(L, j->isGamepadDown(buttons));\n\treturn 1;\n}\n\nint w_Joystick_getGamepadMapping(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\n\tconst char *gpbindstr = luaL_checkstring(L, 2);\n\tJoystick::GamepadInput gpinput;\n\n\tif (Joystick::getConstant(gpbindstr, gpinput.axis))\n\t\tgpinput.type = Joystick::INPUT_TYPE_AXIS;\n\telse if (Joystick::getConstant(gpbindstr, gpinput.button))\n\t\tgpinput.type = Joystick::INPUT_TYPE_BUTTON;\n\telse\n\t\treturn luax_enumerror(L, \"gamepad axis/button\", gpbindstr);\n\n\tJoystick::JoystickInput jinput;\n\tjinput.type = Joystick::INPUT_TYPE_MAX_ENUM;\n\n\tluax_catchexcept(L, [&](){ jinput = j->getGamepadMapping(gpinput); });\n\n\tif (jinput.type == Joystick::INPUT_TYPE_MAX_ENUM)\n\t\treturn 0;\n\n\tconst char *inputtypestr;\n\tif (!Joystick::getConstant(jinput.type, inputtypestr))\n\t\treturn luaL_error(L, \"Unknown joystick input type.\");\n\n\tlua_pushstring(L, inputtypestr);\n\n\tconst char *hatstr;\n\tswitch (jinput.type)\n\t{\n\tcase Joystick::INPUT_TYPE_AXIS:\n\t\tlua_pushinteger(L, jinput.axis + 1);\n\t\treturn 2;\n\tcase Joystick::INPUT_TYPE_BUTTON:\n\t\tlua_pushinteger(L, jinput.button + 1);\n\t\treturn 2;\n\tcase Joystick::INPUT_TYPE_HAT:\n\t\tlua_pushinteger(L, jinput.hat.index + 1);\n\t\tif (Joystick::getConstant(jinput.hat.value, hatstr))\n\t\t{\n\t\t\tlua_pushstring(L, hatstr);\n\t\t\treturn 3;\n\t\t}\n\t\telse\n\t\t\treturn luaL_error(L, \"Unknown joystick hat.\");\n\tdefault:\n\t\treturn luaL_error(L, \"Unknown joystick input type.\");\n\t}\n\t\n\treturn 1;\n}\n\nint w_Joystick_getGamepadMappingString(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\tstd::string mapping = j->getGamepadMappingString();\n\tif (mapping.empty())\n\t\tlua_pushnil(L);\n\telse\n\t\tluax_pushstring(L, mapping);\n\treturn 1;\n}\n\nint w_Joystick_isVibrationSupported(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\tluax_pushboolean(L, j->isVibrationSupported());\n\treturn 1;\n}\n\nint w_Joystick_setVibration(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\tbool success = false;\n\n\tif (lua_isnoneornil(L, 2))\n\t{\n\t\t// Disable joystick vibration if no argument is given.\n\t\tsuccess = j->setVibration();\n\t}\n\telse\n\t{\n\t\tfloat left = (float) luaL_checknumber(L, 2);\n\t\tfloat right = (float) luaL_optnumber(L, 3, left);\n\t\tfloat duration = (float) luaL_optnumber(L, 4, -1.0); // -1 is infinite.\n\t\tsuccess = j->setVibration(left, right, duration);\n\t}\n\n\tluax_pushboolean(L, success);\n\treturn 1;\n}\n\nint w_Joystick_getVibration(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\tfloat left, right;\n\tj->getVibration(left, right);\n\tlua_pushnumber(L, left);\n\tlua_pushnumber(L, right);\n\treturn 2;\n}\n\n#ifdef LOVE_ENABLE_SENSOR\n\nint w_Joystick_hasSensor(lua_State *L)\n{\n\tusing namespace love::sensor;\n\n\tJoystick *j = luax_checkjoystick(L, 1);\n\tconst char *sensorType = luaL_checkstring(L, 2);\n\n\tSensor::SensorType type;\n\tif (!Sensor::getConstant(sensorType, type))\n\t\tluax_enumerror(L, \"sensor type\", Sensor::getConstants(type), sensorType);\n\n\tluax_pushboolean(L, j->hasSensor(type));\n\treturn 1;\n}\n\nint w_Joystick_isSensorEnabled(lua_State *L)\n{\n\tusing namespace love::sensor;\n\n\tJoystick *j = luax_checkjoystick(L, 1);\n\tconst char *sensorType = luaL_checkstring(L, 2);\n\n\tSensor::SensorType type;\n\tif (!Sensor::getConstant(sensorType, type))\n\t\tluax_enumerror(L, \"sensor type\", Sensor::getConstants(type), sensorType);\n\n\tluax_pushboolean(L, j->isSensorEnabled(type));\n\treturn 1;\n}\n\nint w_Joystick_setSensorEnabled(lua_State *L)\n{\n\tusing namespace love::sensor;\n\n\tJoystick *j = luax_checkjoystick(L, 1);\n\tconst char *sensorType = luaL_checkstring(L, 2);\n\n\tSensor::SensorType type;\n\tif (!Sensor::getConstant(sensorType, type))\n\t\tluax_enumerror(L, \"sensor type\", Sensor::getConstants(type), sensorType);\n\n\tbool enabled = luax_checkboolean(L, 3);\n\n\tluax_catchexcept(L, [&]() { j->setSensorEnabled(type, enabled); });\n\treturn 0;\n}\n\nint w_Joystick_getSensorData(lua_State *L)\n{\n\tusing namespace love::sensor;\n\n\tJoystick *j = luax_checkjoystick(L, 1);\n\tconst char *sensorType = luaL_checkstring(L, 2);\n\n\tSensor::SensorType type;\n\tif (!Sensor::getConstant(sensorType, type))\n\t\tluax_enumerror(L, \"sensor type\", Sensor::getConstants(type), sensorType);\n\n\tstd::vector<float> data;\n\n\tluax_catchexcept(L, [&]() { data = j->getSensorData(type); });\n\n\tfor (float f: data)\n\t\tlua_pushnumber(L, f);\n\n\treturn (int) data.size();\n}\n\nint w_Joystick_getDevicePowerInfo(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\n\tint batteryPercent = 0;\n\tconst char *str;\n\tJoystick::PowerType state = j->getPowerInfo(batteryPercent);\n\t\n\tif (!Joystick::getConstant(state, str))\n\t\tstr = \"unknown\";\n\n\tlua_pushstring(L, str);\n\n\tif (batteryPercent >= 0)\n\t\tlua_pushnumber(L, batteryPercent);\n\telse\n\t\tlua_pushnil(L);\n\t\n\treturn 2;\n}\n\nint w_Joystick_getDeviceConnectionState(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\n\tconst char *str = \"unknown\";\n\tJoystick::getConstant(j->getConnectionState(), str);\n\n\tlua_pushstring(L, str);\n\n\treturn 1;\n}\n\n#endif // LOVE_ENABLE_SENSOR\n\n// List of functions to wrap.\nstatic const luaL_Reg w_Joystick_functions[] =\n{\n\t{ \"isConnected\", w_Joystick_isConnected },\n\t{ \"getName\", w_Joystick_getName },\n\t{ \"getID\", w_Joystick_getID },\n\t{ \"getGUID\", w_Joystick_getGUID },\n\t{ \"getDeviceInfo\", w_Joystick_getDeviceInfo },\n\t{ \"getDevicePowerInfo\", w_Joystick_getDevicePowerInfo },\n\t{ \"getDeviceConnectionState\", w_Joystick_getDeviceConnectionState },\n\t{ \"getJoystickType\", w_Joystick_getJoystickType },\n\t{ \"getAxisCount\", w_Joystick_getAxisCount },\n\t{ \"getButtonCount\", w_Joystick_getButtonCount },\n\t{ \"getHatCount\", w_Joystick_getHatCount },\n\t{ \"getAxis\", w_Joystick_getAxis },\n\t{ \"getAxes\", w_Joystick_getAxes },\n\t{ \"getHat\", w_Joystick_getHat },\n\t{ \"isDown\", w_Joystick_isDown },\n\t{ \"setPlayerIndex\", w_Joystick_setPlayerIndex },\n\t{ \"getPlayerIndex\", w_Joystick_getPlayerIndex },\n\n\t{ \"isGamepad\", w_Joystick_isGamepad },\n\t{ \"getGamepadType\", w_Joystick_getGamepadType },\n\t{ \"getGamepadAxis\", w_Joystick_getGamepadAxis },\n\t{ \"isGamepadDown\", w_Joystick_isGamepadDown },\n\t{ \"getGamepadMapping\", w_Joystick_getGamepadMapping },\n\t{ \"getGamepadMappingString\", w_Joystick_getGamepadMappingString },\n\n\t{ \"isVibrationSupported\", w_Joystick_isVibrationSupported },\n\t{ \"setVibration\", w_Joystick_setVibration },\n\t{ \"getVibration\", w_Joystick_getVibration },\n\n#ifdef LOVE_ENABLE_SENSOR\n\t{ \"hasSensor\", w_Joystick_hasSensor },\n\t{ \"isSensorEnabled\", w_Joystick_isSensorEnabled },\n\t{ \"setSensorEnabled\", w_Joystick_setSensorEnabled },\n\t{ \"getSensorData\", w_Joystick_getSensorData },\n#endif\n\n\t// From wrap_JoystickModule.\n\t{ \"getConnectedIndex\", w_getIndex },\n\n\t{ 0, 0 },\n};\n\nextern \"C\" int luaopen_joystick(lua_State *L)\n{\n\treturn luax_register_type(L, &Joystick::type, w_Joystick_functions, nullptr);\n}\n\n} // joystick\n} // love\n"
  },
  {
    "path": "src/modules/joystick/wrap_Joystick.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_JOYSTICK_WRAP_JOYSTICK_H\n#define LOVE_JOYSTICK_WRAP_JOYSTICK_H\n\n// LOVE\n#include \"common/config.h\"\n#include \"Joystick.h\"\n#include \"common/runtime.h\"\n\nnamespace love\n{\nnamespace joystick\n{\n\nJoystick *luax_checkjoystick(lua_State *L, int idx);\nextern \"C\" int luaopen_joystick(lua_State *L);\n\n} // joystick\n} // love\n\n#endif // LOVE_JOYSTICK_SDL_WRAP_JOYSTICK_H\n"
  },
  {
    "path": "src/modules/joystick/wrap_JoystickModule.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_JoystickModule.h\"\n#include \"wrap_Joystick.h\"\n\n#include \"filesystem/Filesystem.h\"\n#include \"filesystem/wrap_Filesystem.h\"\n\n#include \"sdl/JoystickModule.h\"\n\nnamespace love\n{\nnamespace joystick\n{\n\n#define instance() (Module::getInstance<JoystickModule>(Module::M_JOYSTICK))\n\nint w_getJoysticks(lua_State *L)\n{\n\tint stickcount = instance()->getJoystickCount();\n\tlua_createtable(L, stickcount, 0);\n\n\tfor (int i = 0; i < stickcount; i++)\n\t{\n\t\tJoystick *stick = instance()->getJoystick(i);\n\t\tluax_pushtype(L, stick);\n\t\tlua_rawseti(L, -2, i + 1);\n\t}\n\n\treturn 1;\n}\n\nint w_getIndex(lua_State *L)\n{\n\tJoystick *j = luax_checkjoystick(L, 1);\n\tint index = instance()->getIndex(j);\n\tif (index >= 0)\n\t\tlua_pushinteger(L, index + 1);\n\telse\n\t\tlua_pushnil(L);\n\treturn 1;\n}\n\nint w_getJoystickCount(lua_State *L)\n{\n\tlua_pushinteger(L, instance()->getJoystickCount());\n\treturn 1;\n}\n\nint w_setGamepadMapping(lua_State *L)\n{\n\t// Only accept a GUID string. We don't accept a Joystick object because\n\t// the gamepad mapping applies to all joysticks with the same GUID (e.g. all\n\t// Xbox 360 controllers on the system), rather than individual objects.\n\tconst char *guid = luaL_checkstring(L, 1);\n\n\tconst char *gpbindstr = luaL_checkstring(L, 2);\n\tJoystick::GamepadInput gpinput;\n\n\tif (Joystick::getConstant(gpbindstr, gpinput.axis))\n\t\tgpinput.type = Joystick::INPUT_TYPE_AXIS;\n\telse if (Joystick::getConstant(gpbindstr, gpinput.button))\n\t\tgpinput.type = Joystick::INPUT_TYPE_BUTTON;\n\telse\n\t\treturn luax_enumerror(L, \"gamepad axis/button\", gpbindstr);\n\n\tconst char *jinputtypestr = luaL_checkstring(L, 3);\n\tJoystick::JoystickInput jinput;\n\n\tif (!Joystick::getConstant(jinputtypestr, jinput.type))\n\t\treturn luax_enumerror(L, \"joystick input type\", jinputtypestr);\n\n\tconst char *hatstr;\n\tswitch (jinput.type)\n\t{\n\tcase Joystick::INPUT_TYPE_AXIS:\n\t\tjinput.axis = (int) luaL_checkinteger(L, 4) - 1;\n\t\tbreak;\n\tcase Joystick::INPUT_TYPE_BUTTON:\n\t\tjinput.button = (int) luaL_checkinteger(L, 4) - 1;\n\t\tbreak;\n\tcase Joystick::INPUT_TYPE_HAT:\n\t\t// Hats need both a hat index and a hat value.\n\t\tjinput.hat.index = (int) luaL_checkinteger(L, 4) - 1;\n\t\thatstr = luaL_checkstring(L, 5);\n\t\tif (!Joystick::getConstant(hatstr, jinput.hat.value))\n\t\t\treturn luax_enumerror(L, \"joystick hat\", hatstr);\n\t\tbreak;\n\tdefault:\n\t\treturn luax_enumerror(L, \"joystick input type\", jinputtypestr);\n\t}\n\n\tbool success = false;\n\tluax_catchexcept(L, [&](){ success = instance()->setGamepadMapping(guid, gpinput, jinput); });\n\n\tluax_pushboolean(L, success);\n\treturn 1;\n}\n\nint w_loadGamepadMappings(lua_State *L)\n{\n\tbool isfile = false;\n\tstd::string mappings = luax_checkstring(L, 1);\n\n\tauto fs = Module::getInstance<love::filesystem::Filesystem>(Module::M_FILESYSTEM);\n\tif (fs)\n\t{\n\t\tlove::filesystem::Filesystem::Info info = {};\n\t\tbool exists = fs->getInfo(mappings.c_str(), info);\n\t\tisfile = exists && info.type == love::filesystem::Filesystem::FILETYPE_FILE;\n\t}\n\n\tif (isfile)\n\t{\n\t\tlove::filesystem::FileData *fd = love::filesystem::luax_getfiledata(L, 1);\n\t\tmappings = std::string((const char *) fd->getData(), fd->getSize());\n\t\tfd->release();\n\t}\n\telse\n\t\tmappings = luax_checkstring(L, 1);\n\n\tluax_catchexcept(L, [&](){ instance()->loadGamepadMappings(mappings); });\n\treturn 0;\n}\n\nint w_saveGamepadMappings(lua_State *L)\n{\n\tlua_settop(L, 1);\n\tstd::string mappings = instance()->saveGamepadMappings();\n\n\t// Optionally write the mappings string to a file.\n\tif (!lua_isnoneornil(L, 1))\n\t{\n\t\tluax_pushstring(L, mappings);\n\t\tint idxs[] = {1, 2};\n\t\tluax_convobj(L, idxs, 2, \"filesystem\", \"write\");\n\t\tlua_pop(L, 1); // Pop the return value.\n\t}\n\n\t// Return the actual string even if we also wrote it to a file.\n\tluax_pushstring(L, mappings);\n\treturn 1;\n}\n\nint w_getGamepadMappingString(lua_State *L)\n{\n\tconst char *guid = luaL_checkstring(L, 1);\n\tstd::string mapping = instance()->getGamepadMappingString(guid);\n\tif (mapping.empty())\n\t\tlua_pushnil(L);\n\telse\n\t\tluax_pushstring(L, mapping);\n\treturn 1;\n}\n\n// List of functions to wrap.\nstatic const luaL_Reg functions[] =\n{\n\t{ \"getJoysticks\", w_getJoysticks },\n\t{ \"getJoystickCount\", w_getJoystickCount },\n\t{ \"setGamepadMapping\", w_setGamepadMapping },\n\t{ \"loadGamepadMappings\", w_loadGamepadMappings },\n\t{ \"saveGamepadMappings\", w_saveGamepadMappings },\n\t{ \"getGamepadMappingString\", w_getGamepadMappingString },\n\t{ 0, 0 }\n};\n\nstatic const lua_CFunction types[] =\n{\n\tluaopen_joystick,\n\t0,\n};\n\nextern \"C\" int luaopen_love_joystick(lua_State *L)\n{\n\tJoystickModule *instance = instance();\n\tif (instance == nullptr)\n\t{\n\t\tluax_catchexcept(L, [&](){ instance = new sdl::JoystickModule(); });\n\t}\n\telse\n\t\tinstance->retain();\n\n\tWrappedModule w;\n\tw.module = instance;\n\tw.name = \"joystick\";\n\tw.type = &Module::type;\n\tw.functions = functions;\n\tw.types = types;\n\n\treturn luax_register_module(L, w);\n}\n\n} // joystick\n} // love\n"
  },
  {
    "path": "src/modules/joystick/wrap_JoystickModule.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_JOYSTICK_WRAP_JOYSTICK_MODULE_H\n#define LOVE_JOYSTICK_WRAP_JOYSTICK_MODULE_H\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/runtime.h\"\n#include \"JoystickModule.h\"\n\nnamespace love\n{\nnamespace joystick\n{\n\nint w_getIndex(lua_State *L);\nextern \"C\" LOVE_EXPORT int luaopen_love_joystick(lua_State *L);\n\n} // joystick\n} // love\n\n#endif // LOVE_JOYSTICK_WRAP_JOYSTICK_MODULE_H\n"
  },
  {
    "path": "src/modules/keyboard/Keyboard.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"common/config.h\"\n#include \"libraries/utf8/utf8.h\"\n\n#include \"Keyboard.h\"\n\nnamespace love\n{\nnamespace keyboard\n{\n\nKeyboard::Keyboard(const char *name)\n\t: Module(M_KEYBOARD, name)\n{\n}\n\nbool Keyboard::getConstant(const char *in, Key &out)\n{\n\tauto it = stringToKey.find(in);\n\tif (it != stringToKey.end())\n\t{\n\t\tout = (Key)it->second;\n\t\treturn true;\n\t}\n\n\tstd::string text(in);\n\tuint32 codepoint = 0;\n\n\ttry\n\t{\n\t\tcodepoint = utf8::peek_next(text.begin(), text.end());\n\t}\n\tcatch (utf8::exception &)\n\t{\n\t\treturn false;\n\t}\n\n\tif (codepoint > 0)\n\t{\n\t\tstringToKey[text] = codepoint;\n\t\tout = (Key)codepoint;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool Keyboard::getConstant(Key in, const char *&out)\n{\n\tif (keyToString.empty())\n\t{\n\t\tfor (const auto &kvp : stringToKey)\n\t\t\tkeyToString[kvp.second] = kvp.first;\n\t}\n\n\tauto it = keyToString.find(in);\n\tif (it != keyToString.end())\n\t{\n\t\tout = it->second.c_str();\n\t\treturn true;\n\t}\n\n\tchar u[5] = { 0, 0, 0, 0, 0 };\n\tptrdiff_t length = 0;\n\n\ttry\n\t{\n\t\tchar *end = utf8::unchecked::append(in, u);\n\t\tlength = end - u;\n\t}\n\tcatch (utf8::exception &)\n\t{\n\t\treturn false;\n\t}\n\n\tif (length > 0)\n\t{\n\t\tkeyToString[in] = std::string(u, length);\n\t\tout = keyToString[in].c_str();\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool Keyboard::getConstant(const char *in, Scancode &out)\n{\n\treturn scancodes.find(in, out);\n}\n\nbool Keyboard::getConstant(Scancode in, const char *&out)\n{\n\treturn scancodes.find(in, out);\n}\n\nbool Keyboard::getConstant(const char *in, ModifierKey &out)\n{\n\treturn modifiers.find(in, out);\n}\n\nbool Keyboard::getConstant(ModifierKey in, const char *&out)\n{\n\treturn modifiers.find(in, out);\n}\n\nstd::map<std::string, uint32> Keyboard::stringToKey =\n{\n\t{\"unknown\", Keyboard::KEY_UNKNOWN},\n\n\t{\"return\", Keyboard::KEY_RETURN},\n\t{\"escape\", Keyboard::KEY_ESCAPE},\n\t{\"backspace\", Keyboard::KEY_BACKSPACE},\n\t{\"tab\", Keyboard::KEY_TAB},\n\t{\"space\", Keyboard::KEY_SPACE},\n\t{\"!\", Keyboard::KEY_EXCLAIM},\n\t{\"\\\"\", Keyboard::KEY_QUOTEDBL},\n\t{\"#\", Keyboard::KEY_HASH},\n\t{\"%\", Keyboard::KEY_PERCENT},\n\t{\"$\", Keyboard::KEY_DOLLAR},\n\t{\"&\", Keyboard::KEY_AMPERSAND},\n\t{\"'\", Keyboard::KEY_QUOTE},\n\t{\"(\", Keyboard::KEY_LEFTPAREN},\n\t{\")\", Keyboard::KEY_RIGHTPAREN},\n\t{\"*\", Keyboard::KEY_ASTERISK},\n\t{\"+\", Keyboard::KEY_PLUS},\n\t{\",\", Keyboard::KEY_COMMA},\n\t{\"-\", Keyboard::KEY_MINUS},\n\t{\".\", Keyboard::KEY_PERIOD},\n\t{\"/\", Keyboard::KEY_SLASH},\n\t{\"0\", Keyboard::KEY_0},\n\t{\"1\", Keyboard::KEY_1},\n\t{\"2\", Keyboard::KEY_2},\n\t{\"3\", Keyboard::KEY_3},\n\t{\"4\", Keyboard::KEY_4},\n\t{\"5\", Keyboard::KEY_5},\n\t{\"6\", Keyboard::KEY_6},\n\t{\"7\", Keyboard::KEY_7},\n\t{\"8\", Keyboard::KEY_8},\n\t{\"9\", Keyboard::KEY_9},\n\t{\":\", Keyboard::KEY_COLON},\n\t{\";\", Keyboard::KEY_SEMICOLON},\n\t{\"<\", Keyboard::KEY_LESS},\n\t{\"=\", Keyboard::KEY_EQUALS},\n\t{\">\", Keyboard::KEY_GREATER},\n\t{\"?\", Keyboard::KEY_QUESTION},\n\t{\"@\", Keyboard::KEY_AT},\n\n\t{\"[\", Keyboard::KEY_LEFTBRACKET},\n\t{\"\\\\\", Keyboard::KEY_BACKSLASH},\n\t{\"]\", Keyboard::KEY_RIGHTBRACKET},\n\t{\"^\", Keyboard::KEY_CARET},\n\t{\"_\", Keyboard::KEY_UNDERSCORE},\n\t{\"`\", Keyboard::KEY_BACKQUOTE},\n\t{\"a\", Keyboard::KEY_A},\n\t{\"b\", Keyboard::KEY_B},\n\t{\"c\", Keyboard::KEY_C},\n\t{\"d\", Keyboard::KEY_D},\n\t{\"e\", Keyboard::KEY_E},\n\t{\"f\", Keyboard::KEY_F},\n\t{\"g\", Keyboard::KEY_G},\n\t{\"h\", Keyboard::KEY_H},\n\t{\"i\", Keyboard::KEY_I},\n\t{\"j\", Keyboard::KEY_J},\n\t{\"k\", Keyboard::KEY_K},\n\t{\"l\", Keyboard::KEY_L},\n\t{\"m\", Keyboard::KEY_M},\n\t{\"n\", Keyboard::KEY_N},\n\t{\"o\", Keyboard::KEY_O},\n\t{\"p\", Keyboard::KEY_P},\n\t{\"q\", Keyboard::KEY_Q},\n\t{\"r\", Keyboard::KEY_R},\n\t{\"s\", Keyboard::KEY_S},\n\t{\"t\", Keyboard::KEY_T},\n\t{\"u\", Keyboard::KEY_U},\n\t{\"v\", Keyboard::KEY_V},\n\t{\"w\", Keyboard::KEY_W},\n\t{\"x\", Keyboard::KEY_X},\n\t{\"y\", Keyboard::KEY_Y},\n\t{\"z\", Keyboard::KEY_Z},\n\n\t{\"capslock\", Keyboard::KEY_CAPSLOCK},\n\n\t{\"f1\", Keyboard::KEY_F1},\n\t{\"f2\", Keyboard::KEY_F2},\n\t{\"f3\", Keyboard::KEY_F3},\n\t{\"f4\", Keyboard::KEY_F4},\n\t{\"f5\", Keyboard::KEY_F5},\n\t{\"f6\", Keyboard::KEY_F6},\n\t{\"f7\", Keyboard::KEY_F7},\n\t{\"f8\", Keyboard::KEY_F8},\n\t{\"f9\", Keyboard::KEY_F9},\n\t{\"f10\", Keyboard::KEY_F10},\n\t{\"f11\", Keyboard::KEY_F11},\n\t{\"f12\", Keyboard::KEY_F12},\n\n\t{\"printscreen\", Keyboard::KEY_PRINTSCREEN},\n\t{\"scrolllock\", Keyboard::KEY_SCROLLLOCK},\n\t{\"pause\", Keyboard::KEY_PAUSE},\n\t{\"insert\", Keyboard::KEY_INSERT},\n\t{\"home\", Keyboard::KEY_HOME},\n\t{\"pageup\", Keyboard::KEY_PAGEUP},\n\t{\"delete\", Keyboard::KEY_DELETE},\n\t{\"end\", Keyboard::KEY_END},\n\t{\"pagedown\", Keyboard::KEY_PAGEDOWN},\n\t{\"right\", Keyboard::KEY_RIGHT},\n\t{\"left\", Keyboard::KEY_LEFT},\n\t{\"down\", Keyboard::KEY_DOWN},\n\t{\"up\", Keyboard::KEY_UP},\n\n\t{\"numlock\", Keyboard::KEY_NUMLOCKCLEAR},\n\t{\"kp/\", Keyboard::KEY_KP_DIVIDE},\n\t{\"kp*\", Keyboard::KEY_KP_MULTIPLY},\n\t{\"kp-\", Keyboard::KEY_KP_MINUS},\n\t{\"kp+\", Keyboard::KEY_KP_PLUS},\n\t{\"kpenter\", Keyboard::KEY_KP_ENTER},\n\t{\"kp0\", Keyboard::KEY_KP_0},\n\t{\"kp1\", Keyboard::KEY_KP_1},\n\t{\"kp2\", Keyboard::KEY_KP_2},\n\t{\"kp3\", Keyboard::KEY_KP_3},\n\t{\"kp4\", Keyboard::KEY_KP_4},\n\t{\"kp5\", Keyboard::KEY_KP_5},\n\t{\"kp6\", Keyboard::KEY_KP_6},\n\t{\"kp7\", Keyboard::KEY_KP_7},\n\t{\"kp8\", Keyboard::KEY_KP_8},\n\t{\"kp9\", Keyboard::KEY_KP_9},\n\t{\"kp.\", Keyboard::KEY_KP_PERIOD},\n\t{\"kp,\", Keyboard::KEY_KP_COMMA},\n\t{\"kp=\", Keyboard::KEY_KP_EQUALS},\n\n\t{\"application\", Keyboard::KEY_APPLICATION},\n\t{\"power\", Keyboard::KEY_POWER},\n\t{\"f13\", Keyboard::KEY_F13},\n\t{\"f14\", Keyboard::KEY_F14},\n\t{\"f15\", Keyboard::KEY_F15},\n\t{\"f16\", Keyboard::KEY_F16},\n\t{\"f17\", Keyboard::KEY_F17},\n\t{\"f18\", Keyboard::KEY_F18},\n\t{\"f19\", Keyboard::KEY_F19},\n\t{\"f20\", Keyboard::KEY_F20},\n\t{\"f21\", Keyboard::KEY_F21},\n\t{\"f22\", Keyboard::KEY_F22},\n\t{\"f23\", Keyboard::KEY_F23},\n\t{\"f24\", Keyboard::KEY_F24},\n\t{\"execute\", Keyboard::KEY_EXECUTE},\n\t{\"help\", Keyboard::KEY_HELP},\n\t{\"menu\", Keyboard::KEY_MENU},\n\t{\"select\", Keyboard::KEY_SELECT},\n\t{\"stop\", Keyboard::KEY_STOP},\n\t{\"again\", Keyboard::KEY_AGAIN},\n\t{\"undo\", Keyboard::KEY_UNDO},\n\t{\"cut\", Keyboard::KEY_CUT},\n\t{\"copy\", Keyboard::KEY_COPY},\n\t{\"paste\", Keyboard::KEY_PASTE},\n\t{\"find\", Keyboard::KEY_FIND},\n\t{\"mute\", Keyboard::KEY_MUTE},\n\t{\"volumeup\", Keyboard::KEY_VOLUMEUP},\n\t{\"volumedown\", Keyboard::KEY_VOLUMEDOWN},\n\n\t{\"alterase\", Keyboard::KEY_ALTERASE},\n\t{\"sysreq\", Keyboard::KEY_SYSREQ},\n\t{\"cancel\", Keyboard::KEY_CANCEL},\n\t{\"clear\", Keyboard::KEY_CLEAR},\n\t{\"prior\", Keyboard::KEY_PRIOR},\n\t{\"return2\", Keyboard::KEY_RETURN2},\n\t{\"separator\", Keyboard::KEY_SEPARATOR},\n\t{\"out\", Keyboard::KEY_OUT},\n\t{\"oper\", Keyboard::KEY_OPER},\n\t{\"clearagain\", Keyboard::KEY_CLEARAGAIN},\n\n\t{\"thousandsseparator\", Keyboard::KEY_THOUSANDSSEPARATOR},\n\t{\"decimalseparator\", Keyboard::KEY_DECIMALSEPARATOR},\n\t{\"currencyunit\", Keyboard::KEY_CURRENCYUNIT},\n\t{\"currencysubunit\", Keyboard::KEY_CURRENCYSUBUNIT},\n\n\t{\"lctrl\", Keyboard::KEY_LCTRL},\n\t{\"lshift\", Keyboard::KEY_LSHIFT},\n\t{\"lalt\", Keyboard::KEY_LALT},\n\t{\"lgui\", Keyboard::KEY_LGUI},\n\t{\"rctrl\", Keyboard::KEY_RCTRL},\n\t{\"rshift\", Keyboard::KEY_RSHIFT},\n\t{\"ralt\", Keyboard::KEY_RALT},\n\t{\"rgui\", Keyboard::KEY_RGUI},\n\n\t{\"mode\", Keyboard::KEY_MODE},\n\n\t{\"audionext\", Keyboard::KEY_AUDIONEXT},\n\t{\"audioprev\", Keyboard::KEY_AUDIOPREV},\n\t{\"audiostop\", Keyboard::KEY_AUDIOSTOP},\n\t{\"audioplay\", Keyboard::KEY_AUDIOPLAY},\n\t{\"audiomute\", Keyboard::KEY_AUDIOMUTE},\n\t{\"mediaselect\", Keyboard::KEY_MEDIASELECT},\n\t{\"appsearch\", Keyboard::KEY_APP_SEARCH},\n\t{\"apphome\", Keyboard::KEY_APP_HOME},\n\t{\"appback\", Keyboard::KEY_APP_BACK},\n\t{\"appforward\", Keyboard::KEY_APP_FORWARD},\n\t{\"appstop\", Keyboard::KEY_APP_STOP},\n\t{\"apprefresh\", Keyboard::KEY_APP_REFRESH},\n\t{\"appbookmarks\", Keyboard::KEY_APP_BOOKMARKS},\n\n\t{\"eject\", Keyboard::KEY_EJECT},\n\t{\"sleep\", Keyboard::KEY_SLEEP},\n};\n\nstd::map<uint32, std::string> Keyboard::keyToString;\n\nStringMap<Keyboard::Scancode, Keyboard::SCANCODE_MAX_ENUM>::Entry Keyboard::scancodeEntries[] =\n{\n\t{\"unknown\", SCANCODE_UNKNOWN},\n\n\t{\"a\", SCANCODE_A},\n\t{\"b\", SCANCODE_B},\n\t{\"c\", SCANCODE_C},\n\t{\"d\", SCANCODE_D},\n\t{\"e\", SCANCODE_E},\n\t{\"f\", SCANCODE_F},\n\t{\"g\", SCANCODE_G},\n\t{\"h\", SCANCODE_H},\n\t{\"i\", SCANCODE_I},\n\t{\"j\", SCANCODE_J},\n\t{\"k\", SCANCODE_K},\n\t{\"l\", SCANCODE_L},\n\t{\"m\", SCANCODE_M},\n\t{\"n\", SCANCODE_N},\n\t{\"o\", SCANCODE_O},\n\t{\"p\", SCANCODE_P},\n\t{\"q\", SCANCODE_Q},\n\t{\"r\", SCANCODE_R},\n\t{\"s\", SCANCODE_S},\n\t{\"t\", SCANCODE_T},\n\t{\"u\", SCANCODE_U},\n\t{\"v\", SCANCODE_V},\n\t{\"w\", SCANCODE_W},\n\t{\"x\", SCANCODE_X},\n\t{\"y\", SCANCODE_Y},\n\t{\"z\", SCANCODE_Z},\n\n\t{\"1\", SCANCODE_1},\n\t{\"2\", SCANCODE_2},\n\t{\"3\", SCANCODE_3},\n\t{\"4\", SCANCODE_4},\n\t{\"5\", SCANCODE_5},\n\t{\"6\", SCANCODE_6},\n\t{\"7\", SCANCODE_7},\n\t{\"8\", SCANCODE_8},\n\t{\"9\", SCANCODE_9},\n\t{\"0\", SCANCODE_0},\n\n\t{\"return\", SCANCODE_RETURN},\n\t{\"escape\", SCANCODE_ESCAPE},\n\t{\"backspace\", SCANCODE_BACKSPACE},\n\t{\"tab\", SCANCODE_TAB},\n\t{\"space\", SCANCODE_SPACE},\n\n\t{\"-\", SCANCODE_MINUS},\n\t{\"=\", SCANCODE_EQUALS},\n\t{\"[\", SCANCODE_LEFTBRACKET},\n\t{\"]\", SCANCODE_RIGHTBRACKET},\n\t{\"\\\\\", SCANCODE_BACKSLASH},\n\t{\"nonus#\", SCANCODE_NONUSHASH},\n\t{\";\", SCANCODE_SEMICOLON},\n\t{\"'\", SCANCODE_APOSTROPHE},\n\t{\"`\", SCANCODE_GRAVE},\n\t{\",\", SCANCODE_COMMA},\n\t{\".\", SCANCODE_PERIOD},\n\t{\"/\", SCANCODE_SLASH},\n\n\t{\"capslock\", SCANCODE_CAPSLOCK},\n\n\t{\"f1\", SCANCODE_F1},\n\t{\"f2\", SCANCODE_F2},\n\t{\"f3\", SCANCODE_F3},\n\t{\"f4\", SCANCODE_F4},\n\t{\"f5\", SCANCODE_F5},\n\t{\"f6\", SCANCODE_F6},\n\t{\"f7\", SCANCODE_F7},\n\t{\"f8\", SCANCODE_F8},\n\t{\"f9\", SCANCODE_F9},\n\t{\"f10\", SCANCODE_F10},\n\t{\"f11\", SCANCODE_F11},\n\t{\"f12\", SCANCODE_F12},\n\n\t{\"printscreen\", SCANCODE_PRINTSCREEN},\n\t{\"scrolllock\", SCANCODE_SCROLLLOCK},\n\t{\"pause\", SCANCODE_PAUSE},\n\t{\"insert\", SCANCODE_INSERT},\n\t{\"home\", SCANCODE_HOME},\n\t{\"pageup\", SCANCODE_PAGEUP},\n\t{\"delete\", SCANCODE_DELETE},\n\t{\"end\", SCANCODE_END},\n\t{\"pagedown\", SCANCODE_PAGEDOWN},\n\t{\"right\", SCANCODE_RIGHT},\n\t{\"left\", SCANCODE_LEFT},\n\t{\"down\", SCANCODE_DOWN},\n\t{\"up\", SCANCODE_UP},\n\n\t{\"numlock\", SCANCODE_NUMLOCKCLEAR},\n\t{\"kp/\", SCANCODE_KP_DIVIDE},\n\t{\"kp*\", SCANCODE_KP_MULTIPLY},\n\t{\"kp-\", SCANCODE_KP_MINUS},\n\t{\"kp+\", SCANCODE_KP_PLUS},\n\t{\"kpenter\", SCANCODE_KP_ENTER},\n\t{\"kp1\", SCANCODE_KP_1},\n\t{\"kp2\", SCANCODE_KP_2},\n\t{\"kp3\", SCANCODE_KP_3},\n\t{\"kp4\", SCANCODE_KP_4},\n\t{\"kp5\", SCANCODE_KP_5},\n\t{\"kp6\", SCANCODE_KP_6},\n\t{\"kp7\", SCANCODE_KP_7},\n\t{\"kp8\", SCANCODE_KP_8},\n\t{\"kp9\", SCANCODE_KP_9},\n\t{\"kp0\", SCANCODE_KP_0},\n\t{\"kp.\", SCANCODE_KP_PERIOD},\n\n\t{\"nonusbackslash\", SCANCODE_NONUSBACKSLASH},\n\t{\"application\", SCANCODE_APPLICATION},\n\t{\"power\", SCANCODE_POWER},\n\t{\"kp=\", SCANCODE_KP_EQUALS},\n\t{\"f13\", SCANCODE_F13},\n\t{\"f14\", SCANCODE_F14},\n\t{\"f15\", SCANCODE_F15},\n\t{\"f16\", SCANCODE_F16},\n\t{\"f17\", SCANCODE_F17},\n\t{\"f18\", SCANCODE_F18},\n\t{\"f19\", SCANCODE_F19},\n\t{\"f20\", SCANCODE_F20},\n\t{\"f21\", SCANCODE_F21},\n\t{\"f22\", SCANCODE_F22},\n\t{\"f23\", SCANCODE_F23},\n\t{\"f24\", SCANCODE_F24},\n\t{\"execute\", SCANCODE_EXECUTE},\n\t{\"help\", SCANCODE_HELP},\n\t{\"menu\", SCANCODE_MENU},\n\t{\"select\", SCANCODE_SELECT},\n\t{\"stop\", SCANCODE_STOP},\n\t{\"again\", SCANCODE_AGAIN},\n\t{\"undo\", SCANCODE_UNDO},\n\t{\"cut\", SCANCODE_CUT},\n\t{\"copy\", SCANCODE_COPY},\n\t{\"paste\", SCANCODE_PASTE},\n\t{\"find\", SCANCODE_FIND},\n\t{\"mute\", SCANCODE_MUTE},\n\t{\"volumeup\", SCANCODE_VOLUMEUP},\n\t{\"volumedown\", SCANCODE_VOLUMEDOWN},\n\t{\"kp,\", SCANCODE_KP_COMMA},\n\t{\"kp=400\", SCANCODE_KP_EQUALSAS400},\n\n\t{\"international1\", SCANCODE_INTERNATIONAL1},\n\t{\"international2\", SCANCODE_INTERNATIONAL2},\n\t{\"international3\", SCANCODE_INTERNATIONAL3},\n\t{\"international4\", SCANCODE_INTERNATIONAL4},\n\t{\"international5\", SCANCODE_INTERNATIONAL5},\n\t{\"international6\", SCANCODE_INTERNATIONAL6},\n\t{\"international7\", SCANCODE_INTERNATIONAL7},\n\t{\"international8\", SCANCODE_INTERNATIONAL8},\n\t{\"international9\", SCANCODE_INTERNATIONAL9},\n\t{\"lang1\", SCANCODE_LANG1},\n\t{\"lang2\", SCANCODE_LANG2},\n\t{\"lang3\", SCANCODE_LANG3},\n\t{\"lang4\", SCANCODE_LANG4},\n\t{\"lang5\", SCANCODE_LANG5},\n\t{\"lang6\", SCANCODE_LANG6},\n\t{\"lang7\", SCANCODE_LANG7},\n\t{\"lang8\", SCANCODE_LANG8},\n\t{\"lang9\", SCANCODE_LANG9},\n\n\t{\"alterase\", SCANCODE_ALTERASE},\n\t{\"sysreq\", SCANCODE_SYSREQ},\n\t{\"cancel\", SCANCODE_CANCEL},\n\t{\"clear\", SCANCODE_CLEAR},\n\t{\"prior\", SCANCODE_PRIOR},\n\t{\"return2\", SCANCODE_RETURN2},\n\t{\"separator\", SCANCODE_SEPARATOR},\n\t{\"out\", SCANCODE_OUT},\n\t{\"oper\", SCANCODE_OPER},\n\t{\"clearagain\", SCANCODE_CLEARAGAIN},\n\t{\"crsel\", SCANCODE_CRSEL},\n\t{\"exsel\", SCANCODE_EXSEL},\n\n\t{\"kp00\", SCANCODE_KP_00},\n\t{\"kp000\", SCANCODE_KP_000},\n\t{\"thousandsseparator\", SCANCODE_THOUSANDSSEPARATOR},\n\t{\"decimalseparator\", SCANCODE_DECIMALSEPARATOR},\n\t{\"currencyunit\", SCANCODE_CURRENCYUNIT},\n\t{\"currencysubunit\", SCANCODE_CURRENCYSUBUNIT},\n\t{\"kp(\", SCANCODE_KP_LEFTPAREN},\n\t{\"kp)\", SCANCODE_KP_RIGHTPAREN},\n\t{\"kp{\", SCANCODE_KP_LEFTBRACE},\n\t{\"kp}\", SCANCODE_KP_RIGHTBRACE},\n\t{\"kptab\", SCANCODE_KP_TAB},\n\t{\"kpbackspace\", SCANCODE_KP_BACKSPACE},\n\t{\"kpa\", SCANCODE_KP_A},\n\t{\"kpb\", SCANCODE_KP_B},\n\t{\"kpc\", SCANCODE_KP_C},\n\t{\"kpd\", SCANCODE_KP_D},\n\t{\"kpe\", SCANCODE_KP_E},\n\t{\"kpf\", SCANCODE_KP_F},\n\t{\"kpxor\", SCANCODE_KP_XOR},\n\t{\"kpower\", SCANCODE_KP_POWER},\n\t{\"kp%\", SCANCODE_KP_PERCENT},\n\t{\"kp<\", SCANCODE_KP_LESS},\n\t{\"kp>\", SCANCODE_KP_GREATER},\n\t{\"kp&\", SCANCODE_KP_AMPERSAND},\n\t{\"kp&&\", SCANCODE_KP_DBLAMPERSAND},\n\t{\"kp|\", SCANCODE_KP_VERTICALBAR},\n\t{\"kp||\", SCANCODE_KP_DBLVERTICALBAR},\n\t{\"kp:\", SCANCODE_KP_COLON},\n\t{\"kp#\", SCANCODE_KP_HASH},\n\t{\"kp \", SCANCODE_KP_SPACE},\n\t{\"kp@\", SCANCODE_KP_AT},\n\t{\"kp!\", SCANCODE_KP_EXCLAM},\n\t{\"kpmemstore\", SCANCODE_KP_MEMSTORE},\n\t{\"kpmemrecall\", SCANCODE_KP_MEMRECALL},\n\t{\"kpmemclear\", SCANCODE_KP_MEMCLEAR},\n\t{\"kpmem+\", SCANCODE_KP_MEMADD},\n\t{\"kpmem-\", SCANCODE_KP_MEMSUBTRACT},\n\t{\"kpmem*\", SCANCODE_KP_MEMMULTIPLY},\n\t{\"kpmem/\", SCANCODE_KP_MEMDIVIDE},\n\t{\"kp+-\", SCANCODE_KP_PLUSMINUS},\n\t{\"kpclear\", SCANCODE_KP_CLEAR},\n\t{\"kpclearentry\", SCANCODE_KP_CLEARENTRY},\n\t{\"kpbinary\", SCANCODE_KP_BINARY},\n\t{\"kpoctal\", SCANCODE_KP_OCTAL},\n\t{\"kpdecimal\", SCANCODE_KP_DECIMAL},\n\t{\"kphex\", SCANCODE_KP_HEXADECIMAL},\n\n\t{\"lctrl\", SCANCODE_LCTRL},\n\t{\"lshift\", SCANCODE_LSHIFT},\n\t{\"lalt\", SCANCODE_LALT},\n\t{\"lgui\", SCANCODE_LGUI},\n\t{\"rctrl\", SCANCODE_RCTRL},\n\t{\"rshift\", SCANCODE_RSHIFT},\n\t{\"ralt\", SCANCODE_RALT},\n\t{\"rgui\", SCANCODE_RGUI},\n\n\t{\"mode\", SCANCODE_MODE},\n\n\t{\"audionext\", SCANCODE_AUDIONEXT},\n\t{\"audioprev\", SCANCODE_AUDIOPREV},\n\t{\"audiostop\", SCANCODE_AUDIOSTOP},\n\t{\"audioplay\", SCANCODE_AUDIOPLAY},\n\t{\"audiomute\", SCANCODE_AUDIOMUTE},\n\t{\"mediaselect\", SCANCODE_MEDIASELECT},\n\t{\"acsearch\", SCANCODE_AC_SEARCH},\n\t{\"achome\", SCANCODE_AC_HOME},\n\t{\"acback\", SCANCODE_AC_BACK},\n\t{\"acforward\", SCANCODE_AC_FORWARD},\n\t{\"acstop\", SCANCODE_AC_STOP},\n\t{\"acrefresh\", SCANCODE_AC_REFRESH},\n\t{\"acbookmarks\", SCANCODE_AC_BOOKMARKS},\n\n\t{\"eject\", SCANCODE_EJECT},\n\t{\"sleep\", SCANCODE_SLEEP},\n};\n\nStringMap<Keyboard::Scancode, Keyboard::SCANCODE_MAX_ENUM> Keyboard::scancodes(Keyboard::scancodeEntries, sizeof(Keyboard::scancodeEntries));\n\nStringMap<Keyboard::ModifierKey, Keyboard::MODKEY_MAX_ENUM>::Entry Keyboard::modifierEntries[] =\n{\n\t{\"numlock\", MODKEY_NUMLOCK},\n\t{\"capslock\", MODKEY_CAPSLOCK},\n\t{\"scrolllock\", MODKEY_SCROLLLOCK},\n\t{\"mode\", MODKEY_MODE},\n};\n\nStringMap<Keyboard::ModifierKey, Keyboard::MODKEY_MAX_ENUM> Keyboard::modifiers(Keyboard::modifierEntries, sizeof(Keyboard::modifierEntries));\n\n} // keyboard\n} // love\n"
  },
  {
    "path": "src/modules/keyboard/Keyboard.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_KEYBOARD_KEYBOARD_H\n#define LOVE_KEYBOARD_KEYBOARD_H\n\n// LOVE\n#include \"common/Module.h\"\n#include \"common/StringMap.h\"\n\n// C++\n#include <vector>\n#include <map>\n\nnamespace love\n{\nnamespace keyboard\n{\n\nclass Keyboard : public Module\n{\npublic:\n\n\t/**\n\t * Scancodes represent physical keys independent of the current layout.\n\t * Their names may not match the names of the keys printed on the keyboard.\n\t * Some of them are very esoteric...\n\t **/\n\tenum Scancode\n\t{\n\t\tSCANCODE_UNKNOWN,\n\n\t\tSCANCODE_A,\n\t\tSCANCODE_B,\n\t\tSCANCODE_C,\n\t\tSCANCODE_D,\n\t\tSCANCODE_E,\n\t\tSCANCODE_F,\n\t\tSCANCODE_G,\n\t\tSCANCODE_H,\n\t\tSCANCODE_I,\n\t\tSCANCODE_J,\n\t\tSCANCODE_K,\n\t\tSCANCODE_L,\n\t\tSCANCODE_M,\n\t\tSCANCODE_N,\n\t\tSCANCODE_O,\n\t\tSCANCODE_P,\n\t\tSCANCODE_Q,\n\t\tSCANCODE_R,\n\t\tSCANCODE_S,\n\t\tSCANCODE_T,\n\t\tSCANCODE_U,\n\t\tSCANCODE_V,\n\t\tSCANCODE_W,\n\t\tSCANCODE_X,\n\t\tSCANCODE_Y,\n\t\tSCANCODE_Z,\n\n\t\tSCANCODE_1,\n\t\tSCANCODE_2,\n\t\tSCANCODE_3,\n\t\tSCANCODE_4,\n\t\tSCANCODE_5,\n\t\tSCANCODE_6,\n\t\tSCANCODE_7,\n\t\tSCANCODE_8,\n\t\tSCANCODE_9,\n\t\tSCANCODE_0,\n\n\t\tSCANCODE_RETURN,\n\t\tSCANCODE_ESCAPE,\n\t\tSCANCODE_BACKSPACE,\n\t\tSCANCODE_TAB,\n\t\tSCANCODE_SPACE,\n\n\t\tSCANCODE_MINUS,\n\t\tSCANCODE_EQUALS,\n\t\tSCANCODE_LEFTBRACKET,\n\t\tSCANCODE_RIGHTBRACKET,\n\t\tSCANCODE_BACKSLASH,\n\t\tSCANCODE_NONUSHASH,\n\t\tSCANCODE_SEMICOLON,\n\t\tSCANCODE_APOSTROPHE,\n\t\tSCANCODE_GRAVE,\n\t\tSCANCODE_COMMA,\n\t\tSCANCODE_PERIOD,\n\t\tSCANCODE_SLASH,\n\n\t\tSCANCODE_CAPSLOCK,\n\n\t\tSCANCODE_F1,\n\t\tSCANCODE_F2,\n\t\tSCANCODE_F3,\n\t\tSCANCODE_F4,\n\t\tSCANCODE_F5,\n\t\tSCANCODE_F6,\n\t\tSCANCODE_F7,\n\t\tSCANCODE_F8,\n\t\tSCANCODE_F9,\n\t\tSCANCODE_F10,\n\t\tSCANCODE_F11,\n\t\tSCANCODE_F12,\n\n\t\tSCANCODE_PRINTSCREEN,\n\t\tSCANCODE_SCROLLLOCK,\n\t\tSCANCODE_PAUSE,\n\t\tSCANCODE_INSERT,\n\t\tSCANCODE_HOME,\n\t\tSCANCODE_PAGEUP,\n\t\tSCANCODE_DELETE,\n\t\tSCANCODE_END,\n\t\tSCANCODE_PAGEDOWN,\n\t\tSCANCODE_RIGHT,\n\t\tSCANCODE_LEFT,\n\t\tSCANCODE_DOWN,\n\t\tSCANCODE_UP,\n\n\t\tSCANCODE_NUMLOCKCLEAR,\n\t\tSCANCODE_KP_DIVIDE,\n\t\tSCANCODE_KP_MULTIPLY,\n\t\tSCANCODE_KP_MINUS,\n\t\tSCANCODE_KP_PLUS,\n\t\tSCANCODE_KP_ENTER,\n\t\tSCANCODE_KP_1,\n\t\tSCANCODE_KP_2,\n\t\tSCANCODE_KP_3,\n\t\tSCANCODE_KP_4,\n\t\tSCANCODE_KP_5,\n\t\tSCANCODE_KP_6,\n\t\tSCANCODE_KP_7,\n\t\tSCANCODE_KP_8,\n\t\tSCANCODE_KP_9,\n\t\tSCANCODE_KP_0,\n\t\tSCANCODE_KP_PERIOD,\n\n\t\tSCANCODE_NONUSBACKSLASH,\n\t\tSCANCODE_APPLICATION,\n\t\tSCANCODE_POWER,\n\t\tSCANCODE_KP_EQUALS,\n\t\tSCANCODE_F13,\n\t\tSCANCODE_F14,\n\t\tSCANCODE_F15,\n\t\tSCANCODE_F16,\n\t\tSCANCODE_F17,\n\t\tSCANCODE_F18,\n\t\tSCANCODE_F19,\n\t\tSCANCODE_F20,\n\t\tSCANCODE_F21,\n\t\tSCANCODE_F22,\n\t\tSCANCODE_F23,\n\t\tSCANCODE_F24,\n\t\tSCANCODE_EXECUTE,\n\t\tSCANCODE_HELP,\n\t\tSCANCODE_MENU,\n\t\tSCANCODE_SELECT,\n\t\tSCANCODE_STOP,\n\t\tSCANCODE_AGAIN,\n\t\tSCANCODE_UNDO,\n\t\tSCANCODE_CUT,\n\t\tSCANCODE_COPY,\n\t\tSCANCODE_PASTE,\n\t\tSCANCODE_FIND,\n\t\tSCANCODE_MUTE,\n\t\tSCANCODE_VOLUMEUP,\n\t\tSCANCODE_VOLUMEDOWN,\n\t\tSCANCODE_KP_COMMA,\n\t\tSCANCODE_KP_EQUALSAS400,\n\n\t\tSCANCODE_INTERNATIONAL1,\n\t\tSCANCODE_INTERNATIONAL2,\n\t\tSCANCODE_INTERNATIONAL3,\n\t\tSCANCODE_INTERNATIONAL4,\n\t\tSCANCODE_INTERNATIONAL5,\n\t\tSCANCODE_INTERNATIONAL6,\n\t\tSCANCODE_INTERNATIONAL7,\n\t\tSCANCODE_INTERNATIONAL8,\n\t\tSCANCODE_INTERNATIONAL9,\n\t\tSCANCODE_LANG1,\n\t\tSCANCODE_LANG2,\n\t\tSCANCODE_LANG3,\n\t\tSCANCODE_LANG4,\n\t\tSCANCODE_LANG5,\n\t\tSCANCODE_LANG6,\n\t\tSCANCODE_LANG7,\n\t\tSCANCODE_LANG8,\n\t\tSCANCODE_LANG9,\n\n\t\tSCANCODE_ALTERASE,\n\t\tSCANCODE_SYSREQ,\n\t\tSCANCODE_CANCEL,\n\t\tSCANCODE_CLEAR,\n\t\tSCANCODE_PRIOR,\n\t\tSCANCODE_RETURN2,\n\t\tSCANCODE_SEPARATOR,\n\t\tSCANCODE_OUT,\n\t\tSCANCODE_OPER,\n\t\tSCANCODE_CLEARAGAIN,\n\t\tSCANCODE_CRSEL,\n\t\tSCANCODE_EXSEL,\n\n\t\tSCANCODE_KP_00,\n\t\tSCANCODE_KP_000,\n\t\tSCANCODE_THOUSANDSSEPARATOR,\n\t\tSCANCODE_DECIMALSEPARATOR,\n\t\tSCANCODE_CURRENCYUNIT,\n\t\tSCANCODE_CURRENCYSUBUNIT,\n\t\tSCANCODE_KP_LEFTPAREN,\n\t\tSCANCODE_KP_RIGHTPAREN,\n\t\tSCANCODE_KP_LEFTBRACE,\n\t\tSCANCODE_KP_RIGHTBRACE,\n\t\tSCANCODE_KP_TAB,\n\t\tSCANCODE_KP_BACKSPACE,\n\t\tSCANCODE_KP_A,\n\t\tSCANCODE_KP_B,\n\t\tSCANCODE_KP_C,\n\t\tSCANCODE_KP_D,\n\t\tSCANCODE_KP_E,\n\t\tSCANCODE_KP_F,\n\t\tSCANCODE_KP_XOR,\n\t\tSCANCODE_KP_POWER,\n\t\tSCANCODE_KP_PERCENT,\n\t\tSCANCODE_KP_LESS,\n\t\tSCANCODE_KP_GREATER,\n\t\tSCANCODE_KP_AMPERSAND,\n\t\tSCANCODE_KP_DBLAMPERSAND,\n\t\tSCANCODE_KP_VERTICALBAR,\n\t\tSCANCODE_KP_DBLVERTICALBAR,\n\t\tSCANCODE_KP_COLON,\n\t\tSCANCODE_KP_HASH,\n\t\tSCANCODE_KP_SPACE,\n\t\tSCANCODE_KP_AT,\n\t\tSCANCODE_KP_EXCLAM,\n\t\tSCANCODE_KP_MEMSTORE,\n\t\tSCANCODE_KP_MEMRECALL,\n\t\tSCANCODE_KP_MEMCLEAR,\n\t\tSCANCODE_KP_MEMADD,\n\t\tSCANCODE_KP_MEMSUBTRACT,\n\t\tSCANCODE_KP_MEMMULTIPLY,\n\t\tSCANCODE_KP_MEMDIVIDE,\n\t\tSCANCODE_KP_PLUSMINUS,\n\t\tSCANCODE_KP_CLEAR,\n\t\tSCANCODE_KP_CLEARENTRY,\n\t\tSCANCODE_KP_BINARY,\n\t\tSCANCODE_KP_OCTAL,\n\t\tSCANCODE_KP_DECIMAL,\n\t\tSCANCODE_KP_HEXADECIMAL,\n\n\t\tSCANCODE_LCTRL,\n\t\tSCANCODE_LSHIFT,\n\t\tSCANCODE_LALT,\n\t\tSCANCODE_LGUI,\n\t\tSCANCODE_RCTRL,\n\t\tSCANCODE_RSHIFT,\n\t\tSCANCODE_RALT,\n\t\tSCANCODE_RGUI,\n\n\t\tSCANCODE_MODE,\n\n\t\tSCANCODE_AUDIONEXT,\n\t\tSCANCODE_AUDIOPREV,\n\t\tSCANCODE_AUDIOSTOP,\n\t\tSCANCODE_AUDIOPLAY,\n\t\tSCANCODE_AUDIOMUTE,\n\t\tSCANCODE_MEDIASELECT,\n\t\tSCANCODE_AC_SEARCH,\n\t\tSCANCODE_AC_HOME,\n\t\tSCANCODE_AC_BACK,\n\t\tSCANCODE_AC_FORWARD,\n\t\tSCANCODE_AC_STOP,\n\t\tSCANCODE_AC_REFRESH,\n\t\tSCANCODE_AC_BOOKMARKS,\n\n\t\tSCANCODE_EJECT,\n\t\tSCANCODE_SLEEP,\n\n\t\tSCANCODE_MAX_ENUM\n\t};\n\n\t/**\n\t * Modifier keys. These are special keys that temporarily modify the normal function of a button when active.\n\t **/\n\tenum ModifierKey\n\t{\n\t\tMODKEY_NUMLOCK,\n\t\tMODKEY_CAPSLOCK,\n\t\tMODKEY_SCROLLLOCK,\n\t\tMODKEY_MODE,\n\t\tMODKEY_MAX_ENUM\n\t};\n\n\tstatic constexpr uint32 KEY_SCANCODE_MASK = 1u << 30;\n\n\t#define LOVE_KEY(scancode) (scancode | KEY_SCANCODE_MASK)\n\n\t/**\n\t * Keyboard keys. They are dependent on the current layout of the keyboard.\n\t * This is not a full list of all keys - any unicode character can be a key,\n\t * which is why the ASCII keys in this list use their ASCII value directly.\n\t **/\n\tenum Key\n\t{\n\t\tKEY_UNKNOWN = 0,\n\n\t\tKEY_RETURN = '\\r',\n\t\tKEY_ESCAPE = '\\x1B',\n\t\tKEY_BACKSPACE = '\\b',\n\t\tKEY_TAB = '\\t',\n\t\tKEY_SPACE = ' ',\n\t\tKEY_EXCLAIM = '!',\n\t\tKEY_QUOTEDBL = '\"',\n\t\tKEY_HASH = '#',\n\t\tKEY_PERCENT = '%',\n\t\tKEY_DOLLAR = '$',\n\t\tKEY_AMPERSAND = '&',\n\t\tKEY_QUOTE = '\\'',\n\t\tKEY_LEFTPAREN = '(',\n\t\tKEY_RIGHTPAREN = ')',\n\t\tKEY_ASTERISK = '*',\n\t\tKEY_PLUS = '+',\n\t\tKEY_COMMA = ',',\n\t\tKEY_MINUS = '-',\n\t\tKEY_PERIOD = '.',\n\t\tKEY_SLASH = '/',\n\t\tKEY_0 = '0',\n\t\tKEY_1 = '1',\n\t\tKEY_2 = '2',\n\t\tKEY_3 = '3',\n\t\tKEY_4 = '4',\n\t\tKEY_5 = '5',\n\t\tKEY_6 = '6',\n\t\tKEY_7 = '7',\n\t\tKEY_8 = '8',\n\t\tKEY_9 = '9',\n\t\tKEY_COLON = ':',\n\t\tKEY_SEMICOLON = ';',\n\t\tKEY_LESS = '<',\n\t\tKEY_EQUALS = '=',\n\t\tKEY_GREATER = '>',\n\t\tKEY_QUESTION = '?',\n\t\tKEY_AT = '@',\n\n\t\tKEY_LEFTBRACKET = '[',\n\t\tKEY_BACKSLASH = '\\\\',\n\t\tKEY_RIGHTBRACKET = ']',\n\t\tKEY_CARET = '^',\n\t\tKEY_UNDERSCORE = '_',\n\t\tKEY_BACKQUOTE = '`',\n\t\tKEY_A = 'a',\n\t\tKEY_B = 'b',\n\t\tKEY_C = 'c',\n\t\tKEY_D = 'd',\n\t\tKEY_E = 'e',\n\t\tKEY_F = 'f',\n\t\tKEY_G = 'g',\n\t\tKEY_H = 'h',\n\t\tKEY_I = 'i',\n\t\tKEY_J = 'j',\n\t\tKEY_K = 'k',\n\t\tKEY_L = 'l',\n\t\tKEY_M = 'm',\n\t\tKEY_N = 'n',\n\t\tKEY_O = 'o',\n\t\tKEY_P = 'p',\n\t\tKEY_Q = 'q',\n\t\tKEY_R = 'r',\n\t\tKEY_S = 's',\n\t\tKEY_T = 't',\n\t\tKEY_U = 'u',\n\t\tKEY_V = 'v',\n\t\tKEY_W = 'w',\n\t\tKEY_X = 'x',\n\t\tKEY_Y = 'y',\n\t\tKEY_Z = 'z',\n\n\t\tKEY_DELETE = '\\x7F',\n\n\t\tKEY_CAPSLOCK = LOVE_KEY(SCANCODE_CAPSLOCK),\n\n\t\tKEY_F1 = LOVE_KEY(SCANCODE_F1),\n\t\tKEY_F2 = LOVE_KEY(SCANCODE_F2),\n\t\tKEY_F3 = LOVE_KEY(SCANCODE_F3),\n\t\tKEY_F4 = LOVE_KEY(SCANCODE_F4),\n\t\tKEY_F5 = LOVE_KEY(SCANCODE_F5),\n\t\tKEY_F6 = LOVE_KEY(SCANCODE_F6),\n\t\tKEY_F7 = LOVE_KEY(SCANCODE_F7),\n\t\tKEY_F8 = LOVE_KEY(SCANCODE_F8),\n\t\tKEY_F9 = LOVE_KEY(SCANCODE_F9),\n\t\tKEY_F10 = LOVE_KEY(SCANCODE_F10),\n\t\tKEY_F11 = LOVE_KEY(SCANCODE_F11),\n\t\tKEY_F12 = LOVE_KEY(SCANCODE_F12),\n\n\t\tKEY_PRINTSCREEN = LOVE_KEY(SCANCODE_PRINTSCREEN),\n\t\tKEY_SCROLLLOCK = LOVE_KEY(SCANCODE_SCROLLLOCK),\n\t\tKEY_PAUSE = LOVE_KEY(SCANCODE_PAUSE),\n\t\tKEY_INSERT = LOVE_KEY(SCANCODE_INSERT),\n\t\tKEY_HOME = LOVE_KEY(SCANCODE_HOME),\n\t\tKEY_PAGEUP = LOVE_KEY(SCANCODE_PAGEUP),\n\t\tKEY_END = LOVE_KEY(SCANCODE_END),\n\t\tKEY_PAGEDOWN = LOVE_KEY(SCANCODE_PAGEDOWN),\n\t\tKEY_RIGHT = LOVE_KEY(SCANCODE_RIGHT),\n\t\tKEY_LEFT = LOVE_KEY(SCANCODE_LEFT),\n\t\tKEY_DOWN = LOVE_KEY(SCANCODE_DOWN),\n\t\tKEY_UP = LOVE_KEY(SCANCODE_UP),\n\n\t\tKEY_NUMLOCKCLEAR = LOVE_KEY(SCANCODE_NUMLOCKCLEAR),\n\t\tKEY_KP_DIVIDE = LOVE_KEY(SCANCODE_KP_DIVIDE),\n\t\tKEY_KP_MULTIPLY = LOVE_KEY(SCANCODE_KP_MULTIPLY),\n\t\tKEY_KP_MINUS = LOVE_KEY(SCANCODE_KP_MINUS),\n\t\tKEY_KP_PLUS = LOVE_KEY(SCANCODE_KP_PLUS),\n\t\tKEY_KP_ENTER = LOVE_KEY(SCANCODE_KP_ENTER),\n\t\tKEY_KP_1 = LOVE_KEY(SCANCODE_KP_1),\n\t\tKEY_KP_2 = LOVE_KEY(SCANCODE_KP_2),\n\t\tKEY_KP_3 = LOVE_KEY(SCANCODE_KP_3),\n\t\tKEY_KP_4 = LOVE_KEY(SCANCODE_KP_4),\n\t\tKEY_KP_5 = LOVE_KEY(SCANCODE_KP_5),\n\t\tKEY_KP_6 = LOVE_KEY(SCANCODE_KP_6),\n\t\tKEY_KP_7 = LOVE_KEY(SCANCODE_KP_7),\n\t\tKEY_KP_8 = LOVE_KEY(SCANCODE_KP_8),\n\t\tKEY_KP_9 = LOVE_KEY(SCANCODE_KP_9),\n\t\tKEY_KP_0 = LOVE_KEY(SCANCODE_KP_0),\n\t\tKEY_KP_PERIOD = LOVE_KEY(SCANCODE_KP_PERIOD),\n\t\tKEY_KP_COMMA = LOVE_KEY(SCANCODE_KP_COMMA),\n\t\tKEY_KP_EQUALS = LOVE_KEY(SCANCODE_KP_EQUALS),\n\n\t\tKEY_APPLICATION = LOVE_KEY(SCANCODE_APPLICATION),\n\t\tKEY_POWER = LOVE_KEY(SCANCODE_POWER),\n\t\tKEY_F13 = LOVE_KEY(SCANCODE_F13),\n\t\tKEY_F14 = LOVE_KEY(SCANCODE_F14),\n\t\tKEY_F15 = LOVE_KEY(SCANCODE_F15),\n\t\tKEY_F16 = LOVE_KEY(SCANCODE_F16),\n\t\tKEY_F17 = LOVE_KEY(SCANCODE_F17),\n\t\tKEY_F18 = LOVE_KEY(SCANCODE_F18),\n\t\tKEY_F19 = LOVE_KEY(SCANCODE_F19),\n\t\tKEY_F20 = LOVE_KEY(SCANCODE_F20),\n\t\tKEY_F21 = LOVE_KEY(SCANCODE_F21),\n\t\tKEY_F22 = LOVE_KEY(SCANCODE_F22),\n\t\tKEY_F23 = LOVE_KEY(SCANCODE_F23),\n\t\tKEY_F24 = LOVE_KEY(SCANCODE_F24),\n\t\tKEY_EXECUTE = LOVE_KEY(SCANCODE_EXECUTE),\n\t\tKEY_HELP = LOVE_KEY(SCANCODE_HELP),\n\t\tKEY_MENU = LOVE_KEY(SCANCODE_MENU),\n\t\tKEY_SELECT = LOVE_KEY(SCANCODE_SELECT),\n\t\tKEY_STOP = LOVE_KEY(SCANCODE_STOP),\n\t\tKEY_AGAIN = LOVE_KEY(SCANCODE_AGAIN),\n\t\tKEY_UNDO = LOVE_KEY(SCANCODE_UNDO),\n\t\tKEY_CUT = LOVE_KEY(SCANCODE_CUT),\n\t\tKEY_COPY = LOVE_KEY(SCANCODE_COPY),\n\t\tKEY_PASTE = LOVE_KEY(SCANCODE_PASTE),\n\t\tKEY_FIND = LOVE_KEY(SCANCODE_FIND),\n\t\tKEY_MUTE = LOVE_KEY(SCANCODE_MUTE),\n\t\tKEY_VOLUMEUP = LOVE_KEY(SCANCODE_VOLUMEUP),\n\t\tKEY_VOLUMEDOWN = LOVE_KEY(SCANCODE_VOLUMEDOWN),\n\n\t\tKEY_ALTERASE = LOVE_KEY(SCANCODE_ALTERASE),\n\t\tKEY_SYSREQ = LOVE_KEY(SCANCODE_SYSREQ),\n\t\tKEY_CANCEL = LOVE_KEY(SCANCODE_CANCEL),\n\t\tKEY_CLEAR = LOVE_KEY(SCANCODE_CLEAR),\n\t\tKEY_PRIOR = LOVE_KEY(SCANCODE_PRIOR),\n\t\tKEY_RETURN2 = LOVE_KEY(SCANCODE_RETURN2),\n\t\tKEY_SEPARATOR = LOVE_KEY(SCANCODE_SEPARATOR),\n\t\tKEY_OUT = LOVE_KEY(SCANCODE_OUT),\n\t\tKEY_OPER = LOVE_KEY(SCANCODE_OPER),\n\t\tKEY_CLEARAGAIN = LOVE_KEY(SCANCODE_CLEARAGAIN),\n\n\t\tKEY_THOUSANDSSEPARATOR = LOVE_KEY(SCANCODE_THOUSANDSSEPARATOR),\n\t\tKEY_DECIMALSEPARATOR = LOVE_KEY(SCANCODE_DECIMALSEPARATOR),\n\t\tKEY_CURRENCYUNIT = LOVE_KEY(SCANCODE_CURRENCYUNIT),\n\t\tKEY_CURRENCYSUBUNIT = LOVE_KEY(SCANCODE_CURRENCYSUBUNIT),\n\n\t\tKEY_LCTRL = LOVE_KEY(SCANCODE_LCTRL),\n\t\tKEY_LSHIFT = LOVE_KEY(SCANCODE_LSHIFT),\n\t\tKEY_LALT = LOVE_KEY(SCANCODE_LALT),\n\t\tKEY_LGUI = LOVE_KEY(SCANCODE_LGUI),\n\t\tKEY_RCTRL = LOVE_KEY(SCANCODE_RCTRL),\n\t\tKEY_RSHIFT = LOVE_KEY(SCANCODE_RSHIFT),\n\t\tKEY_RALT = LOVE_KEY(SCANCODE_RALT),\n\t\tKEY_RGUI = LOVE_KEY(SCANCODE_RGUI),\n\n\t\tKEY_MODE = LOVE_KEY(SCANCODE_MODE),\n\n\t\tKEY_AUDIONEXT = LOVE_KEY(SCANCODE_AUDIONEXT),\n\t\tKEY_AUDIOPREV = LOVE_KEY(SCANCODE_AUDIOPREV),\n\t\tKEY_AUDIOSTOP = LOVE_KEY(SCANCODE_AUDIOSTOP),\n\t\tKEY_AUDIOPLAY = LOVE_KEY(SCANCODE_AUDIOPLAY),\n\t\tKEY_AUDIOMUTE = LOVE_KEY(SCANCODE_AUDIOMUTE),\n\t\tKEY_MEDIASELECT = LOVE_KEY(SCANCODE_MEDIASELECT),\n\t\tKEY_APP_SEARCH = LOVE_KEY(SCANCODE_AC_SEARCH),\n\t\tKEY_APP_HOME = LOVE_KEY(SCANCODE_AC_HOME),\n\t\tKEY_APP_BACK = LOVE_KEY(SCANCODE_AC_BACK),\n\t\tKEY_APP_FORWARD = LOVE_KEY(SCANCODE_AC_FORWARD),\n\t\tKEY_APP_STOP = LOVE_KEY(SCANCODE_AC_STOP),\n\t\tKEY_APP_REFRESH = LOVE_KEY(SCANCODE_AC_REFRESH),\n\t\tKEY_APP_BOOKMARKS = LOVE_KEY(SCANCODE_AC_BOOKMARKS),\n\n\t\tKEY_EJECT = LOVE_KEY(SCANCODE_EJECT),\n\t\tKEY_SLEEP = LOVE_KEY(SCANCODE_SLEEP),\n\t};\n\n\t#undef LOVE_KEY\n\n\tvirtual ~Keyboard() {}\n\n\t/**\n\t * Sets whether repeat keypress events should be sent if a key is held down.\n\t * Does not affect text input events.\n\t * @param enable Whether to send repeat key press events.\n\t **/\n\tvirtual void setKeyRepeat(bool enable) = 0;\n\n\t/**\n\t * Gets whether repeat keypress events will be sent if a key is held down.\n\t **/\n\tvirtual bool hasKeyRepeat() const = 0;\n\n\t/**\n\t * Checks whether certain keys are pressed or not.\n\t * @param keylist A list of key identifiers.\n\t * @return Whether any of the specified keys are pressed.\n\t **/\n\tvirtual bool isDown(const std::vector<Key> &keylist) const = 0;\n\n\t/**\n\t * Checks whether certain scancodes are pressed or not.\n\t * @param scancodelist A list of scancodes.\n\t * @return Whether any of the specified scancodes are pressed.\n\t **/\n\tvirtual bool isScancodeDown(const std::vector<Scancode> &scancodelist) const = 0;\n\n\t/**\n\t * Checks whether specific modifier key is active or not.\n\t * @param key Modifier key to check.\n\t * @return Whether the specified modifier key is active.\n\t **/\n\tvirtual bool isModifierActive(ModifierKey key) const = 0;\n\n\t/**\n\t * Gets the key corresponding to the specified scancode according to the\n\t * current keyboard layout.\n\t **/\n\tvirtual Key getKeyFromScancode(Scancode scancode) const = 0;\n\n\t/**\n\t * Gets the scancode corresponding to the specified key according to the\n\t * current keyboard layout.\n\t **/\n\tvirtual Scancode getScancodeFromKey(Key key) const = 0;\n\n\t/**\n\t * Sets whether text input events should be received.\n\t * @param enable Whether to receive text input events.\n\t **/\n\tvirtual void setTextInput(bool enable) = 0;\n\n\t/**\n\t * Sets whether text input events should be received, and specifies where\n\t * on the screen the text will appear. This is used as a hint so on-screen\n\t * keyboards don't cover the text area.\n\t **/\n\tvirtual void setTextInput(bool enable, double x, double y, double w, double h) = 0;\n\n\t/**\n\t * Gets whether text input events are enabled.\n\t **/\n\tvirtual bool hasTextInput() const = 0;\n\n\t/**\n\t * Gets whether the system will display an on-screen keyboard when text input\n\t * events are enabled.\n\t **/\n\tvirtual bool hasScreenKeyboard() const = 0;\n\n\tvirtual bool isScreenKeyboardVisible() const = 0;\n\n\tstatic bool getConstant(const char *in, Key &out);\n\tstatic bool getConstant(Key in, const char *&out);\n\n\tstatic bool getConstant(const char *in, Scancode &out);\n\tstatic bool getConstant(Scancode in, const char *&out);\n\n\tstatic bool getConstant(const char *in, ModifierKey &out);\n\tstatic bool getConstant(ModifierKey in, const char *&out);\n\nprotected:\n\n\tKeyboard(const char *name);\n\nprivate:\n\n\tstatic std::map<uint32, std::string> keyToString;\n\tstatic std::map<std::string, uint32> stringToKey;\n\n\tstatic StringMap<Scancode, SCANCODE_MAX_ENUM>::Entry scancodeEntries[];\n\tstatic StringMap<Scancode, SCANCODE_MAX_ENUM> scancodes;\n\n\tstatic StringMap<ModifierKey, MODKEY_MAX_ENUM>::Entry modifierEntries[];\n\tstatic StringMap<ModifierKey, MODKEY_MAX_ENUM> modifiers;\n\n}; // Keyboard\n\n} // keyboard\n} // love\n\n#endif // LOVE_KEYBOARD_KEYBOARD_H\n"
  },
  {
    "path": "src/modules/keyboard/sdl/Keyboard.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Keyboard.h\"\n#include \"window/Window.h\"\n#include \"common/config.h\"\n\nnamespace love\n{\nnamespace keyboard\n{\nnamespace sdl\n{\n\nstatic SDL_Window *getSDLWindow()\n{\n\tauto window = Module::getInstance<window::Window>(Module::M_WINDOW);\n\tif (window)\n\t\treturn (SDL_Window *) window->getHandle();\n\treturn nullptr;\n}\n\nKeyboard::Keyboard()\n\t: love::keyboard::Keyboard(\"love.keyboard.sdl\")\n\t, key_repeat(false)\n{\n}\n\nvoid Keyboard::setKeyRepeat(bool enable)\n{\n\tkey_repeat = enable;\n}\n\nbool Keyboard::hasKeyRepeat() const\n{\n\treturn key_repeat;\n}\n\nbool Keyboard::isDown(const std::vector<Key> &keylist) const\n{\n\tconst bool *state = SDL_GetKeyboardState(nullptr);\n\n\tfor (Key key : keylist)\n\t{\n\t\tSDL_Keycode sdlkey = SDLK_UNKNOWN;\n\t\tif (getConstant(key, sdlkey))\n\t\t{\n\t\t\tSDL_Scancode scancode = SDL_GetScancodeFromKey(sdlkey, nullptr);\n\t\t\tif (state[scancode])\n\t\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nbool Keyboard::isScancodeDown(const std::vector<Scancode> &scancodelist) const\n{\n\tconst bool *state = SDL_GetKeyboardState(nullptr);\n\n\tfor (Scancode scancode : scancodelist)\n\t{\n\t\tSDL_Scancode sdlcode = SDL_SCANCODE_UNKNOWN;\n\n\t\tif (scancodes.find(scancode, sdlcode) && state[sdlcode])\n\t\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool Keyboard::isModifierActive(ModifierKey key) const\n{\n\tint modstate = SDL_GetModState();\n\n\tswitch (key)\n\t{\n\tcase MODKEY_NUMLOCK:\n\t\treturn (modstate & SDL_KMOD_NUM) != 0;\n\tcase MODKEY_CAPSLOCK:\n\t\treturn (modstate & SDL_KMOD_CAPS) != 0;\n\tcase MODKEY_SCROLLLOCK:\n\t\treturn (modstate & SDL_KMOD_SCROLL) != 0;\n\tcase MODKEY_MODE:\n\t\treturn (modstate & SDL_KMOD_MODE) != 0;\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn false;\n}\n\nKeyboard::Key Keyboard::getKeyFromScancode(Scancode scancode) const\n{\n\tSDL_Scancode sdlscancode = SDL_SCANCODE_UNKNOWN;\n\tscancodes.find(scancode, sdlscancode);\n\n\tSDL_Keycode sdlkey = SDL_GetKeyFromScancode(sdlscancode, SDL_KMOD_NONE, false);\n\n\tKey key = KEY_UNKNOWN;\n\tgetConstant(sdlkey, key);\n\treturn key;\n}\n\nKeyboard::Scancode Keyboard::getScancodeFromKey(Key key) const\n{\n\tScancode scancode = SCANCODE_UNKNOWN;\n\n\tSDL_Keycode sdlkey = SDLK_UNKNOWN;\n\tif (getConstant(key, sdlkey))\n\t{\n\t\tSDL_Scancode sdlscancode = SDL_GetScancodeFromKey(sdlkey, nullptr);\n\t\tscancodes.find(sdlscancode, scancode);\n\t}\n\n\treturn scancode;\n}\n\nvoid Keyboard::setTextInput(bool enable)\n{\n\tSDL_Window *window = getSDLWindow();\n\tif (window == nullptr)\n\t\treturn;\n\tif (enable)\n\t\tSDL_StartTextInput(window);\n\telse\n\t\tSDL_StopTextInput(window);\n}\n\nvoid Keyboard::setTextInput(bool enable, double x, double y, double w, double h)\n{\n\t// SDL_SetTextInputRect expects coordinates in window-space but setTextInput\n\t// takes pixels, so we should convert.\n\tauto window = Module::getInstance<window::Window>(M_WINDOW);\n\tif (window)\n\t{\n\t\twindow->DPIToWindowCoords(&x, &y);\n\t\twindow->DPIToWindowCoords(&w, &h);\n\t}\n\n\tSDL_Rect rect = {(int) x, (int) y, (int) w, (int) h};\n\n\tSDL_Window *sdlwindow = getSDLWindow();\n\tif (sdlwindow != nullptr)\n\t\tSDL_SetTextInputArea(sdlwindow, &rect, 0);\n\n\tsetTextInput(enable);\n}\n\nbool Keyboard::hasTextInput() const\n{\n\tSDL_Window *window = getSDLWindow();\n\tif (window == nullptr)\n\t\treturn false;\n\treturn SDL_TextInputActive(window);\n}\n\nbool Keyboard::hasScreenKeyboard() const\n{\n\treturn SDL_HasScreenKeyboardSupport();\n}\n\nbool Keyboard::isScreenKeyboardVisible() const\n{\n\tSDL_Window *window = getSDLWindow();\n\tif (window == nullptr)\n\t\treturn false;\n\treturn SDL_ScreenKeyboardShown(window);\n}\n\nbool Keyboard::getConstant(Key in, SDL_Keycode &out)\n{\n\tif (in & KEY_SCANCODE_MASK)\n\t{\n\t\tauto it = keyToSDLKey.find(in);\n\t\tif (it != keyToSDLKey.end())\n\t\t{\n\t\t\tout = it->second;\n\t\t\treturn true;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// All other keys use the same value as their ASCII character\n\t\t// representation in SDL and in love.\n\t\tout = (SDL_Keycode)in;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool Keyboard::getConstant(SDL_Keycode in, Key &out)\n{\n#ifdef LOVE_ANDROID\n\t// TODO: Can this be done more cleanly?\n\tif (in == SDLK_AC_BACK)\n\t{\n\t\tout = KEY_ESCAPE;\n\t\treturn true;\n\t}\n#endif\n\n\tif (in & SDLK_SCANCODE_MASK)\n\t{\n\t\tif (sdlKeyToKey.empty())\n\t\t{\n\t\t\tfor (const auto& kvp : keyToSDLKey)\n\t\t\t\tsdlKeyToKey[kvp.second] = kvp.first;\n\t\t}\n\n\t\tauto it = sdlKeyToKey.find(in);\n\t\tif (it != sdlKeyToKey.end())\n\t\t{\n\t\t\tout = it->second;\n\t\t\treturn true;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// All other keys use the same value as their ASCII character\n\t\t// representation in SDL and in love.\n\t\tout = (Key)in;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool Keyboard::getConstant(Scancode in, SDL_Scancode &out)\n{\n\treturn scancodes.find(in, out);\n}\n\nbool Keyboard::getConstant(SDL_Scancode in, Scancode &out)\n{\n\treturn scancodes.find(in, out);\n}\n\nstd::map<Keyboard::Key, SDL_Keycode> Keyboard::keyToSDLKey =\n{\n\t// ASCII characters don't need to go here since they can be directly\n\t// converted.\n\n\t{ KEY_UNKNOWN, SDLK_UNKNOWN },\n\n\t{ KEY_CAPSLOCK, SDLK_CAPSLOCK },\n\n\t{ KEY_F1, SDLK_F1 },\n\t{ KEY_F2, SDLK_F2 },\n\t{ KEY_F3, SDLK_F3 },\n\t{ KEY_F4, SDLK_F4 },\n\t{ KEY_F5, SDLK_F5 },\n\t{ KEY_F6, SDLK_F6 },\n\t{ KEY_F7, SDLK_F7 },\n\t{ KEY_F8, SDLK_F8 },\n\t{ KEY_F9, SDLK_F9 },\n\t{ KEY_F10, SDLK_F10 },\n\t{ KEY_F11, SDLK_F11 },\n\t{ KEY_F12, SDLK_F12 },\n\n\t{ KEY_PRINTSCREEN, SDLK_PRINTSCREEN },\n\t{ KEY_SCROLLLOCK, SDLK_SCROLLLOCK },\n\t{ KEY_PAUSE, SDLK_PAUSE },\n\t{ KEY_INSERT, SDLK_INSERT },\n\t{ KEY_HOME, SDLK_HOME },\n\t{ KEY_PAGEUP, SDLK_PAGEUP },\n\t{ KEY_DELETE, SDLK_DELETE },\n\t{ KEY_END, SDLK_END },\n\t{ KEY_PAGEDOWN, SDLK_PAGEDOWN },\n\t{ KEY_RIGHT, SDLK_RIGHT },\n\t{ KEY_LEFT, SDLK_LEFT },\n\t{ KEY_DOWN, SDLK_DOWN },\n\t{ KEY_UP, SDLK_UP },\n\n\t{ KEY_NUMLOCKCLEAR, SDLK_NUMLOCKCLEAR },\n\t{ KEY_KP_DIVIDE, SDLK_KP_DIVIDE },\n\t{ KEY_KP_MULTIPLY, SDLK_KP_MULTIPLY },\n\t{ KEY_KP_MINUS, SDLK_KP_MINUS },\n\t{ KEY_KP_PLUS, SDLK_KP_PLUS },\n\t{ KEY_KP_ENTER, SDLK_KP_ENTER },\n\t{ KEY_KP_0, SDLK_KP_0 },\n\t{ KEY_KP_1, SDLK_KP_1 },\n\t{ KEY_KP_2, SDLK_KP_2 },\n\t{ KEY_KP_3, SDLK_KP_3 },\n\t{ KEY_KP_4, SDLK_KP_4 },\n\t{ KEY_KP_5, SDLK_KP_5 },\n\t{ KEY_KP_6, SDLK_KP_6 },\n\t{ KEY_KP_7, SDLK_KP_7 },\n\t{ KEY_KP_8, SDLK_KP_8 },\n\t{ KEY_KP_9, SDLK_KP_9 },\n\t{ KEY_KP_PERIOD, SDLK_KP_PERIOD },\n\t{ KEY_KP_COMMA, SDLK_KP_COMMA },\n\t{ KEY_KP_EQUALS, SDLK_KP_EQUALS },\n\n\t{ KEY_APPLICATION, SDLK_APPLICATION },\n\t{ KEY_POWER, SDLK_POWER },\n\t{ KEY_F13, SDLK_F13 },\n\t{ KEY_F14, SDLK_F14 },\n\t{ KEY_F15, SDLK_F15 },\n\t{ KEY_F16, SDLK_F16 },\n\t{ KEY_F17, SDLK_F17 },\n\t{ KEY_F18, SDLK_F18 },\n\t{ KEY_F19, SDLK_F19 },\n\t{ KEY_F20, SDLK_F20 },\n\t{ KEY_F21, SDLK_F21 },\n\t{ KEY_F22, SDLK_F22 },\n\t{ KEY_F23, SDLK_F23 },\n\t{ KEY_F24, SDLK_F24 },\n\t{ KEY_EXECUTE, SDLK_EXECUTE },\n\t{ KEY_HELP, SDLK_HELP },\n\t{ KEY_MENU, SDLK_MENU },\n\t{ KEY_SELECT, SDLK_SELECT },\n\t{ KEY_STOP, SDLK_STOP },\n\t{ KEY_AGAIN, SDLK_AGAIN },\n\t{ KEY_UNDO, SDLK_UNDO },\n\t{ KEY_CUT, SDLK_CUT },\n\t{ KEY_COPY, SDLK_COPY },\n\t{ KEY_PASTE, SDLK_PASTE },\n\t{ KEY_FIND, SDLK_FIND },\n\t{ KEY_MUTE, SDLK_MUTE },\n\t{ KEY_VOLUMEUP, SDLK_VOLUMEUP },\n\t{ KEY_VOLUMEDOWN, SDLK_VOLUMEDOWN },\n\n\t{ KEY_ALTERASE, SDLK_ALTERASE },\n\t{ KEY_SYSREQ, SDLK_SYSREQ },\n\t{ KEY_CANCEL, SDLK_CANCEL },\n\t{ KEY_CLEAR, SDLK_CLEAR },\n\t{ KEY_PRIOR, SDLK_PRIOR },\n\t{ KEY_RETURN2, SDLK_RETURN2 },\n\t{ KEY_SEPARATOR, SDLK_SEPARATOR },\n\t{ KEY_OUT, SDLK_OUT },\n\t{ KEY_OPER, SDLK_OPER },\n\t{ KEY_CLEARAGAIN, SDLK_CLEARAGAIN },\n\n\t{ KEY_THOUSANDSSEPARATOR, SDLK_THOUSANDSSEPARATOR },\n\t{ KEY_DECIMALSEPARATOR, SDLK_DECIMALSEPARATOR },\n\t{ KEY_CURRENCYUNIT, SDLK_CURRENCYUNIT },\n\t{ KEY_CURRENCYSUBUNIT, SDLK_CURRENCYSUBUNIT },\n\n\t{ KEY_LCTRL, SDLK_LCTRL },\n\t{ KEY_LSHIFT, SDLK_LSHIFT },\n\t{ KEY_LALT, SDLK_LALT },\n\t{ KEY_LGUI, SDLK_LGUI },\n\t{ KEY_RCTRL, SDLK_RCTRL },\n\t{ KEY_RSHIFT, SDLK_RSHIFT },\n\t{ KEY_RALT, SDLK_RALT },\n\t{ KEY_RGUI, SDLK_RGUI },\n\n\t{ KEY_MODE, SDLK_MODE },\n\n\t{ KEY_AUDIONEXT, SDLK_MEDIA_NEXT_TRACK },\n\t{ KEY_AUDIOPREV, SDLK_MEDIA_PREVIOUS_TRACK },\n\t{ KEY_AUDIOSTOP, SDLK_MEDIA_STOP },\n\t{ KEY_AUDIOPLAY, SDLK_MEDIA_PLAY },\n\t{ KEY_AUDIOMUTE, SDLK_MUTE },\n\t{ KEY_MEDIASELECT, SDLK_MEDIA_SELECT },\n\t{ KEY_APP_SEARCH, SDLK_AC_SEARCH },\n\t{ KEY_APP_HOME, SDLK_AC_HOME },\n\t{ KEY_APP_BACK, SDLK_AC_BACK },\n\t{ KEY_APP_FORWARD, SDLK_AC_FORWARD },\n\t{ KEY_APP_STOP, SDLK_AC_STOP },\n\t{ KEY_APP_REFRESH, SDLK_AC_REFRESH },\n\t{ KEY_APP_BOOKMARKS, SDLK_AC_BOOKMARKS },\n\n\t{ KEY_EJECT, SDLK_MEDIA_EJECT },\n\t{ KEY_SLEEP, SDLK_SLEEP },\n};\n\nstd::map<SDL_Keycode, Keyboard::Key> Keyboard::sdlKeyToKey;\n\nEnumMap<Keyboard::Scancode, SDL_Scancode, SDL_SCANCODE_COUNT>::Entry Keyboard::scancodeEntries[] =\n{\n\t{SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN},\n\n\t{SCANCODE_A, SDL_SCANCODE_A},\n\t{SCANCODE_B, SDL_SCANCODE_B},\n\t{SCANCODE_C, SDL_SCANCODE_C},\n\t{SCANCODE_D, SDL_SCANCODE_D},\n\t{SCANCODE_E, SDL_SCANCODE_E},\n\t{SCANCODE_F, SDL_SCANCODE_F},\n\t{SCANCODE_G, SDL_SCANCODE_G},\n\t{SCANCODE_H, SDL_SCANCODE_H},\n\t{SCANCODE_I, SDL_SCANCODE_I},\n\t{SCANCODE_J, SDL_SCANCODE_J},\n\t{SCANCODE_K, SDL_SCANCODE_K},\n\t{SCANCODE_L, SDL_SCANCODE_L},\n\t{SCANCODE_M, SDL_SCANCODE_M},\n\t{SCANCODE_N, SDL_SCANCODE_N},\n\t{SCANCODE_O, SDL_SCANCODE_O},\n\t{SCANCODE_P, SDL_SCANCODE_P},\n\t{SCANCODE_Q, SDL_SCANCODE_Q},\n\t{SCANCODE_R, SDL_SCANCODE_R},\n\t{SCANCODE_S, SDL_SCANCODE_S},\n\t{SCANCODE_T, SDL_SCANCODE_T},\n\t{SCANCODE_U, SDL_SCANCODE_U},\n\t{SCANCODE_V, SDL_SCANCODE_V},\n\t{SCANCODE_W, SDL_SCANCODE_W},\n\t{SCANCODE_X, SDL_SCANCODE_X},\n\t{SCANCODE_Y, SDL_SCANCODE_Y},\n\t{SCANCODE_Z, SDL_SCANCODE_Z},\n\n\t{SCANCODE_1, SDL_SCANCODE_1},\n\t{SCANCODE_2, SDL_SCANCODE_2},\n\t{SCANCODE_3, SDL_SCANCODE_3},\n\t{SCANCODE_4, SDL_SCANCODE_4},\n\t{SCANCODE_5, SDL_SCANCODE_5},\n\t{SCANCODE_6, SDL_SCANCODE_6},\n\t{SCANCODE_7, SDL_SCANCODE_7},\n\t{SCANCODE_8, SDL_SCANCODE_8},\n\t{SCANCODE_9, SDL_SCANCODE_9},\n\t{SCANCODE_0, SDL_SCANCODE_0},\n\n\t{SCANCODE_RETURN, SDL_SCANCODE_RETURN},\n\t{SCANCODE_ESCAPE, SDL_SCANCODE_ESCAPE},\n\t{SCANCODE_BACKSPACE, SDL_SCANCODE_BACKSPACE},\n\t{SCANCODE_TAB, SDL_SCANCODE_TAB},\n\t{SCANCODE_SPACE, SDL_SCANCODE_SPACE},\n\n\t{SCANCODE_MINUS, SDL_SCANCODE_MINUS},\n\t{SCANCODE_EQUALS, SDL_SCANCODE_EQUALS},\n\t{SCANCODE_LEFTBRACKET, SDL_SCANCODE_LEFTBRACKET},\n\t{SCANCODE_RIGHTBRACKET, SDL_SCANCODE_RIGHTBRACKET},\n\t{SCANCODE_BACKSLASH, SDL_SCANCODE_BACKSLASH},\n\t{SCANCODE_NONUSHASH, SDL_SCANCODE_NONUSHASH},\n\t{SCANCODE_SEMICOLON, SDL_SCANCODE_SEMICOLON},\n\t{SCANCODE_APOSTROPHE, SDL_SCANCODE_APOSTROPHE},\n\t{SCANCODE_GRAVE, SDL_SCANCODE_GRAVE},\n\t{SCANCODE_COMMA, SDL_SCANCODE_COMMA},\n\t{SCANCODE_PERIOD, SDL_SCANCODE_PERIOD},\n\t{SCANCODE_SLASH, SDL_SCANCODE_SLASH},\n\n\t{SCANCODE_CAPSLOCK, SDL_SCANCODE_CAPSLOCK},\n\n\t{SCANCODE_F1, SDL_SCANCODE_F1},\n\t{SCANCODE_F2, SDL_SCANCODE_F2},\n\t{SCANCODE_F3, SDL_SCANCODE_F3},\n\t{SCANCODE_F4, SDL_SCANCODE_F4},\n\t{SCANCODE_F5, SDL_SCANCODE_F5},\n\t{SCANCODE_F6, SDL_SCANCODE_F6},\n\t{SCANCODE_F7, SDL_SCANCODE_F7},\n\t{SCANCODE_F8, SDL_SCANCODE_F8},\n\t{SCANCODE_F9, SDL_SCANCODE_F9},\n\t{SCANCODE_F10, SDL_SCANCODE_F10},\n\t{SCANCODE_F11, SDL_SCANCODE_F11},\n\t{SCANCODE_F12, SDL_SCANCODE_F12},\n\n\t{SCANCODE_PRINTSCREEN, SDL_SCANCODE_PRINTSCREEN},\n\t{SCANCODE_SCROLLLOCK, SDL_SCANCODE_SCROLLLOCK},\n\t{SCANCODE_PAUSE, SDL_SCANCODE_PAUSE},\n\t{SCANCODE_INSERT, SDL_SCANCODE_INSERT},\n\t{SCANCODE_HOME, SDL_SCANCODE_HOME},\n\t{SCANCODE_PAGEUP, SDL_SCANCODE_PAGEUP},\n\t{SCANCODE_DELETE, SDL_SCANCODE_DELETE},\n\t{SCANCODE_END, SDL_SCANCODE_END},\n\t{SCANCODE_PAGEDOWN, SDL_SCANCODE_PAGEDOWN},\n\t{SCANCODE_RIGHT, SDL_SCANCODE_RIGHT},\n\t{SCANCODE_LEFT, SDL_SCANCODE_LEFT},\n\t{SCANCODE_DOWN, SDL_SCANCODE_DOWN},\n\t{SCANCODE_UP, SDL_SCANCODE_UP},\n\n\t{SCANCODE_NUMLOCKCLEAR, SDL_SCANCODE_NUMLOCKCLEAR},\n\t{SCANCODE_KP_DIVIDE, SDL_SCANCODE_KP_DIVIDE},\n\t{SCANCODE_KP_MULTIPLY, SDL_SCANCODE_KP_MULTIPLY},\n\t{SCANCODE_KP_MINUS, SDL_SCANCODE_KP_MINUS},\n\t{SCANCODE_KP_PLUS, SDL_SCANCODE_KP_PLUS},\n\t{SCANCODE_KP_ENTER, SDL_SCANCODE_KP_ENTER},\n\t{SCANCODE_KP_1, SDL_SCANCODE_KP_1},\n\t{SCANCODE_KP_2, SDL_SCANCODE_KP_2},\n\t{SCANCODE_KP_3, SDL_SCANCODE_KP_3},\n\t{SCANCODE_KP_4, SDL_SCANCODE_KP_4},\n\t{SCANCODE_KP_5, SDL_SCANCODE_KP_5},\n\t{SCANCODE_KP_6, SDL_SCANCODE_KP_6},\n\t{SCANCODE_KP_7, SDL_SCANCODE_KP_7},\n\t{SCANCODE_KP_8, SDL_SCANCODE_KP_8},\n\t{SCANCODE_KP_9, SDL_SCANCODE_KP_9},\n\t{SCANCODE_KP_0, SDL_SCANCODE_KP_0},\n\t{SCANCODE_KP_PERIOD, SDL_SCANCODE_KP_PERIOD},\n\n\t{SCANCODE_NONUSBACKSLASH, SDL_SCANCODE_NONUSBACKSLASH},\n\t{SCANCODE_APPLICATION, SDL_SCANCODE_APPLICATION},\n\t{SCANCODE_POWER, SDL_SCANCODE_POWER},\n\t{SCANCODE_KP_EQUALS, SDL_SCANCODE_KP_EQUALS},\n\t{SCANCODE_F13, SDL_SCANCODE_F13},\n\t{SCANCODE_F14, SDL_SCANCODE_F14},\n\t{SCANCODE_F15, SDL_SCANCODE_F15},\n\t{SCANCODE_F16, SDL_SCANCODE_F16},\n\t{SCANCODE_F17, SDL_SCANCODE_F17},\n\t{SCANCODE_F18, SDL_SCANCODE_F18},\n\t{SCANCODE_F19, SDL_SCANCODE_F19},\n\t{SCANCODE_F20, SDL_SCANCODE_F20},\n\t{SCANCODE_F21, SDL_SCANCODE_F21},\n\t{SCANCODE_F22, SDL_SCANCODE_F22},\n\t{SCANCODE_F23, SDL_SCANCODE_F23},\n\t{SCANCODE_F24, SDL_SCANCODE_F24},\n\t{SCANCODE_EXECUTE, SDL_SCANCODE_EXECUTE},\n\t{SCANCODE_HELP, SDL_SCANCODE_HELP},\n\t{SCANCODE_MENU, SDL_SCANCODE_MENU},\n\t{SCANCODE_SELECT, SDL_SCANCODE_SELECT},\n\t{SCANCODE_STOP, SDL_SCANCODE_STOP},\n\t{SCANCODE_AGAIN, SDL_SCANCODE_AGAIN},\n\t{SCANCODE_UNDO, SDL_SCANCODE_UNDO},\n\t{SCANCODE_CUT, SDL_SCANCODE_CUT},\n\t{SCANCODE_COPY, SDL_SCANCODE_COPY},\n\t{SCANCODE_PASTE, SDL_SCANCODE_PASTE},\n\t{SCANCODE_FIND, SDL_SCANCODE_FIND},\n\t{SCANCODE_MUTE, SDL_SCANCODE_MUTE},\n\t{SCANCODE_VOLUMEUP, SDL_SCANCODE_VOLUMEUP},\n\t{SCANCODE_VOLUMEDOWN, SDL_SCANCODE_VOLUMEDOWN},\n\t{SCANCODE_KP_COMMA, SDL_SCANCODE_KP_COMMA},\n\t{SCANCODE_KP_EQUALSAS400, SDL_SCANCODE_KP_EQUALSAS400},\n\n\t{SCANCODE_INTERNATIONAL1, SDL_SCANCODE_INTERNATIONAL1},\n\t{SCANCODE_INTERNATIONAL2, SDL_SCANCODE_INTERNATIONAL2},\n\t{SCANCODE_INTERNATIONAL3, SDL_SCANCODE_INTERNATIONAL3},\n\t{SCANCODE_INTERNATIONAL4, SDL_SCANCODE_INTERNATIONAL4},\n\t{SCANCODE_INTERNATIONAL5, SDL_SCANCODE_INTERNATIONAL5},\n\t{SCANCODE_INTERNATIONAL6, SDL_SCANCODE_INTERNATIONAL6},\n\t{SCANCODE_INTERNATIONAL7, SDL_SCANCODE_INTERNATIONAL7},\n\t{SCANCODE_INTERNATIONAL8, SDL_SCANCODE_INTERNATIONAL8},\n\t{SCANCODE_INTERNATIONAL9, SDL_SCANCODE_INTERNATIONAL9},\n\t{SCANCODE_LANG1, SDL_SCANCODE_LANG1},\n\t{SCANCODE_LANG2, SDL_SCANCODE_LANG2},\n\t{SCANCODE_LANG3, SDL_SCANCODE_LANG3},\n\t{SCANCODE_LANG4, SDL_SCANCODE_LANG4},\n\t{SCANCODE_LANG5, SDL_SCANCODE_LANG5},\n\t{SCANCODE_LANG6, SDL_SCANCODE_LANG6},\n\t{SCANCODE_LANG7, SDL_SCANCODE_LANG7},\n\t{SCANCODE_LANG8, SDL_SCANCODE_LANG8},\n\t{SCANCODE_LANG9, SDL_SCANCODE_LANG9},\n\n\t{SCANCODE_ALTERASE, SDL_SCANCODE_ALTERASE},\n\t{SCANCODE_SYSREQ, SDL_SCANCODE_SYSREQ},\n\t{SCANCODE_CANCEL, SDL_SCANCODE_CANCEL},\n\t{SCANCODE_CLEAR, SDL_SCANCODE_CLEAR},\n\t{SCANCODE_PRIOR, SDL_SCANCODE_PRIOR},\n\t{SCANCODE_RETURN2, SDL_SCANCODE_RETURN2},\n\t{SCANCODE_SEPARATOR, SDL_SCANCODE_SEPARATOR},\n\t{SCANCODE_OUT, SDL_SCANCODE_OUT},\n\t{SCANCODE_OPER, SDL_SCANCODE_OPER},\n\t{SCANCODE_CLEARAGAIN, SDL_SCANCODE_CLEARAGAIN},\n\t{SCANCODE_CRSEL, SDL_SCANCODE_CRSEL},\n\t{SCANCODE_EXSEL, SDL_SCANCODE_EXSEL},\n\n\t{SCANCODE_KP_00, SDL_SCANCODE_KP_00},\n\t{SCANCODE_KP_000, SDL_SCANCODE_KP_000},\n\t{SCANCODE_THOUSANDSSEPARATOR, SDL_SCANCODE_THOUSANDSSEPARATOR},\n\t{SCANCODE_DECIMALSEPARATOR, SDL_SCANCODE_DECIMALSEPARATOR},\n\t{SCANCODE_CURRENCYUNIT, SDL_SCANCODE_CURRENCYUNIT},\n\t{SCANCODE_CURRENCYSUBUNIT, SDL_SCANCODE_CURRENCYSUBUNIT},\n\t{SCANCODE_KP_LEFTPAREN, SDL_SCANCODE_KP_LEFTPAREN},\n\t{SCANCODE_KP_RIGHTPAREN, SDL_SCANCODE_KP_RIGHTPAREN},\n\t{SCANCODE_KP_LEFTBRACE, SDL_SCANCODE_KP_LEFTBRACE},\n\t{SCANCODE_KP_RIGHTBRACE, SDL_SCANCODE_KP_RIGHTBRACE},\n\t{SCANCODE_KP_TAB, SDL_SCANCODE_KP_TAB},\n\t{SCANCODE_KP_BACKSPACE, SDL_SCANCODE_KP_BACKSPACE},\n\t{SCANCODE_KP_A, SDL_SCANCODE_KP_A},\n\t{SCANCODE_KP_B, SDL_SCANCODE_KP_B},\n\t{SCANCODE_KP_C, SDL_SCANCODE_KP_C},\n\t{SCANCODE_KP_D, SDL_SCANCODE_KP_D},\n\t{SCANCODE_KP_E, SDL_SCANCODE_KP_E},\n\t{SCANCODE_KP_F, SDL_SCANCODE_KP_F},\n\t{SCANCODE_KP_XOR, SDL_SCANCODE_KP_XOR},\n\t{SCANCODE_KP_POWER, SDL_SCANCODE_KP_POWER},\n\t{SCANCODE_KP_PERCENT, SDL_SCANCODE_KP_PERCENT},\n\t{SCANCODE_KP_LESS, SDL_SCANCODE_KP_LESS},\n\t{SCANCODE_KP_GREATER, SDL_SCANCODE_KP_GREATER},\n\t{SCANCODE_KP_AMPERSAND, SDL_SCANCODE_KP_AMPERSAND},\n\t{SCANCODE_KP_DBLAMPERSAND, SDL_SCANCODE_KP_DBLAMPERSAND},\n\t{SCANCODE_KP_VERTICALBAR, SDL_SCANCODE_KP_VERTICALBAR},\n\t{SCANCODE_KP_DBLVERTICALBAR, SDL_SCANCODE_KP_DBLVERTICALBAR},\n\t{SCANCODE_KP_COLON, SDL_SCANCODE_KP_COLON},\n\t{SCANCODE_KP_HASH, SDL_SCANCODE_KP_HASH},\n\t{SCANCODE_KP_SPACE, SDL_SCANCODE_KP_SPACE},\n\t{SCANCODE_KP_AT, SDL_SCANCODE_KP_AT},\n\t{SCANCODE_KP_EXCLAM, SDL_SCANCODE_KP_EXCLAM},\n\t{SCANCODE_KP_MEMSTORE, SDL_SCANCODE_KP_MEMSTORE},\n\t{SCANCODE_KP_MEMRECALL, SDL_SCANCODE_KP_MEMRECALL},\n\t{SCANCODE_KP_MEMCLEAR, SDL_SCANCODE_KP_MEMCLEAR},\n\t{SCANCODE_KP_MEMADD, SDL_SCANCODE_KP_MEMADD},\n\t{SCANCODE_KP_MEMSUBTRACT, SDL_SCANCODE_KP_MEMSUBTRACT},\n\t{SCANCODE_KP_MEMMULTIPLY, SDL_SCANCODE_KP_MEMMULTIPLY},\n\t{SCANCODE_KP_MEMDIVIDE, SDL_SCANCODE_KP_MEMDIVIDE},\n\t{SCANCODE_KP_PLUSMINUS, SDL_SCANCODE_KP_PLUSMINUS},\n\t{SCANCODE_KP_CLEAR, SDL_SCANCODE_KP_CLEAR},\n\t{SCANCODE_KP_CLEARENTRY, SDL_SCANCODE_KP_CLEARENTRY},\n\t{SCANCODE_KP_BINARY, SDL_SCANCODE_KP_BINARY},\n\t{SCANCODE_KP_OCTAL, SDL_SCANCODE_KP_OCTAL},\n\t{SCANCODE_KP_DECIMAL, SDL_SCANCODE_KP_DECIMAL},\n\t{SCANCODE_KP_HEXADECIMAL, SDL_SCANCODE_KP_HEXADECIMAL},\n\n\t{SCANCODE_LCTRL, SDL_SCANCODE_LCTRL},\n\t{SCANCODE_LSHIFT, SDL_SCANCODE_LSHIFT},\n\t{SCANCODE_LALT, SDL_SCANCODE_LALT},\n\t{SCANCODE_LGUI, SDL_SCANCODE_LGUI},\n\t{SCANCODE_RCTRL, SDL_SCANCODE_RCTRL},\n\t{SCANCODE_RSHIFT, SDL_SCANCODE_RSHIFT},\n\t{SCANCODE_RALT, SDL_SCANCODE_RALT},\n\t{SCANCODE_RGUI, SDL_SCANCODE_RGUI},\n\n\t{SCANCODE_MODE, SDL_SCANCODE_MODE},\n\n\t{SCANCODE_AUDIONEXT, SDL_SCANCODE_MEDIA_NEXT_TRACK},\n\t{SCANCODE_AUDIOPREV, SDL_SCANCODE_MEDIA_PREVIOUS_TRACK},\n\t{SCANCODE_AUDIOSTOP, SDL_SCANCODE_MEDIA_STOP},\n\t{SCANCODE_AUDIOPLAY, SDL_SCANCODE_MEDIA_PLAY},\n\t{SCANCODE_AUDIOMUTE, SDL_SCANCODE_MUTE},\n\t{SCANCODE_MEDIASELECT, SDL_SCANCODE_MEDIA_SELECT},\n\t{SCANCODE_AC_SEARCH, SDL_SCANCODE_AC_SEARCH},\n\t{SCANCODE_AC_HOME, SDL_SCANCODE_AC_HOME},\n\t{SCANCODE_AC_BACK, SDL_SCANCODE_AC_BACK},\n\t{SCANCODE_AC_FORWARD, SDL_SCANCODE_AC_FORWARD},\n\t{SCANCODE_AC_STOP, SDL_SCANCODE_AC_STOP},\n\t{SCANCODE_AC_REFRESH, SDL_SCANCODE_AC_REFRESH},\n\t{SCANCODE_AC_BOOKMARKS, SDL_SCANCODE_AC_BOOKMARKS},\n\n\t{SCANCODE_EJECT, SDL_SCANCODE_MEDIA_EJECT},\n\t{SCANCODE_SLEEP, SDL_SCANCODE_SLEEP},\n};\n\nEnumMap<Keyboard::Scancode, SDL_Scancode, SDL_SCANCODE_COUNT> Keyboard::scancodes(Keyboard::scancodeEntries, sizeof(Keyboard::scancodeEntries));\n\n} // sdl\n} // keyboard\n} // love\n"
  },
  {
    "path": "src/modules/keyboard/sdl/Keyboard.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_KEYBOARD_SDL_KEYBOARD_H\n#define LOVE_KEYBOARD_SDL_KEYBOARD_H\n\n// LOVE\n#include \"keyboard/Keyboard.h\"\n#include \"common/EnumMap.h\"\n\n// SDL\n#include <SDL3/SDL_keyboard.h>\n\n#include <map>\n\nnamespace love\n{\nnamespace keyboard\n{\nnamespace sdl\n{\n\nclass Keyboard : public love::keyboard::Keyboard\n{\npublic:\n\n\tKeyboard();\n\n\tvoid setKeyRepeat(bool enable);\n\tbool hasKeyRepeat() const;\n\tbool isDown(const std::vector<Key> &keylist) const;\n\tbool isScancodeDown(const std::vector<Scancode> &scancodelist) const;\n\tbool isModifierActive(ModifierKey key) const;\n\n\tKey getKeyFromScancode(Scancode scancode) const;\n\tScancode getScancodeFromKey(Key key) const;\n\n\tvoid setTextInput(bool enable);\n\tvoid setTextInput(bool enable, double x, double y, double w, double h);\n\tbool hasTextInput() const;\n\tbool hasScreenKeyboard() const;\n\tbool isScreenKeyboardVisible() const;\n\n\tstatic bool getConstant(Key in, SDL_Keycode &out);\n\tstatic bool getConstant(SDL_Keycode in, Key &out);\n\n\tstatic bool getConstant(Scancode in, SDL_Scancode &out);\n\tstatic bool getConstant(SDL_Scancode in, Scancode &out);\n\nprivate:\n\n\t// Whether holding down a key triggers repeated key press events.\n\t// The real implementation is in love::event::sdl::Event::Convert.\n\tbool key_repeat;\n\n\tstatic std::map<Key, SDL_Keycode> keyToSDLKey;\n\tstatic std::map<SDL_Keycode, Key> sdlKeyToKey;\n\n\tstatic EnumMap<Scancode, SDL_Scancode, SDL_SCANCODE_COUNT>::Entry scancodeEntries[];\n\tstatic EnumMap<Scancode, SDL_Scancode, SDL_SCANCODE_COUNT> scancodes;\n\n}; // Keyboard\n\n} // sdl\n} // keyboard\n} // love\n\n#endif // LOVE_KEYBOARD_SDL_KEYBOARD_H\n"
  },
  {
    "path": "src/modules/keyboard/wrap_Keyboard.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"common/config.h\"\n\n#include \"wrap_Keyboard.h\"\n\n#include \"sdl/Keyboard.h\"\n\nnamespace love\n{\nnamespace keyboard\n{\n\n#define instance() (Module::getInstance<Keyboard>(Module::M_KEYBOARD))\n\nint w_setKeyRepeat(lua_State *L)\n{\n\tinstance()->setKeyRepeat(luax_checkboolean(L, 1));\n\treturn 0;\n}\n\nint w_hasKeyRepeat(lua_State *L)\n{\n\tluax_pushboolean(L, instance()->hasKeyRepeat());\n\treturn 1;\n}\n\nint w_isDown(lua_State *L)\n{\n\tKeyboard::Key k;\n\n\tbool istable = lua_istable(L, 1);\n\tint num = istable ? (int) luax_objlen(L, 1) : lua_gettop(L);\n\n\tstd::vector<Keyboard::Key> keylist;\n\tkeylist.reserve(num);\n\n\tif (istable)\n\t{\n\t\tfor (int i = 0; i < num; i++)\n\t\t{\n\t\t\tlua_rawgeti(L, 1, i + 1);\n\n\t\t\tconst char *name = luaL_checkstring(L, -1);\n\t\t\tif (!Keyboard::getConstant(name, k))\n\t\t\t\treturn luax_enumerror(L, \"key constant\", name);\n\n\t\t\tkeylist.push_back(k);\n\t\t\tlua_pop(L, 1);\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (int i = 0; i < num; i++)\n\t\t{\n\t\t\tconst char *name = luaL_checkstring(L, i + 1);\n\t\t\tif (!Keyboard::getConstant(name, k))\n\t\t\t\treturn luax_enumerror(L, \"key constant\", name);\n\n\t\t\tkeylist.push_back(k);\n\t\t}\n\t}\n\n\tluax_pushboolean(L, instance()->isDown(keylist));\n\treturn 1;\n}\n\nint w_isScancodeDown(lua_State *L)\n{\n\tKeyboard::Scancode scancode;\n\n\tbool istable = lua_istable(L, 1);\n\tint num = istable ? (int) luax_objlen(L, 1) : lua_gettop(L);\n\n\tstd::vector<Keyboard::Scancode> scancodelist;\n\tscancodelist.reserve(num);\n\n\tif (istable)\n\t{\n\t\tfor (int i = 0; i < num; i++)\n\t\t{\n\t\t\tlua_rawgeti(L, 1, i + 1);\n\n\t\t\tconst char *name = luaL_checkstring(L, -1);\n\t\t\tif (!Keyboard::getConstant(name, scancode))\n\t\t\t\treturn luax_enumerror(L, \"scancode\", name);\n\n\t\t\tscancodelist.push_back(scancode);\n\t\t\tlua_pop(L, 1);\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (int i = 0; i < num; i++)\n\t\t{\n\t\t\tconst char *name = luaL_checkstring(L, i + 1);\n\t\t\tif (!Keyboard::getConstant(name, scancode))\n\t\t\t\treturn luax_enumerror(L, \"scancode\", name);\n\n\t\t\tscancodelist.push_back(scancode);\n\t\t}\n\t}\n\n\tluax_pushboolean(L, instance()->isScancodeDown(scancodelist));\n\treturn 1;\n}\n\nint w_getScancodeFromKey(lua_State *L)\n{\n\tconst char *keystr = luaL_checkstring(L, 1);\n\tKeyboard::Key key;\n\tif (!Keyboard::getConstant(keystr, key))\n\t\treturn luax_enumerror(L, \"key constant\", keystr);\n\n\tKeyboard::Scancode scancode = instance()->getScancodeFromKey(key);\n\n\tconst char *scancodestr;\n\tif (!Keyboard::getConstant(scancode, scancodestr))\n\t\treturn luaL_error(L, \"Unknown scancode.\");\n\n\tlua_pushstring(L, scancodestr);\n\treturn 1;\n}\n\nint w_getKeyFromScancode(lua_State *L)\n{\n\tconst char *scancodestr = luaL_checkstring(L, 1);\n\tKeyboard::Scancode scancode;\n\tif (!Keyboard::getConstant(scancodestr, scancode))\n\t\treturn luax_enumerror(L, \"scancode\", scancodestr);\n\n\tKeyboard::Key key = instance()->getKeyFromScancode(scancode);\n\n\tconst char *keystr;\n\tif (!Keyboard::getConstant(key, keystr))\n\t\treturn luaL_error(L, \"Unknown key constant\");\n\n\tlua_pushstring(L, keystr);\n\treturn 1;\n}\n\nint w_setTextInput(lua_State *L)\n{\n\tbool enable = luax_checkboolean(L, 1);\n\n\tif (lua_gettop(L) <= 1)\n\t\tinstance()->setTextInput(enable);\n\telse\n\t{\n\t\tdouble x = luaL_checknumber(L, 2);\n\t\tdouble y = luaL_checknumber(L, 3);\n\t\tdouble w = luaL_checknumber(L, 4);\n\t\tdouble h = luaL_checknumber(L, 5);\n\t\tinstance()->setTextInput(enable, x, y, w, h);\n\t}\n\n\treturn 0;\n}\n\nint w_hasTextInput(lua_State *L)\n{\n\tluax_pushboolean(L, instance()->hasTextInput());\n\treturn 1;\n}\n\nint w_hasScreenKeyboard(lua_State *L)\n{\n\tluax_pushboolean(L, instance()->hasScreenKeyboard());\n\treturn 1;\n}\n\nint w_isScreenKeyboardVisible(lua_State *L)\n{\n\tluax_pushboolean(L, instance()->isScreenKeyboardVisible());\n\treturn 1;\n}\n\nint w_isModifierActive(lua_State* L)\n{\n\tconst char *keystr = luaL_checkstring(L, 1);\n\tKeyboard::ModifierKey key;\n\tif (!Keyboard::getConstant(keystr, key))\n\t\treturn luax_enumerror(L, \"modifier keys\", keystr);\n\n\tluax_pushboolean(L, instance()->isModifierActive(key));\n\treturn 1;\n}\n\n// List of functions to wrap.\nstatic const luaL_Reg functions[] =\n{\n\t{ \"setKeyRepeat\", w_setKeyRepeat },\n\t{ \"hasKeyRepeat\", w_hasKeyRepeat },\n\t{ \"setTextInput\", w_setTextInput },\n\t{ \"hasTextInput\", w_hasTextInput },\n\t{ \"hasScreenKeyboard\", w_hasScreenKeyboard },\n\t{ \"isScreenKeyboardVisible\", w_isScreenKeyboardVisible },\n\t{ \"isDown\", w_isDown },\n\t{ \"isScancodeDown\", w_isScancodeDown },\n\t{ \"getScancodeFromKey\", w_getScancodeFromKey },\n\t{ \"getKeyFromScancode\", w_getKeyFromScancode },\n\t{ \"isModifierActive\", w_isModifierActive },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_love_keyboard(lua_State *L)\n{\n\tKeyboard *instance = instance();\n\tif (instance == nullptr)\n\t{\n\t\tluax_catchexcept(L, [&](){ instance = new love::keyboard::sdl::Keyboard(); });\n\t}\n\telse\n\t\tinstance->retain();\n\n\tWrappedModule w;\n\tw.module = instance;\n\tw.name = \"keyboard\";\n\tw.type = &Module::type;\n\tw.functions = functions;\n\tw.types = 0;\n\n\treturn luax_register_module(L, w);\n}\n\n} // keyboard\n} // love\n"
  },
  {
    "path": "src/modules/keyboard/wrap_Keyboard.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_KEYBOARD_WRAP_KEYBOARD_H\n#define LOVE_KEYBOARD_WRAP_KEYBOARD_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"Keyboard.h\"\n\nnamespace love\n{\nnamespace keyboard\n{\n\nextern \"C\" LOVE_EXPORT int luaopen_love_keyboard(lua_State *L);\n\n} // keyboard\n} // love\n\n#endif // LOVE_KEYBOARD_WRAP_KEYBOARD_H\n"
  },
  {
    "path": "src/modules/love/arg.lua",
    "content": "R\"luastring\"--(\n-- DO NOT REMOVE THE ABOVE LINE. It is used to load this file as a C++ string.\n-- There is a matching delimiter at the bottom of the file.\n\n--[[\nCopyright (c) 2006-2024 LOVE Development Team\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n--]]\n\nlocal love = require(\"love\")\n\n-- Used for setup:\nlove.path = {}\nlove.arg = {}\n\n-- Replace any \\ with /.\nfunction love.path.normalslashes(p)\n\treturn p:gsub(\"\\\\\", \"/\")\nend\n\n-- Makes sure there is a slash at the end\n-- of a path.\nfunction love.path.endslash(p)\n\tif p:sub(-1) ~= \"/\" then\n\t\treturn p .. \"/\"\n\telse\n\t\treturn p\n\tend\nend\n\n-- Checks whether a path is absolute or not.\nfunction love.path.abs(p)\n\n\tlocal tmp = love.path.normalslashes(p)\n\n\t-- Path is absolute if it starts with a \"/\".\n\tif tmp:find(\"/\") == 1 then\n\t\treturn true\n\tend\n\n\t-- Path is absolute if it starts with a\n\t-- letter followed by a colon.\n\tif tmp:find(\"%a:\") == 1 then\n\t\treturn true\n\tend\n\n\t-- Relative.\n\treturn false\n\nend\n\n-- Converts any path into a full path.\nfunction love.path.getFull(p)\n\tp = love.filesystem.canonicalizeRealPath(p)\n\tp = love.path.normalslashes(p)\n\treturn p\nend\n\n-- Returns the leaf of a full path.\nfunction love.path.leaf(p)\n\tp = love.path.normalslashes(p)\n\n\tlocal a = 1\n\tlocal last = p\n\n\twhile a do\n\t\ta = p:find(\"/\", a+1)\n\n\t\tif a then\n\t\t\tlast = p:sub(a+1)\n\t\tend\n\tend\n\n\treturn last\nend\n\n-- Finds the key in the table with the lowest integral index. The lowest\n-- will typically the executable, for instance \"lua5.1.exe\".\nfunction love.arg.getLow(a)\n\tlocal m = math.huge\n\tfor k,v in pairs(a) do\n\t\tif k < m then\n\t\t\tm = k\n\t\tend\n\tend\n\treturn a[m], m\nend\n\nlove.arg.options = {\n\tconsole = { a = 0 },\n\tfused = { a = 0 },\n\tgame = { a = 1 },\n\trenderers = { a = 1 },\n\texcluderenderers = { a = 1 },\n}\n\nlove.arg.optionIndices = {}\n\nfunction love.arg.parseOption(m, i)\n\tm.set = true\n\n\tif m.a > 0 then\n\t\tm.arg = {}\n\t\tfor j=i,i+m.a-1 do\n\t\t\tlove.arg.optionIndices[j] = true\n\t\t\ttable.insert(m.arg, arg[j])\n\t\tend\n\tend\n\n\treturn m.a\nend\n\nfunction love.arg.parseOptions(arg)\n\n\tlocal game\n\tlocal argc = #arg\n\n\tlocal i = 1\n\twhile i <= argc do\n\t\t-- Look for options.\n\t\tlocal m = arg[i]:match(\"^%-%-(.*)\")\n\n\t\tif m and m ~= \"\" and love.arg.options[m] and not love.arg.options[m].set then\n\t\t\tlove.arg.optionIndices[i] = true\n\t\t\ti = i + love.arg.parseOption(love.arg.options[m], i+1)\n\t\telseif m == \"\" then -- handle '--' as an option\n\t\t\tlove.arg.optionIndices[i] = true\n\t\t\tif not game then -- handle '--' followed by game name\n\t\t\t\tgame = i + 1\n\t\t\tend\n\t\t\tbreak\n\t\telseif not game then\n\t\t\tgame = i\n\t\tend\n\t\ti = i + 1\n\tend\n\n\tif not love.arg.options.game.set then\n\t\tlove.arg.parseOption(love.arg.options.game, game or 0)\n\tend\nend\n\n-- Returns the arguments that are passed to your game via love.load()\n-- arguments that were parsed as options are skipped.\nfunction love.arg.parseGameArguments(a)\n\tlocal out = {}\n\n\tlocal _, lowindex = love.arg.getLow(a)\n\n\tlocal o = lowindex\n\tfor i=lowindex, #a do\n\t\tif not love.arg.optionIndices[i] then\n\t\t\tout[o] = a[i]\n\t\t\to = o + 1\n\t\tend\n\tend\n\n\treturn out\nend\n\n-- DO NOT REMOVE THE NEXT LINE. It is used to load this file as a C++ string.\n--)luastring\"--\"\n"
  },
  {
    "path": "src/modules/love/boot.lua",
    "content": "R\"luastring\"--(\n-- DO NOT REMOVE THE ABOVE LINE. It is used to load this file as a C++ string.\n-- There is a matching delimiter at the bottom of the file.\n\n--[[\nCopyright (c) 2006-2024 LOVE Development Team\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n--]]\n\n-- Make sure love exists.\nlocal love = require(\"love\")\n\n-- Essential code boot/init.\nrequire(\"love.arg\")\nrequire(\"love.callbacks\")\n\nlocal function uridecode(s)\n\treturn s:gsub(\"%%%x%x\", function(str)\n\t\treturn string.char(tonumber(str:sub(2), 16))\n\tend)\nend\n\nlocal no_game_code = false\nlocal invalid_game_path = nil\nlocal main_file = \"main.lua\"\n\n-- This can't be overridden.\nfunction love.boot()\n\n\t-- This is absolutely needed.\n\trequire(\"love.filesystem\")\n\n\t-- Having love.system loaded before conf.lua is run can be useful for accessing love.system.getOS.\n\trequire(\"love.system\")\n\n\t-- nogame.lua returns _noGameRestartInfo when\n\t-- dropping a file or directory on to its window.\n\tif love.restart and type(love.restart) == \"table\" then\n\t\tlocal was_no_game = love.restart._noGameRestartInfo\n\t\tif was_no_game and type(was_no_game) == \"table\" then\n\t\t\tif was_no_game.gamepath and type(was_no_game.gamepath) == \"string\" then\n\t\t\t\ttable.insert(arg, 1, was_no_game.gamepath)\n\t\t\tend\n\t\tend\n\tend\n\n\tlove.rawGameArguments = arg\n\n\tlocal arg0 = love.arg.getLow(love.rawGameArguments)\n\tlove.filesystem.init(arg0)\n\n\tlocal exepath = love.filesystem.getExecutablePath()\n\tif #exepath == 0 then\n\t\t-- This shouldn't happen, but just in case we'll fall back to arg0.\n\t\texepath = arg0\n\tend\n\n\tno_game_code = false\n\tinvalid_game_path = nil\n\n\t-- Is this one of those fancy \"fused\" games?\n\tlocal can_has_game = pcall(love.filesystem.setSource, exepath)\n\n\t-- It's a fused game, don't parse --game argument\n\tif can_has_game then\n\t\tlove.arg.options.game.set = true\n\tend\n\n\t-- Parse options now that we know which options we're looking for.\n\tlove.arg.parseOptions(love.rawGameArguments)\n\n\t-- parseGameArguments can only be called after parseOptions.\n\tlove.parsedGameArguments = love.arg.parseGameArguments(love.rawGameArguments)\n\n\tlocal o = love.arg.options\n\n\tlocal is_fused_game = can_has_game or love.arg.options.fused.set\n\n\tlove.filesystem.setFused(is_fused_game)\n\n\tlove.setDeprecationOutput(not love.filesystem.isFused())\n\n\tmain_file = \"main.lua\"\n\tlocal custom_main_file = false\n\n\tlocal identity = \"\"\n\tif not can_has_game and o.game.set and o.game.arg[1] then\n\t\tlocal nouri = o.game.arg[1]\n\t\tlocal full_source = nouri\n\n\t\t-- Ignore \"content://\" uri as it's used to open a file-descriptor\n\t\t-- directly for Android.\n\t\tif nouri:sub(1, 10) ~= \"content://\" then\n\t\t\tif nouri:sub(1, 7) == \"file://\" then\n\t\t\t\tnouri = uridecode(nouri:sub(8))\n\t\t\tend\n\n\t\t\tfull_source = love.path.getFull(nouri)\n\t\t\tlocal source_leaf = love.path.leaf(full_source)\n\n\t\t\tif source_leaf:match(\"%.lua$\") then\n\t\t\t\tmain_file = source_leaf\n\t\t\t\tcustom_main_file = true\n\t\t\t\tfull_source = love.path.getFull(full_source:sub(1, -(#source_leaf + 1)))\n\t\t\tend\n\t\tend\n\n\t\tcan_has_game = pcall(love.filesystem.setSource, full_source)\n\n\t\tif not can_has_game then\n\t\t\tinvalid_game_path = full_source\n\t\tend\n\n\t\t-- Use the name of the source .love as the identity for now.\n\t\tidentity = love.path.leaf(full_source)\n\telse\n\t\t-- Use the name of the exe as the identity for now.\n\t\tidentity = love.path.leaf(exepath)\n\tend\n\n\t-- Try to use the archive containing main.lua as the identity name. It\n\t-- might not be available, in which case the fallbacks above are used.\n\tlocal realdir = love.filesystem.getRealDirectory(main_file)\n\tif realdir then\n\t\tidentity = love.path.leaf(realdir)\n\tend\n\n\tidentity = identity:gsub(\"^([%.]+)\", \"\") -- strip leading \".\"'s\n\tidentity = identity:gsub(\"%.([^%.]+)$\", \"\") -- strip extension\n\tidentity = identity:gsub(\"%.\", \"_\") -- replace remaining \".\"'s with \"_\"\n\tidentity = #identity > 0 and identity or \"lovegame\"\n\n\t-- When conf.lua is initially loaded, the main source should be checked\n\t-- before the save directory (the identity should be appended.)\n\tpcall(love.filesystem.setIdentity, identity, true)\n\n\tif can_has_game and not (love.filesystem.getInfo(main_file) or (not custom_main_file and love.filesystem.getInfo(\"conf.lua\"))) then\n\t\tno_game_code = true\n\tend\n\n\tif not can_has_game then\n        -- when editing this message, change it at love.cpp too\n        print([[LOVE is an *awesome* framework you can use to make 2D games in Lua\nhttps://love2d.org\n\nusage:\n    love --version                  prints LOVE version and quits\n    love --help                     prints this message and quits\n    love path/to/gamedir            runs the game from the given directory which contains a main.lua file\n    love path/to/packagedgame.love  runs the packaged game from the provided .love file\n    love path/to/file.lua           runs the game from the given .lua file\n]]);\n\t\tlocal nogame = require(\"love.nogame\")\n\t\tnogame()\n\tend\nend\n\nfunction love.init()\n\n\t-- Create default configuration settings.\n\t-- NOTE: Adding a new module to the modules list\n\t-- will NOT make it load, see below.\n\tlocal c = {\n\t\ttitle = \"Untitled\",\n\t\tversion = love._version,\n\t\twindow = {\n\t\t\twidth = 800,\n\t\t\theight = 600,\n\t\t\tx = nil,\n\t\t\ty = nil,\n\t\t\tminwidth = 1,\n\t\t\tminheight = 1,\n\t\t\tfullscreen = false,\n\t\t\tfullscreentype = \"desktop\",\n\t\t\tdisplayindex = 1,\n\t\t\tvsync = 1,\n\t\t\tmsaa = 0,\n\t\t\tborderless = false,\n\t\t\tresizable = false,\n\t\t\tcentered = true,\n\t\t\tusedpiscale = true,\n\t\t},\n\t\tgraphics = {\n\t\t\tgammacorrect = false,\n\t\t\tlowpower = false,\n\t\t\trenderers = nil,\n\t\t\texcluderenderers = nil,\n\t\t},\n\t\tmodules = {\n\t\t\tdata = true,\n\t\t\tevent = true,\n\t\t\tkeyboard = true,\n\t\t\tmouse = true,\n\t\t\ttimer = true,\n\t\t\tjoystick = true,\n\t\t\ttouch = true,\n\t\t\timage = true,\n\t\t\tgraphics = true,\n\t\t\taudio = true,\n\t\t\tmath = true,\n\t\t\tphysics = true,\n\t\t\tsensor = true,\n\t\t\tsound = true,\n\t\t\tsystem = true,\n\t\t\tfont = true,\n\t\t\tthread = true,\n\t\t\twindow = true,\n\t\t\tvideo = true,\n\t\t},\n\t\taudio = {\n\t\t\tmixwithsystem = true, -- Only relevant for Android / iOS.\n\t\t\tmic = false, -- Only relevant for Android.\n\t\t},\n\t\tconsole = false, -- Only relevant for windows.\n\t\tidentity = false,\n\t\tappendidentity = false,\n\t\texternalstorage = false, -- Only relevant for Android.\n\t\tgammacorrect = nil, -- Moved to t.graphics.\n\t\thighdpi = false,\n\t\trenderers = nil, -- Moved to t.graphics.\n\t\texcluderenderers = nil, -- Moved to t.graphics.\n\t\ttrackpadtouch = false,\n\t}\n\n\t-- Console hack, part 1.\n\tlocal openedconsole = false\n\tif love.arg.options.console.set and love._openConsole then\n\t\tlove._openConsole()\n\t\topenedconsole = true\n\tend\n\n\t-- If config file exists, load it and allow it to update config table.\n\tlocal confok, conferr\n\tif (not love.conf) and love.filesystem and love.filesystem.getInfo(\"conf.lua\") then\n\t\tconfok, conferr = pcall(require, \"conf\")\n\tend\n\n\t-- Yes, conf.lua might not exist, but there are other ways of making\n\t-- love.conf appear, so we should check for it anyway.\n\tif love.conf then\n\t\tconfok, conferr = pcall(love.conf, c)\n\t\t-- If love.conf errors, we'll trigger the error after loading modules so\n\t\t-- the error message can be displayed in the window.\n\tend\n\n\t-- Console hack, part 2.\n\tif c.console and love._openConsole and not openedconsole then\n\t\tlove._openConsole()\n\tend\n\n\tif love._setGammaCorrect then\n\t\tlocal gammacorrect = false\n\t\tif type(c.graphics) == \"table\" then\n\t\t\tgammacorrect = c.graphics.gammacorrect\n\t\tend\n\t\tif c.gammacorrect ~= nil then\n\t\t\tlove.markDeprecated(2, \"t.gammacorrect in love.conf\", \"field\", \"replaced\", \"t.graphics.gammacorrect\")\n\t\t\tgammacorrect = c.gammacorrect\n\t\tend\n\t\tlove._setGammaCorrect(gammacorrect)\n\tend\n\n\tif love._setLowPowerPreferred and type(c.graphics) == \"table\" then\n\t\tlove._setLowPowerPreferred(c.graphics.lowpower)\n\tend\n\n\tif love._setRenderers then\n\t\tlocal renderers = love._getDefaultRenderers()\n\t\tif type(c.renderers) == \"table\" then\n\t\t\tlove.markDeprecated(2, \"t.renderers in love.conf\", \"field\", \"replaced\", \"t.graphics.renderers\")\n\t\t\trenderers = c.renderers\n\t\tend\n\t\tif type(c.graphics) == \"table\" and type(c.graphics.renderers) == \"table\" then\n\t\t\trenderers = c.graphics.renderers\n\t\tend\n\t\tif love.arg.options.renderers.set then\n\t\t\tlocal renderersstr = love.arg.options.renderers.arg[1]\n\t\t\trenderers = {}\n\t\t\tfor r in renderersstr:gmatch(\"[^,]+\") do\n\t\t\t\ttable.insert(renderers, r)\n\t\t\tend\n\t\tend\n\n\t\tlocal excluderenderers = nil\n\t\tif type(c.excluderenderers) == \"table\" then\n\t\t\tlove.markDeprecated(2, \"t.excluderenderers in love.conf\", \"field\", \"replaced\", \"t.graphics.excluderenderers\")\n\t\t\texcluderenderers = c.excluderenderers\n\t\tend\n\t\tif type(c.graphics) == \"table\" and type(c.graphics.excluderenderers) == \"table\" then\n\t\t\texcluderenderers = c.graphics.excluderenderers\n\t\tend\n\t\tif love.arg.options.excluderenderers.set then\n\t\t\tlocal excludestr = love.arg.options.excluderenderers.arg[1]\n\t\t\texcluderenderers = {}\n\t\t\tfor r in excludestr:gmatch(\"[^,]+\") do\n\t\t\t\ttable.insert(excluderenderers, r)\n\t\t\tend\n\t\tend\n\n\t\tif type(excluderenderers) == \"table\" then\n\t\t\tfor i,v in ipairs(excluderenderers) do\n\t\t\t\tfor j=#renderers, 1, -1 do\n\t\t\t\t\tif renderers[j] == v then\n\t\t\t\t\t\ttable.remove(renderers, j)\n\t\t\t\t\t\tbreak\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tlove._setRenderers(renderers)\n\tend\n\n\tif love._setHighDPIAllowed then\n\t\tlove._setHighDPIAllowed(c.highdpi)\n\tend\n\n\tif love._setTrackpadTouch then\n\t\tlove._setTrackpadTouch(c.trackpadtouch)\n\tend\n\n\tif love._setAudioMixWithSystem then\n\t\tif c.audio and c.audio.mixwithsystem ~= nil then\n\t\t\tlove._setAudioMixWithSystem(c.audio.mixwithsystem)\n\t\tend\n\tend\n\n\tif love._requestRecordingPermission then\n\t\tlove._requestRecordingPermission(c.audio and c.audio.mic)\n\tend\n\n\t-- Gets desired modules.\n\tfor k,v in ipairs{\n\t\t\"data\",\n\t\t\"thread\",\n\t\t\"timer\",\n\t\t\"event\",\n\t\t\"keyboard\",\n\t\t\"joystick\",\n\t\t\"mouse\",\n\t\t\"touch\",\n\t\t\"sound\",\n\t\t\"system\",\n\t\t\"sensor\",\n\t\t\"audio\",\n\t\t\"image\",\n\t\t\"video\",\n\t\t\"font\",\n\t\t\"window\",\n\t\t\"graphics\",\n\t\t\"math\",\n\t\t\"physics\",\n\t} do\n\t\tif c.modules[v] then\n\t\t\trequire(\"love.\" .. v)\n\t\tend\n\tend\n\n\tif love.event then\n\t\tlove.createhandlers()\n\tend\n\n\t-- Check the version\n\tc.version = tostring(c.version)\n\tif not love.isVersionCompatible(c.version) then\n\t\tlocal major, minor, revision = c.version:match(\"^(%d+)%.(%d+)%.(%d+)$\")\n\t\tif (not major or not minor or not revision) or (major ~= love._version_major and minor ~= love._version_minor) then\n\t\t\tlocal msg = (\"This game indicates it was made for version '%s' of LOVE.\\n\"..\n\t\t\t\t\"It may not be compatible with the running version (%s).\"):format(c.version, love._version)\n\n\t\t\tprint(msg)\n\n\t\t\tif love.window then\n\t\t\t\tlove.window.showMessageBox(\"Compatibility Warning\", msg, \"warning\")\n\t\t\tend\n\t\tend\n\tend\n\n\tif not confok and conferr then\n\t\terror(conferr)\n\tend\n\n\t-- Setup window here.\n\tif c.window and c.modules.window then\n\t\tif c.window.icon then\n\t\t\tassert(love.image, \"If an icon is set in love.conf, love.image must be loaded.\")\n\t\t\tlove.window.setIcon(love.image.newImageData(c.window.icon))\n\t\tend\n\n\t\tlove.window.setTitle(c.window.title or c.title)\n\t\tassert(love.window.setMode(c.window.width, c.window.height,\n\t\t{\n\t\t\tfullscreen = c.window.fullscreen,\n\t\t\tfullscreentype = c.window.fullscreentype,\n\t\t\tvsync = c.window.vsync,\n\t\t\tmsaa = c.window.msaa,\n\t\t\tstencil = c.window.stencil,\n\t\t\tdepth = c.window.depth,\n\t\t\tresizable = c.window.resizable,\n\t\t\tminwidth = c.window.minwidth,\n\t\t\tminheight = c.window.minheight,\n\t\t\tborderless = c.window.borderless,\n\t\t\tcentered = c.window.centered,\n\t\t\tdisplayindex = c.window.displayindex,\n\t\t\tdisplay = c.window.display, -- deprecated\n\t\t\thighdpi = c.window.highdpi, -- deprecated\n\t\t\tusedpiscale = c.window.usedpiscale,\n\t\t\tx = c.window.x,\n\t\t\ty = c.window.y,\n\t\t}), \"Could not set window mode\")\n\tend\n\n\t-- The first couple event pumps on some systems (e.g. macOS) can take a\n\t-- while. We'd rather hit that slowdown here than in event processing\n\t-- within the first frames.\n\tif love.event then\n\t\tfor i = 1, 2 do love.event.pump() end\n\tend\n\n\t-- Our first timestep, because window creation can take some time\n\tif love.timer then\n\t\tlove.timer.step()\n\tend\n\n\tif love.filesystem then\n\t\tlove.filesystem._setAndroidSaveExternal(c.externalstorage)\n\t\tlove.filesystem.setIdentity(c.identity or love.filesystem.getIdentity(), c.appendidentity)\n\t\tif love.filesystem.getInfo(main_file) then\n\t\t\trequire(main_file:gsub(\"%.lua$\", \"\"))\n\t\tend\n\tend\n\n\tif no_game_code then\n\t\tlocal opts = love.arg.options\n\t\tlocal gamepath = opts.game.set and opts.game.arg[1] or \"\"\n\t\tlocal gamestr = gamepath == \"\" and \"\" or \" at \"..gamepath\n\t\terror(\"No code to run\"..gamestr..\"\\nYour game might be packaged incorrectly.\\nMake sure \"..main_file..\" is at the top level of the zip or folder.\")\n\telseif invalid_game_path then\n\t\terror(\"Cannot load game at path '\" .. invalid_game_path .. \"'.\\nMake sure a folder exists at the specified path.\")\n\tend\nend\n\nlocal xpcall = xpcall\nlocal coroutine_yield = coroutine.yield\nlocal print, debug, tostring = print, debug, tostring\n\nlocal function error_printer(msg, layer)\n\tprint((debug.traceback(\"Error: \" .. tostring(msg), 1+(layer or 1)):gsub(\"\\n[^\\n]+$\", \"\")))\nend\n\n-----------------------------------------------------------\n-- The root of all calls.\n-----------------------------------------------------------\n\nreturn function()\n\tlocal func\n\tlocal setModalDrawFunc = false\n\tlocal inerror = false\n\n\tlocal function deferErrhand(...)\n\t\tlocal errhand = love.errorhandler or love.errhand\n\t\tlocal handler = (not inerror and errhand) or error_printer\n\t\tinerror = true\n\t\tfunc = handler(...)\n\t\tinerror = false\n\tend\n\n\tlocal function earlyinit()\n\t\tfunc = nil\n\n\t\t-- If love.boot fails, return 1 and finish immediately\n\t\tlocal result = xpcall(love.boot, error_printer)\n\t\tif not result then return 1 end\n\n\t\t-- If love.init or love.run fails, don't return a value,\n\t\t-- as we want the error handler to take over\n\t\tresult = xpcall(love.init, deferErrhand)\n\t\tif not result then return end\n\n\t\t-- NOTE: We can't assign to func directly, as we'd\n\t\t-- overwrite the result of deferErrhand with nil on error\n\t\tlocal main\n\t\tresult, main = xpcall(love.run, deferErrhand)\n\t\tif result then\n\t\t\tfunc = main\n\t\t\tsetModalDrawFunc = true\n\t\telseif inerror then -- Error in error handler\n\t\t\tprint(\"Error: \" .. tostring(main))\n\t\tend\n\tend\n\n\tfunc = earlyinit\n\tlocal prevFunc = nil\n\n\twhile func do\n\t\tif setModalDrawFunc and love.event and func ~= prevFunc then\n\t\t\tprevFunc = func\n\t\t\tlove.event._setDefaultModalDrawCallback(func)\n\t\tend\n\t\tlocal _, retval, restartvalue = xpcall(func, deferErrhand)\n\t\tif retval then return retval, restartvalue end\n\t\tcoroutine_yield()\n\tend\n\n\treturn 1\nend\n\n-- DO NOT REMOVE THE NEXT LINE. It is used to load this file as a C++ string.\n--)luastring\"--\"\n"
  },
  {
    "path": "src/modules/love/callbacks.lua",
    "content": "R\"luastring\"--(\n-- DO NOT REMOVE THE ABOVE LINE. It is used to load this file as a C++ string.\n-- There is a matching delimiter at the bottom of the file.\n\n--[[\nCopyright (c) 2006-2024 LOVE Development Team\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n--]]\n\nlocal love = require(\"love\")\n\nfunction love.createhandlers()\n\n\t-- Standard callback handlers.\n\tlove.handlers = setmetatable({\n\t\tkeypressed = function (b,s,r)\n\t\t\tif love.keypressed then return love.keypressed(b,s,r) end\n\t\tend,\n\t\tkeyreleased = function (b,s)\n\t\t\tif love.keyreleased then return love.keyreleased(b,s) end\n\t\tend,\n\t\ttextinput = function (t)\n\t\t\tif love.textinput then return love.textinput(t) end\n\t\tend,\n\t\ttextedited = function (t,s,l)\n\t\t\tif love.textedited then return love.textedited(t,s,l) end\n\t\tend,\n\t\tmousemoved = function (x,y,dx,dy,t)\n\t\t\tif love.mousemoved then return love.mousemoved(x,y,dx,dy,t) end\n\t\tend,\n\t\tmousepressed = function (x,y,b,t,c)\n\t\t\tif love.mousepressed then return love.mousepressed(x,y,b,t,c) end\n\t\tend,\n\t\tmousereleased = function (x,y,b,t,c)\n\t\t\tif love.mousereleased then return love.mousereleased(x,y,b,t,c) end\n\t\tend,\n\t\twheelmoved = function (x,y,px,py,dir)\n\t\t\tif love.wheelmoved then return love.wheelmoved(x,y,px,py,dir) end\n\t\tend,\n\t\ttouchpressed = function (id,x,y,dx,dy,p,t,m)\n\t\t\tif love.touchpressed then return love.touchpressed(id,x,y,dx,dy,p,t,m) end\n\t\tend,\n\t\ttouchreleased = function (id,x,y,dx,dy,p,t,m)\n\t\t\tif love.touchreleased then return love.touchreleased(id,x,y,dx,dy,p,t,m) end\n\t\tend,\n\t\ttouchmoved = function (id,x,y,dx,dy,p,t,m)\n\t\t\tif love.touchmoved then return love.touchmoved(id,x,y,dx,dy,p,t,m) end\n\t\tend,\n\t\tjoystickpressed = function (j,b)\n\t\t\tif love.joystickpressed then return love.joystickpressed(j,b) end\n\t\tend,\n\t\tjoystickreleased = function (j,b)\n\t\t\tif love.joystickreleased then return love.joystickreleased(j,b) end\n\t\tend,\n\t\tjoystickaxis = function (j,a,v)\n\t\t\tif love.joystickaxis then return love.joystickaxis(j,a,v) end\n\t\tend,\n\t\tjoystickhat = function (j,h,v)\n\t\t\tif love.joystickhat then return love.joystickhat(j,h,v) end\n\t\tend,\n\t\tgamepadpressed = function (j,b)\n\t\t\tif love.gamepadpressed then return love.gamepadpressed(j,b) end\n\t\tend,\n\t\tgamepadreleased = function (j,b)\n\t\t\tif love.gamepadreleased then return love.gamepadreleased(j,b) end\n\t\tend,\n\t\tgamepadaxis = function (j,a,v)\n\t\t\tif love.gamepadaxis then return love.gamepadaxis(j,a,v) end\n\t\tend,\n\t\tjoystickadded = function (j)\n\t\t\tif love.joystickadded then return love.joystickadded(j) end\n\t\tend,\n\t\tjoystickremoved = function (j)\n\t\t\tif love.joystickremoved then return love.joystickremoved(j) end\n\t\tend,\n\t\tjoysticksensorupdated = function (j, sensorType, x, y, z)\n\t\t\tif love.joysticksensorupdated then return love.joysticksensorupdated(j, sensorType, x, y, z) end\n\t\tend,\n\t\tfocus = function (f)\n\t\t\tif love.focus then return love.focus(f) end\n\t\tend,\n\t\tmousefocus = function (f)\n\t\t\tif love.mousefocus then return love.mousefocus(f) end\n\t\tend,\n\t\tvisible = function (v)\n\t\t\tif love.visible then return love.visible(v) end\n\t\tend,\n\t\texposed = function ()\n\t\t\tif love.exposed then return love.exposed() end\n\t\tend,\n\t\toccluded = function ()\n\t\t\tif love.occluded then return love.occluded() end\n\t\tend,\n\t\tquit = function ()\n\t\t\treturn\n\t\tend,\n\t\tthreaderror = function (t, err)\n\t\t\tif love.threaderror then return love.threaderror(t, err) end\n\t\tend,\n\t\tresize = function (w, h)\n\t\t\tif love.resize then return love.resize(w, h) end\n\t\t\tcollectgarbage()\n\t\tend,\n\t\tfiledropped = function (f, x, y)\n\t\t\tif love.filedropped then return love.filedropped(f, x, y) end\n\t\tend,\n\t\tdirectorydropped = function (dir, x, y)\n\t\t\tif love.directorydropped then return love.directorydropped(dir, x, y) end\n\t\tend,\n\t\tdropbegan = function ()\n\t\t\tif love.dropbegan then return love.dropbegan() end\n\t\tend,\n\t\tdropmoved = function (x, y)\n\t\t\tif love.dropmoved then return love.dropmoved(x, y) end\n\t\tend,\n\t\tdropcompleted = function (x, y)\n\t\t\tif love.dropcompleted then return love.dropcompleted(x, y) end\n\t\tend,\n\t\tlowmemory = function ()\n\t\t\tif love.lowmemory then love.lowmemory() end\n\t\t\tcollectgarbage()\n\t\t\tcollectgarbage()\n\t\tend,\n\t\tdisplayrotated = function (display, orient)\n\t\t\tif love.displayrotated then return love.displayrotated(display, orient) end\n\t\tend,\n\t\tlocalechanged = function ()\n\t\t\tif love.localechanged then return love.localechanged() end\n\t\tend,\n\t\taudiodisconnected = function (sources)\n\t\t\tif not love.audiodisconnected or not love.audiodisconnected(sources) then\n\t\t\t\tlove.audio.setPlaybackDevice()\n\t\t\tend\n\t\tend,\n\t\tsensorupdated = function (sensorType, x, y, z)\n\t\t\tif love.sensorupdated then return love.sensorupdated(sensorType, x, y, z) end\n\t\tend,\n\t\tthemechanged = function ()\n\t\t\tif love.themechanged then return love.themechanged() end\n\t\tend,\n\t}, {\n\t\t__index = function(self, name)\n\t\t\terror(\"Unknown event: \" .. name)\n\t\tend,\n\t})\n\nend\n\n-----------------------------------------------------------\n-- Default callbacks.\n-----------------------------------------------------------\n\nfunction love.run()\n\tif love.load then love.load(love.parsedGameArguments, love.rawGameArguments) end\n\n\t-- We don't want the first frame's dt to include time taken by love.load.\n\tif love.timer then love.timer.step() end\n\n\t-- Main loop time.\n\treturn function()\n\t\t-- Process events.\n\t\tif love.event then\n\t\t\tlove.event.pump()\n\t\t\tfor name, a,b,c,d,e,f,g,h in love.event.poll() do\n\t\t\t\tif name == \"quit\" then\n\t\t\t\t\tif c or not love.quit or not love.quit() then\n\t\t\t\t\t\treturn a or 0, b\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tlove.handlers[name](a,b,c,d,e,f,g,h)\n\t\t\tend\n\t\tend\n\n\t\t-- Update dt, as we'll be passing it to update\n\t\tlocal dt = love.timer and love.timer.step() or 0\n\n\t\t-- Call update and draw\n\t\tif love.update then love.update(dt) end -- will pass 0 if love.timer is disabled\n\n\t\tif love.graphics and love.graphics.isActive() then\n\t\t\tlove.graphics.origin()\n\t\t\tlove.graphics.clear(love.graphics.getBackgroundColor())\n\n\t\t\tif love.draw then love.draw() end\n\n\t\t\tlove.graphics.present()\n\t\tend\n\n\t\tif love.timer then love.timer.sleep(0.001) end\n\tend\nend\n\nlocal pcall, table = pcall, table\nlocal debug, print, tostring, error = debug, print, tostring, error\n\nfunction love.threaderror(t, err)\n\terror(\"Thread error (\"..tostring(t)..\")\\n\\n\"..err, 0)\nend\n\nlocal utf8 = require(\"utf8\")\n\nlocal function error_printer(msg, layer)\n\tprint((debug.traceback(\"Error: \" .. tostring(msg), 1+(layer or 1)):gsub(\"\\n[^\\n]+$\", \"\")))\nend\n\nfunction love.errorhandler(msg)\n\tmsg = tostring(msg)\n\n\terror_printer(msg, 2)\n\n\tif not love.window or not love.graphics or not love.event then\n\t\treturn\n\tend\n\n\tif not love.graphics.isCreated() or not love.window.isOpen() then\n\t\tlocal success, status = pcall(love.window.setMode, 800, 600)\n\t\tif not success or not status then\n\t\t\treturn\n\t\tend\n\tend\n\n\t-- Reset state.\n\tif love.mouse then\n\t\tlove.mouse.setVisible(true)\n\t\tlove.mouse.setGrabbed(false)\n\t\tlove.mouse.setRelativeMode(false)\n\t\tif love.mouse.isCursorSupported() then\n\t\t\tlove.mouse.setCursor()\n\t\tend\n\tend\n\tif love.joystick then\n\t\t-- Stop all joystick vibrations.\n\t\tfor i,v in ipairs(love.joystick.getJoysticks()) do\n\t\t\tv:setVibration()\n\t\tend\n\tend\n\tif love.audio then love.audio.stop() end\n\n\tlove.graphics.reset()\n\tlove.graphics.setFont(love.graphics.newFont(15))\n\n\tlove.graphics.setColor(1, 1, 1)\n\n\tlocal trace = debug.traceback()\n\n\tlove.graphics.origin()\n\n\tlocal sanitizedmsg = {}\n\tfor char in msg:gmatch(utf8.charpattern) do\n\t\ttable.insert(sanitizedmsg, char)\n\tend\n\tsanitizedmsg = table.concat(sanitizedmsg)\n\n\tlocal err = {}\n\n\ttable.insert(err, \"Error\\n\")\n\ttable.insert(err, sanitizedmsg)\n\n\tif #sanitizedmsg ~= #msg then\n\t\ttable.insert(err, \"Invalid UTF-8 string in error message.\")\n\tend\n\n\ttable.insert(err, \"\\n\")\n\n\tfor l in trace:gmatch(\"([^\\n]+)\") do\n\t\tif not l:match(\"boot.lua\") then\n\t\t\tl = l:gsub(\"stack traceback:\", \"Traceback\\n\")\n\t\t\ttable.insert(err, l)\n\t\tend\n\tend\n\n\tlocal p = table.concat(err, \"\\n\")\n\n\tp = p:gsub(\"\\t\", \"\")\n\tp = p:gsub(\"%[string \\\"(.-)\\\"%]\", \"%1\")\n\n\tlocal function draw()\n\t\tif not love.graphics.isActive() then return end\n\t\tlocal pos = 70\n\t\tlove.graphics.clear(89/255, 157/255, 220/255)\n\t\tlove.graphics.printf(p, pos, pos, love.graphics.getWidth() - pos)\n\t\tlove.graphics.present()\n\tend\n\n\tlocal fullErrorText = p\n\tlocal function copyToClipboard()\n\t\tif not love.system then return end\n\t\tlove.system.setClipboardText(fullErrorText)\n\t\tp = p .. \"\\nCopied to clipboard!\"\n\tend\n\n\tif love.system then\n\t\tp = p .. \"\\n\\nPress Ctrl+C or tap to copy this error\"\n\tend\n\n\treturn function()\n\t\tlove.event.pump(0.1)\n\n\t\tfor e, a, b, c in love.event.poll() do\n\t\t\tif e == \"quit\" then\n\t\t\t\t-- Also handle restart args.\n\t\t\t\treturn a or 1, b\n\t\t\telseif e == \"keypressed\" and a == \"escape\" then\n\t\t\t\treturn 1\n\t\t\telseif e == \"keypressed\" and a == \"c\" and love.keyboard.isDown(\"lctrl\", \"rctrl\") then\n\t\t\t\tcopyToClipboard()\n\t\t\telseif e == \"touchpressed\" then\n\t\t\t\tlocal name = love.window.getTitle()\n\t\t\t\tif #name == 0 or name == \"Untitled\" then name = \"Game\" end\n\t\t\t\tlocal buttons = {\"OK\", \"Cancel\"}\n\t\t\t\tif love.system then\n\t\t\t\t\tbuttons[3] = \"Copy to clipboard\"\n\t\t\t\tend\n\t\t\t\tlocal pressed = love.window.showMessageBox(\"Quit \"..name..\"?\", \"\", buttons)\n\t\t\t\tif pressed == 1 then\n\t\t\t\t\treturn 1\n\t\t\t\telseif pressed == 3 then\n\t\t\t\t\tcopyToClipboard()\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tdraw()\n\n\t\tif love.timer then\n\t\t\tlove.timer.sleep(0.001)\n\t\tend\n\tend\n\nend\n\n-- Legacy code support.\nlove.errhand = love.errorhandler\n\n-- DO NOT REMOVE THE NEXT LINE. It is used to load this file as a C++ string.\n--)luastring\"--\"\n"
  },
  {
    "path": "src/modules/love/jitsetup.lua",
    "content": "R\"luastring\"--(\n-- DO NOT REMOVE THE ABOVE LINE. It is used to load this file as a C++ string.\n-- There is a matching delimiter at the bottom of the file.\n\n--[[\nCopyright (c) 2006-2024 LOVE Development Team\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n--]]\n\nif type(jit) ~= \"table\" or not jit.status() then\n\treturn\nend\n\n-- Double the defaults.\njit.opt.start(\"maxtrace=2000\", \"maxrecord=8000\")\n\n-- Somewhat arbitrary value.\njit.opt.start(\"maxmcode=16384\")\n\n-- Somewhat arbitrary value (>= the default).\njit.opt.start(\"sizemcode=128\")\n\n-- DO NOT REMOVE THE NEXT LINE. It is used to load this file as a C++ string.\n--)luastring\"--\"\n"
  },
  {
    "path": "src/modules/love/love.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/version.h\"\n#include \"common/deprecation.h\"\n#include \"common/runtime.h\"\n#include \"modules/window/Window.h\"\n\n#include \"love.h\"\n\n// C++\n#include <string>\n#include <sstream>\n\n#ifdef LOVE_WINDOWS\n#define WIN32_LEAN_AND_MEAN\n#include <windows.h>\n#endif // LOVE_WINDOWS\n\n#ifdef LOVE_ANDROID\n#include <SDL3/SDL.h>\n#endif // LOVE_ANDROID\n\n#ifdef LOVE_LEGENDARY_CONSOLE_IO_HACK\n#include <fcntl.h>\n#include <io.h>\n#include <iostream>\n#include <fstream>\n#endif // LOVE_LEGENDARY_CONSOLE_IO_HACK\n\n// Libraries.\n#ifdef LOVE_ENABLE_LUASOCKET\n#\tinclude \"libraries/luasocket/luasocket.h\"\n#endif\n#ifdef LOVE_ENABLE_ENET\n#\tinclude \"libraries/enet/lua-enet.h\"\n#endif\n#ifdef LOVE_ENABLE_LUA53\n#\tinclude \"libraries/lua53/lutf8lib.h\"\n#endif\n\n// For love::graphics::setGammaCorrect.\n#ifdef LOVE_ENABLE_GRAPHICS\n#\tinclude \"graphics/Graphics.h\"\n#endif\n\n// For love::window::setHighDPIAllowed\n#ifdef LOVE_ENABLE_WINDOW\n#\tinclude \"window/Window.h\"\n#endif\n\n// For love::audio::Audio::setMixWithSystem.\n#ifdef LOVE_ENABLE_AUDIO\n#\tinclude \"audio/Audio.h\"\n#endif\n\n// For love::system::System::getOS.\n#ifdef LOVE_ENABLE_SYSTEM\n#\tinclude \"system/System.h\"\n#endif\n\n// For love::touch::setTrackpadTouch.\n#ifdef LOVE_ENABLE_TOUCH\n#\tinclude \"touch/Touch.h\"\n#endif\n\n// Scripts.\n#include \"scripts/nogame.lua.h\"\n\n// Put the Lua code directly into a raw string literal.\nstatic const char arg_lua[] =\n#include \"arg.lua\"\n;\n\nstatic const char callbacks_lua[] =\n#include \"callbacks.lua\"\n;\n\nstatic const char boot_lua[] =\n#include \"boot.lua\"\n;\n\nstatic const char jit_setup_lua[] =\n#include \"jitsetup.lua\"\n;\n\n// All modules define a c-accessible luaopen\n// so let's make use of those, instead\n// of addressing implementations directly.\nextern \"C\"\n{\n#if defined(LOVE_ENABLE_AUDIO)\n\textern int luaopen_love_audio(lua_State*);\n#endif\n#if defined(LOVE_ENABLE_DATA)\n\textern int luaopen_love_data(lua_State*);\n#endif\n#if defined(LOVE_ENABLE_EVENT)\n\textern int luaopen_love_event(lua_State*);\n#endif\n#if defined(LOVE_ENABLE_FILESYSTEM)\n\textern int luaopen_love_filesystem(lua_State*);\n#endif\n#if defined(LOVE_ENABLE_FONT)\n\textern int luaopen_love_font(lua_State*);\n#endif\n#if defined(LOVE_ENABLE_GRAPHICS)\n\textern int luaopen_love_graphics(lua_State*);\n#endif\n#if defined(LOVE_ENABLE_IMAGE)\n\textern int luaopen_love_image(lua_State*);\n#endif\n#if defined(LOVE_ENABLE_JOYSTICK)\n\textern int luaopen_love_joystick(lua_State*);\n#endif\n#if defined(LOVE_ENABLE_KEYBOARD)\n\textern int luaopen_love_keyboard(lua_State*);\n#endif\n#if defined(LOVE_ENABLE_MATH)\n\textern int luaopen_love_math(lua_State*);\n#endif\n#if defined(LOVE_ENABLE_MOUSE)\n\textern int luaopen_love_mouse(lua_State*);\n#endif\n#if defined(LOVE_ENABLE_PHYSICS)\n\textern int luaopen_love_physics(lua_State*);\n#endif\n#if defined(LOVE_ENABLE_SENSOR)\n\textern int luaopen_love_sensor(lua_State*);\n#endif\n#if defined(LOVE_ENABLE_SOUND)\n\textern int luaopen_love_sound(lua_State*);\n#endif\n#if defined(LOVE_ENABLE_SYSTEM)\n\textern int luaopen_love_system(lua_State*);\n#endif\n#if defined(LOVE_ENABLE_TIMER)\n\textern int luaopen_love_timer(lua_State*);\n#endif\n#if defined(LOVE_ENABLE_THREAD)\n\textern int luaopen_love_thread(lua_State*);\n#endif\n#if defined(LOVE_ENABLE_TOUCH)\n\textern int luaopen_love_touch(lua_State*);\n#endif\n#if defined(LOVE_ENABLE_VIDEO)\n\textern int luaopen_love_video(lua_State*);\n#endif\n#if defined(LOVE_ENABLE_WINDOW)\n\textern int luaopen_love_window(lua_State*);\n#endif\n\textern int luaopen_love_nogame(lua_State*);\n\textern int luaopen_love_jitsetup(lua_State*);\n\textern int luaopen_love_arg(lua_State*);\n\textern int luaopen_love_callbacks(lua_State*);\n\textern int luaopen_love_boot(lua_State*);\n\n#ifdef LOVE_ENABLE_LUAHTTPS\n\textern int luaopen_https(lua_State*);\n#endif\n}\n\nstatic const luaL_Reg modules[] = {\n#if defined(LOVE_ENABLE_AUDIO)\n\t{ \"love.audio\", luaopen_love_audio },\n#endif\n#if defined(LOVE_ENABLE_DATA)\n\t{ \"love.data\", luaopen_love_data },\n#endif\n#if defined(LOVE_ENABLE_EVENT)\n\t{ \"love.event\", luaopen_love_event },\n#endif\n#if defined(LOVE_ENABLE_FILESYSTEM)\n\t{ \"love.filesystem\", luaopen_love_filesystem },\n#endif\n#if defined(LOVE_ENABLE_FONT)\n\t{ \"love.font\", luaopen_love_font },\n#endif\n#if defined(LOVE_ENABLE_GRAPHICS)\n\t{ \"love.graphics\", luaopen_love_graphics },\n#endif\n#if defined(LOVE_ENABLE_IMAGE)\n\t{ \"love.image\", luaopen_love_image },\n#endif\n#if defined(LOVE_ENABLE_JOYSTICK)\n\t{ \"love.joystick\", luaopen_love_joystick },\n#endif\n#if defined(LOVE_ENABLE_KEYBOARD)\n\t{ \"love.keyboard\", luaopen_love_keyboard },\n#endif\n#if defined(LOVE_ENABLE_MATH)\n\t{ \"love.math\", luaopen_love_math },\n#endif\n#if defined(LOVE_ENABLE_MOUSE)\n\t{ \"love.mouse\", luaopen_love_mouse },\n#endif\n#if defined(LOVE_ENABLE_PHYSICS)\n\t{ \"love.physics\", luaopen_love_physics },\n#endif\n#if defined(LOVE_ENABLE_SENSOR)\n\t{ \"love.sensor\", luaopen_love_sensor },\n#endif\n#if defined(LOVE_ENABLE_SOUND)\n\t{ \"love.sound\", luaopen_love_sound },\n#endif\n#if defined(LOVE_ENABLE_SYSTEM)\n\t{ \"love.system\", luaopen_love_system },\n#endif\n#if defined(LOVE_ENABLE_THREAD)\n\t{ \"love.thread\", luaopen_love_thread },\n#endif\n#if defined(LOVE_ENABLE_TIMER)\n\t{ \"love.timer\", luaopen_love_timer },\n#endif\n#if defined(LOVE_ENABLE_TOUCH)\n\t{ \"love.touch\", luaopen_love_touch },\n#endif\n#if defined(LOVE_ENABLE_VIDEO)\n\t{ \"love.video\", luaopen_love_video },\n#endif\n#if defined(LOVE_ENABLE_WINDOW)\n\t{ \"love.window\", luaopen_love_window },\n#endif\n\t{ \"love.nogame\", luaopen_love_nogame },\n\t{ \"love.jitsetup\", luaopen_love_jitsetup },\n\t{ \"love.arg\", luaopen_love_arg },\n\t{ \"love.callbacks\", luaopen_love_callbacks },\n\t{ \"love.boot\", luaopen_love_boot },\n\t{ 0, 0 }\n};\n\n#ifdef LOVE_LEGENDARY_CONSOLE_IO_HACK\nint w__openConsole(lua_State *L);\n#endif // LOVE_LEGENDARY_CONSOLE_IO_HACK\n\n#ifdef LOVE_ANDROID\nstatic int w_print_sdl_log(lua_State *L)\n{\n\tint nargs = lua_gettop(L);\n\n\tlua_getglobal(L, \"tostring\");\n\n\tstd::string outstring;\n\n\tfor (int i = 1; i <= nargs; i++)\n\t{\n\t\t// Call tostring(arg) and leave the result on the top of the stack.\n\t\tlua_pushvalue(L, -1);\n\t\tlua_pushvalue(L, i);\n\t\tlua_call(L, 1, 1);\n\n\t\tconst char *s = lua_tostring(L, -1);\n\t\tif (s == nullptr)\n\t\t\treturn luaL_error(L, \"'tostring' must return a string to 'print'\");\n\n\t\tif (i > 1)\n\t\t\toutstring += \"\\t\";\n\n\t\toutstring += s;\n\n\t\tlua_pop(L, 1); // Pop the result of tostring(arg).\n\t}\n\n\tSDL_Log(\"[LOVE] %s\", outstring.c_str());\n\treturn 0;\n}\n#endif\n\nconst char *love_version()\n{\n\t// Do not refer to love::VERSION here, the linker\n\t// will patch it back up to the executable's one..\n\treturn LOVE_VERSION_STRING;\n}\n\nconst char *love_codename()\n{\n\treturn love::VERSION_CODENAME;\n}\n\nstatic int w_love_getVersion(lua_State *L)\n{\n\tlua_pushinteger(L, love::VERSION_MAJOR);\n\tlua_pushinteger(L, love::VERSION_MINOR);\n\tlua_pushinteger(L, love::VERSION_REV);\n\tlua_pushstring(L, love::VERSION_CODENAME);\n\treturn 4;\n}\n\nstatic int w_love_isVersionCompatible(lua_State *L)\n{\n\tstd::string version;\n\n\tif (lua_type(L, 1) == LUA_TSTRING)\n\t{\n\t\tversion = luaL_checkstring(L, 1);\n\n\t\t// Convert major.minor to major.minor.revision.\n\t\tif (std::count(version.begin(), version.end(), '.') < 2)\n\t\t\tversion.append(\".0\");\n\t}\n\telse\n\t{\n\t\tint major = (int) luaL_checkinteger(L, 1);\n\t\tint minor = (int) luaL_checkinteger(L, 2);\n\t\tint rev   = (int) luaL_optinteger(L, 3, 0);\n\n\t\t// Convert the numbers to a string, since VERSION_COMPATIBILITY is an\n\t\t// array of version strings.\n\t\tstd::stringstream ss;\n\t\tss << major << \".\" << minor << \".\" << rev;\n\n\t\tversion = ss.str();\n\t}\n\n\tfor (int i = 0; love::VERSION_COMPATIBILITY[i] != nullptr; i++)\n\t{\n\t\tstd::string v(love::VERSION_COMPATIBILITY[i]);\n\n\t\t// Convert major.minor to major.minor.revision.\n\t\tif (std::count(v.begin(), v.end(), '.') < 2)\n\t\t\tv.append(\".0\");\n\n\t\tif (version.compare(v) != 0)\n\t\t\tcontinue;\n\n\t\tlua_pushboolean(L, true);\n\t\treturn 1;\n\t}\n\n\tlua_pushboolean(L, false);\n\treturn 1;\n}\n\nstatic int w__setGammaCorrect(lua_State *L)\n{\n#ifdef LOVE_ENABLE_GRAPHICS\n\tlove::graphics::setGammaCorrect((bool) lua_toboolean(L, 1));\n#endif\n\treturn 0;\n}\n\nstatic int w__getDefaultRenderers(lua_State *L)\n{\n#ifdef LOVE_ENABLE_GRAPHICS\n\tconst auto &renderers = love::graphics::getDefaultRenderers();\n\n\tlua_createtable(L, (int) renderers.size(), 0);\n\n\tint n = 1;\n\tfor (auto r : renderers)\n\t{\n\t\tconst char *str = nullptr;\n\t\tif (love::graphics::getConstant(r, str))\n\t\t{\n\t\t\tlua_pushstring(L, str);\n\t\t\tlua_rawseti(L, -2, n++);\n\t\t}\n\t}\n#else\n\tlua_createtable(L, 0, 0);\n#endif\n\treturn 1;\n}\n\nstatic int w__getRenderers(lua_State *L)\n{\n#ifdef LOVE_ENABLE_GRAPHICS\n\tconst auto &renderers = love::graphics::getRenderers();\n\n\tlua_createtable(L, (int) renderers.size(), 0);\n\n\tint n = 1;\n\tfor (auto r : renderers)\n\t{\n\t\tconst char *str = nullptr;\n\t\tif (love::graphics::getConstant(r, str))\n\t\t{\n\t\t\tlua_pushstring(L, str);\n\t\t\tlua_rawseti(L, -2, n++);\n\t\t}\n\t}\n#else\n\tlua_createtable(L, 0, 0);\n#endif\n\treturn 1;\n}\n\nstatic int w__setRenderers(lua_State *L)\n{\n#ifdef LOVE_ENABLE_GRAPHICS\n\tstd::vector<love::graphics::Renderer> renderers;\n\n\tluaL_checktype(L, 1, LUA_TTABLE);\n\tfor (size_t i = 1; i <= love::luax_objlen(L, 1); i++)\n\t{\n\t\tlua_rawgeti(L, -1, (int) i);\n\t\tconst char *str = luaL_checkstring(L, -1);\n\n\t\tlove::graphics::Renderer r;\n\t\tif (love::graphics::getConstant(str, r))\n\t\t\trenderers.push_back(r);\n\n\t\tlua_pop(L, 1);\n\t}\n\n\tlove::graphics::setRenderers(renderers);\n#endif\n\treturn 0;\n}\n\nstatic int w__setLowPowerPreferred(lua_State *L)\n{\n#ifdef LOVE_ENABLE_GRAPHICS\n\tlove::graphics::setLowPowerPreferred(love::luax_checkboolean(L, 1));\n#endif\n\treturn 0;\n}\n\nstatic int w__setHighDPIAllowed(lua_State *L)\n{\n#ifdef LOVE_ENABLE_WINDOW\n\tlove::window::setHighDPIAllowed((bool) lua_toboolean(L, 1));\n#endif\n\treturn 0;\n}\n\nstatic int w__setTrackpadTouch(lua_State *L)\n{\n#ifdef LOVE_ENABLE_TOUCH\n\tlove::touch::setTrackpadTouch((bool) lua_toboolean(L, 1));\n#endif\n\treturn 0;\n}\n\nstatic int w__setAudioMixWithSystem(lua_State *L)\n{\n\tbool success = false;\n\n#ifdef LOVE_ENABLE_AUDIO\n\tbool mix = love::luax_checkboolean(L, 1);\n\tsuccess = love::audio::Audio::setMixWithSystem(mix);\n#endif\n\n\tlove::luax_pushboolean(L, success);\n\treturn 1;\n}\n\nstatic int w__requestRecordingPermission(lua_State *L)\n{\n#ifdef LOVE_ENABLE_AUDIO\n\tlove::audio::setRequestRecordingPermission((bool) lua_toboolean(L, 1));\n#endif\n\treturn 0;\n}\n\nstatic int w_love_markDeprecated(lua_State *L)\n{\n\tint level = (int)luaL_checkinteger(L, 1);\n\tconst char *name = luaL_checkstring(L, 2);\n\tconst char *apiname = luaL_checkstring(L, 3);\n\tconst char *deprecationtname = luaL_checkstring(L, 4);\n\n\tlove::APIType api;\n\tif (!love::getConstant(apiname, api))\n\t\treturn love::luax_enumerror(L, \"API type\", love::getConstants(api), apiname);\n\n\tlove::DeprecationType dtype;\n\tif (!love::getConstant(deprecationtname, dtype))\n\t\treturn love::luax_enumerror(L, \"deprecation type\", love::getConstants(dtype), deprecationtname);\n\n\tconst char *replacement = nullptr;\n\tif (dtype != love::DEPRECATED_NO_REPLACEMENT)\n\t\treplacement = luaL_checkstring(L, 5);\n\n\tlove::luax_markdeprecated(L, level, name, api, dtype, replacement);\n\treturn 0;\n}\n\nstatic int w_love_setDeprecationOutput(lua_State *L)\n{\n\tbool enable = love::luax_checkboolean(L, 1);\n\tlove::setDeprecationOutputEnabled(enable);\n\treturn 0;\n}\n\nstatic int w_love_hasDeprecationOutput(lua_State *L)\n{\n\tlove::luax_pushboolean(L, love::isDeprecationOutputEnabled());\n\treturn 1;\n}\n\nstatic int w_deprecation__gc(lua_State *)\n{\n\tlove::deinitDeprecation();\n\treturn 0;\n}\n\nstatic void luax_addcompatibilityalias(lua_State *L, const char *module, const char *name, const char *alias)\n{\n\tlua_getglobal(L, module);\n\tif (lua_istable(L, -1))\n\t{\n\t\tlua_getfield(L, -1, alias);\n\t\tbool hasalias = !lua_isnoneornil(L, -1);\n\t\tlua_pop(L, 1);\n\t\tif (!hasalias)\n\t\t{\n\t\t\tlua_getfield(L, -1, name);\n\t\t\tlua_setfield(L, -2, alias);\n\t\t}\n\t}\n\tlua_pop(L, 1);\n}\n\nint luaopen_love(lua_State *L)\n{\n\t// Preload module loaders.\n\tfor (int i = 0; modules[i].name != nullptr; i++)\n\t\tlove::luax_preload(L, modules[i].func, modules[i].name);\n\n\tlove::luax_insistpinnedthread(L);\n\n\tlove::luax_insistglobal(L, \"love\");\n\n\t// Set version information.\n\tlua_pushstring(L, love::VERSION);\n\tlua_setfield(L, -2, \"_version\");\n\n\tlua_pushnumber(L, love::VERSION_MAJOR);\n\tlua_setfield(L, -2, \"_version_major\");\n\tlua_pushnumber(L, love::VERSION_MINOR);\n\tlua_setfield(L, -2, \"_version_minor\");\n\tlua_pushnumber(L, love::VERSION_REV);\n\tlua_setfield(L, -2, \"_version_revision\");\n\n\tlua_pushstring(L, love::VERSION_CODENAME);\n\tlua_setfield(L, -2, \"_version_codename\");\n\n#ifdef LOVE_ANDROID\n\tlua_register(L, \"print\", w_print_sdl_log);\n#endif\n\n#ifdef LOVE_LEGENDARY_CONSOLE_IO_HACK\n\tlua_pushcfunction(L, w__openConsole);\n\tlua_setfield(L, -2, \"_openConsole\");\n#endif // LOVE_LEGENDARY_CONSOLE_IO_HACK\n\n\tlua_pushcfunction(L, w__setGammaCorrect);\n\tlua_setfield(L, -2, \"_setGammaCorrect\");\n\n\tlua_pushcfunction(L, w__getDefaultRenderers);\n\tlua_setfield(L, -2, \"_getDefaultRenderers\");\n\n\tlua_pushcfunction(L, w__getRenderers);\n\tlua_setfield(L, -2, \"_getRenderers\");\n\n\tlua_pushcfunction(L, w__setRenderers);\n\tlua_setfield(L, -2, \"_setRenderers\");\n\n\tlua_pushcfunction(L, w__setLowPowerPreferred);\n\tlua_setfield(L, -2, \"_setLowPowerPreferred\");\n\n\tlua_pushcfunction(L, w__setHighDPIAllowed);\n\tlua_setfield(L, -2, \"_setHighDPIAllowed\");\n\n\tlua_pushcfunction(L, w__setTrackpadTouch);\n\tlua_setfield(L, -2, \"_setTrackpadTouch\");\n\n\t// Exposed here because we need to be able to call it before the audio\n\t// module is initialized.\n\tlua_pushcfunction(L, w__setAudioMixWithSystem);\n\tlua_setfield(L, -2, \"_setAudioMixWithSystem\");\n\tlua_pushcfunction(L, w__requestRecordingPermission);\n\tlua_setfield(L, -2, \"_requestRecordingPermission\");\n\n\tlua_newtable(L);\n\n\tfor (int i = 0; love::VERSION_COMPATIBILITY[i] != nullptr; i++)\n\t{\n\t\tlua_pushstring(L, love::VERSION_COMPATIBILITY[i]);\n\t\tlua_rawseti(L, -2, i+1);\n\t}\n\n\tlua_setfield(L, -2, \"_version_compat\");\n\n\tlua_pushcfunction(L, w_love_getVersion);\n\tlua_setfield(L, -2, \"getVersion\");\n\n\tlua_pushcfunction(L, w_love_isVersionCompatible);\n\tlua_setfield(L, -2, \"isVersionCompatible\");\n\n#ifdef LOVE_ENABLE_SYSTEM\n\tlua_pushstring(L, love::system::System::getOS());\n#else\n\tlua_pushstring(L, \"Unknown\");\n#endif\n\tlua_setfield(L, -2, \"_os\");\n\n\t{\n\t\tlove::initDeprecation();\n\n\t\t// Any old data that we can attach a metatable to, for __gc. We want to\n\t\t// call deinitDeprecation when love is garbage collected.\n\t\tlua_newuserdata(L, sizeof(int));\n\n\t\tluaL_newmetatable(L, \"love_deprecation\");\n\t\tlua_pushcfunction(L, w_deprecation__gc);\n\t\tlua_setfield(L, -2, \"__gc\");\n\t\tlua_setmetatable(L, -2);\n\n\t\tlua_setfield(L, -2, \"_deprecation\");\n\n\t\tlua_pushcfunction(L, w_love_markDeprecated);\n\t\tlua_setfield(L, -2, \"markDeprecated\");\n\n\t\tlua_pushcfunction(L, w_love_setDeprecationOutput);\n\t\tlua_setfield(L, -2, \"setDeprecationOutput\");\n\n\t\tlua_pushcfunction(L, w_love_hasDeprecationOutput);\n\t\tlua_setfield(L, -2, \"hasDeprecationOutput\");\n\t}\n\n\t// Necessary for Data-creating methods to work properly in Data subclasses.\n\tlove::luax_require(L, \"love.data\");\n\tlua_pop(L, 1);\n\n#if LUA_VERSION_NUM <= 501\n\t// These are deprecated in Lua 5.1. LuaJIT 2.1 removes them, but code\n\t// written assuming LuaJIT 2.0 or Lua 5.1 is used might still rely on them.\n\tluax_addcompatibilityalias(L, \"math\", \"fmod\", \"mod\");\n\tluax_addcompatibilityalias(L, \"string\", \"gmatch\", \"gfind\");\n#endif\n\n#ifdef LOVE_ENABLE_LUASOCKET\n\tlove::luasocket::preload(L);\n#endif\n#ifdef LOVE_ENABLE_ENET\n\tlove::luax_preload(L, luaopen_enet, \"enet\");\n#endif\n#ifdef LOVE_ENABLE_LUA53\n\tlove::luax_preload(L, luaopen_luautf8, \"utf8\");\n#endif\n#ifdef LOVE_ENABLE_LUAHTTPS\n\tlove::luax_preload(L, luaopen_https, \"https\");\n#endif\n\n#ifdef LOVE_ENABLE_WINDOW\n\t// In some environments, LuaJIT is limited to 2GB and LuaJIT sometimes panic when it\n\t// reaches OOM and closes the whole program, leaving the user confused about what's\n\t// going on.\n\t// We can't recover the state at this point, but it's better to inform user that\n\t// something very bad happening instead of silently exiting.\n\t// Note that this is not foolproof. In some cases, the whole process crashes by\n\t// uncaught exception that LuaJIT throws or simply exit as if calling\n\t// love.event.quit(\"not enough memory\")\n\tlua_atpanic(L, [](lua_State *L)\n\t{\n\t\tusing namespace love;\n\t\tusing namespace love::window;\n\n\t\tchar message[128];\n\t\tWindow* windowModule = Module::getInstance<Window>(Module::M_WINDOW);\n\n\t\tsnprintf(message, sizeof(message), \"PANIC: unprotected error in call to Lua API (%s)\", lua_tostring(L, -1));\n\n\t\tif (windowModule)\n\t\t\twindowModule->showMessageBox(\"Lua Fatal Error\", message, Window::MESSAGEBOX_ERROR, windowModule->isOpen());\n\n\t\tfprintf(stderr, \"%s\\n\", message);\n\t\treturn 0;\n\t});\n#endif\n\n\treturn 1;\n}\n\n#ifdef LOVE_LEGENDARY_CONSOLE_IO_HACK\n\nbool love_openConsole(const char *&err)\n{\n\tstatic bool is_open = false;\n\terr = nullptr;\n\n\tif (is_open)\n\t\treturn true;\n\n\tis_open = true;\n\n\tif (!AttachConsole(ATTACH_PARENT_PROCESS))\n\t{\n\t\tDWORD winerr = GetLastError();\n\n\t\tif (winerr == ERROR_ACCESS_DENIED)\n\t\t{\n\t\t\t// The process is already attached to a console. We'll assume stdout\n\t\t\t// and friends are already being directed there.\n\t\t\tis_open = true;\n\t\t\treturn is_open;\n\t\t}\n\n\t\t// Create our own console if we can't attach to an existing one.\n\t\tif (!AllocConsole())\n\t\t{\n\t\t\tis_open = false;\n\t\t\terr = \"Could not create console.\";\n\t\t\treturn is_open;\n\t\t}\n\n\t\tSetConsoleTitle(TEXT(\"LOVE Console\"));\n\n\t\tconst int MAX_CONSOLE_LINES = 5000;\n\t\tCONSOLE_SCREEN_BUFFER_INFO console_info;\n\n\t\t// Set size.\n\t\tGetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &console_info);\n\t\tconsole_info.dwSize.Y = MAX_CONSOLE_LINES;\n\t\tSetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), console_info.dwSize);\n\t}\n\n\tFILE *fp;\n\n\t// Redirect stdout.\n\tfp = freopen(\"CONOUT$\", \"w\", stdout);\n\tif (fp == NULL)\n\t{\n\t\terr = \"Console redirection of stdout failed.\";\n\t\treturn is_open;\n\t}\n\n\t// Redirect stdin.\n\tfp = freopen(\"CONIN$\", \"r\", stdin);\n\tif (fp == NULL)\n\t{\n\t\terr = \"Console redirection of stdin failed.\";\n\t\treturn is_open;\n\t}\n\n\t// Redirect stderr.\n\tfp = freopen(\"CONOUT$\", \"w\", stderr);\n\tif (fp == NULL)\n\t{\n\t\terr = \"Console redirection of stderr failed.\";\n\t\treturn is_open;\n\t}\n\n\treturn is_open;\n}\n\nint w__openConsole(lua_State *L)\n{\n\tconst char *err = nullptr;\n\tbool isopen = love_openConsole(err);\n\tif (err != nullptr)\n\t\treturn luaL_error(L, err);\n\tlove::luax_pushboolean(L, isopen);\n\treturn 1;\n}\n\n#endif // LOVE_LEGENDARY_CONSOLE_IO_HACK\n\nint luaopen_love_nogame(lua_State *L)\n{\n\tif (luaL_loadbuffer(L, (const char *)love::nogame_lua, sizeof(love::nogame_lua), \"=[love \\\"nogame.lua\\\"]\") == 0)\n\t\tlua_call(L, 0, 1);\n\n\treturn 1;\n}\n\nint luaopen_love_jitsetup(lua_State *L)\n{\n\tif (luaL_loadbuffer(L, jit_setup_lua, sizeof(jit_setup_lua), \"=[love \\\"jitsetup.lua\\\"]\") == 0)\n\t\tlua_call(L, 0, 1);\n\n\treturn 1;\n}\n\nint luaopen_love_arg(lua_State *L)\n{\n\tif (luaL_loadbuffer(L, arg_lua, sizeof(arg_lua), \"=[love \\\"arg.lua\\\"]\") == 0)\n\t\tlua_call(L, 0, 1);\n\n\treturn 1;\n}\n\nint luaopen_love_callbacks(lua_State *L)\n{\n\tif (luaL_loadbuffer(L, callbacks_lua, sizeof(callbacks_lua), \"=[love \\\"callbacks.lua\\\"]\") == 0)\n\t\tlua_call(L, 0, 1);\n\n\treturn 1;\n}\n\nint luaopen_love_boot(lua_State *L)\n{\n\tif (luaL_loadbuffer(L, boot_lua, sizeof(boot_lua), \"=[love \\\"boot.lua\\\"]\") == 0)\n\t\tlua_call(L, 0, 1);\n\n\treturn 1;\n}\n"
  },
  {
    "path": "src/modules/love/love.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_LOVE_H\n#define LOVE_LOVE_H\n\n// LOVE\n#include \"common/config.h\"\n\n// Forward declare lua_State.\nstruct lua_State;\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\nLOVE_EXPORT const char *love_version();\nLOVE_EXPORT const char *love_codename();\nLOVE_EXPORT int luaopen_love(lua_State *L);\nLOVE_EXPORT int luaopen_love_nogame(lua_State *L);\nLOVE_EXPORT int luaopen_love_jitsetup(lua_State *L);\nLOVE_EXPORT int luaopen_love_arg(lua_State *L);\nLOVE_EXPORT int luaopen_love_callbacks(lua_State *L);\nLOVE_EXPORT int luaopen_love_boot(lua_State *L);\n\n#ifdef LOVE_LEGENDARY_CONSOLE_IO_HACK\nLOVE_EXPORT bool love_openConsole(const char *&err);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // LOVE_LOVE_H\n"
  },
  {
    "path": "src/modules/math/BezierCurve.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"BezierCurve.h\"\n#include \"common/Exception.h\"\n\n#include <cmath>\n#include <algorithm>\n\nusing namespace std;\n\nnamespace\n{\n\n/**\n * Subdivide Bezier polygon.\n **/\nvoid subdivide(vector<love::Vector2> &points, int k)\n{\n\tif (k <= 0)\n\t\treturn;\n\n\t// subdivision using de casteljau - subdivided control polygons are\n\t// on the 'edges' of the computation scheme, e.g:\n\t//\n\t// ------LEFT------->\n\t// b00  b10  b20  b30\n\t// b01  b11  b21 .---\n\t// b02  b12 .---'\n\t// b03 .---'RIGHT\n\t// <--'\n\t//\n\t// the subdivided control polygon is:\n\t// b00, b10, b20, b30, b21, b12, b03\n\tvector<love::Vector2> left, right;\n\tleft.reserve(points.size());\n\tright.reserve(points.size());\n\n\tfor (size_t step = 1; step < points.size(); ++step)\n\t{\n\t\tleft.push_back(points[0]);\n\t\tright.push_back(points[points.size() - step]);\n\t\tfor (size_t i = 0; i < points.size() - step; ++i)\n\t\t\tpoints[i] = (points[i] + points[i+1]) * .5;\n\t}\n\tleft.push_back(points[0]);\n\tright.push_back(points[0]);\n\n\t// recurse\n\tsubdivide(left, k-1);\n\tsubdivide(right, k-1);\n\n\t// merge (right is in reversed order)\n\t// By this point the 'left' array has a point at the end that's collinear\n\t// with other points. It's still needed for the subdivide calls above but we\n\t// can get rid of it here.\n\tpoints.resize(left.size() + right.size() - 2);\n\tfor (size_t i = 0; i < left.size() - 1; ++i)\n\t\tpoints[i] = left[i];\n\tfor (size_t i = 1; i < right.size(); ++i)\n\t\tpoints[i-1 + left.size() - 1] = right[right.size() - i - 1];\n}\n\n}\n\nnamespace love\n{\nnamespace math\n{\n\nlove::Type BezierCurve::type(\"BezierCurve\", &Object::type);\n\nBezierCurve::BezierCurve(const vector<Vector2> &pts)\n\t: controlPoints(pts)\n{\n}\n\n\nBezierCurve BezierCurve::getDerivative() const\n{\n\tif (getDegree() < 1)\n\t\tthrow Exception(\"Cannot derive a curve of degree < 1.\");\n\t// actually we can, it just doesn't make any sense.\n\n\tvector<Vector2> forward_differences(controlPoints.size()-1);\n\tfloat degree = float(getDegree());\n\tfor (size_t i = 0; i < forward_differences.size(); ++i)\n\t\tforward_differences[i] = (controlPoints[i+1] - controlPoints[i]) * degree;\n\n\treturn BezierCurve(forward_differences);\n}\n\nconst Vector2 &BezierCurve::getControlPoint(int i) const\n{\n\tif (controlPoints.size() == 0)\n\t\tthrow Exception(\"Curve contains no control points.\");\n\t\t\n\twhile (i < 0)\n\t\ti += controlPoints.size();\n\n\twhile ((size_t) i >= controlPoints.size())\n\t\ti -= controlPoints.size();\n\n\treturn controlPoints[i];\n}\n\nvoid BezierCurve::setControlPoint(int i, const Vector2 &point)\n{\n\tif (controlPoints.size() == 0)\n\t\tthrow Exception(\"Curve contains no control points.\");\n\n\twhile (i < 0)\n\t\ti += controlPoints.size();\n\n\twhile ((size_t) i >= controlPoints.size())\n\t\ti -= controlPoints.size();\n\n\tcontrolPoints[i] = point;\n}\n\nvoid BezierCurve::insertControlPoint(const Vector2 &point, int i)\n{\n\tif (controlPoints.size() == 0)\n\t\ti = 0;\n\n\twhile (i < 0)\n\t\ti += controlPoints.size();\n\n\twhile ((size_t)  i > controlPoints.size())\n\t\ti -= controlPoints.size();\n\n\tcontrolPoints.insert(controlPoints.begin() + i, point);\n}\n\nvoid BezierCurve::removeControlPoint(int i)\n{\n\tif (controlPoints.size() == 0)\n\t\tthrow Exception(\"No control points to remove.\");\n\n\twhile (i < 0)\n\t\ti += controlPoints.size();\n\n\twhile ((size_t) i >= controlPoints.size())\n\t\ti -= controlPoints.size();\n\n\tcontrolPoints.erase(controlPoints.begin() + i);\n}\n\nvoid BezierCurve::translate(const Vector2 &t)\n{\n\tfor (size_t i = 0; i < controlPoints.size(); ++i)\n\t\tcontrolPoints[i] += t;\n}\n\nvoid BezierCurve::rotate(double phi, const Vector2 &center)\n{\n\tfloat c = cos(phi), s = sin(phi);\n\tfor (size_t i = 0; i < controlPoints.size(); ++i)\n\t{\n\t\tVector2 v = controlPoints[i] - center;\n\t\tcontrolPoints[i].x = c * v.x - s * v.y + center.x;\n\t\tcontrolPoints[i].y = s * v.x + c * v.y + center.y;\n\t}\n}\n\nvoid BezierCurve::scale(double s, const Vector2 &center)\n{\n\tfor (size_t i = 0; i < controlPoints.size(); ++i)\n\t\tcontrolPoints[i] = (controlPoints[i] - center) * s + center;\n}\n\nVector2 BezierCurve::evaluate(double t) const\n{\n\tif (t < 0 || t > 1)\n\t\tthrow Exception(\"Invalid evaluation parameter: must be between 0 and 1\");\n\tif (controlPoints.size() < 2)\n\t\tthrow Exception(\"Invalid Bezier curve: Not enough control points.\");\n\n\t// de casteljau\n\tvector<Vector2> points(controlPoints);\n\tfor (size_t step = 1; step < controlPoints.size(); ++step)\n\t\tfor (size_t i = 0; i < controlPoints.size() - step; ++i)\n\t\t\tpoints[i] = points[i] * (1-t) + points[i+1] * t;\n\n\treturn points[0];\n}\n\nBezierCurve* BezierCurve::getSegment(double t1, double t2) const\n{\n\tif (t1 < 0 || t2 > 1)\n\t\tthrow Exception(\"Invalid segment parameters: must be between 0 and 1\");\n\tif (t2 <= t1)\n\t\tthrow Exception(\"Invalid segment parameters: t1 must be smaller than t2\");\n\n\t// First, sudivide the curve at t2, then subdivide the \"left\"\n\t// sub-curve at t1/t2. The \"right\" curve is the segment.\n\tvector<Vector2> points(controlPoints);\n\tvector<Vector2> left, right;\n\tleft.reserve(points.size());\n\tright.reserve(points.size());\n\n\t// first subdivision at t2 (take only the left curve)\n\tfor (size_t step = 1; step < points.size(); ++step)\n\t{\n\t\tleft.push_back(points[0]);\n\t\tfor (size_t i = 0; i < points.size() - step; ++i)\n\t\t\tpoints[i] += (points[i+1] - points[i]) * t2; // p_i <- (1-t2)*p_i + t2*p_{i+1}\n\t}\n\tleft.push_back(points[0]);\n\n\t// second subdivion at t1/t2 (take only the right curve)\n\tdouble s = t1/t2;\n\tfor (size_t step = 1; step < left.size(); ++step)\n\t{\n\t\tright.push_back(left[left.size() - step]);\n\t\tfor (size_t i = 0; i < left.size() - step; ++i)\n\t\t\tleft[i] += (left[i+1] - left[i]) * s;\n\t}\n\tright.push_back(left[0]);\n\n\t// control points for right curve were added in reversed order\n\tstd::reverse(right.begin(), right.end());\n\treturn new BezierCurve(right);\n}\n\nvector<Vector2> BezierCurve::render(int accuracy) const\n{\n\tif (controlPoints.size() < 2)\n\t\tthrow Exception(\"Invalid Bezier curve: Not enough control points.\");\n\tvector<Vector2> vertices(controlPoints);\n\tsubdivide(vertices, accuracy);\n\treturn vertices;\n}\n\nvector<Vector2> BezierCurve::renderSegment(double start, double end, int accuracy) const\n{\n\tif (controlPoints.size() < 2)\n\t\tthrow Exception(\"Invalid Bezier curve: Not enough control points.\");\n\tvector<Vector2> vertices(controlPoints);\n\tsubdivide(vertices, accuracy);\n\tif (start == end)\n\t{\n\t\tvertices.clear();\n\t}\n\telse if (start < end)\n\t{\n\t\tsize_t start_idx = size_t(start * vertices.size());\n\t\tsize_t end_idx = size_t(end * vertices.size() + 0.5);\n\t\treturn std::vector<Vector2>(vertices.begin() + start_idx, vertices.begin() + end_idx);\n\t}\n\telse if (end > start)\n\t{\n\t\tsize_t start_idx = size_t(end * vertices.size() + 0.5);\n\t\tsize_t end_idx = size_t(start * vertices.size());\n\t\treturn std::vector<Vector2>(vertices.begin() + start_idx, vertices.begin() + end_idx);\n\t}\n\treturn vertices;\n}\n\n} // namespace math\n} // namespace love\n"
  },
  {
    "path": "src/modules/math/BezierCurve.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_MATH_BEZIER_CURVE_H\n#define LOVE_MATH_BEZIER_CURVE_H\n\n// LOVE\n#include \"common/Object.h\"\n#include \"common/Vector.h\"\n#include <vector>\n\nnamespace love\n{\nnamespace math\n{\n\nclass BezierCurve : public Object\n{\npublic:\n\n\tstatic love::Type type;\n\n\t/**\n\t * @param controlPoints Control polygon of the curve.\n\t **/\n\tBezierCurve(const std::vector<Vector2> &controlPoints);\n\n\t/**\n\t * @returns Degree of the curve\n\t **/\n\tsize_t getDegree() const\n\t{\n\t\treturn controlPoints.size() - 1;\n\t}\n\n\t/**\n\t * @returns First derivative of the curve.\n\t */\n\tBezierCurve getDerivative() const;\n\n\t/**\n\t * @returns i'th control point.\n\t **/\n\tconst Vector2 &getControlPoint(int i) const;\n\n\t/**\n\t * Sets the i'th control point.\n\t * @param i Control point to change.\n\t * @param point New control point.\n\t **/\n\tvoid setControlPoint(int i, const Vector2 &point);\n\n\t/**\n\t * Insert a new control point before the i'th control point.\n\t * If i < 0, Lua string indexing rules apply.\n\t * @param point Control point to insert.\n\t * @param pos Position to insert.\n\t **/\n\tvoid insertControlPoint(const Vector2 &point, int pos = -1);\n\n\t/**\n\t * Remove the i'th control point from the curve.\n\t * @param i Control point to remove\n\t **/\n\tvoid removeControlPoint(int i);\n\n\t/**\n\t * @returns Number of control points.\n\t **/\n\tsize_t getControlPointCount() const\n\t{\n\t\treturn controlPoints.size();\n\t}\n\n\t/**\n\t * Move the curve.\n\t * @param t Translation vector.\n\t */\n\tvoid translate(const Vector2 &t);\n\n\t/**\n\t * Rotate the curve.\n\t * @param phi Rotation angle (radians).\n\t * @param center Rotation center.\n\t */\n\tvoid rotate(double phi, const Vector2 &center);\n\n\t/**\n\t * Scale the curve.\n\t * @param phi Scale factor.\n\t * @param center Scale center.\n\t */\n\tvoid scale(double phi, const Vector2 &center);\n\n\t/**\n\t * Evaluates the curve at time t.\n\t * @param t Curve parameter, must satisfy 0 <= t <= 1.\n\t **/\n\tVector2 evaluate(double t) const;\n\n\t/**\n\t * Get curve segment starting at t1 and ending at t2.\n\t * The new curve will be parametrized from 0 <= t <= 1.\n\t * @param t1 Start of the segment.\n\t * @param t2 End of the segment.\n\t * @returns Bezier curve covering the segment.\n\t */\n\tBezierCurve* getSegment(double t1, double t2) const;\n\n\t/**\n\t * Renders the curve by subdivision.\n\t * @param accuracy The 'fineness' of the curve.\n\t * @returns A polygon chain that approximates the bezier curve.\n\t **/\n\tstd::vector<Vector2> render(int accuracy = 4) const;\n\n\t/**\n\t * Renders a segment of the curve by subdivision.\n\t * @param start The starting point (between 0 and 1) on the curve.\n\t * @param end The ending point on the curve.\n\t * @param accuracy The 'fineness' of the curve.\n\t * @returns A polygon chain that approximates the segment along the curve\n\t **/\n\tstd::vector<Vector2> renderSegment(double start, double end, int accuracy = 4) const;\n\nprivate:\n\tstd::vector<Vector2> controlPoints;\n};\n\n}\n}\n\n#endif\n"
  },
  {
    "path": "src/modules/math/MathModule.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"MathModule.h\"\n#include \"common/Vector.h\"\n#include \"common/int.h\"\n#include \"common/StringMap.h\"\n#include \"BezierCurve.h\"\n#include \"Transform.h\"\n\n// STL\n#include <cmath>\n#include <list>\n#include <iostream>\n\n// C\n#include <time.h>\n\nusing std::list;\nusing love::Vector2;\n\nnamespace\n{\n\n// check if an angle is oriented counter clockwise\ninline bool is_oriented_ccw(const Vector2 &a, const Vector2 &b, const Vector2 &c)\n{\n\t// return det(b-a, c-a) >= 0\n\treturn ((b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x)) >= 0;\n}\n\n// check if a and b are on the same side of the line c->d\nbool on_same_side(const Vector2 &a, const Vector2 &b, const Vector2 &c, const Vector2 &d)\n{\n\tfloat px = d.x - c.x, py = d.y - c.y;\n\t// return det(p, a-c) * det(p, b-c) >= 0\n\tfloat l = px * (a.y - c.y) - py * (a.x - c.x);\n\tfloat m = px * (b.y - c.y) - py * (b.x - c.x);\n\treturn l * m >= 0;\n}\n\n// checks is p is contained in the triangle abc\ninline bool point_in_triangle(const Vector2 &p, const Vector2 &a, const Vector2 &b, const Vector2 &c)\n{\n\treturn on_same_side(p,a, b,c) && on_same_side(p,b, a,c) && on_same_side(p,c, a,b);\n}\n\n// checks if any vertex in `vertices' is in the triangle abc.\nbool any_point_in_triangle(const std::list<const Vector2 *> &vertices, const Vector2 &a, const Vector2 &b, const Vector2 &c)\n{\n\tfor (const Vector2 *p : vertices)\n\t{\n\t\tif ((p != &a) && (p != &b) && (p != &c) && point_in_triangle(*p, a,b,c)) // oh god...\n\t\t\treturn true;\n\t}\n\n\treturn false;\n}\n\ninline bool is_ear(const Vector2 &a, const Vector2 &b, const Vector2 &c, const std::list<const Vector2 *> &vertices)\n{\n\treturn is_oriented_ccw(a,b,c) && !any_point_in_triangle(vertices, a,b,c);\n}\n\n} // anonymous namespace\n\nnamespace love\n{\nnamespace math\n{\n\nstd::vector<Triangle> triangulate(const std::vector<love::Vector2> &polygon)\n{\n\tif (polygon.size() < 3)\n\t\tthrow love::Exception(\"Not a polygon\");\n\telse if (polygon.size() == 3)\n\t\treturn std::vector<Triangle>(1, Triangle(polygon[0], polygon[1], polygon[2]));\n\n\t// collect list of connections and record leftmost item to check if the polygon\n\t// has the expected winding\n\tstd::vector<size_t> next_idx(polygon.size()), prev_idx(polygon.size());\n\tsize_t idx_lm = 0;\n\tfor (size_t i = 0; i < polygon.size(); ++i)\n\t{\n\t\tconst love::Vector2 &lm = polygon[idx_lm], &p = polygon[i];\n\t\tif (p.x < lm.x || (p.x == lm.x && p.y < lm.y))\n\t\t\tidx_lm = i;\n\t\tnext_idx[i] = i+1;\n\t\tprev_idx[i] = i-1;\n\t}\n\tnext_idx[next_idx.size()-1] = 0;\n\tprev_idx[0] = prev_idx.size()-1;\n\n\t// check if the polygon has the expected winding and reverse polygon if needed\n\tif (!is_oriented_ccw(polygon[prev_idx[idx_lm]], polygon[idx_lm], polygon[next_idx[idx_lm]]))\n\t\tnext_idx.swap(prev_idx);\n\n\t// collect list of concave polygons\n\tstd::list<const love::Vector2 *> concave_vertices;\n\tfor (size_t i = 0; i < polygon.size(); ++i)\n\t{\n\t\tif (!is_oriented_ccw(polygon[prev_idx[i]], polygon[i], polygon[next_idx[i]]))\n\t\t\tconcave_vertices.push_back(&polygon[i]);\n\t}\n\n\t// triangulation according to kong\n\tstd::vector<Triangle> triangles;\n\tsize_t n_vertices = polygon.size();\n\tsize_t current = 1, skipped = 0, next, prev;\n\twhile (n_vertices > 3)\n\t{\n\t\tnext = next_idx[current];\n\t\tprev = prev_idx[current];\n\t\tconst Vector2 &a = polygon[prev], &b = polygon[current], &c = polygon[next];\n\t\tif (is_ear(a,b,c, concave_vertices))\n\t\t{\n\t\t\ttriangles.push_back(Triangle(a,b,c));\n\t\t\tnext_idx[prev] = next;\n\t\t\tprev_idx[next] = prev;\n\t\t\tconcave_vertices.remove(&b);\n\t\t\t--n_vertices;\n\t\t\tskipped = 0;\n\t\t}\n\t\telse if (++skipped > n_vertices)\n\t\t{\n\t\t\tthrow love::Exception(\"Cannot triangulate polygon.\");\n\t\t}\n\t\tcurrent = next;\n\t}\n\tnext = next_idx[current];\n\tprev = prev_idx[current];\n\ttriangles.push_back(Triangle(polygon[prev], polygon[current], polygon[next]));\n\n\treturn triangles;\n}\n\nbool isConvex(const std::vector<love::Vector2> &polygon)\n{\n\tif (polygon.size() < 3)\n\t\treturn false;\n\n\t// a polygon is convex if all corners turn in the same direction\n\t// turning direction can be determined using the cross-product of\n\t// the forward difference vectors\n\tsize_t i = polygon.size() - 2, j = polygon.size() - 1, k = 0;\n\tVector2 p(polygon[j] - polygon[i]);\n\tVector2 q(polygon[k] - polygon[j]);\n\tfloat winding = Vector2::cross(p, q);\n\n\twhile (k+1 < polygon.size())\n\t{\n\t\ti = j; j = k; k++;\n\t\tp = polygon[j] - polygon[i];\n\t\tq = polygon[k] - polygon[j];\n\n\t\tif (Vector2::cross(p, q) * winding < 0)\n\t\t\treturn false;\n\t}\n\treturn true;\n}\n\n/**\n * http://en.wikipedia.org/wiki/SRGB#The_reverse_transformation\n **/\nfloat gammaToLinear(float c)\n{\n\tif (c <= 0.04045f)\n\t\treturn c / 12.92f;\n\telse\n\t\treturn powf((c + 0.055f) / 1.055f, 2.4f);\n}\n\n/**\n * http://en.wikipedia.org/wiki/SRGB#The_forward_transformation_.28CIE_xyY_or_CIE_XYZ_to_sRGB.29\n **/\nfloat linearToGamma(float c)\n{\n\tif (c <= 0.0031308f)\n\t\treturn c * 12.92f;\n\telse\n\t\treturn 1.055f * powf(c, 1.0f / 2.4f) - 0.055f;\n}\n\nMath::Math()\n\t: Module(M_MATH, \"love.math\")\n{\n\tRandomGenerator::Seed seed;\n\tseed.b64 = (uint64) time(nullptr);\n\n\trng.set(new RandomGenerator(), Acquire::NORETAIN);\n\trng->setSeed(seed);\n}\n\nMath::~Math()\n{\n}\n\nRandomGenerator *Math::newRandomGenerator()\n{\n\treturn new RandomGenerator();\n}\n\nBezierCurve *Math::newBezierCurve(const std::vector<Vector2> &points)\n{\n\treturn new BezierCurve(points);\n}\n\nTransform *Math::newTransform()\n{\n\treturn new Transform();\n}\n\nTransform *Math::newTransform(float x, float y, float a, float sx, float sy, float ox, float oy, float kx, float ky)\n{\n\treturn new Transform(x, y, a, sx, sy, ox, oy, kx, ky);\n}\n\n} // math\n} // love\n"
  },
  {
    "path": "src/modules/math/MathModule.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_MATH_MODMATH_H\n#define LOVE_MATH_MODMATH_H\n\n#include \"RandomGenerator.h\"\n\n// LOVE\n#include \"common/Module.h\"\n#include \"common/math.h\"\n#include \"common/Vector.h\"\n#include \"common/int.h\"\n\n// Noise\n#include \"libraries/noise1234/noise1234.h\"\n#include \"libraries/noise1234/simplexnoise1234.h\"\n\n// STL\n#include <vector>\n\nnamespace love\n{\nnamespace math\n{\n\nclass BezierCurve;\nclass Transform;\n\nstruct Triangle\n{\n\tTriangle(const Vector2 &x, const Vector2 &y, const Vector2 &z)\n\t\t: a(x), b(y), c(z)\n\t{}\n\tVector2 a, b, c;\n};\n\n/**\n * Triangulate a simple polygon.\n *\n * @param polygon Polygon to triangulate. Must not intersect itself.\n * @return List of triangles the polygon is composed of.\n **/\nstd::vector<Triangle> triangulate(const std::vector<love::Vector2> &polygon);\n\n/**\n * Checks whether a polygon is convex.\n *\n * @param polygon Polygon to test.\n * @return True if the polygon is convex, false otherwise.\n **/\nbool isConvex(const std::vector<love::Vector2> &polygon);\n\n/**\n * Converts a value from the sRGB (gamma) colorspace to linear RGB.\n **/\nfloat gammaToLinear(float c);\n\n/**\n * Converts a value from linear RGB to the sRGB (gamma) colorspace.\n **/\nfloat linearToGamma(float c);\n\n/**\n * Calculate noise for the specified coordinate(s).\n *\n * @return Noise value in the range of [0, 1].\n **/\nstatic double simplexNoise1(double x);\nstatic double simplexNoise2(double x, double y);\nstatic double simplexNoise3(double x, double y, double z);\nstatic double simplexNoise4(double x, double y, double z, double w);\nstatic double perlinNoise1(double x);\nstatic double perlinNoise2(double x, double y);\nstatic double perlinNoise3(double x, double y, double z);\nstatic double perlinNoise4(double x, double y, double z, double w);\n\n\nclass Math : public Module\n{\npublic:\n\n\tMath();\n\tvirtual ~Math();\n\n\tRandomGenerator *getRandomGenerator()\n\t{\n\t\treturn rng.get();\n\t}\n\n\t/**\n\t * Create a new random number generator.\n\t **/\n\tRandomGenerator *newRandomGenerator();\n\n\t/**\n\t * Creates a new bezier curve.\n\t **/\n\tBezierCurve *newBezierCurve(const std::vector<Vector2> &points);\n\n\tTransform *newTransform();\n\tTransform *newTransform(float x, float y, float a, float sx, float sy, float ox, float oy, float kx, float ky);\n\nprivate:\n\n\t// All love objects accessible in Lua should be heap-allocated,\n\t// to guarantee a minimum pointer alignment.\n\tStrongRef<RandomGenerator> rng;\n\n}; // Math\n\n\nstatic inline double simplexNoise1(double x)\n{\n\treturn SimplexNoise1234::noise(x) * 0.5 + 0.5;\n}\n\nstatic inline double simplexNoise2(double x, double y)\n{\n\treturn SimplexNoise1234::noise(x, y) * 0.5 + 0.5;\n}\n\nstatic inline double simplexNoise3(double x, double y, double z)\n{\n\treturn SimplexNoise1234::noise(x, y, z) * 0.5 + 0.5;\n}\n\nstatic inline double simplexNoise4(double x, double y, double z, double w)\n{\n\treturn SimplexNoise1234::noise(x, y, z, w) * 0.5 + 0.5;\n}\n\nstatic inline double perlinNoise1(double x)\n{\n\treturn Noise1234::noise(x) * 0.5 + 0.5;\n}\n\nstatic inline double perlinNoise2(double x, double y)\n{\n\treturn Noise1234::noise(x, y) * 0.5 + 0.5;\n}\n\nstatic inline double perlinNoise3(double x, double y, double z)\n{\n\treturn Noise1234::noise(x, y, z) * 0.5 + 0.5;\n}\n\nstatic inline double perlinNoise4(double x, double y, double z, double w)\n{\n\treturn Noise1234::noise(x, y, z, w) * 0.5 + 0.5;\n}\n\n} // math\n} // love\n\n#endif\n"
  },
  {
    "path": "src/modules/math/RandomGenerator.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"RandomGenerator.h\"\n\n// C++\n#include <sstream>\n#include <iomanip>\n\n// C\n#include <cmath>\n#include <cstdlib>\n\nnamespace love\n{\nnamespace math\n{\n\n// Thomas Wang's 64-bit integer hashing function:\n// https://web.archive.org/web/20110807030012/http://www.cris.com/%7ETtwang/tech/inthash.htm\nstatic uint64 wangHash64(uint64 key)\n{\n\tkey = (~key) + (key << 21); // key = (key << 21) - key - 1;\n\tkey = key ^ (key >> 24);\n\tkey = (key + (key << 3)) + (key << 8); // key * 265\n\tkey = key ^ (key >> 14);\n\tkey = (key + (key << 2)) + (key << 4); // key * 21\n\tkey = key ^ (key >> 28);\n\tkey = key + (key << 31);\n\treturn key;\n}\n\nlove::Type RandomGenerator::type(\"RandomGenerator\", &Object::type);\n\n// 64 bit Xorshift implementation taken from the end of Sec. 3 (page 4) in\n// George Marsaglia, \"Xorshift RNGs\", Journal of Statistical Software, Vol.8 (Issue 14), 2003\n// Use an 'Xorshift*' variant, as shown here: http://xorshift.di.unimi.it\n\nRandomGenerator::RandomGenerator()\n\t: last_randomnormal(std::numeric_limits<double>::infinity())\n{\n\t// because it is too big for some compilers to handle ... if you know what\n\t// i mean\n\tSeed newseed;\n\tnewseed.b32.low = 0xCBBF7A44;\n\tnewseed.b32.high = 0x0139408D;\n\tsetSeed(newseed);\n}\n\nuint64 RandomGenerator::rand()\n{\n\trng_state.b64 ^= (rng_state.b64 >> 12);\n\trng_state.b64 ^= (rng_state.b64 << 25);\n\trng_state.b64 ^= (rng_state.b64 >> 27);\n\treturn rng_state.b64 * 2685821657736338717ULL;\n}\n\n// Box–Muller transform\ndouble RandomGenerator::randomNormal(double stddev)\n{\n\t// use cached number if possible\n\tif (last_randomnormal != std::numeric_limits<double>::infinity())\n\t{\n\t\tdouble r = last_randomnormal;\n\t\tlast_randomnormal = std::numeric_limits<double>::infinity();\n\t\treturn r * stddev;\n\t}\n\n\tdouble r   = sqrt(-2.0 * log(1. - random()));\n\tdouble phi = 2.0 * LOVE_M_PI * (1. - random());\n\n\tlast_randomnormal = r * cos(phi);\n\treturn r * sin(phi) * stddev;\n}\n\nvoid RandomGenerator::setSeed(RandomGenerator::Seed newseed)\n{\n\tseed = newseed;\n\n\t// Xorshift isn't designed to give a good distribution of values across many\n\t// similar seeds, so we hash the state integer before using it.\n\t// http://www.reedbeta.com/blog/2013/01/12/quick-and-easy-gpu-random-numbers-in-d3d11/\n\t// Xorshift also can't handle a state value of 0, so we avoid that.\n\tdo\n\t{\n\t\tnewseed.b64 = wangHash64(newseed.b64);\n\t} while (newseed.b64 == 0);\n\n\trng_state = newseed;\n\n\tlast_randomnormal = std::numeric_limits<double>::infinity();\n}\n\nRandomGenerator::Seed RandomGenerator::getSeed() const\n{\n\treturn seed;\n}\n\nvoid RandomGenerator::setState(const std::string &statestr)\n{\n\t// For this implementation we'll accept a hex string representing the\n\t// 64-bit state integer xorshift uses.\n\n\t// Hex string must start with 0x.\n\tif (statestr.find(\"0x\") != 0 || statestr.size() < 3)\n\t\tthrow love::Exception(\"Invalid random state: %s\", statestr.c_str());\n\n\tSeed state = {};\n\n\tchar *end = nullptr;\n\tstate.b64 = strtoull(statestr.c_str(), &end, 16);\n\n\tif (end != nullptr && *end != 0)\n\t\tthrow love::Exception(\"Invalid random state: %s\", statestr.c_str());\n\n\trng_state = state;\n\n\tlast_randomnormal = std::numeric_limits<double>::infinity();\n}\n\nstd::string RandomGenerator::getState() const\n{\n\t// For this implementation we'll return a hex string representing the 64-bit\n\t// state integer xorshift uses.\n\tstd::stringstream ss;\n\tss << \"0x\" << std::setfill('0') << std::setw(16) << std::hex << rng_state.b64;\n\n\treturn ss.str();\n}\n\n} // math\n} // love\n"
  },
  {
    "path": "src/modules/math/RandomGenerator.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_MATH_RANDOM_GENERATOR_H\n#define LOVE_MATH_RANDOM_GENERATOR_H\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/Exception.h\"\n#include \"common/math.h\"\n#include \"common/int.h\"\n#include \"common/Object.h\"\n\n// C++\n#include <limits>\n#include <string>\n\nnamespace love\n{\nnamespace math\n{\n\nclass RandomGenerator : public Object\n{\npublic:\n\n\tstatic love::Type type;\n\n\tunion Seed\n\t{\n\t\tuint64 b64;\n\t\tstruct\n\t\t{\n#ifdef LOVE_BIG_ENDIAN\n\t\t\tuint32 high;\n\t\t\tuint32 low;\n#else\n\t\t\tuint32 low;\n\t\t\tuint32 high;\n#endif\n\t\t} b32;\n\t};\n\n\tRandomGenerator();\n\tvirtual ~RandomGenerator() {}\n\n\t/**\n\t * Return uniformly distributed pseudo random integer.\n\t *\n\t * @return Pseudo random integer in [0,2^64).\n\t **/\n\tuint64 rand();\n\n\t/**\n\t * Get uniformly distributed pseudo random number in [0,1).\n\t *\n\t * @return Pseudo random number in [0,1).\n\t **/\n\tinline double random()\n\t{\n\t\tuint64 r = rand();\n\n\t\t// From http://xoroshiro.di.unimi.it\n\t\tunion { uint64 i; double d; } u;\n\t\tu.i = ((0x3FFULL) << 52) | (r >> 12);\n\n\t\treturn u.d - 1.0;\n\t}\n\n\t/**\n\t * Get uniformly distributed pseudo random number in [0,max).\n\t *\n\t * @return Pseudo random number in [0,max).\n\t **/\n\tinline double random(double max)\n\t{\n\t\treturn random() * max;\n\t}\n\n\t/**\n\t * Get uniformly distributed pseudo random number in [min, max).\n\t *\n\t * @return Pseudo random number in [min, max).\n\t **/\n\tinline double random(double min, double max)\n\t{\n\t\treturn random() * (max - min) + min;\n\t}\n\n\t/**\n\t * Get normally distributed pseudo random number.\n\t *\n\t * @param stddev Standard deviation of the distribution.\n\t * @return Normally distributed random number with mean 0 and variance (stddev)².\n\t **/\n\tdouble randomNormal(double stddev);\n\n\t/**\n\t * Set pseudo-random seed.\n\t * It's up to the implementation how to use this.\n\t **/\n\tvoid setSeed(Seed seed);\n\n\t/**\n\t * Get the previously set pseudo-random seed.\n\t **/\n\tSeed getSeed() const;\n\n\t/**\n\t * Set the internal implementation-dependent state value based on a string.\n\t **/\n\tvoid setState(const std::string &statestr);\n\n\t/**\n\t * Get a string representation of the implementation-dependent internal\n\t * state value.\n\t **/\n\tstd::string getState() const;\n\nprivate:\n\n\tSeed seed;\n\tSeed rng_state;\n\tdouble last_randomnormal;\n\n}; // RandomGenerator\n\n} // math\n} // love\n\n#endif // LOVE_MATH_RANDOM_GENERATOR_H\n"
  },
  {
    "path": "src/modules/math/Transform.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Transform.h\"\n\nnamespace love\n{\nnamespace math\n{\n\nlove::Type Transform::type(\"Transform\", &Object::type);\n\nTransform::Transform()\n\t: matrix()\n\t, inverseDirty(true)\n\t, inverseMatrix()\n{\n}\n\nTransform::Transform(const Matrix4 &m)\n\t: matrix(m)\n\t, inverseDirty(true)\n\t, inverseMatrix()\n{\n}\n\nTransform::Transform(float x, float y, float a, float sx, float sy, float ox, float oy, float kx, float ky)\n\t: matrix(x, y, a, sx, sy, ox, oy, kx, ky)\n\t, inverseDirty(true)\n\t, inverseMatrix()\n{\n}\n\nTransform::~Transform()\n{\n}\n\nTransform *Transform::clone()\n{\n\treturn new Transform(*this);\n}\n\nTransform *Transform::inverse()\n{\n\treturn new Transform(getInverseMatrix());\n}\n\nvoid Transform::apply(Transform *other)\n{\n\tmatrix *= other->getMatrix();\n\tinverseDirty = true;\n}\n\nvoid Transform::translate(float x, float y)\n{\n\tmatrix.translate(x, y);\n\tinverseDirty = true;\n}\n\nvoid Transform::rotate(float angle)\n{\n\tmatrix.rotate(angle);\n\tinverseDirty = true;\n}\n\nvoid Transform::scale(float x, float y)\n{\n\tmatrix.scale(x, y);\n\tinverseDirty = true;\n}\n\nvoid Transform::shear(float x, float y)\n{\n\tmatrix.shear(x, y);\n\tinverseDirty = true;\n}\n\nvoid Transform::reset()\n{\n\tmatrix.setIdentity();\n\tinverseDirty = true;\n}\n\nvoid Transform::setTransformation(float x, float y, float a, float sx, float sy, float ox, float oy, float kx, float ky)\n{\n\tmatrix.setTransformation(x, y, a, sx, sy, ox, oy, kx, ky);\n\tinverseDirty = true;\n}\n\nlove::Vector2 Transform::transformPoint(love::Vector2 p) const\n{\n\tlove::Vector2 result;\n\tmatrix.transformXY(&result, &p, 1);\n\treturn result;\n}\n\nlove::Vector2 Transform::inverseTransformPoint(love::Vector2 p)\n{\n\tlove::Vector2 result;\n\tgetInverseMatrix().transformXY(&result, &p, 1);\n\treturn result;\n}\n\nconst Matrix4 &Transform::getMatrix() const\n{\n\treturn matrix;\n}\n\nvoid Transform::setMatrix(const Matrix4 &m)\n{\n\tmatrix = m;\n\tinverseDirty = true;\n}\n\nbool Transform::getConstant(const char *in, MatrixLayout &out)\n{\n\treturn matrixLayouts.find(in, out);\n}\n\nbool Transform::getConstant(MatrixLayout in, const char *&out)\n{\n\treturn matrixLayouts.find(in, out);\n}\n\nstd::vector<std::string> Transform::getConstants(MatrixLayout)\n{\n\treturn matrixLayouts.getNames();\n}\n\nStringMap<Transform::MatrixLayout, Transform::MATRIX_MAX_ENUM>::Entry Transform::matrixLayoutEntries[] =\n{\n\t{ \"row\",    MATRIX_ROW_MAJOR    },\n\t{ \"column\", MATRIX_COLUMN_MAJOR },\n};\n\nStringMap<Transform::MatrixLayout, Transform::MATRIX_MAX_ENUM> Transform::matrixLayouts(Transform::matrixLayoutEntries, sizeof(Transform::matrixLayoutEntries));\n\n} // math\n} // love\n"
  },
  {
    "path": "src/modules/math/Transform.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/Object.h\"\n#include \"common/Matrix.h\"\n#include \"common/Vector.h\"\n#include \"common/StringMap.h\"\n\nnamespace love\n{\nnamespace math\n{\n\nclass Transform : public Object\n{\npublic:\n\n\tenum MatrixLayout\n\t{\n\t\tMATRIX_ROW_MAJOR,\n\t\tMATRIX_COLUMN_MAJOR,\n\t\tMATRIX_MAX_ENUM\n\t};\n\n\tstatic love::Type type;\n\n\tTransform();\n\tTransform(const Matrix4 &m);\n\tTransform(float x, float y, float a, float sx, float sy, float ox, float oy, float kx, float ky);\n\n\tvirtual ~Transform();\n\n\tTransform *clone();\n\tTransform *inverse();\n\n\tvoid apply(Transform *other);\n\n\tvoid translate(float x, float y);\n\tvoid rotate(float angle);\n\tvoid scale(float x, float y);\n\tvoid shear(float x, float y);\n\n\tvoid reset();\n\tvoid setTransformation(float x, float y, float a, float sx, float sy, float ox, float oy, float kx, float ky);\n\n\tlove::Vector2 transformPoint(love::Vector2 p) const;\n\tlove::Vector2 inverseTransformPoint(love::Vector2 p);\n\n\tconst Matrix4 &getMatrix() const;\n\tvoid setMatrix(const Matrix4 &m);\n\n\tstatic bool getConstant(const char *in, MatrixLayout &out);\n\tstatic bool getConstant(MatrixLayout in, const char *&out);\n\tstatic std::vector<std::string> getConstants(MatrixLayout);\n\nprivate:\n\n\tinline const Matrix4 &getInverseMatrix()\n\t{\n\t\tif (inverseDirty)\n\t\t{\n\t\t\tinverseDirty = false;\n\t\t\tinverseMatrix = matrix.inverse();\n\t\t}\n\n\t\treturn inverseMatrix;\n\t}\n\t\n\tMatrix4 matrix;\n\tbool inverseDirty;\n\tMatrix4 inverseMatrix;\n\n\tstatic StringMap<MatrixLayout, MATRIX_MAX_ENUM>::Entry matrixLayoutEntries[];\n\tstatic StringMap<MatrixLayout, MATRIX_MAX_ENUM> matrixLayouts;\n\n}; // Transform\n\n\n} // math\n} // love\n"
  },
  {
    "path": "src/modules/math/wrap_BezierCurve.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"common/Exception.h\"\n#include \"wrap_BezierCurve.h\"\n\n#include <cmath>\n\nnamespace love\n{\nnamespace math\n{\n\nBezierCurve *luax_checkbeziercurve(lua_State *L, int idx)\n{\n\treturn luax_checktype<BezierCurve>(L, idx);\n}\n\nint w_BezierCurve_getDegree(lua_State *L)\n{\n\tBezierCurve *curve = luax_checkbeziercurve(L, 1);\n\tlua_pushnumber(L, curve->getDegree());\n\treturn 1;\n}\n\nint w_BezierCurve_getDerivative(lua_State *L)\n{\n\tBezierCurve *curve = luax_checkbeziercurve(L, 1);\n\tBezierCurve *deriv = new BezierCurve(curve->getDerivative());\n\tluax_pushtype(L, deriv);\n\tderiv->release();\n\treturn 1;\n}\n\nint w_BezierCurve_getControlPoint(lua_State *L)\n{\n\tBezierCurve *curve = luax_checkbeziercurve(L, 1);\n\tint idx = (int) luaL_checkinteger(L, 2);\n\n\tif (idx > 0) // 1-indexing\n\t\tidx--;\n\n\tluax_catchexcept(L, [&]() {\n\t\tVector2 v = curve->getControlPoint(idx);\n\t\tlua_pushnumber(L, v.x);\n\t\tlua_pushnumber(L, v.y);\n\t});\n\n\treturn 2;\n}\n\nint w_BezierCurve_setControlPoint(lua_State *L)\n{\n\tBezierCurve *curve = luax_checkbeziercurve(L, 1);\n\tint idx = (int) luaL_checkinteger(L, 2);\n\tfloat vx = (float) luaL_checknumber(L, 3);\n\tfloat vy = (float) luaL_checknumber(L, 4);\n\n\tif (idx > 0) // 1-indexing\n\t\tidx--;\n\n\tluax_catchexcept(L, [&](){ curve->setControlPoint(idx, Vector2(vx,vy)); });\n\treturn 0;\n}\n\nint w_BezierCurve_insertControlPoint(lua_State *L)\n{\n\tBezierCurve *curve = luax_checkbeziercurve(L, 1);\n\tfloat vx = (float) luaL_checknumber(L, 2);\n\tfloat vy = (float) luaL_checknumber(L, 3);\n\tint idx = (int) luaL_optinteger(L, 4, -1);\n\n\tif (idx > 0) // 1-indexing\n\t\tidx--;\n\n\tluax_catchexcept(L, [&](){ curve->insertControlPoint(Vector2(vx,vy), idx); });\n\treturn 0;\n}\n\nint w_BezierCurve_removeControlPoint(lua_State *L)\n{\n\tBezierCurve *curve = luax_checkbeziercurve(L, 1);\n\tint idx = (int) luaL_checkinteger(L, 2);\n\n\tif (idx > 0) // 1-indexing\n\t\tidx--;\n\n\tluax_catchexcept(L, [&](){ curve->removeControlPoint(idx); });\n\treturn 0;\n}\n\nint w_BezierCurve_getControlPointCount(lua_State *L)\n{\n\tBezierCurve *curve = luax_checkbeziercurve(L, 1);\n\tlua_pushinteger(L, curve->getControlPointCount());\n\treturn 1;\n}\n\nint w_BezierCurve_translate(lua_State *L)\n{\n\tBezierCurve *curve = luax_checkbeziercurve(L, 1);\n\tfloat dx = (float) luaL_checknumber(L, 2);\n\tfloat dy = (float) luaL_checknumber(L, 3);\n\tcurve->translate(Vector2(dx,dy));\n\treturn 0;\n}\n\nint w_BezierCurve_rotate(lua_State *L)\n{\n\tBezierCurve *curve = luax_checkbeziercurve(L, 1);\n\tdouble phi = luaL_checknumber(L, 2);\n\tfloat ox = (float) luaL_optnumber(L, 3, 0);\n\tfloat oy = (float) luaL_optnumber(L, 4, 0);\n\tcurve->rotate(phi, Vector2(ox,oy));\n\treturn 0;\n}\n\nint w_BezierCurve_scale(lua_State *L)\n{\n\tBezierCurve *curve = luax_checkbeziercurve(L, 1);\n\tdouble s = luaL_checknumber(L, 2);\n\tfloat ox = (float) luaL_optnumber(L, 3, 0);\n\tfloat oy = (float) luaL_optnumber(L, 4, 0);\n\tcurve->scale(s, Vector2(ox,oy));\n\treturn 0;\n}\n\nint w_BezierCurve_evaluate(lua_State *L)\n{\n\tBezierCurve *curve = luax_checkbeziercurve(L, 1);\n\tdouble t = luaL_checknumber(L, 2);\n\n\tluax_catchexcept(L, [&]() {\n\t\tVector2 v = curve->evaluate(t);\n\t\tlua_pushnumber(L, v.x);\n\t\tlua_pushnumber(L, v.y);\n\t});\n\n\treturn 2;\n\n}\n\nint w_BezierCurve_getSegment(lua_State *L)\n{\n\tBezierCurve *curve = luax_checkbeziercurve(L, 1);\n\tdouble t1 = luaL_checknumber(L, 2);\n\tdouble t2 = luaL_checknumber(L, 3);\n\n\tBezierCurve *segment;\n\tluax_catchexcept(L, [&](){ segment = curve->getSegment(t1, t2); });\n\tluax_pushtype(L, segment);\n\tsegment->release();\n\n\treturn 1;\n}\n\nint w_BezierCurve_render(lua_State *L)\n{\n\tBezierCurve *curve = luax_checkbeziercurve(L, 1);\n\tint accuracy = (int) luaL_optinteger(L, 2, 5);\n\n\tstd::vector<Vector2> points;\n\tluax_catchexcept(L, [&](){ points = curve->render(accuracy); });\n\n\tlua_createtable(L, (int) points.size() * 2, 0);\n\tfor (int i = 0; i < (int) points.size(); ++i)\n\t{\n\t\tlua_pushnumber(L, points[i].x);\n\t\tlua_rawseti(L, -2, 2*i+1);\n\t\tlua_pushnumber(L, points[i].y);\n\t\tlua_rawseti(L, -2, 2*i+2);\n\t}\n\n\treturn 1;\n}\n\nint w_BezierCurve_renderSegment(lua_State *L)\n{\n\tBezierCurve *curve = luax_checkbeziercurve(L, 1);\n\tdouble start = luaL_checknumber(L, 2);\n\tdouble end = luaL_checknumber(L, 3);\n\tint accuracy = (int) luaL_optinteger(L, 4, 5);\n\n\tstd::vector<Vector2> points;\n\tluax_catchexcept(L, [&](){ points = curve->renderSegment(start, end, accuracy); });\n\n\tlua_createtable(L, (int) points.size() * 2, 0);\n\tfor (int i = 0; i < (int) points.size(); ++i)\n\t{\n\t\tlua_pushnumber(L, points[i].x);\n\t\tlua_rawseti(L, -2, 2*i+1);\n\t\tlua_pushnumber(L, points[i].y);\n\t\tlua_rawseti(L, -2, 2*i+2);\n\t}\n\n\treturn 1;\n}\n\nstatic const luaL_Reg w_BezierCurve_functions[] =\n{\n\t{\"getDegree\", w_BezierCurve_getDegree},\n\t{\"getDerivative\", w_BezierCurve_getDerivative},\n\t{\"getControlPoint\", w_BezierCurve_getControlPoint},\n\t{\"setControlPoint\", w_BezierCurve_setControlPoint},\n\t{\"insertControlPoint\", w_BezierCurve_insertControlPoint},\n\t{\"removeControlPoint\", w_BezierCurve_removeControlPoint},\n\t{\"getControlPointCount\", w_BezierCurve_getControlPointCount},\n\t{\"translate\", w_BezierCurve_translate},\n\t{\"rotate\", w_BezierCurve_rotate},\n\t{\"scale\", w_BezierCurve_scale},\n\t{\"evaluate\", w_BezierCurve_evaluate},\n\t{\"getSegment\", w_BezierCurve_getSegment},\n\t{\"render\", w_BezierCurve_render},\n\t{\"renderSegment\", w_BezierCurve_renderSegment},\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_beziercurve(lua_State *L)\n{\n\treturn luax_register_type(L, &BezierCurve::type, w_BezierCurve_functions, nullptr);\n}\n\n} // math\n} // love\n"
  },
  {
    "path": "src/modules/math/wrap_BezierCurve.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_MATH_WRAP_BEZIER_CURVE_H\n#define LOVE_MATH_WRAP_BEZIER_CURVE_H\n\n// LOVE\n#include \"BezierCurve.h\"\n#include \"common/runtime.h\"\n\nnamespace love\n{\nnamespace math\n{\n\nBezierCurve *luax_checkbeziercurve(lua_State *L, int idx);\nextern \"C\" int luaopen_beziercurve(lua_State *L);\n\n} // math\n} // love\n\n#endif // LOVE_MATH_WRAP_RANDOM_GENERATOR_H\n"
  },
  {
    "path": "src/modules/math/wrap_Math.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_Math.h\"\n#include \"wrap_RandomGenerator.h\"\n#include \"wrap_BezierCurve.h\"\n#include \"wrap_Transform.h\"\n#include \"MathModule.h\"\n#include \"BezierCurve.h\"\n#include \"Transform.h\"\n\n#include <cmath>\n#include <iostream>\n#include <algorithm>\n\n// Put the Lua code directly into a raw string literal.\nstatic const char math_lua[] =\n#include \"wrap_Math.lua\"\n;\n\nnamespace love\n{\nnamespace math\n{\n\n#define instance() (Module::getInstance<Math>(Module::M_MATH))\n\nint w__getRandomGenerator(lua_State *L)\n{\n\tRandomGenerator *t = instance()->getRandomGenerator();\n\tluax_pushtype(L, t);\n\treturn 1;\n}\n\nint w_newRandomGenerator(lua_State *L)\n{\n\tRandomGenerator::Seed s;\n\tif (lua_gettop(L) > 0)\n\t\ts = luax_checkrandomseed(L, 1);\n\n\tRandomGenerator *t = instance()->newRandomGenerator();\n\n\tif (lua_gettop(L) > 0)\n\t{\n\t\tbool should_error = false;\n\n\t\ttry\n\t\t{\n\t\t\tt->setSeed(s);\n\t\t}\n\t\tcatch (love::Exception &e)\n\t\t{\n\t\t\tt->release();\n\t\t\tshould_error = true;\n\t\t\tlua_pushstring(L, e.what());\n\t\t}\n\n\t\tif (should_error)\n\t\t\treturn luaL_error(L, \"%s\", lua_tostring(L, -1));\n\t}\n\n\tluax_pushtype(L, t);\n\tt->release();\n\treturn 1;\n}\n\nint w_newBezierCurve(lua_State *L)\n{\n\tstd::vector<Vector2> points;\n\tif (lua_istable(L, 1))\n\t{\n\t\tint top = (int) luax_objlen(L, 1);\n\t\tpoints.reserve(top / 2);\n\t\tfor (int i = 1; i <= top; i += 2)\n\t\t{\n\t\t\tlua_rawgeti(L, 1, i);\n\t\t\tlua_rawgeti(L, 1, i+1);\n\n\t\t\tVector2 v;\n\t\t\tv.x = (float) luaL_checknumber(L, -2);\n\t\t\tv.y = (float) luaL_checknumber(L, -1);\n\t\t\tpoints.push_back(v);\n\n\t\t\tlua_pop(L, 2);\n\t\t}\n\t}\n\telse\n\t{\n\t\tint top = (int) lua_gettop(L);\n\t\tpoints.reserve(top / 2);\n\t\tfor (int i = 1; i <= top; i += 2)\n\t\t{\n\t\t\tVector2 v;\n\t\t\tv.x = (float) luaL_checknumber(L, i);\n\t\t\tv.y = (float) luaL_checknumber(L, i+1);\n\t\t\tpoints.push_back(v);\n\t\t}\n\t}\n\n\tBezierCurve *curve = instance()->newBezierCurve(points);\n\tluax_pushtype(L, curve);\n\tcurve->release();\n\treturn 1;\n}\n\nint w_newTransform(lua_State *L)\n{\n\tTransform *t = nullptr;\n\n\tif (lua_isnoneornil(L, 1))\n\t\tt = instance()->newTransform();\n\telse\n\t{\n\t\tfloat x =  (float) luaL_checknumber(L, 1);\n\t\tfloat y =  (float) luaL_checknumber(L, 2);\n\t\tfloat a =  (float) luaL_optnumber(L, 3, 0.0);\n\t\tfloat sx = (float) luaL_optnumber(L, 4, 1.0);\n\t\tfloat sy = (float) luaL_optnumber(L, 5, sx);\n\t\tfloat ox = (float) luaL_optnumber(L, 6, 0.0);\n\t\tfloat oy = (float) luaL_optnumber(L, 7, 0.0);\n\t\tfloat kx = (float) luaL_optnumber(L, 8, 0.0);\n\t\tfloat ky = (float) luaL_optnumber(L, 9, 0.0);\n\t\tt = instance()->newTransform(x, y, a, sx, sy, ox, oy, kx, ky);\n\t}\n\n\tluax_pushtype(L, t);\n\tt->release();\n\treturn 1;\n}\n\nint w_triangulate(lua_State *L)\n{\n\tstd::vector<love::Vector2> vertices;\n\tif (lua_istable(L, 1))\n\t{\n\t\tint top = (int) luax_objlen(L, 1);\n\t\tvertices.reserve(top / 2);\n\t\tfor (int i = 1; i <= top; i += 2)\n\t\t{\n\t\t\tlua_rawgeti(L, 1, i);\n\t\t\tlua_rawgeti(L, 1, i+1);\n\n\t\t\tVector2 v;\n\t\t\tv.x = (float) luaL_checknumber(L, -2);\n\t\t\tv.y = (float) luaL_checknumber(L, -1);\n\t\t\tvertices.push_back(v);\n\n\t\t\tlua_pop(L, 2);\n\t\t}\n\t}\n\telse\n\t{\n\t\tint top = (int) lua_gettop(L);\n\t\tvertices.reserve(top / 2);\n\t\tfor (int i = 1; i <= top; i += 2)\n\t\t{\n\t\t\tVector2 v;\n\t\t\tv.x = (float) luaL_checknumber(L, i);\n\t\t\tv.y = (float) luaL_checknumber(L, i+1);\n\t\t\tvertices.push_back(v);\n\t\t}\n\t}\n\n\tif (vertices.size() < 3)\n\t\treturn luaL_error(L, \"Need at least 3 vertices to triangulate (got %d).\", (int)vertices.size());\n\n\tstd::vector<Triangle> triangles;\n\n\tluax_catchexcept(L, [&]() {\n\t\tif (vertices.size() == 3)\n\t\t\ttriangles.push_back(Triangle(vertices[0], vertices[1], vertices[2]));\n\t\telse\n\t\t\ttriangles = triangulate(vertices);\n\t});\n\n\tlua_createtable(L, (int) triangles.size(), 0);\n\tfor (int i = 0; i < (int) triangles.size(); ++i)\n\t{\n\t\tconst Triangle &tri = triangles[i];\n\n\t\tlua_createtable(L, 6, 0);\n\t\tlua_pushnumber(L, tri.a.x);\n\t\tlua_rawseti(L, -2, 1);\n\t\tlua_pushnumber(L, tri.a.y);\n\t\tlua_rawseti(L, -2, 2);\n\t\tlua_pushnumber(L, tri.b.x);\n\t\tlua_rawseti(L, -2, 3);\n\t\tlua_pushnumber(L, tri.b.y);\n\t\tlua_rawseti(L, -2, 4);\n\t\tlua_pushnumber(L, tri.c.x);\n\t\tlua_rawseti(L, -2, 5);\n\t\tlua_pushnumber(L, tri.c.y);\n\t\tlua_rawseti(L, -2, 6);\n\n\t\tlua_rawseti(L, -2, i+1);\n\t}\n\n\treturn 1;\n}\n\nint w_isConvex(lua_State *L)\n{\n\tstd::vector<love::Vector2> vertices;\n\tif (lua_istable(L, 1))\n\t{\n\t\tint top = (int) luax_objlen(L, 1);\n\t\tvertices.reserve(top / 2);\n\t\tfor (int i = 1; i <= top; i += 2)\n\t\t{\n\t\t\tlua_rawgeti(L, 1, i);\n\t\t\tlua_rawgeti(L, 1, i+1);\n\n\t\t\tlove::Vector2 v;\n\t\t\tv.x = (float) luaL_checknumber(L, -2);\n\t\t\tv.y = (float) luaL_checknumber(L, -1);\n\t\t\tvertices.push_back(v);\n\n\t\t\tlua_pop(L, 2);\n\t\t}\n\t}\n\telse\n\t{\n\t\tint top = lua_gettop(L);\n\t\tvertices.reserve(top / 2);\n\t\tfor (int i = 1; i <= top; i += 2)\n\t\t{\n\t\t\tlove::Vector2 v;\n\t\t\tv.x = (float) luaL_checknumber(L, i);\n\t\t\tv.y = (float) luaL_checknumber(L, i+1);\n\t\t\tvertices.push_back(v);\n\t\t}\n\t}\n\n\tluax_pushboolean(L, isConvex(vertices));\n\treturn 1;\n}\n\nstatic int getGammaArgs(lua_State *L, float color[4])\n{\n\tint numcomponents = 0;\n\n\tif (lua_istable(L, 1))\n\t{\n\t\tint n = (int) luax_objlen(L, 1);\n\t\tfor (int i = 1; i <= n && i <= 4; i++)\n\t\t{\n\t\t\tlua_rawgeti(L, 1, i);\n\t\t\tcolor[i - 1] = (float) luax_checknumberclamped01(L, -1);\n\t\t\tnumcomponents++;\n\t\t}\n\n\t\tlua_pop(L, numcomponents);\n\t}\n\telse\n\t{\n\t\tint n = lua_gettop(L);\n\t\tfor (int i = 1; i <= n && i <= 4; i++)\n\t\t{\n\t\t\tcolor[i - 1] = (float) luax_checknumberclamped01(L, i);\n\t\t\tnumcomponents++;\n\t\t}\n\t}\n\n\tif (numcomponents == 0)\n\t\tluaL_checknumber(L, 1);\n\n\treturn numcomponents;\n}\n\nint w_gammaToLinear(lua_State *L)\n{\n\tfloat color[4];\n\tint numcomponents = getGammaArgs(L, color);\n\n\tfor (int i = 0; i < numcomponents; i++)\n\t{\n\t\t// Alpha should always be linear.\n\t\tif (i < 3)\n\t\t\tcolor[i] = gammaToLinear(color[i]);\n\t\tlua_pushnumber(L, color[i]);\n\t}\n\n\treturn numcomponents;\n}\n\nint w_linearToGamma(lua_State *L)\n{\n\tfloat color[4];\n\tint numcomponents = getGammaArgs(L, color);\n\n\tfor (int i = 0; i < numcomponents; i++)\n\t{\n\t\t// Alpha should always be linear.\n\t\tif (i < 3)\n\t\t\tcolor[i] = linearToGamma(color[i]);\n\t\tlua_pushnumber(L, color[i]);\n\t}\n\n\treturn numcomponents;\n}\n\nint w_noise(lua_State *L)\n{\n\tluax_markdeprecated(L, 1, \"love.math.noise\", API_FUNCTION, DEPRECATED_REPLACED, \"love.math.perlinNoise or love.math.simplexNoise\");\n\n\tint nargs = std::min(std::max(lua_gettop(L), 1), 4);\n\tdouble args[4];\n\n\tfor (int i = 0; i < nargs; i++)\n\t\targs[i] = luaL_checknumber(L, i + 1);\n\n\tdouble val = 0.0;\n\n\tswitch (nargs)\n\t{\n\tcase 1:\n\t\tval = simplexNoise1(args[0]);\n\t\tbreak;\n\tcase 2:\n\t\tval = simplexNoise2(args[0], args[1]);\n\t\tbreak;\n\tcase 3:\n\t\tval = perlinNoise3(args[0], args[1], args[2]);\n\t\tbreak;\n\tcase 4:\n\t\tval = perlinNoise4(args[0], args[1], args[2], args[3]);\n\t\tbreak;\n\t}\n\n\tlua_pushnumber(L, (lua_Number) val);\n\treturn 1;\n}\n\nint w_perlinNoise(lua_State* L)\n{\n\tint nargs = std::min(std::max(lua_gettop(L), 1), 4);\n\tdouble args[4];\n\n\tfor (int i = 0; i < nargs; i++)\n\t\targs[i] = luaL_checknumber(L, i + 1);\n\n\tdouble val = 0.0;\n\n\tswitch (nargs)\n\t{\n\tcase 1:\n\t\tval = perlinNoise1(args[0]);\n\t\tbreak;\n\tcase 2:\n\t\tval = perlinNoise2(args[0], args[1]);\n\t\tbreak;\n\tcase 3:\n\t\tval = perlinNoise3(args[0], args[1], args[2]);\n\t\tbreak;\n\tcase 4:\n\t\tval = perlinNoise4(args[0], args[1], args[2], args[3]);\n\t\tbreak;\n\t}\n\n\tlua_pushnumber(L, (lua_Number) val);\n\treturn 1;\n}\n\nint w_simplexNoise(lua_State* L)\n{\n\tint nargs = std::min(std::max(lua_gettop(L), 1), 4);\n\tdouble args[4];\n\n\tfor (int i = 0; i < nargs; i++)\n\t\targs[i] = luaL_checknumber(L, i + 1);\n\n\tdouble val = 0.0;\n\n\tswitch (nargs)\n\t{\n\tcase 1:\n\t\tval = simplexNoise1(args[0]);\n\t\tbreak;\n\tcase 2:\n\t\tval = simplexNoise2(args[0], args[1]);\n\t\tbreak;\n\tcase 3:\n\t\tval = simplexNoise3(args[0], args[1], args[2]);\n\t\tbreak;\n\tcase 4:\n\t\tval = simplexNoise4(args[0], args[1], args[2], args[3]);\n\t\tbreak;\n\t}\n\n\tlua_pushnumber(L, (lua_Number) val);\n\treturn 1;\n}\n\n// C functions in a struct, necessary for the FFI versions of math functions.\nstruct FFI_Math\n{\n\tdouble (*snoise1)(double x);\n\tdouble (*snoise2)(double x, double y);\n\tdouble (*snoise3)(double x, double y, double z);\n\tdouble (*snoise4)(double x, double y, double z, double w);\n\tdouble (*pnoise1)(double x);\n\tdouble (*pnoise2)(double x, double y);\n\tdouble (*pnoise3)(double x, double y, double z);\n\tdouble (*pnoise4)(double x, double y, double z, double w);\n\n\tfloat (*gammaToLinear)(float c);\n\tfloat (*linearToGamma)(float c);\n};\n\nstatic FFI_Math ffifuncs =\n{\n\tsimplexNoise1,\n\tsimplexNoise2,\n\tsimplexNoise3,\n\tsimplexNoise4,\n\n\tperlinNoise1,\n\tperlinNoise2,\n\tperlinNoise3,\n\tperlinNoise4,\n\n\tgammaToLinear,\n\tlinearToGamma,\n};\n\n// List of functions to wrap.\nstatic const luaL_Reg functions[] =\n{\n\t// love.math.random etc. are defined in wrap_Math.lua.\n\n\t{ \"_getRandomGenerator\", w__getRandomGenerator },\n\t{ \"newRandomGenerator\", w_newRandomGenerator },\n\t{ \"newBezierCurve\", w_newBezierCurve },\n\t{ \"newTransform\", w_newTransform },\n\t{ \"triangulate\", w_triangulate },\n\t{ \"isConvex\", w_isConvex },\n\t{ \"gammaToLinear\", w_gammaToLinear },\n\t{ \"linearToGamma\", w_linearToGamma },\n\t{ \"noise\", w_noise },\n\t{ \"perlinNoise\", w_perlinNoise },\n\t{ \"simplexNoise\", w_simplexNoise },\n\n\t{ 0, 0 }\n};\n\nstatic const lua_CFunction types[] =\n{\n\tluaopen_randomgenerator,\n\tluaopen_beziercurve,\n\tluaopen_transform,\n\t0\n};\n\nextern \"C\" int luaopen_love_math(lua_State *L)\n{\n\tMath *instance = instance();\n\tif (instance == nullptr)\n\t{\n\t\tluax_catchexcept(L, [&](){ instance = new Math(); });\n\t}\n\telse\n\t\tinstance->retain();\n\n\tWrappedModule w;\n\tw.module = instance;\n\tw.name = \"math\";\n\tw.type = &Module::type;\n\tw.functions = functions;\n\tw.types = types;\n\n\tint n = luax_register_module(L, w);\n\n\t// Execute wrap_Math.lua, sending the math table and ffifuncs pointer as args.\n\tluaL_loadbuffer(L, math_lua, sizeof(math_lua), \"=[love \\\"wrap_Math.lua\\\"]\");\n\tlua_pushvalue(L, -2);\n\tluax_pushpointerasstring(L, &ffifuncs);\n\tlua_call(L, 2, 0);\n\n\treturn n;\n}\n\n} // math\n} // love\n"
  },
  {
    "path": "src/modules/math/wrap_Math.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_MATH_WRAP_MATH_H\n#define LOVE_MATH_WRAP_MATH_H\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/runtime.h\"\n\nnamespace love\n{\nnamespace math\n{\n\nextern \"C\" LOVE_EXPORT int luaopen_love_math(lua_State *L);\n\n} // random\n} // love\n\n#endif // LOVE_MATH_WRAP_MATH_H\n\n"
  },
  {
    "path": "src/modules/math/wrap_Math.lua",
    "content": "R\"luastring\"--(\n-- DO NOT REMOVE THE ABOVE LINE. It is used to load this file as a C++ string.\n-- There is a matching delimiter at the bottom of the file.\n\n--[[\nCopyright (c) 2006-2024 LOVE Development Team\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\nclaim that you wrote the original software. If you use this software\nin a product, an acknowledgment in the product documentation would be\nappreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be\nmisrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n--]]\n\nlocal love_math, ffifuncspointer_str = ...\n\nlocal type, tonumber, error = type, tonumber, error\nlocal floor = math.floor\nlocal min, max = math.min, math.max\n\nlocal function clamp01(x)\n\treturn min(max(x, 0), 1)\nend\n\nlocal rng = love_math._getRandomGenerator()\n\nfunction love_math.random(l, u)\n\treturn rng:random(l, u)\nend\n\nfunction love_math.randomNormal(stddev, mean)\n\treturn rng:randomNormal(stddev, mean)\nend\n\nfunction love_math.setRandomSeed(low, high)\n\treturn rng:setSeed(low, high)\nend\n\nfunction love_math.getRandomSeed()\n\treturn rng:getSeed()\nend\n\nfunction love_math.setRandomState(state)\n\treturn rng:setState(state)\nend\n\nfunction love_math.getRandomState()\n\treturn rng:getState()\nend\n\nfunction love_math.colorToBytes(r, g, b, a)\n\tif type(r) == \"table\" then\n\t\tr, g, b, a = r[1], r[2], r[3], r[4]\n\tend\n\tr = floor(clamp01(r) * 255 + 0.5)\n\tg = floor(clamp01(g) * 255 + 0.5)\n\tb = floor(clamp01(b) * 255 + 0.5)\n\ta = a ~= nil and floor(clamp01(a) * 255 + 0.5) or nil\n\treturn r, g, b, a\nend\n\nfunction love_math.colorFromBytes(r, g, b, a)\n\tif type(r) == \"table\" then\n\t\tr, g, b, a = r[1], r[2], r[3], r[4]\n\tend\n\tr = clamp01(floor(r + 0.5) / 255)\n\tg = clamp01(floor(g + 0.5) / 255)\n\tb = clamp01(floor(b + 0.5) / 255)\n\ta = a ~= nil and clamp01(floor(a + 0.5) / 255) or nil\n\treturn r, g, b, a\nend\n\nif type(jit) ~= \"table\" or not jit.status() then\n\t-- LuaJIT's FFI is *much* slower than LOVE's regular methods when the JIT\n\t-- compiler is disabled.\n\treturn\nend\n\nlocal status, ffi = pcall(require, \"ffi\")\nif not status then return end\n\n-- Matches the struct declaration in wrap_Math.cpp.\npcall(ffi.cdef, [[\ntypedef struct FFI_Math\n{\n\tdouble (*snoise1)(double x);\n\tdouble (*snoise2)(double x, double y);\n\tdouble (*snoise3)(double x, double y, double z);\n\tdouble (*snoise4)(double x, double y, double z, double w);\n\tdouble (*pnoise1)(double x);\n\tdouble (*pnoise2)(double x, double y);\n\tdouble (*pnoise3)(double x, double y, double z);\n\tdouble (*pnoise4)(double x, double y, double z, double w);\n\n\tfloat (*gammaToLinear)(float c);\n\tfloat (*linearToGamma)(float c);\n} FFI_Math;\n]])\n\nlocal ffifuncs = ffi.cast(\"FFI_Math **\", ffifuncspointer_str)[0]\nlocal love = require(\"love\")\n\n-- Overwrite some regular love.math functions with FFI implementations.\n\nfunction love_math.noise(x, y, z, w)\n\tlove.markDeprecated(2, \"love.math.noise\", \"function\", \"replaced\", \"love.math.perlinNoise or love.math.simplexNoise\")\n\n\tif w ~= nil then\n\t\treturn tonumber(ffifuncs.pnoise4(x, y, z, w))\n\telseif z ~= nil then\n\t\treturn tonumber(ffifuncs.pnoise3(x, y, z))\n\telseif y ~= nil then\n\t\treturn tonumber(ffifuncs.snoise2(x, y))\n\telse\n\t\treturn tonumber(ffifuncs.snoise1(x))\n\tend\nend\n\nfunction love_math.perlinNoise(x, y, z, w)\n\tif w ~= nil then\n\t\treturn tonumber(ffifuncs.pnoise4(x, y, z, w))\n\telseif z ~= nil then\n\t\treturn tonumber(ffifuncs.pnoise3(x, y, z))\n\telseif y ~= nil then\n\t\treturn tonumber(ffifuncs.pnoise2(x, y))\n\telse\n\t\treturn tonumber(ffifuncs.pnoise1(x))\n\tend\nend\n\nfunction love_math.simplexNoise(x, y, z, w)\n\tif w ~= nil then\n\t\treturn tonumber(ffifuncs.snoise4(x, y, z, w))\n\telseif z ~= nil then\n\t\treturn tonumber(ffifuncs.snoise3(x, y, z))\n\telseif y ~= nil then\n\t\treturn tonumber(ffifuncs.snoise2(x, y))\n\telse\n\t\treturn tonumber(ffifuncs.snoise1(x))\n\tend\nend\n\nlocal function gammaToLinear(c)\n\tif c ~= nil then\n\t\treturn tonumber(ffifuncs.gammaToLinear(clamp01(c)))\n\tend\n\treturn c\nend\n\nfunction love_math.gammaToLinear(r, g, b, a)\n\tif type(r) == \"table\" then\n\t\tlocal t = r\n\t\treturn gammaToLinear(t[1]), gammaToLinear(t[2]), gammaToLinear(t[3]), t[4]\n\tend\n\treturn gammaToLinear(r), gammaToLinear(g), gammaToLinear(b), a\nend\n\nlocal function linearToGamma(c)\n\tif c ~= nil then\n\t\treturn tonumber(ffifuncs.linearToGamma(clamp01(c)))\n\tend\n\treturn c\nend\n\nfunction love_math.linearToGamma(r, g, b, a)\n\tif type(r) == \"table\" then\n\t\tlocal t = r\n\t\treturn linearToGamma(t[1]), linearToGamma(t[2]), linearToGamma(t[3]), t[4]\n\tend\n\treturn linearToGamma(r), linearToGamma(g), linearToGamma(b), a\nend\n\n-- DO NOT REMOVE THE NEXT LINE. It is used to load this file as a C++ string.\n--)luastring\"--\"\n"
  },
  {
    "path": "src/modules/math/wrap_RandomGenerator.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_RandomGenerator.h\"\n\n#include <cmath>\n#include <algorithm>\n\n// Put the Lua code directly into a raw string literal.\nstatic const char randomgenerator_lua[] =\n#include \"wrap_RandomGenerator.lua\"\n;\n\nnamespace love\n{\nnamespace math\n{\n\ntemplate <typename T>\nstatic T checkrandomseed_part(lua_State *L, int idx)\n{\n\tdouble num = luaL_checknumber(L, idx);\n\tdouble inf = std::numeric_limits<double>::infinity();\n\n\t// Disallow conversions from infinity and NaN.\n\tif (num == inf || num == -inf || num != num)\n\t\tluaL_argerror(L, idx, \"invalid random seed\");\n\n\treturn (T) num;\n}\n\nRandomGenerator::Seed luax_checkrandomseed(lua_State *L, int idx)\n{\n\tRandomGenerator::Seed s;\n\n\tif (!lua_isnoneornil(L, idx + 1))\n\t{\n\t\ts.b32.low = checkrandomseed_part<uint32>(L, idx);\n\t\ts.b32.high = checkrandomseed_part<uint32>(L, idx + 1);\n\t}\n\telse\n\t\ts.b64 = checkrandomseed_part<uint64>(L, idx);\n\n\treturn s;\n}\n\nRandomGenerator *luax_checkrandomgenerator(lua_State *L, int idx)\n{\n\treturn luax_checktype<RandomGenerator>(L, idx);\n}\n\nint w_RandomGenerator__random(lua_State *L)\n{\n\tRandomGenerator *rng = luax_checkrandomgenerator(L, 1);\n\tlua_pushnumber(L, rng->random());\n\treturn 1;\n}\n\nint w_RandomGenerator_randomNormal(lua_State *L)\n{\n\tRandomGenerator *rng = luax_checkrandomgenerator(L, 1);\n\n\tdouble stddev = luaL_optnumber(L, 2, 1.0);\n\tdouble mean = luaL_optnumber(L, 3, 0.0);\n\tdouble r = rng->randomNormal(stddev);\n\n\tlua_pushnumber(L, r + mean);\n\treturn 1;\n}\n\nint w_RandomGenerator_setSeed(lua_State *L)\n{\n\tRandomGenerator *rng = luax_checkrandomgenerator(L, 1);\n\tluax_catchexcept(L, [&](){ rng->setSeed(luax_checkrandomseed(L, 2)); });\n\treturn 0;\n}\n\nint w_RandomGenerator_getSeed(lua_State *L)\n{\n\tRandomGenerator *rng = luax_checkrandomgenerator(L, 1);\n\tRandomGenerator::Seed s = rng->getSeed();\n\tlua_pushnumber(L, (lua_Number) s.b32.low);\n\tlua_pushnumber(L, (lua_Number) s.b32.high);\n\treturn 2;\n}\n\nint w_RandomGenerator_setState(lua_State *L)\n{\n\tRandomGenerator *rng = luax_checkrandomgenerator(L, 1);\n\tluax_catchexcept(L, [&](){ rng->setState(luax_checkstring(L, 2)); });\n\treturn 0;\n}\n\nint w_RandomGenerator_getState(lua_State *L)\n{\n\tRandomGenerator *rng = luax_checkrandomgenerator(L, 1);\n\tluax_pushstring(L, rng->getState());\n\treturn 1;\n}\n\n// C functions in a struct, necessary for the FFI versions of RandomGenerator functions.\nstruct FFI_RandomGenerator\n{\n\tdouble (*random)(Proxy *p);\n\tdouble (*randomNormal)(Proxy *p, double stddev, double mean);\n};\n\nstatic FFI_RandomGenerator ffifuncs =\n{\n\t[](Proxy *p) -> double // random()\n\t{\n\t\tauto rng = luax_ffi_checktype<RandomGenerator>(p);\n\t\treturn rng != nullptr ? rng->random() : 0.0;\n\t},\n\n\t[](Proxy *p, double stdddev, double mean) -> double // randomNormal\n\t{\n\t\tauto rng = luax_ffi_checktype<RandomGenerator>(p);\n\t\treturn rng != nullptr ? (rng->randomNormal(stdddev) + mean) : 0.0;\n\t}\n};\n\nstatic const luaL_Reg w_RandomGenerator_functions[] =\n{\n\t{ \"_random\", w_RandomGenerator__random }, // random() is defined in wrap_RandomGenerator.lua.\n\t{ \"randomNormal\", w_RandomGenerator_randomNormal },\n\t{ \"setSeed\", w_RandomGenerator_setSeed },\n\t{ \"getSeed\", w_RandomGenerator_getSeed },\n\t{ \"setState\", w_RandomGenerator_setState },\n\t{ \"getState\", w_RandomGenerator_getState },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_randomgenerator(lua_State *L)\n{\n\tint n = luax_register_type(L, &RandomGenerator::type, w_RandomGenerator_functions, nullptr);\n\n\tluax_runwrapper(L, randomgenerator_lua, sizeof(randomgenerator_lua), \"RandomGenerator.lua\", RandomGenerator::type, &ffifuncs);\n\n\treturn n;\n}\n\n} // math\n} // love\n"
  },
  {
    "path": "src/modules/math/wrap_RandomGenerator.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_MATH_WRAP_RANDOM_GENERATOR_H\n#define LOVE_MATH_WRAP_RANDOM_GENERATOR_H\n\n// LOVE\n#include \"RandomGenerator.h\"\n#include \"common/config.h\"\n#include \"common/runtime.h\"\n\nnamespace love\n{\nnamespace math\n{\n\n// Helper functions.\nRandomGenerator::Seed luax_checkrandomseed(lua_State *L, int idx);\n\nRandomGenerator *luax_checkrandomgenerator(lua_State *L, int idx);\nextern \"C\" int luaopen_randomgenerator(lua_State *L);\n\n} // math\n} // love\n\n#endif // LOVE_MATH_WRAP_RANDOM_GENERATOR_H\n"
  },
  {
    "path": "src/modules/math/wrap_RandomGenerator.lua",
    "content": "R\"luastring\"--(\n-- DO NOT REMOVE THE ABOVE LINE. It is used to load this file as a C++ string.\n-- There is a matching delimiter at the bottom of the file.\n\n--[[\nCopyright (c) 2006-2024 LOVE Development Team\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\nclaim that you wrote the original software. If you use this software\nin a product, an acknowledgment in the product documentation would be\nappreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be\nmisrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n--]]\n\nlocal RandomGenerator_mt, ffifuncspointer_str = ...\nlocal RandomGenerator = RandomGenerator_mt.__index\n\nlocal type, tonumber, error = type, tonumber, error\nlocal floor = math.floor\n\nlocal _random = RandomGenerator._random\n\nlocal function getrandom(r, l, u)\n\tif u ~= nil then\n\t\tif type(r) ~= \"number\" then error(\"bad argument #1 to 'random' (number expected)\", 2) end\n\t\tif type(l) ~= \"number\" then error(\"bad argument #2 to 'random' (number expected)\", 2) end\n\t\treturn floor(r * (u - l + 1)) + l\n\telseif l ~= nil then\n\t\tif type(l) ~= \"number\" then error(\"bad argument #1 to 'random' (number expected)\", 2) end\n\t\treturn floor(r * l) + 1\n\telse\n\t\treturn r\n\tend\nend\n\nfunction RandomGenerator:random(l, u)\n\tlocal r = _random(self)\n\treturn getrandom(r, l, u)\nend\n\nif type(jit) ~= \"table\" or not jit.status() then\n\t-- LuaJIT's FFI is *much* slower than LOVE's regular methods when the JIT\n\t-- compiler is disabled.\n\treturn\nend\n\nlocal status, ffi = pcall(require, \"ffi\")\nif not status then return end\n\npcall(ffi.cdef, [[\ntypedef struct Proxy Proxy;\n\ntypedef struct FFI_RandomGenerator\n{\n\tdouble (*random)(Proxy *p);\n\tdouble (*randomNormal)(Proxy *p, double stddev, double mean);\n} FFI_RandomGenerator;\n]])\n\nlocal ffifuncs = ffi.cast(\"FFI_RandomGenerator **\", ffifuncspointer_str)[0]\n\n\n-- Overwrite some regular love.math functions with FFI implementations.\n\nfunction RandomGenerator:random(l, u)\n\t-- TODO: This should ideally be handled inside ffifuncs.random\n\tif self == nil then error(\"bad argument #1 to 'random' (RandomGenerator expected, got no value)\", 2) end\n\tlocal r = tonumber(ffifuncs.random(self))\n\treturn getrandom(r, l, u)\nend\n\nfunction RandomGenerator:randomNormal(stddev, mean)\n\t-- TODO: This should ideally be handled inside ffifuncs.randomNormal\n\tif self == nil then error(\"bad argument #1 to 'randomNormal' (RandomGenerator expected, got no value)\", 2) end\n\n\tstddev = stddev == nil and 1 or stddev\n\tmean = mean == nil and 0 or mean\n\n\tif type(stddev) ~= \"number\" then error(\"bad argument #1 to 'randomNormal' (number expected)\", 2) end\n\tif type(mean) ~= \"number\" then error(\"bad argument #2 to 'randomNormal' (number expected)\", 2) end\n\n\treturn tonumber(ffifuncs.randomNormal(self, stddev, mean))\nend\n\n-- DO NOT REMOVE THE NEXT LINE. It is used to load this file as a C++ string.\n--)luastring\"--\"\n"
  },
  {
    "path": "src/modules/math/wrap_Transform.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_Transform.h\"\n\nnamespace love\n{\nnamespace math\n{\n\nTransform *luax_checktransform(lua_State *L, int idx)\n{\n\treturn luax_checktype<Transform>(L, idx, Transform::type);\n}\n\nvoid luax_checkmatrix(lua_State *L, int idx, Transform::MatrixLayout layout, float elements[16])\n{\n\tbool columnmajor = layout == Transform::MATRIX_COLUMN_MAJOR;\n\n\tif (lua_istable(L, idx))\n\t{\n\t\tlua_rawgeti(L, idx, 1);\n\t\tbool tableoftables = lua_istable(L, -1);\n\t\tlua_pop(L, 1);\n\n\t\tif (tableoftables)\n\t\t{\n\t\t\tif (columnmajor)\n\t\t\t{\n\t\t\t\tfor (int column = 0; column < 4; column++)\n\t\t\t\t{\n\t\t\t\t\tlua_rawgeti(L, idx, column + 1);\n\n\t\t\t\t\tfor (int row = 0; row < 4; row++)\n\t\t\t\t\t{\n\t\t\t\t\t\tlua_rawgeti(L, -(row + 1), row + 1);\n\t\t\t\t\t\telements[column * 4 + row] = (float) luaL_checknumber(L, -1);\n\t\t\t\t\t}\n\n\t\t\t\t\tlua_pop(L, 4 + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor (int row = 0; row < 4; row++)\n\t\t\t\t{\n\t\t\t\t\tlua_rawgeti(L, idx, row + 1);\n\n\t\t\t\t\tfor (int column = 0; column < 4; column++)\n\t\t\t\t\t{\n\t\t\t\t\t\t// The table has the matrix elements laid out in row-major\n\t\t\t\t\t\t// order, but we need to store them column-major in memory.\n\t\t\t\t\t\tlua_rawgeti(L, -(column + 1), column + 1);\n\t\t\t\t\t\telements[column * 4 + row] = (float) luaL_checknumber(L, -1);\n\t\t\t\t\t}\n\n\t\t\t\t\tlua_pop(L, 4 + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (columnmajor)\n\t\t\t{\n\t\t\t\tfor (int column = 0; column < 4; column++)\n\t\t\t\t{\n\t\t\t\t\tfor (int row = 0; row < 4; row++)\n\t\t\t\t\t{\n\t\t\t\t\t\tlua_rawgeti(L, idx, column * 4 + row + 1);\n\t\t\t\t\t\telements[column * 4 + row] = (float) luaL_checknumber(L, -1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor (int column = 0; column < 4; column++)\n\t\t\t\t{\n\t\t\t\t\tfor (int row = 0; row < 4; row++)\n\t\t\t\t\t{\n\t\t\t\t\t\t// The table has the matrix elements laid out in row-major\n\t\t\t\t\t\t// order, but we need to store them column-major in memory.\n\t\t\t\t\t\tlua_rawgeti(L, idx, row * 4 + column + 1);\n\t\t\t\t\t\telements[column * 4 + row] = (float) luaL_checknumber(L, -1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlua_pop(L, 16);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (columnmajor)\n\t\t{\n\t\t\tfor (int i = 0; i < 16; i++)\n\t\t\t\telements[i] = (float) luaL_checknumber(L, idx + i);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (int column = 0; column < 4; column++)\n\t\t\t{\n\t\t\t\tfor (int row = 0; row < 4; row++)\n\t\t\t\t\telements[column * 4 + row] = (float) luaL_checknumber(L, row * 4 + column + idx);\n\t\t\t}\n\t\t}\n\t}\n}\n\nint w_Transform_clone(lua_State *L)\n{\n\tTransform *t = luax_checktransform(L, 1);\n\tTransform *newtransform = t->clone();\n\tluax_pushtype(L, newtransform);\n\tnewtransform->release();\n\treturn 1;\n}\n\nint w_Transform_inverse(lua_State *L)\n{\n\tTransform *t = luax_checktransform(L, 1);\n\tTransform *inverse = t->inverse();\n\tluax_pushtype(L, inverse);\n\tinverse->release();\n\treturn 1;\n}\n\nint w_Transform_apply(lua_State *L)\n{\n\tTransform *t = luax_checktransform(L, 1);\n\tTransform *other = luax_checktransform(L, 2);\n\tt->apply(other);\n\tlua_pushvalue(L, 1);\n\treturn 1;\n}\n\nint w_Transform_isAffine2DTransform(lua_State *L)\n{\n\tTransform *t = luax_checktransform(L, 1);\n\tluax_pushboolean(L, t->getMatrix().isAffine2DTransform());\n\treturn 1;\n}\n\nint w_Transform_translate(lua_State *L)\n{\n\tTransform *t = luax_checktransform(L, 1);\n\tfloat x = (float) luaL_checknumber(L, 2);\n\tfloat y = (float) luaL_checknumber(L, 3);\n\tt->translate(x, y);\n\tlua_pushvalue(L, 1);\n\treturn 1;\n}\n\nint w_Transform_rotate(lua_State *L)\n{\n\tTransform *t = luax_checktransform(L, 1);\n\tfloat angle = (float) luaL_checknumber(L, 2);\n\tt->rotate(angle);\n\tlua_pushvalue(L, 1);\n\treturn 1;\n}\n\nint w_Transform_scale(lua_State *L)\n{\n\tTransform *t = luax_checktransform(L, 1);\n\tfloat sx = (float) luaL_checknumber(L, 2);\n\tfloat sy = (float) luaL_optnumber(L, 3, sx);\n\tt->scale(sx, sy);\n\tlua_pushvalue(L, 1);\n\treturn 1;\n}\n\nint w_Transform_shear(lua_State *L)\n{\n\tTransform *t = luax_checktransform(L, 1);\n\tfloat kx = (float) luaL_checknumber(L, 2);\n\tfloat ky = (float) luaL_checknumber(L, 3);\n\tt->shear(kx, ky);\n\tlua_pushvalue(L, 1);\n\treturn 1;\n}\n\nint w_Transform_reset(lua_State *L)\n{\n\tTransform *t = luax_checktransform(L, 1);\n\tt->reset();\n\tlua_pushvalue(L, 1);\n\treturn 1;\n}\n\nint w_Transform_setTransformation(lua_State *L)\n{\n\tTransform *t = luax_checktransform(L, 1);\n\tfloat x =  (float) luaL_optnumber(L, 2, 0.0);\n\tfloat y =  (float) luaL_optnumber(L, 3, 0.0);\n\tfloat a =  (float) luaL_optnumber(L, 4, 0.0);\n\tfloat sx = (float) luaL_optnumber(L, 5, 1.0);\n\tfloat sy = (float) luaL_optnumber(L, 6, sx);\n\tfloat ox = (float) luaL_optnumber(L, 7, 0.0);\n\tfloat oy = (float) luaL_optnumber(L, 8, 0.0);\n\tfloat kx = (float) luaL_optnumber(L, 9, 0.0);\n\tfloat ky = (float) luaL_optnumber(L, 10, 0.0);\n\tt->setTransformation(x, y, a, sx, sy, ox, oy, kx, ky);\n\tlua_pushvalue(L, 1);\n\treturn 1;\n}\n\nint w_Transform_setMatrix(lua_State *L)\n{\n\tTransform *t = luax_checktransform(L, 1);\n\tTransform::MatrixLayout layout = Transform::MATRIX_ROW_MAJOR;\n\n\tint idx = 2;\n\tif (lua_type(L, idx) == LUA_TSTRING)\n\t{\n\t\tconst char *layoutstr = lua_tostring(L, idx);\n\t\tif (!Transform::getConstant(layoutstr, layout))\n\t\t\treturn luax_enumerror(L, \"matrix layout\", Transform::getConstants(layout), layoutstr);\n\n\t\tidx++;\n\t}\n\n\tfloat elements[16];\n\tluax_checkmatrix(L, idx, layout, elements);\n\n\tt->setMatrix(Matrix4(elements));\n\tlua_pushvalue(L, 1);\n\treturn 1;\n}\n\nint w_Transform_getMatrix(lua_State *L)\n{\n\tTransform *t = luax_checktransform(L, 1);\n\tconst float *elements = t->getMatrix().getElements();\n\n\t// We want to push elements in row-major order, but they're stored column-\n\t// major.\n\tfor (int row = 0; row < 4; row++)\n\t{\n\t\tfor (int column = 0; column < 4; column++)\n\t\t\tlua_pushnumber(L, elements[column * 4 + row]);\n\t}\n\n\treturn 16;\n}\n\nint w_Transform_transformPoint(lua_State *L)\n{\n\tTransform *t = luax_checktransform(L, 1);\n\tlove::Vector2 p;\n\tp.x = (float) luaL_checknumber(L, 2);\n\tp.y = (float) luaL_checknumber(L, 3);\n\tp = t->transformPoint(p);\n\tlua_pushnumber(L, p.x);\n\tlua_pushnumber(L, p.y);\n\treturn 2;\n}\n\nint w_Transform_inverseTransformPoint(lua_State *L)\n{\n\tTransform *t = luax_checktransform(L, 1);\n\tlove::Vector2 p;\n\tp.x = (float) luaL_checknumber(L, 2);\n\tp.y = (float) luaL_checknumber(L, 3);\n\tp = t->inverseTransformPoint(p);\n\tlua_pushnumber(L, p.x);\n\tlua_pushnumber(L, p.y);\n\treturn 2;\n}\n\nint w_Transform__mul(lua_State *L)\n{\n\tTransform *t1 = luax_checktransform(L, 1);\n\tTransform *t2 = luax_checktransform(L, 2);\n\tTransform *t3 = new Transform(t1->getMatrix() * t2->getMatrix());\n\tluax_pushtype(L, t3);\n\tt3->release();\n\treturn 1;\n}\n\nstatic const luaL_Reg functions[] =\n{\n\t{ \"clone\", w_Transform_clone },\n\t{ \"inverse\", w_Transform_inverse },\n\t{ \"apply\", w_Transform_apply },\n\t{ \"isAffine2DTransform\", w_Transform_isAffine2DTransform },\n\t{ \"translate\", w_Transform_translate },\n\t{ \"rotate\", w_Transform_rotate },\n\t{ \"scale\", w_Transform_scale },\n\t{ \"shear\", w_Transform_shear },\n\t{ \"reset\", w_Transform_reset },\n\t{ \"setTransformation\", w_Transform_setTransformation },\n\t{ \"setMatrix\", w_Transform_setMatrix },\n\t{ \"getMatrix\", w_Transform_getMatrix },\n\t{ \"transformPoint\", w_Transform_transformPoint },\n\t{ \"inverseTransformPoint\", w_Transform_inverseTransformPoint },\n\t{ \"__mul\", w_Transform__mul },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_transform(lua_State *L)\n{\n\treturn luax_register_type(L, &Transform::type, functions, nullptr);\n}\n\n} // math\n} // love\n"
  },
  {
    "path": "src/modules/math/wrap_Transform.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"Transform.h\"\n#include \"common/runtime.h\"\n\nnamespace love\n{\nnamespace math\n{\n\nTransform *luax_checktransform(lua_State *L, int idx);\nvoid luax_checkmatrix(lua_State *L, int idx, Transform::MatrixLayout layout, float elements[16]);\nextern \"C\" int luaopen_transform(lua_State *L);\n\n} // math\n} // love\n"
  },
  {
    "path": "src/modules/mouse/Cursor.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Cursor.h\"\n\nnamespace love\n{\nnamespace mouse\n{\n\nlove::Type Cursor::type(\"Cursor\", &Object::type);\n\nCursor::~Cursor()\n{\n}\n\nbool Cursor::getConstant(const char *in, SystemCursor &out)\n{\n\treturn systemCursors.find(in, out);\n}\n\nbool Cursor::getConstant(SystemCursor in, const char *&out)\n{\n\treturn systemCursors.find(in, out);\n}\n\nbool Cursor::getConstant(const char *in, CursorType &out)\n{\n\treturn types.find(in, out);\n}\n\nbool Cursor::getConstant(CursorType in, const char *&out)\n{\n\treturn types.find(in, out);\n}\n\nStringMap<Cursor::SystemCursor, Cursor::CURSOR_MAX_ENUM>::Entry Cursor::systemCursorEntries[] =\n{\n\t{\"arrow\", Cursor::CURSOR_ARROW},\n\t{\"ibeam\", Cursor::CURSOR_IBEAM},\n\t{\"wait\", Cursor::CURSOR_WAIT},\n\t{\"crosshair\", Cursor::CURSOR_CROSSHAIR},\n\t{\"waitarrow\", Cursor::CURSOR_WAITARROW},\n\t{\"sizenwse\", Cursor::CURSOR_SIZENWSE},\n\t{\"sizenesw\", Cursor::CURSOR_SIZENESW},\n\t{\"sizewe\", Cursor::CURSOR_SIZEWE},\n\t{\"sizens\", Cursor::CURSOR_SIZENS},\n\t{\"sizeall\", Cursor::CURSOR_SIZEALL},\n\t{\"no\", Cursor::CURSOR_NO},\n\t{\"hand\", Cursor::CURSOR_HAND},\n};\n\nStringMap<Cursor::SystemCursor, Cursor::CURSOR_MAX_ENUM> Cursor::systemCursors(Cursor::systemCursorEntries, sizeof(Cursor::systemCursorEntries));\n\nStringMap<Cursor::CursorType, Cursor::CURSORTYPE_MAX_ENUM>::Entry Cursor::typeEntries[] =\n{\n\t{\"system\", Cursor::CURSORTYPE_SYSTEM},\n\t{\"image\", Cursor::CURSORTYPE_IMAGE},\n};\n\nStringMap<Cursor::CursorType, Cursor::CURSORTYPE_MAX_ENUM> Cursor::types(Cursor::typeEntries, sizeof(Cursor::typeEntries));\n\n} // mouse\n} // love\n"
  },
  {
    "path": "src/modules/mouse/Cursor.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_MOUSE_CURSOR_H\n#define LOVE_MOUSE_CURSOR_H\n\n// LOVE\n#include \"image/ImageData.h\"\n#include \"common/Object.h\"\n#include \"common/StringMap.h\"\n\nnamespace love\n{\nnamespace mouse\n{\n\nclass Cursor : public Object\n{\npublic:\n\n\tstatic love::Type type;\n\n\t// Types of system cursors.\n\tenum SystemCursor\n\t{\n\t\tCURSOR_ARROW,\n\t\tCURSOR_IBEAM,\n\t\tCURSOR_WAIT,\n\t\tCURSOR_CROSSHAIR,\n\t\tCURSOR_WAITARROW,\n\t\tCURSOR_SIZENWSE,\n\t\tCURSOR_SIZENESW,\n\t\tCURSOR_SIZEWE,\n\t\tCURSOR_SIZENS,\n\t\tCURSOR_SIZEALL,\n\t\tCURSOR_NO,\n\t\tCURSOR_HAND,\n\t\tCURSOR_MAX_ENUM\n\t};\n\n\tenum CursorType\n\t{\n\t\tCURSORTYPE_SYSTEM,\n\t\tCURSORTYPE_IMAGE,\n\t\tCURSORTYPE_MAX_ENUM\n\t};\n\n\tvirtual ~Cursor();\n\n\t/**\n\t * Returns a pointer to the implementation-dependent handle of this Cursor.\n\t **/\n\tvirtual void *getHandle() const = 0;\n\n\t/**\n\t * Returns whether this Cursor is system-defined or a custom image.\n\t **/\n\tvirtual CursorType getType() const = 0;\n\n\t/**\n\t * Returns the type type of system cursor used, if this Cursor is using a\n\t * system-defined image.\n\t **/\n\tvirtual SystemCursor getSystemType() const = 0;\n\n\tstatic bool getConstant(const char *in, SystemCursor &out);\n\tstatic bool getConstant(SystemCursor in, const char *&out);\n\n\tstatic bool getConstant(const char *in, CursorType &out);\n\tstatic bool getConstant(CursorType in, const char *&out);\n\nprivate:\n\n\tstatic StringMap<SystemCursor, CURSOR_MAX_ENUM>::Entry systemCursorEntries[];\n\tstatic StringMap<SystemCursor, CURSOR_MAX_ENUM> systemCursors;\n\n\tstatic StringMap<CursorType, CURSORTYPE_MAX_ENUM>::Entry typeEntries[];\n\tstatic StringMap<CursorType, CURSORTYPE_MAX_ENUM> types;\n\n};\n\n} // mouse\n} // love\n\n#endif // LOVE_MOUSE_CURSOR_H\n"
  },
  {
    "path": "src/modules/mouse/Mouse.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_MOUSE_MOUSE_H\n#define LOVE_MOUSE_MOUSE_H\n\n// LOVE\n#include \"Cursor.h\"\n#include \"common/Module.h\"\n#include \"image/ImageData.h\"\n\n// C++\n#include <vector>\n\nnamespace love\n{\nnamespace mouse\n{\n\nclass Mouse : public Module\n{\npublic:\n\n\tvirtual ~Mouse() {}\n\n\t// Implements Module.\n\tvirtual ModuleType getModuleType() const { return M_MOUSE; }\n\n\tvirtual Cursor *newCursor(const std::vector<image::ImageData *> &data, int hotx, int hoty) = 0;\n\tvirtual Cursor *getSystemCursor(Cursor::SystemCursor cursortype) = 0;\n\n\tvirtual void setCursor(Cursor *cursor) = 0;\n\tvirtual void setCursor() = 0;\n\n\tvirtual Cursor *getCursor() const = 0;\n\n\tvirtual bool isCursorSupported() const = 0;\n\n\tvirtual void getPosition(double &x, double &y) const = 0;\n\tvirtual void setPosition(double x, double y) = 0;\n\tvirtual void getGlobalPosition(double &x, double &y, int &displayindex) const = 0;\n\tvirtual void setVisible(bool visible) = 0;\n\tvirtual bool isDown(const std::vector<int> &buttons) const = 0;\n\tvirtual bool isVisible() const = 0;\n\tvirtual void setGrabbed(bool grab) = 0;\n\tvirtual bool isGrabbed() const = 0;\n\tvirtual bool setRelativeMode(bool relative) = 0;\n\tvirtual bool getRelativeMode() const = 0;\n\nprotected:\n\n\tMouse(const char *name)\n\t\t: Module(M_MOUSE, name)\n\t{}\n\n}; // Mouse\n\n} // mouse\n} // love\n\n#endif // LOVE_MOUSE_MOUSE_H\n"
  },
  {
    "path": "src/modules/mouse/sdl/Cursor.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"Cursor.h\"\n#include \"common/config.h\"\n\nnamespace love\n{\nnamespace mouse\n{\nnamespace sdl\n{\n\nCursor::Cursor(const std::vector<image::ImageData *> &imageData, int hotx, int hoty)\n\t: cursor(nullptr)\n\t, type(CURSORTYPE_IMAGE)\n\t, systemType(CURSOR_MAX_ENUM)\n{\n\tif (imageData.empty())\n\t\tthrow love::Exception(\"At least one ImageData must be provided for a custom cursor.\");\n\n\tstd::vector<SDL_Surface *> surfaces;\n\n\tfor (image::ImageData *data : imageData)\n\t{\n\t\tint w = data->getWidth();\n\t\tint h = data->getHeight();\n\t\tint pitch = w * 4;\n\n\t\tif (getLinearPixelFormat(data->getFormat()) != PIXELFORMAT_RGBA8_UNORM)\n\t\t{\n\t\t\tfor (SDL_Surface *surface : surfaces)\n\t\t\t\tSDL_DestroySurface(surface);\n\t\t\tthrow love::Exception(\"Cannot create cursor: ImageData pixel format must be rgba8.\");\n\t\t}\n\n\t\tsurfaces.push_back(SDL_CreateSurfaceFrom(w, h, SDL_PIXELFORMAT_ABGR8888, data->getData(), pitch));\n\n\t\tif (surfaces.back() == nullptr)\n\t\t{\n\t\t\tfor (SDL_Surface *surface : surfaces)\n\t\t\t\tSDL_DestroySurface(surface);\n\t\t\tthrow love::Exception(\"Cannot create cursor: out of memory.\");\n\t\t}\n\t}\n\n\t// Add alternate representations for the OS to use in different DPI scales.\n\tfor (size_t i = 1; i < surfaces.size(); i++)\n\t\tSDL_AddSurfaceAlternateImage(surfaces[0], surfaces[i]);\n\n\tcursor = SDL_CreateColorCursor(surfaces[0], hotx, hoty);\n\n\tfor (SDL_Surface *surface : surfaces)\n\t\tSDL_DestroySurface(surface);\n\n\tif (cursor == nullptr)\n\t\tthrow love::Exception(\"Cannot create cursor: %s\", SDL_GetError());\n}\n\nCursor::Cursor(mouse::Cursor::SystemCursor cursortype)\n\t: cursor(nullptr)\n\t, type(CURSORTYPE_SYSTEM)\n\t, systemType(cursortype)\n{\n\tSDL_SystemCursor sdlcursortype;\n\n\tif (systemCursors.find(cursortype, sdlcursortype))\n\t\tcursor = SDL_CreateSystemCursor(sdlcursortype);\n\telse\n\t\tthrow love::Exception(\"Cannot create system cursor: invalid type.\");\n\n\tif (cursor == nullptr)\n\t\tthrow love::Exception(\"Cannot create system cursor: %s\", SDL_GetError());\n}\n\nCursor::~Cursor()\n{\n\tif (cursor)\n\t\tSDL_DestroyCursor(cursor);\n}\n\nvoid *Cursor::getHandle() const\n{\n\treturn cursor;\n}\n\nCursor::CursorType Cursor::getType() const\n{\n\treturn type;\n}\n\nCursor::SystemCursor Cursor::getSystemType() const\n{\n\treturn systemType;\n}\n\nEnumMap<Cursor::SystemCursor, SDL_SystemCursor, Cursor::CURSOR_MAX_ENUM>::Entry Cursor::systemCursorEntries[] =\n{\n\t{Cursor::CURSOR_ARROW, SDL_SYSTEM_CURSOR_DEFAULT},\n\t{Cursor::CURSOR_IBEAM, SDL_SYSTEM_CURSOR_TEXT},\n\t{Cursor::CURSOR_WAIT, SDL_SYSTEM_CURSOR_WAIT},\n\t{Cursor::CURSOR_CROSSHAIR, SDL_SYSTEM_CURSOR_CROSSHAIR},\n\t{Cursor::CURSOR_WAITARROW, SDL_SYSTEM_CURSOR_PROGRESS},\n\t{Cursor::CURSOR_SIZENWSE, SDL_SYSTEM_CURSOR_NWSE_RESIZE},\n\t{Cursor::CURSOR_SIZENESW, SDL_SYSTEM_CURSOR_NESW_RESIZE},\n\t{Cursor::CURSOR_SIZEWE, SDL_SYSTEM_CURSOR_EW_RESIZE},\n\t{Cursor::CURSOR_SIZENS, SDL_SYSTEM_CURSOR_NS_RESIZE},\n\t{Cursor::CURSOR_SIZEALL, SDL_SYSTEM_CURSOR_MOVE},\n\t{Cursor::CURSOR_NO, SDL_SYSTEM_CURSOR_NOT_ALLOWED},\n\t{Cursor::CURSOR_HAND, SDL_SYSTEM_CURSOR_POINTER},\n};\n\nEnumMap<Cursor::SystemCursor, SDL_SystemCursor, Cursor::CURSOR_MAX_ENUM> Cursor::systemCursors(Cursor::systemCursorEntries, sizeof(Cursor::systemCursorEntries));\n\n} // sdl\n} // mouse\n} // love\n"
  },
  {
    "path": "src/modules/mouse/sdl/Cursor.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_MOUSE_SDL_CURSOR_H\n#define LOVE_MOUSE_SDL_CURSOR_H\n\n// LOVE\n#include \"mouse/Cursor.h\"\n#include \"common/EnumMap.h\"\n\n// SDL\n#include <SDL3/SDL_mouse.h>\n\n#include <vector>\n\nnamespace love\n{\nnamespace mouse\n{\nnamespace sdl\n{\n\nclass Cursor : public love::mouse::Cursor\n{\npublic:\n\n\tCursor(const std::vector<image::ImageData *> &imageData, int hotx, int hoty);\n\tCursor(SystemCursor cursortype);\n\t~Cursor();\n\n\tvoid *getHandle() const;\n\tCursorType getType() const;\n\tSystemCursor getSystemType() const;\n\nprivate:\n\n\tSDL_Cursor *cursor;\n\tCursorType type;\n\tSystemCursor systemType;\n\n\tstatic EnumMap<SystemCursor, SDL_SystemCursor, CURSOR_MAX_ENUM>::Entry systemCursorEntries[];\n\tstatic EnumMap<SystemCursor, SDL_SystemCursor, CURSOR_MAX_ENUM> systemCursors;\n};\n\n} // sdl\n} // mouse\n} // love\n\n#endif // LOVE_MOUSE_SDL_CURSOR_H\n"
  },
  {
    "path": "src/modules/mouse/sdl/Mouse.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"Mouse.h\"\n#include \"window/sdl/Window.h\"\n\n// SDL\n#include <SDL3/SDL_mouse.h>\n\nnamespace love\n{\nnamespace mouse\n{\nnamespace sdl\n{\n\nstatic SDL_Window *getSDLWindow()\n{\n\tauto window = Module::getInstance<window::Window>(Module::M_WINDOW);\n\tif (window)\n\t\treturn (SDL_Window *) window->getHandle();\n\treturn nullptr;\n}\n\n// SDL reports mouse coordinates in the window coordinate system in OS X, but\n// we want them in pixel coordinates (may be different with high-DPI enabled.)\nstatic void windowToDPICoords(double *x, double *y)\n{\n\tauto window = Module::getInstance<window::Window>(Module::M_WINDOW);\n\tif (window)\n\t\twindow->windowToDPICoords(x, y);\n}\n\n// And vice versa for setting mouse coordinates.\nstatic void DPIToWindowCoords(double *x, double *y)\n{\n\tauto window = Module::getInstance<window::Window>(Module::M_WINDOW);\n\tif (window)\n\t\twindow->DPIToWindowCoords(x, y);\n}\n\nstatic void clampToWindow(double *x, double *y)\n{\n\tauto window = Module::getInstance<window::Window>(Module::M_WINDOW);\n\tif (window)\n\t\twindow->clampPositionInWindow(x, y);\n}\n\nMouse::Mouse()\n\t: love::mouse::Mouse(\"love.mouse.sdl\")\n\t, curCursor(nullptr)\n{\n\t// SDL may need the video subsystem in order to clean up the cursor when\n\t// quitting. Subsystems are reference-counted.\n\tSDL_InitSubSystem(SDL_INIT_VIDEO);\n}\n\nMouse::~Mouse()\n{\n\tif (curCursor.get())\n\t\tsetCursor();\n\n\tfor (auto &c : systemCursors)\n\t\tc.second->release();\n\n\tSDL_QuitSubSystem(SDL_INIT_VIDEO);\n}\n\nlove::mouse::Cursor *Mouse::newCursor(const std::vector<image::ImageData *> &data, int hotx, int hoty)\n{\n\treturn new Cursor(data, hotx, hoty);\n}\n\nlove::mouse::Cursor *Mouse::getSystemCursor(Cursor::SystemCursor cursortype)\n{\n\tCursor *cursor = nullptr;\n\tauto it = systemCursors.find(cursortype);\n\n\tif (it != systemCursors.end())\n\t\tcursor = it->second;\n\telse\n\t{\n\t\tcursor = new Cursor(cursortype);\n\t\tsystemCursors[cursortype] = cursor;\n\t}\n\n\treturn cursor;\n}\n\nvoid Mouse::setCursor(love::mouse::Cursor *cursor)\n{\n\tcurCursor.set(cursor);\n\tSDL_SetCursor((SDL_Cursor *) cursor->getHandle());\n}\n\nvoid Mouse::setCursor()\n{\n\tcurCursor.set(nullptr);\n\tSDL_SetCursor(SDL_GetDefaultCursor());\n}\n\nlove::mouse::Cursor *Mouse::getCursor() const\n{\n\treturn curCursor.get();\n}\n\n\nbool Mouse::isCursorSupported() const\n{\n\treturn SDL_GetDefaultCursor() != nullptr;\n}\n\nvoid Mouse::getPosition(double &x, double &y) const\n{\n\tfloat mx, my;\n\tSDL_GetMouseState(&mx, &my);\n\n\tx = (double) mx;\n\ty = (double) my;\n\n\t// SDL reports mouse coordinates outside the window bounds when click-and-\n\t// dragging. For compatibility we clamp instead since user code may not be\n\t// able to handle out-of-bounds coordinates. SDL has a hint to turn off\n\t// auto capture, but it doesn't report the mouse's position at the edge of\n\t// the window if the mouse moves fast enough when it's off.\n\tclampToWindow(&x, &y);\n\n\twindowToDPICoords(&x, &y);\n}\n\nvoid Mouse::setPosition(double x, double y)\n{\n\tauto window = Module::getInstance<window::Window>(Module::M_WINDOW);\n\n\tSDL_Window *handle = nullptr;\n\tif (window)\n\t\thandle = (SDL_Window *) window->getHandle();\n\n\tDPIToWindowCoords(&x, &y);\n\tSDL_WarpMouseInWindow(handle, (int) x, (int) y);\n\n\t// SDL_WarpMouse doesn't directly update SDL's internal mouse state in Linux\n\t// and Windows, so we call SDL_PumpEvents now to make sure the next\n\t// getPosition call always returns the updated state.\n\tSDL_PumpEvents();\n}\n\nvoid Mouse::getGlobalPosition(double &x, double &y, int &displayindex) const\n{\n\tfloat globalx, globaly;\n\tSDL_GetGlobalMouseState(&globalx, &globaly);\n\n\tauto mx = globalx;\n\tauto my = globaly;\n\n\tint displaycount = 0;\n\tSDL_DisplayID *displays = SDL_GetDisplays(&displaycount);\n\n\tfor (displayindex = 0; displayindex < displaycount; displayindex++)\n\t{\n\t\tSDL_Rect r = {};\n\t\tSDL_GetDisplayBounds(displays[displayindex], &r);\n\n\t\tSDL_FRect frect = {(float)r.x, (float)r.y, (float)r.w, (float)r.h};\n\n\t\tmx -= frect.x;\n\t\tmy -= frect.y;\n\n\t\tSDL_FPoint p = { globalx, globaly };\n\t\tif (SDL_PointInRectFloat(&p, &frect))\n\t\t\tbreak;\n\t}\n\n\tif (displayindex >= displaycount)\n\t\tdisplayindex = 0;\n\n\tx = (double)mx;\n\ty = (double)my;\n}\n\nvoid Mouse::setVisible(bool visible)\n{\n\tif (visible)\n\t\tSDL_ShowCursor();\n\telse\n\t\tSDL_HideCursor();\n}\n\nbool Mouse::isDown(const std::vector<int> &buttons) const\n{\n\tUint32 buttonstate = SDL_GetMouseState(nullptr, nullptr);\n\n\tfor (int button : buttons)\n\t{\n\t\tif (button <= 0)\n\t\t\tcontinue;\n\n\t\t// We use button index 2 to represent the right mouse button, but SDL\n\t\t// uses 2 to represent the middle mouse button.\n\t\tswitch (button)\n\t\t{\n\t\tcase 2:\n\t\t\tbutton = SDL_BUTTON_RIGHT;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tbutton = SDL_BUTTON_MIDDLE;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (buttonstate & SDL_BUTTON_MASK(button))\n\t\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool Mouse::isVisible() const\n{\n\treturn SDL_CursorVisible();\n}\n\nvoid Mouse::setGrabbed(bool grab)\n{\n\tauto window = Module::getInstance<window::Window>(Module::M_WINDOW);\n\tif (window)\n\t\twindow->setMouseGrab(grab);\n}\n\nbool Mouse::isGrabbed() const\n{\n\tauto window = Module::getInstance<window::Window>(Module::M_WINDOW);\n\tif (window)\n\t\treturn window->isMouseGrabbed();\n\telse\n\t\treturn false;\n}\n\nbool Mouse::setRelativeMode(bool relative)\n{\n\tSDL_Window *sdlwindow = getSDLWindow();\n\tif (sdlwindow == nullptr)\n\t\treturn false;\n\treturn SDL_SetWindowRelativeMouseMode(sdlwindow, relative);\n}\n\nbool Mouse::getRelativeMode() const\n{\n\tSDL_Window *sdlwindow = getSDLWindow();\n\tif (sdlwindow == nullptr)\n\t\treturn false;\n\treturn SDL_GetWindowRelativeMouseMode(sdlwindow);\n}\n\n} // sdl\n} // mouse\n} // love\n"
  },
  {
    "path": "src/modules/mouse/sdl/Mouse.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_MOUSE_SDL_MOUSE_H\n#define LOVE_MOUSE_SDL_MOUSE_H\n\n// LOVE\n#include \"mouse/Mouse.h\"\n#include \"Cursor.h\"\n\n// C++\n#include <map>\n\nnamespace love\n{\nnamespace mouse\n{\nnamespace sdl\n{\n\nclass Mouse : public love::mouse::Mouse\n{\npublic:\n\n\tMouse();\n\tvirtual ~Mouse();\n\n\tlove::mouse::Cursor *newCursor(const std::vector<image::ImageData *> &data, int hotx, int hoty) override;\n\tlove::mouse::Cursor *getSystemCursor(Cursor::SystemCursor cursortype) override;\n\n\tvoid setCursor(love::mouse::Cursor *cursor) override;\n\tvoid setCursor() override;\n\n\tlove::mouse::Cursor *getCursor() const override;\n\n\tbool isCursorSupported() const override;\n\n\tvoid getPosition(double &x, double &y) const override;\n\tvoid setPosition(double x, double y) override;\n\tvoid getGlobalPosition(double &x, double &y, int &displayindex) const override;\n\tvoid setVisible(bool visible) override;\n\tbool isDown(const std::vector<int> &buttons) const override;\n\tbool isVisible() const override;\n\tvoid setGrabbed(bool grab) override;\n\tbool isGrabbed() const override;\n\tbool setRelativeMode(bool relative) override;\n\tbool getRelativeMode() const override;\n\nprivate:\n\n\tStrongRef<love::mouse::Cursor> curCursor;\n\n\tstd::map<Cursor::SystemCursor, Cursor *> systemCursors;\n\n}; // Mouse\n\n} // sdl\n} // mouse\n} // love\n\n#endif // LOVE_MOUSE_SDL_MOUSE_H\n"
  },
  {
    "path": "src/modules/mouse/wrap_Cursor.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"wrap_Cursor.h\"\n\nnamespace love\n{\nnamespace mouse\n{\n\nCursor *luax_checkcursor(lua_State *L, int idx)\n{\n\treturn luax_checktype<Cursor>(L, idx);\n}\n\nint w_Cursor_getType(lua_State *L)\n{\n\tCursor *cursor = luax_checkcursor(L, 1);\n\n\tCursor::CursorType ctype = cursor->getType();\n\tconst char *typestr = nullptr;\n\n\tif (ctype == Cursor::CURSORTYPE_IMAGE)\n\t\tmouse::Cursor::getConstant(ctype, typestr);\n\telse if (ctype == Cursor::CURSORTYPE_SYSTEM)\n\t{\n\t\tCursor::SystemCursor systype = cursor->getSystemType();\n\t\tmouse::Cursor::getConstant(systype, typestr);\n\t}\n\n\tif (!typestr)\n\t\treturn luaL_error(L, \"Unknown cursor type.\");\n\n\tlua_pushstring(L, typestr);\n\treturn 1;\n}\n\nstatic const luaL_Reg w_Cursor_functions[] =\n{\n\t{ \"getType\", w_Cursor_getType },\n\t{ 0, 0 },\n};\n\nextern \"C\" int luaopen_cursor(lua_State *L)\n{\n\treturn luax_register_type(L, &Cursor::type, w_Cursor_functions, nullptr);\n}\n\n} // mouse\n} // love\n"
  },
  {
    "path": "src/modules/mouse/wrap_Cursor.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_MOUSE_WRAP_CURSOR_H\n#define LOVE_MOUSE_WRAP_CURSOR_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"Cursor.h\"\n\nnamespace love\n{\nnamespace mouse\n{\n\nCursor *luax_checkcursor(lua_State *L, int idx);\nextern \"C\" int luaopen_cursor(lua_State *L);\n\n} // mouse\n} // love\n\n\n#endif // LOVE_MOUSE_WRAP_CURSOR_H\n"
  },
  {
    "path": "src/modules/mouse/wrap_Mouse.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"wrap_Mouse.h\"\n#include \"wrap_Cursor.h\"\n#include \"common/config.h\"\n\n#include \"sdl/Mouse.h\"\n#include \"filesystem/File.h\"\n\nnamespace love\n{\nnamespace mouse\n{\n\n#define instance() (Module::getInstance<Mouse>(Module::M_MOUSE))\n\nint w_newCursor(lua_State *L)\n{\n\tCursor *cursor = nullptr;\n\tstd::vector<love::image::ImageData *> data;\n\n\tif (lua_istable(L, 1))\n\t{\n\t\t// Do some type checking first, because memory will leak if we hit an error in the loop after this.\n\t\tfor (size_t i = 1; i <= luax_objlen(L, 1); i++)\n\t\t{\n\t\t\tlua_rawgeti(L, 1, i);\n\n\t\t\tif (!luax_istype(L, -1, love::image::ImageData::type)\n\t\t\t\t&& !(lua_isstring(L, -1) || luax_istype(L, -1, love::filesystem::File::type) || luax_istype(L, -1, love::filesystem::FileData::type)))\n\t\t\t{\n\t\t\t\tluax_checktype<love::image::ImageData>(L, -1);\n\t\t\t}\n\n\t\t\tlua_pop(L, 1);\n\t\t}\n\n\t\tfor (size_t i = 1; i <= luax_objlen(L, 1); i++)\n\t\t{\n\t\t\tlua_rawgeti(L, 1, i);\n\n\t\t\tif (lua_isstring(L, -1) || luax_istype(L, -1, love::filesystem::File::type) || luax_istype(L, -1, love::filesystem::FileData::type))\n\t\t\t\tluax_convobj(L, -1, \"image\", \"newImageData\");\n\n\t\t\tdata.push_back(luax_checktype<love::image::ImageData>(L, -1));\n\n\t\t\t// If a GC step happens within the loop, previous ImageData objects created within the loop may be released.\n\t\t\tdata.back()->retain();\n\n\t\t\tlua_pop(L, 1);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (lua_isstring(L, 1) || luax_istype(L, 1, love::filesystem::File::type) || luax_istype(L, 1, love::filesystem::FileData::type))\n\t\t\tluax_convobj(L, 1, \"image\", \"newImageData\");\n\n\t\tdata.push_back(luax_checktype<love::image::ImageData>(L, 1));\n\t\tdata.back()->retain();\n\t}\n\n\tint hotx = (int) luaL_optinteger(L, 2, 0);\n\tint hoty = (int) luaL_optinteger(L, 3, 0);\n\n\tluax_catchexcept(L,\n\t\t[&](){ cursor = instance()->newCursor(data, hotx, hoty); },\n\t\t[&](bool /*shoulderror*/) { for (auto d : data) d->release(); }\n\t);\n\n\tluax_pushtype(L, cursor);\n\tcursor->release();\n\treturn 1;\n}\n\nint w_getSystemCursor(lua_State *L)\n{\n\tconst char *str = luaL_checkstring(L, 1);\n\tCursor::SystemCursor systemCursor;\n\n\tif (!Cursor::getConstant(str, systemCursor))\n\t\treturn luax_enumerror(L, \"system cursor type\", str);\n\n\tCursor *cursor = 0;\n\tluax_catchexcept(L, [&](){ cursor = instance()->getSystemCursor(systemCursor); });\n\n\tluax_pushtype(L, cursor);\n\treturn 1;\n}\n\nint w_setCursor(lua_State *L)\n{\n\t// Revert to the default system cursor if no argument is given.\n\tif (lua_isnoneornil(L, 1))\n\t{\n\t\tinstance()->setCursor();\n\t\treturn 0;\n\t}\n\n\tCursor *cursor = luax_checkcursor(L, 1);\n\tinstance()->setCursor(cursor);\n\treturn 0;\n}\n\nint w_getCursor(lua_State *L)\n{\n\tCursor *cursor = instance()->getCursor();\n\n\tif (cursor)\n\t\tluax_pushtype(L, cursor);\n\telse\n\t\tlua_pushnil(L);\n\n\treturn 1;\n}\n\nint w_isCursorSupported(lua_State *L)\n{\n\tluax_pushboolean(L, instance()->isCursorSupported());\n\treturn 1;\n}\n\nint w_getX(lua_State *L)\n{\n\tdouble x, y;\n\tinstance()->getPosition(x, y);\n\tlua_pushnumber(L, x);\n\treturn 1;\n}\n\nint w_getY(lua_State *L)\n{\n\tdouble x, y;\n\tinstance()->getPosition(x, y);\n\tlua_pushnumber(L, y);\n\treturn 1;\n}\n\nint w_getPosition(lua_State *L)\n{\n\tdouble x, y;\n\tinstance()->getPosition(x, y);\n\tlua_pushnumber(L, x);\n\tlua_pushnumber(L, y);\n\treturn 2;\n}\n\nint w_setX(lua_State *L)\n{\n\tdouble x, y;\n\tinstance()->getPosition(x, y);\n\tx = luaL_checknumber(L, 1);\n\tinstance()->setPosition(x, y);\n\treturn 0;\n}\n\nint w_setY(lua_State *L)\n{\n\tdouble x, y;\n\tinstance()->getPosition(x, y);\n\ty = luaL_checknumber(L, 1);\n\tinstance()->setPosition(x, y);\n\treturn 0;\n}\n\nint w_setPosition(lua_State *L)\n{\n\tdouble x = luaL_checknumber(L, 1);\n\tdouble y = luaL_checknumber(L, 2);\n\tinstance()->setPosition(x, y);\n\treturn 0;\n}\n\nint w_getGlobalPosition(lua_State *L)\n{\n\tdouble x, y;\n\tint displayindex;\n\tinstance()->getGlobalPosition(x, y, displayindex);\n\tlua_pushnumber(L, x);\n\tlua_pushnumber(L, y);\n\tlua_pushinteger(L, displayindex + 1);\n\treturn 3;\n}\n\nint w_isDown(lua_State *L)\n{\n\tbool istable = lua_istable(L, 1);\n\tint num = istable ? (int) luax_objlen(L, 1) : lua_gettop(L);\n\n\tstd::vector<int> buttons;\n\tbuttons.reserve(num);\n\n\tif (istable)\n\t{\n\t\tfor (int i = 0; i < num; i++)\n\t\t{\n\t\t\tlua_rawgeti(L, 1, i + 1);\n\t\t\tbuttons.push_back((int) luaL_checkinteger(L, -1));\n\t\t\tlua_pop(L, 1);\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (int i = 0; i < num; i++)\n\t\t\tbuttons.push_back((int) luaL_checkinteger(L, i + 1));\n\t}\n\n\tluax_pushboolean(L, instance()->isDown(buttons));\n\treturn 1;\n}\n\nint w_setVisible(lua_State *L)\n{\n\tbool b = luax_checkboolean(L, 1);\n\tinstance()->setVisible(b);\n\treturn 0;\n}\n\nint w_isVisible(lua_State *L)\n{\n\tluax_pushboolean(L, instance()->isVisible());\n\treturn 1;\n}\n\nint w_setGrabbed(lua_State *L)\n{\n\tbool b = luax_checkboolean(L, 1);\n\tinstance()->setGrabbed(b);\n\treturn 0;\n}\n\nint w_isGrabbed(lua_State *L)\n{\n\tluax_pushboolean(L, instance()->isGrabbed());\n\treturn 1;\n}\n\nint w_setRelativeMode(lua_State *L)\n{\n\tbool relative = luax_checkboolean(L, 1);\n\tluax_pushboolean(L, instance()->setRelativeMode(relative));\n\treturn 1;\n}\n\nint w_getRelativeMode(lua_State *L)\n{\n\tluax_pushboolean(L, instance()->getRelativeMode());\n\treturn 1;\n}\n\n// List of functions to wrap.\nstatic const luaL_Reg functions[] =\n{\n\t{ \"newCursor\", w_newCursor },\n\t{ \"getSystemCursor\", w_getSystemCursor },\n\t{ \"setCursor\", w_setCursor },\n\t{ \"getCursor\", w_getCursor },\n\t{ \"isCursorSupported\", w_isCursorSupported },\n\t{ \"getX\", w_getX },\n\t{ \"getY\", w_getY },\n\t{ \"setX\", w_setX },\n\t{ \"setY\", w_setY },\n\t{ \"setPosition\", w_setPosition },\n\t{ \"getGlobalPosition\", w_getGlobalPosition },\n\t{ \"isDown\", w_isDown },\n\t{ \"setVisible\", w_setVisible },\n\t{ \"isVisible\", w_isVisible },\n\t{ \"getPosition\", w_getPosition },\n\t{ \"setGrabbed\", w_setGrabbed },\n\t{ \"isGrabbed\", w_isGrabbed },\n\t{ \"setRelativeMode\", w_setRelativeMode },\n\t{ \"getRelativeMode\", w_getRelativeMode },\n\t{ 0, 0 }\n};\n\n// Types for this module.\nstatic const lua_CFunction types[] =\n{\n\tluaopen_cursor,\n\t0,\n};\n\nextern \"C\" int luaopen_love_mouse(lua_State *L)\n{\n\tMouse *instance = instance();\n\tif (instance == nullptr)\n\t{\n\t\tluax_catchexcept(L, [&](){ instance = new love::mouse::sdl::Mouse(); });\n\t}\n\telse\n\t\tinstance->retain();\n\n\tWrappedModule w;\n\tw.module = instance;\n\tw.name = \"mouse\";\n\tw.type = &Module::type;\n\tw.functions = functions;\n\tw.types = types;\n\n\treturn luax_register_module(L, w);\n}\n\n} // mouse\n} // love\n"
  },
  {
    "path": "src/modules/mouse/wrap_Mouse.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_MOUSE_WRAP_MOUSE_H\n#define LOVE_MOUSE_WRAP_MOUSE_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"common/config.h\"\n\nnamespace love\n{\nnamespace mouse\n{\n\nextern \"C\" LOVE_EXPORT int luaopen_love_mouse(lua_State *L);\n\n} // mouse\n} // love\n\n#endif // LOVE_MOUSE_WRAP_MOUSE_H\n\n"
  },
  {
    "path": "src/modules/physics/Body.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Body.h\"\n\nnamespace love\n{\nnamespace physics\n{\n\nlove::Type Body::type(\"Body\", &Object::type);\n\nBody::~Body()\n{\n}\n\nbool Body::getConstant(const char *in, Type &out)\n{\n\treturn types.find(in, out);\n}\n\nbool Body::getConstant(Type in, const char *&out)\n{\n\treturn types.find(in, out);\n}\n\nstd::vector<std::string> Body::getConstants(Type)\n{\n\treturn types.getNames();\n}\n\nStringMap<Body::Type, Body::BODY_MAX_ENUM>::Entry Body::typeEntries[] =\n{\n\t{\"static\", Body::BODY_STATIC},\n\t{\"dynamic\", Body::BODY_DYNAMIC},\n\t{\"kinematic\", Body::BODY_KINEMATIC},\n};\n\nStringMap<Body::Type, Body::BODY_MAX_ENUM> Body::types(Body::typeEntries, sizeof(Body::typeEntries));\n\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/Body.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BODY_H\n#define LOVE_PHYSICS_BODY_H\n\n// LOVE\n#include \"common/Object.h\"\n#include \"common/StringMap.h\"\n\nnamespace love\n{\nnamespace physics\n{\n\nclass Body : public Object\n{\npublic:\n\n\tstatic love::Type type;\n\n\tenum Type\n\t{\n\t\tBODY_INVALID,\n\t\tBODY_STATIC,\n\t\tBODY_DYNAMIC,\n\t\tBODY_KINEMATIC,\n\t\tBODY_MAX_ENUM\n\t};\n\n\tvirtual ~Body();\n\n\tstatic bool getConstant(const char *in, Type &out);\n\tstatic bool getConstant(Type in, const char  *&out);\n\tstatic std::vector<std::string> getConstants(Type);\n\nprivate:\n\n\tstatic StringMap<Type, BODY_MAX_ENUM>::Entry typeEntries[];\n\tstatic StringMap<Type, BODY_MAX_ENUM> types;\n};\n\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BODY_H\n"
  },
  {
    "path": "src/modules/physics/Joint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Joint.h\"\n\nnamespace love\n{\nnamespace physics\n{\n\nlove::Type Joint::type(\"Joint\", &Object::type);\n\nJoint::~Joint()\n{\n}\n\nbool Joint::getConstant(const char *in, Type &out)\n{\n\treturn types.find(in, out);\n}\n\nbool Joint::getConstant(Type in, const char  *&out)\n{\n\treturn types.find(in, out);\n}\n\nStringMap<Joint::Type, Joint::JOINT_MAX_ENUM>::Entry Joint::typeEntries[] =\n{\n\t{\"distance\", Joint::JOINT_DISTANCE},\n\t{\"revolute\", Joint::JOINT_REVOLUTE},\n\t{\"prismatic\", Joint::JOINT_PRISMATIC},\n\t{\"mouse\", Joint::JOINT_MOUSE},\n\t{\"pulley\", Joint::JOINT_PULLEY},\n\t{\"gear\", Joint::JOINT_GEAR},\n\t{\"friction\", Joint::JOINT_FRICTION},\n\t{\"weld\", Joint::JOINT_WELD},\n\t{\"wheel\", Joint::JOINT_WHEEL},\n\t{\"rope\", Joint::JOINT_ROPE},\n\t{\"motor\", Joint::JOINT_MOTOR},\n};\n\nStringMap<Joint::Type, Joint::JOINT_MAX_ENUM> Joint::types(Joint::typeEntries, sizeof(Joint::typeEntries));\n\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/Joint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_JOINT_H\n#define LOVE_PHYSICS_JOINT_H\n\n// LOVE\n#include \"common/Object.h\"\n#include \"common/StringMap.h\"\n\nnamespace love\n{\nnamespace physics\n{\n\nclass Joint : public Object\n{\npublic:\n\n\tstatic love::Type type;\n\n\tenum Type\n\t{\n\t\tJOINT_INVALID,\n\t\tJOINT_DISTANCE,\n\t\tJOINT_REVOLUTE,\n\t\tJOINT_PRISMATIC,\n\t\tJOINT_MOUSE,\n\t\tJOINT_PULLEY,\n\t\tJOINT_GEAR,\n\t\tJOINT_FRICTION,\n\t\tJOINT_WELD,\n\t\tJOINT_WHEEL,\n\t\tJOINT_ROPE,\n\t\tJOINT_MOTOR,\n\t\tJOINT_MAX_ENUM\n\t};\n\n\n\tvirtual ~Joint();\n\n\tstatic bool getConstant(const char *in, Type &out);\n\tstatic bool getConstant(Type in, const char  *&out);\n\nprivate:\n\n\tstatic StringMap<Type, JOINT_MAX_ENUM>::Entry typeEntries[];\n\tstatic StringMap<Type, JOINT_MAX_ENUM> types;\n};\n\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/Shape.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Shape.h\"\n\nnamespace love\n{\nnamespace physics\n{\n\nlove::Type Shape::type(\"Shape\", &Object::type);\n\nShape::~Shape()\n{\n}\n\nbool Shape::getConstant(const char *in, Type &out)\n{\n\treturn types.find(in, out);\n}\n\nbool Shape::getConstant(Type in, const char  *&out)\n{\n\treturn types.find(in, out);\n}\n\nStringMap<Shape::Type, Shape::SHAPE_MAX_ENUM>::Entry Shape::typeEntries[] =\n{\n\t{\"circle\", Shape::SHAPE_CIRCLE},\n\t{\"polygon\", Shape::SHAPE_POLYGON},\n\t{\"edge\", Shape::SHAPE_EDGE},\n\t{\"chain\", Shape::SHAPE_CHAIN},\n};\n\nStringMap<Shape::Type, Shape::SHAPE_MAX_ENUM> Shape::types(Shape::typeEntries, sizeof(Shape::typeEntries));\n\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/Shape.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_SHAPE_H\n#define LOVE_PHYSICS_SHAPE_H\n\n// LOVE\n#include \"common/Object.h\"\n#include \"common/StringMap.h\"\n\nnamespace love\n{\nnamespace physics\n{\n\nclass Shape : public Object\n{\npublic:\n\n\tstatic love::Type type;\n\n\tenum Type\n\t{\n\t\tSHAPE_INVALID,\n\t\tSHAPE_CIRCLE,\n\t\tSHAPE_POLYGON,\n\t\tSHAPE_EDGE,\n\t\tSHAPE_CHAIN,\n\t\tSHAPE_MAX_ENUM\n\t};\n\n\tvirtual ~Shape();\n\n\tstatic bool getConstant(const char *in, Type &out);\n\tstatic bool getConstant(Type in, const char  *&out);\n\nprivate:\n\n\tstatic StringMap<Type, SHAPE_MAX_ENUM>::Entry typeEntries[];\n\tstatic StringMap<Type, SHAPE_MAX_ENUM> types;\n};\n\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_SHAPE_H\n"
  },
  {
    "path": "src/modules/physics/box2d/Body.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Body.h\"\n\n#include \"common/math.h\"\n\n#include \"Shape.h\"\n#include \"World.h\"\n#include \"Physics.h\"\n\n// Needed for luax_pushjoint.\n#include \"wrap_Joint.h\"\n#include \"wrap_Shape.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nBody::Body(World *world, b2Vec2 p, Body::Type type)\n\t: world(world)\n\t, hasCustomMass(false)\n{\n\tb2BodyDef def;\n\tdef.position = Physics::scaleDown(p);\n\tdef.userData.pointer = (uintptr_t)this;\n\tbody = world->world->CreateBody(&def);\n\t// Box2D body holds a reference to the love Body.\n\tthis->retain();\n\tthis->setType(type);\n}\n\nBody::~Body()\n{\n\tif (ref)\n\t\tdelete ref;\n}\n\nfloat Body::getX()\n{\n\treturn Physics::scaleUp(body->GetPosition().x);\n}\n\nfloat Body::getY()\n{\n\treturn Physics::scaleUp(body->GetPosition().y);\n}\n\nvoid Body::getPosition(float &x_o, float &y_o)\n{\n\tb2Vec2 v = Physics::scaleUp(body->GetPosition());\n\tx_o = v.x;\n\ty_o = v.y;\n}\n\nvoid Body::getLinearVelocity(float &x_o, float &y_o)\n{\n\tb2Vec2 v = Physics::scaleUp(body->GetLinearVelocity());\n\tx_o = v.x;\n\ty_o = v.y;\n}\n\nfloat Body::getAngle()\n{\n\treturn body->GetAngle();\n}\n\nvoid Body::getWorldCenter(float &x_o, float &y_o)\n{\n\tb2Vec2 v = Physics::scaleUp(body->GetWorldCenter());\n\tx_o = v.x;\n\ty_o = v.y;\n}\n\nvoid Body::getLocalCenter(float &x_o, float &y_o)\n{\n\tb2Vec2 v = Physics::scaleUp(body->GetLocalCenter());\n\tx_o = v.x;\n\ty_o = v.y;\n}\n\nfloat Body::getAngularVelocity() const\n{\n\treturn body->GetAngularVelocity();\n}\n\nvoid Body::getKinematicState(b2Vec2 &pos_o, float &a_o, b2Vec2 &vel_o, float &da_o) const\n{\n\tpos_o = Physics::scaleUp(body->GetPosition());\n\ta_o = body->GetAngle();\n\tvel_o = Physics::scaleUp(body->GetLinearVelocity());\n\tda_o = body->GetAngularVelocity();\n}\n\nfloat Body::getMass() const\n{\n\treturn body->GetMass();\n}\n\nfloat Body::getInertia() const\n{\n\treturn Physics::scaleUp(Physics::scaleUp(body->GetInertia()));\n}\n\nint Body::getMassData(lua_State *L)\n{\n\tb2MassData data;\n\tbody->GetMassData(&data);\n\tb2Vec2 center = Physics::scaleUp(data.center);\n\tlua_pushnumber(L, center.x);\n\tlua_pushnumber(L, center.y);\n\tlua_pushnumber(L, data.mass);\n\tlua_pushnumber(L, Physics::scaleUp(Physics::scaleUp(data.I)));\n\treturn 4;\n}\n\nfloat Body::getAngularDamping() const\n{\n\treturn body->GetAngularDamping();\n}\n\nfloat Body::getLinearDamping() const\n{\n\treturn body->GetLinearDamping();\n}\n\nfloat Body::getGravityScale() const\n{\n\treturn body->GetGravityScale();\n}\n\nBody::Type Body::getType() const\n{\n\tswitch (body->GetType())\n\t{\n\tcase b2_staticBody:\n\t\treturn BODY_STATIC;\n\t\tbreak;\n\tcase b2_dynamicBody:\n\t\treturn BODY_DYNAMIC;\n\t\tbreak;\n\tcase b2_kinematicBody:\n\t\treturn BODY_KINEMATIC;\n\t\tbreak;\n\tdefault:\n\t\treturn BODY_INVALID;\n\t\tbreak;\n\t}\n}\n\nvoid Body::applyLinearImpulse(float jx, float jy, bool wake)\n{\n\tbody->ApplyLinearImpulse(Physics::scaleDown(b2Vec2(jx, jy)), body->GetWorldCenter(), wake);\n}\n\nvoid Body::applyLinearImpulse(float jx, float jy, float rx, float ry, bool wake)\n{\n\tbody->ApplyLinearImpulse(Physics::scaleDown(b2Vec2(jx, jy)), Physics::scaleDown(b2Vec2(rx, ry)), wake);\n}\n\nvoid Body::applyAngularImpulse(float impulse, bool wake)\n{\n\t// Angular impulse is in kg*m^2/s, meaning it needs to be scaled twice\n\tbody->ApplyAngularImpulse(Physics::scaleDown(Physics::scaleDown(impulse)), wake);\n}\n\nvoid Body::applyTorque(float t, bool wake)\n{\n\t// Torque is in N*m, or kg*m^2/s^2, meaning it also needs to be scaled twice\n\tbody->ApplyTorque(Physics::scaleDown(Physics::scaleDown(t)), wake);\n}\n\nvoid Body::applyForce(float fx, float fy, float rx, float ry, bool wake)\n{\n\tbody->ApplyForce(Physics::scaleDown(b2Vec2(fx, fy)), Physics::scaleDown(b2Vec2(rx, ry)), wake);\n}\n\nvoid Body::applyForce(float fx, float fy, bool wake)\n{\n\tbody->ApplyForceToCenter(Physics::scaleDown(b2Vec2(fx, fy)), wake);\n}\n\nvoid Body::setX(float x)\n{\n\tbody->SetTransform(Physics::scaleDown(b2Vec2(x, getY())), getAngle());\n}\n\nvoid Body::setY(float y)\n{\n\tbody->SetTransform(Physics::scaleDown(b2Vec2(getX(), y)), getAngle());\n}\n\nvoid Body::setLinearVelocity(float x, float y)\n{\n\tbody->SetLinearVelocity(Physics::scaleDown(b2Vec2(x, y)));\n}\n\nvoid Body::setAngle(float d)\n{\n\tbody->SetTransform(body->GetPosition(), d);\n}\n\nvoid Body::setAngularVelocity(float r)\n{\n\tbody->SetAngularVelocity(r);\n}\n\nvoid Body::setKinematicState(b2Vec2 pos, float a, b2Vec2 vel, float da)\n{\n\tbody->SetTransform(Physics::scaleDown(pos), a);\n\tbody->SetLinearVelocity(Physics::scaleDown(vel));\n\tbody->SetAngularVelocity(da);\n}\n\nvoid Body::setPosition(float x, float y)\n{\n\tbody->SetTransform(Physics::scaleDown(b2Vec2(x, y)), body->GetAngle());\n}\n\nvoid Body::setAngularDamping(float d)\n{\n\tbody->SetAngularDamping(d);\n}\n\nvoid Body::setLinearDamping(float d)\n{\n\tbody->SetLinearDamping(d);\n}\n\nvoid Body::resetMassData()\n{\n\tbody->ResetMassData();\n\thasCustomMass = false;\n}\n\nvoid Body::setMassData(float x, float y, float m, float i)\n{\n\tb2MassData massData;\n\tmassData.center = Physics::scaleDown(b2Vec2(x, y));\n\tmassData.mass = m;\n\tmassData.I = Physics::scaleDown(Physics::scaleDown(i));\n\tbody->SetMassData(&massData);\n\thasCustomMass = true;\n}\n\nvoid Body::setMass(float m)\n{\n\tb2MassData data;\n\tbody->GetMassData(&data);\n\tdata.mass = m;\n\tbody->SetMassData(&data);\n\thasCustomMass = true;\n}\n\nvoid Body::setInertia(float i)\n{\n\tb2MassData massData;\n\tmassData.center = body->GetLocalCenter();\n\tmassData.mass = body->GetMass();\n\tmassData.I = Physics::scaleDown(Physics::scaleDown(i));\n\tbody->SetMassData(&massData);\n\thasCustomMass = true;\n}\n\nvoid Body::setGravityScale(float scale)\n{\n\tbody->SetGravityScale(scale);\n}\n\nvoid Body::setType(Body::Type type)\n{\n\tswitch (type)\n\t{\n\tcase Body::BODY_STATIC:\n\t\tbody->SetType(b2_staticBody);\n\t\tbreak;\n\tcase Body::BODY_DYNAMIC:\n\t\tbody->SetType(b2_dynamicBody);\n\t\tbreak;\n\tcase Body::BODY_KINEMATIC:\n\t\tbody->SetType(b2_kinematicBody);\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nvoid Body::getWorldPoint(float x, float y, float &x_o, float &y_o)\n{\n\tb2Vec2 v = Physics::scaleUp(body->GetWorldPoint(Physics::scaleDown(b2Vec2(x, y))));\n\tx_o = v.x;\n\ty_o = v.y;\n}\n\nvoid Body::getWorldVector(float x, float y, float &x_o, float &y_o)\n{\n\tb2Vec2 v = Physics::scaleUp(body->GetWorldVector(Physics::scaleDown(b2Vec2(x, y))));\n\tx_o = v.x;\n\ty_o = v.y;\n}\n\nint Body::getWorldPoints(lua_State *L)\n{\n\tint argc = lua_gettop(L);\n\tint vcount = (int)argc/2;\n\t// at least one point\n\tlove::luax_assert_argc(L, 2);\n\n\tfor (int i = 0; i<vcount; i++)\n\t{\n\t\tfloat x = (float)lua_tonumber(L, 1);\n\t\tfloat y = (float)lua_tonumber(L, 2);\n\t\t// Remove them, so we don't run out of stack space\n\t\tlua_remove(L, 1);\n\t\tlua_remove(L, 1);\n\t\t// Time for scaling\n\t\tb2Vec2 point = Physics::scaleUp(body->GetWorldPoint(Physics::scaleDown(b2Vec2(x, y))));\n\t\t// And then we push the result\n\t\tlua_pushnumber(L, point.x);\n\t\tlua_pushnumber(L, point.y);\n\t}\n\n\treturn argc;\n}\n\nvoid Body::getLocalPoint(float x, float y, float &x_o, float &y_o)\n{\n\tb2Vec2 v = Physics::scaleUp(body->GetLocalPoint(Physics::scaleDown(b2Vec2(x, y))));\n\tx_o = v.x;\n\ty_o = v.y;\n}\n\nvoid Body::getLocalVector(float x, float y, float &x_o, float &y_o)\n{\n\tb2Vec2 v = Physics::scaleUp(body->GetLocalVector(Physics::scaleDown(b2Vec2(x, y))));\n\tx_o = v.x;\n\ty_o = v.y;\n}\n\nint Body::getLocalPoints(lua_State *L)\n{\n\tint argc = lua_gettop(L);\n\tint vcount = (int)argc/2;\n\t// at least one point\n\tlove::luax_assert_argc(L, 2);\n\n\tfor (int i = 0; i<vcount; i++)\n\t{\n\t\tfloat x = (float)lua_tonumber(L, 1);\n\t\tfloat y = (float)lua_tonumber(L, 2);\n\t\t// Remove them, so we don't run out of stack space\n\t\tlua_remove(L, 1);\n\t\tlua_remove(L, 1);\n\t\t// Time for scaling\n\t\tb2Vec2 point = Physics::scaleUp(body->GetLocalPoint(Physics::scaleDown(b2Vec2(x, y))));\n\t\t// And then we push the result\n\t\tlua_pushnumber(L, point.x);\n\t\tlua_pushnumber(L, point.y);\n\t}\n\n\treturn argc;\n}\n\nvoid Body::getLinearVelocityFromWorldPoint(float x, float y, float &x_o, float &y_o)\n{\n\tb2Vec2 v = Physics::scaleUp(body->GetLinearVelocityFromWorldPoint(Physics::scaleDown(b2Vec2(x, y))));\n\tx_o = v.x;\n\ty_o = v.y;\n}\n\nvoid Body::getLinearVelocityFromLocalPoint(float x, float y, float &x_o, float &y_o)\n{\n\tb2Vec2 v = Physics::scaleUp(body->GetLinearVelocityFromLocalPoint(Physics::scaleDown(b2Vec2(x, y))));\n\tx_o = v.x;\n\ty_o = v.y;\n}\n\nbool Body::isBullet() const\n{\n\treturn body->IsBullet();\n}\n\nvoid Body::setBullet(bool bullet)\n{\n\treturn body->SetBullet(bullet);\n}\n\nbool Body::isEnabled() const\n{\n\treturn body->IsEnabled();\n}\n\nbool Body::isAwake() const\n{\n\treturn body->IsAwake();\n}\n\nvoid Body::setSleepingAllowed(bool allow)\n{\n\tbody->SetSleepingAllowed(allow);\n}\n\nbool Body::isSleepingAllowed() const\n{\n\treturn body->IsSleepingAllowed();\n}\n\nvoid Body::setEnabled(bool enabled)\n{\n\tbody->SetEnabled(enabled);\n}\n\nvoid Body::setAwake(bool awake)\n{\n\tbody->SetAwake(awake);\n}\n\nvoid Body::setFixedRotation(bool fixed)\n{\n\tbody->SetFixedRotation(fixed);\n}\n\nbool Body::isFixedRotation() const\n{\n\treturn body->IsFixedRotation();\n}\n\nbool Body::isTouching(Body *other) const\n{\n\tconst b2ContactEdge *ce = body->GetContactList();\n\tb2Body *otherbody = other->body;\n\n\twhile (ce != nullptr)\n\t{\n\t\tif (ce->other == otherbody && ce->contact != nullptr && ce->contact->IsTouching())\n\t\t\treturn true;\n\n\t\tce = ce->next;\n\t}\n\n\treturn false;\n}\n\nWorld *Body::getWorld() const\n{\n\treturn world;\n}\n\nShape *Body::getShape() const\n{\n\tb2Fixture *f = body->GetFixtureList();\n\tif (f == nullptr)\n\t\treturn nullptr;\n\n\tShape *shape = (Shape *)(f->GetUserData().pointer);\n\tif (!shape)\n\t\tthrow love::Exception(\"A Shape has escaped Memoizer!\");\n\n\treturn shape;\n}\n\nint Body::getShapes(lua_State *L) const\n{\n\tlua_newtable(L);\n\tb2Fixture *f = body->GetFixtureList();\n\tint i = 1;\n\tdo\n\t{\n\t\tif (!f)\n\t\t\tbreak;\n\t\tShape *shape = (Shape *)(f->GetUserData().pointer);\n\t\tif (!shape)\n\t\t\tthrow love::Exception(\"A Shape has escaped Memoizer!\");\n\t\tluax_pushshape(L, shape);\n\t\tlua_rawseti(L, -2, i);\n\t\ti++;\n\t}\n\twhile ((f = f->GetNext()));\n\treturn 1;\n}\n\nint Body::getJoints(lua_State *L) const\n{\n\tlua_newtable(L);\n\tconst b2JointEdge *je = body->GetJointList();\n\tint i = 1;\n\n\tdo\n\t{\n\t\tif (!je)\n\t\t\tbreak;\n\n\t\tJoint *joint = (Joint *) (je->joint->GetUserData().pointer);\n\t\tif (!joint)\n\t\t\tthrow love::Exception(\"A joint has escaped Memoizer!\");\n\n\t\tluax_pushjoint(L, joint);\n\t\tlua_rawseti(L, -2, i);\n\t\ti++;\n\t}\n\twhile ((je = je->next));\n\n\treturn 1;\n}\n\nint Body::getContacts(lua_State *L) const\n{\n\tlua_newtable(L);\n\tconst b2ContactEdge *ce = body->GetContactList();\n\tint i = 1;\n\tdo\n\t{\n\t\tif (!ce)\n\t\t\tbreak;\n\n\t\tContact *contact = (Contact *) world->findObject(ce->contact);\n\t\tif (!contact)\n\t\t\tcontact = new Contact(world, ce->contact);\n\t\telse\n\t\t\tcontact->retain();\n\n\t\tluax_pushtype(L, contact);\n\t\tcontact->release();\n\t\tlua_rawseti(L, -2, i);\n\t\ti++;\n\t}\n\twhile ((ce = ce->next));\n\treturn 1;\n}\n\nvoid Body::destroy()\n{\n\tif (world->world->IsLocked())\n\t{\n\t\t// Called during time step. Save reference for destruction afterwards.\n\t\tthis->retain();\n\t\tworld->destructBodies.push_back(this);\n\t\treturn;\n\t}\n\n\tworld->world->DestroyBody(body);\n\tbody = nullptr;\n\n\t// Remove userdata reference to avoid it sticking around after GC\n\tif (ref)\n\t\tref->unref();\n\n\t// Box2D body destroyed. Release its reference to the love Body.\n\tthis->release();\n}\n\nint Body::setUserData(lua_State *L)\n{\n\tlove::luax_assert_argc(L, 1, 1);\n\n\tif(!ref)\n\t\tref = new Reference();\n\n\tref->ref(L);\n\n\treturn 0;\n}\n\nint Body::getUserData(lua_State *L)\n{\n\tif (ref != nullptr)\n\t\tref->push(L);\n\telse\n\t\tlua_pushnil(L);\n\n\treturn 1;\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/Body.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_BODY_H\n#define LOVE_PHYSICS_BOX2D_BODY_H\n\n// LOVE\n#include \"common/math.h\"\n#include \"common/runtime.h\"\n#include \"common/Object.h\"\n#include \"physics/Body.h\"\n\n// Box2D\n#include <box2d/Box2D.h>\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n// Forward declarations.\nclass World;\nclass Shape;\n\n/**\n * A Body is an entity which has position and orientation\n * in world space. A Body does have collision geometry\n * by itself, but depend on an arbitrary number of child Shape objects\n * which together constitute the final geometry for the Body.\n **/\nclass Body : public love::physics::Body\n{\npublic:\n\t// Friends.\n\tfriend class Joint;\n\tfriend class DistanceJoint;\n\tfriend class MouseJoint;\n\tfriend class CircleShape;\n\tfriend class PolygonShape;\n\tfriend class Shape;\n\n\t// Public because joints et al ask for b2body\n\tb2Body *body;\n\n\t/**\n\t * Create a Body at position p.\n\t **/\n\tBody(World *world, b2Vec2 p, Type type);\n\n\tvirtual ~Body();\n\n\t/**\n\t * Gets the current x-position of the Body.\n\t **/\n\tfloat getX();\n\n\t/**\n\t * Gets the current y-position of the Body.\n\t **/\n\tfloat getY();\n\n\t/**\n\t * Gets the current angle (deg) of the Body.\n\t **/\n\tfloat getAngle();\n\n\t/**\n\t * Gets the current position of the Body.\n\t * @param[out] x_o The x-component of the position.\n\t * @param[out] y_o The y-component of the position.\n\t **/\n\tvoid getPosition(float &x_o, float &y_o);\n\n\t/**\n\t * Gets the velocity in the current center of mass.\n\t * @param[out] x_o The x-component of the velocity.\n\t * @param[out] y_o The y-component of the velocity.\n\t **/\n\tvoid getLinearVelocity(float &x_o, float &y_o);\n\n\t/**\n\t * The current center of mass for the Body in world\n\t * coordinates.\n\t * @param[out] x_o The x-component of the center of mass.\n\t * @param[out] y_o The y-component of the center of mass.\n\t **/\n\tvoid getWorldCenter(float &x_o, float &y_o);\n\n\t/**\n\t * The current center of mass for the Body in local\n\t * coordinates.\n\t * @param[out] x_o The x-component of the center of mass.\n\t * @param[out] y_o The y-component of the center of mass.\n\t **/\n\tvoid getLocalCenter(float &x_o, float &y_o);\n\n\t/**\n\t * Get the current Body spin. (Angular velocity).\n\t **/\n\tfloat getAngularVelocity() const;\n\n\t/**\n\t * Get the current Body kinematic state. (Position, angle, velocity, angle velocity).\n\t **/\n\tvoid getKinematicState(b2Vec2 &pos_o, float &a_o, b2Vec2& vel_o, float &da_o) const;\n\n\t/**\n\t * Gets the Body's mass.\n\t **/\n\tfloat getMass() const;\n\n\t/**\n\t * Gets the Body's intertia.\n\t **/\n\tfloat getInertia() const;\n\n\t/**\n\t * Gets mass properties.\n\t **/\n\tint getMassData(lua_State *L);\n\n\tbool hasCustomMassData() const { return hasCustomMass; }\n\n\t/**\n\t * Gets the Body's angular damping.\n\t **/\n\tfloat getAngularDamping() const;\n\n\t/**\n\t * Gets the Body's linear damping.\n\t **/\n\tfloat getLinearDamping() const;\n\n\t/**\n\t * Gets the Body's gravity scale.\n\t **/\n\tfloat getGravityScale() const;\n\n\t/**\n\t * Gets the type of body this is.\n\t **/\n\tType getType() const;\n\n\t/**\n\t * Apply an impulse (jx, jy) with offset (0, 0).\n\t **/\n\tvoid applyLinearImpulse(float jx, float jy, bool wake);\n\n\t/**\n\t * Apply an impulse (jx, jy) with offset (rx, ry).\n\t **/\n\tvoid applyLinearImpulse(float jx, float jy, float rx, float ry, bool wake);\n\n\t/**\n\t * Apply an angular impulse to the body.\n\t **/\n\tvoid applyAngularImpulse(float impulse, bool wake);\n\n\t/**\n\t * Apply torque (t).\n\t **/\n\tvoid applyTorque(float t, bool wake);\n\n\t/**\n\t * Apply force (fx, fy) with offset (0, 0).\n\t **/\n\tvoid applyForce(float fx, float fy, bool wake);\n\n\t/**\n\t * Apply force (fx, fy) with offset (rx, ry).\n\t **/\n\tvoid applyForce(float fx, float fy, float rx, float ry, bool wake);\n\n\t/**\n\t * Sets the x-position of the Body.\n\t **/\n\tvoid setX(float x);\n\n\t/**\n\t * Sets the Y-position of the Body.\n\t **/\n\tvoid setY(float y);\n\n\t/**\n\t * Sets the current velocity of the Body.\n\t **/\n\tvoid setLinearVelocity(float x, float y);\n\n\t/**\n\t * Sets the angle of the Body.\n\t **/\n\tvoid setAngle(float d);\n\n\t/**\n\t * Sets the current spin of the Body.\n\t **/\n\tvoid setAngularVelocity(float r);\n\n\t/**\n\t * Set the current Body kinematic state. (Position, angle, velocity, angle velocity).\n\t **/\n\tvoid setKinematicState(b2Vec2 pos, float a, b2Vec2 vel, float da);\n\n\t/**\n\t * Sets the current position of the Body.\n\t **/\n\tvoid setPosition(float x, float y);\n\n\t/**\n\t * Sets the mass from the currently attatched shapes.\n\t **/\n\tvoid resetMassData();\n\n\t/**\n\t * Sets mass properties.\n\t * @param x The x-coordinate for the local center of mass.\n\t * @param y The y-coordinate for the local center of mass.\n\t * @param m The mass.\n\t * @param i The inertia.\n\t **/\n\tvoid setMassData(float x, float y, float m, float i);\n\n\t/**\n\t * Sets just the mass. This is provided as a LOVE bonus. Lovely!\n\t * @param m The mass.\n\t **/\n\tvoid setMass(float m);\n\n\t/**\n\t * Sets the inertia while keeping the other properties\n\t * (mass and local center).\n\t * @param i The inertia.\n\t **/\n\tvoid setInertia(float i);\n\n\t/**\n\t * Sets the Body's angular damping.\n\t **/\n\tvoid setAngularDamping(float d);\n\n\t/**\n\t * Sets the Body's linear damping.\n\t **/\n\tvoid setLinearDamping(float d);\n\n\t/**\n\t * Sets the Body's gravity scale.\n\t **/\n\tvoid setGravityScale(float scale);\n\n\t/**\n\t * Sets the type of body this is.\n\t **/\n\tvoid setType(Type type);\n\n\t/**\n\t * Transforms a point (x, y) from local coordinates\n\t * to world coordinates.\n\t * @param x The x-coordinate of the local point.\n\t * @param y The y-coordinate of the local point.\n\t * @param[out] x_o The x-coordinate of the point in world coordinates.\n\t * @param[out] y_o The y-coordinate of the point in world coordinates.\n\t **/\n\tvoid getWorldPoint(float x, float y, float &x_o, float &y_o);\n\n\t/**\n\t * Transforms a vector (x, y) from local coordinates\n\t * to world coordinates.\n\t * @param x The x-coordinate of the local vector.\n\t * @param y The y-coordinate of the local vector.\n\t * @param[out] x_o The x-coordinate of the vector in world coordinates.\n\t * @param[out] y_o The y-coordinate of the vector in world coordinates.\n\t **/\n\tvoid getWorldVector(float x, float y, float &x_o, float &y_o);\n\n\t/**\n\t * Transforms a series of points (x, y) from local coordinates\n\t * to world coordinates.\n\t **/\n\tint getWorldPoints(lua_State *L);\n\n\t/**\n\t * Transforms a point (x, y) from world coordinates\n\t * to local coordinates.\n\t * @param x The x-coordinate of the world point.\n\t * @param y The y-coordinate of the world point.\n\t * @param[out] x_o The x-coordinate of the point in local coordinates.\n\t * @param[out] y_o The y-coordinate of the point in local coordinates.\n\t **/\n\tvoid getLocalPoint(float x, float y, float &x_o, float &y_o);\n\n\t/**\n\t * Transforms a vector (x, y) from world coordinates\n\t * to local coordinates.\n\t * @param x The x-coordinate of the world vector.\n\t * @param y The y-coordinate of the world vector.\n\t * @param[out] x_o The x-coordinate of the vector in local coordinates.\n\t * @param[out] y_o The y-coordinate of the vector in local coordinates.\n\t **/\n\tvoid getLocalVector(float x, float y, float &x_o, float &y_o);\n\n\t/**\n\t * Transforms a series of points (x, y) from world coordinates\n\t * to local coordinates.\n\t **/\n\tint getLocalPoints(lua_State *L);\n\n\t/**\n\t * Gets the velocity on the Body for the given world point.\n\t * @param x The x-coordinate of the world point.\n\t * @param y The y-coordinate of the world point.\n\t * @param[out] x_o The x-component of the velocity vector.\n\t * @param[out] y_o The y-component of the velocity vector.\n\t **/\n\tvoid getLinearVelocityFromWorldPoint(float x, float y, float &x_o, float &y_o);\n\n\t/**\n\t * Gets the velocity on the Body for the given local point.\n\t * @param x The x-coordinate of the local point.\n\t * @param y The y-coordinate of the local point.\n\t * @param[out] x_o The x-component of the velocity vector.\n\t * @param[out] y_o The y-component of the velocity vector.\n\t **/\n\tvoid getLinearVelocityFromLocalPoint(float x, float y, float &x_o, float &y_o);\n\n\t/**\n\t * Returns true if the Body is a bullet, false otherwise.\n\t **/\n\tbool isBullet() const;\n\n\t/**\n\t * Set whether this Body should be treated as a bullet.\n\t * Bullets require more processing power than normal shapes.\n\t **/\n\tvoid setBullet(bool bullet);\n\n\t/**\n\t * Checks whether a Body is active or not. An inactive body\n\t * cannot be interacted with.\n\t **/\n\tbool isEnabled() const;\n\n\t/**\n\t * Checks whether a Body is awake or not. A Body\n\t * will fall to sleep if nothing happens to it for while.\n\t **/\n\tbool isAwake() const;\n\n\t/**\n\t * Controls whether this Body should be allowed to sleep.\n\t **/\n\tvoid setSleepingAllowed(bool allow);\n\tbool isSleepingAllowed() const;\n\n\t/**\n\t * Changes the body's active state.\n\t **/\n\tvoid setEnabled(bool enabled);\n\n\t/**\n\t * Changes the body's sleep state.\n\t **/\n\tvoid setAwake(bool awake);\n\n\tvoid setFixedRotation(bool fixed);\n\tbool isFixedRotation() const;\n\n\tbool isTouching(Body *other) const;\n\n\t/**\n\t * Get the World this Body resides in.\n\t */\n\tWorld *getWorld() const;\n\n\t/**\n\t * Gets the first Shape attached to this Body.\n\t **/\n\tShape *getShape() const;\n\n\t/**\n\t * Get an array of all the Shapes attached to this Body.\n\t **/\n\tint getShapes(lua_State *L) const;\n\n\t/**\n\t * Get an array of all Joints attached to this Body.\n\t **/\n\tint getJoints(lua_State *L) const;\n\n\t/**\n\t * Get an array of all active Contacts attached to this Body.\n\t * This list changes during World:update and you may miss some collisions\n\t * if you don't use the collision callbacks.\n\t **/\n\tint getContacts(lua_State *L) const;\n\n\t/**\n\t * Destroy this body.\n\t **/\n\tvoid destroy();\n\n\t/**\n\t * This function stores an in-C reference to\n\t * arbitrary Lua data in the Box2D Body object.\n\t **/\n\tint setUserData(lua_State *L);\n\n\t/**\n\t * Gets the data set with setData. If no\n\t * data is set, nil is returned.\n\t **/\n\tint getUserData(lua_State *L);\n\nprivate:\n\n\t// FIXME: This should be a weak reference, rather than being completely\n\t// unowned?\n\tWorld *world;\n\n\tbool hasCustomMass;\n\n\t// Reference to arbitrary data.\n\tReference* ref = nullptr;\n\n}; // Body\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_BODY_H\n"
  },
  {
    "path": "src/modules/physics/box2d/ChainShape.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"ChainShape.h\"\n\n// Module\n#include \"Body.h\"\n#include \"World.h\"\n#include \"Physics.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nlove::Type ChainShape::type(\"ChainShape\", &Shape::type);\n\nChainShape::ChainShape(Body *body, const b2ChainShape &c)\n\t: Shape(body, c)\n{\n}\n\nChainShape::~ChainShape()\n{\n}\n\nvoid ChainShape::setNextVertex(float x, float y)\n{\n\tthrowIfShapeNotValid();\n\tb2Vec2 v(x, y);\n\tb2ChainShape *c = (b2ChainShape *)shape;\n\tc->m_nextVertex = Physics::scaleDown(v);\n}\n\nvoid ChainShape::setPreviousVertex(float x, float y)\n{\n\tthrowIfShapeNotValid();\n\tb2Vec2 v(x, y);\n\tb2ChainShape *c = (b2ChainShape *)shape;\n\tc->m_prevVertex = Physics::scaleDown(v);\n}\n\nb2Vec2 ChainShape::getNextVertex() const\n{\n\tthrowIfShapeNotValid();\n\tb2ChainShape *c = (b2ChainShape *)shape;\n\treturn Physics::scaleUp(c->m_nextVertex);\n}\n\nb2Vec2 ChainShape::getPreviousVertex() const\n{\n\tthrowIfShapeNotValid();\n\tb2ChainShape *c = (b2ChainShape *)shape;\n\treturn Physics::scaleUp(c->m_prevVertex);\n}\n\nEdgeShape *ChainShape::getChildEdge(int index) const\n{\n\tthrowIfShapeNotValid();\n\n\tb2ChainShape *c = (b2ChainShape *)shape;\n\n\tb2EdgeShape e;\n\tc->GetChildEdge(&e, index);\n\n\treturn new EdgeShape(nullptr, e);\n}\n\nint ChainShape::getVertexCount() const\n{\n\tthrowIfShapeNotValid();\n\tb2ChainShape *c = (b2ChainShape *)shape;\n\treturn c->m_count;\n}\n\nb2Vec2 ChainShape::getPoint(int index) const\n{\n\tthrowIfShapeNotValid();\n\tb2ChainShape *c = (b2ChainShape *)shape;\n\tif (index < 0 || index >= c->m_count)\n\t\tthrow love::Exception(\"Physics error: index out of bounds\");\n\tconst b2Vec2 &v = c->m_vertices[index];\n\treturn Physics::scaleUp(v);\n}\n\nconst b2Vec2 *ChainShape::getPoints() const\n{\n\tthrowIfShapeNotValid();\n\tb2ChainShape *c = (b2ChainShape *)shape;\n\treturn c->m_vertices;\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/ChainShape.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_CHAIN_SHAPE_H\n#define LOVE_PHYSICS_BOX2D_CHAIN_SHAPE_H\n\n// Module\n#include \"Shape.h\"\n#include \"EdgeShape.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\n/**\n * A ChainShape is a freeform collection of line segments.\n **/\nclass ChainShape : public Shape\n{\npublic:\n\n\tstatic love::Type type;\n\n\t/**\n\t * Create a new ChainShape from a Box2D chain shape.\n\t * @param c The chain shape.\n\t **/\n\tChainShape(Body *body, const b2ChainShape &c);\n\n\tvirtual ~ChainShape();\n\n\t/**\n\t * Establish connectivity to a vertex that follows\n\t * the last vertex. Fails if called on a loop.\n\t * @param x The x-coordinate of the vertex.\n\t * @param y The y-coordinate of the vertex.\n\t **/\n\tvoid setNextVertex(float x, float y);\n\n\t/**\n\t * Establish connectivity to a vertex that precedes\n\t * the first vertex. Fails if called on a loop.\n\t * @param x The x-coordinate of the vertex.\n\t * @param y The y-coordinate of the vertex.\n\t **/\n\tvoid setPreviousVertex(float x, float y);\n\n\t/**\n\t * Gets the vertex that follows the last vertex.\n\t **/\n\tb2Vec2 getNextVertex() const;\n\n\t/**\n\t * Gets the vertex that precedes the first vertex.\n\t **/\n\tb2Vec2 getPreviousVertex() const;\n\n\t/**\n\t * Returns a child EdgeShape.\n\t * @param index The index of the child shape.\n\t * @returns The specified child.\n\t **/\n\tEdgeShape *getChildEdge(int index) const;\n\n\t/**\n\t * Returns the number of vertices in the shape.\n\t * @returns The number of vertices in the shape.\n\t **/\n\tint getVertexCount() const;\n\n\t/**\n\t * Returns the vertex at the given index.\n\t * @param index The index of the vertex.\n\t * @returns The specified vertex.\n\t **/\n\tb2Vec2 getPoint(int index) const;\n\n\t/**\n\t * Returns all of the vertices.\n\t * @returns The vertices the shape comprises.\n\t **/\n\tconst b2Vec2 *getPoints() const;\n\n};\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_CHAIN_SHAPE_H\n"
  },
  {
    "path": "src/modules/physics/box2d/CircleShape.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"CircleShape.h\"\n\n// Module\n#include \"Body.h\"\n#include \"World.h\"\n#include \"Physics.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nlove::Type CircleShape::type(\"CircleShape\", &Shape::type);\n\nCircleShape::CircleShape(Body *body, const b2CircleShape &c)\n\t: Shape(body, c)\n{\n}\n\nCircleShape::~CircleShape()\n{\n}\n\nfloat CircleShape::getRadius() const\n{\n\tthrowIfShapeNotValid();\n\treturn Physics::scaleUp(shape->m_radius);\n}\n\nvoid CircleShape::setRadius(float r)\n{\n\tthrowIfShapeNotValid();\n\tshape->m_radius = Physics::scaleDown(r);\n}\n\nvoid CircleShape::getPoint(float &x_o, float &y_o) const\n{\n\tthrowIfShapeNotValid();\n\tb2CircleShape *c = (b2CircleShape *) shape;\n\tx_o = Physics::scaleUp(c->m_p.x);\n\ty_o = Physics::scaleUp(c->m_p.y);\n}\n\nvoid CircleShape::setPoint(float x, float y)\n{\n\tthrowIfShapeNotValid();\n\tb2CircleShape *c = (b2CircleShape *) shape;\n\tc->m_p = Physics::scaleDown(b2Vec2(x, y));\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/CircleShape.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_CIRCLE_SHAPE_H\n#define LOVE_PHYSICS_BOX2D_CIRCLE_SHAPE_H\n\n// Module\n#include \"Shape.h\"\n\n#include <vector>\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\n/**\n * A CircleShape represent a Circle which can\n * be used for collision detection and physics.\n *\n * The CircleShape is much faster than the PolygonShape,\n * and should generally be used where possible.\n **/\nclass CircleShape : public Shape\n{\npublic:\n\n\tstatic love::Type type;\n\n\t/**\n\t * Create a new CircleShape from the a Box2D CircleShape definition.\n\t * @param c The CircleShape definition.\n\t **/\n\tCircleShape(Body *body, const b2CircleShape &c);\n\n\tvirtual ~CircleShape();\n\n\t/**\n\t * Gets the radius for the circle.\n\t **/\n\tfloat getRadius() const;\n\n\t/**\n\t * Sets the radius of the circle.\n\t **/\n\tvoid setRadius(float r);\n\n\t/**\n\t * Gets the position of the circle.\n\t **/\n\tvoid getPoint(float &x_o, float &y_o) const;\n\n\t/**\n\t * Sets the position for the circle.\n\t **/\n\tvoid setPoint(float x, float y);\n\n}; // CircleShape\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_CIRCLE_SHAPE_H\n"
  },
  {
    "path": "src/modules/physics/box2d/Contact.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Contact.h\"\n#include \"World.h\"\n#include \"Physics.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nlove::Type Contact::type(\"Contact\", &Object::type);\n\nContact::Contact(World *world, b2Contact *contact)\n\t: contact(contact)\n\t, world(world)\n{\n\tworld->registerObject(contact, this);\n}\n\nContact::~Contact()\n{\n\tinvalidate();\n}\n\nvoid Contact::invalidate()\n{\n\tif (contact != nullptr)\n\t{\n\t\tworld->unregisterObject(contact);\n\t\tcontact = nullptr;\n\t}\n}\n\nbool Contact::isValid()\n{\n\treturn contact != nullptr;\n}\n\nint Contact::getPositions(lua_State *L)\n{\n\tlove::luax_assert_argc(L, 1, 1);\n\tb2WorldManifold manifold;\n\tcontact->GetWorldManifold(&manifold);\n\tint points = contact->GetManifold()->pointCount;\n\tfor (int i = 0; i < points; i++)\n\t{\n\t\tb2Vec2 position = Physics::scaleUp(manifold.points[i]);\n\t\tlua_pushnumber(L, position.x);\n\t\tlua_pushnumber(L, position.y);\n\t}\n\treturn points*2;\n}\n\nint Contact::getNormal(lua_State *L)\n{\n\tlove::luax_assert_argc(L, 1, 1);\n\tb2WorldManifold manifold;\n\tcontact->GetWorldManifold(&manifold);\n\tlua_pushnumber(L, manifold.normal.x);\n\tlua_pushnumber(L, manifold.normal.y);\n\treturn 2;\n}\n\nfloat Contact::getFriction() const\n{\n\treturn contact->GetFriction();\n}\n\nfloat Contact::getRestitution() const\n{\n\treturn contact->GetRestitution();\n}\n\nbool Contact::isEnabled() const\n{\n\treturn contact->IsEnabled();\n}\n\nbool Contact::isTouching() const\n{\n\treturn contact->IsTouching();\n}\n\nvoid Contact::setFriction(float friction)\n{\n\tcontact->SetFriction(friction);\n}\n\nvoid Contact::setRestitution(float restitution)\n{\n\tcontact->SetRestitution(restitution);\n}\n\nvoid Contact::setEnabled(bool enabled)\n{\n\tcontact->SetEnabled(enabled);\n}\n\nvoid Contact::resetFriction()\n{\n\tcontact->ResetFriction();\n}\n\nvoid Contact::resetRestitution()\n{\n\tcontact->ResetRestitution();\n}\n\nvoid Contact::setTangentSpeed(float speed)\n{\n\tcontact->SetTangentSpeed(speed);\n}\n\nfloat Contact::getTangentSpeed() const\n{\n\treturn contact->GetTangentSpeed();\n}\n\nvoid Contact::getChildren(int &childA, int &childB)\n{\n\tchildA = contact->GetChildIndexA();\n\tchildB = contact->GetChildIndexB();\n}\n\nvoid Contact::getShapes(Shape *&shapeA, Shape *&shapeB)\n{\n\tshapeA = (Shape *) (contact->GetFixtureA()->GetUserData().pointer);\n\tshapeB = (Shape *) (contact->GetFixtureB()->GetUserData().pointer);\n\n\tif (!shapeA || !shapeB)\n\t\tthrow love::Exception(\"A Shape has escaped Memoizer!\");\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/Contact.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_CONTACT_H\n#define LOVE_PHYSICS_BOX2D_CONTACT_H\n\n// LOVE\n#include \"common/Object.h\"\n#include \"common/runtime.h\"\n#include \"World.h\"\n\n// Box2D\n#include <box2d/Box2D.h>\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nclass World;\n\n/**\n * A Contact represents a collision point between\n * two shapes.\n **/\nclass Contact : public Object\n{\npublic:\n\t// Friends.\n\tfriend class World;\n\tfriend class World::ContactCallback;\n\n\tstatic love::Type type;\n\n\t/**\n\t * Creates a new Contact by copying a Box2D contact\n\t * point. It does not store the pointer, but copy the\n\t * data pointed to.\n\t * @param contact Pointer to the Box2D contact.\n\t **/\n\tContact(World *world, b2Contact *contact);\n\n\tvirtual ~Contact();\n\n\t/**\n\t * Removes the b2Contact pointer from Memoizer and sets it\n\t * to null on the Contact.\n\t **/\n\tvoid invalidate();\n\n\t/**\n\t * Returns if the Contact still points to a valid b2Contact.\n\t * @return True if the contact is still valid or false if it has been destroyed.\n\t **/\n\tbool isValid();\n\n\t/**\n\t * Gets the position of each point of contact.\n\t * @return The position along the x-axis.\n\t * @return The position along the y-axis.\n\t **/\n\tint getPositions(lua_State *L);\n\n\t/**\n\t * Gets the collision normal.\n\t * @return The x-component of the normal.\n\t * @return The y-component of the normal.\n\t **/\n\tint getNormal(lua_State *L);\n\n\t/**\n\t * The mixed friction between the two fixtures at\n\t * the point of impact.\n\t **/\n\tfloat getFriction() const;\n\n\t/**\n\t * The mixed restitution of the two fixtures\n\t * at the point of impact.\n\t **/\n\tfloat getRestitution() const;\n\n\t/**\n\t * Check if the contact is enabled.\n\t **/\n\tbool isEnabled() const;\n\n\t/**\n\t * Check if the contact is touching.\n\t **/\n\tbool isTouching() const;\n\n\t// Only call the setters in PreSolve\n\n\t/**\n\t * Override the default friction mixture.\n\t **/\n\tvoid setFriction(float friction);\n\n\t/**\n\t * Override the default restitution mixture.\n\t **/\n\tvoid setRestitution(float restitution);\n\n\t/**\n\t * Enable/disable this contact.\n\t **/\n\tvoid setEnabled(bool enabled);\n\n\t/**\n\t * Reset the friction mixture to the default\n\t * value.\n\t **/\n\tvoid resetFriction();\n\n\t/**\n\t * Reset the restitution mixture to the default\n\t * value.\n\t **/\n\tvoid resetRestitution();\n\n\t/**\n\t * Set the desired tangent speed.\n\t **/\n\tvoid setTangentSpeed(float speed);\n\n\t/**\n\t * Get the desired tangent speed.\n\t **/\n\tfloat getTangentSpeed() const;\n\n\tvoid getChildren(int &childA, int &childB);\n\n\t/**\n\t * Gets the Shapes associated with this Contact.\n\t **/\n\tvoid getShapes(Shape *&shapeA, Shape *&shapeB);\n\nprivate:\n\n\t// The Box2D contact.\n\tb2Contact *contact;\n\n\tWorld *world;\n};\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_CONTACT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/DistanceJoint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"DistanceJoint.h\"\n\n// Module\n#include \"Body.h\"\n#include \"World.h\"\n#include \"Physics.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nlove::Type DistanceJoint::type(\"DistanceJoint\", &Joint::type);\n\nDistanceJoint::DistanceJoint(Body *body1, Body *body2, float x1, float y1, float x2, float y2, bool collideConnected)\n\t: Joint(body1, body2)\n\t, joint(NULL)\n{\n\tb2DistanceJointDef def;\n\tdef.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(x1,y1)), Physics::scaleDown(b2Vec2(x2,y2)));\n\tdef.collideConnected = collideConnected;\n\tjoint = (b2DistanceJoint *)createJoint(&def);\n}\n\nDistanceJoint::~DistanceJoint()\n{\n}\n\nvoid DistanceJoint::setLength(float length)\n{\n\tjoint->SetLength(Physics::scaleDown(length));\n}\n\nfloat DistanceJoint::getLength() const\n{\n\treturn Physics::scaleUp(joint->GetLength());\n}\n\nvoid DistanceJoint::setStiffness(float k)\n{\n\tjoint->SetStiffness(k);\n}\n\nfloat DistanceJoint::getStiffness() const\n{\n\treturn joint->GetStiffness();\n}\n\nvoid DistanceJoint::setDamping(float d)\n{\n\tjoint->SetDamping(d);\n}\n\nfloat DistanceJoint::getDamping() const\n{\n\treturn joint->GetDamping();\n}\n\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/DistanceJoint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_DISTANCE_JOINT_H\n#define LOVE_PHYSICS_BOX2D_DISTANCE_JOINT_H\n\n// Module\n#include \"Joint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\n/**\n * The DistanceJoint keeps Bodies at a fixed distance\n * from eachother.\n **/\nclass DistanceJoint : public Joint\n{\npublic:\n\n\tstatic love::Type type;\n\n\t/**\n\t * Creates a DistanceJoint connecting body1 to body2.\n\t **/\n\tDistanceJoint(Body *body1, Body *body2, float x1, float y1, float x2, float y2, bool collideConnected);\n\n\tvirtual ~DistanceJoint();\n\n\t/**\n\t * Sets the equilibrium distance between the two bodies.\n\t **/\n\tvoid setLength(float length);\n\n\t/**\n\t * Gets the equilibrium distance between the two bodies.\n\t **/\n\tfloat getLength() const;\n\n\t/**\n\t * Sets the response speed. Dependent of mass\n\t **/\n\tvoid setStiffness(float k);\n\n\t/**\n\t * Gets the response speed. Dependent of mass\n\t **/\n\tfloat getStiffness() const;\n\n\t/**\n\t * Set the spring damping. Dependent of mass\n\t **/\n\tvoid setDamping(float ratio);\n\n\t/**\n\t * Get the spring damping. Dependent of mass\n\t **/\n\tfloat getDamping() const;\n\nprivate:\n\t// The Box2D DistanceJoint object.\n\tb2DistanceJoint *joint;\n};\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_DISTANCE_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/EdgeShape.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"EdgeShape.h\"\n\n// Module\n#include \"Body.h\"\n#include \"World.h\"\n#include \"Physics.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nlove::Type EdgeShape::type(\"EdgeShape\", &Shape::type);\n\nEdgeShape::EdgeShape(Body *body, const b2EdgeShape &e)\n\t: Shape(body, e)\n{\n}\n\nEdgeShape::~EdgeShape()\n{\n}\n\nvoid EdgeShape::setNextVertex(float x, float y)\n{\n\tthrowIfShapeNotValid();\n\tb2EdgeShape *e = (b2EdgeShape *)shape;\n\tb2Vec2 v(x, y);\n\te->m_vertex3 = Physics::scaleDown(v);\n\te->m_oneSided = true;\n}\n\nb2Vec2 EdgeShape::getNextVertex() const\n{\n\tthrowIfShapeNotValid();\n\tb2EdgeShape *e = (b2EdgeShape *)shape;\n\treturn Physics::scaleUp(e->m_vertex3);\n}\n\nvoid EdgeShape::setPreviousVertex(float x, float y)\n{\n\tthrowIfShapeNotValid();\n\tb2EdgeShape *e = (b2EdgeShape *)shape;\n\tb2Vec2 v(x, y);\n\te->m_vertex0 = Physics::scaleDown(v);\n\te->m_oneSided = true;\n}\n\nb2Vec2 EdgeShape::getPreviousVertex() const\n{\n\tthrowIfShapeNotValid();\n\tb2EdgeShape *e = (b2EdgeShape *)shape;\n\treturn Physics::scaleUp(e->m_vertex0);\n}\n\nint EdgeShape::getPoints(lua_State *L)\n{\n\tthrowIfShapeNotValid();\n\tb2EdgeShape *e = (b2EdgeShape *)shape;\n\tb2Vec2 v1 = Physics::scaleUp(e->m_vertex1);\n\tb2Vec2 v2 = Physics::scaleUp(e->m_vertex2);\n\tlua_pushnumber(L, v1.x);\n\tlua_pushnumber(L, v1.y);\n\tlua_pushnumber(L, v2.x);\n\tlua_pushnumber(L, v2.y);\n\treturn 4;\n\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/EdgeShape.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_EDGE_SHAPE_H\n#define LOVE_PHYSICS_BOX2D_EDGE_SHAPE_H\n\n// Module\n#include \"Shape.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\n/**\n * An Edge is just a line segment. Edges are designed to\n * be connected and/or chained together.\n **/\nclass EdgeShape : public Shape\n{\npublic:\n\n\tstatic love::Type type;\n\n\t/**\n\t * Create a new EdgeShape from a Box2D edge shape.\n\t * @param e The edge shape.\n\t **/\n\tEdgeShape(Body *body, const b2EdgeShape &e);\n\n\tvirtual ~EdgeShape();\n\n\tvoid setNextVertex(float x, float y);\n\tb2Vec2 getNextVertex() const;\n\n\tvoid setPreviousVertex(float x, float y);\n\tb2Vec2 getPreviousVertex() const;\n\n\t/**\n\t * Returns the transformed points of the edge shape.\n\t * This function is useful for debug drawing and such.\n\t *\n\t * The result can be directly passed into love.graphics.line().\n\t **/\n\tint getPoints(lua_State *L);\n};\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_EDGE_SHAPE_H\n"
  },
  {
    "path": "src/modules/physics/box2d/FrictionJoint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"FrictionJoint.h\"\n\n#include \"common/math.h\"\n\n// Module\n#include \"Body.h\"\n#include \"World.h\"\n#include \"Physics.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nlove::Type FrictionJoint::type(\"FrictionJoint\", &Joint::type);\n\nFrictionJoint::FrictionJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected)\n\t: Joint(body1, body2)\n\t, joint(NULL)\n{\n\tb2FrictionJointDef def;\n\tdef.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(xA,yA)));\n\tdef.localAnchorB = body2->body->GetLocalPoint(Physics::scaleDown(b2Vec2(xB, yB)));\n\tdef.collideConnected = collideConnected;\n\tjoint = (b2FrictionJoint *)createJoint(&def);\n}\n\nFrictionJoint::~FrictionJoint()\n{\n}\n\nvoid FrictionJoint::setMaxForce(float force)\n{\n\tjoint->SetMaxForce(Physics::scaleDown(force));\n}\n\nfloat FrictionJoint::getMaxForce() const\n{\n\treturn Physics::scaleUp(joint->GetMaxForce());\n}\n\nvoid FrictionJoint::setMaxTorque(float torque)\n{\n\tjoint->SetMaxTorque(Physics::scaleDown(Physics::scaleDown(torque)));\n}\n\nfloat FrictionJoint::getMaxTorque() const\n{\n\treturn Physics::scaleUp(Physics::scaleUp(joint->GetMaxTorque()));\n}\n\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/FrictionJoint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_FRICTION_JOINT_H\n#define LOVE_PHYSICS_BOX2D_FRICTION_JOINT_H\n\n// Module\n#include \"Joint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\n/**\n * A FrictionJoint applies friction to a body.\n **/\nclass FrictionJoint : public Joint\n{\npublic:\n\n\tstatic love::Type type;\n\n\t/**\n\t * Creates a new FrictionJoint connecting body1 and body2.\n\t **/\n\tFrictionJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected);\n\n\tvirtual ~FrictionJoint();\n\n\t/**\n\t * Sets the maximum friction force in Newtons.\n\t **/\n\tvoid setMaxForce(float force);\n\n\t/**\n\t * Gets the maximum friction force in Newtons.\n\t **/\n\tfloat getMaxForce() const;\n\n\t/**\n\t * Sets the maximum friction torque in Newton-meters.\n\t **/\n\tvoid setMaxTorque(float torque);\n\n\t/**\n\t * Gets the maximum friction torque in Newton-meters.\n\t **/\n\tfloat getMaxTorque() const;\n\nprivate:\n\n\t// The Box2D friction joint object.\n\tb2FrictionJoint *joint;\n};\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_FRICTION_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/GearJoint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"GearJoint.h\"\n\n// Module\n#include \"Body.h\"\n#include \"World.h\"\n#include \"common/Exception.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nlove::Type GearJoint::type(\"GearJoint\", &Joint::type);\n\nGearJoint::GearJoint(Joint *joint1, Joint *joint2, float ratio, bool collideConnected)\n\t: Joint(joint1->body2, joint2->body2)\n\t, joint(NULL)\n{\n\tb2GearJointDef def;\n\tdef.joint1 = joint1->joint;\n\tdef.joint2 = joint2->joint;\n\tdef.bodyA = joint1->body2->body;\n\tdef.bodyB = joint2->body2->body;\n\tdef.ratio = ratio;\n\tdef.collideConnected = collideConnected;\n\n\tjoint = (b2GearJoint *)createJoint(&def);\n}\n\nGearJoint::~GearJoint()\n{\n}\n\nvoid GearJoint::setRatio(float ratio)\n{\n\tjoint->SetRatio(ratio);\n}\n\nfloat GearJoint::getRatio() const\n{\n\treturn joint->GetRatio();\n}\n\nJoint *GearJoint::getJointA() const\n{\n\tb2Joint *b2joint = joint->GetJoint1();\n\tif (b2joint == nullptr)\n\t\treturn nullptr;\n\n\tJoint *j = (Joint *) (b2joint->GetUserData().pointer);\n\tif (j == nullptr)\n\t\tthrow love::Exception(\"A joint has escaped Memoizer!\");\n\n\treturn j;\n}\n\nJoint *GearJoint::getJointB() const\n{\n\tb2Joint *b2joint = joint->GetJoint2();\n\tif (b2joint == nullptr)\n\t\treturn nullptr;\n\n\tJoint *j = (Joint *) (b2joint->GetUserData().pointer);\n\tif (j == nullptr)\n\t\tthrow love::Exception(\"A joint has escaped Memoizer!\");\n\n\treturn j;\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/GearJoint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_GEAR_JOINT_H\n#define LOVE_PHYSICS_BOX2D_GEAR_JOINT_H\n\n// Module\n#include \"Joint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\n/**\n * A gear joint is used to connect two joints together. Either joint\n * can be a revolute or prismatic joint. You specify a gear ratio\n * to bind the motions together:\n * coordinate1 + ratio * coordinate2 = constant\n *\n * The ratio can be negative or positive. If one joint is a revolute joint\n * and the other joint is a prismatic joint, then the ratio will have units\n * of length or units of 1/length.\n * Warning: The revolute and prismatic joints must be attached to\n * fixed bodies (which must be body1 on those joints).\n **/\nclass GearJoint : public Joint\n{\npublic:\n\n\tstatic love::Type type;\n\n\t/**\n\t * Creates a GearJoint connecting joint1 to joint2.\n\t **/\n\tGearJoint(Joint *joint1, Joint *joint2, float ratio, bool collideConnected);\n\n\tvirtual ~GearJoint();\n\n\t/**\n\t * Sets the ratio.\n\t **/\n\tvoid setRatio(float ratio);\n\n\t/**\n\t * Gets the ratio.\n\t **/\n\tfloat getRatio() const;\n\n\tJoint *getJointA() const;\n\tJoint *getJointB() const;\n\nprivate:\n\t// The Box2D GearJoint object.\n\tb2GearJoint *joint;\n};\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_GEAR_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/Joint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Joint.h\"\n\n// STD\n#include <bitset>\n\n// Module\n#include \"Body.h\"\n#include \"World.h\"\n#include \"Physics.h\"\n\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nJoint::Joint(Body *body1)\n\t: world(body1->world)\n\t, body1(body1)\n\t, body2(nullptr)\n{\n}\n\nJoint::Joint(Body *body1, Body *body2)\n\t: world(body1->world)\n\t, body1(body1)\n\t, body2(body2)\n{\n}\n\nJoint::~Joint()\n{\n\tif (ref)\n\t\tdelete ref;\n}\n\nJoint::Type Joint::getType() const\n{\n\tswitch (joint->GetType())\n\t{\n\tcase e_revoluteJoint:\n\t\treturn JOINT_REVOLUTE;\n\tcase e_prismaticJoint:\n\t\treturn JOINT_PRISMATIC;\n\tcase e_distanceJoint:\n\t\treturn JOINT_DISTANCE;\n\tcase e_pulleyJoint:\n\t\treturn JOINT_PULLEY;\n\tcase e_mouseJoint:\n\t\treturn JOINT_MOUSE;\n\tcase e_gearJoint:\n\t\treturn JOINT_GEAR;\n\tcase e_frictionJoint:\n\t\treturn JOINT_FRICTION;\n\tcase e_weldJoint:\n\t\treturn JOINT_WELD;\n\tcase e_wheelJoint:\n\t\treturn JOINT_WHEEL;\n\tcase e_ropeJoint:\n\t\treturn JOINT_ROPE;\n\tcase e_motorJoint:\n\t\treturn JOINT_MOTOR;\n\tdefault:\n\t\treturn JOINT_INVALID;\n\t}\n}\n\nBody *Joint::getBodyA() const\n{\n\tb2Body *b2body = joint->GetBodyA();\n\tif (b2body == nullptr)\n\t\treturn nullptr;\n\n\tBody *body = (Body *) (b2body->GetUserData().pointer);\n\tif (body == nullptr)\n\t\tthrow love::Exception(\"A body has escaped Memoizer!\");\n\n\treturn body;\n}\n\nBody *Joint::getBodyB() const\n{\n\tb2Body *b2body = joint->GetBodyB();\n\tif (b2body == nullptr)\n\t\treturn nullptr;\n\n\tBody *body = (Body *) (b2body->GetUserData().pointer);\n\tif (body == nullptr)\n\t\tthrow love::Exception(\"A body has escaped Memoizer!\");\n\n\treturn body;\n}\n\nbool Joint::isValid() const\n{\n\treturn joint != nullptr;\n}\n\nint Joint::getAnchors(lua_State *L)\n{\n\tlua_pushnumber(L, Physics::scaleUp(joint->GetAnchorA().x));\n\tlua_pushnumber(L, Physics::scaleUp(joint->GetAnchorA().y));\n\tlua_pushnumber(L, Physics::scaleUp(joint->GetAnchorB().x));\n\tlua_pushnumber(L, Physics::scaleUp(joint->GetAnchorB().y));\n\treturn 4;\n}\n\nint Joint::getReactionForce(lua_State *L)\n{\n\tfloat dt = (float)luaL_checknumber(L, 1);\n\tb2Vec2 v = Physics::scaleUp(joint->GetReactionForce(dt));\n\tlua_pushnumber(L, v.x);\n\tlua_pushnumber(L, v.y);\n\treturn 2;\n}\n\nfloat Joint::getReactionTorque(float dt)\n{\n\treturn Physics::scaleUp(Physics::scaleUp(joint->GetReactionTorque(dt)));\n}\n\nb2Joint *Joint::createJoint(b2JointDef *def)\n{\n\tdef->userData.pointer = (uintptr_t)this;\n\tjoint = world->world->CreateJoint(def);\n\t// Box2D joint has a reference to this love Joint.\n\tthis->retain();\n\treturn joint;\n}\n\nvoid Joint::destroyJoint(bool implicit)\n{\n\tif (world->world->IsLocked())\n\t{\n\t\t// Called during time step. Save reference for destruction afterwards.\n\t\tthis->retain();\n\t\tworld->destructJoints.push_back(this);\n\t\treturn;\n\t}\n\n\tif (!implicit && joint != nullptr)\n\t\tworld->world->DestroyJoint(joint);\n\tjoint = nullptr;\n\n\t// Remove userdata reference to avoid it sticking around after GC\n\tif (ref)\n\t\tref->unref();\n\n\t// Release the reference of the Box2D joint.\n\tthis->release();\n}\n\nbool Joint::isEnabled() const\n{\n\treturn joint->IsEnabled();\n}\n\nbool Joint::getCollideConnected() const\n{\n\treturn joint->GetCollideConnected();\n}\n\nint Joint::setUserData(lua_State *L)\n{\n\tlove::luax_assert_argc(L, 1, 1);\n\n\tif(!ref)\n\t\tref = new Reference();\n\n\tref->ref(L);\n\n\treturn 0;\n}\n\nint Joint::getUserData(lua_State *L)\n{\n\tif (ref != nullptr)\n\t\tref->push(L);\n\telse\n\t\tlua_pushnil(L);\n\n\treturn 1;\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/Joint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_JOINT_H\n#define LOVE_PHYSICS_BOX2D_JOINT_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"physics/Joint.h\"\n\n// Box2D\n#include <box2d/Box2D.h>\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\n// Forward declarations.\nclass Body;\nclass World;\n\n/**\n * A Joint acts as positioning constraints on Bodies.\n * A Joint can be used to prevent Bodies from going to\n * far apart, or coming too close together.\n **/\nclass Joint : public love::physics::Joint\n{\npublic:\n\tfriend class GearJoint;\n\n\t/**\n\t * This constructor will connect one end of the joint to body1,\n\t * and the other one to the default ground body.\n\t *\n\t * This constructor is mainly used by MouseJoint.\n\t **/\n\tJoint(Body *body1);\n\n\t/**\n\t * Create a joint between body1 and body2.\n\t **/\n\tJoint(Body *body1, Body *body2);\n\n\tvirtual ~Joint();\n\n\t/**\n\t * Returns true if the joint is active in a Box2D world.\n\t **/\n\tbool isValid() const;\n\n\t/**\n\t * Gets the type of joint.\n\t **/\n\tType getType() const;\n\n\tvirtual Body *getBodyA() const;\n\tvirtual Body *getBodyB() const;\n\n\t/**\n\t * Gets the anchor positions of the Joint in world\n\t * coordinates. This is useful for debugdrawing the joint.\n\t **/\n\tint getAnchors(lua_State *L);\n\n\t/**\n\t * Gets the reaction force on body2 at the joint anchor.\n\t **/\n\tint getReactionForce(lua_State *L);\n\n\t/**\n\t * Gets the reaction torque on body2.\n\t **/\n\tfloat getReactionTorque(float dt);\n\n\tbool isEnabled() const;\n\n\tbool getCollideConnected() const;\n\n\t/**\n\t * This function stores an in-C reference to arbitrary Lua data in the Box2D\n\t * Joint object.\n\t **/\n\tint setUserData(lua_State *L);\n\n\t/**\n\t * Gets the data set with setUserData. If no data is set, nil is returned.\n\t **/\n\tint getUserData(lua_State *L);\n\n\t/**\n\t * Joints require pointers to a Box2D joint objects at\n\t * different polymorphic levels, which is why these function\n\t * were created.\n\t **/\n\n\t/**\n\t * Destroys the joint. This function was created just to\n\t * get some cinsistency.\n\t **/\n\tvoid destroyJoint(bool implicit = false);\n\nprotected:\n\n\t/**\n\t * Creates a Joint, and ensures that the parent class\n\t * gets a copy of the pointer.\n\t **/\n\tb2Joint *createJoint(b2JointDef *def);\n\n\tWorld *world;\n\n\t// Reference to arbitrary data.\n\tReference* ref = nullptr;\n\nprivate:\n\n\t// A Joint must be destroyed *before* the bodies it acts upon,\n\t// and the world they reside in. We therefore need refs\n\t// parents and associations to prevent wrong destruction order.\n\tBody *body1, * body2;\n\n\n\t// The Box2D joint object.\n\tb2Joint *joint;\n\n}; // Joint\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/MotorJoint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"MotorJoint.h\"\n\n// Module\n#include \"Body.h\"\n#include \"World.h\"\n#include \"Physics.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nlove::Type MotorJoint::type(\"MotorJoint\", &Joint::type);\n\nMotorJoint::MotorJoint(Body *body1, Body *body2)\n\t: Joint(body1, body2)\n\t, joint(NULL)\n{\n\tb2MotorJointDef def;\n\n\tdef.Initialize(body1->body, body2->body);\n\tjoint = (b2MotorJoint *) createJoint(&def);\n}\n\nMotorJoint::MotorJoint(Body *body1, Body *body2, float correctionFactor, bool collideConnected)\n\t: Joint(body1, body2)\n\t, joint(NULL)\n{\n\tb2MotorJointDef def;\n\n\tdef.Initialize(body1->body, body2->body);\n\tdef.correctionFactor = correctionFactor;\n\tdef.collideConnected = collideConnected;\n\n\tjoint = (b2MotorJoint *) createJoint(&def);\n}\n\nMotorJoint::~MotorJoint()\n{\n}\n\nvoid MotorJoint::setLinearOffset(float x, float y)\n{\n\tjoint->SetLinearOffset(Physics::scaleDown(b2Vec2(x, y)));\n}\n\nint MotorJoint::getLinearOffset(lua_State *L) const\n{\n\tlua_pushnumber(L, Physics::scaleUp(joint->GetLinearOffset().x));\n\tlua_pushnumber(L, Physics::scaleUp(joint->GetLinearOffset().y));\n\treturn 2;\n}\n\nvoid MotorJoint::setAngularOffset(float angularOffset)\n{\n\tjoint->SetAngularOffset(angularOffset);\n}\n\nfloat MotorJoint::getAngularOffset() const\n{\n\treturn joint->GetAngularOffset();\n}\n\nvoid MotorJoint::setMaxForce(float force)\n{\n\tjoint->SetMaxForce(Physics::scaleDown(force));\n}\n\nfloat MotorJoint::getMaxForce() const\n{\n\treturn Physics::scaleUp(joint->GetMaxForce());\n}\n\nvoid MotorJoint::setMaxTorque(float torque)\n{\n\tjoint->SetMaxTorque(Physics::scaleDown(Physics::scaleDown(torque)));\n}\n\nfloat MotorJoint::getMaxTorque() const\n{\n\treturn Physics::scaleUp(Physics::scaleUp(joint->GetMaxTorque()));\n}\n\nvoid MotorJoint::setCorrectionFactor(float factor)\n{\n\tjoint->SetCorrectionFactor(factor);\n}\n\nfloat MotorJoint::getCorrectionFactor() const\n{\n\treturn joint->GetCorrectionFactor();\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/MotorJoint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_MOTOR_JOINT_H\n#define LOVE_PHYSICS_BOX2D_MOTOR_JOINT_H\n\n// Module\n#include \"Joint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\n/**\n * A motor joint is used to control the relative motion\n * between two bodies. A typical usage is to control the movement\n * of a dynamic body with respect to the ground.\n */\nclass MotorJoint : public Joint\n{\npublic:\n\n\tstatic love::Type type;\n\n\tMotorJoint(Body *body1, Body* body2);\n\tMotorJoint(Body *body1, Body* body2, float correctionFactor, bool collideConnected);\n\tvirtual ~MotorJoint();\n\n\t/// Set/get the target linear offset, in frame A, in meters.\n\tvoid setLinearOffset(float x, float y);\n\tint getLinearOffset(lua_State *L) const;\n\n\t/// Set/get the target angular offset, in radians.\n\tvoid setAngularOffset(float angularOffset);\n\tfloat getAngularOffset() const;\n\n\t/// Set the maximum friction force.\n\tvoid setMaxForce(float force);\n\n\t/// Get the maximum friction force.\n\tfloat getMaxForce() const;\n\n\t/// Set the maximum friction torque.\n\tvoid setMaxTorque(float torque);\n\n\t/// Get the maximum friction torque.\n\tfloat getMaxTorque() const;\n\n\t/// Set the position correction factor in the range [0,1].\n\tvoid setCorrectionFactor(float factor);\n\n\t/// Get the position correction factor in the range [0,1].\n\tfloat getCorrectionFactor() const;\n\nprivate:\n\n\t// The Box2D MotorJoint object.\n\tb2MotorJoint *joint;\n\n}; // MotorJoint\n\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_MOTOR_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/MouseJoint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"MouseJoint.h\"\n\n// Module\n#include \"Body.h\"\n#include \"World.h\"\n#include \"Physics.h\"\n\n#include <float.h>\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nlove::Type MouseJoint::type(\"MouseJoint\", &Joint::type);\n\nMouseJoint::MouseJoint(Body *body1, float x, float y)\n\t: Joint(body1)\n\t, joint(NULL)\n{\n\tif (body1->getType() == Body::BODY_KINEMATIC)\n\t\tthrow love::Exception(\"Cannot attach a MouseJoint to a kinematic body\");\n\n\tb2MouseJointDef def;\n\n\tdef.bodyA = body1->world->getGroundBody();\n\tdef.bodyB = body1->body;\n\tdef.maxForce = 1000.0f * body1->body->GetMass();\n\tdef.target = Physics::scaleDown(b2Vec2(x,y));\n\tPhysics::computeLinearStiffness(def.stiffness, def.damping, 5.0, 0.7, def.bodyA, def.bodyB);\n\tjoint = (b2MouseJoint *)createJoint(&def);\n}\n\nMouseJoint::~MouseJoint()\n{\n}\n\nvoid MouseJoint::setTarget(float x, float y)\n{\n\tjoint->SetTarget(Physics::scaleDown(b2Vec2(x, y)));\n}\n\nint MouseJoint::getTarget(lua_State *L)\n{\n\tlua_pushnumber(L, Physics::scaleUp(joint->GetTarget().x));\n\tlua_pushnumber(L, Physics::scaleUp(joint->GetTarget().y));\n\treturn 2;\n}\n\nvoid MouseJoint::setMaxForce(float force)\n{\n\tjoint->SetMaxForce(Physics::scaleDown(force));\n}\n\nfloat MouseJoint::getMaxForce() const\n{\n\treturn Physics::scaleUp(joint->GetMaxForce());\n}\n\nvoid MouseJoint::setStiffness(float k)\n{\n\t// This is kind of a crappy check. The Stiffness is used in an internal\n\t// box2d calculation whose result must be > FLT_EPSILON, but other variables\n\t// go into that calculation...\n\tif (k <= FLT_EPSILON * 2)\n\t\tthrow love::Exception(\"MouseJoint Stiffness must be a positive number.\");\n\n\tjoint->SetStiffness(k);\n}\n\nfloat MouseJoint::getStiffness() const\n{\n\treturn joint->GetStiffness();\n}\n\nvoid MouseJoint::setDamping(float d)\n{\n\tjoint->SetDamping(d);\n}\n\nfloat MouseJoint::getDamping() const\n{\n\treturn joint->GetDamping();\n}\n\nBody *MouseJoint::getBodyA() const\n{\n\treturn Joint::getBodyB();\n}\n\nBody *MouseJoint::getBodyB() const\n{\n\treturn nullptr;\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/MouseJoint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_MOUSE_JOINT_H\n#define LOVE_PHYSICS_BOX2D_MOUSE_JOINT_H\n\n// Module\n#include \"Joint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\n/**\n * The MouseJoint is a joint type that\n * is suitable for controlling objects with the mouse.\n *\n * One end is anchored in the dynamic body, and the other id\n * anchor to a static ground body. The anchor offset can then be\n * moved to the current mouse position.\n **/\nclass MouseJoint : public Joint\n{\npublic:\n\n\tstatic love::Type type;\n\n\t/**\n\t * Creates a MouseJoint which connects body1 to the target point.\n\t **/\n\tMouseJoint(Body *body1, float x, float y);\n\n\tvirtual ~MouseJoint();\n\n\t/**\n\t * Sets the target of anchor2. (You usually want\n\t * to set this to the current mouse.)\n\t **/\n\tvoid setTarget(float x, float y);\n\n\t/**\n\t * Gets the current anchor2 target.\n\t **/\n\tint getTarget(lua_State *L);\n\n\t/**\n\t * Sets the maximum constraint force that can be exerted\n\t * to move the candidate body.\n\t **/\n\tvoid setMaxForce(float force);\n\n\t/**\n\t * Gets the maximum constraint force that can be exerted\n\t * to move the candidate body.\n\t **/\n\tfloat getMaxForce() const;\n\n\t/**\n\t * Sets the response speed. Independent of mass\n\t **/\n\tvoid setFrequency(float hz);\n\n\t/**\n\t * Gets the response speed. Independent of mass\n\t **/\n\tfloat getFrequency() const;\n\n\t/**\n\t * Set the spring damping ratio. Independent of mass\n\t **/\n\tvoid setDampingRatio(float ratio);\n\n\t/**\n\t * Get the spring damping ratio. Independent of mass\n\t **/\n\tfloat getDampingRatio() const;\n\n\t/**\n\t * Sets the response speed. Dependent of mass\n\t **/\n\tvoid setStiffness(float k);\n\n\t/**\n\t * Gets the response speed. Dependent of mass\n\t **/\n\tfloat getStiffness() const;\n\n\t/**\n\t * Set the spring damping. Dependent of mass\n\t **/\n\tvoid setDamping(float ratio);\n\n\t/**\n\t * Get the spring damping. Dependent of mass\n\t **/\n\tfloat getDamping() const;\n\n\tvirtual Body *getBodyA() const;\n\tvirtual Body *getBodyB() const;\n\nprivate:\n\t// The Box2D MouseJoint object.\n\tb2MouseJoint *joint;\n};\n\n} // box2d\n} // physics\n} // love\n\n\n#endif // LOVE_PHYSICS_BOX2D_MOUSE_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/Physics.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Physics.h\"\n\n// LOVE\n#include \"common/math.h\"\n#include \"wrap_Body.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\n// TODO: Make this not static.\nfloat Physics::meter = Physics::DEFAULT_METER;\n\nPhysics::Physics()\n\t: Module(M_PHYSICS, \"love.physics.box2d\")\n\t, blockAllocator()\n{\n\tmeter = DEFAULT_METER;\n}\n\nPhysics::~Physics()\n{\n}\n\nWorld *Physics::newWorld(float gx, float gy, bool sleep)\n{\n\treturn new World(b2Vec2(gx, gy), sleep);\n}\n\nBody *Physics::newBody(World *world, float x, float y, Body::Type type)\n{\n\treturn new Body(world, b2Vec2(x, y), type);\n}\n\nBody *Physics::newBody(World *world, Body::Type type)\n{\n\treturn new Body(world, b2Vec2(0, 0), type);\n}\n\nBody *Physics::newCircleBody(World *world, Body::Type type, float x, float y, float radius)\n{\n\tStrongRef<Body> body(newBody(world, x, y, type), Acquire::NORETAIN);\n\tStrongRef<CircleShape> shape(newCircleShape(body, 0, 0, radius), Acquire::NORETAIN);\n\tbody->retain();\n\treturn body.get();\n}\n\nBody *Physics::newRectangleBody(World *world, Body::Type type, float x, float y, float w, float h, float angle)\n{\n\tStrongRef<Body> body(newBody(world, x, y, type), Acquire::NORETAIN);\n\tStrongRef<PolygonShape> shape(newRectangleShape(body, 0, 0, w, h, angle), Acquire::NORETAIN);\n\tbody->retain();\n\treturn body.get();\n}\n\nBody *Physics::newPolygonBody(World *world, Body::Type type, const Vector2 *coords, int count)\n{\n\tVector2 origin(0, 0);\n\n\tfor (int i = 0; i < count; i++)\n\t\torigin += coords[i] / count;\n\n\tstd::vector<Vector2> localcoords;\n\tfor (int i = 0; i < count; i++)\n\t\tlocalcoords.push_back(coords[i] - origin);\n\n\tStrongRef<Body> body(newBody(world, origin.x, origin.y, type), Acquire::NORETAIN);\n\tStrongRef<PolygonShape> shape(newPolygonShape(body, localcoords.data(), count), Acquire::NORETAIN);\n\tbody->retain();\n\treturn body.get();\n}\n\nBody *Physics::newEdgeBody(World *world, Body::Type type, float x1, float y1, float x2, float y2)\n{\n\tfloat wx = (x2 - x1) / 2.0f;\n\tfloat wy = (y2 - y1) / 2.0f;\n\tStrongRef<Body> body(newBody(world, wx, wy, type), Acquire::NORETAIN);\n\tStrongRef<EdgeShape> shape(newEdgeShape(body, x1 - wx, y1 - wy, x2 - wx, y2 - wy), Acquire::NORETAIN);\n\tbody->retain();\n\treturn body.get();\n}\n\nBody *Physics::newEdgeBody(World *world, Body::Type type, float x1, float y1, float x2, float y2, float prevx, float prevy, float nextx, float nexty)\n{\n\tfloat wx = (x2 - x1) / 2.0f;\n\tfloat wy = (y2 - y1) / 2.0f;\n\tStrongRef<Body> body(newBody(world, wx, wy, type), Acquire::NORETAIN);\n\tStrongRef<EdgeShape> shape(newEdgeShape(body, x1 - wx, y1 - wy, x2 - wx, y2 - wy, prevx - wx, prevy - wy, nextx - wx, nexty - wy), Acquire::NORETAIN);\n\tbody->retain();\n\treturn body.get();\n}\n\nBody *Physics::newChainBody(World *world, Body::Type type, bool loop, const Vector2 *coords, int count)\n{\n\tVector2 origin(0, 0);\n\n\tfor (int i = 0; i < count; i++)\n\t\torigin += coords[i] / count;\n\n\tstd::vector<Vector2> localcoords;\n\tfor (int i = 0; i < count; i++)\n\t\tlocalcoords.push_back(coords[i] - origin);\n\n\tStrongRef<Body> body(newBody(world, origin.x, origin.y, type), Acquire::NORETAIN);\n\tStrongRef<ChainShape> shape(newChainShape(body, loop, localcoords.data(), count), Acquire::NORETAIN);\n\tbody->retain();\n\treturn body.get();\n}\n\nShape *Physics::newAttachedShape(Body *body, Shape *prototype, float density)\n{\n\tif (prototype->isValid())\n\t\tthrow love::Exception(\"The given Shape must not be part of the World.\");\n\n\tShape *shape = nullptr;\n\n\tswitch (prototype->getType())\n\t{\n\tcase Shape::SHAPE_CIRCLE:\n\t\tshape = new CircleShape(body, *(b2CircleShape *) prototype->shape);\n\t\tbreak;\n\tcase Shape::SHAPE_POLYGON:\n\t\tshape = new PolygonShape(body, *(b2PolygonShape *) prototype->shape);\n\t\tbreak;\n\tcase Shape::SHAPE_EDGE:\n\t\tshape = new EdgeShape(body, *(b2EdgeShape *) prototype->shape);\n\t\tbreak;\n\tcase Shape::SHAPE_CHAIN:\n\t\tshape = new ChainShape(body, *(b2ChainShape *) prototype->shape);\n\t\tbreak;\n\tdefault:\n\t\tthrow love::Exception(\"Unknown shape type.\");\n\t\tbreak;\n\t}\n\n\tshape->setDensity(density);\n\tbody->resetMassData();\n\n\treturn shape;\n}\n\nCircleShape *Physics::newCircleShape(Body *body, float x, float y, float radius)\n{\n\tb2CircleShape s;\n\ts.m_p = Physics::scaleDown(b2Vec2(x, y));\n\ts.m_radius = Physics::scaleDown(radius);\n\treturn new CircleShape(body, s);\n}\n\nPolygonShape *Physics::newRectangleShape(Body *body, float x, float y, float w, float h, float angle)\n{\n\tb2PolygonShape s;\n\ts.SetAsBox(Physics::scaleDown(w/2.0f), Physics::scaleDown(h/2.0f), Physics::scaleDown(b2Vec2(x, y)), angle);\n\treturn new PolygonShape(body, s);\n}\n\nEdgeShape *Physics::newEdgeShape(Body *body, float x1, float y1, float x2, float y2)\n{\n\tb2EdgeShape s;\n\ts.SetTwoSided(Physics::scaleDown(b2Vec2(x1, y1)), Physics::scaleDown(b2Vec2(x2, y2)));\n\treturn new EdgeShape(body, s);\n}\n\nEdgeShape *Physics::newEdgeShape(Body *body, float x1, float y1, float x2, float y2, float prevx, float prevy, float nextx, float nexty)\n{\n\tb2EdgeShape s;\n\tb2Vec2 v0 = Physics::scaleDown(b2Vec2(prevx, prevy));\n\tb2Vec2 v1 = Physics::scaleDown(b2Vec2(x1, y1));\n\tb2Vec2 v2 = Physics::scaleDown(b2Vec2(x2, y2));\n\tb2Vec2 v3 = Physics::scaleDown(b2Vec2(nextx, nexty));\n\ts.SetOneSided(v0, v1, v2, v3);\n\treturn new EdgeShape(body, s);\n}\n\nPolygonShape *Physics::newPolygonShape(Body *body, const Vector2 *coords, int count)\n{\n\t// 3 to 8 (b2_maxPolygonVertices) vertices\n\tif (count < 3)\n\t\tthrow love::Exception(\"Expected a minimum of 3 vertices, got %d.\", count);\n\telse if (count > b2_maxPolygonVertices)\n\t\tthrow love::Exception(\"Expected a maximum of %d vertices, got %d.\", b2_maxPolygonVertices, count);\n\n\tb2Vec2 vecs[b2_maxPolygonVertices];\n\n\tfor (int i = 0; i < count; i++)\n\t\tvecs[i] = Physics::scaleDown(b2Vec2(coords[i].x, coords[i].y));\n\n\tb2PolygonShape s;\n\n\ts.Set(vecs, count);\n\n\treturn new PolygonShape(body, s);\n}\n\nChainShape *Physics::newChainShape(Body *body, bool loop, const Vector2 *coords, int count)\n{\n\tstd::vector<b2Vec2> vecs;\n\n\tfor (int i = 0; i < count; i++)\n\t\tvecs.push_back(Physics::scaleDown(b2Vec2(coords[i].x, coords[i].y)));\n\n\tb2ChainShape s;\n\n\tif (loop)\n\t\ts.CreateLoop(vecs.data(), count);\n\telse\n\t\ts.CreateChain(vecs.data(), count, vecs[0], vecs[count - 1]);\n\n\treturn new ChainShape(body, s);\n}\n\nDistanceJoint *Physics::newDistanceJoint(Body *body1, Body *body2, float x1, float y1, float x2, float y2, bool collideConnected)\n{\n\treturn new DistanceJoint(body1, body2, x1, y1, x2, y2, collideConnected);\n}\n\nMouseJoint *Physics::newMouseJoint(Body *body, float x, float y)\n{\n\treturn new MouseJoint(body, x, y);\n}\n\nRevoluteJoint *Physics::newRevoluteJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected)\n{\n\treturn new RevoluteJoint(body1, body2, xA, yA, xB, yB, collideConnected);\n}\n\nRevoluteJoint *Physics::newRevoluteJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected, float referenceAngle)\n{\n\treturn new RevoluteJoint(body1, body2, xA, yA, xB, yB, collideConnected, referenceAngle);\n}\n\nPrismaticJoint *Physics::newPrismaticJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected)\n{\n\treturn new PrismaticJoint(body1, body2, xA, yA, xB, yB, ax, ay, collideConnected);\n}\n\nPrismaticJoint *Physics::newPrismaticJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected, float referenceAngle)\n{\n\treturn new PrismaticJoint(body1, body2, xA, yA, xB, yB, ax, ay, collideConnected, referenceAngle);\n}\n\nPulleyJoint *Physics::newPulleyJoint(Body *body1, Body *body2, b2Vec2 groundAnchor1, b2Vec2 groundAnchor2, b2Vec2 anchor1, b2Vec2 anchor2, float ratio, bool collideConnected)\n{\n\treturn new PulleyJoint(body1, body2, groundAnchor1, groundAnchor2, anchor1, anchor2, ratio, collideConnected);\n}\n\nGearJoint *Physics::newGearJoint(Joint *joint1, Joint *joint2, float ratio, bool collideConnected)\n{\n\treturn new GearJoint(joint1, joint2, ratio, collideConnected);\n}\n\nFrictionJoint *Physics::newFrictionJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected)\n{\n\treturn new FrictionJoint(body1, body2, xA, yA, xB, yB, collideConnected);\n}\n\nWeldJoint *Physics::newWeldJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected)\n{\n\treturn new WeldJoint(body1, body2, xA, yA, xB, yB, collideConnected);\n}\n\nWeldJoint *Physics::newWeldJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected, float referenceAngle)\n{\n\treturn new WeldJoint(body1, body2, xA, yA, xB, yB, collideConnected, referenceAngle);\n}\n\nWheelJoint *Physics::newWheelJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected)\n{\n\treturn new WheelJoint(body1, body2, xA, yA, xB, yB, ax, ay, collideConnected);\n}\n\nRopeJoint *Physics::newRopeJoint(Body *body1, Body *body2, float x1, float y1, float x2, float y2, float maxLength, bool collideConnected)\n{\n\treturn new RopeJoint(body1, body2, x1, y1, x2, y2, maxLength, collideConnected);\n}\n\nMotorJoint *Physics::newMotorJoint(Body *body1, Body *body2)\n{\n\treturn new MotorJoint(body1, body2);\n}\n\nMotorJoint *Physics::newMotorJoint(Body *body1, Body *body2, float correctionFactor, bool collideConnected)\n{\n\treturn new MotorJoint(body1, body2, correctionFactor, collideConnected);\n}\n\nint Physics::getDistance(lua_State *L)\n{\n\tShape *shapeA = luax_checktype<Shape>(L, 1);\n\tShape *shapeB = luax_checktype<Shape>(L, 2);\n\tb2DistanceProxy pA, pB;\n\tb2DistanceInput i;\n\tb2DistanceOutput o;\n\tb2SimplexCache c;\n\tc.count = 0;\n\n\tluax_catchexcept(L, [&]() {\n\t\tif (!shapeA->isValid() || !shapeB->isValid())\n\t\t\tthrow love::Exception(\"The given Shape is not active in the physics World.\");\n\n\t\tpA.Set(shapeA->fixture->GetShape(), 0);\n\t\tpB.Set(shapeB->fixture->GetShape(), 0);\n\t\ti.proxyA = pA;\n\t\ti.proxyB = pB;\n\t\ti.transformA = shapeA->fixture->GetBody()->GetTransform();\n\t\ti.transformB = shapeB->fixture->GetBody()->GetTransform();\n\t\ti.useRadii = true;\n\t\tb2Distance(&o, &c, &i);\n\t});\n\n\tlua_pushnumber(L, Physics::scaleUp(o.distance));\n\tlua_pushnumber(L, Physics::scaleUp(o.pointA.x));\n\tlua_pushnumber(L, Physics::scaleUp(o.pointA.y));\n\tlua_pushnumber(L, Physics::scaleUp(o.pointB.x));\n\tlua_pushnumber(L, Physics::scaleUp(o.pointB.y));\n\treturn 5;\n}\n\nvoid Physics::setMeter(float scale)\n{\n\tif (scale < 1) throw love::Exception(\"Physics error: invalid meter\");\n\tPhysics::meter = scale;\n}\n\nfloat Physics::getMeter()\n{\n\treturn meter;\n}\n\nvoid Physics::scaleDown(float &x, float &y)\n{\n\tx /= meter;\n\ty /= meter;\n}\n\nvoid Physics::scaleUp(float &x, float &y)\n{\n\tx *= meter;\n\ty *= meter;\n}\n\nfloat Physics::scaleDown(float f)\n{\n\treturn f/meter;\n}\n\nfloat Physics::scaleUp(float f)\n{\n\treturn f*meter;\n}\n\nb2Vec2 Physics::scaleDown(const b2Vec2 &v)\n{\n\tb2Vec2 t = v;\n\tscaleDown(t.x, t.y);\n\treturn t;\n}\n\nb2Vec2 Physics::scaleUp(const b2Vec2 &v)\n{\n\tb2Vec2 t = v;\n\tscaleUp(t.x, t.y);\n\treturn t;\n}\n\nb2AABB Physics::scaleDown(const b2AABB &aabb)\n{\n\tb2AABB t;\n\tt.lowerBound = scaleDown(aabb.lowerBound);\n\tt.upperBound = scaleDown(aabb.upperBound);\n\treturn t;\n}\n\nb2AABB Physics::scaleUp(const b2AABB &aabb)\n{\n\tb2AABB t;\n\tt.lowerBound = scaleUp(aabb.lowerBound);\n\tt.upperBound = scaleUp(aabb.upperBound);\n\treturn t;\n}\n\nvoid Physics::computeLinearStiffness(float &stiffness, float &damping, float frequency, float dampingRatio, b2Body *bodyA, b2Body *bodyB)\n{\n\tb2LinearStiffness(stiffness, damping, frequency, dampingRatio, bodyA, bodyB);\n}\n\nvoid Physics::computeLinearFrequency(float &frequency, float &ratio, float stiffness, float damping, b2Body *bodyA, b2Body *bodyB)\n{\n\tfloat massA = bodyA->GetMass();\n\tfloat massB = bodyB->GetMass();\n\tfloat mass;\n\tif (massA > 0.0f && massB > 0.0f)\n\t{\n\t\tmass = massA * massB / (massA + massB);\n\t}\n\telse if (massA > 0.0f)\n\t{\n\t\tmass = massA;\n\t}\n\telse\n\t{\n\t\tmass = massB;\n\t}\n\n\tif (mass == 0.0f || stiffness <= 0.0f)\n\t{\n\t\tfrequency = 0.0f;\n\t\tratio = 0.0f;\n\t\treturn;\n\t};\n\n\tfloat omega = b2Sqrt(stiffness / mass);\n\tfrequency = omega / (2.0f * b2_pi);\n\tratio = damping / (mass * 2.0f * omega);\n}\n\nvoid Physics::computeAngularStiffness(float &stiffness, float &damping, float frequency, float dampingRatio, b2Body *bodyA, b2Body *bodyB)\n{\n\tb2AngularStiffness(stiffness, damping, frequency, dampingRatio, bodyA, bodyB);\n}\n\nvoid Physics::computeAngularFrequency(float &frequency, float &ratio, float stiffness, float damping, b2Body *bodyA, b2Body *bodyB)\n{\n\tfloat IA = bodyA->GetInertia();\n\tfloat IB = bodyB->GetInertia();\n\tfloat I;\n\tif (IA > 0.0f && IB > 0.0f)\n\t{\n\t\tI = IA * IB / (IA + IB);\n\t}\n\telse if (IA > 0.0f)\n\t{\n\t\tI = IA;\n\t}\n\telse\n\t{\n\t\tI = IB;\n\t}\n\n\tif (I == 0.0f || stiffness <= 0.0f)\n\t{\n\t\tfrequency = 0.0f;\n\t\tratio = 0.0f;\n\t\treturn;\n\t};\n\n\tfloat omega = b2Sqrt(stiffness / I);\n\tfrequency = omega / (2.0f * b2_pi);\n\tratio = damping / (I * 2.0f * omega);\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/Physics.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_PHYSICS_H\n#define LOVE_PHYSICS_BOX2D_PHYSICS_H\n\n// LOVE\n#include \"common/Module.h\"\n#include \"common/Vector.h\"\n\n#include \"World.h\"\n#include \"Contact.h\"\n#include \"Body.h\"\n#include \"Shape.h\"\n#include \"CircleShape.h\"\n#include \"PolygonShape.h\"\n#include \"EdgeShape.h\"\n#include \"ChainShape.h\"\n#include \"Joint.h\"\n#include \"MouseJoint.h\"\n#include \"DistanceJoint.h\"\n#include \"PrismaticJoint.h\"\n#include \"RevoluteJoint.h\"\n#include \"PulleyJoint.h\"\n#include \"GearJoint.h\"\n#include \"FrictionJoint.h\"\n#include \"WeldJoint.h\"\n#include \"WheelJoint.h\"\n#include \"RopeJoint.h\"\n#include \"MotorJoint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nclass Physics : public Module\n{\npublic:\n\n\t/**\n\t * 30 pixels in one meter by default.\n\t **/\n\tstatic const int DEFAULT_METER = 30;\n\n\tPhysics();\n\tvirtual ~Physics();\n\n\t/**\n\t * Creates a new World.\n\t * @param gx Gravity along x-axis.\n\t * @param gy Gravity along y-axis.\n\t * @param sleep Whether the World allows sleep.\n\t **/\n\tWorld *newWorld(float gx, float gy, bool sleep);\n\n\t/**\n\t * Creates a new Body at the specified position.\n\t * @param world The world to create the Body in.\n\t * @param x The position along the x-axis.\n\t * @param y The position along the y-axis.\n\t * @param type The type of body to create.\n\t **/\n\tBody *newBody(World *world, float x, float y, Body::Type type);\n\n\t/**\n\t * Creates a new Body at (0, 0)\n\t * @param world The world to create the Body in.\n\t * @param type The type of Body to create.\n\t **/\n\tBody *newBody(World *world, Body::Type type);\n\n\t/**\n\t * Convenience functions for creating a Body and Shape all in one call. The\n\t * body's world position is the center/average of the given coordinates,\n\t * and the shape is centered at the local origin.\n\t **/\n\tBody *newCircleBody(World *world, Body::Type type, float x, float y, float radius);\n\tBody *newRectangleBody(World *world, Body::Type type, float x, float y, float w, float h, float angle);\n\tBody *newPolygonBody(World *world, Body::Type type, const Vector2 *coords, int count);\n\tBody *newEdgeBody(World *world, Body::Type type, float x1, float y1, float x2, float y2);\n\tBody *newEdgeBody(World *world, Body::Type type, float x1, float y1, float x2, float y2, float prevx, float prevy, float nextx, float nexty);\n\tBody *newChainBody(World *world, Body::Type type, bool loop, const Vector2 *coords, int count);\n\n\t// Necessary to support the deprecated newFixture API.\n\tShape *newAttachedShape(Body *body, Shape *prototype, float density);\n\n\t/**\n\t * Creates a new CircleShape at (x,y) in local coordinates.\n\t * @param x The offset along the x-axis.\n\t * @param y The offset along the y-axis.\n\t * @param radius The radius of the circle.\n\t **/\n\tCircleShape *newCircleShape(Body *body, float x, float y, float radius);\n\n\t/**\n\t * Shorthand for creating rectangular PolygonShapes. The rectangle\n\t * will be created at (x,y) in local coordinates.\n\t * @param x The offset along the x-axis.\n\t * @param y The offset along the y-axis.\n\t * @param w The width of the rectangle.\n\t * @param h The height of the rectangle.\n\t * @param angle The angle of the rectangle. (rad)\n\t **/\n\tPolygonShape *newRectangleShape(Body *body, float x, float y, float w, float h, float angle);\n\n\t/**\n\t * Creates a new EdgeShape. The edge will be created from\n\t * (x1,y1) to (x2,y2) in local coordinates.\n\t * @param x1 The x coordinate of the first point.\n\t * @param y1 The y coordinate of the first point.\n\t * @param x2 The x coordinate of the second point.\n\t * @param y2 The y coordinate of the second point.\n\t **/\n\tEdgeShape *newEdgeShape(Body *body, float x1, float y1, float x2, float y2);\n\tEdgeShape *newEdgeShape(Body *body, float x1, float y1, float x2, float y2, float prevx, float prevy, float nextx, float nexty);\n\n\t/**\n\t * Creates a new PolygonShape from a variable number of vertices.\n\t **/\n\tPolygonShape *newPolygonShape(Body *body, const Vector2 *coords, int count);\n\n\t/**\n\t * Creates a new ChainShape from a variable number of vertices.\n\t **/\n\tChainShape *newChainShape(Body *body, bool loop, const Vector2 *coords, int count);\n\n\t/**\n\t * Creates a new DistanceJoint connecting body1 with body2.\n\t * @param x1 Anchor1 along the x-axis. (World coordinates)\n\t * @param y1 Anchor1 along the y-axis. (World coordinates)\n\t * @param x2 Anchor2 along the x-axis. (World coordinates)\n\t * @param y2 Anchor2 along the y-axis. (World coordinates)\n\t * @param collideConnected Whether the connected bodies should collide with each other. Defaults to false.\n\t **/\n\tDistanceJoint *newDistanceJoint(Body *body1, Body *body2, float x1, float y1, float x2, float y2, bool collideConnected);\n\n\t/**\n\t * Creates a new MouseJoint connecting the body with an arbitrary point.\n\t * @param x Anchor along the x-axis. (World coordinates)\n\t * @param y Anchor along the y-axis. (World coordinates)\n\t **/\n\tMouseJoint *newMouseJoint(Body *body, float x, float y);\n\n\t/**\n\t * Creates a new RevoluteJoint connecting body1 with body2.\n\t * @param xA Anchor for body 1 along the x-axis. (World coordinates)\n\t * @param yA Anchor for body 1 along the y-axis. (World coordinates)\n\t * @param xB Anchor for body 2 along the x-axis. (World coordinates)\n\t * @param yB Anchor for body 2 along the y-axis. (World coordinates)\n\t * @param collideConnected Whether the connected bodies should collide with each other. Defaults to false.\n\t * @param referenceAngle The reference angle.\n\t **/\n\tRevoluteJoint *newRevoluteJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected);\n\n\tRevoluteJoint *newRevoluteJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected, float referenceAngle);\n\n\t/**\n\t * Creates a new PrismaticJoint connecting body1 with body2.\n\t * @param xA World-anchor for body1 along the x-axis.\n\t * @param yA World-anchor for body1 along the y-axis.\n\t * @param xB World-anchor for body2 along the x-axis.\n\t * @param yB World-anchor for body2 along the y-axis.\n\t * @param ax The x-component of the world-axis.\n\t * @param ay The y-component of the world-axis.\n\t * @param collideConnected Whether the connected bodies should collide with each other. Defaults to false.\n\t * @param referenceAngle The reference angle.\n\t **/\n\tPrismaticJoint *newPrismaticJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected);\n\n\tPrismaticJoint *newPrismaticJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected, float referenceAngle);\n\n\t/**\n\t * Creates a new PulleyJoint connecting body1 with body2.\n\t * @param groundAnchor1 World ground-anchor for body1.\n\t * @param groundAnchor2 World ground-anchor for body2.\n\t * @param anchor1 World anchor on body1.\n\t * @param anchor2 World anchor on body2.\n\t * @param ratio The pulley ratio.\n\t * @param collideConnected Whether the connected bodies should collide with each other. Defaults to true.\n\t **/\n\tPulleyJoint *newPulleyJoint(Body *body1, Body *body2, b2Vec2 groundAnchor1, b2Vec2 groundAnchor2, b2Vec2 anchor1, b2Vec2 anchor2, float ratio, bool collideConnected);\n\n\t/**\n\t * Creates a new GearJoint connecting joint1 with joint2.\n\t * @param joint1 The first joint.\n\t * @param joint2 The second joint.\n\t * @param ratio The gear ratio.\n\t * @param collideConnected Whether the connected bodies should collide with each other. Defaults to false.\n\t **/\n\tGearJoint *newGearJoint(Joint *joint1, Joint *joint2, float ratio, bool collideConnected);\n\n\t/**\n\t * Creates a new FrictionJoint connecting body1 with body2.\n\t * @param xA Anchor for body 1 along the x-axis. (World coordinates)\n\t * @param yA Anchor for body 1 along the y-axis. (World coordinates)\n\t * @param xB Anchor for body 2 along the x-axis. (World coordinates)\n\t * @param yB Anchor for body 2 along the y-axis. (World coordinates)\n\t * @param collideConnected Whether the connected bodies should collide with each other. Defaults to false.\n\t **/\n\tFrictionJoint *newFrictionJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected);\n\n\t/**\n\t * Creates a new WeldJoint connecting body1 with body2.\n\t * @param xA Anchor for body 1 along the x-axis. (World coordinates)\n\t * @param yA Anchor for body 1 along the y-axis. (World coordinates)\n\t * @param xB Anchor for body 2 along the x-axis. (World coordinates)\n\t * @param yB Anchor for body 2 along the y-axis. (World coordinates)\n\t * @param collideConnected Whether the connected bodies should collide with each other. Defaults to false.\n\t * @param referenceAngle The reference angle.\n\t **/\n\tWeldJoint *newWeldJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected);\n\n\tWeldJoint *newWeldJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected, float referenceAngle);\n\n\t/**\n\t * Creates a new WheelJoint connecting body1 with body2.\n\t * @param xA Anchor for body 1 along the x-axis. (World coordinates)\n\t * @param yA Anchor for body 1 along the y-axis. (World coordinates)\n\t * @param xB Anchor for body 2 along the x-axis. (World coordinates)\n\t * @param yB Anchor for body 2 along the y-axis. (World coordinates)\n\t * @param ax The x-component of the world-axis.\n\t * @param ay The y-component of the world-axis.\n\t * @param collideConnected Whether the connected bodies should collide with each other. Defaults to false.\n\t **/\n\tWheelJoint *newWheelJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected);\n\n\t/**\n\t * Creates a new RopeJoint connecting body1 with body2.\n\t * @param x1 Anchor1 along the x-axis. (Local coordinates)\n\t * @param y1 Anchor1 along the y-axis. (Local coordinates)\n\t * @param x2 Anchor2 along the x-axis. (Local coordinates)\n\t * @param y2 Anchor2 along the y-axis. (Local coordinates)\n\t * @param maxLength The maximum distance for the bodies.\n\t * @param collideConnected Whether the connected bodies should collide with each other. Defaults to false.\n\t **/\n\tRopeJoint *newRopeJoint(Body *body1, Body *body2, float x1, float y1, float x2, float y2, float maxLength, bool collideConnected);\n\n\t/**\n\t * Creates a new MotorJoint controlling the relative motion between body1\n\t * and body2.\n\t **/\n\tMotorJoint *newMotorJoint(Body *body1, Body *body2);\n\tMotorJoint *newMotorJoint(Body *body1, Body *body2, float correctionFactor, bool collideConnected);\n\n\t/**\n\t * Calculates the distance between two Fixtures.\n\t * @param fixtureA The first Fixture.\n\t * @param fixtureB The sceond Fixture.\n\t * @return The distance between them, and the two points closest\n\t *         to each other.\n\t **/\n\tint getDistance(lua_State *L);\n\n\t/**\n\t * Sets the number of pixels in one meter.\n\t * @param scale The number of pixels in one meter. (1m ~= 3.3ft).\n\t **/\n\tstatic void setMeter(float scale);\n\n\t/**\n\t * Gets the number of pixels in one meter.\n\t * @return The number of pixels in one meter. (1m ~= 3.3ft).\n\t **/\n\tstatic float getMeter();\n\n\t/**\n\t * Scales a value down according to the current meter in pixels.\n\t * @param f The unscaled input value.\n\t **/\n\tstatic float scaleDown(float f);\n\n\t/**\n\t * Scales a value up according to the current meter in pixels.\n\t * @param f The unscaled input value.\n\t **/\n\tstatic float scaleUp(float f);\n\n\t/**\n\t * Scales a point down according to the current meter\n\t * in pixels, for instance x = x0/meter, y = x0/meter.\n\t * @param x The x-coordinate of the point to scale.\n\t * @param y The y-coordinate of the point to scale.\n\t **/\n\tstatic void scaleDown(float &x, float &y);\n\n\t/**\n\t * Scales a point up according to the current meter\n\t * in pixels, for instance x = x0/meter, y = x0/meter.\n\t * @param x The x-coordinate of the point to scale.\n\t * @param y The y-coordinate of the point to scale.\n\t **/\n\tstatic void scaleUp(float &x, float &y);\n\n\t/**\n\t * Scales a b2Vec2 down according to the current meter in pixels.\n\t * @param v The unscaled input vector.\n\t * @return The scaled vector.\n\t **/\n\tstatic b2Vec2 scaleDown(const b2Vec2 &v);\n\n\t/**\n\t * Scales a b2Vec up according to the current meter in pixels.\n\t * @param v The unscaled input vector.\n\t * @return The scaled vector.\n\t **/\n\tstatic b2Vec2 scaleUp(const b2Vec2 &v);\n\n\t/**\n\t * Scales a b2AABB down according to the current meter in pixels.\n\t * @param aabb The unscaled input AABB.\n\t * @return The scaled AABB.\n\t **/\n\tstatic b2AABB scaleDown(const b2AABB &aabb);\n\n\t/**\n\t * Scales a b2AABB up according to the current meter in pixels.\n\t * @param aabb The unscaled input AABB.\n\t * @return The scaled AABB.\n\t **/\n\tstatic b2AABB scaleUp(const b2AABB& aabb);\n\n\t/**\n\t * Calculates the stiffness and damping, given the linear frequency, and damping ratio.\n\t * @param stiffness The output stiffness\n\t * @param damping The output damping\n\t * @param frequency The joint linear frequency\n\t * @param dampingRatio The joint damping ratio\n\t * @param bodyA The bodyA of the joint\n\t * @param bodyB The bodyB of the joint\n\t **/\n\tstatic void computeLinearStiffness(float& stiffness, float& damping, float frequency, float dampingRatio, b2Body* bodyA, b2Body* bodyB);\n\n\t/**\n\t * Calculates linear frequency and damping ratio from stiffness and damping\n\t * @param frequency The output frequency\n\t * @param ratio The output damping ratio\n\t * @param stiffness The joint stiffness\n\t * @param damping The joint damping\n\t * @param bodyA The bodyA of the joint\n\t * @param bodyB The bodyB of the joint\n\t **/\n\tstatic void computeLinearFrequency(float &frequency, float &ratio, float stiffness, float damping, b2Body *bodyA, b2Body *bodyB);\n\n\t/**\n\t * Calculates the stiffness and damping, given the angular frequency, and damping ratio.\n\t * @param stiffness The output stiffness\n\t * @param damping The output damping\n\t * @param frequency The joint angular frequency\n\t * @param dampingRatio The joint damping ratio\n\t * @param bodyA The bodyA of the joint\n\t * @param bodyB The bodyB of the joint\n\t **/\n\tstatic void computeAngularStiffness(float &stiffness, float &damping, float frequency, float dampingRatio, b2Body *bodyA, b2Body *bodyB);\n\n\t/**\n\t * Calculates angular frequency and damping ratio from stiffness and damping\n\t * @param frequency The output frequency\n\t * @param ratio The output damping ratio\n\t * @param stiffness The joint stiffness\n\t * @param damping The joint damping\n\t * @param bodyA The bodyA of the joint\n\t * @param bodyB The bodyB of the joint\n\t **/\n\tstatic void computeAngularFrequency(float &frequency, float &ratio, float stiffness, float damping, b2Body *bodyA, b2Body *bodyB);\n\n\tb2BlockAllocator *getBlockAllocator() { return &blockAllocator; }\n\nprivate:\n\n\t// The length of one meter in pixels.\n\tstatic float meter;\n\n\tb2BlockAllocator blockAllocator;\n\n}; // Physics\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_PHYSICS_H\n"
  },
  {
    "path": "src/modules/physics/box2d/PolygonShape.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"PolygonShape.h\"\n\n// Module\n#include \"Body.h\"\n#include \"World.h\"\n#include \"Physics.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nlove::Type PolygonShape::type(\"PolygonShape\", &Shape::type);\n\nPolygonShape::PolygonShape(Body *body, const b2PolygonShape &p)\n\t: Shape(body, p)\n{\n}\n\nPolygonShape::~PolygonShape()\n{\n}\n\nint PolygonShape::getPoints(lua_State *L)\n{\n\tthrowIfShapeNotValid();\n\tlove::luax_assert_argc(L, 0);\n\tb2PolygonShape *p = (b2PolygonShape *)shape;\n\tint count = p->m_count;\n\tfor (int i = 0; i<count; i++)\n\t{\n\t\tb2Vec2 v = Physics::scaleUp(p->m_vertices[i]);\n\t\tlua_pushnumber(L, v.x);\n\t\tlua_pushnumber(L, v.y);\n\t}\n\treturn count*2;\n}\n\nbool PolygonShape::validate() const\n{\n\tthrowIfShapeNotValid();\n\tb2PolygonShape *p = (b2PolygonShape *)shape;\n\treturn p->Validate();\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/PolygonShape.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_POLYGON_SHAPE_H\n#define LOVE_PHYSICS_BOX2D_POLYGON_SHAPE_H\n\n// Module\n#include \"Shape.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\n/**\n * You should know what a Polygon is. :)\n *\n * This class is needed so that we can easily get\n * the transformed points in Lua. By calling shape:getPoints(),\n * the result can be passed directly to love.graphics.polygon().\n **/\nclass PolygonShape : public Shape\n{\npublic:\n\n\tstatic love::Type type;\n\n\t/**\n\t * Create a new PolygonShape from a Box2D polygon definition.\n\t * @param p The polygon definition.\n\t **/\n\tPolygonShape(Body *body, const b2PolygonShape &p);\n\n\tvirtual ~PolygonShape();\n\n\t/**\n\t * Returns the transformed points of the polygon.\n\t * This function is useful for debug drawing and such.\n\t *\n\t * The result can be directly passed into love.graphics.polygon().\n\t **/\n\tint getPoints(lua_State *L);\n\n\t/**\n\t * Validate convexity.\n\t **/\n\tbool validate() const;\n};\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_POLYGON_SHAPE_H\n"
  },
  {
    "path": "src/modules/physics/box2d/PrismaticJoint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"PrismaticJoint.h\"\n\n// Module\n#include \"Body.h\"\n#include \"World.h\"\n#include \"Physics.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nlove::Type PrismaticJoint::type(\"PrismaticJoint\", &Joint::type);\n\nPrismaticJoint::PrismaticJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected)\n\t: Joint(body1, body2)\n\t, joint(NULL)\n{\n\tb2PrismaticJointDef def;\n\tinit(def, body1, body2, xA, yA, xB, yB, ax, ay, collideConnected);\n\tjoint = (b2PrismaticJoint *)createJoint(&def);\n}\n\nPrismaticJoint::PrismaticJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected, float referenceAngle)\n\t: Joint(body1, body2)\n\t, joint(NULL)\n{\n\tb2PrismaticJointDef def;\n\tinit(def, body1, body2, xA, yA, xB, yB, ax, ay, collideConnected);\n\tdef.referenceAngle = referenceAngle;\n\tjoint = (b2PrismaticJoint *)createJoint(&def);\n}\n\nPrismaticJoint::~PrismaticJoint()\n{\n}\n\nvoid PrismaticJoint::init(b2PrismaticJointDef &def, Body *body1, Body *body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected)\n{\n\tdef.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(xA,yA)), b2Vec2(ax,ay));\n\tdef.localAnchorB = body2->body->GetLocalPoint(Physics::scaleDown(b2Vec2(xB, yB)));\n\tdef.lowerTranslation = 0.0f;\n\tdef.upperTranslation = 100.0f;\n\tdef.enableLimit = true;\n\tdef.collideConnected = collideConnected;\n}\n\nfloat PrismaticJoint::getJointTranslation() const\n{\n\treturn Physics::scaleUp(joint->GetJointTranslation());\n}\n\nfloat PrismaticJoint::getJointSpeed() const\n{\n\treturn Physics::scaleUp(joint->GetJointSpeed());\n}\n\nvoid PrismaticJoint::setMotorEnabled(bool enable)\n{\n\treturn joint->EnableMotor(enable);\n}\n\nbool PrismaticJoint::isMotorEnabled() const\n{\n\treturn joint->IsMotorEnabled();\n}\n\nvoid PrismaticJoint::setMaxMotorForce(float force)\n{\n\tjoint->SetMaxMotorForce(Physics::scaleDown(force));\n}\n\nvoid PrismaticJoint::setMotorSpeed(float speed)\n{\n\tjoint->SetMotorSpeed(Physics::scaleDown(speed));\n}\n\nfloat PrismaticJoint::getMotorSpeed() const\n{\n\treturn Physics::scaleUp(joint->GetMotorSpeed());\n}\n\nfloat PrismaticJoint::getMotorForce(float inv_dt) const\n{\n\treturn Physics::scaleUp(joint->GetMotorForce(inv_dt));\n}\n\nfloat PrismaticJoint::getMaxMotorForce() const\n{\n\treturn Physics::scaleUp(joint->GetMaxMotorForce());\n}\n\nvoid PrismaticJoint::setLimitsEnabled(bool enable)\n{\n\tjoint->EnableLimit(enable);\n}\n\nbool PrismaticJoint::areLimitsEnabled() const\n{\n\treturn joint->IsLimitEnabled();\n}\n\nvoid PrismaticJoint::setUpperLimit(float limit)\n{\n\tjoint->SetLimits(joint->GetLowerLimit(), Physics::scaleDown(limit));\n}\n\nvoid PrismaticJoint::setLowerLimit(float limit)\n{\n\tjoint->SetLimits(Physics::scaleDown(limit), joint->GetUpperLimit());\n}\n\nvoid PrismaticJoint::setLimits(float lower, float upper)\n{\n\tjoint->SetLimits(Physics::scaleDown(lower), Physics::scaleDown(upper));\n}\n\nfloat PrismaticJoint::getLowerLimit() const\n{\n\treturn Physics::scaleUp(joint->GetLowerLimit());\n}\n\nfloat PrismaticJoint::getUpperLimit() const\n{\n\treturn Physics::scaleUp(joint->GetUpperLimit());\n}\n\nint PrismaticJoint::getLimits(lua_State *L)\n{\n\tlua_pushnumber(L, Physics::scaleUp(joint->GetLowerLimit()));\n\tlua_pushnumber(L, Physics::scaleUp(joint->GetUpperLimit()));\n\treturn 2;\n}\n\nint PrismaticJoint::getAxis(lua_State *L)\n{\n\tb2Vec2 axis = joint->GetLocalAxisA();\n\tgetBodyA()->getWorldVector(axis.x, axis.y, axis.x, axis.y);\n\tlua_pushnumber(L, axis.x);\n\tlua_pushnumber(L, axis.y);\n\treturn 2;\n}\n\nfloat PrismaticJoint::getReferenceAngle() const\n{\n\treturn joint->GetReferenceAngle();\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/PrismaticJoint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_PRISMATIC_JOINT_H\n#define LOVE_PHYSICS_BOX2D_PRISMATIC_JOINT_H\n\n// Module\n#include \"Joint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\n/**\n * PrismaticJoints allow shapes to move in relation to eachother\n * along a defined axis.\n **/\nclass PrismaticJoint : public Joint\n{\npublic:\n\n\tstatic love::Type type;\n\n\t/**\n\t * Creates a new PrismaticJoint connecting body1 and body2.\n\t **/\n\tPrismaticJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected);\n\n\tPrismaticJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected, float referenceAngle);\n\n\tvirtual ~PrismaticJoint();\n\n\t/**\n\t * Get the current joint translation, usually in meters.\n\t **/\n\tfloat getJointTranslation() const;\n\n\t/**\n\t * Get the current joint translation speed, usually in meters per second.\n\t **/\n\tfloat getJointSpeed() const;\n\n\t/**\n\t * Enable/disable the joint motor.\n\t **/\n\tvoid setMotorEnabled(bool enable);\n\n\t/**\n\t * Checks whether the motor is enabled.\n\t **/\n\tbool isMotorEnabled() const;\n\n\t/**\n\t * Set the maximum motor force, usually in N.\n\t **/\n\tvoid setMaxMotorForce(float force);\n\n\t/**\n\t * Set the motor speed, usually in meters per second.\n\t **/\n\tvoid setMotorSpeed(float speed);\n\n\t/**\n\t * Get the motor speed, usually in meters per second.\n\t **/\n\tfloat getMotorSpeed() const;\n\n\t/**\n\t * Get the current motor force, usually in N.\n\t * @param inv_dt The inverse time step.\n\t **/\n\tfloat getMotorForce(float inv_dt) const;\n\n\t/**\n\t * Get the maximum motor force, usually in N.\n\t **/\n\tfloat getMaxMotorForce() const;\n\n\t/**\n\t * Enable/disable the joint limits.\n\t **/\n\tvoid setLimitsEnabled(bool enable);\n\n\t/**\n\t * Checks whether limits are enabled.\n\t **/\n\tbool areLimitsEnabled() const;\n\n\t/**\n\t * Sets the upper limit, usually in meters.\n\t **/\n\tvoid setUpperLimit(float limit);\n\n\t/**\n\t * Sets the lower limit, usually in meters.\n\t **/\n\tvoid setLowerLimit(float limit);\n\n\t/**\n\t * Sets the limits, usually in meters.\n\t **/\n\tvoid setLimits(float lower, float upper);\n\n\t/**\n\t * Gets the lower limit, usually in meters.\n\t **/\n\tfloat getLowerLimit() const;\n\n\t/**\n\t * Gets the upper limit, usually in meters.\n\t **/\n\tfloat getUpperLimit() const;\n\n\t/**\n\t * Gets the limits, usually in meters.\n\t * @returns The upper limit.\n\t * @returns The lower limit.\n\t **/\n\tint getLimits(lua_State *L);\n\n\t/**\n\t * Gets the axis unit vector, relative to body1.\n\t * @returns The X component of the axis unit vector.\n\t * @returns The Y component of the axis unit vector.\n\t **/\n\tint getAxis(lua_State *L);\n\n\t/**\n\t * Gets the reference angle.\n\t **/\n\tfloat getReferenceAngle() const;\n\nprivate:\n\n\t// The Box2D prismatic joint object.\n\tb2PrismaticJoint *joint;\n\n\tvoid init(b2PrismaticJointDef &def, Body *body1, Body *body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected);\n};\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_PRISMATIC_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/PulleyJoint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"PulleyJoint.h\"\n\n// Module\n#include \"Body.h\"\n#include \"World.h\"\n#include \"Physics.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nlove::Type PulleyJoint::type(\"PulleyJoint\", &Joint::type);\n\nPulleyJoint::PulleyJoint(Body *bodyA, Body *bodyB, b2Vec2 groundAnchorA, b2Vec2 groundAnchorB, b2Vec2 anchorA, b2Vec2 anchorB, float ratio, bool collideConnected)\n\t: Joint(bodyA, bodyB)\n\t, joint(NULL)\n{\n\tb2PulleyJointDef def;\n\tdef.Initialize(bodyA->body, bodyB->body, Physics::scaleDown(groundAnchorA), Physics::scaleDown(groundAnchorB), \\\n\t\t\t\t   Physics::scaleDown(anchorA), Physics::scaleDown(anchorB), ratio);\n\tdef.collideConnected = collideConnected;\n\n\tjoint = (b2PulleyJoint *)createJoint(&def);\n}\n\nPulleyJoint::~PulleyJoint()\n{\n}\n\nint PulleyJoint::getGroundAnchors(lua_State *L)\n{\n\tlua_pushnumber(L, Physics::scaleUp(joint->GetGroundAnchorA().x));\n\tlua_pushnumber(L, Physics::scaleUp(joint->GetGroundAnchorA().y));\n\tlua_pushnumber(L, Physics::scaleUp(joint->GetGroundAnchorB().x));\n\tlua_pushnumber(L, Physics::scaleUp(joint->GetGroundAnchorB().y));\n\treturn 4;\n}\n\nfloat PulleyJoint::getLengthA() const\n{\n\treturn Physics::scaleUp(joint->GetLengthA());\n}\n\nfloat PulleyJoint::getLengthB() const\n{\n\treturn Physics::scaleUp(joint->GetLengthB());\n}\n\nfloat PulleyJoint::getRatio() const\n{\n\treturn joint->GetRatio();\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/PulleyJoint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_PULLEY_JOINT_H\n#define LOVE_PHYSICS_BOX2D_PULLEY_JOINT_H\n\n// Module\n#include \"Joint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\n/**\n * The PulleyJoint The pulley connects two bodies to ground and\n * to each other. As one body goes up, the other goes down. The\n * total length of the pulley rope is conserved according to the\n * initial configuration: length1 + ratio * length2 <= constant.\n **/\nclass PulleyJoint : public Joint\n{\npublic:\n\n\tstatic love::Type type;\n\n\t/**\n\t * Creates a PulleyJoint connecting bodyA to bodyB.\n\t **/\n\tPulleyJoint(Body *bodyA, Body *bodyB, b2Vec2 groundAnchorA, b2Vec2 groundAnchorB, b2Vec2 anchorA, b2Vec2 anchorB, float ratio, bool collideConnected);\n\n\tvirtual ~PulleyJoint();\n\n\t/**\n\t * Gets the ground anchors position in world\n\t * coordinates.\n\t **/\n\tint getGroundAnchors(lua_State *L);\n\n\t/**\n\t * Gets the current length of the segment attached to bodyA.\n\t **/\n\tfloat getLengthA() const;\n\n\t/**\n\t * Gets the current length of the segment attached to bodyB.\n\t **/\n\tfloat getLengthB() const;\n\n\t/**\n\t * Gets the pulley ratio.\n\t **/\n\tfloat getRatio() const;\n\nprivate:\n\t// The Box2D DistanceJoint object.\n\tb2PulleyJoint *joint;\n};\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_PULLEY_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/RevoluteJoint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"RevoluteJoint.h\"\n\n#include \"common/math.h\"\n\n// Module\n#include \"Body.h\"\n#include \"World.h\"\n#include \"Physics.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nlove::Type RevoluteJoint::type(\"RevoluteJoint\", &Joint::type);\n\nRevoluteJoint::RevoluteJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected)\n\t: Joint(body1, body2)\n\t, joint(NULL)\n{\n\tb2RevoluteJointDef def;\n\tinit(def, body1, body2, xA, yA, xB, yB, collideConnected);\n\tjoint = (b2RevoluteJoint *)createJoint(&def);\n}\n\nRevoluteJoint::RevoluteJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected, float referenceAngle)\n\t: Joint(body1, body2)\n\t, joint(NULL)\n{\n\tb2RevoluteJointDef def;\n\tinit(def, body1, body2, xA, yA, xB, yB, collideConnected);\n\tdef.referenceAngle = referenceAngle;\n\tjoint = (b2RevoluteJoint *)createJoint(&def);\n}\n\nRevoluteJoint::~RevoluteJoint()\n{\n}\n\nvoid RevoluteJoint::init(b2RevoluteJointDef &def, Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected)\n{\n\tdef.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(xA,yA)));\n\tdef.localAnchorB = body2->body->GetLocalPoint(Physics::scaleDown(b2Vec2(xB, yB)));\n\tdef.collideConnected = collideConnected;\n}\n\nfloat RevoluteJoint::getJointAngle() const\n{\n\treturn joint->GetJointAngle();\n}\n\nfloat RevoluteJoint::getJointSpeed() const\n{\n\treturn joint->GetJointSpeed();\n}\n\nvoid RevoluteJoint::setMotorEnabled(bool enable)\n{\n\treturn joint->EnableMotor(enable);\n}\n\nbool RevoluteJoint::isMotorEnabled() const\n{\n\treturn joint->IsMotorEnabled();\n}\n\nvoid RevoluteJoint::setMaxMotorTorque(float torque)\n{\n\tjoint->SetMaxMotorTorque(Physics::scaleDown(Physics::scaleDown(torque)));\n}\n\nvoid RevoluteJoint::setMotorSpeed(float speed)\n{\n\tjoint->SetMotorSpeed(speed);\n}\n\nfloat RevoluteJoint::getMotorSpeed() const\n{\n\treturn joint->GetMotorSpeed();\n}\n\nfloat RevoluteJoint::getMotorTorque(float dt) const\n{\n\tfloat inv_dt = 1.0f / dt;\n\treturn Physics::scaleUp(Physics::scaleUp(joint->GetMotorTorque(inv_dt)));\n}\n\nfloat RevoluteJoint::getMaxMotorTorque() const\n{\n\treturn Physics::scaleUp(Physics::scaleUp(joint->GetMaxMotorTorque()));\n}\n\nvoid RevoluteJoint::setLimitsEnabled(bool enable)\n{\n\tjoint->EnableLimit(enable);\n}\n\nbool RevoluteJoint::areLimitsEnabled() const\n{\n\treturn joint->IsLimitEnabled();\n}\n\nvoid RevoluteJoint::setUpperLimit(float limit)\n{\n\tjoint->SetLimits(joint->GetLowerLimit(), limit);\n}\n\nvoid RevoluteJoint::setLowerLimit(float limit)\n{\n\tjoint->SetLimits(limit, joint->GetUpperLimit());\n}\n\nvoid RevoluteJoint::setLimits(float lower, float upper)\n{\n\tjoint->SetLimits(lower, upper);\n}\n\nfloat RevoluteJoint::getLowerLimit() const\n{\n\treturn joint->GetLowerLimit();\n}\n\nfloat RevoluteJoint::getUpperLimit() const\n{\n\treturn joint->GetUpperLimit();\n}\n\nint RevoluteJoint::getLimits(lua_State *L)\n{\n\tlua_pushnumber(L, joint->GetLowerLimit());\n\tlua_pushnumber(L, joint->GetUpperLimit());\n\treturn 2;\n}\n\nfloat RevoluteJoint::getReferenceAngle() const\n{\n\treturn joint->GetReferenceAngle();\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/RevoluteJoint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_REVOLUTE_JOINT_H\n#define LOVE_PHYSICS_BOX2D_REVOLUTE_JOINT_H\n\n// Module\n#include \"Joint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\n/**\n * A RevoluteJoint allows two bodies relative rotation\n * around a single point.\n **/\nclass RevoluteJoint : public Joint\n{\npublic:\n\n\tstatic love::Type type;\n\n\t/**\n\t * Creates a new RevoluteJoint connecting body1 and body2.\n\t **/\n\tRevoluteJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected);\n\n\tRevoluteJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected, float referenceAngle);\n\n\tvirtual ~RevoluteJoint();\n\n\t/**\n\t * Get the current joint angle in degrees.\n\t **/\n\tfloat getJointAngle() const;\n\n\t/**\n\t * Get the current joint angle speed in degrees per second.\n\t **/\n\tfloat getJointSpeed() const;\n\n\t/**\n\t * Enable/disable the joint motor.\n\t **/\n\tvoid setMotorEnabled(bool enable);\n\n\t/**\n\t * Checks whether the motor is enabled.\n\t **/\n\tbool isMotorEnabled() const;\n\n\t/**\n\t * Set the maximum motor torque, usually in N-m.\n\t **/\n\tvoid setMaxMotorTorque(float torque);\n\n\t/**\n\t * Sets the motor speed in radians per second.\n\t **/\n\tvoid setMotorSpeed(float speed);\n\n\t/**\n\t * Gets the motor speed in radians per second.\n\t **/\n\tfloat getMotorSpeed() const;\n\n\t/**\n\t * Get the current motor torque, usually in N-m.\n\t * @param dt The timestep.\n\t **/\n\tfloat getMotorTorque(float dt) const;\n\n\t/**\n\t * Get the maximum motor torque, usually in N-m.\n\t **/\n\tfloat getMaxMotorTorque() const;\n\n\t/**\n\t * Enable/disable the joint limit.\n\t **/\n\tvoid setLimitsEnabled(bool enable);\n\n\t/**\n\t * Checks whether limits are enabled.\n\t **/\n\tbool areLimitsEnabled() const;\n\n\t/**\n\t * Sets the upper limit in degrees.\n\t **/\n\tvoid setUpperLimit(float limit);\n\n\t/**\n\t * Sets the lower limit in degrees.\n\t **/\n\tvoid setLowerLimit(float limit);\n\n\t/**\n\t * Sets the limits in degrees.\n\t **/\n\tvoid setLimits(float lower, float upper);\n\n\t/**\n\t * Gets the lower limit in degrees.\n\t **/\n\tfloat getLowerLimit() const;\n\n\t/**\n\t * Gets the upper limit in degrees.\n\t **/\n\tfloat getUpperLimit() const;\n\n\t/**\n\t * Gets the limits in degrees.\n\t * @returns The lower limit.\n\t * @returns The upper limit.\n\t **/\n\tint getLimits(lua_State *L);\n\n\t/**\n\t * Gets the reference angle.\n\t **/\n\tfloat getReferenceAngle() const;\n\nprivate:\n\n\t// The Box2D revolute joint object.\n\tb2RevoluteJoint *joint;\n\n\tvoid init(b2RevoluteJointDef &def, Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected);\n};\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_REVOLUTE_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/RopeJoint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"RopeJoint.h\"\n\n// Module\n#include \"Body.h\"\n#include \"World.h\"\n#include \"Physics.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nlove::Type RopeJoint::type(\"RopeJoint\", &Joint::type);\n\nRopeJoint::RopeJoint(Body *body1, Body *body2, float x1, float y1, float x2, float y2, float maxLength, bool collideConnected)\n\t: Joint(body1, body2)\n\t, joint(NULL)\n{\n\tb2DistanceJointDef def;\n\tdef.bodyA = body1->body;\n\tdef.bodyB = body2->body;\n\tbody1->getLocalPoint(x1, y1, x1, y1);\n\tbody2->getLocalPoint(x2, y2, x2, y2);\n\tdef.localAnchorA.x = Physics::scaleDown(x1);\n\tdef.localAnchorA.y = Physics::scaleDown(y1);\n\tdef.localAnchorB.x = Physics::scaleDown(x2);\n\tdef.localAnchorB.y = Physics::scaleDown(y2);\n\tdef.maxLength = Physics::scaleDown(maxLength);\n\tdef.collideConnected = collideConnected;\n\tjoint = (b2DistanceJoint *)createJoint(&def);\n}\n\nRopeJoint::~RopeJoint()\n{\n}\n\nfloat RopeJoint::getMaxLength() const\n{\n\treturn Physics::scaleUp(joint->GetMaxLength());\n}\n\nvoid RopeJoint::setMaxLength(float maxLength)\n{\n\tjoint->SetMaxLength(Physics::scaleDown(maxLength));\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/RopeJoint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_ROPE_JOINT_H\n#define LOVE_PHYSICS_BOX2D_ROPE_JOINT_H\n\n// Module\n#include \"Joint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\n/**\n * The RopeJoint enforces a maximum distance between two points\n * on two bodies. It has no other effect.\n **/\nclass RopeJoint : public Joint\n{\npublic:\n\n\tstatic love::Type type;\n\n\t/**\n\t * Creates a RopeJoint connecting body1 to body2.\n\t **/\n\tRopeJoint(Body *body1, Body *body2, float x1, float y1, float x2, float y2, float maxLength, bool collideConnected);\n\n\tvirtual ~RopeJoint();\n\n\t/**\n\t * Gets the maximum length of the rope.\n\t **/\n\tfloat getMaxLength() const;\n\tvoid setMaxLength(float length);\n\nprivate:\n\t// The Box2D RopeJoint object.\n\tb2DistanceJoint *joint;\n};\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_ROPE_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/Shape.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Shape.h\"\n\n// Module\n#include \"Body.h\"\n#include \"World.h\"\n#include \"Physics.h\"\n\n// STD\n#include <bitset>\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nShape::Shape(Body *body, const b2Shape &shape)\n\t: shape(nullptr)\n\t, own(false)\n\t, shapeType(SHAPE_INVALID)\n\t, body(body)\n\t, fixture(nullptr)\n{\n\tif (body)\n\t{\n\t\tb2FixtureDef def;\n\t\tdef.shape = &shape;\n\t\tdef.userData.pointer = (uintptr_t)this;\n\n\t\t// 0 density stops CreateFixture from calling b2Body::ResetMassData().\n\t\tdef.density = body->hasCustomMassData() ? 0.0f : 1.0f;\n\n\t\tfixture = body->body->CreateFixture(&def);\n\t\tthis->shape = fixture->GetShape();\n\n\t\tif (body->hasCustomMassData())\n\t\t\tsetDensity(1.0f);\n\n\t\tretain(); // Shape::destroy does the release().\n\t}\n\telse\n\t{\n\t\t// Path to support deprecated APIs.\n\t\tauto physics = Module::getInstance<Physics>(Module::M_PHYSICS);\n\t\tthis->shape = shape.Clone(physics->getBlockAllocator());\n\t\town = true;\n\t}\n\n\tswitch (this->shape->GetType())\n\t{\n\tcase b2Shape::e_circle:\n\t\tshapeType = SHAPE_CIRCLE;\n\t\tbreak;\n\tcase b2Shape::e_polygon:\n\t\tshapeType = SHAPE_POLYGON;\n\t\tbreak;\n\tcase b2Shape::e_edge:\n\t\tshapeType = SHAPE_EDGE;\n\t\tbreak;\n\tcase b2Shape::e_chain:\n\t\tshapeType = SHAPE_CHAIN;\n\t\tbreak;\n\tdefault:\n\t\tshapeType = SHAPE_INVALID;\n\t\tbreak;\n\t}\n}\n\nShape::~Shape()\n{\n\tif (shape && own)\n\t{\n\t\tauto physics = Module::getInstance<Physics>(Module::M_PHYSICS);\n\t\tauto allocator = physics->getBlockAllocator();\n\n\t\t// Taken from b2Fixture::Destroy. Not very pretty...\n\t\tswitch (shapeType)\n\t\t{\n\t\tcase SHAPE_CIRCLE:\n\t\t{\n\t\t\tb2CircleShape *s = (b2CircleShape*)shape;\n\t\t\ts->~b2CircleShape();\n\t\t\tallocator->Free(s, sizeof(b2CircleShape));\n\t\t\tbreak;\n\t\t}\n\t\tcase SHAPE_EDGE:\n\t\t{\n\t\t\tb2EdgeShape *s = (b2EdgeShape*)shape;\n\t\t\ts->~b2EdgeShape();\n\t\t\tallocator->Free(s, sizeof(b2EdgeShape));\n\t\t\tbreak;\n\t\t}\n\t\tcase SHAPE_POLYGON:\n\t\t{\n\t\t\tb2PolygonShape *s = (b2PolygonShape*)shape;\n\t\t\ts->~b2PolygonShape();\n\t\t\tallocator->Free(s, sizeof(b2PolygonShape));\n\t\t\tbreak;\n\t\t}\n\t\tcase SHAPE_CHAIN:\n\t\t{\n\t\t\tb2ChainShape *s = (b2ChainShape*)shape;\n\t\t\ts->~b2ChainShape();\n\t\t\tallocator->Free(s, sizeof(b2ChainShape));\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (ref)\n\t\tdelete ref;\n}\n\nvoid Shape::destroy(bool implicit)\n{\n\tif (fixture == nullptr)\n\t\treturn;\n\n\tif (body->world->world->IsLocked())\n\t{\n\t\t// Called during time step. Save reference for destruction afterwards.\n\t\tthis->retain();\n\t\tbody->world->destructShapes.push_back(this);\n\t\treturn;\n\t}\n\n\tif (!implicit && fixture != nullptr)\n\t\tbody->body->DestroyFixture(fixture);\n\n\tfixture = nullptr;\n\tshape = nullptr;\n\tbody = nullptr;\n\n\t// Remove userdata reference to avoid it sticking around after GC\n\tif (ref)\n\t\tref->unref();\n\n\t// Box2D fixture destroyed. Release its reference to the love Shape.\n\trelease();\n}\n\nvoid Shape::throwIfFixtureNotValid() const\n{\n\tif (fixture == nullptr)\n\t\tthrow love::Exception(\"Shape must be active in the physics World to use this method.\");\n}\n\nvoid Shape::throwIfShapeNotValid() const\n{\n\tif (shape == nullptr)\n\t\tthrow love::Exception(\"Cannot call this method on a destroyed Shape.\");\n}\n\nShape::Type Shape::getType() const\n{\n\treturn shapeType;\n}\n\nvoid Shape::setFriction(float friction)\n{\n\tthrowIfFixtureNotValid();\n\tfixture->SetFriction(friction);\n}\n\nvoid Shape::setRestitution(float restitution)\n{\n\tthrowIfFixtureNotValid();\n\tfixture->SetRestitution(restitution);\n}\n\nvoid Shape::setDensity(float density)\n{\n\tthrowIfFixtureNotValid();\n\tfixture->SetDensity(density);\n\tif (!body->hasCustomMassData())\n\t\tbody->resetMassData();\n}\n\nvoid Shape::setSensor(bool sensor)\n{\n\tthrowIfFixtureNotValid();\n\tfixture->SetSensor(sensor);\n}\n\nfloat Shape::getFriction() const\n{\n\tthrowIfFixtureNotValid();\n\treturn fixture->GetFriction();\n}\n\nfloat Shape::getRestitution() const\n{\n\tthrowIfFixtureNotValid();\n\treturn fixture->GetRestitution();\n}\n\nfloat Shape::getDensity() const\n{\n\tthrowIfFixtureNotValid();\n\treturn fixture->GetDensity();\n}\n\nbool Shape::isSensor() const\n{\n\tthrowIfFixtureNotValid();\n\treturn fixture->IsSensor();\n}\n\nBody *Shape::getBody() const\n{\n\treturn body;\n}\n\nfloat Shape::getRadius() const\n{\n\tthrowIfShapeNotValid();\n\treturn Physics::scaleUp(shape->m_radius);\n}\n\nint Shape::getChildCount() const\n{\n\tthrowIfShapeNotValid();\n\treturn shape->GetChildCount();\n}\n\nvoid Shape::setFilterData(int *v)\n{\n\tthrowIfFixtureNotValid();\n\tb2Filter f;\n\tf.categoryBits = (uint16) v[0];\n\tf.maskBits = (uint16) v[1];\n\tf.groupIndex = (int16) v[2];\n\tfixture->SetFilterData(f);\n}\n\nvoid Shape::getFilterData(int *v)\n{\n\tthrowIfFixtureNotValid();\n\tb2Filter f = fixture->GetFilterData();\n\tv[0] = (int) f.categoryBits;\n\tv[1] = (int) f.maskBits;\n\tv[2] = (int) f.groupIndex;\n}\n\nint Shape::setCategory(lua_State *L)\n{\n\tthrowIfFixtureNotValid();\n\tb2Filter f = fixture->GetFilterData();\n\tf.categoryBits = (uint16)getBits(L);\n\tfixture->SetFilterData(f);\n\treturn 0;\n}\n\nint Shape::setMask(lua_State *L)\n{\n\tthrowIfFixtureNotValid();\n\tb2Filter f = fixture->GetFilterData();\n\tf.maskBits = ~(uint16)getBits(L);\n\tfixture->SetFilterData(f);\n\treturn 0;\n}\n\nvoid Shape::setGroupIndex(int index)\n{\n\tthrowIfFixtureNotValid();\n\tb2Filter f = fixture->GetFilterData();\n\tf.groupIndex = (uint16)index;\n\tfixture->SetFilterData(f);\n}\n\nint Shape::getGroupIndex() const\n{\n\tthrowIfFixtureNotValid();\n\tb2Filter f = fixture->GetFilterData();\n\treturn f.groupIndex;\n}\n\nint Shape::getCategory(lua_State *L)\n{\n\tthrowIfFixtureNotValid();\n\treturn pushBits(L, fixture->GetFilterData().categoryBits);\n}\n\nint Shape::getMask(lua_State *L)\n{\n\tthrowIfFixtureNotValid();\n\treturn pushBits(L, ~(fixture->GetFilterData().maskBits));\n}\n\nuint16 Shape::getBits(lua_State *L)\n{\n\t// Get number of args.\n\tbool istable = lua_istable(L, 1);\n\tint argc = istable ? (int) luax_objlen(L, 1) : lua_gettop(L);\n\n\t// The new bitset.\n\tstd::bitset<16> b;\n\n\tfor (int i = 1; i <= argc; i++)\n\t{\n\t\tsize_t bpos = 0;\n\n\t\tif (istable)\n\t\t{\n\t\t\tlua_rawgeti(L, 1, i);\n\t\t\tbpos = (size_t) (lua_tointeger(L, -1) - 1);\n\t\t\tlua_pop(L, 1);\n\t\t}\n\t\telse\n\t\t\tbpos = (size_t) (lua_tointeger(L, i) - 1);\n\n\t\tif (bpos >= 16)\n\t\t\tluaL_error(L, \"Values must be in range 1-16.\");\n\n\t\tb.set(bpos, true);\n\t}\n\n\treturn (uint16)b.to_ulong();\n}\n\nint Shape::pushBits(lua_State *L, uint16 bits)\n{\n\t// Create a bitset.\n\tstd::bitset<16> b((int)bits);\n\n\t// Push all set bits.\n\tfor (int i = 0; i<16; i++)\n\t\tif (b.test(i))\n\t\t\tlua_pushinteger(L, i+1);\n\n\t// Count number of set bits.\n\treturn (int)b.count();\n}\n\nint Shape::setUserData(lua_State *L)\n{\n\tlove::luax_assert_argc(L, 1, 1);\n\n\tif(!ref)\n\t\tref = new Reference();\n\n\tref->ref(L);\n\n\treturn 0;\n}\n\nint Shape::getUserData(lua_State *L)\n{\n\tif (ref != nullptr)\n\t\tref->push(L);\n\telse\n\t\tlua_pushnil(L);\n\n\treturn 1;\n}\n\nbool Shape::testPoint(float x, float y) const\n{\n\tthrowIfFixtureNotValid();\n\treturn fixture->TestPoint(Physics::scaleDown(b2Vec2(x, y)));\n}\n\nbool Shape::testPoint(float x, float y, float r, float px, float py) const\n{\n\tthrowIfShapeNotValid();\n\tb2Vec2 point(px, py);\n\tb2Transform transform(Physics::scaleDown(b2Vec2(x, y)), b2Rot(r));\n\treturn shape->TestPoint(transform, Physics::scaleDown(point));\n}\n\nint Shape::rayCast(lua_State *L) const\n{\n\tfloat p1x = Physics::scaleDown((float)luaL_checknumber(L, 1));\n\tfloat p1y = Physics::scaleDown((float)luaL_checknumber(L, 2));\n\tfloat p2x = Physics::scaleDown((float)luaL_checknumber(L, 3));\n\tfloat p2y = Physics::scaleDown((float)luaL_checknumber(L, 4));\n\tfloat maxFraction = (float)luaL_checknumber(L, 5);\n\n\tb2RayCastInput input;\n\tb2RayCastOutput output;\n\tinput.p1.Set(p1x, p1y);\n\tinput.p2.Set(p2x, p2y);\n\tinput.maxFraction = maxFraction;\n\n\tif (lua_isnoneornil(L, 7))\n\t{\n\t\tthrowIfFixtureNotValid();\n\t\tint childIndex = (int) luaL_optinteger(L, 6, 1) - 1; // Convert from 1-based index\n\t\tif (!fixture->RayCast(&output, input, childIndex))\n\t\t\treturn 0; // Nothing hit.\n\t}\n\telse\n\t{\n\t\tthrowIfShapeNotValid();\n\t\tfloat x = Physics::scaleDown((float)luaL_checknumber(L, 6));\n\t\tfloat y = Physics::scaleDown((float)luaL_checknumber(L, 7));\n\t\tfloat r = (float)luaL_checknumber(L, 8);\n\t\tint childIndex = (int) luaL_optinteger(L, 9, 1) - 1; // Convert from 1-based index\n\t\n\t\tb2Transform transform(b2Vec2(x, y), b2Rot(r));\n\t\t\n\t\tif (!shape->RayCast(&output, input, transform, childIndex))\n\t\t\treturn 0; // No hit.\n\t}\n\n\tlua_pushnumber(L, output.normal.x);\n\tlua_pushnumber(L, output.normal.y);\n\tlua_pushnumber(L, output.fraction);\n\treturn 3;\n}\n\nint Shape::computeAABB(lua_State *L) const\n{\n\tthrowIfShapeNotValid();\n\tfloat x = Physics::scaleDown((float)luaL_checknumber(L, 1));\n\tfloat y = Physics::scaleDown((float)luaL_checknumber(L, 2));\n\tfloat r = (float)luaL_checknumber(L, 3);\n\tint childIndex = (int) luaL_optinteger(L, 4, 1) - 1; // Convert from 1-based index\n\tb2Transform transform(b2Vec2(x, y), b2Rot(r));\n\tb2AABB box;\n\tshape->ComputeAABB(&box, transform, childIndex);\n\tbox = Physics::scaleUp(box);\n\tlua_pushnumber(L, box.lowerBound.x);\n\tlua_pushnumber(L, box.lowerBound.y);\n\tlua_pushnumber(L, box.upperBound.x);\n\tlua_pushnumber(L, box.upperBound.y);\n\treturn 4;\n}\n\nint Shape::computeMass(lua_State *L) const\n{\n\tthrowIfShapeNotValid();\n\tfloat density = (float)luaL_checknumber(L, 1);\n\tb2MassData data;\n\tshape->ComputeMass(&data, density);\n\tb2Vec2 center = Physics::scaleUp(data.center);\n\tlua_pushnumber(L, center.x);\n\tlua_pushnumber(L, center.y);\n\tlua_pushnumber(L, data.mass);\n\tlua_pushnumber(L, Physics::scaleUp(Physics::scaleUp(data.I)));\n\treturn 4;\n}\n\nint Shape::getBoundingBox(lua_State *L) const\n{\n\tthrowIfFixtureNotValid();\n\tint childIndex = (int) luaL_optinteger(L, 1, 1) - 1; // Convert from 1-based index\n\tb2AABB box;\n\tluax_catchexcept(L, [&]() { box = fixture->GetAABB(childIndex); });\n\tbox = Physics::scaleUp(box);\n\tlua_pushnumber(L, box.lowerBound.x);\n\tlua_pushnumber(L, box.lowerBound.y);\n\tlua_pushnumber(L, box.upperBound.x);\n\tlua_pushnumber(L, box.upperBound.y);\n\treturn 4;\n}\n\nint Shape::getMassData(lua_State *L) const\n{\n\tthrowIfFixtureNotValid();\n\tb2MassData data;\n\tfixture->GetMassData(&data);\n\tb2Vec2 center = Physics::scaleUp(data.center);\n\tlua_pushnumber(L, center.x);\n\tlua_pushnumber(L, center.y);\n\tlua_pushnumber(L, data.mass);\n\tlua_pushnumber(L, data.I);\n\treturn 4;\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/Shape.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_SHAPE_H\n#define LOVE_PHYSICS_BOX2D_SHAPE_H\n\n// LOVE\n#include \"physics/Shape.h\"\n#include \"physics/box2d/Body.h\"\n#include \"common/Reference.h\"\n\n// Box2D\n#include <box2d/Box2D.h>\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\n/**\n * A Shape is geometry, attached to a Body via a Fixture.\n * A Body has position and orientation, and\n * a Shape's geometry will be affected by the parent\n * body's transformation.\n **/\nclass Shape : public love::physics::Shape\n{\npublic:\n\n\tfriend class Physics;\n\n\t/**\n\t * Creates a Shape.\n\t **/\n\tShape(Body *body, const b2Shape &shape);\n\n\tvirtual ~Shape();\n\n\tvoid destroy(bool implicit = false);\n\n\t/**\n\t * Returns true if the shape is active in a Box2D world.\n\t **/\n\tbool isValid() const { return fixture != nullptr; }\n\t\n\t/**\n\t * Returns true if the shape has not been destroyed.\n\t **/\n\tbool isShapeValid() const { return shape != nullptr; }\n\n\t/**\n\t * Checks whether this Shape acts as a sensor.\n\t **/\n\tbool isSensor() const;\n\n\t/**\n\t * Set whether this Shape should be a sensor or not.\n\t **/\n\tvoid setSensor(bool sensor);\n\n\t/**\n\t * Gets the Body this Shape is attached to.\n\t **/\n\tBody *getBody() const;\n\n\t/**\n\t * Sets the filter data. An integer array is used even though the\n\t * first two elements are unsigned shorts. The elements are:\n\t * category (16-bits), mask (16-bits) and group (32-bits/int).\n\t **/\n\tvoid setFilterData(int *v);\n\n\t/**\n\t * Gets the filter data. An integer array is used even though the\n\t * first two elements are unsigned shorts. The elements are:\n\t * category (16-bits), mask (16-bits) and group (32-bits/int).\n\t **/\n\tvoid getFilterData(int *v);\n\n\t/**\n\t * This function stores an in-C reference to\n\t * arbitrary Lua data in the Shape object.\n\t **/\n\tint setUserData(lua_State *L);\n\n\t/**\n\t * Gets the data set with setUserData. If no\n\t * data is set, nil is returned.\n\t **/\n\tint getUserData(lua_State *L);\n\n\t/**\n\t * Sets the friction of the Shape.\n\t **/\n\tvoid setFriction(float friction);\n\n\t/**\n\t * Sets the restitution for the Shape.\n\t **/\n\tvoid setRestitution(float restitution);\n\n\t/**\n\t * Sets the density of the Shape.\n\t **/\n\tvoid setDensity(float density);\n\n\t/**\n\t * Gets the friction of the Shape.\n\t **/\n\tfloat getFriction() const;\n\n\t/**\n\t * Gets the restitution of the Shape.\n\t **/\n\tfloat getRestitution() const;\n\n\t/**\n\t * Gets the density of the Shape.\n\t **/\n\tfloat getDensity() const;\n\n\t/**\n\t * Checks if a point is inside the Shape.\n\t **/\n\tbool testPoint(float x, float y) const;\n\tbool testPoint(float x, float y, float r, float px, float py) const;\n\n\t/**\n\t * Gets the type of Shape. Useful for\n\t * debug drawing.\n\t **/\n\tType getType() const;\n\n\tfloat getRadius() const;\n\tint getChildCount() const;\n\tint rayCast(lua_State *L) const;\n\tint computeAABB(lua_State *L) const;\n\tint computeMass(lua_State *L) const;\n\n\tvoid setGroupIndex(int index);\n\tint getGroupIndex() const;\n\n\tint setCategory(lua_State *L);\n\tint setMask(lua_State *L);\n\tint getCategory(lua_State *L);\n\tint getMask(lua_State *L);\n\tuint16 getBits(lua_State *L);\n\tint pushBits(lua_State *L, uint16 bits);\n\n\t/**\n\t * Gets the bounding box for this Shape.\n\t **/\n\tint getBoundingBox(lua_State *L) const;\n\n\t/**\n\t * Gets the mass data for this Shape.\n\t * This operation may be expensive.\n\t **/\n\tint getMassData(lua_State *L) const;\n\n\tvoid throwIfFixtureNotValid() const;\n\tvoid throwIfShapeNotValid() const;\n\nprotected:\n\n\t// The Box2D shape.\n\tb2Shape *shape;\n\tbool own;\n\n\tShape::Type shapeType;\n\n\tBody *body;\n\tb2Fixture *fixture;\n\n\t// Reference to arbitrary data.\n\tReference* ref = nullptr;\n\n}; // Shape\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_SHAPE_H\n"
  },
  {
    "path": "src/modules/physics/box2d/WeldJoint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"WeldJoint.h\"\n\n#include \"common/math.h\"\n\n// Module\n#include \"Body.h\"\n#include \"World.h\"\n#include \"Physics.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nlove::Type WeldJoint::type(\"WeldJoint\", &Joint::type);\n\nWeldJoint::WeldJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected)\n\t: Joint(body1, body2)\n\t, joint(NULL)\n{\n\tb2WeldJointDef def;\n\tinit(def, body1, body2, xA, yA, xB, yB, collideConnected);\n\tjoint = (b2WeldJoint *)createJoint(&def);\n}\n\nWeldJoint::WeldJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected, float referenceAngle)\n\t: Joint(body1, body2)\n\t, joint(NULL)\n{\n\tb2WeldJointDef def;\n\tinit(def, body1, body2, xA, yA, xB, yB, collideConnected);\n\tdef.referenceAngle = referenceAngle;\n\tjoint = (b2WeldJoint *)createJoint(&def);\n}\n\nWeldJoint::~WeldJoint()\n{\n}\n\nvoid WeldJoint::init(b2WeldJointDef &def, Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected)\n{\n\tdef.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(xA,yA)));\n\tdef.localAnchorB = body2->body->GetLocalPoint(Physics::scaleDown(b2Vec2(xB, yB)));\n\tdef.collideConnected = collideConnected;\n}\n\nvoid WeldJoint::setStiffness(float k)\n{\n\tjoint->SetStiffness(k);\n}\n\nfloat WeldJoint::getStiffness() const\n{\n\treturn joint->GetStiffness();\n}\n\nvoid WeldJoint::setDamping(float d)\n{\n\tjoint->SetDamping(d);\n}\n\nfloat WeldJoint::getDamping() const\n{\n\treturn joint->GetDamping();\n}\n\nfloat WeldJoint::getReferenceAngle() const\n{\n\treturn joint->GetReferenceAngle();\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/WeldJoint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WELD_JOINT_H\n#define LOVE_PHYSICS_BOX2D_WELD_JOINT_H\n\n// Module\n#include \"Joint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\n/**\n * A WeldJoint essentially glues two bodies together.\n **/\nclass WeldJoint : public Joint\n{\npublic:\n\n\tstatic love::Type type;\n\n\t/**\n\t * Creates a new WeldJoint connecting body1 and body2.\n\t **/\n\tWeldJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected);\n\n\tWeldJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected, float referenceAngle);\n\n\tvirtual ~WeldJoint();\n\n\t/**\n\t * Sets the response speed. Dependent of mass\n\t **/\n\tvoid setStiffness(float k);\n\n\t/**\n\t * Gets the response speed. Dependent of mass\n\t **/\n\tfloat getStiffness() const;\n\n\t/**\n\t * Set the spring damping. Dependent of mass\n\t **/\n\tvoid setDamping(float ratio);\n\n\t/**\n\t * Get the spring damping. Dependent of mass\n\t **/\n\tfloat getDamping() const;\n\n\t/**\n\t * Gets the reference angle.\n\t **/\n\tfloat getReferenceAngle() const;\n\nprivate:\n\n\t// The Box2D weld joint object.\n\tb2WeldJoint *joint;\n\n\tvoid init(b2WeldJointDef &def, Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected);\n};\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WELD_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/WheelJoint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"WheelJoint.h\"\n\n// Module\n#include \"Body.h\"\n#include \"World.h\"\n#include \"Physics.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nlove::Type WheelJoint::type(\"WheelJoint\", &Joint::type);\n\nWheelJoint::WheelJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected)\n\t: Joint(body1, body2)\n\t, joint(NULL)\n{\n\tb2WheelJointDef def;\n\n\tdef.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(xA,yA)), b2Vec2(ax,ay));\n\tdef.localAnchorB = body2->body->GetLocalPoint(Physics::scaleDown(b2Vec2(xB, yB)));\n\tdef.collideConnected = collideConnected;\n\tjoint = (b2WheelJoint *)createJoint(&def);\n}\n\nWheelJoint::~WheelJoint()\n{\n}\n\nfloat WheelJoint::getJointTranslation() const\n{\n\treturn Physics::scaleUp(joint->GetJointTranslation());\n}\n\nfloat WheelJoint::getJointSpeed() const\n{\n\treturn Physics::scaleUp(joint->GetJointLinearSpeed());\n}\n\nvoid WheelJoint::setMotorEnabled(bool enable)\n{\n\treturn joint->EnableMotor(enable);\n}\n\nbool WheelJoint::isMotorEnabled() const\n{\n\treturn joint->IsMotorEnabled();\n}\n\nvoid WheelJoint::setMotorSpeed(float speed)\n{\n\tjoint->SetMotorSpeed(speed);\n}\n\nfloat WheelJoint::getMotorSpeed() const\n{\n\treturn joint->GetMotorSpeed();\n}\n\nvoid WheelJoint::setMaxMotorTorque(float torque)\n{\n\tjoint->SetMaxMotorTorque(Physics::scaleDown(Physics::scaleDown(torque)));\n}\n\nfloat WheelJoint::getMaxMotorTorque() const\n{\n\treturn Physics::scaleUp(Physics::scaleUp(joint->GetMaxMotorTorque()));\n}\n\nfloat WheelJoint::getMotorTorque(float dt) const\n{\n\tfloat invdt = 1.0f / dt;\n\treturn Physics::scaleUp(Physics::scaleUp(joint->GetMotorTorque(invdt)));\n}\n\nvoid WheelJoint::setStiffness(float k)\n{\n\tjoint->SetStiffness(k);\n}\n\nfloat WheelJoint::getStiffness() const\n{\n\treturn joint->GetStiffness();\n}\n\nvoid WheelJoint::setDamping(float ratio)\n{\n\tjoint->SetDamping(ratio);\n}\n\nfloat WheelJoint::getDamping() const\n{\n\treturn joint->GetDamping();\n}\n\nint WheelJoint::getAxis(lua_State *L)\n{\n\tb2Vec2 axis = joint->GetLocalAxisA();\n\tgetBodyA()->getWorldVector(axis.x, axis.y, axis.x, axis.y);\n\tlua_pushnumber(L, axis.x);\n\tlua_pushnumber(L, axis.y);\n\treturn 2;\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/WheelJoint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WHEEL_JOINT_H\n#define LOVE_PHYSICS_BOX2D_WHEEL_JOINT_H\n\n// Module\n#include \"Joint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\n/**\n * WheelJoints provide two degrees of freedom: translation\n * along a defined axis and rotation in the plane. Designed\n * for vehicle suspensions.\n **/\nclass WheelJoint : public Joint\n{\npublic:\n\n\tstatic love::Type type;\n\n\t/**\n\t * Creates a new WheelJoint connecting body1 and body2.\n\t **/\n\tWheelJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected);\n\n\tvirtual ~WheelJoint();\n\n\t/**\n\t * Get the current joint translation, usually in meters.\n\t **/\n\tfloat getJointTranslation() const;\n\n\t/**\n\t * Get the current joint translation speed, usually in meters per second.\n\t **/\n\tfloat getJointSpeed() const;\n\n\t/**\n\t * Enable/disable the joint motor.\n\t **/\n\tvoid setMotorEnabled(bool enable);\n\n\t/**\n\t * Checks whether the motor is enabled.\n\t **/\n\tbool isMotorEnabled() const;\n\n\t/**\n\t * Set the motor speed, usually in meters per second.\n\t **/\n\tvoid setMotorSpeed(float speed);\n\n\t/**\n\t * Get the motor speed, usually in meters per second.\n\t **/\n\tfloat getMotorSpeed() const;\n\n\t/**\n\t * Set the maximum motor torque, usually in N.\n\t **/\n\tvoid setMaxMotorTorque(float torque);\n\n\t/**\n\t * Get the maximum motor torque, usually in N.\n\t **/\n\tfloat getMaxMotorTorque() const;\n\n\t/**\n\t * Get the current motor torque, usually in N.\n\t * @param dt The time step.\n\t **/\n\tfloat getMotorTorque(float dt) const;\n\n\t/**\n\t * Sets the response speed. Dependent of mass\n\t **/\n\tvoid setStiffness(float k);\n\n\t/**\n\t * Gets the response speed. Dependent of mass\n\t **/\n\tfloat getStiffness() const;\n\n\t/**\n\t * Set the spring damping. Dependent of mass\n\t **/\n\tvoid setDamping(float ratio);\n\n\t/**\n\t * Get the spring damping. Dependent of mass\n\t **/\n\tfloat getDamping() const;\n\n\t/**\n\t * Gets the axis unit vector, relative to body1.\n\t * @returns The X component of the axis unit vector.\n\t * @returns The Y component of the axis unit vector.\n\t **/\n\tint getAxis(lua_State *L);\n\nprivate:\n\n\t// The Box2D wheel joint object.\n\tb2WheelJoint *joint;\n};\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WHEEL_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/World.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"World.h\"\n\n#include \"Shape.h\"\n#include \"Contact.h\"\n#include \"Physics.h\"\n#include \"common/Reference.h\"\n\n// Needed for World::getJoints. It should be moved to wrapper code...\n#include \"wrap_Joint.h\"\n#include \"wrap_Shape.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nlove::Type World::type(\"World\", &Object::type);\n\nWorld::ContactCallback::ContactCallback(World *world)\n\t: ref(nullptr)\n\t, L(nullptr)\n\t, world(world)\n{\n}\n\nWorld::ContactCallback::~ContactCallback()\n{\n\tif (ref != nullptr)\n\t\tdelete ref;\n}\n\nvoid World::ContactCallback::process(b2Contact *contact, const b2ContactImpulse *impulse)\n{\n\t// Process contacts.\n\tif (ref != nullptr && L != nullptr)\n\t{\n\t\tref->push(L);\n\n\t\t// Push first shape.\n\t\t{\n\t\t\tShape *a = (Shape *)(contact->GetFixtureA()->GetUserData().pointer);\n\t\t\tif (a != nullptr)\n\t\t\t\tluax_pushshape(L, a);\n\t\t\telse\n\t\t\t\tthrow love::Exception(\"A Shape has escaped Memoizer!\");\n\t\t}\n\n\t\t// Push second shape.\n\t\t{\n\t\t\tShape *b = (Shape *)(contact->GetFixtureB()->GetUserData().pointer);\n\t\t\tif (b != nullptr)\n\t\t\t\tluax_pushshape(L, b);\n\t\t\telse\n\t\t\t\tthrow love::Exception(\"A Shape has escaped Memoizer!\");\n\t\t}\n\n\t\tContact *cobj = (Contact *)world->findObject(contact);\n\t\tif (!cobj)\n\t\t\tcobj = new Contact(world, contact);\n\t\telse\n\t\t\tcobj->retain();\n\n\t\tluax_pushtype(L, cobj);\n\t\tcobj->release();\n\n\t\tint args = 3;\n\t\tif (impulse)\n\t\t{\n\t\t\tfor (int c = 0; c < impulse->count; c++)\n\t\t\t{\n\t\t\t\tlua_pushnumber(L, Physics::scaleUp(impulse->normalImpulses[c]));\n\t\t\t\tlua_pushnumber(L, Physics::scaleUp(impulse->tangentImpulses[c]));\n\t\t\t\targs += 2;\n\t\t\t}\n\t\t}\n\t\tlua_call(L, args, 0);\n\t}\n\n}\n\nWorld::ContactFilter::ContactFilter()\n\t: ref(nullptr)\n\t, L(nullptr)\n{\n}\n\nWorld::ContactFilter::~ContactFilter()\n{\n\tif (ref != nullptr)\n\t\tdelete ref;\n}\n\nbool World::ContactFilter::process(Shape *a, Shape *b)\n{\n\tif (ref != nullptr && L != nullptr)\n\t{\n\t\tref->push(L);\n\t\tluax_pushshape(L, a);\n\t\tluax_pushshape(L, b);\n\t\tlua_call(L, 2, 1);\n\t\treturn luax_toboolean(L, -1);\n\t}\n\n\treturn true;\n}\n\nWorld::QueryCallback::QueryCallback(lua_State *L, int idx)\n\t: L(L)\n\t, funcidx(idx)\n{\n\tluaL_checktype(L, funcidx, LUA_TFUNCTION);\n\tuserargs = lua_gettop(L) - funcidx;\n}\n\nWorld::QueryCallback::~QueryCallback()\n{\n}\n\nbool World::QueryCallback::ReportFixture(b2Fixture *fixture)\n{\n\tif (L != nullptr)\n\t{\n\t\tlua_pushvalue(L, funcidx);\n\t\tShape *f = (Shape *)(fixture->GetUserData().pointer);\n\t\tif (!f)\n\t\t\tthrow love::Exception(\"A Shape has escaped Memoizer!\");\n\t\tluax_pushshape(L, f);\n\t\tfor (int i = 1; i <= userargs; i++)\n\t\t\tlua_pushvalue(L, funcidx + i);\n\t\tlua_call(L, 1 + userargs, 1);\n\t\tbool cont = luax_toboolean(L, -1);\n\t\tlua_pop(L, 1);\n\t\treturn cont;\n\t}\n\n\treturn true;\n}\n\nWorld::CollectCallback::CollectCallback(uint16 categoryMask, lua_State *L)\n\t: categoryMask(categoryMask)\n\t, L(L)\n{\n\tlua_newtable(L);\n}\n\nWorld::CollectCallback::~CollectCallback()\n{\n}\n\nbool World::CollectCallback::ReportFixture(b2Fixture *f)\n{\n\tif (categoryMask != 0xFFFF && (categoryMask & f->GetFilterData().categoryBits) == 0)\n\t\treturn true;\n\n\tShape *shape = (Shape *)(f->GetUserData().pointer);\n\tif (!shape)\n\t\tthrow love::Exception(\"A Shape has escaped Memoizer!\");\n\tluax_pushshape(L, shape);\n\tlua_rawseti(L, -2, i);\n\ti++;\n\treturn true;\n}\n\nWorld::RayCastCallback::RayCastCallback(lua_State *L, int idx)\n\t: L(L)\n\t, funcidx(idx)\n{\n\tluaL_checktype(L, funcidx, LUA_TFUNCTION);\n\tuserargs = lua_gettop(L) - funcidx;\n}\n\nWorld::RayCastCallback::~RayCastCallback()\n{\n}\n\nfloat World::RayCastCallback::ReportFixture(b2Fixture *fixture, const b2Vec2 &point, const b2Vec2 &normal, float fraction)\n{\n\tif (L != nullptr)\n\t{\n\t\tlua_pushvalue(L, funcidx);\n\t\tShape *f = (Shape *)(fixture->GetUserData().pointer);\n\t\tif (!f)\n\t\t\tthrow love::Exception(\"A Shape has escaped Memoizer!\");\n\t\tluax_pushshape(L, f);\n\t\tb2Vec2 scaledPoint = Physics::scaleUp(point);\n\t\tlua_pushnumber(L, scaledPoint.x);\n\t\tlua_pushnumber(L, scaledPoint.y);\n\t\tlua_pushnumber(L, normal.x);\n\t\tlua_pushnumber(L, normal.y);\n\t\tlua_pushnumber(L, fraction);\n\t\tfor (int i = 1; i <= userargs; i++)\n\t\t\tlua_pushvalue(L, funcidx + i);\n\t\tlua_call(L, 6 + userargs, 1);\n\t\tif (!lua_isnumber(L, -1))\n\t\t\tluaL_error(L, \"Raycast callback didn't return a number!\");\n\t\tfloat fraction = (float) lua_tonumber(L, -1);\n\t\tlua_pop(L, 1);\n\t\treturn fraction;\n\t}\n\n\treturn 0;\n}\n\nWorld::RayCastOneCallback::RayCastOneCallback(uint16 categoryMask, bool any)\n\t: hitFixture(nullptr)\n\t, hitPoint()\n\t, hitNormal()\n\t, hitFraction(1.0f)\n\t, categoryMask(categoryMask)\n\t, any(any)\n{\n}\n\nfloat World::RayCastOneCallback::ReportFixture(b2Fixture *fixture, const b2Vec2 &point, const b2Vec2 &normal, float fraction)\n{\n\tif (categoryMask != 0xFFFF && (categoryMask & fixture->GetFilterData().categoryBits) == 0)\n\t\treturn -1;\n\n\thitFixture = fixture;\n\thitPoint = point;\n\thitNormal = normal;\n\thitFraction = fraction;\n\n\t// Returning the fraction makes sure it doesn't process anything farther away in subsequent iterations.\n\treturn any ? 0 : fraction;\n}\n\nvoid World::SayGoodbye(b2Fixture *fixture)\n{\n\tShape *s = (Shape *)(fixture->GetUserData().pointer);\n\t// Hint implicit destruction with true.\n\tif (s) s->destroy(true);\n}\n\nvoid World::SayGoodbye(b2Joint *joint)\n{\n\tJoint *j = (Joint *)(joint->GetUserData().pointer);\n\t// Hint implicit destruction with true.\n\tif (j) j->destroyJoint(true);\n}\n\nWorld::World()\n\t: world(nullptr)\n\t, destructWorld(false)\n\t, begin(this)\n\t, end(this)\n\t, presolve(this)\n\t, postsolve(this)\n{\n\tworld = new b2World(b2Vec2(0,0));\n\tworld->SetAllowSleeping(true);\n\tworld->SetContactListener(this);\n\tworld->SetContactFilter(this);\n\tworld->SetDestructionListener(this);\n\tb2BodyDef def;\n\tgroundBody = world->CreateBody(&def);\n\tregisterObject(world, this);\n}\n\nWorld::World(b2Vec2 gravity, bool sleep)\n\t: world(nullptr)\n\t, destructWorld(false)\n\t, begin(this)\n\t, end(this)\n\t, presolve(this)\n\t, postsolve(this)\n{\n\tworld = new b2World(Physics::scaleDown(gravity));\n\tworld->SetAllowSleeping(sleep);\n\tworld->SetContactListener(this);\n\tworld->SetContactFilter(this);\n\tworld->SetDestructionListener(this);\n\tb2BodyDef def;\n\tgroundBody = world->CreateBody(&def);\n\tregisterObject(world, this);\n}\n\nWorld::~World()\n{\n\tdestroy();\n}\n\nvoid World::update(float dt)\n{\n\tupdate(dt, 8, 3); // Box2D 2.3's recommended defaults.\n}\n\nvoid World::update(float dt, int velocityIterations, int positionIterations)\n{\n\tworld->Step(dt, velocityIterations, positionIterations);\n\n\t// Destroy all objects marked during the time step.\n\tfor (Body *b : destructBodies)\n\t{\n\t\tif (b->body != nullptr) b->destroy();\n\t\t// Release for reference in vector.\n\t\tb->release();\n\t}\n\tfor (Shape *s : destructShapes)\n\t{\n\t\tif (s->isValid()) s->destroy();\n\t\t// Release for reference in vector.\n\t\ts->release();\n\t}\n\tfor (Joint *j : destructJoints)\n\t{\n\t\tif (j->isValid()) j->destroyJoint();\n\t\t// Release for reference in vector.\n\t\tj->release();\n\t}\n\tdestructBodies.clear();\n\tdestructShapes.clear();\n\tdestructJoints.clear();\n\n\tif (destructWorld)\n\t\tdestroy();\n}\n\nvoid World::BeginContact(b2Contact *contact)\n{\n\tbegin.process(contact);\n}\n\nvoid World::EndContact(b2Contact *contact)\n{\n\tend.process(contact);\n\n\t// Letting the Contact know that the b2Contact will be destroyed any second.\n\tContact *c = (Contact *)findObject(contact);\n\tif (c != nullptr)\n\t\tc->invalidate();\n}\n\nvoid World::PreSolve(b2Contact *contact, const b2Manifold *oldManifold)\n{\n\tB2_NOT_USED(oldManifold); // not sure what to do with this\n\tpresolve.process(contact);\n}\n\nvoid World::PostSolve(b2Contact *contact, const b2ContactImpulse *impulse)\n{\n\tpostsolve.process(contact, impulse);\n}\n\nbool World::ShouldCollide(b2Fixture *fixtureA, b2Fixture *fixtureB)\n{\n\tconst b2Filter &filterA = fixtureA->GetFilterData();\n\tconst b2Filter &filterB = fixtureB->GetFilterData();\n\n\t// From b2_world_callbacks.cpp\n\t// 0 is the default group index. If they're customized to be the same group,\n\t// allow collisions if it's positive and disallow if it's negative.\n\tif (filterA.groupIndex != 0 && filterA.groupIndex == filterB.groupIndex)\n\t\treturn filterA.groupIndex > 0;\n\n\tif ((filterA.maskBits & filterB.categoryBits) == 0 || (filterA.categoryBits & filterB.maskBits) == 0)\n\t\treturn false;\n\n\t// Shapes should be memoized, if we created them\n\tShape *a = (Shape *)(fixtureA->GetUserData().pointer);\n\tShape *b = (Shape *)(fixtureB->GetUserData().pointer);\n\tif (!a || !b)\n\t\tthrow love::Exception(\"A Shape has escaped Memoizer!\");\n\n\treturn filter.process(a, b);\n}\n\nbool World::isValid() const\n{\n\treturn world != nullptr;\n}\n\nint World::setCallbacks(lua_State *L)\n{\n\tint nargs = lua_gettop(L);\n\n\tfor (int i = 1; i <= 4; i++)\n\t{\n\t\tif (!lua_isnoneornil(L, i))\n\t\t\tluaL_checktype(L, i, LUA_TFUNCTION);\n\t}\n\n\tdelete begin.ref;\n\tbegin.ref = nullptr;\n\n\tdelete end.ref;\n\tend.ref = nullptr;\n\n\tdelete presolve.ref;\n\tpresolve.ref = nullptr;\n\n\tdelete postsolve.ref;\n\tpostsolve.ref = nullptr;\n\n\tif (nargs >= 1)\n\t{\n\t\tlua_pushvalue(L, 1);\n\t\tbegin.ref = luax_refif(L, LUA_TFUNCTION);\n\t\tbegin.L = L;\n\t}\n\n\tif (nargs >= 2)\n\t{\n\t\tlua_pushvalue(L, 2);\n\t\tend.ref = luax_refif(L, LUA_TFUNCTION);\n\t\tend.L = L;\n\t}\n\n\tif (nargs >= 3)\n\t{\n\t\tlua_pushvalue(L, 3);\n\t\tpresolve.ref = luax_refif(L, LUA_TFUNCTION);\n\t\tpresolve.L = L;\n\t}\n\n\tif (nargs >= 4)\n\t{\n\t\tlua_pushvalue(L, 4);\n\t\tpostsolve.ref = luax_refif(L, LUA_TFUNCTION);\n\t\tpostsolve.L = L;\n\t}\n\n\treturn 0;\n}\n\nint World::getCallbacks(lua_State *L)\n{\n\tbegin.ref ? begin.ref->push(L) : lua_pushnil(L);\n\tend.ref ? end.ref->push(L) : lua_pushnil(L);\n\tpresolve.ref ? presolve.ref->push(L) : lua_pushnil(L);\n\tpostsolve.ref ? postsolve.ref->push(L) : lua_pushnil(L);\n\treturn 4;\n}\n\nvoid World::setCallbacksL(lua_State *L)\n{\n\tbegin.L = end.L = presolve.L = postsolve.L = filter.L = L;\n}\n\nint World::setContactFilter(lua_State *L)\n{\n\tif (!lua_isnoneornil(L, 1))\n\t\tluaL_checktype(L, 1, LUA_TFUNCTION);\n\n\tif (filter.ref)\n\t\tdelete filter.ref;\n\tfilter.ref = luax_refif(L, LUA_TFUNCTION);\n\tfilter.L = L;\n\treturn 0;\n}\n\nint World::getContactFilter(lua_State *L)\n{\n\tfilter.ref ? filter.ref->push(L) : lua_pushnil(L);\n\treturn 1;\n}\n\nvoid World::setGravity(float x, float y)\n{\n\tworld->SetGravity(Physics::scaleDown(b2Vec2(x, y)));\n}\n\nint World::getGravity(lua_State *L)\n{\n\tb2Vec2 v = Physics::scaleUp(world->GetGravity());\n\tlua_pushnumber(L, v.x);\n\tlua_pushnumber(L, v.y);\n\treturn 2;\n}\n\nvoid World::translateOrigin(float x, float y)\n{\n\tworld->ShiftOrigin(Physics::scaleDown(b2Vec2(x, y)));\n}\n\nvoid World::setSleepingAllowed(bool allow)\n{\n\tworld->SetAllowSleeping(allow);\n}\n\nbool World::isSleepingAllowed() const\n{\n\treturn world->GetAllowSleeping();\n}\n\nbool World::isLocked() const\n{\n\treturn world->IsLocked();\n}\n\nint World::getBodyCount() const\n{\n\treturn world->GetBodyCount()-1; // ignore the ground body\n}\n\nint World::getJointCount() const\n{\n\treturn world->GetJointCount();\n}\n\nint World::getContactCount() const\n{\n\treturn world->GetContactCount();\n}\n\nint World::getBodies(lua_State *L) const\n{\n\tlua_newtable(L);\n\tb2Body *b = world->GetBodyList();\n\tint i = 1;\n\tdo\n\t{\n\t\tif (!b)\n\t\t\tbreak;\n\t\tif (b == groundBody)\n\t\t\tcontinue;\n\t\tBody *body = (Body *)(b->GetUserData().pointer);\n\t\tif (!body)\n\t\t\tthrow love::Exception(\"A body has escaped Memoizer!\");\n\t\tluax_pushtype(L, body);\n\t\tlua_rawseti(L, -2, i);\n\t\ti++;\n\t}\n\twhile ((b = b->GetNext()));\n\treturn 1;\n}\n\nint World::getJoints(lua_State *L) const\n{\n\tlua_newtable(L);\n\tb2Joint *j = world->GetJointList();\n\tint i = 1;\n\tdo\n\t{\n\t\tif (!j) break;\n\t\tJoint *joint = (Joint *)(j->GetUserData().pointer);\n\t\tif (!joint) throw love::Exception(\"A joint has escaped Memoizer!\");\n\t\tluax_pushjoint(L, joint);\n\t\tlua_rawseti(L, -2, i);\n\t\ti++;\n\t}\n\twhile ((j = j->GetNext()));\n\treturn 1;\n}\n\nint World::getContacts(lua_State *L)\n{\n\tlua_newtable(L);\n\tb2Contact *c = world->GetContactList();\n\tint i = 1;\n\tdo\n\t{\n\t\tif (!c) break;\n\t\tContact *contact = (Contact *)findObject(c);\n\t\tif (!contact)\n\t\t\tcontact = new Contact(this, c);\n\t\telse\n\t\t\tcontact->retain();\n\t\tluax_pushtype(L, contact);\n\t\tcontact->release();\n\t\tlua_rawseti(L, -2, i);\n\t\ti++;\n\t}\n\twhile ((c = c->GetNext()));\n\treturn 1;\n}\n\nb2Body *World::getGroundBody() const\n{\n\treturn groundBody;\n}\n\nint World::queryShapesInArea(lua_State *L)\n{\n\tb2AABB box;\n\tfloat lx = (float)luaL_checknumber(L, 1);\n\tfloat ly = (float)luaL_checknumber(L, 2);\n\tfloat ux = (float)luaL_checknumber(L, 3);\n\tfloat uy = (float)luaL_checknumber(L, 4);\n\tbox.lowerBound = Physics::scaleDown(b2Vec2(lx, ly));\n\tbox.upperBound = Physics::scaleDown(b2Vec2(ux, uy));\n\tluaL_checktype(L, 5, LUA_TFUNCTION);\n\tQueryCallback query(L, 5);\n\tworld->QueryAABB(&query, box);\n\treturn 0;\n}\n\nint World::getShapesInArea(lua_State *L)\n{\n\tfloat lx = (float)luaL_checknumber(L, 1);\n\tfloat ly = (float)luaL_checknumber(L, 2);\n\tfloat ux = (float)luaL_checknumber(L, 3);\n\tfloat uy = (float)luaL_checknumber(L, 4);\n\tuint16 categoryMaskBits = (uint16)luaL_optinteger(L, 5, 0xFFFF);\n\tb2AABB box;\n\tbox.lowerBound = Physics::scaleDown(b2Vec2(lx, ly));\n\tbox.upperBound = Physics::scaleDown(b2Vec2(ux, uy));\n\tCollectCallback query(categoryMaskBits, L);\n\tworld->QueryAABB(&query, box);\n\treturn 1;\n}\n\nint World::rayCast(lua_State *L)\n{\n\tfloat x1 = (float)luaL_checknumber(L, 1);\n\tfloat y1 = (float)luaL_checknumber(L, 2);\n\tfloat x2 = (float)luaL_checknumber(L, 3);\n\tfloat y2 = (float)luaL_checknumber(L, 4);\n\tb2Vec2 v1 = Physics::scaleDown(b2Vec2(x1, y1));\n\tb2Vec2 v2 = Physics::scaleDown(b2Vec2(x2, y2));\n\tluaL_checktype(L, 5, LUA_TFUNCTION);\n\tRayCastCallback raycast(L, 5);\n\tworld->RayCast(&raycast, v1, v2);\n\treturn 0;\n}\n\nint World::rayCastAny(lua_State *L)\n{\n\tfloat x1 = (float)luaL_checknumber(L, 1);\n\tfloat y1 = (float)luaL_checknumber(L, 2);\n\tfloat x2 = (float)luaL_checknumber(L, 3);\n\tfloat y2 = (float)luaL_checknumber(L, 4);\n\tuint16 categoryMaskBits = (uint16)luaL_optinteger(L, 5, 0xFFFF);\n\tb2Vec2 v1 = Physics::scaleDown(b2Vec2(x1, y1));\n\tb2Vec2 v2 = Physics::scaleDown(b2Vec2(x2, y2));\n\tRayCastOneCallback raycast(categoryMaskBits, true);\n\tworld->RayCast(&raycast, v1, v2);\n\tif (raycast.hitFixture)\n\t{\n\t\tShape *f = (Shape *)(raycast.hitFixture->GetUserData().pointer);\n\t\tif (f == nullptr)\n\t\t\treturn luaL_error(L, \"A Shape has escaped Memoizer!\");\n\t\tluax_pushshape(L, f);\n\n\t\tb2Vec2 hitPoint = Physics::scaleUp(raycast.hitPoint);\n\t\tlua_pushnumber(L, hitPoint.x);\n\t\tlua_pushnumber(L, hitPoint.y);\n\t\tlua_pushnumber(L, raycast.hitNormal.x);\n\t\tlua_pushnumber(L, raycast.hitNormal.y);\n\t\tlua_pushnumber(L, raycast.hitFraction);\n\t\treturn 6;\n\t}\n\treturn 0;\n}\n\nint World::rayCastClosest(lua_State *L)\n{\n\tfloat x1 = (float)luaL_checknumber(L, 1);\n\tfloat y1 = (float)luaL_checknumber(L, 2);\n\tfloat x2 = (float)luaL_checknumber(L, 3);\n\tfloat y2 = (float)luaL_checknumber(L, 4);\n\tuint16 categoryMaskBits = (uint16)luaL_optinteger(L, 5, 0xFFFF);\n\tb2Vec2 v1 = Physics::scaleDown(b2Vec2(x1, y1));\n\tb2Vec2 v2 = Physics::scaleDown(b2Vec2(x2, y2));\n\tRayCastOneCallback raycast(categoryMaskBits, false);\n\tworld->RayCast(&raycast, v1, v2);\n\tif (raycast.hitFixture)\n\t{\n\t\tShape *f = (Shape *)(raycast.hitFixture->GetUserData().pointer);\n\t\tif (f == nullptr)\n\t\t\treturn luaL_error(L, \"A Shape has escaped Memoizer!\");\n\t\tluax_pushshape(L, f);\n\n\t\tb2Vec2 hitPoint = Physics::scaleUp(raycast.hitPoint);\n\t\tlua_pushnumber(L, hitPoint.x);\n\t\tlua_pushnumber(L, hitPoint.y);\n\t\tlua_pushnumber(L, raycast.hitNormal.x);\n\t\tlua_pushnumber(L, raycast.hitNormal.y);\n\t\tlua_pushnumber(L, raycast.hitFraction);\n\t\treturn 6;\n\t}\n\treturn 0;\n}\n\nvoid World::destroy()\n{\n\tif (world == nullptr)\n\t\treturn;\n\n\tif (world->IsLocked())\n\t{\n\t\tdestructWorld = true;\n\t\treturn;\n\t}\n\n\t// Remove userdata reference to avoid it sticking around after GC\n\tif (begin.ref)     begin.ref->unref();\n\tif (end.ref)       end.ref->unref();\n\tif (presolve.ref)  presolve.ref->unref();\n\tif (postsolve.ref) postsolve.ref->unref();\n\tif (filter.ref)    filter.ref->unref();\n\n\t//disable callbacks\n\tbegin.ref = end.ref = presolve.ref = postsolve.ref = filter.ref = nullptr;\n\n\t// Cleaning up the world.\n\tb2Body *b = world->GetBodyList();\n\twhile (b)\n\t{\n\t\tb2Body *t = b;\n\t\tb = b->GetNext();\n\t\tif (t == groundBody)\n\t\t\tcontinue;\n\t\tBody *body = (Body *)(t->GetUserData().pointer);\n\t\tif (!body)\n\t\t\tthrow love::Exception(\"A body has escaped Memoizer!\");\n\t\tbody->destroy();\n\t}\n\n\tworld->DestroyBody(groundBody);\n\tunregisterObject(world);\n\n\tdelete world;\n\tworld = nullptr;\n}\n\nvoid World::registerObject(void *b2object, love::Object *object)\n{\n\tbox2dObjectMap[b2object] = object;\n}\n\nvoid World::unregisterObject(void *b2object)\n{\n\tbox2dObjectMap.erase(b2object);\n}\n\nlove::Object *World::findObject(void *b2object) const\n{\n\tauto it = box2dObjectMap.find(b2object);\n\tif (it != box2dObjectMap.end())\n\t\treturn it->second;\n\telse\n\t\treturn nullptr;\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/World.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WORLD_H\n#define LOVE_PHYSICS_BOX2D_WORLD_H\n\n// LOVE\n#include \"common/Object.h\"\n#include \"common/runtime.h\"\n#include \"common/Reference.h\"\n\n// STD\n#include <vector>\n#include <unordered_map>\n\n// Box2D\n#include <box2d/Box2D.h>\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nclass Contact;\nclass Body;\nclass Shape;\nclass Joint;\n\n/**\n * The World is the \"God\" container class,\n * which contains all Bodies and Joints. Shapes\n * are contained in their associated Body.\n *\n * Bodies in different worlds can obviously not\n * collide.\n *\n * The world also controls global parameters, like\n * gravity.\n **/\nclass World : public Object, public b2ContactListener, public b2ContactFilter, public b2DestructionListener\n{\npublic:\n\n\t// Friends.\n\tfriend class Joint;\n\tfriend class DistanceJoint;\n\tfriend class MouseJoint;\n\tfriend class Body;\n\tfriend class Shape;\n\n\tstatic love::Type type;\n\n\tclass ContactCallback\n\t{\n\tpublic:\n\t\tReference *ref;\n\t\tlua_State *L;\n\t\tWorld *world;\n\t\tContactCallback(World *world);\n\t\t~ContactCallback();\n\t\tvoid process(b2Contact *contact, const b2ContactImpulse *impulse = NULL);\n\t};\n\n\tclass ContactFilter\n\t{\n\tpublic:\n\t\tReference *ref;\n\t\tlua_State *L;\n\t\tContactFilter();\n\t\t~ContactFilter();\n\t\tbool process(Shape *a, Shape *b);\n\t};\n\n\tclass QueryCallback : public b2QueryCallback\n\t{\n\tpublic:\n\t\tQueryCallback(lua_State *L, int idx);\n\t\tvirtual ~QueryCallback();\n\t\tbool ReportFixture(b2Fixture *fixture) override;\n\tprivate:\n\t\tlua_State *L;\n\t\tint funcidx;\n\t\tint userargs;\n\t};\n\n\tclass CollectCallback : public b2QueryCallback\n\t{\n\tpublic:\n\t\tCollectCallback(uint16 categoryMask, lua_State *L);\n\t\tvirtual ~CollectCallback();\n\t\tbool ReportFixture(b2Fixture *fixture) override;\n\tprivate:\n\t\tuint16 categoryMask;\n\t\tlua_State *L;\n\t\tint i = 1;\n\t};\n\n\tclass RayCastCallback : public b2RayCastCallback\n\t{\n\tpublic:\n\t\tRayCastCallback(lua_State *L, int idx);\n\t\tvirtual ~RayCastCallback();\n\t\tfloat ReportFixture(b2Fixture *fixture, const b2Vec2 &point, const b2Vec2 &normal, float fraction) override;\n\tprivate:\n\t\tlua_State *L;\n\t\tint funcidx;\n\t\tint userargs;\n\t};\n\n\tclass RayCastOneCallback : public b2RayCastCallback\n\t{\n\tpublic:\n\t\tRayCastOneCallback(uint16 categoryMask, bool any);\n\t\tvirtual ~RayCastOneCallback() {};\n\t\tfloat ReportFixture(b2Fixture* fixture, const b2Vec2& point, const b2Vec2& normal, float fraction) override;\n\n\t\tb2Fixture *hitFixture;\n\t\tb2Vec2 hitPoint;\n\t\tb2Vec2 hitNormal;\n\t\tfloat hitFraction;\n\n\tprivate:\n\t\tuint16 categoryMask;\n\t\tbool any;\n\t};\n\n\t/**\n\t * Creates a new world.\n\t **/\n\tWorld();\n\n\t/**\n\t * Creates a new world with the given gravity\n\t * and whether or not the bodies should sleep when appropriate.\n\t * @param gravity The gravity of the World.\n\t * @param sleep True if the bodies should be able to sleep,\n\t * false otherwise.\n\t **/\n\tWorld(b2Vec2 gravity, bool sleep);\n\n\tvirtual ~World();\n\n\t/**\n\t * Updates everything in the world one timestep.\n\t * This is called update() and not step() to conform\n\t * with all other objects in LOVE.\n\t * @param dt The timestep.\n\t **/\n\tvoid update(float dt);\n\tvoid update(float dt, int velocityIterations, int positionIterations);\n\n\t// From b2ContactListener\n\tvoid BeginContact(b2Contact *contact);\n\tvoid EndContact(b2Contact *contact);\n\tvoid PreSolve(b2Contact *contact, const b2Manifold *oldManifold);\n\tvoid PostSolve(b2Contact *contact, const b2ContactImpulse *impulse);\n\n\t// From b2ContactFilter\n\tbool ShouldCollide(b2Fixture *fixtureA, b2Fixture *fixtureB);\n\n\t// From b2DestructionListener\n\tvoid SayGoodbye(b2Fixture *fixture);\n\tvoid SayGoodbye(b2Joint *joint);\n\n\t/**\n\t * Returns true if the Box2D world is alive.\n\t **/\n\tbool isValid() const;\n\n\t/**\n\t * Receives up to four Lua functions as arguments. Each function is\n\t * collision callback for the four events (in order): begin, end,\n\t * presolve and postsolve. The value \"nil\" is accepted if one or\n\t * more events are uninteresting.\n\t **/\n\tint setCallbacks(lua_State *L);\n\n\t/**\n\t * Returns the functions previously set by setCallbacks.\n\t **/\n\tint getCallbacks(lua_State *L);\n\n\t/**\n\t * Updates the Lua thread/coroutine used when callbacks are executed in\n\t * the update method. This should be called in the same Lua function which\n\t * calls update().\n\t **/\n\tvoid setCallbacksL(lua_State *L);\n\n\t/**\n\t * Sets the ContactFilter callback.\n\t **/\n\tint setContactFilter(lua_State *L);\n\n\t/**\n\t * Gets the ContactFilter callback.\n\t **/\n\tint getContactFilter(lua_State *L);\n\n\t/**\n\t * Sets the current gravity of the World.\n\t * @param x Gravity in the x-direction.\n\t * @param y Gravity in the y-direction.\n\t **/\n\tvoid setGravity(float x, float y);\n\n\t/**\n\t * Gets the current gravity.\n\t * @returns Gravity in the x-direction.\n\t * @returns Gravity in the y-direction.\n\t **/\n\tint getGravity(lua_State *L);\n\n\t/**\n\t * Translate the world origin.\n\t * @param x The new world origin's x-coordinate relative to the old origin.\n\t * @param y The new world origin's y-coordinate relative to the old origin.\n\t **/\n\tvoid translateOrigin(float x, float y);\n\n\t/**\n\t * Sets whether this World allows sleep.\n\t * @param allow True to allow, false to disallow.\n\t **/\n\tvoid setSleepingAllowed(bool allow);\n\n\t/**\n\t * Returns whether this World allows sleep.\n\t * @return True if allowed, false if disallowed.\n\t **/\n\tbool isSleepingAllowed() const;\n\n\t/**\n\t * Returns whether this World is currently locked.\n\t * If it's locked, it's in the middle of a timestep.\n\t * @return Whether the World is locked.\n\t **/\n\tbool isLocked() const;\n\n\t/**\n\t * Get the current body count.\n\t * @return The number of bodies.\n\t **/\n\tint getBodyCount() const;\n\n\t/**\n\t * Get the current joint count.\n\t * @return The number of joints.\n\t **/\n\tint getJointCount() const;\n\n\t/**\n\t * Get the current contact count.\n\t * @return The number of contacts.\n\t **/\n\tint getContactCount() const;\n\n\t/**\n\t * Get an array of all the Bodies in the World.\n\t * @return An array of Bodies.\n\t **/\n\tint getBodies(lua_State *L) const;\n\n\t/**\n\t * Get an array of all the Joints in the World.\n\t * @return An array of Joints.\n\t **/\n\tint getJoints(lua_State *L) const;\n\n\t/**\n\t * Get an array of all the Contacts in the World.\n\t * @return An array of Contacts.\n\t **/\n\tint getContacts(lua_State *L);\n\n\t/**\n\t * Gets the ground body.\n\t * @return The ground body.\n\t **/\n\tb2Body *getGroundBody() const;\n\n\t/**\n\t * Calls a callback on all Shapes that overlap a given bounding box.\n\t **/\n\tint queryShapesInArea(lua_State *L);\n\n\t/**\n\t * Gets all Shapes that overlap a given bounding box.\n\t **/\n\tint getShapesInArea(lua_State *L);\n\n\t/**\n\t * Raycasts the World for all Fixtures in the path of the ray.\n\t **/\n\tint rayCast(lua_State *L);\n\n\tint rayCastAny(lua_State *L);\n\tint rayCastClosest(lua_State *L);\n\n\t/**\n\t * Destroy this world.\n\t **/\n\tvoid destroy();\n\n\tvoid registerObject(void *b2object, love::Object *object);\n\tvoid unregisterObject(void *b2object);\n\tlove::Object *findObject(void *b2object) const;\n\nprivate:\n\n\t// Pointer to the Box2D world.\n\tb2World *world;\n\n\t// Ground body\n\tb2Body *groundBody;\n\n\t// The list of to be destructed bodies.\n\tstd::vector<Body *> destructBodies;\n\tstd::vector<Shape *> destructShapes;\n\tstd::vector<Joint *> destructJoints;\n\tbool destructWorld;\n\n\t// Contact callbacks.\n\tContactCallback begin, end, presolve, postsolve;\n\tContactFilter filter;\n\n\tstd::unordered_map<void *, love::Object *> box2dObjectMap;\n\n}; // World\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WORLD_H\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_Body.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_Body.h\"\n#include \"wrap_Physics.h\"\n#include \"wrap_Shape.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nBody *luax_checkbody(lua_State *L, int idx)\n{\n\tBody *b = luax_checktype<Body>(L, idx);\n\tif (b->body == 0)\n\t\tluaL_error(L, \"Attempt to use destroyed body.\");\n\treturn b;\n}\n\nint w_Body_getX(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tlua_pushnumber(L, t->getX());\n\treturn 1;\n}\n\nint w_Body_getY(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tlua_pushnumber(L, t->getY());\n\treturn 1;\n}\n\nint w_Body_getAngle(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tlua_pushnumber(L, t->getAngle());\n\treturn 1;\n}\n\nint w_Body_getPosition(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\n\tfloat x_o, y_o;\n\tt->getPosition(x_o, y_o);\n\tlua_pushnumber(L, x_o);\n\tlua_pushnumber(L, y_o);\n\n\treturn 2;\n}\n\nint w_Body_getTransform(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\n\tfloat x_o, y_o;\n\tt->getPosition(x_o, y_o);\n\tlua_pushnumber(L, x_o);\n\tlua_pushnumber(L, y_o);\n\tlua_pushnumber(L, t->getAngle());\n\n\treturn 3;\n}\n\nint w_Body_getLinearVelocity(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\n\tfloat x_o, y_o;\n\tt->getLinearVelocity(x_o, y_o);\n\tlua_pushnumber(L, x_o);\n\tlua_pushnumber(L, y_o);\n\n\treturn 2;\n}\n\nint w_Body_getWorldCenter(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\n\tfloat x_o, y_o;\n\tt->getWorldCenter(x_o, y_o);\n\tlua_pushnumber(L, x_o);\n\tlua_pushnumber(L, y_o);\n\n\treturn 2;\n}\n\nint w_Body_getLocalCenter(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\n\tfloat x_o, y_o;\n\tt->getLocalCenter(x_o, y_o);\n\tlua_pushnumber(L, x_o);\n\tlua_pushnumber(L, y_o);\n\n\treturn 2;\n}\n\nint w_Body_getAngularVelocity(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tlua_pushnumber(L, t->getAngularVelocity());\n\treturn 1;\n}\n\nint w_Body_getKinematicState(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tb2Vec2 pos_o, vel_o;\n\tfloat a_o, da_o;\n\tt->getKinematicState(pos_o, a_o, vel_o, da_o);\n\tlua_pushnumber(L, pos_o.x);\n\tlua_pushnumber(L, pos_o.y);\n\tlua_pushnumber(L, a_o);\n\tlua_pushnumber(L, vel_o.x);\n\tlua_pushnumber(L, vel_o.y);\n\tlua_pushnumber(L, da_o);\n\treturn 6;\n}\n\nint w_Body_getMass(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tlua_pushnumber(L, t->getMass());\n\treturn 1;\n}\n\nint w_Body_getInertia(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tlua_pushnumber(L, t->getInertia());\n\treturn 1;\n}\n\nint w_Body_getMassData(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tlua_remove(L, 1);\n\treturn t->getMassData(L);\n}\n\nint w_Body_hasCustomMassData(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tluax_pushboolean(L, t->hasCustomMassData());\n\treturn 1;\n}\n\nint w_Body_getAngularDamping(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tlua_pushnumber(L, t->getAngularDamping());\n\treturn 1;\n}\n\nint w_Body_getLinearDamping(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tlua_pushnumber(L, t->getLinearDamping());\n\treturn 1;\n}\n\nint w_Body_getGravityScale(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tlua_pushnumber(L, t->getGravityScale());\n\treturn 1;\n}\n\nint w_Body_getType(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tconst char *type = \"\";\n\tBody::getConstant(t->getType(), type);\n\tlua_pushstring(L, type);\n\treturn 1;\n}\n\nint w_Body_applyLinearImpulse(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tfloat jx = (float)luaL_checknumber(L, 2);\n\tfloat jy = (float)luaL_checknumber(L, 3);\n\n\tint nargs = lua_gettop(L);\n\n\tif (nargs <= 3 || (nargs == 4 && lua_type(L, 4) == LUA_TBOOLEAN))\n\t{\n\t\tbool awake = luax_optboolean(L, 4, true);\n\t\tt->applyLinearImpulse(jx, jy, awake);\n\t}\n\telse if (nargs >= 5)\n\t{\n\t\tfloat rx = (float)luaL_checknumber(L, 4);\n\t\tfloat ry = (float)luaL_checknumber(L, 5);\n\t\tbool awake = luax_optboolean(L, 6, true);\n\t\tt->applyLinearImpulse(jx, jy, rx, ry, awake);\n\t}\n\telse\n\t{\n\t\treturn luaL_error(L, \"Wrong number of parameters.\");\n\t}\n\n\treturn 0;\n}\n\nint w_Body_applyAngularImpulse(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tfloat i = (float)luaL_checknumber(L, 2);\n\tbool awake = luax_optboolean(L, 3, true);\n\tt->applyAngularImpulse(i, awake);\n\treturn 0;\n}\n\nint w_Body_applyTorque(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tfloat arg = (float)luaL_checknumber(L, 2);\n\tbool awake = luax_optboolean(L, 3, true);\n\tt->applyTorque(arg, awake);\n\treturn 0;\n}\n\nint w_Body_applyForce(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tfloat fx = (float)luaL_checknumber(L, 2);\n\tfloat fy = (float)luaL_checknumber(L, 3);\n\n\tint nargs = lua_gettop(L);\n\n\tif (nargs <= 3 || (nargs == 4 && lua_type(L, 4) == LUA_TBOOLEAN))\n\t{\n\t\tbool awake = luax_optboolean(L, 4, true);\n\t\tt->applyForce(fx, fy, awake);\n\t}\n\telse if (lua_gettop(L) >= 5)\n\t{\n\t\tfloat rx = (float)luaL_checknumber(L, 4);\n\t\tfloat ry = (float)luaL_checknumber(L, 5);\n\t\tbool awake = luax_optboolean(L, 6, true);\n\t\tt->applyForce(fx, fy, rx, ry, awake);\n\t}\n\telse\n\t{\n\t\treturn luaL_error(L, \"Wrong number of parameters.\");\n\t}\n\n\treturn 0;\n}\n\nint w_Body_setX(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tluax_catchexcept(L, [&](){ t->setX(arg1); });\n\treturn 0;\n}\n\nint w_Body_setY(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tluax_catchexcept(L, [&](){ t->setY(arg1); });\n\treturn 0;\n}\n\nint w_Body_setTransform(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tfloat x = (float)luaL_checknumber(L, 2);\n\tfloat y = (float)luaL_checknumber(L, 3);\n\tfloat angle = (float)luaL_checknumber(L, 4);\n\tluax_catchexcept(L, [&](){\n\t\tt->setPosition(x, y);\n\t\tt->setAngle(angle);\n\t});\n\treturn 0;\n}\n\nint w_Body_setLinearVelocity(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tfloat arg2 = (float)luaL_checknumber(L, 3);\n\tt->setLinearVelocity(arg1, arg2);\n\treturn 0;\n}\n\nint w_Body_setAngle(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tluax_catchexcept(L, [&](){ t->setAngle(arg1); });\n\treturn 0;\n}\n\nint w_Body_setAngularVelocity(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tt->setAngularVelocity(arg1);\n\treturn 0;\n}\n\nint w_Body_setPosition(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tfloat arg2 = (float)luaL_checknumber(L, 3);\n\tluax_catchexcept(L, [&](){ t->setPosition(arg1, arg2); });\n\treturn 0;\n}\n\nint w_Body_setKinematicState(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tfloat x = (float)luaL_checknumber(L, 2);\n\tfloat y = (float)luaL_checknumber(L, 3);\n\tfloat a = (float)luaL_checknumber(L, 4);\n\tfloat dx = (float)luaL_checknumber(L, 5);\n\tfloat dy = (float)luaL_checknumber(L, 6);\n\tfloat da = (float)luaL_checknumber(L, 7);\n\tluax_catchexcept(L, [&](){ t->setKinematicState(b2Vec2(x, y), a, b2Vec2(dx, dy), da); });\n\treturn 0;\n}\n\nint w_Body_resetMassData(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tluax_catchexcept(L, [&](){ t->resetMassData(); });\n\treturn 0;\n}\n\nint w_Body_setMassData(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tfloat x = (float)luaL_checknumber(L, 2);\n\tfloat y = (float)luaL_checknumber(L, 3);\n\tfloat m = (float)luaL_checknumber(L, 4);\n\tfloat i = (float)luaL_checknumber(L, 5);\n\tluax_catchexcept(L, [&](){ t->setMassData(x, y, m, i); });\n\treturn 0;\n}\n\nint w_Body_setMass(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tfloat m = (float)luaL_checknumber(L, 2);\n\tluax_catchexcept(L, [&](){ t->setMass(m); });\n\treturn 0;\n}\n\nint w_Body_setInertia(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tfloat i = (float)luaL_checknumber(L, 2);\n\tluax_catchexcept(L, [&](){ t->setInertia(i); });\n\treturn 0;\n}\n\nint w_Body_setAngularDamping(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tt->setAngularDamping(arg1);\n\treturn 0;\n}\n\nint w_Body_setLinearDamping(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tt->setLinearDamping(arg1);\n\treturn 0;\n}\n\nint w_Body_setGravityScale(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tt->setGravityScale(arg1);\n\treturn 0;\n}\n\nint w_Body_setType(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tconst char *typeStr = luaL_checkstring(L, 2);\n\tBody::Type type;\n\tBody::getConstant(typeStr, type);\n\tluax_catchexcept(L, [&](){ t->setType(type); });\n\treturn 0;\n}\n\nint w_Body_getWorldPoint(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\n\tfloat x = (float)luaL_checknumber(L, 2);\n\tfloat y = (float)luaL_checknumber(L, 3);\n\tfloat x_o, y_o;\n\tt->getWorldPoint(x, y, x_o, y_o);\n\tlua_pushnumber(L, x_o);\n\tlua_pushnumber(L, y_o);\n\n\treturn 2;\n}\n\nint w_Body_getWorldVector(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\n\tfloat x = (float)luaL_checknumber(L, 2);\n\tfloat y = (float)luaL_checknumber(L, 3);\n\tfloat x_o, y_o;\n\tt->getWorldVector(x, y, x_o, y_o);\n\tlua_pushnumber(L, x_o);\n\tlua_pushnumber(L, y_o);\n\n\treturn 2;\n}\n\nint w_Body_getWorldPoints(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tlua_remove(L, 1);\n\treturn t->getWorldPoints(L);\n}\n\nint w_Body_getLocalPoint(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\n\tfloat x = (float)luaL_checknumber(L, 2);\n\tfloat y = (float)luaL_checknumber(L, 3);\n\tfloat x_o, y_o;\n\tt->getLocalPoint(x, y, x_o, y_o);\n\tlua_pushnumber(L, x_o);\n\tlua_pushnumber(L, y_o);\n\n\treturn 2;\n}\n\nint w_Body_getLocalVector(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\n\tfloat x = (float)luaL_checknumber(L, 2);\n\tfloat y = (float)luaL_checknumber(L, 3);\n\tfloat x_o, y_o;\n\tt->getLocalVector(x, y, x_o, y_o);\n\tlua_pushnumber(L, x_o);\n\tlua_pushnumber(L, y_o);\n\n\treturn 2;\n}\n\nint w_Body_getLocalPoints(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tlua_remove(L, 1);\n\treturn t->getLocalPoints(L);\n}\n\nint w_Body_getLinearVelocityFromWorldPoint(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\n\tfloat x = (float)luaL_checknumber(L, 2);\n\tfloat y = (float)luaL_checknumber(L, 3);\n\tfloat x_o, y_o;\n\tt->getLinearVelocityFromWorldPoint(x, y, x_o, y_o);\n\tlua_pushnumber(L, x_o);\n\tlua_pushnumber(L, y_o);\n\n\treturn 2;\n}\n\nint w_Body_getLinearVelocityFromLocalPoint(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\n\tfloat x = (float)luaL_checknumber(L, 2);\n\tfloat y = (float)luaL_checknumber(L, 3);\n\tfloat x_o, y_o;\n\tt->getLinearVelocityFromLocalPoint(x, y, x_o, y_o);\n\tlua_pushnumber(L, x_o);\n\tlua_pushnumber(L, y_o);\n\n\treturn 2;\n}\n\nint w_Body_isBullet(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tluax_pushboolean(L, t->isBullet());\n\treturn 1;\n}\n\nint w_Body_setBullet(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tbool b = luax_checkboolean(L, 2);\n\tt->setBullet(b);\n\treturn 0;\n}\n\nint w_Body_isActive(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tluax_pushboolean(L, t->isEnabled());\n\treturn 1;\n}\n\nint w_Body_isAwake(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tluax_pushboolean(L, t->isAwake());\n\treturn 1;\n}\n\nint w_Body_setSleepingAllowed(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tbool b = luax_checkboolean(L, 2);\n\tt->setSleepingAllowed(b);\n\treturn 0;\n}\n\nint w_Body_isSleepingAllowed(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tlua_pushboolean(L, t->isSleepingAllowed());\n\treturn 1;\n}\n\nint w_Body_setActive(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tbool b = luax_checkboolean(L, 2);\n\tluax_catchexcept(L, [&](){ t->setEnabled(b); });\n\treturn 0;\n}\n\nint w_Body_setAwake(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tbool b = luax_checkboolean(L, 2);\n\tt->setAwake(b);\n\treturn 0;\n}\n\nint w_Body_setFixedRotation(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tbool b = luax_checkboolean(L, 2);\n\tluax_catchexcept(L, [&](){ t->setFixedRotation(b); });\n\treturn 0;\n}\n\nint w_Body_isFixedRotation(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tbool b = t->isFixedRotation();\n\tluax_pushboolean(L, b);\n\treturn 1;\n}\n\nint w_Body_isTouching(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tBody *other = luax_checkbody(L, 2);\n\tluax_pushboolean(L, t->isTouching(other));\n\treturn 1;\n}\n\nint w_Body_getWorld(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tWorld *world = t->getWorld();\n\tluax_pushtype(L, world);\n\treturn 1;\n}\n\nint w_Body_getShape(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tShape *s = t->getShape();\n\tif (s)\n\t\tluax_pushshape(L, s);\n\telse\n\t\tlua_pushnil(L);\n\treturn 1;\n}\n\nint w_Body_getShapes(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tlua_remove(L, 1);\n\tint n = 0;\n\tluax_catchexcept(L, [&](){ n = t->getShapes(L); });\n\treturn n;\n}\n\nint w_Body_getFixtures(lua_State *L)\n{\n\tluax_markdeprecated(L, 1, \"Body:getFixtures\", API_METHOD, DEPRECATED_REPLACED, \"Body:getShapes\");\n\treturn w_Body_getShapes(L);\n}\n\nint w_Body_getJoints(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tlua_remove(L, 1);\n\tint n = 0;\n\tluax_catchexcept(L, [&](){ n = t->getJoints(L); });\n\treturn n;\n}\n\nint w_Body_getContacts(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tlua_remove(L, 1);\n\tint n = 0;\n\tluax_catchexcept(L, [&](){ n = t->getContacts(L); });\n\treturn n;\n}\n\nint w_Body_destroy(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tluax_catchexcept(L, [&](){ t->destroy(); });\n\treturn 0;\n}\n\nint w_Body_isDestroyed(lua_State *L)\n{\n\tBody *b = luax_checktype<Body>(L, 1);\n\tluax_pushboolean(L, b->body == nullptr);\n\treturn 1;\n}\n\nint w_Body_setUserData(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tlua_remove(L, 1);\n\treturn t->setUserData(L);\n}\n\nint w_Body_getUserData(lua_State *L)\n{\n\tBody *t = luax_checkbody(L, 1);\n\tlua_remove(L, 1);\n\treturn t->getUserData(L);\n}\n\nstatic const luaL_Reg w_Body_functions[] =\n{\n\t{ \"getX\", w_Body_getX },\n\t{ \"getY\", w_Body_getY },\n\t{ \"getAngle\", w_Body_getAngle },\n\t{ \"getPosition\", w_Body_getPosition },\n\t{ \"getTransform\", w_Body_getTransform },\n\t{ \"setTransform\", w_Body_setTransform },\n\t{ \"getLinearVelocity\", w_Body_getLinearVelocity },\n\t{ \"getWorldCenter\", w_Body_getWorldCenter },\n\t{ \"getLocalCenter\", w_Body_getLocalCenter },\n\t{ \"getAngularVelocity\", w_Body_getAngularVelocity },\n\t{ \"getKinematicState\", w_Body_getKinematicState },\n\t{ \"getMass\", w_Body_getMass },\n\t{ \"getInertia\", w_Body_getInertia },\n\t{ \"getMassData\", w_Body_getMassData },\n\t{ \"hasCustomMassData\", w_Body_hasCustomMassData },\n\t{ \"getAngularDamping\", w_Body_getAngularDamping },\n\t{ \"getLinearDamping\", w_Body_getLinearDamping },\n\t{ \"getGravityScale\", w_Body_getGravityScale },\n\t{ \"getType\", w_Body_getType },\n\t{ \"applyLinearImpulse\", w_Body_applyLinearImpulse },\n\t{ \"applyAngularImpulse\", w_Body_applyAngularImpulse },\n\t{ \"applyTorque\", w_Body_applyTorque },\n\t{ \"applyForce\", w_Body_applyForce },\n\t{ \"setX\", w_Body_setX },\n\t{ \"setY\", w_Body_setY },\n\t{ \"setLinearVelocity\", w_Body_setLinearVelocity },\n\t{ \"setAngle\", w_Body_setAngle },\n\t{ \"setAngularVelocity\", w_Body_setAngularVelocity },\n\t{ \"setPosition\", w_Body_setPosition },\n\t{ \"setKinematicState\", w_Body_setKinematicState },\n\t{ \"resetMassData\", w_Body_resetMassData },\n\t{ \"setMassData\", w_Body_setMassData },\n\t{ \"setMass\", w_Body_setMass },\n\t{ \"setInertia\", w_Body_setInertia },\n\t{ \"setAngularDamping\", w_Body_setAngularDamping },\n\t{ \"setLinearDamping\", w_Body_setLinearDamping },\n\t{ \"setGravityScale\", w_Body_setGravityScale },\n\t{ \"setType\", w_Body_setType },\n\t{ \"getWorldPoint\", w_Body_getWorldPoint },\n\t{ \"getWorldVector\", w_Body_getWorldVector },\n\t{ \"getWorldPoints\", w_Body_getWorldPoints },\n\t{ \"getLocalPoint\", w_Body_getLocalPoint },\n\t{ \"getLocalVector\", w_Body_getLocalVector },\n\t{ \"getLocalPoints\", w_Body_getLocalPoints },\n\t{ \"getLinearVelocityFromWorldPoint\", w_Body_getLinearVelocityFromWorldPoint },\n\t{ \"getLinearVelocityFromLocalPoint\", w_Body_getLinearVelocityFromLocalPoint },\n\t{ \"isBullet\", w_Body_isBullet },\n\t{ \"setBullet\", w_Body_setBullet },\n\t{ \"isActive\", w_Body_isActive },\n\t{ \"isAwake\", w_Body_isAwake },\n\t{ \"setSleepingAllowed\", w_Body_setSleepingAllowed },\n\t{ \"isSleepingAllowed\", w_Body_isSleepingAllowed },\n\t{ \"setActive\", w_Body_setActive },\n\t{ \"setAwake\", w_Body_setAwake },\n\t{ \"setFixedRotation\", w_Body_setFixedRotation },\n\t{ \"isFixedRotation\", w_Body_isFixedRotation },\n\t{ \"isTouching\", w_Body_isTouching },\n\t{ \"getWorld\", w_Body_getWorld },\n\t{ \"getShape\", w_Body_getShape },\n\t{ \"getShapes\", w_Body_getShapes },\n\t{ \"getJoints\", w_Body_getJoints },\n\t{ \"getContacts\", w_Body_getContacts },\n\t{ \"destroy\", w_Body_destroy },\n\t{ \"isDestroyed\", w_Body_isDestroyed },\n\t{ \"setUserData\", w_Body_setUserData },\n\t{ \"getUserData\", w_Body_getUserData },\n\n\t// Deprecated\n\t{ \"getFixtures\", w_Body_getFixtures },\n\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_body(lua_State *L)\n{\n\treturn luax_register_type(L, &Body::type, w_Body_functions, nullptr);\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_Body.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WRAP_BODY_H\n#define LOVE_PHYSICS_BOX2D_WRAP_BODY_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"Body.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nBody *luax_checkbody(lua_State *L, int idx);\nextern \"C\" int luaopen_body(lua_State *L);\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WRAP_BODY_H\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_ChainShape.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_ChainShape.h\"\n#include \"wrap_Physics.h\"\n#include \"Physics.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nChainShape *luax_checkchainshape(lua_State *L, int idx)\n{\n\treturn luax_checktype<ChainShape>(L, idx);\n}\n\nint w_ChainShape_setNextVertex(lua_State *L)\n{\n\tChainShape *c = luax_checkchainshape(L, 1);\n\tfloat x = (float)luaL_checknumber(L, 2);\n\tfloat y = (float)luaL_checknumber(L, 3);\n\tluax_catchexcept(L, [&](){ c->setNextVertex(x, y); });\n\treturn 0;\n}\n\nint w_ChainShape_setPreviousVertex(lua_State *L)\n{\n\tChainShape *c = luax_checkchainshape(L, 1);\n\tfloat x = (float)luaL_checknumber(L, 2);\n\tfloat y = (float)luaL_checknumber(L, 3);\n\tluax_catchexcept(L, [&](){ c->setPreviousVertex(x, y); });\n\treturn 0;\n}\n\nint w_ChainShape_getChildEdge(lua_State *L)\n{\n\tluax_markdeprecated(L, 1, \"ChainShape:getChildEdge\", API_METHOD, DEPRECATED_NO_REPLACEMENT, nullptr);\n\tChainShape *c = luax_checkchainshape(L, 1);\n\tint index = (int) luaL_checkinteger(L, 2) - 1; // Convert from 1-based index\n\tEdgeShape *e = nullptr;\n\tluax_catchexcept(L, [&](){ e = c->getChildEdge(index); });\n\tluax_pushtype(L, e);\n\te->release();\n\treturn 1;\n}\n\nint w_ChainShape_getVertexCount(lua_State *L)\n{\n\tChainShape *c = luax_checkchainshape(L, 1);\n\tint count = 0;\n\tluax_catchexcept(L, [&]() { count = c->getVertexCount(); });\n\tlua_pushinteger(L, count);\n\treturn 1;\n}\n\nint w_ChainShape_getPoint(lua_State *L)\n{\n\tChainShape *c = luax_checkchainshape(L, 1);\n\tint index = (int) luaL_checkinteger(L, 2) - 1; // Convert from 1-based index\n\tb2Vec2 v;\n\tluax_catchexcept(L, [&](){ v = c->getPoint(index); });\n\tlua_pushnumber(L, v.x);\n\tlua_pushnumber(L, v.y);\n\treturn 2;\n}\n\nint w_ChainShape_getNextVertex(lua_State *L)\n{\n\tChainShape *c = luax_checkchainshape(L, 1);\n\tb2Vec2 v;\n\tluax_catchexcept(L, [&]() { v = c->getNextVertex(); });\n\tlua_pushnumber(L, v.x);\n\tlua_pushnumber(L, v.y);\n\treturn 2;\n}\n\nint w_ChainShape_getPreviousVertex(lua_State *L)\n{\n\tChainShape *c = luax_checkchainshape(L, 1);\n\tb2Vec2 v;\n\tluax_catchexcept(L, [&]() { v = c->getPreviousVertex(); });\n\tlua_pushnumber(L, v.x);\n\tlua_pushnumber(L, v.y);\n\treturn 2;\n}\n\nint w_ChainShape_getPoints(lua_State *L)\n{\n\tChainShape *c = luax_checkchainshape(L, 1);\n\tconst b2Vec2 *verts;\n\tluax_catchexcept(L, [&]() { verts = c->getPoints(); });\n\tint count = c->getVertexCount();\n\tif (!lua_checkstack(L, count*2))\n\t\treturn luaL_error(L, \"Too many return values\");\n\tfor (int i = 0; i < count; i++)\n\t{\n\t\tb2Vec2 v = Physics::scaleUp(verts[i]);\n\t\tlua_pushnumber(L, v.x);\n\t\tlua_pushnumber(L, v.y);\n\t}\n\treturn count*2;\n}\n\nstatic const luaL_Reg w_ChainShape_functions[] =\n{\n\t{ \"setNextVertex\", w_ChainShape_setNextVertex },\n\t{ \"setPreviousVertex\", w_ChainShape_setPreviousVertex },\n\t{ \"getNextVertex\", w_ChainShape_getNextVertex },\n\t{ \"getPreviousVertex\", w_ChainShape_getPreviousVertex },\n\t{ \"getChildEdge\", w_ChainShape_getChildEdge },\n\t{ \"getVertexCount\", w_ChainShape_getVertexCount },\n\t{ \"getPoint\", w_ChainShape_getPoint },\n\t{ \"getPoints\", w_ChainShape_getPoints },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_chainshape(lua_State *L)\n{\n\treturn luax_register_type(L, &ChainShape::type, w_Shape_functions, w_ChainShape_functions, nullptr);\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_ChainShape.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WRAP_CHAIN_SHAPE_H\n#define LOVE_PHYSICS_BOX2D_WRAP_CHAIN_SHAPE_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"wrap_Shape.h\"\n#include \"ChainShape.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nChainShape *luax_checkchainshape(lua_State *L, int idx);\nextern \"C\" int luaopen_chainshape(lua_State *L);\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WRAP_CHAIN_SHAPE_H\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_CircleShape.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_CircleShape.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nCircleShape *luax_checkcircleshape(lua_State *L, int idx)\n{\n\treturn luax_checktype<CircleShape>(L, idx);\n}\n\nint w_CircleShape_getRadius(lua_State *L)\n{\n\tCircleShape *c = luax_checkcircleshape(L, 1);\n\tfloat r = 0;\n\tluax_catchexcept(L, [&]() { r = c->getRadius(); });\n\tlua_pushnumber(L, r);\n\treturn 1;\n}\n\nint w_CircleShape_setRadius(lua_State *L)\n{\n\tCircleShape *c = luax_checkcircleshape(L, 1);\n\tfloat r = (float)luaL_checknumber(L, 2);\n\tluax_catchexcept(L, [&]() { c->setRadius(r); });\n\treturn 0;\n}\n\nint w_CircleShape_getPoint(lua_State *L)\n{\n\tCircleShape *c = luax_checkcircleshape(L, 1);\n\tfloat x, y;\n\tluax_catchexcept(L, [&]() { c->getPoint(x, y); });\n\tlua_pushnumber(L, x);\n\tlua_pushnumber(L, y);\n\treturn 2;\n}\n\nint w_CircleShape_setPoint(lua_State *L)\n{\n\tCircleShape *c = luax_checkcircleshape(L, 1);\n\tc->setPoint((float) luaL_checknumber(L, 2), (float) luaL_checknumber(L, 3));\n\treturn 0;\n}\n\nstatic const luaL_Reg w_CircleShape_functions[] =\n{\n\t{ \"getRadius\", w_CircleShape_getRadius },\n\t{ \"setRadius\", w_CircleShape_setRadius },\n\t{ \"getPoint\", w_CircleShape_getPoint },\n\t{ \"setPoint\", w_CircleShape_setPoint },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_circleshape(lua_State *L)\n{\n\treturn luax_register_type(L, &CircleShape::type, w_Shape_functions, w_CircleShape_functions, nullptr);\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_CircleShape.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WRAP_CIRCLE_SHAPE_H\n#define LOVE_PHYSICS_BOX2D_WRAP_CIRCLE_SHAPE_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"wrap_Shape.h\"\n#include \"CircleShape.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nCircleShape *luax_checkcircleshape(lua_State *L, int idx);\nextern \"C\" int luaopen_circleshape(lua_State *L);\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WRAP_CIRCLE_SHAPE_H\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_Contact.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_Contact.h\"\n#include \"wrap_Shape.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nContact *luax_checkcontact(lua_State *L, int idx)\n{\n\tContact *c = luax_checktype<Contact>(L, idx);\n\tif (!c->isValid())\n\t\tluaL_error(L, \"Attempt to use destroyed contact.\");\n\treturn c;\n}\n\nint w_Contact_getPositions(lua_State *L)\n{\n\tContact *t = luax_checkcontact(L, 1);\n\treturn t->getPositions(L);\n}\n\nint w_Contact_getNormal(lua_State *L)\n{\n\tContact *t = luax_checkcontact(L, 1);\n\treturn t->getNormal(L);\n}\n\nint w_Contact_getFriction(lua_State *L)\n{\n\tContact *t = luax_checkcontact(L, 1);\n\tlua_pushnumber(L, t->getFriction());\n\treturn 1;\n}\n\nint w_Contact_getRestitution(lua_State *L)\n{\n\tContact *t = luax_checkcontact(L, 1);\n\tlua_pushnumber(L, t->getRestitution());\n\treturn 1;\n}\n\nint w_Contact_isEnabled(lua_State *L)\n{\n\tContact *t = luax_checkcontact(L, 1);\n\tlua_pushboolean(L, t->isEnabled());\n\treturn 1;\n}\n\nint w_Contact_isTouching(lua_State *L)\n{\n\tContact *t = luax_checkcontact(L, 1);\n\tlua_pushboolean(L, t->isTouching());\n\treturn 1;\n}\n\nint w_Contact_setFriction(lua_State *L)\n{\n\tContact *t = luax_checkcontact(L, 1);\n\tfloat f = (float)luaL_checknumber(L, 2);\n\tt->setFriction(f);\n\treturn 0;\n}\n\nint w_Contact_setRestitution(lua_State *L)\n{\n\tContact *t = luax_checkcontact(L, 1);\n\tfloat r = (float)luaL_checknumber(L, 2);\n\tt->setRestitution(r);\n\treturn 0;\n}\n\nint w_Contact_setEnabled(lua_State *L)\n{\n\tContact *t = luax_checkcontact(L, 1);\n\tbool e = luax_checkboolean(L, 2);\n\tt->setEnabled(e);\n\treturn 0;\n}\n\nint w_Contact_resetFriction(lua_State *L)\n{\n\tContact *t = luax_checkcontact(L, 1);\n\tt->resetFriction();\n\treturn 0;\n}\n\nint w_Contact_resetRestitution(lua_State *L)\n{\n\tContact *t = luax_checkcontact(L, 1);\n\tt->resetRestitution();\n\treturn 0;\n}\n\nint w_Contact_setTangentSpeed(lua_State *L)\n{\n\tContact *t = luax_checkcontact(L, 1);\n\tfloat speed = (float) luaL_checknumber(L, 2);\n\tt->setTangentSpeed(speed);\n\treturn 0;\n}\n\nint w_Contact_getTangentSpeed(lua_State *L)\n{\n\tContact *t = luax_checkcontact(L, 1);\n\tlua_pushnumber(L, t->getTangentSpeed());\n\treturn 1;\n}\n\nint w_Contact_getChildren(lua_State *L)\n{\n\tContact *t = luax_checkcontact(L, 1);\n\tint a, b;\n\tt->getChildren(a, b);\n\tlua_pushnumber(L, a + 1);\n\tlua_pushnumber(L, b + 1);\n\treturn 2;\n}\n\nint w_Contact_getShapes(lua_State *L)\n{\n\tContact *t = luax_checkcontact(L, 1);\n\tShape *a = nullptr;\n\tShape *b = nullptr;\n\tluax_catchexcept(L, [&](){ t->getShapes(a, b); });\n\n\tluax_pushshape(L, a);\n\tluax_pushshape(L, b);\n\treturn 2;\n}\n\nint w_Contact_getFixtures(lua_State *L)\n{\n\tluax_markdeprecated(L, 1, \"Contact:getFixtures\", API_METHOD, DEPRECATED_REPLACED, \"Contact:getShapes\");\n\treturn w_Contact_getShapes(L);\n}\n\nint w_Contact_isDestroyed(lua_State *L)\n{\n\tContact *c = luax_checktype<Contact>(L, 1);\n\tluax_pushboolean(L, !c->isValid());\n\treturn 1;\n}\n\nstatic const luaL_Reg w_Contact_functions[] =\n{\n\t{ \"getPositions\", w_Contact_getPositions },\n\t{ \"getNormal\", w_Contact_getNormal },\n\t{ \"getFriction\", w_Contact_getFriction },\n\t{ \"getRestitution\", w_Contact_getRestitution },\n\t{ \"isEnabled\", w_Contact_isEnabled },\n\t{ \"isTouching\", w_Contact_isTouching },\n\t{ \"setFriction\", w_Contact_setFriction },\n\t{ \"setRestitution\", w_Contact_setRestitution },\n\t{ \"setEnabled\", w_Contact_setEnabled },\n\t{ \"resetFriction\", w_Contact_resetFriction },\n\t{ \"resetRestitution\", w_Contact_resetRestitution },\n\t{ \"setTangentSpeed\", w_Contact_setTangentSpeed },\n\t{ \"getTangentSpeed\", w_Contact_getTangentSpeed },\n\t{ \"getChildren\", w_Contact_getChildren },\n\t{ \"getShapes\", w_Contact_getShapes },\n\t{ \"isDestroyed\", w_Contact_isDestroyed },\n\n\t// Deprecated\n\t{ \"getFixtures\", w_Contact_getFixtures },\n\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_contact(lua_State *L)\n{\n\treturn luax_register_type(L, &Contact::type, w_Contact_functions, nullptr);\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_Contact.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WRAP_CONTACT_H\n#define LOVE_PHYSICS_BOX2D_WRAP_CONTACT_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"Contact.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nContact *luax_checkcontact(lua_State *L, int idx);\nextern \"C\" int luaopen_contact(lua_State *L);\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WRAP_CONTACT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_DistanceJoint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_DistanceJoint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nDistanceJoint *luax_checkdistancejoint(lua_State *L, int idx)\n{\n\tDistanceJoint *j = luax_checktype<DistanceJoint>(L, idx);\n\tif (!j->isValid())\n\t\tluaL_error(L, \"Attempt to use destroyed joint.\");\n\treturn j;\n}\n\nint w_DistanceJoint_setLength(lua_State *L)\n{\n\tDistanceJoint *t = luax_checkdistancejoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tt->setLength(arg1);\n\treturn 0;\n}\n\nint w_DistanceJoint_getLength(lua_State *L)\n{\n\tDistanceJoint *t = luax_checkdistancejoint(L, 1);\n\tlua_pushnumber(L, t->getLength());\n\treturn 1;\n}\n\nint w_DistanceJoint_setStiffness(lua_State *L)\n{\n\tDistanceJoint *t = luax_checkdistancejoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tt->setStiffness(arg1);\n\treturn 0;\n}\n\nint w_DistanceJoint_getStiffness(lua_State *L)\n{\n\tDistanceJoint *t = luax_checkdistancejoint(L, 1);\n\tlua_pushnumber(L, t->getStiffness());\n\treturn 1;\n}\n\nint w_DistanceJoint_setDamping(lua_State *L)\n{\n\tDistanceJoint *t = luax_checkdistancejoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tt->setDamping(arg1);\n\treturn 0;\n}\n\nint w_DistanceJoint_getDamping(lua_State *L)\n{\n\tDistanceJoint *t = luax_checkdistancejoint(L, 1);\n\tlua_pushnumber(L, t->getDamping());\n\treturn 1;\n}\n\nstatic const luaL_Reg w_DistanceJoint_functions[] =\n{\n\t{ \"setLength\", w_DistanceJoint_setLength },\n\t{ \"getLength\", w_DistanceJoint_getLength },\n\t{ \"setStiffness\", w_DistanceJoint_setStiffness },\n\t{ \"getStiffness\", w_DistanceJoint_getStiffness },\n\t{ \"setDamping\", w_DistanceJoint_setDamping },\n\t{ \"getDamping\", w_DistanceJoint_getDamping },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_distancejoint(lua_State *L)\n{\n\treturn luax_register_type(L, &DistanceJoint::type, w_Joint_functions, w_DistanceJoint_functions, nullptr);\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_DistanceJoint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WRAP_DISTANCE_JOINT_H\n#define LOVE_PHYSICS_BOX2D_WRAP_DISTANCE_JOINT_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"wrap_Joint.h\"\n#include \"DistanceJoint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nDistanceJoint *luax_checkdistancejoint(lua_State *L, int idx);\nextern \"C\" int luaopen_distancejoint(lua_State *L);\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WRAP_DISTANCE_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_EdgeShape.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_EdgeShape.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nEdgeShape *luax_checkedgeshape(lua_State *L, int idx)\n{\n\treturn luax_checktype<EdgeShape>(L, idx);\n}\n\nint w_EdgeShape_setNextVertex(lua_State *L)\n{\n\tEdgeShape *t = luax_checkedgeshape(L, 1);\n\tfloat x = (float)luaL_checknumber(L, 2);\n\tfloat y = (float)luaL_checknumber(L, 3);\n\tluax_catchexcept(L, [&]() { t->setNextVertex(x, y); });\n\treturn 0;\n}\n\nint w_EdgeShape_setPreviousVertex(lua_State *L)\n{\n\tEdgeShape *t = luax_checkedgeshape(L, 1);\n\tfloat x = (float)luaL_checknumber(L, 2);\n\tfloat y = (float)luaL_checknumber(L, 3);\n\tluax_catchexcept(L, [&]() { t->setPreviousVertex(x, y); });\n\treturn 0;\n}\n\nint w_EdgeShape_getNextVertex(lua_State *L)\n{\n\tEdgeShape *t = luax_checkedgeshape(L, 1);\n\tb2Vec2 v;\n\tluax_catchexcept(L, [&]() { v = t->getNextVertex(); });\n\tlua_pushnumber(L, v.x);\n\tlua_pushnumber(L, v.y);\n\treturn 2;\n}\n\nint w_EdgeShape_getPreviousVertex(lua_State *L)\n{\n\tEdgeShape *t = luax_checkedgeshape(L, 1);\n\tb2Vec2 v;\n\tluax_catchexcept(L, [&]() { v = t->getPreviousVertex(); });\n\tlua_pushnumber(L, v.x);\n\tlua_pushnumber(L, v.y);\n\treturn 2;\n}\n\nint w_EdgeShape_getPoints(lua_State *L)\n{\n\tEdgeShape *t = luax_checkedgeshape(L, 1);\n\tlua_remove(L, 1);\n\tint ret = 0;\n\tluax_catchexcept(L, [&]() { ret = t->getPoints(L); });\n\treturn ret;\n}\n\nstatic const luaL_Reg w_EdgeShape_functions[] =\n{\n\t{ \"setNextVertex\", w_EdgeShape_setNextVertex },\n\t{ \"setPreviousVertex\", w_EdgeShape_setPreviousVertex },\n\t{ \"getNextVertex\", w_EdgeShape_getNextVertex },\n\t{ \"getPreviousVertex\", w_EdgeShape_getPreviousVertex },\n\t{ \"getPoints\", w_EdgeShape_getPoints },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_edgeshape(lua_State *L)\n{\n\treturn luax_register_type(L, &EdgeShape::type, w_Shape_functions, w_EdgeShape_functions, nullptr);\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_EdgeShape.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WRAP_EDGE_SHAPE_H\n#define LOVE_PHYSICS_BOX2D_WRAP_EDGE_SHAPE_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"wrap_Shape.h\"\n#include \"EdgeShape.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nEdgeShape *luax_checkedgeshape(lua_State *L, int idx);\nextern \"C\" int luaopen_edgeshape(lua_State *L);\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WRAP_EDGE_SHAPE_H\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_FrictionJoint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_FrictionJoint.h\"\n#include \"wrap_Physics.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nFrictionJoint *luax_checkfrictionjoint(lua_State *L, int idx)\n{\n\tFrictionJoint *j = luax_checktype<FrictionJoint>(L, idx);\n\tif (!j->isValid())\n\t\tluaL_error(L, \"Attempt to use destroyed joint.\");\n\treturn j;\n}\n\nint w_FrictionJoint_setMaxForce(lua_State *L)\n{\n\tFrictionJoint *t = luax_checkfrictionjoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tluax_catchexcept(L, [&](){ t->setMaxForce(arg1); });\n\treturn 0;\n}\n\nint w_FrictionJoint_getMaxForce(lua_State *L)\n{\n\tFrictionJoint *t = luax_checkfrictionjoint(L, 1);\n\tlua_pushnumber(L, t->getMaxForce());\n\treturn 1;\n}\n\nint w_FrictionJoint_setMaxTorque(lua_State *L)\n{\n\tFrictionJoint *t = luax_checkfrictionjoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tluax_catchexcept(L, [&](){ t->setMaxTorque(arg1); });\n\treturn 0;\n}\n\nint w_FrictionJoint_getMaxTorque(lua_State *L)\n{\n\tFrictionJoint *t = luax_checkfrictionjoint(L, 1);\n\tlua_pushnumber(L, t->getMaxTorque());\n\treturn 1;\n}\n\nstatic const luaL_Reg w_FrictionJoint_functions[] =\n{\n\t{ \"setMaxForce\", w_FrictionJoint_setMaxForce },\n\t{ \"getMaxForce\", w_FrictionJoint_getMaxForce },\n\t{ \"setMaxTorque\", w_FrictionJoint_setMaxTorque },\n\t{ \"getMaxTorque\", w_FrictionJoint_getMaxTorque },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_frictionjoint(lua_State *L)\n{\n\treturn luax_register_type(L, &FrictionJoint::type, w_Joint_functions, w_FrictionJoint_functions, nullptr);\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_FrictionJoint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WRAP_FRICTION_JOINT_H\n#define LOVE_PHYSICS_BOX2D_WRAP_FRICTION_JOINT_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"wrap_Joint.h\"\n#include \"FrictionJoint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nFrictionJoint *luax_checkfrictionjoint(lua_State *L, int idx);\nextern \"C\" int luaopen_frictionjoint(lua_State *L);\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WRAP_FRICTION_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_GearJoint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_GearJoint.h\"\n#include \"wrap_Physics.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nGearJoint *luax_checkgearjoint(lua_State *L, int idx)\n{\n\tGearJoint *j = luax_checktype<GearJoint>(L, idx);\n\tif (!j->isValid())\n\t\tluaL_error(L, \"Attempt to use destroyed joint.\");\n\treturn j;\n}\n\nint w_GearJoint_setRatio(lua_State *L)\n{\n\tGearJoint *t = luax_checkgearjoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tluax_catchexcept(L, [&](){ t->setRatio(arg1); });\n\treturn 0;\n}\n\nint w_GearJoint_getRatio(lua_State *L)\n{\n\tGearJoint *t = luax_checkgearjoint(L, 1);\n\tlua_pushnumber(L, t->getRatio());\n\treturn 1;\n}\n\nint w_GearJoint_getJoints(lua_State *L)\n{\n\tGearJoint *t = luax_checkgearjoint(L, 1);\n\tJoint *j1 = nullptr;\n\tJoint *j2 = nullptr;\n\n\tluax_catchexcept(L, [&]() {\n\t\tj1 = t->getJointA();\n\t\tj2 = t->getJointB();\n\t});\n\n\tluax_pushjoint(L, j1);\n\tluax_pushjoint(L, j2);\n\treturn 2;\n}\n\nstatic const luaL_Reg w_GearJoint_functions[] =\n{\n\t{ \"setRatio\", w_GearJoint_setRatio },\n\t{ \"getRatio\", w_GearJoint_getRatio },\n\t{ \"getJoints\", w_GearJoint_getJoints },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_gearjoint(lua_State *L)\n{\n\treturn luax_register_type(L, &GearJoint::type, w_Joint_functions, w_GearJoint_functions, nullptr);\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_GearJoint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WRAP_GEAR_JOINT_H\n#define LOVE_PHYSICS_BOX2D_WRAP_GEAR_JOINT_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"wrap_Joint.h\"\n#include \"GearJoint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nGearJoint *luax_checkgearjoint(lua_State *L, int idx);\nextern \"C\" int luaopen_gearjoint(lua_State *L);\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WRAP_GEAR_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_Joint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"wrap_Joint.h\"\n#include \"common/StringMap.h\"\n#include \"Body.h\"\n#include \"DistanceJoint.h\"\n#include \"RevoluteJoint.h\"\n#include \"PrismaticJoint.h\"\n#include \"MouseJoint.h\"\n#include \"PulleyJoint.h\"\n#include \"GearJoint.h\"\n#include \"FrictionJoint.h\"\n#include \"WeldJoint.h\"\n#include \"WheelJoint.h\"\n#include \"RopeJoint.h\"\n#include \"MotorJoint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nvoid luax_pushjoint(lua_State *L, Joint *j)\n{\n\tif (j == nullptr)\n\t\treturn lua_pushnil(L);\n\n\tswitch (j->getType())\n\t{\n\tcase Joint::JOINT_DISTANCE:\n\t\treturn luax_pushtype(L, DistanceJoint::type, j);\n\tcase Joint::JOINT_REVOLUTE:\n\t\treturn luax_pushtype(L, RevoluteJoint::type, j);\n\tcase Joint::JOINT_PRISMATIC:\n\t\treturn luax_pushtype(L, PrismaticJoint::type, j);\n\tcase Joint::JOINT_MOUSE:\n\t\treturn luax_pushtype(L, MouseJoint::type, j);\n\tcase Joint::JOINT_PULLEY:\n\t\treturn luax_pushtype(L, PulleyJoint::type, j);\n\tcase Joint::JOINT_GEAR:\n\t\treturn luax_pushtype(L, GearJoint::type, j);\n\tcase Joint::JOINT_FRICTION:\n\t\treturn luax_pushtype(L, FrictionJoint::type, j);\n\tcase Joint::JOINT_WELD:\n\t\treturn luax_pushtype(L, WeldJoint::type, j);\n\tcase Joint::JOINT_WHEEL:\n\t\treturn luax_pushtype(L, WheelJoint::type, j);\n\tcase Joint::JOINT_ROPE:\n\t\treturn luax_pushtype(L, RopeJoint::type, j);\n\tcase Joint::JOINT_MOTOR:\n\t\treturn luax_pushtype(L, MotorJoint::type, j);\n\tdefault:\n\t\treturn lua_pushnil(L);\n\t}\n}\n\nJoint *luax_checkjoint(lua_State *L, int idx)\n{\n\tJoint *t = luax_checktype<Joint>(L, idx);\n\tif (!t->isValid())\n\t\tluaL_error(L, \"Attempt to use destroyed joint.\");\n\treturn t;\n}\n\nint w_Joint_getType(lua_State *L)\n{\n\tJoint *t = luax_checkjoint(L, 1);\n\tconst char *type = \"\";\n\tJoint::getConstant(t->getType(), type);\n\tlua_pushstring(L, type);\n\treturn 1;\n}\n\nint w_Joint_getBodies(lua_State *L)\n{\n\tJoint *t = luax_checkjoint(L, 1);\n\tBody *b1 = nullptr;\n\tBody *b2 = nullptr;\n\n\tluax_catchexcept(L, [&]() {\n\t\tb1 = t->getBodyA();\n\t\tb2 = t->getBodyB();\n\t});\n\n\tluax_pushtype(L, b1);\n\tluax_pushtype(L, b2);\n\treturn 2;\n}\n\nint w_Joint_getAnchors(lua_State *L)\n{\n\tJoint *t = luax_checkjoint(L, 1);\n\tlua_remove(L, 1);\n\treturn t->getAnchors(L);\n}\n\nint w_Joint_getReactionForce(lua_State *L)\n{\n\tJoint *t = luax_checkjoint(L, 1);\n\tlua_remove(L, 1);\n\treturn t->getReactionForce(L);\n}\n\nint w_Joint_getReactionTorque(lua_State *L)\n{\n\tJoint *t = luax_checkjoint(L, 1);\n\tfloat inv_dt = (float)luaL_checknumber(L, 2);\n\tlua_pushnumber(L, t->getReactionTorque(inv_dt));\n\treturn 1;\n}\n\nint w_Joint_getCollideConnected(lua_State *L)\n{\n\tJoint *t = luax_checkjoint(L, 1);\n\tluax_pushboolean(L, t->getCollideConnected());\n\treturn 1;\n}\n\nint w_Joint_setUserData(lua_State *L)\n{\n\tJoint *t = luax_checkjoint(L, 1);\n\tlua_remove(L, 1);\n\treturn t->setUserData(L);\n}\n\nint w_Joint_getUserData(lua_State *L)\n{\n\tJoint *t = luax_checkjoint(L, 1);\n\tlua_remove(L, 1);\n\treturn t->getUserData(L);\n}\n\nint w_Joint_destroy(lua_State *L)\n{\n\tJoint *t = luax_checkjoint(L, 1);\n\tluax_catchexcept(L, [&](){ t->destroyJoint(); });\n\treturn 0;\n}\n\nint w_Joint_isDestroyed(lua_State *L)\n{\n\tJoint *t = luax_checktype<Joint>(L, 1);\n\tluax_pushboolean(L, !t->isValid());\n\treturn 1;\n}\n\nconst luaL_Reg w_Joint_functions[] =\n{\n\t{ \"getType\", w_Joint_getType },\n\t{ \"getBodies\", w_Joint_getBodies },\n\t{ \"getAnchors\", w_Joint_getAnchors },\n\t{ \"getReactionForce\", w_Joint_getReactionForce },\n\t{ \"getReactionTorque\", w_Joint_getReactionTorque },\n\t{ \"getCollideConnected\", w_Joint_getCollideConnected },\n\t{ \"setUserData\", w_Joint_setUserData },\n\t{ \"getUserData\", w_Joint_getUserData },\n\t{ \"destroy\", w_Joint_destroy },\n\t{ \"isDestroyed\", w_Joint_isDestroyed },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_joint(lua_State *L)\n{\n\treturn luax_register_type(L, &Joint::type, w_Joint_functions, nullptr);\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_Joint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WRAP_JOINT_H\n#define LOVE_PHYSICS_BOX2D_WRAP_JOINT_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"Joint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nvoid luax_pushjoint(lua_State *L, Joint *j);\nJoint *luax_checkjoint(lua_State *L, int idx);\nextern \"C\" int luaopen_joint(lua_State *L);\n\nextern const luaL_Reg w_Joint_functions[];\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WRAP_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_MotorJoint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_MotorJoint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nMotorJoint *luax_checkmotorjoint(lua_State *L, int idx)\n{\n\tMotorJoint *j = luax_checktype<MotorJoint>(L, idx);\n\tif (!j->isValid())\n\t\tluaL_error(L, \"Attempt to use destroyed joint.\");\n\treturn j;\n}\n\nint w_MotorJoint_setLinearOffset(lua_State *L)\n{\n\tMotorJoint *t = luax_checkmotorjoint(L, 1);\n\tfloat x = (float) luaL_checknumber(L, 2);\n\tfloat y = (float) luaL_checknumber(L, 3);\n\tt->setLinearOffset(x, y);\n\treturn 0;\n}\n\nint w_MotorJoint_getLinearOffset(lua_State *L)\n{\n\tMotorJoint *t = luax_checkmotorjoint(L, 1);\n\treturn t->getLinearOffset(L);\n}\n\nint w_MotorJoint_setAngularOffset(lua_State *L)\n{\n\tMotorJoint *t = luax_checkmotorjoint(L, 1);\n\tfloat arg1 = (float) luaL_checknumber(L, 2);\n\tt->setAngularOffset(arg1);\n\treturn 0;\n}\n\nint w_MotorJoint_getAngularOffset(lua_State *L)\n{\n\tMotorJoint *t = luax_checkmotorjoint(L, 1);\n\tlua_pushnumber(L, t->getAngularOffset());\n\treturn 1;\n}\n\nint w_MotorJoint_setMaxForce(lua_State *L)\n{\n\tMotorJoint *t = luax_checkmotorjoint(L, 1);\n\tfloat arg1 = (float) luaL_checknumber(L, 2);\n\tluax_catchexcept(L, [&](){ t->setMaxForce(arg1); });\n\treturn 0;\n}\n\nint w_MotorJoint_getMaxForce(lua_State *L)\n{\n\tMotorJoint *t = luax_checkmotorjoint(L, 1);\n\tlua_pushnumber(L, t->getMaxForce());\n\treturn 1;\n}\n\nint w_MotorJoint_setMaxTorque(lua_State *L)\n{\n\tMotorJoint *t = luax_checkmotorjoint(L, 1);\n\tfloat arg1 = (float) luaL_checknumber(L, 2);\n\tluax_catchexcept(L, [&](){ t->setMaxTorque(arg1); });\n\treturn 0;\n}\n\nint w_MotorJoint_getMaxTorque(lua_State *L)\n{\n\tMotorJoint *t = luax_checkmotorjoint(L, 1);\n\tlua_pushnumber(L, t->getMaxTorque());\n\treturn 1;\n}\n\nint w_MotorJoint_setCorrectionFactor(lua_State *L)\n{\n\tMotorJoint *t = luax_checkmotorjoint(L, 1);\n\tfloat arg1 = (float) luaL_checknumber(L, 2);\n\tluax_catchexcept(L, [&](){ t->setCorrectionFactor(arg1); });\n\treturn 0;\n}\n\nint w_MotorJoint_getCorrectionFactor(lua_State *L)\n{\n\tMotorJoint *t = luax_checkmotorjoint(L, 1);\n\tlua_pushnumber(L, t->getCorrectionFactor());\n\treturn 1;\n}\n\nstatic const luaL_Reg w_MotorJoint_functions[] =\n{\n\t{ \"setLinearOffset\", w_MotorJoint_setLinearOffset },\n\t{ \"getLinearOffset\", w_MotorJoint_getLinearOffset },\n\t{ \"setAngularOffset\", w_MotorJoint_setAngularOffset },\n\t{ \"getAngularOffset\", w_MotorJoint_getAngularOffset },\n\t{ \"setMaxForce\", w_MotorJoint_setMaxForce },\n\t{ \"getMaxForce\", w_MotorJoint_getMaxForce },\n\t{ \"setMaxTorque\", w_MotorJoint_setMaxTorque },\n\t{ \"getMaxTorque\", w_MotorJoint_getMaxTorque },\n\t{ \"setCorrectionFactor\", w_MotorJoint_setCorrectionFactor },\n\t{ \"getCorrectionFactor\", w_MotorJoint_getCorrectionFactor },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_motorjoint(lua_State *L)\n{\n\treturn luax_register_type(L, &MotorJoint::type, w_Joint_functions, w_MotorJoint_functions, nullptr);\n}\n\n\n} // box2d\n} // phyics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_MotorJoint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WRAP_MOTOR_JOINT_H\n#define LOVE_PHYSICS_BOX2D_WRAP_MOTOR_JOINT_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"wrap_Joint.h\"\n#include \"MotorJoint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nMotorJoint *luax_checkmotorjoint(lua_State *L, int idx);\nextern \"C\" int luaopen_motorjoint(lua_State *L);\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WRAP_MOTOR_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_MouseJoint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_MouseJoint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nMouseJoint *luax_checkmousejoint(lua_State *L, int idx)\n{\n\tMouseJoint *j = luax_checktype<MouseJoint>(L, idx);\n\tif (!j->isValid())\n\t\tluaL_error(L, \"Attempt to use destroyed joint.\");\n\treturn j;\n}\n\nint w_MouseJoint_setTarget(lua_State *L)\n{\n\tMouseJoint *t = luax_checkmousejoint(L, 1);\n\tfloat x = (float)luaL_checknumber(L, 2);\n\tfloat y = (float)luaL_checknumber(L, 3);\n\tt->setTarget(x, y);\n\treturn 0;\n}\n\nint w_MouseJoint_getTarget(lua_State *L)\n{\n\tMouseJoint *t = luax_checkmousejoint(L, 1);\n\tlua_remove(L, 1);\n\treturn t->getTarget(L);\n}\n\nint w_MouseJoint_setMaxForce(lua_State *L)\n{\n\tMouseJoint *t = luax_checkmousejoint(L, 1);\n\tfloat f = (float)luaL_checknumber(L, 2);\n\tt->setMaxForce(f);\n\treturn 0;\n}\n\nint w_MouseJoint_getMaxForce(lua_State *L)\n{\n\tMouseJoint *t = luax_checkmousejoint(L, 1);\n\tlua_pushnumber(L, t->getMaxForce());\n\treturn 1;\n}\n\nint w_MouseJoint_setStiffness(lua_State *L)\n{\n\tMouseJoint *t = luax_checkmousejoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tluax_catchexcept(L, [&]() { t->setStiffness(arg1); });\n\treturn 0;\n}\n\nint w_MouseJoint_getStiffness(lua_State *L)\n{\n\tMouseJoint *t = luax_checkmousejoint(L, 1);\n\tlua_pushnumber(L, t->getStiffness());\n\treturn 1;\n}\n\nint w_MouseJoint_setDamping(lua_State *L)\n{\n\tMouseJoint *t = luax_checkmousejoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tt->setDamping(arg1);\n\treturn 0;\n}\n\nint w_MouseJoint_getDamping(lua_State *L)\n{\n\tMouseJoint *t = luax_checkmousejoint(L, 1);\n\tlua_pushnumber(L, t->getDamping());\n\treturn 1;\n}\n\nstatic const luaL_Reg w_MouseJoint_functions[] =\n{\n\t{ \"setTarget\", w_MouseJoint_setTarget },\n\t{ \"getTarget\", w_MouseJoint_getTarget },\n\t{ \"setMaxForce\", w_MouseJoint_setMaxForce },\n\t{ \"getMaxForce\", w_MouseJoint_getMaxForce },\n\t{ \"setStiffness\", w_MouseJoint_setStiffness },\n\t{ \"getStiffness\", w_MouseJoint_getStiffness },\n\t{ \"setDamping\", w_MouseJoint_setDamping },\n\t{ \"getDamping\", w_MouseJoint_getDamping },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_mousejoint(lua_State *L)\n{\n\treturn luax_register_type(L, &MouseJoint::type, w_Joint_functions, w_MouseJoint_functions, nullptr);\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_MouseJoint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WRAP_MOUSE_JOINT_H\n#define LOVE_PHYSICS_BOX2D_WRAP_MOUSE_JOINT_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"wrap_Joint.h\"\n#include \"MouseJoint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nMouseJoint *luax_checkmousejoint(lua_State *L, int idx);\nextern \"C\" int luaopen_mousejoint(lua_State *L);\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WRAP_MOUSE_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_Physics.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"wrap_Physics.h\"\n#include \"wrap_World.h\"\n#include \"wrap_Contact.h\"\n#include \"wrap_Body.h\"\n#include \"wrap_Shape.h\"\n#include \"wrap_CircleShape.h\"\n#include \"wrap_PolygonShape.h\"\n#include \"wrap_EdgeShape.h\"\n#include \"wrap_ChainShape.h\"\n#include \"wrap_Joint.h\"\n#include \"wrap_MouseJoint.h\"\n#include \"wrap_DistanceJoint.h\"\n#include \"wrap_PrismaticJoint.h\"\n#include \"wrap_RevoluteJoint.h\"\n#include \"wrap_PulleyJoint.h\"\n#include \"wrap_GearJoint.h\"\n#include \"wrap_FrictionJoint.h\"\n#include \"wrap_WeldJoint.h\"\n#include \"wrap_WheelJoint.h\"\n#include \"wrap_RopeJoint.h\"\n#include \"wrap_MotorJoint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\n#define instance() (Module::getInstance<Physics>(Module::M_PHYSICS))\n\nint w_newWorld(lua_State *L)\n{\n\tfloat gx = (float)luaL_optnumber(L, 1, 0);\n\tfloat gy = (float)luaL_optnumber(L, 2, 0);\n\tbool sleep = luax_optboolean(L, 3, true);\n\n\tWorld *w;\n\tluax_catchexcept(L, [&](){ w = instance()->newWorld(gx, gy, sleep); });\n\tluax_pushtype(L, w);\n\tw->release();\n\n\treturn 1;\n}\n\nint w_newBody(lua_State *L)\n{\n\tWorld *world = luax_checkworld(L, 1);\n\tfloat x = (float)luaL_optnumber(L, 2, 0.0);\n\tfloat y = (float)luaL_optnumber(L, 3, 0.0);\n\n\tBody::Type btype = Body::BODY_STATIC;\n\tconst char *typestr = lua_isnoneornil(L, 4) ? 0 : lua_tostring(L, 4);\n\tif (typestr && !Body::getConstant(typestr, btype))\n\t\treturn luax_enumerror(L, \"Body type\", Body::getConstants(btype), typestr);\n\n\tBody *body;\n\tluax_catchexcept(L, [&](){ body = instance()->newBody(world, x, y, btype); });\n\tluax_pushtype(L, body);\n\tbody->release();\n\treturn 1;\n}\n\nint w_newCircleBody(lua_State *L)\n{\n\tWorld *world = luax_checkworld(L, 1);\n\n\tconst char *typestr = luaL_checkstring(L, 2);\n\tBody::Type btype = Body::BODY_STATIC;\n\tif (!Body::getConstant(typestr, btype))\n\t\treturn luax_enumerror(L, \"Body type\", Body::getConstants(btype), typestr);\n\n\tfloat x = (float)luaL_checknumber(L, 3);\n\tfloat y = (float)luaL_checknumber(L, 4);\n\tfloat radius = (float)luaL_checknumber(L, 5);\n\n\tBody *body = nullptr;\n\tluax_catchexcept(L, [&]() { body = instance()->newCircleBody(world, btype, x, y, radius); });\n\n\tluax_pushtype(L, body);\n\tbody->release();\n\treturn 1;\n}\n\nint w_newRectangleBody(lua_State *L)\n{\n\tWorld *world = luax_checkworld(L, 1);\n\n\tconst char *typestr = luaL_checkstring(L, 2);\n\tBody::Type btype = Body::BODY_STATIC;\n\tif (!Body::getConstant(typestr, btype))\n\t\treturn luax_enumerror(L, \"Body type\", Body::getConstants(btype), typestr);\n\n\tfloat x = (float)luaL_checknumber(L, 3);\n\tfloat y = (float)luaL_checknumber(L, 4);\n\tfloat w = (float)luaL_checknumber(L, 5);\n\tfloat h = (float)luaL_checknumber(L, 6);\n\tfloat angle = (float)luaL_optnumber(L, 7, 0.0);\n\n\tBody *body = nullptr;\n\tluax_catchexcept(L, [&]() { body = instance()->newRectangleBody(world, btype, x, y, w, h, angle); });\n\n\tluax_pushtype(L, body);\n\tbody->release();\n\treturn 1;\n}\n\nint w_newPolygonBody(lua_State *L)\n{\n\tWorld *world = luax_checkworld(L, 1);\n\n\tconst char *typestr = luaL_checkstring(L, 2);\n\tBody::Type btype = Body::BODY_STATIC;\n\tif (!Body::getConstant(typestr, btype))\n\t\treturn luax_enumerror(L, \"Body type\", Body::getConstants(btype), typestr);\n\n\tint argc = lua_gettop(L);\n\n\tbool istable = lua_istable(L, 3);\n\tif (istable)\n\t\targc = (int)luax_objlen(L, 3);\n\n\tif (argc % 2 != 0)\n\t\treturn luaL_error(L, \"Number of vertex components must be a multiple of two.\");\n\n\tint vcount = argc / 2;\n\tstd::vector<Vector2> coords;\n\n\tif (istable)\n\t{\n\t\tfor (int i = 0; i < vcount; i++)\n\t\t{\n\t\t\tlua_rawgeti(L, 3, 1 + i * 2);\n\t\t\tlua_rawgeti(L, 3, 2 + i * 2);\n\t\t\tfloat x = (float)luaL_checknumber(L, -2);\n\t\t\tfloat y = (float)luaL_checknumber(L, -1);\n\t\t\tcoords.emplace_back(x, y);\n\t\t\tlua_pop(L, 2);\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (int i = 0; i < vcount; i++)\n\t\t{\n\t\t\tfloat x = (float)luaL_checknumber(L, 3 + i * 2);\n\t\t\tfloat y = (float)luaL_checknumber(L, 4 + i * 2);\n\t\t\tcoords.emplace_back(x, y);\n\t\t}\n\t}\n\n\tBody *body = nullptr;\n\tluax_catchexcept(L, [&]() { body = instance()->newPolygonBody(world, btype, coords.data(), (int)coords.size()); });\n\n\tluax_pushtype(L, body);\n\tbody->release();\n\treturn 1;\n}\n\nint w_newEdgeBody(lua_State *L)\n{\n\tWorld *world = luax_checkworld(L, 1);\n\n\tconst char *typestr = luaL_checkstring(L, 2);\n\tBody::Type btype = Body::BODY_STATIC;\n\tif (!Body::getConstant(typestr, btype))\n\t\treturn luax_enumerror(L, \"Body type\", Body::getConstants(btype), typestr);\n\n\tfloat x1 = (float)luaL_checknumber(L, 3);\n\tfloat y1 = (float)luaL_checknumber(L, 4);\n\tfloat x2 = (float)luaL_checknumber(L, 5);\n\tfloat y2 = (float)luaL_checknumber(L, 6);\n\n\tBody *body = nullptr;\n\n\tif (lua_isnoneornil(L, 7))\n\t{\n\t\tluax_catchexcept(L, [&]() { body = instance()->newEdgeBody(world, btype, x1, y1, x2, y2); });\n\t}\n\telse\n\t{\n\t\tfloat prevx = (float)luaL_checknumber(L, 7);\n\t\tfloat prevy = (float)luaL_checknumber(L, 8);\n\t\tfloat nextx = (float)luaL_checknumber(L, 9);\n\t\tfloat nexty = (float)luaL_checknumber(L, 10);\n\t\tluax_catchexcept(L, [&]() { body = instance()->newEdgeBody(world, btype, x1, y1, x2, y2, prevx, prevy, nextx, nexty); });\n\t}\n\n\tluax_pushtype(L, body);\n\tbody->release();\n\treturn 1;\n}\n\nint w_newChainBody(lua_State *L)\n{\n\tWorld *world = luax_checkworld(L, 1);\n\n\tconst char *typestr = luaL_checkstring(L, 2);\n\tBody::Type btype = Body::BODY_STATIC;\n\tif (!Body::getConstant(typestr, btype))\n\t\treturn luax_enumerror(L, \"Body type\", Body::getConstants(btype), typestr);\n\n\tbool loop = luax_checkboolean(L, 3);\n\n\tint argc = lua_gettop(L) - 3;\n\n\tbool istable = lua_istable(L, 4);\n\tif (istable)\n\t\targc = (int)luax_objlen(L, 4);\n\n\tif (argc == 0 || argc % 2 != 0)\n\t\treturn luaL_error(L, \"Number of vertex components must be a multiple of two.\");\n\n\tint vcount = argc / 2;\n\tstd::vector<Vector2> coords;\n\n\tif (istable)\n\t{\n\t\tfor (int i = 0; i < vcount; i++)\n\t\t{\n\t\t\tlua_rawgeti(L, 4, 1 + i * 2);\n\t\t\tlua_rawgeti(L, 4, 2 + i * 2);\n\t\t\tfloat x = (float)lua_tonumber(L, -2);\n\t\t\tfloat y = (float)lua_tonumber(L, -1);\n\t\t\tcoords.emplace_back(x, y);\n\t\t\tlua_pop(L, 2);\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (int i = 0; i < vcount; i++)\n\t\t{\n\t\t\tfloat x = (float)luaL_checknumber(L, 4 + i * 2);\n\t\t\tfloat y = (float)luaL_checknumber(L, 5 + i * 2);\n\t\t\tcoords.emplace_back(x, y);\n\t\t}\n\t}\n\n\tBody *body = nullptr;\n\tluax_catchexcept(L, [&]() { body = instance()->newChainBody(world, btype, loop, coords.data(), (int)coords.size()); });\n\n\tluax_pushtype(L, body);\n\tbody->release();\n\treturn 1;\n}\n\nint w_newFixture(lua_State *L)\n{\n\tluax_markdeprecated(L, 1, \"love.physics.newFixture\", API_FUNCTION, DEPRECATED_REPLACED, \"love.physics.newCircle/Rectangle/Polygon/Edge/ChainShape\");\n\n\tBody *body = luax_checkbody(L, 1);\n\tShape *shape = luax_checkshape(L, 2);\n\tfloat density = (float)luaL_optnumber(L, 3, 1.0f);\n\n\tShape *newShape;\n\tluax_catchexcept(L, [&]() { newShape = instance()->newAttachedShape(body, shape, density); });\n\n\tluax_pushshape(L, newShape);\n\tnewShape->release();\n\treturn 1;\n}\n\nstatic Body *luax_optbodyforshape(lua_State *L, int idx, const char *name)\n{\n\tif (lua_isnoneornil(L, idx) || luax_istype(L, idx, Object::type))\n\t\treturn luax_checkbody(L, idx);\n\n\tluax_markdeprecated(L, 1, name, API_FUNCTION_VARIANT, DEPRECATED_REPLACED, \"variant with Body parameter\");\n\treturn nullptr;\n}\n\nint w_newCircleShape(lua_State *L)\n{\n\tBody *body = luax_optbodyforshape(L, 1, \"love.physics.newCircleShape\");\n\tint bodyidx = body ? 1 : 0;\n\n\tint top = lua_gettop(L) - bodyidx;\n\n\tif (top == 1)\n\t{\n\t\tfloat radius = (float)luaL_checknumber(L, bodyidx + 1);\n\t\tCircleShape *shape;\n\t\tluax_catchexcept(L, [&](){ shape = instance()->newCircleShape(body, 0, 0, radius); });\n\t\tluax_pushtype(L, shape);\n\t\tshape->release();\n\t\treturn 1;\n\t}\n\telse if (top == 3)\n\t{\n\t\tfloat x = (float)luaL_checknumber(L, bodyidx + 1);\n\t\tfloat y = (float)luaL_checknumber(L, bodyidx + 2);\n\t\tfloat radius = (float)luaL_checknumber(L, bodyidx + 3);\n\t\tCircleShape *shape;\n\t\tluax_catchexcept(L, [&](){ shape = instance()->newCircleShape(body, x, y, radius); });\n\t\tluax_pushtype(L, shape);\n\t\tshape->release();\n\t\treturn 1;\n\t}\n\telse\n\t\treturn luaL_error(L, \"Incorrect number of parameters\");\n}\n\nint w_newRectangleShape(lua_State *L)\n{\n\tBody *body = luax_optbodyforshape(L, 1, \"love.physics.newRectangleShape\");\n\tint bodyidx = body ? 1 : 0;\n\n\tint top = lua_gettop(L) - bodyidx;\n\n\tif (top == 2)\n\t{\n\t\tfloat w = (float)luaL_checknumber(L, bodyidx + 1);\n\t\tfloat h = (float)luaL_checknumber(L, bodyidx + 2);\n\t\tPolygonShape *shape;\n\t\tluax_catchexcept(L, [&](){ shape = instance()->newRectangleShape(body, 0, 0, w, h, 0); });\n\t\tluax_pushtype(L, shape);\n\t\tshape->release();\n\t\treturn 1;\n\t}\n\telse if (top == 4 || top == 5)\n\t{\n\t\tfloat x = (float)luaL_checknumber(L, bodyidx + 1);\n\t\tfloat y = (float)luaL_checknumber(L, bodyidx + 2);\n\t\tfloat w = (float)luaL_checknumber(L, bodyidx + 3);\n\t\tfloat h = (float)luaL_checknumber(L, bodyidx + 4);\n\t\tfloat angle = (float)luaL_optnumber(L, bodyidx + 5, 0);\n\t\tPolygonShape *shape;\n\t\tluax_catchexcept(L, [&](){ shape = instance()->newRectangleShape(body, x, y, w, h, angle); });\n\t\tluax_pushtype(L, shape);\n\t\tshape->release();\n\t\treturn 1;\n\t}\n\telse\n\t\treturn luaL_error(L, \"Incorrect number of parameters\");\n}\n\nint w_newEdgeShape(lua_State *L)\n{\n\tBody *body = luax_optbodyforshape(L, 1, \"love.physics.newEdgeShape\");\n\tint bodyidx = body ? 1 : 0;\n\n\tfloat x1 = (float)luaL_checknumber(L, bodyidx + 1);\n\tfloat y1 = (float)luaL_checknumber(L, bodyidx + 2);\n\tfloat x2 = (float)luaL_checknumber(L, bodyidx + 3);\n\tfloat y2 = (float)luaL_checknumber(L, bodyidx + 4);\n\tEdgeShape *shape;\n\tif (lua_isnoneornil(L, bodyidx + 5))\n\t{\n\t\tluax_catchexcept(L, [&](){ shape = instance()->newEdgeShape(body, x1, y1, x2, y2); });\n\t}\n\telse\n\t{\n\t\tfloat prevx = (float)luaL_checknumber(L, bodyidx + 5);\n\t\tfloat prevy = (float)luaL_checknumber(L, bodyidx + 6);\n\t\tfloat nextx = (float)luaL_checknumber(L, bodyidx + 7);\n\t\tfloat nexty = (float)luaL_checknumber(L, bodyidx + 8);\n\t\tluax_catchexcept(L, [&]() { shape = instance()->newEdgeShape(body, x1, y1, x2, y2, prevx, prevy, nextx, nexty); });\n\t}\n\tluax_pushtype(L, shape);\n\tshape->release();\n\treturn 1;\n}\n\nint w_newPolygonShape(lua_State *L)\n{\n\tBody *body = luax_optbodyforshape(L, 1, \"love.physics.newPolygonShape\");\n\tint bodyidx = body ? 1 : 0;\n\n\tint argc = lua_gettop(L) - bodyidx;\n\n\tbool istable = lua_istable(L, bodyidx + 1);\n\n\tif (istable)\n\t\targc = (int)luax_objlen(L, bodyidx + 1);\n\n\tif (argc % 2 != 0)\n\t\treturn luaL_error(L, \"Number of vertex components must be a multiple of two.\");\n\n\tint vcount = argc / 2;\n\tstd::vector<Vector2> coords;\n\n\tif (istable)\n\t{\n\t\tfor (int i = 0; i < vcount; i++)\n\t\t{\n\t\t\tlua_rawgeti(L, bodyidx + 1, 1 + i * 2);\n\t\t\tlua_rawgeti(L, bodyidx + 1, 2 + i * 2);\n\t\t\tfloat x = (float)luaL_checknumber(L, -2);\n\t\t\tfloat y = (float)luaL_checknumber(L, -1);\n\t\t\tcoords.emplace_back(x, y);\n\t\t\tlua_pop(L, 2);\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (int i = 0; i < vcount; i++)\n\t\t{\n\t\t\tfloat x = (float)luaL_checknumber(L, bodyidx + 1 + i * 2);\n\t\t\tfloat y = (float)luaL_checknumber(L, bodyidx + 2 + i * 2);\n\t\t\tcoords.emplace_back(x, y);\n\t\t}\n\t}\n\n\tPolygonShape *shape = nullptr;\n\tluax_catchexcept(L, [&](){ shape = instance()->newPolygonShape(body, coords.data(), (int)coords.size()); });\n\tluax_pushtype(L, shape);\n\tshape->release();\n\treturn 1;\n}\n\nint w_newChainShape(lua_State *L)\n{\n\tBody *body = luax_optbodyforshape(L, 1, \"love.physics.newChainShape\");\n\tint bodyidx = body ? 1 : 0;\n\n\tint argc = lua_gettop(L) - 1 - bodyidx; // first argument is looping\n\n\tbool istable = lua_istable(L, bodyidx + 2);\n\n\tif (istable)\n\t\targc = (int)luax_objlen(L, bodyidx + 2);\n\n\tif (argc == 0 || argc % 2 != 0)\n\t\treturn luaL_error(L, \"Number of vertex components must be a multiple of two.\");\n\n\tint vcount = argc / 2;\n\tbool loop = luax_checkboolean(L, bodyidx + 1);\n\tstd::vector<Vector2> coords;\n\n\tif (istable)\n\t{\n\t\tfor (int i = 0; i < vcount; i++)\n\t\t{\n\t\t\tlua_rawgeti(L, bodyidx + 2, 1 + i * 2);\n\t\t\tlua_rawgeti(L, bodyidx + 2, 2 + i * 2);\n\t\t\tfloat x = (float)lua_tonumber(L, -2);\n\t\t\tfloat y = (float)lua_tonumber(L, -1);\n\t\t\tcoords.emplace_back(x, y);\n\t\t\tlua_pop(L, 2);\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (int i = 0; i < vcount; i++)\n\t\t{\n\t\t\tfloat x = (float)luaL_checknumber(L, bodyidx + 2 + i * 2);\n\t\t\tfloat y = (float)luaL_checknumber(L, bodyidx + 3 + i * 2);\n\t\t\tcoords.emplace_back(x, y);\n\t\t}\n\t}\n\n\tChainShape *shape = nullptr;\n\tluax_catchexcept(L, [&]() { shape = instance()->newChainShape(body, loop, coords.data(), coords.size()); });\n\tluax_pushtype(L, shape);\n\tshape->release();\n\treturn 1;\n}\n\nint w_newDistanceJoint(lua_State *L)\n{\n\tBody *body1 = luax_checkbody(L, 1);\n\tBody *body2 = luax_checkbody(L, 2);\n\tfloat x1 = (float)luaL_checknumber(L, 3);\n\tfloat y1 = (float)luaL_checknumber(L, 4);\n\tfloat x2 = (float)luaL_checknumber(L, 5);\n\tfloat y2 = (float)luaL_checknumber(L, 6);\n\tbool collideConnected = luax_optboolean(L, 7, false);\n\tDistanceJoint *j;\n\tluax_catchexcept(L, [&]() {\n\t\tj = instance()->newDistanceJoint(body1, body2, x1, y1, x2, y2, collideConnected);\n\t});\n\tluax_pushtype(L, j);\n\tj->release();\n\treturn 1;\n}\n\nint w_newMouseJoint(lua_State *L)\n{\n\tBody *body = luax_checkbody(L, 1);\n\tfloat x = (float)luaL_checknumber(L, 2);\n\tfloat y = (float)luaL_checknumber(L, 3);\n\tMouseJoint *j;\n\tluax_catchexcept(L, [&](){ j = instance()->newMouseJoint(body, x, y); });\n\tluax_pushtype(L, j);\n\tj->release();\n\treturn 1;\n}\n\nint w_newRevoluteJoint(lua_State *L)\n{\n\tBody *body1 = luax_checkbody(L, 1);\n\tBody *body2 = luax_checkbody(L, 2);\n\tfloat xA = (float)luaL_checknumber(L, 3);\n\tfloat yA = (float)luaL_checknumber(L, 4);\n\tfloat xB, yB;\n\tbool collideConnected;\n\tif (lua_gettop(L) >= 6)\n\t{\n\t\txB = (float)luaL_checknumber(L, 5);\n\t\tyB = (float)luaL_checknumber(L, 6);\n\t\tcollideConnected = luax_optboolean(L, 7, false);\n\t}\n\telse\n\t{\n\t\txB = xA;\n\t\tyB = yA;\n\t\tcollideConnected = luax_optboolean(L, 5, false);\n\t}\n\tRevoluteJoint *j;\n\tluax_catchexcept(L, [&]() {\n\t\tif (lua_gettop(L) >= 8)\n\t\t{\n\t\t\tfloat referenceAngle = (float)luaL_checknumber(L, 8);\n\t\t\tj = instance()->newRevoluteJoint(body1, body2, xA, yA, xB, yB, collideConnected, referenceAngle);\n\t\t}\n\t\telse\n\t\t\tj = instance()->newRevoluteJoint(body1, body2, xA, yA, xB, yB, collideConnected);\n\t});\n\tluax_pushtype(L, j);\n\tj->release();\n\treturn 1;\n}\n\nint w_newPrismaticJoint(lua_State *L)\n{\n\tBody *body1 = luax_checkbody(L, 1);\n\tBody *body2 = luax_checkbody(L, 2);\n\tfloat xA = (float)luaL_checknumber(L, 3);\n\tfloat yA = (float)luaL_checknumber(L, 4);\n\tfloat xB, yB, ax, ay;\n\tbool collideConnected;\n\tif (lua_gettop(L) >= 8)\n\t{\n\t\txB = (float)luaL_checknumber(L, 5);\n\t\tyB = (float)luaL_checknumber(L, 6);\n\t\tax = (float)luaL_checknumber(L, 7);\n\t\tay = (float)luaL_checknumber(L, 8);\n\t\tcollideConnected = luax_optboolean(L, 9, false);\n\t}\n\telse\n\t{\n\t\txB = xA;\n\t\tyB = yA;\n\t\tax = (float)luaL_checknumber(L, 5);\n\t\tay = (float)luaL_checknumber(L, 6);\n\t\tcollideConnected = luax_optboolean(L, 7, false);\n\t}\n\tPrismaticJoint *j;\n\tluax_catchexcept(L, [&]() {\n\t\tif (lua_gettop(L) >= 10)\n\t\t{\n\t\t\tfloat referenceAngle = (float)luaL_checknumber(L, 10);\n\t\t\tj = instance()->newPrismaticJoint(body1, body2, xA, yA, xB, yB, ax, ay, collideConnected, referenceAngle);\n\t\t}\n\t\telse\n\t\t\tj = instance()->newPrismaticJoint(body1, body2, xA, yA, xB, yB, ax, ay, collideConnected);\n\t});\n\tluax_pushtype(L, j);\n\tj->release();\n\treturn 1;\n}\n\nint w_newPulleyJoint(lua_State *L)\n{\n\tBody *body1 = luax_checkbody(L, 1);\n\tBody *body2 = luax_checkbody(L, 2);\n\tfloat gx1 = (float)luaL_checknumber(L, 3);\n\tfloat gy1 = (float)luaL_checknumber(L, 4);\n\tfloat gx2 = (float)luaL_checknumber(L, 5);\n\tfloat gy2 = (float)luaL_checknumber(L, 6);\n\tfloat x1 = (float)luaL_checknumber(L, 7);\n\tfloat y1 = (float)luaL_checknumber(L, 8);\n\tfloat x2 = (float)luaL_checknumber(L, 9);\n\tfloat y2 = (float)luaL_checknumber(L, 10);\n\tfloat ratio = (float)luaL_optnumber(L, 11, 1.0);\n\tbool collideConnected = luax_optboolean(L, 12, true); // PulleyJoints default to colliding connected bodies, see b2PulleyJoint.h\n\n\tPulleyJoint *j;\n\tluax_catchexcept(L, [&]() {\n\t\tj = instance()->newPulleyJoint(body1, body2, b2Vec2(gx1,gy1), b2Vec2(gx2,gy2), b2Vec2(x1,y1), b2Vec2(x2,y2), ratio, collideConnected);\n\t});\n\tluax_pushtype(L, j);\n\tj->release();\n\treturn 1;\n}\n\nint w_newGearJoint(lua_State *L)\n{\n\tJoint *joint1 = luax_checkjoint(L, 1);\n\tJoint *joint2 = luax_checkjoint(L, 2);\n\tfloat ratio = (float)luaL_optnumber(L, 3, 1.0);\n\tbool collideConnected = luax_optboolean(L, 4, false);\n\n\tGearJoint *j;\n\tluax_catchexcept(L, [&]() {\n\t\tj = instance()->newGearJoint(joint1, joint2, ratio, collideConnected);\n\t});\n\tluax_pushtype(L, j);\n\tj->release();\n\treturn 1;\n}\n\nint w_newFrictionJoint(lua_State *L)\n{\n\tBody *body1 = luax_checkbody(L, 1);\n\tBody *body2 = luax_checkbody(L, 2);\n\tfloat xA = (float)luaL_checknumber(L, 3);\n\tfloat yA = (float)luaL_checknumber(L, 4);\n\tfloat xB, yB;\n\tbool collideConnected;\n\tif (lua_gettop(L) >= 6)\n\t{\n\t\txB = (float)luaL_checknumber(L, 5);\n\t\tyB = (float)luaL_checknumber(L, 6);\n\t\tcollideConnected = luax_optboolean(L, 7, false);\n\t}\n\telse\n\t{\n\t\txB = xA;\n\t\tyB = yA;\n\t\tcollideConnected = luax_optboolean(L, 5, false);\n\t}\n\tFrictionJoint *j;\n\tluax_catchexcept(L, [&]() {\n\t\tj = instance()->newFrictionJoint(body1, body2, xA, yA, xB, yB, collideConnected);\n\t});\n\tluax_pushtype(L, j);\n\tj->release();\n\treturn 1;\n}\n\nint w_newWeldJoint(lua_State *L)\n{\n\tBody *body1 = luax_checkbody(L, 1);\n\tBody *body2 = luax_checkbody(L, 2);\n\tfloat xA = (float)luaL_checknumber(L, 3);\n\tfloat yA = (float)luaL_checknumber(L, 4);\n\tfloat xB, yB;\n\tbool collideConnected;\n\tif (lua_gettop(L) >= 6)\n\t{\n\t\txB = (float)luaL_checknumber(L, 5);\n\t\tyB = (float)luaL_checknumber(L, 6);\n\t\tcollideConnected = luax_optboolean(L, 7, false);\n\t}\n\telse\n\t{\n\t\txB = xA;\n\t\tyB = yA;\n\t\tcollideConnected = luax_optboolean(L, 5, false);\n\t}\n\tWeldJoint *j;\n\tluax_catchexcept(L, [&]() {\n\t\tif (lua_gettop(L) >= 8)\n\t\t{\n\t\t\tfloat referenceAngle = (float)luaL_checknumber(L, 8);\n\t\t\tj = instance()->newWeldJoint(body1, body2, xA, yA, xB, yB, collideConnected, referenceAngle);\n\t\t}\n\t\telse\n\t\t\tj = instance()->newWeldJoint(body1, body2, xA, yA, xB, yB, collideConnected);\n\t});\n\tluax_pushtype(L, j);\n\tj->release();\n\treturn 1;\n}\n\nint w_newWheelJoint(lua_State *L)\n{\n\tBody *body1 = luax_checkbody(L, 1);\n\tBody *body2 = luax_checkbody(L, 2);\n\tfloat xA = (float)luaL_checknumber(L, 3);\n\tfloat yA = (float)luaL_checknumber(L, 4);\n\tfloat xB, yB, ax, ay;\n\tbool collideConnected;\n\tif (lua_gettop(L) >= 8)\n\t{\n\t\txB = (float)luaL_checknumber(L, 5);\n\t\tyB = (float)luaL_checknumber(L, 6);\n\t\tax = (float)luaL_checknumber(L, 7);\n\t\tay = (float)luaL_checknumber(L, 8);\n\t\tcollideConnected = luax_optboolean(L, 9, false);\n\t}\n\telse\n\t{\n\t\txB = xA;\n\t\tyB = yA;\n\t\tax = (float)luaL_checknumber(L, 5);\n\t\tay = (float)luaL_checknumber(L, 6);\n\t\tcollideConnected = luax_optboolean(L, 7, false);\n\t}\n\n\tWheelJoint *j;\n\tluax_catchexcept(L, [&]() {\n\t\tj = instance()->newWheelJoint(body1, body2, xA, yA, xB, yB, ax, ay, collideConnected);\n\t});\n\tluax_pushtype(L, j);\n\tj->release();\n\treturn 1;\n}\n\nint w_newRopeJoint(lua_State *L)\n{\n\tBody *body1 = luax_checkbody(L, 1);\n\tBody *body2 = luax_checkbody(L, 2);\n\tfloat x1 = (float)luaL_checknumber(L, 3);\n\tfloat y1 = (float)luaL_checknumber(L, 4);\n\tfloat x2 = (float)luaL_checknumber(L, 5);\n\tfloat y2 = (float)luaL_checknumber(L, 6);\n\tfloat maxLength = (float)luaL_checknumber(L, 7);\n\tbool collideConnected = luax_optboolean(L, 8, false);\n\tRopeJoint *j;\n\tluax_catchexcept(L, [&]() {\n\t\tj = instance()->newRopeJoint(body1, body2, x1, y1, x2, y2, maxLength, collideConnected);\n\t});\n\tluax_pushtype(L, j);\n\tj->release();\n\treturn 1;\n}\n\nint w_newMotorJoint(lua_State *L)\n{\n\tBody *body1 = luax_checkbody(L, 1);\n\tBody *body2 = luax_checkbody(L, 2);\n\tMotorJoint *j = 0;\n\tif (!lua_isnoneornil(L, 3))\n\t{\n\t\tfloat correctionFactor = (float)luaL_checknumber(L, 3);\n\t\tbool collideConnected = luax_optboolean(L, 4, false);\n\t\tluax_catchexcept(L, [&]() {\n\t\t\tj = instance()->newMotorJoint(body1, body2, correctionFactor, collideConnected);\n\t\t});\n\t}\n\telse\n\t{\n\t\tluax_catchexcept(L, [&](){ j = instance()->newMotorJoint(body1, body2); });\n\t}\n\tluax_pushtype(L, j);\n\tj->release();\n\treturn 1;\n}\n\nint w_getDistance(lua_State *L)\n{\n\treturn instance()->getDistance(L);\n}\n\nint w_setMeter(lua_State *L)\n{\n\tfloat arg1 = (float) luaL_checknumber(L, 1);\n\tluax_catchexcept(L, [&](){ Physics::setMeter(arg1); });\n\treturn 0;\n\n}\n\nint w_getMeter(lua_State *L)\n{\n\tlua_pushinteger(L, Physics::getMeter());\n\treturn 1;\n}\n\nint w_computeLinearStiffness(lua_State *L)\n{\n\tfloat frequency = (float)luaL_checknumber(L, 1);\n\tfloat dampingRatio = (float)luaL_checknumber(L, 2);\n\tBody *body1 = luax_checkbody(L, 3);\n\tb2Body *other = 0;\n\n\tif (lua_isnoneornil(L, 4))\n\t\tother = body1->getWorld()->getGroundBody();\n\telse\n\t\tother = luax_checkbody(L, 4)->body;\n\n\tfloat stiffness, damping;\n\tPhysics::computeLinearStiffness(stiffness, damping, frequency, dampingRatio, body1->body, other);\n\n\tlua_pushnumber(L, stiffness);\n\tlua_pushnumber(L, damping);\n\n\treturn 2;\n}\n\nint w_computeLinearFrequency(lua_State *L)\n{\n\tfloat stiffness = (float)luaL_checknumber(L, 1);\n\tfloat damping = (float)luaL_checknumber(L, 2);\n\tBody *body1 = luax_checkbody(L, 3);\n\tb2Body *other = 0;\n\n\tif (lua_isnoneornil(L, 4))\n\t\tother = body1->getWorld()->getGroundBody();\n\telse\n\t\tother = luax_checkbody(L, 4)->body;\n\n\tfloat frequency, dampingRatio;\n\tPhysics::computeLinearFrequency(frequency, dampingRatio, stiffness, damping, body1->body, other);\n\n\tlua_pushnumber(L, frequency);\n\tlua_pushnumber(L, dampingRatio);\n\n\treturn 2;\n}\n\nint w_computeAngularStiffness(lua_State *L)\n{\n\tfloat frequency = (float)luaL_checknumber(L, 1);\n\tfloat dampingRatio = (float)luaL_checknumber(L, 2);\n\tBody *body1 = luax_checkbody(L, 3);\n\tb2Body *other = 0;\n\n\tif (lua_isnoneornil(L, 4))\n\t\tother = body1->getWorld()->getGroundBody();\n\telse\n\t\tother = luax_checkbody(L, 4)->body;\n\n\tfloat stiffness, damping;\n\tPhysics::computeAngularStiffness(stiffness, damping, frequency, dampingRatio, body1->body, other);\n\n\tlua_pushnumber(L, stiffness);\n\tlua_pushnumber(L, damping);\n\n\treturn 2;\n}\n\nint w_computeAngularFrequency(lua_State *L)\n{\n\tfloat stiffness = (float)luaL_checknumber(L, 1);\n\tfloat damping = (float)luaL_checknumber(L, 2);\n\tBody *body1 = luax_checkbody(L, 3);\n\tb2Body *other = 0;\n\n\tif (lua_isnoneornil(L, 4))\n\t\tother = body1->getWorld()->getGroundBody();\n\telse\n\t\tother = luax_checkbody(L, 4)->body;\n\n\tfloat frequency, dampingRatio;\n\tPhysics::computeAngularFrequency(frequency, dampingRatio, stiffness, damping, body1->body, other);\n\n\tlua_pushnumber(L, frequency);\n\tlua_pushnumber(L, dampingRatio);\n\n\treturn 2;\n}\n\n// List of functions to wrap.\nstatic const luaL_Reg functions[] =\n{\n\t{ \"newWorld\", w_newWorld },\n\t{ \"newBody\", w_newBody },\n\t{ \"newCircleBody\", w_newCircleBody },\n\t{ \"newRectangleBody\", w_newRectangleBody },\n\t{ \"newPolygonBody\", w_newPolygonBody },\n\t{ \"newEdgeBody\", w_newEdgeBody },\n\t{ \"newChainBody\", w_newChainBody },\n\t{ \"newCircleShape\", w_newCircleShape },\n\t{ \"newRectangleShape\", w_newRectangleShape },\n\t{ \"newPolygonShape\", w_newPolygonShape },\n\t{ \"newEdgeShape\", w_newEdgeShape },\n\t{ \"newChainShape\", w_newChainShape },\n\t{ \"newDistanceJoint\", w_newDistanceJoint },\n\t{ \"newMouseJoint\", w_newMouseJoint },\n\t{ \"newRevoluteJoint\", w_newRevoluteJoint },\n\t{ \"newPrismaticJoint\", w_newPrismaticJoint },\n\t{ \"newPulleyJoint\", w_newPulleyJoint },\n\t{ \"newGearJoint\", w_newGearJoint },\n\t{ \"newFrictionJoint\", w_newFrictionJoint },\n\t{ \"newWeldJoint\", w_newWeldJoint },\n\t{ \"newWheelJoint\", w_newWheelJoint },\n\t{ \"newRopeJoint\", w_newRopeJoint },\n\t{ \"newMotorJoint\", w_newMotorJoint },\n\t{ \"getDistance\", w_getDistance },\n\t{ \"getMeter\", w_getMeter },\n\t{ \"setMeter\", w_setMeter },\n\t{ \"computeLinearStiffness\", w_computeLinearStiffness },\n\t{ \"computeLinearFrequency\", w_computeLinearFrequency },\n\t{ \"computeAngularStiffness\", w_computeAngularStiffness },\n\t{ \"computeAngularFrequency\", w_computeAngularFrequency },\n\n\t// Deprecated\n\t{ \"newFixture\", w_newFixture },\n\n\t{ 0, 0 },\n};\n\nstatic const lua_CFunction types[] =\n{\n\tluaopen_world,\n\tluaopen_contact,\n\tluaopen_body,\n\tluaopen_shape,\n\tluaopen_circleshape,\n\tluaopen_polygonshape,\n\tluaopen_edgeshape,\n\tluaopen_chainshape,\n\tluaopen_joint,\n\tluaopen_mousejoint,\n\tluaopen_distancejoint,\n\tluaopen_prismaticjoint,\n\tluaopen_revolutejoint,\n\tluaopen_pulleyjoint,\n\tluaopen_gearjoint,\n\tluaopen_frictionjoint,\n\tluaopen_weldjoint,\n\tluaopen_wheeljoint,\n\tluaopen_ropejoint,\n\tluaopen_motorjoint,\n\t0\n};\n\nextern \"C\" int luaopen_love_physics(lua_State *L)\n{\n\tPhysics *instance = instance();\n\tif (instance == nullptr)\n\t{\n\t\tluax_catchexcept(L, [&](){ instance = new Physics(); });\n\t}\n\telse\n\t\tinstance->retain();\n\n\tWrappedModule w;\n\tw.module = instance;\n\tw.name = \"physics\";\n\tw.type = &Module::type;\n\tw.functions = functions;\n\tw.types = types;\n\n\treturn luax_register_module(L, w);\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_Physics.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WRAP_PHYSICS_H\n#define LOVE_PHYSICS_BOX2D_WRAP_PHYSICS_H\n\n// LOVE\n#include \"common/config.h\"\n#include \"Physics.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nextern \"C\" LOVE_EXPORT int luaopen_love_physics(lua_State *L);\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WRAP_PHYSICS_H\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_PolygonShape.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_PolygonShape.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nPolygonShape *luax_checkpolygonshape(lua_State *L, int idx)\n{\n\treturn luax_checktype<PolygonShape>(L, idx);\n}\n\nint w_PolygonShape_getPoints(lua_State *L)\n{\n\tPolygonShape *t = luax_checkpolygonshape(L, 1);\n\tlua_remove(L, 1);\n\tint ret = 0;\n\tluax_catchexcept(L, [&]() { ret = t->getPoints(L); });\n\treturn ret;\n}\n\nint w_PolygonShape_validate(lua_State *L)\n{\n\tPolygonShape *t = luax_checkpolygonshape(L, 1);\n\tbool valid = false;\n\tluax_catchexcept(L, [&]() { valid = t->validate(); });\n\tluax_pushboolean(L, valid);\n\treturn 1;\n}\n\nstatic const luaL_Reg w_PolygonShape_functions[] =\n{\n\t{ \"getPoints\", w_PolygonShape_getPoints },\n\t{ \"validate\", w_PolygonShape_validate },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_polygonshape(lua_State *L)\n{\n\treturn luax_register_type(L, &PolygonShape::type, w_Shape_functions, w_PolygonShape_functions, nullptr);\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_PolygonShape.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WRAP_POLYGON_SHAPE_H\n#define LOVE_PHYSICS_BOX2D_WRAP_POLYGON_SHAPE_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"wrap_Shape.h\"\n#include \"PolygonShape.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nPolygonShape *luax_checkpolygonshape(lua_State *L, int idx);\nextern \"C\" int luaopen_polygonshape(lua_State *L);\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WRAP_POLYGON_SHAPE_H\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_PrismaticJoint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_PrismaticJoint.h\"\n#include \"wrap_Physics.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nPrismaticJoint *luax_checkprismaticjoint(lua_State *L, int idx)\n{\n\tPrismaticJoint *j = luax_checktype<PrismaticJoint>(L, idx);\n\tif (!j->isValid())\n\t\tluaL_error(L, \"Attempt to use destroyed joint.\");\n\treturn j;\n}\n\nint w_PrismaticJoint_getJointTranslation(lua_State *L)\n{\n\tPrismaticJoint *t = luax_checkprismaticjoint(L, 1);\n\tlua_pushnumber(L, t->getJointTranslation());\n\treturn 1;\n}\n\nint w_PrismaticJoint_getJointSpeed(lua_State *L)\n{\n\tPrismaticJoint *t = luax_checkprismaticjoint(L, 1);\n\tlua_pushnumber(L, t->getJointSpeed());\n\treturn 1;\n}\n\nint w_PrismaticJoint_setMotorEnabled(lua_State *L)\n{\n\tPrismaticJoint *t = luax_checkprismaticjoint(L, 1);\n\tbool arg1 = luax_checkboolean(L, 2);\n\tt->setMotorEnabled(arg1);\n\treturn 0;\n}\n\nint w_PrismaticJoint_isMotorEnabled(lua_State *L)\n{\n\tPrismaticJoint *t = luax_checkprismaticjoint(L, 1);\n\tluax_pushboolean(L, t->isMotorEnabled());\n\treturn 1;\n}\n\nint w_PrismaticJoint_setMaxMotorForce(lua_State *L)\n{\n\tPrismaticJoint *t = luax_checkprismaticjoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tt->setMaxMotorForce(arg1);\n\treturn 0;\n}\n\nint w_PrismaticJoint_setMotorSpeed(lua_State *L)\n{\n\tPrismaticJoint *t = luax_checkprismaticjoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tt->setMotorSpeed(arg1);\n\treturn 0;\n}\n\nint w_PrismaticJoint_getMotorSpeed(lua_State *L)\n{\n\tPrismaticJoint *t = luax_checkprismaticjoint(L, 1);\n\tlua_pushnumber(L, t->getMotorSpeed());\n\treturn 1;\n}\n\nint w_PrismaticJoint_getMotorForce(lua_State *L)\n{\n\tPrismaticJoint *t = luax_checkprismaticjoint(L, 1);\n\tfloat inv_dt = (float)luaL_checknumber(L, 2);\n\tlua_pushnumber(L, t->getMotorForce(inv_dt));\n\treturn 1;\n}\n\nint w_PrismaticJoint_getMaxMotorForce(lua_State *L)\n{\n\tPrismaticJoint *t = luax_checkprismaticjoint(L, 1);\n\tlua_pushnumber(L, t->getMaxMotorForce());\n\treturn 1;\n}\n\nint w_PrismaticJoint_setLimitsEnabled(lua_State *L)\n{\n\tPrismaticJoint *t = luax_checkprismaticjoint(L, 1);\n\tbool arg1 = luax_checkboolean(L, 2);\n\tt->setLimitsEnabled(arg1);\n\treturn 0;\n}\n\nint w_PrismaticJoint_areLimitsEnabled(lua_State *L)\n{\n\tPrismaticJoint *t = luax_checkprismaticjoint(L, 1);\n\tluax_pushboolean(L, t->areLimitsEnabled());\n\treturn 1;\n}\n\nint w_PrismaticJoint_setUpperLimit(lua_State *L)\n{\n\tPrismaticJoint *t = luax_checkprismaticjoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tluax_catchexcept(L, [&](){ t->setUpperLimit(arg1); });\n\treturn 0;\n}\n\nint w_PrismaticJoint_setLowerLimit(lua_State *L)\n{\n\tPrismaticJoint *t = luax_checkprismaticjoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tluax_catchexcept(L, [&](){ t->setLowerLimit(arg1); });\n\treturn 0;\n}\n\nint w_PrismaticJoint_setLimits(lua_State *L)\n{\n\tPrismaticJoint *t = luax_checkprismaticjoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tfloat arg2 = (float)luaL_checknumber(L, 3);\n\tluax_catchexcept(L, [&](){ t->setLimits(arg1, arg2); });\n\treturn 0;\n}\n\nint w_PrismaticJoint_getLowerLimit(lua_State *L)\n{\n\tPrismaticJoint *t = luax_checkprismaticjoint(L, 1);\n\tlua_pushnumber(L, t->getLowerLimit());\n\treturn 1;\n}\n\nint w_PrismaticJoint_getUpperLimit(lua_State *L)\n{\n\tPrismaticJoint *t = luax_checkprismaticjoint(L, 1);\n\tlua_pushnumber(L, t->getUpperLimit());\n\treturn 1;\n}\n\nint w_PrismaticJoint_getLimits(lua_State *L)\n{\n\tPrismaticJoint *t = luax_checkprismaticjoint(L, 1);\n\tlua_remove(L, 1);\n\treturn t->getLimits(L);\n}\n\nint w_PrismaticJoint_getAxis(lua_State *L)\n{\n\tPrismaticJoint *t = luax_checkprismaticjoint(L, 1);\n\tlua_remove(L, 1);\n\treturn t->getAxis(L);\n}\n\nint w_PrismaticJoint_getReferenceAngle(lua_State *L)\n{\n\tPrismaticJoint *t = luax_checkprismaticjoint(L, 1);\n\tlua_pushnumber(L, t->getReferenceAngle());\n\treturn 1;\n}\n\nstatic const luaL_Reg w_PrismaticJoint_functions[] =\n{\n\t{ \"getJointTranslation\", w_PrismaticJoint_getJointTranslation },\n\t{ \"getJointSpeed\", w_PrismaticJoint_getJointSpeed },\n\t{ \"setMotorEnabled\", w_PrismaticJoint_setMotorEnabled },\n\t{ \"isMotorEnabled\", w_PrismaticJoint_isMotorEnabled },\n\t{ \"setMaxMotorForce\", w_PrismaticJoint_setMaxMotorForce },\n\t{ \"setMotorSpeed\", w_PrismaticJoint_setMotorSpeed },\n\t{ \"getMotorSpeed\", w_PrismaticJoint_getMotorSpeed },\n\t{ \"getMotorForce\", w_PrismaticJoint_getMotorForce },\n\t{ \"getMaxMotorForce\", w_PrismaticJoint_getMaxMotorForce },\n\t{ \"setLimitsEnabled\", w_PrismaticJoint_setLimitsEnabled },\n\t{ \"areLimitsEnabled\", w_PrismaticJoint_areLimitsEnabled },\n\t{ \"setUpperLimit\", w_PrismaticJoint_setUpperLimit },\n\t{ \"setLowerLimit\", w_PrismaticJoint_setLowerLimit },\n\t{ \"setLimits\", w_PrismaticJoint_setLimits },\n\t{ \"getLowerLimit\", w_PrismaticJoint_getLowerLimit },\n\t{ \"getUpperLimit\", w_PrismaticJoint_getUpperLimit },\n\t{ \"getLimits\", w_PrismaticJoint_getLimits },\n\t{ \"getAxis\", w_PrismaticJoint_getAxis },\n\t{ \"getReferenceAngle\", w_PrismaticJoint_getReferenceAngle },\n\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_prismaticjoint(lua_State *L)\n{\n\treturn luax_register_type(L, &PrismaticJoint::type, w_Joint_functions, w_PrismaticJoint_functions, nullptr);\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_PrismaticJoint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WRAP_PRISMATIC_JOINT_H\n#define LOVE_PHYSICS_BOX2D_WRAP_PRISMATIC_JOINT_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"wrap_Joint.h\"\n#include \"PrismaticJoint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nPrismaticJoint *luax_checkprismaticjoint(lua_State *L, int idx);\nextern \"C\" int luaopen_prismaticjoint(lua_State *L);\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WRAP_PRISMATIC_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_PulleyJoint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_PulleyJoint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nPulleyJoint *luax_checkpulleyjoint(lua_State *L, int idx)\n{\n\tPulleyJoint *j = luax_checktype<PulleyJoint>(L, idx);\n\tif (!j->isValid())\n\t\tluaL_error(L, \"Attempt to use destroyed joint.\");\n\treturn j;\n}\n\nint w_PulleyJoint_getGroundAnchors(lua_State *L)\n{\n\tPulleyJoint *t = luax_checkpulleyjoint(L, 1);\n\tlua_remove(L, 1);\n\treturn t->getGroundAnchors(L);\n}\n\nint w_PulleyJoint_getLengthA(lua_State *L)\n{\n\tPulleyJoint *t = luax_checkpulleyjoint(L, 1);\n\tlua_pushnumber(L, t->getLengthA());\n\treturn 1;\n}\n\nint w_PulleyJoint_getLengthB(lua_State *L)\n{\n\tPulleyJoint *t = luax_checkpulleyjoint(L, 1);\n\tlua_pushnumber(L, t->getLengthB());\n\treturn 1;\n}\n\nint w_PulleyJoint_getRatio(lua_State *L)\n{\n\tPulleyJoint *t = luax_checkpulleyjoint(L, 1);\n\tlua_pushnumber(L, t->getRatio());\n\treturn 1;\n}\n\nstatic const luaL_Reg w_PulleyJoint_functions[] =\n{\n\t{ \"getGroundAnchors\", w_PulleyJoint_getGroundAnchors },\n\t{ \"getLengthA\", w_PulleyJoint_getLengthA },\n\t{ \"getLengthB\", w_PulleyJoint_getLengthB },\n\t{ \"getRatio\", w_PulleyJoint_getRatio },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_pulleyjoint(lua_State *L)\n{\n\treturn luax_register_type(L, &PulleyJoint::type, w_Joint_functions, w_PulleyJoint_functions, nullptr);\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_PulleyJoint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WRAP_PULLEY_JOINT_H\n#define LOVE_PHYSICS_BOX2D_WRAP_PULLEY_JOINT_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"wrap_Joint.h\"\n#include \"PulleyJoint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nPulleyJoint *luax_checkpulleyjoint(lua_State *L, int idx);\nextern \"C\" int luaopen_pulleyjoint(lua_State *L);\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WRAP_PULLEY_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_RevoluteJoint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_RevoluteJoint.h\"\n#include \"wrap_Physics.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nRevoluteJoint *luax_checkrevolutejoint(lua_State *L, int idx)\n{\n\tRevoluteJoint *j = luax_checktype<RevoluteJoint>(L, idx);\n\tif (!j->isValid())\n\t\tluaL_error(L, \"Attempt to use destroyed joint.\");\n\treturn j;\n}\n\nint w_RevoluteJoint_getJointAngle(lua_State *L)\n{\n\tRevoluteJoint *t = luax_checkrevolutejoint(L, 1);\n\tlua_pushnumber(L, t->getJointAngle());\n\treturn 1;\n}\n\nint w_RevoluteJoint_getJointSpeed(lua_State *L)\n{\n\tRevoluteJoint *t = luax_checkrevolutejoint(L, 1);\n\tlua_pushnumber(L, t->getJointSpeed());\n\treturn 1;\n}\n\nint w_RevoluteJoint_setMotorEnabled(lua_State *L)\n{\n\tRevoluteJoint *t = luax_checkrevolutejoint(L, 1);\n\tbool arg1 = luax_checkboolean(L, 2);\n\tt->setMotorEnabled(arg1);\n\treturn 0;\n}\n\nint w_RevoluteJoint_isMotorEnabled(lua_State *L)\n{\n\tRevoluteJoint *t = luax_checkrevolutejoint(L, 1);\n\tluax_pushboolean(L, t->isMotorEnabled());\n\treturn 1;\n}\n\nint w_RevoluteJoint_setMaxMotorTorque(lua_State *L)\n{\n\tRevoluteJoint *t = luax_checkrevolutejoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tt->setMaxMotorTorque(arg1);\n\treturn 0;\n}\n\nint w_RevoluteJoint_setMotorSpeed(lua_State *L)\n{\n\tRevoluteJoint *t = luax_checkrevolutejoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tt->setMotorSpeed(arg1);\n\treturn 0;\n}\n\nint w_RevoluteJoint_getMotorSpeed(lua_State *L)\n{\n\tRevoluteJoint *t = luax_checkrevolutejoint(L, 1);\n\tlua_pushnumber(L, t->getMotorSpeed());\n\treturn 1;\n}\n\nint w_RevoluteJoint_getMotorTorque(lua_State *L)\n{\n\tRevoluteJoint *t = luax_checkrevolutejoint(L, 1);\n\tfloat dt = (float)luaL_checknumber(L, 2);\n\tlua_pushnumber(L, t->getMotorTorque(dt));\n\treturn 1;\n}\n\nint w_RevoluteJoint_getMaxMotorTorque(lua_State *L)\n{\n\tRevoluteJoint *t = luax_checkrevolutejoint(L, 1);\n\tlua_pushnumber(L, t->getMaxMotorTorque());\n\treturn 1;\n}\n\nint w_RevoluteJoint_setLimitsEnabled(lua_State *L)\n{\n\tRevoluteJoint *t = luax_checkrevolutejoint(L, 1);\n\tbool arg1 = luax_checkboolean(L, 2);\n\tt->setLimitsEnabled(arg1);\n\treturn 0;\n}\n\nint w_RevoluteJoint_areLimitsEnabled(lua_State *L)\n{\n\tRevoluteJoint *t = luax_checkrevolutejoint(L, 1);\n\tluax_pushboolean(L, t->areLimitsEnabled());\n\treturn 1;\n}\n\nint w_RevoluteJoint_setUpperLimit(lua_State *L)\n{\n\tRevoluteJoint *t = luax_checkrevolutejoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tluax_catchexcept(L, [&](){ t->setUpperLimit(arg1); });\n\treturn 0;\n}\n\nint w_RevoluteJoint_setLowerLimit(lua_State *L)\n{\n\tRevoluteJoint *t = luax_checkrevolutejoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tluax_catchexcept(L, [&](){ t->setLowerLimit(arg1); });\n\treturn 0;\n}\n\nint w_RevoluteJoint_setLimits(lua_State *L)\n{\n\tRevoluteJoint *t = luax_checkrevolutejoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tfloat arg2 = (float)luaL_checknumber(L, 3);\n\tluax_catchexcept(L, [&](){ t->setLimits(arg1, arg2); });\n\treturn 0;\n}\n\nint w_RevoluteJoint_getLowerLimit(lua_State *L)\n{\n\tRevoluteJoint *t = luax_checkrevolutejoint(L, 1);\n\tlua_pushnumber(L, t->getLowerLimit());\n\treturn 1;\n}\n\nint w_RevoluteJoint_getUpperLimit(lua_State *L)\n{\n\tRevoluteJoint *t = luax_checkrevolutejoint(L, 1);\n\tlua_pushnumber(L, t->getUpperLimit());\n\treturn 1;\n}\n\nint w_RevoluteJoint_getLimits(lua_State *L)\n{\n\tRevoluteJoint *t = luax_checkrevolutejoint(L, 1);\n\tlua_remove(L, 1);\n\treturn t->getLimits(L);\n}\n\nint w_RevoluteJoint_getReferenceAngle(lua_State *L)\n{\n\tRevoluteJoint *t = luax_checkrevolutejoint(L, 1);\n\tlua_pushnumber(L, t->getReferenceAngle());\n\treturn 1;\n}\n\nstatic const luaL_Reg w_RevoluteJoint_functions[] =\n{\n\t{ \"getJointAngle\", w_RevoluteJoint_getJointAngle },\n\t{ \"getJointSpeed\", w_RevoluteJoint_getJointSpeed },\n\t{ \"setMotorEnabled\", w_RevoluteJoint_setMotorEnabled },\n\t{ \"isMotorEnabled\", w_RevoluteJoint_isMotorEnabled },\n\t{ \"setMaxMotorTorque\", w_RevoluteJoint_setMaxMotorTorque },\n\t{ \"setMotorSpeed\", w_RevoluteJoint_setMotorSpeed },\n\t{ \"getMotorSpeed\", w_RevoluteJoint_getMotorSpeed },\n\t{ \"getMotorTorque\", w_RevoluteJoint_getMotorTorque },\n\t{ \"getMaxMotorTorque\", w_RevoluteJoint_getMaxMotorTorque },\n\t{ \"setLimitsEnabled\", w_RevoluteJoint_setLimitsEnabled },\n\t{ \"areLimitsEnabled\", w_RevoluteJoint_areLimitsEnabled },\n\t{ \"setUpperLimit\", w_RevoluteJoint_setUpperLimit },\n\t{ \"setLowerLimit\", w_RevoluteJoint_setLowerLimit },\n\t{ \"setLimits\", w_RevoluteJoint_setLimits },\n\t{ \"getLowerLimit\", w_RevoluteJoint_getLowerLimit },\n\t{ \"getUpperLimit\", w_RevoluteJoint_getUpperLimit },\n\t{ \"getLimits\", w_RevoluteJoint_getLimits },\n\t{ \"getReferenceAngle\", w_RevoluteJoint_getReferenceAngle },\n\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_revolutejoint(lua_State *L)\n{\n\treturn luax_register_type(L, &RevoluteJoint::type, w_Joint_functions, w_RevoluteJoint_functions, nullptr);\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_RevoluteJoint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WRAP_REVOLUTE_JOINT_H\n#define LOVE_PHYSICS_BOX2D_WRAP_REVOLUTE_JOINT_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"wrap_Joint.h\"\n#include \"RevoluteJoint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nRevoluteJoint *luax_checkrevolutejoint(lua_State *L, int idx);\nextern \"C\" int luaopen_revolutejoint(lua_State *L);\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WRAP_REVOLUTE_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_RopeJoint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_RopeJoint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nRopeJoint *luax_checkropejoint(lua_State *L, int idx)\n{\n\tRopeJoint *j = luax_checktype<RopeJoint>(L, idx);\n\tif (!j->isValid())\n\t\tluaL_error(L, \"Attempt to use destroyed joint.\");\n\treturn j;\n}\n\nint w_RopeJoint_getMaxLength(lua_State *L)\n{\n\tRopeJoint *t = luax_checkropejoint(L, 1);\n\tlua_pushnumber(L, t->getMaxLength());\n\treturn 1;\n}\n\nint w_RopeJoint_setMaxLength(lua_State *L)\n{\n\tRopeJoint *t = luax_checkropejoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tt->setMaxLength(arg1);\n\treturn 0;\n}\n\t\nstatic const luaL_Reg w_RopeJoint_functions[] =\n{\n\t{ \"getMaxLength\", w_RopeJoint_getMaxLength },\n\t{ \"setMaxLength\", w_RopeJoint_setMaxLength },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_ropejoint(lua_State *L)\n{\n\treturn luax_register_type(L, &RopeJoint::type, w_Joint_functions, w_RopeJoint_functions, nullptr);\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_RopeJoint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WRAP_ROPE_JOINT_H\n#define LOVE_PHYSICS_BOX2D_WRAP_ROPE_JOINT_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"wrap_Joint.h\"\n#include \"RopeJoint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nRopeJoint *luax_checkropejoint(lua_State *L, int idx);\nextern \"C\" int luaopen_ropejoint(lua_State *L);\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WRAP_ROPE_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_Shape.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_Shape.h\"\n#include \"common/StringMap.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nShape *luax_checkshape(lua_State *L, int idx)\n{\n\treturn luax_checktype<Shape>(L, idx);\n}\n\nvoid luax_pushshape(lua_State *L, Shape *shape)\n{\n\tif (shape != nullptr)\n\t{\n\t\tswitch (shape->getType())\n\t\t{\n\t\tcase Shape::SHAPE_CIRCLE:\n\t\t\tluax_pushtype(L, (CircleShape *) shape);\n\t\t\tbreak;\n\t\tcase Shape::SHAPE_POLYGON:\n\t\t\tluax_pushtype(L, (PolygonShape *) shape);\n\t\t\tbreak;\n\t\tcase Shape::SHAPE_EDGE:\n\t\t\tluax_pushtype(L, (EdgeShape *) shape);\n\t\t\tbreak;\n\t\tcase Shape::SHAPE_CHAIN:\n\t\t\tluax_pushtype(L, (ChainShape *) shape);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tluax_pushtype(L, shape);\n\t\t\tbreak;\n\t\t}\n\t}\n\telse\n\t{\n\t\tlua_pushnil(L);\n\t}\n}\n\nint w_Shape_getType(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tconst char *type = \"\";\n\tShape::getConstant(t->getType(), type);\n\tlua_pushstring(L, type);\n\treturn 1;\n}\n\nint w_Shape_getRadius(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tfloat radius = 0;\n\tluax_catchexcept(L, [&]() { radius = t->getRadius(); });\n\tlua_pushnumber(L, radius);\n\treturn 1;\n}\n\nint w_Shape_getChildCount(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tint childCount = 0;\n\tluax_catchexcept(L, [&]() { childCount = t->getChildCount(); });\n\tlua_pushinteger(L, childCount);\n\treturn 1;\n}\n\nint w_Shape_setFriction(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tluax_catchexcept(L, [&]() { t->setFriction(arg1); });\n\treturn 0;\n}\n\nint w_Shape_setRestitution(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tluax_catchexcept(L, [&]() { t->setRestitution(arg1); });\n\treturn 0;\n}\n\nint w_Shape_setDensity(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tluax_catchexcept(L, [&](){ t->setDensity(arg1); });\n\treturn 0;\n}\n\nint w_Shape_setSensor(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tbool arg1 = luax_checkboolean(L, 2);\n\tluax_catchexcept(L, [&]() { t->setSensor(arg1); });\n\treturn 0;\n}\n\nint w_Shape_getFriction(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tfloat friction = 0;\n\tluax_catchexcept(L, [&]() { friction = t->getFriction(); });\n\tlua_pushnumber(L, friction);\n\treturn 1;\n}\n\nint w_Shape_getRestitution(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tfloat r = 0;\n\tluax_catchexcept(L, [&]() { r = t->getRestitution(); });\n\tlua_pushnumber(L, r);\n\treturn 1;\n}\n\nint w_Shape_getDensity(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tfloat d = 0;\n\tluax_catchexcept(L, [&]() { d = t->getDensity(); });\n\tlua_pushnumber(L, d);\n\treturn 1;\n}\n\nint w_Shape_isSensor(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tbool sensor = false;\n\tluax_catchexcept(L, [&]() { sensor = t->isSensor(); });\n\tluax_pushboolean(L, sensor);\n\treturn 1;\n}\n\nint w_Shape_getBody(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tBody *body = t->getBody();\n\tif (body == nullptr)\n\t\treturn 0;\n\tluax_pushtype(L, body);\n\treturn 1;\n}\n\nint w_Shape_getShape(lua_State *L)\n{\n\tluax_markdeprecated(L, 1, \"Fixture:getShape\", API_METHOD, DEPRECATED_NO_REPLACEMENT, nullptr);\n\tShape *t = luax_checkshape(L, 1);\n\tluax_pushshape(L, t);\n\treturn 1;\n}\n\nint w_Shape_testPoint(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tfloat x = (float)luaL_checknumber(L, 2);\n\tfloat y = (float)luaL_checknumber(L, 3);\n\tbool result = false;\n\tif (!lua_isnoneornil(L, 4))\n\t{\n\t\tfloat r = (float)luaL_checknumber(L, 4);\n\t\tfloat px = (float)luaL_checknumber(L, 5);\n\t\tfloat py = (float)luaL_checknumber(L, 6);\n\t\tluax_catchexcept(L, [&]() { result = t->testPoint(x, y, r, px, py); });\n\t}\n\telse\n\t{\n\t\tluax_catchexcept(L, [&]() { result = t->testPoint(x, y); });\n\t}\n\tlua_pushboolean(L, result);\n\treturn 1;\n}\n\nint w_Shape_rayCast(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tlua_remove(L, 1);\n\tint ret = 0;\n\tluax_catchexcept(L, [&](){ ret = t->rayCast(L); });\n\treturn ret;\n}\n\nint w_Shape_computeAABB(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tlua_remove(L, 1);\n\tint ret = 0;\n\tluax_catchexcept(L, [&]() { ret = t->computeAABB(L); });\n\treturn ret;\n}\n\nint w_Shape_computeMass(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tlua_remove(L, 1);\n\tint ret = 0;\n\tluax_catchexcept(L, [&]() { ret = t->computeMass(L); });\n\treturn ret;\n}\n\nint w_Shape_setFilterData(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tint v[3];\n\tv[0] = (int) luaL_checkinteger(L, 2);\n\tv[1] = (int) luaL_checkinteger(L, 3);\n\tv[2] = (int) luaL_checkinteger(L, 4);\n\tluax_catchexcept(L, [&]() { t->setFilterData(v); });\n\treturn 0;\n}\n\nint w_Shape_getFilterData(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tint v[3];\n\tluax_catchexcept(L, [&]() { t->getFilterData(v); });\n\tlua_pushinteger(L, v[0]);\n\tlua_pushinteger(L, v[1]);\n\tlua_pushinteger(L, v[2]);\n\treturn 3;\n}\n\nint w_Shape_setCategory(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tlua_remove(L, 1);\n\tint ret = 0;\n\tluax_catchexcept(L, [&]() { ret = t->setCategory(L); });\n\treturn ret;\n}\n\nint w_Shape_getCategory(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tlua_remove(L, 1);\n\tint ret = 0;\n\tluax_catchexcept(L, [&]() { ret = t->getCategory(L); });\n\treturn ret;\n}\n\nint w_Shape_setMask(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tlua_remove(L, 1);\n\tint ret = 0;\n\tluax_catchexcept(L, [&]() { ret = t->setMask(L); });\n\treturn ret;\n}\n\nint w_Shape_getMask(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tlua_remove(L, 1);\n\tint ret = 0;\n\tluax_catchexcept(L, [&]() { ret = t->getMask(L); });\n\treturn ret;\n}\n\nint w_Shape_setUserData(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tlua_remove(L, 1);\n\tint ret = 0;\n\tluax_catchexcept(L, [&]() { ret = t->setUserData(L); });\n\treturn ret;\n}\n\nint w_Shape_getUserData(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tlua_remove(L, 1);\n\tint ret = 0;\n\tluax_catchexcept(L, [&]() { ret = t->getUserData(L); });\n\treturn ret;\n}\n\nint w_Shape_getBoundingBox(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tlua_remove(L, 1);\n\tint ret = 0;\n\tluax_catchexcept(L, [&]() { ret = t->getBoundingBox(L); });\n\treturn ret;\n}\n\nint w_Shape_getMassData(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tlua_remove(L, 1);\n\tint ret = 0;\n\tluax_catchexcept(L, [&]() { ret = t->getMassData(L); });\n\treturn ret;\n}\n\nint w_Shape_getGroupIndex(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tint i = 0;\n\tluax_catchexcept(L, [&]() { i = t->getGroupIndex(); });\n\tlua_pushinteger(L, i);\n\treturn 1;\n}\n\nint w_Shape_setGroupIndex(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tint i = (int) luaL_checkinteger(L, 2);\n\tluax_catchexcept(L, [&]() { t->setGroupIndex(i); });\n\treturn 0;\n}\n\nint w_Shape_destroy(lua_State *L)\n{\n\tShape *t = luax_checkshape(L, 1);\n\tluax_catchexcept(L, [&](){ t->destroy(); });\n\treturn 0;\n}\n\nint w_Shape_isDestroyed(lua_State *L)\n{\n\tShape *f = luax_checktype<Shape>(L, 1);\n\tluax_pushboolean(L, !f->isValid());\n\treturn 1;\n}\n\nconst luaL_Reg w_Shape_functions[] =\n{\n\t{ \"getType\", w_Shape_getType },\n\t{ \"getRadius\", w_Shape_getRadius },\n\t{ \"getChildCount\", w_Shape_getChildCount },\n\t{ \"setFriction\", w_Shape_setFriction },\n\t{ \"setRestitution\", w_Shape_setRestitution },\n\t{ \"setDensity\", w_Shape_setDensity },\n\t{ \"setSensor\", w_Shape_setSensor },\n\t{ \"getFriction\", w_Shape_getFriction },\n\t{ \"getRestitution\", w_Shape_getRestitution },\n\t{ \"getDensity\", w_Shape_getDensity },\n\t{ \"getBody\", w_Shape_getBody },\n\t{ \"getShape\", w_Shape_getShape },\n\t{ \"isSensor\", w_Shape_isSensor },\n\t{ \"testPoint\", w_Shape_testPoint },\n\t{ \"rayCast\", w_Shape_rayCast },\n\t{ \"computeAABB\", w_Shape_computeAABB },\n\t{ \"computeMass\", w_Shape_computeMass },\n\t{ \"setFilterData\", w_Shape_setFilterData },\n\t{ \"getFilterData\", w_Shape_getFilterData },\n\t{ \"setCategory\", w_Shape_setCategory },\n\t{ \"getCategory\", w_Shape_getCategory },\n\t{ \"setMask\", w_Shape_setMask },\n\t{ \"getMask\", w_Shape_getMask },\n\t{ \"setUserData\", w_Shape_setUserData },\n\t{ \"getUserData\", w_Shape_getUserData },\n\t{ \"getBoundingBox\", w_Shape_getBoundingBox },\n\t{ \"getMassData\", w_Shape_getMassData },\n\t{ \"getGroupIndex\", w_Shape_getGroupIndex },\n\t{ \"setGroupIndex\", w_Shape_setGroupIndex },\n\t{ \"destroy\", w_Shape_destroy },\n\t{ \"isDestroyed\", w_Shape_isDestroyed },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_shape(lua_State *L)\n{\n\treturn luax_register_type(L, &Shape::type, w_Shape_functions, nullptr);\n}\n\n} // box2d\n} // physics\n} // love\n\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_Shape.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WRAP_SHAPE_H\n#define LOVE_PHYSICS_BOX2D_WRAP_SHAPE_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"Shape.h\"\n#include \"wrap_Physics.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nShape *luax_checkshape(lua_State *L, int idx);\nvoid luax_pushshape(lua_State *L, Shape *shape);\nextern \"C\" int luaopen_shape(lua_State *L);\n\nextern const luaL_Reg w_Shape_functions[];\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WRAP_SHAPE_H\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_WeldJoint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_WeldJoint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nWeldJoint *luax_checkweldjoint(lua_State *L, int idx)\n{\n\tWeldJoint *j = luax_checktype<WeldJoint>(L, idx);\n\tif (!j->isValid())\n\t\tluaL_error(L, \"Attempt to use destroyed joint.\");\n\treturn j;\n}\n\nint w_WeldJoint_setStiffness(lua_State *L)\n{\n\tWeldJoint *t = luax_checkweldjoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tt->setStiffness(arg1);\n\treturn 0;\n}\n\nint w_WeldJoint_getStiffness(lua_State *L)\n{\n\tWeldJoint *t = luax_checkweldjoint(L, 1);\n\tlua_pushnumber(L, t->getStiffness());\n\treturn 1;\n}\n\nint w_WeldJoint_setDamping(lua_State *L)\n{\n\tWeldJoint *t = luax_checkweldjoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tt->setDamping(arg1);\n\treturn 0;\n}\n\nint w_WeldJoint_getDamping(lua_State *L)\n{\n\tWeldJoint *t = luax_checkweldjoint(L, 1);\n\tlua_pushnumber(L, t->getDamping());\n\treturn 1;\n}\n\nint w_WeldJoint_getReferenceAngle(lua_State *L)\n{\n\tWeldJoint *t = luax_checkweldjoint(L, 1);\n\tlua_pushnumber(L, t->getReferenceAngle());\n\treturn 1;\n}\n\nstatic const luaL_Reg w_WeldJoint_functions[] =\n{\n\t{ \"setStiffness\", w_WeldJoint_setStiffness },\n\t{ \"getStiffness\", w_WeldJoint_getStiffness },\n\t{ \"setDamping\", w_WeldJoint_setDamping },\n\t{ \"getDamping\", w_WeldJoint_getDamping },\n\t{ \"getReferenceAngle\", w_WeldJoint_getReferenceAngle },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_weldjoint(lua_State *L)\n{\n\treturn luax_register_type(L, &WeldJoint::type, w_Joint_functions, w_WeldJoint_functions, nullptr);\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_WeldJoint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WRAP_WELD_JOINT_H\n#define LOVE_PHYSICS_BOX2D_WRAP_WELD_JOINT_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"wrap_Joint.h\"\n#include \"WeldJoint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nWeldJoint *luax_checkweldjoint(lua_State *L, int idx);\nextern \"C\" int luaopen_weldjoint(lua_State *L);\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WRAP_WELD_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_WheelJoint.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_WheelJoint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nWheelJoint *luax_checkwheeljoint(lua_State *L, int idx)\n{\n\tWheelJoint *j = luax_checktype<WheelJoint>(L, idx);\n\tif (!j->isValid())\n\t\tluaL_error(L, \"Attempt to use destroyed joint.\");\n\treturn j;\n}\n\nint w_WheelJoint_getJointTranslation(lua_State *L)\n{\n\tWheelJoint *t = luax_checkwheeljoint(L, 1);\n\tlua_pushnumber(L, t->getJointTranslation());\n\treturn 1;\n}\n\nint w_WheelJoint_getJointSpeed(lua_State *L)\n{\n\tWheelJoint *t = luax_checkwheeljoint(L, 1);\n\tlua_pushnumber(L, t->getJointSpeed());\n\treturn 1;\n}\n\nint w_WheelJoint_setMotorEnabled(lua_State *L)\n{\n\tWheelJoint *t = luax_checkwheeljoint(L, 1);\n\tbool arg1 = luax_checkboolean(L, 2);\n\tt->setMotorEnabled(arg1);\n\treturn 0;\n}\n\nint w_WheelJoint_isMotorEnabled(lua_State *L)\n{\n\tWheelJoint *t = luax_checkwheeljoint(L, 1);\n\tluax_pushboolean(L, t->isMotorEnabled());\n\treturn 1;\n}\n\nint w_WheelJoint_setMotorSpeed(lua_State *L)\n{\n\tWheelJoint *t = luax_checkwheeljoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tt->setMotorSpeed(arg1);\n\treturn 0;\n}\n\nint w_WheelJoint_getMotorSpeed(lua_State *L)\n{\n\tWheelJoint *t = luax_checkwheeljoint(L, 1);\n\tlua_pushnumber(L, t->getMotorSpeed());\n\treturn 1;\n}\n\nint w_WheelJoint_setMaxMotorTorque(lua_State *L)\n{\n\tWheelJoint *t = luax_checkwheeljoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tt->setMaxMotorTorque(arg1);\n\treturn 0;\n}\n\nint w_WheelJoint_getMaxMotorTorque(lua_State *L)\n{\n\tWheelJoint *t = luax_checkwheeljoint(L, 1);\n\tlua_pushnumber(L, t->getMaxMotorTorque());\n\treturn 1;\n}\n\nint w_WheelJoint_getMotorTorque(lua_State *L)\n{\n\tWheelJoint *t = luax_checkwheeljoint(L, 1);\n\tfloat dt = (float)luaL_checknumber(L, 2);\n\tlua_pushnumber(L, t->getMotorTorque(dt));\n\treturn 1;\n}\n\nint w_WheelJoint_setStiffness(lua_State *L)\n{\n\tWheelJoint *t = luax_checkwheeljoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tt->setStiffness(arg1);\n\treturn 0;\n}\n\nint w_WheelJoint_getStiffness(lua_State *L)\n{\n\tWheelJoint *t = luax_checkwheeljoint(L, 1);\n\tlua_pushnumber(L, t->getStiffness());\n\treturn 1;\n}\n\nint w_WheelJoint_setDamping(lua_State *L)\n{\n\tWheelJoint *t = luax_checkwheeljoint(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tt->setDamping(arg1);\n\treturn 0;\n}\n\nint w_WheelJoint_getDamping(lua_State *L)\n{\n\tWheelJoint *t = luax_checkwheeljoint(L, 1);\n\tlua_pushnumber(L, t->getDamping());\n\treturn 1;\n}\n\nint w_WheelJoint_getAxis(lua_State *L)\n{\n\tWheelJoint *t = luax_checkwheeljoint(L, 1);\n\tlua_remove(L, 1);\n\treturn t->getAxis(L);\n}\n\nstatic const luaL_Reg w_WheelJoint_functions[] =\n{\n\t{ \"getJointTranslation\", w_WheelJoint_getJointTranslation },\n\t{ \"getJointSpeed\", w_WheelJoint_getJointSpeed },\n\t{ \"setMotorEnabled\", w_WheelJoint_setMotorEnabled },\n\t{ \"isMotorEnabled\", w_WheelJoint_isMotorEnabled },\n\t{ \"setMotorSpeed\", w_WheelJoint_setMotorSpeed },\n\t{ \"getMotorSpeed\", w_WheelJoint_getMotorSpeed },\n\t{ \"setMaxMotorTorque\", w_WheelJoint_setMaxMotorTorque },\n\t{ \"getMaxMotorTorque\", w_WheelJoint_getMaxMotorTorque },\n\t{ \"getMotorTorque\", w_WheelJoint_getMotorTorque },\n\t{ \"setSpringStiffness\", w_WheelJoint_setStiffness },\n\t{ \"getSpringStiffness\", w_WheelJoint_getStiffness },\n\t{ \"setSpringDamping\", w_WheelJoint_setDamping },\n\t{ \"getSpringDamping\", w_WheelJoint_getDamping },\n\t{ \"setStiffness\", w_WheelJoint_setStiffness },\n\t{ \"getStiffness\", w_WheelJoint_getStiffness },\n\t{ \"setDamping\", w_WheelJoint_setDamping },\n\t{ \"getDamping\", w_WheelJoint_getDamping },\n\t{ \"getAxis\", w_WheelJoint_getAxis },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_wheeljoint(lua_State *L)\n{\n\treturn luax_register_type(L, &WheelJoint::type, w_Joint_functions, w_WheelJoint_functions, nullptr);\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_WheelJoint.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WRAP_WHEEL_JOINT_H\n#define LOVE_PHYSICS_BOX2D_WRAP_WHEEL_JOINT_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"wrap_Joint.h\"\n#include \"WheelJoint.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nWheelJoint *luax_checkwheeljoint(lua_State *L, int idx);\nextern \"C\" int luaopen_wheeljoint(lua_State *L);\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WRAP_WHEEL_JOINT_H\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_World.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_World.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nWorld *luax_checkworld(lua_State *L, int idx)\n{\n\tWorld *w = luax_checktype<World>(L, idx);\n\tif (!w->isValid())\n\t\tluaL_error(L, \"Attempt to use destroyed world.\");\n\treturn w;\n}\n\nint w_World_update(lua_State *L)\n{\n\tWorld *t = luax_checkworld(L, 1);\n\tfloat dt = (float)luaL_checknumber(L, 2);\n\n\t// Make sure the world callbacks are using the calling Lua thread.\n\tt->setCallbacksL(L);\n\n\tif (lua_isnoneornil(L, 3))\n\t\tluax_catchexcept(L, [&](){ t->update(dt); });\n\telse\n\t{\n\t\tint velocityiterations = (int) luaL_checkinteger(L, 3);\n\t\tint positioniterations = (int) luaL_checkinteger(L, 4);\n\t\tluax_catchexcept(L, [&](){ t->update(dt, velocityiterations, positioniterations); });\n\t}\n\n\treturn 0;\n}\n\nint w_World_setCallbacks(lua_State *L)\n{\n\tWorld *t = luax_checkworld(L, 1);\n\tlua_remove(L, 1);\n\treturn t->setCallbacks(L);\n}\n\nint w_World_getCallbacks(lua_State *L)\n{\n\tWorld *t = luax_checkworld(L, 1);\n\tlua_remove(L, 1);\n\treturn t->getCallbacks(L);\n}\n\nint w_World_setContactFilter(lua_State *L)\n{\n\tWorld *t = luax_checkworld(L, 1);\n\tlua_remove(L, 1);\n\treturn t->setContactFilter(L);\n}\n\nint w_World_getContactFilter(lua_State *L)\n{\n\tWorld *t = luax_checkworld(L, 1);\n\tlua_remove(L, 1);\n\treturn t->getContactFilter(L);\n}\n\nint w_World_setGravity(lua_State *L)\n{\n\tWorld *t = luax_checkworld(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tfloat arg2 = (float)luaL_checknumber(L, 3);\n\tt->setGravity(arg1, arg2);\n\treturn 0;\n}\n\nint w_World_getGravity(lua_State *L)\n{\n\tWorld *t = luax_checkworld(L, 1);\n\tlua_remove(L, 1);\n\treturn t->getGravity(L);\n}\n\nint w_World_translateOrigin(lua_State *L)\n{\n\tWorld *t = luax_checkworld(L, 1);\n\tfloat arg1 = (float)luaL_checknumber(L, 2);\n\tfloat arg2 = (float)luaL_checknumber(L, 3);\n\tluax_catchexcept(L, [&](){ t->translateOrigin(arg1, arg2); });\n\treturn 0;\n}\n\nint w_World_setSleepingAllowed(lua_State *L)\n{\n\tWorld *t = luax_checkworld(L, 1);\n\tbool b = luax_checkboolean(L, 2);\n\tt->setSleepingAllowed(b);\n\treturn 0;\n}\n\nint w_World_isSleepingAllowed(lua_State *L)\n{\n\tWorld *t = luax_checkworld(L, 1);\n\tluax_pushboolean(L, t->isSleepingAllowed());\n\treturn 1;\n}\n\nint w_World_isLocked(lua_State *L)\n{\n\tWorld *t = luax_checkworld(L, 1);\n\tluax_pushboolean(L, t->isLocked());\n\treturn 1;\n}\n\nint w_World_getBodyCount(lua_State *L)\n{\n\tWorld *t = luax_checkworld(L, 1);\n\tlua_pushinteger(L, t->getBodyCount());\n\treturn 1;\n}\n\nint w_World_getJointCount(lua_State *L)\n{\n\tWorld *t = luax_checkworld(L, 1);\n\tlua_pushinteger(L, t->getJointCount());\n\treturn 1;\n}\n\nint w_World_getContactCount(lua_State *L)\n{\n\tWorld *t = luax_checkworld(L, 1);\n\tlua_pushinteger(L, t->getContactCount());\n\treturn 1;\n}\n\nint w_World_getBodies(lua_State *L)\n{\n\tWorld *t = luax_checkworld(L, 1);\n\tlua_remove(L, 1);\n\tint ret = 0;\n\tluax_catchexcept(L, [&](){ ret = t->getBodies(L); });\n\treturn ret;\n}\n\nint w_World_getJoints(lua_State *L)\n{\n\tWorld *t = luax_checkworld(L, 1);\n\tlua_remove(L, 1);\n\tint ret = 0;\n\tluax_catchexcept(L, [&](){ ret = t->getJoints(L); });\n\treturn ret;\n}\n\nint w_World_getContacts(lua_State *L)\n{\n\tWorld *t = luax_checkworld(L, 1);\n\tlua_remove(L, 1);\n\tint ret = 0;\n\tluax_catchexcept(L, [&](){ ret = t->getContacts(L); });\n\treturn ret;\n}\n\nint w_World_queryShapesInArea(lua_State *L)\n{\n\tWorld *t = luax_checkworld(L, 1);\n\tlua_remove(L, 1);\n\treturn t->queryShapesInArea(L);\n}\n\nint w_World_queryBoundingBox(lua_State *L)\n{\n\tluax_markdeprecated(L, 1, \"World:queryBoundingBox\", API_METHOD, DEPRECATED_RENAMED, \"World:queryShapesInArea\");\n\treturn w_World_queryShapesInArea(L);\n}\n\nint w_World_getShapesInArea(lua_State *L)\n{\n\tWorld *t = luax_checkworld(L, 1);\n\tlua_remove(L, 1);\n\tint ret = 0;\n\tluax_catchexcept(L, [&](){ ret = t->getShapesInArea(L); });\n\treturn ret;\n}\n\nint w_World_rayCast(lua_State *L)\n{\n\tWorld *t = luax_checkworld(L, 1);\n\tlua_remove(L, 1);\n\tint ret = 0;\n\tluax_catchexcept(L, [&](){ ret = t->rayCast(L); });\n\treturn ret;\n}\n\nint w_World_rayCastAny(lua_State *L)\n{\n\tWorld *t = luax_checkworld(L, 1);\n\tlua_remove(L, 1);\n\tint ret = 0;\n\tluax_catchexcept(L, [&]() { ret = t->rayCastAny(L); });\n\treturn ret;\n}\n\nint w_World_rayCastClosest(lua_State *L)\n{\n\tWorld *t = luax_checkworld(L, 1);\n\tlua_remove(L, 1);\n\tint ret = 0;\n\tluax_catchexcept(L, [&]() { ret = t->rayCastClosest(L); });\n\treturn ret;\n}\n\nint w_World_destroy(lua_State *L)\n{\n\tWorld *t = luax_checkworld(L, 1);\n\tluax_catchexcept(L, [&](){ t->destroy(); });\n\treturn 0;\n}\n\nint w_World_isDestroyed(lua_State *L)\n{\n\tWorld *w = luax_checktype<World>(L, 1);\n\tluax_pushboolean(L, !w->isValid());\n\treturn 1;\n}\n\nstatic const luaL_Reg w_World_functions[] =\n{\n\t{ \"update\", w_World_update },\n\t{ \"setCallbacks\", w_World_setCallbacks },\n\t{ \"getCallbacks\", w_World_getCallbacks },\n\t{ \"setContactFilter\", w_World_setContactFilter },\n\t{ \"getContactFilter\", w_World_getContactFilter },\n\t{ \"setGravity\", w_World_setGravity },\n\t{ \"getGravity\", w_World_getGravity },\n\t{ \"translateOrigin\", w_World_translateOrigin },\n\t{ \"setSleepingAllowed\", w_World_setSleepingAllowed },\n\t{ \"isSleepingAllowed\", w_World_isSleepingAllowed },\n\t{ \"isLocked\", w_World_isLocked },\n\t{ \"getBodyCount\", w_World_getBodyCount },\n\t{ \"getJointCount\", w_World_getJointCount },\n\t{ \"getContactCount\", w_World_getContactCount },\n\t{ \"getBodies\", w_World_getBodies },\n\t{ \"getJoints\", w_World_getJoints },\n\t{ \"getContacts\", w_World_getContacts },\n\t{ \"queryShapesInArea\", w_World_queryShapesInArea },\n\t{ \"getShapesInArea\", w_World_getShapesInArea },\n\t{ \"rayCast\", w_World_rayCast },\n\t{ \"rayCastAny\", w_World_rayCastAny },\n\t{ \"rayCastClosest\", w_World_rayCastClosest },\n\t{ \"destroy\", w_World_destroy },\n\t{ \"isDestroyed\", w_World_isDestroyed },\n\n\t// Deprecated\n\t{ \"queryBoundingBox\", w_World_queryBoundingBox },\n\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_world(lua_State *L)\n{\n\treturn luax_register_type(L, &World::type, w_World_functions, nullptr);\n}\n\n} // box2d\n} // physics\n} // love\n"
  },
  {
    "path": "src/modules/physics/box2d/wrap_World.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_PHYSICS_BOX2D_WRAP_WORLD_H\n#define LOVE_PHYSICS_BOX2D_WRAP_WORLD_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"common/Exception.h\"\n#include \"World.h\"\n#include \"wrap_Physics.h\"\n\nnamespace love\n{\nnamespace physics\n{\nnamespace box2d\n{\n\nWorld *luax_checkworld(lua_State *L, int idx);\nextern \"C\" int luaopen_world(lua_State *L);\n\n} // box2d\n} // physics\n} // love\n\n#endif // LOVE_PHYSICS_BOX2D_WRAP_WORLD_H\n"
  },
  {
    "path": "src/modules/sensor/Sensor.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"Sensor.h\"\n\nnamespace love\n{\nnamespace sensor\n{\n\nSensor::Sensor(const char *name)\n\t: Module(M_SENSOR, name)\n{\n}\n\nSTRINGMAP_CLASS_BEGIN(Sensor, Sensor::SensorType, Sensor::SENSOR_MAX_ENUM, sensorType)\n{\n\t{ \"accelerometer\", Sensor::SENSOR_ACCELEROMETER },\n\t{ \"gyroscope\",     Sensor::SENSOR_GYROSCOPE     },\n}\nSTRINGMAP_CLASS_END(Sensor, Sensor::SensorType, Sensor::SENSOR_MAX_ENUM, sensorType)\n\n} // sensor\n} // love\n"
  },
  {
    "path": "src/modules/sensor/Sensor.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_SENSOR_H\n#define LOVE_SENSOR_H\n\n // LOVE\n#include \"common/Module.h\"\n#include \"common/StringMap.h\"\n\nnamespace love\n{\nnamespace sensor\n{\n\nclass Sensor: public Module\n{\npublic:\n\n\tenum SensorType\n\t{\n\t\tSENSOR_ACCELEROMETER,\n\t\tSENSOR_GYROSCOPE,\n\t\tSENSOR_MAX_ENUM\n\t};\n\n\tvirtual ~Sensor() {}\n\n\t/**\n\t * Check the availability of the sensor.\n\t **/\n\tvirtual bool hasSensor(SensorType type) = 0;\n\n\t/**\n\t * Check if the sensor is enabled.\n\t **/\n\tvirtual bool isEnabled(SensorType type) = 0;\n\n\t/**\n\t * Enable or disable a sensor.\n\t **/\n\tvirtual void setEnabled(SensorType type, bool enabled) = 0;\n\n\t/**\n\t * Get data from sensor.\n\t **/\n\tvirtual std::vector<float> getData(SensorType type) = 0;\n\n\t/**\n\t * Get backend-dependent handle of sensor.\n\t **/\n\tvirtual std::vector<void *> getHandles() = 0;\n\n\tvirtual const char *getSensorName(SensorType type) = 0;\n\n\tSTRINGMAP_CLASS_DECLARE(SensorType);\n\nprotected:\n\n\tSensor(const char *name);\n\n}; // Sensor\n\n} // sensor\n} // love\n\n#endif\n"
  },
  {
    "path": "src/modules/sensor/sdl/Sensor.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"Sensor.h\"\n\n// SDL\n#include <SDL3/SDL.h>\n#include <SDL3/SDL_sensor.h>\n\nnamespace love\n{\nnamespace sensor\n{\nnamespace sdl\n{\n\nSensor::Sensor()\n\t: love::sensor::Sensor(\"love.sensor.sdl\")\n\t, sensors()\n{\n\tif (!SDL_InitSubSystem(SDL_INIT_SENSOR))\n\t\tthrow love::Exception(\"Could not initialize SDL sensor subsystem (%s)\", SDL_GetError());\n}\n\nSensor::~Sensor()\n{\n\tSDL_QuitSubSystem(SDL_INIT_SENSOR);\n}\n\nbool Sensor::hasSensor(SensorType type)\n{\n\tint count = 0;\n\tSDL_SensorID *sensorIDs = SDL_GetSensors(&count);\n\tfor (int i = 0; i < count; i++)\n\t{\n\t\tif (convert(SDL_GetSensorTypeForID(sensorIDs[i])) == type)\n\t\t{\n\t\t\tSDL_free(sensorIDs);\n\t\t\treturn true;\n\t\t}\n\t}\n\tSDL_free(sensorIDs);\n\n\treturn false;\n}\n\nbool Sensor::isEnabled(SensorType type)\n{\n\treturn sensors[type]; // nullptr is default\n}\n\nvoid Sensor::setEnabled(SensorType type, bool enable)\n{\n\tif (sensors[type] && !enable)\n\t{\n\t\tSDL_CloseSensor(sensors[type]);\n\t\tsensors[type] = nullptr;\n\t}\n\telse if (sensors[type] == nullptr && enable)\n\t{\n\t\tint count = 0;\n\t\tSDL_SensorID *sensorIDs = SDL_GetSensors(&count);\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tif (convert(SDL_GetSensorTypeForID(sensorIDs[i])) == type)\n\t\t\t{\n\t\t\t\tSDL_Sensor *sensorHandle = SDL_OpenSensor(sensorIDs[i]);\n\n\t\t\t\tif (sensorHandle == nullptr)\n\t\t\t\t{\n\t\t\t\t\tSDL_free(sensorIDs);\n\n\t\t\t\t\tconst char *name = nullptr;\n\t\t\t\t\tgetConstant(type, name);\n\t\t\t\t\tthrow love::Exception(\"Could not open \\\"%s\\\" SDL sensor (%s)\", name, SDL_GetError());\n\t\t\t\t}\n\n\t\t\t\tsensors[type] = sensorHandle;\n\t\t\t}\n\t\t}\n\t\tSDL_free(sensorIDs);\n\t}\n}\n\nstd::vector<float> Sensor::getData(SensorType type)\n{\n\tif (sensors[type] == nullptr)\n\t{\n\t\tconst char *name = nullptr;\n\t\tgetConstant(type, name);\n\n\t\tthrow love::Exception(\"\\\"%s\\\" sensor is not enabled\", name);\n\t}\n\n\tstd::vector<float> values(3);\n\n\tif (!SDL_GetSensorData(sensors[type], values.data(), (int) values.size()))\n\t{\n\t\tconst char *name = nullptr;\n\t\tgetConstant(type, name);\n\n\t\tthrow love::Exception(\"Could not get \\\"%s\\\" SDL sensor data (%s)\", name, SDL_GetError());\n\t}\n\n\treturn values;\n}\n\nstd::vector<void*> Sensor::getHandles()\n{\n\tstd::vector<void*> nativeSensor;\n\n\tfor (std::pair<SensorType, SDL_Sensor*> data : sensors)\n\t{\n\t\tif (data.second)\n\t\t\tnativeSensor.push_back(data.second);\n\t}\n\n\treturn nativeSensor;\n}\n\nconst char *Sensor::getSensorName(SensorType type)\n{\n\tif (sensors[type] == nullptr)\n\t{\n\t\tconst char *name = nullptr;\n\t\tgetConstant(type, name);\n\n\t\tthrow love::Exception(\"\\\"%s\\\" sensor is not enabled\", name);\n\t}\n\n\treturn SDL_GetSensorName(sensors[type]);\n}\n\nSensor::SensorType Sensor::convert(SDL_SensorType type)\n{\n\tswitch (type)\n\t{\n\t\tcase SDL_SENSOR_ACCEL:\n\t\t\treturn SENSOR_ACCELEROMETER;\n\t\tcase SDL_SENSOR_GYRO:\n\t\t\treturn SENSOR_GYROSCOPE;\n\t\tdefault:\n\t\t\treturn SENSOR_MAX_ENUM;\n\t}\n}\n\nSDL_SensorType Sensor::convert(Sensor::SensorType type)\n{\n\tswitch (type)\n\t{\n\t\tcase SENSOR_ACCELEROMETER:\n\t\t\treturn SDL_SENSOR_ACCEL;\n\t\tcase SENSOR_GYROSCOPE:\n\t\t\treturn SDL_SENSOR_GYRO;\n\t\tdefault:\n\t\t\treturn SDL_SENSOR_UNKNOWN;\n\t}\n}\n\n}\n}\n}\n"
  },
  {
    "path": "src/modules/sensor/sdl/Sensor.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_SENSOR_SDL_SENSOR_H\n#define LOVE_SENSOR_SDL_SENSOR_H\n\n// LOVE\n#include \"sensor/Sensor.h\"\n\n// SDL\n#include <SDL3/SDL_sensor.h>\n\n// std\n#include <map>\n\nnamespace love\n{\nnamespace sensor\n{\nnamespace sdl\n{\n\nclass Sensor : public love::sensor::Sensor\n{\npublic:\n\tSensor();\n\t~Sensor() override;\n\n\tbool hasSensor(SensorType type) override;\n\tbool isEnabled(SensorType type) override;\n\tvoid setEnabled(SensorType type, bool enable) override;\n\tstd::vector<float> getData(SensorType type) override;\n\tstd::vector<void*> getHandles() override;\n\tconst char *getSensorName(SensorType type) override;\n\n\tstatic SensorType convert(SDL_SensorType type);\n\tstatic SDL_SensorType convert(SensorType type);\n\nprivate:\n\tstd::map<SensorType, SDL_Sensor*> sensors;\n\n}; // Sensor\n\n} // sdl\n} // sensor\n} // love\n\n#endif\n"
  },
  {
    "path": "src/modules/sensor/wrap_Sensor.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n // LOVE\n#include \"wrap_Sensor.h\"\n#include \"sdl/Sensor.h\"\n\nnamespace love\n{\nnamespace sensor\n{\n\n#define instance() (Module::getInstance<Sensor>(Module::M_SENSOR))\n\ninline Sensor::SensorType luax_checksensortype(lua_State *L, int i)\n{\n\tconst char *sensorType = luaL_checkstring(L, i);\n\tSensor::SensorType type = Sensor::SENSOR_MAX_ENUM;\n\n\tif (!Sensor::getConstant(sensorType, type))\n\t\tluax_enumerror(L, \"sensor mode\", Sensor::getConstants(type), sensorType);\n\n\treturn type;\n}\n\nstatic int w_hasSensor(lua_State *L)\n{\n\tSensor::SensorType type = luax_checksensortype(L, 1);\n\n\tlua_pushboolean(L, instance()->hasSensor(type));\n\treturn 1;\n}\n\nstatic int w_isEnabled(lua_State *L)\n{\n\tSensor::SensorType type = luax_checksensortype(L, 1);\n\n\tlua_pushboolean(L, instance()->isEnabled(type));\n\treturn 1;\n}\n\nstatic int w_setEnabled(lua_State *L)\n{\n\tSensor::SensorType type = luax_checksensortype(L, 1);\n\tbool enabled = luax_checkboolean(L, 2);\n\n\tluax_catchexcept(L, [&](){ instance()->setEnabled(type, enabled); });\n\treturn 0;\n}\n\nstatic int w_getData(lua_State *L)\n{\n\tSensor::SensorType type = luax_checksensortype(L, 1);\n\n\tstd::vector<float> data;\n\tluax_catchexcept(L, [&](){ data = instance()->getData(type); });\n\n\tfor (float f: data)\n\t\tlua_pushnumber(L, f);\n\n\treturn (int) data.size();\n}\n\nstatic int w_getName(lua_State *L)\n{\n\tSensor::SensorType type = luax_checksensortype(L, 1);\n\tconst char *name = nullptr;\n\n\tluax_catchexcept(L, [&](){ name = instance()->getSensorName(type); });\n\tlua_pushstring(L, name);\n\treturn 1;\n}\n\nstatic const luaL_Reg functions[] =\n{\n\t{ \"hasSensor\", w_hasSensor },\n\t{ \"isEnabled\", w_isEnabled },\n\t{ \"setEnabled\", w_setEnabled },\n\t{ \"getData\", w_getData },\n\t{ \"getName\", w_getName },\n\t{ nullptr, nullptr }\n};\n\nextern \"C\" int luaopen_love_sensor(lua_State * L)\n{\n\tSensor *instance = instance();\n\tif (instance == nullptr)\n\t\tluax_catchexcept(L, [&]() { instance = new love::sensor::sdl::Sensor(); });\n\telse\n\t\tinstance->retain();\n\n\tWrappedModule w;\n\tw.module = instance;\n\tw.name = \"sensor\";\n\tw.type = &Module::type;\n\tw.functions = functions;\n\tw.types = nullptr;\n\n\treturn luax_register_module(L, w);\n}\n\n} // sensor\n} // love\n"
  },
  {
    "path": "src/modules/sensor/wrap_Sensor.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_WRAP_SENSOR_H\n#define LOVE_WRAP_SENSOR_H\n\n // LOVE\n#include \"common/runtime.h\"\n\nnamespace love\n{\nnamespace sensor\n{\n\nextern \"C\" LOVE_EXPORT int luaopen_love_sensor(lua_State *L);\n\n} // sensor\n} // love\n\n#endif\n"
  },
  {
    "path": "src/modules/sound/Decoder.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Decoder.h\"\n\n#include \"common/Exception.h\"\n\nnamespace love\n{\nnamespace sound\n{\n\nlove::Type Decoder::type(\"Decoder\", &Object::type);\n\nDecoder::Decoder(Stream *stream, int bufferSize)\n\t: stream(stream)\n\t, bufferSize(bufferSize)\n\t, sampleRate(DEFAULT_SAMPLE_RATE)\n\t, buffer(0)\n\t, eof(false)\n{\n\tif (!stream->isReadable() || !stream->isSeekable())\n\t\tthrow love::Exception(\"Decoder input stream must be readable and seekable.\");\n\n\ttry\n\t{\n\t\tbuffer = new char[bufferSize];\n\t}\n\tcatch (std::exception &)\n\t{\n\t\tthrow love::Exception(\"Out of memory.\");\n\t}\n}\n\nDecoder::~Decoder()\n{\n\tif (buffer != 0)\n\t\tdelete [](char *) buffer;\n}\n\nvoid *Decoder::getBuffer() const\n{\n\treturn buffer;\n}\n\nint Decoder::getSize() const\n{\n\treturn bufferSize;\n}\n\nint Decoder::getSampleRate() const\n{\n\treturn sampleRate;\n}\n\nbool Decoder::isFinished()\n{\n\treturn eof;\n}\n\nSTRINGMAP_CLASS_BEGIN(Decoder, Decoder::StreamSource, Decoder::STREAM_MAX_ENUM, streamSource)\n{\n\t{ \"memory\", Decoder::STREAM_MEMORY },\n\t{ \"file\",   Decoder::STREAM_FILE   },\n}\nSTRINGMAP_CLASS_END(Decoder, Decoder::StreamSource, Decoder::STREAM_MAX_ENUM, streamSource)\n\n} // sound\n} // love\n"
  },
  {
    "path": "src/modules/sound/Decoder.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_SOUND_DECODER_H\n#define LOVE_SOUND_DECODER_H\n\n// LOVE\n#include \"common/Object.h\"\n#include \"common/Stream.h\"\n#include \"common/StringMap.h\"\n\n#include <string>\n\nnamespace love\n{\nnamespace sound\n{\n/**\n * Decoder objects are responsible for decoding audio files. They maintain\n * an interal buffer into which they write raw decoded audio data.\n **/\nclass Decoder : public Object\n{\npublic:\n\n\tenum StreamSource\n\t{\n\t\tSTREAM_MEMORY,\n\t\tSTREAM_FILE,\n\t\tSTREAM_MAX_ENUM\n\t};\n\n\tstatic love::Type type;\n\n\tDecoder(Stream *stream, int bufferSize);\n\tvirtual ~Decoder();\n\n\t/**\n\t * Indicates how many bytes of raw data should be generated at each\n\t * call to Decode.\n\t **/\n\tstatic const int DEFAULT_BUFFER_SIZE = 16384;\n\n\t/**\n\t * Indicates the quality of the sound.\n\t **/\n\tstatic const int DEFAULT_SAMPLE_RATE = 44100;\n\n\t/**\n\t * Default is stereo.\n\t **/\n\tstatic const int DEFAULT_CHANNELS = 2;\n\n\t/**\n\t * 16 bit audio is the default.\n\t **/\n\tstatic const int DEFAULT_BIT_DEPTH = 16;\n\n\t/**\n\t * Creates a deep of itself. The sound stream can (and should) be\n\t * rewound, and does not have to be at the same place.\n\t * @return A new Decoder object.\n\t **/\n\tvirtual Decoder *clone() = 0;\n\n\t/**\n\t * Decodes the next chunk of the music stream, this will usually be\n\t * bufferSize amount of bytes, unless EOF occurs. Zero or negative values\n\t * indicate EOF or errors.\n\t * @return The number of bytes actually decoded.\n\t **/\n\tvirtual int decode() = 0;\n\n\t/**\n\t * Gets the size of the buffer (NOT the size of the entire stream).\n\t * @return The size of the buffer.\n\t **/\n\tvirtual int getSize() const;\n\n\t/**\n\t * Gets a pointer to the actual data. The contents of this buffer will\n\t * change with each call to decode, so the client must copy the data.\n\t * @return A buffer to raw sound data.\n\t **/\n\tvirtual void *getBuffer() const;\n\n\t/**\n\t * Seeks to the specified position, if possible.\n\t * @param s The position in the stream in seconds.\n\t * @return True if success, false on fail/unsupported.\n\t **/\n\tvirtual bool seek(double s) = 0;\n\n\t/**\n\t * Rewinds the stream to the start.\n\t * @return True if success, false on fail/unsupported.\n\t **/\n\tvirtual bool rewind() = 0;\n\n\t/**\n\t * Checks whether a stream is seekable.\n\t * @return True if seekable, false otherwise.\n\t **/\n\tvirtual bool isSeekable() = 0;\n\n\t/**\n\t * Checks whether a stream has more data to decode or not. Use\n\t * rewind to start the stream again.\n\t * @return False if there is more data, true on EOF.\n\t **/\n\tvirtual bool isFinished();\n\n\t/**\n\t * Gets the number of channels in a stream. Supported values are 1 (mono) or 2 (stereo).\n\t * @return Either 1 for mono, 2 for stereo, or 0 on errors.\n\t **/\n\tvirtual int getChannelCount() const = 0;\n\n\t/**\n\t * Gets the number of bits per sample. Supported values are 8 or 16.\n\t * @return Either 8, 16, or 0 if unsupported.\n\t **/\n\tvirtual int getBitDepth() const = 0;\n\n\t/**\n\t * Gets the sample rate for the Decoder, that is, samples per second.\n\t * @return The sample rate, eg. 44100.\n\t **/\n\tvirtual int getSampleRate() const;\n\n\t/**\n\t * Gets the estimated total duration of the stream. in seconds. May return\n\t * -1 if the duration cannot be determined.\n\t **/\n\tvirtual double getDuration() = 0;\n\n\tSTRINGMAP_CLASS_DECLARE(StreamSource);\n\nprotected:\n\n\t// A readable stream containing the encoded data.\n\tStrongRef<Stream> stream;\n\n\t// When the decoder decodes data incrementally, it writes\n\t// this many bytes at a time (at most).\n\tint bufferSize;\n\n\t// The desired frequency of the samples. 44100, 22050, or 11025.\n\tint sampleRate;\n\n\t// Holds internal memory.\n\tvoid *buffer;\n\n\t// Set this to true when eof has been reached.\n\tbool eof;\n\n}; // Decoder\n\n} // sound\n} // love\n\n#endif // LOVE_SOUND_DECODER_H\n"
  },
  {
    "path": "src/modules/sound/Sound.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Sound.h\"\n\nnamespace love\n{\nnamespace sound\n{\n\nlove::Type Sound::type(\"Sound\", &Module::type);\n\nSound::Sound(const char *name)\n\t: Module(M_SOUND, name)\n{\n}\n\nSound::~Sound()\n{\n}\n\nSoundData *Sound::newSoundData(Decoder *decoder)\n{\n\treturn new SoundData(decoder);\n}\n\nSoundData *Sound::newSoundData(int samples, int sampleRate, int bitDepth, int channels)\n{\n\treturn new SoundData(samples, sampleRate, bitDepth, channels);\n}\n\nSoundData *Sound::newSoundData(void *data, int samples, int sampleRate, int bitDepth, int channels)\n{\n\treturn new SoundData(data, samples, sampleRate, bitDepth, channels);\n}\n\n} // sound\n} // love\n"
  },
  {
    "path": "src/modules/sound/Sound.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_SOUND_SOUND_H\n#define LOVE_SOUND_SOUND_H\n\n// LOVE\n#include \"common/Module.h\"\n#include \"common/Stream.h\"\n\n#include \"SoundData.h\"\n#include \"Decoder.h\"\n\nnamespace love\n{\nnamespace sound\n{\n\n/**\n * The Sound module is responsible for decoding sound data. It is\n * not responsible for playing it.\n **/\nclass Sound : public Module\n{\n\npublic:\n\n\tstatic love::Type type;\n\n\tvirtual ~Sound();\n\n\t/**\n\t * Creates new SoundData from a decoder. Fully expands the\n\t * encoded sound data into raw sound data. Not recommended\n\t * on large (long-duration) files.\n\t * @param decoder The file to decode the data from.\n\t * @return A SoundData object, or zero if the file type couldn't be handled.\n\t **/\n\tSoundData *newSoundData(Decoder *decoder);\n\n\t/**\n\t * Creates a new SoundData with the specified number of samples and format.\n\t * @param samples The number of samples.\n\t * @param sampleRate Number of samples per second.\n\t * @param bitDepth Bits per sample (8 or 16).\n\t * @param channels Either 1 for mono, or 2 for stereo.\n\t * @return A new SoundData object, or zero in case of errors.\n\t **/\n\tSoundData *newSoundData(int samples, int sampleRate, int bitDepth, int channels);\n\n\t/**\n\t * Creates a new SoundData with the specified number of samples and format\n\t * and loads data from specified buffer.\n\t * @param data Buffer to load data from.\n\t * @param samples The number of samples.\n\t * @param sampleRate Number of samples per second.\n\t * @param bitDepth Bits per sample (8 or 16).\n\t * @param channels Either 1 for mono, or 2 for stereo.\n\t * @return A new SoundData object, or zero in case of errors.\n\t **/\n\tSoundData *newSoundData(void *data, int samples, int sampleRate, int bitDepth, int channels);\n\n\t/**\n\t * Attempts to find a decoder for the encoded sound data in the\n\t * specified file.\n\t * @param stream The readable Stream with encoded sound data.\n\t * @param bufferSize The size of each decoded chunk.\n\t * @return A Decoder object on success, or zero if no decoder could be found.\n\t **/\n\tvirtual Decoder *newDecoder(Stream *stream, int bufferSize) = 0;\n\nprotected:\n\n\tSound(const char *name);\n\n}; // Sound\n\n} // sound\n} // love\n\n#endif // LOVE_SOUND_SOUND_H\n"
  },
  {
    "path": "src/modules/sound/SoundData.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"SoundData.h\"\n\n// C\n#include <cstdlib>\n#include <cstring>\n\n// C++\n#include <limits>\n#include <iostream>\n#include <vector>\n\nnamespace love\n{\nnamespace sound\n{\n\nlove::Type SoundData::type(\"SoundData\", &Data::type);\n\nSoundData::SoundData(Decoder *decoder)\n\t: data(0)\n\t, size(0)\n\t, sampleRate(Decoder::DEFAULT_SAMPLE_RATE)\n\t, bitDepth(0)\n\t, channels(0)\n{\n\tif (decoder->getBitDepth() != 8 && decoder->getBitDepth() != 16)\n\t\tthrow love::Exception(\"Invalid bit depth: %d\", decoder->getBitDepth());\n\n\tsize_t bufferSize = 524288; // 0x80000\n\tint decoded = decoder->decode();\n\n\twhile (decoded > 0)\n\t{\n\t\t// Expand or allocate buffer. Note that realloc may move\n\t\t// memory to other locations.\n\t\tif (!data || bufferSize < size + decoded)\n\t\t{\n\t\t\twhile (bufferSize < size + decoded)\n\t\t\t\tbufferSize <<= 1;\n\t\t\tdata = (uint8 *) realloc(data, bufferSize);\n\t\t}\n\n\t\tif (!data)\n\t\t\tthrow love::Exception(\"Not enough memory.\");\n\n\t\t// Copy memory into new part of memory.\n\t\tmemcpy(data + size, decoder->getBuffer(), decoded);\n\n\t\t// Overflow check.\n\t\tif (size > std::numeric_limits<size_t>::max() - decoded)\n\t\t{\n\t\t\tfree(data);\n\t\t\tthrow love::Exception(\"Not enough memory.\");\n\t\t}\n\n\t\t// Keep this up to date.\n\t\tsize += decoded;\n\n\t\tdecoded = decoder->decode();\n\t}\n\n\t// Shrink buffer if necessary.\n\tif (data && bufferSize > size)\n\t\tdata = (uint8 *) realloc(data, size);\n\n\tchannels = decoder->getChannelCount();\n\tbitDepth = decoder->getBitDepth();\n\tsampleRate = decoder->getSampleRate();\n}\n\nSoundData::SoundData(int samples, int sampleRate, int bitDepth, int channels)\n\t: data(0)\n\t, size(0)\n\t, sampleRate(0)\n\t, bitDepth(0)\n\t, channels(0)\n{\n\tload(samples, sampleRate, bitDepth, channels);\n}\n\nSoundData::SoundData(const void *d, int samples, int sampleRate, int bitDepth, int channels)\n\t: data(0)\n\t, size(0)\n\t, sampleRate(0)\n\t, bitDepth(0)\n\t, channels(0)\n{\n\tload(samples, sampleRate, bitDepth, channels, d);\n}\n\nSoundData::SoundData(const SoundData &c)\n\t: data(0)\n\t, size(0)\n\t, sampleRate(0)\n\t, bitDepth(0)\n\t, channels(0)\n{\n\tload(c.getSampleCount(), c.getSampleRate(), c.getBitDepth(), c.getChannelCount(), c.getData());\n}\n\nSoundData::~SoundData()\n{\n\tif (data != 0)\n\t\tfree(data);\n}\n\nSoundData *SoundData::clone() const\n{\n\treturn new SoundData(*this);\n}\n\nvoid SoundData::load(int samples, int sampleRate, int bitDepth, int channels, const void *newData)\n{\n\tif (samples <= 0)\n\t\tthrow love::Exception(\"Invalid sample count: %d\", samples);\n\n\tif (sampleRate <= 0)\n\t\tthrow love::Exception(\"Invalid sample rate: %d\", sampleRate);\n\n\tif (bitDepth != 8 && bitDepth != 16)\n\t\tthrow love::Exception(\"Invalid bit depth: %d\", bitDepth);\n\n\tif (channels <= 0)\n\t\tthrow love::Exception(\"Invalid channel count: %d\", channels);\n\n\tif (data != 0)\n\t{\n\t\tfree(data);\n\t\tdata = 0;\n\t}\n\n\tsize = samples * (bitDepth / 8) * channels;\n\tthis->sampleRate = sampleRate;\n\tthis->bitDepth = bitDepth;\n\tthis->channels = channels;\n\n\tdouble realsize = samples;\n\trealsize *= (bitDepth / 8) * channels;\n\tif (realsize > std::numeric_limits<size_t>::max())\n\t\tthrow love::Exception(\"Data is too big!\");\n\n\tdata = (uint8 *) malloc(size);\n\tif (!data)\n\t\tthrow love::Exception(\"Not enough memory.\");\n\n\tif (newData)\n\t\tmemcpy(data, newData, size);\n\telse\n\t\tmemset(data, bitDepth == 8 ? 128 : 0, size);\n}\n\nvoid *SoundData::getData() const\n{\n\treturn (void *)data;\n}\n\nsize_t SoundData::getSize() const\n{\n\treturn size;\n}\n\nint SoundData::getChannelCount() const\n{\n\treturn channels;\n}\n\nint SoundData::getBitDepth() const\n{\n\treturn bitDepth;\n}\n\nint SoundData::getSampleRate() const\n{\n\treturn sampleRate;\n}\n\nint SoundData::getSampleCount() const\n{\n\treturn (int) ((size/channels)/(bitDepth/8));\n}\n\nfloat SoundData::getDuration() const\n{\n\treturn float(size) / (channels*sampleRate*bitDepth/8);\n}\n\nvoid SoundData::setSample(int i, float sample)\n{\n\t// Check range.\n\tif (i < 0 || (size_t) i >= size/(bitDepth/8))\n\t\tthrow love::Exception(\"Attempt to set out-of-range sample!\");\n\n\tif (bitDepth == 16)\n\t{\n\t\t// 16-bit sample values are signed.\n\t\tint16 *s = (int16 *) data;\n\t\ts[i] = (int16) (sample * (float) LOVE_INT16_MAX);\n\t}\n\telse\n\t{\n\t\t// 8-bit sample values are unsigned internally.\n\t\tdata[i] = (uint8) ((sample * 127.0f) + 128.0f);\n\t}\n}\n\nvoid SoundData::setSample(int i, int channel, float sample)\n{\n\tif (channel < 1 || channel > channels)\n\t\tthrow love::Exception(\"Attempt to set sample from out-of-range channel!\");\n\n\treturn setSample(i * channels + (channel - 1), sample);\n}\n\nfloat SoundData::getSample(int i) const\n{\n\t// Check range.\n\tif (i < 0 || (size_t) i >= size/(bitDepth/8))\n\t\tthrow love::Exception(\"Attempt to get out-of-range sample!\");\n\n\tif (bitDepth == 16)\n\t{\n\t\t// 16-bit sample values are signed.\n\t\tint16 *s = (int16 *) data;\n\t\treturn (float) s[i] / (float) LOVE_INT16_MAX;\n\t}\n\telse\n\t{\n\t\t// 8-bit sample values are unsigned internally.\n\t\treturn ((float) data[i] - 128.0f) / 127.0f;\n\t}\n}\n\nfloat SoundData::getSample(int i, int channel) const\n{\n\tif (channel < 1 || channel > channels)\n\t\tthrow love::Exception(\"Attempt to get sample from out-of-range channel!\");\n\n\treturn getSample(i * channels + (channel - 1));\n}\n\nvoid SoundData::copyFrom(const SoundData *src, int srcStart, int count, int dstStart)\n{\n\tif (channels != src->channels)\n\t\tthrow love::Exception(\"Channel count mismatch!\");\n\n\tsize_t bytesPerSample = (size_t) channels * bitDepth/8;\n\tsize_t srcBytesPerSample = (size_t) src->channels * src->bitDepth/8;\n\t\n\t// Check range\n\tif (dstStart < 0 || (dstStart+count) * bytesPerSample > size)\n\t\tthrow love::Exception(\"Destination out-of-range!\");\n\tif (srcStart < 0 || (srcStart+count) * srcBytesPerSample > src->size)\n\t\tthrow love::Exception(\"Source out-of-range!\");\n\n\tif (bitDepth != src->bitDepth)\n\t{\n\t\t// Bit depth mismatch, use get/setSample at loop\n\t\tfor (int i = 0; i < count * channels; i++)\n\t\t\tsetSample(dstStart * channels + i, src->getSample(srcStart * channels + i));\n\t}\n\telse if (this->data == src->data)\n\t\t// May overlap, use memmove\n\t\tmemmove(data + dstStart * bytesPerSample, src->data + srcStart * bytesPerSample, count * bytesPerSample);\n\telse\n\t\tmemcpy(data + dstStart * bytesPerSample, src->data + srcStart * bytesPerSample, count * bytesPerSample);\n}\n\nSoundData *SoundData::slice(int start, int length) const\n{\n\tint totalSamples = getSampleCount();\n\n\tif (length == 0)\n\t\tthrow love::Exception(\"Invalid slice length: 0\");\n\telse if (length < 0)\n\t\tlength = totalSamples - start;\n\n\tif (start < 0 || start + length > totalSamples)\n\t\tthrow love::Exception(\"Attempt to slice at out-of-range position!\");\n\n\treturn new SoundData(data + start * channels * bitDepth/8, length, sampleRate, bitDepth, channels);\n}\n\n} // sound\n} // love\n"
  },
  {
    "path": "src/modules/sound/SoundData.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_SOUND_SOUND_DATA_H\n#define LOVE_SOUND_SOUND_DATA_H\n\n// LOVE\n#include \"filesystem/File.h\"\n#include \"common/int.h\"\n#include \"Decoder.h\"\n\nnamespace love\n{\nnamespace sound\n{\n\nclass SoundData : public love::Data\n{\npublic:\n\n\tstatic love::Type type;\n\n\tSoundData(Decoder *decoder);\n\tSoundData(int samples, int sampleRate, int bitDepth, int channels);\n\tSoundData(const void *d, int samples, int sampleRate, int bitDepth, int channels);\n\tSoundData(const SoundData &c);\n\n\tvirtual ~SoundData();\n\n\t// Implements Data.\n\tSoundData *clone() const;\n\tvoid *getData() const;\n\tsize_t getSize() const;\n\n\tvirtual int getChannelCount() const;\n\tvirtual int getBitDepth() const;\n\tvirtual int getSampleRate() const;\n\tvirtual int getSampleCount() const;\n\n\tvirtual float getDuration() const;\n\n\tvoid setSample(int i, float sample);\n\tvoid setSample(int i, int channel, float sample);\n\tfloat getSample(int i) const;\n\tfloat getSample(int i, int channel) const;\n\n\tvoid copyFrom(const SoundData *src, int srcStart, int count, int dstStart);\n\tSoundData *slice(int start, int length = -1) const;\n\nprivate:\n\n\tvoid load(int samples, int sampleRate, int bitDepth, int channels, const void *newData = 0);\n\n\tuint8 *data;\n\tsize_t size;\n\n\tint sampleRate;\n\tint bitDepth;\n\tint channels;\n\n}; // SoundData\n\n} // sound\n} // love\n\n#endif // LOVE_SOUND_SOUND_DATA_H\n"
  },
  {
    "path": "src/modules/sound/lullaby/CoreAudioDecoder.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifdef LOVE_SUPPORT_COREAUDIO\n\n// LOVE\n#include \"CoreAudioDecoder.h\"\n#include \"common/Exception.h\"\n\n// C++\n#include <vector>\n\nnamespace love\n{\nnamespace sound\n{\nnamespace lullaby\n{\n\n// Callbacks\nstatic OSStatus readFunc(void *inClientData, SInt64 inPosition, UInt32 requestCount, void *buffer, UInt32 *actualCount)\n{\n\tauto stream = (Stream *) inClientData;\n\tint64 readbytes = stream->read(buffer, requestCount);\n\n\t*actualCount = (UInt32) readbytes;\n\treturn readbytes > 0 ? noErr : kAudioFilePositionError;\n}\n\nstatic SInt64 getSizeFunc(void *inClientData)\n{\n\tauto stream = (Stream *) inClientData;\n\treturn stream->getSize();\n}\n\nCoreAudioDecoder::CoreAudioDecoder(Stream *stream, int bufferSize)\n\t: Decoder(stream, bufferSize)\n\t, audioFile(nullptr)\n\t, extAudioFile(nullptr)\n\t, inputInfo()\n\t, outputInfo()\n\t, duration(-2.0)\n{\n\ttry\n\t{\n\t\tOSStatus err = noErr;\n\n\t\t// Open the file represented by the Stream.\n\t\terr = AudioFileOpenWithCallbacks(stream, readFunc, nullptr, getSizeFunc, nullptr, kAudioFileMP3Type, &audioFile);\n\t\tif (err != noErr)\n\t\t\tthrow love::Exception(\"Could not open audio file for decoding with CoreAudio.\");\n\n\t\t// We want to use the Extended AudioFile API.\n\t\terr = ExtAudioFileWrapAudioFileID(audioFile, false, &extAudioFile);\n\n\t\tif (err != noErr)\n\t\t\tthrow love::Exception(\"Could not open audio file for decoding with CoreAudio.\");\n\n\t\t// Get the format of the audio data.\n\t\tUInt32 propertySize = sizeof(inputInfo);\n\t\terr = ExtAudioFileGetProperty(extAudioFile, kExtAudioFileProperty_FileDataFormat, &propertySize, &inputInfo);\n\n\t\tif (err != noErr)\n\t\t\tthrow love::Exception(\"Could not determine CoreAudio file format.\");\n\n\t\t// Set the output format to 16 bit signed integer (native-endian) data.\n\t\t// Keep the channel count and sample rate of the source format.\n\t\toutputInfo.mSampleRate = inputInfo.mSampleRate;\n\t\toutputInfo.mChannelsPerFrame = inputInfo.mChannelsPerFrame;\n\n\t\tint bytes = (inputInfo.mBitsPerChannel == 8) ? 1 : 2;\n\n\t\toutputInfo.mFormatID = kAudioFormatLinearPCM;\n\t\toutputInfo.mBitsPerChannel = bytes * 8;\n\t\toutputInfo.mBytesPerFrame = bytes * outputInfo.mChannelsPerFrame;\n\t\toutputInfo.mFramesPerPacket = 1;\n\t\toutputInfo.mBytesPerPacket = bytes * outputInfo.mChannelsPerFrame;\n\t\toutputInfo.mFormatFlags = kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked;\n\n\t\t// unsigned 8-bit or signed 16-bit integer PCM data.\n\t\tif (outputInfo.mBitsPerChannel == 16)\n\t\t\toutputInfo.mFormatFlags |= kAudioFormatFlagIsSignedInteger;\n\n\t\t// Set the desired output format.\n\t\tpropertySize = sizeof(outputInfo);\n\t\terr = ExtAudioFileSetProperty(extAudioFile, kExtAudioFileProperty_ClientDataFormat, propertySize, &outputInfo);\n\n\t\tif (err != noErr)\n\t\t\tthrow love::Exception(\"Could not set CoreAudio decoder properties.\");\n\t}\n\tcatch (love::Exception &)\n\t{\n\t\tcloseAudioFile();\n\t\tthrow;\n\t}\n\n\tsampleRate = (int) outputInfo.mSampleRate;\n}\n\nCoreAudioDecoder::~CoreAudioDecoder()\n{\n\tcloseAudioFile();\n}\n\nvoid CoreAudioDecoder::closeAudioFile()\n{\n\tif (extAudioFile != nullptr)\n\t\tExtAudioFileDispose(extAudioFile);\n\telse if (audioFile != nullptr)\n\t\tAudioFileClose(audioFile);\n\n\textAudioFile = nullptr;\n\taudioFile = nullptr;\n}\n\nlove::sound::Decoder *CoreAudioDecoder::clone()\n{\n\tStrongRef<Stream> s(stream->clone(), Acquire::NORETAIN);\n\treturn new CoreAudioDecoder(s, bufferSize);\n}\n\nint CoreAudioDecoder::decode()\n{\n\tint size = 0;\n\n\twhile (size < bufferSize)\n\t{\n\t\tAudioBufferList dataBuffer;\n\t\tdataBuffer.mNumberBuffers = 1;\n\t\tdataBuffer.mBuffers[0].mDataByteSize = bufferSize - size;\n\t\tdataBuffer.mBuffers[0].mData = (char *) buffer + size;\n\t\tdataBuffer.mBuffers[0].mNumberChannels = outputInfo.mChannelsPerFrame;\n\n\t\tUInt32 frames = (bufferSize - size) / outputInfo.mBytesPerFrame;\n\n\t\tif (ExtAudioFileRead(extAudioFile, &frames, &dataBuffer) != noErr)\n\t\t\treturn size;\n\n\t\tif (frames == 0)\n\t\t{\n\t\t\teof = true;\n\t\t\tbreak;\n\t\t}\n\n\t\tsize += frames * outputInfo.mBytesPerFrame;\n\t}\n\n\treturn size;\n}\n\nbool CoreAudioDecoder::seek(double s)\n{\n\tOSStatus err = ExtAudioFileSeek(extAudioFile, (SInt64) (s * inputInfo.mSampleRate));\n\n\tif (err == noErr)\n\t{\n\t\teof = false;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool CoreAudioDecoder::rewind()\n{\n\tOSStatus err = ExtAudioFileSeek(extAudioFile, 0);\n\n\tif (err == noErr)\n\t{\n\t\teof = false;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool CoreAudioDecoder::isSeekable()\n{\n\treturn true;\n}\n\nint CoreAudioDecoder::getChannelCount() const\n{\n\treturn outputInfo.mChannelsPerFrame;\n}\n\nint CoreAudioDecoder::getBitDepth() const\n{\n\treturn outputInfo.mBitsPerChannel;\n}\n\ndouble CoreAudioDecoder::getDuration()\n{\n\t// Only calculate the duration if we haven't done so already.\n\tif (duration == -2.0)\n\t{\n\t\tSInt64 samples = 0;\n\t\tUInt32 psize = (UInt32) sizeof(samples);\n\n\t\tOSStatus err = ExtAudioFileGetProperty(extAudioFile, kExtAudioFileProperty_FileLengthFrames, &psize, &samples);\n\n\t\tif (err == noErr)\n\t\t\tduration = (double) samples / (double) sampleRate;\n\t\telse\n\t\t\tduration = -1.0;\n\t}\n\n\treturn duration;\n}\n\n} // lullaby\n} // sound\n} // love\n\n#endif // LOVE_SUPPORT_COREAUDIO\n"
  },
  {
    "path": "src/modules/sound/lullaby/CoreAudioDecoder.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_SOUND_LULLABY_CORE_AUDIO_DECODER_H\n#define LOVE_SOUND_LULLABY_CORE_AUDIO_DECODER_H\n\n#include \"common/config.h\"\n\n#ifdef LOVE_SUPPORT_COREAUDIO\n\n// LOVE\n#include \"common/Stream.h\"\n#include \"sound/Decoder.h\"\n\n// Core Audio\n#include <AudioToolbox/AudioFormat.h>\n#include <AudioToolbox/ExtendedAudioFile.h>\n\nnamespace love\n{\nnamespace sound\n{\nnamespace lullaby\n{\n\n/**\n * Decoder which supports all formats handled by Apple's Core Audio framework.\n **/\nclass CoreAudioDecoder : public Decoder\n{\npublic:\n\n\tCoreAudioDecoder(Stream *stream, int bufferSize);\n\tvirtual ~CoreAudioDecoder();\n\n\tlove::sound::Decoder *clone() override;\n\tint decode() override;\n\tbool seek(double s) override;\n\tbool rewind() override;\n\tbool isSeekable() override;\n\tint getChannelCount() const override;\n\tint getBitDepth() const override;\n\tdouble getDuration() override;\n\nprivate:\n\n\tvoid closeAudioFile();\n\n\tAudioFileID audioFile;\n\tExtAudioFileRef extAudioFile;\n\n\tAudioStreamBasicDescription inputInfo;\n\tAudioStreamBasicDescription outputInfo;\n\n\tdouble duration;\n\n}; // CoreAudioDecoder\n\n} // lullaby\n} // sound\n} // love\n\n#endif // LOVE_SUPPORT_COREAUDIO\n\n#endif // LOVE_SOUND_LULLABY_CORE_AUDIO_DECODER_H\n"
  },
  {
    "path": "src/modules/sound/lullaby/FLACDecoder.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#define DR_FLAC_IMPLEMENTATION\n#include \"FLACDecoder.h\"\n\n#include <set>\n#include <algorithm>\n#include \"common/Exception.h\"\n\nnamespace love\n{\nnamespace sound\n{\nnamespace lullaby\n{\n\nstatic size_t onRead(void *pUserData, void *pBufferOut, size_t bytesToRead)\n{\n\tauto stream = (Stream *) pUserData;\n\tint64 read = stream->read(pBufferOut, bytesToRead);\n\treturn std::max<int64>(0, read);\n}\n\nstatic drflac_bool32 onSeek(void* pUserData, int offset, drflac_seek_origin origin)\n{\n\tauto stream = (Stream *) pUserData;\n\tauto seekorigin = origin == drflac_seek_origin_current ? Stream::SEEKORIGIN_CURRENT : Stream::SEEKORIGIN_BEGIN;\n\treturn stream->seek(offset, seekorigin) ? DRFLAC_TRUE : DRFLAC_FALSE;\n}\n\nFLACDecoder::FLACDecoder(Stream *stream, int nbufferSize)\n\t: Decoder(stream, nbufferSize)\n{\n\tflac = drflac_open(onRead, onSeek, stream, nullptr);\n\tif (flac == nullptr)\n\t\tthrow love::Exception(\"Could not load FLAC file\");\n}\n\nFLACDecoder::~FLACDecoder()\n{\n\tdrflac_close(flac);\n}\n\nlove::sound::Decoder *FLACDecoder::clone()\n{\n\tStrongRef<Stream> s(stream->clone(), Acquire::NORETAIN);\n\treturn new FLACDecoder(s, bufferSize);\n}\n\nint FLACDecoder::decode()\n{\n\t// `bufferSize` is in bytes, so divide by 2.\n\tdrflac_uint64 read = drflac_read_pcm_frames_s16(flac, bufferSize / 2 / flac->channels, (drflac_int16 *) buffer);\n\tread *= 2 * flac->channels;\n\n\tif ((int) read < bufferSize)\n\t\teof = true;\n\n\treturn (int) read;\n}\n\nbool FLACDecoder::seek(double s)\n{\n\tdrflac_uint64 seekPosition = (drflac_uint64) (s * flac->sampleRate);\n\n\tdrflac_bool32 result = drflac_seek_to_pcm_frame(flac, seekPosition);\n\tif (result)\n\t\teof = false;\n\n\treturn result;\n}\n\nbool FLACDecoder::rewind()\n{\n\treturn seek(0);\n}\n\nbool FLACDecoder::isSeekable()\n{\n\treturn true;\n}\n\nint FLACDecoder::getChannelCount() const\n{\n\treturn flac->channels;\n}\n\nint FLACDecoder::getBitDepth() const\n{\n\treturn 16;\n}\n\nint FLACDecoder::getSampleRate() const\n{\n\treturn flac->sampleRate;\n}\n\ndouble FLACDecoder::getDuration()\n{\n\treturn ((double) flac->totalPCMFrameCount) / ((double) flac->sampleRate);\n}\n\n} // lullaby\n} // sound\n} // love\n"
  },
  {
    "path": "src/modules/sound/lullaby/FLACDecoder.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_SOUND_LULLABY_FLAC_DECODER_H\n#define LOVE_SOUND_LULLABY_FLAC_DECODER_H\n\n// LOVE\n#include \"common/Stream.h\"\n#include \"sound/Decoder.h\"\n\n#include \"dr/dr_flac.h\"\n#include <string.h>\n\nnamespace love\n{\nnamespace sound\n{\nnamespace lullaby\n{\n\nclass FLACDecoder : public Decoder\n{\npublic:\n\tFLACDecoder(Stream *stream, int bufferSize);\n\t~FLACDecoder();\n\n\tlove::sound::Decoder *clone() override;\n\tint decode() override;\n\tbool seek(double s) override;\n\tbool rewind() override;\n\tbool isSeekable() override;\n\tint getChannelCount() const override;\n\tint getBitDepth() const override;\n\tint getSampleRate() const override;\n\tdouble getDuration() override;\n\nprivate:\n\tdrflac *flac;\n}; // FLACDecoder\n\n} // lullaby\n} // sound\n} // love\n\n#endif // LOVE_SOUND_LULLABY_FLAC_DECODER_H\n"
  },
  {
    "path": "src/modules/sound/lullaby/MP3Decoder.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#define DR_MP3_IMPLEMENTATION\n#define DR_MP3_NO_STDIO\n#include \"MP3Decoder.h\"\n#include \"common/Exception.h\"\n\nnamespace love\n{\nnamespace sound\n{\nnamespace lullaby\n{\n\n// dr_mp3 looks too far, but it can lead to false-positive. dr_mp3 also doesn't recognize ID3.\n// Implement our own \"MP3 detection\" heuristics that also help dr_mp3 skip ID3 tags.\nstatic int64 findFirstValidHeader(Stream* stream)\n{\n\t// Tweaking this variable has trade-off between false-positive and false-negative. Lesser value\n\t// means lesser false-positive and false-negative. Larger value means more false-positive AND\n\t// false-negative.\n\tconstexpr size_t LOOKUP_SIZE = 128;\n\n\tstd::vector<uint8> data(LOOKUP_SIZE);\n\tuint8 header[10];\n\tuint8 *dataPtr = data.data();\n\tint64 buffer = 0;\n\tint64 offset = 0;\n\n\tif (stream->read(header, 10) < 10)\n\t\treturn -1;\n\n\t// Test for known audio formats which are definitely not MP3.\n\tif (memcmp(header, \"RIFF\", 4) == 0)\n\t\treturn -1;\n\tif (memcmp(header, \"OggS\", 4) == 0)\n\t\treturn -1;\n\tif (memcmp(header, \"fLaC\", 4) == 0)\n\t\treturn -1;\n\n\tif (memcmp(header, \"TAG\", 3) == 0)\n\t{\n\t\t// ID3v1 tag is always 128 bytes long\n\t\tif (!stream->seek(128, Stream::SEEKORIGIN_BEGIN))\n\t\t\treturn -1;\n\n\t\tbuffer = stream->read(dataPtr, LOOKUP_SIZE);\n\t\toffset = 128;\n\t}\n\telse if (memcmp(header, \"ID3\", 3) == 0)\n\t{\n\t\t// ID3v2 tag header is 10 bytes long, but we're\n\t\t// only interested on how much we should skip.\n\t\tint64 off =\n\t\t\theader[9] |\n\t\t\t((int64) header[8] << 7) |\n\t\t\t((int64) header[7] << 14) |\n\t\t\t((int64) header[6] << 21);\n\n\t\tif (!stream->seek(off, Stream::SEEKORIGIN_CURRENT))\n\t\t\treturn -1;\n\n\t\tbuffer = stream->read(dataPtr, LOOKUP_SIZE);\n\t\toffset = off + 10;\n\t}\n\telse\n\t{\n\t\t// Copy the rest to data buffer\n\t\tmemcpy(dataPtr, header, 10);\n\t\tbuffer = 10 + stream->read(dataPtr + 10, LOOKUP_SIZE - 10);\n\t}\n\n\t// Look for mp3 data\n\tfor (int i = 0; i < buffer - 4; i++, offset++)\n\t{\n\t\tif (drmp3_hdr_valid(dataPtr++))\n\t\t{\n\t\t\tstream->seek(offset, Stream::SEEKORIGIN_BEGIN);\n\t\t\treturn offset;\n\t\t}\n\t}\n\n\t// No valid MP3 frame found in first few bytes of the data.\n\treturn -1;\n}\n\nsize_t MP3Decoder::onRead(void *pUserData, void *pBufferOut, size_t bytesToRead)\n{\n\tauto decoder = (MP3Decoder *) pUserData;\n\tint64 read = decoder->stream->read(pBufferOut, bytesToRead);\n\treturn std::max<int64>(0, read);\n}\n\ndrmp3_bool32 MP3Decoder::onSeek(void *pUserData, int offset, drmp3_seek_origin origin)\n{\n\tauto decoder = (MP3Decoder *) pUserData;\n\tint64 pos = decoder->offset;\n\n\t// Due to possible offsets, we have to calculate the position ourself.\n\tswitch (origin)\n\t{\n\tcase drmp3_seek_origin_start:\n\t\tpos += offset;\n\t\tbreak;\n\tcase drmp3_seek_origin_current:\n\t\tpos = decoder->stream->tell() + offset;\n\t\tbreak;\n\tdefault:\n\t\treturn DRMP3_FALSE;\n\t}\n\n\tif (pos < decoder->offset)\n\t\treturn DRMP3_FALSE;\n\n\treturn decoder->stream->seek(pos, Stream::SEEKORIGIN_BEGIN) ? DRMP3_TRUE : DRMP3_FALSE;\n}\n\nMP3Decoder::MP3Decoder(Stream *stream, int bufferSize)\n: Decoder(stream, bufferSize)\n{\n\t// Check for possible ID3 tag and skip it if necessary.\n\toffset = findFirstValidHeader(stream);\n\tif (offset == -1)\n\t\tthrow love::Exception(\"Could not find first valid mp3 header.\");\n\n\t// initialize mp3 handle\n\tif (!drmp3_init(&mp3, onRead, onSeek, this, nullptr))\n\t\tthrow love::Exception(\"Could not read mp3 data.\");\n\n\tsampleRate = mp3.sampleRate;\n\n\t// calculate duration\n\tdrmp3_uint64 pcmCount, mp3FrameCount;\n\tif (!drmp3_get_mp3_and_pcm_frame_count(&mp3, &mp3FrameCount, &pcmCount))\n\t{\n\t\tdrmp3_uninit(&mp3);\n\t\tthrow love::Exception(\"Could not calculate mp3 duration.\");\n\t}\n\tduration = ((double) pcmCount) / ((double) mp3.sampleRate);\n\n\t// create seek table\n\tdrmp3_uint32 mp3FrameInt = (drmp3_uint32) mp3FrameCount;\n\tseekTable.resize((size_t) mp3FrameCount, {0ULL, 0ULL, 0, 0});\n\tif (!drmp3_calculate_seek_points(&mp3, &mp3FrameInt, seekTable.data()))\n\t{\n\t\tdrmp3_uninit(&mp3);\n\t\tthrow love::Exception(\"Could not calculate mp3 seek table\");\n\t}\n\n\t// bind seek table\n\tif (!drmp3_bind_seek_table(&mp3, mp3FrameInt, seekTable.data()))\n\t{\n\t\tdrmp3_uninit(&mp3);\n\t\tthrow love::Exception(\"Could not bind mp3 seek table\");\n\t}\n}\n\nMP3Decoder::~MP3Decoder()\n{\n\tdrmp3_uninit(&mp3);\n}\n\nlove::sound::Decoder *MP3Decoder::clone()\n{\n\tStrongRef<Stream> s(stream->clone(), Acquire::NORETAIN);\n\treturn new MP3Decoder(s, bufferSize);\n}\n\nint MP3Decoder::decode()\n{\n\t// bufferSize is in char\n\tint maxRead = bufferSize / sizeof(int16_t) / mp3.channels;\n\tint read = (int) drmp3_read_pcm_frames_s16(&mp3, maxRead, (drmp3_int16 *) buffer);\n\n\tif (read < maxRead)\n\t\teof = true;\n\n\treturn read * sizeof(int16_t) * mp3.channels;\n}\n\nbool MP3Decoder::seek(double s)\n{\n\tdrmp3_uint64 targetSample = (drmp3_uint64) (s * mp3.sampleRate);\n\tdrmp3_bool32 success = drmp3_seek_to_pcm_frame(&mp3, targetSample);\n\n\tif (success)\n\t\teof = false;\n\n\treturn success;\n}\n\nbool MP3Decoder::rewind()\n{\n\treturn seek(0.0);\n}\n\nbool MP3Decoder::isSeekable()\n{\n\treturn true;\n}\n\nint MP3Decoder::getChannelCount() const\n{\n\treturn mp3.channels;\n}\n\nint MP3Decoder::getBitDepth() const\n{\n\treturn 16;\n}\n\ndouble MP3Decoder::getDuration()\n{\n\treturn duration;\n}\n\n} // lullaby\n} // sound\n} // love\n"
  },
  {
    "path": "src/modules/sound/lullaby/MP3Decoder.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_SOUND_LULLABY_MP3_DECODER_H\n#define LOVE_SOUND_LULLABY_MP3_DECODER_H\n\n// LOVE\n#include \"common/Stream.h\"\n#include \"sound/Decoder.h\"\n\n// dr_mp3\n#include \"dr/dr_mp3.h\"\n\n#include <vector>\n\nnamespace love\n{\nnamespace sound\n{\nnamespace lullaby\n{\n\nclass MP3Decoder: public love::sound::Decoder\n{\npublic:\n\n\tMP3Decoder(Stream *stream, int bufsize);\n\tvirtual ~MP3Decoder();\n\n\tlove::sound::Decoder *clone() override;\n\tint decode() override;\n\tbool seek(double s) override;\n\tbool rewind() override;\n\tbool isSeekable() override;\n\tint getChannelCount() const override;\n\tint getBitDepth() const override;\n\tdouble getDuration() override;\n\nprivate:\n\tstatic size_t onRead(void *pUserData, void *pBufferOut, size_t bytesToRead);\n\tstatic drmp3_bool32 onSeek(void *pUserData, int offset, drmp3_seek_origin origin);\n\n\t// MP3 handle\n\tdrmp3 mp3;\n\t// Used for fast seeking\n\tstd::vector<drmp3_seek_point> seekTable;\n\t// Position of first MP3 frame found\n\tint64 offset;\n\n\tdouble duration;\n}; // MP3Decoder\n\n} // lullaby\n} // sound\n} // love\n\n#endif\n"
  },
  {
    "path": "src/modules/sound/lullaby/ModPlugDecoder.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"ModPlugDecoder.h\"\n\n#ifndef LOVE_NO_MODPLUG\n\n#include \"common/Exception.h\"\n#include \"common/Data.h\"\n\nnamespace love\n{\nnamespace sound\n{\nnamespace lullaby\n{\n\nModPlugDecoder::ModPlugDecoder(Stream *stream, int bufferSize)\n\t: Decoder(stream, bufferSize)\n\t, plug(0)\n\t, duration(-2.0)\n{\n\t// Set some ModPlug settings.\n\tsettings.mFlags = MODPLUG_ENABLE_OVERSAMPLING | MODPLUG_ENABLE_NOISE_REDUCTION;\n\tsettings.mChannels = 2;\n\tsettings.mBits = 16;\n\tsettings.mFrequency = sampleRate;\n\tsettings.mResamplingMode = MODPLUG_RESAMPLE_LINEAR;\n\n\t// fill with modplug defaults (modplug _memsets_, so we could get\n\t// garbage settings when the struct is only partially initialized)\n\t// This does not exist yet on Windows.\n\n\tsettings.mStereoSeparation = 128;\n\tsettings.mMaxMixChannels = 32;\n\tsettings.mReverbDepth = 0;\n\tsettings.mReverbDelay = 0;\n\tsettings.mBassAmount = 0;\n\tsettings.mBassRange = 0;\n\tsettings.mSurroundDepth = 0;\n\tsettings.mSurroundDelay = 0;\n\tsettings.mLoopCount = -1;\n\n\tModPlug_SetSettings(&settings);\n\n\t// ModPlug has no streaming API. Miserable.\n\t// We don't want to load the entire stream immediately if it's big, because\n\t// it might not be compatible with ModPlug. So we just try to load 4MB and\n\t// see if that works, and then load the whole thing if it does.\n\tif (stream->getSize() > 1024 * 1024 * 4)\n\t{\n\t\tdata.set(stream->read(1024 * 1024 * 4), Acquire::NORETAIN);\n\n\t\tplug = ModPlug_Load(data->getData(), (int)data->getSize());\n\n\t\tif (plug == nullptr)\n\t\t\tthrow love::Exception(\"Could not load file with ModPlug.\");\n\n\t\tstream->seek(0);\n\t\tModPlug_Unload(plug);\n\t}\n\n\tdata.set(stream->read(stream->getSize()), Acquire::NORETAIN);\n\n\t// Load the module.\n\tplug = ModPlug_Load(data->getData(), (int)data->getSize());\n\n\tif (plug == nullptr)\n\t\tthrow love::Exception(\"Could not load file with ModPlug.\");\n\n\t// set master volume for delicate ears\n\tModPlug_SetMasterVolume(plug, 128);\n}\n\nModPlugDecoder::~ModPlugDecoder()\n{\n\tif (plug != nullptr)\n\t\tModPlug_Unload(plug);\n}\n\nlove::sound::Decoder *ModPlugDecoder::clone()\n{\n\tStrongRef<Stream> s(stream->clone(), Acquire::NORETAIN);\n\treturn new ModPlugDecoder(s, bufferSize);\n}\n\nint ModPlugDecoder::decode()\n{\n\tint r =  ModPlug_Read(plug, buffer, bufferSize);\n\n\tif (r == 0)\n\t\teof = true;\n\n\treturn r;\n}\n\nbool ModPlugDecoder::seek(double s)\n{\n\tModPlug_Seek(plug, (int)(s*1000.0));\n\treturn true;\n}\n\nbool ModPlugDecoder::rewind()\n{\n\t// Let's reload.\n\tModPlug_Unload(plug);\n\tplug = ModPlug_Load(data->getData(), (int) data->getSize());\n\tModPlug_SetMasterVolume(plug, 128);\n\teof = false;\n\treturn (plug != 0);\n}\n\nbool ModPlugDecoder::isSeekable()\n{\n\treturn true;\n}\n\nint ModPlugDecoder::getChannelCount() const\n{\n\treturn 2;\n}\n\nint ModPlugDecoder::getBitDepth() const\n{\n\treturn 16;\n}\n\ndouble ModPlugDecoder::getDuration()\n{\n\t// Only calculate the duration if we haven't done so already.\n\tif (duration == -2.0)\n\t{\n\t\tint lengthms = ModPlug_GetLength(plug);\n\n\t\tif (lengthms < 0)\n\t\t\tduration = -1.0;\n\t\telse\n\t\t\tduration = (double) lengthms / 1000.0;\n\t}\n\n\treturn duration;\n}\n\n} // lullaby\n} // sound\n} // love\n\n#endif // LOVE_NO_MODPLUG\n"
  },
  {
    "path": "src/modules/sound/lullaby/ModPlugDecoder.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_SOUND_LULLABY_MODPLUG_DECODER_H\n#define LOVE_SOUND_LULLABY_MODPLUG_DECODER_H\n\n#include \"common/config.h\"\n\n#ifndef LOVE_NO_MODPLUG\n\n// LOVE\n#include \"common/Stream.h\"\n#include \"sound/Decoder.h\"\n\n// libmodplug\n#if defined(LOVE_ANDROID) || defined(LOVE_IOS)\n#include <modplug.h>\n#else\n#include <libmodplug/modplug.h>\n#endif\n\nnamespace love\n{\nnamespace sound\n{\nnamespace lullaby\n{\n\nclass ModPlugDecoder : public Decoder\n{\npublic:\n\n\tModPlugDecoder(Stream *stream, int bufferSize);\n\tvirtual ~ModPlugDecoder();\n\n\tlove::sound::Decoder *clone() override;\n\tint decode() override;\n\tbool seek(double s) override;\n\tbool rewind() override;\n\tbool isSeekable() override;\n\tint getChannelCount() const override;\n\tint getBitDepth() const override;\n\tdouble getDuration() override;\n\nprivate:\n\n\tStrongRef<Data> data;\n\n\tModPlugFile *plug;\n\tModPlug_Settings settings;\n\n\tdouble duration;\n\n}; // ModPlugDecoder\n\n} // lullaby\n} // sound\n} // love\n\n#endif // LOVE_NO_MODPLUG\n\n#endif // LOVE_SOUND_LULLABY_MODPLUG_DECODER_H\n"
  },
  {
    "path": "src/modules/sound/lullaby/Sound.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"common/config.h\"\n\n#include <algorithm>\n#include <sstream>\n\n#include \"Sound.h\"\n\n#include \"ModPlugDecoder.h\"\n#include \"VorbisDecoder.h\"\n#include \"WaveDecoder.h\"\n#include \"FLACDecoder.h\"\n#include \"MP3Decoder.h\"\n\n#ifdef LOVE_SUPPORT_COREAUDIO\n#\tinclude \"CoreAudioDecoder.h\"\n#endif\n\nstruct DecoderImpl\n{\n\tlove::sound::Decoder *(*create)(love::Stream *stream, int bufferSize);\n};\n\ntemplate<typename DecoderType>\nDecoderImpl DecoderImplFor()\n{\n\tDecoderImpl decoderImpl;\n\tdecoderImpl.create = [](love::Stream *stream, int bufferSize) -> love::sound::Decoder*\n\t{\n\t\treturn new DecoderType(stream, bufferSize);\n\t};\n\treturn decoderImpl;\n}\n\nnamespace love\n{\nnamespace sound\n{\nnamespace lullaby\n{\n\nSound::Sound()\n\t: love::sound::Sound(\"love.sound.lullaby\")\n{\n}\n\nSound::~Sound()\n{\n}\n\nsound::Decoder *Sound::newDecoder(Stream *stream, int bufferSize)\n{\n\tstd::vector<DecoderImpl> possibleDecoders = {\n\t\tDecoderImplFor<WaveDecoder>(),\n\t\tDecoderImplFor<FLACDecoder>(),\n\t\tDecoderImplFor<VorbisDecoder>(),\n#ifdef LOVE_SUPPORT_COREAUDIO\n\t\tDecoderImplFor<CoreAudioDecoder>(),\n#endif\n\t\tDecoderImplFor<MP3Decoder>(),\n#ifndef LOVE_NO_MODPLUG\n\t\tDecoderImplFor<ModPlugDecoder>(), // Last because it doesn't work well with Streams.\n#endif\n\t};\n\n\tstd::stringstream decodingErrors;\n\tdecodingErrors << \"Failed to determine file type:\\n\";\n\tfor (DecoderImpl &possibleDecoder : possibleDecoders)\n\t{\n\t\ttry\n\t\t{\n\t\t\tstream->seek(0);\n\t\t\tsound::Decoder *decoder = possibleDecoder.create(stream, bufferSize);\n\t\t\treturn decoder;\n\t\t}\n\t\tcatch (love::Exception &e)\n\t\t{\n\t\t\tdecodingErrors << e.what() << '\\n';\n\t\t}\n\t}\n\n\tstd::string errors = decodingErrors.str();\n\tthrow love::Exception(\"No suitable audio decoders found.\\n%s\", errors.c_str());\n\n\t// Unreachable, but here to prevent (possible) warnings\n\treturn nullptr;\n}\n\n} // lullaby\n} // sound\n} // love\n"
  },
  {
    "path": "src/modules/sound/lullaby/Sound.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n\n\n#ifndef LOVE_SOUND_LULLABY_SOUND_H\n#define LOVE_SOUND_LULLABY_SOUND_H\n\n// LOVE\n#include <sound/Sound.h>\n#include \"sound/Decoder.h\"\n\nnamespace love\n{\nnamespace sound\n{\nnamespace lullaby\n{\n\n/**\n * The love.sound.lullaby module is the custom sound decoder module for LOVE. Instead\n * of using an intermediate library like SDL_sound, it interfaces with relevant libraries\n * directly (libvorbis, dr_mp3, dr_flac, etc).\n *\n * It was Mike that came up with the name Lullaby, which we both instantly recognized as awesome.\n **/\nclass Sound : public love::sound::Sound\n{\npublic:\n\n\tSound();\n\tvirtual ~Sound();\n\n\t/// @copydoc love::sound::Sound::newDecoder\n\tsound::Decoder *newDecoder(Stream *stream, int bufferSize) override;\n\n}; // Sound\n\n} // lullaby\n} // sound\n} // love\n\n#endif // LOVE_SOUND_LULLABY_SOUND_H\n"
  },
  {
    "path": "src/modules/sound/lullaby/VorbisDecoder.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"VorbisDecoder.h\"\n\n#include <string.h>\n#include \"common/config.h\"\n#include \"common/Exception.h\"\n\nnamespace love\n{\nnamespace sound\n{\nnamespace lullaby\n{\n\nstatic int vorbisClose(void *)\n{\n\t// Does nothing (handled elsewhere)\n\treturn 1;\n}\n\nstatic size_t vorbisRead(void *ptr, size_t byteSize, size_t sizeToRead, void *datasource)\n{\n\tauto stream = (Stream *) datasource;\n\treturn stream->read(ptr, byteSize * sizeToRead);\n}\n\nstatic int vorbisSeek(void *datasource, ogg_int64_t offset, int whence)\n{\n\tauto stream = (Stream *) datasource;\n\tauto origin = Stream::SEEKORIGIN_BEGIN;\n\n\tswitch (whence)\n\t{\n\tcase SEEK_SET:\n\t\torigin = Stream::SEEKORIGIN_BEGIN;\n\t\tbreak;\n\tcase SEEK_CUR:\n\t\torigin = Stream::SEEKORIGIN_CURRENT;\n\t\tbreak;\n\tcase SEEK_END:\n\t\torigin = Stream::SEEKORIGIN_END;\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t};\n\n\treturn stream->seek(offset, origin) ? 0 : -1;\n}\n\nstatic long vorbisTell(void *datasource)\n{\n\tauto stream = (Stream *) datasource;\n\treturn (long) stream->tell();\n}\n/**\n * END CALLBACK FUNCTIONS\n **/\n\nVorbisDecoder::VorbisDecoder(Stream *stream, int bufferSize)\n\t: Decoder(stream, bufferSize)\n\t, duration(-2.0)\n{\n\tov_callbacks callbacks = {};\n\tcallbacks.close_func = vorbisClose;\n\tcallbacks.seek_func  = vorbisSeek;\n\tcallbacks.read_func  = vorbisRead;\n\tcallbacks.tell_func  = vorbisTell;\n\n\t// Open Vorbis handle\n\tif (ov_open_callbacks(stream, &handle, nullptr, 0, callbacks) < 0)\n\t\tthrow love::Exception(\"Could not read Ogg bitstream\");\n\n\tvorbisInfo = ov_info(&handle, -1);\n}\n\nVorbisDecoder::~VorbisDecoder()\n{\n\tov_clear(&handle);\n}\n\nlove::sound::Decoder *VorbisDecoder::clone()\n{\n\tStrongRef<Stream> s(stream->clone(), Acquire::NORETAIN);\n\treturn new VorbisDecoder(s, bufferSize);\n}\n\nint VorbisDecoder::decode()\n{\n\tint size = 0;\n\n#ifdef LOVE_BIG_ENDIAN\n\tint endian = 1;\n#else\n\tint endian = 0;\n#endif\n\n\twhile (size < bufferSize)\n\t{\n\t\tlong result = ov_read(&handle, (char *) buffer + size, bufferSize - size, endian, (getBitDepth() == 16 ? 2 : 1), 1, 0);\n\n\t\tif (result == OV_HOLE)\n\t\t\tcontinue;\n\t\telse if (result <= OV_EREAD)\n\t\t\treturn -1;\n\t\telse if (result == 0)\n\t\t{\n\t\t\teof = true;\n\t\t\tbreak;\n\t\t}\n\t\telse if (result > 0)\n\t\t\tsize += result;\n\t}\n\n\treturn size;\n}\n\nbool VorbisDecoder::seek(double s)\n{\n\tint result = 0;\n\n\t// Avoid ov_time_seek (which calls ov_pcm_seek) when seeking to 0, to avoid\n\t// a bug in libvorbis <= 1.3.4 when seeking to PCM 0 in multiplexed streams.\n\tif (s <= 0.000001)\n\t\tresult = ov_raw_seek(&handle, 0);\n\telse\n\t\tresult = ov_time_seek(&handle, s);\n\n\tif (result == 0)\n\t{\n\t\teof = false;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool VorbisDecoder::rewind()\n{\n\t// Avoid ov_time_seek to avoid a bug in libvorbis <= 1.3.4 when seeking to\n\t// PCM 0 in multiplexed streams.\n\tint result = ov_raw_seek(&handle, 0);\n\n\tif (result == 0)\n\t{\n\t\teof = false;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool VorbisDecoder::isSeekable()\n{\n\tlong result = ov_seekable(&handle);\n\treturn (result != 0);\n}\n\nint VorbisDecoder::getChannelCount() const\n{\n\treturn vorbisInfo->channels;\n}\n\nint VorbisDecoder::getBitDepth() const\n{\n\treturn 16;\n}\n\nint VorbisDecoder::getSampleRate() const\n{\n\treturn (int) vorbisInfo->rate;\n}\n\ndouble VorbisDecoder::getDuration()\n{\n\t// Only calculate the duration if we haven't done so already.\n\tif (duration == -2.0)\n\t{\n\t\tduration = ov_time_total(&handle, -1);\n\n\t\tif (duration == OV_EINVAL || duration < 0.0)\n\t\t\tduration = -1.0;\n\t}\n\n\treturn duration;\n}\n\n} // lullaby\n} // sound\n} // love\n"
  },
  {
    "path": "src/modules/sound/lullaby/VorbisDecoder.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_SOUND_LULLABY_VORBIS_DECODER_H\n#define LOVE_SOUND_LULLABY_VORBIS_DECODER_H\n\n// LOVE\n#include \"common/Stream.h\"\n#include \"common/int.h\"\n#include \"sound/Decoder.h\"\n\n// vorbis\n#define OV_EXCLUDE_STATIC_CALLBACKS\n#include <vorbis/codec.h>\n#include <vorbis/vorbisfile.h>\n\nnamespace love\n{\nnamespace sound\n{\nnamespace lullaby\n{\n\nclass VorbisDecoder : public Decoder\n{\npublic:\n\n\tVorbisDecoder(Stream *stream, int bufferSize);\n\tvirtual ~VorbisDecoder();\n\n\tlove::sound::Decoder *clone() override;\n\tint decode() override;\n\tbool seek(double s) override;\n\tbool rewind() override;\n\tbool isSeekable() override;\n\tint getChannelCount() const override;\n\tint getBitDepth() const override;\n\tint getSampleRate() const override;\n\tdouble getDuration() override;\n\nprivate:\n\n\tOggVorbis_File handle;\n\tvorbis_info *vorbisInfo;\n\tdouble duration;\n\n}; // VorbisDecoder\n\n} // lullaby\n} // sound\n} // love\n\n#endif // LOVE_SOUND_LULLABY_VORBIS_DECODER_H\n"
  },
  {
    "path": "src/modules/sound/lullaby/WaveDecoder.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"WaveDecoder.h\"\n\n#include <string.h>\n#include \"common/config.h\"\n#include \"common/Exception.h\"\n\nnamespace love\n{\nnamespace sound\n{\nnamespace lullaby\n{\n\n// Callbacks\nstatic wuff_sint32 read_callback(void *userdata, wuff_uint8 *buffer, size_t *size)\n{\n\tauto stream = (Stream *) userdata;\n\tsize_t readsize = stream->read(buffer, *size);\n\t*size = readsize;\n\treturn WUFF_SUCCESS;\n}\n\nstatic wuff_sint32 seek_callback(void *userdata, wuff_uint64 offset)\n{\n\tauto stream = (Stream *) userdata;\n\tstream->seek(offset, Stream::SEEKORIGIN_BEGIN);\n\treturn WUFF_SUCCESS;\n}\n\nstatic wuff_sint32 tell_callback(void *userdata, wuff_uint64 *offset)\n{\n\tauto stream = (Stream *) userdata;\n\t*offset = stream->tell();\n\treturn WUFF_SUCCESS;\n}\n\nstatic wuff_callback WaveDecoderCallbacks = {read_callback, seek_callback, tell_callback};\n\nWaveDecoder::WaveDecoder(Stream *stream, int bufferSize)\n\t: Decoder(stream, bufferSize)\n{\n\tint wuff_status = wuff_open(&handle, &WaveDecoderCallbacks, stream);\n\tif (wuff_status < 0)\n\t\tthrow love::Exception(\"Could not open WAVE\");\n\n\ttry\n\t{\n\t\twuff_status = wuff_stream_info(handle, &info);\n\t\tif (wuff_status < 0)\n\t\t\tthrow love::Exception(\"Could not retrieve WAVE stream info\");\n\n\t\tif (info.channels > 2)\n\t\t\tthrow love::Exception(\"WAVE Multichannel audio not supported\");\n\n\t\tif (info.format != WUFF_FORMAT_PCM_U8 && info.format != WUFF_FORMAT_PCM_S16)\n\t\t{\n\t\t\twuff_status = wuff_format(handle, WUFF_FORMAT_PCM_S16);\n\t\t\tif (wuff_status < 0)\n\t\t\t\tthrow love::Exception(\"Could not set WAVE output format\");\n\t\t}\n\t}\n\tcatch (love::Exception &)\n\t{\n\t\twuff_close(handle);\n\t\tthrow;\n\t}\n}\n\nWaveDecoder::~WaveDecoder()\n{\n\twuff_close(handle);\n}\n\nlove::sound::Decoder *WaveDecoder::clone()\n{\n\tStrongRef<Stream> s(stream->clone(), Acquire::NORETAIN);\n\treturn new WaveDecoder(s, bufferSize);\n}\n\nint WaveDecoder::decode()\n{\n\tsize_t size = 0;\n\n\twhile (size < (size_t) bufferSize)\n\t{\n\t\tsize_t bytes = bufferSize-size;\n\t\tint wuff_status = wuff_read(handle, (wuff_uint8 *) buffer+size, &bytes);\n\n\t\tif (wuff_status < 0)\n\t\t\treturn 0;\n\t\telse if (bytes == 0)\n\t\t{\n\t\t\teof = true;\n\t\t\tbreak;\n\t\t}\n\n\t\tsize += bytes;\n\t}\n\n\treturn (int) size;\n}\n\nbool WaveDecoder::seek(double s)\n{\n\tint wuff_status = wuff_seek(handle, (wuff_uint64) (s * info.sample_rate));\n\n\tif (wuff_status >= 0)\n\t{\n\t\teof = false;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool WaveDecoder::rewind()\n{\n\tint wuff_status = wuff_seek(handle, 0);\n\n\tif (wuff_status >= 0)\n\t{\n\t\teof = false;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool WaveDecoder::isSeekable()\n{\n\treturn true;\n}\n\nint WaveDecoder::getChannelCount() const\n{\n\treturn info.channels;\n}\n\nint WaveDecoder::getBitDepth() const\n{\n\treturn info.bits_per_sample == 8 ? 8 : 16;\n}\n\nint WaveDecoder::getSampleRate() const\n{\n\treturn info.sample_rate;\n}\n\ndouble WaveDecoder::getDuration()\n{\n\treturn (double) info.length / (double) info.sample_rate;\n}\n\n} // lullaby\n} // sound\n} // love\n"
  },
  {
    "path": "src/modules/sound/lullaby/WaveDecoder.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_SOUND_LULLABY_WAVE_DECODER_H\n#define LOVE_SOUND_LULLABY_WAVE_DECODER_H\n\n// LOVE\n#include \"common/Stream.h\"\n#include \"sound/Decoder.h\"\n\n#include \"libraries/Wuff/wuff.h\"\n\nnamespace love\n{\nnamespace sound\n{\nnamespace lullaby\n{\n\nclass WaveDecoder : public Decoder\n{\npublic:\n\n\tWaveDecoder(Stream *stream, int bufferSize);\n\tvirtual ~WaveDecoder();\n\n\tlove::sound::Decoder *clone() override;\n\tint decode() override;\n\tbool seek(double s) override;\n\tbool rewind() override;\n\tbool isSeekable() override;\n\tint getChannelCount() const override;\n\tint getBitDepth() const override;\n\tint getSampleRate() const override;\n\tdouble getDuration() override;\n\nprivate:\n\n\twuff_handle *handle;\n\twuff_info info;\n\n}; // WaveDecoder\n\n} // lullaby\n} // sound\n} // love\n\n#endif // LOVE_SOUND_LULLABY_WAVE_DECODER_H\n"
  },
  {
    "path": "src/modules/sound/wrap_Decoder.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_Decoder.h\"\n#include \"SoundData.h\"\n#include \"Sound.h\"\n\n#define instance() (Module::getInstance<Sound>(Module::M_SOUND))\n\nnamespace love\n{\nnamespace sound\n{\n\nDecoder *luax_checkdecoder(lua_State *L, int idx)\n{\n\treturn luax_checktype<Decoder>(L, idx);\n}\n\nint w_Decoder_clone(lua_State *L)\n{\n\tDecoder *t = luax_checkdecoder(L, 1);\n\tDecoder *c = nullptr;\n\tluax_catchexcept(L, [&]() { c = t->clone(); });\n\tluax_pushtype(L, c);\n\tc->release();\n\treturn 1;\n}\n\nint w_Decoder_getChannelCount(lua_State *L)\n{\n\tDecoder *t = luax_checkdecoder(L, 1);\n\tlua_pushinteger(L, t->getChannelCount());\n\treturn 1;\n}\n\nint w_Decoder_getBitDepth(lua_State *L)\n{\n\tDecoder *t = luax_checkdecoder(L, 1);\n\tlua_pushinteger(L, t->getBitDepth());\n\treturn 1;\n}\n\nint w_Decoder_getSampleRate(lua_State *L)\n{\n\tDecoder *t = luax_checkdecoder(L, 1);\n\tlua_pushinteger(L, t->getSampleRate());\n\treturn 1;\n}\n\nint w_Decoder_getDuration(lua_State *L)\n{\n\tDecoder *t = luax_checkdecoder(L, 1);\n\tlua_pushnumber(L, t->getDuration());\n\treturn 1;\n}\n\nint w_Decoder_decode(lua_State *L)\n{\n\tDecoder *t = luax_checkdecoder(L, 1);\n\n\tint decoded = t->decode();\n\tif (decoded > 0)\n\t{\n\t\tluax_catchexcept(L, [&]() {\n\t\t\tSoundData *s = instance()->newSoundData(t->getBuffer(),\n\t\t\t\tdecoded / (t->getBitDepth() / 8 * t->getChannelCount()),\n\t\t\t\tt->getSampleRate(), t->getBitDepth(), t->getChannelCount());\n\n\t\t\tluax_pushtype(L, s);\n\t\t\ts->release();\n\t\t});\n\t}\n\telse\n\t\tlua_pushnil(L);\n\treturn 1;\n}\n\nint w_Decoder_seek(lua_State *L)\n{\n\tDecoder *t = luax_checkdecoder(L, 1);\n\tdouble offset = luaL_checknumber(L, 2);\n\tif (offset < 0)\n\t\treturn luaL_argerror(L, 2, \"can't seek to a negative position\");\n\telse if (offset == 0)\n\t\tt->rewind();\n\telse\n\t\tt->seek(offset);\n\treturn 0;\n}\n\nstatic const luaL_Reg w_Decoder_functions[] =\n{\n\t{ \"clone\", w_Decoder_clone },\n\t{ \"getChannelCount\", w_Decoder_getChannelCount },\n\t{ \"getBitDepth\", w_Decoder_getBitDepth },\n\t{ \"getSampleRate\", w_Decoder_getSampleRate },\n\t{ \"getDuration\", w_Decoder_getDuration },\n\t{ \"decode\", w_Decoder_decode },\n\t{ \"seek\", w_Decoder_seek },\n\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_decoder(lua_State *L)\n{\n\treturn luax_register_type(L, &Decoder::type, w_Decoder_functions, nullptr);\n}\n\n} // sound\n} // love\n"
  },
  {
    "path": "src/modules/sound/wrap_Decoder.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_SOUND_WRAP_DECODER_H\n#define LOVE_SOUND_WRAP_DECODER_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"Decoder.h\"\n\nnamespace love\n{\nnamespace sound\n{\n\nDecoder *luax_checkdecoder(lua_State *L, int idx);\nextern \"C\" int luaopen_decoder(lua_State *L);\n\n} // sound\n} // love\n\n#endif // LOVE_SOUND_WRAP_DECODER_H\n"
  },
  {
    "path": "src/modules/sound/wrap_Sound.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_Sound.h\"\n\n#include \"filesystem/wrap_Filesystem.h\"\n#include \"data/DataStream.h\"\n\n// Implementations.\n#include \"lullaby/Sound.h\"\n\nnamespace love\n{\nnamespace sound\n{\n\n#define instance() (Module::getInstance<Sound>(Module::M_SOUND))\n\nint w_newDecoder(lua_State *L)\n{\n\tint bufferSize = (int)luaL_optinteger(L, 2, Decoder::DEFAULT_BUFFER_SIZE);\n\tlove::Stream *stream = nullptr;\n\n\tif (love::filesystem::luax_cangetfile(L, 1))\n\t{\n\t\tDecoder::StreamSource source = Decoder::STREAM_FILE;\n\n\t\tconst char* sourcestr = lua_isnoneornil(L, 3) ? nullptr : luaL_checkstring(L, 3);\n\t\tif (sourcestr != nullptr && !Decoder::getConstant(sourcestr, source))\n\t\t\treturn luax_enumerror(L, \"stream type\", Decoder::getConstants(source), sourcestr);\n\n\t\tif (source == Decoder::STREAM_FILE)\n\t\t{\n\t\t\tauto file = love::filesystem::luax_getfile(L, 1);\n\t\t\tluax_catchexcept(L, [&]() { file->open(love::filesystem::File::MODE_READ); });\n\t\t\tstream = file;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tluax_catchexcept(L, [&]()\n\t\t\t{\n\t\t\t\tStrongRef<love::filesystem::FileData> data(love::filesystem::luax_getfiledata(L, 1), Acquire::NORETAIN);\n\t\t\t\tstream = new data::DataStream(data);\n\t\t\t});\n\t\t}\n\n\t}\n\telse if (luax_istype(L, 1, Data::type))\n\t{\n\t\tData *data = luax_checktype<Data>(L, 1);\n\t\tluax_catchexcept(L, [&]() { stream = new data::DataStream(data); });\n\t}\n\telse\n\t{\n\t\tstream = luax_checktype<Stream>(L, 1);\n\t\tstream->retain();\n\t}\t\n\n\tDecoder *t = nullptr;\n\tluax_catchexcept(L,\n\t\t[&]() { t = instance()->newDecoder(stream, bufferSize); },\n\t\t[&](bool) { stream->release(); }\n\t);\n\n\tluax_pushtype(L, t);\n\tt->release();\n\treturn 1;\n}\n\nint w_newSoundData(lua_State *L)\n{\n\tSoundData *t = nullptr;\n\n\tif (lua_isnumber(L, 1))\n\t{\n\t\tint samples = (int) luaL_checkinteger(L, 1);\n\t\tint sampleRate = (int) luaL_optinteger(L, 2, Decoder::DEFAULT_SAMPLE_RATE);\n\t\tint bitDepth = (int) luaL_optinteger(L, 3, Decoder::DEFAULT_BIT_DEPTH);\n\t\tint channels = (int) luaL_optinteger(L, 4, Decoder::DEFAULT_CHANNELS);\n\n\t\tluax_catchexcept(L, [&](){ t = instance()->newSoundData(samples, sampleRate, bitDepth, channels); });\n\t}\n\t// Must be string or decoder.\n\telse\n\t{\n\t\t// Convert to Decoder, if necessary.\n\t\tif (!luax_istype(L, 1, Decoder::type))\n\t\t{\n\t\t\tw_newDecoder(L);\n\t\t\tlua_replace(L, 1);\n\t\t}\n\n\t\tluax_catchexcept(L, [&](){ t = instance()->newSoundData(luax_checkdecoder(L, 1)); });\n\t}\n\n\tluax_pushtype(L, t);\n\tt->release();\n\treturn 1;\n}\n\n// List of functions to wrap.\nstatic const luaL_Reg functions[] =\n{\n\t{ \"newDecoder\",  w_newDecoder },\n\t{ \"newSoundData\",  w_newSoundData },\n\t{ 0, 0 }\n};\n\nstatic const lua_CFunction types[] =\n{\n\tluaopen_sounddata,\n\tluaopen_decoder,\n\t0\n};\n\nextern \"C\" int luaopen_love_sound(lua_State *L)\n{\n\tSound *instance = instance();\n\tif (instance == nullptr)\n\t{\n\t\tluax_catchexcept(L, [&](){ instance = new lullaby::Sound(); });\n\t}\n\telse\n\t\tinstance->retain();\n\n\n\tWrappedModule w;\n\tw.module = instance;\n\tw.name = \"sound\";\n\tw.type = &Sound::type;\n\tw.functions = functions;\n\tw.types = types;\n\n\treturn luax_register_module(L, w);\n}\n\n} // sound\n} // love\n"
  },
  {
    "path": "src/modules/sound/wrap_Sound.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_SOUND_WRAP_SOUND_H\n#define LOVE_SOUND_WRAP_SOUND_H\n\n// LOVE\n#include \"common/config.h\"\n#include \"Sound.h\"\n#include \"wrap_SoundData.h\"\n#include \"wrap_Decoder.h\"\n\nnamespace love\n{\nnamespace sound\n{\n\nextern \"C\" LOVE_EXPORT int luaopen_love_sound(lua_State *L);\n\n} // sound\n} // love\n\n#endif // LOVE_SOUND_WRAP_SOUND_H\n"
  },
  {
    "path": "src/modules/sound/wrap_SoundData.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_SoundData.h\"\n\n#include \"data/wrap_Data.h\"\n\n// Shove the wrap_SoundData.lua code directly into a raw string literal.\nstatic const char sounddata_lua[] =\n#include \"wrap_SoundData.lua\"\n;\n\nnamespace love\n{\nnamespace sound\n{\n\n/**\n * NOTE: Additional wrapper code is in wrap_SoundData.lua. Be sure to keep it\n * in sync with any changes made to this file!\n **/\n\nSoundData *luax_checksounddata(lua_State *L, int idx)\n{\n\treturn luax_checktype<SoundData>(L, idx);\n}\n\nint w_SoundData_clone(lua_State *L)\n{\n\tSoundData *t = luax_checksounddata(L, 1), *c = nullptr;\n\tluax_catchexcept(L, [&](){ c = t->clone(); });\n\tluax_pushtype(L, c);\n\tc->release();\n\treturn 1;\n}\n\nint w_SoundData_getChannelCount(lua_State *L)\n{\n\tSoundData *t = luax_checksounddata(L, 1);\n\tlua_pushinteger(L, t->getChannelCount());\n\treturn 1;\n}\n\nint w_SoundData_getBitDepth(lua_State *L)\n{\n\tSoundData *t = luax_checksounddata(L, 1);\n\tlua_pushinteger(L, t->getBitDepth());\n\treturn 1;\n}\n\nint w_SoundData_getSampleRate(lua_State *L)\n{\n\tSoundData *t = luax_checksounddata(L, 1);\n\tlua_pushinteger(L, t->getSampleRate());\n\treturn 1;\n}\n\nint w_SoundData_getSampleCount(lua_State *L)\n{\n\tSoundData *t = luax_checksounddata(L, 1);\n\tlua_pushinteger(L, t->getSampleCount());\n\treturn 1;\n}\n\nint w_SoundData_getDuration(lua_State *L)\n{\n\tSoundData *t = luax_checksounddata(L, 1);\n\tlua_pushnumber(L, t->getDuration());\n\treturn 1;\n}\n\nint w_SoundData_setSample(lua_State *L)\n{\n\tSoundData *sd = luax_checksounddata(L, 1);\n\tint i = (int) luaL_checkinteger(L, 2);\n\n\tif (lua_gettop(L) > 3)\n\t{\n\t\tint channel = luaL_checkinteger(L, 3);\n\t\tfloat sample = (float) luaL_checknumber(L, 4);\n\t\tluax_catchexcept(L, [&](){ sd->setSample(i, channel, sample); });\n\t}\n\telse\n\t{\n\t\tfloat sample = (float) luaL_checknumber(L, 3);\n\t\tluax_catchexcept(L, [&](){ sd->setSample(i, sample); });\n\t}\n\n\treturn 0;\n}\n\nint w_SoundData_getSample(lua_State *L)\n{\n\tSoundData *sd = luax_checksounddata(L, 1);\n\tint i = (int) luaL_checkinteger(L, 2);\n\n\tif (lua_gettop(L) > 2)\n\t{\n\t\tint channel = luaL_checkinteger(L, 3);\n\t\tluax_catchexcept(L, [&](){ lua_pushnumber(L, sd->getSample(i, channel)); });\n\t}\n\telse\n\t\tluax_catchexcept(L, [&](){ lua_pushnumber(L, sd->getSample(i)); });\n\treturn 1;\n}\n\nint w_SoundData_copyFrom(lua_State *L)\n{\n\tSoundData *dst = luax_checksounddata(L, 1);\n\tconst SoundData *src = luax_checksounddata(L, 2);\n\n\tint srcStart = (int) luaL_checkinteger(L, 3);\n\tint count = (int) luaL_checkinteger(L, 4);\n\tint dstStart = (int) luaL_optinteger(L, 5, 0);\n\n\tluax_catchexcept(L, [&](){ dst->copyFrom(src, srcStart, count, dstStart); });\n\treturn 0;\n}\n\nint w_SoundData_slice(lua_State *L)\n{\n\tSoundData *t = luax_checksounddata(L, 1), *c = nullptr;\n\tint start = (int) luaL_checkinteger(L, 2);\n\tint length = (int) luaL_optinteger(L, 3, -1);\n\n\tluax_catchexcept(L, [&](){ c = t->slice(start, length); });\n\tluax_pushtype(L, c);\n\tc->release();\n\treturn 1;\n}\n\nstatic const luaL_Reg w_SoundData_functions[] =\n{\n\t{ \"clone\", w_SoundData_clone },\n\t{ \"getChannelCount\", w_SoundData_getChannelCount },\n\t{ \"getBitDepth\", w_SoundData_getBitDepth },\n\t{ \"getSampleRate\", w_SoundData_getSampleRate },\n\t{ \"getSampleCount\", w_SoundData_getSampleCount },\n\t{ \"getDuration\", w_SoundData_getDuration },\n\t{ \"setSample\", w_SoundData_setSample },\n\t{ \"getSample\", w_SoundData_getSample },\n\t{ \"copyFrom\", w_SoundData_copyFrom },\n\t{ \"slice\", w_SoundData_slice },\n\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_sounddata(lua_State *L)\n{\n\tint ret = luax_register_type(L, &SoundData::type, data::w_Data_functions, w_SoundData_functions, nullptr);\n\n\tlove::data::luax_rundatawrapper(L, SoundData::type);\n\tluax_runwrapper(L, sounddata_lua, sizeof(sounddata_lua), \"SoundData.lua\", SoundData::type, nullptr);\n\n\treturn ret;\n}\n\n} // sound\n} // love\n"
  },
  {
    "path": "src/modules/sound/wrap_SoundData.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_SOUND_WRAP_SOUND_DATA_H\n#define LOVE_SOUND_WRAP_SOUND_DATA_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"SoundData.h\"\n\nnamespace love\n{\nnamespace sound\n{\n\nSoundData *luax_checksounddata(lua_State *L, int idx);\nextern \"C\" int luaopen_sounddata(lua_State *L);\n\n} // sound\n} // love\n\n#endif // LOVE_SOUND_WRAP_SOUND_DATA_H\n"
  },
  {
    "path": "src/modules/sound/wrap_SoundData.lua",
    "content": "R\"luastring\"--(\n-- DO NOT REMOVE THE ABOVE LINE. It is used to load this file as a C++ string.\n-- There is a matching delimiter at the bottom of the file.\n\n--[[\nCopyright (c) 2006-2024 LOVE Development Team\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\nclaim that you wrote the original software. If you use this software\nin a product, an acknowledgment in the product documentation would be\nappreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be\nmisrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n--]]\n\nlocal SoundData_mt = ...\nlocal SoundData = SoundData_mt.__index\n\nif type(jit) ~= \"table\" or not jit.status() then\n\t-- LuaJIT's FFI is *much* slower than LOVE's regular methods when the JIT\n\t-- compiler is disabled.\n\treturn\nend\n\nlocal status, ffi = pcall(require, \"ffi\")\nif not status then return end\n\nlocal tonumber, assert, error, type = tonumber, assert, error, type\nlocal floor = math.floor\n\nlocal float = ffi.typeof(\"float\")\nlocal datatypes = {ffi.typeof(\"uint8_t *\"), ffi.typeof(\"int16_t *\")}\n\nlocal typemaxvals = {0x7F, 0x7FFF}\n\nlocal _getBitDepth = SoundData.getBitDepth\nlocal _getSampleCount = SoundData.getSampleCount\nlocal _getSampleRate = SoundData.getSampleRate\nlocal _getChannelCount = SoundData.getChannelCount\nlocal _getDuration = SoundData.getDuration\nlocal _release = SoundData.release\n\n-- Table which holds SoundData objects as keys, and information about the objects\n-- as values. Uses weak keys so the SoundData objects can still be GC'd properly.\nlocal objectcache = setmetatable({}, {\n\t__mode = \"k\",\n\t__index = function(self, sounddata)\n\t\tlocal bytedepth = _getBitDepth(sounddata) / 8\n\t\tlocal pointer = ffi.cast(datatypes[bytedepth], sounddata:getFFIPointer())\n\n\t\tlocal p = {\n\t\t\tbytedepth = bytedepth,\n\t\t\tpointer = pointer,\n\t\t\tsize = sounddata:getSize(),\n\t\t\tmaxvalue = typemaxvals[bytedepth],\n\t\t\tsamplecount = _getSampleCount(sounddata),\n\t\t\tsamplerate = _getSampleRate(sounddata),\n\t\t\tchannels = _getChannelCount(sounddata),\n\t\t\tduration = _getDuration(sounddata),\n\t\t}\n\n\t\tself[sounddata] = p\n\t\treturn p\n\tend,\n})\n\n\n-- Overwrite existing functions with new FFI versions.\n\nfunction SoundData:getSample(i, channel)\n\tif type(i) ~= \"number\" then error(\"bad argument #1 to SoundData:getSample (expected number)\", 2) end\n\tif channel ~= nil and type(channel) ~= \"number\" then error(\"bad argument #2 to SoundData:getSample (expected number)\", 2) end\n\n\ti = floor(i)\n\n\tlocal p = objectcache[self]\n\n\tif channel then\n\t\tif channel < 1 or channel > p.channels then\n\t\t\terror(\"Attempt to get sample from out-of-range channel!\", 2)\n\t\tend\n\t\ti = i * p.channels + (channel-1)\n\tend\n\n\tif not (i >= 0 and i < p.size/p.bytedepth) then\n\t\terror(\"Attempt to get out-of-range sample!\", 2)\n\tend\n\n\tif p.bytedepth == 2 then\n\t\t-- 16-bit data is stored as signed values internally.\n\t\treturn tonumber(p.pointer[i]) / p.maxvalue\n\telse\n\t\t-- 8-bit data is stored as unsigned values internally.\n\t\treturn (tonumber(p.pointer[i]) - 128) / 127\n\tend\nend\n\nfunction SoundData:setSample(i, channel, sample)\n\tif type(i) ~= \"number\" then error(\"bad argument #1 to SoundData:setSample (expected number)\", 2) end\n\tif sample ~= nil then\n\t\tif type(channel) ~= \"number\" then error(\"bad argument #2 to SoundData:setSample (expected number)\", 2) end\n\telse\n\t\tsample, channel = channel, nil\n\tend\n\tif type(sample) ~= \"number\" then error(\"bad argument #2 to SoundData:setSample (expected number)\", 2) end\n\n\ti = floor(i)\n\n\tlocal p = objectcache[self]\n\n\tif channel then\n\t\tif channel < 1 or channel > p.channels then\n\t\t\terror(\"Attempt to set sample from out-of-range channel!\", 2)\n\t\tend\n\t\ti = i * p.channels + (channel-1)\n\tend\n\n\tif not (i >= 0 and i < p.size/p.bytedepth) then\n\t\terror(\"Attempt to set out-of-range sample!\", 2)\n\tend\n\n\tif p.bytedepth == 2 then\n\t\t-- 16-bit data is stored as signed values internally.\n\t\tp.pointer[i] = sample * p.maxvalue\n\telse\n\t\t-- 8-bit data is stored as unsigned values internally.\n\t\t-- The float cast is needed to make values end up the same as in the\n\t\t-- C++ version of this method.\n\t\tp.pointer[i] = ffi.cast(float, (sample * 127) + 128)\n\tend\nend\n\nfunction SoundData:getBitDepth()\n\treturn objectcache[self].bytedepth * 8\nend\n\nfunction SoundData:getSampleCount()\n\treturn objectcache[self].samplecount\nend\n\nfunction SoundData:getSampleRate()\n\treturn objectcache[self].samplerate\nend\n\nfunction SoundData:getChannelCount()\n\treturn objectcache[self].channels\nend\n\nfunction SoundData:getDuration()\n\treturn objectcache[self].duration\nend\n\nfunction SoundData:release()\n\tobjectcache[self] = nil\n\treturn _release(self)\nend\n\n-- DO NOT REMOVE THE NEXT LINE. It is used to load this file as a C++ string.\n--)luastring\"--\"\n"
  },
  {
    "path": "src/modules/system/System.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"common/config.h\"\n#include \"System.h\"\n\n#if defined(LOVE_IOS)\n#include \"common/ios.h\"\n#elif defined(LOVE_ANDROID)\n#include \"common/android.h\"\n#endif\n\nnamespace love\n{\nnamespace system\n{\n\nSystem::System(const char *name)\n\t: Module(M_SYSTEM, name)\n{\n}\n\nconst char *System::getOS()\n{\n#if defined(LOVE_MACOS)\n\treturn \"OS X\";\n#elif defined(LOVE_IOS)\n\treturn \"iOS\";\n#elif defined(LOVE_WINDOWS_UWP)\n\treturn \"UWP\";\n#elif defined(LOVE_WINDOWS)\n\treturn \"Windows\";\n#elif defined(LOVE_ANDROID)\n\treturn \"Android\";\n#elif defined(LOVE_LINUX)\n\treturn \"Linux\";\n#else\n\treturn \"Unknown\";\n#endif\n}\n\nvoid System::vibrate(double seconds) const\n{\n#ifdef LOVE_ANDROID\n\tlove::android::vibrate(seconds);\n#elif defined(LOVE_IOS)\n\tlove::ios::vibrate();\n#else\n\tLOVE_UNUSED(seconds);\n#endif\n}\n\nbool System::hasBackgroundMusic() const\n{\n#if defined(LOVE_ANDROID)\n\treturn love::android::hasBackgroundMusic();\n#elif defined(LOVE_IOS)\n\treturn love::ios::hasBackgroundMusic();\n#else\n\treturn false;\n#endif\n}\n\nbool System::getConstant(const char *in, System::PowerState &out)\n{\n\treturn powerStates.find(in, out);\n}\n\nbool System::getConstant(System::PowerState in, const char *&out)\n{\n\treturn powerStates.find(in, out);\n}\n\nStringMap<System::PowerState, System::POWER_MAX_ENUM>::Entry System::powerEntries[] =\n{\n\t{\"unknown\", System::POWER_UNKNOWN},\n\t{\"battery\", System::POWER_BATTERY},\n\t{\"nobattery\", System::POWER_NO_BATTERY},\n\t{\"charging\", System::POWER_CHARGING},\n\t{\"charged\", System::POWER_CHARGED},\n};\n\nStringMap<System::PowerState, System::POWER_MAX_ENUM> System::powerStates(System::powerEntries, sizeof(System::powerEntries));\n\n} // system\n} // love\n"
  },
  {
    "path": "src/modules/system/System.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_SYSTEM_H\n#define LOVE_SYSTEM_H\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/Module.h\"\n#include \"common/StringMap.h\"\n\n// stdlib\n#include <string>\n\nnamespace love\n{\nnamespace system\n{\n\nclass System : public Module\n{\npublic:\n\n\tenum PowerState\n\t{\n\t\tPOWER_UNKNOWN,\n\t\tPOWER_BATTERY,\n\t\tPOWER_NO_BATTERY,\n\t\tPOWER_CHARGING,\n\t\tPOWER_CHARGED,\n\t\tPOWER_MAX_ENUM\n\t};\n\n\tSystem(const char *name);\n\tvirtual ~System() {}\n\n\t/**\n\t * Gets the current operating system.\n\t **/\n\tstatic const char *getOS();\n\n\t/**\n\t * Gets the number of reported CPU cores on the current system.\n\t * Does not account for technologies such as Hyperthreading: a 4-core\n\t * Hyperthreading-enabled Intel CPU will report 8, instead of 4.\n\t **/\n\tvirtual int getProcessorCount() const = 0;\n\n\t/**\n\t * Gets the amount of RAM configured in the system in MiB.\n\t **/\n\tvirtual int getMemorySize() const = 0;\n\n\t/**\n\t * Replaces the contents of the system's text clipboard with a string.\n\t * @param text The clipboard text to set.\n\t **/\n\tvirtual void setClipboardText(const std::string &text) const = 0;\n\n\t/**\n\t * Gets the contents of the system's text clipboard.\n\t **/\n\tvirtual std::string getClipboardText() const = 0;\n\n\t/**\n\t * Gets information about the system's power supply.\n\t *\n\t * @param[out] seconds Time in seconds of battery life left.\n\t *             -1 if a value can't be determined.\n\t * @param[out] percent The percentage of battery life left (0-100.)\n\t *             -1 if a value can't be determined.\n\t *\n\t * @return The current state of the battery.\n\t **/\n\tvirtual PowerState getPowerInfo(int &seconds, int &percent) const = 0;\n\n\t/**\n\t * Opens the specified URL with the user's default program to handle that\n\t * particular URL type.\n\t *\n\t * @param url The URL to open.\n\t *\n\t * @return Whether the URL was opened successfully.\n\t **/\n\tvirtual bool openURL(const std::string &url) const = 0;\n\n\t/**\n\t * Vibrates for the specified amount of seconds.\n\t *\n\t * @param number of seconds to vibrate.\n\t */\n\tvirtual void vibrate(double seconds) const;\n\n\t/**\n\t * Gets if the user is playing music on background.\n\t * Throws an exception on unsupported platforms.\n\t *\n\t * @return Whether a music is playing on background.\n\t **/\n\tbool hasBackgroundMusic() const;\n\n\t/**\n\t * Gets the list of locales in order of user preference.\n\t * \n\t * The returned string from this function has format of\n\t * xx_YY where 'xx' is ISO-639 language code and 'YY' is\n\t * the ISO-3166 country code if available. If country\n\t * code is unavailable, then it simply returns the language.\n\t * \n\t * @return List user preferred locales or empty if the current\n\t * platform does not support this function.\n\t */\n\tvirtual std::vector<std::string> getPreferredLocales() const = 0;\n\n\tstatic bool getConstant(const char *in, PowerState &out);\n\tstatic bool getConstant(PowerState in, const char *&out);\n\nprivate:\n\n\tstatic StringMap<PowerState, POWER_MAX_ENUM>::Entry powerEntries[];\n\tstatic StringMap<PowerState, POWER_MAX_ENUM> powerStates;\n\n}; // System\n\n} // system\n} // love\n\n#endif // LOVE_SYSTEM_H\n"
  },
  {
    "path": "src/modules/system/sdl/System.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"System.h\"\n#include \"window/Window.h\"\n\n// SDL\n#include <SDL3/SDL_clipboard.h>\n#include <SDL3/SDL_cpuinfo.h>\n#include <SDL3/SDL_locale.h>\n#include <SDL3/SDL_misc.h>\n\nnamespace love\n{\nnamespace system\n{\nnamespace sdl\n{\n\nSystem::System()\n\t: love::system::System(\"love.system.sdl\")\n{\n}\n\nint System::getProcessorCount() const\n{\n\treturn SDL_GetNumLogicalCPUCores();\n}\n\nint System::getMemorySize() const\n{\n\treturn SDL_GetSystemRAM();\n}\n\nbool System::isWindowOpen() const\n{\n\tauto window = Module::getInstance<window::Window>(M_WINDOW);\n\treturn window != nullptr && window->isOpen();\n}\n\nvoid System::setClipboardText(const std::string &text) const\n{\n\t// SDL requires the video subsystem to be initialized and a window to be\n\t// opened in order for clipboard text to work, on at least some platforms.\n\tif (!isWindowOpen())\n\t\tthrow love::Exception(\"A window must be created in order for setClipboardText to function properly.\");\n\n\tSDL_SetClipboardText(text.c_str());\n}\n\nstd::string System::getClipboardText() const\n{\n\tif (!isWindowOpen())\n\t\tthrow love::Exception(\"A window must be created in order for getClipboardText to function properly.\");\n\n\tstd::string text(\"\");\n\n\tchar *ctext = SDL_GetClipboardText();\n\tif (ctext)\n\t{\n\t\ttext = std::string(ctext);\n\t\tSDL_free(ctext);\n\t}\n\n\treturn text;\n}\n\nlove::system::System::PowerState System::getPowerInfo(int &seconds, int &percent) const\n{\n\tSDL_PowerState sdlstate = SDL_GetPowerInfo(&seconds, &percent);\n\n\tPowerState state = POWER_UNKNOWN;\n\tpowerStates.find(sdlstate, state);\n\n\treturn state;\n}\n\nbool System::openURL(const std::string &url) const\n{\n\treturn SDL_OpenURL(url.c_str());\n}\n\nstd::vector<std::string> System::getPreferredLocales() const\n{\n\tstd::vector<std::string> result;\n\n\tint count = 0;\n\tSDL_Locale **locales = SDL_GetPreferredLocales(&count);\n\tfor (int i = 0; i < count; i++)\n\t{\n\t\tSDL_Locale *locale = locales[i];\n\t\tif (locale->country)\n\t\t\tresult.push_back(std::string(locale->language) + \"_\" + std::string(locale->country));\n\t\telse\n\t\t\tresult.push_back(locale->language);\n\t}\n\tSDL_free(locales);\n\n\treturn result;\n}\n\nEnumMap<System::PowerState, SDL_PowerState, System::POWER_MAX_ENUM>::Entry System::powerEntries[] =\n{\n\t{System::POWER_UNKNOWN, SDL_POWERSTATE_UNKNOWN},\n\t{System::POWER_BATTERY, SDL_POWERSTATE_ON_BATTERY},\n\t{System::POWER_NO_BATTERY, SDL_POWERSTATE_NO_BATTERY},\n\t{System::POWER_CHARGING, SDL_POWERSTATE_CHARGING},\n\t{System::POWER_CHARGED, SDL_POWERSTATE_CHARGED},\n};\n\nEnumMap<System::PowerState, SDL_PowerState, System::POWER_MAX_ENUM> System::powerStates(System::powerEntries, sizeof(System::powerEntries));\n\n} // sdl\n} // system\n} // love\n"
  },
  {
    "path": "src/modules/system/sdl/System.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_SYSTEM_SDL_SYSTEM_H\n#define LOVE_SYSTEM_SDL_SYSTEM_H\n\n// LOVE\n#include \"system/System.h\"\n#include \"common/EnumMap.h\"\n\n// SDL\n#include <SDL3/SDL_power.h>\n\nnamespace love\n{\nnamespace system\n{\nnamespace sdl\n{\n\nclass System : public love::system::System\n{\npublic:\n\n\tSystem();\n\tvirtual ~System() {}\n\n\tint getProcessorCount() const override;\n\tint getMemorySize() const override;\n\n\tvoid setClipboardText(const std::string &text) const override;\n\tstd::string getClipboardText() const override;\n\n\tPowerState getPowerInfo(int &seconds, int &percent) const override;\n\tbool openURL(const std::string &url) const override;\n\tstd::vector<std::string> getPreferredLocales() const override;\n\nprivate:\n\n\tbool isWindowOpen() const;\n\n\tstatic EnumMap<PowerState, SDL_PowerState, POWER_MAX_ENUM>::Entry powerEntries[];\n\tstatic EnumMap<PowerState, SDL_PowerState, POWER_MAX_ENUM> powerStates;\n\n}; // System\n\n} // sdl\n} // system\n} // love\n\n#endif // LOVE_SYSTEM_SDL_SYSTEM_H\n"
  },
  {
    "path": "src/modules/system/wrap_System.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"wrap_System.h\"\n#include \"sdl/System.h\"\n\nnamespace love\n{\nnamespace system\n{\n\n#define instance() (Module::getInstance<System>(Module::M_SYSTEM))\n\nint w_getOS(lua_State *L)\n{\n\tluax_pushstring(L, System::getOS());\n\treturn 1;\n}\n\nint w_getProcessorCount(lua_State *L)\n{\n\tlua_pushinteger(L, instance()->getProcessorCount());\n\treturn 1;\n}\n\nint w_getMemorySize(lua_State *L)\n{\n\tlua_pushinteger(L, instance()->getMemorySize());\n\treturn 1;\n}\n\nint w_setClipboardText(lua_State *L)\n{\n\tconst char *text = luaL_checkstring(L, 1);\n\tluax_catchexcept(L, [&]() { instance()->setClipboardText(text); });\n\treturn 0;\n}\n\nint w_getClipboardText(lua_State *L)\n{\n\tstd::string text;\n\tluax_catchexcept(L, [&]() { text = instance()->getClipboardText(); });\n\tluax_pushstring(L, text);\n\treturn 1;\n}\n\nint w_getPowerInfo(lua_State *L)\n{\n\tint seconds = -1, percent = -1;\n\tconst char *str;\n\n\tSystem::PowerState state = instance()->getPowerInfo(seconds, percent);\n\n\tif (!System::getConstant(state, str))\n\t\tstr = \"unknown\";\n\n\tlua_pushstring(L, str);\n\n\tif (percent >= 0)\n\t\tlua_pushinteger(L, percent);\n\telse\n\t\tlua_pushnil(L);\n\n\tif (seconds >= 0)\n\t\tlua_pushinteger(L, seconds);\n\telse\n\t\tlua_pushnil(L);\n\n\treturn 3;\n}\n\nint w_openURL(lua_State *L)\n{\n\tstd::string url = luax_checkstring(L, 1);\n\tluax_pushboolean(L, instance()->openURL(url));\n\treturn 1;\n}\n\nint w_vibrate(lua_State *L)\n{\n\tdouble seconds = luaL_optnumber(L, 1, 0.5);\n\tinstance()->vibrate(seconds);\n\treturn 0;\n}\n\nint w_hasBackgroundMusic(lua_State *L)\n{\n\tlua_pushboolean(L, instance()->hasBackgroundMusic());\n\treturn 1;\n}\n\nint w_getPreferredLocales(lua_State* L)\n{\n\tint i = 1;\n\tstd::vector<std::string> locales = instance()->getPreferredLocales();\n\n\tlua_createtable(L, locales.size(), 0);\n\n\tfor (const std::string& str: locales)\n\t{\n\t\tluax_pushstring(L, str);\n\t\tlua_rawseti(L, -2, i++);\n\t}\n\n\treturn 1;\n}\n\nstatic const luaL_Reg functions[] =\n{\n\t{ \"getOS\", w_getOS },\n\t{ \"getProcessorCount\", w_getProcessorCount },\n\t{ \"getMemorySize\", w_getMemorySize },\n\t{ \"setClipboardText\", w_setClipboardText },\n\t{ \"getClipboardText\", w_getClipboardText },\n\t{ \"getPowerInfo\", w_getPowerInfo },\n\t{ \"openURL\", w_openURL },\n\t{ \"vibrate\", w_vibrate },\n\t{ \"hasBackgroundMusic\", w_hasBackgroundMusic },\n\t{ \"getPreferredLocales\", w_getPreferredLocales },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_love_system(lua_State *L)\n{\n\tSystem *instance = instance();\n\tif (instance == nullptr)\n\t{\n\t\tinstance = new love::system::sdl::System();\n\t}\n\telse\n\t\tinstance->retain();\n\n\tWrappedModule w;\n\tw.module = instance;\n\tw.name = \"system\";\n\tw.type = &Module::type;\n\tw.functions = functions;\n\tw.types = nullptr;\n\n\treturn luax_register_module(L, w);\n}\n\n} // system\n} // love\n"
  },
  {
    "path": "src/modules/system/wrap_System.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_WRAP_SYSTEM_H\n#define LOVE_WRAP_SYSTEM_H\n\n// LOVE\n#include \"System.h\"\n#include \"common/runtime.h\"\n\nnamespace love\n{\nnamespace system\n{\n\nextern \"C\" LOVE_EXPORT int luaopen_love_system(lua_State *L);\n\n} // system\n} // love\n\n#endif // LOVE_WRAP_SYSTEM_H\n"
  },
  {
    "path": "src/modules/thread/Channel.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Channel.h\"\n\n#include <timer/Timer.h>\n\nnamespace love\n{\nnamespace thread\n{\n\nlove::Type Channel::type(\"Channel\", &Object::type);\n\nChannel::Channel()\n\t: sent(0)\n\t, received(0)\n{\n}\n\nChannel::~Channel()\n{\n}\n\nuint64 Channel::push(const Variant &var)\n{\n\tLock l(mutex);\n\n\tqueue.push(var);\n\tcond->broadcast();\n\n\treturn ++sent;\n}\n\nbool Channel::supply(const Variant &var)\n{\n\tLock l(mutex);\n\tuint64 id = push(var);\n\n\twhile (received < id)\n\t\tcond->wait(mutex);\n\n\treturn true;\n}\n\nbool Channel::supply(const Variant &var, double timeout)\n{\n\tLock l(mutex);\n\tuint64 id = push(var);\n\n\twhile (timeout >= 0)\n\t{\n\t\tif (received >= id)\n\t\t\treturn true;\n\n\t\tdouble start = love::timer::Timer::getTime();\n\t\tcond->wait(mutex, timeout*1000);\n\t\tdouble stop = love::timer::Timer::getTime();\n\n\t\ttimeout -= (stop-start);\n\t}\n\n\treturn false;\n}\n\nbool Channel::pop(Variant *var)\n{\n\tLock l(mutex);\n\n\tif (queue.empty())\n\t\treturn false;\n\n\t*var = queue.front();\n\tqueue.pop();\n\n\treceived++;\n\tcond->broadcast();\n\n\treturn true;\n}\n\nbool Channel::demand(Variant *var)\n{\n\tLock l(mutex);\n\n\twhile (!pop(var))\n\t\tcond->wait(mutex);\n\n\treturn true;\n}\n\nbool Channel::demand(Variant *var, double timeout)\n{\n\tLock l(mutex);\n\n\twhile (timeout >= 0)\n\t{\n\t\tif (pop(var))\n\t\t\treturn true;\n\n\t\tdouble start = love::timer::Timer::getTime();\n\t\tcond->wait(mutex, timeout*1000);\n\t\tdouble stop = love::timer::Timer::getTime();\n\n\t\ttimeout -= (stop-start);\n\t}\n\n\treturn false;\n}\n\nbool Channel::peek(Variant *var)\n{\n\tLock l(mutex);\n\n\tif (queue.empty())\n\t\treturn false;\n\n\t*var = queue.front();\n\treturn true;\n}\n\nint Channel::getCount() const\n{\n\tLock l(mutex);\n\treturn (int) queue.size();\n}\n\nbool Channel::hasRead(uint64 id) const\n{\n\tLock l(mutex);\n\treturn received >= id;\n}\n\nvoid Channel::clear()\n{\n\tLock l(mutex);\n\n\t// We're already empty.\n\tif (queue.empty())\n\t\treturn;\n\n\twhile (!queue.empty())\n\t\tqueue.pop();\n\n\t// Finish all the supply waits\n\treceived = sent;\n\tcond->broadcast();\n}\n\nvoid Channel::lockMutex()\n{\n\tmutex->lock();\n}\n\nvoid Channel::unlockMutex()\n{\n\tmutex->unlock();\n}\n\n} // thread\n} // love\n"
  },
  {
    "path": "src/modules/thread/Channel.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_THREAD_CHANNEL_H\n#define LOVE_THREAD_CHANNEL_H\n\n// STL\n#include <queue>\n\n// LOVE\n#include \"common/Variant.h\"\n#include \"common/int.h\"\n#include \"threads.h\"\n\nnamespace love\n{\nnamespace thread\n{\n\nclass Channel : public love::Object\n{\npublic:\n\n\tstatic love::Type type;\n\n\tChannel();\n\t~Channel();\n\n\tuint64 push(const Variant &var);\n\tbool supply(const Variant &var); // blocking push\n\tbool supply(const Variant &var, double timeout);\n\tbool pop(Variant *var);\n\tbool demand(Variant *var); // blocking pop\n\tbool demand(Variant *var, double timeout); // blocking pop\n\tbool peek(Variant *var);\n\tint getCount() const;\n\tbool hasRead(uint64 id) const;\n\tvoid clear();\n\n\tvoid lockMutex();\n\tvoid unlockMutex();\n\nprivate:\n\n\tMutexRef mutex;\n\tConditionalRef cond;\n\tstd::queue<Variant> queue;\n\n\tuint64 sent;\n\tuint64 received;\n\n}; // Channel\n\n} // thread\n} // love\n\n#endif // LOVE_THREAD_CHANNEL_H\n"
  },
  {
    "path": "src/modules/thread/LuaThread.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"LuaThread.h\"\n#include \"event/Event.h\"\n#include \"common/config.h\"\n#include \"common/runtime.h\"\n\n#ifdef LOVE_BUILD_STANDALONE\nextern \"C\" int luaopen_love(lua_State * L);\nextern \"C\" int luaopen_love_jitsetup(lua_State * L);\n#endif // LOVE_BUILD_STANDALONE\n\nnamespace love\n{\nnamespace thread\n{\n\nlove::Type LuaThread::type(\"Thread\", &Threadable::type);\n\nLuaThread::LuaThread(const std::string &name, love::Data *code)\n\t: code(code)\n\t, name(name)\n\t, haserror(false)\n{\n\tthreadName = name;\n}\n\nLuaThread::~LuaThread()\n{\n}\n\nvoid LuaThread::threadFunction()\n{\n\terror.clear();\n\thaserror = false;\n\n\tlua_State *L = luaL_newstate();\n\tluaL_openlibs(L);\n\n#ifdef LOVE_BUILD_STANDALONE\n\t// Call LuaJIT-specific setup again. While it's quite late to call it at\n\t// this point, it still needed to turn off JIT compilation (if necessary)\n\t// for this thread.\n\tluax_preload(L, luaopen_love_jitsetup, \"love.jitsetup\");\n\tluax_require(L, \"love.jitsetup\");\n\tlua_pop(L, 1);\n\n\tluax_preload(L, luaopen_love, \"love\");\n\tluax_require(L, \"love\");\n\tlua_pop(L, 1);\n#endif // LOVE_BUILD_STANDALONE\n\n\tluax_require(L, \"love.thread\");\n\tlua_pop(L, 1);\n\n\t// We load love.filesystem by default, since require still exists without it\n\t// but won't load files from the proper paths. love.filesystem also must be\n\t// loaded before using any love function that can take a filepath argument.\n\tluax_require(L, \"love.filesystem\");\n\tlua_pop(L, 1);\n\n\tlua_pushcfunction(L, luax_traceback);\n\tint tracebackidx = lua_gettop(L);\n\n\tif (luaL_loadbuffer(L, (const char *) code->getData(), code->getSize(), name.c_str()) != 0)\n\t{\n\t\terror = luax_tostring(L, -1);\n\t\thaserror = true;\n\t}\n\telse\n\t{\n\t\tint pushedargs = (int) args.size();\n\n\t\tfor (int i = 0; i < pushedargs; i++)\n\t\t\tluax_pushvariant(L, args[i]);\n\n\t\targs.clear();\n\n\t\tif (lua_pcall(L, pushedargs, 0, tracebackidx) != 0)\n\t\t{\n\t\t\terror = luax_tostring(L, -1);\n\t\t\thaserror = true;\n\t\t}\n\t}\n\n\tlua_close(L);\n\n\tif (haserror)\n\t\tonError();\n}\n\nbool LuaThread::start(const std::vector<Variant> &args)\n{\n\tif (isRunning())\n\t\treturn false;\n\n\tthis->args = args;\n\terror.clear();\n\thaserror = false;\n\t\n\treturn Threadable::start();\n}\n\nconst std::string &LuaThread::getError() const\n{\n\treturn error;\n}\n\nvoid LuaThread::onError()\n{\n\tauto eventmodule = Module::getInstance<event::Event>(Module::M_EVENT);\n\tif (!eventmodule)\n\t\treturn;\n\n\tstd::vector<Variant> vargs = {\n\t\tVariant(&LuaThread::type, this),\n\t\tVariant(error.c_str(), error.length())\n\t};\n\n\tStrongRef<event::Message> msg(new event::Message(\"threaderror\", vargs), Acquire::NORETAIN);\n\teventmodule->push(msg);\n}\n\n} // thread\n} // love\n"
  },
  {
    "path": "src/modules/thread/LuaThread.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_THREAD_LUATHREAD_H\n#define LOVE_THREAD_LUATHREAD_H\n\n// STL\n#include <string>\n#include <vector>\n\n// LOVE\n#include \"common/Data.h\"\n#include \"common/Object.h\"\n#include \"common/Variant.h\"\n#include \"threads.h\"\n\nnamespace love\n{\nnamespace thread\n{\n\nclass LuaThread : public Threadable\n{\npublic:\n\n\tstatic love::Type type;\n\n\tLuaThread(const std::string &name, love::Data *code);\n\tvirtual ~LuaThread();\n\tvoid threadFunction();\n\tconst std::string &getError() const;\n\tbool hasError() const { return haserror; }\n\n\tbool start(const std::vector<Variant> &args);\n\nprivate:\n\n\tvoid onError();\n\n\tStrongRef<love::Data> code;\n\tstd::string name;\n\tstd::string error;\n\tbool haserror;\n\n\tstd::vector<Variant> args;\n\n}; // LuaThread\n\n} // thread\n} // love\n\n#endif // LOVE_THREAD_LUATHREAD_H\n"
  },
  {
    "path": "src/modules/thread/Thread.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_THREAD_THREAD_H\n#define LOVE_THREAD_THREAD_H\n\n// LOVE\n#include \"common/Object.h\"\n\nnamespace love\n{\nnamespace thread\n{\n\nclass Thread\n{\npublic:\n\n\tvirtual ~Thread() {}\n\tvirtual bool start() = 0;\n\tvirtual void wait() = 0;\n\tvirtual bool isRunning() = 0;\n\n}; // Thread\n\n} // thread\n} // love\n\n#endif // LOVE_THREAD_THREAD_H\n"
  },
  {
    "path": "src/modules/thread/ThreadModule.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"ThreadModule.h\"\n\nnamespace love\n{\nnamespace thread\n{\n\nThreadModule::ThreadModule()\n\t: love::Module(M_THREAD, \"love.thread.sdl\")\n{\n}\n\nLuaThread *ThreadModule::newThread(const std::string &name, love::Data *data)\n{\n\treturn new LuaThread(name, data);\n}\n\nChannel *ThreadModule::newChannel()\n{\n\treturn new Channel();\n}\n\nChannel *ThreadModule::getChannel(const std::string &name)\n{\n\tLock lock(namedChannelMutex);\n\n\tauto it = namedChannels.find(name);\n\tif (it != namedChannels.end())\n\t\treturn it->second;\n\n\tChannel *c = new Channel();\n\tnamedChannels[name].set(c, Acquire::NORETAIN);\n\treturn c;\n}\n\n} // thread\n} // love\n"
  },
  {
    "path": "src/modules/thread/ThreadModule.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_THREAD_THREADMODULE_H\n#define LOVE_THREAD_THREADMODULE_H\n\n// STL\n#include <string>\n#include <map>\n\n// LOVE\n#include \"common/Data.h\"\n#include \"common/Module.h\"\n#include \"common/StringMap.h\"\n\n#include \"Thread.h\"\n#include \"Channel.h\"\n#include \"LuaThread.h\"\n#include \"threads.h\"\n\nnamespace love\n{\nnamespace thread\n{\nclass ThreadModule : public love::Module\n{\npublic:\n\n\tThreadModule();\n\tvirtual ~ThreadModule() {}\n\tvirtual LuaThread *newThread(const std::string &name, love::Data *data);\n\tvirtual Channel *newChannel();\n\tvirtual Channel *getChannel(const std::string &name);\n\nprivate:\n\n\tstd::map<std::string, StrongRef<Channel>> namedChannels;\n\tMutexRef namedChannelMutex;\n\n}; // ThreadModule\n\n} // thread\n} // love\n\n#endif // LOVE_THREAD_THREADMODULE_H\n"
  },
  {
    "path": "src/modules/thread/sdl/Thread.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Thread.h\"\n\nnamespace love\n{\nnamespace thread\n{\nnamespace sdl\n{\nThread::Thread(Threadable *t)\n\t: t(t)\n\t, running(false)\n\t, thread(nullptr)\n{\n}\n\nThread::~Thread()\n{\n\t// Clean up handle\n\tif (thread)\n\t\tSDL_DetachThread(thread);\n}\n\nbool Thread::start()\n{\n#if defined(LOVE_LINUX)\n\t// Temporarly block signals, as the thread inherits this mask\n\tlove::thread::ScopedDisableSignals disableSignals;\n#endif\n\n\tLock l(mutex);\n\n\tif (running)\n\t\treturn false;\n\n\tif (thread) // Clean old handle up\n\t\tSDL_WaitThread(thread, nullptr);\n\n\t// Keep the threadable around until the thread is done with it.\n\t// This is done before thread_runner executes because there can be a delay\n\t// between CreateThread and the start of the thread code's execution.\n\tt->retain();\n\n\tthread = SDL_CreateThread(thread_runner, t->getThreadName(), this);\n\trunning = (thread != nullptr);\n\n\tif (!running)\n\t\tt->release(); // thread_runner is never called in this situation.\n\n\treturn running;\n}\n\nvoid Thread::wait()\n{\n\t{\n\t\tLock l(mutex);\n\t\tif (!thread)\n\t\t\treturn;\n\t}\n\tSDL_WaitThread(thread, nullptr);\n\tLock l(mutex);\n\trunning = false;\n\tthread = nullptr;\n}\n\nbool Thread::isRunning()\n{\n\tLock l(mutex);\n\treturn running;\n}\n\nint Thread::thread_runner(void *data)\n{\n\tThread *self = (Thread *) data; // some compilers don't like 'this'\n\n\tself->t->threadFunction();\n\n\t{\n\t\tLock l(self->mutex);\n\t\tself->running = false;\n\t}\n\n\t// This was retained in start().\n\tself->t->release();\n\treturn 0;\n}\n} // sdl\n} // thread\n} // love\n"
  },
  {
    "path": "src/modules/thread/sdl/Thread.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_THREAD_SDL_THREAD_H\n#define LOVE_THREAD_SDL_THREAD_H\n\n// LOVE\n#include \"thread/Thread.h\"\n#include \"threads.h\"\n\n// SDL\n#include <SDL3/SDL_thread.h>\n\nnamespace love\n{\nnamespace thread\n{\nnamespace sdl\n{\n\nclass Thread : public thread::Thread\n{\npublic:\n\n\tThread(Threadable *t);\n\t~Thread();\n\tbool start();\n\tvoid wait();\n\tbool isRunning();\n\nprivate:\n\n\tThreadable *t;\n\tbool running;\n\tSDL_Thread *thread;\n\tMutex mutex;\n\n\tstatic int thread_runner(void *data);\n\n}; // Thread\n\n} // sdl\n} // thread\n} // love\n\n#endif // LOVE_THREAD_SDL_THREAD_H\n"
  },
  {
    "path": "src/modules/thread/sdl/threads.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"threads.h\"\n#include \"Thread.h\"\n\nnamespace love\n{\nnamespace thread\n{\nnamespace sdl\n{\n\nMutex::Mutex()\n{\n\tmutex = SDL_CreateMutex();\n}\n\nMutex::~Mutex()\n{\n\tSDL_DestroyMutex(mutex);\n}\n\nvoid Mutex::lock()\n{\n\tSDL_LockMutex(mutex);\n}\n\nvoid Mutex::unlock()\n{\n\tSDL_UnlockMutex(mutex);\n}\n\nConditional::Conditional()\n{\n\tcond = SDL_CreateCondition();\n}\n\nConditional::~Conditional()\n{\n\tSDL_DestroyCondition(cond);\n}\n\nvoid Conditional::signal()\n{\n\tSDL_SignalCondition(cond);\n}\n\nvoid Conditional::broadcast()\n{\n\tSDL_BroadcastCondition(cond);\n}\n\nbool Conditional::wait(thread::Mutex *_mutex, int timeout)\n{\n\t// Yes, I realise this can be dangerous,\n\t// however, you're asking for it if you're\n\t// mixing thread implementations.\n\tMutex *mutex = (Mutex *) _mutex;\n\tif (timeout < 0)\n\t{\n\t\tSDL_WaitCondition(cond, mutex->mutex);\n\t\treturn true;\n\t}\n\telse\n\t\treturn SDL_WaitConditionTimeout(cond, mutex->mutex, timeout);\n}\n\n} // sdl\n\n\n/**\n * Implementations of the functions declared in src/modules/threads.h.\n **/\n\nthread::Mutex *newMutex()\n{\n\treturn new sdl::Mutex();\n}\n\nthread::Conditional *newConditional()\n{\n\treturn new sdl::Conditional();\n}\n\nthread::Thread *newThread(Threadable *t)\n{\n\treturn new sdl::Thread(t);\n}\n\n} // thread\n} // love\n"
  },
  {
    "path": "src/modules/thread/sdl/threads.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_THREAD_SDL_THREADS_H\n#define LOVE_THREAD_SDL_THREADS_H\n\n#include \"common/config.h\"\n#include \"thread/threads.h\"\n\n#include <SDL3/SDL_thread.h>\n#include <SDL3/SDL_mutex.h>\n\nnamespace love\n{\nnamespace thread\n{\nnamespace sdl\n{\n\nclass Conditional;\n\nclass Mutex : public thread::Mutex\n{\npublic:\n\n\tMutex();\n\t~Mutex();\n\n\tvoid lock();\n\tvoid unlock();\n\nprivate:\n\n\tSDL_Mutex *mutex;\n\tMutex(const Mutex&/* mutex*/) {}\n\n\tfriend class Conditional;\n\n}; // Mutex\n\nclass Conditional : public thread::Conditional\n{\npublic:\n\n\tConditional();\n\t~Conditional();\n\n\tvoid signal();\n\tvoid broadcast();\n\tbool wait(thread::Mutex *mutex, int timeout=-1);\n\nprivate:\n\n\tSDL_Condition *cond;\n\n}; // Conditional\n\n} // sdl\n} // thread\n} // love\n\n#endif /* LOVE_THREAD_SDL_THREADS_H */\n"
  },
  {
    "path": "src/modules/thread/threads.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"threads.h\"\n\n#if defined(LOVE_LINUX)\n#include <signal.h>\n#endif\n\nnamespace love\n{\nnamespace thread\n{\n\nLock::Lock(Mutex *m)\n\t: mutex(m)\n{\n\tmutex->lock();\n}\n\nLock::Lock(Mutex &m)\n\t: mutex(&m)\n{\n\tmutex->lock();\n}\n\nLock::Lock(Lock &&other)\n{\n\tmutex = other.mutex;\n\tother.mutex = nullptr;\n}\n\nLock::~Lock()\n{\n\tif (mutex)\n\t\tmutex->unlock();\n}\n\nEmptyLock::EmptyLock()\n\t: mutex(nullptr)\n{\n}\n\nEmptyLock::~EmptyLock()\n{\n\tif (mutex)\n\t\tmutex->unlock();\n}\n\nvoid EmptyLock::setLock(Mutex *m)\n{\n\tif (m)\n\t\tm->lock();\n\n\tif (mutex)\n\t\tmutex->unlock();\n\n\tmutex = m;\n}\n\nvoid EmptyLock::setLock(Mutex &m)\n{\n\tm.lock();\n\n\tif (mutex)\n\t\tmutex->unlock();\n\n\tmutex = &m;\n}\n\nlove::Type Threadable::type(\"Threadable\", &Object::type);\n\nThreadable::Threadable()\n{\n\towner = newThread(this);\n}\n\nThreadable::~Threadable()\n{\n\tdelete owner;\n}\n\nbool Threadable::start()\n{\n\treturn owner->start();\n}\n\nvoid Threadable::wait()\n{\n\towner->wait();\n}\n\nbool Threadable::isRunning() const\n{\n\treturn owner->isRunning();\n}\n\nconst char *Threadable::getThreadName() const\n{\n\treturn threadName.empty() ? nullptr : threadName.c_str();\n}\n\nMutexRef::MutexRef()\n\t: mutex(newMutex())\n{\n}\n\nMutexRef::~MutexRef()\n{\n\tdelete mutex;\n}\n\nMutexRef::operator Mutex*() const\n{\n\treturn mutex;\n}\n\nMutex *MutexRef::operator->() const\n{\n\treturn mutex;\n}\n\nConditionalRef::ConditionalRef()\n\t: conditional(newConditional())\n{\n}\n\nConditionalRef::~ConditionalRef()\n{\n\tdelete conditional;\n}\n\nConditionalRef::operator Conditional*() const\n{\n\treturn conditional;\n}\n\nConditional *ConditionalRef::operator->() const\n{\n\treturn conditional;\n}\n\n#if defined(LOVE_LINUX)\nstatic sigset_t oldset;\n\nvoid disableSignals()\n{\n\tsigset_t newset;\n\tsigfillset(&newset);\n\tpthread_sigmask(SIG_SETMASK, &newset, &oldset);\n}\n\nvoid reenableSignals()\n{\n\tpthread_sigmask(SIG_SETMASK, &oldset, nullptr);\n}\n#endif\n\n} // thread\n} // love\n"
  },
  {
    "path": "src/modules/thread/threads.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_THREAD_THREADS_H\n#define LOVE_THREAD_THREADS_H\n\n// LOVE\n#include \"common/config.h\"\n#include \"Thread.h\"\n\n// C++\n#include <string>\n\nnamespace love\n{\nnamespace thread\n{\n\nclass Mutex\n{\npublic:\n\tvirtual ~Mutex() {}\n\n\tvirtual void lock() = 0;\n\tvirtual void unlock() = 0;\n};\n\nclass Conditional\n{\npublic:\n\tvirtual ~Conditional() {}\n\n\tvirtual void signal() = 0;\n\tvirtual void broadcast() = 0;\n\tvirtual bool wait(Mutex *mutex, int timeout=-1) = 0;\n};\n\nclass Lock\n{\npublic:\n\tLock(Mutex *m);\n\tLock(Mutex &m);\n\tLock(Lock &&other);\n\t~Lock();\n\nprivate:\n\tMutex *mutex;\n};\n\nclass EmptyLock\n{\npublic:\n\tEmptyLock();\n\t~EmptyLock();\n\n\tvoid setLock(Mutex *m);\n\tvoid setLock(Mutex &m);\n\nprivate:\n\tMutex *mutex;\n};\n\nclass Threadable : public love::Object\n{\npublic:\n\tstatic love::Type type;\n\n\tThreadable();\n\tvirtual ~Threadable();\n\n\tvirtual void threadFunction() = 0;\n\n\tbool start();\n\tvoid wait();\n\tbool isRunning() const;\n\tconst char *getThreadName() const;\n\nprotected:\n\n\tThread *owner;\n\tstd::string threadName;\n\n};\n\nclass MutexRef\n{\npublic:\n\tMutexRef();\n\t~MutexRef();\n\n\toperator Mutex*() const;\n\tMutex *operator->() const;\n\nprivate:\n\tMutex *mutex;\n};\n\nclass ConditionalRef\n{\npublic:\n\tConditionalRef();\n\t~ConditionalRef();\n\n\toperator Conditional*() const;\n\tConditional *operator->() const;\n\nprivate:\n\tConditional *conditional;\n};\n\nMutex *newMutex();\nConditional *newConditional();\nThread *newThread(Threadable *t);\n\n#if defined(LOVE_LINUX)\nvoid disableSignals();\nvoid reenableSignals();\n\nstruct ScopedDisableSignals\n{\n\tScopedDisableSignals() { disableSignals(); }\n\t~ScopedDisableSignals() { reenableSignals(); }\n};\n#endif\n\n} // thread\n} // love\n\n#endif /* LOVE_THREAD_THREADS_H */\n"
  },
  {
    "path": "src/modules/thread/wrap_Channel.cpp",
    "content": "/**\n* Copyright (c) 2006-2010 LOVE Development Team\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n*\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n*\n* 1. The origin of this software must not be misrepresented; you must not\n*    claim that you wrote the original software. If you use this software\n*    in a product, an acknowledgment in the product documentation would be\n*    appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n*    misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n**/\n\n#include \"wrap_Channel.h\"\n\nnamespace love\n{\nnamespace thread\n{\n\nChannel *luax_checkchannel(lua_State *L, int idx)\n{\n\treturn luax_checktype<Channel>(L, idx);\n}\n\nint w_Channel_push(lua_State *L)\n{\n\tChannel *c = luax_checkchannel(L, 1);\n\tluax_catchexcept(L, [&]() {\n\t\tVariant var = luax_checkvariant(L, 2);\n\t\tif (var.getType() == Variant::UNKNOWN)\n\t\t\tluaL_argerror(L, 2, \"boolean, number, string, love type, or table expected\");\n\t\tuint64 id = c->push(var);\n\t\tlua_pushnumber(L, (lua_Number) id);\n\t});\n\treturn 1;\n}\n\nint w_Channel_supply(lua_State *L)\n{\n\tChannel *c = luax_checkchannel(L, 1);\n\tbool result = false;\n\tluax_catchexcept(L, [&]() {\n\t\tVariant var = luax_checkvariant(L, 2);\n\t\tif (var.getType() == Variant::UNKNOWN)\n\t\t\tluaL_argerror(L, 2, \"boolean, number, string, love type, or table expected\");\n\t\tif (lua_isnumber(L, 3))\n\t\t\tresult = c->supply(var, lua_tonumber(L, 3));\n\t\telse\n\t\t\tresult = c->supply(var);\n\t});\n\n\tluax_pushboolean(L, result);\n\treturn 1;\n}\n\nint w_Channel_pop(lua_State *L)\n{\n\tChannel *c = luax_checkchannel(L, 1);\n\tVariant var;\n\tif (c->pop(&var))\n\t\tluax_pushvariant(L, var);\n\telse\n\t\tlua_pushnil(L);\n\treturn 1;\n}\n\nint w_Channel_demand(lua_State *L)\n{\n\tChannel *c = luax_checkchannel(L, 1);\n\tVariant var;\n\tbool result = false;\n\n\tif (lua_isnumber(L, 2))\n\t\tresult = c->demand(&var, lua_tonumber(L, 2));\n\telse\n\t\tresult = c->demand(&var);\n\n\tif (result)\n\t\tluax_pushvariant(L, var);\n\telse\n\t\tlua_pushnil(L);\n\treturn 1;\n}\n\nint w_Channel_peek(lua_State *L)\n{\n\tChannel *c = luax_checkchannel(L, 1);\n\tVariant var;\n\tif (c->peek(&var))\n\t\tluax_pushvariant(L, var);\n\telse\n\t\tlua_pushnil(L);\n\treturn 1;\n}\n\nint w_Channel_getCount(lua_State *L)\n{\n\tChannel *c = luax_checkchannel(L, 1);\n\tlua_pushnumber(L, c->getCount());\n\treturn 1;\n}\n\nint w_Channel_hasRead(lua_State *L)\n{\n\tChannel *c = luax_checkchannel(L, 1);\n\tuint64 id = (uint64) luaL_checknumber(L, 2);\n\tluax_pushboolean(L, c->hasRead(id));\n\treturn 1;\n}\n\nint w_Channel_clear(lua_State *L)\n{\n\tChannel *c = luax_checkchannel(L, 1);\n\tc->clear();\n\treturn 0;\n}\n\nint w_Channel_performAtomic(lua_State *L)\n{\n\tChannel *c = luax_checkchannel(L, 1);\n\tluaL_checktype(L, 2, LUA_TFUNCTION);\n\n\t// Pass this channel as an argument to the function.\n\tlua_pushvalue(L, 1);\n\tlua_insert(L, 3);\n\n\tc->lockMutex();\n\n\t// call the function, passing the channel as the first argument and any\n\t// user-specified arguments after.\n\tint numargs = lua_gettop(L) - 2;\n\tint err = lua_pcall(L, numargs, LUA_MULTRET, 0);\n\n\tc->unlockMutex();\n\n\t// Unfortunately, this eats the stack trace, too bad.\n\tif (err != 0)\n\t\treturn lua_error(L);\n\n\t// The function and everything after it in the stack are eaten by the pcall,\n\t// leaving only the Channel argument. Everything else is a return value.\n\treturn lua_gettop(L) - 1;\n}\n\nstatic const luaL_Reg w_Channel_functions[] =\n{\n\t{ \"push\", w_Channel_push },\n\t{ \"supply\", w_Channel_supply },\n\t{ \"pop\", w_Channel_pop },\n\t{ \"demand\", w_Channel_demand },\n\t{ \"peek\", w_Channel_peek },\n\t{ \"getCount\", w_Channel_getCount },\n\t{ \"hasRead\", w_Channel_hasRead },\n\t{ \"clear\", w_Channel_clear },\n\t{ \"performAtomic\", w_Channel_performAtomic },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_channel(lua_State *L)\n{\n\treturn luax_register_type(L, &Channel::type, w_Channel_functions, nullptr);\n}\n\n} // thread\n} // love\n"
  },
  {
    "path": "src/modules/thread/wrap_Channel.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_THREAD_WRAP_CHANNEL_H\n#define LOVE_THREAD_WRAP_CHANNEL_H\n\n// LOVE\n#include \"Channel.h\"\n#include \"common/runtime.h\"\n\nnamespace love\n{\nnamespace thread\n{\n\nChannel *luax_checkchannel(lua_State *L, int idx);\nextern \"C\" int luaopen_channel(lua_State *L);\n\n} // thread\n} // love\n\n#endif // LOVE_THREAD_WRAP_CHANNEL_H\n"
  },
  {
    "path": "src/modules/thread/wrap_LuaThread.cpp",
    "content": "/**\n * Copyright (c) 2006-2010 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_LuaThread.h\"\n\nnamespace love\n{\nnamespace thread\n{\n\nLuaThread *luax_checkthread(lua_State *L, int idx)\n{\n\treturn luax_checktype<LuaThread>(L, idx);\n}\n\nint w_Thread_start(lua_State *L)\n{\n\tLuaThread *t = luax_checkthread(L, 1);\n\tstd::vector<Variant> args;\n\tint nargs = lua_gettop(L) - 1;\n\n\tfor (int i = 0; i < nargs; ++i)\n\t{\n\t\tluax_catchexcept(L, [&]() {\n\t\t\targs.push_back(luax_checkvariant(L, i+2));\n\t\t});\n\n\t\tif (args.back().getType() == Variant::UNKNOWN)\n\t\t{\n\t\t\targs.clear();\n\t\t\treturn luaL_argerror(L, i+2, \"boolean, number, string, love type, or flat table expected\");\n\t\t}\n\t}\n\n\tluax_pushboolean(L, t->start(args));\n\treturn 1;\n}\n\nint w_Thread_wait(lua_State *L)\n{\n\tLuaThread *t = luax_checkthread(L, 1);\n\tt->wait();\n\treturn 0;\n}\n\nint w_Thread_getError(lua_State *L)\n{\n\tLuaThread *t = luax_checkthread(L, 1);\n\tif (t->hasError())\n\t\tluax_pushstring(L, t->getError());\n\telse\n\t\tlua_pushnil(L);\n\treturn 1;\n}\n\nint w_Thread_isRunning(lua_State *L)\n{\n\tLuaThread *t = luax_checkthread(L, 1);\n\tluax_pushboolean(L, t->isRunning());\n\treturn 1;\n}\n\nstatic const luaL_Reg w_Thread_functions[] =\n{\n\t{ \"start\", w_Thread_start },\n\t{ \"wait\", w_Thread_wait },\n\t{ \"getError\", w_Thread_getError },\n\t{ \"isRunning\", w_Thread_isRunning },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_thread(lua_State *L)\n{\n\treturn luax_register_type(L, &LuaThread::type, w_Thread_functions, nullptr);\n}\n\n} // thread\n} // love\n"
  },
  {
    "path": "src/modules/thread/wrap_LuaThread.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_THREAD_WRAP_LUATHREAD_H\n#define LOVE_THREAD_WRAP_LUATHREAD_H\n\n// LOVE\n#include \"ThreadModule.h\"\n#include \"common/runtime.h\"\n\nnamespace love\n{\nnamespace thread\n{\n\nLuaThread *luax_checkthread(lua_State *L, int idx);\nextern \"C\" int luaopen_thread(lua_State *L);\n\n} // thread\n} // love\n\n#endif // LOVE_THREAD_WRAP_LUATHREAD_H\n"
  },
  {
    "path": "src/modules/thread/wrap_ThreadModule.cpp",
    "content": "/**\n* Copyright (c) 2006-2010 LOVE Development Team\n*\n* This software is provided 'as-is', without any express or implied\n* warranty.  In no event will the authors be held liable for any damages\n* arising from the use of this software.\n*\n* Permission is granted to anyone to use this software for any purpose,\n* including commercial applications, and to alter it and redistribute it\n* freely, subject to the following restrictions:\n*\n* 1. The origin of this software must not be misrepresented; you must not\n*    claim that you wrote the original software. If you use this software\n*    in a product, an acknowledgment in the product documentation would be\n*    appreciated but is not required.\n* 2. Altered source versions must be plainly marked as such, and must not be\n*    misrepresented as being the original software.\n* 3. This notice may not be removed or altered from any source distribution.\n**/\n\n// LOVE\n#include \"wrap_ThreadModule.h\"\n#include \"wrap_LuaThread.h\"\n#include \"wrap_Channel.h\"\n#include \"ThreadModule.h\"\n\n#include \"filesystem/File.h\"\n#include \"filesystem/FileData.h\"\n\n// C\n#include <cstring>\n\nnamespace love\n{\nnamespace thread\n{\n\n#define instance() (Module::getInstance<ThreadModule>(Module::M_THREAD))\n\nint w_newThread(lua_State *L)\n{\n\tstd::string name = \"Thread code\";\n\tlove::Data *data = nullptr;\n\n\tif (lua_isstring(L, 1))\n\t{\n\t\tsize_t slen = 0;\n\t\tconst char *str = lua_tolstring(L, 1, &slen);\n\n\t\t// Treat the string as Lua code if it's long or has a newline.\n\t\tif (slen >= 1024 || memchr(str, '\\n', slen))\n\t\t{\n\t\t\t// Construct a FileData from the string.\n\t\t\tlua_pushvalue(L, 1);\n\t\t\tlua_pushstring(L, \"string\");\n\t\t\tint idxs[] = {lua_gettop(L) - 1, lua_gettop(L)};\n\t\t\tluax_convobj(L, idxs, 2, \"filesystem\", \"newFileData\");\n\t\t\tlua_pop(L, 1);\n\t\t\tlua_replace(L, 1);\n\t\t}\n\t\telse\n\t\t\tluax_convobj(L, 1, \"filesystem\", \"newFileData\");\n\t}\n\telse if (luax_istype(L, 1, love::filesystem::File::type))\n\t\tluax_convobj(L, 1, \"filesystem\", \"newFileData\");\n\n\tif (luax_istype(L, 1, love::filesystem::FileData::type))\n\t{\n\t\tlove::filesystem::FileData *fdata = luax_checktype<love::filesystem::FileData>(L, 1);\n\t\tname = std::string(\"@\") + fdata->getFilename();\n\t\tdata = fdata;\n\t}\n\telse\n\t{\n\t\tdata = luax_checktype<love::Data>(L, 1);\n\t}\n\n\tLuaThread *t = instance()->newThread(name, data);\n\tluax_pushtype(L, t);\n\tt->release();\n\treturn 1;\n}\n\nint w_newChannel(lua_State *L)\n{\n\tChannel *c = instance()->newChannel();\n\tluax_pushtype(L, c);\n\tc->release();\n\treturn 1;\n}\n\nint w_getChannel(lua_State *L)\n{\n\tstd::string name = luax_checkstring(L, 1);\n\tChannel *c = instance()->getChannel(name);\n\tluax_pushtype(L, c);\n\treturn 1;\n}\n\n// List of functions to wrap.\nstatic const luaL_Reg module_functions[] =\n{\n\t{ \"newThread\", w_newThread },\n\t{ \"newChannel\", w_newChannel },\n\t{ \"getChannel\", w_getChannel },\n\t{ 0, 0 }\n};\n\nstatic const lua_CFunction types[] = {\n\tluaopen_thread,\n\tluaopen_channel,\n\t0\n};\n\nextern \"C\" int luaopen_love_thread(lua_State *L)\n{\n\tThreadModule *instance = instance();\n\tif (instance == nullptr)\n\t{\n\t\tluax_catchexcept(L, [&](){ instance = new love::thread::ThreadModule(); });\n\t}\n\telse\n\t\tinstance->retain();\n\n\tWrappedModule w;\n\tw.module = instance;\n\tw.name = \"thread\";\n\tw.type = &Module::type;\n\tw.functions = module_functions;\n\tw.types = types;\n\n\treturn luax_register_module(L, w);\n}\n\n} // thread\n} // love\n"
  },
  {
    "path": "src/modules/thread/wrap_ThreadModule.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_THREAD_WRAP_THREADMODULE_H\n#define LOVE_THREAD_WRAP_THREADMODULE_H\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/runtime.h\"\n\nnamespace love\n{\nnamespace thread\n{\n\nextern \"C\" LOVE_EXPORT int luaopen_love_thread(lua_State * L);\n\n} // thread\n} // love\n\n#endif // LOVE_THREAD_WRAP_THREADMODULE_H\n"
  },
  {
    "path": "src/modules/timer/Timer.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/int.h\"\n#include \"common/delay.h\"\n#include \"Timer.h\"\n\n#include <iostream>\n#if defined(LOVE_WINDOWS)\n#define WIN32_LEAN_AND_MEAN\n#include <windows.h>\n#elif defined(LOVE_MACOS) || defined(LOVE_IOS)\n#include <mach/mach_time.h>\n#include <sys/time.h>\n#elif defined(LOVE_LINUX)\n#include <unistd.h>\n#include <time.h>\n#include <sys/time.h>\n#endif\n\nnamespace love\n{\nnamespace timer\n{\n\nTimer::Timer()\n\t: Module(M_TIMER, \"love.timer\")\n\t, currTime(0)\n\t, prevFpsUpdate(0)\n\t, fps(0)\n\t, averageDelta(0)\n\t, fpsUpdateFrequency(1)\n\t, frames(0)\n\t, dt(0)\n{\n\tprevFpsUpdate = currTime = getTime();\n}\n\ndouble Timer::step()\n{\n\t// Frames rendered\n\tframes++;\n\n\t// \"Current\" time is previous time by now.\n\tprevTime = currTime;\n\n\t// Get time from system.\n\tcurrTime = getTime();\n\n\t// Convert to number of seconds.\n\tdt = currTime - prevTime;\n\n\tdouble timeSinceLast = currTime - prevFpsUpdate;\n\t// Update FPS?\n\tif (timeSinceLast > fpsUpdateFrequency)\n\t{\n\t\tfps = int((frames/timeSinceLast) + 0.5);\n\t\taverageDelta = timeSinceLast/frames;\n\t\tprevFpsUpdate = currTime;\n\t\tframes = 0;\n\t}\n\n\treturn dt;\n}\n\nvoid Timer::sleep(double seconds) const\n{\n\tif (seconds >= 0)\n\t\tlove::sleep(seconds*1000);\n}\n\ndouble Timer::getDelta() const\n{\n\treturn dt;\n}\n\nint Timer::getFPS() const\n{\n\treturn fps;\n}\n\ndouble Timer::getAverageDelta() const\n{\n\treturn averageDelta;\n}\n\n#if defined(LOVE_LINUX)\n\nstatic inline timespec getTimeOfDay()\n{\n\ttimeval t;\n\tgettimeofday(&t, NULL);\n\treturn timespec { t.tv_sec, t.tv_usec * 1000 };\n}\n\nstatic timespec getTimeAbsolute()\n{\n\t// Check for POSIX timers and monotonic clocks. If not supported, use the gettimeofday fallback.\n#if _POSIX_TIMERS > 0 && defined(_POSIX_MONOTONIC_CLOCK) \\\n&& (defined(CLOCK_MONOTONIC_RAW) || defined(CLOCK_MONOTONIC))\n\n#ifdef CLOCK_MONOTONIC_RAW\n\tclockid_t clk_id = CLOCK_MONOTONIC_RAW;\n#else\n\tclockid_t clk_id = CLOCK_MONOTONIC;\n#endif\n\n\ttimespec t;\n\tif (clock_gettime(clk_id, &t) == 0)\n\t\treturn t;\n\telse\n\t\treturn getTimeOfDay();\n#endif\n\treturn getTimeOfDay();\n}\n\ndouble Timer::getTime()\n{\n\tstatic const timespec start = getTimeAbsolute();\n\tconst timespec now = getTimeAbsolute();\n\t// tv_sec and tv_nsec should be signed on POSIX, so we are fine in just subtracting here.\n\tconst long sec = now.tv_sec - start.tv_sec;\n\tconst long nsec = now.tv_nsec - start.tv_nsec;\n\treturn (double) sec + (double) nsec / 1.0e9;\n}\n\n#elif defined(LOVE_MACOS) || defined(LOVE_IOS)\n\nstatic mach_timebase_info_data_t getTimebaseInfo()\n{\n\tmach_timebase_info_data_t info;\n\tmach_timebase_info(&info);\n\treturn info;\n}\n\ndouble Timer::getTime()\n{\n\tstatic const mach_timebase_info_data_t info = getTimebaseInfo();\n\tstatic const uint64_t start = mach_absolute_time();\n\tconst uint64_t rel = mach_absolute_time() - start;\n\treturn ((double) rel * 1.0e-9) * (double) info.numer / (double) info.denom;\n}\n\n#elif defined(LOVE_WINDOWS)\n\nstatic LARGE_INTEGER getTimeAbsolute()\n{\n\tLARGE_INTEGER t;\n\tQueryPerformanceCounter(&t);\n\treturn t;\n}\n\nstatic LARGE_INTEGER getFrequency()\n{\n\tLARGE_INTEGER freq;\n\t// \"On systems that run Windows XP or later, the function will always succeed and will thus never return zero.\"\n\tQueryPerformanceFrequency(&freq);\n\treturn freq;\n}\n\ndouble Timer::getTime()\n{\n\tstatic const LARGE_INTEGER freq = getFrequency();\n\tstatic const LARGE_INTEGER start = getTimeAbsolute();\n\tconst LARGE_INTEGER now = getTimeAbsolute();\n\tLARGE_INTEGER rel;\n\trel.QuadPart = now.QuadPart - start.QuadPart;\n\treturn (double) rel.QuadPart / (double) freq.QuadPart;\n}\n\n#endif\n\n} // timer\n} // love\n"
  },
  {
    "path": "src/modules/timer/Timer.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_TIMER_TIMER_H\n#define LOVE_TIMER_TIMER_H\n\n// LOVE\n#include \"common/Module.h\"\n\nnamespace love\n{\nnamespace timer\n{\n\nclass Timer : public Module\n{\npublic:\n\n\tTimer();\n\tvirtual ~Timer() {}\n\n\t/**\n\t * Measures the time between this call and the previous call,\n\t * and updates internal values accordingly.\n\t **/\n\tdouble step();\n\n\t/**\n\t * Tries to sleep for the specified amount of time. The precision is\n\t * usually 1ms.\n\t * @param seconds The number of seconds to sleep for.\n\t **/\n\tvoid sleep(double seconds) const;\n\n\t/**\n\t * Gets the time between the last two frames, assuming step is called\n\t * each frame.\n\t **/\n\tdouble getDelta() const;\n\n\t/**\n\t * Gets the average FPS over the last second. Beucase the value is only updated\n\t * once per second, it does not look erratic when displayed on screen.\n\t * @return The \"current\" FPS.\n\t **/\n\tint getFPS() const;\n\n\t/**\n\t * Gets the average delta time (seconds per frame) over the last second.\n\t **/\n\tdouble getAverageDelta() const;\n\n\t/**\n\t * Gets the amount of time in seconds passed since its first invocation\n\t * (which happens as part of the Timer constructor,\n\t * which is called when the module is first opened).\n\t * Useful for profiling code or measuring intervals.\n\t * The time is microsecond-precise, and increases monotonically.\n\t * @return The time (in seconds)\n\t **/\n\tstatic double getTime();\n\nprivate:\n\n\t// Frame delta vars.\n\tdouble currTime;\n\tdouble prevTime;\n\tdouble prevFpsUpdate;\n\n\t// Updated with a certain frequency.\n\tint fps;\n\tdouble averageDelta;\n\n\t// The frequency by which to update the FPS.\n\tdouble fpsUpdateFrequency;\n\n\t// Frames since last FPS update.\n\tint frames;\n\n\t// The current timestep.\n\tdouble dt;\n\n}; // Timer\n\n} // timer\n} // love\n\n#endif // LOVE_TIMER_TIMER_H\n"
  },
  {
    "path": "src/modules/timer/wrap_Timer.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"common/config.h\"\n\n// LOVE\n#include \"wrap_Timer.h\"\n\nnamespace love\n{\nnamespace timer\n{\n\n#define instance() (Module::getInstance<Timer>(Module::M_TIMER))\n\nint w_step(lua_State *L)\n{\n\tlua_pushnumber(L, instance()->step());\n\treturn 1;\n}\n\nint w_getDelta(lua_State *L)\n{\n\tlua_pushnumber(L, instance()->getDelta());\n\treturn 1;\n}\n\nint w_getFPS(lua_State *L)\n{\n\tlua_pushinteger(L, instance()->getFPS());\n\treturn 1;\n}\n\nint w_getAverageDelta(lua_State *L)\n{\n\tlua_pushnumber(L, instance()->getAverageDelta());\n\treturn 1;\n}\n\nint w_sleep(lua_State *L)\n{\n\tinstance()->sleep(luaL_checknumber(L, 1));\n\treturn 0;\n}\n\nint w_getTime(lua_State *L)\n{\n\tlua_pushnumber(L, instance()->getTime());\n\treturn 1;\n}\n\n// List of functions to wrap.\nstatic const luaL_Reg functions[] =\n{\n\t{ \"step\", w_step },\n\t{ \"getDelta\", w_getDelta },\n\t{ \"getFPS\", w_getFPS },\n\t{ \"getAverageDelta\", w_getAverageDelta },\n\t{ \"sleep\", w_sleep },\n\t{ \"getTime\", w_getTime },\n\t{ 0, 0 }\n};\n\n\nextern \"C\" int luaopen_love_timer(lua_State *L)\n{\n\tTimer *instance = instance();\n\tif (instance == nullptr)\n\t{\n\t\tluax_catchexcept(L, [&](){ instance = new love::timer::Timer(); });\n\t}\n\telse\n\t\tinstance->retain();\n\n\tWrappedModule w;\n\tw.module = instance;\n\tw.name = \"timer\";\n\tw.type = &Module::type;\n\tw.functions = functions;\n\tw.types = 0;\n\n\treturn luax_register_module(L, w);\n}\n\n} // timer\n} // love\n"
  },
  {
    "path": "src/modules/timer/wrap_Timer.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_TIMER_WRAP_TIMER_H\n#define LOVE_TIMER_WRAP_TIMER_H\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"Timer.h\"\n\nnamespace love\n{\nnamespace timer\n{\n\nextern \"C\" LOVE_EXPORT int luaopen_love_timer(lua_State *L);\n\n} // timer\n} // love\n\n#endif // LOVE_TIMER_WRAP_TIMER_H\n"
  },
  {
    "path": "src/modules/touch/Touch.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"Touch.h\"\n\nnamespace love\n{\nnamespace touch\n{\n\n// TODO: find a cleaner way to do this...\n// The touch backend (e.g. love.touch.sdl) is expected to implement this.\nvoid setTrackpadTouchImplementation(bool enable);\n\nvoid setTrackpadTouch(bool enable)\n{\n\tsetTrackpadTouchImplementation(enable);\n}\n\nSTRINGMAP_CLASS_BEGIN(Touch, Touch::DeviceType, Touch::DEVICE_MAX_ENUM, deviceType)\n{\n\t{ \"touchscreen\",      Touch::DEVICE_TOUCHSCREEN       },\n\t{ \"touchpad\",         Touch::DEVICE_TOUCHPAD          },\n\t{ \"touchpadrelative\", Touch::DEVICE_TOUCHPAD_RELATIVE },\n}\nSTRINGMAP_CLASS_END(Touch, Touch::DeviceType, Touch::DEVICE_MAX_ENUM, deviceType)\n\n} // touch\n} // love\n"
  },
  {
    "path": "src/modules/touch/Touch.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_TOUCH_TOUCH_H\n#define LOVE_TOUCH_TOUCH_H\n\n// LOVE\n#include \"common/int.h\"\n#include \"common/Object.h\"\n#include \"common/Module.h\"\n#include \"common/StringMap.h\"\n\n// C++\n#include <vector>\n#include <limits>\n\nnamespace love\n{\nnamespace touch\n{\n\nvoid setTrackpadTouch(bool enable);\n\nclass Touch : public Module\n{\npublic:\n\n\tenum DeviceType\n\t{\n\t\tDEVICE_TOUCHSCREEN,\n\t\tDEVICE_TOUCHPAD,\n\t\tDEVICE_TOUCHPAD_RELATIVE,\n\t\tDEVICE_MAX_ENUM\n\t};\n\n\tstruct TouchInfo\n\t{\n\t\tint64 id;  // Identifier. Only unique for the duration of the touch-press.\n\t\tdouble x;  // Position in pixels (for touchscreens) or normalized [0, 1] position (for touchpads) along the x-axis.\n\t\tdouble y;  // Position in pixels (for touchscreens) or normalized [0, 1] position (for touchpads) along the y-axis.\n\t\tdouble dx; // Amount moved along the x-axis.\n\t\tdouble dy; // Amount moved along the y-axis.\n\t\tdouble pressure;\n\t\tDeviceType deviceType;\n\t\tbool mouse;\n\t};\n\n\tvirtual ~Touch() {}\n\n\t/**\n\t * Gets all currently active touches.\n\t **/\n\tvirtual const std::vector<TouchInfo> &getTouches() const = 0;\n\n\t/**\n\t * Gets a specific touch, using its ID.\n\t **/\n\tvirtual const TouchInfo &getTouch(int64 id) const = 0;\n\n\tSTRINGMAP_CLASS_DECLARE(DeviceType);\n\nprotected:\n\n\tTouch(const char *name)\n\t\t: Module(M_TOUCH, name)\n\t{}\n\n}; // Touch\n\n} // touch\n} // love\n\n#endif // LOVE_TOUCH_TOUCH_H\n"
  },
  {
    "path": "src/modules/touch/sdl/Touch.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"common/config.h\"\n#include \"common/Exception.h\"\n#include \"Touch.h\"\n\n// C++\n#include <algorithm>\n\n#include <SDL3/SDL_hints.h>\n\nnamespace love\n{\nnamespace touch\n{\n\n// See src/modules/touch/Touch.cpp.\nvoid setTrackpadTouchImplementation(bool enable)\n{\n\tSDL_SetHint(SDL_HINT_TRACKPAD_IS_TOUCH_ONLY, enable ? \"1\" : \"0\");\n}\n\nnamespace sdl\n{\n\nTouch::Touch()\n\t: love::touch::Touch(\"love.touch.sdl\")\n{\n}\n\nconst std::vector<Touch::TouchInfo> &Touch::getTouches() const\n{\n\treturn touches;\n}\n\nconst Touch::TouchInfo &Touch::getTouch(int64 id) const\n{\n\tfor (const auto &touch : touches)\n\t{\n\t\tif (touch.id == id)\n\t\t\treturn touch;\n\t}\n\n\tthrow love::Exception(\"Invalid active touch ID: %d\", id);\n}\n\nvoid Touch::onEvent(Uint32 eventtype, const TouchInfo &info)\n{\n\tauto compare = [&](const TouchInfo &touch) -> bool\n\t{\n\t\treturn touch.id == info.id;\n\t};\n\n\tswitch (eventtype)\n\t{\n\tcase SDL_EVENT_FINGER_DOWN:\n\t\ttouches.erase(std::remove_if(touches.begin(), touches.end(), compare), touches.end());\n\t\ttouches.push_back(info);\n\t\tbreak;\n\tcase SDL_EVENT_FINGER_MOTION:\n\t{\n\t\tfor (TouchInfo &touch : touches)\n\t\t{\n\t\t\tif (touch.id == info.id)\n\t\t\t\ttouch = info;\n\t\t}\n\t\tbreak;\n\t}\n\tcase SDL_EVENT_FINGER_UP:\n\tcase SDL_EVENT_FINGER_CANCELED:\n\t\ttouches.erase(std::remove_if(touches.begin(), touches.end(), compare), touches.end());\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nTouch::DeviceType Touch::getDeviceType(SDL_TouchDeviceType sdltype)\n{\n\tswitch (sdltype)\n\t{\n\t\tcase SDL_TOUCH_DEVICE_DIRECT: return DEVICE_TOUCHSCREEN;\n\t\tcase SDL_TOUCH_DEVICE_INDIRECT_ABSOLUTE: return DEVICE_TOUCHPAD;\n\t\tcase SDL_TOUCH_DEVICE_INDIRECT_RELATIVE: return DEVICE_TOUCHPAD_RELATIVE;\n\t\tdefault: return DEVICE_TOUCHSCREEN;\n\t}\n}\n\n} // sdl\n} // touch\n} // love\n"
  },
  {
    "path": "src/modules/touch/sdl/Touch.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_TOUCH_SDL_TOUCH_H\n#define LOVE_TOUCH_SDL_TOUCH_H\n\n// LOVE\n#include \"touch/Touch.h\"\n\n// SDL\n#include <SDL3/SDL_events.h>\n\nnamespace love\n{\nnamespace touch\n{\nnamespace sdl\n{\n\nclass Touch : public love::touch::Touch\n{\npublic:\n\n\tTouch();\n\tvirtual ~Touch() {}\n\n\tconst std::vector<TouchInfo> &getTouches() const override;\n\tconst TouchInfo &getTouch(int64 id) const override;\n\n\t// SDL has functions to query the state of touch presses, but unfortunately\n\t// they are updated on a different thread in some backends, which causes\n\t// issues especially if the user is iterating through the current touches\n\t// when they're updated. So we only update our touch press state in\n\t// love::event::sdl::Event::convert.\n\tvoid onEvent(Uint32 eventtype, const TouchInfo &info);\n\n\tstatic DeviceType getDeviceType(SDL_TouchDeviceType sdltype);\n\nprivate:\n\n\t// All current touches.\n\tstd::vector<TouchInfo> touches;\n\n}; // Touch\n\n} // sdl\n} // touch\n} // love\n\n#endif // LOVE_TOUCH_SDL_TOUCH_H\n"
  },
  {
    "path": "src/modules/touch/wrap_Touch.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"common/config.h\"\n\n// LOVE\n#include \"wrap_Touch.h\"\n\n#include \"sdl/Touch.h\"\n#include \"common/Optional.h\"\n\nnamespace love\n{\nnamespace touch\n{\n\n#define instance() (Module::getInstance<Touch>(Module::M_TOUCH))\n\nint64 luax_checktouchid(lua_State *L, int idx)\n{\n\tif (!lua_islightuserdata(L, idx))\n\t\treturn luax_typerror(L, idx, \"touch id\");\n\n\treturn (int64) (intptr_t) lua_touserdata(L, 1);\n}\n\nint w_getTouches(lua_State *L)\n{\n\tOptional<Touch::DeviceType> typefilter;\n\tif (!lua_isnoneornil(L, 1))\n\t{\n\t\tconst char *typestr = luaL_checkstring(L, 1);\n\t\tif (!Touch::getConstant(typestr, typefilter.value))\n\t\t\treturn luax_enumerror(L, \"touch device type\", Touch::getConstants(typefilter.value), typestr);\n\t\ttypefilter.hasValue = true;\n\t}\n\n\tconst std::vector<Touch::TouchInfo> &touches = instance()->getTouches();\n\n\tlua_createtable(L, (int) touches.size(), 0);\n\n\tint filteredindex = 1;\n\tfor (const Touch::TouchInfo &touch : touches)\n\t{\n\t\tif (!typefilter.hasValue || typefilter.value == touch.deviceType)\n\t\t{\n\t\t\t// This is a bit hackish and we lose the higher 32 bits of the id on\n\t\t\t// 32-bit systems, but SDL only ever gives id's that at most use as many\n\t\t\t// bits as can fit in a pointer (for now.)\n\t\t\t// We use lightuserdata instead of a lua_Number (double) because doubles\n\t\t\t// can't represent all possible id values on 64-bit systems.\n\t\t\tlua_pushlightuserdata(L, (void *)(intptr_t)touch.id);\n\t\t\tlua_rawseti(L, -2, filteredindex);\n\t\t\tfilteredindex++;\n\t\t}\n\t}\n\n\treturn 1;\n}\n\nint w_getPosition(lua_State *L)\n{\n\tint64 id = luax_checktouchid(L, 1);\n\n\tTouch::TouchInfo touch = {};\n\tluax_catchexcept(L, [&]() { touch = instance()->getTouch(id); });\n\n\tlua_pushnumber(L, touch.x);\n\tlua_pushnumber(L, touch.y);\n\n\treturn 2;\n}\n\nint w_getPressure(lua_State *L)\n{\n\tint64 id = luax_checktouchid(L, 1);\n\n\tTouch::TouchInfo touch = {};\n\tluax_catchexcept(L, [&](){ touch = instance()->getTouch(id); });\n\n\tlua_pushnumber(L, touch.pressure);\n\treturn 1;\n}\n\nint w_getDeviceType(lua_State *L)\n{\n\tint64 id = luax_checktouchid(L, 1);\n\n\tTouch::TouchInfo touch = {};\n\tluax_catchexcept(L, [&]() { touch = instance()->getTouch(id); });\n\n\tconst char *typestr = nullptr;\n\tif (!Touch::getConstant(touch.deviceType, typestr))\n\t\treturn luaL_error(L, \"Unknown touch device type.\");\n\n\tlua_pushstring(L, typestr);\n\treturn 1;\n}\n\nint w_isMouse(lua_State *L)\n{\n\tint64 id = luax_checktouchid(L, 1);\n\n\tTouch::TouchInfo touch = {};\n\tluax_catchexcept(L, [&]() { touch = instance()->getTouch(id); });\n\n\tluax_pushboolean(L, touch.mouse);\n\treturn 1;\n}\n\nstatic const luaL_Reg functions[] =\n{\n\t{ \"getTouches\", w_getTouches },\n\t{ \"getPosition\", w_getPosition },\n\t{ \"getPressure\", w_getPressure },\n\t{ \"getDeviceType\", w_getDeviceType },\n\t{ \"isMouse\", w_isMouse },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_love_touch(lua_State *L)\n{\n\tTouch *instance = instance();\n\tif (instance == nullptr)\n\t{\n\t\tluax_catchexcept(L, [&](){ instance = new love::touch::sdl::Touch(); });\n\t}\n\telse\n\t\tinstance->retain();\n\n\tWrappedModule w;\n\tw.module = instance;\n\tw.name = \"touch\";\n\tw.type = &Module::type;\n\tw.functions = functions;\n\tw.types = nullptr;\n\n\treturn luax_register_module(L, w);\n}\n\n} // touch\n} // love\n"
  },
  {
    "path": "src/modules/touch/wrap_Touch.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_TOUCH_WRAP_TOUCH_H\n#define LOVE_TOUCH_WRAP_TOUCH_H\n\n// LOVE\n#include \"Touch.h\"\n#include \"common/runtime.h\"\n#include \"common/int.h\"\n\nnamespace love\n{\nnamespace touch\n{\n\nint64 luax_checktouchid(lua_State *L, int idx);\nextern \"C\" LOVE_EXPORT int luaopen_love_touch(lua_State *L);\n\n} // touch\n} // love\n\n#endif // LOVE_TOUCH_WRAP_TOUCH_H\n"
  },
  {
    "path": "src/modules/video/Video.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_VIDEO_VIDEO_H\n#define LOVE_VIDEO_VIDEO_H\n\n// LOVE\n#include \"common/Module.h\"\n#include \"filesystem/File.h\"\n\n#include \"VideoStream.h\"\n\nnamespace love\n{\nnamespace video\n{\n\nclass Video : public Module\n{\npublic:\n\n\tvirtual ~Video() {}\n\n\t/**\n\t * Create a VideoStream representing video frames\n\t **/\n\tvirtual VideoStream *newVideoStream(love::filesystem::File *file) = 0;\n\nprotected:\n\n\tVideo(const char *name)\n\t\t: Module(M_VIDEO, name)\n\t{}\n\n}; // Video\n\n} // video\n} // love\n\n#endif // LOVE_VIDEO_VIDEO_H\n"
  },
  {
    "path": "src/modules/video/VideoStream.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"VideoStream.h\"\n\nusing love::thread::Lock;\n\nnamespace love\n{\nnamespace video\n{\n\nlove::Type VideoStream::type(\"VideoStream\", &Object::type);\n\nvoid VideoStream::setSync(VideoStream::FrameSync *frameSync)\n{\n\tthis->frameSync = frameSync;\n}\n\nVideoStream::FrameSync *VideoStream::getSync() const\n{\n\treturn frameSync;\n}\n\nvoid VideoStream::play()\n{\n\tframeSync->play();\n}\n\nvoid VideoStream::pause()\n{\n\tframeSync->pause();\n}\n\nvoid VideoStream::seek(double offset)\n{\n\tframeSync->seek(offset);\n}\n\ndouble VideoStream::tell() const\n{\n\treturn frameSync->tell();\n}\n\nbool VideoStream::isPlaying() const\n{\n\treturn frameSync->isPlaying();\n}\n\nVideoStream::Frame::Frame()\n\t: yplane(nullptr)\n\t, cbplane(nullptr)\n\t, crplane(nullptr)\n{\n}\n\nVideoStream::Frame::~Frame()\n{\n\tdelete[] yplane;\n\tdelete[] cbplane;\n\tdelete[] crplane;\n}\n\nvoid VideoStream::FrameSync::copyState(const VideoStream::FrameSync *other)\n{\n\tseek(other->tell());\n\tif (other->isPlaying())\n\t\tplay();\n\telse\n\t\tpause();\n}\n\ndouble VideoStream::FrameSync::tell() const\n{\n\treturn getPosition();\n}\n\nVideoStream::DeltaSync::DeltaSync()\n\t: playing(false)\n\t, position(0)\n\t, speed(1)\n{\n}\n\nVideoStream::DeltaSync::~DeltaSync()\n{\n}\n\ndouble VideoStream::DeltaSync::getPosition() const\n{\n\treturn position;\n}\n\nvoid VideoStream::DeltaSync::update(double dt)\n{\n\tLock l(mutex);\n\tif (playing)\n\t\tposition += dt*speed;\n}\n\nvoid VideoStream::DeltaSync::play()\n{\n\tplaying = true;\n}\n\nvoid VideoStream::DeltaSync::pause()\n{\n\tplaying = false;\n}\n\nvoid VideoStream::DeltaSync::seek(double time)\n{\n\tLock l(mutex);\n\tposition = time;\n}\n\nbool VideoStream::DeltaSync::isPlaying() const\n{\n\treturn playing;\n}\n\nVideoStream::SourceSync::SourceSync(love::audio::Source *source)\n\t: source(source)\n{\n}\n\ndouble VideoStream::SourceSync::getPosition() const\n{\n\treturn source->tell(love::audio::Source::UNIT_SECONDS);\n}\n\nvoid VideoStream::SourceSync::play()\n{\n\tsource->play();\n}\n\nvoid VideoStream::SourceSync::pause()\n{\n\tsource->pause();\n}\n\nvoid VideoStream::SourceSync::seek(double time)\n{\n\tsource->seek(time, love::audio::Source::UNIT_SECONDS);\n}\n\nbool VideoStream::SourceSync::isPlaying() const\n{\n\treturn source->isPlaying();\n}\n\n} // video\n} // love\n"
  },
  {
    "path": "src/modules/video/VideoStream.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_VIDEO_VIDEOSTREAM_H\n#define LOVE_VIDEO_VIDEOSTREAM_H\n\n// LOVE\n#include \"common/Object.h\"\n#include \"audio/Source.h\"\n#include \"thread/threads.h\"\n\nnamespace love\n{\nnamespace video\n{\n\nclass VideoStream : public love::Object\n{\npublic:\n\n\tstatic love::Type type;\n\n\tvirtual ~VideoStream() {}\n\n\t/**\n\t * A callback, gets called when some Stream consumer exhausts the data\n\t **/\n\tvirtual void fillBackBuffer() {}\n\n\t/**\n\t * Get the front buffer, Streams are supposed to be (at least) double-buffered\n\t **/\n\tvirtual const void* getFrontBuffer() const = 0;\n\n\t/**\n\t * Get the size of any (and in particular the front) buffer\n\t **/\n\tvirtual size_t getSize() const = 0;\n\n\t/**\n\t * Swap buffers. Returns true if there is new data in the front buffer,\n\t * false otherwise.\n\t * NOTE: If there is no back buffer ready, this call must be ignored\n\t **/\n\tvirtual bool swapBuffers() = 0;\n\n\tvirtual int getWidth() const = 0;\n\tvirtual int getHeight() const = 0;\n\tvirtual const std::string &getFilename() const = 0;\n\n\t// Playback api\n\tvirtual void play();\n\tvirtual void pause();\n\tvirtual void seek(double offset);\n\tvirtual double tell() const;\n\tvirtual bool isPlaying() const;\n\n\tclass FrameSync;\n\tclass DeltaSync;\n\n\t// The stream now owns the sync, do not reuse or free\n\tvirtual void setSync(FrameSync *frameSync);\n\tvirtual FrameSync *getSync() const;\n\n\t// Data structures\n\tstruct Frame\n\t{\n\t\tFrame();\n\t\t~Frame();\n\n\t\tint yw, yh;\n\t\tunsigned char *yplane;\n\n\t\tint cw, ch;\n\t\tunsigned char *cbplane;\n\t\tunsigned char *crplane;\n\t};\n\n\tclass FrameSync : public Object\n\t{\n\tpublic:\n\t\tvirtual double getPosition() const = 0;\n\t\tvirtual void update(double /*dt*/) {}\n\t\tvirtual ~FrameSync() {}\n\n\t\tvoid copyState(const FrameSync *other);\n\n\t\t// Playback api\n\t\tvirtual void play() = 0;\n\t\tvirtual void pause() = 0;\n\t\tvirtual void seek(double offset) = 0;\n\t\tvirtual double tell() const;\n\t\tvirtual bool isPlaying() const = 0;\n\t};\n\n\tclass DeltaSync : public FrameSync\n\t{\n\tpublic:\n\t\tDeltaSync();\n\t\t~DeltaSync();\n\n\t\tvirtual double getPosition() const override;\n\t\tvirtual void update(double dt) override;\n\n\t\tvirtual void play() override;\n\t\tvirtual void pause() override;\n\t\tvirtual void seek(double time) override;\n\t\tvirtual bool isPlaying() const override;\n\n\tprivate:\n\t\tbool playing;\n\t\tdouble position;\n\t\tdouble speed;\n\t\tlove::thread::MutexRef mutex;\n\t};\n\n\tclass SourceSync : public FrameSync\n\t{\n\tpublic:\n\t\tSourceSync(love::audio::Source *source);\n\n\t\tvirtual double getPosition() const override;\n\t\tvirtual void play() override;\n\t\tvirtual void pause() override;\n\t\tvirtual void seek(double time) override;\n\t\tvirtual bool isPlaying() const override;\n\n\tprivate:\n\t\tStrongRef<love::audio::Source> source;\n\t};\n\nprotected:\n\tStrongRef<FrameSync> frameSync;\n};\n\n} // video\n} // love\n\n#endif // LOVE_VIDEO_VIDEOSTREAM_H\n"
  },
  {
    "path": "src/modules/video/theora/OggDemuxer.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"OggDemuxer.h\"\n\nnamespace love\n{\nnamespace video\n{\nnamespace theora\n{\n\nOggDemuxer::OggDemuxer(love::filesystem::File *file)\n\t: file(file)\n\t, streamInited(false)\n\t, videoSerial(0)\n\t, eos(false)\n{\n\togg_sync_init(&sync);\n}\n\nOggDemuxer::~OggDemuxer()\n{\n\tif (streamInited)\n\t\togg_stream_clear(&stream);\n\togg_sync_clear(&sync);\n}\n\nbool OggDemuxer::readPage(bool erroreof)\n{\n\tchar *syncBuffer = nullptr;\n\twhile (ogg_sync_pageout(&sync, &page) != 1)\n\t{\n\t\tif (syncBuffer && !streamInited && ogg_stream_check(&stream))\n\t\t\tthrow love::Exception(\"Invalid stream\");\n\n\t\tsyncBuffer = ogg_sync_buffer(&sync, 8192);\n\t\tsize_t read = file->read(syncBuffer, 8192);\n\t\tif (read == 0 && erroreof)\n\t\t\treturn false;\n\n\t\togg_sync_wrote(&sync, read);\n\t}\n\n\treturn true;\n}\n\nbool OggDemuxer::readPacket(ogg_packet &packet, bool mustSucceed)\n{\n\tif (!streamInited)\n\t\tthrow love::Exception(\"Reading from OggDemuxer before initialization (engine bug)\");\n\n\twhile (ogg_stream_packetout(&stream, &packet) != 1)\n\t{\n\t\tdo\n\t\t{\n\t\t\t// We need to read another page, but there is none, we're at the end\n\t\t\tif (ogg_page_serialno(&page) == videoSerial && ogg_page_eos(&page) && !mustSucceed)\n\t\t\t\treturn eos = true;\n\n\t\t\treadPage();\n\t\t} while (ogg_page_serialno(&page) != videoSerial);\n\n\t\togg_stream_pagein(&stream, &page);\n\t}\n\n\treturn eos = false;\n}\n\nvoid OggDemuxer::resync()\n{\n\togg_sync_reset(&sync);\n\togg_sync_pageseek(&sync, &page);\n\togg_stream_reset(&stream);\n}\n\nbool OggDemuxer::isEos() const\n{\n\treturn eos;\n}\n\nconst std::string &OggDemuxer::getFilename() const\n{\n\treturn file->getFilename();\n}\n\nOggDemuxer::StreamType OggDemuxer::determineType()\n{\n\togg_packet packet;\n\tif (ogg_stream_packetpeek(&stream, &packet) != 1)\n\t\treturn TYPE_UNKNOWN;\n\n\t// Theora\n\t// See https://www.theora.org/doc/Theora.pdf section 6.1\n\tif (packet.bytes >= 7) {\n\t\tuint8_t headerType = packet.packet[0];\n\t\tif (headerType & 0x80 && std::strncmp((const char*) packet.packet+1, \"theora\", 6) == 0)\n\t\t\treturn TYPE_THEORA;\n\t}\n\n\treturn TYPE_UNKNOWN;\n}\n\nOggDemuxer::StreamType OggDemuxer::findStream()\n{\n\tif (streamInited)\n\t{\n\t\teos = false;\n\t\tstreamInited = false;\n\t\tfile->seek(0);\n\t\togg_stream_clear(&stream);\n\t\togg_sync_reset(&sync);\n\t}\n\n\twhile (true)\n\t{\n\t\tif (!readPage(true))\n\t\t\treturn TYPE_UNKNOWN;\n\n\t\t// If this page isn't at the start of a stream, we've seen all streams\n\t\tif (!ogg_page_bos(&page))\n\t\t\tbreak;\n\n\t\tvideoSerial = ogg_page_serialno(&page);\n\t\togg_stream_init(&stream, videoSerial);\n\t\togg_stream_pagein(&stream, &page);\n\t\tstreamInited = true;\n\n\t\tStreamType type = determineType();\n\t\tswitch(type)\n\t\t{\n\t\tcase TYPE_THEORA:\n\t\t\treturn type;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\togg_stream_clear(&stream);\n\t\tstreamInited = false;\n\t}\n\n\tif (streamInited)\n\t{\n\t\tstreamInited = false;\n\t\togg_stream_clear(&stream);\n\t}\n\n\togg_sync_reset(&sync);\n\n\treturn TYPE_UNKNOWN;\n}\n\nbool OggDemuxer::seek(ogg_packet &packet, double target, std::function<double(int64)> getTime)\n{\n\tstatic const double rewindThreshold = 0.01;\n\n\teos = false;\n\n\tif (target < rewindThreshold)\n\t{\n\t\tfile->seek(0);\n\t\tresync();\n\t\treadPacket(packet, true);\n\t\treturn true;\n\t}\n\n\tdouble low = 0;\n\tdouble high = file->getSize();\n\n\t// If we know our current position, we can drastically decrease the search area\n\tif (packet.granulepos != -1)\n\t{\n\t\tdouble currentTime = getTime(packet.granulepos);\n\t\tif (currentTime < target)\n\t\t\tlow = file->tell();\n\t\telse if (currentTime > target)\n\t\t\thigh = file->tell();\n\t}\n\n\twhile (high-low > rewindThreshold)\n\t{\n\t\t// Determine our next binary search position\n\t\tdouble pos = (high+low)/2;\n\t\tfile->seek(pos);\n\n\t\t// Break sync\n\t\tresync();\n\n\t\t// Read a page\n\t\treadPage();\n\t\treadPacket(packet, false);\n\t\tif (isEos())\n\t\t{\n\t\t\t// EOS, so we're definitely past our target (or the target is past\n\t\t\t// the end)\n\t\t\thigh = pos;\n\t\t\teos = false;\n\n\t\t\t// And a workaround for single-page files:\n\t\t\tif (high < rewindThreshold)\n\t\t\t{\n\t\t\t\tfile->seek(0);\n\t\t\t\tresync();\n\t\t\t\treadPacket(packet, true);\n\t\t\t}\n\t\t\telse\n\t\t\t\tcontinue;\n\t\t}\n\n\t\t// Now search all packets in this page\n\t\tint result = -1;\n\t\tfor (int i = 0; i < ogg_page_packets(&page); ++i)\n\t\t{\n\t\t\tif (i > 0)\n\t\t\t\treadPacket(packet, true);\n\n\t\t\t// Determine if this is the right place\n\t\t\tdouble curTime = getTime(packet.granulepos);\n\t\t\tdouble nextTime = getTime(packet.granulepos+1);\n\n\t\t\tif (curTime == -1)\n\t\t\t\tcontinue; // Invalid granule position (magic?)\n\t\t\telse if (curTime <= target && nextTime > target)\n\t\t\t{\n\t\t\t\t// the current frame should be displaying right now\n\t\t\t\tresult = 0;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (curTime > target)\n\t\t\t{\n\t\t\t\t// No need to check the other packets, they're all past\n\t\t\t\t// this one\n\t\t\t\tresult = 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// The sign of result determines the direction\n\t\tif (result == 0)\n\t\t\tbreak;\n\t\telse if (result < 0)\n\t\t\tlow = pos;\n\t\telse\n\t\t\thigh = pos;\n\t}\n\n\treturn true;\n}\n\n} // theora\n} // video\n} // love\n"
  },
  {
    "path": "src/modules/video/theora/OggDemuxer.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_VIDEO_THEORA_OGGDEMUXER_H\n#define LOVE_VIDEO_THEORA_OGGDEMUXER_H\n\n// STL\n#include <functional>\n\n// LOVE\n#include \"filesystem/File.h\"\n\n// OGG\n#include <ogg/ogg.h>\n\nnamespace love\n{\nnamespace video\n{\nnamespace theora\n{\n\nclass OggDemuxer\n{\npublic:\n\tenum StreamType\n\t{\n\t\tTYPE_THEORA,\n\t\tTYPE_UNKNOWN,\n\t};\n\n\tOggDemuxer(love::filesystem::File *file);\n\t~OggDemuxer();\n\n\tStreamType findStream();\n\tbool readPacket(ogg_packet &packet, bool mustSucceed = false);\n\tvoid resync();\n\tbool isEos() const;\n\tconst std::string &getFilename() const;\n\tbool seek(ogg_packet &packet, double target, std::function<double(int64)> getTime);\n\nprivate:\n\tStrongRef<love::filesystem::File> file;\n\n\togg_sync_state sync;\n\togg_stream_state stream;\n\togg_page page;\n\n\tbool streamInited;\n\tint videoSerial;\n\tbool eos;\n\n\tbool readPage(bool erroreof = false);\n\tStreamType determineType();\n}; // OggDemuxer\n\n} // theora\n} // video\n} // love\n\n#endif // LOVE_VIDEO_THEORA_OGGDEMUXER_H\n"
  },
  {
    "path": "src/modules/video/theora/TheoraVideoStream.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// STL\n#include <iostream>\n\n// LOVE\n#include \"TheoraVideoStream.h\"\n\nusing love::filesystem::File;\n\nnamespace love\n{\nnamespace video\n{\nnamespace theora\n{\n\nTheoraVideoStream::TheoraVideoStream(love::filesystem::File *file)\n\t: demuxer(file)\n\t, headerParsed(false)\n\t, decoder(nullptr)\n\t, frameReady(false)\n\t, lastFrame(0)\n\t, nextFrame(0)\n{\n\tif (demuxer.findStream() != OggDemuxer::TYPE_THEORA)\n\t\tthrow love::Exception(\"Invalid video file, video is not theora\");\n\n\tth_info_init(&videoInfo);\n\n\tfrontBuffer = new Frame();\n\tbackBuffer = new Frame();\n\n\ttry\n\t{\n\t\tparseHeader();\n\t}\n\tcatch (love::Exception &ex)\n\t{\n\t\tdelete backBuffer;\n\t\tdelete frontBuffer;\n\t\tth_info_clear(&videoInfo);\n\t\tthrow ex;\n\t}\n\n\tframeSync.set(new DeltaSync(), Acquire::NORETAIN);\n}\n\nTheoraVideoStream::~TheoraVideoStream()\n{\n\tif (decoder)\n\t\tth_decode_free(decoder);\n\n\tth_info_clear(&videoInfo);\n\n\tdelete frontBuffer;\n\tdelete backBuffer;\n}\n\nint TheoraVideoStream::getWidth() const\n{\n\tif (headerParsed)\n\t\treturn videoInfo.pic_width;\n\telse\n\t\treturn 0;\n}\n\nint TheoraVideoStream::getHeight() const\n{\n\tif (headerParsed)\n\t\treturn videoInfo.pic_height;\n\telse\n\t\treturn 0;\n}\n\nconst std::string &TheoraVideoStream::getFilename() const\n{\n\treturn demuxer.getFilename();\n}\n\nvoid TheoraVideoStream::setSync(FrameSync *frameSync)\n{\n\tlove::thread::Lock l(bufferMutex);\n\tthis->frameSync = frameSync;\n}\n\nconst void *TheoraVideoStream::getFrontBuffer() const\n{\n\treturn frontBuffer;\n}\n\nsize_t TheoraVideoStream::getSize() const\n{\n\treturn sizeof(Frame);\n}\n\nbool TheoraVideoStream::isPlaying() const\n{\n\treturn frameSync->isPlaying() && !demuxer.isEos();\n}\n\ntemplate<typename T>\ninline void scaleFormat(th_pixel_fmt fmt, T &x, T &y)\n{\n\tswitch(fmt)\n\t{\n\tcase TH_PF_420:\n\t\ty /= 2;\n\tcase TH_PF_422:\n\t\tx /= 2;\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nvoid TheoraVideoStream::parseHeader()\n{\n\tif (headerParsed)\n\t\treturn;\n\n\tth_comment comment;\n\tth_setup_info *setupInfo = nullptr;\n\tth_comment_init(&comment);\n\tint ret;\n\n\tdemuxer.readPacket(packet);\n\tret = th_decode_headerin(&videoInfo, &comment, &setupInfo, &packet);\n\n\tif (ret < 0)\n\t{\n\t\tth_comment_clear(&comment);\n\t\tthrow love::Exception(\"Could not find header\");\n\t}\n\n\twhile (ret > 0)\n\t{\n\t\tdemuxer.readPacket(packet);\n\t\tret = th_decode_headerin(&videoInfo, &comment, &setupInfo, &packet);\n\t}\n\n\tth_comment_clear(&comment);\n\n\tdecoder = th_decode_alloc(&videoInfo, setupInfo);\n\tth_setup_free(setupInfo);\n\n\tFrame *buffers[2] = {backBuffer, frontBuffer};\n\n\tyPlaneXOffset = cPlaneXOffset = videoInfo.pic_x;\n\tyPlaneYOffset = cPlaneYOffset = videoInfo.pic_y;\n\n\tscaleFormat(videoInfo.pixel_fmt, cPlaneXOffset, cPlaneYOffset);\n\n\tfor (int i = 0; i < 2; i++)\n\t{\n\t\tbuffers[i]->cw = buffers[i]->yw = videoInfo.pic_width;\n\t\tbuffers[i]->ch = buffers[i]->yh = videoInfo.pic_height;\n\n\t\tscaleFormat(videoInfo.pixel_fmt, buffers[i]->cw, buffers[i]->ch);\n\n\t\tbuffers[i]->yplane = new unsigned char[buffers[i]->yw * buffers[i]->yh];\n\t\tbuffers[i]->cbplane = new unsigned char[buffers[i]->cw * buffers[i]->ch];\n\t\tbuffers[i]->crplane = new unsigned char[buffers[i]->cw * buffers[i]->ch];\n\n\t\tmemset(buffers[i]->yplane, 16, buffers[i]->yw * buffers[i]->yh);\n\t\tmemset(buffers[i]->cbplane, 128, buffers[i]->cw * buffers[i]->ch);\n\t\tmemset(buffers[i]->crplane, 128, buffers[i]->cw * buffers[i]->ch);\n\t}\n\n\theaderParsed = true;\n\tth_decode_packetin(decoder, &packet, nullptr);\n}\n\nvoid TheoraVideoStream::seekDecoder(double target)\n{\n\tbool success = demuxer.seek(packet, target, [this](int64 granulepos) {\n\t\treturn th_granule_time(decoder, granulepos);\n\t});\n\n\tif (!success)\n\t\treturn;\n\n\t// Now update theora and our decoder on this new position of ours\n\tlastFrame = nextFrame = -1;\n\tth_decode_ctl(decoder, TH_DECCTL_SET_GRANPOS, &packet.granulepos, sizeof(packet.granulepos));\n}\n\nvoid TheoraVideoStream::threadedFillBackBuffer(double dt)\n{\n\t// Synchronize\n\tframeSync->update(dt);\n\tdouble position = frameSync->getPosition();\n\n\t// Seeking backwards\n\tif (position < lastFrame)\n\t\tseekDecoder(position);\n\n\tth_ycbcr_buffer bufferinfo;\n\tbool hasFrame = false;\n\n\t// Until we are at the end of the stream, or we are displaying the right frame\n\tunsigned int framesBehind = 0;\n\tbool failedSeek = false;\n\twhile (!demuxer.isEos() && position >= nextFrame)\n\t{\n\t\t// If we can't catch up, seek\n\t\tif (framesBehind++ > 5 && !failedSeek)\n\t\t{\n\t\t\tseekDecoder(position);\n\t\t\tframesBehind = 0;\n\t\t\tfailedSeek = true;\n\t\t}\n\n\t\tth_decode_ycbcr_out(decoder, bufferinfo);\n\t\thasFrame = true;\n\n\t\togg_int64_t decoderPosition;\n\t\tdo\n\t\t{\n\t\t\tif (demuxer.readPacket(packet))\n\t\t\t\treturn;\n\n\t\t\tif (packet.granulepos > 0)\n\t\t\t\tth_decode_ctl(decoder, TH_DECCTL_SET_GRANPOS, &packet.granulepos, sizeof(packet.granulepos));\n\t\t} while (th_decode_packetin(decoder, &packet, &decoderPosition) != 0);\n\n\t\tlastFrame = nextFrame;\n\t\tnextFrame = th_granule_time(decoder, decoderPosition);\n\t}\n\n\t// Only swap once, even if we read many frames to get here\n\tif (hasFrame)\n\t{\n\t\t// Don't swap whilst we're writing to the backbuffer\n\t\t{\n\t\t\tlove::thread::Lock l(bufferMutex);\n\t\t\tframeReady = false;\n\t\t}\n\n\t\tfor (int y = 0; y < backBuffer->yh; ++y)\n\t\t{\n\t\t\tmemcpy(backBuffer->yplane+backBuffer->yw*y,\n\t\t\t\t\tbufferinfo[0].data+\n\t\t\t\t\t\tbufferinfo[0].stride*(y+yPlaneYOffset)+yPlaneXOffset,\n\t\t\t\t\tbackBuffer->yw);\n\t\t}\n\n\t\tfor (int y = 0; y < backBuffer->ch; ++y)\n\t\t{\n\t\t\tmemcpy(backBuffer->cbplane+backBuffer->cw*y,\n\t\t\t\t\tbufferinfo[1].data+\n\t\t\t\t\t\tbufferinfo[1].stride*(y+cPlaneYOffset)+cPlaneXOffset,\n\t\t\t\t\tbackBuffer->cw);\n\t\t}\n\n\t\tfor (int y = 0; y < backBuffer->ch; ++y)\n\t\t{\n\t\t\tmemcpy(backBuffer->crplane+backBuffer->cw*y,\n\t\t\t\t\tbufferinfo[2].data+\n\t\t\t\t\t\tbufferinfo[2].stride*(y+cPlaneYOffset)+cPlaneXOffset,\n\t\t\t\t\tbackBuffer->cw);\n\t\t}\n\n\t\t// Re-enable swapping\n\t\t{\n\t\t\tlove::thread::Lock l(bufferMutex);\n\t\t\tframeReady = true;\n\t\t}\n\t}\n}\n\nvoid TheoraVideoStream::fillBackBuffer()\n{\n\t// Done in worker thread\n}\n\nbool TheoraVideoStream::swapBuffers()\n{\n\tif (demuxer.isEos())\n\t\treturn false;\n\n\tif (!frameSync->isPlaying())\n\t\treturn false;\n\n\tlove::thread::Lock l(bufferMutex);\n\tif (!frameReady)\n\t\treturn false;\n\tframeReady = false;\n\n\tFrame *temp = frontBuffer;\n\tfrontBuffer = backBuffer;\n\tbackBuffer = temp;\n\n\treturn true;\n}\n\n} // theora\n} // video\n} // love\n"
  },
  {
    "path": "src/modules/video/theora/TheoraVideoStream.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_VIDEO_THEORA_VIDEOSTREAM_H\n#define LOVE_VIDEO_THEORA_VIDEOSTREAM_H\n\n#include \"video/VideoStream.h\"\n\n// LOVE\n#include \"common/int.h\"\n#include \"filesystem/File.h\"\n#include \"thread/threads.h\"\n#include \"OggDemuxer.h\"\n\n// OGG/Theora\n#include <ogg/ogg.h>\n#include <theora/codec.h>\n#include <theora/theoradec.h>\n\nnamespace love\n{\nnamespace video\n{\nnamespace theora\n{\n\nclass TheoraVideoStream : public love::video::VideoStream\n{\npublic:\n\tTheoraVideoStream(love::filesystem::File *file);\n\t~TheoraVideoStream();\n\n\tconst void *getFrontBuffer() const;\n\tsize_t getSize() const;\n\tvoid fillBackBuffer();\n\tbool swapBuffers();\n\n\tint getWidth() const;\n\tint getHeight() const;\n\tconst std::string &getFilename() const;\n\tvoid setSync(FrameSync *frameSync);\n\n\tbool isPlaying() const;\n\n\tvoid threadedFillBackBuffer(double dt);\n\nprivate:\n\tOggDemuxer demuxer;\n\n\tbool headerParsed;\n\n\togg_packet packet;\n\n\tth_info videoInfo;\n\tth_dec_ctx *decoder;\n\n\tFrame *frontBuffer;\n\tFrame *backBuffer;\n\tunsigned int yPlaneXOffset;\n\tunsigned int cPlaneXOffset;\n\tunsigned int yPlaneYOffset;\n\tunsigned int cPlaneYOffset;\n\n\tlove::thread::MutexRef bufferMutex;\n\tbool frameReady;\n\n\tdouble lastFrame;\n\tdouble nextFrame;\n\n\tvoid parseHeader();\n\tvoid seekDecoder(double target);\n}; // TheoraVideoStream\n\n} // theora\n} // video\n} // love\n\n#endif // LOVE_VIDEO_THEORA_VIDEOSTREAM_H\n"
  },
  {
    "path": "src/modules/video/theora/Video.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// STL\n#include <vector>\n\n// LOVE\n#include \"Video.h\"\n#include \"common/delay.h\"\n#include \"timer/Timer.h\"\n\nnamespace love\n{\nnamespace video\n{\nnamespace theora\n{\n\nVideo::Video()\n\t: love::video::Video(\"love.video.theora\")\n{\n\tworkerThread = new Worker();\n\tworkerThread->start();\n}\n\nVideo::~Video()\n{\n\tdelete workerThread;\n}\n\nVideoStream *Video::newVideoStream(love::filesystem::File *file)\n{\n\tTheoraVideoStream *stream = new TheoraVideoStream(file);\n\tworkerThread->addStream(stream);\n\treturn stream;\n}\n\nWorker::Worker()\n\t: stopping(false)\n{\n\tthreadName = \"VideoWorker\";\n}\n\nWorker::~Worker()\n{\n\tstop();\n}\n\nvoid Worker::addStream(TheoraVideoStream *stream)\n{\n\tlove::thread::Lock l(mutex);\n\tstreams.push_back(stream);\n\tcond->broadcast();\n}\n\nvoid Worker::stop()\n{\n\t{\n\t\tlove::thread::Lock l(mutex);\n\t\tstopping = true;\n\t\tcond->broadcast();\n\t}\n\n\towner->wait();\n}\n\nvoid Worker::threadFunction()\n{\n\tdouble lastFrame = love::timer::Timer::getTime();\n\n\twhile (true)\n\t{\n\t\tlove::sleep(2);\n\n\t\tlove::thread::Lock l(mutex);\n\n\t\twhile (!stopping && streams.empty())\n\t\t{\n\t\t\tcond->wait(mutex);\n\t\t\tlastFrame = love::timer::Timer::getTime();\n\t\t}\n\n\t\tif (stopping)\n\t\t\treturn;\n\n\t\tdouble curFrame = love::timer::Timer::getTime();\n\t\tdouble dt = curFrame-lastFrame;\n\t\tlastFrame = curFrame;\n\n\t\tfor (auto it = streams.begin(); it != streams.end(); ++it)\n\t\t{\n\t\t\tTheoraVideoStream *stream = *it;\n\t\t\tif (stream->getReferenceCount() == 1)\n\t\t\t{\n\t\t\t\t// We're the only ones left\n\t\t\t\tstreams.erase(it);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tstream->threadedFillBackBuffer(dt);\n\t\t}\n\t}\n}\n\n} // theora\n} // video\n} // love\n"
  },
  {
    "path": "src/modules/video/theora/Video.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_VIDEO_THEORA_VIDEO_H\n#define LOVE_VIDEO_THEORA_VIDEO_H\n\n// STL\n#include <vector>\n\n// LOVE\n#include \"filesystem/File.h\"\n#include \"video/Video.h\"\n#include \"thread/threads.h\"\n#include \"video/VideoStream.h\"\n#include \"TheoraVideoStream.h\"\n\nnamespace love\n{\nnamespace video\n{\nnamespace theora\n{\n\nclass Worker;\n\nclass Video : public love::video::Video\n{\npublic:\n\tVideo();\n\tvirtual ~Video();\n\n\tVideoStream *newVideoStream(love::filesystem::File* file);\n\nprivate:\n\tWorker *workerThread;\n}; // Video\n\nclass Worker : public love::thread::Threadable\n{\npublic:\n\tWorker();\n\tvirtual ~Worker();\n\n\t// Implements Threadable\n\tvoid threadFunction();\n\n\tvoid addStream(TheoraVideoStream *stream);\n\t// Frees itself!\n\tvoid stop();\n\nprivate:\n\n\tstd::vector<StrongRef<TheoraVideoStream>> streams;\n\n\tlove::thread::MutexRef mutex;\n\tlove::thread::ConditionalRef cond;\n\n\tbool stopping;\n}; // Worker\n\n} // theora\n} // video\n} // love\n\n#endif // LOVE_VIDEO_THEORA_VIDEO_H\n"
  },
  {
    "path": "src/modules/video/wrap_Video.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"filesystem/wrap_Filesystem.h\"\n\n#include \"theora/Video.h\"\n#include \"wrap_Video.h\"\n#include \"wrap_VideoStream.h\"\n\nnamespace love\n{\nnamespace video\n{\n\n#define instance() (Module::getInstance<Video>(Module::M_VIDEO))\n\nint w_newVideoStream(lua_State *L)\n{\n\tlove::filesystem::File *file = love::filesystem::luax_getfile(L, 1);\n\n\tVideoStream *stream = nullptr;\n\tluax_catchexcept(L, [&]() {\n\t\t// Can't check if open for reading\n\t\tif (!file->isOpen() && !file->open(love::filesystem::File::MODE_READ))\n\t\t\tluaL_error(L, \"File is not open and cannot be opened\");\n\n\t\tstream = instance()->newVideoStream(file);\n\t});\n\n\tluax_pushtype(L, stream);\n\tstream->release();\n\tfile->release();\n\treturn 1;\n}\n\nstatic const lua_CFunction types[] =\n{\n\tluaopen_videostream,\n\t0\n};\n\nstatic const luaL_Reg functions[] =\n{\n\t{ \"newVideoStream\", w_newVideoStream },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_love_video(lua_State *L)\n{\n\tVideo *instance = instance();\n\tif (instance == nullptr)\n\t{\n\t\tluax_catchexcept(L, [&](){ instance = new love::video::theora::Video(); });\n\t}\n\telse\n\t\tinstance->retain();\n\n\tWrappedModule w;\n\tw.module = instance;\n\tw.name = \"video\";\n\tw.type = &Module::type;\n\tw.functions = functions;\n\tw.types = types;\n\n\treturn luax_register_module(L, w);\n}\n\n} // video\n} // love\n"
  },
  {
    "path": "src/modules/video/wrap_Video.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_VIDEO_WRAP_VIDEO_H\n#define LOVE_VIDEO_WRAP_VIDEO_H\n\n// LOVE\n#include \"VideoStream.h\"\n#include \"common/runtime.h\"\n\nnamespace love\n{\nnamespace video\n{\n\nextern \"C\" LOVE_EXPORT int luaopen_love_video(lua_State *L);\n\n} // video\n} // love\n\n#endif // LOVE_VIDEO_WRAP_VIDEO_H\n"
  },
  {
    "path": "src/modules/video/wrap_VideoStream.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_VideoStream.h\"\n\nnamespace love\n{\nnamespace video\n{\n\nVideoStream *luax_checkvideostream(lua_State *L, int idx)\n{\n\treturn luax_checktype<VideoStream>(L, idx);\n}\n\nint w_VideoStream_setSync(lua_State *L)\n{\n\tauto stream = luax_checkvideostream(L, 1);\n\n\tif (luax_istype(L, 2, love::audio::Source::type))\n\t{\n\t\tauto src = luax_totype<love::audio::Source>(L, 2);\n\t\tauto sync = new VideoStream::SourceSync(src);\n\t\tstream->setSync(sync);\n\t\tsync->release();\n\t}\n\telse if (luax_istype(L, 2, VideoStream::type))\n\t{\n\t\tauto other = luax_totype<VideoStream>(L, 2);\n\t\tstream->setSync(other->getSync());\n\t}\n\telse if (lua_isnoneornil(L, 2))\n\t{\n\t\tauto newSync = new VideoStream::DeltaSync();\n\t\tnewSync->copyState(stream->getSync());\n\t\tstream->setSync(newSync);\n\t\tnewSync->release();\n\t}\n\telse\n\t\treturn luax_typerror(L, 2, \"Source or VideoStream or nil\");\n\n\treturn 0;\n}\n\nint w_VideoStream_getFilename(lua_State *L)\n{\n\tauto stream = luax_checkvideostream(L, 1);\n\tluax_pushstring(L, stream->getFilename());\n\treturn 1;\n}\n\nint w_VideoStream_play(lua_State *L)\n{\n\tauto stream = luax_checkvideostream(L, 1);\n\tstream->play();\n\treturn 0;\n}\n\nint w_VideoStream_pause(lua_State *L)\n{\n\tauto stream = luax_checkvideostream(L, 1);\n\tstream->pause();\n\treturn 0;\n}\n\nint w_VideoStream_seek(lua_State *L)\n{\n\tauto stream = luax_checkvideostream(L, 1);\n\tdouble offset = luaL_checknumber(L, 2);\n\tstream->seek(offset);\n\treturn 0;\n}\n\nint w_VideoStream_rewind(lua_State *L)\n{\n\tauto stream = luax_checkvideostream(L, 1);\n\tstream->seek(0);\n\treturn 0;\n}\n\nint w_VideoStream_tell(lua_State *L)\n{\n\tauto stream = luax_checkvideostream(L, 1);\n\tlua_pushnumber(L, stream->tell());\n\treturn 1;\n}\n\nint w_VideoStream_isPlaying(lua_State *L)\n{\n\tauto stream = luax_checkvideostream(L, 1);\n\tluax_pushboolean(L, stream->isPlaying());\n\treturn 1;\n}\n\nstatic const luaL_Reg videostream_functions[] =\n{\n\t{ \"setSync\", w_VideoStream_setSync },\n\t{ \"getFilename\", w_VideoStream_getFilename },\n\t{ \"play\", w_VideoStream_play },\n\t{ \"pause\", w_VideoStream_pause },\n\t{ \"seek\", w_VideoStream_seek },\n\t{ \"rewind\", w_VideoStream_rewind },\n\t{ \"tell\", w_VideoStream_tell },\n\t{ \"isPlaying\", w_VideoStream_isPlaying },\n\t{ 0, 0 }\n};\n\nint luaopen_videostream(lua_State *L)\n{\n\treturn luax_register_type(L, &VideoStream::type, videostream_functions, nullptr);\n}\n\n} // video\n} // love\n"
  },
  {
    "path": "src/modules/video/wrap_VideoStream.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#pragma once\n\n// LOVE\n#include \"common/runtime.h\"\n#include \"VideoStream.h\"\n\nnamespace love\n{\nnamespace video\n{\n\nLOVE_EXPORT int luaopen_videostream(lua_State *L);\n\n} // video\n} // love\n"
  },
  {
    "path": "src/modules/window/Window.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"Window.h\"\n\nnamespace love\n{\nnamespace window\n{\n\nstatic bool highDPIAllowed = false;\n\n// TODO: find a cleaner way to do this...\n// The window backend (e.g. love.window.sdl) is expected to implement this.\nvoid setHighDPIAllowedImplementation(bool enable);\n\nvoid setHighDPIAllowed(bool enable)\n{\n\tsetHighDPIAllowedImplementation(enable);\n\thighDPIAllowed = enable;\n}\n\nbool isHighDPIAllowed()\n{\n\treturn highDPIAllowed;\n}\n\nWindow::Window(const char *name)\n\t: Module(M_WINDOW, name)\n{\n}\n\nWindow::~Window()\n{\n}\n\nvoid Window::swapBuffers()\n{\n}\n\nSTRINGMAP_CLASS_BEGIN(Window, Window::Setting, Window::SETTING_MAX_ENUM, setting)\n{\n\t{\"fullscreen\", Window::SETTING_FULLSCREEN},\n\t{\"fullscreentype\", Window::SETTING_FULLSCREEN_TYPE},\n\t{\"vsync\", Window::SETTING_VSYNC},\n\t{\"msaa\", Window::SETTING_MSAA},\n\t{\"stencil\", Window::SETTING_STENCIL},\n\t{\"depth\", Window::SETTING_DEPTH},\n\t{\"resizable\", Window::SETTING_RESIZABLE},\n\t{\"minwidth\", Window::SETTING_MIN_WIDTH},\n\t{\"minheight\", Window::SETTING_MIN_HEIGHT},\n\t{\"borderless\", Window::SETTING_BORDERLESS},\n\t{\"centered\", Window::SETTING_CENTERED},\n\t{\"displayindex\", Window::SETTING_DISPLAYINDEX},\n\t{\"display\", Window::SETTING_DISPLAY},\n\t{\"highdpi\", Window::SETTING_HIGHDPI},\n\t{\"usedpiscale\", Window::SETTING_USE_DPISCALE},\n\t{\"refreshrate\", Window::SETTING_REFRESHRATE},\n\t{\"x\", Window::SETTING_X},\n\t{\"y\", Window::SETTING_Y},\n}\nSTRINGMAP_CLASS_END(Window, Window::Setting, Window::SETTING_MAX_ENUM, setting)\n\nSTRINGMAP_CLASS_BEGIN(Window, Window::FullscreenType, Window::FULLSCREEN_MAX_ENUM, fullscreenType)\n{\n\t{\"exclusive\", Window::FULLSCREEN_EXCLUSIVE},\n\t{\"desktop\", Window::FULLSCREEN_DESKTOP},\n}\nSTRINGMAP_CLASS_END(Window, Window::FullscreenType, Window::FULLSCREEN_MAX_ENUM, fullscreenType)\n\nSTRINGMAP_CLASS_BEGIN(Window, Window::MessageBoxType, Window::MESSAGEBOX_MAX_ENUM, messageBoxType)\n{\n\t{\"error\", Window::MESSAGEBOX_ERROR},\n\t{\"warning\", Window::MESSAGEBOX_WARNING},\n\t{\"info\", Window::MESSAGEBOX_INFO},\n}\nSTRINGMAP_CLASS_END(Window, Window::MessageBoxType, Window::MESSAGEBOX_MAX_ENUM, messageBoxType)\n\nSTRINGMAP_CLASS_BEGIN(Window, Window::FileDialogType, Window::FILEDIALOG_MAX_ENUM, fileDialogType)\n{\n\t{ \"openfile\", Window::FILEDIALOG_OPENFILE },\n\t{ \"openfolder\", Window::FILEDIALOG_OPENFOLDER },\n\t{ \"savefile\", Window::FILEDIALOG_SAVEFILE },\n}\nSTRINGMAP_CLASS_END(Window, Window::FileDialogType, Window::FILEDIALOG_MAX_ENUM, fileDialogType)\n\nSTRINGMAP_CLASS_BEGIN(Window, Window::DisplayOrientation, Window::ORIENTATION_MAX_ENUM, orientation)\n{\n\t{\"unknown\", Window::ORIENTATION_UNKNOWN},\n\t{\"landscape\", Window::ORIENTATION_LANDSCAPE},\n\t{\"landscapeflipped\", Window::ORIENTATION_LANDSCAPE_FLIPPED},\n\t{\"portrait\", Window::ORIENTATION_PORTRAIT},\n\t{\"portraitflipped\", Window::ORIENTATION_PORTRAIT_FLIPPED},\n}\nSTRINGMAP_CLASS_END(Window, Window::DisplayOrientation, Window::ORIENTATION_MAX_ENUM, orientation)\n\nSTRINGMAP_CLASS_BEGIN(Window, Window::SystemTheme, Window::THEME_MAX_ENUM, systemThemes)\n{\n\t{\"unknown\", Window::THEME_UNKNOWN},\n\t{\"light\", Window::THEME_LIGHT},\n\t{\"dark\", Window::THEME_DARK}\n};\nSTRINGMAP_CLASS_END(Window, Window::SystemTheme, Window::THEME_MAX_ENUM, systemThemes)\n\n\n} // window\n} // love\n"
  },
  {
    "path": "src/modules/window/Window.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_WINDOW_WINDOW_H\n#define LOVE_WINDOW_WINDOW_H\n\n// LOVE\n#include \"common/Module.h\"\n#include \"common/StringMap.h\"\n#include \"common/math.h\"\n#include \"common/Optional.h\"\n#include \"image/ImageData.h\"\n\n// C++\n#include <string>\n#include <vector>\n\nnamespace love\n{\n\nnamespace graphics\n{\nclass Graphics;\n}\n\nnamespace window\n{\n\n// Applied when the window is first created.\nvoid setHighDPIAllowed(bool enable);\nbool isHighDPIAllowed();\n\n// Forward-declared so it can be used in the class methods. We can't define the\n// whole thing here because it uses the Window::Type enum.\nstruct WindowSettings;\n\nclass Window : public Module\n{\npublic:\n\n\ttypedef void (*FileDialogCallback)(void *context, const std::vector<std::string> &files, const char *filtername, const char *err);\n\n\t// Different window settings.\n\tenum Setting\n\t{\n\t\tSETTING_FULLSCREEN,\n\t\tSETTING_FULLSCREEN_TYPE,\n\t\tSETTING_VSYNC,\n\t\tSETTING_MSAA,\n\t\tSETTING_STENCIL,\n\t\tSETTING_DEPTH,\n\t\tSETTING_RESIZABLE,\n\t\tSETTING_MIN_WIDTH,\n\t\tSETTING_MIN_HEIGHT,\n\t\tSETTING_BORDERLESS,\n\t\tSETTING_CENTERED,\n\t\tSETTING_DISPLAYINDEX,\n\t\tSETTING_DISPLAY, // Deprecated\n\t\tSETTING_HIGHDPI, // Deprecated\n\t\tSETTING_USE_DPISCALE,\n\t\tSETTING_REFRESHRATE,\n\t\tSETTING_X,\n\t\tSETTING_Y,\n\t\tSETTING_MAX_ENUM\n\t};\n\n\tenum FullscreenType\n\t{\n\t\tFULLSCREEN_EXCLUSIVE,\n\t\tFULLSCREEN_DESKTOP,\n\t\tFULLSCREEN_MAX_ENUM\n\t};\n\n\tenum MessageBoxType\n\t{\n\t\tMESSAGEBOX_ERROR,\n\t\tMESSAGEBOX_WARNING,\n\t\tMESSAGEBOX_INFO,\n\t\tMESSAGEBOX_MAX_ENUM\n\t};\n\n\tenum FileDialogType\n\t{\n\t\tFILEDIALOG_OPENFILE,\n\t\tFILEDIALOG_OPENFOLDER,\n\t\tFILEDIALOG_SAVEFILE,\n\t\tFILEDIALOG_MAX_ENUM\n\t};\n\n\tenum DisplayOrientation\n\t{\n\t\tORIENTATION_UNKNOWN,\n\t\tORIENTATION_LANDSCAPE,\n\t\tORIENTATION_LANDSCAPE_FLIPPED,\n\t\tORIENTATION_PORTRAIT,\n\t\tORIENTATION_PORTRAIT_FLIPPED,\n\t\tORIENTATION_MAX_ENUM\n\t};\n\n\tenum SystemTheme\n\t{\n\t\tTHEME_UNKNOWN,\n\t\tTHEME_LIGHT,\n\t\tTHEME_DARK,\n\t\tTHEME_MAX_ENUM\n\t};\n\n\tstruct WindowSize\n\t{\n\t\tint width;\n\t\tint height;\n\n\t\tbool operator == (const WindowSize &w) const\n\t\t{\n\t\t\treturn w.width == width && w.height == height;\n\t\t}\n\t};\n\n\tstruct MessageBoxData\n\t{\n\t\tMessageBoxType type;\n\n\t\tstd::string title;\n\t\tstd::string message;\n\n\t\tstd::vector<std::string> buttons;\n\t\tint enterButtonIndex;\n\t\tint escapeButtonIndex;\n\n\t\tbool attachToWindow;\n\t};\n\n\tstruct FileDialogFilter\n\t{\n\t\tstd::string name;\n\t\tstd::string pattern;\n\t};\n\n\tstruct FileDialogData\n\t{\n\t\tFileDialogType type;\n\t\tstd::string title;\n\t\tstd::string acceptLabel;\n\t\tstd::string cancelLabel;\n\t\tstd::string defaultName;\n\t\tstd::vector<FileDialogFilter> filters;\n\t\tbool multiSelect;\n\t\tbool attachToWindow;\n\t};\n\n\tvirtual ~Window();\n\n\tvirtual void setGraphics(graphics::Graphics *graphics) = 0;\n\n\tvirtual bool setWindow(int width = 800, int height = 600, WindowSettings *settings = nullptr) = 0;\n\tvirtual void getWindow(int &width, int &height, WindowSettings &settings) = 0;\n\n\tvirtual void close() = 0;\n\n\tvirtual bool setFullscreen(bool fullscreen, FullscreenType fstype) = 0;\n\tvirtual bool setFullscreen(bool fullscreen) = 0;\n\n\tvirtual bool onSizeChanged(int width, int height) = 0;\n\n\tvirtual int getDisplayCount() const = 0;\n\n\tvirtual const char *getDisplayName(int displayindex) const = 0;\n\n\tvirtual DisplayOrientation getDisplayOrientation(int displayindex) const = 0;\n\n\tvirtual std::vector<WindowSize> getFullscreenSizes(int displayindex) const = 0;\n\n\tvirtual void getDesktopDimensions(int displayindex, int &width, int &height) const = 0;\n\n\tvirtual void setPosition(int x, int y, int displayindex) = 0;\n\tvirtual void getPosition(int &x, int &y, int &displayindex) = 0;\n\n\tvirtual Rect getSafeArea() const = 0;\n\n\tvirtual bool isOpen() const = 0;\n\n\tvirtual void setWindowTitle(const std::string &title) = 0;\n\tvirtual const std::string &getWindowTitle() const = 0;\n\n\tvirtual bool setIcon(love::image::ImageData *imgd) = 0;\n\tvirtual love::image::ImageData *getIcon() = 0;\n\n\tvirtual void setVSync(int vsync) = 0;\n\tvirtual int getVSync() const = 0;\n\n\tvirtual void setDisplaySleepEnabled(bool enable) = 0;\n\tvirtual bool isDisplaySleepEnabled() const = 0;\n\n\tvirtual void minimize() = 0;\n\tvirtual void maximize() = 0;\n\tvirtual void restore() = 0;\n\tvirtual void focus() = 0;\n\n\tvirtual bool isMaximized() const = 0;\n\tvirtual bool isMinimized() const = 0;\n\n\t// default no-op implementation\n\tvirtual void swapBuffers();\n\n\tvirtual bool hasFocus() const = 0;\n\tvirtual bool hasMouseFocus() const = 0;\n\n\tvirtual bool isVisible() const = 0;\n\tvirtual bool isOccluded() const = 0;\n\n\tvirtual void setMouseGrab(bool grab) = 0;\n\tvirtual bool isMouseGrabbed() const = 0;\n\n\tvirtual int getWidth() const = 0;\n\tvirtual int getHeight() const = 0;\n\tvirtual int getPixelWidth() const = 0;\n\tvirtual int getPixelHeight() const = 0;\n\n\tvirtual void clampPositionInWindow(double *wx, double *wy) const = 0;\n\n\t// Note: window-space coordinates are not necessarily the same as\n\t// density-independent units (which toPixels and fromPixels use.)\n\tvirtual void windowToPixelCoords(double *x, double *y) const = 0;\n\tvirtual void pixelToWindowCoords(double *x, double *y) const = 0;\n\n\tvirtual void windowToDPICoords(double *x, double *y) const = 0;\n\tvirtual void DPIToWindowCoords(double *x, double *y) const = 0;\n\n\tvirtual double getDPIScale() const = 0;\n\tvirtual double getNativeDPIScale() const = 0;\n\n\tvirtual double toPixels(double x) const = 0;\n\tvirtual void toPixels(double wx, double wy, double &px, double &py) const = 0;\n\tvirtual double fromPixels(double x) const = 0;\n\tvirtual void fromPixels(double px, double py, double &wx, double &wy) const = 0;\n\n\tvirtual void *getHandle() const = 0;\n\n\tvirtual bool showMessageBox(const std::string &title, const std::string &message, MessageBoxType type, bool attachtowindow) = 0;\n\tvirtual int showMessageBox(const MessageBoxData &data) = 0;\n\n\tvirtual void showFileDialog(const FileDialogData &data, FileDialogCallback callback, void *context) = 0;\n\n\tvirtual void requestAttention(bool continuous) = 0;\n\n\t/**\n\t* Get information about the system theme.\n\t*\n\t* @return System theme, which can be either light, dark, or unknown.\n\t**/\n\tvirtual SystemTheme getSystemTheme() const = 0;\n\n\tSTRINGMAP_CLASS_DECLARE(Setting);\n\tSTRINGMAP_CLASS_DECLARE(FullscreenType);\n\tSTRINGMAP_CLASS_DECLARE(MessageBoxType);\n\tSTRINGMAP_CLASS_DECLARE(FileDialogType);\n\tSTRINGMAP_CLASS_DECLARE(DisplayOrientation);\n\tSTRINGMAP_CLASS_DECLARE(SystemTheme);\n\nprotected:\n\n\tWindow(const char *name);\n\n}; // Window\n\nstruct WindowSettings\n{\n\tbool fullscreen = false;\n\tWindow::FullscreenType fstype = Window::FULLSCREEN_DESKTOP;\n\tint vsync = 1;\n\tint msaa = 0;\n\tbool stencil = true;\n\tbool depth = false;\n\tbool resizable = false;\n\tint minwidth = 1;\n\tint minheight = 1;\n\tbool borderless = false;\n\tbool centered = true;\n\tint displayindex = 0;\n\tbool usedpiscale = true;\n\tdouble refreshrate = 0.0;\n\tbool useposition = false;\n\tint x = 0;\n\tint y = 0;\n};\n\n} // window\n} // love\n\n#endif // LOVE_WINDOW_WINDOW_H\n"
  },
  {
    "path": "src/modules/window/sdl/Window.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n// LOVE\n#include \"common/config.h\"\n#include \"graphics/Graphics.h\"\n#ifdef LOVE_GRAPHICS_VULKAN\n#\tinclude \"graphics/vulkan/Graphics.h\"\n#\tinclude \"graphics/vulkan/Vulkan.h\"\n#endif\n#include \"Window.h\"\n#include \"filesystem/Filesystem.h\"\n\n#ifdef LOVE_ANDROID\n#include \"common/android.h\"\n#endif\n\n#ifdef LOVE_IOS\n#include \"common/ios.h\"\n#endif\n\n// C++\n#include <iostream>\n#include <vector>\n#include <algorithm>\n\n// C\n#include <cstdio>\n\n#ifdef LOVE_GRAPHICS_VULKAN\n#include <SDL3/SDL_vulkan.h>\n#endif\n\n#if defined(LOVE_WINDOWS)\n#define WIN32_LEAN_AND_MEAN\n#include <windows.h>\n#include <dwmapi.h>\n#include <VersionHelpers.h>\n#elif defined(LOVE_MACOS)\n#include \"common/macos.h\"\n#endif\n\n#ifndef APIENTRY\n#define APIENTRY\n#endif\n\nnamespace love\n{\nnamespace window\n{\n\n// See src/modules/window/Window.cpp.\nvoid setHighDPIAllowedImplementation(bool enable)\n{\n\tLOVE_UNUSED(enable);\n}\n\nnamespace sdl\n{\n\nWindow::Window()\n\t: love::window::Window(\"love.window.sdl\")\n\t, open(false)\n\t, mouseGrabbed(false)\n\t, window(nullptr)\n\t, glcontext(nullptr)\n#ifdef LOVE_GRAPHICS_METAL\n\t, metalView(nullptr)\n#endif\n\t, displayedWindowError(false)\n\t, contextAttribs()\n{\n\tif (!SDL_InitSubSystem(SDL_INIT_VIDEO | SDL_INIT_EVENTS))\n\t\tthrow love::Exception(\"Could not initialize SDL video subsystem (%s)\", SDL_GetError());\n\n\t// Make sure the screensaver doesn't activate by default.\n\tsetDisplaySleepEnabled(false);\n\n#ifdef LOVE_WINDOWS\n\t// Turned off by default, because it (ironically) causes stuttering issues\n\t// on some setups. More investigation is needed before enabling it.\n\tcanUseDwmFlush = SDL_GetHintBoolean(\"LOVE_GRAPHICS_VSYNC_DWM\", false);\n#endif\n\n\tdialogEventId = SDL_RegisterEvents(1);\n}\n\nWindow::~Window()\n{\n\tclose(false);\n\tgraphics.set(nullptr);\n\tSDL_QuitSubSystem(SDL_INIT_VIDEO | SDL_INIT_EVENTS);\n}\n\nvoid Window::setGraphics(graphics::Graphics *graphics)\n{\n\tthis->graphics.set(graphics);\n}\n\nvoid Window::setGLFramebufferAttributes(bool sRGB)\n{\n\t// Set GL window / framebuffer attributes.\n\tSDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);\n\tSDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);\n\tSDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);\n\tSDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);\n\tSDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);\n\tSDL_GL_SetAttribute(SDL_GL_RETAINED_BACKING, 0);\n\n\t// Always use 24/8 depth/stencil.\n\t// Changing this after initial window creation would need the context to be\n\t// destroyed and recreated, which we really don't want.\n\tSDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);\n\tSDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);\n\n\t// Backbuffer MSAA is handled by the love.graphics implementation.\n\tSDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0);\n\tSDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0);\n\n\tSDL_GL_SetAttribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, sRGB ? 1 : 0);\n\n#if defined(LOVE_WINDOWS)\n\t// Avoid the Microsoft OpenGL 1.1 software renderer on Windows. Apparently\n\t// older Intel drivers like to use it as a fallback when requesting some\n\t// unsupported framebuffer attribute values, rather than properly failing.\n\tSDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);\n#endif\n}\n\nvoid Window::setGLContextAttributes(const ContextAttribs &attribs)\n{\n\tint profilemask = 0;\n\tint contextflags = 0;\n\n\tif (attribs.gles)\n\t\tprofilemask = SDL_GL_CONTEXT_PROFILE_ES;\n\telse if (attribs.versionMajor * 10 + attribs.versionMinor >= 32)\n\t\tprofilemask |= SDL_GL_CONTEXT_PROFILE_CORE;\n\telse if (attribs.debug)\n\t\tprofilemask = SDL_GL_CONTEXT_PROFILE_COMPATIBILITY;\n\n\tif (attribs.debug)\n\t\tcontextflags |= SDL_GL_CONTEXT_DEBUG_FLAG;\n\n\tSDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, attribs.versionMajor);\n\tSDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, attribs.versionMinor);\n\tSDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, profilemask);\n\tSDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, contextflags);\n}\n\nbool Window::checkGLVersion(const ContextAttribs &attribs, std::string &outversion)\n{\n\ttypedef unsigned char GLubyte;\n\ttypedef unsigned int GLenum;\n\ttypedef const GLubyte *(APIENTRY *glGetStringPtr)(GLenum name);\n\tconst GLenum GL_VENDOR_ENUM   = 0x1F00;\n\tconst GLenum GL_RENDERER_ENUM = 0x1F01;\n\tconst GLenum GL_VERSION_ENUM  = 0x1F02;\n\n\t// We don't have OpenGL headers or an automatic OpenGL function loader in\n\t// this module, so we have to get the glGetString function pointer ourselves.\n\tglGetStringPtr glGetStringFunc = (glGetStringPtr) SDL_GL_GetProcAddress(\"glGetString\");\n\tif (!glGetStringFunc)\n\t\treturn false;\n\n\tconst char *glversion = (const char *) glGetStringFunc(GL_VERSION_ENUM);\n\tif (!glversion)\n\t\treturn false;\n\n\toutversion = glversion;\n\n\tconst char *glrenderer = (const char *) glGetStringFunc(GL_RENDERER_ENUM);\n\tif (glrenderer)\n\t\toutversion += \" - \" + std::string(glrenderer);\n\n\tconst char *glvendor = (const char *) glGetStringFunc(GL_VENDOR_ENUM);\n\tif (glvendor)\n\t\toutversion += \" (\" + std::string(glvendor) + \")\";\n\n\tint glmajor = 0;\n\tint glminor = 0;\n\n\t// glGetString(GL_VERSION) returns a string with the format \"major.minor\",\n\t// or \"OpenGL ES major.minor\" in GLES contexts.\n\tconst char *format = \"%d.%d\";\n\tif (attribs.gles)\n\t\tformat = \"OpenGL ES %d.%d\";\n\n\tif (sscanf(glversion, format, &glmajor, &glminor) != 2)\n\t\treturn false;\n\n\tif (glmajor < attribs.versionMajor\n\t\t|| (glmajor == attribs.versionMajor && glminor < attribs.versionMinor))\n\t\treturn false;\n\n\treturn true;\n}\n\nstd::vector<Window::ContextAttribs> Window::getContextAttribsList() const\n{\n\t// If we already have a set of context attributes that we know work, just\n\t// return that. love.graphics doesn't really support switching GL versions\n\t// after the first initialization.\n\tif (contextAttribs.versionMajor > 0)\n\t\treturn std::vector<ContextAttribs>{contextAttribs};\n\n\tbool preferGLES = false;\n\n#ifdef LOVE_GRAPHICS_USE_OPENGLES\n\tpreferGLES = true;\n#endif\n\n\tconst char *curdriver = SDL_GetCurrentVideoDriver();\n\tconst char *glesdrivers[] = {\"RPI\", \"Android\", \"uikit\", \"winrt\", \"emscripten\"};\n\n\t// We always want to try OpenGL ES first on certain video backends.\n\tfor (const char *glesdriver : glesdrivers)\n\t{\n\t\tif (curdriver && strstr(curdriver, glesdriver) == curdriver)\n\t\t{\n\t\t\tpreferGLES = true;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tconst char *gleshint = SDL_GetHint(\"LOVE_GRAPHICS_USE_OPENGLES\");\n\tif (gleshint != nullptr)\n\t\tpreferGLES = (gleshint != nullptr && gleshint[0] != '0');\n\n\t// Do we want a debug context?\n\tbool debug = love::graphics::isDebugEnabled();\n\n\tconst char *preferGL3hint = SDL_GetHint(\"LOVE_GRAPHICS_USE_GL3\");\n\tbool preferGL3 = (preferGL3hint != nullptr && preferGL3hint[0] != '0');\n\n\tstd::vector<ContextAttribs> glcontexts =\n\t{\n\t\t{4, 3, false, debug},\n\t\t{3, 3, false, debug},\n\t};\n\n\tstd::vector<ContextAttribs> glescontexts =\n\t{\n\t\t{3, 2, true, debug},\n\t\t{3, 0, true, debug},\n\t};\n\n\tif (preferGL3)\n\t{\n\t\tstd::swap(glcontexts[0], glcontexts[1]);\n\t\tstd::swap(glescontexts[0], glescontexts[1]);\n\t}\n\n\tstd::vector<ContextAttribs> attribslist;\n\n\tif (preferGLES)\n\t{\n\t\tattribslist.insert(attribslist.end(), glescontexts.begin(), glescontexts.end());\n\t\tattribslist.insert(attribslist.end(), glcontexts.begin(), glcontexts.end());\n\t}\n\telse\n\t{\n\t\tattribslist.insert(attribslist.end(), glcontexts.begin(), glcontexts.end());\n\t\tattribslist.insert(attribslist.end(), glescontexts.begin(), glescontexts.end());\n\t}\n\n\treturn attribslist;\n}\n\nbool Window::createWindowAndContext(int x, int y, int w, int h, Uint32 windowflags, graphics::Renderer renderer)\n{\n\tbool needsglcontext = (windowflags & SDL_WINDOW_OPENGL) != 0;\n#ifdef LOVE_GRAPHICS_METAL\n\tbool needsmetalview = (windowflags & SDL_WINDOW_METAL) != 0;\n#endif\n\n\tstd::string windowerror;\n\tstd::string contexterror;\n\tstd::string glversion;\n\n\t// Unfortunately some OpenGL context settings are part of the internal\n\t// window state in the Windows and Linux SDL backends, so we have to\n\t// recreate the window when we want to change those settings...\n\t// Also, apparently some Intel drivers on Windows give back a Microsoft\n\t// OpenGL 1.1 software renderer context when high MSAA values are requested!\n\n\tconst auto create = [&](const ContextAttribs *attribs) -> bool\n\t{\n\t\tif (glcontext)\n\t\t{\n\t\t\tSDL_GL_DestroyContext(glcontext);\n\t\t\tglcontext = nullptr;\n\t\t}\n\n#ifdef LOVE_GRAPHICS_METAL\n\t\tif (metalView)\n\t\t{\n\t\t\tSDL_Metal_DestroyView(metalView);\n\t\t\tmetalView = nullptr;\n\t\t}\n#endif\n\n\t\tif (window)\n\t\t{\n\t\t\tSDL_DestroyWindow(window);\n\t\t\tSDL_FlushEvents(SDL_EVENT_WINDOW_FIRST, SDL_EVENT_WINDOW_LAST);\n\t\t\twindow = nullptr;\n\t\t}\n\n\t\twindow = SDL_CreateWindow(title.c_str(), w, h, windowflags);\n\n\t\tif (!window)\n\t\t{\n\t\t\twindowerror = std::string(SDL_GetError());\n\t\t\treturn false;\n\t\t}\n\n\t\tSDL_SetWindowPosition(window, x, y);\n\n\t\tif (attribs != nullptr && renderer == love::graphics::Renderer::RENDERER_OPENGL)\n\t\t{\n#ifdef LOVE_MACOS\n\t\t\tlove::macos::setWindowSRGBColorSpace(window);\n#endif\n\n\t\t\tglcontext = SDL_GL_CreateContext(window);\n\n\t\t\tif (!glcontext)\n\t\t\t\tcontexterror = std::string(SDL_GetError());\n\n\t\t\t// Make sure the context's version is at least what we requested.\n\t\t\tif (glcontext && !checkGLVersion(*attribs, glversion))\n\t\t\t{\n\t\t\t\tSDL_GL_DestroyContext(glcontext);\n\t\t\t\tglcontext = nullptr;\n\t\t\t}\n\n\t\t\tif (!glcontext)\n\t\t\t{\n\t\t\t\tSDL_DestroyWindow(window);\n\t\t\t\twindow = nullptr;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t};\n\n\tif (renderer == graphics::RENDERER_OPENGL)\n\t{\n\t\tstd::vector<ContextAttribs> attribslist = getContextAttribsList();\n\n\t\t// Try each context profile in order.\n\t\tfor (ContextAttribs attribs : attribslist)\n\t\t{\n\t\t\tbool curSRGB = love::graphics::isGammaCorrect();\n\n\t\t\tsetGLFramebufferAttributes(curSRGB);\n\t\t\tsetGLContextAttributes(attribs);\n\n\t\t\twindowerror.clear();\n\t\t\tcontexterror.clear();\n\n\t\t\tcreate(&attribs);\n\n\t\t\tif (!window && curSRGB)\n\t\t\t{\n\t\t\t\t// The sRGB setting could have caused the failure.\n\t\t\t\tsetGLFramebufferAttributes(false);\n\t\t\t\tif (create(&attribs))\n\t\t\t\t\tcurSRGB = false;\n\t\t\t}\n\n\t\t\tif (window && glcontext)\n\t\t\t{\n\t\t\t\t// Store the successful context attributes so we can re-use them in\n\t\t\t\t// subsequent calls to createWindowAndContext.\n\t\t\t\tcontextAttribs = attribs;\n\t\t\t\tlove::graphics::setGammaCorrect(curSRGB);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n#ifdef LOVE_GRAPHICS_METAL\n\telse if (renderer == graphics::RENDERER_METAL)\n\t{\n\t\tif (create(nullptr) && window != nullptr)\n\t\t\tmetalView = SDL_Metal_CreateView(window);\n\n\t\tif (metalView == nullptr && window != nullptr)\n\t\t{\n\t\t\tcontexterror = SDL_GetError();\n\t\t\tSDL_DestroyWindow(window);\n\t\t\twindow = nullptr;\n\t\t}\n\t}\n#endif\n\telse\n\t{\n\t\tcreate(nullptr);\n\t}\n\n\tbool failed = window == nullptr;\n\tfailed |= (needsglcontext && !glcontext);\n#ifdef LOVE_GRAPHICS_METAL\n\tfailed |= (needsmetalview && !metalView);\n#endif\n\n\tif (failed)\n\t{\n\t\tstd::string title = \"Unable to create renderer\";\n\t\tstd::string message = \"This program requires a graphics card and video drivers which support OpenGL 3.3 or OpenGL ES 3.0.\";\n\n\t\tif (!glversion.empty())\n\t\t\tmessage += \"\\n\\nDetected OpenGL version:\\n\" + glversion;\n\t\telse if (!contexterror.empty())\n\t\t\tmessage += \"\\n\\nRenderer context creation error: \" + contexterror;\n\t\telse if (!windowerror.empty())\n\t\t\tmessage += \"\\n\\nSDL window creation error: \" + windowerror;\n\n\t\tstd::cerr << title << std::endl << message << std::endl;\n\n\t\t// Display a message box with the error, but only once.\n\t\tif (!displayedWindowError)\n\t\t{\n\t\t\tshowMessageBox(title, message, MESSAGEBOX_ERROR, false);\n\t\t\tdisplayedWindowError = true;\n\t\t}\n\n\t\tclose();\n\t\treturn false;\n\t}\n\n\topen = true;\n\treturn true;\n}\n\nstruct SDLDisplayIDs\n{\n\tSDLDisplayIDs()\n\t{\n\t\tids = SDL_GetDisplays(&count);\n\t}\n\n\t~SDLDisplayIDs()\n\t{\n\t\tif (ids)\n\t\t\tSDL_free(ids);\n\t}\n\n\tint count = 0;\n\tSDL_DisplayID *ids = nullptr;\n};\n\nstatic SDL_DisplayID GetSDLDisplayIDForIndex(int displayindex)\n{\n\tSDLDisplayIDs displayids;\n\tif (displayindex < 0 || displayindex >= displayids.count)\n\t\treturn (SDL_DisplayID) 0;\n\treturn displayids.ids[displayindex];\n}\n\nbool Window::setWindow(int width, int height, WindowSettings *settings)\n{\n\tif (!graphics.get())\n\t\tgraphics.set(Module::getInstance<graphics::Graphics>(Module::M_GRAPHICS));\n\n\tif (graphics.get() && graphics->isRenderTargetActive())\n\t\tthrow love::Exception(\"love.window.setMode cannot be called while a render target is active in love.graphics.\");\n\n\tauto renderer = graphics != nullptr ? graphics->getRenderer() : graphics::RENDERER_NONE;\n\n\tif (isOpen())\n\t\tupdateSettings(this->settings, false);\n\n\tWindowSettings f;\n\n\tif (settings)\n\t\tf = *settings;\n\n\tf.minwidth = std::max(f.minwidth, 1);\n\tf.minheight = std::max(f.minheight, 1);\n\n\tSDLDisplayIDs displays;\n\tint displaycount = displays.count;\n\n\tf.displayindex = std::min(std::max(f.displayindex, 0), displaycount - 1);\n\n\t// Use the desktop resolution if a width or height of 0 is specified.\n\tif (width == 0 || height == 0)\n\t{\n\t\tconst SDL_DisplayMode *mode = SDL_GetDesktopDisplayMode(displays.ids[f.displayindex]);\n\t\twidth = mode->w;\n\t\theight = mode->h;\n\t}\n\n\t// On Android, disable fullscreen first on window creation so it's\n\t// possible to change the orientation by specifying portait width and\n\t// height, otherwise SDL will pick the current orientation dimensions when\n\t// fullscreen flag is set. Don't worry, we'll set it back later when user\n\t// also requested fullscreen after the window is created.\n\t// See https://github.com/love2d/love-android/issues/196\n#ifdef LOVE_ANDROID\n\tbool fullscreen = f.fullscreen;\n\n\tf.fullscreen = false;\n\tf.fstype = FULLSCREEN_DESKTOP;\n#endif\n\n\tint x = f.x;\n\tint y = f.y;\n\n\tif (f.useposition)\n\t{\n\t\t// The position needs to be in the global coordinate space.\n\t\tSDL_Rect displaybounds = {};\n\t\tSDL_GetDisplayBounds(displays.ids[f.displayindex], &displaybounds);\n\t\tx += displaybounds.x;\n\t\ty += displaybounds.y;\n\t}\n\telse\n\t{\n\t\tif (f.centered)\n\t\t\tx = y = SDL_WINDOWPOS_CENTERED_DISPLAY(displays.ids[f.displayindex]);\n\t\telse\n\t\t\tx = y = SDL_WINDOWPOS_UNDEFINED_DISPLAY(displays.ids[f.displayindex]);\n\t}\n\n\tUint32 sdlflags = 0;\n\tSDL_DisplayMode fsmode = {};\n\n\tif (f.fullscreen)\n\t{\n\t\tsdlflags |= SDL_WINDOW_FULLSCREEN;\n\n\t\tif (f.fstype == FULLSCREEN_EXCLUSIVE)\n\t\t{\n\t\t\tSDL_DisplayID display = displays.ids[f.displayindex];\n\t\t\tif (!SDL_GetClosestFullscreenDisplayMode(display, width, height, 0, isHighDPIAllowed(), &fsmode))\n\t\t\t{\n\t\t\t\t// GetClosestDisplayMode will fail if we request a size larger\n\t\t\t\t// than the largest available display mode, so we'll try to use\n\t\t\t\t// the largest (first) mode in that case.\n\t\t\t\tint modecount = 0;\n\t\t\t\tSDL_DisplayMode **modes = SDL_GetFullscreenDisplayModes(display, &modecount);\n\t\t\t\tif (modecount > 0)\n\t\t\t\t\tfsmode = *modes[0];\n\t\t\t\tSDL_free(modes);\n\t\t\t\tif (fsmode.w == 0 || fsmode.h == 0)\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\tbool needsetmode = false;\n\n\tif (renderer != windowRenderer && isOpen())\n\t\tclose();\n\n\tif (isOpen())\n\t{\n\t\tSDL_SetWindowMinimumSize(window, f.minwidth, f.minheight);\n\n\t\tif (fsmode.w > 0 && fsmode.h > 0)\n\t\t\tSDL_SetWindowFullscreenMode(window, &fsmode);\n\t\telse\n\t\t\tSDL_SetWindowFullscreenMode(window, nullptr);\n\n\t\tif (SDL_SetWindowFullscreen(window, (sdlflags & SDL_WINDOW_FULLSCREEN) != 0) && renderer == graphics::RENDERER_OPENGL)\n\t\t\tSDL_GL_MakeCurrent(window, glcontext);\n\n\t\t// TODO: should we make this conditional, to avoid love.resize events when the size doesn't change?\n\t\tSDL_SetWindowSize(window, width, height);\n\n\t\tif (this->settings.resizable != f.resizable)\n\t\t\tSDL_SetWindowResizable(window, f.resizable);\n\n\t\tif (this->settings.borderless != f.borderless)\n\t\t\tSDL_SetWindowBordered(window, !f.borderless);\n\t}\n\telse\n\t{\n\t\tif (renderer == graphics::RENDERER_OPENGL)\n\t\t\tsdlflags |= SDL_WINDOW_OPENGL;\n\t#ifdef LOVE_GRAPHICS_METAL\n\t\tif (renderer == graphics::RENDERER_METAL)\n\t\t\tsdlflags |= SDL_WINDOW_METAL;\n\t#endif\n\n\t\tif (renderer == graphics::RENDERER_VULKAN)\n\t\t\tsdlflags |= SDL_WINDOW_VULKAN;\n\n\t\tif (f.resizable)\n\t\t\t sdlflags |= SDL_WINDOW_RESIZABLE;\n\n\t\tif (f.borderless)\n\t\t\t sdlflags |= SDL_WINDOW_BORDERLESS;\n\n\t\t// Note: this flag is ignored on Windows.\n\t\tif (isHighDPIAllowed())\n\t\t\tsdlflags |= SDL_WINDOW_HIGH_PIXEL_DENSITY;\n\n\t\tUint32 createflags = sdlflags & (~SDL_WINDOW_FULLSCREEN);\n\n\t\tif (!createWindowAndContext(x, y, width, height, createflags, renderer))\n\t\t\treturn false;\n\n\t\tSDL_SetWindowMinimumSize(window, f.minwidth, f.minheight);\n\n\t\tif (f.fullscreen)\n\t\t{\n\t\t\tif (fsmode.w > 0 && fsmode.h > 0)\n\t\t\t\tSDL_SetWindowFullscreenMode(window, &fsmode);\n\t\t\telse\n\t\t\t\tSDL_SetWindowFullscreenMode(window, nullptr);\n\t\t\tSDL_SetWindowFullscreen(window, true);\n\t\t}\n\n\t\tneedsetmode = true;\n\t}\n\n\twindowRenderer = renderer;\n\n\t// Make sure the window keeps any previously set icon.\n\tsetIcon(icon.get());\n\n\t// Make sure the mouse keeps its previous grab setting.\n\tsetMouseGrab(mouseGrabbed);\n\n\tif (this->settings.displayindex != f.displayindex || f.useposition || f.centered)\n\t\tSDL_SetWindowPosition(window, x, y);\n\n\tSDL_RaiseWindow(window);\n\n\tsetVSync(f.vsync);\n\n\tupdateSettings(f, false);\n\n\tif (graphics.get())\n\t{\n\t\tdouble scaledw, scaledh;\n\t\tfromPixels((double) pixelWidth, (double) pixelHeight, scaledw, scaledh);\n\n\t\tif (needsetmode)\n\t\t{\n\t\t\tvoid *context = nullptr;\n\t\t\tif (renderer == graphics::RENDERER_OPENGL)\n\t\t\t\tcontext = (void *) glcontext;\n#ifdef LOVE_GRAPHICS_METAL\n\t\t\tif (renderer == graphics::RENDERER_METAL && metalView)\n\t\t\t\tcontext = (void *) SDL_Metal_GetLayer(metalView);\n#endif\n\n\t\t\t// TODO: try/catch\n\t\t\tgraphics->setMode(context, (int) scaledw, (int) scaledh, pixelWidth, pixelHeight, f.stencil, f.depth, f.msaa);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tgraphics->backbufferChanged((int) scaledw, (int) scaledh, pixelWidth, pixelHeight, f.stencil, f.depth, f.msaa);\n\t\t}\n\n\t\tthis->settings.msaa = graphics->getBackbufferMSAA();\n\t}\n\n\t// Set fullscreen when user requested it before.\n\t// See above for explanation.\n#ifdef LOVE_ANDROID\n\tsetFullscreen(fullscreen);\n\tlove::android::setImmersive(fullscreen);\n#endif\n\n\tSDL_SyncWindow(window);\n\n\treturn true;\n}\n\nbool Window::onSizeChanged(int width, int height)\n{\n\tif (!window)\n\t\treturn false;\n\n\tSDL_GetWindowSize(window, &windowWidth, &windowHeight);\n\n\tif (!SDL_GetWindowSizeInPixels(window, &pixelWidth, &pixelHeight))\n\t{\n\t\tpixelWidth = width;\n\t\tpixelHeight = height;\n\t}\n\n\tif (graphics.get())\n\t{\n\t\tdouble scaledw, scaledh;\n\t\tfromPixels((double) pixelWidth, (double) pixelHeight, scaledw, scaledh);\n\t\tgraphics->backbufferChanged((int) scaledw, (int) scaledh, pixelWidth, pixelHeight);\n\t}\n\n\treturn true;\n}\n\nvoid Window::updateSettings(const WindowSettings &newsettings, bool updateGraphicsViewport)\n{\n\tSDL_SyncWindow(window);\n\n\tUint32 wflags = SDL_GetWindowFlags(window);\n\n\t// Set the new display mode as the current display mode.\n\tSDL_GetWindowSize(window, &windowWidth, &windowHeight);\n\n\tpixelWidth = windowWidth;\n\tpixelHeight = windowHeight;\n\n\tSDL_GetWindowSizeInPixels(window, &pixelWidth, &pixelHeight);\n\n\tif (((wflags & SDL_WINDOW_FULLSCREEN) == SDL_WINDOW_FULLSCREEN) && SDL_GetWindowFullscreenMode(window) == nullptr)\n\t{\n\t\tsettings.fullscreen = true;\n\t\tsettings.fstype = FULLSCREEN_DESKTOP;\n\t}\n\telse if ((wflags & SDL_WINDOW_FULLSCREEN) == SDL_WINDOW_FULLSCREEN)\n\t{\n\t\tsettings.fullscreen = true;\n\t\tsettings.fstype = FULLSCREEN_EXCLUSIVE;\n\t}\n\telse\n\t{\n\t\tsettings.fullscreen = false;\n\t\tsettings.fstype = newsettings.fstype;\n\t}\n\n#ifdef LOVE_ANDROID\n\tsettings.fullscreen = love::android::getImmersive();\n#endif\n\n\t// SDL_GetWindowMinimumSize gives back 0,0 sometimes...\n\tsettings.minwidth = newsettings.minwidth;\n\tsettings.minheight = newsettings.minheight;\n\n\tsettings.resizable = (wflags & SDL_WINDOW_RESIZABLE) != 0;\n\tsettings.borderless = (wflags & SDL_WINDOW_BORDERLESS) != 0;\n\tsettings.centered = newsettings.centered;\n\n\tgetPosition(settings.x, settings.y, settings.displayindex);\n\n\tsetHighDPIAllowed((wflags & SDL_WINDOW_HIGH_PIXEL_DENSITY) != 0);\n\n\tsettings.usedpiscale = newsettings.usedpiscale;\n\n\t// Only minimize on focus loss if the window is in exclusive-fullscreen mode\n\tif (settings.fullscreen && settings.fstype == FULLSCREEN_EXCLUSIVE)\n\t\tSDL_SetHint(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, \"1\");\n\telse\n\t\tSDL_SetHint(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, \"0\");\n\n\tsettings.vsync = getVSync();\n\n\tsettings.stencil = newsettings.stencil;\n\tsettings.depth = newsettings.depth;\n\n\tSDLDisplayIDs displayids;\n\tconst SDL_DisplayMode *dmode = SDL_GetCurrentDisplayMode(displayids.ids[settings.displayindex]);\n\n\t// May be 0 if the refresh rate can't be determined.\n\tsettings.refreshrate = dmode->refresh_rate;\n\n\t// Update the viewport size now instead of waiting for event polling.\n\tif (updateGraphicsViewport && graphics.get())\n\t{\n\t\tdouble scaledw, scaledh;\n\t\tfromPixels((double) pixelWidth, (double) pixelHeight, scaledw, scaledh);\n\t\tgraphics->backbufferChanged((int) scaledw, (int) scaledh, pixelWidth, pixelHeight);\n\t}\n}\n\nvoid Window::getWindow(int &width, int &height, WindowSettings &newsettings)\n{\n\t// The window might have been modified (moved, resized, etc.) by the user.\n\tif (window)\n\t\tupdateSettings(settings, true);\n\n\twidth = windowWidth;\n\theight = windowHeight;\n\tnewsettings = settings;\n}\n\nvoid Window::close()\n{\n\tclose(true);\n}\n\nvoid Window::close(bool allowExceptions)\n{\n\tif (graphics.get())\n\t{\n\t\tif (allowExceptions && graphics->isRenderTargetActive())\n\t\t\tthrow love::Exception(\"love.window.close cannot be called while a render target is active in love.graphics.\");\n\n\t\tgraphics->unSetMode();\n\t}\n\n\tif (glcontext)\n\t{\n\t\tSDL_GL_DestroyContext(glcontext);\n\t\tglcontext = nullptr;\n\t}\n\n#ifdef LOVE_GRAPHICS_METAL\n\tif (metalView)\n\t{\n\t\tSDL_Metal_DestroyView(metalView);\n\t\tmetalView = nullptr;\n\t}\n#endif\n\n\tif (window)\n\t{\n\t\tSDL_DestroyWindow(window);\n\t\twindow = nullptr;\n\n\t\t// The old window may have generated pending events which are no longer\n\t\t// relevant. Destroy them all!\n\t\tSDL_FlushEvents(SDL_EVENT_WINDOW_FIRST, SDL_EVENT_WINDOW_LAST);\n\t}\n\n\topen = false;\n}\n\nbool Window::setFullscreen(bool fullscreen, FullscreenType fstype)\n{\n\tif (!window)\n\t\treturn false;\n\n\tif (graphics.get() && graphics->isRenderTargetActive())\n\t\tthrow love::Exception(\"love.window.setFullscreen cannot be called while a render target is active in love.graphics.\");\n\n\tWindowSettings newsettings = settings;\n\tnewsettings.fullscreen = fullscreen;\n\tnewsettings.fstype = fstype;\n\n\tbool sdlflags = fullscreen;\n\tif (fullscreen)\n\t{\n\t\tif (fstype == FULLSCREEN_DESKTOP)\n\t\t\tSDL_SetWindowFullscreenMode(window, nullptr);\n\t\telse\n\t\t{\n\t\t\tSDL_DisplayID displayid = SDL_GetDisplayForWindow(window);\n\t\t\tSDL_DisplayMode mode = {};\n\t\t\tif (SDL_GetClosestFullscreenDisplayMode(displayid, windowWidth, windowHeight, 0, isHighDPIAllowed(), &mode))\n\t\t\t\tSDL_SetWindowFullscreenMode(window, &mode);\n\t\t}\n\t}\n\n#ifdef LOVE_ANDROID\n\tlove::android::setImmersive(fullscreen);\n#endif\n\n\tif (SDL_SetWindowFullscreen(window, sdlflags))\n\t{\n\t\tif (glcontext)\n\t\t\tSDL_GL_MakeCurrent(window, glcontext);\n\n\t\tupdateSettings(newsettings, true);\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool Window::setFullscreen(bool fullscreen)\n{\n\treturn setFullscreen(fullscreen, settings.fstype);\n}\n\nint Window::getDisplayCount() const\n{\n\tSDLDisplayIDs displayids;\n\treturn displayids.count;\n}\n\nconst char *Window::getDisplayName(int displayindex) const\n{\n\tconst char *name = SDL_GetDisplayName(GetSDLDisplayIDForIndex(displayindex));\n\n\tif (name == nullptr)\n\t\tthrow love::Exception(\"Invalid display index: %d\", displayindex + 1);\n\n\treturn name;\n}\n\nWindow::DisplayOrientation Window::getDisplayOrientation(int displayindex) const\n{\n\tswitch (SDL_GetCurrentDisplayOrientation(GetSDLDisplayIDForIndex(displayindex)))\n\t{\n\t\tcase SDL_ORIENTATION_UNKNOWN: return ORIENTATION_UNKNOWN;\n\t\tcase SDL_ORIENTATION_LANDSCAPE: return ORIENTATION_LANDSCAPE;\n\t\tcase SDL_ORIENTATION_LANDSCAPE_FLIPPED: return ORIENTATION_LANDSCAPE_FLIPPED;\n\t\tcase SDL_ORIENTATION_PORTRAIT: return ORIENTATION_PORTRAIT;\n\t\tcase SDL_ORIENTATION_PORTRAIT_FLIPPED: return ORIENTATION_PORTRAIT_FLIPPED;\n\t}\n\n\treturn ORIENTATION_UNKNOWN;\n}\n\nstd::vector<Window::WindowSize> Window::getFullscreenSizes(int displayindex) const\n{\n\tstd::vector<WindowSize> sizes;\n\n\tint count = 0;\n\tSDL_DisplayMode **modes = SDL_GetFullscreenDisplayModes(GetSDLDisplayIDForIndex(displayindex), &count);\n\n\tfor (int i = 0; i < count; i++)\n\t{\n\t\t// TODO: other mode properties?\n\t\tWindowSize w = {modes[i]->w, modes[i]->h};\n\n\t\t// SDL2's display mode list has multiple entries for modes of the same\n\t\t// size with different bits per pixel, so we need to filter those out.\n\t\tif (std::find(sizes.begin(), sizes.end(), w) == sizes.end())\n\t\t\tsizes.push_back(w);\n\t}\n\n\tSDL_free(modes);\n\n\treturn sizes;\n}\n\nvoid Window::getDesktopDimensions(int displayindex, int &width, int &height) const\n{\n\tconst SDL_DisplayMode *mode = SDL_GetDesktopDisplayMode(GetSDLDisplayIDForIndex(displayindex));\n\tif (mode != nullptr)\n\t{\n\t\t// TODO: other properties?\n\t\twidth = mode->w;\n\t\theight = mode->h;\n\t}\n\telse\n\t{\n\t\twidth = 0;\n\t\theight = 0;\n\t}\n}\n\nvoid Window::setPosition(int x, int y, int displayindex)\n{\n\tif (!window)\n\t\treturn;\n\n\tSDLDisplayIDs displayids;\n\n\tdisplayindex = std::min(std::max(displayindex, 0), displayids.count - 1);\n\n\tSDL_Rect displaybounds = {};\n\tSDL_GetDisplayBounds(displayids.ids[displayindex], &displaybounds);\n\n\t// The position needs to be in the global coordinate space.\n\tx += displaybounds.x;\n\ty += displaybounds.y;\n\n\tSDL_SetWindowPosition(window, x, y);\n\tSDL_SyncWindow(window);\n\n\tsettings.useposition = true;\n}\n\nvoid Window::getPosition(int &x, int &y, int &displayindex)\n{\n\tif (!window)\n\t{\n\t\tx = y =  0;\n\t\tdisplayindex = 0;\n\t\treturn;\n\t}\n\n\tSDL_DisplayID displayid = SDL_GetDisplayForWindow(window);\n\tSDLDisplayIDs displayids;\n\tdisplayindex = 0;\n\tfor (int i = 0; i < displayids.count; i++)\n\t{\n\t\tif (displayids.ids[i] == displayid)\n\t\t{\n\t\t\tdisplayindex = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tSDL_GetWindowPosition(window, &x, &y);\n\n\t// In SDL <= 2.0.3, fullscreen windows are always reported as 0,0. In every\n\t// other case we need to convert the position from global coordinates to the\n\t// monitor's coordinate space.\n\tif (x != 0 || y != 0)\n\t{\n\t\tSDL_Rect displaybounds = {};\n\t\tSDL_GetDisplayBounds(displayid, &displaybounds);\n\n\t\tx -= displaybounds.x;\n\t\ty -= displaybounds.y;\n\t}\n}\n\nRect Window::getSafeArea() const\n{\n#if defined(LOVE_IOS)\n\tif (window != nullptr)\n\t\treturn love::ios::getSafeArea(window);\n#elif defined(LOVE_ANDROID)\n\tif (window != nullptr)\n\t{\n\t\tint top, left, bottom, right;\n\n\t\tif (love::android::getSafeArea(top, left, bottom, right))\n\t\t{\n\t\t\t// DisplayCutout API returns safe area in pixels\n\t\t\t// and is affected by display orientation.\n\t\t\tdouble safeLeft, safeTop, safeWidth, safeHeight;\n\t\t\tfromPixels(left, top, safeLeft, safeTop);\n\t\t\tfromPixels(pixelWidth - left - right, pixelHeight - top - bottom, safeWidth, safeHeight);\n\t\t\treturn {(int) safeLeft, (int) safeTop, (int) safeWidth, (int) safeHeight};\n\t\t}\n\t}\n#endif\n\n\tdouble dw, dh;\n\tfromPixels(pixelWidth, pixelHeight, dw, dh);\n\treturn {0, 0, (int) dw, (int) dh};\n}\n\nbool Window::isOpen() const\n{\n\treturn open;\n}\n\nvoid Window::setWindowTitle(const std::string &title)\n{\n\tthis->title = title;\n\n\tif (window)\n\t\tSDL_SetWindowTitle(window, title.c_str());\n}\n\nconst std::string &Window::getWindowTitle() const\n{\n\treturn title;\n}\n\nbool Window::setIcon(love::image::ImageData *imgd)\n{\n\tif (!imgd)\n\t\treturn false;\n\n\tif (imgd->getFormat() != PIXELFORMAT_RGBA8_UNORM)\n\t\tthrow love::Exception(\"setIcon only accepts 32-bit RGBA images.\");\n\n\ticon.set(imgd);\n\n\tif (!window)\n\t\treturn false;\n\n\tint w = imgd->getWidth();\n\tint h = imgd->getHeight();\n\tint bytesperpixel = (int) getPixelFormatBlockSize(imgd->getFormat());\n\tint pitch = w * bytesperpixel;\n\n\tSDL_Surface *sdlicon = SDL_CreateSurfaceFrom(w, h, SDL_PIXELFORMAT_ABGR8888, imgd->getData(), pitch);\n\n\tif (!sdlicon)\n\t\treturn false;\n\n\tSDL_SetWindowIcon(window, sdlicon);\n\tSDL_DestroySurface(sdlicon);\n\n\treturn true;\n}\n\nlove::image::ImageData *Window::getIcon()\n{\n\treturn icon.get();\n}\n\nvoid Window::setVSync(int vsync)\n{\n\tif (glcontext != nullptr)\n\t{\n\t\tSDL_GL_SetSwapInterval(vsync);\n\n\t\t// Check if adaptive vsync was requested but not supported, and fall\n\t\t// back to regular vsync if so.\n\t\tif (vsync == -1)\n\t\t{\n\t\t\tint actualvsync = 0;\n\t\t\tSDL_GL_GetSwapInterval(&actualvsync);\n\t\t\tif (actualvsync != -1)\n\t\t\t\tSDL_GL_SetSwapInterval(1);\n\t\t}\n\t}\n\n#ifdef LOVE_GRAPHICS_VULKAN\n\tif (windowRenderer == love::graphics::RENDERER_VULKAN)\n\t{\n\t\tauto vgfx = dynamic_cast<love::graphics::vulkan::Graphics*>(graphics.get());\n\t\tvgfx->setVsync(vsync);\n\t}\n#endif\n\n#if defined(LOVE_GRAPHICS_METAL) && defined(LOVE_MACOS)\n\tif (metalView != nullptr)\n\t{\n\t\tvoid *metallayer = SDL_Metal_GetLayer(metalView);\n\t\tlove::macos::setMetalLayerVSync(metallayer, vsync != 0);\n\t}\n#endif\n}\n\nint Window::getVSync() const\n{\n\tif (glcontext != nullptr)\n\t{\n\t\tint interval = 0;\n\t\tSDL_GL_GetSwapInterval(&interval);\n\t\treturn interval;\n\t}\n\n#if defined(LOVE_GRAPHICS_METAL)\n\tif (metalView != nullptr)\n\t{\n#ifdef LOVE_MACOS\n\t\tvoid *metallayer = SDL_Metal_GetLayer(metalView);\n\t\treturn love::macos::getMetalLayerVSync(metallayer) ? 1 : 0;\n#else\n\t\treturn 1;\n#endif\n\t}\n#endif\n\n#ifdef LOVE_GRAPHICS_VULKAN\n\tif (windowRenderer == love::graphics::RENDERER_VULKAN)\n\t{\n\t\tauto vgfx = dynamic_cast<love::graphics::vulkan::Graphics*>(graphics.get());\n\t\treturn vgfx->getVsync();\n\t}\n#endif\n\n\treturn 0;\n}\n\nvoid Window::setDisplaySleepEnabled(bool enable)\n{\n\tif (enable)\n\t\tSDL_EnableScreenSaver();\n\telse\n\t\tSDL_DisableScreenSaver();\n}\n\nbool Window::isDisplaySleepEnabled() const\n{\n\treturn SDL_ScreenSaverEnabled();\n}\n\nvoid Window::minimize()\n{\n\tif (window != nullptr)\n\t{\n\t\tSDL_MinimizeWindow(window);\n\t\tupdateSettings(settings, true);\n\t}\n}\n\nvoid Window::maximize()\n{\n\tif (window != nullptr)\n\t{\n\t\tSDL_MaximizeWindow(window);\n\t\tupdateSettings(settings, true);\n\t}\n}\n\nvoid Window::restore()\n{\n\tif (window != nullptr)\n\t{\n\t\tSDL_RestoreWindow(window);\n\t\tupdateSettings(settings, true);\n\t}\n}\n\nvoid Window::focus()\n{\n\tif (window != nullptr)\n\t{\n\t\tSDL_RaiseWindow(window);\n\t\tupdateSettings(settings, true);\n\t}\n}\n\nbool Window::isMaximized() const\n{\n\treturn window != nullptr && (SDL_GetWindowFlags(window) & SDL_WINDOW_MAXIMIZED);\n}\n\nbool Window::isMinimized() const\n{\n\treturn window != nullptr && (SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED);\n}\n\nvoid Window::swapBuffers()\n{\n\tif (glcontext)\n\t{\n#ifdef LOVE_WINDOWS\n\t\tbool useDwmFlush = false;\n\t\tint swapInterval = getVSync();\n\n\t\t// https://github.com/love2d/love/issues/1628\n\t\t// VSync can interact badly with Windows desktop composition (DWM) in windowed mode. DwmFlush can be used instead\n\t\t// of vsync, but it's much less flexible so we're very conservative here with where it's used:\n\t\t// - It won't work with exclusive or desktop fullscreen.\n\t\t// - DWM refreshes don't always match the refresh rate of the monitor the window is in (or the requested swap\n\t\t//   interval), so we only use it when they do match.\n\t\t// - The user may force GL vsync, and DwmFlush shouldn't be used together with GL vsync.\n\t\tif (canUseDwmFlush && !settings.fullscreen && swapInterval == 1)\n\t\t{\n\t\t\t// Desktop composition is always enabled in Windows 8+. But DwmIsCompositionEnabled won't always return true...\n\t\t\t// (see DwmIsCompositionEnabled docs).\n\t\t\tBOOL compositionEnabled = IsWindows8OrGreater();\n\t\t\tif (compositionEnabled || (SUCCEEDED(DwmIsCompositionEnabled(&compositionEnabled)) && compositionEnabled))\n\t\t\t{\n\t\t\t\tDWM_TIMING_INFO info = {};\n\t\t\t\tinfo.cbSize = sizeof(DWM_TIMING_INFO);\n\t\t\t\tdouble dwmRefreshRate = 0;\n\t\t\t\tif (SUCCEEDED(DwmGetCompositionTimingInfo(nullptr, &info)))\n\t\t\t\t\tdwmRefreshRate = (double)info.rateRefresh.uiNumerator / (double)info.rateRefresh.uiDenominator;\n\n\t\t\t\tSDL_DisplayMode dmode = {};\n\t\t\t\tSDL_DisplayID display = SDL_GetDisplayForWindow(window);\n\t\t\t\tconst SDL_DisplayMode* modePtr = SDL_GetCurrentDisplayMode(display);\n\t\t\t\tif (modePtr)\n\t\t\t\t\tdmode = *modePtr;\n\n\t\t\t\tif (dmode.refresh_rate > 0 && dwmRefreshRate > 0 && (fabs(dmode.refresh_rate - dwmRefreshRate) < 2))\n\t\t\t\t{\n\t\t\t\t\tSDL_GL_SetSwapInterval(0);\n\t\t\t\t\tint interval = 0;\n\t\t\t\t\tif (SDL_GL_GetSwapInterval(&interval) == 0 && interval == 0)\n\t\t\t\t\t\tuseDwmFlush = true;\n\t\t\t\t\telse\n\t\t\t\t\t\tSDL_GL_SetSwapInterval(swapInterval);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif\n\n\t\tSDL_GL_SwapWindow(window);\n\n#ifdef LOVE_WINDOWS\n\t\tif (useDwmFlush)\n\t\t{\n\t\t\tDwmFlush();\n\t\t\tSDL_GL_SetSwapInterval(swapInterval);\n\t\t}\n#endif\n\t}\n}\n\nbool Window::hasFocus() const\n{\n\treturn (window && SDL_GetKeyboardFocus() == window);\n}\n\nbool Window::hasMouseFocus() const\n{\n\treturn (window && SDL_GetMouseFocus() == window);\n}\n\nbool Window::isVisible() const\n{\n\treturn window && (SDL_GetWindowFlags(window) & (SDL_WINDOW_HIDDEN | SDL_WINDOW_MINIMIZED)) == 0;\n}\n\nbool Window::isOccluded() const\n{\n\treturn window && (SDL_GetWindowFlags(window) & SDL_WINDOW_OCCLUDED) != 0;\n}\n\nvoid Window::setMouseGrab(bool grab)\n{\n\tmouseGrabbed = grab;\n\tif (window)\n\t\tSDL_SetWindowMouseGrab(window, grab);\n}\n\nbool Window::isMouseGrabbed() const\n{\n\tif (window)\n\t\treturn SDL_GetWindowMouseGrab(window);\n\telse\n\t\treturn mouseGrabbed;\n}\n\nint Window::getWidth() const\n{\n\treturn windowWidth;\n}\n\nint Window::getHeight() const\n{\n\treturn windowHeight;\n}\n\nint Window::getPixelWidth() const\n{\n\treturn pixelWidth;\n}\n\nint Window::getPixelHeight() const\n{\n\treturn pixelHeight;\n}\n\nvoid Window::clampPositionInWindow(double *wx, double *wy) const\n{\n\tif (wx != nullptr)\n\t\t*wx = std::min(std::max(0.0, *wx), (double) getWidth() - 1);\n\tif (wy != nullptr)\n\t\t*wy = std::min(std::max(0.0, *wy), (double) getHeight() - 1);\n}\n\nvoid Window::windowToPixelCoords(double *x, double *y) const\n{\n\tif (x != nullptr)\n\t\t*x = (*x) * ((double) pixelWidth / (double) windowWidth);\n\tif (y != nullptr)\n\t\t*y = (*y) * ((double) pixelHeight / (double) windowHeight);\n}\n\nvoid Window::pixelToWindowCoords(double *x, double *y) const\n{\n\tif (x != nullptr)\n\t\t*x = (*x) * ((double) windowWidth / (double) pixelWidth);\n\tif (y != nullptr)\n\t\t*y = (*y) * ((double) windowHeight / (double) pixelHeight);\n}\n\nvoid Window::windowToDPICoords(double *x, double *y) const\n{\n\tdouble px = x != nullptr ? *x : 0.0;\n\tdouble py = y != nullptr ? *y : 0.0;\n\n\twindowToPixelCoords(&px, &py);\n\n\tdouble dpix = 0.0;\n\tdouble dpiy = 0.0;\n\n\tfromPixels(px, py, dpix, dpiy);\n\n\tif (x != nullptr)\n\t\t*x = dpix;\n\tif (y != nullptr)\n\t\t*y = dpiy;\n}\n\nvoid Window::DPIToWindowCoords(double *x, double *y) const\n{\n\tdouble dpix = x != nullptr ? *x : 0.0;\n\tdouble dpiy = y != nullptr ? *y : 0.0;\n\n\tdouble px = 0.0;\n\tdouble py = 0.0;\n\n\ttoPixels(dpix, dpiy, px, py);\n\tpixelToWindowCoords(&px, &py);\n\n\tif (x != nullptr)\n\t\t*x = px;\n\tif (y != nullptr)\n\t\t*y = py;\n}\n\ndouble Window::getDPIScale() const\n{\n\treturn settings.usedpiscale ? getNativeDPIScale() : 1.0;\n}\n\ndouble Window::getNativeDPIScale() const\n{\n#ifdef LOVE_ANDROID\n\treturn love::android::getScreenScale();\n#else\n\treturn window != nullptr ? SDL_GetWindowDisplayScale(window) : 1.0;\n#endif\n}\n\ndouble Window::toPixels(double x) const\n{\n\treturn x * getDPIScale();\n}\n\nvoid Window::toPixels(double wx, double wy, double &px, double &py) const\n{\n\tdouble scale = getDPIScale();\n\tpx = wx * scale;\n\tpy = wy * scale;\n}\n\ndouble Window::fromPixels(double x) const\n{\n\treturn x / getDPIScale();\n}\n\nvoid Window::fromPixels(double px, double py, double &wx, double &wy) const\n{\n\tdouble scale = getDPIScale();\n\twx = px / scale;\n\twy = py / scale;\n}\n\nvoid *Window::getHandle() const\n{\n\treturn window;\n}\n\nSDL_MessageBoxFlags Window::convertMessageBoxType(MessageBoxType type) const\n{\n\tswitch (type)\n\t{\n\tcase MESSAGEBOX_ERROR:\n\t\treturn SDL_MESSAGEBOX_ERROR;\n\tcase MESSAGEBOX_WARNING:\n\t\treturn SDL_MESSAGEBOX_WARNING;\n\tcase MESSAGEBOX_INFO:\n\tdefault:\n\t\treturn SDL_MESSAGEBOX_INFORMATION;\n\t}\n}\n\nbool Window::showMessageBox(const std::string &title, const std::string &message, MessageBoxType type, bool attachtowindow)\n{\n\tSDL_MessageBoxFlags flags = convertMessageBoxType(type);\n\tSDL_Window *sdlwindow = attachtowindow ? window : nullptr;\n\n\treturn SDL_ShowSimpleMessageBox(flags, title.c_str(), message.c_str(), sdlwindow);\n}\n\nint Window::showMessageBox(const MessageBoxData &data)\n{\n\tSDL_MessageBoxData sdldata = {};\n\n\tsdldata.flags = convertMessageBoxType(data.type);\n\tsdldata.title = data.title.c_str();\n\tsdldata.message = data.message.c_str();\n\tsdldata.window = data.attachToWindow ? window : nullptr;\n\n\tsdldata.numbuttons = (int) data.buttons.size();\n\n\tstd::vector<SDL_MessageBoxButtonData> sdlbuttons;\n\n\tfor (int i = 0; i < (int) data.buttons.size(); i++)\n\t{\n\t\tSDL_MessageBoxButtonData sdlbutton = {};\n\n\t\tsdlbutton.buttonID = i;\n\t\tsdlbutton.text = data.buttons[i].c_str();\n\n\t\tif (i == data.enterButtonIndex)\n\t\t\tsdlbutton.flags |= SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT;\n\n\t\tif (i == data.escapeButtonIndex)\n\t\t\tsdlbutton.flags |= SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT;\n\n\t\tsdlbuttons.push_back(sdlbutton);\n\t}\n\n\tsdldata.buttons = &sdlbuttons[0];\n\n\tint pressedbutton = -2;\n\tSDL_ShowMessageBox(&sdldata, &pressedbutton);\n\n\treturn pressedbutton;\n}\n\n// As of a SDL3 prerelease, a lot of SDL file dialog parameters need to persist\n// until the callback completes, so we store them here.\n// This is also used to retrieve some useful info to pass to love's own callback,\n// and to send that along to SDL events (see below).\nclass FileDialogState : public love::Object\n{\npublic:\n\n\tvoid *context;\n\tWindow::FileDialogCallback callback;\n\tUint32 dialogEventId;\n\tWindow::FileDialogData data;\n\tstd::vector<SDL_DialogFileFilter> sdlFilters;\n\tSDL_PropertiesID props;\n\n\tOptional<std::string> err;\n\tstd::vector<std::string> files;\n\tint filterIndex;\n};\n\nstatic void SDLCALL fileDialogCallbackSDL(void *userdata, const char *const *filelist, int filter)\n{\n\tauto state = (FileDialogState *) userdata;\n\tif (state == nullptr)\n\t\treturn;\n\n\tif (filelist != nullptr)\n\t{\n\t\t// SDL's file list only lasts until the end of the callback, so we copy it.\n\t\tfor (int i = 0; filelist[i] != nullptr; i++)\n\t\t\tstate->files.push_back(filelist[i]);\n\t}\n\telse\n\t{\n\t\tstate->err.set(SDL_GetError());\n\t}\n\n\tstate->filterIndex = filter;\n\n\tSDL_DestroyProperties(state->props);\n\n\t// The SDL dialog callback isn't guaranteed to be called on the main thread,\n\t// whereas SDL event polling will happen there. This is needed because Lua states\n\t// aren't thread safe.\n\tSDL_Event event = {};\n\tevent.type = state->dialogEventId;\n\tevent.user.data1 = state;\n\n\tSDL_PushEvent(&event);\n}\n\nvoid Window::handleSDLEvent(const SDL_Event &event)\n{\n\tif (event.type == dialogEventId)\n\t{\n\t\t// Releases itself when it goes out of scope.\n\t\tStrongRef<FileDialogState> state((FileDialogState *) event.user.data1, Acquire::NORETAIN);\n\n\t\tconst char *filtername = state->filterIndex >= 0\n\t\t\t? state->data.filters[state->filterIndex].name.c_str()\n\t\t\t: nullptr;\n\n\t\tstate->callback(state->context, state->files, filtername, state->err.hasValue ? state->err.value.c_str() : nullptr);\n\t}\n}\n\nvoid Window::showFileDialog(const FileDialogData &data, FileDialogCallback callback, void *context)\n{\n\tSDL_FileDialogType sdltype = SDL_FILEDIALOG_OPENFILE;\n\tswitch (data.type)\n\t{\n\tcase FILEDIALOG_OPENFILE:\n\tdefault:\n\t\tsdltype = SDL_FILEDIALOG_OPENFILE;\n\t\tbreak;\n\tcase FILEDIALOG_OPENFOLDER:\n\t\tsdltype = SDL_FILEDIALOG_OPENFOLDER;\n\t\tbreak;\n\tcase FILEDIALOG_SAVEFILE:\n\t\tsdltype = SDL_FILEDIALOG_SAVEFILE;\n\t\tbreak;\n\t}\n\n\tauto state = new FileDialogState();\n\tstate->callback = callback;\n\tstate->context = context;\n\tstate->dialogEventId = dialogEventId;\n\tstate->data = data;\n\n\tfor (const auto &filter : state->data.filters)\n\t{\n\t\tSDL_DialogFileFilter f = {};\n\t\tf.name = filter.name.c_str();\n\t\tf.pattern = filter.pattern.c_str();\n\t\tstate->sdlFilters.push_back(f);\n\t}\n\n\t// We destroy this in the dialog callback, since it needs to persist until then (until that's fixed in SDL code).\n\tstate->props = SDL_CreateProperties();\n\n\tif (!data.title.empty())\n\t\tSDL_SetStringProperty(state->props, SDL_PROP_FILE_DIALOG_TITLE_STRING, state->data.title.c_str());\n\n\tif (!data.acceptLabel.empty())\n\t\tSDL_SetStringProperty(state->props, SDL_PROP_FILE_DIALOG_ACCEPT_STRING, state->data.acceptLabel.c_str());\n\n\tif (!data.cancelLabel.empty())\n\t\tSDL_SetStringProperty(state->props, SDL_PROP_FILE_DIALOG_CANCEL_STRING, state->data.cancelLabel.c_str());\n\n\tif (!data.defaultName.empty())\n\t\tSDL_SetStringProperty(state->props, SDL_PROP_FILE_DIALOG_LOCATION_STRING, state->data.defaultName.c_str());\n\n\tif (data.attachToWindow)\n\t\tSDL_SetPointerProperty(state->props, SDL_PROP_FILE_DIALOG_WINDOW_POINTER, window);\n\n\tif (!state->sdlFilters.empty())\n\t{\n\t\tSDL_SetPointerProperty(state->props, SDL_PROP_FILE_DIALOG_FILTERS_POINTER, state->sdlFilters.data());\n\t\tSDL_SetNumberProperty(state->props, SDL_PROP_FILE_DIALOG_NFILTERS_NUMBER, state->sdlFilters.size());\n\t}\n\n\tSDL_SetBooleanProperty(state->props, SDL_PROP_FILE_DIALOG_MANY_BOOLEAN, data.multiSelect);\n\n\tSDL_ShowFileDialogWithProperties(sdltype, fileDialogCallbackSDL, state, state->props);\n}\n\nvoid Window::requestAttention(bool continuous)\n{\n#if defined(LOVE_WINDOWS) && !defined(LOVE_WINDOWS_UWP)\n\n\tif (hasFocus())\n\t\treturn;\n\n\tFLASHWINFO flashinfo = { sizeof(FLASHWINFO) };\n\n\tflashinfo.hwnd = (HWND)SDL_GetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_WIN32_HWND_POINTER, nullptr);\n\tflashinfo.uCount = 1;\n\tflashinfo.dwFlags = FLASHW_ALL;\n\n\tif (continuous)\n\t{\n\t\tflashinfo.uCount = 0;\n\t\tflashinfo.dwFlags |= FLASHW_TIMERNOFG;\n\t}\n\n\tFlashWindowEx(&flashinfo);\n\n#elif defined(LOVE_MACOS)\n\n\tlove::macos::requestAttention(continuous);\n\n#else\n\n\tLOVE_UNUSED(continuous);\n\t\n#endif\n\t\n\t// TODO: Linux?\n}\n\nWindow::SystemTheme Window::getSystemTheme() const\n{\n\tSDL_SystemTheme sdlstate = SDL_GetSystemTheme();\n\tSystemTheme state = THEME_UNKNOWN;\n\tsystemThemes.find(sdlstate, state);\n\n\treturn state;\n}\n\nEnumMap<Window::SystemTheme, SDL_SystemTheme, Window::THEME_MAX_ENUM>::Entry Window::systemThemeEntries[] =\n{\n\t{Window::THEME_UNKNOWN, SDL_SYSTEM_THEME_UNKNOWN},\n\t{Window::THEME_LIGHT, SDL_SYSTEM_THEME_LIGHT},\n\t{Window::THEME_DARK, SDL_SYSTEM_THEME_DARK},\n};\n\nEnumMap<Window::SystemTheme, SDL_SystemTheme, Window::THEME_MAX_ENUM> Window::systemThemes(Window::systemThemeEntries, sizeof(Window::systemThemeEntries));\n\n\n} // sdl\n} // window\n} // love\n"
  },
  {
    "path": "src/modules/window/sdl/Window.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_WINDOW_SDL_WINDOW_H\n#define LOVE_WINDOW_SDL_WINDOW_H\n\n// LOVE\n#include \"window/Window.h\"\n#include \"common/config.h\"\n#include \"common/EnumMap.h\"\n#include \"graphics/Graphics.h\"\n\n// SDL\n#include <SDL3/SDL.h>\n\nnamespace love\n{\nnamespace window\n{\nnamespace sdl\n{\n\nclass Window final : public love::window::Window\n{\npublic:\n\n\tWindow();\n\t~Window();\n\n\tvoid setGraphics(graphics::Graphics *graphics) override;\n\n\tbool setWindow(int width = 800, int height = 600, WindowSettings *settings = nullptr) override;\n\tvoid getWindow(int &width, int &height, WindowSettings &settings) override;\n\n\tvoid close() override;\n\n\tbool setFullscreen(bool fullscreen, FullscreenType fstype) override;\n\tbool setFullscreen(bool fullscreen) override;\n\n\tbool onSizeChanged(int width, int height) override;\n\n\tint getDisplayCount() const override;\n\n\tconst char *getDisplayName(int displayindex) const override;\n\n\tDisplayOrientation getDisplayOrientation(int displayindex) const override;\n\n\tstd::vector<WindowSize> getFullscreenSizes(int displayindex) const override;\n\n\tvoid getDesktopDimensions(int displayindex, int &width, int &height) const override;\n\n\tvoid setPosition(int x, int y, int displayindex) override;\n\tvoid getPosition(int &x, int &y, int &displayindex) override;\n\n\tRect getSafeArea() const override;\n\n\tbool isOpen() const override;\n\n\tvoid setWindowTitle(const std::string &title) override;\n\tconst std::string &getWindowTitle() const override;\n\n\tbool setIcon(love::image::ImageData *imgd) override;\n\tlove::image::ImageData *getIcon() override;\n\n\tvoid setVSync(int vsync) override;\n\tint getVSync() const override;\n\n\tvoid setDisplaySleepEnabled(bool enable) override;\n\tbool isDisplaySleepEnabled() const override;\n\n\tvoid minimize() override;\n\tvoid maximize() override;\n\tvoid restore() override;\n\tvoid focus() override;\n\n\tbool isMaximized() const override;\n\tbool isMinimized() const override;\n\n\tvoid swapBuffers() override;\n\n\tbool hasFocus() const override;\n\tbool hasMouseFocus() const override;\n\n\tbool isVisible() const override;\n\tbool isOccluded() const override;\n\n\tvoid setMouseGrab(bool grab) override;\n\tbool isMouseGrabbed() const override;\n\n\tint getWidth() const override;\n\tint getHeight() const override;\n\tint getPixelWidth() const override;\n\tint getPixelHeight() const override;\n\n\tvoid clampPositionInWindow(double *wx, double *wy) const override;\n\n\tvoid windowToPixelCoords(double *x, double *y) const override;\n\tvoid pixelToWindowCoords(double *x, double *y) const override;\n\n\tvoid windowToDPICoords(double *x, double *y) const override;\n\tvoid DPIToWindowCoords(double *x, double *y) const override;\n\n\tdouble getDPIScale() const override;\n\tdouble getNativeDPIScale() const override;\n\n\tdouble toPixels(double x) const override;\n\tvoid toPixels(double wx, double wy, double &px, double &py) const override;\n\tdouble fromPixels(double x) const override;\n\tvoid fromPixels(double px, double py, double &wx, double &wy) const override;\n\n\tvoid *getHandle() const override;\n\n\tbool showMessageBox(const std::string &title, const std::string &message, MessageBoxType type, bool attachtowindow) override;\n\tint showMessageBox(const MessageBoxData &data) override;\n\n\tvoid showFileDialog(const FileDialogData &data, FileDialogCallback callback, void *context) override;\n\n\tvoid requestAttention(bool continuous) override;\n\n\tSystemTheme getSystemTheme() const override;\n\n\tvoid handleSDLEvent(const SDL_Event &event);\n\nprivate:\n\n\tstruct ContextAttribs\n\t{\n\t\tint versionMajor;\n\t\tint versionMinor;\n\t\tbool gles;\n\t\tbool debug;\n\t};\n\n\tvoid close(bool allowExceptions);\n\n\tvoid setGLFramebufferAttributes(bool sRGB);\n\tvoid setGLContextAttributes(const ContextAttribs &attribs);\n\tbool checkGLVersion(const ContextAttribs &attribs, std::string &outversion);\n\tstd::vector<ContextAttribs> getContextAttribsList() const;\n\tbool createWindowAndContext(int x, int y, int w, int h, Uint32 windowflags, graphics::Renderer renderer);\n\n\t// Update the saved window settings based on the window's actual state.\n\tvoid updateSettings(const WindowSettings &newsettings, bool updateGraphicsViewport);\n\n\tSDL_MessageBoxFlags convertMessageBoxType(MessageBoxType type) const;\n\n\tstd::string title;\n\n\tint windowWidth  = 800;\n\tint windowHeight = 600;\n\tint pixelWidth   = 800;\n\tint pixelHeight  = 600;\n\tWindowSettings settings;\n\tStrongRef<love::image::ImageData> icon;\n\n#ifdef LOVE_WINDOWS\n\tbool canUseDwmFlush = false;\n#endif\n\n\tbool open;\n\n\tbool mouseGrabbed;\n\n\tSDL_Window *window;\n\n\tSDL_GLContext glcontext;\n#ifdef LOVE_GRAPHICS_METAL\n\tSDL_MetalView metalView;\n#endif\n\n\tgraphics::Renderer windowRenderer = graphics::RENDERER_NONE;\n\n\tbool displayedWindowError;\n\tContextAttribs contextAttribs;\n\n\tStrongRef<graphics::Graphics> graphics;\n\n\tUint32 dialogEventId;\n\n\tstatic EnumMap<SystemTheme, SDL_SystemTheme, THEME_MAX_ENUM>::Entry systemThemeEntries[];\n\tstatic EnumMap<SystemTheme, SDL_SystemTheme, THEME_MAX_ENUM> systemThemes;\n\n}; // Window\n\n} // sdl\n} // window\n} // love\n\n#endif // LOVE_WINDOW_WINDOW_H\n"
  },
  {
    "path": "src/modules/window/wrap_Window.cpp",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#include \"wrap_Window.h\"\n#include \"sdl/Window.h\"\n#include \"common/Reference.h\"\n\nnamespace love\n{\nnamespace window\n{\n\n#define instance() (Module::getInstance<Window>(Module::M_WINDOW))\n\nint w_getDisplayCount(lua_State *L)\n{\n\tlua_pushinteger(L, instance()->getDisplayCount());\n\treturn 1;\n}\n\nint w_getDisplayName(lua_State *L)\n{\n\tint index = (int) luaL_checkinteger(L, 1) - 1;\n\n\tconst char *name = nullptr;\n\tluax_catchexcept(L, [&](){ name = instance()->getDisplayName(index); });\n\n\tlua_pushstring(L, name);\n\treturn 1;\n}\n\nstatic const char *settingName(Window::Setting setting)\n{\n\tconst char *name = nullptr;\n\tWindow::getConstant(setting, name);\n\treturn name;\n}\n\nstatic int readWindowSettings(lua_State *L, int idx, WindowSettings &settings)\n{\n\tluax_checktablefields<Window::Setting>(L, idx, \"window setting\", Window::getConstant);\n\n\tlua_getfield(L, idx, settingName(Window::SETTING_FULLSCREEN_TYPE));\n\tif (!lua_isnoneornil(L, -1))\n\t{\n\t\tconst char *typestr = luaL_checkstring(L, -1);\n\t\tif (!Window::getConstant(typestr, settings.fstype))\n\t\t\treturn luax_enumerror(L, \"fullscreen type\", Window::getConstants(settings.fstype), typestr);\n\t}\n\tlua_pop(L, 1);\n\n\tsettings.fullscreen = luax_boolflag(L, idx, settingName(Window::SETTING_FULLSCREEN), settings.fullscreen);\n\tsettings.msaa = luax_intflag(L, idx, settingName(Window::SETTING_MSAA), settings.msaa);\n\tsettings.stencil = luax_boolflag(L, idx, settingName(Window::SETTING_STENCIL), settings.stencil);\n\tsettings.resizable = luax_boolflag(L, idx, settingName(Window::SETTING_RESIZABLE), settings.resizable);\n\tsettings.minwidth = luax_intflag(L, idx, settingName(Window::SETTING_MIN_WIDTH), settings.minwidth);\n\tsettings.minheight = luax_intflag(L, idx, settingName(Window::SETTING_MIN_HEIGHT), settings.minheight);\n\tsettings.borderless = luax_boolflag(L, idx, settingName(Window::SETTING_BORDERLESS), settings.borderless);\n\tsettings.centered = luax_boolflag(L, idx, settingName(Window::SETTING_CENTERED), settings.centered);\n\tsettings.usedpiscale = luax_boolflag(L, idx, settingName(Window::SETTING_USE_DPISCALE), settings.usedpiscale);\n\n\tlua_getfield(L, idx, settingName(Window::SETTING_DEPTH));\n\tif (lua_type(L, -1) == LUA_TNUMBER)\n\t{\n\t\tluax_markdeprecated(L, 1, \"window.depth number\", API_FIELD, DEPRECATED_REPLACED, \"window.depth boolean field\");\n\t\tsettings.depth = (int) luaL_checknumber(L, -1);\n\t}\n\telse if (!lua_isnoneornil(L, -1))\n\t\tsettings.depth = lua_toboolean(L, -1);\n\tlua_pop(L, 1);\n\n\tsettings.displayindex = luax_intflag(L, idx, settingName(Window::SETTING_DISPLAYINDEX), settings.displayindex + 1) - 1;\n\tlua_getfield(L, idx, settingName(Window::SETTING_DISPLAY));\n\tif (!lua_isnoneornil(L, -1))\n\t{\n\t\tluax_markdeprecated(L, 1, \"window.display\", API_FIELD, DEPRECATED_REPLACED, \"displayindex field\");\n\t\tsettings.displayindex = (int) luaL_checkinteger(L, -1) - 1;\n\t}\n\tlua_pop(L, 1);\n\n\tlua_getfield(L, idx, settingName(Window::SETTING_HIGHDPI));\n\tif (!lua_isnoneornil(L, -1))\n\t{\n\t\tluax_markdeprecated(L, 1, \"window.highdpi\", API_FIELD, DEPRECATED_REPLACED, \"t.highdpi in love.conf\");\n\t\tbool highdpi = luax_checkboolean(L, -1);\n\t\tif (!instance()->isOpen())\n\t\t\tsetHighDPIAllowed(highdpi);\n\n\t}\n\tlua_pop(L, 1);\n\n\tlua_getfield(L, idx, settingName(Window::SETTING_VSYNC));\n\tif (lua_isnumber(L, -1))\n\t\tsettings.vsync = (int) lua_tointeger(L, -1);\n\telse if (lua_isboolean(L, -1))\n\t\tsettings.vsync = lua_toboolean(L, -1);\n\tlua_pop(L, 1);\n\n\tlua_getfield(L, idx, settingName(Window::SETTING_X));\n\tlua_getfield(L, idx, settingName(Window::SETTING_Y));\n\tsettings.useposition = !(lua_isnoneornil(L, -2) && lua_isnoneornil(L, -1));\n\tif (settings.useposition)\n\t{\n\t\tsettings.x = (int) luaL_optinteger(L, -2, 0);\n\t\tsettings.y = (int) luaL_optinteger(L, -1, 0);\n\t}\n\tlua_pop(L, 2);\n\n\t// We don't explicitly set the refresh rate, it's \"read-only\".\n\treturn 0;\n}\n\nint w_setMode(lua_State *L)\n{\n\tint w = (int) luaL_checkinteger(L, 1);\n\tint h = (int) luaL_checkinteger(L, 2);\n\n\tif (lua_isnoneornil(L, 3))\n\t{\n\t\tluax_catchexcept(L, [&](){ luax_pushboolean(L, instance()->setWindow(w, h, nullptr)); });\n\t\treturn 1;\n\t}\n\n\t// Defaults come from WindowSettings itself.\n\tWindowSettings settings;\n\n\treadWindowSettings(L, 3, settings);\n\n\tluax_catchexcept(L,\n\t\t[&](){ luax_pushboolean(L, instance()->setWindow(w, h, &settings)); }\n\t);\n\n\treturn 1;\n}\n\nint w_updateMode(lua_State *L)\n{\n\tint w, h;\n\tWindowSettings settings;\n\tinstance()->getWindow(w, h, settings);\n\n\tif (lua_gettop(L) == 0)\n\t\treturn luaL_error(L, \"Expected at least one argument\");\n\n\tint idx = 1;\n\tif (lua_isnumber(L, 1))\n\t{\n\t\tidx = 3;\n\t\tw = (int) luaL_checkinteger(L, 1);\n\t\th = (int) luaL_checkinteger(L, 2);\n\t}\n\n\tif (!lua_isnoneornil(L, idx))\n\t\treadWindowSettings(L, idx, settings);\n\n\tluax_catchexcept(L,\n\t\t[&](){ luax_pushboolean(L, instance()->setWindow(w, h, &settings)); }\n\t);\n\treturn 1;\n}\n\nint w_getMode(lua_State *L)\n{\n\tint w, h;\n\tWindowSettings settings;\n\tinstance()->getWindow(w, h, settings);\n\tlua_pushnumber(L, w);\n\tlua_pushnumber(L, h);\n\n\tif (lua_istable(L, 1))\n\t\tlua_pushvalue(L, 1);\n\telse\n\t\tlua_newtable(L);\n\n\tconst char *fstypestr = \"desktop\";\n\tWindow::getConstant(settings.fstype, fstypestr);\n\n\tlua_pushstring(L, fstypestr);\n\tlua_setfield(L, -2, settingName(Window::SETTING_FULLSCREEN_TYPE));\n\n\tluax_pushboolean(L, settings.fullscreen);\n\tlua_setfield(L, -2, settingName(Window::SETTING_FULLSCREEN));\n\n\tlua_pushinteger(L, settings.vsync);\n\tlua_setfield(L, -2, settingName(Window::SETTING_VSYNC));\n\n\tlua_pushinteger(L, settings.msaa);\n\tlua_setfield(L, -2, settingName(Window::SETTING_MSAA));\n\n\tluax_pushboolean(L, settings.stencil);\n\tlua_setfield(L, -2, settingName(Window::SETTING_STENCIL));\n\n\tluax_pushboolean(L, settings.depth);\n\tlua_setfield(L, -2, settingName(Window::SETTING_DEPTH));\n\n\tluax_pushboolean(L, settings.resizable);\n\tlua_setfield(L, -2, settingName(Window::SETTING_RESIZABLE));\n\n\tlua_pushinteger(L, settings.minwidth);\n\tlua_setfield(L, -2, settingName(Window::SETTING_MIN_WIDTH));\n\n\tlua_pushinteger(L, settings.minheight);\n\tlua_setfield(L, -2, settingName(Window::SETTING_MIN_HEIGHT));\n\n\tluax_pushboolean(L, settings.borderless);\n\tlua_setfield(L, -2, settingName(Window::SETTING_BORDERLESS));\n\n\tluax_pushboolean(L, settings.centered);\n\tlua_setfield(L, -2, settingName(Window::SETTING_CENTERED));\n\n\t// Display index is 0-based internally and 1-based in Lua.\n\tlua_pushinteger(L, settings.displayindex + 1);\n\tlua_setfield(L, -2, settingName(Window::SETTING_DISPLAYINDEX));\n\n\tluax_pushboolean(L, settings.usedpiscale);\n\tlua_setfield(L, -2, settingName(Window::SETTING_USE_DPISCALE));\n\n\tlua_pushnumber(L, settings.refreshrate);\n\tlua_setfield(L, -2, settingName(Window::SETTING_REFRESHRATE));\n\n\tlua_pushinteger(L, settings.x);\n\tlua_setfield(L, -2, settingName(Window::SETTING_X));\n\n\tlua_pushinteger(L, settings.y);\n\tlua_setfield(L, -2, settingName(Window::SETTING_Y));\n\n\treturn 3;\n}\n\nint w_isHighDPIAllowed(lua_State *L)\n{\n\tluax_pushboolean(L, isHighDPIAllowed());\n\treturn 1;\n}\n\nint w_getDisplayOrientation(lua_State *L)\n{\n\tint displayindex = 0;\n\tif (!lua_isnoneornil(L, 1))\n\t\tdisplayindex = (int) luaL_checkinteger(L, 1) - 1;\n\telse\n\t{\n\t\tint x, y;\n\t\tinstance()->getPosition(x, y, displayindex);\n\t}\n\n\tconst char *orientationstr = nullptr;\n\tif (!Window::getConstant(instance()->getDisplayOrientation(displayindex), orientationstr))\n\t\treturn luaL_error(L, \"Unknown display orientation type.\");\n\n\tlua_pushstring(L, orientationstr);\n\treturn 1;\n}\n\nint w_getFullscreenModes(lua_State *L)\n{\n\tint displayindex = 0;\n\tif (!lua_isnoneornil(L, 1))\n\t\tdisplayindex = (int) luaL_checkinteger(L, 1) - 1;\n\telse\n\t{\n\t\tint x, y;\n\t\tinstance()->getPosition(x, y, displayindex);\n\t}\n\n\tstd::vector<Window::WindowSize> modes = instance()->getFullscreenSizes(displayindex);\n\n\tlua_createtable(L, (int) modes.size(), 0);\n\n\tfor (size_t i = 0; i < modes.size(); i++)\n\t{\n\t\tlua_pushinteger(L, i + 1);\n\t\tlua_createtable(L, 0, 2);\n\n\t\t// Inner table attribs.\n\n\t\tlua_pushinteger(L, modes[i].width);\n\t\tlua_setfield(L, -2, \"width\");\n\n\t\tlua_pushinteger(L, modes[i].height);\n\t\tlua_setfield(L, -2, \"height\");\n\n\t\t// Inner table attribs end.\n\n\t\tlua_settable(L, -3);\n\t}\n\n\treturn 1;\n}\n\nint w_setFullscreen(lua_State *L)\n{\n\tbool fullscreen = luax_checkboolean(L, 1);\n\tWindow::FullscreenType fstype = Window::FULLSCREEN_MAX_ENUM;\n\n\tconst char *typestr = lua_isnoneornil(L, 2) ? 0 : luaL_checkstring(L, 2);\n\tif (typestr && !Window::getConstant(typestr, fstype))\n\t\treturn luax_enumerror(L, \"fullscreen type\", Window::getConstants(fstype), typestr);\n\n\tbool success = false;\n\tluax_catchexcept(L, [&]() {\n\t\tif (fstype == Window::FULLSCREEN_MAX_ENUM)\n\t\t\tsuccess = instance()->setFullscreen(fullscreen);\n\t\telse\n\t\t\tsuccess = instance()->setFullscreen(fullscreen, fstype);\n\t});\n\n\tluax_pushboolean(L, success);\n\treturn 1;\n}\n\nint w_getFullscreen(lua_State *L)\n{\n\tint w, h;\n\tWindowSettings settings;\n\tinstance()->getWindow(w, h, settings);\n\n\tconst char *typestr;\n\tif (!Window::getConstant(settings.fstype, typestr))\n\t\tluaL_error(L, \"Unknown fullscreen type.\");\n\n\tluax_pushboolean(L, settings.fullscreen);\n\tlua_pushstring(L, typestr);\n\treturn 2;\n}\n\nint w_isOpen(lua_State *L)\n{\n\tluax_pushboolean(L, instance()->isOpen());\n\treturn 1;\n}\n\nint w_close(lua_State *L)\n{\n\tluax_markdeprecated(L, 1, \"love.window.close\", API_FUNCTION, DEPRECATED_NO_REPLACEMENT, nullptr);\n\tluax_catchexcept(L, [&]() { instance()->close(); });\n\treturn 0;\n}\n\nint w_getDesktopDimensions(lua_State *L)\n{\n\tint width = 0, height = 0;\n\tint displayindex = 0;\n\tif (!lua_isnoneornil(L, 1))\n\t\tdisplayindex = (int) luaL_checkinteger(L, 1) - 1;\n\telse\n\t{\n\t\tint x, y;\n\t\tinstance()->getPosition(x, y, displayindex);\n\t}\n\tinstance()->getDesktopDimensions(displayindex, width, height);\n\tlua_pushinteger(L, width);\n\tlua_pushinteger(L, height);\n\treturn 2;\n}\n\nint w_setPosition(lua_State *L)\n{\n\tint x = (int) luaL_checkinteger(L, 1);\n\tint y = (int) luaL_checkinteger(L, 2);\n\n\tint displayindex = 0;\n\tif (!lua_isnoneornil(L, 3))\n\t\tdisplayindex = (int) luaL_checkinteger(L, 3) - 1;\n\telse\n\t{\n\t\tint x_unused, y_unused;\n\t\tinstance()->getPosition(x_unused, y_unused, displayindex);\n\t}\n\n\tinstance()->setPosition(x, y, displayindex);\n\treturn 0;\n}\n\nint w_getPosition(lua_State *L)\n{\n\tint x = 0;\n\tint y = 0;\n\tint displayindex = 0;\n\tinstance()->getPosition(x, y, displayindex);\n\tlua_pushinteger(L, x);\n\tlua_pushinteger(L, y);\n\tlua_pushinteger(L, displayindex + 1);\n\treturn 3;\n}\n\nint w_getSafeArea(lua_State *L)\n{\n\tRect area = instance()->getSafeArea();\n\tlua_pushnumber(L, area.x);\n\tlua_pushnumber(L, area.y);\n\tlua_pushnumber(L, area.w);\n\tlua_pushnumber(L, area.h);\n\treturn 4;\n}\n\nint w_setIcon(lua_State *L)\n{\n\timage::ImageData *i = luax_checktype<image::ImageData>(L, 1);\n\tbool success = false;\n\tluax_catchexcept(L, [&]() { success = instance()->setIcon(i); });\n\tluax_pushboolean(L, success);\n\treturn 1;\n}\n\nint w_getIcon(lua_State *L)\n{\n\timage::ImageData *i = instance()->getIcon();\n\tluax_pushtype(L, i);\n\treturn 1;\n}\n\nint w_setVSync(lua_State *L)\n{\n\tint vsync = 0;\n\tif (lua_type(L, 1) == LUA_TBOOLEAN)\n\t\tvsync = lua_toboolean(L, 1);\n\telse\n\t\tvsync = (int)luaL_checkinteger(L, 1);\n\tinstance()->setVSync(vsync);\n\treturn 0;\n}\n\nint w_getVSync(lua_State *L)\n{\n\tlua_pushinteger(L, instance()->getVSync());\n\treturn 1;\n}\n\nint w_setDisplaySleepEnabled(lua_State *L)\n{\n\tinstance()->setDisplaySleepEnabled(luax_checkboolean(L, 1));\n\treturn 0;\n}\n\nint w_isDisplaySleepEnabled(lua_State *L)\n{\n\tluax_pushboolean(L, instance()->isDisplaySleepEnabled());\n\treturn 1;\n}\n\nint w_setTitle(lua_State *L)\n{\n\tstd::string title = luax_checkstring(L, 1);\n\tinstance()->setWindowTitle(title);\n\treturn 0;\n}\n\nint w_getTitle(lua_State *L)\n{\n\tluax_pushstring(L, instance()->getWindowTitle());\n\treturn 1;\n}\n\nint w_hasFocus(lua_State *L)\n{\n\tluax_pushboolean(L, instance()->hasFocus());\n\treturn 1;\n}\n\nint w_hasMouseFocus(lua_State *L)\n{\n\tluax_pushboolean(L, instance()->hasMouseFocus());\n\treturn 1;\n}\n\nint w_isVisible(lua_State *L)\n{\n\tluax_pushboolean(L, instance()->isVisible());\n\treturn 1;\n}\n\nint w_isOccluded(lua_State *L)\n{\n\tluax_pushboolean(L, instance()->isOccluded());\n\treturn 1;\n}\n\nint w_getDPIScale(lua_State *L)\n{\n\tlua_pushnumber(L, instance()->getDPIScale());\n\treturn 1;\n}\n\nint w_getNativeDPIScale(lua_State *L)\n{\n\tlua_pushnumber(L, instance()->getNativeDPIScale());\n\treturn 1;\n}\n\nint w_toPixels(lua_State *L)\n{\n\tdouble wx = luaL_checknumber(L, 1);\n\n\tif (lua_isnoneornil(L, 2))\n\t{\n\t\tlua_pushnumber(L, instance()->toPixels(wx));\n\t\treturn 1;\n\t}\n\n\tdouble wy = luaL_checknumber(L, 2);\n\tdouble px = 0.0, py = 0.0;\n\n\tinstance()->toPixels(wx, wy, px, py);\n\n\tlua_pushnumber(L, px);\n\tlua_pushnumber(L, py);\n\n\treturn 2;\n}\n\nint w_fromPixels(lua_State *L)\n{\n\tdouble px = luaL_checknumber(L, 1);\n\n\tif (lua_isnoneornil(L, 2))\n\t{\n\t\tlua_pushnumber(L, instance()->fromPixels(px));\n\t\treturn 1;\n\t}\n\n\tdouble py = luaL_checknumber(L, 2);\n\tdouble wx = 0.0, wy = 0.0;\n\n\tinstance()->fromPixels(px, py, wx, wy);\n\n\tlua_pushnumber(L, wx);\n\tlua_pushnumber(L, wy);\n\n\treturn 2;\n}\n\nint w_minimize(lua_State* /*L*/)\n{\n\tinstance()->minimize();\n\treturn 0;\n}\n\nint w_maximize(lua_State *)\n{\n\tinstance()->maximize();\n\treturn 0;\n}\n\nint w_restore(lua_State *)\n{\n\tinstance()->restore();\n\treturn 0;\n}\n\nint w_focus(lua_State *)\n{\n\tinstance()->focus();\n\treturn 0;\n}\n\nint w_isMaximized(lua_State *L)\n{\n\tluax_pushboolean(L, instance()->isMaximized());\n\treturn 1;\n}\n\nint w_isMinimized(lua_State *L)\n{\n\tluax_pushboolean(L, instance()->isMinimized());\n\treturn 1;\n}\n\nint w_showMessageBox(lua_State *L)\n{\n\tWindow::MessageBoxData data = {};\n\tdata.type = Window::MESSAGEBOX_INFO;\n\n\tdata.title = luaL_checkstring(L, 1);\n\tdata.message = luaL_checkstring(L, 2);\n\n\t// If we have a table argument, we assume a list of button names, which\n\t// means we should use the more complex message box API.\n\tif (lua_istable(L, 3))\n\t{\n\t\tsize_t numbuttons = luax_objlen(L, 3);\n\t\tif (numbuttons == 0)\n\t\t\treturn luaL_error(L, \"Must have at least one messagebox button.\");\n\n\t\t// Array of button names.\n\t\tfor (size_t i = 0; i < numbuttons; i++)\n\t\t{\n\t\t\tlua_rawgeti(L, 3, (int) i + 1);\n\t\t\tdata.buttons.push_back(luax_checkstring(L, -1));\n\t\t\tlua_pop(L, 1);\n\t\t}\n\n\t\t// Optional table entry specifying the button to use when enter is pressed.\n\t\tlua_getfield(L, 3, \"enterbutton\");\n\t\tif (!lua_isnoneornil(L, -1))\n\t\t\tdata.enterButtonIndex = (int) luaL_checkinteger(L, -1) - 1;\n\t\telse\n\t\t\tdata.enterButtonIndex = 0;\n\t\tlua_pop(L, 1);\n\n\t\t// Optional table entry specifying the button to use when esc is pressed.\n\t\tlua_getfield(L, 3, \"escapebutton\");\n\t\tif (!lua_isnoneornil(L, -1))\n\t\t\tdata.escapeButtonIndex = (int) luaL_checkinteger(L, -1) - 1;\n\t\telse\n\t\t\tdata.escapeButtonIndex = (int) data.buttons.size() - 1;\n\t\tlua_pop(L, 1);\n\n\t\tconst char *typestr = lua_isnoneornil(L, 4) ? nullptr : luaL_checkstring(L, 4);\n\t\tif (typestr && !Window::getConstant(typestr, data.type))\n\t\t\treturn luax_enumerror(L, \"messagebox type\", Window::getConstants(data.type), typestr);\n\n\t\tdata.attachToWindow = luax_optboolean(L, 5, true);\n\n\t\tint pressedbutton = instance()->showMessageBox(data);\n\t\tlua_pushinteger(L, pressedbutton + 1);\n\t}\n\telse\n\t{\n\t\tconst char *typestr = lua_isnoneornil(L, 3) ? nullptr : luaL_checkstring(L, 3);\n\t\tif (typestr && !Window::getConstant(typestr, data.type))\n\t\t\treturn luax_enumerror(L, \"messagebox type\", Window::getConstants(data.type), typestr);\n\n\t\tdata.attachToWindow = luax_optboolean(L, 4, true);\n\n\t\t// Display a simple message box.\n\t\tbool success = instance()->showMessageBox(data.title, data.message, data.type, data.attachToWindow);\n\t\tluax_pushboolean(L, success);\n\t}\n\n\treturn 1;\n}\n\nstatic void fileDialogCallback(void *context, const std::vector<std::string> &files, const char *filtername, const char *errstr)\n{\n\tauto r = (Reference *)context;\n\tlua_State *L = r->getPinnedL();\n\n\tr->push(L);\n\n\tlua_createtable(L, (int)files.size(), 0);\n\tfor (size_t i = 0; i < files.size(); i++)\n\t{\n\t\tlua_pushstring(L, files[i].c_str());\n\t\tlua_rawseti(L, -2, (int)i + 1);\n\t}\n\n\tif (filtername != nullptr)\n\t\tlua_pushstring(L, filtername);\n\telse\n\t\tlua_pushnil(L);\n\n\tif (errstr != nullptr)\n\t\tlua_pushstring(L, errstr);\n\telse\n\t\tlua_pushnil(L);\n\n\tint err = lua_pcall(L, 3, 0, 0);\n\n\tdelete r;\n\n\t// Unfortunately, this eats the stack trace, too bad.\n\tif (err != 0)\n\t\tthrow love::Exception(\"Error in file dialog callback: %s\", lua_tostring(L, -1));\n}\n\nint w_showFileDialog(lua_State *L)\n{\n\tWindow::FileDialogData data = {};\n\n\tconst char *typestr = luaL_checkstring(L, 1);\n\tif (!Window::getConstant(typestr, data.type))\n\t\treturn luax_enumerror(L, \"file dialog type\", Window::getConstants(data.type), typestr);\n\n\tluaL_checktype(L, 2, LUA_TFUNCTION);\n\n\tif (!lua_isnoneornil(L, 3))\n\t{\n\t\tluaL_checktype(L, 3, LUA_TTABLE);\n\n\t\tlua_getfield(L, 3, \"title\");\n\t\tif (!lua_isnoneornil(L, -1))\n\t\t\tdata.title = luax_checkstring(L, -1);\n\t\tlua_pop(L, 1);\n\n\t\tlua_getfield(L, 3, \"acceptlabel\");\n\t\tif (!lua_isnoneornil(L, -1))\n\t\t\tdata.acceptLabel = luax_checkstring(L, -1);\n\t\tlua_pop(L, 1);\n\n\t\tlua_getfield(L, 3, \"cancellabel\");\n\t\tif (!lua_isnoneornil(L, -1))\n\t\t\tdata.cancelLabel = luax_checkstring(L, -1);\n\t\tlua_pop(L, 1);\n\n\t\tlua_getfield(L, 3, \"defaultname\");\n\t\tif (!lua_isnoneornil(L, -1))\n\t\t\tdata.defaultName = luax_checkstring(L, -1);\n\t\tlua_pop(L, 1);\n\n\t\tlua_getfield(L, 3, \"filters\");\n\t\tif (!lua_isnoneornil(L, -1))\n\t\t{\n\t\t\tluaL_checktype(L, -1, LUA_TTABLE);\n\n\t\t\tlua_pushnil(L);\n\t\t\twhile (lua_next(L, -2))\n\t\t\t{\n\t\t\t\tWindow::FileDialogFilter filter = {};\n\t\t\t\tfilter.name = luax_checkstring(L, -2);\n\t\t\t\tfilter.pattern = luax_checkstring(L, -1);\n\t\t\t\tdata.filters.push_back(filter);\n\t\t\t\tlua_pop(L, 1);\n\t\t\t}\n\t\t}\n\t\tlua_pop(L, 1);\n\n\t\tlua_getfield(L, 3, \"multiselect\");\n\t\tif (!lua_isnoneornil(L, -1))\n\t\t\tdata.multiSelect = luax_checkboolean(L, -1);\n\t\tlua_pop(L, 1);\n\n\t\tlua_getfield(L, 3, \"attachtowindow\");\n\t\tif (!lua_isnoneornil(L, -1))\n\t\t\tdata.attachToWindow = luax_checkboolean(L, -1);\n\t\tlua_pop(L, 1);\n\t}\n\n\t// Save the callback function as a Reference.\n\tlua_pushvalue(L, 2);\n\tReference *r = new Reference(L);\n\tlua_pop(L, 1);\n\n\tinstance()->showFileDialog(data, fileDialogCallback, r);\n\treturn 0;\n}\n\nint w_requestAttention(lua_State *L)\n{\n\tbool continuous = luax_optboolean(L, 1, false);\n\tinstance()->requestAttention(continuous);\n\treturn 0;\n}\n\nint w_getPointer(lua_State *L)\n{\n\tlua_pushlightuserdata(L, instance()->getHandle());\n\treturn 1;\n}\n\nint w_getSystemTheme(lua_State *L)\n{\n\tWindow::SystemTheme theme = instance()->getSystemTheme();\n\tconst char *str = \"unknown\";\n\tWindow::getConstant(theme, str);\n\tlua_pushstring(L, str);\n\treturn 1;\n}\n\nstatic const luaL_Reg functions[] =\n{\n\t{ \"getDisplayCount\", w_getDisplayCount },\n\t{ \"getDisplayName\", w_getDisplayName },\n\t{ \"setMode\", w_setMode },\n\t{ \"updateMode\", w_updateMode },\n\t{ \"getMode\", w_getMode },\n\t{ \"isHighDPIAllowed\", w_isHighDPIAllowed },\n\t{ \"getDisplayOrientation\", w_getDisplayOrientation },\n\t{ \"getFullscreenModes\", w_getFullscreenModes },\n\t{ \"setFullscreen\", w_setFullscreen },\n\t{ \"getFullscreen\", w_getFullscreen },\n\t{ \"isOpen\", w_isOpen },\n\t{ \"close\", w_close },\n\t{ \"getDesktopDimensions\", w_getDesktopDimensions },\n\t{ \"setPosition\", w_setPosition },\n\t{ \"getPosition\", w_getPosition },\n\t{ \"getSafeArea\", w_getSafeArea },\n\t{ \"setIcon\", w_setIcon },\n\t{ \"getIcon\", w_getIcon },\n\t{ \"setVSync\", w_setVSync },\n\t{ \"getVSync\", w_getVSync },\n\t{ \"setDisplaySleepEnabled\", w_setDisplaySleepEnabled },\n\t{ \"isDisplaySleepEnabled\", w_isDisplaySleepEnabled },\n\t{ \"setTitle\", w_setTitle },\n\t{ \"getTitle\", w_getTitle },\n\t{ \"hasFocus\", w_hasFocus },\n\t{ \"hasMouseFocus\", w_hasMouseFocus },\n\t{ \"isVisible\", w_isVisible },\n\t{ \"isOccluded\", w_isOccluded },\n\t{ \"getDPIScale\", w_getDPIScale },\n\t{ \"getNativeDPIScale\", w_getNativeDPIScale },\n\t{ \"toPixels\", w_toPixels },\n\t{ \"fromPixels\", w_fromPixels },\n\t{ \"minimize\", w_minimize },\n\t{ \"maximize\", w_maximize },\n\t{ \"restore\", w_restore },\n\t{ \"focus\", w_focus },\n\t{ \"isMaximized\", w_isMaximized },\n\t{ \"isMinimized\", w_isMinimized },\n\t{ \"showMessageBox\", w_showMessageBox },\n\t{ \"showFileDialog\", w_showFileDialog },\n\t{ \"requestAttention\", w_requestAttention },\n\t{ \"getPointer\", w_getPointer },\n\t{ \"getSystemTheme\", w_getSystemTheme },\n\t{ 0, 0 }\n};\n\nextern \"C\" int luaopen_love_window(lua_State *L)\n{\n\tWindow *instance = instance();\n\tif (instance == nullptr)\n\t\tluax_catchexcept(L, [&](){ instance = new love::window::sdl::Window(); });\n\telse\n\t\tinstance->retain();\n\n\tWrappedModule w;\n\tw.module = instance;\n\tw.name = \"window\";\n\tw.type = &Module::type;\n\tw.functions = functions;\n\tw.types = 0;\n\n\treturn luax_register_module(L, w);\n}\n\n} // window\n} // love\n"
  },
  {
    "path": "src/modules/window/wrap_Window.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n *\n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\n#ifndef LOVE_WINDOW_WRAP_WINDOW_H\n#define LOVE_WINDOW_WRAP_WINDOW_H\n\n#include \"common/config.h\"\n#include \"common/runtime.h\"\n\nnamespace love\n{\nnamespace window\n{\n\nextern \"C\" LOVE_EXPORT int luaopen_love_window(lua_State *L);\n\n} // window\n} // love\n\n#endif // LOVE_WINDOW_WRAP_WINDOW_H\n"
  },
  {
    "path": "src/scripts/auto.lua",
    "content": "-- Usage:\n-- lua auto.lua <name1> <name2> .. <nameN>\n--\n-- Example:\n-- lua auto.lua boot graphics\n\nlocal max_width = 18\nlocal pattern = [[\n/**\n * Copyright (c) 2006-2026 LOVE Development Team\n * \n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n * \n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n * \n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\nnamespace love\n{\n\n// [%s]\nconst unsigned char %s[] = \n{\n%s\n}; // [%s]\n} // love\n]]\n--formatting parameters:\n-- - input file name\n-- - c variable name\n-- - array contents\n-- - input file name\n\n\nlocal function auto(name)\n\t--the input file name\n\tlocal src = name .. \".lua\"\n\t--and the output one\n\tlocal dst = name .. \".lua.h\"\n\t--the name of the variable\n\tlocal cpp_name = name .. \"_lua\"\n\n\t--do a minimal code check\n\t--(syntax errors, really)\n\tloadfile(src)\n\t--no error catching? no\n\t--we have the main loop doing that for us\n\n\t--what character is this on this line?\n\tlocal counter = 0\n\n\tlocal function tohex(c)\n\t\tcounter = counter + 1\n\t\t--if we've reached the maximum width (or 0)\n\t\t--then we'll carry on and add a newline\n\t\tif counter % max_width == 0 then\n\t\t\treturn (\"\\n\\t0x%02x, \"):format(c:byte())\n\t\tend\n\t\t--otherwise we just use the hex of the current byte\n\t\treturn (\"0x%02x, \"):format(c:byte())\n\tend\n\n\t--let's open the input file\n\tlocal src_file = io.open(src, \"rb\")\n\t--create an output string\n\tlocal out_data = \"\"\n\t--go through the input file line-by-line\n\tfor line in src_file:lines() do\n\t\tline = line:gsub(\"\\r\", \"\")\n\t\t--if the line is non-empty\n\t\tif #line > 0 then\n\t\t\t--set the counter to -1\n\t\t\t--this will start a new line (see tohex)\n\t\t\tcounter = -1\n\t\t\t--append the output to what we had, plus a newline character (0x0a is newline)\n\t\t\tout_data = (\"%s%s0x0a,\"):format(out_data, line:gsub(\".\", tohex))\n\t\telse\n\t\t\tout_data = out_data .. \"\\n\\t0x0a,\"\n\t\tend\n\tend\n\t--close our input\n\tsrc_file:close()\n\n\t--open, write and close the output\n\tlocal out_file = io.open(dst, \"wb\")\n\t--see pattern above\n\tout_file:write(pattern:format(src, cpp_name, out_data, src))\n\tout_file:close()\n\n\t--tell the world we succeeded!\n\tprint(name .. \": Success\")\nend\n\n--usage\nif #arg == 0 then\n\treturn print(\"Usage: lua auto.lua <name1> <name2> .. <name3>\")\nend\n\n--the 'main' procedure\nfor i, v in ipairs(arg) do\n\t--run the auto function for every argument\n\t--but do it with pcall, to catch errors\n\tlocal ok, err = true\n\tv = v:gsub(\"^scripts/\", \"\")\n\tif v:match(\"/\") then\n\t\tok, err = false, \"not in scripts directory\"\n\telse\n\t\tv = v:gsub(\"%.lua$\", \"\") -- normalize input\n\t\tok, err = pcall(auto, v)\n\tend\n\tif not ok then\n\t\t--inform people we've failed\n\t\tprint(v .. \": \" .. err)\n\tend\nend\n\n"
  },
  {
    "path": "src/scripts/nogame.lua",
    "content": "--[[\nCopyright (c) 2006-2024 LOVE Development Team\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n--]]\n\n-- Make sure love exists.\nlocal love = require(\"love\")\n\nfunction love.nogame()\n\n\tR = {}\n\n\tR.bg = {[1]={}, [2]={}}\n\n\t-- cloud_1.png\n\tR.bg[1].cloud_1_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAALEAAABUCAYAAADNoNb0AAAGqElEQVR4nO3de6wcVR0H8M\\\n\t+lL20bX1iItFANVEEkpai1tWBJg6JEkxrwCWrAlEpMNdHYaDSpJjU+Eo0mmqBi+odKUuID\\\n\tY4xExFdjhJJqRYKCYkzUP6RCedWalkv949wmze3O3t3ZmXNm7/19kv3j7u7M+e293zs7c2\\\n\tbOmYljx44JYZydUrqAEEYVIQ5jL0Icxl6EOIy9+aULaMiZeA0uwCq8GMuwBEtPeN9BPIR/\\\n\t4s+4F3fiHjydsd7QoIkx7Z04BRvxNrweK0dc30H8DN/Hj/HEiOsLGY1biE/HNlyHF7TUxp\\\n\tPYja9gf0ttlLQEF2IFnotn4L/4Dx6QvqGeKlZdDeMS4rPwCbwbizK2ext2YG/GNttwrvSt\\\n\tdSXO1/9Y6BD24LtTj8dar25EXQ/xYmyfejyzYB278WH8q2ANdazDJ3F5zeUP4UZ8XjqW6K\\\n\tQuh/hifNvo+7tNeQIfwdfR2V/alOfgS3hPQ+t7FB/D13Tws3cxxPPxKXxUN7sAfyjtkz9S\\\n\tupAKG3ALzmhh3T/Cu3RsF6NrIX629Ad4XelCZvB3XIE/Fa5juqtwMxa02MYf8QYd2rXqUo\\\n\thXSt1b55cuZECPYzN+UbqQKW/CrfJ8e92PS3AgQ1sz6kqIz8EvsbxwHcM6jDfi5zWXn8Bq\\\n\t6ZtntfQPvFz6RlogdX09Jp2c2T/1uA1/m7ae1fitvAe/e7BJB7rjuhDiFdIv5IWF66jrMF\\\n\t6L3wyxzEpslQ686uy73oNv4Sb8D/vw0hrrGdVnpQO+okqHeLEU4ItKFtGAR7FeOlHQz1nY\\\n\tiWukrfConpQC/eoG1lXHJF6OPxRqH+VDfDPeUbKABt2PtdK+8nTzpO65HdIZstnkdoUPxE\\\n\tuG+P3Sqd3Z5BbpzNiJzph6fkP+crJZh7tKNV6qH/ZF+Fyhttv0VrzzhJ8vkP64sznAcH3J\\\n\txktsiSeko/lLczecycPSpaDHD1ifVbacLB6XLn09UqLxElviq8zeAMOpUq/B7eZGgEmfc2\\\n\t2pxnOHeAE+k7nNEt6M00oXkdm6Ug3nDvG1ODtzmyGP80o1nDPEE/hgxvZCXm1ccDSQnCG+\\\n\tVJmzSiGPpTO/pR05Q7w1Y1shvybOQNaSK8SLpMv3wuy1QRo5fknuhnOFeJO50900l70Kv8\\\n\tYXpFPtWeQKcWyF55YPSYNMswQ5V4iLdYSHYjbjyzkaynHaeaE0yHJh2w2FTroCP2mzgRxb\\\n\t4vNEgOeyL2o5ZzlCvCJDG6G7ztXy9cY5QnxmhjZCt72lzZW3NSvm86XJT14mXQwT5rbLpQ\\\n\tG1d0pzvjWqyQO75bhaGtmwRsEzOKHT7sIPsEtDU2M1EeKX4ON4u3Yn7Qizy1F8B5/GX0dZ\\\n\t0SghXipNN/UBs2ey7pDfUak/eYc0z8bQ6oZ4rfRfdE6dhUPo4UFpV3TfsAvW6Z24Rho7Fg\\\n\tEOTTpbmoDm6mEXHDbEN0gzz8TJi9CGRdJ0vtuGWWiY3Ykt0ty8IeSwRRpwO6NBQ7wJP5Xx\\\n\t8row5z2Nywww6+ggIV6G+6QTGCHk9JA0AU3f/uRB9olvFAEOZZyGr870ppm2xJtwR1MVhV\\\n\tDTZfrkcKYQ341XNF1RCEO6W5+BFf12JzaKAIdueKWUx576hfiG5msJobb3Vb1QtTuxWDoi\\\n\tXNJWRSEM6ZDUU3Z4+gtVW+KNIsChW5ZIHQ0n6RfiELrm4l5PVoX4whYLCaGuNb2erArxqh\\\n\tYLCaGunrmsCvHpLRYSQl09c1nVO1H8Do0hVDhp7GYX72IfwlCqQnxSX1wIHdAzl1UhPthi\\\n\tISHU1TOXVSF+oMVCQqirZy6rQnxfi4WEUFfPXFaFeE+LhYRQV89cVnWxLcO/xVRUoTuOSf\\\n\t3EB6a/ULUlPiBGdIRuuUOPANO/n3hXO7WEUEtlHvsNT1ooTfQW8wuH0v4hzTh1pNeL/bbE\\\n\tR7CzjYpCGNJOFQFm5oGi87AXFzVcVAiD+p00SHSy6g0zXTsxieul6TdDyO2olL/KADPYBU\\\n\tD7sL2JikIY0nYDTPU66FxsE/gG3jtiUSEM6pvSpIIzBnSYWTHnYTeurF9XCAP5njThdt/d\\\n\tiOOGuZ54cmrFA023GUJNNxkiwAx/UfyktInfpk+XRwg1HJFytcUQAWa0G8+skWbMjJuPh1\\\n\tHtxVbsr7PwKMOTfo/1uE66aUgIw3pQys96NQNMczdjnI/NuFa6j2/cEixUeUq668Au3Dr1\\\n\t80iavKPocc+TZhDaKN0WdxVOFdNizUWH8DD+gnvxq6nHI0020kaIQ8gqhuyHsRchDmMvQh\\\n\tzGXoQ4jL3/A4htWI/rxYLaAAAAAElFTkSuQmCC\\\n\t\")\n\t-- cloud_1@2x.png\n\tR.bg[2].cloud_1_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAAWIAAACoCAYAAADaWOQcAAAOEElEQVR4nO3debQfZX3H8f\\\n\tcl4SZkITkmshmwIYgBTVgLZRMwBiwuOaCCqCig4illq2KL2x+etmqtWFcqirGlLlXcDngE\\\n\tBbHUKEKhKkILFRO2YpEkEiGQQLjpH98bEvAmmZnfzDyzvF/n3HNzYGaeLwn5/J77zLMMrV\\\n\t+/HklSOtukLkCS+s4glqTEDGJJSswglqTEDGJJSswglqTEDGJJSswglqTEDGJJSmx86gK0\\\n\tWeOA3YF5wB+Nfu0G7Ag8a/RrMrDdM+77PfDk6PeVwP3A/45+3QPcNvr1aMX1S8poyCXOjb\\\n\tEHcCjwJ8DBwAuACRW1tR5YCvwS+DGwBLgJWFdRe5K2wCBOZwrwUuBY4Biit5vSaiKQrwa+\\\n\tCSxLW47UHwZxvSYDxwOvIcJ3YtpytugXRCB/FbgjcS1SpxnE9TgEeDNwIjA1cS1FLAE+B3\\\n\twdx5al0hnE1RkGTgLOA/ZPXEtZVgGLgY8RL/7UfNsSL3xfCMwlXvruRLzsnUT8fwrwCPAQ\\\n\t8FvgbuBO4h3Cz4CHa624hwzi8m0HnAG8A9g1cS1VeQL4IvBh4PbEtegPvRBYBLyEePH7zJ\\\n\tk1eYwQgXwt8F3gOuLPXyUyiMszHngb8F6ix9EH64GvAO8B7kpbSu/NAk4F3kTMwKnKCuAy\\\n\t4BLg5grb6RWDuBzHA38HPC91IYmsBT4BfID48Vb1ORA4H3g1Mfe8TjcAFwLfIHrOKsggHs\\\n\twc4FPENDTBcuCdwD8lrqMP9iY++BalLoRYIPQu4IrUhbSVQVzMOOAC4H1Ut+iiza4mhmmc\\\n\ti1y+qcBfA2dRfw94a64BzgR+lbqQtjGI85tL9PgOTlxH060G3g18khhL1uAWAl8AnpO6kC\\\n\t1YS7wn+SgOV2RmEOfzFiJYmrwQo2m+Q7xAWpm6kBYbD3yImInTFj8EXgf8X+pC2sAgzmYK\\\n\t8Fng5NSFtNR9xO/dktSFtNAMYiHNUYnrKOI3xIvsG1IX0nQG8dbNBi4n5maquCeBc4FPpy\\\n\t6kReYA3xv93laPAacQMyu0Ge5HvGUvInYlM4QHN46YYfIJmveSqYnmET9BtDmEIRaTfA14\\\n\tQ+pCmswe8eadSKwe2zZ1IR10JbH826WzY9sDuB6YmbqQEo0AbwS+lLqQJjKIx3Yu8A/AUO\\\n\tpCOuwm4DjgwdSFNMxziDHVJs+MKGoEeAWxVFqbMIj/0AXAB1MX0RO3Ai+mOWE8AZgP7Ac8\\\n\tn+iZ7kycijIN2J6NH85riPHPB4mZAfcC/wP8N7FRzp0F2p9EDEfsV/i/oPlWA4cR26xqlE\\\n\tH8dIZw/VKG8TjgCGJ+7gLgAMo7Pmw58BPgKuKF29IM93wFeG1J7TfZMmJptlMaRxnEG50D\\\n\tfDx1ET11K3Ak9fzFHAIOJ+Y2L6K+cdifA/9KjJHeN8a/fwux53NffIPYH0MYxBucAlyauo\\\n\tieu4HoGVe18fwU4HTgbKrdnWxrRog9GT5FLAmGmCJ5KzE00Sen4b4kgEEM8SPplTg7ogmu\\\n\tIBYAPFniM6cTm/OfR4zzNsl/snHfiAWJa0nhd8BewAOpC0mt70E8l5gmND11IXrKRylnKe\\\n\t8w0ft9H80LYG30BeInlV7rcxBPA/6D/u4h3GSvJQ4tLepo4DPAnuWUowqtJ16S/ix1ISn1\\\n\tdWXdEDE2ZQg302JiGlleG/YEuRZDuC2GgPenLiK1vvaIzwf+PnUR2qKlwL5kX323P9GLTv\\\n\tkiTsXtA9ySuohU+tgj3hf429RFaKt2J06LzuI0YqzfEG6vNm3xWbq+9YgnEm+q90pdiDJb\\\n\tROx+N5ZtiJ9s3l5fOarIGmIVYy/PPOxbj/j9GMJt83lghzH++TDwZQzhrphIP1YVjqlPQb\\\n\twvPf/xp6VmEhswbWqY2Cz9pPrLUYV6++fZl6GJbYiVWwemLkSFHQVcx8YQfkXSalSFEeKD\\\n\t93epC6lbX3rEp2IIt92nidWPF2MId9U2xAZMvdOHHvFU4njvHVMXooHdhB+oXXcR8Oepi6\\\n\thbH3rE78AQ7gpDuPsOSV1ACl3vEc8kNuh2rwGpHR4HJgPrUhdSp673iM/HEJbaZJhYzNMr\\\n\tXQ7iacCZqYuQlJtB3CFnEC/qJLVLFw9O3aKuBvF44ugjSe0zI3UBdetqEL8cmJW6CEmF9O\\\n\t3IqM4G8RmpC5BU2MTUBdSti0G8K/DS1EVIKmxN6gLq1sUgPpHY9V9SOw2nLqBuXQzik1MX\\\n\tIGkg7yI26erNniJdW1k3mzhiR1I3/DuxHuC21IVUqWs94penLkBSqV5EnKrzTjo85Ni1ID\\\n\t4udQGSSjcMfBj4Fh2d2taloYmJxIbSvZv6IvXIjcAxwKrUhZSpSz3iAzGEpa47CPg+sH3q\\\n\tQsrUpSA+InUBkmpxEHFc1rjUhZSlS0F8eOoCJNVmIfA3qYsoS5fGiO8Hdk5dhKTarAeOBH\\\n\t6UupBBdSWIdwAeSF2EpNrdDswHnkhdyCC6MjQxP3UBkpKYSwcOgOhKEO+ZugBJyVxAy/en\\\n\t6EoQz0ldgKRkdgJOSl3EILoSxL0740rS05yWuoBBdCWInS0h9dtRxEv7VupKEO+YugBJSQ\\\n\t0Bx6Yuoqi2B/EUYsaEQSzp0NQFFNWmecSTgMOI3+w/BvbBA0IlbfQwcBXwU+B6YvvMtUkr\\\n\tyqjpQbwL8CpgEbGEeULaciS1yBoimL8FfAdYmbaczWtiEA8T4Xs6sIAObwYtqTbriF3bLg\\\n\tKuBEbSlvN0TQri6cDZxCqZnRLXIqm7lhGB/BngkcS1AM0I4inA+cB5wLTEtUjqjxXEDm4X\\\n\tA4+lLCRlEA8Rww8foMXz/yS13n3Ae4B/IXZ0q12qIJ4LLAYOSdG4JI3hOuCtwK/qbrjuec\\\n\tRDwNuBn2MIS2qWI4FfAGdR8ySBOnvEM4iu/5/W1aAkFXQF8CbiQOLK1RXE84FvA7PraEyS\\\n\tSvBr4JXAf1XdUB1DE8cASzCEJbXLHGKF3oKqG6o6iE8mVrRMrbgdSarC9sQCkBOqbKTKIH\\\n\t498EVg2wrbkKSqbQtcRmRaJaoaIz4e+Drt391NkjZYR2y/cHnZD64iiI8ArqHlZ0hJ0hge\\\n\tAxYCPy7zoWUH8RzgRuBZZT5UkhpkBXAgcFdZDyxz6GAysd2cISypy2YQwxPblfXAMoP4k8\\\n\tC8Ep8nSU01j8i8UpQ1NPFq4q2iJPXJCcRIwEDKCOJnEytPZg76IElqmeXAXqPfCytjaOJC\\\n\tDGFJ/TQT+MigDxm0R3wYsXxZkvrsYGLGWCGD9IiHiN6wJPXdhwa5eZAgXkR8CkhS3x0NHF\\\n\tv05kGGJm4G9i96syR1zM3EQo/civaIF2IIS9KmDgAOLXJj0SA+q+B9ktRl5xS5qcjQxCzg\\\n\tHmo+00mSWmAd8Fzg/jw3FekRn4IhLEljGU8ciJFLkSDO3Ygk9chr8t6Qd2hiDnBn3kYkqW\\\n\td2A+7NenHeHvHLcl4vSX30yjwX5w3il+S8XpL66Mg8F+cZmhgCVgLT81YkST3zG2CXrBfn\\\n\t6RHviSEsSVnsDMzOenGeIN4vfy2S1FuZlzvnCeK9CxQiSX21Z9YL8wTx8woUIkl9tXvWC/\\\n\tME8XMLFCJJfbVH1gvzBPGOBQqRpL6alfXCPEE8o0AhktRXk7NemCeIpxUoRJL6alLWC/Ms\\\n\t6BjolFFJ6qFMO1UOcmadJKkEBrEkJZYniJ+orApJ6p7Hs16YJ4hXFChEkvoqc2bmCeLlBQ\\\n\tqRpL7KnJl5gjjzbvOSJO7JemGeIF5aoBBJ6qu7sl6YJ4jvyF+HJPXW7VkvzBPEtxQoRJL6\\\n\tKnNm5llZNxV4COceS9LWjBAnGj2c5eI8ofow9oolKYtbyBjCkL93e13O6yWpj/4tz8V5g/\\\n\tjKnNdLUh9dlefiPGPEABOBB4Dt89wkST3ye2AHYG3WG/L2iNcAl+e8R5L65HJyhDAUmwHx\\\n\t5QL3SFJf5M7IvEMTEOG9DNgt742S1HH3ALOJ6WuZFekRjwCfLXCfJHXdxeQMYSjWI4Y4SP\\\n\tRuchyOJ0kdt5oYKViZ98aiq+RWAJcUvFeSuugSCoQwFO8RQ0zPWIq9YklaTYwNP1jk5kH2\\\n\tjfgtcOEA90tSV3yEgiEMg/WIASYR22POGuQhktRi9wJzgUeLPmDQndQeBc4e8BmS1GbnME\\\n\tAIQzlbWn4buKyE50hS21xGZOBABh2a2GAGse3bLmU8TJJa4H5gPiWccF/WJu8rgDdQYCKz\\\n\tJLXQCJF5A4cwlHvaxg+BC0p8niQ11V8RmVeKsoYmnnoe8M/AKWU+VJIa5FLgVKC08Cw7iA\\\n\tGGge8CC8p+sCQl9gPgOODxMh9aRRBDrLa7FjioiodLUgI3Akcz4FS1sVR1IvNq4Bjghoqe\\\n\tL0l1+imRaaWHMFQXxACrgBcD11TYhiRV7RpiqHVVVQ1UGcQQnx4vAxZX3I4kVWExkWGV9I\\\n\tQ3qDqIIQa13wz8BbCuhvYkaVDrgPOI7Cr1xdxYqnpZtzmHA1/CY5YkNdfdxGKNJXU1WEeP\\\n\teFNLiCWBl9bcriRlcSmwDzWGMNTfI97UQuAfgTmpCpCkUb8G/gy4OkXjdfeIN3U1sDfwl1\\\n\tT4NlKStmAVkUF7kyiEIW2PeFPTiYHxc0d/LUlVegj4OPCx0V8n1ZQg3mAKcDpwJvD8xLVI\\\n\t6p47gIuIaWmPJK7lKU0L4k0dAbweOAF4duJaJLXXg8A3iRlbP0pcy5iaHMQbjAMOAY4lVu\\\n\todAExIWpGkJlsL3Ezsd/M94HrgyaQVbUUbgviZJhBT4OYBLyCOsN4V2AGYSRxoKqnbHgWW\\\n\tE6fJ3wssA24DfkmcFrQ2XWn5tTGIJalTUk5fkyRhEEtScgaxJCVmEEtSYgaxJCVmEEtSYg\\\n\taxJCVmEEtSYgaxJCX2/5ixqodpMZm+AAAAAElFTkSuQmCC\\\n\t\")\n\t-- cloud_2.png\n\tR.bg[1].cloud_2_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAALEAAABUCAYAAADNoNb0AAAF0klEQVR4nO3dW4hVVRzH8e\\\n\t8cc2w0M6uZhjE1m0lNsbLsOj5FXgoyKlMLSqMxYx6znsughzDMh56sibALFSEUpFQiFUVk\\\n\tSdJDNF2s7DZYUGNTDU7j9PA/kWSkc87/v9dl/z/gy6hr/w/nx5q1115r7YaRkRGcS1kldA\\\n\tHO1ctD7JLnIXbJ8xC75J0QuoCSOxdYDMwHzgfagFOARuAw0A/sB3qB94FdwN7q37mqBp+d\\\n\tKFwLcBdwK9BRw///FngaeAzYp1hXsjzExWkGNgB3ID1tvYaRMG8AvlRoL1keYnsNQDfwID\\\n\tDJoP0/qm0/BPxp0H70PMS2TgWeBK4t4FrvAKuQ4UapeIjtzABeB9oLvOYPwFLgowKvGZyH\\\n\t2MZsYCcwJcC1DwJXIbMZpeAhPloTcAky5XUeMBM4o/rzCcCvwG/Ad8BXSK+3G/gQGKr+2/\\\n\teA6QXXfaSfgE7g04A1FMZDLE4GlgPLkHnbphraOAi8ikybzdcrrWa9wAJgIHQh1soe4g5g\\\n\tPXAbMD5wLRa2AqtDF2GtrCFuAR4AuoAxgWuxthi5wcxWGUO8GngEmBy6kIL0AnORhyNZKt\\\n\tMCoInAC8i8bVkCDDALuCl0EZbK0hOfBWxHFtyU0V7iuNk0UYaeeB7yNKusAQa4AJkyzFLu\\\n\tIe5Ali+2hS4kAitCF2Al5xA3I3flp4cuJBJLQhdgJYcx8XhkUn8O8ph3IrJovBN58ubEYW\\\n\tQVXXYPP1Ld2dEI3IhMl10JjA1bThIqyEzFntCFaEttOFEB1iI7Gp5FfkV6gI/fzNAFWEip\\\n\tJ25HdjJcFrqQhDWHLsBCKiFeBLyILNRxtTspdAEWUhhOLANewQOsIYXve9Ri/1BXID2wj3\\\n\tt1tFPbMtOoxRziZmAbHmBNa5Cb4rXE/d2PSswf5FFkl4TT1QpsAd4CpgWuRUWsDzs6gbdD\\\n\tF1ECPwPXA2+GLqQesfbE94UuoCQmA68hN8/JirEnPoeSbHCMyCHkwdEbgeuoSYw98fLQBZ\\\n\tRQIzILlOQYOcYQZ7vaKnKnAc8gx24lJbYQV4CLQxdRYguBO0MXMVqxjYmnUMKzxCLTB5yN\\\n\tHFTYBIxDDoyJdqNpLGsnpgFXV/+4sFqBz5DNBOOO+Pnv1Z9/jMwx7wQ+L7y6/xCyJz4RuB\\\n\tlYB1waqghXl93A48BTwGCoIkKEuIIcNH0/vvctF33IYd9bCPAqhqJDPBs598F73jx9gLzG\\\n\t4ZMiL1rk7MRK5EN6gPO1APmObynyokWFeD3wHHI0qsvbBGS++Z6iLlhEiO8GHi7gOi4uG5\\\n\tHOy5z1mHgF8LzlBVz0VmGcAcsQz0LGR1nu63LHbQC4EJljNmE1nKgAT+ABdpKBrRiuybAK\\\n\t8Rpkf5xzIMcs3G7VuMVwohF5HDlVu2GXtG+QAx4PaTds0ROvxAPsjjYVyYY6ixCvM2jT5a\\\n\tHLolHt4UQbspQyuYXVrjBnIu8AVKPdEy/FA+z+3yLtBrVDfLlyey4/C7Ub1A7xPOX2XH7m\\\n\taDeoHeIZyu25/HRoN6h9YzdMfJtPXVyGkGcJarRDHNWuUxct1Zt/7zVd8rRD/Ityey4/6h\\\n\tnRDvF+5fZcftQzoh1iPwjQHYt6RrRD/K5yey4/6hnRDvEu5fZcftQzYrGe+AvkLC/n/m0f\\\n\t8vIbVRZTbD0Gbbo8mGTDoiduAb5Gzlpz7m+DwHTggHbDFj3xAWCzQbsubZsxCDDYbdmfhB\\\n\twB6gcGOoDvkdVr/RaNWz127ge6jdp26enGKMBgu3biJWCTYfsuDZuQLJixPsZqDPJq26Tf\\\n\tk+Zq9jJwA8avSrBexTaMbNPeYXwdF58dyHdv/q6PIpZiDgLX4fPHZdKDfOeFvAKhqPXEQ8\\\n\tiZA13IAXMuTwP88z0PFXXRohfF9wBzkXGyy8s25Lst/DduyLcnXQTciwz8x4YqwtVlCAnv\\\n\tRmBPqCJieBljMzJ+ugY5t6I1bDnuGPqQ5ZTbkamzH8OWE0eInauLbxR1yfMQu+R5iF3yPM\\\n\tQueX8BzokhiMHuRk0AAAAASUVORK5CYII=\\\n\t\")\n\t-- cloud_2@2x.png\n\tR.bg[2].cloud_2_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAAWIAAACoCAYAAADaWOQcAAAMXUlEQVR4nO3de6zf8x3H8e\\\n\tfR9kQxpZ2WCkqrOlKrul9Kmds2m5lths0lw1oWhMzcZtnMNrK4zUzS2NjFzDW2mWxzN5Ni\\\n\tZshQrbmUMkxrSteq7o+PE1XV8/ud8/v93p/P9/t8JJKmOel55cjvdd6/z+/z/Xy6lixZgi\\\n\tQpzkrRASSp7ixiSQpmEUtSMItYkoJZxJIUzCKWpGAWsSQFs4glKZhFLEnBBkYHkDIwANgU\\\n\t2BLYGBgHrAuMANYEhizz9QuAV4AXgWeBp4B/Ag8B/wDe7ERoVUeXjzirprYA9gL2ALYDVm\\\n\tnRv7sIeAC4DbgJ+CvwVov+bVWURaw6GQ8cDHwe2KhD3/Nl4FrgV8BfAF9weh+LWFU3EPgi\\\n\tcDSwfXCWGcDFwKXA68FZlBGLWFXVDRwBnARsEJxlWXOBC4Dz3/mzas4iVtV0kSbgs4ANg7\\\n\tP0Zh7wHeAiYGFwFgWyiFUlm5Le+u8SHaRJM4CpwK3RQRTDfcSqggHAKcCDlFfCAGOBW4Bp\\\n\twGrBWRTAiVilWw+4EtghOkiLzAIOBO6LDqLOcSJWyT5G2rNblRIGGE3a5nZEdBB1jkWsUk\\\n\t0B/gR8ODpIG3STlikuJC27qOJcmlBpuoAzgdOig3TI9aRdIO6qqDCLWCXpIu2KmBIdpMNu\\\n\tBvYF3ogOovZwaUIluZD6lTDA7qTJuDs6iNrDiVh9MZD0sMQmpA+X1gGGA2uTDs8ZyLvbsN\\\n\t4gnVY2l3Ri2RxgNvAEMJN0elkjzgC+3Zr4xbqOdE7G29FB1FoWsRqxPrAbsC2wFTCB1h2h\\\n\t+ipp/+904C7SjoHXlvmaQ4HLWvT9SncucGJ0CLWWRazlGQBMBj5DOipy4w5+77eA24HfA7\\\n\t8lTdp34tvypR2Ov5gqxSLW0iYAR5Le/q4VnKXHImBQdIjMLCCdJPdgdBC1hkWsbuAg0jGR\\\n\tWwdnUeMeAybibSCV4K6J+loNOIH0SO3PsIRLMw44OzqEWsOJuH4GAkcB3yTtclC5lgA7Av\\\n\tdEB1H/WMT1sjfwI2BMdBC1zMOk+/cWRwdR37k0UQ8jgatJl1lawtUyHg8IKp4TcfUdSHos\\\n\teI3oIGqbF0iXofrBXaGciKvrQ8CvgSuwhKtubeBr0SHUd07E1bQZ6XHYsdFB1DEvkC5J9Z\\\n\tS2AjkRV89+pMeFLeF6WRs4ODqE+sYirpbjgWuAVaODKMTU6ADqG4u4GrqAc4Dz8P9pnW0N\\\n\tfDQ6hJrni7Z8PYelfz06iLJwYHQANc8P68r3E+p5WLqW7ynSWdEqiBNx2c7EEtZ7jQI2jw\\\n\t6h5ljE5ToWOD06hLK0d3QANcciLtPepA/mpOXZNTqAmuMacd66SVvRhpAOA38dWJe0T3hI\\\n\tYC7lbR4wFO+2K4ZFnId1gUmkO+HGkK4mGk3r7oVT/YwDHo8Oocb4Qo+zHWmr0SdJpSu10n\\\n\tgs4mJYxJ21BvBV0sHsGwVnUbVtGh1AjbOIO2M4cBKphFcLzqJ6cC9xQSzi9uomHU/4LWD1\\\n\t4Cyql/WiA6hxFnH7bAX8gvShidRpI6IDqHHuI269AcCppAsdLWFFGRYdQI1zIm6tNYHfAH\\\n\ttEB1HtrRIdQI2ziFtnFPBHPJBdUpMs4tYYA9xOejBDkpriGnH/WcLKkTc6F8Qi7p9hpOUI\\\n\tS1i5+V90ADXOIu67gcDV+ISc8rQOcD7uJy6CRdx3P8TjBpWvbuA4YBZwCb5ry5qnr/XNnq\\\n\tQlCakU84GzSAPEouAsWoZF3LzVgUfwLZ/K9DBwKPD36CB6l0sTzfsBlrDKNZ50scCJpBvA\\\n\tlQEn4uaMI03DA6KDSC1wHXAIadlCgZyIm/M9LGFVx2eBu4CR0UHqzom4cVsAD0SHkNrgSW\\\n\tAvYGZ0kLpyIm7csdEBpDbZiPR06JjgHLXlRNyYYcBsYOXoIFIbPQXsAMwJzlE7TsSNOQhL\\\n\tWNU3CvgDsGpwjtqxiBuzf3QAqUMmAJfj1raOsoh7NxyYFB1C6qD9geOjQ9SJRdy73fHnpP\\\n\to5mzQdqwMsmN7tEB1ACjCItEQxKDpIHVjEvds2OoAUZHPSo9BqM7evrdhA0k0HXimlunoT\\\n\tGI1b2trKiXjFRmIJq94GA6dGh6g6J+IVmwTcGR1CCraI9NTdM0v9XRcwhLTn+C3S1Uyvv/\\\n\tNnNclp74OtB3w6OoSUgUGkk9peBtYnPfgx+AO+di7wHOkpvRnAQ8B9wKPA223OWSwn4ncN\\\n\tIRXvx4Gd8MxhqZXmAncANwG/A56PjZOXuhdxN+kowINJ1x91x8aRamEJcDdwGXAlnodc2y\\\n\tIeAUx557+1g7NIdfZfYBpwAe9dg66VuhXxMOAU4Bg8xEfKySLgp6QLTp8NztJxdSnibtLG\\\n\t9G+Q1oIl5WkB6fHqc4A3grN0TB2KeBvSb9rNooNIati/gKOAm6ODdEKVH+joJv1WvQdLWC\\\n\trNhsCfgYuowTJiVSfiUcC1wMTgHJL672FgP2BWdJB2qeJEvAtwP5awVBXjSa/p3aODtEvV\\\n\tivgA0tuZYdFBJLXUGqRrnA6PDtIOVSriqaTN4Z6fKlXTINIH70dHB2m1qhTxVODi6BCSOu\\\n\tLHpNd8ZVThw7oDgCuozi8VSY35MvDL6BCtUHoRTwJuweUIqY4Wkc6IuT04R7+VXMQbkI7X\\\n\tWys6iKQw/yHtkHo6Okh/lPp2fhBwFZawVHdDSc8MFH1yYqlFfCbp0WVJ2hL4bnSI/ihxaW\\\n\tIicC8wIDqIpGwsIX1mdHd0kL4orYgHkkp4i+ggkrLzKDABWBgdpFmlLU0chyUsafk+QuqI\\\n\t4pQ0Ea8BzMTHlyV9sNeA0aSLTotR0kR8ApawpBVbHTgpOkSzSpmIh5H2Ca4aHURS9haQbm\\\n\tEvZiouZSI+EktYUmNWprCDgUqYiAeQDoTeIDqIpGK8SJqKF0UHaUQJE/E+WMKSmjMC+FR0\\\n\tiEaVUMRfig4gqUjFdEfuSxODgZdwfVhS8xYCw4F50UF6k/tEvCeWsKS+6Qb2iA7RiNyLeJ\\\n\t/oAJKK9onoAI3IvYh3ig4gqWiTowM0Iuc14qHAK9EhJBVvJDAnOsSK5DwRbxcdQFIlbBkd\\\n\toDc5F/Fm0QEkVcLm0QF6k3MRj44OIKkSxkYH6I1FLKnqRkUH6E3ORexjzZJaYWR0gN7kXM\\\n\tRDogNIqoTszzHPuYgHRweQVAlDowP0Jud9xNkGk1ScrugAK5LzRCxJtZBzEb8VHUBSJWTf\\\n\tJTkX8fzoAJIqIfsuybmIsz9DVFIRXosO0Juci9gDfyS1QvZdknMRPxkdQFIlzIoO0Juciz\\\n\tj7H56kImTfJTkX8czoAJIqIfsuybmI/xYdQFIlZN8lOT9ZN4C0c8LLQyX11XzSuTWLo4Os\\\n\tSM4T8WJgenQISUWbTuYlDHkXMcBt0QEkFa2IDsm9iG+IDiCpaEV0SM5rxD0eAzaJDiGpOI\\\n\t8D46JDNCL3iRjg2ugAkopUTHeUMBGPBp4g8/NEJWVlCbAxBTzMAWVMxLOAG6NDSCrKjRRS\\\n\twlBGEQNcFB1AUlGK6owSliYgLUs8AEyIDiIpew8CEynourVSJuIlwMnRISQV4WQKKmEoZy\\\n\tLucRswOTqEpGzdDuwaHaJZpRXxROBe0jkUkrS0xcA2pGXMopSyNNHjAeC86BCSsnQuBZYw\\\n\tlDcRAwwGHgLGRAeRlI2ZwObAm9FB+qK0iRjSD/owCjhRSVJHLCZ1QpElDGUWMcDdwOnRIS\\\n\tRl4TRSJxSrxKWJHl3AVcDnooNICnMN8AUK2662rJKLGGAV0pa2baKDSOq4e0lb1d6IDtJf\\\n\tpRcxwFrAXXhUplQnjwOTgJeig7RCqWvES3sJ2J2CDviQ1C+zSK/5SpQwVKOIAWYDOwOPRA\\\n\teR1FaPkCbh2dFBWqkqRQzwPKmM74gOIqkt7iC9xudEB2m1KhUxwKvAnsC06CCSWmoa6bX9\\\n\tanSQdqjCh3Uf5DDSmaSrBueQ1HfzgWOAy6ODtFOVixhgLOk36c7RQSQ17U7gSGBGdJB2q9\\\n\trSxLJmkI7NPAqYFxtFUoPmkV6zk6lBCUP1J+KljQBOAY4GBgVnkfR+i4CLge8DLwZn6ag6\\\n\tFXGP9YEzgEOwkKUcLAR+DpwJPBOcJUQdi7jHcOArwBRSOUvqrGeAS4BLgX8HZwlV5yLusR\\\n\tKwG7AfsC+wbmwcqdKeA24ArgduBd6OjZMHi/i9uoCtgB2B7YHtcFqW+uNpYDpwD+moyvsp\\\n\t/KS0drCIJSlY1bevSVL2LGJJCmYRS1Iwi1iSglnEkhTMIpakYBaxJAWziCUpmEUsScH+D0\\\n\tEmR28m6dqwAAAAAElFTkSuQmCC\\\n\t\")\n\t-- cloud_3.png\n\tR.bg[1].cloud_3_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAALEAAABUCAYAAADNoNb0AAAFhklEQVR4nO3dWYxfUxwH8E\\\n\t+rElGh1tSe1NJUiMTEFtEmJR5ILEG8iC1p8SAhggdeRCW1e6JCiCdLBKkSsST2pfYtDCFE\\\n\tSSNFhDZ9YOrhZGTKjLbTmfn9zr3n89zMfPs/3zn/c+89995pGzZs0DQ1mx4doGm2VitxU7\\\n\t1W4qZ6rcRN9WZEB6jMLjgWR2EODsD+mImdRvy7dfgVq/AtPsOHeAM/T13cfpjWzk5s0gDO\\\n\txik4dAJ+3qdYgcfxzgT8vN5rJR7dzrgIlyqz7WQZxL24X5m5m3FoJd7Y7rgWi7D9FP7etV\\\n\tiGm/HTFP7eTmglLrbDNbhKWd9G+R1LcTvWB+aoSisx83EfDooOMsKg8m3wanSQGvT5FNsM\\\n\t3IaX5SowzFVyLdHOIG1SX2fi2XgUx0cH2Qyv4EysiQ6SVR9LPBcvYu/oIFvga5yML6ODZN\\\n\tS3Eg/gWewWHWQc1mAhPokOkk2fSnwYXsOO0UG2whrlQPTz6CCZ9KXE++N1dS0hxrJKufS9\\\n\tKjpIFn04OzETz+hGgWEfPKmc2270o8TLcEh0iAk2gLuiQ2TR9eXEhcq+hK46G49Fh4jW5R\\\n\tLPVg6AZkUHmUS/YJ6e77fo8nLiTt0uMGV/89LoENG6OhMfgzejQ0yhp5Vz39PxI97FU/go\\\n\tMtRU6WqJX8KC6BAJvKLszFsZHWQydXE5MV8r8LD5yjfSddFBJlMXS3xZdIBkpuMG3BEdZL\\\n\tJ0bTkxG99r2xfHcgEejA4x0bo2E5+nFfj/3KnOzU//q2slPi06QHKzdHC51aXlxO5YrXt/\\\n\tmBPtG5N7B/eU69KAn6Bb/5/JMkfZRNQZXRr0I6MDVGROdICJ1KUSHx0doCILbPzYrarVvi\\\n\taehXNxDo7DtNg4VRlSbhR4CI8om4mqVGuJ91ae1HO+qX1ST1etwwO4STnPXpXaSrydcgn1\\\n\tSu3OhsmwXnn60A0qegJRTSUewMM4MDpIDwwqF46q2DhUy4HdJcpGllbgqTFXuTN8cXSQzV\\\n\tFDiZfgbmwbHaRntsU9uDE6yKZkX04sVZ5W2cS6BVdHhxhL5hJfrsPbByt0hbKBKJ2sJV6I\\\n\t59Wx3OmLIeXS/kvBOf4jY4l3xcfYKzpI8x+rlWd4pHo1Q8aZbqlW4Kxm49boEP+WbSY+Em\\\n\t9rl4+zOwIfRIcYlm0mvk4rcA2WRAcYKdNMfIjy0sKmDvPwRXQIcs3Ei6IDNFvk4ugAw7LM\\\n\txNPwA/aMDtJsth+VO0TCC5RlJh7QClybvZRxC5elxO2JPXWaHx2APCVu98fV6ajoAOQp8c\\\n\tHRAZpxSfESyywl3jc6QDMu+0UHIM/ZiSHtIkeNhrBNdIgsM3ErcJ1S9CdFiKbZGllK/Ft0\\\n\tgGZcUoxblhKvjg7QjEuKcctS4q+iAzTjkmLcspS4F2/56aAU45alxK9FB2jGJcW4ZTlPPB\\\n\tNrtEdT1WS98uqEtdFBsszEa7E8OkSzRZZLUGDylJgOvtWn49KMV5blBOWq3efKc8Ca3AaV\\\n\t25NSlCfTTLxBshsQmzEtkaTA5JqJKbPxO5LcMdCM6j1l/3ea4mSaiSkfzGL8GR2kGdWfyv\\\n\tikKTD5Sgzv4/roEM2orlfGJ5Vsy4lh0/EETo0O0vxjOc5Q9hCnkrXEsANelOQ+rp5bqTwR\\\n\t84/oIKPJuJwY9gdOUsl7IzpspTIOKQtM7hJT9quegBXRQXpqhfL5p9g3PJbsJabMAKcrBx\\\n\tV/BWfpi7+Uz/t0iWfgYZnXxKM5BstweHSQDvtIeVvVW9FBNlcNM/FIbykXQhbju+AsXfOd\\\n\t8rkOqKjA1DcTjzQDZ+FCnKi+P8gMhvCC8krcx1R6kanmEo+0h3IEvUCZSeZq73wezTpl88\\\n\t57eBnP4afQRBOgKyVueqx9BTfVayVuqtdK3FSvlbip3t9rOy6aUG6iAgAAAABJRU5ErkJg\\\n\tgg==\\\n\t\")\n\t-- cloud_3@2x.png\n\tR.bg[2].cloud_3_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAAWIAAACoCAYAAADaWOQcAAALhklEQVR4nO3daaxdVRnG8f\\\n\t8tpUUopdQKSEtb5qkBQSwEiUBDUagyiBIpiVZAQcBqkDAlihJAgZKIUEIIKE4Eq0yCTEJB\\\n\tYtFiDEhoGVqGho7QkDKUoUDrh3Xh9HLnc88579p7/39Jk/bTfdqc/fS96661dtu6deuQJM\\\n\tUZFB1AkqrOIpakYBaxJAWziCUpmEUsScEsYkkKZhFLUjCLWJKCWcSSFGxwdABVyghgF2BX\\\n\tYBywDTAGGAWMBDYHNqXjgLAWeANYA7wFrACWAUuBxcBLwDzgKeDtVvwlpEZr84izmmRjYH\\\n\t9g3/ZfewOjm/j11gLPAU8CjwIPAf8F3mvi15QawiJWo7SRyvYrwCHARGDD0ERpQn4EmA3c\\\n\tTpqcpexYxBqINtLUOxU4Ctg6Nk6vFgC3ALcB/w7OIn3EIlY9tgFOBL4NjA3OUq+ngeuA3w\\\n\tIrg7Oo4ixi9cchwA+AwynPjpv3SBPyL0nLGFLLWcTqzSDgWOAcYM/gLM32MPBz4F7AB0Mt\\\n\tYxGrOx8W8E9I282q5HHgx8Cd0UFUDRaxunIQcDlpF0SVzQbOBB6LDqJys4i1vrHAFaQdEE\\\n\trWAb8HzgaWB2dRSZXlBy4amMGkye8pLOGPawO+SdqDPK39z1JDORFrF9LEt090kIL4O3Ay\\\n\t8EJ0EJWHE3F1tZG2oj2OJdwfk4EngOOjg6g8nIiraSTpIMOXo4MU3PXAdNJlRFLdLOLq2R\\\n\tu4leKeiMvNfOAY0kk9qS4uTVTLccA/sYQbaTdgLjAlOoiKyyKujvOBG4FPRAcpoeHAX4HT\\\n\to4OomFyaKL8NgGuAk6KDVMQM4Cw8Iq1+sIjLbQgwCzgyOkjFXE/a4vZBdBAVg0VcXkOAv5\\\n\tAualfr3Ug6CGIZq1euEZeTJRxvKvA70tKQ1COLuHw2IJ2Us4TjTQWuwmPR6oVFXD4zSddX\\\n\tKg+nAD+LDqG8uUZcLmcBl0SHUJe+Q3o1k9SJRVwex5DWhZWn94BJpAM1UgcWcTl8eLprWH\\\n\tQQ9Wg56Yj5suggyotrxMU3nPTyS0s4f1sBt5B2tUgfsYiL7xpgx+gQ6rP9gMuiQygvLk0U\\\n\t2zTgN9EhVJfJwP3RIZQHi7i4xgJPAptGB1FdlgATgFXRQRTPpYliaiNthbKEi2s0ac+3ZB\\\n\tEX1Amkb21VbFOBL0WHUDyXJopnJPAs8MnoIGqIhaQlinejgyiOE3HxXIwlXCY7AGdGh1As\\\n\tJ+JimUB6g7CXyJTL26SL+7cCtgQ2Ad4H3iAd/ngGeAx4NSqgmssiLpY78d1oVbWO9J/wbc\\\n\tAfgQWxcdRIFnFxHAg8FB1C2bgHuBCYEx1EA2cRF8cDpEtjpPX9GfghsDQ6iOpnERfDfsC/\\\n\tokMoW6tIWxpvjQ6i+rhrohjOjQ6grI0gXSb00+AcqpMTcf62I+01daeE+uJq4LToEOofJ+\\\n\tL8fR9LWH13KnBBdAj1jxNx3oaS9pFuHh1EhfN1fGNLYTgR5+0oLGHV53pgXHQI9Y1FnLdp\\\n\t0QFUWMOBK6JDqG9cmsjXSGAFMDg6iArtYDwIlD0n4nwdjSWsgTs/OoB6ZxHn65joACqFg0\\\n\thv+VbGLOI8bUT6llJqhG9FB1DPLOI8HUgqY6kRvLEvcxZxnnwNkhppd9Jdx8qURZynA6ID\\\n\tqHT2iA6g7lnE+dkY+Gx0CJXOLtEB1D2LOD974bY1Nd6o6ADqnkWcn72iA6iUhkcHUPcs4v\\\n\tx8JjqASmky6U0eE/A2v+x4xDkPQ4FDgWNJJ+o2iY2jklsJ3AfMIr377t3YOLKIY32OdH/s\\\n\tV/FbR8VYRbou8wZ8EWkYi7j1BgPHkd6isG9wFml9/wFmkF679H5wlkqxiFtnEHA86RKW7Y\\\n\tOzSD1ZBFwM/BoLuSUs4taYAlwG7BodROqHhcAZwB3RQcrOIm6urYFf4U1qKra7ge+RJmU1\\\n\tgdvXmudk4GksYRXfYcA8Uhm79a0JnIgbbzPS+8IsYJXRXaRrNVdGBykTi7ixJgJ/AsYH55\\\n\tCaaTHwNWBudJCycGmicY4HHsYSVvmNAf5B+syrASzixjgX+APphJxUBUNJn/nzooOUgUsT\\\n\tA/cL4OzoEFKgS4BzokMUmUU8MFcA06NDSBm4mnRaVHVwaaJ+F2EJSx86lfRMqA5OxPU5Db\\\n\tgqOoSUodOBmdEhisYi7r/DgDvxuwmpK2uBI4C/RQcpEou4f3Yg3VA1IjqIlLFVpCteF0YH\\\n\tKQqnur7bELgJS1jqzQjgZtzO2WcWcd9dgG9XlvpqD+DS6BBF4dJE3xwIzMb/uKT+mgQ8GB\\\n\t0idxZx74YATwA7RweRCuh5YHfgneggOXPC690ZWMJSvbbDY9C9ciLu2RjgGWDj6CBSgb0D\\\n\t7AS8FB0kV07EPbsQS1gaqI3w1F2PnIi7NxZ4jvTWZUkDs5a0xOfe4i44EXfvPCxhqVEG4V\\\n\tpxt5yIu7Y18CLpEIekxlhD+rnLK9FBcuNE3LVpWMJSow0BTowOkSMn4s4Gkdaxto0OIpXQ\\\n\tItKWtrXRQXLiRNzZJCxhqVnGAZOjQ+TGIu7suOgAUskdHR0gNy5NdDQIWAZsER1EKrHlwG\\\n\thcnviIE3FHE7GEpWbbCtg/OkROLOKOpkQHkCri0OgAObGIOzogOoBUEU7E63GNuGYD0ite\\\n\thkUHkSrgTdKbPD6IDpIDJ+KaXbGEpVYZRrqnWFjE69snOoBUMXtGB8iFRVyzXXQAqWK2jw\\\n\t6QC4u4Znx0AKliHH7aWcQ146MDSBVjEbeziGvGRAeQKmZ0dIBcWMQ1m0YHkCpmZHSAXFjE\\\n\tNRtFB5AqZnh0gFx4oKPGfwip9dqiA+TAiViSglnEkhTMIq7xzLvUWj5z7SzimlejA0gV4z\\\n\tPXziKu8UMhtZbPXDuLuGZJdACpYnzm2lnENYuiA0gV4zPXziKueS46gFQxPnPtLOKaedEB\\\n\tpIrxmWtnEdc8Hh1AqhifuXYece5oBbBFdAipAl4GtowOkQsn4o7mRAeQKuKR6AA5sYg7ei\\\n\tA6gFQR90cHyIlF3NG90QGkivBZW49F3NFC/Emu1GzzSM+a2lnEnd0cHUAqOZ+xj3HXRGc7\\\n\tAs9Gh5BKbCdgQXSInDgRd7YAd09IzTIHS7gTi7hrM6MDSCXls9UFlya6NgR4Efh0cA6pTJ\\\n\tYB44E1wTmy40TctTXAjOgQUsnMwBLukhNx94aRbofyyLM0cC8D2wNvRgfJkRNx994ELowO\\\n\tIZXERVjC3XIi7tkQ4EnSljZJ9VkATMBliW45EfdsDTA9OoRUcNOxhHtkEffuHmBWdAipoG\\\n\taRniH1wKWJvvkUMB8YFR1EKpCVwG7AK9FBcudE3DevACdEh5AK5gQs4T6xiPvuDuDK6BBS\\\n\tQVxJembUBy5N9M8QYDbw+eggUsbmAJPwB3R9ZhH335bAXGBcdBApQ4uA/YDl0UGKxKWJ/l\\\n\tsBHA68Fh1EysxrpGfDEu4ni7g+84EvAqujg0iZWE16JuZHBykii7h+c4EjgLeig0jB3iI9\\\n\tC3OjgxSVa8QDty9wHzA8OogU4HXgUCzhAXEiHri5wP7A4uggUostJn32LeEBsogbYx4wEX\\\n\tg0OojUIo+SPvO+9bwBLOLGWQZ8Abg2OojUZNeSPuvLooOUhWvEzfEN4Bpgs+ggUgO9BpwC\\\n\t3BQdpGws4uYZTZocDo8OIjXAXcB3gSXRQcrIpYnmWQJMAY4FlgZnkeq1lPQZnoIl3DROxK\\\n\t2xCfAj4Kz230u5Ww1cClyOB5eaziJurVHAmcDpWMjK02rgKtIbl1cGZ6kMizjGZsBJwGnA\\\n\ttsFZJIAXgJnAdXiPSstZxLHagIOBacCReDpPrfU6cDtwA/AgYBkEsYjzMZR0h+thpCOjO8\\\n\tfGUUk9QzqSfzfpbu13Y+MILOKcbUG6gH4vYE9SMW9Lupxe6s0a4HngWeB/wGOkC9tfjgyl\\\n\trlnEkhTMfcSSFMwilqRgFrEkBbOIJSmYRSxJwSxiSQpmEUtSMItYkoJZxJIU7P83pECPnM\\\n\txUCgAAAABJRU5ErkJggg==\\\n\t\")\n\t-- cloud_4.png\n\tR.bg[1].cloud_4_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAALEAAABUCAYAAADNoNb0AAAFz0lEQVR4nO3dW4hfxR0H8M\\\n\t+mGhuNxqLWe0niNUaNEol3tJrY4L312tYbIlpB0BcVvDy1YIgoKqioEGKfKlgo2IcGqigY\\\n\txIiYxtYoahSLNWhDi7fqJnH7MCsmMSy7c+bc9v/7wJ9AsjPze/juyfzPmZkzNDIyIoQ+m9\\\n\tJ2ASFUFSEOvRchDr0XIQ69FyEOvbdD2wWESnbFcTgeczALM7Hb6GcII/h09PMx1uJt/B0v\\\n\tYEPTRZc2FLfYeucwXIjzcYJq/5uOYA2exR/wSuXqWhAh7odpuAzX4eQax3kTT+Ix/KfGcY\\\n\tqKEHfbNNyA27FPg+N+gYfxAD5qcNwsEeIydsGhOAgHYgamYzM+k+aj//LdfHR4HH1ejvuw\\\n\tXw31jteX+C3uN76aWxEhzvMDnC7NS0/BvNG/G4/NeB0r8BesxMYt/n0mluGnZUot4i38Bs\\\n\t+3XMd2RYgn5hDchF9hz0J9foLleBwL8Kh0Z6FrRrAUd2FTy7VsJUI8Pkfid9KVd6jlWtr2\\\n\tAi7Gv9su5FsR4rHtgXtxjQjvlt7FYrzTdiEMVoh3kr7tT8VX0petsVwkfUPfu+a6+uoj/E\\\n\tya37dqMoZ4R5w0+lmAg6W7BtO2+blN+CfW4VW8jOek20v34uaG6u2z9ThVy1fkyRLiIZyJ\\\n\tq3GedIsrx2Z8iJ8UqmsQvCc9Ofy4rQL6HuIdcCVuw+Et1zLIVuIMLd1L7vMqtsXSfGyZCH\\\n\tDbTsaStgbv45X4R3gIV7RdSPieRfhr04P2LcTH4mnMbruQsF3rMFe6+9OYPk0nzpXmXhHg\\\n\t7pqNO5setC9X4l9Lj2ZjEX/3DUuP5z9oasA+XInPEQHuk6m4tckBu34lnoeXfP9BRei2r6\\\n\tSpRSNrkbt8JZ6BP4oA99EPcWNTg3U5xA9Ij4tDP12poUVTXQ3xQmnlWOivmTitiYG6GOIp\\\n\t0naY0H8XNTFIF0N8OY5qu4hQxMImBuni3YnXcEzbRYRi9pc2ydama1fiE0WAJ5tT6h6gay\\\n\tGORT2Tz5y6B+hSiIfw87aLCMUdVvcAXQrxXOzbdhGhuIPrHqBLIT6p7QJCLfaqe4A2FtUc\\\n\tIE3250jP13eTHjHHvrbJade6B2gqxLOkTZy/lM4sC4Njet0D1H2feC7uxqXi8JFBdrh0nl\\\n\tst6poT7yKd6Pg36VzdCPBg+4d0lsfOdXRex5X4SDyFI0p3HHrvDVwy+mcxpUO8SFoDXPtk\\\n\tPvTWp9L0ckWpDkuG+Gz8STpGKoSxbMQv8OcSnZUK8QnSOWaxCyOM1/+kg8pXVe2oRIj3xG\\\n\tpptVIIE/GhdJbIJ1U6KXF34gkR4JBnfyk/lVS9Ep+LZ6oWEQbe+SrkqEqIp0hvpax9qV2Y\\\n\t9NZKt2a/yWlcZTpxgQhwKGOO9JbULFVCfH2FtiFsK/ucitzpxI+l0126tJQz9Ns30nryCZ\\\n\t84nxvChRXahrA9U3BWbsMcjRyKEQbOqTmNckMci3tCHeblNMoNcSxsD3WYmdMo94vdsFjo\\\n\tE+ox4bXnuSHu3LFBYdKYcIhzpxMR4lCHrFzlhvi/me1CGEtWrnJD3NhLRcJAycpVbojXZr\\\n\tYLYSxZucoN8crMdiGMJStXuSF+LrNdCGPJylVuiN+QXg4eQimvy9zKX2URz/IKbUPY1vLc\\\n\thlV2dkzH+9gjt4MQRm2QHjl/ntO4ypX4cyyt0D6Eby2VGWCqbxSdKm3Xj21KIdda6T0tw7\\\n\tkdVF3YPiy9NHFjxX7CYNoo5Sc7wJTZnbEKtxToJwyeWxQ4AajUFqNHsKRQX2EwLJFyU1nJ\\\n\tfXJ34J6C/YXJ6x4pL0XUcT7xDXgQO5XuOPTe17gZj5XstK7XHRyDJ3F0HZ2HXlojvbdlde\\\n\tmO69p2vxrzpd+69TWNEfphvZSD+WoIMM28oHwarsK1WFD3YKEzVmEZfi+dRVybJkK8pVk4\\\n\t09bvsdtdO+/TC2VsknZkrJMeXLyIZ/FeUwU0HeIQioujqELvRYhD70WIQ+9FiEPvRYhD7/\\\n\t0fHvIyRu6OJTkAAAAASUVORK5CYII=\\\n\t\")\n\t-- cloud_4@2x.png\n\tR.bg[2].cloud_4_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAAWIAAACoCAYAAADaWOQcAAAMOklEQVR4nO3de+zXVR3H8e\\\n\tdP7oKCCoLITUEylJuXykQltQJvXbzNQZnlJS0vMFeuZWpO29yylO4zMZelkq2823Rqma6G\\\n\tU1DLNPCSBojmBVkR6K8/zu9niL/r93Len8/3+3xsTOZl56VzLw7ncy4tra2tSJLibBUdQJ\\\n\tKanUUsScEsYkkKZhFLUjCLWJKCWcSSFMwilqRgFrEkBbOIJSmYRSxJwSxiSQrWNzqApHcM\\\n\tBHYDJrf9cTwwGtgJ2K7txzCgzxb/3FvAm8A6YC3wCrAKeLbtx0rgsbY/rwJq8dIfKcRWwB\\\n\t7AAcCHgBnAFN5bsrW0ClgO/Al4EHgIeKOO46mHLGIpn52BOcBc4GDSDDfS28BS4C7gDuDP\\\n\tpNm1MrOIpfoaAxwPHAt8MDhLd9YCvwaWAPeSiloZWMRS7fUHjgZOAg4FWmLjVOQFYDFwNW\\\n\tmdWXVkEUu1Mxo4AzgVGBGcpVZaScsW3wHuDs7SsCxiqXqTgK8CJwL9grPU03LgW8CNuGxR\\\n\tUxaxVLnxwEXAfOq726Fo/gp8E7iBNGNWlSxilclg3jvjfBPYlDnHMOAbwJc7yNNMlgILgA\\\n\teig5SdRawi2QWYCryPdKBhHDAWGE7a6tVZ6W0kHVZYS9or+3fSIYangEeBf9QoXwtwMnBp\\\n\tWyYlNwILgRejg5SVRawo/YEPALOBWW0/r9e+2pdJs7f7gfvaft7bWfQU4CfA/jVN1jjWkd\\\n\tbJf4zrx71mESunocAngKOAjwNDgnK8QdoJ8FvgduD1Lv7ePsC5pDXR/vWPVnoPkD5arowO\\\n\tUiYWseqtL3AE8FngcIpXZhtIhfwz4He8e6Y8DvgFzoJ7ax1wFnBNcI7SsIhVLzsCXwJOIV\\\n\t1aUwYvAt8nLUHMIh1oiD6GXGbXAacB66ODFJ1FrFobB3yN9NvTgcFZKvVfijdzL6vHgU8D\\\n\tT0cHKTKLWLUymrSl6/M095YuvdfrpCPf90QHKSqLWNXamvQx6yukfb5SRzYCpwM/jQ5SRB\\\n\taxqjEH+AFp/6/UExeSTiNqMxaxKjEM+B4wLzqISuly0u+iLJ82FnHj6U/60j+ItFbbn/TV\\\n\teh3wH6r/gn0IcC1pTViq1I9IN9VZQPhmXVkNBfYG9gR2Jx0HHku6hLy7ddpW4J/8/z2z50\\\n\tjvmT1M11+2+wDnt/3w0VlV64ukicGC6CBF4Iy4HLYHPgp8BDiIVL718CqpkO8HbgWWkYp7\\\n\tO+CXpNNwUi1dAnw9OkQ0i7i4RpGe1zmGdLggYha6inQE+EDSrFuqh9NJSxVNyyIulvbjwK\\\n\teSZp8uAagZvE26f+S26CBRLOJiGEo6CnwWaa1XajbrSTfw/SU6SASLONZQ0seKc9p+LjWz\\\n\tp0ll/Fp0kNws4hh9SV+NL8ALxqXN3UK6KrWpisk1yPxmkV6NWIQlLG3pSNKtfU3FGXE+Q4\\\n\tDLSF+IJXVuA7AvaX97U7CI89iPdMH4hOAcUlksI5XxxuggObg0UV8twHnAH7CEpd6YTrrR\\\n\tryk4I66fIaQ7GT4VHUQqqQ3ADODJ6CD15oy4PsYAf8QSlqoxALgiOkQOFnHt7Qk8BEyLDi\\\n\tI1gI+RtrM1NJcmamsv4C7clibV0gpgCuktwYbkjLh2ZgD3YglLtTaR9BZiw3JGXBt7APdh\\\n\tCUv18iLpBsB/RwepB2fE1RsN3IElLNXTzqSLsRqSM+LqDCbtjpgeHURqAs8Bk4BN0UFqzR\\\n\tlx5VqAq7GEpVzGA8dFh6gHi7hyC2jQ/ymkAjs7OkA9uDRRmX1JSxL9ooNITWgm6QbDhuGM\\\n\tuPe2Bq7DEpainBodoNYs4t67FB/SlCLNAwZGh6gli7h39gHOjA4hNbltgcOjQ9SSRdxzWw\\\n\tE/xP9mUhEcGx2gliyVnptPmhFLincEMCg6RK1YxD0zCLgkOoSkdwwGZkeHqBWLuGdOI90x\\\n\tLKk45kYHqBX3EXdvAPAsMCo4h6R3exqYHB2iFpwRd28elrBURLsBI6ND1IJF3L0F0QEkdW\\\n\tpWdIBasIi7tj/p6SNJxfTh6AC1YBF37eToAJK6tFd0gFrwY13nBgFrgG2ig0jq1L+AHaJD\\\n\tVMsZcecOwxKWim57GmBrqUXcuU9GB5DUI6XfwmYRd6wPDbRZXGpwu0QHqJZF3LGZNMC6k9\\\n\tQkLOIGNTs6gKQeGxsdoFoWcccOiA4gqcdGRAeolkXcMa+7lMqj9MuIfaMDBBkOTCDdITEC\\\n\tGLrZX2sFRgdkklQZi7gERgEHAfuRTuFM493FK6ncSt9jpf8X6MRU4DjgSGB6cBZJ9TUsOk\\\n\tC1GqmItwVOJN0PMS04iyT1WCMU8U7AucApeCRZUgmVedfEMODbwEpgIZaw1Ky2AS4ChkQH\\\n\tqVQZb19rIS0/XEra/SBJAKuA84Bro4P0VtmKeCKwGA9cSOrcnaQHf5+PDtJTZVqaOBFYhi\\\n\tUsqWtzgMeAY6KD9FQZingAcBVwDTA4NoqkktgWWAIsAvoFZ+lW0ZcmhgO/Ib0dJ0mVuJs0\\\n\tO349OkhnilzEY4B7gUnRQSSV3hOkJYsXooN0pKhFPIlUwqV/AkVSYawgXXFbuDIuYhGPAe\\\n\t4Hdo0OIqnhrABmAaujg2yuaB/rhgJ3YQlLqo+JwO0U7ABYkYq4D3ATMCU6iKSGNhO4kdQ5\\\n\thVCkIr4MOCQ6hKSmMAe4IDpEu6KsER8J3BwdQlLTmUs6iReqCEU8Engc742QlN8aYA/glc\\\n\tgQRViaWIQlLCnGSODK6BDRM+K5pC+YkhTpUOCeqMEji7gfaUliclQASWrzOGk3xaaIwSOX\\\n\tJr6AJSypGPYkdVKIqBlxf9LLGjtHDC5JHXiedOAj+6w4akb8GSxhScUyDpgfMXDUjPgJPE\\\n\tEnqXiWATNyDxoxIz4AS1hSMU0H9ss9aEQRfy5gTEnqqewf7XIvTQwAXiI9YyJJRfQq6aDH\\\n\txlwD5p4RH4wlLKnYtiPzBWS5i3hu5vEkqRJzcg6Wu4gPzTyeJFVids7Bcq4R7wC8nGswSa\\\n\tpCKzCCTLey5ZwR75NxLEmqRgsZ9xPnLOJpGceSpGpl66ycRfz+jGNJUrWm5hooZxFPyDiW\\\n\tJFVrTK6Bchaxl/xIKpOxuQbKWcQ7ZBxLkqo1MtdAObevhb9SKkm9sAEYmGMgi1iSOteSY5\\\n\tAivOIsSU3NIpakYDmLeEPGsSSpWtk6K2cRZzmzLUk1kq2zchbxmoxjSVK1snVWziJ+PuNY\\\n\tklStbJ2Vs4ifyTiWJFUrW2flLOLlGceSpGpl66ycRfxoxrEkqVrZOivnybq+wGvA4FwDSl\\\n\tKF1gPDgE05Bss5I94EPJhxPEmq1INkKmHIf7LuzszjSVIlsnZV7iK+LfN4klSJrF2Vu4j/\\\n\thrsnJBXbclJXZRNx6c/PA8aUpJ7K3lE5d0202xF4AeiXe2BJ6sZG0lt1L+UcNGJG/BKwJG\\\n\tBcSerOEjKXMMTMiAFmAI9EDCxJXZhJwOGzqIvhHwVuCRpbkjpyC0EngKNmxJB+5XmYTG9C\\\n\tSVIXWoG9CfqdeuRTSY8AiwPHl6R2iwlcLo2cEQOMBJ4knemWpAivAbsT+HhF9OOha4CFwR\\\n\tkkNbeFBL8gFD0jhrRGfDNwRHQQSU3nVuAo0hpxmCIUMcAIYBmwU3QQSU1jFTAdWBsdJHpp\\\n\tot1a4GjSqRZJqreNpM4JL2EoThEDPAScER1CUlM4g9Q5hVCkIga4Crg4OoSkhnYxqWsKoy\\\n\thrxFu6EjgzOoSkhrMIOCs6xJaKNiNudzZwRXQISQ3lClK3FE5Ri7gVOAe4MDiHpMZwIalT\\\n\tCrkEUNSlic3NJ63nDIgOIql0NgAnU/AHKcpQxAD7AL8CxkcHkVQazwHHAEujg3SnqEsTW1\\\n\tpKusP4+uggkkrhelJnFL6EoTxFDOlijhNIv8KtDs4iqZhWkzriBFJnlEKZirjdTaSbki7H\\\n\tk3iSko2kTtid1BGlUpY14s5MBM4nfdDrE5xFUn5vkT7EXQysCM5SsbIXcbtdSFtTTgK2Cc\\\n\t4iqf7WkS5z/y7wTHCWqjVKEbcbDBwPzANmU86lF0kdexu4D7gOuAFYH5qmhhqtiDe3I3AY\\\n\tMBc4EBgVG0dSBVYDvwfuAG4n4Kn7HBq5iLe0K+nB0qnAZGAC6amm4cC2cbGkpvcG8DLplY\\\n\txngaeAx0hvyK2Mi5VPMxWxJBWSa6iSFMwilqRgFrEkBbOIJSmYRSxJwSxiSQpmEUtSMItY\\\n\tkoJZxJIUzCKWpGAWsSQF+x/RmkrWbHB7LQAAAABJRU5ErkJggg==\\\n\t\")\n\n\tR.chain = {[1]={}, [2]={}}\n\n\t-- a.png\n\tR.chain[1].a_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAADj0lEQVRIic2WTWwUZRjHf/\\\n\tOxM/vRtSnttgsYSttN2yUBWqQKWC1BE6iGBj3IAcHoRcWLiRxMTCTiyejRqCeNPejBkxSQ\\\n\tFg6GxEjSkLYgEmDXrwjFOmtry352Zl4Pg4WZnd2uhhD+yVze93me3zPvx/O8khCCeyn5nt\\\n\tLuZ2ALcAg4BRiAuPUZwGngDSBeSyBpmT2MAkeAVxAiaF6exkzNYGduIiwb+YEQakcz6rrV\\\n\tSLpaAj4C3gYW/g9wHfC1KJmJwvEpSscuYs/k/YPUa2hPdxMa2oQU0dPAbuDSfwEmgTPW9b\\\n\tmm7AdjWFdnKyXlkry6jsihJ1ATcQMYAH6sBRgFJqxrsx0Lbx1FZAo1wZYChlXq3n0KtXNl\\\n\tCngImHcl5eNzROQXO7Lvj1aEac8kqR9+HmVjc9mcyJlk3zuFPZdLAO94573AOHCwMDKBlf\\\n\t7bF6asjxF5oR+5IULw2V5fG3smT/7LswCv4pzwisB9omhqxZGypV9S+KVtoMhg2Wib1iK3\\\n\t1/vaLY6lsTNZHdhfDTi4eP43xFzRN4jatwo1EcdM3SA/MgmANpDwtRWmTWk8DbCzGrDHvH\\\n\tLDNwBAcGgDAIWjUyx+ewUA/bEukCVfe+tnA8C17l5go/1XztdZSTQQ6GlFLBRQHlxBYGs7\\\n\ttjGPHIui9rb4+thGFqDxzjG1zMq0fJ21XUkApGiQ0HN97rn+BOY5n5Ux7bIhLzAjx+oavU\\\n\tZycwh9oBtRNMl9egbsW3c3FCByoB/t0U7yw+OIWffeS3UaQKYacEJZ0/SkFxjc34cUDFAY\\\n\tvUDpxFV3xokW9Me70Aa7KH5x3jWntDUBTLqS98Qe03pbkQLKbafOFejbk4iFAsWvJvGqeO\\\n\tyCA24vLwLa5rUA39w55i1tLcCv2Q9P66XRtGMQVtH3bsT8YRpz/HpZUAAl2Yg9fdN1ndTN\\\n\tK4keHioBrcDSBnv/8A/g49DeR5CiAcApVYXPzlWEAViXMi6YpMqED2wBp125TpNfLT0sx6\\\n\tKp8OvbK96v5RR8eQtKW3Mapze65AecB/ZoD7cbkTd3IIXLb04lSYpM6LWtBHetN3B6Ylkj\\\n\trtaAk8CI9ftsR+7z7zDPXqsKUzbECL+4DTURTwF7gIu+SdX4xDho/fKnVvo+jfmTgcjkQI\\\n\tDUFEZZ04DW14bavaoIfIKzjPOVAi4H/FdxYB8wCPRwu1xlgCngJDCMc+iqqlbgXdN9+y69\\\n\ta/oHeH87HFWBERQAAAAASUVORK5CYII=\\\n\t\")\n\t-- a@2x.png\n\tR.chain[2].a_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAH3ElEQVRoge2aXWwVxxXHf7\\\n\tO7d++XDcQOBgzYOMHUNg00JHyHD4coLYSEVn1paJq0iCZqm1YofUirfqjNQ6u+oJY0ahu5\\\n\tfWgDEZEipfBQERRaaMCQNnGggCDU2MSNqQMmYPD1/dqdPqz3foB39861rYaIv3SlmdkzZ8\\\n\t5/78zsmXNGSCn5JEP7fxsw3rhF8GbHLYI3O4xx0jsBaAVWAXcBjcBkIDb8PAv0AN3A20A7\\\n\t8AZwZcwtkVKO1U+TUn5eSrlLSpmR6khJKXdLKTcM6xoTu8QYfAcF8BXge0Czx1vEHkgikx\\\n\tmng66hTYqB4blC3gOeA3YAozJwtARbgBeB5YWNcihN5mgPmWM9WP++iN19BTmULR5Y1xAz\\\n\tK9DnTCbUPA1z0R2ICdHr9bcDm4GT5Ro4GoKbgeeBiNtg9V4mubuDzP4u5NWMmiG6hrFsBp\\\n\tH18zBaphc+SgJbgN+VY2Q5BAWwDXjabZADQyS2t5PZ04m07HLsKIKxuJbY48vQ66oLm7cB\\\n\tzwCWkrGKBHXgj8BGtyH9zy4Szx9AXkqq6Ak2zNAIP3EP0Q13gxBu8w7gMRTWpSrBXwHfcS\\\n\ttDO4+QfOldlf7KCK2sI/70GkTUdJt+DXy71P4qBJ8CfguAlAy2HSC965SCqeVDn19D5Q8e\\\n\tKiT5daCtlL6lEmzB+SBHABIvt5PacawMU8uHsbiWymfXQUgHZ+O5FzgR1K8UV03gvK0IQP\\\n\trgmbLJmQ9/ioltj1L5i/Vo9ROU+maP9JLY3u5WIzi7qvDu4aAUghuBpQD2h1dJ/OZNJcNc\\\n\thFbUEX9yNdqUCRgt04ltWqqsI/XqCTId59zqchwHwxdBBDXgx24lsf0Q8kpa2TBtWpz4N1\\\n\tqL2kILZqHPvV1ZV6LtYM4jAr5PAIcggg8DcwCy750ns69b2SCA6KaliMrIDe2R9Xcp67Lf\\\n\tv0pqb27pNQGP+MkHEdzsFpK7jyobA2AsmY655M4Rn5mL70SrucE9C0Rq93HI5hyKTX6yfg\\\n\tQnAg8C2B8NkjnwvrIhCEH00UVFTXb/YL4S0gm1zlZWa58fJN3R7VbX4hzPRoQfwTWACZA+\\\n\t3Am2us8aum8mxh01ubp17iLXtu4pkgmvalLWC5A+1OkWDZyz54jwI5jb5jJHe8oyIvLI/K\\\n\tJ64qXDWMcuYHVdyLXpM6vQm6uv7xqI7Du9kPd7V3nJ+RG8xy1YJy/4iI0MveV2jKbavEFn\\\n\tPyR7+AMAUn8/XSRrrlCfpvJSEut8LgDguVv5EZwFzpqRH6WUDQivbSmqJ//ckStnDnQVvn\\\n\t3M5Y0IXT08ZPX0u8VGLxk/rTMB7AvqYRJRHcFclh/T7h8kW7BJ2X0JMsf/kzeiKo6+cJry\\\n\tOHb/Nbc42UvGL+hkAMi00vELAPOBRoSZV61Vx5m482uQKjjVX/ePmSsac1O4VMjB3MyKec\\\n\tkEzgs5pOa5CF0j8tkbl4QwDURlJP+LmUXPzYUNiHhIaaxS4EcwASAqwkoKjdX1aJMrlQ0R\\\n\tUZPQfXWKnXLmZ71E/KboBaBeq7jRxfKEJpwTeAHS73Q7U1PLO/7CNCCko8VN9Ib8dzL8QA\\\n\tvpPZ2UCq0qNzM9v2N+BM8A9drUSQhdKynWElo9C70hv96tnksM/uR18DhzCl1jwu83olXH\\\n\tHWOaatGbqrFO9Y8ofz20mpwD0+0p49P/XwAibKA1TAwcTEQNol9aXNSW3NXhSQ5AWjapN4\\\n\trPrJEN8wLHAkAThV7S255iPir2uwX901MDxwt/+W70afkXYfVeJrP3bGC/9N7TkMnv1Oby\\\n\txpIOw/qcqsL9od1Lzo/g3xhevObCWf6DNVcTfegzRW1DO98qaVrb/02Q2l8Q2xGC0L0zAv\\\n\tuFFta7xTROXmNE+BG8AvwFIDR3Btq0uKegMb+2KAyf/sdZMvu6Ao10kXztGDI9vBFKSbYz\\\n\tYA0Kgblyjlt7HZ+kTdB38A8A6Brm50ZOOwBk3uzC6hsAwOobYOjFgwFqi2GfG+Dqc7sZ2n\\\n\tmEgR+9hvVun698aGUd+tTccvCNrgVF1TScyFWTTKS58s2Xkf0jB3iFriFmVCA/uIbMjj66\\\n\t7QkhqNy6AWP2FHCSNM2A54BB/6AN/BxAxEyiTyzyFJSWjX1uYHzJAeba2S45cDJQvgOW4s\\\n\tL/CTgIEF7dhLFkeoD4+EGbXkHssWVutR0nlO/fpwS9EieqnUQI4t+6H63We8MZL4iwTnxL\\\n\tqxu8SuLEiwLDDKUewk4wnA/QJsWo+OE6RJWCCzdaaILYd1cXHqC3UGLOUOWU2Qa8AE6Yof\\\n\tKn69CmeJ5SxgzC0Ig/24q5NHfq34ZCrlA1u6ThrMmNAHbfANe27sU6eVFFR+mD1USJPbOG\\\n\t0Nzcut8BPI5CjrCcBKgObMVNo2UsEq8cIf3qSWRG/XDshdD9DcS+uhztttx6f2F4TKVtej\\\n\tQp7KeAXzKclLF6LzO08y2y+8+NKstrLJhK5IsLCM2b6TYlcdZ/Semy6zEWlxDaKAgxWn0D\\\n\tpP96kvShLuyugZKUaDVRjMV1hFubMBqLHPtDwJOUkCbzwlhdI9mIk6SZU/jA7r9G9tR5rN\\\n\t7L2BevOlM4lUVUhBGVEfQZt2E0TEavvyEJcxr4Gc56H52BY3wRaMPwZZ5UGReBMtK5RPSF\\\n\tj9tFoJEwESf0vxQngDwLJwzpRhASOCGRM8Bx4ACwj3G4yjVeBD82+MTfNrxF8GbHLYI3O/\\\n\t4HzN2+0cWu1vEAAAAASUVORK5CYII=\\\n\t\")\n\t-- e.png\n\tR.chain[1].e_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAADrElEQVRIic2WW2hcVRSGv3\\\n\tOZk8wtJjhpUk1bk6a1sZhqsVJFLFpQIxIRivhQBd+kogQvCIooFJ8K9cHQF5+kbz6UqkGJ\\\n\tBEVF0ZRaBkxtNZOml9w6k06ayXQm55y9tw+niXPOmWlSLaU/zMu/11r/WmfP3v/WlFLcTO\\\n\tg3Ve1WFmwF3gaGgCygrv6yV7k3gZbVFNJW2MMk8CHwGq6MOKcmEeM5ZG4BJSV6QxSzoxlz\\\n\taxtanWkDh4D3gYX/IrgV+EItuhvLX6exB0aQF0vVizTWYfXcTbR3O1qibgx4BvjzegS7gB\\\n\t/F1OVU8cAg4u98raZ80O9MEH9rN2Znaw7YBZxcjWACSIuJfEfhvS9Rs+VViS0XjJkk9j+N\\\n\tuXltBrgfKKwk+LEqOX2Fd48gRud83Zv3tqKkgpKDKjvI6QXk+UIwH705SvLgHvTG2EG8P1\\\n\tRNwRbgfOnzY5Hy4d99RRoO7cFYd3uouMwXKX7yHe6xSR9v9Wwivu9xG9gATC83E8jfq0pO\\\n\tZPGrkVBhZbsA2L9lWBwawR7OICby6E1xtKQVine+zSBnixbwYiVvBuJ6nJELqLnFsGDJ8Q\\\n\tR/+Avnp3PLvBYxUI4IxwuJPZyhvqf7SeBArQm3uaenQsk+WAZa9N8+q4ktQYznALZVcsEJ\\\n\tUyp/pWqyVu+FJvqegD5QJRsxNYecnKN8NI04fSmUI7NFgFQlF7raanWsyt4eipl55GwRLW\\\n\tJidqzBemQzRteaqjkIGaKCE+b05mQqFAWognceywMnsI+eQjN0tHUJtNvqkX/kquppcQvA\\\n\ttxicMG20NVVNdkdnAKjbtQUtZqKERI7PI9IXUVUmATDaUwDpSi444WDkvg27NVNHuf4izv\\\n\tcZ1LPbMTtbaOh/Hvv4GWS2AK5EnL2Ee3yaIKwddwF8U8kFD34rcLbYP2TZg5lwx/ekiL/y\\\n\tKEZ7c2B8Sf65T32U+cBakh/02sB6YKbWhNNAf/SFnW84v5xDFRzfojiZY/71IxibmtDXN6\\\n\tKnEmgREzFz2RenmTqxl3aCZ1czvrUqd2kSOGEPj20sfjQE8vrfPNFXH6L+qe4xvDPo88Zq\\\n\tjl8Aeq0HO3Lxdx5DiwU/Qm1ohr4klsPzxJARX8uAu4ABcSHfceWzn3F/nbimmNHdTOzlhz\\\n\tE7WzNAL1W8cCVB8LxxP7BPnMla9vAY7mgWlS+BK9BakhhtjVg72jG33GED/XhPkrBnrVJw\\\n\tCS3AXqAHb1+WLocc3jkbBA5TYUP/V/CG4ZZ9l94w/AMIA3oLRCGsQwAAAABJRU5ErkJggg\\\n\t==\\\n\t\")\n\t-- e@2x.png\n\tR.chain[2].e_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAH2klEQVRoge2ae4xVRx3HPz\\\n\tPnnPvYe/cur12WLQu7FBrYllJgC6VgTZfGKqBNaku0sSYkbRq1GEhMmviI1uh/YjVg1JTE\\\n\tpDWgRIlajAGxKLUFAWlB3UIXlvdjW3bZ133fc8Y/zj2Xvbt7zz3n7qKl4ZtsMr85v5n5fe\\\n\t/szPzm9xuhlOKjDPn/NuBm4zbBWx23Cd7q0G9SvzHgEWA5sAC4E5gKhPPfM8BF4BxwBDgI\\\n\t7AX6x90SpdR4/elKqceUUq8ppbLKP9L5tp9WSsnxskuMwzkogbXA97BnalRYfUlUKguA0C\\\n\tWypgr0kiukA/g28CtgTAaOlWAL8DLw4NBKlcyQPX6B7LELmKeuYZ3qRWXN4oE1iWiMos2Z\\\n\tgtHSgNHajJxQNbz/fwDrgHcrNXAsBJ8BtgBBp8K83Etq1ztk93WiBrP+epMCY3kjwdXzMe\\\n\t6ePvRLCtgA/LwSIyshKIDNwFecCqsvSXLbAbK7T6NMqxI7iqAvaaDq6QfQmmqHVm8GNgLm\\\n\t6K1KGOuToAa8AjzlVGQOd5L4yRuo7pSffsobZmgEn15I+DMLQSus1W3AF/CxLv0S3Aw87w\\\n\tjJHYdIvfq2n/a+YTw0g8jzKxHhgFO1BVjvtb0fgs8BPwNAKeJb95P5wwkfplYO7d46qr+5\\\n\teijJZ4GtXtp6JTgPOAqEABLbD5DedrwCUyuHfv80qr++xjla0sAioL1cOy+umgB+QZ5c5s\\\n\t2O/zk5gNzhKyRefdMRg9jHU1n7vbhqnweWAlgfDJD46d/dtYUg+EQLxvxGMDSwLFQyCzkL\\\n\tlclh9SexugdR3XHMM9exLgx4MMFGemc7xsIZGPfNBPvsXYvtDJQ2p8y/qAROArMBBl/aTf\\\n\tb1s65GGCsaib6wyrPR1vU4uRNXSO34J+ap3rL6cnqU2A/XIsIGwCns5ZNzI+CGNeTJ5d67\\\n\tUpYcgLF0VlmdIgMmRggsm01kw0pP+tbFQdJ7/+OIs4HVrv2X6e9Zp5Da5W3dWT2DnvSGQ0\\\n\tRCnnXTv/8X5AoOxTNuum5rsAb4BIDVHSe3/7ynwVV/skhO/ek46d8eA0MiqoOImhBySgTt\\\n\tjonod01Fb65DKUVy5xFP/QNYXQkyR88QWHInwKPY17NRr1puBFcCAbC9Fc8u2PAlbVpYXY\\\n\tm8MHJ2hSZBF6i0Lw+MzIFOh6CBfffcOZqe27/oMqeQfdvb7FUCZVq+yQHkjlyCGz/6g6X0\\\n\t3AgudgrmyWueB87vbgWojH/jvUD1pjGv9jnifaX03AjOBLB64v4caVHcpZwQRps7GdkUQ1\\\n\tSNb4TEPFf44UtetN1GnA5gdXs/iAEIaEVisK2FYFtLQVYDKcwP+rEu92Je7sW82od1qR/z\\\n\tRDdY/q5uVk/cKU4tpeNGMAAUwgxeIQzN/Xt1CL06BLPqiuozhzuJf/fPvsZS8bRTDJfSKe\\\n\tvLqaQ/gsNDE15hLJhRUbtycJvBJBAWVQEXlZFQqUyRnDtzDfN0FyISRE6sQk6uRtZWj2iX\\\n\teavD1zgAyML8ZEqpuBHsAppkzYhAkCtUf/GGZL3fR+LHxQ66COvIGTFkfTWyNorVnyK376\\\n\tyvcQDkxIJtF0vpuBE8DTTJuhhCk54Peutq8aY0LK4CgErmME/2YJ7s8dRnKci6mFM8V1LH\\\n\tpf0xABHUkbNqPA9qvtc99ABGmxpDW1Dn0qJCCIF+Y6Mq6ee5ESzcLrV76j2Pq/rtmOhQRL\\\n\t78MLIh4rkPL9DmTkJECxHLg6X03AjuBbIAgdYmX4On/1Icp9UaJhDb9CShdYvRWqaUPUq8\\\n\twGid6RQzeVtHhdsa7Ad2A2uMu6cjGyJYl+Mu6jeQ3X+ezEOdBJbcuBuKaJDw462EH2+FnI\\\n\tXVl0ANJCF/4TZ74qR+dwzzna7yAwhB4GN3OdIeXJI25c5BO3KlSQKPzis/sAOlSGzaR+bo\\\n\t2dG/6xI5OYrWVIvWXIfWXEdgcTPR9d4uvcaKRrRphX3hZTfdcgT/iB0WIPTJ+ci6kg7DCK\\\n\thEjvh39jC4eS/mBW+75ZA15aIkCH12kSN1ALtc1T2EDT8HbAdI//VdEpv2lzdiFGhzJqLf\\\n\tOw2tuRatvgY5IYKoCoAuEeEAajBNYvvBsrHWwKo5RL7U5ohPObaVgheCEniD/J1r4Pu7yB\\\n\t285IXTuEM2RIj94AlEdQjszNMyyoTxvcRFLezYTBogun4l8o7oGE31DxHUiGxsc8ilsNNq\\\n\tnmbHC9rJ5yRELEz0G59CTPIeJBozpKBq48fR5zY4NRvwmDP08whhK3biA61xEtUvrvK16V\\\n\tQKoUsiLzxMYPkcp2ozPnKFfrNLAvgl+fSZ9f4Ag5v2YLZ7D2n4gawLE/naI+jzCjO3Dfgi\\\n\tPnKElSRANeAlnBRW1iTxm0NkdvwblRt78tOB0dZM1boVQ9PaW4Cv4jNnP5YU9nPAj8gnZc\\\n\tzLvSR/fYjc386NKcurL6on9ORijHsKaew09vr3lC4bjrE+QpiHnXla6lRYXf2kX28ne/g8\\\n\tZsd1T53I+ir0+xsJts1Fn13k2L+FvYOXTZOVwng8IxHYzsCLwJyhH6xrg+Q6rmJeuo7VPQ\\\n\thZE5XKISIBRCxkR7eba9FmTAYhhjY9BXwL2IF9TFWOcXwIJPOPeF7LP+rxi0y+7WPKflT0\\\n\toXkINBqcp1wPAK3YMdbp5CN12PGeLuyowTHsu+dNecp1swh+aPCRf214m+CtjtsEb3X8F5\\\n\tLt7GKi5gIEAAAAAElFTkSuQmCC\\\n\t\")\n\t-- g.png\n\tR.chain[1].g_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAADvElEQVRIidWWTUxcVRTHf/\\\n\td9DcwM00FomYYAQ9uhbdIUUWNrmtqA2pguqk3UBYp148LEdKELv5aaNHFRTWpMTGy0lcYY\\\n\tMW60Ma0BGrW18hUhEW0tjICKM1CgwLxh3rx3XQzFecMwUGOaepK3+Z/zzu+ee+479wkpJb\\\n\tfSlFtKu52BYeA1oAOYAOTiMwF0Aq8uxqxqYpUehoCjQIs0LdXqH8EeiuNMJUCA8BmoNeUY\\\n\tDTWIQLENtAIvAX/9G+A+4FNnOrHebOvCOvcrMpHOn0RT0JpqKX7iXtSKwATwGHD+ZoAPAm\\\n\tes/lF9/lg7cjK50qLcyfw63uf3YuyJWMDDQPtagGGgz+qNBudfP4dMO2uCZZv3hfvxNG6f\\\n\tBhqAaLYv36E57sRmg/PHOpbBhK6i3lmB/tAm9MYwwq/nBZrHvyM9FAsC7+T6ciu8G+iee+\\\n\tssVvuwK1Dfvxlv830oZb4lLdF6gYVPBvJC1foNBN44dCNn7w1dy4l72pmYw+qIukTjQATf\\\n\tc00A2NE4Vv8Y0nawOq/mhQHYP8ZIXxlHi4QOFwI2prqHIatq4dfxtuwBYKFzEPPtb5H22v\\\n\tqa6h5Gi4SasrXcHm61RyZdglpfgfB7kEkL8/3v1wwDcP6YAajL1nIrNOT8gktQSooAsMcm\\\n\tkTMplNoA2tYNGaeuogR9iBIPWDbpn8exvhlZeldeXwAwCgFTwudxBUjTAkCoKgC+I41oW0\\\n\tL5SzoI0z0n/hkQmgKQKgS8rIbW7cgW7MEY2A5qVRlKpR/z4y607SFEkY6cT1H06F0Ij0bi\\\n\t9AWcawnXNFI2BgB+yc6X28N2vaHGJTgxk9Slq6Ap+F58AGd0huTJXsz3LpFs7SN9+c/Mwo\\\n\tYnsc66T61eXwWZgb9ihSfVqjuOqDvXY/fHl0TzxEW0SAgtEmLdu82kozFwJMJXhFpZijNj\\\n\tYv8UdyVSKv0YDWGAU4Uq7AW+9D61GxThqnL25c9Z6BwEKdG2hNDqNqJWlmL/PsXc0TPIWc\\\n\tuVqPjwLtCUL5CyJ1vPN0trgV7zs+5g8sOeXB/Cq6HUlSGKNJzxWZzfZl3fLYBxcBu+Z/fl\\\n\tnaUr3RZNwFdmW5eePNW3LGEhMx7Zhu+ZvRaacgD4etmCV7kP26yB0XLzg4vYV6YKgpTqEo\\\n\tpbdmHs3hwHHseR57PbshYgQAXwJlI+aQ2MqakfhrCHryGvJ8FyEOVe1OpSjHvC6DurbTTl\\\n\tI+AVYHylhKsBM9spRBhoBvYDO4CyRe8kMEBm604jZRSxvKqbA/7Hdtv+Jv5/gX8Djf96T7\\\n\tNLXZQAAAAASUVORK5CYII=\\\n\t\")\n\t-- g@2x.png\n\tR.chain[2].g_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAIJ0lEQVRoge2aWZBU1RnHf+\\\n\tfeXuf2DMyAs7AYlgEGnLBETQVBEkFMjKIVLYwlSbRSZVW0ECV5yYsVH5JKkVS5lSmtSpFo\\\n\tMDFWEhcCWAYTDMNmRjZFBhhHBodtmBmYpffue08ebndPd9F36Z4hAYv/073nfuec//+e7T\\\n\tvfOUJKyRcZyv+bwKXGVYFXOq4KvNLhuUTl1gJLgcXAHKARGA8EM9/TwCngBHAQ2A38Ezg3\\\n\t2kTEKC4TQWAV8H1gSRn5DWAn8ArwJyA2GqRGQ2AF8ATwY2BcMQPj3BDGQAQZTYIiEKqCqA\\\n\tmhjguBVy2WpRd4FniaEQodqcDvZIhcm5+of95H8oPPSB86jX6sDxlOFa/co6DMqsHTVIv3\\\n\txml4mxpALZgWTgKrgbfLJViuwCDwHPBwLiVtkNjdTmLTIfTDvWWRUSaG8N0+m8Cy6xAhf/\\\n\t6n9cBjlNGa5Qi8BtgEfDWbkDpwgtjLu9E7BkotqzipcQEC9y8gsLw5v0X/A9wFdJdUVokC\\\n\t64EdwHQAGUsRfWUHyc3HSinDNTzX16M9uhSltjKb1AHcRAmzbSkCxwItQDOA0RchvO4d9L\\\n\tY+94zLgBgfIPTT2/DMasgmHQIWAYNu8rtd6AXwB7LieoYYevLtSy4OQPbGCT+5hdTHXdmk\\\n\tZuDVDCdHuBX4OLACQA7GCP9iM0bXUKlcy4aMpYn8civ68Z5s0gpgjZu8brroZKAN0JCS8K\\\n\t/eIbWjyynPJYEyuZKqdfcgKgMAEczW7LTL48ZVWwdoAPH3PilJnKjy4VnQgGdmHUqNhtD8\\\n\tyHgKYyBKclt7ycuJ0TVEdMMutEeXkuH0FPCQLQeHFmwEjgCqMRBjcPXryP6EIxGlQcO/cj\\\n\t7+xTMRQV9xsucjDDz4qmNZxVD56xV4miYASExf94glF4ey1gAqQGLLQVfivEunUPXMSgLL\\\n\tmy3FgenFlIvYa625YoAf2dna1aIC9wPIeIrE5jbHin23zyC09psIzW9rJyMJIutbHMuzQn\\\n\trfWfTjuaXwe9gMNbsxuATTayG1txM5kLStVJ1Vg/bw1y9K17vOE9+4n/TBM8hzMQh5IJJG\\\n\tpg0HGfaIbzuCNrUWTAf/JmB7MTs7gTm2ydbjjhUGH1p40c4gsf0osedakEl9ONHhR7lFur\\\n\tULfph7vRULgXZdNOdr6p/Yu39qYzXe5kmFBNpOE3t6e6G4UYRxMozenXNmFljZ2QlsBDD6\\\n\toxhno7aVeeY1XJQW/f0upD6ybugE/URumZltZWMncAqA0ePs8qnT6wre0x3d/xM3zujJeV\\\n\tP1VjZ2Y9AL5o7BCUpl4ayZbjvrmCcfosKDqA4gKrzIeBp5IW65Sc6HDMezj5qVjaMnI2Mu\\\n\tJgWlsCMYvcOtLrwq/lXz8cyoRcZSyGgS4VURVUGUmhBKdcXFy4qU6Kf7ib2xl9Q/Opzrt4\\\n\tGdwAigiVDAsZC8P5kpdXg29d0zh+C9N5TGSgjUidWEHllK/54u5KDFTx7+sZbNbTcGzwIo\\\n\tYyoc+ehnCnfy6qTq4ecJYx3zW0IAqvWuSLkmlH3stLSxKb4NQK0fgyge+cohfaxwGfHOvT\\\n\taXJ/FuG3pnDxSZUeVgDFJ5y4iUJFs/Qz/eg9EbJvraHuQFa/dQrR+TffzUysauix4A7sSj\\\n\toDTVoH/cY2mof3gGORTPbmNQajS832ok+fej6Id7GXzsDTNcWOVDaF5kNGV6Roak6qX7UC\\\n\tdmWlwIUh+dJPKWs1sofCqq6cmAGa8pCrsW3Jp98M6baFuZTOokthWSqli1EHXGcFfFkMj+\\\n\tBMapsNkqhrmLSe5sLyQ0vhI3UOfXIfy59vm3lZ2dwF3AeQDfopmOFcb/9hEyPNydhOan8q\\\n\tkVeJdPA2E9joy+cMG7HLJ3KrLwLZqefezBjBUVhV0XTQMbgMfVSdV4FtSR3m/tssnzcaIv\\\n\tt6CtvjWXJqqChNYsR7/3Aum20xgXombL+VRE0IcyTsM7tyBmTHrfKUdxotqP72uN2dc/Z7\\\n\tiWLBDgJcw9oQisvJ7w/i22xsl3O1BqxxC878aCdHVi9fA4s0Hi/Tb09guOdv475iAqfAA6\\\n\t8LydrdOu8whmK+L98mQ8Cyc5mEN8wz7Cz281Z8gSkDpwgtiLuxztlAkagbvmZ1//gs0MCu\\\n\t6CTlMwY5Ga0T3I4Nq/Ioec3ShR7cd/5xz835idH7i9CHr3IPGN+0luOpqbeOyg/ew2fDdM\\\n\tBYgCTYBtkMht4PcJ4BmA5AcdRH7+nps8mRoEalMN6rRxKLWVCJ8HqRsYPUPo7b3oR/pcCQ\\\n\tPwr7yOih8szr6uxTz4sa/epUCBecKzAiD25l7iv/vQFanRgveWKYTWLAczlrMJ85zCkXwp\\\n\tofsxmOcSzQCxt/YRX99qn2OU4L1lCtrqZQifB8zhsgRwno0o/fClDvMUdjpAouUYsRdakF\\\n\tHLWXpkEAL/d5upeGBhdi3tAG4GzrguoozjszpgI5mQhn66n8iL76MfKOlUyxHKpBAVj9yc\\\n\tv062AndgLuyuMZID0BfIhn2kJLmzndjrezE6XR36WBOqCeC/u5nAt+ciAt5s8m8xJzp3bk\\\n\t5+eSM8wr4b+A1gOqtSktzXSXL7MdJ7TrrvuorA85V6fIum41s0ExHMCfscU9ib5RIcjUsI\\\n\tQeAnGSK5SwgylkI/fo5UezfGmQGMvggkdZAS/B5EpR+1YSzq1PF4ZzXkdiIZ9GFeQHiWMl\\\n\totH6N9jeQB4EHMA8pyYvPbMT2nP3IZXSMphlpgGbAQmAd8CbMbZ33fGOZVkU+Bw5jLz7+4\\\n\tzC8CXZb4wt9VuyrwSsdVgVc6rgq80vFfbDnjk7U4d3EAAAAASUVORK5CYII=\\\n\t\")\n\t-- m.png\n\tR.chain[1].m_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAADkUlEQVRIic2WXWwUVRTHf3\\\n\tdmdva7RLst21Zql1ZsqxBoKvKRCOqDAhF50wRNNCFR8UGMEh+MEjE+GI36pM8SP2J8MAoG\\\n\tLYkPJoQSTFpNCrHtVjSUQrtrW7a70935uD5srZ2d6W4lhPBP5mHOuff+zr33zDkjpJTcTC\\\n\tk3lXYrA1cDh4FTQAaQC09mwfYKkFzJQqLGHdYBbwEvIGXQ+n0Ca3QSJzuHtB2UujBaeyNa\\\n\tdwsiqJWAj4E3gdz1ALuBb2XJ6pj//ldKJ4ZwJg3/RVbp6Hs6Ce/tQUSDaeAx4ML/AXYBP9\\\n\tuXZxL59/uwR6aXC8olpSVG9NWH0TqSGWAHcH4lwDgwYI9Pt+de/w6ZnV8RbHHBiEbs7d1o\\\n\t65pGgR4qjtcvaY5Kw2zPv/ejC6Y0RQk+cS+iTq8KlAWL/LuncGYKHcDRSn8lMAkcnD8+gJ\\\n\t2edTnCB7YReWo74QNbyjvRFGLv7CZyeKcH6kwaGF/2AzxPOcOXBe6XRUsvHncfvdIcRd+8\\\n\tFoDgzk7U7gSBPesIbFhD8IG7UVrjHqjZl8aZNULA09WAu8zf/kLOFF1GbX35E5NzRRCCyD\\\n\tNbCe/tWfQHetd4gNJyMM+NATxSDbjRGr7imaysXgWA8c0vOJM5tK5mlMY40igtBHSHZw6A\\\n\tNXIVYFM1YL3zd8EzUYQDADiZOQpfnFm0G1+dBdshcE8LQvPmn5PJA9RXA4Jl+0YLgKpg/n\\\n\tQRc/BP7IlZSieHsYavIMI6am+Td7zleExaxXtWaYjVe0YtSKgKSMncGz8s2kpnx9C6mtHv\\\n\tT2H1j7vHx3SA7FJb5Q4H1NaEByQL5bsiVBkfmGcugpTo2+9C3B5y+dRUAmCwGrBP33QnIq\\\n\tBWEMvVSCg+93Q5T+n0CCKsE3rSlR/ovW0AJ6sBj4l4qBh4qM29i8FxzKFLWMNTHiCA8dk5\\\n\t7Al3odB6m1DbGkrA50vtfrX0Q2cqd+jaS18jc6YvoJaEphD/4HHUVONHwMtLfX619IjSEB\\\n\t+NHNoBirguYOi5LaipxjTl3uiSH/AasE/f3J6JvvYgIuJNlOUkVIXwi1sJPbo+Q7knehpx\\\n\ttQbcBZywL02vLXx62pPylVI3NBB5dhtaR3IU2AcM+QZV4xcjTrnFHLT/mNJL/WmssQwyWw\\\n\tApEYkoautt6Pel0Dqbi8AnwBHKp+SrWsB/lQT2A7uAjfxXrrLAANAHHAOu1lpopcAbplv2\\\n\tv/SG6R/27zmuL3E50QAAAABJRU5ErkJggg==\\\n\t\")\n\t-- m@2x.png\n\tR.chain[2].m_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAH/klEQVRoge2aaXBVZxnHf+\\\n\t855557c29CAkIMWUGaNCRsJh22KGVRRqCVOnXGkUGxiqPW4mD9UJ2Oy/jFGT/gSNvROti6\\\n\tQRWXD8VlFKUlU0ixVqQ0gCxDIAKlkJClufu9rx/OPTd3ydmyaOnwn7kz533P8z7LPed53u\\\n\tc8zyuklLyTofy/FZhq3DHwdscdA293aFPEtxxYDdwLLAQagVlAMHM/CfQCPcCrwFHgEDA4\\\n\t6ZpIKSfrp0gpH5BSPi+lTEjviEkpD0gpN2d4TYpeYhL2QQF8Avga0GzxL5IeiiKjCWOBqq\\\n\tBUBEGz9JCzwLeBfcCEFJyoga3A00BH7qSMxEmc6CXxWi+p8zdJ9wwiI8l8waqCqCtFbZqF\\\n\tb/5s9KXvQUwrKeTfBWwHTo1XwYkYuB14AgiYE6mrA0QPHCdx+CJyOOFNEVVBW1lL4L5FaC\\\n\t01ubeiwE6MP9IzxmOgAHYDj5gTcihCeG8XiT9fQKbS49EjD9qyaoLbOlDrZuRO7wYeBVKe\\\n\tlPVooAr8DNhiTsT/cZHwE53I/qgXPs6KaQr+be2UbH4vCGFO7wO24sEvvRr4feBL5iDyq2\\\n\tNEf/EvL+s9w7eqntAj6xAlujn1JLDD7XovBn4O+CEAUjKyp5P482c8qDp+qIsrKXt8U66R\\\n\tnwX2uFnr1sAWjA05ABB+rovYvtfGoer4oS2rpuyxjeBTwQg87biIrm5SNYHxbwUA4kfO/c\\\n\t+NA0geu0p4b5c5DAA/yuhmCzcGbgFWAKTfHCb8g5ccF+ibmqjY/xDlz2xBa6tyIcIdYr/t\\\n\tJnH8kjnswEgwbOFkoAJ8wxyE9x5FDsbtF8yZRugzqxAlOsqsMkI71iGCxSmv1lZF2XfvJ/\\\n\tT4B1BqSp30zCK850g2IwK+6mSDk4H3A00AybPXSBzqcVQg8OAS008MATNL8X9scR6NKPMR\\\n\t+vIH0eZXoy+fR3DHvY58TaQvDxM72G0O5wMftqN3MnC7eRE9cMJRuKjwo69sLJoP3LcEpX\\\n\tb0Kfk/utjIRTPwtdaiVIcc+ZuIHXgdktmE4tN2tHYGlgPrAdK3Rkh0XnYU7FtWi9CLX0eh\\\n\tawQ+fo8hsLKEwMZFRTTa0jpH/ibS10aIH+8xhxuAaVa0dgauA3SA+MsXIO28nWjNsy3v+V\\\n\tfdjdoyE31TKyLgK7rvW1LvyD8X8aMXsmKBNVZ0dgauMC8SJ3pdCVUb3pWvRNf5vHFw23IC\\\n\t6xeMudbXUovI8V0nJP95FUbzXksntjOw3bxInbrhSqhaPT17nX5zmMizL+dGPLSWGkSpf8\\\n\ty1osSHunCWKzkAsj9K6o1sAWChFZ2dgXMA0n0jyFsxR4FCVxGhUeVTbwyQvjZC9I/WwSl5\\\n\t+mreWGu1fsXHQupyn3lZHNkysDOwDiB9w12ZREzPfzIybOyXsd+dJD0QLqJPD4QJ/6Qrb8\\\n\t63sNaVrCyPvhHz0vLR2xmoAci4y8+vgvKDjBgGysE4kf1/LyKPvXiG1Om+POO1xipEaXEA\\\n\tsoIcyX6iBa1oHFM1U1HPUEdZx/9wluSF6zlMJfG//hukJHHyP6PzmoLW5u01dYKdgWHAMi\\\n\tgUoWAbEX4t7174ycOkevuRkTjhvV2kLw0BkDyRv7/62hvcyQMQWfWTViR2ddEbQINSGrAh\\\n\tGYUMF9RgCkJ+6vwthh7+ddG6xCtXjHCfeeL60nlE9KOuXEOZkX0zLfcxuyd4DkCpqkCo3g\\\n\tvgY2U0Y0H2R0mcujK6rtSP9j53WY1SmU1geixpbNafBONVU+aWOwqTQ/lPUOjuN+1459m8\\\n\tcWCD5bY2CkWgzas0R69aktmw6DQv1AUuvukKKgNespLES5eQw6NFK625Gq3dXqbaNCN33+\\\n\t2yorMz8AUyzqvfM8eVojKW4+t+3ZqwcN1bCaIHX8+bCz7UYesavqXZYBQH/mZFZ2fgIPAn\\\n\tAN+CWpTZLj5nYjmvqUe/jf/+VN5TVBtm4ttokaAIgf7+JnP0F2yaNk5aPGtIU9A/NHbbIR\\\n\tfJi6M5a/pKvyN9LtI3IoR/eSxfuYqx/1TfqnrUqmxceMaOr1NVTcGoXN0tw3EGH34O2Wdd\\\n\t4BUVfvT1jSAE8YPnvBeDFUFgWxu+JfWkem4S+fEx5FBBoiEEZbs2o931bjCaNPMBy3K6m7\\\n\tLhJ4GfAsReOE14V6cD+dRC39hI6AtrzeFWYK8dvRtH+TlwBMC/uhlteY0D+dRBqSkluHWl\\\n\tOezCKOXbr3HBV2JUtaMIQeiLa90FnEmG8KuEdq5BlAXAKPxux0WPwm2o6ybTD1AqgpR+fS\\\n\tNihrsUblKgCIJfWY3WXG3O7MRlz9BLLN8DPAWg1s2g7FsbUCqLGpaTDqEphB5bg77iLnNq\\\n\tNx56hV67SwqGT24BSF0fYmTXQVKnbnrh4V5YZQnBR9fha836/T6MoOe6RzieBqgK7MJsoy\\\n\tVShPcfI/6bbmRy4s1PE761cwl+qgNletbfn8rI9CRkIi3szwPfI9OUSV25RWT/KyQPX5pQ\\\n\tl1drqyLwYBu+RdkviiiG/7tqlxVioocQWjKCsyXG1PUhYoe6SXT1kL445IqJUlmCtqwe/5\\\n\tpmtMa8JPsIRgTvHnulMybrGMkW4JsUVLfSfW+RPHON1NUB0jeHkYkUxJKIUj+iLIBaOx1t\\\n\t7izUhpmFPM8A38Hw94kpOMkHgT6SOcwTG8dBoIQ0DhE98HY7CDQWyjFK/yswCshzMMqQ5m\\\n\td+GKMkcg7jw/ow8CJTcJRrqgx82+Adf9rwjoG3O+4YeLvjv1Ru0JflEZTtAAAAAElFTkSu\\\n\tQmCC\\\n\t\")\n\t-- n.png\n\tR.chain[1].n_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAADbElEQVRIidWWTWxUVRSAv/\\\n\tv+Zt60dChQWlNpB1NqF9aimFajMjVRsSWwUEJcYI0LNNG4MJjoojHG+LdgZ3TXGDEmRuOC\\\n\taDCAfxijEWP4SRcCBQpF+bHTTpmZN9P3d13M1On0dV4HYgie5OW9d+495zvn3fvOuUJKyY\\\n\t0U5YbSbmbgWmAYOASkAFm6UiXdMJCoxZFYYg2bgXeBp2SmoNpHzuGOXUam8+D6iOUmamIV\\\n\tRk8bSnODBPYArwKXrgeYBD7301ZT/rPDOPvHkLZXxYtAf2AN5pO9qG0rJ4EngB+vBfgo8K\\\n\tUzesHI7f4WmSpUC6rSma4SfbaP6GPds8BW4EAtwARw1Dl2Pp57fT/S9WuCzRdzZy/RrXfN\\\n\tAOuB8flji22a9/1UNp7b/V1NMKEqKKvNCl1+5Dec0Qtx4AMWJLQQeA8wmP/0V2R6tuzU1G\\\n\th473Fiu5KIOr3CIPLMBuIjQ6idK8pKX5If+Rk8fwAhNoQBh/zpHM7BM5VZrIiiJpqI9HdR\\\n\t/+YgYmW0PGZoxXtTrMLGG5vGOT4B8HQY8CHn2HmkV/1Tah0t1A9vQjQYAMi8XQRG9MBc+/\\\n\tdxgP4wYKc3nqoKc//4C+foObSOFupeeRihq0irBIxqgfn+RBqgMwxoyGzwF5AFt/igKeTe\\\n\t+Qb3xEX0O9dgvrQRXK8EDGYoczZAJAw4i2kEU7vqFJ3GokjLJfv2Abw/p4k82ElkoCc4f0\\\n\t4iKoAdBjyptjYGI3U8ZN5BxErrNlUg+9bX+GkLtbmhqCs4ATu1dTnAyTDgD3pP26LBSstG\\\n\tqS/vTn8iQ/aNr/DTVvF9ygrYaN23AnwfBvxIvSWOdm9rwNhPXUU6boXOOzVN5rW9WHt+wj\\\n\ttSWa+V1SZG321QLOj/ymKlbZ939u+BzK69SKdcrMUyHWFq+FfygWAWk9jLSSLJrn3Sl5uF\\\n\tIqpmCPC8urZpJvpcX4VSZpyaYcbgOiLJrhnghfmwasBxYHt0U7dtvng/Qr22Q4Gx5Xbqdv\\\n\tbbwHYWFG4I74cbgS/csUurrA9/wTt+JRSktC3D3NGLcV/HJLANXx5iQXZLAQFaKHb8IffE\\\n\tRWEfPoN3ehJ/0gJfIhpN1PZG9LvbMda3e2jKxxQ7/uVqDpcCzkkC2AE8AtwBzLWGKWAUOA\\\n\th8gpRnEcGsrgf4n8lNe0z8/wL/AWkORFUNbGW+AAAAAElFTkSuQmCC\\\n\t\")\n\t-- n@2x.png\n\tR.chain[2].n_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAHaElEQVRoge2aa2wU1xXHf/\\\n\tPY99rgEAdDjTEBHEgbwisENSmPUJSYCslRqZK2n5qoqlRF1Cpp0yp8qPoBNaUNTZXHJ0RV\\\n\tKSlIlULV1ORVSExFAzVJREJqXjHQ2BQ3xsbe987M7Yfx7M7indnZ9W5TR/5/unPvufee/9\\\n\tw75557zkhCCD7PkD9rBWqNaYJTHdMEpzrUGo17C3A/sAZYBiwAGoHgeHsWGAD+BbwPnADe\\\n\tAP5dbUWkKh4TdcBDwKPA3YBUZn8BvAPsA14C4tVQqhoEo8BjwI+Amya0ZnX0KyMYw3FEKj\\\n\ts+q4TcEEZurEeeGS425gjwK+A3TJLoZAl2AM8CX7BXamevkDnRh/bBFYyz1xCa4TiAPCeC\\\n\tcvst+FbNx7+yFSkSsDf3Y768g5UqWCnBIPAc8EiuRjNId/eSfuVD9HPDlSkT9eHbtJDQ1h\\\n\tXIs+vtTfuA7wOpssesgGAj8BqwwqrIvneJxN5jGJdGyx2ruFJ+BX/HUkLb7kIK+a3qHmAL\\\n\t8J+yxiqTYDPwV6ANQKSyJPYdJdN1rpwxPEOeX0+kcyPqoiar6gzwVeATr2OUQ3AG0I1p9j\\\n\tFGEsR2daH/c8i7xhVACiiEO9fhv7fNqjoNfBnwtF28HvQSpuk2yQ3FGNv5p5qTAxBpnfju\\\n\tt0i/3WtVfRHYj8djyCvBTsz9j4ilif3i1ap9b55gCBJPd5M52WfVtAPbvXT1skVbgF4gBB\\\n\tDb8zrZw33uPWoEKeqjbs/XUZpmAKSBJcBFtz5eVvApxsmlj56pCTkprKKumI10c9BVTsSy\\\n\txJ87AuaiBIBdJccusYJtmKsniUSG0e0HMK4mXAf0dywlsP42tPODpH7/D8RY1l2BsErdM9\\\n\ttQmmYgMhpjOw+W/LbDO9YT2LDEelyCaV2LotQK/oDxjzn1+oclycktdUQeXYe6aDbBB+6g\\\n\t7pcPIrfWu/dprre2HJJfRb1zbgmVILX/JOS9o8dcx3dp8wEPA6AZZF45XXJiuTFS8Kw0N1\\\n\tC/60GUZY2OfURWK3iWQgEHyTyM/hiZntyn8m1cbkVuBNcz7jxnP/qk5Oo5QaoLUrdzK+rq\\\n\tOcUF4oVbWAr5PI2b6T5rFRuAdU5ybgRznTLHJ2dYpJCP6I/bUVc1TWgTsRsIBr0R1HoG8r\\\n\tcT2OAk50ZwjVXQzwx6mnQC9PwtQgr5iD7+AMrtNxeIiIRWKBf24wUiqaFfzLmlq5zk3Aje\\\n\tCoBmYJwf8TTpjUgefNeuBFI0QPSn7cgtdYXKJjJ5GY8rCKD1fWoV25xk3AjOB9MtE7rzfc\\\n\t4OkbjhSNAMxn7Whd6fvz7JM8NEn9yCNCt/5hl2ggHvURRjKGYVHU2vG0E/gBEv4wqWKbSI\\\n\t+BTEUIrYz/+C8WlOGZS5M4n+ZDNSeJxMIp1rK4egGMvpVjQsAFWOqonEjSbf3G7GQJzYri\\\n\t5ELE9EXTKX8A83ICkyZjimAnjYWW4EEwBSwPs3IUYzBc/28IN+bpjYr1+DrJ6r89+9kOB3\\\n\t11AppGhu/IyTjBvBAcApKFQUIp61exhIkUKLqPVcIfbC4YK64NfuRGkptKxeIc3I6XbJSc\\\n\taN4FlTyQDynIiLWCGMeH4byuGJXkn2jY9JvHissFLJqyFsK1wKytyZVvFjJxk3gidzA7V5\\\n\tf8PCRlCKFr8dpPd/QOrQKYf+jrttAtS2nONwwknGjeBbVsG3fJ7nSUUib3WlIitoIfnCO/\\\n\tZbeg7GdW8uobJ0FnJDbmd1O8m5EewGhgF8qxcg+RRPE9tXwNUrEYLknqOkuwtvOsbVMU/z\\\n\t+NYusIrXgLed5NwIasCLYBoadWOrp4ntR0Epx1noBsmnu0kdOoVIa+h9g2SOlI7QSQGFwH\\\n\t1Lrcf9mLmOoih1Dj5rFUIdK8fPLHdk37+cL5/uLykvdIPk839nZNteRre/jNEfK9nH195m\\\n\tWXcBPOMmW8ptOAP8AfimMu8mfFsWk/mz4+UZgMyr59H7riE1hNDfrXqyCKkhQPgbd1mPBx\\\n\ti39o7yHoJOrZhhi4CIpxnd8UdPb7lWiDyx0YqRJjHDFZfd5L24aheBJ8A8EyM7NiGFapVW\\\n\tdId/6232APCTlCAH3n3R3wKHANTFTYQ714FcbvpvclDvaSbySO4O3oWZWiuJckL39cAxzM\\\n\tgymeMXSDx1pCzPo1L4vtJCpHMzkl8FOIUZbbjupe+kki9a7wDx3W9iDCbL07gMBB66g/DD\\\n\ta0GVwTQom6hR8sVCI+YWWQ1gXE+S+N3fyL7p6A5WBLk5Svh79+JbPt+qeg8z71/T9JmFIP\\\n\tA88B2rQvuon+SBHrRJHg1SQ4BAx5cIti+z5wb/pwlQOyaksLULV0kf7kU7ftlzqFHyKygr\\\n\tm/Dfswj/2oX2uMxnlsK2I4KZfXocyN1fEAL98hDahUH0gWGMoQSkx2/8qoxUF0SZXY/SOg\\\n\tt1cZN9tcD0L3djvrxJHbrV/I0kAnwLM29f6W8kx4G9mB6KN6+7BKpJ0I4mYDNmbHU5MA8z\\\n\t8mXtvRSmsejDNPsnMPP+FQZgnVErgv83+Nz/qzZNcKpjmuBUxzTBqY7/AmDdgoJ+h2mjAA\\\n\tAAAElFTkSuQmCC\\\n\t\")\n\t-- o.png\n\tR.chain[1].o_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAAGXRFWHRTb2Z0d2FyZQBBZG\\\n\t9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBh\\\n\tY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4On\\\n\thtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBD\\\n\tb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj\\\n\t4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJk\\\n\tZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG\\\n\t1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJo\\\n\tdHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxucz\\\n\tp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9j\\\n\tdW1lbnRJRD0ieG1wLmRpZDpGOUVDQjg4NEE5RERFNzExOUU5NkI4RDIzMkM1MTczMSIgeG\\\n\t1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDN0U5RDc3NkRFQzQxMUU3QkU4MzgyOUU5QkI3\\\n\tQkI5NCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDN0U5RDc3NURFQzQxMUU3QkU4Mz\\\n\tgyOUU5QkI3QkI5NCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChX\\\n\taW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaW\\\n\tlkOkZFRUNCODg0QTlEREU3MTE5RTk2QjhEMjMyQzUxNzMxIiBzdFJlZjpkb2N1bWVudElE\\\n\tPSJ4bXAuZGlkOkY5RUNCODg0QTlEREU3MTE5RTk2QjhEMjMyQzUxNzMxIi8+IDwvcmRmOk\\\n\tRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJy\\\n\tIj8+P2blLQAAA3ZJREFUeNrsVltIFFEY/saZ2dlL2paWdlVRuthNdk0LsqS0HurBLlIkkb\\\n\t30VI8F0UP0EBEU0QV66imCKHrpBqUZUYR0sVKLpbyVlenmhXRdd2Znpv+MYu2ONbMF0UM/\\\n\tfJwzZ8453/n/8/3nHE7XdfxNS8Jftn+W0Ec4RWgkRAj6aNkw2u63S8hZ7GEW4SxhvT4kQ3\\\n\tnxDuqHPmiDw+BEHvysyRAXzUZSqof1vUHYS2j/XcLVhKtaT8gbvlQH5V4b9Ig6Tow4iKsy\\\n\t4dpWBH66t59aKgg1iRKuIlSTR2LoxD3o/RHrULkFuPcWw7FijkKfZYT7dgnTCU1Kw/u00K\\\n\tHb0KNaQqJw7yuBtHJukKqLCZ/tiOYYhTEtdLw2YTJm4dMPoHb0TqHqUTseMpE0h87V8vKt\\\n\tt+bOHhFCwXTwWalI8rqhvP4E5W4boMVGSVg2A8kHN7ANz40XkRA353atf4hX7rSYyBzrcu\\\n\tCuKgY3QRprk0oXQF7ajKFjtM/q92hE6z4yNfP8zEmV9HnkVyFdq9S3m0IprpwNz57SMbJo\\\n\t4BPClx9D7foKx/JcODbnmRYoP2llRWl8e7yHC6PN3abBzo0+oxw8XQ2tcwBaoMdYlPygBS\\\n\tnHK+Aq90O+HoAejo6NUVuYbrDISjSp+sCwiVDITYfWF4JS3Qq1KTgWAa39KyL3A+CSneDz\\\n\tM2LGaF9CxnyWKh0vufVhBZzAG0keb2prcGSijOS4QfbO0p6kyW5Tp2hLt+GFuCbb9I8pdo\\\n\tQ5loFLdhjzWRE2svMx3oZvvDRKz25K6k154NKc4CZJkEgszrKFI3xvgrELmellRZOVaGrE\\\n\tguySMOpiPXzYgXBmHZ2Xy+DeVWzgR4vUvIIaiHVG9LGURrWtxB84fI2PPu00hy8/HdLaPA\\\n\tg5U8FJItSPvaTUN5BvU97+MA+fMxEpJ7eq4DjLxGc/L7gqC6sGn1+PSWYjbC+6MESwMueO\\\n\tInKFuzjeVTXeWXpAyM0ISlV+/I45yufD4c/+QtX9dm98dsJXuMp9irNySWJk6+fAs3MFu5\\\n\t62ELoSvYDZsXRFrm/3hs8/gvZ+4OfvlKkuCmMhpJJ57ALeTKj9kyfGGUS1DfKzNij19MTo\\\n\t6IcekinPJPDTUiAWZEHMzyQRCTep7x6rJwYYoQ34CacIDYSIPmKsbBxt99mcx9LD/w/hhO\\\n\t2bAAMAGcakBZrrNusAAAAASUVORK5CYII=\\\n\t\")\n\t-- o@2x.png\n\tR.chain[2].o_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAH90lEQVRoge2abXAV1RnHf/\\\n\tty3/NKEhJeApeEgLEqUSRNeBGKIjO2aFvHStXWji3TdjqljF/amVpbO5WxnSlDazuj0mod\\\n\t2xlKYaTDDFYEq4DyYkcGSwjUxIaEAAkQyMvNzb27e7cfNnvvDZI9uzfJWBz+n/acfZ5z/v\\\n\t+7557znOccyTRNPs2QP2kCE43rAq91XBd4rUOdoDYXAiuAOqAWqAAiw+81oA1oAQ4DbwN7\\\n\tAWMCuCCN4zJxA/Ad4GvAJI++54HNwG+xhI8bxkNgFHgKS5h0NQOzL04qrlkdqjLypAhIVz\\\n\tU1gC3AD4GOsRKDsQmUgLXA02SGH5gm2vFOtCOn0Ju7SbVewoxpIx19CvKsQpS5ZfjqZuCr\\\n\tm4HkH/FviQFPAL8BxvQFchVYAPwZWGVXmHGNxJ4mEq8dJ9Xe741EUQD/yhqC99RZXzeDHc\\\n\tDXgcu5kITcBE4G9gA32RXJdz8k/scDpLrjufKwyIRVAg/WEVpVBz7Frj6GNWGdy6lNjwLL\\\n\tgXeAagBzMEns+X+ivdmWS9+jQvlMKZF1d6FUFNpVrUAj1mTkCV4EhoC3gHqA1Pl+Bta/ht\\\n\tFyyWuf7ogVBch7YiXq3Cl21WFgGeBpmHhZ6J/FFndhgP6f7ZgwcQDm5QQDT+5Ebz5jV9Vj\\\n\tTTqe4FbgvcA3Acx4koFf/sPzRJILzEGdgfW7MDrTP+Qa4Ete2nAjMAT83i7ENr2NceKilz\\\n\t7GBPNygtiG3ZhD6aVmIxB26+9G4OPAdIDkgRa0Nz7yTHKsMP7TQ3zrYbs4A1jn1lckMGQ3\\\n\tZiZ04i8fyolgurNoAer8CpQbS5FUb3F+ctvx7KH6+DA3IUTB9kNAKUBidxOpzgFPpJS5k/\\\n\tA1RFHnVKBMK0YuyUu/S10eZGjnUZJ/O4app4RtmXqK+LZ/kbd2BUAJ8DDwB5GfaJnYCyzB\\\n\tSNG7drPriUWpKSb0jUZ8t1QKbfXmMwz84nXMvqTQVlJkCjatRi7Lt7ktFfk4jZPJwCIAre\\\n\tm0a3G+5VHyn/myK3EAau1U8n6yEikk3rmZRorEvpN28Y5hjo5wEnin/T556L9ipoDaOJ28\\\n\ttSuuDJwzMK4+FNUbphJ8bIGrPrSDbdnF5SJ7J4GN9oP+wRkHMwtSxEfku8tAyWoy679ltJ\\\n\t2nd91fubTqeS7d+wKDL+8f4R9ceTPKXPE20jjRg9mXDmYWi+ydxsU8GN7LtfUJO/avrEEu\\\n\tzuwEUl199K/fiTKtELk8n+SeFsxLCeulaZLY2gSqTPjhhVadJBF8cD6xn7/h3JFporV04b\\\n\t8tCnCjiJfTF5wJZE/NjvA3VI8oDzy7h9RHvWj72klsbcqIy0JiyzH0lq5MG7fPQi4Xr+Gp\\\n\t02lOs0W2TgKnARgX3C0NyoyS9LPR0YNxtFvslDIZ2n4kU5YkfIuiYreeNKdSka2TQGv4Jj\\\n\tQHk2FeiowUCaTLxln3Qbj+TgdmPLNEqDXlQh8zlrYXLvbCcMKMiwWaRgqy1lMp6Bf6pH31\\\n\tFEZHJrbNHgmjO7nfwzoJjANIeQEHkwyM7sw6qVZNRlI8hGLZkUzAJ7bPtK2LTJ1YXACQ8o\\\n\tPiDgHjw0xGQcoLoH4u6soPWUKZ7i3LKBenJ6JOoa3DuxYAZUqRq06T740MBsJfbUAqEf84\\\n\tvmVRpILMX8nsGxT6yGUF9uMpoa3Du+MASnmhqzBK39eBcbY30/DkfPKf+jxyZf6oPsrsIs\\\n\tKPLhrZTvNZYV9qVZn9eFRk6yTQCjVUGeUWYciHqRkMvjQyOlFmllKw4QGC36pHubkMKawi\\\n\tBRSU2hKCj91O/jP3X5kmJLnXObEtFfhRKtMT0QERL6dP86b94JtXiX5IHK7pB04T33yQ0O\\\n\tqGDKGgj9B9txK671ahf2LPcYyTPc6EPzsdrL1kCit96QinL9iNtSXBv7AG5Kum2j+Gob8c\\\n\tJfbi3pEzowtoH7QTf0H4QfA3VNmP7w5zdIRoLn8FQC6J4Fs6U9i5jeSrzfT9aBva+21CW3\\\n\tMwSXzzQWJPvo456Dzry9Py8M+fZRf/5IaLaMMbwjoEKdFbu+hft91NmyNJzSzAt6ASpWoy\\\n\tSmkeBFTMgSGMc33oJ86iH+jAHBAHEwCh7y8iePdNABeBSlzkSEXTYxzYADytVpfju7sabV\\\n\terKzI2Uqf6SJxqApo8+V0JpbqQ4PL05mEjLhPAbsKNjUA7QPiRRldr27hDlgh/+w57cukE\\\n\tfu3a1YXNIMOZNbk4Qnjt0tHO9iYMwYfmodZOtYvfw0P63m3A+CqwCcB/W5TQmnpPBMcC3/\\\n\tIooa+k+3sR+LsXfy+HL2Gsw5cFAPEt7zH0yvte+vIM35IZRNalczw5Hb54PT4rw4oeqgGG\\\n\tdh1j6LmDmNr43x/wf7GWyKOL7f9dK1aGr8vZ6+PI5QB0CrCL4QNQveUcg797C6O119nLLa\\\n\tFJQcJrGvEvnmNXHQPuIgdxkPsRdhFWEPAFADSD+M6jJLb/G/PCUC7tIQUUfPfMIXT/AuTC\\\n\t9O5iB/AIIM56jdbuGC8h/ADrEkIYhs/p959E29+KfqTL1c5bmV2Mb0kVgWW12YF3DPgx1r\\\n\tWST+QSQjYqgV8BDwDpg3Wzfwjt5FmM9oukuvut/2lCR4r4kYvCKJWTUGsqkMsLstsysUbG\\\n\tT7EuC40Z43kRaDbWtZLVWJORF/RgCXsOODFehGB8BdpQgSVYByP1WMKjgJ1siWHdmGgGjg\\\n\tC7sXYGwvxKLpgIgf9X+NTfNrwu8FrHdYHXOv4HXDGZ3/Dil9AAAAAASUVORK5CYII=\\\n\t\")\n\t-- square.png\n\tR.chain[1].square_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAACHklEQVRIie2VzWsTQRjGn9\\\n\tl2t7GktmmLJiD1YPw4+HHwIIqi9FCw0D9AsRRF/Ac82LNQ/wJPQi+CV48WROqhgrZGglJJ\\\n\tCYKGQm1Mk7j5aHdms/N4sFg/ss2uloKlA3MYeN/nN8+8vO8IktjOZWwrbRe4I4DtoTM8CX\\\n\tpr6wdCWLFQ6eEcagm0dRwWwkhBleaFFRuga4eSAMlAW7t1kLxEuWKr9DXKl6epv77Lk0xq\\\n\tWQysEwymKiA5quuLrkoN05lJ0JlJfIcW58okT1CuBNJq/aRuFcLsus1q9mFj/kq7XktvvE\\\n\t5jCWrheg9Ksy9g9Z2hLLSUEy1GmwBwD+XUuFy4BXjLzaOMKMwjk6tG/4UROsvTIhL3FfR3\\\n\t6DkAcFcXpsdl5qo/DAB0DW72RqfOP50SkfggZcnfga9DzwHcSkGmh/rhffGH/aJmwTr5zE\\\n\tYk3iPMaNMQf4f0gMi+UevYZANGbwBaG8yBCYiu5B1o5X+nzWpIVYawYsO03z92M2MdbCw1\\\n\tDzT2wDx03zP2Xx7jau6R6Dz4d0AAoGtDmN3nWclMNTI3o9r9+BusF+bRB3Wj79wInc/PRS\\\n\tSxqV7APrRB8pSuZItq9uKPPlSvzlKX3+ZJHtdOYesa/6fmT+rap0U1N0j1eoi68iFD8oCW\\\n\t5a2dNBvjrQaSCV3LvdG13BOSe7WqhtJoWcM/SqBsQLvr9TMhrO5Q+aGB/7p2/o+/C/z/gd\\\n\t8AcTpAf+9BGPQAAAAASUVORK5CYII=\\\n\t\")\n\t-- square@2x.png\n\tR.chain[2].square_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAADpElEQVRoge2Zb2hVZRzHP+\\\n\tc558w796c5YbG1miaVu9tKeucLEyosK7GwIChEhjGKIRYGUYkyohgRMkYGG4kU6asiYrKi\\\n\tImS+KMIgWLoWrJW4zMlWY+rN8+fbiy0ha5b3nHPlyPnAgQv3PN/n9+Gee5/n+V1LEtcy5m\\\n\toXkDSZYNrJBNNOJph2MsG0kwmmnUww7ZRScB0wDJycf10aJCV92ZK6JSk8e0L+T/slKZD0\\\n\ttBQmPn/SE1RJGpCkcGZUF75ao8JQvbyRrnlHvagwSLQGK8ED743AAHC7po/ifd+B/ImLb9\\\n\tpL23Fu2wXG7UbhC1jJfFuSEmwDBoEbwskv8H7ogHD2HzfZtZtxVu4Gk9sLdAKxF5OE4Frg\\\n\tI6A6nPgA78ftIH/Bm+2aTTj518Hk9gNbgSDOYuJ+Lh4DPgWqg/E+vLHOy8oBBL+9jz/cCf\\\n\t7sFuAgUBZnQXF+gtuAPRCaYLQb/3TvFQ02Vetw83vAXTIIPAqci6OouAS7gJ2EBfyRlwmm\\\n\tDhQVYhavwW19C8pqDwMbgd+jFhZV0ALeAJ7Fm8Y/voNgZjBSQab8TtyWfZCr+xp4EJiMVG\\\n\tBEwR5gmwqn8L97hvD8l1GyLmJyd+Dk+7EWNw4DdxNBMopgJ9Cr2TH841sJ/xgpNudfMYua\\\n\tcfL7sCqajgL3UOTjGkVwRjPHqrxjm/+2gMeJcZfjtLyLVXnzIeChojIizP+5Vd6AKW+LEH\\\n\tF5Qu9nNPMtwKpiM6IIPoVbM+a09GJXb4gQswCmHPeWPkzDIx7wRNExEUo4A9yHU3nSae3B\\\n\trtkUIeoSTC2LVh7AXL/+PHNr4uFio+JYB5cBnxF6K/yRnQRT70QKM+5ynOZ+rOr8FHNr4Z\\\n\tEoeXEt9A3AJ4Reqz/6CsGZ/qJCTK4Np7kPq6JpHFgPRP5pjnOrtgQ4BOHqYPQ1/NNvXtFg\\\n\tU7EWt7kHcnXfAA8Av8ZRVJyb7WngXjCD9q0v4dTv+N8D7es24rb1Q65uELiLmOQg/tPEOe\\\n\tBh4KC94jmcxl3/OcBe2o7T0gNO5dvABuBsnAUlcYy+ADwJ7LWXdeDc9OqCNzr1z+M0d4Ep\\\n\t243C2M+CQOI9mS5JCk+8p8JQowpD9fNXw1/NJ09Se5LNp8S7WpK2S1Iw8eGc5JEmBb8MSN\\\n\tKspPuTnr8Ugkh6XFIhOPWxgskhSRqXtKoUcyfZVbuU1cy1JIaBLczthBKnlIJXhey/ibST\\\n\tCaadTDDtZIJpJxNMO5lg2skE0841L/gnbItHb7ZckqQAAAAASUVORK5CYII=\\\n\t\")\n\n\tR.duckloon = {[1]={}, [2]={}}\n\n\t-- blink.png\n\tR.duckloon[1].blink_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAAJEAAADNCAYAAAC4lJKvAAAAGXRFWHRTb2Z0d2FyZQBBZG\\\n\t9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBh\\\n\tY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4On\\\n\thtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBD\\\n\tb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj\\\n\t4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJk\\\n\tZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG\\\n\t1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJo\\\n\tdHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxucz\\\n\tp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9j\\\n\tdW1lbnRJRD0ieG1wLmRpZDo1ODIzMDc0RkJCRDdFNzExOUU5NkI4RDIzMkM1MTczMSIgeG\\\n\t1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFQkYxOThGRURFQzQxMUU3QjlGN0EyMThCNjhD\\\n\tMkE2QSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFQkYxOThGRERFQzQxMUU3QjlGN0\\\n\tEyMThCNjhDMkE2QSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChX\\\n\taW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaW\\\n\tlkOjVCMjMwNzRGQkJEN0U3MTE5RTk2QjhEMjMyQzUxNzMxIiBzdFJlZjpkb2N1bWVudElE\\\n\tPSJ4bXAuZGlkOjU4MjMwNzRGQkJEN0U3MTE5RTk2QjhEMjMyQzUxNzMxIi8+IDwvcmRmOk\\\n\tRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJy\\\n\tIj8+hrRElgAAMoZJREFUeNrsnQm8JEWd5/+RmVX1zr6gm26u5gYFBG0ZGhGlQR0PHBlHh9\\\n\tVVx1HBe11ZZ1V2QHfF2xkddZxZ1HGd8QQFQVFnON6oyH2j3Ec3DXQ3fb/3ut+rqsyM/ceV\\\n\tGRGZWZVVlVWvXnfl55Mvs/JlVWVmfOv//8c/fhFBKKUwWAZLJ4szeASDZQDRYBlANFgGEA\\\n\t2WwTKAaLAUsLDamb0Olrlb6g++5G9x3YnruH68tvY9y3E9oh95GVii/gLoXNx8CtcFuC7X\\\n\tADoSN/fg+tyBOxssjQA6FDdf0Q5VJUBDuLkc12W4/nEA0WBptHwJ1xG5H+C6Qe5/DNfjJF\\\n\tRrDRe35Vtn4fqtAUSDhVmhM3Dzeu3QutIxv62jFVqJ+x+Vxx4uH/LPgQbQu3FzFa6bBhAN\\\n\tFrZ8xnr9kNx+Edchuf+ABtBrcPMNXIkEaQDRXm6FXombk63D96IVej5u36gde0ACxGpo35\\\n\tNltxHX2wYQDZZPphy7FddPWMceQICYVfoprovksV+U931XONc34O2tJRfeupAVxJFA6EFA\\\n\tnINw/wAAugT3F/FCIsTD/y2KfmeE+LhOy/0d6Ei24nY7rmy7Ho8+ybfEeco55ql6Tiv0sh\\\n\tQrBLR0APue19kQ4Xoxrs/Tjl3ZD89yr4AouHmcBairCaFYYOR44PmWcH8OCGVhBf6YiSNC\\\n\tDCr3edIVX5NQGmzcUocBFP8PtMRsdDz0wwcPfBhf34+f80c87XZwyK3O4WufTbm0j6Qc2w\\\n\tjuwv9qMw+jJ7Iq/vnasRlcr+uH50vSMtSEPZD5DM1NY/vjnb0cC5/90tm6PL43BYDaKEtD\\\n\tJUhsvwQw/Bz8VwX33ej0GBSsbYc1uZ3CY1MSRBKfRxxty76GPIF/bsLttXjs2mB2BbN49y\\\n\tYffvkqWjniVbhXio85T8DoC9jeoboVQld2dq+fbRove4wlQnAOl4HoG3BdxS1MZEX0h0Bi\\\n\tkPhGO0dZIQaEtw8W43IBkVPGrccKGPc9DhlhoKmVHQtn8e2TeCFbcd0M4GPNO0AvF86Izw\\\n\t8RACc8FELnzbjFj53ZSYPhZCGVVgwZALGlspJd5OHWqVf2y7Of1xAFNy7AX3P4JuThHfjy\\\n\thckSaQEk7qqoAIktUzcCLDgdn9BizpT4CPx/iKtDgUpXRtiW7TrDCMYCgDIaC6ckOGDwIV\\\n\tS0/hQGQI9h1ep+fD/CFXpAg6GFKY4B3zNqxkjOCAP6MPvOcL26X8phXrqz4PeLT8Qr/zA+\\\n\ty3NwrQhX0vAuUyuiqa6NUOVCABgUDCRWkMwSMTi4eyvL/RLfJ5G10qwTka8d63W4E2j1cQ\\\n\th3PQx09kG8fC0G9xYC9Q4wL5K5VXfUvvQb0ZWdOhfPft67s+CGpa/EUmDNAC8VrkfLVNAG\\\n\tIDW0SDJATrNIAbqn6VsAxk7l1odbJPY/6fFErMPeWhIfT4SVMgyG/h722kEDNHwacnkGvv\\\n\tQRpD8C3XUr0N33AnWXmNddWpoGEPRDgnHeQRT8btkreT6FYu2KOFoNqnOQYl+VAVId3c/u\\\n\tewBGTpCAKJeWdG/E/p8BkzqP/dOX1s4DMrIKCPNgGFOFs48gTHciW1uExSsfkPVI+gqivn\\\n\tZnwW9WIDT073D3VAGALBAiCz/aysLla+uujUTHaLZrY7Wj8krpnjzLVXnCneFvkqhjelyk\\\n\t3JkjgnNKWOyMK6lo7g/3nSEOD519DCt/j+JvppaW4Vpb3ve8Q+eqTFJ56UeIgv884EC8si\\\n\t/gJb8pLnhVk8oBEgmb/XRaB4lBMfZi5GSJBZJnxULo2uxjHKT0GIkyeKDMISIO+z6ssSFk\\\n\t1Bnj7jSY/QPQ2vo4zoZ7Apfc9EVw3M+QxbdMDSCy4Zk4kJXi+7EAP40gjMcVkT4BycWCHT\\\n\t+N18QMkJQlIp4GUskCSQuu9eDbgEp9RoWDBGRMWC4G08w9vJbnhVfgZ29kF7sRQfofCNIP\\\n\tBhDJxb/+4GNw811Cwj+JClAHpl9AKq9A17bKzBElYMkAKYLNBqls1uCMfQbUCN+G9Q3gTJ\\\n\t2Pt7mOJS+Fm3Xcq3D/fWThzU/vtRD51x2GVaTw/biL7iscFt8fallk2iZIoXVegSCNHAtQ\\\n\tOVQDwwbFdm86GK7m3jzNzTUACdS+VIXMXgEwcwnbUSDtRJDejyB9f6+DyL/28CV4Bf+Gu6\\\n\t+OCzuECCSiIKFmbWfOQcLt+CkYHy2KYbDdmxX/EEcDJvp/A6sE2mvQ36vyTZsBpj+HD/F2\\\n\tBRKzTt/GC/8QWXDTrr0CIv+aI0/CS7oMr2BlEooCQCKB8Vntg6Q9C6K1szkYso2v1mId5a\\\n\trcFtxbybJayipVJERa3AQqVvJMC1XF2v7uL4v7Y+XmkPtxfT0Zv+mhXkE0J3oi/5qj34ab\\\n\tG/CuV/L8DZUFRR3jsih1JDfqHGIm/o33yCYMkO+hrnmLtMmtqtZ8KxlpgKuaRNhx1vA68z\\\n\tDuI6ysKh76olGWbVkWWq3sGBUr5f+PX4v3aedGx6raOWq/Lvfr8THA/cprARZ8B2//YNE4\\\n\tHNLn4noTnTrljD0yT1T/9+fgR9OL8W4viKwGaJYmxSIRw03ZFolaAXivLRKI/FFpH2EhWF\\\n\tXdUc0irhb3eIbFIkatLC0uKiXjI26dvGQND+R3MG3/9KfxFzqhLJLPA+7xm765x7iz+q+P\\\n\txcCA4k+GvpkoELoCkh7D9AAkF4NdlnF2SomWfojiIDeGBARQxEhI2jklGyK96m+7NS8Gib\\\n\t3e/S/o4r4jLl/A9HEE6XPzHqL6r49jXWEuxUt4jQIgFSS9VjafQKrsDzB8NCPKio00iwR6\\\n\tI60GkgFOHqtkg6UH4nJbuw5hQqvk+BIk5/Nk/MaPdQuirred1X91/AiW6S+wUNbE0gvhvk\\\n\tXbJ401PLzNKpTtXDR+jYVJKQNJtY/FnxPv6OfrjaqKKVeCpL4LGjeP8GuARIxkgKTa8Kob\\\n\tsOyW4Vcs0prjSlLAVpZtbmVLUiIvNzpfb7qh1jHQ/gfpW6Ldb/lM3I4iSBeCEM7Rj9KpF0\\\n\tFRIPU0sK7/8gQBEMCaKHjWgmSqgmWaEgCnBNtUD5ztYDtxvvWaaufw73LMNtLUJUz5JVrB\\\n\tNj8HX888KoNeX6xc+RjEwTbU5P9qRtDN2sd4G1kUcPtxQG0E4nUt0NaCa2r/XwbcJXSxo1\\\n\t8SShkGuwDp4/MqsK5ffSKz4b/CbzgjdilWy3Y3XFta1d/4vFC7jhAK1SINHSoy2lEc5JkJ\\\n\tSBYjgZ3l9qJqPEnLaCcacu0mkrJ5DCwX59+LAfeHpWtj+SRyHlqkbxbpzrpiiepXP589Vt\\\n\tY36gyz2k1SqtU9tkiROF/9r4lFSqn6JywSlUBWn5bWoxpbJGUlQlWd17aR5RLHqLJguvWJ\\\n\t3iPfF6ZZH81KgZ4CwNU7Hi3Sp8R9CIv0T2iRzux/d0ZZv3LyxvT8DbEKl2iFQtJzOylgtA\\\n\t0S1UEixYJEZ7HcWBOWhCGCRG5DHRpfwmbmiCjVoFEuTXdVtJ7MNRlrCkil1WglPypiNBq6\\\n\tCNJlCNIRfQtR7ecveC8+3POjws0FkhMXCs0DEmkfJOgGSCQGqYZBdjCrgeRng0R9ExKZZK\\\n\tRRzFQXEEQJyWpqEtOMj+rpMVLlFehq/1KBtBi3P0GQhvoOotrPV70YH+g/mOC0AxJ0DyTa\\\n\tDZCsGlv9GZm51iGpm/u2q4sgE/vZFqmatD6hlfFW4OgwsdfD78Ya5CoJEj0B1y/1VWBdve\\\n\tqFTMt5Bwac+6mfJSF6BplmZJRpIgBOT0ZawTYxq8QtB9tdVUfiduQYoTvi/c60YJonG724\\\n\tPUwPso3kpBZsJ7LX5WRnAEjJLYGVpGSvWR+5qXfi/k4pJyFnkQU35e450rXAunrlSS7+Sp\\\n\tkMYT+qWRhK27NIqYG2YVmIZUGgeIvUVjubylExa7RZWoJAC5CVRfLj17oViYJoX1qfeuza\\\n\tDHdVNd2YslJh1QzKwXJv7DUTuo38LzwvFLpvioH25CkL5t6dUXIB8B4YepCcEyRoBSSSAZ\\\n\tJTPEi0Q5D87RoggZY78i14fAuwunA9oV5rw9WGLbRAiuKlWuPAW9XYymfheSyPRQ/CL/jC\\\n\tnLqz6s9OxtCf3sBTwsR0H0RzVQ1dm50Taura7HY2zQ2BLmqDuVVHlpeLLDbPD3myCUTXHK\\\n\tW5s1Iyv5QpcPMs2W05qU1Ka7RlK4N38lzcbmbXRdG1nUQW3nxHz91Z9YqTK/icvy2cuOVu\\\n\t8lqktMA5r0Wyvs+QkCSy1O1YJOjMIvk7Y0vDrUug1dQ012ZYmLqZRzKCZssi2XkkaklIwm\\\n\tqyVhe5Niyy4ffK3FFA0CJ9ne5cTXrvzii5CNgIGxTS45Y8INGiQHIyQCIdgNShFincrbks\\\n\tXwOpnkg0xnDV0mMl5d7SdElGKiClGcSIo+pxLql0EhqqVQqk1QjSG3rqzqqXn/Jc/PZ7uL\\\n\t0kWTWwFlyb7Wbadm19JrMtLREujdfSPE0W4phuzZDU2u7MS+0YQKKampfSc6SU7sbsY8EG\\\n\tdGsfEPfmeA/hhx5HFt/i98qdfVXWG+WvPS1w1hK6nVqkrOaRPBapXXUkOOn5qlYsUjAjcz\\\n\ta+mcFWFin0TRcX1lKSkb5mdeJzqZFjqsVNJomgu5bRWItbdwVapNOlKtI/Grdv6Yk7q/70\\\n\tRX+BD+zMhItIBYkUA1Kjdra2QSIpycWCZbbc/ahYKNAy2L4AKaqJBSngyDY4XnXXYyc/cm\\\n\tdUh8dwh9UUl5bh4obPwfPlwF5h+DG67U+crkJU/cmpHj6oz2dZi2Yg6YXVS5Ayq/7qcww4\\\n\tCgRJ5omYHsoESIuVIguj67XrJliJzLSV3QYbHDtvlKXbxi0bYbCyRuSOKD0at2d32RIRNh\\\n\tbQ4cmakQ1M+nFqteQXDlI7Lf+pIEFxIIUi6Ug5FNIaGW1rCh71vzThvwVSqINU47U2UwWg\\\n\tC/9rGe5NO2foLPkjZN9Dz+8aRLOXnTaMhXFRsrDaBYkUD1K7EhLIavnXgEqABDlAAg0CBZ\\\n\tIEh4vW6hpIVc3lVS1wUixSmNKjxGjMradLUdJAcvbF2GiVzGL7p9LNq07ojiWi9K/w4R5A\\\n\tUwu7BZAgCyTIAAl6A1IudaQOUl51JBXASEuUcG0aZMpqRbEQ1QNwPVaqm+kBzQLRRIOvHZ\\\n\twr12dZpsrLleaInf++wiGa/fFprG76EdBbrNsFiWaBRJK/cJrVuj5PZLb83CC2PBKQKNjm\\\n\t1sjX2tmCWFrL93WLFJhta0YzhwmOaZGq8fmh3aam7ZeOwttdoUD6L/TZE4aLtUSEYI2MDT\\\n\t4pVPaUdhmkRFV8PqsjwaqdCaBoGGrxUaCBZMVLyiJFtTQNKOqnJCdt12ZJSEIpDQkt3TZ+\\\n\tPq28RFqicAFuzy4WIgofiHpZFAESNAGppZb/HoPUqhZJ6Hdiy0MDDSS172sWJjBzRQogJf\\\n\tzX1ZE0Q68Uqo4AvglSaKkjQ1MRScqr5PNngIdvLQyi2R+9lE3WdhqkxC1tg0S7AVK/ymxl\\\n\t1psXjOnWYpC03BEv1FCr4mtuLiGzrafkh+weJRpkYHfT1oPuKhu9FsA7RlmjM+mG4xYWZY\\\n\tnemyy09Gx0kSD1rToSmmiRqBW7gQIiDSTNtQG1ckeBVmuzkpV6e1toS0usWIdX/7WUANTS\\\n\tuyMp91Z+Hl4P79dfxp3XNoOjaefF2R+eXsJ7e5PoHKd36JOd5UD0QjQ79lGtA6Lc6j0W45\\\n\t6LifP0z2HtNMQ+P/oc2ZERtM/XOjCyLDWJ2sAyOkdqcZf4rozOkYnOlNY1NByElJqDrFPt\\\n\t+bFWI/011Y6pUWfDkpCQQA2Sv16r/Sbq8AjJDpEIBXW05kHVbhjSxHmkfLx4xZ5JyOcY+V\\\n\t5HEOGC9T7YJwLIePYmHFFZ2yABSZzbC5Di83TPooFkx+/dBgm0Z6hGkWUNslQUqvgYKvU+\\\n\tNhwgQRKD7d/xgAcPrsPng9fpOA5U8aNcl8tdoR6I/VKZwqpjAzjmMA0Y/j1UfI9tDKLG7j\\\n\tKSsRIvbx0bFffl9KnnuOTAB4L2IaLw5ujBGIWtBY1EB4mCIQJQ3WqI1b2mSJAgTALLJCSq\\\n\to6N+nn0fYP4oxFcUCBJYojj1f+5DXQkSRLCLj6lrIPnSQsju2HjeH55w4bPf8dBAEfA8Bg\\\n\tzwredRcL0QSmzrBuCVCDzwmAMXvseHypBptQRIAOaQyto5LC6qr2X3uBCfymrc+X1bEM38\\\n\tYE0JP+4sEpuYFkDSodFB0ugvCiRIc1ONQCLRrz++p7jQza/QzW8bIEXn2SA5Mh5SFsmLb4\\\n\tn/W1kdZTFq0rUBPLkhgLrvY+HRlAA+tqpUPudqNYBKOdRAofIHI8feTrg1xvDhQHeFQrIC\\\n\t5GWNIHKaWKEX49+F1G5ApWbV2gycqdm4mrhHkt6kkCPYbqjXLkQdSTLUkc3a5lpRR1LNva\\\n\tlAm2qBs0pGhlJCEmoBtZCQrD52FsZH6uD7Aa7mtl6vgV/3EbI6uMSHU0+chQUjVvelKHCX\\\n\tArdEgy1uXTYzVkU1yp7WSUx0VvTrwD/EGDUs3SI99qwPX/v3nbBjd5hR1RXLsoUufOjVY3\\\n\tDgPq45okXis3NaJD0WatUiqUAzep+ySI4QtSloSTsWyQrqDYskhW4KPDZqibKQVHNtVBWT\\\n\tcG1Lxil898LtsHWn6LvP5hYZGfb4uJDE9WB4yNW6JMmtclnK4mgjlESXaVgl9raDkeOH2L\\\n\tmrw3VHe87Kh/x2IPrTqFAdfWiV9MJmD/JzV+6AGx+ZzZcEx/ULb12Y8jltgGQXatsgOcZE\\\n\teRFItgs0rrFdkPTrVSD5Ahp12SE1VKH889ncNfj/ZYvl9XBQQqlOlOdEt0BjVWcoz41qfv\\\n\tFcJEaMpIJ5NllN7UH2YhRfsxkf72wJopnvr2GzlRwLiYpYFkjiYUxX809JurtGG9TkdCPT\\\n\tByBB2rhI+jU2AAmCZJpBb6CNar7yux0dJCq/oi6Ki6edfNHxUF1ASGLpr17N5/6/lBgXKZ\\\n\t6wBozXpkXC1V0u3S6/9lVZEDkN4qGXGCbDAild8uDAB/90ERyy1IPxIafheuQKD97z8nHI\\\n\tp47sZ5ktKWAQUhUjyQQRtx6+kZQULf/1pITEaEMLjCaPqHNAFA8FGb1INIEbaz+TMRNhsx\\\n\t5RUHHbqnZiolPj2knSOmRZpBcdMQJX/82QUW3Vq/jEFudHLiIll5SaW7LVkS1apEYjtTWx\\\n\tSPHPNWWktpRrM3NZ9khtTnLAUj2XxOSqTmCGfOBYFklanZDFPvVk7Blq98ItEpV90bISjW\\\n\tC5t5KYWivcwU4+vh2Inm+Y6xZAEr+00KzCp1X/82a1reM8yI++twsgpQbOOYb809MNRhjQ\\\n\tAkh6Likkcfd+w7X5mitTH+dqU2RpxariIFBD/tVkrxFIur/Ikyn3xrb7oOHbxk46tnWIKE\\\n\tJEwMpSp8UrVk1er+HQXoGk/lUQSCx2qocQrCcQbMLjPlqAIbQDWJN0V4TgjOcFSR87sh2Q\\\n\tHFHFdohlkSRIKtsdahP52ZP2GTFRnPFOTEmqJvwLrS2zROIjF4aPrGQTMm/MBdHMv61h88\\\n\tQvMdxZZK5NkFjanSSaFlRysYsgAU2016UmCaPPNoP0LJDCnVg8jwbgr6MiHtbd0xPAIXAW\\\n\tU/BWOuAeHPCB9YsfhFQHiRjz+kUZZyqbLghYbW1ZFkkHzKrKG+fobpJtF6ip2tmLo3JDhN\\\n\t9xlJm6t+eB7wOQIFljM8BKgJQ2MyOJlKv+egRnbQDh1qZ6Vwi3E5jdRsC520HrxIAKcQ2A\\\n\tjIbZOaREdZ6YnR0T12bnkmTjLMhMd9TW5scxjQ6UkzLqbGJWyNCo5hvuTZ3LZjiKa2iH4J\\\n\t/f5nVnh5m/DrsanhMkOyYgDcDoGki6m0U3NYM1nSqeM4NV96kQwi3otjYHkdVZPwnw+A4C\\\n\txy+jsCRjHLHfPElgN8axZxxCobKVQG2rC7U70UKNocvbF+OmcfxxDOM6hPvD6AqHQ+4OST\\\n\tk0g3UaapUKJwMkqtXmfGnFHKuJhJrw8FSBa111LSW4LpvVfOXSqN6mVoktESGHtBITHWVW\\\n\tj9sEyXAlKUAYsU0bIEF6MlKBBAhM8KwP4TYf6CQCM80mB25saZ6ZIrBjFmDTNEGI0s9lre\\\n\tQ++ygZ4kQWCt8TTrvZydUSQrYYrdaRdfCOqLYwj20Ya82tZKQAyREWiaa4JKoCaxUw68G1\\\n\t1j4XWTEJrlNWFy1ukovi4IBWIDrQYIQUAZKWUCsKpIysdrjZB//hWXRNPrS6HIcWaN9pgI\\\n\tMb6PlOX0k5ixW3tc+mdQzUn3X5Gk45UH7+TAsg0ditEDMZGbu2epytjrRIGlgsEGcAKUvE\\\n\t/69qbdXYCoVWFpGNtEbZ4BR0eSsQ7Rt9ip2fUa87BUmXhAAUJmqr370bgier0O4yis/18M\\\n\tVNlHxO51MR+A+UEKJqizNrS5B4M5QCKT6XDQxLHCX+l4TzHJKWCuCpg7ocM0kBxhKNJakm\\\n\t0BqIlTVjEIW72DPfrxWI9jfcmJ44pDlAghwgdUEdSXeGHQHUy4VZJVrF+604rYMUFb4vYh\\\n\t9e1VcgUTFBn6565BbHN+OhqIpP4ip+qLkxbs1qsmzK6oe/T26I8PwlomZP2gNJlXdukIgG\\\n\tUgfqSA/mzeIsDcQA+EbFox2QAu0z1GNSojZqWSSQ7qxk1eKoVc0vma+jJiS6oBVLNBwl7/\\\n\tTCs0FKJBg7AAnS1JEkAVkjkMiwB85+ZQg31foXHqy5eUf5UDq6nt480lAd2cgiaS3/zKI7\\\n\t9WTxGq330rowK0X0aj6x4Crpz7sliMaiOMXRcj4KpNR8EbHm7tDKG3KAVJDMtnTiONRvn8\\\n\tSguj7nwPDxpBZgjWwhy3aH4O4X4L42nmRb6sg0kIgJEmuiCUMZaOs1My0BqWpodvNJWk4p\\\n\tanymQ/khomwQz7jFmxBqggTNQMpoZ2sLJHsKTUiR2WrHPTbBzkIIN85CsBZraNv9HP3l28\\\n\tbEeJKloxCWpVTkhMZCAZExCGlRMtuUXFKoSUhkkldU/aWojeigAKQ+FNsC6TESzZ7bq1Hb\\\n\tGcQggQUSNMhgdxEkO++kx1T6cdx3VgyBsz/WKnys8k/5QHdh7FBj40tjAB5QcXU1rKpv8v\\\n\tmxRFoMABqPiK65KAw3h1ZTPkS0mYkuSh0JVlNKah49tkjgpuSQ9JZ/VfS+5rIopIr2w1os\\\n\tU6HtyGN5VZLEXaL0HhINm0KagJRDZpsPpJQA3M5Ss3hyMT6kJZ7MUJhjR1I/BP/RGvhP1C\\\n\tOYcsc3iwjGNvgVB+nWsIE6MupdUpTMNuWXr4Jt/ZmHJHZtuqKResleHnobmkpU0iCp6szh\\\n\tziwhWhdAaiKzbbmdrV11pOdA6ZgKwlCB4Nk6BFsCkd3ejefUtDYlD9+HEYEzRsBZQrjojz\\\n\te+RoOQzpXMNgMkovcgcbRkZEk0/tqZ7agZpG5qjXgNvKbcWUsa61n8TK4sI7IAI9lD9Gvr\\\n\tFkj2g2wDpNSaXNp3a5+Jr93lJVw9zVpA+mi2+mDpfSOztZOSBOKuSJTnkmKQXM21OZqLU0\\\n\tlKGgfk3CL5ykPszC2PxY/YoccFJLppAlTJQyNXkjIUTNoIrfaxJjLbODsOkNkVKa3Pf0OZ\\\n\t7dwPQtp0yD9IURm0NeQfjYe04fuBADnUBtwCbSwk3jWoFo8ZoAYkVatIM2zPDRFYEKWDBD\\\n\tlBIu2DRDsAqU8HIW197MiiQAqjvm40tPq58YGvAjkSiDYIKehabG66trUEETWqdWkgOd0H\\\n\tCToAaTAIqQVSYIIUwaWBxAX7ygoF1gxJ3EWuzw8RFeo1qkRljUCCFJAotAxSskew9QvsOk\\\n\th5BiGF1kDqm0FIaTzQljZOEo91ox4lftybJOp9qyxYTf3KnmzBEpGnlGCbEpINEmjdjXWQ\\\n\tCMkGKSNuooTMDUjQyiCkTp8NQtrqFO1+3H1bwhSDFMYuTIEUgaUsGLQCETwl2lBELUHcYw\\\n\tpIdiHkAYm2CJJtylNASncfe8MgpE6bg5BqfdwMkAI5yn8t7tMWzGr3GK5rxZ09aST9WJ5B\\\n\t1ZZSQSLdA8kozHSQujp2ZGptc75P0a6N2maAFMY1NdBH9I86sLVkiR6Jez46GkgkHSRigQ\\\n\tTdBIkUC1JXxo7s40FIdZCM0UlUL1vdIslqPoAC6ZHWIIr8ruor1QAksEAiTUAinYBEINm9\\\n\tejAIaecg0WSMFHXR5t+1znnhjsncEI2+83qWmRT9i0LV5SUDJNoMJEiCRAsCaTAIqZXALM\\\n\tIiKZCoNjApb/e7L7MNscFXPCS+KNCC6hSQSDOQSPsgQasg0a6B1O7M2lENNlHzTBtwok2Q\\\n\taFEg6SkAzY3x94dtQXS3+AxfnKZASouRNJD0XrO5QEokGJN5kdwgRTU2rZoOOTLaPQApfY\\\n\tp2e4rRuQYpjECiquE19gztQwRBPXZdRMKkzK8BkrgYQpzWQDJcGMmo3gO0P+RfWt7Jrm0V\\\n\tCBJAC0P+QcYU7Xq+qkCQmsl+tPxRBFI0yEU7EFF6l4iJpFlTlihKPsavaQRYiyBBI5BSmk\\\n\teKGDvSAIkUD1K7Y0daaYJ4XKSUxGe7IOWeo41GKQA5szbrL/RAO5bofvyEqgKJEDeGxwDJ\\\n\taR8kmCOQjELZmwchbQJSNHgEudk5eTJoGaLRd02wpt07+dMKahwGotxZBBJpAlKzGAnaBw\\\n\tk6ACmRjc463iZIUBRIkAFSz6dov7nR6c3m9hBjF9dno3jIBMlpDBIb2ashSKR9kGgjkKAF\\\n\tkEiTADzZ8NrxkH+5QXLSQbJdYPdBurF9iCjcxDd+DJEJEmkMEqSDBF0HyekcpMyxI/sApN\\\n\t5P0X5LJ5boxihrzWtpsfURILk5QepUHdkBSKQbIEExIPXlIKQJkB52V09tbRui0XMnNvKk\\\n\tI5XWiIMh+36rmCgXSATmTGa7B6ojzSx1t2W2MNFMYJJnvrPr+N/abjllEkQgEQVOAiQSB9\\\n\t9NQYL+ldm2rI4ke6I68trOIaKCRFrfLWCJQHJMkMAxE5LqZq3G2p6rIyFbQjIvZLadqCNT\\\n\tUwKNQEpN9RZiia7nOlnWouvXxFsc3fJIkBzHAsmNf51FqyNpzgZbI7bpF3Uk9LHMNtE8co\\\n\t97yvTWjiEaPW+CKfxv54VUm5YAKWg0kMACCTQ3V7Q6st9ktnvuFO3X5TAyueeA/SX/Ozsp\\\n\tMtccJNcEyZEgKdcWpQDcuVdHpsUEPZfZknSQ7PvoL3XktUVC9Av+nSy45orZBiApaHSQmo\\\n\tnaei6zJQOZbXNRG+sF/ZsiIWKzy2zinYhqUzIOSgOJdAZSz2S2BOaHzHZO1ZHXuy+anikM\\\n\tIoyLWNryav59MzsEPDpIxI3jIQ6SY4IETUBqRx0ZuUbYg2W2ujoyD0iFqiOvzmlgclsitl\\\n\twhINouvlgHKVq1NjUdJOIM1JH9LrNNtrMVDxFe1DW4meQak+pknDNS8ESvM0DqpjqyEUh7\\\n\tpDpSv4+uyGz/4J66fV3hEI29e6KKF8VraXT3Vs2NMWvkxfDkAUmpIzNAalkdWaTMNlMdmX\\\n\tfEkT1CHXl1Cx6qJXfGlp9w6e3ubaYlYiCxsZOjHJJrqh8NkAqW2TZssIVE29u8kNl2oo40\\\n\tQHLaBenKbkLECJ2kgS+tUSkGiUk+dJCiFn83KvBYHVmgzHagjkyCZNxLyzLbDXj8lq5BhC\\\n\t6NNeVfyvbDqU1Y3tIa8VVMo0QSsRIx9vtKHdlAwdiaOpI0OA7zTR35M/e0Z8NuWiJ2Ad8X\\\n\tcdEWMZ2lskYKpKjG5liyEaf/1JFQlDoyIwDvRGY7d+rIn7aKROsQsUnT2IAPbJbCqY34va\\\n\t4Fkqz6O57p0ogzz9SRe7jMNl0duR1f/7brEI29hycev88TeZPPcOtjguRZILlNQHLbAonO\\\n\tF5DmlzrySvelG+q9sERs+Z5waTsAmOJRghTV2CKQHAsk2zL1WmYL7YO0dwxCenk7MLQFEV\\\n\tqj+3FzGw+wtz8pa2WeqK1FMMljusWJameQQ2bbT+pIsjcMQroDz/mPnkEkH/w/C4jWxRZH\\\n\tgeS4CZiIboW6oY5MA6lQdSSBPXwQ0svd05+u9hYigB/hF+9kHRvDnU8DuKUIpChfFLkyV4\\\n\tLkmpntotSRWTLbwtWRvQJpTtSRl7ULQtsQjb13YjduvstnAdj2WGxxWHzklEyQFEwKJD2z\\\n\tnQskAl2R2Wa1/MMcgQTN1JFdG4R0M177tT2HSC7/l1/L9Fag1SlujZqCZGiR5lhmS1sEyW\\\n\t7e2HMGIb3cO+NJf04gQmvEAmyufgs3P4IQlTWQXAskE6Z5IbOFvUYd+aNOOOjUErFFBNhb\\\n\tHwcIfAEJB6kkQFL5Iq3a3xikuVZHQgsgwZ4wCOl6nkCeY4hYmvwpNvxMuPkhLN9ybHEYSA\\\n\tgUjYCRgBEnqY6EbqsjWxmENC9I2Q2v80hm+z3vzMfDOYUIXRrLcP4D2w82/lEkEJ3YrXHX\\\n\txkCKameuBMlNl9k2UkdCJ+pIMCUkTUVtLYI0f9WR/9opA0VYIrZcwiQiLHsdbsWamutpIJ\\\n\tVMkFSAnQZSM3Vkz2W2Nkt5QSJ9OwipleC8zXv5Iw/2BURojSYlSBA8c7cMsCUwGki8eUQH\\\n\tyXH7S2YLKfvWsdwg9anM1oqP/rWI8i/KErGLYi6tznqD8Cy2V+EwESs+EiCpYLuUT2bbbX\\\n\tUkbdTO1iZI/T8IaQ3P+1FfQTT2vgk2M9EPeU3tqTtiSBhIKj4intwvSZBcq5lkjtSRJAOe\\\n\troDUN4OQ/tR7xUNb+ssSieXzrH9jOPmMaJj1yhISaYV4HORF8FDHK0gdWfAgpL0EyajV9V\\\n\tRme0lRhV4oRGiNWPLxUnbx/trfi/Y0BpJbliCpGKlsgZShjtQbcg2QnC7KbEnrIEEHIM3N\\\n\tIKQPqyRxP1oitvwffn+TGyHcttYCqZwEic2S3AikXstss+BpBNL8U0deUnrlH2nfQhRZI1\\\n\tz8x38nA2zpynSQOCwyXiJuf8ls+w2kYgchxYCafLfIMu+GJWI3Iq3RBgi3PMZBEtaoxKv+\\\n\tHB4eL7lRDql1dWS3BiGF7oHUH4OQ/rj0qvu29D1E4++fuB9v5AfcGj1yvbQwyq1VBEgswI\\\n\t4Cb68NdWS3BiENuwdSf6gjv1J0eXcFIrl8Em8koFMbIdhwLwJT0YJr3GcAES0ZqYnaGqsj\\\n\tXUsdWeAgpKGRGewvkIoZhPR3pVffc+e8gQit0aO4+Ra7Ef+h/xDWhMdHFQMkIgHKBEkTtH\\\n\tVfZksz285aBalPZbZf6UZZd9MSsYv+BP6ZCmcmRZDNEo86SAwUAyRvbmW2fFYdaA2kvA22\\\n\tdmzT+0FI17bax74vIBp///Wb8EY+y/brGBtRvyrb1URsFMVEHBxVe/PmTh0Z2m1dOUCifQ\\\n\tZStoTkq6Wz7grmoSXiV48mlKxj0zrU778aLc+QsEYSoCiHxEDiMdLcqSPFhHHQfZDs5o3u\\\n\ty2zZMMLf7FYRdx2i8Q9MzODdXMBuMFh/G9CpDbI9DUEqDWlNImXh2ohXgDqyzUFILXK6Bl\\\n\tI31ZHpMtuvll975/S8hUguP8S7uZXdbO3uy7QW/pIASTXSKpCUOtItmepIx7PUkUXKbNOB\\\n\t6D5IJB0kKEyLNMVcWTcLtycQoTVit/ghNqlouPUJCNbdIuBhri0BUskEqVWZbbuDkEKHIE\\\n\tFBIKltcVO0f6PyZ7fvmPcQSZDY7H3fZiVSv+8KMcWDDpIMuIkbZ7bbktm2OwgpcRpalqYg\\\n\t5ay99Vhmy8aT+nK3y7ZnEMnl47hupbNTUL/nJwIYFlirYFsF2Px4ZQ7UkdBdkHqvjvx65X\\\n\tW3bdqjIEJrxNps/qdonL0Bgs2PIDxDAiQthxTlinqpjiRK1NZHIHU2COlO3H6uF+Xaa0vE\\\n\tlu8Am7kIl9ot/8IfEAcpiotk+xprtM2ljkwBKW0QUpUnikByUkByk2XfCkjQS5AgA6Qoff\\\n\tB3lbNv2bpHQiSD7HfjOkunN0Ptrh/LVn4JEtvXQYoSkmVTHdlIZtvuIKTMiqWVfV6QaC9B\\\n\taqiO3Iyvv9yrMp0LS8RAYu1qF3G39vB1ogs2hwfdlQFSyQSpyzJbHuBrbU/zBqSkOvLTld\\\n\tffPL1HQySXvwc+ZTqF6g3/CHxSvtJILGDjIA1FrxvKbItSR7IYzCi8jIpWt0CCfCDR6TrQ\\\n\tKR9oQNNqbPiLhH/qZUESmvIUCCE9+fKpr685Ejf34DrsHfZiqJz2QXwwWPWv7wZax9opa2\\\n\tsL8IEFYp+ytACbFZudE9bEawYf22fHQx9vKAAa1uVxX2z5MZ9v+cza0TZeqTxOd22KySDx\\\n\tsyGJnXifpHiXrHOhybmEULuEoi2drIH/h21Ad8sBPFwC7sox8I4Y1897TeUvbvxl91qxaF\\\n\t9ZIubW2K/mI6q25q+9MYqHlFtTjbN0ehLoM08A3bG1DXVk/kFIiTuctAa6EaFpViRH4rFD\\\n\tLRLdFUD9js0xQGxBSxQ8PgX+gzsVhb/qJkBZiwdzvzDT+ypcz6rdeAm4y44BMrIkGv0u3L\\\n\tYRqpd/BcL1cW9fss9yKJ3+5+AsO4DHwtSPf8xR+YTWTySkQhkQ2iVJtDSgA5S5VD5pslaI\\\n\t8lceOQ9qvC1uR6UpVibl3MS+dS7lvVOoAVLw4DYOTdoSPLkLnP1HfGdh6b/PRQE6c02QrK\\\n\t29A9eNtD4Ds9d9TlTDS8Po0gKY/X8XGgDxZ7p1I9SuuATCpx4rQGYLZrzEG4W9/OKzHlgk\\\n\tFgOF2xsPpxis3/37yhtueHivhEiCtBk3b2H2Ity2DqpokZgr8393GdCdm9PfhLFO/ZpL0Q\\\n\tr5bcpss9WRpDxm13ZMUHoEktqGm3Y1Dmwrrk/K5Jy5Kr++gEiCxGY+/hSPjx66Bqv+10L9\\\n\ttsYzJtHZXeDfNlG8OrIyHlupdkGCzkFSVf9w22xjiJYOfXL0gns37fUQyQfHuhqxyfmgOv\\\n\tG1bCukm/EHbhWxQpHqSPbeyoKUQm4BpKJktqzSOF3LLsAlQ4+OfeK+T89lsfUVROMfnMC6\\\n\tNrwJd9fB7tl8b6pVIXz68bjxNlIENBmEtImojQwtjF1dL0DK6iOwq575P1J2Q7Kw/LK5Lr\\\n\tf+skQCpK340P4M6kEt73tYgF24zJa9b3hJRuE3yWoXCVItWxbt7Df8mdEL7l43gCgdpHtp\\\n\tzf98boieXd8VmS2PjVibXmrQmwMk6BwkOps+MrCz7/CDoxfde2E/lFdfQsSWBZ++6yJYNP\\\n\trrXKHUzi3FqiO1QUid0aXWNKEtgFSEOjJMaVEY9mpkydBL+qWs+hYiDtIX73sVjA83zX3Q\\\n\tqe0CgKLUkXqjLcueD+/ToBpeIEh5gm4HLeTSkbeO/s0dm/ulnDzo84UsGTuRBiEG2tWlDU\\\n\tEKKBe1qdyynr0mEJqjDoM2H0woDA8E8icVaplv9XpokWzP253x5SlZbf2F3k5Kk4Yt61y+\\\n\tX3JNhpaOXDp24d2X9lMZOf0O0fjf3jID40PPhaFyY2kDa2iNZLYVS2Zb7lhmS0b3kxKTrJ\\\n\timOxaJjJbj/UVDj49dfN85/VZGfQ8Rd2sX37WFLBo5HobLM5kWi5S6K7NlnzW2H6SLwQoE\\\n\tyXoPGcXvHULYR0q7yFj5pH4sn3kBEbdIn7pzLVk8djyMlNPbACqjHcpsmw9CSkr4HaP7Nq\\\n\tllFS9qcw5dtIXsO/LisU/cvW0AUacg/e/bHyNLFz4XRioJkMjowp6oI1l8ZGSzuw/SpLNs\\\n\t9IyxC++6u1/LZV5BJGOkJ8nyRUfD2NDO6GAJLczQAgFPt9SRWkMuGV2GnzXcHkjQEkgsbX\\\n\t/28Fsm7uvnMpl3EHGQPn7T02TpgiOx+i96M5QJzP7qIqC1GWF9ECQOlA6SErhlDUKqxo7M\\\n\tI7Nl5yzYX1i2VkGiuUGq4//PGX7rxES/l8e8hIiDdMHNmxGkQ7Dmtp6MD/PJaWZ+dj6EO9\\\n\tZLkIZjkHhNbajYQUjx/86CA7RBtDoHSdtnk+68YfhtE1fNh7KYtxBJizSND/4w2Gecz3JE\\\n\td22BmV98HPzHfiNGHUmR2RY6CCl+ljO+P6SKptsASWqR5hVAPB6dS6F+kcvU19e8FcQkNb\\\n\tyxy1u5GsovOlcUuD8rBtjiq9wP61L4XxXjAlBfCv/ronMAF/n74rUU+0N0zI+E/VzcP7ND\\\n\tCPxTn7DxtJOHTQE/qzCcPfJXE9f263NO5WVPgUiCtAo3P8H1EH4fI4uhvPpd4C4/VsDDep\\\n\tAwcYACCQGibLZICRKVAGWCpHqMRCDFvUfo9EagszubgETNHiLm/zfgetbI2yfu7OdnvMdD\\\n\tJEFaBGKC479Ux9xD0Co9/xyp257lEDGY8oJEmJUKmoHkQ7h9rYC0dZBuxxevQ4Ce6ffnu1\\\n\tdApMH0dhBjNi8UaYAhKD3nleAdeaaAwQZJubIIpJoARYEUKsukuTUJEweJHQ9mIdz2RHq/\\\n\tsmyQWG+XD4/89UR1PjzXvQoiCdIKEIX0OnljQIYXgnf0K8A7+CRe8AKiWgxSUJPg1KN9Dk\\\n\toWSBImBRKdfApodTKjldUAaQvuv2f0ryd+Op+e6V4HkQbTa0B02z5KFC4FUhkD75BTwD3o\\\n\thaKphLm5KNiuCYvEOrRFIDGAAg2kpFWivAftFoyPNqgHmQXSj/Hvfxt9x/XPzrdnuddCJE\\\n\tFimcH3Ahtoi5Dlql5NHALOvkdh8P0ccJYcJsYoUl21uWuL3RoHCbdEdctWx1lMJEEKtz8h\\\n\tAuyoC73xLP+A6/mj77z+mvn6HPdqiDSYWHvFeXiTH8JHcqhRzo4DzoIVQBYdBGR0KRfrs8\\\n\tQlB0m6tVSQ6jMIDlbzp7CGVptKui7C5xe7GNfvI0DhfH5+A4hMmFjr6qvwsZyHL1+Nt+wl\\\n\t694gkpTlUXR5FZGsZAI39szQUhE+qMSsACwZ9zBlHLM438D156Pvmgj3hOc2gCgLqH9cw7\\\n\tp1/DneNoudTsfCX9wwKCb6szLOYKr6G3C9Cs+5bPTciaf2tGc1gCjHMv2NNawp6DiE4AW4\\\n\tPR7XI3A9GV/vJ7qkyfGBnXAr9T02LM7j+LjYYAG3sXzP6HkTu/fk5zOAqM1l1yVr7iIlOJ\\\n\tGwJrahKjjDu3Dduh2GduzvnjI9uzc9i74bn2iexE5MgfY87WenXBpzeW8cPKEBRHmWkxPP\\\n\tiUQx8tsGj2cAUZ5lVYZhZ3/OCO/aZ8UAosGSH6JomLTIrbHnd84AosGSDyJR15jRANouay\\\n\tFnDyAaLNlB9dd4dvtQVUnD9WNaA+qbESZWMzuVbjhudADRYMlaDtP2/54AvVy6MxZZs6kl\\\n\tPgQs002cYwcQDZasRfVUfALXzw69+T9ZBvoxBGmd+9INNXf1rkvQn/0Y12V780PyBpw0XG\\\n\tYw5tmFbustI2+fkPEQb9Yoa+ecx/o4DiAaLFkLa8o4aPTcie3aMdYPLBrWxTlh86T2cq9c\\\n\tUps9BstgGcREg2UA0WAZQDRYBhANlsHS2vL/BRgAoPt28wv5YoIAAAAASUVORK5CYII=\\\n\t\")\n\t-- blink@2x.png\n\tR.duckloon[2].blink_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAASIAAAGaCAYAAACrJ06uAAAgAElEQVR4nOy9ebgtx1XY+6\\\n\tveZ7izZku2hCQs2Vi2CDaW55HEDA/C4ITwEfIygJmS90gg+RiSEHDyMhBI+PICL/BIXh4v\\\n\tjEmwGY0J4IlBHmIDxpPAA5Y8SbakK+le3XvPOXv3en90VfeqVdW9e8/7nLvX9917urqqa1\\\n\tVXd/32qlVDOxFhIxvZyEZWKcWqC7CRjWxkIxsQbWQjG1m5bEC0kY1sZOWyAdFGNrKRlcsG\\\n\tRBvZyEZWLhsQbWQjG1m5bEC0kY1sZOWyAdFGNrKRlcsGRBvZyEZWLhsQbWQjG1m5bK26AB\\\n\tvZyDrL8E9elj2/9TlvWXJJjrb0BpFzbpHl2MhG1k4O7nlpOPwG4AeA+4FnAmVbe9j/6LdG\\\n\t4Z1bf3xxBTwE0nct68Yi2shGMqIg9H3AP/XH1wF3An9s0xsA/Q3g84B/sLgSHi3Z+Ig2sh\\\n\tEjCkJ/kwZCQa7uuNQBPwb8f8AN8y/Z0ZUNiDayESUKQk8F/kMmyQl7QllDPwCEwD3zLttR\\\n\tlg2INrKRVLaAnyUDHeAxHVAQ+grgu1TU+xZSsiMqGx/RRjbiRVlD3w48uyXZ2cy5JwL/jz\\\n\tn3J1269h/8T8m5nWu/sbuAR1g2INrIRmL5LODVHfGfCAfKGvpR4FqVZgT8aVsGCkJngG/x\\\n\t6X944pIeIdl0zTayESJr6N8CJ1uSPQo8AhGEvgz4Sybdh4CDXAYKQs8F3gP8IBuDYAOijW\\\n\txEyQuAv9IR/2cA20/7nRDepbKGrNwD6RwiBaEvBN4M3OzDvzxFWY+UbEC0kctelDX0b8Yk\\\n\tfT9E1tDfBW5tS6dFQeilVOA57sN/yhh/0uUgGxBt5LIWBaGvBF44JvkH1PG1wD9uSRcN3S\\\n\tsIfS7wqzQQAvgVuLwd1bAB0UY2AtVExFf3SPc+KeoR/e8FrmhJV1tECkLXUkHojEl72XfL\\\n\tYAOijVzGoqyhr6FaQzZO3kVxEqrh+m/pSGcnM24BrwFuMecfAt7aQ++Rlw2INnK5i6O9i6\\\n\tXlQXHH7qM4BfD9wLGWdB8DzkNkDf1zKt+QlV+jGrq/7GUDoo1c7vKVVL6bcfIOimNQHL+Z\\\n\tajV+m1TW0Km7QvjLgO9uSfvLsPEPwWb+wkaUlO+80h8JlaFA9VfveOFcE+8gjgzxqDiT1p\\\n\tl0OIo775/fTfQU1S37Jz0veRfuGFQr6rc70r2fwelw/ESqBbA52QN+q6fuIy8bEF1GUr7j\\\n\tNBFgkOYQQASc2wJ3NchVUFyJ40rgKuBKnLsSOFYBRa5UBvUpwOHcOZ/fJXCXfObncDKC4h\\\n\tEcDwFnce5h4GFwZ0H2yvfekAEUEdSKp31yvpVRyV8APr9n2neydfUTgW8ek+4e3C5Ud/T/\\\n\tAte0pHsDvgu3kQ2IjqSUb6+4kIgATnageBpwG7ibcXIT1cS6m3HuZqrtK4rq+hKksKDyxw\\\n\t5cSdS7D/GVnqYM4iLjqMlHAHcBx/3AfTh3H3BfdOy4F+FCec+NxFaYA+connrvxPWjrKFJ\\\n\t9gt6F/D3aPcNBfkAxXGAbwO+uCPdZtheieu7g9pmh8b1ldHbTpszgnMMoHg6yDOAp1Nt6P\\\n\tV0HLcDgwggTr0DzroNhZpLdRpttfj4XNh23aJum84n12WL0t8Lxftw8n4o3ge8D1d8AOR8\\\n\tfa3q+hW3fZQu8SC6k2qJRR/5uBx7+h3Ax2kfsg/yBE7ddSXwbuL5QlZuBD551EG02aHxCE\\\n\tsKHqDyRzwPeAG454E8B8oTFRTUy1AbKsqaEdfASEoDowktIx1OLCNtMRFbRrXVpPOu09+C\\\n\tK29Bii9t8i7BFffi+J/AO8C9FccfIFwoP/zZjU7nKJ784fpuprSGfg/4JsZD6Cyn7noIeC\\\n\t3dEHonsJC+5mGVDYgOgYzeekqFJDTCG4Evolq39CKadUtVKnE4JzTAmQVGPq2GEdvGohGQ\\\n\tIQ1U5g6jKk8pVN7lLVDcguOrEQHcCMd7wL0NeDvOvRnko+VHbvP5OcqDi0h5/EnAX+tV+d\\\n\tX9/T7wnT0Svo9q2ceLx6TbjJYZ2YBoTSWGD1CtCH85uC/CySugfPq42RcTwyi6WMPIVcdn\\\n\tvhAGV1bHrvDnt/zxAAr/lwLkwJ8XkH3/bw/Kvepv+Fc+BuWjMHqkuqYPjIKVFiyj0HUUBs\\\n\tAzceUzofhWf92HcPwWuN/G8Sbc8CwVLLpGvuKq2Ln5FAb0WSlOfAL4Fz2y/NW+ui8X2fiI\\\n\t1kgy8LkaeCXVNhOvAHbqmNqvM34qmIvSmuddP9bg17HxKv/iBJz5AihOghsoGA2qfwwqYG\\\n\tSPK3g5QtqiAVjIS/aR0aNQnq/ANPo0DD8Nw09BeUH5jIr0/l2w1rTPKMQFH1RR4twfjC5d\\\n\tfyd+LL6HPCrHnv5h+oyunbjzHopjTxuT6l78QtnLwSLa+IgOiWTg8wQq8Hw18DLanlHdlW\\\n\tqxaHTSSSwj3UWD2DIqL8C534MzL6faAUM8QHxaR9V1yh4DIlXPSoJiaeIQcDu4bT9opwHl\\\n\tCigvIsNPw/CBCkwH98HwY1QTk7Vl5Lt4oLpwYS5TWcjw1F2KvuNlcPoeKt9bt2xdTQ8Iwa\\\n\tZblpUNiFYko7v92kcRcHKMCj7fAHwBfWe8rwJGo0fh/Nvg1AupezdqSlIMlq2aNxQCbIGM\\\n\tEB/n9DWoPCygECiO43aeDDu3KwtM4OA+5OCjsP9R2P8QlGc7YSSj3DbUHfU2uK5tk7RG3B\\\n\tbsju+5edl0yzKyAdESZXS3nrksAHeB+wZEvg43dkQmL1PDyFgFYk4lMFLxBw/AhT+Ck88C\\\n\t8a9QBCM/hC/DBhglUAxBBj7tEHFbOG26O/Fg3mqc3DKIy+lE6Slg+8m4ndvglO8ClueQvX\\\n\ttg/72w9z4PpqpupNxBpLdrCNw2FMeePjbdzk1VmcfLo8Bb+hfg8pENiJYgo9+/hsppK+Dk\\\n\tNLivB74J5M4qRRiOnlLBVDCy5AmnWkbS7KjZ3p/B4BQce0oeRhCDBWJjLILRyJ9sIIUb+G\\\n\ttDnuo4gt6wgZUDitO4E8+DEy+s8hh+Ctl7L+y/H7nwqe56tHW1dRWMq9DBKdi+tjOJktfT\\\n\tsoXs5S4bEC1QRr/nZ/cL4NytIN8GfCNwJu2PrAJGlhxMBqML760c2Ds3+a6P7VINqrxkGM\\\n\tPIodIOETeILSO99CQBjyirKqT13b762q0mfusG3NZNcOpLKa7cRi79CXLxj5AL74by8Y5a\\\n\tctUIYac42L1lTJpINrOpW2QzarYAGf3udf5IwMmLge/A8VVAAaUZmaq7aV5mgBGko0ldSe\\\n\ttZ0Jl3QI86Rfn68/UUom04/RLYuopmJKxoHM0UzeiZ2/J5qvh6BG2Ai0bgdB5t5woq6Og8\\\n\t1SgdBWF6gbBLNegYyghy6cPIhXdWUBqZrwQNrkC2b+yuwO0nTOIbGlJ9svqRywlEm1GzFc\\\n\tjod5/gjwTgS3Du1eCeV1kSNI1bNIxWbRllnNehOH0sIzmonNdnXgbuOOlIWPDzhG13rDUD\\\n\tYd5QZRnZQmzV8bXvSEvomkW+I201DWle81LlNcAdeyru2OfANX8dufRB5PzvIxfeWY3QDa\\\n\t7qrDvcNuyMAVUsb8F/AWQjqWwsojlIAyAAvgR4NUg15FtXW0kSXgPLqHOOEfS3jLauhdMv\\\n\toJpx3WYZBQvIWDVRmgGutlq2lDWlLKJg6dT5O9otowHCNnA8jscRW05hMuYIufBHlHsfQf\\\n\tY+mq8TgGOfDVttC+uz8veAf385WUOwsYiWIqPfuaE6qJzQHkBhzklYtoBqzOtnGXUO64fi\\\n\t9LGMhg9WPqMTnxs7j62jGbzFoiwd49epVWhHdH1dyFeNyMmWT7tl9ITjHXCj2PkdpiPU+f\\\n\tk4BriTz2dw6iUwOkv5+LsoL7wLyotNOQYnJ4UQeP/QRvKyAdEUMnrLE6uD6uV9HrgfRtwL\\\n\tqwabkcsFRnt/BoMrKr9JFkD62ICBIbrbJj6h09ckzvCQV+ieBRiJKjc4LiGMgJ20S1hVQA\\\n\tU1GVXn3E51X4OrKK74IoozfwG5+B7K829FDj4FO739QkH+GOSjs5m4R1s2IJpARm95EqoB\\\n\t3AruXyLyV5sXuiCGkWpFs8CIFsD1kWXD6OJ7YHAGtq5sARANDKL5Qqab6q0fwXcfZcvEby\\\n\tmoDFKg1boqeDkpK1AxQNwO1eTKbSK4hVnickA9yidU3cUTz2Jw4tnIwScoDz5WAam3lK8r\\\n\teBsD9x7k4efirn7HBNdeHrLxEfWQ0ZuDU1LAcQbkHwLfTr1JlsQ/dollpH+9IQJLL5/RjP\\\n\t4iINk3qC3ZLD6j0N0pjsPpl0KxS+QHqv1EwT/kMr6f/IhZ9f6lI22xTyjjO9JhG0+BuG2q\\\n\tGeJbNH4mhytKcNvATuVjcluV/mK3qoTRo5SX3k+5f1++npRs8Uufcu7+b8cV/x0RwbnLBk\\\n\ta9+bIBUbeM3nwT/kVzwF/Hyb8BrktevmSx6GUOo63r4NRziYbYW4f2LSw0tBrntouG7S2A\\\n\tWhzaNcBUfA20rUYPWz7eA8eBdnhXf08g7gRhSxGHQ8pzlJc+QLn3Z+QsV8fjbPFf8H3Eu3\\\n\tHF/w7yh1XY4a56+9jncZhlA6IZZfSmm5qA4ynAj4P8+RQUSjYw8sf+/LHb4djTFAxykCky\\\n\tsHBoAEVzjbIwUnONcvOO8LCLzum87XV2h4Atlc8uuOOIqywjVxELKc9TXnw35f69UTUV8j\\\n\t4G/I6vLweOElf8OM59LyJnjzqMNiCaQYZvvBkQnJMd4LuA78WxW8VKBhRKZoZRGOZfEIwW\\\n\ttX1IlDcNjE7eBdvXq4beNqxvAdLW9SpwETwCZMx0gAQuZlJlBK9cemsxhWsDJLcUkAo/Gb\\\n\tNAhmcZXfyD2oe0Jb+Kk/toti7xvjRXfBrn/h7Iz3tA4a48ekDagGgKGb7xVlSjf7Fz/ASU\\\n\td9QJ6irYwKiKRMXZvPGNbwdOvxiKY+SgEgMkzAdSllLk82nSuqzFY2GXO2etpRyMUl9SbC\\\n\tmpcrHlraTgD3NAQXnwScoLb2dr/wfBjdT9RjAC534Dx7dQfTQAnMNd8baxz+WwyAZEE0oF\\\n\tIQCOQfnPgb9PfdsWFGH4d9kwKuPjwwKjravg5PNarCF7rCcnWod2PGnRJdaTvV7nnztnum\\\n\tLZbl2bL0l1H2uAeSDVEyZLuPgL8PhPAOeqPIpQhxGMzuH4Bzj3n2pn9hGB0QZEPWX4hif7\\\n\tIwEnzwZ+Bvgc3eiXDiPtL4rykfiadYVRbpfH3SfD8c/xiSeBUc4yCk5nBSTrfwqzshPLKA\\\n\tcv2wVsg1LH+SjNNhWUfD2Uj8LjPwZ7v+bvJQsjcPwGzn0jIp84KjDagKiHNBCiAL4LV/4f\\\n\tRHOrNjCKks4EowGcfHa1FKS3ZaQbfGb0KxreD3AJXSZXAcFp8GVgEi37MP6htrhkFM525Z\\\n\tSOOs7BwXvg/A9AeW8XjB7GuVch/FJwcLsr3jr22ayrbEA0Roa/fRt+/s+TqKyglwMZULTA\\\n\tSPuLwIDCyAZG/vRxOP1Cqu6LtVYsjDRo1DkGUGgg5GAUrJTgO7JQM1Bq7YplumnYa82OAr\\\n\tkRN+3LQuDCf4GLP+nfAwWjIgAUcO7/BvcdIBcPM4w2IGqR4W89hbohO74Q+BmcXBclikAR\\\n\tN/oNjGaE0fZ1cPLz0Y7d1IGtjy1ELIxiK8Q5k19uPlHOd9TqpNY+oQCdHMjaunDBMho0+T\\\n\tCA0Ufg/D+D0YeoYVR4IDUwei+4vwTyQZzDnTl8MNqAKCMVhAAoQP4JTr6P0GI6QbFGMFqD\\\n\tFfugYZRR2DXHiAKOP9VvKGa7XNoyCo1fwSczepZaM4MWGGXg0JZXDSet03evsP4mD9Qw8x\\\n\tp1bLt21rJiBBf+M1z6qeq4tuh8JVYwOo9zXw/yC+GcO314gLQBkZHhb30OvmFfBfwU8GXJ\\\n\tMPzCYSRpuz30MMpYRTAGRltw+rkwOE0DI29tFL7xUkAR5u2ELkuuyxT7igLYXIsvKev3aY\\\n\tWR0ZndjC1AJwBVzzXKwND6mihg+B44/31Q3t8GI3DuB3H8I4TRYYLRBkRKKggB8HQofwW4\\\n\trYldYxgl3TIVPuwwGpzxS0ACLBSM7Bq0OpyDkcvApDqO5hplragAlZw1ptPb4XttEeWuyX\\\n\tXTbJzyLTEAuQCP/yvYfyON89pXYgOj1+P4OoRHDguMNiDyMvxNDyHHlwE/B5xO1wStGEbZ\\\n\t7UMuAxjt3lptvq+H6SMYGR9P4scJx7oLF7pVwTLSaXMOam0tpd28PIyMj8j6kmrLyMLLWF\\\n\tGJE7yAS/8NHv9RcAcxjAoXKvtPcHwpwkcOA4wuexAd/I87CA3DOfn7wA/hdIuYD4xcKygu\\\n\tHxhNvy7NVUtAtq6kcVz7hqthFPlicjDKWUa6uzTA5XxK+ro2CyfnfO6aU1T7kiys1N/Ib6\\\n\tTKEYA1fD+c+0cgD7TB6EEcX4lw97rDqC9fxv/cHUI5+B/hU1Ru4Bw/Cu7fAkX3bg2O+qN8\\\n\tEB+H+Oi4Cjf17KtSTPo6n0x+EUNyjyLk0aajMOVsytXEZ7LtK3Xe3fshSZQuQz4xedTpBS\\\n\t6+D8oDqi+1ltVfOfDH4sMjYNSEKan2ovZxMqzykpFP68+XZX1OGKm0IT5cV/r8bZ4jpXsE\\\n\tDFV5huo6lUZy58s4PeqeUOVnWJ3fugOu+EkYfJ7X5+sqvGwi1yK8AcdfRkDOvaDz+RwGOX\\\n\tIW0cFvPANvbZwA+Xngy521SqyFEUmHZeSsxbEMy8g6r3M6DrlltPNZqouW8wdpy0c7qG3X\\\n\tTMdry6TxEzlr1WgfUuIbarGMshaRtbC6HNpat7YAjWUkAhd+CPZ+CTXhsXnZnCtxfCvCf8\\\n\tQ53Om7O5/PKuSy7Jod/Mad+AZwFfBrOHmh6p75VD1gZGFwFGDUto1tX1kojFz11djBlQpG\\\n\ttgsWul4WRgMigGVhpKDiiqqHnnMwuwwMIv9QV9etzb/U0sVrPZfp2l38Wbj4Iw2EYhjhtx\\\n\tT5F+sIo8sORBWEALgJ5PVAdcJpUPSFkbGK6nz0sbE4QtQGRtPBqDhRLQEptn2chpG2Nqx1\\\n\tohuth05hHcs6n+qv6wJLDkaJ0zp3bdeKfW2FtfilsnONfHj/LfD49wP7bTD614h8z7rB6L\\\n\tLyER28/nPD+/7ZwJvB1VSq/BHBn2P8Ndb3UovxF9X5pHna62fyGUX6MmWq40xUX5/RLP4i\\\n\tyPjNWpJN4zMqL8D+fZW/CL/0ofYHad+P9hl5v1F97NOXwyYtI5OPxD6jyCekjoNfR/tzJP\\\n\tim7LXhOMTZ63RY+bNsPpi8UWl2XganfxQ46e8B7TMCke/GuR9ABDn3wl7PaZ3k0IPo4PWf\\\n\t64/c7cDvUs8RyoNjrWGU6BsHo8KE/blWGM3ovK7LON6ymgpGex+rgFQexOCpG7xyaJfa6a\\\n\tyhkYPRMIaFVOfFOpQTB3VwnIs5pwETIKhhlAPWkMhxHYHK/I1gpBzfW3fCmZ8Ad00GRhxq\\\n\tGB1qEB38em0J3Q68GXHm05sLgJGWXjAKJzJlyoUPA4yAucDI5iMClz5M1fCDVdICI8TDxj\\\n\tfc0o86RRbQMLWatPUkI8SOckUWSrCgDkhgIjq9HpGTDNAyaaPRM32vLelCeHArnP6PUNxo\\\n\tYFQffzfO/avDBqNDC6KDX/88/MtdQQgqCHUNu88DRlkrqQtGOVBYwC0CRjafOcKo57A+jI\\\n\tFRXQaVz/BROPgMeRiN4nMIlKqhlh44NSw0YMwQuspHZIgkXa2ctRQgoy2sTDprNXVNC4iG\\\n\t9w106nPhvA8ProfTP9YFo+/Bue85TDA6lM7qg9c9EyrnrodQeWPs6M3dU97ZPLUDO+vM7n\\\n\tJgq/yc1medyzZPHR7nwLY6gjM7X67VLJLNOLDrMvh83A6c+jyqDca8Ezia8OgdufUKfEe0\\\n\tNUjhHdg5h3ZuFb6aGOmimdLKyZ1dZGuG8HOLYbOLZHU+ekV/EZctcWKbKQnlw3Dub0P5Ce\\\n\tPAro+/GZGVDu0f2VGzCkIA3IST3wNuqYKmUa0ERjb9BkZR0klgtPtE2LmFZmhebXIWjTop\\\n\tOOmtQQoz6hR9SUQ3eIedpe2S0bq2UbLMaFcEqADQth0iLYTs3KMcjMyIXvkQnPs7bTAqce\\\n\t6rEfnFVcHoSIJIQeg64G6Q2+NGNA5G7VbMkYSRvYdDtZdRASfvrIb19er72iJyGWvEGVBY\\\n\tyKgGnMAotlZcznJqhZLWMyC1kCxkrGWUsa7sMH5yrMpXfgYe+yaQB3MwuoRzr0Dk91cBoy\\\n\tM3fH/wumeFw9PAbwC3gzPvsvF9dC7TCPHz9hnZ9B0+o0jfOKd4l44Wn1Eyeqfv0fi11s5n\\\n\tVMLefTRD9sr/Eg3va0ewGJ+NcRyLd2jXPqPYca39PBJNC7DOZu3zCXrbHNRqKkDiCFfHud\\\n\tGzoCc5Nr4kdy2c/g/AFSg/UTg+hsgv4dxnw/r6jA4FiA5+7Vn+JXU74F4LfH4Te4hhZEfS\\\n\tWucY9dFxBGE0fKRyXtcjTGokLIFRSdTQo/N2qN8CqCSGgngYlUq3cZTXI3K5kTbtaNZltp\\\n\tAxI3DRKJq6FnusgezzK54Ip38YOE4GRteC/Dq4M+sKo0MBIi8O4T8Dr0gb6jxg5A9bYTAr\\\n\tjLQOld8GRplIdbz3MT8apkbPksaroWOHwRU4QoMuDdCyw+xheF81djFQiRa6WpBo68VaVB\\\n\tosOUhlro1gVJKOqI1g8FQ4+S9BtkhgVPI0kJ+u+myzPOTFyNqDaP9XP983XPdq4K91zseZ\\\n\tCUbaalEN1eaZ6OwLo7jRTw8jG54SRi3lWg2MMgrF51FegOHDBkahsRrwJDCy1pEGiO3G6b\\\n\tz1bgBqaD+yYMp8XslUATtPqWsyY9vKfX2t6gbq+FC+rbvgxN/39ZdYRl8O8k8R1m7F/lo7\\\n\tq/d/9dn4Gv3rwH9xkXM3pMo4pKd1YJsh+MiBbfNMdPZ1YFsdKj97T5tdHqsyFCfg+NOALT\\\n\t8070iH2PVoWnAkq7hkXZpyJNu0eh9q42B20boz62y2zvECCKN9XZ/FDmH7Zdoxa9ESB7Zy\\\n\tYl/8Mdj7Of8MlQPbOcHxZQivx7HwvYwO/ahZBSEAng/yZmDXJQ3VhFHhucLI6vN5Jjo3MI\\\n\trLM0cY7dwC29fSDM0HGJlRMjscr6HUCSMNIQ2wHIxUHglILAxzw/mDuNwJnCykzGLatrlG\\\n\t9ZYivh7OfxcM35GD0UM4nonw8UXD6FCPmikI3Qj8ItWHxdWyCetMnmM3zcyUFh1eUDctyq\\\n\t93N61PV7/F6a7Da7CxGoR6zjivoSrDwaeofStlzhcUuim+6yKmu1V3q8JomBmFSrpwyjke\\\n\tZm/7fETsdaZr1TbrmgPiLp3pYo1zWEddRO3E1jrCfQmcfDW4J8XdtKqyr0H4ORyDdXEXrS\\\n\tWIPHB2gdcCN1RnnY7jKMFos8ujlhYYlfswfFDBRQyMtM8owEaBQI+WlWbkK/In6catHOFl\\\n\t7MiWyP+TgY6FlBifkXWU1+dzO0PmnN762ozDnRLccTj1z0C2FIz8wxR5McI/BEEeW72/aO\\\n\t1AtPcrdwEg4v5P4Llx7OpglNeXkzEwIt/oNzCCsYtk9z9N3PglbpSlsYzsmrN6XVqwqnKN\\\n\t3J4P1yuA1JaREDmYs9aMAUeSV2YkLBnN05ZabosRYznpexrcBif+DvWWs7XzGhB5Nbi7kN\\\n\tXDaK1AtPfLz/EvvPtbwLdI0ohhVTDqP8coU4bO7UOWBaMQ16bjEMBI9uHgLHHjRFkGxvLJ\\\n\tDeuXqpHWILOw0FAL/wJ04rwby0iI5gYlo3QGdjWs1LVRt81YdEn3ywLL7HOkAbn7Sth+KX\\\n\tXXtIHRAJGfxLnddLuI5cragGjvl5/jj9wzEP6vcD4PoxAXjtYQRhPtZaS7gSbPucFI62/T\\\n\t0QNGs8g8YDR8SDXkYPWobloNI91Va/YgiuYi5SY86qH8AKPEmokhIdbKscPxkZVkAaO7eN\\\n\tpS6lixn3TJ7EZudq7REE5+F7jrczB6BiL/EEAefX7fJzl3WRsQ+cZwHPhv4E7oRpXCKNdw\\\n\tp4BRpH/eMHJpnsvY5XFiGNnwGBjN+sM56y6P5UUYPaYslIzPSMMkxCXdntJcm7NmNIysZa\\\n\tThNvJzjXTXLtOlywIqByXT1YrAlQGUhU4018jrcsfh1D+u3okURv8YeCasDkZrAaK9X/Ku\\\n\tIOHfAf5bQPEL2w9G4USapg7b0erouiMCo0hfzwmPkY4uGM3YRQNm3uVx+LCyUBR0IrjopS\\\n\tABRhoUpssWddPCOQ0jdS63zIMSEQ8kCzxr6USWVdcEx0yXMecLSupiGJe//kzRM+DYKz2A\\\n\tIhhtAT8JbE/6KOclKwdRDSHcV4L75q4u03gY5X65u2CUaVTLgFGibxyMwolMmXLhw7DL4y\\\n\twwGp0H2YsskqrRiWrwqvHWDVhbRtqXpOItjEKjjnxLBhyJE9t2rwK0NMA0oHJOarOJW1JW\\\n\tuyDWWnM6L1XW498AxQ05GH0e8HcRWYlVtHIQebkB+E/VobVajiCMslZSF4xyoLCAWwSMbD\\\n\t5zhhEwNYyGjxANu2trRSQfF/xJOT9NmwM7wCtxgLfBLMAo5GtGtTRcNBjrfDQoc+vQNHRz\\\n\ta9xMWAOKEbANJ7/TX4+F0ffj3PWrcFyvFER7v/g8/zK7HweubWIWASMrY2CUSx+V53KAUe\\\n\tgWLghGs6zYHz2mLAw9WlTSDSNtRRmLqs2BXZqwBV9u7pDvqkXpaxgFGGbWoSVw0zqG7Wlz\\\n\tFlE0CqeOt+6E3a/w5UHD6DQi/xpAHnnedM90SlnZEo+9X6xv9Gtx/Fx1mOmLRG0gjncdSz\\\n\tWidWng88ncq925sENfUsajvrGaDa/bLo87N0BxiuijjPpjhYXzeTqSb6NF68oKcy4sz3DE\\\n\tG5r5fHLbxkbLQuKNzlyyxWyhyrIV58WAZmvcrVRPtKQjtxQkU267Fs0NQC7Bo18PctZfC+\\\n\tprsi9EeCsO3JVvn+qRBjksSzyuA36kn9XCHCyjTGuJ8hg3rG/zXIRlZNOPs4yCvgVZRroM\\\n\trTpWZBmNztFYOsE/FH75SyhFxRmfjR55skP7ucmHWd+Qtpq0NRZbIWKtqHg+InsAACAASU\\\n\tRBVNq6EaU/WE2ZbltkjVnHtvE9keny5SZDumOVvwjvq4stox/BUcyn691PVgKivdc+PzSi\\\n\tf0/okrWBYkyjmghGufxq3UH6wMjGH2EYJaN3+h5XDKPR474RBtCUxDAa0Ux4tN00f100+m\\\n\tVhFI4PzLlhelw7tHX3rfkbddMicCjfUTQaZgGYW5dmRuASOOlJkpkZ4LuvqPYwsjBCno3w\\\n\tV0GQs8vpoi0dRHuvDVPJ3VchfO3kVksa7g2jXs5rmGjCYx2/QhhF+jrAeeRgVEJ5ntofpO\\\n\tERWRhiQJKD0cj80+mDhaHzUwCyI1j1/kSxs1ja/EwRjIwVk/MZtc7Qtr4kbRmZtOHeTvxt\\\n\t1e48jMoSkH8Kbnu2B9pfVtQ1c6fBz56eymrhcMFI55nonARG9p4mnWM0mY5DAaPReaoGFq\\\n\t4JDT3AIDT0AKNc98bAKDnWMAqOZtWtikbENFSsHv8NtZaRtsaqU9ZPdt2a6aq1TobMOLSj\\\n\tuUYjGDwFdl7hz2nLiNtAXoWAnDVLPhcgSwVRYw3xveCeVEdMBQrWFEa2LJk8E519YRQ3+s\\\n\t0ujyCjPV8wBQLdVUu6WgEkI5pV+NYCsl0gBbcuGNmRq6ibFltdon1U0Uiezrdt+F6BpHWo\\\n\t395Hzmfk/x3/OmDHwKgE4ftxHF+GUbRci6i6oacC31GdaOmWTQQjE1w1jDgMMMrV4xQwGr\\\n\tcubSkwKpHRflOwGgrax6MsH+2YRsEogoHE19WOZd3oA4xsd1DF1QtaFRwUkMT6f7rmKLUN\\\n\t7eemAdTdszJT/gyoiqth90tpfEQu3NMNCN8Ggjy8WKtoaSDae43/ckC1vYeaSj4rjNJGtV\\\n\tIYiQWFvT+VZ6JzjWGky7xuMCovIvXnpgNEQndLW0S2m9YGo2GcJnFQl8QObOXs1k7iKC8N\\\n\towY2YsESdR81XIxVk3OKR5aP7uLp8lsLy58/9leAXQMjQMrvAnd80ZMclwKivV94UYDMlw\\\n\tNf0t2QVXhBMIrCS4OR1efzTHSuGEaJ2HKvIYxkDygrGOUsn6hRh3MZGOlrOcjASHexDHAi\\\n\tUGlYGBiVqWUjykpqn9SYg5GFl7F8oi5Y6M5py02BtDgBx/6SLzMNzIVrkPJVIMhDd83wIL\\\n\ttliV0ztwv8uzo4d1D0b1RHcZfHJL9pYXQYN1YrlXWCghEaJMHHk4FR3WjDtT4uWD2lhlHZ\\\n\t5BsByPt1onzscg1dFm35hG5ah+WTzD3S3auMFSQWUOH+dTfQ5HP8y6k+fZbA6DuBrUX6ih\\\n\tYOor1feFE4/NuIe3IU2daQpwZFHF6njdWS+M6HOgZG5Bv95bvLY9OopV7aEWCk4RG6YRpG\\\n\tGl62SxYabkm64ZpOpxp3Yg1lwBONspluWpvfJwKN7g4af1Li2NbX6blE9roS2IFjylfkWQ\\\n\t5yM8LXgiAPLsYqWpZFdIpqz5MxjUqFjyCMJt7lsQ1GCeCWBaMQ16ZjhTAqvcNaSl8HAQrh\\\n\tOFhMBioRUHQ3KgejYFENM9eOmjySbprtzoVrTTdLSqQ085MimGW6acnImb43MzfJjqIlc4\\\n\t9KOPYlVeelhlEZYPQ9LPDjjAsF0d4vvNgfue9AL2pNHLirgFGIm1bHkmAUFXbVMLLPLaej\\\n\tB4xmkTYYyQFN16zNMvJ/KYm+zCEqLvEPqUYeYKRHn6wvKuqmZWAUQdBaS1XXS0r1uWs90d\\\n\tGu3o+cz3ppR2n+WitJ+ZJst86drGZcV10ydQ88A+SLF9U9WyiI/AjVNcA/6G5UsHwYaf/N\\\n\ttDpM9S0CRl2zyrMw8lHrDKMua6uPZGGkrBMPg/ZumgdWtBVsgFHwpRzE6aX0sPNWlmgYaG\\\n\tuqA0ahwdefvM5ZPk3XS+ryHDT3Z0fFbPerThOgZH1NQ6PHWktDOP4Xqb6PJr6Kaxj9HRDk\\\n\tM/XnvuYmCwPRpf/+EgBE+G7gimyisTDScSp+nWBkG9XcYeTSPDthZJeCqHOTwCjS1wdGNj\\\n\twORswmSZ3orlIDnaoxSxNvgRUslNo6gbj7otPr7pQCg56IGDV+UfG6CxfidPfQdMNqGIVz\\\n\tB0qP9v/YY+1Dst00ZX1FekZxGd2VsPPC5kE1ltFfBHfrIobyF+wjck8Evi1p5Fo6YZR7ca\\\n\teAkVbXC0YtOtt0JNcdARhNuxQk0tEFoxn9RXUZg1WkYREfdzqwIxgFOKg0WRgdNNdn/UDm\\\n\tb+twu4ZIG4zMBx0jf5HtmmmrSncdrc4h7RaRz/fY/+KvwUMToHRI+a0gyKefNePDi2UhIL\\\n\tr0314cWsC3gzsGpBaHlkXDaNqlIL11ZBrVMmCU6BsHo3AiU6Zc+DDACKhhFC1+DccBRj5d\\\n\tAhrt39GWTguMggNcDhRANDh0N20U55GMcNlum7K4TJcrhlEan7eCQldMQ8n6mWyZ/N+tW2\\\n\tBwew5Gr6Ke+Tg/WaRFdAUi31odhkYXojoaFPSEkQ2vIYwSmTOMslZSF4xyoLCAWwSMbD5z\\\n\thFGdr2rYiXPaw6hsB1VkueRgVGpnuIFG4pQO12qrx4StNZKct4DSlpECiZ5bFPxJka4A2F\\\n\tGcNmsJGUgd+8KqKmMYXQvl18y7ezZ3EF36ry8JIPlW4ExT4El/fW2aDqtpqTCy0gGjjqkD\\\n\tTfw6wMjmM28Y2RX7VsccYFSv77J+IgUfRMFoFMcFeESjSmWcbz20rnREXSLdLdLX6u5Rbk\\\n\thdQacNUp3dtKE5F7qO+npjPeWWeVhLbvd54E7lYPQ3QJAHPm+GhxbLgiwit0vVLauCCkYx\\\n\tSPvAqCX9VKBIdcxll8euRrUyGGkZByPrLzJlzOpYMxhReEU5GKnjGkbBarAw0n4W7TPyjT\\\n\tOBke7uKJhFDmxrKeluWsbHpOETzVsKMFJfCkl8UyNTJjN8n8y61oCyFpKD3ZcF+GgY/QVw\\\n\tN83TKporiC7915eGw7+BcEN1OCuMunwtY8L6mnnByJYh0h2kD4xs/LxhZNOvGEa6DNE9zh\\\n\tFGJSSWUeRUbrOMwsUBJOH4wJfXWFalHjkTYivEpw3AkhHx5vu225aDUYBezifUQERE56st\\\n\trjbLyFhDSfdM5+XzOebbdGi0FYwcIn9thieVyAIsIudw7jsB9VKtCYw68lz59iGrhlGkrw\\\n\tOc08LI3sPcYeQqJQLRbOjMKFoAStWm2rppIb2ew6Phpa0Jlbaem4QCVgBcpttmYaStomip\\\n\tSM6SGVUjgnW+ev6Q9gdpayuUSXcRM2vVQnmK65CBX5lVW0QlwN9EBLn/z03zsBJZRNfsFQ\\\n\thPwbU03GXAKJdfVJZ8npc1jJLnZPQn5ezSsSoY+S5X6HmFBqUtF9Ntyzuw27ppupsXGr7N\\\n\tc5iZDqCh0tI9qrtiBkhtaUXDSFtUxuHcajXpblsMt9inNILdF3ngOQ2jO3Du2fPqns0NRJ\\\n\td+/mXh5alGygRWBqPeoEjzXA8Y2bK0+3wanZPAyN7TUYCRt4gmglGumxYu1N0obfWYbp7t\\\n\t/tUw0nqV1WOHzXMObA2tNnCZbly+m6Ytn66Jl/qf1lHl53bvAhnkYPR1Ez6kVpmzReSeBH\\\n\txFHYwaYJ3GXrOBUYc1t767PJKpxylh1FKuiWFUgyDAQwyMrNXTgClxYGvQlNqKCEALaUJD\\\n\tVzAKjbm00NBg0xDQ3bRQVuXXSSwjbTV1WUYhr9x6s5Cn9ivp/JTV5I7Bzp+jdlg3MHolIs\\\n\tin7pzgIeVlLiC69PMvC4evQtxWFOnsywhVo9Fv2DrAyARXCSOxoFhXGOXqsQNGuswaRq1z\\\n\tjEI8YyRYQ8RQqC0YqLtKHXONqo3VyjivYNWUusG2wUhbQbkuXg5G/m+pABH5n0RBJQZPbt\\\n\ti/+Yaa6RbaWdXWGrNziWzc7vNASgSnYfTZOPf58+iezcciqsoxAL65ChswHAoYpY1q/XZ5\\\n\tDAGTZ6JzTWGUdMtUeGYYSfxPzHEEIw2c2EqqLhuadP6f3ZMogpHZ0TGAIAsjY9lEfiljRY\\\n\t3rptmlHOhvqNlumraErH8oYyEpGLmdp4HbhjKB0SvHPZk+Mr+umbgvBW5SYRVHC4w4tDCa\\\n\tepHszDCy+nyeic7pYBTlNwuMElkwjGrwhExzMPJdoCyMmuMGRqh0CkbJUHz4exBDp4bRyJ\\\n\tzXcNLdMXU+GqpvgVTUjYvBImFZSCeM9L/M8hANI7Zh5xm+SiIY/WVEkE88o+PhjJeZQXTp\\\n\t516Of2H+1/wLr17ABEYhbkEw0uEZYJTKEYAR+UYvGgyRjglhtPRdHg14sjCCZsKhglHi3w\\\n\tnhocknQCHEhUZOcz7ax1pZRJHloq0jD8dkuYi+LgejNktJAyrASOseEnfHMtuKRNaY8hVt\\\n\tP1PVYw2jO8B9zqzds3lZRKcITuquJQeLglFf+EwJo3Xa5TGJ73z+HTBK8jzMMFKWUG35dM\\\n\tBId5ta5hqlK/YtjEKjFgUUDaNRnK+1ZLQfpx7ut5DRMJJYb2K9WNg1Ph/RS1dqQLb4nRJo\\\n\tNYByO3eADJp6bGD0ZbNhqNr9aB7ySuBYHRIHTrdk598laWBkwFM/aAWqOOjT5HTUgMvl6Q\\\n\t/bwjq9iHrn47CIw7l8dTflnFRHUT3wELb1FjlhmzpsymL1FVQNhXweVod+LnXaoCPck88z\\\n\tqceQz5h7lAKcLVOtJi63Dkup6sKpC3R8LjNJyxDpUnUgJbhQZx5wrqzzFwqc83AJYzB1mg\\\n\tDdIbiBP/b3GupVqPKv/47q8wfD6h/FgAt74MQhTri4LzigRNjbFygqTu0PBeccwxJGowJX\\\n\tCMePCbd9lrCzU0a3XsPWiaqOAQ6JH5e+JqlCAdmi6coCbhd2bof9P1H5lIgrvhiRHy4//n\\\n\tSKm96ff9ZjZCYQXfrZl4fCf10SKUWmUUECo+QFDy2gCq83jJrr1xpG2R+GLhjZe5o3jPQ9\\\n\tmXJPAqMEupPAKCQdByPnX6uhh5H4+6Epb3RLRZMvAmxFULr7jx3//bePcf/DA5xzFMWAoi\\\n\tgoCodzhT/24aJg4ONd4aLjwsedOun4W18x4sYbJLr16J2IYDSKH5fzD1of19cMQQZx+u1n\\\n\twP4HfP0HGJcvxRXHEbnIlDKPrtkTgFdkY5KRngAYFDhobrJp8VG4s/uZ1ZFLZ3WYMCos7e\\\n\tHDueWsS/Ps7KbZ2dfqXHKPpgy5MgPL2+VR1D9Iu2mliStVGuUDUsfNLo/BgR38RLabZhzY\\\n\t9TVVuj/+oOOHf3qXjz0gjEZV968sR4xGIx8uKcvwT5CyZOTjpZT6uBxVaUbliHPnS37m1w\\\n\tuk/i6b9kOZLpf2Gdn1Z9nROvt3iNt+qqre+sfkGFK+tOWB9JKZQOTVfjXSYVnNHUYZ0HTC\\\n\tKPfiTgEjra4XjFp0tulIrjsCMJp29nWkowtGY5zXWRihGqq3GqIZ1QFOpTo2MKpBQwuMlA\\\n\tMbISyA/ZW3bDEqG+CMRh44UTiFUSllDaBROariRmUdfvgR4eP3C6mvR/unmrj4G2qh3NZX\\\n\tlNvBsYTi6uqfBGuwhtFMG+tPDaKLP/sFXr97Jao8lXS98CH+kMFo2tnXvXVkGtUyYJToGw\\\n\tejcCJTplx4LWAkJJaRPpeFkbaeNIyM81insw7sUqUph3zsAWkAY60fsRDy1o+CUVmWjWXk\\\n\tgRTCFy4FK80O8Ye/seUjiWPcjpJpQGkolVBbRRGMvgiE8r6ntT2MTpneIqoa22ngpZI0gF\\\n\tz6JcAoLZ860acrcBnCqGuU01wfTXiMdFjALQJGNp9JYOT/jptrVI8+tcFIbTlrwRXNEVKN\\\n\tWS2qvepMWUElA59s18xbQqNRmcCo1N02Ea6/etiUKYKRXrCru49hrlFmKkC0Yl/n48PbT2\\\n\t0g1MDoGeCu6YZAu8zmIxK+ENipDtcARskLb9N0WE1LhZGVMTDKpY/KcznAyC6StTomhZGx\\\n\tjOpfdj1sri2d5ji/y2PIp1RxAUZV/MufdZFSYhiV5YjSw6Tqmo0iGIXwSHXFNIxKKXn2Hf\\\n\ttceUpbNQFGdisQ23301pFe2lHHhe1PQj6NBeW2b6UeTIhh9OJpu2dTgejiz3xBOPxyrVgC\\\n\tWPoWZgYYNXIYYZSz5joaVcc8piZ+ETDS0gdG9rplwKiIj/vCKDfXSMOohpYBkl6X5icNts\\\n\tNIL5Qd8cXP3+OrXnoJ8TAKXa9SSsrRKIJPZQmNECEKOxF2t0fsbA25/uoRX/KCfb7mC/eI\\\n\tABTNQxrFZdHdR91Vq2dQ650BDlSaANchuB0YXO/rM4LRS/o3/lic9JwR6dT8Hg+iAvgkUJ\\\n\tWojnbU8xXatZowNC+FD+shReCPPrrHH967x4V9iS+rJZdnGn/FiYIXPm2XJz9hkNHfEtZ5\\\n\tRO0sTpPOM1Jl7asjyqPs1Gd1VPFiyhLXY3bI29k8tE6bvglX96Ti9T1F+dg8x+mw9VSqYx\\\n\t3W99hRb7Gy+G89VcT/c85HOeoh6jqNDlfHrghxg+h8lU8Ib0XhR84N+NhnBuC2cM5xfNcx\\\n\tKBy4ghPHBzhX4FzBiePVOecKjh8LeW41+gpX5Y2DYlCdo1DpwvGg+odP7wr/b6DKPvC6qr\\\n\t9VXv446HT+Wgrk8dfDxbtVfRXgeDvwfIDi1g9WT6YnX2aZR3QXAULQWDOu+lV2dg6HlmRe\\\n\tC40lhDRh/yv1fb/wMK95x+MzFDWWwsF3fuUZ/ubLThj9kg/XYs6Z+xg/z8jmmdEhqHobN8\\\n\tfIyFTzjLy1F80r0vdo5wA111f3pPLT9Rbl011v4+cZZeYYUap81LsTyphMeESlcc3f3Fwj\\\n\tQr4jYKD0lti5RlJ66Duo5tyUPl9vqblgjWzV4StPw5VnfP51w/f3FOYw1edLD4zC5xnmM4\\\n\t2gLMAdUC1GHVVldoOqHPVEy4G/D18vTpUFafLy1mB9q1GVDqt6YEj9Bdgtv6xU/BWuBCnu\\\n\twnEC4UKu5rtkFh/RFyVn1Hsn47po2S6UCTvHm95/ca4Qgsp/+EO//Bj3fmbUnOzbhRrThV\\\n\tn5XkYL6abZ9B3dtEhfh1k8bTfN3kN0j6bL1vr+6W4ZZEfL6mvDUowQH/wozbGErkmysZp4\\\n\t/5DuGoU47Y/JdP/sMpDaeSzEXSuh7kJFw+3qOFpiEsqi8tJr2rwTuz6XfLbab5a2fQvND5\\\n\tD/oaMcIDynu+HnZWIQKf/Qy5NI/cM3FYzMyyTwlnsuTVrEXlIK/O4H9hJ9WTBYSaC5jjCy\\\n\tZbHXzAoje0+TTnicTMf8YRQyCvCxcAojXsEysmmUAzsHoxoutMBIOboTGFmYhL9CPIqlYW\\\n\tSH3X35yhH1bpFt69Iy50SPnCV7FY3AHa/mE6Uwmmr72Gktoi3gBa2xc4TR45es/2B+0vib\\\n\tWmDUGxSsIYy01aIaqs0z0dkXRvFzmh5GNjwljFrK1Q9G/m9uRK0MaXIwCsCxMFJD5vU8oi\\\n\tZdY3HpSYfauRyuVU5nDaMANvvlkGgPbb0JvgdSFjzKgW3mH4meE5Xscz2CwY3mnRQQnj2m\\\n\twrMyLYjuAk7Ep1q6WjPC6M6bdqcs4nj53Ju3VWgeMDLBVcMo0reuMMrV4xQw6loKMncYlX\\\n\tF8BCMTr4/tXkZh5C1ajqEsrRykIhgJ8bC7+qctK70PUZsVlCzzqP5JeUC9r5GF0dYN/taU\\\n\tsSDybATKDz+5q8ITmRxE1TN72QRpZ4LRX37uSW6+Zl6bBDTy/Kfs8vzbj5mzs8Iovcf13H\\\n\tKWNM9E5xrDSJd5YTAK53IwQjV4BQ0PgIpluV0efd5q/VkDIw0hA5PIUlIznWsYHaj0eoM0\\\n\tMfnmYGT1NvOFdDewWaMWpisM/RC+WBg9FTjdVdM5maiFX/xp7x8SXpK+S47OJ+2YYjTNce\\\n\trYgJ/+367nx377Mf74vj2GIxXflk+HHNt2vPhpu7zqC075IhudyYiND0vQZ+/TEY+82DCd\\\n\to2lRuLeOcaNp+h6cTyeqLBh9Ps+pR9Pqgqjr7UhXuMeQz7h7zImtp8xompR0rthvHU0L6Z\\\n\tQOnQVA6aAIMFL78oSRsjp/h0iBq0e4RD2HAMQQV1ajXwUNbNStNu+fH91yRVy2UvzQ/UGV\\\n\tRscjTbjODxMfzktT/3X+qq5liLBFs3p/gNu6rvpxC89TSvx8hmcBv9NWyzmZxtQogJfEL7\\\n\tH+pbMmQRw9DYyuObXF937VVUqFhVF4eDpTiYO2XG3bYmTvY3YYpVLlUQ2BT6NjfWHU3NOM\\\n\tMMruZbREGOWeYyuMIB3ed8Tbh5SqjFAPsYOHkfoBBA8Cvw1HPQWgNJAq/NC9Gpqv20iYMu\\\n\tDDbktBR8+jMxCKYKTPDRHUvkYMYHAljM5WiVwNo2ciMhGIpvER3QacAVXYSDJP2L5rU3bT\\\n\t6ryWueWsjAnr9FafbrMds6OTJSu9dUzfTcvry4mjs5sW5dnomHrFvr3HpW85qzMKYBB/7P\\\n\t9Zn1HociHoLli6Yt/DSE8BqGc+q25a3UXyOmo/k88ndKtKdW09Gmcc1hLSeV22W2ZX6Ws/\\\n\tUbIDZOim+bwZ+e6Z/yEID13KO8ZUcCLTgOhZUSj6RQ2yZBhpnWbocCIYjW2oRwdG/ecYZc\\\n\tqQgGkVMApxbTrmAaPwjwyMNFRyMCoVjEKjVjCyo1316JqFkfEZ2SkApR7Gt05lBbrSQEWn\\\n\t036hHJD0QlhfhvqDjoOrfRWVqp64Y9Ih/MlAVOX9rPR8ewPLXF9Hzw1GyQsem+W9YSSZ+K\\\n\tXAyBR7HWFkYbByGNnnltPRA0ZjRcEnmWsEzcS/XBo/8lQ31FEcX0MGsg7sZF+hAAIzrF/q\\\n\tkTNlMSVzj8o4rragjKVk976uATWM8hApYXCVqQtA5BkA5Qdv6VG/lUzuIxKelbWAsj4RR0\\\n\tIabUGF6KxVFdI7Ut+HzyjAKEymcirT2lFRhRu/RaZcWkcNOKszp8OEW+sjDi9sy1nt3+np\\\n\tM5ppy9mRozwrlI9Uxwyo5rldIbhTTdrF+Yz0PZly63CXz6hrT+3mxjP1o+oEieslSaP2vw\\\n\tYqv48Q+avEkXVgh3uJbtfXl/UZ1WkKiLaELcz1xHF1XlT1Hfgsqp78+1LBa7vRW1xB5Bur\\\n\t0l4LXA083FGpkfQG0cWf+oJw+My4ohVVxjpovajrBb9Iti+MtCU0E4z66JBMOqvDhGtZAY\\\n\txso5o7jCorpXxIGH5UGH0MZB+Tf/XX7UBxnWPwJGFwYwnHZ4BR9KPRB0aY8DgYmeuyMg5G\\\n\tI2rHM/jnoiyuCEZCsy4tlE05sPEO6tJDIgJIAJhyTkcwCukVjDDXZ2E0au7LFyu6TsNWDq\\\n\toyAgzO+HsZNfdSLYC9E+k/cjapRfREwkLXUOjoAeZgNKZBO98olw6jTLk6YZR74aeAkYrv\\\n\tByNTX2NhRFyH84LRCIYfFYYfEspHM8/TiOzD6BOO0Scc/M+C4hphcLOwfWuJO94Co1wZc/\\\n\tfQd5FsVB9dMBo3koZKq+vH1GUEI+cbpaMe3ZKyqud6dMzCyPl7U1AQTwZH9ZwDpOp60DDS\\\n\tkBGahbc0Za6rS5Kqq48TGKm6t3lRVDAaPRLfC8Xt0H/kbFIQ3RmFsuDIgecow8jWxThQxI\\\n\t1qohX7vXRkGtUMMJKLFXyGHymN9TOZlA85yoccB39YMLhe2LoVBjeXuG11T4IBxSGAkc4G\\\n\tqNZhKRjV76aHEgVSOlyhu2lhqN815Qwr4mtLKVhNI1P0ApyfQ1RbNhYyQrPKXnxeWyouA6\\\n\tkAo8gi823Jdt2Kq2D0sHomBUh567ia1NIfRFX9PzU9X6QPL3nx4VDBKClfF4wmBQVJ/SwF\\\n\tRol0w2j0aWH4oZLRJ8vO6plGRg84Rg9swTth68aSrVvLqvtWLANGNp8ZYaTrPeTbCiMIpk\\\n\tYCI8SDxp9zGkbeUiJYTbro4vUGy8jXSVSFBVGXr95OZGCgZQCWWFgKUBpGxekGtg2Mbp3k\\\n\txZnMIhJuSx6SBkGUdoEwSq6dDkat5Upe+KBj3WBkpQNG456HOOSCMLp3xPC+EXJ+zvTxmk\\\n\tqBQSjTCIb3FQzvK2CrgtLg5hGDG0rc7qJgFLqFFkbheBEwMpfkYMSAxlcUYOQLEawmKapM\\\n\tolcxjBSWGRgJzXfVQrlC2Dq0Vb4iTd3UgFLxTmIYFSfV/QXLb1EWUSW3dTaCZcGoFRQ+0B\\\n\tNGInr2dR8YtdxHK4yszBtGubrsaFSZeyofFkYPDCnvLynP5kePHroIH3vMsTOA268SdgbZ\\\n\tZJ3ywOPwrvsdByO48TQ8+wYz830Iw3sLhvdWFnZxlTC4fkRxnVBcWVKcLGv/6EwwCvUyNx\\\n\tgpnQmMghVSkL4bVYOVsvAw8tDQMBKnLI/Q83BN2UTpDtfUMArnQhnCBm/6o4kWRr6A2hIK\\\n\tAMJ5uKo2FbpuxYmmXdVQc7ciIH96E+6pHx9Xkf1AdOmn/nw4vD2uzMQ8AtswZoVRm6wERv\\\n\tZexsGoBRTzglGuzLVuf3jJIRdHyJ4gF0vkoiAXBDlfUj5WNpv3tchje3D3x101tQV48ILj\\\n\tpTdPbi2959MVhAA+cQ5uOgM3nGxJLFA+7Cgf3oIPNKfdruCOgTsmzb/jUp0/LrjjJRwTih\\\n\tOlN7syMKrrxsJIvTv4+F4w0tfQ5F/nq7pXNg0ApbeMoN4BMTiuKaqFrZFPJgy3Bz2iIBOs\\\n\tqQPqIfboBgriETIhcmiL/aufs9Zj0waLSMPI3YiTbYSDPjU4iUXkgCfrcuXng80ZRhOtS8\\\n\tMAh/WFUYeO3jBS9yQXR5QPjyjPlcj5Ejk3ojwvMMrU8QTywOPUEAI4ewn2RrA7oVU0NMbW\\\n\twRgA5kT2HLIHPDqeDu6Y4E4JxdUjBjcM2fqsIWwtGkbmuUQwGsT5RDBqDKEGRkLt+K1hFC\\\n\twV7QfymdRQCF21A+r9qeuuHur6UVTkCjQKB1GcqpMafiqNO66uCzAqCyieBHJvn9qbBEQ3\\\n\tAfG+GbWT08oqYdRiKa0KRm33aV7ESWHEnjC6/4DyM0PKh0fIgjaQO70Th3cHsNNnQrKR26\\\n\t4S3v9gdcMnd+CGU3MoXIfIJYdccpQPFgz/dJv9HWH7c/fZfsZ+04iXAiM6YCTouUYxjAZN\\\n\tgw8wChvVC1V5Cz1crvWFxuOhlsBIqvwjGHkHtgzixbf1a6f2vnYDqm5aSFNQWWAH6r4cSH\\\n\tk9MHcQXpfnWQAAIABJREFU3ZiecmmD0nErhVHIBFYKI6tPp7f31ANG5YMHDD+8R/lAL4t3\\\n\tZrnhFDz1arj3sQpCf+4JdleDfvKUq+GGU8KlIVx9XDmslySy79h/1y7l2YLdl1xieZZRaC\\\n\tM5GDnsXKOqVyY+/UDp1cP4VdrKYRyG/n0aF+4j3JOFkbd8ZOT1Co0D24fLrdgC6wOj4hiM\\\n\t9mkc7ALOXdflXdEyCYiekJwJn0hpg0SI07JKGNl8M3BYVxiVDw4ZfuAi5dlhSwUsTu64Vr\\\n\tjj2tnzOb2TWljLluFHthncNGTrs8NOicQwqmWOMAr5tcGofke8A1sKqq02/FYjtV5HvXYu\\\n\thKOlIAE6KPOqVAAqiIfuw5SA4MAeNOUoJZ7Q6MSX089HioAmwHHgMfXDDoh7UrZdZ2QSI/\\\n\tuG1hg9t0FL3Rjt+Sy18nlLEz3zZvzJ9iEhYwujjnJldbSkFxWWTHyt35zS4ZFw8AcX2L/7\\\n\t3EogdBRl+IFAw+BPoQmPWyTb8xe+SRh+mAKUAox8w9bp1Or96lClibaALWnfPmQYp0Ood3\\\n\tCMFsaO1HFJutBVWlbsHzTX6IW6xY66lXBQXrcIEF2XnHGmkU8Eo5yKBcPIlmVtYdSED951\\\n\tntHH99jI/GT04ECNFq4LjAJwLIxGdTiCS7RVbemNuRYY1avsczAaGbDYrWnDNSOV10GTJg\\\n\tDN7fj04ZYF4IlJj6hF+oGoyitjEWUsjt4wagPKGNt3YTBi7WBUPjRcmi/oshIBuaiBsmgY\\\n\tKcsngVFo6CptBKMADMjDKGcZSQyjOk8LowAWszma3jQtB6PwEYBQtnII7lhzDw2Mru5bS7\\\n\t1A5OvN+IjsgwqHC4JRzIgFwEg52ZSiucFIh3vCSB6bYox7I5PJUmAUMlZQ0DCKulEWRh4u\\\n\tErrlGkamm4W0dNNU2gCjaNdGHa/gpjfq1zCq4aTz1/M5ahid6VtHvbtmAtemmV4OMLLBOc\\\n\tGnB4zcdi/P6EYmlOJ0iTuhiV/HpOG5w8j/rWEE7d9Mq/5KgFYEIw0ODaNgGSmARd9U8zAK\\\n\tPqAIMjkYWTAF8CiLTEqidWv1PXKmbwVN4iO6qoY4GK9/5rgLRomsCYy0TolvtDeMJBM/JY\\\n\tzcNdtsZL7idoXdl15qRp2CrBRG2jKyMKpgkMIoAMNYRqJgVENjlIGR/0x1/bFGDRzbXdM+\\\n\to2AlactoRD0AH8Poir61MgmItsPt141tHIzqtFZyv/TTw6hdT4jLgSEDowQUq4WR2y0onr\\\n\tji8e4jJFu3jjj+5ZcorinV2TnBaCKxMHK0wyik8/6i2v8TumC6m2b/omDUZhkFn09wWgf/\\\n\tEDR7X2sHtgaTspR0+20aSm8QTTKPqP5ommAYJNFBc5xMItSi06tzXXOFtKg8xfk5Rlk9Ib\\\n\t3jMO7yuPX0kxw8dIDsZ/LZyFhxp4TtJw/Zum2IOxWezbhFsiqqDod5RLZL0HLdWAkXSMOc\\\n\tQsEn18jqVzWkye3y6MtYZ++o9zKqP0nkaL535uceUXigFKo6CppPFAVQScXdYJE4fy2DSk\\\n\t9YnFs1lDN9R836gai6qWh5R7UoNa6nThhlpS+MxjVoWM2Ws5lyTbyxWjeM3LEBW885w8E7\\\n\tHoODDYzGiTshDK4tKa4vGTxxRHGmpc5WtrFaVAil1/mZ0n4SY6RXlU/8ux7tf61ghCNeS+\\\n\taI9zLy+2Lr7WnrCY1F5lXVMPI6vbponyMc9STi+rZELULrlkk2RjsW98BcvAShD4yyD6kF\\\n\tRr3O0dy0C3A8ejAqrtxm50VXcPCH55FHN5MaAdwOuNNCcYVQnBGKK4Xiar8CP5m572Vtdn\\\n\tmMCqX05mAkRHtf+0vyMHJNGWoY6b2M8MdhZjUKPmrnx+RVdQ2MCFuBeGsobG2r3Rn1shaO\\\n\t55psTibpmp1JG7jzehcAo8tql8fMvVjL6OQWOy+6gtF9lxh98CKypxvQEZQdGFwD7gR+uw\\\n\t+qfydL3CnBbYe6V/UQ6k0woNDwmQeMbD7zgJHSL0K9vAPXWDpmX6MGRkKzbMR01bAwEmO1\\\n\tQL12TXIw8nlTgvMr+ut5TwfgthvI1bejYNRTJt0GJNvAF2YZHWYYLWKXR+cY3HKMwc3HKD\\\n\t+1x+iT+5QPHsy81cdyJH4Q8fhBHLd1s7D7PGl8wA5y9VbVfQ4Ui4aRXSRrdUwDI3WP4v9z\\\n\tyjICmn2KmuQVjIR4DZuHUVlW2++CgpGr4h3GqvGwi25HaFbph72M1J5JFFSjb37zft3gah\\\n\tj1ezcn/64ZQV+okNAgx8EoJF8jGLXe02Qwai3XImBElWdx4y7FjbtVcc4NKR8bIudHyIUS\\\n\tLpbIgcCB/zsX46kLJGn8tCp27hS27zDZJe9AA4Z2GNnrlgEjvXB2FhgFIGgYtVvQ7TByfl\\\n\tGs7sLVF1Hv4Oi2iFfsB91+hX3Oga1h5IaqbAZGPWU6EAWlRSBeHxipB7tsGLXeQxsofKAn\\\n\tjFa65awDd2aLwRXxTmXR9iEjQUqpLKf6R7WKP7j3gOGH9+cEq+mlOAO7z4HiGn9iLCjGwS\\\n\tg8pwXBSJdhIZaRhVGRRDdh3/YKSFf3l1A6tZLe+4aKABxH/WHHaMV+uB3rwA5WUtgzSdVD\\\n\tXba+v/6NTDJqZs6ZhrrOMJpo+xCWACN7L+NglLvPbh3Rcxg43MDBdhMfYLRzxy5bn7XNwX\\\n\tv3GH16+Y5wdxy273BsPxn1moR7X2MY1e+ChZF6d0IZ5wKj0BWKo3UZK46EsoYvgziSXR7Z\\\n\tqiY8RhurGQd2vShXVYEIFN5KksJsYRvmKxXqGba0z4xMMmq2j6OZXZesvD9qMLJ5rSGMkn\\\n\tJ2wMjoqIpdhYtTBbsvOE758IiDD+0zun/Y9/2ZWoqrHdu3O7Y+yzVdh1DGecEo5JfAyMhh\\\n\tgVHyNVmlqoZR+DKIB44oiJUlFGrIvcRsrKZv1RF/lshbQuXI54G/3uup718DUx7te6eTdM\\\n\t0uIuzoynSuanxVg++AUXMFhwdGjro/Xee1Qhhl7zNTd1PCCIHi6gG7zz2O7JWMPjVkdP+I\\\n\t8qERMpydSm4bimscgyc4tm4qqrVedbkz8JgIRvaeLCgsjHq8V+sIIwfJZ4paYSS07n8dtp\\\n\tytYURzLwj1JEVBwUh9VjpijaMa2h+psJ7Y2O8uJ/cRmV/hLhjVDyUq0CGHkc03A4d13eUx\\\n\tp8PCCAdut2Dr1m22bt0GgfKxsBl/WX0BZE+QfUlme7sBsF19997tOtxJR3Ha4U67amKhL2\\\n\tP9Ndmo3LPAKG7008MIU49TwihK35RrcTAS7FyjGEZq50UczQRHbdn4gzqOJm2Ake6ORZMa\\\n\tS6rN+oPyGkYX+t7hJCBqathApQ1GguCyMIqvrw47YLROW84mLyMhY/RI4uphRBSe5ssg1a\\\n\t8jFFcUcEXBAFtvplElz0OFVR1Gn7ZeKxjl6nEKGHUtBZl5aN9lYOTIzTVqYCTqvkN5fRct\\\n\tfLkjgpFQ73NdL9vwkxb1541qGDma1f+FLudjfUfOivFJ6ip4JDpZxhXt9AQm3SBDoZqkxE\\\n\t8hMq+yHGkaoz2fpVbmHBFHLo8tZ9N7lA4dMpWOIg533kNch1FZbJ6JTpuP1lnEaZN7Cg3D\\\n\tlKnOZ9w9Wh25a6yOwpTTvD8Tr9iPCkPdhap3b9SwKaNwNfdwpK4N8R449Xavkm4fEu1lBN\\\n\tEi2XrLEbUqH4h+SETO9r2rXiDyt/BIejJ+mKuBUa60Y35uZoWRLUvUGA8vjKLw0mBk9fk8\\\n\tE53TwSjKbxYYJWLLvWwYBesuwCgoF/8O9oVRSbqxGjQw8un09iB6xT5SwUiG6n5rGKXMaJ\\\n\tHeIAIeSerNsQYwantpxkBrITAKcQuCkQ7PAKNUqjzE5nkEYNTc04wwSqwinUebjmXDSFtG\\\n\tmbDeyyjZjN9YRgFA9cZqpcpX73UdtgIJ3zSLYHS27w1OAiJjZglVn1Qr7wOjKCnxg9nAKB\\\n\ttuA8OUMEqtoiaPVcAory8nY2CUvEuXG4yC4hRGdR3I0KRR1o7+KofQwIhh3B2rz6s9t8t9\\\n\tVawaRgsB0SPhNitlfhiwBUboxBGMNKRIr+kLo0TWBEZap3HUTQSjvpbQEYCR2HfHNuq2PK\\\n\tyOBHDLglGIa9OxRBjlLKEERvbLIMH6CTDS4XB9ZmM1u1GafsGr+32g731NDCJ/6+lLbmDk\\\n\t7K6H84ZRDjDLhJF+mTSMkhc8vtHeMJJM/FJgZIq9jjBKVnuvGkaZH9+F7/KoRcGotlj6wA\\\n\thaYSTqvIVR7cQO+ZRQhvVmEYzu73sH/e6+yvtsfEqoAKShwWQw0tfFB6SNNFew+cKoXU+I\\\n\ty4HiqMHIqbhpdXSAwl4/NYwmtYx81DrDqMvaGisaRmRg1IymNVvOtsFIdbtyMNLb0daWmJ\\\n\t5HVN/wx/NtNJX+dy58Kj2lYeQVTgIj/VC6YJQbLUsvjM/1NXV1o0waQC79ImDUR0cundVh\\\n\twqjwsmFk72/uMHITwqi5fiYYRfr6wMiGx8GIGUT89WGWs4YR6G+oSejWRDAyDuwERgo8Oi\\\n\t0Csm+evwB8cq7ziCpxH08rt/SnJoRRk+dkMGq9p74wGtOg3apglLPWumCUe3GngJFW1wtG\\\n\tLTqzOjJ+j7WEUTiRKVMu3DlaZ9JLrLMfjGbxF2k9LV8FUdZRCiNjPUUwCg7sEGcto1GTpi\\\n\t6HJMZLm/QEkQO4L/3VE3Bho40JYOTih7BQGPU6x3rCKCnfOBjZ8DirZVIYdQAwq2NFMEr0\\\n\tdcEoBwqb5yJgZPOZM4zw3awIRuF8c24sjMKoWd1tg3qHxujji2G72BpGB8Cn+5Z2kk7pJ6\\\n\ts/6kWrt4wMp6aFEYuDUcfoUJq2iV4LGCUvvE3TYTUtFUZWxsAolz4qz4ww6hrlNNevDkZq\\\n\tKUR0zZxgpJ3XrZZRBkY6Xfi8NELzaSEFo9qxbT+LXoLwUe+M6iWTgOhR4Hx16Px9hPUt/s\\\n\tUJca0wogVG9sVDPcc1h1Fy7XQwai3XoYBRS/22wWjc81gYjLT0gZG9blkwUmWcO4yC8hYY\\\n\tRfOEwgRH1f2Kvgjrr9dziOrylx8GwX3+w72K2gtEJ77+DeHw45FCv7i1P4yq8GwwCqfWBE\\\n\tatoJgMRpNNeLSF6AOjzDXLgFEt6wAjm34cjIK+BcFIl2GZMGoZ3o9hRHxdGY6VA7t2cB+g\\\n\te0e+/B+epJiTjJoB3BedK0uvMwcjUhipBjo9jHTckmHUJiuBUYclNRUo0jwnglEuv1p3kD\\\n\t4wsvFHGEb2HqJ7XCCMYD4wCotk6+UdEYw+MkkRJ5u4IAZEUlJvgJTAKADIVuohhlHXy9Bq\\\n\ttaw5jMbkudIV+3X8CmEU6esA55GAkR5NC8Ahvq6G0bAJ145uNIw+0tquMjLpDKp74pcoeM\\\n\t/nAKM6HaQvnpbDBKMMnFYJo1x+UVnyeV7WMEqeU+b9661jXWCkVuy3zDVqLCMLI+PArgGm\\\n\t9ZQAH5ykrJOC6IOEMmmlzs0Oo7od2hfNRcE4cFhgZF7AVcGoNyjSPNcDRrYs9ppZYWTv6a\\\n\tjCCBoYNd2y2DoSAyMTH607G9n7HiL86STFmtwiqm8o/A1fh1wMjKq6mAOM1mljtagBtund\\\n\twKjLmotgZPNMdPaFUfycpoeRDU8Jo5ZyzRdGXnHLXKPYZ6RmUgcYyUFzXVO3H4TSjul3yq\\\n\tQg+jMqe6wpb6m+ez0pjESlYxoYQXJys8tjPv3UMDLBVcLI1OH6wihXjx0w0mXWMEoc5MuC\\\n\tUZtl5Ij2MUI8b0qb7z0IFM/pvS/axCA6ACJvuJSjGC6TwMiRPNy13+VxXjCyZVlbGKX3uH\\\n\t67PIaAyTPRuaYwSrplKrwSGIVCWBgFo0No5hOF0bUIRu+dtCi9QXTyVW8Mh/dEEaXfInIm\\\n\tGMUPc613eUwuWwSMOLQwWvb2IU1ZrD6fZ6JzOhhF+c0Co0TWFEa54X0RYhhJc10Mow+MbT\\\n\ttGJrWIIDisg5TDBjhLg1GUlPimlwCjmBELgFGIWxCMdHgGGKWyjjDKlLELRsm7ZO9pRhit\\\n\t3S6P5GEECYyqoIWRtoTAw+jdkxZoGhDFZldNSkhgBN5a8nEKRhGwJoaRPo89iI8PI4y0Tr\\\n\tNcZyIY9YXPlDBap10ek3jbqBOdLTBK8lwWjEJcm45lwijAhwyMjCWEHbrnEpR/Mqn6aUD0\\\n\th8mZ0YHKSsEo/M3ASEJa6IQRsFgYJbIGMEpe8PhGe8NIMvFLgZEp9pJgdLi3nM287yuDkR\\\n\t4dw8AID6OSavV98vzfg9STj3rLNCB6P7AfnalH6rpgRDeM6uuIHubctpzVeUTS8qs+JYza\\\n\t9YS4XKM6ajByKm5aHUuAUVd3NgsjH7XuMJpFsjAKVpDpptULY6P7/EOA4rnnJlI7TakPgP\\\n\tfpE1IOSbpcCYwK88AMjBa95Wzr5mw2vTrXF+q6USYNIJc+B4pZYdRHRy6d1WHCqPAqYBSV\\\n\tdd4wchPCyM6+VucmgVGkrw+MbHgMjGaxisDkLc1fM9dI9DfQGv1/NI3KiUCkRs5iZaODqv\\\n\tHU/qEOGEWSg5GrozphpPJY7pazYxq0WxWMMuXqhFHuxZ0CRlpdLxi16GzTkVx3BGDUOVpn\\\n\t0ospcy8YzdhFq8sY/D85GAXLSFtQDnKumx4yuUVU1X6srPQ7uGVhRAuM4viJYeTih7DZ5b\\\n\tGlXIuGkWlUl+cujzptpky58GGHkbKOFIyG4BZvETUFlIzDeh9HkYGRqagERg0g1hZGHaND\\\n\tadomem1glJRvHIxs+DKEUdfAgrl+dbs85vKZM4yALIyM+Hr+I5Hy0th3MCPTerbejd0G0n\\\n\t/XqBVG2ofUBiOYEUZc1jBqLVfywts0Of063KJj7jCyMgZGufRReS4HGNlFslbHPEfSaqXk\\\n\tMhVx7wAonvfYxGqmBdE54E8ju3S0XzcYF0DSCiMaGDmS+PEwogVG9sVDPZMMNNYJRsm1k8\\\n\tNo8l0e1w1G4+p33EiazXNRMNLSB0b2umXAqIiP5w6jbIbvmMYagilAdPIb3xQO767K5PuJ\\\n\twz1wRQ0Ppy2PBEbaKumCEeRh5IE3NYwMEJcJozZpBcWiYdSSfiqrJdUxFxjZBrZyGNn042\\\n\tAU9C0IRroMS7OMsvL2abOfZdLBW+sjkaprVo5iGDmf/dQwsjAjTschhFHfLpq+dqEwagdF\\\n\tHkY97n0WGOXyq3UH6QMjG7+OMMqVs0tHC4zsPUT3uDQYPQqT7UGkZUpnNQC/H58TZHSpOl\\\n\t40jFDpUDCq00H64unLDxOMMnBaJYxy+UVlyee58r2MVg2jSF/m/eutY21hdHfuZF+Z3iIS\\\n\t7gHiDUcO9ppGsgoY1e3Qvmhd0DgsMDIv4Kpg1BsUaZ7rASNbFnvNrDCy9zTphMfJdKwRjH\\\n\t4PYPD8yWZUqxJNLSXC2/QJGV5EA6QbRqi0i4WRQFN50TM+5DBKjtOGuIFRe6Ne343VyNTj\\\n\tlDBqKdcCYPR7M+Q2HYhOfpNxWAcZ7vua1zBqYBPDSFF7FhgZp+5Cd3mM8lSyKhhlweSI6b\\\n\tMOMDLBVcMo0reuMMrV4xQwap1jFOKZXhoYHQDvmCGnWVfI8db4RgQZ7REDxP/1YElg5JgN\\\n\tRo7k4a5ml8cVwUiXZW1hlN7jZpdHVaZ5wUiXebkwehdSXpohl5lB9DZgFN3IwUUFlaZrVn\\\n\tXTYHEwih/m2m85q6I3uzzGeazXxmrzg1GU3ywwSsSWe+kw+l2Y3j/kSzCTnAf+Z1UYf+bA\\\n\t+4m0igyMoq4b9vxhhVHbSzMGWguBUYhbEIx0eAYYpXJ0YXSEd3l849gf3DEyNYiUn+gN9U\\\n\tkBObhYHTuddQqjeikINDCqAhkYuSyMojRTwSjOZgOjNh2Z9FODIg4fjl0eczIGRsm7dGRh\\\n\tNGJGR7XXPINUhX5jfE5geKlqFPOCUXjoBkYS4urr8zBSZTUw0pAivaYvjBJZExhpnZstZ7\\\n\tP5N3FBn3l3bKNuy8PqyA4sLANGIa5Nx9xh9E6qntFMMmvXDIS7gb3o1P7j1EP3EYwUYHIw\\\n\tioqk0/q/QjeM6uuIHuZh2+VxYhjpl0nDKHnB4xtd710eddy0OpYAIwuDlcMo8+M7DYz6y5\\\n\tsBBi+YjUWzgwguIfEsa9l/nAY2GkbGyrEwsl2uBEaFeWAGRtEMayaDkb4uPmiOkwZOmsae\\\n\tmxJG7XpCXA4Uy4aRLee8YeRU3LQ6OkBhr58aRl31loORj1pnGPW3it44Psl4mQlEJ7+59h\\\n\tO9KSr4wSXqD6/lYGSPExhZYBkY1dIGI9dE94WRfih9YJSVSWCUEd0okwaQS78IGPXRYfLL\\\n\t6sikCeFlw8je39xh5CaEkZ5Uac5NAqNIXx8Y2XAXjHp10Q6Yg3/Ia5uL/HYcFNi/UEEmvL\\\n\twLg1ETPxWMVB4L3eUxoy8rihFrs7HaMmCk1fWCUYvOrI5Mo1oGjBJ942AUTmTKlAt3jtaZ\\\n\t9BLrnBOM3gpc6EzRU+YFoncC56Jftv3zCj4KIm0wqkjUASNaYBTHTwwjFz+EzZazHeVKdG\\\n\tTSTwUKkka12eWxJc+FwMjm0xtGvwmz+4dMqWaSIaGv6Aste+eIu2UNbLIwqtO0wchUVAIj\\\n\t9aJGaSaFEYuDUcfoUJq2iV4LGCUvvE2T06/DmTwXAiMrY2CUSx+V53KAUegWTgyj38yenU\\\n\tJmBpHyE/1afVKodmzUm6XVoPETFLVjWsPIBRi5PIwih3QGRvWER1Q4ByNaYGRfPNRzXHMY\\\n\tJddOB6PWch0KGLXUbxuMxj2PhcFISx8Y2euWBSNVxvjdOwv8AXOSeVlEAK+PQlJZRS6AJo\\\n\tGRhkoORhPs8qhnZicwgjyMPPBmgpHKfx1g1AqKyWB0JHd57GpUK4GRTT8ORkHfgmCky9AP\\\n\tRm+g+e70zDJPEH0CeHd05tJj4AoPFDcGRuRhtNnlMQ+jNlkJjNpBkYdRj3ufBUa5/GrdQf\\\n\trAyMYfYRjZe4juMQuj30Tm4x9SWmeTbPcMkL3zIGUFowCgVhgFSCwJRqh0HEIY9fUX6Wt1\\\n\teB1hNCbPlW8fsmoYRfo6wLkcGMU9oBllnhYRwK/HQamc1r7r1R9GCkqrgJEuQw5G0bX6by\\\n\thDvnJWCyNz36uGUS6/qCz5PC8PGNl7mnSO0WQ6poDRu8F9PFU6vcwbRG8HHtYnxHfP8jAK\\\n\tN5cZJesFI1TaOcKobof2RXNRMA5sYJQNt8GoNyjSPNcDRrYs9ppZYBQ/p5XDKC3X68AxeO\\\n\tF8umU5TbPKCOO0lotnYwsoglEDmW4YNefXc5fHCWFkpgvU95AmzF8/bxglx2lD3MCoS596\\\n\t/jbPROeyYWTDU8AoHdZ/Xeu7OaXMDUTKTxR3z8qhmtwYoJCBkZ6smMAonIcsjByzwcgxBx\\\n\thBcrINRpEfSp9fEYx0WfRLvlYbq5GEVwojU4frC6NcPXbASJc5D6OHwE39/bI2mbdFBPA6\\\n\tYF+fkAtnPXCUBWRhFP3VUImvWTyMqK9f+10e5wUjW5aoMa4TjNJ73Gw5q8o0CYwSsfXUCq\\\n\tPXI4xa38kpZREgehS9WRogFx+mAUlPGCloTAQjbUWFuKO6y2Ny2bxhFOLWG0ap+OebNNS+\\\n\tOmaFkdXn80x0TgejKL9pYTT9xmrePxR/SWxWmSuITn7zm8LDf00UMdxDDi6QhRHkYZQ4lP\\\n\tMwivxIepb10mAUJTVlXgKMYkYcPhjp8JQwWqeN1ZL4TmiOgVHyLtl7WjqMRlD8j7E/ilPI\\\n\tIiwiRPglzNfX5MJDUAxIYOQGVQINGQ2jue3yiO+6+bjI4hoPo+p6VLoqbm67PK4rjLTOzS\\\n\t6P2fybuKDPvDu2USc6W2CUAG5ZMApxiY7fRzh7aEAEPCRS7dwWRC48VB1EoGlgVK8tS9JY\\\n\tGCnALGKXxxYYzW2Xxy4YJbIGMEpe8PhGN7s8zglGUWFXDaPMj2+l43UAgxc9lN7CjDJ3EJ\\\n\t36ljeFw9dGL+nBRbOXdRuMFESyMDJgad3lsQ1GxXgY1dcxGYzUpebAHENvwMwAo3Y9IS7X\\\n\tqI4ajJyKm1aHaSaLgFFXdzYLIx+1XBjNfdi+znkhuVbyi5jHKY8/CG7QD0bREH4LjMLxum\\\n\tw5K+a6+KA5Tho4aRp7bqyDliTPw7HLIyZO6zBhVHjZMOram9pePxWM3IQwaq5f0i6P9yK8\\\n\t7zCC6JPAW/ULKo9/2kPDwEjDpsjASMjD6LDv8tgqfWE0pkG7VcEoU65OGOV+faeAkVbXC0\\\n\tYtOtt0JNcdARj1n339KwCDF3+GRchCQKS6Z6+BppJk/wIchC98KBhpIJGBUd8tZysSdcCI\\\n\tFhjF8RPDKILKZpfH1nItGkbTzr7uraNI63AZMEr0jYNROJEpUy7cD0avbS/U7LJIiwjg5/\\\n\tHVUcPo/AMKQAZGAUhCHkYKNuu9y+MCYTTL7Gt9Lpt+CTBKyjcORjZ8GcKoa2DBXL+gXR4/\\\n\tA9VnpRcliwbRJ6EZPROB8twD1bwhF4CSgVGwgMJeRlPv8tgCo+i6DIzqOUY6zaQw4rKGUW\\\n\tu5khfepsnp1+EWHXOHkZUxMMqlj8pzqGH0qzD/2dRaFgaiU9/yplABP6fPy8ElZO8xD6NB\\\n\tY93kYOQBM/0ujzDRlrOOJH48jGiBkX3xmsuzD3SdYJRcaxpqDxhNvsvjusFoXP2OG9a3eS\\\n\t4KRlr6wMhe1wtGr0Fg8JJPsyhZtEUEwmswa8/Kx+6nXt4RWUSLgNEEW862zr7GXI+CkQfe\\\n\t1DAyQFwmjNpkHCgWBqOW9FNZLamOucAoyqMPjGz8vGFk04+DUdDXG0aPIcUbFmkNwTJABA\\\n\t///+2debgkVX33P6e6+/ZdB4ZdEBKjkmhMRF9fozFvEtyNmLhGn/d1iUYNqHk1r0viLho1\\\n\tJr6vGgVccOXVKEZxARVRAQUFBAYQGJZhGbaZYYbZ7r1z7+3uqpM/aulTVedUV/Va3fd8n2\\\n\teeW3XOqVNLV33md5b6FpLz1QRvcbv/MHQDoyjCMcEIPYxSXkZFYZSEGfFyjCGM8jbR1G3V\\\n\t9b7DyAwKPYxynHsvMNLVF+07VCcY6Y5nhDCK7S8DLu2884C1sQbR/MnR6NnXYj+W20Au70\\\n\tIGoNHCCPQwir2hr4ORCgwYOIw6bFBCAAAgAElEQVRQyqHASD2GiYGRBk6jhJGuvtix6Osc\\\n\tuZfRKGGU+p009198H36z7E+3p/P7qGFERADfBRbVBG//vYAwR0aO8g5aJozCH1XTMZ0LRi\\\n\thl+wij6DlM3mhZ0LAw0q6bYJQbFOk6ywGj5LEkt+kVRslzKgyjVaQ4P5k4CA0LRCvA2eoP\\\n\tJZd2gNcC4QQPtzDASAGOFkZtyHQHI3UawOBhJKH9w8d+9zGHUWo5/SBaGJnBUVJjtfOBJe\\\n\tM91EcNHERK8+xLQPsCSIlc3B5FOzIAixlGiY5qHYyi0S8TjNrp5bSchVRiFoyEZuNRwSgF\\\n\tirBiGSszehglVkcNo9j+SgejbwFU/mwbg9awIiKAS4EtQHQBvL13I5xKCkZABxiJaD3tZa\\\n\tQAIwWjMB20MBL0BiNB6scdjcvjiGCkHktpYZQ+R+vyqBxTG0YtEp8HG6SGCSIJfEVdk6t7\\\n\tkY2lFIxE6FGEEgXpvIyMMAqBpkIlvs1gYRT/n6X0lrNKdk8wSh5L7GEcTxitY5fHnyLFHo\\\n\takoYBIaZ6dhXppJXh77gKEHkZRs6kDjEAPo1Qfjh5GsabberScjTNiADAKb/ABwUhd7wFG\\\n\taU0ujHK8JPtNGE6zTDmKIUlyJ8QN07w9dyXgoIGR2mQbpcujCH50DYxiZbqCUbwaC6MO+1\\\n\tDLdw2K+HqZXB5T+ZnQ7ACj1L3UEUYt4BztfTIgDQ1EUVQkOTOW4Tbw9t3nv+SamMiYglEI\\\n\tHAOM2i6PA4RR+KMnYCTDvGh7PYyCa6CU8/Mmx+VRqUsHRkjAKLmaEz6pOjusq+XHBEYjdH\\\n\tk8Hxn/UOqgNdyIyNe3gJjXpLfnTsKmV24YxUCjg1GyTBJGCWglYQT0ZDkbbUcMRn2znFXr\\\n\tiMnwIHUJI/N+wrysh4r2+aUe4viJltvlUc3rdh9DgFGWeZsWRkFWGkbfAEHlz+9N72NAGg\\\n\tWI1pB8WU2QS/cjGysGGAk9jBJD+WkYKRDRwigR5SRhlGxypWDkJG7CBIxUoBWFkbpdfKG9\\\n\tnHrASZdJpnUBI5m5n6hQYttRwEjNU/dhqK8wjHQPbhcwih3rIGBUJDJqb6/AaI3ABG2YGi\\\n\tqI5k+JOq0/n7yxvQe2BIBJwiiEjsiGUQw2Y+jyqMJIvXnywEirIjDSSH0oUw+ArvwgYFRg\\\n\tH8n9xfahKROu9wwjwz5N+0ht128YiV5hdJ6UYh9D1igiIoAbgUvUH8Xbc2dwJRwtjGQAEa\\\n\tHCxOTyKMQAXR5NMIrndwWjSCVzeWRUMNIc1zBgpO4u74TH3PtwRgOj1P6MMPomCCon3mPe\\\n\tfgAaOoiUqOizQPtittbw9t8DjkM0ZK+FkZMNIxVImS6PBhhFzb0sGNEBRnQHo1iEUzKXR0\\\n\toEo9TxdYJRcr1T1DKBMNJGSSkYLTOCZlm09xHpmxD0zAcX09t5iw8WJ+yU7hFGkg4wIhtG\\\n\tmGCUuPFTMFJu1FiZojDCwkh3XKmHKlmmw/51dQ4ERkl1gJGufOx4Bg6jc0Ec6HRUg9AoQb\\\n\tQKfCFak/jWICt70zCKmmQmGKGHUdgcE71azgo9jGId0hoYBfmdYYQBRskbr725FhplglFq\\\n\t2+5gZDyusYCR4fqaYNTp9xgYjCJ9AwTVJ9+lOY7BaiQgUppnp6P+FBK8Xbf484RUGAWQEU\\\n\toElPYyIg6aZHSUCSMVKjoYFXB5zLScBT2MAuB1DaMEEMsAo06gyAmjiXR5TDaJRg4jB2A/\\\n\t8APNzoeiUUZEAHeQOHnvgdvBbRhg5LQfVi2MEqAxwSiKcEwwQg+jKK0DjNaDyyPK+Zg0Eh\\\n\tiZQaGHUY5z7wVGuvqifYfKA6Nkft9h9D2kWMve8eA0MhApUdGnYhmei7drSxD9CD2MQtM0\\\n\tRDaMQA+jaNkEI2XbqI4BwgilHAqMonJEeaWEUd7+osS20XoZYdShzpHbh/QfRl8FQfXJdz\\\n\tIKjToiAvgxcJua4O3YDIQvwgYXXAejACJGGEUuj73ASAXakGEUPYcZMIptq/4Nj0FTNFku\\\n\t1NBgpIHTKGGkqy92LPo6JwhGO4ALGKHKACIPOE1NkI3l4K38ig+c8N2yLBipgFlPlrOxe3\\\n\tNQMDJoUmCUGxTpOssBo+SxJLfpCKOvInEZoUYKIqV59gVgSc1zt18fQCQBo7C5loSRGJbl\\\n\tbDu9nC6PBWGUmC4QnUNe9RtGqeX0g2hhlLU/5fdP1pnaZ7TdWSCoPuV2RqUyREQA+4DPqw\\\n\tly6X7k8s40jIQCCR2MlDlAXbk8xvJ0MArTQQsjQW8wEvQBRpBKNMEo1imupo8IRuqxqA9u\\\n\tqYzVSK2PFEaJ+UAFXR6vQ3INI9bIQaRERZ/Ab6ZFcrdd59+YWhjF5w1NnstjeBW6gZF60/\\\n\tYCI01Zk/oFo+SxxB7GMsEofY7ls5xN7i+oM16HHw099TZGqZGDSNEdwDlqgrf7DmTjgBKZ\\\n\t6GDU7vfJdHnsFkZqFAQUglEMYnQBozZw/Kxhw6gDUDI0VsZqqX0Y6ssBo7SC3zfV75V3Hw\\\n\tOFkUcwWjZqlQJESlT08ViGlHjbrvPhEY2gGWAUAKZUlrOo6cOAUaxo4piHAKNkhDBuMFLX\\\n\tu4RRmYzVUvnp3+ICYDhesB1UChApugS4Uk1wd9wIbisBI5EJI3W4vpSWsxA03YK8WMTVGU\\\n\tb+9ijl/Ly+uTwmYSQoB4yigyEBo+Rqn+AzATDqMKz/FYDq027VHO9wVRoQzZ9yYXiRPhrL\\\n\t8Fp+X5FTVWCkQEQDo4lxeTTAqG8uj1kw0q2PGkaphzh+otblsRCMFsH5Tnqfo1FpQBRJ8p\\\n\t8kJji6910L0kvBKAkcM4xG7fJogpHTGUbRdhSDkbJpYiGxjAEShhu0Sxh13LZT/81EwEgo\\\n\ted3uI/HIdg+jbyE5YEFklotMREWtVbzt1wNCD6PYsH4PLo8mGMWG8DUwSi5rYaQCSwOjqE\\\n\twCRmp0VQRGma+CKMupB5x0maS6gNF4uDySyFP3kVhHWR82jLK8qZPbm2H0ZYDq026mDCoV\\\n\tiOZfF3VafxnJDjXPvedqBQiOAUYhWPQwars85rScTXoZRc2pbmCUjJ4SMIpJByMRZWXCSK\\\n\tljcJazuv0ZNHIYaY4/E0bJPHUfpjo1MFJ3lwtGhn2a9pHarhCMbgNxMSVSqUCkaAX4eOwm\\\n\tXlvE23mzMsu6A4z6YTmLBkbCad+8WTAKmlMT4fKYFzomrUcYdTv7Ovc+nF5g9AUpkcb/ZE\\\n\tag0oFIiYo+DexXL7a79XKiyYshjBQAxWDUL8tZiR5GCmy0MFJG6Ebr8jhAGBUBVBlhlDq+\\\n\tTjBKro8ljFzgiyCoPv0myqLSgUjRXuAMILrYcmUP7v03+WBQR9AUyKRgNDYujwYYRXOM1D\\\n\tJFYcS6hlFbiXXtu25ZMCoKivQ+SmA5ex5SlGLukKpSgkiJij6BbykbXWx3668CyCRgFL2J\\\n\t7+hhVBaXx0wY0YaRIJXfGUYYYBRGB51gpBxDWWCU2rY4jIq7PBaFUVL9hpEumlPTnMz9Jc\\\n\tqfCYLaMzbrDnxkKiWIFG0DPqMmyAO78XbeTNT/k4RR0GQTQWez0eXRCKMEaAYBIzDASI1K\\\n\tsmAEehgF0VfXMEoAcZgwMpbtAIqBwchQvggoBg2jWB15YMR9jNAONkulBZESFX2ERFTUuu\\\n\tNSYiNjWhhVOsMIeoNRFOGYYIQeRlFatzBKwox4OcYQRnmbaLr9DARGZlAUglFGncO3nBWf\\\n\tg9H6DplUWhApikdFEuTyzvanh0KIZMEoHNIfmeWsWscAYYRSDgVG6jFMDIw0cBoljHT1xY\\\n\t5FX+cQ7UNc4HMgqD3zhvRxjlilBpESFf0b0IwyJLRu/3m6fyjWN6TAKK/lrAqY9eTyGJMG\\\n\tRsE118rCSL8/tXw5YPR9JPdSUpUaRKGkfwG/EEtb2om3/QaoVIl1XgunDZskjErj8miCkT\\\n\toNYPAwktB+KGL39pjDKLWcfnDXIYzOAKg983rKqNKDKIyKpORDqFER0LrtYsDRwChshgk9\\\n\tjIQCiQyXRzOMEh3VOhhFo18mGLXTy2k5C9rELgFTpGzPMEqBIkgrlZcRqfUBwug24ALDD1\\\n\twKlR5Eiu6SktPVBHlgN+69V2OGUbUDjOKvhPTVclaNarQwCtNBCyNBbzASpG7Y7o3VEioS\\\n\tAY0KRmr/WGlhlD7HAbk8noYs9EsMXWMBooXXt0fQpGRZzXO3XBQsdYBRCKR1ZznbBo6fVR\\\n\tRGEi0RBgWj2GY9wCg2Wpg4hjGFUZcvyR4A54sgqD3rN5RVYwEiRduAT6k3jlxbxL3nymAE\\\n\tLASDBkZhh7UQ9GQ5G8JjWC6PsfQRwMiL2YjHNQgYJR/KvsMofIgHBCN1vQcYpdU1jM5Csj\\\n\tedXy6NDYiUqOhfgX3q7+ZuuQjpuQFcqm046GA0KS6PQtCLy2N+y9kMEKllO6VlpXcoN1Yw\\\n\t6i5qSa330eXxkwC1v7hWU195NDYgUrQb+Biyff1lYxn39l+AU1Vg1O6U1sNIgchAXR4HCC\\\n\tP0MJJhXrS9Hkb+xUMp5+dFD74k8bAaNG4wAvQwSq72KRIaHYx+BpRv0pBGYwUiJSr6v8AD\\\n\tKoxad/wC2VhOwyjoIxJhtGJyeewWRonRMz2M6ACjBLSSMAK0MAr/SrJhFG1HDEYdXR69Ap\\\n\tNwhwCjjtt26r/JMccotpqsI7kPqckfCowSh23exydAUHt2uaMhGDMQKVoC3g8Qwcht0rrl\\\n\tggA0Ghg5lc4wiv6ZYDRqy1m1jAojJ3ETJmCkAq0IjPJEQ6oGDCPr8pjePgNGtwLn6g+sfB\\\n\to7ELWjIvFpwP9GbgAj9+5fI5fuDyCSASOEHkb9spyNwWYMXR4jGHm5WmYdNfYw0oBmGC6P\\\n\thWEU2+cnkJ06+MqjsQORLwHIBoh3REkSpJQ0N5+ndFhX9DAKO5mH4fIYTBsYjMujCUbx/K\\\n\t5g5F9Qf6kIjHqFTo561xWM1N3lf0l2N9I3P6s9e+Rfk86lsQTRwut/RnDRzwbx6yhDgrtj\\\n\tM94DtytD9mFko4FRaVweDTCKmntZMKIDjOgSRlmduB1UBEZd1lsaGKWOrxOMkusdYNTdqy\\\n\tCfBg5kH2y5NJYgUiSBtyR/8Ob15/gQiaATREjRO2gJGOV1eewWRmEENE6Ws176CbcwSmyf\\\n\trF+3jxSMMiIldZvuYdQE8SmA2kmbGBeNLYj8qAiAnwPnqj+Gt28b7tbLoo7rNoyq2TBSRs\\\n\t7G13I2rCPZxAseqKhuE4zwYSQ97QM+ljBKbdsdjNoqNYzOkpJtHaO3kmlsQQQxGL0NaKkX\\\n\tv3nDueA20jByAhghsmFUdstZMMBIzQvgpoUR6GGUeAjHCUbGsh1AkRNGg3V51KkwjCS+ZQ\\\n\t61k642VVpKjTWIIkm5GTjNXwketsYBmpt/6N9gKoxEsFypEj3oRpfHHJazYIBRAjQmGMX6\\\n\tiHQwQg+jKK0DjLp2eVQGXMYFRnmbaNG2g4ZRRiSlhZEOqNl1JmB0DlCeT3MU0NiDKIqKpD\\\n\twVeMBf8X+c1m0XI5d3tR90HYzGxuVxSDAKr18O0kwGjBLrZYRRhzoVGH0EBFPPGa9oCCYA\\\n\tRIr2IOW726sCpEfz2m9Bpab0/zh6GA3N5bEXGKlAGyCMCsBh/GGkgdMoYaSrL3Ys+jqlFB\\\n\tdKyRXpDcdDEwGihTdcGC5+DikVCzqBu+NG3HuvacMommMktDBquzwaYBTOQTLBSDg5YKQ0\\\n\t17QwCqGgGSXLBSOUst3ASBaDw3qCEe310RurxcoE0dBVjKMmAkSKWsAbk/9NN685G9xWHE\\\n\tbRO2hZMHLIhFHYXBuZ5Ww7vb8uj4FywkGaypo0hLIDs5wtlZdRVPZyJOczxpoYEClR0c+A\\\n\tc2Jh9Mpemjee54NCByOEAUZhn5DQw0gokBiEy2MsTwejMN0/z74Zq6kaJoz6HHGtI5fH9w\\\n\tHU//JKxlUTAyKIweiNwAEVRq1bLsDbv0MPI6fqw8i6PFoYjZ/L4zXAjxhzTRSIFN1N9HZ+\\\n\tOB9G0rjq/xNNVtTBSH3lY5QujyYYiTg0CsGomz4jVeMGo9hm/YZRCIoBwUhd7wyjU5GC+l\\\n\t+NbzQEEwgiJSr6f4D/ge/gDvF23krrzl/50AlBoINRbpdHA4wCwBhhJHLACLJhFEkPo1g/\\\n\tUtHPFJme23GCkUyujhGMUqN1hvoQ1yD5LhOgiQORoibwhmgtuEOa15yNbBwIoFPtAKM2WC\\\n\tbWchZIuzxm3BYWRop0MEqu9ikS0sPoVIpd5dJqIkGU6Lj+WpQhJXJtiebV/6FAp9qGSBaM\\\n\txKgtZ5NlksBQAKODEaCFUfhXokRTfjnjHW5hpAGFjK0PweXx18B3QVB/7q8Zd00kiCAGo7\\\n\tcA+6IMKWltvQx322/iMKqozTGDy6PIYTkb/TPBqOQujwKifiz6BKMiGgKMOm47Hpaz76GL\\\n\ty1tWTSyIFG0D3hpLkZLGFV/2PZmTMHLiQCqty6MJRsnlFIySwNLACGKRVM8wKvq4DBhGE2\\\n\tA5eymSH/nR0NhOpo5pokGkREVnAhereXJ5F41rzo71D8VgNDSXRwOMks0wZ8iWs4l+oqHD\\\n\tKO++stIzypXCy6jTPpL7a6e9C6D+3MszDn68NNEgUiSB1wJramLr5h/j7doS6yNKwSgEjA\\\n\tlG4ZC/CUahy2MmjBSYmCxn0cBIOO2bNwtGPokyYEQaRqKqvYjGq5sjzVrOJrbPs480jM5H\\\n\tclHGEY+lJh5ESlR0C+HcolBSsnbpGX4TrVLrCKOo/6i0lrPoYaSM0OV1eRROtVifz6hh1G\\\n\tW9pYFR6vi0MJJI/gkE9edNTjQE6wBEEIPRvwGxD4DLxftpbvp6AJ9a9IDrYNQ3y9koCjLB\\\n\tCD2MwghIDMHl0akRwS+hdQmj1LbdwaitxHo+l8ev4s+knjitCxApagKvAmJfDmxuPh93x+\\\n\tY2jJxa9IALLYwmxOXRCKPgvMLtNVp3MBq9y2MTxLsB6s+/zHCQ46t1AyIlKroS+Eg812+i\\\n\tSa8Vg5Fw2v04WsvZsrg89gIj0MMobIZC+gGJrloBjROMjGVHAaNo/TTgTtN/DOMukfdrnk\\\n\tJMxgVY/NSJAHXgCuAP1bzq8U+h/qSTwW0hvRa4TfCaSM8Nll2QHngt8FykbPnLbgtkmOf6\\\n\t5T3XTwuXcf0vp0bpXrCNv50MP+8sXYT0/DQZlpF+3dFf5R+yXRbZLoMEwm0k0ZMhvfbfIF\\\n\t1GaWG5IH1tPzRX2hdI6O8V7Z1hul006YVurQL1Fnpmhboos7dNXofUOm3wKN07/rqI1uPn\\\n\tnVnnHoR8GLC7/vxfZRxY+ZSXL+smIkpoDXgFvn9RpNYtP6W19ddQqaYio5jL41hbzqp1BJ\\\n\tFRFC3FIyNRmYpftSKRUYGopJSRUd7Oa+068chIgtzXxLvnAO7WJbztK8hlt0hk9H4ku3Oc\\\n\txdhq3UVEEEVFAO8D3qvmiekFZp77MUR9IYhUDJGR12pHQMnIKIyKgvxUZBQtS31kFEQ7Qo\\\n\t121Mgo3FaNkFKRUTviSUdG4TIZkZGfLpd3pC9gr5GRLioyVmDQOERGgHv3Et6di8g1N5Un\\\n\tFmpUfmeBylHTSmqqzluARwHN+gt+2enoSycbEWVI6S/6ZyDmrSlXF1n7+SfjM6wr1XRklN\\\n\tty1iEVGUXLSoRURpdHIYLRs4R6jYxMI3H9iIz6WLanyMiVtDbtwr15rxZCAHKxSeva3TR/\\\n\ts1f5oGWqzjcjaeY+/jHVugSRohbwcmBVTXTvu5bmDd+HSi0YJQuhooFRaVweM2AksmAkyI\\\n\tKRqM4YYFJSGBVpuuWotysYSUnrml14D6zqt0nIu+8Azev2KvuJ6vwJwcdDxzEaKqJ12TQL\\\n\tpTTRXkf0XbRAlSozf/lRnI3HgdtUmmh+8yvVTAv+ebvuxbvnFuS+XUi3iZieQxx5LM6RD2\\\n\t430cJOa7WZFmt+aZpp0kPKdod2upkWdmDLaD3WTIv91TXTwjog1kzzXOTSdn9Z2+wpaTOt\\\n\tSNMtR71Fmmnulr24WxcL7MhX5fgNVB8yH662QD4auLH+wksL11UW5ebLegYRRDASwPeAk9\\\n\tQ856BjmHnex/xIpwOM3Nuvpfmzr+Hdu0W7H7GwkerjTqTyyMe1QWCEUXtUTAsjpQ+nKxhJ\\\n\tFUC06zLASC7vAjd4O2Y9wUgkVzvDSC41aV6xvVgEFsoR1P7kCJyZCsBHQb4VYD2AaL03zU\\\n\tJJ/ImOsZ5Zb9+9rF1yWtDkqikjaX7zSwQjaM2LvsHaWe83QghALu6heeG3aXzrM8iVZaU5\\\n\tNEDLWaAfLo+iNtPh6k1oM00mVzs309zb9nUHIQBP4t6xhJTcB7wfxFhDqIjWPYiUjuudwC\\\n\tuT+a0tF9Pa/EM9jJwqrYvPpnnx2bn3523fSuObpyEX9zI2Lo+12QhK/e6DyUobNxjJ5Sbe\\\n\trhV9Zk559x1ArnnvcHetFW/bjbHWPYggBqMfAv+ezF+77Ey83Xf4D6gCI/euzTR+elbh/c\\\n\tmlfTS+/0Vks9Geb6RGNwkY9c/lsUsYOQ6iNqecgO6s9A+o8XmfQBh59y3lrNAsMVfb07x4\\\n\t+1e8XWvUX3hJz/WNiyyIAikwehuJIX3cJms/+Re/PygYkhdOlca5pyv9LMUk9+6ideE57Z\\\n\tG0Qi6PBhiJJGh0MKIDjBLQCmE0NZ84Ad1ZrR8Y6dK8HQdyVmaQI3AOmXqJOGhKelt7h9o4\\\n\tyYIorTXgRcBeNdHbv421iz8WzSlyb9+Ed/dNPe3I3XId7h03pWGk9AtlWc7iDNFytjIF1X\\\n\tr8BIYNoyIaMIySL8nK/Q1kQz9fKK+cI2Z+IlfdHzsbp9jwudt7qmvcZEGkSImK7sDvvI6p\\\n\tdccvaW76JlSqNK/4QV/22br0XDAaqyl9PSkYVfyHQfRoOSvRwyi5LEBMH5Q+gWHCqNtO4D\\\n\twH0SOMvD355gyZJGara87BU88T01Xm3nldT3WNoyyIElJgdA7w8WR+48qv4N51Fe4NP+/L\\\n\t/uTeXbi3XosZRsoomQ5G0exuRw+jGJAEvbg8iup0OiqC8sKoHx3rHbYPYSR7AZEA58iZN3\\\n\tiLzSUxXelcfgJlQaRRor8obv4iJWvnfQC5vC+5Wddyr70ksgxBAVAZXR7F9MH6k5gEGHVZ\\\n\tr0TgLTYKbByXc+TsJrnqnimmHGbffHXX9YyzLIiy1QReDOxSE+W+vfrSXcrbvhX2PaBEQG\\\n\t3IdO/yaIBRGAEZYeRkwsgYFcG6hZFcc6HpFdiwLTFbbTqHzzxDzFSZe8e1XdUxCbIgMkiJ\\\n\tiu4C/hrF1VGu9f8dRHfLdWhdHk0wilwes2BENoxEd5azYmaj+UTWI4yWu4yGBDhHzb3R27\\\n\tu2U8xpXi5eR7IgypACowuBN0cZPY6O6OTeuVnv8ij8JlmZLGdFdQYxNac9D8AMo7xFTRkl\\\n\thZE80OpcSCPniNmr5ErzDFGrMPu/x/9rrb3IgqiDIhhJPgF8GYBW/0Hk3XcHtFp6GA3Lcj\\\n\tbWYa2DEW0YzRwST09K+3AXhFHOwqOGkVwtDiIxW206h04/Q9SrzL19U+HtJ00WRDmkwOhk\\\n\t4Erc7voDMiU9vB13R4AovcujU0XUNcP5sXPSpRWAUZGoZJQwMvgNGSXAOWLuDd7+xgNiNv\\\n\t39uPUoC6JiWkXyfCTdxeId5O28J9E/5OhhpLyjpoVRABGpAiblZUQPMAo6y2c2+u/dZWkQ\\\n\tMDLAYVQwks1iIHKOmL1UrjQ/K6oVZv/hykLbTqosiHJq4e/9qEju3H83G2ZehZPRLOlScv\\\n\teO7lweTTASTg4YiQ4wCuFjgNHsoTlOTJc2GBj1/CpI0f1BoT5DMV9bFhvqT6NeYe6dtkkW\\\n\tyoKogBb+/kJwPVhtnMUh8//S7/q93feT7fKYAaMRWc6K2qzv791JQ4JRX95LK1rWzVlJRe\\\n\tAcOvN8udxcEXXbJFNlQVRQGz64CaaqsNp8O4fMn9vPuuXSHkZvOSswwkhjLQtBVOTkeLDG\\\n\tCUYFoiWZs8/QOWLuK95S88ei5jD3tqs6b7COZEHUhTZ8+FofRq73HDbM9PbmqyK5f7ffCR\\\n\txGH1oYVdsg0MIoPm9Ia6wGtKObJIwcM4zUv7G39KuIucNznqQubcxhlMO9VGyc3ipXW68Q\\\n\tUxXm3jWRX43uSRZEXWrDR66Deg2xcf6xzNV3dd4ih1oN//NCTjUYAWtPVkzBKOywHrXLY+\\\n\tTiOKd/KTavxhhGopINIjFdbYr5qScyVWH+/evvhdY8siDqQWJmCrnaWBEHz/0B07UezWh8\\\n\tyUaD0P1RxD5b5OhhlNPl0Qgj0QFGQQSVx3JWzB4GyY8yak/SlD6mMKpVDAUAIRCHzLxcrr\\\n\ta2iamMcutcFkQ9aOFdlyOqFeRKYzsLM49jqtrzux9ybSUCURxGlQ4wUoAzMstZgTN/VK6m\\\n\tysBGvUYAIzFj7h9zDp/9qjzQ/LqoVZh/j22SmWRB1KMW3nclVBxotjZz0OwzqDi9zXb03A\\\n\tAeGTASIhNG7flHcRj1z3I2WUaBUWXKj4zyaJjvpWVW0n29AGJOHwWKg6dvlo3WS8VUhflT\\\n\t1+8LrXlkQdQHbfjQNVCrwlrzQjbOvQTHKfTWQkxuK+ikDptjGhiFH3WMZljHYZTfclZ0aT\\\n\tnbjoB0MBL1g/IN6cPwYVREOesVB6XdCMRsbVnMVv+IWoX5D/6m6J7XnSyI+qQNH7rGH0lr\\\n\ttL7JofOnUOny0noSEQ7fO3EgpWDkBK98hEP+Xbg8hh3e/XZ5FLOH5+svguHCqPv/Ioz1io\\\n\tU6qP0/NccTB9WfLBvuPlGzj1ge2avUR2348LVQr0Gj9Rlx2IZTqHYRGQWwicEoAlJFD6Ow\\\n\tX6dnl0cDjJLNMJPLo7ounKC/KOctVlYY5enLEuAcGbgROALn8Lm/k2vuFaJWYf5UO0qWRx\\\n\tZEfdaGD12DmJ5CNpqfFkccdDLVgiMllZoSASVgpBqn6WAUDvmbYBS6PGbCyMmGUfgvj+Vs\\\n\tZQoxf2T+cx9jGDnHLPgQOnL+E3KldaaYrtqh+gKyIBqAFv75an9ov9H6rDh648nUKrlve2\\\n\td6oSOMRBghZcFIAdAoLWdFbc63DMmrMYWRqFepPOKwfzAnD7YAAAzZSURBVJee9yYxXbWd\\\n\t0wVlQTQgLZx6FWK2jlxtfkYcc+hrmKrmu+3nNhB9TTYaIasijDBy9DDqm+UsehgpzbFOLo\\\n\t9i5hBE8rtoWRpPGH1ebKi/0Tlslvn3WwgVlQXRALXw7it8GK00Pi+OOeRvma51vO3FwuFQ\\\n\tqbZh5NSIRre0MKoGUY7QwyiyBRmty6OYOyJ/5zWYYZS3qCljMDC6AMkpolZh7k2XF6jMKp\\\n\tQF0YC18M7LELNTyNXGF8XRh7yQ6ZpxnpGYnkPMLPjwScBIOO1+nBSMwuabModoZC6PJhg5\\\n\tFZyFo4nmKuVRr++lFai3BxhdAbwA/0MLVl3KgmgIWnjHZYiZOnK18W3x4EOfxeyU1sBGVi\\\n\tRy/7Z234wGRn6TLQROOISvwEhpkmW6PJpgFPkUDcBytlLD2XB0sYs3iJdkDeldwGgzcBKw\\\n\tCDDzsgsLVGClyoJoSFp4+6+CZtraj8WDNj6ZuXr6f9C6w8p334y348Z2R7Rw9DCKTNMMMH\\\n\tIqnWE0CsvZ6jRi4UF9mOXcBxjpiuYvexeSpyPZCRZCvcqCaIha+Mdf+kP7q82fi6MPeSJz\\\n\t9TU1X8zWkWtLrPzgXbRuOj8AS60zjKLheD2M1BG0wVjOpucbZbk8iql5xNxhxUKQIdmHZK\\\n\ta3dS/wFOAesBDqh4TMeTNE/QdWPWvxX5+EPLCGmKo+VO7cfzVLqxsAxCMfHHuTu/q7T6P+\\\n\txyf7D7LbRHotkK7/GojXRHouuE3//TSv5f+TEimDZTco77l+Wen6NiNBGp4LBHmeC9Lz4S\\\n\tCDstILtvNAegjpARIpgzqk9PM8F5DK9l60LpVlHzwS8Jfl0v3I1b3t6CqPdEWF/h7W1qrd\\\n\t3pCkP6x7gT8HtgDMvNxCKEu5+WJBNBotfugJyNUmYqp6qNy1fzOOOFz8Tnryn3P48Uw/9e\\\n\t2ImYPaMHKbAQAMMPJaSGQGjHxgmWHkKkBKw0jKoIvLCCMFOkkYIYO8AEb77kE2D4wLjCyE\\\n\tCiovX2zTbERaeMdliKkqcmnlAWqV3xJHHfwNXTlv5y2sfOcfcHdshkotMceoEm+mqW/s98\\\n\tXlMdFMEwmXR6PlbNiHlGymKc21cA7ThqOLDevD0JppiTf2LYQGKBsRjVj73/oomK3DbB0x\\\n\tV/8n4IPo/oMQDrUTXsjUCS8Cz2tHRmEEJD19ZOS5gGeOjDy3HR1pIyMv+qeNjJTopnhkFO\\\n\tS7Tbx9W4P0AhpeZHQ7gmdgIVRYtmk2Zlr81Inh4rOArwEH68pVjvw96n/2JsTMxmIw8lpt\\\n\tuOhgFALJBKMAMEYYqXDRwShozplgJJvLyH33mvpl9DKV7S+MrgeeDmwTwkKoqCyIxlAKjB\\\n\t4GfAf4fV05MTXL1JNOoXrc49MwUsGihVEbLHoYKcDRwEgqEZIWRmH/kQFGMuoj0sBodR9y\\\n\taXvv/UVIc59P3jr8tEuBZwP7AGZfYSFUVBZEYyoFRvPAl/Bn7WpVfciTmPqjV0JtJg0jN4\\\n\tiATDAKR9gMMIqA0y2MklFSCkZBMywJo+X7kSt7ygCjbyN4GXAALIS6lQXRGEuBkQDegt9v\\\n\tpP22s6gvMPX4V1D57SfqYeTFgZSCkef6N4sJRkpTTA8jHzp9hdG+u/szktY9jD4MvBP8KV\\\n\tQWQt3LgmjMpcAI4HHA14GHmspXHvwYph7/SsT0Bj2MFCANAkYC6XeidwOjaH6RjI7R23On\\\n\tfyzDhVEDwauBs8KE2b+xEOpFFkQTokRT7XTgZaayYmqG2qP+iurxT/UTisIo7Ncxwig+vy\\\n\tgFozCiMcEoOVqWhJH0fEJID7m2hNx/T3BiQ4HRvcCLgF8hLID6JQuiCVIiOvqfwKcBvTu9\\\n\tEIj5w5k64UVUjnmMHkYhYEwwCof8TTDyPD/fCKNgqN4EoxBI+NMGUjAK8uTiNuTqvui8cq\\\n\ts4jC4AXgrcDzD7SguhfsmCaAKlAOkY4AzgOdqCwW/lHHE8Uyf8Nc5Bx2hhJNX+Ix2M1KF7\\\n\tHYxkGEF1CaMwAjLByGvi7b693ZfUfxh5wAcEfABwwUKo37IgmlAloqOXAJ8E0h8SU36vyr\\\n\tGPpfbIkxDzhxtg1GqDRQcjZeRMC6MAMmYYuUGQUxxGcvl+5IEHtOfVUdkwuht4OXBRWNRC\\\n\tqP+yIJpwKUA6DPg48L9iBWK/lwQhqDz4sdSOfxpi4Sg9jNwWah/RUGEUzr5Owshr4D2wBf\\\n\tO5dZAeRl9C8EZgP8CcBdDAZEG0DpSIjp6CHx09IkpJwshPpHLUI6g+9E9xDn2YMmqmvLGf\\\n\tBaOg/8gMIy8YgTPBKAGaHDDydt/qT01Q1R2MtgOvBfn9MN1CaLCyIFpHUoBUBd4AvAfYCB\\\n\thgFLyrunAU1d96As4xJyCcWto+JOyM1sIoGPI3wcgLZlh3C6NoWeI9cCu4Meum9knkk4vg\\\n\tdODdBLOk5171s7zbWvUgC6J1pkR0tBF/Qt7rgeksGAFQqVE56vepHP1oxCEPIfI8UppkRh\\\n\tiF76iZYBQAxQijCFgGGHktvJ2b/fLaVzE63peXAa8DNoXbWwgNTxZE61QJIB2LD6RXIYQy\\\n\tM1sDo3B9ag7nqEfiHPZwnIOP9ctG76V5ZhhFc5AMMJKeP+nRCCMZj5Dw5yPJPVt987ToAD\\\n\tUnrb83bwPei/8CsQSY+1sLoGHLgmidKwGk44B/RIhXAdN+khlGfiJQreMcfBzOIb/tm97P\\\n\tbIxHPkZjNdkzjOTaInL/3cjGsv7YUmlR4nb84fgzgUaYaCE0GlkQWQEpIB2FEK8DTgZ5uJ\\\n\tphhJGq6jTOhgch5g7z/00fhJiaQ28fkgGjKOJRYNRa89++X9sPK3v9d810x2A6NtiKEB8H\\\n\tPkvwoipYAI1aFkRWMcWAJMQ08BKQrwWe2E7WbNjpZxcOoj4PtTlEfRaqdYRTU8z4UaKeFt\\\n\tJtgNsArwmtBrRWkM0Vv5PcuI/MtKuAjwL/CbTCk7AAKocsiKy0WjztycFS9Lv/AfAK/FdH\\\n\tHtQVjDqVNWxf6JaKl90HfB3BF4HYp1XnXm2H48skCyKrjlo8LdZsq+B7Mj9fCJ4HPChWeP\\\n\tQwWkFwAfAf+KZxq2G9Fj7llQWRVW4lgAQCIeAxwDPxbVKfANRHAKO7gR8B3wd+gg+jSHOv\\\n\tsQAquyyIrLrS4ultKCm/eB3fE+mPETwGeCy+nW32h+yLwWg/cBPwq+DfpQQfMFQ191oLn3\\\n\tGSBZFVX7R0+onpRP9WmMKH0cOBBwNPwOGloEY40v8eiZAgPETFRVQbeM2p78q1+ibgPuAW\\\n\t4GZgu+4Ws+AZb1kQWQ1MS2ekmnIIh7dRER8RjkT4n0pDVF1EtQW1Bk61iaitIqrLUFv7dn\\\n\tPXoS/wlubwljdE1cz/nYXOpMmCyGooWjrjxPCT9t+jIp6TAlGtBdUQRAcQ1RWorbWorBwL\\\n\tbK88cWnUp2A1QNkvvVoNTx4CeFIqXYA6g7udRhV4NYB3ud5o0mp9yYLIqh96BHBIdhEvuf\\\n\twa4Qh7/1kBFkRW/dH/0KaqYXm6ZX8c/rwlKysLIqu+6PH5i8aaaq9ACLxNh/b7eKzGTBZE\\\n\tVl1r8VMnhkHPE7LKieS36EX09wXUavODODar8ZIFkVVv8lgAfi+VbjKuj2sOOKnvx2Q1dr\\\n\tIgsupVjyF5Hwn1bzIaUtcdgBfhCLybjxnU8VmNgSyIrHrVCbE1o3+QVCDkqel/wXTdNs/W\\\n\tuSyIrHrVCeasPJPZnGn8F2ut1rEsiKx6lQlEmwi+nhqX/CrJzmucZxXzGbGaNFkQWXWlxU\\\n\t+eGAY8v2so8g7gSk0/0enAZ+JNNZ5BpYbc/oeDOVir0suCyKoXHQPMatJ/Cd6PEOISTd5O\\\n\t4E3AdUAYCB0r5heOG9AxWo2BLIisetHDDenvDKKdi2LRkJ+2HU+sAi8G/E90+DD6b4M6SK\\\n\tvyy4LIqhfpxty/L10uCuByCfF22R7pTi2CAMe5CXi9TyEHwLbL1rEsiKx6UfLdjDXg/wCI\\\n\tioRKcy9hE8zn0Y3ICpU/2e3bylRrXwa+4kNLHDGsg7YqnyyIrHpR/I17wXulxxaA6Rf9In\\\n\ty14yLFyuqmcMH57/v9Tw75n8W+GcFSsc96WE2SLIisepGHEH7rSvAz4KMgmP0bxWlRoHZY\\\n\tX5eqYWpqCXgxgq8P+FitSiwLIqtedGPw9xLg+XgyPm/ID3AuVrqJYl89dB69E6pVqE9fK1\\\n\tdXN9mpROtX1VEfgNVY6xx8Z8bLpYcrHJh7VfwLq6LS3AlsBlzZmrpeVBuxfOfhW4d1rFYl\\\n\tlo2IrLqXwAX5S+nhItPfGas/9/Kwn+gChHwT0qH6lNtHcqhW5VZu83wrq27UOu+x4ATfta\\\n\t+4VJ9+w2gPyKqUsiCysrIauWzTzMrKauSyILKyshq5LIisrKxGLgsiKyurkcuCyMrKauSy\\\n\tILKyshq5LIisrKxGLgsiKyurkeu/ABHELVe8zEuIAAAAAElFTkSuQmCC\\\n\t\")\n\t-- normal.png\n\tR.duckloon[1].normal_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAAJEAAADNCAYAAAC4lJKvAAAgAElEQVR4nO2debwlR3WYv9\\\n\tN3e+vMaEbLaB0JARISMouMRywCJIyNQTHEISEQb8EsxiRxTBwbnIBJMI632NgxJpFXYvDC\\\n\tajAy2CARVgkQi8SmXRqN0Db7vJm33O6ukz+qqru6b/d999533zLSO7/fTHdXV1dXV33vnF\\\n\tNVp/uKqrIpm7ISida7Apty4ssmRJuyYtmEaFNWLJsQbcqKpbneFdiUXJJbn9OT1rzgM8R7\\\n\tXldIa+1611pVaSCphEhE1roej3qJb3m23/2vwH8GzgLmAoB2AjPAHevZP1Wj+U1ztgEkAO\\\n\tjVwNuALcBOjaZ8+uOAm4CL1rxyA8imOds4ch7wjuB4CWkDTAAfAk4Fvu1Pdvf/SeHi9smv\\\n\tWv0a1simJlpnCbTQ7wBe9aTAA0QzAG8EnggsAfdAAaCrgCJN6yCbEG0MuRL4seB4j0ZbYh\\\n\tpbdgG/7NJuA1LaZ/g8rwU+Cjy0ZrWskU2I1lECLfTrpVO3Yv2h38aaM4Dv0pjFQfQi4I8A\\\n\twYK0rrIJ0frLC4DdpbSbaW5/CvAvgzQLETwWeA+27x4EvrIWlewnj0rH2nx5q9tT8MNlyf\\\n\t6zaf4425bOieT/CI5d3ujC+/rWIdBCb604/WXgV0tp36V9xgTwQWCbS/sYYPreaA3kEQ9R\\\n\tesOs27PzGyKAGpBoG8jjQM9GorOBM0G323S2gTQR3RYo6wSRY3ZXDgMHgEPAAUT2AvcCex\\\n\tG5DzQ2t54dgGZvHJ1/T7l6P0ivFkJbZx4DXlxK/i7wa8D3BWkfgfUdmcEjEKL0+hksMJIp\\\n\tFmAXyGUiuhvkEuAiMGdABCqAAYnsNer21ZdhsCAZ0MhC4c8RTLxl6SZBotuA74B8G7gRkS\\\n\t+jPGzuPA8kQnUSk8SgrV+seIQHaWz9N6U0w/STTwXeEKQtANeuqLHGJI8IiCw4ocgZiD4f\\\n\toh/E/rXvBFAVRBwASg5IGSSaMPkEiDogjRzGDJQlMF23nQOdc/AJqDbBXATRRWBeChEYhU\\\n\tjuBrke4VMSLX2KePs24Id7HkbaXwZeXkyL9iDNqwn/LOCfsCCtu5ywEKVf3IIlQb3iOR/r\\\n\tiL4UuBQNtUgutSBBroUw0NwBrZ0WoqgN0gRpQ9QEaSHSAv8vaoJZRM1RSA9Aug+ShyDdC2\\\n\tbBlm84j8ich4leQWSQxsIRTSd7nktbp08ArUJiZ5cBzi9l3RCmDE5AiNIvnIQFR0HYBvpy\\\n\thFcC39+TeRiQNAJRCxLA3Bdhy3OheZJ1XSPsfY1CpKj3sTzE0STS2ALt8yBqAS0LX3oAje\\\n\t+D+E7ofgfMQ2CaaDqxlR4RiKaLPlI0Bc0djyk/GXDNUA23inLCQJR+/hRyeMyTEX4BeBlE\\\n\tHatBai4cGaQlOHa9BSmaciC1yEFy5QDiwMo0o1FbHwM0tiPN02Dq6VZrmSPo0l3I8dvQxV\\\n\ttA47xSzS0ARbg6u6D36a4HHh6i+VZVNjxE6edOtTuqIPIC0DdC9JwiOBGjg+Qc5CqQ0qNw\\\n\t7Esw80wLicGecxYPcbemZYsXD1N2h+I1KERbYfJyoqkrQRN08dvo8S+j8zejje3FerdOgc\\\n\tZ01RN9FDaGKYMNDFH6mdPJNY++AOStqO62Iyc/glo5SLmtqgEpfgjmb4KpJ+XaxmileZPy\\\n\tufzmQb4ISGyyNJGpS5Hp3WAWMYu3o/NfQ5P91hdrn1nXPOs+Sx2KVMWHrGe8Svr/ziQzC8\\\n\tJuRP8n8EwLAD4dO5ry28CU0AckcHmLIEmW5tpCsMfijyOYfiq0d1mTJk3nUHvnumn9H5qI\\\n\tTwv9ImkFTnkblQlgAqSTO+fSgWgCpIEu3onp3oFqt+IBzD0R3z1P5H6i6B7kpC8N18ArlE\\\n\tpeNgpE6afPcnsKwlmI/haoHepmnTkgSFm+GhkFpKgFM8+C5vYSSM0ABPtPymlR20JUAM8e\\\n\tq3SANkgHiSKQSZAJNJqB9Cjp4rfQ7t6snhE3pQ25/reJGr+O6hwiawrShoUoue4cQBHRCH\\\n\tg9wtsR46aafaduAJAaMzB7OUSTRZC8JpJmAFKrBFIOTv6vXYLKl9EBmQCZsZorPUq6cBMa\\\n\t30fTfBiJHgSRB4ka/wn0r/zMuGy9YaT2H0Y2HETJtY8h6PQLgXeLmB+wlaAIDGwMkNqnw/\\\n\tSlFOaIemCpASmDrQxSYPKkVdrvgEyBdDDxA0RzbwCzByKxZjZqfJRIfg7V760FSBsKouRT\\\n\t5+MgEMS8HvgtMJP2/sbXLu+8oUEypXw1MgpIUxdD57wAjDIoZfMWgtEIzFszMHN9QMLvu6\\\n\tiQxQ/DwtXAogfpCJG8HuW9fp1Otlw/SDcMLRsGouSTj8N2vm5H9C+BF+adbVwdPBQepKCe\\\n\t6w5SBLNPh+a2HIayeSv5PxIFwGTn+2glgmPCa93W7INjvwHJjR4kiORPEfl50OOIILPjB2\\\n\tlDQJR88gJc5z4N9P2I7uqFYgwgSVooa3SQgraQKM8bzcLsZYGv401VYwjz1ippLa+VOliI\\\n\tAr8J7ysFQNGCpY/C/O/Z5xOBSL5DJD+G6q2rAdK6QhT/4xPwMIjwk2D+GGhngAwNkocmvG\\\n\taNQWrvgqkLLTjk62pFP6lo3qQKnB64gtGc11ghVBlITkule+DYm0Hv9SAdIpKXonrduEFa\\\n\tt1eG4k9c7FbKRQR5O8q7XcsAYs+p6yj1VQq2GuTLySnO5xXS3DXaKJalyzyuX80Pk7QU8u\\\n\tHX1lSgey/E+0EToAsmAQ22Gtt/ppsdq3bBxPk5dREBJsivXZuu7jqzBMT5cSFPDI1zYOuf\\\n\tQfMKOzlr9CSM/iMir0YVnXt6/+deoay6Joo/8URcJ7QR/XPQV4jXKF5rAP00khT8nRqN1D\\\n\tOSC65ZTY3UmIDp3YFPVNZIgYnz/k0UaCRKmimqcKwLQ/+yWWti55nc8fyfwdKf2+pbrfQm\\\n\tlN+wGumL/Z97AFlzcxZ//BJcJ08B7wN9kQegEqRwVBYeb3SQOmfA5AVAg6Jv1LYOr7TtuQ\\\n\tyQAKQCOFWjtSqgymbNO+Ju270W5t8OUeJAin4T1TeOA6QqXlZt7Sz+hye5tSyZQvkYoldk\\\n\t5sbFdtm1TyWL4dHIdq6K7UR/TISqQbL1srycfCfMHy6quiw0HEj+Xv76GlHpOV9Y+QeyNb\\\n\tylB6B1KjRc6LNf8VfF+kpuWwgpcdXN8gfzW37hNir9oRT2S1sJnrf9PJBpmH8zNnBOf5lI\\\n\tQPWNOveMsWikUFbFJ4qvebL3TSxAcEXm8wS+jXofx/sxkPstFT6Shv5O2UfqyV861iAPUV\\\n\tBOP+nVVj0+EsYeL9zhfJXE/jNdIHX+jvOZtNdXUu06P8n7Oz5P6CtV+EGhz1Q43wViaO2G\\\n\t6d8B7VjYjf4yIm+yPtIzlnvwoWTs5iy+5ilkPhB8HNErc5MS3is3SWM1bVVD/0J5JqiHCc\\\n\tqpkQqzBiXT5ueQJs6zM9qZHxQuizgfiYrRmxuhSdWMds9CbnmJpF1Mo2Tikpvh2C840xZB\\\n\tJK9B9Y9HNW1rMzqzWkKw70ZdWRwtle3DOmikLKban1tGI1WM2KCkkRSbZ+l7Tnss5RrJaw\\\n\tnjR2XBNtNcNk29Bgu1T3aNu85UaZ9ASxFoKbrQvASm32afw2qkdyHyvHFqpLFC1P37p9oO\\\n\tVn4HxL14Vx52hx2YH2th+L4cSDI6SNl1Pv8YQdJF6H4PSIIhe5JvTQhN4mALh/VdVANovE\\\n\tnT0vC+AFL5XwVIrctg4pdBFdQ0MPp+RB47LpDG5lh3//5SbEvK61R5g5B5zuSetHOMcY5z\\\n\tySFWFfeuoDch/Zxtq1prne2e/L4u4w1q64mO7D4AzZPt0D8Io80kc5gBWmAkd6CNIQ9w83\\\n\tmDbUh6lTNe+EsojVw7PwTmTui+DzAnodEHELkM1cWaJx5YxqKJlj76/U4zyLNAft+meg1U\\\n\tnhys00i2KqrhJGI/jeRNYVDmIBqpkH9cGqk0YovvdxOOoUaKi/tlU5dpKz8pWaeRyg51OH\\\n\tkZpFEydcQw+VpoXOo0kj4J1d8B0KMrm4xcsWO99JGn4Wg/E/iqiJ7mWtM5wJprB8LjsrOd\\\n\tO8DVk5EUnW0p/gUO7WwX8o87OjKyyyHRpNV44VIITbsfBfuFsJJwjsk52+XV/fKKf6Xz3S\\\n\tKfhHSTk7RB52DuZ4Aj2HASuQrVawZd+V8dx9pqgAYq7wVO00DDaKYd3JbwuF4jVTraBHk1\\\n\t1DjepwrKHIdG6vvMvRpJszS3jfc5TZCSO8heIyX5cahFMic6cdrHa6TykofXRkuBtoqtjx\\\n\tU65ZScb7ogMzD1X6zpNAqq70JkCyv4KP6KIFr6u924DvsV4DlFJxkGAgmGAEmoBsmbQpd3\\\n\tHCCNvM7mQEoOBYCkuakiKcGTlACLgThYh7MgaRk2UwIpmz8KR3cV//yIrX0VmBSMno3qb6\\\n\tGgRy7r/8w1MrI5W/qwe8dOuAz080AjNxvqyslNVV/TVp4TWta0aWDS/HWanc+D2oKyRzVt\\\n\tK4lFau+0s9hRE2u6SnNHUmXOSnFJfQPc/PmagLaeWKTgnyZw9NWg+yBqKJE8DdWvLhcdOV\\\n\t5zZsvqoPypNeIUtQQDaiSgx3EeVCOV7pdrpKpZ6lE0Upivrh36aKTkSK5piO1ffjbkD0xb\\\n\tQcMEc0Nlc1fWSOV5pILTvRRMIZSnEmKgAZOvw84dpYLRP0RERjFrI0G09KGn4zryLcBFxZ\\\n\tHlkCCVO3VkkIohJBqWNzJIKwwhMfOByUrIQSqN0LL5oxp4TGDetIuakskyzt/J4KuYW8oA\\\n\tc/vE0HoaNC/1IF2G0ZeioId6vnbTV1bgE8lFwC/1dBAE1mqDgBT6Ulkd1wIk7Fu0anKQtF\\\n\tsBUjijXTM5qUVI8vU2H5PkHemqmexAOxWG/V2Y/Bn7bGpA9W1Ac1htNDRESx98hofkD9y4\\\n\t0XUk9DrOZNsVg1S3PDIISFWOdlC3viAFZY0EUrqAnbMJ4NBAI/n5pMJckgcnKR37kZvNq4\\\n\tU5Jr800q1wusv/Asgap0PruZZ4k1yA6o+jih78gf7PGshQEC194Jm+Q/4FKs+zqeFoKTgO\\\n\tIRkHSP3W2UYGKYA9kxJIK42O1C6a+UJ+6yciU/KRWFoBjluDM0sl3ynJzJmG8BTMYTBaCy\\\n\tMHqkzc5MvARA4k80ZEomG00QjmTJqo/GbeYFAJTvm4orPWEqTaob8vpwDHGEFy80TqTVoG\\\n\tUOArZRomDSCJKYDVMzNdmt2mDE553qjkdIcaKdoGnSvs3JHqBRjzklWBaPH9l/vOeyVwfu\\\n\t/IqAxMdXqujdzl4wap6vrlVv4rQWJ8IBk76aia5tqIUON4ePy5QNuY0AwGIJkQpC7aEwUQ\\\n\taJ1KkEp5Jq5yf4QJqL4BNei+S/s/Y7FFBhC7PjSpylt6O2tUkLzjXXHNqCCNGkLSM6T3x+\\\n\tTbHpB6WqkoWR08BB4kBw5p4DynrpP9eR9OEjrUZZBCoLx58yavrJXKo7cSSNHJ0LrUzWIn\\\n\tzwR5UvZSwjIyEESLf3u5awz9KZAztbKzhwCJOpCoAYni8WqBVDViK5RHCaRlFmwBfOQjXg\\\n\tulvaYtgMxrrcwX0tABD32lcKmkqIGypZKCRiqN8sxSr2bqPB8XcwSa/Bxq0IeftNwDDqOJ\\\n\tpAHyi4Qr1qOCVDH0Lxz3zDtVddZ6giRZWYOt/Ke55nGAZM42aQBImoPk85pQIwU+U88yRx\\\n\tGcokZayvNnUwEVc0qtx4Oc7kH61wiTg/hGg0Mk8i9QzreNrj0AjB2knqF4ecHWn1sHkIaO\\\n\tjiTXNIEpU+M0EkkOSLjOlmmnpXxrSkBpQtyNuf2elJtvSXng4dy8aUFbhe+xdbGOuAfJA7\\\n\taEdp7tNJHZgtGBHOxl184W/+Y5uPWmzyJcboPLXMuIFNbHXInFbbheJvX5yuWIlPKX17gq\\\n\t77uG8drZdT6/BuWUJAvvELul4Y4bQIREjTzdv2IkEVlIiM8b+VeP8vW167/V4WOfmyRJWz\\\n\tSaTVrNJmftbPBjzxd2nGRjtrNwksiFh1TFcfv1NnMMPfRLSGRAoo8DLwSQ079lW2DktTOV\\\n\ti4DLixOINZpjUI3UZ3kkO670qcoaqaqc0NzQRyOtVZitA0xNj1mzGimYP8o0jMtbNnPB9M\\\n\tD1Nxv+8u+FueMJcRyTJDFxHLP3gYS/+Ds4ftxqpYKPRDgZWXa6lyCahuaFXhs9D9i6nDbq\\\n\tC9HiXz/XN8rrejuNrMFWC6R657wOpCgvJ3vufiB5UxiUOShIA0dHChag1IFRBikwbSi9yy\\\n\tN+1FacrEyTmPf9o5CmCUmcECdxvk0SjhyN+eyNJjNnGs4tEU5QhjPebtv+PtQoGG2j5p8t\\\n\tB9EAMdbSQnm5jVeWQF2rayxr1oov9tm8BuX/fWuJL92xxFKiXHRWkxddOsl0B7L4axXysr\\\n\tVQjo2htj7Y8PHaEZKZl8h1pD2X3TOwPUPHa4d16BuvrXke/9Kkbz9pFo81SDPYe5qWNXF0\\\n\t83woex6IOHjE0GgkhT4Ozc0tdzf4kcvdX7tR+3fgLb031RWfT5b2JfZIFTG8WOE9et8TkL\\\n\tO+W0lIf4hsQz4f2JEBVGj7sFMl72uEg8dSXv9nB7hpT7dQ5Ds/cYx3vuoknnhOc9VByvOF\\\n\tzxSABIVzqw4SQRsSAYn1ddR2qi1GrX/i/0CBPFC/i//Y/uJCgziOUdXCv9w6KIcOt9x9A2\\\n\tBEUaP2Pr4Ps3t5n68NzV2Q7EHR54tIQ1X9e+g9UmvOFv7qCl/2K/JWDlW8+5eZAN/pNssv\\\n\tvudgD0AA+44afvbqQxw6rvm1PWUzWCxS1hnB9YFp21hhtq6T1L0wqam9mR/mF0ZsMbkPFZ\\\n\tq2fNQ21bFmK0n81v7z5iyJE+YXY+LuUrBcEkQBZGnhSwDBsL95oasfW1W1b8hjvU9kG7Gl\\\n\tyFX1nV0N0jfu6XLD7Uu1RR88ZvjA9Qv0gDEqSKOGkGTPWuz0yonPUUHSOpC0BFLuK1mQAo\\\n\tc6XBZxr2ZvmYqtP5SkbmuBSpM0AymOY47OOSgL78FZx1oL/lDR2ZbW+X4tDZQf7OcXLWfO\\\n\tnoWwVZGiC1EwPz7NmRtVbrq3VwOV5Zt74txcKCs3bVT5O9b8qB/Khx+PyDqf0rPY86qRDb\\\n\tP1YBQ+FDGMaQvzuWOgYDK9aaOR5VHTQKIYtFW8zpm2LVNLJEma+UDhVrWVHR87nrJjq2Zu\\\n\toX0hxR8rKoFpc+aOSKFxKtCxcEXR5ahi9lxQ2ZfLOdZXZf2EIOGwow9Ic/PLr7mkWZv6cq\\\n\tiBdECQws5aEUgOyB6QymUOClLJqbcPmG8KoKZ4/yj3x2NQ302Jvci0aEbKRCtmoetCurS8\\\n\ttfdIYmc+/YuU3pEOXojMqhn6ThHQPAfiW8FwGVHUtCu8vVJpzhbee4Xf/eG8U0PzEnR2uH\\\n\tWdkgywbucd8OpyetMeedGRioXLb/1+Yvedn6RZFKSfK0qy48ec2S2YtDhOCluTJpy+w/tE\\\n\tXcor/2FoifbEI3WheaYzZ2YaY76vzqRV+0Q273bg4kJaX5DyhlxYqrefXqY6Nb5GYbhUvM\\\n\te6glTlaBfq2AekoKzeEBIHkPeJTAVIanKQMPhoyJc8a57U+0RxQpqmDiC7ffolC0x1/PJG\\\n\tEAHQ8w6cW28rBMN1obEzh1vNpXWr+v0c62dn+5mZYTCQSqerpBmFf9kBBJUjMHILsFKQWM\\\n\tXoyDqQlo1FCpxtb3oIwkV6QLIhJLsvXuTlz58niROSNCVNLEBJHPO4s5Z4xQ/Nk4XmZtEB\\\n\tXtPUBLiZJdRNdkpju6u/AdVaiPr5RM/MHV7ve1AAKV/vgtBHaDeWp2jLZNDJoa8RzDv1HJ\\\n\tfnfOp8pLK/Et6j5xb9fCTvxwRead2X2irqVpzLKn+pLfSRXDnhXJKJIErz+ygoEUKMfZfM\\\n\tFvNTLzzG7otj/vHLE9y/v81JWxN2P9HwnKdC1Gjmk5a0nK/TzvuyZ6IR/Mcm7FxSC6KtYA\\\n\t4D5pK6vqyGyFb8KcF+0Mlhu1WD9NRzJ/hTjtbdE4BLH9MOOjvs5BCYapCU8L6rAFKl4zzA\\\n\tJ//CUWKhLYcACchGdkbcaMpXS91ukuc3cOEuuHBXQv5yZJNsEtMo2Y/90bYaR1qZU138So\\\n\tnL5kZvahSiHZAeBKKLAfSOc5HH3lPoyx6IFt9zpS/sKdmcWR+QCqMqABWefeEU33dOh5vv\\\n\trZ4ruvisNldePEWxs1YCkj81JpA0QmNDuldIH1JIImRCiXY0aJxuiGYHBSlTISOCFNm5mk\\\n\tgK7Z2BVACFXiDwGoieGe/i9yOVbGhvSttoq6/SVoSdKA+W+7NXE9kang1sL5izTF0XQVIR\\\n\tpKTKI4R3/vSp/Me/3MdX7y5+/ubJu9r83k+dTBSWNQpIFIf+9jjMWi7bZ+sPkjkiJHekJH\\\n\tsUChP9AncDNIhOUpq7IhrnpESzedWKPV0Fkm+65T5CGoIkwfxOfk7Vze/4MrO1tkYOR9i9\\\n\tBcBCc0YpT5DXANEWshEk0eNBB4DI3uPx+UMV9GneoMuAtH2qybtfu5Mv37XIzXsXMQpPPq\\\n\tfFDzx2onfOZxSQ3LxNL0juuAek8tqWew4FUkj2piT3pJgD4V9ytZhDwuJBIfpGRLRDae4y\\\n\tNHelyLSfiS6bwhJYSlb/3Nku1y3U+G6EJE2bX1PytTY3d0QJqAIwZWj8OZNrHJ83A8jllS\\\n\tmnQSPAnAt8ttwedY71Y4p/HaWODtPwp3pBEoHd50+w+7ETtsLebFQ5z6sGkm8fC5IupOiS\\\n\togsGnTOY/YZ0X5ppnb1H4a7DwiWnKtsnqhvnM/cK8zFcea7SOSB0DzTofq1BNKNEJxtkVp\\\n\tFJRSYMMhkhkwaZUKQdmi8Pta9kFeQOgGw052a1JcqbwS/ahvCoko8IvThTVnCu3Y8aeC3m\\\n\tTZrXeEYh6uSaSOTcjL9A6iB6fNbwmYwAUsGUVABR8G1GACnIXwUSCynpwwnmYIIeNZhjBt\\\n\tL+mub+OeHwIjx0TNg+UZ03Tu2EaupcHC/mmGCOlTsvaMGWEp1kaD4upvnYpQrtWAUSWJPn\\\n\tQJMEtJk3vYCayGqkDCSKQEXOD1IHUOZcex8p1GIO3OxXM1r2ITUFw5lVz1UH0Vm2gLyihA\\\n\tkjgSS5JhoXSDXLI2ZfQnLbIuZA5Sx9X3niqcrJx+Ccil+t9/LcXUqq0KnnpVI0FtKHG6QP\\\n\tNzBzEe2nLAwBkuZmpQCSBqYttseZf9QqrplJwwLkNZFpkX+ofSnXQiavCgDSAZ0H1Z1Vz1\\\n\tUH0clZKeX5GX+8UpBcXrf+0aNJRgUp/sY8ac2ocBCZbsH5J/XP04xW/sXU5Lst2k9ZIhuF\\\n\tDQOSCkQepDyvXbQ12KgAR7hpFtfKBDvRGLknMFiNpC1sfJPm9/HaTDpgjoPIaVVLHz1t4f\\\n\trnjDwl1CAUTVMdSAwAUtYoblsTHTkMSHrErAigtRSNBV0SpFO18g99QQLXwYn1faQRgKT2\\\n\tB/o0yG9aNm/oD2VDfMmH+Nl5V750bV5p+z/8HVXPUvkHpcp2O7LP1M9wIPn+Hhgkd10pOr\\\n\tJoOktOdRVIq/ZLJeOX6JTUfgBfoXflP8s1AEhpUAaumWLry6hS1Eg4c9bKzVbh90N8Wqt4\\\n\tnC0h6ZaqZ6lr9sls8i7svDJI2TONAaQADjv0D8vKIesHkkw2iU5rYx5aPp5pvSSaVZqPT2\\\n\thdELsU/wx9QKr47HGvRsqdbVWx/lG5ezNfyWkcdVrKj8p8fQpwtYI6Vn8gtG6ycQZ8Zcg7\\\n\t0YNUOV8UglQoyzrOy4FUgiIHKbimAJIvvwhS68mzxDcexRyIWW+RNsgWJdqqRDsMjdNSoq\\\n\t0OCIGB47V7ZrW9eJCkCBIRakwxqE09KN4XciM0X044gw3FOaVs8VkrJz3qJhsbOE2Qz7kE\\\n\tIIUPUAlSuaMdkCOBVFJ7Hhx/ULB01qS1dm/FPLhIes8i5lBS1JpjlYDyJrQer0SnqJ0Tmj\\\n\tEWosJHSKv8vXGApG7B1oGELccO/V1Qm4Sg+OtKUtZAoY+kpX4NpN6LyHjxfkoIkm+VNQap\\\n\tPO/kCy+nixKdPkF0RgcSxcwl6PEUugZiRVP7swfaVdKHEog1q05RehIqJdoBE5cpMuOuGX\\\n\tt0pH/OOpDAzj47jUQjb/NsDilf+bcgNckiJf1cUTbBGBbrXqTMBkG9UmfO3L5ki39FkMKM\\\n\tI4BU0CwrASm4b0+6K7sJ0Ukt2G4ftfxZZE0MyR1dkrvjDKZBJdomtC6A5tnBo1aEkOQguY\\\n\tqNLcy2LJo722GbG8lNW+YTqQUrKl0PwVqdOie8GLZbln6hIMH+KoBUGYsUXDMQSDV/2RX3\\\n\trJrZVlWkGdG6sEPrgg7pwzHp/tTObs8rdHPgaAoyAdGMEG0XGjuxi6/iW12CZugDks9XE4\\\n\ts1NpAkIXsRUqJgMrIFkvbObKPYZRDnS2agKTZwTV2hA5gz1+aLKBNgf0FHsw4lb4BVA6nc\\\n\tkCOAVDmSq7p3UKYojZ0tGjubOQiQd1agwbIJuewva7CgtvytXMmbrQf2PiDRL4Sk1Isq2M\\\n\tnDpiunEYDUCExbFJg4P0mpZA55BPj4fNUjVXeLqhIVDudH7qeYnEZSO24PTIlk+cJrwsIq\\\n\t01xnFm/sjrMwW98p4v8S3AhTSvlLddDgOp+u4Ta89wb7dmRBgrIVhvvknzM96vweF5+tRi\\\n\tl8Lyn7mVFD/q6bIfsgqf9npxkOVWmiuloUIKoGiQFBChtnSJACUzo0SGUoKkAK67pWIGkI\\\n\tRR1IY/sIaQiSwb8QoPZLaORvkMRYkJzp8h8hJYzFFsAcrPKJemtgMx1WyDqtGqRghnS1QG\\\n\tIFIFVBUUp/dHyE1IPk3hTxIGVwBSBpYjVS9uX/8BeSFFT2Dq6JXAik4u19H5Cy9goaonCf\\\n\twUDqqZtKseFWHSS77Q8SxePlQNowHyF1vpuPC3Kft7EfgPBvlOTvs2UgZRrMrQCo3juYJr\\\n\tKVvs9WVFGRepCA7OW+EKTgfKER+vhN2nMNawMSdSBRAVLEmoHUk7+sEcM6RMW61Yp/n839\\\n\tUxOAZMhMmAcpA8trMO6tWvaoMGcCcB+II9LN6lSBVO6EQUAqmJABQHLn+k8xGR4AABnLSU\\\n\tRBVIFUWf6gIGkdSBVatQxS+BzrAlI0HEgqWK3jJg97QEqtGcO/i5ZC6mPkBdTsqSq2zpzd\\\n\ta7dqO00i94w5REWQZPVAKnRmNUgr+ghpkO/R8RHSACQtayRDNlLzGsl/+s+Wf29V4XUe2e\\\n\t22kfx8hAdJqkGSEkjZA60GSDJekEr5xvPtyDUEKbsu7JcBQcKD430kb9K8RnLDfPAg3V50\\\n\tSXztq+V2e6G/uNEfpCBNszkk8jxlKKTUOGHDuPvWgxR2DoUO3lggkYOEywt9QFqrj5ASlB\\\n\teCpPT4SNlHSAVgD2oq30itg+gIuJfUnF9UC5IuB5J74BAKr0nCxgkbxuVZFqSsIcnybX6E\\\n\tdKUayYPkYMqcbvkmCnLpoZ5ieiCaeuW1fvdWe6OU3KmuAEmWAylo3GFBYliQbMbVAKly6D\\\n\t8wSBWdWfnBiRFBKuRfCUi5s50vdfgIBPPNqpGZu2OtfMOWkdhsHqQqHykAKYdjQJAKD0Oe\\\n\tLzg/MEjOPwKC560AKMtb2vaUPT6QCvmy5whAKjzLeoFkMpDUL7xmefhm3eU1ozMFBxFpnJ\\\n\tsucTB59VsAyVZGsljfAUEqmLCiFnKVd5sBQAoc7bwjStcUAICxg1R4jryzN9ZHSCtEhXD+\\\n\tKAMp+8jFsBDZJ/g6kHvnXhNlk4/5sWaAMRxImVSBVOpoWQlIpfKztFDjjQmkE+YjpBWSge\\\n\tR8JDWuzuY4SPVHrOmP53dQte/fmASRRg5PAaRodJAK/s8aguTL6wEJ1hWknmcJfCpft57R\\\n\t2TAghflqJASJzMe8wX7HWiov6VdiDHwNVUi7IA6MAkj+QetAkmVA6rO/HEg9Dw4Dg5TlL9\\\n\t23J71c9oAgwZhAys8XQRpVI5VGh3WSgZTJDQDR7upvTlWWNv2qT/uG/AIA8SLeHyqCFPUH\\\n\tiWgZkCpAGRSksv/UdwTWD6SaDunxm/Jzj7yPkFZIEaQv9svavyTlegBNcoiKIHlgakByty\\\n\tiDxKqDVG7IEUCqdJzzvI/Mj5CWJAfpS/2yLVMKX7Tq07hRWq59xP8e10AgrTQ6cgUgjT06\\\n\tkmz7yPwIaUlUbkP1QL8sy0H0IHAr6rQRQvYDbt4nGggk+6DrEmbrNeAoIFX5OwVYQnmkht\\\n\tnyaYDGZXO1GWqvnn515hfZKezuPPYnk8hAEg9OD0gOpnB+qRYk//zLgSRrD1K/EZjblhed\\\n\tH4HRkZ+qO+FlOU0EaknUeN7CkoEUFUHK5o28v2SL19JibS9I3uwQ5PEP7GUwkHr+AsMRzp\\\n\tqBxHhBWkl0ZOWUQHDN8tGRitNE/WR5iOA6FMWkkHTtJVGoeRxIkTNjQbqv/NijI2tAOjGi\\\n\tI8nruBYgFfKX7w/L/ET7TUBffyioZV85CNyIgnaPOYA8NAFIlEDy/pPbt89YAVK5EwYFqS\\\n\teN9QOpYsRWOA7r44fZlX7LKoBUNWItlBc+Zw9I1wI0nn6sXNmC9IVo+jWZJvsHABaP2pnr\\\n\tyP9ycgBS5EDypi2bAghX/mFdoiODc/1Aqix/bCCFdQxAKj/HeoCUzSH5cxlIn6psx5IMoo\\\n\tkAPgag3XlQ+oPkoQlBWi6obc3DbKUSpEdtmG12Xdgv0SLKZxhABoXoa8BDoGh3zpqvSpBk\\\n\tZSCtWZht0DkbOsyWHCRcXugD0lijI6+DaIEBZFCIDHANgC4ctvCEIIkHyZmzKCqCxDIguY\\\n\toPFR0JPPLDbKPgukFA8m0XlDkoSL0LttegEY1n9PeHghrVy/RrPu1HGh8G0IVD9sYhSNk/\\\n\tD1JUBEmW0UiPkujInusKx4OA5B9gFUAq5I9A5RoGlEE1Eap8EjiKGnTpKIRayA/poz4gha\\\n\tZt3NGR/UDy0wiPqOjI8Dkq5p1WDtK30GhP+Y+xTgaGCFhStaM0nT8QmLEGIs0cnkFA8tGR\\\n\tNSANHR1ZBQdB/mFAqhz6h2XVATBGkArPkXf2GkZHXoMKjWf2BuVXyUAQzbw2G+p/QBV0/m\\\n\tBRE0UN++3kbA4pAAkpgSRFkCiDxHAgZRLsl0c7kINU/mseCqTgmgIAMFaQVhIdWQDJm0KX\\\n\td3CQPjKoFgprMahcAxzVNHHaqJWDRFQEKVvx97PbEkRHemAC0DajI/P6rhSkwrOEINF7r0\\\n\tIdI4AHQPqGfpRlOIiUReB9AGbuISRy2ihqYD/zHxVHbOECbSGEJBjJrWd0ZC1IwHIgZfl9\\\n\tWl16b9kbPDry71Cp+gJ7rQwMUWbSlPcC6Px+VA3itZEHKRuxOS1UHqFtpOjIHs2yEpD6pf\\\n\teWvYGjIz+ICo3LH2ZQGdacAXwWtZ8YMXMPotIogeSG/lGzaNICiE6M6MhhQar5y+7xm9gY\\\n\tIFX5R3AIlc8ypIwCkQHei4IevR+iZgmkZgmkUCtVgTRodGQRpLWJjhwDSJUjMLLtBouO/A\\\n\tgQD2PKwjsOJDM/m43S3gOg84chWcxAykZsGUhRCaSyZlrrMNuatEFAGnuYrYwHJAfAmKIj\\\n\tP4QKjec8wDAyiiYC5TvAVwDMoXvdqKxpR2sZTC4t1DjZ6AyK/pJUgORg2hDRkfn9RgKpyn\\\n\tEugRTWda1AKg39D6PyT+XaDCJDQ5RpI+V/A5hDe3KN40HKRmc5TBJqodWIjqwCqdBBg4HU\\\n\tOyNcuu5EjI6su74I0odQWRrWlIV3GUX+BuUIaRdz5HvQaGUgZfNFmSlrOJCCSchxRkfWhd\\\n\tmOPTpyrUCy2zWOjny/qtB47vcYVlYC0TzwbhTMwTtzjRM10ahVBMnD5EEKZ7YHAsk1zrjD\\\n\tbHvSsJ1ZZWbWAiSqQAqhCcuMxgnSPlU+NYoWCkofTmZelznY/wdAjx1Al+ag0VoepEIsko\\\n\tcmAIkSSEgRJKgGqdzog4BUMCEDgOTO9QOpsvxBQaoY+heOe+adooo6jgTSh9Bo+F9ddrIS\\\n\tTQTwHbDRb2bf7dBoByA1SiAVYTohwmzLIJW1QgVIJ2h05N+A0LzyXkaRkSEKtJF1sA/cBW\\\n\tliIWm0IGpZkPx8UTDs7w+SsL7RkYEsCxLjBanPrHZ2XGkKyyCF5SwL0l7gs6OasqDEFckH\\\n\tgfswCWbfrUjUzjVO1EIaLQuSH6k1WpnGqQbJaaGxR0fWgFQZixRIX5AqgKrTHOsKEjlIuL\\\n\tzgQXoPWvtzRQPJOCCKgd8HSB/8NohYkJxZI2pakLLRWcOB1OgFabnoyH4gLRsd6aUEktck\\\n\tsDKQsk6DEyw68v+iQvN5d1U/+wCyIogCk3Y1cJRkEXPgTmg0A5BaRZC8g10F0nLRkWseZl\\\n\tuUwUGSVQVpjNGRXwFuWYkpc3ccgyhHsSCR3v8N52A7YAKQiJpFkKJGcbveYbZU7JfSBgaJ\\\n\tECSK5/ppllUGqeQfWS30/NsrHnhwWTFEmTZSfh+IdeGwncVudqDRLsxkizNxmkVCtgog1Y\\\n\tbZIqxqdGTNxGOPDANS5RxS6ZoCAIwfpHKdIASpi/I3K9VCwZ3GIveh/DWAue+rOSSNdgYP\\\n\t0nT7LQdSowiSrFN0pNTAsyogSfGaLM1fX7q2ouwxRUd+UFX2Vzzh0DIWiGZ+LvONfhNFzd\\\n\tH77cJss+0gcVqo0bIgOXg08vsrjY70IEWjg1SnhVYbpKy8MkisNkhXoxHNH7q14gGHk3Fq\\\n\tIrCTj+9DIbnnC3Y9rdm2PlLUQhreR2qXQKqJjgwXcgsglaMjvTbpB9JyPpLfL3Vkeb+Utq\\\n\tGjI8tOdZ7/NuAz4zBlMEaIAm303wHVow9iDt5TAqndC5I0+oO01mG2dfD0A6lytpgRQCp3\\\n\tfuk4rMegIGklSFejUvVEI8m4NRGqThsByV2fcw62M2UhSFHD7duh/oYKs91oIFU6zowKUh\\\n\teVdwO0XvDtigcaXsYKkddGql4bPYDZfyc0O04btaDRtPA025nWyUZtQ0VH5tpnvNGRTlYD\\\n\tpLFHR1bde1mQ/haV/eMyZbAKmsjJd1T5K4Dk9uuchvFmrWNBkmbgePsYpGGiI4WimZMBQb\\\n\tIapx6kYAVg3CB5DTgKSLVDeamoT1+Q3gFC60dqf6pjaBk7RLOvz3yjt6qS6tyDpA/cjDQ7\\\n\tgXPdgWYbJJiMDILa+kdHBtoKsuOxfITUQM+EzkYBqe+ckN0O8BHSz6HytYqar0hWSxMB3A\\\n\tH8iSokt/6T1SbNDjQ6BZDEAVQLUhDQtvphtjW+5ggg9ZwrA7E+YbbvQKH1wpuqn3NEWRWI\\\n\tcm0kvwrMmYWj1slutIsgRa0SSM31DbNV0zuz7GU5eEp5N1Z0JAD3MOQ79oPKKmoiAdWHQP\\\n\t4HQHz7dWiy5NbVrG+U+USNlgMpDyNZl+hIY1t7KJD65F0XkGpW/lXlD1RJa2q7Ilk1iGZf\\\n\tf53dUX0HyB7SmPg710BzwmojB1A2h9Ro2bWzdYyOtD8Y56td82DjACm7ph4kK2MD6QDwxy\\\n\tC0rvp6TWVHl9X0ibwsoPorIKR7v4LOPeDW0zrQmgiWRNrWtEkzM2ujR0c6kIaNjiyRs2og\\\n\tlWejK0Aac5jtH6jK8t/NG1FWFaLZf5eN1P4a1S+j0P3G+4MV/pYFyS/SepB8dKQHyUdHRg\\\n\tFgYw+zpRKI1QcpuLcUgRhTLNKcqvwBQPufjX1gBqyNJgL7iD+PqpoDd5Pu+ZKFpzlRAVKr\\\n\tCNKwYbYyYpgtKwSpX5pLHyrMtme6YGSQ/gjl8Go41F5WHaJAG90A/CmqxN/8sP2JhxAk53\\\n\tBLI5/ZHinMtjAh6bTPINGREjTFKCANOHpb4zDbReD3QOj86I31lVqhrIkmCkB6E3BAF+eI\\\n\tb/qABabZzp1t72A32s7krXV0ZCCrAZLXLoOCFPhpI0ZH/iEqD9XUemyyVubMy37glwCSuz\\\n\t5Puu92pDlhQQrmkLK5orWMjnRLJxsKpMqhv0vzeevmi5QjIL8B0HnxV2oqPR5ZM4gCbfTn\\\n\twHUA3S/9GahakDK/yK2vNTsDRkdWgBRGR0aBdiqAVJrV1nxScmSQytf0FFZMW+Uw2/+Jcm\\\n\tA1fSEva62JwD7ia4FFPbaP7tf/1q3yO5CanSJI2YRk4HgvF2bLiGG20ixUsudgOZDq4FkV\\\n\tkEpwZGkCsA/l91Ch85KhvuE5kqwpRIE2ugN4C0By27X2FexmB2m0kAJIrSJIqxxmK1Er6L\\\n\twTCKTe6Mi3A6s2L1SWNddEAUi/C3wBlKXPvxNMCq2pPICt2UEaE9lx3zDbcUVHNju2ZnUg\\\n\tVSSOFaRCej1IeixG5xI0tUCV8t8OvAuEzo/dUFX7sUtz+SyrJinwb4Gb9PiBye4Nf0Ln8n\\\n\t+PbxYFUJPvQ6HHBFA1QNvup6Ci+Jh8dwEY5/KYhBok8ntELQuZqu0UF0GadVXQZ7X7LHO+\\\n\tT15VQcKoVV8Ht9WjMcm3DqLz7gMeDaGxa4bmY2fDfP8RpbsGrlAm6+EThdroduAXwY7Wkn\\\n\tu+mPlD3qz5xVk9dhS9/2708IERoiMH/wipNCbzilZppArNouX0Pnl79stl1cQi6fGU+Kv7\\\n\tcoAAUiW9a47kliM4Mj+Oyj9YLXR9xU1WR0Qr9LHI2mA894dXgH36jwJXSWuSyZf8LjK1HY\\\n\t0XIF3CPHQPSx96B2bvLXn9duyk9dx/TnTqmWC6aNIFE4NJ0NRuMbFVTyZ1xwmosRpJU/fP\\\n\tOK3jjxWNF9D5UvSoFDVgcSffl3J6n7w9++WySnH0ydcfwhxaqrjASuuyU5Joa+ti0Ns6L/\\\n\t1Cbb6VShUv66KJSqLAK4EHNV5g8drfsMPw1iQapyz+xZsLAAHogQfpfvhqzH13svIwW4r+\\\n\tUmvC5h1Qc4T7q6WR9FjcFyCAdO/8F9IHFm5biyF9WdYVosCs7QN+HDDm4B6Wvng1NDskn3\\\n\ts/emRf9cUmJf7k+9AkYbQw2/roSGnP2LRwck9LSeWDVQDJb81Dx6vbwNeu00ikLS8zh7t0\\\n\tXvr5vnlXQ9ZdE2UgKdcCbwNIbv0kyW2fIv5K/99t08XjJF/59PijIzuzuZYaFaTKCg+wH6\\\n\tT5ob85uNi3HeSUibfq8eQhaay9FoJ19olCmftfVwBECJ8Ank+i6LfvXf7CdoeJn3mr/XNI\\\n\tY9TEkHbB+UZqEsTE1hcK/SPnG6n3m0jBGGzvGXThELp4OL9P1iRa9IF6zuf7tc1Y5RfV5V\\\n\tUl/uy9tWRG2yfuUOFxMtlg5lfH9wZHnWxUnygUg/JyYA/z/f/6MukuYb53V754m0UELPMR\\\n\t0mWC2mRia27qYDSNVKeSqrRQTV49Hteek3bDyNb2D0p7bQCqkw0D0ey/z/yjAyg/Spx2B7\\\n\t3W3Hfn+MNsoyYyub14oxCkclL5YFwgdevDoqPTJn9dj8d7ZKJRm2ctZMNABDlIenT+Zu0m\\\n\tvznodebhvaxGmK10ZqE5UbxZ1uEDgOSTVgCSLlZ/GTg6efIWXUzfLJ0G07/yjZobrI1sKI\\\n\tjAgTTfhfmlt7Bt+hODXKNH9o83OjL4CGk0fUqvczMoSMstj/RcWJFmKnzWyWZXtk88m4km\\\n\t02+5uabgtZMNBxHAlrd/HZoNUP0RZidvWy6/zh2yAIwrOjJctG10kMkdFTf12zGCtNyIDS\\\n\tAS5JSpn9C57j6ZXM9Vq1w2JEQAW377m9BpIdtnnsxUp2ayKBdNdeDoyGE/QioT25DWVJ+b\\\n\tryJIraK/E50y9T491n0frQbT//mrfdtkrWRjoFwjMtlG55cWmJ24CKN3s9idqc1sUmhOFx\\\n\tZs6/YBu8Th0w0QGfsufoT7poPL7Y5l+jT06F47NZCVQbCwWrFgGx4Eiao1w/+KvDLdzttj\\\n\t28RdupS+TDoNZt68vn5QKBtWEwHM/tcvQSQQp/tl29QlTLYX6vKKtFY3zLbRQmZOo2dCp6\\\n\tA5xqCRStfIdAuZaCJTreMy034a7QYzv7Z+w/kq2dAQAWz5ta8j7SYap/fISTOXMNWuXgPo\\\n\tTK8wzLYUHSm90ZHSmkamT+699zhBqvCLovO27ZeTp56l3fSgtNd3OF8lGx4igNm3fQ3ptN\\\n\tAkvVNO2XoRU50ekGR665pER8rENqSzpbeSqwfS0ejU6StlS+cbMtFk5lc3jhnzckJABDD7\\\n\t3260PlI3uVd2bruAmYkj2clWG5nYYuFZrejIYCFXpk9FmpO9lRwEpIrEPiAtAi9B+Wa0Y5\\\n\tKZN4//PfpxyAkDEVgfSSbb6GL3e3LKlscxO3kAgLaw+PG3oN0Fq31aUxaoECQf4Fb3EVL/\\\n\t7chBwmyjJrLlDKvZyrIcSDXD+AqQYpSXoXwaYPLHP92TYaPICQURwOybrrembSnZJ6dsOZ\\\n\tfZib0yO0n64LdZ+Ls3YA7vdSBN5iA1WgWQxvIR0qhFtOXMfLU/lBFBCvZj4KXYYD0mf2Lj\\\n\tAgQnIEQAs79yAzLRQo/MH0N5DDtmfx9Aj+9n4WNvIrnzM/arIxVhtmP9CGmzQzR7BpVL8C\\\n\tOApPa/IkA/ubEBgg0UCjKKHP2Fi2DrFEy1kanOT2B/pGYCoLnrMtrPeLXt8GTRfmArWcr3\\\n\tTWzDatMl+10ATfIw29SHjrgwW+PCZ4MwElWDD6vVhcPo8Zq3lYcLsz0OvAT4lMjGBKiSlx\\\n\tMZIi8uVhvgUuADwLkAMnUS7cteRWPnxRaeeNHGGnmQ0iU0TTKQ1AFUC5KPz85A8nHaKXrs\\\n\tQXTxSHUFB4tFegC4CvgaAlM/tfEAgkcwRFAAaRv2B47/lU9onHsZ7ae8zMVtL0JiYRoUJF\\\n\tH/AkA/kBLMoXsspFXSH6QbEV4M3A8w9dMbEyB4hEMEBZAAfhp4B7AVgNYErSe8gObjnmdh\\\n\tKIPkTVkGUteC4kGqio50MGXRkeki5uDd9VGK1SC9C/gFYAnZ2ADBowAiLwFMp2M76cUAiC\\\n\tCTW2le8EM0z3kamNRB1M1BcqG1o4bZ6tH70KWj9bGxOUj7EX4W+KBPmvq3GxsgeBRBBD1a\\\n\t6UXY17YfbztXkc4MzXOfTuPs77dLJfFi4Gx3rUbSJAApRk0agNSrlVRT9Ph+9NgD9q71IP\\\n\t0t8B9AH0Zg+gSAx8ujCiIvAUwt4HXAmxDZ6cfVEgnRyY+nsfMJRNsfAyLW//EgmdysYWI0\\\n\tjRFNc5DS2PpEDiRz6G7rYGcB+IW2/BbwBuCT/vz0K69b/UYYozwqIYIerTQJvAaRnwc9D4\\\n\tJ+jiKiLacj285Gpk9BJrYijbYFKXiztgekeAFdPIzOPYh25/I75SDdBvwa8F5coMn0z5xY\\\n\t8Hh51ELkpQRThMiPgL4GeKGIi60qP3qjhbSnodWxk5UY25BpFzFdNFm0gIXiXp9H+CTwR8\\\n\tDfA8bTeqICBJsQZVKAyT7qduCfi/Ai4LkIJ1VeWPGOWKmpEuDzwEcR3g/cF+adftWJ4/vU\\\n\tySZEFTL3zoJ2QoQIeCLCU4FLgMcCuxFOs6+kKaAQmQOaNG8C7hLhFuxvzN8IzOeFwfSrT3\\\n\txwQtmEaBk59kdFoBT8x9W+Li2eLG2IJpaIJo8TTR44xMThM7r37VpMD55a0EjTr3lkgRPK\\\n\tJkRDijN7W6I2h6RFJG2IJheJJuaJpg5A5/BPAn/ZePqafdlu3eVEeI16I8puyu0k2a8z/i\\\n\tSRYL5e8UrRo0g2IVpeLq1OVoArpd0+fS0rsxFlE6LlJYdIIH8NQ8G238vWvkobSzYhqpG5\\\n\t/3WF58VCZN1E+8qSBeiQ3ZeX0G6jDzxxzeu4UWQTov4yCZzn9o8DbwwWUF+B6CLwTNm+Y7\\\n\tp+6f6RL5sQ9ZfHBPu/K+iHnHoy2J+W+HmEJhJdvC612yCyoV+j3gDi31S8G/gfGsULAneC\\\n\tRiaZ6EbT3atBrgQ59VGsiDYhWkYWEDmO6I9rwkLUMCB8HmgTTyGtYwCvIUIof3/6USSbEP\\\n\tWXrwBnm4RDUROkZQA+jf3arZWZ2aM6N4fMzq5TFddfKmesNwWO/eGVhZigmZ+7lu5HLkOa\\\n\tNoZaml2aP/yt9avgBpJNiDZlxbI5OtuUFcsmRJuyYtmEaFNWLP8frUcjd38kwVYAAAAASU\\\n\tVORK5CYII=\\\n\t\")\n\t-- normal@2x.png\n\tR.duckloon[2].normal_png = love.data.decode(\"data\", \"base64\", \"\\\n\tiVBORw0KGgoAAAANSUhEUgAAASIAAAGaCAYAAACrJ06uAAAgAElEQVR4nOy9ebgtx1XY+6\\\n\tve+5xzZ83WiCRbtmwNBGPJFjaeADMEYoiJkwckIY/JEF5IIHwBkhAwCUkg08tLeIGQvDwS\\\n\tEiCMBmwMOJ4YPOERD5IH2ZIs25KQdCXdq3vvOWd3r/zRVd2rVlf37j2dvc+5e33fvaerq7\\\n\tqG7q7fXmvV0E5EWMta1rKWZUq27AqsZS1rWcsaRGtZy1qWLmsQrWUta1m6rEG0lrWsZemy\\\n\tBtFa1rKWpcsaRGtZy1qWLmsQrWUta1m6rEG0lrWsZemyBtFa1rKWpcsaRGtZy1qWLsNlV2\\\n\tAta1llGX30Jcnzw2e+dY9rcrClN4icc4usx1rWsnKye9eLw+G3Aj8BPAA8Gyja+sPOPd8V\\\n\thTev/5nFVXAfSN+1rGuNaC1rSYiC0I8AP+aPLwNuBf7UpjcA+mbgC4DvX1wND5asfURrWY\\\n\tsRBaG/QQ2hIBd3XOqAnwb+K3DF/Gt2cGUNorWsRYmC0I3Af0gkOWJPKG3oJ4AQuGvedTvI\\\n\tsgbRWtbSlCHwCySgAzyhAwpCXwv8gIr68EJqdkBl7SNay1q8KG3oe4HbWpKdTJy7Evj/zL\\\n\tmPdpW18/B/bpzbvPTbuyt4gGUNorWsJZbPA17dEf+ZcKC0oZ8CLlVpcuBjbRkoCJ0AvtOn\\\n\t/zcT1/QAydo0W8taiLShfw0cbUn2OPAYRBD6GuDrTbpPALupDBSEngd8EPgXrBWCNYjWsh\\\n\tYlzwf+ckf8pwA2nvUHIbxFqQ1ZuQuac4gUhL4ceAtwrQ//5hR1PVCyBtFazntR2tC/GpP0\\\n\tIxBpQ38buL4tnRYFoRdTguewD3+MMf6k80HWIFrLeS0KQl8HvGBM8jvV8aXAP2xJFw3dKw\\\n\th9PvDb1BAC+C04vx3VsAbRWtYC5UTEV/dI92HJqhH9HwYuaElXaUQKQpdSQuiESXvem2Ww\\\n\tBtFazmNR2tBfoVxDNk7eQ3YUyuH67+xIZyczDoFfA64z5x8B3t6j3AMvaxCt5XwXR7uJpe\\\n\tVhcYfuIzsG8KPAoZZ0nwZOQ6QN/Tilb8jKaymH7s97WYNoLee7fB2l72acvIvsEGSHr6Vc\\\n\tjd8mpTZ07PYQ/hrgB1vS/ias/UOwnr+wFiXFuy/0R0KpKFD+1TteOFfHO4gjQzwqzqR1Jh\\\n\t2O7NYH5teInqLMsn/U85L34A5BuaJ+oyPdRxgcD8dXUi6ATck28IaeZR94WYPoPJLiXceJ\\\n\tAIPUhwAi4NwQ3MUgF0F2IY4LgYuAC3HuQuBQCRS5UCnUxwCHc6d8fufAnfOZn8JJDtljOB\\\n\t4BTuLco8Cj4E6CbBcfuiIBKCKoZc/67HxvRilfBjynZ9p3M7z4SuBVY9LdhduCskX/P3BJ\\\n\tS7o34k24taxBdCCleGfJhYYI4GQTsmcBN4C7FifXUE6suxbnrqXcviIrry9AMgsqf+zAFU\\\n\tTWfYgvy6nrIC5Sjup8BHBncDwA3Idz9wH3RceOexHOFHddTayFOXCO7MZ7J74/ShuaZL+g\\\n\t9wB/h3bfUJA7yQ4DfA/wlR3p1sP2SlzfHdTWOzSuruTvOG7OCM4xgOxmkFuAmyk39LoZx9\\\n\tOBQQQQp94BZ92GQsWlKo3WWnx8KmxNt8hs0/mkTLYo/b2QfRgnH4Hsw8CHcdmdIKera5Xp\\\n\tl91wD13iQXQr5RKLPnK/HLr5JuB+2ofsgzyFY7dfCHyAeL6QlauBzx50EK13aDzA0gQPUP\\\n\toj7gCeD+4OkOdCcaSEgnoZKkVFaTPiahhJYWA0oWakww3NSGtMxJpRpTXpvKv01+GK65Ds\\\n\tq+u8C3DZvTj+BHgXuLfjeC/CmeLup9ZlOkf2tLur1kypDf0R8B2Mh9BJjt3+CPDrdEPo3c\\\n\tBCbM39KmsQ7QPJ335MhSR0wquBr6Bct/TF1OuWylTicE6ogTMLjHxaDSM2jEYjICNqqMwd\\\n\tRmWekqm8i+sguw7HKxEBXI7jg+DeAbwT594Cck/xyRt8fo5i9yxSHL4K+Ku9bn7Zvj8G/l\\\n\t6PhB+mXPbxwjHp1qNlRtYgWlGJ4QOUK8JfCu4rcPIyKG4eN/tiYhhFF2sYufL4xJfD4MLy\\\n\t2GX+/NAfDyDzf8lAdv15Adnx/7ah2C7/hn/FE1A8Dvlj5TV9YBS0tKAZBdNRGADPxhXPhu\\\n\ty7/HWfwPEGcP8Lx5txo5OUsOga+Ypvxea1xzCgT0p25DPAP+2R5W/3Lft8kbWPaIUkAZ+L\\\n\tgVdQbjPxMmCziqn8OuOngrkorXne1WMNfh0br/LPjsCJL4HsKLiBgtGg/MegBEbyuISXI6\\\n\tTNaoCFvGQHyR+H4nQJpvwhGD0Eo89BcUb5jLJm+13Q1rTPKMQFH1RW4Nx783OX34ofi+8h\\\n\tj8uhm++mz+jakVvvIjv0rDGp7sUvlD0fNKK1j2ifSAI+T6EEzyuBl9D2jCpTqkWj0Ukn0Y\\\n\ty0iQaxZlScgVN/BCdeSrkDhniA+LSO0nRKHgMipWUloWCp4xBwm7gNP2inAeUyKM4io4dg\\\n\t9GAJpt37YPRpyonJWjPyJh4oEy7MZSoyGR27XdF3vAyO30Xpe+uW4cX0gBCszbKkrEG0JM\\\n\tnf5tc+ioCTQ5Tw+VbgS+g7430ZMMofh9PvgGMvoLJu1JSkGCzDijdkAgxBcsTHOX0NKg8L\\\n\tKASyw7jNp8Hm05UGJrB7H7J7D+zcAzufgOJkJ4wkT21D3XHfBpe1bZJWixvC1njLzcvaLE\\\n\tvIGkR7KPnb9MxlAbgd3Lci8k24sSMyaZkaRkYrEHOqASMVv/sgnHk/HP1CEP8KRTDyQ/gy\\\n\tqoFRANkIZODTjhA3xGnV3YkH87B2cssgrqcTVU4GG0/Dbd4Ax7wJWJxCtu+CnQ/B9oc9mM\\\n\tp7I8UmIr1dQ+A2IDt089h0m9eUdR4vjwNv7V+B80fWINoDyf/4EkqnrYCT4+C+BfgOkFvL\\\n\tFGE4esoCpoKRJU841TKSZkfNtj8Fg2Nw6BlpGEEMFoiVsQhGuT9ZQwo38NeGPNVxBL1RDS\\\n\tsHZMdxR+6AIy8o8xh9Dtn+EOx8BDnzue77aO/V8CIYd0MHx2Dj0s4kSl5Pyxay57usQbRA\\\n\tyf/Iz+4XwLnrQb4H+HbgRNMeWQaMLDmYDEZnPlQ6sDev8aaPNakGZV4yimHkUGlHiBvEmp\\\n\tFeetIAjyitKqT1Zl917bCOH16BG14Dx76a7MIN5NxHkbPvR858AIonO+6SK0cIO8XB1nVj\\\n\t0kSynk3dIutRswVI/oeX+SMBJy8Evg/HXwQyKMzIVGWmeZkBRtAcTepKWs2CTrwDetQpyt\\\n\tefr6YQbcDxF8HwIuqRsKx2NJPVo2du6PNU8dUI2gAXjcDpPNrOZZTQ0XmqUToywvQCYYty\\\n\t0DHUEeTc3ciZd5dQys1XggYXIBtXd9/AjadM4hsaUX6y+rHzCUTrUbMlSP6HT/FHAvBVOP\\\n\tdqcHeUmgR15xYNo2VrRgnndahOH81Idkvn9YmXgDtMcyQs+HnCtjtWm4Ewb6jUjGwlhlV8\\\n\t5TvSEkyzyHektaYR9WteqLwGuEM34g49Ey7568i5jyOn/xg58+5yhG5wUee9w23A5hhQxf\\\n\tJW/BdA1tKUtUY0B6kBBMBXAa8GKYd8q9tW0AivgGbUOccI+mtGw0vh+PMpZ1y3aUZBAzJa\\\n\tTZRmgKu0lqHSppRGFDSdKn9Hu2Y0QNgADsfxOGLNKUzGzJEz76fY/iSyfU/6ngAceioM2x\\\n\tbWJ+XvAP/ufNKGYK0R7Ynkf3BFeVA6oT2AwpyTsGwB1ZlXTzPqHNYP1emjGY0eLn1GRz4/\\\n\tdh5bRzN4jUVpOsavUxWhHdHVdSFfNSInQ592aMoJx5vg8tj5HaYjVPn5OAa4o1/E4NiLID\\\n\t9J8eR7KM68B4qzdT0GRyeFEHj/0FrSsgbRFJK/9cryoHx57wD3bxD3grLDJuR8gdH2p2Bw\\\n\tQek3SQJIHxswMEKbbeITOn1Nwxke8grmWYCRqHqD4xxCDmw2TcLyBpRQk7w85zbLdg0uIr\\\n\tvgK8hOfBly9oMUp9+O7H4ONnv7hYL8Kcg9s6m4B1vWIJpA8rdeheoA14P7Z4h8Y/1CZ8Qw\\\n\tUr1oFhjRArg+stcwOvtBGJyA4YUtAKKGQTRfyJipXvsRvPkoQxM/VFAZNIFWlVXCy0lRgo\\\n\toB4jYpJ1duEMEtzBKXXapRPqE0F498IYMjtyG7n6HY/XQJpN5SvC7jHQzcB5FHn4e7+F0T\\\n\tXHt+yNpH1EPytwSnpIDjBMjfB76XapMsiX/sGpqR/vWGCCy9fEYz+ouAxr5Bbclm8RkFcy\\\n\tc7DMdfDNkWkR+o8hMF/5BL+H7SI2bl+9ccaYt9QgnfkQ7beDLEbVDOEB9S+5kcLivAbQCb\\\n\tpY/JDcvys63yJuSPU5z7CMXOfen7pGTIaz7n3APfi8t+BRHBufMGRr35sgZRt+RvuQb/oj\\\n\tngr+PkXwGXNV6+xmLR8xxGw8vg2POIhthbh/YtLDS0aue2i4btLYBaHNoVwFR8BbRhXQ5D\\\n\tH++B40A7vMu/RxB3hLCliMMhxSmKc3dSbH+KlObqeJIh/w1vI74Nl/0tkPeVYYe76J1jn8\\\n\td+ljWIZpT8zdfUAcczgJ8B+dImKJSsYeSP/flDT4dDz1IwSEEmS8DCoQEUzTVKwkjNNUrN\\\n\tO8LDLjqn87bX2R0ChiqfLXCHEVdqRq4kFlKcpjj7AYqde6PblMmHGfAH/n45cBS47Gdw7o\\\n\tcROXnQYbQG0QwyetO1gOCcbAI/APwwjq0yVhKgUDIzjMIw/4JgtKjtQ6K8qWF09HbYuFx1\\\n\t9LZhfQuQNtMrw0XwCJAx0wEacDGTKiN4pdJbjSlcGyA5VEDK/GTMDBmdJD/73sqHNJTfxs\\\n\tl91FuXeF+ayx7Cub8D8kseULgLDx6Q1iCaQkZvuh7V6V/oHD8LxU1VguoWrGFURqLibN74\\\n\tzrcJx18I2SFSUIkBEuYDKU0p8vnUaV1S47GwS52z2lIKRk1fUqwpqXox9FpS8Ic5IKPY/S\\\n\tzFmXcy3PkX4HLV3ghG4Nzv4vhOyo8GgHO4C94x9rnsF1mDaEIpIQTAISh+HPi7VM22oAjD\\\n\tv3sNoyI+3i8wGl4ER+9o0YbssZ6caB3a8aRF19Ce7PU6/9Q5Y4olzbo2X5IyHyuAeSBVEy\\\n\tYLOPur8OTPAqfKPLJwDyMYncLx/Tj3nytn9gGB0RpEPWX0xqf5IwEntwH/A3im7vR7DiPt\\\n\tL4rykfiaVYVRapfHrafB4Wf6xJPAKKUZBaezApL1P4VZ2Q3NKAUvawK2QanjfJRmgxJK/j\\\n\t4Uj8OTPw3br/VtScIIHL+Lc9+OyGcOCozWIOohNYTIgB/AFf+EaG7VGkZR0plgNICjt5VL\\\n\tQXprRrrDJ0a/ouH9AJdgMrkSCE6DLwGTaNmH8Q+1xTVG4awpp8qo4hzsfhBO/wQU93bB6F\\\n\tGc+zaE1wQHt7vg7WOfzarKGkRjZPS/bsDP/7mKUgt6KZAARQuMtL8IDCiMrGHkTx+G4y+g\\\n\tNF+stmJhpEGjzjGATAMhBaOgpQTfkYWagVKrKZYw07DXmh0FUiNu2peFwJn/Bmd/zr8HCk\\\n\tZZACjg3H8E930gZ/czjNYgapHRG55B1ZEdXw78D5xcFiWKQBF3+jWMZoTRxmVw9Dlox27T\\\n\tga2PLUQsjGItxDmTX2o+Ucp31Oqk1j6hAJ0UyNpMuKAZDep8GED+STj9jyH/BBWMMg+kGk\\\n\tYfAvf1IB/HOdyJ/QejNYgSUkIIgAzkH+HkRwg9phMUKwSjFVixDxpGiQK75hiRweEb/YZi\\\n\t1uTSmlHo/Ao+idGzpjYzaIFRAg5teVVw0mV68wrrb/JADTOvUcfWtLOaFTmc+S9w7ufL40\\\n\tqj8zexhNFpnPsWkF8N59zx/QOkNYiMjN7wTHzHvgj4eeBrGsPwC4eRNPvtvodRQiuCMTAa\\\n\twvHnweA4NYy8tpH5zksGWZi3E0yWlMkU+4oC2FyLLynp92mFkSkzuRlbgE4Aqp5rlICh9T\\\n\tWRweiDcPpHoHigDUbg3L/A8Q8Q8v0EozWIlJQQAuBmKH4LuKGOXWEYNcwyFd7vMBqc8EtA\\\n\tAiwUjOwatCqcgpFLwKQ8juYaJbWoAJWUNqbT2+F7rRGlrkmZaTZO+ZYYgJyBJ/857LyJ2n\\\n\tntb2INo9fj+CaEx/YLjNYg8jL6fQ8hx9cAvwgcb64JWjKMktuHnAcw2rq+3HxfD9NHMDI+\\\n\tnoYfJxxrEy6YVUEz0mlTDmqtLTXNvDSMjI/I+pIqzcjCy2hRDSd4Bud+GZ78KXC7MYwyF2\\\n\t72R3F8NcIn9wOMznsQ7f7eTYSO4Zz8XeBf4nSPmA+MXCsozh8YTb8uzZVLQIYXUjuufcfV\\\n\tMIp8MSkYpTQjbS4NcCmfkr6uTcNJOZ+75hRVviQLK/U38hupegRgjT4Cp/4ByINtMHoYx9\\\n\tchvG3VYdSXL+N/7vah7P5e+BSVGzjHT4H710DWvVuDo/ooH8THIT46LsP1ffa3Ukz6Kp9E\\\n\tfhFDUo8i5NFWRmbqWderjk9k21eqvLv3Q5IoXYJ8YvKo0guc/TAUu5Rfai3Kv7Lrj8WHcy\\\n\tCvwxSUe1H7OBmVeUnu0/rzRVGdE3KVNsSH6wqfv80zV2XnwEjVZ6SuU2kkdb6I06PahKo/\\\n\to/L88Ca44Odg8AW+PH+vwssmcinCG3H8JQTk1PM7n89+kAOnEe3+7i14beMIyC8BL3dWK7\\\n\tEaRiQdmpGzGsdeaEbWeZ0qY59rRpufp0y0lD9Iaz7aQW1NMx2vNZPaT+SsVqN9SA3fUItm\\\n\tlNSIrIbV5dDWZWsN0GhGInDmX8L2a1ATHuuXzbkCx3ch/Cecwx1/W+fzWYacl6bZ7u/eiu\\\n\t8AFwGvxckLlHnmU/WAkYXBQYBR2za2fWWhMHLlV2MHFyoYWRMsmF4WRgMigCVhpKDistJC\\\n\tTzmYXQIGkX+oy3Rr8y+1mHit5xKm3dlfgLP/voZQDCP8liL/dBVhdN6BqIQQANeAvB4oTz\\\n\tgNir4wMlpRlY8+NhpHiFrDaDoYZUfKJSDZho/TMNLahtVOdKf10MmsY1nnU/51XWBJwajh\\\n\ttE5d27ViX2thLX6p5FwjH955Kzz5o8BOG4x+EpEfWjUYnVc+ot3Xf354358KvAVcRaXSHx\\\n\tH8OcZfY30vlRh/UZVPM097/Uw+o6i8RJ2qOBPV12c0i78IEn6zlmTT+IyKM7BzX+kvwi99\\\n\tqPxB2vejfUbeb1Qd+/TFqE5LbvKR2GcU+YTUcfDraH+OBN+UvTYchzh7nQ4rf5bNB5M3Ks\\\n\t3mS+D4TwFHfRvQPiMQ+UGc+wlEkFMv6PWcVkn2PYh2X//5/sg9HfhDqjlCaXCsNIwa5Y2D\\\n\tUWbC/lwrjGZ0Xld1HK9ZTQWj7U+XQCp2Y/BUHV45tAvtdNbQSMFoFMNCyvNiHcoNB3VwnI\\\n\ts5pwETIKhhlALWiMhxHYHK/I1gpBzfw1vhxM+CuyQBI/Y1jPY1iHZ/p9KEng68BXHm05sL\\\n\tgJGWXjAKJxJ1SoX3A4yAucDI5iMC5+6m7PhBK2mBEeJh4ztu4UedIg1o1NSatPYkOWJHuS\\\n\tINJWhQuzRgIjq9HpGTBNASaaPRM93WlnQhPLgejv8nyK42MKqOfxDn/vl+g9G+BdHu73wB\\\n\t/uUuIQQlhLqG3ecBo6SW1AWjFCgs4BYBI5vPHGHUc1gfxsCoqoPKZ/Q47P4ZaRjl8TkECt\\\n\tVRCw+cChYaMGYIXeUjMkIaplZKWwqQ0RpWIp3VmrqmBUTD+wY61blw3ocHl8Pxn+6C0Q/h\\\n\t3A/tJxjtS2f17uueDaVz10OouDp29KbalHY2T+3ATjqzuxzYKj+ny7POZZunDo9zYNsygj\\\n\tM7Xa/lLJJNOLCrOvh83CYc+wLKDca8Ezia8OgdudUKfEe0NUjmHdgph3ZqFb6aGOmimdLK\\\n\tyZ1cZGuG8FOLYZOLZHU+ekV/Ftet4cQ2UxKKR+HU34TiM8aBXR2/CpGlDu0f2FGzEkIAXI\\\n\tOTPwKuK4OmUy0FRjb9GkZR0klgtHUlbF5HPTSvNjmLRp0UnPTWIJkZdYq+JKI7vMPO0naN\\\n\t0bq2UbLEaFcEqADQth0iLYTs3KMUjMyIXvEInPruNhgVOPdKRH5jWTA6kCBSELoMeBvI0+\\\n\tNONA5G7VrMgYSRbcO+2ssog6O3lsP6evV9pRG5hDbiDCgsZFQHbsAo1lZcSnNqhZIuZ0BT\\\n\tQ7KQsZpRQruyw/iNY1W/4s/gie8AeTgFo3M49zJE/ngZMDpww/e7r/vCcHgc+F3g6eDMu2\\\n\tx8H53LNEL8vH1GNn2Hzygqb5xTvKuMFp9RY/ROt9H4tVbOZ1TA9n3UQ/bK/xIN72tHsBif\\\n\tjXEci3doVz6j2HGt/TwSTQuwzmbt8wnltjmo1VSAhiNcHadGz0I5jWPjS3KXwvH/AFyA8h\\\n\tOF40OIvAbnngqr6zPaFyDafe0X+pfUbYL7deA5dew+hpEdSWudY9SnjAMIo9FjpfO6GmFS\\\n\tI2ENGBVEHT06b4f6LYAKYiiIh1GhyjaO8mpELjXSph3Nus4WMmYELhpFU9dijzWQfX7ZlX\\\n\tD83wCHScDoUpDfAXdiVWG0L0DkxSH8F+BlzY46Dxj5w1YYzAojXYbKbw2jRKQ63v60Hw1T\\\n\to2eNzquhY4fBFThChy4M0JLD7GF4X3V2MVCJFrpakGjtxWpUGiwpSCWujWBU0BxRy2FwIx\\\n\tz9ZyBDGjAqeBbIfy9ttlke8mJk5UG089vP8R3XvRr4q53zcWaCkdZaVEe1eTbK7AujuNNP\\\n\tDyMbnhJGLfVaDowSBYrPozgDo0cNjEJnNeBpwMhqRxog1ozTeevdANTQfqTBFOm8GlMF7D\\\n\tylrsmMbSv39bXKDNTxoX7D2+HI3/X3r6EZvRzkxxBWbsX+Sjurd377Nvwd/evAf3ORczek\\\n\tSjikp3VgmyH4yIFt82yU2deBbctQ+dk2rXd5LOuQHYHDzwKGfmje0Rxi16NpwZGs4hrr0p\\\n\tQj2abV+1AbB7OL1p1ZZ7N1jmdAGO3r+ix2CNsv045Zi9ZwYCsn9tmfhu1f9M9QObCdExxf\\\n\tg/B6HAvfy2jfj5qVEALgi0DeAmy5Rkc1YVR4rjCy5fk8G2WuYRTXZ44w2rwONi6lHpoPMD\\\n\tKjZHY4XkOpE0YaQhpgKRipPBogsTBMDecP4no34GQhZRbTts01qrYU8ffh9A/A6F0pGD2C\\\n\t49kI9y8aRvt61ExB6GrgNyg/LK6WTVhn8hzNNDNTWnR4QWZalF9vM62Pqd/idNfhFdhYDc\\\n\tJ9TjivoazD7ueofCtFyhcUzBRvuogxtyqzKoyGmVGohgmnnONh9rbPR8ReZ0yrtlnX7BKb\\\n\tdMbEGuewjkxE7cTWZYR2CRx9NbirYjOtvNmXIPwijsGquItWEkQeOFvArwNXlGedjuMgwW\\\n\ti9y6OWFhgVOzB6WMFFDIy0zyjARoFAj5YVZuQr8ifpzq0c4UXsyJbI/5OAjoWUGJ+RdZRX\\\n\t51M7Q6ac3vrahMOdAtxhOPaPQYYKRv5hirwQ4e+DIE8s31+0ciDa/q3bARBx/w/wvDh2eT\\\n\tBKl5eSMTAi3enXMIKxi2R3HiLu/BJ3ysJoRnbNWbUuLWhVqU5uz4frFUAqzUiIHMxJbcaA\\\n\to5FXYiSsMZqnNbXUFiNGc9JtGtwAR76basvZynkNiLwa3O3I8mG0UiDa/s3n+hfe/Z/Ad0\\\n\tqjE8OyYNR/jlGiDp3bh+wVjEJcWxn7AEayA7sniTsnSjMwmk9qWL9QnbQCmYWFhlr4F6AT\\\n\t511rRkI0N6gxSmdgV8FKXRuZbUaja5hfFlhmnyMNyK1XwMaLqUzTGkYDRH4O57aa20Xsra\\\n\twMiLZ/87n+yN2C8P+G82kYhbhwtIIwmmgvI20GmjznBiNdflsZPWA0i8wDRqNHVEcOWo8y\\\n\t0yoYaVOt3oMomouUmvCoh/IDjBraTAwJsVqOHY6PtCQLGG3iaU2pY8V+wySzG7nZuUYjOP\\\n\toD4C5PwegWRP4+gDz+RX2f5NxlZUDkO8Nh4JfBHdGdqgmjVMedAkZR+fOGkWvmuRe7PE4M\\\n\tIxseA6NZfzhn3eWxOAv5E0pDSfiMNExCXMPsKcy1KW1Gw8hqRhpuuZ9rpE27hEmXBFQKSs\\\n\tbUisCVAJSFTjTXyJflDsOxf1i+E00Y/UPg2bA8GK0EiLZf411Bwr8F/LeA4he2H4zCiWaa\\\n\tKmxHq6PrDgiMovJ6TniMyuiC0YwmGjDzLo+jR5WGoqATwUUvBQkw0qAwJltkpoVzGkbqXG\\\n\tqZBwUiHkgWeFbTiTSrrgmOCZMx5Qtq3ItRXP/qM0W3wKFXeABFMBoCPwdsTPoo5yVLB1EF\\\n\tIdzXgXtVl8k0HkapX+4uGCU61V7AqFHeOBiFE4k6pcL7YZfHWWCUnwbZjjSSstOJ6vCq81\\\n\tYdWGtG2pek4i2MQqeOfEsGHA0ntjWvArQ0wDSgUk5qs4lbo652QazV5nReqq6HvxWyK1Iw\\\n\t+gLgbyOyFK1o6SDycgXwn8tDq7UcQBgltaQuGKVAYQG3CBjZfOYMI2BqGI0eIxp219qKSD\\\n\tou+JNSfpo2B3aAV8MB3gazAKOQrxnV0nDRYKzy0aBMrUPT0E2tcTNhDShyYAOO/j1/PRZG\\\n\tP4pzly/Dcb1UEG3/xh3+ZXY/A1xaxywCRlbGwCiVPqrP+QCjYBYuCEazrNjPn1Aahh4tKu\\\n\tiGkdaijEbV5sAuTNiCLzV3yJtqUfoKRgGGiXVoDbjpMkbtaVMaUTQKp46Ht8LW1/r6oGF0\\\n\tHJGfBJDH7pjumU4pS1visf0bVUO/AccvlocJWyTqA3G861iqEa1LA59Poq1258KO8hp1PO\\\n\tgbq9nwqu3yuHkFZMeIPsqoP1aYOZ+no/FttGhdWWbOheUZjnhDM59PatvYaFlIvNGZa2wx\\\n\tm6m6DOO8GFBvjTtslhMt6UgtBUnU265FcwOQc/D4t4Cc9NeC+prsCxDejgN34TuneqRB9s\\\n\tsSj8uAf99Pa2EOmlGit0R5jBvWt3kuQjOy6cdpRqG8BWlGug6tZSxJM8pPUWs6wT8UfvkL\\\n\tKETFGZ+NHnmyQ/upyYdJ35DWmrQ2FmshYrWoSrsRVX7QmhJmW6SNWce28dsNmioAACAASU\\\n\tRBVD2RMPlSkyHdodJfhPfVxZrRv8eRzcf07idLAdH2r39R6ET/jmCStYFiTKeaCEap/Kqy\\\n\tg/SBkY0/wDBqjN7pNi4ZRvmTvhMG0BTEMMqpJzxaM81fF41+WRiF411zbtQ8rhza2nyr/0\\\n\tZmWgQO5TuKRsMsAFPr0swIXANOepJkYgb41svKPYwsjJDbEL4RBDm5NybanoNo+9fDVHL3\\\n\tFxG+YXKtpRnuDaNezmuYaMJjFb9EGEXldYDzwMGogOI0lT9IwyPSMMSAJAWj3PzT6YOGof\\\n\tNTALIjWNX+RLGzWNr8TBGMjBaT8hm1ztC2viStGZm0oW1H/qbqdx5GRQHIj4HbmO2B9pcl\\\n\tmWbuOPjZ01NpLewvGOk8G2VOAiPbpknnGE1Wxr6AUX6asoOFa0JHDzAIHT3AKGXeGBg1jj\\\n\tWMgqNZmVXRiJiGii3Hf0OtZaSt1uqU9pNct2ZMtdbJkAmHdjTXKIfBM2DzZf6c1oy4AeTb\\\n\tEJCTZsnnAmRPQVRrQ/wwuKuqiKlAwYrCyNYlkWejzL4wijv9epdHkHzbV0yBQJtqDVMrgC\\\n\tSnXoVvNSBrAim4dcHIjlxFZlqsdYn2UUUjeTrftuF7BZLWoX7bjpTPyP87/E3ApoFRAcKP\\\n\t4ji8F0rR3mpEZYNuBL6vPNFilk0EIxNcNozYDzBK3ccpYDRuXdqewKhA8p26YhUUtI9HaT\\\n\t7aMY2CUQQDia+rHMu60wcYWXNQxVULWhUcFJDE+n+65ii1De2npgFU5lmRqH8CVNnFsPXV\\\n\t1D4iF9p0BcL3gCCPLlYr2jMQbf+a/3JAub2Hmko+K4yanWqpMBILCts+lWejzBWGka7zqs\\\n\tGoOItUn5sOEAnmltaIrJnWBqNRnKbhoC6IHdjK2a2dxFFeGkY1bMSCJTIfNVyMVpNyikea\\\n\tjzbxdP2thuXPH/rLwJaBESDFD4A7vOhJjnsCou1f/eIAmZcDX9XdkVV4QTCKwnsGI1uez7\\\n\tNR5pJh1BBb7xWEkWwDRQmjlOYTdepwLgEjfS27CRhpE8sAJwKVhoWBUdHUbERpSe2TGlMw\\\n\tsvAymk9kggVzTmtuCqTZETj09b7O1DAXLkGKbwNBHrl9hgfZLXtomrkt4N9WwbmDon+nOo\\\n\ti7PDbymxZG+3FjtUJpJygYoUESfDwJGFWdNlzr44LWU2gYFXW+EYC8XyfKxy7X0HXRmk8w\\\n\t0zo0n8bcI21eJbQgsYAK7ddmoMnn8MspP33WgNHfA4aL9BUtHETbv/rF4fBvIu5pUWRbR5\\\n\t4aFHF4lTZWa8R3PtQxMCLd6c/fXR7rTi3V0o4AIw2PYIZpGGl4WZMsdNyC5oZrOp3q3A1t\\\n\tKAGeaJTNmGltfp8INNocNP6khmNbX6fnEtnrCmATDilfkWc5yLUI3wCCPLwYrWivNKJjlH\\\n\tuejOlUKnwAYTTxLo9tMGoAbq9gFOLaylgijArvsJbC34MAhXAcNCYDlQgo2oxKwShoVKPE\\\n\ttXmdR8NMs+ZcuNaYWVIghZmfFMEsYaY1Rs5028zcJDuK1ph7VMChryqNlwpGRYDRD7HAjz\\\n\tMuFETbv/pCf+S+D72oteHAXQaMQty0ZewRjKLKLhtG9rmlyugBo1mkDUayS22atWlG/i8F\\\n\t0Zc5RMU1/EOqkwcY6dEn64uKzLQEjCIIWm2pNL2kUJ+71hMd7er9yPmsl3YU5q/VkpQvyZ\\\n\tp17mg547o0yVQbuAXkKxdlni0URH6E6hLg+7s7Few9jLT/ZtoyzO1bBIy6ZpUnYeSjVhlG\\\n\tXdpWH0nCSGknHgbtZpoHVrQVbIBR8KXsxuml8LDzWpZoGGhtqgNGocNXn7xOaT616SVVfX\\\n\tbr9tlRMWt+VWkClKyvaWTKsdrSCA7/Bcrvo4m/xRWMvhsE+bPqc19zk4WB6NyvvAgAEX4Q\\\n\tuCCZaCyMdJyKXyUY2U41dxi5Zp6dMLJLQdS5SWAUldcHRjY8DkbMJo17ok2lGjplZ5Y63g\\\n\tIraCiVdgKx+aLTa3NKgUFPRIw6v6h4bcKFOG0eGjOsglE4t6vK0f4fe6x9SNZMU9pXVE4e\\\n\t19FdCJsvqB9UrRn9BXDXL2Iof8E+Incl8D2NTq6lE0apF3cKGOniesGopcy2MhrXHQAYTb\\\n\tsUJCqjC0Yz+ouqOgatSMMiPu50YEcwCnBQaZIw2q2vT/qBzN/W4XYNkTYYmQ86Rv4ia5pp\\\n\trUqbjrbMEe0akc/30J/31+ChCVA4pPguEOShL5zx4cWyEBCd++UXhh7wveAOAU2NQ8uiYT\\\n\tTtUpDeZSQ61V7AqFHeOBiFE4k6pcL7AUZABaNo8Ws4DjDy6Rqg0f4drem0wCg4wGVXAUSD\\\n\tQ5tpeZxHY4TLmm1K4zImVwyjZnxaCwqmmIaS9TPZOvm/w+tg8PQUjL6Naubj/GSRGtEFiH\\\n\txXeRg6XYjq6FDQE0Y2vIIwasicYZTUkrpglAKFBdwiYGTzmSOMqnxVx244pz2MinZQRZpL\\\n\tCkaFdoYbaDSc0uFarfWYsNVGGuctoLRmpECi5xYFf1JUVgBsHqdNakIGUoe+vLyVMYwuhe\\\n\tKvzNs8mzuIzv3PFwWQfBdwoq7wpL++Nk2H1rSnMLLSAaOOqQN1/CrAyOYzbxjZFfu2jDnA\\\n\tqFrfZf1ECj6IglEexwV4RKNKRZxvNbSuyohMIm0W6Wu1eZQaUlfQaYNUp5k2MueC6aivN9\\\n\tpTapmH1eS27gB3LAWjbwZBHvyCGR5aLAvSiNwWpVlWBhWMYpD2gVFL+qlA0SxjLrs8dnWq\\\n\tpcFIyzgYWX+RqWOyjBWDEZkvKAUjdVzBKGgNFkbaz6J9Rr5zNmCkzR0Fs8iBbTUlbaYlfE\\\n\twaPtG8pQAj9aWQhm8qN3Uyw/eNWdcaUFZDcrD1kgAfDaMvA3fNPLWiuYLo3P98cTj8ZoQr\\\n\tysNZYdTlaxkT1tfMC0a2DlHZQfrAyMbPG0Y2/ZJhpOsQtXGOMCqgoRlFTuU2zShcHEASjn\\\n\td9fY1mVeiRMyHWQnzaACzJiTfft2ZbCkYBeimfUA0REZ2v1rjaNCOjDTXMM52Xz+eQ79Oh\\\n\t05Ywcoj81RmeVEPmunm+B5HD8VFEnlFeGGIlZFSF4yxNPRobvrc6h3wZHeGeefbejN+2Sa\\\n\teP2lQY67KjDVW8mLrYMotEmbrtNk+bvg5Hm/E3npMpv1HPrjLss7BlhLAuQ+dp7lsfcUNw\\\n\tG2UhFd/ChvTONzYc+79k5SFZ+c+mqTblH6pzIXO/Ib2zeQ4hy3zZUG/a76+NNt+P8/mzkw\\\n\tPu/NSQhx4dsjPKGAwyrrws49qr4LqrHM7pMrMqL1flm1FvvD9Q9R7W6fUHA6rN+bO6Hirf\\\n\tcCyP/RNc/snyeTn/Y+KyOxG5GedwV/xp62Ppy5dhr1STycsQnlHOBvcqncP/539B/MMU0T\\\n\tDy8UHExS+8Dev0gs+zJb7KI9QlnaeIMzCq8yirHdpg2qTTi4ZRVv6CVOztaEMVX1a0rost\\\n\tMyOGkdf2Qr6N+5YZUNTXl23y4cZzCvmk7uO4MuyzsWWEsC6D+hp733qLugcALlf54esY8i\\\n\t7rIIXDZcHkCO1QGrRzpXbghl4bCNAJZpfvzFWeIyiGXvnLqEbZnNQapMNfm4GDBx92/OZb\\\n\tN/j4p4dkLiPzbBgM4CN3g8syLr0o48vuEG66wWti6gdKJFOPbkQJlZBkUNbJDVWbBGQIbg\\\n\tQyUHUKceaRbH0x8uTdOBzlj0QGUtyEy25D5D2TPqWUzM00O/dLLwkNLUfKKjig3uM9MtNs\\\n\teTp9QymZ0kzrXcYES0FM/HrL2Wax7RJ6kv9X9dXga1FmlPbvJB3YwdxSJpmoPOywvzb/EE\\\n\toY6XKVCWaGzf/kQ46f/Lkhd34SirwgL3LyIkeKgtyHizzn4ZMFv/oGx+veClI0zbi0maZG\\\n\twjonXup/2ndU5ue2bgcZlNqNOGpfUfFNEz6kVpmzs9pdBXxtFYw6YJXGXrOGUYcPanV3eS\\\n\tRxH6eEUUu9JoZRBYIADzEwMr4eBaaGA1uDpgi+Fw20kCZ0dOuLypWPRzuipQq/7y74ud8a\\\n\tsLsrJYDynCIvKIoaQEVeUEhBkefkecF774TXvsUZeJRAiR3YyleUXG8WgKP9Sjo/5ex2h2\\\n\tDzz1E5rGsYvQIR5HO3TvCQ0jIXEJ37pZeEw29DXGzuOfsyQmXC1IlWAEYmuEwYiQXFqsIo\\\n\tdR87YKTrrGHUtRSk9/ysYJYpKFQaDFQO7I65RuXGakWcV9BqCt1h22CktSCrMcUwevRx4b\\\n\t/85pC8KCoA5UVOURQlfAKAfDiAKc8L3neX8IG7hEgrqjSjXNUxNVrm5x5FEy+NFpSK27oD\\\n\tpEBwGkZPxbnnzGP0bD4aUVmPAfCqMmzAsC9g1OxUq7fLYwiYPBtlriiMGmaZCs8MI4n/iT\\\n\tmOYKSBE2tJ5WUjk87/s3sSRTAyOzoGECRhlPMbbx5wbluQogaOFFKZZhpAeZ5XcUFLeuM7\\\n\tHaOR0XAqzciciyY1KvOwoRkZDUnByG0+C9wGFA0YvWLck+kj8zPNxH01cI0KqzhaYMS+hd\\\n\tFMK/ZngpEtz+fZKHM6GEX5zQKjhiwYRhV4QqYpGHnTKwmj+riGESqdglFjKD783Y2hU8Eo\\\n\tj86f3Rbe/qcZuddwLIyCaRYAVEgRw6goeOJUwV2fCgBtgkXCspBOGOl/ieUhGkZswOYt/p\\\n\tZEMPpLiCCfuaXj4YyXmUF07hdfin9h/lr6hVcvYANGIW52GD25LXz8cyPu+syIz57MZwBF\\\n\t/061r2FEutNPvUjWtnHPd3k04EnCCOoJhwpGLXONYs2o1prKPLRjmPp8tI+10ohUx/7Efb\\\n\tC7KxQeKnleRKZZgJEGkIVRXuTcfZ8xv+zsbAKMtIaU2BAt5VfSc4sCjDaere5jBaObwD1z\\\n\tVvNsXsP3xwhO6uSwO1QNCMP6/lQ17F4N60MJo/FD+9sj4dfecYbfef9ZPnDPDnlRJ7ngSM\\\n\taX3rrFN7/0KM+8aqjKT+QXzESXDjeH9es86mqHdvQtY4KhfX0PbXxVXko8HFJD+408q4qo\\\n\tNk06tG/a2BjWT9U7MbQvhboXdb1KSQ3tq7rYy3S0vgeSo+cTlXnWx0JWPnOBcl5NyKeo86\\\n\tmGxfPyOlf4NvthcTeo6xrui8CnPjMkz3MGgwFFkSNS7p00YEBOXh0XFOXtySnDWQE5ZB7y\\\n\tDz7ifDskugVRwx2IDHGVJqiH6wf1tRAfV9cPCVMC3OZNiAzA5YSdD8RlOCm+RnAfZQaZl2\\\n\tn2CuBQFepa/2Q1I1BxcWfv0oze/6ldXv4TD/Hjv/447/1kDCGAx88U/Ma7zvL1//JhfvI1\\\n\tp9gNU0qm1IzWuzya/GbSjEJcWxnTaEYS/7XakdWMrGkWaT1lnFSaTptm1GamaRNHa1xleG\\\n\tfHm195TlEI4s2yXI2SVccmrP1HTz5pNS5jcikHdD2iFvuTWk02+xkkycFtwebT41tdakZf\\\n\tiQjF/Te3P+sxMhOIzv3CS0OlvqkRmXRYJmDUeMHjn7QUjN784XP8jf/wMPc/mjNOROC/vu\\\n\tVJXvUzJ9lRZn9Ups5/Ihhpk8m2o28ZewCjLt9aEkY+amEw0uW3ldEDRg2ZBEbh7zgYhXSj\\\n\tOl1jrpF2Sqt87YJYD6ONYeHh46GiYFSNmiWc1tahffqM1FMExoIl9/OAUjCy4LLD+sq827\\\n\tilvj/hVkvxYtxs3z6bh0b0FOBlyZjGSM/sMPrEA7t8/88/ym4+WaPf+fEdXv3LTzA5KPYI\\\n\tRlrmDiM3IYzq62eCUVReHxjZ8BgYJV8BDR8SMCpMnAFLYq5RDCPqNNEQfUIzqq6JYXTs8G\\\n\t7ppJbST1Q5rTWMinJEzY6a6blGp874zfYjn5R2jI/TjHJiX5f1D9m/I9zGjer2VjA6hBQv\\\n\tbnkgvWQmEPliX4l0+JrmDKMf+ZXHOLc7XYNf866zvP1jO0wFIyXrXR5NndpgNO3s66iMLh\\\n\tiNcV4nYYTqqMFMy02aeBStAaMKNLTASDmwEYi+zJFz4dGidlJHppkGUQ2jNtOsyItSK9Ka\\\n\tWWPEqwkWsWZjNOtaOakb1xaQXVz+k8LCaKaN9acG0dlf+BJfvnsFqj6ldL3wIX5yGL3j49\\\n\tu8/56daasMwM++4bQpo6XODVBMCqPUL3dXGYlOtRcwapQ3DkbhRKJOqfBKwMiYZQ3zDJow\\\n\tMmabqM34o+1DVLqqU3sTqFBpitrMOX40b2o/YiGU1z6kjrlGp54MWpevk9VsKkDFmo9YM6\\\n\twxSqYBpaFUQKUVRTD6ChCK+57V9jA6ZXqNqOxsx4EXS6MDpNLPDqPf/cCZqasb5E8+scMT\\\n\tTxrP9vkMo66BBXN9NOExKsMCbhEwsvlMAiP/d9xco8o30gYj5cC24NJzjXRnjnaFLPM/fi\\\n\tRvwCdpmnlNqGuu0ROng5mYk4aR3uRNm49hrpGBkZ5T1Mgn+IlurCFUw+gWcJd0Q6BdZvMR\\\n\tCV8ObJaHi4fRB+6dTRuC8r1476d2Vfm6PuZcCM8dRlbGwCiVPqrP+QAju0jWljEpjIxmVP\\\n\t2yh44awCIqXB6nd3kM+RQqLsBIwyznouO1k7rws6VFxJtmeQSjcXONTp9R9WjASG8NmzIf\\\n\tvXYUrS0LceETRiGfWoNyG9dTTXmIYfTCac2zqUB09n98STh8uS5YAlj6VmZCGP3ZE+NHyf\\\n\trIQyGfpcEoZR51dKqkObUXMNLSB0b2ur2AURYf94VRakRNw6iClgFStEg2jCy1wUgvlK3B\\\n\tdGhjxCCrh+/DolYNn1ITKifmRmHltJZCStMMAyDtsFaTG2MY1WAsYeTTVJvtF1QfrYyWgo\\\n\tzAbcLgcn8/Ixi9qH/nj2UWjSgD/jxAE0Yd0ngZoS+MdkfMRbK2Gd5RmVb2AEa2gy0dRjb9\\\n\tOBiF8hYEI12HWTUjmABGKTi1bTnbAqNojlHB8cMlwCr4iDe/jM9o3Fyjc9sF9YciA0C0Ca\\\n\tYW6jZgpEbWgmZkh/+tVhXMtI3r1f2qYPRCRCjueUbbA2iVWUB0O3B5FQovovMw6mui6WvH\\\n\twOj0tvHtTCnDgTE9ptJamA1GqfyqsoP0gZGNP8Awsm2I2rgIGOX1uS4YVdqC0qBEpxvFYS\\\n\tm45IJ63yELoxg+3XONjh/xoCi0CSUkHdiiwag1ox4wiv7mMLymvn81jG4HjkyjFM0Coq9o\\\n\tnAkVmBpGJmxgNONylkqOHzKdtCpjUq2lGV76XkbLhlFUXgc4lw6j8I8EjAp1bQpGSsOpFs\\\n\tlaB7ZPU6Q1o+uvHCU1ocKnqecWdc81uu7yEZUJFQ23q2M94qUnKgZg6ZnZ3oldw2hk8vSb\\\n\tpW1cRz2FoYLRAOG53R0/LRODSPmHXtqIdMwIo4Sm4mF0bmdOFGrIOPiM01pYURjZurT7fO\\\n\toyJ4GRbdOkEx4nK2P+MAoZKU0oglMY8UppRtrMKo8bMKpMM5IwuuPmcx4yTRjlRQ2crrlG\\\n\tx47kXH150LbssLuvX5FT7RZpZ18ntwEpj0VrP429inJwh8v5RE0Y3TaNxjCtRjQEnt8aO2\\\n\t8YAbuj+YFoazjuhZ8UFKwgjLTWojqqzbNRZl8Yxc9pehjZ8JQwaqlXPxj5v6kRtSKkScEo\\\n\tAMfCSA2ZV/OI9MhZwXNvHnHlJbseQApGeYsplphr9NLbtskiU1A7x71ppoGUBI/1JdXOad\\\n\tFzovSOjcHUG1xt3kkB4bYxNzwp04KotAUjaTG15gEj3MRLOrpkc5gocy4wMsFlwygqb1Vh\\\n\tlLqPU8CoaynI3GFUxPERjEy8PlZ7GWUU/K1XnvFD8bUm1Oa0tnONnnLRiD//gm3iYXf1rw\\\n\tKIdWS3aEGNZR7lPyl2qfY1sjAaXuGbpny3IrchUNz9tK4b3pDJQVQ+s5dMkHYuMDo7pxGz\\\n\tzjJnhlGzjau55SzNPBtlrjCMdJ0XBqNwLgUjVIcPnb4GQMmy1C6PPm8Po9ueucO3/IWz3v\\\n\tmct5pqdq7R4a2c7/3GM2wOAuR2qeGjN0gLMAp1S8FIx2sYxZMZ6zVqYbrCyA/hi4XRjcDx\\\n\trjudkolAdPa/f4l/CLyoETnuu2ezwmh+ChHHD+uRnuXCKArvGYxS93R+MIrymwVGDbH1Xj\\\n\tCMrHZkYVRBywCpMtP0fJ0UjIRv/PKzfPcrzzAYSDyXyIyghblGl1884tXf8SRXX+b9QEWo\\\n\tyy4NzSZaxJqCkfUdWc1ITcqUEfXqfb997PAyf7/9fSth5IAv7LrLKZlmY7QMeBGCesb65b\\\n\tK9MI4WcTiRpLugTO9IbayWjeHcJLI5MJ3Oltlohw9XbUnER22y4ZSUeYiw5xurlRu9Ycrz\\\n\teVLEeQj0+2ZaVRHVJp+fbVOVz5g27tnGalp0vRLPsXCQBRgNTF0KKthV30fzm6cFSFV1hH\\\n\tJjtQF/8UXneM6NI37hDYf4g/dtle4kMsTlDLIBRVFwwTHHy1+0w8tflLO15fy9cWVeRU75\\\n\tocQR5ffK8IAcqlsmVN82c0L1PTNCWKJma2umPjdCGOAI92QAgwshP1kmcs63MXs2In/Qdo\\\n\tdTMg2IbgBOgKpgJIuB0WXHh2wM5uMruuLCQQvwesBnShgdyF0ebRnnJYyy+BIFI8Hfg+ij\\\n\th0V9HyQr83Bw7eUjfuivPcn/9cqz3HXPBvc+OGR7Z8iFx+GpVwvPul7IMgcM63tXhOL9M0\\\n\tLDKKvLFYFsQD2xMVO3XaJbGoUhAShBGOIYleHB5ZA/4ttSweimtjvbJtOAKFa7fLtimT+M\\\n\thlnGc284xNs+dnaKKtdy09UbHN0KdJhSEzoAMOr/JdlEHXQZDcDtFYyqYhYIo5b6UBZVfo\\\n\tI5lK3rErShzMMo3CsFI/x9k4xqy1kyjh8qeO7NOzz35lGZb/VJ6PDPb0NLBi4vpxhkw7rt\\\n\tOAOjEnR1fUU9KinThcpX9VT3IAKUz5MRIoMSRoOLqTXAzN8nd9OkQ/iTOavLvJv237jlB/\\\n\tH1VfSkPqOv/PwjLQn7y8tvM3k0HLi23k7FdYR1emkP79stZ63zuOE/0mXqMkyejTaaOug8\\\n\tojaNG0lLldHDZzRWpP7XmGsE9cS/VBo/8iQQL5INaYP/BaIN1KJFtdpPE5zTatidAgo9ci\\\n\tZ1nYIGZEbC6nyFaDg+mlGdmhQ5ivIQKWBwkbkXgMgtAMXHr+txf/s/iVgk5YhqA8p4GDXO\\\n\tNdLXeXztc45xzcXT7/d/+QUD/o/nH2vWa+kwcipu2jI6QGGvnxpGJs/cUTwMo0/A6C7H6O\\\n\tOO/H6HnIrTrjSMuvbUbmRuQeO1i9QykSicglHs3NYO7BpGAWYGRtUQur4+N3nFc4KaMNLX\\\n\tqImK1aeylcM7ApT+flsO2QXUkxqrW3UpcHGPG1tJ71599ue/JBw+OzKzYnurQ9VVoq4XHC\\\n\t4yDVLpSxV+c+j4yW+4jL/xHx9gNKGvKHPwT7/hYg5vthQSmRtQfV2kte6TmlBxuGmm1ddP\\\n\tbaZZE2buZloJhuIRYXSPkH8aJNqZpX4X3CZklzkGVwmDqws4PIOZFlHcmmm6TaoKUXiMmd\\\n\tb17jUyS7yr4ih9PcoBLOLNmBAOXwYJABooc6bwZhSUkyG9CVdktflXVV38NcofRBGbUJXJ\\\n\tlzd/7CPTLJz3Zl5oV+V7UtdFptsu1ddABid8W/K6LaUP6laE3g7rSTWiKwkLXe0zDYFG32\\\n\t3r+PoS+2ucSl+mefZ1W/zff+0yNgZ9iFfKcOD45994Cc9/xlZT40iUUdfF/pKauk+jGeni\\\n\temlGLWW2ldG4bk6aUQ6ju4Vzvyece6MwuttCyBS7A/lnHDt/knH2NUPO/f6AnTsz5KzKs6\\\n\ttNXW3Y010eo4Lrv3aukUDtDA4d1g7bd+1lpLQZrHZTD6HX+YW0WjMy5pTWhFJ7WTe0LHWu\\\n\toRmpNFZbGpzw97ZQ7UZ97mO8TGrn3BqFkr8kKU1ijHbhyo7QVzP60puP8N+/+wr+0a88ws\\\n\tce6N4s7alPGfLjf/linv3UrarQhsaRKKOuX/RzVB+3/vqO01piLWW8ZpQqs6uMhBN2Bs1I\\\n\tzgqjTwijTxad4BknxSOO4hHH7vsyBpcLw+thcG2B21BtEozWojUh04axmpHS5nppRuOc16\\\n\ti0SjPS2UDZOSvNSGtQ3kFNhhQOl4W6Deq46ll4bSa0QyjbEpzPUdUzcLuUmlHQbMTcEqF0\\\n\thiv4haH8oOlEt11qzSjSyDyAI21JILsI8kfVM8lAiuvH3Ukt/UFU3v8bm+ez5sNrvPgwbx\\\n\tjdes0Wv/a9V/Gmj5zhte87zZ/et81DT5QbSV1+wYDnPm2LL731MC+79QiDTKjpU9ajE0aN\\\n\t+nXBaFJQNO/PnsCoId0wyh8SRp8oyD9bdN6eaSR/0JE/OIR3w/DqguH1RWm+ZXsBI5vPjD\\\n\tDS9z3k2wojCHZPA0aIB40/5zSMXNlWCn+sqy6+3GCm+XsS3UI/2lZNIQgjdQMDLQOwxgib\\\n\tApSGUXa8hm0No+sneXEm04iEG5patH6QOu0CYeQlc/CyW47wsluP+Exabmr1MsQwaq1X44\\\n\tUP7Vw1GFnpgNG45yEOOSPk9+aM7suR03Omjy+pEKis6hxG92WM7stgWEJpcG3O4IoCt7Uo\\\n\tGAUflYVROF4EjMwlKRgRvgqrYeQrEbSmaq6Oqm7wQ0mRgJFQDrnreoWw8iFVmpE/FqnvTd\\\n\tWXVHw0hwnIjqr2Bc1vURpRKTd0doK9glErKHyg+hXReTRh1Oez1o36pdrRCiMr84ZR6l52\\\n\tdKpEm4pHhfzBEcUDBcXJgpQ8chY+/YRjcwBPv0jYHCSTdcqDT8J7HnDs5nD1cbjtCn3vgR\\\n\tGM7s0Y3Vtq2NlFwuDynOwyIbuwIDtaVP7RmWAU7svcYKTKbMAoaCEZzXej7LBSZB5GHhoa\\\n\tRuKU5hEsD1fXTVTZ4ZoKRuFcqMPAlx0+h00CRr6C0aenRZWb13FBM3IC2ZG6X1VQc9cjIB\\\n\t+7Bnfj/eNuZD8Qnfv5Lw2HT49vZkM9AtsxZoVRmywFRrYt42DUAop5wShV56psf3jOIWdz\\\n\tZFuQswVyVpAzgpwuKJ4o6mVTLfLENrztfleOJgMPn3G8+NrJtaUPPuSqz35/5hRccwKuON\\\n\tqSWKB4lz+sGQAAIABJREFU1FE8OoQ769NuS3CHwB2S+t9hKc8fFtzhAg4J2ZHCq10JGFX3\\\n\txsJIvTv4+F4w0tdQ51/lq8wrmwaAwmtGUJpPAUaurENRGJ9MFsNAREEmaFO7wAbVxMpK/K\\\n\tTIaoRMqBz/SrmL8taVrsqxaYNGpGHkrsbJBsJunzs4iUbkgKfpeqXH3OYMo4mWgmCAw+rC\\\n\tqKOM3jBSbZKzOcWjOcWpAjldIKdyitMCMy6JefBJKggBnDwH2zlsTagVjYyytTsGgCmRbY\\\n\tdsA4+Pp4M7JLhjQnZxzuCKEcPPG8Fw0TAyzyWC0SDOJ4JRrQjVMBIqx28Fo6CpaD+Qz6SC\\\n\tQjDVdqlmQlemHur6PKpyCRqFgyhO3ZMKfiqNO6yuCzAqMsiuArm3z92bBETXAIeiM5WT08\\\n\toyYdSiKS0LRm3tNC/ipDBiW8gf2KX4sxHFozlyLm1WzSrHN+Pw1gA2J58Gyw0XCR95uGzw\\\n\t0U244tgcKtchcs4h5xzFwxmjj22wsylsfP4OG7fs1J14T2BEB4wEPdcohtGg7vABRs7VeY\\\n\tqDTM1DQpcXOo+HWgNGUuYfwcg7sGXg19HFzSnt4jBi59etRfDbgKD81DC6HJg7iK5unnLN\\\n\tDqXjlgqjkAksFUa2PJ3etqkHjIqHdxndvU3xYC+Nd2a54hjceDHc+0QJoT/3FOPb6SnPuB\\\n\tiuOCacG8HFh5XDeo9Edhw779miOJmx9aJz7J1mFPpICkaOet2Zo3RgUz5z52HRWLGvzTY8\\\n\tjJzRlBy1KWph5DUfyX25Qu3A9uFiGGtgfWCUHYJ8h9rBLuDcZV3eFS2TgOgpjTPO1R089Z\\\n\tBCnJZlwsjmm4DDqsKoeHjE6M6zFCcXsUNct9x0qXDTpbPnc3yzqWHttYw+ucHgmhHDp4Z9\\\n\tnYlhVMkcYRTya4NR9Y54B7ZklFtt+K1GohX7TlXPlbOvM4ihg1KvwkREr31FQ/dhSkBwYA\\\n\t/qehSifFMBjB5aYW1dBTQBDgNPqB92QNxVyX6dkEmU7CtaY/TcBi1VZ7Tnk9RK5y119Mxb\\\n\tzja+ZxYytjDqqFeyjJb0osKSiK/KN6d0OBd233uGnbedWgqEDqKM7gw0tDO8u2Zfh/i+pU\\\n\tj8N2jjBBj5jq3TVefCxmoqjdoBMp4xXRB/1noUp0OodnBMrkUL6exCV6Ha5zqala3WmumF\\\n\tutmmako4KC5bBIgua5xxppNPBKNUEQuGka3LysKoDu++5zT5/dusZX6SPzxQo4WrAqMAHA\\\n\tujvApHcImWjxRemWuBUbUUJAWj3IDFwMgu/xANNrWro9v06UOTBeDK5lqltPQDUZlXQiNK\\\n\taBy9YdQGlDG678JgxMrBqHhktGe+oPNKBOSsBsqiYaQ0nwaMQkdXaSMYBWBAGkYpzUhiGF\\\n\tV5WhgFsOh1Z2YtWQpG4SMAoW7FCNyhug01jHqvwO8FIn/fjI/IPqhwuCAYxYxYAIyUk00V\\\n\tNDcY6XBPGMkTU4xxr2Uy2RMYhYwVFDSMIjPKwsjDRYJZrmFkzCykxUxTaQOMCrVXUbTgVs\\\n\tFNcuLPVxdxfaP89XyOCkYn+t6j3qaZwKXNTM8HGNngnODTA0Zuo5dndC0TSna8wB3RxK9i\\\n\tmuG5w8j/rWAE7d9MK/9KgFYEIw0ODaOgGSmARd9U8zAKPqDGHkUWRhZMATxKI5OCaN1a1U\\\n\tZO9L1Bk/iILqogDsbrnzjuglFDVgRGukyJG9obRpKInxJG7pIN1jJfcVvC1ovP1aNOQZYK\\\n\tI60ZWRiVMGjCKADDaEaiYFRBI0/AyH+mOnyFNgKONde0zyhoSVozyqkG4GMYXdD3rkwCoo\\\n\t3Q/KqzjYNRldZK6pd+ehi1lxPiUmBIwKgBiuXCyG1lZFcuebz7AMnw+pzDLz9Hdkmhzs4J\\\n\tRhOJhZGjHUYhnfcXVf6fYIJpM83+RcGoTTMKPp/gtA7+Iag/qJja5dH7kirtSfXfuqP0Bt\\\n\tEk84iqj6YJhkESHdTHjUmEWnR6da5rrpAWlac4P8coWU5I72juM+QDITxmwiPo7UP6lpEg\\\n\tZKMME67EMbz5KLuP7CI7E/3srsWLOyZsPG3E8IYR7lh4NuMWyaqoKhzmEVmToOW6sRIukJ\\\n\to5mYJPqpNVr2pIk9rl0dexyt5R7WWEXRALOD/3iMwDJVO3I6PeiD+ASkruBo3Eb/pf+ogK\\\n\tqsW5ZUc50XfUrB+IykZFyzvKRanxfeqEUVL6wmhch4ZJtpytr50VRol6TbyxWjeM3KEBw+\\\n\teeYPddT8DuGkbjxB0RBpcWZJcXDK7MyU603LOlbawWVUKV6/xMaT+JMSpX1U/8ux7qbmGE\\\n\tI15L5oj3MvJfDKnABfWExizxqmoY+TJ9cdE+RziqScRVs0QtQuuWSTZGOxRbYC5egtAHRs\\\n\tmH1AKjXueoG+0CHA8ejLILN9j84gvYfd9p5PH1pEYAtwnuuJBdIGQnhOxCIbvYr8BvzNz3\\\n\tsjK7PEaVUuWmYCREe1/7S9IwcnUdKhjpvYzwx2FmNQo+aufHxqvqahgRtgLx2pD4crQ7o1\\\n\trWwuFUl03JJKbZiWYHd77cBcBoD3Z5rK9dAIwa9RsHI9MWqxkdHbL5xReQ33eO/ONnkW3d\\\n\tgQ6gbMLgEnBH8Nt9UP47WuCOCW4j3Ht1H8J9EwwoNHzmASObzzxgpMoXoVregas1HbOvUQ\\\n\t0joV42Ykw1LIzEaC1QrV2TFIx83hTg/Ir+at7TLrgNGnuIR9uB9JNJtwFJdvCFaUb7GUaL\\\n\t2OXROQbXHWJw7SGKz22Tf3aH4uHdmbf62BuJH0Q8fhDHDa8Vtu6Q2gfsIHXfynufAsWiYW\\\n\tQXydoypoGRaqP4/5zSjIB6n6I6eQkjIV7D5mFUFFTfaq9g5Mp4h9FqPOyi5gj1Kv2wl5Ha\\\n\tM4mMcvTNf0lEd7gKRv3ezek+EhZ13NAhx8EoJF8hGLW2aTIYtdZrETCizDO7eovs6q2yOq\\\n\tdGFE+MkNM5cqaAswWyK7Dr/85FeeoCSTN+2iI2bxU2bjLZNd6BGgztMLLX7QWM9MLZWWAU\\\n\tgKBh1K5Bt8PI+UWx2oSrLqLawdGFz1iHNoWyw2eqEw5sDSM3UnUzMOop03+tUPCbndc6Xj\\\n\teM1IPdaxi1tqENFD7QE0ZL3XLWgTsxZHBBvFNZtH1ILkghpeZU/aiW8bv37jK6e2dOsJpe\\\n\tshOw9VzILvEnxoJiHIzCc1oQjHQdFqIZWRhljeg67PteBs3V/QUUTq2k976hLADHUX3yOl\\\n\tqxH5pjHdhBSwp7Jqn7UNWt769/LZOMmplzpqOuMowm2j6EPYCRbcs4GKXa2V1G9BwGDjdw\\\n\tsFHHBxht3rTF8PM22P3QNvlDe+8Id4dh4ybHxtNQr0lo+wrDqHoXLIzUuxPqOBcYBVMojt\\\n\tZ1LDkS6hq+DOJo7PLIsJzwGG2sZhzY1aJcdQtEIPNakmRmC9swXylTz7ClfyZkklGzHRz1\\\n\t7LrGyvuDBiOb1wrCqFHPDhiZMspql+HsWMbW8w9TPJqz+4kd8gdGfd+fqSW72LHxdMfw81\\\n\txtOoQ6zgtGIb8GjIzsFxg1viariqpgFL4M4oEjCmJFAZkaci8wG6vppjrizxJ5TajIfR74\\\n\t6305Vfs1MOXxvi2dxDQ7i7Cpb6ZzZecrO3wHjOor2D8wclT2dJXXEmGUbGfi3k0JIwSyiw\\\n\tdsPe8wsl2Qf25E/kBO8UiOjGanktuA7BLH4CmO4TVZudarqncCHhPByLbJgsLCqMd7tYow\\\n\tctD4TFErjITW/a/DlrMVjKjbglBNUhQUjNRnpSPWOMqh/VyF9cTGfq2c3EdkfoW7YFQ9lK\\\n\thC+xxGNt8EHFZ1l8dUGRZGOHBbGcPrNxhevwECxRNhM/6i/ALItiA70pjt7QbARvnde7fl\\\n\tcEcd2XGHO+7KiYW+jtXXZKN6zwKjuNNPDyPMfZwSRlH6ul6Lg5Fg5xrFMFI7L+KoJzhqzc\\\n\tYfVHHUaQOMtDkWTWosKDfrD4VXMDrTt4WTgKi+wwYqbTASBJeEUXx9edgBo1XacrbxMhIy\\\n\tRo8kLh9GROFpvgxS/jpCdkEGF2QMsPfNdKrG81BhdQ+jT1uvFIxS93EKGHUtBZl5aN8lYO\\\n\tRIzTWqYSSq3aG+3kQLX+6IYCRU+1xXyzb8pEX9eaMKRo569X+m6/lE35GzbHyS6hY8Fp0s\\\n\t4hvt9AQm3SFDpeqkxE8hUq+SHKk7oz2fpFbiHBFHzo8tZ5ttlI4yZKoysjjc2Yb4HkZ1sX\\\n\tk2yrT56DKzOG2jTaFjmDpV+Yxroy0jdY0tIzP1NO/PxCv2o8pQmVDV7o0aNkUULuce5ura\\\n\tEO+BU233Ks3tQ6K9jCBaJFttOaJW5QPRD4nIyb6t6gUi34THmifjh7kcGKVqO+bnZlYY2b\\\n\tpEnXH/wigK7xmMbHk+z0aZ08Eoym8WGDXE1nuvYRS0uwCjULj4d7AvjAqaG6tBDSOfTm8P\\\n\tolfsIyWMZKTaW8GoyYwW6Q0i4LHGfXOsAIzaXpox0FoIjELcgmCkwzPAqCllHmLzPAAwqt\\\n\ts0I4waWpHOo62MvYaR1owSYb2XUWMzfqMZBQBVG6sVKl+913XYCiR80yyC0cm+DZwEREbN\\\n\tEkqbVBfeB0ZRUuIHs4ZRMtwGhilh1NSK6jyWAaN0eSkZA6PGu3S+wSgU3IRRdQ9kZNIobU\\\n\td/lUOoYcQoNseq82rP7WJHVauC0UJA9FhoZlmYHwZsgRE6cQQjDSma1/SFUUNWBEa6TOOo\\\n\tmwhGfTWhAwAjse+O7dRtedgyGoDbKxiFuLYy9hBGKU2oASP7ZZCg/QQY6XC4PrGxmt0oTb\\\n\t/gZXsf7NuuiUHkm958yQ2MnN31cN4wSgFmL2GkXyYNo8YLHje0N4wkEb8nMDLVXkUYNVZ7\\\n\tLxtGiR/fhe/yqEXBqNJY+sAIWmEk6ryFUeXEDvkUUIT1ZhGMHujbgn6tL/M+GZ8SSgBpaD\\\n\tAZjPR18QHNTpqq2Hxh1F5OiEuB4qDByKm4acvoAIW9fmoYTaoZ+ahVhlGXtjVWNIxIwKge\\\n\tTau3nG2DkTK7UjDS29FWmpieR1Q1+P50H21K/5YLn2ue0jDyBU4CI/1QumCUGi1rXhif66\\\n\tvq6k7Z6ACp9IuAUZ8yUulsGSaMCu81jGz75g4jNyGM6utnglFUXh8Y2fA4GDGDiL8+zHLW\\\n\tMAL9DTUJZk0EI+PAbsBIgUenRUB2zPMXgM/OdR5RKe7+5s0t/KkJYVTnORmMWtvUF0ZjOr\\\n\tRbFoxS2loXjFIv7hQw0sX1glFLmckyEn6PlYRROJGoUyrcOVpn0ktcZj8YzeIv0uW0fBVE\\\n\taUdNGBntKYJRcGCHOKsZ5XWaqh7SUF7apCeIHMB9zV89ARc22pgARi5+CAuFUa9zrCaMGv\\\n\tUbByMbHqe1TAqjDgAmy1gSjBrldcEoBQqb5yJgZPOZM4zwZlYEo3C+PjcWRmHUrDLboNqh\\\n\tMfr4YtgutoLRLvBQ39pOYpR+tvyjXrRqy8hwaloYsTgYdYwONdPW0SsBo8YLb9N0aE17Ci\\\n\tMrY2CUSh/VZ0YYdY1ymuuXByO1FCK6Zk4w0s7rVs0oASOdLnxeGqH+tJCCUeXYtp9FL0C4\\\n\txzujeskkIHocOF0eOt+OsL7FvzghrhVGtMDIvnio57jiMGpcOx2MWuu1L2DUcn/bYDTueS\\\n\twMRlr6wMhet1cwUnWcO4xC4S0wiuYJhQmOyvyKvgjrr9dziKr6F3eD4J7zaK+q9gLRkW95\\\n\tYzi8PyrQL27tD6MyPBuMwqkVgVErKCaD0WQTHm0l+sAocc1ewKiSVYCRTT8ORqG8BcFI12\\\n\tEvYdQyvB/DiPi6IhwrB3bl4N5FW0e+/ndPUs1JRs0A7ovOFYUvMwUjmjBSHXR6GOm4PYZR\\\n\tmywFRh2a1FSgaOY5EYxS+VVlB+kDIxt/gGFk2xC1cYEwgvnAKCySrZZ3RDD65CRVnGzigh\\\n\tgQSUG1AVIDRgFA9qbuYxh1vQytWsuKw2hMnktdsV/FLxFGUXkd4DwQMNKjaQE4xNdVMBrV\\\n\t4crRjYbRJ1v7VUImnUF1V/wSBe/5HGBUpYPmi6dlP8EoAadlwiiVX1SXdJ7nNYwazynx/v\\\n\tUuY1VgpFbst8w1qjUjCyPjwK4ApsspAD4+SV0nBdHHCXXShTo3O4yqfmhfNBcF48B+gZF5\\\n\tAZcFo96gaOa5GjCydbHXzAoj26aDCiOoYVSbZbF2JAZGJj5ad5bbdo8QPjZJtSbXiKoGhb\\\n\t/h65CLgVF5L+YAo1XaWC3qgG3lrmHUpc1FMLJ5NsrsC6P4OU0PIxueEkYt9ZovjHzBLXON\\\n\tYp+RmkkdYCS79XX1vf04FHZMv1MmBdGnKPWxur6F+u71pDASlY5pYASNk+tdHtPpp4aRCS\\\n\t4TRuYeri6MUvexA0a6zhpGDQf5XsGoTTNyRPsYIZ43hc33LgSy5/beF21iEO0CkTdcijyG\\\n\tyyQwcjQe7srv8jgvGNm6rCyMmm1cvV0eQ8Dk2ShzRWHUMMtUeCkwCpWwMApKh1DPJwqjax\\\n\tGMPjRpVXqD6Oi3vSkc3hVFFH6LyJlgFD/Mld7lsXHZImDEvoXRXm8fUtfFlufzbJQ5HYyi\\\n\t/GaBUUNWFEap4X0RYhhJfV0MozvH9h0jk2pEEBzWQYpRDZw9g1GUlLjRewCjmBELgFGIWx\\\n\tCMdHgGGDVlFWGUqGMXjBrvkm3TjDBauV0eScMIGjAqgxZGWhMCD6MPTFqhaUAUq10VKaEB\\\n\tI/Dako9TMIqANTGM9HnsQXy8H2GkyzTLdSaCUV/4TAmjVdrlsRFvO3WjzBYYNfLcKxiFuL\\\n\tYy9hJGAT4kYGQ0IezQPeeg+OikxU8Dovc1zuS7KisFo/A3ASMJaaETRsBiYdSQFYBR4wWP\\\n\tG9obRpKI3xMYmWrvEYz295azifd9aTDSo2MYGOFhVFCuvm88/w8i1eSj3jINiD4C7ERnqp\\\n\tG6LhjRDaPqOqKHObctZ3UekbT8qk8Jo/ZyQlyqUx00GDkVN20ZewCjLnM2CSMfteowmkWS\\\n\tMApakDHTqoWxUTvfB5A979RExU5T613gw/qEFCMaJlcDRpl5YAZGi95ytnVzNptenesLdd\\\n\t0pGx0glT4Fillh1KeMVDpbhgmjwsuAUVTXecPITQgjO/tanZsERlF5fWBkw2NgNItWBCZv\\\n\tqf+auUaiv4FWl//+aYqcCERq5CwuLN8tO0/lH+qAUSQpGLkqqhNGKo+93XJ2TId2y4JRol\\\n\t6dMEq9uFPASBfXC0YtZbaV0bjuAMCoc7TOpBdT514wmtFEq+oY/D8pGAXNSGtQDlKumx4y\\\n\tuUZU3v24sMLv4JaEES0wiuMnhpGLH8J6l8eWei0aRqZTnZ+7POq0iTqlwvsdRko7UjAagV\\\n\tu8RlRXUBIO6x0cWQJG5kY1YFQDYmVh1DE61ExbR68MjBr1GwcjGz4PYdQ1sGCuX94uj6l8\\\n\t5gwjIAkjI/4+v1+kODf2HUzItJ6tD2C3gfTfNWqFkfYhtcEIZoQR5zWMWuvVeOFtmlT5Ot\\\n\txSxtxhZGUMjFLpo/qcDzCyi2RtGfMcSasKJZWpiHsXQHbHExMXMy2ITgEfi/TSfKfqMC6A\\\n\tpBVG1DByNOLHw4gWGNkXD/VMEtBYJRg1rp0cRpPv8rhqMBp3f8eNpNk8FwUjLX1gZK/bCx\\\n\thl8fHcYZTM8F3TaEMwBYiOfvubw+Hbyjp5O3G0DS6r4OG05tGAkdZKumAEaRh54E0NIwPE\\\n\tvYRRm7SCYtEwakk/ldbSLGMuMLIdbOkwsunHwSiUtyAY6TrsmWaUlHdOm/0skw7eXh2JlK\\\n\tZZkccwcj77qWFkYUacjn0Io74mmr52oTBqB0UaRj3aPguMUvlVZQfpAyMbv4owStWzq4wW\\\n\tGNk2RG3cMxg9DpPtQaRlSmc1AH8cnxMkP1ceLxpGqHQoGFXpoPni6cv3E4wScFomjFL5RX\\\n\tVJ57n0vYyWDaOovMT717uMlYXR21In+8r0GpFwFxBvOLK7XXeSZcCo6of2ReuCxn6BkXkB\\\n\tlwWj3qBo5rkaMLJ1sdfMCiPbpkknPE5WxgrB6I8ABl802YxqVaOppUB4hz4ho7NogHTDCJ\\\n\tV2sTASqG9e9Iz3OYwax82OuIZRe6de3Y3VSNzHKWHUUq8FwOiPZshtOhAd/Q7jsA4y2vF3\\\n\tXsOohk0MI0XtWWBknLoL3eUxylPJsmCUBJMjps8qwMgElw2jqLxVhVHqPk4Bo9Y5RiGe6a\\\n\tWG0S7wrhlymnWFHG+PGyJIvk0MEP/Xg6UBI8dsMHI0Hu5ydnlcEox0XVYWRs02rnd5VHWa\\\n\tF4x0nfcWRu9BinMz5DIziN4B5FFDds8qqNSmWWmmweJgFD/Mld9yVkWvd3mM81itjdXmB6\\\n\tMov1lg1BBb7z2H0R/C9P4hX4OZ5DTwJ2Vl/Jld7yfSRSRgFJlu2PP7FUZtL80YaC0ERiFu\\\n\tQTDS4Rlg1JSDC6MDvMvjm8b+4I6RqUGk/ERvrE4KyO7Z8tjprJswqpaCQA2jMpCAkUvCKE\\\n\tozFYzibNYwaisjkX5qUMTh/bHLY0rGwKjxLh1YGOXM6Kj2Jc8gZaXfFJ8TGJ0rO8W8YBQe\\\n\tuoGRhLjq+jSMVF0NjDSkaF7TF0YNWREY6TLXW84m86/jQnnm3bGdui0PW0ZyYGEvYBTi2s\\\n\tqYO4zeTWkZzSSzmmYgvA3Yjk7tPEk1dB/BSAEmBaOoSjqt/yt0w6i6juhh7rddHieGkX6Z\\\n\tNIwaL3jc0NXe5VHHTVvGHsDIwmDpMEr8+E4Do/7yFoDB82dj0ewggnNIPMtadp6kho2Gkd\\\n\tFyLIysydWAUWYemIFRNMOayWCkr4sP6uNGB6eZxp6bEkbt5YS4FCj2Gka2nvOGkVNx05bR\\\n\tAQp7/dQw6rpvKRj5qFWGUX+t6E3jk4yXmUB09FWVn+jNUcV3z1F9eC0FI3vcgJEFloFRJW\\\n\t0wcnV0Xxjph9IHRkmZBEYJ0Z2y0QFS6RcBoz5lmPySZSTShPBew8i2b+4wchPCSE+qNOcm\\\n\tgVFUXh8Y2XAXjHqZaLvMwT/kS5uL/K84KLBzpoRMeHkXBqM6fioYqTwWustjorykKEaszM\\\n\tZqewEjXVwvGLWUmSwj0an2AkaN8sbBKJxI1CkV7hytM+klLnNOMHo7cKYzRU+ZF4jeDZyK\\\n\tftl2Tiv4KIi0wagkUQeMaIFRHD8xjFz8ENZbznbUq1FGIv1UoKDRqda7PLbkuRAY2Xx6w+\\\n\tj3YXb/kKnVTDIi2Iq+0rJ9itgsq2GThFGVpg1G5kY1YKRe1CjNpDBicTDqGB1qpq2jVwJG\\\n\tjRfepkmVr8OJPBcCIytjYJRKH9XnfIBRMAsnhtHvJ89OITODSPmJXludFModG/VmaRVo/A\\\n\tRF7ZjWMHIBRi4No8ghnYBRNeERFU7BiBYY2RcP9RxXHEaNa6eDUWu99gWMWu5vG4zGPY+F\\\n\twUhLHxjZ6/YKRqqO8bt3Engvc5J5aUQAr49CUmpFLoCmASMNlRSMJtjlUc/MbsAI0jDywJ\\\n\tsJRir/VYBRKygmg9GB3OWxq1MtBUY2/TgYhfIWBCNdh34weiP1d6dnlnmC6DPAB6Iz554A\\\n\tl3mguDEwIg2j9S6PaRi1yVJg1A6KNIx6tH0WGKXyq8oO0gdGNv4Aw8i2IWpjEka/j8zHP6\\\n\tRKnU2S5hkg26dBihJGAUCtMAqQ2CMYodKxD2HU11+kr9XhVYTRmDyXvn3IsmEUldcBzr2B\\\n\tUWwBzSjz1IgAficOSum09qZXfxgpKC0DRroOKRhF1+q/oQ7pm7NcGJl2LxtGqfyiuqTzPD\\\n\t9gZNs06RyjycqYAkYfAHd/s9DpZd4geifwqD4h3jxLwyg0LjFK1gtGqLRzhFHVD+2L5qJg\\\n\tHFjDKBlug1FvUDTzXA0Y2brYa2aBUfyclg6jZr1eB47BC+ZjlqVKmlVyjNNazp6MNaAIRj\\\n\tVkumFUn1/NXR4nhJGZLlC1oZkwff28YdQ4bnbENYy6ylPP3+bZKHOvYWTDU8CoOaz/utZ3\\\n\tc0qZG4iUnyg2z4qRmtwYoJCAkZ6s2IBROA9JGDlmg5FjDjCCxsk2GEV+KH1+STDSddEv+U\\\n\tptrEYjvFQYmXu4ujBK3ccOGOk6p2H0CLipv1/WJvPWiABeB+zoE3LmpAeO0oAsjKK/Girx\\\n\tNYuHEdX1K7/L47xgZOsSdcZVglGzjestZ1WdJoFRQ+x9aoXR6xHy1ndySlkEiB5Hb5YGyN\\\n\tlHqUHSE0YKGhPBSGtRIe6g7vLYuGzeMApxqw2jpvjn2+iofcuYFUa2PJ9no8zpYBTlNy2M\\\n\tpt9YzfuH4i+JzSpzBdHRV705PPxfiyJG28juGZIwgjSMGg7lNIwiP5KeZb1nMIqSmjrvAY\\\n\txiRuw/GOnwlDBapY3VGvGd0BwDo8a7ZNu05zDKIfu9sT+KU8giNCL+d3tnHjbJVdf7z6nu\\\n\tfvd3kslOArggKLgFLhdB3AKyKSir8tyrIKgQFi94UZRNBRVFuRcQkrAEEHJBCIYASZQQIA\\\n\tkmZCE7JJOEyTLZZiazz/u+8y7dVef+UUufOnVOdVWv1f2e7/PM81adtaq66jO/c6rqW1Ly\\\n\tFbSvr8kj+8CrkYGRqIUFVMioMOqbyyPR0C3KS0VcnWEU1kcpF+b1zeWxqjBS+3Quj8b223\\\n\tlxf9q5o1/UmT4tMMoAblgwivMyfVyJ5MDYgAjYJ2Xo3BZLHtkXLqRA04ZR8m5ZpowOIwUw\\\n\tg3B5tMCoby6PeTDKqAIwypzg6R11Lo99glFqY0cNI8N/vmEfFwHUnr4vuws9qu8gWnjtpf\\\n\tHil1MnaXNV87K2wUiBiBFGGlisLo82GHmdYZTUoxyMlKragrYMhQHTA4zs/cR5potq0mAk\\\n\tlLxu+9Auk0HAKG84a4RRlDVcGPX9tn3S8kBaDXU+2s8pV/aCqBWDUeoWvgVG8XJVLGelVi\\\n\t+90F7OXOBky+hpHSdoybQ5Hi6PaHlqH9o6yvqwYZTnTa3X7wpGoiSM2vWH5PK4A8mt4wii\\\n\th4Cr1BNUrjwcQUODkQobzwAjiRlG4+7yaFVRGHW4oMWoYGTYrlwYmf737QJGaneFYGTp09\\\n\tZHpt4EwKj409dfA6j90h4GoYG78FvEAAAgAElEQVSASBmenQftgyQ3jkAz/sKHAiMVSBhg\\\n\tVNRyNiRRDoywwCidXxpGKag4l0frdg0aRt0+fV24Dy97DIcBo0x/nWAUJxi2ybReDEZftm\\\n\t9U7xpkRATwBaLDkcBoebcCIA1GMZAkZhgpsKm2y+MAYdTL09dqmrH8EGCU2b5OMNLXNyGM\\\n\t8m4saPUH5PK4B8LPSg9KgwbRQ9C+eyYlBEu7w+eGRAwUA4ziCCj2Mura5dECo1Q9A4ySZ4\\\n\tzUMmVhxKaGkXW7Mie8XsbUv7pu6aPvMNLVAUam8qntGWsYXQD9f5pa1cBAtPDaS+MD8G9q\\\n\tumyuIdcPRzCqtaMbE4wiwHTv8gilLGcFmfzOMMICI/3Ea1c3/qBVglGmrnahFoBReZfHqs\\\n\tGo0/HtdFtfb3NQMFJVBEZ6vUIwOg8JtV9+mEFp0BERSM5De/csOLyL5PWOVEQ0CBiVsJy1\\\n\tPn2NVh8FRhHwuoaRBsRhwsimTqAYGIws5buKWrJ99AVGqTaKwEjP7zeM9PKdYBT3VxhGh5\\\n\tHetwYZDcEwQAT7kVysJgRLu8KLoRsYJRGODUaYYZTxMioLIx1mpMsxhjAqOkRT66rrfYeR\\\n\tHRRmGBXY915gZGov6TtWJxiZtmeEMEr1lwOXdt5FwPpYg2jh9OTu2edTP5a/gVzZi4xAY4\\\n\tQRmGGUekPfBCMVGDBwGKGUQ4GRug0TAyMDnEYJI1N7qW0xtzlyL6NRwijzOxnOv3Qf4bDs\\\n\tV3Zl8/uoYUREAF8FltSE4PCDgLBHRp7yDloujOIf1TAxXQhGKGX7CKPkOtRPtDxoOBgZ12\\\n\t0wKgyKbJvVgJG+LXqdXmGk71NpGK0hxcV64iA0LBCtAueqP5Rc3g1BC4QXXdzCAiMFOEYY\\\n\ttSHTHYzUxwAGDyMJ7R8+9buPOYwyy9kL0cHIDo6KGqtdDCxbz6E+auAgUoZn/wq0D4CUyK\\\n\tVdSbQjI7DYYaRNVJtglNz9ssGonV5Ny1nIJObBSBgqjwpGGVDEDctUmdHDSFsdNYxS/VUO\\\n\tRucB1H51J4PWsCIigCuB7UByAIKD9yO8WgZGQAcYiWQ962WkACMDozgdjDAS9AYjQebHHY\\\n\t3L44hgpG5LZWGU3Ufn8qhsUxtGLbTPgw1SwwSRBD6rrsm1g8iN5QyMROxRhBIFmbyMrDCK\\\n\tgaZCJV1nsDBK/89SectZJbsnGOnbkroYxxNGm9jl8VtIcYAhaSggUoZn56AeWgnBgfsAYY\\\n\tZRMmzqACMwwygzh2OGUWrothktZ9OMGACM4hN8QDBS13uAUVaTC6MCL8l+CYYzLFO2YkiS\\\n\t3Atpw7TgwH0aHAwwUodso3R5FNGPboBRqkxXMEo342DUoQ+1fNegSK9XyeUxk58LzQ4wyp\\\n\txLHWHUAs43nicD0tBAlERFkrNTGf4GwaGHwpdctQcZMzCKgWOBUdvlcYAwin90DUYyzkvq\\\n\tm2EUHQOlXJg3OS6PSlsmMIIGI321IHwybXZYV8uPCYxG6PJ4MTL9odRBa7gRUajzgJTXZH\\\n\tDgXuKhV2EYpUBjgpFeRoeRBi0dRkBPlrNJPVIw6pvlrNpGSpYLqUsY2fuJ8/IuKtr7l7mI\\\n\t0ztabZdHNa/bPoYAozzzNiOMoqwsjL4IgtqvPZjtY0AaBYjWkXxGTZDLDyM3Vi0wEmYYab\\\n\tfyszBSIGKEkRbl6DDSh1wZGHnaSajBSAVaWRip9dIL7eXMBU62jJ7WBYxkbj9JIa3uKGCk\\\n\t5ql9WNorDSPThdsFjFLbOggYlYmM2vUVGK0TmaANU0MF0cLrkknrT+ondrBvewQYHUYxdE\\\n\tQ+jFKwGUOXRxVG6slTBEZGlYGRQepFmbkATOUHAaMSfej9pfowlInXe4aRpU9bH5l6/YaR\\\n\t6BVGF0kpDjFkjSIiArgNuEL9UYID90ZHwjPCSEYQESpMbC6PQgzQ5dEGo3R+VzBKVDGXR0\\\n\tYFI8N2DQNGandFH3gs3Ic3Ghhl+rPC6EsgqJ32gL3+ADR0EClR0ceB9sFsrRMcfgA8j+SW\\\n\tvRFGXj6MVCDlujxaYJQM9/JgRAcY0R2MUhFOxVweqRCMMtvXCUb6eqeoZQJhZIySMjBaYQ\\\n\tTDsqT3EelLEM3MRwcz2HNnCBYvnpTuEUaSDjAiH0bYYKSd+BkYKSdqqkxZGOFgZNquzEWl\\\n\tl+nQv6nNgcBIVwcYmcqntmfgMLoQxJFOWzUIjRJEa8CnkjVJaA2yejALo2RIZoMRZhjFwz\\\n\tHRq+WsMMMoNSFtgFGU3xlGWGCkn3jt6kZoVAlGmbrdwci6XWMBI8vxtcGo0+8xMBgl+iII\\\n\t6s+4z7Adg9VIQKQMz85E/SkkBHvvDJ8TUmEUQUYoEVDWy4g0aPToKBdGKlRMMCrh8phrOQ\\\n\ttmGEXA6xpGGhCrAKNOoCgIo4l0edSHRCOHkQdwGPgPQ+dD0SgjIoB70HY+2Hc3+BsWGHnt\\\n\ti9UIIw00NhglEY4NRphhlKR1gNFmcHlE2R+bRgIjOyjMMCqw773AyNRe0nesIjDS8/sOo6\\\n\t8hxXp+x4PTyECkREUfSWUEPsHe7VH0I8wwik3TEPkwAjOMkmUbjJS6SRsDhBFKORQYJeVI\\\n\t8ioJo6LzRVrdZL2KMOrQ5sjtQ/oPo8+BoP6MexmFRh0RAXwDuEtNCHZvA+IXYaMDboJRBB\\\n\tErjBKXx15gpAJtyDBKrsMcGKXqqn/jbTAU1cvFGhqMDHAaJYxM7aW2xdzmBMFoN3AJI1QV\\\n\tQBQAZ6gJcmMleiu/FgInfrcsD0YqYDaT5Wzq3BwUjCyaFBgVBkW2zWrASN8WvU5HGH0Oic\\\n\t8INVIQKcOzTwHLap6/6wcRRDQYxcM1HUZiWJaz7fRqujyWhJH2uECyD0XVbxhllrMXooNR\\\n\tXn/K76+3mekzqXcOCOrPvJtRqQoREcAh4JNqglx+GLmyJwsjoUDCBCPlGaCuXB5TeSYYxe\\\n\tlghJGgNxgJ+gAjyCTaYJSaFFfTRwQjdVvUC7dSxmpk1kcKI+15oJIuj7cguYkRa+QgUqKi\\\n\tDxEO0xL5O28JT0wjjNLPDU2ey2N8FLqBkXrS9gIjQ1mb+gUjfVtSF2OVYJTdx+pZzur9RW\\\n\t2m2wijoV+/i1Fq5CBSdA9wvpoQ7L8HuXFEiUxMMGrP++S6PHYLIzUKAkrBKAUxuoBRGzhh\\\n\t1rBh1AEoORorY7VMH5b2CsAoq+j3zcx7Fe1joDAKiO6WjVqVAJESFX0wlSElwc5bQngkd9\\\n\tAsMIoAUynLWdT0YcAoVVTb5iHASI8Qxg1G6nqXMKqSsVomP/tbXAIMxwu2gyoBIkVXANep\\\n\tCf7u28BvaTASuTBSb9dX0nIWoqFblJeKuDrDKKyPUi7M65vLow4jQTVglGwMGoz01T7BZw\\\n\tJg1OG2/mcB6s/6oWF7h6vKgGjhdZfGB+n9qYygFc4VeXUFRgpEDDCaGJdHC4z65vKYByPT\\\n\t+qhhlLmI0zvqXB5LwWgJvK9k+xyNKgOiRJJ/R3vA0X/oZpBBBkY6cOwwGrXLow1GXmcYJf\\\n\tUoByOlqragLWOBhOUE7RJGHet2mr+ZCBgJJa/bPrRLtnsYnYfkiAORXT5Si4paawS7fgAI\\\n\tM4xSt/V7cHm0wSh1C98AI33ZCCMVWAYYJWU0GKnRVRkY5b4KoixnLnCyZXR1AaPxcHlEy1\\\n\tP70NZR1ocNozxvar2+HUafAag/6w6qoEqBaOH1yaT1Z5DsVvP8B25QgOBZYBSDxQyjtstj\\\n\tQctZ3csoGU51AyM9etJglJIJRiLJyoWR0sbgLGdN/Vk0chgZtj8XRnqe2oetTQOM1O4Kwc\\\n\tjSp62PTL1SMLoLxOVUSJUCkaJV4IOpk3h9iWDPHcpT1h1g1A/LWQwwEl775M2DUTScmgiX\\\n\tx6LQsWkzwqjbp68L9+H1AqNPSYm0/iczAlUOREpU9FHgsHqw/R3XkDy8GMNIAVAKRv2ynJ\\\n\tWYYaTAxggj5Q7daF0eBwijMoCqIowy29cJRvr6WMLIBz4Ngvqzb6cqqhyIFB0EzgKSgy1X\\\n\tD+A/fHsIBvUOmgKZDIzGxuXRAqPkGSO1TFkYsalh1Ja2bnzXLQ9GZUGR7aMClrMXIUUlnh\\\n\t1SVUkQKVHRhwgtZZOD7e+4KoKMBqPkTXzPDKOquDzmwog2jASZ/M4wwgKjODroBCNlG6oC\\\n\to0zd8jAq7/JYFka6+g0jUzSnpnm5/WnlzwZB4znbTBs+MlUSRIp2Ah9TE+SR/QR77iCZ/9\\\n\tFhFA3ZRDTZbHV5tMJIA80gYAQWGKlRSR6MwAyjKPrqGkYaEIcJI2vZDqAYGIws5cuAYtAw\\\n\tSrVRBEY8xAjtYPNUWRApUdH70KKi1j1XkrozZoRRrTOMoDcYJRGODUaYYZSkdQsjHWakyz\\\n\tGGMCo6RDP1MxAY2UFRCkY5bQ7fclZ8AkbrO2RTZUGkKB0VSZAre9qfHoohkgej+Jb+yCxn\\\n\t1TYGCCOUcigwUrdhYmBkgNMoYWRqL7Ut5jaHaB/iA58AQeO5t2a3c8SqNIiUqOifgWaSIa\\\n\tF193ey80OpuSEFRkUtZ1XAbCaXx5QMMIqOuVEORub+1PLVgNEFSB6koqo0iGLJ8AB+KpW2\\\n\tvIdg161Qq5OavBZeGzY6jCrj8miDkfoYwOBhJKF9UaTO7TGHUWY5e+FuQhidBdB47g+ooi\\\n\toPojgqkpL3okZFQOuuywHPAKN4GCbMMBIKJHJcHu0w0iaqTTBK7n7ZYNROr6blLBgTuwRM\\\n\tmbI9wygDiiitUl5GZNYHCKO7gEssP3AlVHkQKbpPSs5UE+SR/fgP3oAdRvUOMEq/EtJXy1\\\n\tk1qjHCKE4HI4wEvcFIkDlhuzdW01QmAhoVjNT5scrCKLuPA3J5PANZ6pcYusYCRItvaN9B\\\n\tk5IVNc/fflm01AFGMZA2neVsGzhhVlkYSYxEGBSMUtV6gFHqbqG2DWMKoy5fkj0C3qdB0H\\\n\tje96mqxgJEinYCH1FPHLm+hP/AddEdsBgMBhjFE9ZC0JPlbAyPYbk8ptJHAKMgZSOe1iBg\\\n\tpF+UfYdRfBEPCEbqeg8wyqprGJ2D5GA2v1oaGxApUdE/AYfU383ffhky8CO41NtwMMFoUl\\\n\twehaAXl8filrM5IFLLdkrLS+9Qbqxg1F3Uklnvo8vjhwEav3Gzob3qaGxApGg/8AFk+/jL\\\n\tjRX8u/8LvLoCo/aktBlGCkQG6vI4QBhhhpGM85L6ZhiFBw+lXJiXXPgS7WK1aNxgBJhhpK\\\n\t/2KRIaHYy+DVTvoSGDxgpESlT0f4B9Koxa9/wXcmMlC6NojkjE0YrN5bFbGGl3z8wwogOM\\\n\tNGjpMAKMMIr/SvJhlNQjBaOOLo9BiYdwhwCjjnU7zd8UeMYotaq3ofchDflDgZG22fY+Pg\\\n\tSCxm9WOxqCMQORomXgPQAJjPwmrTsviUBjgJFX6wyj5J8NRqO2nFXLqDDytJNQg5EKtDIw\\\n\tKhINqRowjJzLY7Z+Dox+CFxo3rDqaexA1I6KxEeB8Bu5EYz8+7+HXH44gkgOjBBmGPXLcj\\\n\tYFmzF0eUxgFBQamXXU2MPIAJphuDyWhlGqzw8hO03wVUdjB6JQApAbIN6eJEmQUtLcdpEy\\\n\tYV0zwyieZB6Gy2P02MBgXB5tMErndwWj8ICGS2Vg1Ct0CrS7qWCkdlf8Jdn9yND8rPGbI/\\\n\t+adCGNJYgW3/BtooN+LojvJRkS/N3bCPbdrdyyjyMbA4wq4/JogVEy3MuDER1gRJcwypvE\\\n\t7aAyMOqy3crAKLN9nWCkr3eAUXevgnwUOJK/sdXSWIJIkQT+TP/Bmz84P4RIAp0oQkreQd\\\n\tNgVNTlsVsYxRHQOFnOBtkr3MFIq6+3b+ojA6OcSEmt0z2MmiA+AtB4/o2Mi8YWRGFUBMB3\\\n\tgAvVHyM4tBN/x9XJxHUbRvV8GCl3zsbXcjZuQx/iRRdU0rYNRoQwkoHxAh9LGGXqdgejti\\\n\toNo3OkZGfH6K1iGlsQQQpGbwVa6sFv3noh+BtZGHkRjBD5MKq65SxYYKTmRXAzwgjMMNIu\\\n\twnGCkbVsB1AUhNFgXR5NKg0jSWiZQ+P5N9garaTGGkSJpNwGnBGuRBfbxhGa2/4zPMFUGI\\\n\tlouVYnudCtLo8FLGfBAiMNNDYYpeaITDDCDKMkrQOMunZ5VG64jAuMig7RkrqDhlFOJGWE\\\n\tkQmo+W1qMDofqM6nOUpo7EGUREVSvhvYF66EP07rrsuRK3vbF7oJRmPj8jgkGMXHrwBpJg\\\n\tNG2noVYdShTQVG7wPB1AvGKxqCCQCRogNI+a72qgAZ0Lz5PKg1lPkfzwyjobk89gIjFWgD\\\n\thFEJOIw/jAxwGiWMTO2ltsXcppTiUim5NltxPDQRIFp846Xx4ieQUrGgE/i7b8N/8KY2jJ\\\n\tJnjIQRRm2XRwuM4meQbDASXgEYKcM1I4xiKBjukhWCEUrZbmAky8FhM8GI9vrojdVSZaJo\\\n\t6HrGURMBIkUt4E36f9PNm84Fv5WGUfIOWh6MPHJhFA/XRmY5207vr8tjpIJwkLayNg2h7M\\\n\tAsZyvlZZSUvQbJxYyxJgZESlT0beD8VBi9epDmbReFoDDBCGGBUTwnJMwwEgokBuHymMoz\\\n\twShOD/ezb8ZqqoYJoz5HXJvI5fFvAKZ/6zrGVRMDIkjB6E3AERVGrTsvITi82wwjrx7CyL\\\n\tk8OhiNn8vjTcDXGXNNFIgU3U/ydn78PIxk4/r/R/KwoglG6isfo3R5tMFIpKFRCkbdzBmp\\\n\tGjcYpar1G0YxKAYEI3W9M4zejRRM//b4RkMwgSBSoqL/C4Qf+I7OkGDPD2nde1UInRgEJh\\\n\tgVdnm0wCgCjBVGogCMIB9GicwwSs0jlf1Mke26HScYSX11jGCUuVtnaQ9xE5KvMgGaOBAp\\\n\tagJvTNaiM6R507nIjSMRdOodYNQGy8RazgJZl8ec08LBSJEJRvpqnyIhM4zeTbmjXFlNJI\\\n\ti0ievPJxlSIteXad7wbwp06m2I5MFIjNpyVi+jA0MBjAlGgBFG8V+JEk2F5axnuIORARQy\\\n\ttT4El8fvAV8FwfQLv8e4ayJBBCkY/RlwKMmQktaOq/F3fj8No5o6HLO4PIoClrPJPxuMKu\\\n\t7yKCCZx6JPMCqjIcCoY93xsJz9K7o4vFXVxIJI0U7gz1MpUrJx7WdCT2YdRl4aSJV1ebTB\\\n\tSF/OwEgHlgFGkIqkeoZR2ctlwDCaAMvZK5F8PYyGxvZh6pQmGkRKVHQ2cLmaJ1f2snHTua\\\n\tn5oRSMhubyaIGRPgzzhmw5q80TDR1GRfvKS88pVwkvo0596P21094JMP3Ca3I2frw00SBS\\\n\tJIHXAOtqYuuObxDs3Z6aI8rAKAaMDUbxLX8bjGKXx1wYKTCxWc5igJHw2idvHoxCEuXAiC\\\n\tyMRN14EK1Ht0Cas5zV6hfpIwuji5FclrPFY6mJB5ESFd1J/GxRLClZv/KscIhWa3SEUTJ/\\\n\tVFnLWcwwUu7QFXV5FF693JzPqGHUZbuVgVFm+4wwkkj+EgTTL5qcaAg2AYggBaN/BlIfAJ\\\n\tdLD9O88QsRfBrJBW6CUd8sZ5MoyAYjzDCKIyAxBJdHr0ECP02bEkaZut3BqC1tvZjL4+cI\\\n\tn6SeOG0KEClqAq8GUl8ObG67GH/3tjaMvEZygQsjjCbE5dEKo2i/4voGbToYjd7lsQniXQ\\\n\tDTL77aspHjq00DIiUqug54Xzo3HKLJoJWCkfDa8zhGy9mquDz2AiMwwygehkL2AkmOWgmN\\\n\tE4ysZUcBo2T9DOBe238M4y5R9GueQkzGAVj6yGkA08C1wM+pefXHPZPpp58OfgsZtMBvQt\\\n\tBEBn607IMMIGhB4CNlK1z2WyDjPD8sH/hhWryMH345NUkPojphPRl/3ln6CBmEaTIuI8O2\\\n\tk7/KP2S7LLJdBgnEdSTJlSGD9t8oXSZpcbkoff0wNFfbB0iYzxXjmWE7XQzppU6tEu2Wum\\\n\taFuijz6+rHIbNOGzzK9E64LpL19H7ntnkAIX8C2D/94qtyNqx6KsqXTRMRaVoHXknoX5So\\\n\tdee3aO34HtTqmcgo5fI41pazahtRZJRES+nISNSm0ketTGRUIiqpZGRUdPLauE46MpIgDz\\\n\tUJHjiCv2OZYNcqcsUvExm9B8n+Ansxttp0EREkURHA3wB/reaJmUVmX/gBxPRiFKlYIqOg\\\n\t1Y6A9Mgojoqi/ExklCxLc2QURTtCjXbUyCiuq0ZImcioHfFkI6N4mZzIKEyXK7uzB7DXyM\\\n\tgUFVkbsGgcIiPAv3+Z4N4l5LqfyROLDWo/vkjtpBklNdPmncDPAM3pl3y309ZXTi4iypEy\\\n\tX/R3QMpbU64tsf6dD6efsK7Vs5FRYctZj0xklCwrEVIVXR6FiO6eaeo1MrLdietHZNTHsj\\\n\t1FRr6kdeNe/DsOGiEEIJeatG7eT/P7B5UPWmbafAuSZuHtH1NtShApagGvANbURP+hm2ne\\\n\tegHUGtFdshgqBhhVxuUxB0YiD0aCPBiJ+qwFJhWFUZmhW4F2u4KRlLRu2kuwb81cR1Pw0B\\\n\tGatxxU+kna/CbRx0PHMRoqo005NIulDNFeT/JdtEi1OrO/9X68rY8Gv6kM0cLhV2aYFv0L\\\n\t9j5I8MCdyEN7kX4TMTOPOPFReCc+sj1Eiyet1WFaavhlGKbJACnbE9rZYVo8gS2T9dQwLf\\\n\tXXNEyL24DUMC3wkcu7wmXjsKeiw7QyQ7cC7ZYZpvnbD+LvWCrRUaja47ZQ/7GFeLUF8ueB\\\n\t26ZfemXptqqiwnzZzCCCBEYC+BrwfDXPO+oUZl/0gTDS6QAj/+6baX778wQPbjf2Ixa3Un\\\n\t/yadSe8OQ2CKwwat8VM8JImcPpCkZSBRDttiwwkit7wY/ejtlMMBL6amcYyeUmzWt3lYvA\\\n\tYnmCxi+dgDdbA3g/yD8H2Awg2uxDs1iS8EHH1MxscOhB1q84IxpyNZQ7aeHwS0R30JqXfZ\\\n\tH1c95jhRCAXDpA89Ivs3Hex5CrK8pwaICWs0A/XB5FY7bD0ZvQYZrUVzsP0/y7DnUHIYBA\\\n\t4t+zjJQ8BLwHxFhDqIw2PYiUies9wKv0/Nb2y2lt+08zjLw6rcvPpXn5uYX7C3btYONLZy\\\n\tCXDjI2Lo+NuQRK/Z6DyUsbNxjJlSbB3lVzZkEFDx1Brgdv9/eulx/bjbE2PYggBaP/BP5F\\\n\tz1+/+myC/feEF6gCI/++bWx865zS/cnlQ2xc8Glkc6P9vJEa3Wgw6p/LY5cw8jxEY17ZAd\\\n\tNemS9Q6/U+gTAKHlou2KBdYr5xoHn5rs8Ge9eZfukVPbc3LnIgiqTA6K1ot/Txm6x/8x/D\\\n\t+aDolrzw6mxceKYyz1JO8uBeWpee376TVsrl0QIjoYPGBCM6wEiDVgyjqQVtB0x7tXlgZE\\\n\toLdh8p2JhFnsA7Zurl4qgpGezoHWrjJAeirNaBlwEH1cTg8E7WL/9A8kyRf/eNBPff3lNH\\\n\t/vZb8O+5PQsjZV4oz3IWb4iWs7UpqE+nd2DYMCqjAcNIf0lWHt5AbpifFyoq74TZb8o1/x\\\n\tve1im2fOLuntoaNzkQKVKionsIJ69Tat3zXZo3fglqdZrX/kdf+mxdeSFYjdWUuZ4MjGrh\\\n\txSB6tJyVmGGkLwsQM0dld2CYMOp2ErjIRvQIo+BAsWeGbBJz9XXv6KkXiZk68++4pae2xl\\\n\tEORJoUGJ0PfFDP37jus/j3XY9/63f60p88uBf/hzdjh5Fyl8wEo+Tpbs8MoxSQBL24PIr6\\\n\tTDYqgurCqB8T6x3qxzCSvYBIgHfi7BuDpeaymKl1Lj+BciAySJsvSpu/SMn6RX+LXDmkV+\\\n\tta/s1XJJYhKACqosujmDnavBOTAKMu25UIgqWNEpXT8k6cu1Gu+WeLKY+5t9zQdTvjLAei\\\n\tfDWB3wX2qony0EFz6S4V7NoBh/YpEVAbMt27PFpgFEdAVhh5uTCyRkWwaWEk131oBiUqti\\\n\tXm6k3v+NnniNk682+/uas2JkEORBYpUdF9wO+guDrK9f6/g+hvvwWjy6MNRonLYx6MyIeR\\\n\t6M5yVsxute/IZoTRSpfRkADvpPk3BQfX94h5w8vFm0gORDlSYHQp8JYko8e7Iyb5924zuz\\\n\tyKcEhWJctZUZ9FTM0b9wOww6hoUVtGRWEkj7Q6FzLIO2HuernaPEs0asz9r/H/WmsvciDq\\\n\toARGkg8BnwGg1X8QBQ/dA62WGUbDspxNTVibYEQbRrPHpNN1GS/ukjAqWHjUMJJr5UEk5u\\\n\tpN79iZ54jpOvNvu7F0/UmTA1EBKTA6HbgOv7v5gFzJgGD3/QkgKu/y6NUR04bb+al9MqWV\\\n\tgFGZqGSUMLL4DVklwDth/o3B4Y19Yi77/bjNKAeiclpD8mIk3cXiHRTseUCbH/LMMFLeUT\\\n\tPCKIKIVAGT8TKiBxhFk+WzW8P37vI0CBhZ4DAqGMlmORB5J8xdKVebHxf1GnN/el2pupMq\\\n\tB6KCWvyTMCqSew7fz5bZV+PlDEu6lNy/uzuXRxuMhFcARqIDjGL4WGA0d2yBHTOlDQZGPb\\\n\t8KUrY/KDVnKBYaK2LL9LOYrjH/Djcki+VAVEKLf3Ip+AGsbZzDMQv/2O/2g/0Pk+/ymAOj\\\n\tEVnOisZc6O/dSUOCUV/eSytb1i/YSE3gHTv7YrnSXBXTbkimyoGopLb8/Y0wVYe15ts4Zu\\\n\tHCfrYtlw8westZgRVGBmtZiKIir8CFNU4wKhEtyYJzht4J858NlpvfEA2P+bde37nCJpID\\\n\tURfa8g83hzDygxewZba3N18VycP7w0ngOPowwqjeBoERRunnhozGakA7utFh5NlhpP5Nva\\\n\tVfR8wfX3AnTWljDqMC7qVi68wOudZ6pZiqMf/OifxqdE9yIOpSW953C0w3EFsXnsT89N7O\\\n\tNQqotRF+XsirR3fA2g8rZmAUT1iP2uUxcXGcN78UW1RjDCNRyweRmKk3xcLU05iqsfCezf\\\n\tdCaxE5EPUgMTuFXNtYFUfP/ywzjR7NaELJjQ1i90eR+myRZ4ZRQZdHK4xEBxhFEVQRy1kx\\\n\tdxzoH2U07qQtfUxh1KhZCgBCII6ZfYVca+0UUznlNrkciHrQ4juvQdRryNWNXSzOPpmpes\\\n\t/vfsj11QREaRjVOsBIAc7ILGcF3sJJhYYqA7vrNQIYiakrR90AAA7aSURBVFn7/Jh3/Nzn\\\n\t5JHmF0SjxsJfuSGZTQ5EPWrxb66DmgfN1jaOmnsONa+3px0DP4JHDoyEyIVR+/mjNIz6Zz\\\n\tmrl1FgVJsKI6MiGuZ7abmNdN8ugJg3R4Hi6Jk75Ebr98RUjYV3b94XWovIgagP2vLem6BR\\\n\th/XmpWydfzmeV+qthZT8VjRJHQ/HDDCKP+qYPGGdhlFxy1nRpeVsOwIywUhMH1Xslj4MH0\\\n\tZlVLBdcVTWjUDMNVbEXP0XaNRY+Pvvl+1508mBqE/a8t6bwjtpG60vcezC66h1eWgDiYhv\\\n\t33tpIGVg5EWvfMS3/LtweYwnvPvt8ijmji82XwTDhVH3/0VY2xWL06DO/zS8QBw1/Qy54R\\\n\t8SDXeJFZE7Sn3Uln+4GaYbsNH6mDhuy+uodxEZRbBJwSgBUs0Mo3hep2eXRwuM9GGYzeVR\\\n\tXRdeNF9U8BSrKoyKzGUJ8E6M3Ag8gXf8/Gvlun+taNRYeLe7S1ZEDkR91pb33oSYmUJuND\\\n\t8qTjjqdOol75TUGkoEpMFINU4zwSi+5W+DUezymAsjLx9G8b8ilrO1KcTCicX3fYxh5J2y\\\n\tGELoxIUPydXW2WKm7m7Vl5AD0QC0+Hc3hLf2N1ofFydvPZ1GrfBp780sdoSRiCOkPBgpAB\\\n\tql5axozIeWIUU1pjAS03Vqjz/uX2QQvFnM1N3kdEk5EA1Ii+++HjE3jVxrfkyccuwfM1Uv\\\n\tdtrPbyH5mmxyh6yOsMLIM8Oob5azmGGkDMc6uTyK2WMQ+nfR8jSeMPqk2DL9Ju+4ORbe4y\\\n\tBUVg5EA9Tiu64NYbS68UlxyjF/yEyj42kvFo+HWr0NI69BcnfLCKN6FOUIM4wSW5DRujyK\\\n\t+ROKT16DHUZFi9oyBgOjS5C8TjRqzL/5mhKNOcVyIBqwFt9xNWJuCrm28Wlx8jEvZaZhfc\\\n\t5IzMwjZhdD+GgwEl57HicDo3j4pjxDNDKXRxuMvBre4skkzyoVUa/vpZVotwcYXQu8hPBD\\\n\tC05dyoFoCFp8+9WI2Wnk2saXxSOPfR5zU0YDG1mTyMM723MzBhiFQ7YYOPEtfAVGypAs1+\\\n\tXRBqPEp2gAlrO1Bt6Wk8sdvEG8JGtJ7wJG24DnA0sAs79/aYkGnFQ5EA1Ji2+7KhqmrX9D\\\n\tPGLrM5ifzv4POu2x+tW3EOy+rT0RLTwzjBLTNAuMvFpnGI3CcrY+g1h8RB+ecu4DjExFi5\\\n\te9D8mzkewBB6Fe5UA0RC3+xXfDW/trze+Ik495GvPT62q+mJtGri+z+h/vpHX7xRFYGp1h\\\n\tlNyON8NIvYM2GMvZ7PNGeS6PYmoBMX9cuRBkSPYhueltPQg8E3gAHIT6ISELngzJ/IFTz1\\\n\tr6p6cjj6wjpuqPkXsO38Dy2hYA8YRHpt7krv/ks5j+xdPDC9lvIoMWSD98DSRoIgMf/Gb4\\\n\tflrQCv9JiZTRsh+VD/ywrPRDm5EojcAHorzABxmEcJBRWRlE9QKQAUIGgETKqA0pw7zAB6\\\n\tRSP0jWpbIcgkcC4bJcfhi5drAdXRWRqagwn8PGVo31LUnmzXoQ+DVgO8DsKxyE8lSYLw5E\\\n\to9HSe5+KXGsipurHyr2Ht+GJ48WPZx/+845/HDO//jbE7FFtGPnNCAAWGAUtJDIHRiGw7D\\\n\tDyFSBlYSRlNMVlhZECHR1GyCgvgtGhB5DNI+MCIwehkirKFzc0G5EW3341YqqOXF7dR6P2\\\n\tI+Kko79oKhfsuZPVr/wp/u5tUGtozxjV0sM09Y39vrg8asM0obk8Wi1n4zkkfZimDNfiZ5\\\n\ti2nFzutj4MbZimvbHvIDRAuYhoxDr85z8Dc9MwN42Yn/5L4O8x/QchPBqnvpSpU18GQdCO\\\n\tjOIISAbmyCjwgcAeGQV+OzoyRkZB8s8YGSnRTfnIKMr3mwSHdkTpJTS8yOhuBM/BQai03N\\\n\tBszLT0kdPixecBnweONpWrnfhTTP/qmxGzW8vBKGi14WKCUQwkG4wiwFhhpMLFBKNoOGeD\\\n\tkWyuIA89aJuXMctWtr8w+gHwbGCnEA5CZeVANIZSYPQTwFeAnzaVE1NzTD39ddQf/ZQsjF\\\n\tSwGGHUBosZRgpwDDCSSoRkhFE8f2SBkUzmiAwwWjuEXN7V+3wR0j7nU7SNMO1K4DeBQwBz\\\n\tr3QQKisHojGVAqMF4F8Jn9o1qv5jT2fqF14FjdksjPwoArLBKL7DZoFRApxuYaRHSRkYRc\\\n\tMwHUYrDyNXD1QBRl9G8PvAEXAQ6lYORGMsBUYC+DPCeSPjt53F9CJTT3kltR99mhlGQRpI\\\n\tGRgFfniy2GCkDMXMMAqh01cYHbq/P3fSuofRPwDvgPARKgeh7uVANOZSYATwZOALwGNs5W\\\n\tuPfCJTT3kVYmaLGUYKkAYBI4EMJ9G7gVHyfJFMtjE4cG+4LcOF0QaCPwLOiRPm/sBBqBc5\\\n\tEE2ItKHamcDv28qKqVkaP/Pb1B/362FCWRjF8zpWGKWfL8rAKI5obDDS75bpMJJBSAgZIN\\\n\teXkYcfiHZsKDB6EHgZcBXCAahfciCaIGnR0f8APgqY3emFQCwcz9SpL6N2yhPNMIoBY4NR\\\n\tfMvfBqMgCPOtMIpu1dtgFAOJ8LGBDIyiPLm0E7l2KNmvwioPo0uA3wMeBph7lYNQv+RANI\\\n\tFSgHQKcBbwAmPB6LfyTngcU6f+Dt5RpxhhJNX5IxOM1Fv3JhjJOILqEkZxBGSDUdAk2H93\\\n\tey6p/zAKgL8V8LeADw5C/ZYD0YRKi45eDnwYyH5ITPm9ao96Eo0nPB+xcLwFRq02WEwwUu\\\n\t6cGWEUQcYOIz8KcsrDSK48jDyyz7hfHZUPo/uBVwCXxUUdhPovB6IJlwKk44APAv8zVSD1\\\n\te0kQgtojn0Tjcc9CLJ5khpHfQp0jGiqM4qevdRgFGwT7tmPftw4yw+hfEbwJOAww7wA0MD\\\n\tkQbQJp0dEzCaOjxycpOozCRGonPZ76Y34F79ifUO6aKW/s58Eomj+ywyiI7sDZYKSBpgCM\\\n\tgv0/DB9NUNUdjHYBrwF5QZzuIDRYORBtIilAqgNvBP4K2ApYYBS9q7p4EvUfeSreKacivE\\\n\tbWPiSejDbCKLrlb4NRED1h3S2MkmVJsO+H4Kesm9o7UUw+gjOBdxE9JT3/6m8XrevUgxyI\\\n\tNpm06Ggr4QN5bwBm8mAEQK1B7aSfpnbyzyOO+TESzyNlSGaFUfyOmg1GEVCsMEqAZYFR0C\\\n\tLYsy0sb3wVo+N5eTXweuDGuL6D0PDkQLRJpQHpUYRAejVCKE9mG2AUr0/N4530BLzjHot3\\\n\t9KPCssl7aYEdRskzSBYYySB86NEKI5mOkAifR5IHdoTmackGGnbafG7eBfw14QvEEmD+Dx\\\n\t2Ahi0Hok0uDUiPBv4CIV4NzIRJdhiFiUB9Gu/oR+Md86Oh6f3s1nTkYzVWkz3DSK4vIQ/f\\\n\tj9xYMW9bJi1J3EV4O/5sYCNOdBAajRyInIAMkE5CiNcDp4M8Xs2wwkhVfQZvyyMQ88eF/2\\\n\taOQkzNY7YPyYFREvEoMGqth2/frx+G1YPhu2ambbBtG+xAiA8CHyd6URUcgEYtByKnlFJA\\\n\tEmIGeDnI1wBPaycbKnb62YWHmF6Axjxieg7q0wivoZjxo0Q9LaS/Af4GBE1obUBrFdlcDS\\\n\tfJrX3kpl0PvB/4d6AV74QDUDXkQORk1NIZz4iWkt/9Z4FXEr468oiuYNSprKV+qVMqXfYQ\\\n\t8AUEnwZSn1ad/yN3O75KciBy6qilM1LDthqhJ/OLheBFwCNShUcPo1UElwD/Rmgatxa36+\\\n\tBTXTkQORWWBiQQCAFPBJ5LaJP6VGB6BDC6H/g6cAHwTUIYJZr/YwegqsuByKkrLZ3ZhpLy\\\n\ti08TeiL9IoInAk8itLPN/5B9ORgdBm4Hror+XUn0AUNV869x8BknORA59UXLZ56WTQxPhS\\\n\tlCGD0WeCTwVDx+D9QIR4bfIxESRICo+Yj6BkFz6qtyffpG4CHgTuAOYJfpFHPgGW85EDkN\\\n\tTMtnZYZyCI+3UhPvE55EhJ9KQ9R9RL0FjQ28ehPRWEPUV6Cx/uXm3mNfEizPE6xsSZpZeK\\\n\t2DzqTJgchpKFo+67T4k/ZfoyZekAFRowX1GERHEPVVaKy3qK0+CthVe9ryqHfBaYByX3p1\\\n\tGp4CBPD0TLoA9Qnudhp14I8AgmvMRpNOm0sORE790OOBY/KLBPryHwtPuPPPCXAgcuqPft\\\n\tmYqobl2ZH9owmfW3JyciBy6oueUrxoaqj2SoQguPHYfm+P05jJgcipay195LQ46HlqXjmh\\\n\tf4teJH9fQqOxMIhtcxovORA59aaAReCnMuk24/q05oHn932bnMZODkROveqJ6OeRUP/q0Z\\\n\tC67gG8DE8Q3HHKoLbPaQzkQOTUq05NrVn9g6QCoUBN/w1mpt3wbJPLgcipV51qzyryMJs3\\\n\tQ/hirdMmlgORU6+ygehGoq+npiU/hz55jfe8cj4jTpMmByKnrrT04dPigOcnLUXeDlxnmC\\\n\tc6E/hYeqjGc6g1kLt+bjAb61R5ORA59aJTgDlD+nch+DpCXGHI2wO8GbgFiAOhR4mFxUcP\\\n\taBudxkAORE696LGW9HdE0c5lqWgoTNtFINaA3wXCT3SEMPpvg9pIp+rLgcipF5nuuV8gfS\\\n\t6L4HIF6XHZAelPLYEAz7sdeENIIQ/Ajcs2sRyInHqR/m7GOvC/AURNQq15kHgIFvLoNmSN\\\n\t2i/tD21l6o3PAJ8NoSVOGNZGO1VPDkROvSj9xr3gr2XAdoCZl/1X/GrHZYqV1e3xgvffD4\\\n\tefHAo/i30HguVyn/VwmiQ5EDn1ogAhwtGV4NvA+0Ew9weK06JAnbC+JdPC1NQy8LsIvjDg\\\n\tbXWqsByInHrRbdHfK4AXE8j0c0NhgHO5Mk2U+uqh9/N7oF6H6Zmb5draje5Ros2r+qg3wG\\\n\tmsdT6hM+M1MsAXHsy/Ov2FVVFr7gG2Ab5sTf1A1DdS+d5jdwxrW50qLBcROXUvgQ/yuzLA\\\n\tR2a/Mzb9wmvieaJLEPLNSI/6M+8eyaY6VVuFzfOdnLpR66IngRd9177mU3/2raPdIKdKyo\\\n\tHIyclp5HJDMycnp5HLgcjJyWnkciBycnIauRyInJycRi4HIicnp5HLgcjJyWnkciBycnIa\\\n\tuRyInJycRq7/D3Tgxzs5ujSKAAAAAElFTkSuQmCC\\\n\t\")\n\n\t-- 30log.lua begins\n\tlocal function require_30log()\n\tlocal assert, pairs, type, tostring, setmetatable = assert, pairs, type, tostring, setmetatable\n\tlocal baseMt, _instances, _classes, _class = {}, setmetatable({},{__mode='k'}), setmetatable({},{__mode='k'})\n\tlocal function assert_class(class, method) assert(_classes[class], ('Wrong method call. Expected class:%s.'):format(method)) end\n\tlocal function deep_copy(t, dest, aType) t = t or {}; local r = dest or {}\n\t  for k,v in pairs(t) do\n\t\tif aType and type(v)==aType then r[k] = v elseif not aType then\n\t\t  if type(v) == 'table' and k ~= \"__index\" then r[k] = deep_copy(v) else r[k] = v end\n\t\tend\n\t  end; return r\n\tend\n\tlocal function instantiate(self,...)\n\t  assert_class(self, 'new(...) or class(...)'); local instance = {class = self}; _instances[instance] = tostring(instance); setmetatable(instance,self)\n\t  if self.init then if type(self.init) == 'table' then deep_copy(self.init, instance) else self.init(instance, ...) end; end; return instance\n\tend\n\tlocal function extend(self, name, extra_params)\n\t  assert_class(self, 'extend(...)'); local heir = {}; _classes[heir] = tostring(heir); deep_copy(extra_params, deep_copy(self, heir));\n\t  heir.name, heir.__index, heir.super = extra_params and extra_params.name or name, heir, self; return setmetatable(heir,self)\n\tend\n\tbaseMt = { __call = function (self,...) return self:new(...) end, __tostring = function(self,...)\n\t  if _instances[self] then return (\"instance of '%s' (%s)\"):format(rawget(self.class,'name') or '?', _instances[self]) end\n\t  return _classes[self] and (\"class '%s' (%s)\"):format(rawget(self,'name') or '?',_classes[self]) or self\n\tend}; _classes[baseMt] = tostring(baseMt); setmetatable(baseMt, {__tostring = baseMt.__tostring})\n\tlocal class = {isClass = function(class, ofsuper) local isclass = not not _classes[class]; if ofsuper then return isclass and (class.super == ofsuper) end; return isclass end, isInstance = function(instance, ofclass) \n\t\tlocal isinstance = not not _instances[instance]; if ofclass then return isinstance and (instance.class == ofclass) end; return isinstance end}; _class = function(name, attr)\n\t  local c = deep_copy(attr); c.mixins=setmetatable({},{__mode='k'}); _classes[c] = tostring(c); c.name, c.__tostring, c.__call = name or c.name, baseMt.__tostring, baseMt.__call\n\t  c.include = function(self,mixin) assert_class(self, 'include(mixin)'); self.mixins[mixin] = true; return deep_copy(mixin, self, 'function') end\n\t  c.new, c.extend, c.__index, c.includes = instantiate, extend, c, function(self,mixin) assert_class(self,'includes(mixin)') return not not (self.mixins[mixin] or (self.super and self.super:includes(mixin))) end\n\t  c.extends = function(self, class) assert_class(self, 'extends(class)') local super = self; repeat super = super.super until (super == class or super == nil); return class and (super == class) end\n\t\treturn setmetatable(c, baseMt) end; class._DESCRIPTION = '30 lines library for object orientation in Lua'; class._VERSION = '30log v1.0.0'; class._URL = 'http://github.com/Yonaba/30log'; class._LICENSE = 'MIT LICENSE <http://www.opensource.org/licenses/mit-license.php>'\n\treturn setmetatable(class,{__call = function(_,...) return _class(...) end })\n\tend\n\t-- 30log.lua ends\n\n\tlocal class = require_30log()\n\n\tlocal g_t = 0 -- The current elapsed time.\n\tlocal g_step = 0 -- The current physics step.\n\tlocal STEP = 1/20 -- 20Hz physics.\n\n\t-- Debug things.\n\tlocal DEBUG = false\n\tlocal LOCAL = true\n\tlocal g_frame_count = 0\n\tlocal g_step_count = 0\n\n\t-- A State maintains two x,y,angle states for some\n\t-- body, and interpolates between those states.\n\tlocal State = class(\"State\")\n\n\tfunction State:init(body)\n\t\tself.t0 = 0\n\t\tself.x0 = body:getX()\n\t\tself.y0 = body:getY()\n\t\tself.r0 = body:getAngle()\n\n\t\tself.t1 = self.t0\n\t\tself.x1 = self.x0\n\t\tself.y1 = self.y0\n\t\tself.r1 = self.r0\n\tend\n\n\t-- Calculate the next state for Body, at time t.\n\tfunction State:save(body, t)\n\t\tself.t0 = self.t1\n\t\tself.x0 = self.x1\n\t\tself.y0 = self.y1\n\t\tself.r0 = self.r1\n\n\t\tself.t1 = t\n\t\tself.x1 = body:getX()\n\t\tself.y1 = body:getY()\n\t\tself.r1 = body:getAngle()\n\tend\n\n\tfunction State:get(t)\n\t\tt = math.min(t, self.t1)\n\t\tt = math.max(t, self.t0)\n\n\t\tlocal p = (t - self.t0) / (self.t1 - self.t0)\n\n\t\tlocal x = self.x0 + p * (self.x1 - self.x0)\n\t\tlocal y = self.y0 + p * (self.y1 - self.y0)\n\t\tlocal r = self.r0 + p * (self.r1 - self.r0)\n\n\t\treturn x, y, r\n\tend\n\n\t-- Simple class for figuring out whether the eyes\n\t-- of the Duckloon should be closed.\n\tlocal Blink = class(\"Blink\")\n\n\tfunction Blink:init()\n\t\t-- When this hits zero, we open the eyes.\n\t\tself.closed_t = 0\n\n\t\t-- When this hits zero, we close the eyes.\n\t\tself.next_blink_t = 5\n\tend\n\n\tfunction Blink:update(dt)\n\t\tself.next_blink_t = math.max(0, self.next_blink_t - dt)\n\t\tself.closed_t = math.max(0, self.closed_t - dt)\n\n\t\tif self.next_blink_t == 0 then\n\t\t\tself.next_blink_t = 5 + love.math.random(0, 3)\n\t\t\tself.closed_t = 0.1\n\t\tend\n\tend\n\n\tfunction Blink:is_closed()\n\t\treturn self.closed_t > 0\n\tend\n\n\t-- Duckloon (TM)\n\tlocal Duckloon = class(\"Duckloon\")\n\n\tfunction Duckloon:init(world, x, y)\n\t\tself.body = love.physics.newBody(world, x, y, \"dynamic\")\n\t\tself.body:setLinearDamping(0.8)\n\t\tself.body:setAngularDamping(0.8)\n\t\tself.shape = love.physics.newPolygonShape(self.body, -55, -60, 0, 90, 55, -60)\n\t\tself.shape:setRestitution(0.5)\n\t\tself.img_normal = img_duckloon_normal\n\t\tself.img_blink = img_duckloon_blink\n\t\tself.img = self.img_normal\n\t\tself.blink = Blink()\n\t\tself.pin = love.physics.newMouseJoint(self.body, x, y - 80)\n\t\tself.state = State(self.body)\n\tend\n\n\tfunction Duckloon:step()\n\t\tself.state:save(self.body, g_step)\n\n\t\tif math.floor(g_step % 5) == 0 then\n\t\t\tself.body:applyForce(love.math.random(30, 50), 0)\n\t\tend\n\tend\n\n\tfunction Duckloon:update(dt)\n\t\tself.blink:update(dt)\n\tend\n\n\tfunction Duckloon:draw()\n\t\tlocal x, y, r = self.state:get(g_t)\n\n\t\tlove.graphics.setColor(1, 1, 1)\n\n\t\tlocal img = self.img_normal\n\t\tif self.blink:is_closed() then\n\t\t\timg = self.img_blink\n\t\tend\n\n\t\tlove.graphics.draw(img, x, y, r, 1, 1, img:getWidth() / 2, img:getHeight() / 2)\n\n\t\tif DEBUG then\n\t\t\tlove.graphics.setColor(0.8, 0.3, 0.1)\n\t\t\tlove.graphics.polygon(\"fill\", self.body:getWorldPoints(self.shape:getPoints()))\n\n\t\t\tlove.graphics.setColor(0, 1, 0)\n\t\t\tlocal ax, ay = self:attachment_point()\n\t\t\tlove.graphics.circle(\"fill\", ax, ay, 3)\n\t\tend\n\tend\n\n\t-- This is where to attach the Chain.\n\tfunction Duckloon:attachment_point()\n\t\treturn self.body:getWorldPoint(4, 90)\n\tend\n\n\t-- The chain is built from a string containing \"# nogame\",\n\t-- which represents what should be \"drawn\" along the chain.\n\tlocal Chain = class(\"Chain\")\n\n\tfunction Chain:init(world, x, y, str, duckloon)\n\t\tself.links = {}\n\t\tself.str = str\n\n\t\tlocal DRAW_INFO = {\n\t\t\tn = { r = 11, img = img_n },\n\t\t\to = { r = 11, img = img_o },\n\t\t\tg = { r = 11, img = img_g },\n\t\t\ta = { r = 11, img = img_a },\n\t\t\tm = { r = 11, img = img_m },\n\t\t\te = { r = 11, img = img_e },\n\t\t\t[\" \"] = { r = 4, img = nil },\n\t\t\t[\"#\"] = { r = 7, img = img_square }\n\t\t}\n\n\t\tfor i=1,#str do\n\n\t\t\tlocal prev = nil\n\n\t\t\tif i >=2 then\n\t\t\t\tprev = self.links[i - 1]\n\t\t\tend\n\n\t\t\tlocal byte = str:byte(i)\n\t\t\tlocal link = {}\n\n\t\t\tlink.x = x\n\t\t\tlink.y = y\n\n\t\t\tlink.info = DRAW_INFO[string.char(byte)]\n\t\t\tlink.radius = link.info.r\n\n\t\t\tif prev ~= nil then\n\t\t\t\tlink.y = prev.y + prev.radius + link.radius\n\t\t\tend\n\n\t\t\tlink.body = love.physics.newBody(world, link.x, link.y, \"dynamic\")\n\t\t\tlink.body:setLinearDamping(0.5)\n\t\t\tlink.body:setAngularDamping(0.5)\n\t\t\tlink.shape = love.physics.newCircleShape(link.body, link.radius)\n\t\t\tlink.shape:setDensity(0.1 / i)\n\t\t\tlink.state = State(link.body)\n\n\t\t\t-- Note: every link must also be attached to the Duckloon. Otherwise the\n\t\t\t--       chain easily goes haywire on higher speeds.\n\n\t\t\tif prev ~= nil then\n\t\t\t\tlink.joint = love.physics.newRevoluteJoint(link.body, prev.body, link.x, link.y - link.radius / 2)\n\t\t\t\tlink.join2 = love.physics.newRopeJoint(link.body, duckloon.body, link.x, link.y, x, y, link.y - y)\n\t\t\telse\n\t\t\t\tlink.joint = love.physics.newRevoluteJoint(link.body, duckloon.body, link.x, link.y)\n\t\t\tend\n\n\t\t\ttable.insert(self.links, link)\n\t\tend\n\n\tend\n\n\tfunction Chain:step()\n\t\tfor i, link in ipairs(self.links) do\n\t\t\tlink.state:save(link.body, g_step)\n\t\tend\n\tend\n\n\tfunction Chain:update(dt)\n\tend\n\n\tfunction Chain:draw()\n\t\tlocal rope = {}\n\n\t\tfor i, link in ipairs(self.links) do\n\t\t\tlocal x, y = link.state:get(g_t)\n\t\t\ttable.insert(rope, x)\n\t\t\ttable.insert(rope, y)\n\t\tend\n\n\t\tlove.graphics.setLineWidth(3)\n\t\tlove.graphics.setColor(1, 1, 1, 0.7)\n\t\tlove.graphics.line(rope)\n\n\t\tfor i, link in ipairs(self.links) do\n\t\t\tif link.info.img ~= nil then\n\t\t\t\tlocal x, y, r = link.state:get(g_t)\n\t\t\t\tlocal ox, oy = link.info.img:getWidth() / 2, link.info.img:getHeight() / 2\n\t\t\t\tlove.graphics.setColor(1, 1, 1)\n\t\t\t\tlove.graphics.draw(link.info.img, x, y, r, 1, 1, ox, oy)\n\t\t\tend\n\t\tend\n\n\t\tif DEBUG then\n\t\t\tfor i, link in ipairs(self.links) do\n\t\t\t\tlove.graphics.setColor(1, 0, 1)\n\t\t\t\tlocal x, y = link.body:getPosition()\n\t\t\t\tlove.graphics.circle(\"fill\", x, y, link.shape:getRadius())\n\t\t\tend\n\t\tend\n\tend\n\n\t-- Draws clouds in a repeating pattern of 1,2,3,4, but with\n\t-- an offset on each track.\n\tlocal CloudTrack = class(\"CloudTrack\")\n\n\t-- x,y: Top-left corner of cloud track.\n\tfunction CloudTrack:init(x, y, offset, speed, img)\n\t\tself.x = x\n\t\tself.y = y\n\t\tself.initial_offset = offset\n\t\tself.h_spacing = 50\n\t\tself.img = img\n\t\tself.w = self.h_spacing + self.img:getWidth()\n\t\tself.speed = speed -- px/s\n\t\tself.count = love.graphics.getWidth() / self.w + 2\n\t\tself.initial_img = love.math.random(1, 4)\n\tend\n\n\tfunction CloudTrack:update(dt)\n\tend\n\n\tfunction CloudTrack:draw()\n\t\tlocal abs_offset = (self.initial_offset + (self.speed * g_t))\n\t\tlocal offset = abs_offset % self.w\n\t\tlove.graphics.setColor(1, 1, 1, 0.3)\n\t\tfor i=1, self.count do\n\t\t\tlocal x = self.x + (i - 1) * (self.img:getWidth() + self.h_spacing) + offset - self.w\n\t\t\tlocal y = self.y\n\t\t\tlocal img_no =  math.floor(abs_offset / self.w)\n\t\t\tlove.graphics.draw(cloud_images[1 + (self.initial_img + i - img_no) % 4], x, y, -0.05)\n\t\tend\n\tend\n\n\tlocal Clouds = class(\"Clouds\")\n\n\tfunction Clouds:init()\n\t\tlocal layer_height = 100\n\n\t\tself.tracks = {}\n\t\tlocal max = (love.graphics.getHeight() / layer_height) + 1\n\t\tfor i=1, max do\n\t\t\ttable.insert(self.tracks, CloudTrack(0, 20 + (i - 1) * layer_height, img_cloud_1:getWidth() / 2 * i, 40, img_cloud_1))\n\t\tend\n\tend\n\n\tfunction Clouds:draw()\n\t\tfor i,track in ipairs(self.tracks) do\n\t\t\ttrack:draw()\n\t\tend\n\tend\n\n\t-- Called on resize.\n\tfunction create_world()\n\t\tlove.math.setRandomSeed(12345)\n\n\t\tlocal wx, wy = love.graphics.getDimensions()\n\t\tworld = love.physics.newWorld(0, 9.81*64)\n\t\tduckloon = Duckloon(world, wx / 2, wy / 2 - 100)\n\t\tlocal ax, ay = duckloon:attachment_point()\n\t\tchain = Chain(world, ax, ay, \"  n o # g a m e # \", duckloon)\n\t\tclouds = Clouds()\n\n\t\tg_objs = {\n\t\t\tchain,\n\t\t\tduckloon\n\t\t}\n\tend\n\n\tfunction love.load()\n\t\tlocal renderername = love.graphics.getRendererInfo()\n\t\tlove.window.setTitle(love.window.getTitle() .. \" - \" .. renderername)\n\n\t\tlove.graphics.setBackgroundColor(43/255, 165/255, 223/255)\n\t\tlove.physics.setMeter(64)\n\n\t\tlocal dpiscale = love.window.getDPIScale() > 1 and 2 or 1\n\t\tlocal settings = {dpiscale = dpiscale}\n\n\t\tR.chain.n = R.chain[dpiscale].n_png\n\t\tR.chain.o = R.chain[dpiscale].o_png\n\t\tR.chain.g = R.chain[dpiscale].g_png\n\t\tR.chain.a = R.chain[dpiscale].a_png\n\t\tR.chain.m = R.chain[dpiscale].m_png\n\t\tR.chain.e = R.chain[dpiscale].e_png\n\t\tR.chain.square = R.chain[dpiscale].square_png\n\t\tR.duckloon.blink = R.duckloon[dpiscale].blink_png\n\t\tR.duckloon.normal = R.duckloon[dpiscale].normal_png\n\t\tR.bg.cloud_1 = R.bg[dpiscale].cloud_1_png\n\t\tR.bg.cloud_2 = R.bg[dpiscale].cloud_2_png\n\t\tR.bg.cloud_3 = R.bg[dpiscale].cloud_3_png\n\t\tR.bg.cloud_4 = R.bg[dpiscale].cloud_4_png\n\n\t\timg_duckloon_normal = love.graphics.newTexture(R.duckloon.normal, settings)\n\t\timg_duckloon_blink = love.graphics.newTexture(R.duckloon.blink, settings)\n\n\t\timg_n = love.graphics.newTexture(R.chain.n, settings)\n\t\timg_o = love.graphics.newTexture(R.chain.o, settings)\n\t\timg_g = love.graphics.newTexture(R.chain.g, settings)\n\t\timg_a = love.graphics.newTexture(R.chain.a, settings)\n\t\timg_m = love.graphics.newTexture(R.chain.m, settings)\n\t\timg_e = love.graphics.newTexture(R.chain.e, settings)\n\t\timg_square = love.graphics.newTexture(R.chain.square, settings)\n\n\t\timg_cloud_1 = love.graphics.newTexture(R.bg.cloud_1, settings)\n\t\timg_cloud_2 = love.graphics.newTexture(R.bg.cloud_2, settings)\n\t\timg_cloud_3 = love.graphics.newTexture(R.bg.cloud_3, settings)\n\t\timg_cloud_4 = love.graphics.newTexture(R.bg.cloud_4, settings)\n\n\t\tcloud_images = {\n\t\t\timg_cloud_1,\n\t\t\timg_cloud_2,\n\t\t\timg_cloud_3,\n\t\t\timg_cloud_4,\n\t\t}\n\n\t\tcreate_world()\n\tend\n\n\tfunction love.update(dt)\n\t\tg_t = g_t + dt\n\n\t\twhile g_t > g_step do\n\t\t\tworld:update(STEP)\n\t\t\tg_step = g_step + STEP\n\t\t\tfor i,v in ipairs(g_objs) do\n\t\t\t\tv:step()\n\t\t\tend\n\t\t\tg_step_count = g_step_count + 1\n\t\tend\n\n\t\tfor i in ipairs(g_objs) do\n\t\t\tg_objs[i]:update(dt)\n\t\tend\n\tend\n\n\tfunction love.draw()\n\t\tclouds:draw()\n\n\t\tfor i in ipairs(g_objs) do\n\t\t\tg_objs[i]:draw()\n\t\tend\n\n\t\tif DEBUG then\n\t\t\tlove.graphics.setColor(0, 0, 0, 0.5)\n\t\t\tlove.graphics.print(\"FPS: \" .. love.timer.getFPS(), 50, 50)\n\t\t\tlove.graphics.print(\"Time: \" .. g_t, 50, 65)\n\t\t\tlove.graphics.print(\"g_step: \" .. g_step, 50, 80)\n\t\t\tlove.graphics.print(\"Frame: \" .. g_frame_count, 50, 95)\n\t\t\tlove.graphics.print(\"Step: \" .. g_step_count, 50, 110)\n\t\tend\n\n\t\tg_frame_count = g_frame_count + 1\n\tend\n\n\tfunction love.mousepressed(x, y, b, istouch, clicks)\n\t\t-- Double-tap the screen (when using a touch screen) to exit.\n\t\tif istouch and clicks == 2 then\n\t\t\tif love.window.showMessageBox(\"Exit No-Game Screen\", \"\", {\"OK\", \"Cancel\"}) == 1 then\n\t\t\t\tlove.event.quit()\n\t\t\tend\n\t\tend\n\tend\n\n\tfunction love.keypressed(key)\n\t\tif key == \"escape\" then\n\t\t\tlove.event.quit()\n\t\tend\n\tend\n\n\tfunction love.resize()\n\t\tcreate_world()\n\t\tg_step = g_t\n\tend\n\n\tfunction love.conf(t)\n\t\tt.title = \"L\\195\\150VE \" .. love._version .. \" (\" .. love._version_codename .. \")\"\n\t\tt.graphics.gammacorrect = true\n\t\tt.modules.audio = false\n\t\tt.modules.sound = false\n\t\tt.modules.joystick = false\n\t\tt.window.resizable = true\n\t\tt.highdpi = true\n\n\t\tif love._os == \"iOS\" then\n\t\t\tt.window.borderless = true\n\t\tend\n\tend\n\n\tfunction restartWithNewGame(path)\n\t\tlove.event.quit(\"restart\", {_noGameRestartInfo = {gamepath = path}})\n\tend\n\n\tfunction love.filedropped(file)\n\t\trestartWithNewGame(file:getFilename())\n\tend\n\n\tfunction love.directorydropped(path)\n\t\trestartWithNewGame(path)\n\tend\nend\n\nreturn love.nogame\n"
  },
  {
    "path": "src/scripts/nogame.lua.h",
    "content": "/**\n * Copyright (c) 2006-2026 LOVE Development Team\n * \n * This software is provided 'as-is', without any express or implied\n * warranty.  In no event will the authors be held liable for any damages\n * arising from the use of this software.\n * \n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n * \n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would be\n *    appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n *    misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n **/\n\nnamespace love\n{\n\n// [nogame.lua]\nconst unsigned char nogame_lua[] = \n{\n\n\t0x2d, 0x2d, 0x5b, 0x5b, 0x0a,\n\t0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x36, \n\t0x2d, 0x32, 0x30, 0x32, 0x34, 0x20, 0x4c, 0x4f, 0x56, 0x45, 0x20, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, \n\t0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x65, 0x61, 0x6d, 0x0a,\n\t0x0a,\n\t0x54, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x70, \n\t0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x27, 0x61, 0x73, 0x2d, 0x69, 0x73, 0x27, 0x2c, 0x20, 0x77, \n\t0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, \n\t0x20, 0x6f, 0x72, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x0a,\n\t0x77, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x74, 0x79, 0x2e, 0x20, 0x20, 0x49, 0x6e, 0x20, 0x6e, 0x6f, 0x20, 0x65, \n\t0x76, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, \n\t0x6f, 0x72, 0x73, 0x20, 0x62, 0x65, 0x20, 0x68, 0x65, 0x6c, 0x64, 0x20, 0x6c, 0x69, 0x61, 0x62, 0x6c, 0x65, \n\t0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x0a,\n\t0x61, 0x72, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, \n\t0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, \n\t0x65, 0x2e, 0x0a,\n\t0x0a,\n\t0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x67, 0x72, 0x61, 0x6e, \n\t0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x79, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x75, \n\t0x73, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x66, \n\t0x6f, 0x72, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x2c, 0x0a,\n\t0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x69, \n\t0x61, 0x6c, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x61, \n\t0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x69, 0x74, 0x20, 0x61, 0x6e, 0x64, \n\t0x20, 0x72, 0x65, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x69, 0x74, 0x0a,\n\t0x66, 0x72, 0x65, 0x65, 0x6c, 0x79, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x74, 0x6f, \n\t0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, \n\t0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x0a,\n\t0x0a,\n\t0x31, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, \n\t0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, \n\t0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, \n\t0x74, 0x65, 0x64, 0x3b, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x0a,\n\t0x20, 0x20, 0x20, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x79, 0x6f, 0x75, 0x20, \n\t0x77, 0x72, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, \n\t0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, \n\t0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2c, 0x20, 0x61, \n\t0x6e, 0x20, 0x61, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, \n\t0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x64, 0x6f, 0x63, 0x75, \n\t0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x61, 0x70, 0x70, 0x72, 0x65, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x75, 0x74, \n\t0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x2e, 0x0a,\n\t0x32, 0x2e, 0x20, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, \n\t0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x70, \n\t0x6c, 0x61, 0x69, 0x6e, 0x6c, 0x79, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x73, \n\t0x75, 0x63, 0x68, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, \n\t0x62, 0x65, 0x0a,\n\t0x20, 0x20, 0x20, 0x6d, 0x69, 0x73, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x20, \n\t0x61, 0x73, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, \n\t0x6e, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x0a,\n\t0x33, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x20, 0x6d, 0x61, 0x79, \n\t0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x6f, 0x72, \n\t0x20, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x6e, 0x79, 0x20, \n\t0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, \n\t0x6e, 0x2e, 0x0a,\n\t0x2d, 0x2d, 0x5d, 0x5d, 0x0a,\n\t0x0a,\n\t0x2d, 0x2d, 0x20, 0x4d, 0x61, 0x6b, 0x65, 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x20, \n\t0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x2e, 0x0a,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, \n\t0x72, 0x65, 0x28, 0x22, 0x6c, 0x6f, 0x76, 0x65, 0x22, 0x29, 0x0a,\n\t0x0a,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6e, 0x6f, 0x67, 0x61, \n\t0x6d, 0x65, 0x28, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x52, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x0a,\n\t0x09, 0x52, 0x2e, 0x62, 0x67, 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x31, 0x5d, 0x3d, 0x7b, 0x7d, 0x2c, 0x20, 0x5b, \n\t0x32, 0x5d, 0x3d, 0x7b, 0x7d, 0x7d, 0x0a,\n\t0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x31, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x62, 0x67, 0x5b, 0x31, 0x5d, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x31, 0x5f, 0x70, \n\t0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x65, 0x63, \n\t0x6f, 0x64, 0x65, 0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, \n\t0x34, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x4c, 0x45, 0x41, 0x41, 0x41, 0x42, 0x55, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x44, 0x4e, 0x6f, 0x4e, 0x62, 0x30, 0x41, 0x41, 0x41, 0x47, 0x71, 0x45, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x34, 0x6e, 0x4f, 0x33, 0x64, 0x65, 0x36, 0x77, 0x63, 0x56, 0x52, 0x30, 0x48, 0x38, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x6c, 0x4c, 0x32, 0x30, 0x62, 0x58, 0x31, 0x69, 0x49, 0x74, 0x46, 0x41, 0x4e, 0x56, 0x45, 0x45, \n\t0x6b, 0x70, 0x61, 0x69, 0x31, 0x74, 0x57, 0x42, 0x4a, 0x67, 0x36, 0x4a, 0x45, 0x6b, 0x78, 0x72, 0x77, 0x43, \n\t0x57, 0x72, 0x41, 0x6c, 0x45, 0x70, 0x4d, 0x4e, 0x64, 0x48, 0x59, 0x61, 0x44, 0x53, 0x70, 0x4a, 0x6a, 0x55, \n\t0x2b, 0x45, 0x6f, 0x30, 0x6d, 0x6d, 0x71, 0x42, 0x69, 0x2b, 0x6f, 0x64, 0x4b, 0x55, 0x75, 0x49, 0x44, 0x5c, 0x0a,\n\t0x09, 0x59, 0x34, 0x78, 0x45, 0x78, 0x46, 0x64, 0x6a, 0x68, 0x4a, 0x4a, 0x71, 0x52, 0x59, 0x4b, 0x43, 0x59, \n\t0x6b, 0x7a, 0x55, 0x50, 0x36, 0x52, 0x43, 0x65, 0x64, 0x57, 0x61, 0x6c, 0x6b, 0x76, 0x39, 0x34, 0x39, 0x77, \n\t0x6d, 0x7a, 0x65, 0x33, 0x4f, 0x33, 0x74, 0x33, 0x5a, 0x6d, 0x58, 0x4e, 0x6d, 0x37, 0x2f, 0x31, 0x39, 0x6b, \n\t0x76, 0x33, 0x6a, 0x37, 0x75, 0x37, 0x4d, 0x2b, 0x65, 0x32, 0x39, 0x33, 0x7a, 0x73, 0x37, 0x63, 0x32, 0x5c, 0x0a,\n\t0x09, 0x62, 0x4f, 0x6d, 0x59, 0x6c, 0x6a, 0x78, 0x34, 0x34, 0x4a, 0x59, 0x5a, 0x79, 0x64, 0x55, 0x72, 0x71, \n\t0x41, 0x45, 0x45, 0x59, 0x56, 0x49, 0x51, 0x35, 0x6a, 0x4c, 0x30, 0x49, 0x63, 0x78, 0x6c, 0x36, 0x45, 0x4f, \n\t0x49, 0x79, 0x39, 0x2b, 0x61, 0x55, 0x4c, 0x61, 0x4d, 0x69, 0x5a, 0x65, 0x41, 0x30, 0x75, 0x77, 0x43, 0x71, \n\t0x38, 0x47, 0x4d, 0x75, 0x77, 0x42, 0x45, 0x74, 0x50, 0x65, 0x4e, 0x39, 0x42, 0x50, 0x49, 0x52, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x34, 0x73, 0x2b, 0x34, 0x46, 0x33, 0x66, 0x69, 0x48, 0x6a, 0x79, 0x64, 0x73, 0x64, 0x37, 0x51, 0x6f, \n\t0x49, 0x6b, 0x78, 0x37, 0x5a, 0x30, 0x34, 0x42, 0x52, 0x76, 0x78, 0x4e, 0x72, 0x77, 0x65, 0x4b, 0x30, 0x64, \n\t0x63, 0x33, 0x30, 0x48, 0x38, 0x44, 0x4e, 0x2f, 0x48, 0x6a, 0x2f, 0x48, 0x45, 0x69, 0x4f, 0x73, 0x4c, 0x47, \n\t0x59, 0x31, 0x62, 0x69, 0x45, 0x2f, 0x48, 0x4e, 0x6c, 0x79, 0x48, 0x46, 0x37, 0x54, 0x55, 0x78, 0x70, 0x5c, 0x0a,\n\t0x09, 0x50, 0x59, 0x6a, 0x61, 0x39, 0x67, 0x66, 0x30, 0x74, 0x74, 0x6c, 0x4c, 0x51, 0x45, 0x46, 0x32, 0x49, \n\t0x46, 0x6e, 0x6f, 0x74, 0x6e, 0x34, 0x4c, 0x2f, 0x34, 0x44, 0x78, 0x36, 0x51, 0x76, 0x71, 0x47, 0x65, 0x4b, \n\t0x6c, 0x5a, 0x64, 0x44, 0x65, 0x4d, 0x53, 0x34, 0x72, 0x50, 0x77, 0x43, 0x62, 0x77, 0x62, 0x69, 0x7a, 0x4b, \n\t0x32, 0x65, 0x78, 0x74, 0x32, 0x59, 0x47, 0x2f, 0x47, 0x4e, 0x74, 0x74, 0x77, 0x72, 0x76, 0x53, 0x74, 0x5c, 0x0a,\n\t0x09, 0x64, 0x53, 0x58, 0x4f, 0x31, 0x2f, 0x39, 0x59, 0x36, 0x42, 0x44, 0x32, 0x34, 0x4c, 0x74, 0x54, 0x6a, \n\t0x38, 0x64, 0x61, 0x72, 0x32, 0x35, 0x45, 0x58, 0x51, 0x2f, 0x78, 0x59, 0x6d, 0x79, 0x66, 0x65, 0x6a, 0x79, \n\t0x7a, 0x59, 0x42, 0x32, 0x37, 0x38, 0x57, 0x48, 0x38, 0x71, 0x32, 0x41, 0x4e, 0x64, 0x61, 0x7a, 0x44, 0x4a, \n\t0x33, 0x46, 0x35, 0x7a, 0x65, 0x55, 0x50, 0x34, 0x55, 0x5a, 0x38, 0x58, 0x6a, 0x71, 0x57, 0x36, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x51, 0x75, 0x68, 0x2f, 0x68, 0x69, 0x66, 0x4e, 0x76, 0x6f, 0x2b, 0x37, 0x74, 0x4e, 0x65, 0x51, 0x49, \n\t0x66, 0x77, 0x64, 0x66, 0x52, 0x32, 0x56, 0x2f, 0x61, 0x6c, 0x4f, 0x66, 0x67, 0x53, 0x33, 0x68, 0x50, 0x51, \n\t0x2b, 0x74, 0x37, 0x46, 0x42, 0x2f, 0x44, 0x31, 0x33, 0x54, 0x77, 0x73, 0x33, 0x63, 0x78, 0x78, 0x50, 0x50, \n\t0x78, 0x4b, 0x58, 0x78, 0x55, 0x4e, 0x37, 0x73, 0x41, 0x66, 0x79, 0x6a, 0x74, 0x6b, 0x7a, 0x39, 0x53, 0x5c, 0x0a,\n\t0x09, 0x75, 0x70, 0x41, 0x4b, 0x47, 0x33, 0x41, 0x4c, 0x7a, 0x6d, 0x68, 0x68, 0x33, 0x54, 0x2f, 0x43, 0x75, \n\t0x33, 0x52, 0x73, 0x46, 0x36, 0x4e, 0x72, 0x49, 0x58, 0x36, 0x32, 0x39, 0x41, 0x64, 0x34, 0x58, 0x65, 0x6c, \n\t0x43, 0x5a, 0x76, 0x42, 0x33, 0x58, 0x49, 0x45, 0x2f, 0x46, 0x61, 0x35, 0x6a, 0x75, 0x71, 0x74, 0x77, 0x4d, \n\t0x78, 0x61, 0x30, 0x32, 0x4d, 0x59, 0x66, 0x38, 0x51, 0x59, 0x64, 0x32, 0x72, 0x58, 0x71, 0x55, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x68, 0x58, 0x53, 0x74, 0x31, 0x62, 0x35, 0x35, 0x63, 0x75, 0x5a, 0x45, 0x43, 0x50, 0x59, 0x7a, 0x4e, \n\t0x2b, 0x55, 0x62, 0x71, 0x51, 0x4b, 0x57, 0x2f, 0x43, 0x72, 0x66, 0x4a, 0x38, 0x65, 0x39, 0x32, 0x50, 0x53, \n\t0x33, 0x41, 0x67, 0x51, 0x31, 0x73, 0x7a, 0x36, 0x6b, 0x71, 0x49, 0x7a, 0x38, 0x45, 0x76, 0x73, 0x62, 0x78, \n\t0x77, 0x48, 0x63, 0x4d, 0x36, 0x6a, 0x44, 0x66, 0x69, 0x35, 0x7a, 0x57, 0x58, 0x6e, 0x38, 0x42, 0x71, 0x5c, 0x0a,\n\t0x09, 0x36, 0x5a, 0x74, 0x6e, 0x74, 0x66, 0x51, 0x50, 0x76, 0x46, 0x7a, 0x36, 0x52, 0x6c, 0x6f, 0x67, 0x64, \n\t0x58, 0x30, 0x39, 0x4a, 0x70, 0x32, 0x63, 0x32, 0x54, 0x2f, 0x31, 0x75, 0x41, 0x31, 0x2f, 0x6d, 0x37, 0x61, \n\t0x65, 0x31, 0x66, 0x69, 0x74, 0x76, 0x41, 0x65, 0x2f, 0x65, 0x37, 0x42, 0x4a, 0x42, 0x37, 0x72, 0x6a, 0x75, \n\t0x68, 0x44, 0x69, 0x46, 0x64, 0x49, 0x76, 0x35, 0x49, 0x57, 0x46, 0x36, 0x36, 0x6a, 0x72, 0x4d, 0x46, 0x5c, 0x0a,\n\t0x09, 0x36, 0x4c, 0x33, 0x77, 0x79, 0x78, 0x7a, 0x45, 0x70, 0x73, 0x6c, 0x51, 0x36, 0x38, 0x36, 0x75, 0x79, \n\t0x37, 0x33, 0x6f, 0x4e, 0x76, 0x34, 0x53, 0x62, 0x38, 0x44, 0x2f, 0x76, 0x77, 0x30, 0x68, 0x72, 0x72, 0x47, \n\t0x64, 0x56, 0x6e, 0x70, 0x51, 0x4f, 0x2b, 0x6f, 0x6b, 0x71, 0x48, 0x65, 0x4c, 0x45, 0x55, 0x34, 0x49, 0x74, \n\t0x4b, 0x46, 0x74, 0x47, 0x41, 0x52, 0x37, 0x46, 0x65, 0x4f, 0x6c, 0x48, 0x51, 0x7a, 0x31, 0x6e, 0x59, 0x5c, 0x0a,\n\t0x09, 0x69, 0x57, 0x75, 0x6b, 0x72, 0x66, 0x43, 0x6f, 0x6e, 0x70, 0x51, 0x43, 0x2f, 0x65, 0x6f, 0x47, 0x31, \n\t0x6c, 0x58, 0x48, 0x4a, 0x46, 0x36, 0x4f, 0x50, 0x78, 0x52, 0x71, 0x48, 0x2b, 0x56, 0x44, 0x66, 0x44, 0x50, \n\t0x65, 0x55, 0x62, 0x4b, 0x41, 0x42, 0x74, 0x32, 0x50, 0x74, 0x64, 0x4b, 0x2b, 0x38, 0x6e, 0x54, 0x7a, 0x70, \n\t0x4f, 0x36, 0x35, 0x48, 0x64, 0x49, 0x5a, 0x73, 0x74, 0x6e, 0x6b, 0x64, 0x6f, 0x55, 0x50, 0x78, 0x45, 0x5c, 0x0a,\n\t0x09, 0x75, 0x47, 0x2b, 0x50, 0x33, 0x53, 0x71, 0x64, 0x33, 0x5a, 0x35, 0x42, 0x62, 0x70, 0x7a, 0x4e, 0x69, \n\t0x4a, 0x7a, 0x70, 0x68, 0x36, 0x66, 0x6b, 0x50, 0x2b, 0x63, 0x72, 0x4a, 0x5a, 0x68, 0x37, 0x74, 0x4b, 0x4e, \n\t0x56, 0x36, 0x71, 0x48, 0x2f, 0x5a, 0x46, 0x2b, 0x46, 0x79, 0x68, 0x74, 0x74, 0x76, 0x30, 0x56, 0x72, 0x7a, \n\t0x7a, 0x68, 0x4a, 0x38, 0x76, 0x6b, 0x50, 0x36, 0x34, 0x73, 0x7a, 0x6e, 0x41, 0x63, 0x48, 0x33, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x78, 0x6b, 0x74, 0x73, 0x69, 0x53, 0x65, 0x6b, 0x6f, 0x2f, 0x6c, 0x4c, 0x63, 0x7a, 0x65, 0x63, 0x79, \n\t0x63, 0x50, 0x53, 0x70, 0x61, 0x44, 0x48, 0x44, 0x31, 0x69, 0x66, 0x56, 0x62, 0x61, 0x63, 0x4c, 0x42, 0x36, \n\t0x58, 0x4c, 0x6e, 0x30, 0x39, 0x55, 0x71, 0x4c, 0x78, 0x45, 0x6c, 0x76, 0x69, 0x71, 0x38, 0x7a, 0x65, 0x41, \n\t0x4d, 0x4f, 0x70, 0x55, 0x71, 0x2f, 0x42, 0x37, 0x65, 0x5a, 0x47, 0x67, 0x45, 0x6d, 0x66, 0x63, 0x32, 0x5c, 0x0a,\n\t0x09, 0x32, 0x70, 0x78, 0x6e, 0x4f, 0x48, 0x65, 0x41, 0x45, 0x2b, 0x6b, 0x37, 0x6e, 0x4e, 0x45, 0x74, 0x36, \n\t0x4d, 0x30, 0x30, 0x6f, 0x58, 0x6b, 0x64, 0x6d, 0x36, 0x55, 0x67, 0x33, 0x6e, 0x44, 0x76, 0x47, 0x31, 0x4f, \n\t0x44, 0x74, 0x7a, 0x6d, 0x79, 0x47, 0x50, 0x38, 0x30, 0x6f, 0x31, 0x6e, 0x44, 0x50, 0x45, 0x45, 0x2f, 0x68, \n\t0x67, 0x78, 0x76, 0x5a, 0x43, 0x58, 0x6d, 0x31, 0x63, 0x63, 0x44, 0x53, 0x51, 0x6e, 0x43, 0x47, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x56, 0x4a, 0x6d, 0x7a, 0x53, 0x69, 0x47, 0x50, 0x70, 0x54, 0x4f, 0x2f, 0x70, 0x52, 0x30, 0x35, 0x51, \n\t0x37, 0x77, 0x31, 0x59, 0x31, 0x73, 0x68, 0x76, 0x79, 0x62, 0x4f, 0x51, 0x4e, 0x61, 0x53, 0x4b, 0x38, 0x53, \n\t0x4c, 0x70, 0x4d, 0x76, 0x33, 0x77, 0x75, 0x79, 0x31, 0x51, 0x52, 0x6f, 0x35, 0x66, 0x6b, 0x6e, 0x75, 0x68, \n\t0x6e, 0x4f, 0x46, 0x65, 0x4a, 0x4f, 0x35, 0x30, 0x39, 0x30, 0x30, 0x6c, 0x37, 0x30, 0x4b, 0x76, 0x38, 0x5c, 0x0a,\n\t0x09, 0x59, 0x58, 0x70, 0x46, 0x50, 0x74, 0x57, 0x65, 0x51, 0x4b, 0x63, 0x57, 0x79, 0x46, 0x35, 0x35, 0x59, \n\t0x50, 0x53, 0x59, 0x4e, 0x4d, 0x73, 0x77, 0x51, 0x35, 0x56, 0x34, 0x69, 0x4c, 0x64, 0x59, 0x53, 0x48, 0x59, \n\t0x6a, 0x62, 0x6a, 0x79, 0x7a, 0x6b, 0x61, 0x79, 0x6e, 0x48, 0x61, 0x65, 0x61, 0x45, 0x30, 0x79, 0x48, 0x4a, \n\t0x68, 0x32, 0x77, 0x32, 0x46, 0x54, 0x72, 0x6f, 0x43, 0x50, 0x32, 0x6d, 0x7a, 0x67, 0x52, 0x78, 0x62, 0x5c, 0x0a,\n\t0x09, 0x34, 0x76, 0x4e, 0x45, 0x67, 0x4f, 0x65, 0x79, 0x4c, 0x32, 0x6f, 0x35, 0x5a, 0x7a, 0x6c, 0x43, 0x76, \n\t0x43, 0x4a, 0x44, 0x47, 0x36, 0x47, 0x37, 0x7a, 0x74, 0x58, 0x79, 0x39, 0x63, 0x59, 0x35, 0x51, 0x6e, 0x78, \n\t0x6d, 0x68, 0x6a, 0x5a, 0x43, 0x74, 0x37, 0x32, 0x6c, 0x7a, 0x5a, 0x57, 0x33, 0x4e, 0x53, 0x76, 0x6d, 0x38, \n\t0x36, 0x58, 0x4a, 0x54, 0x31, 0x34, 0x6d, 0x58, 0x51, 0x77, 0x54, 0x35, 0x72, 0x62, 0x4c, 0x70, 0x51, 0x5c, 0x0a,\n\t0x09, 0x47, 0x31, 0x64, 0x30, 0x70, 0x7a, 0x76, 0x6a, 0x57, 0x71, 0x79, 0x51, 0x4f, 0x37, 0x35, 0x62, 0x68, \n\t0x61, 0x47, 0x74, 0x6d, 0x77, 0x52, 0x73, 0x45, 0x7a, 0x4f, 0x4b, 0x48, 0x54, 0x37, 0x73, 0x49, 0x50, 0x73, \n\t0x45, 0x74, 0x44, 0x55, 0x32, 0x4d, 0x31, 0x45, 0x65, 0x4b, 0x58, 0x34, 0x4f, 0x4e, 0x34, 0x75, 0x33, 0x59, \n\t0x6e, 0x37, 0x51, 0x69, 0x7a, 0x79, 0x31, 0x46, 0x38, 0x42, 0x35, 0x2f, 0x47, 0x58, 0x30, 0x64, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x30, 0x53, 0x67, 0x68, 0x58, 0x69, 0x70, 0x4e, 0x4e, 0x2f, 0x55, 0x42, 0x73, 0x32, 0x65, 0x79, 0x37, \n\t0x70, 0x44, 0x66, 0x55, 0x61, 0x6b, 0x2f, 0x65, 0x59, 0x63, 0x30, 0x7a, 0x38, 0x62, 0x51, 0x36, 0x6f, 0x5a, \n\t0x34, 0x72, 0x66, 0x52, 0x66, 0x64, 0x45, 0x36, 0x64, 0x68, 0x55, 0x50, 0x6f, 0x34, 0x55, 0x46, 0x70, 0x56, \n\t0x33, 0x54, 0x66, 0x73, 0x41, 0x76, 0x57, 0x36, 0x5a, 0x32, 0x34, 0x52, 0x68, 0x6f, 0x37, 0x46, 0x67, 0x5c, 0x0a,\n\t0x09, 0x45, 0x4f, 0x54, 0x54, 0x70, 0x62, 0x6d, 0x6f, 0x44, 0x6d, 0x36, 0x6d, 0x45, 0x58, 0x48, 0x44, 0x62, \n\t0x45, 0x4e, 0x30, 0x67, 0x7a, 0x7a, 0x38, 0x54, 0x4a, 0x69, 0x39, 0x43, 0x47, 0x52, 0x64, 0x4a, 0x30, 0x76, \n\t0x74, 0x75, 0x47, 0x57, 0x57, 0x69, 0x59, 0x33, 0x59, 0x6b, 0x74, 0x30, 0x74, 0x79, 0x38, 0x49, 0x65, 0x53, \n\t0x77, 0x52, 0x52, 0x70, 0x77, 0x4f, 0x36, 0x4e, 0x42, 0x51, 0x37, 0x77, 0x4a, 0x50, 0x35, 0x58, 0x78, 0x5c, 0x0a,\n\t0x09, 0x38, 0x72, 0x6f, 0x77, 0x35, 0x7a, 0x32, 0x4e, 0x79, 0x77, 0x77, 0x77, 0x36, 0x2b, 0x67, 0x67, 0x49, \n\t0x56, 0x36, 0x47, 0x2b, 0x36, 0x51, 0x54, 0x47, 0x43, 0x48, 0x6b, 0x39, 0x4a, 0x41, 0x30, 0x41, 0x55, 0x33, \n\t0x66, 0x2f, 0x75, 0x52, 0x42, 0x39, 0x6f, 0x6c, 0x76, 0x46, 0x41, 0x45, 0x4f, 0x5a, 0x5a, 0x79, 0x47, 0x72, \n\t0x38, 0x37, 0x30, 0x70, 0x70, 0x6d, 0x32, 0x78, 0x4a, 0x74, 0x77, 0x52, 0x31, 0x4d, 0x56, 0x68, 0x56, 0x5c, 0x0a,\n\t0x09, 0x44, 0x54, 0x5a, 0x66, 0x72, 0x6b, 0x63, 0x4b, 0x59, 0x51, 0x33, 0x34, 0x31, 0x58, 0x4e, 0x46, 0x31, \n\t0x52, 0x43, 0x45, 0x4f, 0x36, 0x57, 0x35, 0x2b, 0x42, 0x46, 0x66, 0x31, 0x32, 0x4a, 0x7a, 0x61, 0x4b, 0x41, \n\t0x49, 0x64, 0x75, 0x65, 0x4b, 0x57, 0x55, 0x78, 0x35, 0x37, 0x36, 0x68, 0x66, 0x69, 0x47, 0x35, 0x6d, 0x73, \n\t0x4a, 0x6f, 0x62, 0x62, 0x33, 0x56, 0x62, 0x31, 0x51, 0x74, 0x54, 0x75, 0x78, 0x57, 0x44, 0x6f, 0x69, 0x5c, 0x0a,\n\t0x09, 0x58, 0x4e, 0x4a, 0x57, 0x52, 0x53, 0x45, 0x4d, 0x36, 0x5a, 0x44, 0x55, 0x55, 0x33, 0x5a, 0x34, 0x2b, \n\t0x67, 0x74, 0x56, 0x57, 0x2b, 0x4b, 0x4e, 0x49, 0x73, 0x43, 0x68, 0x57, 0x35, 0x5a, 0x49, 0x48, 0x51, 0x30, \n\t0x6e, 0x36, 0x52, 0x66, 0x69, 0x45, 0x4c, 0x72, 0x6d, 0x34, 0x6c, 0x35, 0x50, 0x56, 0x6f, 0x58, 0x34, 0x77, \n\t0x68, 0x59, 0x4c, 0x43, 0x61, 0x47, 0x75, 0x4e, 0x62, 0x32, 0x65, 0x72, 0x41, 0x72, 0x78, 0x71, 0x68, 0x5c, 0x0a,\n\t0x09, 0x59, 0x4c, 0x43, 0x61, 0x47, 0x75, 0x6e, 0x72, 0x6d, 0x73, 0x43, 0x76, 0x48, 0x70, 0x4c, 0x52, 0x59, \n\t0x53, 0x51, 0x6c, 0x30, 0x39, 0x63, 0x31, 0x6e, 0x56, 0x4f, 0x31, 0x48, 0x38, 0x44, 0x6f, 0x30, 0x68, 0x56, \n\t0x44, 0x68, 0x70, 0x37, 0x47, 0x59, 0x58, 0x37, 0x32, 0x49, 0x66, 0x77, 0x6c, 0x43, 0x71, 0x51, 0x6e, 0x78, \n\t0x53, 0x58, 0x31, 0x77, 0x49, 0x48, 0x64, 0x41, 0x7a, 0x6c, 0x31, 0x55, 0x68, 0x50, 0x74, 0x68, 0x69, 0x5c, 0x0a,\n\t0x09, 0x49, 0x53, 0x48, 0x55, 0x31, 0x54, 0x4f, 0x58, 0x56, 0x53, 0x46, 0x2b, 0x6f, 0x4d, 0x56, 0x43, 0x51, \n\t0x71, 0x69, 0x72, 0x5a, 0x79, 0x36, 0x72, 0x51, 0x6e, 0x78, 0x66, 0x69, 0x34, 0x57, 0x45, 0x55, 0x46, 0x66, \n\t0x50, 0x58, 0x46, 0x61, 0x46, 0x65, 0x45, 0x2b, 0x4c, 0x68, 0x59, 0x52, 0x51, 0x56, 0x38, 0x39, 0x63, 0x56, \n\t0x6e, 0x57, 0x78, 0x4c, 0x63, 0x4f, 0x2f, 0x78, 0x56, 0x52, 0x55, 0x6f, 0x54, 0x75, 0x4f, 0x53, 0x66, 0x5c, 0x0a,\n\t0x09, 0x33, 0x45, 0x42, 0x36, 0x61, 0x2f, 0x55, 0x4c, 0x55, 0x6c, 0x50, 0x69, 0x42, 0x47, 0x64, 0x49, 0x52, \n\t0x75, 0x75, 0x55, 0x4f, 0x50, 0x41, 0x4e, 0x4f, 0x2f, 0x6e, 0x33, 0x68, 0x58, 0x4f, 0x37, 0x57, 0x45, 0x55, \n\t0x45, 0x74, 0x6c, 0x48, 0x76, 0x73, 0x4e, 0x54, 0x31, 0x6f, 0x6f, 0x54, 0x66, 0x51, 0x57, 0x38, 0x77, 0x75, \n\t0x48, 0x30, 0x76, 0x34, 0x68, 0x7a, 0x54, 0x68, 0x31, 0x70, 0x4e, 0x65, 0x4c, 0x2f, 0x62, 0x62, 0x45, 0x5c, 0x0a,\n\t0x09, 0x52, 0x37, 0x43, 0x7a, 0x6a, 0x59, 0x70, 0x43, 0x47, 0x4e, 0x4a, 0x4f, 0x46, 0x51, 0x46, 0x6d, 0x35, \n\t0x6f, 0x47, 0x69, 0x38, 0x37, 0x41, 0x58, 0x46, 0x7a, 0x56, 0x63, 0x56, 0x41, 0x69, 0x44, 0x2b, 0x70, 0x30, \n\t0x30, 0x53, 0x48, 0x53, 0x79, 0x36, 0x67, 0x30, 0x7a, 0x58, 0x54, 0x73, 0x78, 0x69, 0x65, 0x75, 0x6c, 0x36, \n\t0x54, 0x64, 0x44, 0x79, 0x4f, 0x32, 0x6f, 0x6c, 0x4c, 0x2f, 0x4b, 0x41, 0x44, 0x50, 0x59, 0x42, 0x55, 0x5c, 0x0a,\n\t0x09, 0x44, 0x37, 0x73, 0x4c, 0x32, 0x4a, 0x69, 0x6b, 0x49, 0x59, 0x30, 0x6e, 0x59, 0x44, 0x54, 0x50, 0x55, \n\t0x36, 0x36, 0x46, 0x78, 0x73, 0x45, 0x2f, 0x67, 0x47, 0x33, 0x6a, 0x74, 0x69, 0x55, 0x53, 0x45, 0x4d, 0x36, \n\t0x70, 0x76, 0x53, 0x70, 0x49, 0x49, 0x7a, 0x42, 0x6e, 0x53, 0x59, 0x57, 0x54, 0x48, 0x6e, 0x59, 0x54, 0x65, \n\t0x75, 0x72, 0x46, 0x39, 0x58, 0x43, 0x41, 0x50, 0x35, 0x6e, 0x6a, 0x54, 0x68, 0x64, 0x74, 0x2f, 0x64, 0x5c, 0x0a,\n\t0x09, 0x69, 0x4f, 0x4f, 0x47, 0x75, 0x5a, 0x35, 0x34, 0x63, 0x6d, 0x72, 0x46, 0x41, 0x30, 0x32, 0x33, 0x47, \n\t0x55, 0x4a, 0x4e, 0x4e, 0x78, 0x6b, 0x69, 0x77, 0x41, 0x78, 0x2f, 0x55, 0x66, 0x79, 0x6b, 0x74, 0x49, 0x6e, \n\t0x66, 0x70, 0x6b, 0x2b, 0x58, 0x52, 0x77, 0x67, 0x31, 0x48, 0x4a, 0x46, 0x79, 0x74, 0x63, 0x55, 0x51, 0x41, \n\t0x57, 0x61, 0x30, 0x47, 0x38, 0x2b, 0x73, 0x6b, 0x57, 0x62, 0x4d, 0x6a, 0x4a, 0x75, 0x50, 0x68, 0x31, 0x5c, 0x0a,\n\t0x09, 0x48, 0x74, 0x78, 0x56, 0x62, 0x73, 0x72, 0x37, 0x50, 0x77, 0x4b, 0x4d, 0x4f, 0x54, 0x66, 0x6f, 0x2f, \n\t0x31, 0x75, 0x45, 0x36, 0x36, 0x61, 0x55, 0x67, 0x49, 0x77, 0x33, 0x70, 0x51, 0x79, 0x73, 0x39, 0x36, 0x4e, \n\t0x51, 0x4e, 0x4d, 0x63, 0x7a, 0x64, 0x6a, 0x6e, 0x49, 0x2f, 0x4e, 0x75, 0x46, 0x61, 0x36, 0x6a, 0x32, 0x2f, \n\t0x63, 0x45, 0x69, 0x78, 0x55, 0x65, 0x55, 0x71, 0x36, 0x36, 0x38, 0x41, 0x75, 0x33, 0x44, 0x72, 0x31, 0x5c, 0x0a,\n\t0x09, 0x38, 0x30, 0x69, 0x61, 0x76, 0x4b, 0x50, 0x6f, 0x63, 0x63, 0x2b, 0x54, 0x5a, 0x68, 0x44, 0x61, 0x4b, \n\t0x4e, 0x30, 0x57, 0x64, 0x78, 0x56, 0x4f, 0x46, 0x64, 0x4e, 0x69, 0x7a, 0x55, 0x57, 0x48, 0x38, 0x44, 0x44, \n\t0x2b, 0x67, 0x6e, 0x76, 0x78, 0x71, 0x36, 0x6e, 0x48, 0x49, 0x30, 0x30, 0x32, 0x30, 0x6b, 0x61, 0x49, 0x51, \n\t0x38, 0x67, 0x71, 0x68, 0x75, 0x79, 0x48, 0x73, 0x52, 0x63, 0x68, 0x44, 0x6d, 0x4d, 0x76, 0x51, 0x68, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x47, 0x58, 0x6f, 0x51, 0x34, 0x6a, 0x4c, 0x33, 0x2f, 0x41, 0x34, 0x68, 0x74, 0x57, 0x49, 0x2f, \n\t0x72, 0x78, 0x59, 0x4c, 0x61, 0x41, 0x41, 0x41, 0x41, 0x41, 0x45, 0x6c, 0x46, 0x54, 0x6b, 0x53, 0x75, 0x51, \n\t0x6d, 0x43, 0x43, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x31, 0x40, 0x32, 0x78, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x62, 0x67, 0x5b, 0x32, 0x5d, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x31, 0x5f, 0x70, \n\t0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x65, 0x63, \n\t0x6f, 0x64, 0x65, 0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, \n\t0x34, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x57, 0x49, 0x41, 0x41, 0x41, 0x43, 0x6f, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x44, 0x61, 0x57, 0x4f, 0x51, 0x63, 0x41, 0x41, 0x41, 0x4f, 0x45, 0x45, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x34, 0x6e, 0x4f, 0x33, 0x64, 0x65, 0x62, 0x51, 0x66, 0x5a, 0x58, 0x33, 0x48, 0x38, 0x66, 0x5c, 0x0a,\n\t0x09, 0x63, 0x6c, 0x34, 0x53, 0x5a, 0x6b, 0x49, 0x54, 0x6b, 0x6d, 0x73, 0x68, 0x6d, 0x77, 0x49, 0x59, 0x67, \n\t0x42, 0x54, 0x56, 0x67, 0x4c, 0x5a, 0x52, 0x4d, 0x77, 0x42, 0x69, 0x77, 0x75, 0x4f, 0x61, 0x43, 0x43, 0x71, \n\t0x43, 0x69, 0x67, 0x34, 0x69, 0x6c, 0x6c, 0x71, 0x32, 0x4b, 0x4c, 0x32, 0x78, 0x2b, 0x65, 0x74, 0x6d, 0x71, \n\t0x74, 0x57, 0x46, 0x63, 0x71, 0x69, 0x72, 0x47, 0x6c, 0x4c, 0x6c, 0x58, 0x63, 0x44, 0x6e, 0x67, 0x45, 0x5c, 0x0a,\n\t0x09, 0x42, 0x62, 0x48, 0x55, 0x4b, 0x45, 0x4b, 0x68, 0x4b, 0x6b, 0x49, 0x4c, 0x46, 0x52, 0x4f, 0x32, 0x59, \n\t0x70, 0x45, 0x6b, 0x45, 0x69, 0x47, 0x51, 0x51, 0x4c, 0x6a, 0x70, 0x48, 0x39, 0x38, 0x62, 0x45, 0x76, 0x41, \n\t0x6d, 0x6d, 0x5a, 0x6e, 0x66, 0x7a, 0x44, 0x79, 0x7a, 0x76, 0x46, 0x2f, 0x6e, 0x33, 0x48, 0x4e, 0x7a, 0x59, \n\t0x47, 0x61, 0x65, 0x4c, 0x77, 0x6e, 0x35, 0x2f, 0x4a, 0x37, 0x37, 0x7a, 0x4c, 0x4d, 0x4d, 0x72, 0x56, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x2f, 0x48, 0x6b, 0x6c, 0x53, 0x4f, 0x74, 0x75, 0x6b, 0x4c, 0x6b, 0x43, 0x53, 0x2b, 0x73, 0x34, \n\t0x67, 0x6c, 0x71, 0x54, 0x45, 0x44, 0x47, 0x4a, 0x4a, 0x53, 0x73, 0x77, 0x67, 0x6c, 0x71, 0x54, 0x45, 0x44, \n\t0x47, 0x4a, 0x4a, 0x53, 0x73, 0x77, 0x67, 0x6c, 0x71, 0x54, 0x45, 0x44, 0x47, 0x4a, 0x4a, 0x53, 0x73, 0x77, \n\t0x67, 0x6c, 0x71, 0x54, 0x45, 0x44, 0x47, 0x4a, 0x4a, 0x53, 0x6d, 0x78, 0x38, 0x36, 0x67, 0x4b, 0x30, 0x5c, 0x0a,\n\t0x09, 0x57, 0x65, 0x4f, 0x41, 0x33, 0x59, 0x46, 0x35, 0x77, 0x42, 0x2b, 0x4e, 0x66, 0x75, 0x30, 0x47, 0x37, \n\t0x41, 0x67, 0x38, 0x61, 0x2f, 0x52, 0x72, 0x4d, 0x72, 0x44, 0x64, 0x4d, 0x2b, 0x37, 0x37, 0x50, 0x66, 0x44, \n\t0x6b, 0x36, 0x50, 0x65, 0x56, 0x77, 0x50, 0x33, 0x41, 0x2f, 0x34, 0x35, 0x2b, 0x33, 0x51, 0x50, 0x63, 0x4e, \n\t0x76, 0x72, 0x31, 0x61, 0x4d, 0x58, 0x31, 0x53, 0x38, 0x70, 0x6f, 0x79, 0x43, 0x58, 0x4f, 0x6a, 0x62, 0x5c, 0x0a,\n\t0x09, 0x45, 0x48, 0x63, 0x43, 0x6a, 0x77, 0x4a, 0x38, 0x44, 0x42, 0x77, 0x41, 0x75, 0x41, 0x43, 0x52, 0x57, \n\t0x31, 0x74, 0x52, 0x35, 0x59, 0x43, 0x76, 0x77, 0x53, 0x2b, 0x44, 0x47, 0x77, 0x42, 0x4c, 0x67, 0x4a, 0x57, \n\t0x46, 0x64, 0x52, 0x65, 0x35, 0x4b, 0x32, 0x77, 0x43, 0x42, 0x4f, 0x5a, 0x77, 0x72, 0x77, 0x55, 0x75, 0x42, \n\t0x59, 0x34, 0x42, 0x69, 0x69, 0x74, 0x35, 0x76, 0x53, 0x61, 0x69, 0x4b, 0x51, 0x72, 0x77, 0x61, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x43, 0x53, 0x78, 0x4c, 0x57, 0x34, 0x37, 0x55, 0x48, 0x77, 0x5a, 0x78, 0x76, 0x53, 0x59, 0x44, 0x78, \n\t0x77, 0x4f, 0x76, 0x49, 0x63, 0x4a, 0x33, 0x59, 0x74, 0x70, 0x79, 0x74, 0x75, 0x67, 0x58, 0x52, 0x43, 0x42, \n\t0x2f, 0x46, 0x62, 0x67, 0x6a, 0x63, 0x53, 0x31, 0x53, 0x70, 0x78, 0x6e, 0x45, 0x39, 0x54, 0x67, 0x45, 0x65, \n\t0x44, 0x4e, 0x77, 0x49, 0x6a, 0x41, 0x31, 0x63, 0x53, 0x31, 0x46, 0x4c, 0x41, 0x45, 0x2b, 0x42, 0x33, 0x5c, 0x0a,\n\t0x09, 0x77, 0x64, 0x78, 0x35, 0x61, 0x6c, 0x30, 0x68, 0x6e, 0x45, 0x31, 0x52, 0x6b, 0x47, 0x54, 0x67, 0x4c, \n\t0x4f, 0x41, 0x2f, 0x5a, 0x50, 0x58, 0x45, 0x74, 0x5a, 0x56, 0x67, 0x47, 0x4c, 0x67, 0x59, 0x38, 0x52, 0x4c, \n\t0x2f, 0x37, 0x55, 0x66, 0x4e, 0x73, 0x53, 0x4c, 0x33, 0x78, 0x66, 0x43, 0x4d, 0x77, 0x6c, 0x58, 0x76, 0x72, \n\t0x75, 0x52, 0x4c, 0x7a, 0x73, 0x6e, 0x55, 0x54, 0x38, 0x66, 0x77, 0x72, 0x77, 0x43, 0x50, 0x41, 0x51, 0x5c, 0x0a,\n\t0x09, 0x38, 0x46, 0x76, 0x67, 0x62, 0x75, 0x42, 0x4f, 0x34, 0x68, 0x33, 0x43, 0x7a, 0x34, 0x43, 0x48, 0x61, \n\t0x36, 0x32, 0x34, 0x68, 0x77, 0x7a, 0x69, 0x38, 0x6d, 0x30, 0x48, 0x6e, 0x41, 0x47, 0x38, 0x41, 0x39, 0x67, \n\t0x31, 0x63, 0x53, 0x31, 0x56, 0x65, 0x51, 0x4c, 0x34, 0x49, 0x76, 0x42, 0x68, 0x34, 0x50, 0x62, 0x45, 0x74, \n\t0x65, 0x67, 0x50, 0x76, 0x52, 0x42, 0x59, 0x42, 0x4c, 0x79, 0x45, 0x65, 0x50, 0x48, 0x37, 0x7a, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x31, 0x65, 0x59, 0x77, 0x51, 0x67, 0x58, 0x77, 0x74, 0x38, 0x46, 0x33, 0x67, 0x4f, 0x75, 0x4c, \n\t0x50, 0x58, 0x79, 0x55, 0x79, 0x69, 0x4d, 0x73, 0x7a, 0x48, 0x6e, 0x67, 0x62, 0x38, 0x46, 0x36, 0x69, 0x78, \n\t0x39, 0x45, 0x48, 0x36, 0x34, 0x47, 0x76, 0x41, 0x4f, 0x38, 0x42, 0x37, 0x6b, 0x70, 0x62, 0x53, 0x75, 0x2f, \n\t0x4e, 0x41, 0x6b, 0x34, 0x46, 0x33, 0x6b, 0x54, 0x4d, 0x77, 0x4b, 0x6e, 0x4b, 0x43, 0x75, 0x41, 0x79, 0x5c, 0x0a,\n\t0x09, 0x34, 0x42, 0x4c, 0x67, 0x35, 0x67, 0x72, 0x62, 0x36, 0x52, 0x57, 0x44, 0x75, 0x42, 0x7a, 0x48, 0x41, \n\t0x33, 0x38, 0x48, 0x50, 0x43, 0x39, 0x31, 0x49, 0x59, 0x6d, 0x73, 0x42, 0x54, 0x34, 0x42, 0x66, 0x49, 0x44, \n\t0x34, 0x38, 0x56, 0x62, 0x31, 0x4f, 0x52, 0x41, 0x34, 0x48, 0x33, 0x67, 0x31, 0x4d, 0x66, 0x65, 0x38, 0x54, \n\t0x6a, 0x63, 0x41, 0x46, 0x77, 0x4c, 0x66, 0x49, 0x48, 0x72, 0x4f, 0x4b, 0x73, 0x67, 0x67, 0x48, 0x73, 0x5c, 0x0a,\n\t0x09, 0x77, 0x63, 0x34, 0x46, 0x50, 0x45, 0x4e, 0x44, 0x54, 0x42, 0x63, 0x75, 0x43, 0x64, 0x77, 0x44, 0x38, \n\t0x6c, 0x72, 0x71, 0x4d, 0x50, 0x39, 0x69, 0x59, 0x2b, 0x2b, 0x42, 0x61, 0x6c, 0x4c, 0x6f, 0x52, 0x59, 0x49, \n\t0x50, 0x51, 0x75, 0x34, 0x49, 0x72, 0x55, 0x68, 0x62, 0x53, 0x56, 0x51, 0x56, 0x7a, 0x4d, 0x4f, 0x4f, 0x41, \n\t0x43, 0x34, 0x48, 0x31, 0x55, 0x74, 0x2b, 0x69, 0x69, 0x7a, 0x61, 0x34, 0x6d, 0x68, 0x6d, 0x6d, 0x63, 0x5c, 0x0a,\n\t0x09, 0x69, 0x31, 0x79, 0x2b, 0x71, 0x63, 0x42, 0x66, 0x41, 0x32, 0x64, 0x52, 0x66, 0x77, 0x39, 0x34, 0x61, \n\t0x36, 0x34, 0x42, 0x7a, 0x67, 0x52, 0x2b, 0x6c, 0x62, 0x71, 0x51, 0x74, 0x6a, 0x47, 0x49, 0x38, 0x35, 0x74, \n\t0x4c, 0x39, 0x50, 0x67, 0x4f, 0x54, 0x6c, 0x78, 0x48, 0x30, 0x36, 0x30, 0x47, 0x33, 0x67, 0x31, 0x38, 0x6b, \n\t0x68, 0x68, 0x4c, 0x31, 0x75, 0x41, 0x57, 0x41, 0x6c, 0x38, 0x41, 0x6e, 0x70, 0x4f, 0x36, 0x6b, 0x43, 0x5c, 0x0a,\n\t0x09, 0x31, 0x59, 0x53, 0x37, 0x77, 0x6e, 0x2b, 0x53, 0x67, 0x4f, 0x56, 0x32, 0x52, 0x6d, 0x45, 0x4f, 0x66, \n\t0x7a, 0x46, 0x69, 0x4a, 0x59, 0x6d, 0x72, 0x77, 0x51, 0x6f, 0x32, 0x6d, 0x2b, 0x51, 0x37, 0x78, 0x41, 0x57, \n\t0x70, 0x6d, 0x36, 0x6b, 0x42, 0x59, 0x62, 0x44, 0x33, 0x79, 0x49, 0x6d, 0x49, 0x6e, 0x54, 0x46, 0x6a, 0x38, \n\t0x45, 0x58, 0x67, 0x66, 0x38, 0x58, 0x2b, 0x70, 0x43, 0x32, 0x73, 0x41, 0x67, 0x7a, 0x6d, 0x59, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x38, 0x46, 0x6e, 0x67, 0x35, 0x4e, 0x53, 0x46, 0x74, 0x4e, 0x52, 0x39, 0x78, 0x4f, 0x2f, 0x64, 0x6b, \n\t0x74, 0x53, 0x46, 0x74, 0x4e, 0x41, 0x4d, 0x59, 0x69, 0x48, 0x4e, 0x55, 0x59, 0x6e, 0x72, 0x4b, 0x4f, 0x49, \n\t0x33, 0x78, 0x49, 0x76, 0x73, 0x47, 0x31, 0x49, 0x58, 0x30, 0x6e, 0x51, 0x47, 0x38, 0x64, 0x62, 0x4e, 0x42, \n\t0x69, 0x34, 0x6e, 0x35, 0x6d, 0x61, 0x71, 0x75, 0x43, 0x65, 0x42, 0x63, 0x34, 0x46, 0x50, 0x70, 0x79, 0x5c, 0x0a,\n\t0x09, 0x36, 0x6b, 0x52, 0x65, 0x59, 0x41, 0x33, 0x78, 0x76, 0x39, 0x33, 0x6c, 0x61, 0x50, 0x41, 0x61, 0x63, \n\t0x51, 0x4d, 0x79, 0x75, 0x30, 0x47, 0x65, 0x35, 0x48, 0x76, 0x47, 0x55, 0x76, 0x49, 0x6e, 0x59, 0x6c, 0x4d, \n\t0x34, 0x51, 0x48, 0x4e, 0x34, 0x36, 0x59, 0x59, 0x66, 0x49, 0x4a, 0x6d, 0x76, 0x65, 0x53, 0x71, 0x59, 0x6e, \n\t0x6d, 0x45, 0x54, 0x39, 0x42, 0x74, 0x44, 0x6d, 0x45, 0x49, 0x52, 0x61, 0x54, 0x66, 0x41, 0x31, 0x34, 0x5c, 0x0a,\n\t0x09, 0x51, 0x2b, 0x70, 0x43, 0x6d, 0x73, 0x77, 0x65, 0x38, 0x65, 0x61, 0x64, 0x53, 0x4b, 0x77, 0x65, 0x32, \n\t0x7a, 0x5a, 0x31, 0x49, 0x52, 0x31, 0x30, 0x4a, 0x62, 0x48, 0x38, 0x32, 0x36, 0x57, 0x7a, 0x59, 0x39, 0x73, \n\t0x44, 0x75, 0x42, 0x36, 0x59, 0x6d, 0x62, 0x71, 0x51, 0x45, 0x6f, 0x30, 0x41, 0x62, 0x77, 0x53, 0x2b, 0x6c, \n\t0x4c, 0x71, 0x51, 0x4a, 0x6a, 0x4b, 0x49, 0x78, 0x33, 0x59, 0x75, 0x38, 0x41, 0x2f, 0x41, 0x55, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x70, 0x43, 0x4f, 0x75, 0x77, 0x6d, 0x34, 0x44, 0x6a, 0x67, 0x77, 0x64, 0x53, 0x46, 0x4e, 0x4d, 0x78, \n\t0x7a, 0x69, 0x44, 0x48, 0x56, 0x4a, 0x73, 0x2b, 0x4d, 0x4b, 0x47, 0x6f, 0x45, 0x65, 0x41, 0x57, 0x78, 0x56, \n\t0x46, 0x71, 0x62, 0x4d, 0x49, 0x6a, 0x2f, 0x30, 0x41, 0x58, 0x41, 0x42, 0x31, 0x4d, 0x58, 0x30, 0x52, 0x4f, \n\t0x33, 0x41, 0x69, 0x2b, 0x6d, 0x4f, 0x57, 0x45, 0x38, 0x41, 0x5a, 0x67, 0x50, 0x37, 0x41, 0x63, 0x38, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x2b, 0x69, 0x5a, 0x37, 0x6b, 0x79, 0x63, 0x69, 0x6a, 0x49, 0x4e, 0x32, 0x4a, 0x36, 0x4e, 0x48, \n\t0x38, 0x35, 0x72, 0x69, 0x50, 0x48, 0x50, 0x42, 0x34, 0x6d, 0x5a, 0x41, 0x66, 0x63, 0x43, 0x2f, 0x77, 0x50, \n\t0x38, 0x4e, 0x37, 0x46, 0x52, 0x7a, 0x70, 0x30, 0x46, 0x32, 0x70, 0x39, 0x45, 0x44, 0x45, 0x66, 0x73, 0x56, \n\t0x2f, 0x69, 0x2f, 0x6f, 0x50, 0x6c, 0x57, 0x41, 0x34, 0x63, 0x52, 0x32, 0x36, 0x78, 0x71, 0x6c, 0x45, 0x5c, 0x0a,\n\t0x09, 0x48, 0x38, 0x64, 0x49, 0x5a, 0x77, 0x2f, 0x56, 0x4b, 0x47, 0x38, 0x54, 0x6a, 0x67, 0x43, 0x47, 0x4a, \n\t0x2b, 0x37, 0x67, 0x4c, 0x67, 0x41, 0x4d, 0x6f, 0x37, 0x50, 0x6d, 0x77, 0x35, 0x38, 0x42, 0x50, 0x67, 0x4b, \n\t0x75, 0x4b, 0x46, 0x32, 0x39, 0x49, 0x4d, 0x39, 0x33, 0x77, 0x46, 0x65, 0x47, 0x31, 0x4a, 0x37, 0x54, 0x66, \n\t0x5a, 0x4d, 0x6d, 0x4a, 0x70, 0x74, 0x6c, 0x4d, 0x61, 0x52, 0x78, 0x6e, 0x45, 0x47, 0x35, 0x30, 0x44, 0x5c, 0x0a,\n\t0x09, 0x66, 0x44, 0x78, 0x31, 0x45, 0x54, 0x31, 0x31, 0x4b, 0x33, 0x41, 0x6b, 0x39, 0x66, 0x7a, 0x46, 0x48, \n\t0x41, 0x49, 0x4f, 0x4a, 0x2b, 0x59, 0x32, 0x4c, 0x36, 0x4b, 0x2b, 0x63, 0x64, 0x69, 0x66, 0x41, 0x2f, 0x39, \n\t0x4b, 0x6a, 0x4a, 0x48, 0x65, 0x4e, 0x38, 0x61, 0x2f, 0x66, 0x77, 0x75, 0x78, 0x35, 0x33, 0x4e, 0x66, 0x66, \n\t0x49, 0x50, 0x59, 0x48, 0x30, 0x4d, 0x59, 0x78, 0x42, 0x75, 0x63, 0x41, 0x6c, 0x79, 0x61, 0x75, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x69, 0x65, 0x75, 0x34, 0x48, 0x6f, 0x47, 0x56, 0x65, 0x31, 0x38, 0x66, 0x77, 0x55, 0x34, 0x48, 0x54, \n\t0x67, 0x62, 0x4b, 0x72, 0x64, 0x6e, 0x57, 0x78, 0x72, 0x52, 0x6f, 0x67, 0x39, 0x47, 0x54, 0x35, 0x46, 0x4c, \n\t0x41, 0x6d, 0x47, 0x6d, 0x43, 0x4a, 0x35, 0x4b, 0x7a, 0x45, 0x30, 0x30, 0x53, 0x65, 0x6e, 0x34, 0x62, 0x34, \n\t0x6b, 0x67, 0x45, 0x45, 0x4d, 0x38, 0x53, 0x50, 0x70, 0x6c, 0x54, 0x67, 0x37, 0x6f, 0x67, 0x6d, 0x75, 0x5c, 0x0a,\n\t0x09, 0x49, 0x42, 0x59, 0x41, 0x50, 0x46, 0x6e, 0x69, 0x4d, 0x36, 0x63, 0x54, 0x6d, 0x2f, 0x4f, 0x66, 0x52, \n\t0x34, 0x7a, 0x7a, 0x4e, 0x73, 0x6c, 0x2f, 0x73, 0x6e, 0x48, 0x66, 0x69, 0x41, 0x57, 0x4a, 0x61, 0x30, 0x6e, \n\t0x68, 0x64, 0x38, 0x42, 0x65, 0x77, 0x41, 0x4f, 0x70, 0x43, 0x30, 0x6d, 0x74, 0x37, 0x30, 0x45, 0x38, 0x6c, \n\t0x35, 0x67, 0x6d, 0x4e, 0x44, 0x31, 0x31, 0x49, 0x58, 0x72, 0x4b, 0x52, 0x79, 0x6c, 0x6e, 0x4b, 0x65, 0x5c, 0x0a,\n\t0x09, 0x38, 0x77, 0x30, 0x66, 0x74, 0x39, 0x48, 0x38, 0x30, 0x4c, 0x59, 0x47, 0x33, 0x30, 0x42, 0x65, 0x49, \n\t0x6e, 0x6c, 0x56, 0x37, 0x72, 0x63, 0x78, 0x42, 0x50, 0x41, 0x2f, 0x36, 0x44, 0x2f, 0x75, 0x34, 0x68, 0x33, \n\t0x47, 0x53, 0x76, 0x4a, 0x51, 0x34, 0x74, 0x4c, 0x65, 0x70, 0x6f, 0x34, 0x44, 0x50, 0x41, 0x6e, 0x75, 0x57, \n\t0x55, 0x6f, 0x77, 0x71, 0x74, 0x4a, 0x31, 0x36, 0x53, 0x2f, 0x69, 0x78, 0x31, 0x49, 0x53, 0x6e, 0x31, 0x5c, 0x0a,\n\t0x09, 0x64, 0x57, 0x58, 0x64, 0x45, 0x44, 0x45, 0x32, 0x5a, 0x51, 0x67, 0x33, 0x30, 0x32, 0x4a, 0x69, 0x47, \n\t0x6c, 0x6c, 0x65, 0x47, 0x2f, 0x59, 0x45, 0x75, 0x52, 0x5a, 0x44, 0x75, 0x43, 0x32, 0x47, 0x67, 0x50, 0x65, \n\t0x6e, 0x4c, 0x69, 0x4b, 0x31, 0x76, 0x76, 0x61, 0x49, 0x7a, 0x77, 0x66, 0x2b, 0x50, 0x6e, 0x55, 0x52, 0x32, \n\t0x71, 0x4b, 0x6c, 0x77, 0x4c, 0x35, 0x6b, 0x58, 0x33, 0x32, 0x33, 0x50, 0x39, 0x47, 0x4c, 0x54, 0x76, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x69, 0x54, 0x73, 0x58, 0x74, 0x41, 0x39, 0x79, 0x53, 0x75, 0x6f, 0x68, 0x55, 0x2b, 0x74, 0x67, \n\t0x6a, 0x33, 0x68, 0x66, 0x34, 0x32, 0x39, 0x52, 0x46, 0x61, 0x4b, 0x74, 0x32, 0x4a, 0x30, 0x36, 0x4c, 0x7a, \n\t0x75, 0x49, 0x30, 0x59, 0x71, 0x7a, 0x66, 0x45, 0x47, 0x36, 0x76, 0x4e, 0x6d, 0x33, 0x78, 0x57, 0x62, 0x71, \n\t0x2b, 0x39, 0x59, 0x67, 0x6e, 0x45, 0x6d, 0x2b, 0x71, 0x39, 0x30, 0x70, 0x64, 0x69, 0x44, 0x4a, 0x62, 0x5c, 0x0a,\n\t0x09, 0x52, 0x4f, 0x78, 0x2b, 0x4e, 0x35, 0x5a, 0x74, 0x69, 0x4a, 0x39, 0x73, 0x33, 0x6c, 0x35, 0x66, 0x4f, \n\t0x61, 0x72, 0x49, 0x47, 0x6d, 0x49, 0x56, 0x59, 0x79, 0x2f, 0x50, 0x50, 0x4f, 0x78, 0x62, 0x6a, 0x2f, 0x6a, \n\t0x39, 0x47, 0x4d, 0x4a, 0x74, 0x38, 0x33, 0x6c, 0x67, 0x68, 0x7a, 0x48, 0x2b, 0x2b, 0x54, 0x44, 0x77, 0x5a, \n\t0x51, 0x7a, 0x68, 0x72, 0x70, 0x68, 0x49, 0x50, 0x31, 0x59, 0x56, 0x6a, 0x71, 0x6c, 0x50, 0x51, 0x62, 0x5c, 0x0a,\n\t0x09, 0x77, 0x76, 0x50, 0x66, 0x2f, 0x78, 0x70, 0x36, 0x56, 0x6d, 0x45, 0x68, 0x73, 0x77, 0x62, 0x57, 0x71, \n\t0x59, 0x32, 0x43, 0x7a, 0x39, 0x70, 0x50, 0x72, 0x4c, 0x55, 0x59, 0x56, 0x36, 0x2b, 0x2b, 0x66, 0x5a, 0x6c, \n\t0x36, 0x47, 0x4a, 0x62, 0x59, 0x69, 0x56, 0x57, 0x77, 0x65, 0x6d, 0x4c, 0x6b, 0x53, 0x46, 0x48, 0x51, 0x56, \n\t0x63, 0x78, 0x38, 0x59, 0x51, 0x66, 0x6b, 0x58, 0x53, 0x61, 0x6c, 0x53, 0x46, 0x45, 0x65, 0x4b, 0x44, 0x5c, 0x0a,\n\t0x09, 0x39, 0x33, 0x65, 0x70, 0x43, 0x36, 0x6c, 0x62, 0x58, 0x33, 0x72, 0x45, 0x70, 0x32, 0x49, 0x49, 0x74, \n\t0x39, 0x32, 0x6e, 0x69, 0x64, 0x57, 0x50, 0x46, 0x32, 0x4d, 0x49, 0x64, 0x39, 0x55, 0x32, 0x78, 0x41, 0x5a, \n\t0x4d, 0x76, 0x64, 0x4f, 0x48, 0x48, 0x76, 0x46, 0x55, 0x34, 0x6e, 0x6a, 0x76, 0x48, 0x56, 0x4d, 0x58, 0x6f, \n\t0x6f, 0x48, 0x64, 0x68, 0x42, 0x2b, 0x6f, 0x58, 0x58, 0x63, 0x52, 0x38, 0x4f, 0x65, 0x70, 0x69, 0x36, 0x5c, 0x0a,\n\t0x09, 0x68, 0x62, 0x48, 0x33, 0x72, 0x45, 0x37, 0x38, 0x41, 0x51, 0x37, 0x67, 0x70, 0x44, 0x75, 0x50, 0x73, \n\t0x4f, 0x53, 0x56, 0x31, 0x41, 0x43, 0x6c, 0x33, 0x76, 0x45, 0x63, 0x38, 0x6b, 0x4e, 0x75, 0x68, 0x32, 0x72, \n\t0x77, 0x47, 0x70, 0x48, 0x52, 0x34, 0x48, 0x4a, 0x67, 0x50, 0x72, 0x55, 0x68, 0x64, 0x53, 0x70, 0x36, 0x37, \n\t0x33, 0x69, 0x4d, 0x2f, 0x48, 0x45, 0x4a, 0x62, 0x61, 0x5a, 0x4a, 0x68, 0x59, 0x7a, 0x4e, 0x4d, 0x72, 0x5c, 0x0a,\n\t0x09, 0x58, 0x51, 0x37, 0x69, 0x61, 0x63, 0x43, 0x5a, 0x71, 0x59, 0x75, 0x51, 0x6c, 0x4a, 0x74, 0x42, 0x33, \n\t0x43, 0x46, 0x6e, 0x45, 0x43, 0x2f, 0x71, 0x4a, 0x4c, 0x56, 0x4c, 0x46, 0x77, 0x39, 0x4f, 0x33, 0x61, 0x4b, \n\t0x75, 0x42, 0x76, 0x46, 0x34, 0x34, 0x75, 0x67, 0x6a, 0x53, 0x65, 0x30, 0x7a, 0x49, 0x33, 0x55, 0x42, 0x64, \n\t0x65, 0x74, 0x71, 0x45, 0x4c, 0x38, 0x63, 0x6d, 0x4a, 0x57, 0x36, 0x43, 0x45, 0x6d, 0x46, 0x39, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x33, 0x49, 0x71, 0x4d, 0x34, 0x47, 0x38, 0x52, 0x6d, 0x70, 0x43, 0x35, 0x42, 0x55, 0x32, 0x4d, 0x54, \n\t0x55, 0x42, 0x64, 0x53, 0x74, 0x69, 0x30, 0x47, 0x38, 0x4b, 0x2f, 0x44, 0x53, 0x31, 0x45, 0x56, 0x49, 0x4b, \n\t0x6d, 0x78, 0x4e, 0x36, 0x67, 0x4c, 0x71, 0x31, 0x73, 0x55, 0x67, 0x50, 0x70, 0x48, 0x59, 0x39, 0x56, 0x39, \n\t0x53, 0x4f, 0x77, 0x32, 0x6e, 0x4c, 0x71, 0x42, 0x75, 0x58, 0x51, 0x7a, 0x69, 0x6b, 0x31, 0x4d, 0x58, 0x5c, 0x0a,\n\t0x09, 0x49, 0x47, 0x6b, 0x67, 0x37, 0x79, 0x49, 0x32, 0x36, 0x65, 0x72, 0x4e, 0x6e, 0x69, 0x4a, 0x64, 0x57, \n\t0x31, 0x6b, 0x33, 0x6d, 0x7a, 0x68, 0x69, 0x52, 0x31, 0x49, 0x33, 0x2f, 0x44, 0x75, 0x78, 0x48, 0x75, 0x43, \n\t0x32, 0x31, 0x49, 0x56, 0x55, 0x71, 0x57, 0x73, 0x39, 0x34, 0x70, 0x65, 0x6e, 0x4c, 0x6b, 0x42, 0x53, 0x71, \n\t0x56, 0x35, 0x45, 0x6e, 0x4b, 0x72, 0x7a, 0x54, 0x6a, 0x6f, 0x38, 0x35, 0x4e, 0x69, 0x31, 0x49, 0x44, 0x5c, 0x0a,\n\t0x09, 0x34, 0x75, 0x64, 0x51, 0x47, 0x53, 0x53, 0x6a, 0x63, 0x4d, 0x66, 0x42, 0x6a, 0x34, 0x46, 0x68, 0x32, \n\t0x64, 0x32, 0x74, 0x61, 0x6c, 0x6f, 0x59, 0x6d, 0x4a, 0x78, 0x49, 0x62, 0x53, 0x76, 0x5a, 0x76, 0x36, 0x49, \n\t0x76, 0x58, 0x49, 0x6a, 0x63, 0x41, 0x78, 0x77, 0x4b, 0x72, 0x55, 0x68, 0x5a, 0x53, 0x70, 0x53, 0x7a, 0x33, \n\t0x69, 0x41, 0x7a, 0x47, 0x45, 0x70, 0x61, 0x34, 0x37, 0x43, 0x50, 0x67, 0x2b, 0x73, 0x48, 0x33, 0x71, 0x5c, 0x0a,\n\t0x09, 0x51, 0x73, 0x72, 0x55, 0x70, 0x53, 0x41, 0x2b, 0x49, 0x6e, 0x55, 0x42, 0x6b, 0x6d, 0x70, 0x78, 0x45, \n\t0x48, 0x46, 0x63, 0x31, 0x72, 0x6a, 0x55, 0x68, 0x5a, 0x53, 0x6c, 0x53, 0x30, 0x46, 0x38, 0x65, 0x4f, 0x6f, \n\t0x43, 0x4a, 0x4e, 0x56, 0x6d, 0x49, 0x66, 0x41, 0x33, 0x71, 0x59, 0x73, 0x6f, 0x53, 0x35, 0x66, 0x47, 0x69, \n\t0x4f, 0x38, 0x48, 0x64, 0x6b, 0x35, 0x64, 0x68, 0x4b, 0x54, 0x61, 0x72, 0x41, 0x65, 0x4f, 0x42, 0x48, 0x5c, 0x0a,\n\t0x09, 0x36, 0x55, 0x75, 0x70, 0x42, 0x42, 0x64, 0x53, 0x57, 0x49, 0x64, 0x77, 0x41, 0x65, 0x53, 0x46, 0x32, \n\t0x45, 0x70, 0x4e, 0x72, 0x64, 0x44, 0x73, 0x77, 0x48, 0x6e, 0x6b, 0x68, 0x64, 0x79, 0x43, 0x43, 0x36, 0x4d, \n\t0x6a, 0x51, 0x78, 0x50, 0x33, 0x55, 0x42, 0x6b, 0x70, 0x4b, 0x59, 0x53, 0x77, 0x63, 0x4f, 0x67, 0x4f, 0x68, \n\t0x4b, 0x45, 0x4f, 0x2b, 0x5a, 0x75, 0x67, 0x42, 0x4a, 0x79, 0x56, 0x78, 0x41, 0x79, 0x2f, 0x65, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x36, 0x45, 0x6f, 0x51, 0x7a, 0x30, 0x6c, 0x64, 0x67, 0x4b, 0x52, 0x6b, 0x64, 0x67, 0x4a, 0x4f, 0x53, \n\t0x6c, 0x33, 0x45, 0x49, 0x4c, 0x6f, 0x53, 0x78, 0x4c, 0x30, 0x37, 0x34, 0x30, 0x72, 0x53, 0x30, 0x35, 0x79, \n\t0x57, 0x75, 0x6f, 0x42, 0x42, 0x64, 0x43, 0x57, 0x49, 0x6e, 0x53, 0x30, 0x68, 0x39, 0x64, 0x74, 0x52, 0x78, \n\t0x45, 0x76, 0x37, 0x56, 0x75, 0x70, 0x4b, 0x45, 0x4f, 0x2b, 0x59, 0x75, 0x67, 0x42, 0x4a, 0x53, 0x51, 0x5c, 0x0a,\n\t0x09, 0x30, 0x42, 0x78, 0x36, 0x59, 0x75, 0x6f, 0x71, 0x69, 0x32, 0x42, 0x2f, 0x45, 0x55, 0x59, 0x73, 0x61, \n\t0x45, 0x51, 0x53, 0x7a, 0x70, 0x30, 0x4e, 0x51, 0x46, 0x46, 0x4e, 0x57, 0x6d, 0x65, 0x63, 0x53, 0x54, 0x67, \n\t0x4d, 0x4f, 0x49, 0x33, 0x2b, 0x77, 0x2f, 0x42, 0x76, 0x62, 0x42, 0x41, 0x30, 0x49, 0x6c, 0x62, 0x66, 0x51, \n\t0x77, 0x63, 0x42, 0x58, 0x77, 0x55, 0x2b, 0x42, 0x36, 0x59, 0x76, 0x76, 0x4d, 0x74, 0x55, 0x6b, 0x72, 0x5c, 0x0a,\n\t0x09, 0x79, 0x71, 0x6a, 0x70, 0x51, 0x62, 0x77, 0x4c, 0x38, 0x43, 0x70, 0x67, 0x45, 0x62, 0x47, 0x45, 0x65, \n\t0x55, 0x4c, 0x61, 0x63, 0x69, 0x53, 0x31, 0x79, 0x42, 0x6f, 0x69, 0x6d, 0x4c, 0x38, 0x46, 0x66, 0x41, 0x64, \n\t0x59, 0x6d, 0x62, 0x61, 0x63, 0x7a, 0x57, 0x74, 0x69, 0x45, 0x41, 0x38, 0x54, 0x34, 0x58, 0x73, 0x36, 0x73, \n\t0x49, 0x41, 0x4f, 0x62, 0x77, 0x59, 0x74, 0x71, 0x54, 0x62, 0x72, 0x69, 0x46, 0x33, 0x62, 0x4c, 0x67, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x75, 0x42, 0x45, 0x62, 0x53, 0x6c, 0x76, 0x4e, 0x30, 0x54, 0x51, 0x72, 0x69, 0x36, 0x63, 0x44, \n\t0x5a, 0x78, 0x43, 0x71, 0x5a, 0x6e, 0x52, 0x4c, 0x58, 0x49, 0x71, 0x6d, 0x37, 0x6c, 0x68, 0x47, 0x42, 0x2f, \n\t0x42, 0x6e, 0x67, 0x6b, 0x63, 0x53, 0x31, 0x41, 0x4d, 0x30, 0x49, 0x34, 0x69, 0x6e, 0x41, 0x2b, 0x63, 0x42, \n\t0x35, 0x77, 0x4c, 0x54, 0x45, 0x74, 0x55, 0x6a, 0x71, 0x6a, 0x78, 0x58, 0x45, 0x44, 0x6d, 0x34, 0x58, 0x5c, 0x0a,\n\t0x09, 0x41, 0x34, 0x2b, 0x6c, 0x4c, 0x43, 0x52, 0x6c, 0x45, 0x41, 0x38, 0x52, 0x77, 0x77, 0x38, 0x66, 0x6f, \n\t0x4d, 0x58, 0x7a, 0x2f, 0x79, 0x53, 0x31, 0x33, 0x6e, 0x33, 0x41, 0x65, 0x34, 0x42, 0x2f, 0x49, 0x58, 0x5a, \n\t0x30, 0x71, 0x31, 0x32, 0x71, 0x49, 0x4a, 0x34, 0x4c, 0x4c, 0x41, 0x59, 0x4f, 0x53, 0x64, 0x47, 0x34, 0x4a, \n\t0x49, 0x33, 0x68, 0x4f, 0x75, 0x43, 0x74, 0x77, 0x4b, 0x2f, 0x71, 0x62, 0x72, 0x6a, 0x75, 0x65, 0x63, 0x5c, 0x0a,\n\t0x09, 0x52, 0x44, 0x77, 0x4e, 0x75, 0x42, 0x6e, 0x32, 0x4d, 0x49, 0x53, 0x32, 0x71, 0x57, 0x49, 0x34, 0x46, \n\t0x66, 0x41, 0x47, 0x64, 0x52, 0x38, 0x79, 0x53, 0x42, 0x4f, 0x6e, 0x76, 0x45, 0x4d, 0x34, 0x69, 0x75, 0x2f, \n\t0x35, 0x2f, 0x57, 0x31, 0x61, 0x41, 0x6b, 0x46, 0x58, 0x51, 0x46, 0x38, 0x43, 0x62, 0x69, 0x51, 0x4f, 0x4c, \n\t0x4b, 0x31, 0x52, 0x58, 0x45, 0x38, 0x34, 0x46, 0x76, 0x41, 0x37, 0x50, 0x72, 0x61, 0x45, 0x79, 0x53, 0x5c, 0x0a,\n\t0x09, 0x53, 0x76, 0x42, 0x72, 0x34, 0x4a, 0x58, 0x41, 0x66, 0x31, 0x58, 0x64, 0x55, 0x42, 0x31, 0x44, 0x45, \n\t0x38, 0x63, 0x41, 0x53, 0x7a, 0x43, 0x45, 0x4a, 0x62, 0x58, 0x4c, 0x48, 0x47, 0x4b, 0x46, 0x33, 0x6f, 0x4b, \n\t0x71, 0x47, 0x36, 0x6f, 0x36, 0x69, 0x45, 0x38, 0x6d, 0x56, 0x72, 0x52, 0x4d, 0x72, 0x62, 0x67, 0x64, 0x53, \n\t0x61, 0x72, 0x43, 0x39, 0x73, 0x51, 0x43, 0x6b, 0x42, 0x4f, 0x71, 0x62, 0x4b, 0x54, 0x4b, 0x49, 0x48, 0x5c, 0x0a,\n\t0x09, 0x34, 0x39, 0x38, 0x45, 0x56, 0x67, 0x32, 0x77, 0x72, 0x62, 0x6b, 0x4b, 0x53, 0x71, 0x62, 0x51, 0x74, \n\t0x63, 0x52, 0x6d, 0x52, 0x61, 0x4a, 0x61, 0x6f, 0x61, 0x49, 0x7a, 0x34, 0x65, 0x2b, 0x44, 0x72, 0x74, 0x33, \n\t0x39, 0x31, 0x4e, 0x6b, 0x6a, 0x5a, 0x59, 0x52, 0x32, 0x79, 0x2f, 0x63, 0x48, 0x6e, 0x5a, 0x44, 0x36, 0x34, \n\t0x69, 0x69, 0x49, 0x38, 0x41, 0x72, 0x71, 0x48, 0x6c, 0x5a, 0x30, 0x68, 0x4a, 0x30, 0x68, 0x67, 0x65, 0x5c, 0x0a,\n\t0x09, 0x41, 0x78, 0x59, 0x43, 0x50, 0x79, 0x37, 0x7a, 0x6f, 0x57, 0x55, 0x48, 0x38, 0x52, 0x7a, 0x67, 0x52, \n\t0x75, 0x42, 0x5a, 0x5a, 0x54, 0x35, 0x55, 0x6b, 0x68, 0x70, 0x6b, 0x42, 0x58, 0x41, 0x67, 0x63, 0x46, 0x64, \n\t0x5a, 0x44, 0x79, 0x78, 0x7a, 0x36, 0x47, 0x41, 0x79, 0x73, 0x64, 0x32, 0x63, 0x49, 0x53, 0x79, 0x70, 0x79, \n\t0x32, 0x59, 0x51, 0x77, 0x78, 0x50, 0x62, 0x6c, 0x66, 0x58, 0x41, 0x4d, 0x6f, 0x50, 0x34, 0x6b, 0x38, 0x5c, 0x0a,\n\t0x09, 0x43, 0x38, 0x45, 0x70, 0x38, 0x6e, 0x53, 0x55, 0x30, 0x31, 0x6a, 0x38, 0x69, 0x38, 0x55, 0x70, 0x51, \n\t0x31, 0x4e, 0x50, 0x46, 0x71, 0x34, 0x71, 0x32, 0x69, 0x4a, 0x50, 0x58, 0x4a, 0x43, 0x63, 0x52, 0x49, 0x77, \n\t0x45, 0x44, 0x4b, 0x43, 0x4f, 0x4a, 0x6e, 0x45, 0x79, 0x74, 0x50, 0x5a, 0x67, 0x37, 0x36, 0x49, 0x45, 0x6c, \n\t0x71, 0x6d, 0x65, 0x58, 0x41, 0x58, 0x71, 0x50, 0x66, 0x43, 0x79, 0x74, 0x6a, 0x61, 0x4f, 0x4a, 0x43, 0x5c, 0x0a,\n\t0x09, 0x44, 0x47, 0x46, 0x4a, 0x2f, 0x54, 0x51, 0x54, 0x2b, 0x4d, 0x69, 0x67, 0x44, 0x78, 0x6d, 0x30, 0x52, \n\t0x33, 0x77, 0x59, 0x73, 0x58, 0x78, 0x5a, 0x6b, 0x76, 0x72, 0x73, 0x59, 0x47, 0x4c, 0x47, 0x57, 0x43, 0x47, \n\t0x44, 0x39, 0x49, 0x69, 0x48, 0x69, 0x4e, 0x36, 0x77, 0x4a, 0x50, 0x58, 0x64, 0x68, 0x77, 0x61, 0x35, 0x65, \n\t0x5a, 0x41, 0x67, 0x58, 0x6b, 0x52, 0x38, 0x43, 0x6b, 0x68, 0x53, 0x33, 0x78, 0x30, 0x4e, 0x48, 0x46, 0x5c, 0x0a,\n\t0x09, 0x76, 0x30, 0x35, 0x6b, 0x47, 0x47, 0x4a, 0x6d, 0x34, 0x47, 0x39, 0x69, 0x39, 0x36, 0x73, 0x79, 0x52, \n\t0x31, 0x7a, 0x4d, 0x33, 0x45, 0x51, 0x6f, 0x2f, 0x63, 0x69, 0x76, 0x61, 0x49, 0x46, 0x32, 0x49, 0x49, 0x53, \n\t0x39, 0x4b, 0x6d, 0x44, 0x67, 0x41, 0x4f, 0x4c, 0x58, 0x4a, 0x6a, 0x30, 0x53, 0x41, 0x2b, 0x71, 0x2b, 0x42, \n\t0x39, 0x6b, 0x74, 0x52, 0x6c, 0x35, 0x78, 0x53, 0x35, 0x71, 0x63, 0x6a, 0x51, 0x78, 0x43, 0x7a, 0x67, 0x5c, 0x0a,\n\t0x09, 0x48, 0x6d, 0x6f, 0x2b, 0x30, 0x30, 0x6d, 0x53, 0x57, 0x6d, 0x41, 0x64, 0x38, 0x46, 0x7a, 0x67, 0x2f, \n\t0x6a, 0x77, 0x33, 0x46, 0x65, 0x6b, 0x52, 0x6e, 0x34, 0x49, 0x68, 0x4c, 0x45, 0x6c, 0x6a, 0x47, 0x55, 0x38, \n\t0x63, 0x69, 0x4a, 0x46, 0x4c, 0x6b, 0x53, 0x44, 0x4f, 0x33, 0x59, 0x67, 0x6b, 0x39, 0x63, 0x68, 0x72, 0x38, \n\t0x74, 0x36, 0x51, 0x64, 0x32, 0x68, 0x69, 0x44, 0x6e, 0x42, 0x6e, 0x33, 0x6b, 0x59, 0x6b, 0x71, 0x57, 0x5c, 0x0a,\n\t0x09, 0x64, 0x32, 0x41, 0x2b, 0x37, 0x4e, 0x65, 0x6e, 0x48, 0x65, 0x48, 0x76, 0x48, 0x4c, 0x63, 0x6c, 0x34, \n\t0x76, 0x53, 0x58, 0x33, 0x30, 0x79, 0x6a, 0x77, 0x58, 0x35, 0x77, 0x33, 0x69, 0x6c, 0x2b, 0x53, 0x38, 0x58, \n\t0x70, 0x4c, 0x36, 0x36, 0x4d, 0x67, 0x38, 0x46, 0x2b, 0x63, 0x5a, 0x6d, 0x68, 0x67, 0x43, 0x56, 0x67, 0x4c, \n\t0x54, 0x38, 0x31, 0x59, 0x6b, 0x53, 0x54, 0x33, 0x7a, 0x47, 0x32, 0x43, 0x58, 0x72, 0x42, 0x66, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x36, 0x52, 0x48, 0x76, 0x69, 0x53, 0x45, 0x73, 0x53, 0x56, 0x6e, 0x73, 0x44, 0x4d, 0x7a, 0x4f, 0x65, \n\t0x6e, 0x47, 0x65, 0x49, 0x4e, 0x34, 0x76, 0x66, 0x79, 0x32, 0x53, 0x31, 0x46, 0x75, 0x5a, 0x6c, 0x7a, 0x76, \n\t0x6e, 0x43, 0x65, 0x4b, 0x39, 0x43, 0x78, 0x51, 0x69, 0x53, 0x58, 0x32, 0x31, 0x5a, 0x39, 0x59, 0x4c, 0x38, \n\t0x77, 0x54, 0x78, 0x38, 0x77, 0x6f, 0x55, 0x49, 0x6b, 0x6c, 0x39, 0x74, 0x58, 0x76, 0x57, 0x43, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x45, 0x38, 0x58, 0x4d, 0x4c, 0x46, 0x43, 0x4a, 0x4a, 0x66, 0x62, 0x56, 0x48, 0x31, 0x67, 0x76, \n\t0x7a, 0x42, 0x50, 0x47, 0x4f, 0x42, 0x51, 0x71, 0x52, 0x70, 0x4c, 0x36, 0x61, 0x6c, 0x66, 0x58, 0x43, 0x50, \n\t0x45, 0x45, 0x38, 0x6f, 0x30, 0x41, 0x68, 0x6b, 0x74, 0x52, 0x58, 0x6b, 0x37, 0x4e, 0x65, 0x6d, 0x43, 0x65, \n\t0x49, 0x70, 0x78, 0x55, 0x6f, 0x52, 0x4a, 0x4c, 0x36, 0x61, 0x6c, 0x4c, 0x57, 0x43, 0x2f, 0x4d, 0x73, 0x5c, 0x0a,\n\t0x09, 0x36, 0x42, 0x6a, 0x6f, 0x6c, 0x46, 0x46, 0x4a, 0x36, 0x71, 0x46, 0x4d, 0x4f, 0x31, 0x55, 0x4f, 0x63, \n\t0x6d, 0x61, 0x64, 0x4a, 0x4b, 0x6b, 0x45, 0x42, 0x72, 0x45, 0x6b, 0x4a, 0x5a, 0x59, 0x6e, 0x69, 0x4a, 0x2b, \n\t0x6f, 0x72, 0x41, 0x70, 0x4a, 0x36, 0x70, 0x37, 0x48, 0x73, 0x31, 0x36, 0x59, 0x4a, 0x34, 0x68, 0x58, 0x46, \n\t0x43, 0x68, 0x45, 0x6b, 0x76, 0x6f, 0x71, 0x63, 0x32, 0x62, 0x6d, 0x43, 0x65, 0x4c, 0x6c, 0x42, 0x51, 0x5c, 0x0a,\n\t0x09, 0x71, 0x52, 0x70, 0x4c, 0x37, 0x4b, 0x6e, 0x4a, 0x6c, 0x35, 0x67, 0x6a, 0x6a, 0x7a, 0x62, 0x76, 0x4f, \n\t0x53, 0x4a, 0x4f, 0x37, 0x4a, 0x65, 0x6d, 0x47, 0x65, 0x49, 0x46, 0x35, 0x61, 0x6f, 0x42, 0x42, 0x4a, 0x36, \n\t0x71, 0x75, 0x37, 0x73, 0x6c, 0x36, 0x59, 0x4a, 0x34, 0x6a, 0x76, 0x79, 0x46, 0x2b, 0x48, 0x4a, 0x50, 0x58, \n\t0x57, 0x37, 0x56, 0x6b, 0x76, 0x7a, 0x42, 0x50, 0x45, 0x74, 0x78, 0x51, 0x6f, 0x52, 0x4a, 0x4c, 0x36, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x6e, 0x4e, 0x6d, 0x35, 0x6c, 0x6c, 0x5a, 0x4e, 0x78, 0x56, 0x34, 0x43, 0x4f, 0x63, 0x65, 0x53, \n\t0x39, 0x4c, 0x57, 0x6a, 0x42, 0x41, 0x6e, 0x47, 0x6a, 0x32, 0x63, 0x35, 0x65, 0x49, 0x38, 0x6f, 0x66, 0x6f, \n\t0x77, 0x39, 0x6f, 0x6f, 0x6c, 0x4b, 0x59, 0x74, 0x62, 0x79, 0x42, 0x6a, 0x43, 0x6b, 0x4c, 0x39, 0x33, 0x65, \n\t0x31, 0x33, 0x4f, 0x36, 0x79, 0x57, 0x70, 0x6a, 0x2f, 0x34, 0x74, 0x7a, 0x38, 0x56, 0x35, 0x67, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x4b, 0x6e, 0x4e, 0x64, 0x4c, 0x55, 0x68, 0x39, 0x64, 0x6c, 0x65, 0x66, 0x69, 0x50, 0x47, 0x50, \n\t0x45, 0x41, 0x42, 0x4f, 0x42, 0x42, 0x34, 0x44, 0x74, 0x38, 0x39, 0x77, 0x6b, 0x53, 0x54, 0x33, 0x79, 0x65, \n\t0x32, 0x41, 0x48, 0x59, 0x47, 0x33, 0x57, 0x47, 0x2f, 0x4c, 0x32, 0x69, 0x4e, 0x63, 0x41, 0x6c, 0x2b, 0x65, \n\t0x38, 0x52, 0x35, 0x4c, 0x36, 0x35, 0x48, 0x4a, 0x79, 0x68, 0x44, 0x41, 0x55, 0x6d, 0x77, 0x48, 0x78, 0x5c, 0x0a,\n\t0x09, 0x35, 0x51, 0x4c, 0x33, 0x53, 0x46, 0x4a, 0x66, 0x35, 0x4d, 0x37, 0x49, 0x76, 0x45, 0x4d, 0x54, 0x45, \n\t0x4f, 0x47, 0x39, 0x44, 0x4e, 0x67, 0x74, 0x37, 0x34, 0x32, 0x53, 0x31, 0x48, 0x48, 0x33, 0x41, 0x4c, 0x4f, \n\t0x4a, 0x36, 0x57, 0x75, 0x5a, 0x46, 0x65, 0x6b, 0x52, 0x6a, 0x77, 0x43, 0x66, 0x4c, 0x58, 0x43, 0x66, 0x4a, \n\t0x48, 0x58, 0x64, 0x78, 0x65, 0x51, 0x4d, 0x59, 0x53, 0x6a, 0x57, 0x49, 0x34, 0x59, 0x34, 0x53, 0x50, 0x5c, 0x0a,\n\t0x09, 0x52, 0x75, 0x63, 0x68, 0x79, 0x4f, 0x4a, 0x30, 0x6b, 0x64, 0x74, 0x35, 0x6f, 0x59, 0x4b, 0x56, 0x69, \n\t0x5a, 0x39, 0x38, 0x61, 0x69, 0x71, 0x2b, 0x52, 0x57, 0x41, 0x4a, 0x63, 0x55, 0x76, 0x46, 0x65, 0x53, 0x75, \n\t0x75, 0x67, 0x53, 0x43, 0x6f, 0x51, 0x77, 0x46, 0x4f, 0x38, 0x52, 0x51, 0x30, 0x7a, 0x50, 0x57, 0x49, 0x71, \n\t0x39, 0x59, 0x6b, 0x6c, 0x61, 0x54, 0x59, 0x77, 0x4e, 0x50, 0x31, 0x6a, 0x6b, 0x35, 0x6b, 0x48, 0x32, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x66, 0x67, 0x74, 0x63, 0x4f, 0x45, 0x41, 0x39, 0x30, 0x74, 0x53, 0x56, 0x33, 0x79, 0x45, 0x67, \n\t0x69, 0x45, 0x4d, 0x67, 0x2f, 0x57, 0x49, 0x41, 0x53, 0x59, 0x52, 0x32, 0x32, 0x50, 0x4f, 0x47, 0x75, 0x51, \n\t0x68, 0x6b, 0x74, 0x52, 0x69, 0x39, 0x77, 0x4a, 0x7a, 0x67, 0x55, 0x65, 0x4c, 0x50, 0x6d, 0x44, 0x51, 0x6e, \n\t0x64, 0x51, 0x65, 0x42, 0x63, 0x34, 0x65, 0x38, 0x42, 0x6d, 0x53, 0x31, 0x47, 0x62, 0x6e, 0x4d, 0x45, 0x5c, 0x0a,\n\t0x09, 0x41, 0x49, 0x51, 0x7a, 0x6c, 0x62, 0x57, 0x6e, 0x34, 0x62, 0x75, 0x4b, 0x79, 0x45, 0x35, 0x30, 0x68, \n\t0x53, 0x32, 0x31, 0x78, 0x47, 0x5a, 0x4f, 0x42, 0x41, 0x42, 0x68, 0x32, 0x61, 0x32, 0x47, 0x41, 0x47, 0x73, \n\t0x65, 0x33, 0x62, 0x4c, 0x6d, 0x55, 0x38, 0x54, 0x4a, 0x4a, 0x61, 0x34, 0x48, 0x35, 0x67, 0x50, 0x69, 0x57, \n\t0x63, 0x63, 0x46, 0x2f, 0x57, 0x4a, 0x75, 0x38, 0x72, 0x67, 0x44, 0x64, 0x51, 0x59, 0x43, 0x4b, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x4c, 0x58, 0x51, 0x43, 0x4a, 0x46, 0x35, 0x41, 0x34, 0x63, 0x77, 0x6c, 0x48, 0x76, 0x61, 0x78, \n\t0x67, 0x2b, 0x42, 0x43, 0x30, 0x70, 0x38, 0x6e, 0x69, 0x51, 0x31, 0x31, 0x56, 0x38, 0x52, 0x6d, 0x56, 0x65, \n\t0x4b, 0x73, 0x6f, 0x59, 0x6d, 0x6e, 0x6e, 0x6f, 0x65, 0x38, 0x4d, 0x2f, 0x41, 0x4b, 0x57, 0x55, 0x2b, 0x56, \n\t0x4a, 0x49, 0x61, 0x35, 0x46, 0x4c, 0x67, 0x56, 0x4b, 0x43, 0x30, 0x38, 0x43, 0x77, 0x37, 0x69, 0x41, 0x5c, 0x0a,\n\t0x09, 0x47, 0x47, 0x67, 0x65, 0x38, 0x43, 0x43, 0x38, 0x70, 0x2b, 0x73, 0x43, 0x51, 0x6c, 0x39, 0x67, 0x50, \n\t0x67, 0x4f, 0x4f, 0x44, 0x78, 0x4d, 0x68, 0x39, 0x61, 0x52, 0x52, 0x42, 0x44, 0x72, 0x4c, 0x61, 0x37, 0x46, \n\t0x6a, 0x69, 0x6f, 0x69, 0x6f, 0x64, 0x4c, 0x55, 0x67, 0x49, 0x33, 0x41, 0x6b, 0x63, 0x7a, 0x34, 0x46, 0x53, \n\t0x31, 0x73, 0x56, 0x52, 0x31, 0x49, 0x76, 0x4e, 0x71, 0x34, 0x42, 0x6a, 0x67, 0x68, 0x6f, 0x71, 0x65, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x30, 0x6c, 0x31, 0x2b, 0x69, 0x6d, 0x52, 0x61, 0x61, 0x57, 0x48, 0x4d, 0x46, 0x51, 0x58, 0x78, \n\t0x41, 0x43, 0x72, 0x67, 0x42, 0x63, 0x44, 0x31, 0x31, 0x54, 0x59, 0x68, 0x69, 0x52, 0x56, 0x37, 0x52, 0x70, \n\t0x69, 0x71, 0x48, 0x56, 0x56, 0x56, 0x51, 0x31, 0x55, 0x47, 0x63, 0x51, 0x51, 0x6e, 0x78, 0x34, 0x76, 0x41, \n\t0x78, 0x5a, 0x58, 0x33, 0x49, 0x34, 0x6b, 0x56, 0x57, 0x45, 0x78, 0x6b, 0x57, 0x47, 0x56, 0x39, 0x49, 0x5c, 0x0a,\n\t0x09, 0x51, 0x33, 0x71, 0x44, 0x71, 0x49, 0x49, 0x51, 0x61, 0x31, 0x33, 0x77, 0x7a, 0x38, 0x42, 0x62, 0x43, \n\t0x75, 0x68, 0x76, 0x59, 0x6b, 0x61, 0x56, 0x44, 0x72, 0x67, 0x50, 0x4f, 0x49, 0x37, 0x43, 0x72, 0x31, 0x78, \n\t0x64, 0x78, 0x59, 0x71, 0x6e, 0x70, 0x5a, 0x74, 0x7a, 0x6d, 0x48, 0x41, 0x31, 0x2f, 0x43, 0x59, 0x35, 0x59, \n\t0x6b, 0x4e, 0x64, 0x66, 0x64, 0x78, 0x47, 0x4b, 0x4e, 0x4a, 0x58, 0x55, 0x31, 0x57, 0x45, 0x65, 0x50, 0x5c, 0x0a,\n\t0x09, 0x65, 0x46, 0x4e, 0x4c, 0x69, 0x43, 0x57, 0x42, 0x6c, 0x39, 0x62, 0x63, 0x72, 0x69, 0x52, 0x6c, 0x63, \n\t0x53, 0x6d, 0x77, 0x44, 0x7a, 0x57, 0x47, 0x4d, 0x4e, 0x54, 0x66, 0x49, 0x39, 0x37, 0x55, 0x51, 0x75, 0x41, \n\t0x66, 0x67, 0x54, 0x6d, 0x70, 0x43, 0x70, 0x43, 0x6b, 0x55, 0x62, 0x38, 0x47, 0x2f, 0x67, 0x79, 0x34, 0x4f, \n\t0x6b, 0x58, 0x6a, 0x64, 0x66, 0x65, 0x49, 0x4e, 0x33, 0x55, 0x31, 0x73, 0x44, 0x66, 0x77, 0x6c, 0x31, 0x5c, 0x0a,\n\t0x09, 0x54, 0x34, 0x4e, 0x6c, 0x4b, 0x53, 0x74, 0x6d, 0x41, 0x56, 0x6b, 0x55, 0x46, 0x37, 0x6b, 0x79, 0x69, \n\t0x45, 0x49, 0x57, 0x32, 0x50, 0x65, 0x46, 0x50, 0x54, 0x69, 0x59, 0x48, 0x78, 0x63, 0x30, 0x64, 0x2f, 0x4c, \n\t0x55, 0x6c, 0x56, 0x65, 0x67, 0x6a, 0x34, 0x4f, 0x50, 0x43, 0x78, 0x30, 0x56, 0x38, 0x6e, 0x31, 0x5a, 0x51, \n\t0x67, 0x33, 0x6d, 0x41, 0x4b, 0x63, 0x44, 0x70, 0x77, 0x4a, 0x76, 0x44, 0x38, 0x78, 0x4c, 0x56, 0x49, 0x5c, 0x0a,\n\t0x09, 0x36, 0x70, 0x34, 0x37, 0x67, 0x49, 0x75, 0x49, 0x61, 0x57, 0x6d, 0x50, 0x4a, 0x4b, 0x37, 0x6c, 0x4b, \n\t0x55, 0x30, 0x4c, 0x34, 0x6b, 0x30, 0x64, 0x41, 0x62, 0x77, 0x65, 0x4f, 0x41, 0x46, 0x34, 0x64, 0x75, 0x4a, \n\t0x61, 0x4a, 0x4c, 0x58, 0x58, 0x67, 0x38, 0x41, 0x33, 0x69, 0x52, 0x6c, 0x62, 0x50, 0x30, 0x70, 0x63, 0x79, \n\t0x35, 0x69, 0x61, 0x48, 0x4d, 0x51, 0x62, 0x6a, 0x41, 0x4d, 0x4f, 0x41, 0x59, 0x34, 0x6c, 0x56, 0x75, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x64, 0x41, 0x45, 0x78, 0x49, 0x57, 0x70, 0x47, 0x6b, 0x4a, 0x6c, 0x73, 0x4c, 0x33, 0x45, 0x7a, \n\t0x73, 0x64, 0x2f, 0x4d, 0x39, 0x34, 0x48, 0x72, 0x67, 0x79, 0x61, 0x51, 0x56, 0x62, 0x55, 0x55, 0x62, 0x67, \n\t0x76, 0x69, 0x5a, 0x4a, 0x68, 0x42, 0x54, 0x34, 0x4f, 0x59, 0x42, 0x4c, 0x79, 0x43, 0x4f, 0x73, 0x4e, 0x34, \n\t0x56, 0x32, 0x41, 0x47, 0x59, 0x53, 0x52, 0x78, 0x6f, 0x4b, 0x71, 0x6e, 0x62, 0x48, 0x67, 0x57, 0x57, 0x5c, 0x0a,\n\t0x09, 0x45, 0x36, 0x66, 0x4a, 0x33, 0x77, 0x73, 0x73, 0x41, 0x32, 0x34, 0x44, 0x66, 0x6b, 0x6d, 0x63, 0x46, \n\t0x72, 0x51, 0x32, 0x58, 0x57, 0x6e, 0x35, 0x74, 0x54, 0x47, 0x49, 0x4a, 0x61, 0x6c, 0x54, 0x55, 0x6b, 0x35, \n\t0x66, 0x6b, 0x79, 0x52, 0x68, 0x45, 0x45, 0x74, 0x53, 0x63, 0x67, 0x61, 0x78, 0x4a, 0x43, 0x56, 0x6d, 0x45, \n\t0x45, 0x74, 0x53, 0x59, 0x67, 0x61, 0x78, 0x4a, 0x43, 0x56, 0x6d, 0x45, 0x45, 0x74, 0x53, 0x59, 0x67, 0x5c, 0x0a,\n\t0x09, 0x61, 0x78, 0x4a, 0x43, 0x56, 0x6d, 0x45, 0x45, 0x74, 0x53, 0x59, 0x67, 0x61, 0x78, 0x4a, 0x43, 0x58, \n\t0x32, 0x2f, 0x35, 0x69, 0x78, 0x71, 0x6f, 0x64, 0x70, 0x4d, 0x5a, 0x6d, 0x2b, 0x41, 0x41, 0x41, 0x41, 0x41, \n\t0x45, 0x6c, 0x46, 0x54, 0x6b, 0x53, 0x75, 0x51, 0x6d, 0x43, 0x43, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x32, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x62, 0x67, 0x5b, 0x31, 0x5d, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x32, 0x5f, 0x70, \n\t0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x65, 0x63, \n\t0x6f, 0x64, 0x65, 0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, \n\t0x34, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x4c, 0x45, 0x41, 0x41, 0x41, 0x42, 0x55, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x44, 0x4e, 0x6f, 0x4e, 0x62, 0x30, 0x41, 0x41, 0x41, 0x46, 0x30, 0x6b, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x34, 0x6e, 0x4f, 0x33, 0x64, 0x57, 0x34, 0x68, 0x56, 0x56, 0x52, 0x7a, 0x48, 0x38, 0x65, 0x5c, 0x0a,\n\t0x09, 0x38, 0x63, 0x63, 0x32, 0x77, 0x30, 0x4d, 0x36, 0x75, 0x5a, 0x68, 0x6a, 0x45, 0x31, 0x6d, 0x30, 0x6c, \n\t0x4e, 0x73, 0x62, 0x4c, 0x73, 0x4f, 0x6a, 0x35, 0x46, 0x58, 0x67, 0x6f, 0x79, 0x4b, 0x6c, 0x4d, 0x4c, 0x53, \n\t0x71, 0x4d, 0x78, 0x59, 0x78, 0x36, 0x7a, 0x6e, 0x73, 0x75, 0x67, 0x68, 0x7a, 0x44, 0x4d, 0x68, 0x35, 0x36, \n\t0x73, 0x69, 0x62, 0x41, 0x4c, 0x46, 0x53, 0x45, 0x55, 0x70, 0x46, 0x51, 0x69, 0x46, 0x55, 0x56, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x53, 0x64, 0x4a, 0x44, 0x4e, 0x46, 0x32, 0x73, 0x37, 0x44, 0x5a, 0x59, 0x55, 0x47, 0x4e, 0x54, 0x44, \n\t0x55, 0x37, 0x6a, 0x39, 0x50, 0x41, 0x2f, 0x6b, 0x57, 0x53, 0x6b, 0x63, 0x38, 0x37, 0x2f, 0x76, 0x39, 0x64, \n\t0x6c, 0x2f, 0x7a, 0x2f, 0x67, 0x79, 0x36, 0x68, 0x72, 0x2f, 0x77, 0x2f, 0x6e, 0x78, 0x35, 0x71, 0x31, 0x31, \n\t0x31, 0x35, 0x72, 0x37, 0x59, 0x61, 0x52, 0x6b, 0x52, 0x47, 0x63, 0x53, 0x31, 0x6b, 0x6c, 0x64, 0x41, 0x5c, 0x0a,\n\t0x09, 0x48, 0x4f, 0x31, 0x63, 0x74, 0x44, 0x37, 0x4a, 0x4c, 0x6e, 0x49, 0x58, 0x62, 0x4a, 0x38, 0x78, 0x43, \n\t0x37, 0x35, 0x4a, 0x30, 0x51, 0x75, 0x6f, 0x43, 0x53, 0x4f, 0x78, 0x64, 0x59, 0x44, 0x4d, 0x77, 0x48, 0x7a, \n\t0x67, 0x66, 0x61, 0x67, 0x46, 0x4f, 0x41, 0x52, 0x75, 0x41, 0x77, 0x30, 0x41, 0x2f, 0x73, 0x42, 0x33, 0x71, \n\t0x42, 0x39, 0x34, 0x46, 0x64, 0x77, 0x4e, 0x37, 0x71, 0x33, 0x37, 0x6d, 0x71, 0x42, 0x70, 0x2b, 0x64, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x46, 0x77, 0x4c, 0x63, 0x42, 0x64, 0x77, 0x4b, 0x39, 0x42, 0x52, 0x77, 0x2f, 0x2f, 0x2f, 0x46, \n\t0x6e, 0x67, 0x61, 0x65, 0x41, 0x7a, 0x59, 0x70, 0x31, 0x68, 0x58, 0x73, 0x6a, 0x7a, 0x45, 0x78, 0x57, 0x6b, \n\t0x47, 0x4e, 0x67, 0x42, 0x33, 0x49, 0x44, 0x31, 0x74, 0x76, 0x59, 0x61, 0x52, 0x4d, 0x47, 0x38, 0x41, 0x76, \n\t0x6c, 0x52, 0x6f, 0x4c, 0x31, 0x6b, 0x65, 0x59, 0x6e, 0x73, 0x4e, 0x51, 0x44, 0x66, 0x77, 0x49, 0x44, 0x5c, 0x0a,\n\t0x09, 0x44, 0x4a, 0x6f, 0x50, 0x30, 0x2f, 0x71, 0x6d, 0x30, 0x2f, 0x42, 0x50, 0x78, 0x70, 0x30, 0x48, 0x37, \n\t0x30, 0x50, 0x4d, 0x53, 0x32, 0x54, 0x67, 0x57, 0x65, 0x42, 0x4b, 0x34, 0x74, 0x34, 0x46, 0x72, 0x76, 0x41, \n\t0x4b, 0x75, 0x51, 0x34, 0x55, 0x61, 0x70, 0x65, 0x49, 0x6a, 0x74, 0x7a, 0x41, 0x42, 0x65, 0x42, 0x39, 0x6f, \n\t0x4c, 0x76, 0x4f, 0x59, 0x50, 0x77, 0x46, 0x4c, 0x67, 0x6f, 0x77, 0x4b, 0x76, 0x47, 0x5a, 0x79, 0x48, 0x5c, 0x0a,\n\t0x09, 0x32, 0x4d, 0x5a, 0x73, 0x59, 0x43, 0x63, 0x77, 0x4a, 0x63, 0x43, 0x31, 0x44, 0x77, 0x4a, 0x58, 0x49, \n\t0x62, 0x4d, 0x5a, 0x70, 0x65, 0x41, 0x68, 0x50, 0x6c, 0x6f, 0x54, 0x63, 0x41, 0x6b, 0x79, 0x35, 0x58, 0x55, \n\t0x65, 0x4d, 0x42, 0x4d, 0x34, 0x6f, 0x2f, 0x72, 0x7a, 0x43, 0x63, 0x43, 0x76, 0x77, 0x47, 0x2f, 0x41, 0x64, \n\t0x38, 0x42, 0x58, 0x53, 0x4b, 0x2b, 0x33, 0x47, 0x2f, 0x67, 0x51, 0x47, 0x4b, 0x72, 0x2b, 0x32, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x65, 0x41, 0x36, 0x51, 0x58, 0x58, 0x66, 0x61, 0x53, 0x66, 0x67, 0x45, 0x37, 0x67, 0x30, 0x34, 0x41, \n\t0x31, 0x46, 0x4d, 0x5a, 0x44, 0x4c, 0x45, 0x34, 0x47, 0x6c, 0x67, 0x50, 0x4c, 0x6b, 0x48, 0x6e, 0x62, 0x70, \n\t0x68, 0x72, 0x61, 0x4f, 0x41, 0x69, 0x38, 0x69, 0x6b, 0x79, 0x62, 0x7a, 0x64, 0x63, 0x72, 0x72, 0x57, 0x61, \n\t0x39, 0x77, 0x41, 0x4a, 0x67, 0x49, 0x48, 0x51, 0x68, 0x31, 0x73, 0x6f, 0x65, 0x34, 0x67, 0x35, 0x67, 0x5c, 0x0a,\n\t0x09, 0x50, 0x58, 0x41, 0x62, 0x4d, 0x44, 0x35, 0x77, 0x4c, 0x52, 0x61, 0x32, 0x41, 0x71, 0x74, 0x44, 0x46, \n\t0x32, 0x47, 0x74, 0x72, 0x43, 0x46, 0x75, 0x41, 0x52, 0x34, 0x41, 0x75, 0x6f, 0x41, 0x78, 0x67, 0x57, 0x75, \n\t0x78, 0x74, 0x68, 0x69, 0x35, 0x77, 0x63, 0x78, 0x57, 0x47, 0x55, 0x4f, 0x38, 0x47, 0x6e, 0x67, 0x45, 0x6d, \n\t0x42, 0x79, 0x36, 0x6b, 0x49, 0x4c, 0x30, 0x41, 0x6e, 0x4f, 0x52, 0x68, 0x79, 0x4e, 0x5a, 0x4b, 0x74, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x43, 0x6f, 0x49, 0x6e, 0x41, 0x43, 0x38, 0x69, 0x38, 0x62, 0x56, 0x6b, 0x43, 0x44, 0x44, 0x41, \n\t0x4c, 0x75, 0x43, 0x6c, 0x30, 0x45, 0x5a, 0x62, 0x4b, 0x30, 0x68, 0x4f, 0x66, 0x42, 0x57, 0x78, 0x48, 0x46, \n\t0x74, 0x79, 0x55, 0x30, 0x56, 0x37, 0x69, 0x75, 0x4e, 0x6b, 0x30, 0x55, 0x59, 0x61, 0x65, 0x65, 0x42, 0x37, \n\t0x79, 0x4e, 0x4b, 0x75, 0x73, 0x41, 0x51, 0x61, 0x34, 0x41, 0x4a, 0x6b, 0x79, 0x7a, 0x46, 0x4c, 0x75, 0x5c, 0x0a,\n\t0x09, 0x49, 0x65, 0x35, 0x41, 0x6c, 0x69, 0x2b, 0x32, 0x68, 0x53, 0x34, 0x6b, 0x41, 0x69, 0x74, 0x43, 0x46, \n\t0x32, 0x41, 0x6c, 0x35, 0x78, 0x41, 0x33, 0x49, 0x33, 0x66, 0x6c, 0x70, 0x34, 0x63, 0x75, 0x4a, 0x42, 0x4a, \n\t0x4c, 0x51, 0x68, 0x64, 0x67, 0x4a, 0x59, 0x63, 0x78, 0x38, 0x58, 0x68, 0x6b, 0x55, 0x6e, 0x38, 0x4f, 0x38, \n\t0x70, 0x68, 0x33, 0x49, 0x72, 0x4a, 0x6f, 0x76, 0x42, 0x4e, 0x35, 0x38, 0x75, 0x62, 0x45, 0x59, 0x57, 0x5c, 0x0a,\n\t0x09, 0x51, 0x56, 0x58, 0x58, 0x59, 0x50, 0x50, 0x31, 0x4c, 0x64, 0x32, 0x64, 0x45, 0x49, 0x33, 0x49, 0x68, \n\t0x4d, 0x6c, 0x31, 0x30, 0x4a, 0x6a, 0x41, 0x31, 0x62, 0x54, 0x68, 0x49, 0x71, 0x79, 0x45, 0x7a, 0x46, 0x6e, \n\t0x74, 0x43, 0x46, 0x61, 0x45, 0x74, 0x74, 0x4f, 0x46, 0x45, 0x42, 0x31, 0x69, 0x49, 0x37, 0x47, 0x70, 0x35, \n\t0x46, 0x66, 0x6b, 0x56, 0x36, 0x67, 0x49, 0x2f, 0x66, 0x7a, 0x4e, 0x41, 0x46, 0x57, 0x45, 0x69, 0x70, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x32, 0x35, 0x48, 0x64, 0x6a, 0x4a, 0x63, 0x46, 0x72, 0x71, 0x51, 0x68, 0x44, 0x57, 0x48, 0x4c, \n\t0x73, 0x42, 0x43, 0x4b, 0x69, 0x46, 0x65, 0x42, 0x4c, 0x79, 0x49, 0x4c, 0x4e, 0x52, 0x78, 0x74, 0x54, 0x73, \n\t0x70, 0x64, 0x41, 0x45, 0x57, 0x55, 0x68, 0x68, 0x4f, 0x4c, 0x41, 0x4e, 0x65, 0x77, 0x51, 0x4f, 0x73, 0x49, \n\t0x59, 0x58, 0x76, 0x65, 0x39, 0x52, 0x69, 0x2f, 0x31, 0x42, 0x58, 0x49, 0x44, 0x32, 0x77, 0x6a, 0x33, 0x5c, 0x0a,\n\t0x09, 0x74, 0x31, 0x74, 0x46, 0x50, 0x62, 0x4d, 0x74, 0x4f, 0x6f, 0x78, 0x52, 0x7a, 0x69, 0x5a, 0x6d, 0x41, \n\t0x62, 0x48, 0x6d, 0x42, 0x4e, 0x61, 0x35, 0x43, 0x62, 0x34, 0x72, 0x58, 0x45, 0x2f, 0x64, 0x32, 0x50, 0x53, \n\t0x73, 0x77, 0x66, 0x35, 0x46, 0x46, 0x6b, 0x6c, 0x34, 0x54, 0x54, 0x31, 0x51, 0x70, 0x73, 0x41, 0x64, 0x34, \n\t0x43, 0x70, 0x67, 0x57, 0x75, 0x52, 0x55, 0x57, 0x73, 0x44, 0x7a, 0x73, 0x36, 0x67, 0x62, 0x64, 0x44, 0x5c, 0x0a,\n\t0x09, 0x46, 0x31, 0x45, 0x43, 0x50, 0x77, 0x50, 0x58, 0x41, 0x32, 0x2b, 0x47, 0x4c, 0x71, 0x51, 0x65, 0x73, \n\t0x66, 0x62, 0x45, 0x39, 0x34, 0x55, 0x75, 0x6f, 0x43, 0x51, 0x6d, 0x41, 0x36, 0x38, 0x68, 0x4e, 0x38, 0x2f, \n\t0x4a, 0x69, 0x72, 0x45, 0x6e, 0x50, 0x6f, 0x65, 0x53, 0x62, 0x48, 0x43, 0x4d, 0x79, 0x43, 0x48, 0x6b, 0x77, \n\t0x64, 0x45, 0x62, 0x67, 0x65, 0x75, 0x6f, 0x53, 0x59, 0x77, 0x39, 0x38, 0x66, 0x4c, 0x51, 0x42, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x52, 0x51, 0x49, 0x7a, 0x49, 0x4c, 0x6c, 0x4f, 0x51, 0x59, 0x4f, 0x63, 0x59, 0x51, 0x5a, 0x37, 0x76, \n\t0x61, 0x4b, 0x6e, 0x4b, 0x6e, 0x41, 0x63, 0x38, 0x67, 0x78, 0x32, 0x34, 0x6c, 0x4a, 0x62, 0x59, 0x51, 0x56, \n\t0x34, 0x43, 0x4c, 0x51, 0x78, 0x64, 0x52, 0x59, 0x67, 0x75, 0x42, 0x4f, 0x30, 0x4d, 0x58, 0x4d, 0x56, 0x71, \n\t0x78, 0x6a, 0x59, 0x6d, 0x6e, 0x55, 0x4d, 0x4b, 0x7a, 0x78, 0x43, 0x4c, 0x54, 0x42, 0x35, 0x79, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x48, 0x46, 0x54, 0x59, 0x42, 0x49, 0x78, 0x44, 0x44, 0x6f, 0x79, 0x4a, 0x64, 0x71, 0x4e, 0x70, 0x4c, \n\t0x47, 0x73, 0x6e, 0x70, 0x67, 0x46, 0x58, 0x56, 0x2f, 0x2b, 0x34, 0x73, 0x46, 0x71, 0x42, 0x7a, 0x35, 0x44, \n\t0x4e, 0x42, 0x4f, 0x4f, 0x4f, 0x2b, 0x50, 0x6e, 0x76, 0x31, 0x5a, 0x39, 0x2f, 0x6a, 0x4d, 0x77, 0x78, 0x37, \n\t0x77, 0x51, 0x2b, 0x4c, 0x37, 0x79, 0x36, 0x2f, 0x78, 0x43, 0x79, 0x4a, 0x7a, 0x34, 0x52, 0x75, 0x42, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x59, 0x42, 0x31, 0x77, 0x61, 0x71, 0x67, 0x68, 0x58, 0x6c, 0x39, 0x33, 0x41, 0x34, 0x38, 0x42, \n\t0x54, 0x77, 0x47, 0x43, 0x6f, 0x49, 0x6b, 0x4b, 0x45, 0x75, 0x49, 0x49, 0x63, 0x4e, 0x48, 0x30, 0x2f, 0x76, \n\t0x76, 0x63, 0x74, 0x46, 0x33, 0x33, 0x49, 0x59, 0x64, 0x39, 0x62, 0x43, 0x50, 0x41, 0x71, 0x68, 0x71, 0x4a, \n\t0x44, 0x50, 0x42, 0x73, 0x35, 0x39, 0x38, 0x46, 0x37, 0x33, 0x6a, 0x78, 0x39, 0x67, 0x4c, 0x7a, 0x47, 0x5c, 0x0a,\n\t0x09, 0x34, 0x5a, 0x4d, 0x69, 0x4c, 0x31, 0x72, 0x6b, 0x37, 0x4d, 0x52, 0x4b, 0x35, 0x45, 0x4e, 0x36, 0x67, \n\t0x50, 0x4f, 0x31, 0x41, 0x50, 0x6d, 0x4f, 0x62, 0x79, 0x6e, 0x79, 0x6f, 0x6b, 0x57, 0x46, 0x65, 0x44, 0x33, \n\t0x77, 0x48, 0x48, 0x49, 0x30, 0x71, 0x73, 0x76, 0x62, 0x42, 0x47, 0x53, 0x2b, 0x2b, 0x5a, 0x36, 0x69, 0x4c, \n\t0x6c, 0x68, 0x45, 0x69, 0x4f, 0x38, 0x47, 0x48, 0x69, 0x37, 0x67, 0x4f, 0x69, 0x34, 0x75, 0x47, 0x35, 0x5c, 0x0a,\n\t0x09, 0x48, 0x4f, 0x79, 0x35, 0x7a, 0x31, 0x6d, 0x48, 0x67, 0x46, 0x38, 0x4c, 0x7a, 0x6c, 0x42, 0x56, 0x7a, \n\t0x30, 0x56, 0x6d, 0x47, 0x63, 0x41, 0x63, 0x73, 0x51, 0x7a, 0x30, 0x4c, 0x47, 0x52, 0x31, 0x6e, 0x75, 0x36, \n\t0x33, 0x4c, 0x48, 0x62, 0x51, 0x43, 0x34, 0x45, 0x4a, 0x6c, 0x6a, 0x4e, 0x6d, 0x45, 0x31, 0x6e, 0x4b, 0x67, \n\t0x41, 0x54, 0x2b, 0x41, 0x42, 0x64, 0x70, 0x4b, 0x42, 0x72, 0x52, 0x69, 0x75, 0x79, 0x62, 0x41, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x38, 0x52, 0x70, 0x6b, 0x66, 0x35, 0x78, 0x7a, 0x49, 0x4d, 0x63, 0x73, 0x33, 0x47, 0x37, 0x56, 0x75, \n\t0x4d, 0x56, 0x77, 0x6f, 0x68, 0x46, 0x35, 0x48, 0x44, 0x6c, 0x56, 0x75, 0x32, 0x47, 0x58, 0x74, 0x47, 0x2b, \n\t0x51, 0x41, 0x78, 0x34, 0x50, 0x61, 0x54, 0x64, 0x73, 0x30, 0x52, 0x4f, 0x76, 0x78, 0x41, 0x50, 0x73, 0x6a, \n\t0x6a, 0x59, 0x56, 0x79, 0x59, 0x59, 0x36, 0x69, 0x78, 0x43, 0x76, 0x4d, 0x32, 0x6a, 0x54, 0x35, 0x61, 0x5c, 0x0a,\n\t0x09, 0x48, 0x4c, 0x6f, 0x6c, 0x48, 0x74, 0x34, 0x55, 0x51, 0x62, 0x73, 0x70, 0x51, 0x79, 0x75, 0x59, 0x58, \n\t0x56, 0x72, 0x6a, 0x42, 0x6e, 0x49, 0x75, 0x38, 0x41, 0x56, 0x4b, 0x50, 0x64, 0x45, 0x79, 0x2f, 0x46, 0x41, \n\t0x2b, 0x7a, 0x2b, 0x33, 0x79, 0x4c, 0x74, 0x42, 0x72, 0x56, 0x44, 0x66, 0x4c, 0x6c, 0x79, 0x65, 0x79, 0x34, \n\t0x2f, 0x43, 0x37, 0x55, 0x62, 0x31, 0x41, 0x37, 0x78, 0x50, 0x4f, 0x58, 0x32, 0x58, 0x48, 0x37, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x61, 0x44, 0x65, 0x6f, 0x48, 0x65, 0x49, 0x5a, 0x79, 0x75, 0x32, 0x35, 0x2f, 0x48, 0x52, 0x6f, 0x4e, \n\t0x36, 0x68, 0x39, 0x59, 0x7a, 0x64, 0x4d, 0x66, 0x4a, 0x74, 0x50, 0x58, 0x56, 0x79, 0x47, 0x6b, 0x47, 0x63, \n\t0x4a, 0x61, 0x72, 0x52, 0x44, 0x48, 0x4e, 0x57, 0x75, 0x55, 0x78, 0x63, 0x74, 0x31, 0x5a, 0x74, 0x2f, 0x37, \n\t0x7a, 0x56, 0x64, 0x38, 0x72, 0x52, 0x44, 0x2f, 0x49, 0x74, 0x79, 0x65, 0x79, 0x34, 0x2f, 0x36, 0x68, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x52, 0x44, 0x76, 0x46, 0x2b, 0x35, 0x66, 0x5a, 0x63, 0x66, 0x74, 0x51, 0x7a, 0x6f, 0x68, 0x31, \n\t0x69, 0x50, 0x77, 0x6a, 0x51, 0x48, 0x59, 0x74, 0x36, 0x52, 0x72, 0x52, 0x44, 0x2f, 0x4b, 0x35, 0x79, 0x65, \n\t0x79, 0x34, 0x2f, 0x36, 0x68, 0x6e, 0x52, 0x44, 0x76, 0x45, 0x75, 0x35, 0x66, 0x5a, 0x63, 0x66, 0x74, 0x51, \n\t0x7a, 0x59, 0x72, 0x47, 0x65, 0x2b, 0x41, 0x76, 0x6b, 0x4c, 0x43, 0x2f, 0x6e, 0x2f, 0x6d, 0x30, 0x66, 0x5c, 0x0a,\n\t0x09, 0x38, 0x76, 0x49, 0x62, 0x56, 0x52, 0x5a, 0x54, 0x62, 0x44, 0x30, 0x47, 0x62, 0x62, 0x6f, 0x38, 0x6d, \n\t0x47, 0x54, 0x44, 0x6f, 0x69, 0x64, 0x75, 0x41, 0x62, 0x35, 0x47, 0x7a, 0x6c, 0x70, 0x7a, 0x37, 0x6d, 0x2b, \n\t0x44, 0x77, 0x48, 0x54, 0x67, 0x67, 0x48, 0x62, 0x44, 0x46, 0x6a, 0x33, 0x78, 0x41, 0x57, 0x43, 0x7a, 0x51, \n\t0x62, 0x73, 0x75, 0x62, 0x5a, 0x73, 0x78, 0x43, 0x44, 0x44, 0x59, 0x62, 0x64, 0x6d, 0x66, 0x68, 0x42, 0x5c, 0x0a,\n\t0x09, 0x77, 0x42, 0x36, 0x67, 0x63, 0x47, 0x4f, 0x6f, 0x44, 0x76, 0x6b, 0x64, 0x56, 0x72, 0x2f, 0x52, 0x61, \n\t0x4e, 0x57, 0x7a, 0x31, 0x32, 0x37, 0x67, 0x65, 0x36, 0x6a, 0x64, 0x70, 0x32, 0x36, 0x65, 0x6e, 0x47, 0x4b, \n\t0x4d, 0x42, 0x67, 0x75, 0x33, 0x62, 0x69, 0x4a, 0x57, 0x43, 0x54, 0x59, 0x66, 0x73, 0x75, 0x44, 0x5a, 0x75, \n\t0x51, 0x4c, 0x4a, 0x69, 0x78, 0x50, 0x73, 0x5a, 0x71, 0x44, 0x50, 0x4a, 0x71, 0x32, 0x36, 0x54, 0x66, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x2b, 0x5a, 0x71, 0x39, 0x6a, 0x4a, 0x77, 0x41, 0x38, 0x61, 0x76, 0x53, 0x72, 0x42, 0x65, 0x78, \n\t0x54, 0x61, 0x4d, 0x62, 0x4e, 0x50, 0x65, 0x59, 0x58, 0x77, 0x64, 0x46, 0x35, 0x38, 0x64, 0x79, 0x48, 0x64, \n\t0x76, 0x2f, 0x71, 0x36, 0x50, 0x49, 0x70, 0x5a, 0x69, 0x44, 0x67, 0x4c, 0x58, 0x34, 0x66, 0x50, 0x48, 0x5a, \n\t0x64, 0x4b, 0x44, 0x66, 0x4f, 0x65, 0x46, 0x76, 0x41, 0x4b, 0x68, 0x71, 0x50, 0x58, 0x45, 0x51, 0x38, 0x5c, 0x0a,\n\t0x09, 0x69, 0x5a, 0x41, 0x31, 0x33, 0x49, 0x41, 0x58, 0x4d, 0x75, 0x54, 0x77, 0x50, 0x38, 0x38, 0x7a, 0x30, \n\t0x50, 0x46, 0x58, 0x58, 0x52, 0x6f, 0x68, 0x66, 0x46, 0x39, 0x77, 0x42, 0x7a, 0x6b, 0x58, 0x47, 0x79, 0x79, \n\t0x38, 0x73, 0x32, 0x35, 0x4c, 0x73, 0x74, 0x2f, 0x44, 0x64, 0x75, 0x79, 0x4c, 0x63, 0x6e, 0x58, 0x51, 0x54, \n\t0x63, 0x69, 0x77, 0x7a, 0x38, 0x78, 0x34, 0x59, 0x71, 0x77, 0x74, 0x56, 0x6c, 0x43, 0x41, 0x6e, 0x76, 0x5c, 0x0a,\n\t0x09, 0x52, 0x6d, 0x42, 0x50, 0x71, 0x43, 0x4a, 0x69, 0x65, 0x42, 0x6c, 0x6a, 0x4d, 0x7a, 0x4a, 0x2b, 0x75, \n\t0x67, 0x59, 0x35, 0x74, 0x36, 0x49, 0x31, 0x62, 0x44, 0x6e, 0x75, 0x47, 0x50, 0x71, 0x51, 0x35, 0x5a, 0x54, \n\t0x62, 0x6b, 0x61, 0x6d, 0x7a, 0x48, 0x38, 0x4f, 0x57, 0x45, 0x30, 0x65, 0x49, 0x6e, 0x61, 0x75, 0x4c, 0x62, \n\t0x78, 0x52, 0x31, 0x79, 0x66, 0x4d, 0x51, 0x75, 0x2b, 0x52, 0x35, 0x69, 0x46, 0x33, 0x79, 0x50, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x51, 0x75, 0x65, 0x58, 0x38, 0x42, 0x7a, 0x6f, 0x6b, 0x68, 0x69, 0x4d, 0x48, 0x75, 0x52, 0x6b, 0x30, \n\t0x41, 0x41, 0x41, 0x41, 0x41, 0x53, 0x55, 0x56, 0x4f, 0x52, 0x4b, 0x35, 0x43, 0x59, 0x49, 0x49, 0x3d, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x32, 0x40, 0x32, 0x78, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x62, 0x67, 0x5b, 0x32, 0x5d, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x32, 0x5f, 0x70, \n\t0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x65, 0x63, \n\t0x6f, 0x64, 0x65, 0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, \n\t0x34, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x57, 0x49, 0x41, 0x41, 0x41, 0x43, 0x6f, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x44, 0x61, 0x57, 0x4f, 0x51, 0x63, 0x41, 0x41, 0x41, 0x4d, 0x58, 0x55, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x34, 0x6e, 0x4f, 0x33, 0x64, 0x65, 0x36, 0x7a, 0x66, 0x38, 0x78, 0x33, 0x48, 0x38, 0x65, 0x5c, 0x0a,\n\t0x09, 0x66, 0x52, 0x39, 0x6b, 0x51, 0x78, 0x70, 0x5a, 0x32, 0x57, 0x43, 0x6b, 0x71, 0x72, 0x4f, 0x6c, 0x4b, \n\t0x72, 0x75, 0x6c, 0x39, 0x4b, 0x6d, 0x64, 0x73, 0x32, 0x6d, 0x35, 0x6c, 0x74, 0x68, 0x73, 0x30, 0x6c, 0x77, \n\t0x31, 0x6f, 0x57, 0x68, 0x4d, 0x7a, 0x63, 0x5a, 0x74, 0x6e, 0x4d, 0x4e, 0x72, 0x4b, 0x34, 0x7a, 0x55, 0x7a, \n\t0x53, 0x32, 0x4e, 0x6a, 0x46, 0x7a, 0x44, 0x57, 0x32, 0x6d, 0x57, 0x78, 0x7a, 0x4e, 0x35, 0x4e, 0x69, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x73, 0x68, 0x51, 0x72, 0x62, 0x6d, 0x55, 0x4d, 0x6b, 0x78, 0x72, 0x53, 0x74, 0x65, 0x71, 0x37, \n\t0x6f, 0x2b, 0x50, 0x45, 0x31, 0x58, 0x56, 0x38, 0x2f, 0x75, 0x64, 0x38, 0x2f, 0x76, 0x39, 0x33, 0x70, 0x2f, \n\t0x50, 0x39, 0x2f, 0x74, 0x38, 0x4a, 0x4a, 0x4b, 0x6d, 0x4f, 0x65, 0x6c, 0x35, 0x35, 0x63, 0x6a, 0x76, 0x64, \n\t0x64, 0x36, 0x2f, 0x7a, 0x2b, 0x2f, 0x7a, 0x2f, 0x58, 0x79, 0x36, 0x6c, 0x69, 0x78, 0x5a, 0x67, 0x69, 0x5c, 0x0a,\n\t0x09, 0x51, 0x70, 0x7a, 0x6b, 0x72, 0x52, 0x41, 0x53, 0x53, 0x70, 0x37, 0x69, 0x78, 0x69, 0x53, 0x51, 0x70, \n\t0x6d, 0x45, 0x55, 0x74, 0x53, 0x4d, 0x49, 0x74, 0x59, 0x6b, 0x6f, 0x4a, 0x5a, 0x78, 0x4a, 0x49, 0x55, 0x7a, \n\t0x43, 0x4b, 0x57, 0x70, 0x47, 0x41, 0x57, 0x73, 0x53, 0x51, 0x46, 0x73, 0x34, 0x67, 0x6c, 0x4b, 0x5a, 0x68, \n\t0x46, 0x4c, 0x45, 0x6e, 0x42, 0x42, 0x6b, 0x59, 0x48, 0x6b, 0x44, 0x49, 0x77, 0x41, 0x4e, 0x67, 0x55, 0x5c, 0x0a,\n\t0x09, 0x32, 0x42, 0x4c, 0x59, 0x47, 0x42, 0x67, 0x48, 0x72, 0x41, 0x75, 0x4d, 0x41, 0x4e, 0x59, 0x45, 0x68, \n\t0x69, 0x7a, 0x7a, 0x39, 0x51, 0x75, 0x41, 0x56, 0x34, 0x41, 0x58, 0x67, 0x57, 0x65, 0x42, 0x70, 0x34, 0x42, \n\t0x2f, 0x41, 0x67, 0x38, 0x42, 0x2f, 0x77, 0x44, 0x65, 0x37, 0x45, 0x52, 0x6f, 0x56, 0x55, 0x65, 0x58, 0x6a, \n\t0x7a, 0x69, 0x72, 0x70, 0x72, 0x59, 0x41, 0x39, 0x67, 0x4c, 0x32, 0x41, 0x4c, 0x59, 0x44, 0x56, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x52, 0x76, 0x37, 0x73, 0x49, 0x65, 0x41, 0x43, 0x34, 0x44, 0x62, 0x67, 0x4a, 0x2b, 0x43, 0x76, \n\t0x77, 0x56, 0x6f, 0x76, 0x2b, 0x62, 0x56, 0x57, 0x55, 0x52, 0x61, 0x77, 0x36, 0x47, 0x51, 0x38, 0x63, 0x44, \n\t0x48, 0x77, 0x65, 0x32, 0x4b, 0x68, 0x44, 0x33, 0x2f, 0x4e, 0x6c, 0x34, 0x46, 0x72, 0x67, 0x56, 0x38, 0x42, \n\t0x66, 0x41, 0x46, 0x39, 0x77, 0x65, 0x68, 0x2b, 0x4c, 0x57, 0x46, 0x55, 0x33, 0x45, 0x50, 0x67, 0x69, 0x5c, 0x0a,\n\t0x09, 0x63, 0x44, 0x53, 0x77, 0x66, 0x58, 0x43, 0x57, 0x47, 0x63, 0x44, 0x46, 0x77, 0x4b, 0x58, 0x41, 0x36, \n\t0x38, 0x46, 0x5a, 0x6c, 0x42, 0x47, 0x4c, 0x57, 0x46, 0x58, 0x56, 0x44, 0x52, 0x77, 0x42, 0x6e, 0x41, 0x52, \n\t0x73, 0x45, 0x4a, 0x78, 0x6c, 0x57, 0x58, 0x4f, 0x42, 0x43, 0x34, 0x44, 0x7a, 0x33, 0x2f, 0x6d, 0x7a, 0x61, \n\t0x73, 0x34, 0x69, 0x56, 0x74, 0x56, 0x30, 0x6b, 0x53, 0x62, 0x67, 0x73, 0x34, 0x41, 0x4e, 0x67, 0x37, 0x5c, 0x0a,\n\t0x09, 0x50, 0x30, 0x5a, 0x68, 0x37, 0x77, 0x48, 0x65, 0x41, 0x69, 0x59, 0x47, 0x46, 0x77, 0x46, 0x67, 0x57, \n\t0x79, 0x69, 0x46, 0x55, 0x6c, 0x6d, 0x35, 0x4c, 0x65, 0x2b, 0x75, 0x38, 0x53, 0x48, 0x61, 0x52, 0x4a, 0x4d, \n\t0x34, 0x43, 0x70, 0x77, 0x4b, 0x33, 0x52, 0x51, 0x52, 0x54, 0x44, 0x66, 0x63, 0x53, 0x71, 0x67, 0x67, 0x48, \n\t0x41, 0x4b, 0x63, 0x43, 0x44, 0x6c, 0x46, 0x66, 0x43, 0x41, 0x47, 0x4f, 0x42, 0x57, 0x34, 0x42, 0x70, 0x5c, 0x0a,\n\t0x09, 0x77, 0x47, 0x72, 0x42, 0x57, 0x52, 0x54, 0x41, 0x69, 0x56, 0x69, 0x6c, 0x57, 0x77, 0x2b, 0x34, 0x45, \n\t0x74, 0x67, 0x68, 0x4f, 0x6b, 0x69, 0x4c, 0x7a, 0x41, 0x49, 0x4f, 0x42, 0x4f, 0x36, 0x4c, 0x44, 0x71, 0x4c, \n\t0x4f, 0x63, 0x53, 0x4a, 0x57, 0x79, 0x54, 0x35, 0x47, 0x32, 0x72, 0x4e, 0x62, 0x6c, 0x52, 0x49, 0x47, 0x47, \n\t0x45, 0x33, 0x61, 0x35, 0x6e, 0x5a, 0x45, 0x64, 0x42, 0x42, 0x31, 0x6a, 0x6b, 0x57, 0x73, 0x55, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x30, 0x42, 0x2f, 0x67, 0x52, 0x38, 0x4f, 0x44, 0x70, 0x49, 0x47, 0x33, 0x53, 0x54, 0x6c, 0x69, 0x6b, \n\t0x75, 0x4a, 0x43, 0x32, 0x37, 0x71, 0x4f, 0x4a, 0x63, 0x6d, 0x6c, 0x42, 0x70, 0x75, 0x6f, 0x41, 0x7a, 0x67, \n\t0x64, 0x4f, 0x69, 0x67, 0x33, 0x54, 0x49, 0x39, 0x61, 0x52, 0x64, 0x49, 0x4f, 0x36, 0x71, 0x71, 0x44, 0x43, \n\t0x4c, 0x57, 0x43, 0x58, 0x70, 0x49, 0x75, 0x32, 0x4b, 0x6d, 0x42, 0x49, 0x64, 0x70, 0x4d, 0x4e, 0x75, 0x5c, 0x0a,\n\t0x09, 0x42, 0x76, 0x59, 0x46, 0x33, 0x6f, 0x67, 0x4f, 0x6f, 0x76, 0x5a, 0x77, 0x61, 0x55, 0x49, 0x6c, 0x75, \n\t0x5a, 0x44, 0x36, 0x6c, 0x54, 0x44, 0x41, 0x37, 0x71, 0x54, 0x4a, 0x75, 0x44, 0x73, 0x36, 0x69, 0x4e, 0x72, \n\t0x44, 0x69, 0x56, 0x68, 0x39, 0x4d, 0x5a, 0x44, 0x30, 0x73, 0x4d, 0x51, 0x6d, 0x70, 0x41, 0x2b, 0x58, 0x31, \n\t0x67, 0x47, 0x47, 0x41, 0x32, 0x75, 0x54, 0x44, 0x73, 0x38, 0x5a, 0x79, 0x4c, 0x76, 0x62, 0x73, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x34, 0x67, 0x6e, 0x56, 0x59, 0x32, 0x6c, 0x33, 0x52, 0x69, 0x32, 0x52, 0x78, 0x67, 0x4e, 0x76, 0x41, \n\t0x45, 0x4d, 0x4a, 0x4e, 0x30, 0x65, 0x6c, 0x6b, 0x6a, 0x7a, 0x67, 0x43, 0x2b, 0x33, 0x5a, 0x72, 0x34, 0x78, \n\t0x62, 0x71, 0x4f, 0x64, 0x45, 0x37, 0x47, 0x32, 0x39, 0x46, 0x42, 0x31, 0x46, 0x6f, 0x57, 0x73, 0x52, 0x71, \n\t0x78, 0x50, 0x72, 0x41, 0x62, 0x73, 0x43, 0x32, 0x77, 0x46, 0x54, 0x43, 0x42, 0x31, 0x68, 0x32, 0x68, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x69, 0x70, 0x70, 0x2f, 0x2b, 0x39, 0x30, 0x34, 0x43, 0x37, 0x53, 0x6a, 0x6f, 0x48, 0x58, 0x6c, \n\t0x76, 0x6d, 0x61, 0x51, 0x34, 0x48, 0x4c, 0x57, 0x76, 0x54, 0x39, 0x53, 0x6e, 0x63, 0x75, 0x63, 0x47, 0x4a, \n\t0x30, 0x43, 0x4c, 0x57, 0x57, 0x52, 0x61, 0x7a, 0x6c, 0x47, 0x51, 0x42, 0x4d, 0x42, 0x6a, 0x35, 0x44, 0x4f, \n\t0x69, 0x70, 0x79, 0x34, 0x77, 0x35, 0x2b, 0x37, 0x37, 0x65, 0x41, 0x32, 0x34, 0x48, 0x66, 0x41, 0x37, 0x5c, 0x0a,\n\t0x09, 0x38, 0x6c, 0x54, 0x64, 0x70, 0x33, 0x34, 0x74, 0x76, 0x79, 0x70, 0x52, 0x32, 0x4f, 0x76, 0x35, 0x67, \n\t0x71, 0x78, 0x53, 0x4c, 0x57, 0x30, 0x69, 0x59, 0x41, 0x52, 0x35, 0x4c, 0x65, 0x2f, 0x71, 0x34, 0x56, 0x6e, \n\t0x4b, 0x58, 0x48, 0x49, 0x6d, 0x42, 0x51, 0x64, 0x49, 0x6a, 0x4d, 0x4c, 0x43, 0x43, 0x64, 0x4a, 0x50, 0x64, \n\t0x67, 0x64, 0x42, 0x43, 0x31, 0x68, 0x6b, 0x57, 0x73, 0x62, 0x75, 0x41, 0x67, 0x30, 0x6a, 0x47, 0x52, 0x5c, 0x0a,\n\t0x09, 0x57, 0x77, 0x64, 0x6e, 0x55, 0x65, 0x4d, 0x65, 0x41, 0x79, 0x62, 0x69, 0x62, 0x53, 0x43, 0x56, 0x34, \n\t0x4b, 0x36, 0x4a, 0x2b, 0x6c, 0x6f, 0x4e, 0x4f, 0x49, 0x48, 0x30, 0x53, 0x4f, 0x33, 0x50, 0x73, 0x49, 0x52, \n\t0x4c, 0x4d, 0x77, 0x34, 0x34, 0x4f, 0x7a, 0x71, 0x45, 0x57, 0x73, 0x4f, 0x4a, 0x75, 0x48, 0x34, 0x47, 0x41, \n\t0x6b, 0x63, 0x42, 0x33, 0x79, 0x54, 0x74, 0x63, 0x6c, 0x43, 0x35, 0x6c, 0x67, 0x41, 0x37, 0x41, 0x76, 0x5c, 0x0a,\n\t0x09, 0x64, 0x45, 0x42, 0x31, 0x48, 0x2f, 0x57, 0x4d, 0x54, 0x31, 0x73, 0x6a, 0x66, 0x77, 0x49, 0x32, 0x42, \n\t0x4d, 0x64, 0x42, 0x43, 0x31, 0x7a, 0x4d, 0x4f, 0x6b, 0x2b, 0x2f, 0x63, 0x57, 0x52, 0x77, 0x64, 0x52, 0x33, \n\t0x37, 0x6b, 0x30, 0x55, 0x51, 0x38, 0x6a, 0x67, 0x61, 0x74, 0x4a, 0x6c, 0x31, 0x6c, 0x61, 0x77, 0x74, 0x55, \n\t0x79, 0x48, 0x67, 0x38, 0x49, 0x4b, 0x70, 0x34, 0x54, 0x63, 0x66, 0x55, 0x64, 0x53, 0x48, 0x6f, 0x73, 0x5c, 0x0a,\n\t0x09, 0x65, 0x49, 0x33, 0x6f, 0x49, 0x47, 0x71, 0x62, 0x46, 0x30, 0x69, 0x58, 0x6f, 0x66, 0x72, 0x42, 0x58, \n\t0x61, 0x47, 0x63, 0x69, 0x4b, 0x76, 0x72, 0x51, 0x38, 0x43, 0x76, 0x67, 0x53, 0x75, 0x77, 0x68, 0x4b, 0x74, \n\t0x75, 0x62, 0x65, 0x42, 0x72, 0x30, 0x53, 0x48, 0x55, 0x64, 0x30, 0x37, 0x45, 0x31, 0x62, 0x51, 0x5a, 0x36, \n\t0x58, 0x48, 0x59, 0x73, 0x64, 0x46, 0x42, 0x31, 0x44, 0x45, 0x76, 0x6b, 0x43, 0x35, 0x4a, 0x39, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x53, 0x32, 0x41, 0x6a, 0x6b, 0x52, 0x56, 0x38, 0x39, 0x2b, 0x70, 0x4d, 0x65, 0x46, 0x4c, 0x65, 0x46, \n\t0x36, 0x57, 0x52, 0x73, 0x34, 0x4f, 0x44, 0x71, 0x45, 0x2b, 0x73, 0x59, 0x69, 0x72, 0x70, 0x62, 0x6a, 0x67, \n\t0x57, 0x75, 0x41, 0x56, 0x61, 0x4f, 0x44, 0x4b, 0x4d, 0x54, 0x55, 0x36, 0x41, 0x44, 0x71, 0x47, 0x34, 0x75, \n\t0x34, 0x47, 0x72, 0x71, 0x41, 0x63, 0x34, 0x44, 0x7a, 0x38, 0x50, 0x39, 0x70, 0x6e, 0x57, 0x30, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x66, 0x44, 0x51, 0x36, 0x68, 0x4a, 0x72, 0x6e, 0x69, 0x37, 0x5a, 0x38, 0x50, 0x59, 0x65, 0x6c, 0x66, \n\t0x7a, 0x30, 0x36, 0x69, 0x4c, 0x4a, 0x77, 0x59, 0x48, 0x51, 0x41, 0x4e, 0x63, 0x38, 0x50, 0x36, 0x38, 0x72, \n\t0x33, 0x45, 0x2b, 0x70, 0x35, 0x57, 0x4c, 0x71, 0x57, 0x37, 0x79, 0x6e, 0x53, 0x57, 0x64, 0x45, 0x71, 0x69, \n\t0x42, 0x4e, 0x78, 0x32, 0x63, 0x37, 0x45, 0x45, 0x74, 0x5a, 0x37, 0x6a, 0x51, 0x49, 0x32, 0x6a, 0x77, 0x5c, 0x0a,\n\t0x09, 0x36, 0x68, 0x35, 0x6c, 0x6a, 0x45, 0x35, 0x54, 0x6f, 0x57, 0x4f, 0x44, 0x30, 0x36, 0x68, 0x4c, 0x4b, \n\t0x30, 0x64, 0x33, 0x51, 0x41, 0x4e, 0x63, 0x63, 0x69, 0x4c, 0x74, 0x50, 0x65, 0x70, 0x41, 0x2f, 0x6d, 0x70, \n\t0x4f, 0x58, 0x5a, 0x4e, 0x54, 0x71, 0x41, 0x6d, 0x75, 0x4d, 0x61, 0x63, 0x64, 0x36, 0x36, 0x53, 0x56, 0x76, \n\t0x52, 0x68, 0x70, 0x41, 0x4f, 0x41, 0x33, 0x38, 0x64, 0x57, 0x4a, 0x65, 0x30, 0x54, 0x33, 0x68, 0x49, 0x5c, 0x0a,\n\t0x09, 0x59, 0x43, 0x37, 0x6c, 0x62, 0x52, 0x34, 0x77, 0x46, 0x4f, 0x2b, 0x32, 0x4b, 0x34, 0x5a, 0x46, 0x6e, \n\t0x49, 0x64, 0x31, 0x67, 0x55, 0x6d, 0x6b, 0x4f, 0x2b, 0x48, 0x47, 0x6b, 0x4b, 0x34, 0x6d, 0x47, 0x6b, 0x33, \n\t0x72, 0x37, 0x6f, 0x56, 0x54, 0x2f, 0x59, 0x77, 0x44, 0x48, 0x6f, 0x38, 0x4f, 0x6f, 0x63, 0x62, 0x34, 0x51, \n\t0x6f, 0x2b, 0x7a, 0x48, 0x57, 0x6d, 0x72, 0x30, 0x53, 0x64, 0x4a, 0x70, 0x53, 0x75, 0x31, 0x30, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x67, 0x73, 0x34, 0x6d, 0x4a, 0x59, 0x78, 0x4a, 0x32, 0x31, 0x42, 0x76, 0x42, 0x56, 0x30, 0x73, 0x48, \n\t0x73, 0x47, 0x77, 0x56, 0x6e, 0x55, 0x62, 0x56, 0x74, 0x47, 0x68, 0x31, 0x41, 0x6a, 0x62, 0x4f, 0x49, 0x4f, \n\t0x32, 0x4d, 0x34, 0x63, 0x42, 0x4b, 0x70, 0x68, 0x46, 0x63, 0x4c, 0x7a, 0x71, 0x4a, 0x36, 0x63, 0x43, 0x39, \n\t0x78, 0x51, 0x53, 0x7a, 0x69, 0x39, 0x75, 0x6f, 0x6d, 0x48, 0x55, 0x2f, 0x34, 0x4c, 0x57, 0x44, 0x31, 0x5c, 0x0a,\n\t0x09, 0x34, 0x43, 0x79, 0x71, 0x6c, 0x2f, 0x57, 0x69, 0x41, 0x36, 0x68, 0x78, 0x46, 0x6e, 0x48, 0x37, 0x62, \n\t0x41, 0x58, 0x38, 0x67, 0x76, 0x53, 0x68, 0x69, 0x64, 0x52, 0x70, 0x49, 0x36, 0x49, 0x44, 0x71, 0x48, 0x48, \n\t0x75, 0x49, 0x32, 0x36, 0x39, 0x41, 0x63, 0x43, 0x70, 0x70, 0x41, 0x73, 0x64, 0x4c, 0x57, 0x46, 0x46, 0x47, \n\t0x52, 0x59, 0x64, 0x51, 0x49, 0x31, 0x7a, 0x49, 0x6d, 0x36, 0x74, 0x4e, 0x59, 0x48, 0x66, 0x41, 0x48, 0x5c, 0x0a,\n\t0x09, 0x74, 0x45, 0x42, 0x31, 0x48, 0x74, 0x72, 0x52, 0x49, 0x64, 0x51, 0x49, 0x32, 0x7a, 0x69, 0x46, 0x74, \n\t0x6e, 0x46, 0x50, 0x42, 0x48, 0x50, 0x4a, 0x42, 0x64, 0x55, 0x70, 0x4d, 0x73, 0x34, 0x74, 0x59, 0x59, 0x41, \n\t0x39, 0x78, 0x4f, 0x65, 0x6a, 0x42, 0x44, 0x6b, 0x70, 0x72, 0x69, 0x47, 0x6e, 0x48, 0x2f, 0x57, 0x63, 0x4c, \n\t0x4b, 0x6b, 0x54, 0x63, 0x36, 0x46, 0x38, 0x51, 0x69, 0x37, 0x70, 0x39, 0x68, 0x70, 0x4f, 0x55, 0x49, 0x5c, 0x0a,\n\t0x09, 0x53, 0x31, 0x69, 0x35, 0x2b, 0x56, 0x39, 0x30, 0x41, 0x44, 0x58, 0x4f, 0x49, 0x75, 0x36, 0x37, 0x67, \n\t0x63, 0x44, 0x56, 0x2b, 0x49, 0x53, 0x63, 0x38, 0x72, 0x51, 0x4f, 0x63, 0x44, 0x37, 0x75, 0x4a, 0x79, 0x36, \n\t0x43, 0x52, 0x64, 0x78, 0x33, 0x50, 0x38, 0x54, 0x6a, 0x42, 0x70, 0x57, 0x76, 0x62, 0x75, 0x41, 0x34, 0x59, \n\t0x42, 0x5a, 0x77, 0x43, 0x62, 0x35, 0x72, 0x79, 0x35, 0x71, 0x6e, 0x72, 0x2f, 0x58, 0x4e, 0x6e, 0x71, 0x5c, 0x0a,\n\t0x09, 0x51, 0x6c, 0x43, 0x61, 0x6b, 0x55, 0x38, 0x34, 0x47, 0x7a, 0x53, 0x41, 0x50, 0x45, 0x6f, 0x75, 0x41, \n\t0x73, 0x57, 0x6f, 0x5a, 0x46, 0x33, 0x4c, 0x7a, 0x56, 0x67, 0x55, 0x66, 0x77, 0x4c, 0x5a, 0x2f, 0x4b, 0x39, \n\t0x44, 0x42, 0x77, 0x4b, 0x50, 0x44, 0x33, 0x36, 0x43, 0x42, 0x36, 0x6c, 0x30, 0x73, 0x54, 0x7a, 0x66, 0x73, \n\t0x42, 0x6c, 0x72, 0x44, 0x4b, 0x4e, 0x5a, 0x35, 0x30, 0x73, 0x63, 0x43, 0x4a, 0x70, 0x42, 0x76, 0x41, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x51, 0x45, 0x6e, 0x34, 0x75, 0x61, 0x4d, 0x49, 0x30, 0x33, 0x44, 0x41, 0x36, 0x4b, 0x44, 0x53, \n\t0x43, 0x31, 0x77, 0x48, 0x58, 0x41, 0x49, 0x61, 0x64, 0x6c, 0x43, 0x67, 0x5a, 0x79, 0x49, 0x6d, 0x2f, 0x4d, \n\t0x39, 0x4c, 0x47, 0x46, 0x56, 0x78, 0x32, 0x65, 0x42, 0x75, 0x34, 0x43, 0x52, 0x30, 0x55, 0x48, 0x71, 0x7a, \n\t0x6f, 0x6d, 0x34, 0x63, 0x56, 0x73, 0x41, 0x44, 0x30, 0x53, 0x48, 0x6b, 0x4e, 0x72, 0x67, 0x53, 0x57, 0x5c, 0x0a,\n\t0x09, 0x41, 0x76, 0x59, 0x47, 0x5a, 0x30, 0x6b, 0x4c, 0x70, 0x79, 0x49, 0x6d, 0x37, 0x63, 0x73, 0x64, 0x45, \n\t0x42, 0x70, 0x44, 0x62, 0x5a, 0x69, 0x50, 0x52, 0x30, 0x36, 0x4a, 0x6a, 0x67, 0x48, 0x4c, 0x58, 0x6c, 0x52, \n\t0x4e, 0x79, 0x59, 0x59, 0x63, 0x42, 0x73, 0x59, 0x4f, 0x58, 0x6f, 0x49, 0x46, 0x49, 0x62, 0x50, 0x51, 0x58, \n\t0x73, 0x41, 0x4d, 0x77, 0x4a, 0x7a, 0x6c, 0x45, 0x37, 0x54, 0x73, 0x53, 0x4e, 0x4f, 0x51, 0x68, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x57, 0x4e, 0x55, 0x33, 0x43, 0x76, 0x67, 0x44, 0x73, 0x47, 0x70, 0x77, 0x6a, 0x74, 0x71, 0x78, 0x69, \n\t0x42, 0x75, 0x7a, 0x66, 0x33, 0x51, 0x41, 0x71, 0x55, 0x4d, 0x6d, 0x41, 0x4a, 0x66, 0x6a, 0x31, 0x72, 0x61, \n\t0x4f, 0x73, 0x6f, 0x68, 0x37, 0x4e, 0x78, 0x79, 0x59, 0x46, 0x42, 0x31, 0x43, 0x36, 0x71, 0x44, 0x39, 0x67, \n\t0x65, 0x4f, 0x6a, 0x51, 0x39, 0x53, 0x4a, 0x52, 0x64, 0x79, 0x37, 0x33, 0x66, 0x48, 0x6e, 0x70, 0x50, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x35, 0x6d, 0x7a, 0x51, 0x64, 0x71, 0x77, 0x4d, 0x73, 0x6d, 0x4e, 0x37, 0x74, 0x45, 0x42, 0x31, \n\t0x41, 0x43, 0x6a, 0x43, 0x49, 0x74, 0x45, 0x51, 0x78, 0x4b, 0x44, 0x70, 0x49, 0x48, 0x56, 0x6a, 0x45, 0x76, \n\t0x64, 0x73, 0x32, 0x4f, 0x6f, 0x41, 0x55, 0x5a, 0x48, 0x50, 0x53, 0x6f, 0x39, 0x42, 0x71, 0x4d, 0x37, 0x65, \n\t0x76, 0x72, 0x64, 0x68, 0x41, 0x30, 0x6b, 0x30, 0x48, 0x58, 0x69, 0x6d, 0x6c, 0x75, 0x6e, 0x6f, 0x54, 0x5c, 0x0a,\n\t0x09, 0x47, 0x49, 0x31, 0x62, 0x32, 0x74, 0x72, 0x4b, 0x69, 0x58, 0x6a, 0x46, 0x52, 0x6d, 0x49, 0x4a, 0x71, \n\t0x39, 0x34, 0x47, 0x41, 0x36, 0x64, 0x47, 0x68, 0x36, 0x67, 0x36, 0x4a, 0x2b, 0x49, 0x56, 0x6d, 0x77, 0x54, \n\t0x63, 0x47, 0x52, 0x31, 0x43, 0x43, 0x72, 0x61, 0x49, 0x39, 0x4e, 0x54, 0x64, 0x4d, 0x30, 0x76, 0x39, 0x58, \n\t0x52, 0x63, 0x77, 0x68, 0x4c, 0x54, 0x6e, 0x2b, 0x43, 0x33, 0x53, 0x31, 0x55, 0x79, 0x76, 0x76, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x6e, 0x4e, 0x63, 0x6c, 0x70, 0x37, 0x34, 0x4f, 0x74, 0x42, 0x33, 0x77, 0x36, 0x4f, 0x6f, 0x53, \n\t0x55, 0x67, 0x55, 0x47, 0x6b, 0x6b, 0x39, 0x70, 0x65, 0x42, 0x74, 0x59, 0x6e, 0x50, 0x66, 0x67, 0x78, 0x2b, \n\t0x41, 0x4f, 0x2b, 0x64, 0x69, 0x37, 0x77, 0x48, 0x4f, 0x6b, 0x70, 0x76, 0x52, 0x6e, 0x41, 0x51, 0x38, 0x42, \n\t0x39, 0x77, 0x4b, 0x50, 0x41, 0x32, 0x32, 0x33, 0x4f, 0x57, 0x53, 0x77, 0x6e, 0x34, 0x6e, 0x63, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x49, 0x52, 0x58, 0x76, 0x78, 0x34, 0x47, 0x64, 0x38, 0x4d, 0x78, 0x68, 0x71, 0x5a, 0x58, 0x6d, 0x41, \n\t0x6e, 0x63, 0x41, 0x4e, 0x77, 0x47, 0x2f, 0x41, 0x35, 0x36, 0x50, 0x6a, 0x5a, 0x4f, 0x58, 0x75, 0x68, 0x64, \n\t0x78, 0x4e, 0x2b, 0x6b, 0x6f, 0x77, 0x49, 0x4e, 0x4a, 0x31, 0x78, 0x39, 0x31, 0x78, 0x38, 0x61, 0x52, 0x61, \n\t0x6d, 0x45, 0x4a, 0x63, 0x44, 0x64, 0x77, 0x47, 0x58, 0x41, 0x6c, 0x6e, 0x6f, 0x64, 0x63, 0x32, 0x79, 0x5c, 0x0a,\n\t0x09, 0x49, 0x65, 0x41, 0x55, 0x78, 0x35, 0x35, 0x37, 0x2b, 0x31, 0x67, 0x37, 0x4e, 0x49, 0x64, 0x66, 0x5a, \n\t0x66, 0x59, 0x42, 0x70, 0x77, 0x41, 0x65, 0x39, 0x64, 0x67, 0x36, 0x36, 0x56, 0x75, 0x68, 0x58, 0x78, 0x4d, \n\t0x4f, 0x41, 0x55, 0x34, 0x42, 0x67, 0x38, 0x78, 0x45, 0x66, 0x4b, 0x79, 0x53, 0x4c, 0x67, 0x70, 0x36, 0x51, \n\t0x4c, 0x54, 0x70, 0x38, 0x4e, 0x7a, 0x74, 0x4a, 0x78, 0x64, 0x53, 0x6e, 0x69, 0x62, 0x74, 0x4c, 0x47, 0x5c, 0x0a,\n\t0x09, 0x39, 0x47, 0x2b, 0x51, 0x31, 0x6f, 0x49, 0x6c, 0x35, 0x57, 0x6b, 0x42, 0x36, 0x66, 0x48, 0x71, 0x63, \n\t0x34, 0x41, 0x33, 0x67, 0x72, 0x4e, 0x30, 0x54, 0x42, 0x32, 0x4b, 0x65, 0x42, 0x76, 0x53, 0x62, 0x39, 0x72, \n\t0x4e, 0x6f, 0x6f, 0x4e, 0x49, 0x61, 0x74, 0x69, 0x2f, 0x67, 0x4b, 0x4f, 0x41, 0x6d, 0x36, 0x4f, 0x44, 0x64, \n\t0x45, 0x4b, 0x56, 0x48, 0x2b, 0x6a, 0x6f, 0x4a, 0x76, 0x31, 0x57, 0x76, 0x51, 0x64, 0x4c, 0x57, 0x43, 0x5c, 0x0a,\n\t0x09, 0x72, 0x4e, 0x68, 0x73, 0x43, 0x66, 0x67, 0x59, 0x75, 0x6f, 0x77, 0x54, 0x4a, 0x69, 0x56, 0x53, 0x66, \n\t0x69, 0x55, 0x63, 0x43, 0x31, 0x77, 0x4d, 0x54, 0x67, 0x48, 0x4a, 0x4c, 0x36, 0x37, 0x32, 0x46, 0x67, 0x50, \n\t0x32, 0x42, 0x57, 0x64, 0x4a, 0x42, 0x32, 0x71, 0x65, 0x4a, 0x45, 0x76, 0x41, 0x74, 0x77, 0x50, 0x35, 0x61, \n\t0x77, 0x56, 0x42, 0x58, 0x6a, 0x53, 0x61, 0x2f, 0x70, 0x33, 0x61, 0x4f, 0x44, 0x74, 0x45, 0x76, 0x56, 0x5c, 0x0a,\n\t0x09, 0x69, 0x76, 0x67, 0x41, 0x30, 0x74, 0x75, 0x5a, 0x59, 0x64, 0x46, 0x42, 0x4a, 0x4c, 0x58, 0x55, 0x47, \n\t0x71, 0x52, 0x72, 0x6e, 0x41, 0x36, 0x50, 0x44, 0x74, 0x49, 0x4f, 0x56, 0x53, 0x72, 0x69, 0x71, 0x61, 0x54, \n\t0x4e, 0x34, 0x5a, 0x36, 0x66, 0x4b, 0x6c, 0x58, 0x54, 0x49, 0x4e, 0x49, 0x48, 0x37, 0x30, 0x64, 0x48, 0x42, \n\t0x32, 0x6d, 0x31, 0x71, 0x68, 0x54, 0x78, 0x56, 0x4f, 0x44, 0x69, 0x36, 0x42, 0x43, 0x53, 0x4f, 0x75, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x48, 0x70, 0x4e, 0x64, 0x38, 0x5a, 0x56, 0x54, 0x68, 0x77, 0x37, 0x6f, 0x44, 0x67, 0x43, 0x75, \n\t0x6f, 0x7a, 0x69, 0x38, 0x56, 0x53, 0x59, 0x33, 0x35, 0x4d, 0x76, 0x44, 0x4c, 0x36, 0x42, 0x43, 0x74, 0x55, \n\t0x48, 0x6f, 0x52, 0x54, 0x77, 0x4a, 0x75, 0x77, 0x65, 0x55, 0x49, 0x71, 0x59, 0x34, 0x57, 0x6b, 0x63, 0x36, \n\t0x49, 0x75, 0x54, 0x30, 0x34, 0x52, 0x37, 0x2b, 0x56, 0x58, 0x4d, 0x51, 0x62, 0x6b, 0x49, 0x37, 0x58, 0x5c, 0x0a,\n\t0x09, 0x57, 0x79, 0x73, 0x36, 0x69, 0x4b, 0x51, 0x77, 0x2f, 0x79, 0x48, 0x74, 0x6b, 0x48, 0x6f, 0x36, 0x4f, \n\t0x6b, 0x68, 0x2f, 0x6c, 0x50, 0x70, 0x32, 0x66, 0x68, 0x42, 0x77, 0x46, 0x5a, 0x61, 0x77, 0x56, 0x48, 0x64, \n\t0x44, 0x53, 0x63, 0x38, 0x4d, 0x46, 0x48, 0x31, 0x79, 0x59, 0x71, 0x6c, 0x46, 0x66, 0x43, 0x62, 0x70, 0x30, \n\t0x57, 0x56, 0x4a, 0x32, 0x68, 0x4c, 0x34, 0x62, 0x6e, 0x53, 0x49, 0x2f, 0x69, 0x68, 0x78, 0x61, 0x57, 0x5c, 0x0a,\n\t0x09, 0x49, 0x69, 0x63, 0x43, 0x38, 0x77, 0x49, 0x44, 0x71, 0x49, 0x70, 0x47, 0x77, 0x73, 0x49, 0x58, 0x31, \n\t0x6d, 0x64, 0x48, 0x64, 0x30, 0x6b, 0x4c, 0x34, 0x6f, 0x72, 0x59, 0x67, 0x48, 0x6b, 0x6b, 0x70, 0x34, 0x69, \n\t0x2b, 0x67, 0x67, 0x6b, 0x72, 0x4c, 0x7a, 0x4b, 0x44, 0x41, 0x42, 0x57, 0x42, 0x67, 0x64, 0x70, 0x46, 0x6d, \n\t0x6c, 0x4c, 0x55, 0x30, 0x63, 0x68, 0x79, 0x55, 0x73, 0x61, 0x66, 0x6b, 0x2b, 0x51, 0x75, 0x71, 0x49, 0x5c, 0x0a,\n\t0x09, 0x34, 0x70, 0x51, 0x30, 0x45, 0x61, 0x38, 0x42, 0x7a, 0x4d, 0x54, 0x48, 0x6c, 0x79, 0x56, 0x39, 0x73, \n\t0x4e, 0x65, 0x41, 0x30, 0x61, 0x53, 0x4c, 0x54, 0x6f, 0x74, 0x52, 0x30, 0x6b, 0x52, 0x38, 0x41, 0x70, 0x61, \n\t0x77, 0x70, 0x42, 0x56, 0x62, 0x48, 0x54, 0x67, 0x70, 0x4f, 0x6b, 0x53, 0x7a, 0x53, 0x70, 0x6d, 0x49, 0x68, \n\t0x35, 0x48, 0x32, 0x43, 0x61, 0x34, 0x61, 0x48, 0x55, 0x52, 0x53, 0x39, 0x68, 0x61, 0x51, 0x62, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x45, 0x76, 0x5a, 0x69, 0x6f, 0x75, 0x5a, 0x53, 0x49, 0x2b, 0x45, 0x6b, 0x74, 0x59, 0x55, 0x6d, 0x4e, \n\t0x57, 0x70, 0x72, 0x43, 0x44, 0x67, 0x55, 0x71, 0x59, 0x69, 0x41, 0x65, 0x51, 0x44, 0x6f, 0x54, 0x65, 0x49, \n\t0x44, 0x71, 0x49, 0x70, 0x47, 0x4b, 0x38, 0x53, 0x4a, 0x71, 0x4b, 0x46, 0x30, 0x55, 0x48, 0x61, 0x55, 0x51, \n\t0x4a, 0x45, 0x2f, 0x45, 0x2b, 0x57, 0x4d, 0x4b, 0x53, 0x6d, 0x6a, 0x4d, 0x43, 0x2b, 0x46, 0x52, 0x30, 0x5c, 0x0a,\n\t0x09, 0x69, 0x45, 0x61, 0x56, 0x55, 0x4d, 0x52, 0x66, 0x69, 0x67, 0x34, 0x67, 0x71, 0x55, 0x6a, 0x46, 0x64, \n\t0x45, 0x66, 0x75, 0x53, 0x78, 0x4f, 0x44, 0x67, 0x5a, 0x64, 0x77, 0x66, 0x56, 0x68, 0x53, 0x38, 0x78, 0x59, \n\t0x43, 0x77, 0x34, 0x46, 0x35, 0x30, 0x55, 0x46, 0x36, 0x6b, 0x2f, 0x74, 0x45, 0x76, 0x43, 0x65, 0x57, 0x73, \n\t0x4b, 0x53, 0x2b, 0x36, 0x51, 0x62, 0x32, 0x69, 0x41, 0x37, 0x52, 0x69, 0x4e, 0x79, 0x4c, 0x65, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x6f, 0x41, 0x4a, 0x4b, 0x4b, 0x39, 0x6f, 0x6e, 0x6f, 0x41, 0x49, 0x33, 0x49, 0x76, 0x59, 0x68, \n\t0x33, 0x69, 0x67, 0x34, 0x67, 0x71, 0x57, 0x69, 0x54, 0x6f, 0x77, 0x4d, 0x30, 0x49, 0x75, 0x63, 0x31, 0x34, \n\t0x71, 0x48, 0x41, 0x4b, 0x39, 0x45, 0x68, 0x4a, 0x42, 0x56, 0x76, 0x4a, 0x44, 0x41, 0x6e, 0x4f, 0x73, 0x53, \n\t0x4b, 0x35, 0x44, 0x77, 0x52, 0x62, 0x78, 0x63, 0x64, 0x51, 0x46, 0x49, 0x6c, 0x62, 0x42, 0x6b, 0x64, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x44, 0x63, 0x35, 0x46, 0x2f, 0x46, 0x6d, 0x30, 0x51, 0x45, 0x6b, 0x56, 0x63, 0x4c, 0x6d, 0x30, \n\t0x51, 0x46, 0x36, 0x6b, 0x33, 0x4d, 0x52, 0x6a, 0x34, 0x34, 0x4f, 0x49, 0x4b, 0x6b, 0x53, 0x78, 0x6b, 0x59, \n\t0x48, 0x36, 0x49, 0x31, 0x46, 0x4c, 0x4b, 0x6e, 0x71, 0x52, 0x6b, 0x55, 0x48, 0x36, 0x45, 0x33, 0x4f, 0x52, \n\t0x65, 0x78, 0x6a, 0x7a, 0x5a, 0x4a, 0x61, 0x59, 0x57, 0x52, 0x30, 0x67, 0x4e, 0x37, 0x6b, 0x58, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x52, 0x44, 0x6f, 0x67, 0x4e, 0x49, 0x71, 0x6f, 0x54, 0x73, 0x7a, 0x7a, 0x48, 0x50, 0x75, 0x59, 0x67, \n\t0x48, 0x52, 0x77, 0x65, 0x51, 0x56, 0x41, 0x6c, 0x44, 0x6f, 0x77, 0x50, 0x30, 0x4a, 0x75, 0x64, 0x39, 0x78, \n\t0x4e, 0x6b, 0x47, 0x6b, 0x31, 0x53, 0x63, 0x72, 0x75, 0x67, 0x41, 0x4b, 0x35, 0x4c, 0x7a, 0x52, 0x43, 0x78, \n\t0x4a, 0x74, 0x5a, 0x42, 0x7a, 0x45, 0x62, 0x38, 0x56, 0x48, 0x55, 0x42, 0x53, 0x4a, 0x57, 0x54, 0x66, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x54, 0x6b, 0x58, 0x38, 0x66, 0x7a, 0x6f, 0x41, 0x4a, 0x49, 0x71, 0x49, 0x66, 0x73, 0x75, 0x79, \n\t0x62, 0x6d, 0x49, 0x73, 0x7a, 0x39, 0x44, 0x56, 0x46, 0x49, 0x52, 0x58, 0x6f, 0x73, 0x4f, 0x30, 0x4a, 0x75, \n\t0x63, 0x69, 0x39, 0x67, 0x44, 0x66, 0x79, 0x53, 0x31, 0x51, 0x76, 0x5a, 0x64, 0x6b, 0x6e, 0x4d, 0x52, 0x50, \n\t0x78, 0x6b, 0x64, 0x51, 0x46, 0x49, 0x6c, 0x7a, 0x49, 0x6f, 0x4f, 0x30, 0x4a, 0x75, 0x63, 0x69, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x37, 0x48, 0x35, 0x36, 0x6b, 0x49, 0x6d, 0x54, 0x66, 0x4a, 0x54, 0x6b, 0x58, 0x38, 0x63, 0x7a, \n\t0x6f, 0x41, 0x4a, 0x49, 0x71, 0x49, 0x66, 0x73, 0x75, 0x79, 0x62, 0x6d, 0x49, 0x2f, 0x78, 0x59, 0x64, 0x51, \n\t0x46, 0x49, 0x6c, 0x5a, 0x4e, 0x38, 0x6c, 0x4f, 0x54, 0x39, 0x5a, 0x4e, 0x34, 0x43, 0x30, 0x63, 0x38, 0x4c, \n\t0x4c, 0x51, 0x79, 0x58, 0x31, 0x31, 0x58, 0x7a, 0x53, 0x75, 0x54, 0x57, 0x4c, 0x6f, 0x34, 0x4f, 0x73, 0x5c, 0x0a,\n\t0x09, 0x53, 0x4d, 0x34, 0x54, 0x38, 0x57, 0x4a, 0x67, 0x65, 0x6e, 0x51, 0x49, 0x53, 0x55, 0x57, 0x62, 0x54, \n\t0x75, 0x59, 0x6c, 0x44, 0x48, 0x6b, 0x58, 0x4d, 0x63, 0x42, 0x74, 0x30, 0x51, 0x45, 0x6b, 0x46, 0x61, 0x32, \n\t0x49, 0x44, 0x73, 0x6d, 0x39, 0x69, 0x47, 0x2b, 0x49, 0x44, 0x69, 0x43, 0x70, 0x61, 0x45, 0x56, 0x30, 0x53, \n\t0x4d, 0x35, 0x72, 0x78, 0x44, 0x30, 0x65, 0x41, 0x7a, 0x61, 0x4a, 0x44, 0x69, 0x47, 0x70, 0x4f, 0x49, 0x5c, 0x0a,\n\t0x09, 0x38, 0x44, 0x34, 0x36, 0x4a, 0x44, 0x4e, 0x43, 0x4c, 0x33, 0x69, 0x52, 0x6a, 0x67, 0x32, 0x75, 0x67, \n\t0x41, 0x6b, 0x6f, 0x70, 0x55, 0x54, 0x48, 0x65, 0x55, 0x4d, 0x42, 0x47, 0x50, 0x42, 0x70, 0x34, 0x67, 0x38, \n\t0x2f, 0x4e, 0x45, 0x4a, 0x57, 0x56, 0x6c, 0x43, 0x62, 0x41, 0x78, 0x42, 0x54, 0x7a, 0x4d, 0x41, 0x57, 0x56, \n\t0x4d, 0x78, 0x4c, 0x4f, 0x41, 0x47, 0x36, 0x4e, 0x44, 0x53, 0x43, 0x72, 0x4b, 0x6a, 0x52, 0x52, 0x53, 0x5c, 0x0a,\n\t0x09, 0x77, 0x6c, 0x42, 0x47, 0x45, 0x51, 0x4e, 0x63, 0x46, 0x42, 0x31, 0x41, 0x55, 0x6c, 0x47, 0x4b, 0x36, \n\t0x6f, 0x77, 0x53, 0x6c, 0x69, 0x59, 0x67, 0x4c, 0x55, 0x73, 0x38, 0x41, 0x45, 0x79, 0x49, 0x44, 0x69, 0x49, \n\t0x70, 0x65, 0x77, 0x38, 0x43, 0x45, 0x79, 0x6e, 0x6f, 0x75, 0x72, 0x56, 0x53, 0x4a, 0x75, 0x49, 0x6c, 0x77, \n\t0x4d, 0x6e, 0x52, 0x49, 0x53, 0x51, 0x56, 0x34, 0x57, 0x51, 0x4b, 0x4b, 0x6d, 0x45, 0x6f, 0x5a, 0x79, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x75, 0x63, 0x52, 0x73, 0x77, 0x4f, 0x54, 0x71, 0x45, 0x70, 0x47, 0x7a, 0x64, 0x44, 0x75, 0x77, \n\t0x61, 0x48, 0x61, 0x4a, 0x5a, 0x70, 0x52, 0x58, 0x78, 0x52, 0x4f, 0x42, 0x65, 0x30, 0x6a, 0x6b, 0x55, 0x6b, \n\t0x72, 0x53, 0x30, 0x78, 0x63, 0x41, 0x32, 0x70, 0x47, 0x58, 0x4d, 0x6f, 0x70, 0x53, 0x79, 0x4e, 0x4e, 0x48, \n\t0x6a, 0x41, 0x65, 0x43, 0x38, 0x36, 0x42, 0x43, 0x53, 0x73, 0x6e, 0x51, 0x75, 0x42, 0x5a, 0x59, 0x77, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x44, 0x63, 0x52, 0x41, 0x77, 0x77, 0x47, 0x48, 0x67, 0x4c, 0x47, 0x52, 0x41, 0x65, 0x52, 0x6c, \n\t0x49, 0x32, 0x5a, 0x77, 0x4f, 0x62, 0x41, 0x6d, 0x39, 0x46, 0x42, 0x2b, 0x71, 0x4b, 0x30, 0x69, 0x52, 0x6a, \n\t0x53, 0x44, 0x2f, 0x6f, 0x77, 0x43, 0x6a, 0x68, 0x52, 0x53, 0x56, 0x4a, 0x48, 0x4c, 0x43, 0x5a, 0x31, 0x51, \n\t0x70, 0x45, 0x6c, 0x44, 0x47, 0x55, 0x57, 0x4d, 0x63, 0x44, 0x64, 0x77, 0x4f, 0x6e, 0x52, 0x49, 0x53, 0x5c, 0x0a,\n\t0x09, 0x52, 0x6c, 0x34, 0x54, 0x52, 0x53, 0x4a, 0x78, 0x53, 0x72, 0x78, 0x4b, 0x57, 0x4a, 0x48, 0x6c, 0x33, \n\t0x41, 0x56, 0x63, 0x44, 0x6e, 0x6f, 0x6f, 0x4e, 0x49, 0x43, 0x6e, 0x4d, 0x4e, 0x38, 0x41, 0x55, 0x4b, 0x32, \n\t0x36, 0x36, 0x32, 0x72, 0x4a, 0x4b, 0x4c, 0x47, 0x47, 0x41, 0x56, 0x30, 0x70, 0x61, 0x32, 0x62, 0x61, 0x4b, \n\t0x44, 0x53, 0x4f, 0x71, 0x34, 0x65, 0x30, 0x6c, 0x62, 0x31, 0x64, 0x36, 0x49, 0x44, 0x74, 0x4a, 0x66, 0x5c, 0x0a,\n\t0x09, 0x70, 0x52, 0x63, 0x78, 0x77, 0x46, 0x72, 0x41, 0x58, 0x58, 0x68, 0x55, 0x70, 0x6c, 0x51, 0x6e, 0x6a, \n\t0x77, 0x4f, 0x54, 0x67, 0x4a, 0x65, 0x69, 0x67, 0x37, 0x52, 0x43, 0x71, 0x57, 0x76, 0x45, 0x53, 0x33, 0x73, \n\t0x4a, 0x32, 0x4a, 0x32, 0x43, 0x44, 0x76, 0x69, 0x51, 0x31, 0x43, 0x2b, 0x7a, 0x53, 0x4b, 0x2f, 0x35, 0x53, \n\t0x70, 0x51, 0x77, 0x56, 0x4b, 0x4f, 0x49, 0x41, 0x57, 0x59, 0x44, 0x4f, 0x77, 0x4f, 0x50, 0x52, 0x41, 0x5c, 0x0a,\n\t0x09, 0x65, 0x52, 0x31, 0x46, 0x61, 0x50, 0x6b, 0x43, 0x62, 0x68, 0x32, 0x64, 0x46, 0x42, 0x57, 0x71, 0x6b, \n\t0x71, 0x52, 0x51, 0x7a, 0x77, 0x50, 0x4b, 0x6d, 0x4d, 0x37, 0x34, 0x67, 0x4f, 0x49, 0x71, 0x6b, 0x74, 0x37, \n\t0x69, 0x43, 0x39, 0x78, 0x75, 0x64, 0x45, 0x42, 0x32, 0x6d, 0x31, 0x4b, 0x68, 0x55, 0x78, 0x77, 0x4b, 0x76, \n\t0x41, 0x6e, 0x73, 0x43, 0x30, 0x36, 0x43, 0x43, 0x53, 0x57, 0x6d, 0x6f, 0x61, 0x36, 0x62, 0x58, 0x39, 0x5c, 0x0a,\n\t0x09, 0x61, 0x6e, 0x53, 0x51, 0x64, 0x71, 0x6a, 0x43, 0x68, 0x33, 0x55, 0x66, 0x35, 0x44, 0x44, 0x53, 0x6d, \n\t0x61, 0x53, 0x72, 0x42, 0x75, 0x65, 0x51, 0x31, 0x48, 0x66, 0x7a, 0x67, 0x57, 0x4f, 0x41, 0x79, 0x36, 0x4f, \n\t0x44, 0x74, 0x46, 0x4f, 0x56, 0x69, 0x78, 0x68, 0x67, 0x4c, 0x4f, 0x6b, 0x33, 0x36, 0x63, 0x37, 0x52, 0x51, \n\t0x53, 0x51, 0x31, 0x37, 0x55, 0x37, 0x67, 0x53, 0x47, 0x42, 0x47, 0x64, 0x4a, 0x42, 0x32, 0x71, 0x39, 0x5c, 0x0a,\n\t0x09, 0x72, 0x53, 0x78, 0x4c, 0x4a, 0x6d, 0x6b, 0x49, 0x37, 0x4e, 0x50, 0x41, 0x71, 0x59, 0x46, 0x78, 0x74, \n\t0x46, 0x55, 0x6f, 0x50, 0x6d, 0x6b, 0x56, 0x36, 0x7a, 0x6b, 0x36, 0x6c, 0x42, 0x43, 0x55, 0x50, 0x31, 0x4a, \n\t0x2b, 0x4b, 0x6c, 0x6a, 0x51, 0x42, 0x4f, 0x41, 0x59, 0x34, 0x47, 0x42, 0x67, 0x56, 0x6e, 0x6b, 0x66, 0x52, \n\t0x2b, 0x69, 0x34, 0x43, 0x4c, 0x67, 0x65, 0x38, 0x44, 0x4c, 0x77, 0x5a, 0x6e, 0x36, 0x61, 0x67, 0x36, 0x5c, 0x0a,\n\t0x09, 0x46, 0x58, 0x47, 0x50, 0x39, 0x59, 0x45, 0x7a, 0x67, 0x45, 0x4f, 0x77, 0x6b, 0x4b, 0x55, 0x63, 0x4c, \n\t0x41, 0x52, 0x2b, 0x44, 0x70, 0x77, 0x4a, 0x50, 0x42, 0x4f, 0x63, 0x4a, 0x55, 0x51, 0x64, 0x69, 0x37, 0x6a, \n\t0x48, 0x63, 0x4f, 0x41, 0x72, 0x77, 0x42, 0x52, 0x53, 0x4f, 0x55, 0x76, 0x71, 0x72, 0x47, 0x65, 0x41, 0x53, \n\t0x34, 0x42, 0x4c, 0x67, 0x58, 0x38, 0x48, 0x5a, 0x77, 0x6c, 0x56, 0x35, 0x79, 0x4c, 0x75, 0x73, 0x52, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x77, 0x47, 0x37, 0x41, 0x66, 0x73, 0x43, 0x2b, 0x77, 0x62, 0x6d, 0x77, 0x63, 0x71, 0x64, 0x4b, \n\t0x65, 0x41, 0x32, 0x34, 0x41, 0x72, 0x67, 0x64, 0x75, 0x42, 0x64, 0x36, 0x4f, 0x6a, 0x5a, 0x4d, 0x48, 0x69, \n\t0x2f, 0x69, 0x39, 0x75, 0x6f, 0x43, 0x74, 0x67, 0x42, 0x32, 0x42, 0x37, 0x59, 0x48, 0x74, 0x63, 0x46, 0x71, \n\t0x57, 0x2b, 0x75, 0x4e, 0x70, 0x59, 0x44, 0x70, 0x77, 0x44, 0x2b, 0x6d, 0x6f, 0x79, 0x76, 0x73, 0x70, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x4b, 0x53, 0x30, 0x64, 0x72, 0x43, 0x49, 0x4a, 0x53, 0x6c, 0x59, 0x31, 0x62, 0x65, 0x76, 0x53, \n\t0x56, 0x4c, 0x32, 0x4c, 0x47, 0x4a, 0x4a, 0x43, 0x6d, 0x59, 0x52, 0x53, 0x31, 0x49, 0x77, 0x69, 0x31, 0x69, \n\t0x53, 0x67, 0x6c, 0x6e, 0x45, 0x6b, 0x68, 0x54, 0x4d, 0x49, 0x70, 0x61, 0x6b, 0x59, 0x42, 0x61, 0x78, 0x4a, \n\t0x41, 0x57, 0x7a, 0x69, 0x43, 0x55, 0x70, 0x6d, 0x45, 0x55, 0x73, 0x53, 0x63, 0x48, 0x2b, 0x44, 0x30, 0x5c, 0x0a,\n\t0x09, 0x45, 0x6d, 0x52, 0x32, 0x38, 0x6d, 0x36, 0x64, 0x71, 0x77, 0x41, 0x41, 0x41, 0x41, 0x41, 0x45, 0x6c, \n\t0x46, 0x54, 0x6b, 0x53, 0x75, 0x51, 0x6d, 0x43, 0x43, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x33, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x62, 0x67, 0x5b, 0x31, 0x5d, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x33, 0x5f, 0x70, \n\t0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x65, 0x63, \n\t0x6f, 0x64, 0x65, 0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, \n\t0x34, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x4c, 0x45, 0x41, 0x41, 0x41, 0x42, 0x55, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x44, 0x4e, 0x6f, 0x4e, 0x62, 0x30, 0x41, 0x41, 0x41, 0x46, 0x68, 0x6b, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x34, 0x6e, 0x4f, 0x33, 0x64, 0x57, 0x59, 0x78, 0x66, 0x55, 0x78, 0x77, 0x48, 0x38, 0x45, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x72, 0x45, 0x6c, 0x47, 0x68, 0x31, 0x74, 0x53, 0x65, 0x31, 0x4e, 0x4a, 0x55, 0x69, 0x4d, 0x54, \n\t0x45, 0x46, 0x74, 0x45, 0x6d, 0x4a, 0x52, 0x35, 0x49, 0x4c, 0x45, 0x47, 0x38, 0x69, 0x43, 0x31, 0x70, 0x38, \n\t0x53, 0x41, 0x68, 0x67, 0x67, 0x64, 0x65, 0x52, 0x43, 0x57, 0x31, 0x65, 0x36, 0x4a, 0x43, 0x69, 0x43, 0x64, \n\t0x4c, 0x42, 0x4b, 0x6b, 0x53, 0x73, 0x53, 0x54, 0x32, 0x70, 0x66, 0x59, 0x74, 0x44, 0x43, 0x46, 0x45, 0x5c, 0x0a,\n\t0x09, 0x53, 0x53, 0x4e, 0x46, 0x68, 0x44, 0x5a, 0x39, 0x59, 0x4f, 0x72, 0x68, 0x5a, 0x47, 0x54, 0x4b, 0x6a, \n\t0x4c, 0x62, 0x54, 0x6d, 0x66, 0x6e, 0x39, 0x7a, 0x72, 0x33, 0x6e, 0x38, 0x39, 0x7a, 0x4d, 0x66, 0x50, 0x73, \n\t0x2f, 0x33, 0x7a, 0x6e, 0x2f, 0x63, 0x2b, 0x38, 0x39, 0x39, 0x39, 0x35, 0x70, 0x47, 0x7a, 0x5a, 0x73, 0x30, \n\t0x44, 0x51, 0x31, 0x6d, 0x78, 0x34, 0x64, 0x6f, 0x47, 0x6d, 0x32, 0x56, 0x69, 0x74, 0x78, 0x55, 0x37, 0x5c, 0x0a,\n\t0x09, 0x31, 0x57, 0x34, 0x71, 0x5a, 0x36, 0x72, 0x63, 0x52, 0x4e, 0x39, 0x57, 0x5a, 0x45, 0x42, 0x36, 0x6a, \n\t0x4d, 0x4c, 0x6a, 0x67, 0x57, 0x52, 0x32, 0x45, 0x4f, 0x44, 0x73, 0x44, 0x2b, 0x6d, 0x49, 0x6d, 0x64, 0x52, \n\t0x76, 0x79, 0x37, 0x64, 0x66, 0x67, 0x56, 0x71, 0x2f, 0x41, 0x74, 0x50, 0x73, 0x4f, 0x48, 0x65, 0x41, 0x4d, \n\t0x2f, 0x54, 0x31, 0x33, 0x63, 0x66, 0x70, 0x6a, 0x57, 0x7a, 0x6b, 0x35, 0x73, 0x30, 0x67, 0x44, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x78, 0x69, 0x6b, 0x34, 0x64, 0x41, 0x4a, 0x2b, 0x33, 0x71, 0x64, 0x59, 0x67, 0x63, 0x66, 0x78, 0x7a, \n\t0x67, 0x54, 0x38, 0x76, 0x4e, 0x35, 0x72, 0x4a, 0x52, 0x37, 0x64, 0x7a, 0x72, 0x67, 0x49, 0x6c, 0x79, 0x71, \n\t0x7a, 0x37, 0x57, 0x51, 0x5a, 0x78, 0x4c, 0x32, 0x34, 0x58, 0x35, 0x6d, 0x35, 0x6d, 0x33, 0x46, 0x6f, 0x4a, \n\t0x64, 0x37, 0x59, 0x37, 0x72, 0x67, 0x57, 0x69, 0x37, 0x44, 0x39, 0x46, 0x50, 0x37, 0x65, 0x74, 0x56, 0x5c, 0x0a,\n\t0x09, 0x69, 0x47, 0x6d, 0x2f, 0x48, 0x54, 0x46, 0x50, 0x37, 0x65, 0x54, 0x6d, 0x67, 0x6c, 0x4c, 0x72, 0x62, \n\t0x44, 0x4e, 0x62, 0x68, 0x4b, 0x57, 0x64, 0x39, 0x47, 0x2b, 0x52, 0x31, 0x4c, 0x63, 0x54, 0x76, 0x57, 0x42, \n\t0x2b, 0x61, 0x6f, 0x53, 0x69, 0x73, 0x78, 0x38, 0x33, 0x45, 0x66, 0x44, 0x6f, 0x6f, 0x4f, 0x4d, 0x73, 0x4b, \n\t0x67, 0x38, 0x6d, 0x33, 0x77, 0x61, 0x6e, 0x53, 0x51, 0x47, 0x76, 0x54, 0x35, 0x46, 0x4e, 0x73, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x33, 0x49, 0x61, 0x58, 0x35, 0x53, 0x6f, 0x77, 0x7a, 0x46, 0x56, 0x79, 0x4c, 0x64, 0x48, 0x4f, 0x49, \n\t0x47, 0x31, 0x53, 0x58, 0x32, 0x66, 0x69, 0x32, 0x58, 0x67, 0x55, 0x78, 0x30, 0x63, 0x48, 0x32, 0x51, 0x79, \n\t0x76, 0x34, 0x45, 0x79, 0x73, 0x69, 0x51, 0x36, 0x53, 0x56, 0x52, 0x39, 0x4c, 0x50, 0x42, 0x63, 0x76, 0x59, \n\t0x75, 0x2f, 0x6f, 0x49, 0x46, 0x76, 0x67, 0x61, 0x35, 0x79, 0x4d, 0x4c, 0x36, 0x4f, 0x44, 0x5a, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x53, 0x33, 0x45, 0x67, 0x2f, 0x67, 0x57, 0x65, 0x77, 0x57, 0x48, 0x57, 0x51, 0x63, 0x31, 0x6d, 0x41, \n\t0x68, 0x50, 0x6f, 0x6b, 0x4f, 0x6b, 0x6b, 0x32, 0x66, 0x53, 0x6e, 0x77, 0x59, 0x58, 0x73, 0x4f, 0x4f, 0x30, \n\t0x55, 0x47, 0x32, 0x77, 0x68, 0x72, 0x6c, 0x51, 0x50, 0x54, 0x7a, 0x36, 0x43, 0x43, 0x5a, 0x39, 0x4b, 0x58, \n\t0x45, 0x2b, 0x2b, 0x4e, 0x31, 0x64, 0x53, 0x30, 0x68, 0x78, 0x72, 0x4a, 0x4b, 0x75, 0x66, 0x53, 0x39, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x6a, 0x70, 0x49, 0x46, 0x6e, 0x30, 0x34, 0x4f, 0x7a, 0x45, 0x54, 0x7a, 0x2b, 0x68, 0x47, 0x67, \n\t0x57, 0x45, 0x66, 0x50, 0x4b, 0x6d, 0x63, 0x32, 0x32, 0x37, 0x30, 0x6f, 0x38, 0x54, 0x4c, 0x63, 0x45, 0x68, \n\t0x30, 0x69, 0x41, 0x6b, 0x32, 0x67, 0x4c, 0x75, 0x69, 0x51, 0x32, 0x54, 0x52, 0x39, 0x65, 0x58, 0x45, 0x68, \n\t0x63, 0x71, 0x2b, 0x68, 0x4b, 0x34, 0x36, 0x47, 0x34, 0x39, 0x46, 0x68, 0x34, 0x6a, 0x57, 0x35, 0x52, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x50, 0x56, 0x67, 0x36, 0x41, 0x5a, 0x6b, 0x55, 0x48, 0x6d, 0x55, 0x53, 0x2f, 0x59, 0x4a, 0x36, \n\t0x65, 0x37, 0x37, 0x66, 0x6f, 0x38, 0x6e, 0x4c, 0x69, 0x54, 0x74, 0x30, 0x75, 0x4d, 0x47, 0x56, 0x2f, 0x38, \n\t0x39, 0x4c, 0x6f, 0x45, 0x4e, 0x47, 0x36, 0x4f, 0x68, 0x4d, 0x66, 0x67, 0x7a, 0x65, 0x6a, 0x51, 0x30, 0x79, \n\t0x68, 0x70, 0x35, 0x56, 0x7a, 0x33, 0x39, 0x50, 0x78, 0x49, 0x39, 0x37, 0x46, 0x55, 0x2f, 0x67, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x74, 0x52, 0x55, 0x36, 0x57, 0x71, 0x4a, 0x58, 0x38, 0x4b, 0x43, 0x36, 0x42, 0x41, 0x4a, 0x76, \n\t0x4b, 0x4c, 0x73, 0x7a, 0x46, 0x73, 0x5a, 0x48, 0x57, 0x51, 0x79, 0x64, 0x58, 0x45, 0x35, 0x4d, 0x56, 0x38, \n\t0x72, 0x38, 0x4c, 0x44, 0x35, 0x79, 0x6a, 0x66, 0x53, 0x64, 0x64, 0x46, 0x42, 0x4a, 0x6c, 0x4d, 0x58, 0x53, \n\t0x33, 0x78, 0x5a, 0x64, 0x49, 0x42, 0x6b, 0x70, 0x75, 0x4d, 0x47, 0x33, 0x42, 0x45, 0x64, 0x5a, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x30, 0x62, 0x54, 0x6b, 0x78, 0x47, 0x39, 0x39, 0x72, 0x32, 0x78, 0x66, 0x48, 0x63, 0x67, 0x45, \n\t0x65, 0x6a, 0x41, 0x34, 0x78, 0x30, 0x62, 0x6f, 0x32, 0x45, 0x35, 0x2b, 0x6e, 0x46, 0x66, 0x6a, 0x2f, 0x33, \n\t0x4b, 0x6e, 0x4f, 0x7a, 0x55, 0x2f, 0x2f, 0x71, 0x32, 0x73, 0x6c, 0x50, 0x69, 0x30, 0x36, 0x51, 0x48, 0x4b, \n\t0x7a, 0x64, 0x48, 0x43, 0x35, 0x31, 0x61, 0x58, 0x6c, 0x78, 0x4f, 0x35, 0x59, 0x72, 0x58, 0x74, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x42, 0x50, 0x74, 0x47, 0x35, 0x4e, 0x37, 0x42, 0x2f, 0x65, 0x55, 0x36, 0x39, 0x4b, 0x41, 0x6e, \n\t0x36, 0x42, 0x62, 0x2f, 0x35, 0x2f, 0x4a, 0x4d, 0x6b, 0x66, 0x5a, 0x52, 0x4e, 0x51, 0x5a, 0x58, 0x52, 0x72, \n\t0x30, 0x49, 0x36, 0x4d, 0x44, 0x56, 0x47, 0x52, 0x4f, 0x64, 0x49, 0x43, 0x4a, 0x31, 0x4b, 0x55, 0x53, 0x48, \n\t0x78, 0x30, 0x64, 0x6f, 0x43, 0x49, 0x4c, 0x62, 0x50, 0x7a, 0x59, 0x72, 0x61, 0x72, 0x56, 0x76, 0x69, 0x5c, 0x0a,\n\t0x09, 0x61, 0x65, 0x68, 0x58, 0x4e, 0x78, 0x44, 0x6f, 0x37, 0x44, 0x74, 0x4e, 0x67, 0x34, 0x56, 0x52, 0x6c, \n\t0x53, 0x62, 0x68, 0x52, 0x34, 0x43, 0x49, 0x38, 0x6f, 0x6d, 0x34, 0x6d, 0x71, 0x56, 0x47, 0x75, 0x4a, 0x39, \n\t0x31, 0x61, 0x65, 0x31, 0x48, 0x4f, 0x2b, 0x71, 0x58, 0x31, 0x53, 0x54, 0x31, 0x65, 0x74, 0x77, 0x77, 0x4f, \n\t0x34, 0x53, 0x54, 0x6e, 0x50, 0x58, 0x70, 0x58, 0x61, 0x53, 0x72, 0x79, 0x64, 0x63, 0x67, 0x6e, 0x31, 0x5c, 0x0a,\n\t0x09, 0x53, 0x75, 0x33, 0x4f, 0x68, 0x73, 0x6d, 0x77, 0x58, 0x6e, 0x6e, 0x36, 0x30, 0x41, 0x30, 0x71, 0x65, \n\t0x67, 0x4a, 0x52, 0x54, 0x53, 0x55, 0x65, 0x77, 0x4d, 0x4d, 0x34, 0x4d, 0x44, 0x70, 0x49, 0x44, 0x77, 0x77, \n\t0x71, 0x46, 0x34, 0x36, 0x71, 0x32, 0x44, 0x68, 0x55, 0x79, 0x34, 0x48, 0x64, 0x4a, 0x63, 0x70, 0x47, 0x6c, \n\t0x6c, 0x62, 0x67, 0x71, 0x54, 0x46, 0x58, 0x75, 0x54, 0x4e, 0x38, 0x63, 0x58, 0x53, 0x51, 0x7a, 0x56, 0x5c, 0x0a,\n\t0x09, 0x46, 0x44, 0x69, 0x5a, 0x66, 0x67, 0x62, 0x6d, 0x77, 0x62, 0x48, 0x61, 0x52, 0x6e, 0x74, 0x73, 0x55, \n\t0x39, 0x75, 0x44, 0x45, 0x36, 0x79, 0x4b, 0x5a, 0x6b, 0x58, 0x30, 0x34, 0x73, 0x56, 0x5a, 0x35, 0x57, 0x32, \n\t0x63, 0x53, 0x36, 0x42, 0x56, 0x64, 0x48, 0x68, 0x78, 0x68, 0x4c, 0x35, 0x68, 0x4a, 0x66, 0x72, 0x73, 0x50, \n\t0x62, 0x42, 0x79, 0x74, 0x30, 0x68, 0x62, 0x4b, 0x42, 0x4b, 0x4a, 0x32, 0x73, 0x4a, 0x56, 0x36, 0x49, 0x5c, 0x0a,\n\t0x09, 0x35, 0x39, 0x57, 0x78, 0x33, 0x4f, 0x6d, 0x4c, 0x49, 0x65, 0x58, 0x53, 0x2f, 0x6b, 0x76, 0x42, 0x4f, \n\t0x66, 0x34, 0x6a, 0x59, 0x34, 0x6c, 0x33, 0x78, 0x63, 0x66, 0x59, 0x4b, 0x7a, 0x70, 0x49, 0x38, 0x78, 0x2b, \n\t0x72, 0x6c, 0x57, 0x64, 0x34, 0x70, 0x48, 0x6f, 0x31, 0x51, 0x38, 0x61, 0x5a, 0x62, 0x71, 0x6c, 0x57, 0x34, \n\t0x4b, 0x78, 0x6d, 0x34, 0x39, 0x62, 0x6f, 0x45, 0x50, 0x2b, 0x57, 0x62, 0x53, 0x59, 0x2b, 0x45, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x39, 0x72, 0x6c, 0x34, 0x2b, 0x7a, 0x4f, 0x77, 0x49, 0x66, 0x52, 0x49, 0x63, 0x59, 0x6c, 0x6d, 0x30, \n\t0x6d, 0x76, 0x6b, 0x34, 0x72, 0x63, 0x41, 0x32, 0x57, 0x52, 0x41, 0x63, 0x59, 0x4b, 0x64, 0x4e, 0x4d, 0x66, \n\t0x49, 0x6a, 0x79, 0x30, 0x73, 0x4b, 0x6d, 0x44, 0x76, 0x50, 0x77, 0x52, 0x58, 0x51, 0x49, 0x63, 0x73, 0x33, \n\t0x45, 0x69, 0x36, 0x49, 0x44, 0x4e, 0x46, 0x76, 0x6b, 0x34, 0x75, 0x67, 0x41, 0x77, 0x37, 0x4c, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x78, 0x4e, 0x50, 0x77, 0x41, 0x2f, 0x61, 0x4d, 0x44, 0x74, 0x4a, 0x73, 0x74, 0x68, 0x2b, 0x56, 0x4f, \n\t0x30, 0x54, 0x43, 0x43, 0x35, 0x52, 0x6c, 0x4a, 0x68, 0x37, 0x51, 0x43, 0x6c, 0x79, 0x62, 0x76, 0x5a, 0x52, \n\t0x78, 0x43, 0x35, 0x65, 0x6c, 0x78, 0x4f, 0x32, 0x4a, 0x50, 0x58, 0x57, 0x61, 0x48, 0x78, 0x32, 0x41, 0x50, \n\t0x43, 0x56, 0x75, 0x39, 0x38, 0x66, 0x56, 0x36, 0x61, 0x6a, 0x6f, 0x41, 0x4f, 0x51, 0x70, 0x38, 0x63, 0x5c, 0x0a,\n\t0x09, 0x48, 0x52, 0x41, 0x5a, 0x70, 0x78, 0x53, 0x66, 0x45, 0x53, 0x79, 0x79, 0x77, 0x6c, 0x33, 0x6a, 0x63, \n\t0x36, 0x51, 0x44, 0x4d, 0x75, 0x2b, 0x30, 0x55, 0x48, 0x49, 0x4d, 0x2f, 0x5a, 0x69, 0x53, 0x48, 0x74, 0x49, \n\t0x6b, 0x65, 0x4e, 0x68, 0x72, 0x42, 0x4e, 0x64, 0x49, 0x67, 0x73, 0x4d, 0x33, 0x45, 0x72, 0x63, 0x4a, 0x31, \n\t0x53, 0x39, 0x43, 0x64, 0x46, 0x69, 0x4b, 0x62, 0x5a, 0x47, 0x6c, 0x6c, 0x4b, 0x2f, 0x46, 0x74, 0x30, 0x5c, 0x0a,\n\t0x09, 0x67, 0x47, 0x5a, 0x63, 0x55, 0x6f, 0x78, 0x62, 0x6c, 0x68, 0x4b, 0x76, 0x6a, 0x67, 0x37, 0x51, 0x6a, \n\t0x45, 0x75, 0x4b, 0x63, 0x63, 0x74, 0x53, 0x34, 0x71, 0x2b, 0x69, 0x41, 0x7a, 0x54, 0x6a, 0x6b, 0x6d, 0x4c, \n\t0x63, 0x73, 0x70, 0x53, 0x34, 0x46, 0x32, 0x2f, 0x35, 0x36, 0x61, 0x41, 0x55, 0x34, 0x35, 0x61, 0x6c, 0x78, \n\t0x4b, 0x39, 0x46, 0x42, 0x32, 0x6a, 0x47, 0x4a, 0x63, 0x57, 0x34, 0x5a, 0x54, 0x6c, 0x50, 0x50, 0x42, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x72, 0x74, 0x45, 0x64, 0x54, 0x31, 0x57, 0x53, 0x39, 0x38, 0x75, 0x71, 0x45, 0x74, 0x64, 0x46, \n\t0x42, 0x73, 0x73, 0x7a, 0x45, 0x61, 0x37, 0x45, 0x38, 0x4f, 0x6b, 0x53, 0x7a, 0x52, 0x5a, 0x5a, 0x4c, 0x55, \n\t0x47, 0x44, 0x79, 0x6c, 0x4a, 0x67, 0x4f, 0x76, 0x74, 0x57, 0x6e, 0x34, 0x39, 0x4b, 0x4d, 0x56, 0x35, 0x62, \n\t0x6c, 0x42, 0x4f, 0x57, 0x71, 0x33, 0x65, 0x66, 0x4b, 0x63, 0x38, 0x43, 0x61, 0x33, 0x41, 0x61, 0x56, 0x5c, 0x0a,\n\t0x09, 0x32, 0x35, 0x4e, 0x53, 0x6c, 0x43, 0x66, 0x54, 0x54, 0x4c, 0x78, 0x42, 0x73, 0x68, 0x73, 0x51, 0x6d, \n\t0x7a, 0x45, 0x74, 0x6b, 0x61, 0x54, 0x41, 0x35, 0x4a, 0x71, 0x4a, 0x4b, 0x62, 0x50, 0x78, 0x4f, 0x35, 0x4c, \n\t0x63, 0x4d, 0x64, 0x43, 0x4d, 0x36, 0x6a, 0x31, 0x6c, 0x2f, 0x33, 0x65, 0x61, 0x34, 0x6d, 0x53, 0x61, 0x69, \n\t0x53, 0x6b, 0x66, 0x7a, 0x47, 0x4c, 0x38, 0x47, 0x52, 0x32, 0x6b, 0x47, 0x64, 0x57, 0x66, 0x79, 0x76, 0x5c, 0x0a,\n\t0x09, 0x69, 0x6b, 0x4b, 0x54, 0x44, 0x35, 0x53, 0x67, 0x7a, 0x76, 0x34, 0x2f, 0x72, 0x6f, 0x45, 0x4d, 0x32, \n\t0x6f, 0x72, 0x6c, 0x66, 0x47, 0x4a, 0x35, 0x56, 0x73, 0x79, 0x34, 0x6c, 0x68, 0x30, 0x2f, 0x45, 0x45, 0x54, \n\t0x6f, 0x30, 0x4f, 0x30, 0x76, 0x78, 0x6a, 0x4f, 0x63, 0x35, 0x51, 0x39, 0x68, 0x43, 0x6e, 0x6b, 0x72, 0x58, \n\t0x45, 0x73, 0x41, 0x4e, 0x65, 0x6c, 0x4f, 0x51, 0x2b, 0x72, 0x70, 0x35, 0x62, 0x71, 0x54, 0x77, 0x52, 0x5c, 0x0a,\n\t0x09, 0x38, 0x34, 0x2f, 0x6f, 0x49, 0x4b, 0x50, 0x4a, 0x75, 0x4a, 0x77, 0x59, 0x39, 0x67, 0x64, 0x4f, 0x55, \n\t0x73, 0x6c, 0x37, 0x49, 0x7a, 0x70, 0x73, 0x70, 0x54, 0x49, 0x4f, 0x4b, 0x51, 0x74, 0x4d, 0x37, 0x68, 0x4a, \n\t0x54, 0x39, 0x71, 0x75, 0x65, 0x67, 0x42, 0x58, 0x52, 0x51, 0x58, 0x70, 0x71, 0x68, 0x66, 0x4c, 0x35, 0x70, \n\t0x39, 0x67, 0x33, 0x50, 0x4a, 0x62, 0x73, 0x4a, 0x61, 0x62, 0x4d, 0x41, 0x4b, 0x63, 0x72, 0x42, 0x78, 0x5c, 0x0a,\n\t0x09, 0x56, 0x2f, 0x42, 0x57, 0x66, 0x70, 0x69, 0x37, 0x2b, 0x55, 0x7a, 0x2f, 0x74, 0x30, 0x69, 0x57, 0x66, \n\t0x67, 0x59, 0x5a, 0x6e, 0x58, 0x78, 0x4b, 0x4d, 0x35, 0x42, 0x73, 0x74, 0x77, 0x65, 0x48, 0x53, 0x51, 0x44, \n\t0x76, 0x74, 0x49, 0x65, 0x56, 0x76, 0x56, 0x57, 0x39, 0x46, 0x42, 0x4e, 0x6c, 0x63, 0x4e, 0x4d, 0x2f, 0x46, \n\t0x49, 0x62, 0x79, 0x6b, 0x58, 0x51, 0x68, 0x62, 0x6a, 0x75, 0x2b, 0x41, 0x73, 0x58, 0x66, 0x4f, 0x64, 0x5c, 0x0a,\n\t0x09, 0x38, 0x72, 0x6b, 0x4f, 0x71, 0x4b, 0x6a, 0x41, 0x31, 0x44, 0x63, 0x54, 0x6a, 0x7a, 0x51, 0x44, 0x5a, \n\t0x2b, 0x46, 0x43, 0x6e, 0x4b, 0x69, 0x2b, 0x50, 0x38, 0x67, 0x4d, 0x68, 0x76, 0x43, 0x43, 0x38, 0x6b, 0x72, \n\t0x63, 0x78, 0x31, 0x52, 0x36, 0x6b, 0x61, 0x6e, 0x6d, 0x45, 0x6f, 0x2b, 0x30, 0x68, 0x33, 0x49, 0x45, 0x76, \n\t0x55, 0x43, 0x5a, 0x53, 0x65, 0x5a, 0x71, 0x37, 0x33, 0x77, 0x65, 0x7a, 0x54, 0x70, 0x6c, 0x38, 0x38, 0x5c, 0x0a,\n\t0x09, 0x35, 0x37, 0x65, 0x42, 0x6e, 0x50, 0x34, 0x61, 0x66, 0x51, 0x52, 0x42, 0x4f, 0x67, 0x4b, 0x79, 0x56, \n\t0x75, 0x65, 0x71, 0x78, 0x39, 0x42, 0x54, 0x66, 0x56, 0x61, 0x79, 0x56, 0x75, 0x71, 0x74, 0x64, 0x4b, 0x33, \n\t0x46, 0x53, 0x76, 0x6c, 0x62, 0x69, 0x70, 0x33, 0x74, 0x39, 0x72, 0x4f, 0x79, 0x36, 0x61, 0x55, 0x47, 0x36, \n\t0x69, 0x41, 0x67, 0x41, 0x41, 0x41, 0x41, 0x42, 0x4a, 0x52, 0x55, 0x35, 0x45, 0x72, 0x6b, 0x4a, 0x67, 0x5c, 0x0a,\n\t0x09, 0x67, 0x67, 0x3d, 0x3d, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x33, 0x40, 0x32, 0x78, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x62, 0x67, 0x5b, 0x32, 0x5d, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x33, 0x5f, 0x70, \n\t0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x65, 0x63, \n\t0x6f, 0x64, 0x65, 0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, \n\t0x34, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x57, 0x49, 0x41, 0x41, 0x41, 0x43, 0x6f, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x44, 0x61, 0x57, 0x4f, 0x51, 0x63, 0x41, 0x41, 0x41, 0x4c, 0x68, 0x6b, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x34, 0x6e, 0x4f, 0x33, 0x64, 0x61, 0x61, 0x78, 0x64, 0x56, 0x52, 0x6e, 0x47, 0x38, 0x66, 0x5c, 0x0a,\n\t0x09, 0x38, 0x74, 0x70, 0x55, 0x55, 0x6f, 0x70, 0x64, 0x51, 0x4b, 0x53, 0x45, 0x74, 0x62, 0x35, 0x71, 0x6b, \n\t0x42, 0x51, 0x53, 0x77, 0x45, 0x69, 0x55, 0x42, 0x44, 0x55, 0x61, 0x67, 0x79, 0x69, 0x42, 0x49, 0x70, 0x69, \n\t0x56, 0x5a, 0x41, 0x51, 0x63, 0x42, 0x71, 0x6b, 0x44, 0x41, 0x6c, 0x69, 0x68, 0x4a, 0x41, 0x67, 0x5a, 0x4b, \n\t0x49, 0x55, 0x45, 0x49, 0x49, 0x4b, 0x45, 0x34, 0x45, 0x71, 0x30, 0x79, 0x43, 0x54, 0x45, 0x4a, 0x42, 0x5c, 0x0a,\n\t0x09, 0x59, 0x74, 0x46, 0x69, 0x44, 0x45, 0x68, 0x6f, 0x47, 0x56, 0x71, 0x47, 0x68, 0x6f, 0x37, 0x51, 0x6b, \n\t0x44, 0x4b, 0x55, 0x6f, 0x55, 0x44, 0x72, 0x68, 0x33, 0x58, 0x68, 0x39, 0x48, 0x4c, 0x6e, 0x63, 0x38, 0x38, \n\t0x35, 0x37, 0x39, 0x70, 0x37, 0x2f, 0x33, 0x39, 0x4a, 0x6b, 0x2f, 0x62, 0x54, 0x66, 0x64, 0x71, 0x63, 0x2f, \n\t0x66, 0x53, 0x39, 0x36, 0x36, 0x36, 0x31, 0x64, 0x74, 0x75, 0x36, 0x64, 0x65, 0x75, 0x51, 0x4a, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x55, 0x5a, 0x46, 0x42, 0x31, 0x41, 0x6b, 0x71, 0x72, 0x4f, 0x49, 0x70, 0x61, 0x6b, 0x59, 0x42, 0x61, \n\t0x78, 0x4a, 0x41, 0x57, 0x7a, 0x69, 0x43, 0x55, 0x70, 0x6d, 0x45, 0x55, 0x73, 0x53, 0x63, 0x45, 0x73, 0x59, \n\t0x6b, 0x6b, 0x4b, 0x5a, 0x68, 0x46, 0x4c, 0x55, 0x6a, 0x43, 0x4c, 0x57, 0x4a, 0x4b, 0x43, 0x57, 0x63, 0x53, \n\t0x53, 0x46, 0x47, 0x78, 0x77, 0x64, 0x41, 0x42, 0x56, 0x79, 0x67, 0x68, 0x67, 0x46, 0x32, 0x42, 0x58, 0x5c, 0x0a,\n\t0x09, 0x59, 0x42, 0x79, 0x77, 0x44, 0x54, 0x41, 0x47, 0x47, 0x41, 0x57, 0x4d, 0x42, 0x44, 0x59, 0x48, 0x4e, \n\t0x71, 0x58, 0x6a, 0x67, 0x4c, 0x41, 0x57, 0x65, 0x41, 0x4e, 0x59, 0x41, 0x37, 0x77, 0x46, 0x72, 0x41, 0x43, \n\t0x57, 0x41, 0x55, 0x75, 0x42, 0x78, 0x63, 0x42, 0x4c, 0x77, 0x44, 0x7a, 0x67, 0x4b, 0x65, 0x44, 0x74, 0x56, \n\t0x76, 0x77, 0x6c, 0x70, 0x45, 0x5a, 0x72, 0x38, 0x34, 0x69, 0x7a, 0x6d, 0x6d, 0x52, 0x6a, 0x59, 0x48, 0x5c, 0x0a,\n\t0x09, 0x39, 0x67, 0x33, 0x2f, 0x5a, 0x66, 0x65, 0x77, 0x4f, 0x6a, 0x6d, 0x2f, 0x6a, 0x31, 0x31, 0x67, 0x4c, \n\t0x50, 0x41, 0x55, 0x38, 0x43, 0x6a, 0x77, 0x49, 0x50, 0x41, 0x66, 0x38, 0x46, 0x33, 0x6d, 0x76, 0x69, 0x31, \n\t0x35, 0x51, 0x61, 0x77, 0x69, 0x4a, 0x57, 0x6f, 0x37, 0x53, 0x52, 0x79, 0x76, 0x59, 0x72, 0x77, 0x43, 0x48, \n\t0x41, 0x52, 0x47, 0x44, 0x44, 0x30, 0x45, 0x52, 0x70, 0x51, 0x6e, 0x34, 0x45, 0x6d, 0x41, 0x33, 0x63, 0x5c, 0x0a,\n\t0x09, 0x54, 0x70, 0x71, 0x63, 0x70, 0x65, 0x78, 0x59, 0x78, 0x42, 0x71, 0x49, 0x4e, 0x74, 0x4c, 0x55, 0x4f, \n\t0x78, 0x55, 0x34, 0x43, 0x74, 0x67, 0x36, 0x4e, 0x6b, 0x36, 0x76, 0x46, 0x67, 0x43, 0x33, 0x41, 0x4c, 0x63, \n\t0x42, 0x2f, 0x77, 0x37, 0x4f, 0x49, 0x6e, 0x33, 0x45, 0x49, 0x6c, 0x59, 0x39, 0x74, 0x67, 0x46, 0x4f, 0x42, \n\t0x4c, 0x34, 0x4e, 0x6a, 0x41, 0x33, 0x4f, 0x55, 0x71, 0x2b, 0x6e, 0x67, 0x65, 0x75, 0x41, 0x33, 0x77, 0x5c, 0x0a,\n\t0x09, 0x49, 0x72, 0x67, 0x37, 0x4f, 0x6f, 0x34, 0x69, 0x78, 0x69, 0x39, 0x63, 0x63, 0x68, 0x77, 0x41, 0x2b, \n\t0x41, 0x77, 0x79, 0x6e, 0x50, 0x6a, 0x70, 0x76, 0x33, 0x53, 0x42, 0x50, 0x79, 0x4c, 0x30, 0x6e, 0x4c, 0x47, \n\t0x46, 0x4c, 0x4c, 0x57, 0x63, 0x54, 0x71, 0x7a, 0x53, 0x44, 0x67, 0x57, 0x4f, 0x41, 0x63, 0x59, 0x4d, 0x2f, \n\t0x67, 0x4c, 0x4d, 0x33, 0x32, 0x4d, 0x50, 0x42, 0x7a, 0x34, 0x46, 0x37, 0x41, 0x42, 0x30, 0x4d, 0x74, 0x5c, 0x0a,\n\t0x09, 0x59, 0x78, 0x47, 0x72, 0x4f, 0x78, 0x38, 0x57, 0x38, 0x45, 0x39, 0x49, 0x32, 0x38, 0x32, 0x71, 0x35, \n\t0x48, 0x48, 0x67, 0x78, 0x38, 0x43, 0x64, 0x30, 0x55, 0x46, 0x55, 0x44, 0x52, 0x61, 0x78, 0x75, 0x6e, 0x49, \n\t0x51, 0x63, 0x44, 0x6c, 0x70, 0x46, 0x30, 0x53, 0x56, 0x7a, 0x51, 0x62, 0x4f, 0x42, 0x42, 0x36, 0x4c, 0x44, \n\t0x71, 0x4a, 0x79, 0x73, 0x34, 0x69, 0x31, 0x76, 0x72, 0x48, 0x41, 0x46, 0x61, 0x51, 0x64, 0x45, 0x45, 0x5c, 0x0a,\n\t0x09, 0x72, 0x57, 0x41, 0x62, 0x38, 0x48, 0x7a, 0x67, 0x61, 0x57, 0x42, 0x32, 0x64, 0x52, 0x53, 0x5a, 0x58, \n\t0x6c, 0x42, 0x79, 0x34, 0x61, 0x6d, 0x4d, 0x47, 0x6b, 0x79, 0x65, 0x38, 0x70, 0x4c, 0x4f, 0x47, 0x50, 0x61, \n\t0x77, 0x4f, 0x2b, 0x53, 0x64, 0x71, 0x44, 0x50, 0x4b, 0x33, 0x39, 0x7a, 0x31, 0x4a, 0x44, 0x4f, 0x52, 0x46, \n\t0x72, 0x46, 0x39, 0x4c, 0x45, 0x74, 0x30, 0x39, 0x30, 0x6b, 0x49, 0x4c, 0x34, 0x4f, 0x33, 0x41, 0x79, 0x5c, 0x0a,\n\t0x09, 0x38, 0x45, 0x4a, 0x30, 0x45, 0x4a, 0x57, 0x48, 0x45, 0x33, 0x46, 0x31, 0x74, 0x5a, 0x47, 0x32, 0x6f, \n\t0x6a, 0x32, 0x4f, 0x4a, 0x64, 0x77, 0x66, 0x6b, 0x34, 0x45, 0x6e, 0x67, 0x4f, 0x4f, 0x6a, 0x67, 0x36, 0x67, \n\t0x38, 0x6e, 0x49, 0x69, 0x72, 0x61, 0x53, 0x54, 0x70, 0x49, 0x4d, 0x4f, 0x58, 0x6f, 0x34, 0x4d, 0x55, 0x33, \n\t0x50, 0x58, 0x41, 0x64, 0x4e, 0x4a, 0x6c, 0x52, 0x46, 0x4c, 0x64, 0x4c, 0x4f, 0x4c, 0x71, 0x32, 0x52, 0x5c, 0x0a,\n\t0x09, 0x75, 0x34, 0x6c, 0x65, 0x4b, 0x65, 0x69, 0x4d, 0x76, 0x4e, 0x66, 0x4f, 0x41, 0x59, 0x30, 0x6b, 0x6b, \n\t0x39, 0x71, 0x53, 0x34, 0x75, 0x54, 0x56, 0x54, 0x4c, 0x63, 0x63, 0x41, 0x2f, 0x73, 0x59, 0x51, 0x62, 0x61, \n\t0x54, 0x64, 0x67, 0x4c, 0x6a, 0x41, 0x6c, 0x4f, 0x6f, 0x69, 0x4b, 0x79, 0x79, 0x4b, 0x75, 0x6a, 0x76, 0x4f, \n\t0x42, 0x47, 0x34, 0x46, 0x50, 0x52, 0x41, 0x63, 0x70, 0x6f, 0x65, 0x48, 0x41, 0x58, 0x34, 0x48, 0x54, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x34, 0x4f, 0x6f, 0x6d, 0x46, 0x79, 0x61, 0x4b, 0x4c, 0x38, 0x4e, 0x67, 0x47, 0x75, 0x41, 0x6b, \n\t0x36, 0x4b, 0x44, 0x56, 0x4d, 0x51, 0x4d, 0x34, 0x43, 0x77, 0x38, 0x49, 0x71, 0x31, 0x2b, 0x73, 0x49, 0x6a, \n\t0x4c, 0x62, 0x51, 0x67, 0x77, 0x43, 0x7a, 0x67, 0x79, 0x4f, 0x6b, 0x6a, 0x46, 0x58, 0x45, 0x2f, 0x61, 0x34, \n\t0x76, 0x5a, 0x42, 0x64, 0x42, 0x41, 0x56, 0x67, 0x30, 0x56, 0x63, 0x58, 0x6b, 0x4f, 0x41, 0x76, 0x35, 0x5c, 0x0a,\n\t0x09, 0x41, 0x75, 0x61, 0x6c, 0x66, 0x72, 0x33, 0x55, 0x67, 0x36, 0x43, 0x47, 0x49, 0x5a, 0x71, 0x31, 0x65, \n\t0x75, 0x45, 0x5a, 0x65, 0x54, 0x4a, 0x52, 0x78, 0x76, 0x4b, 0x76, 0x41, 0x37, 0x30, 0x74, 0x4b, 0x51, 0x31, \n\t0x43, 0x4f, 0x4c, 0x75, 0x48, 0x77, 0x32, 0x49, 0x4a, 0x32, 0x55, 0x73, 0x34, 0x54, 0x6a, 0x54, 0x51, 0x57, \n\t0x75, 0x77, 0x6d, 0x50, 0x52, 0x36, 0x6f, 0x56, 0x46, 0x58, 0x44, 0x34, 0x7a, 0x53, 0x64, 0x64, 0x58, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x67, 0x2b, 0x6e, 0x41, 0x44, 0x2b, 0x4c, 0x44, 0x71, 0x47, 0x38, 0x75, 0x55, 0x5a, 0x63, 0x4c, \n\t0x6d, 0x63, 0x42, 0x6c, 0x30, 0x53, 0x48, 0x55, 0x4a, 0x65, 0x2b, 0x51, 0x33, 0x6f, 0x31, 0x6b, 0x39, 0x53, \n\t0x4a, 0x52, 0x56, 0x77, 0x65, 0x78, 0x35, 0x44, 0x57, 0x68, 0x5a, 0x57, 0x6e, 0x39, 0x34, 0x42, 0x4a, 0x70, \n\t0x41, 0x4d, 0x31, 0x55, 0x67, 0x63, 0x57, 0x63, 0x54, 0x6c, 0x38, 0x65, 0x4c, 0x70, 0x72, 0x57, 0x48, 0x5c, 0x0a,\n\t0x09, 0x51, 0x51, 0x39, 0x57, 0x67, 0x35, 0x36, 0x59, 0x6a, 0x35, 0x73, 0x75, 0x67, 0x67, 0x79, 0x6f, 0x74, \n\t0x72, 0x78, 0x4d, 0x55, 0x33, 0x6e, 0x50, 0x54, 0x79, 0x53, 0x30, 0x73, 0x34, 0x66, 0x31, 0x73, 0x42, 0x74, \n\t0x35, 0x42, 0x32, 0x74, 0x55, 0x67, 0x66, 0x73, 0x59, 0x69, 0x4c, 0x37, 0x78, 0x70, 0x67, 0x78, 0x2b, 0x67, \n\t0x51, 0x36, 0x72, 0x50, 0x39, 0x67, 0x4d, 0x75, 0x69, 0x51, 0x79, 0x67, 0x76, 0x4c, 0x6b, 0x30, 0x55, 0x5c, 0x0a,\n\t0x09, 0x32, 0x7a, 0x54, 0x67, 0x4e, 0x39, 0x45, 0x68, 0x56, 0x4a, 0x66, 0x4a, 0x77, 0x50, 0x33, 0x52, 0x49, \n\t0x5a, 0x51, 0x48, 0x69, 0x37, 0x69, 0x34, 0x78, 0x67, 0x4a, 0x50, 0x41, 0x70, 0x74, 0x47, 0x42, 0x31, 0x46, \n\t0x64, 0x6c, 0x67, 0x41, 0x54, 0x67, 0x46, 0x58, 0x52, 0x51, 0x52, 0x54, 0x50, 0x70, 0x59, 0x6c, 0x69, 0x61, \n\t0x69, 0x4e, 0x74, 0x68, 0x62, 0x4b, 0x45, 0x69, 0x32, 0x73, 0x30, 0x61, 0x63, 0x2b, 0x33, 0x5a, 0x42, 0x5c, 0x0a,\n\t0x09, 0x45, 0x58, 0x31, 0x41, 0x6d, 0x6b, 0x62, 0x32, 0x31, 0x56, 0x62, 0x46, 0x4f, 0x42, 0x4c, 0x30, 0x57, \n\t0x48, 0x55, 0x44, 0x79, 0x58, 0x4a, 0x6f, 0x70, 0x6e, 0x4a, 0x50, 0x41, 0x73, 0x38, 0x4d, 0x6e, 0x6f, 0x49, \n\t0x47, 0x71, 0x49, 0x68, 0x61, 0x51, 0x6c, 0x69, 0x6e, 0x65, 0x6a, 0x67, 0x79, 0x69, 0x4f, 0x45, 0x33, 0x48, \n\t0x78, 0x58, 0x49, 0x77, 0x6c, 0x58, 0x43, 0x59, 0x37, 0x41, 0x47, 0x64, 0x47, 0x68, 0x31, 0x41, 0x73, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x2b, 0x4a, 0x69, 0x6d, 0x55, 0x42, 0x36, 0x67, 0x37, 0x43, 0x58, 0x79, 0x4a, 0x54, 0x4c, 0x32, \n\t0x36, 0x53, 0x4c, 0x2b, 0x37, 0x63, 0x43, 0x74, 0x67, 0x51, 0x32, 0x41, 0x64, 0x34, 0x48, 0x33, 0x69, 0x41, \n\t0x64, 0x2f, 0x6e, 0x67, 0x47, 0x65, 0x41, 0x78, 0x34, 0x4e, 0x53, 0x71, 0x67, 0x6d, 0x73, 0x73, 0x69, 0x4c, \n\t0x70, 0x59, 0x37, 0x38, 0x64, 0x31, 0x6f, 0x56, 0x62, 0x57, 0x4f, 0x39, 0x4a, 0x2f, 0x77, 0x62, 0x63, 0x5c, 0x0a,\n\t0x09, 0x41, 0x66, 0x67, 0x51, 0x57, 0x78, 0x63, 0x64, 0x52, 0x49, 0x46, 0x6e, 0x46, 0x78, 0x48, 0x41, 0x67, \n\t0x38, 0x46, 0x42, 0x31, 0x43, 0x32, 0x62, 0x67, 0x48, 0x75, 0x42, 0x43, 0x59, 0x45, 0x78, 0x31, 0x45, 0x41, \n\t0x32, 0x63, 0x52, 0x46, 0x38, 0x63, 0x44, 0x70, 0x45, 0x74, 0x6a, 0x70, 0x50, 0x58, 0x39, 0x47, 0x66, 0x67, \n\t0x68, 0x73, 0x44, 0x51, 0x36, 0x69, 0x4f, 0x70, 0x6e, 0x45, 0x52, 0x66, 0x44, 0x66, 0x73, 0x43, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x6b, 0x4d, 0x6f, 0x57, 0x36, 0x74, 0x49, 0x57, 0x78, 0x70, 0x76, 0x6a, 0x51, 0x36, 0x69, 0x2b, \n\t0x72, 0x68, 0x72, 0x6f, 0x68, 0x6a, 0x4f, 0x6a, 0x51, 0x36, 0x67, 0x72, 0x49, 0x30, 0x67, 0x58, 0x53, 0x62, \n\t0x30, 0x30, 0x2b, 0x41, 0x63, 0x71, 0x70, 0x4d, 0x54, 0x63, 0x66, 0x36, 0x32, 0x49, 0x2b, 0x30, 0x31, 0x64, \n\t0x61, 0x65, 0x45, 0x2b, 0x75, 0x4a, 0x71, 0x34, 0x4c, 0x54, 0x6f, 0x45, 0x4f, 0x6f, 0x66, 0x4a, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x38, 0x66, 0x52, 0x39, 0x4c, 0x57, 0x48, 0x31, 0x33, 0x4b, 0x6e, 0x42, 0x42, 0x64, 0x41, 0x6a, \n\t0x31, 0x6a, 0x78, 0x4e, 0x78, 0x33, 0x6f, 0x61, 0x53, 0x39, 0x70, 0x46, 0x75, 0x48, 0x68, 0x31, 0x45, 0x68, \n\t0x66, 0x4e, 0x31, 0x66, 0x47, 0x4e, 0x4c, 0x59, 0x54, 0x67, 0x52, 0x35, 0x2b, 0x30, 0x6f, 0x4c, 0x47, 0x48, \n\t0x56, 0x35, 0x33, 0x70, 0x67, 0x58, 0x48, 0x51, 0x49, 0x39, 0x59, 0x31, 0x46, 0x6e, 0x4c, 0x64, 0x70, 0x5c, 0x0a,\n\t0x09, 0x30, 0x51, 0x46, 0x55, 0x57, 0x4d, 0x4f, 0x42, 0x4b, 0x36, 0x4a, 0x44, 0x71, 0x47, 0x39, 0x63, 0x6d, \n\t0x73, 0x6a, 0x58, 0x53, 0x47, 0x41, 0x46, 0x4d, 0x44, 0x67, 0x36, 0x69, 0x41, 0x72, 0x74, 0x59, 0x44, 0x77, \n\t0x49, 0x6c, 0x44, 0x30, 0x6e, 0x34, 0x6e, 0x77, 0x64, 0x6a, 0x53, 0x57, 0x73, 0x67, 0x54, 0x73, 0x2f, 0x4f, \n\t0x6f, 0x42, 0x36, 0x5a, 0x78, 0x48, 0x6e, 0x36, 0x35, 0x6a, 0x6f, 0x41, 0x43, 0x71, 0x46, 0x67, 0x30, 0x5c, 0x0a,\n\t0x09, 0x68, 0x76, 0x2b, 0x56, 0x62, 0x47, 0x4c, 0x4f, 0x49, 0x38, 0x62, 0x55, 0x54, 0x36, 0x6c, 0x6c, 0x4a, \n\t0x71, 0x68, 0x47, 0x39, 0x46, 0x42, 0x31, 0x44, 0x50, 0x4c, 0x4f, 0x49, 0x38, 0x48, 0x55, 0x67, 0x71, 0x59, \n\t0x36, 0x6b, 0x52, 0x76, 0x4c, 0x45, 0x76, 0x63, 0x78, 0x5a, 0x78, 0x6e, 0x6e, 0x77, 0x4e, 0x6b, 0x68, 0x70, \n\t0x70, 0x64, 0x39, 0x4a, 0x64, 0x78, 0x38, 0x71, 0x55, 0x52, 0x5a, 0x79, 0x6e, 0x41, 0x36, 0x49, 0x44, 0x5c, 0x0a,\n\t0x09, 0x71, 0x48, 0x54, 0x32, 0x69, 0x41, 0x36, 0x67, 0x37, 0x6c, 0x6e, 0x45, 0x2b, 0x64, 0x6b, 0x59, 0x2b, \n\t0x47, 0x78, 0x30, 0x43, 0x4a, 0x58, 0x4f, 0x4c, 0x74, 0x45, 0x42, 0x31, 0x44, 0x32, 0x4c, 0x4f, 0x44, 0x39, \n\t0x37, 0x34, 0x62, 0x59, 0x31, 0x4e, 0x64, 0x36, 0x6f, 0x36, 0x41, 0x44, 0x71, 0x6e, 0x6b, 0x57, 0x63, 0x6e, \n\t0x37, 0x32, 0x69, 0x41, 0x36, 0x69, 0x55, 0x68, 0x6b, 0x63, 0x48, 0x55, 0x50, 0x63, 0x73, 0x34, 0x76, 0x5c, 0x0a,\n\t0x09, 0x78, 0x38, 0x4a, 0x6a, 0x71, 0x41, 0x53, 0x6d, 0x6b, 0x79, 0x36, 0x55, 0x30, 0x65, 0x45, 0x2f, 0x41, \n\t0x32, 0x76, 0x2b, 0x78, 0x34, 0x78, 0x44, 0x6b, 0x50, 0x51, 0x34, 0x46, 0x44, 0x67, 0x57, 0x4e, 0x4a, 0x4a, \n\t0x2b, 0x6f, 0x32, 0x69, 0x59, 0x32, 0x6a, 0x6b, 0x6c, 0x73, 0x4a, 0x33, 0x41, 0x66, 0x4d, 0x49, 0x72, 0x33, \n\t0x37, 0x37, 0x74, 0x33, 0x59, 0x4f, 0x4c, 0x4b, 0x49, 0x59, 0x33, 0x32, 0x4f, 0x64, 0x48, 0x2f, 0x73, 0x5c, 0x0a,\n\t0x09, 0x56, 0x2f, 0x46, 0x62, 0x52, 0x38, 0x56, 0x59, 0x52, 0x62, 0x6f, 0x75, 0x38, 0x77, 0x5a, 0x38, 0x45, \n\t0x57, 0x6b, 0x59, 0x69, 0x37, 0x6a, 0x31, 0x42, 0x67, 0x50, 0x48, 0x6b, 0x64, 0x36, 0x69, 0x73, 0x47, 0x39, \n\t0x77, 0x46, 0x6d, 0x6c, 0x39, 0x2f, 0x77, 0x46, 0x6d, 0x6b, 0x46, 0x36, 0x37, 0x39, 0x48, 0x35, 0x77, 0x6c, \n\t0x6b, 0x71, 0x78, 0x69, 0x46, 0x74, 0x6e, 0x45, 0x48, 0x41, 0x38, 0x36, 0x52, 0x4b, 0x57, 0x37, 0x59, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x7a, 0x53, 0x44, 0x31, 0x5a, 0x42, 0x46, 0x77, 0x4d, 0x2f, 0x42, 0x6f, 0x4c, 0x75, 0x53, 0x55, \n\t0x73, 0x34, 0x74, 0x61, 0x59, 0x41, 0x6c, 0x77, 0x47, 0x37, 0x42, 0x6f, 0x64, 0x52, 0x4f, 0x71, 0x48, 0x68, \n\t0x63, 0x41, 0x5a, 0x77, 0x42, 0x33, 0x52, 0x51, 0x63, 0x72, 0x4f, 0x49, 0x6d, 0x36, 0x75, 0x72, 0x59, 0x46, \n\t0x66, 0x34, 0x55, 0x31, 0x71, 0x4b, 0x72, 0x61, 0x37, 0x67, 0x65, 0x2b, 0x52, 0x4a, 0x6d, 0x55, 0x31, 0x5c, 0x0a,\n\t0x09, 0x67, 0x64, 0x76, 0x58, 0x6d, 0x75, 0x64, 0x6b, 0x34, 0x47, 0x6b, 0x73, 0x59, 0x52, 0x58, 0x66, 0x59, \n\t0x63, 0x41, 0x38, 0x55, 0x68, 0x6d, 0x37, 0x39, 0x61, 0x30, 0x4a, 0x6e, 0x49, 0x67, 0x62, 0x62, 0x7a, 0x50, \n\t0x53, 0x2b, 0x38, 0x49, 0x73, 0x59, 0x4a, 0x58, 0x52, 0x58, 0x61, 0x52, 0x72, 0x4e, 0x56, 0x64, 0x47, 0x42, \n\t0x79, 0x6b, 0x54, 0x69, 0x37, 0x69, 0x78, 0x4a, 0x67, 0x4a, 0x2f, 0x41, 0x73, 0x59, 0x48, 0x35, 0x35, 0x5c, 0x0a,\n\t0x09, 0x43, 0x61, 0x61, 0x54, 0x48, 0x77, 0x4e, 0x57, 0x42, 0x75, 0x64, 0x4a, 0x43, 0x79, 0x63, 0x47, 0x6d, \n\t0x69, 0x63, 0x59, 0x34, 0x48, 0x48, 0x73, 0x59, 0x53, 0x56, 0x76, 0x6d, 0x4e, 0x41, 0x66, 0x35, 0x42, 0x2b, \n\t0x73, 0x79, 0x72, 0x41, 0x53, 0x7a, 0x69, 0x78, 0x6a, 0x67, 0x58, 0x2b, 0x41, 0x50, 0x70, 0x68, 0x4a, 0x78, \n\t0x55, 0x42, 0x55, 0x4e, 0x4a, 0x6e, 0x2f, 0x6e, 0x7a, 0x6f, 0x6f, 0x4f, 0x55, 0x67, 0x55, 0x73, 0x54, 0x5c, 0x0a,\n\t0x09, 0x41, 0x2f, 0x63, 0x4c, 0x34, 0x4f, 0x7a, 0x6f, 0x45, 0x46, 0x4b, 0x67, 0x53, 0x34, 0x42, 0x7a, 0x6f, \n\t0x6b, 0x4d, 0x55, 0x6d, 0x55, 0x55, 0x38, 0x4d, 0x46, 0x63, 0x41, 0x30, 0x36, 0x4e, 0x44, 0x53, 0x42, 0x6d, \n\t0x34, 0x6d, 0x6e, 0x52, 0x61, 0x56, 0x48, 0x56, 0x77, 0x61, 0x61, 0x4a, 0x2b, 0x46, 0x32, 0x45, 0x4a, 0x53, \n\t0x78, 0x38, 0x36, 0x6c, 0x66, 0x52, 0x4d, 0x71, 0x41, 0x35, 0x4f, 0x78, 0x50, 0x55, 0x35, 0x44, 0x62, 0x5c, 0x0a,\n\t0x09, 0x67, 0x71, 0x4f, 0x6f, 0x53, 0x55, 0x6f, 0x64, 0x4f, 0x42, 0x6d, 0x64, 0x45, 0x68, 0x69, 0x73, 0x59, \n\t0x69, 0x37, 0x72, 0x2f, 0x44, 0x67, 0x44, 0x76, 0x78, 0x75, 0x77, 0x6d, 0x70, 0x4b, 0x32, 0x75, 0x42, 0x49, \n\t0x34, 0x43, 0x2f, 0x52, 0x51, 0x63, 0x70, 0x45, 0x6f, 0x75, 0x34, 0x66, 0x33, 0x59, 0x67, 0x33, 0x56, 0x41, \n\t0x31, 0x49, 0x6a, 0x71, 0x49, 0x6c, 0x4c, 0x46, 0x56, 0x70, 0x43, 0x74, 0x65, 0x46, 0x30, 0x59, 0x48, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x51, 0x71, 0x6e, 0x75, 0x72, 0x37, 0x62, 0x45, 0x4c, 0x67, 0x4a, 0x53, 0x31, 0x6a, 0x71, 0x7a, \n\t0x51, 0x6a, 0x67, 0x5a, 0x74, 0x7a, 0x4f, 0x32, 0x57, 0x63, 0x57, 0x63, 0x64, 0x39, 0x64, 0x67, 0x47, 0x39, \n\t0x58, 0x6c, 0x76, 0x70, 0x71, 0x44, 0x2b, 0x44, 0x53, 0x36, 0x42, 0x42, 0x46, 0x34, 0x64, 0x4a, 0x45, 0x33, \n\t0x78, 0x77, 0x49, 0x7a, 0x4d, 0x62, 0x2f, 0x75, 0x4b, 0x54, 0x2b, 0x6d, 0x67, 0x51, 0x38, 0x47, 0x42, 0x5c, 0x0a,\n\t0x09, 0x30, 0x69, 0x64, 0x78, 0x5a, 0x78, 0x37, 0x34, 0x59, 0x41, 0x54, 0x77, 0x41, 0x37, 0x52, 0x77, 0x65, \n\t0x52, 0x43, 0x75, 0x68, 0x35, 0x59, 0x48, 0x66, 0x67, 0x6e, 0x65, 0x67, 0x67, 0x4f, 0x58, 0x50, 0x43, 0x36, \n\t0x39, 0x30, 0x5a, 0x57, 0x4d, 0x4a, 0x53, 0x76, 0x62, 0x62, 0x44, 0x59, 0x39, 0x43, 0x39, 0x63, 0x69, 0x4c, \n\t0x75, 0x32, 0x52, 0x6a, 0x67, 0x47, 0x57, 0x44, 0x6a, 0x36, 0x43, 0x42, 0x53, 0x67, 0x62, 0x30, 0x44, 0x5c, 0x0a,\n\t0x09, 0x37, 0x41, 0x53, 0x38, 0x46, 0x42, 0x30, 0x6b, 0x56, 0x30, 0x37, 0x45, 0x50, 0x62, 0x73, 0x51, 0x53, \n\t0x31, 0x67, 0x61, 0x71, 0x49, 0x33, 0x77, 0x31, 0x46, 0x32, 0x50, 0x6e, 0x49, 0x69, 0x37, 0x4e, 0x78, 0x5a, \n\t0x34, 0x6a, 0x76, 0x54, 0x57, 0x5a, 0x55, 0x6b, 0x44, 0x73, 0x35, 0x61, 0x30, 0x78, 0x4f, 0x66, 0x65, 0x34, \n\t0x69, 0x34, 0x34, 0x45, 0x58, 0x66, 0x76, 0x50, 0x43, 0x78, 0x68, 0x71, 0x56, 0x45, 0x47, 0x34, 0x56, 0x5c, 0x0a,\n\t0x09, 0x70, 0x78, 0x74, 0x35, 0x79, 0x49, 0x75, 0x37, 0x59, 0x31, 0x38, 0x43, 0x4c, 0x70, 0x45, 0x49, 0x65, \n\t0x6b, 0x78, 0x6c, 0x68, 0x44, 0x2b, 0x72, 0x6e, 0x4c, 0x4b, 0x39, 0x46, 0x42, 0x63, 0x75, 0x4e, 0x45, 0x33, \n\t0x4c, 0x56, 0x70, 0x57, 0x4d, 0x4a, 0x53, 0x6f, 0x77, 0x30, 0x42, 0x54, 0x6f, 0x77, 0x4f, 0x6b, 0x53, 0x4d, \n\t0x6e, 0x34, 0x73, 0x34, 0x47, 0x6b, 0x64, 0x61, 0x78, 0x74, 0x6f, 0x30, 0x4f, 0x49, 0x70, 0x58, 0x51, 0x5c, 0x0a,\n\t0x09, 0x49, 0x74, 0x4b, 0x57, 0x74, 0x72, 0x58, 0x52, 0x51, 0x58, 0x4c, 0x69, 0x52, 0x4e, 0x7a, 0x5a, 0x4a, \n\t0x43, 0x78, 0x68, 0x71, 0x56, 0x6e, 0x47, 0x41, 0x5a, 0x4f, 0x6a, 0x51, 0x2b, 0x54, 0x47, 0x49, 0x75, 0x37, \n\t0x73, 0x75, 0x4f, 0x67, 0x41, 0x55, 0x73, 0x6b, 0x64, 0x48, 0x52, 0x30, 0x67, 0x4e, 0x79, 0x35, 0x4e, 0x64, \n\t0x44, 0x51, 0x49, 0x57, 0x41, 0x5a, 0x73, 0x45, 0x52, 0x31, 0x45, 0x4b, 0x72, 0x48, 0x6c, 0x77, 0x47, 0x5c, 0x0a,\n\t0x09, 0x68, 0x63, 0x6e, 0x76, 0x69, 0x49, 0x45, 0x33, 0x46, 0x48, 0x45, 0x37, 0x47, 0x45, 0x70, 0x57, 0x62, \n\t0x62, 0x43, 0x74, 0x67, 0x2f, 0x4f, 0x6b, 0x52, 0x4f, 0x4c, 0x4f, 0x4b, 0x4f, 0x70, 0x6b, 0x51, 0x48, 0x6b, \n\t0x43, 0x72, 0x69, 0x30, 0x4f, 0x67, 0x41, 0x4f, 0x62, 0x47, 0x49, 0x4f, 0x7a, 0x6f, 0x67, 0x4f, 0x6f, 0x42, \n\t0x55, 0x45, 0x55, 0x37, 0x45, 0x36, 0x33, 0x47, 0x4e, 0x75, 0x47, 0x59, 0x44, 0x30, 0x69, 0x74, 0x65, 0x5c, 0x0a,\n\t0x09, 0x68, 0x6b, 0x55, 0x48, 0x6b, 0x53, 0x72, 0x67, 0x54, 0x64, 0x4b, 0x62, 0x50, 0x44, 0x36, 0x49, 0x44, \n\t0x70, 0x49, 0x44, 0x4a, 0x2b, 0x4b, 0x61, 0x58, 0x62, 0x47, 0x45, 0x70, 0x56, 0x59, 0x5a, 0x52, 0x72, 0x71, \n\t0x6e, 0x57, 0x46, 0x6a, 0x45, 0x36, 0x39, 0x73, 0x6e, 0x4f, 0x6f, 0x42, 0x55, 0x4d, 0x58, 0x74, 0x47, 0x42, \n\t0x38, 0x69, 0x46, 0x52, 0x56, 0x79, 0x7a, 0x58, 0x58, 0x51, 0x41, 0x71, 0x57, 0x4b, 0x32, 0x6a, 0x77, 0x5c, 0x0a,\n\t0x09, 0x36, 0x51, 0x43, 0x34, 0x75, 0x34, 0x5a, 0x6e, 0x78, 0x30, 0x41, 0x4b, 0x6c, 0x69, 0x48, 0x48, 0x37, \n\t0x61, 0x57, 0x63, 0x51, 0x31, 0x34, 0x36, 0x4d, 0x44, 0x53, 0x42, 0x56, 0x6a, 0x45, 0x62, 0x65, 0x7a, 0x69, \n\t0x47, 0x76, 0x47, 0x52, 0x41, 0x65, 0x51, 0x4b, 0x6d, 0x5a, 0x30, 0x64, 0x49, 0x42, 0x63, 0x57, 0x4d, 0x51, \n\t0x31, 0x6d, 0x30, 0x59, 0x48, 0x6b, 0x43, 0x70, 0x6d, 0x5a, 0x48, 0x53, 0x41, 0x58, 0x46, 0x6a, 0x45, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x52, 0x74, 0x46, 0x42, 0x35, 0x41, 0x71, 0x5a, 0x6e, 0x68, 0x30, 0x67, 0x46, 0x78, 0x34, 0x6f, \n\t0x4b, 0x50, 0x47, 0x66, 0x77, 0x69, 0x70, 0x39, 0x64, 0x71, 0x69, 0x41, 0x2b, 0x54, 0x41, 0x69, 0x56, 0x69, \n\t0x53, 0x67, 0x6c, 0x6e, 0x45, 0x6b, 0x68, 0x54, 0x4d, 0x49, 0x71, 0x37, 0x78, 0x7a, 0x4c, 0x76, 0x55, 0x57, \n\t0x6a, 0x35, 0x7a, 0x37, 0x53, 0x7a, 0x69, 0x6d, 0x6c, 0x65, 0x6a, 0x41, 0x30, 0x67, 0x56, 0x34, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x50, 0x58, 0x7a, 0x69, 0x4b, 0x75, 0x38, 0x55, 0x4d, 0x68, 0x74, 0x5a, 0x62, 0x50, 0x58, 0x44, 0x75, \n\t0x4c, 0x75, 0x47, 0x5a, 0x4a, 0x64, 0x41, 0x43, 0x70, 0x59, 0x6e, 0x7a, 0x6d, 0x32, 0x6c, 0x6e, 0x45, 0x4e, \n\t0x59, 0x75, 0x69, 0x41, 0x30, 0x67, 0x56, 0x34, 0x7a, 0x50, 0x58, 0x7a, 0x69, 0x4b, 0x75, 0x65, 0x53, 0x34, \n\t0x36, 0x67, 0x46, 0x51, 0x78, 0x50, 0x6e, 0x50, 0x74, 0x4c, 0x4f, 0x4b, 0x61, 0x65, 0x64, 0x45, 0x42, 0x5c, 0x0a,\n\t0x09, 0x70, 0x49, 0x72, 0x78, 0x6d, 0x57, 0x74, 0x6e, 0x45, 0x64, 0x63, 0x38, 0x48, 0x68, 0x31, 0x41, 0x71, \n\t0x68, 0x69, 0x66, 0x75, 0x58, 0x59, 0x65, 0x63, 0x65, 0x35, 0x6f, 0x42, 0x62, 0x42, 0x46, 0x64, 0x41, 0x69, \n\t0x70, 0x41, 0x6c, 0x34, 0x47, 0x74, 0x6f, 0x77, 0x4f, 0x6b, 0x51, 0x73, 0x6e, 0x34, 0x6f, 0x37, 0x6d, 0x52, \n\t0x41, 0x65, 0x51, 0x4b, 0x75, 0x4b, 0x52, 0x36, 0x41, 0x41, 0x35, 0x73, 0x59, 0x67, 0x37, 0x65, 0x69, 0x5c, 0x0a,\n\t0x09, 0x41, 0x36, 0x67, 0x46, 0x51, 0x52, 0x39, 0x30, 0x63, 0x48, 0x79, 0x49, 0x6c, 0x46, 0x33, 0x4e, 0x47, \n\t0x39, 0x30, 0x51, 0x47, 0x6b, 0x69, 0x76, 0x42, 0x5a, 0x57, 0x34, 0x39, 0x46, 0x33, 0x4e, 0x46, 0x43, 0x2f, \n\t0x45, 0x6d, 0x75, 0x31, 0x47, 0x7a, 0x7a, 0x53, 0x4d, 0x2b, 0x61, 0x32, 0x6c, 0x6e, 0x45, 0x6e, 0x64, 0x30, \n\t0x63, 0x48, 0x55, 0x41, 0x71, 0x4f, 0x5a, 0x2b, 0x78, 0x6a, 0x33, 0x48, 0x58, 0x52, 0x47, 0x63, 0x37, 0x5c, 0x0a,\n\t0x09, 0x41, 0x73, 0x39, 0x47, 0x68, 0x35, 0x42, 0x4b, 0x62, 0x43, 0x64, 0x67, 0x51, 0x58, 0x53, 0x49, 0x6e, \n\t0x44, 0x67, 0x52, 0x64, 0x37, 0x59, 0x41, 0x64, 0x30, 0x39, 0x49, 0x7a, 0x54, 0x49, 0x48, 0x53, 0x37, 0x67, \n\t0x54, 0x69, 0x37, 0x68, 0x72, 0x4d, 0x36, 0x4d, 0x44, 0x53, 0x43, 0x58, 0x6c, 0x73, 0x39, 0x55, 0x46, 0x6c, \n\t0x79, 0x61, 0x36, 0x4e, 0x67, 0x52, 0x34, 0x45, 0x66, 0x68, 0x30, 0x63, 0x41, 0x36, 0x70, 0x54, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x59, 0x42, 0x34, 0x34, 0x45, 0x31, 0x77, 0x54, 0x6d, 0x79, 0x34, 0x30, 0x54, 0x63, 0x74, 0x54, 0x58, \n\t0x41, 0x6a, 0x4f, 0x67, 0x51, 0x55, 0x73, 0x6e, 0x4d, 0x77, 0x42, 0x4c, 0x75, 0x6b, 0x68, 0x4e, 0x78, 0x39, \n\t0x34, 0x61, 0x52, 0x62, 0x6f, 0x66, 0x79, 0x79, 0x4c, 0x4d, 0x30, 0x63, 0x43, 0x38, 0x44, 0x32, 0x77, 0x4e, \n\t0x76, 0x52, 0x67, 0x66, 0x4a, 0x6b, 0x52, 0x4e, 0x78, 0x39, 0x39, 0x34, 0x45, 0x4c, 0x6f, 0x77, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x49, 0x5a, 0x58, 0x45, 0x52, 0x56, 0x6a, 0x43, 0x33, 0x58, 0x49, 0x69, 0x37, 0x74, 0x6b, 0x51, 0x34, \n\t0x45, 0x6e, 0x53, 0x6c, 0x6a, 0x5a, 0x4a, 0x39, 0x56, 0x6b, 0x41, 0x54, 0x4d, 0x42, 0x6c, 0x69, 0x57, 0x34, \n\t0x35, 0x45, 0x66, 0x64, 0x73, 0x44, 0x54, 0x41, 0x39, 0x4f, 0x6f, 0x52, 0x55, 0x63, 0x4e, 0x4f, 0x78, 0x68, \n\t0x48, 0x74, 0x6b, 0x45, 0x66, 0x66, 0x75, 0x48, 0x6d, 0x42, 0x57, 0x64, 0x41, 0x69, 0x70, 0x6f, 0x47, 0x5c, 0x0a,\n\t0x09, 0x61, 0x52, 0x6e, 0x69, 0x48, 0x31, 0x77, 0x4b, 0x57, 0x4a, 0x76, 0x76, 0x6b, 0x55, 0x4d, 0x42, 0x38, \n\t0x59, 0x46, 0x52, 0x31, 0x45, 0x4b, 0x70, 0x43, 0x56, 0x77, 0x47, 0x37, 0x41, 0x4b, 0x39, 0x46, 0x42, 0x63, \n\t0x75, 0x64, 0x45, 0x33, 0x44, 0x65, 0x76, 0x41, 0x43, 0x64, 0x45, 0x68, 0x35, 0x41, 0x4b, 0x35, 0x67, 0x51, \n\t0x73, 0x34, 0x54, 0x36, 0x78, 0x69, 0x50, 0x76, 0x75, 0x44, 0x75, 0x44, 0x4b, 0x36, 0x42, 0x42, 0x53, 0x5c, 0x0a,\n\t0x09, 0x51, 0x56, 0x78, 0x4a, 0x65, 0x6d, 0x62, 0x55, 0x42, 0x79, 0x35, 0x4e, 0x39, 0x4d, 0x38, 0x51, 0x59, \n\t0x44, 0x62, 0x77, 0x2b, 0x65, 0x67, 0x67, 0x55, 0x73, 0x62, 0x6d, 0x41, 0x4a, 0x50, 0x77, 0x42, 0x33, 0x52, \n\t0x39, 0x5a, 0x68, 0x48, 0x33, 0x33, 0x35, 0x62, 0x41, 0x58, 0x47, 0x42, 0x63, 0x64, 0x42, 0x41, 0x70, 0x51, \n\t0x34, 0x75, 0x41, 0x2f, 0x59, 0x44, 0x6c, 0x30, 0x55, 0x47, 0x4b, 0x78, 0x4b, 0x57, 0x4a, 0x2f, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x73, 0x42, 0x48, 0x41, 0x36, 0x38, 0x46, 0x68, 0x31, 0x45, 0x79, 0x73, 0x78, 0x72, 0x70, 0x47, 0x66, \n\t0x44, 0x45, 0x75, 0x34, 0x6e, 0x69, 0x37, 0x67, 0x2b, 0x38, 0x34, 0x45, 0x76, 0x41, 0x71, 0x75, 0x6a, 0x67, \n\t0x30, 0x69, 0x5a, 0x57, 0x45, 0x31, 0x36, 0x4a, 0x75, 0x5a, 0x48, 0x42, 0x79, 0x6b, 0x69, 0x69, 0x37, 0x68, \n\t0x2b, 0x63, 0x34, 0x45, 0x6a, 0x67, 0x4c, 0x65, 0x69, 0x67, 0x30, 0x6a, 0x42, 0x33, 0x69, 0x49, 0x39, 0x5c, 0x0a,\n\t0x09, 0x43, 0x33, 0x4f, 0x6a, 0x67, 0x78, 0x53, 0x56, 0x61, 0x38, 0x51, 0x44, 0x74, 0x79, 0x39, 0x77, 0x48, \n\t0x7a, 0x41, 0x38, 0x4f, 0x6f, 0x67, 0x55, 0x34, 0x48, 0x58, 0x67, 0x55, 0x43, 0x7a, 0x68, 0x41, 0x58, 0x45, \n\t0x69, 0x48, 0x72, 0x69, 0x35, 0x77, 0x50, 0x37, 0x41, 0x34, 0x75, 0x67, 0x67, 0x55, 0x6f, 0x73, 0x74, 0x4a, \n\t0x6e, 0x33, 0x32, 0x4c, 0x65, 0x45, 0x42, 0x73, 0x6f, 0x67, 0x62, 0x59, 0x78, 0x34, 0x77, 0x45, 0x58, 0x5c, 0x0a,\n\t0x09, 0x67, 0x30, 0x4f, 0x6f, 0x6a, 0x55, 0x49, 0x6f, 0x2b, 0x53, 0x50, 0x76, 0x4f, 0x2b, 0x39, 0x62, 0x77, \n\t0x42, 0x4c, 0x4f, 0x4c, 0x47, 0x57, 0x51, 0x5a, 0x38, 0x41, 0x62, 0x67, 0x32, 0x4f, 0x6f, 0x6a, 0x55, 0x5a, \n\t0x4e, 0x65, 0x53, 0x50, 0x75, 0x76, 0x4c, 0x6f, 0x6f, 0x4f, 0x55, 0x68, 0x57, 0x76, 0x45, 0x7a, 0x66, 0x45, \n\t0x4e, 0x34, 0x42, 0x70, 0x67, 0x73, 0x2b, 0x67, 0x67, 0x55, 0x67, 0x4f, 0x39, 0x42, 0x70, 0x77, 0x43, 0x5c, 0x0a,\n\t0x09, 0x33, 0x42, 0x51, 0x64, 0x70, 0x47, 0x77, 0x73, 0x34, 0x75, 0x59, 0x5a, 0x54, 0x5a, 0x6f, 0x63, 0x44, \n\t0x6f, 0x38, 0x4f, 0x49, 0x6a, 0x58, 0x41, 0x58, 0x63, 0x42, 0x33, 0x67, 0x53, 0x58, 0x52, 0x51, 0x63, 0x72, \n\t0x49, 0x70, 0x59, 0x6e, 0x6d, 0x57, 0x51, 0x4a, 0x4d, 0x41, 0x59, 0x34, 0x46, 0x6c, 0x67, 0x5a, 0x6e, 0x6b, \n\t0x65, 0x71, 0x31, 0x6c, 0x50, 0x51, 0x5a, 0x6e, 0x6f, 0x49, 0x6c, 0x33, 0x44, 0x52, 0x4f, 0x78, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x32, 0x78, 0x43, 0x66, 0x41, 0x6a, 0x34, 0x4b, 0x7a, 0x32, 0x33, 0x30, 0x75, 0x35, 0x57, 0x77, 0x31, \n\t0x63, 0x43, 0x6c, 0x79, 0x4f, 0x42, 0x35, 0x65, 0x61, 0x7a, 0x69, 0x4a, 0x75, 0x72, 0x56, 0x48, 0x41, 0x6d, \n\t0x63, 0x44, 0x70, 0x57, 0x4d, 0x6a, 0x4b, 0x30, 0x32, 0x72, 0x67, 0x4b, 0x74, 0x49, 0x62, 0x6c, 0x31, 0x63, \n\t0x47, 0x5a, 0x36, 0x6b, 0x4d, 0x69, 0x7a, 0x6a, 0x47, 0x5a, 0x73, 0x42, 0x4a, 0x77, 0x47, 0x6e, 0x41, 0x5c, 0x0a,\n\t0x09, 0x74, 0x73, 0x46, 0x5a, 0x4a, 0x49, 0x41, 0x58, 0x67, 0x4a, 0x6e, 0x41, 0x64, 0x58, 0x69, 0x50, 0x53, \n\t0x73, 0x74, 0x5a, 0x78, 0x4c, 0x48, 0x61, 0x67, 0x49, 0x4f, 0x42, 0x61, 0x63, 0x43, 0x52, 0x65, 0x44, 0x70, \n\t0x50, 0x72, 0x66, 0x55, 0x36, 0x63, 0x44, 0x74, 0x77, 0x41, 0x2f, 0x41, 0x67, 0x59, 0x42, 0x6b, 0x45, 0x73, \n\t0x59, 0x6a, 0x7a, 0x4d, 0x5a, 0x52, 0x30, 0x68, 0x2b, 0x74, 0x68, 0x70, 0x43, 0x4f, 0x6a, 0x4f, 0x38, 0x5c, 0x0a,\n\t0x09, 0x66, 0x47, 0x55, 0x55, 0x6b, 0x39, 0x51, 0x7a, 0x71, 0x53, 0x66, 0x7a, 0x66, 0x70, 0x62, 0x75, 0x31, \n\t0x33, 0x59, 0x2b, 0x4d, 0x49, 0x4c, 0x4f, 0x4b, 0x63, 0x62, 0x55, 0x47, 0x36, 0x67, 0x48, 0x34, 0x76, 0x59, \n\t0x45, 0x39, 0x53, 0x4d, 0x57, 0x39, 0x4c, 0x75, 0x70, 0x78, 0x65, 0x36, 0x73, 0x30, 0x61, 0x34, 0x48, 0x6e, \n\t0x67, 0x57, 0x65, 0x42, 0x2f, 0x77, 0x47, 0x4f, 0x6b, 0x43, 0x39, 0x74, 0x66, 0x6a, 0x67, 0x79, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x72, 0x6c, 0x6e, 0x45, 0x6b, 0x68, 0x54, 0x4d, 0x66, 0x63, 0x53, 0x53, 0x46, 0x4d, 0x77, 0x69, 0x6c, \n\t0x71, 0x52, 0x67, 0x46, 0x72, 0x45, 0x6b, 0x42, 0x62, 0x4f, 0x49, 0x4a, 0x53, 0x6d, 0x59, 0x52, 0x53, 0x78, \n\t0x4a, 0x77, 0x53, 0x78, 0x69, 0x53, 0x51, 0x70, 0x6d, 0x45, 0x55, 0x74, 0x53, 0x4d, 0x49, 0x74, 0x59, 0x6b, \n\t0x6f, 0x4a, 0x5a, 0x78, 0x4a, 0x49, 0x55, 0x37, 0x50, 0x38, 0x33, 0x70, 0x45, 0x43, 0x50, 0x6e, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x78, 0x55, 0x43, 0x67, 0x41, 0x41, 0x41, 0x41, 0x42, 0x4a, 0x52, 0x55, 0x35, 0x45, 0x72, 0x6b, 0x4a, \n\t0x67, 0x67, 0x67, 0x3d, 0x3d, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x34, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x62, 0x67, 0x5b, 0x31, 0x5d, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x34, 0x5f, 0x70, \n\t0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x65, 0x63, \n\t0x6f, 0x64, 0x65, 0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, \n\t0x34, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x4c, 0x45, 0x41, 0x41, 0x41, 0x42, 0x55, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x44, 0x4e, 0x6f, 0x4e, 0x62, 0x30, 0x41, 0x41, 0x41, 0x46, 0x7a, 0x30, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x34, 0x6e, 0x4f, 0x33, 0x64, 0x57, 0x34, 0x68, 0x66, 0x78, 0x52, 0x30, 0x48, 0x38, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x6d, 0x47, 0x68, 0x75, 0x4e, 0x78, 0x71, 0x4c, 0x57, 0x65, 0x30, 0x6e, 0x69, 0x4e, 0x55, 0x61, \n\t0x4e, 0x45, 0x6f, 0x6c, 0x33, 0x74, 0x4a, 0x72, 0x59, 0x34, 0x4c, 0x33, 0x31, 0x32, 0x74, 0x59, 0x62, 0x49, \n\t0x6c, 0x70, 0x42, 0x30, 0x42, 0x63, 0x56, 0x76, 0x44, 0x79, 0x31, 0x59, 0x49, 0x67, 0x6f, 0x4b, 0x71, 0x69, \n\t0x6f, 0x45, 0x47, 0x4b, 0x66, 0x4b, 0x6c, 0x67, 0x6f, 0x32, 0x49, 0x63, 0x47, 0x71, 0x69, 0x67, 0x59, 0x5c, 0x0a,\n\t0x09, 0x78, 0x49, 0x69, 0x59, 0x78, 0x74, 0x59, 0x6f, 0x61, 0x68, 0x53, 0x4c, 0x4e, 0x57, 0x68, 0x44, 0x69, \n\t0x37, 0x66, 0x71, 0x4a, 0x6e, 0x48, 0x37, 0x4d, 0x43, 0x73, 0x6d, 0x4d, 0x53, 0x79, 0x37, 0x63, 0x2b, 0x62, \n\t0x63, 0x39, 0x76, 0x2f, 0x37, 0x77, 0x4a, 0x39, 0x41, 0x73, 0x6a, 0x50, 0x7a, 0x65, 0x2f, 0x6a, 0x75, 0x79, \n\t0x66, 0x7a, 0x50, 0x6d, 0x5a, 0x6b, 0x7a, 0x4e, 0x44, 0x49, 0x79, 0x49, 0x6f, 0x51, 0x2b, 0x6d, 0x39, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x32, 0x41, 0x53, 0x46, 0x55, 0x46, 0x53, 0x45, 0x4f, 0x76, 0x52, 0x63, 0x68, 0x44, 0x72, 0x30, \n\t0x58, 0x49, 0x51, 0x36, 0x39, 0x46, 0x79, 0x45, 0x4f, 0x76, 0x62, 0x64, 0x44, 0x32, 0x77, 0x57, 0x45, 0x53, \n\t0x6e, 0x62, 0x46, 0x63, 0x54, 0x67, 0x65, 0x63, 0x7a, 0x41, 0x4c, 0x4d, 0x37, 0x48, 0x62, 0x36, 0x47, 0x63, \n\t0x49, 0x49, 0x2f, 0x68, 0x30, 0x39, 0x50, 0x4d, 0x78, 0x31, 0x75, 0x4a, 0x74, 0x2f, 0x42, 0x30, 0x76, 0x5c, 0x0a,\n\t0x09, 0x59, 0x45, 0x50, 0x54, 0x52, 0x5a, 0x63, 0x32, 0x46, 0x4c, 0x66, 0x59, 0x65, 0x75, 0x63, 0x77, 0x58, \n\t0x49, 0x6a, 0x7a, 0x63, 0x59, 0x4a, 0x71, 0x2f, 0x35, 0x75, 0x4f, 0x59, 0x41, 0x32, 0x65, 0x78, 0x52, 0x2f, \n\t0x77, 0x53, 0x75, 0x58, 0x71, 0x57, 0x68, 0x41, 0x68, 0x37, 0x6f, 0x64, 0x70, 0x75, 0x41, 0x7a, 0x58, 0x34, \n\t0x65, 0x51, 0x61, 0x78, 0x33, 0x6b, 0x54, 0x54, 0x2b, 0x49, 0x78, 0x2f, 0x4b, 0x66, 0x47, 0x63, 0x59, 0x5c, 0x0a,\n\t0x09, 0x71, 0x4b, 0x45, 0x48, 0x66, 0x62, 0x4e, 0x4e, 0x79, 0x41, 0x32, 0x37, 0x46, 0x50, 0x67, 0x2b, 0x4e, \n\t0x2b, 0x67, 0x59, 0x66, 0x78, 0x41, 0x44, 0x35, 0x71, 0x63, 0x4e, 0x77, 0x73, 0x45, 0x65, 0x49, 0x79, 0x64, \n\t0x73, 0x47, 0x68, 0x4f, 0x41, 0x67, 0x48, 0x59, 0x67, 0x61, 0x6d, 0x59, 0x7a, 0x4d, 0x2b, 0x6b, 0x2b, 0x61, \n\t0x6a, 0x2f, 0x2f, 0x4c, 0x64, 0x66, 0x48, 0x52, 0x34, 0x48, 0x48, 0x31, 0x65, 0x6a, 0x76, 0x75, 0x77, 0x5c, 0x0a,\n\t0x09, 0x58, 0x77, 0x33, 0x31, 0x6a, 0x74, 0x65, 0x58, 0x2b, 0x43, 0x33, 0x75, 0x4e, 0x37, 0x36, 0x61, 0x57, \n\t0x78, 0x45, 0x68, 0x7a, 0x76, 0x4d, 0x44, 0x6e, 0x43, 0x37, 0x4e, 0x53, 0x30, 0x2f, 0x42, 0x76, 0x4e, 0x47, \n\t0x2f, 0x47, 0x34, 0x2f, 0x4e, 0x65, 0x42, 0x30, 0x72, 0x38, 0x42, 0x65, 0x73, 0x78, 0x4d, 0x59, 0x74, 0x2f, \n\t0x6e, 0x30, 0x6d, 0x6c, 0x75, 0x47, 0x6e, 0x5a, 0x55, 0x6f, 0x74, 0x34, 0x69, 0x33, 0x38, 0x42, 0x73, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x33, 0x58, 0x4d, 0x64, 0x32, 0x52, 0x59, 0x67, 0x6e, 0x35, 0x68, 0x44, 0x63, 0x68, 0x46, 0x39, \n\t0x68, 0x7a, 0x30, 0x4a, 0x39, 0x66, 0x6f, 0x4c, 0x6c, 0x65, 0x42, 0x77, 0x4c, 0x38, 0x4b, 0x68, 0x30, 0x5a, \n\t0x36, 0x46, 0x72, 0x52, 0x72, 0x41, 0x55, 0x64, 0x32, 0x46, 0x54, 0x79, 0x37, 0x56, 0x73, 0x4a, 0x55, 0x49, \n\t0x38, 0x50, 0x6b, 0x66, 0x69, 0x64, 0x39, 0x4b, 0x56, 0x64, 0x36, 0x6a, 0x6c, 0x57, 0x74, 0x72, 0x32, 0x5c, 0x0a,\n\t0x09, 0x41, 0x69, 0x37, 0x47, 0x76, 0x39, 0x73, 0x75, 0x35, 0x46, 0x73, 0x52, 0x34, 0x72, 0x48, 0x74, 0x67, \n\t0x58, 0x74, 0x78, 0x6a, 0x51, 0x6a, 0x76, 0x6c, 0x74, 0x37, 0x46, 0x59, 0x72, 0x7a, 0x54, 0x64, 0x69, 0x45, \n\t0x4d, 0x56, 0x6f, 0x68, 0x33, 0x6b, 0x72, 0x37, 0x74, 0x54, 0x38, 0x56, 0x58, 0x30, 0x70, 0x65, 0x74, 0x73, \n\t0x56, 0x77, 0x6b, 0x66, 0x55, 0x50, 0x66, 0x75, 0x2b, 0x61, 0x36, 0x2b, 0x75, 0x6f, 0x6a, 0x2f, 0x45, 0x5c, 0x0a,\n\t0x09, 0x79, 0x61, 0x33, 0x37, 0x64, 0x71, 0x4d, 0x6f, 0x5a, 0x34, 0x52, 0x35, 0x77, 0x30, 0x2b, 0x6c, 0x6d, \n\t0x41, 0x67, 0x36, 0x57, 0x37, 0x42, 0x74, 0x4f, 0x32, 0x2b, 0x62, 0x6c, 0x4e, 0x2b, 0x43, 0x66, 0x57, 0x34, \n\t0x56, 0x57, 0x38, 0x6a, 0x4f, 0x65, 0x6b, 0x32, 0x30, 0x76, 0x33, 0x34, 0x75, 0x61, 0x47, 0x36, 0x75, 0x32, \n\t0x7a, 0x39, 0x54, 0x68, 0x56, 0x79, 0x31, 0x66, 0x6b, 0x79, 0x52, 0x4c, 0x69, 0x49, 0x5a, 0x79, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x71, 0x33, 0x47, 0x65, 0x64, 0x49, 0x73, 0x72, 0x78, 0x32, 0x5a, 0x38, 0x69, 0x4a, 0x38, 0x55, 0x71, \n\t0x6d, 0x73, 0x51, 0x76, 0x43, 0x63, 0x39, 0x4f, 0x66, 0x79, 0x34, 0x72, 0x51, 0x4c, 0x36, 0x48, 0x75, 0x49, \n\t0x64, 0x63, 0x43, 0x56, 0x75, 0x77, 0x2b, 0x45, 0x74, 0x31, 0x7a, 0x4c, 0x49, 0x56, 0x75, 0x49, 0x4d, 0x4c, \n\t0x64, 0x31, 0x4c, 0x37, 0x76, 0x4d, 0x71, 0x74, 0x73, 0x58, 0x53, 0x66, 0x47, 0x79, 0x5a, 0x43, 0x48, 0x5c, 0x0a,\n\t0x09, 0x44, 0x62, 0x54, 0x73, 0x61, 0x53, 0x74, 0x67, 0x62, 0x76, 0x34, 0x35, 0x58, 0x34, 0x52, 0x33, 0x67, \n\t0x49, 0x56, 0x37, 0x52, 0x64, 0x53, 0x50, 0x69, 0x65, 0x52, 0x66, 0x68, 0x72, 0x30, 0x34, 0x50, 0x32, 0x4c, \n\t0x63, 0x54, 0x48, 0x34, 0x6d, 0x6e, 0x4d, 0x62, 0x72, 0x75, 0x51, 0x73, 0x46, 0x33, 0x72, 0x4d, 0x46, 0x65, \n\t0x36, 0x2b, 0x39, 0x4f, 0x59, 0x50, 0x6b, 0x30, 0x6e, 0x7a, 0x70, 0x58, 0x6d, 0x58, 0x68, 0x48, 0x67, 0x5c, 0x0a,\n\t0x09, 0x37, 0x70, 0x71, 0x4e, 0x4f, 0x35, 0x73, 0x65, 0x74, 0x43, 0x39, 0x58, 0x34, 0x6c, 0x39, 0x4c, 0x6a, \n\t0x32, 0x5a, 0x6a, 0x45, 0x58, 0x2f, 0x33, 0x44, 0x55, 0x75, 0x50, 0x35, 0x7a, 0x39, 0x6f, 0x61, 0x73, 0x41, \n\t0x2b, 0x58, 0x49, 0x6e, 0x50, 0x45, 0x51, 0x48, 0x75, 0x6b, 0x36, 0x6d, 0x34, 0x74, 0x63, 0x6b, 0x42, 0x75, \n\t0x33, 0x34, 0x6c, 0x6e, 0x6f, 0x65, 0x58, 0x66, 0x50, 0x39, 0x42, 0x52, 0x65, 0x69, 0x32, 0x72, 0x36, 0x5c, 0x0a,\n\t0x09, 0x53, 0x70, 0x52, 0x53, 0x4e, 0x72, 0x6b, 0x62, 0x74, 0x38, 0x4a, 0x5a, 0x36, 0x42, 0x50, 0x34, 0x6f, \n\t0x41, 0x39, 0x39, 0x45, 0x50, 0x63, 0x57, 0x4e, 0x54, 0x67, 0x33, 0x55, 0x35, 0x78, 0x41, 0x39, 0x49, 0x6a, \n\t0x34, 0x74, 0x44, 0x50, 0x31, 0x32, 0x70, 0x6f, 0x55, 0x56, 0x54, 0x58, 0x51, 0x33, 0x78, 0x51, 0x6d, 0x6e, \n\t0x6c, 0x57, 0x4f, 0x69, 0x76, 0x6d, 0x54, 0x69, 0x74, 0x69, 0x59, 0x47, 0x36, 0x47, 0x4f, 0x49, 0x70, 0x5c, 0x0a,\n\t0x09, 0x30, 0x6e, 0x61, 0x59, 0x30, 0x48, 0x38, 0x58, 0x4e, 0x54, 0x46, 0x49, 0x46, 0x30, 0x4e, 0x38, 0x4f, \n\t0x59, 0x35, 0x71, 0x75, 0x34, 0x68, 0x51, 0x78, 0x4d, 0x49, 0x6d, 0x42, 0x75, 0x6e, 0x69, 0x33, 0x59, 0x6e, \n\t0x58, 0x63, 0x45, 0x7a, 0x62, 0x52, 0x59, 0x52, 0x69, 0x39, 0x70, 0x63, 0x32, 0x79, 0x64, 0x61, 0x6d, 0x61, \n\t0x31, 0x66, 0x69, 0x45, 0x30, 0x57, 0x41, 0x4a, 0x35, 0x74, 0x54, 0x36, 0x68, 0x36, 0x67, 0x61, 0x79, 0x5c, 0x0a,\n\t0x09, 0x47, 0x4f, 0x52, 0x54, 0x32, 0x54, 0x7a, 0x35, 0x79, 0x36, 0x42, 0x2b, 0x68, 0x53, 0x69, 0x49, 0x66, \n\t0x77, 0x38, 0x37, 0x61, 0x4c, 0x43, 0x4d, 0x55, 0x64, 0x56, 0x76, 0x63, 0x41, 0x58, 0x51, 0x72, 0x78, 0x58, \n\t0x4f, 0x7a, 0x62, 0x64, 0x68, 0x47, 0x68, 0x75, 0x49, 0x50, 0x72, 0x48, 0x71, 0x42, 0x4c, 0x49, 0x54, 0x36, \n\t0x70, 0x37, 0x51, 0x4a, 0x43, 0x4c, 0x66, 0x61, 0x71, 0x65, 0x34, 0x41, 0x32, 0x46, 0x74, 0x55, 0x63, 0x5c, 0x0a,\n\t0x09, 0x49, 0x45, 0x33, 0x32, 0x35, 0x30, 0x6a, 0x50, 0x31, 0x33, 0x65, 0x54, 0x48, 0x6a, 0x48, 0x48, 0x76, \n\t0x72, 0x62, 0x4a, 0x61, 0x64, 0x65, 0x36, 0x42, 0x32, 0x67, 0x71, 0x78, 0x4c, 0x4f, 0x6b, 0x54, 0x5a, 0x79, \n\t0x2f, 0x6c, 0x4d, 0x34, 0x73, 0x43, 0x34, 0x4e, 0x6a, 0x65, 0x74, 0x30, 0x44, 0x31, 0x48, 0x32, 0x66, 0x65, \n\t0x43, 0x37, 0x75, 0x78, 0x71, 0x58, 0x69, 0x38, 0x4a, 0x46, 0x42, 0x64, 0x72, 0x68, 0x30, 0x6e, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x73, 0x74, 0x36, 0x70, 0x6f, 0x54, 0x37, 0x79, 0x4b, 0x64, 0x36, 0x50, 0x67, 0x33, 0x36, 0x56, 0x7a, \n\t0x64, 0x43, 0x50, 0x42, 0x67, 0x2b, 0x34, 0x64, 0x30, 0x6c, 0x73, 0x66, 0x4f, 0x64, 0x58, 0x52, 0x65, 0x78, \n\t0x35, 0x58, 0x34, 0x53, 0x44, 0x79, 0x46, 0x49, 0x30, 0x70, 0x33, 0x48, 0x48, 0x72, 0x76, 0x44, 0x56, 0x77, \n\t0x79, 0x2b, 0x6d, 0x63, 0x78, 0x70, 0x55, 0x4f, 0x38, 0x53, 0x46, 0x6f, 0x44, 0x58, 0x50, 0x74, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x50, 0x76, 0x54, 0x57, 0x70, 0x39, 0x4c, 0x30, 0x63, 0x6b, 0x57, 0x70, 0x44, 0x6b, 0x75, 0x47, 0x2b, \n\t0x47, 0x7a, 0x38, 0x53, 0x54, 0x70, 0x47, 0x4b, 0x6f, 0x53, 0x78, 0x62, 0x4d, 0x51, 0x76, 0x38, 0x4f, 0x63, \n\t0x53, 0x6e, 0x5a, 0x55, 0x4b, 0x38, 0x51, 0x6e, 0x53, 0x4f, 0x57, 0x61, 0x78, 0x43, 0x79, 0x4f, 0x4d, 0x31, \n\t0x2f, 0x2b, 0x6b, 0x67, 0x38, 0x70, 0x58, 0x56, 0x65, 0x32, 0x6f, 0x52, 0x49, 0x6a, 0x33, 0x78, 0x47, 0x5c, 0x0a,\n\t0x09, 0x70, 0x70, 0x74, 0x56, 0x49, 0x49, 0x45, 0x2f, 0x47, 0x68, 0x64, 0x4a, 0x62, 0x49, 0x4a, 0x31, 0x55, \n\t0x36, 0x4b, 0x58, 0x46, 0x33, 0x34, 0x67, 0x6b, 0x52, 0x34, 0x4a, 0x42, 0x6e, 0x66, 0x79, 0x6b, 0x2f, 0x6c, \n\t0x56, 0x53, 0x39, 0x45, 0x70, 0x2b, 0x4c, 0x5a, 0x36, 0x6f, 0x57, 0x45, 0x51, 0x62, 0x65, 0x2b, 0x53, 0x72, \n\t0x6b, 0x71, 0x45, 0x71, 0x49, 0x70, 0x30, 0x68, 0x76, 0x70, 0x61, 0x78, 0x39, 0x71, 0x56, 0x32, 0x59, 0x5c, 0x0a,\n\t0x09, 0x39, 0x4e, 0x5a, 0x4b, 0x74, 0x32, 0x61, 0x2f, 0x79, 0x57, 0x6c, 0x63, 0x5a, 0x54, 0x70, 0x78, 0x67, \n\t0x51, 0x68, 0x77, 0x4b, 0x47, 0x4f, 0x4f, 0x39, 0x4a, 0x62, 0x55, 0x4c, 0x46, 0x56, 0x43, 0x66, 0x48, 0x32, \n\t0x46, 0x74, 0x69, 0x46, 0x73, 0x4b, 0x2f, 0x75, 0x63, 0x69, 0x74, 0x7a, 0x70, 0x78, 0x49, 0x2b, 0x6c, 0x30, \n\t0x31, 0x32, 0x36, 0x74, 0x4a, 0x51, 0x7a, 0x39, 0x4e, 0x73, 0x33, 0x30, 0x6e, 0x72, 0x79, 0x43, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x38, 0x34, 0x6e, 0x78, 0x76, 0x43, 0x68, 0x52, 0x58, 0x61, 0x68, 0x72, 0x41, 0x39, 0x55, 0x33, 0x42, \n\t0x57, 0x62, 0x73, 0x4d, 0x63, 0x6a, 0x52, 0x79, 0x4b, 0x45, 0x51, 0x62, 0x4f, 0x71, 0x54, 0x6d, 0x4e, 0x63, \n\t0x6b, 0x4d, 0x63, 0x69, 0x33, 0x74, 0x43, 0x48, 0x65, 0x62, 0x6c, 0x4e, 0x4d, 0x6f, 0x4e, 0x63, 0x53, 0x78, \n\t0x73, 0x44, 0x33, 0x57, 0x59, 0x6d, 0x64, 0x4d, 0x6f, 0x39, 0x34, 0x76, 0x64, 0x73, 0x46, 0x6a, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x45, 0x2b, 0x6f, 0x78, 0x34, 0x62, 0x58, 0x6e, 0x75, 0x53, 0x48, 0x75, 0x33, 0x4c, 0x46, 0x42, 0x59, \n\t0x64, 0x4b, 0x59, 0x63, 0x49, 0x68, 0x7a, 0x70, 0x78, 0x4d, 0x52, 0x34, 0x6c, 0x43, 0x48, 0x72, 0x46, 0x7a, \n\t0x6c, 0x68, 0x76, 0x69, 0x2f, 0x6d, 0x65, 0x31, 0x43, 0x47, 0x45, 0x74, 0x57, 0x72, 0x6e, 0x4a, 0x44, 0x33, \n\t0x4e, 0x68, 0x4c, 0x52, 0x63, 0x4a, 0x41, 0x79, 0x63, 0x70, 0x56, 0x62, 0x6f, 0x6a, 0x58, 0x5a, 0x72, 0x5c, 0x0a,\n\t0x09, 0x59, 0x4c, 0x59, 0x53, 0x78, 0x5a, 0x75, 0x63, 0x6f, 0x4e, 0x38, 0x63, 0x72, 0x4d, 0x64, 0x69, 0x47, \n\t0x4d, 0x4a, 0x53, 0x74, 0x58, 0x75, 0x53, 0x46, 0x2b, 0x4c, 0x72, 0x4e, 0x64, 0x43, 0x47, 0x50, 0x4a, 0x79, \n\t0x6c, 0x56, 0x75, 0x69, 0x4e, 0x2b, 0x51, 0x58, 0x67, 0x34, 0x65, 0x51, 0x69, 0x6d, 0x76, 0x79, 0x39, 0x7a, \n\t0x4b, 0x58, 0x32, 0x55, 0x52, 0x7a, 0x2f, 0x49, 0x4b, 0x62, 0x55, 0x50, 0x59, 0x31, 0x76, 0x4c, 0x63, 0x5c, 0x0a,\n\t0x09, 0x68, 0x6c, 0x56, 0x32, 0x64, 0x6b, 0x7a, 0x48, 0x2b, 0x39, 0x67, 0x6a, 0x74, 0x34, 0x4d, 0x51, 0x52, \n\t0x6d, 0x32, 0x51, 0x48, 0x6a, 0x6c, 0x2f, 0x6e, 0x74, 0x4f, 0x34, 0x79, 0x70, 0x58, 0x34, 0x63, 0x79, 0x79, \n\t0x74, 0x30, 0x44, 0x36, 0x45, 0x62, 0x79, 0x32, 0x56, 0x47, 0x57, 0x43, 0x71, 0x62, 0x78, 0x53, 0x64, 0x4b, \n\t0x6d, 0x33, 0x58, 0x6a, 0x32, 0x31, 0x4b, 0x49, 0x64, 0x64, 0x61, 0x36, 0x54, 0x30, 0x74, 0x77, 0x37, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x64, 0x56, 0x46, 0x33, 0x59, 0x50, 0x69, 0x79, 0x39, 0x4e, 0x48, 0x46, 0x6a, 0x78, 0x58, 0x37, \n\t0x43, 0x59, 0x4e, 0x6f, 0x6f, 0x35, 0x53, 0x63, 0x37, 0x77, 0x4a, 0x54, 0x5a, 0x6e, 0x62, 0x45, 0x4b, 0x74, \n\t0x78, 0x54, 0x6f, 0x4a, 0x77, 0x79, 0x65, 0x57, 0x78, 0x51, 0x34, 0x41, 0x61, 0x6a, 0x55, 0x46, 0x71, 0x4e, \n\t0x48, 0x73, 0x4b, 0x52, 0x51, 0x58, 0x32, 0x45, 0x77, 0x4c, 0x4a, 0x46, 0x79, 0x55, 0x31, 0x6e, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x66, 0x58, 0x4a, 0x33, 0x34, 0x4a, 0x36, 0x43, 0x2f, 0x59, 0x58, 0x4a, 0x36, 0x78, 0x34, 0x70, 0x4c, \n\t0x30, 0x58, 0x55, 0x63, 0x54, 0x37, 0x78, 0x44, 0x58, 0x67, 0x51, 0x4f, 0x35, 0x58, 0x75, 0x4f, 0x50, 0x54, \n\t0x65, 0x31, 0x37, 0x67, 0x5a, 0x6a, 0x35, 0x58, 0x73, 0x74, 0x4b, 0x37, 0x58, 0x48, 0x52, 0x79, 0x44, 0x4a, \n\t0x33, 0x46, 0x30, 0x48, 0x5a, 0x32, 0x48, 0x58, 0x6c, 0x6f, 0x6a, 0x76, 0x62, 0x64, 0x6c, 0x64, 0x65, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x4f, 0x36, 0x39, 0x70, 0x32, 0x76, 0x78, 0x72, 0x7a, 0x70, 0x64, 0x2b, 0x36, 0x39, 0x54, 0x57, \n\t0x4e, 0x45, 0x66, 0x70, 0x68, 0x76, 0x5a, 0x53, 0x44, 0x2b, 0x57, 0x6f, 0x49, 0x4d, 0x4d, 0x32, 0x38, 0x6f, \n\t0x48, 0x77, 0x61, 0x72, 0x73, 0x4b, 0x31, 0x57, 0x46, 0x44, 0x33, 0x59, 0x4b, 0x45, 0x7a, 0x56, 0x6d, 0x45, \n\t0x5a, 0x66, 0x69, 0x2b, 0x64, 0x52, 0x56, 0x79, 0x62, 0x4a, 0x6b, 0x4b, 0x38, 0x70, 0x56, 0x6b, 0x34, 0x5c, 0x0a,\n\t0x09, 0x30, 0x39, 0x62, 0x76, 0x73, 0x64, 0x74, 0x64, 0x4f, 0x2b, 0x2f, 0x54, 0x43, 0x32, 0x56, 0x73, 0x6b, \n\t0x6e, 0x5a, 0x6b, 0x72, 0x4a, 0x4d, 0x65, 0x58, 0x4c, 0x79, 0x49, 0x5a, 0x2f, 0x46, 0x65, 0x55, 0x77, 0x55, \n\t0x30, 0x48, 0x65, 0x49, 0x51, 0x69, 0x6f, 0x75, 0x6a, 0x71, 0x45, 0x4c, 0x76, 0x52, 0x59, 0x68, 0x44, 0x37, \n\t0x30, 0x57, 0x49, 0x51, 0x2b, 0x39, 0x46, 0x69, 0x45, 0x50, 0x76, 0x52, 0x59, 0x68, 0x44, 0x37, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x30, 0x66, 0x48, 0x76, 0x49, 0x79, 0x52, 0x75, 0x36, 0x4f, 0x4a, 0x54, 0x6b, 0x41, 0x41, 0x41, 0x41, \n\t0x41, 0x53, 0x55, 0x56, 0x4f, 0x52, 0x4b, 0x35, 0x43, 0x59, 0x49, 0x49, 0x3d, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x34, 0x40, 0x32, 0x78, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x62, 0x67, 0x5b, 0x32, 0x5d, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x34, 0x5f, 0x70, \n\t0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x65, 0x63, \n\t0x6f, 0x64, 0x65, 0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, \n\t0x34, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x57, 0x49, 0x41, 0x41, 0x41, 0x43, 0x6f, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x44, 0x61, 0x57, 0x4f, 0x51, 0x63, 0x41, 0x41, 0x41, 0x4d, 0x4f, 0x6b, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x34, 0x6e, 0x4f, 0x33, 0x64, 0x65, 0x2b, 0x7a, 0x58, 0x56, 0x52, 0x33, 0x48, 0x38, 0x65, 0x5c, 0x0a,\n\t0x09, 0x64, 0x50, 0x37, 0x6f, 0x4b, 0x43, 0x43, 0x6f, 0x4c, 0x49, 0x54, 0x55, 0x45, 0x79, 0x6c, 0x4a, 0x75, \n\t0x58, 0x79, 0x6b, 0x51, 0x6c, 0x74, 0x51, 0x4a, 0x76, 0x58, 0x62, 0x7a, 0x4e, 0x51, 0x5a, 0x6e, 0x6c, 0x4a, \n\t0x53, 0x30, 0x76, 0x4d, 0x46, 0x65, 0x75, 0x5a, 0x57, 0x70, 0x4f, 0x32, 0x39, 0x79, 0x79, 0x6c, 0x4f, 0x34, \n\t0x7a, 0x4d, 0x5a, 0x65, 0x6c, 0x6b, 0x71, 0x32, 0x38, 0x32, 0x33, 0x52, 0x71, 0x6d, 0x61, 0x36, 0x47, 0x5c, 0x0a,\n\t0x09, 0x55, 0x31, 0x44, 0x4c, 0x4e, 0x50, 0x43, 0x53, 0x42, 0x6f, 0x6a, 0x6d, 0x42, 0x56, 0x6b, 0x52, 0x36, \n\t0x4b, 0x38, 0x2f, 0x7a, 0x75, 0x39, 0x6e, 0x69, 0x4c, 0x2f, 0x72, 0x39, 0x33, 0x4c, 0x65, 0x6e, 0x38, 0x2f, \n\t0x33, 0x2b, 0x33, 0x78, 0x73, 0x54, 0x4f, 0x5a, 0x6c, 0x35, 0x36, 0x56, 0x7a, 0x4c, 0x77, 0x37, 0x6e, 0x63, \n\t0x79, 0x34, 0x74, 0x72, 0x61, 0x32, 0x74, 0x53, 0x4a, 0x4c, 0x69, 0x62, 0x42, 0x55, 0x64, 0x51, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x61, 0x6e, 0x55, 0x55, 0x73, 0x53, 0x63, 0x45, 0x73, 0x59, 0x6b, 0x6b, 0x4b, 0x5a, 0x68, 0x46, \n\t0x4c, 0x55, 0x6a, 0x43, 0x4c, 0x57, 0x4a, 0x4b, 0x43, 0x57, 0x63, 0x53, 0x53, 0x46, 0x4d, 0x77, 0x69, 0x6c, \n\t0x71, 0x52, 0x67, 0x46, 0x72, 0x45, 0x6b, 0x42, 0x62, 0x4f, 0x49, 0x4a, 0x53, 0x6d, 0x59, 0x52, 0x53, 0x78, \n\t0x4a, 0x77, 0x53, 0x78, 0x69, 0x53, 0x51, 0x72, 0x57, 0x4e, 0x7a, 0x71, 0x41, 0x70, 0x48, 0x63, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x42, 0x48, 0x59, 0x44, 0x4a, 0x72, 0x66, 0x39, 0x63, 0x54, 0x77, 0x77, 0x47, 0x74, 0x67, 0x4a, 0x32, \n\t0x4b, 0x37, 0x74, 0x78, 0x7a, 0x43, 0x67, 0x7a, 0x78, 0x62, 0x2f, 0x33, 0x46, 0x76, 0x41, 0x6d, 0x38, 0x41, \n\t0x36, 0x59, 0x43, 0x33, 0x77, 0x43, 0x72, 0x41, 0x4b, 0x65, 0x4c, 0x62, 0x74, 0x78, 0x30, 0x72, 0x67, 0x73, \n\t0x62, 0x59, 0x2f, 0x72, 0x77, 0x4a, 0x71, 0x38, 0x64, 0x49, 0x66, 0x4b, 0x63, 0x52, 0x57, 0x77, 0x42, 0x5c, 0x0a,\n\t0x09, 0x37, 0x41, 0x41, 0x63, 0x43, 0x48, 0x67, 0x42, 0x6e, 0x41, 0x46, 0x4e, 0x35, 0x62, 0x73, 0x72, 0x57, \n\t0x30, 0x43, 0x6c, 0x67, 0x4f, 0x2f, 0x41, 0x6c, 0x34, 0x45, 0x48, 0x67, 0x49, 0x65, 0x4b, 0x4f, 0x4f, 0x34, \n\t0x36, 0x6d, 0x48, 0x4c, 0x47, 0x49, 0x70, 0x6e, 0x35, 0x32, 0x42, 0x4f, 0x63, 0x42, 0x63, 0x34, 0x47, 0x44, \n\t0x53, 0x44, 0x44, 0x66, 0x53, 0x32, 0x38, 0x42, 0x53, 0x34, 0x43, 0x37, 0x67, 0x44, 0x75, 0x44, 0x50, 0x5c, 0x0a,\n\t0x09, 0x70, 0x4e, 0x6d, 0x31, 0x4d, 0x72, 0x4f, 0x49, 0x70, 0x66, 0x6f, 0x61, 0x41, 0x78, 0x77, 0x50, 0x48, \n\t0x41, 0x74, 0x38, 0x4d, 0x44, 0x68, 0x4c, 0x64, 0x39, 0x59, 0x43, 0x76, 0x77, 0x61, 0x57, 0x41, 0x50, 0x65, \n\t0x53, 0x69, 0x6c, 0x6f, 0x5a, 0x57, 0x4d, 0x52, 0x53, 0x37, 0x66, 0x55, 0x48, 0x6a, 0x67, 0x5a, 0x4f, 0x41, \n\t0x67, 0x34, 0x46, 0x57, 0x6d, 0x4c, 0x6a, 0x56, 0x4f, 0x51, 0x46, 0x59, 0x44, 0x46, 0x77, 0x4e, 0x57, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x64, 0x57, 0x58, 0x56, 0x6b, 0x45, 0x55, 0x75, 0x31, 0x4d, 0x78, 0x6f, 0x34, 0x41, 0x7a, 0x67, \n\t0x56, 0x47, 0x42, 0x47, 0x63, 0x70, 0x56, 0x5a, 0x61, 0x53, 0x63, 0x73, 0x57, 0x33, 0x77, 0x48, 0x75, 0x44, \n\t0x73, 0x37, 0x53, 0x73, 0x43, 0x78, 0x69, 0x71, 0x58, 0x71, 0x54, 0x67, 0x4b, 0x38, 0x43, 0x4a, 0x77, 0x4c, \n\t0x39, 0x67, 0x72, 0x50, 0x55, 0x30, 0x33, 0x4c, 0x67, 0x57, 0x38, 0x43, 0x4e, 0x75, 0x47, 0x78, 0x52, 0x5c, 0x0a,\n\t0x09, 0x55, 0x78, 0x61, 0x78, 0x56, 0x4c, 0x6e, 0x78, 0x77, 0x45, 0x58, 0x41, 0x66, 0x4f, 0x71, 0x37, 0x32, \n\t0x36, 0x46, 0x6f, 0x2f, 0x67, 0x70, 0x38, 0x45, 0x37, 0x69, 0x42, 0x4e, 0x47, 0x4e, 0x57, 0x6c, 0x53, 0x78, \n\t0x69, 0x6c, 0x63, 0x6c, 0x67, 0x33, 0x6a, 0x76, 0x6a, 0x66, 0x42, 0x50, 0x59, 0x6c, 0x44, 0x6e, 0x48, 0x4d, \n\t0x4f, 0x41, 0x62, 0x77, 0x4a, 0x63, 0x37, 0x79, 0x4e, 0x4e, 0x4d, 0x6c, 0x67, 0x49, 0x4c, 0x67, 0x41, 0x5c, 0x0a,\n\t0x09, 0x65, 0x69, 0x67, 0x35, 0x53, 0x64, 0x52, 0x61, 0x77, 0x69, 0x32, 0x51, 0x57, 0x59, 0x43, 0x72, 0x79, \n\t0x50, 0x64, 0x4b, 0x42, 0x68, 0x48, 0x44, 0x41, 0x57, 0x47, 0x45, 0x37, 0x61, 0x36, 0x74, 0x56, 0x5a, 0x36, \n\t0x57, 0x30, 0x6b, 0x48, 0x56, 0x5a, 0x59, 0x53, 0x39, 0x6f, 0x72, 0x2b, 0x33, 0x66, 0x53, 0x49, 0x59, 0x61, \n\t0x6e, 0x67, 0x45, 0x65, 0x42, 0x66, 0x39, 0x51, 0x6f, 0x58, 0x77, 0x74, 0x77, 0x4d, 0x6e, 0x42, 0x70, 0x5c, 0x0a,\n\t0x09, 0x57, 0x79, 0x59, 0x6c, 0x4e, 0x77, 0x49, 0x4c, 0x67, 0x52, 0x65, 0x6a, 0x67, 0x35, 0x53, 0x56, 0x52, \n\t0x61, 0x77, 0x6f, 0x2f, 0x59, 0x45, 0x50, 0x41, 0x4c, 0x4f, 0x42, 0x57, 0x57, 0x30, 0x2f, 0x72, 0x39, 0x65, \n\t0x2b, 0x32, 0x70, 0x64, 0x4a, 0x73, 0x37, 0x66, 0x37, 0x67, 0x66, 0x76, 0x61, 0x66, 0x74, 0x37, 0x62, 0x57, \n\t0x66, 0x51, 0x55, 0x34, 0x43, 0x66, 0x41, 0x2f, 0x6a, 0x56, 0x4e, 0x31, 0x6a, 0x6a, 0x57, 0x6b, 0x64, 0x5c, 0x0a,\n\t0x09, 0x62, 0x4a, 0x66, 0x34, 0x7a, 0x72, 0x78, 0x37, 0x31, 0x6d, 0x45, 0x53, 0x75, 0x6e, 0x6f, 0x63, 0x41, \n\t0x6e, 0x67, 0x4b, 0x4f, 0x41, 0x6a, 0x77, 0x4e, 0x44, 0x67, 0x6e, 0x4b, 0x38, 0x51, 0x64, 0x6f, 0x4a, 0x38, \n\t0x46, 0x76, 0x67, 0x64, 0x75, 0x44, 0x31, 0x4c, 0x76, 0x37, 0x65, 0x50, 0x73, 0x43, 0x35, 0x70, 0x44, 0x58, \n\t0x52, 0x2f, 0x76, 0x57, 0x50, 0x56, 0x6e, 0x6f, 0x50, 0x6b, 0x44, 0x35, 0x61, 0x72, 0x6f, 0x77, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x55, 0x69, 0x59, 0x57, 0x73, 0x65, 0x71, 0x74, 0x4c, 0x33, 0x41, 0x45, 0x38, 0x46, 0x6e, 0x67, 0x63, \n\t0x49, 0x70, 0x58, 0x5a, 0x68, 0x74, 0x49, 0x68, 0x66, 0x77, 0x7a, 0x34, 0x48, 0x65, 0x38, 0x65, 0x36, 0x59, \n\t0x38, 0x44, 0x76, 0x67, 0x46, 0x7a, 0x6f, 0x4a, 0x37, 0x61, 0x78, 0x31, 0x77, 0x46, 0x6e, 0x42, 0x4e, 0x63, \n\t0x49, 0x37, 0x53, 0x73, 0x49, 0x68, 0x56, 0x4c, 0x7a, 0x73, 0x43, 0x58, 0x77, 0x4a, 0x4f, 0x49, 0x56, 0x5c, 0x0a,\n\t0x09, 0x31, 0x61, 0x55, 0x77, 0x59, 0x76, 0x41, 0x74, 0x38, 0x6e, 0x4c, 0x55, 0x48, 0x4d, 0x49, 0x68, 0x31, \n\t0x6f, 0x69, 0x44, 0x36, 0x47, 0x58, 0x47, 0x62, 0x58, 0x41, 0x61, 0x63, 0x42, 0x36, 0x36, 0x4f, 0x44, 0x46, \n\t0x4a, 0x31, 0x46, 0x72, 0x46, 0x6f, 0x62, 0x42, 0x33, 0x79, 0x4e, 0x39, 0x4e, 0x76, 0x54, 0x67, 0x63, 0x46, \n\t0x5a, 0x4b, 0x76, 0x56, 0x66, 0x69, 0x6a, 0x64, 0x7a, 0x4c, 0x36, 0x76, 0x48, 0x67, 0x55, 0x38, 0x44, 0x5c, 0x0a,\n\t0x09, 0x54, 0x30, 0x63, 0x48, 0x4b, 0x54, 0x4b, 0x4c, 0x57, 0x4c, 0x55, 0x79, 0x6d, 0x72, 0x53, 0x6c, 0x36, \n\t0x2f, 0x4d, 0x30, 0x39, 0x35, 0x59, 0x75, 0x76, 0x64, 0x66, 0x72, 0x70, 0x43, 0x50, 0x66, 0x39, 0x30, 0x51, \n\t0x48, 0x4b, 0x53, 0x71, 0x4c, 0x57, 0x4e, 0x58, 0x61, 0x6d, 0x76, 0x51, 0x78, 0x36, 0x79, 0x75, 0x6b, 0x66, \n\t0x62, 0x35, 0x53, 0x52, 0x7a, 0x59, 0x43, 0x70, 0x77, 0x4d, 0x2f, 0x6a, 0x51, 0x35, 0x53, 0x52, 0x42, 0x5c, 0x0a,\n\t0x09, 0x61, 0x78, 0x71, 0x6a, 0x45, 0x48, 0x2b, 0x41, 0x46, 0x70, 0x2f, 0x36, 0x2f, 0x55, 0x45, 0x78, 0x65, \n\t0x53, 0x54, 0x69, 0x4e, 0x71, 0x4d, 0x78, 0x61, 0x78, 0x4b, 0x6a, 0x45, 0x4d, 0x2b, 0x42, 0x34, 0x77, 0x4c, \n\t0x7a, 0x71, 0x49, 0x53, 0x75, 0x6c, 0x79, 0x30, 0x75, 0x2b, 0x69, 0x4c, 0x4a, 0x38, 0x32, 0x46, 0x6e, 0x48, \n\t0x6a, 0x36, 0x55, 0x2f, 0x36, 0x30, 0x6a, 0x2b, 0x49, 0x74, 0x46, 0x62, 0x62, 0x6e, 0x2f, 0x54, 0x56, 0x5c, 0x0a,\n\t0x09, 0x65, 0x68, 0x33, 0x77, 0x48, 0x36, 0x72, 0x2f, 0x67, 0x6e, 0x30, 0x49, 0x63, 0x43, 0x31, 0x70, 0x54, \n\t0x56, 0x69, 0x71, 0x31, 0x49, 0x39, 0x49, 0x4e, 0x39, 0x56, 0x5a, 0x51, 0x50, 0x68, 0x6d, 0x58, 0x56, 0x6b, \n\t0x4e, 0x42, 0x66, 0x59, 0x47, 0x39, 0x67, 0x52, 0x32, 0x4a, 0x78, 0x30, 0x48, 0x48, 0x6b, 0x75, 0x36, 0x68, \n\t0x4c, 0x79, 0x37, 0x64, 0x64, 0x70, 0x57, 0x34, 0x4a, 0x2f, 0x38, 0x2f, 0x7a, 0x32, 0x7a, 0x35, 0x30, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x76, 0x6d, 0x54, 0x31, 0x4d, 0x31, 0x31, 0x2b, 0x32, 0x2b, 0x77, 0x44, 0x6e, 0x74, 0x2f, 0x33, \n\t0x77, 0x30, 0x56, 0x6c, 0x56, 0x36, 0x34, 0x75, 0x6b, 0x69, 0x63, 0x47, 0x43, 0x36, 0x43, 0x42, 0x46, 0x34, \n\t0x49, 0x79, 0x34, 0x48, 0x4c, 0x59, 0x48, 0x50, 0x67, 0x70, 0x38, 0x42, 0x44, 0x69, 0x49, 0x56, 0x4c, 0x37, \n\t0x31, 0x38, 0x43, 0x71, 0x70, 0x6b, 0x4f, 0x38, 0x48, 0x62, 0x67, 0x57, 0x57, 0x6b, 0x59, 0x70, 0x37, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x2b, 0x43, 0x58, 0x70, 0x4e, 0x4e, 0x77, 0x55, 0x69, 0x31, 0x64, 0x41, 0x6e, 0x77, 0x39, 0x4f, \n\t0x6b, 0x51, 0x30, 0x69, 0x37, 0x69, 0x34, 0x52, 0x70, 0x47, 0x65, 0x31, 0x7a, 0x6d, 0x47, 0x64, 0x4c, 0x67, \n\t0x67, 0x59, 0x68, 0x61, 0x36, 0x69, 0x6e, 0x51, 0x45, 0x2b, 0x45, 0x44, 0x53, 0x72, 0x46, 0x75, 0x71, 0x68, \n\t0x39, 0x4e, 0x4a, 0x53, 0x78, 0x56, 0x4e, 0x79, 0x79, 0x49, 0x75, 0x6c, 0x76, 0x62, 0x6a, 0x77, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x65, 0x53, 0x5a, 0x70, 0x38, 0x75, 0x41, 0x61, 0x67, 0x5a, 0x76, 0x45, 0x32, 0x36, 0x66, 0x2b, 0x53, \n\t0x32, 0x36, 0x43, 0x42, 0x52, 0x4c, 0x4f, 0x4a, 0x69, 0x47, 0x45, 0x6f, 0x36, 0x43, 0x6e, 0x77, 0x57, 0x61, \n\t0x61, 0x31, 0x58, 0x61, 0x6a, 0x62, 0x72, 0x53, 0x54, 0x66, 0x77, 0x2f, 0x53, 0x55, 0x36, 0x53, 0x41, 0x53, \n\t0x4c, 0x4f, 0x4e, 0x5a, 0x51, 0x30, 0x73, 0x65, 0x4b, 0x63, 0x39, 0x70, 0x2b, 0x4c, 0x6a, 0x57, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x70, 0x30, 0x6c, 0x6c, 0x2f, 0x46, 0x70, 0x30, 0x6b, 0x4e, 0x77, 0x73, 0x34, 0x68, 0x68, 0x39, 0x53, \n\t0x56, 0x2b, 0x4e, 0x4c, 0x38, 0x41, 0x4c, 0x78, 0x71, 0x58, 0x4e, 0x33, 0x55, 0x4b, 0x36, 0x4b, 0x72, 0x57, \n\t0x70, 0x69, 0x73, 0x6b, 0x31, 0x79, 0x50, 0x78, 0x6d, 0x6b, 0x56, 0x36, 0x4e, 0x57, 0x49, 0x51, 0x6c, 0x4c, \n\t0x47, 0x33, 0x70, 0x53, 0x4e, 0x4b, 0x74, 0x66, 0x55, 0x33, 0x46, 0x47, 0x58, 0x45, 0x2b, 0x51, 0x34, 0x5c, 0x0a,\n\t0x09, 0x44, 0x4c, 0x53, 0x46, 0x2b, 0x49, 0x4a, 0x58, 0x56, 0x75, 0x41, 0x37, 0x41, 0x76, 0x61, 0x58, 0x39, \n\t0x37, 0x55, 0x37, 0x43, 0x49, 0x38, 0x39, 0x69, 0x50, 0x64, 0x4d, 0x48, 0x34, 0x68, 0x4f, 0x41, 0x63, 0x55, \n\t0x6c, 0x6b, 0x73, 0x49, 0x35, 0x58, 0x78, 0x78, 0x75, 0x67, 0x67, 0x4f, 0x62, 0x67, 0x30, 0x55, 0x56, 0x38, \n\t0x74, 0x77, 0x48, 0x6e, 0x41, 0x48, 0x37, 0x43, 0x45, 0x70, 0x64, 0x36, 0x59, 0x54, 0x72, 0x72, 0x52, 0x5c, 0x0a,\n\t0x09, 0x72, 0x79, 0x6b, 0x34, 0x49, 0x36, 0x36, 0x66, 0x49, 0x61, 0x51, 0x37, 0x47, 0x54, 0x34, 0x56, 0x48, \n\t0x55, 0x51, 0x71, 0x71, 0x51, 0x33, 0x41, 0x44, 0x4f, 0x44, 0x4a, 0x36, 0x43, 0x44, 0x31, 0x35, 0x6f, 0x79, \n\t0x34, 0x50, 0x73, 0x59, 0x41, 0x66, 0x38, 0x51, 0x53, 0x6c, 0x71, 0x6f, 0x78, 0x41, 0x4c, 0x67, 0x69, 0x4f, \n\t0x6b, 0x51, 0x4f, 0x46, 0x6e, 0x48, 0x74, 0x37, 0x51, 0x6b, 0x38, 0x42, 0x45, 0x79, 0x4c, 0x44, 0x69, 0x5c, 0x0a,\n\t0x09, 0x49, 0x31, 0x67, 0x49, 0x2b, 0x52, 0x74, 0x72, 0x4d, 0x31, 0x4e, 0x4a, 0x63, 0x6d, 0x61, 0x6d, 0x73, \n\t0x76, 0x34, 0x43, 0x37, 0x63, 0x6c, 0x69, 0x62, 0x56, 0x30, 0x67, 0x70, 0x67, 0x43, 0x75, 0x6b, 0x74, 0x77, \n\t0x59, 0x62, 0x6b, 0x6a, 0x4c, 0x68, 0x32, 0x5a, 0x67, 0x44, 0x33, 0x59, 0x67, 0x6c, 0x4c, 0x74, 0x54, 0x61, \n\t0x52, 0x39, 0x42, 0x5a, 0x69, 0x77, 0x33, 0x4a, 0x47, 0x58, 0x42, 0x74, 0x37, 0x41, 0x50, 0x64, 0x68, 0x5c, 0x0a,\n\t0x09, 0x43, 0x55, 0x76, 0x31, 0x38, 0x69, 0x4c, 0x70, 0x42, 0x73, 0x42, 0x2f, 0x52, 0x77, 0x65, 0x70, 0x42, \n\t0x32, 0x66, 0x45, 0x31, 0x52, 0x73, 0x4e, 0x33, 0x49, 0x45, 0x6c, 0x4c, 0x4e, 0x58, 0x54, 0x7a, 0x71, 0x53, \n\t0x4c, 0x73, 0x52, 0x71, 0x53, 0x4d, 0x2b, 0x4c, 0x71, 0x44, 0x43, 0x62, 0x74, 0x6a, 0x70, 0x67, 0x65, 0x48, \n\t0x55, 0x52, 0x71, 0x41, 0x73, 0x38, 0x42, 0x6b, 0x34, 0x42, 0x4e, 0x30, 0x55, 0x46, 0x71, 0x7a, 0x52, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x78, 0x35, 0x56, 0x71, 0x41, 0x71, 0x37, 0x47, 0x45, 0x70, 0x56, 0x7a, 0x47, 0x41, 0x38, 0x64, \n\t0x46, 0x68, 0x36, 0x67, 0x48, 0x69, 0x37, 0x68, 0x79, 0x43, 0x32, 0x6a, 0x51, 0x2f, 0x79, 0x6d, 0x6b, 0x41, \n\t0x6a, 0x73, 0x37, 0x4f, 0x6b, 0x41, 0x39, 0x75, 0x44, 0x52, 0x52, 0x6d, 0x58, 0x31, 0x4a, 0x53, 0x78, 0x4c, \n\t0x39, 0x6f, 0x6f, 0x4e, 0x49, 0x54, 0x57, 0x67, 0x6d, 0x36, 0x51, 0x62, 0x44, 0x68, 0x75, 0x47, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x75, 0x50, 0x65, 0x32, 0x42, 0x71, 0x37, 0x44, 0x45, 0x70, 0x61, 0x69, 0x6e, 0x42, 0x6f, 0x64, 0x6f, \n\t0x4e, 0x59, 0x73, 0x34, 0x74, 0x36, 0x37, 0x46, 0x42, 0x2f, 0x53, 0x6c, 0x43, 0x4c, 0x4e, 0x41, 0x77, 0x5a, \n\t0x47, 0x68, 0x36, 0x67, 0x6c, 0x69, 0x37, 0x68, 0x33, 0x39, 0x67, 0x48, 0x4f, 0x6a, 0x41, 0x34, 0x68, 0x4e, \n\t0x62, 0x6c, 0x74, 0x67, 0x63, 0x4f, 0x6a, 0x51, 0x39, 0x53, 0x53, 0x52, 0x64, 0x78, 0x7a, 0x57, 0x77, 0x5c, 0x0a,\n\t0x09, 0x45, 0x2f, 0x78, 0x50, 0x39, 0x6d, 0x55, 0x68, 0x45, 0x63, 0x47, 0x78, 0x32, 0x67, 0x6c, 0x69, 0x79, \n\t0x56, 0x6e, 0x70, 0x74, 0x50, 0x6d, 0x68, 0x46, 0x4c, 0x69, 0x6e, 0x63, 0x45, 0x4d, 0x43, 0x67, 0x36, 0x52, \n\t0x4b, 0x31, 0x59, 0x78, 0x44, 0x30, 0x7a, 0x43, 0x4c, 0x67, 0x6b, 0x4f, 0x6f, 0x53, 0x6b, 0x64, 0x77, 0x77, \n\t0x47, 0x5a, 0x6b, 0x65, 0x48, 0x71, 0x42, 0x57, 0x4c, 0x75, 0x47, 0x64, 0x4f, 0x49, 0x39, 0x30, 0x78, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x4b, 0x6b, 0x34, 0x35, 0x6b, 0x59, 0x48, 0x71, 0x42, 0x58, 0x33, 0x45, 0x58, 0x64, 0x76, 0x41, \n\t0x50, 0x41, 0x73, 0x4d, 0x43, 0x6f, 0x34, 0x68, 0x36, 0x52, 0x33, 0x65, 0x78, 0x71, 0x59, 0x48, 0x42, 0x32, \n\t0x69, 0x46, 0x70, 0x77, 0x52, 0x64, 0x32, 0x38, 0x65, 0x6c, 0x72, 0x42, 0x55, 0x52, 0x4c, 0x73, 0x42, 0x49, \n\t0x36, 0x4e, 0x44, 0x31, 0x49, 0x4a, 0x46, 0x33, 0x4c, 0x30, 0x46, 0x30, 0x51, 0x45, 0x6b, 0x64, 0x57, 0x5c, 0x0a,\n\t0x09, 0x70, 0x57, 0x64, 0x49, 0x42, 0x61, 0x73, 0x49, 0x69, 0x37, 0x74, 0x6a, 0x2f, 0x70, 0x36, 0x53, 0x4e, \n\t0x4a, 0x78, 0x66, 0x54, 0x68, 0x36, 0x41, 0x43, 0x31, 0x59, 0x42, 0x46, 0x33, 0x37, 0x65, 0x54, 0x6f, 0x41, \n\t0x4a, 0x4b, 0x36, 0x74, 0x46, 0x64, 0x30, 0x67, 0x46, 0x72, 0x77, 0x59, 0x31, 0x33, 0x6e, 0x42, 0x67, 0x46, \n\t0x72, 0x67, 0x47, 0x32, 0x69, 0x67, 0x30, 0x6a, 0x71, 0x31, 0x4c, 0x2b, 0x41, 0x48, 0x61, 0x4a, 0x44, 0x5c, 0x0a,\n\t0x09, 0x56, 0x4d, 0x73, 0x5a, 0x63, 0x65, 0x63, 0x4f, 0x77, 0x78, 0x4b, 0x57, 0x69, 0x6d, 0x35, 0x37, 0x47, \n\t0x6d, 0x42, 0x72, 0x71, 0x55, 0x58, 0x63, 0x75, 0x55, 0x39, 0x47, 0x42, 0x35, 0x44, 0x55, 0x49, 0x36, 0x58, \n\t0x66, 0x77, 0x6d, 0x59, 0x52, 0x64, 0x36, 0x77, 0x50, 0x44, 0x62, 0x52, 0x5a, 0x58, 0x47, 0x70, 0x77, 0x75, \n\t0x30, 0x51, 0x48, 0x71, 0x4a, 0x5a, 0x46, 0x33, 0x4c, 0x47, 0x5a, 0x4e, 0x4d, 0x43, 0x36, 0x6b, 0x39, 0x5c, 0x0a,\n\t0x09, 0x51, 0x6b, 0x4c, 0x4f, 0x49, 0x47, 0x4e, 0x54, 0x73, 0x36, 0x67, 0x4b, 0x51, 0x65, 0x47, 0x78, 0x73, \n\t0x64, 0x6f, 0x46, 0x6f, 0x57, 0x63, 0x63, 0x63, 0x4f, 0x69, 0x41, 0x34, 0x67, 0x71, 0x63, 0x64, 0x47, 0x52, \n\t0x41, 0x65, 0x6f, 0x6c, 0x6b, 0x58, 0x63, 0x4d, 0x61, 0x2b, 0x37, 0x6c, 0x4d, 0x71, 0x6a, 0x39, 0x4d, 0x75, \n\t0x49, 0x66, 0x61, 0x4d, 0x44, 0x42, 0x42, 0x6b, 0x4f, 0x54, 0x43, 0x44, 0x64, 0x49, 0x54, 0x45, 0x43, 0x5c, 0x0a,\n\t0x09, 0x47, 0x4c, 0x72, 0x5a, 0x58, 0x32, 0x73, 0x46, 0x52, 0x67, 0x64, 0x6b, 0x6b, 0x6c, 0x51, 0x5a, 0x69, \n\t0x37, 0x67, 0x45, 0x52, 0x67, 0x45, 0x48, 0x41, 0x66, 0x75, 0x52, 0x54, 0x75, 0x46, 0x4d, 0x34, 0x39, 0x33, \n\t0x46, 0x4b, 0x36, 0x6e, 0x63, 0x53, 0x74, 0x39, 0x6a, 0x70, 0x66, 0x38, 0x58, 0x36, 0x4d, 0x52, 0x55, 0x34, \n\t0x44, 0x6a, 0x67, 0x53, 0x47, 0x42, 0x36, 0x63, 0x42, 0x5a, 0x4a, 0x39, 0x54, 0x55, 0x73, 0x4f, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x43, 0x31, 0x47, 0x71, 0x6d, 0x49, 0x74, 0x77, 0x56, 0x4f, 0x4a, 0x4e, 0x30, 0x50, 0x4d, 0x53, 0x30, \n\t0x34, 0x69, 0x79, 0x54, 0x31, 0x57, 0x43, 0x4d, 0x55, 0x38, 0x55, 0x37, 0x41, 0x75, 0x63, 0x41, 0x70, 0x65, \n\t0x43, 0x52, 0x5a, 0x55, 0x67, 0x6d, 0x56, 0x65, 0x64, 0x66, 0x45, 0x4d, 0x4f, 0x44, 0x62, 0x77, 0x45, 0x70, \n\t0x67, 0x49, 0x5a, 0x61, 0x77, 0x31, 0x4b, 0x79, 0x32, 0x41, 0x53, 0x34, 0x43, 0x68, 0x6b, 0x51, 0x48, 0x5c, 0x0a,\n\t0x09, 0x71, 0x56, 0x51, 0x5a, 0x62, 0x31, 0x39, 0x72, 0x49, 0x53, 0x30, 0x2f, 0x58, 0x45, 0x72, 0x61, 0x2f, \n\t0x53, 0x42, 0x4a, 0x41, 0x4b, 0x75, 0x41, 0x38, 0x34, 0x42, 0x72, 0x6f, 0x34, 0x50, 0x30, 0x56, 0x74, 0x6d, \n\t0x4b, 0x65, 0x43, 0x4b, 0x77, 0x47, 0x41, 0x39, 0x63, 0x53, 0x4f, 0x72, 0x63, 0x6e, 0x61, 0x51, 0x48, 0x66, \n\t0x35, 0x2b, 0x50, 0x44, 0x74, 0x4a, 0x54, 0x5a, 0x56, 0x71, 0x61, 0x4f, 0x42, 0x46, 0x59, 0x68, 0x69, 0x5c, 0x0a,\n\t0x09, 0x55, 0x73, 0x71, 0x57, 0x74, 0x7a, 0x67, 0x4d, 0x65, 0x41, 0x59, 0x36, 0x4b, 0x44, 0x39, 0x46, 0x51, \n\t0x5a, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x42, 0x56, 0x77, 0x44, 0x54, 0x41, 0x34, 0x4e, 0x6f, 0x71, 0x6b, 0x6b, \n\t0x74, 0x67, 0x57, 0x57, 0x41, 0x49, 0x73, 0x41, 0x76, 0x6f, 0x46, 0x5a, 0x2b, 0x6c, 0x57, 0x30, 0x5a, 0x63, \n\t0x6d, 0x68, 0x67, 0x4f, 0x2f, 0x49, 0x62, 0x30, 0x64, 0x4a, 0x30, 0x6d, 0x56, 0x75, 0x4a, 0x73, 0x30, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x33, 0x34, 0x39, 0x4f, 0x6b, 0x68, 0x6e, 0x69, 0x6c, 0x7a, 0x45, 0x59, 0x34, 0x42, 0x37, 0x67, \n\t0x55, 0x6e, 0x52, 0x51, 0x53, 0x53, 0x56, 0x33, 0x68, 0x4f, 0x6b, 0x4a, 0x59, 0x73, 0x58, 0x6f, 0x6f, 0x4e, \n\t0x30, 0x70, 0x4b, 0x68, 0x46, 0x50, 0x49, 0x6c, 0x55, 0x77, 0x71, 0x56, 0x2f, 0x41, 0x6b, 0x56, 0x53, 0x59, \n\t0x61, 0x77, 0x67, 0x58, 0x58, 0x46, 0x62, 0x75, 0x44, 0x49, 0x75, 0x59, 0x68, 0x47, 0x50, 0x41, 0x65, 0x5c, 0x0a,\n\t0x09, 0x34, 0x48, 0x64, 0x6f, 0x30, 0x4f, 0x49, 0x71, 0x6e, 0x68, 0x72, 0x41, 0x42, 0x6d, 0x41, 0x61, 0x75, \n\t0x6a, 0x67, 0x32, 0x79, 0x75, 0x61, 0x42, 0x2f, 0x72, 0x68, 0x67, 0x4a, 0x33, 0x59, 0x51, 0x6c, 0x4c, 0x71, \n\t0x6f, 0x2b, 0x4a, 0x77, 0x4f, 0x30, 0x55, 0x37, 0x41, 0x42, 0x59, 0x6b, 0x59, 0x71, 0x34, 0x44, 0x33, 0x41, \n\t0x54, 0x4d, 0x43, 0x55, 0x36, 0x69, 0x4b, 0x53, 0x47, 0x4e, 0x68, 0x4f, 0x34, 0x6b, 0x64, 0x51, 0x35, 0x5c, 0x0a,\n\t0x09, 0x68, 0x56, 0x43, 0x6b, 0x49, 0x72, 0x34, 0x4d, 0x4f, 0x43, 0x51, 0x36, 0x68, 0x4b, 0x53, 0x6d, 0x4d, \n\t0x41, 0x65, 0x34, 0x49, 0x44, 0x70, 0x45, 0x75, 0x36, 0x4b, 0x73, 0x45, 0x52, 0x38, 0x4a, 0x33, 0x42, 0x77, \n\t0x64, 0x51, 0x6c, 0x4c, 0x54, 0x6d, 0x55, 0x73, 0x36, 0x69, 0x52, 0x65, 0x71, 0x43, 0x45, 0x55, 0x38, 0x45, \n\t0x6e, 0x67, 0x63, 0x37, 0x34, 0x32, 0x51, 0x6c, 0x4e, 0x38, 0x61, 0x59, 0x41, 0x2f, 0x67, 0x6c, 0x63, 0x5c, 0x0a,\n\t0x09, 0x67, 0x51, 0x52, 0x56, 0x69, 0x61, 0x57, 0x49, 0x51, 0x6c, 0x4c, 0x43, 0x6e, 0x47, 0x53, 0x4f, 0x44, \n\t0x4b, 0x36, 0x42, 0x44, 0x52, 0x4d, 0x2b, 0x4b, 0x35, 0x70, 0x43, 0x2b, 0x59, 0x6b, 0x68, 0x54, 0x70, 0x55, \n\t0x4f, 0x43, 0x65, 0x71, 0x4d, 0x45, 0x6a, 0x69, 0x37, 0x67, 0x66, 0x61, 0x55, 0x6c, 0x69, 0x63, 0x6c, 0x51, \n\t0x41, 0x53, 0x57, 0x72, 0x7a, 0x4f, 0x47, 0x6b, 0x33, 0x78, 0x61, 0x61, 0x49, 0x77, 0x53, 0x4f, 0x58, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x72, 0x36, 0x41, 0x4a, 0x53, 0x79, 0x70, 0x47, 0x50, 0x59, 0x6b, 0x64, 0x56, 0x4b, 0x49, 0x71, \n\t0x42, 0x6c, 0x78, 0x66, 0x39, 0x4c, 0x4c, 0x47, 0x6a, 0x74, 0x48, 0x44, 0x43, 0x35, 0x4a, 0x48, 0x58, 0x69, \n\t0x65, 0x64, 0x4f, 0x41, 0x6a, 0x2b, 0x36, 0x77, 0x34, 0x61, 0x6b, 0x62, 0x38, 0x47, 0x53, 0x78, 0x68, 0x53, \n\t0x63, 0x55, 0x79, 0x44, 0x70, 0x67, 0x66, 0x4d, 0x58, 0x44, 0x55, 0x6a, 0x50, 0x67, 0x4a, 0x50, 0x45, 0x5c, 0x0a,\n\t0x09, 0x45, 0x6e, 0x71, 0x58, 0x69, 0x57, 0x41, 0x54, 0x4e, 0x79, 0x44, 0x78, 0x6f, 0x78, 0x49, 0x7a, 0x34, \n\t0x41, 0x53, 0x31, 0x68, 0x53, 0x4d, 0x55, 0x30, 0x48, 0x39, 0x73, 0x73, 0x39, 0x61, 0x45, 0x51, 0x52, 0x66, \n\t0x79, 0x35, 0x67, 0x54, 0x45, 0x6e, 0x71, 0x71, 0x65, 0x77, 0x66, 0x37, 0x58, 0x49, 0x76, 0x54, 0x51, 0x77, \n\t0x41, 0x58, 0x69, 0x49, 0x39, 0x59, 0x79, 0x4a, 0x4a, 0x52, 0x66, 0x51, 0x71, 0x36, 0x61, 0x44, 0x48, 0x5c, 0x0a,\n\t0x09, 0x78, 0x6c, 0x77, 0x44, 0x35, 0x70, 0x34, 0x52, 0x48, 0x34, 0x77, 0x6c, 0x4c, 0x4b, 0x6e, 0x59, 0x74, \n\t0x69, 0x50, 0x7a, 0x42, 0x57, 0x53, 0x35, 0x69, 0x33, 0x68, 0x75, 0x35, 0x76, 0x45, 0x6b, 0x71, 0x52, 0x4a, \n\t0x7a, 0x63, 0x67, 0x36, 0x57, 0x75, 0x34, 0x67, 0x50, 0x7a, 0x54, 0x79, 0x65, 0x4a, 0x46, 0x56, 0x69, 0x64, \n\t0x73, 0x37, 0x42, 0x63, 0x71, 0x34, 0x52, 0x37, 0x77, 0x43, 0x38, 0x6e, 0x47, 0x73, 0x77, 0x53, 0x61, 0x5c, 0x0a,\n\t0x09, 0x70, 0x43, 0x4b, 0x7a, 0x43, 0x43, 0x54, 0x4c, 0x65, 0x79, 0x35, 0x5a, 0x77, 0x52, 0x37, 0x35, 0x4e, \n\t0x78, 0x4c, 0x45, 0x6d, 0x71, 0x52, 0x67, 0x73, 0x5a, 0x39, 0x78, 0x50, 0x6e, 0x4c, 0x4f, 0x4a, 0x70, 0x47, \n\t0x63, 0x65, 0x53, 0x70, 0x47, 0x70, 0x6c, 0x36, 0x36, 0x79, 0x63, 0x52, 0x66, 0x7a, 0x2b, 0x6a, 0x47, 0x4e, \n\t0x4a, 0x55, 0x72, 0x57, 0x6d, 0x35, 0x68, 0x6f, 0x6f, 0x5a, 0x78, 0x46, 0x50, 0x79, 0x44, 0x69, 0x57, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x46, 0x56, 0x72, 0x54, 0x4b, 0x36, 0x42, 0x63, 0x68, 0x61, 0x78, 0x6c, 0x2f, 0x78, 0x49, 0x4b, \n\t0x70, 0x4f, 0x78, 0x75, 0x51, 0x62, 0x4b, 0x57, 0x63, 0x51, 0x37, 0x5a, 0x42, 0x78, 0x4c, 0x6b, 0x71, 0x6f, \n\t0x31, 0x4d, 0x74, 0x64, 0x41, 0x4f, 0x62, 0x65, 0x76, 0x68, 0x62, 0x39, 0x53, 0x4b, 0x6b, 0x6d, 0x39, 0x73, \n\t0x41, 0x45, 0x59, 0x6d, 0x47, 0x4d, 0x67, 0x69, 0x31, 0x69, 0x53, 0x4f, 0x74, 0x65, 0x53, 0x59, 0x35, 0x5c, 0x0a,\n\t0x09, 0x41, 0x69, 0x76, 0x4f, 0x49, 0x73, 0x53, 0x55, 0x33, 0x4e, 0x49, 0x70, 0x61, 0x6b, 0x59, 0x44, 0x6d, \n\t0x4c, 0x65, 0x45, 0x50, 0x47, 0x73, 0x53, 0x53, 0x70, 0x57, 0x74, 0x6b, 0x36, 0x4b, 0x32, 0x63, 0x52, 0x5a, \n\t0x7a, 0x6d, 0x7a, 0x4c, 0x55, 0x6b, 0x31, 0x6b, 0x71, 0x32, 0x7a, 0x63, 0x68, 0x62, 0x78, 0x6d, 0x6f, 0x78, \n\t0x6a, 0x53, 0x56, 0x4b, 0x31, 0x73, 0x6e, 0x56, 0x57, 0x7a, 0x69, 0x4a, 0x2b, 0x50, 0x75, 0x4e, 0x59, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x6c, 0x53, 0x74, 0x62, 0x4a, 0x32, 0x56, 0x73, 0x34, 0x69, 0x66, 0x79, 0x54, 0x69, 0x57, 0x4a, \n\t0x46, 0x55, 0x72, 0x57, 0x32, 0x66, 0x6c, 0x4c, 0x4f, 0x4c, 0x6c, 0x47, 0x63, 0x65, 0x53, 0x70, 0x47, 0x70, \n\t0x6c, 0x36, 0x36, 0x79, 0x63, 0x52, 0x66, 0x78, 0x6f, 0x78, 0x72, 0x45, 0x6b, 0x71, 0x56, 0x72, 0x5a, 0x4f, \n\t0x69, 0x76, 0x6e, 0x79, 0x62, 0x71, 0x2b, 0x77, 0x47, 0x76, 0x41, 0x34, 0x46, 0x77, 0x44, 0x53, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x46, 0x31, 0x67, 0x50, 0x44, 0x67, 0x45, 0x30, 0x35, 0x42, 0x73, 0x73, 0x35, 0x49, 0x39, 0x34, \n\t0x45, 0x50, 0x4a, 0x68, 0x78, 0x50, 0x45, 0x6d, 0x71, 0x31, 0x49, 0x4e, 0x6b, 0x4b, 0x6d, 0x48, 0x49, 0x66, \n\t0x37, 0x4c, 0x75, 0x7a, 0x73, 0x7a, 0x6a, 0x53, 0x56, 0x49, 0x6c, 0x73, 0x6e, 0x5a, 0x56, 0x37, 0x69, 0x4b, \n\t0x2b, 0x4c, 0x66, 0x4e, 0x34, 0x6b, 0x6c, 0x53, 0x4a, 0x72, 0x46, 0x32, 0x56, 0x75, 0x34, 0x6a, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x68, 0x72, 0x73, 0x6e, 0x4a, 0x42, 0x58, 0x62, 0x63, 0x6c, 0x4a, 0x58, 0x5a, 0x52, 0x4e, 0x78, 0x36, \n\t0x63, 0x2f, 0x50, 0x41, 0x38, 0x61, 0x55, 0x70, 0x4a, 0x37, 0x4b, 0x33, 0x6c, 0x45, 0x35, 0x64, 0x30, 0x32, \n\t0x30, 0x32, 0x78, 0x46, 0x34, 0x41, 0x65, 0x69, 0x58, 0x65, 0x32, 0x42, 0x4a, 0x36, 0x73, 0x5a, 0x47, 0x30, \n\t0x6c, 0x74, 0x31, 0x4c, 0x2b, 0x55, 0x63, 0x4e, 0x47, 0x4a, 0x47, 0x2f, 0x42, 0x4b, 0x77, 0x4a, 0x47, 0x5c, 0x0a,\n\t0x09, 0x42, 0x63, 0x53, 0x65, 0x72, 0x4f, 0x45, 0x6a, 0x4b, 0x58, 0x4d, 0x4d, 0x54, 0x4d, 0x69, 0x41, 0x46, \n\t0x6d, 0x41, 0x49, 0x39, 0x45, 0x44, 0x43, 0x78, 0x4a, 0x58, 0x5a, 0x68, 0x4a, 0x77, 0x4f, 0x47, 0x7a, 0x71, \n\t0x49, 0x76, 0x68, 0x48, 0x77, 0x56, 0x75, 0x43, 0x52, 0x70, 0x62, 0x6b, 0x6a, 0x70, 0x79, 0x43, 0x30, 0x45, \n\t0x6e, 0x67, 0x4b, 0x4e, 0x6d, 0x78, 0x4a, 0x42, 0x2b, 0x35, 0x58, 0x6d, 0x59, 0x54, 0x47, 0x39, 0x43, 0x5c, 0x0a,\n\t0x09, 0x53, 0x56, 0x49, 0x58, 0x57, 0x6f, 0x47, 0x39, 0x43, 0x66, 0x71, 0x64, 0x65, 0x75, 0x52, 0x54, 0x53, \n\t0x59, 0x38, 0x41, 0x69, 0x77, 0x50, 0x48, 0x6c, 0x36, 0x52, 0x32, 0x69, 0x77, 0x6c, 0x63, 0x4c, 0x6f, 0x32, \n\t0x63, 0x45, 0x51, 0x4f, 0x4d, 0x42, 0x4a, 0x34, 0x6b, 0x6e, 0x65, 0x6d, 0x57, 0x70, 0x41, 0x69, 0x76, 0x41, \n\t0x62, 0x73, 0x54, 0x2b, 0x48, 0x68, 0x46, 0x39, 0x4f, 0x4f, 0x68, 0x61, 0x34, 0x43, 0x46, 0x77, 0x52, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x6b, 0x4e, 0x62, 0x65, 0x46, 0x42, 0x4c, 0x38, 0x67, 0x46, 0x44, 0x30, 0x6a, 0x68, 0x72, 0x52, \n\t0x47, 0x66, 0x44, 0x4e, 0x77, 0x52, 0x48, 0x51, 0x51, 0x53, 0x55, 0x33, 0x6e, 0x56, 0x75, 0x41, 0x6f, 0x30, \n\t0x68, 0x70, 0x78, 0x6d, 0x43, 0x49, 0x55, 0x4d, 0x63, 0x41, 0x49, 0x59, 0x42, 0x6d, 0x77, 0x55, 0x33, 0x51, \n\t0x51, 0x53, 0x55, 0x31, 0x6a, 0x46, 0x54, 0x41, 0x64, 0x57, 0x42, 0x73, 0x64, 0x4a, 0x48, 0x70, 0x70, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x74, 0x31, 0x61, 0x34, 0x47, 0x6a, 0x53, 0x71, 0x52, 0x5a, 0x4a, 0x71, 0x72, 0x65, 0x4e, 0x70, \n\t0x4d, 0x34, 0x4a, 0x4c, 0x32, 0x45, 0x6f, 0x54, 0x68, 0x45, 0x44, 0x50, 0x41, 0x53, 0x63, 0x45, 0x52, 0x31, \n\t0x43, 0x55, 0x6c, 0x4d, 0x34, 0x67, 0x39, 0x51, 0x35, 0x68, 0x56, 0x43, 0x6b, 0x49, 0x67, 0x61, 0x34, 0x43, \n\t0x72, 0x67, 0x34, 0x4f, 0x6f, 0x53, 0x6b, 0x68, 0x6e, 0x59, 0x78, 0x71, 0x57, 0x73, 0x4b, 0x6f, 0x79, 0x5c, 0x0a,\n\t0x09, 0x68, 0x72, 0x78, 0x46, 0x75, 0x36, 0x45, 0x6a, 0x67, 0x7a, 0x4f, 0x6f, 0x53, 0x6b, 0x68, 0x72, 0x4d, \n\t0x49, 0x4f, 0x43, 0x73, 0x36, 0x78, 0x4a, 0x61, 0x4b, 0x4e, 0x69, 0x4e, 0x75, 0x64, 0x7a, 0x5a, 0x77, 0x52, \n\t0x58, 0x51, 0x49, 0x53, 0x51, 0x33, 0x6c, 0x43, 0x6c, 0x4b, 0x33, 0x46, 0x45, 0x35, 0x52, 0x69, 0x37, 0x67, \n\t0x56, 0x4f, 0x41, 0x65, 0x34, 0x4d, 0x44, 0x69, 0x48, 0x70, 0x4d, 0x5a, 0x77, 0x49, 0x61, 0x6c, 0x54, 0x5c, 0x0a,\n\t0x09, 0x43, 0x72, 0x6b, 0x45, 0x55, 0x4e, 0x53, 0x6c, 0x69, 0x63, 0x33, 0x4e, 0x4a, 0x36, 0x33, 0x6e, 0x44, \n\t0x49, 0x67, 0x4f, 0x49, 0x71, 0x6c, 0x30, 0x4e, 0x67, 0x41, 0x6e, 0x55, 0x2f, 0x41, 0x48, 0x4b, 0x63, 0x70, \n\t0x51, 0x78, 0x41, 0x44, 0x37, 0x41, 0x4c, 0x38, 0x43, 0x78, 0x6b, 0x63, 0x48, 0x6b, 0x56, 0x51, 0x61, 0x7a, \n\t0x77, 0x48, 0x48, 0x41, 0x45, 0x75, 0x6a, 0x67, 0x33, 0x53, 0x6e, 0x71, 0x45, 0x73, 0x54, 0x57, 0x31, 0x5c, 0x0a,\n\t0x09, 0x70, 0x4b, 0x75, 0x73, 0x50, 0x34, 0x2b, 0x75, 0x67, 0x67, 0x6b, 0x6b, 0x72, 0x68, 0x65, 0x6c, 0x4a, \n\t0x6e, 0x46, 0x4c, 0x36, 0x45, 0x6f, 0x54, 0x78, 0x46, 0x44, 0x4f, 0x6c, 0x69, 0x6a, 0x68, 0x4e, 0x49, 0x76, \n\t0x38, 0x4b, 0x74, 0x44, 0x73, 0x34, 0x69, 0x71, 0x5a, 0x68, 0x57, 0x6b, 0x7a, 0x72, 0x69, 0x42, 0x46, 0x4a, \n\t0x6e, 0x6c, 0x45, 0x4b, 0x5a, 0x69, 0x72, 0x6a, 0x64, 0x54, 0x61, 0x53, 0x62, 0x6b, 0x69, 0x37, 0x48, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x33, 0x69, 0x53, 0x6b, 0x6f, 0x32, 0x6b, 0x54, 0x74, 0x69, 0x64, 0x31, 0x42, 0x47, 0x6c, 0x55, \n\t0x70, 0x59, 0x31, 0x34, 0x73, 0x35, 0x4d, 0x42, 0x4d, 0x34, 0x6e, 0x66, 0x64, 0x44, 0x72, 0x45, 0x35, 0x78, \n\t0x46, 0x55, 0x6e, 0x35, 0x76, 0x6b, 0x54, 0x37, 0x45, 0x58, 0x51, 0x79, 0x73, 0x43, 0x4d, 0x35, 0x53, 0x73, \n\t0x62, 0x49, 0x58, 0x63, 0x62, 0x74, 0x64, 0x53, 0x46, 0x74, 0x54, 0x54, 0x67, 0x4b, 0x32, 0x43, 0x63, 0x5c, 0x0a,\n\t0x09, 0x34, 0x69, 0x71, 0x66, 0x37, 0x57, 0x6b, 0x53, 0x35, 0x7a, 0x2f, 0x79, 0x37, 0x77, 0x54, 0x48, 0x43, \n\t0x57, 0x71, 0x6a, 0x56, 0x4b, 0x45, 0x62, 0x63, 0x62, 0x44, 0x42, 0x77, 0x50, 0x7a, 0x41, 0x4e, 0x6d, 0x55, \n\t0x38, 0x36, 0x6c, 0x46, 0x30, 0x6b, 0x64, 0x65, 0x78, 0x75, 0x34, 0x44, 0x37, 0x67, 0x4f, 0x75, 0x41, 0x46, \n\t0x59, 0x48, 0x35, 0x71, 0x6d, 0x68, 0x68, 0x71, 0x74, 0x69, 0x44, 0x65, 0x33, 0x49, 0x33, 0x41, 0x59, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x42, 0x63, 0x34, 0x45, 0x42, 0x67, 0x56, 0x47, 0x30, 0x64, 0x53, 0x42, 0x56, 0x59, 0x44, 0x76, \n\t0x77, 0x66, 0x75, 0x41, 0x47, 0x34, 0x6e, 0x34, 0x4b, 0x6e, 0x37, 0x48, 0x42, 0x71, 0x35, 0x69, 0x4c, 0x65, \n\t0x30, 0x4b, 0x2b, 0x6e, 0x42, 0x30, 0x71, 0x6e, 0x41, 0x5a, 0x47, 0x41, 0x43, 0x36, 0x61, 0x6d, 0x6d, 0x34, \n\t0x63, 0x43, 0x32, 0x63, 0x62, 0x47, 0x6b, 0x70, 0x76, 0x63, 0x47, 0x38, 0x44, 0x4c, 0x70, 0x6c, 0x59, 0x5c, 0x0a,\n\t0x09, 0x78, 0x6e, 0x67, 0x61, 0x65, 0x41, 0x78, 0x30, 0x68, 0x76, 0x79, 0x4b, 0x32, 0x4d, 0x69, 0x35, 0x56, \n\t0x50, 0x4d, 0x78, 0x57, 0x78, 0x4a, 0x42, 0x57, 0x53, 0x61, 0x36, 0x69, 0x53, 0x46, 0x4d, 0x77, 0x69, 0x6c, \n\t0x71, 0x52, 0x67, 0x46, 0x72, 0x45, 0x6b, 0x42, 0x62, 0x4f, 0x49, 0x4a, 0x53, 0x6d, 0x59, 0x52, 0x53, 0x78, \n\t0x4a, 0x77, 0x53, 0x78, 0x69, 0x53, 0x51, 0x70, 0x6d, 0x45, 0x55, 0x74, 0x53, 0x4d, 0x49, 0x74, 0x59, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x6f, 0x4a, 0x5a, 0x78, 0x4a, 0x49, 0x55, 0x7a, 0x43, 0x4b, 0x57, 0x70, 0x47, 0x41, 0x57, 0x73, \n\t0x53, 0x51, 0x46, 0x2b, 0x78, 0x2f, 0x52, 0x6d, 0x6b, 0x72, 0x57, 0x62, 0x48, 0x42, 0x37, 0x4c, 0x51, 0x41, \n\t0x41, 0x41, 0x41, 0x42, 0x4a, 0x52, 0x55, 0x35, 0x45, 0x72, 0x6b, 0x4a, 0x67, 0x67, 0x67, 0x3d, 0x3d, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x31, 0x5d, 0x3d, 0x7b, 0x7d, \n\t0x2c, 0x20, 0x5b, 0x32, 0x5d, 0x3d, 0x7b, 0x7d, 0x7d, 0x0a,\n\t0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x61, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5b, 0x31, 0x5d, 0x2e, 0x61, 0x5f, 0x70, 0x6e, 0x67, 0x20, \n\t0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, \n\t0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x22, 0x2c, \n\t0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x42, 0x77, 0x41, 0x41, 0x41, 0x41, 0x63, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x42, 0x79, 0x44, 0x64, 0x2b, 0x55, 0x41, 0x41, 0x41, 0x44, 0x6a, 0x30, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x49, 0x69, 0x63, 0x32, 0x57, 0x54, 0x57, 0x77, 0x55, 0x5a, 0x52, 0x6a, 0x48, 0x66, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x78, 0x4d, 0x2f, 0x76, 0x52, 0x74, 0x53, 0x6e, 0x74, 0x74, 0x67, 0x73, 0x59, 0x53, 0x74, 0x74, \n\t0x4e, 0x32, 0x79, 0x55, 0x42, 0x57, 0x71, 0x51, 0x4b, 0x57, 0x43, 0x31, 0x42, 0x45, 0x36, 0x69, 0x47, 0x42, \n\t0x6a, 0x33, 0x49, 0x41, 0x63, 0x48, 0x6f, 0x52, 0x63, 0x57, 0x4c, 0x69, 0x52, 0x78, 0x4d, 0x54, 0x43, 0x54, \n\t0x69, 0x79, 0x65, 0x6a, 0x52, 0x71, 0x43, 0x65, 0x4e, 0x50, 0x65, 0x6a, 0x42, 0x6b, 0x78, 0x53, 0x51, 0x5c, 0x0a,\n\t0x09, 0x46, 0x67, 0x36, 0x47, 0x78, 0x45, 0x6a, 0x53, 0x6b, 0x4c, 0x59, 0x67, 0x45, 0x6d, 0x44, 0x58, 0x72, \n\t0x77, 0x6a, 0x46, 0x4f, 0x6d, 0x74, 0x72, 0x79, 0x33, 0x35, 0x32, 0x5a, 0x6c, 0x34, 0x50, 0x67, 0x34, 0x57, \n\t0x5a, 0x6e, 0x64, 0x32, 0x75, 0x68, 0x68, 0x44, 0x2b, 0x79, 0x56, 0x7a, 0x65, 0x39, 0x33, 0x6d, 0x65, 0x33, \n\t0x7a, 0x50, 0x76, 0x78, 0x2f, 0x4f, 0x38, 0x6b, 0x68, 0x43, 0x43, 0x65, 0x79, 0x6e, 0x35, 0x6e, 0x74, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x75, 0x5a, 0x32, 0x41, 0x4c, 0x63, 0x41, 0x67, 0x34, 0x42, 0x52, 0x69, 0x41, 0x75, 0x50, 0x55, \n\t0x5a, 0x77, 0x47, 0x6e, 0x67, 0x44, 0x53, 0x42, 0x65, 0x53, 0x79, 0x42, 0x70, 0x6d, 0x54, 0x32, 0x4d, 0x41, \n\t0x6b, 0x65, 0x41, 0x56, 0x78, 0x41, 0x69, 0x61, 0x46, 0x36, 0x65, 0x78, 0x6b, 0x7a, 0x4e, 0x59, 0x47, 0x64, \n\t0x75, 0x49, 0x69, 0x77, 0x62, 0x2b, 0x59, 0x45, 0x51, 0x61, 0x6b, 0x63, 0x7a, 0x36, 0x72, 0x72, 0x56, 0x5c, 0x0a,\n\t0x09, 0x53, 0x4c, 0x70, 0x61, 0x41, 0x6a, 0x34, 0x43, 0x33, 0x67, 0x59, 0x57, 0x2f, 0x67, 0x39, 0x77, 0x48, \n\t0x66, 0x43, 0x31, 0x4b, 0x4a, 0x6d, 0x4a, 0x77, 0x76, 0x45, 0x70, 0x53, 0x73, 0x63, 0x75, 0x59, 0x73, 0x2f, \n\t0x6b, 0x2f, 0x59, 0x50, 0x55, 0x61, 0x32, 0x68, 0x50, 0x64, 0x78, 0x4d, 0x61, 0x32, 0x6f, 0x51, 0x55, 0x30, \n\t0x64, 0x50, 0x41, 0x62, 0x75, 0x44, 0x53, 0x66, 0x77, 0x45, 0x6d, 0x67, 0x54, 0x50, 0x57, 0x39, 0x62, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x6d, 0x37, 0x41, 0x64, 0x6a, 0x57, 0x46, 0x64, 0x6e, 0x4b, 0x79, 0x58, 0x6c, 0x6b, 0x72, 0x79, \n\t0x36, 0x6a, 0x73, 0x69, 0x68, 0x4a, 0x31, 0x41, 0x54, 0x63, 0x51, 0x4d, 0x59, 0x41, 0x48, 0x36, 0x73, 0x42, \n\t0x52, 0x67, 0x46, 0x4a, 0x71, 0x78, 0x72, 0x73, 0x78, 0x30, 0x4c, 0x62, 0x78, 0x31, 0x46, 0x5a, 0x41, 0x6f, \n\t0x31, 0x77, 0x5a, 0x59, 0x43, 0x68, 0x6c, 0x58, 0x71, 0x33, 0x6e, 0x30, 0x4b, 0x74, 0x58, 0x4e, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x43, 0x6e, 0x67, 0x49, 0x6d, 0x48, 0x63, 0x6c, 0x35, 0x65, 0x4e, 0x7a, 0x52, 0x4f, 0x51, 0x58, 0x4f, \n\t0x37, 0x4c, 0x76, 0x6a, 0x31, 0x61, 0x45, 0x61, 0x63, 0x38, 0x6b, 0x71, 0x52, 0x39, 0x2b, 0x48, 0x6d, 0x56, \n\t0x6a, 0x63, 0x39, 0x6d, 0x63, 0x79, 0x4a, 0x6c, 0x6b, 0x33, 0x7a, 0x75, 0x46, 0x50, 0x5a, 0x64, 0x4c, 0x41, \n\t0x4f, 0x39, 0x34, 0x35, 0x37, 0x33, 0x41, 0x4f, 0x48, 0x43, 0x77, 0x4d, 0x44, 0x4b, 0x42, 0x6c, 0x66, 0x5c, 0x0a,\n\t0x09, 0x37, 0x62, 0x46, 0x36, 0x61, 0x73, 0x6a, 0x78, 0x46, 0x35, 0x6f, 0x52, 0x2b, 0x35, 0x49, 0x55, 0x4c, \n\t0x77, 0x32, 0x56, 0x35, 0x66, 0x47, 0x33, 0x73, 0x6d, 0x54, 0x2f, 0x37, 0x4c, 0x73, 0x77, 0x43, 0x76, 0x34, \n\t0x70, 0x7a, 0x77, 0x69, 0x73, 0x42, 0x39, 0x6f, 0x6d, 0x68, 0x71, 0x78, 0x5a, 0x47, 0x79, 0x70, 0x56, 0x39, \n\t0x53, 0x2b, 0x4b, 0x56, 0x74, 0x6f, 0x4d, 0x68, 0x67, 0x32, 0x57, 0x69, 0x62, 0x31, 0x69, 0x4b, 0x33, 0x5c, 0x0a,\n\t0x09, 0x31, 0x2f, 0x76, 0x61, 0x4c, 0x59, 0x36, 0x6c, 0x73, 0x54, 0x4e, 0x5a, 0x48, 0x64, 0x68, 0x66, 0x44, \n\t0x54, 0x69, 0x34, 0x65, 0x50, 0x34, 0x33, 0x78, 0x46, 0x7a, 0x52, 0x4e, 0x34, 0x6a, 0x61, 0x74, 0x77, 0x6f, \n\t0x31, 0x45, 0x63, 0x64, 0x4d, 0x33, 0x53, 0x41, 0x2f, 0x4d, 0x67, 0x6d, 0x41, 0x4e, 0x70, 0x44, 0x77, 0x74, \n\t0x52, 0x57, 0x6d, 0x54, 0x57, 0x6b, 0x38, 0x44, 0x62, 0x43, 0x7a, 0x47, 0x72, 0x44, 0x48, 0x76, 0x48, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x44, 0x4e, 0x77, 0x42, 0x41, 0x63, 0x47, 0x67, 0x44, 0x41, 0x49, 0x57, 0x6a, 0x55, 0x79, 0x78, \n\t0x2b, 0x65, 0x77, 0x55, 0x41, 0x2f, 0x62, 0x45, 0x75, 0x6b, 0x43, 0x56, 0x66, 0x65, 0x2b, 0x74, 0x6e, 0x41, \n\t0x38, 0x43, 0x31, 0x37, 0x6c, 0x35, 0x67, 0x6f, 0x2f, 0x31, 0x58, 0x7a, 0x74, 0x64, 0x5a, 0x53, 0x54, 0x51, \n\t0x51, 0x36, 0x47, 0x6c, 0x46, 0x4c, 0x42, 0x52, 0x51, 0x48, 0x6c, 0x78, 0x42, 0x59, 0x47, 0x73, 0x37, 0x5c, 0x0a,\n\t0x09, 0x74, 0x6a, 0x47, 0x50, 0x48, 0x49, 0x75, 0x69, 0x39, 0x72, 0x62, 0x34, 0x2b, 0x74, 0x68, 0x47, 0x46, \n\t0x71, 0x44, 0x78, 0x7a, 0x6a, 0x47, 0x31, 0x7a, 0x4d, 0x71, 0x30, 0x66, 0x4a, 0x32, 0x31, 0x58, 0x55, 0x6b, \n\t0x41, 0x70, 0x47, 0x69, 0x51, 0x30, 0x48, 0x4e, 0x39, 0x37, 0x72, 0x6e, 0x2b, 0x42, 0x4f, 0x59, 0x35, 0x6e, \n\t0x35, 0x55, 0x78, 0x37, 0x62, 0x49, 0x68, 0x4c, 0x7a, 0x41, 0x6a, 0x78, 0x2b, 0x6f, 0x61, 0x76, 0x55, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x79, 0x63, 0x77, 0x68, 0x39, 0x6f, 0x42, 0x74, 0x52, 0x4e, 0x4d, 0x6c, 0x39, 0x65, 0x67, 0x62, \n\t0x73, 0x57, 0x33, 0x63, 0x33, 0x46, 0x43, 0x42, 0x79, 0x6f, 0x42, 0x2f, 0x74, 0x30, 0x55, 0x37, 0x79, 0x77, \n\t0x2b, 0x4f, 0x49, 0x57, 0x66, 0x66, 0x65, 0x53, 0x33, 0x55, 0x61, 0x51, 0x4b, 0x59, 0x61, 0x63, 0x45, 0x4a, \n\t0x5a, 0x30, 0x2f, 0x53, 0x6b, 0x46, 0x78, 0x6a, 0x63, 0x33, 0x34, 0x63, 0x55, 0x44, 0x46, 0x41, 0x59, 0x5c, 0x0a,\n\t0x09, 0x76, 0x55, 0x44, 0x70, 0x78, 0x46, 0x56, 0x33, 0x78, 0x6f, 0x6b, 0x57, 0x39, 0x4d, 0x65, 0x37, 0x30, \n\t0x41, 0x61, 0x37, 0x4b, 0x48, 0x35, 0x78, 0x33, 0x6a, 0x57, 0x6e, 0x74, 0x44, 0x55, 0x42, 0x54, 0x4c, 0x71, \n\t0x53, 0x39, 0x38, 0x51, 0x65, 0x30, 0x33, 0x70, 0x62, 0x6b, 0x51, 0x4c, 0x4b, 0x62, 0x61, 0x66, 0x4f, 0x46, \n\t0x65, 0x6a, 0x62, 0x6b, 0x34, 0x69, 0x46, 0x41, 0x73, 0x57, 0x76, 0x4a, 0x76, 0x47, 0x71, 0x65, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x79, 0x43, 0x41, 0x32, 0x34, 0x76, 0x4c, 0x77, 0x4c, 0x61, 0x35, 0x72, 0x55, 0x41, 0x33, 0x39, 0x77, \n\t0x35, 0x35, 0x69, 0x31, 0x74, 0x4c, 0x63, 0x43, 0x76, 0x32, 0x51, 0x39, 0x50, 0x36, 0x36, 0x58, 0x52, 0x74, \n\t0x47, 0x4d, 0x51, 0x56, 0x74, 0x48, 0x33, 0x62, 0x73, 0x54, 0x38, 0x59, 0x52, 0x70, 0x7a, 0x2f, 0x48, 0x70, \n\t0x5a, 0x55, 0x41, 0x41, 0x6c, 0x32, 0x59, 0x67, 0x39, 0x66, 0x64, 0x4e, 0x31, 0x6e, 0x64, 0x54, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x34, 0x6b, 0x65, 0x48, 0x69, 0x6f, 0x42, 0x72, 0x63, 0x44, 0x53, 0x42, 0x6e, 0x76, 0x2f, 0x38, \n\t0x41, 0x2f, 0x67, 0x34, 0x39, 0x44, 0x65, 0x52, 0x35, 0x43, 0x69, 0x41, 0x63, 0x41, 0x70, 0x56, 0x59, 0x58, \n\t0x50, 0x7a, 0x6c, 0x57, 0x45, 0x41, 0x56, 0x69, 0x58, 0x4d, 0x69, 0x36, 0x59, 0x70, 0x4d, 0x71, 0x45, 0x44, \n\t0x32, 0x77, 0x42, 0x70, 0x31, 0x32, 0x35, 0x54, 0x70, 0x4e, 0x66, 0x4c, 0x54, 0x30, 0x73, 0x78, 0x36, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x70, 0x38, 0x4f, 0x76, 0x62, 0x4b, 0x39, 0x36, 0x76, 0x35, 0x52, 0x52, 0x38, 0x65, 0x51, 0x74, \n\t0x4b, 0x57, 0x33, 0x4d, 0x61, 0x70, 0x7a, 0x65, 0x36, 0x35, 0x41, 0x65, 0x63, 0x42, 0x2f, 0x5a, 0x6f, 0x44, \n\t0x37, 0x63, 0x62, 0x6b, 0x54, 0x64, 0x33, 0x49, 0x49, 0x58, 0x4c, 0x62, 0x30, 0x34, 0x6c, 0x53, 0x59, 0x70, \n\t0x4d, 0x36, 0x4c, 0x57, 0x74, 0x42, 0x48, 0x65, 0x74, 0x4e, 0x33, 0x42, 0x36, 0x59, 0x6c, 0x6b, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x72, 0x74, 0x61, 0x41, 0x6b, 0x38, 0x43, 0x49, 0x39, 0x66, 0x74, 0x73, 0x52, 0x2b, 0x37, 0x7a, 0x37, \n\t0x7a, 0x44, 0x50, 0x58, 0x71, 0x73, 0x4b, 0x55, 0x7a, 0x62, 0x45, 0x43, 0x4c, 0x2b, 0x34, 0x44, 0x54, 0x55, \n\t0x52, 0x54, 0x77, 0x46, 0x37, 0x67, 0x49, 0x75, 0x2b, 0x53, 0x64, 0x58, 0x34, 0x78, 0x44, 0x68, 0x6f, 0x2f, \n\t0x66, 0x4b, 0x6e, 0x56, 0x76, 0x6f, 0x2b, 0x6a, 0x66, 0x6d, 0x54, 0x67, 0x63, 0x6a, 0x6b, 0x51, 0x49, 0x5c, 0x0a,\n\t0x09, 0x44, 0x55, 0x46, 0x45, 0x5a, 0x5a, 0x30, 0x34, 0x44, 0x57, 0x31, 0x34, 0x62, 0x61, 0x76, 0x61, 0x6f, \n\t0x49, 0x66, 0x49, 0x4b, 0x7a, 0x6a, 0x50, 0x4f, 0x56, 0x41, 0x69, 0x34, 0x48, 0x2f, 0x46, 0x64, 0x78, 0x59, \n\t0x42, 0x38, 0x77, 0x43, 0x50, 0x52, 0x77, 0x75, 0x31, 0x78, 0x6c, 0x67, 0x43, 0x6e, 0x67, 0x4a, 0x44, 0x43, \n\t0x4d, 0x63, 0x2b, 0x69, 0x71, 0x71, 0x6c, 0x62, 0x67, 0x58, 0x64, 0x4e, 0x39, 0x2b, 0x79, 0x36, 0x39, 0x5c, 0x0a,\n\t0x09, 0x61, 0x2f, 0x6f, 0x48, 0x65, 0x48, 0x38, 0x37, 0x48, 0x46, 0x57, 0x42, 0x45, 0x52, 0x51, 0x41, 0x41, \n\t0x41, 0x41, 0x41, 0x53, 0x55, 0x56, 0x4f, 0x52, 0x4b, 0x35, 0x43, 0x59, 0x49, 0x49, 0x3d, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x61, 0x40, 0x32, 0x78, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5b, 0x32, 0x5d, 0x2e, 0x61, 0x5f, 0x70, 0x6e, 0x67, 0x20, \n\t0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, \n\t0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x22, 0x2c, \n\t0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x44, 0x67, 0x41, 0x41, 0x41, 0x41, 0x34, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x43, 0x6f, 0x68, 0x6a, 0x73, 0x65, 0x41, 0x41, 0x41, 0x48, 0x33, 0x45, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x6f, 0x67, 0x65, 0x32, 0x61, 0x58, 0x57, 0x77, 0x56, 0x78, 0x78, 0x58, 0x48, 0x66, 0x37, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x37, 0x64, 0x2b, 0x2b, 0x58, 0x44, 0x63, 0x51, 0x4f, 0x42, 0x67, 0x7a, 0x59, 0x4f, 0x4d, 0x48, \n\t0x55, 0x4e, 0x67, 0x30, 0x30, 0x4a, 0x48, 0x79, 0x48, 0x44, 0x34, 0x63, 0x6f, 0x4c, 0x59, 0x53, 0x45, 0x56, \n\t0x6e, 0x31, 0x70, 0x61, 0x4a, 0x71, 0x30, 0x69, 0x43, 0x5a, 0x71, 0x6d, 0x31, 0x59, 0x6f, 0x66, 0x55, 0x69, \n\t0x72, 0x66, 0x71, 0x6a, 0x4e, 0x51, 0x36, 0x75, 0x2b, 0x6f, 0x4a, 0x59, 0x30, 0x61, 0x68, 0x75, 0x35, 0x5c, 0x0a,\n\t0x09, 0x66, 0x57, 0x67, 0x44, 0x45, 0x5a, 0x45, 0x69, 0x70, 0x66, 0x42, 0x51, 0x45, 0x52, 0x52, 0x61, 0x61, \n\t0x4d, 0x43, 0x51, 0x4e, 0x6e, 0x47, 0x67, 0x67, 0x43, 0x44, 0x55, 0x32, 0x4d, 0x53, 0x4e, 0x71, 0x51, 0x4d, \n\t0x6d, 0x59, 0x50, 0x44, 0x31, 0x2f, 0x64, 0x71, 0x64, 0x50, 0x71, 0x7a, 0x33, 0x66, 0x6f, 0x42, 0x33, 0x39, \n\t0x38, 0x36, 0x31, 0x72, 0x59, 0x61, 0x49, 0x76, 0x33, 0x53, 0x6c, 0x6d, 0x64, 0x6b, 0x7a, 0x5a, 0x38, 0x5c, 0x0a,\n\t0x09, 0x35, 0x2f, 0x37, 0x38, 0x7a, 0x73, 0x6d, 0x58, 0x4e, 0x47, 0x53, 0x43, 0x6e, 0x35, 0x4a, 0x45, 0x50, \n\t0x37, 0x66, 0x78, 0x73, 0x77, 0x33, 0x72, 0x68, 0x46, 0x38, 0x47, 0x62, 0x48, 0x4c, 0x59, 0x49, 0x33, 0x4f, \n\t0x34, 0x78, 0x78, 0x30, 0x6a, 0x73, 0x42, 0x61, 0x41, 0x56, 0x57, 0x41, 0x58, 0x63, 0x42, 0x6a, 0x63, 0x42, \n\t0x6b, 0x49, 0x44, 0x62, 0x38, 0x50, 0x41, 0x76, 0x30, 0x41, 0x4e, 0x33, 0x41, 0x32, 0x30, 0x41, 0x37, 0x5c, 0x0a,\n\t0x09, 0x38, 0x41, 0x5a, 0x77, 0x5a, 0x63, 0x77, 0x74, 0x6b, 0x56, 0x4b, 0x4f, 0x31, 0x55, 0x2b, 0x54, 0x55, \n\t0x6e, 0x35, 0x65, 0x53, 0x72, 0x6c, 0x4c, 0x53, 0x70, 0x6d, 0x52, 0x36, 0x6b, 0x68, 0x4a, 0x4b, 0x58, 0x64, \n\t0x4c, 0x4b, 0x54, 0x63, 0x4d, 0x36, 0x78, 0x6f, 0x54, 0x75, 0x38, 0x51, 0x59, 0x66, 0x41, 0x63, 0x46, 0x38, \n\t0x42, 0x58, 0x67, 0x65, 0x30, 0x43, 0x7a, 0x78, 0x31, 0x76, 0x45, 0x48, 0x6b, 0x67, 0x69, 0x6b, 0x78, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x6e, 0x67, 0x36, 0x36, 0x68, 0x54, 0x59, 0x71, 0x42, 0x34, 0x62, 0x6c, 0x43, 0x33, 0x67, 0x4f, \n\t0x65, 0x41, 0x33, 0x59, 0x41, 0x6f, 0x7a, 0x4a, 0x77, 0x74, 0x41, 0x52, 0x62, 0x67, 0x42, 0x65, 0x42, 0x35, \n\t0x59, 0x57, 0x4e, 0x63, 0x69, 0x68, 0x4e, 0x35, 0x6d, 0x67, 0x50, 0x6d, 0x57, 0x4d, 0x39, 0x57, 0x50, 0x2b, \n\t0x2b, 0x69, 0x4e, 0x31, 0x39, 0x42, 0x54, 0x6d, 0x55, 0x4c, 0x52, 0x35, 0x59, 0x31, 0x78, 0x41, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x39, 0x44, 0x6e, 0x54, 0x43, 0x62, 0x55, 0x50, 0x41, 0x31, 0x7a, 0x30, 0x52, 0x32, 0x49, 0x43, \n\t0x64, 0x48, 0x72, 0x39, 0x62, 0x63, 0x44, 0x6d, 0x34, 0x47, 0x54, 0x35, 0x52, 0x6f, 0x34, 0x47, 0x6f, 0x4b, \n\t0x62, 0x67, 0x65, 0x65, 0x42, 0x69, 0x4e, 0x74, 0x67, 0x39, 0x56, 0x34, 0x6d, 0x75, 0x62, 0x75, 0x44, 0x7a, \n\t0x50, 0x34, 0x75, 0x35, 0x4e, 0x57, 0x4d, 0x6d, 0x69, 0x47, 0x36, 0x68, 0x72, 0x46, 0x73, 0x42, 0x70, 0x5c, 0x0a,\n\t0x09, 0x48, 0x31, 0x38, 0x7a, 0x42, 0x61, 0x70, 0x68, 0x63, 0x2b, 0x53, 0x67, 0x4a, 0x62, 0x67, 0x4e, 0x2b, \n\t0x56, 0x59, 0x32, 0x51, 0x35, 0x42, 0x41, 0x57, 0x77, 0x44, 0x58, 0x6a, 0x61, 0x62, 0x5a, 0x41, 0x44, 0x51, \n\t0x79, 0x53, 0x32, 0x74, 0x35, 0x50, 0x5a, 0x30, 0x34, 0x6d, 0x30, 0x37, 0x48, 0x4c, 0x73, 0x4b, 0x49, 0x4b, \n\t0x78, 0x75, 0x4a, 0x62, 0x59, 0x34, 0x38, 0x76, 0x51, 0x36, 0x36, 0x6f, 0x4c, 0x6d, 0x37, 0x63, 0x42, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x77, 0x43, 0x57, 0x6b, 0x72, 0x47, 0x4b, 0x42, 0x48, 0x58, 0x67, 0x6a, 0x38, 0x42, 0x47, 0x74, \n\t0x79, 0x48, 0x39, 0x7a, 0x79, 0x34, 0x53, 0x7a, 0x78, 0x39, 0x41, 0x58, 0x6b, 0x71, 0x71, 0x36, 0x41, 0x6b, \n\t0x32, 0x7a, 0x4e, 0x41, 0x49, 0x50, 0x33, 0x45, 0x50, 0x30, 0x51, 0x31, 0x33, 0x67, 0x78, 0x42, 0x75, 0x38, \n\t0x77, 0x37, 0x67, 0x4d, 0x52, 0x54, 0x57, 0x70, 0x53, 0x72, 0x42, 0x58, 0x77, 0x48, 0x66, 0x63, 0x53, 0x5c, 0x0a,\n\t0x09, 0x74, 0x44, 0x4f, 0x34, 0x2b, 0x51, 0x66, 0x4f, 0x6c, 0x64, 0x6c, 0x66, 0x37, 0x4b, 0x43, 0x4b, 0x32, \n\t0x73, 0x49, 0x2f, 0x37, 0x30, 0x47, 0x6b, 0x54, 0x55, 0x64, 0x4a, 0x74, 0x2b, 0x44, 0x58, 0x79, 0x37, 0x31, \n\t0x50, 0x34, 0x71, 0x42, 0x4a, 0x38, 0x43, 0x66, 0x67, 0x75, 0x41, 0x6c, 0x41, 0x79, 0x32, 0x48, 0x53, 0x43, \n\t0x39, 0x36, 0x35, 0x53, 0x43, 0x71, 0x65, 0x56, 0x44, 0x6e, 0x31, 0x39, 0x44, 0x35, 0x51, 0x38, 0x65, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x69, 0x54, 0x35, 0x64, 0x61, 0x43, 0x74, 0x6c, 0x4c, 0x36, 0x6c, 0x45, 0x6d, 0x7a, 0x42, 0x2b, \n\t0x53, 0x42, 0x48, 0x41, 0x42, 0x49, 0x76, 0x74, 0x35, 0x50, 0x61, 0x63, 0x61, 0x77, 0x4d, 0x55, 0x38, 0x75, \n\t0x48, 0x73, 0x62, 0x69, 0x57, 0x79, 0x6d, 0x66, 0x58, 0x51, 0x55, 0x67, 0x48, 0x5a, 0x2b, 0x4f, 0x35, 0x46, \n\t0x7a, 0x67, 0x52, 0x31, 0x4b, 0x38, 0x55, 0x56, 0x30, 0x33, 0x67, 0x76, 0x4b, 0x30, 0x49, 0x51, 0x50, 0x5c, 0x0a,\n\t0x09, 0x72, 0x67, 0x6d, 0x62, 0x4c, 0x4a, 0x6d, 0x51, 0x39, 0x2f, 0x69, 0x6f, 0x6c, 0x74, 0x6a, 0x31, 0x4c, \n\t0x35, 0x69, 0x2f, 0x56, 0x6f, 0x39, 0x52, 0x4f, 0x55, 0x2b, 0x6d, 0x61, 0x50, 0x39, 0x4a, 0x4c, 0x59, 0x33, \n\t0x75, 0x35, 0x57, 0x49, 0x7a, 0x69, 0x37, 0x71, 0x76, 0x44, 0x75, 0x34, 0x61, 0x41, 0x55, 0x67, 0x68, 0x75, \n\t0x42, 0x70, 0x51, 0x44, 0x32, 0x68, 0x31, 0x64, 0x4a, 0x2f, 0x4f, 0x5a, 0x4e, 0x4a, 0x63, 0x4e, 0x63, 0x5c, 0x0a,\n\t0x09, 0x68, 0x46, 0x62, 0x55, 0x45, 0x58, 0x39, 0x79, 0x4e, 0x64, 0x71, 0x55, 0x43, 0x52, 0x67, 0x74, 0x30, \n\t0x34, 0x6c, 0x74, 0x57, 0x71, 0x71, 0x73, 0x49, 0x2f, 0x58, 0x71, 0x43, 0x54, 0x49, 0x64, 0x35, 0x39, 0x7a, \n\t0x71, 0x63, 0x68, 0x77, 0x48, 0x77, 0x78, 0x64, 0x42, 0x42, 0x44, 0x58, 0x67, 0x78, 0x32, 0x34, 0x6c, 0x73, \n\t0x66, 0x30, 0x51, 0x38, 0x6b, 0x70, 0x61, 0x32, 0x54, 0x42, 0x74, 0x57, 0x70, 0x7a, 0x34, 0x4e, 0x31, 0x5c, 0x0a,\n\t0x09, 0x71, 0x4c, 0x32, 0x6b, 0x49, 0x4c, 0x5a, 0x71, 0x48, 0x50, 0x76, 0x56, 0x31, 0x5a, 0x56, 0x36, 0x4c, \n\t0x74, 0x59, 0x4d, 0x34, 0x6a, 0x41, 0x72, 0x35, 0x50, 0x41, 0x49, 0x63, 0x67, 0x67, 0x67, 0x38, 0x44, 0x63, \n\t0x77, 0x43, 0x79, 0x37, 0x35, 0x30, 0x6e, 0x73, 0x36, 0x39, 0x62, 0x32, 0x53, 0x43, 0x41, 0x36, 0x4b, 0x61, \n\t0x6c, 0x69, 0x4d, 0x72, 0x49, 0x44, 0x65, 0x32, 0x52, 0x39, 0x58, 0x63, 0x70, 0x36, 0x37, 0x4c, 0x66, 0x5c, 0x0a,\n\t0x09, 0x76, 0x30, 0x70, 0x71, 0x62, 0x32, 0x37, 0x70, 0x4e, 0x51, 0x47, 0x50, 0x2b, 0x4d, 0x6b, 0x48, 0x45, \n\t0x64, 0x7a, 0x73, 0x46, 0x70, 0x4b, 0x37, 0x6a, 0x79, 0x6f, 0x62, 0x41, 0x32, 0x41, 0x73, 0x6d, 0x59, 0x36, \n\t0x35, 0x35, 0x4d, 0x34, 0x52, 0x6e, 0x35, 0x6d, 0x4c, 0x37, 0x30, 0x53, 0x72, 0x75, 0x63, 0x45, 0x39, 0x43, \n\t0x30, 0x52, 0x71, 0x39, 0x33, 0x48, 0x49, 0x35, 0x68, 0x79, 0x4b, 0x54, 0x58, 0x36, 0x79, 0x66, 0x67, 0x5c, 0x0a,\n\t0x09, 0x51, 0x6e, 0x41, 0x67, 0x38, 0x43, 0x32, 0x42, 0x38, 0x4e, 0x6b, 0x6a, 0x6e, 0x77, 0x76, 0x72, 0x49, \n\t0x68, 0x43, 0x45, 0x48, 0x30, 0x30, 0x55, 0x56, 0x46, 0x54, 0x58, 0x62, 0x2f, 0x59, 0x4c, 0x34, 0x53, 0x30, \n\t0x67, 0x6d, 0x31, 0x7a, 0x6c, 0x5a, 0x57, 0x61, 0x35, 0x38, 0x66, 0x4a, 0x4e, 0x33, 0x52, 0x37, 0x56, 0x62, \n\t0x58, 0x34, 0x68, 0x7a, 0x50, 0x52, 0x6f, 0x51, 0x66, 0x77, 0x54, 0x57, 0x41, 0x43, 0x5a, 0x41, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x33, 0x41, 0x6d, 0x32, 0x75, 0x73, 0x38, 0x61, 0x75, 0x6d, 0x38, 0x6d, 0x78, 0x68, 0x30, 0x31, 0x75, \n\t0x62, 0x70, 0x31, 0x37, 0x69, 0x4c, 0x58, 0x74, 0x75, 0x34, 0x70, 0x6b, 0x67, 0x6d, 0x76, 0x61, 0x6c, 0x4c, \n\t0x57, 0x43, 0x35, 0x41, 0x2b, 0x31, 0x4f, 0x6b, 0x57, 0x44, 0x5a, 0x79, 0x7a, 0x35, 0x34, 0x6a, 0x77, 0x49, \n\t0x35, 0x6a, 0x62, 0x35, 0x6a, 0x4a, 0x48, 0x65, 0x38, 0x6f, 0x79, 0x49, 0x76, 0x4c, 0x49, 0x2f, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x36, 0x34, 0x71, 0x58, 0x44, 0x57, 0x4d, 0x63, 0x75, 0x59, 0x48, 0x56, 0x64, 0x79, 0x4c, 0x58, \n\t0x70, 0x4d, 0x36, 0x76, 0x51, 0x6d, 0x36, 0x75, 0x76, 0x37, 0x78, 0x71, 0x49, 0x37, 0x44, 0x75, 0x39, 0x6b, \n\t0x50, 0x64, 0x37, 0x56, 0x33, 0x6e, 0x4a, 0x2b, 0x52, 0x47, 0x38, 0x78, 0x79, 0x31, 0x59, 0x4a, 0x79, 0x2f, \n\t0x34, 0x69, 0x49, 0x30, 0x4d, 0x76, 0x65, 0x56, 0x32, 0x6a, 0x4b, 0x62, 0x61, 0x76, 0x45, 0x46, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x50, 0x79, 0x52, 0x37, 0x2b, 0x41, 0x4d, 0x41, 0x55, 0x6e, 0x38, 0x2f, 0x58, 0x53, 0x52, 0x72, 0x72, \n\t0x6c, 0x43, 0x66, 0x70, 0x76, 0x4a, 0x53, 0x45, 0x75, 0x74, 0x38, 0x4c, 0x67, 0x44, 0x67, 0x75, 0x56, 0x76, \n\t0x35, 0x45, 0x5a, 0x77, 0x46, 0x7a, 0x70, 0x71, 0x52, 0x48, 0x36, 0x57, 0x55, 0x44, 0x51, 0x69, 0x76, 0x62, \n\t0x53, 0x6d, 0x71, 0x4a, 0x2f, 0x2f, 0x63, 0x6b, 0x53, 0x74, 0x6e, 0x44, 0x6e, 0x51, 0x56, 0x76, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x33, 0x4d, 0x35, 0x59, 0x30, 0x49, 0x58, 0x54, 0x30, 0x38, 0x5a, 0x50, 0x58, 0x30, 0x75, 0x38, 0x56, \n\t0x47, 0x4c, 0x78, 0x6b, 0x2f, 0x72, 0x54, 0x4d, 0x42, 0x37, 0x41, 0x76, 0x71, 0x59, 0x52, 0x4a, 0x52, 0x48, \n\t0x63, 0x46, 0x63, 0x6c, 0x68, 0x2f, 0x54, 0x37, 0x68, 0x38, 0x6b, 0x57, 0x37, 0x42, 0x4a, 0x32, 0x58, 0x30, \n\t0x4a, 0x4d, 0x73, 0x66, 0x2f, 0x6b, 0x7a, 0x65, 0x69, 0x4b, 0x6f, 0x36, 0x2b, 0x63, 0x4a, 0x72, 0x79, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x48, 0x62, 0x2f, 0x4e, 0x62, 0x63, 0x34, 0x32, 0x55, 0x76, 0x47, 0x4c, 0x2b, 0x68, 0x6b, 0x41, \n\t0x4d, 0x69, 0x30, 0x30, 0x76, 0x45, 0x4c, 0x41, 0x50, 0x4f, 0x42, 0x52, 0x6f, 0x53, 0x5a, 0x56, 0x36, 0x31, \n\t0x56, 0x78, 0x35, 0x6d, 0x34, 0x38, 0x32, 0x75, 0x51, 0x4b, 0x6a, 0x6a, 0x56, 0x58, 0x2f, 0x65, 0x50, 0x6d, \n\t0x53, 0x73, 0x61, 0x63, 0x31, 0x4f, 0x34, 0x56, 0x4d, 0x6a, 0x42, 0x33, 0x4d, 0x79, 0x4b, 0x65, 0x63, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x45, 0x7a, 0x67, 0x73, 0x35, 0x70, 0x4f, 0x61, 0x35, 0x43, 0x46, 0x30, 0x6a, 0x38, 0x74, 0x6b, \n\t0x62, 0x6c, 0x34, 0x51, 0x77, 0x44, 0x55, 0x52, 0x6c, 0x4a, 0x50, 0x2b, 0x4c, 0x6d, 0x55, 0x58, 0x50, 0x7a, \n\t0x59, 0x55, 0x4e, 0x69, 0x48, 0x68, 0x49, 0x61, 0x61, 0x78, 0x53, 0x34, 0x45, 0x63, 0x77, 0x41, 0x53, 0x41, \n\t0x71, 0x77, 0x6b, 0x6f, 0x4b, 0x6a, 0x64, 0x58, 0x31, 0x61, 0x4a, 0x4d, 0x72, 0x6c, 0x51, 0x30, 0x52, 0x5c, 0x0a,\n\t0x09, 0x55, 0x5a, 0x50, 0x51, 0x66, 0x58, 0x57, 0x4b, 0x6e, 0x58, 0x4c, 0x6d, 0x5a, 0x37, 0x31, 0x45, 0x2f, \n\t0x4b, 0x62, 0x6f, 0x42, 0x61, 0x42, 0x65, 0x71, 0x37, 0x6a, 0x52, 0x78, 0x66, 0x4b, 0x45, 0x4a, 0x70, 0x77, \n\t0x54, 0x65, 0x41, 0x48, 0x53, 0x37, 0x33, 0x51, 0x37, 0x55, 0x31, 0x50, 0x4c, 0x4f, 0x2f, 0x37, 0x43, 0x4e, \n\t0x43, 0x43, 0x6b, 0x6f, 0x38, 0x56, 0x4e, 0x39, 0x49, 0x62, 0x38, 0x64, 0x7a, 0x4c, 0x38, 0x51, 0x41, 0x5c, 0x0a,\n\t0x09, 0x76, 0x70, 0x50, 0x5a, 0x32, 0x55, 0x43, 0x71, 0x30, 0x71, 0x4e, 0x7a, 0x4d, 0x39, 0x76, 0x32, 0x4e, \n\t0x2b, 0x42, 0x4d, 0x38, 0x41, 0x39, 0x64, 0x72, 0x55, 0x53, 0x51, 0x68, 0x64, 0x4b, 0x79, 0x6e, 0x57, 0x45, \n\t0x6c, 0x6f, 0x39, 0x43, 0x37, 0x30, 0x68, 0x76, 0x39, 0x36, 0x74, 0x6e, 0x6b, 0x73, 0x4d, 0x2f, 0x75, 0x52, \n\t0x31, 0x38, 0x44, 0x68, 0x7a, 0x43, 0x6c, 0x31, 0x6a, 0x77, 0x75, 0x38, 0x33, 0x6f, 0x6c, 0x58, 0x48, 0x5c, 0x0a,\n\t0x09, 0x48, 0x57, 0x4f, 0x61, 0x61, 0x74, 0x47, 0x62, 0x71, 0x72, 0x46, 0x4f, 0x39, 0x59, 0x38, 0x6f, 0x66, \n\t0x7a, 0x32, 0x30, 0x6d, 0x70, 0x77, 0x44, 0x30, 0x2b, 0x30, 0x70, 0x34, 0x39, 0x50, 0x2f, 0x58, 0x77, 0x41, \n\t0x69, 0x62, 0x4b, 0x41, 0x31, 0x54, 0x41, 0x77, 0x63, 0x54, 0x45, 0x51, 0x4e, 0x6f, 0x6c, 0x39, 0x61, 0x58, \n\t0x4e, 0x53, 0x57, 0x33, 0x4e, 0x58, 0x68, 0x53, 0x51, 0x35, 0x41, 0x57, 0x6a, 0x61, 0x70, 0x4e, 0x34, 0x5c, 0x0a,\n\t0x09, 0x72, 0x50, 0x72, 0x4a, 0x45, 0x4e, 0x38, 0x77, 0x4c, 0x48, 0x41, 0x6b, 0x41, 0x54, 0x68, 0x56, 0x37, \n\t0x53, 0x32, 0x35, 0x35, 0x69, 0x50, 0x69, 0x72, 0x32, 0x75, 0x77, 0x58, 0x39, 0x30, 0x31, 0x4d, 0x44, 0x78, \n\t0x77, 0x74, 0x2f, 0x2b, 0x57, 0x37, 0x30, 0x61, 0x66, 0x6b, 0x58, 0x59, 0x66, 0x56, 0x65, 0x4a, 0x72, 0x50, \n\t0x33, 0x62, 0x47, 0x43, 0x2f, 0x39, 0x4e, 0x37, 0x54, 0x6b, 0x4d, 0x6e, 0x76, 0x31, 0x4f, 0x62, 0x79, 0x5c, 0x0a,\n\t0x09, 0x78, 0x70, 0x49, 0x4f, 0x77, 0x2f, 0x71, 0x63, 0x71, 0x73, 0x4c, 0x39, 0x6f, 0x64, 0x31, 0x4c, 0x7a, \n\t0x6f, 0x2f, 0x67, 0x33, 0x78, 0x68, 0x65, 0x76, 0x4f, 0x62, 0x43, 0x57, 0x66, 0x36, 0x44, 0x4e, 0x56, 0x63, \n\t0x54, 0x66, 0x65, 0x67, 0x7a, 0x52, 0x57, 0x31, 0x44, 0x4f, 0x39, 0x38, 0x71, 0x61, 0x56, 0x72, 0x62, 0x2f, \n\t0x30, 0x32, 0x51, 0x32, 0x6c, 0x38, 0x51, 0x32, 0x78, 0x47, 0x43, 0x30, 0x4c, 0x30, 0x7a, 0x41, 0x76, 0x5c, 0x0a,\n\t0x09, 0x75, 0x46, 0x46, 0x74, 0x61, 0x37, 0x78, 0x54, 0x52, 0x4f, 0x58, 0x6d, 0x4e, 0x45, 0x2b, 0x42, 0x47, \n\t0x38, 0x41, 0x76, 0x77, 0x46, 0x49, 0x44, 0x52, 0x33, 0x42, 0x74, 0x71, 0x30, 0x75, 0x4b, 0x65, 0x67, 0x4d, \n\t0x62, 0x2b, 0x32, 0x4b, 0x41, 0x79, 0x66, 0x2f, 0x73, 0x64, 0x5a, 0x4d, 0x76, 0x75, 0x36, 0x41, 0x6f, 0x31, \n\t0x30, 0x6b, 0x58, 0x7a, 0x74, 0x47, 0x44, 0x49, 0x39, 0x76, 0x42, 0x46, 0x4b, 0x53, 0x62, 0x59, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x59, 0x41, 0x30, 0x4b, 0x67, 0x62, 0x6c, 0x79, 0x6a, 0x6c, 0x74, 0x37, 0x48, 0x5a, 0x2b, 0x6b, 0x54, \n\t0x64, 0x42, 0x33, 0x38, 0x41, 0x38, 0x41, 0x36, 0x42, 0x72, 0x6d, 0x35, 0x30, 0x5a, 0x4f, 0x4f, 0x77, 0x42, \n\t0x6b, 0x33, 0x75, 0x7a, 0x43, 0x36, 0x68, 0x73, 0x41, 0x77, 0x4f, 0x6f, 0x62, 0x59, 0x4f, 0x6a, 0x46, 0x67, \n\t0x77, 0x46, 0x71, 0x69, 0x32, 0x47, 0x66, 0x47, 0x2b, 0x44, 0x71, 0x63, 0x37, 0x73, 0x5a, 0x32, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x45, 0x67, 0x52, 0x2b, 0x39, 0x68, 0x76, 0x56, 0x75, 0x6e, 0x36, 0x39, 0x38, 0x61, 0x47, 0x55, \n\t0x64, 0x2b, 0x74, 0x54, 0x63, 0x63, 0x76, 0x43, 0x4e, 0x72, 0x67, 0x56, 0x46, 0x31, 0x54, 0x53, 0x63, 0x79, \n\t0x46, 0x57, 0x54, 0x54, 0x4b, 0x53, 0x35, 0x38, 0x73, 0x32, 0x58, 0x6b, 0x66, 0x30, 0x6a, 0x42, 0x33, 0x69, \n\t0x46, 0x72, 0x69, 0x46, 0x6d, 0x56, 0x43, 0x41, 0x2f, 0x75, 0x49, 0x62, 0x4d, 0x6a, 0x6a, 0x36, 0x36, 0x5c, 0x0a,\n\t0x09, 0x37, 0x51, 0x6b, 0x68, 0x71, 0x4e, 0x79, 0x36, 0x41, 0x57, 0x50, 0x32, 0x46, 0x48, 0x43, 0x53, 0x4e, \n\t0x4d, 0x32, 0x41, 0x35, 0x34, 0x42, 0x42, 0x2f, 0x36, 0x41, 0x4e, 0x2f, 0x42, 0x78, 0x41, 0x78, 0x45, 0x79, \n\t0x69, 0x54, 0x79, 0x7a, 0x79, 0x46, 0x4a, 0x53, 0x57, 0x6a, 0x58, 0x31, 0x75, 0x59, 0x48, 0x7a, 0x4a, 0x41, \n\t0x65, 0x62, 0x61, 0x32, 0x53, 0x34, 0x35, 0x63, 0x44, 0x4a, 0x51, 0x76, 0x67, 0x4f, 0x57, 0x34, 0x73, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x2f, 0x43, 0x54, 0x67, 0x49, 0x45, 0x46, 0x37, 0x64, 0x68, 0x4c, 0x46, 0x6b, 0x65, 0x6f, 0x44, \n\t0x34, 0x2b, 0x45, 0x47, 0x62, 0x58, 0x6b, 0x48, 0x73, 0x73, 0x57, 0x56, 0x75, 0x74, 0x52, 0x30, 0x6e, 0x6c, \n\t0x4f, 0x2f, 0x66, 0x70, 0x77, 0x53, 0x39, 0x45, 0x69, 0x65, 0x71, 0x6e, 0x55, 0x51, 0x49, 0x34, 0x74, 0x2b, \n\t0x36, 0x48, 0x36, 0x33, 0x57, 0x65, 0x38, 0x4d, 0x5a, 0x4c, 0x34, 0x69, 0x77, 0x54, 0x6e, 0x78, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x71, 0x78, 0x75, 0x38, 0x53, 0x75, 0x4c, 0x45, 0x69, 0x77, 0x4c, 0x44, 0x44, 0x4b, 0x55, 0x65, 0x77, \n\t0x6b, 0x34, 0x77, 0x6e, 0x41, 0x2f, 0x51, 0x4a, 0x73, 0x57, 0x6f, 0x2b, 0x4f, 0x45, 0x36, 0x52, 0x4a, 0x57, \n\t0x43, 0x43, 0x7a, 0x64, 0x61, 0x61, 0x49, 0x4c, 0x59, 0x64, 0x31, 0x63, 0x58, 0x48, 0x71, 0x43, 0x33, 0x55, \n\t0x47, 0x4c, 0x4f, 0x55, 0x4f, 0x57, 0x55, 0x32, 0x51, 0x61, 0x38, 0x41, 0x45, 0x36, 0x59, 0x6f, 0x66, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x6e, 0x36, 0x39, 0x43, 0x6d, 0x65, 0x4a, 0x35, 0x53, 0x78, 0x67, 0x7a, 0x43, 0x30, 0x49, 0x67, \n\t0x2f, 0x32, 0x34, 0x71, 0x35, 0x4e, 0x48, 0x66, 0x71, 0x33, 0x34, 0x5a, 0x43, 0x72, 0x6c, 0x41, 0x31, 0x75, \n\t0x36, 0x54, 0x68, 0x72, 0x4d, 0x6d, 0x4e, 0x41, 0x48, 0x62, 0x66, 0x41, 0x4e, 0x65, 0x32, 0x37, 0x73, 0x55, \n\t0x36, 0x65, 0x56, 0x46, 0x46, 0x52, 0x2b, 0x6d, 0x44, 0x31, 0x55, 0x53, 0x4a, 0x50, 0x62, 0x4f, 0x47, 0x5c, 0x0a,\n\t0x09, 0x30, 0x4e, 0x7a, 0x63, 0x75, 0x74, 0x38, 0x42, 0x50, 0x49, 0x35, 0x43, 0x6a, 0x72, 0x43, 0x63, 0x42, \n\t0x4b, 0x67, 0x4f, 0x62, 0x4d, 0x56, 0x4e, 0x6f, 0x32, 0x55, 0x73, 0x45, 0x71, 0x38, 0x63, 0x49, 0x66, 0x33, \n\t0x71, 0x53, 0x57, 0x52, 0x47, 0x2f, 0x58, 0x44, 0x73, 0x68, 0x64, 0x44, 0x39, 0x44, 0x63, 0x53, 0x2b, 0x75, \n\t0x68, 0x7a, 0x74, 0x74, 0x74, 0x78, 0x36, 0x66, 0x32, 0x46, 0x34, 0x54, 0x4b, 0x56, 0x74, 0x65, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x51, 0x70, 0x37, 0x4b, 0x65, 0x41, 0x58, 0x7a, 0x4b, 0x63, 0x6c, 0x4c, 0x46, 0x36, 0x4c, 0x7a, 0x4f, \n\t0x30, 0x38, 0x79, 0x32, 0x79, 0x2b, 0x38, 0x2b, 0x4e, 0x4b, 0x73, 0x74, 0x72, 0x4c, 0x4a, 0x68, 0x4b, 0x35, \n\t0x49, 0x73, 0x4c, 0x43, 0x4d, 0x32, 0x62, 0x36, 0x54, 0x59, 0x6c, 0x63, 0x64, 0x5a, 0x2f, 0x53, 0x65, 0x6d, \n\t0x79, 0x36, 0x7a, 0x45, 0x57, 0x6c, 0x78, 0x44, 0x61, 0x4b, 0x41, 0x67, 0x78, 0x57, 0x6e, 0x30, 0x44, 0x5c, 0x0a,\n\t0x09, 0x70, 0x50, 0x39, 0x36, 0x6b, 0x76, 0x53, 0x68, 0x4c, 0x75, 0x79, 0x75, 0x67, 0x5a, 0x4b, 0x55, 0x61, \n\t0x44, 0x56, 0x52, 0x6a, 0x4d, 0x56, 0x31, 0x68, 0x46, 0x75, 0x62, 0x4d, 0x42, 0x71, 0x4c, 0x48, 0x50, 0x74, \n\t0x44, 0x77, 0x4a, 0x4f, 0x55, 0x6b, 0x43, 0x62, 0x7a, 0x77, 0x6c, 0x68, 0x64, 0x49, 0x39, 0x6d, 0x49, 0x6b, \n\t0x36, 0x53, 0x5a, 0x55, 0x2f, 0x6a, 0x41, 0x37, 0x72, 0x39, 0x47, 0x39, 0x74, 0x52, 0x35, 0x72, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x37, 0x4c, 0x32, 0x42, 0x65, 0x76, 0x4f, 0x6c, 0x4d, 0x34, 0x6c, 0x55, 0x56, 0x55, 0x68, 0x42, 0x47, \n\t0x56, 0x45, 0x66, 0x51, 0x5a, 0x74, 0x32, 0x45, 0x30, 0x54, 0x45, 0x61, 0x76, 0x76, 0x79, 0x45, 0x4a, 0x63, \n\t0x78, 0x72, 0x34, 0x47, 0x63, 0x35, 0x36, 0x48, 0x35, 0x32, 0x42, 0x59, 0x33, 0x77, 0x52, 0x61, 0x4d, 0x50, \n\t0x77, 0x5a, 0x5a, 0x35, 0x55, 0x47, 0x52, 0x65, 0x42, 0x4d, 0x74, 0x4b, 0x35, 0x52, 0x50, 0x53, 0x46, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x39, 0x74, 0x46, 0x6f, 0x4a, 0x45, 0x77, 0x45, 0x53, 0x66, 0x30, 0x76, 0x78, 0x51, 0x6e, 0x67, \n\t0x44, 0x77, 0x4c, 0x4a, 0x77, 0x7a, 0x70, 0x52, 0x68, 0x41, 0x53, 0x4f, 0x43, 0x47, 0x52, 0x4d, 0x38, 0x42, \n\t0x78, 0x34, 0x41, 0x43, 0x77, 0x6a, 0x33, 0x47, 0x34, 0x79, 0x6a, 0x56, 0x65, 0x42, 0x44, 0x38, 0x32, 0x2b, \n\t0x4d, 0x54, 0x66, 0x4e, 0x72, 0x78, 0x46, 0x38, 0x47, 0x62, 0x48, 0x4c, 0x59, 0x49, 0x33, 0x4f, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x34, 0x48, 0x7a, 0x4e, 0x32, 0x2b, 0x30, 0x63, 0x57, 0x75, 0x31, 0x76, 0x45, 0x41, 0x41, 0x41, 0x41, \n\t0x41, 0x53, 0x55, 0x56, 0x4f, 0x52, 0x4b, 0x35, 0x43, 0x59, 0x49, 0x49, 0x3d, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x65, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5b, 0x31, 0x5d, 0x2e, 0x65, 0x5f, 0x70, 0x6e, 0x67, 0x20, \n\t0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, \n\t0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x22, 0x2c, \n\t0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x42, 0x77, 0x41, 0x41, 0x41, 0x41, 0x63, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x42, 0x79, 0x44, 0x64, 0x2b, 0x55, 0x41, 0x41, 0x41, 0x44, 0x72, 0x45, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x49, 0x69, 0x63, 0x32, 0x57, 0x57, 0x32, 0x68, 0x63, 0x56, 0x52, 0x53, 0x47, 0x76, 0x33, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x5a, 0x6b, 0x38, 0x77, 0x74, 0x4a, 0x6a, 0x68, 0x70, 0x55, 0x6b, 0x31, 0x62, 0x6b, 0x36, 0x61, \n\t0x31, 0x73, 0x5a, 0x68, 0x71, 0x73, 0x56, 0x4a, 0x46, 0x4c, 0x46, 0x70, 0x51, 0x49, 0x78, 0x49, 0x52, 0x69, \n\t0x76, 0x68, 0x51, 0x42, 0x64, 0x2b, 0x6b, 0x6f, 0x67, 0x51, 0x76, 0x43, 0x49, 0x6f, 0x6f, 0x46, 0x4a, 0x38, \n\t0x4b, 0x39, 0x63, 0x48, 0x51, 0x46, 0x35, 0x2b, 0x6b, 0x62, 0x7a, 0x36, 0x55, 0x71, 0x6b, 0x47, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x42, 0x45, 0x56, 0x46, 0x30, 0x5a, 0x52, 0x61, 0x42, 0x6b, 0x78, 0x74, 0x4e, 0x5a, 0x4f, 0x6d, 0x6c, \n\t0x39, 0x77, 0x36, 0x6b, 0x30, 0x36, 0x61, 0x79, 0x58, 0x51, 0x6d, 0x35, 0x35, 0x79, 0x39, 0x74, 0x77, 0x2b, \n\t0x6e, 0x69, 0x58, 0x50, 0x4f, 0x6d, 0x57, 0x6c, 0x53, 0x4c, 0x61, 0x55, 0x2f, 0x7a, 0x4d, 0x75, 0x2f, 0x31, \n\t0x31, 0x72, 0x2f, 0x57, 0x6d, 0x66, 0x50, 0x33, 0x76, 0x2f, 0x57, 0x6c, 0x46, 0x4c, 0x63, 0x54, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x67, 0x33, 0x56, 0x65, 0x31, 0x57, 0x46, 0x6d, 0x77, 0x46, 0x33, 0x67, 0x61, 0x47, 0x67, 0x43, 0x79, \n\t0x67, 0x72, 0x76, 0x36, 0x79, 0x56, 0x37, 0x6b, 0x33, 0x67, 0x5a, 0x62, 0x56, 0x46, 0x4e, 0x4a, 0x57, 0x32, \n\t0x4d, 0x4d, 0x6b, 0x38, 0x43, 0x48, 0x77, 0x47, 0x71, 0x36, 0x4d, 0x4f, 0x4b, 0x63, 0x6d, 0x45, 0x65, 0x4d, \n\t0x35, 0x5a, 0x47, 0x34, 0x42, 0x4a, 0x53, 0x56, 0x36, 0x51, 0x78, 0x53, 0x7a, 0x6f, 0x78, 0x6c, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x61, 0x78, 0x74, 0x61, 0x6e, 0x57, 0x6b, 0x44, 0x68, 0x34, 0x44, 0x33, 0x67, 0x59, 0x58, 0x2f, 0x49, \n\t0x72, 0x67, 0x56, 0x2b, 0x45, 0x49, 0x74, 0x75, 0x68, 0x76, 0x4c, 0x58, 0x36, 0x65, 0x78, 0x42, 0x30, 0x61, \n\t0x51, 0x46, 0x30, 0x76, 0x56, 0x69, 0x7a, 0x54, 0x57, 0x59, 0x66, 0x58, 0x63, 0x54, 0x62, 0x52, 0x33, 0x4f, \n\t0x31, 0x71, 0x69, 0x62, 0x67, 0x78, 0x34, 0x42, 0x76, 0x6a, 0x7a, 0x65, 0x67, 0x53, 0x37, 0x67, 0x42, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x46, 0x31, 0x4f, 0x56, 0x55, 0x38, 0x63, 0x41, 0x67, 0x34, 0x75, 0x39, 0x38, 0x72, 0x61, 0x5a, \n\t0x38, 0x30, 0x4f, 0x39, 0x4d, 0x45, 0x48, 0x39, 0x72, 0x4e, 0x32, 0x5a, 0x6e, 0x61, 0x77, 0x37, 0x59, 0x42, \n\t0x5a, 0x78, 0x63, 0x6a, 0x57, 0x41, 0x43, 0x53, 0x49, 0x75, 0x4a, 0x66, 0x45, 0x66, 0x68, 0x76, 0x53, 0x39, \n\t0x52, 0x73, 0x2b, 0x56, 0x56, 0x69, 0x53, 0x30, 0x58, 0x6a, 0x4a, 0x6b, 0x6b, 0x39, 0x6a, 0x2b, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x75, 0x58, 0x6c, 0x74, 0x42, 0x72, 0x67, 0x66, 0x4b, 0x4b, 0x77, 0x6b, 0x2b, 0x4c, 0x45, 0x71, 0x4f, \n\t0x58, 0x32, 0x46, 0x64, 0x34, 0x38, 0x67, 0x52, 0x75, 0x64, 0x38, 0x33, 0x5a, 0x76, 0x33, 0x74, 0x71, 0x4b, \n\t0x6b, 0x67, 0x70, 0x4b, 0x44, 0x4b, 0x6a, 0x76, 0x49, 0x36, 0x51, 0x58, 0x6b, 0x2b, 0x55, 0x49, 0x77, 0x48, \n\t0x37, 0x30, 0x35, 0x53, 0x76, 0x4c, 0x67, 0x48, 0x76, 0x54, 0x47, 0x32, 0x45, 0x47, 0x38, 0x50, 0x31, 0x5c, 0x0a,\n\t0x09, 0x52, 0x4e, 0x77, 0x52, 0x62, 0x67, 0x66, 0x4f, 0x6e, 0x7a, 0x59, 0x35, 0x48, 0x79, 0x34, 0x64, 0x39, \n\t0x39, 0x52, 0x52, 0x6f, 0x4f, 0x37, 0x63, 0x46, 0x59, 0x64, 0x33, 0x75, 0x6f, 0x75, 0x4d, 0x77, 0x58, 0x4b, \n\t0x58, 0x37, 0x79, 0x48, 0x65, 0x36, 0x78, 0x53, 0x52, 0x39, 0x76, 0x39, 0x57, 0x77, 0x69, 0x76, 0x75, 0x39, \n\t0x78, 0x47, 0x39, 0x67, 0x41, 0x54, 0x43, 0x38, 0x33, 0x45, 0x38, 0x6a, 0x66, 0x71, 0x30, 0x70, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x50, 0x47, 0x72, 0x6b, 0x56, 0x42, 0x68, 0x5a, 0x62, 0x73, 0x41, 0x32, 0x4c, 0x39, 0x6c, 0x57, \n\t0x42, 0x77, 0x61, 0x77, 0x52, 0x37, 0x4f, 0x49, 0x43, 0x62, 0x79, 0x36, 0x45, 0x31, 0x78, 0x74, 0x4b, 0x51, \n\t0x56, 0x69, 0x6e, 0x65, 0x2b, 0x7a, 0x53, 0x42, 0x6e, 0x69, 0x78, 0x62, 0x77, 0x59, 0x69, 0x56, 0x76, 0x42, \n\t0x75, 0x4a, 0x36, 0x6e, 0x4a, 0x45, 0x4c, 0x71, 0x4c, 0x6e, 0x46, 0x73, 0x47, 0x44, 0x4a, 0x38, 0x51, 0x5c, 0x0a,\n\t0x09, 0x52, 0x2f, 0x2b, 0x41, 0x76, 0x6e, 0x70, 0x33, 0x50, 0x4c, 0x76, 0x42, 0x59, 0x78, 0x55, 0x49, 0x34, \n\t0x49, 0x78, 0x77, 0x75, 0x4a, 0x50, 0x5a, 0x79, 0x68, 0x76, 0x71, 0x66, 0x37, 0x53, 0x65, 0x42, 0x41, 0x72, \n\t0x51, 0x6d, 0x33, 0x75, 0x61, 0x65, 0x6e, 0x51, 0x73, 0x6b, 0x2b, 0x57, 0x41, 0x5a, 0x61, 0x39, 0x4e, 0x38, \n\t0x2b, 0x71, 0x34, 0x6b, 0x74, 0x51, 0x59, 0x7a, 0x6e, 0x41, 0x4c, 0x5a, 0x56, 0x63, 0x73, 0x45, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x55, 0x79, 0x70, 0x2f, 0x70, 0x57, 0x71, 0x79, 0x56, 0x75, 0x2b, 0x46, 0x4a, 0x76, 0x71, 0x65, 0x67, \n\t0x44, 0x35, 0x51, 0x4a, 0x52, 0x73, 0x78, 0x4e, 0x59, 0x65, 0x63, 0x6e, 0x4b, 0x4e, 0x38, 0x4e, 0x49, 0x30, \n\t0x34, 0x66, 0x53, 0x6d, 0x55, 0x49, 0x37, 0x4e, 0x46, 0x67, 0x46, 0x51, 0x6c, 0x46, 0x37, 0x72, 0x61, 0x61, \n\t0x6e, 0x57, 0x73, 0x79, 0x74, 0x34, 0x65, 0x69, 0x70, 0x6c, 0x35, 0x35, 0x47, 0x77, 0x52, 0x4c, 0x57, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x69, 0x64, 0x71, 0x7a, 0x42, 0x65, 0x6d, 0x51, 0x7a, 0x52, 0x74, 0x65, 0x61, 0x71, 0x6a, 0x6b, \n\t0x49, 0x47, 0x61, 0x4b, 0x43, 0x45, 0x2b, 0x62, 0x30, 0x35, 0x6d, 0x51, 0x71, 0x46, 0x41, 0x57, 0x6f, 0x67, \n\t0x6e, 0x63, 0x65, 0x79, 0x77, 0x4d, 0x6e, 0x73, 0x49, 0x2b, 0x65, 0x51, 0x6a, 0x4e, 0x30, 0x74, 0x48, 0x55, \n\t0x4a, 0x74, 0x4e, 0x76, 0x71, 0x6b, 0x58, 0x2f, 0x6b, 0x71, 0x75, 0x70, 0x70, 0x63, 0x51, 0x76, 0x41, 0x5c, 0x0a,\n\t0x09, 0x74, 0x78, 0x69, 0x63, 0x4d, 0x47, 0x32, 0x30, 0x4e, 0x56, 0x56, 0x4e, 0x64, 0x6b, 0x64, 0x6e, 0x41, \n\t0x4b, 0x6a, 0x62, 0x74, 0x51, 0x55, 0x74, 0x5a, 0x71, 0x4b, 0x45, 0x52, 0x49, 0x37, 0x50, 0x49, 0x39, 0x49, \n\t0x58, 0x55, 0x56, 0x55, 0x6d, 0x41, 0x54, 0x44, 0x61, 0x55, 0x77, 0x44, 0x70, 0x53, 0x69, 0x34, 0x34, 0x34, \n\t0x57, 0x44, 0x6b, 0x76, 0x67, 0x32, 0x37, 0x4e, 0x56, 0x4e, 0x48, 0x75, 0x66, 0x34, 0x69, 0x7a, 0x76, 0x5c, 0x0a,\n\t0x09, 0x63, 0x5a, 0x31, 0x4c, 0x50, 0x62, 0x4d, 0x54, 0x74, 0x62, 0x61, 0x4f, 0x68, 0x2f, 0x48, 0x76, 0x76, \n\t0x34, 0x47, 0x57, 0x53, 0x32, 0x41, 0x4b, 0x35, 0x45, 0x6e, 0x4c, 0x32, 0x45, 0x65, 0x33, 0x79, 0x61, 0x49, \n\t0x4b, 0x77, 0x64, 0x64, 0x77, 0x46, 0x38, 0x55, 0x38, 0x6b, 0x46, 0x44, 0x33, 0x34, 0x72, 0x63, 0x4c, 0x62, \n\t0x59, 0x50, 0x32, 0x54, 0x5a, 0x67, 0x35, 0x6c, 0x77, 0x78, 0x2f, 0x65, 0x6b, 0x69, 0x4c, 0x2f, 0x79, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x45, 0x5a, 0x37, 0x63, 0x32, 0x42, 0x38, 0x53, 0x66, 0x36, 0x35, 0x54, 0x33, 0x32, 0x55, 0x2b, \n\t0x63, 0x42, 0x61, 0x6b, 0x68, 0x2f, 0x30, 0x32, 0x73, 0x42, 0x36, 0x59, 0x4b, 0x62, 0x57, 0x68, 0x4e, 0x4e, \n\t0x41, 0x66, 0x2f, 0x53, 0x46, 0x6e, 0x57, 0x38, 0x34, 0x76, 0x35, 0x78, 0x44, 0x46, 0x52, 0x7a, 0x66, 0x6f, \n\t0x6a, 0x69, 0x5a, 0x59, 0x2f, 0x37, 0x31, 0x49, 0x78, 0x69, 0x62, 0x6d, 0x74, 0x44, 0x58, 0x4e, 0x36, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x6e, 0x45, 0x6d, 0x67, 0x52, 0x45, 0x7a, 0x46, 0x7a, 0x32, 0x52, 0x65, 0x6e, 0x6d, 0x54, 0x71, \n\t0x78, 0x6c, 0x33, 0x61, 0x43, 0x5a, 0x31, 0x63, 0x7a, 0x76, 0x72, 0x55, 0x71, 0x64, 0x32, 0x6b, 0x53, 0x4f, \n\t0x47, 0x45, 0x50, 0x6a, 0x32, 0x30, 0x73, 0x66, 0x6a, 0x51, 0x45, 0x38, 0x76, 0x72, 0x66, 0x50, 0x4e, 0x46, \n\t0x58, 0x48, 0x36, 0x4c, 0x2b, 0x71, 0x65, 0x34, 0x78, 0x76, 0x44, 0x50, 0x6f, 0x38, 0x38, 0x5a, 0x71, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x6c, 0x38, 0x41, 0x65, 0x71, 0x30, 0x48, 0x4f, 0x33, 0x4c, 0x78, 0x64, 0x78, 0x35, 0x44, 0x69, \n\t0x77, 0x55, 0x2f, 0x51, 0x6d, 0x31, 0x6f, 0x68, 0x72, 0x34, 0x6b, 0x6c, 0x73, 0x50, 0x7a, 0x78, 0x4a, 0x41, \n\t0x52, 0x58, 0x38, 0x75, 0x41, 0x75, 0x34, 0x41, 0x42, 0x63, 0x53, 0x48, 0x66, 0x63, 0x65, 0x57, 0x7a, 0x6e, \n\t0x33, 0x46, 0x2f, 0x6e, 0x62, 0x69, 0x6d, 0x6d, 0x4e, 0x48, 0x64, 0x54, 0x4f, 0x7a, 0x6c, 0x68, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x45, 0x37, 0x57, 0x7a, 0x4e, 0x41, 0x4c, 0x31, 0x57, 0x38, 0x63, 0x43, 0x56, 0x42, 0x38, 0x4c, 0x78, \n\t0x78, 0x50, 0x37, 0x42, 0x50, 0x6e, 0x4d, 0x6c, 0x61, 0x39, 0x76, 0x41, 0x59, 0x37, 0x6d, 0x67, 0x57, 0x6c, \n\t0x53, 0x2b, 0x42, 0x4b, 0x39, 0x42, 0x61, 0x6b, 0x68, 0x68, 0x74, 0x6a, 0x56, 0x67, 0x37, 0x32, 0x6a, 0x47, \n\t0x33, 0x33, 0x47, 0x45, 0x44, 0x2f, 0x58, 0x68, 0x50, 0x6b, 0x72, 0x42, 0x6e, 0x72, 0x56, 0x4a, 0x77, 0x5c, 0x0a,\n\t0x09, 0x43, 0x53, 0x33, 0x41, 0x58, 0x71, 0x41, 0x48, 0x62, 0x31, 0x2b, 0x57, 0x4c, 0x6f, 0x63, 0x63, 0x33, \n\t0x6a, 0x6b, 0x62, 0x42, 0x41, 0x35, 0x54, 0x59, 0x55, 0x50, 0x2f, 0x56, 0x2f, 0x43, 0x47, 0x34, 0x5a, 0x5a, \n\t0x39, 0x6c, 0x39, 0x34, 0x77, 0x2f, 0x41, 0x4d, 0x49, 0x41, 0x33, 0x6f, 0x4c, 0x52, 0x43, 0x47, 0x73, 0x51, \n\t0x77, 0x41, 0x41, 0x41, 0x41, 0x42, 0x4a, 0x52, 0x55, 0x35, 0x45, 0x72, 0x6b, 0x4a, 0x67, 0x67, 0x67, 0x5c, 0x0a,\n\t0x09, 0x3d, 0x3d, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x65, 0x40, 0x32, 0x78, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5b, 0x32, 0x5d, 0x2e, 0x65, 0x5f, 0x70, 0x6e, 0x67, 0x20, \n\t0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, \n\t0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x22, 0x2c, \n\t0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x44, 0x67, 0x41, 0x41, 0x41, 0x41, 0x34, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x43, 0x6f, 0x68, 0x6a, 0x73, 0x65, 0x41, 0x41, 0x41, 0x48, 0x32, 0x6b, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x6f, 0x67, 0x65, 0x32, 0x61, 0x65, 0x34, 0x78, 0x56, 0x52, 0x78, 0x33, 0x48, 0x50, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x50, 0x6e, 0x6e, 0x50, 0x76, 0x59, 0x65, 0x2f, 0x63, 0x75, 0x72, 0x31, 0x32, 0x57, 0x4c, 0x51, 0x75, \n\t0x37, 0x46, 0x42, 0x72, 0x59, 0x6c, 0x6c, 0x4a, 0x67, 0x43, 0x36, 0x56, 0x67, 0x54, 0x5a, 0x66, 0x47, 0x4b, \n\t0x71, 0x42, 0x4e, 0x61, 0x6b, 0x75, 0x30, 0x73, 0x53, 0x59, 0x6b, 0x62, 0x52, 0x71, 0x31, 0x47, 0x45, 0x68, \n\t0x4d, 0x6d, 0x76, 0x69, 0x49, 0x31, 0x75, 0x68, 0x2f, 0x59, 0x6a, 0x56, 0x67, 0x31, 0x4a, 0x54, 0x45, 0x5c, 0x0a,\n\t0x09, 0x70, 0x44, 0x57, 0x67, 0x52, 0x49, 0x6c, 0x61, 0x6a, 0x41, 0x47, 0x78, 0x4b, 0x4c, 0x55, 0x46, 0x41, \n\t0x57, 0x6c, 0x42, 0x33, 0x55, 0x49, 0x58, 0x6c, 0x76, 0x64, 0x6a, 0x57, 0x33, 0x62, 0x5a, 0x31, 0x33, 0x33, \n\t0x66, 0x63, 0x38, 0x59, 0x2f, 0x7a, 0x6a, 0x32, 0x58, 0x76, 0x62, 0x74, 0x37, 0x7a, 0x7a, 0x33, 0x6e, 0x37, \n\t0x71, 0x4b, 0x6c, 0x34, 0x5a, 0x74, 0x73, 0x4d, 0x72, 0x38, 0x35, 0x76, 0x35, 0x6e, 0x35, 0x66, 0x65, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x73, 0x7a, 0x50, 0x7a, 0x6d, 0x39, 0x78, 0x75, 0x68, 0x6c, 0x4f, 0x4b, 0x6a, 0x44, 0x50, 0x6e, \n\t0x2f, 0x4e, 0x75, 0x42, 0x6d, 0x34, 0x7a, 0x62, 0x42, 0x57, 0x78, 0x32, 0x33, 0x43, 0x64, 0x37, 0x71, 0x30, \n\t0x47, 0x39, 0x53, 0x76, 0x7a, 0x48, 0x67, 0x45, 0x57, 0x41, 0x35, 0x73, 0x41, 0x43, 0x34, 0x45, 0x35, 0x67, \n\t0x4b, 0x68, 0x50, 0x50, 0x66, 0x4d, 0x38, 0x42, 0x46, 0x34, 0x42, 0x78, 0x77, 0x42, 0x44, 0x67, 0x49, 0x5c, 0x0a,\n\t0x09, 0x37, 0x41, 0x58, 0x36, 0x78, 0x39, 0x30, 0x53, 0x70, 0x64, 0x52, 0x34, 0x2f, 0x65, 0x6c, 0x4b, 0x71, \n\t0x63, 0x65, 0x55, 0x55, 0x71, 0x38, 0x70, 0x70, 0x62, 0x4c, 0x4b, 0x50, 0x39, 0x4c, 0x35, 0x74, 0x70, 0x39, \n\t0x57, 0x53, 0x73, 0x6e, 0x78, 0x73, 0x6b, 0x75, 0x4d, 0x77, 0x7a, 0x6b, 0x6f, 0x67, 0x62, 0x58, 0x41, 0x39, \n\t0x37, 0x42, 0x6e, 0x61, 0x6c, 0x52, 0x59, 0x66, 0x55, 0x6c, 0x55, 0x4b, 0x67, 0x75, 0x41, 0x30, 0x43, 0x5c, 0x0a,\n\t0x09, 0x57, 0x79, 0x70, 0x67, 0x72, 0x30, 0x6b, 0x69, 0x75, 0x6b, 0x41, 0x2f, 0x67, 0x32, 0x38, 0x43, 0x74, \n\t0x67, 0x54, 0x41, 0x61, 0x4f, 0x6c, 0x57, 0x41, 0x4c, 0x38, 0x44, 0x4c, 0x77, 0x34, 0x4e, 0x42, 0x4b, 0x6c, \n\t0x63, 0x79, 0x51, 0x50, 0x58, 0x36, 0x42, 0x37, 0x4c, 0x45, 0x4c, 0x6d, 0x4b, 0x65, 0x75, 0x59, 0x5a, 0x33, \n\t0x71, 0x52, 0x57, 0x58, 0x4e, 0x34, 0x6f, 0x45, 0x31, 0x69, 0x57, 0x69, 0x4d, 0x6f, 0x73, 0x32, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x67, 0x74, 0x48, 0x53, 0x67, 0x4e, 0x48, 0x61, 0x6a, 0x4a, 0x78, 0x51, 0x4e, 0x62, 0x7a, 0x2f, 0x66, \n\t0x77, 0x44, 0x72, 0x67, 0x48, 0x63, 0x72, 0x4e, 0x58, 0x41, 0x73, 0x42, 0x4a, 0x38, 0x42, 0x74, 0x67, 0x42, \n\t0x42, 0x70, 0x38, 0x4b, 0x38, 0x33, 0x45, 0x74, 0x71, 0x31, 0x7a, 0x74, 0x6b, 0x39, 0x33, 0x57, 0x69, 0x42, \n\t0x72, 0x50, 0x2b, 0x65, 0x70, 0x4d, 0x43, 0x59, 0x33, 0x6b, 0x6a, 0x77, 0x64, 0x58, 0x7a, 0x4d, 0x65, 0x5c, 0x0a,\n\t0x09, 0x36, 0x65, 0x50, 0x76, 0x52, 0x4c, 0x43, 0x74, 0x67, 0x41, 0x2f, 0x4c, 0x77, 0x53, 0x49, 0x79, 0x73, \n\t0x68, 0x4b, 0x49, 0x44, 0x4e, 0x77, 0x46, 0x65, 0x63, 0x43, 0x71, 0x73, 0x76, 0x53, 0x58, 0x4c, 0x62, 0x41, \n\t0x62, 0x4b, 0x37, 0x54, 0x36, 0x4e, 0x4d, 0x71, 0x78, 0x49, 0x37, 0x69, 0x71, 0x41, 0x76, 0x61, 0x61, 0x44, \n\t0x71, 0x36, 0x51, 0x66, 0x51, 0x6d, 0x6d, 0x71, 0x48, 0x56, 0x6d, 0x38, 0x47, 0x4e, 0x67, 0x4c, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x36, 0x4b, 0x31, 0x4b, 0x47, 0x4f, 0x75, 0x54, 0x6f, 0x41, 0x61, 0x38, 0x41, 0x6a, 0x7a, 0x6c, 0x56, \n\t0x47, 0x51, 0x4f, 0x64, 0x35, 0x4c, 0x34, 0x79, 0x52, 0x75, 0x6f, 0x37, 0x70, 0x53, 0x66, 0x66, 0x73, 0x6f, \n\t0x62, 0x5a, 0x6d, 0x67, 0x45, 0x6e, 0x31, 0x35, 0x49, 0x2b, 0x44, 0x4d, 0x4c, 0x51, 0x53, 0x75, 0x73, 0x31, \n\t0x57, 0x33, 0x41, 0x46, 0x2f, 0x43, 0x78, 0x4c, 0x76, 0x30, 0x53, 0x33, 0x41, 0x77, 0x38, 0x37, 0x77, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x4a, 0x48, 0x59, 0x64, 0x49, 0x76, 0x66, 0x71, 0x32, 0x6e, 0x2f, 0x61, 0x2b, 0x59, 0x54, 0x77, \n\t0x30, 0x67, 0x38, 0x6a, 0x7a, 0x4b, 0x78, 0x48, 0x68, 0x67, 0x46, 0x4f, 0x31, 0x42, 0x56, 0x6a, 0x76, 0x74, \n\t0x62, 0x30, 0x66, 0x67, 0x73, 0x38, 0x42, 0x50, 0x77, 0x4e, 0x41, 0x4b, 0x65, 0x4a, 0x62, 0x39, 0x35, 0x50, \n\t0x35, 0x77, 0x77, 0x6b, 0x66, 0x70, 0x6c, 0x59, 0x4f, 0x37, 0x64, 0x34, 0x36, 0x71, 0x72, 0x2b, 0x35, 0x5c, 0x0a,\n\t0x09, 0x65, 0x69, 0x6a, 0x4a, 0x5a, 0x34, 0x47, 0x74, 0x58, 0x74, 0x70, 0x36, 0x4a, 0x54, 0x67, 0x50, 0x4f, \n\t0x41, 0x71, 0x45, 0x41, 0x42, 0x4c, 0x62, 0x44, 0x35, 0x44, 0x65, 0x64, 0x72, 0x77, 0x43, 0x55, 0x79, 0x75, \n\t0x48, 0x66, 0x76, 0x38, 0x30, 0x71, 0x72, 0x2b, 0x2b, 0x78, 0x6a, 0x6c, 0x61, 0x30, 0x73, 0x41, 0x69, 0x6f, \n\t0x4c, 0x31, 0x63, 0x4f, 0x79, 0x2b, 0x75, 0x6d, 0x67, 0x42, 0x2b, 0x51, 0x5a, 0x35, 0x63, 0x35, 0x73, 0x5c, 0x0a,\n\t0x09, 0x32, 0x4f, 0x2f, 0x7a, 0x6b, 0x35, 0x67, 0x4e, 0x7a, 0x68, 0x4b, 0x79, 0x52, 0x65, 0x66, 0x64, 0x4d, \n\t0x52, 0x67, 0x39, 0x6a, 0x48, 0x55, 0x31, 0x6e, 0x37, 0x76, 0x62, 0x68, 0x71, 0x6e, 0x77, 0x65, 0x57, 0x41, \n\t0x6c, 0x67, 0x66, 0x44, 0x4a, 0x44, 0x34, 0x36, 0x64, 0x2f, 0x64, 0x74, 0x59, 0x55, 0x67, 0x2b, 0x45, 0x51, \n\t0x4c, 0x78, 0x76, 0x78, 0x47, 0x4d, 0x44, 0x53, 0x77, 0x4c, 0x46, 0x51, 0x79, 0x43, 0x7a, 0x6b, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x63, 0x6c, 0x68, 0x39, 0x53, 0x65, 0x78, 0x75, 0x67, 0x64, 0x52, 0x33, 0x58, 0x48, 0x4d, 0x4d, \n\t0x39, 0x65, 0x78, 0x4c, 0x67, 0x78, 0x34, 0x4d, 0x4d, 0x46, 0x47, 0x65, 0x6d, 0x63, 0x37, 0x78, 0x73, 0x49, \n\t0x5a, 0x47, 0x50, 0x66, 0x4e, 0x42, 0x50, 0x76, 0x73, 0x58, 0x59, 0x76, 0x74, 0x44, 0x4a, 0x51, 0x32, 0x70, \n\t0x38, 0x79, 0x2f, 0x71, 0x41, 0x52, 0x4f, 0x41, 0x72, 0x4d, 0x42, 0x42, 0x6c, 0x2f, 0x61, 0x54, 0x66, 0x5c, 0x0a,\n\t0x09, 0x62, 0x31, 0x73, 0x36, 0x35, 0x47, 0x47, 0x43, 0x73, 0x61, 0x69, 0x62, 0x36, 0x77, 0x79, 0x72, 0x50, \n\t0x52, 0x31, 0x76, 0x55, 0x34, 0x75, 0x52, 0x4e, 0x58, 0x53, 0x4f, 0x33, 0x34, 0x4a, 0x2b, 0x61, 0x70, 0x33, \n\t0x72, 0x4c, 0x36, 0x63, 0x6e, 0x71, 0x55, 0x32, 0x41, 0x2f, 0x58, 0x49, 0x73, 0x49, 0x47, 0x77, 0x43, 0x6e, \n\t0x73, 0x35, 0x5a, 0x4e, 0x7a, 0x49, 0x2b, 0x43, 0x47, 0x4e, 0x65, 0x54, 0x4a, 0x35, 0x64, 0x36, 0x37, 0x5c, 0x0a,\n\t0x09, 0x55, 0x70, 0x59, 0x63, 0x67, 0x4c, 0x46, 0x30, 0x56, 0x6c, 0x6d, 0x64, 0x49, 0x67, 0x4d, 0x6d, 0x52, \n\t0x67, 0x67, 0x73, 0x6d, 0x30, 0x31, 0x6b, 0x77, 0x30, 0x70, 0x50, 0x2b, 0x74, 0x62, 0x46, 0x51, 0x64, 0x4a, \n\t0x37, 0x2f, 0x2b, 0x4f, 0x49, 0x73, 0x34, 0x48, 0x56, 0x72, 0x76, 0x32, 0x58, 0x36, 0x65, 0x39, 0x5a, 0x70, \n\t0x35, 0x44, 0x61, 0x35, 0x57, 0x33, 0x64, 0x57, 0x54, 0x32, 0x44, 0x6e, 0x76, 0x53, 0x47, 0x51, 0x30, 0x5c, 0x0a,\n\t0x09, 0x52, 0x43, 0x6e, 0x6e, 0x58, 0x54, 0x76, 0x2f, 0x38, 0x58, 0x35, 0x41, 0x6f, 0x4f, 0x78, 0x54, 0x4e, \n\t0x75, 0x75, 0x6d, 0x35, 0x72, 0x73, 0x41, 0x62, 0x34, 0x42, 0x49, 0x44, 0x56, 0x48, 0x53, 0x65, 0x33, 0x2f, \n\t0x37, 0x79, 0x6e, 0x77, 0x56, 0x56, 0x2f, 0x73, 0x6b, 0x68, 0x4f, 0x2f, 0x65, 0x6b, 0x34, 0x36, 0x64, 0x38, \n\t0x65, 0x41, 0x30, 0x4d, 0x69, 0x71, 0x6f, 0x4f, 0x49, 0x6d, 0x68, 0x42, 0x79, 0x53, 0x67, 0x54, 0x74, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x6f, 0x6e, 0x6f, 0x64, 0x30, 0x31, 0x46, 0x62, 0x36, 0x35, 0x44, 0x4b, 0x55, 0x56, 0x79, 0x35, \n\t0x78, 0x46, 0x50, 0x2f, 0x51, 0x4e, 0x59, 0x58, 0x51, 0x6b, 0x79, 0x52, 0x38, 0x38, 0x51, 0x57, 0x48, 0x49, \n\t0x6e, 0x77, 0x4b, 0x50, 0x59, 0x31, 0x37, 0x4e, 0x52, 0x72, 0x31, 0x70, 0x75, 0x42, 0x46, 0x63, 0x43, 0x41, \n\t0x62, 0x43, 0x39, 0x46, 0x63, 0x38, 0x75, 0x32, 0x50, 0x41, 0x6c, 0x62, 0x56, 0x70, 0x59, 0x58, 0x59, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x38, 0x4d, 0x48, 0x4a, 0x32, 0x68, 0x53, 0x5a, 0x42, 0x46, 0x36, 0x69, 0x30, 0x4c, 0x77, 0x2b, \n\t0x4d, 0x7a, 0x49, 0x46, 0x4f, 0x68, 0x36, 0x43, 0x42, 0x66, 0x66, 0x66, 0x63, 0x4f, 0x5a, 0x71, 0x65, 0x32, \n\t0x37, 0x2f, 0x6f, 0x4d, 0x71, 0x65, 0x51, 0x66, 0x64, 0x76, 0x62, 0x37, 0x46, 0x55, 0x43, 0x5a, 0x56, 0x71, \n\t0x2b, 0x79, 0x51, 0x48, 0x6b, 0x6a, 0x6c, 0x79, 0x43, 0x47, 0x7a, 0x2f, 0x36, 0x67, 0x36, 0x58, 0x30, 0x5c, 0x0a,\n\t0x09, 0x33, 0x41, 0x67, 0x75, 0x64, 0x67, 0x72, 0x6d, 0x79, 0x57, 0x75, 0x65, 0x42, 0x38, 0x37, 0x76, 0x62, \n\t0x67, 0x57, 0x6f, 0x6a, 0x48, 0x2f, 0x6a, 0x76, 0x55, 0x44, 0x31, 0x70, 0x6a, 0x47, 0x76, 0x39, 0x6a, 0x6e, \n\t0x69, 0x66, 0x61, 0x58, 0x30, 0x33, 0x41, 0x6a, 0x4f, 0x42, 0x4c, 0x42, 0x36, 0x34, 0x76, 0x34, 0x63, 0x61, \n\t0x56, 0x48, 0x63, 0x70, 0x5a, 0x77, 0x51, 0x52, 0x70, 0x73, 0x37, 0x47, 0x64, 0x6b, 0x55, 0x51, 0x31, 0x5c, 0x0a,\n\t0x09, 0x53, 0x4e, 0x62, 0x34, 0x54, 0x45, 0x50, 0x46, 0x66, 0x34, 0x34, 0x55, 0x74, 0x65, 0x74, 0x4e, 0x31, \n\t0x47, 0x6e, 0x41, 0x35, 0x67, 0x64, 0x58, 0x73, 0x2f, 0x69, 0x41, 0x45, 0x49, 0x61, 0x45, 0x56, 0x69, 0x73, \n\t0x4b, 0x32, 0x46, 0x59, 0x46, 0x74, 0x4c, 0x51, 0x56, 0x59, 0x44, 0x4b, 0x63, 0x77, 0x50, 0x2b, 0x72, 0x45, \n\t0x75, 0x39, 0x32, 0x4a, 0x65, 0x37, 0x73, 0x57, 0x38, 0x32, 0x6f, 0x64, 0x31, 0x71, 0x52, 0x2f, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x52, 0x44, 0x64, 0x59, 0x2f, 0x71, 0x35, 0x75, 0x56, 0x6b, 0x2f, 0x63, 0x4b, 0x55, 0x34, 0x74, 0x70, \n\t0x65, 0x4e, 0x47, 0x4d, 0x41, 0x41, 0x55, 0x77, 0x67, 0x78, 0x65, 0x49, 0x51, 0x7a, 0x4e, 0x2f, 0x58, 0x74, \n\t0x31, 0x43, 0x4c, 0x30, 0x36, 0x42, 0x4c, 0x50, 0x71, 0x69, 0x75, 0x6f, 0x7a, 0x68, 0x7a, 0x75, 0x4a, 0x66, \n\t0x2f, 0x66, 0x50, 0x76, 0x73, 0x5a, 0x53, 0x38, 0x62, 0x52, 0x54, 0x44, 0x4a, 0x66, 0x53, 0x4b, 0x65, 0x5c, 0x0a,\n\t0x09, 0x76, 0x4c, 0x71, 0x61, 0x51, 0x2f, 0x67, 0x73, 0x4e, 0x44, 0x45, 0x31, 0x35, 0x68, 0x4c, 0x4a, 0x68, \n\t0x52, 0x55, 0x62, 0x74, 0x79, 0x63, 0x4a, 0x76, 0x42, 0x4a, 0x42, 0x41, 0x57, 0x56, 0x51, 0x45, 0x58, 0x6c, \n\t0x5a, 0x46, 0x51, 0x71, 0x55, 0x79, 0x52, 0x6e, 0x44, 0x74, 0x7a, 0x44, 0x66, 0x4e, 0x30, 0x46, 0x79, 0x49, \n\t0x53, 0x52, 0x45, 0x36, 0x73, 0x51, 0x6b, 0x36, 0x75, 0x52, 0x74, 0x5a, 0x57, 0x6a, 0x32, 0x69, 0x58, 0x5c, 0x0a,\n\t0x09, 0x65, 0x61, 0x76, 0x44, 0x31, 0x7a, 0x67, 0x41, 0x79, 0x4d, 0x4c, 0x38, 0x5a, 0x45, 0x71, 0x70, 0x75, \n\t0x42, 0x48, 0x73, 0x41, 0x70, 0x70, 0x6b, 0x7a, 0x59, 0x68, 0x41, 0x6b, 0x43, 0x74, 0x55, 0x66, 0x2f, 0x47, \n\t0x47, 0x5a, 0x4c, 0x33, 0x66, 0x52, 0x2b, 0x4c, 0x48, 0x78, 0x51, 0x36, 0x36, 0x43, 0x4f, 0x76, 0x49, 0x47, \n\t0x54, 0x46, 0x6b, 0x66, 0x54, 0x57, 0x79, 0x4e, 0x6f, 0x72, 0x56, 0x6e, 0x79, 0x4b, 0x33, 0x37, 0x36, 0x5c, 0x0a,\n\t0x09, 0x79, 0x76, 0x63, 0x51, 0x44, 0x6b, 0x78, 0x49, 0x4a, 0x74, 0x46, 0x30, 0x76, 0x70, 0x75, 0x42, 0x45, \n\t0x38, 0x44, 0x54, 0x54, 0x4a, 0x75, 0x68, 0x68, 0x43, 0x6b, 0x35, 0x34, 0x50, 0x65, 0x75, 0x74, 0x71, 0x38, \n\t0x61, 0x59, 0x30, 0x4c, 0x4b, 0x34, 0x43, 0x67, 0x45, 0x72, 0x6d, 0x4d, 0x45, 0x2f, 0x32, 0x59, 0x4a, 0x37, \n\t0x73, 0x38, 0x64, 0x52, 0x6e, 0x4b, 0x63, 0x69, 0x36, 0x6d, 0x46, 0x4d, 0x38, 0x56, 0x31, 0x4c, 0x48, 0x5c, 0x0a,\n\t0x09, 0x70, 0x66, 0x30, 0x78, 0x41, 0x42, 0x48, 0x55, 0x6b, 0x62, 0x4e, 0x71, 0x50, 0x41, 0x39, 0x71, 0x76, \n\t0x74, 0x63, 0x39, 0x39, 0x41, 0x42, 0x47, 0x6d, 0x78, 0x70, 0x44, 0x57, 0x31, 0x44, 0x6e, 0x30, 0x71, 0x4a, \n\t0x43, 0x43, 0x49, 0x46, 0x2b, 0x59, 0x36, 0x4d, 0x71, 0x36, 0x65, 0x65, 0x35, 0x45, 0x53, 0x7a, 0x63, 0x4c, \n\t0x72, 0x56, 0x37, 0x36, 0x6a, 0x32, 0x50, 0x71, 0x2f, 0x72, 0x74, 0x6d, 0x4f, 0x68, 0x51, 0x52, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x37, 0x38, 0x4d, 0x4c, 0x49, 0x68, 0x34, 0x72, 0x6b, 0x50, 0x4c, 0x39, 0x44, 0x6d, 0x54, 0x6b, 0x4a, \n\t0x45, 0x43, 0x78, 0x48, 0x4c, 0x67, 0x36, 0x58, 0x30, 0x33, 0x41, 0x6a, 0x75, 0x42, 0x62, 0x49, 0x41, 0x67, \n\t0x64, 0x59, 0x6d, 0x58, 0x34, 0x4f, 0x6e, 0x2f, 0x31, 0x49, 0x63, 0x70, 0x39, 0x55, 0x61, 0x4a, 0x68, 0x44, \n\t0x62, 0x39, 0x43, 0x53, 0x68, 0x64, 0x59, 0x76, 0x52, 0x57, 0x71, 0x61, 0x55, 0x50, 0x55, 0x71, 0x38, 0x5c, 0x0a,\n\t0x09, 0x77, 0x47, 0x69, 0x64, 0x36, 0x52, 0x51, 0x7a, 0x65, 0x56, 0x74, 0x48, 0x68, 0x64, 0x73, 0x61, 0x37, \n\t0x41, 0x64, 0x32, 0x41, 0x32, 0x75, 0x4d, 0x75, 0x36, 0x63, 0x6a, 0x47, 0x79, 0x4a, 0x59, 0x6c, 0x2b, 0x4d, \n\t0x75, 0x36, 0x6a, 0x65, 0x51, 0x33, 0x58, 0x2b, 0x65, 0x7a, 0x45, 0x4f, 0x64, 0x42, 0x4a, 0x62, 0x63, 0x75, \n\t0x42, 0x75, 0x4b, 0x61, 0x4a, 0x44, 0x77, 0x34, 0x36, 0x32, 0x45, 0x48, 0x32, 0x2b, 0x46, 0x6e, 0x49, 0x5c, 0x0a,\n\t0x09, 0x58, 0x56, 0x6c, 0x30, 0x41, 0x4e, 0x4a, 0x43, 0x46, 0x2f, 0x34, 0x54, 0x5a, 0x37, 0x34, 0x71, 0x52, \n\t0x2b, 0x64, 0x77, 0x7a, 0x7a, 0x6e, 0x61, 0x37, 0x79, 0x41, 0x77, 0x68, 0x42, 0x34, 0x47, 0x4e, 0x33, 0x4f, \n\t0x64, 0x49, 0x65, 0x58, 0x4a, 0x49, 0x32, 0x35, 0x63, 0x35, 0x42, 0x4f, 0x33, 0x4b, 0x6c, 0x53, 0x51, 0x4b, \n\t0x50, 0x7a, 0x69, 0x73, 0x2f, 0x73, 0x41, 0x4f, 0x6c, 0x53, 0x47, 0x7a, 0x61, 0x52, 0x2b, 0x62, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x32, 0x64, 0x47, 0x2f, 0x36, 0x78, 0x49, 0x35, 0x4f, 0x59, 0x72, 0x57, 0x56, 0x49, 0x76, 0x57, 0x58, \n\t0x49, 0x66, 0x57, 0x58, 0x45, 0x64, 0x67, 0x63, 0x54, 0x50, 0x52, 0x39, 0x64, 0x34, 0x75, 0x76, 0x63, 0x61, \n\t0x4b, 0x52, 0x72, 0x52, 0x70, 0x68, 0x58, 0x33, 0x68, 0x5a, 0x54, 0x66, 0x64, 0x63, 0x67, 0x54, 0x2f, 0x69, \n\t0x42, 0x30, 0x57, 0x49, 0x50, 0x54, 0x4a, 0x2b, 0x63, 0x69, 0x36, 0x6b, 0x67, 0x37, 0x44, 0x43, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x68, 0x45, 0x6a, 0x76, 0x68, 0x33, 0x39, 0x6a, 0x43, 0x34, 0x65, 0x53, 0x2f, 0x6d, 0x42, 0x57, 0x2b, \n\t0x37, 0x35, 0x5a, 0x41, 0x31, 0x35, 0x61, 0x49, 0x6b, 0x43, 0x48, 0x31, 0x32, 0x6b, 0x53, 0x4e, 0x31, 0x41, \n\t0x4c, 0x74, 0x63, 0x31, 0x54, 0x32, 0x45, 0x44, 0x54, 0x38, 0x48, 0x62, 0x41, 0x64, 0x49, 0x2f, 0x2f, 0x56, \n\t0x64, 0x45, 0x70, 0x76, 0x32, 0x6c, 0x7a, 0x64, 0x69, 0x46, 0x47, 0x68, 0x7a, 0x4a, 0x71, 0x4c, 0x66, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x77, 0x32, 0x74, 0x75, 0x52, 0x61, 0x74, 0x76, 0x67, 0x59, 0x35, 0x49, 0x59, 0x4b, 0x6f, 0x43, \n\t0x6f, 0x41, 0x75, 0x45, 0x65, 0x45, 0x41, 0x61, 0x6a, 0x42, 0x4e, 0x59, 0x76, 0x76, 0x42, 0x73, 0x72, 0x48, \n\t0x57, 0x77, 0x4b, 0x6f, 0x35, 0x52, 0x4c, 0x37, 0x55, 0x35, 0x6f, 0x68, 0x50, 0x4f, 0x62, 0x61, 0x56, 0x67, \n\t0x68, 0x65, 0x43, 0x45, 0x6e, 0x69, 0x44, 0x2f, 0x4a, 0x31, 0x72, 0x34, 0x50, 0x75, 0x37, 0x79, 0x42, 0x5c, 0x0a,\n\t0x09, 0x32, 0x38, 0x35, 0x49, 0x58, 0x54, 0x75, 0x45, 0x4d, 0x32, 0x52, 0x49, 0x6a, 0x39, 0x34, 0x41, 0x6c, \n\t0x45, 0x64, 0x51, 0x6a, 0x73, 0x7a, 0x4e, 0x4d, 0x79, 0x79, 0x6f, 0x54, 0x78, 0x76, 0x63, 0x52, 0x46, 0x4c, \n\t0x65, 0x7a, 0x59, 0x54, 0x42, 0x6f, 0x67, 0x75, 0x6e, 0x34, 0x6c, 0x38, 0x6f, 0x37, 0x6f, 0x47, 0x45, 0x33, \n\t0x31, 0x44, 0x78, 0x48, 0x55, 0x69, 0x47, 0x78, 0x73, 0x63, 0x38, 0x69, 0x6c, 0x73, 0x4e, 0x4e, 0x71, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x6d, 0x62, 0x48, 0x43, 0x39, 0x72, 0x4a, 0x35, 0x79, 0x52, 0x45, 0x4c, 0x45, 0x7a, 0x30, 0x47, \n\t0x35, 0x39, 0x43, 0x54, 0x50, 0x49, 0x65, 0x4a, 0x42, 0x6f, 0x7a, 0x70, 0x4b, 0x42, 0x71, 0x34, 0x38, 0x66, \n\t0x52, 0x35, 0x7a, 0x59, 0x34, 0x4e, 0x52, 0x76, 0x77, 0x6d, 0x44, 0x50, 0x30, 0x38, 0x77, 0x68, 0x68, 0x4b, \n\t0x33, 0x62, 0x69, 0x41, 0x36, 0x31, 0x78, 0x45, 0x74, 0x55, 0x76, 0x72, 0x76, 0x4b, 0x31, 0x36, 0x56, 0x5c, 0x0a,\n\t0x09, 0x51, 0x4b, 0x6f, 0x55, 0x73, 0x69, 0x4c, 0x7a, 0x78, 0x4d, 0x59, 0x50, 0x6b, 0x63, 0x70, 0x32, 0x6f, \n\t0x7a, 0x50, 0x6e, 0x4b, 0x46, 0x66, 0x72, 0x4e, 0x4c, 0x41, 0x76, 0x67, 0x6c, 0x2b, 0x66, 0x53, 0x5a, 0x39, \n\t0x66, 0x34, 0x41, 0x67, 0x35, 0x76, 0x32, 0x59, 0x4c, 0x5a, 0x37, 0x44, 0x32, 0x6e, 0x34, 0x67, 0x61, 0x77, \n\t0x4c, 0x45, 0x2f, 0x6e, 0x61, 0x49, 0x2b, 0x6a, 0x7a, 0x43, 0x6a, 0x4f, 0x33, 0x44, 0x66, 0x67, 0x69, 0x5c, 0x0a,\n\t0x09, 0x50, 0x6e, 0x4b, 0x45, 0x6c, 0x53, 0x52, 0x41, 0x4e, 0x65, 0x41, 0x6c, 0x6e, 0x42, 0x52, 0x57, 0x31, \n\t0x69, 0x54, 0x78, 0x6d, 0x30, 0x4e, 0x6b, 0x64, 0x76, 0x77, 0x62, 0x6c, 0x52, 0x74, 0x37, 0x38, 0x74, 0x4f, \n\t0x42, 0x30, 0x64, 0x5a, 0x4d, 0x31, 0x62, 0x6f, 0x56, 0x51, 0x39, 0x50, 0x61, 0x57, 0x34, 0x43, 0x76, 0x34, \n\t0x6a, 0x4e, 0x6e, 0x50, 0x35, 0x59, 0x55, 0x39, 0x6e, 0x50, 0x41, 0x6a, 0x38, 0x67, 0x6e, 0x5a, 0x63, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x4c, 0x76, 0x53, 0x52, 0x2f, 0x66, 0x59, 0x6a, 0x63, 0x33, 0x38, 0x36, 0x4e, 0x4b, 0x63, 0x75, \n\t0x72, 0x4c, 0x36, 0x6f, 0x6e, 0x39, 0x4f, 0x52, 0x69, 0x6a, 0x48, 0x73, 0x4b, 0x61, 0x65, 0x77, 0x30, 0x39, \n\t0x76, 0x72, 0x33, 0x6c, 0x43, 0x34, 0x62, 0x6a, 0x72, 0x45, 0x2b, 0x51, 0x70, 0x69, 0x48, 0x6e, 0x58, 0x6c, \n\t0x61, 0x36, 0x6c, 0x52, 0x59, 0x58, 0x66, 0x32, 0x6b, 0x58, 0x32, 0x38, 0x6e, 0x65, 0x2f, 0x67, 0x38, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x73, 0x64, 0x31, 0x54, 0x35, 0x33, 0x49, 0x2b, 0x69, 0x72, 0x30, 0x2b, 0x78, 0x73, 0x4a, 0x74, \n\t0x73, 0x31, 0x46, 0x6e, 0x31, 0x33, 0x6b, 0x32, 0x4c, 0x2b, 0x46, 0x76, 0x59, 0x4f, 0x58, 0x54, 0x5a, 0x4f, \n\t0x56, 0x77, 0x6e, 0x67, 0x38, 0x49, 0x78, 0x48, 0x59, 0x7a, 0x73, 0x43, 0x4c, 0x77, 0x4a, 0x79, 0x68, 0x48, \n\t0x36, 0x78, 0x72, 0x67, 0x2b, 0x51, 0x36, 0x72, 0x6d, 0x4a, 0x65, 0x75, 0x6f, 0x37, 0x56, 0x50, 0x51, 0x5c, 0x0a,\n\t0x09, 0x68, 0x5a, 0x45, 0x35, 0x58, 0x4b, 0x49, 0x53, 0x49, 0x42, 0x52, 0x43, 0x78, 0x6b, 0x52, 0x37, 0x65, \n\t0x62, 0x61, 0x39, 0x46, 0x6d, 0x54, 0x41, 0x59, 0x68, 0x68, 0x6a, 0x59, 0x39, 0x42, 0x58, 0x77, 0x4c, 0x32, \n\t0x49, 0x46, 0x39, 0x54, 0x46, 0x57, 0x4f, 0x63, 0x58, 0x77, 0x49, 0x4a, 0x50, 0x4f, 0x50, 0x65, 0x46, 0x37, \n\t0x4c, 0x50, 0x2b, 0x72, 0x78, 0x69, 0x30, 0x79, 0x2b, 0x37, 0x57, 0x50, 0x4b, 0x66, 0x6c, 0x54, 0x30, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x58, 0x6b, 0x49, 0x4e, 0x42, 0x71, 0x63, 0x70, 0x31, 0x77, 0x50, 0x41, 0x4b, 0x33, 0x59, 0x4d, \n\t0x64, 0x62, 0x70, 0x35, 0x43, 0x4e, 0x31, 0x32, 0x50, 0x47, 0x65, 0x4c, 0x75, 0x79, 0x6f, 0x77, 0x54, 0x48, \n\t0x73, 0x75, 0x2b, 0x64, 0x4e, 0x65, 0x63, 0x70, 0x31, 0x73, 0x77, 0x68, 0x2b, 0x61, 0x50, 0x43, 0x52, 0x66, \n\t0x32, 0x31, 0x34, 0x6d, 0x2b, 0x43, 0x74, 0x6a, 0x74, 0x73, 0x45, 0x62, 0x33, 0x58, 0x38, 0x46, 0x35, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x74, 0x37, 0x47, 0x4b, 0x69, 0x35, 0x67, 0x49, 0x45, 0x41, 0x41, 0x41, 0x41, 0x41, 0x45, 0x6c, \n\t0x46, 0x54, 0x6b, 0x53, 0x75, 0x51, 0x6d, 0x43, 0x43, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x67, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5b, 0x31, 0x5d, 0x2e, 0x67, 0x5f, 0x70, 0x6e, 0x67, 0x20, \n\t0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, \n\t0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x22, 0x2c, \n\t0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x42, 0x77, 0x41, 0x41, 0x41, 0x41, 0x63, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x42, 0x79, 0x44, 0x64, 0x2b, 0x55, 0x41, 0x41, 0x41, 0x44, 0x76, 0x45, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x49, 0x69, 0x64, 0x57, 0x57, 0x54, 0x55, 0x78, 0x63, 0x56, 0x52, 0x54, 0x48, 0x66, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x64, 0x39, 0x44, 0x63, 0x77, 0x4d, 0x30, 0x30, 0x46, 0x6f, 0x6d, 0x59, 0x59, 0x41, 0x51, 0x39, 0x75, \n\t0x68, 0x62, 0x64, 0x49, 0x55, 0x55, 0x57, 0x4e, 0x72, 0x6d, 0x74, 0x71, 0x41, 0x32, 0x70, 0x67, 0x75, 0x71, \n\t0x6b, 0x33, 0x55, 0x42, 0x59, 0x70, 0x31, 0x34, 0x38, 0x4c, 0x45, 0x64, 0x4b, 0x45, 0x4c, 0x76, 0x35, 0x61, \n\t0x61, 0x4e, 0x48, 0x46, 0x52, 0x54, 0x57, 0x70, 0x4d, 0x54, 0x47, 0x79, 0x30, 0x6c, 0x63, 0x59, 0x59, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x57, 0x36, 0x30, 0x4d, 0x61, 0x30, 0x42, 0x47, 0x72, 0x57, 0x31, 0x38, 0x68, 0x55, 0x68, 0x45, \n\t0x57, 0x30, 0x74, 0x6a, 0x49, 0x43, 0x4b, 0x4d, 0x31, 0x43, 0x67, 0x77, 0x4c, 0x78, 0x68, 0x33, 0x72, 0x78, \n\t0x33, 0x58, 0x51, 0x7a, 0x46, 0x65, 0x63, 0x4d, 0x77, 0x55, 0x47, 0x4f, 0x61, 0x65, 0x70, 0x4b, 0x33, 0x2b, \n\t0x5a, 0x2f, 0x7a, 0x7a, 0x75, 0x2b, 0x65, 0x65, 0x2b, 0x34, 0x37, 0x39, 0x77, 0x6b, 0x70, 0x4a, 0x62, 0x5c, 0x0a,\n\t0x09, 0x66, 0x53, 0x6c, 0x46, 0x74, 0x4b, 0x75, 0x35, 0x32, 0x42, 0x59, 0x65, 0x41, 0x31, 0x6f, 0x41, 0x4f, \n\t0x59, 0x41, 0x4f, 0x54, 0x69, 0x4d, 0x77, 0x46, 0x30, 0x41, 0x71, 0x38, 0x75, 0x78, 0x71, 0x78, 0x71, 0x59, \n\t0x70, 0x55, 0x65, 0x68, 0x6f, 0x43, 0x6a, 0x51, 0x49, 0x73, 0x30, 0x4c, 0x64, 0x58, 0x71, 0x48, 0x38, 0x45, \n\t0x65, 0x69, 0x75, 0x4e, 0x4d, 0x4a, 0x55, 0x43, 0x41, 0x38, 0x42, 0x6d, 0x6f, 0x4e, 0x65, 0x55, 0x59, 0x5c, 0x0a,\n\t0x09, 0x44, 0x54, 0x57, 0x49, 0x51, 0x4c, 0x45, 0x4e, 0x74, 0x41, 0x49, 0x76, 0x41, 0x58, 0x2f, 0x39, 0x47, \n\t0x2b, 0x41, 0x2b, 0x34, 0x46, 0x4e, 0x6e, 0x4f, 0x72, 0x48, 0x65, 0x62, 0x4f, 0x76, 0x43, 0x4f, 0x76, 0x63, \n\t0x72, 0x4d, 0x70, 0x48, 0x4f, 0x6e, 0x30, 0x52, 0x54, 0x30, 0x4a, 0x70, 0x71, 0x4b, 0x58, 0x37, 0x69, 0x58, \n\t0x74, 0x53, 0x4b, 0x77, 0x41, 0x54, 0x77, 0x47, 0x48, 0x44, 0x2b, 0x5a, 0x6f, 0x41, 0x50, 0x41, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x65, 0x73, 0x2f, 0x6c, 0x46, 0x39, 0x2f, 0x6c, 0x67, 0x37, 0x63, 0x6a, 0x4b, 0x35, 0x30, 0x71, 0x4c, \n\t0x63, 0x79, 0x66, 0x77, 0x36, 0x33, 0x75, 0x66, 0x33, 0x59, 0x75, 0x79, 0x4a, 0x57, 0x4d, 0x44, 0x44, 0x51, \n\t0x50, 0x74, 0x61, 0x67, 0x47, 0x47, 0x67, 0x7a, 0x2b, 0x71, 0x4e, 0x42, 0x75, 0x64, 0x66, 0x50, 0x34, 0x64, \n\t0x4d, 0x4f, 0x32, 0x75, 0x43, 0x5a, 0x5a, 0x76, 0x33, 0x68, 0x66, 0x76, 0x78, 0x4e, 0x47, 0x36, 0x66, 0x5c, 0x0a,\n\t0x09, 0x42, 0x68, 0x71, 0x41, 0x61, 0x4c, 0x59, 0x76, 0x33, 0x36, 0x45, 0x35, 0x37, 0x73, 0x52, 0x6d, 0x67, \n\t0x2f, 0x50, 0x48, 0x4f, 0x70, 0x62, 0x42, 0x68, 0x4b, 0x36, 0x69, 0x33, 0x6c, 0x6d, 0x42, 0x2f, 0x74, 0x41, \n\t0x6d, 0x39, 0x4d, 0x59, 0x77, 0x77, 0x71, 0x2f, 0x6e, 0x42, 0x5a, 0x72, 0x48, 0x76, 0x79, 0x4d, 0x39, 0x46, \n\t0x41, 0x73, 0x43, 0x37, 0x2b, 0x54, 0x36, 0x63, 0x69, 0x75, 0x38, 0x47, 0x2b, 0x69, 0x65, 0x65, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x73, 0x73, 0x56, 0x76, 0x75, 0x77, 0x4b, 0x31, 0x44, 0x66, 0x76, 0x78, 0x6c, 0x76, 0x38, 0x33, 0x30, \n\t0x6f, 0x5a, 0x62, 0x34, 0x6c, 0x4c, 0x64, 0x46, 0x36, 0x67, 0x59, 0x56, 0x50, 0x42, 0x76, 0x4a, 0x43, 0x31, \n\t0x66, 0x6f, 0x4e, 0x42, 0x4e, 0x34, 0x34, 0x64, 0x43, 0x4e, 0x6e, 0x37, 0x77, 0x31, 0x64, 0x79, 0x34, 0x6c, \n\t0x37, 0x32, 0x70, 0x6d, 0x59, 0x77, 0x2b, 0x71, 0x49, 0x75, 0x6b, 0x54, 0x6a, 0x51, 0x41, 0x54, 0x66, 0x5c, 0x0a,\n\t0x09, 0x63, 0x30, 0x30, 0x41, 0x32, 0x4e, 0x45, 0x34, 0x56, 0x76, 0x38, 0x59, 0x30, 0x6e, 0x61, 0x77, 0x4f, \n\t0x71, 0x2f, 0x6d, 0x68, 0x51, 0x48, 0x59, 0x50, 0x38, 0x5a, 0x49, 0x58, 0x78, 0x6c, 0x48, 0x69, 0x34, 0x51, \n\t0x4f, 0x46, 0x77, 0x49, 0x32, 0x70, 0x72, 0x71, 0x48, 0x49, 0x61, 0x74, 0x71, 0x34, 0x64, 0x66, 0x78, 0x74, \n\t0x75, 0x77, 0x42, 0x59, 0x4b, 0x46, 0x7a, 0x45, 0x50, 0x50, 0x74, 0x62, 0x35, 0x48, 0x32, 0x32, 0x76, 0x5c, 0x0a,\n\t0x09, 0x71, 0x61, 0x36, 0x68, 0x35, 0x47, 0x69, 0x34, 0x53, 0x61, 0x73, 0x72, 0x58, 0x63, 0x48, 0x6d, 0x36, \n\t0x31, 0x52, 0x79, 0x5a, 0x64, 0x67, 0x6c, 0x70, 0x66, 0x67, 0x66, 0x42, 0x37, 0x6b, 0x45, 0x6b, 0x4c, 0x38, \n\t0x2f, 0x33, 0x76, 0x31, 0x77, 0x77, 0x44, 0x63, 0x50, 0x36, 0x59, 0x41, 0x61, 0x6a, 0x4c, 0x31, 0x6e, 0x49, \n\t0x72, 0x4e, 0x4f, 0x54, 0x38, 0x67, 0x6b, 0x74, 0x51, 0x53, 0x6f, 0x6f, 0x41, 0x73, 0x4d, 0x63, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x54, 0x4d, 0x70, 0x6c, 0x4e, 0x6f, 0x41, 0x32, 0x74, 0x59, 0x4e, 0x47, 0x61, 0x65, 0x75, 0x6f, \n\t0x67, 0x52, 0x39, 0x69, 0x42, 0x49, 0x50, 0x57, 0x44, 0x62, 0x70, 0x6e, 0x38, 0x65, 0x78, 0x76, 0x68, 0x6c, \n\t0x5a, 0x65, 0x6c, 0x64, 0x65, 0x58, 0x77, 0x41, 0x77, 0x43, 0x67, 0x46, 0x54, 0x77, 0x75, 0x64, 0x78, 0x42, \n\t0x55, 0x6a, 0x54, 0x41, 0x6b, 0x43, 0x6f, 0x4b, 0x67, 0x43, 0x2b, 0x49, 0x34, 0x31, 0x6f, 0x57, 0x30, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x35, 0x53, 0x7a, 0x6f, 0x49, 0x30, 0x7a, 0x30, 0x6e, 0x2f, 0x68, 0x6b, 0x51, 0x6d, 0x67, 0x4b, \n\t0x51, 0x4b, 0x67, 0x53, 0x38, 0x72, 0x49, 0x62, 0x57, 0x37, 0x63, 0x67, 0x57, 0x37, 0x4d, 0x45, 0x59, 0x32, \n\t0x41, 0x35, 0x71, 0x56, 0x52, 0x6c, 0x4b, 0x70, 0x52, 0x2f, 0x7a, 0x34, 0x79, 0x36, 0x30, 0x37, 0x53, 0x46, \n\t0x45, 0x6b, 0x59, 0x36, 0x63, 0x54, 0x31, 0x48, 0x30, 0x36, 0x46, 0x30, 0x49, 0x6a, 0x30, 0x62, 0x69, 0x5c, 0x0a,\n\t0x09, 0x39, 0x41, 0x57, 0x63, 0x61, 0x77, 0x6e, 0x58, 0x4e, 0x46, 0x49, 0x32, 0x42, 0x67, 0x42, 0x2b, 0x79, \n\t0x63, 0x36, 0x58, 0x32, 0x38, 0x4e, 0x32, 0x76, 0x61, 0x48, 0x47, 0x4a, 0x54, 0x67, 0x78, 0x6b, 0x39, 0x53, \n\t0x6c, 0x71, 0x36, 0x41, 0x70, 0x2b, 0x46, 0x35, 0x38, 0x41, 0x47, 0x64, 0x30, 0x68, 0x75, 0x54, 0x4a, 0x58, \n\t0x73, 0x7a, 0x33, 0x4c, 0x70, 0x46, 0x73, 0x37, 0x53, 0x4e, 0x39, 0x2b, 0x63, 0x2f, 0x4d, 0x77, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x59, 0x6e, 0x73, 0x63, 0x36, 0x36, 0x54, 0x36, 0x31, 0x65, 0x58, 0x77, 0x57, 0x5a, 0x67, 0x62, 0x39, \n\t0x69, 0x68, 0x53, 0x66, 0x56, 0x71, 0x6a, 0x75, 0x4f, 0x71, 0x44, 0x76, 0x58, 0x59, 0x2f, 0x66, 0x48, 0x6c, \n\t0x30, 0x54, 0x7a, 0x78, 0x45, 0x57, 0x30, 0x53, 0x41, 0x67, 0x74, 0x45, 0x6d, 0x4c, 0x64, 0x75, 0x38, 0x32, \n\t0x6b, 0x6f, 0x7a, 0x46, 0x77, 0x4a, 0x4d, 0x4a, 0x58, 0x68, 0x46, 0x70, 0x5a, 0x69, 0x6a, 0x4e, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x59, 0x76, 0x38, 0x55, 0x64, 0x79, 0x56, 0x53, 0x4b, 0x76, 0x30, 0x59, 0x44, 0x57, 0x47, 0x41, 0x55, \n\t0x34, 0x55, 0x71, 0x37, 0x41, 0x57, 0x2b, 0x39, 0x44, 0x36, 0x31, 0x47, 0x78, 0x54, 0x68, 0x71, 0x6e, 0x4c, \n\t0x32, 0x35, 0x63, 0x39, 0x5a, 0x36, 0x42, 0x77, 0x45, 0x4b, 0x64, 0x47, 0x32, 0x68, 0x4e, 0x44, 0x71, 0x4e, \n\t0x71, 0x4a, 0x57, 0x6c, 0x6d, 0x4c, 0x2f, 0x50, 0x73, 0x58, 0x63, 0x30, 0x54, 0x50, 0x49, 0x57, 0x63, 0x5c, 0x0a,\n\t0x09, 0x75, 0x56, 0x71, 0x50, 0x6a, 0x77, 0x4c, 0x74, 0x43, 0x55, 0x4c, 0x35, 0x43, 0x79, 0x4a, 0x31, 0x76, \n\t0x50, 0x4e, 0x30, 0x74, 0x72, 0x67, 0x56, 0x37, 0x7a, 0x73, 0x2b, 0x35, 0x67, 0x38, 0x73, 0x4f, 0x65, 0x58, \n\t0x42, 0x2f, 0x43, 0x71, 0x36, 0x48, 0x55, 0x6c, 0x53, 0x47, 0x4b, 0x4e, 0x4a, 0x7a, 0x78, 0x57, 0x5a, 0x7a, \n\t0x66, 0x5a, 0x6c, 0x33, 0x66, 0x4c, 0x59, 0x42, 0x78, 0x63, 0x42, 0x75, 0x2b, 0x5a, 0x2f, 0x66, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x61, 0x55, 0x72, 0x33, 0x52, 0x5a, 0x4e, 0x77, 0x46, 0x64, 0x6d, 0x57, 0x35, 0x65, 0x65, 0x50, \n\t0x4e, 0x57, 0x33, 0x4c, 0x47, 0x45, 0x68, 0x4d, 0x78, 0x37, 0x5a, 0x68, 0x75, 0x2b, 0x5a, 0x76, 0x52, 0x61, \n\t0x61, 0x63, 0x67, 0x44, 0x34, 0x65, 0x74, 0x6d, 0x43, 0x56, 0x37, 0x6b, 0x50, 0x32, 0x36, 0x79, 0x42, 0x30, \n\t0x58, 0x4c, 0x7a, 0x67, 0x34, 0x76, 0x59, 0x56, 0x36, 0x59, 0x4b, 0x67, 0x70, 0x54, 0x71, 0x45, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x70, 0x62, 0x64, 0x6d, 0x48, 0x73, 0x33, 0x68, 0x77, 0x48, 0x48, 0x73, 0x65, 0x52, 0x35, 0x37, 0x50, \n\t0x62, 0x73, 0x68, 0x59, 0x67, 0x51, 0x41, 0x58, 0x77, 0x4a, 0x6c, 0x49, 0x2b, 0x61, 0x51, 0x32, 0x4d, 0x71, \n\t0x61, 0x6b, 0x66, 0x68, 0x72, 0x43, 0x48, 0x72, 0x79, 0x47, 0x76, 0x4a, 0x38, 0x46, 0x79, 0x45, 0x4f, 0x56, \n\t0x65, 0x31, 0x4f, 0x70, 0x53, 0x6a, 0x48, 0x76, 0x43, 0x36, 0x44, 0x75, 0x72, 0x62, 0x54, 0x54, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x49, 0x2b, 0x41, 0x56, 0x59, 0x48, 0x79, 0x6c, 0x68, 0x4b, 0x73, 0x42, 0x4d, 0x39, 0x73, 0x70, 0x52, \n\t0x42, 0x68, 0x6f, 0x42, 0x76, 0x59, 0x44, 0x4f, 0x34, 0x43, 0x79, 0x52, 0x65, 0x38, 0x6b, 0x4d, 0x45, 0x42, \n\t0x6d, 0x36, 0x30, 0x34, 0x6a, 0x5a, 0x52, 0x53, 0x78, 0x76, 0x4b, 0x71, 0x62, 0x41, 0x2f, 0x37, 0x48, 0x64, \n\t0x74, 0x76, 0x2b, 0x4a, 0x76, 0x35, 0x2f, 0x67, 0x58, 0x38, 0x44, 0x6a, 0x66, 0x39, 0x36, 0x54, 0x37, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x4c, 0x58, 0x5a, 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, 0x53, 0x55, 0x56, 0x4f, 0x52, 0x4b, 0x35, \n\t0x43, 0x59, 0x49, 0x49, 0x3d, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x67, 0x40, 0x32, 0x78, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5b, 0x32, 0x5d, 0x2e, 0x67, 0x5f, 0x70, 0x6e, 0x67, 0x20, \n\t0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, \n\t0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x22, 0x2c, \n\t0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x44, 0x67, 0x41, 0x41, 0x41, 0x41, 0x34, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x43, 0x6f, 0x68, 0x6a, 0x73, 0x65, 0x41, 0x41, 0x41, 0x49, 0x4a, 0x30, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x6f, 0x67, 0x65, 0x32, 0x61, 0x57, 0x5a, 0x42, 0x55, 0x31, 0x52, 0x6e, 0x48, 0x66, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x66, 0x65, 0x58, 0x75, 0x66, 0x32, 0x44, 0x4d, 0x79, 0x41, 0x73, 0x37, 0x41, 0x59, 0x6c, 0x67, 0x45, \n\t0x47, 0x6e, 0x4c, 0x42, 0x45, 0x54, 0x51, 0x56, 0x42, 0x45, 0x6b, 0x46, 0x4d, 0x6a, 0x4b, 0x49, 0x56, 0x4c, \n\t0x59, 0x77, 0x6c, 0x53, 0x62, 0x52, 0x53, 0x5a, 0x56, 0x57, 0x30, 0x45, 0x43, 0x56, 0x35, 0x79, 0x59, 0x73, \n\t0x56, 0x48, 0x35, 0x4a, 0x4b, 0x6b, 0x56, 0x53, 0x35, 0x6c, 0x53, 0x6d, 0x74, 0x53, 0x70, 0x46, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x44, 0x46, 0x57, 0x45, 0x68, 0x63, 0x43, 0x57, 0x41, 0x59, 0x54, 0x44, 0x4d, 0x4e, 0x6d, 0x52, \n\t0x6a, 0x5a, 0x46, 0x42, 0x68, 0x68, 0x48, 0x42, 0x6f, 0x64, 0x74, 0x6d, 0x42, 0x6d, 0x59, 0x70, 0x66, 0x66, \n\t0x75, 0x65, 0x30, 0x38, 0x65, 0x62, 0x6e, 0x64, 0x50, 0x64, 0x39, 0x46, 0x33, 0x36, 0x5a, 0x34, 0x68, 0x41, \n\t0x59, 0x76, 0x2f, 0x30, 0x37, 0x33, 0x6e, 0x66, 0x75, 0x65, 0x63, 0x2f, 0x2f, 0x2b, 0x65, 0x37, 0x54, 0x5c, 0x0a,\n\t0x09, 0x76, 0x66, 0x4f, 0x55, 0x4a, 0x4b, 0x79, 0x52, 0x63, 0x5a, 0x79, 0x76, 0x2b, 0x62, 0x77, 0x4b, 0x58, \n\t0x47, 0x56, 0x59, 0x46, 0x58, 0x4f, 0x71, 0x34, 0x4b, 0x76, 0x4e, 0x4c, 0x68, 0x75, 0x55, 0x54, 0x6c, 0x31, \n\t0x67, 0x4a, 0x4c, 0x67, 0x63, 0x58, 0x41, 0x48, 0x4b, 0x41, 0x52, 0x47, 0x41, 0x38, 0x45, 0x4d, 0x39, 0x2f, \n\t0x54, 0x77, 0x43, 0x6e, 0x67, 0x42, 0x48, 0x41, 0x51, 0x32, 0x41, 0x33, 0x38, 0x45, 0x7a, 0x67, 0x33, 0x5c, 0x0a,\n\t0x09, 0x32, 0x6b, 0x54, 0x45, 0x4b, 0x43, 0x34, 0x54, 0x51, 0x57, 0x41, 0x56, 0x38, 0x48, 0x31, 0x67, 0x53, \n\t0x52, 0x6e, 0x35, 0x44, 0x57, 0x41, 0x6e, 0x38, 0x41, 0x72, 0x77, 0x4a, 0x79, 0x41, 0x32, 0x47, 0x71, 0x52, \n\t0x47, 0x51, 0x32, 0x41, 0x46, 0x38, 0x41, 0x54, 0x77, 0x59, 0x32, 0x42, 0x63, 0x4d, 0x51, 0x50, 0x6a, 0x33, \n\t0x42, 0x44, 0x47, 0x51, 0x41, 0x51, 0x5a, 0x54, 0x59, 0x49, 0x69, 0x45, 0x4b, 0x71, 0x43, 0x71, 0x41, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x68, 0x6a, 0x67, 0x75, 0x42, 0x56, 0x79, 0x32, 0x57, 0x70, 0x52, 0x64, 0x34, 0x46, 0x6e, 0x69, \n\t0x61, 0x45, 0x51, 0x6f, 0x64, 0x71, 0x63, 0x44, 0x76, 0x5a, 0x49, 0x68, 0x63, 0x6d, 0x35, 0x2b, 0x6f, 0x66, \n\t0x39, 0x35, 0x48, 0x38, 0x6f, 0x50, 0x50, 0x53, 0x42, 0x38, 0x36, 0x6a, 0x58, 0x36, 0x73, 0x44, 0x78, 0x6c, \n\t0x4f, 0x46, 0x61, 0x2f, 0x63, 0x6f, 0x36, 0x44, 0x4d, 0x71, 0x73, 0x48, 0x54, 0x56, 0x49, 0x76, 0x33, 0x5c, 0x0a,\n\t0x09, 0x78, 0x6d, 0x6c, 0x34, 0x6d, 0x78, 0x70, 0x41, 0x4c, 0x5a, 0x67, 0x57, 0x54, 0x67, 0x4b, 0x72, 0x67, \n\t0x62, 0x66, 0x4c, 0x4a, 0x56, 0x69, 0x75, 0x77, 0x43, 0x44, 0x77, 0x48, 0x50, 0x42, 0x77, 0x4c, 0x69, 0x56, \n\t0x74, 0x6b, 0x4e, 0x6a, 0x64, 0x54, 0x6d, 0x4c, 0x54, 0x49, 0x66, 0x54, 0x44, 0x76, 0x57, 0x57, 0x52, 0x55, \n\t0x53, 0x61, 0x47, 0x38, 0x4e, 0x30, 0x2b, 0x6d, 0x38, 0x43, 0x79, 0x36, 0x78, 0x41, 0x68, 0x66, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x36, 0x6e, 0x39, 0x63, 0x42, 0x6a, 0x6c, 0x4e, 0x47, 0x61, 0x35, 0x51, 0x69, 0x38, 0x42, 0x74, 0x67, \n\t0x45, 0x66, 0x44, 0x57, 0x62, 0x6b, 0x44, 0x70, 0x77, 0x67, 0x74, 0x6a, 0x4c, 0x75, 0x39, 0x45, 0x37, 0x42, \n\t0x6b, 0x6f, 0x74, 0x71, 0x7a, 0x69, 0x70, 0x63, 0x51, 0x45, 0x43, 0x39, 0x79, 0x38, 0x67, 0x73, 0x4c, 0x77, \n\t0x35, 0x76, 0x30, 0x58, 0x2f, 0x41, 0x39, 0x77, 0x46, 0x64, 0x4a, 0x64, 0x55, 0x56, 0x6f, 0x6b, 0x43, 0x5c, 0x0a,\n\t0x09, 0x36, 0x34, 0x45, 0x64, 0x77, 0x48, 0x51, 0x41, 0x47, 0x55, 0x73, 0x52, 0x66, 0x57, 0x55, 0x48, 0x79, \n\t0x63, 0x33, 0x48, 0x53, 0x69, 0x6e, 0x44, 0x4e, 0x54, 0x7a, 0x58, 0x31, 0x36, 0x4d, 0x39, 0x75, 0x68, 0x53, \n\t0x6c, 0x74, 0x6a, 0x4b, 0x62, 0x31, 0x41, 0x48, 0x63, 0x52, 0x41, 0x6d, 0x7a, 0x62, 0x53, 0x6b, 0x43, 0x78, \n\t0x77, 0x49, 0x74, 0x51, 0x44, 0x4f, 0x41, 0x30, 0x52, 0x63, 0x68, 0x76, 0x4f, 0x34, 0x64, 0x39, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x59, 0x2b, 0x39, 0x34, 0x7a, 0x4c, 0x67, 0x42, 0x67, 0x66, 0x49, 0x50, 0x54, 0x54, 0x32, 0x2f, 0x44, \n\t0x4d, 0x61, 0x73, 0x67, 0x6d, 0x48, 0x51, 0x49, 0x57, 0x41, 0x59, 0x4e, 0x75, 0x38, 0x72, 0x74, 0x64, 0x36, \n\t0x41, 0x58, 0x77, 0x42, 0x37, 0x4c, 0x69, 0x65, 0x6f, 0x59, 0x59, 0x65, 0x76, 0x4c, 0x74, 0x53, 0x79, 0x34, \n\t0x4f, 0x51, 0x50, 0x62, 0x47, 0x43, 0x54, 0x2b, 0x35, 0x68, 0x64, 0x54, 0x48, 0x58, 0x64, 0x6d, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x75, 0x44, 0x56, 0x44, 0x43, 0x64, 0x48, 0x75, 0x42, 0x58, 0x34, 0x4f, 0x4c, 0x41, 0x43, 0x51, \n\t0x41, 0x37, 0x47, 0x43, 0x50, 0x39, 0x69, 0x4d, 0x30, 0x62, 0x58, 0x55, 0x4b, 0x6c, 0x63, 0x79, 0x34, 0x61, \n\t0x4d, 0x70, 0x59, 0x6e, 0x38, 0x63, 0x69, 0x76, 0x36, 0x38, 0x5a, 0x35, 0x73, 0x30, 0x67, 0x70, 0x67, 0x6a, \n\t0x5a, 0x75, 0x38, 0x62, 0x72, 0x72, 0x6f, 0x5a, 0x4b, 0x41, 0x4e, 0x30, 0x4a, 0x43, 0x53, 0x38, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x65, 0x49, 0x62, 0x57, 0x6a, 0x79, 0x79, 0x6e, 0x50, 0x4a, 0x59, 0x45, 0x79, 0x75, 0x5a, 0x4b, \n\t0x71, 0x64, 0x66, 0x63, 0x67, 0x4b, 0x67, 0x4d, 0x41, 0x45, 0x63, 0x7a, 0x57, 0x37, 0x4c, 0x54, 0x4c, 0x34, \n\t0x38, 0x5a, 0x56, 0x57, 0x77, 0x64, 0x6f, 0x41, 0x50, 0x48, 0x33, 0x50, 0x69, 0x6c, 0x4a, 0x6e, 0x4b, 0x6a, \n\t0x79, 0x34, 0x56, 0x6e, 0x51, 0x67, 0x47, 0x64, 0x6d, 0x48, 0x55, 0x71, 0x4e, 0x68, 0x74, 0x44, 0x38, 0x5c, 0x0a,\n\t0x09, 0x79, 0x48, 0x67, 0x4b, 0x59, 0x79, 0x42, 0x4b, 0x63, 0x6c, 0x74, 0x37, 0x79, 0x63, 0x75, 0x4a, 0x30, \n\t0x54, 0x56, 0x45, 0x64, 0x4d, 0x4d, 0x75, 0x74, 0x45, 0x65, 0x58, 0x6b, 0x75, 0x48, 0x30, 0x46, 0x50, 0x43, \n\t0x51, 0x4c, 0x51, 0x65, 0x48, 0x46, 0x6d, 0x77, 0x45, 0x6a, 0x67, 0x43, 0x71, 0x4d, 0x52, 0x42, 0x6a, 0x63, \n\t0x50, 0x58, 0x72, 0x79, 0x50, 0x36, 0x45, 0x49, 0x78, 0x47, 0x6c, 0x51, 0x63, 0x4f, 0x2f, 0x63, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x37, 0x2b, 0x78, 0x54, 0x4d, 0x52, 0x51, 0x56, 0x39, 0x78, 0x73, 0x75, 0x63, 0x6a, 0x44, 0x44, 0x7a, \n\t0x34, 0x71, 0x6d, 0x4e, 0x5a, 0x78, 0x56, 0x44, 0x35, 0x36, 0x78, 0x56, 0x34, 0x6d, 0x69, 0x59, 0x41, 0x53, \n\t0x45, 0x78, 0x66, 0x39, 0x34, 0x67, 0x6c, 0x46, 0x34, 0x65, 0x79, 0x31, 0x67, 0x41, 0x71, 0x51, 0x47, 0x4c, \n\t0x4c, 0x51, 0x56, 0x66, 0x69, 0x76, 0x45, 0x75, 0x6e, 0x55, 0x50, 0x58, 0x4d, 0x53, 0x67, 0x4c, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x79, 0x33, 0x46, 0x67, 0x65, 0x6e, 0x46, 0x6c, 0x49, 0x76, 0x59, 0x61, 0x36, 0x32, 0x35, 0x59, \n\t0x6f, 0x41, 0x66, 0x32, 0x64, 0x6e, 0x61, 0x31, 0x61, 0x49, 0x43, 0x39, 0x77, 0x50, 0x49, 0x65, 0x49, 0x72, \n\t0x45, 0x35, 0x6a, 0x62, 0x48, 0x69, 0x6e, 0x32, 0x33, 0x7a, 0x79, 0x43, 0x30, 0x39, 0x70, 0x73, 0x49, 0x7a, \n\t0x57, 0x39, 0x72, 0x4a, 0x79, 0x4d, 0x4a, 0x49, 0x75, 0x74, 0x62, 0x48, 0x4d, 0x75, 0x7a, 0x51, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x72, 0x66, 0x57, 0x66, 0x54, 0x6a, 0x75, 0x61, 0x58, 0x77, 0x65, 0x39, 0x67, 0x4d, 0x4e, 0x62, 0x73, \n\t0x78, 0x75, 0x41, 0x54, 0x54, 0x61, 0x79, 0x47, 0x31, 0x74, 0x78, 0x4d, 0x35, 0x6b, 0x4c, 0x53, 0x74, 0x56, \n\t0x4a, 0x31, 0x56, 0x67, 0x2f, 0x62, 0x77, 0x31, 0x79, 0x39, 0x4b, 0x31, 0x37, 0x76, 0x4f, 0x45, 0x39, 0x2b, \n\t0x34, 0x6e, 0x2f, 0x54, 0x42, 0x4d, 0x38, 0x68, 0x7a, 0x4d, 0x51, 0x68, 0x35, 0x49, 0x4a, 0x4a, 0x47, 0x5c, 0x0a,\n\t0x09, 0x70, 0x67, 0x30, 0x48, 0x47, 0x66, 0x61, 0x49, 0x62, 0x7a, 0x75, 0x43, 0x4e, 0x72, 0x55, 0x57, 0x54, \n\t0x41, 0x66, 0x2f, 0x4a, 0x6d, 0x42, 0x37, 0x4d, 0x54, 0x73, 0x37, 0x67, 0x54, 0x6d, 0x32, 0x79, 0x64, 0x62, \n\t0x6a, 0x6a, 0x68, 0x55, 0x47, 0x48, 0x31, 0x70, 0x34, 0x30, 0x63, 0x34, 0x67, 0x73, 0x66, 0x30, 0x6f, 0x73, \n\t0x65, 0x64, 0x61, 0x6b, 0x45, 0x6c, 0x39, 0x4f, 0x4e, 0x48, 0x68, 0x52, 0x37, 0x6c, 0x46, 0x75, 0x72, 0x5c, 0x0a,\n\t0x09, 0x55, 0x4c, 0x66, 0x70, 0x68, 0x37, 0x76, 0x52, 0x55, 0x4c, 0x67, 0x58, 0x5a, 0x64, 0x4e, 0x4f, 0x64, \n\t0x72, 0x36, 0x70, 0x2f, 0x59, 0x75, 0x33, 0x39, 0x71, 0x59, 0x7a, 0x58, 0x65, 0x35, 0x6b, 0x6d, 0x46, 0x42, \n\t0x4e, 0x70, 0x4f, 0x45, 0x33, 0x74, 0x36, 0x65, 0x36, 0x47, 0x34, 0x55, 0x59, 0x52, 0x78, 0x4d, 0x6f, 0x7a, \n\t0x65, 0x6e, 0x58, 0x4e, 0x6d, 0x46, 0x6c, 0x6a, 0x5a, 0x32, 0x51, 0x6c, 0x73, 0x42, 0x44, 0x44, 0x36, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x78, 0x68, 0x6e, 0x6f, 0x37, 0x61, 0x56, 0x65, 0x65, 0x59, 0x31, 0x58, 0x4a, 0x51, 0x57, 0x2f, \n\t0x66, 0x30, 0x75, 0x70, 0x44, 0x36, 0x79, 0x62, 0x75, 0x67, 0x45, 0x2f, 0x55, 0x52, 0x75, 0x6d, 0x5a, 0x6c, \n\t0x74, 0x5a, 0x57, 0x4d, 0x6e, 0x63, 0x41, 0x71, 0x41, 0x30, 0x65, 0x50, 0x73, 0x38, 0x71, 0x6e, 0x54, 0x36, \n\t0x77, 0x72, 0x65, 0x30, 0x78, 0x33, 0x64, 0x2f, 0x78, 0x4d, 0x33, 0x7a, 0x75, 0x6a, 0x4a, 0x65, 0x56, 0x5c, 0x0a,\n\t0x09, 0x50, 0x31, 0x56, 0x6a, 0x5a, 0x32, 0x59, 0x39, 0x41, 0x4c, 0x35, 0x6f, 0x37, 0x42, 0x43, 0x55, 0x70, \n\t0x6c, 0x34, 0x61, 0x79, 0x5a, 0x62, 0x6a, 0x76, 0x72, 0x6d, 0x43, 0x63, 0x66, 0x6f, 0x73, 0x4b, 0x44, 0x71, \n\t0x41, 0x34, 0x67, 0x4b, 0x72, 0x7a, 0x49, 0x65, 0x42, 0x70, 0x35, 0x49, 0x57, 0x36, 0x35, 0x53, 0x63, 0x36, \n\t0x48, 0x44, 0x4d, 0x65, 0x7a, 0x6a, 0x35, 0x71, 0x56, 0x6a, 0x61, 0x4d, 0x6e, 0x49, 0x32, 0x4d, 0x75, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x67, 0x57, 0x6c, 0x73, 0x43, 0x4d, 0x59, 0x76, 0x63, 0x4f, 0x74, 0x4c, 0x72, 0x77, 0x71, 0x2f, \n\t0x6c, 0x58, 0x7a, 0x38, 0x63, 0x79, 0x6f, 0x52, 0x63, 0x5a, 0x53, 0x79, 0x47, 0x67, 0x53, 0x34, 0x56, 0x55, \n\t0x52, 0x56, 0x55, 0x47, 0x55, 0x6d, 0x68, 0x42, 0x4b, 0x64, 0x63, 0x58, 0x46, 0x79, 0x34, 0x71, 0x55, 0x36, \n\t0x4b, 0x66, 0x37, 0x69, 0x62, 0x32, 0x78, 0x6c, 0x39, 0x51, 0x2f, 0x4f, 0x70, 0x7a, 0x72, 0x74, 0x34, 0x5c, 0x0a,\n\t0x09, 0x47, 0x64, 0x77, 0x41, 0x69, 0x67, 0x69, 0x56, 0x44, 0x41, 0x73, 0x5a, 0x43, 0x38, 0x50, 0x35, 0x6b, \n\t0x70, 0x64, 0x58, 0x67, 0x32, 0x39, 0x64, 0x30, 0x7a, 0x68, 0x2b, 0x43, 0x39, 0x4e, 0x35, 0x54, 0x47, 0x53, \n\t0x67, 0x6a, 0x55, 0x69, 0x64, 0x57, 0x45, 0x48, 0x6c, 0x6c, 0x4b, 0x2f, 0x35, 0x34, 0x75, 0x35, 0x4b, 0x44, \n\t0x46, 0x54, 0x78, 0x37, 0x2b, 0x73, 0x5a, 0x62, 0x4e, 0x62, 0x54, 0x63, 0x47, 0x7a, 0x77, 0x49, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x59, 0x79, 0x6f, 0x63, 0x2b, 0x65, 0x68, 0x6e, 0x43, 0x6e, 0x66, 0x79, 0x36, 0x71, 0x54, 0x71, 0x34, \n\t0x65, 0x63, 0x4a, 0x59, 0x78, 0x33, 0x7a, 0x57, 0x30, 0x49, 0x41, 0x71, 0x76, 0x57, 0x75, 0x53, 0x4c, 0x6b, \n\t0x6d, 0x6c, 0x48, 0x33, 0x73, 0x74, 0x4c, 0x53, 0x78, 0x4b, 0x62, 0x34, 0x4e, 0x51, 0x4b, 0x30, 0x66, 0x67, \n\t0x79, 0x67, 0x65, 0x2b, 0x63, 0x6f, 0x68, 0x66, 0x61, 0x78, 0x77, 0x47, 0x66, 0x48, 0x4f, 0x76, 0x54, 0x5c, 0x0a,\n\t0x09, 0x61, 0x58, 0x4a, 0x2f, 0x46, 0x75, 0x47, 0x33, 0x70, 0x6e, 0x44, 0x78, 0x53, 0x5a, 0x55, 0x65, 0x56, \n\t0x67, 0x44, 0x46, 0x4a, 0x35, 0x79, 0x34, 0x69, 0x55, 0x4a, 0x46, 0x73, 0x2f, 0x51, 0x7a, 0x2f, 0x65, 0x67, \n\t0x39, 0x45, 0x62, 0x4a, 0x76, 0x72, 0x61, 0x48, 0x75, 0x51, 0x46, 0x61, 0x2f, 0x64, 0x51, 0x72, 0x52, 0x2b, \n\t0x54, 0x66, 0x66, 0x7a, 0x55, 0x79, 0x73, 0x61, 0x75, 0x69, 0x78, 0x34, 0x41, 0x37, 0x73, 0x53, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x44, 0x54, 0x56, 0x6f, 0x48, 0x2f, 0x63, 0x59, 0x32, 0x6d, 0x6f, 0x66, 0x33, 0x67, 0x47, 0x4f, \n\t0x52, 0x54, 0x50, 0x62, 0x6d, 0x4e, 0x51, 0x61, 0x6a, 0x53, 0x38, 0x33, 0x32, 0x6f, 0x6b, 0x2b, 0x66, 0x65, \n\t0x6a, 0x36, 0x49, 0x64, 0x37, 0x47, 0x58, 0x7a, 0x73, 0x44, 0x54, 0x4e, 0x63, 0x57, 0x4f, 0x56, 0x44, 0x61, \n\t0x46, 0x35, 0x6b, 0x4e, 0x47, 0x56, 0x36, 0x52, 0x6f, 0x61, 0x6b, 0x36, 0x71, 0x58, 0x37, 0x55, 0x43, 0x5c, 0x0a,\n\t0x09, 0x64, 0x6d, 0x57, 0x6c, 0x77, 0x49, 0x55, 0x68, 0x2b, 0x64, 0x4a, 0x50, 0x4b, 0x57, 0x73, 0x31, 0x73, \n\t0x6f, 0x66, 0x43, 0x71, 0x71, 0x36, 0x63, 0x6d, 0x41, 0x47, 0x61, 0x38, 0x70, 0x43, 0x72, 0x73, 0x57, 0x33, \n\t0x4a, 0x70, 0x39, 0x38, 0x4d, 0x36, 0x62, 0x61, 0x46, 0x75, 0x5a, 0x54, 0x4f, 0x6f, 0x6b, 0x74, 0x68, 0x57, \n\t0x53, 0x71, 0x6c, 0x69, 0x31, 0x45, 0x48, 0x58, 0x47, 0x63, 0x46, 0x66, 0x46, 0x6b, 0x4d, 0x6a, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x42, 0x4d, 0x61, 0x70, 0x73, 0x4e, 0x6b, 0x71, 0x68, 0x72, 0x6d, 0x4c, 0x53, 0x65, 0x35, 0x73, 0x4c, \n\t0x79, 0x51, 0x30, 0x76, 0x68, 0x49, 0x33, 0x55, 0x4f, 0x66, 0x58, 0x49, 0x66, 0x79, 0x35, 0x39, 0x76, 0x6d, \n\t0x33, 0x6c, 0x5a, 0x32, 0x64, 0x77, 0x46, 0x33, 0x41, 0x65, 0x51, 0x44, 0x66, 0x6f, 0x70, 0x6d, 0x4f, 0x46, \n\t0x63, 0x62, 0x2f, 0x39, 0x68, 0x45, 0x79, 0x50, 0x4e, 0x79, 0x64, 0x68, 0x4f, 0x61, 0x6e, 0x38, 0x71, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x56, 0x65, 0x4a, 0x64, 0x50, 0x41, 0x32, 0x45, 0x39, 0x6a, 0x6f, 0x79, 0x2b, 0x63, 0x4d, 0x47, \n\t0x37, 0x48, 0x4c, 0x4a, 0x33, 0x4b, 0x72, 0x4c, 0x77, 0x4c, 0x5a, 0x71, 0x65, 0x66, 0x65, 0x7a, 0x42, 0x6a, \n\t0x42, 0x55, 0x56, 0x68, 0x56, 0x30, 0x58, 0x54, 0x51, 0x4d, 0x62, 0x67, 0x4d, 0x66, 0x56, 0x53, 0x64, 0x56, \n\t0x34, 0x46, 0x74, 0x53, 0x52, 0x33, 0x6d, 0x2f, 0x74, 0x73, 0x73, 0x6e, 0x7a, 0x63, 0x61, 0x49, 0x76, 0x5c, 0x0a,\n\t0x09, 0x74, 0x36, 0x43, 0x74, 0x76, 0x6a, 0x57, 0x58, 0x4a, 0x71, 0x71, 0x43, 0x68, 0x4e, 0x59, 0x73, 0x52, \n\t0x37, 0x2f, 0x33, 0x41, 0x75, 0x6d, 0x32, 0x30, 0x78, 0x67, 0x58, 0x6f, 0x6d, 0x62, 0x4c, 0x2b, 0x56, 0x52, \n\t0x45, 0x30, 0x49, 0x63, 0x79, 0x54, 0x73, 0x4d, 0x37, 0x74, 0x79, 0x42, 0x6d, 0x54, 0x48, 0x72, 0x66, 0x4b, \n\t0x55, 0x64, 0x78, 0x6f, 0x74, 0x71, 0x50, 0x37, 0x32, 0x75, 0x4e, 0x32, 0x64, 0x63, 0x2f, 0x5a, 0x37, 0x5c, 0x0a,\n\t0x09, 0x69, 0x57, 0x4c, 0x42, 0x44, 0x67, 0x4a, 0x63, 0x77, 0x39, 0x6f, 0x51, 0x69, 0x73, 0x76, 0x4a, 0x37, \n\t0x77, 0x2f, 0x69, 0x32, 0x32, 0x78, 0x73, 0x6c, 0x33, 0x4f, 0x31, 0x42, 0x71, 0x78, 0x78, 0x43, 0x38, 0x37, \n\t0x38, 0x61, 0x43, 0x64, 0x48, 0x56, 0x69, 0x39, 0x66, 0x41, 0x34, 0x73, 0x30, 0x48, 0x69, 0x2f, 0x54, 0x62, \n\t0x30, 0x39, 0x67, 0x75, 0x4f, 0x64, 0x76, 0x34, 0x37, 0x35, 0x69, 0x41, 0x71, 0x66, 0x41, 0x41, 0x36, 0x5c, 0x0a,\n\t0x09, 0x38, 0x4c, 0x79, 0x64, 0x72, 0x64, 0x4f, 0x75, 0x38, 0x77, 0x68, 0x6d, 0x4b, 0x2b, 0x4c, 0x39, 0x38, \n\t0x6d, 0x51, 0x38, 0x43, 0x79, 0x63, 0x35, 0x6d, 0x45, 0x4e, 0x38, 0x77, 0x7a, 0x37, 0x43, 0x7a, 0x32, 0x38, \n\t0x31, 0x5a, 0x38, 0x67, 0x53, 0x6b, 0x44, 0x70, 0x77, 0x67, 0x74, 0x69, 0x4c, 0x75, 0x78, 0x7a, 0x74, 0x6c, \n\t0x41, 0x6b, 0x61, 0x67, 0x62, 0x76, 0x6d, 0x5a, 0x31, 0x2f, 0x2f, 0x67, 0x73, 0x30, 0x4d, 0x43, 0x75, 0x5c, 0x0a,\n\t0x09, 0x36, 0x43, 0x54, 0x6c, 0x4d, 0x77, 0x59, 0x35, 0x47, 0x61, 0x30, 0x54, 0x33, 0x49, 0x34, 0x4e, 0x71, \n\t0x2f, 0x49, 0x6f, 0x65, 0x63, 0x33, 0x53, 0x68, 0x52, 0x37, 0x63, 0x64, 0x2f, 0x35, 0x78, 0x7a, 0x38, 0x33, \n\t0x35, 0x69, 0x64, 0x48, 0x37, 0x69, 0x39, 0x43, 0x48, 0x72, 0x33, 0x49, 0x50, 0x47, 0x4e, 0x2b, 0x30, 0x6c, \n\t0x75, 0x4f, 0x70, 0x71, 0x62, 0x65, 0x4f, 0x79, 0x67, 0x2f, 0x65, 0x77, 0x32, 0x66, 0x44, 0x64, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x42, 0x59, 0x67, 0x43, 0x54, 0x59, 0x42, 0x74, 0x6b, 0x4d, 0x68, 0x74, 0x34, 0x50, 0x63, 0x4a, 0x34, \n\t0x42, 0x6d, 0x41, 0x35, 0x41, 0x63, 0x64, 0x52, 0x48, 0x37, 0x2b, 0x6e, 0x70, 0x73, 0x38, 0x6d, 0x52, 0x6f, \n\t0x45, 0x61, 0x6c, 0x4d, 0x4e, 0x36, 0x72, 0x52, 0x78, 0x4b, 0x4c, 0x57, 0x56, 0x43, 0x4a, 0x38, 0x48, 0x71, \n\t0x52, 0x73, 0x59, 0x50, 0x55, 0x50, 0x6f, 0x37, 0x62, 0x33, 0x6f, 0x52, 0x2f, 0x70, 0x63, 0x43, 0x51, 0x5c, 0x0a,\n\t0x09, 0x50, 0x77, 0x72, 0x37, 0x79, 0x4f, 0x69, 0x68, 0x38, 0x73, 0x7a, 0x72, 0x36, 0x75, 0x78, 0x54, 0x7a, \n\t0x34, 0x73, 0x61, 0x2f, 0x65, 0x70, 0x55, 0x43, 0x42, 0x65, 0x63, 0x4b, 0x7a, 0x41, 0x69, 0x44, 0x32, 0x35, \n\t0x6c, 0x37, 0x69, 0x76, 0x2f, 0x76, 0x51, 0x46, 0x61, 0x6e, 0x52, 0x67, 0x76, 0x65, 0x57, 0x4b, 0x59, 0x54, \n\t0x57, 0x4c, 0x41, 0x63, 0x7a, 0x6c, 0x72, 0x4d, 0x4a, 0x38, 0x35, 0x7a, 0x43, 0x6b, 0x58, 0x77, 0x70, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x66, 0x73, 0x78, 0x6d, 0x4f, 0x63, 0x53, 0x7a, 0x51, 0x43, 0x78, 0x74, 0x2f, 0x59, 0x52, 0x58, \n\t0x39, 0x39, 0x71, 0x6e, 0x32, 0x4f, 0x55, 0x34, 0x4c, 0x31, 0x6c, 0x43, 0x74, 0x72, 0x71, 0x5a, 0x51, 0x69, \n\t0x66, 0x42, 0x38, 0x7a, 0x68, 0x73, 0x67, 0x52, 0x77, 0x6e, 0x6f, 0x30, 0x6f, 0x2f, 0x66, 0x43, 0x6c, 0x44, \n\t0x76, 0x4d, 0x55, 0x64, 0x6a, 0x70, 0x41, 0x6f, 0x75, 0x55, 0x59, 0x73, 0x52, 0x64, 0x61, 0x6b, 0x46, 0x5c, 0x0a,\n\t0x09, 0x48, 0x4c, 0x57, 0x58, 0x70, 0x6b, 0x45, 0x41, 0x4c, 0x2f, 0x64, 0x35, 0x75, 0x70, 0x65, 0x47, 0x42, \n\t0x68, 0x64, 0x69, 0x33, 0x74, 0x41, 0x47, 0x34, 0x47, 0x7a, 0x72, 0x67, 0x75, 0x6f, 0x6f, 0x7a, 0x6a, 0x73, \n\t0x7a, 0x70, 0x67, 0x49, 0x35, 0x6d, 0x51, 0x68, 0x6e, 0x36, 0x36, 0x6e, 0x38, 0x69, 0x4c, 0x37, 0x36, 0x4d, \n\t0x66, 0x4b, 0x4f, 0x6c, 0x55, 0x79, 0x78, 0x48, 0x4b, 0x70, 0x42, 0x41, 0x56, 0x6a, 0x39, 0x79, 0x63, 0x5c, 0x0a,\n\t0x09, 0x76, 0x30, 0x36, 0x32, 0x41, 0x6e, 0x64, 0x67, 0x4c, 0x75, 0x79, 0x75, 0x4d, 0x5a, 0x49, 0x44, 0x30, \n\t0x42, 0x66, 0x49, 0x68, 0x6e, 0x32, 0x6b, 0x4a, 0x4c, 0x6d, 0x7a, 0x6e, 0x64, 0x6a, 0x72, 0x65, 0x7a, 0x45, \n\t0x36, 0x58, 0x52, 0x33, 0x36, 0x57, 0x42, 0x4f, 0x71, 0x43, 0x65, 0x43, 0x2f, 0x75, 0x35, 0x6e, 0x41, 0x74, \n\t0x2b, 0x63, 0x69, 0x41, 0x74, 0x35, 0x73, 0x38, 0x6d, 0x38, 0x78, 0x4a, 0x7a, 0x70, 0x33, 0x62, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x35, 0x2b, 0x65, 0x53, 0x4d, 0x38, 0x77, 0x72, 0x34, 0x62, 0x2b, 0x41, 0x31, 0x67, 0x4f, 0x71, 0x74, \n\t0x53, 0x6b, 0x74, 0x7a, 0x58, 0x53, 0x58, 0x4c, 0x37, 0x4d, 0x64, 0x4a, 0x37, 0x54, 0x72, 0x72, 0x76, 0x75, \n\t0x6f, 0x72, 0x41, 0x38, 0x35, 0x56, 0x36, 0x66, 0x49, 0x75, 0x6d, 0x34, 0x31, 0x73, 0x30, 0x45, 0x78, 0x48, \n\t0x4d, 0x43, 0x66, 0x73, 0x63, 0x55, 0x39, 0x69, 0x62, 0x35, 0x52, 0x49, 0x63, 0x6a, 0x55, 0x73, 0x49, 0x5c, 0x0a,\n\t0x09, 0x51, 0x65, 0x41, 0x6e, 0x47, 0x53, 0x4b, 0x35, 0x53, 0x77, 0x67, 0x79, 0x6c, 0x6b, 0x49, 0x2f, 0x66, \n\t0x6f, 0x35, 0x55, 0x65, 0x7a, 0x66, 0x47, 0x6d, 0x51, 0x47, 0x4d, 0x76, 0x67, 0x67, 0x6b, 0x64, 0x5a, 0x41, \n\t0x53, 0x2f, 0x42, 0x35, 0x45, 0x70, 0x52, 0x2b, 0x31, 0x59, 0x53, 0x7a, 0x71, 0x31, 0x50, 0x46, 0x34, 0x5a, \n\t0x7a, 0x58, 0x6b, 0x64, 0x69, 0x49, 0x5a, 0x39, 0x47, 0x46, 0x65, 0x51, 0x48, 0x69, 0x57, 0x4d, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x74, 0x48, 0x36, 0x4e, 0x39, 0x6a, 0x65, 0x51, 0x42, 0x34, 0x45, 0x48, 0x4d, 0x41, 0x38, 0x70, \n\t0x79, 0x59, 0x76, 0x50, 0x62, 0x4d, 0x54, 0x32, 0x6e, 0x50, 0x33, 0x49, 0x5a, 0x58, 0x53, 0x4d, 0x70, 0x68, \n\t0x6c, 0x70, 0x67, 0x47, 0x62, 0x41, 0x51, 0x6d, 0x41, 0x64, 0x38, 0x43, 0x62, 0x4d, 0x62, 0x5a, 0x33, 0x33, \n\t0x66, 0x47, 0x4f, 0x5a, 0x56, 0x6b, 0x55, 0x2b, 0x42, 0x77, 0x35, 0x6a, 0x4c, 0x7a, 0x37, 0x2b, 0x34, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x43, 0x38, 0x43, 0x58, 0x5a, 0x62, 0x34, 0x77, 0x74, 0x39, 0x56, 0x75, 0x79, 0x72, 0x77, 0x53, \n\t0x73, 0x64, 0x56, 0x67, 0x56, 0x63, 0x36, 0x72, 0x67, 0x71, 0x38, 0x30, 0x76, 0x46, 0x66, 0x62, 0x44, 0x6e, \n\t0x6a, 0x6b, 0x37, 0x55, 0x34, 0x64, 0x33, 0x45, 0x41, 0x41, 0x41, 0x41, 0x41, 0x53, 0x55, 0x56, 0x4f, 0x52, \n\t0x4b, 0x35, 0x43, 0x59, 0x49, 0x49, 0x3d, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x6d, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5b, 0x31, 0x5d, 0x2e, 0x6d, 0x5f, 0x70, 0x6e, 0x67, 0x20, \n\t0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, \n\t0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x22, 0x2c, \n\t0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x42, 0x77, 0x41, 0x41, 0x41, 0x41, 0x63, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x42, 0x79, 0x44, 0x64, 0x2b, 0x55, 0x41, 0x41, 0x41, 0x44, 0x6b, 0x55, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x49, 0x69, 0x63, 0x32, 0x57, 0x58, 0x57, 0x77, 0x55, 0x56, 0x52, 0x54, 0x48, 0x66, 0x33, 0x5c, 0x0a,\n\t0x09, 0x64, 0x6d, 0x64, 0x76, 0x61, 0x37, 0x52, 0x4c, 0x73, 0x74, 0x32, 0x31, 0x5a, 0x71, 0x6c, 0x31, 0x5a, \n\t0x73, 0x71, 0x78, 0x42, 0x6f, 0x4b, 0x76, 0x4b, 0x52, 0x43, 0x4f, 0x71, 0x44, 0x41, 0x68, 0x46, 0x35, 0x30, \n\t0x77, 0x52, 0x4e, 0x4e, 0x43, 0x46, 0x52, 0x38, 0x55, 0x47, 0x4d, 0x45, 0x68, 0x2b, 0x4d, 0x45, 0x6a, 0x45, \n\t0x2b, 0x47, 0x49, 0x33, 0x36, 0x70, 0x4d, 0x38, 0x53, 0x50, 0x32, 0x4a, 0x38, 0x4d, 0x41, 0x6f, 0x47, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x59, 0x6b, 0x50, 0x4a, 0x6f, 0x51, 0x53, 0x54, 0x46, 0x70, 0x4e, 0x43, 0x72, 0x48, 0x74, 0x56, \n\t0x6a, 0x53, 0x55, 0x51, 0x72, 0x74, 0x72, 0x57, 0x37, 0x61, 0x37, 0x30, 0x39, 0x33, 0x35, 0x75, 0x44, 0x35, \n\t0x73, 0x72, 0x5a, 0x32, 0x64, 0x36, 0x57, 0x34, 0x6c, 0x68, 0x50, 0x42, 0x50, 0x35, 0x6d, 0x48, 0x4f, 0x75, \n\t0x66, 0x66, 0x2b, 0x7a, 0x72, 0x33, 0x33, 0x7a, 0x44, 0x6b, 0x6a, 0x70, 0x4a, 0x54, 0x63, 0x54, 0x43, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x33, 0x6c, 0x58, 0x59, 0x72, 0x41, 0x31, 0x63, 0x44, 0x68, 0x34, 0x46, 0x54, 0x51, 0x41, 0x61, \n\t0x51, 0x43, 0x30, 0x39, 0x6d, 0x77, 0x66, 0x59, 0x4b, 0x6b, 0x46, 0x7a, 0x4a, 0x51, 0x71, 0x4c, 0x47, 0x48, \n\t0x64, 0x59, 0x42, 0x62, 0x77, 0x45, 0x76, 0x49, 0x47, 0x58, 0x51, 0x2b, 0x6e, 0x30, 0x43, 0x61, 0x33, 0x51, \n\t0x53, 0x4a, 0x7a, 0x75, 0x48, 0x74, 0x42, 0x32, 0x55, 0x75, 0x6a, 0x42, 0x61, 0x65, 0x79, 0x4e, 0x61, 0x5c, 0x0a,\n\t0x09, 0x64, 0x77, 0x73, 0x69, 0x71, 0x4a, 0x57, 0x41, 0x6a, 0x34, 0x45, 0x33, 0x67, 0x64, 0x7a, 0x31, 0x41, \n\t0x4c, 0x75, 0x42, 0x62, 0x32, 0x58, 0x4a, 0x36, 0x70, 0x6a, 0x2f, 0x2f, 0x6c, 0x64, 0x4b, 0x4a, 0x34, 0x5a, \n\t0x77, 0x4a, 0x67, 0x33, 0x2f, 0x52, 0x56, 0x62, 0x70, 0x36, 0x48, 0x73, 0x36, 0x43, 0x65, 0x2f, 0x74, 0x51, \n\t0x55, 0x53, 0x44, 0x61, 0x65, 0x41, 0x78, 0x34, 0x4d, 0x4c, 0x2f, 0x41, 0x58, 0x59, 0x42, 0x50, 0x39, 0x5c, 0x0a,\n\t0x09, 0x75, 0x58, 0x5a, 0x78, 0x4c, 0x35, 0x39, 0x2f, 0x75, 0x77, 0x52, 0x36, 0x61, 0x58, 0x43, 0x38, 0x6f, \n\t0x6c, 0x70, 0x53, 0x56, 0x47, 0x39, 0x4e, 0x57, 0x48, 0x30, 0x54, 0x71, 0x53, 0x47, 0x57, 0x41, 0x48, 0x63, \n\t0x48, 0x34, 0x6c, 0x77, 0x44, 0x67, 0x77, 0x59, 0x49, 0x39, 0x50, 0x74, 0x2b, 0x64, 0x65, 0x2f, 0x77, 0x36, \n\t0x5a, 0x6e, 0x56, 0x38, 0x52, 0x62, 0x48, 0x48, 0x42, 0x69, 0x45, 0x62, 0x73, 0x37, 0x64, 0x31, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x36, 0x35, 0x70, 0x47, 0x67, 0x52, 0x34, 0x71, 0x6a, 0x74, 0x63, 0x76, 0x61, 0x59, 0x35, 0x4b, 0x77, \n\t0x32, 0x7a, 0x50, 0x76, 0x2f, 0x65, 0x6a, 0x43, 0x36, 0x59, 0x30, 0x52, 0x51, 0x6b, 0x2b, 0x63, 0x53, 0x2b, \n\t0x69, 0x54, 0x71, 0x38, 0x4b, 0x6c, 0x41, 0x57, 0x4c, 0x2f, 0x4c, 0x75, 0x6e, 0x63, 0x47, 0x59, 0x4b, 0x48, \n\t0x63, 0x44, 0x52, 0x53, 0x6e, 0x38, 0x6c, 0x4d, 0x41, 0x6b, 0x63, 0x6e, 0x44, 0x38, 0x2b, 0x67, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x32, 0x65, 0x64, 0x54, 0x6e, 0x43, 0x42, 0x37, 0x59, 0x52, 0x65, 0x57, 0x6f, 0x37, 0x34, 0x51, 0x4e, \n\t0x62, 0x79, 0x6a, 0x76, 0x52, 0x46, 0x47, 0x4c, 0x76, 0x37, 0x43, 0x5a, 0x79, 0x65, 0x4b, 0x63, 0x48, 0x36, \n\t0x6b, 0x77, 0x61, 0x47, 0x46, 0x2f, 0x32, 0x41, 0x7a, 0x78, 0x50, 0x4f, 0x63, 0x4f, 0x58, 0x42, 0x65, 0x36, \n\t0x58, 0x52, 0x55, 0x73, 0x76, 0x48, 0x6e, 0x63, 0x66, 0x76, 0x64, 0x49, 0x63, 0x52, 0x64, 0x2b, 0x38, 0x5c, 0x0a,\n\t0x09, 0x46, 0x6f, 0x44, 0x67, 0x7a, 0x6b, 0x37, 0x55, 0x37, 0x67, 0x53, 0x42, 0x50, 0x65, 0x73, 0x49, 0x62, \n\t0x46, 0x68, 0x44, 0x38, 0x49, 0x47, 0x37, 0x55, 0x56, 0x72, 0x6a, 0x48, 0x71, 0x6a, 0x5a, 0x6c, 0x38, 0x61, \n\t0x5a, 0x4e, 0x55, 0x4c, 0x41, 0x30, 0x39, 0x57, 0x41, 0x75, 0x38, 0x7a, 0x66, 0x2f, 0x6b, 0x4c, 0x4f, 0x46, \n\t0x46, 0x31, 0x47, 0x62, 0x58, 0x33, 0x35, 0x45, 0x35, 0x4e, 0x7a, 0x52, 0x52, 0x43, 0x43, 0x79, 0x44, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x62, 0x43, 0x65, 0x2f, 0x74, 0x57, 0x66, 0x51, 0x48, 0x65, 0x74, 0x64, 0x34, 0x67, 0x4e, 0x4a, \n\t0x79, 0x4d, 0x4d, 0x2b, 0x4e, 0x41, 0x54, 0x78, 0x53, 0x44, 0x62, 0x6a, 0x52, 0x47, 0x72, 0x37, 0x69, 0x6d, \n\t0x61, 0x79, 0x73, 0x58, 0x67, 0x57, 0x41, 0x38, 0x63, 0x30, 0x76, 0x4f, 0x4a, 0x4d, 0x35, 0x74, 0x4b, 0x35, \n\t0x6d, 0x6c, 0x4d, 0x59, 0x34, 0x30, 0x69, 0x67, 0x74, 0x42, 0x48, 0x53, 0x48, 0x5a, 0x77, 0x36, 0x41, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x58, 0x49, 0x56, 0x59, 0x46, 0x4d, 0x31, 0x59, 0x4c, 0x33, 0x7a, 0x64, 0x38, 0x45, 0x7a, 0x55, \n\t0x59, 0x51, 0x44, 0x41, 0x44, 0x69, 0x5a, 0x4f, 0x51, 0x70, 0x66, 0x6e, 0x46, 0x6d, 0x30, 0x47, 0x31, 0x2b, \n\t0x64, 0x42, 0x64, 0x73, 0x68, 0x63, 0x45, 0x38, 0x4c, 0x51, 0x76, 0x50, 0x6d, 0x6e, 0x35, 0x50, 0x4a, 0x41, \n\t0x39, 0x52, 0x58, 0x41, 0x34, 0x4a, 0x6c, 0x2b, 0x30, 0x59, 0x4c, 0x67, 0x4b, 0x70, 0x67, 0x2f, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x51, 0x52, 0x63, 0x2f, 0x42, 0x50, 0x37, 0x49, 0x6c, 0x5a, 0x53, 0x69, 0x65, 0x48, 0x73, 0x59, 0x61, \n\t0x76, 0x49, 0x4d, 0x49, 0x36, 0x61, 0x6d, 0x2b, 0x54, 0x64, 0x37, 0x7a, 0x6c, 0x65, 0x45, 0x78, 0x61, 0x78, \n\t0x58, 0x74, 0x57, 0x61, 0x59, 0x6a, 0x56, 0x65, 0x30, 0x59, 0x74, 0x53, 0x4b, 0x67, 0x4b, 0x53, 0x4d, 0x6e, \n\t0x63, 0x47, 0x7a, 0x38, 0x73, 0x32, 0x6b, 0x70, 0x6e, 0x78, 0x39, 0x43, 0x36, 0x6d, 0x74, 0x48, 0x76, 0x5c, 0x0a,\n\t0x09, 0x54, 0x32, 0x48, 0x31, 0x6a, 0x37, 0x76, 0x48, 0x78, 0x33, 0x53, 0x41, 0x37, 0x46, 0x4a, 0x62, 0x35, \n\t0x51, 0x34, 0x48, 0x31, 0x4e, 0x61, 0x45, 0x42, 0x79, 0x51, 0x4c, 0x35, 0x62, 0x73, 0x69, 0x56, 0x42, 0x6b, \n\t0x66, 0x6d, 0x47, 0x63, 0x75, 0x67, 0x70, 0x54, 0x6f, 0x32, 0x2b, 0x39, 0x43, 0x33, 0x42, 0x35, 0x79, 0x2b, \n\t0x64, 0x52, 0x55, 0x41, 0x6d, 0x43, 0x77, 0x47, 0x72, 0x42, 0x50, 0x33, 0x33, 0x51, 0x6e, 0x49, 0x71, 0x5c, 0x0a,\n\t0x09, 0x42, 0x57, 0x45, 0x4d, 0x76, 0x56, 0x53, 0x43, 0x67, 0x2b, 0x39, 0x33, 0x51, 0x35, 0x54, 0x2b, 0x6e, \n\t0x30, 0x43, 0x43, 0x4b, 0x73, 0x45, 0x33, 0x72, 0x53, 0x6c, 0x52, 0x2f, 0x6f, 0x76, 0x57, 0x30, 0x41, 0x4a, \n\t0x36, 0x73, 0x42, 0x6a, 0x34, 0x6c, 0x34, 0x71, 0x42, 0x68, 0x34, 0x71, 0x4d, 0x32, 0x39, 0x69, 0x38, 0x46, \n\t0x78, 0x7a, 0x4b, 0x46, 0x4c, 0x57, 0x4d, 0x4e, 0x54, 0x48, 0x69, 0x43, 0x41, 0x38, 0x64, 0x6b, 0x35, 0x5c, 0x0a,\n\t0x09, 0x37, 0x41, 0x6c, 0x33, 0x6f, 0x64, 0x42, 0x36, 0x6d, 0x31, 0x44, 0x62, 0x47, 0x6b, 0x72, 0x41, 0x35, \n\t0x30, 0x76, 0x74, 0x66, 0x72, 0x58, 0x30, 0x51, 0x32, 0x63, 0x71, 0x64, 0x2b, 0x6a, 0x61, 0x53, 0x31, 0x38, \n\t0x6a, 0x63, 0x36, 0x59, 0x76, 0x6f, 0x4a, 0x61, 0x45, 0x70, 0x68, 0x44, 0x2f, 0x34, 0x48, 0x48, 0x55, 0x56, \n\t0x4f, 0x4e, 0x48, 0x77, 0x4d, 0x74, 0x4c, 0x66, 0x58, 0x36, 0x31, 0x39, 0x49, 0x6a, 0x53, 0x45, 0x42, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x4e, 0x48, 0x4e, 0x6f, 0x42, 0x69, 0x72, 0x67, 0x75, 0x59, 0x4f, 0x69, 0x35, 0x4c, 0x61, 0x69, \n\t0x70, 0x78, 0x6a, 0x54, 0x6c, 0x33, 0x75, 0x69, 0x53, 0x48, 0x2f, 0x41, 0x61, 0x73, 0x45, 0x2f, 0x66, 0x33, \n\t0x4a, 0x36, 0x4a, 0x76, 0x76, 0x59, 0x67, 0x49, 0x75, 0x4a, 0x4e, 0x6c, 0x4f, 0x55, 0x6b, 0x56, 0x49, 0x58, \n\t0x77, 0x69, 0x31, 0x73, 0x4a, 0x50, 0x62, 0x6f, 0x2b, 0x51, 0x37, 0x6b, 0x6e, 0x65, 0x68, 0x70, 0x78, 0x5c, 0x0a,\n\t0x09, 0x74, 0x51, 0x62, 0x63, 0x42, 0x5a, 0x79, 0x77, 0x4c, 0x30, 0x32, 0x76, 0x4c, 0x58, 0x78, 0x36, 0x32, \n\t0x70, 0x50, 0x79, 0x6c, 0x56, 0x49, 0x33, 0x4e, 0x42, 0x42, 0x35, 0x64, 0x68, 0x74, 0x61, 0x52, 0x33, 0x49, \n\t0x55, 0x32, 0x41, 0x63, 0x4d, 0x2b, 0x51, 0x5a, 0x56, 0x34, 0x78, 0x63, 0x6a, 0x54, 0x72, 0x6e, 0x46, 0x48, \n\t0x4c, 0x54, 0x2f, 0x6d, 0x4e, 0x4a, 0x4c, 0x2f, 0x57, 0x6d, 0x73, 0x73, 0x51, 0x77, 0x79, 0x57, 0x77, 0x5c, 0x0a,\n\t0x09, 0x41, 0x70, 0x45, 0x59, 0x6b, 0x6f, 0x61, 0x75, 0x74, 0x74, 0x36, 0x50, 0x65, 0x6c, 0x30, 0x44, 0x71, \n\t0x62, 0x69, 0x38, 0x41, 0x6e, 0x77, 0x42, 0x48, 0x4b, 0x70, 0x2b, 0x53, 0x72, 0x57, 0x73, 0x42, 0x2f, 0x6c, \n\t0x51, 0x54, 0x32, 0x41, 0x37, 0x75, 0x41, 0x6a, 0x66, 0x78, 0x58, 0x72, 0x72, 0x4c, 0x41, 0x41, 0x4e, 0x41, \n\t0x48, 0x48, 0x41, 0x4f, 0x75, 0x31, 0x6c, 0x70, 0x6f, 0x70, 0x63, 0x41, 0x62, 0x70, 0x6c, 0x76, 0x32, 0x5c, 0x0a,\n\t0x09, 0x76, 0x2f, 0x53, 0x47, 0x36, 0x52, 0x2f, 0x32, 0x37, 0x7a, 0x6d, 0x75, 0x4c, 0x33, 0x45, 0x35, 0x30, \n\t0x51, 0x41, 0x41, 0x41, 0x41, 0x42, 0x4a, 0x52, 0x55, 0x35, 0x45, 0x72, 0x6b, 0x4a, 0x67, 0x67, 0x67, 0x3d, \n\t0x3d, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x6d, 0x40, 0x32, 0x78, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5b, 0x32, 0x5d, 0x2e, 0x6d, 0x5f, 0x70, 0x6e, 0x67, 0x20, \n\t0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, \n\t0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x22, 0x2c, \n\t0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x44, 0x67, 0x41, 0x41, 0x41, 0x41, 0x34, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x43, 0x6f, 0x68, 0x6a, 0x73, 0x65, 0x41, 0x41, 0x41, 0x48, 0x2f, 0x6b, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x6f, 0x67, 0x65, 0x32, 0x61, 0x61, 0x58, 0x42, 0x56, 0x5a, 0x78, 0x6e, 0x48, 0x66, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x38, 0x35, 0x35, 0x35, 0x35, 0x37, 0x63, 0x32, 0x39, 0x43, 0x41, 0x6b, 0x49, 0x4d, 0x57, 0x55, 0x47, \n\t0x61, 0x4e, 0x43, 0x52, 0x73, 0x4a, 0x68, 0x32, 0x32, 0x4b, 0x47, 0x56, 0x52, 0x52, 0x71, 0x43, 0x56, 0x4f, \n\t0x6e, 0x58, 0x47, 0x6b, 0x55, 0x47, 0x78, 0x69, 0x71, 0x50, 0x57, 0x34, 0x6d, 0x44, 0x39, 0x55, 0x4a, 0x32, \n\t0x4f, 0x79, 0x2f, 0x6a, 0x46, 0x47, 0x54, 0x2f, 0x67, 0x53, 0x4e, 0x76, 0x52, 0x4f, 0x74, 0x69, 0x36, 0x5c, 0x0a,\n\t0x09, 0x51, 0x52, 0x57, 0x58, 0x44, 0x38, 0x56, 0x6c, 0x46, 0x4b, 0x55, 0x6c, 0x55, 0x30, 0x69, 0x78, 0x56, \n\t0x71, 0x51, 0x30, 0x67, 0x43, 0x78, 0x44, 0x49, 0x41, 0x4b, 0x6c, 0x6b, 0x4a, 0x43, 0x6c, 0x75, 0x66, 0x75, \n\t0x39, 0x72, 0x78, 0x2f, 0x4f, 0x50, 0x54, 0x64, 0x33, 0x79, 0x64, 0x6d, 0x79, 0x61, 0x4f, 0x6e, 0x77, 0x6e, \n\t0x37, 0x6b, 0x7a, 0x35, 0x33, 0x33, 0x50, 0x38, 0x7a, 0x37, 0x4c, 0x50, 0x65, 0x64, 0x35, 0x33, 0x75, 0x5c, 0x0a,\n\t0x09, 0x63, 0x38, 0x7a, 0x79, 0x75, 0x6b, 0x6c, 0x4c, 0x79, 0x54, 0x6f, 0x66, 0x79, 0x2f, 0x46, 0x5a, 0x68, \n\t0x71, 0x33, 0x44, 0x48, 0x77, 0x64, 0x73, 0x63, 0x64, 0x41, 0x32, 0x39, 0x33, 0x61, 0x46, 0x50, 0x45, 0x74, \n\t0x78, 0x78, 0x59, 0x44, 0x64, 0x77, 0x4c, 0x4c, 0x41, 0x51, 0x61, 0x67, 0x56, 0x6c, 0x41, 0x4d, 0x48, 0x4d, \n\t0x2f, 0x43, 0x66, 0x51, 0x43, 0x50, 0x63, 0x43, 0x72, 0x77, 0x46, 0x48, 0x67, 0x45, 0x44, 0x41, 0x34, 0x5c, 0x0a,\n\t0x09, 0x36, 0x5a, 0x70, 0x49, 0x4b, 0x53, 0x66, 0x72, 0x70, 0x30, 0x67, 0x70, 0x48, 0x35, 0x42, 0x53, 0x50, \n\t0x69, 0x2b, 0x6c, 0x54, 0x45, 0x6a, 0x76, 0x69, 0x45, 0x6b, 0x70, 0x44, 0x30, 0x67, 0x70, 0x4e, 0x32, 0x64, \n\t0x34, 0x54, 0x59, 0x70, 0x65, 0x59, 0x68, 0x4c, 0x32, 0x51, 0x51, 0x46, 0x38, 0x41, 0x76, 0x67, 0x61, 0x30, \n\t0x47, 0x7a, 0x78, 0x4c, 0x35, 0x49, 0x65, 0x69, 0x69, 0x4b, 0x6a, 0x43, 0x57, 0x4f, 0x42, 0x71, 0x71, 0x5c, 0x0a,\n\t0x09, 0x42, 0x55, 0x42, 0x45, 0x47, 0x7a, 0x39, 0x4a, 0x43, 0x7a, 0x77, 0x4c, 0x65, 0x42, 0x66, 0x63, 0x43, \n\t0x45, 0x46, 0x4a, 0x79, 0x6f, 0x67, 0x61, 0x33, 0x41, 0x30, 0x30, 0x42, 0x48, 0x37, 0x71, 0x53, 0x4d, 0x78, \n\t0x45, 0x6d, 0x63, 0x36, 0x43, 0x58, 0x78, 0x57, 0x69, 0x2b, 0x70, 0x38, 0x7a, 0x64, 0x4a, 0x39, 0x77, 0x77, \n\t0x69, 0x49, 0x38, 0x6c, 0x38, 0x77, 0x61, 0x71, 0x43, 0x71, 0x43, 0x74, 0x46, 0x62, 0x5a, 0x71, 0x46, 0x5c, 0x0a,\n\t0x09, 0x62, 0x2f, 0x35, 0x73, 0x39, 0x4b, 0x58, 0x76, 0x51, 0x55, 0x77, 0x72, 0x4b, 0x65, 0x54, 0x66, 0x42, \n\t0x57, 0x77, 0x48, 0x54, 0x6f, 0x31, 0x58, 0x77, 0x59, 0x6b, 0x59, 0x75, 0x42, 0x31, 0x34, 0x41, 0x67, 0x69, \n\t0x59, 0x45, 0x36, 0x6d, 0x72, 0x41, 0x30, 0x51, 0x50, 0x48, 0x43, 0x64, 0x78, 0x2b, 0x43, 0x4a, 0x79, 0x4f, \n\t0x4f, 0x46, 0x4e, 0x45, 0x56, 0x56, 0x42, 0x57, 0x31, 0x6c, 0x4c, 0x34, 0x4c, 0x35, 0x46, 0x61, 0x43, 0x5c, 0x0a,\n\t0x09, 0x30, 0x31, 0x75, 0x62, 0x65, 0x69, 0x77, 0x45, 0x36, 0x4d, 0x50, 0x39, 0x49, 0x7a, 0x78, 0x6d, 0x4f, \n\t0x67, 0x41, 0x48, 0x59, 0x44, 0x6a, 0x35, 0x67, 0x54, 0x63, 0x69, 0x68, 0x43, 0x65, 0x47, 0x38, 0x58, 0x69, \n\t0x54, 0x39, 0x66, 0x51, 0x4b, 0x62, 0x53, 0x34, 0x39, 0x45, 0x6a, 0x44, 0x39, 0x71, 0x79, 0x61, 0x6f, 0x4c, \n\t0x62, 0x4f, 0x6c, 0x44, 0x72, 0x5a, 0x75, 0x52, 0x4f, 0x37, 0x77, 0x59, 0x65, 0x42, 0x56, 0x4b, 0x65, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x50, 0x56, 0x6f, 0x6f, 0x41, 0x72, 0x38, 0x44, 0x4e, 0x68, 0x69, 0x54, 0x73, 0x54, 0x2f, 0x63, \n\t0x5a, 0x48, 0x77, 0x45, 0x35, 0x33, 0x49, 0x2f, 0x71, 0x67, 0x58, 0x50, 0x73, 0x36, 0x4b, 0x61, 0x51, 0x72, \n\t0x2b, 0x62, 0x65, 0x32, 0x55, 0x62, 0x48, 0x34, 0x76, 0x43, 0x47, 0x46, 0x4f, 0x37, 0x77, 0x4f, 0x32, 0x34, \n\t0x73, 0x45, 0x76, 0x76, 0x52, 0x72, 0x34, 0x66, 0x65, 0x42, 0x4c, 0x35, 0x69, 0x44, 0x79, 0x71, 0x32, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x45, 0x66, 0x2f, 0x45, 0x76, 0x4c, 0x2b, 0x73, 0x39, 0x77, 0x37, 0x65, 0x71, 0x6e, 0x74, 0x41, \n\t0x6a, 0x36, 0x78, 0x41, 0x6c, 0x75, 0x6a, 0x6e, 0x31, 0x4a, 0x4c, 0x44, 0x44, 0x37, 0x58, 0x6f, 0x76, 0x42, \n\t0x6e, 0x34, 0x4f, 0x2b, 0x43, 0x45, 0x41, 0x55, 0x6a, 0x4b, 0x79, 0x70, 0x35, 0x50, 0x34, 0x38, 0x32, 0x63, \n\t0x38, 0x71, 0x44, 0x70, 0x2b, 0x71, 0x49, 0x73, 0x72, 0x4b, 0x58, 0x74, 0x38, 0x55, 0x36, 0x36, 0x52, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x77, 0x58, 0x32, 0x75, 0x46, 0x6e, 0x72, 0x31, 0x73, 0x41, 0x57, 0x6a, 0x41, 0x30, 0x35, 0x41, \n\t0x42, 0x42, 0x2b, 0x72, 0x6f, 0x76, 0x59, 0x76, 0x74, 0x66, 0x47, 0x6f, 0x65, 0x72, 0x34, 0x6f, 0x53, 0x32, \n\t0x72, 0x70, 0x75, 0x79, 0x78, 0x6a, 0x65, 0x42, 0x54, 0x77, 0x51, 0x67, 0x38, 0x37, 0x62, 0x69, 0x49, 0x72, \n\t0x6d, 0x35, 0x53, 0x4e, 0x59, 0x48, 0x78, 0x62, 0x77, 0x55, 0x41, 0x34, 0x6b, 0x66, 0x4f, 0x2f, 0x63, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x4e, 0x41, 0x30, 0x67, 0x65, 0x75, 0x30, 0x70, 0x34, 0x62, 0x35, 0x63, 0x35, 0x44, 0x41, 0x41, \n\t0x2f, 0x79, 0x75, 0x68, 0x6d, 0x43, 0x7a, 0x63, 0x47, 0x62, 0x67, 0x46, 0x57, 0x41, 0x4b, 0x54, 0x66, 0x48, \n\t0x43, 0x62, 0x38, 0x67, 0x35, 0x63, 0x63, 0x46, 0x2b, 0x69, 0x62, 0x6d, 0x71, 0x6a, 0x59, 0x2f, 0x78, 0x44, \n\t0x6c, 0x7a, 0x32, 0x78, 0x42, 0x61, 0x36, 0x74, 0x79, 0x49, 0x63, 0x49, 0x64, 0x59, 0x72, 0x2f, 0x74, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x6e, 0x48, 0x38, 0x6b, 0x6a, 0x6e, 0x73, 0x77, 0x45, 0x67, 0x77, 0x62, 0x4f, 0x46, 0x6b, 0x6f, \n\t0x41, 0x4a, 0x38, 0x77, 0x78, 0x79, 0x45, 0x39, 0x78, 0x35, 0x46, 0x44, 0x73, 0x62, 0x74, 0x46, 0x38, 0x79, \n\t0x5a, 0x52, 0x75, 0x67, 0x7a, 0x71, 0x78, 0x41, 0x6c, 0x4f, 0x73, 0x71, 0x73, 0x4d, 0x6b, 0x49, 0x37, 0x31, \n\t0x69, 0x47, 0x43, 0x78, 0x53, 0x6d, 0x76, 0x31, 0x6c, 0x5a, 0x46, 0x32, 0x58, 0x66, 0x76, 0x4a, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x54, 0x34, 0x42, 0x31, 0x42, 0x71, 0x53, 0x70, 0x33, 0x30, 0x7a, 0x43, 0x4b, 0x38, 0x35, 0x30, 0x67, \n\t0x32, 0x49, 0x77, 0x4b, 0x2b, 0x36, 0x6d, 0x53, 0x44, 0x6b, 0x34, 0x48, 0x33, 0x41, 0x30, 0x30, 0x41, 0x79, \n\t0x62, 0x50, 0x58, 0x53, 0x42, 0x7a, 0x71, 0x63, 0x56, 0x51, 0x67, 0x38, 0x4f, 0x41, 0x53, 0x30, 0x30, 0x38, \n\t0x4d, 0x41, 0x54, 0x4e, 0x4c, 0x38, 0x58, 0x39, 0x73, 0x63, 0x52, 0x36, 0x4e, 0x4b, 0x50, 0x4d, 0x52, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x76, 0x49, 0x48, 0x30, 0x65, 0x5a, 0x58, 0x6f, 0x79, 0x2b, 0x66, 0x52, 0x33, 0x44, 0x48, 0x76, \n\t0x59, 0x35, 0x38, 0x54, 0x61, 0x51, 0x76, 0x44, 0x78, 0x4d, 0x37, 0x32, 0x47, 0x30, 0x4f, 0x35, 0x77, 0x4d, \n\t0x66, 0x74, 0x71, 0x4e, 0x33, 0x4d, 0x6e, 0x43, 0x37, 0x65, 0x52, 0x45, 0x39, 0x63, 0x4d, 0x4a, 0x52, 0x75, \n\t0x4b, 0x6a, 0x77, 0x6f, 0x36, 0x39, 0x73, 0x4c, 0x4a, 0x6f, 0x50, 0x33, 0x4c, 0x63, 0x45, 0x70, 0x58, 0x5c, 0x0a,\n\t0x09, 0x62, 0x30, 0x4b, 0x66, 0x6b, 0x2f, 0x75, 0x74, 0x6a, 0x49, 0x52, 0x54, 0x50, 0x77, 0x74, 0x64, 0x61, \n\t0x69, 0x56, 0x49, 0x63, 0x63, 0x2b, 0x5a, 0x75, 0x49, 0x48, 0x58, 0x67, 0x64, 0x6b, 0x74, 0x6d, 0x45, 0x34, \n\t0x74, 0x4e, 0x32, 0x74, 0x48, 0x59, 0x47, 0x6c, 0x67, 0x50, 0x72, 0x41, 0x64, 0x4b, 0x33, 0x52, 0x6b, 0x68, \n\t0x30, 0x58, 0x6e, 0x59, 0x55, 0x37, 0x46, 0x74, 0x57, 0x69, 0x39, 0x43, 0x4c, 0x58, 0x30, 0x65, 0x68, 0x5c, 0x0a,\n\t0x09, 0x61, 0x77, 0x51, 0x2b, 0x66, 0x6f, 0x38, 0x68, 0x73, 0x4c, 0x4b, 0x45, 0x77, 0x4d, 0x5a, 0x46, 0x52, \n\t0x54, 0x54, 0x61, 0x30, 0x6a, 0x70, 0x48, 0x2f, 0x69, 0x62, 0x53, 0x31, 0x30, 0x61, 0x49, 0x48, 0x2b, 0x38, \n\t0x78, 0x68, 0x78, 0x75, 0x41, 0x61, 0x56, 0x61, 0x30, 0x64, 0x67, 0x61, 0x75, 0x41, 0x33, 0x53, 0x41, 0x2b, \n\t0x4d, 0x73, 0x58, 0x49, 0x4f, 0x32, 0x38, 0x6e, 0x57, 0x6a, 0x4e, 0x73, 0x79, 0x33, 0x76, 0x2b, 0x56, 0x5c, 0x0a,\n\t0x09, 0x66, 0x64, 0x6a, 0x64, 0x6f, 0x79, 0x45, 0x33, 0x31, 0x54, 0x4b, 0x79, 0x4c, 0x67, 0x4b, 0x37, 0x72, \n\t0x76, 0x57, 0x31, 0x4c, 0x76, 0x79, 0x44, 0x38, 0x58, 0x38, 0x61, 0x4d, 0x58, 0x73, 0x6d, 0x4b, 0x42, 0x4e, \n\t0x56, 0x5a, 0x30, 0x64, 0x67, 0x61, 0x75, 0x4d, 0x43, 0x38, 0x53, 0x4a, 0x33, 0x70, 0x64, 0x43, 0x56, 0x55, \n\t0x62, 0x33, 0x70, 0x57, 0x76, 0x52, 0x4e, 0x66, 0x35, 0x76, 0x48, 0x46, 0x77, 0x32, 0x33, 0x49, 0x43, 0x5c, 0x0a,\n\t0x09, 0x36, 0x78, 0x65, 0x4d, 0x75, 0x64, 0x62, 0x58, 0x55, 0x6f, 0x76, 0x49, 0x38, 0x56, 0x30, 0x6e, 0x4a, \n\t0x50, 0x39, 0x35, 0x46, 0x55, 0x62, 0x7a, 0x58, 0x6b, 0x73, 0x6e, 0x74, 0x6a, 0x4f, 0x77, 0x33, 0x62, 0x78, \n\t0x49, 0x6e, 0x62, 0x72, 0x68, 0x53, 0x71, 0x68, 0x61, 0x50, 0x54, 0x31, 0x37, 0x6e, 0x58, 0x35, 0x7a, 0x6d, \n\t0x4d, 0x69, 0x7a, 0x4c, 0x2b, 0x64, 0x47, 0x50, 0x4c, 0x53, 0x57, 0x47, 0x6b, 0x53, 0x70, 0x66, 0x38, 0x5c, 0x0a,\n\t0x09, 0x79, 0x31, 0x6f, 0x73, 0x53, 0x48, 0x75, 0x6e, 0x43, 0x57, 0x4b, 0x7a, 0x6b, 0x41, 0x73, 0x6a, 0x39, \n\t0x4b, 0x36, 0x6f, 0x31, 0x73, 0x41, 0x57, 0x43, 0x68, 0x46, 0x5a, 0x32, 0x64, 0x67, 0x58, 0x4d, 0x41, 0x30, \n\t0x6e, 0x30, 0x6a, 0x79, 0x46, 0x73, 0x78, 0x52, 0x34, 0x46, 0x43, 0x56, 0x78, 0x47, 0x68, 0x55, 0x65, 0x56, \n\t0x54, 0x62, 0x77, 0x79, 0x51, 0x76, 0x6a, 0x5a, 0x43, 0x39, 0x49, 0x2f, 0x57, 0x77, 0x53, 0x6c, 0x35, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x6d, 0x72, 0x65, 0x57, 0x47, 0x75, 0x31, 0x66, 0x73, 0x58, 0x48, 0x51, 0x75, 0x70, 0x79, 0x6e, \n\t0x33, 0x6c, 0x5a, 0x48, 0x4e, 0x6b, 0x79, 0x73, 0x44, 0x4f, 0x77, 0x44, 0x69, 0x42, 0x39, 0x77, 0x31, 0x32, \n\t0x5a, 0x52, 0x45, 0x7a, 0x50, 0x66, 0x7a, 0x49, 0x79, 0x62, 0x4f, 0x79, 0x58, 0x73, 0x64, 0x2b, 0x64, 0x4a, \n\t0x44, 0x30, 0x51, 0x4c, 0x71, 0x4a, 0x50, 0x44, 0x34, 0x51, 0x4a, 0x2f, 0x36, 0x51, 0x72, 0x62, 0x38, 0x5c, 0x0a,\n\t0x09, 0x36, 0x33, 0x73, 0x4e, 0x61, 0x56, 0x72, 0x43, 0x79, 0x50, 0x76, 0x68, 0x48, 0x7a, 0x30, 0x76, 0x4c, \n\t0x52, 0x32, 0x78, 0x6d, 0x6f, 0x41, 0x63, 0x69, 0x34, 0x79, 0x38, 0x2b, 0x76, 0x67, 0x76, 0x4b, 0x44, 0x6a, \n\t0x42, 0x67, 0x47, 0x79, 0x73, 0x45, 0x34, 0x6b, 0x66, 0x31, 0x2f, 0x4c, 0x79, 0x4b, 0x50, 0x76, 0x58, 0x69, \n\t0x47, 0x31, 0x4f, 0x6d, 0x2b, 0x50, 0x4f, 0x4f, 0x31, 0x78, 0x69, 0x70, 0x45, 0x61, 0x58, 0x45, 0x41, 0x5c, 0x0a,\n\t0x09, 0x73, 0x6f, 0x49, 0x63, 0x79, 0x58, 0x36, 0x69, 0x42, 0x61, 0x31, 0x6f, 0x48, 0x46, 0x4d, 0x31, 0x55, \n\t0x31, 0x48, 0x50, 0x55, 0x45, 0x64, 0x5a, 0x78, 0x2f, 0x39, 0x77, 0x6c, 0x75, 0x53, 0x46, 0x36, 0x7a, 0x6c, \n\t0x4d, 0x4a, 0x66, 0x47, 0x2f, 0x2f, 0x68, 0x75, 0x6b, 0x4a, 0x48, 0x48, 0x79, 0x50, 0x36, 0x50, 0x7a, 0x6d, \n\t0x6f, 0x4c, 0x57, 0x35, 0x75, 0x30, 0x31, 0x64, 0x59, 0x4b, 0x64, 0x67, 0x57, 0x48, 0x41, 0x4d, 0x69, 0x5c, 0x0a,\n\t0x09, 0x67, 0x55, 0x6f, 0x57, 0x41, 0x62, 0x45, 0x58, 0x34, 0x74, 0x37, 0x31, 0x37, 0x34, 0x79, 0x63, 0x4f, \n\t0x6b, 0x65, 0x76, 0x75, 0x52, 0x6b, 0x54, 0x6a, 0x68, 0x76, 0x56, 0x32, 0x6b, 0x4c, 0x77, 0x30, 0x42, 0x6b, \n\t0x44, 0x79, 0x52, 0x76, 0x37, 0x2f, 0x36, 0x32, 0x68, 0x76, 0x63, 0x79, 0x51, 0x4d, 0x51, 0x57, 0x66, 0x57, \n\t0x54, 0x56, 0x69, 0x52, 0x32, 0x64, 0x64, 0x45, 0x62, 0x51, 0x49, 0x4e, 0x53, 0x47, 0x72, 0x41, 0x68, 0x5c, 0x0a,\n\t0x09, 0x47, 0x59, 0x55, 0x4d, 0x46, 0x39, 0x52, 0x67, 0x43, 0x6b, 0x4a, 0x2b, 0x36, 0x76, 0x77, 0x74, 0x68, \n\t0x68, 0x37, 0x2b, 0x64, 0x64, 0x47, 0x36, 0x78, 0x43, 0x74, 0x58, 0x6a, 0x48, 0x43, 0x66, 0x65, 0x65, 0x4c, \n\t0x36, 0x30, 0x6e, 0x6c, 0x45, 0x39, 0x4b, 0x4f, 0x75, 0x58, 0x45, 0x4f, 0x5a, 0x6b, 0x58, 0x30, 0x7a, 0x4c, \n\t0x66, 0x63, 0x78, 0x75, 0x79, 0x64, 0x34, 0x44, 0x6b, 0x43, 0x70, 0x71, 0x6b, 0x43, 0x6f, 0x33, 0x67, 0x5c, 0x0a,\n\t0x09, 0x76, 0x67, 0x59, 0x32, 0x55, 0x30, 0x59, 0x30, 0x48, 0x32, 0x52, 0x30, 0x6d, 0x63, 0x75, 0x6a, 0x4b, \n\t0x36, 0x72, 0x74, 0x53, 0x50, 0x39, 0x6a, 0x35, 0x33, 0x57, 0x59, 0x31, 0x53, 0x6d, 0x55, 0x31, 0x67, 0x65, \n\t0x69, 0x78, 0x70, 0x62, 0x4e, 0x61, 0x66, 0x42, 0x4f, 0x4e, 0x56, 0x55, 0x2b, 0x61, 0x57, 0x4f, 0x77, 0x71, \n\t0x54, 0x51, 0x2f, 0x6c, 0x50, 0x55, 0x4f, 0x6a, 0x75, 0x4e, 0x2b, 0x31, 0x34, 0x35, 0x39, 0x6d, 0x38, 0x5c, 0x0a,\n\t0x09, 0x63, 0x57, 0x43, 0x44, 0x35, 0x62, 0x59, 0x32, 0x43, 0x6b, 0x57, 0x67, 0x7a, 0x61, 0x73, 0x30, 0x52, \n\t0x36, 0x39, 0x61, 0x6b, 0x74, 0x6d, 0x77, 0x36, 0x44, 0x51, 0x76, 0x31, 0x41, 0x55, 0x75, 0x76, 0x75, 0x6b, \n\t0x4b, 0x4b, 0x67, 0x4e, 0x65, 0x73, 0x70, 0x4c, 0x45, 0x53, 0x35, 0x65, 0x51, 0x77, 0x36, 0x4e, 0x46, 0x4b, \n\t0x36, 0x32, 0x35, 0x47, 0x71, 0x33, 0x64, 0x58, 0x71, 0x62, 0x61, 0x4e, 0x43, 0x4e, 0x33, 0x33, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x32, 0x79, 0x6f, 0x72, 0x4d, 0x7a, 0x38, 0x41, 0x55, 0x79, 0x7a, 0x71, 0x76, 0x66, 0x4d, 0x38, 0x65, \n\t0x56, 0x6f, 0x6a, 0x4b, 0x57, 0x34, 0x2b, 0x74, 0x2b, 0x33, 0x5a, 0x71, 0x77, 0x63, 0x4e, 0x31, 0x62, 0x43, \n\t0x61, 0x49, 0x48, 0x58, 0x38, 0x2b, 0x62, 0x43, 0x7a, 0x37, 0x55, 0x59, 0x65, 0x73, 0x61, 0x76, 0x71, 0x58, \n\t0x5a, 0x59, 0x42, 0x51, 0x48, 0x2f, 0x6d, 0x5a, 0x46, 0x5a, 0x32, 0x66, 0x67, 0x49, 0x50, 0x41, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x41, 0x4e, 0x2b, 0x43, 0x57, 0x70, 0x54, 0x5a, 0x4c, 0x6a, 0x35, 0x6e, 0x59, 0x6a, 0x6d, 0x76, 0x71, \n\t0x55, 0x65, 0x2f, 0x6a, 0x66, 0x2f, 0x2b, 0x56, 0x4e, 0x35, 0x54, 0x56, 0x42, 0x74, 0x6d, 0x34, 0x74, 0x74, \n\t0x6f, 0x6b, 0x61, 0x41, 0x49, 0x67, 0x66, 0x37, 0x2b, 0x4a, 0x6e, 0x50, 0x30, 0x46, 0x32, 0x79, 0x61, 0x4e, \n\t0x6b, 0x35, 0x61, 0x50, 0x47, 0x74, 0x49, 0x55, 0x39, 0x41, 0x2f, 0x4e, 0x48, 0x62, 0x62, 0x49, 0x52, 0x5c, 0x0a,\n\t0x09, 0x66, 0x4a, 0x69, 0x36, 0x4d, 0x35, 0x61, 0x2f, 0x70, 0x4b, 0x76, 0x79, 0x4e, 0x39, 0x4c, 0x74, 0x49, \n\t0x33, 0x49, 0x6f, 0x52, 0x2f, 0x65, 0x53, 0x78, 0x66, 0x75, 0x59, 0x71, 0x78, 0x2f, 0x31, 0x54, 0x66, 0x71, \n\t0x6e, 0x72, 0x55, 0x71, 0x6d, 0x78, 0x63, 0x65, 0x4d, 0x61, 0x4f, 0x72, 0x31, 0x4e, 0x56, 0x54, 0x63, 0x47, \n\t0x6f, 0x58, 0x4e, 0x30, 0x74, 0x77, 0x33, 0x45, 0x47, 0x48, 0x33, 0x34, 0x4f, 0x32, 0x57, 0x64, 0x64, 0x5c, 0x0a,\n\t0x09, 0x34, 0x42, 0x55, 0x56, 0x66, 0x76, 0x54, 0x31, 0x6a, 0x53, 0x41, 0x45, 0x38, 0x59, 0x50, 0x6e, 0x76, \n\t0x42, 0x65, 0x44, 0x46, 0x55, 0x46, 0x67, 0x57, 0x78, 0x75, 0x2b, 0x4a, 0x66, 0x57, 0x6b, 0x65, 0x6d, 0x34, \n\t0x53, 0x2b, 0x66, 0x45, 0x78, 0x35, 0x46, 0x42, 0x42, 0x6f, 0x69, 0x45, 0x45, 0x5a, 0x62, 0x73, 0x32, 0x6f, \n\t0x39, 0x33, 0x31, 0x62, 0x6a, 0x43, 0x61, 0x4e, 0x50, 0x4d, 0x42, 0x79, 0x33, 0x4b, 0x36, 0x6d, 0x37, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x68, 0x4a, 0x34, 0x47, 0x66, 0x41, 0x73, 0x52, 0x65, 0x4f, 0x45, 0x31, 0x34, 0x56, 0x36, 0x63, \n\t0x44, 0x2b, 0x64, 0x52, 0x43, 0x33, 0x39, 0x68, 0x49, 0x36, 0x41, 0x74, 0x72, 0x7a, 0x65, 0x46, 0x57, 0x59, \n\t0x4b, 0x38, 0x64, 0x76, 0x52, 0x74, 0x48, 0x2b, 0x54, 0x6c, 0x77, 0x42, 0x4d, 0x43, 0x2f, 0x75, 0x68, 0x6c, \n\t0x74, 0x65, 0x59, 0x30, 0x44, 0x2b, 0x64, 0x52, 0x42, 0x71, 0x53, 0x6b, 0x6c, 0x75, 0x48, 0x57, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x65, 0x7a, 0x43, 0x4b, 0x4f, 0x58, 0x62, 0x72, 0x33, 0x48, 0x42, 0x56, 0x32, 0x4a, 0x55, 0x74, \n\t0x61, 0x4d, 0x49, 0x51, 0x65, 0x69, 0x4c, 0x61, 0x39, 0x30, 0x46, 0x6e, 0x45, 0x6d, 0x47, 0x38, 0x4b, 0x75, \n\t0x45, 0x64, 0x71, 0x35, 0x42, 0x6c, 0x41, 0x58, 0x41, 0x4b, 0x50, 0x78, 0x75, 0x78, 0x30, 0x57, 0x50, 0x77, \n\t0x6d, 0x32, 0x6f, 0x36, 0x79, 0x62, 0x54, 0x44, 0x31, 0x41, 0x71, 0x67, 0x70, 0x52, 0x2b, 0x66, 0x53, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x69, 0x68, 0x72, 0x73, 0x55, 0x62, 0x6c, 0x4b, 0x67, 0x43, 0x49, 0x4a, 0x66, 0x57, 0x59, 0x33, \n\t0x57, 0x58, 0x47, 0x33, 0x4f, 0x37, 0x4d, 0x52, 0x6c, 0x7a, 0x39, 0x42, 0x4c, 0x4c, 0x4e, 0x38, 0x44, 0x50, \n\t0x41, 0x57, 0x67, 0x31, 0x73, 0x32, 0x67, 0x37, 0x46, 0x73, 0x62, 0x55, 0x43, 0x71, 0x4c, 0x47, 0x70, 0x61, \n\t0x54, 0x44, 0x71, 0x45, 0x70, 0x68, 0x42, 0x35, 0x62, 0x67, 0x37, 0x37, 0x69, 0x4c, 0x6e, 0x4e, 0x71, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x78, 0x35, 0x36, 0x68, 0x56, 0x36, 0x37, 0x53, 0x77, 0x71, 0x47, 0x54, 0x32, 0x34, 0x42, 0x53, \n\t0x46, 0x30, 0x66, 0x59, 0x6d, 0x54, 0x58, 0x51, 0x56, 0x4b, 0x6e, 0x62, 0x6e, 0x72, 0x68, 0x34, 0x56, 0x35, \n\t0x59, 0x5a, 0x51, 0x6e, 0x42, 0x52, 0x39, 0x66, 0x68, 0x61, 0x38, 0x33, 0x36, 0x2f, 0x54, 0x36, 0x4d, 0x6f, \n\t0x4f, 0x65, 0x36, 0x52, 0x7a, 0x69, 0x65, 0x42, 0x71, 0x67, 0x4b, 0x37, 0x4d, 0x4a, 0x73, 0x6f, 0x79, 0x5c, 0x0a,\n\t0x09, 0x56, 0x53, 0x68, 0x50, 0x63, 0x66, 0x49, 0x2f, 0x36, 0x62, 0x62, 0x6d, 0x52, 0x79, 0x34, 0x73, 0x31, \n\t0x50, 0x45, 0x37, 0x36, 0x31, 0x63, 0x77, 0x6c, 0x2b, 0x71, 0x67, 0x4e, 0x6c, 0x65, 0x74, 0x62, 0x66, 0x6e, \n\t0x38, 0x72, 0x49, 0x39, 0x43, 0x52, 0x6b, 0x49, 0x69, 0x33, 0x73, 0x7a, 0x77, 0x50, 0x66, 0x49, 0x39, 0x4f, \n\t0x55, 0x53, 0x56, 0x32, 0x35, 0x52, 0x57, 0x54, 0x2f, 0x4b, 0x79, 0x51, 0x50, 0x58, 0x35, 0x70, 0x51, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x31, 0x64, 0x72, 0x71, 0x79, 0x4c, 0x77, 0x59, 0x42, 0x75, 0x2b, 0x52, 0x64, 0x6b, 0x76, 0x69, \n\t0x69, 0x69, 0x47, 0x2f, 0x37, 0x74, 0x71, 0x6c, 0x78, 0x56, 0x69, 0x6f, 0x6f, 0x63, 0x51, 0x57, 0x6a, 0x4b, \n\t0x43, 0x73, 0x79, 0x58, 0x47, 0x31, 0x50, 0x55, 0x68, 0x59, 0x6f, 0x65, 0x36, 0x53, 0x58, 0x54, 0x31, 0x6b, \n\t0x4c, 0x34, 0x34, 0x35, 0x49, 0x71, 0x4a, 0x55, 0x6c, 0x6d, 0x43, 0x74, 0x71, 0x77, 0x65, 0x2f, 0x35, 0x5c, 0x0a,\n\t0x09, 0x70, 0x6d, 0x74, 0x4d, 0x61, 0x38, 0x4a, 0x50, 0x73, 0x49, 0x52, 0x67, 0x54, 0x76, 0x48, 0x6e, 0x75, \n\t0x6c, 0x4d, 0x79, 0x62, 0x72, 0x47, 0x4d, 0x6b, 0x57, 0x34, 0x4a, 0x73, 0x55, 0x56, 0x4c, 0x66, 0x53, 0x66, \n\t0x57, 0x2b, 0x52, 0x50, 0x48, 0x4f, 0x4e, 0x31, 0x4e, 0x55, 0x42, 0x30, 0x6a, 0x65, 0x48, 0x6b, 0x59, 0x6b, \n\t0x55, 0x78, 0x4a, 0x4b, 0x49, 0x55, 0x6a, 0x2b, 0x69, 0x4c, 0x49, 0x42, 0x61, 0x4f, 0x78, 0x31, 0x74, 0x5c, 0x0a,\n\t0x09, 0x37, 0x69, 0x7a, 0x55, 0x68, 0x70, 0x6d, 0x46, 0x50, 0x4d, 0x38, 0x41, 0x33, 0x38, 0x48, 0x77, 0x39, \n\t0x34, 0x6b, 0x70, 0x4f, 0x4d, 0x6b, 0x48, 0x67, 0x54, 0x36, 0x53, 0x4f, 0x63, 0x77, 0x54, 0x47, 0x38, 0x64, \n\t0x42, 0x6f, 0x49, 0x51, 0x30, 0x44, 0x68, 0x45, 0x39, 0x38, 0x48, 0x59, 0x37, 0x43, 0x44, 0x51, 0x57, 0x79, \n\t0x6a, 0x46, 0x4b, 0x2f, 0x79, 0x73, 0x77, 0x43, 0x73, 0x68, 0x7a, 0x4d, 0x4d, 0x71, 0x51, 0x35, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x64, 0x2b, 0x47, 0x4b, 0x4d, 0x6b, 0x63, 0x67, 0x37, 0x6a, 0x77, 0x2f, 0x6f, 0x77, 0x38, 0x43, 0x4a, \n\t0x54, 0x63, 0x4a, 0x52, 0x72, 0x71, 0x67, 0x78, 0x38, 0x32, 0x2b, 0x41, 0x64, 0x66, 0x39, 0x72, 0x77, 0x6a, \n\t0x6f, 0x47, 0x33, 0x4f, 0x2b, 0x34, 0x59, 0x65, 0x4c, 0x76, 0x6a, 0x76, 0x31, 0x52, 0x75, 0x30, 0x4a, 0x66, \n\t0x6c, 0x45, 0x5a, 0x54, 0x74, 0x41, 0x41, 0x41, 0x41, 0x41, 0x45, 0x6c, 0x46, 0x54, 0x6b, 0x53, 0x75, 0x5c, 0x0a,\n\t0x09, 0x51, 0x6d, 0x43, 0x43, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x6e, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5b, 0x31, 0x5d, 0x2e, 0x6e, 0x5f, 0x70, 0x6e, 0x67, 0x20, \n\t0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, \n\t0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x22, 0x2c, \n\t0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x42, 0x77, 0x41, 0x41, 0x41, 0x41, 0x63, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x42, 0x79, 0x44, 0x64, 0x2b, 0x55, 0x41, 0x41, 0x41, 0x44, 0x62, 0x45, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x49, 0x69, 0x64, 0x57, 0x57, 0x54, 0x57, 0x78, 0x55, 0x56, 0x52, 0x53, 0x41, 0x76, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x76, 0x2b, 0x5a, 0x74, 0x36, 0x30, 0x64, 0x43, 0x68, 0x51, 0x57, 0x6c, 0x4e, 0x70, 0x42, 0x31, 0x4e, \n\t0x71, 0x46, 0x39, 0x61, 0x69, 0x6d, 0x46, 0x61, 0x6a, 0x4d, 0x6a, 0x56, 0x52, 0x73, 0x53, 0x57, 0x77, 0x55, \n\t0x45, 0x4a, 0x63, 0x59, 0x49, 0x30, 0x4c, 0x4e, 0x4e, 0x47, 0x34, 0x4d, 0x4a, 0x6a, 0x6f, 0x6f, 0x6a, 0x48, \n\t0x47, 0x2b, 0x4c, 0x64, 0x67, 0x5a, 0x33, 0x54, 0x58, 0x47, 0x44, 0x45, 0x6d, 0x52, 0x75, 0x4f, 0x43, 0x5c, 0x0a,\n\t0x09, 0x61, 0x44, 0x43, 0x41, 0x66, 0x78, 0x69, 0x6a, 0x45, 0x57, 0x50, 0x34, 0x53, 0x52, 0x63, 0x43, 0x42, \n\t0x51, 0x70, 0x46, 0x2b, 0x62, 0x48, 0x54, 0x54, 0x70, 0x6d, 0x5a, 0x4e, 0x39, 0x50, 0x33, 0x64, 0x31, 0x33, \n\t0x4d, 0x31, 0x4f, 0x6e, 0x30, 0x64, 0x56, 0x34, 0x48, 0x59, 0x67, 0x69, 0x65, 0x35, 0x4f, 0x57, 0x39, 0x64, \n\t0x2b, 0x34, 0x39, 0x35, 0x7a, 0x76, 0x6e, 0x33, 0x66, 0x76, 0x4f, 0x75, 0x55, 0x4a, 0x4b, 0x79, 0x59, 0x5c, 0x0a,\n\t0x09, 0x30, 0x55, 0x35, 0x59, 0x62, 0x53, 0x62, 0x6d, 0x62, 0x67, 0x57, 0x6d, 0x41, 0x59, 0x4f, 0x41, 0x53, \n\t0x6b, 0x41, 0x46, 0x6d, 0x36, 0x55, 0x69, 0x58, 0x64, 0x4d, 0x4a, 0x43, 0x6f, 0x78, 0x5a, 0x46, 0x59, 0x59, \n\t0x67, 0x32, 0x62, 0x67, 0x58, 0x65, 0x42, 0x70, 0x32, 0x53, 0x6d, 0x6f, 0x4e, 0x70, 0x48, 0x7a, 0x75, 0x47, \n\t0x4f, 0x58, 0x55, 0x61, 0x6d, 0x38, 0x2b, 0x44, 0x36, 0x69, 0x4f, 0x55, 0x6d, 0x61, 0x6d, 0x49, 0x56, 0x5c, 0x0a,\n\t0x09, 0x52, 0x6b, 0x38, 0x62, 0x53, 0x6e, 0x4f, 0x44, 0x42, 0x50, 0x59, 0x41, 0x72, 0x77, 0x4b, 0x58, 0x72, \n\t0x67, 0x65, 0x59, 0x42, 0x44, 0x37, 0x33, 0x30, 0x31, 0x5a, 0x54, 0x2f, 0x72, 0x50, 0x44, 0x4f, 0x50, 0x76, \n\t0x48, 0x6b, 0x4c, 0x5a, 0x58, 0x78, 0x59, 0x74, 0x41, 0x66, 0x32, 0x41, 0x4e, 0x35, 0x70, 0x4f, 0x39, 0x71, \n\t0x47, 0x30, 0x72, 0x4a, 0x34, 0x45, 0x6e, 0x67, 0x42, 0x2b, 0x76, 0x42, 0x66, 0x67, 0x6f, 0x38, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x55, 0x7a, 0x65, 0x73, 0x48, 0x49, 0x37, 0x66, 0x34, 0x57, 0x6d, 0x53, 0x70, 0x55, 0x43, 0x36, 0x72, \n\t0x53, 0x6d, 0x61, 0x34, 0x53, 0x66, 0x62, 0x61, 0x50, 0x36, 0x47, 0x50, 0x64, 0x73, 0x38, 0x42, 0x57, 0x34, \n\t0x45, 0x41, 0x74, 0x77, 0x41, 0x52, 0x77, 0x31, 0x44, 0x6c, 0x32, 0x50, 0x70, 0x35, 0x37, 0x66, 0x54, 0x2f, \n\t0x53, 0x39, 0x57, 0x75, 0x43, 0x7a, 0x52, 0x64, 0x7a, 0x5a, 0x79, 0x2f, 0x52, 0x72, 0x58, 0x66, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x41, 0x4f, 0x75, 0x42, 0x38, 0x66, 0x6c, 0x6a, 0x69, 0x32, 0x32, 0x61, 0x39, 0x2f, 0x31, 0x55, 0x4e, \n\t0x70, 0x37, 0x62, 0x2f, 0x56, 0x31, 0x4e, 0x4d, 0x4b, 0x45, 0x71, 0x4b, 0x4b, 0x76, 0x4e, 0x43, 0x6c, 0x31, \n\t0x2b, 0x35, 0x44, 0x65, 0x63, 0x30, 0x51, 0x74, 0x78, 0x34, 0x41, 0x4d, 0x57, 0x4a, 0x4c, 0x51, 0x51, 0x65, \n\t0x41, 0x38, 0x77, 0x6d, 0x50, 0x2f, 0x30, 0x56, 0x32, 0x52, 0x36, 0x74, 0x75, 0x7a, 0x55, 0x31, 0x47, 0x5c, 0x0a,\n\t0x09, 0x68, 0x34, 0x37, 0x33, 0x46, 0x69, 0x75, 0x35, 0x4b, 0x49, 0x4f, 0x72, 0x33, 0x43, 0x49, 0x50, 0x4c, \n\t0x4d, 0x42, 0x75, 0x49, 0x6a, 0x51, 0x36, 0x69, 0x64, 0x4b, 0x38, 0x70, 0x4b, 0x58, 0x35, 0x49, 0x66, 0x2b, \n\t0x52, 0x6b, 0x38, 0x66, 0x77, 0x41, 0x68, 0x4e, 0x6f, 0x51, 0x42, 0x68, 0x2f, 0x7a, 0x70, 0x48, 0x4d, 0x37, \n\t0x42, 0x4d, 0x35, 0x56, 0x5a, 0x72, 0x49, 0x69, 0x69, 0x4a, 0x70, 0x71, 0x49, 0x39, 0x48, 0x64, 0x52, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x2b, 0x59, 0x67, 0x59, 0x6d, 0x57, 0x30, 0x50, 0x47, 0x5a, 0x6f, 0x78, 0x58, 0x74, 0x54, 0x72, \n\t0x4d, 0x4c, 0x47, 0x47, 0x35, 0x76, 0x47, 0x4f, 0x54, 0x34, 0x42, 0x38, 0x48, 0x51, 0x59, 0x38, 0x43, 0x48, \n\t0x6e, 0x32, 0x48, 0x6d, 0x6b, 0x56, 0x2f, 0x31, 0x54, 0x61, 0x68, 0x30, 0x74, 0x31, 0x41, 0x39, 0x76, 0x51, \n\t0x6a, 0x51, 0x59, 0x41, 0x4d, 0x69, 0x38, 0x58, 0x51, 0x52, 0x47, 0x39, 0x4d, 0x42, 0x63, 0x2b, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x64, 0x78, 0x67, 0x50, 0x34, 0x77, 0x59, 0x4b, 0x63, 0x33, 0x6e, 0x71, 0x6f, 0x4b, 0x63, 0x2f, 0x2f, \n\t0x34, 0x43, 0x2b, 0x66, 0x6f, 0x4f, 0x62, 0x53, 0x4f, 0x46, 0x75, 0x70, 0x65, 0x65, 0x52, 0x69, 0x68, 0x71, \n\t0x30, 0x69, 0x72, 0x42, 0x49, 0x78, 0x71, 0x67, 0x66, 0x6e, 0x2b, 0x52, 0x42, 0x71, 0x67, 0x4d, 0x77, 0x78, \n\t0x6f, 0x79, 0x47, 0x7a, 0x77, 0x46, 0x35, 0x41, 0x46, 0x74, 0x2f, 0x69, 0x67, 0x4b, 0x65, 0x54, 0x65, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x51, 0x62, 0x33, 0x78, 0x45, 0x58, 0x30, 0x4f, 0x39, 0x64, 0x67, 0x76, 0x72, 0x51, 0x52, 0x58, \n\t0x4b, 0x38, 0x45, 0x44, 0x47, 0x59, 0x6f, 0x63, 0x7a, 0x5a, 0x41, 0x4a, 0x41, 0x77, 0x34, 0x69, 0x32, 0x6b, \n\t0x45, 0x55, 0x37, 0x76, 0x71, 0x46, 0x4a, 0x33, 0x47, 0x6f, 0x6b, 0x6a, 0x4c, 0x4a, 0x66, 0x76, 0x32, 0x41, \n\t0x62, 0x77, 0x2f, 0x70, 0x34, 0x6b, 0x38, 0x32, 0x45, 0x6c, 0x6b, 0x6f, 0x43, 0x63, 0x34, 0x66, 0x30, 0x5c, 0x0a,\n\t0x09, 0x34, 0x69, 0x4b, 0x6f, 0x41, 0x64, 0x42, 0x6a, 0x79, 0x70, 0x74, 0x6a, 0x59, 0x47, 0x49, 0x33, 0x55, \n\t0x38, 0x5a, 0x4e, 0x35, 0x42, 0x78, 0x45, 0x72, 0x72, 0x4e, 0x6c, 0x55, 0x67, 0x2b, 0x39, 0x62, 0x58, 0x2b, \n\t0x47, 0x6b, 0x4c, 0x74, 0x62, 0x6d, 0x68, 0x71, 0x43, 0x73, 0x34, 0x41, 0x54, 0x75, 0x31, 0x64, 0x54, 0x6e, \n\t0x41, 0x79, 0x54, 0x44, 0x67, 0x44, 0x33, 0x70, 0x50, 0x32, 0x36, 0x4c, 0x42, 0x53, 0x73, 0x74, 0x47, 0x5c, 0x0a,\n\t0x09, 0x71, 0x53, 0x2f, 0x76, 0x54, 0x6e, 0x38, 0x69, 0x51, 0x2f, 0x61, 0x4e, 0x72, 0x2f, 0x44, 0x54, 0x56, \n\t0x76, 0x46, 0x39, 0x79, 0x67, 0x72, 0x59, 0x61, 0x4e, 0x32, 0x33, 0x41, 0x6e, 0x77, 0x66, 0x42, 0x76, 0x78, \n\t0x49, 0x76, 0x53, 0x57, 0x4f, 0x64, 0x6d, 0x39, 0x72, 0x77, 0x4e, 0x68, 0x50, 0x58, 0x55, 0x55, 0x36, 0x62, \n\t0x6f, 0x58, 0x4f, 0x4f, 0x7a, 0x56, 0x4e, 0x35, 0x72, 0x57, 0x39, 0x57, 0x48, 0x74, 0x2b, 0x77, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x74, 0x53, 0x57, 0x61, 0x2b, 0x56, 0x31, 0x53, 0x5a, 0x47, 0x33, 0x32, 0x31, 0x51, 0x4c, 0x4f, 0x6a, \n\t0x2f, 0x79, 0x6d, 0x4b, 0x6c, 0x62, 0x5a, 0x39, 0x33, 0x39, 0x75, 0x2b, 0x42, 0x7a, 0x4b, 0x36, 0x39, 0x53, \n\t0x4b, 0x64, 0x63, 0x72, 0x4d, 0x55, 0x79, 0x48, 0x57, 0x46, 0x71, 0x2b, 0x46, 0x66, 0x79, 0x67, 0x57, 0x41, \n\t0x57, 0x6b, 0x39, 0x6a, 0x4c, 0x53, 0x53, 0x4c, 0x4a, 0x72, 0x6e, 0x33, 0x53, 0x6c, 0x35, 0x75, 0x46, 0x5c, 0x0a,\n\t0x09, 0x49, 0x71, 0x70, 0x6d, 0x43, 0x50, 0x43, 0x38, 0x75, 0x72, 0x5a, 0x70, 0x4a, 0x76, 0x70, 0x63, 0x58, \n\t0x34, 0x56, 0x53, 0x5a, 0x70, 0x79, 0x61, 0x59, 0x63, 0x62, 0x67, 0x4f, 0x69, 0x4c, 0x4a, 0x72, 0x68, 0x6e, \n\t0x67, 0x68, 0x66, 0x6d, 0x77, 0x61, 0x73, 0x42, 0x78, 0x59, 0x48, 0x74, 0x30, 0x55, 0x37, 0x64, 0x74, 0x76, \n\t0x6e, 0x67, 0x2f, 0x51, 0x72, 0x32, 0x32, 0x51, 0x34, 0x47, 0x78, 0x35, 0x58, 0x62, 0x71, 0x64, 0x76, 0x5c, 0x0a,\n\t0x09, 0x62, 0x62, 0x77, 0x48, 0x59, 0x57, 0x46, 0x47, 0x34, 0x49, 0x37, 0x34, 0x63, 0x62, 0x67, 0x53, 0x2f, \n\t0x63, 0x73, 0x55, 0x75, 0x72, 0x72, 0x41, 0x39, 0x2f, 0x77, 0x54, 0x74, 0x2b, 0x4a, 0x52, 0x53, 0x6b, 0x74, \n\t0x43, 0x33, 0x44, 0x33, 0x4e, 0x47, 0x4c, 0x63, 0x56, 0x2f, 0x48, 0x4a, 0x4c, 0x41, 0x4e, 0x58, 0x78, 0x35, \n\t0x69, 0x51, 0x58, 0x5a, 0x4c, 0x41, 0x51, 0x46, 0x61, 0x4b, 0x48, 0x62, 0x38, 0x49, 0x66, 0x66, 0x45, 0x5c, 0x0a,\n\t0x09, 0x52, 0x57, 0x45, 0x66, 0x50, 0x6f, 0x4e, 0x33, 0x65, 0x68, 0x4a, 0x2f, 0x30, 0x67, 0x4a, 0x66, 0x49, \n\t0x68, 0x70, 0x4e, 0x31, 0x50, 0x5a, 0x47, 0x39, 0x4c, 0x76, 0x62, 0x4d, 0x64, 0x61, 0x33, 0x65, 0x32, 0x6a, \n\t0x4b, 0x78, 0x78, 0x51, 0x37, 0x2f, 0x75, 0x56, 0x71, 0x44, 0x70, 0x63, 0x43, 0x7a, 0x6b, 0x6b, 0x43, 0x32, \n\t0x41, 0x45, 0x38, 0x41, 0x74, 0x77, 0x42, 0x7a, 0x4c, 0x57, 0x47, 0x4b, 0x57, 0x41, 0x55, 0x4f, 0x41, 0x5c, 0x0a,\n\t0x09, 0x68, 0x38, 0x67, 0x70, 0x52, 0x6e, 0x45, 0x63, 0x47, 0x73, 0x72, 0x67, 0x66, 0x34, 0x6e, 0x38, 0x6c, \n\t0x4e, 0x65, 0x30, 0x7a, 0x38, 0x2f, 0x77, 0x4c, 0x2f, 0x41, 0x57, 0x6b, 0x4f, 0x52, 0x46, 0x55, 0x4e, 0x62, \n\t0x47, 0x57, 0x2b, 0x41, 0x41, 0x41, 0x41, 0x41, 0x45, 0x6c, 0x46, 0x54, 0x6b, 0x53, 0x75, 0x51, 0x6d, 0x43, \n\t0x43, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x6e, 0x40, 0x32, 0x78, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5b, 0x32, 0x5d, 0x2e, 0x6e, 0x5f, 0x70, 0x6e, 0x67, 0x20, \n\t0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, \n\t0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x22, 0x2c, \n\t0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x44, 0x67, 0x41, 0x41, 0x41, 0x41, 0x34, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x43, 0x6f, 0x68, 0x6a, 0x73, 0x65, 0x41, 0x41, 0x41, 0x48, 0x61, 0x45, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x6f, 0x67, 0x65, 0x32, 0x61, 0x61, 0x32, 0x77, 0x55, 0x31, 0x78, 0x58, 0x48, 0x66, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x50, 0x59, 0x39, 0x39, 0x72, 0x67, 0x45, 0x41, 0x64, 0x44, 0x6a, 0x54, 0x45, 0x42, 0x48, 0x45, 0x67, \n\t0x62, 0x77, 0x69, 0x73, 0x45, 0x4e, 0x53, 0x6d, 0x50, 0x55, 0x4a, 0x53, 0x59, 0x43, 0x73, 0x6c, 0x52, 0x71, \n\t0x5a, 0x4b, 0x32, 0x6e, 0x35, 0x71, 0x6f, 0x71, 0x6c, 0x52, 0x46, 0x31, 0x43, 0x70, 0x70, 0x30, 0x79, 0x70, \n\t0x38, 0x71, 0x50, 0x6f, 0x42, 0x4e, 0x61, 0x55, 0x4e, 0x54, 0x5a, 0x58, 0x48, 0x4a, 0x30, 0x52, 0x56, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x53, 0x6c, 0x49, 0x6c, 0x55, 0x4c, 0x56, 0x31, 0x4f, 0x52, 0x56, 0x53, 0x45, 0x78, 0x46, 0x41, \n\t0x7a, 0x56, 0x4a, 0x52, 0x45, 0x4a, 0x71, 0x58, 0x6a, 0x48, 0x51, 0x32, 0x42, 0x51, 0x33, 0x78, 0x73, 0x62, \n\t0x65, 0x39, 0x38, 0x37, 0x4d, 0x37, 0x59, 0x66, 0x78, 0x37, 0x4d, 0x37, 0x69, 0x6e, 0x64, 0x6e, 0x5a, 0x39, \n\t0x57, 0x35, 0x54, 0x52, 0x2f, 0x35, 0x2f, 0x75, 0x6e, 0x50, 0x76, 0x75, 0x66, 0x65, 0x65, 0x2f, 0x39, 0x5c, 0x0a,\n\t0x09, 0x77, 0x37, 0x35, 0x35, 0x35, 0x37, 0x7a, 0x6b, 0x68, 0x43, 0x43, 0x44, 0x37, 0x50, 0x6b, 0x44, 0x39, \n\t0x72, 0x42, 0x57, 0x71, 0x4e, 0x61, 0x59, 0x4a, 0x54, 0x48, 0x64, 0x4d, 0x45, 0x70, 0x7a, 0x72, 0x55, 0x47, \n\t0x6f, 0x31, 0x37, 0x43, 0x33, 0x41, 0x2f, 0x73, 0x41, 0x5a, 0x59, 0x42, 0x69, 0x77, 0x41, 0x47, 0x6f, 0x48, \n\t0x67, 0x65, 0x48, 0x73, 0x57, 0x47, 0x41, 0x44, 0x2b, 0x42, 0x62, 0x77, 0x50, 0x6e, 0x41, 0x44, 0x65, 0x5c, 0x0a,\n\t0x09, 0x41, 0x50, 0x35, 0x64, 0x62, 0x55, 0x57, 0x6b, 0x4b, 0x68, 0x34, 0x54, 0x64, 0x63, 0x42, 0x44, 0x77, \n\t0x4b, 0x50, 0x41, 0x33, 0x59, 0x42, 0x55, 0x5a, 0x6e, 0x38, 0x42, 0x76, 0x41, 0x50, 0x73, 0x41, 0x31, 0x34, \n\t0x43, 0x34, 0x74, 0x56, 0x51, 0x71, 0x68, 0x6f, 0x45, 0x6f, 0x38, 0x42, 0x6a, 0x77, 0x49, 0x2b, 0x41, 0x6d, \n\t0x79, 0x61, 0x30, 0x5a, 0x6e, 0x58, 0x30, 0x4b, 0x79, 0x4d, 0x59, 0x77, 0x33, 0x46, 0x45, 0x4b, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x73, 0x2b, 0x71, 0x34, 0x54, 0x63, 0x45, 0x45, 0x5a, 0x75, 0x72, 0x45, 0x65, 0x65, 0x47, 0x53, 0x34, \n\t0x32, 0x35, 0x67, 0x6a, 0x77, 0x4b, 0x2b, 0x41, 0x33, 0x54, 0x4a, 0x4c, 0x6f, 0x5a, 0x41, 0x6c, 0x32, 0x41, \n\t0x4d, 0x38, 0x43, 0x58, 0x37, 0x42, 0x58, 0x61, 0x6d, 0x65, 0x76, 0x6b, 0x44, 0x6e, 0x52, 0x68, 0x2f, 0x62, \n\t0x42, 0x46, 0x59, 0x79, 0x7a, 0x31, 0x78, 0x43, 0x61, 0x34, 0x54, 0x69, 0x41, 0x50, 0x43, 0x65, 0x43, 0x5c, 0x0a,\n\t0x09, 0x63, 0x76, 0x73, 0x74, 0x2b, 0x46, 0x62, 0x4e, 0x78, 0x37, 0x2b, 0x79, 0x46, 0x53, 0x6b, 0x53, 0x73, \n\t0x44, 0x66, 0x33, 0x59, 0x37, 0x36, 0x38, 0x67, 0x35, 0x55, 0x71, 0x57, 0x43, 0x6e, 0x42, 0x49, 0x50, 0x41, \n\t0x63, 0x38, 0x45, 0x69, 0x75, 0x52, 0x6a, 0x4e, 0x49, 0x64, 0x2f, 0x65, 0x53, 0x66, 0x75, 0x56, 0x44, 0x39, \n\t0x48, 0x50, 0x44, 0x6c, 0x53, 0x6b, 0x54, 0x39, 0x65, 0x48, 0x62, 0x74, 0x4a, 0x44, 0x51, 0x31, 0x68, 0x5c, 0x0a,\n\t0x09, 0x58, 0x49, 0x73, 0x2b, 0x76, 0x74, 0x54, 0x66, 0x75, 0x41, 0x37, 0x77, 0x4f, 0x70, 0x73, 0x73, 0x65, \n\t0x73, 0x67, 0x47, 0x41, 0x6a, 0x38, 0x42, 0x71, 0x77, 0x77, 0x71, 0x72, 0x49, 0x76, 0x6e, 0x65, 0x4a, 0x78, \n\t0x4e, 0x35, 0x6a, 0x47, 0x4a, 0x64, 0x47, 0x79, 0x78, 0x32, 0x72, 0x75, 0x46, 0x4a, 0x2b, 0x42, 0x58, 0x2f, \n\t0x48, 0x55, 0x6b, 0x4c, 0x62, 0x37, 0x6b, 0x49, 0x4b, 0x2b, 0x61, 0x33, 0x71, 0x48, 0x6d, 0x41, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x38, 0x4a, 0x2b, 0x79, 0x78, 0x69, 0x71, 0x54, 0x59, 0x44, 0x50, 0x77, 0x56, 0x36, 0x41, 0x4e, 0x51, \n\t0x4b, 0x53, 0x79, 0x4a, 0x50, 0x59, 0x64, 0x4a, 0x64, 0x4e, 0x31, 0x72, 0x70, 0x77, 0x78, 0x50, 0x45, 0x4f, \n\t0x65, 0x58, 0x30, 0x2b, 0x6b, 0x63, 0x79, 0x50, 0x71, 0x6f, 0x69, 0x61, 0x72, 0x36, 0x67, 0x7a, 0x77, 0x56, \n\t0x65, 0x41, 0x54, 0x72, 0x32, 0x4f, 0x55, 0x51, 0x33, 0x41, 0x47, 0x30, 0x49, 0x31, 0x70, 0x39, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x46, 0x47, 0x45, 0x73, 0x52, 0x32, 0x64, 0x61, 0x48, 0x2f, 0x63, 0x38, 0x69, 0x37, 0x78, 0x68, 0x56, \n\t0x41, 0x43, 0x69, 0x69, 0x45, 0x4f, 0x39, 0x66, 0x68, 0x76, 0x37, 0x66, 0x4e, 0x71, 0x6a, 0x6f, 0x4e, 0x66, \n\t0x42, 0x6e, 0x77, 0x74, 0x46, 0x32, 0x38, 0x48, 0x76, 0x51, 0x53, 0x70, 0x75, 0x6b, 0x32, 0x79, 0x51, 0x33, \n\t0x46, 0x47, 0x4e, 0x76, 0x35, 0x70, 0x35, 0x71, 0x54, 0x41, 0x78, 0x42, 0x70, 0x6e, 0x66, 0x6a, 0x75, 0x5c, 0x0a,\n\t0x09, 0x74, 0x30, 0x69, 0x2f, 0x33, 0x57, 0x74, 0x56, 0x66, 0x52, 0x48, 0x59, 0x6a, 0x38, 0x64, 0x6a, 0x79, \n\t0x43, 0x76, 0x42, 0x54, 0x73, 0x7a, 0x39, 0x6a, 0x34, 0x69, 0x6c, 0x69, 0x66, 0x33, 0x69, 0x31, 0x61, 0x70, \n\t0x39, 0x62, 0x35, 0x35, 0x67, 0x43, 0x42, 0x4a, 0x50, 0x64, 0x35, 0x4d, 0x35, 0x32, 0x57, 0x66, 0x56, 0x74, \n\t0x41, 0x50, 0x62, 0x76, 0x58, 0x54, 0x31, 0x73, 0x6b, 0x56, 0x62, 0x67, 0x46, 0x34, 0x67, 0x42, 0x42, 0x5c, 0x0a,\n\t0x09, 0x44, 0x62, 0x38, 0x7a, 0x72, 0x5a, 0x77, 0x33, 0x33, 0x75, 0x50, 0x57, 0x6f, 0x45, 0x4b, 0x65, 0x71, \n\t0x6a, 0x62, 0x73, 0x2f, 0x58, 0x55, 0x5a, 0x70, 0x6d, 0x41, 0x4b, 0x53, 0x42, 0x4a, 0x63, 0x42, 0x46, 0x74, \n\t0x7a, 0x35, 0x65, 0x56, 0x76, 0x41, 0x70, 0x78, 0x73, 0x6d, 0x6c, 0x6a, 0x35, 0x36, 0x70, 0x43, 0x54, 0x6b, \n\t0x70, 0x72, 0x4b, 0x4b, 0x75, 0x6d, 0x49, 0x31, 0x30, 0x63, 0x39, 0x42, 0x56, 0x54, 0x73, 0x53, 0x79, 0x5c, 0x0a,\n\t0x09, 0x78, 0x4a, 0x38, 0x37, 0x41, 0x75, 0x61, 0x69, 0x42, 0x49, 0x42, 0x64, 0x4a, 0x63, 0x63, 0x75, 0x73, \n\t0x59, 0x4a, 0x74, 0x6d, 0x4b, 0x73, 0x6e, 0x69, 0x55, 0x53, 0x47, 0x30, 0x65, 0x30, 0x48, 0x4d, 0x4b, 0x34, \n\t0x6d, 0x58, 0x41, 0x66, 0x30, 0x64, 0x79, 0x77, 0x6c, 0x73, 0x50, 0x34, 0x32, 0x74, 0x50, 0x4f, 0x44, 0x70, \n\t0x48, 0x37, 0x2f, 0x44, 0x38, 0x52, 0x59, 0x31, 0x6c, 0x32, 0x42, 0x73, 0x45, 0x72, 0x64, 0x4d, 0x39, 0x5c, 0x0a,\n\t0x09, 0x74, 0x51, 0x6d, 0x6d, 0x59, 0x67, 0x4d, 0x68, 0x70, 0x6a, 0x4f, 0x77, 0x2b, 0x57, 0x2f, 0x4c, 0x62, \n\t0x44, 0x4f, 0x39, 0x59, 0x54, 0x32, 0x4c, 0x44, 0x45, 0x65, 0x6c, 0x79, 0x43, 0x61, 0x56, 0x32, 0x4c, 0x6f, \n\t0x74, 0x51, 0x4b, 0x2f, 0x6f, 0x44, 0x78, 0x6a, 0x7a, 0x6e, 0x31, 0x2b, 0x6f, 0x63, 0x6c, 0x79, 0x63, 0x6b, \n\t0x74, 0x64, 0x55, 0x51, 0x65, 0x58, 0x59, 0x65, 0x36, 0x61, 0x44, 0x62, 0x42, 0x42, 0x2b, 0x36, 0x67, 0x5c, 0x0a,\n\t0x09, 0x37, 0x70, 0x63, 0x50, 0x49, 0x72, 0x66, 0x57, 0x75, 0x2f, 0x64, 0x70, 0x72, 0x72, 0x65, 0x32, 0x48, \n\t0x4a, 0x4a, 0x66, 0x52, 0x62, 0x31, 0x7a, 0x62, 0x67, 0x6d, 0x56, 0x49, 0x4c, 0x58, 0x2f, 0x4a, 0x4f, 0x53, \n\t0x39, 0x6f, 0x38, 0x64, 0x63, 0x78, 0x33, 0x64, 0x70, 0x38, 0x77, 0x45, 0x50, 0x41, 0x36, 0x41, 0x5a, 0x5a, \n\t0x46, 0x34, 0x35, 0x58, 0x58, 0x4a, 0x69, 0x75, 0x54, 0x46, 0x53, 0x38, 0x4b, 0x77, 0x30, 0x4e, 0x31, 0x5c, 0x0a,\n\t0x09, 0x43, 0x2f, 0x36, 0x30, 0x47, 0x55, 0x5a, 0x59, 0x32, 0x4f, 0x66, 0x55, 0x52, 0x57, 0x4b, 0x33, 0x69, \n\t0x57, 0x51, 0x67, 0x45, 0x48, 0x79, 0x54, 0x79, 0x4d, 0x2f, 0x68, 0x69, 0x5a, 0x6e, 0x74, 0x79, 0x6e, 0x38, \n\t0x6d, 0x31, 0x63, 0x62, 0x6b, 0x56, 0x75, 0x42, 0x4e, 0x63, 0x7a, 0x37, 0x6a, 0x78, 0x6e, 0x50, 0x2f, 0x71, \n\t0x6b, 0x35, 0x4f, 0x6f, 0x35, 0x51, 0x61, 0x6f, 0x4c, 0x55, 0x72, 0x64, 0x7a, 0x4b, 0x2b, 0x72, 0x71, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x63, 0x55, 0x46, 0x34, 0x6f, 0x56, 0x62, 0x57, 0x41, 0x72, 0x35, 0x50, 0x49, 0x32, 0x62, 0x36, \n\t0x54, 0x35, 0x72, 0x46, 0x52, 0x75, 0x41, 0x64, 0x55, 0x35, 0x79, 0x62, 0x67, 0x52, 0x7a, 0x6e, 0x54, 0x4c, \n\t0x48, 0x4a, 0x32, 0x64, 0x59, 0x70, 0x4a, 0x43, 0x50, 0x36, 0x49, 0x2f, 0x62, 0x55, 0x56, 0x63, 0x31, 0x54, \n\t0x57, 0x67, 0x54, 0x73, 0x52, 0x73, 0x49, 0x42, 0x72, 0x30, 0x52, 0x31, 0x48, 0x6f, 0x47, 0x38, 0x72, 0x5c, 0x0a,\n\t0x09, 0x63, 0x54, 0x32, 0x4f, 0x41, 0x6b, 0x35, 0x30, 0x5a, 0x77, 0x6a, 0x56, 0x58, 0x51, 0x7a, 0x77, 0x78, \n\t0x36, 0x6d, 0x6e, 0x51, 0x43, 0x39, 0x50, 0x77, 0x74, 0x51, 0x67, 0x72, 0x35, 0x69, 0x44, 0x37, 0x2b, 0x41, \n\t0x4d, 0x72, 0x74, 0x4e, 0x78, 0x65, 0x49, 0x69, 0x49, 0x52, 0x57, 0x4b, 0x42, 0x66, 0x32, 0x34, 0x77, 0x55, \n\t0x69, 0x71, 0x61, 0x46, 0x66, 0x7a, 0x4c, 0x6d, 0x6c, 0x71, 0x35, 0x7a, 0x6b, 0x33, 0x41, 0x6a, 0x65, 0x5c, 0x0a,\n\t0x09, 0x43, 0x6f, 0x42, 0x6d, 0x59, 0x4a, 0x77, 0x66, 0x38, 0x54, 0x54, 0x70, 0x6a, 0x55, 0x67, 0x65, 0x66, \n\t0x4e, 0x65, 0x75, 0x42, 0x46, 0x49, 0x30, 0x51, 0x50, 0x53, 0x6e, 0x37, 0x63, 0x67, 0x74, 0x64, 0x59, 0x58, \n\t0x4b, 0x4a, 0x6a, 0x4a, 0x35, 0x47, 0x59, 0x38, 0x72, 0x43, 0x4b, 0x44, 0x31, 0x66, 0x57, 0x6f, 0x56, 0x32, \n\t0x35, 0x78, 0x6b, 0x33, 0x41, 0x6a, 0x4f, 0x42, 0x39, 0x4d, 0x74, 0x45, 0x37, 0x72, 0x7a, 0x66, 0x63, 0x5c, 0x0a,\n\t0x09, 0x34, 0x4f, 0x6b, 0x62, 0x6a, 0x68, 0x53, 0x4e, 0x41, 0x4d, 0x78, 0x6e, 0x37, 0x57, 0x68, 0x64, 0x36, \n\t0x66, 0x76, 0x7a, 0x37, 0x4a, 0x4d, 0x38, 0x4e, 0x45, 0x6e, 0x39, 0x79, 0x43, 0x4e, 0x43, 0x74, 0x2f, 0x35, \n\t0x68, 0x6c, 0x32, 0x67, 0x67, 0x48, 0x76, 0x55, 0x52, 0x52, 0x6a, 0x4b, 0x47, 0x59, 0x56, 0x48, 0x55, 0x32, \n\t0x76, 0x47, 0x30, 0x45, 0x2f, 0x67, 0x42, 0x45, 0x76, 0x34, 0x77, 0x71, 0x57, 0x4b, 0x62, 0x53, 0x49, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x42, 0x54, 0x45, 0x55, 0x49, 0x72, 0x59, 0x7a, 0x2f, 0x2b, 0x43, 0x38, 0x57, 0x6c, 0x4f, 0x47, \n\t0x5a, 0x53, 0x35, 0x4d, 0x34, 0x6e, 0x2b, 0x5a, 0x44, 0x4e, 0x53, 0x65, 0x4a, 0x78, 0x4d, 0x49, 0x70, 0x31, \n\t0x72, 0x4b, 0x34, 0x65, 0x67, 0x47, 0x4d, 0x76, 0x70, 0x56, 0x6a, 0x51, 0x73, 0x41, 0x46, 0x57, 0x4f, 0x71, \n\t0x6f, 0x6e, 0x45, 0x6a, 0x53, 0x62, 0x66, 0x33, 0x47, 0x37, 0x47, 0x51, 0x4a, 0x7a, 0x59, 0x72, 0x69, 0x5c, 0x0a,\n\t0x09, 0x35, 0x45, 0x4c, 0x45, 0x39, 0x45, 0x58, 0x54, 0x4b, 0x58, 0x38, 0x41, 0x38, 0x33, 0x49, 0x43, 0x6b, \n\t0x79, 0x5a, 0x6a, 0x69, 0x6d, 0x41, 0x6e, 0x6a, 0x59, 0x57, 0x57, 0x34, 0x45, 0x45, 0x77, 0x42, 0x53, 0x77, \n\t0x50, 0x73, 0x33, 0x49, 0x55, 0x59, 0x7a, 0x42, 0x63, 0x2f, 0x32, 0x38, 0x49, 0x4e, 0x2b, 0x62, 0x70, 0x6a, \n\t0x59, 0x72, 0x31, 0x2b, 0x44, 0x72, 0x4a, 0x36, 0x72, 0x38, 0x39, 0x2b, 0x39, 0x6b, 0x4f, 0x42, 0x33, 0x5c, 0x0a,\n\t0x09, 0x31, 0x31, 0x41, 0x70, 0x70, 0x47, 0x68, 0x75, 0x2f, 0x49, 0x79, 0x54, 0x6a, 0x42, 0x76, 0x42, 0x41, \n\t0x63, 0x41, 0x70, 0x4b, 0x46, 0x51, 0x55, 0x49, 0x70, 0x36, 0x31, 0x65, 0x78, 0x68, 0x49, 0x6b, 0x55, 0x4b, \n\t0x4c, 0x71, 0x50, 0x56, 0x63, 0x49, 0x66, 0x62, 0x43, 0x34, 0x59, 0x4b, 0x36, 0x34, 0x4e, 0x66, 0x75, 0x52, \n\t0x47, 0x6b, 0x70, 0x74, 0x4b, 0x78, 0x65, 0x49, 0x63, 0x33, 0x49, 0x36, 0x58, 0x62, 0x4a, 0x53, 0x63, 0x5c, 0x0a,\n\t0x09, 0x61, 0x4e, 0x34, 0x46, 0x6c, 0x54, 0x79, 0x51, 0x44, 0x79, 0x6e, 0x49, 0x69, 0x4c, 0x57, 0x43, 0x47, \n\t0x4d, 0x65, 0x48, 0x34, 0x62, 0x79, 0x75, 0x47, 0x4a, 0x58, 0x6b, 0x6e, 0x32, 0x6a, 0x59, 0x39, 0x4a, 0x76, \n\t0x48, 0x69, 0x73, 0x73, 0x46, 0x4c, 0x4a, 0x71, 0x79, 0x46, 0x73, 0x4b, 0x31, 0x77, 0x4b, 0x79, 0x74, 0x79, \n\t0x5a, 0x56, 0x76, 0x46, 0x6a, 0x4a, 0x78, 0x6b, 0x33, 0x67, 0x69, 0x64, 0x7a, 0x41, 0x37, 0x56, 0x35, 0x5c, 0x0a,\n\t0x09, 0x66, 0x38, 0x50, 0x43, 0x52, 0x6c, 0x43, 0x4b, 0x46, 0x72, 0x38, 0x64, 0x70, 0x50, 0x64, 0x2f, 0x51, \n\t0x4f, 0x72, 0x51, 0x4b, 0x59, 0x66, 0x2b, 0x6a, 0x72, 0x74, 0x74, 0x41, 0x74, 0x53, 0x32, 0x6e, 0x4f, 0x4e, \n\t0x77, 0x77, 0x6b, 0x6e, 0x47, 0x6a, 0x65, 0x42, 0x62, 0x56, 0x73, 0x47, 0x33, 0x66, 0x4a, 0x37, 0x6e, 0x53, \n\t0x55, 0x55, 0x69, 0x62, 0x33, 0x57, 0x6c, 0x49, 0x69, 0x74, 0x6f, 0x49, 0x66, 0x6e, 0x43, 0x4f, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x62, 0x65, 0x67, 0x37, 0x47, 0x64, 0x57, 0x38, 0x75, 0x6f, 0x62, 0x4a, 0x30, 0x46, 0x6e, 0x4a, \n\t0x44, 0x62, 0x6d, 0x64, 0x31, 0x4f, 0x38, 0x6d, 0x35, 0x45, 0x65, 0x77, 0x47, 0x68, 0x67, 0x46, 0x38, 0x71, \n\t0x78, 0x63, 0x67, 0x2b, 0x52, 0x52, 0x50, 0x45, 0x39, 0x74, 0x58, 0x77, 0x4e, 0x55, 0x72, 0x45, 0x59, 0x4c, \n\t0x6b, 0x6e, 0x71, 0x4f, 0x6b, 0x75, 0x77, 0x74, 0x76, 0x4f, 0x73, 0x62, 0x56, 0x4d, 0x55, 0x2f, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x4e, 0x59, 0x75, 0x73, 0x49, 0x72, 0x58, 0x67, 0x4c, 0x65, 0x64, 0x35, 0x4e, 0x77, 0x49, 0x61, \n\t0x73, 0x43, 0x4c, 0x59, 0x42, 0x6f, 0x61, 0x64, 0x57, 0x4f, 0x72, 0x70, 0x34, 0x6e, 0x74, 0x52, 0x30, 0x45, \n\t0x70, 0x78, 0x31, 0x6e, 0x6f, 0x42, 0x73, 0x6d, 0x6e, 0x75, 0x30, 0x6b, 0x64, 0x4f, 0x6f, 0x56, 0x49, 0x61, \n\t0x2b, 0x68, 0x39, 0x67, 0x32, 0x53, 0x4f, 0x6c, 0x49, 0x37, 0x51, 0x53, 0x51, 0x47, 0x46, 0x77, 0x48, 0x5c, 0x0a,\n\t0x09, 0x31, 0x4c, 0x72, 0x63, 0x66, 0x39, 0x6d, 0x4c, 0x6d, 0x4f, 0x6f, 0x69, 0x68, 0x31, 0x44, 0x6a, 0x35, \n\t0x72, 0x46, 0x55, 0x49, 0x64, 0x4b, 0x38, 0x66, 0x50, 0x4c, 0x48, 0x64, 0x6b, 0x33, 0x37, 0x2b, 0x63, 0x4c, \n\t0x35, 0x2f, 0x75, 0x4c, 0x79, 0x6b, 0x76, 0x64, 0x49, 0x50, 0x6b, 0x38, 0x33, 0x39, 0x6e, 0x5a, 0x4e, 0x74, \n\t0x65, 0x52, 0x72, 0x65, 0x2f, 0x6a, 0x4e, 0x45, 0x66, 0x4b, 0x39, 0x6e, 0x48, 0x31, 0x39, 0x35, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x57, 0x58, 0x63, 0x42, 0x50, 0x4f, 0x4d, 0x6d, 0x57, 0x38, 0x70, 0x74, 0x4f, 0x41, 0x50, 0x38, 0x41, \n\t0x66, 0x69, 0x6d, 0x4d, 0x75, 0x38, 0x6d, 0x66, 0x46, 0x73, 0x57, 0x6b, 0x2f, 0x6d, 0x7a, 0x34, 0x2b, 0x55, \n\t0x5a, 0x67, 0x4d, 0x79, 0x72, 0x35, 0x39, 0x48, 0x37, 0x72, 0x69, 0x45, 0x31, 0x68, 0x4e, 0x44, 0x66, 0x72, \n\t0x58, 0x71, 0x79, 0x43, 0x4b, 0x6b, 0x68, 0x51, 0x50, 0x67, 0x62, 0x64, 0x31, 0x6d, 0x50, 0x42, 0x78, 0x5c, 0x0a,\n\t0x09, 0x69, 0x33, 0x39, 0x6f, 0x37, 0x79, 0x48, 0x6f, 0x4a, 0x4f, 0x72, 0x5a, 0x68, 0x68, 0x69, 0x34, 0x43, \n\t0x49, 0x70, 0x78, 0x6e, 0x64, 0x38, 0x55, 0x64, 0x50, 0x62, 0x37, 0x6c, 0x57, 0x69, 0x44, 0x79, 0x78, 0x30, \n\t0x59, 0x71, 0x52, 0x4a, 0x6a, 0x48, 0x44, 0x46, 0x5a, 0x66, 0x64, 0x35, 0x4c, 0x32, 0x34, 0x61, 0x68, 0x65, \n\t0x42, 0x4a, 0x38, 0x41, 0x38, 0x45, 0x79, 0x4d, 0x37, 0x4e, 0x69, 0x47, 0x46, 0x61, 0x70, 0x56, 0x57, 0x5c, 0x0a,\n\t0x09, 0x64, 0x49, 0x64, 0x2f, 0x36, 0x32, 0x33, 0x32, 0x41, 0x50, 0x43, 0x54, 0x6c, 0x43, 0x41, 0x48, 0x33, \n\t0x6e, 0x33, 0x52, 0x33, 0x77, 0x4b, 0x48, 0x41, 0x4e, 0x54, 0x46, 0x54, 0x59, 0x51, 0x37, 0x31, 0x34, 0x46, \n\t0x63, 0x62, 0x76, 0x70, 0x76, 0x63, 0x6c, 0x44, 0x76, 0x61, 0x53, 0x62, 0x79, 0x53, 0x4f, 0x34, 0x4f, 0x33, \n\t0x6f, 0x57, 0x5a, 0x57, 0x69, 0x75, 0x4a, 0x63, 0x6b, 0x4c, 0x33, 0x39, 0x63, 0x41, 0x78, 0x7a, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x67, 0x79, 0x6d, 0x65, 0x4d, 0x58, 0x53, 0x44, 0x78, 0x31, 0x70, 0x43, 0x7a, 0x50, 0x6f, 0x31, 0x4c, \n\t0x34, 0x76, 0x74, 0x4a, 0x43, 0x70, 0x48, 0x4d, 0x7a, 0x6b, 0x6c, 0x38, 0x46, 0x4f, 0x49, 0x55, 0x5a, 0x62, \n\t0x62, 0x6a, 0x75, 0x70, 0x65, 0x2b, 0x6b, 0x6b, 0x69, 0x39, 0x61, 0x37, 0x77, 0x44, 0x78, 0x33, 0x57, 0x39, \n\t0x69, 0x44, 0x43, 0x62, 0x4c, 0x30, 0x37, 0x67, 0x4d, 0x42, 0x42, 0x36, 0x36, 0x67, 0x2f, 0x44, 0x44, 0x5c, 0x0a,\n\t0x09, 0x61, 0x30, 0x47, 0x56, 0x77, 0x54, 0x51, 0x6f, 0x6d, 0x36, 0x68, 0x52, 0x38, 0x73, 0x56, 0x43, 0x49, \n\t0x2b, 0x59, 0x57, 0x57, 0x51, 0x31, 0x67, 0x58, 0x45, 0x2b, 0x53, 0x2b, 0x4e, 0x33, 0x66, 0x79, 0x4c, 0x37, \n\t0x70, 0x36, 0x41, 0x35, 0x57, 0x42, 0x4c, 0x6b, 0x35, 0x53, 0x76, 0x68, 0x37, 0x39, 0x2b, 0x4a, 0x62, 0x50, \n\t0x74, 0x2b, 0x71, 0x65, 0x67, 0x38, 0x7a, 0x37, 0x31, 0x2f, 0x54, 0x39, 0x4a, 0x6d, 0x46, 0x49, 0x50, 0x5c, 0x0a,\n\t0x09, 0x41, 0x38, 0x38, 0x42, 0x32, 0x72, 0x51, 0x76, 0x75, 0x6f, 0x6e, 0x2b, 0x53, 0x42, 0x48, 0x72, 0x52, \n\t0x4a, 0x48, 0x67, 0x31, 0x53, 0x51, 0x34, 0x42, 0x41, 0x78, 0x35, 0x63, 0x49, 0x74, 0x69, 0x2b, 0x7a, 0x35, \n\t0x77, 0x62, 0x2f, 0x70, 0x77, 0x6c, 0x51, 0x4f, 0x79, 0x61, 0x6b, 0x73, 0x4c, 0x55, 0x4c, 0x56, 0x30, 0x6b, \n\t0x66, 0x37, 0x6b, 0x55, 0x37, 0x66, 0x74, 0x6c, 0x7a, 0x71, 0x46, 0x48, 0x79, 0x4b, 0x79, 0x67, 0x72, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x2f, 0x44, 0x66, 0x73, 0x77, 0x6a, 0x2f, 0x32, 0x6f, 0x58, 0x32, 0x75, 0x4d, 0x78, 0x6e, 0x6c, \n\t0x73, 0x4b, 0x32, 0x49, 0x34, 0x4b, 0x5a, 0x66, 0x58, 0x6f, 0x63, 0x79, 0x4e, 0x31, 0x66, 0x45, 0x41, 0x4c, \n\t0x39, 0x38, 0x68, 0x44, 0x61, 0x68, 0x55, 0x48, 0x30, 0x67, 0x57, 0x47, 0x4d, 0x6f, 0x51, 0x53, 0x6b, 0x78, \n\t0x32, 0x2f, 0x38, 0x71, 0x6f, 0x78, 0x55, 0x46, 0x30, 0x53, 0x5a, 0x58, 0x59, 0x2f, 0x53, 0x4f, 0x67, 0x5c, 0x0a,\n\t0x09, 0x74, 0x31, 0x63, 0x5a, 0x4e, 0x39, 0x74, 0x63, 0x44, 0x30, 0x4c, 0x33, 0x64, 0x6a, 0x76, 0x72, 0x78, \n\t0x4a, 0x48, 0x62, 0x72, 0x56, 0x2f, 0x49, 0x30, 0x6b, 0x41, 0x6e, 0x77, 0x4c, 0x4d, 0x32, 0x39, 0x66, 0x36, \n\t0x57, 0x38, 0x6b, 0x78, 0x34, 0x47, 0x39, 0x6d, 0x42, 0x36, 0x4b, 0x4e, 0x36, 0x2b, 0x37, 0x42, 0x4b, 0x70, \n\t0x4a, 0x30, 0x49, 0x34, 0x6d, 0x59, 0x44, 0x4e, 0x6d, 0x62, 0x48, 0x55, 0x35, 0x4d, 0x41, 0x38, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x38, 0x6d, 0x58, 0x74, 0x76, 0x52, 0x53, 0x6d, 0x73, 0x65, 0x6a, 0x44, 0x4e, 0x50, 0x73, 0x6e, 0x4d, \n\t0x50, 0x50, 0x2b, 0x46, 0x51, 0x5a, 0x67, 0x6e, 0x56, 0x45, 0x72, 0x67, 0x76, 0x38, 0x33, 0x2b, 0x4e, 0x7a, \n\t0x2f, 0x71, 0x7a, 0x5a, 0x4e, 0x63, 0x4b, 0x70, 0x6a, 0x6d, 0x75, 0x42, 0x55, 0x78, 0x7a, 0x54, 0x42, 0x71, \n\t0x59, 0x37, 0x2f, 0x41, 0x6d, 0x44, 0x64, 0x67, 0x6f, 0x4a, 0x2b, 0x68, 0x32, 0x6d, 0x6a, 0x41, 0x41, 0x5c, 0x0a,\n\t0x09, 0x41, 0x41, 0x41, 0x45, 0x6c, 0x46, 0x54, 0x6b, 0x53, 0x75, 0x51, 0x6d, 0x43, 0x43, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x6f, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5b, 0x31, 0x5d, 0x2e, 0x6f, 0x5f, 0x70, 0x6e, 0x67, 0x20, \n\t0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, \n\t0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x22, 0x2c, \n\t0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x42, 0x77, 0x41, 0x41, 0x41, 0x41, 0x63, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x42, 0x79, 0x44, 0x64, 0x2b, 0x55, 0x41, 0x41, 0x41, 0x41, 0x47, 0x58, 0x52, 0x46, 0x57, \n\t0x48, 0x52, 0x54, 0x62, 0x32, 0x5a, 0x30, 0x64, 0x32, 0x46, 0x79, 0x5a, 0x51, 0x42, 0x42, 0x5a, 0x47, 0x5c, 0x0a,\n\t0x09, 0x39, 0x69, 0x5a, 0x53, 0x42, 0x4a, 0x62, 0x57, 0x46, 0x6e, 0x5a, 0x56, 0x4a, 0x6c, 0x59, 0x57, 0x52, \n\t0x35, 0x63, 0x63, 0x6c, 0x6c, 0x50, 0x41, 0x41, 0x41, 0x41, 0x32, 0x5a, 0x70, 0x56, 0x46, 0x68, 0x30, 0x57, \n\t0x45, 0x31, 0x4d, 0x4f, 0x6d, 0x4e, 0x76, 0x62, 0x53, 0x35, 0x68, 0x5a, 0x47, 0x39, 0x69, 0x5a, 0x53, 0x35, \n\t0x34, 0x62, 0x58, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x44, 0x77, 0x2f, 0x65, 0x48, 0x42, 0x68, 0x5c, 0x0a,\n\t0x09, 0x59, 0x32, 0x74, 0x6c, 0x64, 0x43, 0x42, 0x69, 0x5a, 0x57, 0x64, 0x70, 0x62, 0x6a, 0x30, 0x69, 0x37, \n\t0x37, 0x75, 0x2f, 0x49, 0x69, 0x42, 0x70, 0x5a, 0x44, 0x30, 0x69, 0x56, 0x7a, 0x56, 0x4e, 0x4d, 0x45, 0x31, \n\t0x77, 0x51, 0x32, 0x56, 0x6f, 0x61, 0x55, 0x68, 0x36, 0x63, 0x6d, 0x56, 0x54, 0x65, 0x6b, 0x35, 0x55, 0x59, \n\t0x33, 0x70, 0x72, 0x59, 0x7a, 0x6c, 0x6b, 0x49, 0x6a, 0x38, 0x2b, 0x49, 0x44, 0x78, 0x34, 0x4f, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x68, 0x74, 0x63, 0x47, 0x31, 0x6c, 0x64, 0x47, 0x45, 0x67, 0x65, 0x47, 0x31, 0x73, 0x62, 0x6e, 0x4d, \n\t0x36, 0x65, 0x44, 0x30, 0x69, 0x59, 0x57, 0x52, 0x76, 0x59, 0x6d, 0x55, 0x36, 0x62, 0x6e, 0x4d, 0x36, 0x62, \n\t0x57, 0x56, 0x30, 0x59, 0x53, 0x38, 0x69, 0x49, 0x48, 0x67, 0x36, 0x65, 0x47, 0x31, 0x77, 0x64, 0x47, 0x73, \n\t0x39, 0x49, 0x6b, 0x46, 0x6b, 0x62, 0x32, 0x4a, 0x6c, 0x49, 0x46, 0x68, 0x4e, 0x55, 0x43, 0x42, 0x44, 0x5c, 0x0a,\n\t0x09, 0x62, 0x33, 0x4a, 0x6c, 0x49, 0x44, 0x55, 0x75, 0x4d, 0x79, 0x31, 0x6a, 0x4d, 0x44, 0x45, 0x78, 0x49, \n\t0x44, 0x59, 0x32, 0x4c, 0x6a, 0x45, 0x30, 0x4e, 0x54, 0x59, 0x32, 0x4d, 0x53, 0x77, 0x67, 0x4d, 0x6a, 0x41, \n\t0x78, 0x4d, 0x69, 0x38, 0x77, 0x4d, 0x69, 0x38, 0x77, 0x4e, 0x69, 0x30, 0x78, 0x4e, 0x44, 0x6f, 0x31, 0x4e, \n\t0x6a, 0x6f, 0x79, 0x4e, 0x79, 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, 0x49, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x34, 0x67, 0x50, 0x48, 0x4a, 0x6b, 0x5a, 0x6a, 0x70, 0x53, 0x52, 0x45, 0x59, 0x67, 0x65, 0x47, 0x31, \n\t0x73, 0x62, 0x6e, 0x4d, 0x36, 0x63, 0x6d, 0x52, 0x6d, 0x50, 0x53, 0x4a, 0x6f, 0x64, 0x48, 0x52, 0x77, 0x4f, \n\t0x69, 0x38, 0x76, 0x64, 0x33, 0x64, 0x33, 0x4c, 0x6e, 0x63, 0x7a, 0x4c, 0x6d, 0x39, 0x79, 0x5a, 0x79, 0x38, \n\t0x78, 0x4f, 0x54, 0x6b, 0x35, 0x4c, 0x7a, 0x41, 0x79, 0x4c, 0x7a, 0x49, 0x79, 0x4c, 0x58, 0x4a, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x69, 0x31, 0x7a, 0x65, 0x57, 0x35, 0x30, 0x59, 0x58, 0x67, 0x74, 0x62, 0x6e, 0x4d, 0x6a, 0x49, \n\t0x6a, 0x34, 0x67, 0x50, 0x48, 0x4a, 0x6b, 0x5a, 0x6a, 0x70, 0x45, 0x5a, 0x58, 0x4e, 0x6a, 0x63, 0x6d, 0x6c, \n\t0x77, 0x64, 0x47, 0x6c, 0x76, 0x62, 0x69, 0x42, 0x79, 0x5a, 0x47, 0x59, 0x36, 0x59, 0x57, 0x4a, 0x76, 0x64, \n\t0x58, 0x51, 0x39, 0x49, 0x69, 0x49, 0x67, 0x65, 0x47, 0x31, 0x73, 0x62, 0x6e, 0x4d, 0x36, 0x65, 0x47, 0x5c, 0x0a,\n\t0x09, 0x31, 0x77, 0x54, 0x55, 0x30, 0x39, 0x49, 0x6d, 0x68, 0x30, 0x64, 0x48, 0x41, 0x36, 0x4c, 0x79, 0x39, \n\t0x75, 0x63, 0x79, 0x35, 0x68, 0x5a, 0x47, 0x39, 0x69, 0x5a, 0x53, 0x35, 0x6a, 0x62, 0x32, 0x30, 0x76, 0x65, \n\t0x47, 0x46, 0x77, 0x4c, 0x7a, 0x45, 0x75, 0x4d, 0x43, 0x39, 0x74, 0x62, 0x53, 0x38, 0x69, 0x49, 0x48, 0x68, \n\t0x74, 0x62, 0x47, 0x35, 0x7a, 0x4f, 0x6e, 0x4e, 0x30, 0x55, 0x6d, 0x56, 0x6d, 0x50, 0x53, 0x4a, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x64, 0x48, 0x52, 0x77, 0x4f, 0x69, 0x38, 0x76, 0x62, 0x6e, 0x4d, 0x75, 0x59, 0x57, 0x52, 0x76, 0x59, \n\t0x6d, 0x55, 0x75, 0x59, 0x32, 0x39, 0x74, 0x4c, 0x33, 0x68, 0x68, 0x63, 0x43, 0x38, 0x78, 0x4c, 0x6a, 0x41, \n\t0x76, 0x63, 0x31, 0x52, 0x35, 0x63, 0x47, 0x55, 0x76, 0x55, 0x6d, 0x56, 0x7a, 0x62, 0x33, 0x56, 0x79, 0x59, \n\t0x32, 0x56, 0x53, 0x5a, 0x57, 0x59, 0x6a, 0x49, 0x69, 0x42, 0x34, 0x62, 0x57, 0x78, 0x75, 0x63, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x70, 0x34, 0x62, 0x58, 0x41, 0x39, 0x49, 0x6d, 0x68, 0x30, 0x64, 0x48, 0x41, 0x36, 0x4c, 0x79, 0x39, \n\t0x75, 0x63, 0x79, 0x35, 0x68, 0x5a, 0x47, 0x39, 0x69, 0x5a, 0x53, 0x35, 0x6a, 0x62, 0x32, 0x30, 0x76, 0x65, \n\t0x47, 0x46, 0x77, 0x4c, 0x7a, 0x45, 0x75, 0x4d, 0x43, 0x38, 0x69, 0x49, 0x48, 0x68, 0x74, 0x63, 0x45, 0x31, \n\t0x4e, 0x4f, 0x6b, 0x39, 0x79, 0x61, 0x57, 0x64, 0x70, 0x62, 0x6d, 0x46, 0x73, 0x52, 0x47, 0x39, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x64, 0x57, 0x31, 0x6c, 0x62, 0x6e, 0x52, 0x4a, 0x52, 0x44, 0x30, 0x69, 0x65, 0x47, 0x31, 0x77, 0x4c, \n\t0x6d, 0x52, 0x70, 0x5a, 0x44, 0x70, 0x47, 0x4f, 0x55, 0x56, 0x44, 0x51, 0x6a, 0x67, 0x34, 0x4e, 0x45, 0x45, \n\t0x35, 0x52, 0x45, 0x52, 0x46, 0x4e, 0x7a, 0x45, 0x78, 0x4f, 0x55, 0x55, 0x35, 0x4e, 0x6b, 0x49, 0x34, 0x52, \n\t0x44, 0x49, 0x7a, 0x4d, 0x6b, 0x4d, 0x31, 0x4d, 0x54, 0x63, 0x7a, 0x4d, 0x53, 0x49, 0x67, 0x65, 0x47, 0x5c, 0x0a,\n\t0x09, 0x31, 0x77, 0x54, 0x55, 0x30, 0x36, 0x52, 0x47, 0x39, 0x6a, 0x64, 0x57, 0x31, 0x6c, 0x62, 0x6e, 0x52, \n\t0x4a, 0x52, 0x44, 0x30, 0x69, 0x65, 0x47, 0x31, 0x77, 0x4c, 0x6d, 0x52, 0x70, 0x5a, 0x44, 0x70, 0x44, 0x4e, \n\t0x30, 0x55, 0x35, 0x52, 0x44, 0x63, 0x33, 0x4e, 0x6b, 0x52, 0x46, 0x51, 0x7a, 0x51, 0x78, 0x4d, 0x55, 0x55, \n\t0x33, 0x51, 0x6b, 0x55, 0x34, 0x4d, 0x7a, 0x67, 0x79, 0x4f, 0x55, 0x55, 0x35, 0x51, 0x6b, 0x49, 0x33, 0x5c, 0x0a,\n\t0x09, 0x51, 0x6b, 0x49, 0x35, 0x4e, 0x43, 0x49, 0x67, 0x65, 0x47, 0x31, 0x77, 0x54, 0x55, 0x30, 0x36, 0x53, \n\t0x57, 0x35, 0x7a, 0x64, 0x47, 0x46, 0x75, 0x59, 0x32, 0x56, 0x4a, 0x52, 0x44, 0x30, 0x69, 0x65, 0x47, 0x31, \n\t0x77, 0x4c, 0x6d, 0x6c, 0x70, 0x5a, 0x44, 0x70, 0x44, 0x4e, 0x30, 0x55, 0x35, 0x52, 0x44, 0x63, 0x33, 0x4e, \n\t0x55, 0x52, 0x46, 0x51, 0x7a, 0x51, 0x78, 0x4d, 0x55, 0x55, 0x33, 0x51, 0x6b, 0x55, 0x34, 0x4d, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x67, 0x79, 0x4f, 0x55, 0x55, 0x35, 0x51, 0x6b, 0x49, 0x33, 0x51, 0x6b, 0x49, 0x35, 0x4e, 0x43, 0x49, \n\t0x67, 0x65, 0x47, 0x31, 0x77, 0x4f, 0x6b, 0x4e, 0x79, 0x5a, 0x57, 0x46, 0x30, 0x62, 0x33, 0x4a, 0x55, 0x62, \n\t0x32, 0x39, 0x73, 0x50, 0x53, 0x4a, 0x42, 0x5a, 0x47, 0x39, 0x69, 0x5a, 0x53, 0x42, 0x51, 0x61, 0x47, 0x39, \n\t0x30, 0x62, 0x33, 0x4e, 0x6f, 0x62, 0x33, 0x41, 0x67, 0x51, 0x31, 0x4d, 0x32, 0x49, 0x43, 0x68, 0x58, 0x5c, 0x0a,\n\t0x09, 0x61, 0x57, 0x35, 0x6b, 0x62, 0x33, 0x64, 0x7a, 0x4b, 0x53, 0x49, 0x2b, 0x49, 0x44, 0x78, 0x34, 0x62, \n\t0x58, 0x42, 0x4e, 0x54, 0x54, 0x70, 0x45, 0x5a, 0x58, 0x4a, 0x70, 0x64, 0x6d, 0x56, 0x6b, 0x52, 0x6e, 0x4a, \n\t0x76, 0x62, 0x53, 0x42, 0x7a, 0x64, 0x46, 0x4a, 0x6c, 0x5a, 0x6a, 0x70, 0x70, 0x62, 0x6e, 0x4e, 0x30, 0x59, \n\t0x57, 0x35, 0x6a, 0x5a, 0x55, 0x6c, 0x45, 0x50, 0x53, 0x4a, 0x34, 0x62, 0x58, 0x41, 0x75, 0x61, 0x57, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x6b, 0x4f, 0x6b, 0x5a, 0x46, 0x52, 0x55, 0x4e, 0x43, 0x4f, 0x44, 0x67, 0x30, 0x51, 0x54, 0x6c, \n\t0x45, 0x52, 0x45, 0x55, 0x33, 0x4d, 0x54, 0x45, 0x35, 0x52, 0x54, 0x6b, 0x32, 0x51, 0x6a, 0x68, 0x45, 0x4d, \n\t0x6a, 0x4d, 0x79, 0x51, 0x7a, 0x55, 0x78, 0x4e, 0x7a, 0x4d, 0x78, 0x49, 0x69, 0x42, 0x7a, 0x64, 0x46, 0x4a, \n\t0x6c, 0x5a, 0x6a, 0x70, 0x6b, 0x62, 0x32, 0x4e, 0x31, 0x62, 0x57, 0x56, 0x75, 0x64, 0x45, 0x6c, 0x45, 0x5c, 0x0a,\n\t0x09, 0x50, 0x53, 0x4a, 0x34, 0x62, 0x58, 0x41, 0x75, 0x5a, 0x47, 0x6c, 0x6b, 0x4f, 0x6b, 0x59, 0x35, 0x52, \n\t0x55, 0x4e, 0x43, 0x4f, 0x44, 0x67, 0x30, 0x51, 0x54, 0x6c, 0x45, 0x52, 0x45, 0x55, 0x33, 0x4d, 0x54, 0x45, \n\t0x35, 0x52, 0x54, 0x6b, 0x32, 0x51, 0x6a, 0x68, 0x45, 0x4d, 0x6a, 0x4d, 0x79, 0x51, 0x7a, 0x55, 0x78, 0x4e, \n\t0x7a, 0x4d, 0x78, 0x49, 0x69, 0x38, 0x2b, 0x49, 0x44, 0x77, 0x76, 0x63, 0x6d, 0x52, 0x6d, 0x4f, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x52, 0x6c, 0x63, 0x32, 0x4e, 0x79, 0x61, 0x58, 0x42, 0x30, 0x61, 0x57, 0x39, 0x75, 0x50, 0x69, 0x41, \n\t0x38, 0x4c, 0x33, 0x4a, 0x6b, 0x5a, 0x6a, 0x70, 0x53, 0x52, 0x45, 0x59, 0x2b, 0x49, 0x44, 0x77, 0x76, 0x65, \n\t0x44, 0x70, 0x34, 0x62, 0x58, 0x42, 0x74, 0x5a, 0x58, 0x52, 0x68, 0x50, 0x69, 0x41, 0x38, 0x50, 0x33, 0x68, \n\t0x77, 0x59, 0x57, 0x4e, 0x72, 0x5a, 0x58, 0x51, 0x67, 0x5a, 0x57, 0x35, 0x6b, 0x50, 0x53, 0x4a, 0x79, 0x5c, 0x0a,\n\t0x09, 0x49, 0x6a, 0x38, 0x2b, 0x50, 0x32, 0x62, 0x6c, 0x4c, 0x51, 0x41, 0x41, 0x41, 0x33, 0x5a, 0x4a, 0x52, \n\t0x45, 0x46, 0x55, 0x65, 0x4e, 0x72, 0x73, 0x56, 0x6c, 0x74, 0x49, 0x46, 0x46, 0x45, 0x59, 0x2f, 0x73, 0x61, \n\t0x5a, 0x32, 0x64, 0x6c, 0x4c, 0x32, 0x70, 0x61, 0x57, 0x64, 0x6c, 0x56, 0x52, 0x75, 0x74, 0x68, 0x4e, 0x64, \n\t0x6b, 0x30, 0x4c, 0x73, 0x71, 0x53, 0x30, 0x48, 0x75, 0x72, 0x42, 0x4c, 0x6c, 0x49, 0x6b, 0x6b, 0x62, 0x5c, 0x0a,\n\t0x09, 0x33, 0x30, 0x56, 0x49, 0x38, 0x46, 0x30, 0x55, 0x50, 0x30, 0x45, 0x42, 0x45, 0x55, 0x30, 0x51, 0x56, \n\t0x36, 0x36, 0x69, 0x6d, 0x43, 0x4b, 0x48, 0x72, 0x70, 0x42, 0x71, 0x55, 0x5a, 0x55, 0x59, 0x52, 0x30, 0x73, \n\t0x56, 0x4b, 0x4c, 0x70, 0x62, 0x79, 0x56, 0x6c, 0x65, 0x6e, 0x6d, 0x68, 0x58, 0x52, 0x64, 0x64, 0x32, 0x5a, \n\t0x6e, 0x70, 0x76, 0x2b, 0x4d, 0x59, 0x75, 0x32, 0x4f, 0x4e, 0x62, 0x4d, 0x46, 0x30, 0x55, 0x4d, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x66, 0x4a, 0x77, 0x7a, 0x5a, 0x38, 0x34, 0x35, 0x33, 0x2f, 0x6e, 0x2f, 0x38, 0x2f, 0x33, 0x6e, 0x48, \n\t0x45, 0x37, 0x58, 0x64, 0x66, 0x78, 0x4e, 0x53, 0x38, 0x4a, 0x66, 0x74, 0x6e, 0x2b, 0x57, 0x30, 0x45, 0x63, \n\t0x34, 0x52, 0x57, 0x67, 0x6b, 0x52, 0x41, 0x6a, 0x36, 0x61, 0x4e, 0x6b, 0x77, 0x32, 0x75, 0x36, 0x33, 0x53, \n\t0x38, 0x68, 0x5a, 0x37, 0x47, 0x45, 0x57, 0x34, 0x53, 0x78, 0x68, 0x76, 0x54, 0x34, 0x6b, 0x51, 0x33, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x78, 0x44, 0x75, 0x71, 0x48, 0x50, 0x6d, 0x69, 0x44, 0x77, 0x2b, 0x42, 0x45, 0x48, 0x76, 0x79, \n\t0x73, 0x79, 0x52, 0x41, 0x58, 0x7a, 0x55, 0x5a, 0x53, 0x71, 0x6f, 0x66, 0x31, 0x76, 0x55, 0x48, 0x59, 0x53, \n\t0x32, 0x6a, 0x2f, 0x58, 0x63, 0x4c, 0x56, 0x68, 0x4b, 0x74, 0x61, 0x54, 0x38, 0x67, 0x62, 0x76, 0x6c, 0x51, \n\t0x48, 0x35, 0x56, 0x34, 0x62, 0x39, 0x49, 0x67, 0x36, 0x54, 0x6f, 0x77, 0x34, 0x69, 0x4b, 0x73, 0x79, 0x5c, 0x0a,\n\t0x09, 0x34, 0x64, 0x70, 0x57, 0x42, 0x48, 0x36, 0x36, 0x74, 0x35, 0x39, 0x61, 0x4b, 0x67, 0x67, 0x31, 0x69, \n\t0x52, 0x4b, 0x75, 0x49, 0x6c, 0x53, 0x54, 0x52, 0x32, 0x4c, 0x6f, 0x78, 0x44, 0x33, 0x6f, 0x2f, 0x52, 0x48, \n\t0x72, 0x55, 0x4c, 0x6b, 0x46, 0x75, 0x50, 0x63, 0x57, 0x77, 0x37, 0x46, 0x69, 0x6a, 0x6b, 0x4b, 0x66, 0x5a, \n\t0x59, 0x54, 0x37, 0x64, 0x67, 0x6e, 0x54, 0x43, 0x55, 0x31, 0x4b, 0x77, 0x2f, 0x75, 0x30, 0x30, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x48, 0x62, 0x30, 0x4b, 0x4e, 0x61, 0x51, 0x71, 0x4a, 0x77, 0x37, 0x79, 0x75, 0x42, 0x74, 0x48, 0x4a, \n\t0x75, 0x6b, 0x4b, 0x71, 0x4c, 0x43, 0x5a, 0x2f, 0x74, 0x69, 0x4f, 0x59, 0x59, 0x68, 0x54, 0x45, 0x74, 0x64, \n\t0x4c, 0x77, 0x32, 0x59, 0x54, 0x4a, 0x6d, 0x34, 0x64, 0x4d, 0x50, 0x6f, 0x48, 0x62, 0x30, 0x54, 0x71, 0x48, \n\t0x71, 0x55, 0x54, 0x73, 0x65, 0x4d, 0x70, 0x45, 0x30, 0x68, 0x38, 0x37, 0x56, 0x38, 0x76, 0x4b, 0x74, 0x5c, 0x0a,\n\t0x09, 0x74, 0x2b, 0x62, 0x4f, 0x48, 0x68, 0x46, 0x43, 0x77, 0x58, 0x54, 0x77, 0x57, 0x61, 0x6c, 0x49, 0x38, \n\t0x72, 0x71, 0x68, 0x76, 0x50, 0x34, 0x45, 0x35, 0x57, 0x34, 0x62, 0x6f, 0x4d, 0x56, 0x47, 0x53, 0x56, 0x67, \n\t0x32, 0x41, 0x38, 0x6b, 0x48, 0x4e, 0x37, 0x41, 0x4e, 0x7a, 0x34, 0x30, 0x58, 0x6b, 0x52, 0x41, 0x33, 0x35, \n\t0x33, 0x61, 0x74, 0x66, 0x34, 0x68, 0x58, 0x37, 0x72, 0x53, 0x59, 0x79, 0x42, 0x7a, 0x72, 0x63, 0x75, 0x5c, 0x0a,\n\t0x09, 0x43, 0x75, 0x4b, 0x67, 0x59, 0x33, 0x51, 0x52, 0x70, 0x72, 0x6b, 0x30, 0x6f, 0x58, 0x51, 0x46, 0x37, \n\t0x61, 0x6a, 0x4b, 0x46, 0x6a, 0x74, 0x4d, 0x2f, 0x71, 0x39, 0x32, 0x68, 0x45, 0x36, 0x7a, 0x34, 0x79, 0x4e, \n\t0x66, 0x50, 0x38, 0x7a, 0x45, 0x6d, 0x56, 0x39, 0x48, 0x6e, 0x6b, 0x56, 0x79, 0x46, 0x64, 0x71, 0x39, 0x53, \n\t0x33, 0x6d, 0x30, 0x49, 0x70, 0x72, 0x70, 0x77, 0x4e, 0x7a, 0x35, 0x37, 0x53, 0x4d, 0x62, 0x4a, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x34, 0x42, 0x50, 0x43, 0x6c, 0x78, 0x39, 0x44, 0x37, 0x66, 0x6f, 0x4b, 0x78, 0x2f, 0x4a, 0x63, 0x4f, \n\t0x44, 0x62, 0x6e, 0x6d, 0x52, 0x59, 0x6f, 0x50, 0x32, 0x6c, 0x6c, 0x52, 0x57, 0x6c, 0x38, 0x65, 0x37, 0x79, \n\t0x48, 0x43, 0x36, 0x50, 0x4e, 0x33, 0x61, 0x62, 0x42, 0x7a, 0x6f, 0x30, 0x2b, 0x6f, 0x78, 0x77, 0x38, 0x58, \n\t0x51, 0x32, 0x74, 0x63, 0x77, 0x42, 0x61, 0x6f, 0x4d, 0x64, 0x59, 0x6c, 0x50, 0x79, 0x67, 0x42, 0x53, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x48, 0x4b, 0x2b, 0x41, 0x71, 0x39, 0x30, 0x4f, 0x2b, 0x48, 0x6f, 0x41, 0x65, 0x6a, 0x6f, 0x36, \n\t0x4e, 0x55, 0x56, 0x75, 0x59, 0x62, 0x72, 0x44, 0x49, 0x53, 0x6a, 0x53, 0x70, 0x2b, 0x73, 0x43, 0x77, 0x69, \n\t0x56, 0x44, 0x49, 0x54, 0x59, 0x66, 0x57, 0x46, 0x34, 0x4a, 0x53, 0x33, 0x51, 0x71, 0x31, 0x4b, 0x54, 0x67, \n\t0x57, 0x41, 0x61, 0x33, 0x39, 0x4b, 0x79, 0x4c, 0x33, 0x41, 0x2b, 0x43, 0x53, 0x6e, 0x65, 0x44, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x32, 0x4c, 0x47, 0x61, 0x46, 0x39, 0x43, 0x78, 0x6e, 0x79, 0x57, 0x4b, 0x68, 0x30, 0x76, 0x75, \n\t0x66, 0x56, 0x68, 0x42, 0x5a, 0x7a, 0x41, 0x47, 0x30, 0x6b, 0x65, 0x62, 0x32, 0x70, 0x72, 0x63, 0x47, 0x53, \n\t0x69, 0x6a, 0x4f, 0x53, 0x34, 0x51, 0x66, 0x62, 0x4f, 0x30, 0x70, 0x36, 0x6b, 0x79, 0x57, 0x35, 0x54, 0x70, \n\t0x32, 0x68, 0x4c, 0x74, 0x2b, 0x47, 0x46, 0x75, 0x43, 0x62, 0x62, 0x39, 0x49, 0x38, 0x70, 0x64, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x51, 0x35, 0x6c, 0x6f, 0x46, 0x4c, 0x64, 0x68, 0x6a, 0x7a, 0x57, 0x52, 0x45, 0x32, 0x73, 0x76, 0x4d, \n\t0x78, 0x33, 0x6f, 0x5a, 0x76, 0x76, 0x44, 0x52, 0x4b, 0x7a, 0x32, 0x35, 0x4b, 0x36, 0x6b, 0x31, 0x35, 0x34, \n\t0x4e, 0x4b, 0x63, 0x34, 0x43, 0x5a, 0x4a, 0x6b, 0x45, 0x67, 0x73, 0x7a, 0x72, 0x4b, 0x46, 0x49, 0x33, 0x78, \n\t0x76, 0x67, 0x72, 0x45, 0x4c, 0x6d, 0x65, 0x6c, 0x6c, 0x52, 0x5a, 0x4f, 0x56, 0x61, 0x47, 0x72, 0x45, 0x5c, 0x0a,\n\t0x09, 0x67, 0x75, 0x79, 0x53, 0x4d, 0x4f, 0x70, 0x69, 0x50, 0x58, 0x7a, 0x59, 0x67, 0x58, 0x42, 0x6d, 0x48, \n\t0x5a, 0x32, 0x58, 0x79, 0x2b, 0x44, 0x65, 0x56, 0x57, 0x7a, 0x67, 0x52, 0x34, 0x76, 0x55, 0x76, 0x49, 0x49, \n\t0x61, 0x69, 0x48, 0x56, 0x47, 0x39, 0x4c, 0x47, 0x55, 0x52, 0x72, 0x57, 0x74, 0x78, 0x42, 0x38, 0x34, 0x66, \n\t0x49, 0x32, 0x50, 0x50, 0x75, 0x30, 0x30, 0x68, 0x79, 0x38, 0x2f, 0x48, 0x64, 0x4c, 0x61, 0x50, 0x41, 0x5c, 0x0a,\n\t0x09, 0x67, 0x35, 0x55, 0x38, 0x46, 0x4a, 0x49, 0x74, 0x53, 0x50, 0x76, 0x61, 0x54, 0x55, 0x4e, 0x35, 0x42, \n\t0x76, 0x55, 0x39, 0x37, 0x2b, 0x4d, 0x41, 0x2b, 0x66, 0x4d, 0x78, 0x45, 0x70, 0x4a, 0x37, 0x65, 0x71, 0x34, \n\t0x44, 0x6a, 0x4c, 0x78, 0x47, 0x63, 0x2f, 0x4c, 0x37, 0x67, 0x71, 0x43, 0x36, 0x73, 0x47, 0x6e, 0x31, 0x2b, \n\t0x50, 0x53, 0x57, 0x59, 0x6a, 0x62, 0x43, 0x2b, 0x36, 0x4d, 0x45, 0x53, 0x77, 0x4d, 0x75, 0x65, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x49, 0x6e, 0x4b, 0x46, 0x75, 0x7a, 0x6a, 0x65, 0x56, 0x54, 0x58, 0x65, 0x57, 0x58, 0x70, 0x41, 0x79, \n\t0x4d, 0x30, 0x49, 0x53, 0x6c, 0x56, 0x2b, 0x2f, 0x49, 0x34, 0x35, 0x79, 0x75, 0x66, 0x44, 0x34, 0x63, 0x2f, \n\t0x2b, 0x51, 0x74, 0x58, 0x39, 0x64, 0x6d, 0x39, 0x38, 0x64, 0x73, 0x4a, 0x58, 0x75, 0x4d, 0x70, 0x39, 0x69, \n\t0x72, 0x4e, 0x79, 0x53, 0x57, 0x4a, 0x6b, 0x36, 0x2b, 0x66, 0x41, 0x73, 0x33, 0x4d, 0x46, 0x75, 0x35, 0x5c, 0x0a,\n\t0x09, 0x36, 0x32, 0x45, 0x4c, 0x6f, 0x53, 0x76, 0x59, 0x44, 0x5a, 0x73, 0x58, 0x52, 0x46, 0x72, 0x6d, 0x2f, \n\t0x33, 0x68, 0x73, 0x38, 0x2f, 0x67, 0x76, 0x5a, 0x2b, 0x34, 0x4f, 0x66, 0x76, 0x6c, 0x4b, 0x6b, 0x75, 0x43, \n\t0x6d, 0x4d, 0x68, 0x70, 0x4a, 0x4a, 0x35, 0x37, 0x41, 0x4c, 0x65, 0x54, 0x4b, 0x6a, 0x39, 0x6b, 0x79, 0x66, \n\t0x47, 0x47, 0x55, 0x53, 0x31, 0x44, 0x66, 0x4b, 0x7a, 0x4e, 0x69, 0x6a, 0x31, 0x39, 0x4d, 0x54, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x36, 0x49, 0x63, 0x65, 0x6b, 0x69, 0x6e, 0x50, 0x4a, 0x50, 0x44, 0x54, 0x55, 0x69, 0x41, 0x57, 0x5a, \n\t0x45, 0x48, 0x4d, 0x7a, 0x79, 0x51, 0x52, 0x43, 0x54, 0x65, 0x70, 0x37, 0x78, 0x36, 0x72, 0x4a, 0x77, 0x59, \n\t0x59, 0x6f, 0x51, 0x33, 0x34, 0x43, 0x61, 0x63, 0x49, 0x44, 0x59, 0x53, 0x49, 0x50, 0x6d, 0x4b, 0x73, 0x62, \n\t0x42, 0x78, 0x74, 0x39, 0x39, 0x6d, 0x63, 0x78, 0x39, 0x4c, 0x44, 0x2f, 0x77, 0x2f, 0x68, 0x68, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x32, 0x62, 0x41, 0x41, 0x4d, 0x41, 0x47, 0x63, 0x61, 0x6b, 0x42, 0x5a, 0x72, 0x72, 0x4e, 0x75, 0x73, \n\t0x41, 0x41, 0x41, 0x41, 0x41, 0x53, 0x55, 0x56, 0x4f, 0x52, 0x4b, 0x35, 0x43, 0x59, 0x49, 0x49, 0x3d, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x6f, 0x40, 0x32, 0x78, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5b, 0x32, 0x5d, 0x2e, 0x6f, 0x5f, 0x70, 0x6e, 0x67, 0x20, \n\t0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, \n\t0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x22, 0x2c, \n\t0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x44, 0x67, 0x41, 0x41, 0x41, 0x41, 0x34, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x43, 0x6f, 0x68, 0x6a, 0x73, 0x65, 0x41, 0x41, 0x41, 0x48, 0x39, 0x30, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x6f, 0x67, 0x65, 0x32, 0x61, 0x62, 0x58, 0x41, 0x56, 0x31, 0x52, 0x6e, 0x48, 0x66, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x74, 0x79, 0x33, 0x2f, 0x4e, 0x4b, 0x45, 0x68, 0x4a, 0x65, 0x41, 0x70, 0x65, 0x45, 0x67, 0x4c, 0x45, \n\t0x71, 0x55, 0x53, 0x52, 0x4e, 0x65, 0x42, 0x47, 0x4b, 0x49, 0x6a, 0x4f, 0x32, 0x61, 0x46, 0x76, 0x48, 0x53, \n\t0x74, 0x58, 0x57, 0x6a, 0x69, 0x33, 0x54, 0x64, 0x6a, 0x71, 0x6c, 0x6a, 0x46, 0x2f, 0x61, 0x6d, 0x56, 0x70, \n\t0x62, 0x4f, 0x35, 0x57, 0x78, 0x6e, 0x53, 0x6c, 0x44, 0x61, 0x7a, 0x75, 0x6a, 0x30, 0x6d, 0x6f, 0x64, 0x5c, 0x0a,\n\t0x09, 0x32, 0x78, 0x6c, 0x4b, 0x59, 0x61, 0x54, 0x44, 0x44, 0x46, 0x59, 0x45, 0x71, 0x34, 0x44, 0x79, 0x59, \n\t0x6b, 0x63, 0x47, 0x53, 0x77, 0x6a, 0x55, 0x78, 0x49, 0x61, 0x45, 0x41, 0x41, 0x6b, 0x51, 0x79, 0x4d, 0x76, \n\t0x4e, 0x7a, 0x62, 0x32, 0x37, 0x65, 0x37, 0x63, 0x66, 0x4e, 0x6e, 0x76, 0x76, 0x44, 0x5a, 0x49, 0x39, 0x75, \n\t0x7a, 0x66, 0x4a, 0x57, 0x42, 0x7a, 0x2b, 0x6e, 0x2f, 0x61, 0x63, 0x66, 0x5a, 0x35, 0x7a, 0x2f, 0x76, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x37, 0x35, 0x35, 0x37, 0x7a, 0x6e, 0x4f, 0x63, 0x63, 0x79, 0x54, 0x52, 0x4e, 0x50, 0x73, 0x32, \n\t0x51, 0x50, 0x32, 0x6b, 0x43, 0x45, 0x34, 0x33, 0x72, 0x41, 0x71, 0x39, 0x31, 0x58, 0x42, 0x64, 0x34, 0x72, \n\t0x55, 0x4f, 0x64, 0x6f, 0x44, 0x59, 0x58, 0x41, 0x69, 0x75, 0x41, 0x4f, 0x71, 0x41, 0x57, 0x71, 0x41, 0x41, \n\t0x69, 0x77, 0x2b, 0x38, 0x31, 0x6f, 0x41, 0x31, 0x6f, 0x41, 0x51, 0x34, 0x44, 0x62, 0x77, 0x4e, 0x37, 0x5c, 0x0a,\n\t0x09, 0x41, 0x57, 0x4d, 0x43, 0x75, 0x43, 0x43, 0x4e, 0x34, 0x7a, 0x4a, 0x78, 0x41, 0x2f, 0x41, 0x64, 0x34, \n\t0x47, 0x76, 0x41, 0x4a, 0x49, 0x2b, 0x2b, 0x35, 0x34, 0x48, 0x4e, 0x77, 0x47, 0x2b, 0x78, 0x68, 0x49, 0x38, \n\t0x62, 0x78, 0x6b, 0x4e, 0x67, 0x46, 0x48, 0x67, 0x4b, 0x53, 0x35, 0x68, 0x30, 0x4e, 0x51, 0x4f, 0x7a, 0x4c, \n\t0x30, 0x34, 0x71, 0x72, 0x6c, 0x6b, 0x64, 0x71, 0x6a, 0x4c, 0x79, 0x70, 0x41, 0x68, 0x49, 0x56, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x55, 0x31, 0x67, 0x43, 0x33, 0x41, 0x44, 0x34, 0x47, 0x4f, 0x73, 0x52, 0x4b, 0x44, 0x73, 0x51, 0x6d, \n\t0x55, 0x67, 0x4c, 0x58, 0x41, 0x30, 0x32, 0x53, 0x47, 0x48, 0x35, 0x67, 0x6d, 0x32, 0x76, 0x46, 0x4f, 0x74, \n\t0x43, 0x4f, 0x6e, 0x30, 0x4a, 0x75, 0x37, 0x53, 0x62, 0x56, 0x65, 0x77, 0x6f, 0x78, 0x70, 0x49, 0x78, 0x31, \n\t0x39, 0x43, 0x76, 0x4b, 0x73, 0x51, 0x70, 0x53, 0x35, 0x5a, 0x66, 0x6a, 0x71, 0x5a, 0x75, 0x43, 0x72, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x34, 0x48, 0x6b, 0x48, 0x2f, 0x46, 0x76, 0x69, 0x51, 0x46, 0x50, 0x41, 0x4c, 0x38, 0x42, 0x78, \n\t0x76, 0x51, 0x46, 0x63, 0x68, 0x56, 0x59, 0x41, 0x50, 0x77, 0x5a, 0x57, 0x47, 0x56, 0x58, 0x6d, 0x48, 0x47, \n\t0x4e, 0x78, 0x4a, 0x34, 0x6d, 0x45, 0x71, 0x38, 0x64, 0x4a, 0x39, 0x58, 0x65, 0x37, 0x34, 0x31, 0x45, 0x55, \n\t0x51, 0x44, 0x2f, 0x79, 0x68, 0x71, 0x43, 0x39, 0x39, 0x52, 0x5a, 0x58, 0x7a, 0x65, 0x44, 0x48, 0x63, 0x5c, 0x0a,\n\t0x09, 0x44, 0x58, 0x67, 0x63, 0x75, 0x35, 0x6b, 0x49, 0x54, 0x63, 0x42, 0x45, 0x34, 0x47, 0x39, 0x67, 0x41, \n\t0x33, 0x32, 0x52, 0x58, 0x4a, 0x64, 0x7a, 0x38, 0x6b, 0x2f, 0x73, 0x63, 0x44, 0x70, 0x4c, 0x72, 0x6a, 0x75, \n\t0x66, 0x4b, 0x77, 0x79, 0x49, 0x52, 0x56, 0x41, 0x67, 0x2f, 0x57, 0x45, 0x56, 0x70, 0x56, 0x42, 0x7a, 0x37, \n\t0x46, 0x72, 0x6a, 0x36, 0x47, 0x4e, 0x57, 0x47, 0x64, 0x79, 0x36, 0x6c, 0x4e, 0x6a, 0x77, 0x4c, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x67, 0x58, 0x65, 0x41, 0x61, 0x67, 0x42, 0x7a, 0x4d, 0x45, 0x6e, 0x73, 0x2b, 0x58, 0x2b, 0x69, 0x76, \n\t0x64, 0x6d, 0x57, 0x53, 0x39, 0x2b, 0x6a, 0x51, 0x76, 0x6c, 0x4d, 0x4b, 0x5a, 0x46, 0x31, 0x64, 0x36, 0x46, \n\t0x55, 0x46, 0x4e, 0x70, 0x56, 0x72, 0x55, 0x41, 0x6a, 0x31, 0x6d, 0x54, 0x6b, 0x43, 0x56, 0x34, 0x45, 0x68, \n\t0x6f, 0x43, 0x33, 0x67, 0x48, 0x71, 0x41, 0x31, 0x50, 0x6c, 0x2b, 0x42, 0x74, 0x61, 0x2f, 0x68, 0x74, 0x5c, 0x0a,\n\t0x09, 0x46, 0x79, 0x79, 0x57, 0x75, 0x66, 0x37, 0x6f, 0x67, 0x56, 0x42, 0x63, 0x68, 0x37, 0x59, 0x69, 0x58, \n\t0x71, 0x33, 0x43, 0x6c, 0x32, 0x31, 0x57, 0x46, 0x67, 0x47, 0x65, 0x42, 0x70, 0x6d, 0x48, 0x68, 0x5a, 0x36, \n\t0x4a, 0x2f, 0x46, 0x46, 0x6e, 0x64, 0x68, 0x67, 0x50, 0x36, 0x66, 0x37, 0x5a, 0x67, 0x77, 0x63, 0x51, 0x44, \n\t0x6d, 0x35, 0x51, 0x51, 0x44, 0x54, 0x2b, 0x35, 0x45, 0x62, 0x7a, 0x35, 0x6a, 0x56, 0x39, 0x56, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x54, 0x54, 0x71, 0x65, 0x34, 0x46, 0x62, 0x67, 0x76, 0x63, 0x41, 0x33, 0x41, 0x63, 0x78, 0x34, 0x6b, \n\t0x6f, 0x46, 0x66, 0x2f, 0x73, 0x50, 0x7a, 0x52, 0x4a, 0x49, 0x4c, 0x7a, 0x45, 0x47, 0x64, 0x67, 0x66, 0x57, \n\t0x37, 0x4d, 0x44, 0x72, 0x54, 0x50, 0x2b, 0x51, 0x61, 0x34, 0x45, 0x74, 0x65, 0x32, 0x6e, 0x41, 0x6a, 0x4d, \n\t0x41, 0x54, 0x38, 0x33, 0x69, 0x37, 0x45, 0x4e, 0x72, 0x32, 0x4e, 0x63, 0x65, 0x4b, 0x69, 0x6c, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x37, 0x47, 0x42, 0x50, 0x4e, 0x79, 0x67, 0x74, 0x69, 0x47, 0x33, 0x5a, 0x68, 0x44, 0x36, 0x61, 0x56, \n\t0x6d, 0x49, 0x78, 0x42, 0x32, 0x36, 0x2b, 0x39, 0x47, 0x34, 0x4f, 0x50, 0x41, 0x64, 0x49, 0x44, 0x6b, 0x67, \n\t0x52, 0x61, 0x30, 0x4e, 0x7a, 0x37, 0x79, 0x54, 0x48, 0x4b, 0x73, 0x4d, 0x50, 0x37, 0x54, 0x51, 0x33, 0x7a, \n\t0x72, 0x59, 0x62, 0x73, 0x34, 0x41, 0x31, 0x6a, 0x6e, 0x31, 0x6c, 0x63, 0x6b, 0x4d, 0x47, 0x51, 0x33, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x69, 0x5a, 0x30, 0x34, 0x69, 0x38, 0x66, 0x79, 0x6f, 0x6c, 0x67, 0x75, 0x72, 0x4e, 0x6f, 0x41, \n\t0x65, 0x72, 0x38, 0x43, 0x70, 0x51, 0x62, 0x53, 0x35, 0x46, 0x55, 0x62, 0x33, 0x46, 0x2b, 0x63, 0x74, 0x76, \n\t0x78, 0x37, 0x4b, 0x48, 0x36, 0x2b, 0x44, 0x41, 0x33, 0x49, 0x55, 0x54, 0x42, 0x39, 0x6b, 0x4e, 0x41, 0x4b, \n\t0x55, 0x42, 0x69, 0x64, 0x78, 0x4f, 0x70, 0x7a, 0x67, 0x46, 0x50, 0x70, 0x4a, 0x53, 0x35, 0x6b, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x41, 0x31, 0x52, 0x46, 0x48, 0x6e, 0x56, 0x4b, 0x42, 0x4d, 0x4b, 0x30, 0x59, 0x75, 0x79, 0x55, 0x75, \n\t0x2f, 0x53, 0x31, 0x30, 0x65, 0x5a, 0x47, 0x6a, 0x6e, 0x55, 0x5a, 0x4a, 0x2f, 0x4f, 0x34, 0x61, 0x70, 0x70, \n\t0x34, 0x52, 0x74, 0x6d, 0x58, 0x71, 0x4b, 0x2b, 0x4c, 0x5a, 0x2f, 0x6b, 0x62, 0x64, 0x32, 0x42, 0x55, 0x41, \n\t0x4a, 0x38, 0x44, 0x44, 0x77, 0x42, 0x35, 0x47, 0x66, 0x61, 0x4a, 0x6e, 0x59, 0x43, 0x79, 0x7a, 0x42, 0x5c, 0x0a,\n\t0x09, 0x53, 0x4e, 0x47, 0x37, 0x64, 0x72, 0x50, 0x72, 0x69, 0x55, 0x57, 0x70, 0x4b, 0x53, 0x62, 0x30, 0x6a, \n\t0x55, 0x5a, 0x38, 0x74, 0x31, 0x51, 0x4b, 0x62, 0x66, 0x58, 0x6d, 0x4d, 0x77, 0x7a, 0x38, 0x34, 0x6e, 0x58, \n\t0x4d, 0x76, 0x71, 0x54, 0x51, 0x56, 0x6c, 0x4a, 0x6b, 0x43, 0x6a, 0x61, 0x74, 0x52, 0x69, 0x37, 0x4c, 0x74, \n\t0x37, 0x6b, 0x74, 0x46, 0x66, 0x6b, 0x34, 0x6a, 0x5a, 0x50, 0x4a, 0x77, 0x43, 0x49, 0x41, 0x72, 0x65, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x30, 0x61, 0x33, 0x47, 0x2b, 0x35, 0x56, 0x48, 0x79, 0x6e, 0x2f, 0x6d, 0x79, 0x4b, 0x33, 0x45, \n\t0x41, 0x61, 0x75, 0x31, 0x55, 0x38, 0x6e, 0x36, 0x79, 0x45, 0x69, 0x6b, 0x6b, 0x33, 0x72, 0x6d, 0x5a, 0x52, \n\t0x6f, 0x72, 0x45, 0x76, 0x70, 0x4e, 0x32, 0x38, 0x59, 0x35, 0x68, 0x6a, 0x6f, 0x35, 0x77, 0x45, 0x6e, 0x69, \n\t0x6e, 0x2f, 0x54, 0x35, 0x35, 0x36, 0x4c, 0x39, 0x69, 0x70, 0x6f, 0x44, 0x61, 0x4f, 0x4a, 0x32, 0x38, 0x5c, 0x0a,\n\t0x09, 0x74, 0x53, 0x75, 0x75, 0x44, 0x4a, 0x77, 0x7a, 0x4d, 0x4b, 0x34, 0x2b, 0x46, 0x4e, 0x55, 0x62, 0x70, \n\t0x68, 0x4a, 0x38, 0x62, 0x49, 0x47, 0x72, 0x50, 0x72, 0x53, 0x44, 0x62, 0x64, 0x6e, 0x46, 0x35, 0x53, 0x4a, \n\t0x37, 0x4a, 0x34, 0x47, 0x4e, 0x39, 0x6f, 0x50, 0x2b, 0x77, 0x52, 0x6b, 0x48, 0x4d, 0x77, 0x74, 0x53, 0x78, \n\t0x45, 0x66, 0x6b, 0x75, 0x38, 0x74, 0x41, 0x79, 0x57, 0x6f, 0x79, 0x36, 0x37, 0x39, 0x6c, 0x74, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x32, 0x6e, 0x64, 0x39, 0x31, 0x66, 0x75, 0x62, 0x54, 0x71, 0x65, 0x53, 0x37, 0x64, 0x2b, 0x77, 0x4b, \n\t0x44, 0x4c, 0x2b, 0x38, 0x66, 0x34, 0x52, 0x39, 0x63, 0x65, 0x54, 0x50, 0x4b, 0x58, 0x50, 0x45, 0x32, 0x30, \n\t0x6a, 0x6a, 0x52, 0x67, 0x39, 0x6d, 0x58, 0x44, 0x6d, 0x59, 0x57, 0x69, 0x2b, 0x79, 0x64, 0x78, 0x73, 0x55, \n\t0x38, 0x47, 0x4e, 0x37, 0x4c, 0x74, 0x66, 0x55, 0x4a, 0x4f, 0x2f, 0x61, 0x76, 0x72, 0x45, 0x45, 0x75, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x75, 0x77, 0x45, 0x55, 0x6c, 0x31, 0x39, 0x39, 0x4b, 0x2f, 0x66, 0x69, 0x54, 0x4b, 0x74, 0x45, \n\t0x4c, 0x6b, 0x38, 0x6e, 0x2b, 0x53, 0x65, 0x46, 0x73, 0x78, 0x4c, 0x43, 0x65, 0x75, 0x6c, 0x61, 0x5a, 0x4c, \n\t0x59, 0x32, 0x67, 0x53, 0x71, 0x54, 0x50, 0x6a, 0x68, 0x68, 0x56, 0x61, 0x64, 0x4a, 0x42, 0x46, 0x38, 0x63, \n\t0x44, 0x36, 0x78, 0x6e, 0x37, 0x2f, 0x68, 0x33, 0x4a, 0x46, 0x70, 0x6f, 0x72, 0x56, 0x30, 0x34, 0x62, 0x5c, 0x0a,\n\t0x09, 0x38, 0x74, 0x43, 0x6e, 0x43, 0x6a, 0x69, 0x4a, 0x66, 0x54, 0x46, 0x35, 0x77, 0x4a, 0x5a, 0x45, 0x2f, \n\t0x4e, 0x6a, 0x76, 0x41, 0x33, 0x56, 0x49, 0x38, 0x6f, 0x44, 0x7a, 0x79, 0x37, 0x68, 0x39, 0x52, 0x48, 0x76, \n\t0x57, 0x6a, 0x37, 0x32, 0x6b, 0x6c, 0x73, 0x62, 0x63, 0x71, 0x49, 0x79, 0x30, 0x4a, 0x69, 0x79, 0x7a, 0x48, \n\t0x30, 0x6c, 0x71, 0x35, 0x4d, 0x47, 0x37, 0x66, 0x50, 0x51, 0x69, 0x34, 0x58, 0x72, 0x2b, 0x47, 0x70, 0x5c, 0x0a,\n\t0x09, 0x30, 0x32, 0x6c, 0x4f, 0x73, 0x30, 0x57, 0x32, 0x54, 0x67, 0x4b, 0x6e, 0x41, 0x52, 0x67, 0x58, 0x33, \n\t0x43, 0x30, 0x4e, 0x79, 0x6f, 0x79, 0x53, 0x39, 0x4c, 0x50, 0x52, 0x30, 0x59, 0x4e, 0x78, 0x74, 0x46, 0x76, \n\t0x73, 0x6c, 0x44, 0x49, 0x5a, 0x32, 0x6e, 0x34, 0x6b, 0x55, 0x35, 0x59, 0x6b, 0x66, 0x49, 0x75, 0x69, 0x59, \n\t0x72, 0x65, 0x65, 0x4e, 0x4b, 0x64, 0x53, 0x6b, 0x61, 0x32, 0x54, 0x51, 0x47, 0x76, 0x34, 0x4a, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x51, 0x48, 0x6b, 0x32, 0x46, 0x65, 0x69, 0x6f, 0x77, 0x55, 0x43, 0x61, 0x54, 0x4c, 0x78, 0x6c, 0x6e, \n\t0x33, 0x51, 0x62, 0x6a, 0x2b, 0x54, 0x67, 0x64, 0x6d, 0x50, 0x4c, 0x4e, 0x45, 0x71, 0x44, 0x58, 0x6c, 0x51, \n\t0x68, 0x38, 0x7a, 0x6c, 0x72, 0x59, 0x58, 0x4c, 0x76, 0x62, 0x43, 0x63, 0x4d, 0x4b, 0x4d, 0x69, 0x77, 0x57, \n\t0x61, 0x52, 0x67, 0x71, 0x79, 0x31, 0x6c, 0x4d, 0x70, 0x36, 0x42, 0x66, 0x36, 0x70, 0x48, 0x33, 0x31, 0x5c, 0x0a,\n\t0x09, 0x46, 0x45, 0x5a, 0x48, 0x4a, 0x72, 0x62, 0x4e, 0x48, 0x67, 0x6d, 0x6a, 0x4f, 0x37, 0x6e, 0x66, 0x77, \n\t0x7a, 0x6f, 0x4a, 0x6a, 0x41, 0x4e, 0x49, 0x65, 0x51, 0x45, 0x48, 0x6b, 0x77, 0x79, 0x4d, 0x37, 0x73, 0x77, \n\t0x36, 0x71, 0x56, 0x5a, 0x4e, 0x52, 0x6c, 0x49, 0x38, 0x68, 0x47, 0x4c, 0x5a, 0x6b, 0x55, 0x7a, 0x41, 0x4a, \n\t0x37, 0x62, 0x50, 0x74, 0x4b, 0x32, 0x4c, 0x54, 0x4a, 0x31, 0x59, 0x58, 0x41, 0x43, 0x51, 0x38, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x50, 0x69, 0x44, 0x67, 0x48, 0x6a, 0x77, 0x30, 0x78, 0x47, 0x51, 0x63, 0x6f, 0x4c, 0x6f, 0x48, 0x34, \n\t0x75, 0x36, 0x73, 0x6f, 0x50, 0x57, 0x55, 0x4b, 0x5a, 0x37, 0x69, 0x33, 0x4c, 0x4b, 0x42, 0x65, 0x6e, 0x4a, \n\t0x36, 0x4a, 0x4f, 0x6f, 0x61, 0x33, 0x44, 0x75, 0x78, 0x59, 0x41, 0x5a, 0x55, 0x71, 0x52, 0x71, 0x30, 0x36, \n\t0x54, 0x37, 0x34, 0x30, 0x4d, 0x42, 0x73, 0x4a, 0x66, 0x62, 0x55, 0x41, 0x71, 0x45, 0x66, 0x38, 0x34, 0x5c, 0x0a,\n\t0x09, 0x76, 0x6d, 0x56, 0x52, 0x70, 0x49, 0x4c, 0x4d, 0x58, 0x38, 0x6e, 0x73, 0x47, 0x78, 0x54, 0x36, 0x79, \n\t0x47, 0x55, 0x46, 0x39, 0x75, 0x4d, 0x70, 0x6f, 0x61, 0x33, 0x44, 0x75, 0x2b, 0x4d, 0x41, 0x53, 0x6e, 0x6d, \n\t0x68, 0x71, 0x7a, 0x42, 0x4b, 0x33, 0x39, 0x65, 0x42, 0x63, 0x62, 0x59, 0x33, 0x30, 0x2f, 0x44, 0x6b, 0x66, \n\t0x50, 0x4b, 0x66, 0x2b, 0x6a, 0x78, 0x79, 0x5a, 0x66, 0x36, 0x6f, 0x50, 0x73, 0x72, 0x73, 0x49, 0x73, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x50, 0x4c, 0x68, 0x72, 0x5a, 0x54, 0x76, 0x4e, 0x5a, 0x59, 0x56, 0x39, 0x71, 0x56, 0x5a, 0x6e, \n\t0x39, 0x65, 0x46, 0x52, 0x6b, 0x36, 0x79, 0x54, 0x51, 0x43, 0x6a, 0x56, 0x55, 0x47, 0x65, 0x55, 0x57, 0x59, \n\t0x63, 0x69, 0x48, 0x71, 0x52, 0x6b, 0x4d, 0x76, 0x6a, 0x51, 0x79, 0x4f, 0x6c, 0x46, 0x6d, 0x6c, 0x6c, 0x4b, \n\t0x77, 0x34, 0x51, 0x47, 0x43, 0x33, 0x36, 0x70, 0x48, 0x75, 0x62, 0x6b, 0x4d, 0x4b, 0x61, 0x77, 0x69, 0x5c, 0x0a,\n\t0x09, 0x42, 0x52, 0x53, 0x55, 0x32, 0x68, 0x4b, 0x43, 0x6a, 0x39, 0x31, 0x4f, 0x2f, 0x6a, 0x50, 0x33, 0x58, \n\t0x35, 0x6b, 0x6d, 0x4a, 0x4c, 0x6e, 0x58, 0x4f, 0x62, 0x45, 0x74, 0x46, 0x66, 0x68, 0x52, 0x4b, 0x74, 0x4d, \n\t0x54, 0x30, 0x51, 0x45, 0x52, 0x4c, 0x36, 0x64, 0x50, 0x38, 0x36, 0x62, 0x39, 0x34, 0x4a, 0x74, 0x58, 0x69, \n\t0x58, 0x35, 0x49, 0x48, 0x4b, 0x37, 0x70, 0x42, 0x30, 0x34, 0x54, 0x33, 0x33, 0x79, 0x51, 0x30, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x71, 0x47, 0x44, 0x4b, 0x47, 0x67, 0x6a, 0x39, 0x42, 0x39, 0x74, 0x78, 0x4b, 0x36, 0x37, 0x31, 0x61, \n\t0x68, 0x66, 0x32, 0x4c, 0x50, 0x63, 0x59, 0x79, 0x54, 0x50, 0x63, 0x36, 0x45, 0x50, 0x7a, 0x73, 0x64, 0x72, \n\t0x4c, 0x31, 0x6b, 0x43, 0x69, 0x74, 0x39, 0x36, 0x51, 0x69, 0x6e, 0x4c, 0x39, 0x69, 0x4e, 0x74, 0x53, 0x58, \n\t0x42, 0x76, 0x37, 0x41, 0x47, 0x35, 0x4b, 0x75, 0x6d, 0x32, 0x6a, 0x2b, 0x47, 0x6f, 0x62, 0x38, 0x63, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x66, 0x62, 0x69, 0x33, 0x70, 0x45, 0x7a, 0x6f, 0x77, 0x74, 0x6f, 0x48, 0x37, 0x51, 0x54, 0x66, \n\t0x30, 0x48, 0x34, 0x51, 0x66, 0x41, 0x33, 0x56, 0x4e, 0x6d, 0x50, 0x37, 0x77, 0x35, 0x7a, 0x64, 0x49, 0x52, \n\t0x6f, 0x4c, 0x6e, 0x38, 0x46, 0x51, 0x43, 0x36, 0x4a, 0x34, 0x46, 0x73, 0x36, 0x55, 0x39, 0x69, 0x35, 0x6a, \n\t0x65, 0x53, 0x72, 0x7a, 0x66, 0x54, 0x39, 0x61, 0x42, 0x76, 0x61, 0x2b, 0x32, 0x31, 0x43, 0x57, 0x33, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x77, 0x53, 0x58, 0x7a, 0x7a, 0x51, 0x57, 0x4a, 0x50, 0x76, 0x6f, 0x34, 0x35, 0x36, 0x44, 0x7a, \n\t0x72, 0x79, 0x39, 0x50, 0x79, 0x38, 0x4d, 0x2b, 0x66, 0x5a, 0x52, 0x66, 0x2f, 0x35, 0x49, 0x61, 0x4c, 0x61, \n\t0x4d, 0x4d, 0x62, 0x77, 0x6a, 0x6f, 0x45, 0x4b, 0x64, 0x46, 0x62, 0x75, 0x2b, 0x68, 0x66, 0x74, 0x39, 0x31, \n\t0x4e, 0x6d, 0x79, 0x4e, 0x4a, 0x7a, 0x53, 0x7a, 0x41, 0x74, 0x36, 0x41, 0x53, 0x70, 0x57, 0x6f, 0x79, 0x5c, 0x0a,\n\t0x09, 0x53, 0x6d, 0x6b, 0x65, 0x42, 0x46, 0x54, 0x4d, 0x67, 0x53, 0x47, 0x4d, 0x63, 0x33, 0x33, 0x6f, 0x4a, \n\t0x38, 0x36, 0x69, 0x48, 0x2b, 0x6a, 0x41, 0x48, 0x42, 0x41, 0x48, 0x45, 0x77, 0x43, 0x68, 0x37, 0x79, 0x38, \n\t0x69, 0x65, 0x50, 0x64, 0x4e, 0x41, 0x42, 0x65, 0x42, 0x53, 0x6c, 0x7a, 0x6b, 0x53, 0x45, 0x58, 0x54, 0x59, \n\t0x78, 0x7a, 0x59, 0x41, 0x44, 0x79, 0x74, 0x56, 0x70, 0x66, 0x6a, 0x75, 0x37, 0x73, 0x61, 0x62, 0x56, 0x5c, 0x0a,\n\t0x09, 0x65, 0x72, 0x4b, 0x7a, 0x49, 0x32, 0x55, 0x71, 0x66, 0x36, 0x53, 0x4a, 0x78, 0x71, 0x41, 0x70, 0x6f, \n\t0x38, 0x2b, 0x56, 0x30, 0x4a, 0x70, 0x62, 0x71, 0x51, 0x34, 0x50, 0x4c, 0x30, 0x35, 0x6d, 0x45, 0x6a, 0x4c, \n\t0x68, 0x50, 0x41, 0x62, 0x73, 0x4b, 0x4e, 0x6a, 0x55, 0x41, 0x37, 0x51, 0x50, 0x69, 0x52, 0x52, 0x6c, 0x64, \n\t0x72, 0x32, 0x37, 0x68, 0x44, 0x6c, 0x67, 0x68, 0x2f, 0x2b, 0x77, 0x35, 0x37, 0x63, 0x75, 0x6b, 0x45, 0x5c, 0x0a,\n\t0x09, 0x66, 0x75, 0x33, 0x61, 0x31, 0x59, 0x58, 0x4e, 0x49, 0x4d, 0x4f, 0x5a, 0x4e, 0x62, 0x6b, 0x34, 0x51, \n\t0x6e, 0x6a, 0x74, 0x30, 0x74, 0x48, 0x4f, 0x39, 0x69, 0x59, 0x4d, 0x77, 0x59, 0x66, 0x6d, 0x6f, 0x64, 0x5a, \n\t0x4f, 0x74, 0x59, 0x76, 0x66, 0x77, 0x30, 0x50, 0x36, 0x33, 0x6d, 0x33, 0x41, 0x2b, 0x43, 0x71, 0x77, 0x43, \n\t0x63, 0x42, 0x2f, 0x57, 0x35, 0x54, 0x51, 0x6d, 0x6e, 0x70, 0x50, 0x42, 0x4d, 0x63, 0x43, 0x33, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x49, 0x6f, 0x6f, 0x61, 0x2b, 0x6b, 0x2b, 0x33, 0x73, 0x52, 0x2b, 0x4c, 0x73, 0x58, 0x66, 0x79, 0x2b, \n\t0x48, 0x4c, 0x32, 0x47, 0x73, 0x77, 0x35, 0x63, 0x46, 0x41, 0x50, 0x45, 0x74, 0x37, 0x7a, 0x48, 0x30, 0x79, \n\t0x76, 0x74, 0x65, 0x2b, 0x76, 0x49, 0x4d, 0x33, 0x35, 0x49, 0x5a, 0x52, 0x4e, 0x61, 0x6c, 0x63, 0x7a, 0x77, \n\t0x35, 0x48, 0x62, 0x35, 0x34, 0x50, 0x54, 0x34, 0x72, 0x77, 0x34, 0x6f, 0x65, 0x71, 0x67, 0x47, 0x47, 0x5c, 0x0a,\n\t0x09, 0x64, 0x68, 0x31, 0x6a, 0x36, 0x4c, 0x6d, 0x44, 0x6d, 0x4e, 0x72, 0x34, 0x33, 0x78, 0x2f, 0x77, 0x66, \n\t0x37, 0x47, 0x57, 0x79, 0x4b, 0x4f, 0x4c, 0x37, 0x66, 0x39, 0x64, 0x4b, 0x31, 0x61, 0x47, 0x72, 0x38, 0x76, \n\t0x5a, 0x36, 0x2b, 0x50, 0x49, 0x35, 0x51, 0x42, 0x30, 0x43, 0x72, 0x43, 0x4c, 0x34, 0x51, 0x4e, 0x51, 0x76, \n\t0x65, 0x55, 0x63, 0x67, 0x37, 0x39, 0x37, 0x43, 0x36, 0x4f, 0x31, 0x31, 0x39, 0x6e, 0x4c, 0x4c, 0x61, 0x5c, 0x0a,\n\t0x09, 0x46, 0x4a, 0x51, 0x63, 0x4a, 0x72, 0x47, 0x76, 0x45, 0x76, 0x6e, 0x6d, 0x4e, 0x58, 0x48, 0x51, 0x50, \n\t0x75, 0x49, 0x67, 0x64, 0x78, 0x6b, 0x50, 0x73, 0x52, 0x64, 0x68, 0x46, 0x57, 0x45, 0x50, 0x41, 0x46, 0x41, \n\t0x44, 0x53, 0x44, 0x2b, 0x4d, 0x36, 0x6a, 0x4a, 0x4c, 0x62, 0x2f, 0x47, 0x2f, 0x50, 0x43, 0x55, 0x43, 0x37, \n\t0x74, 0x49, 0x51, 0x55, 0x55, 0x66, 0x50, 0x66, 0x4d, 0x49, 0x58, 0x54, 0x2f, 0x41, 0x75, 0x54, 0x43, 0x5c, 0x0a,\n\t0x09, 0x39, 0x4f, 0x35, 0x69, 0x42, 0x2f, 0x41, 0x49, 0x49, 0x4d, 0x35, 0x36, 0x6a, 0x64, 0x62, 0x75, 0x47, \n\t0x43, 0x38, 0x68, 0x2f, 0x41, 0x44, 0x72, 0x45, 0x6b, 0x49, 0x59, 0x68, 0x73, 0x2f, 0x70, 0x39, 0x35, 0x39, \n\t0x45, 0x32, 0x39, 0x2b, 0x4b, 0x66, 0x71, 0x54, 0x4c, 0x31, 0x63, 0x35, 0x62, 0x6d, 0x56, 0x32, 0x4d, 0x62, \n\t0x30, 0x6b, 0x56, 0x67, 0x57, 0x57, 0x31, 0x32, 0x59, 0x46, 0x33, 0x44, 0x50, 0x67, 0x78, 0x31, 0x72, 0x5c, 0x0a,\n\t0x09, 0x57, 0x53, 0x54, 0x2b, 0x51, 0x53, 0x51, 0x6a, 0x59, 0x71, 0x67, 0x56, 0x38, 0x42, 0x44, 0x77, 0x44, \n\t0x70, 0x67, 0x33, 0x57, 0x7a, 0x66, 0x77, 0x6a, 0x74, 0x35, 0x46, 0x6d, 0x4d, 0x39, 0x6f, 0x75, 0x6b, 0x75, \n\t0x76, 0x75, 0x74, 0x2f, 0x32, 0x6c, 0x43, 0x52, 0x34, 0x72, 0x34, 0x6b, 0x59, 0x76, 0x43, 0x4b, 0x4a, 0x57, \n\t0x54, 0x55, 0x47, 0x73, 0x71, 0x6b, 0x4d, 0x73, 0x4c, 0x73, 0x74, 0x73, 0x79, 0x73, 0x55, 0x62, 0x47, 0x5c, 0x0a,\n\t0x09, 0x54, 0x37, 0x45, 0x75, 0x43, 0x34, 0x30, 0x5a, 0x34, 0x33, 0x6b, 0x52, 0x61, 0x44, 0x62, 0x57, 0x74, \n\t0x5a, 0x4c, 0x56, 0x57, 0x4a, 0x4f, 0x52, 0x46, 0x2f, 0x52, 0x67, 0x43, 0x58, 0x73, 0x4f, 0x4f, 0x44, 0x46, \n\t0x65, 0x68, 0x47, 0x42, 0x38, 0x42, 0x64, 0x70, 0x51, 0x67, 0x53, 0x56, 0x59, 0x42, 0x79, 0x50, 0x31, 0x57, \n\t0x4d, 0x4b, 0x6a, 0x67, 0x4a, 0x31, 0x73, 0x69, 0x57, 0x48, 0x64, 0x6d, 0x47, 0x67, 0x47, 0x6a, 0x67, 0x5c, 0x0a,\n\t0x09, 0x43, 0x37, 0x73, 0x58, 0x59, 0x47, 0x77, 0x76, 0x78, 0x4b, 0x4c, 0x70, 0x67, 0x49, 0x67, 0x66, 0x39, \n\t0x58, 0x2b, 0x4e, 0x54, 0x66, 0x4e, 0x72, 0x77, 0x75, 0x38, 0x46, 0x72, 0x48, 0x64, 0x59, 0x48, 0x58, 0x4f, \n\t0x76, 0x34, 0x48, 0x58, 0x44, 0x47, 0x5a, 0x33, 0x2f, 0x44, 0x69, 0x6c, 0x39, 0x41, 0x41, 0x41, 0x41, 0x41, \n\t0x41, 0x53, 0x55, 0x56, 0x4f, 0x52, 0x4b, 0x35, 0x43, 0x59, 0x49, 0x49, 0x3d, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5b, 0x31, 0x5d, 0x2e, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, \n\t0x5f, 0x70, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, \n\t0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, \n\t0x65, 0x36, 0x34, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x42, 0x77, 0x41, 0x41, 0x41, 0x41, 0x63, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x42, 0x79, 0x44, 0x64, 0x2b, 0x55, 0x41, 0x41, 0x41, 0x43, 0x48, 0x6b, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x49, 0x69, 0x65, 0x32, 0x56, 0x7a, 0x57, 0x73, 0x54, 0x51, 0x52, 0x6a, 0x47, 0x6e, 0x39, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x32, 0x74, 0x37, 0x47, 0x6b, 0x74, 0x6d, 0x6d, 0x4c, 0x4a, 0x69, 0x44, 0x31, 0x59, 0x50, 0x77, \n\t0x34, 0x2b, 0x48, 0x48, 0x77, 0x49, 0x49, 0x71, 0x69, 0x39, 0x46, 0x43, 0x77, 0x30, 0x44, 0x39, 0x41, 0x73, \n\t0x52, 0x52, 0x46, 0x2f, 0x41, 0x63, 0x38, 0x32, 0x4c, 0x4e, 0x51, 0x2f, 0x77, 0x4a, 0x50, 0x51, 0x69, 0x2b, \n\t0x43, 0x56, 0x34, 0x38, 0x57, 0x52, 0x4f, 0x71, 0x68, 0x67, 0x72, 0x5a, 0x47, 0x67, 0x6c, 0x4a, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x43, 0x59, 0x4b, 0x47, 0x51, 0x6d, 0x31, 0x4d, 0x6b, 0x37, 0x6a, 0x35, 0x61, 0x48, 0x64, 0x6d, 0x73, \n\t0x2f, 0x4e, 0x34, 0x73, 0x46, 0x67, 0x2f, 0x73, 0x73, 0x32, 0x75, 0x6c, 0x6f, 0x4b, 0x6c, 0x41, 0x33, 0x4d, \n\t0x59, 0x65, 0x4e, 0x2f, 0x6e, 0x4e, 0x38, 0x2b, 0x38, 0x76, 0x4f, 0x38, 0x49, 0x6b, 0x74, 0x6a, 0x4f, 0x5a, \n\t0x57, 0x77, 0x72, 0x62, 0x52, 0x65, 0x34, 0x49, 0x34, 0x44, 0x74, 0x6f, 0x54, 0x4d, 0x38, 0x43, 0x58, 0x5c, 0x0a,\n\t0x09, 0x70, 0x72, 0x36, 0x77, 0x64, 0x43, 0x57, 0x4c, 0x46, 0x51, 0x36, 0x65, 0x45, 0x63, 0x61, 0x67, 0x6d, \n\t0x30, 0x64, 0x52, 0x77, 0x57, 0x77, 0x6b, 0x68, 0x42, 0x6c, 0x65, 0x61, 0x46, 0x46, 0x52, 0x75, 0x67, 0x61, \n\t0x34, 0x65, 0x53, 0x41, 0x4d, 0x6c, 0x41, 0x57, 0x37, 0x74, 0x31, 0x6b, 0x4c, 0x78, 0x45, 0x75, 0x57, 0x4b, \n\t0x72, 0x39, 0x44, 0x58, 0x4b, 0x6c, 0x36, 0x65, 0x70, 0x76, 0x37, 0x37, 0x4c, 0x6b, 0x30, 0x78, 0x71, 0x5c, 0x0a,\n\t0x09, 0x57, 0x51, 0x79, 0x73, 0x45, 0x77, 0x79, 0x6d, 0x4b, 0x69, 0x41, 0x35, 0x71, 0x75, 0x75, 0x4c, 0x72, \n\t0x6b, 0x6f, 0x4e, 0x30, 0x35, 0x6c, 0x4a, 0x30, 0x4a, 0x6c, 0x4a, 0x66, 0x49, 0x63, 0x57, 0x35, 0x38, 0x6f, \n\t0x6b, 0x54, 0x31, 0x43, 0x75, 0x42, 0x4e, 0x4a, 0x71, 0x2f, 0x61, 0x52, 0x75, 0x46, 0x63, 0x4c, 0x73, 0x75, \n\t0x73, 0x31, 0x71, 0x39, 0x6d, 0x46, 0x6a, 0x2f, 0x6b, 0x71, 0x37, 0x58, 0x6b, 0x74, 0x76, 0x76, 0x45, 0x5c, 0x0a,\n\t0x09, 0x35, 0x6a, 0x43, 0x57, 0x72, 0x68, 0x65, 0x67, 0x39, 0x4b, 0x73, 0x79, 0x39, 0x67, 0x39, 0x5a, 0x32, \n\t0x68, 0x4c, 0x4c, 0x53, 0x55, 0x45, 0x79, 0x31, 0x47, 0x6d, 0x77, 0x42, 0x77, 0x44, 0x2b, 0x58, 0x55, 0x75, \n\t0x46, 0x79, 0x34, 0x42, 0x58, 0x6a, 0x4c, 0x7a, 0x61, 0x4f, 0x4d, 0x4b, 0x4d, 0x77, 0x6a, 0x6b, 0x36, 0x74, \n\t0x47, 0x2f, 0x34, 0x55, 0x52, 0x4f, 0x73, 0x76, 0x54, 0x49, 0x68, 0x4c, 0x33, 0x46, 0x66, 0x52, 0x33, 0x5c, 0x0a,\n\t0x09, 0x36, 0x44, 0x6b, 0x41, 0x63, 0x46, 0x63, 0x58, 0x70, 0x73, 0x64, 0x6c, 0x35, 0x71, 0x6f, 0x2f, 0x44, \n\t0x41, 0x42, 0x30, 0x44, 0x57, 0x37, 0x32, 0x52, 0x71, 0x66, 0x4f, 0x50, 0x35, 0x30, 0x53, 0x6b, 0x66, 0x67, \n\t0x67, 0x5a, 0x63, 0x6e, 0x66, 0x67, 0x61, 0x39, 0x44, 0x7a, 0x77, 0x48, 0x63, 0x53, 0x6b, 0x47, 0x6d, 0x68, \n\t0x2f, 0x72, 0x68, 0x66, 0x66, 0x47, 0x48, 0x2f, 0x61, 0x4a, 0x6d, 0x77, 0x54, 0x72, 0x35, 0x7a, 0x45, 0x5c, 0x0a,\n\t0x09, 0x59, 0x6b, 0x33, 0x69, 0x50, 0x4d, 0x61, 0x4e, 0x4d, 0x51, 0x66, 0x34, 0x66, 0x30, 0x67, 0x4d, 0x69, \n\t0x2b, 0x55, 0x65, 0x76, 0x59, 0x5a, 0x41, 0x4e, 0x47, 0x62, 0x77, 0x42, 0x61, 0x47, 0x38, 0x79, 0x42, 0x43, \n\t0x59, 0x69, 0x75, 0x35, 0x42, 0x31, 0x6f, 0x35, 0x58, 0x2b, 0x6e, 0x7a, 0x57, 0x70, 0x49, 0x56, 0x59, 0x61, \n\t0x77, 0x59, 0x73, 0x4f, 0x30, 0x33, 0x7a, 0x39, 0x32, 0x4d, 0x32, 0x4d, 0x64, 0x62, 0x43, 0x77, 0x31, 0x5c, 0x0a,\n\t0x09, 0x44, 0x7a, 0x54, 0x32, 0x77, 0x44, 0x78, 0x30, 0x33, 0x7a, 0x50, 0x32, 0x58, 0x78, 0x37, 0x6a, 0x61, \n\t0x75, 0x36, 0x52, 0x36, 0x44, 0x7a, 0x34, 0x64, 0x30, 0x41, 0x41, 0x6f, 0x47, 0x74, 0x44, 0x6d, 0x4e, 0x33, \n\t0x6e, 0x57, 0x63, 0x6c, 0x4d, 0x4e, 0x54, 0x49, 0x33, 0x6f, 0x39, 0x72, 0x39, 0x2b, 0x42, 0x75, 0x73, 0x46, \n\t0x2b, 0x62, 0x52, 0x42, 0x33, 0x57, 0x6a, 0x37, 0x39, 0x77, 0x49, 0x6e, 0x63, 0x2f, 0x50, 0x52, 0x53, 0x5c, 0x0a,\n\t0x09, 0x53, 0x78, 0x71, 0x56, 0x37, 0x41, 0x50, 0x72, 0x52, 0x42, 0x38, 0x70, 0x53, 0x75, 0x5a, 0x49, 0x74, \n\t0x71, 0x39, 0x75, 0x4b, 0x50, 0x50, 0x6c, 0x53, 0x76, 0x7a, 0x6c, 0x4b, 0x58, 0x33, 0x2b, 0x5a, 0x4a, 0x48, \n\t0x74, 0x64, 0x4f, 0x59, 0x65, 0x73, 0x61, 0x2f, 0x36, 0x66, 0x6d, 0x54, 0x2b, 0x72, 0x61, 0x70, 0x30, 0x55, \n\t0x31, 0x4e, 0x30, 0x6a, 0x31, 0x65, 0x6f, 0x69, 0x36, 0x38, 0x69, 0x46, 0x44, 0x38, 0x6f, 0x43, 0x57, 0x5c, 0x0a,\n\t0x09, 0x35, 0x61, 0x32, 0x64, 0x4e, 0x42, 0x76, 0x6a, 0x72, 0x51, 0x61, 0x53, 0x43, 0x56, 0x33, 0x4c, 0x76, \n\t0x64, 0x47, 0x31, 0x33, 0x42, 0x4f, 0x53, 0x65, 0x37, 0x57, 0x71, 0x68, 0x74, 0x4a, 0x6f, 0x57, 0x63, 0x4d, \n\t0x2f, 0x53, 0x71, 0x42, 0x73, 0x51, 0x4c, 0x76, 0x72, 0x39, 0x54, 0x4d, 0x68, 0x72, 0x4f, 0x35, 0x51, 0x2b, \n\t0x61, 0x47, 0x42, 0x2f, 0x37, 0x70, 0x32, 0x2f, 0x6f, 0x2b, 0x2f, 0x43, 0x2f, 0x7a, 0x2f, 0x67, 0x64, 0x5c, 0x0a,\n\t0x09, 0x38, 0x41, 0x63, 0x54, 0x70, 0x41, 0x66, 0x2b, 0x39, 0x42, 0x47, 0x50, 0x51, 0x41, 0x41, 0x41, 0x41, \n\t0x41, 0x53, 0x55, 0x56, 0x4f, 0x52, 0x4b, 0x35, 0x43, 0x59, 0x49, 0x49, 0x3d, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x40, 0x32, 0x78, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5b, 0x32, 0x5d, 0x2e, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, \n\t0x5f, 0x70, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, \n\t0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, \n\t0x65, 0x36, 0x34, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x44, 0x67, 0x41, 0x41, 0x41, 0x41, 0x34, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x43, 0x6f, 0x68, 0x6a, 0x73, 0x65, 0x41, 0x41, 0x41, 0x44, 0x70, 0x45, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x6f, 0x67, 0x65, 0x32, 0x5a, 0x62, 0x32, 0x68, 0x56, 0x5a, 0x52, 0x7a, 0x48, 0x50, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x63, 0x35, 0x35, 0x38, 0x77, 0x37, 0x39, 0x36, 0x63, 0x35, 0x59, 0x62, 0x47, 0x31, 0x6d, 0x69, 0x61, \n\t0x56, 0x75, 0x39, 0x74, 0x4b, 0x65, 0x75, 0x63, 0x4c, 0x45, 0x79, 0x6f, 0x73, 0x4b, 0x37, 0x47, 0x77, 0x49, \n\t0x43, 0x68, 0x45, 0x68, 0x6a, 0x47, 0x4b, 0x49, 0x52, 0x59, 0x47, 0x55, 0x59, 0x6b, 0x79, 0x6f, 0x68, 0x67, \n\t0x52, 0x4d, 0x6b, 0x59, 0x47, 0x47, 0x34, 0x6b, 0x55, 0x36, 0x61, 0x73, 0x69, 0x59, 0x72, 0x4b, 0x69, 0x5c, 0x0a,\n\t0x09, 0x49, 0x6d, 0x53, 0x2b, 0x4b, 0x4d, 0x49, 0x67, 0x57, 0x4c, 0x6f, 0x57, 0x72, 0x4a, 0x57, 0x34, 0x7a, \n\t0x4d, 0x6c, 0x57, 0x59, 0x2b, 0x72, 0x4e, 0x38, 0x2b, 0x66, 0x62, 0x69, 0x79, 0x30, 0x68, 0x61, 0x35, 0x62, \n\t0x33, 0x6e, 0x48, 0x50, 0x6c, 0x79, 0x50, 0x6e, 0x41, 0x67, 0x51, 0x76, 0x33, 0x50, 0x4e, 0x2f, 0x6e, 0x39, \n\t0x2b, 0x47, 0x65, 0x65, 0x35, 0x2f, 0x6e, 0x2b, 0x56, 0x31, 0x4c, 0x45, 0x74, 0x63, 0x79, 0x35, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x58, 0x6b, 0x44, 0x53, 0x5a, 0x59, 0x4e, 0x72, 0x4a, 0x42, 0x4e, 0x4e, 0x4f, 0x4a, 0x70, 0x68, \n\t0x32, 0x4d, 0x73, 0x47, 0x30, 0x6b, 0x77, 0x6d, 0x6d, 0x6e, 0x55, 0x77, 0x77, 0x37, 0x5a, 0x52, 0x53, 0x63, \n\t0x42, 0x30, 0x77, 0x44, 0x4a, 0x79, 0x63, 0x66, 0x31, 0x30, 0x61, 0x4a, 0x43, 0x56, 0x39, 0x32, 0x5a, 0x4b, \n\t0x36, 0x4a, 0x53, 0x6b, 0x38, 0x65, 0x30, 0x4c, 0x2b, 0x54, 0x2f, 0x73, 0x6c, 0x4b, 0x5a, 0x44, 0x30, 0x5c, 0x0a,\n\t0x09, 0x74, 0x42, 0x51, 0x6d, 0x50, 0x6e, 0x2f, 0x53, 0x45, 0x31, 0x52, 0x4a, 0x47, 0x70, 0x43, 0x6b, 0x63, \n\t0x47, 0x5a, 0x55, 0x46, 0x37, 0x35, 0x61, 0x6f, 0x38, 0x4a, 0x51, 0x76, 0x62, 0x79, 0x52, 0x72, 0x6e, 0x6c, \n\t0x48, 0x76, 0x61, 0x67, 0x77, 0x53, 0x4c, 0x51, 0x47, 0x4b, 0x38, 0x45, 0x44, 0x37, 0x34, 0x33, 0x41, 0x41, \n\t0x48, 0x43, 0x37, 0x70, 0x6f, 0x2f, 0x69, 0x66, 0x64, 0x2b, 0x42, 0x2f, 0x49, 0x6d, 0x4c, 0x62, 0x39, 0x5c, 0x0a,\n\t0x09, 0x70, 0x4c, 0x32, 0x33, 0x46, 0x75, 0x32, 0x77, 0x58, 0x47, 0x37, 0x55, 0x62, 0x68, 0x43, 0x31, 0x6a, \n\t0x4a, 0x66, 0x46, 0x75, 0x53, 0x45, 0x6d, 0x77, 0x44, 0x42, 0x6f, 0x45, 0x62, 0x77, 0x73, 0x6b, 0x76, 0x38, \n\t0x48, 0x37, 0x6f, 0x67, 0x48, 0x44, 0x32, 0x48, 0x7a, 0x66, 0x5a, 0x74, 0x5a, 0x74, 0x78, 0x56, 0x75, 0x34, \n\t0x47, 0x6b, 0x39, 0x73, 0x4c, 0x64, 0x41, 0x4b, 0x78, 0x46, 0x35, 0x4f, 0x45, 0x34, 0x46, 0x72, 0x67, 0x5c, 0x0a,\n\t0x09, 0x49, 0x36, 0x41, 0x36, 0x6e, 0x50, 0x67, 0x41, 0x37, 0x38, 0x66, 0x74, 0x49, 0x48, 0x2f, 0x42, 0x6d, \n\t0x2b, 0x32, 0x61, 0x54, 0x54, 0x6a, 0x35, 0x31, 0x38, 0x48, 0x6b, 0x39, 0x67, 0x4e, 0x62, 0x67, 0x53, 0x44, \n\t0x4f, 0x59, 0x75, 0x4a, 0x2b, 0x4c, 0x68, 0x34, 0x44, 0x50, 0x67, 0x57, 0x71, 0x67, 0x2f, 0x45, 0x2b, 0x76, \n\t0x4c, 0x48, 0x4f, 0x79, 0x38, 0x6f, 0x42, 0x42, 0x4c, 0x2b, 0x39, 0x6a, 0x7a, 0x2f, 0x63, 0x43, 0x66, 0x5c, 0x0a,\n\t0x09, 0x37, 0x73, 0x46, 0x75, 0x41, 0x67, 0x55, 0x42, 0x5a, 0x6e, 0x51, 0x58, 0x46, 0x2b, 0x67, 0x74, 0x75, \n\t0x41, 0x50, 0x52, 0x43, 0x61, 0x59, 0x4c, 0x51, 0x62, 0x2f, 0x33, 0x54, 0x76, 0x46, 0x51, 0x30, 0x32, 0x56, \n\t0x65, 0x74, 0x77, 0x38, 0x33, 0x76, 0x41, 0x58, 0x54, 0x49, 0x49, 0x50, 0x41, 0x71, 0x63, 0x69, 0x36, 0x4f, \n\t0x6f, 0x75, 0x41, 0x53, 0x37, 0x67, 0x4a, 0x32, 0x45, 0x42, 0x66, 0x79, 0x52, 0x6c, 0x77, 0x6d, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x44, 0x68, 0x51, 0x56, 0x59, 0x68, 0x61, 0x76, 0x77, 0x57, 0x31, 0x39, 0x43, 0x38, 0x70, 0x71, 0x44, \n\t0x77, 0x4d, 0x62, 0x67, 0x64, 0x2b, 0x6a, 0x46, 0x68, 0x5a, 0x56, 0x30, 0x41, 0x4c, 0x65, 0x41, 0x4a, 0x37, \n\t0x46, 0x6d, 0x38, 0x59, 0x2f, 0x76, 0x6f, 0x4e, 0x67, 0x5a, 0x6a, 0x42, 0x53, 0x51, 0x61, 0x62, 0x38, 0x54, \n\t0x74, 0x79, 0x57, 0x66, 0x5a, 0x43, 0x72, 0x2b, 0x78, 0x70, 0x34, 0x45, 0x4a, 0x69, 0x4d, 0x56, 0x47, 0x5c, 0x0a,\n\t0x09, 0x42, 0x45, 0x77, 0x52, 0x35, 0x67, 0x6d, 0x77, 0x71, 0x6e, 0x38, 0x4c, 0x39, 0x37, 0x68, 0x76, 0x44, \n\t0x38, 0x6c, 0x31, 0x47, 0x79, 0x4c, 0x6d, 0x4a, 0x79, 0x64, 0x2b, 0x44, 0x6b, 0x2b, 0x37, 0x45, 0x57, 0x4e, \n\t0x77, 0x34, 0x44, 0x64, 0x78, 0x4e, 0x42, 0x4d, 0x6f, 0x70, 0x67, 0x4a, 0x39, 0x43, 0x72, 0x32, 0x54, 0x48, \n\t0x38, 0x34, 0x31, 0x73, 0x4a, 0x2f, 0x78, 0x67, 0x70, 0x4e, 0x75, 0x64, 0x66, 0x4d, 0x59, 0x75, 0x61, 0x5c, 0x0a,\n\t0x09, 0x63, 0x66, 0x4c, 0x37, 0x73, 0x43, 0x71, 0x61, 0x6a, 0x67, 0x4c, 0x33, 0x55, 0x4f, 0x54, 0x6a, 0x47, \n\t0x6b, 0x56, 0x77, 0x52, 0x6a, 0x50, 0x48, 0x71, 0x72, 0x78, 0x6a, 0x6d, 0x2f, 0x2b, 0x32, 0x67, 0x4d, 0x65, \n\t0x4a, 0x63, 0x5a, 0x66, 0x6a, 0x74, 0x4c, 0x79, 0x4c, 0x56, 0x58, 0x6e, 0x7a, 0x49, 0x65, 0x43, 0x68, 0x6f, \n\t0x6a, 0x49, 0x69, 0x7a, 0x50, 0x2b, 0x35, 0x56, 0x64, 0x36, 0x41, 0x4b, 0x57, 0x2b, 0x4c, 0x45, 0x48, 0x5c, 0x0a,\n\t0x09, 0x46, 0x35, 0x51, 0x75, 0x39, 0x6e, 0x4e, 0x50, 0x4d, 0x74, 0x77, 0x4b, 0x70, 0x69, 0x4d, 0x36, 0x49, \n\t0x49, 0x50, 0x6f, 0x56, 0x62, 0x4d, 0x2b, 0x61, 0x30, 0x39, 0x47, 0x4a, 0x58, 0x62, 0x34, 0x67, 0x51, 0x73, \n\t0x77, 0x43, 0x6d, 0x48, 0x50, 0x65, 0x57, 0x50, 0x6b, 0x7a, 0x44, 0x49, 0x78, 0x37, 0x77, 0x52, 0x4e, 0x45, \n\t0x78, 0x45, 0x55, 0x6f, 0x34, 0x41, 0x39, 0x79, 0x48, 0x55, 0x33, 0x6e, 0x53, 0x61, 0x65, 0x33, 0x42, 0x5c, 0x0a,\n\t0x09, 0x72, 0x74, 0x6b, 0x55, 0x49, 0x65, 0x6f, 0x53, 0x54, 0x43, 0x32, 0x4c, 0x56, 0x68, 0x37, 0x41, 0x58, \n\t0x4c, 0x2f, 0x2b, 0x50, 0x48, 0x4e, 0x72, 0x34, 0x75, 0x46, 0x69, 0x6f, 0x2b, 0x4a, 0x59, 0x42, 0x35, 0x63, \n\t0x42, 0x6e, 0x78, 0x46, 0x36, 0x4b, 0x2f, 0x79, 0x52, 0x6e, 0x51, 0x52, 0x54, 0x37, 0x30, 0x51, 0x4b, 0x4d, \n\t0x2b, 0x35, 0x79, 0x6e, 0x4f, 0x5a, 0x2b, 0x72, 0x4f, 0x72, 0x38, 0x46, 0x48, 0x4e, 0x72, 0x34, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x45, 0x6f, 0x65, 0x58, 0x45, 0x74, 0x39, 0x41, 0x33, 0x41, 0x4a, 0x34, 0x52, 0x65, 0x71, 0x7a, 0x2f, \n\t0x36, 0x43, 0x73, 0x47, 0x5a, 0x2f, 0x71, 0x4a, 0x43, 0x54, 0x4b, 0x34, 0x4e, 0x70, 0x37, 0x6b, 0x50, 0x71, \n\t0x36, 0x4a, 0x70, 0x48, 0x46, 0x67, 0x50, 0x52, 0x50, 0x35, 0x70, 0x6a, 0x6e, 0x4f, 0x72, 0x74, 0x67, 0x51, \n\t0x34, 0x42, 0x4f, 0x48, 0x71, 0x59, 0x50, 0x51, 0x31, 0x2f, 0x4e, 0x4e, 0x76, 0x58, 0x74, 0x46, 0x67, 0x5c, 0x0a,\n\t0x09, 0x55, 0x37, 0x45, 0x57, 0x74, 0x37, 0x6b, 0x48, 0x63, 0x6e, 0x58, 0x66, 0x41, 0x41, 0x38, 0x41, 0x76, \n\t0x38, 0x5a, 0x52, 0x56, 0x4a, 0x79, 0x62, 0x37, 0x57, 0x6e, 0x67, 0x58, 0x6a, 0x43, 0x44, 0x39, 0x71, 0x30, \n\t0x76, 0x34, 0x64, 0x54, 0x76, 0x2b, 0x4e, 0x38, 0x44, 0x37, 0x65, 0x73, 0x32, 0x34, 0x72, 0x62, 0x31, 0x51, \n\t0x36, 0x35, 0x75, 0x45, 0x4c, 0x69, 0x4c, 0x6d, 0x4f, 0x51, 0x67, 0x2f, 0x74, 0x50, 0x45, 0x4f, 0x65, 0x5c, 0x0a,\n\t0x09, 0x42, 0x68, 0x34, 0x4b, 0x43, 0x39, 0x34, 0x6a, 0x6d, 0x63, 0x78, 0x6c, 0x33, 0x2f, 0x4f, 0x63, 0x42, \n\t0x65, 0x32, 0x6f, 0x37, 0x54, 0x30, 0x67, 0x4e, 0x4f, 0x35, 0x64, 0x76, 0x41, 0x42, 0x75, 0x42, 0x73, 0x6e, \n\t0x41, 0x55, 0x6c, 0x63, 0x59, 0x79, 0x2b, 0x41, 0x44, 0x77, 0x4a, 0x37, 0x4c, 0x57, 0x58, 0x64, 0x65, 0x44, \n\t0x63, 0x39, 0x4f, 0x71, 0x43, 0x4e, 0x7a, 0x72, 0x31, 0x7a, 0x2b, 0x4d, 0x30, 0x64, 0x34, 0x45, 0x70, 0x5c, 0x0a,\n\t0x09, 0x32, 0x34, 0x33, 0x43, 0x32, 0x4d, 0x2b, 0x43, 0x51, 0x4f, 0x49, 0x39, 0x6d, 0x53, 0x35, 0x4a, 0x43, \n\t0x6b, 0x2b, 0x38, 0x70, 0x38, 0x4a, 0x51, 0x6f, 0x77, 0x70, 0x44, 0x39, 0x66, 0x4e, 0x58, 0x77, 0x31, 0x2f, \n\t0x4e, 0x4a, 0x30, 0x39, 0x53, 0x65, 0x35, 0x4c, 0x4e, 0x70, 0x38, 0x53, 0x37, 0x57, 0x70, 0x4b, 0x32, 0x53, \n\t0x31, 0x49, 0x77, 0x38, 0x65, 0x47, 0x63, 0x35, 0x4a, 0x45, 0x6d, 0x42, 0x62, 0x38, 0x4d, 0x53, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x73, 0x70, 0x50, 0x75, 0x54, 0x6e, 0x72, 0x38, 0x55, 0x67, 0x6b, 0x68, 0x36, 0x58, 0x46, 0x49, \n\t0x68, 0x4f, 0x50, 0x57, 0x78, 0x67, 0x73, 0x6b, 0x68, 0x53, 0x52, 0x71, 0x58, 0x74, 0x4b, 0x6f, 0x55, 0x63, \n\t0x79, 0x66, 0x5a, 0x56, 0x62, 0x75, 0x55, 0x31, 0x63, 0x79, 0x31, 0x4a, 0x49, 0x61, 0x42, 0x4c, 0x63, 0x7a, \n\t0x74, 0x68, 0x42, 0x4b, 0x6e, 0x6c, 0x49, 0x4a, 0x58, 0x68, 0x65, 0x79, 0x2f, 0x69, 0x62, 0x53, 0x54, 0x5c, 0x0a,\n\t0x09, 0x43, 0x61, 0x61, 0x64, 0x54, 0x44, 0x44, 0x74, 0x5a, 0x49, 0x4a, 0x70, 0x4a, 0x78, 0x4e, 0x4d, 0x4f, \n\t0x35, 0x6c, 0x67, 0x32, 0x73, 0x6b, 0x45, 0x30, 0x38, 0x34, 0x31, 0x4c, 0x2f, 0x67, 0x6e, 0x62, 0x49, 0x74, \n\t0x48, 0x62, 0x37, 0x5a, 0x63, 0x6b, 0x71, 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, 0x53, 0x55, 0x56, 0x4f, 0x52, \n\t0x4b, 0x35, 0x43, 0x59, 0x49, 0x49, 0x3d, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x52, 0x2e, 0x64, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x31, 0x5d, \n\t0x3d, 0x7b, 0x7d, 0x2c, 0x20, 0x5b, 0x32, 0x5d, 0x3d, 0x7b, 0x7d, 0x7d, 0x0a,\n\t0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x62, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x64, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x5b, 0x31, 0x5d, 0x2e, 0x62, 0x6c, 0x69, \n\t0x6e, 0x6b, 0x5f, 0x70, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, \n\t0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, \n\t0x61, 0x73, 0x65, 0x36, 0x34, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x4a, 0x45, 0x41, 0x41, 0x41, 0x44, 0x4e, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x43, 0x34, 0x6c, 0x4a, 0x4b, 0x76, 0x41, 0x41, 0x41, 0x41, 0x47, 0x58, 0x52, 0x46, 0x57, \n\t0x48, 0x52, 0x54, 0x62, 0x32, 0x5a, 0x30, 0x64, 0x32, 0x46, 0x79, 0x5a, 0x51, 0x42, 0x42, 0x5a, 0x47, 0x5c, 0x0a,\n\t0x09, 0x39, 0x69, 0x5a, 0x53, 0x42, 0x4a, 0x62, 0x57, 0x46, 0x6e, 0x5a, 0x56, 0x4a, 0x6c, 0x59, 0x57, 0x52, \n\t0x35, 0x63, 0x63, 0x6c, 0x6c, 0x50, 0x41, 0x41, 0x41, 0x41, 0x32, 0x5a, 0x70, 0x56, 0x46, 0x68, 0x30, 0x57, \n\t0x45, 0x31, 0x4d, 0x4f, 0x6d, 0x4e, 0x76, 0x62, 0x53, 0x35, 0x68, 0x5a, 0x47, 0x39, 0x69, 0x5a, 0x53, 0x35, \n\t0x34, 0x62, 0x58, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x44, 0x77, 0x2f, 0x65, 0x48, 0x42, 0x68, 0x5c, 0x0a,\n\t0x09, 0x59, 0x32, 0x74, 0x6c, 0x64, 0x43, 0x42, 0x69, 0x5a, 0x57, 0x64, 0x70, 0x62, 0x6a, 0x30, 0x69, 0x37, \n\t0x37, 0x75, 0x2f, 0x49, 0x69, 0x42, 0x70, 0x5a, 0x44, 0x30, 0x69, 0x56, 0x7a, 0x56, 0x4e, 0x4d, 0x45, 0x31, \n\t0x77, 0x51, 0x32, 0x56, 0x6f, 0x61, 0x55, 0x68, 0x36, 0x63, 0x6d, 0x56, 0x54, 0x65, 0x6b, 0x35, 0x55, 0x59, \n\t0x33, 0x70, 0x72, 0x59, 0x7a, 0x6c, 0x6b, 0x49, 0x6a, 0x38, 0x2b, 0x49, 0x44, 0x78, 0x34, 0x4f, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x68, 0x74, 0x63, 0x47, 0x31, 0x6c, 0x64, 0x47, 0x45, 0x67, 0x65, 0x47, 0x31, 0x73, 0x62, 0x6e, 0x4d, \n\t0x36, 0x65, 0x44, 0x30, 0x69, 0x59, 0x57, 0x52, 0x76, 0x59, 0x6d, 0x55, 0x36, 0x62, 0x6e, 0x4d, 0x36, 0x62, \n\t0x57, 0x56, 0x30, 0x59, 0x53, 0x38, 0x69, 0x49, 0x48, 0x67, 0x36, 0x65, 0x47, 0x31, 0x77, 0x64, 0x47, 0x73, \n\t0x39, 0x49, 0x6b, 0x46, 0x6b, 0x62, 0x32, 0x4a, 0x6c, 0x49, 0x46, 0x68, 0x4e, 0x55, 0x43, 0x42, 0x44, 0x5c, 0x0a,\n\t0x09, 0x62, 0x33, 0x4a, 0x6c, 0x49, 0x44, 0x55, 0x75, 0x4d, 0x79, 0x31, 0x6a, 0x4d, 0x44, 0x45, 0x78, 0x49, \n\t0x44, 0x59, 0x32, 0x4c, 0x6a, 0x45, 0x30, 0x4e, 0x54, 0x59, 0x32, 0x4d, 0x53, 0x77, 0x67, 0x4d, 0x6a, 0x41, \n\t0x78, 0x4d, 0x69, 0x38, 0x77, 0x4d, 0x69, 0x38, 0x77, 0x4e, 0x69, 0x30, 0x78, 0x4e, 0x44, 0x6f, 0x31, 0x4e, \n\t0x6a, 0x6f, 0x79, 0x4e, 0x79, 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, 0x49, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x34, 0x67, 0x50, 0x48, 0x4a, 0x6b, 0x5a, 0x6a, 0x70, 0x53, 0x52, 0x45, 0x59, 0x67, 0x65, 0x47, 0x31, \n\t0x73, 0x62, 0x6e, 0x4d, 0x36, 0x63, 0x6d, 0x52, 0x6d, 0x50, 0x53, 0x4a, 0x6f, 0x64, 0x48, 0x52, 0x77, 0x4f, \n\t0x69, 0x38, 0x76, 0x64, 0x33, 0x64, 0x33, 0x4c, 0x6e, 0x63, 0x7a, 0x4c, 0x6d, 0x39, 0x79, 0x5a, 0x79, 0x38, \n\t0x78, 0x4f, 0x54, 0x6b, 0x35, 0x4c, 0x7a, 0x41, 0x79, 0x4c, 0x7a, 0x49, 0x79, 0x4c, 0x58, 0x4a, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x69, 0x31, 0x7a, 0x65, 0x57, 0x35, 0x30, 0x59, 0x58, 0x67, 0x74, 0x62, 0x6e, 0x4d, 0x6a, 0x49, \n\t0x6a, 0x34, 0x67, 0x50, 0x48, 0x4a, 0x6b, 0x5a, 0x6a, 0x70, 0x45, 0x5a, 0x58, 0x4e, 0x6a, 0x63, 0x6d, 0x6c, \n\t0x77, 0x64, 0x47, 0x6c, 0x76, 0x62, 0x69, 0x42, 0x79, 0x5a, 0x47, 0x59, 0x36, 0x59, 0x57, 0x4a, 0x76, 0x64, \n\t0x58, 0x51, 0x39, 0x49, 0x69, 0x49, 0x67, 0x65, 0x47, 0x31, 0x73, 0x62, 0x6e, 0x4d, 0x36, 0x65, 0x47, 0x5c, 0x0a,\n\t0x09, 0x31, 0x77, 0x54, 0x55, 0x30, 0x39, 0x49, 0x6d, 0x68, 0x30, 0x64, 0x48, 0x41, 0x36, 0x4c, 0x79, 0x39, \n\t0x75, 0x63, 0x79, 0x35, 0x68, 0x5a, 0x47, 0x39, 0x69, 0x5a, 0x53, 0x35, 0x6a, 0x62, 0x32, 0x30, 0x76, 0x65, \n\t0x47, 0x46, 0x77, 0x4c, 0x7a, 0x45, 0x75, 0x4d, 0x43, 0x39, 0x74, 0x62, 0x53, 0x38, 0x69, 0x49, 0x48, 0x68, \n\t0x74, 0x62, 0x47, 0x35, 0x7a, 0x4f, 0x6e, 0x4e, 0x30, 0x55, 0x6d, 0x56, 0x6d, 0x50, 0x53, 0x4a, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x64, 0x48, 0x52, 0x77, 0x4f, 0x69, 0x38, 0x76, 0x62, 0x6e, 0x4d, 0x75, 0x59, 0x57, 0x52, 0x76, 0x59, \n\t0x6d, 0x55, 0x75, 0x59, 0x32, 0x39, 0x74, 0x4c, 0x33, 0x68, 0x68, 0x63, 0x43, 0x38, 0x78, 0x4c, 0x6a, 0x41, \n\t0x76, 0x63, 0x31, 0x52, 0x35, 0x63, 0x47, 0x55, 0x76, 0x55, 0x6d, 0x56, 0x7a, 0x62, 0x33, 0x56, 0x79, 0x59, \n\t0x32, 0x56, 0x53, 0x5a, 0x57, 0x59, 0x6a, 0x49, 0x69, 0x42, 0x34, 0x62, 0x57, 0x78, 0x75, 0x63, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x70, 0x34, 0x62, 0x58, 0x41, 0x39, 0x49, 0x6d, 0x68, 0x30, 0x64, 0x48, 0x41, 0x36, 0x4c, 0x79, 0x39, \n\t0x75, 0x63, 0x79, 0x35, 0x68, 0x5a, 0x47, 0x39, 0x69, 0x5a, 0x53, 0x35, 0x6a, 0x62, 0x32, 0x30, 0x76, 0x65, \n\t0x47, 0x46, 0x77, 0x4c, 0x7a, 0x45, 0x75, 0x4d, 0x43, 0x38, 0x69, 0x49, 0x48, 0x68, 0x74, 0x63, 0x45, 0x31, \n\t0x4e, 0x4f, 0x6b, 0x39, 0x79, 0x61, 0x57, 0x64, 0x70, 0x62, 0x6d, 0x46, 0x73, 0x52, 0x47, 0x39, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x64, 0x57, 0x31, 0x6c, 0x62, 0x6e, 0x52, 0x4a, 0x52, 0x44, 0x30, 0x69, 0x65, 0x47, 0x31, 0x77, 0x4c, \n\t0x6d, 0x52, 0x70, 0x5a, 0x44, 0x6f, 0x31, 0x4f, 0x44, 0x49, 0x7a, 0x4d, 0x44, 0x63, 0x30, 0x52, 0x6b, 0x4a, \n\t0x43, 0x52, 0x44, 0x64, 0x46, 0x4e, 0x7a, 0x45, 0x78, 0x4f, 0x55, 0x55, 0x35, 0x4e, 0x6b, 0x49, 0x34, 0x52, \n\t0x44, 0x49, 0x7a, 0x4d, 0x6b, 0x4d, 0x31, 0x4d, 0x54, 0x63, 0x7a, 0x4d, 0x53, 0x49, 0x67, 0x65, 0x47, 0x5c, 0x0a,\n\t0x09, 0x31, 0x77, 0x54, 0x55, 0x30, 0x36, 0x52, 0x47, 0x39, 0x6a, 0x64, 0x57, 0x31, 0x6c, 0x62, 0x6e, 0x52, \n\t0x4a, 0x52, 0x44, 0x30, 0x69, 0x65, 0x47, 0x31, 0x77, 0x4c, 0x6d, 0x52, 0x70, 0x5a, 0x44, 0x70, 0x46, 0x51, \n\t0x6b, 0x59, 0x78, 0x4f, 0x54, 0x68, 0x47, 0x52, 0x55, 0x52, 0x46, 0x51, 0x7a, 0x51, 0x78, 0x4d, 0x55, 0x55, \n\t0x33, 0x51, 0x6a, 0x6c, 0x47, 0x4e, 0x30, 0x45, 0x79, 0x4d, 0x54, 0x68, 0x43, 0x4e, 0x6a, 0x68, 0x44, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x6b, 0x45, 0x32, 0x51, 0x53, 0x49, 0x67, 0x65, 0x47, 0x31, 0x77, 0x54, 0x55, 0x30, 0x36, 0x53, \n\t0x57, 0x35, 0x7a, 0x64, 0x47, 0x46, 0x75, 0x59, 0x32, 0x56, 0x4a, 0x52, 0x44, 0x30, 0x69, 0x65, 0x47, 0x31, \n\t0x77, 0x4c, 0x6d, 0x6c, 0x70, 0x5a, 0x44, 0x70, 0x46, 0x51, 0x6b, 0x59, 0x78, 0x4f, 0x54, 0x68, 0x47, 0x52, \n\t0x45, 0x52, 0x46, 0x51, 0x7a, 0x51, 0x78, 0x4d, 0x55, 0x55, 0x33, 0x51, 0x6a, 0x6c, 0x47, 0x4e, 0x30, 0x5c, 0x0a,\n\t0x09, 0x45, 0x79, 0x4d, 0x54, 0x68, 0x43, 0x4e, 0x6a, 0x68, 0x44, 0x4d, 0x6b, 0x45, 0x32, 0x51, 0x53, 0x49, \n\t0x67, 0x65, 0x47, 0x31, 0x77, 0x4f, 0x6b, 0x4e, 0x79, 0x5a, 0x57, 0x46, 0x30, 0x62, 0x33, 0x4a, 0x55, 0x62, \n\t0x32, 0x39, 0x73, 0x50, 0x53, 0x4a, 0x42, 0x5a, 0x47, 0x39, 0x69, 0x5a, 0x53, 0x42, 0x51, 0x61, 0x47, 0x39, \n\t0x30, 0x62, 0x33, 0x4e, 0x6f, 0x62, 0x33, 0x41, 0x67, 0x51, 0x31, 0x4d, 0x32, 0x49, 0x43, 0x68, 0x58, 0x5c, 0x0a,\n\t0x09, 0x61, 0x57, 0x35, 0x6b, 0x62, 0x33, 0x64, 0x7a, 0x4b, 0x53, 0x49, 0x2b, 0x49, 0x44, 0x78, 0x34, 0x62, \n\t0x58, 0x42, 0x4e, 0x54, 0x54, 0x70, 0x45, 0x5a, 0x58, 0x4a, 0x70, 0x64, 0x6d, 0x56, 0x6b, 0x52, 0x6e, 0x4a, \n\t0x76, 0x62, 0x53, 0x42, 0x7a, 0x64, 0x46, 0x4a, 0x6c, 0x5a, 0x6a, 0x70, 0x70, 0x62, 0x6e, 0x4e, 0x30, 0x59, \n\t0x57, 0x35, 0x6a, 0x5a, 0x55, 0x6c, 0x45, 0x50, 0x53, 0x4a, 0x34, 0x62, 0x58, 0x41, 0x75, 0x61, 0x57, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x6b, 0x4f, 0x6a, 0x56, 0x43, 0x4d, 0x6a, 0x4d, 0x77, 0x4e, 0x7a, 0x52, 0x47, 0x51, 0x6b, 0x4a, \n\t0x45, 0x4e, 0x30, 0x55, 0x33, 0x4d, 0x54, 0x45, 0x35, 0x52, 0x54, 0x6b, 0x32, 0x51, 0x6a, 0x68, 0x45, 0x4d, \n\t0x6a, 0x4d, 0x79, 0x51, 0x7a, 0x55, 0x78, 0x4e, 0x7a, 0x4d, 0x78, 0x49, 0x69, 0x42, 0x7a, 0x64, 0x46, 0x4a, \n\t0x6c, 0x5a, 0x6a, 0x70, 0x6b, 0x62, 0x32, 0x4e, 0x31, 0x62, 0x57, 0x56, 0x75, 0x64, 0x45, 0x6c, 0x45, 0x5c, 0x0a,\n\t0x09, 0x50, 0x53, 0x4a, 0x34, 0x62, 0x58, 0x41, 0x75, 0x5a, 0x47, 0x6c, 0x6b, 0x4f, 0x6a, 0x55, 0x34, 0x4d, \n\t0x6a, 0x4d, 0x77, 0x4e, 0x7a, 0x52, 0x47, 0x51, 0x6b, 0x4a, 0x45, 0x4e, 0x30, 0x55, 0x33, 0x4d, 0x54, 0x45, \n\t0x35, 0x52, 0x54, 0x6b, 0x32, 0x51, 0x6a, 0x68, 0x45, 0x4d, 0x6a, 0x4d, 0x79, 0x51, 0x7a, 0x55, 0x78, 0x4e, \n\t0x7a, 0x4d, 0x78, 0x49, 0x69, 0x38, 0x2b, 0x49, 0x44, 0x77, 0x76, 0x63, 0x6d, 0x52, 0x6d, 0x4f, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x52, 0x6c, 0x63, 0x32, 0x4e, 0x79, 0x61, 0x58, 0x42, 0x30, 0x61, 0x57, 0x39, 0x75, 0x50, 0x69, 0x41, \n\t0x38, 0x4c, 0x33, 0x4a, 0x6b, 0x5a, 0x6a, 0x70, 0x53, 0x52, 0x45, 0x59, 0x2b, 0x49, 0x44, 0x77, 0x76, 0x65, \n\t0x44, 0x70, 0x34, 0x62, 0x58, 0x42, 0x74, 0x5a, 0x58, 0x52, 0x68, 0x50, 0x69, 0x41, 0x38, 0x50, 0x33, 0x68, \n\t0x77, 0x59, 0x57, 0x4e, 0x72, 0x5a, 0x58, 0x51, 0x67, 0x5a, 0x57, 0x35, 0x6b, 0x50, 0x53, 0x4a, 0x79, 0x5c, 0x0a,\n\t0x09, 0x49, 0x6a, 0x38, 0x2b, 0x68, 0x72, 0x52, 0x45, 0x6c, 0x67, 0x41, 0x41, 0x4d, 0x6f, 0x5a, 0x4a, 0x52, \n\t0x45, 0x46, 0x55, 0x65, 0x4e, 0x72, 0x73, 0x6e, 0x51, 0x6d, 0x38, 0x4a, 0x45, 0x57, 0x64, 0x35, 0x2f, 0x2b, \n\t0x52, 0x6d, 0x56, 0x58, 0x31, 0x7a, 0x72, 0x36, 0x67, 0x6d, 0x32, 0x36, 0x75, 0x35, 0x67, 0x59, 0x46, 0x42, \n\t0x47, 0x30, 0x5a, 0x47, 0x68, 0x47, 0x6c, 0x51, 0x52, 0x30, 0x50, 0x48, 0x42, 0x6c, 0x48, 0x68, 0x39, 0x5c, 0x0a,\n\t0x09, 0x56, 0x56, 0x78, 0x31, 0x48, 0x42, 0x65, 0x31, 0x31, 0x5a, 0x5a, 0x31, 0x56, 0x32, 0x51, 0x48, 0x66, \n\t0x46, 0x32, 0x78, 0x6b, 0x64, 0x64, 0x5a, 0x78, 0x5a, 0x31, 0x48, 0x47, 0x64, 0x38, 0x51, 0x51, 0x46, 0x51, \n\t0x56, 0x46, 0x6e, 0x4f, 0x4e, 0x36, 0x6f, 0x79, 0x48, 0x32, 0x6a, 0x33, 0x45, 0x63, 0x33, 0x44, 0x58, 0x51, \n\t0x33, 0x66, 0x62, 0x2f, 0x33, 0x75, 0x74, 0x2b, 0x72, 0x71, 0x73, 0x79, 0x4d, 0x2f, 0x63, 0x65, 0x56, 0x5c, 0x0a,\n\t0x09, 0x47, 0x52, 0x47, 0x5a, 0x57, 0x5a, 0x56, 0x56, 0x6c, 0x56, 0x57, 0x76, 0x58, 0x6e, 0x66, 0x6c, 0x35, \n\t0x35, 0x4d, 0x76, 0x73, 0x2f, 0x4a, 0x6c, 0x56, 0x57, 0x56, 0x6d, 0x66, 0x4f, 0x76, 0x2f, 0x2f, 0x38, 0x63, \n\t0x2f, 0x66, 0x68, 0x46, 0x42, 0x4b, 0x4b, 0x55, 0x77, 0x57, 0x41, 0x5a, 0x4c, 0x4a, 0x34, 0x73, 0x7a, 0x65, \n\t0x41, 0x53, 0x44, 0x5a, 0x51, 0x44, 0x52, 0x59, 0x42, 0x6c, 0x41, 0x4e, 0x46, 0x67, 0x47, 0x45, 0x41, 0x5c, 0x0a,\n\t0x09, 0x32, 0x57, 0x77, 0x54, 0x4b, 0x41, 0x61, 0x4c, 0x41, 0x55, 0x73, 0x4c, 0x44, 0x61, 0x6d, 0x62, 0x30, \n\t0x4f, 0x6c, 0x72, 0x6c, 0x62, 0x36, 0x67, 0x2b, 0x2b, 0x35, 0x47, 0x39, 0x78, 0x33, 0x59, 0x6e, 0x72, 0x75, \n\t0x48, 0x36, 0x38, 0x74, 0x76, 0x59, 0x39, 0x79, 0x33, 0x45, 0x39, 0x6f, 0x68, 0x39, 0x35, 0x47, 0x56, 0x69, \n\t0x69, 0x2f, 0x67, 0x4c, 0x6f, 0x58, 0x4e, 0x78, 0x38, 0x43, 0x74, 0x63, 0x46, 0x75, 0x43, 0x37, 0x58, 0x5c, 0x0a,\n\t0x09, 0x41, 0x44, 0x6f, 0x53, 0x4e, 0x2f, 0x66, 0x67, 0x2b, 0x74, 0x79, 0x42, 0x4f, 0x78, 0x73, 0x73, 0x6a, \n\t0x51, 0x41, 0x36, 0x46, 0x44, 0x64, 0x66, 0x30, 0x51, 0x35, 0x56, 0x4a, 0x55, 0x42, 0x44, 0x75, 0x4c, 0x6b, \n\t0x63, 0x31, 0x32, 0x57, 0x34, 0x2f, 0x6e, 0x45, 0x41, 0x30, 0x57, 0x42, 0x70, 0x74, 0x48, 0x77, 0x4a, 0x31, \n\t0x78, 0x47, 0x35, 0x48, 0x2b, 0x43, 0x36, 0x51, 0x65, 0x35, 0x2f, 0x44, 0x4e, 0x66, 0x6a, 0x4a, 0x46, 0x5c, 0x0a,\n\t0x09, 0x52, 0x72, 0x44, 0x52, 0x65, 0x33, 0x35, 0x56, 0x74, 0x6e, 0x34, 0x66, 0x71, 0x74, 0x41, 0x55, 0x53, \n\t0x44, 0x68, 0x56, 0x6d, 0x68, 0x4d, 0x33, 0x44, 0x7a, 0x65, 0x75, 0x33, 0x51, 0x75, 0x74, 0x49, 0x78, 0x76, \n\t0x36, 0x32, 0x6a, 0x46, 0x56, 0x71, 0x4a, 0x2b, 0x78, 0x2b, 0x56, 0x78, 0x78, 0x34, 0x75, 0x48, 0x2f, 0x4c, \n\t0x50, 0x67, 0x51, 0x62, 0x51, 0x75, 0x33, 0x46, 0x7a, 0x46, 0x61, 0x36, 0x62, 0x42, 0x68, 0x41, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x46, 0x72, 0x5a, 0x38, 0x78, 0x6e, 0x72, 0x39, 0x6b, 0x4e, 0x78, 0x2b, 0x45, 0x64, 0x63, 0x68, 0x75, \n\t0x66, 0x2b, 0x41, 0x42, 0x74, 0x42, 0x72, 0x63, 0x50, 0x4d, 0x4e, 0x58, 0x49, 0x6b, 0x45, 0x61, 0x51, 0x44, \n\t0x52, 0x58, 0x6d, 0x36, 0x46, 0x58, 0x6f, 0x6d, 0x62, 0x6b, 0x36, 0x33, 0x44, 0x39, 0x36, 0x49, 0x56, 0x65, \n\t0x6a, 0x35, 0x75, 0x33, 0x36, 0x67, 0x64, 0x65, 0x30, 0x41, 0x43, 0x78, 0x47, 0x70, 0x6f, 0x33, 0x35, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x6c, 0x74, 0x78, 0x48, 0x58, 0x32, 0x77, 0x59, 0x51, 0x44, 0x5a, 0x5a, 0x50, 0x70, 0x68, 0x79, \n\t0x37, 0x46, 0x64, 0x64, 0x50, 0x57, 0x4d, 0x63, 0x65, 0x51, 0x49, 0x43, 0x59, 0x56, 0x66, 0x6f, 0x70, 0x72, \n\t0x6f, 0x76, 0x6b, 0x73, 0x56, 0x2b, 0x55, 0x39, 0x33, 0x31, 0x58, 0x4f, 0x4e, 0x63, 0x33, 0x34, 0x4f, 0x32, \n\t0x74, 0x4a, 0x52, 0x66, 0x65, 0x75, 0x70, 0x41, 0x56, 0x78, 0x4a, 0x46, 0x41, 0x36, 0x45, 0x46, 0x41, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x49, 0x4e, 0x77, 0x2f, 0x77, 0x41, 0x41, 0x75, 0x67, 0x54, 0x33, 0x46, 0x2f, 0x46, 0x43, 0x49, \n\t0x73, 0x54, 0x44, 0x2f, 0x79, 0x32, 0x4b, 0x66, 0x6d, 0x65, 0x45, 0x2b, 0x4c, 0x68, 0x4f, 0x79, 0x2f, 0x30, \n\t0x64, 0x36, 0x45, 0x69, 0x32, 0x34, 0x6e, 0x59, 0x37, 0x72, 0x6d, 0x79, 0x37, 0x48, 0x6f, 0x38, 0x2b, 0x79, \n\t0x62, 0x66, 0x45, 0x65, 0x63, 0x6f, 0x35, 0x35, 0x71, 0x6c, 0x36, 0x54, 0x69, 0x76, 0x30, 0x73, 0x68, 0x5c, 0x0a,\n\t0x09, 0x51, 0x72, 0x42, 0x4c, 0x52, 0x30, 0x41, 0x50, 0x75, 0x65, 0x31, 0x39, 0x6b, 0x51, 0x34, 0x58, 0x6f, \n\t0x78, 0x72, 0x73, 0x2f, 0x54, 0x6a, 0x6c, 0x33, 0x5a, 0x44, 0x38, 0x39, 0x79, 0x72, 0x34, 0x41, 0x6f, 0x75, \n\t0x48, 0x6d, 0x63, 0x42, 0x61, 0x69, 0x72, 0x43, 0x61, 0x46, 0x59, 0x59, 0x4f, 0x52, 0x34, 0x34, 0x50, 0x6d, \n\t0x57, 0x63, 0x48, 0x38, 0x4f, 0x43, 0x47, 0x56, 0x68, 0x42, 0x66, 0x36, 0x59, 0x69, 0x53, 0x4e, 0x43, 0x5c, 0x0a,\n\t0x09, 0x44, 0x43, 0x72, 0x33, 0x65, 0x64, 0x49, 0x56, 0x58, 0x35, 0x4e, 0x51, 0x47, 0x6d, 0x7a, 0x63, 0x55, \n\t0x6f, 0x63, 0x42, 0x46, 0x50, 0x38, 0x50, 0x74, 0x4d, 0x52, 0x73, 0x64, 0x44, 0x7a, 0x30, 0x77, 0x77, 0x63, \n\t0x50, 0x66, 0x42, 0x68, 0x66, 0x33, 0x34, 0x2b, 0x66, 0x38, 0x30, 0x63, 0x38, 0x37, 0x58, 0x5a, 0x77, 0x79, \n\t0x4b, 0x33, 0x4f, 0x34, 0x57, 0x75, 0x66, 0x54, 0x62, 0x6d, 0x30, 0x6a, 0x36, 0x51, 0x63, 0x32, 0x77, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x75, 0x77, 0x76, 0x39, 0x71, 0x4d, 0x77, 0x2b, 0x6a, 0x4a, 0x37, 0x49, 0x71, 0x2f, 0x76, 0x6e, \n\t0x61, 0x73, 0x52, 0x6c, 0x63, 0x72, 0x2b, 0x75, 0x48, 0x35, 0x30, 0x76, 0x53, 0x4d, 0x74, 0x53, 0x45, 0x50, \n\t0x5a, 0x44, 0x35, 0x44, 0x4d, 0x31, 0x4e, 0x59, 0x2f, 0x76, 0x6a, 0x6e, 0x62, 0x30, 0x63, 0x43, 0x35, 0x2f, \n\t0x39, 0x30, 0x74, 0x6d, 0x36, 0x50, 0x4c, 0x34, 0x33, 0x42, 0x59, 0x44, 0x61, 0x4b, 0x45, 0x74, 0x44, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x55, 0x68, 0x73, 0x76, 0x77, 0x51, 0x77, 0x2f, 0x42, 0x7a, 0x38, 0x56, 0x77, 0x58, 0x33, 0x33, \n\t0x65, 0x6a, 0x30, 0x47, 0x42, 0x53, 0x73, 0x62, 0x59, 0x63, 0x31, 0x75, 0x5a, 0x33, 0x43, 0x59, 0x31, 0x4d, \n\t0x53, 0x52, 0x42, 0x4b, 0x66, 0x52, 0x78, 0x78, 0x74, 0x79, 0x37, 0x36, 0x47, 0x50, 0x49, 0x46, 0x2f, 0x62, \n\t0x73, 0x4c, 0x74, 0x74, 0x58, 0x6a, 0x73, 0x32, 0x6d, 0x42, 0x32, 0x42, 0x62, 0x4e, 0x34, 0x39, 0x79, 0x5c, 0x0a,\n\t0x09, 0x59, 0x66, 0x66, 0x76, 0x6b, 0x71, 0x57, 0x6a, 0x6e, 0x69, 0x56, 0x62, 0x68, 0x58, 0x69, 0x6f, 0x38, \n\t0x35, 0x54, 0x38, 0x44, 0x6f, 0x43, 0x39, 0x6a, 0x65, 0x6f, 0x62, 0x6f, 0x56, 0x51, 0x6c, 0x64, 0x32, 0x64, \n\t0x71, 0x2b, 0x66, 0x62, 0x52, 0x6f, 0x76, 0x65, 0x34, 0x77, 0x6c, 0x51, 0x6e, 0x41, 0x4f, 0x6c, 0x34, 0x48, \n\t0x6f, 0x47, 0x33, 0x42, 0x64, 0x78, 0x53, 0x31, 0x4d, 0x5a, 0x45, 0x58, 0x30, 0x68, 0x30, 0x42, 0x69, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x50, 0x68, 0x47, 0x4f, 0x30, 0x64, 0x5a, 0x49, 0x51, 0x61, 0x45, 0x74, 0x77, 0x38, 0x57, 0x34, \n\t0x33, 0x49, 0x42, 0x6b, 0x56, 0x50, 0x47, 0x72, 0x63, 0x63, 0x4b, 0x47, 0x50, 0x63, 0x39, 0x44, 0x68, 0x6c, \n\t0x68, 0x6f, 0x4b, 0x6d, 0x56, 0x48, 0x51, 0x74, 0x6e, 0x38, 0x65, 0x32, 0x54, 0x65, 0x43, 0x46, 0x62, 0x63, \n\t0x64, 0x30, 0x4d, 0x34, 0x47, 0x50, 0x4e, 0x4f, 0x30, 0x41, 0x76, 0x46, 0x38, 0x36, 0x49, 0x7a, 0x77, 0x5c, 0x0a,\n\t0x09, 0x38, 0x52, 0x41, 0x43, 0x63, 0x38, 0x46, 0x45, 0x4c, 0x6e, 0x7a, 0x62, 0x6a, 0x46, 0x6a, 0x35, 0x33, \n\t0x5a, 0x53, 0x59, 0x50, 0x68, 0x5a, 0x43, 0x47, 0x56, 0x56, 0x67, 0x77, 0x5a, 0x41, 0x4c, 0x47, 0x6c, 0x73, \n\t0x70, 0x4a, 0x64, 0x35, 0x4f, 0x48, 0x57, 0x71, 0x56, 0x66, 0x32, 0x79, 0x37, 0x4f, 0x66, 0x31, 0x78, 0x41, \n\t0x46, 0x4e, 0x79, 0x37, 0x41, 0x58, 0x33, 0x50, 0x34, 0x4a, 0x75, 0x54, 0x68, 0x48, 0x66, 0x6a, 0x79, 0x5c, 0x0a,\n\t0x09, 0x68, 0x63, 0x6b, 0x53, 0x61, 0x51, 0x45, 0x6b, 0x37, 0x71, 0x71, 0x6f, 0x41, 0x49, 0x6b, 0x74, 0x55, \n\t0x7a, 0x63, 0x43, 0x4c, 0x44, 0x67, 0x64, 0x6e, 0x39, 0x42, 0x69, 0x7a, 0x70, 0x54, 0x34, 0x43, 0x50, 0x78, \n\t0x2f, 0x69, 0x4b, 0x74, 0x44, 0x67, 0x55, 0x70, 0x58, 0x52, 0x74, 0x69, 0x57, 0x37, 0x54, 0x72, 0x44, 0x43, \n\t0x4d, 0x59, 0x43, 0x67, 0x44, 0x49, 0x61, 0x43, 0x36, 0x63, 0x6b, 0x4f, 0x47, 0x44, 0x77, 0x49, 0x56, 0x5c, 0x0a,\n\t0x09, 0x53, 0x30, 0x2f, 0x68, 0x51, 0x47, 0x51, 0x49, 0x39, 0x68, 0x31, 0x65, 0x70, 0x2b, 0x66, 0x44, 0x2f, \n\t0x43, 0x46, 0x58, 0x70, 0x41, 0x67, 0x36, 0x47, 0x46, 0x4b, 0x59, 0x34, 0x42, 0x33, 0x7a, 0x4e, 0x71, 0x78, \n\t0x6b, 0x6a, 0x4f, 0x43, 0x41, 0x50, 0x36, 0x4d, 0x50, 0x76, 0x4f, 0x63, 0x4c, 0x32, 0x36, 0x58, 0x38, 0x70, \n\t0x68, 0x58, 0x72, 0x71, 0x7a, 0x34, 0x50, 0x65, 0x4c, 0x54, 0x38, 0x51, 0x72, 0x2f, 0x7a, 0x41, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x79, 0x33, 0x4e, 0x77, 0x72, 0x51, 0x68, 0x58, 0x30, 0x76, 0x41, 0x75, 0x55, 0x79, 0x75, 0x69, 0x71, \n\t0x61, 0x36, 0x4e, 0x55, 0x4f, 0x56, 0x43, 0x41, 0x42, 0x67, 0x55, 0x44, 0x43, 0x52, 0x57, 0x6b, 0x4d, 0x77, \n\t0x53, 0x4d, 0x54, 0x69, 0x34, 0x65, 0x79, 0x76, 0x4c, 0x2f, 0x52, 0x4c, 0x66, 0x4a, 0x35, 0x47, 0x31, 0x30, \n\t0x71, 0x77, 0x54, 0x6b, 0x61, 0x38, 0x64, 0x36, 0x33, 0x57, 0x34, 0x45, 0x32, 0x6a, 0x31, 0x63, 0x51, 0x5c, 0x0a,\n\t0x09, 0x68, 0x33, 0x50, 0x51, 0x78, 0x30, 0x39, 0x6b, 0x47, 0x38, 0x66, 0x43, 0x30, 0x47, 0x39, 0x78, 0x59, \n\t0x43, 0x39, 0x51, 0x34, 0x77, 0x4c, 0x35, 0x4b, 0x35, 0x56, 0x58, 0x66, 0x55, 0x76, 0x76, 0x51, 0x62, 0x30, \n\t0x5a, 0x57, 0x64, 0x4f, 0x68, 0x66, 0x50, 0x66, 0x74, 0x36, 0x37, 0x73, 0x2b, 0x43, 0x47, 0x70, 0x61, 0x2f, \n\t0x45, 0x55, 0x6d, 0x44, 0x4e, 0x41, 0x43, 0x38, 0x56, 0x72, 0x6b, 0x66, 0x4c, 0x56, 0x4e, 0x41, 0x47, 0x5c, 0x0a,\n\t0x09, 0x49, 0x44, 0x57, 0x30, 0x53, 0x44, 0x4a, 0x41, 0x54, 0x72, 0x4e, 0x49, 0x41, 0x62, 0x71, 0x6e, 0x36, \n\t0x56, 0x73, 0x41, 0x78, 0x6b, 0x37, 0x6c, 0x31, 0x6f, 0x64, 0x62, 0x4a, 0x50, 0x59, 0x2f, 0x36, 0x66, 0x46, \n\t0x45, 0x72, 0x4d, 0x50, 0x65, 0x57, 0x68, 0x49, 0x66, 0x54, 0x34, 0x53, 0x56, 0x4d, 0x67, 0x79, 0x47, 0x2f, \n\t0x68, 0x37, 0x32, 0x32, 0x6b, 0x45, 0x44, 0x4e, 0x48, 0x77, 0x61, 0x63, 0x6e, 0x6b, 0x47, 0x76, 0x76, 0x5c, 0x0a,\n\t0x09, 0x51, 0x52, 0x70, 0x44, 0x38, 0x43, 0x33, 0x58, 0x55, 0x72, 0x30, 0x4e, 0x33, 0x33, 0x41, 0x6e, 0x57, \n\t0x58, 0x6d, 0x4e, 0x64, 0x64, 0x57, 0x70, 0x6f, 0x47, 0x45, 0x50, 0x52, 0x44, 0x67, 0x6e, 0x48, 0x65, 0x51, \n\t0x52, 0x54, 0x38, 0x62, 0x74, 0x6b, 0x72, 0x65, 0x54, 0x36, 0x46, 0x59, 0x75, 0x32, 0x4b, 0x4f, 0x46, 0x6f, \n\t0x4e, 0x71, 0x6e, 0x4f, 0x51, 0x59, 0x6c, 0x2b, 0x56, 0x41, 0x56, 0x49, 0x64, 0x33, 0x63, 0x2f, 0x75, 0x5c, 0x0a,\n\t0x09, 0x65, 0x77, 0x42, 0x47, 0x54, 0x70, 0x43, 0x41, 0x4b, 0x4a, 0x65, 0x57, 0x64, 0x47, 0x2f, 0x45, 0x2f, \n\t0x70, 0x38, 0x42, 0x6b, 0x7a, 0x71, 0x50, 0x2f, 0x64, 0x4f, 0x58, 0x31, 0x73, 0x34, 0x44, 0x4d, 0x72, 0x49, \n\t0x4b, 0x43, 0x50, 0x4e, 0x67, 0x47, 0x46, 0x4f, 0x46, 0x73, 0x34, 0x38, 0x67, 0x54, 0x48, 0x63, 0x69, 0x57, \n\t0x31, 0x75, 0x45, 0x78, 0x53, 0x73, 0x66, 0x6b, 0x50, 0x56, 0x49, 0x2b, 0x67, 0x71, 0x69, 0x76, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x6e, 0x77, 0x57, 0x39, 0x57, 0x49, 0x44, 0x54, 0x30, 0x37, 0x33, 0x44, 0x33, 0x56, 0x41, 0x47, \n\t0x41, 0x4c, 0x42, 0x41, 0x69, 0x43, 0x7a, 0x2f, 0x61, 0x79, 0x73, 0x4c, 0x6c, 0x61, 0x2b, 0x75, 0x75, 0x6a, \n\t0x55, 0x54, 0x48, 0x61, 0x4c, 0x5a, 0x72, 0x59, 0x37, 0x57, 0x6a, 0x38, 0x6b, 0x72, 0x70, 0x6e, 0x6a, 0x7a, \n\t0x4c, 0x56, 0x58, 0x6e, 0x43, 0x6e, 0x65, 0x46, 0x76, 0x6b, 0x71, 0x68, 0x6a, 0x65, 0x6c, 0x79, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x33, 0x4a, 0x6b, 0x6a, 0x67, 0x6e, 0x4e, 0x4b, 0x57, 0x4f, 0x79, 0x4d, 0x4b, 0x36, 0x6c, 0x6f, 0x37, \n\t0x67, 0x2f, 0x33, 0x6e, 0x53, 0x45, 0x4f, 0x44, 0x35, 0x31, 0x39, 0x44, 0x43, 0x74, 0x2f, 0x6a, 0x2b, 0x4a, \n\t0x76, 0x70, 0x70, 0x61, 0x57, 0x34, 0x56, 0x70, 0x62, 0x33, 0x76, 0x65, 0x38, 0x51, 0x2b, 0x65, 0x71, 0x54, \n\t0x46, 0x4a, 0x35, 0x36, 0x55, 0x65, 0x49, 0x67, 0x76, 0x38, 0x38, 0x34, 0x45, 0x43, 0x38, 0x73, 0x69, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x67, 0x4a, 0x62, 0x38, 0x70, 0x4c, 0x6e, 0x68, 0x56, 0x6b, 0x38, 0x6f, 0x42, 0x45, 0x67, 0x6d, \n\t0x62, 0x2f, 0x58, 0x52, 0x61, 0x42, 0x34, 0x6c, 0x42, 0x4d, 0x66, 0x5a, 0x69, 0x35, 0x47, 0x53, 0x4a, 0x42, \n\t0x5a, 0x4a, 0x6e, 0x78, 0x55, 0x4c, 0x6f, 0x32, 0x75, 0x78, 0x6a, 0x48, 0x4b, 0x54, 0x30, 0x47, 0x49, 0x6b, \n\t0x79, 0x65, 0x4b, 0x44, 0x4d, 0x49, 0x53, 0x49, 0x4f, 0x2b, 0x7a, 0x36, 0x73, 0x73, 0x53, 0x46, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x31, 0x42, 0x6e, 0x6a, 0x37, 0x6a, 0x53, 0x59, 0x2f, 0x51, 0x50, 0x51, 0x32, 0x76, 0x6f, 0x34, 0x7a, \n\t0x6f, 0x5a, 0x37, 0x41, 0x70, 0x66, 0x63, 0x39, 0x45, 0x56, 0x77, 0x33, 0x4d, 0x2b, 0x51, 0x78, 0x62, 0x64, \n\t0x4d, 0x44, 0x53, 0x43, 0x79, 0x34, 0x5a, 0x6b, 0x34, 0x6b, 0x4a, 0x58, 0x69, 0x2b, 0x37, 0x45, 0x41, 0x50, \n\t0x34, 0x30, 0x67, 0x6a, 0x4d, 0x63, 0x56, 0x6b, 0x54, 0x34, 0x42, 0x79, 0x63, 0x57, 0x43, 0x48, 0x54, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x4e, 0x31, 0x38, 0x51, 0x4d, 0x6b, 0x4a, 0x51, 0x6c, 0x49, 0x70, 0x34, 0x47, 0x55, 0x73, 0x6b, \n\t0x43, 0x53, 0x51, 0x75, 0x75, 0x39, 0x65, 0x44, 0x62, 0x67, 0x45, 0x70, 0x39, 0x52, 0x6f, 0x57, 0x44, 0x42, \n\t0x47, 0x52, 0x4d, 0x57, 0x43, 0x34, 0x47, 0x30, 0x38, 0x77, 0x39, 0x76, 0x4a, 0x62, 0x6e, 0x68, 0x56, 0x66, \n\t0x67, 0x5a, 0x32, 0x39, 0x6b, 0x46, 0x37, 0x73, 0x52, 0x51, 0x66, 0x6f, 0x66, 0x43, 0x4e, 0x49, 0x50, 0x5c, 0x0a,\n\t0x09, 0x42, 0x68, 0x44, 0x4a, 0x78, 0x62, 0x2f, 0x2b, 0x34, 0x47, 0x4e, 0x77, 0x38, 0x31, 0x31, 0x43, 0x77, \n\t0x6a, 0x2b, 0x4a, 0x43, 0x6c, 0x41, 0x48, 0x70, 0x6c, 0x39, 0x41, 0x4b, 0x71, 0x39, 0x41, 0x31, 0x37, 0x62, \n\t0x4b, 0x7a, 0x42, 0x45, 0x6c, 0x59, 0x4d, 0x6b, 0x41, 0x4b, 0x59, 0x4c, 0x4e, 0x42, 0x71, 0x6c, 0x73, 0x31, \n\t0x75, 0x43, 0x4d, 0x66, 0x51, 0x62, 0x55, 0x43, 0x4e, 0x2b, 0x47, 0x39, 0x51, 0x33, 0x67, 0x54, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x32, 0x50, 0x74, 0x37, 0x6d, 0x4f, 0x4a, 0x53, 0x2b, 0x46, 0x6d, 0x33, 0x58, 0x63, 0x71, 0x33, 0x44, \n\t0x2f, 0x66, 0x57, 0x54, 0x68, 0x7a, 0x55, 0x2f, 0x76, 0x74, 0x52, 0x44, 0x35, 0x31, 0x78, 0x32, 0x47, 0x56, \n\t0x61, 0x54, 0x77, 0x2f, 0x62, 0x69, 0x4c, 0x37, 0x69, 0x73, 0x63, 0x46, 0x74, 0x38, 0x66, 0x61, 0x6c, 0x6c, \n\t0x6b, 0x32, 0x69, 0x5a, 0x49, 0x6f, 0x58, 0x56, 0x65, 0x67, 0x53, 0x43, 0x4e, 0x48, 0x41, 0x74, 0x51, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x56, 0x51, 0x44, 0x77, 0x77, 0x62, 0x46, 0x64, 0x6d, 0x38, 0x36, 0x47, 0x4b, 0x37, 0x6d, 0x33, \n\t0x6a, 0x7a, 0x4e, 0x7a, 0x54, 0x55, 0x41, 0x43, 0x64, 0x53, 0x2b, 0x56, 0x49, 0x58, 0x4d, 0x58, 0x67, 0x45, \n\t0x77, 0x63, 0x77, 0x6e, 0x62, 0x55, 0x53, 0x44, 0x74, 0x52, 0x4a, 0x44, 0x65, 0x6a, 0x79, 0x42, 0x39, 0x66, \n\t0x36, 0x2b, 0x44, 0x79, 0x4c, 0x2f, 0x32, 0x38, 0x43, 0x56, 0x34, 0x42, 0x66, 0x2b, 0x47, 0x75, 0x36, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x4f, 0x43, 0x7a, 0x75, 0x45, 0x43, 0x43, 0x53, 0x69, 0x49, 0x4b, 0x46, 0x6d, 0x62, 0x57, 0x66, \n\t0x4f, 0x51, 0x63, 0x4c, 0x74, 0x2b, 0x43, 0x6b, 0x59, 0x48, 0x79, 0x32, 0x4b, 0x59, 0x62, 0x44, 0x64, 0x6d, \n\t0x78, 0x58, 0x2f, 0x45, 0x45, 0x63, 0x44, 0x4a, 0x76, 0x70, 0x2f, 0x41, 0x36, 0x73, 0x45, 0x32, 0x6d, 0x76, \n\t0x51, 0x33, 0x36, 0x76, 0x79, 0x54, 0x5a, 0x73, 0x42, 0x70, 0x6a, 0x2b, 0x48, 0x44, 0x2f, 0x46, 0x32, 0x5c, 0x0a,\n\t0x09, 0x42, 0x52, 0x4b, 0x7a, 0x54, 0x74, 0x2f, 0x47, 0x43, 0x2f, 0x38, 0x51, 0x57, 0x58, 0x44, 0x54, 0x72, \n\t0x72, 0x30, 0x43, 0x49, 0x76, 0x2b, 0x61, 0x49, 0x30, 0x2f, 0x43, 0x53, 0x37, 0x6f, 0x4d, 0x72, 0x32, 0x42, \n\t0x6c, 0x45, 0x6f, 0x6f, 0x43, 0x51, 0x43, 0x4b, 0x42, 0x38, 0x56, 0x6e, 0x74, 0x67, 0x36, 0x51, 0x39, 0x43, \n\t0x36, 0x4b, 0x31, 0x73, 0x7a, 0x6b, 0x59, 0x73, 0x6f, 0x32, 0x76, 0x31, 0x6d, 0x49, 0x64, 0x35, 0x61, 0x5c, 0x0a,\n\t0x09, 0x72, 0x63, 0x46, 0x74, 0x78, 0x62, 0x79, 0x62, 0x4a, 0x61, 0x79, 0x69, 0x70, 0x56, 0x4a, 0x45, 0x52, \n\t0x61, 0x33, 0x41, 0x51, 0x71, 0x56, 0x76, 0x4a, 0x4d, 0x43, 0x31, 0x58, 0x46, 0x32, 0x76, 0x37, 0x75, 0x4c, \n\t0x34, 0x76, 0x37, 0x59, 0x2b, 0x58, 0x6d, 0x6b, 0x50, 0x74, 0x78, 0x66, 0x54, 0x30, 0x5a, 0x76, 0x2b, 0x6d, \n\t0x68, 0x58, 0x6b, 0x45, 0x30, 0x4a, 0x33, 0x6f, 0x69, 0x2f, 0x35, 0x71, 0x6a, 0x33, 0x34, 0x61, 0x62, 0x5c, 0x0a,\n\t0x09, 0x47, 0x2f, 0x43, 0x75, 0x56, 0x2f, 0x4c, 0x38, 0x44, 0x5a, 0x55, 0x46, 0x52, 0x52, 0x33, 0x6a, 0x73, \n\t0x69, 0x68, 0x31, 0x4a, 0x44, 0x66, 0x71, 0x48, 0x47, 0x49, 0x6d, 0x2f, 0x6f, 0x33, 0x33, 0x79, 0x43, 0x59, \n\t0x4d, 0x6b, 0x4f, 0x2b, 0x68, 0x72, 0x6e, 0x6d, 0x4c, 0x74, 0x4d, 0x6d, 0x74, 0x71, 0x74, 0x5a, 0x38, 0x4b, \n\t0x78, 0x6c, 0x70, 0x67, 0x4b, 0x75, 0x61, 0x52, 0x4e, 0x68, 0x78, 0x31, 0x76, 0x41, 0x36, 0x38, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x44, 0x75, 0x49, 0x36, 0x79, 0x73, 0x4b, 0x68, 0x37, 0x36, 0x6f, 0x6c, 0x47, 0x57, 0x62, 0x56, 0x6b, \n\t0x57, 0x57, 0x71, 0x33, 0x73, 0x47, 0x42, 0x55, 0x72, 0x35, 0x66, 0x2b, 0x50, 0x58, 0x34, 0x76, 0x33, 0x61, \n\t0x65, 0x64, 0x47, 0x78, 0x36, 0x72, 0x61, 0x4f, 0x57, 0x71, 0x2f, 0x4c, 0x76, 0x66, 0x72, 0x38, 0x54, 0x48, \n\t0x41, 0x2f, 0x63, 0x70, 0x72, 0x41, 0x52, 0x5a, 0x38, 0x42, 0x32, 0x2f, 0x2f, 0x59, 0x4e, 0x45, 0x34, 0x5c, 0x0a,\n\t0x09, 0x48, 0x4e, 0x4c, 0x6e, 0x34, 0x6e, 0x6f, 0x54, 0x6e, 0x54, 0x72, 0x6c, 0x6a, 0x44, 0x30, 0x79, 0x54, \n\t0x31, 0x54, 0x2f, 0x39, 0x2b, 0x66, 0x67, 0x52, 0x39, 0x4f, 0x4c, 0x38, 0x57, 0x34, 0x76, 0x69, 0x4b, 0x77, \n\t0x47, 0x61, 0x4a, 0x59, 0x6d, 0x78, 0x53, 0x49, 0x52, 0x77, 0x30, 0x33, 0x5a, 0x46, 0x6f, 0x6c, 0x61, 0x41, \n\t0x58, 0x69, 0x76, 0x4c, 0x52, 0x4b, 0x49, 0x2f, 0x46, 0x46, 0x70, 0x48, 0x32, 0x45, 0x68, 0x57, 0x46, 0x5c, 0x0a,\n\t0x09, 0x58, 0x64, 0x55, 0x63, 0x30, 0x69, 0x72, 0x68, 0x62, 0x33, 0x65, 0x49, 0x62, 0x46, 0x49, 0x6b, 0x61, \n\t0x74, 0x4c, 0x43, 0x30, 0x75, 0x4b, 0x69, 0x58, 0x6a, 0x49, 0x32, 0x36, 0x64, 0x76, 0x47, 0x51, 0x4e, 0x44, \n\t0x2b, 0x52, 0x33, 0x4d, 0x47, 0x33, 0x2f, 0x39, 0x4b, 0x66, 0x78, 0x46, 0x7a, 0x71, 0x68, 0x4c, 0x4a, 0x4c, \n\t0x50, 0x41, 0x2b, 0x37, 0x78, 0x6d, 0x37, 0x36, 0x35, 0x78, 0x37, 0x69, 0x7a, 0x2b, 0x71, 0x2b, 0x50, 0x5c, 0x0a,\n\t0x09, 0x78, 0x63, 0x43, 0x41, 0x34, 0x6b, 0x2b, 0x47, 0x76, 0x70, 0x6b, 0x6f, 0x45, 0x4c, 0x6f, 0x43, 0x6b, \n\t0x68, 0x37, 0x44, 0x39, 0x41, 0x41, 0x6b, 0x46, 0x34, 0x4e, 0x64, 0x6c, 0x6e, 0x46, 0x32, 0x53, 0x6f, 0x6d, \n\t0x57, 0x66, 0x6f, 0x6a, 0x69, 0x49, 0x44, 0x65, 0x47, 0x42, 0x41, 0x52, 0x51, 0x78, 0x45, 0x68, 0x49, 0x32, \n\t0x6a, 0x6b, 0x6c, 0x47, 0x79, 0x4b, 0x39, 0x36, 0x6d, 0x2b, 0x37, 0x4e, 0x53, 0x38, 0x47, 0x69, 0x62, 0x5c, 0x0a,\n\t0x09, 0x33, 0x65, 0x2f, 0x53, 0x2f, 0x6f, 0x34, 0x72, 0x34, 0x6a, 0x4c, 0x6c, 0x2f, 0x41, 0x39, 0x48, 0x45, \n\t0x45, 0x36, 0x58, 0x50, 0x7a, 0x48, 0x71, 0x4c, 0x36, 0x72, 0x34, 0x39, 0x6a, 0x58, 0x57, 0x45, 0x75, 0x78, \n\t0x55, 0x74, 0x34, 0x6a, 0x51, 0x49, 0x67, 0x46, 0x53, 0x53, 0x39, 0x56, 0x6a, 0x61, 0x66, 0x51, 0x4b, 0x72, \n\t0x73, 0x44, 0x7a, 0x42, 0x38, 0x4e, 0x43, 0x50, 0x4b, 0x69, 0x6f, 0x30, 0x30, 0x69, 0x77, 0x52, 0x36, 0x5c, 0x0a,\n\t0x09, 0x49, 0x36, 0x30, 0x47, 0x6b, 0x67, 0x46, 0x4f, 0x48, 0x71, 0x74, 0x6b, 0x67, 0x36, 0x55, 0x48, 0x34, \n\t0x6e, 0x4a, 0x62, 0x75, 0x77, 0x35, 0x68, 0x51, 0x71, 0x76, 0x6b, 0x2b, 0x42, 0x49, 0x6b, 0x35, 0x2f, 0x4e, \n\t0x6b, 0x2f, 0x4d, 0x61, 0x50, 0x64, 0x51, 0x75, 0x69, 0x72, 0x72, 0x65, 0x64, 0x31, 0x58, 0x39, 0x31, 0x2f, \n\t0x41, 0x69, 0x57, 0x36, 0x53, 0x2b, 0x77, 0x55, 0x4e, 0x62, 0x45, 0x30, 0x67, 0x76, 0x68, 0x76, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x58, 0x62, 0x4a, 0x34, 0x30, 0x31, 0x50, 0x4c, 0x7a, 0x4e, 0x4b, 0x70, 0x54, 0x74, 0x58, 0x44, 0x52, \n\t0x2b, 0x6a, 0x59, 0x56, 0x4a, 0x4b, 0x51, 0x4e, 0x4a, 0x74, 0x59, 0x2f, 0x46, 0x6e, 0x78, 0x50, 0x76, 0x36, \n\t0x4f, 0x66, 0x72, 0x6a, 0x61, 0x71, 0x4b, 0x4b, 0x56, 0x65, 0x43, 0x70, 0x4c, 0x34, 0x4c, 0x47, 0x6a, 0x65, \n\t0x50, 0x38, 0x47, 0x75, 0x41, 0x52, 0x49, 0x78, 0x6b, 0x67, 0x4b, 0x54, 0x61, 0x38, 0x4b, 0x6f, 0x62, 0x5c, 0x0a,\n\t0x09, 0x73, 0x4f, 0x79, 0x57, 0x34, 0x56, 0x63, 0x73, 0x30, 0x70, 0x72, 0x6a, 0x53, 0x6c, 0x4c, 0x41, 0x56, \n\t0x70, 0x5a, 0x74, 0x62, 0x6d, 0x56, 0x4c, 0x55, 0x69, 0x49, 0x76, 0x4e, 0x7a, 0x70, 0x66, 0x62, 0x37, 0x71, \n\t0x68, 0x31, 0x6a, 0x48, 0x51, 0x2f, 0x67, 0x66, 0x70, 0x57, 0x36, 0x4c, 0x64, 0x62, 0x2f, 0x6c, 0x4d, 0x33, \n\t0x49, 0x34, 0x69, 0x53, 0x42, 0x65, 0x43, 0x45, 0x4d, 0x37, 0x52, 0x6a, 0x39, 0x4b, 0x70, 0x46, 0x30, 0x5c, 0x0a,\n\t0x09, 0x46, 0x52, 0x49, 0x50, 0x55, 0x30, 0x73, 0x4b, 0x37, 0x2f, 0x38, 0x67, 0x51, 0x42, 0x45, 0x4d, 0x43, \n\t0x61, 0x4b, 0x48, 0x6a, 0x57, 0x67, 0x6d, 0x53, 0x71, 0x67, 0x6d, 0x57, 0x61, 0x45, 0x67, 0x43, 0x6e, 0x42, \n\t0x4e, 0x74, 0x55, 0x44, 0x35, 0x7a, 0x74, 0x59, 0x44, 0x74, 0x78, 0x76, 0x76, 0x57, 0x61, 0x61, 0x75, 0x66, \n\t0x77, 0x37, 0x33, 0x4c, 0x4d, 0x4e, 0x74, 0x4c, 0x55, 0x4a, 0x55, 0x7a, 0x35, 0x4a, 0x56, 0x72, 0x42, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x6a, 0x38, 0x48, 0x58, 0x38, 0x38, 0x38, 0x4b, 0x6f, 0x4e, 0x65, 0x58, 0x36, 0x78, 0x63, 0x2b, \n\t0x52, 0x6a, 0x45, 0x77, 0x54, 0x62, 0x55, 0x35, 0x50, 0x39, 0x71, 0x52, 0x74, 0x44, 0x4e, 0x32, 0x73, 0x64, \n\t0x34, 0x47, 0x31, 0x6b, 0x55, 0x63, 0x50, 0x74, 0x78, 0x51, 0x47, 0x30, 0x45, 0x34, 0x6e, 0x55, 0x74, 0x30, \n\t0x4e, 0x61, 0x43, 0x61, 0x32, 0x72, 0x2f, 0x58, 0x77, 0x62, 0x63, 0x4a, 0x58, 0x53, 0x78, 0x6f, 0x31, 0x5c, 0x0a,\n\t0x09, 0x38, 0x53, 0x53, 0x68, 0x6b, 0x47, 0x75, 0x77, 0x44, 0x70, 0x34, 0x2f, 0x4d, 0x71, 0x73, 0x4b, 0x35, \n\t0x66, 0x66, 0x53, 0x4b, 0x7a, 0x34, 0x62, 0x2f, 0x43, 0x62, 0x7a, 0x67, 0x6a, 0x64, 0x69, 0x6c, 0x57, 0x79, \n\t0x33, 0x59, 0x33, 0x58, 0x46, 0x74, 0x61, 0x31, 0x64, 0x2f, 0x34, 0x76, 0x46, 0x43, 0x37, 0x6a, 0x68, 0x41, \n\t0x4b, 0x31, 0x53, 0x49, 0x4e, 0x48, 0x53, 0x6f, 0x79, 0x32, 0x6c, 0x45, 0x63, 0x35, 0x4a, 0x6b, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x53, 0x42, 0x59, 0x6a, 0x67, 0x5a, 0x33, 0x6c, 0x39, 0x71, 0x4a, 0x71, 0x50, 0x45, 0x6e, 0x4c, 0x61, \n\t0x43, 0x63, 0x61, 0x63, 0x75, 0x30, 0x6d, 0x6b, 0x72, 0x4a, 0x35, 0x44, 0x43, 0x77, 0x58, 0x35, 0x39, 0x2b, \n\t0x4c, 0x41, 0x66, 0x65, 0x48, 0x70, 0x57, 0x74, 0x6a, 0x2b, 0x53, 0x52, 0x79, 0x48, 0x6c, 0x71, 0x6b, 0x62, \n\t0x78, 0x62, 0x70, 0x7a, 0x72, 0x70, 0x69, 0x69, 0x65, 0x70, 0x58, 0x50, 0x35, 0x38, 0x39, 0x56, 0x74, 0x5c, 0x0a,\n\t0x09, 0x59, 0x33, 0x36, 0x67, 0x79, 0x7a, 0x32, 0x6b, 0x31, 0x53, 0x71, 0x74, 0x55, 0x39, 0x74, 0x6b, 0x69, \n\t0x52, 0x4f, 0x46, 0x2f, 0x39, 0x72, 0x34, 0x6c, 0x46, 0x53, 0x71, 0x6e, 0x36, 0x4a, 0x79, 0x77, 0x53, 0x6c, \n\t0x55, 0x42, 0x57, 0x6e, 0x35, 0x62, 0x57, 0x6f, 0x78, 0x70, 0x62, 0x4a, 0x47, 0x55, 0x6c, 0x51, 0x6c, 0x57, \n\t0x64, 0x31, 0x37, 0x61, 0x52, 0x35, 0x52, 0x4c, 0x48, 0x71, 0x4c, 0x4a, 0x67, 0x75, 0x76, 0x57, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x33, 0x69, 0x50, 0x66, 0x46, 0x36, 0x5a, 0x5a, 0x48, 0x38, 0x31, 0x4b, 0x67, 0x5a, 0x34, 0x43, 0x77, \n\t0x4e, 0x55, 0x37, 0x48, 0x69, 0x33, 0x53, 0x70, 0x38, 0x52, 0x39, 0x43, 0x49, 0x76, 0x30, 0x54, 0x32, 0x69, \n\t0x52, 0x7a, 0x75, 0x78, 0x2f, 0x64, 0x30, 0x5a, 0x5a, 0x76, 0x33, 0x4c, 0x79, 0x78, 0x76, 0x54, 0x38, 0x44, \n\t0x62, 0x45, 0x4b, 0x6c, 0x32, 0x69, 0x46, 0x51, 0x74, 0x4a, 0x7a, 0x4f, 0x79, 0x6c, 0x67, 0x74, 0x41, 0x5c, 0x0a,\n\t0x09, 0x30, 0x53, 0x31, 0x55, 0x45, 0x69, 0x78, 0x59, 0x4a, 0x45, 0x5a, 0x37, 0x48, 0x63, 0x57, 0x42, 0x4f, \n\t0x57, 0x68, 0x43, 0x47, 0x43, 0x52, 0x47, 0x35, 0x44, 0x48, 0x52, 0x70, 0x66, 0x77, 0x6d, 0x62, 0x6d, 0x69, \n\t0x43, 0x6a, 0x56, 0x6f, 0x46, 0x45, 0x75, 0x54, 0x58, 0x64, 0x56, 0x74, 0x4a, 0x37, 0x4d, 0x4e, 0x52, 0x6c, \n\t0x72, 0x43, 0x6b, 0x69, 0x6c, 0x31, 0x57, 0x67, 0x6c, 0x50, 0x79, 0x70, 0x69, 0x4e, 0x42, 0x71, 0x36, 0x5c, 0x0a,\n\t0x09, 0x43, 0x4e, 0x4a, 0x6c, 0x43, 0x4e, 0x49, 0x52, 0x66, 0x51, 0x74, 0x52, 0x37, 0x65, 0x63, 0x76, 0x65, \n\t0x43, 0x38, 0x2b, 0x33, 0x50, 0x4f, 0x6a, 0x77, 0x73, 0x30, 0x46, 0x6b, 0x68, 0x4d, 0x58, 0x43, 0x73, 0x30, \n\t0x44, 0x45, 0x6d, 0x6b, 0x66, 0x4a, 0x4f, 0x67, 0x47, 0x53, 0x43, 0x51, 0x47, 0x71, 0x59, 0x5a, 0x42, 0x64, \n\t0x6a, 0x43, 0x72, 0x67, 0x65, 0x52, 0x6e, 0x67, 0x30, 0x52, 0x39, 0x45, 0x78, 0x4b, 0x5a, 0x5a, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x52, 0x52, 0x7a, 0x46, 0x51, 0x58, 0x45, 0x45, 0x51, 0x4a, 0x79, 0x57, 0x70, 0x71, 0x45, 0x74, 0x4f, \n\t0x4d, 0x6a, 0x2b, 0x72, 0x70, 0x4d, 0x56, 0x4c, 0x6c, 0x46, 0x65, 0x68, 0x71, 0x2f, 0x31, 0x4b, 0x42, 0x74, \n\t0x42, 0x69, 0x33, 0x50, 0x30, 0x47, 0x51, 0x68, 0x76, 0x6f, 0x4f, 0x6f, 0x74, 0x72, 0x50, 0x56, 0x37, 0x30, \n\t0x59, 0x48, 0x2b, 0x67, 0x2f, 0x6d, 0x4f, 0x43, 0x30, 0x41, 0x78, 0x4a, 0x30, 0x44, 0x79, 0x54, 0x61, 0x5c, 0x0a,\n\t0x09, 0x44, 0x5a, 0x43, 0x73, 0x47, 0x6c, 0x76, 0x39, 0x47, 0x5a, 0x6d, 0x35, 0x31, 0x69, 0x47, 0x70, 0x6d, \n\t0x2f, 0x75, 0x32, 0x71, 0x34, 0x73, 0x67, 0x45, 0x2f, 0x76, 0x5a, 0x46, 0x71, 0x6d, 0x61, 0x74, 0x44, 0x36, \n\t0x68, 0x6c, 0x66, 0x46, 0x57, 0x34, 0x4f, 0x67, 0x77, 0x73, 0x64, 0x66, 0x44, 0x37, 0x38, 0x59, 0x61, 0x35, \n\t0x43, 0x6f, 0x4a, 0x45, 0x6a, 0x30, 0x42, 0x31, 0x79, 0x2f, 0x31, 0x56, 0x57, 0x42, 0x64, 0x76, 0x65, 0x5c, 0x0a,\n\t0x09, 0x71, 0x46, 0x54, 0x4d, 0x74, 0x35, 0x42, 0x77, 0x61, 0x63, 0x2b, 0x36, 0x6d, 0x66, 0x4a, 0x53, 0x46, \n\t0x36, 0x42, 0x70, 0x6c, 0x6d, 0x5a, 0x4a, 0x52, 0x70, 0x49, 0x67, 0x42, 0x4f, 0x54, 0x30, 0x5a, 0x61, 0x77, \n\t0x54, 0x59, 0x78, 0x71, 0x38, 0x51, 0x74, 0x42, 0x39, 0x74, 0x64, 0x56, 0x55, 0x66, 0x69, 0x64, 0x75, 0x51, \n\t0x59, 0x6f, 0x54, 0x76, 0x69, 0x2f, 0x63, 0x36, 0x30, 0x59, 0x4a, 0x6f, 0x6e, 0x47, 0x37, 0x32, 0x34, 0x5c, 0x0a,\n\t0x09, 0x50, 0x55, 0x77, 0x50, 0x73, 0x6f, 0x33, 0x6b, 0x70, 0x42, 0x5a, 0x73, 0x4a, 0x37, 0x4c, 0x58, 0x35, \n\t0x57, 0x52, 0x6e, 0x41, 0x45, 0x6a, 0x4a, 0x4c, 0x59, 0x47, 0x56, 0x70, 0x47, 0x53, 0x76, 0x57, 0x52, 0x2b, \n\t0x35, 0x71, 0x58, 0x66, 0x69, 0x2f, 0x6b, 0x34, 0x70, 0x4a, 0x79, 0x46, 0x6e, 0x6b, 0x51, 0x55, 0x33, 0x35, \n\t0x65, 0x34, 0x35, 0x30, 0x72, 0x58, 0x41, 0x75, 0x6e, 0x72, 0x6c, 0x53, 0x53, 0x37, 0x2b, 0x53, 0x70, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x4d, 0x59, 0x54, 0x2b, 0x71, 0x57, 0x52, 0x68, 0x4b, 0x32, 0x37, 0x4e, 0x49, 0x71, 0x59, 0x47, \n\t0x32, 0x59, 0x56, 0x6d, 0x49, 0x5a, 0x55, 0x47, 0x67, 0x65, 0x49, 0x76, 0x55, 0x56, 0x6a, 0x75, 0x62, 0x79, \n\t0x6c, 0x45, 0x78, 0x61, 0x37, 0x52, 0x5a, 0x57, 0x6f, 0x4a, 0x41, 0x43, 0x35, 0x43, 0x56, 0x52, 0x66, 0x4c, \n\t0x6a, 0x31, 0x37, 0x6f, 0x56, 0x69, 0x59, 0x4a, 0x6f, 0x58, 0x31, 0x71, 0x66, 0x65, 0x75, 0x7a, 0x61, 0x5c, 0x0a,\n\t0x09, 0x44, 0x48, 0x64, 0x56, 0x4e, 0x64, 0x32, 0x59, 0x73, 0x6c, 0x4a, 0x68, 0x31, 0x51, 0x7a, 0x4b, 0x77, \n\t0x58, 0x4a, 0x76, 0x37, 0x44, 0x55, 0x54, 0x75, 0x6f, 0x33, 0x38, 0x4c, 0x7a, 0x77, 0x76, 0x46, 0x4c, 0x70, \n\t0x76, 0x69, 0x6f, 0x48, 0x32, 0x35, 0x43, 0x6b, 0x4c, 0x35, 0x74, 0x36, 0x64, 0x55, 0x58, 0x49, 0x42, 0x38, \n\t0x42, 0x34, 0x59, 0x65, 0x70, 0x43, 0x63, 0x45, 0x79, 0x52, 0x6f, 0x42, 0x53, 0x53, 0x53, 0x41, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x54, 0x50, 0x45, 0x69, 0x30, 0x51, 0x35, 0x44, 0x38, 0x37, 0x52, 0x6f, 0x67, 0x67, 0x5a, 0x59, \n\t0x37, 0x38, 0x69, 0x31, 0x34, 0x66, 0x41, 0x75, 0x77, 0x75, 0x6e, 0x41, 0x39, 0x6f, 0x56, 0x35, 0x72, 0x77, \n\t0x39, 0x57, 0x47, 0x4c, 0x62, 0x52, 0x41, 0x69, 0x75, 0x4b, 0x6c, 0x57, 0x75, 0x50, 0x41, 0x57, 0x39, 0x58, \n\t0x59, 0x79, 0x6d, 0x66, 0x68, 0x65, 0x53, 0x79, 0x50, 0x52, 0x51, 0x2f, 0x43, 0x4c, 0x2f, 0x6a, 0x43, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x4c, 0x71, 0x7a, 0x36, 0x73, 0x39, 0x4f, 0x78, 0x74, 0x43, 0x66, 0x33, 0x73, 0x42, 0x54, 0x77, \n\t0x73, 0x52, 0x30, 0x48, 0x30, 0x52, 0x7a, 0x56, 0x51, 0x31, 0x64, 0x6d, 0x35, 0x30, 0x54, 0x61, 0x75, 0x72, \n\t0x61, 0x37, 0x48, 0x59, 0x32, 0x7a, 0x51, 0x32, 0x42, 0x4c, 0x6d, 0x71, 0x44, 0x75, 0x56, 0x56, 0x48, 0x6c, \n\t0x70, 0x65, 0x4c, 0x4c, 0x44, 0x62, 0x50, 0x44, 0x33, 0x6d, 0x79, 0x43, 0x55, 0x54, 0x58, 0x48, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x57, 0x35, 0x73, 0x31, 0x49, 0x79, 0x76, 0x35, 0x51, 0x70, 0x63, 0x50, 0x4d, 0x73, 0x32, 0x57, 0x30, \n\t0x35, 0x71, 0x55, 0x31, 0x4b, 0x61, 0x37, 0x52, 0x6c, 0x4b, 0x34, 0x4e, 0x33, 0x38, 0x6c, 0x7a, 0x63, 0x62, \n\t0x6d, 0x62, 0x58, 0x52, 0x64, 0x47, 0x31, 0x6e, 0x55, 0x51, 0x57, 0x33, 0x6e, 0x78, 0x48, 0x7a, 0x39, 0x31, \n\t0x5a, 0x39, 0x59, 0x71, 0x54, 0x4b, 0x2f, 0x69, 0x63, 0x76, 0x79, 0x32, 0x63, 0x75, 0x4f, 0x56, 0x75, 0x5c, 0x0a,\n\t0x09, 0x38, 0x6c, 0x71, 0x6b, 0x74, 0x4d, 0x41, 0x35, 0x72, 0x30, 0x57, 0x79, 0x76, 0x73, 0x2b, 0x51, 0x6b, \n\t0x43, 0x53, 0x79, 0x31, 0x4f, 0x31, 0x59, 0x4a, 0x4f, 0x6a, 0x4d, 0x49, 0x76, 0x6b, 0x37, 0x59, 0x30, 0x76, \n\t0x44, 0x72, 0x55, 0x75, 0x67, 0x31, 0x64, 0x51, 0x30, 0x31, 0x32, 0x5a, 0x59, 0x6d, 0x4c, 0x71, 0x5a, 0x52, \n\t0x7a, 0x4b, 0x43, 0x5a, 0x73, 0x73, 0x69, 0x32, 0x58, 0x6b, 0x6b, 0x61, 0x6b, 0x6c, 0x49, 0x77, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x71, 0x79, 0x56, 0x68, 0x65, 0x35, 0x4e, 0x69, 0x79, 0x79, 0x34, 0x66, 0x66, 0x4b, 0x33, 0x46, 0x46, \n\t0x41, 0x30, 0x43, 0x4a, 0x39, 0x6e, 0x65, 0x35, 0x63, 0x54, 0x58, 0x72, 0x76, 0x7a, 0x69, 0x69, 0x35, 0x43, \n\t0x4e, 0x67, 0x49, 0x47, 0x78, 0x54, 0x53, 0x34, 0x35, 0x59, 0x38, 0x49, 0x4e, 0x47, 0x69, 0x51, 0x48, 0x49, \n\t0x79, 0x51, 0x43, 0x49, 0x64, 0x67, 0x4e, 0x53, 0x68, 0x46, 0x69, 0x6e, 0x63, 0x72, 0x62, 0x6b, 0x73, 0x5c, 0x0a,\n\t0x09, 0x58, 0x77, 0x4f, 0x70, 0x6e, 0x6b, 0x67, 0x30, 0x78, 0x6e, 0x44, 0x56, 0x30, 0x6d, 0x4d, 0x6c, 0x35, \n\t0x64, 0x37, 0x53, 0x64, 0x45, 0x6c, 0x47, 0x4b, 0x69, 0x43, 0x6c, 0x47, 0x63, 0x53, 0x49, 0x6f, 0x2b, 0x70, \n\t0x78, 0x4c, 0x71, 0x6c, 0x30, 0x45, 0x68, 0x71, 0x71, 0x56, 0x51, 0x71, 0x6b, 0x31, 0x51, 0x6a, 0x53, 0x47, \n\t0x33, 0x72, 0x71, 0x7a, 0x71, 0x71, 0x58, 0x6e, 0x2f, 0x4a, 0x63, 0x2f, 0x50, 0x5a, 0x37, 0x75, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x30, 0x6b, 0x57, 0x54, 0x57, 0x77, 0x46, 0x6c, 0x79, 0x62, 0x37, 0x57, 0x62, 0x61, 0x64, 0x6d, 0x31, \n\t0x39, 0x4a, 0x72, 0x4d, 0x74, 0x4c, 0x52, 0x45, 0x75, 0x6a, 0x64, 0x66, 0x53, 0x50, 0x45, 0x30, 0x57, 0x34, \n\t0x70, 0x68, 0x75, 0x7a, 0x5a, 0x44, 0x55, 0x32, 0x75, 0x37, 0x4d, 0x53, 0x2b, 0x30, 0x59, 0x51, 0x4b, 0x4b, \n\t0x61, 0x6d, 0x70, 0x66, 0x53, 0x63, 0x36, 0x53, 0x55, 0x37, 0x73, 0x62, 0x73, 0x59, 0x38, 0x45, 0x47, 0x5c, 0x0a,\n\t0x09, 0x64, 0x47, 0x73, 0x66, 0x45, 0x50, 0x66, 0x6d, 0x65, 0x41, 0x2f, 0x68, 0x68, 0x78, 0x35, 0x48, 0x46, \n\t0x74, 0x2f, 0x69, 0x39, 0x38, 0x71, 0x64, 0x66, 0x56, 0x58, 0x57, 0x47, 0x2b, 0x57, 0x76, 0x50, 0x53, 0x31, \n\t0x77, 0x31, 0x68, 0x4b, 0x36, 0x6e, 0x56, 0x71, 0x6b, 0x72, 0x4f, 0x61, 0x52, 0x50, 0x42, 0x61, 0x70, 0x58, \n\t0x58, 0x55, 0x6b, 0x4f, 0x4f, 0x6e, 0x35, 0x71, 0x6c, 0x59, 0x73, 0x55, 0x6a, 0x41, 0x6a, 0x63, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x61, 0x2b, 0x6d, 0x63, 0x46, 0x57, 0x46, 0x69, 0x6e, 0x30, 0x54, 0x52, 0x63, 0x58, 0x31, 0x6c, 0x4b, \n\t0x53, 0x6b, 0x62, 0x35, 0x6d, 0x64, 0x65, 0x4a, 0x7a, 0x71, 0x5a, 0x46, 0x6a, 0x71, 0x73, 0x56, 0x4e, 0x4a, \n\t0x6f, 0x6d, 0x67, 0x75, 0x35, 0x62, 0x52, 0x57, 0x49, 0x74, 0x62, 0x64, 0x77, 0x56, 0x61, 0x70, 0x4e, 0x4f, \n\t0x6c, 0x4b, 0x74, 0x49, 0x2f, 0x47, 0x72, 0x64, 0x76, 0x36, 0x59, 0x6b, 0x37, 0x71, 0x2f, 0x37, 0x30, 0x5c, 0x0a,\n\t0x09, 0x52, 0x58, 0x2b, 0x42, 0x44, 0x2b, 0x7a, 0x4d, 0x68, 0x49, 0x74, 0x49, 0x42, 0x59, 0x6b, 0x55, 0x41, \n\t0x31, 0x4b, 0x6a, 0x64, 0x72, 0x61, 0x32, 0x51, 0x53, 0x49, 0x70, 0x79, 0x63, 0x57, 0x43, 0x5a, 0x62, 0x62, \n\t0x63, 0x2f, 0x61, 0x68, 0x59, 0x4b, 0x4e, 0x41, 0x79, 0x32, 0x4c, 0x34, 0x41, 0x4b, 0x61, 0x71, 0x4a, 0x42, \n\t0x53, 0x6e, 0x67, 0x79, 0x44, 0x59, 0x34, 0x58, 0x6e, 0x58, 0x58, 0x59, 0x79, 0x63, 0x2f, 0x63, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x64, 0x55, 0x68, 0x38, 0x64, 0x77, 0x68, 0x39, 0x55, 0x55, 0x6c, 0x35, 0x62, 0x68, 0x34, 0x6f, 0x62, \n\t0x50, 0x77, 0x66, 0x50, 0x6c, 0x77, 0x46, 0x35, 0x68, 0x2b, 0x44, 0x47, 0x36, 0x37, 0x55, 0x2b, 0x63, 0x72, \n\t0x6b, 0x4a, 0x55, 0x2f, 0x63, 0x6d, 0x70, 0x48, 0x6a, 0x36, 0x6f, 0x7a, 0x32, 0x64, 0x5a, 0x69, 0x32, 0x59, \n\t0x67, 0x36, 0x59, 0x58, 0x56, 0x53, 0x35, 0x41, 0x79, 0x71, 0x2f, 0x37, 0x71, 0x63, 0x77, 0x77, 0x34, 0x5c, 0x0a,\n\t0x09, 0x43, 0x67, 0x52, 0x4a, 0x35, 0x6f, 0x6d, 0x59, 0x48, 0x73, 0x6f, 0x45, 0x53, 0x49, 0x75, 0x56, 0x49, \n\t0x67, 0x75, 0x6a, 0x36, 0x37, 0x58, 0x72, 0x4a, 0x6c, 0x69, 0x4a, 0x7a, 0x4c, 0x53, 0x56, 0x33, 0x51, 0x59, \n\t0x62, 0x48, 0x44, 0x74, 0x76, 0x6c, 0x4b, 0x58, 0x62, 0x78, 0x69, 0x30, 0x62, 0x59, 0x62, 0x43, 0x79, 0x52, \n\t0x75, 0x53, 0x4f, 0x4b, 0x44, 0x30, 0x61, 0x74, 0x32, 0x64, 0x33, 0x32, 0x52, 0x49, 0x52, 0x4e, 0x68, 0x5c, 0x0a,\n\t0x09, 0x62, 0x51, 0x34, 0x63, 0x6d, 0x61, 0x6b, 0x51, 0x31, 0x4d, 0x2b, 0x6e, 0x46, 0x71, 0x74, 0x65, 0x51, \n\t0x58, 0x44, 0x6c, 0x49, 0x37, 0x4c, 0x66, 0x2b, 0x70, 0x49, 0x45, 0x46, 0x78, 0x49, 0x49, 0x55, 0x69, 0x36, \n\t0x55, 0x67, 0x35, 0x46, 0x4e, 0x49, 0x61, 0x47, 0x57, 0x31, 0x72, 0x43, 0x68, 0x37, 0x31, 0x76, 0x7a, 0x54, \n\t0x68, 0x76, 0x77, 0x56, 0x53, 0x71, 0x49, 0x4e, 0x55, 0x34, 0x37, 0x55, 0x32, 0x55, 0x77, 0x57, 0x67, 0x5c, 0x0a,\n\t0x09, 0x43, 0x2f, 0x39, 0x72, 0x47, 0x65, 0x35, 0x4e, 0x4f, 0x32, 0x66, 0x6f, 0x4c, 0x50, 0x6b, 0x6a, 0x5a, \n\t0x4e, 0x39, 0x44, 0x7a, 0x2b, 0x38, 0x61, 0x52, 0x4c, 0x4f, 0x58, 0x6e, 0x54, 0x61, 0x4d, 0x68, 0x58, 0x46, \n\t0x52, 0x73, 0x72, 0x44, 0x61, 0x42, 0x59, 0x6b, 0x55, 0x44, 0x31, 0x4b, 0x37, 0x45, 0x68, 0x4c, 0x49, 0x61, \n\t0x76, 0x6e, 0x58, 0x67, 0x45, 0x71, 0x41, 0x42, 0x44, 0x6c, 0x41, 0x41, 0x67, 0x30, 0x43, 0x42, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x49, 0x45, 0x68, 0x34, 0x76, 0x57, 0x36, 0x68, 0x70, 0x49, 0x56, 0x63, 0x33, 0x6c, 0x56, 0x53, 0x31, \n\t0x77, 0x55, 0x69, 0x78, 0x53, 0x6d, 0x4e, 0x4b, 0x6a, 0x78, 0x47, 0x6a, 0x4d, 0x72, 0x61, 0x64, 0x4c, 0x55, \n\t0x64, 0x4a, 0x41, 0x63, 0x76, 0x62, 0x46, 0x32, 0x47, 0x69, 0x56, 0x7a, 0x47, 0x4c, 0x37, 0x70, 0x39, 0x4c, \n\t0x4e, 0x71, 0x30, 0x37, 0x6f, 0x6a, 0x69, 0x57, 0x69, 0x39, 0x4b, 0x2f, 0x77, 0x34, 0x52, 0x35, 0x41, 0x5c, 0x0a,\n\t0x09, 0x55, 0x77, 0x75, 0x37, 0x42, 0x5a, 0x41, 0x67, 0x43, 0x79, 0x54, 0x49, 0x41, 0x41, 0x6c, 0x36, 0x41, \n\t0x31, 0x49, 0x75, 0x64, 0x61, 0x51, 0x4f, 0x55, 0x6c, 0x35, 0x31, 0x4a, 0x42, 0x58, 0x41, 0x53, 0x45, 0x75, \n\t0x55, 0x63, 0x47, 0x30, 0x61, 0x5a, 0x4d, 0x70, 0x71, 0x52, 0x62, 0x45, 0x51, 0x31, 0x51, 0x4e, 0x77, 0x50, \n\t0x56, 0x61, 0x71, 0x6d, 0x2b, 0x6b, 0x42, 0x7a, 0x51, 0x4c, 0x52, 0x52, 0x49, 0x4f, 0x76, 0x48, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x77, 0x72, 0x31, 0x32, 0x64, 0x5a, 0x70, 0x73, 0x72, 0x4c, 0x6c, 0x65, 0x61, 0x49, 0x6e, 0x66, 0x2b, \n\t0x2b, 0x77, 0x69, 0x47, 0x61, 0x2f, 0x66, 0x46, 0x70, 0x72, 0x47, 0x37, 0x36, 0x45, 0x64, 0x42, 0x62, 0x72, \n\t0x4e, 0x73, 0x46, 0x69, 0x57, 0x61, 0x42, 0x52, 0x4a, 0x4b, 0x2f, 0x63, 0x4a, 0x72, 0x56, 0x75, 0x6a, 0x35, \n\t0x50, 0x5a, 0x4c, 0x62, 0x38, 0x33, 0x43, 0x43, 0x32, 0x50, 0x42, 0x4b, 0x51, 0x4b, 0x4e, 0x6a, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x31, 0x73, 0x6a, 0x58, 0x32, 0x74, 0x6d, 0x43, 0x57, 0x46, 0x72, 0x4c, 0x39, 0x33, 0x57, 0x4c, 0x46, \n\t0x4a, 0x68, 0x74, 0x61, 0x30, 0x59, 0x7a, 0x68, 0x77, 0x6d, 0x4f, 0x61, 0x5a, 0x47, 0x71, 0x38, 0x66, 0x6d, \n\t0x68, 0x33, 0x61, 0x61, 0x6d, 0x37, 0x5a, 0x65, 0x4f, 0x77, 0x74, 0x74, 0x64, 0x6f, 0x55, 0x44, 0x36, 0x4c, \n\t0x2f, 0x54, 0x5a, 0x45, 0x34, 0x61, 0x4c, 0x74, 0x55, 0x53, 0x45, 0x59, 0x49, 0x32, 0x4d, 0x44, 0x54, 0x5c, 0x0a,\n\t0x09, 0x34, 0x70, 0x56, 0x50, 0x61, 0x55, 0x64, 0x68, 0x6d, 0x6b, 0x52, 0x46, 0x56, 0x38, 0x50, 0x71, 0x73, \n\t0x6a, 0x77, 0x61, 0x71, 0x64, 0x43, 0x61, 0x42, 0x6f, 0x47, 0x47, 0x72, 0x78, 0x55, 0x61, 0x43, 0x42, 0x5a, \n\t0x4d, 0x56, 0x4c, 0x79, 0x69, 0x4a, 0x46, 0x74, 0x54, 0x51, 0x4e, 0x4b, 0x4f, 0x71, 0x6e, 0x4a, 0x43, 0x64, \n\t0x74, 0x31, 0x32, 0x5a, 0x4a, 0x53, 0x45, 0x49, 0x70, 0x44, 0x51, 0x6b, 0x74, 0x33, 0x54, 0x5a, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x50, 0x71, 0x32, 0x38, 0x52, 0x46, 0x71, 0x69, 0x63, 0x41, 0x46, 0x75, 0x7a, 0x79, 0x34, 0x57, 0x49, \n\t0x67, 0x6f, 0x66, 0x69, 0x48, 0x70, 0x5a, 0x46, 0x41, 0x45, 0x53, 0x4e, 0x41, 0x47, 0x70, 0x70, 0x5a, 0x62, \n\t0x2f, 0x48, 0x6f, 0x50, 0x55, 0x71, 0x68, 0x5a, 0x4a, 0x36, 0x48, 0x64, 0x69, 0x79, 0x30, 0x4d, 0x44, 0x44, \n\t0x53, 0x53, 0x31, 0x37, 0x32, 0x73, 0x57, 0x4a, 0x6a, 0x42, 0x7a, 0x52, 0x51, 0x6f, 0x67, 0x4a, 0x66, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x58, 0x31, 0x5a, 0x45, 0x30, 0x51, 0x36, 0x38, 0x55, 0x71, 0x6f, 0x34, 0x41, 0x76, 0x67, 0x6c, \n\t0x53, 0x61, 0x4b, 0x6b, 0x6a, 0x51, 0x31, 0x4d, 0x52, 0x53, 0x63, 0x71, 0x72, 0x35, 0x50, 0x4e, 0x6e, 0x67, \n\t0x49, 0x64, 0x76, 0x4c, 0x51, 0x79, 0x69, 0x32, 0x52, 0x2b, 0x39, 0x6c, 0x45, 0x33, 0x57, 0x64, 0x68, 0x71, \n\t0x6b, 0x78, 0x43, 0x31, 0x74, 0x67, 0x30, 0x53, 0x37, 0x41, 0x56, 0x4b, 0x2f, 0x79, 0x6d, 0x78, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x31, 0x70, 0x73, 0x58, 0x6a, 0x4f, 0x6e, 0x57, 0x59, 0x70, 0x43, 0x30, 0x33, 0x42, 0x45, 0x76, 0x31, \n\t0x46, 0x43, 0x72, 0x34, 0x6d, 0x74, 0x75, 0x4c, 0x69, 0x47, 0x7a, 0x72, 0x61, 0x66, 0x6b, 0x68, 0x2b, 0x77, \n\t0x65, 0x4a, 0x52, 0x70, 0x6b, 0x59, 0x48, 0x66, 0x54, 0x31, 0x6f, 0x50, 0x75, 0x4b, 0x68, 0x75, 0x39, 0x46, \n\t0x73, 0x41, 0x37, 0x52, 0x6c, 0x6d, 0x6a, 0x4d, 0x2b, 0x6d, 0x47, 0x34, 0x78, 0x59, 0x57, 0x5a, 0x59, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x65, 0x6d, 0x79, 0x79, 0x30, 0x39, 0x47, 0x78, 0x30, 0x6b, 0x53, 0x44, 0x31, 0x72, 0x54, 0x6f, \n\t0x53, 0x6d, 0x6d, 0x69, 0x52, 0x71, 0x42, 0x57, 0x37, 0x67, 0x51, 0x49, 0x69, 0x44, 0x53, 0x54, 0x4e, 0x74, \n\t0x51, 0x47, 0x31, 0x63, 0x6b, 0x65, 0x42, 0x56, 0x6d, 0x75, 0x7a, 0x6b, 0x70, 0x56, 0x36, 0x65, 0x31, 0x74, \n\t0x6f, 0x53, 0x30, 0x75, 0x73, 0x57, 0x49, 0x64, 0x58, 0x2f, 0x37, 0x57, 0x55, 0x41, 0x4e, 0x54, 0x53, 0x5c, 0x0a,\n\t0x09, 0x75, 0x79, 0x4d, 0x70, 0x39, 0x31, 0x5a, 0x2b, 0x48, 0x6c, 0x34, 0x50, 0x37, 0x39, 0x64, 0x66, 0x78, \n\t0x70, 0x33, 0x58, 0x4e, 0x6f, 0x4f, 0x6a, 0x61, 0x65, 0x66, 0x46, 0x32, 0x52, 0x2b, 0x65, 0x58, 0x73, 0x4a, \n\t0x37, 0x65, 0x35, 0x50, 0x6f, 0x48, 0x4b, 0x64, 0x33, 0x36, 0x4a, 0x4f, 0x64, 0x35, 0x55, 0x44, 0x30, 0x51, \n\t0x6a, 0x51, 0x37, 0x39, 0x6c, 0x47, 0x74, 0x41, 0x36, 0x4c, 0x63, 0x36, 0x6a, 0x30, 0x57, 0x34, 0x35, 0x5c, 0x0a,\n\t0x09, 0x36, 0x4c, 0x69, 0x66, 0x50, 0x30, 0x7a, 0x32, 0x48, 0x74, 0x4e, 0x4d, 0x51, 0x2b, 0x50, 0x2f, 0x6f, \n\t0x63, 0x32, 0x5a, 0x45, 0x52, 0x74, 0x4d, 0x2f, 0x58, 0x4f, 0x6a, 0x43, 0x79, 0x4c, 0x44, 0x57, 0x4a, 0x32, \n\t0x73, 0x41, 0x79, 0x4f, 0x6b, 0x64, 0x71, 0x63, 0x5a, 0x66, 0x34, 0x72, 0x6f, 0x7a, 0x4f, 0x6b, 0x59, 0x6e, \n\t0x4f, 0x6c, 0x4e, 0x59, 0x31, 0x4e, 0x42, 0x79, 0x45, 0x6c, 0x4a, 0x71, 0x44, 0x72, 0x46, 0x50, 0x74, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x62, 0x46, 0x57, 0x49, 0x2f, 0x30, 0x31, 0x31, 0x59, 0x36, 0x70, 0x55, 0x57, 0x66, 0x44, 0x6b, \n\t0x70, 0x43, 0x51, 0x51, 0x41, 0x32, 0x53, 0x76, 0x31, 0x36, 0x72, 0x2f, 0x53, 0x62, 0x71, 0x38, 0x41, 0x6a, \n\t0x4a, 0x44, 0x70, 0x45, 0x49, 0x42, 0x58, 0x57, 0x30, 0x35, 0x6b, 0x48, 0x56, 0x62, 0x68, 0x6a, 0x53, 0x78, \n\t0x48, 0x6d, 0x6b, 0x66, 0x4c, 0x78, 0x34, 0x78, 0x5a, 0x35, 0x4a, 0x79, 0x4f, 0x63, 0x59, 0x2b, 0x56, 0x5c, 0x0a,\n\t0x09, 0x35, 0x48, 0x45, 0x4f, 0x47, 0x43, 0x39, 0x54, 0x37, 0x59, 0x4a, 0x77, 0x4c, 0x49, 0x65, 0x50, 0x59, \n\t0x6d, 0x48, 0x46, 0x46, 0x5a, 0x32, 0x79, 0x41, 0x42, 0x53, 0x5a, 0x7a, 0x62, 0x43, 0x35, 0x44, 0x69, 0x38, \n\t0x33, 0x54, 0x50, 0x6f, 0x6f, 0x46, 0x6b, 0x78, 0x2b, 0x2f, 0x64, 0x42, 0x67, 0x6d, 0x30, 0x5a, 0x36, 0x68, \n\t0x47, 0x6b, 0x57, 0x55, 0x4e, 0x73, 0x6c, 0x51, 0x55, 0x71, 0x76, 0x67, 0x59, 0x4b, 0x76, 0x55, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x68, 0x77, 0x67, 0x51, 0x52, 0x4b, 0x44, 0x37, 0x64, 0x2f, 0x78, 0x67, 0x41, 0x63, 0x50, 0x72, \n\t0x73, 0x50, 0x6e, 0x67, 0x39, 0x66, 0x70, 0x4f, 0x41, 0x35, 0x55, 0x38, 0x61, 0x4e, 0x63, 0x6c, 0x38, 0x74, \n\t0x64, 0x6f, 0x52, 0x36, 0x49, 0x2f, 0x56, 0x4b, 0x5a, 0x77, 0x71, 0x70, 0x6a, 0x41, 0x7a, 0x6a, 0x6d, 0x4d, \n\t0x41, 0x30, 0x59, 0x2f, 0x6a, 0x31, 0x55, 0x66, 0x49, 0x39, 0x74, 0x44, 0x4b, 0x4c, 0x47, 0x37, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x53, 0x73, 0x52, 0x49, 0x76, 0x62, 0x78, 0x30, 0x62, 0x46, 0x66, 0x66, 0x6c, 0x39, 0x4b, 0x6e, \n\t0x6e, 0x75, 0x4f, 0x54, 0x41, 0x42, 0x34, 0x4c, 0x32, 0x49, 0x61, 0x4c, 0x77, 0x35, 0x75, 0x6a, 0x42, 0x47, \n\t0x49, 0x57, 0x74, 0x42, 0x59, 0x31, 0x45, 0x42, 0x34, 0x6d, 0x43, 0x49, 0x51, 0x4a, 0x51, 0x33, 0x57, 0x71, \n\t0x49, 0x31, 0x62, 0x32, 0x6d, 0x53, 0x4a, 0x41, 0x67, 0x54, 0x41, 0x4c, 0x4c, 0x4a, 0x43, 0x53, 0x71, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x36, 0x4e, 0x2b, 0x6e, 0x6e, 0x30, 0x66, 0x59, 0x50, 0x34, 0x6f, 0x78, 0x46, 0x63, 0x55, 0x43, \n\t0x42, 0x4a, 0x59, 0x6f, 0x6a, 0x6a, 0x31, 0x66, 0x2b, 0x35, 0x44, 0x58, 0x51, 0x6b, 0x53, 0x52, 0x4c, 0x43, \n\t0x4c, 0x6a, 0x36, 0x6c, 0x72, 0x49, 0x50, 0x6e, 0x53, 0x51, 0x73, 0x6a, 0x75, 0x32, 0x48, 0x6a, 0x65, 0x48, \n\t0x35, 0x35, 0x77, 0x34, 0x62, 0x50, 0x66, 0x38, 0x64, 0x42, 0x41, 0x45, 0x66, 0x41, 0x38, 0x42, 0x67, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x77, 0x72, 0x65, 0x64, 0x52, 0x63, 0x4c, 0x30, 0x51, 0x53, 0x6d, 0x7a, 0x72, 0x42, 0x75, 0x43, \n\t0x56, 0x43, 0x44, 0x7a, 0x77, 0x6d, 0x41, 0x4d, 0x58, 0x76, 0x73, 0x65, 0x48, 0x79, 0x70, 0x42, 0x70, 0x74, \n\t0x51, 0x52, 0x49, 0x41, 0x4f, 0x61, 0x51, 0x79, 0x74, 0x6f, 0x35, 0x4c, 0x43, 0x36, 0x71, 0x72, 0x32, 0x58, \n\t0x33, 0x75, 0x42, 0x43, 0x66, 0x79, 0x6d, 0x72, 0x63, 0x2b, 0x58, 0x31, 0x62, 0x45, 0x4d, 0x33, 0x38, 0x5c, 0x0a,\n\t0x09, 0x59, 0x45, 0x30, 0x4a, 0x50, 0x2b, 0x34, 0x73, 0x45, 0x70, 0x75, 0x59, 0x46, 0x6b, 0x44, 0x53, 0x6f, \n\t0x64, 0x46, 0x42, 0x30, 0x75, 0x67, 0x76, 0x43, 0x69, 0x52, 0x49, 0x63, 0x31, 0x4f, 0x4e, 0x51, 0x43, 0x4c, \n\t0x52, 0x72, 0x7a, 0x2b, 0x2b, 0x70, 0x37, 0x6a, 0x51, 0x7a, 0x61, 0x2f, 0x51, 0x7a, 0x57, 0x38, 0x62, 0x49, \n\t0x45, 0x58, 0x6e, 0x32, 0x53, 0x41, 0x35, 0x4d, 0x68, 0x35, 0x53, 0x46, 0x73, 0x6d, 0x4c, 0x62, 0x34, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x2f, 0x57, 0x31, 0x6b, 0x64, 0x5a, 0x54, 0x46, 0x71, 0x30, 0x72, 0x55, 0x42, 0x50, 0x4c, 0x6b, \n\t0x68, 0x67, 0x4c, 0x72, 0x76, 0x59, 0x2b, 0x48, 0x52, 0x6c, 0x41, 0x41, 0x2b, 0x74, 0x71, 0x70, 0x55, 0x50, \n\t0x75, 0x64, 0x71, 0x4e, 0x59, 0x42, 0x4b, 0x4f, 0x64, 0x52, 0x41, 0x6f, 0x66, 0x49, 0x48, 0x49, 0x38, 0x66, \n\t0x65, 0x54, 0x72, 0x67, 0x31, 0x78, 0x76, 0x44, 0x68, 0x51, 0x48, 0x65, 0x46, 0x51, 0x72, 0x49, 0x43, 0x5c, 0x0a,\n\t0x09, 0x35, 0x47, 0x57, 0x4e, 0x49, 0x48, 0x4b, 0x61, 0x57, 0x4b, 0x45, 0x58, 0x34, 0x39, 0x2b, 0x46, 0x31, \n\t0x47, 0x35, 0x41, 0x70, 0x57, 0x62, 0x56, 0x32, 0x67, 0x79, 0x63, 0x71, 0x64, 0x6d, 0x34, 0x6d, 0x72, 0x68, \n\t0x48, 0x6b, 0x74, 0x36, 0x6b, 0x6b, 0x43, 0x50, 0x59, 0x62, 0x71, 0x6a, 0x58, 0x4c, 0x6b, 0x51, 0x64, 0x53, \n\t0x54, 0x4c, 0x55, 0x6b, 0x63, 0x33, 0x61, 0x35, 0x6c, 0x70, 0x52, 0x52, 0x31, 0x4c, 0x4e, 0x76, 0x61, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x41, 0x6d, 0x32, 0x71, 0x42, 0x73, 0x30, 0x70, 0x47, 0x68, 0x6c, 0x4a, 0x43, 0x45, 0x6d, 0x6f, \n\t0x42, 0x74, 0x5a, 0x43, 0x51, 0x72, 0x44, 0x35, 0x32, 0x46, 0x73, 0x5a, 0x48, 0x36, 0x75, 0x44, 0x37, 0x41, \n\t0x61, 0x37, 0x6d, 0x74, 0x6c, 0x36, 0x76, 0x67, 0x56, 0x2f, 0x33, 0x45, 0x62, 0x49, 0x36, 0x75, 0x4d, 0x53, \n\t0x48, 0x55, 0x30, 0x2b, 0x63, 0x68, 0x51, 0x55, 0x6a, 0x56, 0x76, 0x65, 0x6c, 0x4b, 0x48, 0x43, 0x58, 0x5c, 0x0a,\n\t0x09, 0x41, 0x72, 0x64, 0x45, 0x67, 0x79, 0x31, 0x75, 0x58, 0x54, 0x59, 0x7a, 0x56, 0x6b, 0x55, 0x31, 0x79, \n\t0x70, 0x37, 0x57, 0x53, 0x55, 0x78, 0x30, 0x56, 0x76, 0x54, 0x72, 0x77, 0x44, 0x2f, 0x45, 0x47, 0x44, 0x55, \n\t0x73, 0x33, 0x53, 0x49, 0x39, 0x39, 0x71, 0x77, 0x50, 0x58, 0x2f, 0x76, 0x33, 0x6e, 0x62, 0x42, 0x6a, 0x64, \n\t0x35, 0x68, 0x52, 0x31, 0x52, 0x58, 0x4c, 0x73, 0x6f, 0x55, 0x75, 0x66, 0x4f, 0x6a, 0x56, 0x59, 0x33, 0x5c, 0x0a,\n\t0x09, 0x44, 0x67, 0x50, 0x71, 0x34, 0x35, 0x6f, 0x6b, 0x58, 0x69, 0x73, 0x33, 0x4e, 0x61, 0x4a, 0x44, 0x30, \n\t0x57, 0x61, 0x74, 0x55, 0x69, 0x71, 0x55, 0x41, 0x7a, 0x65, 0x70, 0x2b, 0x79, 0x53, 0x49, 0x34, 0x51, 0x74, \n\t0x53, 0x6c, 0x6f, 0x53, 0x54, 0x73, 0x57, 0x79, 0x51, 0x72, 0x71, 0x44, 0x59, 0x73, 0x6b, 0x68, 0x57, 0x34, \n\t0x4b, 0x50, 0x44, 0x5a, 0x71, 0x69, 0x62, 0x4b, 0x51, 0x56, 0x48, 0x4e, 0x74, 0x56, 0x42, 0x57, 0x54, 0x5c, 0x0a,\n\t0x09, 0x63, 0x47, 0x31, 0x4c, 0x78, 0x69, 0x6c, 0x38, 0x39, 0x38, 0x4c, 0x74, 0x73, 0x48, 0x57, 0x6e, 0x36, \n\t0x4c, 0x76, 0x50, 0x35, 0x68, 0x59, 0x5a, 0x47, 0x66, 0x62, 0x34, 0x75, 0x4a, 0x44, 0x45, 0x39, 0x57, 0x42, \n\t0x34, 0x79, 0x4e, 0x57, 0x36, 0x4a, 0x4d, 0x6d, 0x74, 0x63, 0x6c, 0x6e, 0x4b, 0x34, 0x6d, 0x67, 0x6a, 0x6c, \n\t0x45, 0x53, 0x58, 0x61, 0x56, 0x67, 0x6c, 0x39, 0x72, 0x61, 0x44, 0x6b, 0x65, 0x4f, 0x48, 0x32, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x72, 0x77, 0x33, 0x56, 0x48, 0x65, 0x38, 0x37, 0x4b, 0x68, 0x2f, 0x78, 0x32, 0x49, 0x50, 0x72, \n\t0x54, 0x71, 0x46, 0x41, 0x64, 0x66, 0x57, 0x69, 0x56, 0x39, 0x4d, 0x4a, 0x6d, 0x44, 0x2f, 0x4a, 0x7a, 0x56, \n\t0x2b, 0x36, 0x41, 0x47, 0x78, 0x2b, 0x5a, 0x7a, 0x5a, 0x63, 0x45, 0x78, 0x2f, 0x55, 0x4c, 0x62, 0x31, 0x32, \n\t0x59, 0x38, 0x6a, 0x6c, 0x74, 0x67, 0x47, 0x51, 0x58, 0x61, 0x74, 0x73, 0x67, 0x4f, 0x63, 0x5a, 0x45, 0x5c, 0x0a,\n\t0x09, 0x65, 0x52, 0x46, 0x49, 0x74, 0x67, 0x73, 0x30, 0x72, 0x72, 0x46, 0x64, 0x6b, 0x50, 0x54, 0x72, 0x56, \n\t0x53, 0x44, 0x35, 0x41, 0x68, 0x70, 0x31, 0x32, 0x53, 0x45, 0x31, 0x56, 0x4b, 0x48, 0x38, 0x38, 0x39, 0x6e, \n\t0x63, 0x4e, 0x66, 0x6a, 0x2f, 0x5a, 0x59, 0x76, 0x6c, 0x39, 0x58, 0x42, 0x51, 0x51, 0x71, 0x6c, 0x4f, 0x6c, \n\t0x4f, 0x64, 0x45, 0x74, 0x30, 0x42, 0x6a, 0x56, 0x57, 0x63, 0x6f, 0x7a, 0x34, 0x31, 0x71, 0x66, 0x76, 0x5c, 0x0a,\n\t0x09, 0x46, 0x63, 0x4a, 0x45, 0x61, 0x4d, 0x70, 0x49, 0x4a, 0x35, 0x4e, 0x6c, 0x6c, 0x4e, 0x37, 0x55, 0x48, \n\t0x32, 0x59, 0x68, 0x52, 0x66, 0x73, 0x78, 0x6b, 0x66, 0x37, 0x32, 0x77, 0x4a, 0x6f, 0x70, 0x6e, 0x76, 0x72, \n\t0x32, 0x47, 0x7a, 0x6c, 0x52, 0x77, 0x4c, 0x69, 0x59, 0x70, 0x59, 0x46, 0x6b, 0x6a, 0x69, 0x59, 0x55, 0x78, \n\t0x58, 0x38, 0x30, 0x39, 0x4a, 0x75, 0x72, 0x74, 0x47, 0x47, 0x39, 0x54, 0x6b, 0x64, 0x43, 0x50, 0x54, 0x5c, 0x0a,\n\t0x09, 0x42, 0x79, 0x42, 0x42, 0x32, 0x72, 0x68, 0x49, 0x2b, 0x6a, 0x55, 0x32, 0x41, 0x41, 0x6d, 0x43, 0x5a, \n\t0x4a, 0x70, 0x42, 0x62, 0x36, 0x43, 0x4e, 0x61, 0x72, 0x37, 0x79, 0x75, 0x78, 0x30, 0x64, 0x4a, 0x43, 0x71, \n\t0x2f, 0x6f, 0x69, 0x36, 0x4b, 0x69, 0x36, 0x65, 0x64, 0x66, 0x4e, 0x48, 0x78, 0x55, 0x46, 0x31, 0x41, 0x53, \n\t0x47, 0x4c, 0x70, 0x72, 0x31, 0x37, 0x4e, 0x35, 0x2f, 0x36, 0x2f, 0x6c, 0x42, 0x67, 0x58, 0x4b, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x36, 0x77, 0x42, 0x6f, 0x7a, 0x58, 0x70, 0x6b, 0x58, 0x43, 0x31, 0x56, 0x30, 0x75, 0x33, 0x53, 0x36, \n\t0x2f, 0x39, 0x6c, 0x56, 0x5a, 0x45, 0x44, 0x6b, 0x4e, 0x34, 0x71, 0x47, 0x58, 0x47, 0x43, 0x62, 0x44, 0x41, \n\t0x69, 0x6c, 0x64, 0x38, 0x75, 0x44, 0x41, 0x42, 0x2f, 0x39, 0x30, 0x45, 0x52, 0x79, 0x79, 0x31, 0x49, 0x50, \n\t0x78, 0x49, 0x61, 0x66, 0x68, 0x65, 0x75, 0x51, 0x4b, 0x44, 0x39, 0x37, 0x7a, 0x38, 0x6e, 0x48, 0x49, 0x5c, 0x0a,\n\t0x09, 0x70, 0x34, 0x37, 0x73, 0x5a, 0x35, 0x6b, 0x74, 0x4b, 0x57, 0x41, 0x51, 0x55, 0x68, 0x55, 0x6a, 0x79, \n\t0x51, 0x51, 0x52, 0x74, 0x78, 0x36, 0x2b, 0x6b, 0x5a, 0x51, 0x55, 0x4c, 0x66, 0x2f, 0x31, 0x70, 0x49, 0x54, \n\t0x45, 0x61, 0x45, 0x4d, 0x4c, 0x6a, 0x43, 0x61, 0x50, 0x71, 0x48, 0x4e, 0x41, 0x46, 0x41, 0x38, 0x46, 0x47, \n\t0x62, 0x31, 0x49, 0x4e, 0x49, 0x45, 0x62, 0x61, 0x7a, 0x2b, 0x54, 0x4d, 0x52, 0x4e, 0x68, 0x73, 0x78, 0x5c, 0x0a,\n\t0x09, 0x35, 0x52, 0x55, 0x48, 0x48, 0x62, 0x71, 0x6e, 0x5a, 0x69, 0x6f, 0x6c, 0x50, 0x6a, 0x32, 0x6b, 0x6e, \n\t0x53, 0x4f, 0x6d, 0x52, 0x5a, 0x70, 0x42, 0x63, 0x64, 0x4d, 0x51, 0x4a, 0x58, 0x2f, 0x38, 0x32, 0x51, 0x55, \n\t0x57, 0x33, 0x56, 0x71, 0x2f, 0x6a, 0x45, 0x46, 0x75, 0x64, 0x48, 0x4c, 0x69, 0x49, 0x6c, 0x6c, 0x35, 0x53, \n\t0x61, 0x57, 0x37, 0x4c, 0x56, 0x6b, 0x53, 0x31, 0x61, 0x70, 0x45, 0x59, 0x6a, 0x74, 0x54, 0x57, 0x78, 0x5c, 0x0a,\n\t0x09, 0x53, 0x50, 0x48, 0x50, 0x4e, 0x57, 0x57, 0x6b, 0x74, 0x70, 0x52, 0x72, 0x4d, 0x33, 0x4e, 0x5a, 0x39, \n\t0x6b, 0x68, 0x74, 0x54, 0x6e, 0x4c, 0x41, 0x55, 0x6a, 0x32, 0x58, 0x78, 0x4f, 0x53, 0x71, 0x54, 0x6d, 0x43, \n\t0x47, 0x66, 0x4f, 0x42, 0x59, 0x46, 0x6b, 0x6c, 0x61, 0x6e, 0x5a, 0x44, 0x46, 0x50, 0x76, 0x56, 0x6b, 0x37, \n\t0x42, 0x6c, 0x71, 0x39, 0x38, 0x49, 0x74, 0x45, 0x70, 0x56, 0x39, 0x30, 0x62, 0x49, 0x53, 0x6a, 0x57, 0x5c, 0x0a,\n\t0x09, 0x43, 0x35, 0x74, 0x35, 0x4b, 0x59, 0x57, 0x69, 0x76, 0x63, 0x77, 0x55, 0x34, 0x2b, 0x76, 0x68, 0x32, \n\t0x49, 0x6e, 0x6d, 0x2b, 0x59, 0x36, 0x78, 0x5a, 0x41, 0x45, 0x72, 0x2b, 0x30, 0x30, 0x4b, 0x7a, 0x43, 0x70, \n\t0x31, 0x58, 0x2f, 0x38, 0x32, 0x61, 0x31, 0x72, 0x65, 0x4d, 0x38, 0x79, 0x49, 0x2b, 0x2b, 0x74, 0x77, 0x73, \n\t0x67, 0x70, 0x51, 0x62, 0x4f, 0x4f, 0x59, 0x62, 0x38, 0x30, 0x39, 0x4d, 0x4e, 0x52, 0x68, 0x6a, 0x51, 0x5c, 0x0a,\n\t0x09, 0x41, 0x6b, 0x68, 0x36, 0x4c, 0x69, 0x6b, 0x6b, 0x63, 0x66, 0x64, 0x2b, 0x77, 0x37, 0x58, 0x35, 0x6d, \n\t0x69, 0x74, 0x54, 0x48, 0x2b, 0x64, 0x71, 0x55, 0x32, 0x52, 0x70, 0x78, 0x61, 0x72, 0x69, 0x49, 0x46, 0x42, \n\t0x44, 0x2f, 0x74, 0x56, 0x6b, 0x72, 0x78, 0x46, 0x49, 0x75, 0x72, 0x2f, 0x49, 0x6b, 0x79, 0x6e, 0x33, 0x78, \n\t0x72, 0x62, 0x37, 0x6f, 0x4f, 0x48, 0x62, 0x78, 0x6b, 0x34, 0x36, 0x74, 0x6e, 0x57, 0x49, 0x4b, 0x45, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x45, 0x77, 0x4d, 0x70, 0x53, 0x70, 0x38, 0x55, 0x72, 0x56, 0x6b, 0x31, 0x65, 0x72, 0x2b, 0x48, \n\t0x51, 0x58, 0x6f, 0x47, 0x6b, 0x2f, 0x6c, 0x55, 0x51, 0x53, 0x43, 0x78, 0x32, 0x71, 0x6f, 0x63, 0x51, 0x72, \n\t0x43, 0x63, 0x51, 0x62, 0x4d, 0x4c, 0x6a, 0x50, 0x6c, 0x71, 0x41, 0x49, 0x62, 0x51, 0x44, 0x57, 0x4a, 0x4e, \n\t0x30, 0x56, 0x34, 0x54, 0x67, 0x6a, 0x4f, 0x63, 0x46, 0x53, 0x52, 0x38, 0x37, 0x73, 0x68, 0x32, 0x51, 0x5c, 0x0a,\n\t0x09, 0x48, 0x46, 0x48, 0x46, 0x64, 0x6f, 0x68, 0x6c, 0x6b, 0x53, 0x52, 0x49, 0x4b, 0x74, 0x73, 0x64, 0x61, \n\t0x68, 0x50, 0x35, 0x32, 0x5a, 0x50, 0x32, 0x47, 0x54, 0x46, 0x52, 0x6e, 0x50, 0x46, 0x4f, 0x54, 0x45, 0x6d, \n\t0x71, 0x4a, 0x76, 0x77, 0x4c, 0x72, 0x53, 0x32, 0x7a, 0x52, 0x4f, 0x49, 0x6a, 0x46, 0x34, 0x61, 0x50, 0x72, \n\t0x47, 0x51, 0x54, 0x4d, 0x6d, 0x2f, 0x4d, 0x42, 0x64, 0x48, 0x4d, 0x76, 0x36, 0x31, 0x68, 0x38, 0x38, 0x5c, 0x0a,\n\t0x09, 0x51, 0x76, 0x4d, 0x64, 0x78, 0x5a, 0x5a, 0x4b, 0x35, 0x4e, 0x6b, 0x46, 0x6a, 0x61, 0x6e, 0x53, 0x53, \n\t0x61, 0x46, 0x6c, 0x52, 0x79, 0x73, 0x59, 0x73, 0x67, 0x41, 0x55, 0x32, 0x30, 0x31, 0x36, 0x55, 0x6d, 0x43, \n\t0x61, 0x50, 0x50, 0x4e, 0x6f, 0x50, 0x30, 0x4c, 0x4a, 0x44, 0x43, 0x6e, 0x56, 0x67, 0x38, 0x6a, 0x77, 0x62, \n\t0x67, 0x72, 0x36, 0x4d, 0x69, 0x48, 0x74, 0x62, 0x64, 0x30, 0x78, 0x50, 0x41, 0x49, 0x58, 0x41, 0x57, 0x5c, 0x0a,\n\t0x09, 0x55, 0x2f, 0x42, 0x57, 0x4f, 0x75, 0x41, 0x65, 0x48, 0x50, 0x43, 0x42, 0x39, 0x59, 0x73, 0x66, 0x68, \n\t0x46, 0x51, 0x48, 0x69, 0x52, 0x6a, 0x7a, 0x2b, 0x6b, 0x55, 0x5a, 0x5a, 0x79, 0x71, 0x62, 0x4c, 0x67, 0x68, \n\t0x59, 0x62, 0x57, 0x31, 0x5a, 0x46, 0x6b, 0x6b, 0x48, 0x7a, 0x4b, 0x72, 0x4b, 0x47, 0x2b, 0x66, 0x6f, 0x62, \n\t0x70, 0x4a, 0x74, 0x46, 0x36, 0x69, 0x70, 0x32, 0x74, 0x6d, 0x4c, 0x6f, 0x33, 0x4a, 0x44, 0x68, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x39, 0x78, 0x6c, 0x4a, 0x6d, 0x36, 0x74, 0x2b, 0x65, 0x42, 0x37, 0x77, 0x4f, 0x51, 0x49, 0x46, 0x6c, \n\t0x6a, 0x4d, 0x38, 0x42, 0x4b, 0x67, 0x4a, 0x51, 0x32, 0x4d, 0x79, 0x4f, 0x4a, 0x6c, 0x4b, 0x76, 0x2b, 0x65, \n\t0x67, 0x52, 0x6e, 0x62, 0x51, 0x44, 0x68, 0x31, 0x71, 0x5a, 0x36, 0x56, 0x77, 0x69, 0x33, 0x45, 0x35, 0x6a, \n\t0x64, 0x52, 0x73, 0x43, 0x35, 0x32, 0x30, 0x48, 0x72, 0x78, 0x49, 0x41, 0x4b, 0x63, 0x51, 0x32, 0x41, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x49, 0x62, 0x5a, 0x4f, 0x61, 0x52, 0x45, 0x64, 0x5a, 0x36, 0x59, 0x6e, 0x52, 0x30, 0x54, 0x31, \n\t0x32, 0x62, 0x6e, 0x6b, 0x6d, 0x54, 0x6a, 0x4c, 0x4d, 0x68, 0x4d, 0x64, 0x39, 0x54, 0x57, 0x35, 0x73, 0x63, \n\t0x78, 0x6a, 0x51, 0x36, 0x55, 0x6b, 0x7a, 0x4c, 0x71, 0x62, 0x47, 0x4a, 0x57, 0x79, 0x4e, 0x43, 0x6f, 0x35, \n\t0x68, 0x76, 0x75, 0x54, 0x5a, 0x33, 0x4c, 0x5a, 0x6a, 0x69, 0x4b, 0x61, 0x32, 0x69, 0x48, 0x34, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x66, 0x35, 0x6e, 0x56, 0x6e, 0x68, 0x35, 0x6d, 0x2f, 0x44, 0x72, 0x73, 0x61, 0x6e, 0x68, 0x4d, \n\t0x6b, 0x4f, 0x79, 0x59, 0x67, 0x44, 0x63, 0x44, 0x6f, 0x47, 0x6b, 0x69, 0x36, 0x6d, 0x30, 0x55, 0x33, 0x4e, \n\t0x59, 0x4d, 0x31, 0x6e, 0x53, 0x71, 0x65, 0x4d, 0x34, 0x4e, 0x56, 0x39, 0x36, 0x6b, 0x51, 0x77, 0x69, 0x33, \n\t0x6f, 0x74, 0x6a, 0x59, 0x48, 0x6b, 0x64, 0x56, 0x5a, 0x50, 0x77, 0x6e, 0x77, 0x2b, 0x41, 0x34, 0x43, 0x5c, 0x0a,\n\t0x09, 0x78, 0x79, 0x2b, 0x6a, 0x73, 0x43, 0x52, 0x6a, 0x48, 0x4c, 0x48, 0x66, 0x50, 0x45, 0x6c, 0x67, 0x4e, \n\t0x38, 0x61, 0x78, 0x5a, 0x78, 0x78, 0x43, 0x6f, 0x62, 0x4b, 0x56, 0x51, 0x47, 0x32, 0x72, 0x43, 0x37, 0x55, \n\t0x37, 0x30, 0x55, 0x4b, 0x4e, 0x6f, 0x63, 0x76, 0x62, 0x46, 0x2b, 0x4f, 0x6d, 0x63, 0x66, 0x78, 0x78, 0x44, \n\t0x4f, 0x4d, 0x36, 0x68, 0x50, 0x76, 0x44, 0x36, 0x41, 0x71, 0x48, 0x51, 0x2b, 0x34, 0x4f, 0x53, 0x54, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x30, 0x67, 0x33, 0x55, 0x61, 0x61, 0x70, 0x55, 0x4b, 0x4a, 0x77, 0x4d, 0x6b, 0x71, 0x74, 0x58, \n\t0x6d, 0x66, 0x47, 0x6e, 0x46, 0x48, 0x4b, 0x75, 0x4a, 0x68, 0x4a, 0x72, 0x77, 0x38, 0x46, 0x53, 0x42, 0x61, \n\t0x31, 0x31, 0x31, 0x4c, 0x53, 0x57, 0x34, 0x4c, 0x70, 0x76, 0x56, 0x66, 0x4f, 0x58, 0x53, 0x71, 0x4e, 0x36, \n\t0x6d, 0x56, 0x6f, 0x6b, 0x74, 0x45, 0x53, 0x47, 0x48, 0x74, 0x42, 0x49, 0x54, 0x48, 0x57, 0x56, 0x57, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x39, 0x73, 0x45, 0x79, 0x58, 0x41, 0x6c, 0x4b, 0x55, 0x41, 0x59, 0x73, 0x55, 0x30, 0x62, 0x49, \n\t0x45, 0x46, 0x36, 0x4d, 0x6c, 0x4b, 0x42, 0x42, 0x41, 0x68, 0x4d, 0x38, 0x4b, 0x77, 0x50, 0x34, 0x54, 0x59, \n\t0x66, 0x36, 0x43, 0x51, 0x43, 0x4d, 0x38, 0x30, 0x6d, 0x42, 0x32, 0x35, 0x73, 0x61, 0x5a, 0x36, 0x5a, 0x49, \n\t0x72, 0x42, 0x6a, 0x46, 0x6d, 0x44, 0x54, 0x4e, 0x45, 0x47, 0x49, 0x30, 0x73, 0x39, 0x6c, 0x72, 0x65, 0x5c, 0x0a,\n\t0x09, 0x51, 0x2b, 0x2b, 0x79, 0x67, 0x5a, 0x34, 0x6b, 0x51, 0x57, 0x43, 0x74, 0x38, 0x54, 0x54, 0x72, 0x76, \n\t0x5a, 0x79, 0x64, 0x55, 0x53, 0x51, 0x72, 0x59, 0x59, 0x72, 0x64, 0x61, 0x52, 0x64, 0x66, 0x43, 0x4f, 0x71, \n\t0x4c, 0x59, 0x77, 0x6a, 0x32, 0x30, 0x59, 0x61, 0x38, 0x32, 0x74, 0x5a, 0x4b, 0x51, 0x41, 0x79, 0x52, 0x45, \n\t0x57, 0x69, 0x61, 0x61, 0x34, 0x4a, 0x4b, 0x6f, 0x43, 0x61, 0x78, 0x55, 0x77, 0x36, 0x38, 0x47, 0x31, 0x5c, 0x0a,\n\t0x09, 0x31, 0x6a, 0x34, 0x58, 0x57, 0x54, 0x45, 0x4a, 0x72, 0x6c, 0x4e, 0x57, 0x46, 0x79, 0x31, 0x75, 0x6b, \n\t0x6f, 0x76, 0x69, 0x34, 0x49, 0x42, 0x57, 0x49, 0x44, 0x72, 0x51, 0x59, 0x49, 0x51, 0x55, 0x41, 0x5a, 0x4b, \n\t0x57, 0x55, 0x43, 0x73, 0x4b, 0x70, 0x49, 0x79, 0x73, 0x64, 0x72, 0x6a, 0x5a, 0x42, 0x2f, 0x2f, 0x68, 0x57, \n\t0x58, 0x52, 0x4e, 0x50, 0x72, 0x53, 0x36, 0x48, 0x49, 0x63, 0x57, 0x61, 0x4e, 0x39, 0x70, 0x67, 0x49, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x62, 0x36, 0x50, 0x6c, 0x4f, 0x58, 0x30, 0x6b, 0x35, 0x69, 0x78, 0x57, 0x33, 0x74, 0x63, 0x2b, \n\t0x6d, 0x64, 0x51, 0x7a, 0x55, 0x6e, 0x33, 0x58, 0x35, 0x47, 0x6b, 0x34, 0x35, 0x55, 0x48, 0x37, 0x2b, 0x54, \n\t0x41, 0x73, 0x67, 0x30, 0x64, 0x69, 0x74, 0x45, 0x44, 0x4d, 0x5a, 0x47, 0x62, 0x75, 0x32, 0x65, 0x70, 0x79, \n\t0x74, 0x6a, 0x72, 0x52, 0x49, 0x47, 0x6c, 0x67, 0x73, 0x45, 0x47, 0x63, 0x41, 0x4b, 0x55, 0x76, 0x45, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x36, 0x39, 0x71, 0x62, 0x64, 0x58, 0x59, 0x43, 0x6f, 0x56, 0x57, 0x46, 0x70, 0x47, 0x4e, 0x74, \n\t0x45, 0x62, 0x5a, 0x34, 0x42, 0x52, 0x30, 0x65, 0x53, 0x73, 0x51, 0x37, 0x52, 0x74, 0x39, 0x69, 0x70, 0x32, \n\t0x66, 0x55, 0x61, 0x38, 0x37, 0x42, 0x55, 0x6d, 0x58, 0x68, 0x41, 0x41, 0x55, 0x4a, 0x6d, 0x71, 0x72, 0x33, \n\t0x37, 0x30, 0x62, 0x67, 0x69, 0x65, 0x72, 0x30, 0x4f, 0x34, 0x79, 0x69, 0x73, 0x2f, 0x31, 0x38, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x56, 0x4e, 0x6c, 0x48, 0x78, 0x4f, 0x35, 0x31, 0x4d, 0x52, 0x2b, 0x41, 0x2b, 0x55, 0x45, 0x4b, 0x4a, \n\t0x71, 0x69, 0x7a, 0x4e, 0x72, 0x53, 0x35, 0x42, 0x34, 0x4d, 0x35, 0x51, 0x43, 0x4b, 0x54, 0x36, 0x58, 0x44, \n\t0x51, 0x78, 0x4c, 0x48, 0x43, 0x58, 0x2b, 0x6c, 0x34, 0x54, 0x7a, 0x48, 0x4a, 0x4b, 0x57, 0x43, 0x75, 0x43, \n\t0x70, 0x67, 0x37, 0x6f, 0x63, 0x4d, 0x30, 0x6b, 0x42, 0x78, 0x68, 0x4b, 0x4e, 0x4a, 0x61, 0x6b, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x30, 0x42, 0x71, 0x49, 0x6c, 0x54, 0x56, 0x6a, 0x45, 0x49, 0x57, 0x37, 0x32, 0x44, 0x50, 0x66, 0x72, \n\t0x78, 0x57, 0x49, 0x39, 0x6a, 0x66, 0x63, 0x6d, 0x4a, 0x34, 0x34, 0x70, 0x44, 0x6c, 0x41, 0x67, 0x68, 0x77, \n\t0x67, 0x64, 0x55, 0x45, 0x64, 0x53, 0x58, 0x65, 0x47, 0x48, 0x51, 0x48, 0x55, 0x79, 0x34, 0x56, 0x5a, 0x4a, \n\t0x56, 0x72, 0x46, 0x2b, 0x36, 0x30, 0x34, 0x72, 0x59, 0x4d, 0x55, 0x46, 0x62, 0x34, 0x76, 0x59, 0x68, 0x5c, 0x0a,\n\t0x09, 0x39, 0x65, 0x31, 0x56, 0x63, 0x67, 0x55, 0x54, 0x46, 0x42, 0x6e, 0x36, 0x35, 0x36, 0x35, 0x42, 0x62, \n\t0x48, 0x4e, 0x2b, 0x4f, 0x68, 0x71, 0x49, 0x70, 0x50, 0x34, 0x69, 0x70, 0x2b, 0x71, 0x4c, 0x6b, 0x78, 0x62, \n\t0x73, 0x31, 0x71, 0x73, 0x6d, 0x7a, 0x4b, 0x36, 0x6f, 0x65, 0x2f, 0x54, 0x32, 0x36, 0x49, 0x38, 0x50, 0x77, \n\t0x6c, 0x6f, 0x6d, 0x5a, 0x50, 0x32, 0x67, 0x4e, 0x4a, 0x6c, 0x58, 0x64, 0x75, 0x6b, 0x49, 0x67, 0x47, 0x5c, 0x0a,\n\t0x09, 0x55, 0x67, 0x66, 0x71, 0x53, 0x41, 0x2f, 0x6d, 0x7a, 0x65, 0x49, 0x73, 0x44, 0x63, 0x51, 0x41, 0x2b, \n\t0x45, 0x62, 0x46, 0x6f, 0x78, 0x32, 0x51, 0x41, 0x75, 0x30, 0x7a, 0x31, 0x47, 0x4e, 0x53, 0x6f, 0x6a, 0x5a, \n\t0x71, 0x57, 0x53, 0x53, 0x51, 0x37, 0x71, 0x78, 0x6b, 0x31, 0x65, 0x4b, 0x6f, 0x56, 0x63, 0x30, 0x76, 0x6d, \n\t0x61, 0x2b, 0x6a, 0x4a, 0x69, 0x53, 0x36, 0x6f, 0x42, 0x56, 0x4c, 0x4e, 0x42, 0x77, 0x6c, 0x37, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x54, 0x43, 0x73, 0x30, 0x46, 0x4b, 0x4a, 0x42, 0x67, 0x37, 0x41, 0x41, 0x6e, 0x53, 0x31, 0x4a, 0x45, \n\t0x6b, 0x41, 0x56, 0x6b, 0x6a, 0x6b, 0x4d, 0x69, 0x77, 0x42, 0x38, 0x35, 0x2b, 0x5a, 0x51, 0x67, 0x33, 0x31, \n\t0x66, 0x6f, 0x58, 0x48, 0x71, 0x79, 0x35, 0x65, 0x55, 0x66, 0x35, 0x55, 0x44, 0x71, 0x36, 0x6e, 0x74, 0x34, \n\t0x38, 0x30, 0x6c, 0x41, 0x64, 0x32, 0x63, 0x67, 0x69, 0x61, 0x53, 0x33, 0x2f, 0x7a, 0x4b, 0x49, 0x37, 0x5c, 0x0a,\n\t0x09, 0x39, 0x57, 0x54, 0x78, 0x47, 0x71, 0x33, 0x33, 0x30, 0x72, 0x6f, 0x77, 0x4b, 0x30, 0x58, 0x30, 0x61, \n\t0x6a, 0x36, 0x78, 0x34, 0x43, 0x72, 0x70, 0x7a, 0x37, 0x73, 0x6c, 0x69, 0x4d, 0x61, 0x69, 0x4f, 0x4d, 0x58, \n\t0x52, 0x63, 0x6a, 0x34, 0x4b, 0x70, 0x4e, 0x52, 0x38, 0x45, 0x62, 0x48, 0x6d, 0x37, 0x74, 0x44, 0x4b, 0x47, \n\t0x33, 0x4b, 0x41, 0x56, 0x4a, 0x44, 0x4d, 0x74, 0x6e, 0x54, 0x69, 0x4f, 0x4e, 0x52, 0x76, 0x6e, 0x38, 0x5c, 0x0a,\n\t0x09, 0x53, 0x67, 0x75, 0x6a, 0x37, 0x6e, 0x77, 0x50, 0x44, 0x78, 0x70, 0x42, 0x5a, 0x67, 0x6a, 0x57, 0x77, \n\t0x68, 0x79, 0x33, 0x61, 0x48, 0x34, 0x4f, 0x34, 0x58, 0x34, 0x4c, 0x34, 0x32, 0x6e, 0x6d, 0x52, 0x62, 0x36, \n\t0x73, 0x67, 0x30, 0x6b, 0x49, 0x67, 0x4a, 0x45, 0x6d, 0x75, 0x69, 0x43, 0x55, 0x4d, 0x5a, 0x61, 0x4f, 0x73, \n\t0x31, 0x4d, 0x79, 0x30, 0x42, 0x71, 0x57, 0x70, 0x6f, 0x64, 0x76, 0x4e, 0x4a, 0x57, 0x6b, 0x34, 0x70, 0x5c, 0x0a,\n\t0x09, 0x61, 0x6e, 0x79, 0x6d, 0x51, 0x2f, 0x6b, 0x68, 0x6f, 0x6d, 0x77, 0x51, 0x7a, 0x37, 0x6a, 0x46, 0x6d, \n\t0x78, 0x42, 0x71, 0x67, 0x67, 0x54, 0x4e, 0x51, 0x4d, 0x70, 0x6f, 0x5a, 0x32, 0x73, 0x4c, 0x4a, 0x48, 0x73, \n\t0x4b, 0x54, 0x55, 0x69, 0x52, 0x32, 0x57, 0x72, 0x48, 0x50, 0x54, 0x62, 0x42, 0x7a, 0x6b, 0x49, 0x49, 0x4e, \n\t0x38, 0x35, 0x43, 0x73, 0x42, 0x5a, 0x72, 0x61, 0x4e, 0x76, 0x39, 0x48, 0x50, 0x33, 0x6c, 0x32, 0x38, 0x5c, 0x0a,\n\t0x09, 0x62, 0x45, 0x65, 0x4a, 0x4b, 0x6c, 0x6f, 0x78, 0x43, 0x57, 0x70, 0x56, 0x54, 0x6b, 0x68, 0x4d, 0x5a, \n\t0x43, 0x41, 0x5a, 0x45, 0x78, 0x43, 0x47, 0x6c, 0x52, 0x4d, 0x74, 0x75, 0x55, 0x58, 0x46, 0x4b, 0x6f, 0x53, \n\t0x55, 0x68, 0x6b, 0x6b, 0x6c, 0x64, 0x55, 0x2f, 0x61, 0x57, 0x6f, 0x6a, 0x65, 0x69, 0x67, 0x41, 0x4b, 0x51, \n\t0x2b, 0x46, 0x4e, 0x73, 0x43, 0x36, 0x54, 0x45, 0x53, 0x7a, 0x5a, 0x37, 0x62, 0x71, 0x31, 0x48, 0x62, 0x5c, 0x0a,\n\t0x09, 0x47, 0x63, 0x51, 0x67, 0x67, 0x51, 0x55, 0x53, 0x4e, 0x4d, 0x68, 0x67, 0x64, 0x78, 0x45, 0x6b, 0x4f, \n\t0x2b, 0x2b, 0x6b, 0x78, 0x31, 0x54, 0x36, 0x63, 0x64, 0x78, 0x33, 0x56, 0x67, 0x79, 0x42, 0x73, 0x7a, 0x2f, \n\t0x57, 0x4b, 0x6e, 0x79, 0x73, 0x38, 0x6b, 0x2f, 0x35, 0x51, 0x48, 0x64, 0x68, 0x37, 0x46, 0x42, 0x6a, 0x34, \n\t0x30, 0x74, 0x6a, 0x41, 0x42, 0x35, 0x51, 0x63, 0x58, 0x55, 0x31, 0x72, 0x4b, 0x70, 0x76, 0x38, 0x76, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x78, 0x52, 0x46, 0x6f, 0x4d, 0x41, 0x42, 0x71, 0x50, 0x69, 0x4b, 0x36, 0x35, 0x4b, 0x41, 0x77, \n\t0x33, 0x68, 0x31, 0x5a, 0x54, 0x50, 0x6b, 0x53, 0x30, 0x6d, 0x59, 0x6b, 0x75, 0x53, 0x68, 0x30, 0x4a, 0x56, \n\t0x6c, 0x4e, 0x4b, 0x61, 0x68, 0x34, 0x39, 0x74, 0x6b, 0x6a, 0x67, 0x70, 0x75, 0x53, 0x51, 0x39, 0x4a, 0x5a, \n\t0x2f, 0x56, 0x66, 0x53, 0x2b, 0x35, 0x72, 0x49, 0x6f, 0x70, 0x49, 0x72, 0x32, 0x77, 0x31, 0x6f, 0x73, 0x5c, 0x0a,\n\t0x09, 0x55, 0x36, 0x48, 0x74, 0x79, 0x47, 0x4e, 0x35, 0x56, 0x5a, 0x4c, 0x45, 0x58, 0x61, 0x4c, 0x30, 0x48, \n\t0x68, 0x49, 0x4e, 0x6d, 0x30, 0x4b, 0x61, 0x67, 0x4a, 0x52, 0x44, 0x5a, 0x70, 0x73, 0x50, 0x70, 0x4a, 0x51, \n\t0x41, 0x33, 0x4d, 0x35, 0x53, 0x73, 0x33, 0x68, 0x79, 0x4d, 0x54, 0x36, 0x6b, 0x4a, 0x5a, 0x37, 0x4d, 0x55, \n\t0x4a, 0x68, 0x6a, 0x52, 0x31, 0x49, 0x2f, 0x42, 0x50, 0x2f, 0x52, 0x47, 0x76, 0x68, 0x50, 0x31, 0x43, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x59, 0x63, 0x73, 0x63, 0x33, 0x69, 0x77, 0x6a, 0x47, 0x4e, 0x76, 0x67, 0x56, 0x42, 0x2b, 0x6e, \n\t0x57, 0x73, 0x49, 0x45, 0x36, 0x4d, 0x75, 0x70, 0x64, 0x55, 0x70, 0x54, 0x4d, 0x4e, 0x75, 0x57, 0x58, 0x72, \n\t0x34, 0x4a, 0x74, 0x2f, 0x5a, 0x6d, 0x48, 0x4a, 0x48, 0x5a, 0x74, 0x75, 0x71, 0x4b, 0x52, 0x65, 0x73, 0x6c, \n\t0x65, 0x48, 0x6e, 0x6f, 0x62, 0x6d, 0x6b, 0x70, 0x55, 0x30, 0x69, 0x43, 0x70, 0x36, 0x73, 0x7a, 0x68, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x69, 0x77, 0x68, 0x57, 0x68, 0x64, 0x41, 0x61, 0x69, 0x4b, 0x7a, 0x62, 0x62, 0x6d, 0x64, 0x72, \n\t0x56, 0x31, 0x31, 0x70, 0x4f, 0x64, 0x41, 0x36, 0x5a, 0x67, 0x4b, 0x77, 0x6c, 0x43, 0x42, 0x34, 0x4e, 0x6b, \n\t0x36, 0x42, 0x46, 0x73, 0x43, 0x6b, 0x64, 0x33, 0x65, 0x6a, 0x65, 0x66, 0x55, 0x74, 0x44, 0x59, 0x6c, 0x44, \n\t0x39, 0x2b, 0x48, 0x45, 0x59, 0x45, 0x7a, 0x52, 0x73, 0x42, 0x5a, 0x51, 0x72, 0x6a, 0x6f, 0x6a, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x65, 0x2b, 0x52, 0x6f, 0x4f, 0x51, 0x7a, 0x70, 0x58, 0x4d, 0x4e, 0x67, 0x4d, 0x6b, 0x6f, 0x76, 0x63, \n\t0x67, 0x63, 0x62, 0x52, 0x6b, 0x5a, 0x45, 0x6b, 0x30, 0x2f, 0x74, 0x71, 0x5a, 0x37, 0x61, 0x67, 0x5a, 0x70, \n\t0x47, 0x35, 0x71, 0x6a, 0x58, 0x67, 0x4e, 0x76, 0x4b, 0x62, 0x63, 0x57, 0x55, 0x73, 0x61, 0x36, 0x31, 0x6e, \n\t0x38, 0x54, 0x4b, 0x34, 0x73, 0x49, 0x37, 0x49, 0x41, 0x49, 0x39, 0x6c, 0x44, 0x39, 0x47, 0x76, 0x72, 0x5c, 0x0a,\n\t0x09, 0x46, 0x6b, 0x6a, 0x32, 0x67, 0x32, 0x77, 0x44, 0x70, 0x4e, 0x53, 0x61, 0x58, 0x4e, 0x70, 0x33, 0x61, \n\t0x35, 0x2b, 0x4a, 0x72, 0x39, 0x33, 0x6c, 0x4a, 0x56, 0x77, 0x39, 0x7a, 0x56, 0x70, 0x41, 0x2b, 0x6d, 0x69, \n\t0x32, 0x2b, 0x6d, 0x44, 0x70, 0x66, 0x53, 0x4f, 0x7a, 0x74, 0x5a, 0x4f, 0x53, 0x42, 0x4f, 0x4b, 0x75, 0x53, \n\t0x4a, 0x54, 0x6e, 0x6b, 0x6d, 0x4b, 0x51, 0x58, 0x4d, 0x32, 0x31, 0x4f, 0x5a, 0x71, 0x4c, 0x55, 0x30, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x4b, 0x47, 0x67, 0x66, 0x6b, 0x33, 0x43, 0x4c, 0x35, 0x79, 0x6b, 0x50, 0x73, 0x7a, 0x43, 0x32, \n\t0x50, 0x78, 0x59, 0x2f, 0x59, 0x6f, 0x63, 0x63, 0x46, 0x4a, 0x4c, 0x70, 0x70, 0x41, 0x6c, 0x54, 0x4a, 0x51, \n\t0x79, 0x4e, 0x58, 0x6b, 0x6a, 0x49, 0x55, 0x54, 0x4e, 0x6f, 0x49, 0x72, 0x66, 0x61, 0x78, 0x4a, 0x6a, 0x4c, \n\t0x62, 0x4f, 0x44, 0x73, 0x4f, 0x6b, 0x4e, 0x6b, 0x56, 0x4b, 0x61, 0x33, 0x50, 0x66, 0x30, 0x4f, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x37, 0x64, 0x77, 0x50, 0x51, 0x74, 0x70, 0x30, 0x79, 0x44, 0x39, 0x49, 0x55, 0x52, 0x6d, 0x30, 0x4e, \n\t0x65, 0x51, 0x66, 0x6a, 0x59, 0x65, 0x30, 0x34, 0x66, 0x75, 0x42, 0x41, 0x44, 0x6e, 0x55, 0x42, 0x74, 0x77, \n\t0x43, 0x62, 0x53, 0x77, 0x6b, 0x33, 0x6a, 0x57, 0x6f, 0x46, 0x6f, 0x38, 0x5a, 0x6f, 0x41, 0x59, 0x6b, 0x56, \n\t0x61, 0x74, 0x49, 0x4d, 0x32, 0x7a, 0x50, 0x44, 0x52, 0x46, 0x59, 0x45, 0x4b, 0x57, 0x44, 0x42, 0x44, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x42, 0x49, 0x75, 0x32, 0x44, 0x52, 0x44, 0x73, 0x41, 0x71, 0x55, 0x38, 0x48, 0x49, 0x57, 0x31, \n\t0x39, 0x37, 0x4d, 0x69, 0x69, 0x51, 0x41, 0x71, 0x6a, 0x76, 0x6d, 0x34, 0x30, 0x74, 0x50, 0x71, 0x35, 0x38, \n\t0x59, 0x47, 0x76, 0x41, 0x6a, 0x6b, 0x53, 0x69, 0x44, 0x59, 0x49, 0x4b, 0x65, 0x68, 0x61, 0x62, 0x47, 0x36, \n\t0x36, 0x74, 0x72, 0x55, 0x45, 0x45, 0x54, 0x57, 0x71, 0x64, 0x57, 0x6b, 0x67, 0x4f, 0x64, 0x30, 0x48, 0x5c, 0x0a,\n\t0x09, 0x43, 0x54, 0x6f, 0x41, 0x61, 0x54, 0x41, 0x49, 0x71, 0x51, 0x56, 0x53, 0x59, 0x49, 0x49, 0x55, 0x77, \n\t0x61, 0x57, 0x42, 0x78, 0x41, 0x58, 0x37, 0x79, 0x67, 0x6f, 0x46, 0x31, 0x67, 0x78, 0x4a, 0x33, 0x45, 0x57, \n\t0x75, 0x7a, 0x77, 0x38, 0x52, 0x46, 0x65, 0x6f, 0x31, 0x71, 0x6b, 0x52, 0x6c, 0x6a, 0x55, 0x43, 0x43, 0x46, \n\t0x4a, 0x41, 0x6f, 0x74, 0x41, 0x78, 0x53, 0x73, 0x6b, 0x65, 0x77, 0x39, 0x51, 0x76, 0x73, 0x4f, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x68, 0x35, 0x42, 0x69, 0x47, 0x46, 0x31, 0x6b, 0x44, 0x71, 0x6d, 0x30, 0x46, 0x49, 0x61, 0x54, 0x7a, \n\t0x51, 0x6c, 0x6a, 0x5a, 0x4f, 0x45, 0x6f, 0x39, 0x31, 0x6f, 0x78, 0x34, 0x6c, 0x66, 0x74, 0x79, 0x62, 0x4a, \n\t0x4f, 0x70, 0x39, 0x71, 0x79, 0x78, 0x59, 0x54, 0x66, 0x33, 0x4b, 0x6e, 0x6d, 0x7a, 0x42, 0x45, 0x70, 0x47, \n\t0x6e, 0x6c, 0x47, 0x43, 0x62, 0x45, 0x70, 0x49, 0x4e, 0x45, 0x6d, 0x6a, 0x64, 0x6a, 0x58, 0x57, 0x51, 0x5c, 0x0a,\n\t0x09, 0x43, 0x4d, 0x6b, 0x47, 0x4b, 0x53, 0x4e, 0x75, 0x6f, 0x6f, 0x54, 0x4d, 0x44, 0x55, 0x6a, 0x51, 0x79, \n\t0x69, 0x43, 0x6b, 0x54, 0x70, 0x38, 0x4e, 0x51, 0x74, 0x72, 0x71, 0x46, 0x4f, 0x31, 0x2b, 0x33, 0x48, 0x31, \n\t0x62, 0x77, 0x68, 0x53, 0x44, 0x46, 0x4d, 0x59, 0x75, 0x54, 0x49, 0x45, 0x55, 0x67, 0x61, 0x55, 0x73, 0x47, \n\t0x4c, 0x51, 0x43, 0x45, 0x54, 0x77, 0x6c, 0x32, 0x6c, 0x42, 0x45, 0x4c, 0x55, 0x48, 0x63, 0x59, 0x77, 0x5c, 0x0a,\n\t0x09, 0x70, 0x49, 0x64, 0x69, 0x48, 0x6b, 0x41, 0x59, 0x6d, 0x32, 0x43, 0x4a, 0x4a, 0x74, 0x79, 0x6c, 0x4e, \n\t0x41, 0x53, 0x6e, 0x63, 0x66, 0x65, 0x38, 0x4d, 0x67, 0x70, 0x45, 0x36, 0x62, 0x67, 0x35, 0x42, 0x71, 0x66, \n\t0x64, 0x77, 0x4d, 0x6b, 0x41, 0x49, 0x35, 0x79, 0x6e, 0x38, 0x74, 0x37, 0x74, 0x4d, 0x57, 0x7a, 0x47, 0x72, \n\t0x33, 0x47, 0x4b, 0x35, 0x72, 0x78, 0x5a, 0x30, 0x39, 0x61, 0x53, 0x54, 0x39, 0x57, 0x4a, 0x35, 0x42, 0x5c, 0x0a,\n\t0x09, 0x31, 0x5a, 0x5a, 0x53, 0x51, 0x53, 0x4c, 0x64, 0x41, 0x38, 0x6b, 0x6f, 0x7a, 0x48, 0x53, 0x51, 0x75, \n\t0x6a, 0x70, 0x32, 0x5a, 0x47, 0x70, 0x74, 0x63, 0x37, 0x35, 0x50, 0x30, 0x61, 0x36, 0x4e, 0x32, 0x6d, 0x61, \n\t0x41, 0x46, 0x4d, 0x59, 0x31, 0x4e, 0x64, 0x42, 0x48, 0x39, 0x49, 0x38, 0x36, 0x73, 0x4c, 0x56, 0x6b, 0x69, \n\t0x52, 0x36, 0x4a, 0x65, 0x7a, 0x34, 0x36, 0x47, 0x6b, 0x67, 0x6b, 0x48, 0x53, 0x52, 0x69, 0x67, 0x51, 0x5c, 0x0a,\n\t0x09, 0x54, 0x64, 0x42, 0x49, 0x6b, 0x55, 0x43, 0x31, 0x4a, 0x58, 0x78, 0x6f, 0x37, 0x73, 0x34, 0x30, 0x46, \n\t0x49, 0x64, 0x5a, 0x43, 0x4d, 0x30, 0x55, 0x6c, 0x55, 0x4c, 0x31, 0x76, 0x64, 0x49, 0x73, 0x6c, 0x71, 0x50, \n\t0x6f, 0x41, 0x43, 0x36, 0x5a, 0x48, 0x57, 0x49, 0x49, 0x72, 0x38, 0x72, 0x75, 0x6f, 0x72, 0x31, 0x51, 0x41, \n\t0x6b, 0x73, 0x45, 0x41, 0x69, 0x54, 0x55, 0x41, 0x69, 0x6e, 0x59, 0x42, 0x45, 0x49, 0x4e, 0x6d, 0x39, 0x5c, 0x0a,\n\t0x09, 0x65, 0x6a, 0x41, 0x49, 0x61, 0x65, 0x63, 0x67, 0x30, 0x57, 0x53, 0x4d, 0x46, 0x48, 0x58, 0x52, 0x35, \n\t0x74, 0x2b, 0x31, 0x7a, 0x6e, 0x6e, 0x68, 0x6a, 0x73, 0x6e, 0x63, 0x45, 0x49, 0x32, 0x2b, 0x38, 0x33, 0x71, \n\t0x57, 0x6d, 0x52, 0x54, 0x39, 0x69, 0x30, 0x4c, 0x56, 0x35, 0x53, 0x55, 0x44, 0x4a, 0x4e, 0x6f, 0x4d, 0x4a, \n\t0x45, 0x69, 0x43, 0x52, 0x41, 0x73, 0x43, 0x61, 0x54, 0x41, 0x49, 0x71, 0x5a, 0x58, 0x41, 0x4c, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x49, 0x69, 0x4b, 0x5a, 0x43, 0x6f, 0x4e, 0x6a, 0x41, 0x70, 0x62, 0x2f, 0x65, 0x37, 0x4c, 0x37, 0x4d, \n\t0x4e, 0x73, 0x63, 0x46, 0x58, 0x50, 0x43, 0x53, 0x2b, 0x4b, 0x4e, 0x43, 0x43, 0x36, 0x68, 0x53, 0x51, 0x53, \n\t0x44, 0x4f, 0x51, 0x53, 0x50, 0x73, 0x67, 0x51, 0x61, 0x73, 0x67, 0x30, 0x61, 0x36, 0x42, 0x31, 0x4f, 0x37, \n\t0x4d, 0x32, 0x6c, 0x45, 0x4e, 0x4e, 0x6c, 0x48, 0x7a, 0x54, 0x42, 0x74, 0x77, 0x6f, 0x6b, 0x32, 0x51, 0x5c, 0x0a,\n\t0x09, 0x61, 0x46, 0x45, 0x67, 0x36, 0x53, 0x6b, 0x41, 0x7a, 0x59, 0x33, 0x78, 0x39, 0x34, 0x64, 0x74, 0x51, \n\t0x58, 0x53, 0x33, 0x2b, 0x41, 0x78, 0x66, 0x6e, 0x4b, 0x5a, 0x41, 0x53, 0x6f, 0x75, 0x52, 0x4e, 0x4a, 0x44, \n\t0x30, 0x58, 0x72, 0x4f, 0x35, 0x51, 0x45, 0x6f, 0x6b, 0x47, 0x4a, 0x4e, 0x35, 0x6b, 0x64, 0x77, 0x67, 0x52, \n\t0x54, 0x55, 0x32, 0x72, 0x5a, 0x6f, 0x4f, 0x4f, 0x54, 0x4c, 0x61, 0x50, 0x51, 0x41, 0x70, 0x66, 0x59, 0x5c, 0x0a,\n\t0x09, 0x70, 0x32, 0x65, 0x34, 0x72, 0x52, 0x75, 0x51, 0x59, 0x70, 0x6a, 0x45, 0x43, 0x69, 0x71, 0x75, 0x45, \n\t0x31, 0x39, 0x67, 0x7a, 0x74, 0x51, 0x77, 0x52, 0x42, 0x50, 0x58, 0x5a, 0x64, 0x52, 0x4d, 0x4b, 0x6b, 0x7a, \n\t0x4b, 0x38, 0x42, 0x6b, 0x72, 0x67, 0x59, 0x51, 0x70, 0x7a, 0x57, 0x51, 0x44, 0x4a, 0x63, 0x47, 0x4d, 0x6d, \n\t0x6f, 0x33, 0x67, 0x4f, 0x30, 0x50, 0x2b, 0x52, 0x66, 0x57, 0x74, 0x37, 0x4a, 0x72, 0x6d, 0x30, 0x56, 0x5c, 0x0a,\n\t0x09, 0x43, 0x42, 0x4a, 0x41, 0x43, 0x30, 0x50, 0x2b, 0x51, 0x63, 0x59, 0x55, 0x37, 0x58, 0x71, 0x2b, 0x71, \n\t0x6b, 0x43, 0x51, 0x6d, 0x73, 0x6c, 0x2b, 0x74, 0x50, 0x78, 0x52, 0x42, 0x46, 0x49, 0x30, 0x79, 0x45, 0x55, \n\t0x37, 0x45, 0x46, 0x46, 0x36, 0x6c, 0x34, 0x69, 0x4a, 0x70, 0x46, 0x6c, 0x54, 0x6c, 0x69, 0x68, 0x4b, 0x50, \n\t0x73, 0x61, 0x76, 0x61, 0x51, 0x52, 0x59, 0x69, 0x79, 0x42, 0x42, 0x49, 0x35, 0x42, 0x53, 0x6d, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x65, 0x4b, 0x47, 0x44, 0x76, 0x53, 0x41, 0x49, 0x6b, 0x55, 0x44, 0x31, 0x4b, 0x37, 0x59, 0x30, 0x64, \n\t0x61, 0x61, 0x59, 0x4a, 0x34, 0x58, 0x4b, 0x53, 0x55, 0x78, 0x47, 0x65, 0x37, 0x49, 0x4f, 0x57, 0x65, 0x6f, \n\t0x34, 0x31, 0x47, 0x4b, 0x51, 0x41, 0x35, 0x73, 0x7a, 0x62, 0x72, 0x4c, 0x2f, 0x52, 0x41, 0x4f, 0x35, 0x62, \n\t0x6f, 0x66, 0x76, 0x79, 0x45, 0x71, 0x67, 0x4b, 0x4a, 0x45, 0x44, 0x65, 0x47, 0x78, 0x77, 0x44, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x61, 0x52, 0x38, 0x6b, 0x6d, 0x43, 0x4f, 0x51, 0x6a, 0x45, 0x4c, 0x5a, 0x6d, 0x77, 0x63, 0x68, 0x62, \n\t0x51, 0x4a, 0x53, 0x4e, 0x48, 0x67, 0x45, 0x75, 0x64, 0x6b, 0x35, 0x65, 0x54, 0x4a, 0x6f, 0x47, 0x61, 0x4c, \n\t0x52, 0x64, 0x30, 0x32, 0x77, 0x70, 0x74, 0x30, 0x37, 0x2b, 0x64, 0x4d, 0x4b, 0x61, 0x68, 0x77, 0x47, 0x6f, \n\t0x74, 0x78, 0x5a, 0x42, 0x42, 0x4a, 0x70, 0x41, 0x6c, 0x4b, 0x7a, 0x47, 0x41, 0x6e, 0x61, 0x42, 0x77, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x36, 0x41, 0x43, 0x6d, 0x52, 0x6a, 0x63, 0x34, 0x36, 0x33, 0x69, 0x5a, 0x49, 0x55, 0x42, 0x52, \n\t0x49, 0x6b, 0x41, 0x46, 0x53, 0x7a, 0x36, 0x64, 0x6f, 0x76, 0x37, 0x6e, 0x52, 0x36, 0x63, 0x33, 0x6d, 0x39, \n\t0x68, 0x42, 0x6a, 0x46, 0x39, 0x64, 0x6e, 0x6f, 0x33, 0x6a, 0x49, 0x42, 0x4d, 0x6c, 0x70, 0x44, 0x42, 0x49, \n\t0x62, 0x32, 0x61, 0x73, 0x68, 0x53, 0x4b, 0x52, 0x39, 0x6b, 0x47, 0x67, 0x6a, 0x6b, 0x4b, 0x41, 0x46, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x45, 0x69, 0x54, 0x41, 0x44, 0x7a, 0x5a, 0x38, 0x4e, 0x72, 0x78, 0x6b, 0x48, 0x2b, 0x35, 0x51, \n\t0x58, 0x4c, 0x53, 0x51, 0x62, 0x4a, 0x64, 0x59, 0x50, 0x64, 0x42, 0x75, 0x72, 0x46, 0x39, 0x69, 0x43, 0x6a, \n\t0x63, 0x78, 0x44, 0x64, 0x2b, 0x44, 0x4a, 0x45, 0x4a, 0x45, 0x6d, 0x6b, 0x4d, 0x45, 0x71, 0x53, 0x44, 0x42, \n\t0x46, 0x30, 0x48, 0x79, 0x65, 0x6b, 0x63, 0x70, 0x4d, 0x79, 0x78, 0x49, 0x2f, 0x73, 0x41, 0x70, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x35, 0x50, 0x30, 0x58, 0x35, 0x4c, 0x4a, 0x35, 0x62, 0x6f, 0x78, 0x69, 0x68, 0x72, 0x7a, 0x57, 0x74, \n\t0x70, 0x73, 0x66, 0x55, 0x52, 0x49, 0x4c, 0x6b, 0x35, 0x51, 0x65, 0x70, 0x55, 0x48, 0x64, 0x6b, 0x42, 0x53, \n\t0x4b, 0x51, 0x62, 0x49, 0x45, 0x45, 0x78, 0x49, 0x50, 0x58, 0x6c, 0x49, 0x4b, 0x51, 0x4a, 0x6b, 0x42, 0x35, \n\t0x32, 0x56, 0x30, 0x39, 0x74, 0x62, 0x52, 0x75, 0x69, 0x30, 0x58, 0x4d, 0x6e, 0x4e, 0x76, 0x4b, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x49, 0x35, 0x58, 0x57, 0x69, 0x49, 0x4d, 0x68, 0x2b, 0x33, 0x36, 0x72, 0x6d, 0x43, 0x67, 0x58, 0x53, \n\t0x41, 0x54, 0x6d, 0x54, 0x47, 0x61, 0x37, 0x42, 0x36, 0x6f, 0x6a, 0x7a, 0x53, 0x78, 0x31, 0x74, 0x32, 0x57, \n\t0x32, 0x4d, 0x4e, 0x46, 0x4d, 0x59, 0x4a, 0x4a, 0x6e, 0x76, 0x72, 0x50, 0x72, 0x2b, 0x4e, 0x2f, 0x61, 0x62, \n\t0x6a, 0x6c, 0x6c, 0x45, 0x6b, 0x51, 0x67, 0x45, 0x51, 0x56, 0x4f, 0x41, 0x69, 0x51, 0x53, 0x42, 0x39, 0x5c, 0x0a,\n\t0x09, 0x39, 0x4e, 0x51, 0x59, 0x4c, 0x2b, 0x6c, 0x64, 0x6d, 0x32, 0x72, 0x49, 0x34, 0x6b, 0x65, 0x36, 0x49, \n\t0x36, 0x38, 0x74, 0x72, 0x4f, 0x49, 0x61, 0x4b, 0x43, 0x52, 0x46, 0x72, 0x66, 0x4c, 0x57, 0x43, 0x4a, 0x51, \n\t0x48, 0x4a, 0x4d, 0x6b, 0x4d, 0x41, 0x78, 0x45, 0x35, 0x4c, 0x71, 0x5a, 0x71, 0x33, 0x47, 0x32, 0x70, 0x36, \n\t0x72, 0x49, 0x79, 0x46, 0x62, 0x51, 0x6a, 0x49, 0x76, 0x5a, 0x4c, 0x61, 0x64, 0x71, 0x43, 0x4e, 0x54, 0x5c, 0x0a,\n\t0x09, 0x55, 0x77, 0x4b, 0x4e, 0x51, 0x45, 0x70, 0x4e, 0x39, 0x52, 0x5a, 0x69, 0x69, 0x61, 0x37, 0x6e, 0x4f, \n\t0x6c, 0x6e, 0x57, 0x6f, 0x75, 0x76, 0x58, 0x78, 0x46, 0x73, 0x63, 0x33, 0x66, 0x4a, 0x49, 0x6b, 0x42, 0x7a, \n\t0x48, 0x41, 0x73, 0x6d, 0x4e, 0x66, 0x35, 0x31, 0x46, 0x71, 0x79, 0x4e, 0x70, 0x7a, 0x67, 0x5a, 0x62, 0x49, \n\t0x37, 0x62, 0x70, 0x46, 0x33, 0x55, 0x6b, 0x39, 0x4c, 0x48, 0x4d, 0x4e, 0x74, 0x45, 0x38, 0x63, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x39, 0x37, 0x79, 0x76, 0x54, 0x57, 0x6a, 0x69, 0x45, 0x61, 0x50, 0x57, 0x2b, 0x43, 0x4b, 0x66, 0x78, \n\t0x76, 0x35, 0x34, 0x56, 0x55, 0x6d, 0x35, 0x59, 0x41, 0x4b, 0x57, 0x67, 0x30, 0x6b, 0x4d, 0x41, 0x43, 0x43, \n\t0x54, 0x51, 0x33, 0x56, 0x37, 0x51, 0x36, 0x73, 0x74, 0x39, 0x6b, 0x74, 0x6e, 0x76, 0x75, 0x46, 0x4f, 0x33, \n\t0x58, 0x35, 0x54, 0x41, 0x79, 0x75, 0x65, 0x65, 0x41, 0x2f, 0x53, 0x58, 0x2f, 0x4f, 0x7a, 0x73, 0x70, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x74, 0x63, 0x63, 0x4a, 0x4e, 0x63, 0x45, 0x79, 0x5a, 0x45, 0x67, 0x4b, 0x64, 0x63, 0x57, 0x70, \n\t0x51, 0x44, 0x63, 0x75, 0x56, 0x64, 0x48, 0x70, 0x73, 0x55, 0x45, 0x50, 0x5a, 0x66, 0x5a, 0x6b, 0x6e, 0x53, \n\t0x51, 0x37, 0x50, 0x76, 0x6f, 0x4c, 0x33, 0x58, 0x6b, 0x74, 0x55, 0x56, 0x43, 0x39, 0x41, 0x76, 0x2b, 0x6e, \n\t0x53, 0x79, 0x34, 0x35, 0x6f, 0x72, 0x5a, 0x42, 0x69, 0x41, 0x70, 0x61, 0x48, 0x53, 0x51, 0x6d, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x61, 0x65, 0x69, 0x36, 0x7a, 0x4a, 0x51, 0x4f, 0x5a, 0x62, 0x58, 0x4e, 0x52, 0x47, 0x2b, 0x73, \n\t0x46, 0x2f, 0x5a, 0x73, 0x69, 0x49, 0x57, 0x4b, 0x7a, 0x79, 0x32, 0x7a, 0x69, 0x6e, 0x59, 0x68, 0x71, 0x55, \n\t0x7a, 0x49, 0x4f, 0x53, 0x67, 0x4f, 0x4a, 0x64, 0x41, 0x5a, 0x53, 0x7a, 0x32, 0x53, 0x32, 0x42, 0x4f, 0x61, \n\t0x48, 0x7a, 0x48, 0x5a, 0x4f, 0x31, 0x5a, 0x48, 0x58, 0x75, 0x79, 0x2b, 0x61, 0x6e, 0x69, 0x6b, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x49, 0x6f, 0x79, 0x4c, 0x57, 0x4e, 0x72, 0x79, 0x61, 0x76, 0x35, 0x39, 0x4d, 0x7a, 0x73, 0x45, 0x50, \n\t0x44, 0x70, 0x49, 0x78, 0x49, 0x33, 0x6a, 0x49, 0x51, 0x36, 0x53, 0x59, 0x34, 0x49, 0x45, 0x54, 0x55, 0x42, \n\t0x71, 0x52, 0x78, 0x30, 0x5a, 0x75, 0x55, 0x62, 0x59, 0x67, 0x32, 0x57, 0x32, 0x75, 0x6a, 0x6f, 0x79, 0x44, \n\t0x30, 0x69, 0x46, 0x71, 0x69, 0x4f, 0x76, 0x7a, 0x6d, 0x6c, 0x67, 0x63, 0x6c, 0x73, 0x69, 0x74, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x77, 0x68, 0x49, 0x4e, 0x6f, 0x75, 0x76, 0x6c, 0x67, 0x48, 0x4b, 0x56, 0x71, 0x31, 0x4e, 0x6a, 0x55, \n\t0x64, 0x4a, 0x4f, 0x49, 0x4d, 0x31, 0x4a, 0x48, 0x39, 0x4c, 0x72, 0x4e, 0x4e, 0x74, 0x72, 0x4d, 0x56, 0x44, \n\t0x78, 0x46, 0x65, 0x31, 0x44, 0x57, 0x34, 0x6d, 0x65, 0x51, 0x61, 0x6b, 0x2b, 0x70, 0x6b, 0x6e, 0x44, 0x4e, \n\t0x53, 0x38, 0x45, 0x53, 0x76, 0x4d, 0x30, 0x44, 0x71, 0x70, 0x6a, 0x71, 0x79, 0x45, 0x55, 0x68, 0x37, 0x5c, 0x0a,\n\t0x09, 0x70, 0x44, 0x70, 0x53, 0x76, 0x34, 0x2b, 0x75, 0x79, 0x47, 0x7a, 0x2f, 0x34, 0x4a, 0x36, 0x36, 0x66, \n\t0x56, 0x33, 0x68, 0x45, 0x49, 0x32, 0x39, 0x65, 0x36, 0x4b, 0x4b, 0x46, 0x38, 0x56, 0x72, 0x61, 0x58, 0x54, \n\t0x33, 0x56, 0x73, 0x32, 0x4e, 0x4d, 0x57, 0x76, 0x6b, 0x78, 0x66, 0x44, 0x6b, 0x41, 0x55, 0x6d, 0x70, 0x49, \n\t0x7a, 0x4e, 0x41, 0x61, 0x6c, 0x6b, 0x64, 0x57, 0x61, 0x54, 0x4d, 0x4e, 0x6c, 0x4d, 0x64, 0x6d, 0x58, 0x5c, 0x0a,\n\t0x09, 0x66, 0x45, 0x6b, 0x54, 0x31, 0x43, 0x48, 0x58, 0x6c, 0x31, 0x43, 0x78, 0x36, 0x71, 0x4a, 0x58, 0x66, \n\t0x47, 0x6c, 0x70, 0x39, 0x77, 0x36, 0x65, 0x33, 0x75, 0x62, 0x61, 0x59, 0x6c, 0x59, 0x69, 0x43, 0x78, 0x73, \n\t0x5a, 0x4f, 0x6a, 0x48, 0x4a, 0x4a, 0x72, 0x71, 0x68, 0x38, 0x4e, 0x6b, 0x41, 0x71, 0x57, 0x32, 0x54, 0x5a, \n\t0x73, 0x73, 0x49, 0x56, 0x45, 0x32, 0x39, 0x75, 0x38, 0x6b, 0x4e, 0x6c, 0x32, 0x6f, 0x6f, 0x34, 0x30, 0x5c, 0x0a,\n\t0x09, 0x51, 0x48, 0x4c, 0x61, 0x42, 0x65, 0x6e, 0x4b, 0x62, 0x6b, 0x4c, 0x45, 0x43, 0x4a, 0x32, 0x6b, 0x67, \n\t0x53, 0x2b, 0x74, 0x55, 0x53, 0x6b, 0x47, 0x69, 0x55, 0x6b, 0x2b, 0x64, 0x4a, 0x43, 0x69, 0x46, 0x6e, 0x38, \n\t0x33, 0x4b, 0x76, 0x42, 0x59, 0x48, 0x56, 0x6d, 0x67, 0x7a, 0x48, 0x61, 0x67, 0x6a, 0x6b, 0x79, 0x43, 0x5a, \n\t0x4e, 0x78, 0x4c, 0x79, 0x7a, 0x4c, 0x62, 0x44, 0x58, 0x6a, 0x38, 0x6c, 0x71, 0x35, 0x42, 0x68, 0x43, 0x5c, 0x0a,\n\t0x09, 0x36, 0x4e, 0x4e, 0x65, 0x56, 0x66, 0x79, 0x76, 0x62, 0x44, 0x71, 0x55, 0x31, 0x59, 0x33, 0x74, 0x49, \n\t0x61, 0x38, 0x56, 0x56, 0x4d, 0x6f, 0x30, 0x51, 0x53, 0x73, 0x52, 0x49, 0x78, 0x39, 0x76, 0x74, 0x4b, 0x48, \n\t0x64, 0x6c, 0x41, 0x77, 0x64, 0x69, 0x61, 0x4f, 0x70, 0x49, 0x30, 0x4f, 0x41, 0x37, 0x7a, 0x54, 0x52, 0x33, \n\t0x35, 0x4d, 0x2f, 0x65, 0x30, 0x5a, 0x38, 0x4e, 0x75, 0x57, 0x69, 0x4a, 0x32, 0x41, 0x64, 0x38, 0x58, 0x5c, 0x0a,\n\t0x09, 0x63, 0x64, 0x45, 0x57, 0x4d, 0x5a, 0x32, 0x6c, 0x73, 0x6b, 0x59, 0x4b, 0x70, 0x4b, 0x6a, 0x47, 0x35, \n\t0x6c, 0x69, 0x79, 0x45, 0x61, 0x66, 0x2f, 0x31, 0x4a, 0x46, 0x51, 0x6c, 0x44, 0x6f, 0x79, 0x49, 0x77, 0x44, \n\t0x76, 0x52, 0x47, 0x59, 0x37, 0x64, 0x2b, 0x72, 0x49, 0x6e, 0x37, 0x61, 0x4b, 0x52, 0x4f, 0x73, 0x51, 0x73, \n\t0x55, 0x6e, 0x54, 0x32, 0x49, 0x41, 0x50, 0x62, 0x4a, 0x62, 0x43, 0x71, 0x59, 0x33, 0x34, 0x76, 0x61, 0x5c, 0x0a,\n\t0x09, 0x34, 0x46, 0x6b, 0x71, 0x7a, 0x36, 0x4f, 0x35, 0x37, 0x70, 0x30, 0x6f, 0x67, 0x7a, 0x7a, 0x39, 0x53, \n\t0x52, 0x65, 0x37, 0x6a, 0x4d, 0x4e, 0x6c, 0x30, 0x64, 0x75, 0x52, 0x31, 0x66, 0x2f, 0x37, 0x62, 0x72, 0x45, \n\t0x49, 0x32, 0x39, 0x68, 0x79, 0x63, 0x65, 0x76, 0x38, 0x38, 0x54, 0x65, 0x5a, 0x50, 0x50, 0x63, 0x4f, 0x74, \n\t0x6a, 0x67, 0x75, 0x52, 0x5a, 0x49, 0x4c, 0x6c, 0x4e, 0x51, 0x48, 0x4c, 0x62, 0x41, 0x6f, 0x6e, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x46, 0x35, 0x44, 0x6d, 0x6c, 0x7a, 0x72, 0x79, 0x53, 0x76, 0x65, 0x6c, 0x47, 0x2b, 0x71, 0x39, 0x73, \n\t0x45, 0x52, 0x73, 0x2b, 0x5a, 0x35, 0x77, 0x61, 0x54, 0x73, 0x41, 0x6d, 0x4f, 0x4a, 0x52, 0x67, 0x68, 0x54, \n\t0x56, 0x32, 0x43, 0x4b, 0x51, 0x48, 0x41, 0x73, 0x6b, 0x32, 0x7a, 0x4c, 0x31, 0x57, 0x6d, 0x59, 0x4c, 0x37, \n\t0x59, 0x4f, 0x30, 0x64, 0x77, 0x78, 0x43, 0x65, 0x6e, 0x6b, 0x37, 0x4d, 0x4c, 0x51, 0x46, 0x45, 0x56, 0x5c, 0x0a,\n\t0x09, 0x71, 0x6a, 0x2b, 0x33, 0x46, 0x7a, 0x47, 0x77, 0x2b, 0x77, 0x74, 0x7a, 0x38, 0x70, 0x61, 0x32, 0x57, \n\t0x65, 0x71, 0x4b, 0x31, 0x46, 0x4d, 0x4d, 0x6c, 0x6a, 0x75, 0x73, 0x57, 0x4a, 0x61, 0x6d, 0x65, 0x51, 0x51, \n\t0x32, 0x62, 0x62, 0x54, 0x2b, 0x70, 0x49, 0x73, 0x6a, 0x63, 0x4d, 0x51, 0x72, 0x6f, 0x44, 0x7a, 0x2f, 0x6d, \n\t0x50, 0x6e, 0x6b, 0x45, 0x6b, 0x48, 0x2f, 0x77, 0x2f, 0x43, 0x34, 0x6a, 0x57, 0x78, 0x52, 0x5a, 0x48, 0x5c, 0x0a,\n\t0x09, 0x67, 0x65, 0x53, 0x34, 0x43, 0x5a, 0x69, 0x49, 0x62, 0x6f, 0x57, 0x36, 0x6f, 0x59, 0x35, 0x4d, 0x41, \n\t0x36, 0x6c, 0x51, 0x64, 0x53, 0x53, 0x42, 0x50, 0x58, 0x77, 0x51, 0x30, 0x73, 0x76, 0x64, 0x30, 0x35, 0x2b, \n\t0x75, 0x39, 0x68, 0x59, 0x69, 0x67, 0x42, 0x2f, 0x68, 0x46, 0x2b, 0x39, 0x6b, 0x48, 0x52, 0x76, 0x44, 0x6e, \n\t0x55, 0x38, 0x44, 0x75, 0x4b, 0x55, 0x49, 0x70, 0x43, 0x68, 0x66, 0x46, 0x4c, 0x6b, 0x79, 0x56, 0x34, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x6b, 0x6d, 0x70, 0x6e, 0x74, 0x6f, 0x74, 0x53, 0x52, 0x57, 0x54, 0x4c, 0x62, 0x77, 0x74, 0x57, \n\t0x52, 0x76, 0x51, 0x4a, 0x70, 0x54, 0x74, 0x53, 0x52, 0x6c, 0x37, 0x55, 0x4c, 0x51, 0x74, 0x73, 0x51, 0x6a, \n\t0x62, 0x31, 0x33, 0x59, 0x6a, 0x64, 0x75, 0x76, 0x73, 0x74, 0x6e, 0x41, 0x64, 0x6a, 0x32, 0x57, 0x47, 0x78, \n\t0x78, 0x57, 0x48, 0x7a, 0x6b, 0x6c, 0x45, 0x79, 0x51, 0x46, 0x45, 0x77, 0x4b, 0x4a, 0x44, 0x32, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x51, 0x73, 0x6b, 0x41, 0x6c, 0x32, 0x52, 0x32, 0x57, 0x61, 0x31, 0x2f, 0x4d, 0x4d, 0x63, 0x67, \n\t0x51, 0x54, 0x4e, 0x31, 0x4a, 0x46, 0x64, 0x47, 0x34, 0x52, 0x30, 0x4d, 0x31, 0x37, 0x37, 0x74, 0x54, 0x32, \n\t0x48, 0x53, 0x43, 0x37, 0x2f, 0x6c, 0x31, 0x2f, 0x4c, 0x39, 0x46, 0x61, 0x67, 0x31, 0x53, 0x6c, 0x75, 0x6a, \n\t0x5a, 0x71, 0x43, 0x5a, 0x47, 0x69, 0x52, 0x35, 0x6c, 0x68, 0x6d, 0x53, 0x31, 0x73, 0x45, 0x79, 0x57, 0x5c, 0x0a,\n\t0x09, 0x37, 0x65, 0x32, 0x48, 0x4d, 0x47, 0x49, 0x62, 0x33, 0x63, 0x4f, 0x2b, 0x4e, 0x4a, 0x66, 0x30, 0x34, \n\t0x67, 0x51, 0x6d, 0x76, 0x45, 0x41, 0x6d, 0x79, 0x75, 0x66, 0x67, 0x73, 0x33, 0x50, 0x34, 0x49, 0x51, 0x6c, \n\t0x54, 0x57, 0x51, 0x58, 0x41, 0x73, 0x6b, 0x45, 0x36, 0x5a, 0x35, 0x49, 0x62, 0x4f, 0x46, 0x76, 0x55, 0x59, \n\t0x64, 0x2b, 0x61, 0x4e, 0x4f, 0x4f, 0x4f, 0x6a, 0x55, 0x45, 0x72, 0x46, 0x46, 0x42, 0x4e, 0x68, 0x62, 0x5c, 0x0a,\n\t0x09, 0x48, 0x77, 0x63, 0x49, 0x66, 0x41, 0x45, 0x4a, 0x42, 0x36, 0x6b, 0x6b, 0x51, 0x46, 0x4c, 0x35, 0x49, \n\t0x71, 0x33, 0x61, 0x33, 0x78, 0x69, 0x6b, 0x75, 0x56, 0x5a, 0x48, 0x51, 0x67, 0x73, 0x67, 0x77, 0x5a, 0x34, \n\t0x77, 0x43, 0x4f, 0x6c, 0x36, 0x6e, 0x6b, 0x43, 0x65, 0x59, 0x34, 0x68, 0x59, 0x6d, 0x76, 0x77, 0x70, 0x4e, \n\t0x76, 0x78, 0x4d, 0x75, 0x50, 0x6b, 0x68, 0x4c, 0x4e, 0x39, 0x79, 0x62, 0x48, 0x45, 0x59, 0x53, 0x41, 0x5c, 0x0a,\n\t0x09, 0x67, 0x55, 0x6a, 0x59, 0x43, 0x52, 0x67, 0x42, 0x45, 0x6e, 0x71, 0x59, 0x36, 0x45, 0x62, 0x71, 0x73, \n\t0x6a, 0x57, 0x78, 0x6d, 0x45, 0x4e, 0x43, 0x39, 0x49, 0x32, 0x51, 0x32, 0x76, 0x38, 0x30, 0x68, 0x6d, 0x2b, \n\t0x7a, 0x33, 0x76, 0x7a, 0x4d, 0x66, 0x44, 0x4f, 0x59, 0x55, 0x49, 0x58, 0x52, 0x72, 0x4c, 0x63, 0x50, 0x34, \n\t0x44, 0x32, 0x77, 0x38, 0x32, 0x2f, 0x6c, 0x45, 0x6b, 0x45, 0x4a, 0x33, 0x59, 0x72, 0x58, 0x48, 0x58, 0x5c, 0x0a,\n\t0x09, 0x78, 0x6b, 0x43, 0x4b, 0x61, 0x6d, 0x65, 0x75, 0x42, 0x4d, 0x6c, 0x4e, 0x6c, 0x39, 0x6b, 0x32, 0x55, \n\t0x6b, 0x64, 0x43, 0x4a, 0x2b, 0x70, 0x49, 0x4d, 0x43, 0x55, 0x6b, 0x54, 0x55, 0x56, 0x74, 0x4c, 0x59, 0x49, \n\t0x30, 0x66, 0x39, 0x57, 0x52, 0x2f, 0x39, 0x6f, 0x70, 0x41, 0x30, 0x56, 0x59, 0x49, 0x72, 0x5a, 0x63, 0x77, \n\t0x69, 0x51, 0x69, 0x4c, 0x48, 0x73, 0x64, 0x62, 0x73, 0x57, 0x61, 0x6d, 0x75, 0x74, 0x70, 0x49, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x56, 0x4d, 0x6b, 0x46, 0x53, 0x41, 0x6e, 0x51, 0x5a, 0x53, 0x4d, 0x33, 0x56, 0x6b, 0x7a, 0x32, 0x57, \n\t0x32, 0x4e, 0x6b, 0x74, 0x35, 0x51, 0x53, 0x4a, 0x39, 0x4f, 0x77, 0x69, 0x70, 0x6c, 0x65, 0x43, 0x38, 0x7a, \n\t0x58, 0x76, 0x35, 0x49, 0x77, 0x2f, 0x32, 0x42, 0x55, 0x52, 0x6f, 0x6a, 0x53, 0x59, 0x6c, 0x53, 0x42, 0x41, \n\t0x38, 0x63, 0x37, 0x63, 0x4d, 0x73, 0x43, 0x55, 0x77, 0x47, 0x6b, 0x69, 0x38, 0x65, 0x55, 0x51, 0x48, 0x5c, 0x0a,\n\t0x09, 0x79, 0x58, 0x48, 0x37, 0x53, 0x32, 0x59, 0x4c, 0x4b, 0x66, 0x76, 0x57, 0x73, 0x64, 0x77, 0x67, 0x39, \n\t0x61, 0x6e, 0x4d, 0x31, 0x6f, 0x71, 0x50, 0x2f, 0x72, 0x57, 0x49, 0x38, 0x69, 0x2f, 0x4b, 0x45, 0x72, 0x47, \n\t0x4c, 0x59, 0x69, 0x36, 0x74, 0x7a, 0x6e, 0x71, 0x44, 0x38, 0x43, 0x79, 0x32, 0x56, 0x2b, 0x45, 0x77, 0x45, \n\t0x53, 0x73, 0x2b, 0x45, 0x69, 0x43, 0x70, 0x59, 0x4c, 0x75, 0x55, 0x54, 0x32, 0x62, 0x62, 0x62, 0x58, 0x5c, 0x0a,\n\t0x09, 0x55, 0x6b, 0x62, 0x64, 0x54, 0x4f, 0x31, 0x69, 0x5a, 0x49, 0x2f, 0x54, 0x38, 0x49, 0x61, 0x51, 0x33, \n\t0x50, 0x2b, 0x31, 0x46, 0x66, 0x51, 0x54, 0x54, 0x32, 0x76, 0x67, 0x6b, 0x32, 0x4d, 0x39, 0x45, 0x50, 0x65, \n\t0x55, 0x33, 0x74, 0x71, 0x54, 0x74, 0x69, 0x53, 0x42, 0x68, 0x49, 0x4b, 0x6a, 0x34, 0x69, 0x6e, 0x74, 0x77, \n\t0x76, 0x53, 0x5a, 0x42, 0x63, 0x71, 0x35, 0x6c, 0x6b, 0x6a, 0x74, 0x53, 0x52, 0x4a, 0x41, 0x4f, 0x65, 0x5c, 0x0a,\n\t0x09, 0x72, 0x6f, 0x44, 0x55, 0x4e, 0x34, 0x4f, 0x51, 0x2f, 0x74, 0x52, 0x37, 0x78, 0x55, 0x4e, 0x62, 0x2b, \n\t0x73, 0x73, 0x53, 0x69, 0x65, 0x58, 0x7a, 0x72, 0x48, 0x39, 0x6a, 0x4f, 0x50, 0x6d, 0x4d, 0x61, 0x4a, 0x6a, \n\t0x31, 0x79, 0x68, 0x49, 0x53, 0x61, 0x59, 0x56, 0x34, 0x48, 0x4f, 0x52, 0x46, 0x38, 0x46, 0x44, 0x48, 0x4b, \n\t0x30, 0x67, 0x64, 0x57, 0x66, 0x41, 0x67, 0x70, 0x4c, 0x30, 0x45, 0x79, 0x61, 0x6a, 0x56, 0x39, 0x56, 0x5c, 0x0a,\n\t0x09, 0x52, 0x6d, 0x65, 0x30, 0x6c, 0x52, 0x68, 0x56, 0x34, 0x6f, 0x52, 0x47, 0x69, 0x4e, 0x57, 0x50, 0x4c, \n\t0x78, 0x55, 0x6e, 0x62, 0x78, 0x2f, 0x74, 0x72, 0x66, 0x69, 0x2f, 0x59, 0x30, 0x42, 0x70, 0x4a, 0x62, 0x6c, \n\t0x69, 0x43, 0x70, 0x47, 0x4b, 0x6c, 0x73, 0x67, 0x5a, 0x53, 0x68, 0x6a, 0x74, 0x51, 0x62, 0x63, 0x67, 0x32, \n\t0x51, 0x6e, 0x43, 0x37, 0x4b, 0x62, 0x45, 0x6e, 0x72, 0x49, 0x45, 0x45, 0x48, 0x49, 0x4d, 0x33, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x49, 0x4b, 0x51, 0x50, 0x71, 0x79, 0x52, 0x78, 0x50, 0x31, 0x6f, 0x69, 0x74, 0x76, 0x77, 0x66, 0x66, \n\t0x6e, 0x2b, 0x54, 0x47, 0x79, 0x48, 0x63, 0x74, 0x74, 0x59, 0x43, 0x71, 0x5a, 0x77, 0x45, 0x69, 0x63, 0x32, \n\t0x53, 0x33, 0x41, 0x69, 0x6b, 0x58, 0x73, 0x74, 0x73, 0x73, 0x2b, 0x42, 0x70, 0x42, 0x4e, 0x4c, 0x38, 0x55, \n\t0x30, 0x64, 0x65, 0x55, 0x6e, 0x72, 0x6c, 0x48, 0x32, 0x6e, 0x66, 0x51, 0x68, 0x52, 0x5a, 0x49, 0x31, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x38, 0x78, 0x33, 0x38, 0x6e, 0x41, 0x32, 0x7a, 0x70, 0x79, 0x6e, 0x53, 0x51, 0x4f, 0x43, 0x77, \n\t0x79, 0x58, 0x69, 0x4a, 0x75, 0x66, 0x38, 0x6c, 0x73, 0x2b, 0x77, 0x32, 0x6b, 0x59, 0x67, 0x63, 0x68, 0x78, \n\t0x59, 0x43, 0x61, 0x66, 0x4c, 0x66, 0x49, 0x4d, 0x75, 0x2b, 0x47, 0x4a, 0x57, 0x49, 0x33, 0x49, 0x71, 0x33, \n\t0x52, 0x42, 0x67, 0x69, 0x33, 0x50, 0x4d, 0x5a, 0x42, 0x45, 0x74, 0x61, 0x6f, 0x78, 0x4b, 0x76, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x48, 0x42, 0x34, 0x65, 0x4c, 0x37, 0x6c, 0x52, 0x44, 0x71, 0x6c, 0x31, 0x64, 0x57, 0x53, 0x33, 0x42, \n\t0x69, 0x47, 0x46, 0x37, 0x6f, 0x48, 0x55, 0x48, 0x34, 0x4f, 0x51, 0x2f, 0x72, 0x6a, 0x30, 0x71, 0x76, 0x75, \n\t0x32, 0x39, 0x44, 0x31, 0x45, 0x34, 0x2b, 0x2b, 0x66, 0x75, 0x42, 0x39, 0x76, 0x35, 0x41, 0x66, 0x63, 0x47, \n\t0x6a, 0x31, 0x79, 0x76, 0x62, 0x51, 0x77, 0x79, 0x71, 0x31, 0x56, 0x42, 0x45, 0x67, 0x73, 0x77, 0x49, 0x5c, 0x0a,\n\t0x09, 0x34, 0x43, 0x62, 0x36, 0x38, 0x4e, 0x64, 0x57, 0x53, 0x33, 0x42, 0x69, 0x45, 0x4e, 0x75, 0x77, 0x64, \n\t0x53, 0x66, 0x36, 0x67, 0x6a, 0x76, 0x31, 0x4a, 0x30, 0x65, 0x58, 0x63, 0x46, 0x49, 0x72, 0x6c, 0x38, 0x45, \n\t0x6d, 0x38, 0x6b, 0x6f, 0x46, 0x4d, 0x62, 0x49, 0x64, 0x68, 0x77, 0x4c, 0x77, 0x4a, 0x54, 0x30, 0x59, 0x4a, \n\t0x72, 0x33, 0x47, 0x63, 0x41, 0x45, 0x53, 0x30, 0x5a, 0x71, 0x59, 0x6e, 0x61, 0x47, 0x71, 0x73, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x58, 0x55, 0x73, 0x64, 0x57, 0x65, 0x41, 0x67, 0x70, 0x4b, 0x47, 0x52, 0x47, 0x65, 0x77, 0x76, 0x6b, \n\t0x49, 0x6f, 0x5a, 0x68, 0x50, 0x52, 0x33, 0x70, 0x56, 0x66, 0x66, 0x63, 0x2b, 0x65, 0x38, 0x67, 0x51, 0x69, \n\t0x74, 0x30, 0x61, 0x4f, 0x34, 0x2b, 0x52, 0x61, 0x37, 0x45, 0x66, 0x2b, 0x68, 0x2f, 0x78, 0x44, 0x57, 0x68, \n\t0x4d, 0x64, 0x48, 0x46, 0x51, 0x4d, 0x6b, 0x49, 0x67, 0x48, 0x4b, 0x42, 0x45, 0x6b, 0x54, 0x74, 0x48, 0x5c, 0x0a,\n\t0x09, 0x56, 0x66, 0x5a, 0x6b, 0x73, 0x7a, 0x32, 0x38, 0x35, 0x61, 0x42, 0x61, 0x6c, 0x50, 0x5a, 0x62, 0x5a, \n\t0x66, 0x36, 0x55, 0x5a, 0x5a, 0x64, 0x39, 0x4d, 0x53, 0x73, 0x59, 0x76, 0x2b, 0x42, 0x50, 0x36, 0x5a, 0x43, \n\t0x6d, 0x63, 0x6d, 0x52, 0x5a, 0x44, 0x4e, 0x45, 0x6f, 0x38, 0x36, 0x53, 0x41, 0x77, 0x55, 0x41, 0x79, 0x52, \n\t0x76, 0x62, 0x6d, 0x57, 0x32, 0x66, 0x46, 0x59, 0x64, 0x61, 0x41, 0x32, 0x6b, 0x76, 0x41, 0x32, 0x32, 0x5c, 0x0a,\n\t0x09, 0x64, 0x6d, 0x7a, 0x54, 0x2b, 0x30, 0x46, 0x49, 0x31, 0x37, 0x62, 0x61, 0x78, 0x37, 0x34, 0x76, 0x49, \n\t0x42, 0x70, 0x2f, 0x2f, 0x2f, 0x57, 0x62, 0x38, 0x45, 0x59, 0x2b, 0x79, 0x2f, 0x62, 0x72, 0x47, 0x42, 0x74, \n\t0x52, 0x76, 0x79, 0x72, 0x62, 0x31, 0x55, 0x52, 0x73, 0x46, 0x4d, 0x56, 0x45, 0x48, 0x42, 0x78, 0x56, 0x65, \n\t0x2f, 0x50, 0x6d, 0x54, 0x68, 0x30, 0x5a, 0x32, 0x6d, 0x31, 0x64, 0x4f, 0x55, 0x43, 0x69, 0x66, 0x51, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x53, 0x74, 0x6f, 0x54, 0x6b, 0x71, 0x36, 0x57, 0x7a, 0x37, 0x67, 0x72, 0x6d, 0x6f, 0x53, 0x58, \n\t0x69, 0x56, 0x34, 0x38, 0x6d, 0x6c, 0x4b, 0x78, 0x6a, 0x30, 0x7a, 0x72, 0x55, 0x37, 0x37, 0x38, 0x61, 0x4c, \n\t0x63, 0x2b, 0x51, 0x73, 0x45, 0x59, 0x53, 0x6f, 0x43, 0x69, 0x48, 0x78, 0x45, 0x44, 0x69, 0x4d, 0x64, 0x4c, \n\t0x63, 0x71, 0x53, 0x50, 0x46, 0x68, 0x48, 0x48, 0x51, 0x66, 0x5a, 0x44, 0x73, 0x35, 0x6f, 0x33, 0x75, 0x5c, 0x0a,\n\t0x09, 0x79, 0x32, 0x7a, 0x5a, 0x4d, 0x4d, 0x4c, 0x66, 0x37, 0x46, 0x59, 0x52, 0x64, 0x78, 0x32, 0x69, 0x38, \n\t0x51, 0x39, 0x4d, 0x7a, 0x4f, 0x44, 0x64, 0x58, 0x4d, 0x42, 0x75, 0x4d, 0x46, 0x68, 0x2f, 0x47, 0x39, 0x43, \n\t0x70, 0x44, 0x62, 0x49, 0x39, 0x44, 0x55, 0x45, 0x71, 0x44, 0x57, 0x6c, 0x4e, 0x49, 0x6d, 0x58, 0x68, 0x32, \n\t0x6f, 0x68, 0x58, 0x67, 0x44, 0x71, 0x79, 0x7a, 0x55, 0x46, 0x49, 0x4c, 0x58, 0x4b, 0x36, 0x42, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x49, 0x33, 0x31, 0x5a, 0x48, 0x70, 0x4d, 0x74, 0x75, 0x76, 0x6c, 0x6c, 0x39, 0x37, 0x35, 0x2f, 0x53, \n\t0x38, 0x68, 0x55, 0x67, 0x75, 0x50, 0x38, 0x53, 0x37, 0x75, 0x5a, 0x58, 0x64, 0x62, 0x4f, 0x33, 0x75, 0x79, \n\t0x37, 0x51, 0x57, 0x2f, 0x70, 0x49, 0x41, 0x53, 0x54, 0x58, 0x53, 0x4b, 0x70, 0x43, 0x55, 0x4f, 0x74, 0x49, \n\t0x74, 0x6d, 0x65, 0x70, 0x49, 0x78, 0x37, 0x50, 0x55, 0x6b, 0x55, 0x58, 0x4b, 0x62, 0x4e, 0x4f, 0x42, 0x5c, 0x0a,\n\t0x09, 0x36, 0x44, 0x35, 0x49, 0x4a, 0x42, 0x30, 0x6b, 0x4b, 0x45, 0x79, 0x4c, 0x4e, 0x4d, 0x56, 0x63, 0x57, \n\t0x54, 0x63, 0x4c, 0x74, 0x79, 0x63, 0x51, 0x6f, 0x54, 0x56, 0x69, 0x74, 0x2f, 0x67, 0x68, 0x4e, 0x71, 0x6c, \n\t0x6f, 0x75, 0x50, 0x55, 0x4a, 0x43, 0x4e, 0x62, 0x64, 0x49, 0x75, 0x42, 0x68, 0x72, 0x69, 0x30, 0x42, 0x55, \n\t0x73, 0x6b, 0x45, 0x71, 0x56, 0x57, 0x5a, 0x62, 0x62, 0x75, 0x44, 0x6b, 0x45, 0x4b, 0x48, 0x49, 0x45, 0x5c, 0x0a,\n\t0x09, 0x46, 0x42, 0x49, 0x4b, 0x6c, 0x74, 0x63, 0x56, 0x4f, 0x30, 0x66, 0x36, 0x50, 0x79, 0x5a, 0x37, 0x66, \n\t0x76, 0x6d, 0x50, 0x63, 0x51, 0x53, 0x5a, 0x44, 0x59, 0x37, 0x48, 0x33, 0x66, 0x5a, 0x69, 0x56, 0x53, 0x76, \n\t0x2b, 0x38, 0x4b, 0x4d, 0x63, 0x57, 0x44, 0x44, 0x70, 0x49, 0x4d, 0x75, 0x49, 0x6b, 0x62, 0x5a, 0x37, 0x62, \n\t0x62, 0x6b, 0x74, 0x6d, 0x32, 0x4f, 0x77, 0x67, 0x70, 0x63, 0x52, 0x70, 0x61, 0x6c, 0x71, 0x59, 0x67, 0x5c, 0x0a,\n\t0x09, 0x35, 0x61, 0x79, 0x39, 0x39, 0x56, 0x68, 0x6d, 0x79, 0x38, 0x61, 0x54, 0x2b, 0x6e, 0x4b, 0x33, 0x79, \n\t0x37, 0x5a, 0x6e, 0x45, 0x4d, 0x6e, 0x6c, 0x34, 0x37, 0x68, 0x75, 0x70, 0x62, 0x4e, 0x54, 0x55, 0x4c, 0x2f, \n\t0x6e, 0x4a, 0x77, 0x49, 0x59, 0x46, 0x6c, 0x69, 0x72, 0x59, 0x46, 0x73, 0x46, 0x32, 0x50, 0x78, 0x34, 0x5a, \n\t0x51, 0x37, 0x55, 0x6b, 0x64, 0x42, 0x64, 0x6b, 0x48, 0x71, 0x76, 0x6a, 0x76, 0x78, 0x36, 0x35, 0x58, 0x5c, 0x0a,\n\t0x09, 0x57, 0x33, 0x62, 0x64, 0x71, 0x6a, 0x49, 0x45, 0x4a, 0x72, 0x78, 0x4e, 0x70, 0x73, 0x2f, 0x71, 0x64, \n\t0x6f, 0x6e, 0x4c, 0x30, 0x42, 0x67, 0x73, 0x32, 0x50, 0x49, 0x44, 0x78, 0x44, 0x41, 0x69, 0x51, 0x74, 0x68, \n\t0x78, 0x54, 0x6c, 0x69, 0x6e, 0x71, 0x70, 0x6a, 0x69, 0x52, 0x4b, 0x31, 0x4e, 0x5a, 0x48, 0x49, 0x48, 0x55, \n\t0x32, 0x43, 0x4f, 0x6c, 0x4f, 0x33, 0x48, 0x36, 0x75, 0x46, 0x2b, 0x58, 0x61, 0x61, 0x30, 0x76, 0x45, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x75, 0x38, 0x41, 0x6d, 0x37, 0x6b, 0x49, 0x6c, 0x39, 0x6f, 0x74, 0x2f, 0x38, 0x49, 0x66, 0x45, \n\t0x41, 0x63, 0x70, 0x69, 0x6f, 0x74, 0x6b, 0x2b, 0x78, 0x70, 0x72, 0x74, 0x4d, 0x32, 0x6c, 0x6a, 0x6b, 0x77, \n\t0x42, 0x4b, 0x57, 0x30, 0x51, 0x55, 0x70, 0x55, 0x6e, 0x69, 0x6b, 0x42, 0x79, 0x55, 0x6b, 0x42, 0x79, 0x6b, \n\t0x32, 0x58, 0x66, 0x43, 0x6b, 0x6a, 0x51, 0x53, 0x35, 0x41, 0x67, 0x41, 0x36, 0x51, 0x6f, 0x66, 0x66, 0x5c, 0x0a,\n\t0x09, 0x42, 0x33, 0x6c, 0x62, 0x4e, 0x76, 0x32, 0x62, 0x70, 0x48, 0x51, 0x69, 0x53, 0x44, 0x37, 0x48, 0x66, \n\t0x6a, 0x4f, 0x6b, 0x75, 0x6e, 0x4e, 0x30, 0x50, 0x74, 0x72, 0x68, 0x2f, 0x4c, 0x56, 0x6e, 0x34, 0x4a, 0x45, \n\t0x74, 0x76, 0x58, 0x51, 0x59, 0x6f, 0x53, 0x6b, 0x6d, 0x56, 0x54, 0x48, 0x64, 0x6c, 0x49, 0x5a, 0x74, 0x76, \n\t0x75, 0x49, 0x4b, 0x54, 0x4d, 0x69, 0x71, 0x57, 0x56, 0x66, 0x56, 0x36, 0x51, 0x61, 0x43, 0x39, 0x42, 0x5c, 0x0a,\n\t0x09, 0x61, 0x71, 0x69, 0x4f, 0x33, 0x49, 0x79, 0x76, 0x76, 0x39, 0x79, 0x72, 0x4d, 0x70, 0x30, 0x4c, 0x53, \n\t0x38, 0x52, 0x41, 0x59, 0x75, 0x31, 0x71, 0x46, 0x33, 0x47, 0x33, 0x39, 0x76, 0x42, 0x31, 0x6f, 0x67, 0x73, \n\t0x32, 0x68, 0x77, 0x66, 0x64, 0x6c, 0x51, 0x46, 0x53, 0x79, 0x51, 0x53, 0x70, 0x79, 0x7a, 0x4a, 0x62, 0x48, \n\t0x75, 0x42, 0x72, 0x62, 0x55, 0x2f, 0x7a, 0x42, 0x71, 0x53, 0x6b, 0x4f, 0x76, 0x4c, 0x54, 0x6c, 0x64, 0x5c, 0x0a,\n\t0x09, 0x66, 0x66, 0x50, 0x4c, 0x31, 0x48, 0x51, 0x79, 0x53, 0x58, 0x76, 0x77, 0x63, 0x2b, 0x5a, 0x54, 0x71, \n\t0x46, 0x36, 0x67, 0x33, 0x2f, 0x43, 0x48, 0x78, 0x53, 0x76, 0x74, 0x4a, 0x49, 0x4c, 0x47, 0x44, 0x6a, 0x49, \n\t0x41, 0x31, 0x46, 0x72, 0x78, 0x76, 0x4b, 0x62, 0x49, 0x74, 0x53, 0x52, 0x37, 0x49, 0x59, 0x7a, 0x43, 0x69, \n\t0x38, 0x6a, 0x49, 0x70, 0x57, 0x74, 0x30, 0x43, 0x43, 0x66, 0x43, 0x44, 0x52, 0x36, 0x54, 0x72, 0x51, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x52, 0x39, 0x6f, 0x51, 0x4e, 0x4e, 0x71, 0x62, 0x50, 0x69, 0x4c, 0x68, 0x48, 0x2f, 0x71, 0x5a, \n\t0x55, 0x45, 0x53, 0x6d, 0x76, 0x49, 0x55, 0x43, 0x43, 0x45, 0x39, 0x2b, 0x66, 0x4b, 0x70, 0x72, 0x36, 0x38, \n\t0x35, 0x45, 0x6a, 0x66, 0x33, 0x34, 0x44, 0x72, 0x73, 0x48, 0x66, 0x5a, 0x69, 0x71, 0x4a, 0x7a, 0x32, 0x51, \n\t0x58, 0x77, 0x77, 0x57, 0x50, 0x57, 0x76, 0x37, 0x77, 0x5a, 0x61, 0x78, 0x39, 0x6f, 0x70, 0x61, 0x32, 0x5c, 0x0a,\n\t0x09, 0x73, 0x4c, 0x38, 0x49, 0x45, 0x46, 0x59, 0x70, 0x2b, 0x79, 0x74, 0x41, 0x43, 0x62, 0x46, 0x5a, 0x75, \n\t0x64, 0x45, 0x39, 0x62, 0x45, 0x61, 0x77, 0x59, 0x66, 0x32, 0x32, 0x66, 0x48, 0x51, 0x78, 0x39, 0x76, 0x4b, \n\t0x41, 0x41, 0x61, 0x31, 0x75, 0x56, 0x78, 0x58, 0x32, 0x7a, 0x35, 0x4d, 0x5a, 0x39, 0x76, 0x2b, 0x63, 0x7a, \n\t0x61, 0x30, 0x54, 0x5a, 0x65, 0x71, 0x54, 0x78, 0x4f, 0x64, 0x32, 0x32, 0x4b, 0x79, 0x53, 0x44, 0x78, 0x5c, 0x0a,\n\t0x09, 0x73, 0x79, 0x47, 0x4a, 0x6e, 0x58, 0x69, 0x66, 0x70, 0x48, 0x69, 0x58, 0x72, 0x48, 0x4f, 0x68, 0x79, \n\t0x62, 0x6d, 0x45, 0x55, 0x4c, 0x75, 0x45, 0x6f, 0x69, 0x32, 0x64, 0x72, 0x49, 0x48, 0x2f, 0x68, 0x32, 0x31, \n\t0x41, 0x64, 0x38, 0x73, 0x42, 0x50, 0x46, 0x77, 0x43, 0x37, 0x73, 0x6f, 0x78, 0x38, 0x49, 0x34, 0x59, 0x31, \n\t0x38, 0x39, 0x37, 0x54, 0x65, 0x55, 0x76, 0x62, 0x76, 0x78, 0x6c, 0x39, 0x31, 0x71, 0x78, 0x61, 0x46, 0x5c, 0x0a,\n\t0x09, 0x39, 0x5a, 0x49, 0x75, 0x62, 0x57, 0x32, 0x4b, 0x2f, 0x6d, 0x49, 0x36, 0x71, 0x32, 0x35, 0x71, 0x2b, \n\t0x39, 0x4d, 0x59, 0x71, 0x48, 0x6c, 0x46, 0x74, 0x54, 0x6a, 0x62, 0x4e, 0x30, 0x65, 0x68, 0x4c, 0x6f, 0x4d, \n\t0x30, 0x38, 0x41, 0x33, 0x62, 0x47, 0x31, 0x44, 0x58, 0x56, 0x6b, 0x2f, 0x6b, 0x46, 0x49, 0x69, 0x54, 0x75, \n\t0x63, 0x74, 0x41, 0x61, 0x36, 0x45, 0x61, 0x46, 0x70, 0x56, 0x69, 0x52, 0x48, 0x34, 0x72, 0x46, 0x44, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x52, 0x4c, 0x64, 0x46, 0x55, 0x44, 0x39, 0x6a, 0x73, 0x30, 0x78, 0x51, 0x47, 0x78, 0x42, 0x53, \n\t0x78, 0x51, 0x38, 0x50, 0x67, 0x58, 0x2b, 0x67, 0x7a, 0x73, 0x56, 0x68, 0x62, 0x2f, 0x71, 0x4a, 0x6b, 0x42, \n\t0x5a, 0x69, 0x77, 0x64, 0x7a, 0x76, 0x7a, 0x44, 0x54, 0x2b, 0x79, 0x70, 0x63, 0x7a, 0x36, 0x72, 0x64, 0x65, \n\t0x41, 0x6d, 0x34, 0x79, 0x34, 0x34, 0x42, 0x4d, 0x72, 0x49, 0x6b, 0x47, 0x76, 0x30, 0x75, 0x33, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x59, 0x52, 0x71, 0x70, 0x64, 0x2f, 0x42, 0x63, 0x4c, 0x31, 0x63, 0x57, 0x39, 0x66, 0x73, 0x73, 0x39, \n\t0x79, 0x4b, 0x4a, 0x33, 0x2b, 0x35, 0x2b, 0x41, 0x73, 0x4f, 0x34, 0x44, 0x48, 0x77, 0x74, 0x53, 0x50, 0x66, \n\t0x38, 0x78, 0x52, 0x2b, 0x59, 0x54, 0x57, 0x54, 0x79, 0x53, 0x6b, 0x51, 0x68, 0x6b, 0x51, 0x32, 0x69, 0x56, \n\t0x4a, 0x74, 0x44, 0x53, 0x67, 0x41, 0x35, 0x53, 0x35, 0x56, 0x44, 0x35, 0x70, 0x73, 0x6c, 0x61, 0x49, 0x5c, 0x0a,\n\t0x09, 0x38, 0x6c, 0x63, 0x65, 0x4f, 0x51, 0x39, 0x71, 0x76, 0x43, 0x31, 0x75, 0x52, 0x36, 0x55, 0x70, 0x56, \n\t0x69, 0x62, 0x6c, 0x33, 0x4d, 0x53, 0x2b, 0x64, 0x53, 0x37, 0x6c, 0x76, 0x56, 0x4f, 0x6f, 0x41, 0x56, 0x4c, \n\t0x77, 0x34, 0x44, 0x59, 0x4f, 0x54, 0x64, 0x6f, 0x53, 0x50, 0x4c, 0x6b, 0x4c, 0x6e, 0x50, 0x31, 0x48, 0x66, \n\t0x47, 0x64, 0x68, 0x36, 0x62, 0x2f, 0x50, 0x52, 0x51, 0x45, 0x36, 0x63, 0x30, 0x32, 0x51, 0x72, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x32, 0x39, 0x41, 0x39, 0x65, 0x4e, 0x74, 0x44, 0x34, 0x44, 0x73, 0x39, 0x64, 0x39, 0x54, 0x6c, 0x54, \n\t0x44, 0x53, 0x38, 0x50, 0x6f, 0x30, 0x67, 0x4b, 0x59, 0x2f, 0x58, 0x38, 0x58, 0x47, 0x67, 0x44, 0x78, 0x5a, \n\t0x37, 0x70, 0x31, 0x49, 0x39, 0x53, 0x75, 0x75, 0x41, 0x54, 0x43, 0x70, 0x78, 0x34, 0x72, 0x51, 0x47, 0x59, \n\t0x4c, 0x5a, 0x72, 0x7a, 0x45, 0x47, 0x34, 0x57, 0x39, 0x2f, 0x4f, 0x4b, 0x7a, 0x48, 0x6c, 0x67, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x46, 0x67, 0x4f, 0x46, 0x32, 0x78, 0x73, 0x50, 0x70, 0x78, 0x69, 0x73, 0x33, 0x2f, 0x33, 0x37, 0x79, \n\t0x68, 0x74, 0x75, 0x65, 0x48, 0x69, 0x76, 0x68, 0x45, 0x69, 0x43, 0x74, 0x42, 0x6b, 0x33, 0x62, 0x32, 0x48, \n\t0x32, 0x49, 0x74, 0x79, 0x32, 0x44, 0x71, 0x70, 0x6f, 0x6b, 0x5a, 0x67, 0x72, 0x38, 0x33, 0x39, 0x33, 0x47, \n\t0x64, 0x43, 0x64, 0x6d, 0x39, 0x50, 0x66, 0x68, 0x4c, 0x46, 0x4f, 0x2f, 0x5a, 0x70, 0x4c, 0x30, 0x51, 0x5c, 0x0a,\n\t0x09, 0x72, 0x35, 0x62, 0x63, 0x70, 0x73, 0x73, 0x39, 0x57, 0x52, 0x70, 0x44, 0x78, 0x6d, 0x31, 0x33, 0x5a, \n\t0x4d, 0x55, 0x48, 0x6f, 0x45, 0x6b, 0x74, 0x71, 0x47, 0x6d, 0x33, 0x59, 0x31, 0x44, 0x6d, 0x77, 0x72, 0x72, \n\t0x6b, 0x2f, 0x4b, 0x35, 0x4a, 0x79, 0x35, 0x4b, 0x72, 0x2b, 0x2b, 0x67, 0x45, 0x69, 0x43, 0x78, 0x47, 0x59, \n\t0x2b, 0x2f, 0x68, 0x53, 0x50, 0x6a, 0x78, 0x36, 0x36, 0x42, 0x71, 0x76, 0x2b, 0x31, 0x30, 0x4c, 0x39, 0x5c, 0x0a,\n\t0x09, 0x74, 0x73, 0x59, 0x7a, 0x4a, 0x74, 0x48, 0x5a, 0x58, 0x65, 0x44, 0x66, 0x4e, 0x6c, 0x47, 0x38, 0x4f, \n\t0x72, 0x49, 0x79, 0x48, 0x6c, 0x75, 0x70, 0x64, 0x6b, 0x47, 0x43, 0x7a, 0x6b, 0x46, 0x53, 0x56, 0x66, 0x39, \n\t0x77, 0x32, 0x32, 0x78, 0x6a, 0x69, 0x4a, 0x59, 0x4f, 0x66, 0x58, 0x4c, 0x30, 0x67, 0x6e, 0x73, 0x33, 0x37, \n\t0x66, 0x55, 0x51, 0x79, 0x51, 0x66, 0x48, 0x75, 0x68, 0x71, 0x78, 0x79, 0x66, 0x6d, 0x67, 0x4f, 0x76, 0x5c, 0x0a,\n\t0x09, 0x47, 0x31, 0x62, 0x43, 0x75, 0x6b, 0x6d, 0x2f, 0x45, 0x48, 0x62, 0x68, 0x57, 0x78, 0x51, 0x70, 0x48, \n\t0x71, 0x53, 0x50, 0x62, 0x65, 0x79, 0x6f, 0x4b, 0x55, 0x51, 0x6d, 0x34, 0x42, 0x70, 0x4b, 0x4a, 0x6b, 0x74, \n\t0x71, 0x7a, 0x53, 0x4f, 0x46, 0x33, 0x4c, 0x4c, 0x73, 0x41, 0x6c, 0x51, 0x34, 0x2b, 0x4f, 0x66, 0x65, 0x4b, \n\t0x2b, 0x54, 0x38, 0x39, 0x6c, 0x73, 0x66, 0x55, 0x56, 0x52, 0x4f, 0x4d, 0x66, 0x6e, 0x4d, 0x43, 0x36, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x72, 0x77, 0x4a, 0x64, 0x39, 0x66, 0x42, 0x37, 0x74, 0x6c, 0x38, 0x62, 0x36, 0x70, 0x56, 0x49, \n\t0x58, 0x7a, 0x36, 0x38, 0x62, 0x6a, 0x78, 0x4e, 0x6c, 0x49, 0x45, 0x4e, 0x42, 0x6d, 0x45, 0x74, 0x49, 0x6d, \n\t0x6f, 0x6a, 0x51, 0x77, 0x74, 0x6a, 0x46, 0x31, 0x64, 0x4c, 0x30, 0x44, 0x4b, 0x36, 0x69, 0x4f, 0x77, 0x71, \n\t0x35, 0x37, 0x35, 0x50, 0x31, 0x4a, 0x32, 0x51, 0x37, 0x4b, 0x77, 0x2f, 0x4c, 0x4b, 0x35, 0x4c, 0x72, 0x5c, 0x0a,\n\t0x09, 0x66, 0x2b, 0x73, 0x6b, 0x51, 0x43, 0x70, 0x4b, 0x33, 0x34, 0x30, 0x50, 0x34, 0x4d, 0x36, 0x6b, 0x45, \n\t0x74, 0x37, 0x33, 0x74, 0x59, 0x67, 0x46, 0x32, 0x34, 0x7a, 0x4a, 0x61, 0x39, 0x62, 0x33, 0x68, 0x4a, 0x52, \n\t0x75, 0x45, 0x33, 0x79, 0x57, 0x6f, 0x58, 0x43, 0x56, 0x49, 0x74, 0x57, 0x78, 0x62, 0x74, 0x37, 0x44, 0x66, \n\t0x38, 0x6d, 0x64, 0x45, 0x4c, 0x37, 0x6c, 0x34, 0x33, 0x67, 0x43, 0x67, 0x64, 0x70, 0x48, 0x74, 0x70, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x66, 0x39, 0x38, 0x62, 0x6f, 0x69, 0x65, 0x58, 0x64, 0x38, 0x56, 0x6d, 0x53, 0x32, 0x50, 0x6a, \n\t0x56, 0x69, 0x62, 0x58, 0x6d, 0x72, 0x51, 0x6d, 0x77, 0x4d, 0x6b, 0x36, 0x42, 0x77, 0x6b, 0x4f, 0x70, 0x73, \n\t0x2b, 0x4d, 0x72, 0x43, 0x7a, 0x37, 0x2f, 0x43, 0x44, 0x6f, 0x78, 0x66, 0x64, 0x65, 0x32, 0x45, 0x2f, 0x6c, \n\t0x46, 0x64, 0x66, 0x51, 0x73, 0x53, 0x57, 0x42, 0x5a, 0x2b, 0x2b, 0x36, 0x79, 0x4a, 0x59, 0x4e, 0x50, 0x5c, 0x0a,\n\t0x09, 0x72, 0x72, 0x58, 0x4b, 0x48, 0x55, 0x7a, 0x69, 0x33, 0x46, 0x71, 0x69, 0x4f, 0x31, 0x51, 0x55, 0x69, \n\t0x64, 0x30, 0x61, 0x58, 0x57, 0x4e, 0x4b, 0x45, 0x74, 0x67, 0x46, 0x53, 0x45, 0x4f, 0x6a, 0x4a, 0x4d, 0x61, \n\t0x56, 0x45, 0x59, 0x39, 0x6d, 0x70, 0x6b, 0x79, 0x64, 0x42, 0x4c, 0x2b, 0x71, 0x57, 0x73, 0x2b, 0x68, 0x59, \n\t0x69, 0x44, 0x74, 0x49, 0x58, 0x37, 0x33, 0x73, 0x56, 0x6a, 0x41, 0x38, 0x33, 0x7a, 0x58, 0x33, 0x51, 0x5c, 0x0a,\n\t0x09, 0x71, 0x65, 0x30, 0x43, 0x67, 0x4b, 0x4c, 0x55, 0x6b, 0x58, 0x71, 0x6a, 0x4c, 0x63, 0x75, 0x65, 0x44, \n\t0x2b, 0x2f, 0x54, 0x6f, 0x42, 0x70, 0x65, 0x49, 0x45, 0x68, 0x35, 0x67, 0x6d, 0x34, 0x48, 0x4c, 0x65, 0x54, \n\t0x53, 0x6b, 0x62, 0x65, 0x4f, 0x2f, 0x73, 0x30, 0x64, 0x6d, 0x2f, 0x75, 0x6c, 0x6e, 0x44, 0x7a, 0x6f, 0x38, \n\t0x34, 0x55, 0x73, 0x47, 0x54, 0x75, 0x52, 0x42, 0x69, 0x45, 0x47, 0x32, 0x74, 0x57, 0x6c, 0x44, 0x55, 0x5c, 0x0a,\n\t0x09, 0x45, 0x4b, 0x4b, 0x42, 0x65, 0x31, 0x71, 0x64, 0x79, 0x79, 0x6e, 0x72, 0x30, 0x6d, 0x45, 0x4a, 0x71, \n\t0x6a, 0x44, 0x6f, 0x4d, 0x32, 0x48, 0x30, 0x77, 0x6f, 0x44, 0x41, 0x38, 0x45, 0x38, 0x69, 0x63, 0x56, 0x61, \n\t0x70, 0x6c, 0x76, 0x39, 0x58, 0x70, 0x6f, 0x6b, 0x57, 0x7a, 0x50, 0x32, 0x35, 0x33, 0x78, 0x35, 0x53, 0x6c, \n\t0x5a, 0x62, 0x66, 0x32, 0x46, 0x33, 0x6b, 0x35, 0x4b, 0x6b, 0x34, 0x59, 0x74, 0x36, 0x31, 0x79, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x58, 0x33, 0x4a, 0x4e, 0x68, 0x70, 0x61, 0x4f, 0x58, 0x44, 0x70, 0x32, 0x34, 0x64, 0x32, 0x58, 0x39, \n\t0x6c, 0x4d, 0x5a, 0x4f, 0x66, 0x30, 0x4f, 0x30, 0x66, 0x6a, 0x66, 0x33, 0x6a, 0x49, 0x44, 0x34, 0x30, 0x50, \n\t0x50, 0x68, 0x61, 0x46, 0x79, 0x59, 0x32, 0x6b, 0x44, 0x61, 0x32, 0x69, 0x4e, 0x5a, 0x4c, 0x59, 0x56, 0x53, \n\t0x32, 0x5a, 0x62, 0x37, 0x6c, 0x68, 0x6d, 0x53, 0x30, 0x62, 0x33, 0x6b, 0x78, 0x4b, 0x54, 0x72, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x69, 0x6d, 0x4f, 0x78, 0x61, 0x4a, 0x6a, 0x4a, 0x62, 0x6a, 0x2f, 0x55, 0x56, 0x44, 0x6a, 0x34, 0x39, \n\t0x64, 0x66, 0x4e, 0x38, 0x35, 0x2f, 0x56, 0x5a, 0x47, 0x66, 0x51, 0x38, 0x52, 0x64, 0x32, 0x73, 0x58, 0x33, \n\t0x37, 0x57, 0x46, 0x4c, 0x42, 0x6f, 0x35, 0x48, 0x6f, 0x62, 0x4c, 0x4d, 0x35, 0x6b, 0x57, 0x69, 0x35, 0x53, \n\t0x36, 0x4b, 0x37, 0x4e, 0x6c, 0x6e, 0x7a, 0x57, 0x32, 0x48, 0x36, 0x53, 0x4c, 0x77, 0x51, 0x6f, 0x45, 0x5c, 0x0a,\n\t0x09, 0x79, 0x58, 0x6f, 0x50, 0x47, 0x63, 0x58, 0x76, 0x48, 0x55, 0x4c, 0x59, 0x52, 0x30, 0x71, 0x37, 0x79, \n\t0x46, 0x6a, 0x35, 0x70, 0x48, 0x34, 0x73, 0x6e, 0x33, 0x6b, 0x42, 0x45, 0x62, 0x64, 0x49, 0x6e, 0x37, 0x70, \n\t0x7a, 0x4c, 0x56, 0x6b, 0x38, 0x64, 0x6a, 0x79, 0x4d, 0x6c, 0x4e, 0x50, 0x62, 0x41, 0x43, 0x71, 0x6a, 0x48, \n\t0x63, 0x70, 0x73, 0x6d, 0x77, 0x39, 0x43, 0x53, 0x6b, 0x72, 0x34, 0x48, 0x61, 0x50, 0x37, 0x4e, 0x71, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x6c, 0x46, 0x53, 0x39, 0x71, 0x63, 0x77, 0x35, 0x64, 0x74, 0x49, 0x58, 0x73, 0x4f, 0x2f, 0x4c, \n\t0x69, 0x73, 0x55, 0x2f, 0x63, 0x76, 0x57, 0x30, 0x41, 0x55, 0x61, 0x63, 0x67, 0x2f, 0x65, 0x2f, 0x62, 0x48, \n\t0x79, 0x4e, 0x4c, 0x46, 0x7a, 0x34, 0x58, 0x52, 0x69, 0x6f, 0x4a, 0x6b, 0x4d, 0x6a, 0x6f, 0x77, 0x70, 0x36, \n\t0x6f, 0x49, 0x31, 0x6c, 0x38, 0x5a, 0x47, 0x53, 0x7a, 0x75, 0x77, 0x2f, 0x53, 0x70, 0x4c, 0x4e, 0x73, 0x5c, 0x0a,\n\t0x09, 0x39, 0x49, 0x79, 0x78, 0x43, 0x2b, 0x2b, 0x36, 0x75, 0x31, 0x2f, 0x4c, 0x5a, 0x56, 0x35, 0x42, 0x4a, \n\t0x47, 0x4f, 0x6b, 0x4a, 0x38, 0x6e, 0x79, 0x52, 0x55, 0x66, 0x44, 0x32, 0x4e, 0x44, 0x4f, 0x36, 0x47, 0x41, \n\t0x4a, 0x4c, 0x63, 0x7a, 0x51, 0x41, 0x67, 0x46, 0x50, 0x74, 0x39, 0x53, 0x52, 0x57, 0x6b, 0x4d, 0x75, 0x47, \n\t0x56, 0x32, 0x47, 0x6e, 0x7a, 0x58, 0x63, 0x48, 0x6b, 0x6a, 0x51, 0x45, 0x6b, 0x67, 0x73, 0x62, 0x58, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x32, 0x38, 0x46, 0x73, 0x6d, 0x37, 0x75, 0x76, 0x6e, 0x4d, 0x70, 0x6c, 0x33, 0x45, 0x48, 0x47, \n\t0x51, 0x50, 0x6e, 0x37, 0x54, 0x30, 0x32, 0x54, 0x70, 0x67, 0x69, 0x4f, 0x78, 0x2b, 0x69, 0x39, 0x36, 0x4d, \n\t0x35, 0x51, 0x4a, 0x7a, 0x50, 0x37, 0x71, 0x49, 0x71, 0x43, 0x31, 0x47, 0x57, 0x46, 0x39, 0x45, 0x43, 0x51, \n\t0x4f, 0x6c, 0x41, 0x36, 0x53, 0x45, 0x72, 0x68, 0x6c, 0x44, 0x55, 0x4b, 0x71, 0x78, 0x6f, 0x37, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x49, 0x37, 0x4e, 0x6c, 0x35, 0x79, 0x7a, 0x59, 0x58, 0x31, 0x69, 0x32, 0x56, 0x6b, 0x47, 0x69, 0x75, \n\t0x55, 0x47, 0x71, 0x34, 0x2f, 0x2f, 0x50, 0x47, 0x58, 0x37, 0x72, 0x78, 0x45, 0x53, 0x2f, 0x6c, 0x38, 0x65, \n\t0x38, 0x68, 0x49, 0x69, 0x44, 0x64, 0x4d, 0x48, 0x4e, 0x6d, 0x78, 0x47, 0x6b, 0x51, 0x37, 0x44, 0x6d, 0x74, \n\t0x70, 0x36, 0x4d, 0x44, 0x2f, 0x50, 0x4a, 0x61, 0x57, 0x5a, 0x2b, 0x64, 0x6a, 0x36, 0x45, 0x4f, 0x39, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x4c, 0x6b, 0x49, 0x5a, 0x6a, 0x6b, 0x48, 0x68, 0x4e, 0x62, 0x61, 0x6a, 0x59, 0x51, 0x55, 0x6a, \n\t0x78, 0x2f, 0x38, 0x36, 0x43, 0x41, 0x37, 0x52, 0x42, 0x74, 0x44, 0x6f, 0x48, 0x53, 0x64, 0x74, 0x6e, 0x6b, \n\t0x2b, 0x36, 0x38, 0x59, 0x66, 0x68, 0x74, 0x45, 0x31, 0x66, 0x4e, 0x68, 0x37, 0x4b, 0x59, 0x74, 0x78, 0x42, \n\t0x4a, 0x69, 0x7a, 0x53, 0x4e, 0x44, 0x2f, 0x34, 0x77, 0x32, 0x47, 0x65, 0x63, 0x7a, 0x33, 0x4a, 0x45, 0x5c, 0x0a,\n\t0x09, 0x64, 0x32, 0x32, 0x42, 0x6d, 0x56, 0x39, 0x38, 0x48, 0x50, 0x7a, 0x48, 0x66, 0x69, 0x4e, 0x47, 0x48, \n\t0x55, 0x6d, 0x52, 0x32, 0x52, 0x59, 0x36, 0x43, 0x43, 0x6c, 0x2b, 0x6c, 0x6a, 0x4f, 0x2b, 0x50, 0x36, 0x53, \n\t0x4b, 0x70, 0x74, 0x73, 0x41, 0x53, 0x57, 0x71, 0x52, 0x35, 0x68, 0x56, 0x41, 0x50, 0x42, 0x36, 0x64, 0x53, \n\t0x36, 0x46, 0x2b, 0x6b, 0x63, 0x76, 0x55, 0x31, 0x39, 0x65, 0x38, 0x46, 0x63, 0x51, 0x6b, 0x4e, 0x62, 0x5c, 0x0a,\n\t0x09, 0x79, 0x78, 0x79, 0x31, 0x75, 0x35, 0x47, 0x73, 0x6f, 0x76, 0x4f, 0x6c, 0x63, 0x55, 0x75, 0x44, 0x38, \n\t0x72, 0x42, 0x74, 0x6a, 0x69, 0x71, 0x39, 0x77, 0x50, 0x36, 0x31, 0x4c, 0x34, 0x58, 0x78, 0x58, 0x6a, 0x41, \n\t0x6c, 0x42, 0x66, 0x43, 0x76, 0x2f, 0x72, 0x6f, 0x6e, 0x4d, 0x41, 0x46, 0x2f, 0x6e, 0x37, 0x34, 0x72, 0x55, \n\t0x55, 0x2b, 0x30, 0x4e, 0x30, 0x7a, 0x49, 0x2b, 0x45, 0x2f, 0x56, 0x7a, 0x63, 0x50, 0x37, 0x4e, 0x44, 0x5c, 0x0a,\n\t0x09, 0x43, 0x50, 0x78, 0x54, 0x6e, 0x37, 0x44, 0x78, 0x74, 0x4a, 0x4f, 0x48, 0x54, 0x51, 0x45, 0x2f, 0x71, \n\t0x7a, 0x43, 0x63, 0x50, 0x66, 0x4a, 0x58, 0x45, 0x39, 0x66, 0x32, 0x36, 0x33, 0x4e, 0x4f, 0x35, 0x57, 0x56, \n\t0x50, 0x67, 0x55, 0x69, 0x43, 0x74, 0x41, 0x6f, 0x33, 0x50, 0x38, 0x48, 0x31, 0x45, 0x48, 0x34, 0x66, 0x49, \n\t0x34, 0x75, 0x68, 0x76, 0x50, 0x70, 0x64, 0x34, 0x43, 0x34, 0x2f, 0x56, 0x73, 0x44, 0x44, 0x65, 0x70, 0x5c, 0x0a,\n\t0x09, 0x41, 0x77, 0x63, 0x59, 0x41, 0x43, 0x43, 0x51, 0x47, 0x69, 0x62, 0x4c, 0x5a, 0x49, 0x43, 0x52, 0x4b, \n\t0x56, 0x41, 0x47, 0x57, 0x43, 0x70, 0x48, 0x71, 0x4d, 0x52, 0x43, 0x44, 0x46, 0x76, 0x55, 0x66, 0x6f, 0x39, \n\t0x45, 0x61, 0x67, 0x73, 0x7a, 0x75, 0x62, 0x67, 0x45, 0x54, 0x4e, 0x48, 0x69, 0x4c, 0x6d, 0x2f, 0x7a, 0x66, \n\t0x67, 0x65, 0x74, 0x62, 0x49, 0x32, 0x79, 0x66, 0x75, 0x37, 0x4f, 0x64, 0x6e, 0x76, 0x4d, 0x64, 0x44, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x45, 0x46, 0x61, 0x42, 0x47, 0x4b, 0x43, 0x34, 0x37, 0x39, 0x55, 0x78, 0x39, 0x78, 0x44, 0x30, \n\t0x43, 0x6f, 0x39, 0x2f, 0x78, 0x79, 0x70, 0x32, 0x35, 0x37, 0x6c, 0x45, 0x44, 0x47, 0x59, 0x38, 0x6f, 0x4a, \n\t0x45, 0x6d, 0x4a, 0x55, 0x4b, 0x6d, 0x6f, 0x48, 0x6b, 0x51, 0x37, 0x68, 0x39, 0x72, 0x59, 0x43, 0x30, 0x64, \n\t0x5a, 0x42, 0x75, 0x78, 0x78, 0x65, 0x76, 0x51, 0x34, 0x43, 0x65, 0x36, 0x66, 0x66, 0x6e, 0x75, 0x31, 0x5c, 0x0a,\n\t0x09, 0x64, 0x41, 0x70, 0x4d, 0x48, 0x30, 0x64, 0x68, 0x42, 0x6a, 0x4e, 0x69, 0x38, 0x55, 0x61, 0x59, 0x41, \n\t0x68, 0x4b, 0x44, 0x33, 0x6e, 0x6c, 0x65, 0x41, 0x64, 0x65, 0x61, 0x61, 0x41, 0x77, 0x51, 0x5a, 0x4a, 0x75, \n\t0x62, 0x49, 0x49, 0x70, 0x4a, 0x6f, 0x41, 0x52, 0x59, 0x45, 0x55, 0x4b, 0x73, 0x75, 0x6b, 0x75, 0x54, 0x55, \n\t0x4a, 0x45, 0x77, 0x65, 0x4a, 0x48, 0x51, 0x39, 0x6d, 0x49, 0x64, 0x7a, 0x32, 0x52, 0x48, 0x71, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x73, 0x6d, 0x79, 0x51, 0x57, 0x47, 0x2b, 0x58, 0x44, 0x34, 0x2f, 0x38, 0x39, 0x55, 0x52, 0x31, 0x50, \n\t0x6a, 0x7a, 0x58, 0x76, 0x51, 0x6f, 0x69, 0x43, 0x64, 0x49, 0x4b, 0x45, 0x49, 0x58, 0x30, 0x4f, 0x6e, 0x6c, \n\t0x6a, 0x51, 0x49, 0x59, 0x58, 0x67, 0x6e, 0x66, 0x30, 0x4b, 0x38, 0x41, 0x37, 0x2b, 0x43, 0x52, 0x65, 0x38, \n\t0x41, 0x4b, 0x69, 0x57, 0x67, 0x78, 0x53, 0x55, 0x4a, 0x50, 0x67, 0x31, 0x4b, 0x4e, 0x39, 0x44, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x57, 0x53, 0x42, 0x49, 0x6d, 0x42, 0x52, 0x4b, 0x64, 0x66, 0x41, 0x70, 0x6f, 0x64, 0x54, 0x4b, \n\t0x6a, 0x6c, 0x64, 0x55, 0x41, 0x61, 0x51, 0x76, 0x75, 0x76, 0x32, 0x66, 0x30, 0x72, 0x79, 0x64, 0x2b, 0x4f, \n\t0x70, 0x2b, 0x65, 0x36, 0x56, 0x34, 0x48, 0x6b, 0x51, 0x62, 0x54, 0x61, 0x30, 0x42, 0x30, 0x32, 0x7a, 0x35, \n\t0x4b, 0x46, 0x43, 0x34, 0x46, 0x55, 0x68, 0x6b, 0x44, 0x37, 0x35, 0x42, 0x54, 0x77, 0x44, 0x33, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x68, 0x61, 0x4b, 0x70, 0x68, 0x4c, 0x6d, 0x35, 0x4b, 0x4e, 0x69, 0x75, 0x43, 0x59, 0x76, 0x45, 0x4f, \n\t0x72, 0x52, 0x46, 0x49, 0x44, 0x47, 0x41, 0x41, 0x67, 0x32, 0x6b, 0x70, 0x46, 0x57, 0x69, 0x76, 0x41, 0x66, \n\t0x74, 0x46, 0x6f, 0x79, 0x50, 0x4e, 0x71, 0x67, 0x48, 0x6d, 0x51, 0x58, 0x53, 0x6a, 0x2f, 0x48, 0x76, 0x66, \n\t0x78, 0x74, 0x39, 0x78, 0x2f, 0x58, 0x50, 0x7a, 0x72, 0x64, 0x6e, 0x75, 0x64, 0x64, 0x43, 0x4a, 0x45, 0x5c, 0x0a,\n\t0x09, 0x46, 0x69, 0x6d, 0x63, 0x48, 0x33, 0x41, 0x68, 0x74, 0x6f, 0x69, 0x35, 0x44, 0x6c, 0x71, 0x6c, 0x35, \n\t0x4e, 0x48, 0x41, 0x4c, 0x4f, 0x76, 0x6b, 0x64, 0x68, 0x38, 0x50, 0x30, 0x63, 0x63, 0x4a, 0x59, 0x63, 0x4a, \n\t0x73, 0x59, 0x6f, 0x55, 0x6c, 0x32, 0x31, 0x75, 0x57, 0x75, 0x4c, 0x33, 0x52, 0x6f, 0x48, 0x43, 0x62, 0x64, \n\t0x45, 0x64, 0x63, 0x74, 0x57, 0x78, 0x31, 0x6c, 0x4d, 0x4a, 0x45, 0x45, 0x4b, 0x74, 0x7a, 0x38, 0x68, 0x5c, 0x0a,\n\t0x09, 0x41, 0x75, 0x79, 0x6f, 0x43, 0x37, 0x33, 0x78, 0x4c, 0x50, 0x2b, 0x41, 0x36, 0x2f, 0x6d, 0x6a, 0x37, \n\t0x37, 0x7a, 0x2b, 0x6d, 0x76, 0x6e, 0x36, 0x48, 0x50, 0x64, 0x71, 0x69, 0x44, 0x53, 0x59, 0x57, 0x48, 0x76, \n\t0x46, 0x65, 0x58, 0x69, 0x54, 0x48, 0x38, 0x4a, 0x48, 0x63, 0x71, 0x68, 0x52, 0x7a, 0x6f, 0x34, 0x44, 0x7a, \n\t0x6f, 0x49, 0x56, 0x51, 0x42, 0x59, 0x64, 0x42, 0x47, 0x52, 0x30, 0x4b, 0x52, 0x66, 0x72, 0x73, 0x38, 0x5c, 0x0a,\n\t0x09, 0x51, 0x6c, 0x42, 0x30, 0x6d, 0x36, 0x74, 0x56, 0x53, 0x51, 0x36, 0x6a, 0x4d, 0x49, 0x44, 0x6c, 0x62, \n\t0x7a, 0x70, 0x37, 0x43, 0x47, 0x56, 0x70, 0x74, 0x4b, 0x75, 0x69, 0x37, 0x43, 0x35, 0x78, 0x65, 0x37, 0x47, \n\t0x4e, 0x66, 0x76, 0x49, 0x30, 0x44, 0x68, 0x66, 0x48, 0x35, 0x2b, 0x41, 0x34, 0x68, 0x4d, 0x6d, 0x46, 0x6a, \n\t0x72, 0x36, 0x71, 0x76, 0x77, 0x73, 0x5a, 0x79, 0x48, 0x4c, 0x31, 0x2b, 0x4e, 0x74, 0x2b, 0x77, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x36, 0x39, 0x34, 0x67, 0x6b, 0x70, 0x54, 0x6c, 0x55, 0x58, 0x52, 0x35, 0x46, 0x5a, 0x47, 0x73, 0x5a, \n\t0x41, 0x49, 0x33, 0x39, 0x73, 0x7a, 0x51, 0x55, 0x68, 0x45, 0x2b, 0x71, 0x4d, 0x53, 0x73, 0x41, 0x43, 0x77, \n\t0x5a, 0x39, 0x7a, 0x42, 0x6c, 0x48, 0x4c, 0x4d, 0x34, 0x33, 0x38, 0x44, 0x31, 0x35, 0x36, 0x50, 0x76, 0x6d, \n\t0x67, 0x6a, 0x33, 0x68, 0x4f, 0x63, 0x32, 0x67, 0x43, 0x67, 0x4c, 0x71, 0x48, 0x39, 0x63, 0x77, 0x37, 0x5c, 0x0a,\n\t0x09, 0x70, 0x31, 0x2f, 0x44, 0x6e, 0x65, 0x4e, 0x6f, 0x75, 0x64, 0x54, 0x73, 0x66, 0x43, 0x58, 0x39, 0x77, \n\t0x77, 0x4b, 0x43, 0x62, 0x36, 0x73, 0x7a, 0x4c, 0x4f, 0x59, 0x4b, 0x72, 0x36, 0x47, 0x33, 0x43, 0x39, 0x43, \n\t0x73, 0x2b, 0x35, 0x62, 0x50, 0x54, 0x63, 0x69, 0x61, 0x66, 0x32, 0x74, 0x47, 0x63, 0x31, 0x67, 0x43, 0x6a, \n\t0x48, 0x4d, 0x76, 0x32, 0x4e, 0x4e, 0x61, 0x77, 0x70, 0x36, 0x44, 0x69, 0x45, 0x34, 0x41, 0x57, 0x34, 0x5c, 0x0a,\n\t0x09, 0x50, 0x52, 0x37, 0x58, 0x49, 0x33, 0x41, 0x39, 0x47, 0x56, 0x2f, 0x76, 0x4a, 0x37, 0x71, 0x6b, 0x79, \n\t0x66, 0x47, 0x42, 0x6e, 0x58, 0x41, 0x72, 0x39, 0x54, 0x30, 0x32, 0x4c, 0x4d, 0x37, 0x6a, 0x2b, 0x4c, 0x6a, \n\t0x59, 0x59, 0x41, 0x47, 0x33, 0x73, 0x58, 0x7a, 0x50, 0x36, 0x48, 0x6b, 0x54, 0x75, 0x2f, 0x66, 0x6b, 0x35, \n\t0x7a, 0x4f, 0x41, 0x71, 0x4d, 0x31, 0x6c, 0x31, 0x79, 0x56, 0x72, 0x37, 0x69, 0x49, 0x6c, 0x4f, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x47, 0x77, 0x4a, 0x72, 0x61, 0x68, 0x4b, 0x6a, 0x6a, 0x44, 0x75, 0x33, 0x44, 0x64, 0x75, 0x68, 0x32, \n\t0x47, 0x64, 0x75, 0x7a, 0x76, 0x6e, 0x6a, 0x49, 0x39, 0x75, 0x7a, 0x63, 0x39, 0x69, 0x37, 0x34, 0x62, 0x6e, \n\t0x32, 0x69, 0x65, 0x78, 0x45, 0x35, 0x4d, 0x67, 0x66, 0x59, 0x38, 0x37, 0x57, 0x65, 0x6e, 0x58, 0x42, 0x70, \n\t0x7a, 0x65, 0x57, 0x38, 0x63, 0x50, 0x4b, 0x45, 0x42, 0x52, 0x48, 0x6d, 0x57, 0x6b, 0x78, 0x50, 0x50, 0x5c, 0x0a,\n\t0x09, 0x69, 0x55, 0x51, 0x78, 0x38, 0x74, 0x73, 0x47, 0x6a, 0x32, 0x63, 0x41, 0x55, 0x5a, 0x35, 0x6c, 0x56, \n\t0x59, 0x5a, 0x68, 0x5a, 0x33, 0x2f, 0x4f, 0x43, 0x4f, 0x2f, 0x61, 0x5a, 0x38, 0x55, 0x41, 0x6f, 0x73, 0x47, \n\t0x53, 0x48, 0x36, 0x4a, 0x6f, 0x6d, 0x4c, 0x54, 0x49, 0x72, 0x62, 0x48, 0x6e, 0x64, 0x38, 0x34, 0x41, 0x6f, \n\t0x73, 0x47, 0x53, 0x44, 0x79, 0x4a, 0x52, 0x31, 0x35, 0x6a, 0x52, 0x41, 0x4e, 0x6f, 0x75, 0x61, 0x79, 0x5c, 0x0a,\n\t0x09, 0x46, 0x6e, 0x44, 0x79, 0x41, 0x61, 0x4c, 0x4e, 0x6c, 0x42, 0x39, 0x64, 0x64, 0x34, 0x64, 0x76, 0x74, \n\t0x51, 0x56, 0x55, 0x6e, 0x44, 0x39, 0x57, 0x4e, 0x61, 0x41, 0x2b, 0x71, 0x62, 0x45, 0x53, 0x5a, 0x57, 0x4d, \n\t0x7a, 0x75, 0x56, 0x62, 0x6a, 0x68, 0x75, 0x64, 0x41, 0x44, 0x52, 0x59, 0x4d, 0x6c, 0x61, 0x44, 0x74, 0x50, \n\t0x32, 0x2f, 0x35, 0x34, 0x41, 0x76, 0x56, 0x79, 0x36, 0x4d, 0x78, 0x5a, 0x5a, 0x73, 0x36, 0x6b, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x50, 0x67, 0x51, 0x73, 0x30, 0x30, 0x32, 0x63, 0x59, 0x77, 0x63, 0x51, 0x44, 0x5a, 0x61, 0x73, 0x52, \n\t0x66, 0x56, 0x55, 0x66, 0x41, 0x4c, 0x58, 0x7a, 0x77, 0x36, 0x39, 0x2b, 0x54, 0x39, 0x5a, 0x42, 0x76, 0x6f, \n\t0x78, 0x42, 0x47, 0x6d, 0x64, 0x2b, 0x39, 0x49, 0x4e, 0x4e, 0x58, 0x66, 0x31, 0x72, 0x6b, 0x76, 0x51, 0x6e, \n\t0x2f, 0x30, 0x59, 0x31, 0x32, 0x56, 0x37, 0x38, 0x30, 0x50, 0x79, 0x42, 0x70, 0x77, 0x30, 0x58, 0x47, 0x5c, 0x0a,\n\t0x09, 0x59, 0x77, 0x35, 0x74, 0x6d, 0x46, 0x62, 0x75, 0x73, 0x74, 0x49, 0x32, 0x2b, 0x66, 0x6b, 0x50, 0x45, \n\t0x51, 0x62, 0x39, 0x59, 0x6f, 0x61, 0x2b, 0x65, 0x63, 0x78, 0x2f, 0x6f, 0x34, 0x44, 0x69, 0x41, 0x61, 0x4c, \n\t0x46, 0x6b, 0x4c, 0x61, 0x38, 0x6f, 0x34, 0x61, 0x50, 0x54, 0x63, 0x69, 0x65, 0x33, 0x61, 0x4d, 0x64, 0x59, \n\t0x50, 0x4c, 0x42, 0x72, 0x57, 0x78, 0x54, 0x6c, 0x68, 0x38, 0x36, 0x54, 0x32, 0x63, 0x71, 0x39, 0x63, 0x5c, 0x0a,\n\t0x09, 0x55, 0x70, 0x73, 0x39, 0x42, 0x73, 0x74, 0x67, 0x47, 0x63, 0x52, 0x45, 0x67, 0x32, 0x55, 0x41, 0x30, \n\t0x57, 0x41, 0x5a, 0x51, 0x44, 0x52, 0x59, 0x42, 0x68, 0x41, 0x4e, 0x6c, 0x73, 0x48, 0x53, 0x32, 0x76, 0x4c, \n\t0x2f, 0x42, 0x52, 0x67, 0x41, 0x6f, 0x50, 0x74, 0x32, 0x38, 0x77, 0x76, 0x35, 0x59, 0x6f, 0x49, 0x41, 0x41, \n\t0x41, 0x41, 0x41, 0x53, 0x55, 0x56, 0x4f, 0x52, 0x4b, 0x35, 0x43, 0x59, 0x49, 0x49, 0x3d, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x62, 0x6c, 0x69, 0x6e, 0x6b, 0x40, 0x32, 0x78, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x64, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x5b, 0x32, 0x5d, 0x2e, 0x62, 0x6c, 0x69, \n\t0x6e, 0x6b, 0x5f, 0x70, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, \n\t0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, \n\t0x61, 0x73, 0x65, 0x36, 0x34, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x53, 0x49, 0x41, 0x41, 0x41, 0x47, 0x61, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x43, 0x72, 0x4a, 0x30, 0x36, 0x75, 0x41, 0x41, 0x41, 0x67, 0x41, 0x45, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x34, 0x6e, 0x4f, 0x79, 0x39, 0x65, 0x62, 0x67, 0x74, 0x78, 0x31, 0x58, 0x59, 0x2b, 0x36, 0x5c, 0x0a,\n\t0x09, 0x76, 0x65, 0x5a, 0x37, 0x69, 0x7a, 0x5a, 0x6b, 0x75, 0x32, 0x68, 0x43, 0x51, 0x73, 0x32, 0x56, 0x69, \n\t0x32, 0x43, 0x44, 0x61, 0x57, 0x35, 0x35, 0x48, 0x45, 0x44, 0x41, 0x2f, 0x43, 0x34, 0x49, 0x54, 0x77, 0x45, \n\t0x66, 0x49, 0x79, 0x67, 0x4a, 0x6d, 0x53, 0x39, 0x30, 0x67, 0x67, 0x2b, 0x52, 0x69, 0x53, 0x45, 0x48, 0x44, \n\t0x79, 0x4d, 0x68, 0x42, 0x49, 0x2b, 0x50, 0x49, 0x43, 0x4c, 0x2f, 0x42, 0x49, 0x58, 0x68, 0x34, 0x76, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x45, 0x6d, 0x77, 0x47, 0x59, 0x30, 0x4a, 0x34, 0x49, 0x6c, 0x42, 0x48, 0x6d, 0x49, 0x44, 0x78, \n\t0x70, 0x50, 0x41, 0x41, 0x35, 0x59, 0x38, 0x53, 0x62, 0x61, 0x6b, 0x4b, 0x2b, 0x6c, 0x65, 0x33, 0x58, 0x76, \n\t0x50, 0x4f, 0x58, 0x76, 0x33, 0x65, 0x6e, 0x39, 0x30, 0x56, 0x66, 0x65, 0x71, 0x56, 0x64, 0x57, 0x39, 0x65, \n\t0x38, 0x2f, 0x37, 0x6e, 0x4c, 0x76, 0x58, 0x39, 0x39, 0x31, 0x37, 0x75, 0x72, 0x71, 0x71, 0x61, 0x31, 0x5c, 0x0a,\n\t0x09, 0x56, 0x58, 0x64, 0x2f, 0x33, 0x32, 0x71, 0x6c, 0x56, 0x44, 0x4f, 0x78, 0x46, 0x68, 0x49, 0x78, 0x76, \n\t0x5a, 0x79, 0x45, 0x5a, 0x57, 0x4b, 0x63, 0x57, 0x71, 0x43, 0x37, 0x43, 0x52, 0x6a, 0x57, 0x78, 0x6b, 0x49, \n\t0x78, 0x73, 0x51, 0x62, 0x57, 0x51, 0x6a, 0x47, 0x31, 0x6d, 0x35, 0x62, 0x45, 0x43, 0x30, 0x6b, 0x59, 0x31, \n\t0x73, 0x5a, 0x4f, 0x57, 0x79, 0x41, 0x64, 0x46, 0x47, 0x4e, 0x72, 0x4b, 0x52, 0x6c, 0x63, 0x73, 0x47, 0x5c, 0x0a,\n\t0x09, 0x52, 0x42, 0x76, 0x5a, 0x79, 0x45, 0x5a, 0x57, 0x4c, 0x68, 0x73, 0x51, 0x62, 0x57, 0x51, 0x6a, 0x47, \n\t0x31, 0x6d, 0x35, 0x62, 0x45, 0x43, 0x30, 0x6b, 0x59, 0x31, 0x73, 0x5a, 0x4f, 0x57, 0x79, 0x41, 0x64, 0x46, \n\t0x47, 0x4e, 0x72, 0x4b, 0x52, 0x6c, 0x63, 0x73, 0x47, 0x52, 0x42, 0x76, 0x5a, 0x79, 0x45, 0x5a, 0x57, 0x4c, \n\t0x68, 0x73, 0x51, 0x62, 0x57, 0x51, 0x6a, 0x47, 0x31, 0x6d, 0x35, 0x62, 0x4b, 0x32, 0x36, 0x41, 0x42, 0x5c, 0x0a,\n\t0x09, 0x76, 0x5a, 0x79, 0x44, 0x72, 0x4c, 0x38, 0x45, 0x39, 0x65, 0x6c, 0x6a, 0x32, 0x2f, 0x39, 0x54, 0x6c, \n\t0x76, 0x57, 0x58, 0x4a, 0x4a, 0x6a, 0x72, 0x62, 0x30, 0x42, 0x70, 0x46, 0x7a, 0x62, 0x70, 0x48, 0x6c, 0x32, \n\t0x4d, 0x68, 0x47, 0x31, 0x6b, 0x34, 0x4f, 0x37, 0x6e, 0x6c, 0x70, 0x4f, 0x50, 0x77, 0x47, 0x34, 0x41, 0x65, \n\t0x41, 0x2b, 0x34, 0x46, 0x6e, 0x41, 0x6d, 0x56, 0x62, 0x65, 0x39, 0x6a, 0x2f, 0x36, 0x4c, 0x64, 0x47, 0x5c, 0x0a,\n\t0x09, 0x34, 0x5a, 0x31, 0x62, 0x66, 0x33, 0x78, 0x78, 0x42, 0x54, 0x77, 0x45, 0x30, 0x6e, 0x63, 0x74, 0x36, \n\t0x38, 0x59, 0x69, 0x32, 0x73, 0x68, 0x47, 0x4d, 0x71, 0x49, 0x67, 0x39, 0x48, 0x33, 0x41, 0x50, 0x2f, 0x58, \n\t0x48, 0x31, 0x77, 0x46, 0x33, 0x41, 0x6e, 0x39, 0x73, 0x30, 0x78, 0x73, 0x41, 0x2f, 0x51, 0x33, 0x67, 0x38, \n\t0x34, 0x42, 0x2f, 0x73, 0x4c, 0x67, 0x53, 0x48, 0x69, 0x33, 0x5a, 0x2b, 0x49, 0x67, 0x32, 0x73, 0x68, 0x5c, 0x0a,\n\t0x09, 0x45, 0x6a, 0x43, 0x6b, 0x4a, 0x2f, 0x6b, 0x77, 0x5a, 0x43, 0x51, 0x61, 0x37, 0x75, 0x75, 0x4e, 0x51, \n\t0x42, 0x50, 0x77, 0x62, 0x38, 0x66, 0x38, 0x41, 0x4e, 0x38, 0x79, 0x2f, 0x5a, 0x30, 0x5a, 0x55, 0x4e, 0x69, \n\t0x44, 0x61, 0x79, 0x45, 0x53, 0x55, 0x4b, 0x51, 0x6b, 0x38, 0x46, 0x2f, 0x6b, 0x4d, 0x6d, 0x79, 0x51, 0x6c, \n\t0x37, 0x51, 0x6c, 0x6c, 0x44, 0x50, 0x77, 0x43, 0x45, 0x77, 0x44, 0x33, 0x7a, 0x4c, 0x74, 0x74, 0x52, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x67, 0x32, 0x49, 0x4e, 0x72, 0x4b, 0x52, 0x56, 0x4c, 0x61, 0x41, 0x6e, 0x79, 0x55, 0x44, 0x48, \n\t0x65, 0x41, 0x78, 0x48, 0x56, 0x41, 0x51, 0x2b, 0x67, 0x72, 0x67, 0x75, 0x31, 0x54, 0x55, 0x2b, 0x78, 0x5a, \n\t0x53, 0x73, 0x69, 0x4d, 0x71, 0x47, 0x78, 0x2f, 0x52, 0x52, 0x6a, 0x62, 0x69, 0x52, 0x56, 0x6c, 0x44, 0x33, \n\t0x77, 0x34, 0x38, 0x75, 0x79, 0x58, 0x5a, 0x32, 0x63, 0x79, 0x35, 0x4a, 0x77, 0x4c, 0x2f, 0x6a, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x33, 0x4a, 0x31, 0x32, 0x36, 0x39, 0x68, 0x2f, 0x38, 0x54, 0x38, 0x6d, 0x35, 0x6e, 0x57, 0x75, \n\t0x2f, 0x73, 0x62, 0x75, 0x41, 0x52, 0x31, 0x67, 0x32, 0x49, 0x4e, 0x72, 0x49, 0x52, 0x6d, 0x4c, 0x35, 0x4c, \n\t0x4f, 0x44, 0x56, 0x48, 0x66, 0x47, 0x66, 0x43, 0x41, 0x66, 0x4b, 0x47, 0x76, 0x70, 0x52, 0x34, 0x46, 0x71, \n\t0x56, 0x5a, 0x67, 0x54, 0x38, 0x61, 0x56, 0x73, 0x47, 0x43, 0x6b, 0x4a, 0x6e, 0x67, 0x47, 0x2f, 0x78, 0x5c, 0x0a,\n\t0x09, 0x36, 0x58, 0x39, 0x34, 0x34, 0x70, 0x49, 0x65, 0x49, 0x64, 0x6c, 0x30, 0x7a, 0x54, 0x61, 0x79, 0x45, \n\t0x53, 0x4a, 0x72, 0x36, 0x4e, 0x38, 0x43, 0x4a, 0x31, 0x75, 0x53, 0x50, 0x51, 0x6f, 0x38, 0x41, 0x68, 0x47, \n\t0x45, 0x76, 0x67, 0x7a, 0x34, 0x53, 0x79, 0x62, 0x64, 0x68, 0x34, 0x43, 0x44, 0x58, 0x41, 0x59, 0x4b, 0x51, \n\t0x73, 0x38, 0x46, 0x33, 0x67, 0x50, 0x38, 0x49, 0x42, 0x75, 0x44, 0x59, 0x41, 0x4f, 0x69, 0x6a, 0x57, 0x5c, 0x0a,\n\t0x09, 0x78, 0x45, 0x79, 0x51, 0x75, 0x41, 0x76, 0x39, 0x49, 0x52, 0x2f, 0x32, 0x63, 0x41, 0x32, 0x30, 0x2f, \n\t0x37, 0x6e, 0x52, 0x44, 0x65, 0x70, 0x62, 0x4b, 0x47, 0x72, 0x4e, 0x77, 0x44, 0x36, 0x52, 0x77, 0x69, 0x42, \n\t0x61, 0x45, 0x76, 0x42, 0x4e, 0x34, 0x4d, 0x33, 0x4f, 0x7a, 0x44, 0x76, 0x7a, 0x78, 0x46, 0x57, 0x59, 0x2b, \n\t0x55, 0x62, 0x45, 0x43, 0x30, 0x6b, 0x63, 0x74, 0x65, 0x6c, 0x44, 0x58, 0x30, 0x62, 0x38, 0x59, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x66, 0x54, 0x39, 0x45, 0x31, 0x74, 0x44, 0x66, 0x42, 0x57, 0x35, 0x74, 0x53, 0x36, 0x64, 0x46, 0x51, \n\t0x65, 0x69, 0x6c, 0x56, 0x4f, 0x41, 0x35, 0x37, 0x73, 0x4e, 0x2f, 0x79, 0x68, 0x68, 0x2f, 0x30, 0x75, 0x55, \n\t0x67, 0x47, 0x78, 0x42, 0x74, 0x35, 0x4c, 0x49, 0x57, 0x42, 0x61, 0x47, 0x76, 0x42, 0x46, 0x34, 0x34, 0x4a, \n\t0x76, 0x6b, 0x48, 0x31, 0x50, 0x47, 0x31, 0x77, 0x44, 0x39, 0x75, 0x53, 0x52, 0x63, 0x4e, 0x33, 0x53, 0x5c, 0x0a,\n\t0x09, 0x73, 0x49, 0x66, 0x53, 0x37, 0x77, 0x71, 0x7a, 0x51, 0x51, 0x41, 0x76, 0x67, 0x56, 0x75, 0x4c, 0x77, \n\t0x64, 0x31, 0x62, 0x41, 0x42, 0x30, 0x55, 0x59, 0x32, 0x41, 0x74, 0x56, 0x45, 0x78, 0x46, 0x66, 0x33, 0x53, \n\t0x50, 0x63, 0x2b, 0x4b, 0x65, 0x6f, 0x52, 0x2f, 0x65, 0x38, 0x46, 0x72, 0x6d, 0x68, 0x4a, 0x56, 0x31, 0x74, \n\t0x45, 0x43, 0x6b, 0x4c, 0x58, 0x55, 0x6b, 0x48, 0x6f, 0x6a, 0x45, 0x6c, 0x37, 0x32, 0x58, 0x66, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x59, 0x41, 0x4f, 0x69, 0x6a, 0x56, 0x7a, 0x47, 0x6f, 0x71, 0x79, 0x68, 0x72, 0x36, 0x46, 0x61, 0x51, \n\t0x7a, 0x5a, 0x4f, 0x33, 0x6b, 0x56, 0x78, 0x45, 0x71, 0x72, 0x68, 0x2b, 0x6d, 0x2f, 0x70, 0x53, 0x47, 0x63, \n\t0x6e, 0x4d, 0x32, 0x34, 0x42, 0x72, 0x77, 0x46, 0x75, 0x4d, 0x65, 0x63, 0x66, 0x41, 0x74, 0x37, 0x61, 0x51, \n\t0x2b, 0x2b, 0x52, 0x6c, 0x77, 0x32, 0x49, 0x4e, 0x6e, 0x4b, 0x35, 0x69, 0x36, 0x4f, 0x39, 0x69, 0x36, 0x5c, 0x0a,\n\t0x09, 0x58, 0x6c, 0x51, 0x58, 0x48, 0x48, 0x37, 0x71, 0x4d, 0x34, 0x42, 0x66, 0x44, 0x39, 0x77, 0x4c, 0x47, \n\t0x57, 0x64, 0x42, 0x38, 0x44, 0x7a, 0x6b, 0x4e, 0x6b, 0x44, 0x66, 0x31, 0x7a, 0x4b, 0x74, 0x2b, 0x51, 0x6c, \n\t0x56, 0x2b, 0x6a, 0x47, 0x72, 0x71, 0x2f, 0x37, 0x47, 0x55, 0x44, 0x6f, 0x6f, 0x31, 0x63, 0x37, 0x76, 0x4b, \n\t0x56, 0x56, 0x4c, 0x36, 0x62, 0x63, 0x66, 0x49, 0x4f, 0x69, 0x6d, 0x4e, 0x51, 0x48, 0x4c, 0x2b, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x61, 0x6a, 0x56, 0x2b, 0x6d, 0x31, 0x54, 0x57, 0x30, 0x4b, 0x6d, 0x37, 0x51, 0x76, 0x6a, 0x4c, 0x67, \n\t0x4f, 0x39, 0x75, 0x53, 0x66, 0x76, 0x4c, 0x73, 0x50, 0x45, 0x50, 0x77, 0x57, 0x62, 0x2b, 0x77, 0x6b, 0x61, \n\t0x55, 0x6c, 0x4f, 0x2b, 0x38, 0x30, 0x68, 0x38, 0x4a, 0x6c, 0x61, 0x46, 0x41, 0x39, 0x56, 0x66, 0x76, 0x65, \n\t0x4f, 0x46, 0x63, 0x45, 0x2b, 0x38, 0x67, 0x6a, 0x67, 0x7a, 0x78, 0x71, 0x44, 0x69, 0x54, 0x31, 0x70, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x30, 0x4f, 0x49, 0x6f, 0x37, 0x37, 0x35, 0x2f, 0x66, 0x54, 0x66, 0x51, 0x55, 0x31, 0x53, 0x33, \n\t0x37, 0x4a, 0x7a, 0x30, 0x76, 0x65, 0x52, 0x66, 0x75, 0x47, 0x46, 0x51, 0x72, 0x36, 0x72, 0x63, 0x37, 0x30, \n\t0x72, 0x32, 0x66, 0x77, 0x65, 0x6c, 0x77, 0x2f, 0x45, 0x53, 0x71, 0x42, 0x62, 0x41, 0x35, 0x32, 0x51, 0x4e, \n\t0x2b, 0x71, 0x36, 0x66, 0x75, 0x49, 0x79, 0x38, 0x62, 0x45, 0x46, 0x31, 0x47, 0x55, 0x72, 0x37, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x42, 0x46, 0x67, 0x6b, 0x4f, 0x59, 0x51, 0x51, 0x41, 0x53, 0x63, 0x32, 0x77, 0x4a, 0x33, 0x4e, \n\t0x63, 0x68, 0x56, 0x55, 0x46, 0x79, 0x4a, 0x34, 0x30, 0x72, 0x67, 0x4b, 0x75, 0x42, 0x4b, 0x6e, 0x4c, 0x73, \n\t0x53, 0x4f, 0x46, 0x59, 0x42, 0x52, 0x61, 0x35, 0x55, 0x42, 0x76, 0x55, 0x70, 0x77, 0x4f, 0x48, 0x63, 0x4f, \n\t0x5a, 0x2f, 0x66, 0x4a, 0x58, 0x43, 0x58, 0x66, 0x4f, 0x62, 0x6e, 0x63, 0x44, 0x4b, 0x43, 0x34, 0x68, 0x5c, 0x0a,\n\t0x09, 0x45, 0x63, 0x44, 0x77, 0x46, 0x6e, 0x63, 0x65, 0x35, 0x68, 0x34, 0x47, 0x46, 0x77, 0x5a, 0x30, 0x48, \n\t0x32, 0x79, 0x76, 0x66, 0x65, 0x6b, 0x41, 0x45, 0x55, 0x45, 0x64, 0x53, 0x4b, 0x70, 0x33, 0x31, 0x79, 0x76, \n\t0x70, 0x56, 0x52, 0x79, 0x56, 0x38, 0x41, 0x50, 0x72, 0x39, 0x6e, 0x32, 0x6e, 0x65, 0x79, 0x64, 0x66, 0x55, \n\t0x54, 0x67, 0x57, 0x38, 0x65, 0x6b, 0x2b, 0x34, 0x65, 0x33, 0x43, 0x35, 0x55, 0x64, 0x2f, 0x54, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x41, 0x74, 0x65, 0x30, 0x70, 0x48, 0x73, 0x44, 0x76, 0x67, 0x75, 0x33, 0x6b, 0x51, 0x32, 0x49, 0x6a, \n\t0x71, 0x53, 0x55, 0x62, 0x36, 0x2b, 0x34, 0x6b, 0x49, 0x67, 0x41, 0x54, 0x6e, 0x61, 0x67, 0x65, 0x42, 0x70, \n\t0x77, 0x47, 0x37, 0x69, 0x62, 0x63, 0x58, 0x49, 0x54, 0x31, 0x63, 0x53, 0x36, 0x6d, 0x33, 0x48, 0x75, 0x5a, \n\t0x71, 0x72, 0x74, 0x4b, 0x34, 0x72, 0x71, 0x2b, 0x68, 0x4b, 0x6b, 0x73, 0x4b, 0x44, 0x79, 0x78, 0x77, 0x5c, 0x0a,\n\t0x09, 0x35, 0x63, 0x53, 0x64, 0x53, 0x37, 0x44, 0x2f, 0x47, 0x56, 0x6e, 0x71, 0x59, 0x4d, 0x34, 0x69, 0x4c, \n\t0x6a, 0x71, 0x4d, 0x6c, 0x48, 0x41, 0x48, 0x63, 0x42, 0x78, 0x2f, 0x33, 0x41, 0x66, 0x54, 0x68, 0x33, 0x48, \n\t0x33, 0x42, 0x66, 0x64, 0x4f, 0x79, 0x34, 0x46, 0x2b, 0x46, 0x43, 0x65, 0x63, 0x2b, 0x4e, 0x78, 0x46, 0x61, \n\t0x59, 0x41, 0x2b, 0x63, 0x6f, 0x6e, 0x6e, 0x72, 0x76, 0x78, 0x50, 0x57, 0x6a, 0x72, 0x4b, 0x46, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x39, 0x67, 0x74, 0x36, 0x46, 0x2f, 0x44, 0x33, 0x61, 0x50, 0x63, 0x4e, 0x42, 0x66, 0x6b, 0x41, 0x78, \n\t0x58, 0x47, 0x41, 0x62, 0x77, 0x4f, 0x2b, 0x75, 0x43, 0x50, 0x64, 0x5a, 0x74, 0x68, 0x65, 0x69, 0x65, 0x75, \n\t0x37, 0x67, 0x39, 0x70, 0x6d, 0x68, 0x38, 0x62, 0x31, 0x6c, 0x64, 0x48, 0x62, 0x54, 0x70, 0x73, 0x7a, 0x67, \n\t0x6e, 0x4d, 0x4d, 0x6f, 0x48, 0x67, 0x36, 0x79, 0x44, 0x4f, 0x41, 0x70, 0x31, 0x4e, 0x74, 0x36, 0x50, 0x5c, 0x0a,\n\t0x09, 0x56, 0x30, 0x48, 0x4c, 0x63, 0x44, 0x67, 0x77, 0x67, 0x67, 0x54, 0x72, 0x30, 0x44, 0x7a, 0x72, 0x6f, \n\t0x4e, 0x68, 0x5a, 0x70, 0x4c, 0x64, 0x52, 0x70, 0x74, 0x74, 0x66, 0x6a, 0x34, 0x58, 0x4e, 0x68, 0x32, 0x33, \n\t0x61, 0x4a, 0x75, 0x6d, 0x38, 0x34, 0x6e, 0x31, 0x32, 0x57, 0x4c, 0x30, 0x74, 0x38, 0x4c, 0x78, 0x66, 0x74, \n\t0x77, 0x38, 0x6e, 0x34, 0x6f, 0x33, 0x67, 0x65, 0x38, 0x44, 0x31, 0x64, 0x38, 0x41, 0x4f, 0x52, 0x38, 0x5c, 0x0a,\n\t0x09, 0x66, 0x61, 0x33, 0x71, 0x2b, 0x68, 0x57, 0x33, 0x66, 0x5a, 0x51, 0x75, 0x38, 0x53, 0x43, 0x36, 0x6b, \n\t0x32, 0x71, 0x4a, 0x52, 0x52, 0x2f, 0x35, 0x75, 0x42, 0x78, 0x37, 0x2b, 0x68, 0x33, 0x41, 0x78, 0x32, 0x6b, \n\t0x66, 0x73, 0x67, 0x2f, 0x79, 0x42, 0x45, 0x37, 0x64, 0x64, 0x53, 0x58, 0x77, 0x62, 0x75, 0x4c, 0x35, 0x51, \n\t0x6c, 0x5a, 0x75, 0x42, 0x44, 0x35, 0x35, 0x31, 0x45, 0x47, 0x30, 0x32, 0x61, 0x48, 0x78, 0x43, 0x45, 0x5c, 0x0a,\n\t0x09, 0x73, 0x4b, 0x48, 0x71, 0x44, 0x79, 0x52, 0x7a, 0x77, 0x50, 0x65, 0x41, 0x47, 0x34, 0x35, 0x34, 0x45, \n\t0x38, 0x42, 0x38, 0x6f, 0x54, 0x46, 0x52, 0x54, 0x55, 0x79, 0x31, 0x41, 0x62, 0x4b, 0x73, 0x71, 0x61, 0x45, \n\t0x64, 0x66, 0x41, 0x53, 0x45, 0x6f, 0x44, 0x6f, 0x77, 0x6b, 0x74, 0x49, 0x78, 0x31, 0x4f, 0x4c, 0x43, 0x4e, \n\t0x74, 0x4d, 0x52, 0x46, 0x62, 0x52, 0x72, 0x58, 0x56, 0x70, 0x50, 0x4f, 0x75, 0x30, 0x39, 0x2b, 0x43, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x32, 0x39, 0x42, 0x69, 0x69, 0x39, 0x74, 0x38, 0x69, 0x37, 0x42, 0x46, 0x66, 0x66, 0x69, 0x2b, \n\t0x4a, 0x2f, 0x41, 0x4f, 0x38, 0x43, 0x39, 0x46, 0x63, 0x63, 0x66, 0x49, 0x46, 0x77, 0x6f, 0x50, 0x2f, 0x7a, \n\t0x5a, 0x6a, 0x55, 0x37, 0x6e, 0x4b, 0x4a, 0x37, 0x38, 0x34, 0x66, 0x70, 0x75, 0x70, 0x72, 0x53, 0x47, 0x66, \n\t0x67, 0x2f, 0x34, 0x4a, 0x73, 0x5a, 0x44, 0x36, 0x43, 0x79, 0x6e, 0x37, 0x6e, 0x6f, 0x49, 0x65, 0x43, 0x5c, 0x0a,\n\t0x09, 0x33, 0x64, 0x45, 0x48, 0x6f, 0x6e, 0x73, 0x4a, 0x43, 0x2b, 0x35, 0x6d, 0x47, 0x56, 0x44, 0x59, 0x67, \n\t0x4f, 0x67, 0x59, 0x7a, 0x65, 0x65, 0x6b, 0x71, 0x46, 0x4a, 0x44, 0x54, 0x43, 0x47, 0x34, 0x45, 0x76, 0x6f, \n\t0x6c, 0x71, 0x33, 0x39, 0x43, 0x4b, 0x61, 0x64, 0x55, 0x74, 0x56, 0x4b, 0x6e, 0x45, 0x34, 0x4a, 0x7a, 0x54, \n\t0x41, 0x6d, 0x51, 0x56, 0x47, 0x50, 0x71, 0x32, 0x47, 0x45, 0x64, 0x76, 0x47, 0x6f, 0x68, 0x47, 0x51, 0x5c, 0x0a,\n\t0x09, 0x49, 0x51, 0x31, 0x55, 0x35, 0x67, 0x36, 0x6a, 0x4b, 0x6b, 0x38, 0x70, 0x56, 0x4e, 0x37, 0x6c, 0x4c, \n\t0x56, 0x44, 0x63, 0x67, 0x75, 0x4f, 0x72, 0x45, 0x51, 0x48, 0x63, 0x43, 0x4d, 0x64, 0x37, 0x77, 0x4c, 0x30, \n\t0x4e, 0x65, 0x44, 0x76, 0x4f, 0x76, 0x52, 0x6e, 0x6b, 0x6f, 0x2b, 0x56, 0x48, 0x62, 0x76, 0x50, 0x35, 0x4f, \n\t0x63, 0x71, 0x44, 0x69, 0x30, 0x68, 0x35, 0x2f, 0x45, 0x6e, 0x41, 0x58, 0x2b, 0x74, 0x56, 0x2b, 0x64, 0x5c, 0x0a,\n\t0x09, 0x58, 0x39, 0x2f, 0x54, 0x37, 0x77, 0x6e, 0x54, 0x30, 0x53, 0x76, 0x6f, 0x39, 0x71, 0x32, 0x63, 0x65, \n\t0x4c, 0x78, 0x36, 0x54, 0x62, 0x6a, 0x4a, 0x59, 0x5a, 0x32, 0x59, 0x42, 0x6f, 0x54, 0x53, 0x57, 0x47, 0x44, \n\t0x31, 0x43, 0x74, 0x43, 0x48, 0x38, 0x35, 0x75, 0x43, 0x2f, 0x43, 0x79, 0x53, 0x75, 0x67, 0x66, 0x50, 0x71, \n\t0x34, 0x32, 0x52, 0x63, 0x54, 0x77, 0x79, 0x69, 0x36, 0x57, 0x4d, 0x50, 0x49, 0x56, 0x63, 0x64, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x76, 0x68, 0x41, 0x47, 0x56, 0x31, 0x62, 0x48, 0x72, 0x76, 0x44, 0x6e, 0x74, 0x2f, 0x7a, 0x78, 0x41, \n\t0x41, 0x72, 0x2f, 0x6c, 0x77, 0x4c, 0x6b, 0x77, 0x4a, 0x38, 0x58, 0x6b, 0x48, 0x33, 0x2f, 0x62, 0x77, 0x2f, \n\t0x4b, 0x76, 0x65, 0x70, 0x76, 0x2b, 0x46, 0x63, 0x2b, 0x42, 0x75, 0x57, 0x6a, 0x4d, 0x48, 0x71, 0x6b, 0x75, \n\t0x71, 0x59, 0x50, 0x6a, 0x49, 0x4b, 0x56, 0x46, 0x69, 0x79, 0x6a, 0x30, 0x48, 0x55, 0x55, 0x42, 0x73, 0x5c, 0x0a,\n\t0x09, 0x41, 0x7a, 0x63, 0x65, 0x55, 0x7a, 0x6f, 0x66, 0x68, 0x57, 0x66, 0x39, 0x32, 0x48, 0x63, 0x50, 0x77, \n\t0x57, 0x75, 0x4e, 0x2f, 0x47, 0x38, 0x53, 0x62, 0x63, 0x38, 0x43, 0x77, 0x56, 0x4c, 0x4c, 0x70, 0x47, 0x76, \n\t0x75, 0x4b, 0x71, 0x32, 0x4c, 0x6e, 0x35, 0x46, 0x41, 0x62, 0x30, 0x57, 0x53, 0x6c, 0x4f, 0x66, 0x41, 0x4c, \n\t0x34, 0x46, 0x7a, 0x32, 0x79, 0x2f, 0x4e, 0x57, 0x2b, 0x75, 0x69, 0x38, 0x58, 0x32, 0x66, 0x69, 0x49, 0x5c, 0x0a,\n\t0x09, 0x31, 0x6b, 0x67, 0x79, 0x38, 0x4c, 0x6b, 0x61, 0x65, 0x43, 0x58, 0x56, 0x4e, 0x68, 0x4f, 0x76, 0x41, \n\t0x48, 0x62, 0x71, 0x6d, 0x4e, 0x71, 0x76, 0x4d, 0x33, 0x34, 0x71, 0x6d, 0x49, 0x76, 0x53, 0x6d, 0x75, 0x64, \n\t0x64, 0x50, 0x39, 0x62, 0x67, 0x31, 0x37, 0x48, 0x78, 0x4b, 0x76, 0x2f, 0x69, 0x42, 0x4a, 0x7a, 0x35, 0x41, \n\t0x69, 0x68, 0x4f, 0x67, 0x68, 0x73, 0x6f, 0x47, 0x41, 0x32, 0x71, 0x66, 0x77, 0x77, 0x71, 0x59, 0x47, 0x5c, 0x0a,\n\t0x09, 0x53, 0x50, 0x4b, 0x33, 0x67, 0x35, 0x51, 0x74, 0x71, 0x69, 0x41, 0x56, 0x6a, 0x49, 0x53, 0x2f, 0x61, \n\t0x52, 0x30, 0x61, 0x4e, 0x51, 0x6e, 0x71, 0x2f, 0x41, 0x4e, 0x50, 0x6f, 0x30, 0x44, 0x44, 0x38, 0x4e, 0x77, \n\t0x30, 0x39, 0x42, 0x65, 0x55, 0x48, 0x35, 0x6a, 0x49, 0x72, 0x30, 0x2f, 0x6c, 0x32, 0x77, 0x31, 0x72, 0x54, \n\t0x50, 0x4b, 0x4d, 0x51, 0x46, 0x48, 0x31, 0x52, 0x52, 0x34, 0x74, 0x77, 0x66, 0x6a, 0x43, 0x35, 0x64, 0x5c, 0x0a,\n\t0x09, 0x66, 0x79, 0x64, 0x2b, 0x4c, 0x4c, 0x36, 0x48, 0x50, 0x43, 0x72, 0x48, 0x6e, 0x76, 0x35, 0x68, 0x2b, \n\t0x6f, 0x79, 0x75, 0x6e, 0x62, 0x6a, 0x7a, 0x48, 0x6f, 0x70, 0x6a, 0x54, 0x78, 0x75, 0x54, 0x36, 0x6c, 0x37, \n\t0x38, 0x51, 0x74, 0x6e, 0x4c, 0x77, 0x53, 0x4c, 0x61, 0x2b, 0x49, 0x67, 0x4f, 0x69, 0x57, 0x54, 0x67, 0x38, \n\t0x77, 0x51, 0x71, 0x38, 0x48, 0x77, 0x31, 0x38, 0x44, 0x4c, 0x61, 0x6e, 0x6c, 0x48, 0x64, 0x6c, 0x57, 0x5c, 0x0a,\n\t0x09, 0x71, 0x78, 0x61, 0x48, 0x54, 0x53, 0x53, 0x53, 0x77, 0x6a, 0x33, 0x55, 0x57, 0x44, 0x32, 0x44, 0x49, \n\t0x71, 0x4c, 0x38, 0x43, 0x35, 0x33, 0x34, 0x4d, 0x7a, 0x4c, 0x36, 0x66, 0x61, 0x41, 0x55, 0x4d, 0x38, 0x51, \n\t0x48, 0x78, 0x61, 0x52, 0x39, 0x56, 0x31, 0x79, 0x68, 0x34, 0x44, 0x49, 0x6c, 0x58, 0x50, 0x53, 0x6f, 0x4a, \n\t0x69, 0x61, 0x65, 0x49, 0x51, 0x63, 0x44, 0x75, 0x34, 0x62, 0x54, 0x39, 0x6f, 0x70, 0x77, 0x48, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x43, 0x69, 0x67, 0x76, 0x49, 0x73, 0x4e, 0x50, 0x77, 0x2f, 0x43, 0x42, 0x43, 0x6b, 0x77, 0x48, 0x39, \n\t0x38, 0x48, 0x77, 0x59, 0x31, 0x51, 0x54, 0x6b, 0x37, 0x56, 0x6c, 0x35, 0x4c, 0x74, 0x34, 0x6f, 0x4c, 0x70, \n\t0x77, 0x59, 0x53, 0x35, 0x54, 0x57, 0x63, 0x6a, 0x77, 0x31, 0x46, 0x32, 0x4b, 0x76, 0x75, 0x4e, 0x6c, 0x63, \n\t0x50, 0x6f, 0x65, 0x4b, 0x74, 0x39, 0x62, 0x74, 0x32, 0x78, 0x64, 0x54, 0x51, 0x38, 0x49, 0x77, 0x61, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x62, 0x6c, 0x70, 0x55, 0x4e, 0x69, 0x46, 0x59, 0x6b, 0x6f, 0x37, 0x76, 0x39, 0x32, 0x6b, 0x63, \n\t0x52, 0x63, 0x48, 0x4b, 0x4d, 0x43, 0x6a, 0x37, 0x66, 0x41, 0x48, 0x77, 0x42, 0x66, 0x57, 0x65, 0x38, 0x72, \n\t0x77, 0x4a, 0x47, 0x6f, 0x30, 0x66, 0x68, 0x2f, 0x4e, 0x76, 0x67, 0x31, 0x41, 0x75, 0x70, 0x65, 0x7a, 0x64, \n\t0x71, 0x53, 0x6c, 0x49, 0x4d, 0x6c, 0x71, 0x32, 0x61, 0x4e, 0x78, 0x51, 0x43, 0x62, 0x49, 0x47, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x45, 0x42, 0x2f, 0x6e, 0x39, 0x44, 0x57, 0x6f, 0x50, 0x43, 0x79, 0x67, 0x45, 0x43, 0x69, 0x4f, 0x34, \n\t0x33, 0x61, 0x65, 0x44, 0x44, 0x75, 0x33, 0x4b, 0x77, 0x74, 0x4d, 0x34, 0x4f, 0x41, 0x2b, 0x35, 0x4f, 0x43, \n\t0x6a, 0x73, 0x50, 0x39, 0x52, 0x32, 0x50, 0x38, 0x51, 0x6c, 0x47, 0x63, 0x37, 0x59, 0x53, 0x53, 0x6a, 0x33, \n\t0x44, 0x62, 0x55, 0x48, 0x66, 0x55, 0x32, 0x75, 0x4b, 0x35, 0x74, 0x6b, 0x37, 0x52, 0x47, 0x33, 0x42, 0x5c, 0x0a,\n\t0x09, 0x62, 0x73, 0x6a, 0x75, 0x2b, 0x35, 0x65, 0x64, 0x6c, 0x30, 0x79, 0x7a, 0x4b, 0x79, 0x41, 0x64, 0x45, \n\t0x53, 0x5a, 0x58, 0x53, 0x33, 0x6e, 0x72, 0x6b, 0x73, 0x41, 0x48, 0x65, 0x42, 0x2b, 0x77, 0x5a, 0x45, 0x76, \n\t0x67, 0x34, 0x33, 0x64, 0x6b, 0x51, 0x6d, 0x4c, 0x31, 0x50, 0x44, 0x79, 0x46, 0x67, 0x46, 0x59, 0x6b, 0x34, \n\t0x6c, 0x4d, 0x46, 0x4c, 0x78, 0x42, 0x77, 0x2f, 0x41, 0x68, 0x54, 0x2b, 0x43, 0x6b, 0x38, 0x38, 0x43, 0x5c, 0x0a,\n\t0x09, 0x38, 0x61, 0x39, 0x51, 0x42, 0x43, 0x4d, 0x2f, 0x68, 0x43, 0x2f, 0x44, 0x42, 0x68, 0x67, 0x6c, 0x55, \n\t0x41, 0x78, 0x42, 0x42, 0x6a, 0x37, 0x74, 0x45, 0x48, 0x46, 0x62, 0x4f, 0x47, 0x32, 0x36, 0x4f, 0x2f, 0x46, \n\t0x67, 0x33, 0x6d, 0x71, 0x63, 0x33, 0x44, 0x4b, 0x49, 0x79, 0x2b, 0x6c, 0x45, 0x36, 0x53, 0x6c, 0x67, 0x2b, \n\t0x38, 0x6d, 0x34, 0x6e, 0x64, 0x76, 0x67, 0x6c, 0x4f, 0x38, 0x43, 0x6c, 0x75, 0x65, 0x51, 0x76, 0x58, 0x5c, 0x0a,\n\t0x09, 0x74, 0x67, 0x2f, 0x37, 0x32, 0x77, 0x39, 0x7a, 0x34, 0x50, 0x70, 0x71, 0x70, 0x75, 0x70, 0x4e, 0x78, \n\t0x42, 0x70, 0x4c, 0x64, 0x72, 0x43, 0x4e, 0x77, 0x32, 0x46, 0x4d, 0x65, 0x65, 0x50, 0x6a, 0x62, 0x64, 0x7a, \n\t0x6b, 0x31, 0x56, 0x6d, 0x63, 0x66, 0x4c, 0x6f, 0x38, 0x42, 0x62, 0x2b, 0x68, 0x66, 0x67, 0x38, 0x70, 0x45, \n\t0x4e, 0x69, 0x4a, 0x59, 0x67, 0x6f, 0x39, 0x2b, 0x2f, 0x68, 0x73, 0x70, 0x70, 0x4b, 0x2b, 0x44, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x4c, 0x69, 0x76, 0x42, 0x37, 0x34, 0x4a, 0x35, 0x4d, 0x34, 0x71, 0x52, 0x52, 0x69, 0x4f, 0x6e, \n\t0x6c, 0x4c, 0x42, 0x56, 0x44, 0x43, 0x79, 0x35, 0x41, 0x6d, 0x6e, 0x57, 0x6b, 0x62, 0x53, 0x37, 0x4b, 0x6a, \n\t0x5a, 0x33, 0x70, 0x2f, 0x42, 0x34, 0x42, 0x51, 0x63, 0x65, 0x30, 0x6f, 0x65, 0x52, 0x68, 0x43, 0x44, 0x42, \n\t0x57, 0x4a, 0x6a, 0x4c, 0x49, 0x4c, 0x52, 0x79, 0x4a, 0x39, 0x73, 0x49, 0x49, 0x55, 0x62, 0x2b, 0x47, 0x5c, 0x0a,\n\t0x09, 0x74, 0x44, 0x6e, 0x75, 0x6f, 0x34, 0x67, 0x74, 0x36, 0x77, 0x67, 0x5a, 0x55, 0x44, 0x69, 0x74, 0x4f, \n\t0x34, 0x45, 0x38, 0x2b, 0x44, 0x45, 0x79, 0x2b, 0x73, 0x38, 0x68, 0x68, 0x2b, 0x43, 0x74, 0x6c, 0x37, 0x4c, \n\t0x2b, 0x79, 0x2f, 0x48, 0x37, 0x6e, 0x77, 0x71, 0x65, 0x35, 0x36, 0x74, 0x48, 0x57, 0x31, 0x64, 0x52, 0x57, \n\t0x4d, 0x71, 0x39, 0x44, 0x42, 0x4b, 0x64, 0x69, 0x2b, 0x74, 0x6a, 0x4f, 0x4a, 0x6b, 0x74, 0x66, 0x54, 0x5c, 0x0a,\n\t0x09, 0x73, 0x6f, 0x58, 0x73, 0x35, 0x53, 0x34, 0x62, 0x45, 0x43, 0x31, 0x51, 0x52, 0x72, 0x2f, 0x6e, 0x5a, \n\t0x2f, 0x63, 0x4c, 0x34, 0x4e, 0x79, 0x74, 0x49, 0x4e, 0x38, 0x47, 0x66, 0x43, 0x4e, 0x77, 0x4a, 0x75, 0x32, \n\t0x50, 0x72, 0x41, 0x4a, 0x47, 0x6c, 0x68, 0x78, 0x4d, 0x42, 0x71, 0x4d, 0x4c, 0x37, 0x36, 0x30, 0x63, 0x32, \n\t0x44, 0x73, 0x33, 0x2b, 0x61, 0x36, 0x50, 0x37, 0x56, 0x49, 0x4e, 0x71, 0x72, 0x78, 0x6b, 0x47, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x50, 0x49, 0x6f, 0x64, 0x49, 0x4f, 0x45, 0x54, 0x65, 0x49, 0x4c, 0x53, 0x4f, 0x39, 0x39, 0x43, 0x51, \n\t0x42, 0x6a, 0x79, 0x69, 0x72, 0x4b, 0x71, 0x54, 0x31, 0x33, 0x62, 0x37, 0x36, 0x32, 0x71, 0x30, 0x6d, 0x66, \n\t0x75, 0x73, 0x47, 0x33, 0x4e, 0x5a, 0x4e, 0x63, 0x4f, 0x70, 0x4c, 0x4b, 0x61, 0x37, 0x63, 0x52, 0x69, 0x37, \n\t0x39, 0x43, 0x58, 0x4c, 0x78, 0x6a, 0x35, 0x41, 0x4c, 0x37, 0x34, 0x62, 0x79, 0x38, 0x59, 0x35, 0x61, 0x5c, 0x0a,\n\t0x09, 0x63, 0x74, 0x55, 0x49, 0x59, 0x61, 0x63, 0x34, 0x32, 0x4c, 0x31, 0x6c, 0x54, 0x4a, 0x70, 0x49, 0x4e, \n\t0x72, 0x4f, 0x70, 0x57, 0x32, 0x51, 0x7a, 0x61, 0x72, 0x59, 0x41, 0x47, 0x66, 0x33, 0x75, 0x64, 0x66, 0x35, \n\t0x49, 0x77, 0x4d, 0x6d, 0x4c, 0x67, 0x65, 0x2f, 0x41, 0x38, 0x56, 0x56, 0x41, 0x41, 0x61, 0x55, 0x5a, 0x6d, \n\t0x61, 0x71, 0x37, 0x61, 0x56, 0x35, 0x6d, 0x67, 0x42, 0x47, 0x6b, 0x6f, 0x30, 0x6c, 0x64, 0x53, 0x65, 0x5c, 0x0a,\n\t0x09, 0x74, 0x5a, 0x30, 0x4a, 0x6c, 0x33, 0x51, 0x49, 0x38, 0x36, 0x52, 0x66, 0x6e, 0x36, 0x38, 0x2f, 0x55, \n\t0x55, 0x6f, 0x6d, 0x30, 0x34, 0x2f, 0x52, 0x4c, 0x59, 0x75, 0x6f, 0x70, 0x6d, 0x4a, 0x4b, 0x78, 0x6f, 0x48, \n\t0x4d, 0x30, 0x55, 0x7a, 0x65, 0x69, 0x5a, 0x32, 0x2f, 0x4a, 0x35, 0x71, 0x76, 0x68, 0x36, 0x42, 0x47, 0x32, \n\t0x41, 0x69, 0x30, 0x62, 0x67, 0x64, 0x42, 0x35, 0x74, 0x35, 0x77, 0x6f, 0x71, 0x36, 0x4f, 0x67, 0x38, 0x5c, 0x0a,\n\t0x09, 0x31, 0x53, 0x67, 0x64, 0x42, 0x57, 0x46, 0x36, 0x67, 0x62, 0x42, 0x4c, 0x4e, 0x65, 0x67, 0x59, 0x79, \n\t0x67, 0x68, 0x79, 0x36, 0x63, 0x50, 0x49, 0x68, 0x58, 0x64, 0x57, 0x55, 0x42, 0x71, 0x5a, 0x72, 0x77, 0x51, \n\t0x4e, 0x72, 0x6b, 0x43, 0x32, 0x62, 0x2b, 0x79, 0x75, 0x77, 0x4f, 0x30, 0x6e, 0x54, 0x4f, 0x49, 0x62, 0x47, \n\t0x6c, 0x4a, 0x39, 0x73, 0x76, 0x71, 0x52, 0x79, 0x77, 0x6c, 0x45, 0x6d, 0x31, 0x47, 0x7a, 0x46, 0x63, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x6f, 0x64, 0x35, 0x2f, 0x67, 0x6a, 0x77, 0x54, 0x67, 0x53, 0x33, 0x44, 0x75, 0x31, 0x65, 0x43, \n\t0x65, 0x56, 0x31, 0x6b, 0x53, 0x4e, 0x49, 0x31, 0x62, 0x4e, 0x49, 0x78, 0x57, 0x62, 0x52, 0x6c, 0x6c, 0x6e, \n\t0x4e, 0x65, 0x68, 0x4f, 0x48, 0x30, 0x73, 0x49, 0x7a, 0x6d, 0x6f, 0x6e, 0x4e, 0x64, 0x6e, 0x58, 0x67, 0x62, \n\t0x75, 0x4f, 0x4f, 0x6c, 0x49, 0x57, 0x50, 0x44, 0x7a, 0x68, 0x47, 0x31, 0x33, 0x72, 0x44, 0x55, 0x44, 0x5c, 0x0a,\n\t0x09, 0x59, 0x64, 0x35, 0x51, 0x5a, 0x52, 0x6e, 0x5a, 0x51, 0x6d, 0x7a, 0x56, 0x38, 0x62, 0x58, 0x76, 0x53, \n\t0x45, 0x76, 0x6f, 0x6d, 0x6b, 0x57, 0x2b, 0x49, 0x32, 0x30, 0x31, 0x44, 0x57, 0x6c, 0x65, 0x38, 0x31, 0x4c, \n\t0x6c, 0x4e, 0x63, 0x41, 0x64, 0x65, 0x79, 0x72, 0x75, 0x32, 0x4f, 0x66, 0x41, 0x4e, 0x58, 0x38, 0x64, 0x75, \n\t0x66, 0x52, 0x42, 0x35, 0x50, 0x7a, 0x76, 0x49, 0x78, 0x66, 0x65, 0x57, 0x59, 0x33, 0x51, 0x44, 0x61, 0x5c, 0x0a,\n\t0x09, 0x37, 0x71, 0x72, 0x44, 0x76, 0x63, 0x4e, 0x75, 0x79, 0x4d, 0x41, 0x56, 0x55, 0x73, 0x62, 0x38, 0x46, \n\t0x2f, 0x41, 0x57, 0x51, 0x6a, 0x71, 0x57, 0x77, 0x73, 0x6f, 0x6a, 0x6c, 0x49, 0x41, 0x79, 0x41, 0x41, 0x76, \n\t0x67, 0x52, 0x34, 0x4e, 0x55, 0x67, 0x31, 0x35, 0x46, 0x74, 0x58, 0x57, 0x30, 0x6b, 0x53, 0x58, 0x67, 0x50, \n\t0x4c, 0x71, 0x48, 0x4f, 0x4f, 0x45, 0x66, 0x53, 0x33, 0x6a, 0x4c, 0x61, 0x75, 0x68, 0x64, 0x4d, 0x76, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x4a, 0x70, 0x78, 0x33, 0x57, 0x59, 0x5a, 0x42, 0x51, 0x76, 0x49, 0x57, 0x44, 0x56, 0x52, 0x6d, \n\t0x67, 0x47, 0x75, 0x74, 0x6c, 0x71, 0x32, 0x6c, 0x44, 0x57, 0x6c, 0x4c, 0x4b, 0x4a, 0x67, 0x36, 0x64, 0x54, \n\t0x35, 0x4f, 0x39, 0x6f, 0x74, 0x6f, 0x77, 0x48, 0x43, 0x4e, 0x6e, 0x41, 0x38, 0x6a, 0x73, 0x63, 0x52, 0x57, \n\t0x30, 0x35, 0x68, 0x4d, 0x75, 0x59, 0x49, 0x75, 0x66, 0x42, 0x48, 0x6c, 0x48, 0x73, 0x66, 0x51, 0x66, 0x5c, 0x0a,\n\t0x09, 0x59, 0x2b, 0x6d, 0x71, 0x38, 0x54, 0x67, 0x47, 0x4f, 0x66, 0x44, 0x56, 0x74, 0x74, 0x43, 0x2b, 0x75, \n\t0x7a, 0x38, 0x76, 0x65, 0x41, 0x66, 0x33, 0x38, 0x35, 0x57, 0x55, 0x4f, 0x77, 0x73, 0x59, 0x69, 0x57, 0x49, \n\t0x71, 0x50, 0x66, 0x75, 0x61, 0x45, 0x36, 0x71, 0x4a, 0x7a, 0x51, 0x48, 0x6b, 0x42, 0x68, 0x7a, 0x6b, 0x6c, \n\t0x59, 0x74, 0x6f, 0x42, 0x71, 0x7a, 0x4f, 0x74, 0x6e, 0x47, 0x58, 0x55, 0x4f, 0x36, 0x34, 0x66, 0x69, 0x5c, 0x0a,\n\t0x09, 0x39, 0x4c, 0x47, 0x4d, 0x68, 0x67, 0x39, 0x57, 0x50, 0x71, 0x4d, 0x54, 0x6e, 0x78, 0x73, 0x37, 0x6a, \n\t0x36, 0x32, 0x6a, 0x47, 0x62, 0x7a, 0x46, 0x6f, 0x69, 0x77, 0x64, 0x34, 0x39, 0x65, 0x70, 0x56, 0x57, 0x68, \n\t0x48, 0x64, 0x48, 0x31, 0x64, 0x79, 0x46, 0x65, 0x4e, 0x79, 0x4d, 0x6d, 0x57, 0x54, 0x37, 0x74, 0x6c, 0x39, \n\t0x49, 0x54, 0x6a, 0x48, 0x58, 0x43, 0x6a, 0x32, 0x50, 0x6b, 0x64, 0x70, 0x69, 0x50, 0x55, 0x2b, 0x66, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x34, 0x42, 0x72, 0x69, 0x54, 0x7a, 0x32, 0x64, 0x77, 0x36, 0x69, 0x55, 0x77, 0x4f, 0x6b, 0x76, \n\t0x35, 0x2b, 0x4c, 0x73, 0x6f, 0x4c, 0x37, 0x77, 0x4c, 0x79, 0x6f, 0x74, 0x4e, 0x4f, 0x51, 0x59, 0x6e, 0x4a, \n\t0x34, 0x55, 0x51, 0x65, 0x50, 0x2f, 0x51, 0x52, 0x76, 0x4b, 0x79, 0x41, 0x64, 0x45, 0x55, 0x4d, 0x6e, 0x72, \n\t0x4c, 0x45, 0x36, 0x75, 0x44, 0x36, 0x75, 0x56, 0x39, 0x48, 0x72, 0x67, 0x66, 0x52, 0x74, 0x77, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x71, 0x77, 0x61, 0x62, 0x6b, 0x63, 0x73, 0x46, 0x52, 0x6e, 0x74, 0x2f, 0x42, 0x6f, 0x4d, 0x72, 0x4b, \n\t0x72, 0x39, 0x4a, 0x46, 0x6b, 0x44, 0x36, 0x32, 0x49, 0x43, 0x42, 0x49, 0x62, 0x72, 0x62, 0x4a, 0x6a, 0x36, \n\t0x68, 0x30, 0x39, 0x63, 0x6b, 0x7a, 0x76, 0x43, 0x51, 0x56, 0x2b, 0x69, 0x65, 0x42, 0x52, 0x69, 0x4a, 0x4b, \n\t0x6a, 0x63, 0x34, 0x4c, 0x69, 0x47, 0x4d, 0x67, 0x4a, 0x32, 0x30, 0x53, 0x31, 0x68, 0x56, 0x51, 0x41, 0x5c, 0x0a,\n\t0x09, 0x55, 0x31, 0x47, 0x56, 0x58, 0x6e, 0x33, 0x45, 0x35, 0x31, 0x58, 0x34, 0x4f, 0x72, 0x4b, 0x4b, 0x37, \n\t0x34, 0x49, 0x6f, 0x6f, 0x7a, 0x66, 0x77, 0x47, 0x35, 0x2b, 0x42, 0x37, 0x4b, 0x38, 0x32, 0x39, 0x46, 0x44, \n\t0x6a, 0x34, 0x46, 0x4f, 0x37, 0x33, 0x39, 0x51, 0x6b, 0x48, 0x2b, 0x47, 0x4f, 0x53, 0x6a, 0x73, 0x35, 0x6d, \n\t0x34, 0x52, 0x31, 0x73, 0x32, 0x49, 0x4a, 0x70, 0x41, 0x52, 0x6d, 0x39, 0x35, 0x45, 0x71, 0x6f, 0x42, 0x5c, 0x0a,\n\t0x09, 0x33, 0x41, 0x72, 0x75, 0x58, 0x79, 0x4c, 0x79, 0x56, 0x35, 0x73, 0x58, 0x75, 0x69, 0x43, 0x47, 0x6b, \n\t0x57, 0x70, 0x46, 0x73, 0x38, 0x43, 0x49, 0x46, 0x73, 0x44, 0x31, 0x6b, 0x57, 0x58, 0x44, 0x36, 0x4f, 0x4a, \n\t0x37, 0x59, 0x48, 0x41, 0x47, 0x74, 0x71, 0x35, 0x73, 0x41, 0x52, 0x41, 0x4e, 0x44, 0x4b, 0x4c, 0x35, 0x51, \n\t0x71, 0x61, 0x62, 0x36, 0x71, 0x30, 0x66, 0x77, 0x58, 0x63, 0x66, 0x5a, 0x63, 0x76, 0x45, 0x62, 0x79, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x6f, 0x44, 0x46, 0x4b, 0x67, 0x31, 0x62, 0x6f, 0x71, 0x65, 0x44, 0x6b, 0x70, 0x4b, 0x31, 0x41, \n\t0x78, 0x51, 0x4e, 0x77, 0x4f, 0x31, 0x65, 0x54, 0x4b, 0x62, 0x53, 0x4b, 0x34, 0x68, 0x56, 0x6e, 0x69, 0x63, \n\t0x6b, 0x41, 0x39, 0x79, 0x69, 0x64, 0x55, 0x33, 0x63, 0x55, 0x54, 0x7a, 0x32, 0x4a, 0x77, 0x34, 0x74, 0x6e, \n\t0x49, 0x77, 0x53, 0x63, 0x6f, 0x44, 0x7a, 0x35, 0x57, 0x41, 0x61, 0x6d, 0x33, 0x6c, 0x4b, 0x38, 0x72, 0x5c, 0x0a,\n\t0x09, 0x65, 0x42, 0x73, 0x44, 0x39, 0x78, 0x37, 0x6b, 0x34, 0x65, 0x66, 0x69, 0x72, 0x6e, 0x37, 0x48, 0x42, \n\t0x4e, 0x64, 0x65, 0x48, 0x72, 0x4c, 0x78, 0x45, 0x66, 0x57, 0x51, 0x30, 0x5a, 0x75, 0x44, 0x55, 0x31, 0x4c, \n\t0x41, 0x63, 0x51, 0x62, 0x6b, 0x48, 0x77, 0x4c, 0x66, 0x54, 0x72, 0x31, 0x4a, 0x6c, 0x73, 0x51, 0x2f, 0x64, \n\t0x6f, 0x6c, 0x6c, 0x70, 0x48, 0x2b, 0x39, 0x49, 0x51, 0x4a, 0x4c, 0x4c, 0x35, 0x2f, 0x52, 0x6a, 0x50, 0x5c, 0x0a,\n\t0x09, 0x34, 0x69, 0x49, 0x4e, 0x6b, 0x33, 0x71, 0x43, 0x33, 0x5a, 0x4c, 0x44, 0x36, 0x6a, 0x30, 0x4e, 0x30, \n\t0x70, 0x6a, 0x73, 0x50, 0x70, 0x6c, 0x30, 0x4b, 0x78, 0x53, 0x2b, 0x51, 0x48, 0x71, 0x76, 0x31, 0x45, 0x77, \n\t0x54, 0x2f, 0x6b, 0x4d, 0x72, 0x36, 0x66, 0x2f, 0x49, 0x68, 0x5a, 0x39, 0x66, 0x36, 0x6c, 0x49, 0x32, 0x32, \n\t0x78, 0x54, 0x79, 0x6a, 0x6a, 0x4f, 0x39, 0x4a, 0x68, 0x47, 0x30, 0x2b, 0x42, 0x75, 0x47, 0x32, 0x71, 0x5c, 0x0a,\n\t0x09, 0x47, 0x65, 0x4a, 0x62, 0x4e, 0x48, 0x34, 0x6d, 0x68, 0x79, 0x74, 0x4b, 0x63, 0x4e, 0x76, 0x41, 0x54, \n\t0x75, 0x56, 0x6a, 0x63, 0x6c, 0x75, 0x56, 0x2f, 0x6d, 0x4b, 0x33, 0x71, 0x6f, 0x54, 0x52, 0x6f, 0x35, 0x53, \n\t0x58, 0x33, 0x6b, 0x2b, 0x35, 0x66, 0x31, 0x2b, 0x2b, 0x6e, 0x70, 0x52, 0x73, 0x38, 0x55, 0x75, 0x66, 0x63, \n\t0x75, 0x37, 0x2b, 0x62, 0x38, 0x63, 0x56, 0x2f, 0x78, 0x30, 0x52, 0x77, 0x62, 0x6e, 0x4c, 0x42, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x61, 0x39, 0x2b, 0x62, 0x49, 0x42, 0x55, 0x62, 0x65, 0x4d, 0x33, 0x6e, 0x77, 0x54, 0x2f, 0x6b, 0x56, \n\t0x7a, 0x77, 0x46, 0x2f, 0x48, 0x79, 0x62, 0x38, 0x42, 0x72, 0x6b, 0x74, 0x65, 0x76, 0x6d, 0x53, 0x78, 0x36, \n\t0x47, 0x55, 0x4f, 0x6f, 0x36, 0x33, 0x72, 0x34, 0x4e, 0x52, 0x7a, 0x69, 0x59, 0x62, 0x59, 0x57, 0x34, 0x66, \n\t0x32, 0x4c, 0x53, 0x77, 0x30, 0x74, 0x42, 0x72, 0x6e, 0x74, 0x6f, 0x75, 0x47, 0x37, 0x53, 0x32, 0x41, 0x5c, 0x0a,\n\t0x09, 0x57, 0x68, 0x7a, 0x61, 0x4e, 0x63, 0x42, 0x55, 0x66, 0x41, 0x32, 0x30, 0x72, 0x55, 0x59, 0x50, 0x57, \n\t0x7a, 0x37, 0x65, 0x41, 0x38, 0x65, 0x42, 0x64, 0x6e, 0x68, 0x58, 0x66, 0x30, 0x38, 0x67, 0x37, 0x67, 0x52, \n\t0x68, 0x53, 0x78, 0x47, 0x48, 0x51, 0x38, 0x70, 0x7a, 0x6c, 0x4a, 0x63, 0x2b, 0x51, 0x4c, 0x6e, 0x33, 0x5a, \n\t0x2b, 0x51, 0x73, 0x56, 0x38, 0x66, 0x6a, 0x62, 0x50, 0x46, 0x66, 0x38, 0x48, 0x33, 0x45, 0x75, 0x33, 0x5c, 0x0a,\n\t0x09, 0x48, 0x46, 0x2f, 0x77, 0x37, 0x79, 0x68, 0x31, 0x58, 0x59, 0x34, 0x61, 0x35, 0x36, 0x2b, 0x39, 0x6a, \n\t0x6e, 0x63, 0x5a, 0x68, 0x6c, 0x41, 0x36, 0x49, 0x5a, 0x5a, 0x66, 0x53, 0x6d, 0x6d, 0x35, 0x71, 0x41, 0x34, \n\t0x79, 0x6e, 0x41, 0x6a, 0x34, 0x50, 0x38, 0x2b, 0x52, 0x51, 0x55, 0x53, 0x6a, 0x59, 0x77, 0x38, 0x73, 0x66, \n\t0x2b, 0x2f, 0x4c, 0x48, 0x62, 0x34, 0x64, 0x6a, 0x54, 0x46, 0x41, 0x78, 0x79, 0x6b, 0x43, 0x6b, 0x79, 0x5c, 0x0a,\n\t0x09, 0x73, 0x48, 0x42, 0x6f, 0x41, 0x45, 0x56, 0x7a, 0x6a, 0x62, 0x49, 0x77, 0x55, 0x6e, 0x4f, 0x4e, 0x63, \n\t0x76, 0x4f, 0x4f, 0x38, 0x4c, 0x43, 0x4c, 0x7a, 0x75, 0x6d, 0x38, 0x37, 0x58, 0x56, 0x32, 0x68, 0x34, 0x41, \n\t0x74, 0x6c, 0x63, 0x38, 0x75, 0x75, 0x4f, 0x4f, 0x49, 0x71, 0x79, 0x77, 0x6a, 0x56, 0x78, 0x45, 0x4c, 0x4b, \n\t0x63, 0x39, 0x54, 0x58, 0x6e, 0x77, 0x33, 0x35, 0x66, 0x36, 0x39, 0x55, 0x54, 0x55, 0x56, 0x38, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x34, 0x47, 0x2f, 0x49, 0x36, 0x76, 0x4c, 0x77, 0x65, 0x4f, 0x45, 0x6c, 0x66, 0x38, 0x4f, 0x4d, 0x35, \n\t0x39, 0x4c, 0x79, 0x4a, 0x6e, 0x6a, 0x7a, 0x71, 0x4d, 0x4e, 0x69, 0x43, 0x61, 0x51, 0x59, 0x5a, 0x76, 0x76, \n\t0x42, 0x6b, 0x51, 0x6e, 0x4a, 0x4d, 0x64, 0x34, 0x4c, 0x75, 0x41, 0x37, 0x38, 0x57, 0x78, 0x57, 0x38, 0x56, \n\t0x4b, 0x42, 0x68, 0x52, 0x4b, 0x5a, 0x6f, 0x5a, 0x52, 0x47, 0x4f, 0x5a, 0x66, 0x45, 0x49, 0x77, 0x57, 0x5c, 0x0a,\n\t0x09, 0x74, 0x58, 0x31, 0x49, 0x6c, 0x44, 0x63, 0x4e, 0x6a, 0x45, 0x37, 0x65, 0x42, 0x64, 0x76, 0x58, 0x71, \n\t0x34, 0x62, 0x65, 0x4e, 0x71, 0x78, 0x76, 0x41, 0x64, 0x4c, 0x57, 0x39, 0x53, 0x70, 0x77, 0x45, 0x54, 0x77, \n\t0x43, 0x5a, 0x4d, 0x78, 0x30, 0x67, 0x41, 0x51, 0x75, 0x5a, 0x6c, 0x4a, 0x6c, 0x42, 0x4b, 0x39, 0x63, 0x65, \n\t0x6d, 0x73, 0x78, 0x68, 0x57, 0x73, 0x44, 0x4a, 0x4c, 0x63, 0x55, 0x6b, 0x41, 0x6f, 0x2f, 0x47, 0x62, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x41, 0x68, 0x6d, 0x63, 0x5a, 0x58, 0x66, 0x79, 0x44, 0x32, 0x6f, 0x65, 0x30, 0x4a, 0x62, 0x2b, \n\t0x4b, 0x6b, 0x2f, 0x74, 0x6f, 0x74, 0x69, 0x37, 0x78, 0x76, 0x6a, 0x52, 0x58, 0x66, 0x42, 0x72, 0x6e, 0x2f, \n\t0x68, 0x37, 0x49, 0x7a, 0x33, 0x74, 0x41, 0x34, 0x61, 0x34, 0x38, 0x65, 0x6b, 0x44, 0x61, 0x67, 0x47, 0x67, \n\t0x4b, 0x47, 0x62, 0x37, 0x78, 0x56, 0x6c, 0x53, 0x6a, 0x66, 0x37, 0x46, 0x7a, 0x2f, 0x41, 0x53, 0x55, 0x5c, 0x0a,\n\t0x09, 0x64, 0x39, 0x51, 0x4a, 0x36, 0x69, 0x72, 0x59, 0x77, 0x4b, 0x69, 0x4b, 0x52, 0x4d, 0x58, 0x5a, 0x76, \n\t0x50, 0x47, 0x4e, 0x62, 0x77, 0x64, 0x4f, 0x76, 0x78, 0x69, 0x4b, 0x59, 0x2b, 0x53, 0x67, 0x45, 0x67, 0x4d, \n\t0x6b, 0x7a, 0x41, 0x64, 0x53, 0x6c, 0x6c, 0x4c, 0x6b, 0x38, 0x32, 0x6e, 0x53, 0x75, 0x71, 0x7a, 0x46, 0x59, \n\t0x32, 0x47, 0x58, 0x4f, 0x32, 0x65, 0x74, 0x70, 0x52, 0x79, 0x4d, 0x55, 0x6c, 0x39, 0x53, 0x62, 0x43, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x70, 0x63, 0x72, 0x48, 0x6c, 0x72, 0x61, 0x54, 0x67, 0x44, 0x33, 0x4e, 0x41, 0x51, 0x58, 0x6e, \n\t0x77, 0x53, 0x63, 0x6f, 0x4c, 0x62, 0x32, 0x64, 0x72, 0x2f, 0x77, 0x66, 0x42, 0x6a, 0x64, 0x54, 0x39, 0x52, \n\t0x6a, 0x41, 0x43, 0x35, 0x33, 0x34, 0x44, 0x78, 0x37, 0x64, 0x51, 0x66, 0x54, 0x51, 0x41, 0x6e, 0x4d, 0x4e, \n\t0x64, 0x38, 0x62, 0x61, 0x78, 0x7a, 0x2b, 0x57, 0x77, 0x79, 0x41, 0x5a, 0x45, 0x45, 0x30, 0x6f, 0x46, 0x5c, 0x0a,\n\t0x09, 0x49, 0x51, 0x43, 0x4f, 0x51, 0x66, 0x6e, 0x50, 0x67, 0x62, 0x39, 0x50, 0x66, 0x64, 0x73, 0x57, 0x46, \n\t0x47, 0x48, 0x34, 0x64, 0x39, 0x6b, 0x77, 0x4b, 0x75, 0x50, 0x6a, 0x77, 0x77, 0x4b, 0x6a, 0x72, 0x61, 0x76, \n\t0x67, 0x35, 0x50, 0x4e, 0x61, 0x72, 0x43, 0x46, 0x37, 0x72, 0x43, 0x63, 0x6e, 0x57, 0x6f, 0x64, 0x32, 0x50, \n\t0x47, 0x6e, 0x52, 0x4a, 0x64, 0x61, 0x54, 0x76, 0x56, 0x37, 0x6e, 0x6e, 0x7a, 0x74, 0x6e, 0x75, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x5a, 0x62, 0x6c, 0x32, 0x62, 0x4c, 0x30, 0x6c, 0x31, 0x48, 0x32, 0x75, 0x41, 0x65, 0x53, 0x44, \n\t0x56, 0x45, 0x79, 0x5a, 0x4c, 0x75, 0x50, 0x67, 0x4c, 0x38, 0x50, 0x68, 0x50, 0x41, 0x4f, 0x65, 0x71, 0x50, \n\t0x49, 0x70, 0x51, 0x68, 0x78, 0x47, 0x4d, 0x7a, 0x75, 0x48, 0x34, 0x42, 0x7a, 0x6a, 0x33, 0x6e, 0x32, 0x70, \n\t0x6e, 0x39, 0x68, 0x47, 0x42, 0x30, 0x51, 0x5a, 0x45, 0x50, 0x57, 0x58, 0x34, 0x68, 0x69, 0x66, 0x37, 0x5c, 0x0a,\n\t0x09, 0x49, 0x77, 0x45, 0x6e, 0x7a, 0x77, 0x5a, 0x2b, 0x42, 0x76, 0x67, 0x63, 0x33, 0x65, 0x69, 0x58, 0x44, \n\t0x69, 0x50, 0x74, 0x4c, 0x34, 0x72, 0x79, 0x6b, 0x66, 0x69, 0x61, 0x64, 0x59, 0x56, 0x52, 0x62, 0x70, 0x66, \n\t0x48, 0x33, 0x53, 0x66, 0x44, 0x38, 0x63, 0x2f, 0x78, 0x69, 0x53, 0x65, 0x42, 0x55, 0x63, 0x34, 0x79, 0x43, \n\t0x6b, 0x35, 0x6e, 0x42, 0x53, 0x54, 0x72, 0x66, 0x77, 0x71, 0x7a, 0x73, 0x68, 0x50, 0x4c, 0x4b, 0x41, 0x5c, 0x0a,\n\t0x09, 0x63, 0x76, 0x32, 0x77, 0x56, 0x73, 0x67, 0x31, 0x4c, 0x48, 0x2b, 0x53, 0x6a, 0x4e, 0x4e, 0x68, 0x57, \n\t0x55, 0x66, 0x44, 0x32, 0x55, 0x6a, 0x38, 0x4c, 0x6a, 0x50, 0x77, 0x5a, 0x37, 0x76, 0x2b, 0x62, 0x76, 0x4a, \n\t0x51, 0x73, 0x6a, 0x63, 0x50, 0x77, 0x47, 0x7a, 0x6e, 0x30, 0x6a, 0x49, 0x70, 0x38, 0x34, 0x4b, 0x6a, 0x44, \n\t0x61, 0x67, 0x4b, 0x69, 0x48, 0x4e, 0x42, 0x43, 0x69, 0x41, 0x4c, 0x34, 0x4c, 0x56, 0x2f, 0x34, 0x66, 0x5c, 0x0a,\n\t0x09, 0x52, 0x48, 0x4f, 0x72, 0x4e, 0x6a, 0x43, 0x4b, 0x6b, 0x73, 0x34, 0x45, 0x6f, 0x77, 0x47, 0x63, 0x66, \n\t0x48, 0x61, 0x31, 0x46, 0x4b, 0x53, 0x33, 0x5a, 0x61, 0x51, 0x62, 0x66, 0x47, 0x62, 0x30, 0x4b, 0x78, 0x72, \n\t0x65, 0x44, 0x33, 0x41, 0x4a, 0x58, 0x53, 0x5a, 0x58, 0x41, 0x63, 0x46, 0x70, 0x38, 0x47, 0x56, 0x67, 0x45, \n\t0x69, 0x33, 0x37, 0x4d, 0x50, 0x36, 0x68, 0x74, 0x72, 0x68, 0x6b, 0x46, 0x4d, 0x35, 0x32, 0x35, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x53, 0x4f, 0x4f, 0x73, 0x37, 0x42, 0x77, 0x58, 0x76, 0x67, 0x2f, 0x41, 0x39, 0x41, 0x65, 0x57, 0x38, \n\t0x58, 0x6a, 0x42, 0x37, 0x47, 0x75, 0x56, 0x63, 0x68, 0x2f, 0x46, 0x4a, 0x77, 0x63, 0x4c, 0x73, 0x72, 0x33, \n\t0x6a, 0x72, 0x32, 0x32, 0x61, 0x79, 0x72, 0x62, 0x45, 0x41, 0x30, 0x52, 0x6f, 0x61, 0x2f, 0x66, 0x52, 0x74, \n\t0x2b, 0x2f, 0x73, 0x2b, 0x54, 0x71, 0x4b, 0x79, 0x67, 0x6c, 0x77, 0x4d, 0x5a, 0x55, 0x4c, 0x54, 0x41, 0x5c, 0x0a,\n\t0x09, 0x53, 0x50, 0x75, 0x4c, 0x77, 0x49, 0x44, 0x43, 0x79, 0x41, 0x5a, 0x47, 0x2f, 0x76, 0x52, 0x78, 0x4f, \n\t0x50, 0x31, 0x43, 0x71, 0x75, 0x36, 0x4c, 0x74, 0x56, 0x59, 0x73, 0x6a, 0x44, 0x52, 0x6f, 0x31, 0x44, 0x6b, \n\t0x47, 0x55, 0x47, 0x67, 0x67, 0x35, 0x47, 0x41, 0x55, 0x72, 0x4a, 0x54, 0x67, 0x4f, 0x37, 0x4a, 0x51, 0x4d, \n\t0x31, 0x42, 0x71, 0x37, 0x59, 0x70, 0x6c, 0x75, 0x6d, 0x6e, 0x59, 0x61, 0x38, 0x32, 0x4f, 0x41, 0x72, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x52, 0x4e, 0x2b, 0x33, 0x4c, 0x51, 0x75, 0x44, 0x43, 0x66, 0x34, 0x47, 0x4c, 0x50, 0x2b, 0x6e, \n\t0x66, 0x41, 0x77, 0x57, 0x6a, 0x49, 0x67, 0x41, 0x55, 0x63, 0x4f, 0x37, 0x2f, 0x42, 0x76, 0x63, 0x64, 0x49, \n\t0x42, 0x63, 0x50, 0x4d, 0x34, 0x77, 0x32, 0x49, 0x47, 0x71, 0x52, 0x34, 0x57, 0x38, 0x39, 0x68, 0x62, 0x6f, \n\t0x68, 0x4f, 0x37, 0x34, 0x51, 0x2b, 0x42, 0x6d, 0x63, 0x58, 0x42, 0x63, 0x6c, 0x69, 0x6b, 0x41, 0x52, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x2f, 0x6f, 0x4e, 0x6a, 0x47, 0x61, 0x45, 0x30, 0x66, 0x5a, 0x31, 0x63, 0x50, 0x4c, 0x7a, 0x30, \n\t0x59, 0x37, 0x64, 0x31, 0x49, 0x47, 0x74, 0x6a, 0x79, 0x31, 0x45, 0x4c, 0x49, 0x78, 0x69, 0x4b, 0x38, 0x51, \n\t0x35, 0x6b, 0x31, 0x39, 0x75, 0x50, 0x6c, 0x48, 0x4f, 0x64, 0x39, 0x54, 0x71, 0x70, 0x4e, 0x59, 0x2b, 0x6f, \n\t0x51, 0x43, 0x64, 0x48, 0x4d, 0x6a, 0x61, 0x75, 0x6e, 0x44, 0x42, 0x4d, 0x68, 0x6f, 0x30, 0x2b, 0x54, 0x5c, 0x0a,\n\t0x09, 0x43, 0x41, 0x30, 0x55, 0x66, 0x67, 0x2f, 0x44, 0x2b, 0x44, 0x30, 0x59, 0x65, 0x6f, 0x59, 0x56, 0x52, \n\t0x34, 0x49, 0x44, 0x55, 0x77, 0x65, 0x69, 0x2b, 0x34, 0x76, 0x77, 0x54, 0x79, 0x51, 0x5a, 0x7a, 0x44, 0x6e, \n\t0x54, 0x6c, 0x38, 0x4d, 0x4e, 0x71, 0x41, 0x4b, 0x43, 0x4d, 0x56, 0x68, 0x41, 0x41, 0x6f, 0x51, 0x50, 0x34, \n\t0x4a, 0x54, 0x72, 0x36, 0x50, 0x30, 0x47, 0x49, 0x36, 0x51, 0x62, 0x46, 0x47, 0x4d, 0x46, 0x71, 0x44, 0x5c, 0x0a,\n\t0x09, 0x46, 0x66, 0x75, 0x67, 0x59, 0x5a, 0x52, 0x52, 0x32, 0x44, 0x58, 0x48, 0x69, 0x41, 0x4b, 0x4f, 0x50, \n\t0x39, 0x56, 0x76, 0x4b, 0x47, 0x61, 0x37, 0x58, 0x4e, 0x6f, 0x79, 0x43, 0x6f, 0x31, 0x66, 0x77, 0x53, 0x63, \n\t0x7a, 0x65, 0x70, 0x5a, 0x61, 0x4d, 0x34, 0x4d, 0x57, 0x47, 0x47, 0x58, 0x67, 0x30, 0x4a, 0x5a, 0x58, 0x44, \n\t0x53, 0x65, 0x74, 0x30, 0x33, 0x65, 0x76, 0x73, 0x50, 0x34, 0x6d, 0x44, 0x39, 0x51, 0x77, 0x38, 0x78, 0x5c, 0x0a,\n\t0x09, 0x70, 0x31, 0x62, 0x4c, 0x74, 0x32, 0x31, 0x72, 0x4a, 0x69, 0x42, 0x42, 0x66, 0x2b, 0x4d, 0x31, 0x7a, \n\t0x36, 0x71, 0x65, 0x71, 0x34, 0x74, 0x75, 0x68, 0x38, 0x4a, 0x56, 0x59, 0x77, 0x4f, 0x6f, 0x39, 0x7a, 0x58, \n\t0x77, 0x2f, 0x79, 0x43, 0x2b, 0x47, 0x63, 0x4f, 0x33, 0x31, 0x34, 0x67, 0x4c, 0x51, 0x42, 0x6b, 0x5a, 0x48, \n\t0x68, 0x62, 0x33, 0x30, 0x4f, 0x76, 0x6d, 0x46, 0x66, 0x42, 0x66, 0x77, 0x55, 0x38, 0x47, 0x58, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x50, 0x7a, 0x43, 0x59, 0x53, 0x52, 0x70, 0x75, 0x7a, 0x33, 0x30, 0x4d, 0x4d, 0x70, 0x59, 0x52, \n\t0x54, 0x41, 0x47, 0x52, 0x6c, 0x74, 0x77, 0x2b, 0x72, 0x6b, 0x77, 0x4f, 0x45, 0x30, 0x44, 0x49, 0x32, 0x39, \n\t0x74, 0x46, 0x4c, 0x37, 0x78, 0x55, 0x6b, 0x41, 0x52, 0x35, 0x75, 0x32, 0x45, 0x4c, 0x6b, 0x75, 0x75, 0x79, \n\t0x78, 0x54, 0x37, 0x69, 0x67, 0x4c, 0x59, 0x58, 0x49, 0x73, 0x76, 0x4b, 0x65, 0x76, 0x33, 0x61, 0x59, 0x5c, 0x0a,\n\t0x09, 0x57, 0x52, 0x30, 0x5a, 0x6e, 0x64, 0x6a, 0x43, 0x31, 0x41, 0x4a, 0x77, 0x42, 0x56, 0x7a, 0x7a, 0x58, \n\t0x4b, 0x77, 0x4e, 0x44, 0x36, 0x6d, 0x69, 0x68, 0x67, 0x2b, 0x42, 0x34, 0x34, 0x2f, 0x33, 0x31, 0x51, 0x33, \n\t0x74, 0x38, 0x47, 0x49, 0x33, 0x44, 0x75, 0x42, 0x33, 0x48, 0x38, 0x49, 0x34, 0x54, 0x52, 0x59, 0x59, 0x4c, \n\t0x52, 0x42, 0x6b, 0x52, 0x4b, 0x4b, 0x67, 0x67, 0x42, 0x38, 0x48, 0x51, 0x6f, 0x66, 0x77, 0x57, 0x34, 0x5c, 0x0a,\n\t0x09, 0x72, 0x59, 0x6c, 0x64, 0x59, 0x78, 0x67, 0x6c, 0x33, 0x54, 0x49, 0x56, 0x50, 0x75, 0x77, 0x77, 0x47, \n\t0x70, 0x7a, 0x78, 0x53, 0x30, 0x41, 0x43, 0x4c, 0x42, 0x53, 0x4d, 0x37, 0x42, 0x71, 0x30, 0x4f, 0x70, 0x79, \n\t0x44, 0x6b, 0x63, 0x76, 0x41, 0x70, 0x44, 0x71, 0x4f, 0x35, 0x68, 0x70, 0x6c, 0x72, 0x61, 0x67, 0x41, 0x6c, \n\t0x5a, 0x77, 0x31, 0x70, 0x74, 0x50, 0x62, 0x34, 0x58, 0x74, 0x74, 0x45, 0x65, 0x57, 0x75, 0x79, 0x58, 0x5c, 0x0a,\n\t0x09, 0x58, 0x54, 0x62, 0x4a, 0x7a, 0x79, 0x4c, 0x54, 0x45, 0x41, 0x75, 0x51, 0x43, 0x50, 0x2f, 0x79, 0x76, \n\t0x59, 0x66, 0x79, 0x4f, 0x4e, 0x38, 0x39, 0x70, 0x58, 0x59, 0x67, 0x4f, 0x6a, 0x31, 0x2b, 0x50, 0x34, 0x4f, \n\t0x6f, 0x52, 0x48, 0x44, 0x67, 0x75, 0x4d, 0x4e, 0x69, 0x44, 0x79, 0x4d, 0x76, 0x78, 0x4e, 0x44, 0x79, 0x48, \n\t0x48, 0x6c, 0x77, 0x45, 0x2f, 0x42, 0x35, 0x78, 0x4f, 0x31, 0x77, 0x53, 0x74, 0x47, 0x45, 0x62, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x37, 0x55, 0x4d, 0x75, 0x41, 0x78, 0x6a, 0x74, 0x33, 0x6c, 0x70, 0x74, 0x76, 0x71, 0x2b, 0x48, 0x36, \n\t0x53, 0x4d, 0x59, 0x47, 0x52, 0x39, 0x50, 0x34, 0x73, 0x63, 0x4a, 0x78, 0x37, 0x6f, 0x4c, 0x46, 0x37, 0x70, \n\t0x56, 0x77, 0x54, 0x4c, 0x53, 0x61, 0x58, 0x4d, 0x4f, 0x61, 0x6d, 0x30, 0x74, 0x70, 0x64, 0x32, 0x38, 0x50, \n\t0x49, 0x79, 0x4d, 0x6a, 0x38, 0x6a, 0x36, 0x6b, 0x6d, 0x72, 0x4c, 0x79, 0x4d, 0x4c, 0x4c, 0x57, 0x46, 0x5c, 0x0a,\n\t0x09, 0x47, 0x4a, 0x45, 0x37, 0x79, 0x41, 0x53, 0x2f, 0x38, 0x4e, 0x48, 0x76, 0x39, 0x52, 0x63, 0x41, 0x63, \n\t0x78, 0x6a, 0x41, 0x6f, 0x58, 0x4b, 0x76, 0x74, 0x50, 0x63, 0x48, 0x77, 0x70, 0x77, 0x6b, 0x63, 0x4f, 0x41, \n\t0x34, 0x77, 0x75, 0x65, 0x78, 0x41, 0x64, 0x2f, 0x49, 0x38, 0x37, 0x43, 0x41, 0x33, 0x44, 0x4f, 0x66, 0x6e, \n\t0x37, 0x77, 0x41, 0x2f, 0x68, 0x64, 0x49, 0x75, 0x59, 0x44, 0x34, 0x78, 0x63, 0x4b, 0x79, 0x67, 0x75, 0x5c, 0x0a,\n\t0x09, 0x48, 0x78, 0x68, 0x4e, 0x76, 0x79, 0x37, 0x4e, 0x56, 0x55, 0x74, 0x41, 0x74, 0x71, 0x36, 0x6b, 0x63, \n\t0x56, 0x7a, 0x37, 0x68, 0x71, 0x74, 0x68, 0x46, 0x50, 0x6c, 0x69, 0x63, 0x6a, 0x44, 0x4b, 0x57, 0x55, 0x61, \n\t0x36, 0x75, 0x7a, 0x54, 0x41, 0x35, 0x58, 0x78, 0x4b, 0x2b, 0x72, 0x6f, 0x32, 0x43, 0x79, 0x66, 0x6e, 0x66, \n\t0x4f, 0x36, 0x61, 0x55, 0x31, 0x54, 0x37, 0x6b, 0x69, 0x79, 0x73, 0x31, 0x4e, 0x2f, 0x49, 0x62, 0x36, 0x5c, 0x0a,\n\t0x09, 0x54, 0x4b, 0x45, 0x59, 0x41, 0x31, 0x66, 0x44, 0x2b, 0x63, 0x2b, 0x30, 0x63, 0x67, 0x44, 0x37, 0x54, \n\t0x42, 0x36, 0x45, 0x45, 0x63, 0x58, 0x34, 0x6c, 0x77, 0x39, 0x37, 0x72, 0x44, 0x71, 0x43, 0x39, 0x66, 0x78, \n\t0x76, 0x2f, 0x63, 0x48, 0x55, 0x49, 0x35, 0x2b, 0x42, 0x2f, 0x68, 0x55, 0x31, 0x52, 0x75, 0x34, 0x42, 0x77, \n\t0x2f, 0x43, 0x75, 0x37, 0x66, 0x41, 0x6b, 0x58, 0x33, 0x62, 0x67, 0x32, 0x4f, 0x2b, 0x71, 0x4e, 0x38, 0x5c, 0x0a,\n\t0x09, 0x45, 0x42, 0x2b, 0x48, 0x2b, 0x4f, 0x69, 0x34, 0x43, 0x6a, 0x66, 0x31, 0x37, 0x4b, 0x74, 0x53, 0x54, \n\t0x50, 0x6f, 0x36, 0x6e, 0x30, 0x78, 0x2b, 0x45, 0x55, 0x4e, 0x79, 0x6a, 0x79, 0x4c, 0x6b, 0x30, 0x61, 0x61, \n\t0x6a, 0x4d, 0x4f, 0x56, 0x73, 0x79, 0x74, 0x58, 0x45, 0x5a, 0x37, 0x4c, 0x74, 0x4b, 0x33, 0x58, 0x65, 0x33, \n\t0x66, 0x73, 0x68, 0x53, 0x5a, 0x51, 0x75, 0x51, 0x7a, 0x34, 0x78, 0x65, 0x64, 0x54, 0x70, 0x42, 0x53, 0x5c, 0x0a,\n\t0x09, 0x36, 0x2b, 0x44, 0x38, 0x6f, 0x44, 0x71, 0x69, 0x2b, 0x31, 0x6c, 0x74, 0x56, 0x66, 0x4f, 0x66, 0x44, \n\t0x48, 0x34, 0x73, 0x4d, 0x6a, 0x59, 0x4e, 0x53, 0x45, 0x4b, 0x61, 0x6e, 0x32, 0x6f, 0x76, 0x5a, 0x78, 0x4d, \n\t0x71, 0x7a, 0x79, 0x6b, 0x70, 0x46, 0x50, 0x36, 0x38, 0x2b, 0x58, 0x5a, 0x58, 0x31, 0x4f, 0x47, 0x4b, 0x6d, \n\t0x30, 0x49, 0x54, 0x35, 0x63, 0x56, 0x2f, 0x72, 0x38, 0x62, 0x5a, 0x34, 0x6a, 0x70, 0x58, 0x73, 0x45, 0x5c, 0x0a,\n\t0x09, 0x44, 0x46, 0x56, 0x35, 0x68, 0x75, 0x6f, 0x36, 0x6c, 0x55, 0x5a, 0x79, 0x35, 0x38, 0x73, 0x34, 0x50, \n\t0x65, 0x71, 0x65, 0x55, 0x4f, 0x56, 0x6e, 0x57, 0x4a, 0x33, 0x66, 0x75, 0x67, 0x4f, 0x75, 0x2b, 0x45, 0x6b, \n\t0x59, 0x66, 0x4a, 0x37, 0x58, 0x35, 0x2b, 0x73, 0x71, 0x76, 0x47, 0x77, 0x69, 0x31, 0x79, 0x4b, 0x38, 0x41, \n\t0x63, 0x64, 0x66, 0x52, 0x6b, 0x44, 0x4f, 0x76, 0x61, 0x44, 0x7a, 0x2b, 0x52, 0x77, 0x47, 0x4f, 0x58, 0x5c, 0x0a,\n\t0x09, 0x49, 0x57, 0x30, 0x63, 0x46, 0x76, 0x50, 0x41, 0x4e, 0x76, 0x62, 0x5a, 0x77, 0x41, 0x2b, 0x58, 0x6e, \n\t0x67, 0x79, 0x35, 0x32, 0x31, 0x53, 0x71, 0x79, 0x46, 0x45, 0x55, 0x6d, 0x48, 0x5a, 0x65, 0x53, 0x73, 0x78, \n\t0x62, 0x45, 0x4d, 0x79, 0x38, 0x67, 0x36, 0x72, 0x33, 0x4d, 0x36, 0x44, 0x72, 0x6c, 0x6c, 0x74, 0x50, 0x4e, \n\t0x5a, 0x71, 0x6f, 0x75, 0x57, 0x38, 0x77, 0x64, 0x70, 0x79, 0x30, 0x63, 0x37, 0x71, 0x47, 0x33, 0x58, 0x5c, 0x0a,\n\t0x09, 0x54, 0x4d, 0x64, 0x72, 0x79, 0x36, 0x54, 0x78, 0x45, 0x7a, 0x6c, 0x72, 0x31, 0x57, 0x67, 0x66, 0x55, \n\t0x75, 0x49, 0x62, 0x61, 0x72, 0x47, 0x4d, 0x73, 0x68, 0x61, 0x52, 0x74, 0x62, 0x43, 0x36, 0x48, 0x4e, 0x70, \n\t0x61, 0x74, 0x37, 0x59, 0x41, 0x6a, 0x57, 0x55, 0x6b, 0x41, 0x68, 0x64, 0x2b, 0x43, 0x50, 0x5a, 0x2b, 0x43, \n\t0x54, 0x58, 0x68, 0x73, 0x58, 0x6e, 0x5a, 0x6e, 0x43, 0x74, 0x78, 0x66, 0x43, 0x76, 0x43, 0x66, 0x38, 0x5c, 0x0a,\n\t0x09, 0x51, 0x35, 0x33, 0x4f, 0x6d, 0x37, 0x4f, 0x35, 0x2f, 0x50, 0x4b, 0x75, 0x53, 0x79, 0x37, 0x4a, 0x6f, \n\t0x64, 0x2f, 0x4d, 0x61, 0x64, 0x2b, 0x41, 0x5a, 0x77, 0x46, 0x66, 0x42, 0x72, 0x4f, 0x48, 0x6d, 0x68, 0x36, \n\t0x70, 0x37, 0x35, 0x56, 0x44, 0x31, 0x67, 0x5a, 0x47, 0x46, 0x77, 0x46, 0x47, 0x44, 0x55, 0x74, 0x6f, 0x31, \n\t0x74, 0x58, 0x31, 0x6b, 0x6f, 0x6a, 0x46, 0x7a, 0x31, 0x31, 0x64, 0x6a, 0x42, 0x6c, 0x51, 0x70, 0x47, 0x5c, 0x0a,\n\t0x09, 0x74, 0x67, 0x73, 0x57, 0x75, 0x6c, 0x34, 0x57, 0x52, 0x67, 0x4d, 0x69, 0x67, 0x47, 0x56, 0x68, 0x70, \n\t0x4b, 0x44, 0x69, 0x69, 0x71, 0x71, 0x48, 0x6e, 0x6e, 0x4d, 0x77, 0x75, 0x77, 0x77, 0x4d, 0x49, 0x76, 0x39, \n\t0x51, 0x56, 0x39, 0x65, 0x74, 0x7a, 0x62, 0x2f, 0x55, 0x30, 0x73, 0x56, 0x72, 0x50, 0x5a, 0x66, 0x70, 0x32, \n\t0x6c, 0x33, 0x38, 0x57, 0x62, 0x6a, 0x34, 0x49, 0x77, 0x32, 0x45, 0x59, 0x68, 0x6a, 0x68, 0x74, 0x78, 0x5c, 0x0a,\n\t0x09, 0x54, 0x35, 0x46, 0x2b, 0x73, 0x49, 0x6f, 0x38, 0x73, 0x4f, 0x52, 0x42, 0x57, 0x45, 0x41, 0x4c, 0x67, \n\t0x4a, 0x35, 0x50, 0x56, 0x41, 0x64, 0x63, 0x4a, 0x70, 0x55, 0x50, 0x53, 0x46, 0x6b, 0x62, 0x47, 0x4b, 0x36, \n\t0x6e, 0x7a, 0x30, 0x73, 0x62, 0x45, 0x34, 0x51, 0x74, 0x51, 0x47, 0x52, 0x74, 0x50, 0x42, 0x71, 0x44, 0x68, \n\t0x52, 0x4c, 0x51, 0x45, 0x70, 0x74, 0x6e, 0x32, 0x63, 0x68, 0x70, 0x47, 0x32, 0x4e, 0x71, 0x78, 0x31, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x68, 0x75, 0x74, 0x68, 0x30, 0x35, 0x68, 0x48, 0x63, 0x73, 0x36, 0x6e, 0x2b, 0x71, 0x76, 0x36, \n\t0x77, 0x4a, 0x4c, 0x44, 0x6b, 0x61, 0x4a, 0x30, 0x7a, 0x70, 0x33, 0x62, 0x64, 0x65, 0x4b, 0x66, 0x57, 0x32, \n\t0x46, 0x74, 0x66, 0x69, 0x6c, 0x73, 0x6e, 0x4f, 0x4e, 0x66, 0x48, 0x6a, 0x2f, 0x4c, 0x66, 0x44, 0x34, 0x39, \n\t0x77, 0x50, 0x37, 0x62, 0x54, 0x44, 0x36, 0x31, 0x34, 0x68, 0x38, 0x7a, 0x37, 0x72, 0x42, 0x36, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x79, 0x45, 0x52, 0x32, 0x38, 0x2f, 0x6e, 0x50, 0x44, 0x2b, 0x2f, 0x37, 0x5a, 0x77, 0x4a, 0x76, \n\t0x42, 0x31, 0x56, 0x53, 0x71, 0x2f, 0x42, 0x48, 0x42, 0x6e, 0x32, 0x50, 0x38, 0x4e, 0x64, 0x62, 0x33, 0x55, \n\t0x6f, 0x76, 0x78, 0x46, 0x39, 0x58, 0x35, 0x70, 0x48, 0x6e, 0x61, 0x36, 0x32, 0x66, 0x79, 0x47, 0x55, 0x58, \n\t0x36, 0x4d, 0x6d, 0x57, 0x71, 0x34, 0x30, 0x78, 0x55, 0x58, 0x35, 0x2f, 0x52, 0x4c, 0x50, 0x34, 0x69, 0x5c, 0x0a,\n\t0x09, 0x79, 0x50, 0x6a, 0x4e, 0x57, 0x70, 0x4a, 0x4e, 0x34, 0x7a, 0x4d, 0x71, 0x4c, 0x38, 0x44, 0x2b, 0x66, \n\t0x5a, 0x57, 0x2f, 0x43, 0x4c, 0x2f, 0x30, 0x6f, 0x66, 0x59, 0x48, 0x61, 0x64, 0x2b, 0x50, 0x39, 0x68, 0x6c, \n\t0x35, 0x76, 0x31, 0x46, 0x39, 0x37, 0x4e, 0x4f, 0x58, 0x77, 0x79, 0x59, 0x74, 0x49, 0x35, 0x4f, 0x50, 0x78, \n\t0x44, 0x36, 0x6a, 0x79, 0x43, 0x65, 0x6b, 0x6a, 0x6f, 0x4e, 0x66, 0x52, 0x2f, 0x74, 0x7a, 0x4a, 0x50, 0x5c, 0x0a,\n\t0x09, 0x69, 0x6d, 0x37, 0x4c, 0x58, 0x68, 0x4f, 0x4d, 0x54, 0x5a, 0x36, 0x33, 0x52, 0x59, 0x2b, 0x62, 0x4e, \n\t0x73, 0x50, 0x70, 0x69, 0x38, 0x55, 0x57, 0x6c, 0x32, 0x58, 0x67, 0x61, 0x6e, 0x66, 0x78, 0x51, 0x34, 0x36, \n\t0x65, 0x38, 0x42, 0x37, 0x54, 0x4d, 0x43, 0x6b, 0x65, 0x2f, 0x47, 0x75, 0x52, 0x39, 0x41, 0x42, 0x44, 0x6e, \n\t0x33, 0x77, 0x6c, 0x37, 0x50, 0x61, 0x5a, 0x33, 0x6b, 0x30, 0x49, 0x50, 0x6f, 0x34, 0x50, 0x57, 0x66, 0x5c, 0x0a,\n\t0x09, 0x36, 0x34, 0x2f, 0x63, 0x37, 0x63, 0x44, 0x76, 0x55, 0x73, 0x38, 0x52, 0x79, 0x6f, 0x4e, 0x6a, 0x72, \n\t0x57, 0x47, 0x55, 0x36, 0x42, 0x73, 0x48, 0x6f, 0x38, 0x4b, 0x45, 0x2f, 0x62, 0x6c, 0x57, 0x47, 0x4d, 0x33, \n\t0x6f, 0x76, 0x4b, 0x37, 0x4c, 0x4f, 0x4e, 0x36, 0x79, 0x6d, 0x67, 0x70, 0x47, 0x65, 0x78, 0x2b, 0x72, 0x67, \n\t0x46, 0x51, 0x65, 0x78, 0x4f, 0x43, 0x70, 0x47, 0x37, 0x78, 0x79, 0x61, 0x4a, 0x66, 0x61, 0x36, 0x61, 0x5c, 0x0a,\n\t0x09, 0x79, 0x68, 0x6b, 0x59, 0x50, 0x52, 0x4d, 0x49, 0x61, 0x46, 0x56, 0x4f, 0x66, 0x46, 0x4f, 0x70, 0x51, \n\t0x54, 0x42, 0x33, 0x56, 0x77, 0x6e, 0x49, 0x73, 0x35, 0x70, 0x77, 0x45, 0x54, 0x49, 0x4b, 0x68, 0x68, 0x6c, \n\t0x41, 0x50, 0x57, 0x6b, 0x4d, 0x68, 0x78, 0x48, 0x59, 0x48, 0x4b, 0x2f, 0x49, 0x31, 0x67, 0x70, 0x42, 0x7a, \n\t0x66, 0x57, 0x33, 0x66, 0x43, 0x6d, 0x5a, 0x38, 0x41, 0x64, 0x30, 0x30, 0x47, 0x52, 0x68, 0x78, 0x71, 0x5c, 0x0a,\n\t0x09, 0x47, 0x42, 0x31, 0x71, 0x45, 0x42, 0x33, 0x38, 0x65, 0x6d, 0x30, 0x4a, 0x33, 0x51, 0x36, 0x38, 0x47, \n\t0x58, 0x48, 0x6d, 0x30, 0x35, 0x73, 0x4c, 0x67, 0x4a, 0x47, 0x57, 0x58, 0x6a, 0x41, 0x4b, 0x4a, 0x7a, 0x4a, \n\t0x6c, 0x79, 0x6f, 0x55, 0x50, 0x41, 0x34, 0x79, 0x41, 0x75, 0x63, 0x44, 0x49, 0x35, 0x69, 0x4d, 0x43, 0x6c, \n\t0x7a, 0x35, 0x4d, 0x31, 0x66, 0x43, 0x44, 0x56, 0x64, 0x49, 0x43, 0x49, 0x38, 0x54, 0x44, 0x78, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x66, 0x63, 0x30, 0x6f, 0x38, 0x36, 0x52, 0x52, 0x62, 0x51, 0x4d, 0x4c, 0x57, 0x61, 0x74, 0x50, 0x55, \n\t0x6b, 0x49, 0x38, 0x53, 0x4f, 0x63, 0x6b, 0x55, 0x57, 0x53, 0x72, 0x43, 0x67, 0x44, 0x6b, 0x68, 0x67, 0x49, \n\t0x6a, 0x71, 0x39, 0x48, 0x70, 0x47, 0x54, 0x44, 0x4e, 0x41, 0x79, 0x61, 0x61, 0x50, 0x52, 0x4d, 0x33, 0x32, \n\t0x76, 0x4c, 0x65, 0x6c, 0x43, 0x65, 0x48, 0x41, 0x72, 0x6e, 0x50, 0x36, 0x50, 0x55, 0x4e, 0x78, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x59, 0x46, 0x51, 0x66, 0x66, 0x7a, 0x66, 0x4f, 0x2f, 0x61, 0x76, 0x44, 0x42, 0x71, 0x4e, 0x44, 0x43, \n\t0x36, 0x4b, 0x44, 0x58, 0x2f, 0x38, 0x38, 0x2f, 0x4d, 0x74, 0x64, 0x51, 0x51, 0x67, 0x71, 0x43, 0x48, 0x55, \n\t0x4e, 0x75, 0x38, 0x38, 0x44, 0x52, 0x6c, 0x6b, 0x72, 0x71, 0x51, 0x74, 0x47, 0x4f, 0x56, 0x42, 0x59, 0x77, \n\t0x43, 0x30, 0x43, 0x52, 0x6a, 0x61, 0x66, 0x4f, 0x63, 0x4b, 0x6f, 0x35, 0x37, 0x41, 0x2b, 0x6a, 0x49, 0x5c, 0x0a,\n\t0x09, 0x46, 0x52, 0x58, 0x51, 0x61, 0x56, 0x7a, 0x2f, 0x42, 0x52, 0x4f, 0x50, 0x67, 0x4d, 0x65, 0x52, 0x69, \n\t0x4e, 0x34, 0x6e, 0x4d, 0x49, 0x6c, 0x4b, 0x71, 0x68, 0x6c, 0x68, 0x34, 0x34, 0x4e, 0x53, 0x77, 0x30, 0x59, \n\t0x4d, 0x77, 0x51, 0x75, 0x73, 0x70, 0x48, 0x5a, 0x49, 0x67, 0x6b, 0x58, 0x61, 0x32, 0x63, 0x74, 0x52, 0x51, \n\t0x67, 0x6f, 0x79, 0x32, 0x73, 0x54, 0x44, 0x70, 0x72, 0x4e, 0x58, 0x56, 0x4e, 0x43, 0x34, 0x69, 0x47, 0x5c, 0x0a,\n\t0x09, 0x39, 0x77, 0x31, 0x30, 0x36, 0x6e, 0x50, 0x68, 0x76, 0x41, 0x38, 0x50, 0x72, 0x6f, 0x66, 0x54, 0x50, \n\t0x39, 0x59, 0x46, 0x6f, 0x2b, 0x2f, 0x42, 0x75, 0x65, 0x38, 0x35, 0x54, 0x44, 0x41, 0x36, 0x6c, 0x4d, 0x37, \n\t0x71, 0x67, 0x39, 0x63, 0x39, 0x45, 0x79, 0x72, 0x6e, 0x72, 0x6f, 0x64, 0x51, 0x65, 0x57, 0x50, 0x73, 0x36, \n\t0x4d, 0x33, 0x64, 0x55, 0x39, 0x37, 0x5a, 0x50, 0x4c, 0x55, 0x44, 0x4f, 0x2b, 0x76, 0x4d, 0x37, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x67, 0x71, 0x2f, 0x79, 0x63, 0x31, 0x6d, 0x65, 0x64, 0x79, 0x7a, 0x5a, 0x50, 0x48, 0x52, 0x37, \n\t0x6e, 0x77, 0x4c, 0x59, 0x36, 0x67, 0x6a, 0x4d, 0x37, 0x58, 0x36, 0x37, 0x56, 0x4c, 0x4a, 0x4c, 0x4e, 0x4f, \n\t0x4c, 0x44, 0x72, 0x4d, 0x76, 0x68, 0x38, 0x33, 0x41, 0x36, 0x63, 0x2b, 0x6a, 0x79, 0x71, 0x44, 0x63, 0x61, \n\t0x38, 0x45, 0x7a, 0x69, 0x61, 0x38, 0x4f, 0x67, 0x64, 0x75, 0x66, 0x55, 0x4b, 0x66, 0x45, 0x65, 0x30, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x55, 0x6a, 0x68, 0x48, 0x64, 0x67, 0x35, 0x68, 0x33, 0x5a, 0x75, 0x46, 0x62, 0x36, 0x61, 0x47, \n\t0x4f, 0x6d, 0x69, 0x6d, 0x64, 0x4c, 0x4b, 0x79, 0x5a, 0x31, 0x64, 0x5a, 0x47, 0x75, 0x47, 0x38, 0x48, 0x4f, \n\t0x4c, 0x59, 0x62, 0x4f, 0x4c, 0x5a, 0x48, 0x55, 0x2b, 0x65, 0x6b, 0x56, 0x2f, 0x45, 0x5a, 0x63, 0x74, 0x63, \n\t0x57, 0x4b, 0x62, 0x4b, 0x51, 0x6e, 0x6c, 0x77, 0x33, 0x44, 0x75, 0x62, 0x30, 0x50, 0x35, 0x43, 0x65, 0x5c, 0x0a,\n\t0x09, 0x50, 0x41, 0x72, 0x6f, 0x2b, 0x2f, 0x47, 0x5a, 0x47, 0x56, 0x44, 0x75, 0x30, 0x66, 0x32, 0x56, 0x47, \n\t0x7a, 0x43, 0x6b, 0x49, 0x41, 0x33, 0x49, 0x53, 0x54, 0x33, 0x77, 0x4e, 0x75, 0x71, 0x59, 0x4b, 0x6d, 0x55, \n\t0x61, 0x30, 0x45, 0x52, 0x6a, 0x62, 0x39, 0x42, 0x6b, 0x5a, 0x52, 0x30, 0x6b, 0x6c, 0x67, 0x74, 0x50, 0x74, \n\t0x45, 0x32, 0x4c, 0x6d, 0x46, 0x5a, 0x6d, 0x68, 0x65, 0x62, 0x58, 0x49, 0x57, 0x6a, 0x54, 0x6f, 0x70, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x4f, 0x6d, 0x74, 0x51, 0x51, 0x6f, 0x7a, 0x36, 0x68, 0x52, 0x39, 0x53, 0x55, 0x51, 0x33, 0x65, \n\t0x49, 0x65, 0x64, 0x70, 0x65, 0x32, 0x53, 0x30, 0x62, 0x71, 0x32, 0x55, 0x62, 0x4c, 0x4d, 0x61, 0x46, 0x63, \n\t0x45, 0x71, 0x41, 0x44, 0x51, 0x74, 0x68, 0x30, 0x69, 0x4c, 0x59, 0x54, 0x73, 0x33, 0x4b, 0x4d, 0x63, 0x6a, \n\t0x4d, 0x79, 0x49, 0x58, 0x76, 0x6b, 0x51, 0x6e, 0x50, 0x73, 0x37, 0x62, 0x54, 0x41, 0x71, 0x63, 0x65, 0x5c, 0x0a,\n\t0x09, 0x36, 0x72, 0x45, 0x66, 0x6e, 0x46, 0x56, 0x63, 0x48, 0x6f, 0x53, 0x49, 0x4a, 0x49, 0x51, 0x65, 0x67, \n\t0x36, 0x34, 0x47, 0x36, 0x51, 0x32, 0x2b, 0x4e, 0x47, 0x4e, 0x41, 0x35, 0x47, 0x37, 0x56, 0x62, 0x4d, 0x6b, \n\t0x59, 0x53, 0x52, 0x76, 0x59, 0x64, 0x44, 0x74, 0x5a, 0x64, 0x52, 0x41, 0x53, 0x66, 0x76, 0x72, 0x49, 0x62, \n\t0x31, 0x39, 0x65, 0x72, 0x37, 0x32, 0x69, 0x4a, 0x79, 0x47, 0x57, 0x76, 0x45, 0x47, 0x56, 0x42, 0x59, 0x5c, 0x0a,\n\t0x09, 0x79, 0x4b, 0x67, 0x47, 0x6e, 0x4d, 0x41, 0x6f, 0x74, 0x6c, 0x5a, 0x63, 0x7a, 0x6e, 0x4a, 0x71, 0x68, \n\t0x5a, 0x4c, 0x57, 0x4d, 0x79, 0x43, 0x31, 0x6b, 0x43, 0x78, 0x6b, 0x72, 0x47, 0x57, 0x55, 0x73, 0x61, 0x37, \n\t0x73, 0x4d, 0x48, 0x35, 0x79, 0x72, 0x4d, 0x70, 0x58, 0x66, 0x67, 0x59, 0x65, 0x2b, 0x79, 0x61, 0x51, 0x42, \n\t0x33, 0x4d, 0x77, 0x75, 0x6f, 0x52, 0x7a, 0x72, 0x30, 0x44, 0x6b, 0x39, 0x31, 0x63, 0x42, 0x6f, 0x79, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x33, 0x66, 0x48, 0x2f, 0x77, 0x75, 0x6d, 0x65, 0x46, 0x77, 0x39, 0x50, 0x41, 0x62, 0x77, 0x43, \n\t0x33, 0x67, 0x7a, 0x50, 0x76, 0x73, 0x76, 0x46, 0x39, 0x64, 0x43, 0x37, 0x54, 0x43, 0x50, 0x48, 0x7a, 0x39, \n\t0x68, 0x6e, 0x5a, 0x39, 0x42, 0x30, 0x2b, 0x6f, 0x30, 0x6a, 0x66, 0x4f, 0x4b, 0x64, 0x34, 0x6c, 0x34, 0x34, \n\t0x57, 0x6e, 0x31, 0x45, 0x79, 0x65, 0x71, 0x66, 0x76, 0x30, 0x66, 0x69, 0x31, 0x31, 0x73, 0x35, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x56, 0x4d, 0x4c, 0x65, 0x66, 0x54, 0x52, 0x44, 0x39, 0x73, 0x72, 0x2f, 0x45, 0x67, 0x33, 0x76, 0x61, \n\t0x30, 0x65, 0x77, 0x47, 0x4a, 0x2b, 0x4e, 0x63, 0x52, 0x79, 0x4c, 0x64, 0x32, 0x6a, 0x58, 0x50, 0x71, 0x50, \n\t0x59, 0x63, 0x61, 0x33, 0x39, 0x50, 0x42, 0x4a, 0x4e, 0x43, 0x37, 0x44, 0x4f, 0x5a, 0x75, 0x33, 0x7a, 0x43, \n\t0x58, 0x72, 0x62, 0x48, 0x4e, 0x52, 0x71, 0x4b, 0x6b, 0x44, 0x69, 0x43, 0x46, 0x66, 0x48, 0x75, 0x64, 0x5c, 0x0a,\n\t0x09, 0x47, 0x7a, 0x6f, 0x43, 0x63, 0x35, 0x4e, 0x72, 0x34, 0x6b, 0x64, 0x79, 0x32, 0x63, 0x2f, 0x67, 0x2f, \n\t0x41, 0x46, 0x53, 0x67, 0x2f, 0x55, 0x54, 0x67, 0x2b, 0x68, 0x73, 0x67, 0x76, 0x34, 0x64, 0x78, 0x6e, 0x77, \n\t0x2f, 0x72, 0x36, 0x6a, 0x41, 0x34, 0x46, 0x69, 0x41, 0x35, 0x2b, 0x37, 0x56, 0x6e, 0x2b, 0x4a, 0x58, 0x55, \n\t0x37, 0x34, 0x46, 0x34, 0x4c, 0x66, 0x48, 0x34, 0x54, 0x65, 0x34, 0x68, 0x68, 0x5a, 0x45, 0x66, 0x53, 0x5c, 0x0a,\n\t0x09, 0x57, 0x75, 0x63, 0x59, 0x39, 0x64, 0x46, 0x78, 0x42, 0x47, 0x45, 0x30, 0x66, 0x4b, 0x52, 0x79, 0x58, \n\t0x74, 0x63, 0x6a, 0x54, 0x47, 0x6f, 0x6b, 0x4c, 0x49, 0x46, 0x52, 0x53, 0x64, 0x54, 0x51, 0x6f, 0x2f, 0x4e, \n\t0x32, 0x71, 0x4e, 0x38, 0x43, 0x71, 0x43, 0x53, 0x47, 0x67, 0x6e, 0x67, 0x59, 0x6c, 0x55, 0x71, 0x33, 0x63, \n\t0x5a, 0x54, 0x58, 0x49, 0x33, 0x4b, 0x35, 0x6b, 0x54, 0x62, 0x74, 0x61, 0x4e, 0x5a, 0x6c, 0x74, 0x70, 0x5c, 0x0a,\n\t0x09, 0x41, 0x78, 0x49, 0x33, 0x44, 0x52, 0x4b, 0x4a, 0x71, 0x36, 0x46, 0x6e, 0x75, 0x73, 0x67, 0x65, 0x7a, \n\t0x7a, 0x4b, 0x35, 0x34, 0x49, 0x70, 0x33, 0x38, 0x59, 0x4f, 0x45, 0x34, 0x47, 0x52, 0x74, 0x65, 0x43, 0x2f, \n\t0x44, 0x71, 0x34, 0x4d, 0x2b, 0x73, 0x4b, 0x6f, 0x30, 0x4d, 0x42, 0x49, 0x69, 0x38, 0x4f, 0x34, 0x54, 0x38, \n\t0x44, 0x72, 0x30, 0x67, 0x62, 0x36, 0x6a, 0x78, 0x67, 0x35, 0x41, 0x39, 0x62, 0x59, 0x54, 0x41, 0x72, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x4c, 0x51, 0x4f, 0x6c, 0x64, 0x38, 0x47, 0x52, 0x70, 0x6c, 0x49, 0x64, 0x62, 0x7a, 0x33, 0x4d, \n\t0x54, 0x38, 0x61, 0x70, 0x6b, 0x62, 0x50, 0x6b, 0x73, 0x61, 0x72, 0x6f, 0x57, 0x4f, 0x48, 0x77, 0x52, 0x55, \n\t0x34, 0x51, 0x6f, 0x4d, 0x75, 0x44, 0x64, 0x43, 0x79, 0x77, 0x2b, 0x78, 0x68, 0x65, 0x46, 0x38, 0x31, 0x64, \n\t0x6a, 0x46, 0x51, 0x69, 0x52, 0x61, 0x36, 0x57, 0x70, 0x42, 0x6f, 0x36, 0x38, 0x56, 0x61, 0x56, 0x42, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x73, 0x4f, 0x55, 0x68, 0x6c, 0x72, 0x6f, 0x31, 0x67, 0x56, 0x4a, 0x4b, 0x4f, 0x71, 0x49, 0x31, \n\t0x67, 0x38, 0x46, 0x51, 0x34, 0x2b, 0x53, 0x39, 0x42, 0x74, 0x6b, 0x68, 0x67, 0x56, 0x50, 0x49, 0x30, 0x6b, \n\t0x4a, 0x2b, 0x75, 0x2b, 0x6d, 0x79, 0x7a, 0x50, 0x4f, 0x54, 0x46, 0x79, 0x4e, 0x71, 0x44, 0x61, 0x50, 0x39, \n\t0x58, 0x50, 0x39, 0x38, 0x33, 0x58, 0x50, 0x64, 0x71, 0x34, 0x4b, 0x39, 0x31, 0x7a, 0x73, 0x65, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x43, 0x55, 0x62, 0x61, 0x61, 0x6c, 0x45, 0x4e, 0x31, 0x65, 0x61, 0x5a, 0x36, 0x4f, 0x77, 0x4c, 0x6f, \n\t0x37, 0x6a, 0x52, 0x54, 0x77, 0x38, 0x6a, 0x47, 0x35, 0x34, 0x53, 0x52, 0x69, 0x33, 0x6c, 0x57, 0x67, 0x32, \n\t0x4d, 0x4d, 0x67, 0x72, 0x46, 0x35, 0x31, 0x46, 0x65, 0x67, 0x4f, 0x48, 0x44, 0x42, 0x6b, 0x61, 0x68, 0x73, \n\t0x52, 0x72, 0x77, 0x4a, 0x44, 0x43, 0x79, 0x31, 0x70, 0x45, 0x47, 0x69, 0x4f, 0x33, 0x47, 0x36, 0x62, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x31, 0x62, 0x67, 0x42, 0x71, 0x61, 0x44, 0x2b, 0x79, 0x59, 0x4d, 0x70, 0x38, 0x58, 0x73, 0x6c, \n\t0x55, 0x41, 0x54, 0x74, 0x50, 0x71, 0x57, 0x73, 0x79, 0x59, 0x39, 0x76, 0x4b, 0x66, 0x58, 0x32, 0x74, 0x36, \n\t0x67, 0x62, 0x71, 0x2b, 0x46, 0x43, 0x2b, 0x72, 0x62, 0x76, 0x67, 0x78, 0x4e, 0x2f, 0x33, 0x39, 0x5a, 0x64, \n\t0x59, 0x52, 0x6c, 0x38, 0x4f, 0x38, 0x6b, 0x38, 0x52, 0x31, 0x6d, 0x37, 0x46, 0x2f, 0x6c, 0x6f, 0x37, 0x5c, 0x0a,\n\t0x09, 0x71, 0x2f, 0x64, 0x2f, 0x39, 0x64, 0x6e, 0x34, 0x47, 0x76, 0x33, 0x72, 0x77, 0x48, 0x39, 0x78, 0x6b, \n\t0x58, 0x4d, 0x33, 0x70, 0x4d, 0x6f, 0x34, 0x70, 0x4b, 0x64, 0x31, 0x59, 0x4a, 0x73, 0x68, 0x2b, 0x4d, 0x69, \n\t0x42, 0x62, 0x66, 0x4e, 0x4d, 0x64, 0x50, 0x5a, 0x31, 0x59, 0x46, 0x73, 0x64, 0x4b, 0x6a, 0x39, 0x37, 0x54, \n\t0x35, 0x74, 0x64, 0x48, 0x71, 0x73, 0x79, 0x46, 0x43, 0x66, 0x67, 0x2b, 0x4e, 0x4f, 0x41, 0x4c, 0x54, 0x5c, 0x0a,\n\t0x09, 0x38, 0x30, 0x37, 0x30, 0x69, 0x48, 0x32, 0x50, 0x56, 0x6f, 0x57, 0x6e, 0x41, 0x6b, 0x71, 0x37, 0x68, \n\t0x6b, 0x58, 0x5a, 0x70, 0x79, 0x4a, 0x4e, 0x75, 0x30, 0x65, 0x68, 0x39, 0x71, 0x34, 0x32, 0x42, 0x32, 0x30, \n\t0x62, 0x6f, 0x7a, 0x36, 0x32, 0x79, 0x32, 0x7a, 0x76, 0x45, 0x43, 0x43, 0x4b, 0x4e, 0x39, 0x58, 0x5a, 0x2f, \n\t0x46, 0x44, 0x6d, 0x48, 0x37, 0x5a, 0x64, 0x6f, 0x78, 0x61, 0x39, 0x45, 0x53, 0x42, 0x37, 0x5a, 0x79, 0x5c, 0x0a,\n\t0x09, 0x59, 0x6c, 0x2f, 0x38, 0x4d, 0x64, 0x6a, 0x37, 0x4f, 0x66, 0x38, 0x4d, 0x6c, 0x51, 0x50, 0x62, 0x4f, \n\t0x63, 0x48, 0x78, 0x5a, 0x51, 0x69, 0x76, 0x78, 0x37, 0x48, 0x77, 0x76, 0x59, 0x77, 0x4f, 0x2f, 0x61, 0x68, \n\t0x5a, 0x42, 0x53, 0x45, 0x41, 0x6e, 0x67, 0x2f, 0x79, 0x5a, 0x6d, 0x44, 0x58, 0x4a, 0x51, 0x33, 0x56, 0x68, \n\t0x46, 0x48, 0x68, 0x75, 0x63, 0x4c, 0x49, 0x36, 0x76, 0x4e, 0x35, 0x4a, 0x6a, 0x6f, 0x33, 0x4d, 0x49, 0x5c, 0x0a,\n\t0x09, 0x72, 0x4c, 0x4d, 0x30, 0x63, 0x59, 0x37, 0x64, 0x77, 0x43, 0x32, 0x39, 0x66, 0x53, 0x44, 0x4d, 0x30, \n\t0x48, 0x47, 0x4a, 0x6c, 0x52, 0x4d, 0x6a, 0x73, 0x63, 0x72, 0x36, 0x48, 0x55, 0x43, 0x53, 0x4d, 0x4e, 0x49, \n\t0x51, 0x32, 0x77, 0x48, 0x49, 0x78, 0x55, 0x48, 0x67, 0x6c, 0x49, 0x4c, 0x41, 0x78, 0x7a, 0x77, 0x2f, 0x6d, \n\t0x44, 0x75, 0x4e, 0x77, 0x4a, 0x6e, 0x43, 0x79, 0x6b, 0x7a, 0x47, 0x4c, 0x61, 0x74, 0x72, 0x6c, 0x47, 0x5c, 0x0a,\n\t0x09, 0x39, 0x5a, 0x59, 0x69, 0x76, 0x68, 0x37, 0x4f, 0x66, 0x78, 0x63, 0x4d, 0x33, 0x35, 0x47, 0x44, 0x30, \n\t0x55, 0x4d, 0x34, 0x6e, 0x6f, 0x6e, 0x77, 0x38, 0x55, 0x58, 0x44, 0x36, 0x46, 0x43, 0x50, 0x6d, 0x69, 0x6b, \n\t0x49, 0x33, 0x51, 0x6a, 0x38, 0x49, 0x74, 0x57, 0x48, 0x78, 0x64, 0x57, 0x79, 0x43, 0x65, 0x74, 0x4d, 0x6e, \n\t0x6d, 0x4d, 0x33, 0x7a, 0x63, 0x79, 0x55, 0x46, 0x68, 0x31, 0x65, 0x55, 0x44, 0x63, 0x74, 0x79, 0x71, 0x5c, 0x0a,\n\t0x09, 0x39, 0x33, 0x4e, 0x36, 0x31, 0x50, 0x56, 0x37, 0x2f, 0x46, 0x36, 0x61, 0x37, 0x44, 0x61, 0x37, 0x43, \n\t0x78, 0x47, 0x6f, 0x52, 0x36, 0x7a, 0x6a, 0x69, 0x76, 0x6f, 0x53, 0x72, 0x44, 0x77, 0x61, 0x65, 0x6f, 0x66, \n\t0x53, 0x74, 0x6c, 0x7a, 0x68, 0x63, 0x55, 0x75, 0x69, 0x6d, 0x2b, 0x36, 0x79, 0x4b, 0x6d, 0x75, 0x31, 0x56, \n\t0x33, 0x71, 0x38, 0x4a, 0x6f, 0x6d, 0x42, 0x6d, 0x46, 0x53, 0x72, 0x70, 0x77, 0x79, 0x6a, 0x6b, 0x65, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x6d, 0x2f, 0x37, 0x66, 0x45, 0x54, 0x73, 0x64, 0x61, 0x5a, 0x72, 0x31, 0x54, 0x62, 0x72, 0x6d, \n\t0x67, 0x50, 0x69, 0x4c, 0x70, 0x33, 0x70, 0x59, 0x6f, 0x31, 0x7a, 0x57, 0x45, 0x64, 0x64, 0x52, 0x4f, 0x33, \n\t0x45, 0x31, 0x6a, 0x72, 0x43, 0x66, 0x51, 0x6d, 0x63, 0x66, 0x44, 0x57, 0x34, 0x4a, 0x38, 0x58, 0x64, 0x74, \n\t0x4b, 0x71, 0x79, 0x72, 0x30, 0x48, 0x34, 0x4f, 0x52, 0x79, 0x44, 0x64, 0x58, 0x45, 0x58, 0x72, 0x53, 0x5c, 0x0a,\n\t0x09, 0x57, 0x49, 0x50, 0x48, 0x42, 0x32, 0x67, 0x64, 0x63, 0x43, 0x4e, 0x31, 0x52, 0x6e, 0x6e, 0x59, 0x37, \n\t0x6a, 0x4b, 0x4d, 0x46, 0x6f, 0x73, 0x38, 0x75, 0x6a, 0x6c, 0x68, 0x59, 0x59, 0x6c, 0x66, 0x73, 0x77, 0x66, \n\t0x46, 0x44, 0x42, 0x52, 0x51, 0x79, 0x4d, 0x74, 0x4d, 0x38, 0x6f, 0x77, 0x45, 0x61, 0x42, 0x51, 0x49, 0x2b, \n\t0x57, 0x6c, 0x57, 0x62, 0x6b, 0x4b, 0x2f, 0x49, 0x6e, 0x36, 0x63, 0x61, 0x74, 0x48, 0x4f, 0x46, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x37, 0x4d, 0x69, 0x57, 0x79, 0x50, 0x2b, 0x54, 0x67, 0x59, 0x36, 0x46, 0x6c, 0x42, 0x69, 0x66, 0x6b, \n\t0x58, 0x57, 0x55, 0x31, 0x2b, 0x64, 0x7a, 0x4f, 0x30, 0x50, 0x6d, 0x6e, 0x4e, 0x37, 0x36, 0x32, 0x6f, 0x7a, \n\t0x44, 0x6e, 0x52, 0x4c, 0x63, 0x63, 0x54, 0x6a, 0x31, 0x7a, 0x30, 0x43, 0x32, 0x46, 0x49, 0x7a, 0x38, 0x77, \n\t0x78, 0x52, 0x35, 0x4d, 0x63, 0x49, 0x2f, 0x42, 0x45, 0x45, 0x65, 0x57, 0x37, 0x32, 0x2f, 0x61, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x31, 0x41, 0x74, 0x50, 0x63, 0x72, 0x64, 0x77, 0x45, 0x67, 0x34, 0x76, 0x35, 0x50, 0x34, 0x4c, 0x6c, \n\t0x78, 0x37, 0x4f, 0x70, 0x67, 0x6c, 0x4e, 0x65, 0x58, 0x6b, 0x7a, 0x45, 0x77, 0x49, 0x74, 0x2f, 0x6f, 0x4e, \n\t0x7a, 0x43, 0x43, 0x73, 0x59, 0x74, 0x6b, 0x39, 0x7a, 0x39, 0x4e, 0x33, 0x50, 0x67, 0x6c, 0x62, 0x70, 0x53, \n\t0x6c, 0x73, 0x59, 0x7a, 0x73, 0x6d, 0x72, 0x4e, 0x36, 0x58, 0x56, 0x71, 0x77, 0x71, 0x6e, 0x4b, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x33, 0x4a, 0x34, 0x50, 0x31, 0x79, 0x75, 0x41, 0x31, 0x4a, 0x61, 0x52, 0x45, 0x44, 0x6d, 0x59, 0x73, \n\t0x39, 0x61, 0x4d, 0x41, 0x55, 0x65, 0x53, 0x56, 0x32, 0x59, 0x6b, 0x4c, 0x42, 0x6e, 0x4e, 0x30, 0x35, 0x5a, \n\t0x61, 0x62, 0x6f, 0x73, 0x52, 0x59, 0x7a, 0x6e, 0x70, 0x65, 0x78, 0x72, 0x63, 0x42, 0x69, 0x66, 0x2b, 0x44, \n\t0x76, 0x57, 0x57, 0x73, 0x37, 0x58, 0x7a, 0x47, 0x68, 0x42, 0x35, 0x4e, 0x62, 0x69, 0x37, 0x6b, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x58, 0x44, 0x61, 0x4b, 0x31, 0x41, 0x74, 0x50, 0x66, 0x4c, 0x7a, 0x2f, 0x45, 0x76, 0x76, 0x50, 0x74, \n\t0x62, 0x77, 0x4c, 0x64, 0x49, 0x30, 0x6f, 0x68, 0x68, 0x56, 0x54, 0x44, 0x71, 0x50, 0x38, 0x63, 0x6f, 0x55, \n\t0x34, 0x62, 0x4f, 0x37, 0x55, 0x4f, 0x57, 0x42, 0x61, 0x4d, 0x51, 0x31, 0x36, 0x62, 0x6a, 0x45, 0x4d, 0x42, \n\t0x49, 0x39, 0x75, 0x48, 0x67, 0x4c, 0x48, 0x48, 0x6a, 0x52, 0x46, 0x6b, 0x47, 0x78, 0x76, 0x4c, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x44, 0x65, 0x75, 0x58, 0x71, 0x70, 0x48, 0x57, 0x49, 0x4c, 0x4f, 0x77, 0x30, 0x46, 0x41, 0x4c, 0x2f, \n\t0x77, 0x4a, 0x30, 0x34, 0x72, 0x77, 0x62, 0x79, 0x30, 0x69, 0x49, 0x35, 0x67, 0x59, 0x6c, 0x6f, 0x33, 0x51, \n\t0x47, 0x64, 0x6a, 0x57, 0x73, 0x31, 0x4c, 0x56, 0x52, 0x74, 0x38, 0x31, 0x59, 0x64, 0x45, 0x6e, 0x33, 0x79, \n\t0x77, 0x4c, 0x4c, 0x37, 0x48, 0x4f, 0x6b, 0x41, 0x62, 0x6e, 0x37, 0x53, 0x74, 0x68, 0x2b, 0x4b, 0x58, 0x5c, 0x0a,\n\t0x09, 0x58, 0x58, 0x74, 0x49, 0x48, 0x52, 0x41, 0x4a, 0x47, 0x66, 0x78, 0x4c, 0x6e, 0x64, 0x64, 0x4c, 0x75, \n\t0x49, 0x35, 0x63, 0x72, 0x61, 0x67, 0x47, 0x6a, 0x76, 0x6c, 0x35, 0x2f, 0x6a, 0x6a, 0x39, 0x77, 0x7a, 0x45, \n\t0x50, 0x36, 0x76, 0x63, 0x44, 0x34, 0x50, 0x6f, 0x78, 0x41, 0x58, 0x6a, 0x74, 0x59, 0x51, 0x52, 0x68, 0x50, \n\t0x74, 0x5a, 0x61, 0x53, 0x37, 0x67, 0x53, 0x62, 0x50, 0x75, 0x63, 0x46, 0x49, 0x36, 0x32, 0x2f, 0x54, 0x5c, 0x0a,\n\t0x09, 0x30, 0x51, 0x4e, 0x47, 0x73, 0x38, 0x67, 0x38, 0x59, 0x44, 0x52, 0x38, 0x53, 0x44, 0x58, 0x6b, 0x59, \n\t0x50, 0x57, 0x6f, 0x62, 0x6c, 0x6f, 0x4e, 0x49, 0x39, 0x31, 0x56, 0x61, 0x2f, 0x59, 0x67, 0x69, 0x75, 0x59, \n\t0x69, 0x35, 0x53, 0x59, 0x38, 0x36, 0x71, 0x48, 0x38, 0x41, 0x4b, 0x50, 0x45, 0x6d, 0x6f, 0x6b, 0x68, 0x49, \n\t0x64, 0x62, 0x4b, 0x73, 0x63, 0x50, 0x78, 0x6b, 0x5a, 0x56, 0x6b, 0x41, 0x61, 0x4f, 0x37, 0x65, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x70, 0x53, 0x36, 0x6c, 0x69, 0x78, 0x6e, 0x33, 0x54, 0x4a, 0x37, 0x45, 0x5a, 0x75, 0x64, 0x71, 0x37, \n\t0x52, 0x45, 0x45, 0x35, 0x2b, 0x46, 0x37, 0x6a, 0x72, 0x63, 0x7a, 0x42, 0x36, 0x42, 0x69, 0x4c, 0x2f, 0x45, \n\t0x45, 0x41, 0x65, 0x66, 0x58, 0x37, 0x66, 0x4a, 0x7a, 0x6c, 0x33, 0x57, 0x52, 0x73, 0x51, 0x2b, 0x63, 0x5a, \n\t0x77, 0x48, 0x50, 0x68, 0x76, 0x34, 0x45, 0x37, 0x6f, 0x52, 0x70, 0x58, 0x43, 0x4b, 0x4e, 0x64, 0x77, 0x5c, 0x0a,\n\t0x09, 0x70, 0x34, 0x42, 0x52, 0x70, 0x48, 0x2f, 0x65, 0x4d, 0x48, 0x4a, 0x70, 0x6e, 0x73, 0x76, 0x59, 0x35, \n\t0x58, 0x46, 0x69, 0x47, 0x4e, 0x6e, 0x77, 0x47, 0x42, 0x6a, 0x4e, 0x2b, 0x73, 0x4d, 0x35, 0x36, 0x79, 0x36, \n\t0x50, 0x35, 0x55, 0x55, 0x59, 0x50, 0x61, 0x59, 0x73, 0x6c, 0x49, 0x7a, 0x50, 0x53, 0x4d, 0x4d, 0x6b, 0x78, \n\t0x43, 0x58, 0x64, 0x6e, 0x74, 0x4a, 0x63, 0x6d, 0x37, 0x4e, 0x6d, 0x4e, 0x49, 0x79, 0x73, 0x5a, 0x61, 0x5c, 0x0a,\n\t0x09, 0x54, 0x68, 0x4e, 0x76, 0x4a, 0x7a, 0x6a, 0x58, 0x54, 0x58, 0x4c, 0x74, 0x4f, 0x6c, 0x79, 0x77, 0x49, \n\t0x71, 0x42, 0x79, 0x58, 0x54, 0x31, 0x59, 0x72, 0x41, 0x6c, 0x51, 0x47, 0x55, 0x68, 0x55, 0x34, 0x30, 0x31, \n\t0x38, 0x6a, 0x72, 0x63, 0x73, 0x66, 0x68, 0x31, 0x44, 0x2b, 0x75, 0x33, 0x6f, 0x6b, 0x55, 0x52, 0x76, 0x38, \n\t0x59, 0x65, 0x43, 0x61, 0x73, 0x44, 0x6b, 0x5a, 0x72, 0x41, 0x61, 0x4b, 0x39, 0x58, 0x2f, 0x4b, 0x75, 0x5c, 0x0a,\n\t0x09, 0x49, 0x4f, 0x48, 0x66, 0x41, 0x66, 0x35, 0x62, 0x51, 0x50, 0x45, 0x4c, 0x32, 0x77, 0x39, 0x47, 0x34, \n\t0x55, 0x53, 0x61, 0x70, 0x67, 0x37, 0x62, 0x30, 0x65, 0x72, 0x6f, 0x75, 0x69, 0x4d, 0x43, 0x6f, 0x30, 0x68, \n\t0x66, 0x7a, 0x77, 0x6d, 0x50, 0x6b, 0x59, 0x34, 0x75, 0x47, 0x4d, 0x33, 0x59, 0x52, 0x51, 0x4e, 0x6d, 0x33, \n\t0x75, 0x56, 0x78, 0x2b, 0x4c, 0x43, 0x79, 0x55, 0x42, 0x52, 0x30, 0x49, 0x72, 0x6a, 0x6f, 0x70, 0x53, 0x5c, 0x0a,\n\t0x09, 0x41, 0x42, 0x52, 0x68, 0x6f, 0x55, 0x70, 0x73, 0x73, 0x57, 0x64, 0x64, 0x50, 0x43, 0x4f, 0x51, 0x30, \n\t0x6a, 0x64, 0x53, 0x36, 0x33, 0x7a, 0x49, 0x4d, 0x53, 0x45, 0x51, 0x38, 0x6b, 0x43, 0x7a, 0x78, 0x72, 0x36, \n\t0x55, 0x53, 0x57, 0x56, 0x64, 0x63, 0x45, 0x78, 0x30, 0x79, 0x58, 0x4d, 0x65, 0x63, 0x4c, 0x53, 0x75, 0x70, \n\t0x69, 0x47, 0x4a, 0x65, 0x2f, 0x2f, 0x6b, 0x7a, 0x52, 0x4d, 0x2b, 0x44, 0x59, 0x4b, 0x7a, 0x32, 0x41, 0x5c, 0x0a,\n\t0x09, 0x49, 0x68, 0x68, 0x74, 0x41, 0x54, 0x38, 0x4a, 0x62, 0x45, 0x2f, 0x36, 0x4b, 0x4f, 0x63, 0x6c, 0x4b, \n\t0x77, 0x64, 0x52, 0x44, 0x53, 0x48, 0x63, 0x56, 0x34, 0x4c, 0x37, 0x35, 0x71, 0x34, 0x75, 0x30, 0x33, 0x67, \n\t0x59, 0x35, 0x58, 0x36, 0x35, 0x75, 0x32, 0x43, 0x55, 0x61, 0x56, 0x54, 0x4c, 0x67, 0x46, 0x47, 0x69, 0x62, \n\t0x78, 0x79, 0x4d, 0x77, 0x6f, 0x6c, 0x4d, 0x6d, 0x58, 0x4c, 0x68, 0x77, 0x37, 0x44, 0x4c, 0x34, 0x79, 0x5c, 0x0a,\n\t0x09, 0x77, 0x77, 0x47, 0x70, 0x30, 0x48, 0x32, 0x59, 0x73, 0x73, 0x6b, 0x71, 0x72, 0x52, 0x69, 0x57, 0x72, \n\t0x77, 0x71, 0x76, 0x48, 0x57, 0x44, 0x56, 0x68, 0x62, 0x52, 0x74, 0x71, 0x58, 0x70, 0x4f, 0x49, 0x74, 0x6a, \n\t0x45, 0x4b, 0x6a, 0x6a, 0x6e, 0x78, 0x4c, 0x42, 0x68, 0x79, 0x4a, 0x45, 0x39, 0x74, 0x32, 0x72, 0x77, 0x4b, \n\t0x30, 0x4e, 0x4d, 0x41, 0x30, 0x6f, 0x48, 0x4a, 0x4f, 0x61, 0x72, 0x4f, 0x4a, 0x57, 0x31, 0x4a, 0x57, 0x5c, 0x0a,\n\t0x09, 0x75, 0x79, 0x44, 0x57, 0x57, 0x6e, 0x4d, 0x36, 0x4c, 0x31, 0x58, 0x57, 0x34, 0x39, 0x38, 0x41, 0x78, \n\t0x51, 0x30, 0x35, 0x47, 0x48, 0x30, 0x65, 0x38, 0x48, 0x63, 0x52, 0x57, 0x59, 0x6c, 0x56, 0x74, 0x48, 0x49, \n\t0x51, 0x65, 0x62, 0x6b, 0x42, 0x2b, 0x45, 0x2f, 0x56, 0x6f, 0x62, 0x56, 0x61, 0x6a, 0x69, 0x43, 0x4d, 0x73, \n\t0x6c, 0x5a, 0x53, 0x46, 0x34, 0x78, 0x79, 0x6f, 0x4c, 0x43, 0x41, 0x57, 0x77, 0x53, 0x4d, 0x62, 0x44, 0x5c, 0x0a,\n\t0x09, 0x35, 0x7a, 0x68, 0x68, 0x45, 0x77, 0x4e, 0x59, 0x79, 0x47, 0x6a, 0x78, 0x41, 0x4e, 0x75, 0x32, 0x74, \n\t0x72, 0x52, 0x53, 0x51, 0x66, 0x46, 0x2f, 0x78, 0x4a, 0x4f, 0x54, 0x39, 0x4e, 0x6d, 0x77, 0x4d, 0x37, 0x77, \n\t0x43, 0x74, 0x78, 0x67, 0x4c, 0x66, 0x42, 0x4c, 0x4d, 0x41, 0x6f, 0x35, 0x47, 0x74, 0x47, 0x74, 0x54, 0x52, \n\t0x63, 0x4e, 0x42, 0x6a, 0x72, 0x66, 0x44, 0x51, 0x6f, 0x63, 0x2b, 0x76, 0x51, 0x4e, 0x48, 0x52, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x61, 0x39, 0x78, 0x4d, 0x57, 0x41, 0x4f, 0x4b, 0x45, 0x62, 0x41, 0x4e, 0x4a, 0x37, 0x2f, 0x54, 0x58, \n\t0x34, 0x2b, 0x46, 0x30, 0x66, 0x66, 0x6a, 0x33, 0x50, 0x57, 0x72, 0x63, 0x46, 0x79, 0x76, 0x46, 0x45, 0x52, \n\t0x37, 0x76, 0x2f, 0x67, 0x38, 0x2f, 0x7a, 0x4b, 0x37, 0x48, 0x77, 0x65, 0x75, 0x62, 0x57, 0x49, 0x57, 0x41, \n\t0x53, 0x4d, 0x72, 0x59, 0x32, 0x43, 0x55, 0x53, 0x78, 0x2b, 0x56, 0x35, 0x33, 0x4b, 0x41, 0x55, 0x65, 0x5c, 0x0a,\n\t0x09, 0x67, 0x57, 0x4c, 0x67, 0x68, 0x47, 0x73, 0x36, 0x7a, 0x59, 0x48, 0x7a, 0x32, 0x6d, 0x4c, 0x41, 0x77, \n\t0x39, 0x57, 0x6c, 0x54, 0x53, 0x44, 0x53, 0x4e, 0x74, 0x52, 0x52, 0x6d, 0x4c, 0x71, 0x73, 0x32, 0x42, 0x58, \n\t0x5a, 0x71, 0x77, 0x42, 0x56, 0x39, 0x75, 0x37, 0x70, 0x44, 0x76, 0x71, 0x6b, 0x58, 0x70, 0x61, 0x78, 0x67, \n\t0x46, 0x47, 0x47, 0x62, 0x57, 0x6f, 0x53, 0x56, 0x77, 0x30, 0x7a, 0x71, 0x47, 0x37, 0x57, 0x6c, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x46, 0x6c, 0x45, 0x30, 0x43, 0x71, 0x65, 0x4f, 0x74, 0x2b, 0x36, 0x45, 0x33, 0x61, 0x2f, 0x77, 0x35, \n\t0x55, 0x48, 0x44, 0x36, 0x44, 0x51, 0x69, 0x2f, 0x78, 0x70, 0x41, 0x48, 0x6e, 0x6e, 0x65, 0x64, 0x4d, 0x39, \n\t0x30, 0x53, 0x6c, 0x6e, 0x5a, 0x45, 0x6f, 0x2b, 0x39, 0x58, 0x36, 0x78, 0x76, 0x39, 0x47, 0x74, 0x78, 0x2f, \n\t0x46, 0x78, 0x31, 0x6d, 0x4f, 0x6d, 0x4c, 0x52, 0x47, 0x30, 0x67, 0x6a, 0x6e, 0x63, 0x64, 0x53, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x57, 0x69, 0x64, 0x57, 0x6e, 0x67, 0x38, 0x38, 0x6e, 0x63, 0x71, 0x39, 0x32, 0x35, 0x73, 0x45, 0x4e, \n\t0x66, 0x55, 0x73, 0x61, 0x6a, 0x76, 0x72, 0x47, 0x61, 0x44, 0x61, 0x2f, 0x62, 0x4c, 0x6f, 0x38, 0x37, 0x4e, \n\t0x30, 0x42, 0x78, 0x69, 0x75, 0x69, 0x6a, 0x6a, 0x50, 0x70, 0x6a, 0x68, 0x59, 0x58, 0x7a, 0x65, 0x54, 0x71, \n\t0x53, 0x62, 0x36, 0x4e, 0x46, 0x36, 0x38, 0x6f, 0x4b, 0x63, 0x79, 0x34, 0x73, 0x7a, 0x33, 0x44, 0x45, 0x5c, 0x0a,\n\t0x09, 0x47, 0x35, 0x72, 0x35, 0x66, 0x48, 0x4c, 0x62, 0x78, 0x6b, 0x62, 0x4c, 0x51, 0x75, 0x4b, 0x4e, 0x7a, \n\t0x6c, 0x79, 0x79, 0x78, 0x57, 0x79, 0x68, 0x79, 0x72, 0x49, 0x56, 0x35, 0x38, 0x57, 0x41, 0x5a, 0x6d, 0x76, \n\t0x63, 0x72, 0x56, 0x52, 0x50, 0x74, 0x4b, 0x51, 0x6a, 0x74, 0x78, 0x51, 0x6b, 0x55, 0x32, 0x36, 0x37, 0x46, \n\t0x73, 0x30, 0x4e, 0x51, 0x43, 0x37, 0x42, 0x6f, 0x31, 0x38, 0x50, 0x63, 0x74, 0x5a, 0x66, 0x43, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x70, 0x72, 0x73, 0x69, 0x39, 0x45, 0x65, 0x43, 0x73, 0x4f, 0x33, 0x4a, 0x56, 0x76, 0x6e, 0x2b, 0x71, \n\t0x52, 0x42, 0x6a, 0x6b, 0x73, 0x53, 0x7a, 0x79, 0x75, 0x41, 0x33, 0x36, 0x6b, 0x6e, 0x39, 0x58, 0x43, 0x48, \n\t0x43, 0x79, 0x6a, 0x54, 0x47, 0x75, 0x4a, 0x38, 0x68, 0x67, 0x33, 0x72, 0x47, 0x2f, 0x7a, 0x58, 0x49, 0x52, \n\t0x6c, 0x5a, 0x4e, 0x4f, 0x50, 0x73, 0x34, 0x79, 0x43, 0x76, 0x67, 0x56, 0x5a, 0x52, 0x72, 0x6f, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x72, 0x54, 0x70, 0x57, 0x5a, 0x42, 0x6d, 0x4e, 0x7a, 0x74, 0x46, 0x59, 0x4f, 0x73, 0x45, 0x2f, 0x46, \n\t0x48, 0x37, 0x35, 0x53, 0x79, 0x68, 0x46, 0x78, 0x52, 0x6d, 0x66, 0x6a, 0x52, 0x35, 0x35, 0x73, 0x6b, 0x50, \n\t0x37, 0x75, 0x63, 0x6d, 0x48, 0x57, 0x64, 0x2b, 0x51, 0x74, 0x70, 0x71, 0x30, 0x4e, 0x52, 0x5a, 0x62, 0x49, \n\t0x57, 0x4b, 0x74, 0x71, 0x48, 0x67, 0x2b, 0x49, 0x6e, 0x73, 0x41, 0x41, 0x43, 0x41, 0x41, 0x53, 0x55, 0x5c, 0x0a,\n\t0x09, 0x52, 0x42, 0x56, 0x4e, 0x71, 0x36, 0x45, 0x61, 0x55, 0x2f, 0x57, 0x45, 0x32, 0x5a, 0x62, 0x6c, 0x74, \n\t0x6b, 0x6a, 0x56, 0x6e, 0x48, 0x74, 0x76, 0x45, 0x39, 0x6b, 0x65, 0x6e, 0x79, 0x35, 0x53, 0x5a, 0x44, 0x75, \n\t0x6d, 0x4f, 0x56, 0x76, 0x77, 0x6a, 0x76, 0x71, 0x34, 0x73, 0x74, 0x6f, 0x78, 0x2f, 0x42, 0x55, 0x63, 0x79, \n\t0x6e, 0x36, 0x39, 0x31, 0x50, 0x56, 0x67, 0x4b, 0x69, 0x76, 0x64, 0x63, 0x2b, 0x50, 0x7a, 0x53, 0x69, 0x5c, 0x0a,\n\t0x09, 0x66, 0x30, 0x2f, 0x6f, 0x6b, 0x72, 0x57, 0x42, 0x59, 0x6b, 0x79, 0x6a, 0x6d, 0x67, 0x68, 0x47, 0x75, \n\t0x66, 0x78, 0x71, 0x33, 0x55, 0x48, 0x36, 0x77, 0x4d, 0x6a, 0x47, 0x48, 0x32, 0x45, 0x59, 0x4a, 0x61, 0x4e, \n\t0x33, 0x2b, 0x68, 0x35, 0x58, 0x44, 0x4b, 0x50, 0x52, 0x34, 0x37, 0x34, 0x52, 0x42, 0x74, 0x43, 0x55, 0x78, \n\t0x44, 0x41, 0x61, 0x30, 0x55, 0x78, 0x34, 0x74, 0x4e, 0x30, 0x30, 0x66, 0x31, 0x30, 0x30, 0x2b, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x56, 0x68, 0x46, 0x49, 0x34, 0x50, 0x7a, 0x4c, 0x6c, 0x68, 0x65, 0x6c, 0x77, 0x37, 0x74, 0x48, 0x58, \n\t0x33, 0x72, 0x66, 0x6b, 0x62, 0x64, 0x64, 0x4d, 0x69, 0x63, 0x43, 0x6a, 0x66, 0x55, 0x54, 0x51, 0x61, 0x5a, \n\t0x67, 0x47, 0x59, 0x57, 0x35, 0x64, 0x6d, 0x52, 0x75, 0x41, 0x53, 0x4f, 0x4f, 0x6c, 0x4a, 0x6b, 0x70, 0x6b, \n\t0x5a, 0x34, 0x4c, 0x75, 0x76, 0x71, 0x50, 0x59, 0x77, 0x73, 0x6a, 0x42, 0x43, 0x6e, 0x6f, 0x33, 0x77, 0x5c, 0x0a,\n\t0x09, 0x56, 0x30, 0x47, 0x51, 0x73, 0x38, 0x76, 0x70, 0x6f, 0x69, 0x30, 0x64, 0x52, 0x48, 0x75, 0x76, 0x44, \n\t0x56, 0x50, 0x4a, 0x33, 0x56, 0x63, 0x68, 0x66, 0x4f, 0x33, 0x6b, 0x56, 0x6b, 0x73, 0x61, 0x37, 0x67, 0x32, \n\t0x6a, 0x58, 0x73, 0x35, 0x72, 0x6d, 0x47, 0x6a, 0x43, 0x59, 0x78, 0x32, 0x2f, 0x51, 0x68, 0x68, 0x46, 0x2b, \n\t0x6a, 0x72, 0x41, 0x65, 0x65, 0x52, 0x67, 0x56, 0x45, 0x4a, 0x35, 0x6e, 0x74, 0x6f, 0x66, 0x70, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x45, 0x52, 0x57, 0x52, 0x68, 0x69, 0x51, 0x4a, 0x4b, 0x44, 0x30, 0x63, 0x6a, 0x38, 0x30, 0x2b, 0x6d, \n\t0x44, 0x68, 0x61, 0x48, 0x7a, 0x55, 0x77, 0x43, 0x79, 0x49, 0x31, 0x6a, 0x31, 0x2f, 0x6b, 0x53, 0x78, 0x73, \n\t0x31, 0x6a, 0x61, 0x2f, 0x45, 0x77, 0x52, 0x6a, 0x49, 0x77, 0x56, 0x6b, 0x2f, 0x4d, 0x5a, 0x74, 0x63, 0x37, \n\t0x51, 0x74, 0x72, 0x34, 0x6b, 0x62, 0x52, 0x6d, 0x5a, 0x74, 0x4f, 0x48, 0x65, 0x54, 0x76, 0x78, 0x74, 0x5c, 0x0a,\n\t0x09, 0x31, 0x65, 0x34, 0x38, 0x6a, 0x4d, 0x6f, 0x53, 0x6b, 0x48, 0x38, 0x4b, 0x62, 0x6e, 0x75, 0x32, 0x42, \n\t0x39, 0x70, 0x66, 0x56, 0x74, 0x51, 0x31, 0x63, 0x36, 0x66, 0x42, 0x7a, 0x35, 0x36, 0x65, 0x79, 0x6d, 0x72, \n\t0x68, 0x63, 0x4d, 0x46, 0x49, 0x35, 0x35, 0x6e, 0x6f, 0x6e, 0x41, 0x52, 0x47, 0x39, 0x70, 0x34, 0x6d, 0x6e, \n\t0x57, 0x4d, 0x30, 0x6d, 0x59, 0x35, 0x44, 0x41, 0x61, 0x50, 0x52, 0x65, 0x61, 0x6f, 0x47, 0x46, 0x71, 0x5c, 0x0a,\n\t0x09, 0x34, 0x4a, 0x44, 0x54, 0x33, 0x41, 0x49, 0x44, 0x54, 0x30, 0x41, 0x4b, 0x4e, 0x63, 0x39, 0x38, 0x62, \n\t0x41, 0x4b, 0x44, 0x6e, 0x57, 0x4d, 0x41, 0x71, 0x4f, 0x5a, 0x74, 0x57, 0x74, 0x69, 0x6b, 0x62, 0x45, 0x4e, \n\t0x46, 0x53, 0x73, 0x48, 0x76, 0x38, 0x4e, 0x74, 0x5a, 0x61, 0x52, 0x74, 0x73, 0x61, 0x71, 0x55, 0x39, 0x5a, \n\t0x50, 0x64, 0x74, 0x32, 0x61, 0x36, 0x61, 0x71, 0x31, 0x54, 0x6f, 0x62, 0x4d, 0x4f, 0x4c, 0x53, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x75, 0x55, 0x59, 0x6a, 0x47, 0x44, 0x77, 0x46, 0x64, 0x6c, 0x37, 0x68, 0x7a, 0x32, 0x6e, 0x4c, 0x69, \n\t0x4e, 0x74, 0x41, 0x58, 0x6f, 0x57, 0x41, 0x6e, 0x44, 0x56, 0x4c, 0x50, 0x68, 0x63, 0x67, 0x53, 0x77, 0x56, \n\t0x52, 0x59, 0x77, 0x33, 0x78, 0x76, 0x65, 0x43, 0x65, 0x56, 0x45, 0x64, 0x4d, 0x42, 0x51, 0x72, 0x57, 0x46, \n\t0x45, 0x61, 0x32, 0x4c, 0x4a, 0x6b, 0x38, 0x45, 0x35, 0x31, 0x39, 0x59, 0x52, 0x51, 0x33, 0x2b, 0x73, 0x5c, 0x0a,\n\t0x09, 0x30, 0x75, 0x6a, 0x79, 0x43, 0x6a, 0x50, 0x56, 0x38, 0x77, 0x42, 0x51, 0x4c, 0x64, 0x56, 0x55, 0x75, \n\t0x36, 0x57, 0x67, 0x45, 0x6b, 0x49, 0x35, 0x70, 0x56, 0x2b, 0x4e, 0x59, 0x43, 0x73, 0x6c, 0x30, 0x67, 0x42, \n\t0x62, 0x63, 0x75, 0x47, 0x4e, 0x6d, 0x52, 0x71, 0x36, 0x69, 0x62, 0x46, 0x6c, 0x74, 0x64, 0x6f, 0x6e, 0x31, \n\t0x55, 0x30, 0x55, 0x69, 0x65, 0x7a, 0x72, 0x64, 0x74, 0x2b, 0x46, 0x36, 0x42, 0x70, 0x48, 0x57, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x33, 0x39, 0x35, 0x48, 0x7a, 0x6d, 0x66, 0x6b, 0x2f, 0x78, 0x33, 0x2f, 0x4f, 0x6d, 0x44, 0x48, 0x77, \n\t0x4b, 0x67, 0x45, 0x34, 0x66, 0x74, 0x78, 0x48, 0x46, 0x2b, 0x47, 0x55, 0x62, 0x52, 0x63, 0x69, 0x36, 0x69, \n\t0x36, 0x6f, 0x61, 0x63, 0x43, 0x33, 0x31, 0x47, 0x64, 0x61, 0x4f, 0x6d, 0x57, 0x54, 0x51, 0x51, 0x6a, 0x45, \n\t0x31, 0x77, 0x31, 0x6a, 0x44, 0x67, 0x4d, 0x4d, 0x4d, 0x72, 0x56, 0x34, 0x78, 0x51, 0x77, 0x47, 0x72, 0x5c, 0x0a,\n\t0x09, 0x63, 0x75, 0x62, 0x53, 0x6b, 0x77, 0x4b, 0x70, 0x48, 0x52, 0x66, 0x6c, 0x4f, 0x77, 0x47, 0x67, 0x72, \n\t0x61, 0x78, 0x36, 0x4d, 0x73, 0x48, 0x2b, 0x32, 0x59, 0x52, 0x73, 0x45, 0x6f, 0x67, 0x6f, 0x48, 0x45, 0x31, \n\t0x39, 0x57, 0x4f, 0x5a, 0x64, 0x33, 0x6f, 0x41, 0x34, 0x78, 0x73, 0x64, 0x31, 0x44, 0x46, 0x31, 0x51, 0x74, \n\t0x61, 0x46, 0x52, 0x77, 0x55, 0x6b, 0x4d, 0x54, 0x36, 0x66, 0x37, 0x72, 0x6d, 0x4b, 0x4c, 0x55, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x37, 0x65, 0x65, 0x6d, 0x41, 0x64, 0x54, 0x64, 0x73, 0x7a, 0x4a, 0x54, 0x2f, 0x67, 0x79, 0x6f, 0x69, \n\t0x71, 0x74, 0x68, 0x39, 0x30, 0x74, 0x70, 0x66, 0x45, 0x51, 0x75, 0x33, 0x4e, 0x4d, 0x4e, 0x43, 0x4e, 0x38, \n\t0x47, 0x67, 0x6a, 0x79, 0x38, 0x57, 0x4b, 0x74, 0x6f, 0x61, 0x53, 0x44, 0x61, 0x65, 0x34, 0x33, 0x2f, 0x63, \n\t0x6b, 0x43, 0x31, 0x76, 0x59, 0x65, 0x61, 0x53, 0x6a, 0x34, 0x72, 0x6a, 0x4e, 0x4a, 0x47, 0x74, 0x56, 0x5c, 0x0a,\n\t0x09, 0x49, 0x59, 0x69, 0x51, 0x57, 0x46, 0x76, 0x54, 0x2b, 0x56, 0x5a, 0x36, 0x4a, 0x7a, 0x6a, 0x57, 0x47, \n\t0x6b, 0x79, 0x37, 0x78, 0x75, 0x4d, 0x43, 0x6f, 0x76, 0x49, 0x76, 0x58, 0x6e, 0x70, 0x67, 0x4e, 0x45, 0x51, \n\t0x6e, 0x64, 0x4c, 0x57, 0x30, 0x53, 0x32, 0x6d, 0x39, 0x59, 0x47, 0x6f, 0x32, 0x47, 0x63, 0x4a, 0x6e, 0x46, \n\t0x51, 0x6c, 0x38, 0x51, 0x4f, 0x62, 0x4f, 0x58, 0x73, 0x31, 0x6b, 0x37, 0x69, 0x4b, 0x43, 0x38, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x77, 0x59, 0x32, 0x59, 0x73, 0x45, 0x53, 0x64, 0x52, 0x38, 0x31, 0x58, 0x49, 0x78, 0x56, 0x6b, \n\t0x33, 0x4f, 0x4b, 0x52, 0x35, 0x61, 0x50, 0x37, 0x75, 0x4c, 0x70, 0x38, 0x6c, 0x73, 0x4c, 0x79, 0x35, 0x38, \n\t0x2f, 0x39, 0x6c, 0x65, 0x41, 0x58, 0x51, 0x4d, 0x6a, 0x51, 0x4d, 0x72, 0x76, 0x41, 0x6e, 0x64, 0x38, 0x30, \n\t0x5a, 0x4d, 0x63, 0x6c, 0x77, 0x4b, 0x69, 0x76, 0x56, 0x39, 0x34, 0x55, 0x59, 0x44, 0x4d, 0x6c, 0x77, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x66, 0x30, 0x74, 0x32, 0x51, 0x56, 0x58, 0x68, 0x42, 0x4d, 0x49, 0x72, 0x43, 0x53, 0x34, 0x4f, \n\t0x52, 0x31, 0x65, 0x66, 0x7a, 0x54, 0x48, 0x53, 0x75, 0x47, 0x45, 0x61, 0x4a, 0x32, 0x48, 0x4b, 0x76, 0x49, \n\t0x59, 0x78, 0x6b, 0x44, 0x79, 0x67, 0x72, 0x47, 0x4f, 0x55, 0x73, 0x6e, 0x36, 0x68, 0x52, 0x68, 0x33, 0x4d, \n\t0x5a, 0x47, 0x4f, 0x6c, 0x72, 0x4f, 0x63, 0x6a, 0x41, 0x53, 0x48, 0x65, 0x78, 0x44, 0x48, 0x41, 0x69, 0x5c, 0x0a,\n\t0x09, 0x55, 0x47, 0x6c, 0x59, 0x47, 0x42, 0x69, 0x56, 0x71, 0x57, 0x55, 0x6a, 0x79, 0x6b, 0x70, 0x71, 0x6e, \n\t0x39, 0x53, 0x59, 0x67, 0x35, 0x47, 0x46, 0x6c, 0x37, 0x46, 0x38, 0x6f, 0x69, 0x35, 0x59, 0x36, 0x4d, 0x35, \n\t0x70, 0x79, 0x30, 0x32, 0x42, 0x74, 0x44, 0x67, 0x42, 0x78, 0x2f, 0x36, 0x53, 0x4c, 0x7a, 0x4d, 0x4e, 0x7a, \n\t0x49, 0x56, 0x72, 0x6b, 0x50, 0x4a, 0x56, 0x49, 0x4d, 0x68, 0x44, 0x64, 0x38, 0x33, 0x77, 0x49, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x74, 0x6c, 0x69, 0x56, 0x30, 0x7a, 0x74, 0x77, 0x76, 0x38, 0x75, 0x7a, 0x6f, 0x34, 0x64, 0x31, 0x44, \n\t0x30, 0x62, 0x31, 0x52, 0x48, 0x63, 0x5a, 0x66, 0x48, 0x4a, 0x4c, 0x39, 0x70, 0x59, 0x58, 0x51, 0x59, 0x4e, \n\t0x31, 0x59, 0x72, 0x6c, 0x58, 0x57, 0x43, 0x67, 0x68, 0x45, 0x61, 0x4a, 0x4d, 0x48, 0x48, 0x6b, 0x34, 0x46, \n\t0x52, 0x33, 0x57, 0x6a, 0x44, 0x74, 0x54, 0x34, 0x75, 0x57, 0x44, 0x32, 0x6c, 0x68, 0x6c, 0x48, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x35, 0x42, 0x73, 0x42, 0x79, 0x50, 0x74, 0x31, 0x6f, 0x6e, 0x7a, 0x73, 0x63, 0x67, 0x31, 0x64, 0x46, \n\t0x6d, 0x33, 0x35, 0x68, 0x47, 0x35, 0x61, 0x68, 0x2b, 0x57, 0x54, 0x7a, 0x44, 0x33, 0x53, 0x33, 0x61, 0x75, \n\t0x4d, 0x46, 0x53, 0x51, 0x57, 0x55, 0x4f, 0x48, 0x2b, 0x64, 0x54, 0x66, 0x51, 0x35, 0x48, 0x50, 0x38, 0x79, \n\t0x36, 0x6b, 0x2b, 0x66, 0x5a, 0x62, 0x41, 0x36, 0x44, 0x75, 0x42, 0x72, 0x55, 0x58, 0x36, 0x69, 0x68, 0x5c, 0x0a,\n\t0x09, 0x59, 0x4f, 0x6f, 0x72, 0x31, 0x66, 0x65, 0x46, 0x45, 0x34, 0x2f, 0x4e, 0x75, 0x49, 0x65, 0x33, 0x49, \n\t0x55, 0x32, 0x64, 0x61, 0x51, 0x70, 0x77, 0x5a, 0x46, 0x48, 0x46, 0x36, 0x6e, 0x6a, 0x64, 0x57, 0x53, 0x2b, \n\t0x4d, 0x36, 0x48, 0x4f, 0x67, 0x5a, 0x47, 0x35, 0x42, 0x76, 0x39, 0x35, 0x62, 0x76, 0x4c, 0x59, 0x39, 0x4f, \n\t0x6f, 0x70, 0x56, 0x37, 0x61, 0x45, 0x57, 0x43, 0x6b, 0x34, 0x52, 0x47, 0x36, 0x59, 0x52, 0x70, 0x47, 0x5c, 0x0a,\n\t0x09, 0x47, 0x6c, 0x36, 0x32, 0x53, 0x78, 0x59, 0x61, 0x62, 0x6b, 0x6d, 0x36, 0x34, 0x5a, 0x70, 0x4f, 0x70, \n\t0x78, 0x70, 0x33, 0x59, 0x67, 0x31, 0x6c, 0x77, 0x42, 0x4f, 0x4e, 0x73, 0x70, 0x6c, 0x75, 0x57, 0x70, 0x76, \n\t0x66, 0x4a, 0x77, 0x4b, 0x4e, 0x37, 0x67, 0x34, 0x61, 0x66, 0x31, 0x4c, 0x69, 0x32, 0x4e, 0x62, 0x58, 0x36, \n\t0x62, 0x6c, 0x45, 0x39, 0x72, 0x6f, 0x53, 0x32, 0x49, 0x46, 0x6a, 0x79, 0x6c, 0x66, 0x6b, 0x57, 0x51, 0x5c, 0x0a,\n\t0x09, 0x35, 0x79, 0x4d, 0x38, 0x4c, 0x58, 0x67, 0x69, 0x41, 0x50, 0x4c, 0x73, 0x59, 0x71, 0x57, 0x70, 0x5a, \n\t0x46, 0x64, 0x49, 0x70, 0x71, 0x7a, 0x35, 0x4d, 0x78, 0x6a, 0x55, 0x71, 0x46, 0x6a, 0x79, 0x43, 0x4d, 0x4a, \n\t0x74, 0x37, 0x6c, 0x73, 0x51, 0x31, 0x47, 0x43, 0x65, 0x43, 0x57, 0x42, 0x61, 0x4d, 0x51, 0x31, 0x36, 0x5a, \n\t0x6a, 0x68, 0x54, 0x41, 0x71, 0x76, 0x63, 0x4e, 0x61, 0x53, 0x6c, 0x38, 0x48, 0x41, 0x51, 0x72, 0x68, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x46, 0x68, 0x4d, 0x42, 0x69, 0x6f, 0x52, 0x55, 0x48, 0x51, 0x33, 0x4b, 0x67, 0x65, 0x6a, 0x59, \n\t0x46, 0x45, 0x4e, 0x4d, 0x39, 0x65, 0x4f, 0x6d, 0x6a, 0x79, 0x53, 0x62, 0x70, 0x72, 0x74, 0x7a, 0x6f, 0x56, \n\t0x72, 0x54, 0x54, 0x64, 0x4c, 0x53, 0x71, 0x51, 0x30, 0x38, 0x35, 0x4d, 0x69, 0x6d, 0x47, 0x57, 0x36, 0x61, \n\t0x63, 0x6e, 0x49, 0x6d, 0x62, 0x34, 0x33, 0x4d, 0x7a, 0x66, 0x4a, 0x6a, 0x71, 0x49, 0x6c, 0x63, 0x34, 0x5c, 0x0a,\n\t0x09, 0x39, 0x4b, 0x4f, 0x50, 0x59, 0x6c, 0x56, 0x65, 0x65, 0x6c, 0x68, 0x6c, 0x45, 0x5a, 0x59, 0x50, 0x51, \n\t0x39, 0x4c, 0x50, 0x44, 0x6a, 0x6a, 0x41, 0x73, 0x46, 0x30, 0x64, 0x34, 0x76, 0x76, 0x4e, 0x67, 0x66, 0x75, \n\t0x65, 0x39, 0x41, 0x4c, 0x32, 0x70, 0x4e, 0x48, 0x4c, 0x69, 0x72, 0x67, 0x46, 0x47, 0x49, 0x6d, 0x31, 0x62, \n\t0x48, 0x6b, 0x6d, 0x41, 0x55, 0x46, 0x58, 0x62, 0x56, 0x4d, 0x4c, 0x4c, 0x50, 0x4c, 0x61, 0x65, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x42, 0x34, 0x78, 0x6d, 0x6b, 0x54, 0x59, 0x59, 0x79, 0x51, 0x46, 0x4e, 0x31, 0x36, 0x7a, 0x4e, 0x4d, \n\t0x76, 0x4a, 0x2f, 0x4b, 0x59, 0x6d, 0x2b, 0x7a, 0x43, 0x45, 0x71, 0x4c, 0x76, 0x45, 0x50, 0x71, 0x55, 0x59, \n\t0x65, 0x59, 0x4b, 0x52, 0x48, 0x6e, 0x36, 0x77, 0x76, 0x4b, 0x75, 0x71, 0x6d, 0x5a, 0x57, 0x41, 0x55, 0x51, \n\t0x64, 0x42, 0x61, 0x53, 0x31, 0x58, 0x58, 0x53, 0x30, 0x72, 0x31, 0x75, 0x57, 0x73, 0x39, 0x30, 0x64, 0x5c, 0x0a,\n\t0x09, 0x47, 0x75, 0x33, 0x6f, 0x2b, 0x63, 0x7a, 0x33, 0x70, 0x70, 0x52, 0x32, 0x6e, 0x2b, 0x57, 0x69, 0x74, \n\t0x4a, 0x2b, 0x5a, 0x4a, 0x73, 0x74, 0x38, 0x36, 0x64, 0x72, 0x47, 0x5a, 0x63, 0x56, 0x31, 0x30, 0x79, 0x64, \n\t0x51, 0x38, 0x38, 0x41, 0x2b, 0x53, 0x4c, 0x46, 0x39, 0x55, 0x39, 0x57, 0x79, 0x69, 0x49, 0x2f, 0x41, 0x6a, \n\t0x56, 0x4e, 0x63, 0x41, 0x2f, 0x36, 0x47, 0x35, 0x55, 0x73, 0x48, 0x77, 0x59, 0x61, 0x66, 0x2f, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x74, 0x44, 0x70, 0x4d, 0x39, 0x53, 0x30, 0x43, 0x52, 0x6c, 0x32, 0x7a, 0x79, 0x72, 0x4d, 0x77, 0x38, \n\t0x6c, 0x48, 0x72, 0x44, 0x4b, 0x4d, 0x75, 0x61, 0x36, 0x75, 0x50, 0x5a, 0x47, 0x47, 0x6b, 0x72, 0x42, 0x4d, \n\t0x50, 0x67, 0x2f, 0x5a, 0x75, 0x6d, 0x67, 0x64, 0x57, 0x74, 0x42, 0x56, 0x73, 0x67, 0x46, 0x48, 0x77, 0x70, \n\t0x52, 0x7a, 0x45, 0x36, 0x61, 0x58, 0x30, 0x73, 0x50, 0x4e, 0x57, 0x6c, 0x6d, 0x67, 0x59, 0x61, 0x47, 0x5c, 0x0a,\n\t0x09, 0x75, 0x71, 0x41, 0x30, 0x61, 0x68, 0x77, 0x64, 0x65, 0x66, 0x76, 0x4d, 0x35, 0x5a, 0x50, 0x6b, 0x33, \n\t0x58, 0x53, 0x2b, 0x72, 0x79, 0x48, 0x44, 0x54, 0x33, 0x5a, 0x30, 0x66, 0x46, 0x62, 0x50, 0x65, 0x72, 0x54, \n\t0x68, 0x4f, 0x67, 0x5a, 0x48, 0x31, 0x4e, 0x51, 0x36, 0x50, 0x48, 0x57, 0x6b, 0x74, 0x44, 0x4f, 0x50, 0x34, \n\t0x58, 0x71, 0x62, 0x36, 0x50, 0x4a, 0x72, 0x36, 0x4b, 0x61, 0x78, 0x6a, 0x39, 0x48, 0x52, 0x44, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x2f, 0x58, 0x6e, 0x76, 0x75, 0x59, 0x6d, 0x43, 0x77, 0x50, 0x52, 0x70, 0x66, 0x2f, 0x2b, 0x45, \n\t0x67, 0x42, 0x45, 0x2b, 0x47, 0x37, 0x67, 0x69, 0x6d, 0x79, 0x69, 0x73, 0x54, 0x44, 0x53, 0x63, 0x53, 0x70, \n\t0x2b, 0x6e, 0x57, 0x42, 0x6b, 0x47, 0x39, 0x58, 0x63, 0x59, 0x65, 0x54, 0x53, 0x50, 0x44, 0x74, 0x68, 0x5a, \n\t0x4a, 0x65, 0x43, 0x71, 0x48, 0x4f, 0x54, 0x77, 0x43, 0x6a, 0x53, 0x31, 0x77, 0x64, 0x47, 0x4e, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x77, 0x4f, 0x52, 0x73, 0x77, 0x6d, 0x53, 0x5a, 0x33, 0x6f, 0x72, 0x6c, 0x49, 0x44, 0x6e, 0x61, 0x6f, \n\t0x78, 0x53, 0x78, 0x4e, 0x76, 0x67, 0x52, 0x55, 0x73, 0x6c, 0x4e, 0x6f, 0x36, 0x67, 0x62, 0x6a, 0x37, 0x6f, \n\t0x74, 0x50, 0x72, 0x37, 0x70, 0x51, 0x43, 0x67, 0x35, 0x36, 0x49, 0x47, 0x44, 0x56, 0x2b, 0x55, 0x66, 0x47, \n\t0x36, 0x43, 0x78, 0x66, 0x69, 0x64, 0x50, 0x66, 0x51, 0x64, 0x4d, 0x4e, 0x71, 0x47, 0x49, 0x56, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x42, 0x30, 0x71, 0x50, 0x39, 0x76, 0x2f, 0x59, 0x59, 0x2b, 0x31, 0x44, 0x73, 0x74, 0x30, 0x30, 0x5a, \n\t0x58, 0x31, 0x46, 0x65, 0x6b, 0x5a, 0x78, 0x47, 0x64, 0x32, 0x56, 0x73, 0x50, 0x50, 0x43, 0x35, 0x6b, 0x45, \n\t0x31, 0x6c, 0x74, 0x46, 0x66, 0x42, 0x48, 0x66, 0x72, 0x49, 0x6f, 0x62, 0x79, 0x46, 0x2b, 0x77, 0x6a, 0x63, \n\t0x6b, 0x38, 0x45, 0x76, 0x69, 0x31, 0x70, 0x35, 0x46, 0x6f, 0x36, 0x59, 0x5a, 0x52, 0x37, 0x63, 0x61, 0x5c, 0x0a,\n\t0x09, 0x65, 0x41, 0x6b, 0x56, 0x62, 0x58, 0x43, 0x30, 0x59, 0x74, 0x4f, 0x74, 0x74, 0x30, 0x4a, 0x4e, 0x63, \n\t0x64, 0x41, 0x52, 0x68, 0x4e, 0x75, 0x78, 0x51, 0x6b, 0x30, 0x74, 0x45, 0x46, 0x6f, 0x78, 0x6e, 0x39, 0x52, \n\t0x58, 0x55, 0x5a, 0x67, 0x31, 0x57, 0x6b, 0x59, 0x52, 0x45, 0x66, 0x64, 0x7a, 0x71, 0x77, 0x49, 0x78, 0x67, \n\t0x46, 0x4f, 0x4b, 0x67, 0x30, 0x57, 0x52, 0x67, 0x64, 0x4e, 0x4e, 0x64, 0x6e, 0x2f, 0x55, 0x44, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x62, 0x2b, 0x74, 0x77, 0x75, 0x34, 0x5a, 0x49, 0x47, 0x34, 0x7a, 0x4d, 0x42, 0x78, 0x30, 0x6a, 0x66, \n\t0x35, 0x48, 0x74, 0x6d, 0x6d, 0x6d, 0x72, 0x53, 0x6e, 0x63, 0x64, 0x72, 0x63, 0x34, 0x68, 0x37, 0x52, 0x61, \n\t0x52, 0x7a, 0x2f, 0x66, 0x59, 0x2f, 0x2b, 0x4b, 0x76, 0x77, 0x55, 0x4d, 0x54, 0x6f, 0x48, 0x52, 0x49, 0x2b, \n\t0x61, 0x30, 0x67, 0x79, 0x4b, 0x65, 0x66, 0x4e, 0x65, 0x50, 0x44, 0x69, 0x32, 0x55, 0x68, 0x49, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x72, 0x30, 0x33, 0x31, 0x34, 0x63, 0x57, 0x73, 0x43, 0x33, 0x67, 0x7a, 0x73, 0x47, 0x70, 0x42, 0x61, \n\t0x48, 0x6c, 0x6b, 0x58, 0x44, 0x61, 0x4e, 0x71, 0x6c, 0x49, 0x4c, 0x31, 0x31, 0x5a, 0x42, 0x72, 0x56, 0x4d, \n\t0x6d, 0x43, 0x55, 0x36, 0x42, 0x73, 0x48, 0x6f, 0x33, 0x41, 0x69, 0x55, 0x36, 0x5a, 0x63, 0x2b, 0x44, 0x44, \n\t0x41, 0x43, 0x4b, 0x68, 0x68, 0x46, 0x43, 0x31, 0x2b, 0x44, 0x63, 0x63, 0x42, 0x52, 0x6a, 0x35, 0x64, 0x5c, 0x0a,\n\t0x09, 0x41, 0x68, 0x72, 0x74, 0x33, 0x39, 0x47, 0x57, 0x54, 0x67, 0x75, 0x4d, 0x67, 0x67, 0x4e, 0x63, 0x44, \n\t0x68, 0x52, 0x41, 0x4e, 0x44, 0x68, 0x30, 0x4e, 0x32, 0x30, 0x55, 0x35, 0x35, 0x47, 0x4d, 0x63, 0x4e, 0x6c, \n\t0x75, 0x6d, 0x37, 0x4b, 0x34, 0x54, 0x4a, 0x63, 0x72, 0x68, 0x6c, 0x45, 0x61, 0x6e, 0x37, 0x65, 0x43, 0x51, \n\t0x6c, 0x64, 0x4d, 0x51, 0x38, 0x6e, 0x36, 0x6d, 0x57, 0x79, 0x5a, 0x2f, 0x4e, 0x2b, 0x74, 0x57, 0x32, 0x5c, 0x0a,\n\t0x09, 0x42, 0x77, 0x65, 0x77, 0x35, 0x47, 0x72, 0x36, 0x4b, 0x65, 0x2b, 0x54, 0x67, 0x2f, 0x57, 0x61, 0x52, \n\t0x46, 0x64, 0x41, 0x55, 0x69, 0x33, 0x31, 0x6f, 0x64, 0x68, 0x6b, 0x59, 0x58, 0x6f, 0x6a, 0x6f, 0x61, 0x46, \n\t0x50, 0x53, 0x45, 0x6b, 0x51, 0x32, 0x76, 0x49, 0x59, 0x77, 0x53, 0x6d, 0x54, 0x4f, 0x4d, 0x73, 0x6c, 0x5a, \n\t0x53, 0x46, 0x34, 0x78, 0x79, 0x6f, 0x4c, 0x43, 0x41, 0x57, 0x77, 0x53, 0x4d, 0x62, 0x44, 0x35, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x68, 0x46, 0x47, 0x64, 0x72, 0x32, 0x72, 0x59, 0x69, 0x58, 0x50, 0x61, 0x77, 0x36, 0x68, 0x73, 0x42, \n\t0x31, 0x56, 0x6b, 0x75, 0x65, 0x52, 0x67, 0x56, 0x47, 0x70, 0x6e, 0x75, 0x49, 0x46, 0x47, 0x34, 0x70, 0x51, \n\t0x4f, 0x31, 0x32, 0x71, 0x72, 0x78, 0x34, 0x53, 0x74, 0x4e, 0x5a, 0x4b, 0x63, 0x74, 0x34, 0x44, 0x53, 0x6c, \n\t0x70, 0x45, 0x43, 0x69, 0x5a, 0x35, 0x62, 0x46, 0x50, 0x78, 0x4a, 0x6b, 0x61, 0x34, 0x41, 0x32, 0x46, 0x5c, 0x0a,\n\t0x09, 0x47, 0x63, 0x4e, 0x6d, 0x73, 0x4a, 0x47, 0x55, 0x67, 0x64, 0x2b, 0x38, 0x4b, 0x71, 0x4b, 0x6d, 0x4d, \n\t0x59, 0x58, 0x51, 0x76, 0x6c, 0x31, 0x38, 0x79, 0x37, 0x65, 0x7a, 0x5a, 0x33, 0x45, 0x46, 0x33, 0x36, 0x72, \n\t0x79, 0x38, 0x4a, 0x49, 0x50, 0x6c, 0x57, 0x34, 0x45, 0x78, 0x54, 0x34, 0x45, 0x6c, 0x2f, 0x66, 0x57, 0x32, \n\t0x61, 0x44, 0x71, 0x74, 0x70, 0x71, 0x54, 0x43, 0x79, 0x30, 0x67, 0x47, 0x6a, 0x6a, 0x71, 0x6b, 0x44, 0x5c, 0x0a,\n\t0x09, 0x54, 0x66, 0x77, 0x36, 0x77, 0x4d, 0x6a, 0x6d, 0x4d, 0x32, 0x38, 0x59, 0x32, 0x52, 0x58, 0x37, 0x56, \n\t0x73, 0x63, 0x63, 0x59, 0x46, 0x53, 0x76, 0x37, 0x37, 0x4a, 0x2b, 0x49, 0x67, 0x55, 0x66, 0x52, 0x4d, 0x46, \n\t0x6f, 0x46, 0x4d, 0x63, 0x46, 0x65, 0x45, 0x53, 0x6a, 0x53, 0x6d, 0x57, 0x63, 0x62, 0x7a, 0x32, 0x30, 0x72, \n\t0x6e, 0x52, 0x45, 0x58, 0x53, 0x4c, 0x64, 0x4c, 0x64, 0x4c, 0x58, 0x36, 0x75, 0x35, 0x52, 0x62, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x68, 0x64, 0x51, 0x61, 0x63, 0x4e, 0x55, 0x70, 0x33, 0x64, 0x74, 0x4b, 0x45, 0x35, 0x46, 0x37, 0x71, \n\t0x4f, 0x2b, 0x6e, 0x70, 0x6a, 0x50, 0x65, 0x57, 0x57, 0x65, 0x56, 0x68, 0x4c, 0x62, 0x76, 0x64, 0x35, 0x34, \n\t0x45, 0x37, 0x6c, 0x59, 0x50, 0x51, 0x33, 0x51, 0x4a, 0x41, 0x48, 0x50, 0x6d, 0x2b, 0x47, 0x68, 0x78, 0x62, \n\t0x4c, 0x67, 0x69, 0x77, 0x69, 0x74, 0x30, 0x76, 0x56, 0x4c, 0x61, 0x75, 0x43, 0x43, 0x6b, 0x59, 0x78, 0x5c, 0x0a,\n\t0x09, 0x53, 0x50, 0x76, 0x41, 0x71, 0x43, 0x58, 0x39, 0x56, 0x4b, 0x42, 0x49, 0x64, 0x63, 0x78, 0x6c, 0x6c, \n\t0x38, 0x65, 0x75, 0x52, 0x72, 0x55, 0x79, 0x47, 0x47, 0x6b, 0x5a, 0x42, 0x79, 0x50, 0x72, 0x4c, 0x7a, 0x4a, \n\t0x6c, 0x7a, 0x4f, 0x70, 0x59, 0x4d, 0x78, 0x68, 0x52, 0x65, 0x45, 0x55, 0x35, 0x47, 0x4b, 0x6e, 0x6a, 0x47, \n\t0x6b, 0x62, 0x42, 0x61, 0x72, 0x41, 0x77, 0x30, 0x6e, 0x34, 0x57, 0x37, 0x54, 0x50, 0x79, 0x6a, 0x54, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x42, 0x6b, 0x65, 0x37, 0x75, 0x4b, 0x4a, 0x68, 0x46, 0x44, 0x6d, 0x78, 0x72, 0x4b, 0x65, 0x6c, \n\t0x75, 0x57, 0x73, 0x62, 0x48, 0x70, 0x4f, 0x45, 0x54, 0x7a, 0x56, 0x73, 0x4b, 0x4d, 0x46, 0x4a, 0x66, 0x43, \n\t0x6b, 0x6c, 0x38, 0x55, 0x79, 0x4e, 0x54, 0x4a, 0x6a, 0x4e, 0x38, 0x6e, 0x38, 0x79, 0x36, 0x31, 0x6f, 0x43, \n\t0x79, 0x46, 0x70, 0x4b, 0x44, 0x33, 0x5a, 0x63, 0x46, 0x2b, 0x47, 0x67, 0x59, 0x2f, 0x51, 0x56, 0x77, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x38, 0x33, 0x54, 0x4b, 0x70, 0x6f, 0x72, 0x69, 0x43, 0x37, 0x39, 0x31, 0x35, 0x65, 0x47, 0x77, \n\t0x37, 0x2b, 0x42, 0x63, 0x45, 0x4e, 0x31, 0x4f, 0x43, 0x75, 0x4d, 0x75, 0x6e, 0x77, 0x74, 0x59, 0x38, 0x4c, \n\t0x36, 0x6d, 0x6e, 0x6e, 0x42, 0x79, 0x4a, 0x59, 0x68, 0x30, 0x68, 0x32, 0x6b, 0x44, 0x34, 0x78, 0x73, 0x2f, \n\t0x4c, 0x78, 0x68, 0x5a, 0x4e, 0x4f, 0x76, 0x47, 0x45, 0x61, 0x36, 0x44, 0x4e, 0x45, 0x39, 0x7a, 0x68, 0x5c, 0x0a,\n\t0x09, 0x46, 0x47, 0x4a, 0x53, 0x53, 0x57, 0x55, 0x65, 0x52, 0x55, 0x62, 0x72, 0x4f, 0x4d, 0x77, 0x73, 0x55, \n\t0x42, 0x4a, 0x4f, 0x48, 0x34, 0x77, 0x4a, 0x66, 0x58, 0x57, 0x46, 0x61, 0x6c, 0x48, 0x6a, 0x6b, 0x54, 0x59, \n\t0x69, 0x76, 0x45, 0x70, 0x77, 0x33, 0x41, 0x6b, 0x68, 0x48, 0x78, 0x35, 0x76, 0x75, 0x32, 0x32, 0x35, 0x61, \n\t0x44, 0x55, 0x59, 0x42, 0x65, 0x7a, 0x69, 0x66, 0x55, 0x51, 0x45, 0x52, 0x45, 0x35, 0x36, 0x73, 0x74, 0x5c, 0x0a,\n\t0x09, 0x72, 0x6a, 0x62, 0x4c, 0x79, 0x46, 0x68, 0x44, 0x53, 0x66, 0x64, 0x4d, 0x35, 0x2b, 0x58, 0x7a, 0x4f, \n\t0x65, 0x62, 0x62, 0x64, 0x47, 0x69, 0x30, 0x46, 0x59, 0x77, 0x63, 0x49, 0x6e, 0x39, 0x74, 0x68, 0x69, 0x65, \n\t0x56, 0x79, 0x41, 0x49, 0x73, 0x49, 0x75, 0x64, 0x77, 0x37, 0x6a, 0x73, 0x42, 0x39, 0x56, 0x4b, 0x74, 0x43, \n\t0x59, 0x77, 0x36, 0x38, 0x6c, 0x7a, 0x35, 0x39, 0x69, 0x47, 0x72, 0x68, 0x6c, 0x47, 0x6b, 0x72, 0x77, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x63, 0x30, 0x38, 0x4c, 0x49, 0x33, 0x73, 0x50, 0x63, 0x59, 0x65, 0x51, 0x71, 0x4a, 0x51, 0x4c, \n\t0x52, 0x62, 0x4f, 0x6a, 0x4d, 0x4b, 0x46, 0x6f, 0x41, 0x53, 0x74, 0x57, 0x6d, 0x32, 0x72, 0x70, 0x70, 0x49, \n\t0x62, 0x32, 0x65, 0x77, 0x36, 0x50, 0x68, 0x70, 0x61, 0x30, 0x4a, 0x6c, 0x62, 0x61, 0x65, 0x6d, 0x34, 0x51, \n\t0x43, 0x56, 0x67, 0x42, 0x63, 0x70, 0x74, 0x74, 0x6d, 0x59, 0x61, 0x53, 0x74, 0x6f, 0x6d, 0x69, 0x70, 0x5c, 0x0a,\n\t0x09, 0x53, 0x4d, 0x36, 0x53, 0x47, 0x56, 0x55, 0x6a, 0x67, 0x6e, 0x57, 0x2b, 0x65, 0x76, 0x36, 0x51, 0x39, \n\t0x67, 0x64, 0x70, 0x61, 0x79, 0x75, 0x55, 0x53, 0x58, 0x63, 0x52, 0x4d, 0x32, 0x76, 0x56, 0x51, 0x6e, 0x6d, \n\t0x4b, 0x36, 0x35, 0x43, 0x42, 0x58, 0x35, 0x6c, 0x56, 0x57, 0x30, 0x51, 0x6c, 0x77, 0x4e, 0x39, 0x45, 0x42, \n\t0x4c, 0x6e, 0x2f, 0x7a, 0x30, 0x33, 0x7a, 0x73, 0x42, 0x4a, 0x5a, 0x52, 0x4e, 0x66, 0x73, 0x46, 0x51, 0x5c, 0x0a,\n\t0x09, 0x68, 0x50, 0x77, 0x62, 0x55, 0x30, 0x33, 0x47, 0x58, 0x41, 0x4b, 0x4a, 0x64, 0x66, 0x56, 0x4a, 0x5a, \n\t0x38, 0x6e, 0x70, 0x63, 0x31, 0x6a, 0x4a, 0x4c, 0x6e, 0x5a, 0x50, 0x51, 0x6e, 0x35, 0x65, 0x7a, 0x53, 0x73, \n\t0x53, 0x6f, 0x59, 0x2b, 0x53, 0x35, 0x58, 0x36, 0x48, 0x6d, 0x46, 0x42, 0x71, 0x55, 0x74, 0x46, 0x39, 0x4e, \n\t0x74, 0x79, 0x7a, 0x75, 0x77, 0x32, 0x37, 0x70, 0x70, 0x75, 0x70, 0x73, 0x58, 0x47, 0x72, 0x37, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x63, 0x35, 0x69, 0x5a, 0x44, 0x71, 0x43, 0x68, 0x30, 0x74, 0x49, 0x39, 0x71, 0x72, 0x74, 0x69, 0x42, \n\t0x6b, 0x68, 0x74, 0x61, 0x55, 0x58, 0x44, 0x53, 0x46, 0x74, 0x55, 0x78, 0x75, 0x48, 0x63, 0x61, 0x6a, 0x58, \n\t0x70, 0x62, 0x6c, 0x73, 0x4d, 0x74, 0x39, 0x69, 0x6e, 0x4e, 0x49, 0x4c, 0x64, 0x46, 0x33, 0x6e, 0x67, 0x4f, \n\t0x51, 0x32, 0x6a, 0x4f, 0x33, 0x44, 0x75, 0x32, 0x66, 0x50, 0x71, 0x6e, 0x73, 0x30, 0x4e, 0x52, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x64, 0x2b, 0x2f, 0x6d, 0x58, 0x68, 0x35, 0x61, 0x6c, 0x47, 0x79, 0x67, 0x52, 0x57, 0x42, 0x71, 0x50, \n\t0x65, 0x6f, 0x45, 0x6a, 0x7a, 0x58, 0x41, 0x38, 0x59, 0x32, 0x62, 0x4b, 0x30, 0x2b, 0x33, 0x77, 0x61, 0x6e, \n\t0x5a, 0x50, 0x41, 0x79, 0x4e, 0x37, 0x54, 0x55, 0x59, 0x43, 0x52, 0x74, 0x34, 0x67, 0x6d, 0x67, 0x6c, 0x47, \n\t0x75, 0x6d, 0x78, 0x59, 0x75, 0x31, 0x4e, 0x30, 0x6f, 0x62, 0x66, 0x57, 0x59, 0x62, 0x70, 0x37, 0x74, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x74, 0x55, 0x77, 0x30, 0x6e, 0x71, 0x56, 0x31, 0x57, 0x4f, 0x48, 0x7a, 0x58, 0x4d, 0x4f, 0x62, \n\t0x41, 0x32, 0x74, 0x4e, 0x6e, 0x43, 0x5a, 0x62, 0x6c, 0x79, 0x2b, 0x6d, 0x36, 0x59, 0x74, 0x6e, 0x36, 0x36, \n\t0x4a, 0x6c, 0x2f, 0x71, 0x66, 0x31, 0x6c, 0x48, 0x6c, 0x35, 0x33, 0x62, 0x76, 0x41, 0x68, 0x6e, 0x6b, 0x59, \n\t0x50, 0x52, 0x31, 0x45, 0x7a, 0x36, 0x6b, 0x56, 0x70, 0x6d, 0x7a, 0x52, 0x65, 0x53, 0x65, 0x42, 0x48, 0x5c, 0x0a,\n\t0x09, 0x78, 0x46, 0x48, 0x59, 0x77, 0x61, 0x59, 0x4a, 0x33, 0x47, 0x58, 0x72, 0x4f, 0x42, 0x55, 0x59, 0x63, \n\t0x31, 0x74, 0x37, 0x36, 0x37, 0x50, 0x4a, 0x4b, 0x70, 0x78, 0x79, 0x6c, 0x68, 0x31, 0x46, 0x4b, 0x75, 0x69, \n\t0x57, 0x46, 0x55, 0x67, 0x79, 0x44, 0x41, 0x51, 0x77, 0x79, 0x4d, 0x72, 0x4e, 0x58, 0x54, 0x67, 0x43, 0x6c, \n\t0x78, 0x59, 0x47, 0x76, 0x51, 0x6c, 0x4e, 0x71, 0x4b, 0x43, 0x45, 0x41, 0x4c, 0x61, 0x55, 0x4a, 0x44, 0x5c, 0x0a,\n\t0x09, 0x56, 0x7a, 0x41, 0x4b, 0x6a, 0x62, 0x6d, 0x30, 0x30, 0x4e, 0x42, 0x67, 0x30, 0x78, 0x44, 0x51, 0x33, \n\t0x62, 0x52, 0x51, 0x56, 0x75, 0x58, 0x58, 0x53, 0x53, 0x77, 0x6a, 0x62, 0x54, 0x56, 0x31, 0x57, 0x55, 0x59, \n\t0x68, 0x72, 0x39, 0x78, 0x36, 0x73, 0x35, 0x43, 0x6e, 0x39, 0x69, 0x76, 0x70, 0x2f, 0x4a, 0x54, 0x56, 0x35, \n\t0x49, 0x37, 0x42, 0x7a, 0x70, 0x2b, 0x6a, 0x64, 0x6c, 0x67, 0x33, 0x4d, 0x48, 0x6f, 0x6c, 0x49, 0x73, 0x5c, 0x0a,\n\t0x09, 0x69, 0x6e, 0x37, 0x70, 0x7a, 0x67, 0x49, 0x65, 0x56, 0x6c, 0x4c, 0x69, 0x43, 0x36, 0x39, 0x50, 0x4d, \n\t0x76, 0x43, 0x34, 0x65, 0x76, 0x51, 0x74, 0x78, 0x57, 0x46, 0x4f, 0x6e, 0x73, 0x79, 0x77, 0x68, 0x56, 0x6f, \n\t0x39, 0x46, 0x76, 0x32, 0x44, 0x72, 0x41, 0x79, 0x41, 0x52, 0x58, 0x43, 0x53, 0x4f, 0x78, 0x6f, 0x46, 0x68, \n\t0x58, 0x47, 0x4f, 0x58, 0x71, 0x73, 0x51, 0x4e, 0x47, 0x75, 0x73, 0x77, 0x61, 0x52, 0x71, 0x31, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x45, 0x49, 0x38, 0x59, 0x79, 0x52, 0x59, 0x51, 0x38, 0x52, 0x51, 0x71, 0x43, 0x30, 0x59, 0x71, \n\t0x4c, 0x74, 0x4b, 0x48, 0x58, 0x4f, 0x4e, 0x71, 0x6f, 0x33, 0x56, 0x79, 0x6a, 0x69, 0x76, 0x59, 0x4e, 0x57, \n\t0x55, 0x75, 0x73, 0x47, 0x32, 0x77, 0x55, 0x68, 0x62, 0x51, 0x62, 0x6b, 0x75, 0x58, 0x67, 0x35, 0x47, 0x2f, \n\t0x6d, 0x2b, 0x70, 0x41, 0x42, 0x48, 0x35, 0x6e, 0x30, 0x52, 0x42, 0x4a, 0x51, 0x5a, 0x50, 0x62, 0x74, 0x5c, 0x0a,\n\t0x09, 0x69, 0x2f, 0x2b, 0x59, 0x61, 0x61, 0x36, 0x52, 0x62, 0x61, 0x57, 0x64, 0x58, 0x57, 0x47, 0x72, 0x4e, \n\t0x7a, 0x69, 0x57, 0x7a, 0x63, 0x37, 0x76, 0x4e, 0x41, 0x53, 0x67, 0x53, 0x6e, 0x59, 0x66, 0x54, 0x5a, 0x4f, \n\t0x50, 0x66, 0x35, 0x38, 0x2b, 0x69, 0x65, 0x7a, 0x63, 0x63, 0x69, 0x71, 0x73, 0x6f, 0x78, 0x41, 0x4c, 0x36, \n\t0x35, 0x43, 0x68, 0x73, 0x77, 0x48, 0x41, 0x6f, 0x59, 0x70, 0x59, 0x31, 0x71, 0x2f, 0x58, 0x5a, 0x35, 0x5c, 0x0a,\n\t0x09, 0x44, 0x41, 0x47, 0x54, 0x5a, 0x36, 0x4a, 0x7a, 0x54, 0x57, 0x47, 0x55, 0x64, 0x4d, 0x74, 0x55, 0x65, \n\t0x47, 0x59, 0x59, 0x53, 0x66, 0x78, 0x50, 0x7a, 0x48, 0x45, 0x45, 0x49, 0x77, 0x32, 0x63, 0x32, 0x45, 0x71, \n\t0x71, 0x4c, 0x68, 0x75, 0x61, 0x64, 0x50, 0x36, 0x66, 0x33, 0x5a, 0x4d, 0x6f, 0x67, 0x70, 0x48, 0x5a, 0x30, \n\t0x54, 0x47, 0x41, 0x49, 0x41, 0x73, 0x6a, 0x59, 0x39, 0x6c, 0x45, 0x66, 0x69, 0x6c, 0x6a, 0x52, 0x59, 0x5c, 0x0a,\n\t0x09, 0x33, 0x72, 0x70, 0x74, 0x6d, 0x6c, 0x48, 0x4f, 0x68, 0x76, 0x71, 0x4e, 0x6c, 0x75, 0x6d, 0x72, 0x61, \n\t0x45, 0x72, 0x48, 0x38, 0x6f, 0x59, 0x79, 0x45, 0x70, 0x47, 0x4c, 0x6d, 0x64, 0x70, 0x34, 0x48, 0x62, 0x68, \n\t0x6a, 0x4b, 0x42, 0x30, 0x53, 0x76, 0x48, 0x50, 0x5a, 0x6b, 0x2b, 0x4d, 0x72, 0x2b, 0x75, 0x6d, 0x62, 0x67, \n\t0x76, 0x42, 0x57, 0x35, 0x53, 0x59, 0x52, 0x56, 0x48, 0x43, 0x34, 0x77, 0x34, 0x74, 0x44, 0x43, 0x61, 0x5c, 0x0a,\n\t0x09, 0x65, 0x70, 0x48, 0x73, 0x7a, 0x44, 0x43, 0x79, 0x2b, 0x6e, 0x79, 0x65, 0x69, 0x63, 0x37, 0x70, 0x59, \n\t0x42, 0x54, 0x6c, 0x4e, 0x77, 0x75, 0x4d, 0x45, 0x6c, 0x6b, 0x77, 0x6a, 0x47, 0x72, 0x77, 0x68, 0x45, 0x78, \n\t0x7a, 0x4d, 0x50, 0x4a, 0x64, 0x6f, 0x43, 0x79, 0x4d, 0x6d, 0x75, 0x4d, 0x47, 0x52, 0x71, 0x68, 0x30, 0x43, \n\t0x6b, 0x62, 0x4a, 0x55, 0x48, 0x7a, 0x34, 0x65, 0x78, 0x42, 0x44, 0x70, 0x34, 0x62, 0x52, 0x79, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x58, 0x63, 0x4e, 0x4c, 0x64, 0x4d, 0x58, 0x55, 0x2b, 0x47, 0x71, 0x70, 0x76, 0x67, 0x56, 0x54, \n\t0x55, 0x6a, 0x59, 0x76, 0x42, 0x49, 0x6d, 0x46, 0x5a, 0x53, 0x43, 0x65, 0x4d, 0x39, 0x4c, 0x2f, 0x4d, 0x38, \n\t0x68, 0x41, 0x4e, 0x49, 0x37, 0x5a, 0x68, 0x35, 0x78, 0x6d, 0x2b, 0x53, 0x69, 0x49, 0x59, 0x2f, 0x57, 0x56, \n\t0x45, 0x6b, 0x45, 0x38, 0x38, 0x6f, 0x2b, 0x50, 0x68, 0x6a, 0x4a, 0x65, 0x5a, 0x51, 0x58, 0x54, 0x70, 0x5c, 0x0a,\n\t0x09, 0x35, 0x31, 0x36, 0x4f, 0x66, 0x32, 0x48, 0x2b, 0x31, 0x2f, 0x77, 0x4c, 0x72, 0x31, 0x37, 0x41, 0x42, \n\t0x45, 0x59, 0x68, 0x62, 0x6b, 0x45, 0x77, 0x30, 0x75, 0x45, 0x5a, 0x59, 0x4a, 0x54, 0x4b, 0x45, 0x59, 0x41, \n\t0x52, 0x2b, 0x55, 0x59, 0x76, 0x47, 0x67, 0x79, 0x52, 0x6a, 0x67, 0x6c, 0x68, 0x74, 0x50, 0x52, 0x64, 0x48, \n\t0x67, 0x31, 0x34, 0x73, 0x6a, 0x43, 0x43, 0x5a, 0x73, 0x4b, 0x68, 0x67, 0x6c, 0x48, 0x69, 0x33, 0x77, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x68, 0x6f, 0x63, 0x6b, 0x6e, 0x51, 0x43, 0x48, 0x45, 0x68, 0x55, 0x5a, 0x4f, 0x63, 0x7a, 0x37, \n\t0x61, 0x78, 0x31, 0x70, 0x5a, 0x52, 0x4a, 0x48, 0x6c, 0x6f, 0x71, 0x30, 0x6a, 0x44, 0x38, 0x64, 0x6b, 0x75, \n\t0x59, 0x69, 0x2b, 0x4c, 0x67, 0x65, 0x6a, 0x4e, 0x6b, 0x74, 0x4a, 0x41, 0x79, 0x72, 0x41, 0x53, 0x4f, 0x73, \n\t0x65, 0x45, 0x6e, 0x66, 0x48, 0x4d, 0x74, 0x75, 0x4b, 0x52, 0x4e, 0x61, 0x59, 0x38, 0x68, 0x56, 0x74, 0x5c, 0x0a,\n\t0x09, 0x50, 0x31, 0x50, 0x56, 0x59, 0x77, 0x32, 0x6a, 0x4f, 0x38, 0x42, 0x39, 0x7a, 0x71, 0x7a, 0x64, 0x73, \n\t0x33, 0x6c, 0x5a, 0x52, 0x4b, 0x63, 0x49, 0x54, 0x75, 0x71, 0x75, 0x4a, 0x51, 0x65, 0x4c, 0x67, 0x6c, 0x46, \n\t0x66, 0x2b, 0x45, 0x77, 0x4a, 0x6f, 0x33, 0x58, 0x61, 0x35, 0x54, 0x47, 0x4a, 0x37, 0x33, 0x7a, 0x2b, 0x48, \n\t0x54, 0x42, 0x4b, 0x38, 0x6a, 0x7a, 0x4d, 0x4d, 0x46, 0x4b, 0x57, 0x55, 0x47, 0x33, 0x35, 0x64, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x42, 0x49, 0x64, 0x35, 0x74, 0x61, 0x35, 0x68, 0x71, 0x6c, 0x4b, 0x2f, 0x59, 0x74, 0x6a, 0x45, 0x4b, \n\t0x6a, 0x46, 0x67, 0x55, 0x55, 0x44, 0x61, 0x4e, 0x52, 0x6e, 0x4b, 0x2b, 0x31, 0x5a, 0x4c, 0x51, 0x66, 0x70, \n\t0x78, 0x37, 0x75, 0x74, 0x35, 0x44, 0x52, 0x4d, 0x4a, 0x4a, 0x59, 0x62, 0x32, 0x4b, 0x39, 0x57, 0x4e, 0x67, \n\t0x31, 0x50, 0x68, 0x2f, 0x52, 0x53, 0x31, 0x64, 0x71, 0x51, 0x4c, 0x62, 0x34, 0x6e, 0x52, 0x4a, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x59, 0x42, 0x79, 0x4f, 0x33, 0x65, 0x41, 0x44, 0x4a, 0x70, 0x36, 0x62, 0x47, 0x44, 0x30, 0x5a, \n\t0x62, 0x4e, 0x68, 0x71, 0x4e, 0x72, 0x39, 0x61, 0x42, 0x37, 0x79, 0x53, 0x75, 0x42, 0x59, 0x48, 0x52, 0x49, \n\t0x48, 0x54, 0x72, 0x64, 0x6b, 0x35, 0x39, 0x38, 0x6c, 0x61, 0x57, 0x42, 0x6b, 0x77, 0x46, 0x4d, 0x2f, 0x61, \n\t0x41, 0x57, 0x71, 0x4f, 0x4f, 0x6a, 0x54, 0x35, 0x48, 0x54, 0x55, 0x67, 0x4d, 0x76, 0x6c, 0x36, 0x51, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x62, 0x77, 0x6a, 0x71, 0x39, 0x69, 0x48, 0x72, 0x6e, 0x34, 0x37, 0x43, 0x49, 0x77, 0x37, 0x6c, \n\t0x38, 0x64, 0x54, 0x66, 0x6c, 0x6e, 0x46, 0x52, 0x48, 0x55, 0x54, 0x33, 0x77, 0x45, 0x4c, 0x62, 0x31, 0x46, \n\t0x6a, 0x6c, 0x68, 0x6d, 0x7a, 0x70, 0x73, 0x79, 0x6d, 0x4c, 0x31, 0x46, 0x56, 0x51, 0x4e, 0x68, 0x58, 0x77, \n\t0x65, 0x56, 0x6f, 0x64, 0x2b, 0x4c, 0x6e, 0x58, 0x61, 0x6f, 0x43, 0x50, 0x63, 0x6b, 0x38, 0x38, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x71, 0x63, 0x65, 0x51, 0x7a, 0x35, 0x68, 0x37, 0x6c, 0x41, 0x4b, 0x63, 0x4c, 0x56, 0x4f, 0x74, 0x4a, \n\t0x69, 0x36, 0x33, 0x44, 0x6b, 0x75, 0x70, 0x36, 0x73, 0x4b, 0x70, 0x43, 0x33, 0x52, 0x38, 0x4c, 0x6a, 0x4e, \n\t0x4a, 0x79, 0x78, 0x44, 0x70, 0x55, 0x6e, 0x55, 0x67, 0x4a, 0x62, 0x68, 0x51, 0x5a, 0x78, 0x35, 0x77, 0x72, \n\t0x71, 0x7a, 0x7a, 0x46, 0x77, 0x71, 0x63, 0x38, 0x33, 0x41, 0x4a, 0x59, 0x7a, 0x42, 0x31, 0x6d, 0x67, 0x5c, 0x0a,\n\t0x09, 0x44, 0x64, 0x49, 0x62, 0x69, 0x42, 0x50, 0x2f, 0x62, 0x33, 0x47, 0x75, 0x70, 0x56, 0x71, 0x50, 0x4b, \n\t0x76, 0x2f, 0x34, 0x37, 0x71, 0x38, 0x77, 0x66, 0x44, 0x36, 0x68, 0x2f, 0x46, 0x67, 0x41, 0x74, 0x37, 0x34, \n\t0x4d, 0x51, 0x68, 0x54, 0x72, 0x69, 0x34, 0x4c, 0x7a, 0x69, 0x67, 0x52, 0x4e, 0x6a, 0x62, 0x46, 0x79, 0x67, \n\t0x71, 0x54, 0x75, 0x30, 0x50, 0x42, 0x65, 0x63, 0x63, 0x77, 0x78, 0x4a, 0x47, 0x6f, 0x77, 0x4a, 0x58, 0x5c, 0x0a,\n\t0x09, 0x43, 0x4d, 0x65, 0x50, 0x43, 0x62, 0x64, 0x39, 0x6c, 0x72, 0x43, 0x7a, 0x55, 0x30, 0x61, 0x33, 0x58, \n\t0x73, 0x50, 0x57, 0x69, 0x61, 0x71, 0x4f, 0x41, 0x51, 0x36, 0x4a, 0x48, 0x35, 0x65, 0x2b, 0x4a, 0x71, 0x6c, \n\t0x43, 0x41, 0x64, 0x6d, 0x69, 0x36, 0x63, 0x6f, 0x43, 0x62, 0x68, 0x64, 0x32, 0x62, 0x6f, 0x66, 0x39, 0x50, \n\t0x31, 0x48, 0x35, 0x6c, 0x49, 0x67, 0x72, 0x76, 0x68, 0x69, 0x52, 0x48, 0x79, 0x34, 0x2f, 0x2f, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x53, 0x4b, 0x6d, 0x39, 0x36, 0x66, 0x66, 0x39, 0x5a, 0x6a, 0x5a, 0x43, 0x59, 0x51, 0x58, 0x66, 0x72, \n\t0x5a, 0x6c, 0x34, 0x66, 0x43, 0x66, 0x31, 0x30, 0x53, 0x4b, 0x55, 0x57, 0x6d, 0x55, 0x55, 0x45, 0x43, 0x6f, \n\t0x2b, 0x51, 0x46, 0x44, 0x79, 0x32, 0x67, 0x43, 0x71, 0x38, 0x33, 0x6a, 0x4a, 0x72, 0x72, 0x31, 0x78, 0x70, \n\t0x47, 0x32, 0x52, 0x2b, 0x47, 0x4c, 0x68, 0x6a, 0x5a, 0x65, 0x35, 0x6f, 0x33, 0x6a, 0x50, 0x51, 0x39, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x58, 0x4a, 0x50, 0x41, 0x71, 0x4d, 0x45, 0x75, 0x70, 0x50, 0x41, 0x4b, 0x43, 0x51, 0x64, 0x42, \n\t0x79, 0x50, 0x6e, 0x58, 0x36, 0x75, 0x68, 0x68, 0x35, 0x48, 0x34, 0x2b, 0x36, 0x45, 0x70, 0x62, 0x33, 0x52, \n\t0x4c, 0x52, 0x5a, 0x4d, 0x76, 0x41, 0x6d, 0x78, 0x46, 0x55, 0x4c, 0x72, 0x37, 0x6a, 0x78, 0x33, 0x2f, 0x2f, \n\t0x62, 0x65, 0x50, 0x63, 0x66, 0x2f, 0x44, 0x41, 0x35, 0x78, 0x7a, 0x46, 0x4d, 0x57, 0x41, 0x6f, 0x69, 0x5c, 0x0a,\n\t0x09, 0x67, 0x6f, 0x43, 0x6f, 0x64, 0x7a, 0x68, 0x54, 0x2f, 0x32, 0x34, 0x61, 0x4a, 0x67, 0x34, 0x4f, 0x4e, \n\t0x64, 0x34, 0x61, 0x4c, 0x6a, 0x77, 0x73, 0x65, 0x64, 0x4f, 0x75, 0x6e, 0x34, 0x57, 0x31, 0x38, 0x78, 0x34, \n\t0x73, 0x59, 0x62, 0x4a, 0x4c, 0x72, 0x31, 0x36, 0x4a, 0x32, 0x49, 0x59, 0x44, 0x53, 0x4b, 0x48, 0x35, 0x66, \n\t0x7a, 0x44, 0x31, 0x6f, 0x66, 0x31, 0x39, 0x63, 0x4d, 0x51, 0x51, 0x5a, 0x78, 0x2b, 0x75, 0x31, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x77, 0x50, 0x34, 0x48, 0x66, 0x50, 0x30, 0x48, 0x47, 0x4a, 0x63, 0x76, 0x78, 0x52, 0x58, 0x48, 0x45, \n\t0x62, 0x6e, 0x49, 0x6c, 0x44, 0x4b, 0x50, 0x72, 0x74, 0x6b, 0x54, 0x67, 0x46, 0x64, 0x6b, 0x59, 0x35, 0x4b, \n\t0x52, 0x6e, 0x67, 0x41, 0x59, 0x46, 0x44, 0x68, 0x6f, 0x62, 0x72, 0x4a, 0x70, 0x38, 0x56, 0x47, 0x34, 0x73, \n\t0x2f, 0x75, 0x5a, 0x31, 0x5a, 0x46, 0x4c, 0x5a, 0x33, 0x57, 0x59, 0x4d, 0x43, 0x6f, 0x73, 0x37, 0x65, 0x5c, 0x0a,\n\t0x09, 0x48, 0x44, 0x75, 0x65, 0x57, 0x73, 0x53, 0x2f, 0x50, 0x73, 0x37, 0x4b, 0x62, 0x5a, 0x32, 0x64, 0x66, \n\t0x71, 0x58, 0x48, 0x4b, 0x50, 0x70, 0x67, 0x79, 0x35, 0x4d, 0x67, 0x50, 0x4c, 0x32, 0x2b, 0x56, 0x52, 0x31, \n\t0x44, 0x39, 0x49, 0x75, 0x32, 0x6d, 0x6c, 0x69, 0x53, 0x74, 0x56, 0x47, 0x75, 0x55, 0x44, 0x55, 0x73, 0x66, \n\t0x4e, 0x4c, 0x6f, 0x2f, 0x42, 0x67, 0x52, 0x33, 0x38, 0x52, 0x4c, 0x61, 0x62, 0x5a, 0x68, 0x7a, 0x59, 0x5c, 0x0a,\n\t0x09, 0x39, 0x54, 0x56, 0x56, 0x75, 0x6a, 0x2f, 0x2b, 0x6f, 0x4f, 0x4f, 0x48, 0x66, 0x33, 0x71, 0x58, 0x6a, \n\t0x7a, 0x30, 0x67, 0x6a, 0x45, 0x5a, 0x56, 0x39, 0x36, 0x38, 0x73, 0x52, 0x34, 0x78, 0x47, 0x49, 0x78, 0x38, \n\t0x75, 0x4b, 0x63, 0x76, 0x77, 0x54, 0x35, 0x43, 0x79, 0x5a, 0x4f, 0x54, 0x6a, 0x70, 0x5a, 0x54, 0x36, 0x75, \n\t0x42, 0x78, 0x56, 0x61, 0x55, 0x62, 0x6c, 0x69, 0x48, 0x50, 0x6e, 0x53, 0x33, 0x37, 0x6d, 0x31, 0x77, 0x5c, 0x0a,\n\t0x09, 0x75, 0x6b, 0x2f, 0x69, 0x36, 0x62, 0x39, 0x6b, 0x4f, 0x5a, 0x4c, 0x70, 0x66, 0x32, 0x47, 0x64, 0x6e, \n\t0x31, 0x5a, 0x39, 0x6e, 0x52, 0x4f, 0x76, 0x74, 0x33, 0x69, 0x4e, 0x74, 0x2b, 0x71, 0x71, 0x72, 0x65, 0x2b, \n\t0x73, 0x66, 0x6b, 0x47, 0x46, 0x4b, 0x2b, 0x74, 0x4f, 0x57, 0x42, 0x39, 0x4a, 0x4b, 0x5a, 0x51, 0x4f, 0x54, \n\t0x56, 0x66, 0x6a, 0x58, 0x53, 0x59, 0x56, 0x6e, 0x4e, 0x48, 0x55, 0x59, 0x5a, 0x30, 0x48, 0x54, 0x43, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x50, 0x66, 0x69, 0x54, 0x67, 0x45, 0x6a, 0x72, 0x61, 0x34, 0x58, 0x6a, 0x46, 0x70, 0x30, 0x74, \n\t0x75, 0x6c, 0x49, 0x72, 0x6a, 0x73, 0x43, 0x4d, 0x4a, 0x70, 0x32, 0x39, 0x6e, 0x57, 0x6b, 0x6f, 0x77, 0x74, \n\t0x47, 0x59, 0x35, 0x7a, 0x58, 0x57, 0x52, 0x69, 0x68, 0x47, 0x71, 0x71, 0x33, 0x47, 0x71, 0x49, 0x5a, 0x31, \n\t0x51, 0x46, 0x4f, 0x70, 0x54, 0x6f, 0x32, 0x4d, 0x4b, 0x70, 0x42, 0x51, 0x77, 0x75, 0x4d, 0x6c, 0x41, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x62, 0x49, 0x53, 0x79, 0x41, 0x2f, 0x5a, 0x57, 0x33, 0x62, 0x44, 0x45, 0x71, 0x47, 0x2b, 0x43, \n\t0x4d, 0x52, 0x68, 0x34, 0x34, 0x55, 0x54, 0x69, 0x46, 0x55, 0x53, 0x6c, 0x6c, 0x44, 0x61, 0x42, 0x52, 0x4f, \n\t0x61, 0x72, 0x69, 0x52, 0x6d, 0x55, 0x64, 0x66, 0x76, 0x67, 0x52, 0x34, 0x65, 0x50, 0x33, 0x43, 0x36, 0x6d, \n\t0x76, 0x52, 0x2f, 0x75, 0x6e, 0x6d, 0x72, 0x6a, 0x34, 0x47, 0x32, 0x71, 0x68, 0x33, 0x4e, 0x5a, 0x58, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x4e, 0x76, 0x42, 0x73, 0x59, 0x54, 0x69, 0x36, 0x75, 0x71, 0x66, 0x42, 0x47, 0x75, 0x77, 0x68, \n\t0x74, 0x46, 0x4d, 0x47, 0x2b, 0x74, 0x50, 0x44, 0x61, 0x4b, 0x4c, 0x50, 0x2f, 0x73, 0x46, 0x58, 0x72, 0x39, \n\t0x37, 0x4a, 0x61, 0x6f, 0x38, 0x6c, 0x58, 0x53, 0x39, 0x38, 0x43, 0x48, 0x2b, 0x6b, 0x4d, 0x46, 0x6f, 0x32, \n\t0x74, 0x6e, 0x58, 0x76, 0x58, 0x56, 0x6b, 0x47, 0x74, 0x55, 0x79, 0x59, 0x4a, 0x54, 0x6f, 0x47, 0x77, 0x5c, 0x0a,\n\t0x09, 0x65, 0x6a, 0x63, 0x43, 0x4a, 0x54, 0x70, 0x6c, 0x78, 0x34, 0x4c, 0x57, 0x41, 0x6b, 0x4a, 0x4a, 0x61, \n\t0x52, 0x50, 0x70, 0x65, 0x46, 0x6b, 0x62, 0x61, 0x65, 0x4e, 0x49, 0x79, 0x4d, 0x38, 0x31, 0x69, 0x6e, 0x73, \n\t0x77, 0x37, 0x73, 0x55, 0x71, 0x55, 0x70, 0x68, 0x33, 0x7a, 0x73, 0x41, 0x57, 0x6b, 0x41, 0x59, 0x36, 0x30, \n\t0x66, 0x73, 0x52, 0x44, 0x79, 0x31, 0x6f, 0x2b, 0x43, 0x55, 0x56, 0x6d, 0x57, 0x6a, 0x57, 0x58, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x67, 0x52, 0x54, 0x43, 0x46, 0x79, 0x34, 0x46, 0x4b, 0x38, 0x30, 0x4f, 0x38, 0x59, 0x65, 0x2f, 0x73, \n\t0x65, 0x55, 0x6a, 0x69, 0x57, 0x50, 0x63, 0x6a, 0x70, 0x4a, 0x70, 0x51, 0x47, 0x6b, 0x6f, 0x6c, 0x56, 0x42, \n\t0x62, 0x52, 0x52, 0x47, 0x4d, 0x76, 0x67, 0x69, 0x45, 0x38, 0x72, 0x36, 0x6e, 0x74, 0x54, 0x32, 0x4d, 0x54, \n\t0x70, 0x6e, 0x65, 0x49, 0x71, 0x6f, 0x61, 0x32, 0x32, 0x6e, 0x67, 0x70, 0x5a, 0x49, 0x30, 0x67, 0x46, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x36, 0x4a, 0x63, 0x41, 0x6f, 0x4c, 0x5a, 0x38, 0x36, 0x30, 0x61, 0x63, 0x72, 0x63, 0x42, 0x6e, \n\t0x43, 0x71, 0x47, 0x75, 0x55, 0x30, 0x31, 0x77, 0x66, 0x54, 0x58, 0x69, 0x4d, 0x64, 0x46, 0x6a, 0x41, 0x4c, \n\t0x51, 0x4a, 0x47, 0x4e, 0x70, 0x39, 0x4a, 0x59, 0x4f, 0x54, 0x2f, 0x6a, 0x70, 0x74, 0x72, 0x56, 0x49, 0x38, \n\t0x2b, 0x74, 0x63, 0x46, 0x49, 0x62, 0x54, 0x6c, 0x72, 0x77, 0x52, 0x58, 0x4e, 0x45, 0x56, 0x4b, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x57, 0x53, 0x32, 0x71, 0x76, 0x65, 0x70, 0x4d, 0x57, 0x55, 0x45, 0x6c, 0x41, 0x35, 0x39, 0x73, 0x31, \n\t0x38, 0x78, 0x62, 0x51, 0x71, 0x4e, 0x52, 0x6d, 0x63, 0x43, 0x6f, 0x31, 0x4e, 0x30, 0x32, 0x45, 0x61, 0x36, \n\t0x2f, 0x65, 0x74, 0x69, 0x55, 0x4b, 0x59, 0x4b, 0x52, 0x58, 0x72, 0x43, 0x72, 0x75, 0x34, 0x39, 0x68, 0x72, \n\t0x6c, 0x46, 0x6d, 0x4b, 0x6b, 0x43, 0x30, 0x59, 0x6c, 0x2f, 0x6e, 0x34, 0x38, 0x50, 0x62, 0x54, 0x32, 0x5c, 0x0a,\n\t0x09, 0x30, 0x67, 0x31, 0x4d, 0x44, 0x6f, 0x47, 0x65, 0x43, 0x75, 0x36, 0x59, 0x5a, 0x41, 0x75, 0x38, 0x7a, \n\t0x6d, 0x49, 0x78, 0x4b, 0x2b, 0x45, 0x4e, 0x69, 0x70, 0x44, 0x74, 0x63, 0x41, 0x52, 0x73, 0x6b, 0x4c, 0x62, \n\t0x39, 0x4e, 0x30, 0x57, 0x45, 0x31, 0x4c, 0x68, 0x5a, 0x47, 0x56, 0x4d, 0x54, 0x44, 0x4b, 0x70, 0x59, 0x2f, \n\t0x4b, 0x63, 0x7a, 0x6e, 0x41, 0x79, 0x43, 0x36, 0x53, 0x74, 0x54, 0x6f, 0x6d, 0x68, 0x5a, 0x47, 0x78, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x4f, 0x70, 0x66, 0x64, 0x6a, 0x31, 0x73, 0x72, 0x69, 0x32, 0x64, 0x35, 0x6a, 0x69, 0x2f, 0x79, \n\t0x32, 0x50, 0x49, 0x70, 0x31, 0x52, 0x78, 0x41, 0x55, 0x5a, 0x56, 0x2f, 0x4d, 0x75, 0x66, 0x64, 0x5a, 0x46, \n\t0x53, 0x59, 0x68, 0x69, 0x56, 0x35, 0x59, 0x6a, 0x53, 0x77, 0x36, 0x54, 0x71, 0x6d, 0x6f, 0x30, 0x69, 0x47, \n\t0x49, 0x58, 0x77, 0x53, 0x48, 0x58, 0x46, 0x4e, 0x49, 0x78, 0x4b, 0x4b, 0x58, 0x6e, 0x32, 0x48, 0x66, 0x5c, 0x0a,\n\t0x09, 0x74, 0x63, 0x65, 0x55, 0x70, 0x62, 0x4e, 0x51, 0x46, 0x47, 0x64, 0x69, 0x73, 0x51, 0x32, 0x33, 0x33, \n\t0x30, 0x31, 0x70, 0x46, 0x65, 0x32, 0x6c, 0x48, 0x48, 0x68, 0x65, 0x31, 0x50, 0x51, 0x6a, 0x36, 0x4e, 0x42, \n\t0x65, 0x57, 0x32, 0x62, 0x36, 0x55, 0x65, 0x54, 0x49, 0x68, 0x68, 0x39, 0x4f, 0x4a, 0x70, 0x75, 0x32, 0x64, \n\t0x54, 0x67, 0x65, 0x6a, 0x69, 0x7a, 0x33, 0x78, 0x42, 0x4f, 0x50, 0x78, 0x79, 0x72, 0x56, 0x67, 0x43, 0x5c, 0x0a,\n\t0x09, 0x57, 0x50, 0x6f, 0x57, 0x5a, 0x67, 0x59, 0x59, 0x4e, 0x58, 0x49, 0x59, 0x59, 0x5a, 0x53, 0x7a, 0x35, \n\t0x6a, 0x6f, 0x61, 0x56, 0x63, 0x63, 0x38, 0x70, 0x69, 0x5a, 0x2b, 0x45, 0x54, 0x44, 0x53, 0x30, 0x67, 0x64, \n\t0x47, 0x39, 0x72, 0x70, 0x6c, 0x77, 0x4b, 0x69, 0x49, 0x6a, 0x2f, 0x76, 0x43, 0x4b, 0x44, 0x66, 0x58, 0x53, \n\t0x4d, 0x4f, 0x6f, 0x68, 0x70, 0x59, 0x42, 0x6b, 0x6c, 0x36, 0x58, 0x35, 0x69, 0x63, 0x4e, 0x74, 0x73, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x49, 0x4c, 0x35, 0x51, 0x64, 0x38, 0x63, 0x58, 0x50, 0x33, 0x2b, 0x4f, 0x72, 0x58, 0x6e, 0x6f, \n\t0x4a, 0x38, 0x54, 0x41, 0x4b, 0x58, 0x61, 0x39, 0x53, 0x53, 0x73, 0x72, 0x52, 0x4b, 0x49, 0x4a, 0x50, 0x5a, \n\t0x51, 0x6d, 0x4e, 0x45, 0x43, 0x45, 0x4b, 0x4f, 0x78, 0x46, 0x32, 0x74, 0x30, 0x66, 0x73, 0x62, 0x41, 0x32, \n\t0x35, 0x2f, 0x75, 0x6f, 0x52, 0x58, 0x2f, 0x4b, 0x43, 0x66, 0x62, 0x37, 0x6d, 0x43, 0x2f, 0x65, 0x49, 0x5c, 0x0a,\n\t0x09, 0x41, 0x42, 0x54, 0x4e, 0x51, 0x78, 0x72, 0x46, 0x5a, 0x64, 0x48, 0x64, 0x52, 0x39, 0x31, 0x56, 0x71, \n\t0x32, 0x64, 0x51, 0x36, 0x35, 0x30, 0x42, 0x44, 0x6c, 0x53, 0x61, 0x41, 0x4e, 0x63, 0x68, 0x75, 0x42, 0x30, \n\t0x59, 0x58, 0x4f, 0x2f, 0x72, 0x4d, 0x34, 0x4c, 0x52, 0x53, 0x2f, 0x6f, 0x33, 0x2f, 0x6c, 0x69, 0x63, 0x39, \n\t0x4a, 0x77, 0x52, 0x36, 0x64, 0x54, 0x38, 0x48, 0x67, 0x2b, 0x69, 0x41, 0x76, 0x67, 0x6b, 0x55, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x57, 0x6f, 0x6a, 0x6e, 0x62, 0x55, 0x38, 0x78, 0x58, 0x61, 0x74, 0x5a, 0x6f, 0x77, 0x4e, 0x43, 0x2b, \n\t0x46, 0x44, 0x2b, 0x73, 0x68, 0x52, 0x65, 0x43, 0x50, 0x50, 0x72, 0x72, 0x48, 0x48, 0x39, 0x36, 0x37, 0x78, \n\t0x34, 0x56, 0x39, 0x69, 0x53, 0x2b, 0x72, 0x4a, 0x5a, 0x64, 0x6e, 0x47, 0x6e, 0x2f, 0x46, 0x69, 0x59, 0x49, \n\t0x58, 0x50, 0x6d, 0x32, 0x58, 0x4a, 0x7a, 0x39, 0x68, 0x6b, 0x4e, 0x48, 0x66, 0x45, 0x74, 0x5a, 0x35, 0x5c, 0x0a,\n\t0x09, 0x52, 0x4f, 0x30, 0x73, 0x54, 0x70, 0x50, 0x4f, 0x4d, 0x31, 0x4a, 0x6c, 0x37, 0x61, 0x73, 0x6a, 0x79, \n\t0x71, 0x50, 0x73, 0x31, 0x47, 0x64, 0x31, 0x56, 0x50, 0x46, 0x69, 0x79, 0x68, 0x4c, 0x58, 0x59, 0x33, 0x62, \n\t0x49, 0x32, 0x39, 0x6b, 0x38, 0x74, 0x45, 0x36, 0x62, 0x76, 0x67, 0x6c, 0x58, 0x39, 0x36, 0x54, 0x69, 0x39, \n\t0x54, 0x31, 0x46, 0x2b, 0x64, 0x67, 0x38, 0x78, 0x2b, 0x6d, 0x77, 0x39, 0x56, 0x53, 0x71, 0x59, 0x78, 0x5c, 0x0a,\n\t0x09, 0x33, 0x57, 0x39, 0x39, 0x68, 0x52, 0x62, 0x37, 0x47, 0x79, 0x2b, 0x47, 0x38, 0x39, 0x56, 0x63, 0x54, \n\t0x2f, 0x63, 0x38, 0x35, 0x48, 0x4f, 0x65, 0x6f, 0x68, 0x36, 0x6a, 0x71, 0x4e, 0x44, 0x6c, 0x66, 0x48, 0x72, \n\t0x67, 0x68, 0x78, 0x67, 0x2b, 0x68, 0x38, 0x6c, 0x55, 0x38, 0x49, 0x62, 0x30, 0x58, 0x68, 0x52, 0x38, 0x34, \n\t0x4e, 0x2b, 0x4e, 0x68, 0x6e, 0x42, 0x75, 0x43, 0x32, 0x63, 0x4d, 0x35, 0x78, 0x66, 0x4e, 0x63, 0x78, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x42, 0x79, 0x34, 0x67, 0x68, 0x50, 0x48, 0x42, 0x7a, 0x68, 0x58, 0x34, 0x46, 0x7a, 0x42, 0x69, \n\t0x65, 0x50, 0x56, 0x4f, 0x65, 0x63, 0x4b, 0x6a, 0x68, 0x38, 0x4c, 0x65, 0x57, 0x34, 0x31, 0x2b, 0x67, 0x70, \n\t0x58, 0x35, 0x59, 0x32, 0x44, 0x59, 0x6c, 0x43, 0x64, 0x6f, 0x31, 0x44, 0x70, 0x77, 0x76, 0x47, 0x67, 0x2b, \n\t0x6f, 0x64, 0x50, 0x37, 0x77, 0x72, 0x2f, 0x62, 0x36, 0x44, 0x4b, 0x50, 0x76, 0x43, 0x36, 0x71, 0x72, 0x5c, 0x0a,\n\t0x09, 0x39, 0x56, 0x58, 0x76, 0x34, 0x34, 0x36, 0x48, 0x54, 0x2b, 0x57, 0x67, 0x72, 0x6b, 0x38, 0x64, 0x66, \n\t0x44, 0x78, 0x62, 0x74, 0x56, 0x66, 0x52, 0x58, 0x67, 0x65, 0x44, 0x76, 0x77, 0x66, 0x49, 0x44, 0x69, 0x31, \n\t0x67, 0x39, 0x57, 0x54, 0x36, 0x59, 0x6e, 0x58, 0x32, 0x61, 0x5a, 0x52, 0x33, 0x51, 0x58, 0x41, 0x55, 0x4c, \n\t0x51, 0x57, 0x44, 0x4f, 0x75, 0x2b, 0x6c, 0x56, 0x32, 0x64, 0x67, 0x36, 0x48, 0x6c, 0x6d, 0x52, 0x65, 0x5c, 0x0a,\n\t0x09, 0x43, 0x34, 0x30, 0x6c, 0x68, 0x44, 0x52, 0x68, 0x2f, 0x79, 0x76, 0x31, 0x66, 0x62, 0x2f, 0x77, 0x4d, \n\t0x4b, 0x39, 0x35, 0x78, 0x2b, 0x4d, 0x7a, 0x46, 0x44, 0x57, 0x57, 0x77, 0x73, 0x46, 0x33, 0x66, 0x75, 0x55, \n\t0x5a, 0x2f, 0x75, 0x62, 0x4c, 0x54, 0x68, 0x6a, 0x39, 0x6b, 0x67, 0x2f, 0x58, 0x59, 0x73, 0x36, 0x5a, 0x2b, \n\t0x78, 0x67, 0x2f, 0x7a, 0x38, 0x6a, 0x6d, 0x6d, 0x64, 0x45, 0x68, 0x71, 0x48, 0x6f, 0x62, 0x4e, 0x38, 0x5c, 0x0a,\n\t0x09, 0x66, 0x49, 0x79, 0x46, 0x54, 0x7a, 0x6a, 0x4c, 0x79, 0x31, 0x46, 0x38, 0x30, 0x72, 0x30, 0x76, 0x64, \n\t0x6f, 0x35, 0x77, 0x41, 0x31, 0x31, 0x31, 0x66, 0x33, 0x70, 0x50, 0x4c, 0x54, 0x39, 0x52, 0x62, 0x6c, 0x30, \n\t0x31, 0x31, 0x76, 0x34, 0x2b, 0x63, 0x5a, 0x5a, 0x65, 0x59, 0x59, 0x55, 0x61, 0x70, 0x38, 0x31, 0x4c, 0x73, \n\t0x54, 0x79, 0x70, 0x68, 0x4d, 0x65, 0x45, 0x53, 0x6c, 0x63, 0x63, 0x33, 0x66, 0x33, 0x46, 0x77, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x51, 0x72, 0x34, 0x6a, 0x59, 0x4b, 0x44, 0x30, 0x6c, 0x74, 0x69, 0x35, 0x52, 0x6c, 0x4a, 0x36, 0x36, \n\t0x44, 0x75, 0x6f, 0x35, 0x74, 0x79, 0x55, 0x50, 0x6c, 0x39, 0x76, 0x71, 0x62, 0x6c, 0x67, 0x6a, 0x57, 0x7a, \n\t0x56, 0x34, 0x53, 0x74, 0x50, 0x77, 0x35, 0x56, 0x6e, 0x66, 0x50, 0x35, 0x31, 0x77, 0x2f, 0x66, 0x33, 0x46, \n\t0x4f, 0x59, 0x77, 0x31, 0x65, 0x64, 0x4c, 0x44, 0x34, 0x7a, 0x43, 0x35, 0x78, 0x6e, 0x6d, 0x4d, 0x34, 0x5c, 0x0a,\n\t0x09, 0x32, 0x67, 0x4c, 0x4d, 0x41, 0x64, 0x55, 0x43, 0x31, 0x47, 0x48, 0x56, 0x56, 0x6c, 0x64, 0x6f, 0x4f, \n\t0x71, 0x48, 0x50, 0x56, 0x45, 0x79, 0x34, 0x47, 0x2f, 0x44, 0x31, 0x38, 0x76, 0x54, 0x70, 0x55, 0x46, 0x61, \n\t0x66, 0x4c, 0x79, 0x31, 0x6d, 0x42, 0x39, 0x71, 0x31, 0x47, 0x56, 0x44, 0x71, 0x74, 0x36, 0x59, 0x45, 0x6a, \n\t0x39, 0x42, 0x64, 0x67, 0x74, 0x76, 0x36, 0x78, 0x55, 0x2f, 0x42, 0x57, 0x75, 0x42, 0x43, 0x6e, 0x75, 0x5c, 0x0a,\n\t0x09, 0x77, 0x6e, 0x45, 0x43, 0x34, 0x55, 0x4b, 0x75, 0x35, 0x72, 0x74, 0x6b, 0x46, 0x68, 0x2f, 0x52, 0x46, \n\t0x79, 0x56, 0x6e, 0x31, 0x48, 0x73, 0x6e, 0x34, 0x37, 0x70, 0x6f, 0x32, 0x53, 0x36, 0x55, 0x43, 0x54, 0x76, \n\t0x48, 0x6d, 0x39, 0x35, 0x2f, 0x63, 0x61, 0x34, 0x51, 0x67, 0x73, 0x70, 0x2f, 0x2b, 0x45, 0x4f, 0x2f, 0x2f, \n\t0x42, 0x6a, 0x33, 0x66, 0x6d, 0x62, 0x55, 0x6e, 0x4f, 0x7a, 0x62, 0x68, 0x52, 0x72, 0x54, 0x68, 0x56, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x35, 0x58, 0x6b, 0x59, 0x4c, 0x36, 0x61, 0x62, 0x5a, 0x39, 0x42, 0x33, 0x64, 0x74, 0x45, 0x68, \n\t0x66, 0x68, 0x31, 0x6b, 0x38, 0x62, 0x54, 0x66, 0x4e, 0x33, 0x6b, 0x4e, 0x30, 0x6a, 0x36, 0x62, 0x4c, 0x31, \n\t0x76, 0x72, 0x2b, 0x36, 0x57, 0x34, 0x5a, 0x5a, 0x45, 0x66, 0x4c, 0x36, 0x6d, 0x76, 0x44, 0x55, 0x6f, 0x77, \n\t0x51, 0x48, 0x2f, 0x77, 0x6f, 0x7a, 0x62, 0x47, 0x45, 0x72, 0x6b, 0x6d, 0x79, 0x73, 0x5a, 0x70, 0x34, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x35, 0x44, 0x75, 0x47, 0x6f, 0x55, 0x34, 0x37, 0x59, 0x2f, 0x4a, 0x64, 0x50, 0x2f, 0x73, 0x4d, \n\t0x70, 0x44, 0x61, 0x65, 0x53, 0x7a, 0x45, 0x58, 0x53, 0x75, 0x68, 0x37, 0x6b, 0x4a, 0x46, 0x77, 0x2b, 0x33, \n\t0x71, 0x4f, 0x46, 0x70, 0x69, 0x45, 0x73, 0x71, 0x69, 0x38, 0x74, 0x4a, 0x72, 0x32, 0x72, 0x77, 0x54, 0x75, \n\t0x7a, 0x36, 0x58, 0x66, 0x4c, 0x62, 0x61, 0x62, 0x35, 0x61, 0x32, 0x66, 0x51, 0x76, 0x4e, 0x44, 0x35, 0x5c, 0x0a,\n\t0x09, 0x44, 0x2f, 0x6f, 0x61, 0x4d, 0x63, 0x49, 0x44, 0x79, 0x6e, 0x75, 0x2b, 0x48, 0x6e, 0x5a, 0x57, 0x49, \n\t0x51, 0x4b, 0x66, 0x2f, 0x51, 0x79, 0x35, 0x4e, 0x49, 0x2f, 0x63, 0x4d, 0x33, 0x46, 0x59, 0x7a, 0x4d, 0x79, \n\t0x79, 0x54, 0x77, 0x6c, 0x6e, 0x73, 0x75, 0x54, 0x56, 0x72, 0x45, 0x58, 0x6c, 0x49, 0x4b, 0x2f, 0x4f, 0x34, \n\t0x48, 0x39, 0x68, 0x4a, 0x39, 0x57, 0x54, 0x42, 0x59, 0x53, 0x61, 0x43, 0x35, 0x6a, 0x6a, 0x43, 0x79, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x62, 0x48, 0x58, 0x7a, 0x41, 0x6f, 0x6a, 0x65, 0x30, 0x2b, 0x54, 0x54, 0x6e, 0x69, 0x63, 0x54, \n\t0x4d, 0x66, 0x38, 0x59, 0x52, 0x51, 0x79, 0x43, 0x76, 0x43, 0x78, 0x63, 0x41, 0x6f, 0x6a, 0x58, 0x73, 0x45, \n\t0x79, 0x73, 0x6d, 0x6d, 0x55, 0x41, 0x7a, 0x73, 0x48, 0x6f, 0x78, 0x6f, 0x75, 0x74, 0x4d, 0x42, 0x49, 0x4f, \n\t0x62, 0x6f, 0x54, 0x47, 0x46, 0x6d, 0x59, 0x68, 0x4c, 0x39, 0x43, 0x50, 0x49, 0x71, 0x6c, 0x59, 0x57, 0x5c, 0x0a,\n\t0x09, 0x53, 0x48, 0x33, 0x58, 0x33, 0x35, 0x79, 0x68, 0x48, 0x31, 0x62, 0x70, 0x46, 0x74, 0x36, 0x39, 0x49, \n\t0x79, 0x35, 0x30, 0x53, 0x50, 0x6e, 0x43, 0x56, 0x37, 0x46, 0x59, 0x33, 0x41, 0x48, 0x61, 0x2f, 0x6d, 0x45, \n\t0x36, 0x55, 0x77, 0x6d, 0x6d, 0x72, 0x37, 0x32, 0x47, 0x6b, 0x74, 0x6f, 0x69, 0x33, 0x67, 0x42, 0x61, 0x32, \n\t0x78, 0x63, 0x34, 0x54, 0x52, 0x34, 0x35, 0x65, 0x73, 0x2f, 0x32, 0x42, 0x2b, 0x30, 0x76, 0x69, 0x62, 0x5c, 0x0a,\n\t0x09, 0x57, 0x6d, 0x44, 0x55, 0x47, 0x78, 0x53, 0x73, 0x49, 0x59, 0x79, 0x30, 0x31, 0x61, 0x49, 0x61, 0x71, \n\t0x73, 0x30, 0x7a, 0x30, 0x64, 0x6b, 0x58, 0x52, 0x76, 0x46, 0x7a, 0x6d, 0x68, 0x35, 0x47, 0x4e, 0x6a, 0x77, \n\t0x6c, 0x6a, 0x46, 0x72, 0x4b, 0x31, 0x51, 0x39, 0x47, 0x2f, 0x6d, 0x39, 0x75, 0x52, 0x4b, 0x30, 0x4d, 0x61, \n\t0x58, 0x49, 0x77, 0x43, 0x73, 0x43, 0x78, 0x4d, 0x46, 0x4a, 0x44, 0x35, 0x76, 0x55, 0x38, 0x6f, 0x69, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x64, 0x59, 0x33, 0x48, 0x70, 0x53, 0x59, 0x66, 0x61, 0x75, 0x52, 0x79, 0x75, 0x56, 0x55, 0x35, \n\t0x6e, 0x44, 0x61, 0x4d, 0x41, 0x4e, 0x76, 0x76, 0x6c, 0x6b, 0x47, 0x67, 0x50, 0x62, 0x62, 0x30, 0x4a, 0x76, \n\t0x67, 0x64, 0x53, 0x46, 0x6a, 0x7a, 0x4b, 0x67, 0x57, 0x33, 0x6d, 0x48, 0x34, 0x6d, 0x65, 0x45, 0x35, 0x58, \n\t0x73, 0x63, 0x7a, 0x32, 0x43, 0x77, 0x59, 0x33, 0x6d, 0x6e, 0x52, 0x51, 0x51, 0x6e, 0x6a, 0x32, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x77, 0x72, 0x4d, 0x79, 0x4c, 0x59, 0x6a, 0x75, 0x41, 0x6b, 0x37, 0x45, 0x70, 0x31, 0x71, 0x36, 0x57, \n\t0x6a, 0x50, 0x43, 0x36, 0x4d, 0x36, 0x62, 0x64, 0x71, 0x63, 0x73, 0x34, 0x6e, 0x6a, 0x35, 0x33, 0x4a, 0x75, \n\t0x33, 0x56, 0x57, 0x67, 0x65, 0x4d, 0x44, 0x4c, 0x42, 0x56, 0x63, 0x4d, 0x6f, 0x30, 0x72, 0x65, 0x75, 0x4d, \n\t0x4d, 0x72, 0x56, 0x34, 0x78, 0x51, 0x77, 0x36, 0x6c, 0x6f, 0x4b, 0x4d, 0x6e, 0x63, 0x59, 0x6c, 0x58, 0x5c, 0x0a,\n\t0x09, 0x46, 0x38, 0x42, 0x43, 0x4d, 0x54, 0x72, 0x34, 0x2f, 0x74, 0x58, 0x6b, 0x5a, 0x68, 0x35, 0x43, 0x31, \n\t0x61, 0x6a, 0x71, 0x45, 0x73, 0x72, 0x52, 0x79, 0x6b, 0x49, 0x68, 0x67, 0x4a, 0x38, 0x62, 0x43, 0x37, 0x2b, \n\t0x71, 0x63, 0x74, 0x4b, 0x37, 0x30, 0x50, 0x55, 0x5a, 0x73, 0x56, 0x6c, 0x43, 0x7a, 0x7a, 0x71, 0x50, 0x35, \n\t0x4a, 0x65, 0x55, 0x43, 0x39, 0x72, 0x35, 0x47, 0x46, 0x30, 0x64, 0x59, 0x4e, 0x2f, 0x74, 0x61, 0x55, 0x5c, 0x0a,\n\t0x09, 0x73, 0x53, 0x44, 0x79, 0x62, 0x41, 0x54, 0x4b, 0x44, 0x7a, 0x2b, 0x35, 0x71, 0x38, 0x49, 0x54, 0x6d, \n\t0x52, 0x78, 0x45, 0x31, 0x54, 0x4e, 0x37, 0x32, 0x51, 0x52, 0x70, 0x5a, 0x34, 0x4c, 0x52, 0x58, 0x33, 0x37, \n\t0x75, 0x53, 0x57, 0x36, 0x2b, 0x5a, 0x6c, 0x36, 0x62, 0x42, 0x44, 0x54, 0x79, 0x2f, 0x4b, 0x66, 0x73, 0x38, \n\t0x76, 0x7a, 0x62, 0x6a, 0x35, 0x6d, 0x7a, 0x73, 0x38, 0x49, 0x6f, 0x76, 0x63, 0x66, 0x31, 0x33, 0x48, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x57, 0x4e, 0x4d, 0x39, 0x45, 0x35, 0x78, 0x72, 0x44, 0x53, 0x4a, 0x64, 0x35, 0x59, 0x54, 0x41, \n\t0x4b, 0x35, 0x33, 0x49, 0x77, 0x51, 0x6a, 0x56, 0x34, 0x42, 0x51, 0x30, 0x50, 0x67, 0x49, 0x70, 0x6c, 0x75, \n\t0x56, 0x30, 0x65, 0x66, 0x64, 0x35, 0x71, 0x2f, 0x56, 0x6b, 0x44, 0x49, 0x77, 0x30, 0x68, 0x41, 0x35, 0x50, \n\t0x49, 0x55, 0x6c, 0x49, 0x7a, 0x6e, 0x57, 0x73, 0x59, 0x48, 0x61, 0x6a, 0x30, 0x65, 0x6f, 0x4d, 0x30, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x66, 0x6e, 0x6d, 0x59, 0x47, 0x54, 0x31, 0x4e, 0x76, 0x4f, 0x46, 0x64, 0x44, 0x65, 0x77, 0x57, \n\t0x61, 0x4d, 0x57, 0x70, 0x69, 0x73, 0x4d, 0x2f, 0x52, 0x43, 0x2b, 0x57, 0x42, 0x67, 0x39, 0x46, 0x54, 0x6a, \n\t0x64, 0x56, 0x64, 0x4d, 0x35, 0x6d, 0x61, 0x69, 0x46, 0x58, 0x2f, 0x78, 0x70, 0x37, 0x78, 0x38, 0x53, 0x58, \n\t0x70, 0x4b, 0x2b, 0x53, 0x34, 0x37, 0x4f, 0x4a, 0x2b, 0x32, 0x59, 0x59, 0x6a, 0x54, 0x4e, 0x63, 0x65, 0x5c, 0x0a,\n\t0x09, 0x72, 0x59, 0x67, 0x4a, 0x2f, 0x2b, 0x33, 0x36, 0x37, 0x6e, 0x78, 0x33, 0x37, 0x37, 0x4d, 0x66, 0x37, \n\t0x34, 0x76, 0x6a, 0x32, 0x47, 0x49, 0x78, 0x58, 0x66, 0x6c, 0x6b, 0x2b, 0x48, 0x48, 0x4e, 0x74, 0x32, 0x76, \n\t0x50, 0x68, 0x70, 0x75, 0x37, 0x7a, 0x71, 0x43, 0x30, 0x37, 0x35, 0x49, 0x68, 0x75, 0x64, 0x79, 0x59, 0x69, \n\t0x4e, 0x44, 0x30, 0x76, 0x51, 0x5a, 0x2b, 0x2f, 0x54, 0x45, 0x59, 0x2b, 0x38, 0x32, 0x44, 0x43, 0x64, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x32, 0x6c, 0x52, 0x75, 0x4c, 0x65, 0x4f, 0x63, 0x61, 0x4e, 0x70, 0x2b, 0x68, 0x36, 0x63, 0x54, \n\t0x79, 0x65, 0x71, 0x4c, 0x42, 0x68, 0x39, 0x50, 0x73, 0x2b, 0x70, 0x52, 0x39, 0x50, 0x71, 0x67, 0x71, 0x6a, \n\t0x72, 0x37, 0x55, 0x68, 0x58, 0x75, 0x4d, 0x65, 0x51, 0x7a, 0x37, 0x68, 0x37, 0x7a, 0x49, 0x6d, 0x74, 0x70, \n\t0x38, 0x78, 0x6f, 0x6d, 0x70, 0x52, 0x30, 0x72, 0x74, 0x68, 0x76, 0x48, 0x55, 0x30, 0x4c, 0x36, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x51, 0x4f, 0x6e, 0x51, 0x56, 0x41, 0x36, 0x61, 0x41, 0x49, 0x4d, 0x46, 0x4c, 0x37, 0x38, 0x6f, 0x53, \n\t0x52, 0x73, 0x6a, 0x70, 0x2f, 0x68, 0x30, 0x69, 0x42, 0x71, 0x30, 0x65, 0x34, 0x52, 0x44, 0x32, 0x48, 0x41, \n\t0x4d, 0x51, 0x51, 0x56, 0x31, 0x61, 0x6a, 0x58, 0x77, 0x55, 0x4e, 0x62, 0x4e, 0x53, 0x74, 0x4e, 0x75, 0x2b, \n\t0x66, 0x48, 0x39, 0x31, 0x79, 0x52, 0x56, 0x79, 0x32, 0x55, 0x76, 0x7a, 0x51, 0x2f, 0x55, 0x47, 0x56, 0x5c, 0x0a,\n\t0x09, 0x52, 0x73, 0x63, 0x6a, 0x54, 0x62, 0x6a, 0x4f, 0x44, 0x78, 0x4d, 0x66, 0x7a, 0x6b, 0x74, 0x54, 0x2f, \n\t0x33, 0x58, 0x2b, 0x71, 0x71, 0x35, 0x6c, 0x69, 0x4c, 0x42, 0x46, 0x73, 0x33, 0x70, 0x2f, 0x67, 0x4e, 0x75, \n\t0x36, 0x72, 0x76, 0x70, 0x78, 0x43, 0x38, 0x39, 0x54, 0x53, 0x76, 0x78, 0x38, 0x68, 0x6d, 0x63, 0x42, 0x76, \n\t0x39, 0x4e, 0x57, 0x79, 0x7a, 0x6d, 0x5a, 0x78, 0x74, 0x51, 0x6f, 0x67, 0x4a, 0x66, 0x45, 0x4c, 0x37, 0x5c, 0x0a,\n\t0x09, 0x48, 0x2b, 0x70, 0x62, 0x4d, 0x6d, 0x51, 0x52, 0x77, 0x39, 0x44, 0x59, 0x79, 0x75, 0x4f, 0x62, 0x58, \n\t0x46, 0x39, 0x33, 0x37, 0x56, 0x56, 0x55, 0x71, 0x46, 0x68, 0x56, 0x46, 0x34, 0x65, 0x44, 0x70, 0x54, 0x69, \n\t0x59, 0x4f, 0x32, 0x58, 0x47, 0x33, 0x62, 0x59, 0x6d, 0x54, 0x76, 0x59, 0x33, 0x59, 0x59, 0x70, 0x56, 0x4c, \n\t0x6c, 0x55, 0x51, 0x32, 0x42, 0x54, 0x36, 0x4e, 0x6a, 0x66, 0x57, 0x48, 0x55, 0x33, 0x4e, 0x4f, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x4d, 0x72, 0x75, 0x5a, 0x62, 0x52, 0x45, 0x47, 0x4f, 0x57, 0x65, 0x59, 0x79, 0x75, 0x4d, 0x49, \n\t0x42, 0x33, 0x65, 0x64, 0x38, 0x54, 0x62, 0x68, 0x35, 0x53, 0x71, 0x6a, 0x46, 0x41, 0x50, 0x73, 0x59, 0x4f, \n\t0x48, 0x6b, 0x66, 0x6f, 0x42, 0x42, 0x41, 0x38, 0x43, 0x76, 0x77, 0x31, 0x48, 0x50, 0x51, 0x57, 0x67, 0x4e, \n\t0x4a, 0x41, 0x71, 0x2f, 0x4e, 0x43, 0x39, 0x47, 0x70, 0x71, 0x76, 0x32, 0x30, 0x69, 0x59, 0x4d, 0x75, 0x5c, 0x0a,\n\t0x09, 0x44, 0x44, 0x62, 0x6b, 0x74, 0x42, 0x52, 0x38, 0x2b, 0x6a, 0x4d, 0x78, 0x43, 0x4b, 0x59, 0x4b, 0x54, \n\t0x50, 0x44, 0x52, 0x48, 0x55, 0x76, 0x6b, 0x59, 0x4d, 0x59, 0x48, 0x41, 0x6c, 0x6a, 0x4d, 0x35, 0x57, 0x69, \n\t0x56, 0x77, 0x4e, 0x6f, 0x32, 0x63, 0x69, 0x4d, 0x68, 0x47, 0x49, 0x70, 0x76, 0x45, 0x52, 0x33, 0x51, 0x61, \n\t0x63, 0x41, 0x56, 0x58, 0x59, 0x53, 0x44, 0x4a, 0x50, 0x32, 0x4c, 0x35, 0x72, 0x55, 0x33, 0x62, 0x54, 0x5c, 0x0a,\n\t0x09, 0x36, 0x72, 0x79, 0x57, 0x75, 0x65, 0x57, 0x73, 0x6a, 0x41, 0x6e, 0x72, 0x39, 0x46, 0x61, 0x66, 0x62, \n\t0x72, 0x4d, 0x64, 0x73, 0x36, 0x4f, 0x54, 0x4a, 0x53, 0x75, 0x39, 0x64, 0x55, 0x7a, 0x66, 0x54, 0x63, 0x76, \n\t0x72, 0x79, 0x34, 0x6d, 0x6a, 0x73, 0x35, 0x73, 0x57, 0x35, 0x64, 0x6e, 0x6f, 0x6d, 0x48, 0x72, 0x46, 0x76, \n\t0x72, 0x33, 0x48, 0x70, 0x57, 0x38, 0x35, 0x71, 0x7a, 0x4d, 0x4b, 0x59, 0x42, 0x42, 0x2f, 0x37, 0x50, 0x5c, 0x0a,\n\t0x09, 0x39, 0x5a, 0x6e, 0x31, 0x48, 0x6f, 0x63, 0x69, 0x48, 0x6f, 0x4c, 0x6c, 0x69, 0x36, 0x59, 0x74, 0x2f, \n\t0x44, 0x53, 0x45, 0x38, 0x42, 0x71, 0x47, 0x63, 0x2b, 0x71, 0x32, 0x35, 0x61, 0x33, 0x55, 0x58, 0x79, 0x4f, \n\t0x6d, 0x6f, 0x2f, 0x6b, 0x38, 0x38, 0x6e, 0x64, 0x4b, 0x74, 0x4b, 0x64, 0x57, 0x30, 0x39, 0x47, 0x6d, 0x63, \n\t0x63, 0x31, 0x68, 0x4c, 0x53, 0x65, 0x56, 0x32, 0x32, 0x57, 0x32, 0x5a, 0x58, 0x36, 0x57, 0x73, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x55, 0x62, 0x49, 0x44, 0x5a, 0x4f, 0x69, 0x6d, 0x2b, 0x62, 0x77, 0x5a, 0x2b, 0x65, 0x36, 0x5a, 0x2f, \n\t0x79, 0x45, 0x49, 0x44, 0x31, 0x33, 0x4b, 0x4f, 0x38, 0x5a, 0x55, 0x63, 0x43, 0x4c, 0x54, 0x67, 0x4f, 0x68, \n\t0x5a, 0x55, 0x53, 0x6a, 0x36, 0x52, 0x51, 0x32, 0x79, 0x5a, 0x42, 0x68, 0x70, 0x6e, 0x57, 0x62, 0x6f, 0x63, \n\t0x43, 0x49, 0x59, 0x6a, 0x57, 0x32, 0x6f, 0x52, 0x77, 0x64, 0x47, 0x2f, 0x65, 0x63, 0x59, 0x5a, 0x63, 0x5c, 0x0a,\n\t0x09, 0x71, 0x51, 0x67, 0x47, 0x6b, 0x56, 0x4d, 0x41, 0x70, 0x78, 0x62, 0x54, 0x72, 0x6d, 0x41, 0x61, 0x50, \n\t0x77, 0x6a, 0x77, 0x79, 0x4d, 0x4e, 0x46, 0x52, 0x79, 0x4d, 0x43, 0x6f, 0x56, 0x6a, 0x45, 0x4b, 0x6a, 0x56, \n\t0x6a, 0x43, 0x79, 0x6f, 0x31, 0x33, 0x31, 0x36, 0x4a, 0x71, 0x46, 0x6b, 0x66, 0x45, 0x5a, 0x32, 0x53, 0x6b, \n\t0x41, 0x70, 0x52, 0x37, 0x47, 0x74, 0x30, 0x35, 0x6c, 0x42, 0x62, 0x72, 0x53, 0x51, 0x45, 0x57, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x30, 0x33, 0x36, 0x68, 0x48, 0x4a, 0x44, 0x30, 0x51, 0x6c, 0x68, 0x66, 0x68, 0x76, 0x71, 0x44, 0x6a, \n\t0x6f, 0x4f, 0x72, 0x66, 0x52, 0x57, 0x56, 0x71, 0x70, 0x36, 0x34, 0x59, 0x39, 0x49, 0x68, 0x2f, 0x4d, 0x6c, \n\t0x41, 0x56, 0x4f, 0x58, 0x39, 0x72, 0x50, 0x52, 0x38, 0x65, 0x77, 0x50, 0x4c, 0x58, 0x46, 0x39, 0x48, 0x7a, \n\t0x77, 0x31, 0x47, 0x79, 0x51, 0x73, 0x65, 0x6d, 0x2b, 0x57, 0x39, 0x59, 0x53, 0x53, 0x5a, 0x2b, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x58, 0x41, 0x79, 0x42, 0x52, 0x37, 0x48, 0x57, 0x46, 0x6b, 0x59, 0x62, 0x42, 0x79, 0x47, 0x4e, 0x6e, \n\t0x6e, 0x6c, 0x74, 0x50, 0x52, 0x41, 0x30, 0x5a, 0x6a, 0x52, 0x63, 0x45, 0x6e, 0x6d, 0x57, 0x73, 0x45, 0x7a, \n\t0x63, 0x53, 0x2f, 0x58, 0x42, 0x6f, 0x2f, 0x38, 0x6c, 0x51, 0x33, 0x31, 0x46, 0x45, 0x63, 0x58, 0x30, 0x4d, \n\t0x47, 0x73, 0x67, 0x37, 0x73, 0x5a, 0x46, 0x2b, 0x68, 0x41, 0x41, 0x49, 0x7a, 0x72, 0x46, 0x2f, 0x71, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x54, 0x4e, 0x6c, 0x4d, 0x53, 0x56, 0x7a, 0x6a, 0x38, 0x6f, 0x34, 0x72, 0x72, 0x61, 0x67, 0x6a, \n\t0x4b, 0x56, 0x6b, 0x39, 0x37, 0x36, 0x75, 0x41, 0x54, 0x57, 0x4d, 0x38, 0x68, 0x41, 0x70, 0x59, 0x58, 0x43, \n\t0x56, 0x71, 0x51, 0x74, 0x41, 0x35, 0x42, 0x6b, 0x41, 0x35, 0x51, 0x64, 0x76, 0x36, 0x56, 0x47, 0x2f, 0x6c, \n\t0x55, 0x7a, 0x75, 0x49, 0x78, 0x4b, 0x65, 0x6c, 0x62, 0x57, 0x41, 0x73, 0x6a, 0x34, 0x52, 0x52, 0x30, 0x5c, 0x0a,\n\t0x09, 0x49, 0x61, 0x62, 0x55, 0x47, 0x46, 0x36, 0x4b, 0x78, 0x56, 0x46, 0x64, 0x49, 0x37, 0x55, 0x74, 0x2b, \n\t0x48, 0x7a, 0x79, 0x6a, 0x41, 0x4b, 0x45, 0x79, 0x6d, 0x63, 0x69, 0x72, 0x54, 0x32, 0x6c, 0x46, 0x52, 0x68, \n\t0x52, 0x75, 0x2f, 0x52, 0x61, 0x5a, 0x63, 0x57, 0x6b, 0x63, 0x4e, 0x4f, 0x4b, 0x73, 0x7a, 0x70, 0x38, 0x4f, \n\t0x45, 0x57, 0x2b, 0x73, 0x6a, 0x44, 0x69, 0x39, 0x73, 0x79, 0x31, 0x6e, 0x74, 0x33, 0x2b, 0x6e, 0x70, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x35, 0x70, 0x70, 0x79, 0x39, 0x6d, 0x52, 0x6f, 0x7a, 0x77, 0x72, 0x6c, 0x49, 0x39, 0x55, 0x78, \n\t0x77, 0x79, 0x6f, 0x35, 0x72, 0x6c, 0x64, 0x49, 0x62, 0x68, 0x54, 0x54, 0x64, 0x72, 0x46, 0x2b, 0x59, 0x7a, \n\t0x30, 0x50, 0x5a, 0x6c, 0x79, 0x36, 0x33, 0x43, 0x58, 0x7a, 0x36, 0x68, 0x72, 0x54, 0x2b, 0x33, 0x6d, 0x78, \n\t0x6a, 0x50, 0x31, 0x6f, 0x2b, 0x6f, 0x45, 0x69, 0x65, 0x73, 0x6c, 0x53, 0x61, 0x50, 0x32, 0x76, 0x77, 0x5c, 0x0a,\n\t0x09, 0x59, 0x71, 0x76, 0x34, 0x38, 0x51, 0x2b, 0x61, 0x76, 0x45, 0x6b, 0x58, 0x56, 0x67, 0x68, 0x33, 0x75, \n\t0x4a, 0x62, 0x74, 0x66, 0x58, 0x6c, 0x2f, 0x55, 0x5a, 0x31, 0x57, 0x6b, 0x4b, 0x69, 0x4c, 0x61, 0x45, 0x4c, \n\t0x63, 0x7a, 0x31, 0x78, 0x48, 0x46, 0x31, 0x58, 0x6c, 0x54, 0x31, 0x48, 0x66, 0x67, 0x73, 0x71, 0x70, 0x37, \n\t0x38, 0x2b, 0x31, 0x4c, 0x42, 0x61, 0x37, 0x76, 0x52, 0x57, 0x31, 0x78, 0x42, 0x35, 0x42, 0x75, 0x72, 0x5c, 0x0a,\n\t0x09, 0x30, 0x6c, 0x34, 0x4c, 0x58, 0x41, 0x30, 0x38, 0x33, 0x46, 0x47, 0x70, 0x6b, 0x66, 0x51, 0x47, 0x30, \n\t0x63, 0x57, 0x66, 0x2b, 0x6f, 0x4a, 0x77, 0x2b, 0x4d, 0x79, 0x34, 0x6f, 0x68, 0x56, 0x56, 0x78, 0x6a, 0x70, \n\t0x6f, 0x76, 0x61, 0x6a, 0x72, 0x42, 0x62, 0x39, 0x49, 0x74, 0x69, 0x2b, 0x4d, 0x74, 0x43, 0x55, 0x30, 0x45, \n\t0x34, 0x7a, 0x36, 0x36, 0x4a, 0x42, 0x4d, 0x4f, 0x71, 0x76, 0x44, 0x68, 0x47, 0x74, 0x5a, 0x41, 0x59, 0x5c, 0x0a,\n\t0x09, 0x78, 0x73, 0x6f, 0x35, 0x6f, 0x37, 0x6a, 0x43, 0x6f, 0x72, 0x70, 0x58, 0x78, 0x49, 0x47, 0x48, 0x35, \n\t0x55, 0x47, 0x48, 0x30, 0x4d, 0x5a, 0x42, 0x2b, 0x54, 0x66, 0x2f, 0x58, 0x58, 0x37, 0x55, 0x42, 0x78, 0x6e, \n\t0x57, 0x50, 0x77, 0x4a, 0x47, 0x46, 0x77, 0x59, 0x77, 0x6e, 0x48, 0x5a, 0x34, 0x42, 0x52, 0x39, 0x4b, 0x50, \n\t0x52, 0x42, 0x30, 0x61, 0x59, 0x38, 0x44, 0x67, 0x59, 0x6d, 0x65, 0x75, 0x79, 0x4d, 0x67, 0x35, 0x47, 0x5c, 0x0a,\n\t0x09, 0x49, 0x32, 0x72, 0x48, 0x4d, 0x2f, 0x6a, 0x6e, 0x6f, 0x69, 0x79, 0x75, 0x43, 0x45, 0x5a, 0x43, 0x73, \n\t0x79, 0x34, 0x74, 0x6c, 0x45, 0x30, 0x35, 0x73, 0x50, 0x45, 0x4f, 0x36, 0x74, 0x4a, 0x44, 0x49, 0x67, 0x4a, \n\t0x49, 0x41, 0x4a, 0x68, 0x79, 0x54, 0x6b, 0x63, 0x77, 0x43, 0x75, 0x6b, 0x56, 0x6a, 0x44, 0x44, 0x58, 0x5a, \n\t0x32, 0x45, 0x30, 0x61, 0x75, 0x37, 0x4c, 0x46, 0x79, 0x75, 0x36, 0x54, 0x73, 0x4e, 0x57, 0x44, 0x71, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x79, 0x41, 0x67, 0x7a, 0x4f, 0x2b, 0x48, 0x73, 0x5a, 0x4e, 0x66, 0x64, 0x53, 0x4c, 0x59, 0x43, \n\t0x39, 0x45, 0x2b, 0x6b, 0x2f, 0x63, 0x6a, 0x61, 0x70, 0x52, 0x66, 0x52, 0x45, 0x77, 0x6b, 0x4c, 0x58, 0x55, \n\t0x4f, 0x6a, 0x6f, 0x41, 0x65, 0x5a, 0x67, 0x4e, 0x4b, 0x5a, 0x42, 0x4f, 0x39, 0x38, 0x6f, 0x6c, 0x77, 0x36, \n\t0x6a, 0x54, 0x4c, 0x6b, 0x36, 0x59, 0x5a, 0x52, 0x37, 0x34, 0x61, 0x65, 0x41, 0x6b, 0x59, 0x72, 0x76, 0x5c, 0x0a,\n\t0x09, 0x42, 0x79, 0x4e, 0x54, 0x58, 0x32, 0x4e, 0x68, 0x52, 0x46, 0x79, 0x48, 0x38, 0x34, 0x4c, 0x52, 0x43, \n\t0x49, 0x59, 0x66, 0x46, 0x59, 0x59, 0x66, 0x45, 0x73, 0x70, 0x48, 0x4d, 0x38, 0x2f, 0x54, 0x69, 0x4f, 0x7a, \n\t0x44, 0x36, 0x42, 0x4f, 0x4f, 0x30, 0x53, 0x63, 0x63, 0x2f, 0x4d, 0x2b, 0x43, 0x34, 0x68, 0x70, 0x68, 0x63, \n\t0x4c, 0x4f, 0x77, 0x66, 0x57, 0x75, 0x4a, 0x4f, 0x39, 0x34, 0x43, 0x6f, 0x31, 0x77, 0x5a, 0x63, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x66, 0x51, 0x64, 0x35, 0x46, 0x73, 0x56, 0x42, 0x39, 0x64, 0x4d, 0x42, 0x6f, 0x33, 0x6b, 0x6f, 0x5a, \n\t0x4b, 0x71, 0x2b, 0x76, 0x48, 0x31, 0x47, 0x55, 0x45, 0x49, 0x2b, 0x63, 0x62, 0x70, 0x61, 0x4d, 0x65, 0x33, \n\t0x5a, 0x4b, 0x79, 0x71, 0x75, 0x64, 0x36, 0x64, 0x4d, 0x7a, 0x43, 0x79, 0x50, 0x6c, 0x37, 0x55, 0x31, 0x41, \n\t0x51, 0x54, 0x77, 0x5a, 0x48, 0x39, 0x5a, 0x77, 0x44, 0x70, 0x4f, 0x70, 0x36, 0x30, 0x44, 0x44, 0x53, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x42, 0x47, 0x61, 0x68, 0x62, 0x63, 0x30, 0x5a, 0x61, 0x36, 0x72, 0x53, 0x35, 0x4b, 0x71, 0x71, \n\t0x34, 0x38, 0x54, 0x47, 0x4b, 0x6d, 0x36, 0x74, 0x33, 0x6c, 0x52, 0x56, 0x44, 0x41, 0x61, 0x50, 0x52, 0x4c, \n\t0x66, 0x43, 0x38, 0x58, 0x74, 0x30, 0x48, 0x2f, 0x6b, 0x62, 0x46, 0x49, 0x51, 0x33, 0x52, 0x6d, 0x46, 0x73, \n\t0x75, 0x44, 0x49, 0x67, 0x65, 0x63, 0x6f, 0x77, 0x38, 0x6a, 0x57, 0x78, 0x54, 0x68, 0x51, 0x78, 0x49, 0x5c, 0x0a,\n\t0x09, 0x31, 0x71, 0x6f, 0x68, 0x58, 0x37, 0x76, 0x58, 0x52, 0x6b, 0x47, 0x74, 0x55, 0x4d, 0x4d, 0x4a, 0x4b, \n\t0x4c, 0x46, 0x58, 0x79, 0x47, 0x48, 0x79, 0x6d, 0x4e, 0x39, 0x54, 0x4f, 0x5a, 0x6c, 0x41, 0x38, 0x35, 0x79, \n\t0x6f, 0x63, 0x63, 0x42, 0x33, 0x39, 0x59, 0x4d, 0x4c, 0x68, 0x65, 0x32, 0x4c, 0x6f, 0x56, 0x42, 0x6a, 0x65, \n\t0x58, 0x75, 0x47, 0x31, 0x31, 0x54, 0x34, 0x49, 0x42, 0x78, 0x53, 0x47, 0x41, 0x6b, 0x63, 0x34, 0x47, 0x5c, 0x0a,\n\t0x09, 0x71, 0x4e, 0x5a, 0x68, 0x4b, 0x52, 0x6a, 0x56, 0x37, 0x36, 0x61, 0x48, 0x45, 0x67, 0x56, 0x53, 0x4f, \n\t0x6c, 0x79, 0x68, 0x75, 0x32, 0x6c, 0x68, 0x71, 0x4e, 0x38, 0x31, 0x35, 0x51, 0x77, 0x72, 0x34, 0x6d, 0x74, \n\t0x4c, 0x4b, 0x56, 0x68, 0x4e, 0x49, 0x31, 0x50, 0x30, 0x41, 0x70, 0x79, 0x66, 0x51, 0x31, 0x52, 0x62, 0x4e, \n\t0x68, 0x59, 0x79, 0x51, 0x72, 0x50, 0x4b, 0x58, 0x6e, 0x78, 0x65, 0x57, 0x79, 0x6f, 0x75, 0x41, 0x36, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x41, 0x6f, 0x38, 0x67, 0x69, 0x38, 0x32, 0x33, 0x4a, 0x64, 0x74, 0x32, 0x4b, 0x71, 0x32, 0x44, \n\t0x30, 0x73, 0x48, 0x6f, 0x6d, 0x42, 0x55, 0x68, 0x35, 0x36, 0x37, 0x69, 0x61, 0x31, 0x4e, 0x49, 0x66, 0x52, \n\t0x46, 0x58, 0x39, 0x50, 0x7a, 0x55, 0x39, 0x58, 0x36, 0x51, 0x50, 0x4c, 0x33, 0x6e, 0x78, 0x34, 0x56, 0x44, \n\t0x42, 0x4b, 0x43, 0x6c, 0x66, 0x46, 0x34, 0x77, 0x6d, 0x42, 0x51, 0x56, 0x4a, 0x2f, 0x53, 0x77, 0x46, 0x5c, 0x0a,\n\t0x09, 0x52, 0x6f, 0x6c, 0x30, 0x77, 0x32, 0x6a, 0x30, 0x61, 0x57, 0x48, 0x34, 0x6f, 0x5a, 0x4c, 0x52, 0x4a, \n\t0x38, 0x76, 0x4f, 0x36, 0x70, 0x6c, 0x47, 0x52, 0x67, 0x38, 0x34, 0x52, 0x67, 0x39, 0x73, 0x77, 0x54, 0x74, \n\t0x68, 0x36, 0x38, 0x61, 0x53, 0x72, 0x56, 0x76, 0x4c, 0x71, 0x76, 0x74, 0x57, 0x4c, 0x41, 0x4e, 0x47, 0x4e, \n\t0x70, 0x38, 0x5a, 0x59, 0x61, 0x54, 0x72, 0x50, 0x65, 0x54, 0x62, 0x43, 0x69, 0x4d, 0x49, 0x70, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x59, 0x43, 0x49, 0x38, 0x53, 0x44, 0x78, 0x70, 0x39, 0x7a, 0x47, 0x6b, 0x62, 0x65, 0x55, 0x69, 0x4a, \n\t0x59, 0x54, 0x62, 0x72, 0x6f, 0x34, 0x76, 0x55, 0x47, 0x79, 0x38, 0x6a, 0x58, 0x53, 0x56, 0x53, 0x46, 0x42, \n\t0x56, 0x47, 0x58, 0x72, 0x39, 0x35, 0x4f, 0x5a, 0x47, 0x43, 0x67, 0x5a, 0x51, 0x43, 0x57, 0x57, 0x46, 0x67, \n\t0x4b, 0x55, 0x42, 0x70, 0x47, 0x78, 0x65, 0x6b, 0x47, 0x74, 0x67, 0x32, 0x4d, 0x62, 0x70, 0x33, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x78, 0x5a, 0x6e, 0x4d, 0x49, 0x68, 0x4a, 0x75, 0x53, 0x78, 0x36, 0x53, 0x42, 0x6b, 0x47, 0x55, 0x64, \n\t0x6f, 0x45, 0x77, 0x53, 0x71, 0x36, 0x64, 0x44, 0x6b, 0x61, 0x74, 0x35, 0x55, 0x70, 0x65, 0x2b, 0x4b, 0x42, \n\t0x6a, 0x33, 0x57, 0x42, 0x6b, 0x70, 0x51, 0x4e, 0x47, 0x34, 0x35, 0x36, 0x48, 0x4f, 0x4f, 0x53, 0x43, 0x4d, \n\t0x4c, 0x70, 0x33, 0x78, 0x50, 0x43, 0x2b, 0x45, 0x58, 0x4a, 0x2b, 0x7a, 0x76, 0x54, 0x78, 0x6d, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x71, 0x42, 0x51, 0x53, 0x6a, 0x54, 0x43, 0x49, 0x62, 0x33, 0x46, 0x51, 0x7a, 0x76, 0x4b, 0x32, 0x43, \n\t0x72, 0x67, 0x74, 0x4c, 0x67, 0x35, 0x68, 0x47, 0x44, 0x47, 0x30, 0x72, 0x63, 0x37, 0x71, 0x4a, 0x67, 0x46, \n\t0x4c, 0x71, 0x46, 0x46, 0x6b, 0x62, 0x68, 0x65, 0x42, 0x45, 0x77, 0x4d, 0x70, 0x66, 0x6b, 0x59, 0x4d, 0x53, \n\t0x41, 0x78, 0x6c, 0x63, 0x55, 0x59, 0x4f, 0x51, 0x4c, 0x45, 0x61, 0x77, 0x6d, 0x4b, 0x61, 0x70, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x6c, 0x63, 0x78, 0x6a, 0x42, 0x53, 0x57, 0x47, 0x52, 0x67, 0x4a, 0x7a, 0x58, 0x66, 0x56, 0x51, \n\t0x72, 0x6c, 0x43, 0x32, 0x44, 0x71, 0x30, 0x56, 0x62, 0x34, 0x69, 0x54, 0x64, 0x33, 0x55, 0x67, 0x46, 0x4c, \n\t0x78, 0x54, 0x6d, 0x49, 0x59, 0x46, 0x53, 0x66, 0x56, 0x2f, 0x51, 0x58, 0x4c, 0x62, 0x31, 0x45, 0x57, 0x55, \n\t0x53, 0x57, 0x33, 0x64, 0x54, 0x61, 0x43, 0x5a, 0x63, 0x47, 0x6f, 0x46, 0x52, 0x51, 0x2b, 0x30, 0x42, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x47, 0x49, 0x6e, 0x72, 0x32, 0x64, 0x52, 0x38, 0x59, 0x74, 0x64, 0x78, 0x48, 0x4b, 0x34, 0x79, \n\t0x73, 0x7a, 0x42, 0x74, 0x47, 0x75, 0x62, 0x72, 0x73, 0x61, 0x46, 0x53, 0x5a, 0x65, 0x79, 0x6f, 0x66, 0x46, \n\t0x6b, 0x59, 0x50, 0x44, 0x43, 0x6e, 0x76, 0x4c, 0x79, 0x6e, 0x50, 0x35, 0x6b, 0x65, 0x50, 0x48, 0x72, 0x6f, \n\t0x49, 0x48, 0x33, 0x76, 0x4d, 0x73, 0x54, 0x4f, 0x41, 0x32, 0x36, 0x38, 0x53, 0x64, 0x67, 0x62, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x4a, 0x33, 0x79, 0x77, 0x4f, 0x50, 0x77, 0x72, 0x76, 0x73, 0x64, 0x42, 0x79, 0x4f, 0x34, 0x38, \n\t0x54, 0x51, 0x38, 0x2b, 0x77, 0x59, 0x7a, 0x38, 0x33, 0x30, 0x49, 0x77, 0x33, 0x73, 0x4c, 0x68, 0x76, 0x64, \n\t0x57, 0x46, 0x6e, 0x5a, 0x78, 0x6c, 0x54, 0x43, 0x34, 0x66, 0x6b, 0x52, 0x78, 0x6e, 0x56, 0x42, 0x63, 0x57, \n\t0x56, 0x4b, 0x63, 0x4c, 0x47, 0x76, 0x2f, 0x36, 0x45, 0x77, 0x77, 0x43, 0x76, 0x55, 0x79, 0x4e, 0x78, 0x5c, 0x0a,\n\t0x09, 0x67, 0x70, 0x6e, 0x51, 0x6d, 0x4d, 0x67, 0x68, 0x56, 0x53, 0x6b, 0x4c, 0x34, 0x62, 0x56, 0x59, 0x4f, \n\t0x56, 0x73, 0x76, 0x41, 0x77, 0x38, 0x74, 0x44, 0x51, 0x4d, 0x42, 0x4b, 0x6e, 0x4c, 0x49, 0x2f, 0x51, 0x38, \n\t0x33, 0x42, 0x4e, 0x32, 0x55, 0x54, 0x70, 0x44, 0x74, 0x66, 0x55, 0x4d, 0x41, 0x72, 0x6e, 0x51, 0x68, 0x6e, \n\t0x43, 0x42, 0x6d, 0x2f, 0x36, 0x6f, 0x34, 0x6b, 0x57, 0x52, 0x72, 0x36, 0x41, 0x32, 0x68, 0x49, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x41, 0x4d, 0x4a, 0x35, 0x75, 0x4b, 0x6f, 0x32, 0x46, 0x62, 0x70, 0x75, 0x78, 0x59, 0x6d, 0x6d, 0x58, \n\t0x64, 0x56, 0x51, 0x63, 0x37, 0x63, 0x69, 0x49, 0x48, 0x39, 0x36, 0x45, 0x2b, 0x36, 0x70, 0x48, 0x78, 0x39, \n\t0x58, 0x6b, 0x66, 0x31, 0x41, 0x64, 0x4f, 0x6d, 0x6e, 0x2f, 0x6e, 0x77, 0x34, 0x76, 0x44, 0x32, 0x75, 0x7a, \n\t0x4d, 0x51, 0x38, 0x41, 0x74, 0x73, 0x77, 0x5a, 0x6f, 0x56, 0x52, 0x6d, 0x36, 0x77, 0x45, 0x52, 0x76, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x65, 0x78, 0x73, 0x47, 0x6f, 0x42, 0x52, 0x54, 0x7a, 0x67, 0x6c, 0x47, 0x75, 0x7a, 0x4c, 0x56, \n\t0x75, 0x66, 0x33, 0x6a, 0x4a, 0x49, 0x52, 0x64, 0x48, 0x79, 0x4a, 0x34, 0x67, 0x46, 0x30, 0x76, 0x6b, 0x6f, \n\t0x69, 0x41, 0x58, 0x42, 0x44, 0x6c, 0x66, 0x55, 0x6a, 0x35, 0x57, 0x4e, 0x70, 0x76, 0x33, 0x74, 0x63, 0x68, \n\t0x6a, 0x65, 0x33, 0x44, 0x33, 0x78, 0x31, 0x30, 0x31, 0x74, 0x51, 0x56, 0x34, 0x38, 0x49, 0x4c, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x70, 0x54, 0x64, 0x50, 0x62, 0x69, 0x32, 0x39, 0x35, 0x39, 0x4d, 0x56, 0x68, 0x41, 0x41, 0x2b, 0x63, \n\t0x51, 0x35, 0x75, 0x4f, 0x67, 0x4d, 0x33, 0x6e, 0x47, 0x78, 0x4a, 0x4c, 0x46, 0x41, 0x2b, 0x37, 0x43, 0x67, \n\t0x66, 0x33, 0x6f, 0x49, 0x50, 0x4e, 0x4b, 0x66, 0x64, 0x72, 0x75, 0x43, 0x4f, 0x67, 0x54, 0x73, 0x6d, 0x7a, \n\t0x62, 0x2f, 0x6a, 0x55, 0x70, 0x30, 0x2f, 0x4c, 0x72, 0x6a, 0x6a, 0x4a, 0x52, 0x77, 0x54, 0x69, 0x68, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x6c, 0x4e, 0x37, 0x73, 0x79, 0x4d, 0x4b, 0x72, 0x72, 0x78, 0x73, 0x4a, 0x49, 0x76, 0x54, 0x76, \n\t0x34, 0x2b, 0x46, 0x34, 0x77, 0x30, 0x74, 0x66, 0x51, 0x35, 0x46, 0x2f, 0x6e, 0x71, 0x37, 0x70, 0x58, 0x4e, \n\t0x67, 0x30, 0x41, 0x70, 0x62, 0x65, 0x4d, 0x6f, 0x4e, 0x34, 0x42, 0x4d, 0x54, 0x69, 0x75, 0x4b, 0x61, 0x71, \n\t0x46, 0x72, 0x5a, 0x46, 0x50, 0x4a, 0x67, 0x79, 0x33, 0x42, 0x7a, 0x32, 0x69, 0x49, 0x42, 0x4f, 0x73, 0x5c, 0x0a,\n\t0x09, 0x71, 0x51, 0x50, 0x71, 0x49, 0x66, 0x62, 0x6f, 0x42, 0x67, 0x72, 0x69, 0x45, 0x54, 0x49, 0x68, 0x63, \n\t0x6d, 0x69, 0x4c, 0x2f, 0x61, 0x75, 0x66, 0x73, 0x39, 0x5a, 0x6a, 0x30, 0x77, 0x61, 0x4c, 0x53, 0x4d, 0x50, \n\t0x49, 0x33, 0x59, 0x69, 0x54, 0x62, 0x59, 0x53, 0x44, 0x50, 0x6a, 0x55, 0x34, 0x69, 0x55, 0x58, 0x6b, 0x67, \n\t0x43, 0x66, 0x72, 0x63, 0x75, 0x58, 0x6e, 0x67, 0x38, 0x30, 0x5a, 0x52, 0x68, 0x4f, 0x74, 0x53, 0x38, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x41, 0x68, 0x2f, 0x57, 0x46, 0x55, 0x59, 0x65, 0x4f, 0x33, 0x6a, 0x42, 0x53, 0x39, 0x79, 0x51, \n\t0x58, 0x52, 0x35, 0x51, 0x50, 0x6a, 0x79, 0x6a, 0x50, 0x6c, 0x63, 0x6a, 0x35, 0x45, 0x6a, 0x6b, 0x33, 0x6f, \n\t0x6a, 0x77, 0x76, 0x4d, 0x4d, 0x72, 0x55, 0x38, 0x51, 0x54, 0x79, 0x77, 0x4f, 0x50, 0x55, 0x45, 0x41, 0x49, \n\t0x34, 0x65, 0x77, 0x6e, 0x32, 0x52, 0x72, 0x41, 0x37, 0x6f, 0x56, 0x55, 0x30, 0x4e, 0x4d, 0x62, 0x57, 0x5c, 0x0a,\n\t0x09, 0x77, 0x52, 0x67, 0x41, 0x35, 0x6b, 0x54, 0x32, 0x48, 0x4c, 0x49, 0x48, 0x50, 0x44, 0x71, 0x65, 0x44, \n\t0x75, 0x36, 0x59, 0x34, 0x45, 0x34, 0x4a, 0x78, 0x64, 0x55, 0x6a, 0x42, 0x6a, 0x63, 0x4d, 0x32, 0x66, 0x71, \n\t0x73, 0x49, 0x57, 0x77, 0x74, 0x47, 0x6b, 0x62, 0x6d, 0x75, 0x55, 0x51, 0x77, 0x47, 0x73, 0x54, 0x35, 0x52, \n\t0x44, 0x42, 0x71, 0x44, 0x4b, 0x45, 0x47, 0x52, 0x6b, 0x4c, 0x74, 0x2b, 0x4b, 0x31, 0x68, 0x46, 0x43, 0x5c, 0x0a,\n\t0x09, 0x77, 0x56, 0x37, 0x51, 0x66, 0x79, 0x6d, 0x64, 0x52, 0x51, 0x43, 0x46, 0x32, 0x31, 0x41, 0x2b, 0x72, \n\t0x39, 0x71, 0x65, 0x75, 0x75, 0x48, 0x75, 0x72, 0x36, 0x55, 0x56, 0x54, 0x6b, 0x43, 0x6a, 0x51, 0x4b, 0x42, \n\t0x31, 0x47, 0x63, 0x71, 0x70, 0x4d, 0x61, 0x66, 0x69, 0x71, 0x4e, 0x4f, 0x36, 0x36, 0x75, 0x43, 0x7a, 0x41, \n\t0x71, 0x43, 0x79, 0x69, 0x65, 0x42, 0x48, 0x4a, 0x76, 0x6e, 0x39, 0x71, 0x62, 0x42, 0x45, 0x51, 0x33, 0x5c, 0x0a,\n\t0x09, 0x41, 0x66, 0x47, 0x2b, 0x47, 0x62, 0x57, 0x54, 0x30, 0x38, 0x6f, 0x71, 0x59, 0x64, 0x52, 0x69, 0x4b, \n\t0x61, 0x30, 0x4b, 0x52, 0x6d, 0x33, 0x33, 0x61, 0x56, 0x37, 0x45, 0x53, 0x57, 0x48, 0x45, 0x6e, 0x6a, 0x43, \n\t0x36, 0x2f, 0x34, 0x44, 0x79, 0x4d, 0x30, 0x50, 0x4b, 0x68, 0x30, 0x66, 0x49, 0x67, 0x6a, 0x61, 0x51, 0x4f, \n\t0x37, 0x30, 0x54, 0x68, 0x33, 0x63, 0x48, 0x73, 0x4e, 0x4e, 0x6e, 0x51, 0x72, 0x4b, 0x52, 0x32, 0x36, 0x5c, 0x0a,\n\t0x09, 0x34, 0x53, 0x33, 0x76, 0x39, 0x67, 0x64, 0x63, 0x4d, 0x6e, 0x64, 0x2b, 0x43, 0x47, 0x55, 0x33, 0x4d, \n\t0x6f, 0x58, 0x49, 0x66, 0x49, 0x4a, 0x59, 0x64, 0x63, 0x63, 0x70, 0x51, 0x50, 0x46, 0x67, 0x7a, 0x2f, 0x64, \n\t0x4a, 0x76, 0x39, 0x48, 0x57, 0x48, 0x37, 0x63, 0x2f, 0x66, 0x5a, 0x66, 0x73, 0x5a, 0x2b, 0x30, 0x34, 0x69, \n\t0x58, 0x41, 0x69, 0x4d, 0x36, 0x59, 0x43, 0x54, 0x6f, 0x75, 0x55, 0x59, 0x78, 0x6a, 0x41, 0x5a, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x67, 0x77, 0x38, 0x77, 0x43, 0x68, 0x76, 0x56, 0x43, 0x31, 0x56, 0x35, 0x43, 0x7a, 0x31, 0x63, 0x72, \n\t0x76, 0x57, 0x46, 0x78, 0x75, 0x4f, 0x68, 0x6c, 0x73, 0x42, 0x49, 0x71, 0x76, 0x77, 0x6a, 0x47, 0x48, 0x6b, \n\t0x48, 0x74, 0x67, 0x7a, 0x69, 0x78, 0x62, 0x66, 0x31, 0x61, 0x36, 0x66, 0x32, 0x76, 0x6e, 0x59, 0x44, 0x71, \n\t0x6d, 0x35, 0x61, 0x53, 0x46, 0x4e, 0x51, 0x57, 0x57, 0x41, 0x48, 0x36, 0x72, 0x34, 0x63, 0x53, 0x48, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x39, 0x4d, 0x48, 0x63, 0x51, 0x58, 0x70, 0x66, 0x6e, 0x57, 0x51, 0x41, 0x41, 0x49, 0x41, 0x42, \n\t0x4a, 0x52, 0x45, 0x46, 0x55, 0x33, 0x5a, 0x69, 0x65, 0x63, 0x6d, 0x6d, 0x44, 0x30, 0x6e, 0x45, 0x72, 0x68, \n\t0x56, 0x48, 0x49, 0x42, 0x46, 0x59, 0x4b, 0x49, 0x36, 0x74, 0x50, 0x70, 0x37, 0x66, 0x33, 0x31, 0x41, 0x4e, \n\t0x47, 0x35, 0x59, 0x4d, 0x48, 0x44, 0x44, 0x2b, 0x38, 0x52, 0x2f, 0x6c, 0x41, 0x4c, 0x34, 0x74, 0x33, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x72, 0x6e, 0x68, 0x46, 0x44, 0x7a, 0x31, 0x61, 0x72, 0x6a, 0x33, 0x73, 0x51, 0x70, 0x43, 0x66, \n\t0x2b, 0x34, 0x4a, 0x64, 0x6c, 0x65, 0x44, 0x66, 0x76, 0x4b, 0x55, 0x71, 0x2b, 0x47, 0x47, 0x55, 0x38, 0x4b, \n\t0x6c, 0x49, 0x56, 0x78, 0x39, 0x58, 0x44, 0x6d, 0x73, 0x6c, 0x79, 0x53, 0x79, 0x37, 0x39, 0x68, 0x2f, 0x31, \n\t0x79, 0x37, 0x6c, 0x32, 0x59, 0x4c, 0x64, 0x6c, 0x31, 0x78, 0x69, 0x65, 0x5a, 0x5a, 0x52, 0x61, 0x43, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x35, 0x47, 0x44, 0x6e, 0x73, 0x58, 0x4b, 0x4f, 0x71, 0x56, 0x79, 0x59, 0x2b, 0x2f, 0x55, 0x44, \n\t0x70, 0x31, 0x63, 0x50, 0x34, 0x56, 0x64, 0x72, 0x4b, 0x59, 0x52, 0x79, 0x47, 0x2f, 0x6e, 0x30, 0x61, 0x46, \n\t0x2b, 0x34, 0x6a, 0x33, 0x4a, 0x4f, 0x46, 0x6b, 0x62, 0x64, 0x38, 0x5a, 0x4f, 0x54, 0x31, 0x43, 0x6f, 0x30, \n\t0x44, 0x32, 0x34, 0x66, 0x4c, 0x72, 0x64, 0x67, 0x43, 0x36, 0x77, 0x4f, 0x6a, 0x34, 0x68, 0x69, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x39, 0x6d, 0x6b, 0x63, 0x37, 0x41, 0x4c, 0x4f, 0x58, 0x64, 0x66, 0x6c, 0x58, 0x64, 0x45, 0x79, 0x43, \n\t0x59, 0x69, 0x65, 0x6b, 0x4a, 0x77, 0x4a, 0x6e, 0x30, 0x68, 0x70, 0x67, 0x30, 0x53, 0x49, 0x30, 0x37, 0x4a, \n\t0x4b, 0x47, 0x4e, 0x6c, 0x38, 0x4d, 0x33, 0x42, 0x59, 0x56, 0x78, 0x69, 0x56, 0x44, 0x77, 0x34, 0x5a, 0x66, \n\t0x75, 0x41, 0x69, 0x35, 0x64, 0x6c, 0x68, 0x53, 0x77, 0x55, 0x73, 0x54, 0x75, 0x36, 0x34, 0x56, 0x72, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x6a, 0x32, 0x74, 0x6e, 0x7a, 0x4f, 0x62, 0x32, 0x54, 0x57, 0x6c, 0x6a, 0x4c, 0x6c, 0x75, 0x46, \n\t0x48, 0x74, 0x68, 0x6e, 0x63, 0x4e, 0x47, 0x54, 0x72, 0x73, 0x38, 0x4e, 0x4f, 0x69, 0x63, 0x51, 0x77, 0x71, \n\t0x6d, 0x57, 0x4f, 0x4d, 0x41, 0x72, 0x35, 0x74, 0x63, 0x47, 0x6f, 0x66, 0x6b, 0x65, 0x38, 0x41, 0x31, 0x73, \n\t0x4b, 0x71, 0x71, 0x30, 0x32, 0x2f, 0x46, 0x59, 0x6a, 0x74, 0x56, 0x35, 0x48, 0x76, 0x58, 0x59, 0x75, 0x5c, 0x0a,\n\t0x09, 0x68, 0x4b, 0x4f, 0x6c, 0x49, 0x41, 0x45, 0x36, 0x4b, 0x50, 0x4f, 0x71, 0x56, 0x41, 0x41, 0x71, 0x69, \n\t0x49, 0x66, 0x75, 0x77, 0x35, 0x53, 0x41, 0x34, 0x4d, 0x41, 0x65, 0x4e, 0x4f, 0x55, 0x6f, 0x4a, 0x5a, 0x37, \n\t0x51, 0x36, 0x4d, 0x53, 0x58, 0x30, 0x38, 0x39, 0x48, 0x69, 0x6f, 0x41, 0x6d, 0x77, 0x48, 0x48, 0x67, 0x4d, \n\t0x66, 0x58, 0x44, 0x44, 0x6f, 0x68, 0x37, 0x55, 0x72, 0x5a, 0x64, 0x5a, 0x32, 0x51, 0x53, 0x49, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x75, 0x47, 0x31, 0x68, 0x67, 0x39, 0x74, 0x30, 0x46, 0x4c, 0x33, 0x52, 0x6a, 0x74, 0x2b, 0x53, 0x79, \n\t0x31, 0x38, 0x6e, 0x6c, 0x4c, 0x45, 0x7a, 0x33, 0x7a, 0x5a, 0x76, 0x7a, 0x4a, 0x39, 0x69, 0x45, 0x68, 0x59, \n\t0x77, 0x75, 0x6a, 0x6a, 0x6e, 0x4a, 0x6c, 0x64, 0x62, 0x53, 0x6b, 0x46, 0x78, 0x57, 0x57, 0x54, 0x48, 0x79, \n\t0x74, 0x33, 0x35, 0x7a, 0x53, 0x34, 0x5a, 0x46, 0x77, 0x38, 0x41, 0x63, 0x58, 0x32, 0x4c, 0x2f, 0x37, 0x5c, 0x0a,\n\t0x09, 0x33, 0x45, 0x6f, 0x67, 0x64, 0x42, 0x52, 0x6c, 0x2b, 0x49, 0x46, 0x41, 0x77, 0x2b, 0x42, 0x50, 0x6f, \n\t0x51, 0x6d, 0x50, 0x57, 0x79, 0x54, 0x62, 0x38, 0x78, 0x65, 0x2b, 0x53, 0x52, 0x68, 0x2b, 0x6d, 0x41, 0x4b, \n\t0x55, 0x41, 0x6f, 0x78, 0x38, 0x77, 0x39, 0x62, 0x70, 0x31, 0x4f, 0x72, 0x39, 0x36, 0x6c, 0x43, 0x6c, 0x69, \n\t0x62, 0x61, 0x41, 0x4c, 0x57, 0x6e, 0x66, 0x50, 0x6d, 0x51, 0x59, 0x70, 0x30, 0x4f, 0x6f, 0x64, 0x33, 0x5c, 0x0a,\n\t0x09, 0x43, 0x4d, 0x46, 0x73, 0x61, 0x4f, 0x31, 0x48, 0x46, 0x4a, 0x75, 0x74, 0x42, 0x56, 0x57, 0x6c, 0x62, \n\t0x73, 0x48, 0x7a, 0x54, 0x58, 0x36, 0x49, 0x57, 0x36, 0x78, 0x59, 0x36, 0x36, 0x6c, 0x58, 0x42, 0x51, 0x58, \n\t0x72, 0x63, 0x49, 0x45, 0x46, 0x32, 0x58, 0x6e, 0x48, 0x47, 0x6d, 0x6b, 0x55, 0x38, 0x45, 0x6f, 0x35, 0x79, \n\t0x4b, 0x42, 0x63, 0x50, 0x49, 0x6c, 0x6d, 0x56, 0x74, 0x59, 0x64, 0x53, 0x45, 0x44, 0x39, 0x35, 0x31, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x74, 0x48, 0x48, 0x39, 0x39, 0x6a, 0x49, 0x2f, 0x47, 0x54, 0x30, 0x34, 0x45, 0x43, 0x4e, 0x46, \n\t0x71, 0x34, 0x4c, 0x6a, 0x41, 0x4a, 0x77, 0x4c, 0x49, 0x78, 0x47, 0x64, 0x54, 0x69, 0x43, 0x53, 0x37, 0x52, \n\t0x56, 0x62, 0x65, 0x6d, 0x4e, 0x75, 0x52, 0x59, 0x59, 0x31, 0x61, 0x76, 0x73, 0x63, 0x7a, 0x41, 0x61, 0x47, \n\t0x62, 0x44, 0x59, 0x72, 0x57, 0x6e, 0x44, 0x4e, 0x53, 0x4f, 0x56, 0x31, 0x30, 0x47, 0x54, 0x4a, 0x67, 0x5c, 0x0a,\n\t0x09, 0x44, 0x4e, 0x37, 0x66, 0x6a, 0x30, 0x34, 0x5a, 0x59, 0x46, 0x34, 0x49, 0x6c, 0x4a, 0x6a, 0x36, 0x68, \n\t0x46, 0x2b, 0x6f, 0x47, 0x6f, 0x79, 0x69, 0x74, 0x6a, 0x45, 0x57, 0x55, 0x73, 0x6a, 0x74, 0x34, 0x77, 0x61, \n\t0x67, 0x50, 0x4b, 0x47, 0x4e, 0x74, 0x33, 0x59, 0x54, 0x42, 0x69, 0x37, 0x57, 0x42, 0x55, 0x50, 0x6a, 0x52, \n\t0x63, 0x6d, 0x69, 0x2f, 0x6f, 0x73, 0x68, 0x49, 0x42, 0x75, 0x61, 0x69, 0x42, 0x73, 0x6d, 0x67, 0x59, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x63, 0x73, 0x6e, 0x67, 0x56, 0x46, 0x6f, 0x36, 0x43, 0x70, 0x74, 0x42, 0x4b, 0x4d, 0x41, 0x44, \n\t0x4d, 0x6a, 0x44, 0x4b, 0x47, 0x63, 0x5a, 0x53, 0x51, 0x79, 0x6a, 0x4f, 0x6b, 0x38, 0x4c, 0x6f, 0x77, 0x41, \n\t0x57, 0x73, 0x7a, 0x6d, 0x61, 0x33, 0x6a, 0x51, 0x74, 0x42, 0x36, 0x50, 0x77, 0x45, 0x59, 0x42, 0x51, 0x74, \n\t0x6e, 0x49, 0x49, 0x37, 0x6c, 0x68, 0x7a, 0x44, 0x77, 0x32, 0x4d, 0x72, 0x75, 0x35, 0x62, 0x53, 0x37, 0x5c, 0x0a,\n\t0x09, 0x31, 0x41, 0x35, 0x4f, 0x76, 0x4e, 0x2b, 0x49, 0x6a, 0x73, 0x67, 0x77, 0x71, 0x48, 0x43, 0x34, 0x4a, \n\t0x52, 0x7a, 0x49, 0x67, 0x46, 0x77, 0x45, 0x67, 0x35, 0x32, 0x5a, 0x53, 0x69, 0x75, 0x63, 0x46, 0x49, 0x68, \n\t0x33, 0x76, 0x43, 0x53, 0x42, 0x36, 0x62, 0x59, 0x6f, 0x78, 0x37, 0x49, 0x35, 0x50, 0x4a, 0x55, 0x6d, 0x41, \n\t0x55, 0x4d, 0x6c, 0x5a, 0x51, 0x30, 0x44, 0x43, 0x4b, 0x75, 0x6c, 0x45, 0x57, 0x52, 0x68, 0x34, 0x75, 0x5c, 0x0a,\n\t0x09, 0x45, 0x72, 0x72, 0x6c, 0x47, 0x6b, 0x61, 0x6d, 0x6d, 0x34, 0x57, 0x30, 0x64, 0x4e, 0x4e, 0x55, 0x32, \n\t0x67, 0x43, 0x6a, 0x61, 0x4e, 0x64, 0x47, 0x48, 0x61, 0x2f, 0x67, 0x70, 0x6a, 0x66, 0x71, 0x31, 0x7a, 0x43, \n\t0x71, 0x34, 0x61, 0x54, 0x7a, 0x31, 0x2f, 0x4d, 0x35, 0x61, 0x68, 0x69, 0x64, 0x36, 0x56, 0x74, 0x48, 0x76, \n\t0x62, 0x74, 0x6d, 0x41, 0x74, 0x65, 0x6d, 0x6d, 0x56, 0x34, 0x4f, 0x4d, 0x4c, 0x4c, 0x42, 0x4f, 0x63, 0x5c, 0x0a,\n\t0x09, 0x47, 0x6e, 0x42, 0x34, 0x7a, 0x63, 0x64, 0x69, 0x2f, 0x50, 0x36, 0x45, 0x59, 0x6d, 0x6c, 0x4f, 0x4a, \n\t0x30, 0x69, 0x54, 0x75, 0x68, 0x69, 0x56, 0x2f, 0x48, 0x70, 0x4f, 0x47, 0x35, 0x77, 0x38, 0x6a, 0x2f, 0x72, \n\t0x57, 0x45, 0x45, 0x37, 0x64, 0x39, 0x4d, 0x71, 0x2f, 0x35, 0x4b, 0x67, 0x46, 0x59, 0x45, 0x49, 0x77, 0x30, \n\t0x4f, 0x44, 0x61, 0x4e, 0x67, 0x47, 0x53, 0x6d, 0x41, 0x52, 0x64, 0x39, 0x55, 0x38, 0x7a, 0x41, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x50, 0x71, 0x41, 0x49, 0x4d, 0x6a, 0x6b, 0x59, 0x57, 0x54, 0x41, 0x46, 0x38, 0x43, 0x69, 0x4c, 0x54, \n\t0x45, 0x71, 0x69, 0x64, 0x57, 0x76, 0x31, 0x50, 0x58, 0x4b, 0x6d, 0x62, 0x77, 0x56, 0x4e, 0x34, 0x69, 0x4f, \n\t0x36, 0x71, 0x6f, 0x59, 0x34, 0x47, 0x4b, 0x39, 0x2f, 0x35, 0x72, 0x67, 0x4c, 0x52, 0x6f, 0x6d, 0x73, 0x43, \n\t0x59, 0x79, 0x30, 0x54, 0x6f, 0x6c, 0x76, 0x74, 0x44, 0x65, 0x4d, 0x4a, 0x42, 0x4d, 0x2f, 0x4a, 0x59, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x63, 0x4e, 0x64, 0x74, 0x73, 0x5a, 0x4c, 0x37, 0x69, 0x64, 0x6f, 0x58, 0x64, 0x6c, 0x31, 0x35, \n\t0x71, 0x52, 0x70, 0x32, 0x43, 0x72, 0x42, 0x52, 0x47, 0x32, 0x6a, 0x4b, 0x79, 0x4d, 0x4b, 0x70, 0x67, 0x6b, \n\t0x4d, 0x49, 0x6f, 0x41, 0x4d, 0x4e, 0x59, 0x52, 0x71, 0x4a, 0x67, 0x56, 0x45, 0x4e, 0x6a, 0x6c, 0x49, 0x47, \n\t0x52, 0x2f, 0x30, 0x78, 0x31, 0x2f, 0x62, 0x46, 0x47, 0x44, 0x52, 0x7a, 0x62, 0x58, 0x64, 0x4d, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x32, 0x41, 0x6c, 0x61, 0x63, 0x74, 0x6f, 0x52, 0x44, 0x30, 0x41, 0x48, 0x38, 0x50, 0x6f, 0x69, \n\t0x72, 0x36, 0x31, 0x4d, 0x67, 0x6d, 0x49, 0x74, 0x73, 0x50, 0x74, 0x31, 0x34, 0x31, 0x74, 0x48, 0x49, 0x7a, \n\t0x71, 0x74, 0x46, 0x5a, 0x79, 0x76, 0x2f, 0x54, 0x54, 0x77, 0x36, 0x68, 0x64, 0x54, 0x34, 0x6a, 0x4c, 0x67, \n\t0x53, 0x45, 0x44, 0x6f, 0x77, 0x51, 0x55, 0x71, 0x34, 0x57, 0x52, 0x32, 0x79, 0x30, 0x6f, 0x6e, 0x72, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x69, 0x38, 0x65, 0x34, 0x6a, 0x4a, 0x46, 0x75, 0x33, 0x6a, 0x6a, 0x6a, 0x2b, 0x35, 0x5a, 0x63, \n\t0x6f, 0x72, 0x69, 0x6e, 0x56, 0x32, 0x54, 0x6e, 0x42, 0x61, 0x43, 0x4b, 0x78, 0x4d, 0x48, 0x4b, 0x30, 0x77, \n\t0x79, 0x69, 0x6b, 0x38, 0x2f, 0x36, 0x69, 0x32, 0x76, 0x38, 0x54, 0x75, 0x6d, 0x43, 0x36, 0x6d, 0x32, 0x62, \n\t0x2f, 0x6f, 0x6d, 0x44, 0x55, 0x5a, 0x68, 0x6b, 0x46, 0x6e, 0x30, 0x39, 0x77, 0x57, 0x67, 0x66, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x45, 0x44, 0x52, 0x37, 0x58, 0x32, 0x73, 0x48, 0x74, 0x67, 0x61, 0x54, 0x73, 0x70, 0x52, 0x30, 0x2b, \n\t0x32, 0x30, 0x61, 0x53, 0x6d, 0x38, 0x51, 0x54, 0x54, 0x4b, 0x50, 0x71, 0x50, 0x35, 0x6f, 0x6d, 0x6d, 0x41, \n\t0x59, 0x4a, 0x4e, 0x46, 0x42, 0x63, 0x35, 0x78, 0x4d, 0x49, 0x74, 0x53, 0x69, 0x30, 0x36, 0x74, 0x7a, 0x58, \n\t0x58, 0x4f, 0x46, 0x74, 0x4b, 0x67, 0x38, 0x78, 0x66, 0x6b, 0x35, 0x52, 0x6c, 0x6b, 0x39, 0x49, 0x62, 0x5c, 0x0a,\n\t0x09, 0x33, 0x6a, 0x4d, 0x4f, 0x37, 0x79, 0x75, 0x50, 0x58, 0x30, 0x6b, 0x78, 0x77, 0x38, 0x64, 0x49, 0x44, \n\t0x73, 0x5a, 0x2f, 0x4c, 0x5a, 0x79, 0x46, 0x68, 0x78, 0x70, 0x34, 0x54, 0x74, 0x4a, 0x77, 0x2f, 0x5a, 0x75, \n\t0x6d, 0x32, 0x49, 0x4f, 0x78, 0x57, 0x65, 0x7a, 0x62, 0x68, 0x46, 0x73, 0x69, 0x71, 0x71, 0x44, 0x6f, 0x64, \n\t0x35, 0x52, 0x4c, 0x5a, 0x4c, 0x30, 0x48, 0x4c, 0x64, 0x57, 0x41, 0x6b, 0x58, 0x53, 0x4d, 0x4f, 0x63, 0x5c, 0x0a,\n\t0x09, 0x51, 0x73, 0x45, 0x6e, 0x31, 0x38, 0x6a, 0x71, 0x56, 0x7a, 0x57, 0x6b, 0x79, 0x65, 0x33, 0x79, 0x36, \n\t0x4d, 0x74, 0x59, 0x5a, 0x2b, 0x2b, 0x6f, 0x39, 0x7a, 0x4b, 0x71, 0x50, 0x30, 0x6e, 0x6b, 0x61, 0x4c, 0x35, \n\t0x33, 0x35, 0x75, 0x63, 0x65, 0x55, 0x58, 0x69, 0x67, 0x46, 0x4b, 0x6f, 0x36, 0x43, 0x70, 0x70, 0x50, 0x46, \n\t0x41, 0x56, 0x51, 0x53, 0x63, 0x58, 0x64, 0x59, 0x4a, 0x45, 0x34, 0x66, 0x79, 0x32, 0x44, 0x53, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x39, 0x59, 0x6e, 0x46, 0x73, 0x31, 0x6c, 0x44, 0x4e, 0x39, 0x52, 0x38, 0x33, 0x36, 0x67, 0x61, 0x69, \n\t0x36, 0x71, 0x57, 0x68, 0x35, 0x52, 0x37, 0x55, 0x6f, 0x4e, 0x61, 0x36, 0x6e, 0x54, 0x68, 0x68, 0x6c, 0x70, \n\t0x53, 0x2b, 0x4d, 0x78, 0x6a, 0x56, 0x6f, 0x57, 0x4d, 0x32, 0x57, 0x73, 0x35, 0x6c, 0x79, 0x54, 0x62, 0x79, \n\t0x78, 0x57, 0x6a, 0x65, 0x4d, 0x33, 0x4c, 0x45, 0x42, 0x57, 0x38, 0x38, 0x35, 0x77, 0x38, 0x45, 0x37, 0x5c, 0x0a,\n\t0x09, 0x48, 0x6f, 0x4f, 0x44, 0x44, 0x59, 0x7a, 0x47, 0x69, 0x54, 0x73, 0x68, 0x44, 0x4b, 0x34, 0x74, 0x4b, \n\t0x61, 0x34, 0x76, 0x47, 0x54, 0x78, 0x78, 0x52, 0x48, 0x47, 0x6d, 0x70, 0x63, 0x35, 0x57, 0x74, 0x72, 0x46, \n\t0x61, 0x56, 0x41, 0x69, 0x6c, 0x31, 0x2f, 0x6d, 0x5a, 0x30, 0x6e, 0x34, 0x53, 0x59, 0x36, 0x52, 0x58, 0x6c, \n\t0x55, 0x2f, 0x38, 0x75, 0x78, 0x37, 0x74, 0x66, 0x36, 0x31, 0x67, 0x68, 0x43, 0x4e, 0x65, 0x53, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x61, 0x49, 0x39, 0x7a, 0x4c, 0x79, 0x2b, 0x32, 0x4c, 0x72, 0x37, 0x57, 0x6e, 0x72, 0x43, 0x59, 0x31, \n\t0x46, 0x35, 0x6c, 0x58, 0x56, 0x4d, 0x50, 0x49, 0x36, 0x76, 0x62, 0x70, 0x6f, 0x6e, 0x79, 0x4d, 0x63, 0x39, \n\t0x53, 0x54, 0x69, 0x2b, 0x72, 0x5a, 0x45, 0x4c, 0x55, 0x4c, 0x72, 0x6c, 0x6b, 0x6b, 0x32, 0x52, 0x6a, 0x73, \n\t0x57, 0x39, 0x38, 0x42, 0x63, 0x76, 0x41, 0x53, 0x68, 0x44, 0x34, 0x79, 0x79, 0x44, 0x36, 0x6b, 0x46, 0x5c, 0x0a,\n\t0x09, 0x52, 0x72, 0x33, 0x4f, 0x30, 0x64, 0x79, 0x30, 0x43, 0x33, 0x41, 0x38, 0x65, 0x6a, 0x41, 0x71, 0x72, \n\t0x74, 0x78, 0x6d, 0x35, 0x30, 0x56, 0x58, 0x63, 0x50, 0x43, 0x48, 0x35, 0x35, 0x46, 0x48, 0x4e, 0x35, 0x4d, \n\t0x61, 0x41, 0x64, 0x77, 0x4f, 0x75, 0x4e, 0x4e, 0x43, 0x63, 0x59, 0x56, 0x51, 0x6e, 0x42, 0x47, 0x4b, 0x4b, \n\t0x34, 0x58, 0x69, 0x61, 0x72, 0x38, 0x43, 0x50, 0x35, 0x6d, 0x35, 0x37, 0x32, 0x56, 0x74, 0x64, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x4d, 0x43, 0x71, 0x58, 0x30, 0x35, 0x6d, 0x41, 0x6b, 0x52, 0x48, 0x74, 0x66, 0x2b, 0x30, 0x76, \n\t0x79, 0x4d, 0x48, 0x4a, 0x4e, 0x47, 0x57, 0x6f, 0x59, 0x36, 0x62, 0x32, 0x4d, 0x38, 0x4d, 0x64, 0x68, 0x5a, \n\t0x6a, 0x55, 0x4b, 0x50, 0x6d, 0x72, 0x6e, 0x78, 0x2b, 0x52, 0x56, 0x64, 0x51, 0x32, 0x4d, 0x43, 0x46, 0x75, \n\t0x42, 0x65, 0x47, 0x73, 0x6f, 0x62, 0x47, 0x32, 0x72, 0x33, 0x52, 0x6e, 0x31, 0x73, 0x68, 0x61, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x35, 0x35, 0x70, 0x73, 0x54, 0x69, 0x62, 0x70, 0x6d, 0x70, 0x31, 0x4a, 0x47, 0x37, 0x6a, 0x7a, 0x65, \n\t0x68, 0x63, 0x41, 0x6f, 0x38, 0x74, 0x71, 0x6c, 0x38, 0x66, 0x4d, 0x76, 0x56, 0x6a, 0x4c, 0x36, 0x4f, 0x51, \n\t0x57, 0x4f, 0x79, 0x2b, 0x36, 0x67, 0x74, 0x46, 0x39, 0x6c, 0x78, 0x68, 0x39, 0x38, 0x43, 0x4b, 0x79, 0x70, \n\t0x78, 0x76, 0x51, 0x45, 0x5a, 0x51, 0x64, 0x47, 0x46, 0x77, 0x44, 0x37, 0x67, 0x52, 0x2b, 0x75, 0x77, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x71, 0x66, 0x79, 0x64, 0x4c, 0x33, 0x43, 0x6e, 0x42, 0x62, 0x59, 0x65, 0x36, 0x56, 0x2f, 0x55, \n\t0x51, 0x36, 0x6b, 0x30, 0x77, 0x6f, 0x4e, 0x44, 0x77, 0x6d, 0x51, 0x65, 0x4d, 0x62, 0x44, 0x37, 0x7a, 0x67, \n\t0x4a, 0x48, 0x53, 0x4c, 0x30, 0x4b, 0x39, 0x76, 0x41, 0x50, 0x58, 0x57, 0x44, 0x70, 0x6d, 0x58, 0x36, 0x4d, \n\t0x47, 0x52, 0x6b, 0x4b, 0x7a, 0x62, 0x4d, 0x52, 0x30, 0x31, 0x62, 0x41, 0x77, 0x45, 0x6d, 0x4f, 0x31, 0x5c, 0x0a,\n\t0x09, 0x51, 0x4c, 0x31, 0x32, 0x54, 0x58, 0x49, 0x77, 0x38, 0x6e, 0x6c, 0x54, 0x67, 0x76, 0x4d, 0x72, 0x2b, \n\t0x75, 0x74, 0x35, 0x54, 0x77, 0x66, 0x67, 0x74, 0x68, 0x76, 0x49, 0x31, 0x62, 0x65, 0x6a, 0x59, 0x4e, 0x52, \n\t0x54, 0x4a, 0x74, 0x30, 0x47, 0x4a, 0x4e, 0x76, 0x41, 0x46, 0x32, 0x59, 0x5a, 0x48, 0x57, 0x59, 0x59, 0x4c, \n\t0x57, 0x4b, 0x58, 0x52, 0x2b, 0x63, 0x59, 0x33, 0x48, 0x4b, 0x4d, 0x77, 0x63, 0x33, 0x48, 0x4b, 0x44, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x31, 0x78, 0x2b, 0x69, 0x54, 0x2b, 0x35, 0x51, 0x50, 0x48, 0x73, 0x79, 0x38, 0x31, 0x63, 0x64, \n\t0x79, 0x4a, 0x48, 0x34, 0x51, 0x38, 0x66, 0x68, 0x42, 0x48, 0x4c, 0x64, 0x31, 0x73, 0x37, 0x44, 0x37, 0x50, \n\t0x47, 0x6c, 0x38, 0x77, 0x41, 0x35, 0x79, 0x39, 0x56, 0x62, 0x56, 0x66, 0x51, 0x34, 0x55, 0x69, 0x34, 0x61, \n\t0x52, 0x58, 0x53, 0x52, 0x72, 0x64, 0x55, 0x77, 0x44, 0x49, 0x33, 0x57, 0x50, 0x34, 0x76, 0x39, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x79, 0x6a, 0x49, 0x43, 0x6d, 0x6e, 0x32, 0x4b, 0x6d, 0x75, 0x51, 0x56, 0x6a, 0x49, 0x52, 0x34, 0x44, \n\t0x5a, 0x75, 0x48, 0x55, 0x56, 0x6c, 0x57, 0x32, 0x2b, 0x2b, 0x43, 0x67, 0x70, 0x47, 0x72, 0x34, 0x68, 0x33, \n\t0x47, 0x71, 0x76, 0x47, 0x77, 0x69, 0x32, 0x35, 0x48, 0x61, 0x46, 0x62, 0x70, 0x68, 0x37, 0x32, 0x4d, 0x31, \n\t0x4a, 0x35, 0x4a, 0x46, 0x46, 0x53, 0x6a, 0x62, 0x33, 0x37, 0x7a, 0x66, 0x74, 0x33, 0x67, 0x61, 0x68, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x31, 0x65, 0x7a, 0x63, 0x6e, 0x2f, 0x36, 0x34, 0x5a, 0x51, 0x56, 0x2b, 0x6f, 0x6b, 0x4e, 0x41, \n\t0x67, 0x78, 0x38, 0x45, 0x6f, 0x4a, 0x46, 0x38, 0x6a, 0x47, 0x4c, 0x58, 0x65, 0x30, 0x32, 0x51, 0x77, 0x61, \n\t0x69, 0x33, 0x58, 0x49, 0x6d, 0x42, 0x45, 0x6c, 0x57, 0x64, 0x78, 0x34, 0x79, 0x37, 0x46, 0x6a, 0x62, 0x74, \n\t0x56, 0x63, 0x63, 0x34, 0x4e, 0x4b, 0x52, 0x38, 0x62, 0x49, 0x75, 0x64, 0x48, 0x79, 0x49, 0x55, 0x53, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x70, 0x62, 0x49, 0x67, 0x63, 0x43, 0x42, 0x2f, 0x7a, 0x73, 0x58, 0x34, 0x36, 0x6b, 0x4c, 0x4a, \n\t0x47, 0x6e, 0x38, 0x74, 0x43, 0x70, 0x32, 0x37, 0x68, 0x53, 0x32, 0x37, 0x7a, 0x44, 0x5a, 0x4a, 0x65, 0x39, \n\t0x41, 0x41, 0x34, 0x5a, 0x32, 0x47, 0x4e, 0x6e, 0x72, 0x6c, 0x67, 0x45, 0x6a, 0x76, 0x58, 0x42, 0x32, 0x46, \n\t0x68, 0x67, 0x46, 0x49, 0x47, 0x67, 0x59, 0x74, 0x56, 0x76, 0x51, 0x37, 0x54, 0x42, 0x79, 0x66, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x47, 0x73, 0x37, 0x73, 0x4c, 0x56, 0x46, 0x31, 0x48, 0x76, 0x34, 0x4f, 0x69, 0x32, 0x69, 0x46, 0x66, \n\t0x73, 0x42, 0x39, 0x31, 0x2b, 0x68, 0x58, 0x33, 0x4f, 0x67, 0x61, 0x31, 0x68, 0x35, 0x49, 0x61, 0x71, 0x62, \n\t0x41, 0x5a, 0x47, 0x50, 0x57, 0x55, 0x36, 0x45, 0x41, 0x57, 0x6c, 0x52, 0x53, 0x42, 0x65, 0x48, 0x78, 0x69, \n\t0x70, 0x42, 0x37, 0x74, 0x73, 0x47, 0x4c, 0x58, 0x65, 0x51, 0x78, 0x73, 0x6f, 0x66, 0x4b, 0x41, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x46, 0x61, 0x36, 0x35, 0x61, 0x77, 0x44, 0x64, 0x32, 0x61, 0x4c, 0x77, 0x52, 0x58, 0x78, 0x54, \n\t0x6d, 0x58, 0x52, 0x39, 0x69, 0x45, 0x6a, 0x51, 0x55, 0x71, 0x70, 0x4c, 0x4b, 0x66, 0x36, 0x52, 0x37, 0x57, \n\t0x4b, 0x50, 0x37, 0x6a, 0x33, 0x67, 0x4f, 0x47, 0x48, 0x39, 0x2b, 0x63, 0x45, 0x71, 0x2b, 0x6d, 0x6c, 0x4f, \n\t0x41, 0x4f, 0x37, 0x7a, 0x34, 0x48, 0x69, 0x47, 0x6e, 0x39, 0x69, 0x4c, 0x43, 0x6a, 0x47, 0x77, 0x53, 0x5c, 0x0a,\n\t0x09, 0x67, 0x38, 0x70, 0x77, 0x58, 0x42, 0x53, 0x4a, 0x64, 0x68, 0x49, 0x5a, 0x61, 0x52, 0x68, 0x56, 0x47, \n\t0x52, 0x52, 0x44, 0x64, 0x68, 0x33, 0x2f, 0x59, 0x4b, 0x53, 0x46, 0x66, 0x33, 0x6c, 0x31, 0x41, 0x36, 0x74, \n\t0x5a, 0x4c, 0x65, 0x2b, 0x34, 0x61, 0x4b, 0x41, 0x42, 0x78, 0x48, 0x2f, 0x57, 0x48, 0x48, 0x61, 0x4d, 0x56, \n\t0x2b, 0x75, 0x42, 0x33, 0x72, 0x77, 0x41, 0x35, 0x57, 0x55, 0x74, 0x67, 0x7a, 0x53, 0x64, 0x56, 0x44, 0x5c, 0x0a,\n\t0x09, 0x58, 0x62, 0x61, 0x2b, 0x76, 0x2f, 0x36, 0x4e, 0x54, 0x44, 0x4a, 0x71, 0x5a, 0x73, 0x36, 0x5a, 0x68, \n\t0x72, 0x72, 0x4f, 0x4d, 0x4a, 0x70, 0x6f, 0x2b, 0x78, 0x43, 0x57, 0x41, 0x43, 0x4e, 0x37, 0x4c, 0x2b, 0x4e, \n\t0x67, 0x6c, 0x4c, 0x76, 0x50, 0x62, 0x68, 0x33, 0x52, 0x63, 0x78, 0x67, 0x34, 0x33, 0x4d, 0x44, 0x42, 0x64, \n\t0x68, 0x4d, 0x66, 0x59, 0x4c, 0x52, 0x7a, 0x78, 0x79, 0x35, 0x62, 0x6e, 0x37, 0x58, 0x4e, 0x77, 0x58, 0x5c, 0x0a,\n\t0x09, 0x76, 0x33, 0x47, 0x48, 0x31, 0x36, 0x2b, 0x59, 0x35, 0x77, 0x64, 0x78, 0x79, 0x32, 0x37, 0x33, 0x42, \n\t0x73, 0x50, 0x78, 0x6e, 0x31, 0x6d, 0x6f, 0x52, 0x37, 0x58, 0x32, 0x4d, 0x59, 0x31, 0x65, 0x2b, 0x43, 0x68, \n\t0x5a, 0x46, 0x36, 0x64, 0x30, 0x49, 0x5a, 0x35, 0x77, 0x4b, 0x6a, 0x30, 0x42, 0x57, 0x4b, 0x6f, 0x33, 0x55, \n\t0x5a, 0x4b, 0x34, 0x36, 0x45, 0x73, 0x6f, 0x59, 0x76, 0x67, 0x7a, 0x69, 0x53, 0x58, 0x52, 0x37, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x71, 0x69, 0x59, 0x38, 0x52, 0x68, 0x75, 0x72, 0x47, 0x51, 0x64, 0x32, 0x76, 0x53, 0x68, 0x58, 0x56, \n\t0x59, 0x45, 0x49, 0x46, 0x4e, 0x35, 0x4b, 0x6b, 0x73, 0x4a, 0x73, 0x59, 0x52, 0x76, 0x6d, 0x4b, 0x78, 0x58, \n\t0x71, 0x47, 0x62, 0x61, 0x30, 0x7a, 0x34, 0x78, 0x4d, 0x4d, 0x6d, 0x71, 0x32, 0x6a, 0x36, 0x4f, 0x5a, 0x58, \n\t0x5a, 0x65, 0x73, 0x76, 0x44, 0x39, 0x71, 0x4d, 0x4c, 0x4a, 0x35, 0x72, 0x53, 0x47, 0x4d, 0x6b, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x32, 0x77, 0x4d, 0x6a, 0x6f, 0x71, 0x49, 0x70, 0x64, 0x68, 0x59, 0x74, 0x54, 0x42, 0x62, 0x73, \n\t0x76, 0x4f, 0x45, 0x37, 0x35, 0x38, 0x49, 0x69, 0x44, 0x44, 0x2b, 0x30, 0x7a, 0x75, 0x6e, 0x2f, 0x59, 0x39, \n\t0x2f, 0x32, 0x5a, 0x57, 0x6f, 0x71, 0x72, 0x48, 0x64, 0x75, 0x33, 0x4f, 0x37, 0x59, 0x2b, 0x79, 0x7a, 0x56, \n\t0x64, 0x68, 0x31, 0x44, 0x47, 0x65, 0x63, 0x45, 0x6f, 0x35, 0x4a, 0x66, 0x41, 0x79, 0x4d, 0x68, 0x68, 0x5c, 0x0a,\n\t0x09, 0x67, 0x56, 0x48, 0x79, 0x4e, 0x56, 0x6d, 0x6c, 0x71, 0x6f, 0x5a, 0x52, 0x2b, 0x44, 0x4b, 0x49, 0x42, \n\t0x34, 0x34, 0x6f, 0x69, 0x4a, 0x55, 0x6c, 0x46, 0x47, 0x72, 0x49, 0x76, 0x63, 0x52, 0x73, 0x72, 0x4b, 0x5a, \n\t0x76, 0x31, 0x52, 0x46, 0x2f, 0x6c, 0x73, 0x68, 0x62, 0x51, 0x75, 0x58, 0x49, 0x35, 0x34, 0x47, 0x2f, 0x33, \n\t0x75, 0x75, 0x70, 0x37, 0x31, 0x38, 0x44, 0x55, 0x78, 0x37, 0x74, 0x65, 0x36, 0x65, 0x54, 0x64, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x30, 0x75, 0x49, 0x75, 0x7a, 0x6f, 0x79, 0x6e, 0x53, 0x75, 0x61, 0x6e, 0x78, 0x56, 0x67, 0x2b, 0x2b, \n\t0x41, 0x55, 0x58, 0x4d, 0x46, 0x68, 0x77, 0x64, 0x47, 0x6a, 0x72, 0x6f, 0x2f, 0x58, 0x65, 0x65, 0x31, 0x51, \n\t0x68, 0x68, 0x6c, 0x37, 0x7a, 0x4e, 0x54, 0x64, 0x31, 0x50, 0x43, 0x43, 0x49, 0x48, 0x69, 0x36, 0x67, 0x47, \n\t0x37, 0x7a, 0x7a, 0x32, 0x4f, 0x37, 0x4a, 0x57, 0x4d, 0x50, 0x6a, 0x56, 0x6b, 0x64, 0x50, 0x2b, 0x49, 0x5c, 0x0a,\n\t0x09, 0x38, 0x71, 0x45, 0x52, 0x4d, 0x70, 0x79, 0x64, 0x53, 0x6d, 0x34, 0x62, 0x69, 0x6d, 0x73, 0x63, 0x67, \n\t0x79, 0x63, 0x34, 0x74, 0x6d, 0x34, 0x71, 0x71, 0x72, 0x56, 0x65, 0x64, 0x62, 0x6b, 0x7a, 0x38, 0x4a, 0x67, \n\t0x49, 0x52, 0x76, 0x61, 0x65, 0x4c, 0x43, 0x67, 0x73, 0x6a, 0x48, 0x71, 0x38, 0x56, 0x2b, 0x73, 0x49, 0x49, \n\t0x77, 0x66, 0x4a, 0x5a, 0x34, 0x70, 0x61, 0x59, 0x53, 0x53, 0x30, 0x37, 0x6e, 0x38, 0x64, 0x74, 0x70, 0x5c, 0x0a,\n\t0x09, 0x79, 0x74, 0x59, 0x55, 0x52, 0x7a, 0x4c, 0x77, 0x6a, 0x31, 0x4a, 0x45, 0x56, 0x42, 0x77, 0x55, 0x68, \n\t0x39, 0x56, 0x6a, 0x70, 0x69, 0x6a, 0x61, 0x4d, 0x61, 0x32, 0x68, 0x2b, 0x70, 0x73, 0x4a, 0x37, 0x59, 0x32, \n\t0x4f, 0x38, 0x75, 0x4a, 0x2f, 0x63, 0x52, 0x6d, 0x56, 0x2f, 0x68, 0x4c, 0x68, 0x6a, 0x56, 0x44, 0x79, 0x55, \n\t0x71, 0x30, 0x43, 0x47, 0x48, 0x6b, 0x63, 0x30, 0x33, 0x41, 0x34, 0x64, 0x31, 0x33, 0x65, 0x55, 0x78, 0x5c, 0x0a,\n\t0x09, 0x70, 0x38, 0x50, 0x43, 0x43, 0x41, 0x64, 0x75, 0x74, 0x32, 0x44, 0x72, 0x31, 0x6d, 0x32, 0x32, 0x62, \n\t0x74, 0x30, 0x47, 0x67, 0x66, 0x4b, 0x78, 0x73, 0x42, 0x6c, 0x2f, 0x57, 0x58, 0x30, 0x42, 0x5a, 0x45, 0x2b, \n\t0x51, 0x66, 0x55, 0x6c, 0x6d, 0x65, 0x37, 0x73, 0x42, 0x73, 0x46, 0x31, 0x39, 0x39, 0x39, 0x37, 0x74, 0x4f, \n\t0x74, 0x78, 0x4a, 0x52, 0x33, 0x48, 0x61, 0x34, 0x55, 0x36, 0x37, 0x61, 0x6d, 0x4b, 0x68, 0x4c, 0x32, 0x5c, 0x0a,\n\t0x09, 0x50, 0x39, 0x4e, 0x64, 0x6d, 0x6f, 0x33, 0x4c, 0x50, 0x41, 0x4b, 0x47, 0x37, 0x30, 0x30, 0x38, 0x4d, \n\t0x49, 0x55, 0x34, 0x39, 0x54, 0x77, 0x69, 0x68, 0x4b, 0x33, 0x35, 0x52, 0x72, 0x63, 0x54, 0x41, 0x53, 0x37, \n\t0x46, 0x79, 0x6a, 0x47, 0x45, 0x5a, 0x71, 0x35, 0x30, 0x55, 0x63, 0x7a, 0x51, 0x52, 0x48, 0x62, 0x64, 0x6e, \n\t0x34, 0x67, 0x7a, 0x71, 0x4f, 0x4a, 0x6d, 0x32, 0x41, 0x6b, 0x65, 0x36, 0x4f, 0x52, 0x5a, 0x4d, 0x61, 0x5c, 0x0a,\n\t0x09, 0x53, 0x36, 0x72, 0x4e, 0x2b, 0x6f, 0x50, 0x79, 0x47, 0x6b, 0x59, 0x58, 0x2b, 0x74, 0x37, 0x68, 0x4a, \n\t0x43, 0x42, 0x71, 0x61, 0x74, 0x68, 0x41, 0x70, 0x51, 0x31, 0x47, 0x67, 0x75, 0x43, 0x79, 0x4d, 0x49, 0x71, \n\t0x76, 0x72, 0x77, 0x34, 0x37, 0x59, 0x4c, 0x52, 0x4f, 0x57, 0x38, 0x34, 0x6d, 0x4c, 0x79, 0x4d, 0x68, 0x59, \n\t0x2f, 0x52, 0x49, 0x34, 0x75, 0x70, 0x68, 0x52, 0x42, 0x53, 0x65, 0x35, 0x73, 0x73, 0x67, 0x31, 0x61, 0x5c, 0x0a,\n\t0x09, 0x38, 0x6a, 0x46, 0x46, 0x63, 0x55, 0x63, 0x45, 0x58, 0x42, 0x41, 0x46, 0x74, 0x76, 0x70, 0x6c, 0x45, \n\t0x6c, 0x7a, 0x30, 0x4f, 0x46, 0x56, 0x52, 0x31, 0x47, 0x6e, 0x37, 0x5a, 0x65, 0x4b, 0x78, 0x6a, 0x6c, 0x36, \n\t0x6e, 0x45, 0x4b, 0x47, 0x48, 0x55, 0x74, 0x42, 0x5a, 0x6c, 0x35, 0x61, 0x4e, 0x39, 0x6c, 0x59, 0x4f, 0x54, \n\t0x49, 0x7a, 0x54, 0x56, 0x71, 0x59, 0x43, 0x54, 0x71, 0x76, 0x6b, 0x4e, 0x35, 0x66, 0x52, 0x63, 0x74, 0x5c, 0x0a,\n\t0x09, 0x66, 0x4c, 0x6b, 0x6a, 0x67, 0x70, 0x46, 0x51, 0x37, 0x33, 0x4e, 0x64, 0x4c, 0x39, 0x76, 0x77, 0x6b, \n\t0x78, 0x62, 0x31, 0x35, 0x34, 0x31, 0x71, 0x47, 0x44, 0x6d, 0x61, 0x31, 0x66, 0x2b, 0x46, 0x4c, 0x75, 0x64, \n\t0x6a, 0x66, 0x55, 0x66, 0x4f, 0x69, 0x76, 0x46, 0x4a, 0x36, 0x69, 0x70, 0x34, 0x4a, 0x44, 0x70, 0x5a, 0x78, \n\t0x68, 0x58, 0x74, 0x39, 0x41, 0x51, 0x6d, 0x33, 0x53, 0x42, 0x44, 0x6f, 0x5a, 0x71, 0x6b, 0x78, 0x45, 0x5c, 0x0a,\n\t0x09, 0x38, 0x68, 0x4d, 0x71, 0x2b, 0x79, 0x48, 0x47, 0x6b, 0x61, 0x6f, 0x7a, 0x32, 0x66, 0x70, 0x56, 0x62, \n\t0x6d, 0x48, 0x42, 0x46, 0x48, 0x4c, 0x6f, 0x38, 0x74, 0x5a, 0x39, 0x4e, 0x37, 0x6c, 0x41, 0x34, 0x64, 0x4d, \n\t0x70, 0x57, 0x4f, 0x49, 0x67, 0x35, 0x33, 0x33, 0x6b, 0x4e, 0x63, 0x68, 0x31, 0x46, 0x5a, 0x62, 0x4a, 0x36, \n\t0x4a, 0x54, 0x70, 0x75, 0x50, 0x31, 0x6c, 0x6e, 0x45, 0x61, 0x5a, 0x4e, 0x37, 0x43, 0x67, 0x33, 0x44, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x4b, 0x6e, 0x4f, 0x5a, 0x39, 0x77, 0x39, 0x57, 0x68, 0x32, 0x35, 0x61, 0x36, 0x79, 0x4f, 0x77, \n\t0x70, 0x54, 0x54, 0x76, 0x44, 0x38, 0x54, 0x72, 0x39, 0x69, 0x50, 0x43, 0x6b, 0x50, 0x64, 0x68, 0x61, 0x70, \n\t0x33, 0x62, 0x39, 0x53, 0x77, 0x4b, 0x61, 0x4e, 0x77, 0x4e, 0x66, 0x64, 0x77, 0x70, 0x4b, 0x34, 0x4e, 0x38, \n\t0x52, 0x34, 0x34, 0x39, 0x58, 0x61, 0x76, 0x6b, 0x6d, 0x34, 0x66, 0x45, 0x75, 0x31, 0x6c, 0x42, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x45, 0x69, 0x32, 0x58, 0x72, 0x4c, 0x45, 0x62, 0x55, 0x71, 0x48, 0x34, 0x68, 0x2b, 0x53, 0x45, 0x54, \n\t0x4f, 0x39, 0x72, 0x32, 0x72, 0x58, 0x69, 0x44, 0x79, 0x74, 0x2f, 0x42, 0x49, 0x65, 0x6a, 0x4a, 0x2b, 0x6d, \n\t0x4b, 0x75, 0x42, 0x55, 0x61, 0x36, 0x30, 0x59, 0x33, 0x35, 0x75, 0x5a, 0x6f, 0x57, 0x52, 0x4c, 0x55, 0x76, \n\t0x55, 0x47, 0x41, 0x38, 0x76, 0x6a, 0x4b, 0x4c, 0x77, 0x30, 0x6d, 0x42, 0x6b, 0x39, 0x66, 0x6b, 0x38, 0x5c, 0x0a,\n\t0x09, 0x45, 0x35, 0x33, 0x54, 0x77, 0x53, 0x6a, 0x4b, 0x62, 0x78, 0x59, 0x59, 0x4a, 0x57, 0x4c, 0x4c, 0x76, \n\t0x57, 0x77, 0x59, 0x42, 0x65, 0x73, 0x75, 0x77, 0x43, 0x67, 0x6f, 0x46, 0x2f, 0x38, 0x4f, 0x39, 0x6f, 0x56, \n\t0x52, 0x53, 0x62, 0x71, 0x78, 0x47, 0x6a, 0x51, 0x77, 0x38, 0x75, 0x6e, 0x30, 0x39, 0x69, 0x42, 0x36, 0x78, \n\t0x54, 0x35, 0x53, 0x77, 0x55, 0x69, 0x47, 0x36, 0x6e, 0x35, 0x72, 0x47, 0x4b, 0x58, 0x4d, 0x61, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x48, 0x65, 0x49, 0x41, 0x49, 0x65, 0x53, 0x65, 0x72, 0x4e, 0x73, 0x51, 0x59, 0x77, 0x61, 0x6e, 0x74, \n\t0x70, 0x78, 0x6b, 0x42, 0x72, 0x49, 0x54, 0x41, 0x4b, 0x63, 0x51, 0x75, 0x43, 0x6b, 0x51, 0x37, 0x50, 0x41, \n\t0x4b, 0x4e, 0x55, 0x71, 0x6a, 0x7a, 0x45, 0x35, 0x6e, 0x6b, 0x45, 0x59, 0x4e, 0x54, 0x63, 0x30, 0x34, 0x77, \n\t0x77, 0x53, 0x71, 0x77, 0x69, 0x6e, 0x55, 0x65, 0x62, 0x6a, 0x6d, 0x58, 0x44, 0x53, 0x46, 0x74, 0x47, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x62, 0x44, 0x65, 0x79, 0x79, 0x6a, 0x5a, 0x6a, 0x4e, 0x39, 0x59, 0x52, 0x67, 0x46, 0x41, 0x39, \n\t0x63, 0x5a, 0x71, 0x70, 0x63, 0x70, 0x58, 0x37, 0x33, 0x55, 0x64, 0x74, 0x67, 0x49, 0x4a, 0x33, 0x7a, 0x53, \n\t0x4c, 0x59, 0x48, 0x53, 0x32, 0x37, 0x77, 0x31, 0x4f, 0x41, 0x69, 0x4a, 0x6a, 0x5a, 0x67, 0x6c, 0x56, 0x6e, \n\t0x31, 0x51, 0x72, 0x37, 0x77, 0x4f, 0x6a, 0x4b, 0x43, 0x6e, 0x78, 0x67, 0x39, 0x6e, 0x41, 0x4b, 0x42, 0x5c, 0x0a,\n\t0x09, 0x74, 0x75, 0x41, 0x38, 0x4f, 0x55, 0x4d, 0x45, 0x71, 0x74, 0x6f, 0x69, 0x61, 0x50, 0x56, 0x63, 0x41, \n\t0x6f, 0x72, 0x79, 0x38, 0x6e, 0x59, 0x32, 0x43, 0x55, 0x76, 0x45, 0x75, 0x58, 0x47, 0x34, 0x79, 0x43, 0x34, \n\t0x68, 0x52, 0x47, 0x64, 0x52, 0x33, 0x49, 0x30, 0x4b, 0x52, 0x52, 0x31, 0x6f, 0x37, 0x2b, 0x4b, 0x6f, 0x66, \n\t0x51, 0x77, 0x49, 0x68, 0x68, 0x33, 0x42, 0x32, 0x72, 0x7a, 0x36, 0x73, 0x39, 0x74, 0x38, 0x74, 0x39, 0x5c, 0x0a,\n\t0x09, 0x56, 0x61, 0x77, 0x61, 0x52, 0x67, 0x73, 0x42, 0x30, 0x53, 0x50, 0x68, 0x4e, 0x69, 0x74, 0x6c, 0x66, \n\t0x68, 0x69, 0x77, 0x42, 0x55, 0x62, 0x6f, 0x78, 0x42, 0x47, 0x4d, 0x4e, 0x4b, 0x52, 0x49, 0x72, 0x2b, 0x6b, \n\t0x4c, 0x6f, 0x30, 0x54, 0x57, 0x42, 0x45, 0x5a, 0x61, 0x70, 0x33, 0x48, 0x55, 0x54, 0x51, 0x53, 0x6a, 0x76, \n\t0x70, 0x62, 0x51, 0x45, 0x59, 0x43, 0x52, 0x32, 0x48, 0x66, 0x48, 0x4e, 0x75, 0x71, 0x32, 0x50, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x79, 0x4f, 0x42, 0x48, 0x44, 0x4c, 0x67, 0x6c, 0x47, 0x49, 0x61, 0x39, 0x4f, 0x78, 0x52, 0x42, 0x6a, \n\t0x6c, 0x4c, 0x4b, 0x45, 0x45, 0x52, 0x76, 0x62, 0x4c, 0x49, 0x4d, 0x48, 0x36, 0x43, 0x54, 0x44, 0x53, 0x34, \n\t0x58, 0x42, 0x39, 0x5a, 0x6d, 0x4d, 0x31, 0x75, 0x31, 0x47, 0x61, 0x66, 0x73, 0x47, 0x72, 0x2b, 0x33, 0x32, \n\t0x67, 0x37, 0x33, 0x31, 0x4e, 0x44, 0x43, 0x4a, 0x2f, 0x36, 0x2b, 0x6c, 0x4c, 0x62, 0x6d, 0x44, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x37, 0x4b, 0x36, 0x48, 0x38, 0x34, 0x5a, 0x52, 0x44, 0x6a, 0x44, 0x4c, 0x68, 0x4a, 0x46, 0x2b, 0x6d, \n\t0x54, 0x53, 0x4d, 0x6b, 0x68, 0x63, 0x38, 0x76, 0x74, 0x48, 0x65, 0x4d, 0x4a, 0x4a, 0x4d, 0x2f, 0x46, 0x4a, \n\t0x67, 0x5a, 0x49, 0x71, 0x39, 0x6a, 0x6a, 0x42, 0x4b, 0x56, 0x6e, 0x75, 0x76, 0x47, 0x6b, 0x61, 0x5a, 0x48, \n\t0x39, 0x2b, 0x46, 0x37, 0x2f, 0x4b, 0x6f, 0x52, 0x63, 0x47, 0x6f, 0x74, 0x6c, 0x6a, 0x36, 0x77, 0x41, 0x5c, 0x0a,\n\t0x09, 0x68, 0x61, 0x59, 0x53, 0x54, 0x71, 0x76, 0x49, 0x56, 0x52, 0x37, 0x63, 0x51, 0x4f, 0x2b, 0x5a, 0x52, \n\t0x51, 0x68, 0x76, 0x56, 0x6d, 0x45, 0x59, 0x7a, 0x75, 0x37, 0x33, 0x73, 0x48, 0x2f, 0x65, 0x36, 0x2b, 0x79, \n\t0x76, 0x74, 0x73, 0x66, 0x45, 0x71, 0x6f, 0x41, 0x4b, 0x53, 0x68, 0x77, 0x57, 0x51, 0x77, 0x30, 0x74, 0x66, \n\t0x46, 0x42, 0x36, 0x53, 0x4e, 0x4e, 0x46, 0x65, 0x77, 0x2b, 0x63, 0x4b, 0x6f, 0x58, 0x55, 0x2b, 0x49, 0x5c, 0x0a,\n\t0x09, 0x79, 0x34, 0x48, 0x69, 0x71, 0x4d, 0x48, 0x49, 0x71, 0x62, 0x68, 0x70, 0x64, 0x58, 0x53, 0x41, 0x77, \n\t0x6c, 0x34, 0x2f, 0x4e, 0x59, 0x77, 0x6d, 0x74, 0x59, 0x78, 0x38, 0x31, 0x44, 0x72, 0x44, 0x71, 0x4d, 0x76, \n\t0x61, 0x47, 0x69, 0x73, 0x61, 0x52, 0x6d, 0x52, 0x67, 0x31, 0x49, 0x79, 0x6d, 0x4e, 0x56, 0x76, 0x4f, 0x74, \n\t0x73, 0x46, 0x49, 0x64, 0x62, 0x74, 0x79, 0x4d, 0x4e, 0x4c, 0x62, 0x30, 0x64, 0x61, 0x57, 0x6d, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x35, 0x48, 0x56, 0x4e, 0x2f, 0x77, 0x78, 0x2f, 0x4e, 0x74, 0x4e, 0x4a, 0x58, 0x2b, 0x64, 0x79, 0x35, \n\t0x38, 0x4b, 0x6a, 0x32, 0x6c, 0x59, 0x65, 0x51, 0x56, 0x54, 0x67, 0x49, 0x6a, 0x2f, 0x56, 0x43, 0x36, 0x59, \n\t0x4a, 0x51, 0x62, 0x4c, 0x55, 0x73, 0x76, 0x6a, 0x4d, 0x2f, 0x31, 0x4e, 0x58, 0x56, 0x31, 0x6f, 0x30, 0x77, \n\t0x61, 0x51, 0x43, 0x37, 0x39, 0x49, 0x6d, 0x44, 0x55, 0x52, 0x30, 0x63, 0x75, 0x6e, 0x64, 0x56, 0x68, 0x5c, 0x0a,\n\t0x09, 0x77, 0x71, 0x6a, 0x77, 0x73, 0x6d, 0x46, 0x6b, 0x37, 0x32, 0x2f, 0x75, 0x4d, 0x48, 0x49, 0x54, 0x77, \n\t0x71, 0x69, 0x35, 0x66, 0x69, 0x59, 0x59, 0x52, 0x66, 0x72, 0x36, 0x77, 0x4d, 0x69, 0x47, 0x78, 0x38, 0x47, \n\t0x49, 0x47, 0x55, 0x54, 0x38, 0x39, 0x57, 0x47, 0x57, 0x73, 0x34, 0x59, 0x52, 0x36, 0x47, 0x2b, 0x6f, 0x53, \n\t0x65, 0x6a, 0x57, 0x52, 0x44, 0x41, 0x79, 0x44, 0x75, 0x77, 0x45, 0x52, 0x67, 0x6f, 0x38, 0x4f, 0x69, 0x5c, 0x0a,\n\t0x09, 0x30, 0x43, 0x73, 0x6d, 0x2b, 0x65, 0x76, 0x77, 0x42, 0x38, 0x63, 0x71, 0x37, 0x7a, 0x69, 0x43, 0x70, \n\t0x78, 0x48, 0x30, 0x38, 0x72, 0x74, 0x2f, 0x53, 0x6e, 0x4a, 0x6f, 0x52, 0x52, 0x6b, 0x2b, 0x64, 0x6b, 0x4d, \n\t0x47, 0x71, 0x39, 0x70, 0x37, 0x34, 0x77, 0x47, 0x74, 0x4f, 0x67, 0x33, 0x61, 0x70, 0x67, 0x6c, 0x4c, 0x50, \n\t0x57, 0x75, 0x6d, 0x43, 0x55, 0x65, 0x33, 0x47, 0x6e, 0x67, 0x4a, 0x46, 0x57, 0x31, 0x77, 0x74, 0x47, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x54, 0x71, 0x7a, 0x4f, 0x6a, 0x4a, 0x2b, 0x6a, 0x37, 0x57, 0x45, 0x55, 0x54, 0x69, 0x52, 0x4b, \n\t0x56, 0x4d, 0x75, 0x33, 0x44, 0x6c, 0x61, 0x5a, 0x39, 0x4a, 0x4c, 0x72, 0x4c, 0x4d, 0x66, 0x6a, 0x47, 0x62, \n\t0x78, 0x46, 0x32, 0x6b, 0x39, 0x4c, 0x56, 0x38, 0x46, 0x55, 0x64, 0x5a, 0x52, 0x43, 0x69, 0x4e, 0x6a, 0x50, \n\t0x55, 0x55, 0x77, 0x43, 0x67, 0x37, 0x73, 0x45, 0x47, 0x63, 0x74, 0x6f, 0x31, 0x47, 0x54, 0x70, 0x69, 0x5c, 0x0a,\n\t0x09, 0x36, 0x48, 0x4a, 0x4d, 0x5a, 0x4c, 0x6d, 0x2f, 0x51, 0x45, 0x6b, 0x51, 0x4f, 0x34, 0x4c, 0x2f, 0x33, \n\t0x56, 0x45, 0x33, 0x42, 0x68, 0x6f, 0x34, 0x30, 0x4a, 0x59, 0x4f, 0x54, 0x69, 0x68, 0x37, 0x42, 0x51, 0x47, \n\t0x50, 0x55, 0x36, 0x78, 0x33, 0x72, 0x43, 0x4b, 0x43, 0x6e, 0x66, 0x4f, 0x42, 0x6a, 0x5a, 0x38, 0x44, 0x69, \n\t0x72, 0x5a, 0x56, 0x49, 0x59, 0x64, 0x51, 0x41, 0x77, 0x71, 0x32, 0x4e, 0x46, 0x4d, 0x45, 0x72, 0x30, 0x5c, 0x0a,\n\t0x09, 0x64, 0x63, 0x45, 0x6f, 0x42, 0x77, 0x71, 0x62, 0x35, 0x79, 0x4a, 0x67, 0x5a, 0x50, 0x4f, 0x5a, 0x4d, \n\t0x34, 0x7a, 0x77, 0x33, 0x61, 0x77, 0x49, 0x52, 0x75, 0x46, 0x38, 0x63, 0x32, 0x34, 0x73, 0x6a, 0x4d, 0x4b, \n\t0x6f, 0x57, 0x64, 0x31, 0x74, 0x67, 0x33, 0x71, 0x48, 0x78, 0x75, 0x6a, 0x6a, 0x69, 0x32, 0x47, 0x37, 0x32, \n\t0x42, 0x70, 0x47, 0x42, 0x38, 0x43, 0x6e, 0x2b, 0x35, 0x5a, 0x32, 0x6b, 0x6b, 0x37, 0x70, 0x4a, 0x36, 0x5c, 0x0a,\n\t0x09, 0x73, 0x2f, 0x36, 0x6b, 0x57, 0x72, 0x74, 0x34, 0x77, 0x4d, 0x70, 0x36, 0x61, 0x46, 0x45, 0x59, 0x75, \n\t0x44, 0x55, 0x63, 0x66, 0x6f, 0x55, 0x4a, 0x71, 0x32, 0x69, 0x56, 0x34, 0x4c, 0x47, 0x43, 0x55, 0x76, 0x76, \n\t0x45, 0x33, 0x54, 0x59, 0x54, 0x55, 0x74, 0x46, 0x55, 0x5a, 0x57, 0x78, 0x73, 0x41, 0x6f, 0x6c, 0x7a, 0x34, \n\t0x71, 0x7a, 0x34, 0x77, 0x77, 0x36, 0x68, 0x72, 0x6c, 0x4e, 0x4e, 0x65, 0x76, 0x44, 0x6b, 0x5a, 0x71, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x55, 0x52, 0x30, 0x7a, 0x5a, 0x78, 0x67, 0x70, 0x4a, 0x33, 0x58, 0x72, 0x5a, 0x5a, 0x52, 0x42, \n\t0x6b, 0x59, 0x36, 0x58, 0x66, 0x69, 0x38, 0x4e, 0x45, 0x4c, 0x7a, 0x61, 0x53, 0x45, 0x46, 0x6f, 0x39, 0x71, \n\t0x78, 0x62, 0x54, 0x2b, 0x4c, 0x58, 0x6f, 0x4c, 0x77, 0x55, 0x65, 0x2b, 0x4d, 0x36, 0x69, 0x57, 0x54, 0x67, \n\t0x4f, 0x68, 0x52, 0x34, 0x48, 0x78, 0x31, 0x36, 0x50, 0x78, 0x39, 0x68, 0x50, 0x55, 0x74, 0x2f, 0x73, 0x5c, 0x0a,\n\t0x09, 0x55, 0x4a, 0x63, 0x61, 0x30, 0x77, 0x6f, 0x67, 0x56, 0x47, 0x39, 0x73, 0x56, 0x44, 0x50, 0x63, 0x63, \n\t0x31, 0x68, 0x31, 0x46, 0x79, 0x37, 0x58, 0x51, 0x77, 0x61, 0x69, 0x33, 0x58, 0x6f, 0x59, 0x42, 0x52, 0x53, \n\t0x2f, 0x32, 0x32, 0x77, 0x57, 0x6a, 0x63, 0x38, 0x31, 0x67, 0x59, 0x6a, 0x4c, 0x54, 0x30, 0x67, 0x5a, 0x47, \n\t0x39, 0x62, 0x6c, 0x6b, 0x77, 0x55, 0x6d, 0x57, 0x63, 0x4f, 0x34, 0x79, 0x43, 0x38, 0x68, 0x59, 0x59, 0x5c, 0x0a,\n\t0x09, 0x52, 0x66, 0x4f, 0x45, 0x77, 0x67, 0x52, 0x48, 0x31, 0x66, 0x32, 0x4b, 0x76, 0x67, 0x6a, 0x72, 0x72, \n\t0x39, 0x64, 0x7a, 0x69, 0x4f, 0x72, 0x79, 0x6c, 0x78, 0x38, 0x47, 0x77, 0x58, 0x33, 0x2b, 0x77, 0x37, 0x32, \n\t0x4b, 0x32, 0x67, 0x74, 0x45, 0x4a, 0x37, 0x37, 0x2b, 0x44, 0x65, 0x48, 0x77, 0x34, 0x35, 0x46, 0x43, 0x76, \n\t0x37, 0x69, 0x31, 0x50, 0x34, 0x79, 0x71, 0x38, 0x47, 0x77, 0x77, 0x43, 0x71, 0x66, 0x57, 0x42, 0x45, 0x5c, 0x0a,\n\t0x09, 0x61, 0x74, 0x6f, 0x4a, 0x67, 0x4d, 0x52, 0x70, 0x4e, 0x4e, 0x65, 0x4c, 0x53, 0x46, 0x36, 0x41, 0x4f, \n\t0x6a, 0x7a, 0x44, 0x58, 0x4c, 0x67, 0x46, 0x45, 0x74, 0x36, 0x77, 0x41, 0x6a, 0x6d, 0x33, 0x34, 0x63, 0x6a, \n\t0x49, 0x4b, 0x2b, 0x42, 0x63, 0x46, 0x49, 0x6c, 0x32, 0x47, 0x5a, 0x4d, 0x47, 0x6f, 0x5a, 0x33, 0x6f, 0x39, \n\t0x68, 0x52, 0x48, 0x78, 0x64, 0x47, 0x59, 0x36, 0x56, 0x41, 0x37, 0x74, 0x32, 0x63, 0x42, 0x2b, 0x67, 0x5c, 0x0a,\n\t0x09, 0x65, 0x30, 0x65, 0x2b, 0x2f, 0x42, 0x2b, 0x65, 0x70, 0x4a, 0x69, 0x54, 0x6a, 0x4a, 0x6f, 0x42, 0x33, \n\t0x42, 0x65, 0x64, 0x4b, 0x30, 0x75, 0x76, 0x4d, 0x77, 0x63, 0x6a, 0x55, 0x68, 0x69, 0x70, 0x42, 0x6a, 0x6f, \n\t0x39, 0x6a, 0x48, 0x54, 0x63, 0x6b, 0x6d, 0x48, 0x55, 0x4a, 0x69, 0x75, 0x42, 0x55, 0x59, 0x63, 0x6c, 0x4e, \n\t0x52, 0x55, 0x6f, 0x30, 0x6a, 0x77, 0x6e, 0x67, 0x6c, 0x45, 0x75, 0x76, 0x31, 0x70, 0x33, 0x6b, 0x44, 0x5c, 0x0a,\n\t0x09, 0x34, 0x77, 0x73, 0x76, 0x46, 0x48, 0x47, 0x45, 0x62, 0x32, 0x48, 0x71, 0x4a, 0x37, 0x58, 0x43, 0x43, \n\t0x4d, 0x59, 0x44, 0x34, 0x77, 0x43, 0x6f, 0x74, 0x6b, 0x36, 0x2b, 0x55, 0x64, 0x45, 0x59, 0x77, 0x2b, 0x4d, \n\t0x6b, 0x6b, 0x52, 0x4a, 0x35, 0x75, 0x34, 0x49, 0x41, 0x5a, 0x45, 0x55, 0x6c, 0x4a, 0x76, 0x67, 0x4a, 0x54, \n\t0x41, 0x4b, 0x41, 0x44, 0x49, 0x56, 0x75, 0x6f, 0x68, 0x68, 0x6c, 0x48, 0x58, 0x79, 0x39, 0x42, 0x71, 0x5c, 0x0a,\n\t0x09, 0x74, 0x61, 0x77, 0x35, 0x6a, 0x4d, 0x62, 0x6b, 0x75, 0x64, 0x49, 0x56, 0x2b, 0x33, 0x58, 0x38, 0x43, \n\t0x6d, 0x45, 0x55, 0x36, 0x65, 0x73, 0x41, 0x35, 0x35, 0x47, 0x41, 0x6b, 0x52, 0x35, 0x4e, 0x43, 0x38, 0x41, \n\t0x68, 0x76, 0x71, 0x36, 0x47, 0x30, 0x62, 0x41, 0x4a, 0x31, 0x34, 0x35, 0x75, 0x4e, 0x49, 0x77, 0x2b, 0x30, \n\t0x74, 0x71, 0x75, 0x4d, 0x6a, 0x4c, 0x70, 0x44, 0x4b, 0x70, 0x37, 0x34, 0x70, 0x63, 0x6f, 0x65, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x6e, 0x41, 0x4b, 0x4d, 0x36, 0x48, 0x61, 0x51, 0x76, 0x6e, 0x70, 0x62, 0x44, 0x42, 0x4b, 0x4d, \n\t0x4d, 0x6e, 0x46, 0x59, 0x4a, 0x6f, 0x31, 0x78, 0x2b, 0x55, 0x56, 0x6e, 0x79, 0x65, 0x56, 0x37, 0x57, 0x4d, \n\t0x45, 0x71, 0x65, 0x55, 0x2b, 0x62, 0x39, 0x36, 0x36, 0x31, 0x6a, 0x58, 0x57, 0x43, 0x6b, 0x56, 0x75, 0x79, \n\t0x33, 0x7a, 0x44, 0x56, 0x71, 0x4c, 0x43, 0x4d, 0x4c, 0x49, 0x2b, 0x50, 0x41, 0x72, 0x67, 0x47, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x39, 0x5a, 0x51, 0x41, 0x48, 0x35, 0x79, 0x6b, 0x72, 0x4a, 0x4f, 0x43, 0x36, 0x49, 0x4f, 0x45, 0x4d, \n\t0x6d, 0x6d, 0x6c, 0x7a, 0x73, 0x30, 0x4f, 0x6f, 0x37, 0x6f, 0x64, 0x32, 0x68, 0x66, 0x4e, 0x52, 0x63, 0x45, \n\t0x34, 0x63, 0x46, 0x68, 0x67, 0x5a, 0x46, 0x37, 0x41, 0x56, 0x63, 0x47, 0x6f, 0x4e, 0x79, 0x6a, 0x53, 0x50, \n\t0x4e, 0x63, 0x44, 0x52, 0x72, 0x59, 0x73, 0x39, 0x70, 0x70, 0x5a, 0x59, 0x57, 0x54, 0x76, 0x36, 0x61, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x43, 0x43, 0x42, 0x6f, 0x59, 0x4e, 0x64, 0x32, 0x79, 0x32, 0x44, 0x6f, 0x53, 0x41, 0x79, 0x4d, \n\t0x54, 0x48, 0x36, 0x30, 0x37, 0x47, 0x39, 0x6e, 0x37, 0x48, 0x69, 0x4c, 0x38, 0x36, 0x53, 0x54, 0x46, 0x6d, \n\t0x74, 0x77, 0x69, 0x71, 0x6d, 0x38, 0x6f, 0x2f, 0x41, 0x31, 0x66, 0x68, 0x31, 0x77, 0x4d, 0x6a, 0x4b, 0x71, \n\t0x36, 0x6d, 0x41, 0x4f, 0x4d, 0x31, 0x6d, 0x6c, 0x6a, 0x74, 0x61, 0x67, 0x42, 0x74, 0x75, 0x6e, 0x64, 0x5c, 0x0a,\n\t0x09, 0x77, 0x4b, 0x6a, 0x4c, 0x6d, 0x6f, 0x74, 0x67, 0x5a, 0x50, 0x4e, 0x4d, 0x64, 0x50, 0x61, 0x46, 0x55, \n\t0x66, 0x79, 0x63, 0x70, 0x6f, 0x65, 0x52, 0x44, 0x55, 0x38, 0x4a, 0x6f, 0x35, 0x5a, 0x79, 0x7a, 0x52, 0x64, \n\t0x47, 0x58, 0x6e, 0x48, 0x4c, 0x58, 0x4b, 0x50, 0x59, 0x5a, 0x36, 0x52, 0x6d, 0x55, 0x67, 0x63, 0x59, 0x79, \n\t0x55, 0x46, 0x7a, 0x58, 0x56, 0x4f, 0x33, 0x48, 0x34, 0x54, 0x53, 0x6a, 0x75, 0x6c, 0x33, 0x79, 0x71, 0x5c, 0x0a,\n\t0x09, 0x51, 0x67, 0x2b, 0x6a, 0x4d, 0x71, 0x65, 0x36, 0x77, 0x70, 0x62, 0x36, 0x6d, 0x2b, 0x65, 0x7a, 0x30, \n\t0x70, 0x6a, 0x45, 0x53, 0x6c, 0x59, 0x78, 0x6f, 0x59, 0x51, 0x58, 0x4a, 0x79, 0x73, 0x38, 0x74, 0x6a, 0x50, \n\t0x76, 0x33, 0x55, 0x4d, 0x44, 0x4c, 0x42, 0x56, 0x63, 0x4c, 0x49, 0x31, 0x4f, 0x48, 0x36, 0x77, 0x69, 0x68, \n\t0x58, 0x6a, 0x78, 0x30, 0x77, 0x30, 0x6d, 0x58, 0x57, 0x4d, 0x45, 0x6f, 0x63, 0x35, 0x4d, 0x75, 0x43, 0x5c, 0x0a,\n\t0x09, 0x55, 0x5a, 0x74, 0x6c, 0x35, 0x49, 0x6a, 0x32, 0x4d, 0x55, 0x49, 0x38, 0x62, 0x30, 0x71, 0x62, 0x37, \n\t0x7a, 0x30, 0x49, 0x46, 0x4d, 0x2f, 0x70, 0x76, 0x53, 0x2f, 0x61, 0x78, 0x43, 0x41, 0x36, 0x41, 0x43, 0x4a, \n\t0x76, 0x75, 0x4a, 0x53, 0x6a, 0x47, 0x43, 0x36, 0x54, 0x77, 0x4d, 0x69, 0x52, 0x50, 0x4e, 0x79, 0x31, 0x33, \n\t0x2b, 0x56, 0x78, 0x58, 0x6a, 0x43, 0x79, 0x5a, 0x56, 0x6c, 0x62, 0x47, 0x4b, 0x58, 0x33, 0x75, 0x48, 0x5c, 0x0a,\n\t0x09, 0x36, 0x37, 0x50, 0x49, 0x61, 0x41, 0x79, 0x54, 0x50, 0x52, 0x75, 0x61, 0x59, 0x77, 0x53, 0x72, 0x70, \n\t0x6c, 0x4b, 0x72, 0x77, 0x53, 0x47, 0x49, 0x56, 0x43, 0x57, 0x42, 0x67, 0x46, 0x6f, 0x30, 0x4e, 0x6f, 0x35, \n\t0x68, 0x4f, 0x46, 0x30, 0x62, 0x55, 0x49, 0x52, 0x75, 0x2b, 0x64, 0x74, 0x43, 0x69, 0x39, 0x51, 0x58, 0x54, \n\t0x79, 0x56, 0x57, 0x38, 0x4d, 0x68, 0x2f, 0x64, 0x45, 0x45, 0x61, 0x58, 0x66, 0x49, 0x6e, 0x49, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x47, 0x4d, 0x55, 0x50, 0x63, 0x36, 0x31, 0x33, 0x65, 0x55, 0x77, 0x75, 0x57, 0x77, 0x53, 0x4d, 0x4f, \n\t0x4c, 0x51, 0x77, 0x57, 0x76, 0x62, 0x32, 0x49, 0x55, 0x31, 0x5a, 0x72, 0x44, 0x36, 0x66, 0x5a, 0x36, 0x4a, \n\t0x7a, 0x4f, 0x68, 0x68, 0x46, 0x2b, 0x63, 0x30, 0x43, 0x6f, 0x30, 0x54, 0x57, 0x46, 0x45, 0x61, 0x35, 0x34, \n\t0x58, 0x30, 0x52, 0x59, 0x68, 0x68, 0x4a, 0x63, 0x31, 0x30, 0x4d, 0x6f, 0x77, 0x2b, 0x4d, 0x62, 0x54, 0x5c, 0x0a,\n\t0x09, 0x74, 0x47, 0x4a, 0x72, 0x57, 0x49, 0x49, 0x44, 0x69, 0x73, 0x67, 0x35, 0x54, 0x44, 0x42, 0x6a, 0x68, \n\t0x4c, 0x67, 0x31, 0x47, 0x55, 0x6c, 0x50, 0x69, 0x6d, 0x6c, 0x77, 0x43, 0x6a, 0x6d, 0x42, 0x45, 0x4c, 0x67, \n\t0x46, 0x47, 0x49, 0x57, 0x78, 0x43, 0x4d, 0x64, 0x48, 0x67, 0x47, 0x47, 0x4b, 0x57, 0x79, 0x6a, 0x6a, 0x44, \n\t0x4b, 0x6c, 0x4c, 0x45, 0x4c, 0x52, 0x73, 0x6d, 0x37, 0x5a, 0x4f, 0x39, 0x70, 0x52, 0x68, 0x69, 0x74, 0x5c, 0x0a,\n\t0x09, 0x33, 0x53, 0x36, 0x50, 0x35, 0x47, 0x45, 0x45, 0x43, 0x59, 0x79, 0x71, 0x6f, 0x49, 0x57, 0x52, 0x74, \n\t0x6f, 0x54, 0x41, 0x77, 0x2b, 0x6a, 0x64, 0x6b, 0x78, 0x5a, 0x6f, 0x47, 0x68, 0x44, 0x46, 0x5a, 0x6c, 0x64, \n\t0x4e, 0x53, 0x6b, 0x68, 0x67, 0x42, 0x4e, 0x35, 0x61, 0x38, 0x6e, 0x45, 0x4b, 0x52, 0x68, 0x47, 0x77, 0x4a, \n\t0x6f, 0x61, 0x52, 0x50, 0x6f, 0x38, 0x39, 0x69, 0x49, 0x38, 0x50, 0x49, 0x34, 0x79, 0x30, 0x54, 0x72, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x63, 0x5a, 0x79, 0x49, 0x59, 0x39, 0x59, 0x58, 0x50, 0x6c, 0x44, 0x42, 0x61, 0x70, 0x31, 0x30, \n\t0x65, 0x6b, 0x33, 0x6a, 0x62, 0x71, 0x42, 0x4f, 0x64, 0x4c, 0x54, 0x42, 0x4b, 0x38, 0x6c, 0x77, 0x57, 0x6a, \n\t0x45, 0x4a, 0x63, 0x6d, 0x34, 0x35, 0x6c, 0x77, 0x69, 0x6a, 0x41, 0x68, 0x77, 0x79, 0x4d, 0x6a, 0x43, 0x57, \n\t0x45, 0x48, 0x62, 0x72, 0x6e, 0x45, 0x70, 0x52, 0x2f, 0x4d, 0x71, 0x6e, 0x36, 0x61, 0x55, 0x44, 0x30, 0x5c, 0x0a,\n\t0x09, 0x68, 0x38, 0x6d, 0x5a, 0x30, 0x59, 0x48, 0x4b, 0x53, 0x73, 0x45, 0x6f, 0x2f, 0x4d, 0x33, 0x41, 0x53, \n\t0x45, 0x4a, 0x61, 0x36, 0x49, 0x51, 0x52, 0x73, 0x46, 0x67, 0x59, 0x4a, 0x62, 0x49, 0x47, 0x4d, 0x45, 0x70, \n\t0x65, 0x38, 0x50, 0x68, 0x47, 0x65, 0x38, 0x4e, 0x49, 0x4d, 0x76, 0x46, 0x4c, 0x67, 0x5a, 0x45, 0x70, 0x39, \n\t0x70, 0x4a, 0x67, 0x64, 0x4c, 0x69, 0x33, 0x6e, 0x4d, 0x32, 0x38, 0x37, 0x79, 0x75, 0x44, 0x6b, 0x52, 0x5c, 0x0a,\n\t0x09, 0x34, 0x64, 0x77, 0x38, 0x41, 0x49, 0x44, 0x36, 0x4f, 0x53, 0x61, 0x76, 0x56, 0x39, 0x38, 0x76, 0x7a, \n\t0x66, 0x67, 0x39, 0x53, 0x54, 0x6a, 0x33, 0x72, 0x4c, 0x4e, 0x43, 0x42, 0x36, 0x50, 0x37, 0x41, 0x66, 0x6e, \n\t0x61, 0x6c, 0x48, 0x36, 0x72, 0x70, 0x67, 0x52, 0x44, 0x65, 0x4d, 0x36, 0x75, 0x75, 0x49, 0x48, 0x75, 0x62, \n\t0x63, 0x74, 0x70, 0x7a, 0x56, 0x65, 0x55, 0x54, 0x53, 0x38, 0x71, 0x73, 0x2b, 0x4a, 0x59, 0x7a, 0x61, 0x5c, 0x0a,\n\t0x09, 0x39, 0x59, 0x53, 0x34, 0x58, 0x4b, 0x4d, 0x36, 0x61, 0x6a, 0x42, 0x79, 0x4b, 0x6d, 0x35, 0x61, 0x48, \n\t0x55, 0x75, 0x41, 0x55, 0x56, 0x64, 0x33, 0x4e, 0x67, 0x73, 0x6a, 0x48, 0x37, 0x58, 0x75, 0x4d, 0x4a, 0x70, \n\t0x46, 0x73, 0x6a, 0x41, 0x4b, 0x56, 0x70, 0x44, 0x70, 0x70, 0x74, 0x55, 0x4c, 0x59, 0x36, 0x50, 0x37, 0x2f, \n\t0x45, 0x4f, 0x41, 0x34, 0x72, 0x6e, 0x6e, 0x4a, 0x6c, 0x49, 0x37, 0x54, 0x61, 0x6b, 0x50, 0x67, 0x50, 0x5c, 0x0a,\n\t0x09, 0x66, 0x70, 0x45, 0x31, 0x49, 0x4f, 0x53, 0x62, 0x70, 0x63, 0x43, 0x59, 0x77, 0x4b, 0x38, 0x38, 0x41, \n\t0x4d, 0x6a, 0x42, 0x61, 0x39, 0x35, 0x57, 0x7a, 0x72, 0x35, 0x6d, 0x77, 0x32, 0x76, 0x54, 0x72, 0x58, 0x46, \n\t0x2b, 0x71, 0x36, 0x55, 0x53, 0x59, 0x4e, 0x49, 0x4a, 0x63, 0x2b, 0x42, 0x34, 0x70, 0x5a, 0x59, 0x64, 0x52, \n\t0x48, 0x52, 0x79, 0x36, 0x64, 0x31, 0x57, 0x48, 0x43, 0x71, 0x50, 0x41, 0x71, 0x59, 0x42, 0x53, 0x56, 0x5c, 0x0a,\n\t0x09, 0x64, 0x64, 0x34, 0x77, 0x63, 0x68, 0x50, 0x43, 0x79, 0x4d, 0x36, 0x2b, 0x56, 0x75, 0x63, 0x6d, 0x67, \n\t0x56, 0x47, 0x6b, 0x72, 0x77, 0x2b, 0x4d, 0x62, 0x48, 0x67, 0x4d, 0x6a, 0x47, 0x61, 0x78, 0x69, 0x73, 0x44, \n\t0x6b, 0x4c, 0x63, 0x31, 0x66, 0x4d, 0x39, 0x64, 0x49, 0x39, 0x44, 0x66, 0x51, 0x47, 0x76, 0x31, 0x2f, 0x4e, \n\t0x49, 0x33, 0x4b, 0x69, 0x55, 0x43, 0x6b, 0x52, 0x73, 0x35, 0x69, 0x5a, 0x61, 0x4f, 0x44, 0x71, 0x76, 0x5c, 0x0a,\n\t0x09, 0x48, 0x55, 0x2f, 0x71, 0x45, 0x4f, 0x47, 0x45, 0x57, 0x53, 0x67, 0x35, 0x47, 0x72, 0x6f, 0x7a, 0x70, \n\t0x68, 0x70, 0x50, 0x4a, 0x59, 0x37, 0x70, 0x61, 0x7a, 0x59, 0x78, 0x71, 0x30, 0x57, 0x78, 0x57, 0x4d, 0x4d, \n\t0x75, 0x58, 0x71, 0x68, 0x46, 0x48, 0x75, 0x78, 0x5a, 0x30, 0x43, 0x52, 0x6c, 0x70, 0x64, 0x4c, 0x78, 0x69, \n\t0x31, 0x36, 0x47, 0x7a, 0x54, 0x6b, 0x56, 0x78, 0x33, 0x42, 0x47, 0x44, 0x55, 0x4f, 0x56, 0x70, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x30, 0x6f, 0x73, 0x70, 0x63, 0x79, 0x38, 0x59, 0x7a, 0x64, 0x68, 0x46, 0x71, 0x38, 0x73, 0x59, 0x2f, \n\t0x44, 0x38, 0x35, 0x47, 0x41, 0x58, 0x4c, 0x53, 0x46, 0x74, 0x51, 0x44, 0x6e, 0x4b, 0x75, 0x6d, 0x78, 0x34, \n\t0x79, 0x75, 0x55, 0x56, 0x55, 0x31, 0x58, 0x36, 0x73, 0x72, 0x50, 0x51, 0x37, 0x75, 0x47, 0x56, 0x68, 0x52, \n\t0x41, 0x75, 0x4d, 0x34, 0x76, 0x69, 0x4a, 0x59, 0x65, 0x54, 0x69, 0x68, 0x37, 0x44, 0x5a, 0x35, 0x62, 0x5c, 0x0a,\n\t0x09, 0x47, 0x6c, 0x58, 0x49, 0x75, 0x47, 0x6b, 0x57, 0x6c, 0x55, 0x6c, 0x2b, 0x63, 0x75, 0x6a, 0x7a, 0x70, \n\t0x74, 0x70, 0x6b, 0x79, 0x35, 0x38, 0x47, 0x47, 0x48, 0x6b, 0x62, 0x4b, 0x4f, 0x46, 0x49, 0x79, 0x47, 0x34, \n\t0x42, 0x5a, 0x76, 0x45, 0x54, 0x55, 0x46, 0x6c, 0x49, 0x7a, 0x44, 0x65, 0x68, 0x39, 0x48, 0x6b, 0x59, 0x47, \n\t0x52, 0x71, 0x61, 0x67, 0x45, 0x52, 0x67, 0x30, 0x67, 0x31, 0x68, 0x5a, 0x47, 0x48, 0x61, 0x4e, 0x44, 0x5c, 0x0a,\n\t0x09, 0x61, 0x64, 0x6f, 0x6d, 0x65, 0x6d, 0x31, 0x67, 0x6c, 0x4a, 0x52, 0x76, 0x48, 0x49, 0x78, 0x73, 0x2b, \n\t0x44, 0x4b, 0x45, 0x55, 0x64, 0x66, 0x41, 0x67, 0x72, 0x6c, 0x2b, 0x64, 0x62, 0x73, 0x38, 0x35, 0x76, 0x4b, \n\t0x5a, 0x4d, 0x34, 0x79, 0x41, 0x4c, 0x49, 0x79, 0x4d, 0x2b, 0x48, 0x72, 0x2b, 0x49, 0x35, 0x48, 0x79, 0x30, \n\t0x74, 0x68, 0x33, 0x4d, 0x43, 0x50, 0x54, 0x65, 0x72, 0x62, 0x65, 0x6a, 0x64, 0x30, 0x47, 0x30, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x58, 0x71, 0x42, 0x56, 0x47, 0x32, 0x6f, 0x66, 0x55, 0x42, 0x69, 0x4f, 0x59, 0x45, 0x55, 0x5a, \n\t0x63, 0x31, 0x6a, 0x42, 0x71, 0x4c, 0x56, 0x66, 0x79, 0x77, 0x74, 0x73, 0x30, 0x4f, 0x66, 0x30, 0x36, 0x33, \n\t0x4b, 0x4a, 0x6a, 0x37, 0x6a, 0x43, 0x79, 0x4d, 0x67, 0x5a, 0x47, 0x75, 0x66, 0x52, 0x52, 0x65, 0x53, 0x34, \n\t0x48, 0x47, 0x4e, 0x6c, 0x46, 0x73, 0x6c, 0x62, 0x48, 0x50, 0x45, 0x66, 0x53, 0x61, 0x71, 0x58, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x68, 0x56, 0x78, 0x37, 0x77, 0x41, 0x6f, 0x6e, 0x76, 0x66, 0x59, 0x78, 0x47, 0x71, 0x6d, 0x42, \n\t0x64, 0x45, 0x35, 0x34, 0x45, 0x38, 0x6a, 0x75, 0x33, 0x53, 0x30, 0x58, 0x7a, 0x63, 0x59, 0x46, 0x30, 0x44, \n\t0x53, 0x43, 0x69, 0x4d, 0x61, 0x47, 0x44, 0x6d, 0x53, 0x2b, 0x50, 0x45, 0x77, 0x6f, 0x67, 0x56, 0x47, 0x39, \n\t0x73, 0x56, 0x44, 0x50, 0x5a, 0x4d, 0x4d, 0x4e, 0x4e, 0x59, 0x4a, 0x52, 0x73, 0x6d, 0x31, 0x6b, 0x38, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x6f, 0x38, 0x6c, 0x30, 0x65, 0x31, 0x77, 0x31, 0x47, 0x34, 0x2b, 0x70, 0x33, 0x33, 0x45, 0x69, \n\t0x61, 0x7a, 0x58, 0x4e, 0x52, 0x4d, 0x4e, 0x4c, 0x53, 0x42, 0x30, 0x62, 0x32, 0x75, 0x6d, 0x58, 0x41, 0x71, \n\t0x49, 0x69, 0x50, 0x35, 0x77, 0x36, 0x6a, 0x62, 0x49, 0x62, 0x76, 0x6d, 0x4d, 0x59, 0x61, 0x67, 0x69, 0x6c, \n\t0x41, 0x64, 0x50, 0x49, 0x62, 0x33, 0x78, 0x51, 0x4f, 0x37, 0x36, 0x37, 0x4b, 0x35, 0x50, 0x75, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x77, 0x7a, 0x31, 0x77, 0x52, 0x51, 0x30, 0x50, 0x70, 0x79, 0x32, 0x50, 0x42, 0x45, 0x62, 0x61, 0x4b, \n\t0x75, 0x6d, 0x43, 0x45, 0x65, 0x52, 0x68, 0x35, 0x49, 0x45, 0x33, 0x4e, 0x59, 0x77, 0x4d, 0x45, 0x4a, 0x63, \n\t0x4a, 0x6f, 0x7a, 0x5a, 0x70, 0x42, 0x63, 0x57, 0x69, 0x59, 0x64, 0x53, 0x53, 0x66, 0x69, 0x71, 0x72, 0x4a, \n\t0x64, 0x55, 0x78, 0x46, 0x78, 0x6a, 0x5a, 0x42, 0x72, 0x5a, 0x79, 0x47, 0x4e, 0x6e, 0x30, 0x34, 0x32, 0x5c, 0x0a,\n\t0x09, 0x41, 0x55, 0x39, 0x43, 0x30, 0x49, 0x52, 0x72, 0x6f, 0x4d, 0x53, 0x37, 0x4f, 0x4d, 0x73, 0x76, 0x4c, \n\t0x32, 0x61, 0x62, 0x4f, 0x66, 0x5a, 0x64, 0x4c, 0x42, 0x57, 0x2b, 0x73, 0x6a, 0x6b, 0x61, 0x70, 0x72, 0x56, \n\t0x6f, 0x35, 0x69, 0x47, 0x44, 0x6d, 0x66, 0x2f, 0x64, 0x51, 0x77, 0x73, 0x6a, 0x41, 0x6a, 0x54, 0x73, 0x63, \n\t0x68, 0x68, 0x46, 0x48, 0x66, 0x4c, 0x70, 0x71, 0x2b, 0x64, 0x71, 0x45, 0x77, 0x61, 0x67, 0x64, 0x46, 0x5c, 0x0a,\n\t0x09, 0x48, 0x6b, 0x59, 0x39, 0x37, 0x6e, 0x30, 0x57, 0x47, 0x4f, 0x58, 0x79, 0x71, 0x33, 0x55, 0x48, 0x36, \n\t0x51, 0x4d, 0x6a, 0x47, 0x37, 0x2b, 0x4f, 0x4d, 0x4d, 0x71, 0x56, 0x73, 0x30, 0x74, 0x48, 0x43, 0x34, 0x7a, \n\t0x73, 0x50, 0x55, 0x54, 0x33, 0x75, 0x44, 0x51, 0x59, 0x50, 0x51, 0x71, 0x54, 0x37, 0x55, 0x47, 0x6b, 0x5a, \n\t0x55, 0x70, 0x6e, 0x4e, 0x51, 0x43, 0x2f, 0x48, 0x35, 0x38, 0x54, 0x5a, 0x48, 0x53, 0x70, 0x4f, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x34, 0x30, 0x6a, 0x46, 0x44, 0x70, 0x55, 0x44, 0x43, 0x71, 0x30, 0x30, 0x48, 0x36, 0x34, 0x75, 0x6e, \n\t0x4c, 0x44, 0x78, 0x4f, 0x4d, 0x4d, 0x6e, 0x42, 0x61, 0x4a, 0x59, 0x78, 0x79, 0x2b, 0x55, 0x56, 0x6c, 0x79, \n\t0x65, 0x65, 0x35, 0x38, 0x72, 0x32, 0x4d, 0x56, 0x67, 0x32, 0x6a, 0x53, 0x46, 0x2f, 0x6d, 0x2f, 0x65, 0x75, \n\t0x74, 0x59, 0x32, 0x31, 0x68, 0x64, 0x48, 0x66, 0x75, 0x5a, 0x46, 0x2b, 0x5a, 0x33, 0x69, 0x49, 0x53, 0x5c, 0x0a,\n\t0x09, 0x37, 0x67, 0x48, 0x69, 0x44, 0x55, 0x63, 0x4f, 0x39, 0x70, 0x70, 0x47, 0x73, 0x67, 0x6f, 0x59, 0x31, \n\t0x65, 0x33, 0x51, 0x76, 0x6d, 0x68, 0x64, 0x30, 0x44, 0x67, 0x73, 0x4d, 0x44, 0x49, 0x76, 0x34, 0x4b, 0x70, \n\t0x67, 0x31, 0x42, 0x73, 0x55, 0x61, 0x5a, 0x37, 0x72, 0x41, 0x53, 0x4e, 0x62, 0x46, 0x6e, 0x76, 0x4e, 0x72, \n\t0x44, 0x43, 0x79, 0x39, 0x7a, 0x54, 0x70, 0x68, 0x4d, 0x66, 0x4a, 0x64, 0x4b, 0x77, 0x52, 0x6a, 0x48, 0x5c, 0x0a,\n\t0x09, 0x34, 0x50, 0x59, 0x50, 0x44, 0x38, 0x79, 0x57, 0x5a, 0x55, 0x71, 0x78, 0x4a, 0x4e, 0x4c, 0x53, 0x58, \n\t0x43, 0x32, 0x2f, 0x51, 0x4a, 0x47, 0x56, 0x35, 0x45, 0x41, 0x36, 0x51, 0x62, 0x52, 0x71, 0x69, 0x30, 0x69, \n\t0x34, 0x57, 0x52, 0x51, 0x46, 0x4e, 0x35, 0x30, 0x54, 0x4d, 0x2b, 0x35, 0x44, 0x42, 0x4b, 0x6a, 0x74, 0x4f, \n\t0x47, 0x75, 0x49, 0x46, 0x52, 0x65, 0x36, 0x4e, 0x65, 0x33, 0x34, 0x33, 0x56, 0x79, 0x4e, 0x54, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x44, 0x42, 0x71, 0x4b, 0x64, 0x63, 0x43, 0x59, 0x50, 0x52, 0x37, 0x4d, 0x2b, 0x51, 0x32, 0x48, \n\t0x59, 0x68, 0x4f, 0x66, 0x70, 0x4e, 0x78, 0x57, 0x41, 0x63, 0x5a, 0x37, 0x76, 0x75, 0x61, 0x31, 0x7a, 0x42, \n\t0x71, 0x59, 0x42, 0x50, 0x44, 0x53, 0x46, 0x46, 0x37, 0x46, 0x68, 0x67, 0x5a, 0x70, 0x2b, 0x35, 0x43, 0x64, \n\t0x33, 0x6d, 0x4d, 0x38, 0x6c, 0x53, 0x79, 0x4b, 0x68, 0x68, 0x6c, 0x77, 0x65, 0x53, 0x49, 0x36, 0x62, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x4f, 0x4d, 0x44, 0x4c, 0x42, 0x56, 0x63, 0x4d, 0x6f, 0x30, 0x72, 0x65, 0x75, 0x4d, 0x4d, 0x72, \n\t0x56, 0x34, 0x78, 0x51, 0x77, 0x61, 0x70, 0x31, 0x6a, 0x46, 0x4f, 0x4b, 0x5a, 0x58, 0x68, 0x6f, 0x59, 0x48, \n\t0x51, 0x44, 0x76, 0x6d, 0x43, 0x47, 0x6e, 0x57, 0x56, 0x66, 0x49, 0x38, 0x64, 0x62, 0x34, 0x52, 0x67, 0x51, \n\t0x5a, 0x37, 0x52, 0x45, 0x44, 0x78, 0x50, 0x2f, 0x31, 0x59, 0x45, 0x6c, 0x67, 0x35, 0x4a, 0x67, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x52, 0x6f, 0x37, 0x6b, 0x34, 0x61, 0x35, 0x6d, 0x6c, 0x38, 0x63, 0x56, 0x77, 0x55, 0x69, 0x58, 0x5a, \n\t0x57, 0x31, 0x68, 0x6c, 0x4e, 0x37, 0x6a, 0x5a, 0x70, 0x64, 0x48, 0x56, 0x61, 0x5a, 0x35, 0x77, 0x55, 0x69, \n\t0x58, 0x65, 0x62, 0x6b, 0x77, 0x65, 0x68, 0x64, 0x53, 0x58, 0x70, 0x6f, 0x68, 0x6c, 0x35, 0x6c, 0x42, 0x39, \n\t0x44, 0x5a, 0x67, 0x46, 0x4e, 0x33, 0x49, 0x77, 0x55, 0x55, 0x46, 0x6c, 0x61, 0x5a, 0x72, 0x56, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x58, 0x54, 0x59, 0x48, 0x45, 0x77, 0x69, 0x68, 0x2f, 0x6d, 0x32, 0x6d, 0x38, 0x35, 0x71, 0x36, 0x49, \n\t0x33, 0x75, 0x7a, 0x7a, 0x47, 0x65, 0x61, 0x7a, 0x58, 0x78, 0x6d, 0x72, 0x7a, 0x67, 0x31, 0x47, 0x55, 0x33, \n\t0x79, 0x77, 0x77, 0x53, 0x73, 0x53, 0x57, 0x65, 0x2b, 0x6b, 0x77, 0x2b, 0x6c, 0x32, 0x59, 0x33, 0x6a, 0x2f, \n\t0x6b, 0x53, 0x7a, 0x43, 0x54, 0x6e, 0x41, 0x66, 0x2b, 0x5a, 0x31, 0x55, 0x59, 0x66, 0x2b, 0x62, 0x41, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x34, 0x6d, 0x30, 0x69, 0x67, 0x79, 0x4d, 0x6f, 0x71, 0x34, 0x62, 0x39, 0x76, 0x78, 0x68, 0x68, \n\t0x56, 0x48, 0x62, 0x53, 0x7a, 0x4d, 0x47, 0x57, 0x67, 0x75, 0x42, 0x55, 0x59, 0x68, 0x62, 0x45, 0x49, 0x78, \n\t0x30, 0x65, 0x41, 0x59, 0x59, 0x70, 0x58, 0x4a, 0x30, 0x59, 0x58, 0x53, 0x45, 0x64, 0x33, 0x6c, 0x38, 0x34, \n\t0x39, 0x67, 0x66, 0x33, 0x44, 0x45, 0x79, 0x4e, 0x59, 0x69, 0x55, 0x6e, 0x2b, 0x67, 0x4e, 0x39, 0x55, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x42, 0x4f, 0x62, 0x68, 0x59, 0x48, 0x54, 0x75, 0x64, 0x64, 0x51, 0x71, 0x6a, 0x65, 0x69, 0x6b, \n\t0x49, 0x4e, 0x44, 0x43, 0x71, 0x41, 0x68, 0x6b, 0x59, 0x75, 0x53, 0x79, 0x4d, 0x6f, 0x6a, 0x52, 0x54, 0x77, \n\t0x53, 0x6a, 0x4f, 0x5a, 0x67, 0x4f, 0x6a, 0x4e, 0x68, 0x32, 0x5a, 0x39, 0x46, 0x4f, 0x44, 0x49, 0x67, 0x34, \n\t0x66, 0x6a, 0x6c, 0x30, 0x65, 0x63, 0x7a, 0x49, 0x47, 0x52, 0x73, 0x6d, 0x37, 0x64, 0x47, 0x52, 0x68, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x47, 0x4a, 0x47, 0x52, 0x37, 0x58, 0x58, 0x50, 0x49, 0x4e, 0x55, 0x68, 0x58, 0x35, 0x6a, 0x66, \n\t0x45, 0x35, 0x67, 0x65, 0x4b, 0x6c, 0x71, 0x46, 0x50, 0x4f, 0x43, 0x55, 0x58, 0x6a, 0x6f, 0x42, 0x6b, 0x59, \n\t0x53, 0x34, 0x75, 0x72, 0x72, 0x38, 0x7a, 0x42, 0x53, 0x5a, 0x54, 0x55, 0x77, 0x30, 0x70, 0x41, 0x69, 0x76, \n\t0x61, 0x59, 0x76, 0x6a, 0x42, 0x4a, 0x5a, 0x45, 0x78, 0x68, 0x70, 0x6e, 0x5a, 0x73, 0x74, 0x5a, 0x37, 0x5c, 0x0a,\n\t0x09, 0x50, 0x35, 0x4e, 0x33, 0x46, 0x42, 0x6e, 0x33, 0x6c, 0x33, 0x62, 0x4b, 0x4e, 0x75, 0x79, 0x38, 0x50, \n\t0x71, 0x79, 0x41, 0x34, 0x73, 0x4c, 0x41, 0x4e, 0x47, 0x49, 0x61, 0x35, 0x4e, 0x78, 0x39, 0x78, 0x68, 0x39, \n\t0x45, 0x36, 0x71, 0x6e, 0x74, 0x46, 0x4d, 0x4d, 0x6d, 0x76, 0x58, 0x44, 0x49, 0x53, 0x37, 0x67, 0x62, 0x33, \n\t0x6f, 0x31, 0x50, 0x37, 0x6a, 0x31, 0x45, 0x50, 0x33, 0x45, 0x59, 0x77, 0x55, 0x59, 0x48, 0x49, 0x77, 0x5c, 0x0a,\n\t0x09, 0x69, 0x6f, 0x71, 0x6b, 0x30, 0x2f, 0x71, 0x2f, 0x51, 0x6a, 0x65, 0x4d, 0x36, 0x75, 0x75, 0x49, 0x48, \n\t0x75, 0x5a, 0x68, 0x32, 0x2b, 0x56, 0x78, 0x59, 0x68, 0x6a, 0x70, 0x6c, 0x30, 0x6e, 0x44, 0x4b, 0x48, 0x6e, \n\t0x42, 0x34, 0x78, 0x74, 0x64, 0x37, 0x31, 0x30, 0x65, 0x64, 0x64, 0x79, 0x30, 0x4f, 0x70, 0x59, 0x41, 0x49, \n\t0x77, 0x75, 0x44, 0x6c, 0x63, 0x4d, 0x6f, 0x38, 0x2b, 0x4d, 0x37, 0x44, 0x59, 0x7a, 0x36, 0x79, 0x35, 0x5c, 0x0a,\n\t0x09, 0x73, 0x42, 0x42, 0x69, 0x2b, 0x59, 0x6a, 0x55, 0x57, 0x7a, 0x67, 0x77, 0x67, 0x75, 0x49, 0x66, 0x45, \n\t0x73, 0x61, 0x39, 0x6c, 0x2f, 0x6e, 0x41, 0x59, 0x32, 0x47, 0x6b, 0x62, 0x47, 0x79, 0x72, 0x45, 0x77, 0x73, \n\t0x6c, 0x32, 0x75, 0x42, 0x45, 0x61, 0x46, 0x65, 0x57, 0x41, 0x47, 0x52, 0x74, 0x45, 0x4d, 0x61, 0x79, 0x61, \n\t0x44, 0x6b, 0x62, 0x34, 0x75, 0x50, 0x6d, 0x69, 0x4f, 0x6b, 0x77, 0x5a, 0x4f, 0x6d, 0x73, 0x61, 0x65, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x78, 0x4a, 0x47, 0x37, 0x58, 0x70, 0x43, 0x58, 0x41, 0x34, 0x55, 0x79, 0x34, 0x61, 0x52, 0x4c, \n\t0x65, 0x65, 0x38, 0x59, 0x65, 0x52, 0x55, 0x33, 0x4c, 0x51, 0x36, 0x4f, 0x6b, 0x42, 0x68, 0x72, 0x35, 0x38, \n\t0x61, 0x52, 0x6c, 0x33, 0x31, 0x6c, 0x6f, 0x4f, 0x52, 0x6a, 0x31, 0x70, 0x6e, 0x47, 0x50, 0x57, 0x33, 0x69, \n\t0x74, 0x34, 0x34, 0x50, 0x73, 0x6c, 0x34, 0x6d, 0x51, 0x6c, 0x45, 0x4a, 0x37, 0x2b, 0x35, 0x39, 0x68, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x39, 0x4b, 0x53, 0x72, 0x34, 0x77, 0x53, 0x58, 0x71, 0x44, 0x36, 0x2f, 0x6c, 0x59, 0x47, 0x53, \n\t0x50, 0x45, 0x78, 0x68, 0x5a, 0x59, 0x42, 0x6b, 0x59, 0x31, 0x64, 0x49, 0x47, 0x49, 0x39, 0x64, 0x45, 0x39, \n\t0x34, 0x57, 0x52, 0x66, 0x69, 0x68, 0x39, 0x59, 0x4a, 0x53, 0x56, 0x53, 0x57, 0x43, 0x55, 0x45, 0x64, 0x30, \n\t0x6f, 0x6b, 0x77, 0x61, 0x51, 0x53, 0x37, 0x38, 0x49, 0x47, 0x50, 0x58, 0x52, 0x59, 0x66, 0x4c, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x36, 0x73, 0x69, 0x6b, 0x43, 0x65, 0x46, 0x6c, 0x77, 0x38, 0x6a, 0x65, 0x33, 0x39, 0x78, 0x68, 0x35, \n\t0x43, 0x61, 0x45, 0x6b, 0x5a, 0x35, 0x55, 0x61, 0x63, 0x35, 0x4e, 0x41, 0x71, 0x4e, 0x49, 0x58, 0x78, 0x38, \n\t0x59, 0x32, 0x58, 0x41, 0x58, 0x6a, 0x48, 0x70, 0x31, 0x30, 0x51, 0x36, 0x59, 0x67, 0x33, 0x2f, 0x49, 0x61, \n\t0x35, 0x75, 0x4c, 0x2f, 0x48, 0x59, 0x63, 0x46, 0x4e, 0x69, 0x2f, 0x55, 0x45, 0x45, 0x6d, 0x76, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x77, 0x4c, 0x67, 0x31, 0x45, 0x54, 0x50, 0x78, 0x57, 0x4d, 0x56, 0x42, 0x34, 0x4c, 0x33, 0x65, 0x55, \n\t0x78, 0x6f, 0x79, 0x38, 0x72, 0x69, 0x68, 0x46, 0x72, 0x73, 0x37, 0x48, 0x61, 0x4d, 0x6d, 0x43, 0x6b, 0x31, \n\t0x66, 0x57, 0x43, 0x55, 0x59, 0x76, 0x4f, 0x72, 0x49, 0x35, 0x4d, 0x6f, 0x31, 0x6f, 0x47, 0x6a, 0x42, 0x4a, \n\t0x39, 0x34, 0x32, 0x41, 0x55, 0x54, 0x6d, 0x54, 0x4b, 0x6c, 0x41, 0x74, 0x33, 0x6a, 0x74, 0x61, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x39, 0x42, 0x4c, 0x72, 0x6e, 0x42, 0x4f, 0x4d, 0x33, 0x67, 0x70, 0x63, 0x36, 0x45, 0x7a, 0x52, 0x55, \n\t0x2b, 0x59, 0x46, 0x6f, 0x6e, 0x63, 0x43, 0x35, 0x36, 0x4a, 0x66, 0x74, 0x76, 0x33, 0x7a, 0x43, 0x6a, 0x34, \n\t0x4b, 0x49, 0x6d, 0x30, 0x77, 0x71, 0x6b, 0x6a, 0x55, 0x41, 0x53, 0x4e, 0x61, 0x59, 0x42, 0x54, 0x48, 0x54, \n\t0x77, 0x77, 0x6a, 0x46, 0x7a, 0x2b, 0x45, 0x7a, 0x5a, 0x61, 0x7a, 0x48, 0x65, 0x56, 0x4b, 0x64, 0x47, 0x5c, 0x0a,\n\t0x09, 0x54, 0x53, 0x54, 0x77, 0x55, 0x4b, 0x6b, 0x6b, 0x61, 0x31, 0x32, 0x65, 0x57, 0x78, 0x4a, 0x63, 0x2b, \n\t0x46, 0x77, 0x4d, 0x6a, 0x6d, 0x30, 0x78, 0x74, 0x47, 0x76, 0x77, 0x6d, 0x7a, 0x2b, 0x34, 0x64, 0x4d, 0x71, \n\t0x57, 0x61, 0x53, 0x49, 0x61, 0x47, 0x76, 0x36, 0x41, 0x73, 0x74, 0x65, 0x2b, 0x65, 0x49, 0x75, 0x32, 0x55, \n\t0x4e, 0x62, 0x4c, 0x49, 0x77, 0x71, 0x74, 0x4f, 0x30, 0x77, 0x63, 0x68, 0x55, 0x56, 0x41, 0x49, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x39, 0x61, 0x4a, 0x47, 0x61, 0x53, 0x61, 0x46, 0x45, 0x59, 0x75, 0x44, 0x55, 0x63, 0x66, 0x6f, 0x55, \n\t0x4a, 0x71, 0x32, 0x69, 0x56, 0x34, 0x4c, 0x47, 0x43, 0x55, 0x76, 0x76, 0x45, 0x32, 0x54, 0x30, 0x36, 0x2f, \n\t0x44, 0x6d, 0x54, 0x77, 0x58, 0x41, 0x69, 0x4d, 0x72, 0x59, 0x32, 0x43, 0x55, 0x53, 0x78, 0x2b, 0x56, 0x35, \n\t0x33, 0x4b, 0x41, 0x55, 0x65, 0x67, 0x57, 0x54, 0x67, 0x79, 0x6a, 0x33, 0x38, 0x79, 0x65, 0x6e, 0x55, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x6d, 0x42, 0x70, 0x48, 0x79, 0x45, 0x2f, 0x31, 0x61, 0x66, 0x56, 0x4b, 0x6f, 0x64, 0x6d, 0x7a, \n\t0x55, 0x6d, 0x36, 0x58, 0x56, 0x6f, 0x50, 0x45, 0x54, 0x46, 0x4c, 0x56, 0x6a, 0x57, 0x73, 0x50, 0x49, 0x42, \n\t0x52, 0x69, 0x35, 0x50, 0x49, 0x77, 0x69, 0x68, 0x33, 0x51, 0x47, 0x52, 0x76, 0x57, 0x45, 0x52, 0x31, 0x51, \n\t0x34, 0x42, 0x79, 0x4e, 0x61, 0x59, 0x47, 0x52, 0x66, 0x50, 0x4e, 0x52, 0x7a, 0x58, 0x48, 0x4d, 0x59, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x64, 0x64, 0x4f, 0x42, 0x36, 0x50, 0x57, 0x63, 0x68, 0x30, 0x4b, 0x47, 0x4c, 0x58, 0x55, 0x62, \n\t0x78, 0x75, 0x4d, 0x78, 0x6a, 0x32, 0x50, 0x68, 0x63, 0x46, 0x49, 0x53, 0x78, 0x38, 0x59, 0x32, 0x65, 0x75, \n\t0x57, 0x42, 0x53, 0x4e, 0x56, 0x78, 0x76, 0x6a, 0x64, 0x4f, 0x77, 0x76, 0x38, 0x41, 0x58, 0x4f, 0x53, 0x65, \n\t0x56, 0x6c, 0x45, 0x41, 0x4b, 0x2b, 0x50, 0x51, 0x6c, 0x4a, 0x5a, 0x52, 0x53, 0x36, 0x41, 0x4a, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x47, 0x52, 0x68, 0x6b, 0x6f, 0x4f, 0x52, 0x68, 0x50, 0x73, 0x38, 0x71, 0x68, 0x6e, 0x5a, 0x69, 0x63, \n\t0x77, 0x67, 0x6a, 0x79, 0x4d, 0x50, 0x50, 0x42, 0x6d, 0x67, 0x70, 0x48, 0x4b, 0x66, 0x78, 0x31, 0x67, 0x31, \n\t0x41, 0x71, 0x4b, 0x79, 0x57, 0x42, 0x30, 0x4a, 0x48, 0x64, 0x35, 0x37, 0x47, 0x70, 0x55, 0x4b, 0x34, 0x47, \n\t0x52, 0x54, 0x54, 0x38, 0x4f, 0x52, 0x6b, 0x48, 0x66, 0x67, 0x6d, 0x43, 0x6b, 0x79, 0x39, 0x41, 0x50, 0x5c, 0x0a,\n\t0x09, 0x52, 0x6d, 0x2b, 0x67, 0x2b, 0x65, 0x37, 0x30, 0x7a, 0x44, 0x4a, 0x50, 0x45, 0x48, 0x30, 0x43, 0x65, \n\t0x48, 0x64, 0x30, 0x35, 0x74, 0x4a, 0x6a, 0x34, 0x41, 0x6f, 0x50, 0x46, 0x44, 0x63, 0x47, 0x52, 0x75, 0x52, \n\t0x68, 0x74, 0x4e, 0x6e, 0x6c, 0x4d, 0x51, 0x2b, 0x6a, 0x4e, 0x6c, 0x6b, 0x4a, 0x6a, 0x4e, 0x70, 0x42, 0x6b, \n\t0x59, 0x64, 0x52, 0x6a, 0x33, 0x75, 0x66, 0x42, 0x55, 0x61, 0x35, 0x2f, 0x47, 0x72, 0x64, 0x51, 0x66, 0x5c, 0x0a,\n\t0x09, 0x72, 0x41, 0x79, 0x4d, 0x59, 0x66, 0x59, 0x52, 0x6a, 0x5a, 0x65, 0x34, 0x6a, 0x75, 0x4d, 0x51, 0x75, \n\t0x6a, 0x33, 0x30, 0x54, 0x6d, 0x34, 0x78, 0x39, 0x53, 0x57, 0x6d, 0x65, 0x54, 0x62, 0x50, 0x63, 0x4d, 0x6b, \n\t0x4c, 0x33, 0x7a, 0x49, 0x47, 0x55, 0x46, 0x6f, 0x77, 0x43, 0x67, 0x56, 0x68, 0x67, 0x46, 0x53, 0x43, 0x77, \n\t0x4a, 0x52, 0x71, 0x68, 0x30, 0x48, 0x45, 0x49, 0x59, 0x39, 0x66, 0x55, 0x58, 0x36, 0x57, 0x74, 0x31, 0x5c, 0x0a,\n\t0x09, 0x65, 0x42, 0x31, 0x68, 0x4e, 0x43, 0x62, 0x50, 0x6c, 0x57, 0x38, 0x66, 0x73, 0x6d, 0x6f, 0x59, 0x52, \n\t0x66, 0x6f, 0x36, 0x77, 0x4c, 0x6b, 0x63, 0x47, 0x4d, 0x55, 0x39, 0x6f, 0x42, 0x6c, 0x6c, 0x6e, 0x68, 0x59, \n\t0x52, 0x77, 0x4b, 0x2f, 0x48, 0x51, 0x61, 0x6d, 0x63, 0x31, 0x72, 0x37, 0x72, 0x31, 0x52, 0x39, 0x47, 0x43, \n\t0x6b, 0x71, 0x72, 0x67, 0x4a, 0x45, 0x75, 0x51, 0x77, 0x35, 0x47, 0x30, 0x62, 0x58, 0x36, 0x62, 0x79, 0x5c, 0x0a,\n\t0x09, 0x68, 0x44, 0x76, 0x6e, 0x4a, 0x57, 0x43, 0x79, 0x4e, 0x7a, 0x33, 0x36, 0x75, 0x47, 0x55, 0x53, 0x36, \n\t0x2f, 0x71, 0x43, 0x7a, 0x35, 0x50, 0x43, 0x38, 0x50, 0x47, 0x4e, 0x6c, 0x37, 0x6d, 0x6e, 0x53, 0x4f, 0x30, \n\t0x57, 0x51, 0x36, 0x70, 0x6f, 0x44, 0x52, 0x75, 0x38, 0x46, 0x39, 0x50, 0x46, 0x55, 0x36, 0x76, 0x63, 0x77, \n\t0x62, 0x52, 0x47, 0x38, 0x48, 0x48, 0x74, 0x59, 0x6e, 0x78, 0x48, 0x66, 0x50, 0x38, 0x6a, 0x41, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x35, 0x63, 0x5a, 0x4a, 0x65, 0x73, 0x46, 0x49, 0x31, 0x54, 0x61, 0x4f, 0x63, 0x4b, 0x6f, 0x62, \n\t0x6f, 0x66, 0x32, 0x52, 0x58, 0x4e, 0x52, 0x4d, 0x41, 0x35, 0x73, 0x59, 0x4a, 0x51, 0x4e, 0x74, 0x38, 0x47, \n\t0x6f, 0x4e, 0x79, 0x6a, 0x53, 0x50, 0x4e, 0x63, 0x44, 0x52, 0x72, 0x59, 0x73, 0x39, 0x70, 0x70, 0x5a, 0x59, \n\t0x42, 0x51, 0x2f, 0x70, 0x35, 0x58, 0x44, 0x4b, 0x43, 0x33, 0x58, 0x36, 0x38, 0x41, 0x78, 0x65, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x46, 0x38, 0x75, 0x6d, 0x55, 0x35, 0x54, 0x62, 0x50, 0x4b, 0x43, 0x4f, 0x4f, 0x30, 0x6c, 0x6f, 0x74, \n\t0x6e, 0x59, 0x77, 0x73, 0x6f, 0x67, 0x6c, 0x45, 0x44, 0x6d, 0x57, 0x34, 0x59, 0x4e, 0x65, 0x66, 0x58, 0x63, \n\t0x35, 0x66, 0x48, 0x43, 0x57, 0x46, 0x6b, 0x70, 0x67, 0x76, 0x55, 0x39, 0x35, 0x41, 0x6d, 0x7a, 0x46, 0x38, \n\t0x2f, 0x62, 0x78, 0x67, 0x6c, 0x78, 0x32, 0x6c, 0x44, 0x33, 0x4d, 0x43, 0x6f, 0x53, 0x35, 0x39, 0x36, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x6a, 0x62, 0x50, 0x52, 0x4f, 0x65, 0x79, 0x59, 0x57, 0x54, 0x44, 0x55, 0x38, 0x41, 0x6f, 0x48, \n\t0x64, 0x5a, 0x2f, 0x58, 0x65, 0x75, 0x37, 0x4f, 0x61, 0x58, 0x4d, 0x44, 0x55, 0x54, 0x4b, 0x54, 0x78, 0x52, \n\t0x33, 0x7a, 0x38, 0x71, 0x68, 0x6d, 0x74, 0x77, 0x59, 0x6f, 0x4a, 0x43, 0x42, 0x6b, 0x5a, 0x36, 0x73, 0x6d, \n\t0x4d, 0x41, 0x6f, 0x6e, 0x49, 0x63, 0x73, 0x6a, 0x42, 0x79, 0x7a, 0x77, 0x63, 0x67, 0x78, 0x42, 0x78, 0x5c, 0x0a,\n\t0x09, 0x68, 0x42, 0x63, 0x72, 0x49, 0x4e, 0x52, 0x70, 0x45, 0x66, 0x53, 0x70, 0x39, 0x66, 0x45, 0x59, 0x78, \n\t0x30, 0x57, 0x66, 0x52, 0x4c, 0x76, 0x6c, 0x59, 0x62, 0x71, 0x35, 0x47, 0x45, 0x56, 0x77, 0x6f, 0x6a, 0x55, \n\t0x34, 0x66, 0x72, 0x43, 0x36, 0x4e, 0x63, 0x50, 0x58, 0x62, 0x41, 0x53, 0x4a, 0x63, 0x35, 0x44, 0x36, 0x4f, \n\t0x48, 0x77, 0x45, 0x33, 0x39, 0x2f, 0x62, 0x49, 0x32, 0x6d, 0x62, 0x64, 0x46, 0x42, 0x50, 0x41, 0x36, 0x5c, 0x0a,\n\t0x09, 0x59, 0x46, 0x2b, 0x66, 0x6b, 0x41, 0x74, 0x6e, 0x50, 0x58, 0x43, 0x55, 0x42, 0x57, 0x52, 0x68, 0x46, \n\t0x50, 0x33, 0x56, 0x55, 0x49, 0x6d, 0x76, 0x57, 0x54, 0x79, 0x4d, 0x71, 0x4b, 0x39, 0x66, 0x2b, 0x31, 0x30, \n\t0x65, 0x35, 0x77, 0x55, 0x6a, 0x57, 0x35, 0x61, 0x6f, 0x4d, 0x61, 0x34, 0x54, 0x6a, 0x4e, 0x4a, 0x37, 0x33, \n\t0x47, 0x77, 0x35, 0x71, 0x38, 0x6f, 0x30, 0x43, 0x59, 0x77, 0x53, 0x73, 0x66, 0x58, 0x55, 0x43, 0x71, 0x5c, 0x0a,\n\t0x09, 0x50, 0x58, 0x49, 0x34, 0x78, 0x61, 0x33, 0x38, 0x6b, 0x70, 0x5a, 0x52, 0x45, 0x67, 0x65, 0x68, 0x53, \n\t0x39, 0x57, 0x52, 0x6f, 0x67, 0x46, 0x78, 0x2b, 0x6d, 0x41, 0x55, 0x6c, 0x50, 0x47, 0x43, 0x6c, 0x6f, 0x54, \n\t0x41, 0x51, 0x6a, 0x62, 0x55, 0x57, 0x46, 0x75, 0x4b, 0x4f, 0x36, 0x79, 0x32, 0x4e, 0x79, 0x32, 0x62, 0x78, \n\t0x68, 0x46, 0x4f, 0x4c, 0x57, 0x47, 0x30, 0x61, 0x70, 0x2b, 0x4f, 0x65, 0x62, 0x4e, 0x4e, 0x53, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x6d, 0x61, 0x46, 0x6b, 0x64, 0x58, 0x6e, 0x38, 0x30, 0x78, 0x30, 0x54, 0x67, 0x65, 0x6a, 0x4b, \n\t0x4c, 0x39, 0x70, 0x59, 0x54, 0x54, 0x39, 0x78, 0x6d, 0x72, 0x65, 0x50, 0x78, 0x52, 0x2f, 0x53, 0x57, 0x78, \n\t0x57, 0x6d, 0x53, 0x75, 0x49, 0x54, 0x6e, 0x37, 0x7a, 0x6d, 0x38, 0x4c, 0x44, 0x66, 0x30, 0x30, 0x55, 0x4d, \n\t0x64, 0x78, 0x44, 0x44, 0x69, 0x36, 0x51, 0x68, 0x52, 0x48, 0x6b, 0x59, 0x5a, 0x51, 0x34, 0x6c, 0x50, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x77, 0x69, 0x76, 0x78, 0x49, 0x65, 0x70, 0x62, 0x31, 0x30, 0x6d, 0x41, 0x55, 0x4a, 0x54, 0x56, \n\t0x6c, 0x58, 0x67, 0x4b, 0x4d, 0x59, 0x6b, 0x59, 0x63, 0x50, 0x68, 0x6a, 0x70, 0x38, 0x4a, 0x51, 0x77, 0x57, \n\t0x71, 0x65, 0x4e, 0x31, 0x5a, 0x4c, 0x34, 0x54, 0x6d, 0x69, 0x4f, 0x67, 0x56, 0x48, 0x79, 0x4c, 0x74, 0x6c, \n\t0x37, 0x57, 0x6a, 0x71, 0x4d, 0x52, 0x6c, 0x44, 0x38, 0x6a, 0x37, 0x45, 0x2f, 0x69, 0x6c, 0x50, 0x49, 0x5c, 0x0a,\n\t0x09, 0x49, 0x69, 0x77, 0x69, 0x52, 0x50, 0x67, 0x6c, 0x7a, 0x4e, 0x66, 0x58, 0x35, 0x4d, 0x4a, 0x44, 0x55, \n\t0x41, 0x78, 0x49, 0x59, 0x4f, 0x51, 0x47, 0x56, 0x51, 0x49, 0x4e, 0x47, 0x51, 0x32, 0x6a, 0x75, 0x65, 0x33, \n\t0x79, 0x69, 0x4f, 0x2b, 0x36, 0x2b, 0x62, 0x6a, 0x49, 0x34, 0x68, 0x6f, 0x50, 0x6f, 0x2b, 0x70, 0x36, 0x56, \n\t0x4c, 0x6f, 0x71, 0x62, 0x6d, 0x36, 0x37, 0x50, 0x4b, 0x34, 0x72, 0x6a, 0x4c, 0x54, 0x4f, 0x7a, 0x53, 0x5c, 0x0a,\n\t0x09, 0x36, 0x50, 0x32, 0x66, 0x79, 0x62, 0x75, 0x4b, 0x44, 0x50, 0x76, 0x44, 0x75, 0x32, 0x55, 0x53, 0x63, \n\t0x36, 0x57, 0x32, 0x43, 0x55, 0x41, 0x47, 0x35, 0x5a, 0x4d, 0x41, 0x70, 0x78, 0x69, 0x59, 0x37, 0x66, 0x52, \n\t0x7a, 0x68, 0x37, 0x61, 0x45, 0x41, 0x45, 0x50, 0x43, 0x52, 0x53, 0x37, 0x64, 0x77, 0x57, 0x52, 0x43, 0x34, \n\t0x38, 0x56, 0x42, 0x31, 0x45, 0x6f, 0x47, 0x6c, 0x67, 0x56, 0x4b, 0x38, 0x74, 0x53, 0x39, 0x4a, 0x59, 0x5c, 0x0a,\n\t0x09, 0x47, 0x43, 0x6e, 0x41, 0x4c, 0x47, 0x4b, 0x58, 0x78, 0x78, 0x59, 0x59, 0x7a, 0x57, 0x32, 0x58, 0x78, \n\t0x79, 0x34, 0x59, 0x4a, 0x62, 0x49, 0x47, 0x4d, 0x45, 0x70, 0x65, 0x38, 0x50, 0x68, 0x47, 0x4e, 0x37, 0x73, \n\t0x38, 0x7a, 0x67, 0x6c, 0x47, 0x55, 0x57, 0x46, 0x58, 0x44, 0x61, 0x50, 0x4d, 0x6a, 0x32, 0x2b, 0x6c, 0x34, \n\t0x33, 0x55, 0x41, 0x67, 0x78, 0x63, 0x39, 0x6c, 0x4e, 0x37, 0x43, 0x6a, 0x44, 0x4a, 0x33, 0x45, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x33, 0x36, 0x6c, 0x6a, 0x65, 0x46, 0x77, 0x39, 0x64, 0x47, 0x4c, 0x2b, 0x6e, 0x42, 0x52, 0x62, 0x4f, \n\t0x58, 0x64, 0x52, 0x75, 0x4d, 0x46, 0x45, 0x53, 0x79, 0x4d, 0x44, 0x4a, 0x67, 0x61, 0x64, 0x33, 0x6c, 0x73, \n\t0x51, 0x31, 0x47, 0x78, 0x58, 0x67, 0x59, 0x31, 0x64, 0x63, 0x78, 0x47, 0x59, 0x7a, 0x55, 0x70, 0x65, 0x62, \n\t0x41, 0x48, 0x45, 0x4e, 0x76, 0x77, 0x4d, 0x77, 0x41, 0x6f, 0x33, 0x59, 0x39, 0x49, 0x53, 0x37, 0x58, 0x5c, 0x0a,\n\t0x09, 0x71, 0x49, 0x34, 0x61, 0x6a, 0x4a, 0x79, 0x4b, 0x6d, 0x31, 0x61, 0x48, 0x61, 0x53, 0x61, 0x4c, 0x67, \n\t0x46, 0x46, 0x58, 0x64, 0x7a, 0x59, 0x4c, 0x49, 0x78, 0x2b, 0x31, 0x58, 0x42, 0x6a, 0x4e, 0x66, 0x64, 0x69, \n\t0x2b, 0x7a, 0x6e, 0x6b, 0x68, 0x75, 0x56, 0x62, 0x79, 0x69, 0x35, 0x6a, 0x48, 0x4b, 0x59, 0x38, 0x2f, 0x43, \n\t0x47, 0x37, 0x51, 0x44, 0x30, 0x62, 0x52, 0x45, 0x48, 0x34, 0x4c, 0x6a, 0x4d, 0x4c, 0x78, 0x75, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x77, 0x35, 0x4b, 0x2b, 0x61, 0x36, 0x2b, 0x4b, 0x41, 0x35, 0x54, 0x68, 0x6f, 0x34, 0x61, 0x52, 0x70, \n\t0x37, 0x62, 0x71, 0x79, 0x44, 0x6c, 0x69, 0x54, 0x50, 0x77, 0x37, 0x48, 0x4c, 0x49, 0x79, 0x5a, 0x4f, 0x36, \n\t0x7a, 0x42, 0x68, 0x56, 0x48, 0x6a, 0x5a, 0x4d, 0x4f, 0x72, 0x61, 0x6d, 0x39, 0x70, 0x65, 0x50, 0x78, 0x57, \n\t0x4d, 0x33, 0x49, 0x51, 0x77, 0x61, 0x71, 0x35, 0x66, 0x30, 0x69, 0x36, 0x50, 0x39, 0x79, 0x4b, 0x38, 0x5c, 0x0a,\n\t0x09, 0x37, 0x7a, 0x43, 0x43, 0x36, 0x4a, 0x50, 0x41, 0x57, 0x2f, 0x55, 0x4c, 0x4b, 0x6f, 0x39, 0x2f, 0x32, \n\t0x6b, 0x50, 0x44, 0x77, 0x45, 0x6a, 0x44, 0x70, 0x73, 0x6a, 0x41, 0x53, 0x4d, 0x6a, 0x44, 0x36, 0x4c, 0x44, \n\t0x76, 0x38, 0x74, 0x67, 0x71, 0x66, 0x57, 0x45, 0x30, 0x70, 0x6b, 0x47, 0x37, 0x56, 0x63, 0x45, 0x6f, 0x55, \n\t0x36, 0x35, 0x4f, 0x47, 0x4f, 0x56, 0x2b, 0x66, 0x61, 0x65, 0x41, 0x6b, 0x56, 0x62, 0x58, 0x43, 0x30, 0x5c, 0x0a,\n\t0x09, 0x59, 0x74, 0x4f, 0x74, 0x74, 0x30, 0x4a, 0x4e, 0x63, 0x64, 0x41, 0x52, 0x6a, 0x31, 0x6e, 0x33, 0x33, \n\t0x39, 0x4b, 0x77, 0x43, 0x44, 0x46, 0x33, 0x2b, 0x47, 0x52, 0x63, 0x68, 0x43, 0x51, 0x4b, 0x53, 0x36, 0x5a, \n\t0x36, 0x2b, 0x42, 0x70, 0x70, 0x4a, 0x6b, 0x2f, 0x77, 0x49, 0x63, 0x68, 0x43, 0x39, 0x38, 0x4b, 0x42, 0x68, \n\t0x70, 0x49, 0x4a, 0x47, 0x42, 0x55, 0x64, 0x38, 0x74, 0x5a, 0x79, 0x73, 0x53, 0x64, 0x63, 0x43, 0x49, 0x5c, 0x0a,\n\t0x09, 0x46, 0x68, 0x6a, 0x46, 0x38, 0x52, 0x50, 0x44, 0x4b, 0x49, 0x4c, 0x4b, 0x5a, 0x70, 0x66, 0x48, 0x31, \n\t0x6e, 0x49, 0x74, 0x47, 0x6b, 0x62, 0x54, 0x7a, 0x72, 0x37, 0x75, 0x72, 0x61, 0x4e, 0x49, 0x36, 0x33, 0x41, \n\t0x5a, 0x4d, 0x45, 0x72, 0x30, 0x6a, 0x59, 0x4e, 0x52, 0x4f, 0x4a, 0x45, 0x70, 0x55, 0x79, 0x37, 0x63, 0x44, \n\t0x30, 0x61, 0x76, 0x62, 0x53, 0x2f, 0x55, 0x37, 0x4c, 0x4a, 0x49, 0x69, 0x77, 0x6a, 0x67, 0x35, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x48, 0x56, 0x55, 0x63, 0x50, 0x6f, 0x2f, 0x41, 0x4d, 0x4b, 0x51, 0x41, 0x5a, 0x47, 0x41, 0x55, 0x68, \n\t0x43, 0x48, 0x6b, 0x59, 0x4b, 0x4e, 0x75, 0x75, 0x39, 0x79, 0x2b, 0x4d, 0x43, 0x59, 0x54, 0x54, 0x4c, 0x37, \n\t0x47, 0x74, 0x39, 0x4c, 0x70, 0x74, 0x2b, 0x43, 0x54, 0x42, 0x4b, 0x79, 0x6a, 0x63, 0x4f, 0x52, 0x6a, 0x5a, \n\t0x38, 0x47, 0x63, 0x4b, 0x6f, 0x61, 0x32, 0x44, 0x42, 0x58, 0x4c, 0x2b, 0x67, 0x58, 0x52, 0x34, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x41, 0x39, 0x56, 0x6e, 0x70, 0x52, 0x63, 0x6c, 0x69, 0x77, 0x62, 0x52, 0x4a, 0x36, 0x45, 0x5a, 0x50, \n\t0x52, 0x4f, 0x42, 0x38, 0x74, 0x77, 0x44, 0x31, 0x62, 0x77, 0x68, 0x46, 0x34, 0x43, 0x53, 0x67, 0x56, 0x47, \n\t0x77, 0x67, 0x4d, 0x4a, 0x65, 0x52, 0x6c, 0x50, 0x76, 0x38, 0x74, 0x67, 0x43, 0x6f, 0x2b, 0x69, 0x36, 0x44, \n\t0x49, 0x7a, 0x71, 0x4f, 0x55, 0x59, 0x36, 0x7a, 0x61, 0x51, 0x77, 0x34, 0x72, 0x4b, 0x47, 0x55, 0x57, 0x5c, 0x0a,\n\t0x09, 0x75, 0x35, 0x6b, 0x68, 0x66, 0x65, 0x70, 0x73, 0x6e, 0x70, 0x31, 0x2b, 0x45, 0x57, 0x48, 0x58, 0x4f, \n\t0x48, 0x6b, 0x5a, 0x55, 0x78, 0x4d, 0x4d, 0x71, 0x6c, 0x6a, 0x38, 0x70, 0x7a, 0x71, 0x47, 0x48, 0x30, 0x71, \n\t0x7a, 0x44, 0x2f, 0x32, 0x64, 0x52, 0x61, 0x46, 0x67, 0x61, 0x69, 0x55, 0x39, 0x2f, 0x79, 0x70, 0x6c, 0x41, \n\t0x42, 0x50, 0x36, 0x66, 0x50, 0x79, 0x38, 0x45, 0x6c, 0x5a, 0x4f, 0x38, 0x78, 0x44, 0x36, 0x4e, 0x42, 0x5c, 0x0a,\n\t0x09, 0x59, 0x39, 0x33, 0x6b, 0x59, 0x4f, 0x51, 0x42, 0x4d, 0x2f, 0x30, 0x75, 0x6a, 0x7a, 0x44, 0x52, 0x6c, \n\t0x72, 0x4f, 0x4f, 0x4a, 0x48, 0x34, 0x38, 0x6a, 0x47, 0x69, 0x42, 0x6b, 0x58, 0x33, 0x78, 0x6d, 0x73, 0x75, \n\t0x7a, 0x44, 0x33, 0x53, 0x64, 0x59, 0x4a, 0x52, 0x63, 0x61, 0x78, 0x70, 0x71, 0x44, 0x78, 0x68, 0x4e, 0x76, \n\t0x73, 0x76, 0x6a, 0x75, 0x73, 0x46, 0x6f, 0x58, 0x50, 0x32, 0x4f, 0x47, 0x39, 0x61, 0x33, 0x65, 0x53, 0x5c, 0x0a,\n\t0x09, 0x34, 0x4b, 0x52, 0x6c, 0x72, 0x36, 0x77, 0x4d, 0x68, 0x65, 0x31, 0x77, 0x74, 0x47, 0x72, 0x30, 0x46, \n\t0x67, 0x38, 0x4a, 0x4a, 0x50, 0x73, 0x79, 0x68, 0x5a, 0x74, 0x45, 0x55, 0x45, 0x77, 0x6d, 0x73, 0x77, 0x61, \n\t0x38, 0x2f, 0x4b, 0x78, 0x2b, 0x36, 0x6e, 0x58, 0x74, 0x34, 0x52, 0x57, 0x55, 0x53, 0x4c, 0x67, 0x4e, 0x45, \n\t0x45, 0x57, 0x38, 0x36, 0x32, 0x7a, 0x72, 0x37, 0x47, 0x58, 0x49, 0x2b, 0x43, 0x6b, 0x51, 0x66, 0x65, 0x5c, 0x0a,\n\t0x09, 0x31, 0x44, 0x41, 0x79, 0x51, 0x46, 0x77, 0x6d, 0x6a, 0x4e, 0x70, 0x6b, 0x48, 0x43, 0x67, 0x57, 0x42, \n\t0x71, 0x4f, 0x57, 0x39, 0x46, 0x4e, 0x5a, 0x4c, 0x61, 0x6d, 0x4f, 0x75, 0x63, 0x41, 0x6f, 0x79, 0x71, 0x4d, \n\t0x50, 0x6a, 0x47, 0x7a, 0x38, 0x76, 0x47, 0x46, 0x6b, 0x30, 0x34, 0x2b, 0x44, 0x55, 0x64, 0x44, 0x58, 0x47, \n\t0x30, 0x61, 0x50, 0x49, 0x63, 0x55, 0x62, 0x46, 0x6d, 0x6b, 0x4e, 0x77, 0x54, 0x4a, 0x41, 0x42, 0x41, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x2f, 0x2f, 0x2b, 0x32, 0x64, 0x65, 0x62, 0x67, 0x6b, 0x56, 0x58, 0x33, 0x33, 0x50, 0x36, 0x65, \n\t0x36, 0x2b, 0x2f, 0x5a, 0x64, 0x42, 0x34, 0x5a, 0x64, 0x45, 0x42, 0x4b, 0x6a, 0x6b, 0x6d, 0x68, 0x4d, 0x52, \n\t0x46, 0x39, 0x66, 0x6f, 0x7a, 0x46, 0x76, 0x45, 0x74, 0x79, 0x4e, 0x6d, 0x4c, 0x68, 0x47, 0x6e, 0x2f, 0x64, \n\t0x31, 0x69, 0x55, 0x59, 0x4e, 0x71, 0x48, 0x6b, 0x31, 0x72, 0x30, 0x76, 0x69, 0x4c, 0x68, 0x6f, 0x31, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x72, 0x36, 0x76, 0x47, 0x67, 0x56, 0x63, 0x63, 0x4f, 0x58, 0x56, 0x4b, 0x45, 0x5a, 0x78, 0x41, \n\t0x52, 0x56, 0x52, 0x41, 0x51, 0x55, 0x46, 0x42, 0x41, 0x59, 0x51, 0x47, 0x4a, 0x5a, 0x68, 0x47, 0x62, 0x61, \n\t0x5a, 0x59, 0x59, 0x62, 0x5a, 0x37, 0x72, 0x31, 0x7a, 0x37, 0x2b, 0x33, 0x75, 0x71, 0x70, 0x4d, 0x2f, 0x61, \n\t0x75, 0x6c, 0x54, 0x56, 0x65, 0x64, 0x55, 0x56, 0x2f, 0x56, 0x61, 0x33, 0x66, 0x64, 0x38, 0x6e, 0x32, 0x5c, 0x0a,\n\t0x09, 0x65, 0x65, 0x57, 0x33, 0x58, 0x4f, 0x71, 0x56, 0x4e, 0x4c, 0x56, 0x33, 0x33, 0x6d, 0x64, 0x35, 0x62, \n\t0x36, 0x46, 0x70, 0x4c, 0x7a, 0x31, 0x51, 0x52, 0x76, 0x63, 0x62, 0x76, 0x2f, 0x4d, 0x48, 0x51, 0x44, 0x6f, \n\t0x79, 0x6a, 0x43, 0x4d, 0x63, 0x45, 0x49, 0x50, 0x59, 0x78, 0x53, 0x58, 0x6b, 0x5a, 0x46, 0x59, 0x5a, 0x53, \n\t0x45, 0x47, 0x66, 0x46, 0x79, 0x6a, 0x43, 0x47, 0x4d, 0x38, 0x6a, 0x62, 0x52, 0x31, 0x47, 0x33, 0x56, 0x5c, 0x0a,\n\t0x09, 0x39, 0x62, 0x37, 0x44, 0x79, 0x41, 0x77, 0x4b, 0x50, 0x59, 0x78, 0x79, 0x6e, 0x48, 0x73, 0x76, 0x4d, \n\t0x4e, 0x4c, 0x56, 0x46, 0x2b, 0x30, 0x37, 0x56, 0x43, 0x63, 0x59, 0x36, 0x59, 0x35, 0x6e, 0x68, 0x44, 0x43, \n\t0x4b, 0x37, 0x53, 0x38, 0x44, 0x4c, 0x75, 0x32, 0x38, 0x38, 0x34, 0x43, 0x31, 0x73, 0x51, 0x62, 0x52, 0x2f, \n\t0x4d, 0x6e, 0x52, 0x36, 0x4e, 0x6e, 0x58, 0x59, 0x6a, 0x2b, 0x57, 0x32, 0x30, 0x41, 0x75, 0x37, 0x30, 0x5c, 0x0a,\n\t0x09, 0x49, 0x47, 0x6f, 0x4e, 0x48, 0x43, 0x43, 0x50, 0x51, 0x77, 0x69, 0x72, 0x32, 0x68, 0x72, 0x34, 0x4f, \n\t0x52, 0x43, 0x67, 0x77, 0x59, 0x4f, 0x49, 0x77, 0x36, 0x62, 0x46, 0x42, 0x43, 0x41, 0x41, 0x41, 0x67, 0x41, \n\t0x45, 0x6c, 0x45, 0x51, 0x56, 0x52, 0x51, 0x79, 0x71, 0x48, 0x41, 0x53, 0x44, 0x32, 0x47, 0x69, 0x59, 0x47, \n\t0x52, 0x42, 0x6b, 0x36, 0x6a, 0x68, 0x4a, 0x47, 0x75, 0x76, 0x74, 0x69, 0x78, 0x36, 0x4f, 0x73, 0x63, 0x5c, 0x0a,\n\t0x09, 0x75, 0x5a, 0x66, 0x52, 0x4b, 0x47, 0x47, 0x55, 0x2b, 0x70, 0x30, 0x30, 0x39, 0x31, 0x39, 0x38, 0x48, \n\t0x33, 0x36, 0x7a, 0x37, 0x45, 0x2b, 0x33, 0x70, 0x2f, 0x50, 0x37, 0x71, 0x47, 0x46, 0x45, 0x52, 0x41, 0x44, \n\t0x66, 0x42, 0x52, 0x62, 0x56, 0x42, 0x47, 0x2f, 0x2f, 0x76, 0x59, 0x41, 0x77, 0x52, 0x30, 0x61, 0x4f, 0x38, \n\t0x67, 0x35, 0x61, 0x4a, 0x6f, 0x7a, 0x43, 0x48, 0x31, 0x58, 0x54, 0x4d, 0x5a, 0x30, 0x4c, 0x52, 0x69, 0x5c, 0x0a,\n\t0x09, 0x68, 0x6c, 0x2b, 0x77, 0x69, 0x6a, 0x36, 0x44, 0x6c, 0x4d, 0x33, 0x6d, 0x68, 0x5a, 0x30, 0x4c, 0x41, \n\t0x77, 0x30, 0x71, 0x36, 0x62, 0x59, 0x4a, 0x51, 0x62, 0x46, 0x4f, 0x6b, 0x36, 0x79, 0x77, 0x47, 0x6a, 0x35, \n\t0x4c, 0x45, 0x6b, 0x74, 0x2b, 0x6b, 0x56, 0x52, 0x73, 0x6c, 0x7a, 0x4b, 0x67, 0x79, 0x6a, 0x56, 0x61, 0x51, \n\t0x34, 0x50, 0x35, 0x6b, 0x34, 0x43, 0x41, 0x30, 0x4c, 0x52, 0x43, 0x76, 0x41, 0x32, 0x65, 0x6f, 0x50, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x5a, 0x64, 0x32, 0x67, 0x4e, 0x63, 0x43, 0x34, 0x51, 0x51, 0x50, 0x74, 0x7a, 0x44, 0x41, 0x53, \n\t0x41, 0x47, 0x4f, 0x46, 0x6b, 0x5a, 0x74, 0x79, 0x48, 0x51, 0x48, 0x49, 0x33, 0x55, 0x61, 0x77, 0x4f, 0x42, \n\t0x68, 0x4a, 0x4b, 0x48, 0x39, 0x77, 0x38, 0x64, 0x2b, 0x39, 0x7a, 0x47, 0x48, 0x55, 0x57, 0x6f, 0x35, 0x2f, \n\t0x53, 0x42, 0x61, 0x47, 0x4a, 0x6e, 0x42, 0x55, 0x56, 0x4a, 0x6a, 0x74, 0x66, 0x4f, 0x42, 0x4a, 0x65, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x39, 0x31, 0x45, 0x63, 0x4e, 0x48, 0x45, 0x52, 0x4b, 0x38, 0x2b, 0x78, 0x4c, 0x51, 0x50, 0x73, \n\t0x43, 0x53, 0x49, 0x6c, 0x63, 0x33, 0x42, 0x35, 0x46, 0x4f, 0x7a, 0x49, 0x41, 0x69, 0x78, 0x6c, 0x47, 0x69, \n\t0x59, 0x35, 0x71, 0x48, 0x59, 0x79, 0x69, 0x30, 0x53, 0x38, 0x54, 0x6a, 0x4e, 0x72, 0x70, 0x35, 0x62, 0x53, \n\t0x63, 0x68, 0x56, 0x52, 0x69, 0x46, 0x6f, 0x79, 0x45, 0x5a, 0x75, 0x4e, 0x52, 0x77, 0x53, 0x67, 0x46, 0x5c, 0x0a,\n\t0x09, 0x69, 0x72, 0x42, 0x69, 0x47, 0x53, 0x73, 0x7a, 0x65, 0x68, 0x67, 0x6c, 0x56, 0x6b, 0x63, 0x4e, 0x6f, \n\t0x39, 0x6a, 0x2b, 0x53, 0x67, 0x65, 0x6a, 0x62, 0x77, 0x46, 0x55, 0x2f, 0x6d, 0x77, 0x62, 0x67, 0x39, 0x61, \n\t0x77, 0x49, 0x69, 0x4b, 0x41, 0x53, 0x34, 0x45, 0x74, 0x51, 0x48, 0x51, 0x42, 0x76, 0x4c, 0x31, 0x33, 0x49, \n\t0x35, 0x78, 0x4b, 0x43, 0x6b, 0x5a, 0x41, 0x42, 0x78, 0x69, 0x4a, 0x61, 0x44, 0x33, 0x74, 0x5a, 0x61, 0x5c, 0x0a,\n\t0x09, 0x51, 0x41, 0x49, 0x77, 0x57, 0x6a, 0x4d, 0x42, 0x32, 0x30, 0x4d, 0x42, 0x4c, 0x30, 0x42, 0x69, 0x4e, \n\t0x42, 0x36, 0x73, 0x63, 0x64, 0x6a, 0x63, 0x76, 0x6a, 0x69, 0x47, 0x43, 0x6b, 0x48, 0x6b, 0x74, 0x70, 0x59, \n\t0x5a, 0x51, 0x2b, 0x52, 0x2b, 0x76, 0x79, 0x71, 0x42, 0x78, 0x54, 0x47, 0x30, 0x59, 0x74, 0x45, 0x70, 0x38, \n\t0x48, 0x47, 0x36, 0x53, 0x47, 0x43, 0x53, 0x49, 0x4a, 0x66, 0x45, 0x56, 0x64, 0x6b, 0x36, 0x74, 0x37, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x59, 0x32, 0x6c, 0x46, 0x49, 0x78, 0x45, 0x36, 0x46, 0x47, 0x45, 0x45, 0x67, 0x58, 0x70, 0x76, \n\t0x49, 0x79, 0x4d, 0x4d, 0x41, 0x71, 0x42, 0x70, 0x6b, 0x49, 0x6c, 0x76, 0x73, 0x31, 0x67, 0x59, 0x52, 0x54, \n\t0x2f, 0x6e, 0x36, 0x58, 0x30, 0x6c, 0x72, 0x4e, 0x4b, 0x64, 0x6b, 0x38, 0x77, 0x53, 0x68, 0x35, 0x4c, 0x37, \n\t0x47, 0x45, 0x63, 0x54, 0x78, 0x69, 0x74, 0x59, 0x35, 0x66, 0x48, 0x6e, 0x79, 0x4c, 0x46, 0x48, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x61, 0x6b, 0x6f, 0x59, 0x42, 0x49, 0x61, 0x5a, 0x36, 0x64, 0x68, 0x58, 0x70, 0x70, 0x4a, 0x58, 0x68, \n\t0x37, 0x37, 0x67, 0x4b, 0x45, 0x48, 0x6b, 0x5a, 0x52, 0x73, 0x36, 0x6b, 0x44, 0x6a, 0x45, 0x41, 0x50, 0x6f, \n\t0x31, 0x51, 0x66, 0x6a, 0x68, 0x35, 0x47, 0x73, 0x61, 0x62, 0x62, 0x65, 0x72, 0x53, 0x63, 0x6a, 0x54, 0x4e, \n\t0x69, 0x41, 0x44, 0x41, 0x4b, 0x62, 0x2f, 0x41, 0x42, 0x77, 0x55, 0x68, 0x64, 0x37, 0x77, 0x46, 0x47, 0x5c, 0x0a,\n\t0x09, 0x61, 0x55, 0x30, 0x75, 0x6a, 0x48, 0x4b, 0x38, 0x4a, 0x50, 0x74, 0x4e, 0x47, 0x45, 0x36, 0x7a, 0x54, \n\t0x44, 0x6d, 0x4b, 0x49, 0x55, 0x6c, 0x79, 0x4a, 0x38, 0x51, 0x4e, 0x30, 0x37, 0x77, 0x39, 0x64, 0x79, 0x58, \n\t0x67, 0x6f, 0x49, 0x47, 0x52, 0x32, 0x6d, 0x51, 0x62, 0x70, 0x63, 0x75, 0x6a, 0x43, 0x48, 0x35, 0x30, 0x44, \n\t0x59, 0x78, 0x69, 0x5a, 0x62, 0x71, 0x43, 0x55, 0x62, 0x77, 0x61, 0x43, 0x36, 0x4d, 0x4f, 0x2b, 0x31, 0x5c, 0x0a,\n\t0x09, 0x44, 0x4c, 0x64, 0x77, 0x32, 0x4b, 0x2b, 0x48, 0x71, 0x5a, 0x58, 0x42, 0x35, 0x54, 0x2b, 0x5a, 0x6e, \n\t0x51, 0x37, 0x41, 0x43, 0x6a, 0x31, 0x4c, 0x33, 0x55, 0x45, 0x55, 0x59, 0x74, 0x34, 0x42, 0x7a, 0x74, 0x66, \n\t0x54, 0x49, 0x67, 0x44, 0x51, 0x31, 0x45, 0x55, 0x56, 0x51, 0x6b, 0x4f, 0x54, 0x4f, 0x57, 0x34, 0x54, 0x62, \n\t0x77, 0x39, 0x74, 0x33, 0x6e, 0x76, 0x2b, 0x53, 0x61, 0x6d, 0x4d, 0x69, 0x59, 0x67, 0x6c, 0x45, 0x49, 0x5c, 0x0a,\n\t0x09, 0x48, 0x41, 0x4f, 0x4d, 0x32, 0x69, 0x36, 0x50, 0x41, 0x34, 0x52, 0x52, 0x2b, 0x4b, 0x4d, 0x6e, 0x59, \n\t0x43, 0x54, 0x44, 0x76, 0x47, 0x68, 0x37, 0x50, 0x59, 0x79, 0x43, 0x61, 0x36, 0x43, 0x55, 0x38, 0x2f, 0x4d, \n\t0x6d, 0x78, 0x2b, 0x56, 0x52, 0x71, 0x55, 0x73, 0x48, 0x52, 0x6b, 0x6a, 0x41, 0x4b, 0x4c, 0x6d, 0x61, 0x45, \n\t0x7a, 0x36, 0x70, 0x4f, 0x6a, 0x75, 0x73, 0x71, 0x2b, 0x58, 0x48, 0x42, 0x45, 0x59, 0x6a, 0x64, 0x48, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x38, 0x48, 0x78, 0x6e, 0x2f, 0x55, 0x4f, 0x71, 0x67, 0x4e, 0x64, 0x79, 0x49, 0x79, 0x4e, 0x65, \n\t0x33, 0x67, 0x4a, 0x6a, 0x58, 0x70, 0x4c, 0x66, 0x6e, 0x54, 0x73, 0x4b, 0x6d, 0x56, 0x32, 0x34, 0x59, 0x78, \n\t0x55, 0x43, 0x6a, 0x67, 0x31, 0x47, 0x79, 0x54, 0x42, 0x4a, 0x47, 0x43, 0x57, 0x67, 0x6c, 0x59, 0x51, 0x54, \n\t0x30, 0x5a, 0x44, 0x6b, 0x62, 0x62, 0x55, 0x63, 0x4d, 0x52, 0x6e, 0x32, 0x7a, 0x6e, 0x46, 0x58, 0x72, 0x5c, 0x0a,\n\t0x09, 0x69, 0x4d, 0x6e, 0x77, 0x49, 0x48, 0x55, 0x4a, 0x49, 0x2f, 0x4e, 0x2b, 0x77, 0x72, 0x79, 0x73, 0x68, \n\t0x34, 0x72, 0x32, 0x2b, 0x61, 0x55, 0x65, 0x34, 0x76, 0x69, 0x4a, 0x6c, 0x74, 0x76, 0x6c, 0x55, 0x63, 0x33, \n\t0x72, 0x64, 0x68, 0x39, 0x44, 0x67, 0x46, 0x47, 0x57, 0x65, 0x5a, 0x73, 0x57, 0x52, 0x6b, 0x46, 0x57, 0x47, \n\t0x6b, 0x62, 0x66, 0x41, 0x45, 0x48, 0x6c, 0x7a, 0x2b, 0x39, 0x4e, 0x37, 0x32, 0x4e, 0x41, 0x47, 0x67, 0x5c, 0x0a,\n\t0x09, 0x57, 0x49, 0x31, 0x70, 0x42, 0x38, 0x57, 0x55, 0x32, 0x51, 0x53, 0x2f, 0x63, 0x6a, 0x47, 0x79, 0x73, \n\t0x47, 0x47, 0x41, 0x6b, 0x39, 0x6a, 0x42, 0x4a, 0x44, 0x2b, 0x57, 0x6b, 0x59, 0x4b, 0x52, 0x44, 0x52, 0x77, \n\t0x69, 0x67, 0x52, 0x35, 0x53, 0x52, 0x68, 0x6c, 0x47, 0x78, 0x79, 0x70, 0x57, 0x44, 0x6b, 0x4a, 0x47, 0x37, \n\t0x43, 0x42, 0x49, 0x78, 0x55, 0x6f, 0x42, 0x57, 0x46, 0x6b, 0x62, 0x70, 0x64, 0x66, 0x4b, 0x47, 0x39, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x48, 0x72, 0x41, 0x53, 0x5a, 0x64, 0x4a, 0x70, 0x6e, 0x55, 0x42, 0x49, 0x35, 0x6d, 0x35, 0x6e, \n\t0x36, 0x68, 0x51, 0x59, 0x74, 0x74, 0x52, 0x77, 0x45, 0x6a, 0x4e, 0x55, 0x2f, 0x64, 0x68, 0x71, 0x4b, 0x38, \n\t0x77, 0x6a, 0x48, 0x51, 0x50, 0x62, 0x68, 0x63, 0x77, 0x69, 0x68, 0x33, 0x72, 0x49, 0x47, 0x42, 0x55, 0x4a, \n\t0x44, 0x4a, 0x71, 0x62, 0x36, 0x2f, 0x41, 0x61, 0x49, 0x33, 0x41, 0x42, 0x47, 0x32, 0x59, 0x47, 0x69, 0x5c, 0x0a,\n\t0x09, 0x71, 0x49, 0x35, 0x6b, 0x2b, 0x4a, 0x4f, 0x71, 0x30, 0x2f, 0x6e, 0x37, 0x79, 0x78, 0x76, 0x51, 0x65, \n\t0x32, 0x42, 0x49, 0x42, 0x4a, 0x77, 0x69, 0x69, 0x45, 0x6a, 0x73, 0x69, 0x47, 0x55, 0x51, 0x77, 0x32, 0x59, \n\t0x2b, 0x6a, 0x79, 0x71, 0x4d, 0x4a, 0x49, 0x76, 0x58, 0x6e, 0x79, 0x77, 0x45, 0x69, 0x72, 0x49, 0x6a, 0x44, \n\t0x53, 0x53, 0x48, 0x30, 0x6f, 0x55, 0x77, 0x2b, 0x41, 0x72, 0x76, 0x77, 0x67, 0x59, 0x46, 0x52, 0x67, 0x5c, 0x0a,\n\t0x09, 0x48, 0x38, 0x6e, 0x39, 0x78, 0x66, 0x61, 0x68, 0x4b, 0x52, 0x4f, 0x75, 0x39, 0x77, 0x77, 0x6a, 0x77, \n\t0x7a, 0x35, 0x4e, 0x2b, 0x30, 0x68, 0x74, 0x31, 0x32, 0x38, 0x59, 0x69, 0x56, 0x35, 0x68, 0x64, 0x4a, 0x36, \n\t0x55, 0x59, 0x68, 0x39, 0x44, 0x31, 0x69, 0x67, 0x69, 0x49, 0x6f, 0x41, 0x62, 0x67, 0x55, 0x76, 0x55, 0x48, \n\t0x38, 0x58, 0x62, 0x63, 0x32, 0x64, 0x77, 0x4a, 0x52, 0x77, 0x74, 0x6a, 0x47, 0x51, 0x41, 0x45, 0x61, 0x5c, 0x0a,\n\t0x09, 0x48, 0x43, 0x78, 0x4f, 0x54, 0x79, 0x4b, 0x4d, 0x51, 0x41, 0x58, 0x52, 0x35, 0x4e, 0x4d, 0x49, 0x72, \n\t0x6e, 0x64, 0x77, 0x57, 0x6a, 0x53, 0x43, 0x56, 0x7a, 0x65, 0x57, 0x52, 0x55, 0x4d, 0x4e, 0x49, 0x63, 0x31, \n\t0x7a, 0x42, 0x67, 0x70, 0x4f, 0x34, 0x75, 0x37, 0x34, 0x54, 0x48, 0x33, 0x50, 0x74, 0x77, 0x52, 0x67, 0x4f, \n\t0x6a, 0x31, 0x50, 0x36, 0x4d, 0x4d, 0x50, 0x6f, 0x6d, 0x43, 0x43, 0x6f, 0x6e, 0x33, 0x6d, 0x50, 0x65, 0x5c, 0x0a,\n\t0x09, 0x66, 0x67, 0x41, 0x61, 0x4f, 0x6f, 0x69, 0x55, 0x71, 0x4f, 0x69, 0x7a, 0x51, 0x50, 0x74, 0x69, 0x74, \n\t0x74, 0x62, 0x77, 0x39, 0x74, 0x38, 0x44, 0x6a, 0x6b, 0x4d, 0x30, 0x5a, 0x4b, 0x2b, 0x46, 0x6b, 0x5a, 0x4d, \n\t0x4e, 0x49, 0x78, 0x56, 0x49, 0x6d, 0x53, 0x36, 0x50, 0x42, 0x68, 0x68, 0x46, 0x7a, 0x62, 0x30, 0x73, 0x47, \n\t0x4e, 0x45, 0x42, 0x52, 0x6e, 0x51, 0x48, 0x6f, 0x31, 0x69, 0x45, 0x55, 0x7a, 0x4b, 0x58, 0x52, 0x30, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x45, 0x6f, 0x39, 0x54, 0x78, 0x64, 0x59, 0x4a, 0x52, 0x63, 0x72, 0x31, 0x54, 0x31, 0x44, 0x4b, \n\t0x42, 0x4d, 0x4e, 0x4a, 0x47, 0x53, 0x53, 0x6b, 0x59, 0x4c, 0x54, 0x4f, 0x43, 0x5a, 0x6c, 0x6d, 0x30, 0x39, \n\t0x78, 0x48, 0x70, 0x6d, 0x78, 0x44, 0x30, 0x7a, 0x41, 0x63, 0x58, 0x30, 0x39, 0x74, 0x35, 0x69, 0x77, 0x38, \n\t0x57, 0x4a, 0x2b, 0x79, 0x55, 0x37, 0x68, 0x46, 0x47, 0x6b, 0x67, 0x34, 0x77, 0x49, 0x68, 0x74, 0x47, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x47, 0x43, 0x55, 0x75, 0x50, 0x46, 0x54, 0x4d, 0x46, 0x4a, 0x75, 0x31, 0x46, 0x69, 0x5a, 0x6f, \n\t0x6a, 0x44, 0x43, 0x77, 0x6b, 0x68, 0x33, 0x58, 0x4b, 0x6d, 0x48, 0x4b, 0x6c, 0x6d, 0x6d, 0x77, 0x2f, 0x35, \n\t0x31, 0x64, 0x51, 0x34, 0x45, 0x52, 0x6b, 0x6c, 0x31, 0x67, 0x4a, 0x47, 0x75, 0x66, 0x4f, 0x78, 0x34, 0x42, \n\t0x67, 0x36, 0x6a, 0x63, 0x30, 0x45, 0x63, 0x36, 0x48, 0x52, 0x55, 0x67, 0x39, 0x41, 0x6f, 0x51, 0x62, 0x5c, 0x0a,\n\t0x09, 0x51, 0x4b, 0x66, 0x43, 0x46, 0x61, 0x6b, 0x2f, 0x6a, 0x57, 0x49, 0x43, 0x74, 0x37, 0x30, 0x7a, 0x43, \n\t0x4b, 0x6d, 0x6d, 0x51, 0x6d, 0x47, 0x4b, 0x47, 0x48, 0x55, 0x64, 0x67, 0x63, 0x45, 0x37, 0x31, 0x61, 0x7a, \n\t0x67, 0x6f, 0x39, 0x6a, 0x47, 0x49, 0x64, 0x30, 0x68, 0x6f, 0x59, 0x42, 0x66, 0x6d, 0x64, 0x59, 0x59, 0x51, \n\t0x42, 0x52, 0x73, 0x6b, 0x62, 0x72, 0x37, 0x32, 0x35, 0x46, 0x68, 0x70, 0x6c, 0x67, 0x6c, 0x46, 0x71, 0x5c, 0x0a,\n\t0x09, 0x32, 0x2b, 0x35, 0x67, 0x5a, 0x44, 0x79, 0x75, 0x73, 0x59, 0x43, 0x52, 0x34, 0x66, 0x71, 0x61, 0x59, \n\t0x4e, 0x54, 0x70, 0x39, 0x78, 0x67, 0x59, 0x6a, 0x43, 0x4a, 0x39, 0x41, 0x77, 0x54, 0x56, 0x4a, 0x39, 0x2b, \n\t0x6c, 0x4f, 0x59, 0x37, 0x42, 0x61, 0x69, 0x51, 0x67, 0x55, 0x70, 0x70, 0x6e, 0x70, 0x36, 0x50, 0x2b, 0x46, \n\t0x42, 0x4b, 0x38, 0x58, 0x62, 0x66, 0x34, 0x38, 0x34, 0x52, 0x55, 0x47, 0x41, 0x57, 0x51, 0x45, 0x55, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x45, 0x6c, 0x50, 0x59, 0x79, 0x49, 0x67, 0x36, 0x61, 0x5a, 0x48, 0x53, 0x55, 0x43, 0x53, 0x4d, \n\t0x56, 0x4b, 0x6a, 0x6f, 0x59, 0x46, 0x58, 0x42, 0x35, 0x7a, 0x4c, 0x53, 0x63, 0x42, 0x54, 0x32, 0x4d, 0x41, \n\t0x75, 0x42, 0x31, 0x44, 0x61, 0x4d, 0x45, 0x45, 0x4d, 0x73, 0x41, 0x6f, 0x30, 0x36, 0x67, 0x79, 0x41, 0x6d, \n\t0x6a, 0x69, 0x58, 0x52, 0x35, 0x54, 0x44, 0x61, 0x4a, 0x52, 0x67, 0x34, 0x6a, 0x42, 0x32, 0x41, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x38, 0x41, 0x50, 0x4e, 0x7a, 0x6f, 0x65, 0x69, 0x55, 0x55, 0x5a, 0x45, 0x41, 0x48, 0x65, 0x51, 0x4f, \n\t0x48, 0x6e, 0x76, 0x67, 0x64, 0x76, 0x42, 0x62, 0x52, 0x68, 0x67, 0x35, 0x4c, 0x51, 0x66, 0x56, 0x69, 0x32, \n\t0x4d, 0x45, 0x71, 0x41, 0x78, 0x77, 0x53, 0x69, 0x4b, 0x63, 0x45, 0x77, 0x77, 0x51, 0x67, 0x2b, 0x6a, 0x4b, \n\t0x4b, 0x30, 0x44, 0x6a, 0x4e, 0x61, 0x44, 0x79, 0x79, 0x50, 0x4b, 0x2b, 0x5a, 0x67, 0x30, 0x45, 0x68, 0x5c, 0x0a,\n\t0x09, 0x69, 0x5a, 0x51, 0x61, 0x47, 0x48, 0x55, 0x59, 0x35, 0x7a, 0x37, 0x77, 0x56, 0x47, 0x75, 0x76, 0x71, \n\t0x69, 0x66, 0x59, 0x66, 0x4b, 0x41, 0x36, 0x4e, 0x6b, 0x66, 0x74, 0x39, 0x68, 0x39, 0x44, 0x32, 0x6b, 0x57, \n\t0x4d, 0x76, 0x65, 0x38, 0x65, 0x41, 0x30, 0x4d, 0x68, 0x41, 0x70, 0x55, 0x64, 0x47, 0x6e, 0x59, 0x68, 0x6d, \n\t0x65, 0x69, 0x37, 0x64, 0x72, 0x53, 0x78, 0x44, 0x39, 0x43, 0x44, 0x32, 0x4d, 0x51, 0x74, 0x4d, 0x30, 0x5c, 0x0a,\n\t0x09, 0x52, 0x44, 0x61, 0x4d, 0x51, 0x41, 0x2b, 0x6a, 0x61, 0x4e, 0x6b, 0x45, 0x49, 0x32, 0x58, 0x62, 0x71, \n\t0x49, 0x34, 0x42, 0x77, 0x67, 0x69, 0x6c, 0x48, 0x41, 0x71, 0x4d, 0x6f, 0x6e, 0x4a, 0x45, 0x65, 0x61, 0x57, \n\t0x45, 0x55, 0x64, 0x37, 0x2b, 0x6f, 0x73, 0x53, 0x32, 0x30, 0x58, 0x6f, 0x5a, 0x59, 0x64, 0x53, 0x68, 0x7a, \n\t0x70, 0x48, 0x62, 0x68, 0x2f, 0x51, 0x66, 0x52, 0x6c, 0x38, 0x46, 0x51, 0x66, 0x58, 0x4a, 0x64, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x49, 0x4b, 0x6a, 0x54, 0x6f, 0x69, 0x41, 0x76, 0x67, 0x78, 0x63, 0x4a, 0x75, 0x61, 0x34, 0x4f, 0x33, \n\t0x59, 0x44, 0x49, 0x51, 0x76, 0x77, 0x67, 0x59, 0x58, 0x58, 0x41, 0x65, 0x6a, 0x41, 0x43, 0x4a, 0x47, 0x47, \n\t0x45, 0x55, 0x75, 0x6a, 0x37, 0x33, 0x41, 0x53, 0x41, 0x58, 0x61, 0x6b, 0x47, 0x45, 0x55, 0x50, 0x59, 0x63, \n\t0x5a, 0x4d, 0x49, 0x70, 0x74, 0x71, 0x2f, 0x34, 0x4e, 0x6a, 0x30, 0x46, 0x54, 0x4e, 0x46, 0x6b, 0x75, 0x5c, 0x0a,\n\t0x09, 0x31, 0x4e, 0x42, 0x67, 0x70, 0x49, 0x48, 0x54, 0x4b, 0x47, 0x47, 0x6b, 0x71, 0x79, 0x39, 0x32, 0x4c, \n\t0x50, 0x6f, 0x36, 0x4a, 0x77, 0x68, 0x47, 0x4f, 0x34, 0x41, 0x4c, 0x47, 0x4b, 0x48, 0x4b, 0x41, 0x43, 0x49, \n\t0x50, 0x4f, 0x45, 0x31, 0x4e, 0x6b, 0x49, 0x33, 0x6c, 0x34, 0x4b, 0x33, 0x38, 0x69, 0x67, 0x2b, 0x63, 0x38, \n\t0x4e, 0x32, 0x79, 0x4c, 0x42, 0x69, 0x70, 0x67, 0x46, 0x6c, 0x50, 0x6c, 0x72, 0x4f, 0x78, 0x65, 0x33, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x51, 0x4d, 0x44, 0x4a, 0x6f, 0x55, 0x6d, 0x43, 0x55, 0x47, 0x78, 0x54, 0x70, 0x4f, 0x73, 0x73, \n\t0x42, 0x6f, 0x2b, 0x53, 0x78, 0x4a, 0x4c, 0x66, 0x70, 0x43, 0x4b, 0x4f, 0x76, 0x49, 0x6e, 0x45, 0x5a, 0x6f, \n\t0x55, 0x59, 0x4b, 0x49, 0x71, 0x56, 0x35, 0x39, 0x67, 0x56, 0x67, 0x53, 0x63, 0x31, 0x7a, 0x74, 0x31, 0x38, \n\t0x66, 0x51, 0x43, 0x51, 0x42, 0x6f, 0x37, 0x43, 0x35, 0x6c, 0x6f, 0x53, 0x52, 0x47, 0x4a, 0x62, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x62, 0x44, 0x75, 0x39, 0x6e, 0x43, 0x36, 0x50, 0x42, 0x57, 0x47, 0x55, 0x6d, 0x43, 0x34, 0x51, 0x6e, \n\t0x55, 0x4e, 0x65, 0x39, 0x52, 0x74, 0x47, 0x71, 0x65, 0x58, 0x30, 0x67, 0x32, 0x68, 0x68, 0x6c, 0x4c, 0x55, \n\t0x2f, 0x35, 0x66, 0x64, 0x50, 0x31, 0x70, 0x6e, 0x61, 0x5a, 0x37, 0x54, 0x64, 0x57, 0x53, 0x43, 0x6f, 0x50, \n\t0x75, 0x56, 0x32, 0x52, 0x71, 0x55, 0x79, 0x52, 0x45, 0x51, 0x41, 0x2b, 0x34, 0x44, 0x50, 0x71, 0x77, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x79, 0x36, 0x58, 0x37, 0x6b, 0x38, 0x73, 0x34, 0x30, 0x6a, 0x49, 0x51, 0x43, 0x43, 0x52, 0x32, \n\t0x4d, 0x6c, 0x44, 0x6c, 0x41, 0x58, 0x62, 0x6b, 0x38, 0x78, 0x76, 0x4a, 0x30, 0x4d, 0x41, 0x72, 0x54, 0x51, \n\t0x51, 0x73, 0x6a, 0x51, 0x57, 0x38, 0x77, 0x45, 0x76, 0x51, 0x42, 0x52, 0x70, 0x42, 0x4b, 0x4e, 0x4d, 0x45, \n\t0x6f, 0x31, 0x69, 0x6d, 0x75, 0x70, 0x6f, 0x38, 0x49, 0x52, 0x75, 0x71, 0x78, 0x71, 0x41, 0x39, 0x75, 0x5c, 0x0a,\n\t0x09, 0x71, 0x59, 0x7a, 0x56, 0x53, 0x4b, 0x32, 0x50, 0x46, 0x45, 0x61, 0x4a, 0x2b, 0x55, 0x41, 0x46, 0x58, \n\t0x52, 0x36, 0x76, 0x51, 0x33, 0x49, 0x4e, 0x49, 0x39, 0x62, 0x49, 0x51, 0x61, 0x52, 0x45, 0x52, 0x5a, 0x2f, \n\t0x41, 0x62, 0x36, 0x5a, 0x46, 0x63, 0x72, 0x64, 0x64, 0x35, 0x39, 0x2b, 0x59, 0x57, 0x68, 0x6a, 0x46, 0x35, \n\t0x77, 0x31, 0x4e, 0x6e, 0x73, 0x74, 0x6a, 0x65, 0x42, 0x57, 0x36, 0x67, 0x5a, 0x46, 0x36, 0x30, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x59, 0x43, 0x49, 0x30, 0x31, 0x5a, 0x6b, 0x2f, 0x6f, 0x46, 0x6f, 0x2b, 0x53, 0x78, 0x78, 0x42, 0x37, \n\t0x47, 0x4d, 0x73, 0x45, 0x6f, 0x66, 0x59, 0x37, 0x6c, 0x73, 0x35, 0x78, 0x4e, 0x37, 0x69, 0x2b, 0x6f, 0x4d, \n\t0x31, 0x36, 0x48, 0x48, 0x77, 0x30, 0x39, 0x39, 0x54, 0x5a, 0x47, 0x71, 0x5a, 0x47, 0x44, 0x53, 0x4e, 0x45, \n\t0x64, 0x77, 0x44, 0x6c, 0x71, 0x67, 0x72, 0x66, 0x37, 0x44, 0x6d, 0x54, 0x6a, 0x67, 0x42, 0x4b, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x36, 0x47, 0x44, 0x55, 0x37, 0x76, 0x66, 0x4a, 0x64, 0x48, 0x6e, 0x73, 0x46, 0x6b, 0x5a, 0x71, 0x46, \n\t0x41, 0x51, 0x55, 0x67, 0x6c, 0x45, 0x4d, 0x59, 0x6e, 0x51, 0x42, 0x6f, 0x7a, 0x5a, 0x77, 0x2f, 0x4b, 0x78, \n\t0x68, 0x77, 0x36, 0x67, 0x44, 0x55, 0x44, 0x49, 0x30, 0x56, 0x73, 0x5a, 0x71, 0x71, 0x58, 0x30, 0x59, 0x36, \n\t0x73, 0x73, 0x42, 0x6f, 0x37, 0x53, 0x43, 0x33, 0x7a, 0x66, 0x56, 0x37, 0x35, 0x56, 0x33, 0x48, 0x77, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x46, 0x6b, 0x55, 0x63, 0x77, 0x57, 0x6a, 0x5a, 0x71, 0x6c, 0x51, 0x4a, 0x45, 0x53, 0x6c, 0x54, \n\t0x30, 0x38, 0x56, 0x69, 0x47, 0x6c, 0x48, 0x6a, 0x62, 0x72, 0x76, 0x50, 0x68, 0x45, 0x59, 0x32, 0x67, 0x47, \n\t0x57, 0x41, 0x55, 0x41, 0x4b, 0x5a, 0x55, 0x6c, 0x72, 0x4f, 0x6f, 0x36, 0x63, 0x4f, 0x41, 0x55, 0x61, 0x78, \n\t0x6f, 0x34, 0x70, 0x69, 0x48, 0x41, 0x4b, 0x4e, 0x6b, 0x68, 0x44, 0x42, 0x75, 0x4d, 0x46, 0x4c, 0x58, 0x5c, 0x0a,\n\t0x09, 0x75, 0x34, 0x52, 0x52, 0x6d, 0x59, 0x7a, 0x56, 0x55, 0x76, 0x6e, 0x70, 0x33, 0x2b, 0x49, 0x43, 0x59, \n\t0x44, 0x68, 0x65, 0x73, 0x42, 0x31, 0x55, 0x43, 0x68, 0x41, 0x70, 0x75, 0x67, 0x53, 0x34, 0x55, 0x6b, 0x31, \n\t0x77, 0x64, 0x39, 0x77, 0x49, 0x62, 0x69, 0x73, 0x42, 0x49, 0x35, 0x45, 0x4a, 0x49, 0x33, 0x57, 0x34, 0x76, \n\t0x70, 0x53, 0x57, 0x73, 0x78, 0x41, 0x30, 0x33, 0x59, 0x4b, 0x38, 0x57, 0x4d, 0x54, 0x56, 0x47, 0x55, 0x5c, 0x0a,\n\t0x09, 0x62, 0x2b, 0x39, 0x69, 0x6a, 0x6c, 0x2f, 0x4c, 0x79, 0x2b, 0x75, 0x54, 0x77, 0x6d, 0x59, 0x53, 0x51, \n\t0x6f, 0x42, 0x34, 0x79, 0x69, 0x67, 0x79, 0x45, 0x42, 0x6f, 0x2b, 0x52, 0x71, 0x6e, 0x2b, 0x41, 0x7a, 0x41, \n\t0x54, 0x44, 0x71, 0x4d, 0x4b, 0x7a, 0x2f, 0x46, 0x59, 0x44, 0x71, 0x30, 0x32, 0x37, 0x56, 0x48, 0x4f, 0x39, \n\t0x77, 0x56, 0x52, 0x6f, 0x51, 0x7a, 0x5a, 0x39, 0x79, 0x59, 0x58, 0x69, 0x52, 0x50, 0x68, 0x72, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x38, 0x46, 0x70, 0x2b, 0x58, 0x35, 0x46, 0x54, 0x56, 0x57, 0x43, 0x6b, 0x51, 0x45, 0x51, 0x44, 0x6f, \n\t0x34, 0x6c, 0x78, 0x65, 0x54, 0x54, 0x41, 0x71, 0x47, 0x38, 0x75, 0x6a, 0x31, 0x6b, 0x77, 0x30, 0x71, 0x32, \n\t0x50, 0x47, 0x6b, 0x61, 0x70, 0x68, 0x7a, 0x68, 0x2b, 0x6f, 0x74, 0x62, 0x6c, 0x73, 0x52, 0x43, 0x4d, 0x46, \n\t0x73, 0x48, 0x35, 0x54, 0x6e, 0x71, 0x66, 0x6f, 0x31, 0x46, 0x70, 0x51, 0x42, 0x52, 0x4a, 0x38, 0x70, 0x5c, 0x0a,\n\t0x09, 0x38, 0x6b, 0x4a, 0x6a, 0x69, 0x36, 0x39, 0x31, 0x30, 0x4c, 0x30, 0x6b, 0x76, 0x42, 0x4b, 0x41, 0x6b, \n\t0x63, 0x4d, 0x34, 0x78, 0x47, 0x37, 0x66, 0x4a, 0x6f, 0x67, 0x70, 0x48, 0x54, 0x47, 0x55, 0x62, 0x52, 0x64, \n\t0x68, 0x53, 0x44, 0x6b, 0x62, 0x4a, 0x70, 0x59, 0x69, 0x47, 0x78, 0x6a, 0x41, 0x45, 0x53, 0x68, 0x68, 0x75, \n\t0x30, 0x53, 0x78, 0x68, 0x31, 0x33, 0x4c, 0x5a, 0x54, 0x2f, 0x38, 0x31, 0x45, 0x77, 0x45, 0x67, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x65, 0x64, 0x33, 0x75, 0x49, 0x2f, 0x48, 0x49, 0x64, 0x67, 0x2b, 0x6a, 0x62, 0x79, 0x45, 0x35, 0x59, \n\t0x45, 0x46, 0x6b, 0x6c, 0x6f, 0x74, 0x4d, 0x52, 0x45, 0x57, 0x74, 0x56, 0x62, 0x7a, 0x74, 0x31, 0x77, 0x4e, \n\t0x43, 0x44, 0x36, 0x50, 0x59, 0x73, 0x48, 0x34, 0x50, 0x4c, 0x6f, 0x38, 0x6d, 0x47, 0x4d, 0x57, 0x47, 0x38, \n\t0x44, 0x55, 0x77, 0x53, 0x69, 0x35, 0x72, 0x59, 0x61, 0x51, 0x43, 0x53, 0x77, 0x4f, 0x6a, 0x71, 0x45, 0x5c, 0x0a,\n\t0x09, 0x77, 0x43, 0x52, 0x6d, 0x70, 0x30, 0x56, 0x51, 0x52, 0x47, 0x6d, 0x61, 0x2b, 0x43, 0x4b, 0x4d, 0x75, \n\t0x70, 0x42, 0x35, 0x78, 0x30, 0x6d, 0x61, 0x53, 0x36, 0x67, 0x4e, 0x46, 0x34, 0x75, 0x44, 0x79, 0x53, 0x79, \n\t0x46, 0x50, 0x33, 0x6b, 0x56, 0x68, 0x48, 0x57, 0x52, 0x38, 0x32, 0x6a, 0x4c, 0x4b, 0x38, 0x71, 0x5a, 0x50, \n\t0x62, 0x6d, 0x32, 0x48, 0x30, 0x5a, 0x59, 0x44, 0x71, 0x30, 0x32, 0x36, 0x6d, 0x44, 0x43, 0x6f, 0x56, 0x5c, 0x0a,\n\t0x09, 0x69, 0x4f, 0x5a, 0x66, 0x46, 0x33, 0x56, 0x61, 0x66, 0x78, 0x6e, 0x4a, 0x44, 0x6a, 0x58, 0x50, 0x76, \n\t0x65, 0x64, 0x71, 0x42, 0x51, 0x69, 0x4f, 0x41, 0x55, 0x59, 0x68, 0x57, 0x50, 0x51, 0x77, 0x61, 0x72, 0x73, \n\t0x38, 0x35, 0x72, 0x53, 0x63, 0x54, 0x58, 0x6f, 0x5a, 0x52, 0x63, 0x32, 0x70, 0x62, 0x6d, 0x43, 0x55, 0x6a, \n\t0x4a, 0x34, 0x53, 0x4d, 0x49, 0x70, 0x4a, 0x42, 0x79, 0x4d, 0x52, 0x5a, 0x57, 0x58, 0x43, 0x53, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x6a, 0x63, 0x4a, 0x61, 0x7a, 0x75, 0x76, 0x30, 0x5a, 0x4e, 0x48, 0x49, 0x59, 0x61, 0x59, 0x34, \n\t0x2f, 0x45, 0x30, 0x62, 0x4a, 0x50, 0x48, 0x55, 0x66, 0x70, 0x6a, 0x6f, 0x31, 0x4d, 0x46, 0x4a, 0x33, 0x6c, \n\t0x77, 0x74, 0x47, 0x68, 0x6e, 0x32, 0x61, 0x39, 0x70, 0x48, 0x61, 0x72, 0x68, 0x43, 0x4d, 0x62, 0x67, 0x4e, \n\t0x78, 0x4d, 0x53, 0x56, 0x53, 0x71, 0x55, 0x43, 0x6b, 0x61, 0x41, 0x58, 0x34, 0x65, 0x4f, 0x77, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x58, 0x6c, 0x76, 0x45, 0x32, 0x33, 0x6d, 0x7a, 0x4d, 0x73, 0x75, 0x36, 0x41, 0x34, 0x7a, 0x36, 0x59, \n\t0x54, 0x6d, 0x4c, 0x42, 0x6b, 0x62, 0x43, 0x61, 0x64, 0x2b, 0x38, 0x57, 0x54, 0x41, 0x4b, 0x6d, 0x6c, 0x4d, \n\t0x54, 0x34, 0x66, 0x4b, 0x59, 0x46, 0x7a, 0x6f, 0x6d, 0x72, 0x55, 0x63, 0x59, 0x64, 0x54, 0x76, 0x37, 0x4f, \n\t0x76, 0x63, 0x2b, 0x6e, 0x46, 0x35, 0x67, 0x39, 0x41, 0x55, 0x70, 0x6b, 0x63, 0x62, 0x2f, 0x5a, 0x45, 0x5c, 0x0a,\n\t0x09, 0x61, 0x67, 0x30, 0x6f, 0x46, 0x49, 0x69, 0x59, 0x6f, 0x2b, 0x44, 0x65, 0x78, 0x58, 0x4c, 0x37, 0x61, \n\t0x37, 0x39, 0x58, 0x4b, 0x69, 0x79, 0x59, 0x73, 0x68, 0x6a, 0x42, 0x51, 0x41, 0x78, 0x57, 0x44, 0x55, 0x4c, \n\t0x38, 0x74, 0x5a, 0x69, 0x52, 0x35, 0x47, 0x43, 0x6d, 0x79, 0x30, 0x4d, 0x46, 0x4a, 0x47, 0x36, 0x45, 0x62, \n\t0x72, 0x38, 0x6a, 0x68, 0x41, 0x47, 0x42, 0x55, 0x42, 0x56, 0x42, 0x6c, 0x68, 0x6c, 0x44, 0x71, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x54, 0x6a, 0x42, 0x4b, 0x72, 0x6f, 0x38, 0x6c, 0x6a, 0x46, 0x7a, 0x67, 0x69, 0x79, 0x43, 0x6f, 0x50, \n\t0x76, 0x30, 0x6d, 0x79, 0x71, 0x4c, 0x53, 0x67, 0x55, 0x6a, 0x52, 0x58, 0x75, 0x41, 0x4d, 0x49, 0x4c, 0x72, \n\t0x59, 0x63, 0x6d, 0x55, 0x50, 0x37, 0x76, 0x30, 0x33, 0x2b, 0x57, 0x42, 0x51, 0x52, 0x39, 0x41, 0x55, 0x79, \n\t0x4b, 0x52, 0x67, 0x4e, 0x44, 0x59, 0x75, 0x6a, 0x77, 0x59, 0x59, 0x52, 0x58, 0x4f, 0x4d, 0x31, 0x44, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x46, 0x59, 0x63, 0x53, 0x36, 0x68, 0x6c, 0x46, 0x62, 0x69, 0x58, 0x58, 0x74, 0x75, 0x32, 0x35, \n\t0x5a, 0x4d, 0x43, 0x6f, 0x4b, 0x69, 0x76, 0x51, 0x2b, 0x53, 0x6d, 0x41, 0x35, 0x65, 0x78, 0x35, 0x53, 0x6c, \n\t0x47, 0x4c, 0x75, 0x6b, 0x4b, 0x70, 0x53, 0x67, 0x6b, 0x69, 0x4a, 0x69, 0x6a, 0x36, 0x42, 0x62, 0x79, 0x6b, \n\t0x62, 0x58, 0x57, 0x78, 0x33, 0x36, 0x36, 0x38, 0x43, 0x79, 0x43, 0x52, 0x67, 0x46, 0x4c, 0x32, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x37, 0x2b, 0x68, 0x68, 0x56, 0x42, 0x61, 0x58, 0x78, 0x30, 0x77, 0x59, 0x30, 0x59, 0x61, 0x52, 0x49, \n\t0x4a, 0x58, 0x66, 0x47, 0x55, 0x59, 0x59, 0x59, 0x42, 0x52, 0x47, 0x42, 0x35, 0x31, 0x67, 0x70, 0x42, 0x78, \n\t0x44, 0x57, 0x57, 0x43, 0x55, 0x32, 0x72, 0x59, 0x34, 0x6a, 0x49, 0x71, 0x37, 0x50, 0x42, 0x61, 0x46, 0x55, \n\t0x56, 0x4c, 0x39, 0x68, 0x70, 0x45, 0x75, 0x6d, 0x6c, 0x50, 0x54, 0x6e, 0x4d, 0x7a, 0x39, 0x4a, 0x63, 0x5c, 0x0a,\n\t0x09, 0x71, 0x66, 0x43, 0x59, 0x4c, 0x61, 0x4d, 0x7a, 0x62, 0x72, 0x44, 0x6e, 0x78, 0x6b, 0x4b, 0x69, 0x57, \n\t0x49, 0x46, 0x47, 0x30, 0x44, 0x50, 0x71, 0x4d, 0x6d, 0x79, 0x41, 0x4f, 0x37, 0x38, 0x58, 0x62, 0x65, 0x54, \n\t0x4e, 0x54, 0x2f, 0x6b, 0x34, 0x52, 0x52, 0x30, 0x47, 0x51, 0x54, 0x51, 0x57, 0x65, 0x7a, 0x30, 0x65, 0x58, \n\t0x52, 0x43, 0x4b, 0x4d, 0x45, 0x61, 0x41, 0x59, 0x42, 0x49, 0x7a, 0x44, 0x41, 0x53, 0x49, 0x31, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x73, 0x6d, 0x41, 0x45, 0x65, 0x68, 0x67, 0x46, 0x30, 0x56, 0x66, 0x58, 0x4d, 0x45, 0x6f, 0x41, 0x63, \n\t0x5a, 0x67, 0x77, 0x4d, 0x70, 0x62, 0x74, 0x41, 0x49, 0x71, 0x42, 0x77, 0x63, 0x68, 0x51, 0x76, 0x67, 0x67, \n\t0x6f, 0x42, 0x67, 0x32, 0x6a, 0x57, 0x42, 0x31, 0x35, 0x59, 0x4d, 0x52, 0x39, 0x6a, 0x4e, 0x41, 0x4f, 0x4e, \n\t0x6b, 0x75, 0x6c, 0x42, 0x5a, 0x45, 0x53, 0x46, 0x58, 0x32, 0x45, 0x52, 0x46, 0x54, 0x55, 0x75, 0x75, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x53, 0x59, 0x69, 0x4e, 0x6a, 0x57, 0x68, 0x68, 0x56, 0x4f, 0x73, 0x4d, 0x49, 0x65, 0x6f, 0x4e, \n\t0x52, 0x46, 0x4f, 0x47, 0x59, 0x59, 0x49, 0x51, 0x65, 0x52, 0x6c, 0x46, 0x61, 0x74, 0x7a, 0x42, 0x4b, 0x77, \n\t0x6f, 0x78, 0x34, 0x4f, 0x63, 0x59, 0x51, 0x52, 0x6e, 0x6d, 0x62, 0x61, 0x4c, 0x72, 0x39, 0x44, 0x41, 0x52, \n\t0x47, 0x5a, 0x6c, 0x41, 0x55, 0x67, 0x6c, 0x46, 0x47, 0x6e, 0x63, 0x4f, 0x33, 0x6e, 0x42, 0x57, 0x66, 0x5c, 0x0a,\n\t0x09, 0x67, 0x39, 0x48, 0x36, 0x44, 0x70, 0x6c, 0x55, 0x57, 0x68, 0x41, 0x70, 0x69, 0x6b, 0x64, 0x46, 0x45, \n\t0x75, 0x54, 0x79, 0x7a, 0x76, 0x61, 0x6e, 0x68, 0x30, 0x4b, 0x49, 0x5a, 0x4d, 0x45, 0x6f, 0x48, 0x4e, 0x49, \n\t0x66, 0x6d, 0x65, 0x57, 0x73, 0x57, 0x73, 0x63, 0x41, 0x59, 0x59, 0x52, 0x53, 0x44, 0x67, 0x56, 0x47, 0x36, \n\t0x6a, 0x46, 0x4d, 0x44, 0x49, 0x77, 0x30, 0x63, 0x42, 0x6f, 0x6c, 0x6a, 0x48, 0x54, 0x31, 0x78, 0x59, 0x5c, 0x0a,\n\t0x09, 0x35, 0x46, 0x58, 0x2b, 0x63, 0x51, 0x37, 0x55, 0x4e, 0x63, 0x34, 0x48, 0x4d, 0x67, 0x71, 0x44, 0x33, \n\t0x7a, 0x68, 0x76, 0x52, 0x78, 0x6a, 0x6c, 0x69, 0x6c, 0x42, 0x70, 0x45, 0x53, 0x46, 0x66, 0x30, 0x62, 0x30, \n\t0x49, 0x77, 0x79, 0x4a, 0x4c, 0x52, 0x75, 0x2f, 0x33, 0x6d, 0x36, 0x66, 0x79, 0x6a, 0x57, 0x4e, 0x36, 0x54, \n\t0x41, 0x4b, 0x4b, 0x2f, 0x6c, 0x72, 0x41, 0x71, 0x59, 0x39, 0x65, 0x54, 0x79, 0x47, 0x4a, 0x4d, 0x47, 0x5c, 0x0a,\n\t0x09, 0x52, 0x73, 0x45, 0x31, 0x31, 0x38, 0x72, 0x43, 0x53, 0x4c, 0x38, 0x2f, 0x74, 0x58, 0x77, 0x35, 0x59, \n\t0x50, 0x52, 0x39, 0x4a, 0x50, 0x64, 0x53, 0x55, 0x70, 0x55, 0x61, 0x52, 0x4b, 0x47, 0x6b, 0x66, 0x77, 0x47, \n\t0x2f, 0x45, 0x45, 0x74, 0x62, 0x32, 0x6f, 0x6d, 0x33, 0x2f, 0x51, 0x61, 0x6f, 0x56, 0x49, 0x6c, 0x31, 0x58, \n\t0x67, 0x75, 0x6e, 0x44, 0x5a, 0x73, 0x6b, 0x6a, 0x45, 0x72, 0x6a, 0x38, 0x6d, 0x69, 0x43, 0x6b, 0x54, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x4e, 0x59, 0x50, 0x41, 0x77, 0x6b, 0x74, 0x42, 0x2b, 0x4b, 0x47, 0x4c, 0x33, 0x39, 0x70, 0x6a, \n\t0x44, 0x4b, 0x4c, 0x57, 0x63, 0x66, 0x6e, 0x44, 0x58, 0x49, 0x59, 0x7a, 0x4f, 0x41, 0x4b, 0x67, 0x39, 0x38, \n\t0x33, 0x72, 0x4b, 0x71, 0x4e, 0x4b, 0x44, 0x4b, 0x49, 0x79, 0x4b, 0x70, 0x4f, 0x52, 0x44, 0x71, 0x46, 0x45, \n\t0x52, 0x30, 0x4c, 0x72, 0x74, 0x59, 0x73, 0x44, 0x52, 0x77, 0x43, 0x68, 0x73, 0x68, 0x67, 0x6b, 0x39, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x49, 0x51, 0x43, 0x69, 0x51, 0x79, 0x58, 0x52, 0x7a, 0x4f, 0x4d, 0x45, 0x68, 0x33, 0x56, 0x4f, \n\t0x68, 0x68, 0x46, 0x6f, 0x31, 0x38, 0x6d, 0x47, 0x4c, 0x58, 0x54, 0x79, 0x32, 0x6b, 0x35, 0x43, 0x39, 0x72, \n\t0x45, 0x4c, 0x67, 0x46, 0x54, 0x70, 0x47, 0x7a, 0x50, 0x4d, 0x45, 0x71, 0x42, 0x49, 0x6b, 0x67, 0x72, 0x6c, \n\t0x5a, 0x63, 0x52, 0x71, 0x66, 0x55, 0x42, 0x77, 0x75, 0x67, 0x32, 0x34, 0x41, 0x4c, 0x44, 0x44, 0x31, 0x5c, 0x0a,\n\t0x09, 0x77, 0x4b, 0x6c, 0x52, 0x35, 0x45, 0x69, 0x75, 0x36, 0x53, 0x6b, 0x74, 0x50, 0x56, 0x42, 0x48, 0x6c, \n\t0x67, 0x4e, 0x2b, 0x36, 0x39, 0x56, 0x32, 0x4f, 0x47, 0x55, 0x62, 0x55, 0x44, 0x6a, 0x4f, 0x4b, 0x76, 0x68, \n\t0x50, 0x54, 0x56, 0x63, 0x6c, 0x61, 0x4e, 0x61, 0x72, 0x51, 0x77, 0x43, 0x74, 0x4e, 0x42, 0x43, 0x79, 0x4e, \n\t0x42, 0x62, 0x7a, 0x41, 0x53, 0x70, 0x47, 0x37, 0x59, 0x37, 0x6f, 0x33, 0x56, 0x45, 0x69, 0x6f, 0x53, 0x5c, 0x0a,\n\t0x09, 0x41, 0x59, 0x30, 0x4b, 0x52, 0x6d, 0x72, 0x2f, 0x57, 0x47, 0x6c, 0x68, 0x6c, 0x44, 0x37, 0x48, 0x41, \n\t0x62, 0x6b, 0x38, 0x6e, 0x6f, 0x59, 0x73, 0x39, 0x45, 0x73, 0x4d, 0x58, 0x57, 0x4d, 0x42, 0x6f, 0x6f, 0x58, \n\t0x58, 0x74, 0x30, 0x66, 0x51, 0x70, 0x47, 0x52, 0x5a, 0x7a, 0x58, 0x4f, 0x33, 0x58, 0x42, 0x51, 0x73, 0x64, \n\t0x59, 0x42, 0x52, 0x43, 0x4b, 0x52, 0x31, 0x5a, 0x7a, 0x6e, 0x62, 0x42, 0x6f, 0x36, 0x66, 0x56, 0x52, 0x5c, 0x0a,\n\t0x09, 0x52, 0x47, 0x45, 0x69, 0x30, 0x52, 0x42, 0x67, 0x57, 0x6a, 0x32, 0x47, 0x59, 0x39, 0x77, 0x43, 0x67, \n\t0x32, 0x57, 0x70, 0x67, 0x34, 0x68, 0x6a, 0x47, 0x46, 0x55, 0x5a, 0x63, 0x76, 0x79, 0x52, 0x34, 0x41, 0x35, \n\t0x34, 0x73, 0x67, 0x71, 0x44, 0x33, 0x72, 0x4e, 0x35, 0x52, 0x56, 0x59, 0x77, 0x45, 0x69, 0x52, 0x64, 0x75, \n\t0x41, 0x54, 0x36, 0x6b, 0x33, 0x6a, 0x6c, 0x78, 0x62, 0x78, 0x4c, 0x33, 0x6e, 0x79, 0x6d, 0x41, 0x45, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x41, 0x53, 0x44, 0x42, 0x6b, 0x5a, 0x68, 0x68, 0x37, 0x55, 0x51, 0x39, 0x47, 0x51, 0x35, 0x47, \n\t0x38, 0x4a, 0x6a, 0x57, 0x43, 0x36, 0x50, 0x73, 0x66, 0x51, 0x52, 0x77, 0x4d, 0x69, 0x4c, 0x32, 0x59, 0x6a, \n\t0x48, 0x4e, 0x51, 0x67, 0x59, 0x4a, 0x52, 0x2f, 0x4b, 0x76, 0x73, 0x4d, 0x6f, 0x66, 0x49, 0x67, 0x48, 0x42, \n\t0x43, 0x4e, 0x31, 0x76, 0x51, 0x63, 0x59, 0x70, 0x64, 0x55, 0x31, 0x6a, 0x4d, 0x35, 0x43, 0x73, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x65, 0x64, 0x58, 0x79, 0x36, 0x4e, 0x44, 0x59, 0x69, 0x55, 0x71, 0x4f, 0x68, 0x66, 0x67, 0x58, 0x33, \n\t0x71, 0x37, 0x2b, 0x5a, 0x75, 0x75, 0x51, 0x6a, 0x70, 0x75, 0x51, 0x46, 0x63, 0x71, 0x6d, 0x30, 0x34, 0x36, \n\t0x47, 0x41, 0x30, 0x4b, 0x53, 0x36, 0x50, 0x51, 0x74, 0x43, 0x4c, 0x79, 0x32, 0x4e, 0x2b, 0x79, 0x39, 0x6b, \n\t0x4d, 0x45, 0x4b, 0x6c, 0x6c, 0x4f, 0x36, 0x56, 0x6c, 0x70, 0x58, 0x63, 0x6f, 0x4e, 0x31, 0x59, 0x77, 0x5c, 0x0a,\n\t0x09, 0x36, 0x69, 0x35, 0x71, 0x53, 0x61, 0x33, 0x33, 0x30, 0x65, 0x58, 0x78, 0x6b, 0x77, 0x43, 0x31, 0x76, \n\t0x37, 0x68, 0x57, 0x55, 0x31, 0x39, 0x35, 0x4e, 0x44, 0x59, 0x67, 0x55, 0x72, 0x51, 0x62, 0x2b, 0x42, 0x69, \n\t0x79, 0x66, 0x66, 0x31, 0x6c, 0x59, 0x78, 0x6e, 0x33, 0x39, 0x6c, 0x2b, 0x41, 0x55, 0x31, 0x56, 0x67, 0x31, \n\t0x4f, 0x36, 0x55, 0x31, 0x73, 0x4e, 0x49, 0x67, 0x63, 0x68, 0x41, 0x58, 0x52, 0x34, 0x48, 0x43, 0x43, 0x5c, 0x0a,\n\t0x09, 0x50, 0x30, 0x4d, 0x4a, 0x4a, 0x68, 0x58, 0x72, 0x53, 0x39, 0x48, 0x6b, 0x62, 0x2b, 0x78, 0x55, 0x4d, \n\t0x70, 0x35, 0x2b, 0x64, 0x46, 0x44, 0x37, 0x34, 0x6b, 0x38, 0x62, 0x41, 0x61, 0x4e, 0x47, 0x34, 0x77, 0x41, \n\t0x76, 0x51, 0x77, 0x53, 0x71, 0x37, 0x32, 0x4b, 0x52, 0x49, 0x61, 0x48, 0x59, 0x78, 0x2b, 0x42, 0x70, 0x52, \n\t0x76, 0x30, 0x70, 0x42, 0x47, 0x59, 0x77, 0x55, 0x69, 0x4a, 0x53, 0x72, 0x36, 0x76, 0x38, 0x41, 0x44, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x6f, 0x78, 0x61, 0x64, 0x2f, 0x77, 0x43, 0x32, 0x56, 0x68, 0x4f, 0x77, 0x79, 0x6a, 0x6f, 0x49, \n\t0x78, 0x4a, 0x68, 0x74, 0x47, 0x4a, 0x79, 0x65, 0x65, 0x77, 0x57, 0x52, 0x6f, 0x6e, 0x52, 0x4d, 0x7a, 0x32, \n\t0x4d, 0x36, 0x41, 0x43, 0x6a, 0x42, 0x4c, 0x53, 0x53, 0x4d, 0x41, 0x4b, 0x30, 0x4d, 0x41, 0x72, 0x2f, 0x53, \n\t0x72, 0x4a, 0x68, 0x46, 0x47, 0x31, 0x48, 0x44, 0x45, 0x59, 0x64, 0x58, 0x52, 0x36, 0x39, 0x41, 0x70, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x77, 0x68, 0x77, 0x43, 0x6a, 0x6a, 0x74, 0x74, 0x32, 0x36, 0x72, 0x2f, 0x4a, 0x4d, 0x63, 0x63, \n\t0x6f, 0x74, 0x70, 0x71, 0x73, 0x49, 0x37, 0x6b, 0x50, 0x71, 0x63, 0x6b, 0x66, 0x43, 0x6f, 0x77, 0x53, 0x68, \n\t0x32, 0x33, 0x65, 0x78, 0x79, 0x64, 0x41, 0x55, 0x48, 0x74, 0x32, 0x75, 0x61, 0x4d, 0x68, 0x47, 0x44, 0x4d, \n\t0x51, 0x4b, 0x56, 0x6f, 0x43, 0x33, 0x67, 0x38, 0x51, 0x77, 0x63, 0x68, 0x74, 0x30, 0x72, 0x72, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x67, 0x67, 0x41, 0x30, 0x47, 0x68, 0x67, 0x35, 0x6c, 0x63, 0x34, 0x77, 0x69, 0x76, 0x36, 0x5a, 0x59, \n\t0x44, 0x52, 0x71, 0x79, 0x31, 0x6d, 0x31, 0x6a, 0x41, 0x6f, 0x6a, 0x4a, 0x33, 0x45, 0x54, 0x4a, 0x6d, 0x43, \n\t0x6b, 0x41, 0x71, 0x30, 0x49, 0x6a, 0x50, 0x4a, 0x45, 0x51, 0x36, 0x6f, 0x47, 0x44, 0x43, 0x50, 0x72, 0x38, \n\t0x70, 0x6a, 0x65, 0x50, 0x67, 0x4e, 0x47, 0x74, 0x77, 0x4c, 0x6e, 0x36, 0x67, 0x2b, 0x73, 0x66, 0x42, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x37, 0x45, 0x4c, 0x57, 0x6a, 0x49, 0x76, 0x46, 0x70, 0x77, 0x50, 0x39, 0x47, 0x62, 0x67, 0x41, \n\t0x6a, 0x39, 0x2b, 0x35, 0x66, 0x49, 0x35, 0x66, 0x75, 0x44, 0x79, 0x43, 0x53, 0x41, 0x53, 0x4f, 0x45, 0x48, \n\t0x6b, 0x62, 0x39, 0x73, 0x70, 0x79, 0x4e, 0x77, 0x57, 0x59, 0x4d, 0x58, 0x52, 0x34, 0x6a, 0x47, 0x48, 0x6d, \n\t0x35, 0x57, 0x6d, 0x59, 0x64, 0x4e, 0x66, 0x59, 0x77, 0x30, 0x6f, 0x42, 0x6d, 0x47, 0x43, 0x36, 0x50, 0x5c, 0x0a,\n\t0x09, 0x68, 0x57, 0x45, 0x55, 0x32, 0x2b, 0x63, 0x6e, 0x6b, 0x4a, 0x30, 0x36, 0x2b, 0x4d, 0x71, 0x6a, 0x73, \n\t0x51, 0x4f, 0x52, 0x4c, 0x77, 0x48, 0x49, 0x42, 0x6f, 0x68, 0x33, 0x52, 0x45, 0x6b, 0x53, 0x70, 0x4a, 0x51, \n\t0x30, 0x4e, 0x35, 0x2b, 0x6e, 0x64, 0x46, 0x68, 0x58, 0x39, 0x44, 0x41, 0x4b, 0x4f, 0x35, 0x6d, 0x48, 0x34, \n\t0x66, 0x49, 0x59, 0x54, 0x42, 0x73, 0x59, 0x6a, 0x4d, 0x75, 0x6a, 0x43, 0x55, 0x62, 0x78, 0x2f, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x35, 0x67, 0x35, 0x46, 0x39, 0x51, 0x66, 0x36, 0x6b, 0x49, 0x6a, 0x48, 0x71, 0x46, 0x54, 0x6f, 0x35, \n\t0x36, 0x31, 0x78, 0x57, 0x4d, 0x31, 0x4e, 0x33, 0x6c, 0x66, 0x30, 0x6c, 0x32, 0x4e, 0x39, 0x49, 0x33, 0x50, \n\t0x36, 0x73, 0x39, 0x65, 0x2b, 0x52, 0x66, 0x6b, 0x38, 0x36, 0x6c, 0x73, 0x51, 0x54, 0x52, 0x77, 0x75, 0x74, \n\t0x2f, 0x52, 0x6e, 0x44, 0x52, 0x7a, 0x77, 0x62, 0x78, 0x36, 0x79, 0x68, 0x44, 0x67, 0x72, 0x74, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x39, 0x34, 0x44, 0x74, 0x79, 0x74, 0x44, 0x39, 0x6d, 0x46, 0x6b, 0x6f, 0x34, 0x46, 0x52, 0x61, \n\t0x56, 0x77, 0x65, 0x44, 0x54, 0x43, 0x4b, 0x6d, 0x6e, 0x74, 0x5a, 0x4d, 0x4b, 0x49, 0x44, 0x6a, 0x4f, 0x67, \n\t0x53, 0x52, 0x6c, 0x6d, 0x64, 0x75, 0x42, 0x31, 0x55, 0x42, 0x45, 0x5a, 0x64, 0x31, 0x6c, 0x73, 0x61, 0x47, \n\t0x4b, 0x57, 0x4f, 0x72, 0x78, 0x4f, 0x4d, 0x6b, 0x75, 0x73, 0x64, 0x59, 0x4e, 0x54, 0x64, 0x71, 0x79, 0x5c, 0x0a,\n\t0x09, 0x43, 0x66, 0x42, 0x67, 0x35, 0x6b, 0x48, 0x32, 0x79, 0x35, 0x4e, 0x4a, 0x59, 0x67, 0x55, 0x69, 0x53, \n\t0x42, 0x74, 0x79, 0x52, 0x2f, 0x38, 0x4f, 0x62, 0x31, 0x35, 0x2f, 0x67, 0x51, 0x69, 0x61, 0x41, 0x54, 0x52, \n\t0x45, 0x6a, 0x52, 0x4f, 0x32, 0x67, 0x4a, 0x47, 0x4f, 0x56, 0x31, 0x65, 0x65, 0x77, 0x57, 0x52, 0x6d, 0x45, \n\t0x45, 0x4e, 0x45, 0x36, 0x57, 0x73, 0x31, 0x37, 0x36, 0x43, 0x62, 0x63, 0x77, 0x53, 0x6d, 0x79, 0x66, 0x5c, 0x0a,\n\t0x09, 0x72, 0x46, 0x2b, 0x33, 0x6a, 0x78, 0x53, 0x4d, 0x4d, 0x69, 0x49, 0x6c, 0x64, 0x5a, 0x76, 0x75, 0x59, \n\t0x64, 0x51, 0x45, 0x38, 0x53, 0x6d, 0x41, 0x32, 0x6b, 0x6d, 0x62, 0x47, 0x42, 0x65, 0x4e, 0x4c, 0x59, 0x6a, \n\t0x38, 0x71, 0x41, 0x69, 0x41, 0x6e, 0x77, 0x50, 0x6e, 0x71, 0x6a, 0x2b, 0x47, 0x74, 0x32, 0x38, 0x62, 0x37, \n\t0x74, 0x62, 0x4c, 0x6f, 0x6f, 0x37, 0x72, 0x4e, 0x6f, 0x79, 0x71, 0x32, 0x54, 0x42, 0x53, 0x52, 0x73, 0x5c, 0x0a,\n\t0x09, 0x37, 0x47, 0x31, 0x33, 0x49, 0x32, 0x72, 0x43, 0x50, 0x5a, 0x78, 0x41, 0x73, 0x65, 0x71, 0x4b, 0x68, \n\t0x75, 0x45, 0x34, 0x7a, 0x77, 0x59, 0x53, 0x51, 0x39, 0x37, 0x51, 0x4d, 0x2b, 0x6c, 0x6a, 0x42, 0x4b, 0x62, \n\t0x64, 0x73, 0x64, 0x6a, 0x4e, 0x6f, 0x71, 0x4e, 0x59, 0x7a, 0x4f, 0x6b, 0x70, 0x4a, 0x74, 0x48, 0x61, 0x4f, \n\t0x33, 0x6b, 0x6d, 0x6c, 0x73, 0x51, 0x51, 0x51, 0x78, 0x47, 0x4c, 0x30, 0x4e, 0x61, 0x4b, 0x6b, 0x58, 0x5c, 0x0a,\n\t0x09, 0x76, 0x33, 0x6e, 0x44, 0x75, 0x65, 0x41, 0x32, 0x30, 0x6a, 0x42, 0x79, 0x41, 0x68, 0x67, 0x68, 0x73, \n\t0x6d, 0x46, 0x55, 0x64, 0x73, 0x74, 0x5a, 0x4d, 0x4d, 0x42, 0x49, 0x7a, 0x51, 0x76, 0x67, 0x70, 0x6f, 0x55, \n\t0x52, 0x36, 0x47, 0x47, 0x55, 0x65, 0x41, 0x6a, 0x48, 0x43, 0x55, 0x62, 0x47, 0x73, 0x68, 0x31, 0x41, 0x6b, \n\t0x52, 0x4e, 0x47, 0x67, 0x33, 0x56, 0x35, 0x31, 0x4b, 0x6b, 0x77, 0x6a, 0x43, 0x53, 0x2b, 0x5a, 0x51, 0x5c, 0x0a,\n\t0x09, 0x36, 0x31, 0x6b, 0x36, 0x34, 0x32, 0x56, 0x56, 0x70, 0x4b, 0x6a, 0x54, 0x57, 0x49, 0x49, 0x6b, 0x6d, \n\t0x35, 0x47, 0x54, 0x6a, 0x4e, 0x58, 0x77, 0x6b, 0x65, 0x74, 0x73, 0x59, 0x42, 0x6d, 0x70, 0x74, 0x2f, 0x36, \n\t0x4e, 0x39, 0x67, 0x4b, 0x6f, 0x78, 0x45, 0x73, 0x46, 0x79, 0x70, 0x45, 0x6a, 0x33, 0x6f, 0x52, 0x70, 0x66, \n\t0x48, 0x48, 0x4a, 0x61, 0x7a, 0x59, 0x49, 0x42, 0x52, 0x41, 0x6a, 0x51, 0x6d, 0x47, 0x4d, 0x58, 0x36, 0x5c, 0x0a,\n\t0x09, 0x69, 0x48, 0x51, 0x77, 0x51, 0x67, 0x2b, 0x6a, 0x4b, 0x4b, 0x30, 0x44, 0x6a, 0x4c, 0x70, 0x32, 0x65, \n\t0x56, 0x51, 0x47, 0x58, 0x4d, 0x59, 0x46, 0x52, 0x6e, 0x6d, 0x62, 0x61, 0x4e, 0x47, 0x32, 0x67, 0x34, 0x5a, \n\t0x52, 0x52, 0x69, 0x53, 0x6c, 0x68, 0x5a, 0x45, 0x4f, 0x71, 0x4e, 0x6c, 0x31, 0x4a, 0x6d, 0x42, 0x30, 0x44, \n\t0x6c, 0x43, 0x65, 0x54, 0x33, 0x4d, 0x55, 0x30, 0x4e, 0x69, 0x44, 0x4b, 0x49, 0x71, 0x4b, 0x70, 0x44, 0x5c, 0x0a,\n\t0x09, 0x77, 0x56, 0x65, 0x4d, 0x42, 0x66, 0x38, 0x58, 0x2b, 0x63, 0x31, 0x6d, 0x30, 0x58, 0x49, 0x35, 0x64, \n\t0x33, 0x74, 0x52, 0x39, 0x30, 0x48, 0x59, 0x7a, 0x47, 0x78, 0x75, 0x56, 0x78, 0x53, 0x44, 0x41, 0x4b, 0x72, \n\t0x31, 0x38, 0x4f, 0x30, 0x6b, 0x77, 0x47, 0x6a, 0x42, 0x4c, 0x72, 0x5a, 0x59, 0x52, 0x52, 0x68, 0x7a, 0x6f, \n\t0x56, 0x47, 0x48, 0x30, 0x45, 0x42, 0x46, 0x50, 0x50, 0x47, 0x61, 0x39, 0x6f, 0x43, 0x43, 0x59, 0x41, 0x5c, 0x0a,\n\t0x09, 0x52, 0x49, 0x72, 0x32, 0x49, 0x4f, 0x57, 0x37, 0x32, 0x36, 0x73, 0x43, 0x70, 0x45, 0x66, 0x7a, 0x32, \n\t0x6d, 0x39, 0x42, 0x70, 0x61, 0x62, 0x30, 0x2f, 0x7a, 0x68, 0x36, 0x47, 0x41, 0x33, 0x4e, 0x35, 0x62, 0x45, \n\t0x58, 0x47, 0x4b, 0x6c, 0x41, 0x47, 0x79, 0x43, 0x4d, 0x43, 0x73, 0x42, 0x68, 0x2f, 0x47, 0x47, 0x6b, 0x67, \n\t0x64, 0x4d, 0x6f, 0x59, 0x61, 0x53, 0x72, 0x4c, 0x33, 0x59, 0x73, 0x2b, 0x6a, 0x71, 0x6c, 0x46, 0x42, 0x5c, 0x0a,\n\t0x09, 0x64, 0x4b, 0x79, 0x52, 0x58, 0x70, 0x44, 0x63, 0x64, 0x44, 0x45, 0x77, 0x47, 0x69, 0x68, 0x54, 0x64, \n\t0x63, 0x47, 0x43, 0x35, 0x2b, 0x44, 0x69, 0x6b, 0x56, 0x43, 0x7a, 0x71, 0x42, 0x75, 0x2b, 0x4e, 0x47, 0x33, \n\t0x48, 0x75, 0x76, 0x61, 0x63, 0x4d, 0x6f, 0x6d, 0x6d, 0x4d, 0x6b, 0x74, 0x44, 0x42, 0x71, 0x75, 0x7a, 0x77, \n\t0x61, 0x59, 0x42, 0x54, 0x4f, 0x51, 0x54, 0x4c, 0x42, 0x53, 0x44, 0x67, 0x35, 0x59, 0x4b, 0x51, 0x30, 0x5c, 0x0a,\n\t0x09, 0x31, 0x37, 0x51, 0x77, 0x43, 0x71, 0x47, 0x67, 0x47, 0x53, 0x58, 0x4c, 0x42, 0x53, 0x4f, 0x55, 0x73, \n\t0x74, 0x33, 0x41, 0x53, 0x42, 0x61, 0x44, 0x77, 0x33, 0x71, 0x43, 0x45, 0x65, 0x33, 0x31, 0x30, 0x52, 0x75, \n\t0x72, 0x78, 0x63, 0x6f, 0x45, 0x30, 0x64, 0x42, 0x56, 0x6a, 0x4b, 0x4d, 0x6d, 0x41, 0x6b, 0x53, 0x4b, 0x57, \n\t0x73, 0x41, 0x62, 0x6b, 0x2f, 0x39, 0x4e, 0x4e, 0x36, 0x38, 0x35, 0x47, 0x39, 0x78, 0x57, 0x48, 0x45, 0x5c, 0x0a,\n\t0x09, 0x62, 0x52, 0x4f, 0x32, 0x68, 0x5a, 0x4d, 0x48, 0x4c, 0x49, 0x68, 0x46, 0x48, 0x59, 0x58, 0x42, 0x75, \n\t0x5a, 0x35, 0x57, 0x77, 0x37, 0x76, 0x62, 0x38, 0x75, 0x6a, 0x34, 0x46, 0x79, 0x77, 0x6b, 0x47, 0x61, 0x79, \n\t0x70, 0x6f, 0x30, 0x68, 0x4c, 0x49, 0x44, 0x73, 0x35, 0x77, 0x74, 0x6c, 0x5a, 0x64, 0x52, 0x56, 0x50, 0x5a, \n\t0x79, 0x4a, 0x4f, 0x63, 0x7a, 0x78, 0x70, 0x6f, 0x59, 0x45, 0x43, 0x6c, 0x52, 0x30, 0x63, 0x2b, 0x41, 0x5c, 0x0a,\n\t0x09, 0x63, 0x32, 0x4a, 0x68, 0x39, 0x4d, 0x70, 0x65, 0x6d, 0x6a, 0x65, 0x65, 0x35, 0x34, 0x4e, 0x43, 0x42, \n\t0x79, 0x4f, 0x45, 0x41, 0x55, 0x5a, 0x68, 0x6e, 0x35, 0x44, 0x51, 0x77, 0x30, 0x67, 0x6f, 0x6b, 0x42, 0x69, \n\t0x45, 0x79, 0x32, 0x4d, 0x73, 0x54, 0x77, 0x65, 0x6a, 0x4d, 0x4e, 0x30, 0x2f, 0x7a, 0x37, 0x34, 0x5a, 0x71, \n\t0x36, 0x6b, 0x61, 0x4a, 0x6f, 0x7a, 0x36, 0x48, 0x48, 0x47, 0x74, 0x49, 0x35, 0x66, 0x48, 0x39, 0x77, 0x5c, 0x0a,\n\t0x09, 0x48, 0x55, 0x2f, 0x2f, 0x4a, 0x4b, 0x78, 0x6c, 0x55, 0x54, 0x41, 0x79, 0x4b, 0x49, 0x77, 0x65, 0x69, \n\t0x4e, 0x77, 0x41, 0x45, 0x56, 0x52, 0x71, 0x31, 0x62, 0x4c, 0x73, 0x44, 0x62, 0x76, 0x30, 0x4d, 0x50, 0x49, \n\t0x36, 0x66, 0x71, 0x77, 0x38, 0x69, 0x36, 0x50, 0x46, 0x6f, 0x59, 0x6a, 0x5a, 0x2f, 0x4c, 0x34, 0x7a, 0x58, \n\t0x41, 0x6a, 0x78, 0x68, 0x7a, 0x54, 0x52, 0x53, 0x49, 0x46, 0x4e, 0x31, 0x4e, 0x39, 0x48, 0x5a, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x42, 0x39, 0x47, 0x30, 0x72, 0x6a, 0x71, 0x2f, 0x78, 0x4e, 0x4e, 0x56, 0x74, 0x54, 0x42, 0x53, \n\t0x48, 0x33, 0x6c, 0x59, 0x35, 0x51, 0x75, 0x6a, 0x79, 0x59, 0x59, 0x69, 0x54, 0x67, 0x30, 0x43, 0x73, 0x47, \n\t0x6f, 0x6d, 0x7a, 0x34, 0x6a, 0x56, 0x65, 0x4d, 0x47, 0x6f, 0x39, 0x68, 0x6d, 0x2f, 0x59, 0x5a, 0x52, 0x43, \n\t0x49, 0x6f, 0x42, 0x77, 0x55, 0x68, 0x64, 0x37, 0x77, 0x79, 0x6a, 0x55, 0x35, 0x47, 0x43, 0x2b, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x4e, 0x62, 0x7a, 0x51, 0x45, 0x45, 0x77, 0x67, 0x69, 0x4a, 0x53, 0x72, 0x36, 0x66, 0x34, 0x44, \n\t0x2f, 0x67, 0x65, 0x2f, 0x67, 0x44, 0x76, 0x46, 0x32, 0x33, 0x6b, 0x72, 0x72, 0x7a, 0x6c, 0x2f, 0x35, 0x30, \n\t0x41, 0x6c, 0x42, 0x6f, 0x49, 0x4e, 0x52, 0x62, 0x70, 0x64, 0x48, 0x41, 0x34, 0x77, 0x43, 0x77, 0x42, 0x68, \n\t0x68, 0x4a, 0x48, 0x4c, 0x41, 0x43, 0x4c, 0x4a, 0x68, 0x46, 0x45, 0x6b, 0x50, 0x6f, 0x31, 0x67, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x55, 0x74, 0x48, 0x50, 0x46, 0x4a, 0x6d, 0x65, 0x32, 0x33, 0x47, 0x43, 0x6b, 0x55, 0x79, 0x75, 0x6a, \n\t0x68, 0x47, 0x4d, 0x55, 0x71, 0x4e, 0x31, 0x68, 0x76, 0x6f, 0x51, 0x31, 0x79, 0x44, 0x35, 0x4c, 0x68, 0x4f, \n\t0x67, 0x69, 0x51, 0x4f, 0x52, 0x6f, 0x69, 0x62, 0x77, 0x68, 0x6d, 0x67, 0x74, 0x75, 0x45, 0x4f, 0x61, 0x31, \n\t0x35, 0x79, 0x4e, 0x62, 0x42, 0x77, 0x49, 0x6f, 0x46, 0x50, 0x74, 0x41, 0x4b, 0x4d, 0x32, 0x57, 0x43, 0x5c, 0x0a,\n\t0x09, 0x62, 0x57, 0x63, 0x68, 0x5a, 0x49, 0x75, 0x7a, 0x78, 0x6d, 0x33, 0x42, 0x59, 0x57, 0x52, 0x6f, 0x70, \n\t0x30, 0x4d, 0x45, 0x71, 0x75, 0x39, 0x69, 0x6b, 0x53, 0x30, 0x73, 0x50, 0x6f, 0x56, 0x49, 0x70, 0x64, 0x35, \n\t0x64, 0x4a, 0x71, 0x49, 0x6b, 0x47, 0x55, 0x36, 0x4c, 0x6a, 0x2b, 0x57, 0x70, 0x51, 0x68, 0x4a, 0x58, 0x4a, \n\t0x74, 0x69, 0x65, 0x62, 0x56, 0x2f, 0x36, 0x46, 0x41, 0x70, 0x39, 0x71, 0x47, 0x53, 0x42, 0x61, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x78, 0x4b, 0x67, 0x74, 0x5a, 0x35, 0x4e, 0x6c, 0x6b, 0x73, 0x42, 0x51, 0x41, 0x4b, 0x4f, 0x44, 0x45, \n\t0x61, 0x43, 0x46, 0x55, 0x66, 0x68, 0x58, 0x6f, 0x6b, 0x52, 0x54, 0x66, 0x6a, 0x6e, 0x6a, 0x48, 0x57, 0x35, \n\t0x68, 0x70, 0x41, 0x47, 0x46, 0x6a, 0x4b, 0x30, 0x50, 0x77, 0x65, 0x58, 0x78, 0x31, 0x38, 0x42, 0x33, 0x51, \n\t0x56, 0x42, 0x2f, 0x37, 0x71, 0x38, 0x5a, 0x64, 0x30, 0x30, 0x6b, 0x69, 0x43, 0x41, 0x47, 0x6f, 0x37, 0x5c, 0x0a,\n\t0x09, 0x63, 0x41, 0x2b, 0x36, 0x49, 0x4d, 0x4b, 0x57, 0x6c, 0x74, 0x76, 0x51, 0x78, 0x33, 0x32, 0x32, 0x2f, \n\t0x69, 0x4d, 0x4b, 0x71, 0x6f, 0x7a, 0x54, 0x47, 0x44, 0x79, 0x36, 0x50, 0x49, 0x59, 0x54, 0x6b, 0x62, 0x2f, \n\t0x54, 0x50, 0x42, 0x71, 0x4f, 0x51, 0x75, 0x6a, 0x77, 0x4b, 0x69, 0x66, 0x69, 0x7a, 0x36, 0x42, 0x4b, 0x4d, \n\t0x69, 0x47, 0x67, 0x4b, 0x4d, 0x4f, 0x6d, 0x34, 0x37, 0x48, 0x70, 0x61, 0x7a, 0x37, 0x36, 0x47, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x79, 0x31, 0x74, 0x57, 0x54, 0x53, 0x79, 0x49, 0x46, 0x47, 0x30, 0x44, 0x33, 0x68, 0x70, 0x4c, 0x6b, \n\t0x5a, 0x4c, 0x47, 0x46, 0x56, 0x2f, 0x32, 0x50, 0x5a, 0x6d, 0x54, 0x4d, 0x48, 0x4c, 0x69, 0x51, 0x43, 0x71, \n\t0x74, 0x79, 0x36, 0x4d, 0x4a, 0x52, 0x73, 0x6e, 0x6c, 0x46, 0x49, 0x79, 0x53, 0x77, 0x4e, 0x4c, 0x41, 0x43, \n\t0x47, 0x4b, 0x52, 0x56, 0x4d, 0x38, 0x77, 0x4b, 0x76, 0x71, 0x34, 0x44, 0x42, 0x68, 0x47, 0x45, 0x32, 0x5c, 0x0a,\n\t0x09, 0x41, 0x35, 0x65, 0x79, 0x6d, 0x53, 0x48, 0x2f, 0x6e, 0x52, 0x30, 0x4e, 0x68, 0x4f, 0x70, 0x6f, 0x35, \n\t0x70, 0x6f, 0x6b, 0x47, 0x6b, 0x52, 0x45, 0x56, 0x6e, 0x41, 0x68, 0x65, 0x72, 0x65, 0x58, 0x4a, 0x35, 0x46, \n\t0x34, 0x31, 0x72, 0x7a, 0x6f, 0x37, 0x31, 0x44, 0x38, 0x56, 0x67, 0x4e, 0x44, 0x53, 0x58, 0x52, 0x77, 0x4f, \n\t0x4d, 0x6b, 0x73, 0x30, 0x77, 0x5a, 0x38, 0x69, 0x57, 0x73, 0x34, 0x6c, 0x2b, 0x6f, 0x71, 0x48, 0x44, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x4f, 0x2b, 0x2b, 0x73, 0x74, 0x49, 0x7a, 0x79, 0x70, 0x58, 0x43, 0x79, 0x36, 0x6a, 0x54, 0x50, \n\t0x70, 0x4c, 0x37, 0x61, 0x36, 0x65, 0x39, 0x43, 0x36, 0x44, 0x2b, 0x33, 0x4d, 0x73, 0x7a, 0x44, 0x6e, 0x36, \n\t0x38, 0x4e, 0x4e, 0x45, 0x67, 0x55, 0x69, 0x53, 0x42, 0x31, 0x77, 0x4a, 0x72, 0x61, 0x6d, 0x4c, 0x72, 0x35, \n\t0x68, 0x2f, 0x6a, 0x37, 0x64, 0x6f, 0x53, 0x36, 0x79, 0x4e, 0x4b, 0x77, 0x53, 0x67, 0x45, 0x6a, 0x41, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x47, 0x34, 0x5a, 0x43, 0x2f, 0x43, 0x55, 0x61, 0x68, 0x79, 0x32, 0x4d, 0x6d, 0x6a, 0x42, 0x53, \n\t0x59, 0x6d, 0x43, 0x78, 0x6e, 0x30, 0x63, 0x42, 0x49, 0x4f, 0x4f, 0x32, 0x62, 0x4e, 0x77, 0x74, 0x47, 0x50, \n\t0x6f, 0x6b, 0x79, 0x59, 0x45, 0x51, 0x61, 0x52, 0x71, 0x4b, 0x71, 0x76, 0x59, 0x6a, 0x47, 0x71, 0x35, 0x73, \n\t0x6a, 0x7a, 0x56, 0x72, 0x4f, 0x4a, 0x72, 0x62, 0x50, 0x73, 0x34, 0x38, 0x30, 0x6a, 0x4d, 0x35, 0x48, 0x5c, 0x0a,\n\t0x09, 0x63, 0x6c, 0x48, 0x47, 0x45, 0x59, 0x2b, 0x6c, 0x4a, 0x68, 0x35, 0x45, 0x53, 0x6c, 0x52, 0x30, 0x43, \n\t0x2b, 0x48, 0x63, 0x6f, 0x6c, 0x42, 0x53, 0x73, 0x6e, 0x62, 0x70, 0x47, 0x58, 0x34, 0x54, 0x72, 0x56, 0x4c, \n\t0x72, 0x43, 0x4b, 0x4f, 0x6f, 0x2f, 0x36, 0x69, 0x30, 0x6c, 0x72, 0x50, 0x6f, 0x59, 0x61, 0x53, 0x4d, 0x30, \n\t0x4f, 0x56, 0x31, 0x65, 0x52, 0x52, 0x4f, 0x74, 0x56, 0x69, 0x66, 0x7a, 0x36, 0x68, 0x68, 0x31, 0x47, 0x5c, 0x0a,\n\t0x09, 0x57, 0x39, 0x70, 0x59, 0x46, 0x52, 0x36, 0x76, 0x69, 0x30, 0x4d, 0x4a, 0x4a, 0x49, 0x2f, 0x67, 0x6b, \n\t0x45, 0x39, 0x65, 0x64, 0x4e, 0x54, 0x6a, 0x51, 0x45, 0x36, 0x77, 0x42, 0x45, 0x45, 0x49, 0x50, 0x52, 0x76, \n\t0x77, 0x47, 0x78, 0x44, 0x34, 0x44, 0x4c, 0x78, 0x66, 0x74, 0x70, 0x62, 0x76, 0x70, 0x36, 0x41, 0x4a, 0x39, \n\t0x61, 0x39, 0x49, 0x44, 0x72, 0x59, 0x4e, 0x51, 0x33, 0x79, 0x39, 0x6b, 0x6f, 0x43, 0x6a, 0x4c, 0x42, 0x5c, 0x0a,\n\t0x09, 0x43, 0x44, 0x32, 0x4d, 0x77, 0x67, 0x68, 0x49, 0x44, 0x4d, 0x48, 0x6c, 0x30, 0x61, 0x6b, 0x52, 0x77, \n\t0x53, 0x2b, 0x68, 0x64, 0x51, 0x6d, 0x6a, 0x31, 0x4c, 0x62, 0x64, 0x77, 0x61, 0x69, 0x74, 0x78, 0x48, 0x6f, \n\t0x2b, 0x6c, 0x38, 0x65, 0x76, 0x34, 0x73, 0x2b, 0x6b, 0x6e, 0x6a, 0x69, 0x74, 0x43, 0x78, 0x41, 0x70, 0x61, \n\t0x67, 0x4b, 0x76, 0x41, 0x6d, 0x4a, 0x66, 0x44, 0x6d, 0x78, 0x75, 0x50, 0x68, 0x39, 0x33, 0x78, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x59, 0x32, 0x6a, 0x4a, 0x78, 0x61, 0x39, 0x49, 0x41, 0x4c, 0x4c, 0x59, 0x77, 0x6d, 0x78, 0x4f, 0x58, \n\t0x52, 0x43, 0x4b, 0x50, 0x67, 0x76, 0x4d, 0x4c, 0x74, 0x4e, 0x56, 0x70, 0x33, 0x4d, 0x42, 0x71, 0x39, 0x79, \n\t0x32, 0x4d, 0x54, 0x78, 0x4c, 0x73, 0x42, 0x36, 0x73, 0x2b, 0x2f, 0x7a, 0x48, 0x43, 0x51, 0x34, 0x36, 0x74, \n\t0x31, 0x41, 0x79, 0x49, 0x6c, 0x4b, 0x72, 0x6f, 0x53, 0x2b, 0x45, 0x67, 0x38, 0x31, 0x32, 0x2b, 0x69, 0x5c, 0x0a,\n\t0x09, 0x53, 0x61, 0x38, 0x56, 0x67, 0x35, 0x46, 0x77, 0x32, 0x76, 0x30, 0x34, 0x57, 0x73, 0x76, 0x5a, 0x73, \n\t0x72, 0x67, 0x38, 0x39, 0x67, 0x49, 0x6a, 0x30, 0x4d, 0x4d, 0x6f, 0x62, 0x49, 0x5a, 0x43, 0x2b, 0x67, 0x47, \n\t0x4a, 0x72, 0x6c, 0x6f, 0x42, 0x6a, 0x52, 0x4f, 0x4d, 0x6a, 0x47, 0x56, 0x48, 0x41, 0x61, 0x4e, 0x6f, 0x2f, \n\t0x54, 0x54, 0x67, 0x54, 0x74, 0x4e, 0x2f, 0x44, 0x4f, 0x4d, 0x75, 0x6b, 0x66, 0x64, 0x72, 0x6e, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x4d, 0x78, 0x67, 0x56, 0x59, 0x2f, 0x4e, 0x53, 0x4a, 0x41, 0x48, 0x58, 0x67, 0x43, 0x75, 0x41, \n\t0x50, 0x31, 0x62, 0x7a, 0x71, 0x38, 0x55, 0x2b, 0x68, 0x2f, 0x71, 0x53, 0x54, 0x77, 0x57, 0x30, 0x68, 0x76, \n\t0x52, 0x61, 0x34, 0x54, 0x66, 0x43, 0x61, 0x53, 0x4d, 0x38, 0x4e, 0x6c, 0x6c, 0x32, 0x51, 0x48, 0x6e, 0x67, \n\t0x74, 0x38, 0x46, 0x79, 0x6b, 0x62, 0x50, 0x6e, 0x4c, 0x62, 0x67, 0x74, 0x6b, 0x6d, 0x4f, 0x66, 0x36, 0x5c, 0x0a,\n\t0x09, 0x35, 0x54, 0x33, 0x58, 0x54, 0x77, 0x75, 0x58, 0x63, 0x66, 0x30, 0x76, 0x70, 0x30, 0x62, 0x70, 0x58, \n\t0x72, 0x43, 0x4e, 0x76, 0x35, 0x30, 0x4d, 0x50, 0x2b, 0x38, 0x73, 0x58, 0x59, 0x54, 0x30, 0x2f, 0x44, 0x51, \n\t0x5a, 0x6c, 0x70, 0x46, 0x2b, 0x33, 0x64, 0x46, 0x66, 0x35, 0x52, 0x2b, 0x79, 0x58, 0x52, 0x62, 0x5a, 0x4c, \n\t0x6f, 0x4d, 0x45, 0x77, 0x6d, 0x30, 0x6b, 0x30, 0x5a, 0x4d, 0x68, 0x76, 0x66, 0x62, 0x66, 0x49, 0x46, 0x5c, 0x0a,\n\t0x09, 0x31, 0x47, 0x61, 0x57, 0x47, 0x35, 0x49, 0x48, 0x31, 0x74, 0x50, 0x7a, 0x52, 0x58, 0x32, 0x68, 0x64, \n\t0x49, 0x36, 0x4f, 0x38, 0x56, 0x37, 0x5a, 0x31, 0x68, 0x75, 0x6c, 0x30, 0x30, 0x36, 0x59, 0x56, 0x75, 0x72, \n\t0x51, 0x4c, 0x31, 0x46, 0x6e, 0x70, 0x6d, 0x68, 0x62, 0x6f, 0x6f, 0x73, 0x37, 0x64, 0x4e, 0x58, 0x6f, 0x66, \n\t0x55, 0x4f, 0x6d, 0x33, 0x77, 0x4b, 0x4e, 0x30, 0x37, 0x2f, 0x72, 0x71, 0x49, 0x31, 0x75, 0x50, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x56, 0x6e, 0x6e, 0x48, 0x6f, 0x52, 0x38, 0x47, 0x4c, 0x43, 0x37, 0x2f, 0x76, 0x78, 0x66, 0x5a, \n\t0x52, 0x78, 0x59, 0x2b, 0x5a, 0x53, 0x58, 0x4c, 0x2b, 0x73, 0x6d, 0x49, 0x6b, 0x70, 0x6f, 0x44, 0x58, 0x67, \n\t0x46, 0x76, 0x6e, 0x39, 0x52, 0x70, 0x4e, 0x59, 0x74, 0x50, 0x36, 0x57, 0x31, 0x39, 0x64, 0x64, 0x51, 0x71, \n\t0x61, 0x59, 0x69, 0x6f, 0x35, 0x6a, 0x4c, 0x34, 0x31, 0x68, 0x62, 0x7a, 0x71, 0x70, 0x31, 0x42, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x46, 0x52, 0x46, 0x43, 0x33, 0x46, 0x49, 0x79, 0x4e, 0x52, 0x6d, 0x59, 0x70, 0x66, 0x74, 0x53, 0x4b, \n\t0x52, 0x55, 0x59, 0x47, 0x6f, 0x70, 0x4a, 0x53, 0x52, 0x55, 0x64, 0x37, 0x4f, 0x61, 0x2b, 0x30, 0x36, 0x38, \n\t0x63, 0x68, 0x49, 0x67, 0x74, 0x7a, 0x58, 0x78, 0x4c, 0x76, 0x6e, 0x41, 0x4f, 0x37, 0x57, 0x4a, 0x62, 0x7a, \n\t0x74, 0x4b, 0x38, 0x68, 0x6c, 0x74, 0x30, 0x68, 0x6b, 0x39, 0x48, 0x34, 0x6b, 0x75, 0x33, 0x4f, 0x63, 0x5c, 0x0a,\n\t0x09, 0x78, 0x64, 0x68, 0x71, 0x33, 0x55, 0x56, 0x45, 0x45, 0x45, 0x56, 0x46, 0x41, 0x4f, 0x38, 0x44, 0x33, \n\t0x71, 0x76, 0x6d, 0x69, 0x65, 0x6b, 0x46, 0x5a, 0x70, 0x37, 0x37, 0x4d, 0x55, 0x52, 0x39, 0x49, 0x59, 0x68, \n\t0x55, 0x44, 0x4a, 0x47, 0x52, 0x31, 0x32, 0x70, 0x48, 0x51, 0x4d, 0x6e, 0x49, 0x4b, 0x49, 0x79, 0x4b, 0x67, \n\t0x76, 0x78, 0x55, 0x5a, 0x42, 0x51, 0x74, 0x53, 0x33, 0x31, 0x6b, 0x46, 0x45, 0x51, 0x37, 0x51, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x31, 0x32, 0x31, 0x4d, 0x67, 0x6f, 0x33, 0x46, 0x61, 0x4e, 0x6b, 0x46, 0x4b, 0x52, 0x55, 0x54, 0x76, \n\t0x69, 0x53, 0x55, 0x64, 0x47, 0x34, 0x54, 0x49, 0x5a, 0x6b, 0x5a, 0x47, 0x66, 0x4c, 0x70, 0x64, 0x33, 0x70, \n\t0x43, 0x39, 0x67, 0x72, 0x35, 0x47, 0x52, 0x4c, 0x69, 0x6f, 0x79, 0x56, 0x6d, 0x44, 0x51, 0x4f, 0x45, 0x52, \n\t0x47, 0x67, 0x48, 0x76, 0x33, 0x45, 0x74, 0x36, 0x64, 0x69, 0x38, 0x67, 0x31, 0x4e, 0x35, 0x55, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x46, 0x6d, 0x70, 0x55, 0x66, 0x6d, 0x65, 0x42, 0x79, 0x6c, 0x48, 0x54, 0x53, 0x6d, 0x71, 0x71, 0x7a, \n\t0x6c, 0x75, 0x41, 0x52, 0x77, 0x48, 0x4e, 0x2b, 0x67, 0x74, 0x2b, 0x32, 0x65, 0x6e, 0x6f, 0x53, 0x79, 0x63, \n\t0x62, 0x45, 0x57, 0x56, 0x49, 0x36, 0x53, 0x2f, 0x36, 0x5a, 0x79, 0x44, 0x6d, 0x72, 0x53, 0x6c, 0x58, 0x46, \n\t0x31, 0x6e, 0x37, 0x2b, 0x53, 0x66, 0x6a, 0x4d, 0x36, 0x77, 0x72, 0x31, 0x58, 0x52, 0x6b, 0x6c, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x74, 0x79, 0x31, 0x69, 0x45, 0x56, 0x47, 0x55, 0x58, 0x4c, 0x53, 0x6f, 0x52, 0x55, 0x52, 0x70, 0x64, \n\t0x48, 0x49, 0x59, 0x4c, 0x52, 0x73, 0x34, 0x52, 0x36, 0x6a, 0x59, 0x78, 0x4d, 0x49, 0x33, 0x48, 0x39, 0x69, \n\t0x49, 0x7a, 0x36, 0x57, 0x4c, 0x61, 0x6e, 0x79, 0x4d, 0x69, 0x56, 0x74, 0x44, 0x62, 0x74, 0x77, 0x72, 0x31, \n\t0x35, 0x72, 0x78, 0x5a, 0x43, 0x41, 0x48, 0x4b, 0x78, 0x53, 0x65, 0x76, 0x61, 0x33, 0x54, 0x52, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x73, 0x31, 0x66, 0x35, 0x6f, 0x47, 0x57, 0x71, 0x7a, 0x6a, 0x63, 0x6a, 0x61, 0x65, 0x59, 0x2b, 0x2f, \n\t0x6a, 0x48, 0x56, 0x75, 0x67, 0x53, 0x52, 0x6f, 0x68, 0x62, 0x77, 0x63, 0x6d, 0x42, 0x56, 0x54, 0x58, 0x54, \n\t0x76, 0x75, 0x35, 0x62, 0x6d, 0x44, 0x64, 0x2b, 0x48, 0x53, 0x69, 0x30, 0x59, 0x4a, 0x51, 0x75, 0x68, 0x6f, \n\t0x6f, 0x46, 0x52, 0x61, 0x56, 0x77, 0x65, 0x4d, 0x32, 0x41, 0x6b, 0x73, 0x6d, 0x41, 0x6b, 0x79, 0x49, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x52, 0x71, 0x4d, 0x34, 0x59, 0x59, 0x46, 0x4a, 0x53, 0x47, 0x42, 0x56, 0x70, 0x75, 0x75, 0x57, \n\t0x6f, 0x74, 0x79, 0x73, 0x59, 0x53, 0x55, 0x6e, 0x72, 0x6d, 0x6c, 0x31, 0x34, 0x44, 0x36, 0x7a, 0x71, 0x74, \n\t0x30, 0x6e, 0x49, 0x75, 0x2b, 0x38, 0x41, 0x7a, 0x65, 0x76, 0x32, 0x4b, 0x76, 0x75, 0x4a, 0x36, 0x76, 0x77, \n\t0x4a, 0x77, 0x63, 0x64, 0x44, 0x78, 0x7a, 0x45, 0x61, 0x4b, 0x71, 0x4a, 0x31, 0x32, 0x54, 0x51, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x70, 0x54, 0x54, 0x52, 0x58, 0x6b, 0x66, 0x30, 0x58, 0x62, 0x52, 0x41, 0x6c, 0x53, 0x6f, 0x7a, 0x66, \n\t0x2f, 0x6c, 0x52, 0x6e, 0x49, 0x33, 0x48, 0x67, 0x64, 0x74, 0x55, 0x6d, 0x6d, 0x68, 0x2b, 0x38, 0x79, 0x76, \n\t0x56, 0x54, 0x41, 0x76, 0x2b, 0x65, 0x62, 0x76, 0x75, 0x78, 0x62, 0x76, 0x6e, 0x46, 0x75, 0x53, 0x2b, 0x58, \n\t0x55, 0x69, 0x33, 0x69, 0x5a, 0x69, 0x65, 0x51, 0x78, 0x78, 0x35, 0x4c, 0x4d, 0x36, 0x52, 0x44, 0x32, 0x5c, 0x0a,\n\t0x09, 0x34, 0x33, 0x30, 0x63, 0x4a, 0x4f, 0x61, 0x37, 0x57, 0x5a, 0x46, 0x6d, 0x74, 0x2b, 0x61, 0x5a, 0x70, \n\t0x70, 0x30, 0x6b, 0x50, 0x4b, 0x64, 0x6f, 0x64, 0x32, 0x75, 0x70, 0x6b, 0x57, 0x64, 0x6d, 0x44, 0x4c, 0x61, \n\t0x44, 0x33, 0x57, 0x54, 0x49, 0x76, 0x39, 0x31, 0x54, 0x58, 0x54, 0x77, 0x6a, 0x6f, 0x67, 0x31, 0x6b, 0x7a, \n\t0x7a, 0x58, 0x4f, 0x54, 0x53, 0x64, 0x6e, 0x39, 0x5a, 0x32, 0x2b, 0x77, 0x70, 0x61, 0x54, 0x4f, 0x74, 0x5c, 0x0a,\n\t0x09, 0x53, 0x4e, 0x4d, 0x74, 0x52, 0x37, 0x31, 0x46, 0x6d, 0x6d, 0x6e, 0x75, 0x6c, 0x72, 0x32, 0x34, 0x57, \n\t0x78, 0x63, 0x4c, 0x37, 0x4d, 0x68, 0x58, 0x35, 0x66, 0x67, 0x4e, 0x56, 0x42, 0x38, 0x79, 0x48, 0x36, 0x36, \n\t0x32, 0x51, 0x44, 0x34, 0x61, 0x75, 0x4c, 0x48, 0x2b, 0x77, 0x6b, 0x73, 0x4c, 0x31, 0x31, 0x55, 0x57, 0x35, \n\t0x65, 0x62, 0x4c, 0x65, 0x67, 0x59, 0x52, 0x52, 0x44, 0x41, 0x53, 0x77, 0x50, 0x65, 0x41, 0x6b, 0x39, 0x5c, 0x0a,\n\t0x09, 0x51, 0x38, 0x35, 0x36, 0x42, 0x6a, 0x6d, 0x48, 0x6e, 0x65, 0x78, 0x2f, 0x78, 0x49, 0x70, 0x77, 0x4f, \n\t0x4d, 0x33, 0x4e, 0x75, 0x76, 0x70, 0x66, 0x6d, 0x7a, 0x72, 0x2b, 0x48, 0x64, 0x75, 0x30, 0x57, 0x37, 0x48, \n\t0x37, 0x47, 0x77, 0x6b, 0x65, 0x72, 0x6a, 0x54, 0x71, 0x54, 0x79, 0x79, 0x4d, 0x65, 0x31, 0x51, 0x57, 0x43, \n\t0x45, 0x55, 0x58, 0x74, 0x55, 0x54, 0x41, 0x73, 0x6a, 0x70, 0x51, 0x2b, 0x6e, 0x4b, 0x78, 0x68, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x46, 0x55, 0x43, 0x30, 0x36, 0x7a, 0x4c, 0x41, 0x53, 0x43, 0x37, 0x76, 0x41, 0x6a, 0x64, 0x34, 0x4f, \n\t0x32, 0x59, 0x39, 0x77, 0x55, 0x67, 0x6b, 0x56, 0x7a, 0x76, 0x44, 0x53, 0x43, 0x34, 0x31, 0x61, 0x56, 0x36, \n\t0x78, 0x76, 0x56, 0x67, 0x45, 0x46, 0x73, 0x6f, 0x52, 0x31, 0x50, 0x37, 0x6b, 0x43, 0x4a, 0x79, 0x5a, 0x43, \n\t0x73, 0x42, 0x48, 0x51, 0x62, 0x34, 0x56, 0x59, 0x44, 0x32, 0x41, 0x61, 0x4c, 0x30, 0x33, 0x7a, 0x55, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x4a, 0x2f, 0x49, 0x6d, 0x4f, 0x73, 0x5a, 0x35, 0x5a, 0x62, 0x39, 0x2b, 0x39, 0x72, 0x46, 0x31, \n\t0x79, 0x57, 0x74, 0x44, 0x6b, 0x71, 0x69, 0x6b, 0x6a, 0x61, 0x58, 0x37, 0x7a, 0x53, 0x77, 0x51, 0x6a, 0x61, \n\t0x4d, 0x32, 0x4c, 0x76, 0x73, 0x48, 0x61, 0x57, 0x65, 0x38, 0x33, 0x51, 0x67, 0x68, 0x41, 0x4c, 0x75, 0x36, \n\t0x68, 0x65, 0x65, 0x47, 0x33, 0x61, 0x58, 0x7a, 0x72, 0x4d, 0x38, 0x69, 0x56, 0x5a, 0x61, 0x55, 0x35, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x45, 0x44, 0x4c, 0x57, 0x61, 0x41, 0x66, 0x4c, 0x6f, 0x2b, 0x69, 0x4e, 0x74, 0x50, 0x68, 0x36, \n\t0x6b, 0x31, 0x6f, 0x4d, 0x30, 0x30, 0x6d, 0x56, 0x7a, 0x73, 0x33, 0x30, 0x39, 0x7a, 0x62, 0x39, 0x6e, 0x55, \n\t0x48, 0x49, 0x51, 0x42, 0x50, 0x34, 0x74, 0x36, 0x78, 0x68, 0x4a, 0x54, 0x63, 0x42, 0x37, 0x77, 0x66, 0x78, \n\t0x46, 0x68, 0x44, 0x71, 0x49, 0x6a, 0x57, 0x50, 0x59, 0x69, 0x55, 0x6a, 0x75, 0x75, 0x64, 0x77, 0x43, 0x5c, 0x0a,\n\t0x09, 0x75, 0x54, 0x2b, 0x61, 0x30, 0x74, 0x46, 0x39, 0x50, 0x61, 0x2f, 0x45, 0x4d, 0x39, 0x6a, 0x4a, 0x77, \n\t0x71, 0x72, 0x59, 0x76, 0x50, 0x70, 0x6e, 0x6e, 0x78, 0x32, 0x62, 0x6e, 0x33, 0x35, 0x32, 0x33, 0x66, 0x53, \n\t0x75, 0x4f, 0x62, 0x70, 0x79, 0x45, 0x58, 0x39, 0x7a, 0x49, 0x32, 0x4c, 0x6f, 0x2b, 0x31, 0x32, 0x51, 0x68, \n\t0x4b, 0x2f, 0x65, 0x36, 0x44, 0x79, 0x55, 0x6f, 0x62, 0x4e, 0x78, 0x6a, 0x4a, 0x35, 0x53, 0x62, 0x65, 0x5c, 0x0a,\n\t0x09, 0x72, 0x68, 0x56, 0x39, 0x5a, 0x6b, 0x35, 0x35, 0x39, 0x78, 0x31, 0x41, 0x72, 0x6e, 0x6e, 0x76, 0x63, \n\t0x48, 0x65, 0x74, 0x46, 0x57, 0x2f, 0x62, 0x6a, 0x62, 0x48, 0x57, 0x50, 0x59, 0x67, 0x67, 0x42, 0x71, 0x4d, \n\t0x66, 0x41, 0x76, 0x2b, 0x65, 0x7a, 0x46, 0x2b, 0x37, 0x37, 0x45, 0x79, 0x38, 0x33, 0x58, 0x66, 0x34, 0x44, \n\t0x36, 0x67, 0x43, 0x49, 0x2f, 0x65, 0x75, 0x7a, 0x54, 0x52, 0x2b, 0x65, 0x6c, 0x62, 0x68, 0x2f, 0x63, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x6c, 0x66, 0x54, 0x53, 0x2b, 0x2f, 0x30, 0x56, 0x6b, 0x73, 0x39, 0x47, 0x65, 0x62, 0x36, 0x52, \n\t0x47, 0x4e, 0x77, 0x6b, 0x59, 0x39, 0x63, 0x2f, 0x6c, 0x73, 0x55, 0x73, 0x59, 0x4f, 0x51, 0x36, 0x69, 0x4e, \n\t0x71, 0x65, 0x63, 0x67, 0x4f, 0x36, 0x73, 0x39, 0x41, 0x2b, 0x6f, 0x38, 0x58, 0x6d, 0x66, 0x51, 0x42, 0x68, \n\t0x35, 0x39, 0x79, 0x33, 0x6c, 0x72, 0x4e, 0x41, 0x73, 0x4d, 0x56, 0x66, 0x62, 0x30, 0x37, 0x78, 0x34, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x31, 0x65, 0x38, 0x58, 0x57, 0x76, 0x55, 0x58, 0x33, 0x68, 0x4a, 0x7a, 0x2f, 0x57, 0x4e, 0x69, \n\t0x79, 0x79, 0x49, 0x41, 0x69, 0x6b, 0x77, 0x65, 0x68, 0x75, 0x4a, 0x49, 0x58, 0x33, 0x63, 0x4a, 0x6d, 0x73, \n\t0x2f, 0x2b, 0x52, 0x65, 0x2f, 0x50, 0x79, 0x67, 0x59, 0x6b, 0x68, 0x64, 0x4f, 0x6c, 0x63, 0x61, 0x35, 0x70, \n\t0x79, 0x76, 0x39, 0x4c, 0x4d, 0x55, 0x6b, 0x39, 0x2b, 0x36, 0x69, 0x64, 0x65, 0x45, 0x35, 0x37, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x47, 0x30, 0x51, 0x69, 0x36, 0x50, 0x42, 0x68, 0x69, 0x4a, 0x4a, 0x47, 0x68, 0x30, 0x4d, 0x4b, 0x49, \n\t0x44, 0x6a, 0x42, 0x4c, 0x51, 0x43, 0x6d, 0x45, 0x30, 0x4e, 0x5a, 0x38, 0x34, 0x41, 0x64, 0x31, 0x5a, 0x72, \n\t0x52, 0x38, 0x59, 0x36, 0x64, 0x4b, 0x38, 0x48, 0x51, 0x64, 0x79, 0x56, 0x6d, 0x61, 0x51, 0x49, 0x33, 0x41, \n\t0x4f, 0x6d, 0x58, 0x71, 0x4a, 0x4f, 0x47, 0x68, 0x4b, 0x65, 0x6c, 0x74, 0x37, 0x68, 0x39, 0x6f, 0x34, 0x5c, 0x0a,\n\t0x09, 0x79, 0x59, 0x49, 0x6f, 0x72, 0x54, 0x58, 0x67, 0x52, 0x63, 0x42, 0x65, 0x4e, 0x64, 0x48, 0x62, 0x76, \n\t0x34, 0x32, 0x31, 0x69, 0x7a, 0x38, 0x57, 0x7a, 0x53, 0x6c, 0x79, 0x62, 0x39, 0x2b, 0x45, 0x64, 0x2f, 0x64, \n\t0x4e, 0x50, 0x65, 0x33, 0x49, 0x33, 0x58, 0x49, 0x64, 0x37, 0x68, 0x30, 0x33, 0x70, 0x57, 0x47, 0x6b, 0x39, \n\t0x41, 0x74, 0x6c, 0x57, 0x63, 0x37, 0x69, 0x44, 0x4e, 0x46, 0x79, 0x74, 0x6a, 0x49, 0x46, 0x31, 0x58, 0x5c, 0x0a,\n\t0x09, 0x72, 0x38, 0x42, 0x49, 0x59, 0x4e, 0x6f, 0x79, 0x49, 0x61, 0x4d, 0x49, 0x79, 0x53, 0x4c, 0x38, 0x6e, \n\t0x4b, 0x2f, 0x51, 0x31, 0x6b, 0x51, 0x7a, 0x39, 0x66, 0x4b, 0x4b, 0x2b, 0x63, 0x49, 0x32, 0x5a, 0x2b, 0x49, \n\t0x6c, 0x66, 0x64, 0x48, 0x7a, 0x73, 0x62, 0x70, 0x39, 0x6a, 0x77, 0x75, 0x64, 0x74, 0x37, 0x71, 0x6d, 0x76, \n\t0x63, 0x5a, 0x45, 0x47, 0x6b, 0x53, 0x49, 0x6d, 0x4b, 0x37, 0x73, 0x44, 0x76, 0x76, 0x49, 0x36, 0x70, 0x5c, 0x0a,\n\t0x09, 0x64, 0x63, 0x63, 0x76, 0x61, 0x57, 0x37, 0x36, 0x4a, 0x6c, 0x53, 0x71, 0x4e, 0x4b, 0x2f, 0x34, 0x51, \n\t0x56, 0x2f, 0x32, 0x32, 0x62, 0x72, 0x30, 0x58, 0x44, 0x41, 0x61, 0x71, 0x79, 0x6c, 0x39, 0x50, 0x53, 0x6b, \n\t0x59, 0x56, 0x66, 0x79, 0x48, 0x51, 0x66, 0x52, 0x6f, 0x4f, 0x53, 0x76, 0x52, 0x77, 0x79, 0x69, 0x35, 0x4c, \n\t0x45, 0x42, 0x4d, 0x48, 0x35, 0x51, 0x2b, 0x67, 0x57, 0x48, 0x43, 0x71, 0x4e, 0x74, 0x4f, 0x34, 0x44, 0x5c, 0x0a,\n\t0x09, 0x77, 0x48, 0x30, 0x53, 0x4f, 0x4d, 0x76, 0x44, 0x33, 0x35, 0x35, 0x67, 0x79, 0x5a, 0x4a, 0x47, 0x61, \n\t0x72, 0x61, 0x38, 0x37, 0x42, 0x55, 0x38, 0x38, 0x54, 0x30, 0x31, 0x58, 0x6d, 0x33, 0x6e, 0x6c, 0x64, 0x54, \n\t0x33, 0x57, 0x4e, 0x6f, 0x79, 0x79, 0x49, 0x45, 0x6c, 0x4a, 0x67, 0x64, 0x41, 0x37, 0x77, 0x38, 0x57, 0x52, \n\t0x2b, 0x34, 0x38, 0x71, 0x76, 0x34, 0x4e, 0x35, 0x31, 0x46, 0x65, 0x34, 0x4e, 0x50, 0x2b, 0x2f, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x75, 0x54, 0x65, 0x58, 0x62, 0x69, 0x33, 0x58, 0x6f, 0x73, 0x5a, 0x52, 0x73, 0x6f, 0x6f, 0x6d, \n\t0x51, 0x35, 0x47, 0x30, 0x65, 0x78, 0x75, 0x52, 0x77, 0x2b, 0x6a, 0x47, 0x4a, 0x41, 0x45, 0x76, 0x62, 0x67, \n\t0x38, 0x69, 0x75, 0x70, 0x30, 0x4f, 0x69, 0x71, 0x43, 0x38, 0x73, 0x4b, 0x6f, 0x48, 0x78, 0x33, 0x72, 0x48, \n\t0x62, 0x59, 0x50, 0x59, 0x53, 0x52, 0x37, 0x41, 0x5a, 0x45, 0x41, 0x35, 0x38, 0x69, 0x5a, 0x4e, 0x33, 0x5c, 0x0a,\n\t0x09, 0x69, 0x4c, 0x7a, 0x53, 0x55, 0x78, 0x58, 0x65, 0x6c, 0x63, 0x66, 0x67, 0x4a, 0x6c, 0x51, 0x61, 0x52, \n\t0x52, 0x6f, 0x72, 0x38, 0x6f, 0x62, 0x76, 0x34, 0x69, 0x4a, 0x57, 0x76, 0x6e, 0x66, 0x51, 0x43, 0x35, 0x76, \n\t0x43, 0x2b, 0x35, 0x57, 0x64, 0x64, 0x79, 0x72, 0x37, 0x30, 0x6b, 0x73, 0x67, 0x78, 0x42, 0x41, 0x56, 0x41, \n\t0x5a, 0x58, 0x52, 0x37, 0x46, 0x39, 0x4d, 0x48, 0x36, 0x6b, 0x35, 0x67, 0x45, 0x47, 0x48, 0x56, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x72, 0x30, 0x54, 0x67, 0x4c, 0x54, 0x59, 0x4b, 0x62, 0x42, 0x79, 0x58, 0x63, 0x2b, 0x54, 0x73, 0x4a, \n\t0x72, 0x6e, 0x71, 0x6e, 0x69, 0x6d, 0x6d, 0x48, 0x47, 0x62, 0x66, 0x66, 0x48, 0x58, 0x58, 0x39, 0x59, 0x79, \n\t0x7a, 0x4c, 0x49, 0x69, 0x79, 0x31, 0x51, 0x52, 0x65, 0x44, 0x4f, 0x78, 0x53, 0x45, 0x2b, 0x57, 0x2b, 0x76, \n\t0x66, 0x72, 0x53, 0x58, 0x63, 0x72, 0x62, 0x76, 0x68, 0x58, 0x32, 0x50, 0x61, 0x42, 0x45, 0x51, 0x47, 0x5c, 0x0a,\n\t0x09, 0x33, 0x49, 0x64, 0x4f, 0x2f, 0x79, 0x61, 0x49, 0x42, 0x52, 0x47, 0x41, 0x45, 0x5a, 0x59, 0x65, 0x52, \n\t0x6b, 0x77, 0x73, 0x67, 0x59, 0x46, 0x63, 0x47, 0x36, 0x68, 0x5a, 0x46, 0x63, 0x63, 0x36, 0x48, 0x70, 0x46, \n\t0x64, 0x69, 0x77, 0x4c, 0x54, 0x46, 0x62, 0x62, 0x54, 0x71, 0x48, 0x7a, 0x7a, 0x78, 0x44, 0x7a, 0x46, 0x53, \n\t0x5a, 0x65, 0x38, 0x65, 0x31, 0x58, 0x64, 0x55, 0x78, 0x43, 0x62, 0x49, 0x67, 0x4d, 0x6b, 0x69, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x69, 0x75, 0x34, 0x43, 0x2f, 0x68, 0x72, 0x46, 0x31, 0x56, 0x47, 0x75, 0x39, 0x66, 0x38, 0x64, 0x52, \n\t0x48, 0x66, 0x4c, 0x64, 0x57, 0x68, 0x64, 0x48, 0x6b, 0x30, 0x77, 0x69, 0x6c, 0x77, 0x65, 0x73, 0x32, 0x42, \n\t0x45, 0x4e, 0x6f, 0x78, 0x45, 0x64, 0x35, 0x61, 0x7a, 0x59, 0x6d, 0x61, 0x6a, 0x2b, 0x55, 0x54, 0x57, 0x49, \n\t0x34, 0x79, 0x57, 0x75, 0x34, 0x79, 0x47, 0x42, 0x44, 0x68, 0x48, 0x7a, 0x62, 0x33, 0x52, 0x32, 0x37, 0x5c, 0x0a,\n\t0x09, 0x75, 0x32, 0x55, 0x38, 0x78, 0x70, 0x58, 0x69, 0x35, 0x65, 0x52, 0x37, 0x49, 0x67, 0x79, 0x70, 0x41, \n\t0x43, 0x6f, 0x77, 0x75, 0x42, 0x4e, 0x30, 0x63, 0x5a, 0x50, 0x59, 0x36, 0x4f, 0x36, 0x4f, 0x54, 0x65, 0x75, \n\t0x56, 0x6e, 0x76, 0x38, 0x69, 0x6a, 0x38, 0x4a, 0x6c, 0x6d, 0x5a, 0x4c, 0x47, 0x64, 0x46, 0x64, 0x51, 0x59, \n\t0x78, 0x4e, 0x61, 0x63, 0x39, 0x44, 0x38, 0x41, 0x4d, 0x6f, 0x37, 0x78, 0x46, 0x54, 0x52, 0x6b, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x68, 0x5a, 0x45, 0x38, 0x30, 0x4f, 0x70, 0x63, 0x53, 0x43, 0x50, 0x6e, 0x69, 0x4e, 0x6d, 0x72, 0x35, \n\t0x45, 0x72, 0x7a, 0x44, 0x46, 0x47, 0x72, 0x4d, 0x50, 0x75, 0x2f, 0x78, 0x2f, 0x39, 0x72, 0x72, 0x62, 0x33, \n\t0x49, 0x67, 0x71, 0x69, 0x44, 0x49, 0x68, 0x68, 0x4a, 0x50, 0x67, 0x46, 0x38, 0x47, 0x59, 0x42, 0x57, 0x2f, \n\t0x30, 0x48, 0x6b, 0x33, 0x58, 0x63, 0x48, 0x74, 0x46, 0x70, 0x36, 0x47, 0x41, 0x33, 0x4c, 0x63, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x62, 0x57, 0x59, 0x61, 0x32, 0x44, 0x45, 0x57, 0x30, 0x59, 0x7a, 0x52, 0x77, 0x53, 0x54, 0x30, 0x39, \n\t0x4b, 0x2b, 0x33, 0x41, 0x58, 0x68, 0x46, 0x48, 0x4f, 0x77, 0x71, 0x4f, 0x47, 0x6b, 0x56, 0x77, 0x74, 0x44, \n\t0x69, 0x49, 0x78, 0x57, 0x32, 0x30, 0x36, 0x68, 0x30, 0x34, 0x2f, 0x51, 0x39, 0x53, 0x72, 0x7a, 0x4c, 0x31, \n\t0x39, 0x55, 0x2b, 0x48, 0x74, 0x4a, 0x30, 0x30, 0x57, 0x52, 0x44, 0x6d, 0x6b, 0x77, 0x4f, 0x68, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x34, 0x45, 0x72, 0x63, 0x37, 0x76, 0x6f, 0x44, 0x4d, 0x69, 0x55, 0x39, 0x76, 0x42, 0x31, 0x33, 0x52, \n\t0x34, 0x41, 0x6f, 0x76, 0x63, 0x75, 0x6a, 0x55, 0x30, 0x58, 0x55, 0x4e, 0x63, 0x50, 0x35, 0x73, 0x58, 0x50, \n\t0x53, 0x70, 0x52, 0x57, 0x41, 0x55, 0x5a, 0x47, 0x6f, 0x5a, 0x4a, 0x51, 0x77, 0x4d, 0x76, 0x67, 0x4e, 0x47, \n\t0x53, 0x58, 0x41, 0x4f, 0x57, 0x4c, 0x75, 0x44, 0x64, 0x37, 0x2b, 0x78, 0x67, 0x4e, 0x69, 0x4e, 0x76, 0x5c, 0x0a,\n\t0x09, 0x33, 0x39, 0x75, 0x50, 0x55, 0x6f, 0x43, 0x36, 0x4a, 0x69, 0x57, 0x6b, 0x58, 0x79, 0x66, 0x43, 0x54, \n\t0x64, 0x78, 0x65, 0x49, 0x64, 0x35, 0x4f, 0x32, 0x38, 0x4a, 0x39, 0x45, 0x2f, 0x35, 0x4f, 0x68, 0x68, 0x70, \n\t0x4c, 0x79, 0x6a, 0x70, 0x6f, 0x56, 0x52, 0x41, 0x42, 0x47, 0x70, 0x41, 0x69, 0x62, 0x6c, 0x5a, 0x55, 0x51, \n\t0x50, 0x4d, 0x41, 0x6f, 0x36, 0x79, 0x32, 0x63, 0x32, 0x2b, 0x75, 0x2f, 0x64, 0x5a, 0x57, 0x6b, 0x51, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x44, 0x4c, 0x41, 0x59, 0x56, 0x51, 0x77, 0x6b, 0x73, 0x31, 0x69, 0x49, 0x48, 0x4b, 0x4f, 0x6d, \n\t0x4c, 0x31, 0x55, 0x72, 0x6a, 0x51, 0x2f, 0x4b, 0x36, 0x6f, 0x56, 0x5a, 0x76, 0x2f, 0x68, 0x79, 0x6b, 0x4c, \n\t0x62, 0x54, 0x71, 0x6f, 0x73, 0x69, 0x48, 0x4a, 0x71, 0x34, 0x65, 0x2f, 0x39, 0x71, 0x45, 0x6a, 0x75, 0x33, \n\t0x48, 0x38, 0x33, 0x47, 0x32, 0x5a, 0x65, 0x68, 0x5a, 0x50, 0x52, 0x4c, 0x4f, 0x6c, 0x53, 0x63, 0x76, 0x5c, 0x0a,\n\t0x09, 0x65, 0x4f, 0x37, 0x6c, 0x77, 0x65, 0x54, 0x54, 0x41, 0x53, 0x54, 0x67, 0x34, 0x59, 0x69, 0x51, 0x34, \n\t0x77, 0x43, 0x75, 0x46, 0x6a, 0x67, 0x4e, 0x48, 0x73, 0x6f, 0x54, 0x6c, 0x4f, 0x54, 0x4a, 0x63, 0x32, 0x47, \n\t0x42, 0x6a, 0x31, 0x2f, 0x43, 0x70, 0x49, 0x30, 0x66, 0x31, 0x42, 0x6f, 0x54, 0x35, 0x44, 0x4d, 0x56, 0x39, \n\t0x62, 0x46, 0x68, 0x76, 0x71, 0x54, 0x36, 0x4e, 0x65, 0x59, 0x65, 0x36, 0x64, 0x74, 0x6b, 0x6b, 0x57, 0x5c, 0x0a,\n\t0x09, 0x79, 0x6f, 0x4b, 0x6f, 0x67, 0x42, 0x62, 0x2b, 0x2f, 0x6b, 0x4a, 0x77, 0x50, 0x56, 0x68, 0x74, 0x6e, \n\t0x4d, 0x55, 0x68, 0x38, 0x2f, 0x2f, 0x53, 0x37, 0x2f, 0x71, 0x39, 0x33, 0x66, 0x65, 0x54, 0x37, 0x66, 0x4b, \n\t0x59, 0x41, 0x61, 0x4d, 0x52, 0x57, 0x63, 0x36, 0x4b, 0x32, 0x71, 0x7a, 0x76, 0x37, 0x39, 0x31, 0x4a, 0x51, \n\t0x34, 0x4a, 0x52, 0x58, 0x39, 0x35, 0x4c, 0x4b, 0x31, 0x72, 0x57, 0x7a, 0x56, 0x6c, 0x4a, 0x52, 0x65, 0x5c, 0x0a,\n\t0x09, 0x41, 0x63, 0x4f, 0x76, 0x4e, 0x38, 0x75, 0x64, 0x78, 0x63, 0x45, 0x58, 0x58, 0x62, 0x4a, 0x46, 0x4e, \n\t0x6c, 0x51, 0x56, 0x52, 0x51, 0x47, 0x7a, 0x36, 0x34, 0x43, 0x61, 0x61, 0x71, 0x73, 0x4e, 0x70, 0x38, 0x4f, \n\t0x34, 0x66, 0x4d, 0x6e, 0x39, 0x76, 0x50, 0x75, 0x75, 0x58, 0x53, 0x48, 0x6b, 0x5a, 0x76, 0x4f, 0x53, 0x73, \n\t0x77, 0x77, 0x6b, 0x68, 0x6a, 0x4c, 0x51, 0x74, 0x42, 0x56, 0x4f, 0x54, 0x6b, 0x65, 0x4c, 0x44, 0x47, 0x5c, 0x0a,\n\t0x09, 0x43, 0x55, 0x59, 0x46, 0x6f, 0x69, 0x57, 0x5a, 0x73, 0x38, 0x2f, 0x51, 0x4f, 0x57, 0x4c, 0x75, 0x4b, \n\t0x39, 0x35, 0x53, 0x38, 0x38, 0x65, 0x69, 0x35, 0x6a, 0x44, 0x33, 0x74, 0x71, 0x73, 0x36, 0x62, 0x37, 0x43, \n\t0x4f, 0x5a, 0x45, 0x48, 0x55, 0x68, 0x54, 0x5a, 0x38, 0x2b, 0x46, 0x6f, 0x66, 0x52, 0x71, 0x37, 0x33, 0x48, \n\t0x44, 0x62, 0x4d, 0x39, 0x50, 0x62, 0x6d, 0x71, 0x79, 0x4b, 0x35, 0x66, 0x37, 0x66, 0x66, 0x43, 0x52, 0x5c, 0x0a,\n\t0x09, 0x78, 0x47, 0x48, 0x31, 0x6f, 0x59, 0x56, 0x64, 0x73, 0x67, 0x30, 0x4d, 0x49, 0x6f, 0x50, 0x6d, 0x39, \n\t0x49, 0x61, 0x36, 0x77, 0x47, 0x74, 0x4b, 0x4f, 0x62, 0x4a, 0x49, 0x77, 0x63, 0x4d, 0x34, 0x7a, 0x55, 0x76, \n\t0x37, 0x47, 0x33, 0x39, 0x4b, 0x75, 0x49, 0x75, 0x63, 0x4e, 0x7a, 0x6e, 0x71, 0x51, 0x75, 0x62, 0x63, 0x78, \n\t0x68, 0x6c, 0x4d, 0x4f, 0x39, 0x56, 0x47, 0x79, 0x63, 0x33, 0x69, 0x70, 0x58, 0x57, 0x36, 0x38, 0x51, 0x5c, 0x0a,\n\t0x09, 0x55, 0x78, 0x58, 0x6d, 0x33, 0x6a, 0x57, 0x52, 0x58, 0x34, 0x33, 0x75, 0x53, 0x52, 0x5a, 0x45, 0x58, \n\t0x57, 0x72, 0x44, 0x52, 0x36, 0x36, 0x44, 0x65, 0x67, 0x32, 0x78, 0x63, 0x66, 0x36, 0x78, 0x7a, 0x4e, 0x56, \n\t0x33, 0x64, 0x64, 0x34, 0x69, 0x68, 0x31, 0x6f, 0x4e, 0x2f, 0x2f, 0x4e, 0x43, 0x54, 0x6a, 0x55, 0x59, 0x41, \n\t0x57, 0x74, 0x50, 0x56, 0x6b, 0x7a, 0x42, 0x4b, 0x4f, 0x79, 0x77, 0x48, 0x72, 0x58, 0x4c, 0x59, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x54, 0x69, 0x4f, 0x4b, 0x64, 0x2f, 0x4b, 0x54, 0x61, 0x76, 0x78, 0x68, 0x68, 0x47, 0x6f, 0x70, 0x49, \n\t0x4e, 0x49, 0x6a, 0x46, 0x64, 0x62, 0x59, 0x72, 0x35, 0x71, 0x53, 0x63, 0x79, 0x56, 0x57, 0x48, 0x2b, 0x2f, \n\t0x65, 0x76, 0x76, 0x68, 0x64, 0x59, 0x38, 0x73, 0x69, 0x44, 0x71, 0x51, 0x57, 0x4a, 0x6d, 0x43, 0x72, 0x6e, \n\t0x61, 0x57, 0x42, 0x45, 0x48, 0x7a, 0x2f, 0x30, 0x42, 0x30, 0x37, 0x55, 0x65, 0x7a, 0x57, 0x68, 0x38, 0x5c, 0x0a,\n\t0x09, 0x79, 0x55, 0x61, 0x44, 0x30, 0x50, 0x31, 0x52, 0x78, 0x44, 0x35, 0x62, 0x35, 0x4f, 0x68, 0x68, 0x6c, \n\t0x4e, 0x50, 0x6c, 0x30, 0x51, 0x67, 0x6a, 0x30, 0x51, 0x46, 0x47, 0x51, 0x51, 0x53, 0x56, 0x78, 0x33, 0x4a, \n\t0x57, 0x7a, 0x42, 0x34, 0x47, 0x79, 0x59, 0x38, 0x79, 0x61, 0x6b, 0x2f, 0x53, 0x6c, 0x44, 0x36, 0x6d, 0x4d, \n\t0x4b, 0x70, 0x56, 0x44, 0x41, 0x55, 0x41, 0x49, 0x52, 0x43, 0x48, 0x7a, 0x4c, 0x78, 0x63, 0x72, 0x72, 0x5c, 0x0a,\n\t0x09, 0x61, 0x32, 0x69, 0x61, 0x6d, 0x4d, 0x63, 0x75, 0x74, 0x63, 0x46, 0x6b, 0x51, 0x39, 0x61, 0x4f, 0x46, \n\t0x64, 0x6c, 0x79, 0x4f, 0x71, 0x46, 0x65, 0x52, 0x4b, 0x59, 0x7a, 0x73, 0x4c, 0x4d, 0x34, 0x39, 0x6a, 0x71, \n\t0x74, 0x72, 0x7a, 0x75, 0x78, 0x39, 0x79, 0x62, 0x53, 0x55, 0x43, 0x55, 0x52, 0x78, 0x47, 0x6c, 0x51, 0x34, \n\t0x77, 0x55, 0x6f, 0x41, 0x7a, 0x4d, 0x73, 0x74, 0x5a, 0x67, 0x54, 0x4e, 0x2f, 0x56, 0x4b, 0x36, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x79, 0x73, 0x42, 0x47, 0x76, 0x55, 0x59, 0x41, 0x49, 0x7a, 0x46, 0x6a, 0x37, 0x68, 0x39, 0x7a, 0x44, \n\t0x70, 0x2f, 0x39, 0x71, 0x6a, 0x7a, 0x51, 0x2f, 0x4c, 0x71, 0x6f, 0x56, 0x5a, 0x68, 0x2f, 0x6a, 0x32, 0x32, \n\t0x53, 0x6d, 0x57, 0x52, 0x42, 0x31, 0x4b, 0x4d, 0x57, 0x33, 0x6e, 0x63, 0x6c, 0x56, 0x42, 0x78, 0x6f, 0x74, \n\t0x6a, 0x5a, 0x7a, 0x30, 0x4f, 0x77, 0x7a, 0x71, 0x44, 0x69, 0x39, 0x7a, 0x58, 0x62, 0x30, 0x33, 0x41, 0x5c, 0x0a,\n\t0x09, 0x41, 0x65, 0x47, 0x54, 0x41, 0x53, 0x49, 0x68, 0x4e, 0x47, 0x37, 0x66, 0x6c, 0x48, 0x63, 0x52, 0x6a, \n\t0x31, 0x7a, 0x33, 0x49, 0x32, 0x57, 0x55, 0x61, 0x42, 0x55, 0x57, 0x58, 0x4b, 0x6a, 0x34, 0x7a, 0x79, 0x61, \n\t0x4a, 0x6a, 0x76, 0x70, 0x57, 0x56, 0x57, 0x30, 0x6e, 0x32, 0x39, 0x41, 0x47, 0x4a, 0x4f, 0x48, 0x77, 0x57, \n\t0x4b, 0x67, 0x36, 0x64, 0x76, 0x6c, 0x6f, 0x33, 0x57, 0x53, 0x38, 0x56, 0x55, 0x68, 0x66, 0x6c, 0x54, 0x5c, 0x0a,\n\t0x09, 0x31, 0x2b, 0x38, 0x4c, 0x72, 0x58, 0x6c, 0x6b, 0x51, 0x64, 0x51, 0x48, 0x62, 0x66, 0x6a, 0x51, 0x4e, \n\t0x56, 0x43, 0x72, 0x77, 0x6c, 0x72, 0x7a, 0x51, 0x6a, 0x62, 0x4f, 0x76, 0x51, 0x54, 0x48, 0x4b, 0x66, 0x54, \n\t0x57, 0x51, 0x6b, 0x78, 0x75, 0x4b, 0x2b, 0x69, 0x6b, 0x44, 0x70, 0x74, 0x6a, 0x47, 0x68, 0x69, 0x46, 0x48, \n\t0x33, 0x57, 0x4d, 0x5a, 0x6c, 0x6a, 0x48, 0x59, 0x5a, 0x54, 0x66, 0x63, 0x6c, 0x5a, 0x30, 0x61, 0x54, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x62, 0x6a, 0x6f, 0x42, 0x30, 0x4d, 0x42, 0x4c, 0x31, 0x67, 0x2f, 0x49, 0x4e, 0x36, 0x63, 0x50, \n\t0x77, 0x59, 0x56, 0x52, 0x45, 0x4f, 0x65, 0x73, 0x56, 0x42, 0x36, 0x58, 0x64, 0x43, 0x4d, 0x52, 0x73, 0x62, \n\t0x56, 0x6e, 0x4d, 0x56, 0x76, 0x2b, 0x49, 0x57, 0x6f, 0x58, 0x35, 0x44, 0x2f, 0x36, 0x6d, 0x36, 0x4a, 0x37, \n\t0x58, 0x6e, 0x53, 0x79, 0x49, 0x2b, 0x71, 0x51, 0x4e, 0x48, 0x37, 0x72, 0x47, 0x48, 0x30, 0x6c, 0x72, 0x5c, 0x0a,\n\t0x09, 0x74, 0x4c, 0x37, 0x4a, 0x6f, 0x66, 0x4f, 0x6e, 0x55, 0x4f, 0x6e, 0x79, 0x30, 0x6e, 0x6f, 0x53, 0x45, \n\t0x51, 0x37, 0x66, 0x4f, 0x33, 0x45, 0x67, 0x70, 0x57, 0x44, 0x6b, 0x42, 0x4b, 0x39, 0x38, 0x68, 0x45, 0x50, \n\t0x2b, 0x58, 0x62, 0x67, 0x38, 0x68, 0x68, 0x33, 0x65, 0x2f, 0x58, 0x5a, 0x35, 0x46, 0x4c, 0x4f, 0x48, 0x35, \n\t0x2b, 0x73, 0x76, 0x67, 0x75, 0x48, 0x43, 0x71, 0x50, 0x76, 0x2f, 0x49, 0x6f, 0x7a, 0x31, 0x69, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x55, 0x36, 0x71, 0x50, 0x30, 0x2f, 0x4e, 0x63, 0x63, 0x54, 0x42, 0x39, 0x57, 0x66, 0x4c, 0x42, 0x76, \n\t0x75, 0x50, 0x6c, 0x47, 0x7a, 0x6a, 0x31, 0x67, 0x65, 0x32, 0x61, 0x76, 0x55, 0x52, 0x32, 0x33, 0x34, 0x38, \n\t0x4c, 0x56, 0x51, 0x72, 0x30, 0x47, 0x6a, 0x39, 0x52, 0x6c, 0x78, 0x32, 0x49, 0x5a, 0x54, 0x71, 0x48, 0x59, \n\t0x52, 0x47, 0x51, 0x57, 0x77, 0x69, 0x63, 0x45, 0x6f, 0x41, 0x6c, 0x4a, 0x46, 0x44, 0x36, 0x4f, 0x77, 0x5c, 0x0a,\n\t0x09, 0x58, 0x36, 0x64, 0x6e, 0x6c, 0x30, 0x63, 0x44, 0x6a, 0x4a, 0x4c, 0x4e, 0x4d, 0x4a, 0x50, 0x4c, 0x6f, \n\t0x37, 0x6f, 0x75, 0x6e, 0x4b, 0x43, 0x2f, 0x4b, 0x4f, 0x63, 0x74, 0x56, 0x6c, 0x59, 0x59, 0x35, 0x65, 0x6e, \n\t0x4c, 0x45, 0x75, 0x41, 0x63, 0x47, 0x62, 0x67, 0x52, 0x4f, 0x41, 0x4c, 0x6e, 0x38, 0x4c, 0x6d, 0x2f, 0x6b, \n\t0x32, 0x76, 0x75, 0x46, 0x61, 0x4a, 0x57, 0x59, 0x66, 0x35, 0x55, 0x4f, 0x30, 0x71, 0x57, 0x52, 0x78, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x45, 0x66, 0x64, 0x61, 0x47, 0x44, 0x31, 0x32, 0x44, 0x6d, 0x4a, 0x35, 0x43, 0x4e, 0x70, 0x71, \n\t0x66, 0x46, 0x6b, 0x63, 0x63, 0x64, 0x44, 0x4c, 0x56, 0x67, 0x69, 0x4d, 0x6c, 0x6c, 0x5a, 0x6f, 0x53, 0x41, \n\t0x53, 0x56, 0x67, 0x70, 0x42, 0x71, 0x6e, 0x36, 0x57, 0x41, 0x55, 0x44, 0x76, 0x6d, 0x62, 0x59, 0x42, 0x53, \n\t0x36, 0x50, 0x47, 0x62, 0x43, 0x79, 0x4d, 0x6d, 0x47, 0x55, 0x66, 0x67, 0x76, 0x6a, 0x2b, 0x56, 0x73, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x51, 0x6f, 0x78, 0x66, 0x32, 0x54, 0x2b, 0x63, 0x78, 0x39, 0x6a, 0x47, 0x44, 0x6e, 0x48, 0x4c, \n\t0x50, 0x67, 0x51, 0x4f, 0x6e, 0x4c, 0x2b, 0x45, 0x33, 0x4b, 0x6c, 0x64, 0x61, 0x61, 0x59, 0x72, 0x74, 0x71, \n\t0x68, 0x2b, 0x67, 0x4b, 0x79, 0x49, 0x42, 0x71, 0x41, 0x46, 0x76, 0x37, 0x35, 0x61, 0x6e, 0x39, 0x6f, 0x76, \n\t0x39, 0x48, 0x36, 0x72, 0x44, 0x68, 0x36, 0x34, 0x38, 0x6e, 0x55, 0x4b, 0x72, 0x6c, 0x76, 0x65, 0x32, 0x5c, 0x0a,\n\t0x09, 0x64, 0x36, 0x6f, 0x53, 0x4f, 0x4d, 0x52, 0x42, 0x67, 0x68, 0x5a, 0x63, 0x46, 0x49, 0x41, 0x64, 0x41, \n\t0x6f, 0x4c, 0x57, 0x64, 0x46, 0x62, 0x63, 0x36, 0x33, 0x44, 0x4d, 0x6d, 0x72, 0x4d, 0x59, 0x57, 0x52, 0x71, \n\t0x46, 0x65, 0x70, 0x50, 0x4f, 0x4b, 0x77, 0x66, 0x7a, 0x41, 0x6e, 0x44, 0x37, 0x59, 0x41, 0x41, 0x41, 0x7a, \n\t0x5a, 0x53, 0x55, 0x52, 0x42, 0x56, 0x4a, 0x65, 0x65, 0x39, 0x79, 0x59, 0x78, 0x58, 0x62, 0x57, 0x64, 0x5c, 0x0a,\n\t0x09, 0x30, 0x77, 0x56, 0x6c, 0x51, 0x54, 0x51, 0x67, 0x4c, 0x5a, 0x78, 0x36, 0x46, 0x57, 0x4b, 0x32, 0x6a, \n\t0x6c, 0x78, 0x74, 0x66, 0x6b, 0x59, 0x63, 0x63, 0x2b, 0x68, 0x72, 0x6d, 0x4b, 0x72, 0x6d, 0x75, 0x2b, 0x33, \n\t0x6e, 0x4e, 0x68, 0x42, 0x39, 0x54, 0x54, 0x59, 0x61, 0x49, 0x61, 0x73, 0x69, 0x6a, 0x44, 0x42, 0x79, 0x39, \n\t0x44, 0x44, 0x71, 0x6d, 0x2b, 0x55, 0x73, 0x65, 0x68, 0x67, 0x70, 0x7a, 0x62, 0x46, 0x4f, 0x4c, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x39, 0x69, 0x35, 0x68, 0x42, 0x45, 0x38, 0x72, 0x74, 0x6f, 0x57, 0x52, 0x70, 0x50, 0x47, 0x48, 0x31, \n\t0x65, 0x62, 0x4b, 0x69, 0x2f, 0x30, 0x54, 0x6c, 0x73, 0x6c, 0x76, 0x6e, 0x33, 0x57, 0x77, 0x67, 0x56, 0x6c, \n\t0x51, 0x58, 0x52, 0x41, 0x4c, 0x58, 0x77, 0x37, 0x69, 0x74, 0x38, 0x47, 0x4b, 0x30, 0x30, 0x50, 0x69, 0x2b, \n\t0x4f, 0x4f, 0x65, 0x52, 0x76, 0x6d, 0x61, 0x35, 0x31, 0x76, 0x4f, 0x33, 0x46, 0x77, 0x75, 0x46, 0x51, 0x5c, 0x0a,\n\t0x09, 0x71, 0x62, 0x5a, 0x68, 0x35, 0x4e, 0x53, 0x49, 0x52, 0x72, 0x65, 0x30, 0x4d, 0x4b, 0x6f, 0x47, 0x55, \n\t0x59, 0x37, 0x51, 0x77, 0x79, 0x69, 0x79, 0x42, 0x52, 0x6d, 0x74, 0x79, 0x36, 0x4f, 0x59, 0x4f, 0x79, 0x4a, \n\t0x2f, 0x35, 0x7a, 0x57, 0x59, 0x59, 0x5a, 0x53, 0x33, 0x71, 0x43, 0x6c, 0x6a, 0x4d, 0x44, 0x43, 0x36, 0x41, \n\t0x4d, 0x6b, 0x70, 0x6f, 0x6c, 0x5a, 0x68, 0x37, 0x6b, 0x32, 0x58, 0x46, 0x36, 0x6a, 0x4d, 0x4b, 0x70, 0x5c, 0x0a,\n\t0x09, 0x51, 0x46, 0x30, 0x59, 0x43, 0x31, 0x38, 0x4d, 0x37, 0x4c, 0x45, 0x4c, 0x4e, 0x54, 0x79, 0x4e, 0x58, \n\t0x47, 0x46, 0x38, 0x58, 0x52, 0x68, 0x37, 0x79, 0x51, 0x36, 0x5a, 0x70, 0x78, 0x6e, 0x70, 0x47, 0x59, 0x6e, \n\t0x6b, 0x50, 0x4d, 0x4c, 0x50, 0x6a, 0x77, 0x53, 0x63, 0x42, 0x49, 0x4f, 0x4f, 0x31, 0x2b, 0x6e, 0x42, 0x53, \n\t0x4d, 0x77, 0x75, 0x61, 0x62, 0x4d, 0x6f, 0x64, 0x6f, 0x5a, 0x43, 0x36, 0x50, 0x4a, 0x68, 0x67, 0x35, 0x5c, 0x0a,\n\t0x09, 0x46, 0x5a, 0x79, 0x46, 0x6f, 0x34, 0x6e, 0x6d, 0x4b, 0x75, 0x56, 0x52, 0x72, 0x2b, 0x2b, 0x6c, 0x46, \n\t0x61, 0x69, 0x33, 0x42, 0x78, 0x68, 0x64, 0x41, 0x62, 0x77, 0x41, 0x2f, 0x30, 0x4d, 0x4c, 0x56, 0x6c, 0x33, \n\t0x4b, 0x67, 0x6d, 0x67, 0x49, 0x57, 0x6e, 0x6a, 0x48, 0x5a, 0x59, 0x69, 0x5a, 0x4f, 0x6e, 0x4b, 0x31, 0x38, \n\t0x57, 0x33, 0x78, 0x34, 0x45, 0x4f, 0x66, 0x78, 0x65, 0x79, 0x55, 0x31, 0x73, 0x42, 0x47, 0x56, 0x69, 0x5c, 0x0a,\n\t0x09, 0x52, 0x79, 0x2f, 0x37, 0x5a, 0x32, 0x33, 0x34, 0x77, 0x47, 0x52, 0x6e, 0x36, 0x54, 0x4c, 0x51, 0x52, \n\t0x4f, 0x4f, 0x49, 0x53, 0x76, 0x77, 0x45, 0x68, 0x70, 0x6b, 0x6d, 0x57, 0x36, 0x50, 0x4a, 0x70, 0x67, 0x46, \n\t0x50, 0x6b, 0x55, 0x44, 0x63, 0x42, 0x79, 0x74, 0x6c, 0x4c, 0x44, 0x32, 0x58, 0x42, 0x30, 0x73, 0x59, 0x73, \n\t0x33, 0x69, 0x4a, 0x64, 0x6b, 0x44, 0x65, 0x6c, 0x64, 0x77, 0x47, 0x67, 0x7a, 0x63, 0x42, 0x4b, 0x77, 0x5c, 0x0a,\n\t0x09, 0x43, 0x44, 0x44, 0x7a, 0x73, 0x67, 0x73, 0x4c, 0x56, 0x47, 0x43, 0x6c, 0x79, 0x6f, 0x4a, 0x6f, 0x53, \n\t0x46, 0x70, 0x34, 0x2b, 0x36, 0x2b, 0x43, 0x5a, 0x74, 0x72, 0x61, 0x6a, 0x38, 0x57, 0x44, 0x4e, 0x6a, 0x36, \n\t0x5a, 0x75, 0x58, 0x72, 0x36, 0x66, 0x39, 0x43, 0x36, 0x77, 0x38, 0x70, 0x33, 0x33, 0x34, 0x79, 0x33, 0x34, \n\t0x38, 0x5a, 0x32, 0x52, 0x37, 0x52, 0x77, 0x39, 0x44, 0x43, 0x4b, 0x54, 0x4e, 0x4d, 0x4d, 0x4d, 0x48, 0x5c, 0x0a,\n\t0x09, 0x49, 0x71, 0x6e, 0x57, 0x45, 0x30, 0x43, 0x73, 0x76, 0x5a, 0x36, 0x6a, 0x52, 0x69, 0x34, 0x55, 0x46, \n\t0x39, 0x6d, 0x4f, 0x58, 0x63, 0x42, 0x78, 0x6a, 0x70, 0x69, 0x75, 0x59, 0x76, 0x65, 0x78, 0x65, 0x53, 0x70, \n\t0x79, 0x50, 0x5a, 0x43, 0x52, 0x5a, 0x43, 0x76, 0x63, 0x71, 0x43, 0x61, 0x49, 0x68, 0x61, 0x2b, 0x4d, 0x64, \n\t0x66, 0x2b, 0x6b, 0x50, 0x37, 0x71, 0x38, 0x32, 0x66, 0x69, 0x36, 0x4d, 0x50, 0x65, 0x53, 0x4a, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x39, 0x54, 0x55, 0x31, 0x58, 0x38, 0x7a, 0x57, 0x6b, 0x57, 0x74, 0x4c, 0x72, 0x50, 0x7a, 0x67, 0x58, \n\t0x62, 0x52, 0x75, 0x4f, 0x6a, 0x38, 0x41, 0x53, 0x36, 0x30, 0x7a, 0x6a, 0x4b, 0x4c, 0x68, 0x65, 0x44, 0x32, \n\t0x4d, 0x31, 0x42, 0x47, 0x30, 0x77, 0x56, 0x6a, 0x4f, 0x70, 0x75, 0x63, 0x62, 0x5a, 0x62, 0x6b, 0x38, 0x69, \n\t0x71, 0x6c, 0x35, 0x78, 0x4e, 0x78, 0x68, 0x78, 0x55, 0x4b, 0x51, 0x49, 0x64, 0x6d, 0x48, 0x5a, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x61, 0x33, 0x64, 0x53, 0x2f, 0x77, 0x46, 0x4f, 0x41, 0x65, 0x73, 0x42, 0x44, 0x71, 0x68, 0x34, 0x54, \n\t0x4d, 0x65, 0x54, 0x4e, 0x45, 0x2f, 0x51, 0x64, 0x57, 0x50, 0x57, 0x76, 0x78, 0x58, 0x35, 0x2b, 0x45, 0x50, \n\t0x4c, 0x43, 0x47, 0x6d, 0x4b, 0x6f, 0x2b, 0x56, 0x4f, 0x37, 0x63, 0x66, 0x7a, 0x56, 0x4c, 0x71, 0x78, 0x73, \n\t0x41, 0x78, 0x43, 0x4d, 0x66, 0x48, 0x48, 0x75, 0x54, 0x75, 0x2f, 0x71, 0x37, 0x54, 0x36, 0x50, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x78, 0x79, 0x66, 0x37, 0x44, 0x37, 0x4c, 0x62, 0x52, 0x48, 0x6f, 0x74, 0x6b, 0x4b, 0x37, 0x2f, 0x47, \n\t0x6f, 0x6a, 0x58, 0x52, 0x48, 0x6f, 0x75, 0x75, 0x45, 0x33, 0x2f, 0x2f, 0x54, 0x53, 0x76, 0x35, 0x66, 0x2b, \n\t0x54, 0x45, 0x69, 0x6d, 0x44, 0x5a, 0x54, 0x63, 0x6f, 0x37, 0x37, 0x6c, 0x2b, 0x57, 0x65, 0x6e, 0x36, 0x4e, \n\t0x69, 0x4e, 0x42, 0x47, 0x70, 0x34, 0x4c, 0x42, 0x48, 0x6d, 0x65, 0x43, 0x39, 0x4c, 0x7a, 0x34, 0x53, 0x5c, 0x0a,\n\t0x09, 0x43, 0x44, 0x73, 0x74, 0x49, 0x4c, 0x74, 0x76, 0x4e, 0x41, 0x65, 0x67, 0x6a, 0x70, 0x41, 0x52, 0x49, \n\t0x70, 0x67, 0x7a, 0x71, 0x6b, 0x39, 0x50, 0x4d, 0x38, 0x46, 0x35, 0x44, 0x4b, 0x39, 0x6c, 0x36, 0x30, 0x4c, \n\t0x70, 0x56, 0x6c, 0x48, 0x7a, 0x77, 0x53, 0x38, 0x4a, 0x66, 0x6c, 0x30, 0x76, 0x33, 0x49, 0x31, 0x62, 0x33, \n\t0x74, 0x36, 0x43, 0x71, 0x50, 0x64, 0x45, 0x57, 0x46, 0x2f, 0x68, 0x37, 0x57, 0x31, 0x71, 0x72, 0x64, 0x5c, 0x0a,\n\t0x09, 0x33, 0x70, 0x43, 0x6b, 0x50, 0x36, 0x78, 0x37, 0x67, 0x54, 0x38, 0x48, 0x74, 0x67, 0x44, 0x4d, 0x76, \n\t0x4e, 0x78, 0x43, 0x4b, 0x45, 0x75, 0x35, 0x2b, 0x57, 0x4a, 0x42, 0x4e, 0x42, 0x6f, 0x74, 0x66, 0x75, 0x67, \n\t0x4a, 0x79, 0x4e, 0x55, 0x6d, 0x59, 0x71, 0x70, 0x36, 0x71, 0x4e, 0x79, 0x31, 0x66, 0x7a, 0x4f, 0x4f, 0x4f, \n\t0x46, 0x7a, 0x38, 0x54, 0x6e, 0x72, 0x79, 0x6e, 0x33, 0x50, 0x34, 0x38, 0x55, 0x77, 0x2f, 0x39, 0x65, 0x5c, 0x0a,\n\t0x09, 0x32, 0x49, 0x6d, 0x59, 0x50, 0x61, 0x4d, 0x48, 0x4b, 0x62, 0x41, 0x51, 0x41, 0x4d, 0x4d, 0x50, 0x4a, \n\t0x61, 0x53, 0x47, 0x51, 0x47, 0x6a, 0x48, 0x78, 0x67, 0x6d, 0x57, 0x48, 0x6b, 0x4b, 0x6b, 0x42, 0x4b, 0x77, \n\t0x30, 0x6a, 0x4b, 0x6f, 0x49, 0x76, 0x4c, 0x43, 0x43, 0x4d, 0x46, 0x4f, 0x6b, 0x6b, 0x59, 0x49, 0x59, 0x4f, \n\t0x38, 0x41, 0x45, 0x62, 0x37, 0x37, 0x6b, 0x45, 0x32, 0x44, 0x34, 0x77, 0x4c, 0x6a, 0x43, 0x79, 0x45, 0x5c, 0x0a,\n\t0x09, 0x43, 0x69, 0x6f, 0x76, 0x58, 0x32, 0x7a, 0x54, 0x62, 0x45, 0x52, 0x61, 0x65, 0x4d, 0x64, 0x6c, 0x69, \n\t0x4b, 0x6b, 0x71, 0x63, 0x6d, 0x6e, 0x6c, 0x41, 0x57, 0x71, 0x56, 0x33, 0x78, 0x4a, 0x48, 0x48, 0x66, 0x77, \n\t0x4e, 0x58, 0x54, 0x6c, 0x76, 0x35, 0x79, 0x32, 0x73, 0x66, 0x4f, 0x63, 0x66, 0x63, 0x48, 0x64, 0x73, 0x68, \n\t0x6b, 0x6f, 0x74, 0x4d, 0x63, 0x65, 0x6f, 0x45, 0x6d, 0x2b, 0x6d, 0x71, 0x57, 0x2f, 0x73, 0x39, 0x38, 0x5c, 0x0a,\n\t0x09, 0x58, 0x6c, 0x4d, 0x64, 0x46, 0x4d, 0x45, 0x77, 0x6d, 0x58, 0x52, 0x36, 0x50, 0x6c, 0x62, 0x4e, 0x69, \n\t0x48, 0x6c, 0x47, 0x79, 0x6d, 0x4b, 0x63, 0x32, 0x31, 0x63, 0x41, 0x37, 0x54, 0x68, 0x71, 0x4f, 0x4c, 0x44, \n\t0x65, 0x76, 0x44, 0x30, 0x4a, 0x70, 0x70, 0x69, 0x54, 0x66, 0x32, 0x4c, 0x59, 0x51, 0x47, 0x4b, 0x42, 0x73, \n\t0x52, 0x6a, 0x56, 0x6a, 0x37, 0x33, 0x2f, 0x6f, 0x6f, 0x6d, 0x4b, 0x33, 0x44, 0x62, 0x42, 0x30, 0x78, 0x5c, 0x0a,\n\t0x09, 0x56, 0x2f, 0x38, 0x6e, 0x34, 0x49, 0x50, 0x6f, 0x2f, 0x6f, 0x4d, 0x51, 0x44, 0x72, 0x55, 0x54, 0x58, \n\t0x73, 0x6a, 0x55, 0x43, 0x53, 0x38, 0x43, 0x7a, 0x32, 0x74, 0x48, 0x52, 0x6d, 0x45, 0x45, 0x4a, 0x44, 0x31, \n\t0x39, 0x5a, 0x4f, 0x53, 0x35, 0x67, 0x47, 0x65, 0x4f, 0x6a, 0x44, 0x79, 0x33, 0x48, 0x52, 0x31, 0x70, 0x49, \n\t0x79, 0x4d, 0x76, 0x2b, 0x71, 0x65, 0x4e, 0x6a, 0x4a, 0x54, 0x6f, 0x70, 0x6e, 0x68, 0x6b, 0x46, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x53, 0x37, 0x54, 0x62, 0x78, 0x39, 0x57, 0x34, 0x50, 0x30, 0x41, 0x68, 0x70, 0x65, 0x5a, 0x48, 0x51, \n\t0x37, 0x67, 0x6d, 0x64, 0x67, 0x49, 0x56, 0x52, 0x59, 0x74, 0x6d, 0x6b, 0x32, 0x5a, 0x6c, 0x72, 0x38, 0x31, \n\t0x49, 0x6e, 0x68, 0x34, 0x72, 0x4f, 0x41, 0x72, 0x77, 0x45, 0x48, 0x36, 0x38, 0x70, 0x56, 0x6a, 0x76, 0x77, \n\t0x39, 0x36, 0x6e, 0x2f, 0x32, 0x4a, 0x73, 0x54, 0x4d, 0x78, 0x6d, 0x49, 0x77, 0x38, 0x6c, 0x70, 0x74, 0x5c, 0x0a,\n\t0x09, 0x75, 0x4f, 0x68, 0x67, 0x46, 0x41, 0x4c, 0x4a, 0x42, 0x4b, 0x4d, 0x41, 0x4d, 0x45, 0x59, 0x59, 0x71, \n\t0x58, 0x44, 0x52, 0x77, 0x53, 0x68, 0x6f, 0x7a, 0x70, 0x6c, 0x67, 0x4a, 0x4a, 0x76, 0x4c, 0x79, 0x48, 0x33, \n\t0x33, 0x6d, 0x76, 0x70, 0x6c, 0x39, 0x44, 0x4b, 0x56, 0x37, 0x53, 0x2b, 0x4d, 0x72, 0x67, 0x65, 0x65, 0x44, \n\t0x6d, 0x77, 0x54, 0x77, 0x6b, 0x4b, 0x6f, 0x71, 0x43, 0x79, 0x49, 0x78, 0x6c, 0x41, 0x4b, 0x6a, 0x42, 0x5c, 0x0a,\n\t0x09, 0x34, 0x47, 0x66, 0x41, 0x66, 0x34, 0x66, 0x56, 0x30, 0x35, 0x4d, 0x54, 0x58, 0x4c, 0x31, 0x4a, 0x4e, \n\t0x4f, 0x6f, 0x58, 0x72, 0x63, 0x34, 0x39, 0x4d, 0x77, 0x55, 0x73, 0x47, 0x69, 0x68, 0x56, 0x45, 0x62, 0x4c, \n\t0x48, 0x6f, 0x59, 0x4b, 0x63, 0x44, 0x52, 0x77, 0x45, 0x67, 0x71, 0x45, 0x5a, 0x49, 0x57, 0x52, 0x6d, 0x48, \n\t0x2f, 0x6b, 0x51, 0x46, 0x47, 0x4d, 0x75, 0x6f, 0x6a, 0x30, 0x73, 0x42, 0x6f, 0x64, 0x52, 0x39, 0x79, 0x5c, 0x0a,\n\t0x09, 0x61, 0x58, 0x76, 0x76, 0x2f, 0x55, 0x56, 0x49, 0x63, 0x35, 0x39, 0x50, 0x33, 0x6a, 0x72, 0x38, 0x74, \n\t0x45, 0x75, 0x42, 0x5a, 0x77, 0x50, 0x37, 0x41, 0x47, 0x5a, 0x66, 0x59, 0x53, 0x46, 0x55, 0x56, 0x42, 0x5a, \n\t0x45, 0x59, 0x79, 0x6f, 0x46, 0x52, 0x76, 0x50, 0x41, 0x6c, 0x2f, 0x42, 0x6e, 0x37, 0x57, 0x70, 0x56, 0x66, \n\t0x63, 0x69, 0x54, 0x6d, 0x50, 0x71, 0x6a, 0x56, 0x30, 0x4a, 0x74, 0x4a, 0x67, 0x30, 0x6a, 0x4e, 0x34, 0x5c, 0x0a,\n\t0x09, 0x69, 0x41, 0x54, 0x44, 0x41, 0x4b, 0x52, 0x39, 0x67, 0x4d, 0x4d, 0x49, 0x71, 0x41, 0x30, 0x79, 0x32, \n\t0x4d, 0x6b, 0x6c, 0x46, 0x53, 0x43, 0x6b, 0x5a, 0x42, 0x4d, 0x79, 0x77, 0x4a, 0x6f, 0x2b, 0x58, 0x37, 0x6b, \n\t0x53, 0x74, 0x37, 0x79, 0x67, 0x43, 0x6a, 0x62, 0x79, 0x4e, 0x34, 0x47, 0x58, 0x41, 0x41, 0x4c, 0x49, 0x53, \n\t0x36, 0x6c, 0x51, 0x58, 0x52, 0x47, 0x45, 0x75, 0x42, 0x6b, 0x51, 0x44, 0x65, 0x67, 0x74, 0x39, 0x76, 0x5c, 0x0a,\n\t0x09, 0x70, 0x50, 0x32, 0x32, 0x73, 0x36, 0x67, 0x76, 0x4d, 0x50, 0x58, 0x34, 0x56, 0x31, 0x44, 0x35, 0x37, \n\t0x53, 0x66, 0x71, 0x59, 0x65, 0x54, 0x46, 0x67, 0x5a, 0x53, 0x43, 0x6b, 0x65, 0x66, 0x36, 0x4e, 0x34, 0x73, \n\t0x4a, 0x52, 0x6b, 0x70, 0x54, 0x54, 0x41, 0x38, 0x6a, 0x48, 0x7a, 0x70, 0x39, 0x68, 0x64, 0x47, 0x2b, 0x75, \n\t0x2f, 0x73, 0x7a, 0x6b, 0x74, 0x59, 0x39, 0x6a, 0x44, 0x34, 0x4d, 0x76, 0x42, 0x50, 0x38, 0x4b, 0x56, 0x5c, 0x0a,\n\t0x09, 0x51, 0x57, 0x51, 0x74, 0x33, 0x4c, 0x67, 0x6d, 0x6a, 0x4d, 0x70, 0x63, 0x41, 0x49, 0x34, 0x48, 0x48, \n\t0x41, 0x31, 0x34, 0x47, 0x48, 0x6d, 0x73, 0x70, 0x58, 0x48, 0x76, 0x77, 0x59, 0x70, 0x68, 0x37, 0x2f, 0x53, \n\t0x73, 0x54, 0x30, 0x42, 0x6a, 0x32, 0x4d, 0x46, 0x43, 0x41, 0x4e, 0x41, 0x6b, 0x59, 0x43, 0x36, 0x58, 0x65, \n\t0x69, 0x64, 0x77, 0x4f, 0x6a, 0x61, 0x48, 0x36, 0x52, 0x6a, 0x49, 0x37, 0x52, 0x32, 0x33, 0x4f, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x66, 0x79, 0x7a, 0x44, 0x68, 0x56, 0x45, 0x44, 0x77, 0x61, 0x75, 0x42, 0x73, 0x38, 0x4b, 0x45, 0x32, \n\t0x62, 0x2b, 0x78, 0x45, 0x4f, 0x70, 0x46, 0x46, 0x6b, 0x51, 0x54, 0x6f, 0x6b, 0x52, 0x54, 0x37, 0x58, 0x54, \n\t0x67, 0x5a, 0x61, 0x61, 0x79, 0x59, 0x6d, 0x71, 0x47, 0x32, 0x71, 0x50, 0x2b, 0x69, 0x75, 0x72, 0x78, 0x54, \n\t0x2f, 0x55, 0x54, 0x69, 0x73, 0x49, 0x6f, 0x37, 0x4e, 0x63, 0x78, 0x77, 0x69, 0x67, 0x2b, 0x76, 0x79, 0x5c, 0x0a,\n\t0x09, 0x67, 0x46, 0x6f, 0x7a, 0x43, 0x69, 0x4d, 0x63, 0x45, 0x6f, 0x4f, 0x56, 0x71, 0x57, 0x68, 0x4a, 0x48, \n\t0x30, 0x66, 0x45, 0x4a, 0x49, 0x44, 0x37, 0x6d, 0x32, 0x68, 0x4e, 0x78, 0x2f, 0x54, 0x33, 0x42, 0x69, 0x51, \n\t0x34, 0x48, 0x52, 0x76, 0x63, 0x43, 0x4c, 0x67, 0x46, 0x38, 0x68, 0x4c, 0x49, 0x44, 0x36, 0x4a, 0x51, 0x75, \n\t0x69, 0x43, 0x56, 0x49, 0x69, 0x4f, 0x76, 0x71, 0x66, 0x77, 0x4b, 0x63, 0x42, 0x76, 0x54, 0x75, 0x39, 0x5c, 0x0a,\n\t0x09, 0x45, 0x49, 0x6a, 0x35, 0x77, 0x35, 0x6b, 0x36, 0x34, 0x55, 0x56, 0x55, 0x6a, 0x6e, 0x6d, 0x4d, 0x48, \n\t0x6b, 0x59, 0x68, 0x59, 0x45, 0x77, 0x77, 0x43, 0x6f, 0x66, 0x38, 0x54, 0x54, 0x44, 0x79, 0x50, 0x44, 0x2f, \n\t0x66, 0x43, 0x4b, 0x4e, 0x67, 0x71, 0x4e, 0x34, 0x45, 0x6f, 0x78, 0x42, 0x49, 0x2b, 0x4e, 0x4d, 0x47, 0x55, \n\t0x6a, 0x41, 0x4b, 0x38, 0x75, 0x54, 0x69, 0x4e, 0x75, 0x54, 0x71, 0x76, 0x75, 0x69, 0x38, 0x63, 0x71, 0x5c, 0x0a,\n\t0x09, 0x73, 0x34, 0x6a, 0x43, 0x34, 0x41, 0x58, 0x67, 0x72, 0x63, 0x44, 0x7a, 0x44, 0x37, 0x53, 0x67, 0x75, \n\t0x68, 0x66, 0x73, 0x6d, 0x43, 0x61, 0x41, 0x4b, 0x6c, 0x41, 0x4f, 0x6b, 0x59, 0x34, 0x41, 0x7a, 0x67, 0x4f, \n\t0x64, 0x71, 0x43, 0x77, 0x57, 0x2f, 0x6c, 0x48, 0x48, 0x45, 0x38, 0x55, 0x79, 0x66, 0x38, 0x4e, 0x63, 0x35, \n\t0x42, 0x78, 0x32, 0x68, 0x68, 0x4a, 0x4e, 0x58, 0x2b, 0x49, 0x78, 0x32, 0x4d, 0x31, 0x4b, 0x46, 0x37, 0x5c, 0x0a,\n\t0x09, 0x48, 0x59, 0x78, 0x6b, 0x47, 0x45, 0x46, 0x31, 0x43, 0x61, 0x4d, 0x77, 0x41, 0x6a, 0x4c, 0x42, 0x79, \n\t0x47, 0x76, 0x69, 0x37, 0x62, 0x36, 0x39, 0x33, 0x5a, 0x66, 0x55, 0x66, 0x78, 0x68, 0x35, 0x77, 0x41, 0x63, \n\t0x45, 0x66, 0x41, 0x42, 0x77, 0x77, 0x55, 0x4b, 0x6f, 0x33, 0x37, 0x49, 0x67, 0x6d, 0x6c, 0x41, 0x6c, 0x6f, \n\t0x71, 0x4f, 0x58, 0x41, 0x4a, 0x38, 0x45, 0x30, 0x68, 0x38, 0x53, 0x55, 0x33, 0x36, 0x76, 0x79, 0x72, 0x5c, 0x0a,\n\t0x09, 0x47, 0x50, 0x70, 0x66, 0x62, 0x49, 0x6b, 0x78, 0x44, 0x7a, 0x68, 0x78, 0x74, 0x67, 0x31, 0x47, 0x71, \n\t0x44, 0x52, 0x51, 0x63, 0x6a, 0x5a, 0x65, 0x52, 0x4d, 0x43, 0x36, 0x4d, 0x41, 0x4d, 0x6d, 0x59, 0x59, 0x75, \n\t0x55, 0x47, 0x51, 0x55, 0x78, 0x78, 0x47, 0x63, 0x76, 0x6c, 0x2b, 0x35, 0x49, 0x45, 0x48, 0x74, 0x4f, 0x66, \n\t0x56, 0x55, 0x64, 0x6b, 0x77, 0x75, 0x68, 0x74, 0x34, 0x4f, 0x58, 0x42, 0x52, 0x57, 0x4e, 0x52, 0x43, 0x5c, 0x0a,\n\t0x09, 0x71, 0x50, 0x2b, 0x79, 0x49, 0x4a, 0x70, 0x77, 0x4b, 0x55, 0x41, 0x36, 0x44, 0x50, 0x67, 0x34, 0x38, \n\t0x4c, 0x39, 0x69, 0x42, 0x57, 0x4b, 0x2f, 0x6c, 0x77, 0x51, 0x68, 0x71, 0x44, 0x7a, 0x34, 0x73, 0x64, 0x53, \n\t0x4f, 0x66, 0x78, 0x70, 0x69, 0x34, 0x53, 0x67, 0x39, 0x6a, 0x4e, 0x77, 0x57, 0x61, 0x68, 0x2f, 0x52, 0x55, \n\t0x47, 0x45, 0x55, 0x7a, 0x72, 0x35, 0x4f, 0x77, 0x73, 0x68, 0x72, 0x34, 0x44, 0x32, 0x77, 0x42, 0x66, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x35, 0x64, 0x5a, 0x41, 0x65, 0x52, 0x6c, 0x39, 0x43, 0x38, 0x45, 0x5a, 0x67, 0x50, 0x38, 0x43, \n\t0x63, 0x42, 0x64, 0x44, 0x41, 0x5a, 0x45, 0x47, 0x30, 0x44, 0x70, 0x53, 0x49, 0x6a, 0x70, 0x36, 0x43, 0x48, \n\t0x78, 0x30, 0x39, 0x49, 0x6b, 0x70, 0x4a, 0x77, 0x73, 0x68, 0x50, 0x70, 0x48, 0x4c, 0x55, 0x49, 0x36, 0x67, \n\t0x2b, 0x39, 0x45, 0x39, 0x78, 0x44, 0x6e, 0x32, 0x59, 0x4d, 0x6d, 0x71, 0x6d, 0x76, 0x4c, 0x47, 0x66, 0x5c, 0x0a,\n\t0x09, 0x42, 0x61, 0x4f, 0x67, 0x2f, 0x38, 0x67, 0x4d, 0x49, 0x79, 0x38, 0x59, 0x67, 0x54, 0x50, 0x42, 0x4b, \n\t0x41, 0x47, 0x61, 0x48, 0x44, 0x44, 0x79, 0x64, 0x74, 0x2f, 0x71, 0x54, 0x30, 0x31, 0x51, 0x31, 0x52, 0x32, \n\t0x4d, 0x74, 0x67, 0x4f, 0x76, 0x42, 0x66, 0x6e, 0x39, 0x4d, 0x4e, 0x31, 0x43, 0x61, 0x4c, 0x43, 0x79, 0x49, \n\t0x46, 0x70, 0x48, 0x55, 0x6f, 0x42, 0x55, 0x42, 0x64, 0x34, 0x41, 0x76, 0x41, 0x66, 0x59, 0x43, 0x42, 0x5c, 0x0a,\n\t0x09, 0x68, 0x67, 0x46, 0x4c, 0x79, 0x72, 0x75, 0x6e, 0x41, 0x55, 0x31, 0x64, 0x39, 0x36, 0x41, 0x73, 0x34, \n\t0x78, 0x4a, 0x79, 0x43, 0x63, 0x57, 0x74, 0x6f, 0x2b, 0x4a, 0x4f, 0x79, 0x4d, 0x31, 0x73, 0x49, 0x6f, 0x47, \n\t0x50, 0x49, 0x33, 0x77, 0x63, 0x67, 0x4c, 0x5a, 0x6c, 0x68, 0x33, 0x43, 0x36, 0x4e, 0x6f, 0x57, 0x65, 0x49, \n\t0x39, 0x63, 0x43, 0x75, 0x34, 0x4d, 0x65, 0x75, 0x6d, 0x39, 0x6b, 0x6e, 0x6b, 0x6b, 0x34, 0x76, 0x67, 0x5c, 0x0a,\n\t0x09, 0x64, 0x4f, 0x44, 0x64, 0x42, 0x4c, 0x4f, 0x6b, 0x35, 0x31, 0x37, 0x31, 0x73, 0x37, 0x7a, 0x62, 0x57, \n\t0x76, 0x55, 0x67, 0x43, 0x36, 0x4a, 0x31, 0x70, 0x6b, 0x52, 0x30, 0x74, 0x42, 0x46, 0x2f, 0x51, 0x74, 0x37, \n\t0x72, 0x67, 0x65, 0x6b, 0x73, 0x47, 0x41, 0x46, 0x51, 0x71, 0x56, 0x45, 0x35, 0x36, 0x76, 0x65, 0x70, 0x48, \n\t0x50, 0x31, 0x6f, 0x78, 0x43, 0x45, 0x50, 0x49, 0x66, 0x49, 0x38, 0x55, 0x70, 0x70, 0x6b, 0x52, 0x68, 0x5c, 0x0a,\n\t0x09, 0x69, 0x46, 0x37, 0x36, 0x69, 0x5a, 0x59, 0x42, 0x51, 0x41, 0x78, 0x51, 0x69, 0x6a, 0x43, 0x46, 0x67, \n\t0x47, 0x47, 0x48, 0x6b, 0x74, 0x76, 0x4a, 0x32, 0x62, 0x2f, 0x66, 0x4c, 0x61, 0x56, 0x7a, 0x45, 0x36, 0x33, \n\t0x70, 0x65, 0x58, 0x41, 0x61, 0x38, 0x44, 0x4e, 0x6f, 0x58, 0x62, 0x57, 0x77, 0x67, 0x4e, 0x54, 0x78, 0x5a, \n\t0x45, 0x36, 0x31, 0x51, 0x4a, 0x49, 0x42, 0x32, 0x4c, 0x44, 0x36, 0x52, 0x58, 0x49, 0x59, 0x51, 0x79, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x31, 0x73, 0x44, 0x6f, 0x33, 0x42, 0x39, 0x61, 0x67, 0x37, 0x6e, 0x71, 0x45, 0x66, 0x69, 0x48, \n\t0x50, 0x5a, 0x77, 0x6e, 0x49, 0x4f, 0x50, 0x39, 0x63, 0x74, 0x47, 0x37, 0x36, 0x56, 0x35, 0x5a, 0x68, 0x68, \n\t0x46, 0x63, 0x35, 0x41, 0x4d, 0x4d, 0x4a, 0x4b, 0x65, 0x50, 0x2b, 0x6e, 0x52, 0x43, 0x43, 0x4d, 0x5a, 0x6a, \n\t0x35, 0x44, 0x77, 0x35, 0x79, 0x50, 0x4a, 0x50, 0x56, 0x74, 0x39, 0x38, 0x37, 0x54, 0x6f, 0x41, 0x44, 0x5c, 0x0a,\n\t0x09, 0x55, 0x6e, 0x72, 0x62, 0x38, 0x33, 0x62, 0x77, 0x50, 0x65, 0x69, 0x2f, 0x38, 0x43, 0x73, 0x51, 0x53, \n\t0x59, 0x2b, 0x31, 0x73, 0x4c, 0x6f, 0x47, 0x48, 0x4c, 0x67, 0x6d, 0x69, 0x64, 0x4b, 0x77, 0x47, 0x6b, 0x34, \n\t0x34, 0x42, 0x2f, 0x52, 0x49, 0x68, 0x58, 0x41, 0x64, 0x4e, 0x2b, 0x6b, 0x68, 0x6c, 0x47, 0x66, 0x69, 0x4a, \n\t0x51, 0x72, 0x65, 0x4d, 0x63, 0x66, 0x42, 0x7a, 0x4f, 0x49, 0x62, 0x2f, 0x74, 0x6d, 0x39, 0x37, 0x50, 0x5c, 0x0a,\n\t0x09, 0x62, 0x49, 0x78, 0x48, 0x50, 0x6b, 0x5a, 0x6a, 0x4e, 0x64, 0x6b, 0x7a, 0x6a, 0x4f, 0x54, 0x61, 0x49, \n\t0x6e, 0x4c, 0x2f, 0x33, 0x63, 0x6a, 0x47, 0x73, 0x76, 0x37, 0x59, 0x55, 0x6d, 0x6c, 0x52, 0x34, 0x6e, 0x62, \n\t0x38, 0x34, 0x66, 0x67, 0x7a, 0x67, 0x55, 0x61, 0x59, 0x61, 0x43, 0x45, 0x30, 0x47, 0x6c, 0x6b, 0x51, 0x57, \n\t0x51, 0x45, 0x70, 0x49, 0x42, 0x32, 0x46, 0x45, 0x4b, 0x38, 0x44, 0x54, 0x67, 0x5a, 0x35, 0x75, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x70, 0x68, 0x68, 0x4a, 0x47, 0x71, 0x36, 0x6a, 0x54, 0x4f, 0x68, 0x67, 0x63, 0x68, 0x35, 0x67, 0x37, \n\t0x7a, 0x2f, 0x30, 0x30, 0x66, 0x68, 0x4a, 0x69, 0x61, 0x51, 0x32, 0x38, 0x66, 0x6b, 0x67, 0x47, 0x6a, 0x4b, \n\t0x4f, 0x4a, 0x52, 0x59, 0x4e, 0x52, 0x61, 0x38, 0x39, 0x2b, 0x2b, 0x58, 0x39, 0x73, 0x50, 0x4b, 0x33, 0x76, \n\t0x39, 0x64, 0x38, 0x31, 0x30, 0x78, 0x32, 0x41, 0x36, 0x4e, 0x74, 0x69, 0x4b, 0x45, 0x42, 0x38, 0x48, 0x5c, 0x0a,\n\t0x09, 0x50, 0x6b, 0x76, 0x77, 0x6f, 0x69, 0x70, 0x59, 0x41, 0x49, 0x31, 0x61, 0x46, 0x6b, 0x52, 0x57, 0x4d, \n\t0x63, 0x57, 0x41, 0x4a, 0x4d, 0x51, 0x30, 0x38, 0x42, 0x4b, 0x51, 0x72, 0x77, 0x57, 0x65, 0x32, 0x45, 0x37, \n\t0x57, 0x62, 0x4e, 0x6a, 0x70, 0x5a, 0x78, 0x63, 0x4f, 0x6f, 0x6a, 0x34, 0x50, 0x74, 0x54, 0x6c, 0x45, 0x66, \n\t0x52, 0x61, 0x71, 0x64, 0x59, 0x52, 0x54, 0x55, 0x38, 0x7a, 0x34, 0x55, 0x61, 0x4b, 0x65, 0x46, 0x74, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x74, 0x67, 0x4e, 0x73, 0x41, 0x72, 0x77, 0x6d, 0x74, 0x42, 0x72, 0x52, 0x57, 0x6b, 0x4d, 0x30, \n\t0x56, 0x76, 0x35, 0x50, 0x63, 0x75, 0x49, 0x2f, 0x4d, 0x74, 0x4b, 0x75, 0x41, 0x6a, 0x77, 0x4c, 0x2f, 0x43, \n\t0x62, 0x54, 0x43, 0x6b, 0x37, 0x41, 0x41, 0x4b, 0x6f, 0x63, 0x73, 0x69, 0x4b, 0x79, 0x30, 0x57, 0x6a, 0x7a, \n\t0x74, 0x79, 0x63, 0x46, 0x53, 0x39, 0x4c, 0x76, 0x2f, 0x41, 0x66, 0x41, 0x4b, 0x2f, 0x46, 0x64, 0x48, 0x5c, 0x0a,\n\t0x09, 0x48, 0x74, 0x51, 0x56, 0x6a, 0x44, 0x71, 0x56, 0x4e, 0x57, 0x78, 0x66, 0x36, 0x4a, 0x61, 0x4b, 0x6c, \n\t0x39, 0x30, 0x48, 0x66, 0x42, 0x33, 0x42, 0x46, 0x34, 0x48, 0x59, 0x70, 0x31, 0x58, 0x6e, 0x58, 0x6d, 0x32, \n\t0x48, 0x34, 0x38, 0x73, 0x6b, 0x43, 0x79, 0x4b, 0x72, 0x6a, 0x6c, 0x6f, 0x38, 0x4c, 0x64, 0x5a, 0x73, 0x71, \n\t0x2b, 0x42, 0x37, 0x4d, 0x6a, 0x39, 0x66, 0x43, 0x4a, 0x34, 0x48, 0x50, 0x43, 0x68, 0x57, 0x65, 0x50, 0x5c, 0x0a,\n\t0x09, 0x51, 0x77, 0x57, 0x6b, 0x46, 0x77, 0x41, 0x66, 0x41, 0x66, 0x2b, 0x4b, 0x5a, 0x78, 0x71, 0x32, 0x47, \n\t0x39, 0x46, 0x6a, 0x37, 0x6c, 0x6c, 0x51, 0x57, 0x52, 0x56, 0x57, 0x34, 0x6c, 0x67, 0x41, 0x51, 0x43, 0x49, \n\t0x65, 0x41, 0x78, 0x77, 0x44, 0x50, 0x78, 0x62, 0x56, 0x4b, 0x66, 0x41, 0x4e, 0x52, 0x48, 0x41, 0x4b, 0x4f, \n\t0x37, 0x67, 0x52, 0x38, 0x42, 0x33, 0x77, 0x64, 0x2b, 0x67, 0x67, 0x2b, 0x6a, 0x53, 0x48, 0x4f, 0x76, 0x5c, 0x0a,\n\t0x09, 0x73, 0x51, 0x41, 0x71, 0x75, 0x79, 0x79, 0x49, 0x72, 0x4c, 0x72, 0x53, 0x34, 0x75, 0x6c, 0x74, 0x4b, \n\t0x43, 0x6d, 0x2f, 0x65, 0x42, 0x33, 0x66, 0x45, 0x2b, 0x6d, 0x50, 0x45, 0x54, 0x77, 0x47, 0x65, 0x43, 0x79, \n\t0x2b, 0x6e, 0x57, 0x33, 0x32, 0x68, 0x2b, 0x79, 0x4c, 0x77, 0x57, 0x67, 0x2f, 0x63, 0x42, 0x50, 0x77, 0x71, \n\t0x2b, 0x44, 0x66, 0x70, 0x51, 0x51, 0x66, 0x4d, 0x46, 0x51, 0x31, 0x39, 0x31, 0x6f, 0x4c, 0x6e, 0x33, 0x5c, 0x0a,\n\t0x09, 0x47, 0x53, 0x42, 0x5a, 0x46, 0x56, 0x58, 0x37, 0x52, 0x30, 0x2b, 0x6f, 0x6e, 0x70, 0x52, 0x50, 0x39, \n\t0x57, 0x6d, 0x4d, 0x4b, 0x48, 0x30, 0x63, 0x4f, 0x42, 0x42, 0x77, 0x4e, 0x50, 0x77, 0x4f, 0x47, 0x6c, 0x6f, \n\t0x45, 0x59, 0x34, 0x30, 0x76, 0x38, 0x65, 0x69, 0x5a, 0x41, 0x67, 0x50, 0x45, 0x54, 0x46, 0x52, 0x56, 0x51, \n\t0x62, 0x65, 0x4d, 0x32, 0x70, 0x37, 0x38, 0x71, 0x31, 0x2b, 0x69, 0x62, 0x67, 0x50, 0x75, 0x41, 0x57, 0x5c, 0x0a,\n\t0x09, 0x34, 0x47, 0x5a, 0x67, 0x75, 0x2b, 0x34, 0x57, 0x73, 0x2b, 0x41, 0x5a, 0x62, 0x31, 0x6b, 0x51, 0x57, \n\t0x51, 0x31, 0x4d, 0x53, 0x32, 0x65, 0x6b, 0x6d, 0x6e, 0x49, 0x49, 0x68, 0x37, 0x64, 0x52, 0x45, 0x52, 0x38, \n\t0x52, 0x6a, 0x6b, 0x54, 0x34, 0x6e, 0x30, 0x70, 0x44, 0x56, 0x46, 0x31, 0x45, 0x74, 0x51, 0x57, 0x31, 0x42, \n\t0x6b, 0x36, 0x31, 0x69, 0x61, 0x69, 0x74, 0x49, 0x71, 0x72, 0x4c, 0x55, 0x46, 0x76, 0x37, 0x64, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x50, 0x58, 0x6f, 0x53, 0x2f, 0x77, 0x6c, 0x75, 0x62, 0x77, 0x6c, 0x6a, 0x64, 0x45, 0x31, 0x63, 0x7a, \n\t0x2f, 0x6e, 0x59, 0x58, 0x4f, 0x70, 0x4d, 0x6d, 0x43, 0x79, 0x47, 0x6f, 0x6f, 0x57, 0x6a, 0x72, 0x6a, 0x78, \n\t0x50, 0x43, 0x54, 0x39, 0x74, 0x2b, 0x6a, 0x49, 0x70, 0x36, 0x54, 0x41, 0x6c, 0x47, 0x74, 0x42, 0x64, 0x55, \n\t0x51, 0x52, 0x41, 0x63, 0x51, 0x31, 0x52, 0x57, 0x6f, 0x72, 0x62, 0x57, 0x6f, 0x72, 0x42, 0x77, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x62, 0x4b, 0x38, 0x38, 0x63, 0x57, 0x6e, 0x55, 0x70, 0x32, 0x41, 0x31, 0x51, 0x4e, 0x6b, 0x76, 0x76, \n\t0x56, 0x6f, 0x4e, 0x54, 0x78, 0x34, 0x43, 0x65, 0x46, 0x49, 0x71, 0x58, 0x59, 0x41, 0x36, 0x67, 0x37, 0x75, \n\t0x64, 0x52, 0x68, 0x56, 0x34, 0x4e, 0x59, 0x42, 0x33, 0x75, 0x64, 0x35, 0x6f, 0x30, 0x6d, 0x70, 0x39, 0x79, \n\t0x59, 0x4c, 0x49, 0x71, 0x68, 0x39, 0x36, 0x42, 0x48, 0x42, 0x49, 0x64, 0x68, 0x45, 0x76, 0x75, 0x66, 0x5c, 0x0a,\n\t0x09, 0x77, 0x61, 0x34, 0x51, 0x68, 0x37, 0x2f, 0x31, 0x6b, 0x42, 0x46, 0x6b, 0x52, 0x57, 0x2f, 0x64, 0x48, \n\t0x2f, 0x30, 0x4b, 0x61, 0x71, 0x59, 0x58, 0x6d, 0x36, 0x5a, 0x58, 0x38, 0x63, 0x2f, 0x72, 0x77, 0x6c, 0x4b, \n\t0x79, 0x73, 0x4c, 0x49, 0x71, 0x75, 0x2b, 0x36, 0x50, 0x48, 0x35, 0x69, 0x38, 0x61, 0x61, 0x61, 0x71, 0x39, \n\t0x41, 0x43, 0x4c, 0x78, 0x4e, 0x68, 0x2f, 0x62, 0x37, 0x65, 0x4b, 0x7a, 0x47, 0x54, 0x42, 0x5a, 0x45, 0x5c, 0x0a,\n\t0x09, 0x56, 0x6c, 0x31, 0x72, 0x38, 0x56, 0x4d, 0x6e, 0x68, 0x6b, 0x48, 0x50, 0x45, 0x37, 0x4c, 0x4b, 0x69, \n\t0x65, 0x53, 0x33, 0x36, 0x45, 0x58, 0x30, 0x39, 0x77, 0x58, 0x55, 0x61, 0x76, 0x4f, 0x44, 0x4f, 0x44, 0x61, \n\t0x72, 0x38, 0x5a, 0x49, 0x46, 0x6b, 0x56, 0x56, 0x76, 0x38, 0x6c, 0x67, 0x41, 0x66, 0x69, 0x2b, 0x56, 0x62, \n\t0x6a, 0x4b, 0x75, 0x6a, 0x32, 0x73, 0x4f, 0x4f, 0x4b, 0x6e, 0x76, 0x78, 0x32, 0x51, 0x31, 0x64, 0x72, 0x5c, 0x0a,\n\t0x09, 0x49, 0x67, 0x73, 0x75, 0x70, 0x56, 0x6a, 0x79, 0x46, 0x35, 0x48, 0x77, 0x6e, 0x31, 0x62, 0x7a, 0x49, \n\t0x61, 0x55, 0x74, 0x63, 0x64, 0x67, 0x42, 0x66, 0x68, 0x43, 0x4c, 0x79, 0x62, 0x6a, 0x78, 0x6e, 0x55, 0x38, \n\t0x56, 0x6d, 0x4e, 0x67, 0x53, 0x79, 0x49, 0x72, 0x48, 0x72, 0x56, 0x43, 0x62, 0x45, 0x31, 0x6f, 0x33, 0x2b, \n\t0x51, 0x56, 0x43, 0x44, 0x6b, 0x71, 0x65, 0x6c, 0x2f, 0x77, 0x58, 0x54, 0x64, 0x4e, 0x73, 0x2f, 0x57, 0x5c, 0x0a,\n\t0x09, 0x75, 0x53, 0x79, 0x49, 0x72, 0x48, 0x72, 0x56, 0x43, 0x65, 0x61, 0x73, 0x50, 0x4a, 0x50, 0x5a, 0x6e, \n\t0x47, 0x6e, 0x38, 0x46, 0x32, 0x75, 0x74, 0x31, 0x72, 0x45, 0x73, 0x69, 0x4b, 0x78, 0x36, 0x6c, 0x51, 0x6c, \n\t0x45, 0x6d, 0x77, 0x69, 0x2b, 0x6e, 0x68, 0x71, 0x58, 0x2f, 0x43, 0x72, 0x4a, 0x7a, 0x6d, 0x75, 0x63, 0x5a, \n\t0x78, 0x58, 0x7a, 0x47, 0x62, 0x47, 0x61, 0x4e, 0x46, 0x6b, 0x51, 0x57, 0x58, 0x57, 0x6c, 0x78, 0x55, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x65, 0x47, 0x41, 0x59, 0x38, 0x76, 0x32, 0x73, 0x6f, 0x38, 0x67, 0x37, 0x67, 0x53, 0x6b, 0x30, \n\t0x2f, 0x30, 0x65, 0x6e, 0x41, 0x5a, 0x2b, 0x4a, 0x4e, 0x4e, 0x5a, 0x35, 0x42, 0x70, 0x59, 0x62, 0x63, 0x2f, \n\t0x6f, 0x65, 0x44, 0x4f, 0x56, 0x69, 0x72, 0x30, 0x73, 0x75, 0x43, 0x79, 0x4b, 0x6f, 0x58, 0x48, 0x51, 0x50, \n\t0x4d, 0x61, 0x74, 0x4a, 0x2f, 0x43, 0x64, 0x36, 0x50, 0x45, 0x4f, 0x49, 0x53, 0x54, 0x64, 0x35, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x34, 0x45, 0x33, 0x41, 0x64, 0x55, 0x41, 0x59, 0x43, 0x42, 0x30, 0x72, 0x35, 0x68, 0x65, 0x4f, 0x47, \n\t0x39, 0x41, 0x78, 0x57, 0x6f, 0x32, 0x42, 0x4c, 0x49, 0x69, 0x73, 0x65, 0x74, 0x48, 0x44, 0x44, 0x65, 0x6e, \n\t0x76, 0x44, 0x4b, 0x4b, 0x64, 0x69, 0x32, 0x4c, 0x52, 0x6b, 0x4a, 0x2b, 0x32, 0x48, 0x55, 0x2b, 0x73, 0x41, \n\t0x69, 0x38, 0x47, 0x2f, 0x45, 0x39, 0x30, 0x2b, 0x44, 0x44, 0x36, 0x62, 0x34, 0x4d, 0x36, 0x53, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x76, 0x79, 0x79, 0x34, 0x4c, 0x49, 0x71, 0x68, 0x66, 0x70, 0x78, 0x74, 0x79, 0x2f, 0x4c, 0x31, 0x30, \n\t0x75, 0x43, 0x75, 0x42, 0x79, 0x43, 0x66, 0x46, 0x32, 0x32, 0x52, 0x37, 0x70, 0x54, 0x69, 0x32, 0x43, 0x41, \n\t0x4d, 0x65, 0x35, 0x43, 0x58, 0x69, 0x39, 0x54, 0x79, 0x45, 0x48, 0x77, 0x4c, 0x62, 0x4c, 0x31, 0x72, 0x45, \n\t0x73, 0x69, 0x4b, 0x78, 0x36, 0x55, 0x66, 0x4c, 0x64, 0x6a, 0x44, 0x58, 0x67, 0x2f, 0x77, 0x43, 0x49, 0x5c, 0x0a,\n\t0x09, 0x69, 0x6f, 0x52, 0x4b, 0x63, 0x79, 0x39, 0x68, 0x45, 0x38, 0x7a, 0x6e, 0x30, 0x59, 0x33, 0x49, 0x43, \n\t0x70, 0x55, 0x2f, 0x32, 0x65, 0x33, 0x62, 0x79, 0x6c, 0x52, 0x72, 0x58, 0x77, 0x61, 0x2b, 0x34, 0x6b, 0x4e, \n\t0x4c, 0x48, 0x44, 0x47, 0x73, 0x67, 0x37, 0x59, 0x71, 0x6e, 0x79, 0x79, 0x49, 0x72, 0x48, 0x70, 0x52, 0x2f, \n\t0x49, 0x31, 0x37, 0x77, 0x58, 0x75, 0x6c, 0x78, 0x78, 0x61, 0x41, 0x36, 0x52, 0x66, 0x39, 0x49, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x79, 0x31, 0x34, 0x79, 0x4c, 0x46, 0x79, 0x75, 0x71, 0x6d, 0x63, 0x4d, 0x48, 0x35, 0x37, 0x2f, 0x76, \n\t0x39, 0x54, 0x77, 0x37, 0x35, 0x6e, 0x38, 0x57, 0x2b, 0x47, 0x63, 0x46, 0x53, 0x73, 0x63, 0x39, 0x36, 0x57, \n\t0x45, 0x32, 0x53, 0x4c, 0x49, 0x69, 0x73, 0x65, 0x70, 0x47, 0x48, 0x45, 0x48, 0x37, 0x72, 0x53, 0x76, 0x41, \n\t0x7a, 0x34, 0x4b, 0x4d, 0x67, 0x6d, 0x50, 0x30, 0x62, 0x78, 0x57, 0x6c, 0x52, 0x6f, 0x48, 0x5a, 0x59, 0x5c, 0x0a,\n\t0x09, 0x58, 0x35, 0x65, 0x71, 0x59, 0x57, 0x70, 0x71, 0x43, 0x58, 0x67, 0x78, 0x67, 0x71, 0x38, 0x50, 0x2b, \n\t0x46, 0x69, 0x74, 0x53, 0x69, 0x77, 0x4c, 0x49, 0x71, 0x74, 0x65, 0x64, 0x47, 0x50, 0x77, 0x39, 0x78, 0x4c, \n\t0x67, 0x2b, 0x58, 0x67, 0x79, 0x50, 0x6d, 0x2f, 0x49, 0x44, 0x33, 0x41, 0x75, 0x56, 0x72, 0x71, 0x4a, 0x59, \n\t0x6c, 0x38, 0x39, 0x64, 0x42, 0x36, 0x39, 0x45, 0x36, 0x70, 0x56, 0x71, 0x45, 0x39, 0x66, 0x4b, 0x31, 0x5c, 0x0a,\n\t0x09, 0x64, 0x58, 0x4e, 0x39, 0x6d, 0x70, 0x52, 0x4f, 0x74, 0x58, 0x31, 0x56, 0x45, 0x66, 0x67, 0x4e, 0x56, \n\t0x59, 0x36, 0x78, 0x78, 0x38, 0x5a, 0x38, 0x62, 0x4c, 0x70, 0x59, 0x63, 0x72, 0x48, 0x4a, 0x68, 0x37, 0x56, \n\t0x66, 0x77, 0x4c, 0x71, 0x36, 0x4c, 0x53, 0x33, 0x41, 0x6c, 0x73, 0x42, 0x6c, 0x7a, 0x5a, 0x6d, 0x72, 0x70, \n\t0x65, 0x56, 0x42, 0x75, 0x78, 0x66, 0x4f, 0x66, 0x68, 0x57, 0x34, 0x64, 0x31, 0x72, 0x46, 0x59, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x6f, 0x32, 0x49, 0x72, 0x4c, 0x71, 0x58, 0x77, 0x41, 0x58, 0x35, 0x53, 0x2b, 0x6e, 0x68, 0x49, \n\t0x74, 0x50, 0x66, 0x47, 0x61, 0x73, 0x2f, 0x39, 0x2f, 0x4b, 0x77, 0x6e, 0x2b, 0x67, 0x43, 0x68, 0x48, 0x77, \n\t0x54, 0x30, 0x71, 0x48, 0x36, 0x6c, 0x4e, 0x74, 0x48, 0x63, 0x71, 0x68, 0x57, 0x35, 0x56, 0x5a, 0x75, 0x38, \n\t0x33, 0x77, 0x72, 0x71, 0x32, 0x37, 0x55, 0x4f, 0x75, 0x2b, 0x78, 0x34, 0x41, 0x54, 0x66, 0x74, 0x61, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x34, 0x56, 0x4a, 0x39, 0x2b, 0x77, 0x32, 0x67, 0x50, 0x79, 0x4b, 0x71, 0x55, 0x73, 0x69, 0x43, \n\t0x79, 0x73, 0x72, 0x49, 0x61, 0x75, 0x57, 0x7a, 0x54, 0x7a, 0x4d, 0x72, 0x4b, 0x61, 0x75, 0x53, 0x79, 0x49, \n\t0x4c, 0x4b, 0x79, 0x73, 0x68, 0x71, 0x35, 0x4c, 0x49, 0x69, 0x73, 0x72, 0x4b, 0x78, 0x47, 0x4c, 0x67, 0x73, \n\t0x69, 0x4b, 0x79, 0x75, 0x72, 0x6b, 0x63, 0x75, 0x43, 0x79, 0x4d, 0x72, 0x4b, 0x61, 0x75, 0x53, 0x79, 0x5c, 0x0a,\n\t0x09, 0x49, 0x4c, 0x4b, 0x79, 0x73, 0x68, 0x71, 0x35, 0x4c, 0x49, 0x69, 0x73, 0x72, 0x4b, 0x78, 0x47, 0x4c, \n\t0x67, 0x73, 0x69, 0x4b, 0x79, 0x75, 0x72, 0x6b, 0x65, 0x75, 0x2f, 0x41, 0x42, 0x48, 0x45, 0x4c, 0x56, 0x65, \n\t0x38, 0x7a, 0x45, 0x75, 0x49, 0x41, 0x41, 0x41, 0x41, 0x41, 0x45, 0x6c, 0x46, 0x54, 0x6b, 0x53, 0x75, 0x51, \n\t0x6d, 0x43, 0x43, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x64, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x5b, 0x31, 0x5d, 0x2e, 0x6e, 0x6f, 0x72, \n\t0x6d, 0x61, 0x6c, 0x5f, 0x70, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, \n\t0x61, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, \n\t0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x4a, 0x45, 0x41, 0x41, 0x41, 0x44, 0x4e, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x43, 0x34, 0x6c, 0x4a, 0x4b, 0x76, 0x41, 0x41, 0x41, 0x67, 0x41, 0x45, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x34, 0x6e, 0x4f, 0x32, 0x64, 0x65, 0x62, 0x77, 0x6c, 0x52, 0x33, 0x57, 0x59, 0x76, 0x39, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x33, 0x65, 0x2b, 0x76, 0x4d, 0x61, 0x45, 0x62, 0x4c, 0x61, 0x42, 0x30, 0x4a, 0x41, 0x52, 0x49, \n\t0x53, 0x4d, 0x6f, 0x75, 0x4d, 0x52, 0x79, 0x77, 0x43, 0x4a, 0x49, 0x79, 0x4e, 0x51, 0x54, 0x48, 0x45, 0x49, \n\t0x53, 0x45, 0x51, 0x62, 0x38, 0x45, 0x73, 0x78, 0x69, 0x52, 0x78, 0x54, 0x42, 0x77, 0x62, 0x6e, 0x49, 0x42, \n\t0x4a, 0x4d, 0x49, 0x36, 0x33, 0x32, 0x4e, 0x67, 0x78, 0x4a, 0x70, 0x46, 0x58, 0x59, 0x76, 0x44, 0x43, 0x5c, 0x0a,\n\t0x09, 0x61, 0x6a, 0x41, 0x79, 0x32, 0x43, 0x41, 0x52, 0x56, 0x67, 0x6b, 0x51, 0x69, 0x38, 0x53, 0x6d, 0x58, \n\t0x52, 0x71, 0x4e, 0x30, 0x44, 0x62, 0x37, 0x76, 0x4a, 0x6d, 0x33, 0x33, 0x4f, 0x36, 0x75, 0x6b, 0x7a, 0x2b, \n\t0x71, 0x71, 0x72, 0x75, 0x36, 0x62, 0x2f, 0x64, 0x39, 0x39, 0x39, 0x35, 0x33, 0x33, 0x7a, 0x4c, 0x53, 0x4f, \n\t0x37, 0x2f, 0x66, 0x54, 0x48, 0x64, 0x58, 0x56, 0x31, 0x64, 0x58, 0x56, 0x33, 0x33, 0x76, 0x6e, 0x46, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x56, 0x70, 0x2f, 0x75, 0x4b, 0x71, 0x72, 0x49, 0x70, 0x6d, 0x37, 0x49, 0x53, 0x69, 0x64, 0x61, \n\t0x37, 0x41, 0x70, 0x74, 0x79, 0x34, 0x73, 0x73, 0x6d, 0x52, 0x4a, 0x75, 0x79, 0x59, 0x74, 0x6d, 0x45, 0x61, \n\t0x46, 0x4e, 0x57, 0x4c, 0x4a, 0x73, 0x51, 0x62, 0x63, 0x71, 0x4b, 0x70, 0x62, 0x6e, 0x65, 0x46, 0x64, 0x69, \n\t0x55, 0x58, 0x4a, 0x4a, 0x62, 0x6e, 0x39, 0x4f, 0x54, 0x31, 0x72, 0x7a, 0x67, 0x4d, 0x38, 0x52, 0x37, 0x5c, 0x0a,\n\t0x09, 0x58, 0x6c, 0x64, 0x49, 0x61, 0x2b, 0x31, 0x36, 0x31, 0x31, 0x70, 0x56, 0x61, 0x53, 0x43, 0x70, 0x68, \n\t0x45, 0x68, 0x45, 0x31, 0x72, 0x6f, 0x65, 0x6a, 0x33, 0x71, 0x4a, 0x62, 0x33, 0x6d, 0x32, 0x33, 0x2f, 0x32, \n\t0x76, 0x77, 0x48, 0x38, 0x47, 0x7a, 0x67, 0x4c, 0x6d, 0x41, 0x6f, 0x42, 0x32, 0x41, 0x6a, 0x50, 0x41, 0x48, \n\t0x65, 0x76, 0x5a, 0x50, 0x31, 0x57, 0x6a, 0x2b, 0x55, 0x31, 0x7a, 0x74, 0x67, 0x45, 0x6b, 0x41, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x56, 0x77, 0x4e, 0x75, 0x41, 0x4c, 0x63, 0x42, 0x4f, 0x6a, 0x61, 0x5a, 0x38, 0x2b, 0x75, 0x4f, \n\t0x41, 0x6d, 0x34, 0x43, 0x4c, 0x31, 0x72, 0x78, 0x79, 0x41, 0x38, 0x69, 0x6d, 0x4f, 0x64, 0x73, 0x34, 0x63, \n\t0x68, 0x37, 0x77, 0x6a, 0x75, 0x42, 0x34, 0x43, 0x57, 0x6b, 0x44, 0x54, 0x41, 0x41, 0x66, 0x41, 0x6b, 0x34, \n\t0x46, 0x76, 0x75, 0x31, 0x50, 0x64, 0x76, 0x66, 0x2f, 0x53, 0x65, 0x48, 0x69, 0x39, 0x73, 0x6d, 0x76, 0x5c, 0x0a,\n\t0x09, 0x57, 0x76, 0x30, 0x61, 0x31, 0x73, 0x69, 0x6d, 0x4a, 0x6c, 0x70, 0x6e, 0x43, 0x62, 0x54, 0x51, 0x37, \n\t0x77, 0x42, 0x65, 0x39, 0x61, 0x54, 0x41, 0x41, 0x30, 0x51, 0x7a, 0x41, 0x47, 0x38, 0x45, 0x6e, 0x67, 0x67, \n\t0x73, 0x41, 0x66, 0x64, 0x41, 0x41, 0x61, 0x43, 0x72, 0x67, 0x43, 0x4a, 0x4e, 0x36, 0x79, 0x43, 0x62, 0x45, \n\t0x47, 0x30, 0x4d, 0x75, 0x52, 0x4c, 0x34, 0x73, 0x65, 0x42, 0x34, 0x6a, 0x30, 0x5a, 0x62, 0x59, 0x68, 0x5c, 0x0a,\n\t0x09, 0x70, 0x62, 0x64, 0x67, 0x47, 0x2f, 0x37, 0x4e, 0x4a, 0x75, 0x41, 0x31, 0x4c, 0x61, 0x5a, 0x2f, 0x67, \n\t0x38, 0x72, 0x77, 0x55, 0x2b, 0x43, 0x6a, 0x79, 0x30, 0x5a, 0x72, 0x57, 0x73, 0x6b, 0x55, 0x32, 0x49, 0x31, \n\t0x6c, 0x45, 0x43, 0x4c, 0x66, 0x54, 0x72, 0x70, 0x56, 0x4f, 0x33, 0x59, 0x76, 0x32, 0x68, 0x33, 0x38, 0x61, \n\t0x61, 0x4d, 0x34, 0x44, 0x76, 0x30, 0x70, 0x6a, 0x46, 0x51, 0x66, 0x51, 0x69, 0x34, 0x49, 0x38, 0x41, 0x5c, 0x0a,\n\t0x09, 0x77, 0x59, 0x4b, 0x30, 0x72, 0x72, 0x49, 0x4a, 0x30, 0x66, 0x72, 0x4c, 0x43, 0x34, 0x44, 0x64, 0x70, \n\t0x62, 0x53, 0x62, 0x61, 0x57, 0x35, 0x2f, 0x43, 0x76, 0x41, 0x76, 0x67, 0x7a, 0x51, 0x4c, 0x45, 0x54, 0x77, \n\t0x57, 0x65, 0x41, 0x2b, 0x32, 0x37, 0x78, 0x34, 0x45, 0x76, 0x72, 0x49, 0x57, 0x6c, 0x65, 0x77, 0x6e, 0x6a, \n\t0x30, 0x72, 0x48, 0x32, 0x6e, 0x78, 0x35, 0x71, 0x39, 0x74, 0x54, 0x38, 0x4d, 0x4e, 0x6c, 0x79, 0x66, 0x5c, 0x0a,\n\t0x09, 0x36, 0x7a, 0x61, 0x66, 0x34, 0x34, 0x32, 0x35, 0x62, 0x4f, 0x69, 0x65, 0x54, 0x2f, 0x43, 0x49, 0x35, \n\t0x64, 0x33, 0x75, 0x6a, 0x43, 0x2b, 0x2f, 0x72, 0x57, 0x49, 0x64, 0x42, 0x43, 0x62, 0x36, 0x30, 0x34, 0x2f, \n\t0x57, 0x58, 0x67, 0x56, 0x30, 0x74, 0x70, 0x33, 0x36, 0x56, 0x39, 0x78, 0x67, 0x54, 0x77, 0x51, 0x57, 0x43, \n\t0x62, 0x53, 0x2f, 0x73, 0x59, 0x59, 0x50, 0x72, 0x65, 0x61, 0x41, 0x33, 0x6b, 0x45, 0x51, 0x39, 0x52, 0x5c, 0x0a,\n\t0x09, 0x65, 0x73, 0x4f, 0x73, 0x32, 0x37, 0x50, 0x7a, 0x47, 0x79, 0x4b, 0x41, 0x47, 0x70, 0x42, 0x6f, 0x47, \n\t0x38, 0x6a, 0x6a, 0x51, 0x4d, 0x39, 0x47, 0x6f, 0x72, 0x4f, 0x42, 0x4d, 0x30, 0x47, 0x33, 0x32, 0x33, 0x53, \n\t0x32, 0x67, 0x54, 0x51, 0x52, 0x33, 0x52, 0x59, 0x6f, 0x36, 0x77, 0x53, 0x52, 0x59, 0x33, 0x5a, 0x58, 0x44, \n\t0x67, 0x4d, 0x48, 0x67, 0x45, 0x50, 0x41, 0x41, 0x55, 0x54, 0x32, 0x41, 0x76, 0x63, 0x43, 0x65, 0x78, 0x5c, 0x0a,\n\t0x09, 0x47, 0x35, 0x44, 0x7a, 0x51, 0x32, 0x74, 0x35, 0x34, 0x64, 0x67, 0x47, 0x5a, 0x76, 0x48, 0x4a, 0x31, \n\t0x2f, 0x54, 0x37, 0x6c, 0x36, 0x50, 0x30, 0x69, 0x76, 0x46, 0x6b, 0x4a, 0x62, 0x5a, 0x78, 0x34, 0x44, 0x58, \n\t0x6c, 0x78, 0x4b, 0x2f, 0x69, 0x37, 0x77, 0x61, 0x38, 0x44, 0x33, 0x42, 0x57, 0x6b, 0x66, 0x67, 0x66, 0x55, \n\t0x64, 0x6d, 0x63, 0x45, 0x6a, 0x45, 0x4b, 0x4c, 0x30, 0x2b, 0x68, 0x6b, 0x73, 0x4d, 0x4a, 0x49, 0x70, 0x5c, 0x0a,\n\t0x09, 0x46, 0x6d, 0x41, 0x58, 0x79, 0x47, 0x55, 0x69, 0x75, 0x68, 0x76, 0x6b, 0x45, 0x75, 0x41, 0x69, 0x4d, \n\t0x47, 0x64, 0x41, 0x42, 0x43, 0x71, 0x41, 0x41, 0x59, 0x6e, 0x73, 0x4e, 0x65, 0x72, 0x32, 0x31, 0x5a, 0x64, \n\t0x68, 0x73, 0x43, 0x41, 0x5a, 0x30, 0x4d, 0x68, 0x43, 0x34, 0x63, 0x38, 0x52, 0x54, 0x4c, 0x78, 0x6c, 0x36, \n\t0x53, 0x5a, 0x42, 0x6f, 0x74, 0x75, 0x41, 0x37, 0x34, 0x42, 0x38, 0x47, 0x37, 0x67, 0x52, 0x6b, 0x53, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x6a, 0x50, 0x47, 0x7a, 0x75, 0x50, 0x41, 0x38, 0x6b, 0x51, 0x6e, 0x55, 0x53, 0x6b, 0x38, 0x53, \n\t0x67, 0x72, 0x56, 0x2b, 0x73, 0x65, 0x49, 0x51, 0x48, 0x61, 0x57, 0x7a, 0x39, 0x4e, 0x36, 0x55, 0x30, 0x77, \n\t0x2f, 0x53, 0x54, 0x54, 0x77, 0x58, 0x65, 0x45, 0x4b, 0x51, 0x74, 0x41, 0x4e, 0x65, 0x75, 0x71, 0x4c, 0x48, \n\t0x47, 0x4a, 0x49, 0x38, 0x49, 0x69, 0x43, 0x77, 0x34, 0x6f, 0x63, 0x67, 0x5a, 0x69, 0x44, 0x34, 0x66, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x68, 0x2f, 0x45, 0x2f, 0x72, 0x58, 0x76, 0x42, 0x46, 0x41, 0x56, 0x52, 0x42, 0x77, 0x41, 0x53, \n\t0x67, 0x35, 0x49, 0x47, 0x53, 0x53, 0x61, 0x4d, 0x50, 0x6b, 0x45, 0x69, 0x44, 0x6f, 0x67, 0x6a, 0x52, 0x7a, \n\t0x47, 0x44, 0x4a, 0x51, 0x6c, 0x4d, 0x46, 0x32, 0x33, 0x6e, 0x51, 0x4f, 0x64, 0x63, 0x2f, 0x41, 0x4a, 0x71, \n\t0x44, 0x62, 0x42, 0x58, 0x41, 0x54, 0x52, 0x52, 0x57, 0x42, 0x65, 0x43, 0x68, 0x45, 0x59, 0x68, 0x55, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x75, 0x42, 0x72, 0x6b, 0x65, 0x34, 0x56, 0x4d, 0x53, 0x4c, 0x58, 0x32, 0x4b, 0x65, 0x50, 0x73, \n\t0x32, 0x34, 0x49, 0x64, 0x37, 0x48, 0x6b, 0x62, 0x61, 0x58, 0x77, 0x5a, 0x65, 0x58, 0x6b, 0x79, 0x4c, 0x39, \n\t0x69, 0x44, 0x4e, 0x71, 0x77, 0x6e, 0x2f, 0x4c, 0x4f, 0x43, 0x66, 0x73, 0x43, 0x43, 0x74, 0x75, 0x35, 0x79, \n\t0x77, 0x45, 0x4b, 0x56, 0x66, 0x33, 0x49, 0x49, 0x6c, 0x51, 0x62, 0x33, 0x69, 0x4f, 0x52, 0x2f, 0x72, 0x5c, 0x0a,\n\t0x09, 0x69, 0x4c, 0x34, 0x55, 0x75, 0x42, 0x51, 0x4e, 0x74, 0x55, 0x67, 0x75, 0x74, 0x53, 0x42, 0x42, 0x72, \n\t0x6f, 0x55, 0x77, 0x30, 0x4e, 0x77, 0x42, 0x72, 0x5a, 0x30, 0x57, 0x6f, 0x71, 0x67, 0x4e, 0x30, 0x67, 0x52, \n\t0x70, 0x51, 0x39, 0x51, 0x45, 0x61, 0x53, 0x48, 0x53, 0x41, 0x76, 0x38, 0x76, 0x61, 0x6f, 0x4a, 0x5a, 0x52, \n\t0x4d, 0x31, 0x52, 0x53, 0x41, 0x39, 0x41, 0x75, 0x67, 0x2b, 0x53, 0x68, 0x79, 0x44, 0x64, 0x43, 0x32, 0x5c, 0x0a,\n\t0x09, 0x62, 0x42, 0x6c, 0x6d, 0x38, 0x34, 0x6a, 0x38, 0x69, 0x63, 0x68, 0x34, 0x6c, 0x65, 0x51, 0x57, 0x53, \n\t0x51, 0x78, 0x73, 0x49, 0x52, 0x54, 0x53, 0x64, 0x37, 0x6e, 0x6b, 0x74, 0x62, 0x70, 0x30, 0x38, 0x41, 0x72, \n\t0x55, 0x4a, 0x69, 0x5a, 0x35, 0x63, 0x42, 0x7a, 0x69, 0x39, 0x6c, 0x33, 0x52, 0x43, 0x6d, 0x44, 0x45, 0x35, \n\t0x41, 0x69, 0x4e, 0x49, 0x76, 0x6e, 0x49, 0x51, 0x46, 0x52, 0x30, 0x48, 0x59, 0x42, 0x76, 0x70, 0x79, 0x5c, 0x0a,\n\t0x09, 0x68, 0x46, 0x63, 0x43, 0x33, 0x39, 0x2b, 0x54, 0x65, 0x52, 0x69, 0x51, 0x4e, 0x41, 0x4a, 0x52, 0x43, \n\t0x78, 0x4c, 0x41, 0x33, 0x42, 0x64, 0x68, 0x79, 0x33, 0x4f, 0x68, 0x65, 0x5a, 0x4a, 0x31, 0x58, 0x53, 0x50, \n\t0x73, 0x66, 0x59, 0x31, 0x43, 0x70, 0x4b, 0x6a, 0x33, 0x73, 0x54, 0x7a, 0x45, 0x30, 0x53, 0x54, 0x53, 0x32, \n\t0x41, 0x4c, 0x74, 0x38, 0x79, 0x42, 0x71, 0x41, 0x53, 0x30, 0x4c, 0x58, 0x33, 0x6f, 0x41, 0x6a, 0x65, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x44, 0x2b, 0x45, 0x37, 0x6f, 0x66, 0x67, 0x66, 0x4d, 0x51, 0x32, 0x43, 0x61, 0x61, 0x44, 0x71, \n\t0x78, 0x6c, 0x52, 0x34, 0x52, 0x69, 0x4b, 0x61, 0x4c, 0x50, 0x6c, 0x49, 0x30, 0x42, 0x63, 0x30, 0x64, 0x6a, \n\t0x79, 0x6b, 0x2f, 0x47, 0x58, 0x44, 0x4e, 0x55, 0x41, 0x32, 0x33, 0x69, 0x6e, 0x4c, 0x43, 0x51, 0x4a, 0x52, \n\t0x2b, 0x2f, 0x68, 0x52, 0x79, 0x65, 0x4d, 0x79, 0x54, 0x45, 0x58, 0x34, 0x42, 0x65, 0x42, 0x6c, 0x45, 0x5c, 0x0a,\n\t0x09, 0x48, 0x61, 0x74, 0x42, 0x61, 0x69, 0x34, 0x63, 0x47, 0x61, 0x51, 0x6c, 0x4f, 0x48, 0x61, 0x39, 0x42, \n\t0x53, 0x6d, 0x61, 0x63, 0x69, 0x43, 0x31, 0x79, 0x45, 0x46, 0x79, 0x35, 0x51, 0x44, 0x69, 0x77, 0x4d, 0x6f, \n\t0x30, 0x6f, 0x31, 0x46, 0x62, 0x48, 0x77, 0x4d, 0x30, 0x74, 0x69, 0x50, 0x4e, 0x30, 0x32, 0x44, 0x71, 0x36, \n\t0x56, 0x5a, 0x72, 0x6d, 0x53, 0x50, 0x6f, 0x30, 0x6c, 0x33, 0x49, 0x38, 0x64, 0x76, 0x51, 0x78, 0x56, 0x5c, 0x0a,\n\t0x09, 0x74, 0x41, 0x34, 0x37, 0x78, 0x53, 0x7a, 0x53, 0x30, 0x41, 0x52, 0x62, 0x67, 0x36, 0x75, 0x36, 0x44, \n\t0x33, 0x36, 0x61, 0x34, 0x48, 0x48, 0x68, 0x36, 0x69, 0x2b, 0x56, 0x5a, 0x56, 0x4e, 0x6a, 0x78, 0x45, 0x36, \n\t0x65, 0x64, 0x4f, 0x74, 0x54, 0x75, 0x71, 0x49, 0x50, 0x49, 0x43, 0x30, 0x44, 0x64, 0x43, 0x39, 0x4a, 0x77, \n\t0x69, 0x4f, 0x42, 0x47, 0x6a, 0x67, 0x2b, 0x51, 0x63, 0x35, 0x43, 0x71, 0x51, 0x30, 0x71, 0x4e, 0x77, 0x5c, 0x0a,\n\t0x09, 0x37, 0x45, 0x73, 0x77, 0x38, 0x30, 0x77, 0x4c, 0x69, 0x63, 0x47, 0x65, 0x63, 0x78, 0x59, 0x50, 0x63, \n\t0x62, 0x65, 0x6d, 0x5a, 0x59, 0x73, 0x58, 0x44, 0x31, 0x4e, 0x32, 0x68, 0x2b, 0x49, 0x31, 0x4b, 0x45, 0x52, \n\t0x62, 0x59, 0x66, 0x4a, 0x79, 0x6f, 0x71, 0x6b, 0x72, 0x51, 0x52, 0x4e, 0x30, 0x38, 0x64, 0x76, 0x6f, 0x38, \n\t0x53, 0x2b, 0x6a, 0x38, 0x7a, 0x65, 0x6a, 0x6a, 0x65, 0x33, 0x46, 0x65, 0x72, 0x64, 0x4f, 0x67, 0x63, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x30, 0x31, 0x52, 0x4e, 0x39, 0x46, 0x44, 0x61, 0x47, 0x4b, 0x59, 0x4d, 0x4e, 0x44, 0x46, 0x48, \n\t0x36, 0x6d, 0x64, 0x50, 0x4a, 0x4e, 0x59, 0x2b, 0x2b, 0x41, 0x4f, 0x53, 0x74, 0x71, 0x4f, 0x36, 0x32, 0x49, \n\t0x79, 0x63, 0x2f, 0x67, 0x6c, 0x6f, 0x35, 0x53, 0x4c, 0x6d, 0x74, 0x71, 0x67, 0x45, 0x70, 0x66, 0x67, 0x6a, \n\t0x6d, 0x62, 0x34, 0x4b, 0x70, 0x4a, 0x2b, 0x58, 0x61, 0x78, 0x6d, 0x69, 0x6c, 0x65, 0x5a, 0x50, 0x79, 0x5c, 0x0a,\n\t0x09, 0x75, 0x66, 0x7a, 0x6d, 0x51, 0x62, 0x34, 0x49, 0x53, 0x47, 0x79, 0x79, 0x4e, 0x4a, 0x47, 0x70, 0x53, \n\t0x35, 0x48, 0x70, 0x33, 0x57, 0x41, 0x57, 0x4d, 0x59, 0x75, 0x33, 0x6f, 0x2f, 0x4e, 0x66, 0x51, 0x35, 0x50, \n\t0x39, 0x31, 0x68, 0x64, 0x72, 0x6e, 0x31, 0x6e, 0x58, 0x50, 0x4f, 0x73, 0x2b, 0x53, 0x78, 0x32, 0x4b, 0x56, \n\t0x4d, 0x57, 0x48, 0x72, 0x47, 0x65, 0x38, 0x53, 0x76, 0x72, 0x2f, 0x7a, 0x69, 0x51, 0x7a, 0x43, 0x38, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x75, 0x52, 0x50, 0x38, 0x6e, 0x38, 0x45, 0x77, 0x4c, 0x41, 0x44, 0x34, 0x64, 0x4f, 0x35, 0x72, \n\t0x79, 0x32, 0x38, 0x43, 0x55, 0x30, 0x41, 0x63, 0x6b, 0x63, 0x48, 0x6d, 0x4c, 0x49, 0x45, 0x6d, 0x57, 0x35, \n\t0x74, 0x70, 0x43, 0x73, 0x4d, 0x66, 0x69, 0x6a, 0x79, 0x4f, 0x59, 0x66, 0x69, 0x71, 0x30, 0x64, 0x31, 0x6d, \n\t0x54, 0x4a, 0x6b, 0x33, 0x6e, 0x55, 0x48, 0x76, 0x6e, 0x75, 0x6d, 0x6e, 0x39, 0x48, 0x35, 0x71, 0x49, 0x5c, 0x0a,\n\t0x09, 0x54, 0x77, 0x76, 0x39, 0x49, 0x6d, 0x6b, 0x46, 0x54, 0x6e, 0x6b, 0x62, 0x6c, 0x51, 0x6c, 0x67, 0x41, \n\t0x71, 0x53, 0x54, 0x4f, 0x2b, 0x66, 0x53, 0x67, 0x57, 0x67, 0x43, 0x70, 0x49, 0x45, 0x75, 0x33, 0x6f, 0x6e, \n\t0x70, 0x33, 0x6f, 0x46, 0x71, 0x74, 0x2b, 0x49, 0x42, 0x7a, 0x44, 0x30, 0x52, 0x33, 0x7a, 0x31, 0x50, 0x35, \n\t0x48, 0x36, 0x69, 0x36, 0x42, 0x37, 0x6b, 0x70, 0x43, 0x38, 0x4e, 0x31, 0x38, 0x41, 0x72, 0x6c, 0x45, 0x5c, 0x0a,\n\t0x09, 0x70, 0x65, 0x4e, 0x67, 0x70, 0x45, 0x36, 0x61, 0x66, 0x50, 0x63, 0x6e, 0x73, 0x4b, 0x77, 0x6c, 0x6d, \n\t0x49, 0x2f, 0x68, 0x61, 0x6f, 0x48, 0x65, 0x70, 0x6d, 0x6e, 0x54, 0x6b, 0x67, 0x53, 0x46, 0x6d, 0x2b, 0x47, \n\t0x68, 0x6b, 0x46, 0x70, 0x4b, 0x67, 0x46, 0x4d, 0x38, 0x2b, 0x43, 0x35, 0x76, 0x59, 0x53, 0x53, 0x4d, 0x30, \n\t0x41, 0x42, 0x50, 0x74, 0x50, 0x79, 0x6d, 0x6c, 0x52, 0x32, 0x30, 0x4a, 0x55, 0x41, 0x4d, 0x38, 0x65, 0x5c, 0x0a,\n\t0x09, 0x71, 0x33, 0x53, 0x41, 0x4e, 0x6b, 0x67, 0x48, 0x69, 0x53, 0x4b, 0x51, 0x53, 0x5a, 0x41, 0x4a, 0x4e, \n\t0x4a, 0x71, 0x42, 0x39, 0x43, 0x6a, 0x70, 0x34, 0x72, 0x66, 0x51, 0x37, 0x74, 0x36, 0x73, 0x6e, 0x68, 0x45, \n\t0x33, 0x70, 0x51, 0x32, 0x35, 0x2f, 0x72, 0x65, 0x4a, 0x47, 0x72, 0x2b, 0x4f, 0x36, 0x68, 0x77, 0x69, 0x61, \n\t0x77, 0x72, 0x53, 0x68, 0x6f, 0x55, 0x6f, 0x75, 0x65, 0x34, 0x63, 0x51, 0x42, 0x48, 0x52, 0x43, 0x48, 0x5c, 0x0a,\n\t0x09, 0x67, 0x39, 0x77, 0x74, 0x73, 0x52, 0x34, 0x36, 0x61, 0x61, 0x66, 0x61, 0x64, 0x75, 0x41, 0x4a, 0x41, \n\t0x61, 0x4d, 0x7a, 0x42, 0x37, 0x4f, 0x55, 0x53, 0x54, 0x52, 0x5a, 0x43, 0x38, 0x4a, 0x70, 0x4a, 0x6d, 0x41, \n\t0x46, 0x4b, 0x72, 0x42, 0x46, 0x49, 0x4f, 0x54, 0x76, 0x36, 0x76, 0x58, 0x59, 0x4c, 0x4b, 0x6c, 0x39, 0x45, \n\t0x42, 0x6d, 0x51, 0x43, 0x5a, 0x73, 0x5a, 0x6f, 0x72, 0x50, 0x55, 0x71, 0x36, 0x63, 0x42, 0x4d, 0x61, 0x5c, 0x0a,\n\t0x09, 0x33, 0x30, 0x66, 0x54, 0x66, 0x42, 0x69, 0x4a, 0x48, 0x67, 0x53, 0x52, 0x42, 0x34, 0x6b, 0x61, 0x2f, \n\t0x77, 0x6e, 0x30, 0x72, 0x2f, 0x7a, 0x4d, 0x75, 0x47, 0x79, 0x39, 0x59, 0x61, 0x54, 0x32, 0x48, 0x30, 0x59, \n\t0x32, 0x48, 0x45, 0x54, 0x4a, 0x74, 0x59, 0x38, 0x68, 0x36, 0x50, 0x51, 0x4c, 0x67, 0x58, 0x65, 0x4c, 0x6d, \n\t0x42, 0x2b, 0x77, 0x6c, 0x61, 0x41, 0x49, 0x44, 0x47, 0x77, 0x4d, 0x6b, 0x4e, 0x71, 0x6e, 0x77, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x53, 0x6c, 0x46, 0x4f, 0x61, 0x49, 0x65, 0x6d, 0x43, 0x70, 0x41, 0x53, 0x6d, 0x44, 0x72, 0x51, 0x78, \n\t0x53, 0x59, 0x50, 0x4b, 0x6b, 0x56, 0x64, 0x72, 0x76, 0x67, 0x45, 0x79, 0x42, 0x64, 0x44, 0x44, 0x78, 0x41, \n\t0x30, 0x52, 0x7a, 0x62, 0x77, 0x43, 0x7a, 0x42, 0x79, 0x4b, 0x78, 0x5a, 0x6a, 0x5a, 0x71, 0x66, 0x4a, 0x52, \n\t0x49, 0x66, 0x67, 0x37, 0x56, 0x37, 0x36, 0x30, 0x46, 0x53, 0x42, 0x73, 0x4b, 0x6f, 0x75, 0x52, 0x54, 0x5c, 0x0a,\n\t0x09, 0x35, 0x2b, 0x4d, 0x67, 0x45, 0x4d, 0x53, 0x38, 0x48, 0x76, 0x67, 0x74, 0x4d, 0x4a, 0x50, 0x32, 0x2f, \n\t0x73, 0x62, 0x58, 0x4c, 0x75, 0x2b, 0x38, 0x6f, 0x55, 0x45, 0x79, 0x70, 0x58, 0x77, 0x31, 0x4d, 0x67, 0x70, \n\t0x49, 0x55, 0x78, 0x64, 0x44, 0x35, 0x37, 0x77, 0x41, 0x6a, 0x44, 0x49, 0x6f, 0x5a, 0x66, 0x4d, 0x57, 0x67, \n\t0x74, 0x45, 0x49, 0x7a, 0x46, 0x73, 0x7a, 0x4d, 0x48, 0x4e, 0x39, 0x51, 0x4d, 0x4c, 0x76, 0x75, 0x36, 0x5c, 0x0a,\n\t0x09, 0x69, 0x51, 0x78, 0x51, 0x2f, 0x44, 0x77, 0x74, 0x58, 0x41, 0x6f, 0x67, 0x66, 0x70, 0x43, 0x4a, 0x47, \n\t0x38, 0x48, 0x75, 0x57, 0x39, 0x66, 0x70, 0x31, 0x4f, 0x74, 0x6c, 0x77, 0x2f, 0x53, 0x44, 0x63, 0x4d, 0x4c, \n\t0x52, 0x73, 0x47, 0x6f, 0x75, 0x53, 0x54, 0x6a, 0x38, 0x4e, 0x32, 0x76, 0x6d, 0x35, 0x48, 0x39, 0x43, 0x2b, \n\t0x42, 0x46, 0x2b, 0x61, 0x64, 0x62, 0x56, 0x77, 0x64, 0x50, 0x42, 0x51, 0x65, 0x70, 0x4b, 0x43, 0x65, 0x5c, 0x0a,\n\t0x09, 0x36, 0x77, 0x35, 0x53, 0x42, 0x4c, 0x4e, 0x50, 0x68, 0x2b, 0x61, 0x32, 0x48, 0x49, 0x61, 0x79, 0x65, \n\t0x53, 0x76, 0x35, 0x50, 0x78, 0x49, 0x46, 0x77, 0x47, 0x54, 0x6e, 0x2b, 0x32, 0x67, 0x6c, 0x67, 0x6d, 0x50, \n\t0x43, 0x61, 0x39, 0x33, 0x57, 0x37, 0x49, 0x4e, 0x6a, 0x76, 0x77, 0x48, 0x4a, 0x6a, 0x52, 0x34, 0x6b, 0x69, \n\t0x4f, 0x52, 0x50, 0x45, 0x66, 0x6c, 0x35, 0x30, 0x4f, 0x4f, 0x49, 0x49, 0x4c, 0x50, 0x6a, 0x42, 0x32, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x44, 0x51, 0x4a, 0x52, 0x38, 0x38, 0x67, 0x4a, 0x63, 0x35, 0x7a, 0x34, 0x4e, 0x39, 0x50, 0x32, \n\t0x49, 0x37, 0x75, 0x71, 0x46, 0x59, 0x67, 0x77, 0x67, 0x53, 0x56, 0x6f, 0x6f, 0x61, 0x33, 0x53, 0x51, 0x67, \n\t0x72, 0x61, 0x51, 0x4b, 0x4d, 0x38, 0x62, 0x7a, 0x63, 0x4c, 0x73, 0x5a, 0x59, 0x47, 0x76, 0x34, 0x30, 0x31, \n\t0x56, 0x59, 0x77, 0x6a, 0x7a, 0x31, 0x69, 0x70, 0x70, 0x4c, 0x61, 0x2b, 0x56, 0x4f, 0x6c, 0x69, 0x49, 0x5c, 0x0a,\n\t0x09, 0x41, 0x72, 0x38, 0x4a, 0x37, 0x79, 0x73, 0x46, 0x51, 0x4e, 0x47, 0x43, 0x70, 0x59, 0x2f, 0x43, 0x2f, \n\t0x4f, 0x2f, 0x5a, 0x35, 0x78, 0x4f, 0x42, 0x53, 0x4c, 0x35, 0x44, 0x4a, 0x44, 0x2b, 0x47, 0x36, 0x71, 0x32, \n\t0x72, 0x41, 0x64, 0x4b, 0x36, 0x51, 0x68, 0x54, 0x2f, 0x34, 0x78, 0x50, 0x77, 0x4d, 0x49, 0x6a, 0x77, 0x6b, \n\t0x32, 0x44, 0x2b, 0x47, 0x47, 0x68, 0x6e, 0x67, 0x41, 0x77, 0x4e, 0x6b, 0x6f, 0x63, 0x6d, 0x76, 0x47, 0x5c, 0x0a,\n\t0x09, 0x61, 0x4e, 0x51, 0x57, 0x72, 0x76, 0x67, 0x71, 0x6b, 0x4c, 0x4c, 0x54, 0x6a, 0x6b, 0x36, 0x32, 0x70, \n\t0x46, 0x50, 0x36, 0x6c, 0x6f, 0x33, 0x71, 0x51, 0x4b, 0x6e, 0x42, 0x36, 0x34, 0x67, 0x74, 0x47, 0x63, 0x31, \n\t0x31, 0x67, 0x68, 0x56, 0x42, 0x6c, 0x49, 0x54, 0x6b, 0x75, 0x6c, 0x65, 0x2b, 0x44, 0x59, 0x6d, 0x30, 0x48, \n\t0x76, 0x39, 0x53, 0x41, 0x64, 0x49, 0x70, 0x4b, 0x58, 0x6f, 0x6e, 0x72, 0x64, 0x75, 0x45, 0x46, 0x61, 0x5c, 0x0a,\n\t0x09, 0x74, 0x31, 0x65, 0x47, 0x34, 0x6b, 0x39, 0x63, 0x37, 0x46, 0x62, 0x4b, 0x52, 0x51, 0x52, 0x35, 0x4f, \n\t0x38, 0x71, 0x37, 0x58, 0x63, 0x73, 0x41, 0x59, 0x73, 0x2b, 0x70, 0x36, 0x79, 0x6a, 0x31, 0x56, 0x51, 0x71, \n\t0x32, 0x47, 0x75, 0x54, 0x4c, 0x79, 0x53, 0x6e, 0x4f, 0x35, 0x78, 0x58, 0x53, 0x33, 0x44, 0x58, 0x61, 0x4b, \n\t0x4a, 0x61, 0x6c, 0x79, 0x7a, 0x79, 0x75, 0x58, 0x38, 0x30, 0x50, 0x6b, 0x37, 0x51, 0x55, 0x38, 0x75, 0x5c, 0x0a,\n\t0x09, 0x48, 0x58, 0x31, 0x6c, 0x53, 0x67, 0x65, 0x79, 0x2f, 0x45, 0x2b, 0x30, 0x45, 0x54, 0x6f, 0x41, 0x73, \n\t0x6d, 0x41, 0x51, 0x32, 0x32, 0x47, 0x74, 0x74, 0x2f, 0x70, 0x70, 0x73, 0x64, 0x71, 0x33, 0x62, 0x42, 0x78, \n\t0x50, 0x6b, 0x35, 0x64, 0x52, 0x45, 0x42, 0x4a, 0x73, 0x69, 0x76, 0x58, 0x5a, 0x75, 0x75, 0x37, 0x6a, 0x71, \n\t0x7a, 0x42, 0x4d, 0x54, 0x35, 0x63, 0x53, 0x46, 0x50, 0x44, 0x49, 0x31, 0x7a, 0x59, 0x4f, 0x75, 0x66, 0x5c, 0x0a,\n\t0x09, 0x51, 0x66, 0x4d, 0x4b, 0x4f, 0x7a, 0x6c, 0x72, 0x39, 0x43, 0x53, 0x4d, 0x2f, 0x69, 0x4d, 0x69, 0x72, \n\t0x30, 0x59, 0x56, 0x6e, 0x58, 0x74, 0x36, 0x2f, 0x2b, 0x64, 0x65, 0x6f, 0x61, 0x79, 0x36, 0x4a, 0x6f, 0x6f, \n\t0x2f, 0x38, 0x55, 0x52, 0x63, 0x4a, 0x37, 0x51, 0x52, 0x2f, 0x58, 0x50, 0x51, 0x56, 0x34, 0x6a, 0x58, 0x4b, \n\t0x46, 0x35, 0x72, 0x41, 0x50, 0x30, 0x30, 0x6b, 0x68, 0x54, 0x38, 0x6e, 0x52, 0x71, 0x4e, 0x31, 0x44, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x53, 0x43, 0x36, 0x35, 0x5a, 0x54, 0x59, 0x33, 0x55, 0x6d, 0x49, 0x44, 0x70, 0x33, 0x59, 0x46, \n\t0x50, 0x56, 0x4e, 0x5a, 0x49, 0x67, 0x59, 0x6e, 0x7a, 0x2f, 0x6b, 0x30, 0x55, 0x61, 0x43, 0x52, 0x4b, 0x6d, \n\t0x69, 0x6d, 0x71, 0x63, 0x4b, 0x77, 0x4c, 0x51, 0x2f, 0x2b, 0x79, 0x57, 0x57, 0x74, 0x69, 0x35, 0x35, 0x6e, \n\t0x63, 0x38, 0x66, 0x79, 0x66, 0x77, 0x64, 0x4b, 0x66, 0x32, 0x2b, 0x70, 0x62, 0x72, 0x66, 0x51, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x4e, 0x2b, 0x77, 0x47, 0x75, 0x6d, 0x4c, 0x2f, 0x5a, 0x39, 0x37, 0x41, 0x46, 0x6c, 0x7a, 0x63, \n\t0x78, 0x5a, 0x2f, 0x2f, 0x42, 0x4a, 0x63, 0x4a, 0x30, 0x38, 0x42, 0x37, 0x77, 0x4e, 0x39, 0x6b, 0x51, 0x65, \n\t0x67, 0x45, 0x71, 0x52, 0x77, 0x56, 0x42, 0x59, 0x65, 0x62, 0x33, 0x53, 0x51, 0x4f, 0x6d, 0x66, 0x41, 0x35, \n\t0x41, 0x56, 0x41, 0x67, 0x36, 0x4a, 0x76, 0x31, 0x4c, 0x59, 0x4f, 0x72, 0x37, 0x54, 0x74, 0x75, 0x51, 0x5c, 0x0a,\n\t0x09, 0x79, 0x51, 0x41, 0x4b, 0x51, 0x43, 0x4f, 0x46, 0x57, 0x6a, 0x74, 0x53, 0x71, 0x67, 0x79, 0x6d, 0x62, \n\t0x4e, 0x4f, 0x2b, 0x4a, 0x75, 0x32, 0x37, 0x30, 0x57, 0x35, 0x74, 0x38, 0x4f, 0x55, 0x65, 0x4a, 0x41, 0x69, \n\t0x6e, 0x34, 0x54, 0x31, 0x54, 0x65, 0x4f, 0x41, 0x36, 0x51, 0x71, 0x58, 0x6c, 0x5a, 0x74, 0x37, 0x53, 0x7a, \n\t0x2b, 0x68, 0x79, 0x65, 0x35, 0x74, 0x53, 0x79, 0x5a, 0x51, 0x76, 0x6b, 0x59, 0x6f, 0x6c, 0x64, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x35, 0x73, 0x62, 0x46, 0x64, 0x74, 0x6d, 0x31, 0x54, 0x79, 0x57, 0x4c, 0x34, 0x64, 0x48, 0x49, 0x64, \n\t0x71, 0x36, 0x4b, 0x37, 0x55, 0x52, 0x2f, 0x54, 0x49, 0x53, 0x71, 0x51, 0x62, 0x4c, 0x31, 0x73, 0x72, 0x79, \n\t0x63, 0x66, 0x43, 0x66, 0x4d, 0x48, 0x79, 0x36, 0x71, 0x75, 0x69, 0x77, 0x30, 0x48, 0x45, 0x6a, 0x2b, 0x58, \n\t0x76, 0x37, 0x36, 0x47, 0x6c, 0x48, 0x70, 0x4f, 0x56, 0x39, 0x59, 0x2b, 0x51, 0x65, 0x79, 0x4e, 0x62, 0x5c, 0x0a,\n\t0x09, 0x79, 0x6c, 0x42, 0x36, 0x42, 0x31, 0x4b, 0x6a, 0x52, 0x63, 0x36, 0x4c, 0x4e, 0x66, 0x38, 0x56, 0x66, \n\t0x46, 0x2b, 0x6b, 0x70, 0x75, 0x57, 0x77, 0x67, 0x70, 0x63, 0x64, 0x58, 0x4e, 0x38, 0x67, 0x66, 0x7a, 0x57, \n\t0x33, 0x37, 0x68, 0x4e, 0x69, 0x72, 0x39, 0x6f, 0x52, 0x54, 0x32, 0x53, 0x31, 0x73, 0x4a, 0x6e, 0x72, 0x66, \n\t0x39, 0x50, 0x4a, 0x42, 0x70, 0x6d, 0x48, 0x38, 0x7a, 0x4e, 0x6e, 0x42, 0x4f, 0x66, 0x35, 0x6c, 0x49, 0x5c, 0x0a,\n\t0x09, 0x51, 0x50, 0x57, 0x4e, 0x4f, 0x76, 0x65, 0x4d, 0x73, 0x57, 0x69, 0x6b, 0x55, 0x46, 0x62, 0x46, 0x4a, \n\t0x34, 0x71, 0x76, 0x65, 0x62, 0x4c, 0x33, 0x54, 0x53, 0x78, 0x41, 0x63, 0x45, 0x58, 0x6d, 0x38, 0x77, 0x53, \n\t0x2b, 0x6a, 0x58, 0x6f, 0x66, 0x78, 0x2f, 0x73, 0x78, 0x6b, 0x50, 0x73, 0x74, 0x46, 0x54, 0x36, 0x53, 0x68, \n\t0x76, 0x35, 0x4f, 0x32, 0x55, 0x66, 0x71, 0x79, 0x56, 0x38, 0x36, 0x31, 0x69, 0x41, 0x50, 0x55, 0x56, 0x5c, 0x0a,\n\t0x09, 0x42, 0x4f, 0x50, 0x2b, 0x6e, 0x56, 0x56, 0x6a, 0x30, 0x2b, 0x45, 0x73, 0x59, 0x65, 0x4c, 0x39, 0x7a, \n\t0x68, 0x66, 0x4a, 0x58, 0x45, 0x2f, 0x6a, 0x4e, 0x64, 0x49, 0x48, 0x58, 0x2b, 0x6a, 0x76, 0x4f, 0x5a, 0x74, \n\t0x4e, 0x64, 0x58, 0x55, 0x75, 0x30, 0x36, 0x50, 0x38, 0x6e, 0x37, 0x4f, 0x7a, 0x35, 0x50, 0x36, 0x43, 0x74, \n\t0x56, 0x2b, 0x45, 0x47, 0x68, 0x7a, 0x31, 0x51, 0x34, 0x33, 0x77, 0x56, 0x69, 0x61, 0x4f, 0x32, 0x47, 0x5c, 0x0a,\n\t0x09, 0x36, 0x64, 0x38, 0x42, 0x37, 0x56, 0x6a, 0x59, 0x6a, 0x66, 0x34, 0x79, 0x49, 0x6d, 0x2b, 0x79, 0x50, \n\t0x74, 0x49, 0x7a, 0x6c, 0x6e, 0x76, 0x77, 0x6f, 0x57, 0x54, 0x73, 0x35, 0x69, 0x79, 0x2b, 0x35, 0x69, 0x6c, \n\t0x6b, 0x50, 0x68, 0x42, 0x38, 0x48, 0x4e, 0x45, 0x72, 0x63, 0x35, 0x4d, 0x53, 0x33, 0x69, 0x73, 0x33, 0x53, \n\t0x57, 0x4d, 0x31, 0x62, 0x56, 0x56, 0x44, 0x2f, 0x30, 0x4a, 0x35, 0x4a, 0x71, 0x69, 0x48, 0x43, 0x63, 0x5c, 0x0a,\n\t0x09, 0x71, 0x70, 0x6b, 0x51, 0x71, 0x7a, 0x42, 0x69, 0x58, 0x54, 0x35, 0x75, 0x65, 0x51, 0x4a, 0x73, 0x36, \n\t0x7a, 0x4d, 0x39, 0x71, 0x5a, 0x48, 0x78, 0x51, 0x75, 0x69, 0x7a, 0x67, 0x66, 0x69, 0x59, 0x72, 0x52, 0x6d, \n\t0x78, 0x75, 0x68, 0x53, 0x64, 0x57, 0x4d, 0x64, 0x73, 0x39, 0x43, 0x62, 0x6e, 0x6d, 0x4a, 0x70, 0x46, 0x31, \n\t0x4d, 0x6f, 0x32, 0x54, 0x69, 0x6b, 0x70, 0x76, 0x68, 0x32, 0x43, 0x38, 0x34, 0x30, 0x78, 0x5a, 0x42, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x4b, 0x39, 0x42, 0x39, 0x59, 0x39, 0x48, 0x4e, 0x57, 0x31, 0x72, 0x4d, 0x7a, 0x71, 0x7a, 0x57, \n\t0x6b, 0x4b, 0x77, 0x37, 0x30, 0x5a, 0x64, 0x57, 0x52, 0x77, 0x74, 0x6c, 0x65, 0x33, 0x44, 0x4f, 0x6d, 0x69, \n\t0x6b, 0x4c, 0x4b, 0x62, 0x61, 0x6e, 0x31, 0x74, 0x47, 0x49, 0x31, 0x57, 0x4d, 0x32, 0x4b, 0x43, 0x6b, 0x6b, \n\t0x52, 0x53, 0x62, 0x5a, 0x2b, 0x6c, 0x37, 0x54, 0x6e, 0x73, 0x73, 0x35, 0x52, 0x72, 0x4a, 0x61, 0x77, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x6a, 0x52, 0x32, 0x58, 0x42, 0x4e, 0x74, 0x4e, 0x63, 0x4e, 0x6b, 0x32, 0x39, 0x42, 0x67, 0x75, \n\t0x31, 0x54, 0x33, 0x61, 0x4e, 0x75, 0x38, 0x35, 0x55, 0x61, 0x5a, 0x39, 0x41, 0x53, 0x78, 0x46, 0x6f, 0x4b, \n\t0x62, 0x72, 0x51, 0x76, 0x41, 0x53, 0x6d, 0x33, 0x32, 0x61, 0x66, 0x77, 0x32, 0x71, 0x6b, 0x64, 0x79, 0x48, \n\t0x79, 0x76, 0x48, 0x46, 0x71, 0x70, 0x4c, 0x46, 0x43, 0x31, 0x50, 0x33, 0x37, 0x70, 0x39, 0x6f, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x56, 0x6e, 0x34, 0x48, 0x78, 0x4c, 0x31, 0x34, 0x56, 0x78, 0x35, 0x32, 0x68, 0x78, 0x32, 0x59, 0x48, \n\t0x32, 0x74, 0x68, 0x2b, 0x4c, 0x34, 0x63, 0x53, 0x44, 0x49, 0x36, 0x53, 0x4e, 0x6c, 0x31, 0x50, 0x76, 0x38, \n\t0x59, 0x51, 0x64, 0x4a, 0x46, 0x36, 0x48, 0x34, 0x50, 0x53, 0x49, 0x49, 0x68, 0x65, 0x35, 0x4a, 0x76, 0x54, \n\t0x51, 0x68, 0x4e, 0x34, 0x6d, 0x41, 0x4c, 0x68, 0x2f, 0x56, 0x64, 0x56, 0x41, 0x4e, 0x6f, 0x76, 0x45, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x54, 0x30, 0x76, 0x43, 0x2b, 0x41, 0x46, 0x4c, 0x35, 0x58, 0x77, 0x56, 0x49, 0x72, 0x63, 0x74, \n\t0x67, 0x34, 0x70, 0x64, 0x42, 0x46, 0x64, 0x51, 0x30, 0x4d, 0x50, 0x70, 0x2b, 0x52, 0x42, 0x34, 0x37, 0x4c, \n\t0x70, 0x44, 0x47, 0x35, 0x6c, 0x68, 0x33, 0x2f, 0x2f, 0x35, 0x53, 0x62, 0x45, 0x76, 0x4b, 0x36, 0x31, 0x52, \n\t0x35, 0x67, 0x35, 0x42, 0x35, 0x7a, 0x75, 0x53, 0x65, 0x74, 0x48, 0x4f, 0x4d, 0x63, 0x59, 0x35, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x79, 0x53, 0x46, 0x57, 0x46, 0x66, 0x65, 0x75, 0x6f, 0x44, 0x63, 0x68, 0x2f, 0x5a, 0x78, 0x74, 0x71, \n\t0x31, 0x70, 0x72, 0x6e, 0x65, 0x32, 0x65, 0x2f, 0x4c, 0x34, 0x75, 0x34, 0x77, 0x31, 0x71, 0x36, 0x34, 0x6d, \n\t0x4f, 0x37, 0x44, 0x34, 0x41, 0x7a, 0x5a, 0x50, 0x74, 0x30, 0x44, 0x38, 0x49, 0x6f, 0x38, 0x30, 0x6b, 0x63, \n\t0x35, 0x67, 0x42, 0x57, 0x6d, 0x41, 0x6b, 0x64, 0x36, 0x43, 0x4e, 0x49, 0x51, 0x39, 0x77, 0x38, 0x33, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x44, 0x62, 0x55, 0x68, 0x36, 0x6c, 0x54, 0x4e, 0x65, 0x2b, 0x45, 0x73, 0x6f, 0x6a, 0x56, 0x77, \n\t0x37, 0x50, 0x77, 0x54, 0x6d, 0x54, 0x75, 0x69, 0x2b, 0x44, 0x7a, 0x41, 0x6e, 0x6f, 0x64, 0x45, 0x48, 0x45, \n\t0x4c, 0x6b, 0x4d, 0x31, 0x63, 0x57, 0x61, 0x4a, 0x78, 0x35, 0x59, 0x78, 0x71, 0x4b, 0x4a, 0x6c, 0x6a, 0x37, \n\t0x36, 0x2f, 0x55, 0x34, 0x7a, 0x79, 0x4c, 0x4e, 0x41, 0x66, 0x74, 0x2b, 0x6d, 0x65, 0x67, 0x31, 0x55, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x68, 0x79, 0x73, 0x30, 0x30, 0x69, 0x32, 0x4b, 0x71, 0x72, 0x68, 0x4a, 0x47, 0x49, 0x2f, 0x6a, \n\t0x65, 0x52, 0x4e, 0x59, 0x56, 0x44, 0x6d, 0x49, 0x42, 0x71, 0x70, 0x6b, 0x48, 0x39, 0x63, 0x47, 0x71, 0x6b, \n\t0x30, 0x59, 0x6f, 0x76, 0x76, 0x64, 0x78, 0x4f, 0x4f, 0x6f, 0x55, 0x61, 0x4b, 0x69, 0x2f, 0x74, 0x6c, 0x55, \n\t0x35, 0x64, 0x70, 0x4b, 0x7a, 0x38, 0x70, 0x57, 0x61, 0x65, 0x52, 0x79, 0x67, 0x35, 0x31, 0x4f, 0x48, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x5a, 0x70, 0x46, 0x45, 0x79, 0x64, 0x63, 0x51, 0x77, 0x2b, 0x56, 0x70, 0x6f, 0x58, 0x4f, 0x6f, \n\t0x30, 0x6b, 0x6a, 0x34, 0x4a, 0x31, 0x64, 0x38, 0x42, 0x30, 0x4b, 0x4d, 0x72, 0x6d, 0x34, 0x78, 0x63, 0x73, \n\t0x57, 0x4f, 0x39, 0x39, 0x4a, 0x47, 0x6e, 0x34, 0x57, 0x67, 0x2f, 0x45, 0x2f, 0x69, 0x71, 0x69, 0x4a, 0x37, \n\t0x6d, 0x57, 0x74, 0x4d, 0x35, 0x77, 0x4a, 0x70, 0x72, 0x42, 0x38, 0x4c, 0x6a, 0x73, 0x72, 0x4f, 0x64, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x38, 0x44, 0x56, 0x6b, 0x35, 0x45, 0x55, 0x6e, 0x57, 0x30, 0x70, 0x2f, 0x67, 0x55, 0x4f, 0x37, \n\t0x57, 0x77, 0x58, 0x38, 0x6f, 0x38, 0x37, 0x4f, 0x6a, 0x4b, 0x79, 0x79, 0x79, 0x48, 0x52, 0x70, 0x4e, 0x56, \n\t0x34, 0x34, 0x56, 0x49, 0x49, 0x54, 0x62, 0x73, 0x66, 0x42, 0x66, 0x75, 0x46, 0x73, 0x4a, 0x4a, 0x77, 0x6a, \n\t0x73, 0x6b, 0x35, 0x32, 0x2b, 0x58, 0x56, 0x2f, 0x66, 0x4b, 0x4b, 0x66, 0x36, 0x58, 0x7a, 0x33, 0x53, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x66, 0x68, 0x48, 0x53, 0x54, 0x6b, 0x37, 0x52, 0x42, 0x35, 0x32, 0x44, 0x75, 0x5a, 0x34, 0x41, \n\t0x6a, 0x32, 0x48, 0x41, 0x53, 0x75, 0x51, 0x72, 0x56, 0x61, 0x77, 0x5a, 0x64, 0x2b, 0x56, 0x38, 0x64, 0x78, \n\t0x39, 0x70, 0x71, 0x67, 0x41, 0x59, 0x71, 0x37, 0x77, 0x56, 0x4f, 0x30, 0x30, 0x44, 0x44, 0x61, 0x4b, 0x59, \n\t0x64, 0x33, 0x4a, 0x62, 0x77, 0x75, 0x46, 0x34, 0x6a, 0x56, 0x54, 0x72, 0x61, 0x42, 0x48, 0x6b, 0x31, 0x5c, 0x0a,\n\t0x09, 0x31, 0x44, 0x6a, 0x65, 0x70, 0x77, 0x72, 0x4b, 0x48, 0x49, 0x64, 0x47, 0x36, 0x76, 0x76, 0x4d, 0x76, \n\t0x52, 0x70, 0x4a, 0x73, 0x7a, 0x53, 0x33, 0x6a, 0x66, 0x63, 0x35, 0x54, 0x5a, 0x43, 0x53, 0x4f, 0x38, 0x68, \n\t0x65, 0x49, 0x79, 0x58, 0x35, 0x63, 0x61, 0x68, 0x46, 0x4d, 0x69, 0x63, 0x36, 0x63, 0x64, 0x72, 0x48, 0x61, \n\t0x36, 0x54, 0x79, 0x6b, 0x6f, 0x66, 0x58, 0x52, 0x6b, 0x75, 0x42, 0x74, 0x6f, 0x71, 0x74, 0x6a, 0x78, 0x5c, 0x0a,\n\t0x09, 0x55, 0x36, 0x35, 0x5a, 0x53, 0x63, 0x62, 0x37, 0x6f, 0x67, 0x4d, 0x7a, 0x44, 0x31, 0x58, 0x36, 0x7a, \n\t0x70, 0x4e, 0x41, 0x71, 0x71, 0x37, 0x30, 0x4a, 0x6b, 0x43, 0x79, 0x76, 0x34, 0x4b, 0x50, 0x36, 0x4b, 0x49, \n\t0x46, 0x72, 0x36, 0x75, 0x39, 0x32, 0x34, 0x44, 0x76, 0x73, 0x56, 0x34, 0x44, 0x6c, 0x46, 0x4a, 0x78, 0x6b, \n\t0x47, 0x41, 0x67, 0x6d, 0x47, 0x41, 0x45, 0x6d, 0x6f, 0x42, 0x73, 0x6d, 0x62, 0x51, 0x70, 0x64, 0x33, 0x5c, 0x0a,\n\t0x09, 0x48, 0x43, 0x43, 0x4e, 0x76, 0x4d, 0x37, 0x6d, 0x51, 0x45, 0x6f, 0x4f, 0x42, 0x59, 0x43, 0x6b, 0x75, \n\t0x61, 0x6b, 0x69, 0x4b, 0x63, 0x47, 0x54, 0x6c, 0x41, 0x43, 0x4c, 0x67, 0x54, 0x68, 0x59, 0x68, 0x37, 0x4d, \n\t0x67, 0x61, 0x52, 0x6b, 0x32, 0x55, 0x77, 0x49, 0x70, 0x6d, 0x7a, 0x38, 0x4b, 0x52, 0x33, 0x63, 0x56, 0x2f, \n\t0x2f, 0x79, 0x49, 0x72, 0x58, 0x30, 0x56, 0x6d, 0x42, 0x53, 0x4d, 0x6e, 0x6f, 0x33, 0x71, 0x62, 0x36, 0x5c, 0x0a,\n\t0x09, 0x47, 0x67, 0x52, 0x79, 0x37, 0x72, 0x2f, 0x38, 0x77, 0x31, 0x4d, 0x72, 0x49, 0x35, 0x57, 0x2f, 0x71, \n\t0x77, 0x65, 0x38, 0x64, 0x4f, 0x75, 0x41, 0x7a, 0x30, 0x38, 0x30, 0x41, 0x6a, 0x4e, 0x78, 0x76, 0x71, 0x79, \n\t0x73, 0x6c, 0x4e, 0x56, 0x56, 0x2f, 0x54, 0x56, 0x70, 0x34, 0x54, 0x57, 0x74, 0x61, 0x30, 0x61, 0x57, 0x44, \n\t0x53, 0x2f, 0x48, 0x57, 0x61, 0x6e, 0x63, 0x2b, 0x44, 0x32, 0x6f, 0x4b, 0x79, 0x52, 0x7a, 0x56, 0x74, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x34, 0x6c, 0x46, 0x61, 0x75, 0x2b, 0x30, 0x73, 0x39, 0x68, 0x52, 0x45, 0x32, 0x75, 0x36, 0x53, \n\t0x6e, 0x4e, 0x48, 0x55, 0x6d, 0x58, 0x4f, 0x53, 0x6e, 0x46, 0x4a, 0x66, 0x51, 0x50, 0x63, 0x2f, 0x50, 0x6d, \n\t0x61, 0x67, 0x4c, 0x61, 0x65, 0x57, 0x4b, 0x54, 0x67, 0x6e, 0x79, 0x5a, 0x77, 0x39, 0x4e, 0x57, 0x67, 0x2b, \n\t0x79, 0x42, 0x71, 0x4b, 0x4a, 0x45, 0x38, 0x44, 0x64, 0x57, 0x76, 0x4c, 0x68, 0x63, 0x64, 0x4f, 0x56, 0x5c, 0x0a,\n\t0x09, 0x35, 0x7a, 0x5a, 0x73, 0x76, 0x71, 0x6f, 0x50, 0x79, 0x70, 0x4e, 0x65, 0x49, 0x55, 0x74, 0x51, 0x51, \n\t0x44, 0x61, 0x69, 0x53, 0x67, 0x78, 0x33, 0x45, 0x65, 0x56, 0x43, 0x4f, 0x56, 0x37, 0x70, 0x64, 0x72, 0x70, \n\t0x4b, 0x70, 0x5a, 0x36, 0x6c, 0x45, 0x30, 0x55, 0x70, 0x69, 0x76, 0x72, 0x68, 0x33, 0x36, 0x61, 0x4b, 0x54, \n\t0x6b, 0x53, 0x4b, 0x35, 0x70, 0x69, 0x4f, 0x31, 0x66, 0x66, 0x6a, 0x62, 0x6b, 0x44, 0x30, 0x78, 0x62, 0x5c, 0x0a,\n\t0x09, 0x51, 0x63, 0x4d, 0x45, 0x63, 0x30, 0x4e, 0x6c, 0x63, 0x31, 0x66, 0x57, 0x53, 0x4f, 0x56, 0x35, 0x70, \n\t0x49, 0x4c, 0x54, 0x76, 0x52, 0x52, 0x4d, 0x49, 0x5a, 0x53, 0x6e, 0x45, 0x6d, 0x4b, 0x67, 0x41, 0x5a, 0x4f, \n\t0x76, 0x77, 0x38, 0x34, 0x64, 0x70, 0x59, 0x4c, 0x52, 0x50, 0x30, 0x52, 0x45, 0x52, 0x6a, 0x46, 0x72, 0x49, \n\t0x30, 0x47, 0x30, 0x39, 0x4b, 0x47, 0x6e, 0x34, 0x7a, 0x72, 0x79, 0x4c, 0x63, 0x42, 0x46, 0x78, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x48, 0x6c, 0x6b, 0x43, 0x43, 0x56, 0x4f, 0x33, 0x56, 0x6b, 0x6b, 0x49, 0x6f, 0x68, 0x4a, 0x42, 0x71, \n\t0x57, 0x4e, 0x7a, 0x4a, 0x49, 0x4b, 0x77, 0x77, 0x68, 0x4d, 0x66, 0x4f, 0x42, 0x79, 0x55, 0x72, 0x49, 0x51, \n\t0x53, 0x71, 0x4e, 0x30, 0x4c, 0x4c, 0x35, 0x6f, 0x78, 0x70, 0x34, 0x54, 0x47, 0x44, 0x65, 0x74, 0x49, 0x75, \n\t0x61, 0x6b, 0x73, 0x6b, 0x79, 0x7a, 0x74, 0x2f, 0x4a, 0x34, 0x4b, 0x75, 0x59, 0x57, 0x38, 0x6f, 0x41, 0x5c, 0x0a,\n\t0x09, 0x63, 0x2f, 0x76, 0x45, 0x30, 0x48, 0x6f, 0x61, 0x4e, 0x43, 0x2f, 0x31, 0x49, 0x46, 0x32, 0x47, 0x30, \n\t0x5a, 0x65, 0x69, 0x6f, 0x49, 0x64, 0x36, 0x76, 0x6e, 0x62, 0x54, 0x56, 0x31, 0x62, 0x67, 0x45, 0x38, 0x6c, \n\t0x46, 0x77, 0x43, 0x2f, 0x31, 0x64, 0x42, 0x41, 0x45, 0x31, 0x6d, 0x71, 0x44, 0x67, 0x42, 0x54, 0x36, 0x55, \n\t0x6c, 0x6b, 0x64, 0x31, 0x77, 0x49, 0x6b, 0x37, 0x46, 0x75, 0x30, 0x61, 0x6e, 0x4b, 0x51, 0x74, 0x46, 0x5c, 0x0a,\n\t0x09, 0x73, 0x42, 0x55, 0x6a, 0x69, 0x6a, 0x58, 0x54, 0x4d, 0x35, 0x71, 0x55, 0x56, 0x49, 0x38, 0x76, 0x55, \n\t0x32, 0x48, 0x35, 0x50, 0x6b, 0x48, 0x65, 0x6d, 0x71, 0x6d, 0x65, 0x78, 0x41, 0x4f, 0x78, 0x57, 0x47, 0x2f, \n\t0x56, 0x32, 0x59, 0x2f, 0x42, 0x6e, 0x37, 0x62, 0x47, 0x70, 0x41, 0x39, 0x57, 0x31, 0x41, 0x63, 0x31, 0x68, \n\t0x74, 0x4e, 0x44, 0x52, 0x45, 0x53, 0x78, 0x39, 0x38, 0x68, 0x6f, 0x66, 0x6b, 0x44, 0x39, 0x79, 0x34, 0x5c, 0x0a,\n\t0x09, 0x30, 0x58, 0x55, 0x6b, 0x39, 0x44, 0x72, 0x4f, 0x5a, 0x4e, 0x73, 0x56, 0x67, 0x31, 0x53, 0x33, 0x50, \n\t0x44, 0x49, 0x49, 0x53, 0x46, 0x57, 0x4f, 0x64, 0x6c, 0x43, 0x33, 0x76, 0x69, 0x41, 0x46, 0x5a, 0x59, 0x30, \n\t0x45, 0x55, 0x72, 0x71, 0x41, 0x6e, 0x62, 0x4d, 0x4a, 0x34, 0x4e, 0x42, 0x41, 0x49, 0x2f, 0x6e, 0x35, 0x70, \n\t0x4d, 0x4a, 0x63, 0x6b, 0x67, 0x63, 0x6e, 0x4b, 0x52, 0x33, 0x37, 0x6b, 0x5a, 0x76, 0x4e, 0x71, 0x34, 0x5c, 0x0a,\n\t0x09, 0x55, 0x35, 0x4a, 0x72, 0x38, 0x30, 0x30, 0x71, 0x31, 0x77, 0x75, 0x73, 0x76, 0x2f, 0x41, 0x73, 0x67, \n\t0x61, 0x70, 0x30, 0x50, 0x72, 0x75, 0x5a, 0x5a, 0x34, 0x6b, 0x31, 0x79, 0x41, 0x36, 0x6f, 0x2b, 0x6a, 0x69, \n\t0x68, 0x37, 0x38, 0x67, 0x66, 0x37, 0x50, 0x47, 0x73, 0x68, 0x51, 0x45, 0x43, 0x31, 0x39, 0x34, 0x4a, 0x6d, \n\t0x2b, 0x51, 0x2f, 0x34, 0x46, 0x4b, 0x73, 0x2b, 0x7a, 0x71, 0x65, 0x46, 0x6f, 0x4b, 0x54, 0x67, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x49, 0x52, 0x6b, 0x48, 0x53, 0x50, 0x33, 0x57, 0x32, 0x55, 0x59, 0x47, 0x4b, 0x59, 0x41, 0x39, 0x6b, \n\t0x78, 0x4a, 0x49, 0x4b, 0x34, 0x32, 0x4f, 0x31, 0x43, 0x36, 0x61, 0x2b, 0x55, 0x4a, 0x2b, 0x36, 0x79, 0x63, \n\t0x69, 0x55, 0x2f, 0x4b, 0x52, 0x57, 0x46, 0x6f, 0x42, 0x6a, 0x6c, 0x75, 0x44, 0x4d, 0x30, 0x73, 0x6c, 0x33, \n\t0x79, 0x6e, 0x4a, 0x7a, 0x4a, 0x6d, 0x47, 0x38, 0x42, 0x54, 0x4d, 0x59, 0x54, 0x42, 0x61, 0x43, 0x79, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x48, 0x71, 0x6b, 0x7a, 0x63, 0x35, 0x4d, 0x76, 0x41, 0x52, 0x41, 0x34, 0x6b, 0x38, 0x30, 0x5a, \n\t0x45, 0x6f, 0x6d, 0x47, 0x30, 0x30, 0x51, 0x6a, 0x6d, 0x54, 0x4a, 0x71, 0x6f, 0x2f, 0x47, 0x62, 0x65, 0x59, \n\t0x46, 0x41, 0x4a, 0x54, 0x76, 0x6d, 0x34, 0x6f, 0x72, 0x50, 0x57, 0x45, 0x71, 0x54, 0x61, 0x6f, 0x62, 0x38, \n\t0x76, 0x70, 0x77, 0x44, 0x48, 0x47, 0x45, 0x46, 0x79, 0x38, 0x30, 0x54, 0x71, 0x54, 0x56, 0x6f, 0x47, 0x5c, 0x0a,\n\t0x09, 0x55, 0x4f, 0x41, 0x72, 0x5a, 0x52, 0x6f, 0x6d, 0x44, 0x53, 0x43, 0x4a, 0x4b, 0x59, 0x44, 0x56, 0x4d, \n\t0x7a, 0x4e, 0x64, 0x6d, 0x74, 0x32, 0x6d, 0x44, 0x45, 0x35, 0x35, 0x33, 0x71, 0x6a, 0x6b, 0x64, 0x49, 0x63, \n\t0x61, 0x4b, 0x64, 0x6f, 0x47, 0x6e, 0x53, 0x76, 0x73, 0x33, 0x4a, 0x48, 0x71, 0x42, 0x52, 0x6a, 0x7a, 0x6b, \n\t0x6c, 0x57, 0x42, 0x61, 0x50, 0x48, 0x39, 0x6c, 0x2f, 0x76, 0x4f, 0x65, 0x79, 0x56, 0x77, 0x66, 0x75, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x49, 0x71, 0x41, 0x78, 0x4d, 0x64, 0x58, 0x71, 0x75, 0x6a, 0x64, 0x7a, 0x6c, 0x34, 0x77, 0x61, \n\t0x70, 0x36, 0x76, 0x72, 0x6c, 0x56, 0x76, 0x34, 0x72, 0x51, 0x57, 0x4a, 0x38, 0x49, 0x42, 0x6b, 0x37, 0x36, \n\t0x61, 0x69, 0x61, 0x35, 0x74, 0x71, 0x49, 0x55, 0x4f, 0x4e, 0x34, 0x65, 0x50, 0x79, 0x35, 0x51, 0x4e, 0x75, \n\t0x59, 0x30, 0x41, 0x77, 0x47, 0x49, 0x4a, 0x6b, 0x51, 0x70, 0x43, 0x37, 0x61, 0x45, 0x77, 0x55, 0x51, 0x5c, 0x0a,\n\t0x09, 0x61, 0x4a, 0x31, 0x4b, 0x6b, 0x45, 0x70, 0x35, 0x4a, 0x71, 0x35, 0x79, 0x66, 0x34, 0x51, 0x4a, 0x71, \n\t0x4c, 0x34, 0x42, 0x4e, 0x65, 0x69, 0x2b, 0x53, 0x2f, 0x73, 0x2f, 0x59, 0x37, 0x46, 0x46, 0x42, 0x68, 0x43, \n\t0x37, 0x50, 0x6a, 0x53, 0x70, 0x79, 0x6c, 0x74, 0x36, 0x4f, 0x32, 0x74, 0x55, 0x6b, 0x4c, 0x7a, 0x6a, 0x58, \n\t0x58, 0x48, 0x4e, 0x71, 0x43, 0x43, 0x4e, 0x47, 0x6b, 0x4c, 0x53, 0x4d, 0x36, 0x54, 0x33, 0x78, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x54, 0x62, 0x48, 0x70, 0x42, 0x36, 0x57, 0x71, 0x6b, 0x6f, 0x57, 0x52, 0x30, 0x38, 0x42, 0x42, 0x34, \n\t0x6b, 0x42, 0x77, 0x35, 0x70, 0x34, 0x44, 0x79, 0x6e, 0x72, 0x70, 0x50, 0x39, 0x65, 0x52, 0x39, 0x4f, 0x45, \n\t0x6a, 0x72, 0x55, 0x5a, 0x5a, 0x42, 0x43, 0x6f, 0x4c, 0x78, 0x35, 0x38, 0x79, 0x61, 0x76, 0x72, 0x4a, 0x58, \n\t0x4b, 0x6f, 0x37, 0x63, 0x53, 0x53, 0x4e, 0x48, 0x4a, 0x30, 0x4c, 0x72, 0x55, 0x7a, 0x57, 0x49, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x77, 0x52, 0x35, 0x55, 0x76, 0x5a, 0x53, 0x77, 0x6a, 0x49, 0x79, 0x45, 0x45, 0x53, 0x4c, 0x66, \n\t0x33, 0x75, 0x35, 0x61, 0x77, 0x7a, 0x39, 0x4b, 0x5a, 0x41, 0x7a, 0x74, 0x62, 0x4b, 0x7a, 0x68, 0x77, 0x43, \n\t0x4a, 0x4f, 0x70, 0x43, 0x6f, 0x41, 0x59, 0x6e, 0x69, 0x38, 0x57, 0x71, 0x42, 0x56, 0x44, 0x56, 0x69, 0x4b, \n\t0x35, 0x52, 0x48, 0x43, 0x61, 0x52, 0x6c, 0x46, 0x6d, 0x77, 0x42, 0x66, 0x4f, 0x51, 0x6a, 0x58, 0x67, 0x5c, 0x0a,\n\t0x09, 0x75, 0x6c, 0x76, 0x61, 0x59, 0x74, 0x67, 0x4d, 0x78, 0x72, 0x72, 0x63, 0x77, 0x58, 0x30, 0x74, 0x41, \n\t0x42, 0x44, 0x33, 0x32, 0x6c, 0x63, 0x4b, 0x6d, 0x6b, 0x71, 0x49, 0x47, 0x79, 0x70, 0x5a, 0x4b, 0x43, 0x52, \n\t0x69, 0x71, 0x4e, 0x38, 0x73, 0x78, 0x53, 0x72, 0x32, 0x62, 0x71, 0x50, 0x42, 0x38, 0x58, 0x63, 0x77, 0x53, \n\t0x61, 0x2f, 0x42, 0x78, 0x71, 0x30, 0x49, 0x65, 0x66, 0x74, 0x4e, 0x77, 0x44, 0x44, 0x71, 0x4f, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x70, 0x41, 0x48, 0x79, 0x69, 0x34, 0x51, 0x72, 0x31, 0x71, 0x4f, 0x43, 0x56, 0x44, 0x48, 0x30, 0x4c, \n\t0x78, 0x7a, 0x33, 0x7a, 0x44, 0x74, 0x56, 0x64, 0x64, 0x5a, 0x36, 0x67, 0x69, 0x52, 0x5a, 0x57, 0x59, 0x4f, \n\t0x74, 0x2f, 0x4b, 0x65, 0x35, 0x35, 0x6e, 0x47, 0x41, 0x5a, 0x4d, 0x34, 0x32, 0x61, 0x51, 0x42, 0x49, 0x6d, \n\t0x6f, 0x50, 0x6b, 0x38, 0x35, 0x70, 0x51, 0x49, 0x77, 0x55, 0x2b, 0x55, 0x38, 0x38, 0x79, 0x52, 0x78, 0x5c, 0x0a,\n\t0x09, 0x47, 0x63, 0x6f, 0x6b, 0x5a, 0x61, 0x79, 0x76, 0x4e, 0x6e, 0x55, 0x77, 0x45, 0x56, 0x63, 0x30, 0x71, \n\t0x74, 0x78, 0x34, 0x4f, 0x63, 0x37, 0x6b, 0x48, 0x36, 0x31, 0x77, 0x69, 0x54, 0x67, 0x2f, 0x68, 0x47, 0x67, \n\t0x30, 0x4d, 0x6b, 0x38, 0x69, 0x39, 0x51, 0x7a, 0x72, 0x65, 0x4e, 0x72, 0x6a, 0x30, 0x41, 0x6a, 0x42, 0x32, \n\t0x6b, 0x6e, 0x71, 0x46, 0x34, 0x65, 0x63, 0x48, 0x57, 0x6e, 0x31, 0x73, 0x48, 0x6b, 0x49, 0x61, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x69, 0x54, 0x58, 0x4e, 0x49, 0x45, 0x70, 0x55, 0x2b, 0x4d, 0x30, 0x45, 0x6b, 0x6b, 0x4f, 0x53, \n\t0x4c, 0x6a, 0x4f, 0x6c, 0x6d, 0x6d, 0x6e, 0x70, 0x58, 0x78, 0x72, 0x53, 0x6b, 0x42, 0x70, 0x51, 0x74, 0x79, \n\t0x4e, 0x75, 0x66, 0x32, 0x65, 0x6c, 0x4a, 0x74, 0x76, 0x53, 0x58, 0x6e, 0x67, 0x34, 0x64, 0x79, 0x38, 0x61, \n\t0x55, 0x46, 0x62, 0x68, 0x65, 0x2b, 0x78, 0x64, 0x62, 0x47, 0x4f, 0x75, 0x41, 0x66, 0x4a, 0x41, 0x37, 0x5c, 0x0a,\n\t0x09, 0x61, 0x45, 0x64, 0x70, 0x37, 0x74, 0x4e, 0x4a, 0x48, 0x5a, 0x67, 0x74, 0x47, 0x42, 0x48, 0x4f, 0x78, \n\t0x6c, 0x31, 0x38, 0x34, 0x57, 0x2f, 0x2b, 0x59, 0x35, 0x75, 0x50, 0x57, 0x6d, 0x7a, 0x79, 0x4a, 0x63, 0x62, \n\t0x6f, 0x50, 0x4c, 0x58, 0x4d, 0x75, 0x49, 0x46, 0x4e, 0x62, 0x48, 0x58, 0x49, 0x6e, 0x46, 0x62, 0x62, 0x68, \n\t0x65, 0x4a, 0x76, 0x58, 0x35, 0x79, 0x75, 0x57, 0x49, 0x6c, 0x50, 0x4b, 0x58, 0x31, 0x37, 0x67, 0x71, 0x5c, 0x0a,\n\t0x09, 0x37, 0x37, 0x75, 0x47, 0x38, 0x64, 0x72, 0x5a, 0x64, 0x54, 0x36, 0x2f, 0x42, 0x75, 0x57, 0x55, 0x4a, \n\t0x41, 0x76, 0x76, 0x45, 0x4c, 0x75, 0x6c, 0x34, 0x59, 0x34, 0x62, 0x51, 0x49, 0x52, 0x45, 0x6a, 0x54, 0x7a, \n\t0x64, 0x76, 0x32, 0x49, 0x6b, 0x45, 0x56, 0x6c, 0x49, 0x69, 0x4d, 0x38, 0x62, 0x2b, 0x56, 0x65, 0x50, 0x38, \n\t0x76, 0x57, 0x31, 0x36, 0x37, 0x2f, 0x56, 0x34, 0x57, 0x4f, 0x66, 0x6d, 0x79, 0x52, 0x4a, 0x57, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x53, 0x61, 0x54, 0x56, 0x72, 0x4e, 0x4a, 0x6d, 0x66, 0x74, 0x62, 0x50, 0x42, 0x6a, 0x7a, 0x78, 0x64, \n\t0x32, 0x6e, 0x47, 0x52, 0x6a, 0x74, 0x72, 0x4e, 0x77, 0x6b, 0x73, 0x69, 0x46, 0x68, 0x31, 0x54, 0x46, 0x63, \n\t0x66, 0x76, 0x31, 0x4e, 0x6e, 0x4d, 0x4d, 0x50, 0x66, 0x52, 0x4c, 0x53, 0x47, 0x52, 0x41, 0x6f, 0x6f, 0x38, \n\t0x44, 0x4c, 0x77, 0x53, 0x51, 0x30, 0x37, 0x39, 0x6c, 0x57, 0x32, 0x44, 0x6b, 0x74, 0x54, 0x4f, 0x56, 0x5c, 0x0a,\n\t0x09, 0x69, 0x34, 0x44, 0x4c, 0x69, 0x78, 0x4f, 0x49, 0x4e, 0x5a, 0x70, 0x6a, 0x55, 0x49, 0x33, 0x55, 0x5a, \n\t0x33, 0x6b, 0x6b, 0x4f, 0x36, 0x37, 0x30, 0x71, 0x63, 0x6f, 0x61, 0x71, 0x61, 0x71, 0x63, 0x30, 0x4e, 0x7a, \n\t0x51, 0x52, 0x79, 0x4f, 0x74, 0x56, 0x5a, 0x69, 0x74, 0x41, 0x30, 0x78, 0x4e, 0x6a, 0x31, 0x6d, 0x7a, 0x47, \n\t0x69, 0x6d, 0x59, 0x50, 0x38, 0x6f, 0x30, 0x6a, 0x4d, 0x74, 0x62, 0x4e, 0x6e, 0x50, 0x42, 0x39, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x44, 0x31, 0x4e, 0x78, 0x76, 0x2b, 0x38, 0x75, 0x2b, 0x46, 0x75, 0x65, 0x4d, 0x4a, 0x63, 0x52, 0x79, \n\t0x54, 0x4a, 0x44, 0x46, 0x78, 0x48, 0x4c, 0x50, 0x33, 0x67, 0x59, 0x53, 0x2f, 0x2b, 0x44, 0x73, 0x34, 0x66, \n\t0x74, 0x78, 0x71, 0x70, 0x59, 0x4b, 0x50, 0x52, 0x44, 0x67, 0x5a, 0x57, 0x58, 0x61, 0x36, 0x6c, 0x79, 0x43, \n\t0x61, 0x68, 0x75, 0x61, 0x46, 0x58, 0x68, 0x73, 0x39, 0x44, 0x39, 0x69, 0x36, 0x6e, 0x44, 0x62, 0x71, 0x5c, 0x0a,\n\t0x09, 0x43, 0x39, 0x48, 0x69, 0x58, 0x7a, 0x2f, 0x58, 0x4e, 0x38, 0x72, 0x72, 0x65, 0x6a, 0x75, 0x4e, 0x72, \n\t0x4d, 0x46, 0x57, 0x43, 0x36, 0x52, 0x36, 0x35, 0x37, 0x77, 0x4f, 0x70, 0x43, 0x67, 0x76, 0x4a, 0x33, 0x76, \n\t0x75, 0x66, 0x69, 0x42, 0x35, 0x55, 0x78, 0x69, 0x55, 0x4f, 0x53, 0x68, 0x49, 0x41, 0x30, 0x64, 0x48, 0x43, \n\t0x68, 0x61, 0x67, 0x31, 0x49, 0x46, 0x52, 0x42, 0x69, 0x6b, 0x77, 0x62, 0x53, 0x69, 0x39, 0x79, 0x79, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x2b, 0x31, 0x46, 0x61, 0x63, 0x72, 0x45, 0x79, 0x54, 0x6d, 0x50, 0x66, 0x39, 0x6f, 0x35, 0x43, \n\t0x6d, 0x43, 0x55, 0x6d, 0x63, 0x45, 0x43, 0x64, 0x78, 0x76, 0x6b, 0x30, 0x53, 0x6a, 0x68, 0x79, 0x4e, 0x2b, \n\t0x65, 0x79, 0x4e, 0x4a, 0x6a, 0x4e, 0x6e, 0x47, 0x73, 0x34, 0x74, 0x45, 0x55, 0x35, 0x51, 0x68, 0x6a, 0x50, \n\t0x65, 0x62, 0x74, 0x76, 0x2b, 0x50, 0x74, 0x51, 0x6f, 0x47, 0x47, 0x32, 0x6a, 0x35, 0x70, 0x38, 0x74, 0x5c, 0x0a,\n\t0x09, 0x42, 0x39, 0x45, 0x41, 0x4d, 0x64, 0x62, 0x53, 0x51, 0x6e, 0x6d, 0x35, 0x6a, 0x56, 0x65, 0x57, 0x51, \n\t0x46, 0x32, 0x72, 0x61, 0x79, 0x78, 0x72, 0x31, 0x6f, 0x6f, 0x76, 0x39, 0x74, 0x6d, 0x38, 0x42, 0x75, 0x58, \n\t0x2f, 0x66, 0x57, 0x75, 0x4a, 0x4c, 0x39, 0x32, 0x78, 0x78, 0x46, 0x4b, 0x69, 0x58, 0x48, 0x52, 0x57, 0x6b, \n\t0x78, 0x64, 0x64, 0x4f, 0x73, 0x6c, 0x30, 0x42, 0x37, 0x4c, 0x34, 0x61, 0x78, 0x58, 0x79, 0x73, 0x72, 0x5c, 0x0a,\n\t0x09, 0x56, 0x51, 0x6a, 0x6f, 0x32, 0x68, 0x74, 0x6a, 0x37, 0x59, 0x38, 0x50, 0x48, 0x61, 0x45, 0x5a, 0x4b, \n\t0x5a, 0x6c, 0x38, 0x68, 0x31, 0x70, 0x44, 0x32, 0x58, 0x33, 0x54, 0x4f, 0x77, 0x50, 0x55, 0x50, 0x48, 0x61, \n\t0x34, 0x64, 0x31, 0x36, 0x42, 0x75, 0x76, 0x72, 0x58, 0x6b, 0x65, 0x2f, 0x39, 0x4b, 0x6b, 0x62, 0x7a, 0x39, \n\t0x70, 0x46, 0x6f, 0x38, 0x31, 0x53, 0x44, 0x50, 0x59, 0x65, 0x35, 0x71, 0x57, 0x4e, 0x58, 0x46, 0x30, 0x5c, 0x0a,\n\t0x09, 0x38, 0x33, 0x77, 0x6f, 0x65, 0x78, 0x36, 0x49, 0x4f, 0x48, 0x6a, 0x45, 0x30, 0x47, 0x67, 0x6b, 0x68, \n\t0x54, 0x34, 0x4f, 0x7a, 0x63, 0x30, 0x74, 0x64, 0x7a, 0x66, 0x34, 0x6b, 0x63, 0x76, 0x64, 0x58, 0x37, 0x74, \n\t0x52, 0x2b, 0x33, 0x66, 0x67, 0x4c, 0x62, 0x30, 0x33, 0x31, 0x52, 0x57, 0x66, 0x54, 0x35, 0x62, 0x32, 0x4a, \n\t0x66, 0x5a, 0x49, 0x46, 0x54, 0x47, 0x38, 0x57, 0x4f, 0x45, 0x39, 0x65, 0x74, 0x38, 0x54, 0x6b, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x2b, 0x57, 0x30, 0x6c, 0x49, 0x66, 0x34, 0x68, 0x73, 0x51, 0x7a, 0x34, 0x66, 0x32, 0x4a, 0x45, \n\t0x42, 0x56, 0x47, 0x6a, 0x37, 0x73, 0x46, 0x4d, 0x6c, 0x37, 0x32, 0x75, 0x45, 0x67, 0x38, 0x64, 0x53, 0x58, \n\t0x76, 0x39, 0x6e, 0x42, 0x37, 0x68, 0x70, 0x54, 0x37, 0x64, 0x51, 0x35, 0x44, 0x73, 0x2f, 0x63, 0x59, 0x78, \n\t0x33, 0x76, 0x75, 0x6f, 0x6b, 0x6e, 0x6e, 0x68, 0x4f, 0x63, 0x39, 0x56, 0x42, 0x79, 0x76, 0x4f, 0x46, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x78, 0x53, 0x41, 0x42, 0x49, 0x56, 0x7a, 0x71, 0x77, 0x34, 0x53, 0x51, 0x52, 0x73, 0x53, 0x41, \n\t0x59, 0x6e, 0x31, 0x64, 0x64, 0x52, 0x32, 0x71, 0x69, 0x31, 0x47, 0x72, 0x58, 0x2f, 0x69, 0x2f, 0x30, 0x43, \n\t0x42, 0x50, 0x46, 0x43, 0x2f, 0x69, 0x2f, 0x2f, 0x59, 0x2f, 0x75, 0x4a, 0x43, 0x67, 0x7a, 0x69, 0x4f, 0x55, \n\t0x64, 0x58, 0x43, 0x76, 0x39, 0x77, 0x36, 0x4b, 0x49, 0x63, 0x4f, 0x74, 0x39, 0x78, 0x39, 0x41, 0x32, 0x5c, 0x0a,\n\t0x09, 0x42, 0x45, 0x55, 0x61, 0x50, 0x32, 0x50, 0x72, 0x34, 0x50, 0x73, 0x33, 0x74, 0x35, 0x6e, 0x36, 0x38, \n\t0x4e, 0x7a, 0x56, 0x32, 0x51, 0x37, 0x45, 0x48, 0x52, 0x35, 0x34, 0x74, 0x49, 0x51, 0x31, 0x58, 0x39, 0x65, \n\t0x2b, 0x67, 0x39, 0x55, 0x6d, 0x76, 0x4f, 0x46, 0x76, 0x37, 0x71, 0x43, 0x6c, 0x2f, 0x32, 0x4b, 0x2f, 0x4a, \n\t0x57, 0x44, 0x6c, 0x57, 0x38, 0x2b, 0x35, 0x65, 0x5a, 0x41, 0x4e, 0x2f, 0x70, 0x4e, 0x73, 0x73, 0x76, 0x5c, 0x0a,\n\t0x09, 0x76, 0x75, 0x64, 0x67, 0x44, 0x30, 0x41, 0x41, 0x2b, 0x34, 0x34, 0x61, 0x66, 0x76, 0x62, 0x71, 0x51, \n\t0x78, 0x77, 0x36, 0x72, 0x76, 0x6d, 0x31, 0x50, 0x57, 0x55, 0x7a, 0x57, 0x43, 0x78, 0x53, 0x31, 0x68, 0x6e, \n\t0x42, 0x39, 0x59, 0x46, 0x70, 0x32, 0x31, 0x68, 0x68, 0x74, 0x71, 0x36, 0x54, 0x31, 0x4c, 0x30, 0x77, 0x71, \n\t0x61, 0x6d, 0x39, 0x6d, 0x52, 0x2f, 0x6d, 0x46, 0x30, 0x5a, 0x73, 0x4d, 0x62, 0x6b, 0x50, 0x46, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x71, 0x32, 0x66, 0x4e, 0x51, 0x32, 0x31, 0x62, 0x46, 0x6d, 0x4b, 0x30, 0x6e, 0x38, 0x31, 0x76, 0x37, \n\t0x7a, 0x35, 0x69, 0x79, 0x4a, 0x45, 0x2b, 0x59, 0x58, 0x59, 0x2b, 0x4c, 0x75, 0x55, 0x72, 0x42, 0x63, 0x45, \n\t0x6b, 0x51, 0x42, 0x5a, 0x47, 0x6e, 0x68, 0x53, 0x77, 0x44, 0x42, 0x73, 0x4c, 0x39, 0x35, 0x6f, 0x61, 0x73, \n\t0x66, 0x57, 0x31, 0x57, 0x31, 0x62, 0x38, 0x68, 0x6a, 0x76, 0x55, 0x39, 0x6b, 0x47, 0x37, 0x47, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x79, 0x46, 0x58, 0x31, 0x6e, 0x56, 0x30, 0x4e, 0x30, 0x6a, 0x66, 0x75, 0x36, 0x58, 0x4c, 0x44, 0x37, \n\t0x55, 0x75, 0x31, 0x52, 0x52, 0x38, 0x38, 0x5a, 0x76, 0x6a, 0x41, 0x39, 0x51, 0x76, 0x30, 0x67, 0x44, 0x45, \n\t0x71, 0x53, 0x4b, 0x4f, 0x47, 0x6b, 0x47, 0x54, 0x50, 0x57, 0x75, 0x7a, 0x30, 0x79, 0x6f, 0x6e, 0x50, 0x55, \n\t0x55, 0x48, 0x53, 0x4f, 0x70, 0x43, 0x30, 0x42, 0x46, 0x4c, 0x75, 0x4b, 0x31, 0x6d, 0x51, 0x41, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x63, 0x36, 0x58, 0x42, 0x5a, 0x78, 0x72, 0x32, 0x5a, 0x76, 0x6d, 0x59, 0x71, 0x74, 0x50, 0x35, 0x53, \n\t0x6b, 0x62, 0x6d, 0x75, 0x42, 0x53, 0x70, 0x4d, 0x30, 0x41, 0x79, 0x6d, 0x4f, 0x59, 0x34, 0x37, 0x4f, 0x4f, \n\t0x53, 0x67, 0x4c, 0x37, 0x38, 0x46, 0x5a, 0x78, 0x31, 0x6f, 0x4c, 0x2f, 0x6c, 0x44, 0x52, 0x32, 0x5a, 0x62, \n\t0x57, 0x2b, 0x58, 0x34, 0x74, 0x44, 0x5a, 0x51, 0x66, 0x37, 0x4f, 0x63, 0x58, 0x4c, 0x57, 0x66, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x6f, 0x57, 0x77, 0x56, 0x5a, 0x47, 0x69, 0x43, 0x31, 0x45, 0x77, 0x50, 0x7a, 0x37, 0x4e, 0x6d, \n\t0x52, 0x74, 0x56, 0x62, 0x72, 0x71, 0x33, 0x56, 0x77, 0x4f, 0x56, 0x35, 0x5a, 0x74, 0x37, 0x34, 0x74, 0x78, \n\t0x63, 0x4b, 0x43, 0x73, 0x33, 0x62, 0x56, 0x54, 0x35, 0x4f, 0x39, 0x62, 0x38, 0x71, 0x42, 0x2f, 0x4b, 0x68, \n\t0x78, 0x2b, 0x50, 0x79, 0x44, 0x71, 0x66, 0x30, 0x72, 0x50, 0x59, 0x38, 0x36, 0x71, 0x52, 0x44, 0x62, 0x5c, 0x0a,\n\t0x09, 0x50, 0x31, 0x59, 0x42, 0x51, 0x2b, 0x46, 0x44, 0x47, 0x4d, 0x61, 0x51, 0x76, 0x7a, 0x75, 0x57, 0x4f, \n\t0x67, 0x59, 0x44, 0x4b, 0x39, 0x61, 0x61, 0x4f, 0x52, 0x35, 0x56, 0x48, 0x54, 0x51, 0x4b, 0x49, 0x59, 0x74, \n\t0x46, 0x57, 0x38, 0x7a, 0x70, 0x6d, 0x32, 0x4c, 0x56, 0x4e, 0x4c, 0x4a, 0x45, 0x6d, 0x61, 0x2b, 0x55, 0x44, \n\t0x68, 0x56, 0x72, 0x57, 0x56, 0x48, 0x52, 0x38, 0x37, 0x6e, 0x72, 0x4a, 0x6a, 0x71, 0x32, 0x5a, 0x75, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x58, 0x30, 0x68, 0x78, 0x52, 0x38, 0x72, 0x4b, 0x6f, 0x46, 0x70, 0x63, 0x2b, 0x61, 0x4f, 0x53, \n\t0x4b, 0x46, 0x78, 0x4b, 0x74, 0x43, 0x78, 0x63, 0x45, 0x58, 0x52, 0x35, 0x61, 0x68, 0x69, 0x39, 0x6c, 0x78, \n\t0x51, 0x32, 0x5a, 0x66, 0x4c, 0x4f, 0x64, 0x5a, 0x58, 0x5a, 0x66, 0x32, 0x45, 0x49, 0x4f, 0x47, 0x77, 0x6f, \n\t0x77, 0x39, 0x49, 0x63, 0x2f, 0x50, 0x4c, 0x72, 0x37, 0x6d, 0x6b, 0x57, 0x5a, 0x76, 0x36, 0x63, 0x71, 0x5c, 0x0a,\n\t0x09, 0x69, 0x42, 0x64, 0x45, 0x43, 0x51, 0x77, 0x73, 0x35, 0x61, 0x45, 0x55, 0x67, 0x4f, 0x79, 0x42, 0x36, \n\t0x51, 0x79, 0x6d, 0x55, 0x4f, 0x43, 0x6c, 0x4c, 0x4a, 0x71, 0x62, 0x63, 0x50, 0x6d, 0x47, 0x38, 0x4b, 0x6f, \n\t0x4b, 0x5a, 0x34, 0x2f, 0x79, 0x6a, 0x33, 0x78, 0x32, 0x4e, 0x51, 0x33, 0x30, 0x32, 0x4a, 0x76, 0x63, 0x69, \n\t0x30, 0x61, 0x45, 0x62, 0x4b, 0x52, 0x43, 0x74, 0x6d, 0x6f, 0x65, 0x74, 0x43, 0x75, 0x72, 0x53, 0x38, 0x5c, 0x0a,\n\t0x09, 0x74, 0x66, 0x64, 0x49, 0x59, 0x6d, 0x63, 0x2b, 0x2f, 0x59, 0x75, 0x55, 0x33, 0x70, 0x45, 0x4f, 0x58, \n\t0x6f, 0x6a, 0x4d, 0x71, 0x68, 0x6e, 0x36, 0x54, 0x68, 0x48, 0x51, 0x50, 0x41, 0x66, 0x69, 0x57, 0x38, 0x46, \n\t0x77, 0x47, 0x56, 0x48, 0x55, 0x74, 0x43, 0x75, 0x38, 0x76, 0x56, 0x4a, 0x70, 0x7a, 0x68, 0x62, 0x65, 0x65, \n\t0x34, 0x58, 0x66, 0x2f, 0x65, 0x47, 0x38, 0x55, 0x30, 0x50, 0x7a, 0x45, 0x6e, 0x52, 0x32, 0x75, 0x48, 0x5c, 0x0a,\n\t0x09, 0x57, 0x64, 0x6b, 0x67, 0x79, 0x77, 0x62, 0x75, 0x63, 0x64, 0x38, 0x4f, 0x70, 0x79, 0x65, 0x74, 0x4d, \n\t0x65, 0x65, 0x64, 0x47, 0x52, 0x69, 0x6f, 0x58, 0x4c, 0x62, 0x2f, 0x31, 0x2b, 0x59, 0x76, 0x65, 0x64, 0x6e, \n\t0x36, 0x52, 0x5a, 0x46, 0x4b, 0x53, 0x66, 0x4b, 0x30, 0x71, 0x79, 0x34, 0x38, 0x65, 0x63, 0x32, 0x53, 0x32, \n\t0x59, 0x74, 0x44, 0x68, 0x4f, 0x43, 0x6c, 0x75, 0x54, 0x4a, 0x70, 0x79, 0x2b, 0x77, 0x2f, 0x74, 0x45, 0x5c, 0x0a,\n\t0x09, 0x58, 0x63, 0x6f, 0x72, 0x2f, 0x32, 0x46, 0x6f, 0x69, 0x66, 0x62, 0x45, 0x49, 0x33, 0x57, 0x68, 0x65, \n\t0x61, 0x59, 0x7a, 0x5a, 0x32, 0x59, 0x61, 0x59, 0x37, 0x36, 0x76, 0x7a, 0x71, 0x52, 0x56, 0x2b, 0x30, 0x51, \n\t0x32, 0x37, 0x33, 0x62, 0x67, 0x34, 0x6b, 0x4a, 0x61, 0x58, 0x35, 0x44, 0x79, 0x68, 0x6c, 0x78, 0x59, 0x71, \n\t0x72, 0x65, 0x66, 0x58, 0x71, 0x59, 0x36, 0x4e, 0x62, 0x35, 0x47, 0x59, 0x62, 0x68, 0x55, 0x76, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x65, 0x36, 0x67, 0x6c, 0x54, 0x6c, 0x61, 0x42, 0x66, 0x71, 0x32, 0x41, 0x65, 0x6b, 0x6f, 0x4b, 0x7a, \n\t0x65, 0x45, 0x42, 0x49, 0x48, 0x6b, 0x50, 0x65, 0x4a, 0x54, 0x41, 0x56, 0x49, 0x61, 0x6e, 0x4b, 0x51, 0x4d, \n\t0x50, 0x68, 0x6f, 0x79, 0x4a, 0x63, 0x38, 0x61, 0x35, 0x37, 0x55, 0x2b, 0x30, 0x52, 0x78, 0x51, 0x70, 0x71, \n\t0x6d, 0x44, 0x69, 0x43, 0x37, 0x66, 0x66, 0x6f, 0x6c, 0x43, 0x30, 0x78, 0x31, 0x2f, 0x50, 0x4a, 0x47, 0x5c, 0x0a,\n\t0x09, 0x45, 0x41, 0x48, 0x51, 0x38, 0x77, 0x36, 0x63, 0x57, 0x32, 0x38, 0x72, 0x42, 0x4d, 0x4e, 0x31, 0x6f, \n\t0x62, 0x45, 0x7a, 0x68, 0x31, 0x76, 0x4e, 0x70, 0x58, 0x57, 0x72, 0x2b, 0x76, 0x30, 0x63, 0x36, 0x32, 0x64, \n\t0x6e, 0x2b, 0x35, 0x6d, 0x5a, 0x59, 0x54, 0x43, 0x51, 0x53, 0x71, 0x65, 0x72, 0x70, 0x42, 0x6d, 0x46, 0x66, \n\t0x39, 0x6b, 0x42, 0x42, 0x4a, 0x55, 0x6a, 0x4d, 0x48, 0x49, 0x4c, 0x73, 0x46, 0x4b, 0x51, 0x57, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x58, 0x6f, 0x79, 0x44, 0x71, 0x51, 0x6c, 0x6f, 0x31, 0x46, 0x43, 0x70, 0x78, 0x74, 0x62, 0x33, 0x6f, \n\t0x49, 0x77, 0x6b, 0x56, 0x36, 0x51, 0x4c, 0x49, 0x68, 0x4a, 0x4c, 0x73, 0x76, 0x58, 0x75, 0x54, 0x6c, 0x7a, \n\t0x35, 0x38, 0x6e, 0x69, 0x52, 0x4f, 0x53, 0x4e, 0x43, 0x56, 0x4e, 0x4c, 0x45, 0x42, 0x4a, 0x48, 0x50, 0x4f, \n\t0x34, 0x73, 0x35, 0x5a, 0x34, 0x78, 0x51, 0x2f, 0x4e, 0x6b, 0x34, 0x58, 0x6d, 0x5a, 0x74, 0x45, 0x42, 0x5c, 0x0a,\n\t0x09, 0x58, 0x74, 0x50, 0x55, 0x42, 0x4c, 0x69, 0x5a, 0x4a, 0x64, 0x52, 0x4e, 0x64, 0x6b, 0x70, 0x6a, 0x75, \n\t0x36, 0x75, 0x2f, 0x41, 0x64, 0x56, 0x61, 0x69, 0x50, 0x72, 0x35, 0x52, 0x4d, 0x2f, 0x4d, 0x48, 0x56, 0x37, \n\t0x76, 0x65, 0x31, 0x41, 0x41, 0x4b, 0x56, 0x2f, 0x76, 0x67, 0x74, 0x42, 0x48, 0x61, 0x44, 0x65, 0x57, 0x70, \n\t0x32, 0x6a, 0x4c, 0x5a, 0x4e, 0x44, 0x4a, 0x6f, 0x61, 0x38, 0x52, 0x7a, 0x44, 0x76, 0x31, 0x48, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x66, 0x6e, 0x66, 0x4f, 0x70, 0x38, 0x70, 0x4c, 0x4b, 0x2f, 0x45, 0x74, 0x36, 0x6a, 0x35, 0x78, 0x62, \n\t0x39, 0x66, 0x43, 0x54, 0x76, 0x78, 0x77, 0x52, 0x65, 0x61, 0x64, 0x32, 0x58, 0x32, 0x69, 0x72, 0x71, 0x56, \n\t0x70, 0x7a, 0x4c, 0x4b, 0x6e, 0x2b, 0x70, 0x4c, 0x66, 0x53, 0x52, 0x58, 0x44, 0x6e, 0x68, 0x58, 0x4a, 0x4b, \n\t0x4a, 0x49, 0x45, 0x72, 0x7a, 0x2b, 0x79, 0x67, 0x6f, 0x45, 0x55, 0x4b, 0x4d, 0x66, 0x5a, 0x66, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x46, 0x76, 0x4e, 0x54, 0x4c, 0x7a, 0x7a, 0x47, 0x37, 0x6f, 0x74, 0x6a, 0x2f, 0x76, 0x48, 0x4c, 0x45, \n\t0x39, 0x79, 0x2f, 0x76, 0x38, 0x31, 0x4a, 0x57, 0x78, 0x4e, 0x32, 0x50, 0x39, 0x48, 0x77, 0x6e, 0x4b, 0x64, \n\t0x43, 0x31, 0x47, 0x6a, 0x6d, 0x6b, 0x35, 0x61, 0x30, 0x6e, 0x4b, 0x2f, 0x54, 0x7a, 0x76, 0x75, 0x79, 0x5a, \n\t0x36, 0x49, 0x52, 0x2f, 0x4d, 0x63, 0x6d, 0x37, 0x46, 0x78, 0x53, 0x43, 0x36, 0x4b, 0x74, 0x59, 0x41, 0x5c, 0x0a,\n\t0x09, 0x34, 0x44, 0x35, 0x70, 0x4b, 0x36, 0x76, 0x71, 0x79, 0x47, 0x79, 0x46, 0x62, 0x38, 0x4b, 0x63, 0x46, \n\t0x2b, 0x30, 0x4d, 0x6c, 0x68, 0x75, 0x31, 0x57, 0x44, 0x39, 0x4e, 0x52, 0x7a, 0x4a, 0x2f, 0x68, 0x54, 0x6a, \n\t0x74, 0x62, 0x64, 0x45, 0x34, 0x42, 0x4c, 0x48, 0x39, 0x4d, 0x4f, 0x4f, 0x6a, 0x76, 0x73, 0x35, 0x42, 0x43, \n\t0x59, 0x61, 0x70, 0x43, 0x55, 0x38, 0x4c, 0x36, 0x72, 0x41, 0x46, 0x4b, 0x6c, 0x34, 0x7a, 0x7a, 0x41, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x2f, 0x2f, 0x43, 0x55, 0x57, 0x4b, 0x68, 0x4c, 0x59, 0x63, 0x41, 0x43, 0x63, 0x68, 0x47, 0x64, \n\t0x6b, 0x62, 0x63, 0x61, 0x4d, 0x70, 0x58, 0x53, 0x39, 0x31, 0x75, 0x6b, 0x75, 0x63, 0x33, 0x63, 0x4f, 0x45, \n\t0x75, 0x75, 0x48, 0x42, 0x58, 0x51, 0x76, 0x35, 0x79, 0x5a, 0x4a, 0x4e, 0x73, 0x45, 0x74, 0x4d, 0x6f, 0x32, \n\t0x59, 0x2f, 0x39, 0x30, 0x62, 0x59, 0x61, 0x52, 0x31, 0x71, 0x5a, 0x55, 0x31, 0x33, 0x38, 0x53, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x4c, 0x35, 0x6b, 0x5a, 0x76, 0x61, 0x68, 0x53, 0x69, 0x48, 0x5a, 0x41, 0x65, 0x42, 0x4b, 0x4b, \n\t0x4c, 0x41, 0x66, 0x53, 0x4f, 0x63, 0x35, 0x48, 0x48, 0x33, 0x6c, 0x50, 0x6f, 0x79, 0x78, 0x36, 0x49, 0x46, \n\t0x74, 0x39, 0x7a, 0x70, 0x53, 0x2f, 0x73, 0x4b, 0x64, 0x6d, 0x63, 0x57, 0x52, 0x2b, 0x51, 0x43, 0x71, 0x4d, \n\t0x71, 0x41, 0x42, 0x57, 0x65, 0x66, 0x65, 0x45, 0x55, 0x33, 0x33, 0x64, 0x4f, 0x68, 0x35, 0x76, 0x76, 0x5c, 0x0a,\n\t0x09, 0x72, 0x5a, 0x34, 0x72, 0x75, 0x76, 0x69, 0x73, 0x4e, 0x6c, 0x64, 0x65, 0x50, 0x45, 0x57, 0x78, 0x73, \n\t0x31, 0x59, 0x43, 0x6b, 0x6a, 0x38, 0x31, 0x4a, 0x70, 0x41, 0x30, 0x51, 0x6d, 0x4e, 0x44, 0x75, 0x6c, 0x64, \n\t0x49, 0x48, 0x31, 0x4a, 0x49, 0x49, 0x6d, 0x52, 0x43, 0x69, 0x58, 0x59, 0x30, 0x61, 0x4a, 0x78, 0x75, 0x69, \n\t0x47, 0x59, 0x48, 0x42, 0x53, 0x6c, 0x54, 0x49, 0x53, 0x4f, 0x43, 0x46, 0x4e, 0x6d, 0x35, 0x6d, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x67, 0x4b, 0x37, 0x5a, 0x32, 0x42, 0x56, 0x41, 0x43, 0x46, 0x58, 0x69, 0x44, 0x77, 0x47, 0x6f, 0x69, \n\t0x65, 0x47, 0x65, 0x2f, 0x69, 0x39, 0x79, 0x4f, 0x56, 0x62, 0x47, 0x68, 0x76, 0x53, 0x74, 0x74, 0x6f, 0x71, \n\t0x36, 0x2f, 0x53, 0x56, 0x6f, 0x53, 0x64, 0x4b, 0x41, 0x2b, 0x57, 0x2b, 0x37, 0x4e, 0x58, 0x45, 0x39, 0x6b, \n\t0x61, 0x6e, 0x67, 0x31, 0x73, 0x4c, 0x35, 0x69, 0x7a, 0x54, 0x46, 0x30, 0x58, 0x51, 0x56, 0x49, 0x52, 0x5c, 0x0a,\n\t0x09, 0x70, 0x4b, 0x54, 0x4b, 0x49, 0x34, 0x52, 0x33, 0x2f, 0x76, 0x53, 0x70, 0x2f, 0x4d, 0x65, 0x2f, 0x33, \n\t0x4d, 0x64, 0x58, 0x37, 0x79, 0x35, 0x2b, 0x2f, 0x75, 0x62, 0x4a, 0x75, 0x39, 0x72, 0x38, 0x33, 0x6b, 0x2b, \n\t0x64, 0x54, 0x42, 0x53, 0x57, 0x4e, 0x51, 0x70, 0x49, 0x46, 0x49, 0x66, 0x2b, 0x39, 0x6a, 0x6a, 0x4d, 0x57, \n\t0x69, 0x37, 0x62, 0x5a, 0x2b, 0x73, 0x50, 0x6b, 0x6a, 0x6b, 0x69, 0x4a, 0x48, 0x65, 0x6b, 0x4a, 0x48, 0x5c, 0x0a,\n\t0x09, 0x73, 0x55, 0x43, 0x68, 0x50, 0x39, 0x41, 0x6e, 0x63, 0x44, 0x4e, 0x49, 0x68, 0x4f, 0x55, 0x70, 0x71, \n\t0x37, 0x49, 0x68, 0x72, 0x6e, 0x70, 0x45, 0x53, 0x7a, 0x65, 0x64, 0x57, 0x4b, 0x50, 0x56, 0x30, 0x46, 0x6b, \n\t0x6d, 0x2b, 0x36, 0x35, 0x54, 0x35, 0x43, 0x47, 0x6f, 0x49, 0x6b, 0x77, 0x66, 0x78, 0x4f, 0x66, 0x6b, 0x37, \n\t0x56, 0x7a, 0x65, 0x2f, 0x34, 0x4d, 0x72, 0x4f, 0x31, 0x74, 0x6b, 0x59, 0x4f, 0x52, 0x39, 0x69, 0x39, 0x5c, 0x0a,\n\t0x09, 0x42, 0x63, 0x42, 0x43, 0x63, 0x30, 0x59, 0x70, 0x54, 0x35, 0x44, 0x58, 0x41, 0x4e, 0x45, 0x57, 0x73, \n\t0x68, 0x45, 0x6b, 0x30, 0x65, 0x4e, 0x42, 0x42, 0x34, 0x44, 0x49, 0x33, 0x75, 0x50, 0x78, 0x2b, 0x55, 0x4d, \n\t0x56, 0x39, 0x47, 0x6e, 0x65, 0x6f, 0x4d, 0x75, 0x41, 0x74, 0x48, 0x32, 0x71, 0x79, 0x62, 0x74, 0x66, 0x75, \n\t0x35, 0x4d, 0x76, 0x33, 0x37, 0x58, 0x49, 0x7a, 0x58, 0x73, 0x58, 0x4d, 0x51, 0x70, 0x50, 0x50, 0x71, 0x5c, 0x0a,\n\t0x09, 0x66, 0x46, 0x44, 0x7a, 0x78, 0x32, 0x6f, 0x6e, 0x66, 0x4f, 0x5a, 0x78, 0x53, 0x51, 0x33, 0x4c, 0x78, \n\t0x4e, 0x4c, 0x30, 0x6a, 0x75, 0x75, 0x41, 0x65, 0x6b, 0x38, 0x74, 0x71, 0x57, 0x65, 0x77, 0x34, 0x46, 0x55, \n\t0x6b, 0x6a, 0x32, 0x70, 0x69, 0x54, 0x33, 0x70, 0x4a, 0x67, 0x44, 0x34, 0x56, 0x39, 0x79, 0x74, 0x5a, 0x68, \n\t0x44, 0x77, 0x75, 0x4a, 0x42, 0x49, 0x66, 0x70, 0x47, 0x52, 0x4c, 0x52, 0x44, 0x61, 0x65, 0x34, 0x79, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x48, 0x65, 0x6c, 0x79, 0x4c, 0x53, 0x66, 0x69, 0x53, 0x36, 0x62, 0x77, 0x68, 0x4a, 0x59, 0x53, \n\t0x6c, 0x62, 0x2f, 0x33, 0x4e, 0x6b, 0x75, 0x31, 0x79, 0x33, 0x55, 0x2b, 0x47, 0x36, 0x45, 0x4a, 0x45, 0x32, \n\t0x62, 0x58, 0x31, 0x50, 0x79, 0x74, 0x54, 0x59, 0x33, 0x64, 0x30, 0x51, 0x4a, 0x71, 0x41, 0x49, 0x77, 0x5a, \n\t0x57, 0x6a, 0x38, 0x4f, 0x5a, 0x4e, 0x72, 0x48, 0x4a, 0x38, 0x33, 0x41, 0x38, 0x6a, 0x6c, 0x6c, 0x53, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x6e, 0x51, 0x53, 0x50, 0x41, 0x6e, 0x41, 0x74, 0x38, 0x74, 0x74, 0x77, 0x65, 0x64, 0x59, 0x37, \n\t0x31, 0x59, 0x34, 0x70, 0x2f, 0x48, 0x61, 0x57, 0x4f, 0x44, 0x74, 0x50, 0x77, 0x70, 0x33, 0x70, 0x42, 0x45, \n\t0x6f, 0x48, 0x64, 0x35, 0x30, 0x2b, 0x77, 0x2b, 0x37, 0x45, 0x54, 0x74, 0x73, 0x4c, 0x65, 0x62, 0x46, 0x51, \n\t0x35, 0x7a, 0x36, 0x73, 0x47, 0x6b, 0x6d, 0x38, 0x66, 0x43, 0x35, 0x49, 0x75, 0x70, 0x4f, 0x69, 0x53, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x67, 0x73, 0x47, 0x6e, 0x54, 0x4f, 0x59, 0x2f, 0x59, 0x5a, 0x30, 0x58, 0x35, 0x70, 0x70, 0x6e, \n\t0x62, 0x31, 0x48, 0x34, 0x61, 0x37, 0x44, 0x77, 0x69, 0x57, 0x6e, 0x4b, 0x74, 0x73, 0x6e, 0x71, 0x68, 0x76, \n\t0x6e, 0x4d, 0x2f, 0x63, 0x4b, 0x38, 0x7a, 0x46, 0x63, 0x65, 0x61, 0x37, 0x53, 0x4f, 0x53, 0x42, 0x30, 0x44, \n\t0x7a, 0x54, 0x6f, 0x66, 0x71, 0x31, 0x42, 0x4e, 0x4b, 0x4e, 0x45, 0x4a, 0x78, 0x74, 0x6b, 0x56, 0x70, 0x5c, 0x0a,\n\t0x09, 0x46, 0x4a, 0x52, 0x53, 0x59, 0x4d, 0x4d, 0x68, 0x6b, 0x68, 0x6b, 0x77, 0x61, 0x5a, 0x55, 0x4b, 0x51, \n\t0x64, 0x6d, 0x69, 0x38, 0x50, 0x74, 0x61, 0x39, 0x6b, 0x46, 0x65, 0x51, 0x4f, 0x67, 0x47, 0x77, 0x30, 0x35, \n\t0x32, 0x61, 0x31, 0x4a, 0x63, 0x71, 0x62, 0x77, 0x53, 0x2f, 0x61, 0x68, 0x76, 0x43, 0x6f, 0x6b, 0x6f, 0x38, \n\t0x49, 0x76, 0x54, 0x68, 0x54, 0x56, 0x6e, 0x43, 0x75, 0x33, 0x59, 0x38, 0x61, 0x65, 0x43, 0x33, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x54, 0x5a, 0x72, 0x58, 0x65, 0x45, 0x59, 0x68, 0x36, 0x75, 0x53, 0x61, 0x53, 0x4f, 0x54, 0x63, 0x6a, \n\t0x4c, 0x39, 0x41, 0x36, 0x69, 0x42, 0x36, 0x66, 0x4e, 0x62, 0x77, 0x6d, 0x59, 0x77, 0x41, 0x55, 0x73, 0x47, \n\t0x55, 0x56, 0x41, 0x42, 0x52, 0x38, 0x47, 0x31, 0x47, 0x41, 0x43, 0x6e, 0x49, 0x58, 0x77, 0x55, 0x53, 0x43, \n\t0x79, 0x6e, 0x70, 0x77, 0x77, 0x6e, 0x6d, 0x59, 0x49, 0x49, 0x65, 0x4e, 0x5a, 0x68, 0x6a, 0x42, 0x74, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x2b, 0x6d, 0x75, 0x62, 0x2b, 0x4f, 0x65, 0x48, 0x77, 0x49, 0x6a, 0x78, 0x30, 0x54, 0x4e, 0x67, \n\t0x2b, 0x55, 0x5a, 0x30, 0x33, 0x54, 0x75, 0x32, 0x45, 0x61, 0x75, 0x70, 0x63, 0x48, 0x43, 0x2f, 0x6d, 0x6d, \n\t0x47, 0x43, 0x4f, 0x6c, 0x54, 0x73, 0x76, 0x61, 0x4d, 0x47, 0x57, 0x45, 0x70, 0x31, 0x6b, 0x61, 0x44, 0x34, \n\t0x75, 0x70, 0x76, 0x6e, 0x59, 0x70, 0x51, 0x72, 0x74, 0x57, 0x41, 0x55, 0x53, 0x57, 0x4a, 0x50, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x51, 0x4a, 0x4d, 0x45, 0x74, 0x4a, 0x6b, 0x33, 0x76, 0x59, 0x43, 0x61, 0x79, 0x47, 0x71, 0x6b, 0x44, \n\t0x43, 0x53, 0x4b, 0x51, 0x45, 0x58, 0x4f, 0x44, 0x31, 0x49, 0x48, 0x55, 0x4f, 0x5a, 0x63, 0x65, 0x78, 0x38, \n\t0x70, 0x31, 0x47, 0x49, 0x4f, 0x33, 0x4f, 0x78, 0x58, 0x4d, 0x31, 0x72, 0x32, 0x49, 0x54, 0x55, 0x46, 0x77, \n\t0x35, 0x6c, 0x56, 0x7a, 0x31, 0x55, 0x48, 0x30, 0x56, 0x6d, 0x32, 0x67, 0x4c, 0x79, 0x69, 0x68, 0x41, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x6a, 0x67, 0x53, 0x53, 0x35, 0x4a, 0x68, 0x6f, 0x58, 0x53, 0x44, 0x58, 0x4c, 0x49, 0x32, 0x5a, \n\t0x66, 0x51, 0x6e, 0x4c, 0x62, 0x49, 0x75, 0x5a, 0x41, 0x35, 0x53, 0x78, 0x39, 0x58, 0x33, 0x6e, 0x69, 0x71, \n\t0x63, 0x72, 0x4a, 0x78, 0x2b, 0x43, 0x63, 0x69, 0x6c, 0x2b, 0x74, 0x39, 0x2f, 0x4c, 0x63, 0x58, 0x55, 0x71, \n\t0x71, 0x30, 0x4b, 0x6e, 0x6e, 0x70, 0x56, 0x49, 0x30, 0x46, 0x74, 0x4b, 0x48, 0x47, 0x36, 0x51, 0x50, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x7a, 0x42, 0x7a, 0x45, 0x65, 0x32, 0x6e, 0x4c, 0x41, 0x77, 0x42, 0x6b, 0x75, 0x5a, 0x6d, 0x70, \n\t0x51, 0x43, 0x53, 0x42, 0x71, 0x59, 0x74, 0x74, 0x73, 0x65, 0x5a, 0x66, 0x39, 0x51, 0x71, 0x72, 0x70, 0x6c, \n\t0x4a, 0x77, 0x77, 0x4c, 0x6b, 0x4e, 0x5a, 0x46, 0x70, 0x6b, 0x58, 0x2b, 0x6f, 0x66, 0x53, 0x6e, 0x58, 0x51, \n\t0x69, 0x61, 0x76, 0x43, 0x67, 0x44, 0x53, 0x41, 0x5a, 0x30, 0x48, 0x31, 0x5a, 0x31, 0x56, 0x7a, 0x31, 0x5c, 0x0a,\n\t0x09, 0x55, 0x48, 0x30, 0x63, 0x6c, 0x5a, 0x4b, 0x65, 0x58, 0x35, 0x47, 0x58, 0x2b, 0x38, 0x55, 0x70, 0x42, \n\t0x63, 0x58, 0x72, 0x66, 0x2b, 0x30, 0x61, 0x4e, 0x4a, 0x52, 0x67, 0x55, 0x70, 0x2f, 0x73, 0x59, 0x38, 0x61, \n\t0x63, 0x32, 0x6f, 0x63, 0x42, 0x43, 0x5a, 0x62, 0x73, 0x48, 0x35, 0x4a, 0x2f, 0x58, 0x50, 0x30, 0x34, 0x78, \n\t0x57, 0x2f, 0x73, 0x58, 0x55, 0x35, 0x4c, 0x73, 0x74, 0x32, 0x6b, 0x39, 0x5a, 0x49, 0x68, 0x75, 0x46, 0x5c, 0x0a,\n\t0x09, 0x44, 0x51, 0x4f, 0x53, 0x43, 0x6b, 0x51, 0x65, 0x70, 0x44, 0x79, 0x76, 0x58, 0x62, 0x51, 0x31, 0x32, \n\t0x4b, 0x67, 0x41, 0x52, 0x37, 0x68, 0x70, 0x46, 0x74, 0x66, 0x4b, 0x42, 0x44, 0x76, 0x52, 0x47, 0x4c, 0x6b, \n\t0x6e, 0x4d, 0x46, 0x69, 0x4e, 0x70, 0x43, 0x31, 0x73, 0x66, 0x4a, 0x50, 0x6d, 0x39, 0x2f, 0x48, 0x61, 0x54, \n\t0x44, 0x70, 0x67, 0x6a, 0x6f, 0x50, 0x49, 0x61, 0x56, 0x56, 0x4c, 0x48, 0x7a, 0x31, 0x74, 0x34, 0x66, 0x5c, 0x0a,\n\t0x09, 0x72, 0x6e, 0x6a, 0x44, 0x77, 0x6c, 0x31, 0x43, 0x41, 0x55, 0x54, 0x56, 0x4d, 0x64, 0x53, 0x41, 0x77, \n\t0x41, 0x55, 0x74, 0x59, 0x6f, 0x62, 0x6c, 0x73, 0x54, 0x48, 0x54, 0x6b, 0x4d, 0x53, 0x48, 0x72, 0x45, 0x72, \n\t0x41, 0x69, 0x67, 0x74, 0x52, 0x53, 0x4e, 0x42, 0x56, 0x30, 0x53, 0x70, 0x46, 0x4f, 0x31, 0x38, 0x67, 0x39, \n\t0x39, 0x51, 0x51, 0x4c, 0x58, 0x77, 0x59, 0x6e, 0x31, 0x66, 0x61, 0x51, 0x52, 0x67, 0x4b, 0x54, 0x32, 0x5c, 0x0a,\n\t0x09, 0x42, 0x2f, 0x6f, 0x30, 0x79, 0x47, 0x39, 0x61, 0x4e, 0x6d, 0x2f, 0x6f, 0x44, 0x32, 0x56, 0x44, 0x66, \n\t0x4d, 0x6d, 0x48, 0x2b, 0x4e, 0x6c, 0x35, 0x56, 0x37, 0x35, 0x30, 0x62, 0x56, 0x35, 0x70, 0x2b, 0x7a, 0x2f, \n\t0x38, 0x48, 0x56, 0x58, 0x50, 0x55, 0x76, 0x6b, 0x48, 0x70, 0x63, 0x70, 0x32, 0x4f, 0x37, 0x4c, 0x50, 0x31, \n\t0x4d, 0x39, 0x77, 0x49, 0x50, 0x6e, 0x2b, 0x48, 0x68, 0x67, 0x6b, 0x64, 0x31, 0x30, 0x70, 0x4f, 0x72, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x6f, 0x4f, 0x6b, 0x74, 0x4f, 0x64, 0x52, 0x56, 0x49, 0x71, 0x2f, 0x5a, 0x4c, 0x4a, 0x65, 0x4f, \n\t0x58, 0x36, 0x4a, 0x54, 0x55, 0x66, 0x67, 0x42, 0x66, 0x6f, 0x58, 0x66, 0x6c, 0x50, 0x38, 0x73, 0x31, 0x41, \n\t0x45, 0x68, 0x70, 0x55, 0x41, 0x61, 0x75, 0x6d, 0x57, 0x4c, 0x72, 0x79, 0x36, 0x68, 0x53, 0x31, 0x45, 0x67, \n\t0x34, 0x63, 0x39, 0x62, 0x4b, 0x7a, 0x56, 0x62, 0x68, 0x39, 0x30, 0x4e, 0x38, 0x57, 0x71, 0x74, 0x34, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x43, 0x30, 0x68, 0x36, 0x5a, 0x61, 0x71, 0x5a, 0x36, 0x6c, 0x72, 0x39, 0x73, 0x6c, 0x73, 0x38, \n\t0x69, 0x37, 0x73, 0x76, 0x44, 0x4a, 0x49, 0x32, 0x54, 0x4f, 0x4e, 0x41, 0x61, 0x51, 0x41, 0x44, 0x6a, 0x76, \n\t0x30, 0x44, 0x38, 0x76, 0x4b, 0x49, 0x65, 0x73, 0x48, 0x6b, 0x6b, 0x77, 0x32, 0x69, 0x55, 0x35, 0x72, 0x59, \n\t0x78, 0x35, 0x61, 0x50, 0x70, 0x35, 0x70, 0x76, 0x53, 0x53, 0x61, 0x56, 0x5a, 0x71, 0x50, 0x54, 0x32, 0x5c, 0x0a,\n\t0x09, 0x68, 0x64, 0x45, 0x4c, 0x73, 0x55, 0x2f, 0x77, 0x78, 0x39, 0x51, 0x4b, 0x72, 0x34, 0x37, 0x48, 0x47, \n\t0x76, 0x52, 0x73, 0x71, 0x64, 0x62, 0x56, 0x57, 0x78, 0x2f, 0x6c, 0x47, 0x35, 0x65, 0x7a, 0x4e, 0x66, 0x79, \n\t0x57, 0x6b, 0x63, 0x64, 0x56, 0x72, 0x4b, 0x6a, 0x38, 0x70, 0x38, 0x66, 0x51, 0x70, 0x77, 0x74, 0x59, 0x49, \n\t0x36, 0x56, 0x6e, 0x38, 0x67, 0x74, 0x47, 0x36, 0x79, 0x63, 0x51, 0x5a, 0x38, 0x5a, 0x63, 0x67, 0x37, 0x5c, 0x0a,\n\t0x09, 0x30, 0x59, 0x4e, 0x55, 0x4f, 0x56, 0x38, 0x55, 0x67, 0x6c, 0x51, 0x6f, 0x79, 0x7a, 0x72, 0x4f, 0x79, \n\t0x34, 0x46, 0x55, 0x67, 0x69, 0x49, 0x48, 0x4b, 0x62, 0x69, 0x6d, 0x41, 0x4a, 0x49, 0x76, 0x76, 0x77, 0x68, \n\t0x53, 0x36, 0x38, 0x6d, 0x7a, 0x78, 0x44, 0x63, 0x65, 0x78, 0x52, 0x79, 0x49, 0x57, 0x57, 0x2b, 0x52, 0x4e, \n\t0x73, 0x67, 0x57, 0x4a, 0x64, 0x71, 0x71, 0x52, 0x44, 0x73, 0x4d, 0x6a, 0x64, 0x4e, 0x53, 0x6f, 0x71, 0x5c, 0x0a,\n\t0x09, 0x30, 0x4f, 0x43, 0x49, 0x47, 0x42, 0x34, 0x37, 0x56, 0x37, 0x5a, 0x72, 0x57, 0x39, 0x65, 0x4a, 0x43, \n\t0x6b, 0x43, 0x42, 0x49, 0x52, 0x61, 0x6b, 0x77, 0x78, 0x71, 0x45, 0x30, 0x39, 0x4b, 0x4e, 0x34, 0x58, 0x63, \n\t0x69, 0x4d, 0x30, 0x58, 0x30, 0x34, 0x34, 0x67, 0x77, 0x33, 0x46, 0x4f, 0x61, 0x56, 0x73, 0x38, 0x56, 0x6b, \n\t0x72, 0x4a, 0x7a, 0x33, 0x71, 0x4a, 0x68, 0x73, 0x62, 0x4f, 0x45, 0x32, 0x51, 0x7a, 0x37, 0x6b, 0x45, 0x5c, 0x0a,\n\t0x09, 0x49, 0x49, 0x55, 0x50, 0x55, 0x41, 0x6c, 0x53, 0x75, 0x61, 0x4d, 0x64, 0x6b, 0x43, 0x4f, 0x42, 0x56, \n\t0x46, 0x4a, 0x37, 0x48, 0x68, 0x78, 0x2f, 0x55, 0x4c, 0x42, 0x30, 0x31, 0x71, 0x53, 0x31, 0x64, 0x6d, 0x2f, \n\t0x46, 0x50, 0x4c, 0x68, 0x49, 0x65, 0x73, 0x38, 0x69, 0x35, 0x6c, 0x42, 0x53, 0x31, 0x4a, 0x70, 0x6a, 0x6c, \n\t0x59, 0x44, 0x79, 0x4a, 0x72, 0x51, 0x65, 0x72, 0x30, 0x53, 0x6e, 0x71, 0x4a, 0x30, 0x54, 0x6d, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x45, 0x57, 0x6f, 0x73, 0x4a, 0x48, 0x53, 0x4b, 0x76, 0x38, 0x76, 0x58, 0x47, 0x41, 0x70, 0x47, 0x37, \n\t0x42, 0x31, 0x6f, 0x47, 0x45, 0x4c, 0x63, 0x63, 0x4f, 0x2f, 0x56, 0x31, 0x51, 0x6d, 0x34, 0x53, 0x67, 0x2b, \n\t0x4f, 0x74, 0x4b, 0x55, 0x74, 0x5a, 0x41, 0x6f, 0x59, 0x2b, 0x6b, 0x70, 0x58, 0x34, 0x4e, 0x70, 0x4e, 0x36, \n\t0x4c, 0x79, 0x48, 0x6a, 0x78, 0x66, 0x6b, 0x6f, 0x49, 0x6b, 0x6d, 0x2b, 0x56, 0x4e, 0x51, 0x61, 0x70, 0x5c, 0x0a,\n\t0x09, 0x50, 0x4f, 0x2f, 0x6b, 0x43, 0x79, 0x2b, 0x6e, 0x69, 0x78, 0x4b, 0x64, 0x50, 0x6b, 0x46, 0x30, 0x52, \n\t0x67, 0x63, 0x53, 0x78, 0x63, 0x77, 0x6c, 0x36, 0x50, 0x45, 0x55, 0x75, 0x67, 0x5a, 0x69, 0x52, 0x56, 0x50, \n\t0x37, 0x73, 0x77, 0x66, 0x61, 0x56, 0x64, 0x4b, 0x48, 0x45, 0x6f, 0x67, 0x31, 0x71, 0x30, 0x35, 0x52, 0x65, \n\t0x68, 0x49, 0x71, 0x4a, 0x64, 0x6f, 0x42, 0x45, 0x35, 0x63, 0x70, 0x4d, 0x75, 0x4f, 0x75, 0x47, 0x58, 0x5c, 0x0a,\n\t0x09, 0x74, 0x30, 0x70, 0x48, 0x2f, 0x4f, 0x4f, 0x70, 0x44, 0x41, 0x7a, 0x6a, 0x34, 0x37, 0x6a, 0x55, 0x51, \n\t0x6a, 0x62, 0x2f, 0x4e, 0x73, 0x44, 0x69, 0x6c, 0x66, 0x2b, 0x62, 0x63, 0x67, 0x4e, 0x63, 0x6b, 0x69, 0x4a, \n\t0x66, 0x31, 0x63, 0x55, 0x54, 0x62, 0x42, 0x47, 0x42, 0x62, 0x72, 0x58, 0x71, 0x54, 0x4d, 0x42, 0x6b, 0x47, \n\t0x39, 0x55, 0x6d, 0x66, 0x4f, 0x33, 0x4c, 0x35, 0x6b, 0x69, 0x33, 0x39, 0x46, 0x6b, 0x4d, 0x4b, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x49, 0x34, 0x42, 0x55, 0x30, 0x43, 0x77, 0x72, 0x41, 0x53, 0x6d, 0x34, 0x62, 0x30, 0x2b, 0x36, 0x4b, \n\t0x37, 0x73, 0x4a, 0x30, 0x55, 0x6b, 0x74, 0x32, 0x47, 0x34, 0x66, 0x74, 0x66, 0x78, 0x5a, 0x5a, 0x45, 0x30, \n\t0x4d, 0x79, 0x52, 0x31, 0x64, 0x6b, 0x72, 0x76, 0x6a, 0x44, 0x4b, 0x5a, 0x42, 0x4a, 0x64, 0x6f, 0x6d, 0x74, \n\t0x43, 0x36, 0x41, 0x35, 0x74, 0x6e, 0x42, 0x6f, 0x31, 0x61, 0x45, 0x6b, 0x4f, 0x51, 0x67, 0x75, 0x59, 0x5c, 0x0a,\n\t0x09, 0x71, 0x4e, 0x4c, 0x63, 0x79, 0x32, 0x4c, 0x4a, 0x6f, 0x37, 0x32, 0x32, 0x47, 0x62, 0x47, 0x38, 0x6c, \n\t0x4e, 0x57, 0x2b, 0x59, 0x54, 0x71, 0x51, 0x55, 0x72, 0x4b, 0x6c, 0x30, 0x50, 0x77, 0x56, 0x71, 0x64, 0x4f, \n\t0x69, 0x65, 0x38, 0x47, 0x4c, 0x5a, 0x62, 0x6c, 0x6e, 0x36, 0x68, 0x49, 0x4d, 0x48, 0x2b, 0x4b, 0x6f, 0x42, \n\t0x55, 0x47, 0x59, 0x73, 0x55, 0x58, 0x44, 0x4d, 0x51, 0x53, 0x44, 0x56, 0x2f, 0x32, 0x52, 0x58, 0x33, 0x5c, 0x0a,\n\t0x09, 0x72, 0x4a, 0x72, 0x5a, 0x56, 0x6c, 0x57, 0x6b, 0x47, 0x64, 0x47, 0x36, 0x73, 0x45, 0x50, 0x72, 0x67, \n\t0x67, 0x37, 0x70, 0x77, 0x7a, 0x48, 0x70, 0x2f, 0x74, 0x54, 0x4f, 0x62, 0x73, 0x38, 0x72, 0x64, 0x48, 0x50, \n\t0x67, 0x61, 0x41, 0x6f, 0x79, 0x41, 0x64, 0x47, 0x4d, 0x45, 0x47, 0x30, 0x58, 0x47, 0x6a, 0x75, 0x78, 0x69, \n\t0x36, 0x2f, 0x69, 0x57, 0x31, 0x32, 0x43, 0x5a, 0x75, 0x67, 0x44, 0x6b, 0x73, 0x39, 0x58, 0x45, 0x34, 0x5c, 0x0a,\n\t0x09, 0x73, 0x31, 0x4e, 0x70, 0x41, 0x6b, 0x49, 0x58, 0x73, 0x52, 0x55, 0x71, 0x4a, 0x67, 0x4d, 0x72, 0x49, \n\t0x46, 0x6b, 0x76, 0x62, 0x4f, 0x62, 0x4b, 0x50, 0x59, 0x5a, 0x52, 0x44, 0x6e, 0x53, 0x32, 0x61, 0x67, 0x4b, \n\t0x54, 0x5a, 0x77, 0x54, 0x56, 0x32, 0x68, 0x41, 0x35, 0x67, 0x7a, 0x31, 0x2b, 0x61, 0x4c, 0x4b, 0x42, 0x4e, \n\t0x67, 0x66, 0x30, 0x46, 0x48, 0x73, 0x77, 0x34, 0x6c, 0x62, 0x34, 0x42, 0x56, 0x41, 0x36, 0x6e, 0x63, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x43, 0x4f, 0x41, 0x56, 0x44, 0x6d, 0x53, 0x71, 0x37, 0x70, 0x33, 0x55, 0x4b, 0x59, 0x6f, 0x6a, \n\t0x5a, 0x30, 0x74, 0x47, 0x6a, 0x75, 0x62, 0x4f, 0x51, 0x69, 0x51, 0x64, 0x31, 0x61, 0x67, 0x77, 0x62, 0x49, \n\t0x4a, 0x75, 0x65, 0x77, 0x76, 0x61, 0x37, 0x43, 0x67, 0x74, 0x76, 0x79, 0x74, 0x58, 0x4d, 0x6d, 0x62, 0x72, \n\t0x51, 0x66, 0x32, 0x50, 0x69, 0x44, 0x52, 0x4c, 0x34, 0x53, 0x6b, 0x31, 0x49, 0x73, 0x71, 0x32, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x44, 0x70, 0x69, 0x75, 0x6e, 0x45, 0x59, 0x44, 0x55, 0x43, 0x45, 0x78, 0x62, 0x46, 0x4a, 0x67, \n\t0x34, 0x50, 0x30, 0x6d, 0x70, 0x5a, 0x41, 0x35, 0x35, 0x42, 0x50, 0x6a, 0x34, 0x66, 0x4e, 0x55, 0x6a, 0x56, \n\t0x58, 0x65, 0x4c, 0x71, 0x68, 0x49, 0x56, 0x44, 0x75, 0x64, 0x48, 0x37, 0x71, 0x65, 0x59, 0x6e, 0x45, 0x5a, \n\t0x53, 0x4f, 0x32, 0x34, 0x50, 0x54, 0x49, 0x6c, 0x6b, 0x2b, 0x63, 0x4a, 0x72, 0x77, 0x73, 0x49, 0x71, 0x5c, 0x0a,\n\t0x09, 0x30, 0x31, 0x78, 0x6e, 0x46, 0x6d, 0x2f, 0x73, 0x6a, 0x72, 0x4d, 0x77, 0x57, 0x39, 0x38, 0x70, 0x34, \n\t0x76, 0x38, 0x53, 0x33, 0x41, 0x68, 0x54, 0x53, 0x76, 0x6c, 0x4c, 0x64, 0x64, 0x44, 0x67, 0x4f, 0x70, 0x2b, \n\t0x75, 0x34, 0x54, 0x61, 0x38, 0x39, 0x77, 0x62, 0x37, 0x64, 0x6d, 0x52, 0x42, 0x67, 0x72, 0x49, 0x56, 0x68, \n\t0x76, 0x76, 0x6b, 0x6e, 0x7a, 0x4d, 0x39, 0x36, 0x76, 0x77, 0x65, 0x46, 0x35, 0x2b, 0x74, 0x52, 0x69, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x38, 0x4c, 0x79, 0x6e, 0x37, 0x6d, 0x56, 0x46, 0x44, 0x2f, 0x71, 0x36, 0x62, 0x49, 0x66, 0x73, \n\t0x67, 0x71, 0x66, 0x39, 0x6e, 0x70, 0x78, 0x6b, 0x4f, 0x56, 0x57, 0x6d, 0x69, 0x75, 0x6c, 0x6f, 0x55, 0x49, \n\t0x4b, 0x6f, 0x47, 0x69, 0x51, 0x46, 0x42, 0x43, 0x68, 0x74, 0x6e, 0x53, 0x4a, 0x41, 0x43, 0x55, 0x7a, 0x6f, \n\t0x30, 0x53, 0x47, 0x55, 0x6f, 0x4b, 0x6b, 0x41, 0x4b, 0x36, 0x37, 0x70, 0x57, 0x49, 0x47, 0x6b, 0x49, 0x5c, 0x0a,\n\t0x09, 0x52, 0x52, 0x31, 0x49, 0x59, 0x2f, 0x73, 0x49, 0x61, 0x51, 0x69, 0x53, 0x77, 0x62, 0x38, 0x51, 0x6f, \n\t0x50, 0x5a, 0x4c, 0x61, 0x4f, 0x52, 0x76, 0x6b, 0x4d, 0x52, 0x59, 0x6b, 0x4a, 0x7a, 0x70, 0x38, 0x68, 0x38, \n\t0x68, 0x4a, 0x59, 0x7a, 0x46, 0x46, 0x73, 0x41, 0x63, 0x72, 0x50, 0x4b, 0x4a, 0x65, 0x6d, 0x74, 0x67, 0x4d, \n\t0x78, 0x31, 0x57, 0x79, 0x44, 0x71, 0x74, 0x47, 0x71, 0x52, 0x67, 0x68, 0x6e, 0x53, 0x31, 0x51, 0x47, 0x5c, 0x0a,\n\t0x09, 0x49, 0x46, 0x49, 0x46, 0x56, 0x42, 0x55, 0x55, 0x70, 0x2f, 0x64, 0x48, 0x79, 0x45, 0x31, 0x49, 0x50, \n\t0x6b, 0x33, 0x68, 0x54, 0x78, 0x49, 0x47, 0x56, 0x77, 0x42, 0x53, 0x42, 0x70, 0x59, 0x6a, 0x56, 0x53, 0x39, \n\t0x75, 0x58, 0x2f, 0x38, 0x42, 0x65, 0x53, 0x46, 0x46, 0x54, 0x32, 0x44, 0x71, 0x36, 0x4a, 0x58, 0x41, 0x69, \n\t0x6b, 0x34, 0x75, 0x31, 0x39, 0x48, 0x35, 0x43, 0x79, 0x39, 0x67, 0x6f, 0x61, 0x6f, 0x6e, 0x43, 0x66, 0x5c, 0x0a,\n\t0x09, 0x77, 0x55, 0x44, 0x71, 0x71, 0x5a, 0x74, 0x4b, 0x73, 0x65, 0x46, 0x57, 0x48, 0x53, 0x53, 0x37, 0x37, \n\t0x51, 0x38, 0x53, 0x78, 0x65, 0x50, 0x6c, 0x51, 0x4e, 0x6f, 0x77, 0x48, 0x79, 0x46, 0x31, 0x76, 0x70, 0x75, \n\t0x50, 0x43, 0x33, 0x4b, 0x66, 0x74, 0x37, 0x45, 0x66, 0x67, 0x50, 0x42, 0x76, 0x6c, 0x4f, 0x54, 0x76, 0x73, \n\t0x32, 0x55, 0x67, 0x5a, 0x52, 0x72, 0x4d, 0x72, 0x51, 0x43, 0x6f, 0x33, 0x6a, 0x75, 0x59, 0x4a, 0x72, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x56, 0x76, 0x73, 0x39, 0x57, 0x56, 0x46, 0x47, 0x52, 0x65, 0x70, 0x43, 0x41, 0x37, 0x4f, 0x57, \n\t0x2b, 0x45, 0x4b, 0x54, 0x67, 0x66, 0x4b, 0x45, 0x52, 0x2b, 0x76, 0x68, 0x4e, 0x32, 0x6e, 0x4d, 0x4e, 0x61, \n\t0x77, 0x4d, 0x53, 0x64, 0x53, 0x42, 0x52, 0x41, 0x56, 0x4c, 0x45, 0x6d, 0x6f, 0x48, 0x55, 0x6b, 0x37, 0x2b, \n\t0x73, 0x45, 0x63, 0x4d, 0x36, 0x52, 0x4d, 0x57, 0x36, 0x31, 0x59, 0x70, 0x2f, 0x6e, 0x38, 0x33, 0x39, 0x5c, 0x0a,\n\t0x09, 0x55, 0x78, 0x4f, 0x41, 0x5a, 0x4d, 0x68, 0x4d, 0x6d, 0x41, 0x63, 0x70, 0x41, 0x38, 0x74, 0x72, 0x4d, \n\t0x4f, 0x36, 0x74, 0x57, 0x76, 0x61, 0x6f, 0x4d, 0x47, 0x63, 0x43, 0x63, 0x42, 0x2b, 0x49, 0x49, 0x39, 0x4c, \n\t0x4e, 0x36, 0x6c, 0x53, 0x42, 0x56, 0x4f, 0x36, 0x45, 0x51, 0x55, 0x41, 0x71, 0x6d, 0x4a, 0x41, 0x42, 0x51, \n\t0x48, 0x4c, 0x6e, 0x2b, 0x6b, 0x38, 0x78, 0x47, 0x52, 0x34, 0x41, 0x41, 0x42, 0x6e, 0x4c, 0x53, 0x55, 0x5c, 0x0a,\n\t0x09, 0x52, 0x42, 0x56, 0x49, 0x46, 0x55, 0x57, 0x66, 0x36, 0x67, 0x49, 0x47, 0x6b, 0x64, 0x53, 0x42, 0x56, \n\t0x61, 0x74, 0x51, 0x78, 0x53, 0x2b, 0x42, 0x7a, 0x72, 0x41, 0x6c, 0x49, 0x30, 0x48, 0x45, 0x67, 0x71, 0x57, \n\t0x4b, 0x33, 0x6a, 0x4a, 0x67, 0x39, 0x37, 0x51, 0x45, 0x71, 0x74, 0x47, 0x63, 0x4f, 0x2f, 0x69, 0x35, 0x5a, \n\t0x43, 0x36, 0x6d, 0x50, 0x6b, 0x42, 0x64, 0x54, 0x73, 0x71, 0x53, 0x71, 0x32, 0x7a, 0x70, 0x7a, 0x64, 0x5c, 0x0a,\n\t0x09, 0x61, 0x37, 0x64, 0x71, 0x4f, 0x30, 0x30, 0x69, 0x39, 0x34, 0x77, 0x35, 0x52, 0x45, 0x57, 0x51, 0x5a, \n\t0x50, 0x56, 0x41, 0x4b, 0x6e, 0x52, 0x6d, 0x4e, 0x55, 0x67, 0x72, 0x2b, 0x67, 0x68, 0x70, 0x6b, 0x4f, 0x2f, \n\t0x52, 0x38, 0x52, 0x48, 0x53, 0x41, 0x43, 0x51, 0x74, 0x61, 0x79, 0x52, 0x44, 0x4e, 0x6c, 0x4c, 0x7a, 0x47, \n\t0x73, 0x6c, 0x2f, 0x2b, 0x73, 0x2b, 0x57, 0x66, 0x32, 0x39, 0x56, 0x34, 0x58, 0x55, 0x65, 0x32, 0x65, 0x5c, 0x0a,\n\t0x09, 0x32, 0x32, 0x6b, 0x66, 0x78, 0x38, 0x68, 0x41, 0x64, 0x4a, 0x71, 0x6b, 0x47, 0x53, 0x45, 0x6b, 0x6a, \n\t0x5a, 0x41, 0x36, 0x30, 0x47, 0x53, 0x44, 0x4a, 0x65, 0x6b, 0x45, 0x72, 0x35, 0x78, 0x76, 0x50, 0x74, 0x79, \n\t0x44, 0x55, 0x45, 0x4b, 0x62, 0x73, 0x75, 0x37, 0x4a, 0x63, 0x42, 0x51, 0x63, 0x4b, 0x44, 0x34, 0x33, 0x30, \n\t0x6b, 0x62, 0x39, 0x4b, 0x38, 0x52, 0x6e, 0x4c, 0x44, 0x66, 0x50, 0x41, 0x67, 0x33, 0x56, 0x35, 0x30, 0x5c, 0x0a,\n\t0x09, 0x53, 0x58, 0x7a, 0x74, 0x71, 0x2b, 0x56, 0x32, 0x65, 0x36, 0x47, 0x2f, 0x75, 0x4e, 0x45, 0x66, 0x70, \n\t0x43, 0x42, 0x4e, 0x73, 0x7a, 0x6b, 0x6b, 0x38, 0x6a, 0x78, 0x6c, 0x4b, 0x4b, 0x54, 0x55, 0x4f, 0x47, 0x48, \n\t0x44, 0x75, 0x50, 0x76, 0x57, 0x67, 0x78, 0x52, 0x32, 0x44, 0x6f, 0x55, 0x4f, 0x33, 0x6c, 0x67, 0x67, 0x6b, \n\t0x59, 0x4f, 0x45, 0x79, 0x77, 0x74, 0x39, 0x51, 0x46, 0x71, 0x72, 0x6a, 0x35, 0x41, 0x53, 0x6c, 0x42, 0x5c, 0x0a,\n\t0x09, 0x65, 0x43, 0x70, 0x50, 0x54, 0x34, 0x53, 0x4e, 0x6c, 0x48, 0x53, 0x41, 0x56, 0x67, 0x44, 0x32, 0x6f, \n\t0x71, 0x33, 0x30, 0x69, 0x74, 0x67, 0x2b, 0x67, 0x49, 0x75, 0x4a, 0x66, 0x55, 0x6e, 0x46, 0x39, 0x55, 0x43, \n\t0x35, 0x49, 0x75, 0x42, 0x35, 0x4a, 0x37, 0x34, 0x42, 0x41, 0x4b, 0x72, 0x30, 0x6e, 0x43, 0x78, 0x67, 0x6b, \n\t0x62, 0x78, 0x75, 0x56, 0x5a, 0x46, 0x71, 0x53, 0x73, 0x49, 0x63, 0x6e, 0x79, 0x62, 0x58, 0x36, 0x45, 0x5c, 0x0a,\n\t0x09, 0x64, 0x4b, 0x55, 0x61, 0x79, 0x59, 0x50, 0x6b, 0x59, 0x4d, 0x71, 0x63, 0x62, 0x76, 0x6b, 0x6d, 0x43, \n\t0x6e, 0x4c, 0x70, 0x6f, 0x5a, 0x35, 0x69, 0x65, 0x69, 0x43, 0x61, 0x65, 0x75, 0x57, 0x31, 0x66, 0x76, 0x64, \n\t0x57, 0x65, 0x36, 0x4f, 0x55, 0x33, 0x4b, 0x6d, 0x75, 0x41, 0x45, 0x6d, 0x57, 0x41, 0x79, 0x6c, 0x6f, 0x33, \n\t0x47, 0x46, 0x42, 0x59, 0x6c, 0x69, 0x51, 0x62, 0x4d, 0x62, 0x56, 0x41, 0x4b, 0x6c, 0x79, 0x36, 0x44, 0x5c, 0x0a,\n\t0x09, 0x38, 0x77, 0x53, 0x42, 0x57, 0x64, 0x57, 0x66, 0x6e, 0x42, 0x69, 0x52, 0x46, 0x42, 0x4b, 0x75, 0x52, \n\t0x66, 0x43, 0x55, 0x69, 0x35, 0x73, 0x35, 0x30, 0x76, 0x64, 0x66, 0x67, 0x49, 0x42, 0x50, 0x50, 0x4e, 0x71, \n\t0x70, 0x47, 0x5a, 0x75, 0x32, 0x4f, 0x74, 0x66, 0x4d, 0x4f, 0x57, 0x6b, 0x64, 0x68, 0x73, 0x48, 0x71, 0x51, \n\t0x71, 0x48, 0x79, 0x6b, 0x41, 0x4b, 0x59, 0x64, 0x6a, 0x51, 0x4a, 0x41, 0x4b, 0x44, 0x30, 0x4f, 0x65, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x7a, 0x67, 0x2f, 0x4d, 0x45, 0x6a, 0x4f, 0x50, 0x77, 0x4b, 0x43, 0x35, 0x36, 0x30, 0x41, 0x4b, \n\t0x4d, 0x74, 0x62, 0x32, 0x76, 0x61, 0x55, 0x50, 0x54, 0x36, 0x51, 0x43, 0x76, 0x6d, 0x79, 0x35, 0x77, 0x68, \n\t0x41, 0x4b, 0x6a, 0x7a, 0x4c, 0x65, 0x6f, 0x46, 0x6b, 0x4d, 0x70, 0x44, 0x55, 0x4c, 0x37, 0x78, 0x6d, 0x65, \n\t0x66, 0x68, 0x6d, 0x33, 0x65, 0x55, 0x31, 0x6f, 0x7a, 0x4d, 0x46, 0x42, 0x78, 0x46, 0x70, 0x6e, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x73, 0x75, 0x63, 0x54, 0x42, 0x35, 0x39, 0x56, 0x73, 0x41, 0x79, 0x56, 0x5a, 0x47, 0x73, 0x6c, 0x6a, \n\t0x66, 0x41, 0x55, 0x45, 0x71, 0x6d, 0x4c, 0x43, 0x69, 0x46, 0x6e, 0x4b, 0x56, 0x64, 0x35, 0x73, 0x42, 0x51, \n\t0x41, 0x6f, 0x63, 0x37, 0x62, 0x77, 0x6a, 0x53, 0x74, 0x63, 0x55, 0x41, 0x49, 0x43, 0x78, 0x67, 0x31, 0x52, \n\t0x34, 0x6a, 0x72, 0x79, 0x7a, 0x4e, 0x39, 0x5a, 0x48, 0x53, 0x43, 0x74, 0x45, 0x68, 0x58, 0x44, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x41, 0x4d, 0x70, 0x2b, 0x38, 0x6a, 0x46, 0x73, 0x42, 0x44, 0x5a, 0x4a, 0x2f, 0x67, 0x36, 0x6b, \n\t0x48, 0x76, 0x6e, 0x58, 0x68, 0x4e, 0x6c, 0x6b, 0x34, 0x2f, 0x35, 0x73, 0x57, 0x61, 0x41, 0x4d, 0x52, 0x78, \n\t0x49, 0x6d, 0x56, 0x53, 0x42, 0x56, 0x4f, 0x70, 0x6f, 0x57, 0x51, 0x6c, 0x49, 0x70, 0x66, 0x4b, 0x7a, 0x74, \n\t0x46, 0x44, 0x6a, 0x6a, 0x51, 0x6d, 0x6b, 0x45, 0x2b, 0x59, 0x6a, 0x70, 0x42, 0x57, 0x53, 0x67, 0x65, 0x5c, 0x0a,\n\t0x09, 0x52, 0x38, 0x4a, 0x44, 0x57, 0x75, 0x7a, 0x75, 0x59, 0x34, 0x53, 0x50, 0x56, 0x48, 0x72, 0x4f, 0x6d, \n\t0x50, 0x35, 0x33, 0x64, 0x51, 0x74, 0x65, 0x2f, 0x66, 0x6d, 0x41, 0x53, 0x52, 0x52, 0x67, 0x35, 0x50, 0x41, \n\t0x61, 0x52, 0x6f, 0x64, 0x4a, 0x41, 0x4b, 0x2f, 0x73, 0x38, 0x61, 0x67, 0x75, 0x54, 0x4c, 0x36, 0x77, 0x45, \n\t0x4a, 0x31, 0x68, 0x57, 0x6b, 0x6e, 0x6d, 0x63, 0x4a, 0x66, 0x43, 0x70, 0x66, 0x74, 0x35, 0x37, 0x52, 0x5c, 0x0a,\n\t0x09, 0x32, 0x54, 0x41, 0x67, 0x68, 0x66, 0x6c, 0x71, 0x4a, 0x41, 0x53, 0x4a, 0x7a, 0x4d, 0x65, 0x38, 0x77, \n\t0x58, 0x37, 0x48, 0x57, 0x69, 0x6f, 0x76, 0x36, 0x56, 0x64, 0x69, 0x44, 0x48, 0x77, 0x4e, 0x56, 0x55, 0x69, \n\t0x37, 0x49, 0x41, 0x36, 0x4d, 0x41, 0x6b, 0x6a, 0x2b, 0x51, 0x65, 0x74, 0x41, 0x6b, 0x6d, 0x56, 0x41, 0x36, \n\t0x72, 0x4f, 0x2f, 0x48, 0x45, 0x67, 0x39, 0x44, 0x77, 0x34, 0x44, 0x67, 0x35, 0x54, 0x6c, 0x4c, 0x39, 0x5c, 0x0a,\n\t0x09, 0x32, 0x33, 0x4a, 0x37, 0x31, 0x63, 0x39, 0x6f, 0x41, 0x67, 0x77, 0x5a, 0x68, 0x41, 0x79, 0x73, 0x38, \n\t0x58, 0x51, 0x52, 0x70, 0x56, 0x49, 0x35, 0x56, 0x47, 0x68, 0x33, 0x57, 0x53, 0x67, 0x5a, 0x54, 0x4a, 0x44, \n\t0x51, 0x44, 0x52, 0x37, 0x75, 0x70, 0x76, 0x54, 0x6c, 0x57, 0x57, 0x4e, 0x76, 0x32, 0x71, 0x54, 0x2f, 0x75, \n\t0x47, 0x2f, 0x41, 0x49, 0x41, 0x38, 0x53, 0x4c, 0x65, 0x48, 0x79, 0x71, 0x43, 0x46, 0x50, 0x55, 0x48, 0x5c, 0x0a,\n\t0x09, 0x69, 0x57, 0x67, 0x5a, 0x6b, 0x43, 0x70, 0x41, 0x47, 0x52, 0x53, 0x6b, 0x73, 0x76, 0x2f, 0x55, 0x64, \n\t0x77, 0x54, 0x57, 0x44, 0x36, 0x53, 0x61, 0x44, 0x75, 0x6e, 0x78, 0x6d, 0x2f, 0x4a, 0x7a, 0x6a, 0x37, 0x79, \n\t0x50, 0x6b, 0x46, 0x5a, 0x49, 0x45, 0x61, 0x51, 0x76, 0x39, 0x73, 0x76, 0x61, 0x76, 0x79, 0x54, 0x6c, 0x65, \n\t0x67, 0x42, 0x4e, 0x63, 0x6f, 0x69, 0x4b, 0x49, 0x48, 0x6c, 0x67, 0x61, 0x6b, 0x42, 0x79, 0x74, 0x79, 0x5c, 0x0a,\n\t0x09, 0x69, 0x44, 0x78, 0x4b, 0x71, 0x44, 0x56, 0x47, 0x37, 0x49, 0x45, 0x55, 0x43, 0x71, 0x64, 0x4a, 0x7a, \n\t0x7a, 0x76, 0x49, 0x2f, 0x4d, 0x6a, 0x35, 0x43, 0x57, 0x4a, 0x41, 0x66, 0x70, 0x53, 0x2f, 0x32, 0x79, 0x4c, \n\t0x56, 0x4d, 0x4b, 0x58, 0x37, 0x54, 0x71, 0x30, 0x37, 0x68, 0x52, 0x57, 0x71, 0x35, 0x39, 0x78, 0x50, 0x38, \n\t0x65, 0x31, 0x30, 0x41, 0x67, 0x72, 0x54, 0x51, 0x36, 0x63, 0x67, 0x55, 0x67, 0x6a, 0x54, 0x30, 0x36, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x6d, 0x7a, 0x37, 0x79, 0x50, 0x77, 0x49, 0x61, 0x55, 0x6c, 0x55, 0x62, 0x6b, 0x50, 0x31, 0x51, \n\t0x4c, 0x38, 0x73, 0x79, 0x30, 0x48, 0x30, 0x49, 0x48, 0x41, 0x72, 0x36, 0x72, 0x51, 0x52, 0x51, 0x76, 0x59, \n\t0x44, 0x62, 0x74, 0x34, 0x6e, 0x47, 0x67, 0x67, 0x6b, 0x2b, 0x36, 0x44, 0x72, 0x45, 0x6d, 0x62, 0x72, 0x4e, \n\t0x65, 0x41, 0x6f, 0x49, 0x46, 0x58, 0x35, 0x4f, 0x77, 0x56, 0x59, 0x51, 0x6e, 0x6d, 0x6b, 0x68, 0x74, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x79, 0x61, 0x59, 0x44, 0x47, 0x5a, 0x58, 0x4f, 0x31, 0x47, 0x57, 0x71, 0x76, 0x6e, 0x6e, 0x35, \n\t0x31, 0x35, 0x68, 0x66, 0x5a, 0x4b, 0x65, 0x7a, 0x75, 0x50, 0x50, 0x59, 0x6e, 0x6b, 0x38, 0x68, 0x41, 0x45, \n\t0x67, 0x39, 0x4f, 0x44, 0x30, 0x67, 0x4f, 0x70, 0x6e, 0x42, 0x2b, 0x71, 0x52, 0x59, 0x6b, 0x2f, 0x2f, 0x7a, \n\t0x4c, 0x67, 0x53, 0x52, 0x72, 0x44, 0x31, 0x4b, 0x2f, 0x45, 0x5a, 0x6a, 0x62, 0x6c, 0x68, 0x65, 0x64, 0x5c, 0x0a,\n\t0x09, 0x48, 0x34, 0x48, 0x52, 0x6b, 0x5a, 0x2b, 0x71, 0x4f, 0x2b, 0x46, 0x6c, 0x4f, 0x55, 0x30, 0x45, 0x61, \n\t0x6b, 0x6e, 0x55, 0x65, 0x4e, 0x37, 0x43, 0x6b, 0x6f, 0x45, 0x55, 0x46, 0x55, 0x48, 0x4b, 0x35, 0x6f, 0x32, \n\t0x38, 0x76, 0x32, 0x53, 0x4c, 0x31, 0x39, 0x4a, 0x69, 0x62, 0x53, 0x39, 0x49, 0x33, 0x75, 0x77, 0x51, 0x35, \n\t0x50, 0x45, 0x50, 0x37, 0x47, 0x55, 0x77, 0x6b, 0x48, 0x72, 0x2b, 0x41, 0x73, 0x4d, 0x52, 0x7a, 0x70, 0x5c, 0x0a,\n\t0x09, 0x71, 0x42, 0x78, 0x48, 0x68, 0x42, 0x57, 0x6b, 0x6c, 0x30, 0x5a, 0x4f, 0x57, 0x55, 0x51, 0x48, 0x44, \n\t0x4e, 0x38, 0x74, 0x47, 0x52, 0x69, 0x74, 0x4e, 0x45, 0x2f, 0x57, 0x52, 0x35, 0x69, 0x4f, 0x41, 0x36, 0x46, \n\t0x4d, 0x57, 0x6b, 0x6b, 0x48, 0x54, 0x74, 0x4a, 0x56, 0x47, 0x6f, 0x65, 0x52, 0x78, 0x49, 0x6b, 0x54, 0x4e, \n\t0x6a, 0x51, 0x62, 0x71, 0x76, 0x2f, 0x4e, 0x69, 0x6a, 0x49, 0x32, 0x74, 0x41, 0x4f, 0x6a, 0x47, 0x69, 0x5c, 0x0a,\n\t0x09, 0x49, 0x38, 0x6e, 0x72, 0x75, 0x42, 0x59, 0x67, 0x46, 0x66, 0x4b, 0x58, 0x37, 0x77, 0x2f, 0x4c, 0x2f, \n\t0x45, 0x54, 0x37, 0x54, 0x55, 0x42, 0x66, 0x66, 0x79, 0x69, 0x6f, 0x5a, 0x56, 0x38, 0x35, 0x43, 0x4e, 0x79, \n\t0x49, 0x67, 0x6e, 0x61, 0x50, 0x4f, 0x59, 0x41, 0x38, 0x4e, 0x41, 0x46, 0x49, 0x6c, 0x45, 0x44, 0x79, 0x2f, \n\t0x70, 0x50, 0x62, 0x74, 0x38, 0x39, 0x59, 0x41, 0x56, 0x4b, 0x35, 0x45, 0x77, 0x59, 0x46, 0x71, 0x53, 0x5c, 0x0a,\n\t0x09, 0x65, 0x4e, 0x39, 0x51, 0x4f, 0x70, 0x59, 0x73, 0x52, 0x57, 0x4f, 0x41, 0x37, 0x72, 0x34, 0x34, 0x66, \n\t0x5a, 0x6c, 0x58, 0x37, 0x4c, 0x4b, 0x6f, 0x42, 0x55, 0x4e, 0x57, 0x49, 0x74, 0x6c, 0x42, 0x63, 0x2b, 0x5a, \n\t0x77, 0x39, 0x49, 0x31, 0x77, 0x49, 0x30, 0x6e, 0x6e, 0x36, 0x73, 0x58, 0x4e, 0x6d, 0x43, 0x39, 0x49, 0x56, \n\t0x6f, 0x2b, 0x6a, 0x57, 0x5a, 0x4a, 0x76, 0x73, 0x48, 0x41, 0x42, 0x61, 0x50, 0x32, 0x70, 0x6e, 0x72, 0x5c, 0x0a,\n\t0x09, 0x79, 0x50, 0x39, 0x79, 0x63, 0x67, 0x42, 0x53, 0x35, 0x45, 0x44, 0x79, 0x70, 0x69, 0x32, 0x62, 0x41, \n\t0x67, 0x68, 0x58, 0x2f, 0x6d, 0x46, 0x64, 0x6f, 0x69, 0x4f, 0x44, 0x63, 0x2f, 0x31, 0x41, 0x71, 0x69, 0x78, \n\t0x2f, 0x62, 0x43, 0x43, 0x46, 0x64, 0x51, 0x78, 0x41, 0x4b, 0x6a, 0x2f, 0x48, 0x65, 0x6f, 0x43, 0x55, 0x7a, \n\t0x53, 0x48, 0x35, 0x63, 0x78, 0x6c, 0x49, 0x6e, 0x36, 0x70, 0x73, 0x78, 0x35, 0x49, 0x4d, 0x6f, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x41, 0x50, 0x67, 0x61, 0x67, 0x33, 0x58, 0x6c, 0x51, 0x2b, 0x6f, 0x50, 0x6b, 0x6f, 0x51, 0x6c, \n\t0x42, 0x57, 0x69, 0x36, 0x6f, 0x62, 0x63, 0x33, 0x44, 0x62, 0x4b, 0x55, 0x53, 0x70, 0x45, 0x64, 0x74, 0x6d, \n\t0x47, 0x31, 0x32, 0x58, 0x64, 0x67, 0x76, 0x30, 0x53, 0x4c, 0x4b, 0x5a, 0x78, 0x68, 0x41, 0x42, 0x6f, 0x58, \n\t0x6f, 0x61, 0x38, 0x42, 0x44, 0x6f, 0x47, 0x68, 0x33, 0x7a, 0x70, 0x71, 0x76, 0x53, 0x70, 0x42, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x53, 0x43, 0x74, 0x57, 0x5a, 0x68, 0x74, 0x30, 0x44, 0x6b, 0x62, 0x4f, 0x73, 0x79, 0x57, 0x48, \n\t0x43, 0x52, 0x63, 0x58, 0x75, 0x67, 0x44, 0x30, 0x6c, 0x69, 0x6a, 0x49, 0x36, 0x2b, 0x44, 0x61, 0x49, 0x45, \n\t0x42, 0x5a, 0x46, 0x43, 0x49, 0x44, 0x48, 0x41, 0x4e, 0x67, 0x43, 0x34, 0x63, 0x74, 0x76, 0x43, 0x45, 0x49, \n\t0x49, 0x6b, 0x48, 0x79, 0x5a, 0x6d, 0x7a, 0x4b, 0x43, 0x71, 0x43, 0x78, 0x44, 0x49, 0x67, 0x75, 0x59, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x50, 0x46, 0x52, 0x30, 0x4a, 0x50, 0x50, 0x4c, 0x44, 0x62, 0x4b, 0x50, 0x67, 0x75, 0x6b, 0x46, \n\t0x41, 0x38, 0x6d, 0x30, 0x58, 0x6c, 0x44, 0x6b, 0x6f, 0x53, 0x4c, 0x30, 0x4c, 0x74, 0x74, 0x65, 0x67, 0x45, \n\t0x59, 0x31, 0x6e, 0x39, 0x50, 0x65, 0x48, 0x67, 0x68, 0x72, 0x56, 0x79, 0x2f, 0x52, 0x72, 0x50, 0x75, 0x31, \n\t0x48, 0x47, 0x68, 0x38, 0x47, 0x30, 0x49, 0x56, 0x44, 0x39, 0x73, 0x59, 0x68, 0x53, 0x4e, 0x6b, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x44, 0x31, 0x4a, 0x55, 0x42, 0x45, 0x6d, 0x57, 0x30, 0x55, 0x69, 0x50, 0x6b, 0x75, 0x6a, 0x49, 0x6e, \n\t0x75, 0x73, 0x4b, 0x78, 0x34, 0x4f, 0x41, 0x35, 0x42, 0x39, 0x67, 0x46, 0x55, 0x41, 0x71, 0x35, 0x49, 0x39, \n\t0x41, 0x35, 0x52, 0x6f, 0x47, 0x6c, 0x45, 0x45, 0x31, 0x45, 0x61, 0x70, 0x38, 0x45, 0x6a, 0x69, 0x4b, 0x47, \n\t0x6e, 0x54, 0x70, 0x4b, 0x49, 0x52, 0x61, 0x79, 0x41, 0x2f, 0x70, 0x6f, 0x7a, 0x34, 0x67, 0x68, 0x61, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x74, 0x33, 0x4e, 0x47, 0x52, 0x2f, 0x55, 0x44, 0x79, 0x30, 0x77, 0x69, 0x50, 0x71, 0x4f, 0x6a, \n\t0x49, 0x38, 0x44, 0x6b, 0x71, 0x35, 0x70, 0x31, 0x57, 0x44, 0x74, 0x4b, 0x33, 0x30, 0x47, 0x68, 0x50, 0x2b, \n\t0x59, 0x2b, 0x78, 0x54, 0x67, 0x61, 0x47, 0x43, 0x46, 0x68, 0x53, 0x74, 0x61, 0x4d, 0x30, 0x6e, 0x54, 0x38, \n\t0x51, 0x6d, 0x4c, 0x45, 0x47, 0x49, 0x73, 0x30, 0x63, 0x6e, 0x6b, 0x46, 0x41, 0x38, 0x74, 0x47, 0x52, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x53, 0x41, 0x4e, 0x48, 0x52, 0x31, 0x5a, 0x42, 0x51, 0x64, 0x42, 0x2f, 0x6d, 0x46, 0x41, 0x71, \n\t0x68, 0x7a, 0x36, 0x68, 0x32, 0x58, 0x56, 0x41, 0x54, 0x42, 0x47, 0x6b, 0x41, 0x72, 0x50, 0x6b, 0x58, 0x66, \n\t0x32, 0x47, 0x6b, 0x5a, 0x48, 0x58, 0x6f, 0x4d, 0x4b, 0x6a, 0x57, 0x66, 0x32, 0x42, 0x75, 0x56, 0x58, 0x79, \n\t0x55, 0x41, 0x51, 0x7a, 0x62, 0x77, 0x32, 0x47, 0x2b, 0x70, 0x2f, 0x51, 0x42, 0x56, 0x30, 0x2f, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x42, 0x52, 0x45, 0x30, 0x55, 0x4e, 0x2b, 0x2b, 0x33, 0x6b, 0x62, 0x41, 0x34, 0x70, 0x41, 0x41, 0x6b, \n\t0x70, 0x67, 0x53, 0x52, 0x46, 0x6b, 0x43, 0x69, 0x44, 0x78, 0x48, 0x41, 0x67, 0x5a, 0x52, 0x4c, 0x73, 0x6c, \n\t0x30, 0x63, 0x37, 0x6b, 0x49, 0x4e, 0x55, 0x2f, 0x6d, 0x73, 0x65, 0x43, 0x71, 0x54, 0x67, 0x6d, 0x67, 0x49, \n\t0x41, 0x4d, 0x46, 0x61, 0x51, 0x56, 0x68, 0x49, 0x64, 0x57, 0x51, 0x44, 0x4a, 0x6d, 0x30, 0x4b, 0x58, 0x5c, 0x0a,\n\t0x09, 0x64, 0x33, 0x43, 0x51, 0x50, 0x6a, 0x4b, 0x6f, 0x46, 0x67, 0x70, 0x72, 0x4d, 0x61, 0x68, 0x63, 0x41, \n\t0x78, 0x7a, 0x56, 0x4e, 0x48, 0x48, 0x61, 0x71, 0x4a, 0x57, 0x44, 0x52, 0x46, 0x51, 0x45, 0x4b, 0x56, 0x76, \n\t0x78, 0x39, 0x37, 0x50, 0x62, 0x45, 0x6b, 0x52, 0x48, 0x65, 0x6d, 0x41, 0x43, 0x30, 0x44, 0x61, 0x6a, 0x49, \n\t0x2f, 0x50, 0x36, 0x72, 0x68, 0x53, 0x6b, 0x77, 0x72, 0x4f, 0x45, 0x49, 0x4e, 0x46, 0x37, 0x72, 0x30, 0x5c, 0x0a,\n\t0x09, 0x49, 0x64, 0x49, 0x34, 0x41, 0x48, 0x51, 0x50, 0x71, 0x47, 0x66, 0x70, 0x52, 0x6c, 0x4f, 0x49, 0x69, \n\t0x55, 0x52, 0x65, 0x42, 0x39, 0x41, 0x47, 0x62, 0x75, 0x49, 0x53, 0x52, 0x79, 0x32, 0x69, 0x68, 0x71, 0x59, \n\t0x44, 0x2f, 0x7a, 0x48, 0x78, 0x56, 0x48, 0x62, 0x4f, 0x45, 0x43, 0x62, 0x53, 0x47, 0x45, 0x4a, 0x42, 0x6a, \n\t0x4a, 0x72, 0x57, 0x64, 0x30, 0x5a, 0x43, 0x31, 0x49, 0x77, 0x48, 0x49, 0x67, 0x5a, 0x66, 0x6c, 0x39, 0x5c, 0x0a,\n\t0x09, 0x57, 0x6c, 0x31, 0x36, 0x62, 0x39, 0x6b, 0x62, 0x50, 0x44, 0x72, 0x79, 0x37, 0x31, 0x43, 0x70, 0x2b, \n\t0x67, 0x4a, 0x37, 0x72, 0x51, 0x77, 0x4d, 0x55, 0x57, 0x62, 0x53, 0x6c, 0x50, 0x63, 0x43, 0x36, 0x50, 0x78, \n\t0x2b, 0x56, 0x41, 0x33, 0x69, 0x74, 0x5a, 0x45, 0x48, 0x4b, 0x52, 0x75, 0x78, 0x4f, 0x53, 0x31, 0x55, 0x48, \n\t0x71, 0x46, 0x74, 0x70, 0x4f, 0x6a, 0x49, 0x48, 0x73, 0x32, 0x79, 0x45, 0x70, 0x44, 0x36, 0x70, 0x66, 0x5c, 0x0a,\n\t0x09, 0x65, 0x57, 0x76, 0x59, 0x47, 0x6a, 0x49, 0x7a, 0x2b, 0x49, 0x43, 0x6f, 0x33, 0x4c, 0x48, 0x32, 0x5a, \n\t0x51, 0x47, 0x64, 0x61, 0x63, 0x41, 0x58, 0x77, 0x57, 0x74, 0x5a, 0x38, 0x59, 0x4d, 0x58, 0x4d, 0x50, 0x6f, \n\t0x74, 0x49, 0x6f, 0x67, 0x65, 0x53, 0x47, 0x2f, 0x6c, 0x47, 0x7a, 0x61, 0x4e, 0x49, 0x43, 0x69, 0x45, 0x36, \n\t0x4d, 0x36, 0x4d, 0x68, 0x68, 0x51, 0x61, 0x72, 0x35, 0x79, 0x2b, 0x37, 0x78, 0x6d, 0x39, 0x67, 0x59, 0x5c, 0x0a,\n\t0x09, 0x49, 0x46, 0x58, 0x35, 0x52, 0x33, 0x41, 0x49, 0x6c, 0x63, 0x38, 0x79, 0x70, 0x49, 0x77, 0x43, 0x6b, \n\t0x51, 0x48, 0x65, 0x69, 0x34, 0x49, 0x65, 0x76, 0x52, 0x2b, 0x69, 0x5a, 0x67, 0x6d, 0x6b, 0x5a, 0x67, 0x6d, \n\t0x6b, 0x55, 0x43, 0x74, 0x56, 0x67, 0x54, 0x52, 0x6f, 0x64, 0x47, 0x51, 0x52, 0x70, 0x4c, 0x57, 0x4a, 0x6a, \n\t0x68, 0x77, 0x44, 0x53, 0x4a, 0x55, 0x6a, 0x4d, 0x4c, 0x4c, 0x74, 0x42, 0x6f, 0x75, 0x4f, 0x2f, 0x41, 0x5c, 0x0a,\n\t0x09, 0x67, 0x51, 0x44, 0x32, 0x50, 0x4b, 0x77, 0x6a, 0x73, 0x4f, 0x4a, 0x44, 0x4d, 0x2f, 0x6d, 0x34, 0x33, \n\t0x53, 0x33, 0x67, 0x4f, 0x67, 0x38, 0x34, 0x63, 0x68, 0x57, 0x63, 0x78, 0x41, 0x79, 0x6b, 0x5a, 0x73, 0x47, \n\t0x55, 0x68, 0x52, 0x43, 0x61, 0x53, 0x79, 0x5a, 0x6c, 0x72, 0x72, 0x4d, 0x4e, 0x75, 0x61, 0x74, 0x45, 0x46, \n\t0x41, 0x47, 0x6e, 0x75, 0x59, 0x72, 0x59, 0x77, 0x48, 0x4a, 0x41, 0x66, 0x41, 0x6d, 0x4b, 0x49, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x50, 0x34, 0x51, 0x4b, 0x6a, 0x65, 0x63, 0x38, 0x77, 0x44, 0x41, 0x79, 0x69, 0x69, 0x59, 0x43, 0x35, \n\t0x54, 0x76, 0x41, 0x56, 0x77, 0x44, 0x4d, 0x6f, 0x58, 0x76, 0x64, 0x71, 0x4b, 0x78, 0x70, 0x52, 0x32, 0x73, \n\t0x5a, 0x54, 0x43, 0x34, 0x74, 0x31, 0x44, 0x6a, 0x5a, 0x36, 0x41, 0x79, 0x4b, 0x2f, 0x70, 0x4a, 0x55, 0x67, \n\t0x4f, 0x52, 0x67, 0x32, 0x68, 0x44, 0x52, 0x6b, 0x66, 0x6e, 0x39, 0x52, 0x67, 0x4b, 0x70, 0x79, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x45, 0x75, 0x67, 0x52, 0x54, 0x57, 0x64, 0x61, 0x31, 0x41, 0x4b, 0x67, 0x33, 0x39, 0x44, 0x36, 0x50, \n\t0x79, 0x54, 0x2b, 0x58, 0x61, 0x44, 0x43, 0x4a, 0x44, 0x51, 0x35, 0x52, 0x70, 0x49, 0x2b, 0x56, 0x2f, 0x41, \n\t0x35, 0x68, 0x44, 0x65, 0x33, 0x4b, 0x4e, 0x34, 0x30, 0x48, 0x4b, 0x52, 0x6d, 0x63, 0x35, 0x54, 0x42, 0x4a, \n\t0x71, 0x6f, 0x64, 0x57, 0x49, 0x6a, 0x71, 0x77, 0x43, 0x71, 0x64, 0x42, 0x42, 0x67, 0x34, 0x48, 0x55, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x79, 0x4e, 0x63, 0x75, 0x75, 0x35, 0x45, 0x6a, 0x49, 0x36, 0x73, 0x75, 0x37, 0x34, 0x49, 0x30, \n\t0x6f, 0x64, 0x51, 0x57, 0x52, 0x72, 0x57, 0x6c, 0x49, 0x56, 0x33, 0x47, 0x55, 0x58, 0x2b, 0x42, 0x75, 0x55, \n\t0x49, 0x61, 0x52, 0x64, 0x7a, 0x35, 0x48, 0x76, 0x51, 0x61, 0x47, 0x55, 0x67, 0x5a, 0x66, 0x4e, 0x46, 0x6d, \n\t0x53, 0x6c, 0x72, 0x4f, 0x4a, 0x43, 0x43, 0x53, 0x63, 0x68, 0x78, 0x52, 0x6b, 0x66, 0x57, 0x68, 0x64, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x4f, 0x50, 0x54, 0x70, 0x79, 0x72, 0x55, 0x43, 0x79, 0x32, 0x7a, 0x57, 0x4f, 0x6a, 0x6e, 0x79, \n\t0x2f, 0x71, 0x74, 0x42, 0x34, 0x37, 0x76, 0x63, 0x59, 0x56, 0x6c, 0x59, 0x43, 0x30, 0x54, 0x7a, 0x77, 0x62, \n\t0x68, 0x54, 0x4d, 0x77, 0x54, 0x74, 0x7a, 0x6a, 0x52, 0x4d, 0x31, 0x30, 0x61, 0x68, 0x56, 0x42, 0x4d, 0x6e, \n\t0x44, 0x35, 0x45, 0x45, 0x4b, 0x5a, 0x37, 0x59, 0x48, 0x41, 0x73, 0x6b, 0x31, 0x7a, 0x72, 0x6a, 0x44, 0x5c, 0x0a,\n\t0x09, 0x62, 0x48, 0x76, 0x53, 0x73, 0x4a, 0x31, 0x5a, 0x5a, 0x57, 0x62, 0x57, 0x41, 0x69, 0x53, 0x71, 0x51, \n\t0x41, 0x71, 0x68, 0x43, 0x63, 0x75, 0x4d, 0x78, 0x67, 0x6e, 0x53, 0x50, 0x6c, 0x55, 0x2b, 0x4e, 0x59, 0x6f, \n\t0x57, 0x43, 0x6b, 0x6f, 0x66, 0x54, 0x6d, 0x5a, 0x65, 0x6c, 0x7a, 0x6e, 0x59, 0x2f, 0x77, 0x64, 0x41, 0x6a, \n\t0x78, 0x31, 0x41, 0x6c, 0x2b, 0x61, 0x67, 0x30, 0x56, 0x6f, 0x65, 0x70, 0x45, 0x49, 0x73, 0x6b, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x63, 0x6d, 0x41, 0x49, 0x6b, 0x53, 0x53, 0x45, 0x67, 0x52, 0x4a, 0x4b, 0x67, 0x47, 0x71, 0x64, 0x7a, \n\t0x6f, 0x67, 0x34, 0x42, 0x55, 0x4d, 0x43, 0x45, 0x44, 0x67, 0x4f, 0x54, 0x4f, 0x39, 0x51, 0x4f, 0x70, 0x73, \n\t0x76, 0x78, 0x42, 0x51, 0x61, 0x6f, 0x59, 0x2b, 0x68, 0x65, 0x4f, 0x65, 0x2b, 0x61, 0x64, 0x6f, 0x6f, 0x6f, \n\t0x36, 0x6a, 0x67, 0x54, 0x53, 0x68, 0x39, 0x42, 0x6f, 0x2b, 0x46, 0x39, 0x64, 0x64, 0x72, 0x49, 0x53, 0x5c, 0x0a,\n\t0x09, 0x54, 0x51, 0x54, 0x77, 0x48, 0x62, 0x44, 0x52, 0x62, 0x32, 0x62, 0x66, 0x37, 0x64, 0x42, 0x6f, 0x42, \n\t0x79, 0x41, 0x31, 0x53, 0x69, 0x41, 0x56, 0x59, 0x54, 0x6f, 0x68, 0x77, 0x6d, 0x7a, 0x4c, 0x49, 0x4a, 0x57, \n\t0x31, 0x51, 0x67, 0x56, 0x49, 0x4a, 0x32, 0x68, 0x30, 0x35, 0x4e, 0x2b, 0x41, 0x30, 0x4c, 0x7a, 0x79, 0x58, \n\t0x6b, 0x61, 0x52, 0x6b, 0x53, 0x45, 0x4b, 0x74, 0x4a, 0x46, 0x31, 0x73, 0x41, 0x2f, 0x63, 0x42, 0x57, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x69, 0x49, 0x57, 0x6d, 0x30, 0x49, 0x47, 0x70, 0x5a, 0x6b, 0x50, 0x78, 0x38, 0x55, 0x54, 0x44, \n\t0x73, 0x37, 0x77, 0x2b, 0x53, 0x73, 0x4c, 0x37, 0x52, 0x6b, 0x59, 0x45, 0x73, 0x43, 0x78, 0x4c, 0x6a, 0x42, \n\t0x61, 0x6e, 0x50, 0x72, 0x48, 0x5a, 0x32, 0x58, 0x47, 0x6b, 0x4b, 0x79, 0x79, 0x43, 0x46, 0x35, 0x53, 0x77, \n\t0x4c, 0x30, 0x6c, 0x37, 0x67, 0x73, 0x36, 0x4f, 0x61, 0x73, 0x71, 0x44, 0x45, 0x46, 0x63, 0x6b, 0x48, 0x5c, 0x0a,\n\t0x09, 0x67, 0x66, 0x73, 0x77, 0x43, 0x57, 0x62, 0x66, 0x72, 0x55, 0x6a, 0x55, 0x7a, 0x6a, 0x56, 0x4f, 0x31, \n\t0x45, 0x49, 0x61, 0x4c, 0x51, 0x75, 0x53, 0x48, 0x36, 0x6b, 0x31, 0x57, 0x70, 0x6e, 0x47, 0x71, 0x51, 0x62, \n\t0x4a, 0x61, 0x61, 0x47, 0x78, 0x52, 0x30, 0x66, 0x57, 0x67, 0x46, 0x51, 0x5a, 0x69, 0x78, 0x52, 0x49, 0x58, \n\t0x35, 0x41, 0x71, 0x67, 0x4b, 0x72, 0x54, 0x48, 0x4f, 0x73, 0x4b, 0x45, 0x6a, 0x6c, 0x49, 0x75, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x67, 0x51, 0x58, 0x6f, 0x50, 0x57, 0x76, 0x74, 0x7a, 0x52, 0x51, 0x50, 0x4a, 0x4f, 0x43, 0x43, \n\t0x4b, 0x67, 0x64, 0x38, 0x48, 0x53, 0x42, 0x2f, 0x38, 0x4e, 0x6f, 0x68, 0x59, 0x6b, 0x4a, 0x78, 0x5a, 0x49, \n\t0x32, 0x70, 0x61, 0x6b, 0x4c, 0x4c, 0x52, 0x57, 0x63, 0x4f, 0x42, 0x31, 0x4f, 0x67, 0x46, 0x61, 0x62, 0x6e, \n\t0x6f, 0x79, 0x48, 0x34, 0x67, 0x4c, 0x52, 0x73, 0x64, 0x36, 0x61, 0x55, 0x45, 0x6b, 0x74, 0x63, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x73, 0x44, 0x4b, 0x51, 0x73, 0x6b, 0x36, 0x44, 0x45, 0x79, 0x77, 0x36, 0x38, 0x76, 0x2b, 0x69, 0x51, \n\t0x76, 0x4e, 0x35, 0x64, 0x31, 0x55, 0x2f, 0x2b, 0x77, 0x43, 0x79, 0x49, 0x6f, 0x67, 0x43, 0x6b, 0x33, 0x59, \n\t0x31, 0x63, 0x4a, 0x52, 0x6b, 0x45, 0x58, 0x50, 0x67, 0x54, 0x6d, 0x67, 0x30, 0x41, 0x35, 0x42, 0x61, 0x52, \n\t0x5a, 0x43, 0x38, 0x67, 0x31, 0x30, 0x46, 0x30, 0x6e, 0x4c, 0x52, 0x6b, 0x57, 0x73, 0x65, 0x5a, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x75, 0x55, 0x77, 0x55, 0x47, 0x53, 0x56, 0x51, 0x56, 0x70, 0x6a, 0x4e, 0x47, 0x52, 0x58, 0x77, 0x46, \n\t0x75, 0x57, 0x59, 0x6b, 0x70, 0x63, 0x33, 0x63, 0x63, 0x67, 0x79, 0x68, 0x48, 0x73, 0x53, 0x43, 0x52, 0x33, \n\t0x76, 0x38, 0x4e, 0x35, 0x32, 0x41, 0x37, 0x59, 0x41, 0x4b, 0x51, 0x69, 0x4a, 0x70, 0x46, 0x6b, 0x4b, 0x4a, \n\t0x47, 0x63, 0x62, 0x76, 0x65, 0x59, 0x62, 0x5a, 0x55, 0x37, 0x4a, 0x66, 0x53, 0x42, 0x67, 0x61, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x45, 0x43, 0x53, 0x4b, 0x35, 0x2f, 0x70, 0x70, 0x6c, 0x6c, 0x55, 0x47, 0x71, 0x65, 0x51, 0x66, 0x57, \n\t0x53, 0x33, 0x30, 0x2f, 0x4e, 0x73, 0x72, 0x48, 0x6e, 0x68, 0x77, 0x57, 0x54, 0x46, 0x45, 0x6d, 0x54, 0x5a, \n\t0x53, 0x66, 0x68, 0x2b, 0x49, 0x64, 0x65, 0x47, 0x77, 0x6e, 0x63, 0x56, 0x75, 0x64, 0x71, 0x44, 0x52, 0x4c, \n\t0x73, 0x78, 0x6b, 0x69, 0x7a, 0x4e, 0x78, 0x6d, 0x6b, 0x56, 0x43, 0x74, 0x67, 0x6f, 0x67, 0x31, 0x59, 0x5c, 0x0a,\n\t0x09, 0x62, 0x5a, 0x49, 0x71, 0x78, 0x71, 0x64, 0x47, 0x54, 0x4e, 0x78, 0x47, 0x4f, 0x50, 0x44, 0x41, 0x4e, \n\t0x53, 0x35, 0x52, 0x78, 0x53, 0x36, 0x5a, 0x6f, 0x43, 0x41, 0x49, 0x77, 0x66, 0x70, 0x48, 0x4b, 0x64, 0x49, \n\t0x41, 0x53, 0x70, 0x69, 0x2f, 0x49, 0x33, 0x4b, 0x39, 0x56, 0x43, 0x77, 0x5a, 0x33, 0x47, 0x49, 0x76, 0x65, \n\t0x68, 0x2f, 0x44, 0x57, 0x41, 0x75, 0x65, 0x2b, 0x72, 0x4f, 0x53, 0x53, 0x4e, 0x64, 0x67, 0x59, 0x50, 0x5c, 0x0a,\n\t0x09, 0x30, 0x6e, 0x54, 0x37, 0x4c, 0x51, 0x64, 0x53, 0x6f, 0x77, 0x69, 0x53, 0x72, 0x46, 0x4e, 0x30, 0x70, \n\t0x4e, 0x54, 0x41, 0x73, 0x79, 0x6f, 0x67, 0x53, 0x66, 0x47, 0x61, 0x4c, 0x4d, 0x31, 0x66, 0x58, 0x37, 0x71, \n\t0x32, 0x6f, 0x75, 0x77, 0x78, 0x52, 0x55, 0x64, 0x2b, 0x55, 0x46, 0x58, 0x32, 0x56, 0x7a, 0x7a, 0x68, 0x30, \n\t0x44, 0x49, 0x57, 0x69, 0x47, 0x5a, 0x2b, 0x4c, 0x76, 0x4f, 0x4e, 0x66, 0x68, 0x4e, 0x46, 0x7a, 0x64, 0x5c, 0x0a,\n\t0x09, 0x48, 0x37, 0x37, 0x63, 0x4a, 0x73, 0x73, 0x2b, 0x30, 0x67, 0x63, 0x56, 0x71, 0x6f, 0x30, 0x62, 0x49, \n\t0x67, 0x4f, 0x58, 0x67, 0x30, 0x38, 0x76, 0x73, 0x72, 0x6a, 0x59, 0x37, 0x30, 0x49, 0x45, 0x57, 0x6a, 0x67, \n\t0x31, 0x53, 0x6e, 0x68, 0x56, 0x59, 0x62, 0x70, 0x4b, 0x79, 0x38, 0x4d, 0x6b, 0x69, 0x73, 0x4e, 0x6b, 0x68, \n\t0x58, 0x6f, 0x78, 0x48, 0x4e, 0x48, 0x37, 0x71, 0x31, 0x34, 0x67, 0x47, 0x48, 0x6b, 0x33, 0x46, 0x71, 0x5c, 0x0a,\n\t0x09, 0x49, 0x72, 0x43, 0x54, 0x6a, 0x2b, 0x39, 0x44, 0x49, 0x62, 0x6e, 0x6e, 0x43, 0x33, 0x59, 0x39, 0x72, \n\t0x64, 0x6d, 0x32, 0x50, 0x6c, 0x4c, 0x55, 0x51, 0x68, 0x72, 0x65, 0x52, 0x32, 0x71, 0x58, 0x51, 0x4b, 0x71, \n\t0x4a, 0x6a, 0x67, 0x77, 0x58, 0x63, 0x67, 0x73, 0x67, 0x6c, 0x61, 0x4d, 0x6a, 0x76, 0x54, 0x62, 0x70, 0x42, \n\t0x39, 0x4a, 0x79, 0x50, 0x70, 0x4c, 0x66, 0x4c, 0x33, 0x56, 0x6b, 0x65, 0x62, 0x2b, 0x55, 0x74, 0x71, 0x5c, 0x0a,\n\t0x09, 0x47, 0x6a, 0x49, 0x38, 0x74, 0x4f, 0x64, 0x5a, 0x37, 0x2f, 0x4e, 0x75, 0x41, 0x7a, 0x34, 0x7a, 0x42, \n\t0x6c, 0x4d, 0x45, 0x61, 0x49, 0x41, 0x6d, 0x33, 0x30, 0x33, 0x77, 0x48, 0x56, 0x6f, 0x77, 0x39, 0x69, 0x44, \n\t0x74, 0x35, 0x54, 0x41, 0x71, 0x6e, 0x64, 0x43, 0x35, 0x49, 0x30, 0x2b, 0x6f, 0x4f, 0x30, 0x31, 0x6d, 0x47, \n\t0x32, 0x64, 0x66, 0x44, 0x30, 0x41, 0x36, 0x6c, 0x79, 0x74, 0x70, 0x67, 0x52, 0x51, 0x43, 0x70, 0x33, 0x5c, 0x0a,\n\t0x09, 0x66, 0x75, 0x6b, 0x34, 0x72, 0x4d, 0x65, 0x67, 0x49, 0x47, 0x6b, 0x6c, 0x53, 0x46, 0x65, 0x6a, 0x55, \n\t0x76, 0x56, 0x45, 0x49, 0x38, 0x6d, 0x34, 0x4e, 0x52, 0x47, 0x71, 0x54, 0x68, 0x73, 0x42, 0x79, 0x56, 0x32, \n\t0x66, 0x63, 0x77, 0x36, 0x32, 0x4d, 0x32, 0x55, 0x68, 0x53, 0x46, 0x48, 0x44, 0x37, 0x64, 0x75, 0x68, 0x2f, \n\t0x6f, 0x59, 0x4b, 0x73, 0x39, 0x31, 0x6f, 0x49, 0x46, 0x55, 0x36, 0x7a, 0x6f, 0x77, 0x4b, 0x55, 0x68, 0x5c, 0x0a,\n\t0x09, 0x65, 0x56, 0x64, 0x77, 0x4f, 0x30, 0x58, 0x76, 0x44, 0x74, 0x69, 0x67, 0x63, 0x61, 0x58, 0x73, 0x59, \n\t0x4b, 0x6b, 0x64, 0x64, 0x47, 0x71, 0x6c, 0x34, 0x62, 0x50, 0x59, 0x44, 0x5a, 0x66, 0x79, 0x63, 0x30, 0x4f, \n\t0x30, 0x34, 0x62, 0x74, 0x61, 0x44, 0x52, 0x74, 0x50, 0x41, 0x30, 0x32, 0x35, 0x6e, 0x57, 0x79, 0x55, 0x5a, \n\t0x74, 0x51, 0x30, 0x56, 0x48, 0x35, 0x74, 0x70, 0x6e, 0x76, 0x4e, 0x47, 0x52, 0x54, 0x6c, 0x59, 0x44, 0x5c, 0x0a,\n\t0x09, 0x70, 0x4c, 0x46, 0x48, 0x52, 0x31, 0x62, 0x64, 0x65, 0x31, 0x6d, 0x51, 0x2f, 0x68, 0x61, 0x56, 0x2f, \n\t0x65, 0x4d, 0x79, 0x5a, 0x62, 0x41, 0x4b, 0x6d, 0x73, 0x6a, 0x4a, 0x64, 0x31, 0x54, 0x35, 0x4b, 0x34, 0x44, \n\t0x6b, 0x39, 0x75, 0x75, 0x63, 0x68, 0x76, 0x46, 0x6d, 0x72, 0x57, 0x4e, 0x42, 0x6b, 0x6d, 0x62, 0x67, 0x65, \n\t0x50, 0x73, 0x59, 0x70, 0x47, 0x47, 0x69, 0x49, 0x34, 0x57, 0x69, 0x6d, 0x5a, 0x4d, 0x42, 0x51, 0x62, 0x5c, 0x0a,\n\t0x09, 0x49, 0x61, 0x70, 0x78, 0x36, 0x6b, 0x59, 0x41, 0x56, 0x67, 0x33, 0x43, 0x42, 0x35, 0x44, 0x54, 0x67, \n\t0x4b, 0x53, 0x4c, 0x56, 0x44, 0x65, 0x61, 0x6d, 0x6f, 0x54, 0x31, 0x2b, 0x51, 0x33, 0x67, 0x46, 0x43, 0x36, \n\t0x30, 0x64, 0x71, 0x66, 0x36, 0x70, 0x6a, 0x61, 0x42, 0x6b, 0x37, 0x52, 0x4c, 0x4f, 0x76, 0x7a, 0x33, 0x79, \n\t0x6a, 0x74, 0x36, 0x71, 0x53, 0x36, 0x74, 0x79, 0x44, 0x70, 0x41, 0x2f, 0x63, 0x6a, 0x44, 0x51, 0x37, 0x5c, 0x0a,\n\t0x09, 0x67, 0x58, 0x50, 0x64, 0x67, 0x57, 0x59, 0x62, 0x4a, 0x4a, 0x69, 0x4d, 0x44, 0x49, 0x4c, 0x61, 0x2b, \n\t0x6b, 0x64, 0x48, 0x42, 0x74, 0x6f, 0x4b, 0x73, 0x75, 0x4f, 0x78, 0x66, 0x49, 0x54, 0x55, 0x51, 0x4d, 0x2b, \n\t0x45, 0x7a, 0x6b, 0x59, 0x42, 0x71, 0x65, 0x2b, 0x63, 0x6b, 0x4e, 0x30, 0x4f, 0x38, 0x42, 0x48, 0x53, 0x7a, \n\t0x36, 0x48, 0x79, 0x74, 0x59, 0x71, 0x61, 0x72, 0x30, 0x68, 0x57, 0x53, 0x78, 0x4d, 0x42, 0x33, 0x41, 0x5c, 0x0a,\n\t0x09, 0x48, 0x38, 0x69, 0x53, 0x6f, 0x6b, 0x74, 0x2f, 0x36, 0x54, 0x31, 0x53, 0x62, 0x4e, 0x44, 0x6a, 0x51, \n\t0x36, 0x42, 0x5a, 0x44, 0x45, 0x41, 0x56, 0x51, 0x4c, 0x55, 0x68, 0x44, 0x51, 0x74, 0x76, 0x70, 0x68, 0x74, \n\t0x6a, 0x57, 0x2b, 0x35, 0x67, 0x67, 0x67, 0x39, 0x5a, 0x77, 0x72, 0x41, 0x37, 0x45, 0x2b, 0x59, 0x62, 0x62, \n\t0x76, 0x51, 0x4b, 0x48, 0x31, 0x77, 0x70, 0x75, 0x71, 0x6e, 0x33, 0x4e, 0x45, 0x57, 0x52, 0x57, 0x49, 0x5c, 0x0a,\n\t0x09, 0x63, 0x6d, 0x30, 0x6b, 0x76, 0x77, 0x72, 0x4d, 0x6d, 0x59, 0x57, 0x6a, 0x31, 0x73, 0x6c, 0x75, 0x74, \n\t0x49, 0x73, 0x67, 0x52, 0x61, 0x30, 0x53, 0x53, 0x4d, 0x33, 0x31, 0x44, 0x62, 0x4e, 0x56, 0x30, 0x7a, 0x75, \n\t0x7a, 0x37, 0x47, 0x55, 0x35, 0x65, 0x45, 0x70, 0x35, 0x4e, 0x31, 0x5a, 0x30, 0x4a, 0x41, 0x44, 0x33, 0x4d, \n\t0x4f, 0x51, 0x37, 0x39, 0x6f, 0x50, 0x4b, 0x4b, 0x6d, 0x6f, 0x69, 0x41, 0x64, 0x57, 0x48, 0x51, 0x50, 0x5c, 0x0a,\n\t0x09, 0x34, 0x48, 0x51, 0x48, 0x7a, 0x37, 0x64, 0x57, 0x69, 0x79, 0x35, 0x4e, 0x62, 0x56, 0x72, 0x47, 0x2b, \n\t0x55, 0x2b, 0x55, 0x53, 0x4e, 0x6c, 0x67, 0x4d, 0x70, 0x44, 0x79, 0x4e, 0x5a, 0x6c, 0x2b, 0x68, 0x49, 0x59, \n\t0x31, 0x74, 0x37, 0x4b, 0x4a, 0x44, 0x36, 0x35, 0x46, 0x30, 0x58, 0x6b, 0x47, 0x70, 0x57, 0x2f, 0x6c, 0x58, \n\t0x6c, 0x44, 0x31, 0x52, 0x4a, 0x61, 0x32, 0x71, 0x37, 0x49, 0x6c, 0x6b, 0x31, 0x69, 0x47, 0x5a, 0x66, 0x5c, 0x0a,\n\t0x09, 0x66, 0x35, 0x33, 0x64, 0x55, 0x58, 0x30, 0x48, 0x79, 0x42, 0x37, 0x53, 0x6d, 0x50, 0x67, 0x37, 0x31, \n\t0x30, 0x42, 0x7a, 0x77, 0x6d, 0x6f, 0x6a, 0x42, 0x31, 0x41, 0x32, 0x68, 0x39, 0x52, 0x6f, 0x32, 0x62, 0x57, \n\t0x7a, 0x64, 0x59, 0x79, 0x4f, 0x74, 0x44, 0x38, 0x59, 0x35, 0x36, 0x74, 0x64, 0x38, 0x32, 0x44, 0x6a, 0x41, \n\t0x43, 0x6d, 0x37, 0x70, 0x68, 0x34, 0x6b, 0x4b, 0x32, 0x4d, 0x44, 0x36, 0x51, 0x44, 0x77, 0x78, 0x79, 0x5c, 0x0a,\n\t0x09, 0x43, 0x30, 0x72, 0x76, 0x70, 0x36, 0x54, 0x57, 0x56, 0x48, 0x6c, 0x39, 0x58, 0x30, 0x69, 0x62, 0x77, \n\t0x73, 0x6f, 0x50, 0x6f, 0x72, 0x49, 0x4b, 0x52, 0x37, 0x76, 0x34, 0x4c, 0x4f, 0x50, 0x65, 0x44, 0x57, 0x30, \n\t0x7a, 0x72, 0x51, 0x6d, 0x67, 0x69, 0x57, 0x52, 0x4e, 0x72, 0x57, 0x74, 0x45, 0x6b, 0x7a, 0x4d, 0x32, 0x75, \n\t0x6a, 0x52, 0x30, 0x63, 0x36, 0x6b, 0x49, 0x61, 0x4e, 0x6a, 0x69, 0x79, 0x52, 0x73, 0x32, 0x6f, 0x67, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x57, 0x65, 0x6a, 0x4b, 0x30, 0x41, 0x61, 0x63, 0x35, 0x6a, 0x74, 0x48, 0x36, 0x6a, 0x4b, 0x38, \n\t0x74, 0x2f, 0x4e, 0x47, 0x31, 0x46, 0x57, 0x46, 0x61, 0x4c, 0x5a, 0x66, 0x35, 0x65, 0x4e, 0x31, 0x50, 0x34, \n\t0x61, 0x31, 0x53, 0x2b, 0x6a, 0x30, 0x50, 0x33, 0x47, 0x2b, 0x34, 0x4d, 0x56, 0x2f, 0x70, 0x59, 0x46, 0x79, \n\t0x53, 0x2f, 0x53, 0x65, 0x70, 0x42, 0x38, 0x64, 0x4b, 0x51, 0x48, 0x79, 0x55, 0x64, 0x48, 0x52, 0x67, 0x5c, 0x0a,\n\t0x09, 0x46, 0x67, 0x59, 0x77, 0x2b, 0x7a, 0x70, 0x52, 0x4b, 0x49, 0x31, 0x51, 0x63, 0x70, 0x75, 0x4c, 0x63, \n\t0x55, 0x67, 0x52, 0x68, 0x54, 0x4c, 0x4e, 0x4b, 0x63, 0x71, 0x76, 0x77, 0x42, 0x51, 0x50, 0x75, 0x66, 0x6a, \n\t0x58, 0x31, 0x67, 0x42, 0x71, 0x79, 0x4e, 0x4a, 0x67, 0x4c, 0x37, 0x69, 0x44, 0x2b, 0x50, 0x71, 0x70, 0x6f, \n\t0x44, 0x64, 0x35, 0x50, 0x75, 0x2b, 0x5a, 0x4b, 0x46, 0x70, 0x7a, 0x6c, 0x52, 0x41, 0x56, 0x4b, 0x72, 0x5c, 0x0a,\n\t0x09, 0x43, 0x4e, 0x4b, 0x77, 0x59, 0x62, 0x59, 0x79, 0x59, 0x70, 0x67, 0x74, 0x4b, 0x77, 0x53, 0x70, 0x58, \n\t0x35, 0x70, 0x4c, 0x48, 0x79, 0x72, 0x4d, 0x74, 0x6d, 0x65, 0x36, 0x59, 0x47, 0x53, 0x51, 0x2f, 0x67, 0x6a, \n\t0x6c, 0x38, 0x47, 0x6f, 0x34, 0x31, 0x46, 0x35, 0x57, 0x48, 0x61, 0x4a, 0x41, 0x47, 0x39, 0x30, 0x41, 0x2f, \n\t0x43, 0x6d, 0x71, 0x78, 0x4e, 0x2f, 0x38, 0x73, 0x50, 0x32, 0x4a, 0x68, 0x78, 0x41, 0x6b, 0x35, 0x33, 0x5c, 0x0a,\n\t0x09, 0x42, 0x4c, 0x49, 0x35, 0x2f, 0x5a, 0x48, 0x69, 0x6e, 0x4d, 0x74, 0x6a, 0x41, 0x68, 0x36, 0x62, 0x54, \n\t0x50, 0x49, 0x4e, 0x47, 0x52, 0x45, 0x6a, 0x54, 0x46, 0x4b, 0x43, 0x41, 0x4e, 0x4f, 0x48, 0x70, 0x62, 0x34, \n\t0x7a, 0x44, 0x62, 0x52, 0x65, 0x44, 0x33, 0x51, 0x4f, 0x6a, 0x38, 0x36, 0x49, 0x33, 0x31, 0x6c, 0x56, 0x71, \n\t0x68, 0x72, 0x49, 0x6b, 0x6d, 0x43, 0x6b, 0x42, 0x36, 0x45, 0x33, 0x42, 0x41, 0x46, 0x2b, 0x65, 0x49, 0x5c, 0x0a,\n\t0x09, 0x62, 0x2f, 0x71, 0x41, 0x42, 0x61, 0x62, 0x5a, 0x7a, 0x70, 0x31, 0x74, 0x37, 0x32, 0x41, 0x33, 0x32, \n\t0x73, 0x37, 0x6b, 0x72, 0x58, 0x56, 0x30, 0x5a, 0x43, 0x43, 0x72, 0x41, 0x5a, 0x4c, 0x58, 0x4c, 0x6f, 0x4f, \n\t0x43, 0x46, 0x50, 0x68, 0x70, 0x49, 0x30, 0x5a, 0x48, 0x2f, 0x69, 0x45, 0x71, 0x44, 0x39, 0x58, 0x55, 0x65, \n\t0x6d, 0x79, 0x79, 0x56, 0x75, 0x62, 0x4d, 0x79, 0x33, 0x37, 0x67, 0x6c, 0x77, 0x43, 0x53, 0x75, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x35, 0x50, 0x75, 0x75, 0x39, 0x32, 0x70, 0x44, 0x6c, 0x68, 0x51, 0x51, 0x72, 0x6d, 0x6b, 0x4c, 0x4b, \n\t0x35, 0x6f, 0x72, 0x57, 0x4d, 0x6a, 0x6e, 0x52, 0x4c, 0x4a, 0x78, 0x73, 0x4b, 0x70, 0x4d, 0x71, 0x68, 0x76, \n\t0x30, 0x76, 0x7a, 0x65, 0x65, 0x76, 0x6d, 0x69, 0x35, 0x51, 0x6a, 0x49, 0x4c, 0x38, 0x42, 0x30, 0x48, 0x6e, \n\t0x78, 0x56, 0x32, 0x6f, 0x71, 0x50, 0x52, 0x35, 0x5a, 0x4d, 0x34, 0x67, 0x43, 0x62, 0x66, 0x54, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x77, 0x48, 0x55, 0x41, 0x33, 0x53, 0x2f, 0x39, 0x47, 0x61, 0x68, 0x61, 0x6b, 0x44, 0x4b, 0x2f, 0x79, \n\t0x4b, 0x32, 0x76, 0x4e, 0x54, 0x73, 0x44, 0x52, 0x6b, 0x64, 0x57, 0x67, 0x42, 0x52, 0x47, 0x52, 0x30, 0x61, \n\t0x42, 0x64, 0x69, 0x71, 0x41, 0x56, 0x4a, 0x72, 0x56, 0x31, 0x6e, 0x78, 0x53, 0x63, 0x6d, 0x53, 0x51, 0x79, \n\t0x74, 0x66, 0x30, 0x46, 0x46, 0x5a, 0x4d, 0x57, 0x2b, 0x55, 0x77, 0x32, 0x2f, 0x2b, 0x4a, 0x63, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x41, 0x31, 0x66, 0x53, 0x45, 0x76, 0x61, 0x36, 0x32, 0x4a, 0x77, 0x44, 0x37, 0x69, 0x61, 0x34, 0x46, \n\t0x46, 0x50, 0x62, 0x61, 0x50, 0x37, 0x74, 0x66, 0x2f, 0x31, 0x71, 0x33, 0x79, 0x4f, 0x35, 0x43, 0x61, 0x6e, \n\t0x53, 0x4a, 0x49, 0x32, 0x59, 0x52, 0x6b, 0x34, 0x48, 0x67, 0x76, 0x46, 0x32, 0x62, 0x4c, 0x69, 0x47, 0x47, \n\t0x32, 0x30, 0x69, 0x78, 0x55, 0x73, 0x75, 0x64, 0x67, 0x4f, 0x5a, 0x44, 0x71, 0x34, 0x46, 0x6b, 0x56, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x45, 0x70, 0x77, 0x5a, 0x47, 0x6b, 0x43, 0x73, 0x41, 0x2f, 0x6c, 0x39, 0x31, 0x43, 0x68, 0x38, \n\t0x35, 0x4b, 0x68, 0x76, 0x75, 0x45, 0x35, 0x6b, 0x71, 0x77, 0x70, 0x52, 0x49, 0x45, 0x32, 0x75, 0x67, 0x4e, \n\t0x34, 0x43, 0x30, 0x42, 0x79, 0x32, 0x37, 0x58, 0x32, 0x46, 0x65, 0x78, 0x6d, 0x42, 0x32, 0x6d, 0x30, 0x6b, \n\t0x41, 0x4a, 0x49, 0x72, 0x53, 0x4a, 0x49, 0x71, 0x78, 0x78, 0x6d, 0x4b, 0x31, 0x45, 0x72, 0x36, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x77, 0x54, 0x43, 0x4b, 0x54, 0x65, 0x36, 0x4d, 0x69, 0x33, 0x41, 0x36, 0x73, 0x32, 0x4c, 0x31, 0x53, \n\t0x57, 0x4e, 0x64, 0x64, 0x45, 0x41, 0x55, 0x69, 0x2f, 0x43, 0x33, 0x77, 0x42, 0x6c, 0x4b, 0x58, 0x50, 0x76, \n\t0x78, 0x4e, 0x4d, 0x43, 0x71, 0x32, 0x70, 0x50, 0x49, 0x43, 0x74, 0x32, 0x55, 0x45, 0x61, 0x45, 0x39, 0x6c, \n\t0x78, 0x33, 0x7a, 0x44, 0x62, 0x63, 0x55, 0x56, 0x48, 0x4e, 0x6a, 0x75, 0x32, 0x5a, 0x6e, 0x55, 0x67, 0x5c, 0x0a,\n\t0x09, 0x56, 0x53, 0x53, 0x4f, 0x46, 0x61, 0x52, 0x43, 0x65, 0x6a, 0x31, 0x49, 0x65, 0x69, 0x78, 0x47, 0x35, \n\t0x78, 0x49, 0x30, 0x74, 0x55, 0x43, 0x56, 0x38, 0x74, 0x38, 0x4f, 0x76, 0x41, 0x75, 0x45, 0x7a, 0x6f, 0x2f, \n\t0x64, 0x55, 0x46, 0x58, 0x37, 0x73, 0x55, 0x74, 0x7a, 0x2b, 0x53, 0x79, 0x72, 0x4a, 0x69, 0x6e, 0x77, 0x62, \n\t0x34, 0x47, 0x62, 0x39, 0x50, 0x69, 0x42, 0x79, 0x65, 0x34, 0x4e, 0x66, 0x30, 0x4c, 0x6e, 0x38, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x50, 0x62, 0x78, 0x59, 0x46, 0x55, 0x4a, 0x50, 0x76, 0x51, 0x36, 0x48, 0x48, 0x42, 0x46, 0x41, \n\t0x31, 0x51, 0x4e, 0x76, 0x75, 0x70, 0x36, 0x43, 0x69, 0x2b, 0x4a, 0x68, 0x38, 0x64, 0x77, 0x45, 0x59, 0x35, \n\t0x2f, 0x4b, 0x59, 0x68, 0x42, 0x6f, 0x6b, 0x38, 0x6e, 0x74, 0x45, 0x4c, 0x51, 0x75, 0x5a, 0x71, 0x75, 0x30, \n\t0x55, 0x46, 0x30, 0x47, 0x61, 0x64, 0x56, 0x58, 0x51, 0x5a, 0x37, 0x58, 0x37, 0x4c, 0x48, 0x4f, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x54, 0x31, 0x35, 0x56, 0x51, 0x63, 0x4b, 0x6f, 0x56, 0x56, 0x38, 0x48, 0x74, 0x39, 0x57, 0x6a, 0x4d, \n\t0x63, 0x6d, 0x33, 0x44, 0x71, 0x4c, 0x7a, 0x37, 0x67, 0x4d, 0x65, 0x44, 0x61, 0x47, 0x78, 0x61, 0x34, 0x62, \n\t0x6d, 0x59, 0x32, 0x66, 0x44, 0x66, 0x50, 0x38, 0x52, 0x70, 0x62, 0x73, 0x47, 0x72, 0x6c, 0x41, 0x6d, 0x36, \n\t0x2b, 0x45, 0x54, 0x68, 0x64, 0x72, 0x6f, 0x64, 0x75, 0x41, 0x58, 0x77, 0x59, 0x37, 0x57, 0x6b, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x75, 0x2b, 0x6d, 0x50, 0x6c, 0x44, 0x33, 0x71, 0x7a, 0x35, 0x78, 0x56, 0x6b, 0x39, 0x64, 0x68, 0x53, \n\t0x39, 0x2f, 0x32, 0x37, 0x30, 0x38, 0x49, 0x45, 0x52, 0x6f, 0x69, 0x4d, 0x48, 0x2f, 0x77, 0x69, 0x70, 0x4e, \n\t0x43, 0x62, 0x7a, 0x69, 0x6c, 0x5a, 0x70, 0x70, 0x41, 0x72, 0x4e, 0x6f, 0x75, 0x58, 0x30, 0x50, 0x6e, 0x6c, \n\t0x37, 0x39, 0x73, 0x74, 0x6c, 0x31, 0x63, 0x51, 0x69, 0x36, 0x66, 0x47, 0x55, 0x2b, 0x4b, 0x76, 0x37, 0x5c, 0x0a,\n\t0x09, 0x63, 0x6f, 0x41, 0x41, 0x55, 0x69, 0x57, 0x39, 0x61, 0x34, 0x37, 0x6b, 0x6c, 0x69, 0x4d, 0x34, 0x4d, \n\t0x6a, 0x2b, 0x4f, 0x79, 0x6a, 0x39, 0x59, 0x4c, 0x58, 0x52, 0x39, 0x78, 0x55, 0x31, 0x57, 0x52, 0x30, 0x51, \n\t0x72, 0x39, 0x4c, 0x48, 0x49, 0x32, 0x6d, 0x41, 0x38, 0x39, 0x34, 0x64, 0x58, 0x67, 0x48, 0x33, 0x36, 0x6a, \n\t0x77, 0x4a, 0x58, 0x53, 0x57, 0x75, 0x53, 0x79, 0x5a, 0x66, 0x38, 0x4c, 0x6a, 0x4b, 0x31, 0x48, 0x59, 0x5c, 0x0a,\n\t0x09, 0x30, 0x58, 0x49, 0x46, 0x33, 0x43, 0x50, 0x48, 0x51, 0x50, 0x53, 0x78, 0x39, 0x36, 0x42, 0x32, 0x62, \n\t0x76, 0x4c, 0x58, 0x6e, 0x39, 0x64, 0x75, 0x79, 0x6b, 0x39, 0x64, 0x78, 0x2f, 0x54, 0x6e, 0x54, 0x71, 0x6d, \n\t0x57, 0x43, 0x36, 0x61, 0x4e, 0x49, 0x46, 0x45, 0x34, 0x4e, 0x4a, 0x30, 0x4e, 0x52, 0x75, 0x4d, 0x62, 0x46, \n\t0x56, 0x54, 0x79, 0x5a, 0x31, 0x78, 0x77, 0x6d, 0x6f, 0x73, 0x52, 0x70, 0x4a, 0x55, 0x2f, 0x66, 0x50, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x4b, 0x33, 0x6a, 0x6a, 0x78, 0x57, 0x4e, 0x46, 0x39, 0x44, 0x35, 0x55, 0x76, 0x53, 0x6f, 0x46, \n\t0x44, 0x56, 0x67, 0x63, 0x53, 0x66, 0x66, 0x6c, 0x33, 0x4a, 0x36, 0x6e, 0x37, 0x77, 0x39, 0x2b, 0x2b, 0x57, \n\t0x79, 0x53, 0x6e, 0x48, 0x30, 0x79, 0x64, 0x63, 0x66, 0x77, 0x68, 0x78, 0x61, 0x71, 0x72, 0x6a, 0x41, 0x53, \n\t0x75, 0x75, 0x79, 0x55, 0x35, 0x4a, 0x6f, 0x61, 0x2b, 0x74, 0x69, 0x30, 0x4e, 0x73, 0x36, 0x4c, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x31, 0x43, 0x62, 0x62, 0x36, 0x56, 0x53, 0x68, 0x55, 0x76, 0x36, 0x36, 0x4b, 0x4a, 0x53, 0x71, 0x4c, \n\t0x41, 0x4b, 0x34, 0x45, 0x48, 0x4e, 0x56, 0x35, 0x67, 0x38, 0x64, 0x72, 0x66, 0x73, 0x4d, 0x50, 0x77, 0x31, \n\t0x69, 0x51, 0x61, 0x70, 0x79, 0x7a, 0x2b, 0x78, 0x5a, 0x73, 0x4c, 0x41, 0x41, 0x48, 0x6f, 0x67, 0x51, 0x66, \n\t0x70, 0x66, 0x76, 0x68, 0x71, 0x7a, 0x48, 0x31, 0x33, 0x73, 0x76, 0x49, 0x77, 0x57, 0x34, 0x72, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x55, 0x6d, 0x76, 0x43, 0x35, 0x68, 0x31, 0x51, 0x63, 0x34, 0x54, 0x37, 0x71, 0x36, 0x57, 0x52, 0x39, \n\t0x46, 0x6a, 0x63, 0x46, 0x79, 0x43, 0x41, 0x64, 0x4f, 0x2f, 0x38, 0x46, 0x39, 0x49, 0x48, 0x46, 0x6d, 0x35, \n\t0x62, 0x69, 0x79, 0x46, 0x39, 0x57, 0x64, 0x59, 0x56, 0x6f, 0x73, 0x43, 0x73, 0x37, 0x51, 0x4e, 0x2b, 0x48, \n\t0x44, 0x44, 0x6d, 0x34, 0x42, 0x36, 0x57, 0x76, 0x6e, 0x67, 0x31, 0x4e, 0x44, 0x73, 0x6b, 0x6e, 0x33, 0x5c, 0x0a,\n\t0x09, 0x73, 0x2f, 0x65, 0x6d, 0x52, 0x66, 0x39, 0x63, 0x55, 0x6d, 0x4a, 0x66, 0x37, 0x6b, 0x2b, 0x39, 0x41, \n\t0x6b, 0x59, 0x62, 0x51, 0x77, 0x32, 0x2f, 0x72, 0x6f, 0x53, 0x47, 0x6e, 0x50, 0x32, 0x4c, 0x52, 0x77, 0x63, \n\t0x6b, 0x39, 0x4c, 0x53, 0x65, 0x57, 0x44, 0x56, 0x51, 0x44, 0x4a, 0x62, 0x38, 0x31, 0x44, 0x78, 0x36, 0x76, \n\t0x62, 0x77, 0x4e, 0x65, 0x75, 0x30, 0x30, 0x69, 0x6b, 0x4c, 0x53, 0x38, 0x7a, 0x68, 0x37, 0x74, 0x30, 0x5c, 0x0a,\n\t0x09, 0x58, 0x76, 0x72, 0x35, 0x76, 0x6e, 0x6c, 0x58, 0x51, 0x39, 0x5a, 0x64, 0x45, 0x32, 0x55, 0x67, 0x4b, \n\t0x64, 0x63, 0x43, 0x62, 0x77, 0x4e, 0x49, 0x62, 0x76, 0x30, 0x6b, 0x79, 0x57, 0x32, 0x66, 0x49, 0x76, 0x35, \n\t0x4b, 0x2f, 0x39, 0x39, 0x74, 0x30, 0x38, 0x58, 0x6a, 0x4a, 0x46, 0x2f, 0x35, 0x39, 0x50, 0x69, 0x6a, 0x49, \n\t0x7a, 0x75, 0x7a, 0x75, 0x5a, 0x59, 0x61, 0x46, 0x61, 0x54, 0x4b, 0x43, 0x67, 0x2b, 0x77, 0x48, 0x36, 0x5c, 0x0a,\n\t0x09, 0x54, 0x35, 0x6f, 0x62, 0x38, 0x35, 0x75, 0x4e, 0x69, 0x33, 0x48, 0x65, 0x53, 0x55, 0x69, 0x62, 0x66, \n\t0x71, 0x38, 0x65, 0x51, 0x68, 0x61, 0x61, 0x79, 0x39, 0x46, 0x6f, 0x4a, 0x31, 0x39, 0x6f, 0x6c, 0x43, 0x6d, \n\t0x66, 0x74, 0x66, 0x56, 0x77, 0x42, 0x45, 0x43, 0x4a, 0x38, 0x41, 0x6e, 0x6b, 0x2b, 0x69, 0x36, 0x4c, 0x66, \n\t0x76, 0x58, 0x66, 0x37, 0x43, 0x64, 0x6f, 0x65, 0x4a, 0x6e, 0x33, 0x6d, 0x72, 0x2f, 0x58, 0x4e, 0x49, 0x5c, 0x0a,\n\t0x09, 0x59, 0x39, 0x54, 0x45, 0x6b, 0x48, 0x62, 0x42, 0x2b, 0x55, 0x5a, 0x71, 0x45, 0x73, 0x54, 0x45, 0x31, \n\t0x68, 0x63, 0x4b, 0x2f, 0x53, 0x50, 0x6e, 0x47, 0x36, 0x6e, 0x33, 0x6d, 0x30, 0x6a, 0x42, 0x47, 0x47, 0x7a, \n\t0x76, 0x47, 0x58, 0x54, 0x68, 0x45, 0x4c, 0x70, 0x34, 0x4f, 0x4c, 0x39, 0x50, 0x31, 0x69, 0x52, 0x61, 0x39, \n\t0x49, 0x46, 0x36, 0x7a, 0x75, 0x66, 0x37, 0x74, 0x63, 0x31, 0x59, 0x35, 0x52, 0x66, 0x56, 0x35, 0x56, 0x5c, 0x0a,\n\t0x09, 0x55, 0x6c, 0x2f, 0x75, 0x79, 0x39, 0x74, 0x57, 0x52, 0x47, 0x32, 0x79, 0x66, 0x75, 0x55, 0x4f, 0x46, \n\t0x78, 0x4d, 0x74, 0x6c, 0x67, 0x35, 0x6c, 0x66, 0x48, 0x39, 0x77, 0x5a, 0x48, 0x6e, 0x57, 0x78, 0x55, 0x6e, \n\t0x79, 0x67, 0x55, 0x67, 0x2f, 0x4a, 0x79, 0x59, 0x41, 0x2f, 0x7a, 0x2f, 0x66, 0x2f, 0x36, 0x4d, 0x75, 0x6b, \n\t0x75, 0x59, 0x62, 0x35, 0x33, 0x56, 0x37, 0x35, 0x34, 0x6d, 0x30, 0x55, 0x45, 0x4c, 0x50, 0x4d, 0x52, 0x5c, 0x0a,\n\t0x09, 0x30, 0x6d, 0x57, 0x43, 0x32, 0x6d, 0x52, 0x69, 0x61, 0x32, 0x37, 0x71, 0x59, 0x44, 0x53, 0x4e, 0x56, \n\t0x4b, 0x65, 0x53, 0x71, 0x72, 0x52, 0x51, 0x54, 0x56, 0x34, 0x39, 0x48, 0x74, 0x65, 0x65, 0x6b, 0x33, 0x62, \n\t0x44, 0x79, 0x4e, 0x62, 0x32, 0x44, 0x30, 0x70, 0x37, 0x62, 0x51, 0x43, 0x71, 0x6b, 0x77, 0x30, 0x44, 0x30, \n\t0x65, 0x79, 0x2f, 0x7a, 0x2f, 0x79, 0x6a, 0x41, 0x79, 0x67, 0x2f, 0x53, 0x70, 0x78, 0x32, 0x42, 0x37, 0x5c, 0x0a,\n\t0x09, 0x33, 0x57, 0x33, 0x48, 0x66, 0x6e, 0x2b, 0x4d, 0x4e, 0x73, 0x6f, 0x79, 0x59, 0x79, 0x75, 0x62, 0x31, \n\t0x34, 0x6f, 0x78, 0x43, 0x6b, 0x63, 0x6c, 0x4c, 0x35, 0x59, 0x46, 0x77, 0x67, 0x64, 0x65, 0x76, 0x44, 0x6f, \n\t0x71, 0x50, 0x54, 0x4a, 0x6e, 0x39, 0x64, 0x6a, 0x38, 0x64, 0x37, 0x5a, 0x4b, 0x4a, 0x52, 0x6d, 0x32, 0x63, \n\t0x74, 0x5a, 0x4d, 0x4e, 0x41, 0x42, 0x44, 0x6c, 0x49, 0x65, 0x6e, 0x54, 0x2b, 0x5a, 0x75, 0x30, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x76, 0x7a, 0x6e, 0x6f, 0x64, 0x65, 0x62, 0x68, 0x76, 0x61, 0x78, 0x47, 0x6d, 0x4b, 0x31, 0x30, 0x5a, \n\t0x71, 0x45, 0x35, 0x55, 0x62, 0x78, 0x5a, 0x31, 0x75, 0x45, 0x44, 0x67, 0x4f, 0x53, 0x54, 0x56, 0x67, 0x43, \n\t0x53, 0x4c, 0x6c, 0x5a, 0x2f, 0x47, 0x54, 0x67, 0x36, 0x65, 0x66, 0x49, 0x57, 0x58, 0x55, 0x7a, 0x66, 0x4c, \n\t0x4a, 0x30, 0x47, 0x30, 0x37, 0x2f, 0x79, 0x6a, 0x5a, 0x6f, 0x62, 0x72, 0x49, 0x31, 0x73, 0x4b, 0x49, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x41, 0x67, 0x54, 0x54, 0x66, 0x68, 0x66, 0x6d, 0x6c, 0x74, 0x37, 0x42, 0x74, 0x2b, 0x68, 0x4f, \n\t0x44, 0x58, 0x4b, 0x4e, 0x48, 0x39, 0x6f, 0x38, 0x33, 0x4f, 0x6a, 0x4c, 0x34, 0x43, 0x47, 0x6b, 0x30, 0x66, \n\t0x55, 0x71, 0x76, 0x63, 0x7a, 0x4d, 0x6f, 0x53, 0x4d, 0x73, 0x74, 0x6a, 0x2f, 0x52, 0x63, 0x57, 0x4a, 0x46, \n\t0x6d, 0x4b, 0x6e, 0x7a, 0x57, 0x79, 0x57, 0x5a, 0x58, 0x74, 0x6b, 0x38, 0x38, 0x6d, 0x34, 0x6b, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x30, 0x32, 0x2b, 0x35, 0x75, 0x61, 0x62, 0x67, 0x74, 0x5a, 0x4d, 0x4e, 0x42, 0x78, 0x48, 0x41, 0x6c, \n\t0x72, 0x64, 0x2f, 0x48, 0x5a, 0x6f, 0x4e, 0x55, 0x50, 0x30, 0x52, 0x5a, 0x69, 0x64, 0x76, 0x57, 0x79, 0x36, \n\t0x2f, 0x7a, 0x68, 0x32, 0x79, 0x41, 0x49, 0x77, 0x72, 0x4f, 0x6a, 0x4a, 0x63, 0x74, 0x47, 0x31, 0x30, 0x6b, \n\t0x4d, 0x6b, 0x64, 0x46, 0x54, 0x66, 0x31, 0x32, 0x7a, 0x47, 0x43, 0x74, 0x4e, 0x79, 0x49, 0x44, 0x53, 0x5c, 0x0a,\n\t0x09, 0x41, 0x53, 0x35, 0x4a, 0x53, 0x70, 0x6e, 0x39, 0x43, 0x35, 0x37, 0x6a, 0x36, 0x5a, 0x58, 0x4d, 0x39, \n\t0x56, 0x71, 0x31, 0x77, 0x32, 0x4a, 0x45, 0x51, 0x41, 0x57, 0x33, 0x37, 0x37, 0x6d, 0x39, 0x42, 0x70, 0x49, \n\t0x64, 0x74, 0x6e, 0x6e, 0x73, 0x78, 0x55, 0x70, 0x32, 0x61, 0x79, 0x4b, 0x42, 0x64, 0x4e, 0x64, 0x65, 0x44, \n\t0x6f, 0x79, 0x47, 0x45, 0x2f, 0x51, 0x69, 0x6f, 0x54, 0x32, 0x35, 0x44, 0x57, 0x56, 0x4a, 0x2b, 0x62, 0x5c, 0x0a,\n\t0x09, 0x72, 0x79, 0x4a, 0x49, 0x72, 0x61, 0x4b, 0x2f, 0x45, 0x35, 0x30, 0x79, 0x39, 0x54, 0x34, 0x39, 0x31, \n\t0x6e, 0x30, 0x66, 0x72, 0x51, 0x62, 0x54, 0x2f, 0x2f, 0x6d, 0x72, 0x66, 0x64, 0x74, 0x6b, 0x72, 0x57, 0x52, \n\t0x6a, 0x6f, 0x46, 0x77, 0x6a, 0x4d, 0x74, 0x6c, 0x47, 0x35, 0x35, 0x63, 0x57, 0x6d, 0x4a, 0x32, 0x34, 0x43, \n\t0x4b, 0x4e, 0x33, 0x73, 0x39, 0x69, 0x64, 0x71, 0x63, 0x31, 0x73, 0x55, 0x6d, 0x68, 0x4f, 0x46, 0x78, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x73, 0x36, 0x2f, 0x59, 0x42, 0x75, 0x38, 0x54, 0x68, 0x30, 0x77, 0x30, 0x51, 0x47, 0x66, 0x73, \n\t0x75, 0x66, 0x6f, 0x54, 0x37, 0x70, 0x6f, 0x50, 0x4c, 0x37, 0x59, 0x35, 0x6c, 0x2b, 0x6a, 0x54, 0x30, 0x36, \n\t0x46, 0x34, 0x37, 0x4e, 0x5a, 0x43, 0x56, 0x51, 0x62, 0x43, 0x77, 0x57, 0x72, 0x46, 0x67, 0x47, 0x78, 0x34, \n\t0x45, 0x69, 0x61, 0x6f, 0x31, 0x77, 0x2f, 0x2b, 0x4b, 0x76, 0x44, 0x4c, 0x64, 0x7a, 0x74, 0x74, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x32, 0x38, 0x52, 0x64, 0x75, 0x70, 0x53, 0x2b, 0x54, 0x44, 0x6f, 0x4e, 0x5a, 0x74, 0x36, 0x38, 0x76, \n\t0x6e, 0x35, 0x51, 0x4b, 0x42, 0x74, 0x57, 0x45, 0x77, 0x48, 0x4d, 0x2f, 0x74, 0x63, 0x76, 0x51, 0x53, 0x51, \n\t0x51, 0x70, 0x2f, 0x74, 0x6c, 0x32, 0x39, 0x51, 0x6c, 0x54, 0x4c, 0x59, 0x58, 0x36, 0x76, 0x4b, 0x4b, 0x74, \n\t0x46, 0x59, 0x33, 0x7a, 0x4c, 0x62, 0x52, 0x51, 0x6d, 0x5a, 0x4f, 0x6f, 0x32, 0x64, 0x43, 0x70, 0x36, 0x5c, 0x0a,\n\t0x09, 0x41, 0x35, 0x78, 0x71, 0x43, 0x52, 0x53, 0x74, 0x66, 0x49, 0x64, 0x41, 0x75, 0x5a, 0x61, 0x43, 0x4a, \n\t0x54, 0x72, 0x65, 0x4d, 0x79, 0x30, 0x33, 0x34, 0x61, 0x37, 0x51, 0x59, 0x7a, 0x76, 0x37, 0x5a, 0x2b, 0x77, \n\t0x2f, 0x6b, 0x71, 0x32, 0x64, 0x41, 0x51, 0x41, 0x57, 0x7a, 0x35, 0x74, 0x61, 0x38, 0x6a, 0x37, 0x53, 0x59, \n\t0x61, 0x70, 0x2f, 0x66, 0x49, 0x53, 0x54, 0x4f, 0x58, 0x4d, 0x4e, 0x57, 0x75, 0x58, 0x67, 0x50, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x54, 0x4b, 0x38, 0x77, 0x7a, 0x4c, 0x59, 0x55, 0x48, 0x53, 0x6d, 0x39, 0x30, 0x5a, 0x48, 0x53, 0x6d, \n\t0x6b, 0x61, 0x6d, 0x54, 0x2b, 0x36, 0x39, 0x39, 0x7a, 0x68, 0x42, 0x71, 0x76, 0x43, 0x4c, 0x6f, 0x76, 0x4f, \n\t0x32, 0x37, 0x5a, 0x65, 0x54, 0x70, 0x35, 0x36, 0x6c, 0x33, 0x66, 0x53, 0x67, 0x74, 0x4e, 0x64, 0x33, 0x4f, \n\t0x46, 0x38, 0x6c, 0x47, 0x78, 0x34, 0x69, 0x67, 0x4e, 0x6d, 0x33, 0x66, 0x51, 0x33, 0x70, 0x74, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x41, 0x6b, 0x76, 0x56, 0x4e, 0x4f, 0x32, 0x58, 0x6f, 0x52, 0x55, 0x35, 0x30, 0x65, 0x6b, 0x47, 0x52, \n\t0x36, 0x36, 0x35, 0x70, 0x45, 0x52, 0x38, 0x72, 0x45, 0x4e, 0x71, 0x53, 0x7a, 0x70, 0x62, 0x65, 0x53, 0x71, \n\t0x77, 0x66, 0x53, 0x30, 0x65, 0x6a, 0x55, 0x36, 0x53, 0x74, 0x6c, 0x53, 0x2b, 0x63, 0x62, 0x4d, 0x74, 0x46, \n\t0x6b, 0x35, 0x6c, 0x63, 0x33, 0x6a, 0x68, 0x6e, 0x7a, 0x63, 0x6b, 0x4a, 0x41, 0x42, 0x44, 0x44, 0x37, 0x5c, 0x0a,\n\t0x09, 0x33, 0x32, 0x36, 0x30, 0x50, 0x6c, 0x49, 0x33, 0x75, 0x56, 0x64, 0x32, 0x62, 0x72, 0x75, 0x41, 0x6d, \n\t0x59, 0x6b, 0x6a, 0x32, 0x63, 0x6c, 0x57, 0x47, 0x35, 0x6e, 0x59, 0x59, 0x75, 0x46, 0x5a, 0x72, 0x65, 0x6a, \n\t0x49, 0x59, 0x43, 0x46, 0x58, 0x70, 0x6b, 0x39, 0x46, 0x6d, 0x70, 0x4f, 0x39, 0x6c, 0x52, 0x77, 0x45, 0x70, \n\t0x49, 0x72, 0x45, 0x50, 0x69, 0x41, 0x74, 0x41, 0x69, 0x39, 0x42, 0x2b, 0x57, 0x61, 0x30, 0x59, 0x35, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x5a, 0x4e, 0x34, 0x2f, 0x2f, 0x50, 0x66, 0x70, 0x78, 0x79, 0x41, 0x6b, 0x44, 0x45, 0x56, 0x67, \n\t0x66, 0x53, 0x53, 0x62, 0x62, 0x36, 0x47, 0x4c, 0x33, 0x65, 0x33, 0x4c, 0x4b, 0x6c, 0x73, 0x63, 0x78, 0x4f, \n\t0x33, 0x6b, 0x41, 0x67, 0x4c, 0x61, 0x77, 0x2b, 0x50, 0x47, 0x33, 0x6f, 0x4e, 0x30, 0x46, 0x71, 0x33, 0x31, \n\t0x61, 0x55, 0x78, 0x61, 0x6f, 0x45, 0x43, 0x51, 0x66, 0x34, 0x46, 0x62, 0x33, 0x45, 0x56, 0x4c, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x37, 0x63, 0x68, 0x42, 0x77, 0x6d, 0x79, 0x6a, 0x4a, 0x72, 0x4c, 0x6c, 0x44, 0x4b, 0x76, 0x5a, 0x79, \n\t0x72, 0x49, 0x63, 0x53, 0x44, 0x58, 0x44, 0x2b, 0x41, 0x71, 0x51, 0x59, 0x70, 0x53, 0x58, 0x6f, 0x58, 0x77, \n\t0x61, 0x59, 0x50, 0x4c, 0x48, 0x50, 0x39, 0x32, 0x54, 0x59, 0x61, 0x50, 0x49, 0x43, 0x51, 0x55, 0x52, 0x77, \n\t0x4f, 0x79, 0x62, 0x72, 0x72, 0x65, 0x6d, 0x62, 0x53, 0x6e, 0x5a, 0x4a, 0x36, 0x64, 0x73, 0x4f, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x66, 0x5a, 0x69, 0x62, 0x30, 0x79, 0x4f, 0x30, 0x6e, 0x36, 0x34, 0x4c, 0x64, 0x5a, 0x2b, 0x4c, 0x73, \n\t0x33, 0x59, 0x41, 0x37, 0x76, 0x64, 0x53, 0x42, 0x4e, 0x35, 0x69, 0x41, 0x31, 0x57, 0x67, 0x57, 0x51, 0x78, \n\t0x76, 0x49, 0x52, 0x30, 0x71, 0x68, 0x46, 0x74, 0x4f, 0x58, 0x4d, 0x66, 0x4c, 0x55, 0x2f, 0x6c, 0x42, 0x46, \n\t0x42, 0x43, 0x76, 0x5a, 0x6a, 0x34, 0x4b, 0x58, 0x59, 0x59, 0x44, 0x30, 0x6d, 0x66, 0x32, 0x4c, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x41, 0x67, 0x51, 0x6e, 0x49, 0x45, 0x51, 0x41, 0x73, 0x37, 0x39, 0x79, 0x41, 0x7a, 0x4c, 0x52, 0x51, \n\t0x6f, 0x2f, 0x4d, 0x48, 0x30, 0x4e, 0x35, 0x44, 0x44, 0x74, 0x6d, 0x66, 0x78, 0x39, 0x41, 0x6a, 0x2b, 0x39, \n\t0x6e, 0x34, 0x57, 0x4e, 0x76, 0x49, 0x72, 0x6e, 0x7a, 0x4d, 0x2f, 0x61, 0x72, 0x49, 0x78, 0x56, 0x68, 0x74, \n\t0x6d, 0x50, 0x39, 0x43, 0x47, 0x6d, 0x7a, 0x51, 0x7a, 0x52, 0x37, 0x42, 0x70, 0x56, 0x4c, 0x38, 0x43, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x41, 0x70, 0x50, 0x61, 0x2f, 0x49, 0x6b, 0x41, 0x2f, 0x75, 0x62, 0x45, 0x42, 0x67, 0x67, 0x30, \n\t0x55, 0x43, 0x6a, 0x4b, 0x4b, 0x48, 0x50, 0x32, 0x46, 0x69, 0x32, 0x44, 0x72, 0x46, 0x45, 0x79, 0x31, 0x6b, \n\t0x61, 0x6e, 0x4f, 0x54, 0x32, 0x42, 0x2f, 0x70, 0x47, 0x59, 0x43, 0x6f, 0x4c, 0x6e, 0x72, 0x4d, 0x74, 0x72, \n\t0x50, 0x65, 0x4c, 0x58, 0x74, 0x38, 0x47, 0x54, 0x52, 0x66, 0x6d, 0x41, 0x72, 0x57, 0x63, 0x72, 0x33, 0x5c, 0x0a,\n\t0x09, 0x54, 0x57, 0x7a, 0x44, 0x61, 0x74, 0x4d, 0x6c, 0x2b, 0x31, 0x30, 0x41, 0x54, 0x66, 0x49, 0x77, 0x32, \n\t0x39, 0x53, 0x48, 0x6a, 0x72, 0x67, 0x77, 0x57, 0x2b, 0x50, 0x43, 0x5a, 0x34, 0x4d, 0x77, 0x45, 0x6c, 0x57, \n\t0x44, 0x44, 0x36, 0x76, 0x56, 0x68, 0x63, 0x50, 0x6f, 0x38, 0x5a, 0x71, 0x33, 0x6c, 0x59, 0x63, 0x4c, 0x73, \n\t0x7a, 0x30, 0x4f, 0x76, 0x41, 0x54, 0x34, 0x6c, 0x4d, 0x6a, 0x47, 0x42, 0x4b, 0x69, 0x53, 0x6c, 0x78, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x5a, 0x49, 0x69, 0x38, 0x75, 0x56, 0x68, 0x76, 0x67, 0x55, 0x75, 0x41, 0x44, 0x77, 0x4c, 0x6b, \n\t0x41, 0x4d, 0x6e, 0x55, 0x53, 0x37, 0x63, 0x74, 0x65, 0x52, 0x57, 0x50, 0x6e, 0x78, 0x52, 0x61, 0x65, 0x65, \n\t0x4e, 0x48, 0x47, 0x47, 0x6e, 0x6d, 0x51, 0x30, 0x69, 0x55, 0x30, 0x54, 0x54, 0x4b, 0x51, 0x31, 0x41, 0x46, \n\t0x55, 0x43, 0x35, 0x4b, 0x50, 0x7a, 0x38, 0x35, 0x41, 0x38, 0x6e, 0x48, 0x61, 0x4b, 0x58, 0x72, 0x73, 0x5c, 0x0a,\n\t0x09, 0x51, 0x58, 0x54, 0x78, 0x53, 0x48, 0x55, 0x46, 0x42, 0x34, 0x74, 0x46, 0x65, 0x67, 0x43, 0x34, 0x43, \n\t0x76, 0x67, 0x61, 0x41, 0x6c, 0x4d, 0x2f, 0x74, 0x66, 0x45, 0x41, 0x67, 0x6b, 0x63, 0x77, 0x52, 0x46, 0x41, \n\t0x41, 0x61, 0x52, 0x76, 0x32, 0x42, 0x34, 0x37, 0x2f, 0x6c, 0x55, 0x39, 0x6f, 0x6e, 0x48, 0x73, 0x5a, 0x37, \n\t0x61, 0x65, 0x38, 0x7a, 0x4d, 0x56, 0x74, 0x4c, 0x30, 0x4a, 0x69, 0x59, 0x52, 0x6f, 0x55, 0x4a, 0x46, 0x5c, 0x0a,\n\t0x09, 0x48, 0x2f, 0x41, 0x6b, 0x41, 0x2f, 0x6b, 0x42, 0x4c, 0x4d, 0x6f, 0x58, 0x73, 0x73, 0x70, 0x46, 0x58, \n\t0x53, 0x48, 0x36, 0x51, 0x62, 0x45, 0x56, 0x34, 0x4d, 0x33, 0x41, 0x38, 0x77, 0x39, 0x64, 0x4d, 0x62, 0x45, \n\t0x79, 0x42, 0x34, 0x68, 0x45, 0x4d, 0x45, 0x42, 0x5a, 0x41, 0x41, 0x66, 0x68, 0x70, 0x34, 0x42, 0x37, 0x41, \n\t0x56, 0x67, 0x4e, 0x59, 0x45, 0x72, 0x53, 0x65, 0x38, 0x67, 0x4f, 0x62, 0x6a, 0x6e, 0x6d, 0x64, 0x68, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x49, 0x50, 0x6b, 0x54, 0x56, 0x6b, 0x47, 0x55, 0x74, 0x65, 0x43, 0x34, 0x6b, 0x47, 0x71, 0x69, \n\t0x6f, 0x35, 0x30, 0x4d, 0x47, 0x58, 0x52, 0x6b, 0x65, 0x6b, 0x69, 0x35, 0x75, 0x44, 0x64, 0x39, 0x56, 0x47, \n\t0x4b, 0x31, 0x53, 0x43, 0x39, 0x43, 0x2f, 0x67, 0x46, 0x59, 0x41, 0x6e, 0x5a, 0x32, 0x41, 0x44, 0x42, 0x6f, \n\t0x77, 0x41, 0x69, 0x4c, 0x77, 0x46, 0x4d, 0x70, 0x32, 0x4d, 0x37, 0x36, 0x63, 0x55, 0x41, 0x69, 0x43, 0x5c, 0x0a,\n\t0x09, 0x43, 0x54, 0x57, 0x32, 0x6c, 0x65, 0x38, 0x45, 0x4d, 0x30, 0x7a, 0x33, 0x6b, 0x61, 0x6d, 0x4e, 0x52, \n\t0x42, 0x31, 0x4d, 0x31, 0x42, 0x63, 0x71, 0x47, 0x31, 0x6f, 0x34, 0x62, 0x5a, 0x36, 0x74, 0x48, 0x37, 0x30, \n\t0x4b, 0x57, 0x6a, 0x39, 0x62, 0x47, 0x78, 0x4f, 0x55, 0x6a, 0x37, 0x45, 0x58, 0x34, 0x57, 0x2b, 0x4b, 0x42, \n\t0x50, 0x6d, 0x76, 0x71, 0x33, 0x47, 0x78, 0x73, 0x67, 0x65, 0x42, 0x52, 0x42, 0x42, 0x44, 0x31, 0x61, 0x5c, 0x0a,\n\t0x09, 0x36, 0x55, 0x58, 0x59, 0x31, 0x37, 0x59, 0x66, 0x62, 0x7a, 0x74, 0x58, 0x6b, 0x63, 0x34, 0x4d, 0x7a, \n\t0x58, 0x4f, 0x66, 0x54, 0x75, 0x50, 0x73, 0x37, 0x37, 0x64, 0x4c, 0x4a, 0x66, 0x46, 0x69, 0x34, 0x47, 0x78, \n\t0x33, 0x72, 0x55, 0x62, 0x53, 0x4a, 0x41, 0x41, 0x70, 0x52, 0x6b, 0x30, 0x61, 0x67, 0x4e, 0x53, 0x72, 0x6c, \n\t0x56, 0x52, 0x54, 0x39, 0x50, 0x68, 0x2b, 0x39, 0x4e, 0x67, 0x44, 0x39, 0x71, 0x37, 0x31, 0x49, 0x50, 0x5c, 0x0a,\n\t0x09, 0x30, 0x74, 0x38, 0x42, 0x39, 0x41, 0x48, 0x30, 0x5a, 0x67, 0x2b, 0x67, 0x53, 0x41, 0x78, 0x38, 0x75, \n\t0x6a, 0x43, 0x69, 0x49, 0x76, 0x41, 0x55, 0x77, 0x74, 0x34, 0x48, 0x58, 0x41, 0x6d, 0x78, 0x44, 0x5a, 0x36, \n\t0x63, 0x66, 0x56, 0x45, 0x67, 0x6e, 0x52, 0x79, 0x59, 0x2b, 0x6e, 0x73, 0x66, 0x4d, 0x4a, 0x52, 0x4e, 0x73, \n\t0x66, 0x41, 0x79, 0x4c, 0x57, 0x2f, 0x2f, 0x45, 0x67, 0x6d, 0x64, 0x79, 0x73, 0x59, 0x57, 0x49, 0x30, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x52, 0x46, 0x4e, 0x63, 0x35, 0x44, 0x53, 0x32, 0x50, 0x70, 0x45, 0x44, 0x69, 0x52, 0x7a, 0x36, \n\t0x47, 0x37, 0x72, 0x59, 0x47, 0x63, 0x42, 0x2b, 0x49, 0x57, 0x32, 0x2f, 0x42, 0x62, 0x77, 0x42, 0x75, 0x43, \n\t0x54, 0x2f, 0x76, 0x7a, 0x30, 0x4b, 0x36, 0x39, 0x62, 0x2f, 0x55, 0x59, 0x59, 0x6f, 0x7a, 0x77, 0x71, 0x49, \n\t0x59, 0x49, 0x65, 0x72, 0x54, 0x51, 0x4a, 0x76, 0x41, 0x61, 0x52, 0x6e, 0x77, 0x63, 0x39, 0x44, 0x34, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x2b, 0x6a, 0x69, 0x4b, 0x69, 0x4c, 0x61, 0x63, 0x6a, 0x32, 0x38, 0x35, 0x47, 0x70, 0x6b, 0x39, \n\t0x42, 0x4a, 0x72, 0x59, 0x69, 0x6a, 0x62, 0x59, 0x46, 0x4b, 0x58, 0x69, 0x7a, 0x74, 0x67, 0x65, 0x6b, 0x65, \n\t0x41, 0x46, 0x64, 0x50, 0x49, 0x7a, 0x4f, 0x50, 0x59, 0x68, 0x32, 0x35, 0x2f, 0x49, 0x37, 0x35, 0x53, 0x44, \n\t0x64, 0x42, 0x76, 0x77, 0x61, 0x38, 0x46, 0x35, 0x63, 0x6f, 0x4d, 0x6e, 0x30, 0x7a, 0x35, 0x78, 0x59, 0x5c, 0x0a,\n\t0x09, 0x38, 0x48, 0x68, 0x35, 0x31, 0x45, 0x4c, 0x6b, 0x70, 0x51, 0x52, 0x54, 0x68, 0x4d, 0x69, 0x50, 0x67, \n\t0x4c, 0x34, 0x47, 0x65, 0x4b, 0x47, 0x49, 0x69, 0x36, 0x30, 0x71, 0x50, 0x33, 0x71, 0x6a, 0x68, 0x62, 0x53, \n\t0x6e, 0x6f, 0x64, 0x57, 0x78, 0x6b, 0x35, 0x55, 0x59, 0x32, 0x35, 0x42, 0x70, 0x46, 0x7a, 0x46, 0x64, 0x4e, \n\t0x46, 0x6d, 0x30, 0x67, 0x49, 0x58, 0x69, 0x58, 0x70, 0x39, 0x48, 0x2b, 0x43, 0x54, 0x77, 0x52, 0x38, 0x5c, 0x0a,\n\t0x09, 0x44, 0x66, 0x41, 0x38, 0x62, 0x54, 0x65, 0x71, 0x49, 0x43, 0x42, 0x4a, 0x73, 0x51, 0x5a, 0x56, 0x4b, \n\t0x41, 0x79, 0x54, 0x37, 0x71, 0x64, 0x75, 0x43, 0x66, 0x69, 0x2f, 0x41, 0x69, 0x34, 0x4c, 0x6b, 0x49, 0x4a, \n\t0x31, 0x56, 0x65, 0x57, 0x50, 0x47, 0x4f, 0x57, 0x4b, 0x6d, 0x70, 0x45, 0x75, 0x44, 0x7a, 0x77, 0x45, 0x63, \n\t0x52, 0x33, 0x67, 0x2f, 0x63, 0x46, 0x2b, 0x61, 0x64, 0x66, 0x74, 0x57, 0x4a, 0x34, 0x2f, 0x76, 0x55, 0x5c, 0x0a,\n\t0x09, 0x79, 0x53, 0x5a, 0x45, 0x46, 0x54, 0x4c, 0x33, 0x7a, 0x6f, 0x4a, 0x32, 0x51, 0x6f, 0x51, 0x49, 0x65, \n\t0x43, 0x4c, 0x43, 0x55, 0x34, 0x46, 0x4c, 0x67, 0x4d, 0x63, 0x43, 0x75, 0x78, 0x46, 0x4f, 0x73, 0x36, 0x2b, \n\t0x6b, 0x4b, 0x61, 0x41, 0x51, 0x6d, 0x51, 0x4f, 0x61, 0x4e, 0x47, 0x38, 0x43, 0x37, 0x68, 0x4c, 0x68, 0x46, \n\t0x75, 0x78, 0x76, 0x7a, 0x4e, 0x38, 0x49, 0x7a, 0x4f, 0x65, 0x46, 0x77, 0x66, 0x53, 0x72, 0x54, 0x33, 0x5c, 0x0a,\n\t0x09, 0x78, 0x77, 0x51, 0x74, 0x6d, 0x45, 0x61, 0x42, 0x6b, 0x35, 0x39, 0x6b, 0x64, 0x46, 0x6f, 0x42, 0x54, \n\t0x38, 0x78, 0x39, 0x57, 0x2b, 0x4c, 0x69, 0x32, 0x65, 0x4c, 0x47, 0x32, 0x49, 0x4a, 0x70, 0x61, 0x49, 0x4a, \n\t0x6f, 0x38, 0x54, 0x54, 0x52, 0x34, 0x34, 0x78, 0x4d, 0x54, 0x68, 0x4d, 0x37, 0x72, 0x33, 0x37, 0x56, 0x70, \n\t0x4d, 0x44, 0x35, 0x35, 0x61, 0x30, 0x45, 0x6a, 0x54, 0x72, 0x33, 0x6c, 0x6b, 0x67, 0x52, 0x50, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x6b, 0x52, 0x44, 0x69, 0x6a, 0x4e, 0x37, 0x57, 0x36, 0x49, 0x32, 0x68, 0x36, 0x52, 0x46, 0x4a, \n\t0x47, 0x32, 0x49, 0x4a, 0x68, 0x65, 0x4a, 0x4a, 0x75, 0x61, 0x4a, 0x70, 0x67, 0x35, 0x41, 0x35, 0x2f, 0x42, \n\t0x50, 0x41, 0x6e, 0x2f, 0x5a, 0x65, 0x50, 0x71, 0x61, 0x66, 0x64, 0x6c, 0x75, 0x33, 0x65, 0x56, 0x45, 0x65, \n\t0x49, 0x31, 0x36, 0x49, 0x38, 0x70, 0x75, 0x79, 0x75, 0x30, 0x6b, 0x32, 0x61, 0x38, 0x7a, 0x2f, 0x69, 0x5c, 0x0a,\n\t0x09, 0x53, 0x52, 0x59, 0x4c, 0x35, 0x65, 0x38, 0x55, 0x72, 0x52, 0x6f, 0x30, 0x67, 0x32, 0x49, 0x56, 0x70, \n\t0x65, 0x4c, 0x71, 0x31, 0x4f, 0x56, 0x6f, 0x41, 0x72, 0x70, 0x64, 0x30, 0x2b, 0x66, 0x53, 0x30, 0x72, 0x73, \n\t0x78, 0x46, 0x6c, 0x45, 0x36, 0x4c, 0x6c, 0x4a, 0x59, 0x64, 0x49, 0x49, 0x48, 0x38, 0x4e, 0x51, 0x38, 0x47, \n\t0x32, 0x33, 0x38, 0x76, 0x57, 0x76, 0x6b, 0x6f, 0x62, 0x53, 0x7a, 0x59, 0x68, 0x71, 0x70, 0x47, 0x35, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x33, 0x57, 0x46, 0x35, 0x38, 0x56, 0x43, 0x5a, 0x4e, 0x31, 0x45, 0x2b, 0x38, 0x71, 0x53, 0x42, \n\t0x65, 0x69, 0x51, 0x33, 0x5a, 0x65, 0x58, 0x30, 0x47, 0x36, 0x6a, 0x44, 0x7a, 0x78, 0x78, 0x7a, 0x65, 0x75, \n\t0x34, 0x55, 0x57, 0x51, 0x54, 0x6f, 0x76, 0x34, 0x79, 0x43, 0x5a, 0x7a, 0x6e, 0x39, 0x6f, 0x38, 0x44, 0x62, \n\t0x77, 0x77, 0x57, 0x55, 0x46, 0x2b, 0x42, 0x36, 0x43, 0x4c, 0x77, 0x54, 0x4e, 0x6d, 0x2b, 0x59, 0x37, 0x5c, 0x0a,\n\t0x09, 0x70, 0x2b, 0x36, 0x66, 0x36, 0x52, 0x4c, 0x35, 0x73, 0x51, 0x39, 0x5a, 0x66, 0x48, 0x42, 0x50, 0x75, \n\t0x2f, 0x4b, 0x2b, 0x69, 0x48, 0x6e, 0x48, 0x6f, 0x79, 0x32, 0x4a, 0x2b, 0x57, 0x2b, 0x48, 0x6d, 0x45, 0x4a, \n\t0x68, 0x4a, 0x64, 0x76, 0x43, 0x36, 0x31, 0x32, 0x79, 0x43, 0x79, 0x6f, 0x56, 0x2b, 0x6a, 0x33, 0x67, 0x44, \n\t0x69, 0x33, 0x31, 0x53, 0x38, 0x47, 0x2f, 0x67, 0x66, 0x47, 0x73, 0x55, 0x4c, 0x41, 0x6e, 0x65, 0x43, 0x5c, 0x0a,\n\t0x09, 0x52, 0x69, 0x61, 0x5a, 0x36, 0x45, 0x62, 0x54, 0x33, 0x61, 0x74, 0x42, 0x72, 0x67, 0x51, 0x35, 0x39, \n\t0x56, 0x47, 0x73, 0x69, 0x44, 0x59, 0x68, 0x57, 0x6b, 0x59, 0x57, 0x45, 0x44, 0x6d, 0x4f, 0x36, 0x49, 0x39, \n\t0x72, 0x77, 0x6b, 0x4c, 0x55, 0x4d, 0x43, 0x42, 0x38, 0x48, 0x6d, 0x67, 0x54, 0x54, 0x79, 0x47, 0x74, 0x59, \n\t0x77, 0x43, 0x76, 0x49, 0x55, 0x49, 0x6f, 0x66, 0x33, 0x2f, 0x36, 0x55, 0x53, 0x53, 0x62, 0x45, 0x50, 0x5c, 0x0a,\n\t0x09, 0x57, 0x58, 0x72, 0x77, 0x42, 0x6e, 0x6d, 0x34, 0x52, 0x44, 0x55, 0x52, 0x4f, 0x6b, 0x5a, 0x51, 0x41, \n\t0x2b, 0x6a, 0x66, 0x33, 0x61, 0x72, 0x5a, 0x57, 0x5a, 0x32, 0x61, 0x4d, 0x36, 0x4e, 0x34, 0x66, 0x4d, 0x7a, \n\t0x71, 0x35, 0x54, 0x46, 0x64, 0x64, 0x66, 0x4b, 0x6d, 0x65, 0x73, 0x4e, 0x77, 0x57, 0x4f, 0x2f, 0x65, 0x47, \n\t0x56, 0x68, 0x5a, 0x69, 0x67, 0x6d, 0x5a, 0x2b, 0x37, 0x6c, 0x75, 0x35, 0x48, 0x4c, 0x6b, 0x4f, 0x61, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x6f, 0x5a, 0x61, 0x6d, 0x6c, 0x32, 0x61, 0x50, 0x2f, 0x79, 0x74, 0x39, 0x61, 0x76, 0x67, 0x42, \n\t0x70, 0x4a, 0x4e, 0x69, 0x44, 0x5a, 0x6c, 0x78, 0x62, 0x49, 0x35, 0x4f, 0x74, 0x75, 0x55, 0x46, 0x63, 0x73, \n\t0x6d, 0x52, 0x4a, 0x75, 0x79, 0x59, 0x74, 0x6d, 0x45, 0x61, 0x46, 0x4e, 0x57, 0x4c, 0x50, 0x38, 0x66, 0x72, \n\t0x55, 0x63, 0x6a, 0x64, 0x33, 0x38, 0x6b, 0x77, 0x56, 0x59, 0x41, 0x41, 0x41, 0x41, 0x41, 0x53, 0x55, 0x5c, 0x0a,\n\t0x09, 0x56, 0x4f, 0x52, 0x4b, 0x35, 0x43, 0x59, 0x49, 0x49, 0x3d, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x40, 0x32, 0x78, 0x2e, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x52, 0x2e, 0x64, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x5b, 0x32, 0x5d, 0x2e, 0x6e, 0x6f, 0x72, \n\t0x6d, 0x61, 0x6c, 0x5f, 0x70, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x61, 0x74, \n\t0x61, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, \n\t0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x0a,\n\t0x09, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x53, \n\t0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x53, 0x49, 0x41, 0x41, 0x41, 0x47, 0x61, 0x43, 0x41, 0x59, \n\t0x41, 0x41, 0x41, 0x43, 0x72, 0x4a, 0x30, 0x36, 0x75, 0x41, 0x41, 0x41, 0x67, 0x41, 0x45, 0x6c, 0x45, 0x51, \n\t0x56, 0x52, 0x34, 0x6e, 0x4f, 0x79, 0x39, 0x65, 0x62, 0x67, 0x74, 0x78, 0x31, 0x58, 0x59, 0x2b, 0x36, 0x5c, 0x0a,\n\t0x09, 0x76, 0x65, 0x2b, 0x35, 0x78, 0x7a, 0x5a, 0x38, 0x33, 0x57, 0x69, 0x43, 0x52, 0x62, 0x74, 0x6d, 0x77, \n\t0x4e, 0x42, 0x47, 0x50, 0x4a, 0x46, 0x6a, 0x61, 0x65, 0x41, 0x44, 0x4d, 0x45, 0x59, 0x6f, 0x69, 0x4a, 0x6b, \n\t0x77, 0x63, 0x6b, 0x49, 0x59, 0x2f, 0x4a, 0x45, 0x46, 0x35, 0x49, 0x49, 0x48, 0x77, 0x42, 0x6b, 0x68, 0x41, \n\t0x77, 0x43, 0x55, 0x6b, 0x67, 0x30, 0x38, 0x74, 0x4c, 0x65, 0x49, 0x47, 0x51, 0x76, 0x44, 0x77, 0x53, 0x5c, 0x0a,\n\t0x09, 0x45, 0x69, 0x43, 0x4d, 0x42, 0x6d, 0x77, 0x4d, 0x4f, 0x4a, 0x34, 0x59, 0x50, 0x4f, 0x45, 0x52, 0x44, \n\t0x35, 0x49, 0x48, 0x32, 0x5a, 0x49, 0x73, 0x32, 0x35, 0x4b, 0x51, 0x64, 0x43, 0x58, 0x64, 0x71, 0x33, 0x76, \n\t0x76, 0x4f, 0x57, 0x64, 0x33, 0x72, 0x2f, 0x7a, 0x52, 0x56, 0x64, 0x32, 0x72, 0x56, 0x6c, 0x66, 0x33, 0x37, \n\t0x6a, 0x32, 0x64, 0x76, 0x63, 0x2b, 0x35, 0x65, 0x33, 0x33, 0x66, 0x76, 0x61, 0x65, 0x72, 0x71, 0x37, 0x5c, 0x0a,\n\t0x09, 0x71, 0x47, 0x37, 0x71, 0x37, 0x66, 0x58, 0x6d, 0x76, 0x56, 0x30, 0x45, 0x35, 0x45, 0x57, 0x4d, 0x74, \n\t0x61, 0x31, 0x72, 0x4b, 0x57, 0x5a, 0x55, 0x71, 0x32, 0x37, 0x41, 0x71, 0x73, 0x5a, 0x53, 0x31, 0x72, 0x57, \n\t0x63, 0x73, 0x61, 0x52, 0x47, 0x74, 0x5a, 0x79, 0x31, 0x71, 0x57, 0x4c, 0x6d, 0x73, 0x51, 0x72, 0x57, 0x55, \n\t0x74, 0x61, 0x31, 0x6d, 0x36, 0x72, 0x45, 0x47, 0x30, 0x6c, 0x72, 0x57, 0x73, 0x5a, 0x65, 0x6d, 0x79, 0x5c, 0x0a,\n\t0x09, 0x42, 0x74, 0x46, 0x61, 0x31, 0x72, 0x4b, 0x57, 0x70, 0x63, 0x73, 0x61, 0x52, 0x47, 0x74, 0x5a, 0x79, \n\t0x31, 0x71, 0x57, 0x4c, 0x6d, 0x73, 0x51, 0x72, 0x57, 0x55, 0x74, 0x61, 0x31, 0x6d, 0x36, 0x72, 0x45, 0x47, \n\t0x30, 0x6c, 0x72, 0x57, 0x73, 0x5a, 0x65, 0x6d, 0x79, 0x42, 0x74, 0x46, 0x61, 0x31, 0x72, 0x4b, 0x57, 0x70, \n\t0x63, 0x73, 0x61, 0x52, 0x47, 0x74, 0x5a, 0x79, 0x31, 0x71, 0x57, 0x4c, 0x73, 0x4e, 0x6c, 0x56, 0x32, 0x5c, 0x0a,\n\t0x09, 0x41, 0x74, 0x61, 0x31, 0x6c, 0x6c, 0x47, 0x58, 0x33, 0x30, 0x4a, 0x63, 0x6e, 0x7a, 0x77, 0x32, 0x65, \n\t0x2b, 0x64, 0x59, 0x39, 0x72, 0x63, 0x72, 0x43, 0x6c, 0x4e, 0x34, 0x69, 0x63, 0x63, 0x34, 0x75, 0x73, 0x78, \n\t0x31, 0x72, 0x57, 0x73, 0x6e, 0x4b, 0x79, 0x65, 0x39, 0x65, 0x4c, 0x77, 0x2b, 0x47, 0x33, 0x41, 0x6a, 0x38, \n\t0x42, 0x50, 0x41, 0x41, 0x38, 0x47, 0x79, 0x6a, 0x61, 0x2b, 0x73, 0x50, 0x4f, 0x50, 0x64, 0x38, 0x56, 0x5c, 0x0a,\n\t0x09, 0x68, 0x54, 0x65, 0x76, 0x2f, 0x35, 0x6e, 0x46, 0x56, 0x58, 0x41, 0x66, 0x53, 0x4e, 0x2b, 0x31, 0x72, \n\t0x47, 0x75, 0x4e, 0x61, 0x43, 0x31, 0x72, 0x53, 0x59, 0x69, 0x43, 0x30, 0x49, 0x38, 0x41, 0x50, 0x2b, 0x61, \n\t0x50, 0x4c, 0x77, 0x4e, 0x75, 0x42, 0x66, 0x37, 0x55, 0x70, 0x6a, 0x63, 0x41, 0x2b, 0x6d, 0x62, 0x67, 0x43, \n\t0x34, 0x44, 0x76, 0x58, 0x31, 0x77, 0x4e, 0x44, 0x35, 0x61, 0x73, 0x66, 0x55, 0x52, 0x72, 0x57, 0x59, 0x5c, 0x0a,\n\t0x09, 0x73, 0x52, 0x42, 0x61, 0x47, 0x2f, 0x51, 0x51, 0x32, 0x68, 0x49, 0x42, 0x64, 0x33, 0x58, 0x4f, 0x71, \n\t0x41, 0x6e, 0x77, 0x62, 0x2b, 0x4b, 0x33, 0x44, 0x46, 0x2f, 0x47, 0x74, 0x32, 0x63, 0x47, 0x55, 0x4e, 0x6f, \n\t0x72, 0x57, 0x73, 0x52, 0x59, 0x6d, 0x43, 0x30, 0x49, 0x33, 0x41, 0x66, 0x30, 0x67, 0x6b, 0x4f, 0x57, 0x4a, \n\t0x50, 0x4b, 0x47, 0x33, 0x6f, 0x4a, 0x34, 0x41, 0x51, 0x75, 0x47, 0x76, 0x65, 0x64, 0x54, 0x76, 0x49, 0x5c, 0x0a,\n\t0x09, 0x73, 0x67, 0x62, 0x52, 0x57, 0x74, 0x62, 0x53, 0x6c, 0x43, 0x48, 0x77, 0x43, 0x79, 0x53, 0x67, 0x41, \n\t0x7a, 0x79, 0x68, 0x41, 0x77, 0x70, 0x43, 0x58, 0x77, 0x76, 0x38, 0x67, 0x49, 0x72, 0x36, 0x38, 0x45, 0x4a, \n\t0x71, 0x64, 0x6b, 0x42, 0x6c, 0x37, 0x53, 0x4e, 0x61, 0x79, 0x31, 0x71, 0x38, 0x4b, 0x47, 0x33, 0x6f, 0x65, \n\t0x34, 0x48, 0x62, 0x57, 0x70, 0x4b, 0x64, 0x54, 0x4a, 0x79, 0x37, 0x45, 0x76, 0x6a, 0x2f, 0x7a, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x50, 0x64, 0x70, 0x57, 0x31, 0x38, 0x2f, 0x42, 0x2f, 0x62, 0x70, 0x7a, 0x62, 0x76, 0x50, 0x54, \n\t0x62, 0x75, 0x79, 0x74, 0x34, 0x67, 0x47, 0x55, 0x4e, 0x6f, 0x72, 0x57, 0x73, 0x4a, 0x5a, 0x62, 0x50, 0x41, \n\t0x31, 0x37, 0x64, 0x45, 0x66, 0x2b, 0x5a, 0x63, 0x4b, 0x43, 0x30, 0x6f, 0x5a, 0x38, 0x43, 0x4c, 0x6c, 0x56, \n\t0x70, 0x63, 0x75, 0x42, 0x6a, 0x62, 0x52, 0x6b, 0x6f, 0x43, 0x4a, 0x30, 0x41, 0x76, 0x74, 0x4f, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x7a, 0x63, 0x54, 0x31, 0x2f, 0x51, 0x41, 0x79, 0x64, 0x6f, 0x30, 0x57, 0x38, 0x74, 0x61, 0x69, \n\t0x4c, 0x53, 0x68, 0x66, 0x77, 0x30, 0x63, 0x62, 0x55, 0x6e, 0x32, 0x4f, 0x50, 0x41, 0x59, 0x52, 0x42, 0x44, \n\t0x36, 0x47, 0x75, 0x44, 0x72, 0x54, 0x62, 0x70, 0x50, 0x41, 0x4c, 0x75, 0x70, 0x44, 0x42, 0x53, 0x45, 0x6e, \n\t0x67, 0x64, 0x38, 0x45, 0x50, 0x67, 0x58, 0x72, 0x42, 0x57, 0x43, 0x4e, 0x59, 0x6a, 0x57, 0x73, 0x68, 0x5c, 0x0a,\n\t0x09, 0x59, 0x6c, 0x7a, 0x77, 0x66, 0x2b, 0x63, 0x6b, 0x66, 0x38, 0x70, 0x77, 0x41, 0x32, 0x6e, 0x76, 0x55, \n\t0x48, 0x49, 0x62, 0x78, 0x46, 0x71, 0x51, 0x31, 0x5a, 0x75, 0x51, 0x75, 0x61, 0x63, 0x34, 0x67, 0x55, 0x68, \n\t0x4c, 0x34, 0x63, 0x65, 0x41, 0x74, 0x77, 0x72, 0x51, 0x2f, 0x2f, 0x35, 0x68, 0x52, 0x31, 0x50, 0x56, 0x43, \n\t0x79, 0x42, 0x74, 0x46, 0x61, 0x7a, 0x6e, 0x74, 0x52, 0x32, 0x74, 0x43, 0x2f, 0x47, 0x70, 0x50, 0x30, 0x5c, 0x0a,\n\t0x09, 0x49, 0x78, 0x42, 0x70, 0x51, 0x33, 0x38, 0x62, 0x75, 0x4c, 0x34, 0x74, 0x6e, 0x52, 0x59, 0x46, 0x6f, \n\t0x52, 0x64, 0x54, 0x67, 0x75, 0x65, 0x77, 0x44, 0x33, 0x2b, 0x4d, 0x4d, 0x66, 0x36, 0x6b, 0x38, 0x30, 0x48, \n\t0x57, 0x49, 0x46, 0x72, 0x4c, 0x65, 0x53, 0x30, 0x4b, 0x51, 0x6c, 0x38, 0x48, 0x76, 0x47, 0x42, 0x4d, 0x38, \n\t0x6a, 0x76, 0x56, 0x38, 0x61, 0x58, 0x41, 0x50, 0x32, 0x78, 0x4a, 0x46, 0x77, 0x33, 0x64, 0x4b, 0x77, 0x5c, 0x0a,\n\t0x09, 0x68, 0x39, 0x50, 0x76, 0x44, 0x62, 0x31, 0x42, 0x41, 0x43, 0x2b, 0x43, 0x30, 0x34, 0x76, 0x78, 0x33, \n\t0x56, 0x73, 0x41, 0x62, 0x52, 0x57, 0x74, 0x59, 0x43, 0x35, 0x55, 0x54, 0x45, 0x56, 0x2f, 0x64, 0x49, 0x39, \n\t0x32, 0x48, 0x4a, 0x71, 0x68, 0x48, 0x39, 0x48, 0x77, 0x59, 0x75, 0x61, 0x45, 0x6c, 0x58, 0x61, 0x55, 0x51, \n\t0x4b, 0x51, 0x70, 0x64, 0x53, 0x51, 0x75, 0x69, 0x45, 0x53, 0x58, 0x76, 0x65, 0x6d, 0x32, 0x57, 0x77, 0x5c, 0x0a,\n\t0x09, 0x42, 0x74, 0x46, 0x61, 0x7a, 0x6d, 0x4e, 0x52, 0x32, 0x74, 0x42, 0x66, 0x6f, 0x56, 0x78, 0x44, 0x4e, \n\t0x6b, 0x37, 0x65, 0x51, 0x33, 0x59, 0x55, 0x79, 0x75, 0x48, 0x36, 0x37, 0x2b, 0x78, 0x49, 0x5a, 0x79, 0x63, \n\t0x7a, 0x44, 0x6f, 0x46, 0x66, 0x41, 0x36, 0x34, 0x7a, 0x35, 0x78, 0x38, 0x42, 0x33, 0x74, 0x36, 0x6a, 0x33, \n\t0x41, 0x4d, 0x76, 0x61, 0x78, 0x43, 0x74, 0x35, 0x58, 0x77, 0x58, 0x52, 0x37, 0x75, 0x4a, 0x70, 0x65, 0x5c, 0x0a,\n\t0x09, 0x56, 0x68, 0x63, 0x59, 0x66, 0x75, 0x49, 0x7a, 0x73, 0x47, 0x38, 0x4b, 0x50, 0x41, 0x6f, 0x5a, 0x5a, \n\t0x30, 0x6e, 0x77, 0x5a, 0x4f, 0x51, 0x36, 0x51, 0x4e, 0x2f, 0x54, 0x69, 0x6c, 0x62, 0x38, 0x6a, 0x4b, 0x61, \n\t0x79, 0x6d, 0x48, 0x37, 0x73, 0x39, 0x37, 0x57, 0x59, 0x4e, 0x6f, 0x4c, 0x65, 0x65, 0x37, 0x66, 0x42, 0x32, \n\t0x6c, 0x37, 0x32, 0x61, 0x63, 0x76, 0x49, 0x76, 0x73, 0x45, 0x47, 0x53, 0x48, 0x72, 0x36, 0x56, 0x63, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x64, 0x38, 0x6d, 0x70, 0x54, 0x5a, 0x30, 0x37, 0x50, 0x59, 0x51, 0x2f, 0x68, 0x72, 0x67, 0x42, \n\t0x31, 0x76, 0x53, 0x2f, 0x69, 0x61, 0x73, 0x2f, 0x55, 0x4f, 0x77, 0x6e, 0x72, 0x2b, 0x77, 0x46, 0x69, 0x58, \n\t0x46, 0x75, 0x79, 0x2f, 0x30, 0x52, 0x30, 0x4b, 0x70, 0x4b, 0x46, 0x44, 0x2b, 0x31, 0x54, 0x74, 0x65, 0x4f, \n\t0x46, 0x66, 0x48, 0x4f, 0x34, 0x67, 0x6a, 0x51, 0x7a, 0x77, 0x71, 0x7a, 0x71, 0x52, 0x31, 0x4a, 0x68, 0x5c, 0x0a,\n\t0x09, 0x32, 0x4f, 0x37, 0x4e, 0x59, 0x48, 0x35, 0x74, 0x65, 0x49, 0x6e, 0x71, 0x4c, 0x4d, 0x73, 0x6e, 0x2f, \n\t0x55, 0x38, 0x35, 0x4c, 0x33, 0x34, 0x41, 0x35, 0x42, 0x75, 0x61, 0x4a, 0x2b, 0x6f, 0x79, 0x50, 0x64, 0x52, \n\t0x78, 0x67, 0x63, 0x44, 0x38, 0x64, 0x58, 0x55, 0x69, 0x36, 0x41, 0x54, 0x63, 0x6b, 0x32, 0x38, 0x49, 0x61, \n\t0x65, 0x5a, 0x52, 0x39, 0x34, 0x57, 0x59, 0x50, 0x6f, 0x50, 0x4a, 0x4c, 0x69, 0x58, 0x63, 0x65, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x41, 0x49, 0x50, 0x55, 0x68, 0x77, 0x41, 0x69, 0x34, 0x4e, 0x77, 0x51, 0x33, 0x4d, 0x55, 0x67, 0x46, \n\t0x30, 0x46, 0x32, 0x49, 0x59, 0x34, 0x4c, 0x67, 0x59, 0x75, 0x41, 0x43, 0x33, 0x48, 0x75, 0x51, 0x75, 0x42, \n\t0x51, 0x43, 0x52, 0x53, 0x35, 0x55, 0x43, 0x6e, 0x55, 0x78, 0x77, 0x43, 0x48, 0x63, 0x36, 0x64, 0x38, 0x66, \n\t0x75, 0x66, 0x41, 0x6e, 0x66, 0x4f, 0x5a, 0x6e, 0x38, 0x4a, 0x4a, 0x44, 0x74, 0x6c, 0x6a, 0x4f, 0x42, 0x5c, 0x0a,\n\t0x09, 0x34, 0x42, 0x54, 0x75, 0x4c, 0x63, 0x6f, 0x38, 0x43, 0x6a, 0x34, 0x45, 0x36, 0x43, 0x62, 0x42, 0x63, \n\t0x66, 0x75, 0x69, 0x49, 0x42, 0x4b, 0x43, 0x4b, 0x6f, 0x5a, 0x63, 0x2f, 0x36, 0x37, 0x48, 0x78, 0x76, 0x52, \n\t0x69, 0x6c, 0x66, 0x42, 0x6a, 0x79, 0x6e, 0x5a, 0x39, 0x70, 0x33, 0x4d, 0x37, 0x7a, 0x34, 0x53, 0x75, 0x42, \n\t0x56, 0x59, 0x39, 0x4c, 0x64, 0x68, 0x64, 0x75, 0x43, 0x73, 0x6b, 0x58, 0x2f, 0x50, 0x33, 0x42, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x53, 0x37, 0x6f, 0x33, 0x34, 0x6b, 0x32, 0x34, 0x74, 0x61, 0x78, 0x42, 0x64, 0x43, 0x43, 0x6c, 0x65, \n\t0x47, 0x66, 0x4a, 0x68, 0x59, 0x59, 0x49, 0x34, 0x47, 0x51, 0x54, 0x73, 0x6d, 0x63, 0x42, 0x4e, 0x34, 0x43, \n\t0x37, 0x46, 0x69, 0x66, 0x58, 0x55, 0x45, 0x36, 0x73, 0x75, 0x78, 0x62, 0x6e, 0x72, 0x71, 0x58, 0x63, 0x76, \n\t0x69, 0x49, 0x72, 0x72, 0x79, 0x39, 0x41, 0x4d, 0x67, 0x73, 0x71, 0x66, 0x2b, 0x7a, 0x41, 0x46, 0x55, 0x5c, 0x0a,\n\t0x09, 0x54, 0x57, 0x66, 0x59, 0x67, 0x76, 0x79, 0x36, 0x6e, 0x72, 0x49, 0x43, 0x35, 0x53, 0x6a, 0x75, 0x70, \n\t0x38, 0x42, 0x48, 0x42, 0x6e, 0x63, 0x44, 0x77, 0x41, 0x33, 0x49, 0x64, 0x7a, 0x39, 0x77, 0x48, 0x33, 0x52, \n\t0x63, 0x65, 0x4f, 0x65, 0x78, 0x48, 0x4f, 0x46, 0x48, 0x64, 0x64, 0x54, 0x61, 0x79, 0x46, 0x4f, 0x58, 0x43, \n\t0x4f, 0x37, 0x4d, 0x5a, 0x37, 0x4a, 0x37, 0x34, 0x2f, 0x53, 0x68, 0x75, 0x61, 0x5a, 0x4c, 0x2b, 0x67, 0x5c, 0x0a,\n\t0x09, 0x39, 0x77, 0x42, 0x2f, 0x68, 0x33, 0x62, 0x66, 0x55, 0x4a, 0x41, 0x37, 0x79, 0x51, 0x34, 0x44, 0x66, \n\t0x41, 0x2f, 0x77, 0x6c, 0x52, 0x33, 0x70, 0x31, 0x73, 0x50, 0x32, 0x53, 0x6c, 0x7a, 0x66, 0x48, 0x64, 0x54, \n\t0x57, 0x4f, 0x7a, 0x53, 0x75, 0x72, 0x75, 0x54, 0x76, 0x4f, 0x47, 0x37, 0x4f, 0x43, 0x4d, 0x34, 0x78, 0x67, \n\t0x4f, 0x78, 0x6d, 0x6b, 0x46, 0x75, 0x41, 0x6d, 0x79, 0x6b, 0x33, 0x39, 0x4c, 0x6f, 0x5a, 0x78, 0x39, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x42, 0x51, 0x51, 0x51, 0x51, 0x70, 0x39, 0x34, 0x42, 0x5a, 0x39, 0x32, 0x47, 0x51, 0x73, 0x57, \n\t0x6c, 0x4b, 0x6f, 0x33, 0x57, 0x57, 0x6e, 0x78, 0x38, 0x4b, 0x6d, 0x78, 0x4e, 0x74, 0x38, 0x68, 0x73, 0x30, \n\t0x2f, 0x6d, 0x6b, 0x54, 0x4c, 0x59, 0x6f, 0x2f, 0x62, 0x32, 0x51, 0x66, 0x52, 0x67, 0x6e, 0x48, 0x34, 0x48, \n\t0x73, 0x77, 0x38, 0x43, 0x48, 0x63, 0x64, 0x6d, 0x64, 0x49, 0x4b, 0x65, 0x72, 0x61, 0x35, 0x58, 0x70, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x39, 0x31, 0x77, 0x44, 0x31, 0x33, 0x69, 0x51, 0x58, 0x51, 0x72, 0x35, 0x52, 0x4b, 0x4c, 0x50, \n\t0x6e, 0x4b, 0x2f, 0x48, 0x4c, 0x72, 0x35, 0x4a, 0x75, 0x42, 0x2b, 0x32, 0x6f, 0x66, 0x73, 0x67, 0x7a, 0x79, \n\t0x46, 0x59, 0x37, 0x64, 0x66, 0x43, 0x48, 0x79, 0x41, 0x65, 0x4c, 0x36, 0x51, 0x6c, 0x61, 0x75, 0x42, 0x7a, \n\t0x78, 0x35, 0x30, 0x45, 0x4b, 0x31, 0x33, 0x61, 0x44, 0x7a, 0x41, 0x30, 0x67, 0x51, 0x50, 0x55, 0x50, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x6a, 0x37, 0x67, 0x43, 0x65, 0x44, 0x2b, 0x34, 0x4f, 0x6b, 0x4f, 0x64, 0x43, 0x63, 0x61, 0x53, \n\t0x45, 0x67, 0x6e, 0x6f, 0x5a, 0x4b, 0x6b, 0x56, 0x46, 0x61, 0x54, 0x50, 0x69, 0x61, 0x68, 0x68, 0x4a, 0x59, \n\t0x57, 0x41, 0x30, 0x6f, 0x57, 0x61, 0x6b, 0x77, 0x77, 0x33, 0x4e, 0x53, 0x47, 0x74, 0x4d, 0x78, 0x4a, 0x70, \n\t0x52, 0x70, 0x54, 0x58, 0x70, 0x76, 0x4b, 0x76, 0x30, 0x31, 0x2b, 0x47, 0x4b, 0x36, 0x35, 0x44, 0x73, 0x5c, 0x0a,\n\t0x09, 0x71, 0x2b, 0x75, 0x38, 0x43, 0x33, 0x44, 0x5a, 0x76, 0x54, 0x6a, 0x2b, 0x42, 0x48, 0x67, 0x58, 0x75, \n\t0x4c, 0x66, 0x6a, 0x65, 0x43, 0x2f, 0x43, 0x6d, 0x65, 0x4c, 0x75, 0x70, 0x39, 0x5a, 0x6c, 0x4f, 0x6b, 0x66, \n\t0x32, 0x74, 0x4c, 0x75, 0x72, 0x31, 0x6b, 0x79, 0x70, 0x44, 0x66, 0x30, 0x52, 0x38, 0x42, 0x32, 0x4d, 0x68, \n\t0x39, 0x42, 0x4a, 0x6a, 0x74, 0x33, 0x2b, 0x43, 0x50, 0x44, 0x72, 0x64, 0x45, 0x50, 0x6f, 0x33, 0x63, 0x5c, 0x0a,\n\t0x09, 0x42, 0x43, 0x62, 0x4d, 0x33, 0x39, 0x4b, 0x6d, 0x73, 0x51, 0x37, 0x51, 0x50, 0x4a, 0x33, 0x33, 0x35, \n\t0x4d, 0x68, 0x53, 0x52, 0x30, 0x77, 0x71, 0x75, 0x42, 0x72, 0x36, 0x42, 0x63, 0x74, 0x2f, 0x54, 0x46, 0x31, \n\t0x4f, 0x75, 0x57, 0x79, 0x6c, 0x54, 0x69, 0x63, 0x45, 0x36, 0x6f, 0x67, 0x54, 0x4d, 0x4c, 0x6a, 0x48, 0x78, \n\t0x61, 0x44, 0x53, 0x4d, 0x32, 0x6a, 0x45, 0x59, 0x6a, 0x49, 0x43, 0x4e, 0x71, 0x71, 0x4d, 0x77, 0x64, 0x5c, 0x0a,\n\t0x09, 0x52, 0x6d, 0x57, 0x65, 0x6b, 0x71, 0x6d, 0x38, 0x69, 0x2b, 0x73, 0x67, 0x75, 0x77, 0x37, 0x48, 0x4b, \n\t0x78, 0x45, 0x42, 0x58, 0x49, 0x37, 0x6a, 0x67, 0x2b, 0x44, 0x65, 0x41, 0x62, 0x77, 0x54, 0x35, 0x39, 0x34, \n\t0x43, 0x63, 0x6b, 0x2f, 0x78, 0x79, 0x52, 0x74, 0x38, 0x66, 0x6f, 0x35, 0x69, 0x39, 0x79, 0x78, 0x53, 0x48, \n\t0x4c, 0x34, 0x4b, 0x2b, 0x4b, 0x75, 0x39, 0x62, 0x6e, 0x37, 0x5a, 0x76, 0x6a, 0x38, 0x47, 0x2f, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x36, 0x50, 0x68, 0x42, 0x2b, 0x6d, 0x58, 0x50, 0x62, 0x78, 0x77, 0x6a, 0x48, 0x70, 0x31, 0x71, 0x4e, \n\t0x6c, 0x52, 0x74, 0x59, 0x67, 0x57, 0x6c, 0x47, 0x4a, 0x34, 0x51, 0x4f, 0x55, 0x4b, 0x38, 0x4a, 0x66, 0x43, \n\t0x75, 0x34, 0x72, 0x63, 0x50, 0x49, 0x79, 0x4b, 0x47, 0x34, 0x65, 0x4e, 0x2f, 0x74, 0x69, 0x59, 0x68, 0x68, \n\t0x46, 0x46, 0x32, 0x73, 0x59, 0x75, 0x66, 0x4c, 0x34, 0x78, 0x4a, 0x66, 0x44, 0x34, 0x4d, 0x4c, 0x79, 0x5c, 0x0a,\n\t0x09, 0x32, 0x47, 0x58, 0x2b, 0x2f, 0x4e, 0x41, 0x66, 0x44, 0x79, 0x44, 0x7a, 0x66, 0x38, 0x6c, 0x41, 0x64, \n\t0x76, 0x31, 0x35, 0x41, 0x64, 0x6e, 0x78, 0x2f, 0x37, 0x61, 0x68, 0x32, 0x43, 0x37, 0x2f, 0x68, 0x6e, 0x2f, \n\t0x46, 0x45, 0x31, 0x41, 0x38, 0x44, 0x76, 0x6c, 0x6a, 0x35, 0x54, 0x56, 0x39, 0x59, 0x42, 0x53, 0x30, 0x74, \n\t0x4b, 0x41, 0x5a, 0x42, 0x64, 0x4e, 0x52, 0x47, 0x41, 0x44, 0x50, 0x78, 0x68, 0x58, 0x50, 0x68, 0x75, 0x5c, 0x0a,\n\t0x09, 0x79, 0x37, 0x2f, 0x48, 0x57, 0x66, 0x77, 0x50, 0x45, 0x47, 0x63, 0x50, 0x38, 0x4c, 0x78, 0x35, 0x74, \n\t0x78, 0x6f, 0x35, 0x4f, 0x55, 0x73, 0x4f, 0x67, 0x61, 0x2b, 0x59, 0x70, 0x76, 0x78, 0x65, 0x61, 0x31, 0x78, \n\t0x7a, 0x43, 0x67, 0x54, 0x30, 0x70, 0x32, 0x35, 0x44, 0x50, 0x41, 0x50, 0x2b, 0x32, 0x52, 0x35, 0x57, 0x2f, \n\t0x33, 0x4c, 0x66, 0x74, 0x38, 0x6b, 0x62, 0x57, 0x50, 0x61, 0x49, 0x55, 0x6b, 0x41, 0x5a, 0x2b, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x67, 0x56, 0x64, 0x51, 0x62, 0x6a, 0x50, 0x78, 0x4d, 0x6d, 0x43, 0x7a, 0x69, 0x71, 0x6e, 0x38, 0x4f, \n\t0x75, 0x4f, 0x6e, 0x67, 0x72, 0x6b, 0x6f, 0x72, 0x58, 0x6e, 0x65, 0x31, 0x57, 0x4d, 0x4e, 0x66, 0x68, 0x30, \n\t0x62, 0x72, 0x2f, 0x4c, 0x50, 0x6a, 0x73, 0x43, 0x4a, 0x4c, 0x34, 0x48, 0x73, 0x4b, 0x4c, 0x69, 0x42, 0x67, \n\t0x74, 0x47, 0x67, 0x2f, 0x4d, 0x65, 0x67, 0x42, 0x45, 0x62, 0x79, 0x75, 0x49, 0x53, 0x58, 0x49, 0x36, 0x5c, 0x0a,\n\t0x09, 0x54, 0x4e, 0x61, 0x6f, 0x43, 0x46, 0x76, 0x47, 0x51, 0x48, 0x79, 0x52, 0x2b, 0x48, 0x34, 0x6e, 0x51, \n\t0x4a, 0x70, 0x76, 0x77, 0x68, 0x47, 0x44, 0x30, 0x45, 0x6f, 0x38, 0x39, 0x42, 0x63, 0x55, 0x62, 0x35, 0x6a, \n\t0x4c, 0x4a, 0x6d, 0x2b, 0x31, 0x33, 0x51, 0x31, 0x72, 0x54, 0x50, 0x4b, 0x4d, 0x51, 0x46, 0x48, 0x31, 0x52, \n\t0x57, 0x34, 0x4e, 0x78, 0x37, 0x38, 0x33, 0x4f, 0x58, 0x33, 0x34, 0x6f, 0x66, 0x69, 0x2b, 0x38, 0x68, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x38, 0x75, 0x68, 0x6d, 0x2b, 0x2b, 0x6d, 0x7a, 0x2b, 0x6a, 0x61, 0x6b, 0x56, 0x76, 0x76, 0x49, \n\t0x6a, 0x76, 0x30, 0x72, 0x44, 0x47, 0x70, 0x37, 0x73, 0x55, 0x76, 0x6c, 0x44, 0x30, 0x66, 0x4e, 0x4b, 0x4b, \n\t0x31, 0x6a, 0x32, 0x69, 0x66, 0x53, 0x41, 0x49, 0x2b, 0x54, 0x36, 0x45, 0x45, 0x7a, 0x79, 0x75, 0x42, 0x6c, \n\t0x39, 0x44, 0x32, 0x6a, 0x43, 0x70, 0x54, 0x71, 0x6b, 0x57, 0x6a, 0x30, 0x55, 0x6b, 0x6e, 0x30, 0x59, 0x5c, 0x0a,\n\t0x09, 0x79, 0x30, 0x69, 0x51, 0x61, 0x78, 0x5a, 0x6c, 0x53, 0x63, 0x67, 0x56, 0x4e, 0x2f, 0x42, 0x43, 0x64, \n\t0x65, 0x53, 0x72, 0x6b, 0x44, 0x68, 0x6e, 0x69, 0x41, 0x2b, 0x4c, 0x53, 0x4f, 0x30, 0x6e, 0x52, 0x4b, 0x48, \n\t0x67, 0x4d, 0x69, 0x70, 0x57, 0x55, 0x6c, 0x6f, 0x57, 0x43, 0x70, 0x34, 0x78, 0x42, 0x77, 0x6d, 0x37, 0x67, \n\t0x4e, 0x50, 0x32, 0x69, 0x6e, 0x41, 0x65, 0x55, 0x79, 0x4b, 0x4d, 0x34, 0x69, 0x6f, 0x34, 0x64, 0x67, 0x5c, 0x0a,\n\t0x09, 0x39, 0x47, 0x41, 0x4a, 0x70, 0x74, 0x33, 0x37, 0x59, 0x50, 0x52, 0x70, 0x79, 0x6f, 0x6e, 0x4a, 0x57, \n\t0x6a, 0x50, 0x79, 0x4a, 0x68, 0x34, 0x6f, 0x45, 0x79, 0x37, 0x4d, 0x5a, 0x53, 0x6f, 0x79, 0x47, 0x52, 0x32, \n\t0x37, 0x58, 0x64, 0x46, 0x33, 0x76, 0x41, 0x79, 0x4f, 0x33, 0x30, 0x58, 0x70, 0x65, 0x2b, 0x75, 0x57, 0x34, \n\t0x63, 0x58, 0x30, 0x67, 0x42, 0x43, 0x73, 0x7a, 0x62, 0x4b, 0x6b, 0x72, 0x45, 0x47, 0x30, 0x4a, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x66, 0x35, 0x74, 0x63, 0x2b, 0x69, 0x6f, 0x43, 0x54, 0x51, 0x35, 0x54, 0x77, 0x2b, 0x56, 0x62, \n\t0x67, 0x53, 0x2b, 0x67, 0x37, 0x34, 0x33, 0x30, 0x5a, 0x4d, 0x4d, 0x6f, 0x66, 0x68, 0x39, 0x50, 0x76, 0x67, \n\t0x47, 0x4d, 0x76, 0x6f, 0x4c, 0x4a, 0x75, 0x31, 0x4a, 0x53, 0x6b, 0x47, 0x43, 0x7a, 0x44, 0x69, 0x6a, 0x64, \n\t0x6b, 0x41, 0x67, 0x78, 0x42, 0x63, 0x73, 0x54, 0x48, 0x4f, 0x58, 0x30, 0x4e, 0x4b, 0x67, 0x38, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x41, 0x53, 0x79, 0x77, 0x37, 0x6a, 0x4e, 0x70, 0x38, 0x48, 0x6d, 0x30, 0x35, 0x55, 0x47, 0x4a, \n\t0x72, 0x42, 0x37, 0x48, 0x37, 0x4a, 0x37, 0x44, 0x2b, 0x7a, 0x63, 0x41, 0x7a, 0x75, 0x66, 0x67, 0x4f, 0x4a, \n\t0x6b, 0x4a, 0x34, 0x77, 0x6b, 0x54, 0x32, 0x31, 0x44, 0x33, 0x58, 0x48, 0x66, 0x42, 0x70, 0x65, 0x31, 0x62, \n\t0x5a, 0x4a, 0x57, 0x69, 0x78, 0x76, 0x43, 0x31, 0x6e, 0x6a, 0x4c, 0x7a, 0x63, 0x76, 0x61, 0x4c, 0x45, 0x5c, 0x0a,\n\t0x09, 0x76, 0x49, 0x47, 0x6b, 0x52, 0x37, 0x4b, 0x50, 0x6e, 0x62, 0x39, 0x4d, 0x78, 0x6c, 0x41, 0x62, 0x67, \n\t0x64, 0x33, 0x4c, 0x63, 0x69, 0x38, 0x6b, 0x32, 0x34, 0x73, 0x53, 0x4d, 0x79, 0x61, 0x5a, 0x6b, 0x61, 0x52, \n\t0x6b, 0x59, 0x72, 0x45, 0x48, 0x4f, 0x71, 0x41, 0x53, 0x4d, 0x56, 0x76, 0x2f, 0x73, 0x67, 0x6e, 0x48, 0x6b, \n\t0x2f, 0x48, 0x50, 0x31, 0x43, 0x45, 0x50, 0x38, 0x4b, 0x52, 0x54, 0x44, 0x79, 0x51, 0x2f, 0x67, 0x79, 0x5c, 0x0a,\n\t0x09, 0x71, 0x6f, 0x46, 0x52, 0x41, 0x4e, 0x6b, 0x49, 0x5a, 0x4f, 0x44, 0x54, 0x6a, 0x68, 0x41, 0x33, 0x78, \n\t0x47, 0x6e, 0x56, 0x33, 0x59, 0x6b, 0x48, 0x38, 0x37, 0x42, 0x32, 0x63, 0x73, 0x73, 0x67, 0x72, 0x71, 0x63, \n\t0x54, 0x56, 0x55, 0x34, 0x47, 0x47, 0x30, 0x2f, 0x44, 0x62, 0x64, 0x34, 0x41, 0x78, 0x37, 0x77, 0x4a, 0x57, \n\t0x4a, 0x78, 0x43, 0x74, 0x75, 0x2b, 0x43, 0x6e, 0x51, 0x2f, 0x42, 0x39, 0x6f, 0x63, 0x39, 0x6d, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x70, 0x37, 0x49, 0x38, 0x55, 0x6d, 0x49, 0x72, 0x31, 0x64, 0x51, 0x2b, 0x41, 0x32, 0x49, 0x44, 0x74, \n\t0x30, 0x38, 0x39, 0x68, 0x30, 0x6d, 0x39, 0x65, 0x55, 0x64, 0x52, 0x34, 0x76, 0x6a, 0x77, 0x4e, 0x76, 0x37, \n\t0x56, 0x2b, 0x42, 0x38, 0x30, 0x66, 0x57, 0x49, 0x4e, 0x6f, 0x44, 0x79, 0x66, 0x2f, 0x34, 0x45, 0x6b, 0x71, \n\t0x6e, 0x72, 0x59, 0x43, 0x54, 0x34, 0x2b, 0x43, 0x2b, 0x42, 0x66, 0x67, 0x4f, 0x6b, 0x46, 0x76, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x46, 0x47, 0x45, 0x34, 0x65, 0x73, 0x6f, 0x43, 0x70, 0x6f, 0x4b, 0x52, 0x4a, 0x55, 0x38, 0x34, 0x31, \n\t0x54, 0x4b, 0x53, 0x5a, 0x6b, 0x66, 0x4e, 0x74, 0x6a, 0x38, 0x46, 0x67, 0x32, 0x4e, 0x77, 0x36, 0x42, 0x6c, \n\t0x70, 0x47, 0x45, 0x45, 0x4d, 0x46, 0x6f, 0x69, 0x56, 0x73, 0x51, 0x68, 0x47, 0x75, 0x54, 0x39, 0x5a, 0x51, \n\t0x77, 0x6f, 0x33, 0x38, 0x4e, 0x65, 0x47, 0x50, 0x4e, 0x56, 0x78, 0x42, 0x4c, 0x31, 0x52, 0x44, 0x53, 0x5c, 0x0a,\n\t0x09, 0x73, 0x48, 0x5a, 0x4d, 0x64, 0x78, 0x52, 0x2b, 0x36, 0x41, 0x49, 0x79, 0x38, 0x6f, 0x38, 0x78, 0x68, \n\t0x39, 0x44, 0x74, 0x6e, 0x2b, 0x45, 0x4f, 0x78, 0x38, 0x42, 0x44, 0x6e, 0x7a, 0x75, 0x65, 0x37, 0x37, 0x61, \n\t0x4f, 0x2f, 0x56, 0x38, 0x43, 0x49, 0x59, 0x64, 0x30, 0x4d, 0x48, 0x78, 0x32, 0x44, 0x6a, 0x30, 0x73, 0x34, \n\t0x6b, 0x53, 0x6c, 0x35, 0x50, 0x79, 0x78, 0x61, 0x79, 0x35, 0x37, 0x75, 0x73, 0x51, 0x62, 0x52, 0x41, 0x5c, 0x0a,\n\t0x09, 0x79, 0x66, 0x2f, 0x49, 0x7a, 0x2b, 0x34, 0x58, 0x77, 0x4c, 0x6e, 0x72, 0x51, 0x62, 0x34, 0x48, 0x2b, \n\t0x48, 0x62, 0x67, 0x52, 0x4e, 0x4d, 0x65, 0x57, 0x51, 0x61, 0x4d, 0x4c, 0x44, 0x6d, 0x59, 0x44, 0x45, 0x5a, \n\t0x6e, 0x50, 0x6c, 0x51, 0x36, 0x73, 0x44, 0x65, 0x76, 0x38, 0x61, 0x61, 0x50, 0x4e, 0x61, 0x6b, 0x47, 0x5a, \n\t0x56, 0x34, 0x79, 0x69, 0x6d, 0x48, 0x6b, 0x55, 0x47, 0x6c, 0x48, 0x69, 0x42, 0x76, 0x45, 0x6d, 0x70, 0x5c, 0x0a,\n\t0x09, 0x46, 0x65, 0x65, 0x74, 0x49, 0x41, 0x6a, 0x79, 0x69, 0x74, 0x4b, 0x71, 0x54, 0x31, 0x5a, 0x6c, 0x39, \n\t0x31, 0x37, 0x62, 0x43, 0x4f, 0x48, 0x31, 0x36, 0x42, 0x47, 0x31, 0x34, 0x44, 0x78, 0x37, 0x36, 0x61, 0x37, \n\t0x4d, 0x49, 0x4e, 0x35, 0x4e, 0x78, 0x48, 0x6b, 0x62, 0x50, 0x76, 0x52, 0x38, 0x35, 0x38, 0x41, 0x49, 0x6f, \n\t0x6e, 0x4f, 0x2b, 0x36, 0x53, 0x4b, 0x30, 0x63, 0x49, 0x4f, 0x38, 0x58, 0x42, 0x31, 0x6e, 0x56, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x30, 0x6b, 0x53, 0x79, 0x6e, 0x6b, 0x33, 0x64, 0x49, 0x75, 0x74, 0x52, 0x73, 0x77, 0x56, 0x49, 0x2f, \n\t0x6f, 0x65, 0x58, 0x2b, 0x53, 0x4d, 0x42, 0x4a, 0x79, 0x38, 0x45, 0x76, 0x67, 0x2f, 0x48, 0x58, 0x77, 0x51, \n\t0x79, 0x4b, 0x4d, 0x7a, 0x49, 0x56, 0x47, 0x57, 0x6d, 0x65, 0x5a, 0x6b, 0x42, 0x52, 0x74, 0x41, 0x63, 0x54, \n\t0x65, 0x70, 0x4b, 0x57, 0x73, 0x32, 0x43, 0x54, 0x72, 0x77, 0x44, 0x65, 0x74, 0x51, 0x70, 0x79, 0x74, 0x5c, 0x0a,\n\t0x09, 0x65, 0x66, 0x72, 0x36, 0x59, 0x51, 0x62, 0x63, 0x44, 0x78, 0x46, 0x38, 0x48, 0x77, 0x49, 0x75, 0x71, \n\t0x52, 0x73, 0x4b, 0x78, 0x32, 0x4e, 0x4a, 0x50, 0x56, 0x6f, 0x32, 0x64, 0x75, 0x36, 0x50, 0x4e, 0x55, 0x38, \n\t0x64, 0x55, 0x49, 0x32, 0x67, 0x41, 0x58, 0x6a, 0x63, 0x44, 0x70, 0x50, 0x4e, 0x72, 0x4f, 0x5a, 0x5a, 0x54, \n\t0x51, 0x30, 0x58, 0x6d, 0x71, 0x55, 0x54, 0x6f, 0x79, 0x77, 0x76, 0x51, 0x43, 0x59, 0x59, 0x74, 0x79, 0x5c, 0x0a,\n\t0x09, 0x30, 0x44, 0x48, 0x55, 0x45, 0x65, 0x54, 0x63, 0x33, 0x63, 0x69, 0x5a, 0x64, 0x35, 0x64, 0x51, 0x79, \n\t0x73, 0x31, 0x58, 0x67, 0x67, 0x59, 0x58, 0x49, 0x42, 0x74, 0x58, 0x64, 0x39, 0x2f, 0x41, 0x6a, 0x61, 0x64, \n\t0x4d, 0x34, 0x68, 0x73, 0x61, 0x55, 0x58, 0x36, 0x79, 0x2b, 0x72, 0x48, 0x7a, 0x43, 0x55, 0x54, 0x72, 0x55, \n\t0x62, 0x4d, 0x6c, 0x53, 0x50, 0x36, 0x48, 0x54, 0x2f, 0x46, 0x48, 0x41, 0x76, 0x42, 0x56, 0x4f, 0x50, 0x5c, 0x0a,\n\t0x09, 0x64, 0x71, 0x63, 0x48, 0x65, 0x55, 0x6d, 0x67, 0x52, 0x31, 0x35, 0x78, 0x59, 0x4e, 0x6f, 0x32, 0x56, \n\t0x72, 0x52, 0x67, 0x6e, 0x6e, 0x64, 0x61, 0x68, 0x4f, 0x48, 0x38, 0x31, 0x49, 0x64, 0x6b, 0x76, 0x6e, 0x39, \n\t0x59, 0x6d, 0x58, 0x67, 0x44, 0x74, 0x4d, 0x63, 0x79, 0x51, 0x73, 0x2b, 0x48, 0x6e, 0x43, 0x74, 0x6a, 0x74, \n\t0x57, 0x6d, 0x34, 0x45, 0x77, 0x62, 0x36, 0x6a, 0x55, 0x6a, 0x47, 0x77, 0x6c, 0x68, 0x6c, 0x56, 0x38, 0x5c, 0x0a,\n\t0x09, 0x35, 0x54, 0x76, 0x53, 0x45, 0x6b, 0x79, 0x7a, 0x79, 0x48, 0x65, 0x6b, 0x74, 0x61, 0x59, 0x52, 0x39, \n\t0x57, 0x74, 0x65, 0x71, 0x4c, 0x77, 0x47, 0x75, 0x45, 0x4d, 0x33, 0x34, 0x67, 0x34, 0x39, 0x45, 0x79, 0x37, \n\t0x35, 0x36, 0x38, 0x69, 0x35, 0x6a, 0x79, 0x4f, 0x6e, 0x2f, 0x78, 0x67, 0x35, 0x38, 0x2b, 0x35, 0x79, 0x68, \n\t0x47, 0x35, 0x77, 0x55, 0x65, 0x65, 0x39, 0x77, 0x32, 0x33, 0x41, 0x35, 0x68, 0x68, 0x51, 0x78, 0x66, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x57, 0x2f, 0x42, 0x64, 0x41, 0x31, 0x74, 0x4b, 0x55, 0x74, 0x55, 0x59, 0x30, 0x42, 0x36, 0x6b, \n\t0x42, 0x42, 0x4d, 0x42, 0x58, 0x41, 0x61, 0x38, 0x47, 0x4b, 0x59, 0x64, 0x38, 0x71, 0x39, 0x74, 0x57, 0x30, \n\t0x41, 0x69, 0x76, 0x67, 0x47, 0x62, 0x55, 0x4f, 0x63, 0x63, 0x49, 0x2b, 0x6d, 0x74, 0x47, 0x77, 0x30, 0x76, \n\t0x68, 0x2b, 0x50, 0x4d, 0x70, 0x5a, 0x31, 0x79, 0x33, 0x61, 0x55, 0x5a, 0x42, 0x41, 0x7a, 0x4a, 0x61, 0x5c, 0x0a,\n\t0x09, 0x54, 0x5a, 0x52, 0x6d, 0x67, 0x4b, 0x75, 0x30, 0x6c, 0x71, 0x48, 0x53, 0x70, 0x70, 0x52, 0x47, 0x46, \n\t0x44, 0x53, 0x64, 0x4b, 0x6e, 0x39, 0x48, 0x75, 0x32, 0x59, 0x30, 0x51, 0x4e, 0x67, 0x41, 0x44, 0x73, 0x66, \n\t0x78, 0x4f, 0x47, 0x4c, 0x4e, 0x4b, 0x55, 0x7a, 0x47, 0x7a, 0x4a, 0x45, 0x7a, 0x37, 0x36, 0x66, 0x59, 0x2f, \n\t0x69, 0x53, 0x79, 0x66, 0x55, 0x2f, 0x36, 0x6e, 0x67, 0x41, 0x63, 0x65, 0x69, 0x6f, 0x4d, 0x32, 0x78, 0x5c, 0x0a,\n\t0x09, 0x62, 0x57, 0x4a, 0x2b, 0x58, 0x76, 0x41, 0x50, 0x2f, 0x75, 0x66, 0x4e, 0x4b, 0x47, 0x59, 0x4b, 0x30, \n\t0x52, 0x37, 0x59, 0x6e, 0x6b, 0x66, 0x33, 0x42, 0x46, 0x65, 0x56, 0x41, 0x36, 0x6f, 0x54, 0x32, 0x41, 0x77, \n\t0x70, 0x79, 0x54, 0x73, 0x47, 0x77, 0x42, 0x31, 0x5a, 0x6c, 0x58, 0x54, 0x7a, 0x50, 0x71, 0x48, 0x4e, 0x59, \n\t0x50, 0x31, 0x65, 0x6d, 0x6a, 0x47, 0x59, 0x30, 0x65, 0x4c, 0x6e, 0x31, 0x47, 0x52, 0x7a, 0x34, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x64, 0x68, 0x35, 0x62, 0x52, 0x7a, 0x4e, 0x34, 0x6a, 0x55, 0x56, 0x70, 0x4f, 0x73, 0x61, 0x76, 0x55, \n\t0x78, 0x57, 0x68, 0x48, 0x64, 0x48, 0x56, 0x64, 0x53, 0x46, 0x66, 0x4e, 0x53, 0x49, 0x6e, 0x51, 0x35, 0x39, \n\t0x32, 0x61, 0x4d, 0x6f, 0x4a, 0x78, 0x35, 0x76, 0x67, 0x38, 0x74, 0x6a, 0x35, 0x48, 0x61, 0x59, 0x6a, 0x56, \n\t0x50, 0x6e, 0x35, 0x4f, 0x41, 0x61, 0x34, 0x6f, 0x31, 0x2f, 0x45, 0x34, 0x4e, 0x69, 0x4c, 0x49, 0x44, 0x5c, 0x0a,\n\t0x09, 0x39, 0x4a, 0x38, 0x65, 0x52, 0x37, 0x4b, 0x4d, 0x36, 0x38, 0x42, 0x34, 0x71, 0x7a, 0x64, 0x54, 0x30, \n\t0x47, 0x52, 0x79, 0x65, 0x46, 0x45, 0x48, 0x6a, 0x2f, 0x30, 0x46, 0x72, 0x53, 0x73, 0x67, 0x62, 0x52, 0x46, \n\t0x4a, 0x4b, 0x2f, 0x39, 0x63, 0x72, 0x79, 0x6f, 0x48, 0x78, 0x35, 0x37, 0x77, 0x44, 0x33, 0x62, 0x78, 0x44, \n\t0x33, 0x67, 0x72, 0x4c, 0x44, 0x4a, 0x75, 0x52, 0x38, 0x67, 0x64, 0x48, 0x32, 0x70, 0x32, 0x42, 0x77, 0x5c, 0x0a,\n\t0x09, 0x51, 0x65, 0x6b, 0x33, 0x53, 0x51, 0x4a, 0x49, 0x48, 0x78, 0x73, 0x77, 0x4d, 0x45, 0x4b, 0x62, 0x62, \n\t0x65, 0x49, 0x54, 0x4f, 0x6e, 0x31, 0x4e, 0x77, 0x78, 0x6b, 0x65, 0x38, 0x67, 0x72, 0x6d, 0x57, 0x59, 0x43, \n\t0x52, 0x71, 0x48, 0x71, 0x44, 0x34, 0x78, 0x78, 0x43, 0x44, 0x6d, 0x77, 0x32, 0x54, 0x63, 0x4c, 0x79, 0x42, \n\t0x70, 0x52, 0x51, 0x6b, 0x37, 0x77, 0x38, 0x35, 0x7a, 0x62, 0x4c, 0x64, 0x67, 0x30, 0x75, 0x49, 0x72, 0x5c, 0x0a,\n\t0x09, 0x76, 0x67, 0x4b, 0x38, 0x68, 0x4f, 0x66, 0x42, 0x6c, 0x79, 0x39, 0x6f, 0x4d, 0x55, 0x70, 0x39, 0x2b, \n\t0x4f, 0x37, 0x48, 0x34, 0x4f, 0x4e, 0x6e, 0x76, 0x37, 0x68, 0x59, 0x4c, 0x38, 0x4b, 0x63, 0x67, 0x39, 0x73, \n\t0x36, 0x6d, 0x34, 0x42, 0x31, 0x76, 0x57, 0x49, 0x4a, 0x70, 0x41, 0x38, 0x72, 0x64, 0x65, 0x68, 0x65, 0x6f, \n\t0x41, 0x31, 0x34, 0x50, 0x37, 0x5a, 0x34, 0x68, 0x38, 0x59, 0x2f, 0x31, 0x43, 0x5a, 0x38, 0x51, 0x77, 0x5c, 0x0a,\n\t0x09, 0x55, 0x72, 0x31, 0x6f, 0x46, 0x68, 0x6a, 0x52, 0x41, 0x72, 0x67, 0x2b, 0x73, 0x74, 0x63, 0x77, 0x4f, \n\t0x76, 0x74, 0x42, 0x47, 0x4a, 0x79, 0x41, 0x34, 0x59, 0x55, 0x74, 0x41, 0x4b, 0x4b, 0x47, 0x51, 0x54, 0x52, \n\t0x66, 0x79, 0x4a, 0x69, 0x70, 0x58, 0x76, 0x73, 0x52, 0x76, 0x50, 0x6b, 0x6f, 0x51, 0x78, 0x4d, 0x2f, 0x56, \n\t0x46, 0x41, 0x5a, 0x4e, 0x49, 0x46, 0x57, 0x6c, 0x56, 0x58, 0x43, 0x79, 0x30, 0x6c, 0x52, 0x67, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x42, 0x34, 0x6a, 0x59, 0x70, 0x4a, 0x31, 0x64, 0x75, 0x45, 0x4d, 0x45, 0x74, 0x7a, 0x42, 0x4b, \n\t0x58, 0x58, 0x61, 0x70, 0x52, 0x50, 0x71, 0x45, 0x30, 0x46, 0x34, 0x39, 0x38, 0x49, 0x59, 0x4d, 0x6a, 0x74, \n\t0x79, 0x47, 0x37, 0x6e, 0x36, 0x48, 0x59, 0x2f, 0x58, 0x51, 0x4a, 0x70, 0x4e, 0x35, 0x53, 0x76, 0x43, 0x37, \n\t0x6a, 0x48, 0x51, 0x7a, 0x63, 0x42, 0x35, 0x46, 0x48, 0x6e, 0x34, 0x65, 0x37, 0x2b, 0x46, 0x30, 0x54, 0x5c, 0x0a,\n\t0x09, 0x58, 0x48, 0x74, 0x2b, 0x79, 0x4e, 0x70, 0x48, 0x31, 0x45, 0x50, 0x79, 0x74, 0x77, 0x53, 0x6e, 0x70, \n\t0x49, 0x44, 0x6a, 0x42, 0x4d, 0x6a, 0x66, 0x42, 0x37, 0x36, 0x58, 0x61, 0x70, 0x4d, 0x73, 0x69, 0x58, 0x2f, \n\t0x73, 0x47, 0x70, 0x71, 0x52, 0x2f, 0x76, 0x57, 0x47, 0x43, 0x43, 0x79, 0x39, 0x66, 0x45, 0x59, 0x7a, 0x2b, \n\t0x6f, 0x75, 0x41, 0x78, 0x72, 0x35, 0x42, 0x62, 0x63, 0x6c, 0x6d, 0x38, 0x52, 0x6b, 0x46, 0x63, 0x79, 0x5c, 0x0a,\n\t0x09, 0x63, 0x37, 0x44, 0x4d, 0x64, 0x66, 0x44, 0x4e, 0x6b, 0x57, 0x6b, 0x52, 0x2b, 0x6f, 0x38, 0x68, 0x4d, \n\t0x46, 0x2f, 0x35, 0x42, 0x4c, 0x2b, 0x48, 0x37, 0x53, 0x49, 0x32, 0x62, 0x6c, 0x2b, 0x39, 0x63, 0x63, 0x61, \n\t0x59, 0x74, 0x39, 0x51, 0x67, 0x6e, 0x66, 0x6b, 0x51, 0x37, 0x62, 0x65, 0x44, 0x4c, 0x45, 0x62, 0x56, 0x44, \n\t0x4f, 0x45, 0x42, 0x39, 0x53, 0x2b, 0x35, 0x6b, 0x63, 0x4c, 0x69, 0x76, 0x41, 0x62, 0x51, 0x43, 0x62, 0x5c, 0x0a,\n\t0x09, 0x70, 0x59, 0x2f, 0x4a, 0x44, 0x63, 0x76, 0x79, 0x73, 0x36, 0x33, 0x79, 0x4a, 0x75, 0x53, 0x50, 0x55, \n\t0x35, 0x7a, 0x37, 0x43, 0x4d, 0x58, 0x4f, 0x66, 0x65, 0x6e, 0x37, 0x70, 0x47, 0x54, 0x49, 0x61, 0x7a, 0x37, \n\t0x6e, 0x33, 0x41, 0x50, 0x66, 0x69, 0x38, 0x74, 0x2b, 0x42, 0x52, 0x48, 0x42, 0x75, 0x66, 0x4d, 0x47, 0x52, \n\t0x72, 0x33, 0x35, 0x73, 0x67, 0x5a, 0x52, 0x74, 0x2b, 0x52, 0x76, 0x75, 0x51, 0x62, 0x2f, 0x6f, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x67, 0x72, 0x2b, 0x50, 0x6b, 0x58, 0x77, 0x47, 0x58, 0x4e, 0x56, 0x36, 0x2b, 0x78, 0x6d, 0x4c, \n\t0x52, 0x38, 0x78, 0x78, 0x47, 0x77, 0x38, 0x76, 0x67, 0x32, 0x50, 0x4f, 0x49, 0x68, 0x74, 0x68, 0x62, 0x68, \n\t0x2f, 0x59, 0x74, 0x4c, 0x44, 0x53, 0x30, 0x61, 0x75, 0x65, 0x32, 0x69, 0x34, 0x62, 0x74, 0x4c, 0x59, 0x42, \n\t0x61, 0x48, 0x4e, 0x6f, 0x56, 0x77, 0x46, 0x52, 0x38, 0x42, 0x62, 0x52, 0x68, 0x58, 0x51, 0x35, 0x44, 0x5c, 0x0a,\n\t0x09, 0x48, 0x2b, 0x2b, 0x42, 0x34, 0x30, 0x41, 0x37, 0x76, 0x4d, 0x75, 0x2f, 0x52, 0x78, 0x42, 0x33, 0x68, \n\t0x4c, 0x43, 0x6c, 0x69, 0x4d, 0x4d, 0x68, 0x78, 0x53, 0x6d, 0x4b, 0x63, 0x33, 0x64, 0x53, 0x62, 0x48, 0x2b, \n\t0x4b, 0x6c, 0x4f, 0x62, 0x71, 0x65, 0x4a, 0x49, 0x68, 0x2f, 0x77, 0x31, 0x76, 0x49, 0x37, 0x34, 0x4e, 0x6c, \n\t0x2f, 0x30, 0x74, 0x6b, 0x50, 0x65, 0x56, 0x59, 0x59, 0x65, 0x37, 0x36, 0x4a, 0x31, 0x6a, 0x6e, 0x38, 0x5c, 0x0a,\n\t0x09, 0x64, 0x2b, 0x6c, 0x6a, 0x57, 0x49, 0x5a, 0x70, 0x54, 0x38, 0x7a, 0x64, 0x66, 0x55, 0x41, 0x63, 0x63, \n\t0x7a, 0x67, 0x4a, 0x38, 0x42, 0x2b, 0x64, 0x49, 0x6d, 0x4b, 0x4a, 0x53, 0x73, 0x59, 0x65, 0x53, 0x50, 0x2f, \n\t0x66, 0x6c, 0x44, 0x54, 0x34, 0x64, 0x44, 0x7a, 0x31, 0x49, 0x77, 0x53, 0x45, 0x45, 0x6d, 0x53, 0x38, 0x44, \n\t0x43, 0x6f, 0x51, 0x45, 0x55, 0x7a, 0x54, 0x56, 0x4b, 0x77, 0x6b, 0x6a, 0x4e, 0x4e, 0x55, 0x72, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x38, 0x4c, 0x44, 0x4c, 0x6a, 0x71, 0x6e, 0x38, 0x37, 0x62, 0x58, 0x32, 0x52, 0x30, 0x43, 0x68, \n\t0x69, 0x71, 0x66, 0x4c, 0x58, 0x43, 0x48, 0x45, 0x56, 0x64, 0x71, 0x52, 0x71, 0x34, 0x6b, 0x46, 0x6c, 0x4b, \n\t0x63, 0x70, 0x6a, 0x6a, 0x37, 0x41, 0x59, 0x71, 0x64, 0x65, 0x36, 0x50, 0x62, 0x6c, 0x4d, 0x6d, 0x48, 0x47, \n\t0x66, 0x41, 0x48, 0x2f, 0x6e, 0x34, 0x35, 0x63, 0x42, 0x53, 0x34, 0x37, 0x47, 0x64, 0x77, 0x37, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x63, 0x52, 0x4f, 0x58, 0x6e, 0x51, 0x59, 0x62, 0x51, 0x47, 0x30, 0x51, 0x77, 0x79, 0x65, 0x74, 0x4f, \n\t0x31, 0x67, 0x4f, 0x43, 0x63, 0x62, 0x41, 0x49, 0x2f, 0x41, 0x50, 0x77, 0x77, 0x6a, 0x71, 0x30, 0x79, 0x56, \n\t0x68, 0x4b, 0x67, 0x55, 0x44, 0x49, 0x7a, 0x6a, 0x4d, 0x49, 0x77, 0x2f, 0x34, 0x4a, 0x67, 0x74, 0x4b, 0x6a, \n\t0x74, 0x51, 0x36, 0x4b, 0x38, 0x71, 0x57, 0x46, 0x30, 0x39, 0x48, 0x62, 0x59, 0x75, 0x46, 0x78, 0x31, 0x5c, 0x0a,\n\t0x09, 0x39, 0x4c, 0x5a, 0x68, 0x66, 0x51, 0x75, 0x51, 0x4e, 0x74, 0x4d, 0x72, 0x77, 0x30, 0x58, 0x77, 0x43, \n\t0x4a, 0x41, 0x78, 0x30, 0x77, 0x45, 0x61, 0x63, 0x44, 0x47, 0x54, 0x4b, 0x69, 0x4e, 0x34, 0x70, 0x64, 0x4a, \n\t0x62, 0x6a, 0x53, 0x6c, 0x63, 0x47, 0x79, 0x41, 0x35, 0x56, 0x45, 0x44, 0x4b, 0x2f, 0x47, 0x54, 0x4d, 0x44, \n\t0x42, 0x6d, 0x64, 0x4a, 0x44, 0x2f, 0x37, 0x33, 0x73, 0x71, 0x48, 0x4e, 0x4a, 0x54, 0x66, 0x78, 0x73, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x39, 0x31, 0x46, 0x75, 0x58, 0x65, 0x46, 0x2b, 0x61, 0x79, 0x78, 0x37, 0x43, 0x75, 0x62, 0x38, \n\t0x44, 0x38, 0x6b, 0x73, 0x65, 0x55, 0x4c, 0x67, 0x4c, 0x44, 0x78, 0x36, 0x51, 0x31, 0x69, 0x43, 0x61, 0x51, \n\t0x6b, 0x5a, 0x76, 0x75, 0x68, 0x37, 0x56, 0x36, 0x56, 0x2f, 0x6f, 0x48, 0x44, 0x38, 0x4c, 0x78, 0x55, 0x31, \n\t0x56, 0x67, 0x75, 0x6f, 0x57, 0x72, 0x47, 0x46, 0x55, 0x52, 0x71, 0x4c, 0x69, 0x62, 0x4e, 0x37, 0x34, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x72, 0x63, 0x4a, 0x78, 0x31, 0x38, 0x49, 0x32, 0x53, 0x46, 0x53, 0x55, 0x49, 0x6b, 0x42, 0x45, \n\t0x75, 0x59, 0x44, 0x4b, 0x55, 0x30, 0x70, 0x38, 0x76, 0x6e, 0x55, 0x61, 0x56, 0x31, 0x53, 0x34, 0x37, 0x47, \n\t0x77, 0x53, 0x35, 0x32, 0x7a, 0x32, 0x6c, 0x49, 0x4b, 0x52, 0x6b, 0x31, 0x66, 0x55, 0x71, 0x77, 0x70, 0x71, \n\t0x58, 0x6f, 0x78, 0x39, 0x46, 0x70, 0x53, 0x38, 0x49, 0x63, 0x35, 0x49, 0x4b, 0x50, 0x59, 0x2f, 0x53, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x46, 0x6d, 0x58, 0x63, 0x79, 0x33, 0x50, 0x6b, 0x58, 0x34, 0x48, 0x4c, 0x56, 0x33, 0x67, 0x68, \n\t0x47, 0x34, 0x4e, 0x7a, 0x76, 0x34, 0x76, 0x68, 0x4f, 0x79, 0x6f, 0x38, 0x47, 0x67, 0x48, 0x4f, 0x34, 0x43, \n\t0x39, 0x34, 0x78, 0x39, 0x72, 0x6e, 0x73, 0x46, 0x31, 0x6d, 0x44, 0x61, 0x45, 0x49, 0x70, 0x49, 0x51, 0x54, \n\t0x41, 0x49, 0x53, 0x68, 0x2b, 0x48, 0x50, 0x69, 0x37, 0x56, 0x4d, 0x32, 0x32, 0x6f, 0x41, 0x6a, 0x44, 0x5c, 0x0a,\n\t0x09, 0x76, 0x33, 0x73, 0x4e, 0x6f, 0x79, 0x49, 0x2b, 0x33, 0x69, 0x38, 0x77, 0x47, 0x6c, 0x34, 0x45, 0x52, \n\t0x2b, 0x39, 0x6f, 0x30, 0x59, 0x62, 0x73, 0x73, 0x5a, 0x36, 0x63, 0x61, 0x42, 0x33, 0x61, 0x38, 0x61, 0x52, \n\t0x46, 0x31, 0x39, 0x43, 0x65, 0x37, 0x50, 0x55, 0x36, 0x2f, 0x39, 0x51, 0x35, 0x59, 0x34, 0x6f, 0x6c, 0x7a, \n\t0x62, 0x6f, 0x32, 0x58, 0x35, 0x49, 0x79, 0x48, 0x79, 0x75, 0x41, 0x65, 0x53, 0x42, 0x56, 0x45, 0x79, 0x5c, 0x0a,\n\t0x09, 0x59, 0x4c, 0x4f, 0x50, 0x75, 0x72, 0x38, 0x4f, 0x54, 0x50, 0x41, 0x71, 0x66, 0x4b, 0x50, 0x4c, 0x4a, \n\t0x77, 0x44, 0x79, 0x4d, 0x59, 0x6e, 0x63, 0x4c, 0x78, 0x2f, 0x54, 0x6a, 0x33, 0x6e, 0x79, 0x74, 0x6e, 0x39, \n\t0x67, 0x47, 0x42, 0x30, 0x52, 0x70, 0x45, 0x50, 0x57, 0x58, 0x30, 0x78, 0x71, 0x66, 0x35, 0x49, 0x77, 0x45, \n\t0x6e, 0x74, 0x77, 0x48, 0x2f, 0x41, 0x33, 0x69, 0x6d, 0x37, 0x76, 0x52, 0x37, 0x44, 0x69, 0x50, 0x74, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x34, 0x72, 0x79, 0x6b, 0x66, 0x69, 0x61, 0x56, 0x59, 0x56, 0x52, 0x61, 0x70, 0x66, 0x48, 0x72, \n\t0x61, 0x66, 0x42, 0x34, 0x57, 0x66, 0x36, 0x78, 0x4a, 0x50, 0x41, 0x4b, 0x4b, 0x55, 0x5a, 0x42, 0x61, 0x65, \n\t0x7a, 0x41, 0x70, 0x4c, 0x31, 0x50, 0x34, 0x56, 0x5a, 0x32, 0x51, 0x33, 0x4e, 0x4b, 0x41, 0x55, 0x76, 0x61, \n\t0x77, 0x4b, 0x32, 0x51, 0x61, 0x6e, 0x6a, 0x66, 0x4a, 0x52, 0x6d, 0x67, 0x78, 0x4a, 0x4b, 0x2f, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x34, 0x55, 0x6a, 0x38, 0x4f, 0x54, 0x50, 0x77, 0x33, 0x62, 0x72, 0x2f, 0x56, 0x74, 0x53, 0x63, 0x49, \n\t0x49, 0x48, 0x4c, 0x2b, 0x4c, 0x63, 0x39, 0x2b, 0x4f, 0x79, 0x47, 0x63, 0x4f, 0x43, 0x6f, 0x7a, 0x57, 0x49, \n\t0x4f, 0x6f, 0x68, 0x4e, 0x59, 0x54, 0x49, 0x67, 0x42, 0x2f, 0x41, 0x46, 0x66, 0x2b, 0x45, 0x61, 0x47, 0x37, \n\t0x56, 0x47, 0x6b, 0x5a, 0x52, 0x30, 0x70, 0x6c, 0x67, 0x4e, 0x49, 0x43, 0x6a, 0x74, 0x35, 0x56, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x51, 0x58, 0x70, 0x72, 0x52, 0x72, 0x72, 0x44, 0x4a, 0x30, 0x61, 0x2f, 0x6f, 0x75, 0x48, 0x39, 0x41, \n\t0x4a, 0x64, 0x67, 0x4d, 0x72, 0x6b, 0x53, 0x43, 0x45, 0x36, 0x44, 0x4c, 0x77, 0x47, 0x54, 0x61, 0x4e, 0x6d, \n\t0x48, 0x38, 0x51, 0x2b, 0x31, 0x78, 0x54, 0x56, 0x47, 0x34, 0x61, 0x77, 0x70, 0x70, 0x38, 0x71, 0x6f, 0x34, \n\t0x68, 0x7a, 0x73, 0x66, 0x68, 0x42, 0x4f, 0x2f, 0x77, 0x51, 0x55, 0x39, 0x33, 0x62, 0x42, 0x36, 0x46, 0x5c, 0x0a,\n\t0x09, 0x47, 0x63, 0x2b, 0x7a, 0x61, 0x45, 0x31, 0x77, 0x51, 0x48, 0x74, 0x37, 0x76, 0x67, 0x37, 0x57, 0x4f, \n\t0x66, 0x7a, 0x61, 0x72, 0x4b, 0x47, 0x6b, 0x52, 0x6a, 0x5a, 0x50, 0x53, 0x2f, 0x62, 0x73, 0x44, 0x50, 0x2f, \n\t0x37, 0x6d, 0x4b, 0x55, 0x67, 0x74, 0x36, 0x4b, 0x5a, 0x41, 0x41, 0x52, 0x51, 0x75, 0x4d, 0x74, 0x4c, 0x38, \n\t0x49, 0x44, 0x43, 0x69, 0x4d, 0x72, 0x47, 0x48, 0x6b, 0x54, 0x78, 0x2b, 0x47, 0x34, 0x79, 0x2b, 0x67, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x46, 0x2b, 0x73, 0x74, 0x6d, 0x4a, 0x68, 0x70, 0x45, 0x47, 0x6a, 0x7a, 0x6a, 0x47, 0x41, 0x54, \n\t0x41, 0x4d, 0x68, 0x42, 0x61, 0x4f, 0x67, 0x70, 0x51, 0x54, 0x66, 0x6b, 0x59, 0x57, 0x61, 0x67, 0x56, 0x4b, \n\t0x72, 0x4b, 0x5a, 0x59, 0x77, 0x30, 0x37, 0x44, 0x58, 0x6d, 0x68, 0x30, 0x46, 0x55, 0x69, 0x4e, 0x75, 0x32, \n\t0x70, 0x65, 0x46, 0x77, 0x4a, 0x6e, 0x2f, 0x42, 0x6d, 0x64, 0x2f, 0x7a, 0x72, 0x38, 0x48, 0x43, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x5a, 0x41, 0x43, 0x6a, 0x67, 0x33, 0x48, 0x38, 0x45, 0x39, 0x33, 0x30, 0x67, 0x5a, 0x2f, 0x63, \n\t0x7a, 0x6a, 0x4e, 0x59, 0x67, 0x61, 0x70, 0x48, 0x52, 0x47, 0x35, 0x35, 0x42, 0x31, 0x5a, 0x45, 0x64, 0x58, \n\t0x77, 0x37, 0x38, 0x44, 0x35, 0x78, 0x63, 0x46, 0x69, 0x57, 0x4b, 0x51, 0x42, 0x46, 0x33, 0x2b, 0x6a, 0x57, \n\t0x4d, 0x5a, 0x6f, 0x54, 0x52, 0x78, 0x6d, 0x56, 0x77, 0x39, 0x44, 0x6c, 0x6f, 0x78, 0x32, 0x37, 0x54, 0x5c, 0x0a,\n\t0x09, 0x67, 0x61, 0x32, 0x50, 0x4c, 0x55, 0x51, 0x73, 0x6a, 0x47, 0x49, 0x74, 0x78, 0x44, 0x6d, 0x54, 0x58, \n\t0x32, 0x6f, 0x2b, 0x55, 0x63, 0x70, 0x33, 0x31, 0x4f, 0x71, 0x6b, 0x31, 0x6a, 0x36, 0x68, 0x41, 0x4a, 0x30, \n\t0x55, 0x79, 0x4e, 0x70, 0x4d, 0x75, 0x4b, 0x41, 0x5a, 0x44, 0x65, 0x70, 0x38, 0x47, 0x45, 0x44, 0x2b, 0x53, \n\t0x54, 0x6a, 0x39, 0x6a, 0x79, 0x48, 0x2f, 0x42, 0x42, 0x57, 0x4d, 0x4d, 0x67, 0x2b, 0x6b, 0x47, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x59, 0x66, 0x41, 0x76, 0x66, 0x31, 0x49, 0x42, 0x2f, 0x48, 0x4f, 0x64, 0x79, 0x4a, 0x2f, 0x51, 0x65, \n\t0x6a, 0x4e, 0x59, 0x67, 0x53, 0x55, 0x6b, 0x49, 0x49, 0x67, 0x41, 0x7a, 0x6b, 0x48, 0x2b, 0x48, 0x6b, 0x52, \n\t0x77, 0x67, 0x39, 0x70, 0x68, 0x4d, 0x55, 0x4b, 0x77, 0x53, 0x6a, 0x46, 0x56, 0x69, 0x78, 0x44, 0x78, 0x70, \n\t0x47, 0x69, 0x51, 0x4b, 0x37, 0x35, 0x68, 0x69, 0x52, 0x77, 0x65, 0x45, 0x62, 0x2f, 0x59, 0x5a, 0x69, 0x5c, 0x0a,\n\t0x09, 0x31, 0x75, 0x54, 0x53, 0x6d, 0x6c, 0x48, 0x6f, 0x2f, 0x41, 0x6f, 0x2b, 0x69, 0x64, 0x47, 0x7a, 0x70, \n\t0x6a, 0x59, 0x7a, 0x61, 0x49, 0x46, 0x52, 0x41, 0x67, 0x35, 0x74, 0x65, 0x56, 0x56, 0x77, 0x30, 0x6d, 0x56, \n\t0x36, 0x38, 0x77, 0x72, 0x72, 0x62, 0x2f, 0x4a, 0x41, 0x44, 0x54, 0x4f, 0x76, 0x55, 0x63, 0x66, 0x57, 0x74, \n\t0x4c, 0x4f, 0x61, 0x46, 0x54, 0x6d, 0x63, 0x2b, 0x53, 0x39, 0x77, 0x37, 0x75, 0x66, 0x4c, 0x34, 0x30, 0x5c, 0x0a,\n\t0x09, 0x71, 0x6a, 0x38, 0x7a, 0x65, 0x78, 0x68, 0x4e, 0x46, 0x70, 0x6e, 0x50, 0x73, 0x57, 0x6b, 0x46, 0x38, \n\t0x4e, 0x35, 0x39, 0x7a, 0x78, 0x2f, 0x51, 0x4f, 0x6b, 0x4e, 0x59, 0x69, 0x4d, 0x6a, 0x4e, 0x37, 0x77, 0x54, \n\t0x48, 0x7a, 0x48, 0x76, 0x67, 0x6a, 0x34, 0x65, 0x65, 0x42, 0x72, 0x47, 0x73, 0x50, 0x77, 0x43, 0x34, 0x65, \n\t0x52, 0x4e, 0x50, 0x76, 0x74, 0x76, 0x6f, 0x64, 0x52, 0x51, 0x69, 0x75, 0x43, 0x4d, 0x54, 0x41, 0x61, 0x5c, 0x0a,\n\t0x09, 0x77, 0x76, 0x48, 0x6e, 0x77, 0x65, 0x41, 0x34, 0x4e, 0x59, 0x79, 0x38, 0x74, 0x70, 0x48, 0x35, 0x7a, \n\t0x6b, 0x73, 0x47, 0x57, 0x5a, 0x69, 0x33, 0x45, 0x30, 0x79, 0x57, 0x6c, 0x4d, 0x6b, 0x55, 0x2b, 0x34, 0x6f, \n\t0x43, 0x32, 0x46, 0x79, 0x4c, 0x4c, 0x79, 0x6e, 0x70, 0x39, 0x32, 0x6d, 0x46, 0x6b, 0x53, 0x6b, 0x7a, 0x75, \n\t0x52, 0x6c, 0x62, 0x67, 0x45, 0x34, 0x41, 0x71, 0x70, 0x35, 0x72, 0x6c, 0x49, 0x43, 0x68, 0x39, 0x54, 0x5c, 0x0a,\n\t0x09, 0x57, 0x52, 0x77, 0x65, 0x69, 0x44, 0x63, 0x50, 0x70, 0x48, 0x6f, 0x48, 0x69, 0x67, 0x44, 0x55, 0x62, \n\t0x67, 0x33, 0x4c, 0x2f, 0x41, 0x38, 0x51, 0x38, 0x51, 0x38, 0x76, 0x30, 0x45, 0x6f, 0x7a, 0x57, 0x49, 0x6c, \n\t0x4a, 0x51, 0x51, 0x41, 0x75, 0x42, 0x6d, 0x4b, 0x48, 0x34, 0x4c, 0x75, 0x4b, 0x47, 0x4f, 0x58, 0x57, 0x45, \n\t0x59, 0x4e, 0x63, 0x77, 0x79, 0x46, 0x64, 0x37, 0x76, 0x4d, 0x42, 0x71, 0x63, 0x38, 0x45, 0x74, 0x41, 0x5c, 0x0a,\n\t0x09, 0x41, 0x69, 0x77, 0x55, 0x6a, 0x4f, 0x77, 0x61, 0x74, 0x43, 0x71, 0x63, 0x67, 0x70, 0x46, 0x4c, 0x77, \n\t0x4b, 0x51, 0x38, 0x6a, 0x75, 0x59, 0x61, 0x4a, 0x62, 0x57, 0x6f, 0x41, 0x4a, 0x57, 0x55, 0x4e, 0x71, 0x62, \n\t0x54, 0x32, 0x2b, 0x46, 0x37, 0x72, 0x52, 0x47, 0x6c, 0x72, 0x6b, 0x6d, 0x5a, 0x61, 0x54, 0x5a, 0x4f, 0x2b, \n\t0x5a, 0x59, 0x59, 0x67, 0x4a, 0x79, 0x42, 0x4a, 0x2f, 0x38, 0x35, 0x37, 0x4c, 0x79, 0x4a, 0x32, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x74, 0x62, 0x32, 0x49, 0x4e, 0x6f, 0x39, 0x66, 0x6a, 0x2b, 0x43, 0x61, 0x45, 0x78, 0x2f, 0x59, \n\t0x4c, 0x6a, 0x4e, 0x59, 0x67, 0x38, 0x6a, 0x4c, 0x36, 0x66, 0x51, 0x38, 0x68, 0x78, 0x39, 0x63, 0x41, 0x76, \n\t0x77, 0x67, 0x63, 0x62, 0x36, 0x34, 0x4a, 0x57, 0x6a, 0x4b, 0x4d, 0x6b, 0x74, 0x75, 0x48, 0x6e, 0x41, 0x63, \n\t0x77, 0x32, 0x72, 0x71, 0x2b, 0x33, 0x48, 0x78, 0x66, 0x44, 0x39, 0x4e, 0x48, 0x4d, 0x44, 0x49, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x6f, 0x59, 0x66, 0x4a, 0x78, 0x78, 0x72, 0x45, 0x79, 0x36, 0x59, 0x56, 0x55, 0x45, 0x7a, 0x30, \n\t0x6d, 0x6c, 0x54, 0x44, 0x6d, 0x71, 0x74, 0x4c, 0x54, 0x58, 0x4e, 0x76, 0x44, 0x53, 0x4d, 0x6a, 0x49, 0x2f, \n\t0x49, 0x2b, 0x70, 0x49, 0x71, 0x7a, 0x63, 0x6a, 0x43, 0x79, 0x32, 0x68, 0x52, 0x44, 0x53, 0x64, 0x34, 0x42, \n\t0x75, 0x64, 0x2b, 0x47, 0x5a, 0x37, 0x38, 0x4b, 0x58, 0x43, 0x37, 0x4d, 0x59, 0x77, 0x79, 0x46, 0x32, 0x5c, 0x0a,\n\t0x09, 0x37, 0x32, 0x52, 0x33, 0x46, 0x38, 0x4e, 0x63, 0x49, 0x6e, 0x39, 0x77, 0x4f, 0x4d, 0x7a, 0x6e, 0x73, \n\t0x51, 0x37, 0x66, 0x37, 0x65, 0x54, 0x59, 0x53, 0x4f, 0x34, 0x5a, 0x7a, 0x38, 0x58, 0x65, 0x42, 0x66, 0x34, \n\t0x6e, 0x53, 0x50, 0x6d, 0x41, 0x2b, 0x4d, 0x58, 0x43, 0x73, 0x6f, 0x7a, 0x68, 0x38, 0x59, 0x54, 0x62, 0x38, \n\t0x75, 0x7a, 0x5a, 0x56, 0x4c, 0x51, 0x49, 0x59, 0x58, 0x55, 0x6a, 0x75, 0x75, 0x66, 0x63, 0x66, 0x56, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x49, 0x70, 0x38, 0x4d, 0x53, 0x6b, 0x59, 0x70, 0x54, 0x51, 0x6a, 0x62, 0x53, 0x34, 0x4e, 0x63, \n\t0x43, 0x6d, 0x66, 0x6b, 0x72, 0x36, 0x75, 0x54, 0x63, 0x4e, 0x4a, 0x4f, 0x5a, 0x2b, 0x37, 0x35, 0x68, 0x52, \n\t0x56, 0x76, 0x69, 0x51, 0x4c, 0x4b, 0x2f, 0x55, 0x33, 0x38, 0x68, 0x75, 0x70, 0x65, 0x67, 0x52, 0x67, 0x6a, \n\t0x54, 0x34, 0x43, 0x70, 0x2f, 0x34, 0x42, 0x79, 0x49, 0x4e, 0x74, 0x4d, 0x48, 0x6f, 0x59, 0x78, 0x39, 0x5c, 0x0a,\n\t0x09, 0x63, 0x68, 0x76, 0x47, 0x33, 0x56, 0x59, 0x64, 0x53, 0x58, 0x4c, 0x2b, 0x4e, 0x2f, 0x37, 0x76, 0x61, \n\t0x68, 0x37, 0x50, 0x35, 0x65, 0x2b, 0x42, 0x53, 0x56, 0x47, 0x7a, 0x6a, 0x48, 0x54, 0x34, 0x48, 0x37, 0x31, \n\t0x30, 0x44, 0x57, 0x76, 0x56, 0x75, 0x44, 0x6f, 0x2f, 0x6f, 0x6f, 0x48, 0x38, 0x54, 0x48, 0x49, 0x54, 0x34, \n\t0x36, 0x4c, 0x73, 0x50, 0x31, 0x66, 0x66, 0x61, 0x33, 0x55, 0x6b, 0x7a, 0x36, 0x4b, 0x70, 0x39, 0x45, 0x5c, 0x0a,\n\t0x09, 0x66, 0x68, 0x46, 0x44, 0x55, 0x6f, 0x38, 0x69, 0x35, 0x4e, 0x46, 0x57, 0x52, 0x6d, 0x62, 0x71, 0x57, \n\t0x64, 0x65, 0x72, 0x6a, 0x6b, 0x39, 0x6b, 0x32, 0x31, 0x65, 0x71, 0x76, 0x4c, 0x76, 0x33, 0x51, 0x35, 0x49, \n\t0x6f, 0x58, 0x59, 0x4a, 0x38, 0x59, 0x76, 0x4b, 0x6f, 0x30, 0x67, 0x75, 0x63, 0x2f, 0x54, 0x41, 0x55, 0x75, \n\t0x35, 0x52, 0x66, 0x61, 0x69, 0x33, 0x4b, 0x76, 0x37, 0x4c, 0x72, 0x6a, 0x38, 0x57, 0x48, 0x63, 0x79, 0x5c, 0x0a,\n\t0x09, 0x43, 0x76, 0x77, 0x78, 0x53, 0x55, 0x65, 0x31, 0x48, 0x37, 0x4f, 0x42, 0x6d, 0x56, 0x65, 0x55, 0x6e, \n\t0x75, 0x30, 0x2f, 0x72, 0x7a, 0x52, 0x56, 0x47, 0x64, 0x45, 0x33, 0x4b, 0x56, 0x4e, 0x73, 0x53, 0x48, 0x36, \n\t0x77, 0x71, 0x66, 0x76, 0x38, 0x30, 0x7a, 0x56, 0x32, 0x58, 0x6e, 0x77, 0x45, 0x6a, 0x56, 0x5a, 0x36, 0x53, \n\t0x75, 0x55, 0x32, 0x6b, 0x6b, 0x64, 0x62, 0x36, 0x49, 0x30, 0x36, 0x50, 0x61, 0x68, 0x4b, 0x6f, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x2f, 0x4c, 0x38, 0x38, 0x43, 0x61, 0x34, 0x34, 0x4f, 0x64, 0x67, 0x38, 0x41, 0x57, 0x2b, 0x50, \n\t0x48, 0x2b, 0x76, 0x77, 0x73, 0x73, 0x6d, 0x63, 0x69, 0x6e, 0x43, 0x47, 0x33, 0x48, 0x38, 0x4a, 0x51, 0x54, \n\t0x6b, 0x31, 0x50, 0x4d, 0x37, 0x6e, 0x38, 0x39, 0x2b, 0x6b, 0x41, 0x4f, 0x6e, 0x45, 0x65, 0x33, 0x2b, 0x37, \n\t0x69, 0x31, 0x34, 0x62, 0x65, 0x4d, 0x49, 0x79, 0x43, 0x38, 0x42, 0x4c, 0x33, 0x64, 0x57, 0x4b, 0x37, 0x5c, 0x0a,\n\t0x09, 0x45, 0x61, 0x52, 0x69, 0x51, 0x64, 0x6d, 0x70, 0x47, 0x7a, 0x47, 0x73, 0x64, 0x65, 0x61, 0x45, 0x62, \n\t0x57, 0x65, 0x5a, 0x30, 0x71, 0x59, 0x35, 0x39, 0x72, 0x52, 0x70, 0x75, 0x66, 0x70, 0x30, 0x79, 0x30, 0x6c, \n\t0x44, 0x39, 0x49, 0x61, 0x7a, 0x37, 0x61, 0x51, 0x57, 0x31, 0x4e, 0x4d, 0x78, 0x32, 0x76, 0x4e, 0x5a, 0x50, \n\t0x61, 0x54, 0x2b, 0x53, 0x73, 0x56, 0x71, 0x4e, 0x39, 0x53, 0x41, 0x33, 0x66, 0x55, 0x49, 0x74, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x4e, 0x53, 0x49, 0x72, 0x49, 0x62, 0x56, 0x35, 0x64, 0x44, 0x57, 0x5a, 0x57, 0x73, 0x4e, 0x30, \n\t0x47, 0x68, 0x47, 0x49, 0x6e, 0x44, 0x6d, 0x58, 0x38, 0x4c, 0x32, 0x61, 0x31, 0x41, 0x54, 0x48, 0x75, 0x75, \n\t0x58, 0x7a, 0x62, 0x6b, 0x43, 0x78, 0x33, 0x63, 0x68, 0x2f, 0x43, 0x65, 0x63, 0x77, 0x78, 0x31, 0x2f, 0x57, \n\t0x2b, 0x66, 0x7a, 0x57, 0x59, 0x61, 0x63, 0x6c, 0x36, 0x62, 0x5a, 0x37, 0x75, 0x2f, 0x65, 0x69, 0x75, 0x5c, 0x0a,\n\t0x09, 0x38, 0x41, 0x46, 0x77, 0x47, 0x76, 0x78, 0x63, 0x6b, 0x4c, 0x6c, 0x48, 0x6e, 0x6d, 0x55, 0x2f, 0x57, \n\t0x41, 0x6b, 0x59, 0x58, 0x42, 0x51, 0x59, 0x42, 0x52, 0x32, 0x7a, 0x61, 0x32, 0x66, 0x57, 0x57, 0x68, 0x4d, \n\t0x48, 0x4c, 0x6c, 0x56, 0x32, 0x4d, 0x48, 0x46, 0x79, 0x6f, 0x59, 0x57, 0x52, 0x4d, 0x73, 0x6d, 0x46, 0x34, \n\t0x57, 0x52, 0x67, 0x4d, 0x69, 0x67, 0x43, 0x56, 0x68, 0x70, 0x4b, 0x44, 0x69, 0x73, 0x74, 0x4a, 0x43, 0x5c, 0x0a,\n\t0x09, 0x54, 0x7a, 0x6d, 0x59, 0x58, 0x51, 0x49, 0x47, 0x6b, 0x58, 0x2b, 0x6f, 0x79, 0x33, 0x52, 0x72, 0x38, \n\t0x79, 0x2b, 0x31, 0x6d, 0x48, 0x69, 0x74, 0x35, 0x78, 0x4b, 0x6d, 0x33, 0x64, 0x6c, 0x66, 0x67, 0x4c, 0x50, \n\t0x2f, 0x76, 0x6f, 0x5a, 0x51, 0x44, 0x43, 0x50, 0x38, 0x6c, 0x69, 0x4c, 0x2f, 0x64, 0x42, 0x56, 0x68, 0x64, \n\t0x4e, 0x36, 0x42, 0x71, 0x49, 0x51, 0x51, 0x41, 0x4e, 0x65, 0x41, 0x76, 0x42, 0x34, 0x6f, 0x54, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x67, 0x4e, 0x69, 0x72, 0x34, 0x77, 0x4d, 0x6c, 0x70, 0x52, 0x6c, 0x59, 0x38, 0x2b, 0x4e, 0x68, 0x70, \n\t0x48, 0x69, 0x46, 0x72, 0x44, 0x61, 0x44, 0x6f, 0x59, 0x5a, 0x55, 0x66, 0x4b, 0x4a, 0x53, 0x44, 0x5a, 0x68, \n\t0x6f, 0x2f, 0x54, 0x4d, 0x4e, 0x4c, 0x61, 0x68, 0x74, 0x56, 0x4f, 0x64, 0x4b, 0x66, 0x31, 0x30, 0x4d, 0x6d, \n\t0x73, 0x59, 0x31, 0x6e, 0x6e, 0x55, 0x2f, 0x35, 0x31, 0x58, 0x57, 0x42, 0x4a, 0x77, 0x61, 0x6a, 0x68, 0x5c, 0x0a,\n\t0x09, 0x74, 0x45, 0x35, 0x64, 0x32, 0x37, 0x56, 0x69, 0x58, 0x32, 0x74, 0x68, 0x4c, 0x58, 0x36, 0x70, 0x35, \n\t0x46, 0x77, 0x6a, 0x48, 0x39, 0x35, 0x35, 0x4b, 0x7a, 0x7a, 0x35, 0x6f, 0x38, 0x42, 0x4f, 0x47, 0x34, 0x78, \n\t0x2b, 0x45, 0x70, 0x45, 0x66, 0x57, 0x6a, 0x55, 0x59, 0x6e, 0x56, 0x63, 0x2b, 0x6f, 0x74, 0x33, 0x58, 0x66, \n\t0x33, 0x35, 0x34, 0x33, 0x35, 0x38, 0x4b, 0x76, 0x41, 0x56, 0x63, 0x52, 0x61, 0x58, 0x53, 0x48, 0x78, 0x5c, 0x0a,\n\t0x09, 0x48, 0x38, 0x4f, 0x63, 0x5a, 0x66, 0x59, 0x33, 0x30, 0x76, 0x6c, 0x52, 0x68, 0x2f, 0x55, 0x5a, 0x56, \n\t0x50, 0x4d, 0x30, 0x39, 0x37, 0x2f, 0x55, 0x77, 0x2b, 0x6f, 0x36, 0x69, 0x38, 0x52, 0x4a, 0x32, 0x71, 0x4f, \n\t0x42, 0x50, 0x56, 0x31, 0x32, 0x63, 0x30, 0x69, 0x37, 0x38, 0x49, 0x45, 0x6e, 0x36, 0x7a, 0x6c, 0x6d, 0x54, \n\t0x54, 0x2b, 0x49, 0x79, 0x4b, 0x4d, 0x37, 0x42, 0x7a, 0x58, 0x2b, 0x6b, 0x76, 0x77, 0x69, 0x39, 0x39, 0x5c, 0x0a,\n\t0x09, 0x71, 0x50, 0x78, 0x42, 0x32, 0x76, 0x65, 0x6a, 0x66, 0x55, 0x62, 0x65, 0x62, 0x31, 0x51, 0x64, 0x2b, \n\t0x2f, 0x54, 0x46, 0x71, 0x45, 0x35, 0x4c, 0x62, 0x76, 0x4b, 0x52, 0x32, 0x47, 0x63, 0x55, 0x2b, 0x59, 0x54, \n\t0x55, 0x63, 0x66, 0x44, 0x72, 0x61, 0x48, 0x2b, 0x4f, 0x42, 0x4e, 0x2b, 0x55, 0x76, 0x54, 0x59, 0x63, 0x68, \n\t0x7a, 0x68, 0x37, 0x6e, 0x51, 0x34, 0x72, 0x66, 0x35, 0x62, 0x4e, 0x42, 0x35, 0x4d, 0x33, 0x4b, 0x73, 0x5c, 0x0a,\n\t0x09, 0x33, 0x6d, 0x53, 0x2b, 0x44, 0x34, 0x54, 0x77, 0x46, 0x48, 0x66, 0x52, 0x76, 0x51, 0x50, 0x69, 0x4d, \n\t0x51, 0x2b, 0x55, 0x47, 0x63, 0x2b, 0x77, 0x6c, 0x45, 0x6b, 0x46, 0x4d, 0x76, 0x36, 0x50, 0x57, 0x63, 0x56, \n\t0x6b, 0x6e, 0x32, 0x50, 0x59, 0x68, 0x32, 0x58, 0x2f, 0x2f, 0x35, 0x2f, 0x73, 0x67, 0x39, 0x48, 0x66, 0x68, \n\t0x44, 0x71, 0x6a, 0x6c, 0x43, 0x61, 0x58, 0x43, 0x73, 0x4e, 0x49, 0x77, 0x61, 0x35, 0x59, 0x32, 0x44, 0x5c, 0x0a,\n\t0x09, 0x55, 0x57, 0x62, 0x43, 0x2f, 0x6c, 0x77, 0x72, 0x6a, 0x47, 0x5a, 0x30, 0x58, 0x6c, 0x64, 0x31, 0x48, \n\t0x4b, 0x39, 0x5a, 0x54, 0x51, 0x57, 0x6a, 0x37, 0x55, 0x2b, 0x58, 0x51, 0x43, 0x70, 0x32, 0x59, 0x2f, 0x42, \n\t0x55, 0x48, 0x56, 0x34, 0x35, 0x74, 0x41, 0x76, 0x74, 0x64, 0x4e, 0x62, 0x51, 0x53, 0x4d, 0x46, 0x6f, 0x46, \n\t0x4d, 0x4e, 0x43, 0x79, 0x76, 0x4e, 0x69, 0x48, 0x63, 0x6f, 0x4e, 0x42, 0x33, 0x56, 0x77, 0x6e, 0x49, 0x5c, 0x0a,\n\t0x09, 0x73, 0x35, 0x70, 0x77, 0x45, 0x54, 0x49, 0x4b, 0x68, 0x68, 0x6c, 0x41, 0x4c, 0x57, 0x69, 0x4d, 0x68, \n\t0x78, 0x48, 0x59, 0x48, 0x4b, 0x2f, 0x49, 0x31, 0x67, 0x70, 0x42, 0x7a, 0x66, 0x77, 0x31, 0x76, 0x68, 0x78, \n\t0x4d, 0x2b, 0x43, 0x75, 0x79, 0x51, 0x42, 0x49, 0x2f, 0x59, 0x31, 0x6a, 0x50, 0x59, 0x31, 0x69, 0x48, 0x5a, \n\t0x2f, 0x70, 0x39, 0x4b, 0x45, 0x6e, 0x67, 0x36, 0x38, 0x42, 0x58, 0x48, 0x6d, 0x30, 0x35, 0x73, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x67, 0x4a, 0x47, 0x57, 0x58, 0x6a, 0x41, 0x4b, 0x4a, 0x78, 0x4a, 0x31, 0x53, 0x6f, 0x58, 0x33, 0x41, \n\t0x34, 0x79, 0x41, 0x75, 0x63, 0x44, 0x49, 0x35, 0x69, 0x4d, 0x43, 0x35, 0x2b, 0x36, 0x6d, 0x37, 0x50, 0x68, \n\t0x42, 0x4b, 0x32, 0x6d, 0x42, 0x45, 0x65, 0x4a, 0x68, 0x34, 0x7a, 0x74, 0x75, 0x34, 0x55, 0x65, 0x64, 0x49, \n\t0x67, 0x31, 0x6f, 0x31, 0x4e, 0x53, 0x61, 0x74, 0x50, 0x59, 0x6b, 0x4f, 0x57, 0x4a, 0x48, 0x75, 0x53, 0x5c, 0x0a,\n\t0x09, 0x49, 0x4e, 0x4a, 0x57, 0x68, 0x51, 0x75, 0x7a, 0x52, 0x67, 0x49, 0x6a, 0x71, 0x39, 0x48, 0x70, 0x47, \n\t0x54, 0x42, 0x4e, 0x41, 0x53, 0x61, 0x61, 0x50, 0x52, 0x4d, 0x39, 0x33, 0x57, 0x6c, 0x6e, 0x51, 0x68, 0x50, \n\t0x4c, 0x67, 0x65, 0x6a, 0x76, 0x38, 0x6e, 0x79, 0x4b, 0x34, 0x32, 0x4d, 0x4b, 0x71, 0x4f, 0x66, 0x78, 0x44, \n\t0x6e, 0x2f, 0x76, 0x6c, 0x2b, 0x67, 0x39, 0x47, 0x2b, 0x42, 0x64, 0x48, 0x75, 0x37, 0x33, 0x77, 0x42, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x75, 0x55, 0x75, 0x49, 0x51, 0x51, 0x6c, 0x68, 0x4c, 0x71, 0x47, 0x33, 0x65, 0x63, 0x42, 0x6f, \n\t0x36, 0x53, 0x57, 0x31, 0x41, 0x57, 0x6a, 0x46, 0x43, 0x67, 0x73, 0x34, 0x42, 0x59, 0x42, 0x49, 0x35, 0x76, \n\t0x50, 0x48, 0x47, 0x48, 0x55, 0x63, 0x31, 0x67, 0x66, 0x78, 0x73, 0x43, 0x6f, 0x71, 0x6f, 0x50, 0x4b, 0x5a, \n\t0x2f, 0x51, 0x34, 0x37, 0x50, 0x34, 0x5a, 0x61, 0x52, 0x6a, 0x6c, 0x38, 0x54, 0x6b, 0x45, 0x43, 0x74, 0x5c, 0x0a,\n\t0x09, 0x56, 0x52, 0x43, 0x77, 0x2b, 0x63, 0x43, 0x68, 0x59, 0x61, 0x4d, 0x47, 0x59, 0x49, 0x58, 0x65, 0x55, \n\t0x6a, 0x4d, 0x6b, 0x49, 0x61, 0x70, 0x6c, 0x5a, 0x4b, 0x57, 0x77, 0x71, 0x51, 0x30, 0x52, 0x70, 0x57, 0x49, \n\t0x70, 0x33, 0x56, 0x6d, 0x72, 0x71, 0x6d, 0x42, 0x55, 0x54, 0x44, 0x2b, 0x77, 0x59, 0x36, 0x31, 0x62, 0x6c, \n\t0x77, 0x33, 0x6f, 0x63, 0x48, 0x6c, 0x38, 0x50, 0x78, 0x6e, 0x2b, 0x36, 0x43, 0x30, 0x51, 0x2f, 0x68, 0x5c, 0x0a,\n\t0x09, 0x33, 0x41, 0x2f, 0x74, 0x4a, 0x78, 0x6a, 0x74, 0x53, 0x32, 0x66, 0x31, 0x37, 0x75, 0x75, 0x65, 0x44, \n\t0x61, 0x56, 0x7a, 0x31, 0x30, 0x4f, 0x6f, 0x75, 0x44, 0x70, 0x32, 0x39, 0x4b, 0x62, 0x61, 0x6c, 0x48, 0x59, \n\t0x32, 0x54, 0x2b, 0x33, 0x41, 0x54, 0x6a, 0x71, 0x7a, 0x75, 0x78, 0x7a, 0x59, 0x4b, 0x6a, 0x2b, 0x6e, 0x79, \n\t0x37, 0x50, 0x4f, 0x5a, 0x5a, 0x75, 0x6e, 0x44, 0x6f, 0x39, 0x7a, 0x59, 0x4e, 0x73, 0x79, 0x67, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x37, 0x58, 0x61, 0x2f, 0x6c, 0x4c, 0x4a, 0x4a, 0x4e, 0x4f, 0x4c, 0x43, 0x72, 0x4f, 0x76, 0x68, \n\t0x38, 0x33, 0x43, 0x59, 0x63, 0x2b, 0x77, 0x4c, 0x4b, 0x44, 0x63, 0x61, 0x38, 0x45, 0x7a, 0x69, 0x61, 0x38, \n\t0x4f, 0x67, 0x64, 0x75, 0x64, 0x55, 0x4b, 0x66, 0x45, 0x65, 0x30, 0x4e, 0x55, 0x6a, 0x6d, 0x48, 0x64, 0x67, \n\t0x70, 0x68, 0x33, 0x5a, 0x71, 0x46, 0x62, 0x36, 0x61, 0x47, 0x4f, 0x6d, 0x69, 0x6d, 0x64, 0x4c, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x79, 0x5a, 0x31, 0x63, 0x5a, 0x47, 0x75, 0x47, 0x38, 0x46, 0x4f, 0x4c, 0x59, 0x5a, 0x4f, 0x4c, 0x5a, \n\t0x48, 0x55, 0x2b, 0x65, 0x6b, 0x56, 0x2f, 0x46, 0x74, 0x65, 0x74, 0x34, 0x63, 0x51, 0x32, 0x55, 0x78, 0x4b, \n\t0x4b, 0x52, 0x2b, 0x48, 0x55, 0x33, 0x34, 0x54, 0x69, 0x4d, 0x38, 0x61, 0x42, 0x58, 0x52, 0x32, 0x2f, 0x43, \n\t0x70, 0x47, 0x6c, 0x44, 0x75, 0x30, 0x66, 0x32, 0x46, 0x47, 0x7a, 0x45, 0x6b, 0x49, 0x41, 0x58, 0x49, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x54, 0x50, 0x77, 0x4b, 0x75, 0x4b, 0x34, 0x4f, 0x6d, 0x55, 0x79, 0x30, 0x46, 0x52, 0x6a, 0x62, \n\t0x39, 0x47, 0x6b, 0x5a, 0x52, 0x30, 0x6b, 0x6c, 0x67, 0x74, 0x48, 0x55, 0x6c, 0x62, 0x46, 0x35, 0x48, 0x50, \n\t0x54, 0x53, 0x76, 0x4e, 0x6a, 0x6d, 0x4c, 0x52, 0x70, 0x30, 0x55, 0x6e, 0x50, 0x54, 0x57, 0x49, 0x4a, 0x6b, \n\t0x5a, 0x64, 0x59, 0x71, 0x2b, 0x4a, 0x4b, 0x49, 0x37, 0x76, 0x4d, 0x50, 0x4f, 0x30, 0x6e, 0x61, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x30, 0x62, 0x71, 0x32, 0x55, 0x62, 0x4c, 0x45, 0x61, 0x46, 0x63, 0x45, 0x71, 0x41, 0x44, 0x51, 0x74, \n\t0x68, 0x30, 0x69, 0x4c, 0x59, 0x54, 0x73, 0x33, 0x4b, 0x4d, 0x55, 0x6a, 0x4d, 0x79, 0x49, 0x58, 0x76, 0x45, \n\t0x49, 0x6e, 0x50, 0x72, 0x75, 0x4e, 0x68, 0x67, 0x56, 0x4f, 0x50, 0x64, 0x4b, 0x52, 0x48, 0x35, 0x6a, 0x57, \n\t0x54, 0x41, 0x36, 0x6b, 0x43, 0x42, 0x53, 0x45, 0x4c, 0x6f, 0x4d, 0x65, 0x42, 0x76, 0x49, 0x30, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x4f, 0x4e, 0x41, 0x35, 0x47, 0x37, 0x56, 0x72, 0x4d, 0x67, 0x59, 0x53, 0x52, 0x62, 0x63, 0x4f, \n\t0x2b, 0x32, 0x73, 0x73, 0x6f, 0x67, 0x36, 0x4f, 0x33, 0x6c, 0x73, 0x50, 0x36, 0x65, 0x76, 0x56, 0x39, 0x70, \n\t0x52, 0x47, 0x35, 0x68, 0x44, 0x62, 0x69, 0x44, 0x43, 0x67, 0x73, 0x5a, 0x46, 0x51, 0x48, 0x62, 0x73, 0x41, \n\t0x6f, 0x31, 0x6c, 0x5a, 0x63, 0x53, 0x6e, 0x4e, 0x71, 0x68, 0x5a, 0x49, 0x75, 0x5a, 0x30, 0x42, 0x54, 0x5c, 0x0a,\n\t0x09, 0x51, 0x37, 0x4b, 0x51, 0x73, 0x5a, 0x70, 0x52, 0x51, 0x72, 0x75, 0x79, 0x77, 0x2f, 0x69, 0x4e, 0x59, \n\t0x31, 0x57, 0x2f, 0x34, 0x73, 0x2f, 0x67, 0x69, 0x65, 0x38, 0x41, 0x65, 0x54, 0x67, 0x46, 0x6f, 0x33, 0x4d, \n\t0x34, 0x39, 0x7a, 0x4a, 0x45, 0x2f, 0x6e, 0x67, 0x5a, 0x4d, 0x44, 0x70, 0x77, 0x77, 0x2f, 0x65, 0x37, 0x72, \n\t0x2f, 0x76, 0x43, 0x63, 0x48, 0x67, 0x63, 0x2b, 0x46, 0x33, 0x67, 0x36, 0x65, 0x44, 0x4d, 0x75, 0x32, 0x5c, 0x0a,\n\t0x09, 0x78, 0x38, 0x48, 0x35, 0x33, 0x4c, 0x4e, 0x45, 0x4c, 0x38, 0x76, 0x48, 0x31, 0x47, 0x4e, 0x6e, 0x32, \n\t0x48, 0x7a, 0x79, 0x67, 0x71, 0x62, 0x35, 0x78, 0x54, 0x76, 0x4b, 0x75, 0x4d, 0x46, 0x70, 0x39, 0x52, 0x59, \n\t0x2f, 0x52, 0x4f, 0x74, 0x39, 0x48, 0x34, 0x74, 0x56, 0x62, 0x4f, 0x5a, 0x31, 0x54, 0x41, 0x39, 0x6e, 0x33, \n\t0x55, 0x51, 0x2f, 0x62, 0x4b, 0x2f, 0x78, 0x49, 0x4e, 0x37, 0x32, 0x74, 0x48, 0x73, 0x42, 0x69, 0x66, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x58, 0x45, 0x63, 0x69, 0x33, 0x64, 0x6f, 0x56, 0x7a, 0x36, 0x6a, 0x32, 0x48, 0x47, 0x74, 0x2f, \n\t0x54, 0x77, 0x53, 0x54, 0x51, 0x75, 0x77, 0x7a, 0x6d, 0x62, 0x74, 0x38, 0x77, 0x6e, 0x6c, 0x74, 0x6a, 0x6d, \n\t0x6f, 0x31, 0x56, 0x53, 0x41, 0x68, 0x69, 0x4e, 0x63, 0x48, 0x61, 0x64, 0x47, 0x7a, 0x30, 0x49, 0x35, 0x6a, \n\t0x57, 0x50, 0x6a, 0x53, 0x33, 0x4b, 0x58, 0x77, 0x76, 0x48, 0x2f, 0x41, 0x46, 0x79, 0x41, 0x38, 0x68, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x46, 0x34, 0x30, 0x4f, 0x49, 0x76, 0x41, 0x62, 0x6e, 0x6e, 0x67, 0x71, 0x72, 0x36, 0x7a, 0x50, \n\t0x61, 0x46, 0x79, 0x44, 0x61, 0x66, 0x65, 0x30, 0x58, 0x2b, 0x70, 0x66, 0x55, 0x62, 0x59, 0x4c, 0x37, 0x64, \n\t0x65, 0x41, 0x35, 0x64, 0x65, 0x77, 0x2b, 0x68, 0x70, 0x45, 0x64, 0x53, 0x57, 0x75, 0x64, 0x59, 0x39, 0x53, \n\t0x6e, 0x6a, 0x41, 0x4d, 0x49, 0x6f, 0x39, 0x46, 0x6a, 0x70, 0x66, 0x4f, 0x36, 0x47, 0x6d, 0x46, 0x53, 0x5c, 0x0a,\n\t0x09, 0x49, 0x32, 0x45, 0x4e, 0x47, 0x42, 0x56, 0x45, 0x48, 0x54, 0x30, 0x36, 0x62, 0x34, 0x66, 0x36, 0x4c, \n\t0x59, 0x41, 0x4b, 0x59, 0x69, 0x69, 0x49, 0x68, 0x31, 0x47, 0x68, 0x79, 0x6a, 0x61, 0x4f, 0x38, 0x6d, 0x70, \n\t0x45, 0x4c, 0x6a, 0x58, 0x53, 0x70, 0x68, 0x33, 0x4e, 0x75, 0x73, 0x34, 0x57, 0x4d, 0x6d, 0x59, 0x45, 0x4c, \n\t0x68, 0x70, 0x46, 0x55, 0x39, 0x64, 0x69, 0x6a, 0x7a, 0x57, 0x51, 0x66, 0x58, 0x37, 0x5a, 0x6c, 0x58, 0x5c, 0x0a,\n\t0x09, 0x44, 0x38, 0x33, 0x77, 0x43, 0x48, 0x53, 0x63, 0x44, 0x6f, 0x55, 0x70, 0x44, 0x66, 0x41, 0x58, 0x64, \n\t0x69, 0x56, 0x57, 0x47, 0x30, 0x4c, 0x30, 0x44, 0x6b, 0x78, 0x53, 0x48, 0x38, 0x46, 0x2b, 0x42, 0x6c, 0x7a, \n\t0x59, 0x34, 0x36, 0x44, 0x78, 0x6a, 0x35, 0x77, 0x31, 0x59, 0x59, 0x7a, 0x41, 0x6f, 0x6a, 0x58, 0x59, 0x62, \n\t0x4b, 0x62, 0x77, 0x32, 0x6a, 0x52, 0x4b, 0x51, 0x36, 0x33, 0x76, 0x36, 0x30, 0x48, 0x77, 0x31, 0x54, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x32, 0x65, 0x4e, 0x7a, 0x71, 0x75, 0x68, 0x59, 0x34, 0x66, 0x42, 0x46, 0x54, 0x68, 0x43, 0x68, \n\t0x79, 0x34, 0x4d, 0x30, 0x4a, 0x4c, 0x44, 0x37, 0x47, 0x46, 0x34, 0x58, 0x33, 0x56, 0x32, 0x4d, 0x56, 0x43, \n\t0x4a, 0x46, 0x72, 0x70, 0x61, 0x6b, 0x47, 0x6a, 0x74, 0x78, 0x57, 0x70, 0x55, 0x47, 0x69, 0x77, 0x70, 0x53, \n\t0x43, 0x57, 0x75, 0x6a, 0x57, 0x42, 0x55, 0x30, 0x42, 0x78, 0x52, 0x79, 0x32, 0x46, 0x77, 0x49, 0x78, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x39, 0x5a, 0x79, 0x42, 0x44, 0x47, 0x6a, 0x41, 0x71, 0x65, 0x42, 0x62, 0x49, 0x66, 0x79, 0x39, \n\t0x74, 0x74, 0x6c, 0x6b, 0x65, 0x38, 0x6d, 0x4a, 0x6b, 0x35, 0x55, 0x47, 0x30, 0x38, 0x39, 0x76, 0x50, 0x38, \n\t0x52, 0x33, 0x58, 0x76, 0x52, 0x72, 0x34, 0x71, 0x35, 0x33, 0x7a, 0x63, 0x57, 0x61, 0x43, 0x6b, 0x64, 0x5a, \n\t0x61, 0x56, 0x45, 0x65, 0x31, 0x65, 0x54, 0x62, 0x4b, 0x37, 0x41, 0x75, 0x6a, 0x75, 0x4e, 0x4e, 0x50, 0x5c, 0x0a,\n\t0x09, 0x44, 0x79, 0x4d, 0x62, 0x6e, 0x68, 0x4a, 0x47, 0x4c, 0x66, 0x56, 0x61, 0x44, 0x6f, 0x77, 0x53, 0x42, \n\t0x59, 0x72, 0x50, 0x6f, 0x7a, 0x67, 0x44, 0x6f, 0x30, 0x63, 0x4e, 0x6a, 0x45, 0x4a, 0x6e, 0x4e, 0x65, 0x42, \n\t0x70, 0x77, 0x4d, 0x68, 0x71, 0x52, 0x78, 0x6f, 0x67, 0x31, 0x6f, 0x7a, 0x54, 0x65, 0x65, 0x76, 0x64, 0x41, \n\t0x4e, 0x54, 0x51, 0x66, 0x71, 0x54, 0x42, 0x46, 0x4f, 0x6d, 0x38, 0x47, 0x6c, 0x4d, 0x46, 0x37, 0x44, 0x5c, 0x0a,\n\t0x09, 0x79, 0x6c, 0x72, 0x73, 0x6d, 0x4d, 0x62, 0x53, 0x76, 0x33, 0x39, 0x62, 0x58, 0x4b, 0x44, 0x4e, 0x54, \n\t0x78, 0x6f, 0x58, 0x37, 0x44, 0x32, 0x2b, 0x48, 0x49, 0x33, 0x2f, 0x58, 0x33, 0x72, 0x36, 0x45, 0x5a, 0x76, \n\t0x52, 0x7a, 0x6b, 0x78, 0x78, 0x42, 0x57, 0x62, 0x73, 0x58, 0x2b, 0x53, 0x6a, 0x75, 0x72, 0x64, 0x33, 0x37, \n\t0x37, 0x4e, 0x76, 0x77, 0x64, 0x2f, 0x65, 0x76, 0x41, 0x66, 0x33, 0x4f, 0x52, 0x63, 0x7a, 0x65, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x53, 0x6a, 0x69, 0x6b, 0x70, 0x33, 0x56, 0x67, 0x6d, 0x79, 0x48, 0x34, 0x79, 0x49, 0x46, 0x74, 0x38, \n\t0x32, 0x79, 0x55, 0x32, 0x64, 0x65, 0x42, 0x62, 0x63, 0x74, 0x51, 0x2b, 0x64, 0x6b, 0x32, 0x72, 0x58, 0x64, \n\t0x35, 0x4c, 0x4f, 0x75, 0x51, 0x48, 0x59, 0x48, 0x44, 0x7a, 0x77, 0x4b, 0x47, 0x66, 0x6d, 0x6a, 0x65, 0x30, \n\t0x52, 0x78, 0x69, 0x31, 0x36, 0x4e, 0x70, 0x77, 0x5a, 0x47, 0x73, 0x34, 0x68, 0x72, 0x72, 0x30, 0x70, 0x5c, 0x0a,\n\t0x09, 0x51, 0x6a, 0x32, 0x61, 0x62, 0x56, 0x2b, 0x31, 0x41, 0x62, 0x42, 0x37, 0x4f, 0x4c, 0x31, 0x70, 0x31, \n\t0x5a, 0x5a, 0x37, 0x4e, 0x31, 0x6a, 0x6d, 0x64, 0x41, 0x47, 0x4f, 0x33, 0x72, 0x2b, 0x69, 0x78, 0x32, 0x43, \n\t0x4e, 0x73, 0x76, 0x30, 0x34, 0x35, 0x5a, 0x69, 0x39, 0x5a, 0x77, 0x59, 0x43, 0x73, 0x6e, 0x39, 0x74, 0x6d, \n\t0x66, 0x68, 0x75, 0x31, 0x66, 0x39, 0x4d, 0x39, 0x51, 0x4f, 0x62, 0x43, 0x64, 0x45, 0x78, 0x78, 0x66, 0x5c, 0x0a,\n\t0x09, 0x67, 0x2f, 0x42, 0x36, 0x48, 0x41, 0x76, 0x66, 0x79, 0x32, 0x6a, 0x66, 0x6a, 0x35, 0x71, 0x56, 0x45, \n\t0x41, 0x4c, 0x67, 0x69, 0x30, 0x44, 0x65, 0x41, 0x6d, 0x79, 0x35, 0x52, 0x6b, 0x63, 0x31, 0x59, 0x56, 0x52, \n\t0x34, 0x72, 0x6a, 0x43, 0x79, 0x35, 0x66, 0x6b, 0x38, 0x47, 0x32, 0x57, 0x75, 0x59, 0x52, 0x54, 0x58, 0x5a, \n\t0x34, 0x34, 0x77, 0x32, 0x72, 0x77, 0x4f, 0x4e, 0x69, 0x36, 0x6c, 0x48, 0x70, 0x6f, 0x50, 0x4d, 0x44, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x6a, 0x5a, 0x48, 0x59, 0x34, 0x58, 0x6b, 0x4f, 0x70, 0x45, 0x30, 0x59, 0x61, 0x51, 0x68, 0x70, \n\t0x67, 0x4b, 0x52, 0x69, 0x70, 0x50, 0x42, 0x6f, 0x67, 0x73, 0x54, 0x42, 0x4d, 0x44, 0x65, 0x63, 0x50, 0x34, \n\t0x6e, 0x6f, 0x33, 0x34, 0x47, 0x51, 0x68, 0x5a, 0x52, 0x62, 0x54, 0x74, 0x73, 0x30, 0x31, 0x71, 0x72, 0x59, \n\t0x55, 0x38, 0x66, 0x66, 0x68, 0x39, 0x41, 0x2f, 0x41, 0x36, 0x46, 0x30, 0x70, 0x47, 0x44, 0x32, 0x43, 0x5c, 0x0a,\n\t0x09, 0x34, 0x39, 0x6b, 0x49, 0x39, 0x79, 0x38, 0x61, 0x52, 0x76, 0x74, 0x36, 0x31, 0x45, 0x78, 0x42, 0x36, \n\t0x47, 0x72, 0x67, 0x4e, 0x79, 0x67, 0x2f, 0x4c, 0x4b, 0x36, 0x57, 0x54, 0x56, 0x68, 0x6e, 0x38, 0x68, 0x7a, \n\t0x4e, 0x4e, 0x44, 0x4e, 0x54, 0x57, 0x6e, 0x52, 0x34, 0x51, 0x57, 0x5a, 0x61, 0x6c, 0x46, 0x39, 0x76, 0x4d, \n\t0x36, 0x32, 0x50, 0x71, 0x64, 0x2f, 0x69, 0x64, 0x4e, 0x66, 0x68, 0x46, 0x64, 0x68, 0x59, 0x44, 0x63, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x39, 0x54, 0x6a, 0x69, 0x76, 0x6f, 0x61, 0x7a, 0x44, 0x37, 0x75, 0x65, 0x6f, 0x66, 0x43, 0x74, \n\t0x46, 0x79, 0x68, 0x63, 0x55, 0x7a, 0x42, 0x52, 0x76, 0x75, 0x6f, 0x67, 0x78, 0x74, 0x79, 0x71, 0x7a, 0x4b, \n\t0x6f, 0x79, 0x47, 0x6d, 0x56, 0x47, 0x6f, 0x68, 0x67, 0x6d, 0x6e, 0x6e, 0x4f, 0x4e, 0x68, 0x39, 0x72, 0x62, \n\t0x50, 0x52, 0x38, 0x52, 0x65, 0x5a, 0x30, 0x79, 0x72, 0x74, 0x6c, 0x6e, 0x58, 0x37, 0x42, 0x4b, 0x62, 0x5c, 0x0a,\n\t0x09, 0x64, 0x4d, 0x62, 0x45, 0x47, 0x75, 0x65, 0x77, 0x6a, 0x6b, 0x78, 0x45, 0x37, 0x63, 0x54, 0x57, 0x5a, \n\t0x59, 0x52, 0x32, 0x43, 0x52, 0x78, 0x39, 0x4e, 0x62, 0x69, 0x72, 0x59, 0x6a, 0x4f, 0x74, 0x76, 0x4e, 0x6d, \n\t0x58, 0x49, 0x50, 0x77, 0x69, 0x6a, 0x73, 0x47, 0x71, 0x75, 0x49, 0x74, 0x57, 0x45, 0x6b, 0x51, 0x65, 0x4f, \n\t0x46, 0x76, 0x41, 0x72, 0x77, 0x4e, 0x58, 0x6c, 0x47, 0x65, 0x64, 0x6a, 0x75, 0x4d, 0x67, 0x77, 0x57, 0x5c, 0x0a,\n\t0x09, 0x69, 0x39, 0x79, 0x36, 0x4f, 0x57, 0x46, 0x68, 0x67, 0x56, 0x4f, 0x7a, 0x42, 0x36, 0x57, 0x4d, 0x46, \n\t0x46, 0x44, 0x49, 0x79, 0x30, 0x7a, 0x79, 0x6a, 0x41, 0x52, 0x6f, 0x46, 0x41, 0x6a, 0x35, 0x59, 0x56, 0x5a, \n\t0x75, 0x51, 0x72, 0x38, 0x69, 0x66, 0x70, 0x7a, 0x71, 0x30, 0x63, 0x34, 0x55, 0x58, 0x73, 0x79, 0x4a, 0x62, \n\t0x49, 0x2f, 0x35, 0x4f, 0x41, 0x6a, 0x6f, 0x57, 0x55, 0x47, 0x4a, 0x2b, 0x52, 0x64, 0x5a, 0x52, 0x58, 0x5c, 0x0a,\n\t0x09, 0x35, 0x31, 0x4d, 0x37, 0x51, 0x36, 0x61, 0x63, 0x33, 0x76, 0x72, 0x61, 0x68, 0x4d, 0x4f, 0x64, 0x41, \n\t0x74, 0x78, 0x68, 0x4f, 0x50, 0x61, 0x50, 0x51, 0x59, 0x59, 0x4b, 0x52, 0x76, 0x35, 0x68, 0x69, 0x72, 0x77, \n\t0x51, 0x34, 0x65, 0x2b, 0x44, 0x49, 0x45, 0x38, 0x73, 0x33, 0x31, 0x2b, 0x30, 0x63, 0x69, 0x44, 0x61, 0x2f, \n\t0x71, 0x33, 0x62, 0x41, 0x52, 0x42, 0x78, 0x2f, 0x77, 0x2f, 0x77, 0x76, 0x44, 0x68, 0x32, 0x65, 0x54, 0x5c, 0x0a,\n\t0x09, 0x42, 0x4b, 0x6c, 0x35, 0x65, 0x53, 0x4d, 0x54, 0x41, 0x69, 0x33, 0x65, 0x6e, 0x58, 0x4d, 0x49, 0x4b, \n\t0x78, 0x69, 0x32, 0x52, 0x33, 0x48, 0x69, 0x4c, 0x75, 0x2f, 0x42, 0x4a, 0x33, 0x79, 0x73, 0x4a, 0x6f, 0x52, \n\t0x6e, 0x62, 0x4e, 0x57, 0x62, 0x55, 0x75, 0x4c, 0x57, 0x68, 0x56, 0x71, 0x55, 0x35, 0x75, 0x7a, 0x34, 0x66, \n\t0x72, 0x46, 0x55, 0x41, 0x71, 0x7a, 0x55, 0x69, 0x49, 0x48, 0x4d, 0x78, 0x4a, 0x62, 0x63, 0x61, 0x41, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x35, 0x46, 0x58, 0x59, 0x69, 0x53, 0x73, 0x4d, 0x5a, 0x71, 0x6e, 0x4e, 0x62, 0x58, 0x55, 0x46, \n\t0x69, 0x4e, 0x47, 0x63, 0x39, 0x4a, 0x74, 0x47, 0x74, 0x77, 0x41, 0x52, 0x37, 0x36, 0x62, 0x61, 0x73, 0x76, \n\t0x5a, 0x79, 0x6e, 0x6b, 0x4e, 0x69, 0x4c, 0x77, 0x61, 0x33, 0x4f, 0x33, 0x49, 0x38, 0x6d, 0x47, 0x30, 0x55, \n\t0x69, 0x44, 0x61, 0x2f, 0x73, 0x33, 0x6e, 0x2b, 0x68, 0x66, 0x65, 0x2f, 0x5a, 0x2f, 0x41, 0x64, 0x30, 0x5c, 0x0a,\n\t0x09, 0x71, 0x6a, 0x45, 0x38, 0x4f, 0x79, 0x59, 0x4e, 0x52, 0x2f, 0x6a, 0x6c, 0x47, 0x69, 0x44, 0x70, 0x33, \n\t0x62, 0x68, 0x2b, 0x77, 0x56, 0x6a, 0x45, 0x4a, 0x63, 0x57, 0x78, 0x6e, 0x37, 0x41, 0x45, 0x61, 0x79, 0x41, \n\t0x37, 0x73, 0x6e, 0x69, 0x54, 0x73, 0x6e, 0x53, 0x6a, 0x4d, 0x77, 0x6d, 0x6b, 0x39, 0x71, 0x57, 0x4c, 0x39, \n\t0x51, 0x6e, 0x62, 0x51, 0x43, 0x6d, 0x59, 0x57, 0x46, 0x68, 0x6c, 0x72, 0x34, 0x46, 0x36, 0x41, 0x54, 0x5c, 0x0a,\n\t0x09, 0x35, 0x31, 0x31, 0x72, 0x52, 0x6b, 0x49, 0x30, 0x4e, 0x36, 0x67, 0x78, 0x53, 0x6d, 0x64, 0x67, 0x56, \n\t0x38, 0x46, 0x4b, 0x58, 0x52, 0x75, 0x5a, 0x62, 0x55, 0x61, 0x6a, 0x61, 0x35, 0x68, 0x66, 0x46, 0x6c, 0x68, \n\t0x6d, 0x6e, 0x79, 0x4d, 0x4e, 0x79, 0x4b, 0x31, 0x58, 0x77, 0x4d, 0x61, 0x4c, 0x71, 0x55, 0x7a, 0x54, 0x47, \n\t0x6b, 0x59, 0x44, 0x52, 0x48, 0x34, 0x4f, 0x35, 0x37, 0x61, 0x61, 0x32, 0x30, 0x58, 0x73, 0x72, 0x61, 0x5c, 0x0a,\n\t0x09, 0x77, 0x4d, 0x69, 0x4c, 0x5a, 0x2f, 0x38, 0x37, 0x6e, 0x2b, 0x79, 0x4e, 0x32, 0x43, 0x38, 0x50, 0x2b, \n\t0x47, 0x38, 0x32, 0x6b, 0x59, 0x68, 0x62, 0x68, 0x77, 0x74, 0x49, 0x49, 0x77, 0x6d, 0x6d, 0x67, 0x76, 0x49, \n\t0x32, 0x30, 0x47, 0x6d, 0x6a, 0x7a, 0x6e, 0x42, 0x69, 0x4e, 0x64, 0x66, 0x6c, 0x73, 0x5a, 0x50, 0x57, 0x41, \n\t0x30, 0x69, 0x38, 0x77, 0x44, 0x52, 0x71, 0x4e, 0x48, 0x56, 0x45, 0x63, 0x4f, 0x57, 0x6f, 0x38, 0x79, 0x5c, 0x0a,\n\t0x09, 0x30, 0x79, 0x6f, 0x59, 0x61, 0x56, 0x4f, 0x74, 0x33, 0x6f, 0x4d, 0x6f, 0x6d, 0x6f, 0x75, 0x55, 0x6d, \n\t0x76, 0x43, 0x6f, 0x68, 0x2f, 0x49, 0x44, 0x6a, 0x42, 0x72, 0x61, 0x54, 0x41, 0x77, 0x4a, 0x73, 0x56, 0x71, \n\t0x4f, 0x48, 0x59, 0x36, 0x50, 0x74, 0x43, 0x51, 0x4c, 0x47, 0x47, 0x33, 0x69, 0x61, 0x55, 0x32, 0x70, 0x59, \n\t0x38, 0x56, 0x2b, 0x77, 0x79, 0x53, 0x7a, 0x47, 0x37, 0x6e, 0x5a, 0x75, 0x55, 0x59, 0x6a, 0x4f, 0x50, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x44, 0x34, 0x43, 0x35, 0x50, 0x77, 0x65, 0x67, 0x57, 0x52, 0x50, 0x34, 0x2b, 0x67, 0x44, 0x7a, \n\t0x2b, 0x52, 0x58, 0x32, 0x66, 0x35, 0x4e, 0x78, 0x6c, 0x5a, 0x55, 0x44, 0x6b, 0x4f, 0x38, 0x4e, 0x68, 0x34, \n\t0x4a, 0x66, 0x42, 0x48, 0x64, 0x47, 0x64, 0x71, 0x67, 0x6d, 0x6a, 0x56, 0x4d, 0x65, 0x64, 0x41, 0x6b, 0x5a, \n\t0x52, 0x2b, 0x66, 0x4f, 0x47, 0x6b, 0x57, 0x76, 0x6d, 0x75, 0x52, 0x65, 0x37, 0x50, 0x45, 0x34, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x49, 0x78, 0x73, 0x65, 0x41, 0x36, 0x4e, 0x5a, 0x66, 0x7a, 0x68, 0x6e, 0x33, 0x65, 0x57, 0x78, 0x4f, \n\t0x41, 0x76, 0x35, 0x45, 0x30, 0x70, 0x44, 0x53, 0x66, 0x69, 0x4d, 0x4e, 0x45, 0x78, 0x43, 0x58, 0x4d, 0x50, \n\t0x73, 0x4b, 0x63, 0x79, 0x31, 0x4b, 0x57, 0x31, 0x47, 0x77, 0x38, 0x68, 0x71, 0x52, 0x68, 0x70, 0x75, 0x75, \n\t0x5a, 0x39, 0x72, 0x70, 0x45, 0x32, 0x37, 0x68, 0x45, 0x6d, 0x58, 0x42, 0x46, 0x51, 0x4b, 0x53, 0x73, 0x5c, 0x0a,\n\t0x09, 0x62, 0x55, 0x69, 0x73, 0x43, 0x56, 0x41, 0x4a, 0x53, 0x46, 0x54, 0x6a, 0x54, 0x58, 0x79, 0x4a, 0x66, \n\t0x6c, 0x44, 0x73, 0x4f, 0x78, 0x66, 0x31, 0x69, 0x2b, 0x45, 0x30, 0x30, 0x59, 0x2f, 0x55, 0x50, 0x67, 0x32, \n\t0x62, 0x41, 0x38, 0x47, 0x4b, 0x30, 0x45, 0x69, 0x4c, 0x5a, 0x66, 0x34, 0x31, 0x31, 0x42, 0x77, 0x72, 0x38, \n\t0x46, 0x2f, 0x4c, 0x65, 0x41, 0x34, 0x68, 0x65, 0x32, 0x48, 0x34, 0x7a, 0x43, 0x69, 0x57, 0x61, 0x61, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x6d, 0x78, 0x48, 0x71, 0x36, 0x50, 0x72, 0x44, 0x67, 0x69, 0x4d, 0x6f, 0x76, 0x4a, 0x36, 0x54, \n\t0x6e, 0x69, 0x4d, 0x79, 0x75, 0x69, 0x43, 0x30, 0x59, 0x77, 0x6d, 0x47, 0x6a, 0x44, 0x7a, 0x4c, 0x6f, 0x2b, \n\t0x6a, 0x52, 0x35, 0x57, 0x47, 0x6f, 0x71, 0x41, 0x54, 0x77, 0x55, 0x55, 0x76, 0x42, 0x51, 0x6b, 0x77, 0x30, \n\t0x71, 0x41, 0x77, 0x4a, 0x6c, 0x74, 0x6b, 0x70, 0x6f, 0x56, 0x7a, 0x47, 0x6b, 0x62, 0x71, 0x58, 0x47, 0x5c, 0x0a,\n\t0x09, 0x71, 0x5a, 0x42, 0x77, 0x55, 0x69, 0x48, 0x6b, 0x67, 0x57, 0x65, 0x46, 0x62, 0x54, 0x69, 0x54, 0x53, \n\t0x72, 0x72, 0x67, 0x6d, 0x4f, 0x43, 0x5a, 0x4d, 0x78, 0x35, 0x51, 0x74, 0x71, 0x33, 0x49, 0x74, 0x52, 0x58, \n\t0x50, 0x2f, 0x71, 0x4d, 0x30, 0x57, 0x33, 0x77, 0x4b, 0x46, 0x58, 0x65, 0x41, 0x42, 0x46, 0x4d, 0x42, 0x6f, \n\t0x43, 0x50, 0x77, 0x64, 0x73, 0x54, 0x50, 0x6f, 0x6f, 0x35, 0x79, 0x56, 0x4c, 0x42, 0x31, 0x45, 0x46, 0x5c, 0x0a,\n\t0x09, 0x49, 0x64, 0x7a, 0x58, 0x67, 0x58, 0x74, 0x56, 0x6c, 0x38, 0x6b, 0x30, 0x48, 0x6b, 0x61, 0x70, 0x58, \n\t0x2b, 0x34, 0x75, 0x47, 0x43, 0x55, 0x36, 0x31, 0x56, 0x37, 0x41, 0x71, 0x46, 0x48, 0x65, 0x4f, 0x42, 0x69, \n\t0x46, 0x45, 0x34, 0x6b, 0x36, 0x70, 0x63, 0x4c, 0x37, 0x59, 0x5a, 0x66, 0x48, 0x57, 0x57, 0x43, 0x55, 0x6e, \n\t0x77, 0x62, 0x5a, 0x6a, 0x6a, 0x53, 0x53, 0x73, 0x74, 0x4f, 0x4a, 0x36, 0x76, 0x43, 0x71, 0x38, 0x31, 0x5c, 0x0a,\n\t0x09, 0x59, 0x64, 0x57, 0x47, 0x74, 0x47, 0x32, 0x70, 0x65, 0x6b, 0x34, 0x69, 0x32, 0x4d, 0x51, 0x71, 0x65, \n\t0x4f, 0x66, 0x45, 0x73, 0x47, 0x48, 0x41, 0x30, 0x6e, 0x74, 0x6a, 0x57, 0x76, 0x41, 0x72, 0x51, 0x30, 0x77, \n\t0x44, 0x53, 0x67, 0x55, 0x6b, 0x35, 0x71, 0x73, 0x34, 0x6c, 0x62, 0x6f, 0x36, 0x35, 0x32, 0x51, 0x61, 0x7a, \n\t0x56, 0x35, 0x6e, 0x52, 0x65, 0x71, 0x71, 0x36, 0x48, 0x76, 0x78, 0x57, 0x79, 0x4b, 0x31, 0x49, 0x77, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x67, 0x4c, 0x67, 0x62, 0x79, 0x4f, 0x79, 0x46, 0x4b, 0x31, 0x6f, 0x36, 0x53, 0x44, 0x79, 0x63, \n\t0x67, 0x58, 0x77, 0x6e, 0x38, 0x74, 0x44, 0x71, 0x37, 0x55, 0x63, 0x51, 0x42, 0x67, 0x6c, 0x74, 0x61, 0x51, \n\t0x75, 0x47, 0x4b, 0x56, 0x41, 0x59, 0x51, 0x47, 0x33, 0x43, 0x42, 0x6a, 0x5a, 0x66, 0x4f, 0x59, 0x4d, 0x49, \n\t0x32, 0x42, 0x71, 0x47, 0x49, 0x30, 0x65, 0x49, 0x78, 0x70, 0x32, 0x31, 0x39, 0x71, 0x4b, 0x53, 0x44, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x75, 0x2b, 0x4a, 0x4e, 0x53, 0x66, 0x70, 0x6f, 0x32, 0x42, 0x33, 0x61, 0x41, 0x56, 0x38, 0x4d, \n\t0x42, 0x33, 0x67, 0x61, 0x7a, 0x41, 0x4b, 0x4f, 0x51, 0x72, 0x78, 0x6e, 0x56, 0x30, 0x6e, 0x44, 0x52, 0x59, \n\t0x4b, 0x7a, 0x79, 0x30, 0x61, 0x42, 0x4d, 0x72, 0x55, 0x50, 0x54, 0x30, 0x45, 0x32, 0x74, 0x63, 0x54, 0x4e, \n\t0x68, 0x44, 0x53, 0x68, 0x79, 0x59, 0x41, 0x4f, 0x4f, 0x2f, 0x6a, 0x31, 0x2f, 0x50, 0x52, 0x5a, 0x47, 0x5c, 0x0a,\n\t0x09, 0x50, 0x34, 0x70, 0x7a, 0x6c, 0x79, 0x2f, 0x44, 0x63, 0x62, 0x31, 0x55, 0x45, 0x47, 0x33, 0x2f, 0x78, \n\t0x68, 0x33, 0x2b, 0x5a, 0x58, 0x59, 0x2f, 0x41, 0x31, 0x78, 0x61, 0x78, 0x79, 0x77, 0x43, 0x52, 0x6c, 0x62, \n\t0x47, 0x77, 0x43, 0x69, 0x56, 0x50, 0x71, 0x72, 0x50, 0x2b, 0x51, 0x43, 0x6a, 0x59, 0x42, 0x59, 0x75, 0x43, \n\t0x45, 0x61, 0x7a, 0x72, 0x4e, 0x6a, 0x50, 0x6e, 0x31, 0x41, 0x61, 0x68, 0x68, 0x34, 0x74, 0x4b, 0x75, 0x5c, 0x0a,\n\t0x09, 0x69, 0x47, 0x6b, 0x64, 0x61, 0x69, 0x6a, 0x45, 0x62, 0x56, 0x35, 0x73, 0x41, 0x75, 0x54, 0x4e, 0x69, \n\t0x43, 0x4c, 0x7a, 0x56, 0x33, 0x79, 0x4a, 0x74, 0x71, 0x55, 0x66, 0x6f, 0x4b, 0x52, 0x67, 0x47, 0x47, 0x69, \n\t0x58, 0x56, 0x6f, 0x44, 0x62, 0x6a, 0x70, 0x4d, 0x6b, 0x62, 0x74, 0x61, 0x56, 0x4d, 0x61, 0x55, 0x54, 0x51, \n\t0x4b, 0x70, 0x34, 0x36, 0x48, 0x74, 0x38, 0x4c, 0x57, 0x31, 0x2f, 0x72, 0x36, 0x6f, 0x47, 0x46, 0x30, 0x5c, 0x0a,\n\t0x09, 0x48, 0x4a, 0x47, 0x66, 0x42, 0x4a, 0x44, 0x48, 0x37, 0x70, 0x6a, 0x75, 0x6d, 0x55, 0x34, 0x70, 0x53, \n\t0x31, 0x76, 0x69, 0x73, 0x66, 0x30, 0x62, 0x56, 0x55, 0x4f, 0x2f, 0x41, 0x63, 0x63, 0x76, 0x6c, 0x6f, 0x63, \n\t0x4a, 0x57, 0x79, 0x54, 0x71, 0x41, 0x33, 0x47, 0x38, 0x36, 0x31, 0x69, 0x71, 0x45, 0x61, 0x31, 0x4c, 0x41, \n\t0x35, 0x39, 0x50, 0x6f, 0x71, 0x31, 0x32, 0x35, 0x38, 0x4b, 0x4f, 0x38, 0x68, 0x70, 0x31, 0x50, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x67, 0x62, 0x71, 0x39, 0x6e, 0x77, 0x71, 0x75, 0x33, 0x79, 0x75, 0x48, 0x6b, 0x46, 0x5a, 0x4d, 0x65, \n\t0x49, 0x50, 0x73, 0x71, 0x6f, 0x50, 0x31, 0x61, 0x59, 0x4f, 0x5a, 0x2b, 0x6e, 0x6f, 0x2f, 0x46, 0x74, 0x74, \n\t0x47, 0x68, 0x64, 0x57, 0x57, 0x62, 0x4f, 0x68, 0x65, 0x55, 0x5a, 0x6a, 0x6e, 0x68, 0x44, 0x4d, 0x35, 0x39, \n\t0x50, 0x61, 0x74, 0x76, 0x59, 0x61, 0x46, 0x6c, 0x49, 0x76, 0x4e, 0x47, 0x5a, 0x61, 0x32, 0x77, 0x78, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x36, 0x6d, 0x36, 0x44, 0x4f, 0x4f, 0x38, 0x47, 0x46, 0x42, 0x76, 0x6a, 0x54, 0x74, 0x73, 0x6c, \n\t0x68, 0x4d, 0x74, 0x36, 0x55, 0x67, 0x74, 0x42, 0x55, 0x6e, 0x55, 0x32, 0x36, 0x35, 0x46, 0x63, 0x77, 0x4f, \n\t0x51, 0x63, 0x2f, 0x44, 0x34, 0x74, 0x34, 0x43, 0x63, 0x39, 0x4e, 0x65, 0x43, 0x2b, 0x70, 0x72, 0x73, 0x43, \n\t0x78, 0x44, 0x65, 0x6a, 0x67, 0x4e, 0x33, 0x34, 0x54, 0x75, 0x6e, 0x65, 0x71, 0x52, 0x42, 0x39, 0x73, 0x5c, 0x0a,\n\t0x09, 0x73, 0x53, 0x6a, 0x38, 0x75, 0x41, 0x66, 0x39, 0x39, 0x50, 0x61, 0x32, 0x45, 0x4f, 0x6d, 0x6c, 0x47, \n\t0x69, 0x74, 0x30, 0x52, 0x35, 0x6a, 0x42, 0x76, 0x57, 0x74, 0x33, 0x6b, 0x75, 0x51, 0x6a, 0x4f, 0x79, 0x36, \n\t0x63, 0x64, 0x70, 0x52, 0x71, 0x47, 0x38, 0x42, 0x57, 0x6c, 0x47, 0x75, 0x67, 0x36, 0x74, 0x5a, 0x53, 0x78, \n\t0x4a, 0x4d, 0x38, 0x70, 0x50, 0x55, 0x57, 0x73, 0x36, 0x77, 0x54, 0x38, 0x55, 0x66, 0x76, 0x6b, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x45, 0x54, 0x46, 0x47, 0x5a, 0x2b, 0x4e, 0x48, 0x6e, 0x6d, 0x79, 0x51, 0x2f, 0x75, 0x70, 0x79, \n\t0x59, 0x64, 0x4a, 0x33, 0x35, 0x44, 0x57, 0x6d, 0x72, 0x51, 0x32, 0x46, 0x6d, 0x73, 0x68, 0x59, 0x72, 0x57, \n\t0x6f, 0x53, 0x72, 0x73, 0x52, 0x56, 0x58, 0x37, 0x51, 0x6d, 0x68, 0x4a, 0x6d, 0x57, 0x36, 0x53, 0x4e, 0x57, \n\t0x63, 0x65, 0x32, 0x38, 0x64, 0x73, 0x4e, 0x6d, 0x69, 0x6f, 0x41, 0x41, 0x43, 0x41, 0x41, 0x53, 0x55, 0x5c, 0x0a,\n\t0x09, 0x52, 0x42, 0x56, 0x44, 0x32, 0x52, 0x4d, 0x50, 0x6c, 0x53, 0x6b, 0x79, 0x48, 0x64, 0x6f, 0x64, 0x4a, \n\t0x66, 0x68, 0x50, 0x66, 0x56, 0x78, 0x5a, 0x72, 0x52, 0x76, 0x38, 0x65, 0x52, 0x7a, 0x63, 0x66, 0x30, 0x37, \n\t0x69, 0x64, 0x4c, 0x41, 0x64, 0x48, 0x32, 0x72, 0x33, 0x39, 0x52, 0x36, 0x45, 0x54, 0x2f, 0x6a, 0x6d, 0x43, \n\t0x53, 0x74, 0x59, 0x46, 0x69, 0x54, 0x4b, 0x65, 0x61, 0x43, 0x45, 0x61, 0x70, 0x2f, 0x4b, 0x71, 0x79, 0x5c, 0x0a,\n\t0x09, 0x67, 0x2f, 0x53, 0x42, 0x6b, 0x59, 0x30, 0x2f, 0x77, 0x44, 0x42, 0x71, 0x6a, 0x4e, 0x37, 0x70, 0x4e, \n\t0x69, 0x34, 0x5a, 0x52, 0x76, 0x6d, 0x54, 0x76, 0x68, 0x4d, 0x47, 0x30, 0x42, 0x54, 0x45, 0x4d, 0x4d, 0x71, \n\t0x70, 0x4a, 0x7a, 0x78, 0x61, 0x4d, 0x38, 0x31, 0x66, 0x46, 0x34, 0x31, 0x2b, 0x57, 0x52, 0x69, 0x46, 0x34, \n\t0x31, 0x31, 0x7a, 0x62, 0x74, 0x51, 0x38, 0x72, 0x68, 0x7a, 0x61, 0x32, 0x6e, 0x79, 0x72, 0x2f, 0x30, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x6d, 0x57, 0x67, 0x51, 0x4f, 0x35, 0x54, 0x75, 0x4b, 0x52, 0x73, 0x4d, 0x73, 0x41, 0x46, 0x50, \n\t0x72, 0x30, 0x73, 0x77, 0x49, 0x58, 0x41, 0x4e, 0x4f, 0x65, 0x70, 0x4a, 0x6b, 0x59, 0x67, 0x62, 0x34, 0x31, \n\t0x73, 0x76, 0x4b, 0x50, 0x59, 0x77, 0x73, 0x6a, 0x4a, 0x44, 0x62, 0x45, 0x4c, 0x34, 0x52, 0x42, 0x44, 0x6d, \n\t0x35, 0x4e, 0x79, 0x62, 0x61, 0x6e, 0x6f, 0x4e, 0x6f, 0x2b, 0x39, 0x66, 0x44, 0x56, 0x48, 0x4c, 0x33, 0x5c, 0x0a,\n\t0x09, 0x46, 0x78, 0x47, 0x2b, 0x59, 0x58, 0x4b, 0x74, 0x70, 0x52, 0x6e, 0x75, 0x44, 0x61, 0x4e, 0x65, 0x7a, \n\t0x6d, 0x75, 0x59, 0x61, 0x4d, 0x4a, 0x6a, 0x46, 0x62, 0x39, 0x45, 0x47, 0x45, 0x58, 0x6c, 0x64, 0x59, 0x44, \n\t0x7a, 0x77, 0x4d, 0x47, 0x6f, 0x67, 0x4f, 0x49, 0x30, 0x6c, 0x54, 0x39, 0x49, 0x77, 0x79, 0x50, 0x53, 0x4d, \n\t0x4d, 0x53, 0x41, 0x4a, 0x41, 0x57, 0x6a, 0x33, 0x50, 0x7a, 0x54, 0x36, 0x59, 0x4f, 0x47, 0x6f, 0x66, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x54, 0x41, 0x4c, 0x49, 0x6a, 0x57, 0x4e, 0x58, 0x2b, 0x52, 0x4c, 0x47, 0x7a, 0x57, 0x4e, 0x72, \n\t0x38, 0x54, 0x42, 0x47, 0x4d, 0x6a, 0x42, 0x61, 0x54, 0x38, 0x68, 0x6d, 0x31, 0x7a, 0x74, 0x43, 0x32, 0x76, \n\t0x69, 0x53, 0x74, 0x47, 0x5a, 0x6d, 0x30, 0x6f, 0x57, 0x31, 0x48, 0x2f, 0x71, 0x62, 0x71, 0x64, 0x78, 0x35, \n\t0x47, 0x52, 0x51, 0x48, 0x49, 0x6a, 0x34, 0x48, 0x62, 0x6d, 0x4f, 0x32, 0x42, 0x39, 0x70, 0x63, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x57, 0x62, 0x75, 0x4f, 0x50, 0x6a, 0x5a, 0x30, 0x31, 0x4e, 0x70, 0x4c, 0x65, 0x77, 0x76, 0x47, \n\t0x4f, 0x6b, 0x38, 0x47, 0x32, 0x56, 0x4f, 0x41, 0x69, 0x50, 0x62, 0x70, 0x6b, 0x6e, 0x6e, 0x47, 0x45, 0x31, \n\t0x57, 0x78, 0x72, 0x36, 0x41, 0x55, 0x58, 0x36, 0x61, 0x73, 0x6f, 0x4f, 0x46, 0x61, 0x30, 0x4a, 0x48, 0x44, \n\t0x7a, 0x41, 0x49, 0x48, 0x54, 0x33, 0x41, 0x4b, 0x47, 0x58, 0x65, 0x47, 0x42, 0x67, 0x31, 0x6a, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x57, 0x4d, 0x67, 0x71, 0x4e, 0x5a, 0x6d, 0x56, 0x58, 0x52, 0x69, 0x4a, 0x69, 0x47, 0x69, 0x69, 0x33, \n\t0x48, 0x66, 0x30, 0x4f, 0x74, 0x5a, 0x61, 0x53, 0x74, 0x31, 0x75, 0x71, 0x55, 0x39, 0x70, 0x4e, 0x63, 0x74, \n\t0x32, 0x5a, 0x4d, 0x74, 0x64, 0x62, 0x4a, 0x6b, 0x41, 0x6d, 0x48, 0x64, 0x6a, 0x54, 0x58, 0x4b, 0x49, 0x66, \n\t0x42, 0x4d, 0x32, 0x44, 0x7a, 0x5a, 0x66, 0x36, 0x63, 0x31, 0x6f, 0x79, 0x34, 0x41, 0x65, 0x54, 0x62, 0x5c, 0x0a,\n\t0x09, 0x45, 0x4a, 0x43, 0x54, 0x5a, 0x73, 0x6e, 0x6e, 0x41, 0x6d, 0x52, 0x50, 0x51, 0x56, 0x52, 0x72, 0x51, \n\t0x2f, 0x77, 0x77, 0x75, 0x4b, 0x75, 0x71, 0x69, 0x4b, 0x6c, 0x41, 0x77, 0x59, 0x72, 0x43, 0x79, 0x4e, 0x59, \n\t0x6c, 0x6b, 0x57, 0x65, 0x6a, 0x7a, 0x4c, 0x34, 0x77, 0x69, 0x6a, 0x76, 0x39, 0x65, 0x70, 0x64, 0x48, 0x6b, \n\t0x48, 0x7a, 0x62, 0x56, 0x30, 0x79, 0x42, 0x51, 0x4a, 0x74, 0x71, 0x44, 0x56, 0x4d, 0x72, 0x67, 0x43, 0x5c, 0x0a,\n\t0x09, 0x53, 0x6e, 0x58, 0x6f, 0x56, 0x76, 0x4e, 0x53, 0x42, 0x72, 0x41, 0x69, 0x6d, 0x34, 0x64, 0x63, 0x48, \n\t0x49, 0x6a, 0x6c, 0x78, 0x46, 0x5a, 0x6c, 0x71, 0x73, 0x64, 0x59, 0x6e, 0x32, 0x55, 0x55, 0x55, 0x6a, 0x65, \n\t0x54, 0x72, 0x66, 0x74, 0x75, 0x46, 0x37, 0x42, 0x5a, 0x4c, 0x57, 0x6f, 0x58, 0x37, 0x62, 0x6a, 0x70, 0x54, \n\t0x50, 0x79, 0x50, 0x38, 0x37, 0x2f, 0x45, 0x33, 0x41, 0x70, 0x6f, 0x46, 0x52, 0x41, 0x63, 0x4b, 0x50, 0x5c, 0x0a,\n\t0x09, 0x34, 0x6a, 0x69, 0x38, 0x46, 0x30, 0x72, 0x52, 0x33, 0x6d, 0x70, 0x45, 0x5a, 0x59, 0x4e, 0x75, 0x42, \n\t0x4c, 0x36, 0x76, 0x50, 0x4e, 0x46, 0x69, 0x6c, 0x6b, 0x30, 0x45, 0x49, 0x78, 0x4e, 0x63, 0x4e, 0x6f, 0x7a, \n\t0x59, 0x44, 0x7a, 0x42, 0x4b, 0x33, 0x63, 0x63, 0x70, 0x59, 0x44, 0x52, 0x75, 0x58, 0x64, 0x71, 0x65, 0x77, \n\t0x4b, 0x68, 0x41, 0x38, 0x70, 0x32, 0x36, 0x59, 0x68, 0x55, 0x55, 0x74, 0x49, 0x39, 0x48, 0x61, 0x54, 0x5c, 0x0a,\n\t0x09, 0x37, 0x61, 0x4d, 0x59, 0x32, 0x43, 0x55, 0x51, 0x51, 0x44, 0x69, 0x61, 0x2b, 0x72, 0x48, 0x4d, 0x75, \n\t0x36, 0x30, 0x77, 0x63, 0x59, 0x57, 0x58, 0x4e, 0x51, 0x78, 0x56, 0x55, 0x4c, 0x57, 0x68, 0x55, 0x63, 0x46, \n\t0x4a, 0x44, 0x45, 0x2b, 0x6e, 0x2b, 0x36, 0x35, 0x69, 0x69, 0x31, 0x44, 0x65, 0x32, 0x6e, 0x70, 0x67, 0x46, \n\t0x55, 0x35, 0x6c, 0x6d, 0x52, 0x71, 0x48, 0x38, 0x43, 0x56, 0x4e, 0x6e, 0x46, 0x73, 0x50, 0x58, 0x56, 0x5c, 0x0a,\n\t0x09, 0x31, 0x44, 0x34, 0x69, 0x46, 0x39, 0x70, 0x30, 0x42, 0x63, 0x4c, 0x33, 0x67, 0x43, 0x43, 0x50, 0x4c, \n\t0x6c, 0x59, 0x72, 0x32, 0x6a, 0x4d, 0x51, 0x62, 0x66, 0x2b, 0x61, 0x2f, 0x33, 0x4a, 0x41, 0x75, 0x62, 0x32, \n\t0x48, 0x6d, 0x6b, 0x6f, 0x2b, 0x4b, 0x34, 0x79, 0x61, 0x6e, 0x57, 0x71, 0x70, 0x4d, 0x42, 0x49, 0x4c, 0x43, \n\t0x74, 0x73, 0x2b, 0x6c, 0x57, 0x65, 0x6a, 0x7a, 0x42, 0x57, 0x47, 0x6b, 0x61, 0x37, 0x7a, 0x71, 0x73, 0x5c, 0x0a,\n\t0x09, 0x47, 0x6f, 0x4f, 0x49, 0x74, 0x55, 0x6e, 0x35, 0x73, 0x4f, 0x45, 0x41, 0x6e, 0x6d, 0x6c, 0x74, 0x61, \n\t0x49, 0x72, 0x4a, 0x6e, 0x57, 0x42, 0x71, 0x4e, 0x52, 0x6e, 0x4b, 0x62, 0x68, 0x6f, 0x43, 0x36, 0x49, 0x48, \n\t0x64, 0x6a, 0x4b, 0x32, 0x61, 0x32, 0x64, 0x78, 0x46, 0x46, 0x65, 0x47, 0x6b, 0x59, 0x31, 0x62, 0x4d, 0x53, \n\t0x43, 0x4a, 0x54, 0x49, 0x66, 0x4e, 0x56, 0x79, 0x4d, 0x56, 0x70, 0x4e, 0x79, 0x69, 0x6b, 0x65, 0x61, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x7a, 0x62, 0x78, 0x64, 0x50, 0x32, 0x74, 0x68, 0x75, 0x58, 0x50, 0x48, 0x2f, 0x72, 0x4c, 0x77, \n\t0x4a, 0x61, 0x42, 0x45, 0x53, 0x44, 0x46, 0x44, 0x34, 0x41, 0x37, 0x76, 0x4f, 0x68, 0x4a, 0x6a, 0x6e, 0x73, \n\t0x43, 0x6f, 0x75, 0x31, 0x66, 0x2f, 0x65, 0x49, 0x41, 0x6d, 0x5a, 0x63, 0x44, 0x58, 0x39, 0x58, 0x64, 0x6b, \n\t0x56, 0x56, 0x34, 0x51, 0x54, 0x43, 0x4b, 0x77, 0x6e, 0x73, 0x47, 0x49, 0x31, 0x75, 0x65, 0x7a, 0x37, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x52, 0x35, 0x70, 0x4a, 0x68, 0x31, 0x42, 0x42, 0x62, 0x37, 0x78, 0x57, 0x45, 0x6b, 0x57, 0x77, \n\t0x44, 0x52, 0x51, 0x6d, 0x6a, 0x6c, 0x4f, 0x59, 0x54, 0x64, 0x65, 0x70, 0x77, 0x4c, 0x67, 0x45, 0x6a, 0x66, \n\t0x53, 0x32, 0x37, 0x43, 0x52, 0x68, 0x70, 0x45, 0x38, 0x73, 0x41, 0x4a, 0x77, 0x4b, 0x56, 0x68, 0x6f, 0x57, \n\t0x42, 0x55, 0x64, 0x48, 0x55, 0x62, 0x45, 0x52, 0x70, 0x53, 0x65, 0x32, 0x54, 0x47, 0x6c, 0x4d, 0x77, 0x5c, 0x0a,\n\t0x09, 0x73, 0x76, 0x41, 0x79, 0x6d, 0x6b, 0x39, 0x6b, 0x67, 0x67, 0x56, 0x7a, 0x54, 0x6d, 0x74, 0x75, 0x43, \n\t0x71, 0x54, 0x5a, 0x45, 0x54, 0x6a, 0x30, 0x39, 0x62, 0x37, 0x4f, 0x31, 0x44, 0x41, 0x58, 0x4c, 0x6b, 0x47, \n\t0x4b, 0x62, 0x77, 0x4e, 0x42, 0x48, 0x72, 0x6c, 0x39, 0x68, 0x67, 0x66, 0x5a, 0x4c, 0x58, 0x74, 0x6f, 0x6d, \n\t0x72, 0x6b, 0x74, 0x34, 0x4e, 0x39, 0x57, 0x77, 0x62, 0x6d, 0x44, 0x6f, 0x6e, 0x2b, 0x6e, 0x4f, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x69, 0x37, 0x50, 0x44, 0x62, 0x79, 0x6d, 0x78, 0x5a, 0x47, 0x2b, 0x33, 0x46, 0x6a, 0x74, 0x55, 0x4a, \n\t0x70, 0x4a, 0x79, 0x67, 0x59, 0x6f, 0x55, 0x45, 0x53, 0x66, 0x44, 0x77, 0x4a, 0x47, 0x46, 0x57, 0x64, 0x4e, \n\t0x6c, 0x7a, 0x72, 0x34, 0x34, 0x4c, 0x57, 0x55, 0x32, 0x67, 0x59, 0x46, 0x58, 0x57, 0x2b, 0x45, 0x59, 0x43, \n\t0x38, 0x58, 0x79, 0x66, 0x4b, 0x78, 0x79, 0x37, 0x58, 0x30, 0x48, 0x58, 0x52, 0x6d, 0x6b, 0x38, 0x77, 0x5c, 0x0a,\n\t0x09, 0x30, 0x7a, 0x6f, 0x30, 0x6e, 0x38, 0x62, 0x63, 0x49, 0x32, 0x31, 0x65, 0x4a, 0x62, 0x51, 0x67, 0x73, \n\t0x59, 0x41, 0x4b, 0x37, 0x64, 0x64, 0x6d, 0x6f, 0x4d, 0x6e, 0x6e, 0x38, 0x4d, 0x73, 0x70, 0x50, 0x33, 0x33, \n\t0x57, 0x67, 0x4e, 0x48, 0x66, 0x41, 0x34, 0x61, 0x4c, 0x39, 0x42, 0x55, 0x74, 0x48, 0x45, 0x54, 0x62, 0x76, \n\t0x2f, 0x72, 0x46, 0x34, 0x66, 0x42, 0x76, 0x49, 0x75, 0x35, 0x70, 0x55, 0x57, 0x52, 0x62, 0x52, 0x35, 0x5c, 0x0a,\n\t0x09, 0x34, 0x61, 0x46, 0x48, 0x46, 0x34, 0x6c, 0x54, 0x5a, 0x57, 0x61, 0x38, 0x52, 0x33, 0x50, 0x74, 0x51, \n\t0x78, 0x4d, 0x43, 0x4c, 0x64, 0x36, 0x63, 0x2f, 0x66, 0x58, 0x52, 0x37, 0x72, 0x54, 0x69, 0x33, 0x56, 0x30, \n\t0x6f, 0x34, 0x41, 0x49, 0x77, 0x32, 0x50, 0x59, 0x49, 0x5a, 0x70, 0x47, 0x47, 0x6c, 0x34, 0x57, 0x5a, 0x4d, \n\t0x73, 0x64, 0x4e, 0x79, 0x43, 0x35, 0x6f, 0x5a, 0x72, 0x4f, 0x70, 0x33, 0x71, 0x33, 0x41, 0x31, 0x74, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x41, 0x47, 0x65, 0x61, 0x4a, 0x54, 0x4e, 0x6d, 0x47, 0x6c, 0x74, 0x66, 0x70, 0x38, 0x49, 0x4e, \n\t0x4e, 0x6f, 0x63, 0x4e, 0x50, 0x36, 0x6b, 0x68, 0x6d, 0x4e, 0x62, 0x58, 0x36, 0x66, 0x6e, 0x45, 0x74, 0x6e, \n\t0x72, 0x43, 0x6d, 0x41, 0x54, 0x44, 0x69, 0x6c, 0x66, 0x6b, 0x57, 0x63, 0x35, 0x79, 0x4c, 0x55, 0x49, 0x33, \n\t0x77, 0x43, 0x43, 0x50, 0x4c, 0x77, 0x59, 0x72, 0x57, 0x69, 0x76, 0x4e, 0x4b, 0x4a, 0x6a, 0x6c, 0x48, 0x5c, 0x0a,\n\t0x09, 0x75, 0x65, 0x6a, 0x4f, 0x6c, 0x55, 0x4b, 0x6e, 0x77, 0x41, 0x59, 0x54, 0x54, 0x78, 0x4c, 0x6f, 0x39, \n\t0x74, 0x4d, 0x47, 0x6f, 0x41, 0x62, 0x71, 0x39, 0x67, 0x46, 0x4f, 0x4c, 0x61, 0x79, 0x6c, 0x67, 0x69, 0x6a, \n\t0x41, 0x72, 0x76, 0x73, 0x4a, 0x62, 0x43, 0x33, 0x34, 0x4d, 0x41, 0x68, 0x58, 0x41, 0x63, 0x4e, 0x43, 0x59, \n\t0x44, 0x6c, 0x51, 0x67, 0x6f, 0x32, 0x6f, 0x78, 0x4b, 0x77, 0x53, 0x68, 0x6f, 0x56, 0x4b, 0x50, 0x45, 0x5c, 0x0a,\n\t0x09, 0x74, 0x58, 0x6d, 0x64, 0x52, 0x38, 0x4e, 0x4d, 0x73, 0x2b, 0x5a, 0x63, 0x75, 0x4e, 0x61, 0x59, 0x57, \n\t0x56, 0x49, 0x67, 0x68, 0x5a, 0x6d, 0x66, 0x46, 0x4d, 0x45, 0x73, 0x59, 0x61, 0x59, 0x31, 0x52, 0x73, 0x35, \n\t0x30, 0x32, 0x38, 0x7a, 0x63, 0x4a, 0x44, 0x75, 0x4b, 0x31, 0x70, 0x68, 0x37, 0x56, 0x4d, 0x43, 0x68, 0x72, \n\t0x79, 0x71, 0x4e, 0x6c, 0x77, 0x70, 0x47, 0x52, 0x59, 0x44, 0x52, 0x44, 0x37, 0x48, 0x41, 0x6a, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x75, 0x46, 0x45, 0x54, 0x62, 0x76, 0x2f, 0x70, 0x43, 0x66, 0x2b, 0x53, 0x2b, 0x44, 0x37, 0x32, \n\t0x6f, 0x74, 0x65, 0x48, 0x41, 0x58, 0x51, 0x61, 0x4d, 0x51, 0x74, 0x79, 0x30, 0x5a, 0x65, 0x77, 0x52, 0x6a, \n\t0x4b, 0x4c, 0x4b, 0x4c, 0x68, 0x74, 0x47, 0x39, 0x72, 0x6d, 0x6c, 0x79, 0x75, 0x67, 0x42, 0x6f, 0x31, 0x6d, \n\t0x6b, 0x44, 0x55, 0x61, 0x79, 0x53, 0x32, 0x32, 0x61, 0x74, 0x57, 0x6c, 0x47, 0x2f, 0x69, 0x38, 0x46, 0x5c, 0x0a,\n\t0x09, 0x30, 0x5a, 0x63, 0x35, 0x52, 0x4d, 0x55, 0x31, 0x2f, 0x45, 0x4f, 0x71, 0x6b, 0x77, 0x63, 0x59, 0x36, \n\t0x64, 0x45, 0x6e, 0x36, 0x34, 0x75, 0x4b, 0x7a, 0x4c, 0x51, 0x45, 0x6a, 0x43, 0x49, 0x49, 0x57, 0x6d, 0x32, \n\t0x70, 0x4e, 0x4c, 0x32, 0x6b, 0x55, 0x4a, 0x2b, 0x37, 0x31, 0x68, 0x4d, 0x64, 0x37, 0x65, 0x72, 0x39, 0x79, \n\t0x50, 0x6d, 0x73, 0x6c, 0x33, 0x59, 0x55, 0x35, 0x71, 0x2f, 0x56, 0x6b, 0x70, 0x51, 0x76, 0x79, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x70, 0x31, 0x37, 0x6d, 0x67, 0x35, 0x34, 0x37, 0x6f, 0x30, 0x79, 0x56, 0x51, 0x62, 0x75, 0x41, 0x58, \n\t0x6b, 0x4b, 0x78, 0x64, 0x6c, 0x6e, 0x69, 0x30, 0x55, 0x52, 0x48, 0x36, 0x45, 0x36, 0x68, 0x4c, 0x67, 0x2b, \n\t0x37, 0x73, 0x37, 0x46, 0x65, 0x77, 0x39, 0x6a, 0x4c, 0x54, 0x2f, 0x5a, 0x74, 0x6f, 0x79, 0x7a, 0x4f, 0x31, \n\t0x62, 0x42, 0x49, 0x79, 0x36, 0x5a, 0x70, 0x55, 0x6e, 0x59, 0x65, 0x53, 0x6a, 0x56, 0x68, 0x6c, 0x47, 0x5c, 0x0a,\n\t0x09, 0x58, 0x64, 0x70, 0x57, 0x48, 0x30, 0x6e, 0x43, 0x53, 0x47, 0x6b, 0x6e, 0x48, 0x67, 0x62, 0x74, 0x5a, \n\t0x70, 0x6f, 0x48, 0x56, 0x72, 0x51, 0x56, 0x62, 0x49, 0x42, 0x52, 0x38, 0x4b, 0x58, 0x73, 0x78, 0x75, 0x6d, \n\t0x6c, 0x38, 0x4c, 0x44, 0x7a, 0x57, 0x70, 0x5a, 0x6f, 0x47, 0x47, 0x68, 0x74, 0x71, 0x67, 0x4e, 0x47, 0x6f, \n\t0x63, 0x4e, 0x58, 0x6e, 0x37, 0x78, 0x4f, 0x61, 0x54, 0x36, 0x31, 0x36, 0x53, 0x56, 0x56, 0x66, 0x58, 0x5c, 0x0a,\n\t0x09, 0x62, 0x72, 0x39, 0x74, 0x6c, 0x52, 0x4d, 0x57, 0x74, 0x2b, 0x56, 0x57, 0x6b, 0x43, 0x6c, 0x4b, 0x79, \n\t0x76, 0x61, 0x57, 0x54, 0x4b, 0x73, 0x64, 0x72, 0x53, 0x43, 0x41, 0x37, 0x2f, 0x42, 0x63, 0x72, 0x76, 0x6f, \n\t0x34, 0x6d, 0x2f, 0x78, 0x52, 0x57, 0x4d, 0x76, 0x68, 0x73, 0x45, 0x2b, 0x62, 0x50, 0x71, 0x63, 0x31, 0x39, \n\t0x7a, 0x6b, 0x34, 0x57, 0x42, 0x36, 0x4e, 0x79, 0x76, 0x76, 0x41, 0x67, 0x41, 0x45, 0x58, 0x34, 0x51, 0x5c, 0x0a,\n\t0x09, 0x75, 0x43, 0x43, 0x5a, 0x61, 0x43, 0x79, 0x4d, 0x64, 0x4a, 0x79, 0x4b, 0x58, 0x79, 0x55, 0x59, 0x32, \n\t0x55, 0x34, 0x31, 0x64, 0x78, 0x69, 0x35, 0x5a, 0x70, 0x36, 0x64, 0x4d, 0x4c, 0x4a, 0x4c, 0x51, 0x64, 0x53, \n\t0x35, 0x53, 0x57, 0x41, 0x55, 0x6c, 0x64, 0x63, 0x48, 0x52, 0x6a, 0x59, 0x38, 0x44, 0x6b, 0x62, 0x4d, 0x4a, \n\t0x6f, 0x31, 0x37, 0x6f, 0x6b, 0x32, 0x6c, 0x47, 0x6a, 0x70, 0x6c, 0x5a, 0x35, 0x59, 0x36, 0x33, 0x67, 0x5c, 0x0a,\n\t0x09, 0x49, 0x72, 0x61, 0x43, 0x69, 0x56, 0x64, 0x67, 0x4b, 0x78, 0x2b, 0x61, 0x4c, 0x54, 0x61, 0x33, 0x4e, \n\t0x4b, 0x67, 0x55, 0x46, 0x50, 0x52, 0x49, 0x77, 0x36, 0x76, 0x36, 0x68, 0x34, 0x62, 0x63, 0x4b, 0x46, 0x4f, \n\t0x47, 0x30, 0x65, 0x47, 0x6a, 0x4f, 0x73, 0x67, 0x6c, 0x45, 0x34, 0x74, 0x36, 0x76, 0x4b, 0x30, 0x66, 0x34, \n\t0x66, 0x65, 0x36, 0x78, 0x39, 0x53, 0x4e, 0x5a, 0x4d, 0x55, 0x39, 0x70, 0x58, 0x56, 0x45, 0x34, 0x65, 0x5c, 0x0a,\n\t0x09, 0x31, 0x39, 0x46, 0x64, 0x43, 0x4a, 0x73, 0x76, 0x71, 0x42, 0x39, 0x55, 0x72, 0x52, 0x6e, 0x39, 0x42, \n\t0x58, 0x44, 0x58, 0x4c, 0x32, 0x49, 0x6f, 0x66, 0x38, 0x45, 0x2b, 0x49, 0x6e, 0x63, 0x6c, 0x38, 0x44, 0x32, \n\t0x4e, 0x54, 0x71, 0x36, 0x6c, 0x45, 0x30, 0x61, 0x70, 0x46, 0x33, 0x63, 0x4b, 0x47, 0x4f, 0x6e, 0x69, 0x65, \n\t0x73, 0x47, 0x6f, 0x70, 0x63, 0x79, 0x32, 0x4d, 0x68, 0x72, 0x58, 0x48, 0x51, 0x41, 0x59, 0x54, 0x62, 0x5c, 0x0a,\n\t0x09, 0x73, 0x55, 0x4a, 0x43, 0x71, 0x6a, 0x43, 0x30, 0x59, 0x7a, 0x2b, 0x6f, 0x75, 0x71, 0x4f, 0x67, 0x61, \n\t0x74, 0x53, 0x4d, 0x4d, 0x69, 0x50, 0x75, 0x35, 0x30, 0x59, 0x45, 0x63, 0x77, 0x43, 0x6e, 0x42, 0x51, 0x61, \n\t0x5a, 0x49, 0x77, 0x32, 0x71, 0x32, 0x76, 0x54, 0x2f, 0x71, 0x42, 0x7a, 0x4e, 0x2f, 0x57, 0x34, 0x58, 0x59, \n\t0x4e, 0x6b, 0x54, 0x59, 0x59, 0x6d, 0x51, 0x38, 0x36, 0x52, 0x76, 0x34, 0x69, 0x61, 0x35, 0x70, 0x70, 0x5c, 0x0a,\n\t0x09, 0x72, 0x55, 0x71, 0x62, 0x6a, 0x72, 0x62, 0x4d, 0x45, 0x65, 0x30, 0x61, 0x6b, 0x63, 0x2f, 0x33, 0x30, \n\t0x4a, 0x2f, 0x33, 0x31, 0x2b, 0x43, 0x68, 0x43, 0x56, 0x41, 0x34, 0x70, 0x50, 0x67, 0x75, 0x45, 0x4f, 0x53, \n\t0x68, 0x4c, 0x35, 0x7a, 0x78, 0x34, 0x63, 0x57, 0x79, 0x45, 0x42, 0x43, 0x64, 0x2b, 0x2b, 0x55, 0x58, 0x68, \n\t0x68, 0x37, 0x77, 0x76, 0x65, 0x41, 0x4f, 0x41, 0x55, 0x32, 0x4e, 0x51, 0x38, 0x75, 0x69, 0x59, 0x54, 0x5c, 0x0a,\n\t0x09, 0x54, 0x74, 0x55, 0x70, 0x44, 0x65, 0x5a, 0x53, 0x51, 0x36, 0x31, 0x56, 0x37, 0x41, 0x71, 0x46, 0x48, \n\t0x65, 0x4f, 0x42, 0x69, 0x46, 0x45, 0x34, 0x6b, 0x36, 0x70, 0x63, 0x4c, 0x37, 0x41, 0x55, 0x5a, 0x41, 0x42, \n\t0x61, 0x4e, 0x6f, 0x38, 0x57, 0x73, 0x34, 0x44, 0x6a, 0x44, 0x79, 0x36, 0x52, 0x71, 0x67, 0x30, 0x66, 0x34, \n\t0x64, 0x72, 0x65, 0x6d, 0x30, 0x77, 0x43, 0x67, 0x34, 0x77, 0x47, 0x56, 0x58, 0x41, 0x55, 0x53, 0x44, 0x5c, 0x0a,\n\t0x09, 0x51, 0x35, 0x74, 0x70, 0x65, 0x5a, 0x78, 0x48, 0x59, 0x34, 0x54, 0x4c, 0x6d, 0x6d, 0x31, 0x4b, 0x34, \n\t0x7a, 0x49, 0x6d, 0x56, 0x77, 0x79, 0x6a, 0x5a, 0x6e, 0x78, 0x61, 0x43, 0x77, 0x71, 0x6d, 0x6d, 0x49, 0x61, \n\t0x53, 0x39, 0x54, 0x50, 0x5a, 0x4f, 0x76, 0x6d, 0x2f, 0x77, 0x2b, 0x74, 0x67, 0x38, 0x50, 0x51, 0x55, 0x6a, \n\t0x4c, 0x36, 0x4e, 0x61, 0x75, 0x62, 0x6a, 0x2f, 0x47, 0x53, 0x52, 0x47, 0x74, 0x45, 0x46, 0x69, 0x48, 0x5c, 0x0a,\n\t0x09, 0x78, 0x58, 0x65, 0x52, 0x67, 0x36, 0x58, 0x59, 0x6a, 0x71, 0x36, 0x46, 0x44, 0x51, 0x45, 0x30, 0x59, \n\t0x32, 0x76, 0x49, 0x49, 0x77, 0x61, 0x73, 0x69, 0x63, 0x59, 0x5a, 0x54, 0x55, 0x6b, 0x72, 0x70, 0x67, 0x6c, \n\t0x41, 0x4b, 0x46, 0x42, 0x64, 0x77, 0x69, 0x59, 0x47, 0x54, 0x7a, 0x6d, 0x53, 0x4f, 0x4d, 0x71, 0x6e, 0x78, \n\t0x56, 0x78, 0x32, 0x34, 0x34, 0x70, 0x7a, 0x32, 0x4d, 0x69, 0x6e, 0x5a, 0x51, 0x52, 0x5a, 0x70, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x43, 0x6b, 0x61, 0x46, 0x64, 0x6f, 0x59, 0x62, 0x61, 0x44, 0x53, 0x63, 0x30, 0x75, 0x46, 0x61, 0x72, \n\t0x66, 0x57, 0x59, 0x73, 0x4e, 0x56, 0x47, 0x47, 0x75, 0x63, 0x74, 0x6f, 0x4c, 0x52, 0x6d, 0x70, 0x45, 0x43, \n\t0x69, 0x35, 0x78, 0x59, 0x46, 0x66, 0x31, 0x4a, 0x55, 0x56, 0x67, 0x42, 0x73, 0x48, 0x71, 0x64, 0x4e, 0x61, \n\t0x6b, 0x49, 0x47, 0x55, 0x6f, 0x65, 0x2b, 0x76, 0x4c, 0x79, 0x56, 0x4d, 0x59, 0x77, 0x75, 0x68, 0x65, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x76, 0x7a, 0x4e, 0x73, 0x38, 0x6d, 0x7a, 0x75, 0x49, 0x7a, 0x76, 0x33, 0x50, 0x46, 0x77, 0x57, \n\t0x51, 0x66, 0x42, 0x64, 0x77, 0x6f, 0x71, 0x37, 0x77, 0x70, 0x4c, 0x2b, 0x2b, 0x4e, 0x6b, 0x32, 0x48, 0x31, \n\t0x72, 0x53, 0x6e, 0x4d, 0x4c, 0x4c, 0x53, 0x41, 0x61, 0x4f, 0x4f, 0x71, 0x51, 0x4e, 0x31, 0x2f, 0x43, 0x72, \n\t0x41, 0x79, 0x4f, 0x59, 0x7a, 0x62, 0x78, 0x6a, 0x5a, 0x46, 0x66, 0x75, 0x32, 0x6a, 0x44, 0x6e, 0x41, 0x5c, 0x0a,\n\t0x09, 0x71, 0x46, 0x72, 0x66, 0x5a, 0x66, 0x31, 0x45, 0x43, 0x6a, 0x36, 0x49, 0x67, 0x6c, 0x45, 0x65, 0x78, \n\t0x77, 0x56, 0x34, 0x52, 0x4b, 0x4e, 0x4b, 0x52, 0x5a, 0x78, 0x76, 0x4e, 0x62, 0x53, 0x75, 0x79, 0x6f, 0x68, \n\t0x4d, 0x49, 0x6d, 0x30, 0x57, 0x36, 0x57, 0x75, 0x31, 0x65, 0x5a, 0x51, 0x61, 0x55, 0x6c, 0x66, 0x51, 0x61, \n\t0x59, 0x4e, 0x55, 0x70, 0x35, 0x6b, 0x32, 0x4d, 0x75, 0x65, 0x43, 0x36, 0x61, 0x69, 0x76, 0x4e, 0x39, 0x5c, 0x0a,\n\t0x09, 0x70, 0x54, 0x61, 0x70, 0x6d, 0x48, 0x31, 0x65, 0x53, 0x32, 0x37, 0x67, 0x42, 0x33, 0x4c, 0x41, 0x57, \n\t0x6a, 0x62, 0x77, 0x5a, 0x42, 0x48, 0x76, 0x79, 0x43, 0x47, 0x52, 0x35, 0x61, 0x4c, 0x41, 0x76, 0x53, 0x69, \n\t0x4e, 0x77, 0x57, 0x70, 0x56, 0x6c, 0x57, 0x42, 0x68, 0x57, 0x4d, 0x59, 0x70, 0x44, 0x32, 0x67, 0x56, 0x46, \n\t0x4c, 0x2b, 0x71, 0x6c, 0x41, 0x30, 0x53, 0x78, 0x6a, 0x4c, 0x72, 0x73, 0x38, 0x64, 0x6e, 0x57, 0x71, 0x5c, 0x0a,\n\t0x09, 0x70, 0x63, 0x46, 0x49, 0x79, 0x7a, 0x67, 0x59, 0x57, 0x58, 0x2b, 0x52, 0x71, 0x57, 0x4f, 0x79, 0x6a, \n\t0x42, 0x57, 0x44, 0x45, 0x5a, 0x6b, 0x76, 0x4b, 0x41, 0x55, 0x6a, 0x64, 0x56, 0x7a, 0x42, 0x4b, 0x47, 0x67, \n\t0x4e, 0x46, 0x6b, 0x62, 0x61, 0x7a, 0x36, 0x4a, 0x39, 0x52, 0x72, 0x35, 0x7a, 0x4e, 0x6d, 0x43, 0x6b, 0x7a, \n\t0x52, 0x30, 0x46, 0x73, 0x38, 0x69, 0x42, 0x62, 0x54, 0x55, 0x6c, 0x62, 0x61, 0x59, 0x6c, 0x66, 0x45, 0x5c, 0x0a,\n\t0x09, 0x77, 0x61, 0x50, 0x74, 0x47, 0x38, 0x70, 0x51, 0x41, 0x6a, 0x39, 0x61, 0x57, 0x51, 0x68, 0x6d, 0x38, \n\t0x71, 0x4e, 0x33, 0x55, 0x79, 0x77, 0x2f, 0x65, 0x4e, 0x57, 0x64, 0x63, 0x61, 0x55, 0x46, 0x5a, 0x44, 0x63, \n\t0x72, 0x44, 0x31, 0x6b, 0x67, 0x41, 0x66, 0x44, 0x61, 0x4d, 0x76, 0x41, 0x33, 0x66, 0x4e, 0x50, 0x4c, 0x57, \n\t0x69, 0x75, 0x59, 0x4c, 0x6f, 0x33, 0x50, 0x39, 0x38, 0x63, 0x54, 0x6a, 0x38, 0x5a, 0x6f, 0x51, 0x72, 0x5c, 0x0a,\n\t0x09, 0x79, 0x73, 0x4e, 0x5a, 0x59, 0x64, 0x54, 0x6c, 0x61, 0x78, 0x6b, 0x54, 0x31, 0x74, 0x66, 0x4d, 0x43, \n\t0x30, 0x61, 0x32, 0x44, 0x6c, 0x48, 0x5a, 0x51, 0x66, 0x72, 0x41, 0x79, 0x4d, 0x62, 0x50, 0x47, 0x30, 0x59, \n\t0x32, 0x2f, 0x5a, 0x4a, 0x68, 0x70, 0x4f, 0x73, 0x51, 0x74, 0x58, 0x47, 0x4f, 0x4d, 0x43, 0x71, 0x67, 0x6f, \n\t0x52, 0x6c, 0x46, 0x54, 0x75, 0x55, 0x32, 0x7a, 0x53, 0x68, 0x63, 0x48, 0x45, 0x41, 0x53, 0x6a, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x64, 0x39, 0x66, 0x59, 0x31, 0x6d, 0x56, 0x65, 0x69, 0x52, 0x4d, 0x79, 0x48, 0x57, 0x51, 0x6e, 0x7a, \n\t0x61, 0x41, 0x43, 0x7a, 0x4a, 0x69, 0x54, 0x66, 0x66, 0x74, 0x32, 0x5a, 0x62, 0x43, 0x6b, 0x59, 0x42, 0x65, \n\t0x69, 0x6d, 0x66, 0x55, 0x41, 0x30, 0x52, 0x45, 0x5a, 0x32, 0x76, 0x31, 0x72, 0x6a, 0x61, 0x4e, 0x43, 0x4f, \n\t0x6a, 0x44, 0x54, 0x58, 0x4d, 0x4d, 0x35, 0x32, 0x58, 0x7a, 0x2b, 0x65, 0x51, 0x37, 0x39, 0x4f, 0x68, 0x5c, 0x0a,\n\t0x09, 0x30, 0x35, 0x59, 0x77, 0x63, 0x6f, 0x6a, 0x38, 0x31, 0x52, 0x6d, 0x65, 0x56, 0x45, 0x50, 0x6d, 0x75, \n\t0x6e, 0x6d, 0x2b, 0x42, 0x35, 0x48, 0x44, 0x38, 0x56, 0x46, 0x45, 0x6e, 0x6c, 0x46, 0x65, 0x47, 0x47, 0x49, \n\t0x6c, 0x5a, 0x46, 0x53, 0x46, 0x34, 0x79, 0x78, 0x4e, 0x50, 0x52, 0x6f, 0x62, 0x76, 0x72, 0x63, 0x36, 0x68, \n\t0x33, 0x77, 0x5a, 0x48, 0x65, 0x47, 0x65, 0x65, 0x66, 0x62, 0x65, 0x6a, 0x4e, 0x2b, 0x32, 0x53, 0x61, 0x5c, 0x0a,\n\t0x09, 0x65, 0x50, 0x32, 0x6c, 0x51, 0x59, 0x36, 0x37, 0x4b, 0x6a, 0x44, 0x56, 0x57, 0x38, 0x6d, 0x4c, 0x72, \n\t0x59, 0x4d, 0x6f, 0x74, 0x45, 0x6d, 0x62, 0x72, 0x74, 0x4e, 0x6b, 0x2b, 0x62, 0x76, 0x67, 0x35, 0x48, 0x6d, \n\t0x2f, 0x45, 0x33, 0x6e, 0x70, 0x4d, 0x70, 0x76, 0x31, 0x48, 0x50, 0x72, 0x6a, 0x4c, 0x73, 0x73, 0x37, 0x42, \n\t0x6c, 0x68, 0x4c, 0x41, 0x75, 0x51, 0x2b, 0x64, 0x70, 0x37, 0x6c, 0x73, 0x66, 0x63, 0x55, 0x4e, 0x77, 0x5c, 0x0a,\n\t0x09, 0x47, 0x32, 0x55, 0x68, 0x46, 0x64, 0x2f, 0x43, 0x68, 0x76, 0x54, 0x4f, 0x4e, 0x7a, 0x59, 0x63, 0x2b, \n\t0x37, 0x39, 0x6b, 0x35, 0x53, 0x46, 0x5a, 0x2b, 0x63, 0x2b, 0x6d, 0x71, 0x54, 0x62, 0x6c, 0x48, 0x36, 0x70, \n\t0x7a, 0x49, 0x58, 0x4f, 0x2f, 0x49, 0x62, 0x32, 0x7a, 0x65, 0x51, 0x34, 0x68, 0x79, 0x33, 0x7a, 0x5a, 0x55, \n\t0x47, 0x2f, 0x61, 0x37, 0x36, 0x2b, 0x4e, 0x4e, 0x74, 0x2b, 0x50, 0x38, 0x2f, 0x6d, 0x7a, 0x6b, 0x77, 0x5c, 0x0a,\n\t0x09, 0x50, 0x75, 0x2f, 0x4e, 0x53, 0x51, 0x68, 0x78, 0x34, 0x64, 0x73, 0x6a, 0x50, 0x4b, 0x47, 0x41, 0x77, \n\t0x79, 0x72, 0x72, 0x77, 0x73, 0x34, 0x39, 0x71, 0x72, 0x34, 0x4c, 0x71, 0x72, 0x48, 0x4d, 0x37, 0x70, 0x4d, \n\t0x72, 0x4d, 0x71, 0x4c, 0x31, 0x66, 0x6c, 0x6d, 0x31, 0x46, 0x76, 0x76, 0x44, 0x39, 0x51, 0x39, 0x52, 0x37, \n\t0x57, 0x36, 0x66, 0x55, 0x48, 0x41, 0x36, 0x72, 0x4e, 0x2b, 0x62, 0x4f, 0x36, 0x48, 0x69, 0x72, 0x66, 0x5c, 0x0a,\n\t0x09, 0x63, 0x43, 0x79, 0x50, 0x2f, 0x52, 0x4e, 0x63, 0x2f, 0x73, 0x6e, 0x79, 0x65, 0x54, 0x6e, 0x2f, 0x59, \n\t0x2b, 0x4b, 0x79, 0x4f, 0x78, 0x47, 0x35, 0x47, 0x65, 0x64, 0x77, 0x56, 0x2f, 0x78, 0x70, 0x36, 0x32, 0x50, \n\t0x70, 0x79, 0x35, 0x64, 0x68, 0x72, 0x31, 0x53, 0x54, 0x79, 0x63, 0x73, 0x51, 0x6e, 0x6c, 0x48, 0x4f, 0x42, \n\t0x76, 0x63, 0x71, 0x6e, 0x63, 0x50, 0x2f, 0x35, 0x33, 0x39, 0x42, 0x2f, 0x4d, 0x4d, 0x55, 0x30, 0x54, 0x5c, 0x0a,\n\t0x09, 0x44, 0x79, 0x38, 0x55, 0x48, 0x45, 0x78, 0x53, 0x2b, 0x38, 0x44, 0x65, 0x76, 0x30, 0x67, 0x73, 0x2b, \n\t0x7a, 0x4a, 0x62, 0x37, 0x4b, 0x49, 0x39, 0x51, 0x6c, 0x6e, 0x61, 0x65, 0x49, 0x4d, 0x7a, 0x43, 0x71, 0x38, \n\t0x79, 0x69, 0x72, 0x48, 0x64, 0x70, 0x67, 0x32, 0x71, 0x54, 0x54, 0x69, 0x34, 0x5a, 0x52, 0x56, 0x76, 0x36, \n\t0x43, 0x56, 0x4f, 0x7a, 0x74, 0x61, 0x45, 0x4d, 0x56, 0x58, 0x31, 0x61, 0x30, 0x72, 0x6f, 0x73, 0x74, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x79, 0x4f, 0x47, 0x6b, 0x64, 0x66, 0x32, 0x51, 0x72, 0x36, 0x4e, 0x2b, 0x35, 0x59, 0x5a, 0x55, \n\t0x4e, 0x54, 0x58, 0x6c, 0x32, 0x33, 0x79, 0x34, 0x63, 0x5a, 0x7a, 0x43, 0x76, 0x6d, 0x6b, 0x37, 0x75, 0x4f, \n\t0x34, 0x4d, 0x75, 0x79, 0x7a, 0x73, 0x57, 0x57, 0x45, 0x73, 0x43, 0x36, 0x44, 0x2b, 0x68, 0x70, 0x37, 0x33, \n\t0x33, 0x71, 0x4c, 0x75, 0x67, 0x63, 0x41, 0x4c, 0x6c, 0x66, 0x35, 0x34, 0x65, 0x73, 0x59, 0x38, 0x69, 0x5c, 0x0a,\n\t0x09, 0x37, 0x72, 0x49, 0x49, 0x58, 0x44, 0x5a, 0x63, 0x48, 0x6b, 0x43, 0x4f, 0x31, 0x51, 0x47, 0x72, 0x52, \n\t0x7a, 0x70, 0x58, 0x62, 0x67, 0x68, 0x6c, 0x34, 0x62, 0x43, 0x4e, 0x41, 0x4a, 0x5a, 0x70, 0x66, 0x76, 0x7a, \n\t0x46, 0x57, 0x65, 0x49, 0x79, 0x69, 0x47, 0x58, 0x76, 0x6e, 0x4c, 0x71, 0x45, 0x62, 0x5a, 0x6e, 0x4e, 0x51, \n\t0x61, 0x70, 0x4d, 0x4e, 0x66, 0x6d, 0x34, 0x47, 0x44, 0x42, 0x78, 0x39, 0x32, 0x2f, 0x4f, 0x5a, 0x62, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x2f, 0x6a, 0x34, 0x70, 0x34, 0x64, 0x6b, 0x4c, 0x69, 0x50, 0x7a, 0x62, 0x42, 0x67, 0x4d, 0x34, \n\t0x43, 0x4e, 0x33, 0x67, 0x38, 0x73, 0x79, 0x4c, 0x72, 0x30, 0x6f, 0x34, 0x38, 0x76, 0x75, 0x45, 0x47, 0x36, \n\t0x36, 0x77, 0x57, 0x74, 0x69, 0x36, 0x67, 0x64, 0x4b, 0x4a, 0x46, 0x4f, 0x50, 0x62, 0x6b, 0x51, 0x4a, 0x6c, \n\t0x5a, 0x42, 0x6b, 0x55, 0x4e, 0x62, 0x4a, 0x44, 0x56, 0x57, 0x62, 0x42, 0x47, 0x51, 0x49, 0x62, 0x67, 0x5c, 0x0a,\n\t0x09, 0x51, 0x79, 0x55, 0x48, 0x55, 0x4b, 0x63, 0x65, 0x61, 0x52, 0x62, 0x48, 0x30, 0x78, 0x38, 0x75, 0x54, \n\t0x64, 0x4f, 0x42, 0x7a, 0x6c, 0x6a, 0x30, 0x51, 0x47, 0x55, 0x74, 0x79, 0x45, 0x79, 0x32, 0x35, 0x44, 0x35, \n\t0x44, 0x32, 0x54, 0x50, 0x71, 0x57, 0x55, 0x7a, 0x4d, 0x30, 0x30, 0x4f, 0x2f, 0x64, 0x4c, 0x4c, 0x77, 0x6b, \n\t0x4e, 0x4c, 0x55, 0x66, 0x4b, 0x4b, 0x6a, 0x69, 0x67, 0x33, 0x75, 0x4d, 0x39, 0x4d, 0x74, 0x4e, 0x73, 0x5c, 0x0a,\n\t0x09, 0x65, 0x54, 0x70, 0x39, 0x51, 0x79, 0x6d, 0x5a, 0x30, 0x6b, 0x7a, 0x72, 0x58, 0x63, 0x59, 0x45, 0x53, \n\t0x30, 0x46, 0x4d, 0x2f, 0x48, 0x72, 0x4c, 0x32, 0x57, 0x61, 0x78, 0x37, 0x52, 0x4a, 0x36, 0x6b, 0x76, 0x39, \n\t0x58, 0x39, 0x64, 0x58, 0x67, 0x61, 0x31, 0x46, 0x6d, 0x6c, 0x50, 0x62, 0x76, 0x4a, 0x42, 0x33, 0x59, 0x77, \n\t0x64, 0x78, 0x53, 0x4a, 0x70, 0x6d, 0x6f, 0x50, 0x4f, 0x79, 0x77, 0x76, 0x7a, 0x62, 0x2f, 0x45, 0x45, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x59, 0x36, 0x58, 0x4b, 0x56, 0x43, 0x57, 0x61, 0x47, 0x7a, 0x66, 0x2f, 0x6b, 0x51, 0x34, 0x36, \n\t0x66, 0x2f, 0x4c, 0x6b, 0x68, 0x64, 0x33, 0x34, 0x53, 0x69, 0x72, 0x77, 0x67, 0x4c, 0x33, 0x4c, 0x79, 0x49, \n\t0x6b, 0x65, 0x4b, 0x67, 0x74, 0x79, 0x48, 0x69, 0x7a, 0x7a, 0x6e, 0x34, 0x5a, 0x4d, 0x46, 0x76, 0x2f, 0x6f, \n\t0x47, 0x78, 0x2b, 0x76, 0x65, 0x43, 0x6c, 0x49, 0x30, 0x7a, 0x62, 0x69, 0x30, 0x6d, 0x61, 0x5a, 0x47, 0x5c, 0x0a,\n\t0x09, 0x77, 0x6a, 0x6f, 0x6e, 0x58, 0x75, 0x70, 0x2f, 0x32, 0x6e, 0x64, 0x55, 0x35, 0x75, 0x65, 0x32, 0x62, \n\t0x67, 0x63, 0x5a, 0x6c, 0x4e, 0x71, 0x4e, 0x4f, 0x47, 0x70, 0x66, 0x55, 0x66, 0x46, 0x4e, 0x45, 0x7a, 0x36, \n\t0x6b, 0x56, 0x70, 0x6d, 0x7a, 0x73, 0x39, 0x70, 0x64, 0x42, 0x58, 0x78, 0x74, 0x46, 0x59, 0x77, 0x36, 0x59, \n\t0x4a, 0x58, 0x47, 0x58, 0x72, 0x4f, 0x47, 0x55, 0x59, 0x63, 0x50, 0x61, 0x6e, 0x56, 0x33, 0x65, 0x53, 0x5c, 0x0a,\n\t0x09, 0x52, 0x78, 0x48, 0x36, 0x65, 0x45, 0x55, 0x55, 0x75, 0x39, 0x4a, 0x6f, 0x5a, 0x52, 0x42, 0x59, 0x49, \n\t0x41, 0x44, 0x7a, 0x45, 0x77, 0x4d, 0x72, 0x34, 0x65, 0x42, 0x61, 0x61, 0x47, 0x41, 0x31, 0x75, 0x44, 0x70, \n\t0x67, 0x69, 0x2b, 0x46, 0x77, 0x32, 0x30, 0x6b, 0x43, 0x5a, 0x30, 0x64, 0x4f, 0x75, 0x4c, 0x79, 0x70, 0x57, \n\t0x50, 0x52, 0x7a, 0x75, 0x69, 0x70, 0x51, 0x71, 0x2f, 0x37, 0x79, 0x37, 0x34, 0x75, 0x64, 0x38, 0x61, 0x5c, 0x0a,\n\t0x09, 0x73, 0x4c, 0x73, 0x72, 0x4a, 0x59, 0x44, 0x79, 0x6e, 0x43, 0x49, 0x76, 0x4b, 0x49, 0x6f, 0x61, 0x51, \n\t0x45, 0x56, 0x65, 0x55, 0x45, 0x68, 0x42, 0x6b, 0x65, 0x66, 0x6b, 0x65, 0x63, 0x46, 0x37, 0x37, 0x34, 0x54, \n\t0x58, 0x76, 0x73, 0x55, 0x5a, 0x65, 0x4a, 0x52, 0x41, 0x69, 0x52, 0x33, 0x59, 0x79, 0x6c, 0x65, 0x55, 0x58, \n\t0x47, 0x38, 0x57, 0x67, 0x4b, 0x50, 0x39, 0x53, 0x6a, 0x6f, 0x2f, 0x35, 0x65, 0x78, 0x32, 0x68, 0x32, 0x5c, 0x0a,\n\t0x09, 0x44, 0x7a, 0x7a, 0x31, 0x45, 0x35, 0x72, 0x47, 0x73, 0x59, 0x76, 0x51, 0x49, 0x52, 0x35, 0x48, 0x4f, \n\t0x33, 0x54, 0x76, 0x43, 0x51, 0x30, 0x6a, 0x49, 0x58, 0x45, 0x4a, 0x33, 0x37, 0x70, 0x5a, 0x65, 0x45, 0x77, \n\t0x32, 0x39, 0x44, 0x58, 0x47, 0x7a, 0x75, 0x4f, 0x66, 0x73, 0x79, 0x51, 0x6d, 0x58, 0x43, 0x31, 0x49, 0x6c, \n\t0x57, 0x41, 0x45, 0x59, 0x6d, 0x75, 0x45, 0x77, 0x59, 0x69, 0x51, 0x58, 0x46, 0x71, 0x73, 0x49, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x64, 0x52, 0x38, 0x37, 0x59, 0x4b, 0x54, 0x72, 0x72, 0x47, 0x48, 0x55, 0x74, 0x52, 0x53, 0x6b, 0x39, \n\t0x2f, 0x79, 0x73, 0x59, 0x4a, 0x59, 0x70, 0x4b, 0x46, 0x51, 0x61, 0x44, 0x46, 0x51, 0x4f, 0x37, 0x49, 0x36, \n\t0x35, 0x52, 0x75, 0x58, 0x47, 0x61, 0x6b, 0x57, 0x63, 0x56, 0x39, 0x42, 0x71, 0x43, 0x74, 0x31, 0x68, 0x32, \n\t0x32, 0x43, 0x6b, 0x74, 0x53, 0x43, 0x72, 0x4d, 0x63, 0x55, 0x77, 0x65, 0x76, 0x52, 0x78, 0x34, 0x62, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x38, 0x35, 0x70, 0x43, 0x38, 0x4b, 0x43, 0x6f, 0x41, 0x35, 0x55, 0x56, 0x4f, 0x55, 0x52, 0x51, \n\t0x6c, 0x66, 0x41, 0x4b, 0x41, 0x66, 0x44, 0x69, 0x41, 0x4b, 0x63, 0x38, 0x4c, 0x33, 0x6e, 0x65, 0x58, 0x38, \n\t0x49, 0x47, 0x37, 0x68, 0x45, 0x67, 0x72, 0x71, 0x6a, 0x53, 0x6a, 0x58, 0x4e, 0x55, 0x78, 0x4e, 0x56, 0x72, \n\t0x6d, 0x35, 0x78, 0x35, 0x46, 0x45, 0x79, 0x2b, 0x4e, 0x46, 0x70, 0x53, 0x4b, 0x32, 0x37, 0x6f, 0x44, 0x5c, 0x0a,\n\t0x09, 0x70, 0x45, 0x42, 0x77, 0x47, 0x6b, 0x5a, 0x50, 0x78, 0x62, 0x6e, 0x6e, 0x7a, 0x47, 0x50, 0x30, 0x62, \n\t0x44, 0x34, 0x61, 0x55, 0x56, 0x6d, 0x50, 0x41, 0x66, 0x43, 0x71, 0x4d, 0x6d, 0x7a, 0x41, 0x73, 0x43, 0x39, \n\t0x67, 0x31, 0x4f, 0x78, 0x55, 0x71, 0x37, 0x66, 0x4c, 0x59, 0x77, 0x69, 0x59, 0x50, 0x42, 0x74, 0x6c, 0x72, \n\t0x69, 0x69, 0x4d, 0x47, 0x6d, 0x61, 0x5a, 0x43, 0x73, 0x38, 0x4d, 0x49, 0x34, 0x6e, 0x2f, 0x69, 0x54, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x4f, 0x59, 0x4b, 0x53, 0x42, 0x45, 0x32, 0x74, 0x4a, 0x35, 0x57, 0x55, 0x6a, 0x6b, 0x38, 0x37, \n\t0x2f, 0x73, 0x33, 0x73, 0x53, 0x52, 0x54, 0x41, 0x79, 0x4f, 0x7a, 0x6f, 0x47, 0x45, 0x43, 0x52, 0x68, 0x6c, \n\t0x50, 0x4d, 0x62, 0x62, 0x78, 0x35, 0x77, 0x62, 0x6c, 0x75, 0x51, 0x6f, 0x67, 0x61, 0x4f, 0x46, 0x46, 0x4b, \n\t0x5a, 0x5a, 0x68, 0x70, 0x41, 0x65, 0x5a, 0x35, 0x58, 0x63, 0x55, 0x46, 0x4c, 0x65, 0x75, 0x4d, 0x37, 0x5c, 0x0a,\n\t0x09, 0x48, 0x61, 0x4f, 0x52, 0x30, 0x58, 0x41, 0x71, 0x7a, 0x63, 0x69, 0x63, 0x69, 0x79, 0x59, 0x31, 0x4b, \n\t0x76, 0x4f, 0x77, 0x6f, 0x52, 0x6b, 0x5a, 0x44, 0x55, 0x6e, 0x42, 0x79, 0x47, 0x30, 0x2b, 0x43, 0x39, 0x77, \n\t0x47, 0x46, 0x41, 0x30, 0x59, 0x76, 0x57, 0x4c, 0x63, 0x6b, 0x2b, 0x6b, 0x6a, 0x38, 0x7a, 0x50, 0x4e, 0x78, \n\t0x48, 0x30, 0x31, 0x63, 0x49, 0x30, 0x4b, 0x71, 0x7a, 0x68, 0x61, 0x59, 0x4d, 0x53, 0x2b, 0x68, 0x64, 0x5c, 0x0a,\n\t0x09, 0x46, 0x4d, 0x4b, 0x2f, 0x5a, 0x6e, 0x67, 0x70, 0x45, 0x74, 0x7a, 0x2b, 0x66, 0x5a, 0x4b, 0x48, 0x4d, \n\t0x36, 0x47, 0x45, 0x58, 0x35, 0x7a, 0x51, 0x4b, 0x6a, 0x68, 0x69, 0x77, 0x59, 0x52, 0x68, 0x56, 0x34, 0x51, \n\t0x71, 0x59, 0x70, 0x47, 0x48, 0x6e, 0x54, 0x4b, 0x77, 0x6d, 0x6a, 0x2b, 0x72, 0x69, 0x47, 0x45, 0x53, 0x71, \n\t0x64, 0x67, 0x6c, 0x46, 0x6a, 0x4b, 0x44, 0x37, 0x38, 0x33, 0x59, 0x32, 0x68, 0x55, 0x38, 0x45, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x38, 0x36, 0x66, 0x33, 0x52, 0x62, 0x65, 0x2f, 0x71, 0x63, 0x5a, 0x75, 0x64, 0x64, 0x77, 0x4c, \n\t0x49, 0x79, 0x43, 0x61, 0x52, 0x59, 0x41, 0x56, 0x45, 0x67, 0x52, 0x77, 0x36, 0x67, 0x6f, 0x65, 0x4f, 0x4a, \n\t0x55, 0x77, 0x56, 0x32, 0x66, 0x43, 0x67, 0x42, 0x74, 0x67, 0x6b, 0x58, 0x43, 0x73, 0x70, 0x42, 0x4f, 0x47, \n\t0x4f, 0x6c, 0x2f, 0x69, 0x65, 0x55, 0x68, 0x47, 0x6b, 0x5a, 0x73, 0x77, 0x4f, 0x59, 0x74, 0x2f, 0x70, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x45, 0x4d, 0x50, 0x70, 0x4c, 0x69, 0x43, 0x43, 0x66, 0x75, 0x61, 0x58, 0x6a, 0x34, 0x59, 0x79, \n\t0x58, 0x6d, 0x55, 0x46, 0x30, 0x37, 0x68, 0x64, 0x66, 0x69, 0x6e, 0x39, 0x68, 0x2f, 0x6c, 0x72, 0x36, 0x68, \n\t0x56, 0x63, 0x76, 0x59, 0x41, 0x4e, 0x47, 0x49, 0x57, 0x35, 0x32, 0x47, 0x44, 0x32, 0x35, 0x4c, 0x58, 0x7a, \n\t0x38, 0x63, 0x79, 0x50, 0x75, 0x2b, 0x73, 0x79, 0x49, 0x7a, 0x35, 0x37, 0x4d, 0x5a, 0x77, 0x42, 0x46, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x30, 0x36, 0x31, 0x72, 0x32, 0x46, 0x45, 0x75, 0x74, 0x4e, 0x50, 0x76, 0x55, 0x6a, 0x57, 0x74, \n\t0x6e, 0x48, 0x50, 0x64, 0x33, 0x6b, 0x30, 0x34, 0x45, 0x6e, 0x43, 0x43, 0x4f, 0x6f, 0x4a, 0x68, 0x77, 0x70, \n\t0x47, 0x4c, 0x58, 0x4f, 0x4e, 0x59, 0x73, 0x32, 0x6f, 0x31, 0x70, 0x72, 0x4b, 0x50, 0x4c, 0x52, 0x6a, 0x6d, \n\t0x50, 0x70, 0x38, 0x74, 0x49, 0x2b, 0x31, 0x30, 0x6f, 0x68, 0x55, 0x78, 0x2f, 0x37, 0x45, 0x66, 0x62, 0x5c, 0x0a,\n\t0x09, 0x43, 0x37, 0x4b, 0x78, 0x51, 0x65, 0x4b, 0x6e, 0x6c, 0x65, 0x52, 0x4b, 0x5a, 0x5a, 0x67, 0x4a, 0x45, \n\t0x47, 0x6b, 0x49, 0x56, 0x52, 0x58, 0x75, 0x54, 0x63, 0x66, 0x5a, 0x38, 0x78, 0x76, 0x2b, 0x7a, 0x73, 0x62, \n\t0x41, 0x4b, 0x4d, 0x74, 0x49, 0x61, 0x55, 0x32, 0x42, 0x41, 0x74, 0x35, 0x56, 0x66, 0x53, 0x63, 0x34, 0x73, \n\t0x43, 0x6a, 0x44, 0x61, 0x65, 0x72, 0x65, 0x35, 0x6a, 0x42, 0x61, 0x4f, 0x62, 0x77, 0x44, 0x31, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x56, 0x76, 0x4e, 0x73, 0x58, 0x73, 0x50, 0x33, 0x78, 0x77, 0x68, 0x4f, 0x36, 0x75, 0x53, 0x77, 0x4f, \n\t0x31, 0x51, 0x4e, 0x43, 0x4d, 0x50, 0x36, 0x2f, 0x6c, 0x51, 0x31, 0x37, 0x46, 0x34, 0x4e, 0x36, 0x30, 0x4d, \n\t0x4a, 0x6f, 0x2f, 0x46, 0x44, 0x2b, 0x39, 0x73, 0x6a, 0x34, 0x64, 0x66, 0x65, 0x63, 0x59, 0x62, 0x66, 0x65, \n\t0x66, 0x39, 0x5a, 0x50, 0x6e, 0x44, 0x50, 0x44, 0x6e, 0x6c, 0x52, 0x4a, 0x37, 0x6e, 0x67, 0x53, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x61, 0x58, 0x33, 0x72, 0x72, 0x46, 0x4e, 0x37, 0x2f, 0x30, 0x4b, 0x4d, 0x2b, 0x38, 0x61, 0x71, 0x6a, \n\t0x4b, 0x54, 0x2b, 0x51, 0x58, 0x7a, 0x45, 0x53, 0x58, 0x44, 0x6a, 0x65, 0x48, 0x39, 0x65, 0x73, 0x38, 0x36, \n\t0x6d, 0x71, 0x48, 0x64, 0x76, 0x51, 0x74, 0x59, 0x34, 0x4b, 0x68, 0x66, 0x58, 0x30, 0x50, 0x62, 0x58, 0x78, \n\t0x56, 0x58, 0x6b, 0x6f, 0x38, 0x48, 0x46, 0x4a, 0x44, 0x2b, 0x34, 0x30, 0x38, 0x71, 0x34, 0x71, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x6b, 0x30, 0x36, 0x74, 0x47, 0x2f, 0x61, 0x32, 0x42, 0x6a, 0x57, 0x54, 0x39, 0x55, 0x37, 0x4d, \n\t0x62, 0x51, 0x76, 0x68, 0x62, 0x6f, 0x58, 0x64, 0x62, 0x31, 0x4b, 0x53, 0x51, 0x33, 0x74, 0x71, 0x37, 0x72, \n\t0x59, 0x79, 0x33, 0x53, 0x30, 0x76, 0x67, 0x65, 0x53, 0x6f, 0x2b, 0x63, 0x54, 0x6c, 0x58, 0x6e, 0x57, 0x78, \n\t0x30, 0x4a, 0x57, 0x50, 0x6e, 0x4f, 0x42, 0x63, 0x6c, 0x35, 0x4e, 0x79, 0x4b, 0x65, 0x6f, 0x38, 0x36, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x47, 0x78, 0x66, 0x50, 0x79, 0x4f, 0x6c, 0x66, 0x34, 0x4e, 0x76, 0x74, 0x68, 0x63, 0x54, 0x65, \n\t0x6f, 0x36, 0x78, 0x72, 0x75, 0x69, 0x38, 0x43, 0x6e, 0x50, 0x6a, 0x4d, 0x6b, 0x7a, 0x33, 0x4d, 0x47, 0x67, \n\t0x77, 0x46, 0x46, 0x6b, 0x53, 0x4e, 0x53, 0x37, 0x70, 0x30, 0x30, 0x59, 0x45, 0x42, 0x4f, 0x58, 0x68, 0x30, \n\t0x58, 0x46, 0x4f, 0x58, 0x74, 0x79, 0x53, 0x6e, 0x44, 0x57, 0x51, 0x45, 0x35, 0x5a, 0x42, 0x37, 0x79, 0x5c, 0x0a,\n\t0x09, 0x44, 0x7a, 0x37, 0x69, 0x66, 0x44, 0x73, 0x6b, 0x75, 0x67, 0x56, 0x52, 0x77, 0x78, 0x32, 0x49, 0x44, \n\t0x48, 0x47, 0x56, 0x4a, 0x71, 0x69, 0x48, 0x36, 0x77, 0x66, 0x31, 0x74, 0x52, 0x41, 0x66, 0x56, 0x39, 0x63, \n\t0x50, 0x43, 0x56, 0x4d, 0x43, 0x33, 0x4f, 0x5a, 0x4e, 0x69, 0x41, 0x7a, 0x41, 0x35, 0x59, 0x53, 0x64, 0x44, \n\t0x38, 0x52, 0x6c, 0x4f, 0x43, 0x6d, 0x2b, 0x52, 0x6e, 0x41, 0x66, 0x5a, 0x51, 0x61, 0x5a, 0x6c, 0x32, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x32, 0x43, 0x75, 0x42, 0x51, 0x46, 0x65, 0x70, 0x61, 0x2f, 0x32, 0x51, 0x31, 0x49, 0x31, 0x42, \n\t0x78, 0x63, 0x57, 0x66, 0x76, 0x30, 0x6f, 0x7a, 0x65, 0x2f, 0x36, 0x6c, 0x64, 0x58, 0x76, 0x34, 0x54, 0x44, \n\t0x2f, 0x48, 0x6a, 0x76, 0x2f, 0x34, 0x34, 0x37, 0x2f, 0x31, 0x6b, 0x44, 0x43, 0x47, 0x41, 0x78, 0x38, 0x38, \n\t0x55, 0x2f, 0x4d, 0x61, 0x37, 0x7a, 0x76, 0x4c, 0x31, 0x2f, 0x2f, 0x4a, 0x68, 0x66, 0x76, 0x49, 0x31, 0x5c, 0x0a,\n\t0x09, 0x70, 0x39, 0x67, 0x4e, 0x55, 0x30, 0x71, 0x6d, 0x31, 0x49, 0x7a, 0x57, 0x75, 0x7a, 0x79, 0x61, 0x2f, \n\t0x47, 0x62, 0x53, 0x6a, 0x45, 0x4a, 0x63, 0x57, 0x78, 0x6e, 0x54, 0x61, 0x45, 0x59, 0x53, 0x2f, 0x37, 0x58, \n\t0x61, 0x6b, 0x64, 0x57, 0x4d, 0x72, 0x47, 0x6b, 0x57, 0x61, 0x54, 0x31, 0x6c, 0x6e, 0x46, 0x53, 0x61, 0x54, \n\t0x70, 0x74, 0x6d, 0x31, 0x47, 0x61, 0x6d, 0x61, 0x52, 0x4e, 0x48, 0x61, 0x31, 0x78, 0x6c, 0x65, 0x47, 0x5c, 0x0a,\n\t0x09, 0x66, 0x48, 0x6d, 0x31, 0x39, 0x35, 0x54, 0x6c, 0x45, 0x49, 0x34, 0x73, 0x32, 0x79, 0x58, 0x49, 0x32, \n\t0x53, 0x56, 0x63, 0x63, 0x6d, 0x72, 0x50, 0x31, 0x48, 0x54, 0x7a, 0x35, 0x70, 0x4e, 0x53, 0x35, 0x6a, 0x63, \n\t0x69, 0x6b, 0x48, 0x64, 0x44, 0x32, 0x69, 0x46, 0x76, 0x75, 0x54, 0x57, 0x6b, 0x30, 0x32, 0x2b, 0x78, 0x6b, \n\t0x6b, 0x79, 0x63, 0x46, 0x74, 0x77, 0x65, 0x62, 0x54, 0x34, 0x31, 0x74, 0x64, 0x61, 0x6b, 0x5a, 0x66, 0x5c, 0x0a,\n\t0x09, 0x69, 0x51, 0x6a, 0x46, 0x2f, 0x54, 0x65, 0x33, 0x50, 0x2b, 0x73, 0x78, 0x4d, 0x68, 0x4f, 0x49, 0x7a, \n\t0x76, 0x33, 0x43, 0x53, 0x30, 0x4f, 0x6c, 0x76, 0x71, 0x6b, 0x52, 0x6d, 0x58, 0x52, 0x59, 0x4a, 0x6d, 0x44, \n\t0x55, 0x65, 0x4d, 0x48, 0x6a, 0x6e, 0x37, 0x51, 0x55, 0x6a, 0x4e, 0x37, 0x38, 0x34, 0x58, 0x50, 0x38, 0x6a, \n\t0x66, 0x2f, 0x77, 0x4d, 0x50, 0x63, 0x2f, 0x6d, 0x6a, 0x4e, 0x4f, 0x52, 0x4f, 0x43, 0x2f, 0x76, 0x75, 0x5c, 0x0a,\n\t0x09, 0x56, 0x4a, 0x58, 0x76, 0x55, 0x7a, 0x4a, 0x39, 0x6c, 0x52, 0x5a, 0x6e, 0x39, 0x55, 0x70, 0x73, 0x35, \n\t0x2f, 0x49, 0x68, 0x68, 0x70, 0x6b, 0x38, 0x6d, 0x32, 0x6f, 0x32, 0x38, 0x5a, 0x65, 0x77, 0x43, 0x6a, 0x4c, \n\t0x74, 0x39, 0x61, 0x45, 0x6b, 0x59, 0x2b, 0x61, 0x6d, 0x45, 0x77, 0x30, 0x75, 0x57, 0x33, 0x6c, 0x64, 0x45, \n\t0x44, 0x52, 0x67, 0x32, 0x5a, 0x42, 0x45, 0x62, 0x68, 0x37, 0x7a, 0x67, 0x59, 0x68, 0x58, 0x53, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x6c, 0x31, 0x6a, 0x72, 0x70, 0x46, 0x32, 0x53, 0x71, 0x74, 0x38, 0x37, 0x59, 0x4a, 0x59, 0x44, \n\t0x36, 0x4f, 0x4e, 0x59, 0x65, 0x48, 0x68, 0x34, 0x36, 0x47, 0x69, 0x59, 0x46, 0x53, 0x4e, 0x6d, 0x69, 0x57, \n\t0x63, 0x31, 0x74, 0x61, 0x68, 0x66, 0x66, 0x71, 0x4d, 0x31, 0x46, 0x4d, 0x45, 0x78, 0x6f, 0x49, 0x6c, 0x39, \n\t0x2f, 0x4f, 0x41, 0x55, 0x6a, 0x43, 0x79, 0x34, 0x4c, 0x4c, 0x44, 0x2b, 0x73, 0x71, 0x38, 0x32, 0x37, 0x5c, 0x0a,\n\t0x09, 0x69, 0x6c, 0x76, 0x6a, 0x2f, 0x68, 0x56, 0x6b, 0x76, 0x78, 0x59, 0x74, 0x78, 0x73, 0x33, 0x7a, 0x36, \n\t0x62, 0x68, 0x30, 0x62, 0x30, 0x46, 0x4f, 0x42, 0x6c, 0x79, 0x5a, 0x6a, 0x47, 0x53, 0x4d, 0x2f, 0x73, 0x4d, \n\t0x50, 0x72, 0x45, 0x41, 0x37, 0x74, 0x38, 0x2f, 0x38, 0x38, 0x2f, 0x79, 0x6d, 0x34, 0x2b, 0x57, 0x61, 0x50, \n\t0x66, 0x2b, 0x66, 0x45, 0x64, 0x58, 0x76, 0x33, 0x4c, 0x54, 0x7a, 0x41, 0x35, 0x4b, 0x50, 0x59, 0x49, 0x5c, 0x0a,\n\t0x09, 0x52, 0x6c, 0x72, 0x6d, 0x44, 0x69, 0x4d, 0x33, 0x49, 0x59, 0x7a, 0x71, 0x36, 0x32, 0x65, 0x43, 0x55, \n\t0x56, 0x52, 0x65, 0x48, 0x78, 0x6a, 0x5a, 0x38, 0x42, 0x67, 0x59, 0x4a, 0x56, 0x38, 0x42, 0x44, 0x52, 0x38, \n\t0x53, 0x4d, 0x43, 0x70, 0x4d, 0x6e, 0x41, 0x46, 0x4c, 0x59, 0x71, 0x35, 0x52, 0x44, 0x43, 0x50, 0x71, 0x4e, \n\t0x4e, 0x45, 0x51, 0x66, 0x55, 0x49, 0x7a, 0x71, 0x71, 0x36, 0x4a, 0x59, 0x58, 0x54, 0x73, 0x38, 0x47, 0x5c, 0x0a,\n\t0x09, 0x37, 0x70, 0x70, 0x4a, 0x62, 0x53, 0x54, 0x31, 0x51, 0x35, 0x72, 0x54, 0x57, 0x4d, 0x69, 0x6e, 0x4a, \n\t0x45, 0x7a, 0x59, 0x36, 0x61, 0x36, 0x62, 0x6c, 0x47, 0x70, 0x38, 0x37, 0x34, 0x7a, 0x66, 0x59, 0x6a, 0x6e, \n\t0x35, 0x52, 0x32, 0x6a, 0x49, 0x2f, 0x54, 0x6a, 0x48, 0x4a, 0x69, 0x58, 0x35, 0x66, 0x31, 0x44, 0x39, 0x6d, \n\t0x2f, 0x49, 0x39, 0x7a, 0x47, 0x6a, 0x65, 0x72, 0x32, 0x56, 0x6a, 0x41, 0x36, 0x68, 0x42, 0x51, 0x76, 0x5c, 0x0a,\n\t0x09, 0x62, 0x6e, 0x6b, 0x67, 0x76, 0x57, 0x51, 0x6d, 0x45, 0x50, 0x6c, 0x69, 0x58, 0x34, 0x6c, 0x30, 0x2b, \n\t0x4a, 0x72, 0x6d, 0x44, 0x4b, 0x4d, 0x66, 0x2b, 0x5a, 0x58, 0x48, 0x4f, 0x4c, 0x63, 0x37, 0x58, 0x59, 0x4e, \n\t0x66, 0x38, 0x36, 0x36, 0x7a, 0x76, 0x50, 0x31, 0x6a, 0x4f, 0x30, 0x77, 0x46, 0x49, 0x79, 0x58, 0x72, 0x58, \n\t0x52, 0x35, 0x4e, 0x6e, 0x64, 0x70, 0x67, 0x4e, 0x4f, 0x33, 0x73, 0x36, 0x36, 0x69, 0x4d, 0x4c, 0x68, 0x5c, 0x0a,\n\t0x09, 0x69, 0x4e, 0x63, 0x56, 0x34, 0x6e, 0x59, 0x59, 0x54, 0x71, 0x71, 0x4d, 0x46, 0x4d, 0x79, 0x30, 0x32, \n\t0x61, 0x65, 0x42, 0x53, 0x74, 0x41, 0x61, 0x4d, 0x4b, 0x4e, 0x4c, 0x54, 0x41, 0x53, 0x44, 0x6d, 0x77, 0x45, \n\t0x59, 0x69, 0x2b, 0x7a, 0x4a, 0x46, 0x7a, 0x34, 0x64, 0x47, 0x69, 0x64, 0x6c, 0x4a, 0x48, 0x70, 0x70, 0x6b, \n\t0x47, 0x55, 0x51, 0x32, 0x6a, 0x4e, 0x74, 0x4f, 0x73, 0x79, 0x49, 0x74, 0x53, 0x4b, 0x39, 0x4b, 0x61, 0x5c, 0x0a,\n\t0x09, 0x57, 0x57, 0x50, 0x45, 0x71, 0x77, 0x6b, 0x57, 0x73, 0x57, 0x5a, 0x6a, 0x4e, 0x4f, 0x74, 0x61, 0x4f, \n\t0x61, 0x6b, 0x62, 0x31, 0x78, 0x61, 0x51, 0x58, 0x56, 0x7a, 0x2b, 0x6b, 0x38, 0x4c, 0x43, 0x61, 0x4b, 0x61, \n\t0x4e, 0x39, 0x61, 0x63, 0x47, 0x30, 0x64, 0x6c, 0x66, 0x2b, 0x42, 0x4a, 0x66, 0x76, 0x6e, 0x73, 0x46, 0x71, \n\t0x6a, 0x36, 0x6c, 0x64, 0x4c, 0x33, 0x77, 0x49, 0x58, 0x35, 0x79, 0x47, 0x4c, 0x33, 0x6a, 0x34, 0x39, 0x5c, 0x0a,\n\t0x09, 0x75, 0x38, 0x2f, 0x35, 0x36, 0x64, 0x61, 0x61, 0x73, 0x4d, 0x77, 0x4d, 0x2b, 0x2b, 0x34, 0x62, 0x51, \n\t0x70, 0x6f, 0x36, 0x58, 0x4f, 0x44, 0x56, 0x42, 0x4d, 0x43, 0x71, 0x50, 0x55, 0x4c, 0x33, 0x64, 0x58, 0x47, \n\t0x59, 0x6c, 0x4f, 0x74, 0x52, 0x63, 0x77, 0x61, 0x70, 0x51, 0x33, 0x44, 0x6b, 0x62, 0x68, 0x52, 0x4b, 0x4a, \n\t0x4f, 0x71, 0x66, 0x42, 0x4b, 0x77, 0x4d, 0x69, 0x59, 0x5a, 0x51, 0x33, 0x7a, 0x44, 0x4a, 0x6f, 0x77, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x6d, 0x61, 0x62, 0x71, 0x4d, 0x33, 0x34, 0x6f, 0x2b, 0x31, 0x44, 0x56, 0x4c, 0x71, 0x71, 0x55, \n\t0x33, 0x73, 0x54, 0x71, 0x46, 0x42, 0x70, 0x69, 0x74, 0x72, 0x4d, 0x4f, 0x58, 0x34, 0x30, 0x62, 0x32, 0x6f, \n\t0x2f, 0x59, 0x69, 0x47, 0x55, 0x31, 0x7a, 0x36, 0x6b, 0x6a, 0x72, 0x6c, 0x47, 0x70, 0x35, 0x34, 0x4d, 0x57, \n\t0x70, 0x65, 0x76, 0x6b, 0x39, 0x56, 0x73, 0x4b, 0x6b, 0x44, 0x46, 0x6d, 0x6f, 0x39, 0x59, 0x4d, 0x36, 0x5c, 0x0a,\n\t0x09, 0x77, 0x78, 0x53, 0x71, 0x59, 0x42, 0x70, 0x61, 0x46, 0x55, 0x51, 0x4b, 0x55, 0x56, 0x52, 0x54, 0x44, \n\t0x36, 0x43, 0x68, 0x43, 0x4b, 0x2b, 0x35, 0x37, 0x56, 0x39, 0x6a, 0x41, 0x36, 0x5a, 0x58, 0x71, 0x4e, 0x71, \n\t0x4f, 0x78, 0x73, 0x78, 0x34, 0x45, 0x58, 0x53, 0x36, 0x4d, 0x44, 0x70, 0x4e, 0x4c, 0x50, 0x44, 0x71, 0x50, \n\t0x66, 0x2f, 0x63, 0x43, 0x5a, 0x71, 0x61, 0x73, 0x62, 0x35, 0x45, 0x38, 0x2b, 0x73, 0x63, 0x4d, 0x54, 0x5c, 0x0a,\n\t0x09, 0x54, 0x78, 0x72, 0x50, 0x39, 0x76, 0x6b, 0x4d, 0x6f, 0x36, 0x36, 0x42, 0x42, 0x58, 0x4e, 0x39, 0x4e, \n\t0x4f, 0x45, 0x78, 0x4b, 0x73, 0x4d, 0x43, 0x62, 0x68, 0x45, 0x77, 0x73, 0x76, 0x6c, 0x4d, 0x41, 0x69, 0x50, \n\t0x2f, 0x64, 0x39, 0x78, 0x63, 0x6f, 0x38, 0x6f, 0x33, 0x30, 0x67, 0x59, 0x6a, 0x35, 0x63, 0x43, 0x32, 0x34, \n\t0x4e, 0x4a, 0x7a, 0x6a, 0x58, 0x52, 0x6e, 0x6a, 0x6e, 0x61, 0x46, 0x4c, 0x50, 0x4d, 0x2f, 0x66, 0x69, 0x5c, 0x0a,\n\t0x09, 0x52, 0x76, 0x77, 0x43, 0x64, 0x70, 0x6d, 0x6e, 0x6c, 0x4e, 0x71, 0x47, 0x75, 0x75, 0x30, 0x52, 0x4f, \n\t0x6e, 0x67, 0x35, 0x6d, 0x59, 0x6b, 0x34, 0x61, 0x52, 0x33, 0x75, 0x52, 0x4e, 0x6d, 0x34, 0x39, 0x68, 0x72, \n\t0x70, 0x47, 0x42, 0x6b, 0x5a, 0x35, 0x54, 0x31, 0x4d, 0x67, 0x6e, 0x2b, 0x49, 0x6c, 0x75, 0x72, 0x43, 0x46, \n\t0x55, 0x77, 0x2b, 0x67, 0x57, 0x63, 0x4a, 0x64, 0x30, 0x51, 0x36, 0x42, 0x64, 0x5a, 0x76, 0x4d, 0x52, 0x5c, 0x0a,\n\t0x09, 0x43, 0x56, 0x38, 0x4f, 0x62, 0x4a, 0x61, 0x48, 0x69, 0x34, 0x66, 0x52, 0x42, 0x2b, 0x36, 0x64, 0x54, \n\t0x52, 0x75, 0x43, 0x38, 0x72, 0x31, 0x34, 0x37, 0x36, 0x64, 0x32, 0x56, 0x66, 0x6d, 0x36, 0x50, 0x75, 0x5a, \n\t0x63, 0x43, 0x4d, 0x38, 0x64, 0x52, 0x6c, 0x62, 0x47, 0x77, 0x43, 0x69, 0x56, 0x50, 0x71, 0x72, 0x50, 0x2b, \n\t0x51, 0x41, 0x6a, 0x75, 0x30, 0x6a, 0x57, 0x6c, 0x6a, 0x45, 0x70, 0x6a, 0x49, 0x78, 0x6d, 0x56, 0x50, 0x5c, 0x0a,\n\t0x09, 0x32, 0x79, 0x68, 0x34, 0x34, 0x61, 0x77, 0x43, 0x49, 0x71, 0x58, 0x42, 0x36, 0x6e, 0x64, 0x33, 0x6b, \n\t0x4d, 0x2b, 0x52, 0x51, 0x71, 0x4c, 0x73, 0x42, 0x49, 0x77, 0x79, 0x7a, 0x6e, 0x6f, 0x75, 0x4f, 0x31, 0x6b, \n\t0x37, 0x72, 0x77, 0x73, 0x36, 0x56, 0x46, 0x78, 0x4a, 0x74, 0x6d, 0x65, 0x51, 0x53, 0x6a, 0x63, 0x58, 0x4f, \n\t0x4e, 0x54, 0x70, 0x39, 0x52, 0x39, 0x57, 0x6a, 0x41, 0x53, 0x47, 0x38, 0x4e, 0x6d, 0x7a, 0x49, 0x66, 0x5c, 0x0a,\n\t0x09, 0x76, 0x58, 0x59, 0x55, 0x72, 0x53, 0x30, 0x4c, 0x63, 0x65, 0x45, 0x54, 0x52, 0x69, 0x47, 0x66, 0x57, \n\t0x6f, 0x4e, 0x79, 0x47, 0x39, 0x64, 0x54, 0x54, 0x58, 0x6d, 0x49, 0x59, 0x66, 0x54, 0x43, 0x61, 0x63, 0x32, \n\t0x7a, 0x71, 0x55, 0x42, 0x30, 0x39, 0x6e, 0x39, 0x38, 0x53, 0x54, 0x68, 0x38, 0x75, 0x53, 0x35, 0x59, 0x41, \n\t0x6c, 0x6a, 0x36, 0x56, 0x6d, 0x5a, 0x43, 0x47, 0x50, 0x33, 0x5a, 0x45, 0x2b, 0x4e, 0x48, 0x79, 0x66, 0x5c, 0x0a,\n\t0x09, 0x72, 0x49, 0x51, 0x79, 0x47, 0x66, 0x70, 0x63, 0x45, 0x6f, 0x5a, 0x52, 0x35, 0x31, 0x64, 0x4b, 0x71, \n\t0x6b, 0x4f, 0x62, 0x55, 0x58, 0x4d, 0x4e, 0x4c, 0x53, 0x42, 0x30, 0x62, 0x32, 0x75, 0x72, 0x32, 0x41, 0x55, \n\t0x52, 0x59, 0x66, 0x39, 0x34, 0x56, 0x52, 0x61, 0x6b, 0x52, 0x4e, 0x77, 0x36, 0x69, 0x43, 0x6c, 0x67, 0x46, \n\t0x53, 0x74, 0x45, 0x67, 0x32, 0x6a, 0x43, 0x79, 0x31, 0x77, 0x55, 0x67, 0x76, 0x6c, 0x4b, 0x33, 0x42, 0x5c, 0x0a,\n\t0x09, 0x64, 0x47, 0x68, 0x6a, 0x78, 0x43, 0x43, 0x72, 0x68, 0x2b, 0x2f, 0x44, 0x6f, 0x6c, 0x59, 0x4e, 0x6e, \n\t0x31, 0x49, 0x54, 0x4b, 0x69, 0x66, 0x6d, 0x52, 0x6d, 0x48, 0x6c, 0x74, 0x4a, 0x5a, 0x43, 0x53, 0x74, 0x4d, \n\t0x4d, 0x41, 0x79, 0x44, 0x74, 0x73, 0x46, 0x61, 0x54, 0x47, 0x32, 0x4d, 0x59, 0x31, 0x57, 0x41, 0x73, 0x59, \n\t0x65, 0x54, 0x54, 0x56, 0x4a, 0x76, 0x74, 0x46, 0x31, 0x51, 0x66, 0x72, 0x59, 0x79, 0x57, 0x67, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x41, 0x62, 0x63, 0x4c, 0x67, 0x63, 0x6e, 0x38, 0x2f, 0x49, 0x78, 0x69, 0x39, 0x71, 0x48, 0x2f, \n\t0x6e, 0x6a, 0x32, 0x55, 0x57, 0x6a, 0x53, 0x67, 0x44, 0x2f, 0x6a, 0x78, 0x41, 0x45, 0x30, 0x59, 0x64, 0x30, \n\t0x6e, 0x67, 0x5a, 0x6f, 0x53, 0x2b, 0x4d, 0x64, 0x6b, 0x66, 0x4d, 0x52, 0x62, 0x4b, 0x32, 0x47, 0x64, 0x35, \n\t0x52, 0x6d, 0x56, 0x62, 0x32, 0x41, 0x45, 0x61, 0x32, 0x67, 0x79, 0x30, 0x64, 0x52, 0x6a, 0x62, 0x39, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x42, 0x69, 0x46, 0x38, 0x68, 0x59, 0x45, 0x49, 0x31, 0x32, 0x48, 0x57, 0x54, 0x55, 0x6a, 0x6d, \n\t0x41, 0x42, 0x47, 0x4b, 0x54, 0x69, 0x31, 0x62, 0x54, 0x6e, 0x62, 0x41, 0x71, 0x4e, 0x6f, 0x6a, 0x6c, 0x48, \n\t0x42, 0x38, 0x63, 0x4d, 0x6c, 0x77, 0x43, 0x72, 0x34, 0x69, 0x44, 0x65, 0x2f, 0x6a, 0x4d, 0x39, 0x6f, 0x33, \n\t0x46, 0x79, 0x6a, 0x63, 0x39, 0x73, 0x46, 0x39, 0x59, 0x63, 0x69, 0x41, 0x30, 0x43, 0x30, 0x43, 0x61, 0x5c, 0x0a,\n\t0x09, 0x59, 0x57, 0x36, 0x6a, 0x5a, 0x67, 0x70, 0x45, 0x62, 0x57, 0x67, 0x6d, 0x5a, 0x6b, 0x68, 0x2f, 0x2b, \n\t0x74, 0x56, 0x68, 0x58, 0x4d, 0x74, 0x49, 0x33, 0x72, 0x31, 0x66, 0x32, 0x71, 0x59, 0x50, 0x52, 0x43, 0x52, \n\t0x43, 0x6a, 0x75, 0x65, 0x55, 0x62, 0x62, 0x41, 0x32, 0x69, 0x56, 0x57, 0x55, 0x42, 0x30, 0x4f, 0x33, 0x42, \n\t0x35, 0x46, 0x51, 0x6f, 0x76, 0x6f, 0x76, 0x4d, 0x77, 0x36, 0x6d, 0x75, 0x69, 0x36, 0x57, 0x76, 0x48, 0x5c, 0x0a,\n\t0x09, 0x77, 0x4f, 0x6a, 0x30, 0x74, 0x76, 0x48, 0x74, 0x54, 0x43, 0x6e, 0x44, 0x67, 0x54, 0x45, 0x39, 0x70, \n\t0x74, 0x4a, 0x61, 0x6d, 0x41, 0x31, 0x47, 0x71, 0x66, 0x79, 0x71, 0x73, 0x6f, 0x50, 0x30, 0x67, 0x5a, 0x47, \n\t0x4e, 0x50, 0x38, 0x41, 0x77, 0x73, 0x6d, 0x32, 0x49, 0x32, 0x72, 0x67, 0x49, 0x47, 0x4f, 0x58, 0x31, 0x75, \n\t0x53, 0x34, 0x59, 0x56, 0x64, 0x71, 0x43, 0x30, 0x71, 0x42, 0x45, 0x70, 0x78, 0x76, 0x46, 0x59, 0x53, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x34, 0x35, 0x49, 0x4a, 0x36, 0x33, 0x79, 0x45, 0x4c, 0x6f, 0x78, 0x67, 0x2b, 0x33, 0x58, 0x4f, \n\t0x4e, 0x6a, 0x68, 0x2f, 0x78, 0x6f, 0x43, 0x69, 0x30, 0x43, 0x53, 0x55, 0x6b, 0x48, 0x64, 0x69, 0x69, 0x77, \n\t0x61, 0x67, 0x31, 0x6f, 0x78, 0x34, 0x77, 0x69, 0x76, 0x37, 0x6d, 0x4d, 0x4c, 0x79, 0x6d, 0x76, 0x6e, 0x38, \n\t0x31, 0x6a, 0x47, 0x34, 0x48, 0x6a, 0x6b, 0x79, 0x6a, 0x46, 0x4d, 0x30, 0x43, 0x6f, 0x71, 0x39, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x41, 0x6b, 0x56, 0x6d, 0x42, 0x70, 0x47, 0x4a, 0x6d, 0x78, 0x67, 0x4e, 0x4f, 0x4e, 0x79, 0x6c, \n\t0x6b, 0x71, 0x4f, 0x48, 0x7a, 0x4b, 0x64, 0x74, 0x43, 0x70, 0x6a, 0x55, 0x71, 0x32, 0x6c, 0x47, 0x56, 0x37, \n\t0x36, 0x58, 0x6b, 0x62, 0x4c, 0x68, 0x6c, 0x46, 0x55, 0x58, 0x67, 0x63, 0x34, 0x6c, 0x77, 0x36, 0x6a, 0x38, \n\t0x49, 0x38, 0x45, 0x6a, 0x41, 0x70, 0x31, 0x62, 0x51, 0x70, 0x47, 0x53, 0x73, 0x4f, 0x70, 0x46, 0x73, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x61, 0x42, 0x37, 0x5a, 0x50, 0x55, 0x36, 0x51, 0x31, 0x6f, 0x2b, 0x75, 0x76, 0x48, 0x43, 0x55, \n\t0x31, 0x6f, 0x63, 0x4b, 0x6e, 0x71, 0x65, 0x63, 0x57, 0x64, 0x63, 0x38, 0x31, 0x75, 0x75, 0x37, 0x79, 0x45, \n\t0x5a, 0x55, 0x4a, 0x46, 0x51, 0x32, 0x33, 0x71, 0x32, 0x4d, 0x39, 0x34, 0x71, 0x55, 0x6e, 0x4b, 0x67, 0x5a, \n\t0x67, 0x36, 0x5a, 0x6e, 0x5a, 0x33, 0x6f, 0x6c, 0x64, 0x77, 0x32, 0x68, 0x6b, 0x38, 0x76, 0x53, 0x62, 0x5c, 0x0a,\n\t0x09, 0x70, 0x57, 0x31, 0x63, 0x52, 0x7a, 0x32, 0x46, 0x6f, 0x59, 0x4c, 0x52, 0x41, 0x4f, 0x47, 0x35, 0x33, \n\t0x52, 0x30, 0x2f, 0x4c, 0x52, 0x4f, 0x44, 0x53, 0x50, 0x6d, 0x48, 0x58, 0x74, 0x71, 0x49, 0x64, 0x4d, 0x77, \n\t0x49, 0x6f, 0x34, 0x53, 0x6d, 0x34, 0x6d, 0x46, 0x30, 0x62, 0x6d, 0x64, 0x4f, 0x46, 0x47, 0x72, 0x49, 0x4f, \n\t0x50, 0x69, 0x4d, 0x30, 0x31, 0x70, 0x59, 0x55, 0x52, 0x6a, 0x5a, 0x75, 0x72, 0x54, 0x37, 0x66, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x79, 0x4a, 0x34, 0x47, 0x52, 0x62, 0x64, 0x4f, 0x6b, 0x45, 0x78, 0x34, 0x6e, 0x4b, 0x32, 0x50, \n\t0x2b, 0x4d, 0x41, 0x6f, 0x5a, 0x4b, 0x55, 0x30, 0x6f, 0x67, 0x6c, 0x4d, 0x59, 0x38, 0x55, 0x70, 0x70, 0x52, \n\t0x74, 0x72, 0x4d, 0x4b, 0x6f, 0x38, 0x62, 0x4d, 0x4b, 0x70, 0x4d, 0x4d, 0x35, 0x49, 0x77, 0x75, 0x75, 0x50, \n\t0x6d, 0x63, 0x78, 0x34, 0x79, 0x54, 0x52, 0x6a, 0x6c, 0x52, 0x51, 0x32, 0x63, 0x72, 0x72, 0x6c, 0x47, 0x5c, 0x0a,\n\t0x09, 0x78, 0x34, 0x37, 0x6b, 0x58, 0x48, 0x31, 0x35, 0x30, 0x4c, 0x62, 0x73, 0x73, 0x4c, 0x75, 0x76, 0x58, \n\t0x35, 0x46, 0x54, 0x37, 0x52, 0x5a, 0x70, 0x5a, 0x31, 0x38, 0x6e, 0x74, 0x77, 0x45, 0x70, 0x6a, 0x30, 0x56, \n\t0x72, 0x50, 0x34, 0x32, 0x39, 0x69, 0x6e, 0x4a, 0x77, 0x68, 0x38, 0x76, 0x35, 0x52, 0x45, 0x30, 0x59, 0x33, \n\t0x54, 0x61, 0x4e, 0x78, 0x6a, 0x43, 0x74, 0x52, 0x6a, 0x51, 0x45, 0x6e, 0x74, 0x38, 0x61, 0x4f, 0x32, 0x5c, 0x0a,\n\t0x09, 0x38, 0x59, 0x41, 0x62, 0x75, 0x6a, 0x2b, 0x59, 0x46, 0x6f, 0x61, 0x7a, 0x6a, 0x75, 0x68, 0x5a, 0x38, \n\t0x55, 0x46, 0x4b, 0x77, 0x67, 0x6a, 0x4c, 0x54, 0x57, 0x6f, 0x6a, 0x71, 0x71, 0x7a, 0x62, 0x4e, 0x52, 0x5a, \n\t0x6c, 0x38, 0x59, 0x78, 0x63, 0x39, 0x70, 0x65, 0x68, 0x6a, 0x5a, 0x38, 0x4a, 0x51, 0x77, 0x61, 0x71, 0x6c, \n\t0x58, 0x50, 0x78, 0x6a, 0x35, 0x76, 0x36, 0x6b, 0x52, 0x74, 0x53, 0x4b, 0x6b, 0x53, 0x63, 0x45, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x41, 0x4d, 0x66, 0x43, 0x53, 0x41, 0x32, 0x5a, 0x56, 0x2f, 0x4f, 0x49, 0x39, 0x4d, 0x68, 0x5a, 0x77, \n\t0x58, 0x4e, 0x76, 0x48, 0x6e, 0x48, 0x6c, 0x4a, 0x62, 0x73, 0x65, 0x51, 0x41, 0x70, 0x47, 0x65, 0x59, 0x73, \n\t0x70, 0x6c, 0x70, 0x68, 0x72, 0x39, 0x4e, 0x4c, 0x62, 0x74, 0x73, 0x6b, 0x69, 0x55, 0x31, 0x41, 0x37, 0x78, \n\t0x37, 0x31, 0x70, 0x70, 0x6f, 0x47, 0x55, 0x42, 0x49, 0x2f, 0x31, 0x4a, 0x64, 0x58, 0x4f, 0x61, 0x64, 0x5c, 0x0a,\n\t0x09, 0x46, 0x7a, 0x6f, 0x76, 0x53, 0x4f, 0x6a, 0x63, 0x48, 0x55, 0x47, 0x31, 0x78, 0x74, 0x33, 0x6b, 0x6b, \n\t0x42, 0x34, 0x62, 0x59, 0x78, 0x4e, 0x7a, 0x77, 0x70, 0x30, 0x34, 0x4b, 0x6f, 0x74, 0x41, 0x55, 0x6a, 0x61, \n\t0x54, 0x47, 0x31, 0x35, 0x67, 0x45, 0x6a, 0x33, 0x4d, 0x52, 0x4c, 0x4f, 0x72, 0x70, 0x6b, 0x63, 0x35, 0x67, \n\t0x6f, 0x63, 0x79, 0x34, 0x77, 0x4d, 0x73, 0x46, 0x6c, 0x77, 0x79, 0x67, 0x71, 0x62, 0x31, 0x56, 0x68, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x4c, 0x71, 0x50, 0x55, 0x38, 0x43, 0x6f, 0x61, 0x79, 0x6e, 0x49, 0x33, 0x47, 0x46, 0x55, 0x78, \n\t0x50, 0x45, 0x52, 0x6a, 0x45, 0x79, 0x38, 0x50, 0x6c, 0x5a, 0x37, 0x47, 0x57, 0x55, 0x55, 0x2f, 0x4b, 0x31, \n\t0x58, 0x6e, 0x76, 0x46, 0x44, 0x38, 0x62, 0x55, 0x6d, 0x31, 0x4f, 0x61, 0x30, 0x74, 0x6e, 0x4f, 0x4e, 0x6e, \n\t0x6e, 0x4c, 0x52, 0x69, 0x44, 0x2f, 0x2f, 0x67, 0x6d, 0x33, 0x69, 0x59, 0x58, 0x66, 0x31, 0x72, 0x77, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x49, 0x64, 0x57, 0x53, 0x33, 0x61, 0x45, 0x47, 0x4e, 0x5a, 0x52, 0x37, 0x6c, 0x50, 0x79, 0x6c, \n\t0x32, 0x71, 0x66, 0x59, 0x31, 0x73, 0x6a, 0x41, 0x61, 0x58, 0x75, 0x47, 0x62, 0x70, 0x6e, 0x79, 0x33, 0x49, \n\t0x72, 0x63, 0x68, 0x55, 0x4e, 0x7a, 0x39, 0x74, 0x4b, 0x34, 0x62, 0x33, 0x70, 0x44, 0x4a, 0x51, 0x56, 0x51, \n\t0x2b, 0x73, 0x35, 0x64, 0x4d, 0x6b, 0x48, 0x59, 0x75, 0x4d, 0x44, 0x6f, 0x37, 0x70, 0x78, 0x47, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x6a, 0x4a, 0x6e, 0x68, 0x6c, 0x47, 0x7a, 0x6a, 0x61, 0x75, 0x35, 0x35, 0x53, 0x7a, 0x4e, 0x50, \n\t0x42, 0x74, 0x6c, 0x72, 0x6a, 0x43, 0x4d, 0x64, 0x4a, 0x30, 0x58, 0x42, 0x71, 0x4e, 0x77, 0x4c, 0x67, 0x55, \n\t0x6a, 0x56, 0x49, 0x63, 0x50, 0x6e, 0x62, 0x34, 0x47, 0x51, 0x4d, 0x6d, 0x79, 0x31, 0x43, 0x36, 0x50, 0x50, \n\t0x6d, 0x38, 0x50, 0x6f, 0x39, 0x75, 0x65, 0x75, 0x63, 0x4f, 0x33, 0x2f, 0x49, 0x57, 0x7a, 0x33, 0x76, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x63, 0x74, 0x35, 0x70, 0x71, 0x64, 0x71, 0x37, 0x52, 0x34, 0x61, 0x32, 0x63, 0x37, 0x2f, 0x33, \n\t0x47, 0x4d, 0x32, 0x77, 0x4f, 0x41, 0x75, 0x52, 0x32, 0x71, 0x65, 0x47, 0x6a, 0x4e, 0x30, 0x67, 0x4c, 0x4d, \n\t0x41, 0x70, 0x31, 0x53, 0x38, 0x46, 0x49, 0x78, 0x32, 0x73, 0x59, 0x78, 0x5a, 0x4d, 0x5a, 0x36, 0x7a, 0x56, \n\t0x71, 0x59, 0x62, 0x72, 0x43, 0x79, 0x41, 0x2f, 0x68, 0x69, 0x34, 0x58, 0x52, 0x6a, 0x63, 0x44, 0x78, 0x5c, 0x0a,\n\t0x09, 0x72, 0x6a, 0x75, 0x64, 0x6b, 0x6f, 0x6c, 0x41, 0x64, 0x50, 0x61, 0x2f, 0x66, 0x34, 0x6c, 0x2f, 0x43, \n\t0x4c, 0x79, 0x6f, 0x45, 0x54, 0x6e, 0x75, 0x75, 0x32, 0x65, 0x7a, 0x77, 0x6d, 0x68, 0x2b, 0x43, 0x68, 0x48, \n\t0x48, 0x44, 0x2b, 0x75, 0x52, 0x6e, 0x75, 0x58, 0x43, 0x4b, 0x41, 0x72, 0x76, 0x47, 0x59, 0x78, 0x53, 0x39, \n\t0x33, 0x52, 0x2b, 0x4d, 0x49, 0x72, 0x79, 0x6d, 0x77, 0x56, 0x47, 0x44, 0x62, 0x48, 0x31, 0x58, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x43, 0x4d, 0x72, 0x48, 0x5a, 0x6b, 0x59, 0x56, 0x52, 0x42, 0x79, 0x77, 0x43, 0x70, 0x4d, 0x74, 0x50, \n\t0x30, 0x66, 0x4a, 0x30, 0x55, 0x6a, 0x49, 0x52, 0x76, 0x2f, 0x50, 0x4b, 0x7a, 0x66, 0x50, 0x63, 0x72, 0x7a, \n\t0x7a, 0x41, 0x59, 0x53, 0x44, 0x79, 0x58, 0x79, 0x49, 0x79, 0x67, 0x68, 0x62, 0x6c, 0x47, 0x6c, 0x31, 0x38, \n\t0x38, 0x34, 0x74, 0x58, 0x66, 0x38, 0x53, 0x52, 0x58, 0x58, 0x2b, 0x62, 0x39, 0x51, 0x45, 0x57, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x79, 0x79, 0x34, 0x4e, 0x7a, 0x53, 0x5a, 0x61, 0x78, 0x4a, 0x71, 0x43, 0x6b, 0x66, 0x55, 0x64, 0x57, \n\t0x63, 0x31, 0x49, 0x54, 0x63, 0x71, 0x55, 0x45, 0x66, 0x58, 0x71, 0x66, 0x62, 0x39, 0x39, 0x37, 0x50, 0x41, \n\t0x79, 0x66, 0x37, 0x2f, 0x39, 0x66, 0x53, 0x74, 0x68, 0x35, 0x49, 0x41, 0x76, 0x37, 0x4c, 0x72, 0x4c, 0x4b, \n\t0x5a, 0x6c, 0x6d, 0x59, 0x37, 0x51, 0x4d, 0x65, 0x42, 0x47, 0x43, 0x65, 0x73, 0x62, 0x36, 0x35, 0x62, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x39, 0x4d, 0x49, 0x34, 0x57, 0x63, 0x54, 0x69, 0x52, 0x70, 0x4c, 0x75, 0x67, 0x54, 0x4f, 0x39, \n\t0x49, 0x62, 0x61, 0x79, 0x57, 0x6a, 0x65, 0x48, 0x63, 0x4a, 0x4c, 0x49, 0x35, 0x4d, 0x4a, 0x33, 0x4f, 0x6c, \n\t0x74, 0x6c, 0x6f, 0x68, 0x77, 0x39, 0x58, 0x62, 0x55, 0x6e, 0x45, 0x52, 0x32, 0x32, 0x79, 0x34, 0x5a, 0x53, \n\t0x55, 0x65, 0x59, 0x69, 0x77, 0x35, 0x78, 0x75, 0x72, 0x6c, 0x52, 0x75, 0x39, 0x59, 0x63, 0x72, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x65, 0x56, 0x4c, 0x45, 0x65, 0x51, 0x6a, 0x30, 0x2b, 0x32, 0x5a, 0x61, 0x56, 0x52, 0x48, 0x56, 0x4a, \n\t0x70, 0x2b, 0x66, 0x62, 0x56, 0x4f, 0x56, 0x7a, 0x35, 0x67, 0x32, 0x37, 0x74, 0x6e, 0x47, 0x61, 0x6c, 0x70, \n\t0x30, 0x76, 0x52, 0x4c, 0x50, 0x73, 0x58, 0x43, 0x51, 0x42, 0x52, 0x67, 0x4e, 0x54, 0x46, 0x30, 0x4b, 0x4b, \n\t0x74, 0x68, 0x56, 0x33, 0x30, 0x66, 0x7a, 0x6d, 0x36, 0x63, 0x46, 0x53, 0x46, 0x56, 0x31, 0x68, 0x48, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x6a, 0x74, 0x51, 0x46, 0x2f, 0x38, 0x55, 0x58, 0x6e, 0x65, 0x4d, 0x36, 0x4e, 0x49, 0x33, 0x37, \n\t0x68, 0x44, 0x59, 0x66, 0x34, 0x67, 0x2f, 0x64, 0x74, 0x6c, 0x65, 0x34, 0x6b, 0x4d, 0x73, 0x54, 0x6c, 0x44, \n\t0x4c, 0x49, 0x42, 0x52, 0x56, 0x46, 0x77, 0x77, 0x54, 0x48, 0x48, 0x79, 0x31, 0x2b, 0x30, 0x77, 0x38, 0x74, \n\t0x66, 0x6c, 0x4c, 0x4f, 0x31, 0x35, 0x66, 0x79, 0x39, 0x63, 0x57, 0x56, 0x65, 0x52, 0x55, 0x37, 0x35, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x63, 0x51, 0x52, 0x35, 0x66, 0x66, 0x4b, 0x38, 0x49, 0x41, 0x63, 0x71, 0x6c, 0x73, 0x6d, 0x56, \n\t0x4e, 0x38, 0x32, 0x63, 0x30, 0x4c, 0x31, 0x50, 0x54, 0x4e, 0x43, 0x57, 0x4b, 0x4a, 0x6d, 0x61, 0x32, 0x75, \n\t0x6d, 0x50, 0x6a, 0x64, 0x43, 0x47, 0x4f, 0x41, 0x49, 0x39, 0x32, 0x51, 0x41, 0x67, 0x77, 0x73, 0x68, 0x50, \n\t0x31, 0x6b, 0x6d, 0x63, 0x73, 0x36, 0x33, 0x4d, 0x58, 0x73, 0x32, 0x49, 0x6e, 0x2f, 0x51, 0x64, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x64, 0x54, 0x4d, 0x67, 0x32, 0x49, 0x62, 0x67, 0x42, 0x4f, 0x67, 0x4b, 0x70, 0x67, 0x4a, 0x49, 0x75, \n\t0x42, 0x30, 0x57, 0x58, 0x48, 0x68, 0x32, 0x77, 0x4d, 0x35, 0x75, 0x4d, 0x72, 0x75, 0x75, 0x4c, 0x43, 0x51, \n\t0x51, 0x76, 0x77, 0x65, 0x73, 0x42, 0x6e, 0x53, 0x68, 0x67, 0x64, 0x79, 0x46, 0x30, 0x65, 0x62, 0x52, 0x6e, \n\t0x6e, 0x4a, 0x59, 0x79, 0x79, 0x2b, 0x42, 0x49, 0x46, 0x49, 0x38, 0x48, 0x66, 0x67, 0x2b, 0x69, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x68, 0x30, 0x56, 0x39, 0x48, 0x79, 0x51, 0x72, 0x38, 0x33, 0x42, 0x77, 0x37, 0x65, 0x55, 0x6a, 0x66, \n\t0x75, 0x69, 0x76, 0x50, 0x63, 0x6e, 0x2f, 0x39, 0x63, 0x71, 0x7a, 0x33, 0x48, 0x58, 0x50, 0x42, 0x76, 0x63, \n\t0x2b, 0x4f, 0x47, 0x52, 0x37, 0x5a, 0x38, 0x69, 0x46, 0x78, 0x2b, 0x47, 0x70, 0x56, 0x77, 0x76, 0x50, 0x75, \n\t0x6c, 0x37, 0x49, 0x4d, 0x67, 0x63, 0x4d, 0x36, 0x33, 0x74, 0x58, 0x68, 0x4f, 0x4c, 0x39, 0x4d, 0x30, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x44, 0x4b, 0x4b, 0x76, 0x4c, 0x46, 0x59, 0x46, 0x73, 0x51, 0x44, 0x32, 0x78, 0x4d, 0x56, 0x4f, \n\t0x33, 0x58, 0x61, 0x4a, 0x62, 0x47, 0x6f, 0x55, 0x68, 0x41, 0x53, 0x68, 0x42, 0x47, 0x4f, 0x49, 0x59, 0x6c, \n\t0x65, 0x48, 0x42, 0x35, 0x5a, 0x41, 0x2f, 0x34, 0x74, 0x74, 0x53, 0x77, 0x65, 0x69, 0x6d, 0x74, 0x6a, 0x76, \n\t0x62, 0x4a, 0x74, 0x4f, 0x41, 0x4b, 0x46, 0x61, 0x37, 0x66, 0x4c, 0x74, 0x69, 0x6d, 0x54, 0x2b, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x68, 0x6c, 0x6e, 0x47, 0x63, 0x32, 0x38, 0x34, 0x78, 0x4e, 0x73, 0x2b, 0x64, 0x6e, 0x61, 0x4b, 0x4b, \n\t0x74, 0x64, 0x79, 0x30, 0x39, 0x55, 0x62, 0x48, 0x4e, 0x30, 0x4b, 0x64, 0x4a, 0x68, 0x53, 0x45, 0x7a, 0x6f, \n\t0x41, 0x4d, 0x4f, 0x72, 0x2f, 0x4a, 0x64, 0x6c, 0x45, 0x48, 0x58, 0x51, 0x5a, 0x44, 0x63, 0x44, 0x74, 0x46, \n\t0x59, 0x79, 0x71, 0x59, 0x68, 0x59, 0x49, 0x6f, 0x35, 0x62, 0x36, 0x55, 0x42, 0x5a, 0x56, 0x66, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x49, 0x35, 0x6c, 0x4b, 0x33, 0x72, 0x45, 0x72, 0x53, 0x68, 0x7a, 0x4d, 0x4d, 0x6f, 0x33, 0x43, 0x73, \n\t0x46, 0x49, 0x2f, 0x78, 0x39, 0x6b, 0x34, 0x78, 0x71, 0x79, 0x31, 0x6b, 0x79, 0x6a, 0x68, 0x38, 0x71, 0x65, \n\t0x4f, 0x37, 0x4e, 0x4f, 0x7a, 0x7a, 0x33, 0x35, 0x6c, 0x47, 0x5a, 0x62, 0x2f, 0x56, 0x4a, 0x36, 0x50, 0x44, \n\t0x50, 0x62, 0x30, 0x4e, 0x4c, 0x42, 0x69, 0x34, 0x76, 0x70, 0x78, 0x68, 0x6b, 0x77, 0x37, 0x72, 0x74, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x41, 0x4f, 0x6a, 0x45, 0x6e, 0x52, 0x31, 0x66, 0x55, 0x55, 0x39, 0x4b, 0x69, 0x6e, 0x54, 0x68, \n\t0x63, 0x70, 0x58, 0x39, 0x56, 0x54, 0x33, 0x49, 0x41, 0x4b, 0x55, 0x7a, 0x35, 0x4d, 0x52, 0x49, 0x6f, 0x4d, \n\t0x53, 0x52, 0x6f, 0x4f, 0x4c, 0x71, 0x54, 0x58, 0x41, 0x7a, 0x4e, 0x38, 0x6e, 0x64, 0x39, 0x4f, 0x6b, 0x51, \n\t0x2f, 0x69, 0x54, 0x4f, 0x61, 0x76, 0x4c, 0x76, 0x4a, 0x76, 0x32, 0x33, 0x37, 0x6a, 0x6c, 0x42, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x48, 0x31, 0x56, 0x66, 0x53, 0x6b, 0x50, 0x71, 0x4f, 0x76, 0x2f, 0x50, 0x77, 0x6a, 0x4c, 0x51, 0x6e, \n\t0x37, 0x79, 0x38, 0x74, 0x76, 0x4d, 0x33, 0x6b, 0x30, 0x48, 0x4c, 0x69, 0x32, 0x33, 0x6b, 0x37, 0x46, 0x64, \n\t0x59, 0x52, 0x31, 0x65, 0x6d, 0x6b, 0x50, 0x37, 0x39, 0x73, 0x74, 0x5a, 0x36, 0x33, 0x7a, 0x75, 0x4f, 0x45, \n\t0x2f, 0x30, 0x6d, 0x58, 0x71, 0x4d, 0x6b, 0x79, 0x65, 0x6a, 0x54, 0x61, 0x61, 0x4f, 0x75, 0x67, 0x38, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x6a, 0x61, 0x4e, 0x47, 0x30, 0x6c, 0x4c, 0x6c, 0x64, 0x48, 0x44, 0x5a, 0x7a, 0x52, 0x57, 0x70, \n\t0x50, 0x37, 0x58, 0x6d, 0x47, 0x73, 0x45, 0x39, 0x63, 0x53, 0x2f, 0x56, 0x42, 0x6f, 0x2f, 0x38, 0x69, 0x51, \n\t0x51, 0x4c, 0x35, 0x49, 0x4e, 0x61, 0x59, 0x50, 0x2f, 0x42, 0x61, 0x49, 0x4e, 0x31, 0x4b, 0x4a, 0x46, 0x74, \n\t0x64, 0x70, 0x50, 0x45, 0x35, 0x7a, 0x54, 0x61, 0x74, 0x69, 0x64, 0x41, 0x67, 0x6f, 0x39, 0x63, 0x69, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x31, 0x6e, 0x59, 0x49, 0x47, 0x5a, 0x45, 0x62, 0x43, 0x36, 0x6e, 0x79, 0x46, 0x61, 0x44, 0x67, \n\t0x2b, 0x6d, 0x6c, 0x47, 0x64, 0x6d, 0x68, 0x51, 0x35, 0x69, 0x76, 0x49, 0x51, 0x4b, 0x57, 0x42, 0x77, 0x6b, \n\t0x62, 0x6b, 0x58, 0x67, 0x4d, 0x67, 0x74, 0x41, 0x4d, 0x58, 0x48, 0x72, 0x2b, 0x74, 0x78, 0x66, 0x2f, 0x73, \n\t0x2f, 0x69, 0x56, 0x67, 0x6b, 0x35, 0x59, 0x68, 0x71, 0x41, 0x38, 0x70, 0x34, 0x47, 0x44, 0x58, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x64, 0x4c, 0x58, 0x65, 0x58, 0x7a, 0x74, 0x63, 0x34, 0x35, 0x78, 0x7a, 0x63, 0x58, 0x54, 0x37, \n\t0x2f, 0x64, 0x2f, 0x2b, 0x51, 0x55, 0x44, 0x2f, 0x6f, 0x2f, 0x6e, 0x48, 0x32, 0x76, 0x57, 0x61, 0x2b, 0x6b, \n\t0x77, 0x63, 0x69, 0x70, 0x75, 0x32, 0x6a, 0x49, 0x36, 0x51, 0x47, 0x47, 0x76, 0x6e, 0x78, 0x70, 0x47, 0x4a, \n\t0x73, 0x2f, 0x63, 0x55, 0x54, 0x77, 0x4d, 0x6f, 0x30, 0x2f, 0x41, 0x36, 0x43, 0x37, 0x48, 0x36, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x4f, 0x4f, 0x2f, 0x48, 0x36, 0x48, 0x6e, 0x49, 0x72, 0x54, 0x72, 0x6a, 0x53, 0x4d, 0x75, 0x76, 0x62, \n\t0x55, 0x62, 0x6d, 0x52, 0x75, 0x51, 0x65, 0x4f, 0x31, 0x69, 0x39, 0x51, 0x79, 0x6b, 0x53, 0x69, 0x63, 0x67, \n\t0x6c, 0x48, 0x73, 0x33, 0x4e, 0x59, 0x4f, 0x37, 0x42, 0x70, 0x47, 0x41, 0x57, 0x59, 0x47, 0x52, 0x74, 0x55, \n\t0x51, 0x75, 0x72, 0x34, 0x2b, 0x4e, 0x33, 0x6e, 0x46, 0x63, 0x34, 0x4b, 0x61, 0x4d, 0x4e, 0x4c, 0x58, 0x5c, 0x0a,\n\t0x09, 0x71, 0x49, 0x6d, 0x4b, 0x31, 0x61, 0x65, 0x79, 0x6c, 0x63, 0x4d, 0x37, 0x41, 0x70, 0x54, 0x2b, 0x66, \n\t0x6c, 0x73, 0x4f, 0x32, 0x51, 0x58, 0x55, 0x6b, 0x78, 0x71, 0x72, 0x57, 0x33, 0x55, 0x70, 0x63, 0x48, 0x47, \n\t0x50, 0x47, 0x31, 0x74, 0x4a, 0x37, 0x31, 0x35, 0x39, 0x39, 0x75, 0x65, 0x2f, 0x4a, 0x42, 0x77, 0x2b, 0x4f, \n\t0x7a, 0x4b, 0x7a, 0x59, 0x6e, 0x75, 0x72, 0x51, 0x39, 0x56, 0x56, 0x6f, 0x71, 0x34, 0x58, 0x48, 0x43, 0x5c, 0x0a,\n\t0x09, 0x34, 0x79, 0x44, 0x56, 0x4c, 0x70, 0x53, 0x78, 0x56, 0x2b, 0x63, 0x2b, 0x6a, 0x34, 0x79, 0x57, 0x2b, \n\t0x34, 0x6a, 0x4c, 0x2f, 0x78, 0x48, 0x78, 0x39, 0x67, 0x4e, 0x4b, 0x47, 0x76, 0x4b, 0x48, 0x50, 0x77, 0x54, \n\t0x37, 0x2f, 0x68, 0x59, 0x67, 0x35, 0x76, 0x74, 0x68, 0x51, 0x53, 0x6d, 0x52, 0x74, 0x51, 0x66, 0x56, 0x32, \n\t0x6b, 0x74, 0x65, 0x36, 0x54, 0x6d, 0x6c, 0x42, 0x78, 0x75, 0x47, 0x6d, 0x6d, 0x31, 0x64, 0x64, 0x50, 0x5c, 0x0a,\n\t0x09, 0x62, 0x61, 0x5a, 0x5a, 0x45, 0x32, 0x62, 0x75, 0x5a, 0x6c, 0x6f, 0x4a, 0x68, 0x75, 0x49, 0x52, 0x59, \n\t0x58, 0x53, 0x50, 0x6b, 0x48, 0x38, 0x61, 0x4a, 0x4e, 0x71, 0x5a, 0x70, 0x58, 0x34, 0x58, 0x33, 0x43, 0x5a, \n\t0x6b, 0x6c, 0x7a, 0x6b, 0x47, 0x56, 0x77, 0x6d, 0x44, 0x71, 0x77, 0x73, 0x34, 0x50, 0x49, 0x4f, 0x5a, 0x46, \n\t0x6c, 0x48, 0x63, 0x6d, 0x6d, 0x6d, 0x36, 0x54, 0x61, 0x6f, 0x4b, 0x55, 0x58, 0x69, 0x4d, 0x6d, 0x64, 0x5c, 0x0a,\n\t0x09, 0x62, 0x31, 0x37, 0x6a, 0x55, 0x79, 0x53, 0x37, 0x79, 0x72, 0x34, 0x69, 0x68, 0x39, 0x50, 0x63, 0x6f, \n\t0x42, 0x4c, 0x4f, 0x4c, 0x4e, 0x6d, 0x42, 0x41, 0x4f, 0x58, 0x77, 0x59, 0x4a, 0x41, 0x42, 0x6f, 0x6f, 0x63, \n\t0x36, 0x62, 0x77, 0x5a, 0x68, 0x53, 0x55, 0x6b, 0x79, 0x47, 0x39, 0x43, 0x56, 0x64, 0x6b, 0x74, 0x66, 0x6c, \n\t0x58, 0x56, 0x56, 0x33, 0x38, 0x4e, 0x63, 0x6f, 0x66, 0x52, 0x42, 0x47, 0x62, 0x55, 0x4a, 0x58, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x7a, 0x64, 0x2f, 0x37, 0x43, 0x50, 0x54, 0x4c, 0x4a, 0x7a, 0x33, 0x5a, 0x6c, 0x35, 0x6f, 0x56, \n\t0x2b, 0x56, 0x37, 0x55, 0x74, 0x64, 0x46, 0x70, 0x74, 0x73, 0x75, 0x31, 0x64, 0x64, 0x41, 0x42, 0x69, 0x64, \n\t0x38, 0x57, 0x2f, 0x4b, 0x36, 0x4c, 0x61, 0x55, 0x50, 0x36, 0x6c, 0x61, 0x45, 0x33, 0x67, 0x37, 0x72, 0x53, \n\t0x54, 0x57, 0x69, 0x4b, 0x77, 0x6b, 0x4c, 0x58, 0x65, 0x30, 0x7a, 0x44, 0x59, 0x46, 0x47, 0x33, 0x32, 0x5c, 0x0a,\n\t0x09, 0x33, 0x72, 0x2b, 0x50, 0x6f, 0x53, 0x2b, 0x32, 0x75, 0x63, 0x53, 0x6c, 0x2b, 0x6d, 0x65, 0x66, 0x5a, \n\t0x31, 0x57, 0x2f, 0x7a, 0x66, 0x66, 0x2b, 0x30, 0x79, 0x4e, 0x67, 0x5a, 0x39, 0x69, 0x46, 0x66, 0x4b, 0x63, \n\t0x4f, 0x44, 0x34, 0x35, 0x39, 0x39, 0x34, 0x43, 0x63, 0x39, 0x2f, 0x78, 0x6c, 0x5a, 0x54, 0x34, 0x30, 0x69, \n\t0x55, 0x55, 0x64, 0x66, 0x46, 0x2f, 0x70, 0x4b, 0x61, 0x75, 0x6b, 0x2b, 0x6a, 0x47, 0x65, 0x6e, 0x69, 0x5c, 0x0a,\n\t0x09, 0x65, 0x6d, 0x6c, 0x47, 0x4c, 0x57, 0x57, 0x32, 0x6c, 0x64, 0x47, 0x34, 0x62, 0x6b, 0x36, 0x61, 0x55, \n\t0x51, 0x36, 0x6a, 0x75, 0x34, 0x56, 0x7a, 0x76, 0x79, 0x65, 0x63, 0x65, 0x36, 0x4d, 0x77, 0x75, 0x74, 0x74, \n\t0x43, 0x79, 0x42, 0x53, 0x37, 0x41, 0x2f, 0x6c, 0x6e, 0x48, 0x44, 0x74, 0x2f, 0x6b, 0x6e, 0x48, 0x32, 0x4e, \n\t0x55, 0x50, 0x4f, 0x2f, 0x66, 0x36, 0x41, 0x6e, 0x54, 0x73, 0x7a, 0x35, 0x4b, 0x7a, 0x4b, 0x73, 0x36, 0x5c, 0x0a,\n\t0x09, 0x74, 0x4e, 0x58, 0x57, 0x33, 0x59, 0x30, 0x31, 0x30, 0x65, 0x6f, 0x34, 0x4c, 0x72, 0x76, 0x33, 0x61, \n\t0x75, 0x6b, 0x55, 0x44, 0x74, 0x44, 0x41, 0x34, 0x64, 0x31, 0x67, 0x37, 0x62, 0x64, 0x2b, 0x31, 0x6c, 0x70, \n\t0x4c, 0x51, 0x5a, 0x72, 0x48, 0x5a, 0x54, 0x44, 0x36, 0x48, 0x58, 0x2b, 0x59, 0x57, 0x30, 0x57, 0x6a, 0x4d, \n\t0x79, 0x35, 0x70, 0x54, 0x57, 0x68, 0x46, 0x4a, 0x37, 0x57, 0x54, 0x65, 0x30, 0x4c, 0x48, 0x57, 0x75, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x52, 0x6d, 0x70, 0x4e, 0x46, 0x5a, 0x62, 0x47, 0x70, 0x7a, 0x77, 0x39, 0x37, 0x5a, 0x51, 0x37, \n\t0x55, 0x5a, 0x39, 0x37, 0x6d, 0x4f, 0x38, 0x54, 0x47, 0x72, 0x6e, 0x33, 0x42, 0x71, 0x46, 0x6b, 0x72, 0x38, \n\t0x6b, 0x4b, 0x55, 0x31, 0x69, 0x6a, 0x48, 0x62, 0x68, 0x79, 0x6f, 0x37, 0x51, 0x56, 0x7a, 0x50, 0x36, 0x30, \n\t0x70, 0x75, 0x50, 0x38, 0x4e, 0x2b, 0x2f, 0x2b, 0x77, 0x72, 0x2b, 0x30, 0x61, 0x38, 0x38, 0x77, 0x73, 0x5c, 0x0a,\n\t0x09, 0x63, 0x65, 0x36, 0x4e, 0x34, 0x73, 0x37, 0x61, 0x6c, 0x50, 0x47, 0x66, 0x4c, 0x6a, 0x66, 0x2f, 0x6c, \n\t0x69, 0x6e, 0x76, 0x33, 0x55, 0x72, 0x61, 0x72, 0x51, 0x68, 0x73, 0x61, 0x52, 0x4b, 0x4b, 0x4f, 0x75, 0x58, \n\t0x2f, 0x52, 0x7a, 0x56, 0x42, 0x2b, 0x33, 0x2f, 0x76, 0x71, 0x4f, 0x30, 0x31, 0x70, 0x69, 0x4c, 0x57, 0x57, \n\t0x38, 0x5a, 0x70, 0x51, 0x71, 0x73, 0x36, 0x75, 0x4d, 0x68, 0x42, 0x4e, 0x32, 0x42, 0x73, 0x31, 0x49, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x67, 0x71, 0x6a, 0x54, 0x77, 0x69, 0x6a, 0x54, 0x78, 0x61, 0x64, 0x34, 0x42, 0x6b, 0x6e, 0x78, \n\t0x53, 0x4f, 0x4f, 0x34, 0x68, 0x48, 0x48, 0x37, 0x76, 0x73, 0x79, 0x42, 0x70, 0x63, 0x4c, 0x77, 0x2b, 0x74, \n\t0x68, 0x63, 0x47, 0x32, 0x42, 0x32, 0x31, 0x42, 0x74, 0x45, 0x6f, 0x7a, 0x57, 0x6f, 0x6a, 0x55, 0x68, 0x30, \n\t0x34, 0x61, 0x78, 0x6d, 0x70, 0x48, 0x53, 0x35, 0x6e, 0x70, 0x70, 0x52, 0x75, 0x4f, 0x63, 0x31, 0x36, 0x5c, 0x0a,\n\t0x09, 0x69, 0x30, 0x53, 0x6a, 0x50, 0x53, 0x32, 0x55, 0x44, 0x5a, 0x4f, 0x53, 0x76, 0x4e, 0x53, 0x47, 0x74, \n\t0x51, 0x33, 0x6b, 0x46, 0x4e, 0x68, 0x68, 0x51, 0x4f, 0x6c, 0x34, 0x57, 0x36, 0x44, 0x65, 0x71, 0x34, 0x36, \n\t0x6c, 0x6c, 0x34, 0x62, 0x53, 0x61, 0x30, 0x51, 0x79, 0x6a, 0x62, 0x45, 0x70, 0x7a, 0x50, 0x55, 0x64, 0x55, \n\t0x7a, 0x63, 0x4c, 0x75, 0x55, 0x6d, 0x6c, 0x48, 0x51, 0x62, 0x4d, 0x54, 0x63, 0x45, 0x71, 0x46, 0x30, 0x5c, 0x0a,\n\t0x09, 0x68, 0x69, 0x76, 0x34, 0x68, 0x61, 0x48, 0x38, 0x6f, 0x4f, 0x6c, 0x45, 0x74, 0x31, 0x31, 0x71, 0x7a, \n\t0x53, 0x6a, 0x53, 0x79, 0x44, 0x79, 0x41, 0x49, 0x32, 0x31, 0x4a, 0x49, 0x4c, 0x73, 0x49, 0x38, 0x6b, 0x66, \n\t0x56, 0x4d, 0x38, 0x6c, 0x41, 0x69, 0x75, 0x76, 0x48, 0x33, 0x55, 0x6b, 0x74, 0x2f, 0x55, 0x46, 0x55, 0x33, \n\t0x76, 0x38, 0x62, 0x6d, 0x2b, 0x65, 0x7a, 0x35, 0x73, 0x4e, 0x72, 0x76, 0x50, 0x67, 0x77, 0x62, 0x78, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x64, 0x65, 0x73, 0x30, 0x57, 0x76, 0x2f, 0x61, 0x39, 0x56, 0x2f, 0x47, 0x6d, 0x6a, 0x35, 0x7a, \n\t0x68, 0x74, 0x65, 0x38, 0x37, 0x7a, 0x5a, 0x2f, 0x65, 0x74, 0x38, 0x31, 0x44, 0x54, 0x35, 0x51, 0x62, 0x53, \n\t0x56, 0x31, 0x2b, 0x77, 0x59, 0x44, 0x6e, 0x50, 0x6d, 0x32, 0x4c, 0x4c, 0x37, 0x33, 0x31, 0x4d, 0x43, 0x2b, \n\t0x37, 0x39, 0x51, 0x69, 0x44, 0x54, 0x4b, 0x6a, 0x70, 0x55, 0x39, 0x61, 0x6a, 0x45, 0x30, 0x61, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x6e, 0x58, 0x42, 0x61, 0x46, 0x4a, 0x51, 0x4e, 0x4f, 0x2f, 0x50, 0x6e, 0x73, 0x43, 0x6f, 0x49, \n\t0x64, 0x30, 0x77, 0x79, 0x68, 0x38, 0x53, 0x52, 0x70, 0x38, 0x6f, 0x79, 0x44, 0x39, 0x62, 0x64, 0x4e, 0x36, \n\t0x65, 0x61, 0x53, 0x52, 0x2f, 0x30, 0x4a, 0x45, 0x2f, 0x4f, 0x49, 0x52, 0x33, 0x77, 0x2f, 0x44, 0x71, 0x67, \n\t0x75, 0x48, 0x31, 0x52, 0x57, 0x6d, 0x2b, 0x5a, 0x58, 0x73, 0x42, 0x49, 0x35, 0x76, 0x50, 0x6a, 0x44, 0x5c, 0x0a,\n\t0x09, 0x44, 0x53, 0x39, 0x7a, 0x33, 0x6b, 0x32, 0x77, 0x6f, 0x6a, 0x43, 0x48, 0x5a, 0x50, 0x41, 0x30, 0x61, \n\t0x49, 0x42, 0x34, 0x30, 0x2f, 0x35, 0x7a, 0x53, 0x4d, 0x58, 0x4e, 0x6c, 0x57, 0x43, 0x6e, 0x2b, 0x73, 0x71, \n\t0x79, 0x36, 0x2b, 0x33, 0x47, 0x43, 0x6d, 0x2b, 0x58, 0x73, 0x53, 0x33, 0x55, 0x49, 0x2f, 0x32, 0x6c, 0x5a, \n\t0x4e, 0x49, 0x51, 0x67, 0x6a, 0x64, 0x51, 0x4d, 0x44, 0x4c, 0x51, 0x4f, 0x77, 0x78, 0x67, 0x69, 0x62, 0x5c, 0x0a,\n\t0x09, 0x41, 0x70, 0x53, 0x47, 0x55, 0x58, 0x61, 0x38, 0x68, 0x6d, 0x30, 0x4e, 0x6f, 0x2b, 0x73, 0x6e, 0x65, \n\t0x58, 0x45, 0x6d, 0x30, 0x34, 0x69, 0x45, 0x47, 0x35, 0x70, 0x61, 0x74, 0x48, 0x36, 0x51, 0x4f, 0x75, 0x30, \n\t0x43, 0x59, 0x65, 0x51, 0x6c, 0x63, 0x2f, 0x43, 0x79, 0x57, 0x34, 0x37, 0x77, 0x73, 0x6c, 0x75, 0x50, 0x2b, \n\t0x45, 0x78, 0x61, 0x62, 0x6d, 0x72, 0x31, 0x4d, 0x73, 0x51, 0x77, 0x61, 0x71, 0x31, 0x58, 0x34, 0x34, 0x5c, 0x0a,\n\t0x09, 0x55, 0x50, 0x37, 0x56, 0x77, 0x31, 0x47, 0x46, 0x6e, 0x70, 0x67, 0x4e, 0x47, 0x34, 0x35, 0x79, 0x45, \n\t0x4f, 0x4f, 0x53, 0x50, 0x6b, 0x39, 0x2b, 0x61, 0x4d, 0x37, 0x73, 0x75, 0x52, 0x30, 0x33, 0x4f, 0x6d, 0x6a, \n\t0x79, 0x2b, 0x70, 0x45, 0x4b, 0x69, 0x73, 0x36, 0x68, 0x78, 0x47, 0x39, 0x32, 0x57, 0x4d, 0x37, 0x73, 0x74, \n\t0x67, 0x57, 0x45, 0x4a, 0x70, 0x63, 0x47, 0x33, 0x4f, 0x34, 0x49, 0x6f, 0x43, 0x74, 0x37, 0x55, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x47, 0x41, 0x55, 0x66, 0x6c, 0x59, 0x56, 0x52, 0x4f, 0x46, 0x34, 0x45, 0x6a, 0x4d, 0x77, 0x6c, 0x4b, \n\t0x52, 0x67, 0x52, 0x76, 0x67, 0x71, 0x72, 0x59, 0x65, 0x51, 0x72, 0x45, 0x62, 0x53, 0x6d, 0x61, 0x71, 0x36, \n\t0x4f, 0x71, 0x6d, 0x37, 0x77, 0x51, 0x30, 0x6d, 0x52, 0x67, 0x4a, 0x46, 0x51, 0x44, 0x72, 0x6e, 0x72, 0x65, \n\t0x6f, 0x57, 0x77, 0x38, 0x69, 0x46, 0x56, 0x6d, 0x70, 0x45, 0x2f, 0x46, 0x71, 0x6e, 0x76, 0x54, 0x64, 0x5c, 0x0a,\n\t0x09, 0x57, 0x58, 0x56, 0x48, 0x77, 0x30, 0x68, 0x77, 0x6e, 0x49, 0x6a, 0x71, 0x72, 0x32, 0x42, 0x63, 0x31, \n\t0x76, 0x55, 0x52, 0x70, 0x52, 0x4b, 0x54, 0x64, 0x30, 0x64, 0x6f, 0x4b, 0x39, 0x67, 0x6c, 0x45, 0x72, 0x4b, \n\t0x48, 0x79, 0x67, 0x2b, 0x68, 0x58, 0x52, 0x65, 0x54, 0x52, 0x68, 0x31, 0x4f, 0x65, 0x7a, 0x31, 0x6f, 0x33, \n\t0x36, 0x70, 0x64, 0x72, 0x52, 0x43, 0x69, 0x4d, 0x72, 0x38, 0x34, 0x5a, 0x52, 0x36, 0x6c, 0x35, 0x32, 0x5c, 0x0a,\n\t0x09, 0x64, 0x4b, 0x70, 0x45, 0x6d, 0x34, 0x70, 0x48, 0x68, 0x66, 0x7a, 0x42, 0x45, 0x63, 0x55, 0x44, 0x42, \n\t0x63, 0x58, 0x4a, 0x67, 0x70, 0x51, 0x38, 0x63, 0x68, 0x59, 0x2b, 0x2f, 0x59, 0x52, 0x6a, 0x63, 0x77, 0x42, \n\t0x50, 0x76, 0x30, 0x6a, 0x59, 0x48, 0x43, 0x53, 0x54, 0x64, 0x63, 0x71, 0x44, 0x54, 0x38, 0x4a, 0x37, 0x48, \n\t0x6e, 0x44, 0x73, 0x35, 0x6e, 0x44, 0x31, 0x63, 0x62, 0x6a, 0x74, 0x43, 0x6e, 0x33, 0x76, 0x67, 0x52, 0x5c, 0x0a,\n\t0x09, 0x47, 0x4d, 0x37, 0x73, 0x30, 0x59, 0x33, 0x56, 0x74, 0x71, 0x32, 0x4e, 0x6c, 0x46, 0x77, 0x75, 0x44, \n\t0x79, 0x6e, 0x4f, 0x77, 0x79, 0x49, 0x62, 0x75, 0x77, 0x49, 0x44, 0x74, 0x61, 0x56, 0x50, 0x37, 0x52, 0x6d, \n\t0x57, 0x41, 0x55, 0x37, 0x73, 0x76, 0x63, 0x59, 0x4b, 0x54, 0x4b, 0x62, 0x4d, 0x41, 0x6f, 0x61, 0x43, 0x45, \n\t0x5a, 0x7a, 0x58, 0x65, 0x6a, 0x37, 0x4c, 0x42, 0x53, 0x5a, 0x42, 0x35, 0x47, 0x48, 0x68, 0x6f, 0x61, 0x5c, 0x0a,\n\t0x09, 0x52, 0x75, 0x4b, 0x55, 0x35, 0x68, 0x45, 0x73, 0x44, 0x31, 0x66, 0x58, 0x54, 0x56, 0x54, 0x5a, 0x34, \n\t0x5a, 0x6f, 0x4b, 0x52, 0x75, 0x46, 0x63, 0x71, 0x4d, 0x50, 0x41, 0x6c, 0x78, 0x30, 0x2b, 0x68, 0x30, 0x30, \n\t0x43, 0x52, 0x72, 0x36, 0x43, 0x30, 0x61, 0x65, 0x6e, 0x52, 0x5a, 0x57, 0x62, 0x31, 0x33, 0x46, 0x42, 0x4d, \n\t0x33, 0x49, 0x43, 0x32, 0x5a, 0x47, 0x36, 0x58, 0x31, 0x56, 0x51, 0x63, 0x39, 0x63, 0x6a, 0x49, 0x42, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x37, 0x42, 0x6e, 0x66, 0x6a, 0x2f, 0x65, 0x4e, 0x75, 0x5a, 0x44, 0x38, 0x51, 0x6e, 0x66, 0x76, \n\t0x35, 0x4c, 0x77, 0x32, 0x48, 0x54, 0x34, 0x39, 0x76, 0x5a, 0x6b, 0x4d, 0x39, 0x41, 0x74, 0x73, 0x78, 0x5a, \n\t0x6f, 0x56, 0x52, 0x6d, 0x79, 0x77, 0x46, 0x52, 0x72, 0x59, 0x74, 0x34, 0x32, 0x44, 0x55, 0x41, 0x6f, 0x70, \n\t0x35, 0x77, 0x53, 0x68, 0x56, 0x35, 0x36, 0x70, 0x73, 0x66, 0x33, 0x6a, 0x4f, 0x49, 0x57, 0x64, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x46, 0x75, 0x51, 0x73, 0x77, 0x56, 0x79, 0x56, 0x70, 0x41, 0x7a, 0x67, 0x70, 0x77, 0x75, 0x4b, \n\t0x4a, 0x34, 0x6f, 0x36, 0x6d, 0x56, 0x54, 0x4c, 0x66, 0x4c, 0x45, 0x4e, 0x72, 0x7a, 0x74, 0x66, 0x6c, 0x65, \n\t0x4f, 0x4a, 0x67, 0x4d, 0x50, 0x6e, 0x33, 0x47, 0x38, 0x2b, 0x4e, 0x72, 0x4a, 0x74, 0x61, 0x55, 0x50, 0x50, \n\t0x75, 0x53, 0x71, 0x7a, 0x33, 0x35, 0x2f, 0x35, 0x68, 0x52, 0x63, 0x63, 0x77, 0x4b, 0x75, 0x4f, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x71, 0x53, 0x57, 0x4b, 0x42, 0x34, 0x6c, 0x7a, 0x2b, 0x73, 0x47, 0x51, 0x41, 0x41, 0x49, 0x41, 0x42, \n\t0x4a, 0x52, 0x45, 0x46, 0x55, 0x31, 0x46, 0x45, 0x38, 0x4f, 0x6f, 0x51, 0x37, 0x36, 0x39, 0x4e, 0x75, 0x53, \n\t0x33, 0x43, 0x48, 0x77, 0x42, 0x32, 0x53, 0x2b, 0x74, 0x39, 0x68, 0x4b, 0x63, 0x38, 0x66, 0x46, 0x74, 0x7a, \n\t0x68, 0x41, 0x67, 0x34, 0x4a, 0x32, 0x5a, 0x48, 0x43, 0x71, 0x31, 0x30, 0x4a, 0x47, 0x46, 0x58, 0x33, 0x5c, 0x0a,\n\t0x09, 0x78, 0x73, 0x4a, 0x49, 0x76, 0x54, 0x76, 0x34, 0x2b, 0x46, 0x34, 0x77, 0x30, 0x74, 0x64, 0x51, 0x35, \n\t0x31, 0x2f, 0x6c, 0x71, 0x38, 0x77, 0x72, 0x6d, 0x77, 0x61, 0x41, 0x77, 0x6d, 0x74, 0x47, 0x55, 0x4a, 0x70, \n\t0x50, 0x41, 0x55, 0x61, 0x75, 0x72, 0x45, 0x4e, 0x52, 0x47, 0x4a, 0x39, 0x4d, 0x46, 0x73, 0x4e, 0x41, 0x52, \n\t0x45, 0x45, 0x6d, 0x61, 0x46, 0x4f, 0x37, 0x77, 0x41, 0x62, 0x56, 0x78, 0x4d, 0x70, 0x4b, 0x2f, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x54, 0x49, 0x61, 0x6f, 0x52, 0x4d, 0x71, 0x42, 0x7a, 0x2f, 0x53, 0x72, 0x6d, 0x4c, 0x38, 0x74, 0x61, \n\t0x56, 0x72, 0x73, 0x71, 0x78, 0x61, 0x59, 0x4e, 0x47, 0x70, 0x47, 0x48, 0x6b, 0x72, 0x73, 0x62, 0x4a, 0x42, \n\t0x73, 0x4a, 0x75, 0x6e, 0x7a, 0x73, 0x34, 0x69, 0x55, 0x62, 0x6b, 0x67, 0x4b, 0x66, 0x70, 0x65, 0x71, 0x58, \n\t0x48, 0x33, 0x4f, 0x59, 0x4d, 0x6f, 0x34, 0x6d, 0x57, 0x67, 0x6d, 0x43, 0x41, 0x77, 0x2b, 0x72, 0x43, 0x5c, 0x0a,\n\t0x09, 0x71, 0x4b, 0x4f, 0x4d, 0x33, 0x6a, 0x42, 0x53, 0x62, 0x5a, 0x4b, 0x7a, 0x4f, 0x63, 0x57, 0x6a, 0x4f, \n\t0x63, 0x57, 0x70, 0x41, 0x6a, 0x6c, 0x64, 0x49, 0x4b, 0x64, 0x79, 0x69, 0x74, 0x4d, 0x43, 0x4d, 0x79, 0x36, \n\t0x4a, 0x65, 0x66, 0x42, 0x4a, 0x4b, 0x67, 0x67, 0x42, 0x6e, 0x44, 0x77, 0x48, 0x32, 0x7a, 0x6c, 0x73, 0x54, \n\t0x61, 0x67, 0x56, 0x6a, 0x59, 0x79, 0x79, 0x74, 0x54, 0x73, 0x47, 0x67, 0x43, 0x6d, 0x52, 0x62, 0x59, 0x5c, 0x0a,\n\t0x09, 0x64, 0x73, 0x41, 0x34, 0x2b, 0x50, 0x70, 0x34, 0x4d, 0x37, 0x4a, 0x4c, 0x68, 0x6a, 0x51, 0x6e, 0x5a, \n\t0x78, 0x7a, 0x75, 0x43, 0x4b, 0x45, 0x63, 0x50, 0x50, 0x47, 0x38, 0x46, 0x77, 0x30, 0x54, 0x41, 0x79, 0x7a, \n\t0x79, 0x57, 0x43, 0x30, 0x53, 0x44, 0x4f, 0x4a, 0x34, 0x4a, 0x52, 0x72, 0x51, 0x6a, 0x56, 0x4d, 0x42, 0x49, \n\t0x71, 0x78, 0x32, 0x38, 0x46, 0x6f, 0x36, 0x43, 0x70, 0x61, 0x44, 0x2b, 0x51, 0x7a, 0x36, 0x53, 0x43, 0x5c, 0x0a,\n\t0x09, 0x51, 0x6a, 0x44, 0x56, 0x64, 0x71, 0x6c, 0x6d, 0x51, 0x6c, 0x65, 0x6d, 0x48, 0x75, 0x72, 0x36, 0x50, \n\t0x4b, 0x70, 0x79, 0x43, 0x52, 0x71, 0x46, 0x67, 0x79, 0x68, 0x4f, 0x33, 0x5a, 0x4d, 0x4b, 0x66, 0x69, 0x71, \n\t0x4e, 0x4f, 0x36, 0x79, 0x75, 0x43, 0x7a, 0x41, 0x71, 0x4d, 0x73, 0x69, 0x75, 0x41, 0x72, 0x6d, 0x33, 0x7a, \n\t0x39, 0x32, 0x62, 0x42, 0x45, 0x54, 0x58, 0x41, 0x49, 0x65, 0x69, 0x4d, 0x35, 0x57, 0x54, 0x30, 0x38, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x79, 0x59, 0x64, 0x53, 0x69, 0x4b, 0x53, 0x30, 0x4c, 0x52, 0x6d, 0x33, 0x74, 0x4e, 0x43, 0x2f, \n\t0x69, 0x70, 0x44, 0x42, 0x69, 0x57, 0x38, 0x67, 0x66, 0x32, 0x4b, 0x58, 0x34, 0x73, 0x78, 0x48, 0x46, 0x6f, \n\t0x7a, 0x6c, 0x79, 0x4c, 0x6d, 0x31, 0x57, 0x7a, 0x53, 0x72, 0x48, 0x4e, 0x2b, 0x50, 0x77, 0x31, 0x67, 0x41, \n\t0x32, 0x4a, 0x35, 0x38, 0x47, 0x79, 0x77, 0x30, 0x58, 0x43, 0x52, 0x39, 0x35, 0x75, 0x47, 0x7a, 0x77, 0x5c, 0x0a,\n\t0x09, 0x30, 0x55, 0x32, 0x34, 0x34, 0x74, 0x67, 0x63, 0x4b, 0x74, 0x63, 0x68, 0x63, 0x73, 0x34, 0x68, 0x35, \n\t0x78, 0x7a, 0x46, 0x77, 0x78, 0x6d, 0x6a, 0x6a, 0x32, 0x32, 0x77, 0x73, 0x79, 0x6c, 0x73, 0x66, 0x50, 0x34, \n\t0x4f, 0x47, 0x37, 0x66, 0x73, 0x31, 0x4a, 0x31, 0x34, 0x54, 0x32, 0x42, 0x45, 0x42, 0x34, 0x77, 0x45, 0x50, \n\t0x64, 0x63, 0x6f, 0x68, 0x74, 0x47, 0x67, 0x37, 0x76, 0x41, 0x42, 0x52, 0x73, 0x37, 0x56, 0x65, 0x59, 0x5c, 0x0a,\n\t0x09, 0x71, 0x44, 0x54, 0x4d, 0x31, 0x44, 0x51, 0x70, 0x63, 0x58, 0x4f, 0x6f, 0x2b, 0x48, 0x57, 0x67, 0x4e, \n\t0x47, 0x55, 0x75, 0x59, 0x66, 0x77, 0x63, 0x67, 0x37, 0x73, 0x47, 0x58, 0x67, 0x31, 0x39, 0x48, 0x46, 0x7a, \n\t0x53, 0x6e, 0x74, 0x34, 0x6a, 0x42, 0x69, 0x35, 0x39, 0x65, 0x74, 0x52, 0x66, 0x44, 0x62, 0x67, 0x4b, 0x44, \n\t0x38, 0x31, 0x44, 0x43, 0x36, 0x48, 0x4a, 0x67, 0x37, 0x69, 0x4b, 0x35, 0x75, 0x6e, 0x6e, 0x4c, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x44, 0x71, 0x58, 0x6a, 0x6c, 0x67, 0x71, 0x6a, 0x6b, 0x41, 0x6b, 0x73, 0x46, 0x55, 0x61, 0x32, 0x50, \n\t0x4a, 0x33, 0x65, 0x74, 0x71, 0x6b, 0x48, 0x6a, 0x49, 0x71, 0x48, 0x64, 0x78, 0x6e, 0x64, 0x76, 0x55, 0x33, \n\t0x78, 0x59, 0x43, 0x2b, 0x4e, 0x64, 0x32, 0x61, 0x35, 0x34, 0x68, 0x6a, 0x63, 0x65, 0x44, 0x48, 0x63, 0x2b, \n\t0x30, 0x51, 0x4a, 0x6f, 0x54, 0x2f, 0x33, 0x46, 0x4f, 0x50, 0x62, 0x36, 0x53, 0x6e, 0x50, 0x75, 0x42, 0x5c, 0x0a,\n\t0x09, 0x69, 0x75, 0x4f, 0x43, 0x61, 0x63, 0x47, 0x38, 0x48, 0x46, 0x68, 0x35, 0x58, 0x44, 0x65, 0x6f, 0x39, \n\t0x45, 0x64, 0x68, 0x77, 0x37, 0x37, 0x39, 0x6d, 0x69, 0x4f, 0x4a, 0x6d, 0x78, 0x39, 0x61, 0x4a, 0x7a, 0x37, \n\t0x4a, 0x31, 0x6d, 0x46, 0x50, 0x70, 0x49, 0x43, 0x6b, 0x61, 0x4f, 0x65, 0x74, 0x32, 0x5a, 0x6f, 0x33, 0x52, \n\t0x67, 0x55, 0x7a, 0x35, 0x7a, 0x35, 0x32, 0x48, 0x52, 0x57, 0x4c, 0x47, 0x76, 0x7a, 0x54, 0x59, 0x38, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x4a, 0x7a, 0x52, 0x6c, 0x42, 0x79, 0x31, 0x4b, 0x57, 0x70, 0x68, 0x35, 0x44, 0x55, 0x66, 0x79, \n\t0x58, 0x32, 0x35, 0x51, 0x75, 0x33, 0x41, 0x39, 0x75, 0x46, 0x69, 0x47, 0x47, 0x74, 0x67, 0x66, 0x57, 0x43, \n\t0x55, 0x48, 0x59, 0x4a, 0x38, 0x68, 0x39, 0x72, 0x42, 0x4c, 0x75, 0x44, 0x63, 0x5a, 0x56, 0x33, 0x65, 0x46, \n\t0x53, 0x32, 0x54, 0x67, 0x4f, 0x67, 0x70, 0x6a, 0x54, 0x50, 0x4f, 0x31, 0x52, 0x30, 0x38, 0x39, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x42, 0x43, 0x6e, 0x4a, 0x5a, 0x6c, 0x77, 0x73, 0x6a, 0x6d, 0x6d, 0x34, 0x44, 0x44, 0x71, 0x73, 0x4b, \n\t0x6f, 0x65, 0x48, 0x6a, 0x45, 0x36, 0x4d, 0x36, 0x7a, 0x46, 0x43, 0x63, 0x58, 0x73, 0x55, 0x4e, 0x63, 0x74, \n\t0x39, 0x78, 0x30, 0x71, 0x58, 0x44, 0x54, 0x70, 0x62, 0x50, 0x6e, 0x63, 0x33, 0x79, 0x7a, 0x71, 0x57, 0x48, \n\t0x74, 0x74, 0x59, 0x77, 0x2b, 0x75, 0x63, 0x48, 0x67, 0x6d, 0x68, 0x48, 0x44, 0x70, 0x34, 0x5a, 0x39, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x59, 0x6c, 0x68, 0x56, 0x4d, 0x6b, 0x63, 0x59, 0x52, 0x54, 0x79, 0x61, 0x34, 0x4e, 0x52, 0x39, \n\t0x59, 0x35, 0x34, 0x42, 0x37, 0x5a, 0x6b, 0x6c, 0x46, 0x74, 0x74, 0x2b, 0x4b, 0x31, 0x47, 0x6f, 0x68, 0x58, \n\t0x37, 0x54, 0x6c, 0x58, 0x50, 0x6c, 0x62, 0x4f, 0x76, 0x4d, 0x34, 0x69, 0x68, 0x67, 0x31, 0x4b, 0x76, 0x77, \n\t0x6b, 0x52, 0x45, 0x72, 0x33, 0x31, 0x46, 0x51, 0x2f, 0x64, 0x68, 0x53, 0x6b, 0x42, 0x77, 0x59, 0x41, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x71, 0x65, 0x68, 0x53, 0x69, 0x66, 0x46, 0x4d, 0x42, 0x6a, 0x42, 0x35, 0x61, 0x59, 0x57, 0x31, \n\t0x64, 0x42, 0x54, 0x51, 0x42, 0x44, 0x67, 0x4e, 0x50, 0x71, 0x42, 0x39, 0x32, 0x51, 0x4e, 0x78, 0x56, 0x79, \n\t0x58, 0x36, 0x64, 0x6b, 0x45, 0x6d, 0x55, 0x37, 0x43, 0x74, 0x61, 0x59, 0x2f, 0x54, 0x63, 0x42, 0x69, 0x31, \n\t0x56, 0x5a, 0x37, 0x54, 0x6e, 0x6b, 0x39, 0x52, 0x4b, 0x35, 0x79, 0x31, 0x31, 0x39, 0x4d, 0x78, 0x62, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x6a, 0x61, 0x2b, 0x5a, 0x78, 0x59, 0x79, 0x74, 0x6a, 0x44, 0x71, 0x71, 0x46, 0x65, 0x79, 0x6a, \n\t0x4a, 0x62, 0x30, 0x6f, 0x73, 0x4b, 0x53, 0x69, 0x4b, 0x2f, 0x4b, 0x4e, 0x36, 0x64, 0x30, 0x4f, 0x42, 0x64, \n\t0x32, 0x33, 0x33, 0x75, 0x47, 0x6e, 0x62, 0x65, 0x64, 0x57, 0x67, 0x71, 0x45, 0x44, 0x71, 0x4b, 0x4d, 0x37, \n\t0x67, 0x77, 0x30, 0x74, 0x44, 0x4f, 0x38, 0x75, 0x32, 0x5a, 0x66, 0x68, 0x2f, 0x69, 0x2b, 0x70, 0x55, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x38, 0x4e, 0x32, 0x6a, 0x6a, 0x42, 0x42, 0x6a, 0x35, 0x6a, 0x71, 0x33, 0x54, 0x56, 0x65, 0x66, \n\t0x43, 0x78, 0x6d, 0x6f, 0x71, 0x6a, 0x64, 0x6f, 0x42, 0x4d, 0x70, 0x34, 0x78, 0x58, 0x52, 0x42, 0x2f, 0x31, \n\t0x6e, 0x6f, 0x55, 0x70, 0x30, 0x4f, 0x6f, 0x64, 0x6e, 0x42, 0x4d, 0x72, 0x6b, 0x55, 0x4c, 0x36, 0x65, 0x78, \n\t0x43, 0x56, 0x36, 0x48, 0x61, 0x35, 0x7a, 0x71, 0x61, 0x6c, 0x61, 0x33, 0x57, 0x6d, 0x75, 0x6d, 0x46, 0x5c, 0x0a,\n\t0x09, 0x75, 0x74, 0x6d, 0x6d, 0x61, 0x6b, 0x6f, 0x34, 0x4b, 0x43, 0x35, 0x62, 0x42, 0x49, 0x67, 0x75, 0x61, \n\t0x35, 0x78, 0x78, 0x70, 0x70, 0x4e, 0x50, 0x42, 0x4b, 0x4e, 0x55, 0x45, 0x51, 0x75, 0x47, 0x6b, 0x61, 0x33, \n\t0x4c, 0x79, 0x73, 0x4b, 0x6f, 0x44, 0x75, 0x2b, 0x2b, 0x35, 0x7a, 0x54, 0x35, 0x2f, 0x64, 0x75, 0x73, 0x5a, \n\t0x58, 0x36, 0x53, 0x50, 0x7a, 0x78, 0x51, 0x6f, 0x34, 0x57, 0x72, 0x41, 0x71, 0x4d, 0x41, 0x48, 0x41, 0x5c, 0x0a,\n\t0x09, 0x75, 0x6a, 0x76, 0x41, 0x70, 0x48, 0x63, 0x49, 0x6d, 0x57, 0x6a, 0x78, 0x52, 0x65, 0x6d, 0x57, 0x75, \n\t0x42, 0x55, 0x62, 0x55, 0x55, 0x4a, 0x41, 0x57, 0x6a, 0x33, 0x49, 0x44, 0x46, 0x77, 0x4d, 0x67, 0x75, 0x2f, \n\t0x78, 0x41, 0x4e, 0x4e, 0x72, 0x57, 0x72, 0x6f, 0x39, 0x76, 0x30, 0x36, 0x55, 0x4f, 0x54, 0x42, 0x65, 0x44, \n\t0x4b, 0x35, 0x6c, 0x71, 0x6c, 0x74, 0x50, 0x51, 0x44, 0x55, 0x5a, 0x6c, 0x58, 0x51, 0x69, 0x4e, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x61, 0x42, 0x79, 0x39, 0x59, 0x64, 0x51, 0x47, 0x6c, 0x44, 0x47, 0x36, 0x37, 0x38, 0x4a, 0x67, 0x78, \n\t0x4d, 0x72, 0x42, 0x71, 0x48, 0x68, 0x6b, 0x74, 0x47, 0x65, 0x2b, 0x6f, 0x50, 0x4e, 0x4b, 0x42, 0x4f, 0x53, \n\t0x73, 0x42, 0x73, 0x71, 0x69, 0x59, 0x61, 0x51, 0x30, 0x6e, 0x77, 0x61, 0x4d, 0x51, 0x6b, 0x64, 0x58, 0x61, \n\t0x53, 0x4d, 0x59, 0x42, 0x57, 0x42, 0x41, 0x47, 0x6b, 0x59, 0x70, 0x7a, 0x55, 0x68, 0x69, 0x47, 0x46, 0x5c, 0x0a,\n\t0x09, 0x56, 0x35, 0x57, 0x68, 0x67, 0x46, 0x73, 0x4f, 0x68, 0x31, 0x5a, 0x32, 0x59, 0x74, 0x57, 0x51, 0x70, \n\t0x47, 0x34, 0x53, 0x4d, 0x41, 0x6f, 0x57, 0x37, 0x46, 0x43, 0x4e, 0x79, 0x68, 0x75, 0x67, 0x30, 0x31, 0x6a, \n\t0x48, 0x71, 0x76, 0x77, 0x4f, 0x38, 0x46, 0x49, 0x6e, 0x2f, 0x66, 0x6a, 0x49, 0x2f, 0x49, 0x50, 0x71, 0x68, \n\t0x77, 0x75, 0x43, 0x41, 0x59, 0x78, 0x59, 0x78, 0x59, 0x41, 0x49, 0x79, 0x55, 0x6b, 0x30, 0x30, 0x56, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x44, 0x63, 0x59, 0x36, 0x58, 0x42, 0x50, 0x47, 0x4d, 0x6b, 0x54, 0x55, 0x34, 0x78, 0x78, 0x72, \n\t0x32, 0x55, 0x79, 0x32, 0x52, 0x4d, 0x59, 0x68, 0x59, 0x77, 0x56, 0x46, 0x44, 0x53, 0x4d, 0x49, 0x6a, 0x50, \n\t0x4b, 0x77, 0x73, 0x6a, 0x44, 0x52, 0x59, 0x4a, 0x5a, 0x72, 0x6d, 0x46, 0x6b, 0x7a, 0x43, 0x79, 0x6b, 0x78, \n\t0x55, 0x78, 0x54, 0x61, 0x51, 0x4f, 0x4d, 0x43, 0x72, 0x56, 0x58, 0x55, 0x62, 0x54, 0x67, 0x56, 0x73, 0x5c, 0x0a,\n\t0x09, 0x46, 0x4e, 0x63, 0x75, 0x4c, 0x50, 0x56, 0x78, 0x64, 0x78, 0x66, 0x61, 0x50, 0x38, 0x39, 0x58, 0x79, \n\t0x4f, 0x43, 0x6b, 0x59, 0x6e, 0x2b, 0x74, 0x36, 0x6a, 0x33, 0x71, 0x61, 0x5a, 0x77, 0x4b, 0x58, 0x4e, 0x54, \n\t0x4d, 0x38, 0x48, 0x47, 0x4e, 0x6e, 0x67, 0x6e, 0x4f, 0x44, 0x54, 0x41, 0x30, 0x5a, 0x75, 0x6f, 0x35, 0x64, \n\t0x6e, 0x64, 0x43, 0x30, 0x54, 0x53, 0x6e, 0x61, 0x38, 0x77, 0x42, 0x33, 0x52, 0x78, 0x4b, 0x39, 0x69, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x75, 0x47, 0x35, 0x77, 0x38, 0x6a, 0x2f, 0x72, 0x57, 0x41, 0x45, 0x37, 0x64, 0x39, 0x4d, 0x4b, \n\t0x2f, 0x39, 0x4b, 0x67, 0x46, 0x59, 0x45, 0x49, 0x77, 0x30, 0x4f, 0x44, 0x61, 0x4f, 0x67, 0x47, 0x53, 0x6d, \n\t0x41, 0x52, 0x64, 0x39, 0x55, 0x38, 0x7a, 0x41, 0x4b, 0x50, 0x71, 0x44, 0x47, 0x48, 0x6b, 0x55, 0x57, 0x52, \n\t0x68, 0x5a, 0x4d, 0x41, 0x54, 0x78, 0x4b, 0x49, 0x35, 0x4f, 0x43, 0x61, 0x4e, 0x31, 0x61, 0x31, 0x55, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x4f, 0x39, 0x4c, 0x31, 0x42, 0x6b, 0x2f, 0x69, 0x49, 0x4c, 0x71, 0x6f, 0x67, 0x44, 0x73, 0x62, \n\t0x72, 0x6e, 0x7a, 0x6a, 0x75, 0x67, 0x6c, 0x46, 0x44, 0x56, 0x67, 0x52, 0x47, 0x75, 0x6b, 0x79, 0x4a, 0x47, \n\t0x39, 0x6f, 0x62, 0x52, 0x70, 0x4b, 0x49, 0x6e, 0x78, 0x4a, 0x47, 0x37, 0x70, 0x49, 0x4e, 0x31, 0x6a, 0x4a, \n\t0x66, 0x63, 0x56, 0x76, 0x43, 0x31, 0x6f, 0x76, 0x50, 0x31, 0x61, 0x4e, 0x4f, 0x51, 0x5a, 0x59, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x49, 0x36, 0x30, 0x5a, 0x57, 0x52, 0x69, 0x56, 0x4d, 0x47, 0x6a, 0x43, 0x4b, 0x41, 0x44, 0x44, 0x61, \n\t0x45, 0x61, 0x69, 0x59, 0x46, 0x52, 0x42, 0x49, 0x30, 0x2f, 0x41, 0x79, 0x48, 0x2b, 0x6d, 0x4f, 0x6e, 0x79, \n\t0x46, 0x4e, 0x67, 0x4b, 0x4f, 0x4e, 0x64, 0x65, 0x30, 0x7a, 0x79, 0x68, 0x6f, 0x53, 0x56, 0x6f, 0x7a, 0x79, \n\t0x71, 0x6b, 0x47, 0x34, 0x47, 0x4d, 0x59, 0x58, 0x64, 0x44, 0x33, 0x72, 0x6b, 0x77, 0x43, 0x6f, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x33, 0x51, 0x2f, 0x4b, 0x71, 0x7a, 0x6a, 0x59, 0x4e, 0x52, 0x6c, 0x64, 0x5a, 0x4b, 0x36, 0x70, 0x64, \n\t0x2b, 0x65, 0x68, 0x69, 0x31, 0x6c, 0x78, 0x50, 0x69, 0x55, 0x6d, 0x42, 0x49, 0x77, 0x4b, 0x67, 0x42, 0x69, \n\t0x75, 0x58, 0x43, 0x79, 0x47, 0x31, 0x6c, 0x5a, 0x46, 0x63, 0x75, 0x65, 0x62, 0x7a, 0x37, 0x41, 0x4d, 0x6e, \n\t0x77, 0x2b, 0x70, 0x7a, 0x44, 0x4c, 0x7a, 0x39, 0x48, 0x64, 0x6b, 0x6d, 0x68, 0x7a, 0x73, 0x34, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x52, 0x68, 0x4f, 0x4a, 0x68, 0x5a, 0x47, 0x6a, 0x48, 0x55, 0x59, 0x68, 0x6e, 0x66, 0x63, 0x58, 0x56, \n\t0x66, 0x36, 0x66, 0x59, 0x49, 0x4a, 0x70, 0x4d, 0x38, 0x33, 0x2b, 0x52, 0x63, 0x47, 0x6f, 0x54, 0x54, 0x4d, \n\t0x4b, 0x50, 0x70, 0x2f, 0x67, 0x74, 0x41, 0x37, 0x2b, 0x49, 0x61, 0x67, 0x2f, 0x71, 0x4a, 0x6a, 0x61, 0x35, \n\t0x64, 0x48, 0x37, 0x6b, 0x69, 0x72, 0x74, 0x53, 0x66, 0x58, 0x66, 0x75, 0x71, 0x50, 0x30, 0x42, 0x74, 0x5c, 0x0a,\n\t0x09, 0x45, 0x6b, 0x38, 0x34, 0x69, 0x71, 0x6a, 0x36, 0x59, 0x4a, 0x68, 0x6b, 0x45, 0x53, 0x48, 0x64, 0x54, \n\t0x48, 0x6a, 0x55, 0x6d, 0x45, 0x57, 0x6e, 0x52, 0x36, 0x64, 0x61, 0x35, 0x72, 0x72, 0x70, 0x41, 0x57, 0x6c, \n\t0x61, 0x63, 0x34, 0x50, 0x38, 0x63, 0x6f, 0x57, 0x55, 0x35, 0x49, 0x37, 0x32, 0x6a, 0x75, 0x4d, 0x2b, 0x51, \n\t0x44, 0x49, 0x54, 0x78, 0x6d, 0x77, 0x69, 0x50, 0x6f, 0x37, 0x55, 0x50, 0x36, 0x6c, 0x70, 0x45, 0x67, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x4b, 0x4d, 0x4d, 0x45, 0x36, 0x37, 0x45, 0x4d, 0x62, 0x7a, 0x35, 0x4b, 0x4c, 0x75, 0x50, 0x37, \n\t0x43, 0x49, 0x37, 0x45, 0x2f, 0x33, 0x73, 0x72, 0x73, 0x57, 0x4c, 0x4f, 0x79, 0x5a, 0x73, 0x50, 0x47, 0x33, \n\t0x45, 0x38, 0x49, 0x59, 0x52, 0x37, 0x6c, 0x68, 0x34, 0x4e, 0x75, 0x4d, 0x57, 0x79, 0x61, 0x71, 0x6f, 0x4b, \n\t0x68, 0x7a, 0x6d, 0x45, 0x56, 0x6d, 0x54, 0x6f, 0x4f, 0x57, 0x36, 0x73, 0x52, 0x49, 0x75, 0x6b, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x35, 0x6d, 0x59, 0x4a, 0x50, 0x71, 0x70, 0x4e, 0x56, 0x72, 0x32, 0x70, 0x49, 0x6b, 0x39, 0x72, \n\t0x6c, 0x30, 0x64, 0x65, 0x78, 0x79, 0x74, 0x35, 0x52, 0x37, 0x57, 0x57, 0x45, 0x58, 0x52, 0x41, 0x4c, 0x4f, \n\t0x44, 0x2f, 0x33, 0x69, 0x4d, 0x77, 0x44, 0x4a, 0x56, 0x4f, 0x33, 0x49, 0x36, 0x50, 0x65, 0x69, 0x44, 0x2b, \n\t0x41, 0x53, 0x6b, 0x72, 0x75, 0x42, 0x6f, 0x33, 0x45, 0x62, 0x2f, 0x70, 0x66, 0x2b, 0x6f, 0x67, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x71, 0x73, 0x57, 0x35, 0x5a, 0x55, 0x63, 0x35, 0x30, 0x58, 0x66, 0x55, 0x72, 0x42, 0x2b, 0x49, 0x79, \n\t0x6b, 0x5a, 0x46, 0x79, 0x7a, 0x76, 0x4b, 0x52, 0x61, 0x6e, 0x78, 0x66, 0x65, 0x71, 0x45, 0x55, 0x56, 0x4c, \n\t0x36, 0x77, 0x6d, 0x68, 0x63, 0x68, 0x34, 0x5a, 0x4a, 0x74, 0x70, 0x79, 0x74, 0x72, 0x35, 0x30, 0x56, 0x52, \n\t0x6f, 0x6c, 0x36, 0x54, 0x62, 0x79, 0x78, 0x57, 0x6a, 0x65, 0x4d, 0x33, 0x4b, 0x45, 0x42, 0x77, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x65, 0x65, 0x59, 0x50, 0x64, 0x64, 0x54, 0x38, 0x44, 0x75, 0x47, 0x6b, 0x62, 0x6a, 0x78, 0x42, 0x30, \n\t0x52, 0x42, 0x70, 0x63, 0x57, 0x5a, 0x4a, 0x63, 0x58, 0x44, 0x4b, 0x37, 0x4d, 0x79, 0x55, 0x36, 0x30, 0x33, \n\t0x4c, 0x4f, 0x6c, 0x62, 0x61, 0x77, 0x57, 0x56, 0x55, 0x4b, 0x56, 0x36, 0x2f, 0x78, 0x4d, 0x61, 0x54, 0x2b, \n\t0x4a, 0x4d, 0x53, 0x70, 0x58, 0x31, 0x55, 0x2f, 0x38, 0x75, 0x78, 0x37, 0x71, 0x62, 0x6d, 0x47, 0x45, 0x5c, 0x0a,\n\t0x09, 0x49, 0x31, 0x35, 0x4c, 0x35, 0x6f, 0x6a, 0x33, 0x4d, 0x76, 0x4a, 0x66, 0x44, 0x4b, 0x6e, 0x41, 0x42, \n\t0x66, 0x57, 0x45, 0x78, 0x69, 0x7a, 0x78, 0x71, 0x6d, 0x6f, 0x59, 0x2b, 0x54, 0x4a, 0x39, 0x63, 0x64, 0x45, \n\t0x2b, 0x52, 0x7a, 0x69, 0x71, 0x53, 0x63, 0x52, 0x56, 0x73, 0x30, 0x51, 0x74, 0x51, 0x75, 0x75, 0x57, 0x53, \n\t0x54, 0x5a, 0x47, 0x4f, 0x78, 0x52, 0x62, 0x59, 0x43, 0x35, 0x65, 0x67, 0x74, 0x41, 0x48, 0x52, 0x73, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x48, 0x31, 0x41, 0x4b, 0x6a, 0x58, 0x75, 0x65, 0x6f, 0x47, 0x2b, 0x30, 0x43, 0x48, 0x41, 0x38, \n\t0x65, 0x6a, 0x4c, 0x49, 0x4c, 0x4e, 0x39, 0x6a, 0x38, 0x34, 0x67, 0x76, 0x59, 0x66, 0x64, 0x39, 0x70, 0x35, \n\t0x50, 0x48, 0x31, 0x70, 0x45, 0x59, 0x41, 0x74, 0x77, 0x6e, 0x75, 0x75, 0x4a, 0x42, 0x64, 0x49, 0x47, 0x51, \n\t0x6e, 0x68, 0x4f, 0x78, 0x43, 0x49, 0x62, 0x76, 0x59, 0x72, 0x38, 0x42, 0x76, 0x7a, 0x4e, 0x7a, 0x33, 0x5c, 0x0a,\n\t0x09, 0x73, 0x6a, 0x4b, 0x37, 0x50, 0x45, 0x61, 0x56, 0x55, 0x75, 0x57, 0x6d, 0x59, 0x43, 0x52, 0x45, 0x65, \n\t0x31, 0x2f, 0x37, 0x53, 0x39, 0x49, 0x77, 0x63, 0x6e, 0x55, 0x64, 0x4b, 0x68, 0x6a, 0x70, 0x76, 0x59, 0x7a, \n\t0x77, 0x78, 0x32, 0x46, 0x6d, 0x4e, 0x51, 0x6f, 0x2b, 0x61, 0x75, 0x66, 0x48, 0x78, 0x71, 0x76, 0x71, 0x61, \n\t0x68, 0x67, 0x52, 0x74, 0x67, 0x4c, 0x78, 0x32, 0x70, 0x44, 0x34, 0x63, 0x72, 0x51, 0x37, 0x6f, 0x31, 0x5c, 0x0a,\n\t0x09, 0x72, 0x57, 0x77, 0x75, 0x46, 0x55, 0x6c, 0x30, 0x33, 0x4a, 0x4a, 0x4b, 0x62, 0x5a, 0x69, 0x57, 0x59, \n\t0x48, 0x64, 0x37, 0x37, 0x63, 0x42, 0x63, 0x42, 0x6f, 0x44, 0x33, 0x5a, 0x35, 0x72, 0x4b, 0x39, 0x64, 0x41, \n\t0x49, 0x77, 0x61, 0x39, 0x52, 0x73, 0x48, 0x49, 0x39, 0x4d, 0x57, 0x71, 0x78, 0x6b, 0x64, 0x48, 0x62, 0x4c, \n\t0x35, 0x78, 0x52, 0x65, 0x51, 0x33, 0x33, 0x65, 0x4f, 0x2f, 0x4f, 0x4e, 0x6e, 0x6b, 0x57, 0x33, 0x64, 0x5c, 0x0a,\n\t0x09, 0x67, 0x51, 0x36, 0x67, 0x62, 0x4d, 0x4c, 0x67, 0x45, 0x6e, 0x42, 0x48, 0x38, 0x4e, 0x74, 0x39, 0x55, \n\t0x50, 0x34, 0x37, 0x57, 0x75, 0x43, 0x4f, 0x43, 0x57, 0x34, 0x6a, 0x33, 0x48, 0x74, 0x31, 0x48, 0x38, 0x4a, \n\t0x39, 0x45, 0x77, 0x77, 0x6f, 0x4e, 0x48, 0x7a, 0x6d, 0x41, 0x53, 0x4f, 0x62, 0x7a, 0x7a, 0x78, 0x67, 0x70, \n\t0x4d, 0x6f, 0x58, 0x6f, 0x56, 0x72, 0x65, 0x67, 0x61, 0x73, 0x31, 0x48, 0x62, 0x4f, 0x76, 0x55, 0x51, 0x5c, 0x0a,\n\t0x09, 0x30, 0x6a, 0x6f, 0x56, 0x34, 0x32, 0x59, 0x6b, 0x77, 0x31, 0x4c, 0x49, 0x7a, 0x45, 0x61, 0x43, 0x31, \n\t0x51, 0x72, 0x56, 0x32, 0x54, 0x46, 0x49, 0x78, 0x38, 0x33, 0x68, 0x54, 0x67, 0x2f, 0x49, 0x72, 0x2b, 0x61, \n\t0x74, 0x37, 0x54, 0x4c, 0x72, 0x67, 0x4e, 0x47, 0x6e, 0x75, 0x49, 0x52, 0x39, 0x75, 0x42, 0x39, 0x4a, 0x4e, \n\t0x4a, 0x74, 0x77, 0x46, 0x4a, 0x64, 0x76, 0x43, 0x46, 0x61, 0x55, 0x62, 0x37, 0x47, 0x55, 0x61, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x32, 0x4f, 0x58, 0x52, 0x4f, 0x51, 0x62, 0x58, 0x48, 0x57, 0x4a, 0x77, 0x37, 0x53, 0x47, 0x4b, 0x7a, \n\t0x32, 0x32, 0x54, 0x66, 0x33, 0x61, 0x48, 0x34, 0x75, 0x48, 0x64, 0x6d, 0x62, 0x66, 0x36, 0x32, 0x42, 0x75, \n\t0x4a, 0x48, 0x30, 0x51, 0x38, 0x66, 0x68, 0x44, 0x48, 0x44, 0x61, 0x38, 0x56, 0x74, 0x75, 0x36, 0x51, 0x32, \n\t0x67, 0x66, 0x73, 0x49, 0x48, 0x58, 0x66, 0x79, 0x6e, 0x75, 0x66, 0x41, 0x73, 0x57, 0x69, 0x59, 0x57, 0x5c, 0x0a,\n\t0x09, 0x51, 0x58, 0x79, 0x64, 0x6f, 0x79, 0x70, 0x6f, 0x47, 0x52, 0x61, 0x71, 0x50, 0x34, 0x2f, 0x35, 0x7a, \n\t0x53, 0x6a, 0x49, 0x42, 0x36, 0x6e, 0x36, 0x49, 0x36, 0x65, 0x51, 0x6b, 0x6a, 0x49, 0x56, 0x37, 0x44, 0x35, \n\t0x6d, 0x46, 0x55, 0x46, 0x46, 0x54, 0x66, 0x61, 0x71, 0x39, 0x67, 0x35, 0x4d, 0x70, 0x34, 0x68, 0x39, 0x46, \n\t0x71, 0x50, 0x4f, 0x79, 0x69, 0x35, 0x67, 0x6a, 0x31, 0x4b, 0x76, 0x32, 0x77, 0x6c, 0x35, 0x48, 0x61, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x34, 0x6d, 0x4d, 0x63, 0x76, 0x54, 0x4e, 0x66, 0x30, 0x6c, 0x45, 0x64, 0x37, 0x67, 0x4b, 0x52, \n\t0x76, 0x33, 0x65, 0x7a, 0x65, 0x6b, 0x2b, 0x45, 0x68, 0x5a, 0x31, 0x33, 0x4e, 0x41, 0x68, 0x78, 0x38, 0x45, \n\t0x6f, 0x4a, 0x46, 0x38, 0x68, 0x47, 0x4c, 0x57, 0x32, 0x61, 0x54, 0x49, 0x59, 0x74, 0x64, 0x5a, 0x72, 0x45, \n\t0x54, 0x43, 0x69, 0x7a, 0x44, 0x4f, 0x37, 0x65, 0x6f, 0x76, 0x73, 0x36, 0x71, 0x32, 0x79, 0x4f, 0x71, 0x5c, 0x0a,\n\t0x09, 0x64, 0x47, 0x46, 0x45, 0x2b, 0x4d, 0x6b, 0x4e, 0x4d, 0x35, 0x63, 0x71, 0x61, 0x41, 0x73, 0x77, 0x57, \n\t0x79, 0x4b, 0x37, 0x44, 0x72, 0x2f, 0x38, 0x35, 0x46, 0x65, 0x65, 0x6f, 0x43, 0x53, 0x54, 0x4e, 0x2b, 0x32, \n\t0x69, 0x49, 0x32, 0x62, 0x78, 0x55, 0x32, 0x62, 0x6a, 0x4c, 0x5a, 0x4e, 0x64, 0x36, 0x42, 0x47, 0x67, 0x7a, \n\t0x74, 0x4d, 0x4c, 0x4c, 0x58, 0x37, 0x51, 0x57, 0x4d, 0x39, 0x4d, 0x4c, 0x5a, 0x57, 0x57, 0x41, 0x55, 0x5c, 0x0a,\n\t0x09, 0x67, 0x4b, 0x42, 0x68, 0x31, 0x4b, 0x35, 0x42, 0x74, 0x38, 0x50, 0x49, 0x2b, 0x55, 0x57, 0x78, 0x32, \n\t0x6f, 0x53, 0x72, 0x4c, 0x71, 0x4c, 0x61, 0x77, 0x64, 0x47, 0x46, 0x7a, 0x31, 0x69, 0x48, 0x4e, 0x6f, 0x57, \n\t0x79, 0x77, 0x32, 0x65, 0x71, 0x45, 0x77, 0x35, 0x73, 0x44, 0x53, 0x4d, 0x33, 0x55, 0x6e, 0x55, 0x7a, 0x4d, \n\t0x4f, 0x6f, 0x70, 0x30, 0x33, 0x2b, 0x74, 0x55, 0x50, 0x43, 0x62, 0x6e, 0x64, 0x63, 0x36, 0x58, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x65, 0x4d, 0x31, 0x49, 0x50, 0x64, 0x61, 0x78, 0x69, 0x31, 0x74, 0x71, 0x45, 0x4e, 0x46, 0x44, 0x37, \n\t0x51, 0x45, 0x30, 0x5a, 0x4c, 0x33, 0x58, 0x4c, 0x57, 0x67, 0x54, 0x73, 0x78, 0x5a, 0x48, 0x42, 0x42, 0x76, \n\t0x46, 0x4e, 0x5a, 0x74, 0x48, 0x31, 0x49, 0x4c, 0x6b, 0x67, 0x68, 0x70, 0x65, 0x5a, 0x55, 0x2f, 0x61, 0x69, \n\t0x57, 0x38, 0x62, 0x76, 0x33, 0x37, 0x6a, 0x4b, 0x36, 0x65, 0x32, 0x64, 0x4f, 0x73, 0x4a, 0x70, 0x65, 0x5c, 0x0a,\n\t0x09, 0x73, 0x68, 0x4f, 0x77, 0x39, 0x56, 0x7a, 0x49, 0x4c, 0x76, 0x45, 0x6e, 0x78, 0x6f, 0x4a, 0x69, 0x48, \n\t0x49, 0x7a, 0x43, 0x63, 0x31, 0x6f, 0x51, 0x6a, 0x48, 0x51, 0x64, 0x46, 0x71, 0x49, 0x5a, 0x57, 0x52, 0x68, \n\t0x6c, 0x6a, 0x65, 0x67, 0x36, 0x37, 0x50, 0x74, 0x65, 0x42, 0x73, 0x33, 0x56, 0x2f, 0x51, 0x55, 0x55, 0x54, \n\t0x71, 0x32, 0x6b, 0x39, 0x37, 0x36, 0x68, 0x4c, 0x41, 0x44, 0x48, 0x55, 0x58, 0x33, 0x79, 0x4f, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x71, 0x78, 0x48, 0x35, 0x70, 0x6a, 0x48, 0x64, 0x68, 0x42, 0x53, 0x77, 0x70, 0x37, 0x4a, 0x71, 0x6e, \n\t0x37, 0x55, 0x4e, 0x57, 0x74, 0x37, 0x36, 0x39, 0x2f, 0x4c, 0x5a, 0x4f, 0x4d, 0x6d, 0x70, 0x6c, 0x7a, 0x70, \n\t0x71, 0x4f, 0x75, 0x4d, 0x6f, 0x77, 0x6d, 0x32, 0x6a, 0x36, 0x45, 0x50, 0x59, 0x43, 0x52, 0x62, 0x63, 0x73, \n\t0x34, 0x47, 0x4b, 0x58, 0x61, 0x32, 0x56, 0x31, 0x47, 0x39, 0x42, 0x77, 0x47, 0x44, 0x6a, 0x64, 0x77, 0x5c, 0x0a,\n\t0x09, 0x73, 0x46, 0x48, 0x48, 0x42, 0x78, 0x68, 0x74, 0x33, 0x72, 0x54, 0x46, 0x38, 0x50, 0x4d, 0x32, 0x32, \n\t0x50, 0x33, 0x51, 0x4e, 0x76, 0x6c, 0x44, 0x65, 0x2b, 0x38, 0x49, 0x64, 0x34, 0x64, 0x68, 0x34, 0x79, 0x62, \n\t0x48, 0x78, 0x74, 0x4e, 0x51, 0x72, 0x30, 0x6c, 0x6f, 0x2b, 0x77, 0x72, 0x44, 0x71, 0x48, 0x6f, 0x58, 0x4c, \n\t0x49, 0x7a, 0x55, 0x75, 0x78, 0x50, 0x71, 0x4f, 0x42, 0x63, 0x59, 0x42, 0x56, 0x4d, 0x6f, 0x6a, 0x74, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x31, 0x4c, 0x44, 0x6b, 0x53, 0x36, 0x68, 0x71, 0x2b, 0x44, 0x4f, 0x4a, 0x6f, 0x37, 0x50, 0x4c, \n\t0x49, 0x73, 0x4a, 0x7a, 0x77, 0x47, 0x47, 0x32, 0x73, 0x5a, 0x68, 0x7a, 0x59, 0x31, 0x61, 0x4a, 0x63, 0x64, \n\t0x51, 0x74, 0x45, 0x49, 0x50, 0x4e, 0x61, 0x6b, 0x6d, 0x52, 0x6d, 0x43, 0x39, 0x73, 0x77, 0x58, 0x79, 0x6c, \n\t0x54, 0x7a, 0x37, 0x43, 0x6c, 0x66, 0x79, 0x5a, 0x6b, 0x6b, 0x6c, 0x47, 0x7a, 0x48, 0x52, 0x7a, 0x31, 0x5c, 0x0a,\n\t0x09, 0x37, 0x4c, 0x72, 0x47, 0x79, 0x76, 0x75, 0x44, 0x42, 0x69, 0x4f, 0x62, 0x31, 0x77, 0x72, 0x43, 0x71, \n\t0x46, 0x48, 0x50, 0x44, 0x68, 0x69, 0x5a, 0x4d, 0x73, 0x70, 0x71, 0x6c, 0x2b, 0x48, 0x73, 0x57, 0x4d, 0x62, \n\t0x57, 0x38, 0x77, 0x39, 0x54, 0x50, 0x4a, 0x71, 0x7a, 0x2b, 0x34, 0x6b, 0x64, 0x38, 0x67, 0x64, 0x47, 0x66, \n\t0x64, 0x2b, 0x66, 0x71, 0x53, 0x57, 0x37, 0x32, 0x4c, 0x48, 0x78, 0x64, 0x4d, 0x66, 0x77, 0x38, 0x31, 0x5c, 0x0a,\n\t0x09, 0x78, 0x74, 0x4f, 0x6f, 0x51, 0x36, 0x7a, 0x67, 0x74, 0x47, 0x49, 0x62, 0x38, 0x47, 0x6a, 0x49, 0x7a, \n\t0x73, 0x46, 0x78, 0x67, 0x31, 0x76, 0x69, 0x61, 0x72, 0x69, 0x71, 0x70, 0x67, 0x46, 0x4c, 0x34, 0x4d, 0x34, \n\t0x6f, 0x45, 0x6a, 0x43, 0x6d, 0x4a, 0x46, 0x41, 0x5a, 0x6b, 0x61, 0x63, 0x69, 0x38, 0x77, 0x47, 0x36, 0x76, \n\t0x70, 0x70, 0x6a, 0x72, 0x69, 0x7a, 0x78, 0x4a, 0x35, 0x54, 0x61, 0x6a, 0x49, 0x66, 0x52, 0x37, 0x34, 0x5c, 0x0a,\n\t0x09, 0x36, 0x33, 0x30, 0x35, 0x56, 0x66, 0x73, 0x31, 0x4d, 0x4f, 0x58, 0x78, 0x76, 0x69, 0x32, 0x64, 0x78, \n\t0x44, 0x51, 0x37, 0x69, 0x37, 0x43, 0x70, 0x62, 0x36, 0x5a, 0x7a, 0x5a, 0x65, 0x63, 0x72, 0x4f, 0x33, 0x77, \n\t0x48, 0x6a, 0x4f, 0x6f, 0x72, 0x32, 0x44, 0x38, 0x77, 0x63, 0x6c, 0x54, 0x32, 0x64, 0x4a, 0x58, 0x58, 0x45, \n\t0x6d, 0x47, 0x55, 0x62, 0x47, 0x66, 0x69, 0x33, 0x6b, 0x30, 0x4a, 0x49, 0x77, 0x53, 0x79, 0x69, 0x77, 0x5c, 0x0a,\n\t0x09, 0x64, 0x73, 0x50, 0x65, 0x38, 0x77, 0x73, 0x6c, 0x32, 0x51, 0x66, 0x32, 0x35, 0x45, 0x2f, 0x6b, 0x42, \n\t0x4f, 0x38, 0x55, 0x69, 0x4f, 0x6a, 0x47, 0x61, 0x6e, 0x6b, 0x74, 0x75, 0x41, 0x37, 0x42, 0x4c, 0x48, 0x34, \n\t0x43, 0x6d, 0x4f, 0x34, 0x54, 0x56, 0x5a, 0x75, 0x64, 0x61, 0x72, 0x71, 0x6e, 0x63, 0x43, 0x48, 0x68, 0x50, \n\t0x42, 0x79, 0x4c, 0x62, 0x4a, 0x67, 0x73, 0x4c, 0x43, 0x71, 0x4d, 0x64, 0x37, 0x74, 0x59, 0x6f, 0x77, 0x5c, 0x0a,\n\t0x09, 0x63, 0x74, 0x44, 0x34, 0x54, 0x46, 0x45, 0x72, 0x6a, 0x49, 0x54, 0x57, 0x2f, 0x61, 0x2f, 0x44, 0x6c, \n\t0x72, 0x4d, 0x56, 0x6a, 0x4b, 0x6a, 0x62, 0x67, 0x6c, 0x42, 0x4e, 0x55, 0x68, 0x51, 0x55, 0x6a, 0x4e, 0x52, \n\t0x6e, 0x70, 0x53, 0x50, 0x57, 0x4f, 0x4d, 0x71, 0x68, 0x2f, 0x56, 0x79, 0x46, 0x39, 0x63, 0x54, 0x47, 0x66, \n\t0x71, 0x32, 0x63, 0x33, 0x45, 0x64, 0x6b, 0x66, 0x6f, 0x57, 0x37, 0x59, 0x46, 0x51, 0x39, 0x6c, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x68, 0x43, 0x2b, 0x78, 0x78, 0x47, 0x4e, 0x74, 0x38, 0x45, 0x48, 0x46, 0x5a, 0x31, 0x6c, 0x38, 0x64, \n\t0x55, 0x47, 0x52, 0x5a, 0x47, 0x4f, 0x48, 0x42, 0x62, 0x47, 0x63, 0x50, 0x72, 0x4e, 0x78, 0x68, 0x65, 0x76, \n\t0x77, 0x45, 0x43, 0x78, 0x52, 0x4e, 0x68, 0x4d, 0x2f, 0x36, 0x69, 0x2f, 0x41, 0x4c, 0x49, 0x74, 0x69, 0x41, \n\t0x37, 0x30, 0x70, 0x6a, 0x74, 0x37, 0x51, 0x62, 0x41, 0x52, 0x76, 0x6e, 0x64, 0x65, 0x37, 0x66, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x63, 0x45, 0x63, 0x64, 0x32, 0x58, 0x47, 0x48, 0x4f, 0x2b, 0x37, 0x4b, 0x69, 0x59, 0x57, 0x2b, 0x6a, \n\t0x74, 0x58, 0x58, 0x5a, 0x4b, 0x4e, 0x36, 0x7a, 0x77, 0x4b, 0x6a, 0x75, 0x4e, 0x4e, 0x50, 0x44, 0x79, 0x50, \n\t0x4d, 0x66, 0x5a, 0x77, 0x53, 0x52, 0x6c, 0x48, 0x36, 0x75, 0x6c, 0x36, 0x4c, 0x67, 0x35, 0x46, 0x67, 0x35, \n\t0x78, 0x72, 0x46, 0x4d, 0x46, 0x49, 0x37, 0x4c, 0x2b, 0x4b, 0x6f, 0x4a, 0x7a, 0x68, 0x71, 0x7a, 0x63, 0x5c, 0x0a,\n\t0x09, 0x59, 0x66, 0x56, 0x48, 0x48, 0x55, 0x61, 0x51, 0x4f, 0x4d, 0x74, 0x44, 0x6b, 0x57, 0x54, 0x57, 0x6f, \n\t0x73, 0x4b, 0x44, 0x66, 0x72, 0x44, 0x34, 0x56, 0x58, 0x4d, 0x44, 0x72, 0x54, 0x74, 0x34, 0x57, 0x54, 0x67, \n\t0x4b, 0x69, 0x2b, 0x77, 0x77, 0x59, 0x71, 0x62, 0x54, 0x41, 0x53, 0x42, 0x4a, 0x65, 0x45, 0x55, 0x58, 0x78, \n\t0x39, 0x65, 0x64, 0x67, 0x42, 0x6f, 0x31, 0x58, 0x61, 0x63, 0x72, 0x62, 0x78, 0x4d, 0x68, 0x49, 0x79, 0x5c, 0x0a,\n\t0x09, 0x52, 0x6f, 0x38, 0x6b, 0x4c, 0x68, 0x39, 0x47, 0x52, 0x4f, 0x46, 0x70, 0x76, 0x67, 0x78, 0x53, 0x2f, \n\t0x6a, 0x70, 0x43, 0x64, 0x6b, 0x45, 0x47, 0x46, 0x32, 0x51, 0x4d, 0x73, 0x50, 0x66, 0x4e, 0x64, 0x4b, 0x72, \n\t0x47, 0x38, 0x31, 0x42, 0x68, 0x64, 0x51, 0x2b, 0x6a, 0x54, 0x31, 0x75, 0x76, 0x46, 0x49, 0x78, 0x53, 0x39, \n\t0x33, 0x45, 0x4b, 0x47, 0x48, 0x55, 0x74, 0x42, 0x5a, 0x6c, 0x35, 0x61, 0x4e, 0x38, 0x6c, 0x59, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x52, 0x49, 0x7a, 0x54, 0x57, 0x71, 0x59, 0x53, 0x53, 0x71, 0x33, 0x61, 0x47, 0x2b, 0x33, 0x6b, 0x51, \n\t0x4c, 0x58, 0x2b, 0x36, 0x49, 0x59, 0x43, 0x52, 0x55, 0x2b, 0x31, 0x78, 0x58, 0x79, 0x7a, 0x62, 0x38, 0x70, \n\t0x45, 0x58, 0x39, 0x65, 0x61, 0x4d, 0x4b, 0x52, 0x6f, 0x35, 0x36, 0x39, 0x58, 0x2b, 0x6d, 0x36, 0x2f, 0x6c, \n\t0x45, 0x33, 0x35, 0x47, 0x7a, 0x62, 0x48, 0x79, 0x53, 0x36, 0x68, 0x59, 0x38, 0x46, 0x70, 0x30, 0x73, 0x5c, 0x0a,\n\t0x09, 0x34, 0x68, 0x76, 0x74, 0x39, 0x41, 0x51, 0x6d, 0x33, 0x53, 0x46, 0x44, 0x70, 0x65, 0x71, 0x6b, 0x78, \n\t0x45, 0x38, 0x68, 0x55, 0x71, 0x2b, 0x53, 0x48, 0x4b, 0x6b, 0x37, 0x6f, 0x7a, 0x32, 0x66, 0x70, 0x46, 0x62, \n\t0x69, 0x48, 0x42, 0x46, 0x48, 0x7a, 0x6f, 0x38, 0x74, 0x5a, 0x35, 0x74, 0x74, 0x6c, 0x49, 0x34, 0x79, 0x5a, \n\t0x4b, 0x6f, 0x79, 0x73, 0x6a, 0x6a, 0x63, 0x32, 0x59, 0x62, 0x34, 0x48, 0x6b, 0x5a, 0x31, 0x73, 0x58, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x32, 0x79, 0x72, 0x54, 0x35, 0x36, 0x44, 0x4b, 0x7a, 0x4f, 0x47, 0x32, 0x6a, 0x54, 0x61, 0x46, \n\t0x6a, 0x6d, 0x44, 0x70, 0x56, 0x2b, 0x59, 0x78, 0x72, 0x6f, 0x79, 0x30, 0x6a, 0x64, 0x59, 0x30, 0x74, 0x49, \n\t0x7a, 0x50, 0x31, 0x4e, 0x4f, 0x2f, 0x50, 0x78, 0x43, 0x76, 0x32, 0x6f, 0x38, 0x70, 0x51, 0x6d, 0x56, 0x44, \n\t0x56, 0x37, 0x6f, 0x30, 0x61, 0x4e, 0x6b, 0x55, 0x55, 0x4c, 0x75, 0x63, 0x65, 0x35, 0x75, 0x72, 0x61, 0x5c, 0x0a,\n\t0x09, 0x45, 0x4f, 0x2b, 0x42, 0x55, 0x32, 0x33, 0x33, 0x4b, 0x73, 0x33, 0x74, 0x51, 0x36, 0x4b, 0x39, 0x6a, \n\t0x43, 0x42, 0x61, 0x4a, 0x46, 0x74, 0x74, 0x4f, 0x61, 0x4a, 0x57, 0x35, 0x51, 0x50, 0x52, 0x44, 0x34, 0x6e, \n\t0x49, 0x79, 0x62, 0x36, 0x74, 0x36, 0x67, 0x55, 0x69, 0x33, 0x34, 0x54, 0x48, 0x6d, 0x69, 0x66, 0x6a, 0x68, \n\t0x37, 0x6b, 0x63, 0x47, 0x4b, 0x56, 0x71, 0x4f, 0x2b, 0x62, 0x6e, 0x5a, 0x6c, 0x59, 0x59, 0x32, 0x62, 0x5c, 0x0a,\n\t0x09, 0x70, 0x45, 0x6e, 0x58, 0x48, 0x2f, 0x77, 0x69, 0x67, 0x4b, 0x37, 0x78, 0x6d, 0x4d, 0x62, 0x48, 0x6b, \n\t0x2b, 0x7a, 0x30, 0x61, 0x5a, 0x30, 0x38, 0x45, 0x6f, 0x79, 0x6d, 0x38, 0x57, 0x47, 0x44, 0x58, 0x45, 0x31, \n\t0x6e, 0x75, 0x76, 0x59, 0x52, 0x53, 0x30, 0x75, 0x77, 0x43, 0x6a, 0x55, 0x4c, 0x6a, 0x34, 0x64, 0x37, 0x41, \n\t0x76, 0x6a, 0x41, 0x71, 0x61, 0x47, 0x36, 0x74, 0x42, 0x44, 0x53, 0x4f, 0x66, 0x54, 0x6d, 0x38, 0x50, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x6c, 0x66, 0x73, 0x49, 0x79, 0x57, 0x4d, 0x5a, 0x4b, 0x54, 0x61, 0x57, 0x38, 0x47, 0x6f, 0x79, \n\t0x59, 0x77, 0x57, 0x36, 0x51, 0x30, 0x69, 0x34, 0x4c, 0x48, 0x47, 0x66, 0x58, 0x4f, 0x73, 0x41, 0x49, 0x7a, \n\t0x61, 0x58, 0x70, 0x6f, 0x78, 0x30, 0x46, 0x6f, 0x49, 0x6a, 0x45, 0x4c, 0x63, 0x67, 0x6d, 0x43, 0x6b, 0x77, \n\t0x7a, 0x50, 0x41, 0x71, 0x43, 0x6c, 0x6c, 0x48, 0x6d, 0x4c, 0x7a, 0x50, 0x41, 0x41, 0x77, 0x71, 0x74, 0x5c, 0x0a,\n\t0x09, 0x73, 0x30, 0x49, 0x34, 0x77, 0x61, 0x57, 0x70, 0x48, 0x4f, 0x6f, 0x36, 0x32, 0x4d, 0x76, 0x59, 0x61, \n\t0x52, 0x31, 0x6f, 0x77, 0x53, 0x59, 0x62, 0x32, 0x58, 0x55, 0x57, 0x4d, 0x7a, 0x66, 0x71, 0x4d, 0x5a, 0x42, \n\t0x51, 0x42, 0x56, 0x47, 0x36, 0x73, 0x56, 0x4b, 0x6c, 0x2b, 0x39, 0x31, 0x33, 0x58, 0x59, 0x43, 0x69, 0x52, \n\t0x38, 0x30, 0x79, 0x79, 0x43, 0x30, 0x63, 0x6d, 0x2b, 0x44, 0x5a, 0x77, 0x45, 0x52, 0x45, 0x62, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x45, 0x6b, 0x71, 0x62, 0x56, 0x42, 0x66, 0x65, 0x42, 0x30, 0x5a, 0x52, 0x55, 0x75, 0x49, 0x48, 0x73, \n\t0x34, 0x5a, 0x52, 0x4d, 0x74, 0x77, 0x47, 0x68, 0x69, 0x6c, 0x68, 0x31, 0x4e, 0x53, 0x4b, 0x36, 0x6a, 0x79, \n\t0x57, 0x41, 0x61, 0x4e, 0x30, 0x65, 0x53, 0x6b, 0x5a, 0x41, 0x36, 0x50, 0x47, 0x75, 0x33, 0x53, 0x2b, 0x77, \n\t0x53, 0x67, 0x55, 0x33, 0x49, 0x52, 0x52, 0x64, 0x51, 0x39, 0x6b, 0x5a, 0x4e, 0x49, 0x6f, 0x62, 0x55, 0x5c, 0x0a,\n\t0x09, 0x64, 0x2f, 0x6c, 0x55, 0x4f, 0x6f, 0x59, 0x63, 0x51, 0x6f, 0x4e, 0x73, 0x65, 0x71, 0x38, 0x32, 0x72, \n\t0x50, 0x37, 0x57, 0x4a, 0x48, 0x56, 0x61, 0x75, 0x43, 0x30, 0x55, 0x4a, 0x41, 0x39, 0x46, 0x68, 0x6f, 0x5a, \n\t0x6c, 0x6d, 0x59, 0x48, 0x77, 0x5a, 0x73, 0x67, 0x52, 0x45, 0x36, 0x63, 0x51, 0x51, 0x6a, 0x44, 0x53, 0x6d, \n\t0x61, 0x31, 0x2f, 0x53, 0x46, 0x55, 0x55, 0x4e, 0x57, 0x42, 0x45, 0x61, 0x36, 0x54, 0x4f, 0x4f, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x77, 0x68, 0x47, 0x66, 0x54, 0x57, 0x68, 0x41, 0x77, 0x41, 0x6a, 0x73, 0x65, 0x2b, 0x4f, 0x37, \n\t0x64, 0x52, 0x74, 0x65, 0x64, 0x67, 0x79, 0x47, 0x6f, 0x44, 0x62, 0x4b, 0x78, 0x69, 0x46, 0x75, 0x4c, 0x59, \n\t0x79, 0x39, 0x68, 0x42, 0x47, 0x4b, 0x55, 0x32, 0x6f, 0x41, 0x53, 0x50, 0x37, 0x5a, 0x5a, 0x43, 0x67, 0x2f, \n\t0x51, 0x51, 0x59, 0x36, 0x58, 0x43, 0x34, 0x50, 0x72, 0x47, 0x78, 0x6d, 0x74, 0x30, 0x6f, 0x54, 0x62, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x67, 0x5a, 0x58, 0x73, 0x66, 0x37, 0x4e, 0x75, 0x75, 0x69, 0x55, 0x48, 0x6b, 0x6d, 0x39, 0x35, \n\t0x38, 0x79, 0x51, 0x32, 0x4d, 0x6e, 0x4e, 0x33, 0x31, 0x63, 0x4e, 0x34, 0x77, 0x53, 0x67, 0x46, 0x6d, 0x4c, \n\t0x32, 0x47, 0x6b, 0x58, 0x79, 0x59, 0x4e, 0x6f, 0x38, 0x59, 0x4c, 0x48, 0x6a, 0x65, 0x30, 0x4e, 0x34, 0x77, \n\t0x6b, 0x45, 0x62, 0x38, 0x6e, 0x4d, 0x44, 0x4c, 0x56, 0x58, 0x6b, 0x55, 0x59, 0x4e, 0x56, 0x5a, 0x37, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x78, 0x74, 0x47, 0x69, 0x52, 0x2f, 0x66, 0x68, 0x65, 0x2f, 0x79, 0x71, 0x45, 0x58, 0x42, 0x71, \n\t0x4e, 0x4a, 0x59, 0x2b, 0x73, 0x41, 0x49, 0x57, 0x6d, 0x45, 0x6b, 0x36, 0x72, 0x79, 0x46, 0x55, 0x65, 0x58, \n\t0x45, 0x44, 0x76, 0x6b, 0x55, 0x55, 0x49, 0x54, 0x31, 0x5a, 0x68, 0x47, 0x4d, 0x48, 0x75, 0x6a, 0x62, 0x67, \n\t0x6e, 0x36, 0x74, 0x4c, 0x2f, 0x4d, 0x2b, 0x47, 0x5a, 0x38, 0x53, 0x53, 0x67, 0x42, 0x70, 0x61, 0x44, 0x5c, 0x0a,\n\t0x09, 0x41, 0x5a, 0x6a, 0x50, 0x52, 0x31, 0x38, 0x51, 0x48, 0x4e, 0x54, 0x70, 0x71, 0x71, 0x32, 0x48, 0x78, \n\t0x68, 0x31, 0x46, 0x35, 0x4f, 0x69, 0x45, 0x75, 0x42, 0x34, 0x71, 0x44, 0x42, 0x79, 0x4b, 0x6d, 0x34, 0x61, \n\t0x63, 0x76, 0x6f, 0x41, 0x49, 0x57, 0x39, 0x66, 0x6d, 0x6f, 0x59, 0x54, 0x61, 0x6f, 0x5a, 0x2b, 0x61, 0x68, \n\t0x56, 0x68, 0x6c, 0x47, 0x58, 0x74, 0x6a, 0x56, 0x57, 0x4e, 0x49, 0x78, 0x49, 0x77, 0x4b, 0x67, 0x65, 0x5c, 0x0a,\n\t0x09, 0x54, 0x61, 0x75, 0x33, 0x6e, 0x47, 0x32, 0x44, 0x6b, 0x54, 0x4b, 0x37, 0x55, 0x6a, 0x44, 0x53, 0x32, \n\t0x39, 0x46, 0x57, 0x6d, 0x70, 0x69, 0x65, 0x52, 0x31, 0x51, 0x31, 0x2b, 0x50, 0x35, 0x30, 0x48, 0x32, 0x31, \n\t0x4b, 0x2f, 0x35, 0x59, 0x4c, 0x6e, 0x32, 0x75, 0x65, 0x30, 0x6a, 0x44, 0x79, 0x42, 0x55, 0x34, 0x43, 0x49, \n\t0x2f, 0x31, 0x51, 0x75, 0x6d, 0x43, 0x55, 0x47, 0x69, 0x31, 0x72, 0x58, 0x68, 0x69, 0x66, 0x36, 0x36, 0x5c, 0x0a,\n\t0x09, 0x76, 0x71, 0x36, 0x6b, 0x37, 0x5a, 0x36, 0x41, 0x43, 0x70, 0x39, 0x49, 0x75, 0x41, 0x55, 0x5a, 0x38, \n\t0x79, 0x55, 0x75, 0x6c, 0x73, 0x47, 0x53, 0x61, 0x4d, 0x43, 0x75, 0x38, 0x31, 0x6a, 0x47, 0x7a, 0x37, 0x35, \n\t0x67, 0x34, 0x6a, 0x4e, 0x79, 0x47, 0x4d, 0x36, 0x75, 0x74, 0x6e, 0x67, 0x6c, 0x46, 0x55, 0x58, 0x68, 0x38, \n\t0x59, 0x32, 0x66, 0x41, 0x34, 0x47, 0x44, 0x47, 0x44, 0x69, 0x4c, 0x38, 0x2b, 0x7a, 0x48, 0x4c, 0x57, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x41, 0x4c, 0x39, 0x44, 0x54, 0x55, 0x4a, 0x5a, 0x6b, 0x30, 0x45, 0x49, 0x2b, 0x50, 0x41, 0x62, \n\t0x73, 0x42, 0x49, 0x67, 0x55, 0x65, 0x6e, 0x52, 0x55, 0x42, 0x32, 0x7a, 0x50, 0x4d, 0x58, 0x67, 0x4d, 0x2f, \n\t0x4f, 0x64, 0x52, 0x35, 0x52, 0x4b, 0x65, 0x37, 0x2b, 0x35, 0x73, 0x30, 0x74, 0x2f, 0x4b, 0x6b, 0x4a, 0x59, \n\t0x56, 0x54, 0x6e, 0x4f, 0x52, 0x6d, 0x4d, 0x57, 0x74, 0x76, 0x55, 0x46, 0x30, 0x5a, 0x6a, 0x4f, 0x72, 0x5c, 0x0a,\n\t0x09, 0x52, 0x62, 0x46, 0x6f, 0x78, 0x53, 0x32, 0x6c, 0x6f, 0x58, 0x6a, 0x46, 0x49, 0x76, 0x37, 0x68, 0x51, \n\t0x77, 0x30, 0x73, 0x58, 0x31, 0x67, 0x6c, 0x46, 0x4c, 0x6d, 0x63, 0x6b, 0x79, 0x45, 0x6e, 0x36, 0x50, 0x6c, \n\t0x59, 0x52, 0x52, 0x4f, 0x4a, 0x47, 0x6f, 0x55, 0x79, 0x72, 0x63, 0x4f, 0x56, 0x70, 0x6e, 0x30, 0x6b, 0x74, \n\t0x63, 0x5a, 0x6a, 0x38, 0x59, 0x7a, 0x65, 0x49, 0x76, 0x30, 0x75, 0x57, 0x30, 0x66, 0x42, 0x56, 0x45, 0x5c, 0x0a,\n\t0x09, 0x61, 0x55, 0x64, 0x4e, 0x47, 0x42, 0x6e, 0x74, 0x4b, 0x59, 0x4a, 0x52, 0x63, 0x47, 0x43, 0x48, 0x4f, \n\t0x4b, 0x73, 0x5a, 0x35, 0x58, 0x57, 0x61, 0x71, 0x68, 0x37, 0x53, 0x55, 0x46, 0x37, 0x61, 0x70, 0x43, 0x65, \n\t0x49, 0x48, 0x4d, 0x42, 0x39, 0x7a, 0x56, 0x38, 0x39, 0x41, 0x52, 0x63, 0x32, 0x32, 0x70, 0x67, 0x41, 0x52, \n\t0x69, 0x35, 0x2b, 0x43, 0x41, 0x75, 0x46, 0x55, 0x61, 0x39, 0x7a, 0x72, 0x43, 0x61, 0x4d, 0x47, 0x76, 0x5c, 0x0a,\n\t0x09, 0x55, 0x62, 0x42, 0x79, 0x4d, 0x62, 0x48, 0x71, 0x65, 0x31, 0x54, 0x41, 0x71, 0x6a, 0x44, 0x67, 0x41, \n\t0x6d, 0x79, 0x31, 0x67, 0x53, 0x6a, 0x42, 0x72, 0x6c, 0x64, 0x63, 0x45, 0x6f, 0x42, 0x51, 0x71, 0x62, 0x35, \n\t0x79, 0x4a, 0x67, 0x5a, 0x50, 0x4f, 0x5a, 0x4d, 0x34, 0x7a, 0x77, 0x5a, 0x6c, 0x59, 0x45, 0x6f, 0x33, 0x43, \n\t0x2b, 0x50, 0x6a, 0x63, 0x57, 0x52, 0x6d, 0x48, 0x55, 0x72, 0x44, 0x4c, 0x62, 0x6f, 0x4e, 0x71, 0x68, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x66, 0x72, 0x34, 0x59, 0x74, 0x67, 0x75, 0x74, 0x6f, 0x4c, 0x52, 0x4c, 0x76, 0x42, 0x51, 0x33, \n\t0x39, 0x70, 0x4f, 0x59, 0x70, 0x52, 0x2b, 0x74, 0x76, 0x79, 0x6a, 0x58, 0x72, 0x52, 0x71, 0x79, 0x38, 0x68, \n\t0x77, 0x61, 0x6c, 0x6f, 0x59, 0x73, 0x54, 0x67, 0x59, 0x64, 0x59, 0x77, 0x4f, 0x4e, 0x64, 0x50, 0x57, 0x30, \n\t0x53, 0x73, 0x42, 0x6f, 0x38, 0x59, 0x4c, 0x62, 0x39, 0x4e, 0x30, 0x61, 0x45, 0x31, 0x37, 0x43, 0x69, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x72, 0x59, 0x32, 0x43, 0x55, 0x53, 0x68, 0x2f, 0x56, 0x5a, 0x30, 0x59, 0x59, 0x64, 0x59, 0x31, \n\t0x79, 0x6d, 0x75, 0x75, 0x58, 0x42, 0x79, 0x4f, 0x31, 0x46, 0x43, 0x4b, 0x36, 0x5a, 0x6b, 0x34, 0x77, 0x30, \n\t0x73, 0x37, 0x72, 0x56, 0x73, 0x30, 0x6f, 0x41, 0x53, 0x4f, 0x64, 0x4c, 0x6e, 0x78, 0x65, 0x47, 0x71, 0x48, \n\t0x2b, 0x74, 0x4a, 0x43, 0x43, 0x55, 0x65, 0x58, 0x59, 0x74, 0x70, 0x39, 0x46, 0x4c, 0x30, 0x43, 0x34, 0x5c, 0x0a,\n\t0x09, 0x78, 0x7a, 0x75, 0x6a, 0x65, 0x73, 0x6b, 0x6b, 0x49, 0x48, 0x6f, 0x63, 0x4f, 0x46, 0x30, 0x65, 0x4f, \n\t0x74, 0x2b, 0x4f, 0x73, 0x4c, 0x37, 0x46, 0x76, 0x7a, 0x67, 0x68, 0x72, 0x68, 0x56, 0x47, 0x74, 0x4d, 0x44, \n\t0x49, 0x76, 0x6e, 0x69, 0x6f, 0x35, 0x37, 0x6a, 0x69, 0x4d, 0x47, 0x70, 0x63, 0x4f, 0x78, 0x32, 0x4d, 0x57, \n\t0x75, 0x75, 0x31, 0x4c, 0x32, 0x44, 0x55, 0x63, 0x6e, 0x2f, 0x62, 0x59, 0x44, 0x54, 0x75, 0x65, 0x53, 0x5c, 0x0a,\n\t0x09, 0x77, 0x4d, 0x52, 0x6c, 0x72, 0x36, 0x77, 0x4d, 0x68, 0x65, 0x74, 0x31, 0x63, 0x77, 0x55, 0x6e, 0x57, \n\t0x63, 0x4f, 0x34, 0x78, 0x43, 0x34, 0x53, 0x30, 0x77, 0x69, 0x75, 0x59, 0x4a, 0x68, 0x51, 0x6d, 0x4f, 0x79, \n\t0x76, 0x79, 0x4b, 0x76, 0x67, 0x6a, 0x72, 0x72, 0x39, 0x64, 0x7a, 0x69, 0x4b, 0x72, 0x36, 0x46, 0x33, 0x65, \n\t0x44, 0x34, 0x4a, 0x37, 0x7a, 0x61, 0x4b, 0x2b, 0x71, 0x39, 0x67, 0x4c, 0x52, 0x6b, 0x57, 0x39, 0x35, 0x5c, 0x0a,\n\t0x09, 0x59, 0x7a, 0x69, 0x38, 0x50, 0x79, 0x72, 0x51, 0x4c, 0x32, 0x37, 0x74, 0x44, 0x36, 0x4d, 0x79, 0x50, \n\t0x42, 0x75, 0x4d, 0x77, 0x71, 0x6b, 0x56, 0x67, 0x56, 0x45, 0x72, 0x4b, 0x43, 0x61, 0x44, 0x30, 0x57, 0x51, \n\t0x54, 0x48, 0x6d, 0x30, 0x6c, 0x2b, 0x73, 0x41, 0x6f, 0x63, 0x63, 0x31, 0x65, 0x77, 0x4b, 0x69, 0x53, 0x56, \n\t0x59, 0x43, 0x52, 0x54, 0x54, 0x38, 0x4f, 0x52, 0x71, 0x47, 0x38, 0x42, 0x63, 0x46, 0x49, 0x31, 0x32, 0x5c, 0x0a,\n\t0x09, 0x45, 0x76, 0x59, 0x64, 0x51, 0x79, 0x76, 0x42, 0x2f, 0x44, 0x69, 0x50, 0x69, 0x36, 0x49, 0x68, 0x77, \n\t0x72, 0x42, 0x33, 0x62, 0x6c, 0x34, 0x4e, 0x35, 0x46, 0x57, 0x30, 0x65, 0x2b, 0x2f, 0x6e, 0x64, 0x50, 0x55, \n\t0x73, 0x31, 0x4a, 0x52, 0x73, 0x30, 0x41, 0x37, 0x6f, 0x76, 0x4f, 0x46, 0x59, 0x55, 0x76, 0x4d, 0x77, 0x55, \n\t0x6a, 0x6d, 0x6a, 0x42, 0x53, 0x48, 0x58, 0x52, 0x36, 0x47, 0x4f, 0x6d, 0x34, 0x50, 0x59, 0x5a, 0x52, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x79, 0x77, 0x46, 0x52, 0x68, 0x32, 0x61, 0x31, 0x46, 0x53, 0x67, 0x61, 0x4f, 0x59, 0x35, 0x45, \n\t0x59, 0x78, 0x53, 0x2b, 0x56, 0x56, 0x6c, 0x42, 0x2b, 0x6b, 0x44, 0x49, 0x78, 0x74, 0x2f, 0x67, 0x47, 0x46, \n\t0x6b, 0x32, 0x78, 0x43, 0x31, 0x63, 0x59, 0x45, 0x77, 0x67, 0x76, 0x6e, 0x41, 0x4b, 0x43, 0x79, 0x53, 0x72, \n\t0x5a, 0x5a, 0x33, 0x52, 0x44, 0x44, 0x36, 0x35, 0x43, 0x52, 0x56, 0x6e, 0x47, 0x7a, 0x69, 0x67, 0x68, 0x5c, 0x0a,\n\t0x09, 0x67, 0x51, 0x53, 0x55, 0x47, 0x31, 0x41, 0x56, 0x49, 0x44, 0x52, 0x67, 0x46, 0x41, 0x39, 0x71, 0x62, \n\t0x75, 0x59, 0x78, 0x68, 0x31, 0x76, 0x51, 0x79, 0x74, 0x57, 0x73, 0x75, 0x4b, 0x77, 0x32, 0x68, 0x4d, 0x6e, \n\t0x6b, 0x74, 0x64, 0x73, 0x56, 0x2f, 0x46, 0x4c, 0x78, 0x46, 0x47, 0x55, 0x58, 0x6b, 0x64, 0x34, 0x44, 0x77, \n\t0x51, 0x4d, 0x4e, 0x4b, 0x6a, 0x61, 0x51, 0x45, 0x34, 0x78, 0x4e, 0x64, 0x56, 0x4d, 0x42, 0x72, 0x56, 0x5c, 0x0a,\n\t0x09, 0x34, 0x63, 0x72, 0x52, 0x6a, 0x59, 0x62, 0x52, 0x4a, 0x31, 0x76, 0x37, 0x56, 0x55, 0x49, 0x6d, 0x6e, \n\t0x55, 0x46, 0x31, 0x56, 0x2f, 0x77, 0x53, 0x42, 0x65, 0x2f, 0x35, 0x48, 0x47, 0x42, 0x55, 0x70, 0x59, 0x50, \n\t0x6d, 0x69, 0x36, 0x64, 0x6c, 0x50, 0x38, 0x45, 0x6f, 0x41, 0x61, 0x64, 0x6c, 0x77, 0x69, 0x69, 0x56, 0x58, \n\t0x31, 0x53, 0x58, 0x64, 0x4a, 0x37, 0x6e, 0x4e, 0x59, 0x77, 0x61, 0x7a, 0x79, 0x6e, 0x78, 0x2f, 0x76, 0x5c, 0x0a,\n\t0x09, 0x55, 0x75, 0x59, 0x31, 0x56, 0x67, 0x70, 0x46, 0x62, 0x73, 0x74, 0x38, 0x77, 0x31, 0x71, 0x6a, 0x55, \n\t0x6a, 0x43, 0x79, 0x50, 0x6a, 0x77, 0x4b, 0x34, 0x41, 0x70, 0x73, 0x73, 0x70, 0x41, 0x44, 0x34, 0x2b, 0x53, \n\t0x56, 0x30, 0x6e, 0x42, 0x64, 0x48, 0x48, 0x43, 0x58, 0x58, 0x53, 0x68, 0x54, 0x6f, 0x33, 0x4f, 0x34, 0x79, \n\t0x71, 0x66, 0x6d, 0x68, 0x66, 0x4e, 0x42, 0x63, 0x46, 0x34, 0x38, 0x42, 0x2b, 0x67, 0x5a, 0x46, 0x35, 0x5c, 0x0a,\n\t0x09, 0x41, 0x5a, 0x63, 0x46, 0x6f, 0x39, 0x36, 0x67, 0x61, 0x4f, 0x61, 0x35, 0x47, 0x6a, 0x43, 0x79, 0x64, \n\t0x62, 0x48, 0x58, 0x7a, 0x41, 0x6f, 0x6a, 0x32, 0x36, 0x61, 0x44, 0x43, 0x69, 0x4f, 0x6f, 0x59, 0x56, 0x53, \n\t0x62, 0x5a, 0x62, 0x46, 0x32, 0x4a, 0x41, 0x5a, 0x47, 0x4a, 0x6a, 0x35, 0x61, 0x64, 0x35, 0x62, 0x62, 0x64, \n\t0x6f, 0x38, 0x51, 0x50, 0x6a, 0x5a, 0x4a, 0x74, 0x53, 0x62, 0x58, 0x69, 0x4b, 0x6f, 0x47, 0x68, 0x62, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x68, 0x36, 0x35, 0x43, 0x4c, 0x67, 0x56, 0x46, 0x35, 0x4c, 0x2b, 0x59, 0x41, 0x6f, 0x31, 0x58, \n\t0x61, 0x57, 0x43, 0x33, 0x71, 0x67, 0x47, 0x33, 0x6c, 0x72, 0x6d, 0x48, 0x55, 0x70, 0x63, 0x31, 0x46, 0x4d, \n\t0x4c, 0x4a, 0x35, 0x4e, 0x73, 0x72, 0x73, 0x43, 0x36, 0x50, 0x34, 0x4f, 0x55, 0x30, 0x50, 0x49, 0x78, 0x75, \n\t0x65, 0x45, 0x6b, 0x59, 0x74, 0x39, 0x5a, 0x6f, 0x76, 0x6a, 0x48, 0x7a, 0x42, 0x4c, 0x58, 0x4f, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x59, 0x70, 0x2b, 0x52, 0x6d, 0x6b, 0x6b, 0x64, 0x59, 0x43, 0x53, 0x37, 0x39, 0x58, 0x58, 0x31, 0x76, \n\t0x66, 0x30, 0x34, 0x46, 0x48, 0x5a, 0x4d, 0x76, 0x31, 0x4d, 0x6d, 0x42, 0x64, 0x47, 0x6e, 0x4b, 0x50, 0x57, \n\t0x78, 0x75, 0x72, 0x36, 0x46, 0x2b, 0x75, 0x37, 0x31, 0x70, 0x44, 0x41, 0x53, 0x6c, 0x59, 0x35, 0x70, 0x59, \n\t0x41, 0x53, 0x4e, 0x6b, 0x2b, 0x74, 0x64, 0x48, 0x74, 0x50, 0x70, 0x70, 0x34, 0x61, 0x52, 0x43, 0x53, 0x5c, 0x0a,\n\t0x09, 0x34, 0x54, 0x52, 0x75, 0x59, 0x65, 0x72, 0x69, 0x36, 0x4d, 0x55, 0x76, 0x65, 0x78, 0x41, 0x30, 0x61, \n\t0x36, 0x7a, 0x68, 0x70, 0x47, 0x44, 0x51, 0x66, 0x35, 0x58, 0x73, 0x47, 0x6f, 0x54, 0x54, 0x4e, 0x79, 0x52, \n\t0x50, 0x73, 0x59, 0x49, 0x5a, 0x34, 0x33, 0x68, 0x63, 0x33, 0x33, 0x4c, 0x67, 0x53, 0x79, 0x35, 0x2f, 0x62, \n\t0x65, 0x46, 0x32, 0x31, 0x69, 0x45, 0x4f, 0x30, 0x43, 0x6b, 0x54, 0x64, 0x63, 0x69, 0x6a, 0x79, 0x47, 0x5c, 0x0a,\n\t0x09, 0x79, 0x79, 0x51, 0x77, 0x63, 0x6a, 0x51, 0x65, 0x37, 0x73, 0x72, 0x76, 0x38, 0x6a, 0x67, 0x76, 0x47, \n\t0x4e, 0x6d, 0x36, 0x72, 0x43, 0x79, 0x4d, 0x6d, 0x6d, 0x31, 0x63, 0x76, 0x56, 0x30, 0x65, 0x51, 0x38, 0x44, \n\t0x6b, 0x32, 0x53, 0x68, 0x7a, 0x52, 0x57, 0x48, 0x55, 0x4d, 0x4d, 0x74, 0x55, 0x65, 0x43, 0x6b, 0x77, 0x43, \n\t0x70, 0x57, 0x77, 0x4d, 0x41, 0x70, 0x4b, 0x68, 0x31, 0x44, 0x50, 0x4a, 0x77, 0x71, 0x6a, 0x61, 0x78, 0x5c, 0x0a,\n\t0x09, 0x47, 0x4d, 0x50, 0x6a, 0x52, 0x70, 0x56, 0x58, 0x71, 0x44, 0x36, 0x4f, 0x69, 0x33, 0x76, 0x53, 0x6b, \n\t0x63, 0x33, 0x68, 0x56, 0x46, 0x46, 0x48, 0x36, 0x4c, 0x79, 0x4a, 0x6c, 0x67, 0x46, 0x44, 0x2f, 0x4d, 0x6c, \n\t0x64, 0x37, 0x6c, 0x73, 0x58, 0x48, 0x5a, 0x49, 0x6d, 0x44, 0x45, 0x76, 0x6f, 0x58, 0x52, 0x58, 0x6d, 0x38, \n\t0x66, 0x55, 0x74, 0x66, 0x46, 0x6c, 0x75, 0x66, 0x7a, 0x62, 0x4a, 0x51, 0x35, 0x48, 0x59, 0x79, 0x69, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x47, 0x61, 0x42, 0x55, 0x55, 0x4e, 0x57, 0x46, 0x45, 0x61, 0x70, 0x34, 0x58, 0x30, 0x52, 0x59, \n\t0x68, 0x68, 0x4a, 0x66, 0x56, 0x30, 0x4d, 0x6f, 0x7a, 0x76, 0x48, 0x39, 0x68, 0x30, 0x6a, 0x6b, 0x32, 0x70, \n\t0x45, 0x45, 0x42, 0x7a, 0x57, 0x51, 0x59, 0x70, 0x52, 0x44, 0x5a, 0x77, 0x39, 0x67, 0x31, 0x47, 0x55, 0x6c, \n\t0x4c, 0x6a, 0x52, 0x65, 0x77, 0x43, 0x6a, 0x6d, 0x42, 0x45, 0x4c, 0x67, 0x46, 0x47, 0x49, 0x57, 0x78, 0x5c, 0x0a,\n\t0x09, 0x43, 0x4d, 0x64, 0x48, 0x67, 0x47, 0x47, 0x44, 0x56, 0x6c, 0x46, 0x57, 0x47, 0x55, 0x71, 0x47, 0x4d, \n\t0x58, 0x6a, 0x42, 0x72, 0x76, 0x6b, 0x6d, 0x33, 0x54, 0x6a, 0x44, 0x42, 0x61, 0x75, 0x56, 0x30, 0x65, 0x53, \n\t0x63, 0x4d, 0x49, 0x47, 0x6a, 0x41, 0x71, 0x67, 0x78, 0x5a, 0x47, 0x57, 0x68, 0x4d, 0x43, 0x44, 0x36, 0x4d, \n\t0x50, 0x54, 0x46, 0x71, 0x68, 0x61, 0x55, 0x41, 0x55, 0x71, 0x31, 0x30, 0x56, 0x4b, 0x61, 0x45, 0x42, 0x5c, 0x0a,\n\t0x09, 0x49, 0x2f, 0x44, 0x61, 0x6b, 0x6f, 0x39, 0x54, 0x4d, 0x49, 0x71, 0x41, 0x4e, 0x54, 0x47, 0x4d, 0x39, \n\t0x48, 0x6e, 0x73, 0x51, 0x58, 0x79, 0x38, 0x48, 0x32, 0x47, 0x6b, 0x79, 0x7a, 0x54, 0x4c, 0x64, 0x53, 0x61, \n\t0x43, 0x55, 0x56, 0x2f, 0x34, 0x54, 0x41, 0x6d, 0x6a, 0x56, 0x64, 0x72, 0x6c, 0x73, 0x52, 0x46, 0x76, 0x4f, \n\t0x33, 0x57, 0x6a, 0x7a, 0x42, 0x59, 0x59, 0x4e, 0x66, 0x4c, 0x63, 0x4b, 0x78, 0x69, 0x46, 0x75, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x59, 0x79, 0x39, 0x68, 0x4a, 0x47, 0x41, 0x54, 0x34, 0x6b, 0x59, 0x47, 0x51, 0x30, 0x49, 0x65, 0x7a, \n\t0x51, 0x50, 0x65, 0x65, 0x67, 0x2b, 0x4f, 0x69, 0x6b, 0x78, 0x55, 0x38, 0x44, 0x6f, 0x76, 0x63, 0x31, 0x7a, \n\t0x75, 0x53, 0x37, 0x4b, 0x69, 0x73, 0x46, 0x6f, 0x2f, 0x41, 0x33, 0x41, 0x53, 0x4d, 0x4a, 0x61, 0x61, 0x45, \n\t0x54, 0x52, 0x73, 0x42, 0x69, 0x59, 0x64, 0x53, 0x51, 0x46, 0x59, 0x42, 0x52, 0x34, 0x77, 0x57, 0x50, 0x5c, 0x0a,\n\t0x09, 0x47, 0x39, 0x6f, 0x62, 0x52, 0x70, 0x4b, 0x49, 0x33, 0x78, 0x4d, 0x59, 0x6d, 0x57, 0x72, 0x76, 0x45, \n\t0x59, 0x7a, 0x32, 0x39, 0x35, 0x61, 0x7a, 0x69, 0x66, 0x64, 0x39, 0x61, 0x54, 0x44, 0x53, 0x6f, 0x32, 0x4d, \n\t0x59, 0x47, 0x4f, 0x46, 0x68, 0x56, 0x46, 0x43, 0x75, 0x76, 0x6d, 0x38, 0x38, 0x2f, 0x77, 0x38, 0x69, 0x31, \n\t0x65, 0x53, 0x6a, 0x33, 0x6a, 0x49, 0x4e, 0x69, 0x44, 0x34, 0x43, 0x37, 0x45, 0x52, 0x6e, 0x71, 0x70, 0x5c, 0x0a,\n\t0x09, 0x47, 0x36, 0x4c, 0x68, 0x6a, 0x52, 0x44, 0x61, 0x50, 0x71, 0x4f, 0x71, 0x4b, 0x48, 0x4f, 0x62, 0x63, \n\t0x74, 0x5a, 0x33, 0x55, 0x65, 0x6b, 0x62, 0x54, 0x38, 0x71, 0x6b, 0x38, 0x4a, 0x6f, 0x2f, 0x5a, 0x79, 0x51, \n\t0x6c, 0x79, 0x71, 0x55, 0x78, 0x30, 0x30, 0x47, 0x44, 0x6b, 0x56, 0x4e, 0x32, 0x30, 0x5a, 0x65, 0x77, 0x43, \n\t0x6a, 0x4c, 0x6e, 0x4d, 0x32, 0x43, 0x53, 0x4d, 0x66, 0x74, 0x65, 0x6f, 0x77, 0x6d, 0x6b, 0x57, 0x53, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x41, 0x70, 0x61, 0x6b, 0x44, 0x48, 0x54, 0x71, 0x6f, 0x57, 0x78, 0x55, 0x54, 0x76, 0x66, 0x42, \n\t0x35, 0x41, 0x39, 0x37, 0x39, 0x52, 0x45, 0x78, 0x55, 0x35, 0x54, 0x36, 0x31, 0x33, 0x67, 0x77, 0x2f, 0x71, \n\t0x45, 0x46, 0x43, 0x4d, 0x61, 0x4a, 0x6c, 0x63, 0x44, 0x52, 0x70, 0x6c, 0x35, 0x59, 0x41, 0x5a, 0x47, 0x69, \n\t0x39, 0x35, 0x79, 0x74, 0x6e, 0x56, 0x7a, 0x4e, 0x70, 0x74, 0x65, 0x6e, 0x65, 0x73, 0x4c, 0x64, 0x64, 0x5c, 0x0a,\n\t0x09, 0x30, 0x70, 0x47, 0x78, 0x30, 0x67, 0x6c, 0x54, 0x34, 0x46, 0x69, 0x6c, 0x6c, 0x68, 0x31, 0x4b, 0x65, \n\t0x4d, 0x56, 0x44, 0x70, 0x62, 0x68, 0x67, 0x6d, 0x6a, 0x77, 0x73, 0x75, 0x41, 0x55, 0x56, 0x54, 0x58, 0x65, \n\t0x63, 0x50, 0x49, 0x54, 0x51, 0x67, 0x6a, 0x4f, 0x2f, 0x74, 0x61, 0x6e, 0x5a, 0x73, 0x45, 0x52, 0x6c, 0x46, \n\t0x35, 0x66, 0x57, 0x42, 0x6b, 0x77, 0x32, 0x4e, 0x67, 0x4e, 0x49, 0x74, 0x57, 0x42, 0x43, 0x5a, 0x76, 0x5c, 0x0a,\n\t0x09, 0x71, 0x66, 0x2b, 0x61, 0x75, 0x55, 0x61, 0x69, 0x76, 0x34, 0x46, 0x57, 0x6c, 0x2f, 0x2f, 0x2b, 0x61, \n\t0x59, 0x71, 0x63, 0x43, 0x45, 0x52, 0x71, 0x35, 0x43, 0x77, 0x75, 0x4c, 0x4e, 0x38, 0x74, 0x4f, 0x30, 0x2f, \n\t0x6c, 0x48, 0x2b, 0x71, 0x41, 0x55, 0x53, 0x51, 0x70, 0x47, 0x4c, 0x6b, 0x71, 0x71, 0x68, 0x4e, 0x47, 0x4b, \n\t0x6f, 0x2b, 0x39, 0x33, 0x58, 0x4a, 0x32, 0x54, 0x49, 0x64, 0x32, 0x79, 0x34, 0x4a, 0x52, 0x6f, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x36, 0x64, 0x4d, 0x45, 0x71, 0x39, 0x75, 0x46, 0x50, 0x41, 0x53, 0x42, 0x66, 0x58, 0x43, 0x30, 0x59, \n\t0x74, 0x5a, 0x62, 0x61, 0x56, 0x30, 0x62, 0x6a, 0x75, 0x41, 0x4d, 0x43, 0x6f, 0x63, 0x37, 0x54, 0x4f, 0x70, \n\t0x42, 0x64, 0x54, 0x35, 0x31, 0x34, 0x77, 0x6d, 0x74, 0x46, 0x45, 0x71, 0x2b, 0x6f, 0x59, 0x2f, 0x44, 0x38, \n\t0x70, 0x47, 0x41, 0x58, 0x4e, 0x53, 0x47, 0x74, 0x51, 0x44, 0x6c, 0x4b, 0x75, 0x6d, 0x78, 0x34, 0x79, 0x5c, 0x0a,\n\t0x09, 0x75, 0x55, 0x5a, 0x55, 0x33, 0x76, 0x32, 0x34, 0x73, 0x4d, 0x4c, 0x76, 0x34, 0x4a, 0x61, 0x45, 0x45, \n\t0x53, 0x30, 0x77, 0x69, 0x75, 0x4d, 0x6e, 0x68, 0x70, 0x47, 0x4c, 0x48, 0x38, 0x4a, 0x36, 0x6c, 0x38, 0x65, \n\t0x57, 0x65, 0x69, 0x30, 0x61, 0x52, 0x71, 0x5a, 0x54, 0x6e, 0x5a, 0x2b, 0x37, 0x50, 0x4f, 0x71, 0x30, 0x69, \n\t0x54, 0x71, 0x6c, 0x77, 0x76, 0x73, 0x64, 0x52, 0x6b, 0x6f, 0x37, 0x55, 0x6a, 0x41, 0x61, 0x67, 0x56, 0x5c, 0x0a,\n\t0x09, 0x75, 0x38, 0x52, 0x6c, 0x52, 0x58, 0x55, 0x42, 0x49, 0x4f, 0x36, 0x78, 0x30, 0x63, 0x57, 0x51, 0x4a, \n\t0x47, 0x35, 0x6b, 0x59, 0x31, 0x59, 0x46, 0x51, 0x44, 0x59, 0x6d, 0x56, 0x68, 0x31, 0x44, 0x45, 0x36, 0x31, \n\t0x45, 0x78, 0x62, 0x52, 0x36, 0x38, 0x4d, 0x6a, 0x42, 0x72, 0x31, 0x47, 0x77, 0x63, 0x6a, 0x47, 0x7a, 0x34, \n\t0x50, 0x59, 0x64, 0x51, 0x31, 0x73, 0x47, 0x43, 0x75, 0x58, 0x39, 0x34, 0x75, 0x6a, 0x36, 0x6c, 0x38, 0x5c, 0x0a,\n\t0x09, 0x35, 0x67, 0x77, 0x6a, 0x49, 0x41, 0x6b, 0x6a, 0x49, 0x2f, 0x34, 0x2b, 0x76, 0x31, 0x2b, 0x6b, 0x4f, \n\t0x44, 0x66, 0x32, 0x48, 0x55, 0x7a, 0x49, 0x74, 0x4a, 0x36, 0x74, 0x44, 0x32, 0x43, 0x33, 0x67, 0x66, 0x54, \n\t0x66, 0x4e, 0x57, 0x71, 0x46, 0x6b, 0x66, 0x59, 0x68, 0x74, 0x63, 0x45, 0x49, 0x5a, 0x6f, 0x51, 0x52, 0x35, \n\t0x7a, 0x57, 0x4d, 0x57, 0x75, 0x76, 0x56, 0x65, 0x4f, 0x46, 0x74, 0x6d, 0x6c, 0x54, 0x35, 0x4f, 0x74, 0x5c, 0x0a,\n\t0x09, 0x78, 0x53, 0x78, 0x74, 0x78, 0x68, 0x5a, 0x47, 0x55, 0x4d, 0x6a, 0x46, 0x4c, 0x70, 0x6f, 0x2f, 0x71, \n\t0x63, 0x44, 0x7a, 0x43, 0x79, 0x69, 0x32, 0x52, 0x74, 0x47, 0x66, 0x4d, 0x63, 0x53, 0x61, 0x73, 0x4b, 0x4a, \n\t0x5a, 0x57, 0x70, 0x69, 0x48, 0x73, 0x58, 0x51, 0x48, 0x62, 0x48, 0x45, 0x78, 0x4d, 0x58, 0x4d, 0x79, 0x32, \n\t0x49, 0x54, 0x67, 0x45, 0x66, 0x69, 0x2f, 0x54, 0x53, 0x66, 0x4b, 0x66, 0x71, 0x4d, 0x43, 0x36, 0x41, 0x5c, 0x0a,\n\t0x09, 0x70, 0x42, 0x56, 0x47, 0x31, 0x44, 0x42, 0x79, 0x4e, 0x4f, 0x4c, 0x48, 0x77, 0x34, 0x67, 0x57, 0x47, \n\t0x4e, 0x6b, 0x58, 0x44, 0x2f, 0x56, 0x4d, 0x45, 0x74, 0x42, 0x59, 0x4a, 0x52, 0x67, 0x31, 0x72, 0x70, 0x30, \n\t0x63, 0x52, 0x70, 0x50, 0x76, 0x38, 0x72, 0x68, 0x71, 0x4d, 0x42, 0x70, 0x33, 0x66, 0x38, 0x65, 0x4e, 0x70, \n\t0x4e, 0x6b, 0x38, 0x46, 0x77, 0x55, 0x6a, 0x4c, 0x58, 0x31, 0x67, 0x5a, 0x4b, 0x2f, 0x62, 0x43, 0x78, 0x5c, 0x0a,\n\t0x09, 0x68, 0x6c, 0x38, 0x66, 0x48, 0x63, 0x59, 0x5a, 0x54, 0x4d, 0x38, 0x46, 0x33, 0x54, 0x61, 0x45, 0x4d, \n\t0x77, 0x42, 0x59, 0x69, 0x4f, 0x66, 0x76, 0x75, 0x62, 0x77, 0x2b, 0x48, 0x62, 0x79, 0x6a, 0x70, 0x35, 0x4f, \n\t0x33, 0x47, 0x30, 0x44, 0x53, 0x36, 0x72, 0x34, 0x4f, 0x47, 0x30, 0x35, 0x74, 0x47, 0x41, 0x6b, 0x64, 0x5a, \n\t0x4b, 0x75, 0x6d, 0x41, 0x45, 0x61, 0x52, 0x68, 0x35, 0x34, 0x45, 0x30, 0x4e, 0x49, 0x77, 0x50, 0x45, 0x5c, 0x0a,\n\t0x09, 0x76, 0x59, 0x52, 0x52, 0x6d, 0x37, 0x53, 0x43, 0x59, 0x74, 0x45, 0x77, 0x61, 0x6b, 0x6b, 0x2f, 0x6c, \n\t0x64, 0x62, 0x53, 0x4c, 0x47, 0x4d, 0x75, 0x4d, 0x4c, 0x49, 0x64, 0x62, 0x4f, 0x6b, 0x77, 0x73, 0x75, 0x6e, \n\t0x48, 0x77, 0x53, 0x69, 0x55, 0x74, 0x79, 0x41, 0x59, 0x36, 0x54, 0x72, 0x73, 0x6d, 0x57, 0x61, 0x55, 0x6c, \n\t0x48, 0x64, 0x4f, 0x6d, 0x2f, 0x30, 0x73, 0x6b, 0x77, 0x37, 0x65, 0x58, 0x68, 0x32, 0x4a, 0x6c, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x5a, 0x6b, 0x63, 0x63, 0x77, 0x63, 0x6a, 0x37, 0x37, 0x71, 0x57, 0x46, 0x6b, 0x59, 0x55, 0x61, \n\t0x63, 0x6a, 0x6e, 0x30, 0x49, 0x6f, 0x37, 0x34, 0x6d, 0x6d, 0x72, 0x35, 0x32, 0x6f, 0x54, 0x42, 0x71, 0x42, \n\t0x30, 0x55, 0x61, 0x52, 0x6a, 0x33, 0x61, 0x50, 0x67, 0x75, 0x4d, 0x55, 0x76, 0x6c, 0x56, 0x5a, 0x51, 0x66, \n\t0x70, 0x41, 0x79, 0x4d, 0x62, 0x76, 0x34, 0x6f, 0x77, 0x53, 0x74, 0x57, 0x7a, 0x71, 0x34, 0x77, 0x57, 0x5c, 0x0a,\n\t0x09, 0x47, 0x4e, 0x6b, 0x32, 0x52, 0x47, 0x33, 0x63, 0x4d, 0x78, 0x67, 0x39, 0x44, 0x70, 0x50, 0x74, 0x51, \n\t0x61, 0x52, 0x6c, 0x53, 0x6d, 0x63, 0x31, 0x41, 0x48, 0x38, 0x63, 0x6e, 0x78, 0x4d, 0x6b, 0x50, 0x31, 0x63, \n\t0x65, 0x4c, 0x78, 0x70, 0x47, 0x71, 0x48, 0x51, 0x6f, 0x47, 0x46, 0x58, 0x70, 0x6f, 0x50, 0x6e, 0x69, 0x36, \n\t0x63, 0x76, 0x33, 0x45, 0x34, 0x77, 0x53, 0x63, 0x46, 0x6f, 0x6d, 0x6a, 0x46, 0x4c, 0x35, 0x52, 0x58, 0x5c, 0x0a,\n\t0x09, 0x56, 0x4a, 0x35, 0x37, 0x6e, 0x30, 0x76, 0x59, 0x79, 0x57, 0x44, 0x61, 0x4f, 0x6f, 0x76, 0x4d, 0x54, \n\t0x37, 0x31, 0x37, 0x75, 0x4d, 0x6c, 0x59, 0x58, 0x52, 0x32, 0x31, 0x49, 0x6e, 0x2b, 0x38, 0x72, 0x30, 0x47, \n\t0x70, 0x46, 0x77, 0x46, 0x78, 0x42, 0x76, 0x4f, 0x4c, 0x4b, 0x37, 0x58, 0x58, 0x65, 0x53, 0x5a, 0x63, 0x43, \n\t0x6f, 0x36, 0x6f, 0x66, 0x32, 0x52, 0x65, 0x75, 0x43, 0x78, 0x6e, 0x36, 0x42, 0x6b, 0x58, 0x6b, 0x42, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x77, 0x57, 0x6a, 0x33, 0x71, 0x42, 0x6f, 0x35, 0x72, 0x6b, 0x61, 0x4d, 0x4c, 0x4a, 0x31, 0x73, \n\t0x64, 0x66, 0x4d, 0x43, 0x69, 0x50, 0x62, 0x70, 0x6b, 0x6b, 0x6e, 0x50, 0x45, 0x35, 0x57, 0x78, 0x67, 0x72, \n\t0x42, 0x36, 0x49, 0x38, 0x41, 0x42, 0x6c, 0x38, 0x30, 0x32, 0x59, 0x78, 0x71, 0x56, 0x61, 0x4f, 0x70, 0x70, \n\t0x55, 0x42, 0x34, 0x68, 0x7a, 0x34, 0x68, 0x6f, 0x37, 0x4e, 0x6f, 0x67, 0x48, 0x54, 0x44, 0x43, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x56, 0x32, 0x73, 0x54, 0x41, 0x53, 0x71, 0x47, 0x39, 0x65, 0x39, 0x49, 0x7a, 0x33, 0x4f, 0x59, 0x77, \n\t0x61, 0x78, 0x38, 0x32, 0x4f, 0x75, 0x49, 0x5a, 0x52, 0x65, 0x36, 0x64, 0x65, 0x33, 0x59, 0x33, 0x56, 0x53, \n\t0x4e, 0x7a, 0x48, 0x4b, 0x57, 0x48, 0x55, 0x55, 0x71, 0x38, 0x46, 0x77, 0x4f, 0x69, 0x50, 0x5a, 0x73, 0x68, \n\t0x74, 0x4f, 0x68, 0x41, 0x64, 0x2f, 0x51, 0x37, 0x6a, 0x73, 0x41, 0x34, 0x79, 0x32, 0x76, 0x46, 0x33, 0x5c, 0x0a,\n\t0x09, 0x58, 0x73, 0x4f, 0x6f, 0x68, 0x6b, 0x30, 0x4d, 0x49, 0x30, 0x58, 0x74, 0x57, 0x57, 0x42, 0x6b, 0x6e, \n\t0x4c, 0x6f, 0x4c, 0x33, 0x65, 0x55, 0x78, 0x79, 0x6c, 0x50, 0x4a, 0x73, 0x6d, 0x43, 0x55, 0x42, 0x4a, 0x4d, \n\t0x6a, 0x70, 0x73, 0x38, 0x71, 0x77, 0x4d, 0x67, 0x45, 0x6c, 0x77, 0x32, 0x6a, 0x71, 0x4c, 0x78, 0x56, 0x68, \n\t0x56, 0x48, 0x71, 0x50, 0x6b, 0x34, 0x42, 0x6f, 0x39, 0x59, 0x35, 0x52, 0x69, 0x47, 0x65, 0x36, 0x61, 0x5c, 0x0a,\n\t0x09, 0x57, 0x47, 0x30, 0x53, 0x37, 0x77, 0x72, 0x68, 0x6c, 0x79, 0x6d, 0x6e, 0x57, 0x46, 0x48, 0x47, 0x2b, \n\t0x50, 0x47, 0x79, 0x4a, 0x49, 0x76, 0x6b, 0x30, 0x4d, 0x45, 0x50, 0x2f, 0x58, 0x67, 0x36, 0x55, 0x42, 0x49, \n\t0x38, 0x64, 0x73, 0x4d, 0x48, 0x49, 0x30, 0x48, 0x75, 0x35, 0x79, 0x64, 0x6e, 0x6c, 0x63, 0x45, 0x6f, 0x78, \n\t0x30, 0x58, 0x56, 0x59, 0x57, 0x52, 0x73, 0x30, 0x32, 0x72, 0x6e, 0x64, 0x35, 0x56, 0x48, 0x57, 0x61, 0x5c, 0x0a,\n\t0x09, 0x46, 0x34, 0x78, 0x30, 0x6e, 0x66, 0x63, 0x57, 0x52, 0x75, 0x39, 0x42, 0x69, 0x6e, 0x4d, 0x7a, 0x35, \n\t0x44, 0x49, 0x7a, 0x69, 0x4e, 0x34, 0x42, 0x35, 0x46, 0x46, 0x44, 0x64, 0x73, 0x38, 0x71, 0x71, 0x4e, 0x53, \n\t0x6d, 0x57, 0x57, 0x6d, 0x6d, 0x77, 0x65, 0x4a, 0x67, 0x46, 0x44, 0x2f, 0x4d, 0x6c, 0x64, 0x39, 0x79, 0x56, \n\t0x6b, 0x57, 0x76, 0x64, 0x33, 0x6d, 0x4d, 0x38, 0x31, 0x69, 0x74, 0x6a, 0x64, 0x58, 0x6d, 0x42, 0x36, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x6f, 0x76, 0x31, 0x6c, 0x67, 0x31, 0x42, 0x42, 0x62, 0x37, 0x7a, 0x32, 0x48, 0x30, 0x52, 0x2f, \n\t0x43, 0x39, 0x50, 0x34, 0x68, 0x58, 0x34, 0x4f, 0x5a, 0x35, 0x44, 0x54, 0x77, 0x4a, 0x32, 0x56, 0x6c, 0x2f, \n\t0x4a, 0x6c, 0x64, 0x37, 0x79, 0x66, 0x53, 0x52, 0x53, 0x52, 0x67, 0x46, 0x4a, 0x6c, 0x75, 0x32, 0x50, 0x50, \n\t0x37, 0x46, 0x55, 0x5a, 0x74, 0x4c, 0x38, 0x30, 0x59, 0x61, 0x43, 0x30, 0x45, 0x52, 0x69, 0x46, 0x75, 0x5c, 0x0a,\n\t0x09, 0x51, 0x54, 0x44, 0x53, 0x34, 0x52, 0x6c, 0x67, 0x31, 0x4a, 0x53, 0x44, 0x43, 0x36, 0x4d, 0x44, 0x76, \n\t0x4d, 0x76, 0x6a, 0x6d, 0x38, 0x62, 0x2b, 0x34, 0x49, 0x36, 0x52, 0x71, 0x55, 0x47, 0x6b, 0x2f, 0x45, 0x52, \n\t0x76, 0x72, 0x45, 0x34, 0x4b, 0x79, 0x4f, 0x37, 0x5a, 0x38, 0x74, 0x6a, 0x70, 0x72, 0x4a, 0x73, 0x77, 0x71, \n\t0x70, 0x61, 0x43, 0x51, 0x41, 0x32, 0x6a, 0x4d, 0x70, 0x43, 0x41, 0x6b, 0x55, 0x76, 0x43, 0x4b, 0x45, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x7a, 0x46, 0x59, 0x7a, 0x69, 0x62, 0x4e, 0x59, 0x77, 0x61, 0x69, 0x73, 0x6a, 0x6b, 0x58, 0x35, \n\t0x71, 0x55, 0x4d, 0x54, 0x68, 0x2f, 0x62, 0x48, 0x4c, 0x59, 0x30, 0x72, 0x47, 0x77, 0x4b, 0x6a, 0x78, 0x4c, \n\t0x68, 0x31, 0x59, 0x47, 0x4f, 0x58, 0x4d, 0x36, 0x4b, 0x6a, 0x32, 0x4a, 0x63, 0x38, 0x67, 0x5a, 0x61, 0x58, \n\t0x66, 0x46, 0x4a, 0x38, 0x54, 0x47, 0x4a, 0x30, 0x72, 0x4f, 0x38, 0x57, 0x38, 0x59, 0x42, 0x51, 0x65, 0x5c, 0x0a,\n\t0x09, 0x75, 0x6f, 0x47, 0x52, 0x68, 0x4c, 0x6a, 0x71, 0x2b, 0x6a, 0x53, 0x4d, 0x56, 0x46, 0x30, 0x4e, 0x6a, \n\t0x44, 0x53, 0x6b, 0x61, 0x46, 0x37, 0x54, 0x46, 0x30, 0x59, 0x4e, 0x57, 0x52, 0x45, 0x59, 0x36, 0x54, 0x4c, \n\t0x58, 0x57, 0x38, 0x34, 0x6d, 0x38, 0x36, 0x2f, 0x6a, 0x51, 0x6e, 0x6e, 0x6d, 0x33, 0x62, 0x47, 0x64, 0x75, \n\t0x69, 0x30, 0x50, 0x57, 0x30, 0x5a, 0x79, 0x59, 0x47, 0x45, 0x76, 0x59, 0x42, 0x54, 0x69, 0x32, 0x73, 0x5c, 0x0a,\n\t0x09, 0x71, 0x59, 0x4f, 0x34, 0x7a, 0x65, 0x54, 0x57, 0x6b, 0x5a, 0x7a, 0x53, 0x53, 0x7a, 0x6d, 0x6d, 0x59, \n\t0x67, 0x76, 0x41, 0x33, 0x59, 0x6a, 0x6b, 0x37, 0x74, 0x50, 0x45, 0x6b, 0x31, 0x64, 0x42, 0x2f, 0x42, 0x53, \n\t0x41, 0x45, 0x6d, 0x42, 0x61, 0x4f, 0x6f, 0x53, 0x6a, 0x71, 0x74, 0x2f, 0x79, 0x74, 0x30, 0x77, 0x36, 0x69, \n\t0x36, 0x6a, 0x75, 0x68, 0x68, 0x37, 0x72, 0x64, 0x64, 0x48, 0x69, 0x65, 0x47, 0x6b, 0x58, 0x36, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x49, 0x77, 0x61, 0x4c, 0x33, 0x6a, 0x63, 0x30, 0x4e, 0x58, 0x65, 0x35, 0x56, 0x48, 0x48, 0x54, \n\t0x56, 0x76, 0x47, 0x48, 0x73, 0x44, 0x49, 0x77, 0x6d, 0x44, 0x70, 0x4d, 0x45, 0x72, 0x38, 0x2b, 0x45, 0x34, \n\t0x44, 0x6f, 0x2f, 0x37, 0x79, 0x46, 0x6f, 0x44, 0x42, 0x38, 0x32, 0x64, 0x6a, 0x30, 0x65, 0x77, 0x67, 0x67, \n\t0x6e, 0x4e, 0x49, 0x50, 0x4d, 0x74, 0x61, 0x64, 0x70, 0x36, 0x6b, 0x68, 0x6f, 0x32, 0x47, 0x6b, 0x64, 0x5c, 0x0a,\n\t0x09, 0x46, 0x79, 0x4c, 0x49, 0x79, 0x73, 0x79, 0x64, 0x57, 0x41, 0x55, 0x57, 0x59, 0x65, 0x6d, 0x49, 0x46, \n\t0x52, 0x4e, 0x4d, 0x4f, 0x61, 0x79, 0x57, 0x43, 0x6b, 0x72, 0x34, 0x73, 0x50, 0x36, 0x75, 0x4e, 0x47, 0x42, \n\t0x36, 0x65, 0x5a, 0x78, 0x70, 0x36, 0x62, 0x45, 0x6b, 0x62, 0x74, 0x35, 0x59, 0x53, 0x34, 0x46, 0x43, 0x6a, \n\t0x32, 0x47, 0x6b, 0x61, 0x32, 0x6e, 0x76, 0x4f, 0x47, 0x6b, 0x56, 0x4e, 0x78, 0x30, 0x35, 0x62, 0x52, 0x5c, 0x0a,\n\t0x09, 0x41, 0x51, 0x70, 0x37, 0x2f, 0x64, 0x51, 0x77, 0x36, 0x72, 0x70, 0x76, 0x4b, 0x52, 0x6a, 0x35, 0x71, \n\t0x46, 0x57, 0x47, 0x55, 0x58, 0x2b, 0x74, 0x36, 0x45, 0x33, 0x6a, 0x6b, 0x34, 0x79, 0x58, 0x6d, 0x55, 0x42, \n\t0x30, 0x39, 0x46, 0x57, 0x56, 0x6e, 0x2b, 0x6a, 0x4e, 0x55, 0x63, 0x56, 0x33, 0x7a, 0x31, 0x46, 0x39, 0x65, \n\t0x43, 0x30, 0x46, 0x49, 0x33, 0x76, 0x63, 0x67, 0x4a, 0x45, 0x46, 0x6c, 0x6f, 0x46, 0x52, 0x4a, 0x57, 0x5c, 0x0a,\n\t0x09, 0x30, 0x77, 0x63, 0x6e, 0x56, 0x30, 0x58, 0x78, 0x6a, 0x70, 0x68, 0x39, 0x49, 0x48, 0x52, 0x6b, 0x6d, \n\t0x5a, 0x42, 0x45, 0x59, 0x4a, 0x30, 0x5a, 0x32, 0x79, 0x30, 0x51, 0x46, 0x53, 0x36, 0x52, 0x63, 0x42, 0x6f, \n\t0x7a, 0x35, 0x6c, 0x6d, 0x50, 0x79, 0x53, 0x5a, 0x53, 0x54, 0x53, 0x68, 0x50, 0x42, 0x65, 0x77, 0x38, 0x69, \n\t0x32, 0x62, 0x2b, 0x34, 0x77, 0x63, 0x68, 0x50, 0x43, 0x53, 0x45, 0x2b, 0x71, 0x4e, 0x4f, 0x63, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x67, 0x56, 0x46, 0x55, 0x58, 0x68, 0x38, 0x59, 0x32, 0x58, 0x41, 0x58, 0x6a, 0x48, 0x71, 0x5a, 0x61, \n\t0x4c, 0x76, 0x4d, 0x77, 0x54, 0x2f, 0x6b, 0x53, 0x35, 0x75, 0x4c, 0x2f, 0x4b, 0x38, 0x34, 0x4b, 0x4c, 0x42, \n\t0x7a, 0x70, 0x6f, 0x52, 0x4d, 0x65, 0x48, 0x6b, 0x58, 0x42, 0x71, 0x4d, 0x36, 0x66, 0x69, 0x6f, 0x59, 0x71, \n\t0x54, 0x77, 0x57, 0x75, 0x73, 0x74, 0x6a, 0x6f, 0x72, 0x79, 0x6b, 0x4b, 0x45, 0x61, 0x73, 0x7a, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x71, 0x65, 0x77, 0x45, 0x6a, 0x58, 0x56, 0x77, 0x76, 0x47, 0x4c, 0x57, 0x55, 0x6d, 0x53, 0x77, \n\t0x6a, 0x30, 0x61, 0x6e, 0x32, 0x41, 0x6b, 0x61, 0x4e, 0x38, 0x73, 0x62, 0x42, 0x4b, 0x4a, 0x78, 0x49, 0x31, \n\t0x43, 0x6b, 0x56, 0x37, 0x68, 0x79, 0x74, 0x4d, 0x2b, 0x6b, 0x6c, 0x4c, 0x6e, 0x4e, 0x4f, 0x4d, 0x48, 0x6f, \n\t0x37, 0x63, 0x4b, 0x59, 0x7a, 0x52, 0x55, 0x2b, 0x5a, 0x46, 0x34, 0x6a, 0x65, 0x44, 0x5a, 0x79, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x66, 0x74, 0x6c, 0x32, 0x54, 0x69, 0x76, 0x34, 0x4b, 0x49, 0x69, 0x30, 0x77, 0x61, 0x67, 0x6b, 0x55, \n\t0x51, 0x65, 0x4d, 0x61, 0x49, 0x46, 0x52, 0x48, 0x44, 0x38, 0x78, 0x6a, 0x46, 0x7a, 0x38, 0x45, 0x4e, 0x5a, \n\t0x62, 0x7a, 0x6e, 0x62, 0x55, 0x71, 0x31, 0x46, 0x47, 0x49, 0x76, 0x31, 0x55, 0x6f, 0x4b, 0x44, 0x52, 0x71, \n\t0x64, 0x61, 0x37, 0x50, 0x4c, 0x62, 0x6b, 0x75, 0x52, 0x41, 0x59, 0x32, 0x58, 0x78, 0x36, 0x77, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x33, 0x59, 0x58, 0x62, 0x2f, 0x6b, 0x4b, 0x6e, 0x56, 0x54, 0x44, 0x49, 0x69, 0x32, 0x49, 0x71, \n\t0x2b, 0x30, 0x72, 0x4a, 0x39, 0x69, 0x74, 0x67, 0x73, 0x71, 0x32, 0x47, 0x54, 0x68, 0x46, 0x47, 0x56, 0x70, \n\t0x67, 0x31, 0x47, 0x35, 0x6b, 0x59, 0x31, 0x59, 0x4b, 0x52, 0x65, 0x31, 0x43, 0x6a, 0x4e, 0x70, 0x44, 0x42, \n\t0x69, 0x63, 0x54, 0x44, 0x71, 0x47, 0x42, 0x31, 0x71, 0x70, 0x71, 0x32, 0x6a, 0x56, 0x77, 0x4a, 0x47, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x52, 0x66, 0x65, 0x70, 0x6b, 0x6d, 0x56, 0x72, 0x38, 0x4f, 0x4a, 0x50, 0x42, 0x63, 0x43, 0x49, \n\t0x79, 0x74, 0x6a, 0x59, 0x4a, 0x52, 0x4b, 0x48, 0x39, 0x58, 0x6e, 0x66, 0x49, 0x42, 0x52, 0x4d, 0x41, 0x73, \n\t0x6e, 0x68, 0x74, 0x48, 0x76, 0x4a, 0x38, 0x39, 0x4f, 0x49, 0x54, 0x4f, 0x44, 0x53, 0x50, 0x6d, 0x4a, 0x58, \n\t0x6c, 0x75, 0x64, 0x46, 0x4d, 0x6f, 0x64, 0x47, 0x2f, 0x56, 0x6d, 0x61, 0x52, 0x56, 0x6f, 0x2f, 0x41, 0x5c, 0x0a,\n\t0x09, 0x52, 0x46, 0x37, 0x5a, 0x6a, 0x57, 0x4d, 0x48, 0x49, 0x42, 0x52, 0x69, 0x34, 0x4e, 0x6f, 0x38, 0x67, \n\t0x68, 0x6e, 0x59, 0x42, 0x52, 0x4e, 0x65, 0x45, 0x52, 0x46, 0x55, 0x37, 0x42, 0x69, 0x42, 0x59, 0x59, 0x32, \n\t0x52, 0x63, 0x50, 0x39, 0x52, 0x78, 0x58, 0x48, 0x45, 0x61, 0x4e, 0x61, 0x36, 0x65, 0x44, 0x55, 0x57, 0x75, \n\t0x39, 0x39, 0x67, 0x57, 0x4d, 0x57, 0x75, 0x35, 0x76, 0x47, 0x34, 0x7a, 0x47, 0x50, 0x59, 0x2b, 0x46, 0x5c, 0x0a,\n\t0x09, 0x77, 0x55, 0x68, 0x4c, 0x48, 0x78, 0x6a, 0x5a, 0x36, 0x2f, 0x59, 0x4b, 0x52, 0x71, 0x71, 0x4f, 0x38, \n\t0x62, 0x74, 0x33, 0x45, 0x6e, 0x67, 0x76, 0x63, 0x35, 0x4a, 0x35, 0x61, 0x55, 0x51, 0x41, 0x72, 0x34, 0x39, \n\t0x43, 0x55, 0x6d, 0x70, 0x46, 0x4c, 0x6f, 0x43, 0x6d, 0x41, 0x53, 0x4d, 0x4e, 0x6c, 0x52, 0x53, 0x4d, 0x4a, \n\t0x74, 0x6a, 0x6c, 0x55, 0x63, 0x2f, 0x4d, 0x62, 0x73, 0x41, 0x49, 0x30, 0x6a, 0x44, 0x79, 0x77, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x73, 0x4a, 0x52, 0x69, 0x72, 0x2f, 0x56, 0x59, 0x42, 0x52, 0x4b, 0x79, 0x67, 0x6d, 0x67, 0x39, 0x47, \n\t0x42, 0x33, 0x4f, 0x57, 0x78, 0x71, 0x31, 0x4d, 0x74, 0x42, 0x55, 0x59, 0x32, 0x2f, 0x54, 0x67, 0x59, 0x68, \n\t0x66, 0x49, 0x57, 0x42, 0x43, 0x4e, 0x64, 0x68, 0x33, 0x34, 0x77, 0x65, 0x69, 0x50, 0x31, 0x64, 0x36, 0x64, \n\t0x6e, 0x6c, 0x6e, 0x6d, 0x43, 0x36, 0x44, 0x50, 0x41, 0x42, 0x36, 0x49, 0x7a, 0x35, 0x35, 0x34, 0x41, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x33, 0x6d, 0x67, 0x75, 0x44, 0x45, 0x77, 0x49, 0x67, 0x32, 0x6a, 0x39, 0x53, 0x36, 0x50, 0x61, \n\t0x52, 0x69, 0x31, 0x79, 0x56, 0x4a, 0x67, 0x31, 0x41, 0x36, 0x4b, 0x4e, 0x49, 0x78, 0x36, 0x74, 0x48, 0x30, \n\t0x57, 0x47, 0x4b, 0x58, 0x79, 0x71, 0x38, 0x6f, 0x4f, 0x30, 0x67, 0x64, 0x47, 0x4e, 0x76, 0x34, 0x41, 0x77, \n\t0x38, 0x69, 0x32, 0x49, 0x57, 0x70, 0x6a, 0x45, 0x6b, 0x61, 0x2f, 0x6a, 0x38, 0x7a, 0x48, 0x50, 0x36, 0x5c, 0x0a,\n\t0x09, 0x52, 0x4b, 0x6e, 0x55, 0x32, 0x53, 0x35, 0x68, 0x6b, 0x67, 0x32, 0x36, 0x64, 0x42, 0x69, 0x68, 0x4a, \n\t0x47, 0x41, 0x55, 0x43, 0x74, 0x4d, 0x41, 0x71, 0x51, 0x32, 0x43, 0x4d, 0x59, 0x6f, 0x64, 0x4b, 0x78, 0x44, \n\t0x32, 0x48, 0x55, 0x31, 0x31, 0x2b, 0x6b, 0x72, 0x39, 0x58, 0x68, 0x56, 0x59, 0x54, 0x52, 0x6d, 0x44, 0x79, \n\t0x58, 0x76, 0x6e, 0x33, 0x49, 0x73, 0x6d, 0x45, 0x55, 0x6c, 0x64, 0x63, 0x42, 0x7a, 0x72, 0x32, 0x42, 0x5c, 0x0a,\n\t0x09, 0x55, 0x57, 0x77, 0x42, 0x7a, 0x53, 0x6a, 0x7a, 0x31, 0x49, 0x67, 0x41, 0x66, 0x69, 0x63, 0x4f, 0x53, \n\t0x75, 0x6d, 0x30, 0x39, 0x71, 0x5a, 0x58, 0x66, 0x78, 0x67, 0x70, 0x4b, 0x43, 0x30, 0x44, 0x52, 0x72, 0x6f, \n\t0x4f, 0x4b, 0x52, 0x68, 0x46, 0x31, 0x2b, 0x71, 0x2f, 0x6f, 0x51, 0x37, 0x70, 0x6d, 0x37, 0x4e, 0x63, 0x47, \n\t0x4a, 0x6c, 0x32, 0x4c, 0x78, 0x74, 0x47, 0x71, 0x66, 0x79, 0x69, 0x75, 0x71, 0x54, 0x7a, 0x50, 0x44, 0x5c, 0x0a,\n\t0x09, 0x39, 0x67, 0x5a, 0x4e, 0x73, 0x30, 0x36, 0x52, 0x79, 0x6a, 0x79, 0x63, 0x71, 0x59, 0x41, 0x6b, 0x59, \n\t0x66, 0x41, 0x48, 0x64, 0x2f, 0x73, 0x39, 0x44, 0x70, 0x5a, 0x64, 0x34, 0x67, 0x65, 0x69, 0x66, 0x77, 0x71, \n\t0x44, 0x34, 0x68, 0x33, 0x6a, 0x78, 0x4c, 0x77, 0x79, 0x67, 0x30, 0x4c, 0x6a, 0x46, 0x4b, 0x31, 0x67, 0x74, \n\t0x47, 0x71, 0x4c, 0x52, 0x7a, 0x68, 0x46, 0x48, 0x56, 0x44, 0x2b, 0x32, 0x4c, 0x35, 0x71, 0x4a, 0x67, 0x5c, 0x0a,\n\t0x09, 0x48, 0x46, 0x6a, 0x44, 0x4b, 0x42, 0x6c, 0x75, 0x67, 0x31, 0x46, 0x76, 0x55, 0x44, 0x54, 0x7a, 0x58, \n\t0x41, 0x30, 0x59, 0x32, 0x62, 0x72, 0x59, 0x61, 0x32, 0x61, 0x42, 0x55, 0x66, 0x79, 0x63, 0x6c, 0x67, 0x36, \n\t0x6a, 0x5a, 0x72, 0x31, 0x65, 0x42, 0x34, 0x37, 0x42, 0x43, 0x2b, 0x5a, 0x6a, 0x6c, 0x71, 0x56, 0x4b, 0x6d, \n\t0x6c, 0x56, 0x79, 0x6a, 0x4e, 0x4e, 0x61, 0x7a, 0x70, 0x36, 0x4d, 0x4e, 0x61, 0x41, 0x49, 0x52, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x56, 0x6b, 0x75, 0x6d, 0x46, 0x55, 0x6e, 0x31, 0x2f, 0x4e, 0x58, 0x52, 0x34, 0x6e, 0x68, 0x4a, 0x47, \n\t0x5a, 0x4c, 0x6c, 0x43, 0x31, 0x6f, 0x5a, 0x6b, 0x77, 0x66, 0x66, 0x32, 0x38, 0x59, 0x64, 0x51, 0x34, 0x62, \n\t0x6e, 0x62, 0x45, 0x4e, 0x59, 0x79, 0x36, 0x79, 0x6c, 0x50, 0x50, 0x33, 0x2b, 0x62, 0x5a, 0x4b, 0x48, 0x4f, \n\t0x76, 0x59, 0x57, 0x54, 0x44, 0x55, 0x38, 0x43, 0x6f, 0x4f, 0x61, 0x7a, 0x2f, 0x75, 0x74, 0x5a, 0x33, 0x5c, 0x0a,\n\t0x09, 0x63, 0x30, 0x71, 0x5a, 0x47, 0x34, 0x69, 0x55, 0x6e, 0x79, 0x67, 0x32, 0x7a, 0x34, 0x71, 0x52, 0x6d, \n\t0x74, 0x77, 0x59, 0x6f, 0x4a, 0x43, 0x41, 0x6b, 0x5a, 0x36, 0x73, 0x32, 0x49, 0x42, 0x52, 0x4f, 0x41, 0x39, \n\t0x4a, 0x47, 0x44, 0x6c, 0x6d, 0x67, 0x35, 0x46, 0x6a, 0x44, 0x6a, 0x43, 0x43, 0x78, 0x73, 0x6b, 0x32, 0x47, \n\t0x45, 0x56, 0x2b, 0x4b, 0x48, 0x31, 0x2b, 0x53, 0x54, 0x44, 0x53, 0x64, 0x64, 0x45, 0x76, 0x2b, 0x55, 0x5c, 0x0a,\n\t0x09, 0x70, 0x74, 0x72, 0x45, 0x59, 0x6a, 0x76, 0x46, 0x51, 0x59, 0x6d, 0x58, 0x75, 0x34, 0x75, 0x6a, 0x42, \n\t0x4b, 0x33, 0x63, 0x63, 0x4f, 0x47, 0x4f, 0x6b, 0x36, 0x70, 0x32, 0x48, 0x30, 0x43, 0x4c, 0x69, 0x70, 0x76, \n\t0x31, 0x2f, 0x57, 0x4a, 0x76, 0x50, 0x57, 0x69, 0x41, 0x42, 0x65, 0x42, 0x2b, 0x7a, 0x6f, 0x45, 0x33, 0x4c, \n\t0x6d, 0x70, 0x41, 0x65, 0x4f, 0x30, 0x6f, 0x41, 0x73, 0x6a, 0x4b, 0x4b, 0x2f, 0x47, 0x69, 0x72, 0x78, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x59, 0x75, 0x48, 0x45, 0x64, 0x58, 0x31, 0x4b, 0x37, 0x2f, 0x4c, 0x34, 0x37, 0x78, 0x67, 0x5a, \n\t0x4f, 0x73, 0x53, 0x64, 0x63, 0x5a, 0x56, 0x67, 0x6c, 0x47, 0x7a, 0x6a, 0x65, 0x73, 0x74, 0x5a, 0x31, 0x57, \n\t0x64, 0x4a, 0x6f, 0x46, 0x52, 0x51, 0x2b, 0x78, 0x39, 0x61, 0x6f, 0x58, 0x52, 0x36, 0x78, 0x48, 0x79, 0x31, \n\t0x6e, 0x64, 0x79, 0x53, 0x6c, 0x6b, 0x45, 0x69, 0x42, 0x35, 0x48, 0x62, 0x35, 0x59, 0x47, 0x79, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x48, 0x71, 0x55, 0x48, 0x53, 0x45, 0x30, 0x59, 0x4b, 0x47, 0x68, 0x50, 0x42, 0x53, 0x47, 0x74, \n\t0x52, 0x49, 0x65, 0x36, 0x67, 0x37, 0x76, 0x4c, 0x59, 0x75, 0x47, 0x7a, 0x65, 0x4d, 0x41, 0x70, 0x78, 0x71, \n\t0x77, 0x32, 0x6a, 0x70, 0x76, 0x6a, 0x6e, 0x32, 0x2b, 0x69, 0x6f, 0x66, 0x63, 0x75, 0x59, 0x46, 0x55, 0x61, \n\t0x32, 0x50, 0x4a, 0x39, 0x6e, 0x6f, 0x38, 0x7a, 0x70, 0x59, 0x42, 0x54, 0x6c, 0x4e, 0x79, 0x32, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x70, 0x74, 0x39, 0x59, 0x7a, 0x66, 0x75, 0x48, 0x34, 0x69, 0x2b, 0x4a, 0x7a, 0x53, 0x70, 0x7a, 0x42, \n\t0x64, 0x48, 0x52, 0x56, 0x37, 0x30, 0x35, 0x50, 0x50, 0x78, 0x66, 0x69, 0x79, 0x4a, 0x47, 0x32, 0x38, 0x6a, \n\t0x75, 0x47, 0x5a, 0x49, 0x77, 0x67, 0x6a, 0x53, 0x4d, 0x47, 0x67, 0x37, 0x6c, 0x4e, 0x49, 0x77, 0x69, 0x50, \n\t0x35, 0x4b, 0x65, 0x5a, 0x62, 0x31, 0x6e, 0x4d, 0x49, 0x71, 0x53, 0x6d, 0x6a, 0x72, 0x76, 0x41, 0x59, 0x5c, 0x0a,\n\t0x09, 0x78, 0x69, 0x52, 0x75, 0x77, 0x2f, 0x47, 0x4f, 0x6e, 0x77, 0x6c, 0x44, 0x42, 0x61, 0x70, 0x59, 0x33, \n\t0x56, 0x47, 0x76, 0x47, 0x64, 0x30, 0x42, 0x77, 0x44, 0x6f, 0x38, 0x61, 0x37, 0x5a, 0x4e, 0x75, 0x30, 0x35, \n\t0x7a, 0x44, 0x4b, 0x49, 0x66, 0x75, 0x39, 0x73, 0x54, 0x2b, 0x4b, 0x55, 0x38, 0x67, 0x69, 0x4e, 0x43, 0x4c, \n\t0x2b, 0x64, 0x33, 0x74, 0x6e, 0x48, 0x6a, 0x62, 0x4a, 0x56, 0x64, 0x66, 0x37, 0x7a, 0x36, 0x6e, 0x75, 0x5c, 0x0a,\n\t0x09, 0x66, 0x76, 0x64, 0x33, 0x6b, 0x73, 0x6c, 0x4f, 0x41, 0x72, 0x67, 0x67, 0x4b, 0x4c, 0x67, 0x46, 0x4c, \n\t0x68, 0x64, 0x42, 0x33, 0x41, 0x4b, 0x79, 0x4b, 0x53, 0x69, 0x72, 0x38, 0x74, 0x79, 0x72, 0x49, 0x4b, 0x67, \n\t0x51, 0x46, 0x69, 0x39, 0x34, 0x55, 0x5a, 0x52, 0x4e, 0x42, 0x52, 0x56, 0x46, 0x75, 0x52, 0x63, 0x51, 0x6b, \n\t0x72, 0x41, 0x45, 0x45, 0x48, 0x4a, 0x42, 0x43, 0x49, 0x59, 0x41, 0x53, 0x5a, 0x51, 0x51, 0x49, 0x41, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x6d, 0x5a, 0x43, 0x45, 0x37, 0x4a, 0x4a, 0x4f, 0x45, 0x79, 0x54, 0x4c, 0x5a, 0x5a, 0x69, 0x61, \n\t0x7a, 0x7a, 0x2f, 0x75, 0x2b, 0x38, 0x79, 0x37, 0x64, 0x56, 0x65, 0x66, 0x2b, 0x55, 0x55, 0x75, 0x66, 0x4f, \n\t0x6e, 0x56, 0x4f, 0x64, 0x56, 0x57, 0x76, 0x31, 0x66, 0x32, 0x65, 0x37, 0x2f, 0x50, 0x4d, 0x38, 0x31, 0x61, \n\t0x64, 0x74, 0x61, 0x71, 0x36, 0x36, 0x6a, 0x4f, 0x2f, 0x63, 0x36, 0x72, 0x71, 0x57, 0x31, 0x4c, 0x79, 0x5c, 0x0a,\n\t0x09, 0x46, 0x62, 0x53, 0x76, 0x72, 0x38, 0x6b, 0x6a, 0x2b, 0x38, 0x43, 0x72, 0x6b, 0x59, 0x47, 0x52, 0x71, \n\t0x49, 0x55, 0x46, 0x56, 0x4d, 0x69, 0x6f, 0x4d, 0x4f, 0x71, 0x62, 0x79, 0x79, 0x50, 0x52, 0x30, 0x43, 0x33, \n\t0x4b, 0x53, 0x30, 0x56, 0x63, 0x6e, 0x57, 0x45, 0x55, 0x31, 0x6b, 0x63, 0x70, 0x46, 0x2b, 0x62, 0x31, 0x7a, \n\t0x65, 0x57, 0x78, 0x71, 0x6a, 0x42, 0x53, 0x2b, 0x33, 0x51, 0x75, 0x6a, 0x38, 0x62, 0x32, 0x32, 0x33, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x78, 0x66, 0x39, 0x71, 0x35, 0x6f, 0x31, 0x2f, 0x55, 0x6d, 0x54, 0x34, 0x74, 0x4d, 0x4d, 0x6f, \n\t0x41, 0x62, 0x6c, 0x67, 0x77, 0x69, 0x76, 0x4d, 0x79, 0x66, 0x56, 0x79, 0x4a, 0x35, 0x4d, 0x44, 0x59, 0x67, \n\t0x41, 0x6a, 0x59, 0x4a, 0x32, 0x58, 0x6f, 0x33, 0x42, 0x5a, 0x4c, 0x48, 0x74, 0x6b, 0x58, 0x4c, 0x71, 0x52, \n\t0x41, 0x30, 0x34, 0x5a, 0x52, 0x38, 0x6d, 0x35, 0x5a, 0x70, 0x6f, 0x77, 0x4f, 0x49, 0x77, 0x55, 0x77, 0x5c, 0x0a,\n\t0x09, 0x67, 0x33, 0x42, 0x35, 0x74, 0x4d, 0x43, 0x6f, 0x62, 0x79, 0x36, 0x50, 0x65, 0x54, 0x44, 0x4b, 0x71, \n\t0x41, 0x49, 0x77, 0x79, 0x70, 0x7a, 0x67, 0x36, 0x52, 0x31, 0x31, 0x4c, 0x6f, 0x39, 0x39, 0x67, 0x6c, 0x46, \n\t0x71, 0x59, 0x30, 0x63, 0x4e, 0x49, 0x38, 0x4e, 0x2f, 0x76, 0x6d, 0x45, 0x66, 0x46, 0x77, 0x48, 0x55, 0x6e, \n\t0x72, 0x34, 0x76, 0x75, 0x77, 0x73, 0x39, 0x71, 0x75, 0x38, 0x67, 0x57, 0x6e, 0x6a, 0x74, 0x70, 0x66, 0x5c, 0x0a,\n\t0x09, 0x48, 0x69, 0x6c, 0x31, 0x4d, 0x6e, 0x61, 0x58, 0x4e, 0x56, 0x38, 0x37, 0x4b, 0x32, 0x77, 0x55, 0x69, \n\t0x42, 0x69, 0x42, 0x46, 0x47, 0x47, 0x6c, 0x69, 0x73, 0x4c, 0x6f, 0x38, 0x32, 0x47, 0x48, 0x6d, 0x64, 0x59, \n\t0x5a, 0x54, 0x55, 0x6f, 0x78, 0x79, 0x4d, 0x6c, 0x4b, 0x72, 0x61, 0x67, 0x72, 0x59, 0x4d, 0x68, 0x51, 0x48, \n\t0x54, 0x41, 0x34, 0x7a, 0x73, 0x2f, 0x63, 0x52, 0x35, 0x70, 0x6f, 0x74, 0x71, 0x30, 0x6d, 0x41, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x4c, 0x78, 0x75, 0x2b, 0x39, 0x41, 0x75, 0x6b, 0x30, 0x48, 0x41, 0x4b, 0x47, 0x38, 0x34, 0x61, \n\t0x34, 0x52, 0x52, 0x6c, 0x44, 0x56, 0x63, 0x47, 0x50, 0x58, 0x39, 0x74, 0x6e, 0x33, 0x53, 0x38, 0x6b, 0x42, \n\t0x61, 0x44, 0x58, 0x55, 0x2b, 0x32, 0x73, 0x38, 0x70, 0x56, 0x2f, 0x61, 0x43, 0x71, 0x42, 0x57, 0x44, 0x55, \n\t0x65, 0x6f, 0x57, 0x76, 0x67, 0x56, 0x47, 0x38, 0x58, 0x4a, 0x56, 0x4c, 0x47, 0x65, 0x6c, 0x56, 0x69, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x39, 0x30, 0x46, 0x37, 0x4f, 0x58, 0x4f, 0x42, 0x6b, 0x79, 0x2b, 0x68, 0x70, 0x48, 0x53, 0x64, \n\t0x6f, 0x79, 0x62, 0x51, 0x35, 0x48, 0x69, 0x36, 0x50, 0x61, 0x48, 0x6c, 0x71, 0x48, 0x39, 0x6f, 0x36, 0x79, \n\t0x76, 0x71, 0x77, 0x59, 0x5a, 0x54, 0x6e, 0x54, 0x61, 0x33, 0x58, 0x37, 0x77, 0x70, 0x47, 0x6f, 0x69, 0x53, \n\t0x4d, 0x32, 0x76, 0x57, 0x48, 0x35, 0x50, 0x4b, 0x34, 0x41, 0x38, 0x6d, 0x74, 0x34, 0x77, 0x69, 0x69, 0x5c, 0x0a,\n\t0x09, 0x68, 0x34, 0x43, 0x72, 0x31, 0x42, 0x4e, 0x55, 0x72, 0x6a, 0x77, 0x63, 0x51, 0x55, 0x4f, 0x44, 0x6b, \n\t0x51, 0x6f, 0x62, 0x7a, 0x77, 0x41, 0x6a, 0x69, 0x52, 0x6c, 0x47, 0x34, 0x2b, 0x37, 0x79, 0x61, 0x46, 0x56, \n\t0x52, 0x47, 0x48, 0x57, 0x34, 0x6f, 0x4d, 0x57, 0x6f, 0x59, 0x47, 0x54, 0x59, 0x72, 0x6c, 0x77, 0x59, 0x6d, \n\t0x66, 0x37, 0x33, 0x37, 0x51, 0x4a, 0x47, 0x61, 0x6e, 0x65, 0x46, 0x59, 0x47, 0x54, 0x70, 0x30, 0x39, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x48, 0x70, 0x74, 0x34, 0x45, 0x77, 0x4b, 0x6a, 0x34, 0x30, 0x39, 0x64, 0x66, 0x41, 0x36, 0x6a, \n\t0x39, 0x30, 0x68, 0x34, 0x47, 0x6f, 0x59, 0x47, 0x37, 0x38, 0x46, 0x76, 0x45, 0x41, 0x41, 0x41, 0x67, 0x41, \n\t0x45, 0x6c, 0x45, 0x51, 0x56, 0x53, 0x41, 0x53, 0x42, 0x6d, 0x65, 0x6e, 0x51, 0x66, 0x74, 0x67, 0x79, 0x51, \n\t0x33, 0x6a, 0x6b, 0x41, 0x7a, 0x2f, 0x73, 0x4b, 0x48, 0x41, 0x69, 0x4d, 0x56, 0x53, 0x42, 0x68, 0x67, 0x5c, 0x0a,\n\t0x09, 0x56, 0x4e, 0x52, 0x79, 0x4e, 0x69, 0x52, 0x52, 0x44, 0x6f, 0x79, 0x77, 0x77, 0x43, 0x69, 0x64, 0x58, \n\t0x78, 0x70, 0x47, 0x4b, 0x61, 0x67, 0x34, 0x6c, 0x30, 0x66, 0x72, 0x64, 0x67, 0x30, 0x61, 0x52, 0x74, 0x30, \n\t0x2b, 0x66, 0x56, 0x32, 0x34, 0x44, 0x79, 0x39, 0x37, 0x44, 0x49, 0x63, 0x42, 0x6f, 0x30, 0x78, 0x2f, 0x6e, \n\t0x57, 0x41, 0x55, 0x4a, 0x78, 0x69, 0x32, 0x79, 0x62, 0x52, 0x65, 0x44, 0x45, 0x5a, 0x66, 0x74, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x39, 0x55, 0x37, 0x78, 0x70, 0x6b, 0x52, 0x41, 0x54, 0x77, 0x42, 0x61, 0x4c, 0x44, 0x6b, 0x63, 0x42, \n\t0x6f, 0x65, 0x62, 0x63, 0x43, 0x49, 0x41, 0x31, 0x47, 0x4d, 0x5a, 0x41, 0x6b, 0x5a, 0x68, 0x67, 0x70, 0x73, \n\t0x4b, 0x6d, 0x32, 0x79, 0x2b, 0x4d, 0x41, 0x59, 0x64, 0x54, 0x4c, 0x30, 0x39, 0x64, 0x71, 0x6d, 0x72, 0x48, \n\t0x38, 0x45, 0x47, 0x43, 0x55, 0x32, 0x62, 0x35, 0x4f, 0x4d, 0x4e, 0x4c, 0x58, 0x4e, 0x79, 0x47, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x38, 0x6d, 0x34, 0x73, 0x61, 0x50, 0x55, 0x48, 0x35, 0x50, 0x4b, 0x34, 0x42, 0x38, 0x4c, 0x50, 0x53, \n\t0x67, 0x39, 0x4b, 0x67, 0x77, 0x62, 0x52, 0x51, 0x39, 0x43, 0x2b, 0x65, 0x79, 0x59, 0x6c, 0x42, 0x45, 0x75, \n\t0x37, 0x77, 0x2b, 0x65, 0x47, 0x52, 0x41, 0x77, 0x55, 0x41, 0x34, 0x7a, 0x69, 0x43, 0x43, 0x6a, 0x32, 0x4d, \n\t0x75, 0x72, 0x61, 0x35, 0x64, 0x45, 0x43, 0x6f, 0x31, 0x51, 0x39, 0x41, 0x34, 0x79, 0x53, 0x5a, 0x34, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x55, 0x4d, 0x6d, 0x56, 0x68, 0x78, 0x4b, 0x61, 0x47, 0x6b, 0x58, 0x57, 0x37, 0x4d, 0x69, 0x65, \n\t0x38, 0x58, 0x73, 0x62, 0x55, 0x76, 0x37, 0x70, 0x75, 0x36, 0x61, 0x50, 0x76, 0x4d, 0x4e, 0x4c, 0x56, 0x41, \n\t0x55, 0x61, 0x6d, 0x38, 0x71, 0x6e, 0x74, 0x47, 0x57, 0x73, 0x59, 0x58, 0x51, 0x44, 0x39, 0x66, 0x35, 0x70, \n\t0x61, 0x31, 0x63, 0x42, 0x41, 0x74, 0x50, 0x44, 0x61, 0x53, 0x2b, 0x4d, 0x44, 0x38, 0x47, 0x39, 0x71, 0x5c, 0x0a,\n\t0x09, 0x75, 0x6d, 0x79, 0x75, 0x49, 0x64, 0x63, 0x50, 0x52, 0x7a, 0x43, 0x71, 0x74, 0x61, 0x4d, 0x62, 0x45, \n\t0x34, 0x77, 0x69, 0x77, 0x48, 0x54, 0x76, 0x38, 0x67, 0x69, 0x6c, 0x4c, 0x47, 0x63, 0x46, 0x6d, 0x66, 0x7a, \n\t0x4f, 0x4d, 0x4d, 0x49, 0x43, 0x49, 0x2f, 0x33, 0x45, 0x61, 0x31, 0x63, 0x33, 0x2f, 0x71, 0x42, 0x56, 0x67, \n\t0x6c, 0x47, 0x6d, 0x72, 0x6e, 0x61, 0x68, 0x46, 0x6f, 0x42, 0x52, 0x65, 0x5a, 0x66, 0x48, 0x71, 0x73, 0x5c, 0x0a,\n\t0x09, 0x47, 0x6f, 0x30, 0x2f, 0x48, 0x74, 0x64, 0x46, 0x74, 0x66, 0x62, 0x33, 0x4e, 0x51, 0x4d, 0x46, 0x4a, \n\t0x56, 0x42, 0x45, 0x5a, 0x36, 0x76, 0x55, 0x49, 0x77, 0x4f, 0x67, 0x38, 0x4a, 0x74, 0x56, 0x39, 0x2b, 0x6d, \n\t0x45, 0x46, 0x70, 0x30, 0x42, 0x45, 0x52, 0x53, 0x4d, 0x35, 0x44, 0x65, 0x2f, 0x63, 0x73, 0x4f, 0x4c, 0x79, \n\t0x4c, 0x35, 0x50, 0x57, 0x4f, 0x56, 0x45, 0x51, 0x30, 0x43, 0x42, 0x69, 0x56, 0x73, 0x4a, 0x79, 0x31, 0x5c, 0x0a,\n\t0x09, 0x50, 0x6e, 0x32, 0x4e, 0x56, 0x68, 0x38, 0x46, 0x52, 0x68, 0x48, 0x77, 0x75, 0x6f, 0x61, 0x52, 0x42, \n\t0x73, 0x52, 0x68, 0x77, 0x73, 0x69, 0x6d, 0x54, 0x71, 0x41, 0x59, 0x47, 0x49, 0x77, 0x73, 0x35, 0x62, 0x75, \n\t0x4b, 0x57, 0x72, 0x4a, 0x39, 0x39, 0x41, 0x56, 0x47, 0x71, 0x54, 0x61, 0x4b, 0x77, 0x45, 0x6a, 0x50, 0x37, \n\t0x7a, 0x65, 0x4d, 0x39, 0x50, 0x4b, 0x64, 0x59, 0x42, 0x54, 0x33, 0x56, 0x78, 0x68, 0x47, 0x68, 0x35, 0x5c, 0x0a,\n\t0x09, 0x48, 0x65, 0x74, 0x77, 0x59, 0x5a, 0x44, 0x63, 0x45, 0x77, 0x51, 0x41, 0x54, 0x37, 0x6b, 0x56, 0x79, \n\t0x73, 0x4a, 0x67, 0x52, 0x4c, 0x75, 0x38, 0x4b, 0x4c, 0x6f, 0x52, 0x73, 0x59, 0x4a, 0x52, 0x47, 0x4f, 0x44, \n\t0x55, 0x61, 0x59, 0x59, 0x5a, 0x54, 0x78, 0x4d, 0x69, 0x6f, 0x4c, 0x49, 0x78, 0x31, 0x6d, 0x70, 0x4d, 0x73, \n\t0x78, 0x68, 0x6a, 0x41, 0x71, 0x4f, 0x6b, 0x52, 0x54, 0x36, 0x36, 0x72, 0x72, 0x66, 0x59, 0x65, 0x52, 0x5c, 0x0a,\n\t0x09, 0x48, 0x52, 0x52, 0x6d, 0x47, 0x42, 0x58, 0x59, 0x39, 0x31, 0x35, 0x67, 0x5a, 0x47, 0x6f, 0x76, 0x36, \n\t0x54, 0x74, 0x57, 0x4a, 0x78, 0x69, 0x5a, 0x74, 0x6d, 0x65, 0x45, 0x4d, 0x45, 0x72, 0x31, 0x6c, 0x77, 0x4f, \n\t0x58, 0x64, 0x74, 0x35, 0x46, 0x77, 0x50, 0x70, 0x59, 0x67, 0x32, 0x6a, 0x68, 0x39, 0x4f, 0x54, 0x75, 0x32, \n\t0x65, 0x64, 0x54, 0x50, 0x35, 0x61, 0x2f, 0x67, 0x56, 0x7a, 0x5a, 0x69, 0x34, 0x78, 0x41, 0x59, 0x34, 0x5c, 0x0a,\n\t0x09, 0x51, 0x52, 0x6d, 0x47, 0x47, 0x55, 0x65, 0x6b, 0x50, 0x66, 0x42, 0x43, 0x4d, 0x56, 0x47, 0x44, 0x42, \n\t0x77, 0x47, 0x4b, 0x47, 0x55, 0x51, 0x34, 0x47, 0x52, 0x75, 0x67, 0x30, 0x54, 0x41, 0x79, 0x4d, 0x44, 0x6e, \n\t0x45, 0x59, 0x4a, 0x49, 0x31, 0x4e, 0x37, 0x71, 0x57, 0x30, 0x78, 0x74, 0x7a, 0x6c, 0x79, 0x4c, 0x36, 0x4e, \n\t0x52, 0x77, 0x69, 0x6a, 0x7a, 0x4f, 0x78, 0x6e, 0x4f, 0x76, 0x33, 0x51, 0x66, 0x34, 0x62, 0x44, 0x73, 0x5c, 0x0a,\n\t0x09, 0x56, 0x33, 0x5a, 0x6c, 0x38, 0x2f, 0x75, 0x6f, 0x59, 0x55, 0x52, 0x45, 0x41, 0x46, 0x38, 0x46, 0x6c, \n\t0x74, 0x53, 0x45, 0x34, 0x50, 0x43, 0x44, 0x67, 0x4c, 0x42, 0x48, 0x52, 0x70, 0x37, 0x79, 0x44, 0x6c, 0x6f, \n\t0x75, 0x6a, 0x4f, 0x49, 0x66, 0x31, 0x54, 0x41, 0x78, 0x58, 0x51, 0x68, 0x47, 0x4b, 0x47, 0x58, 0x37, 0x43, \n\t0x4b, 0x50, 0x6b, 0x4f, 0x74, 0x52, 0x50, 0x74, 0x44, 0x78, 0x6f, 0x4f, 0x42, 0x67, 0x5a, 0x31, 0x32, 0x5c, 0x0a,\n\t0x09, 0x30, 0x77, 0x4b, 0x67, 0x79, 0x4b, 0x62, 0x4a, 0x76, 0x56, 0x67, 0x4a, 0x47, 0x2b, 0x4c, 0x58, 0x71, \n\t0x64, 0x58, 0x6d, 0x47, 0x6b, 0x37, 0x31, 0x4e, 0x70, 0x47, 0x4b, 0x30, 0x68, 0x78, 0x63, 0x56, 0x36, 0x34, \n\t0x69, 0x41, 0x30, 0x4c, 0x42, 0x43, 0x74, 0x41, 0x75, 0x65, 0x71, 0x50, 0x35, 0x52, 0x63, 0x33, 0x67, 0x31, \n\t0x42, 0x43, 0x34, 0x51, 0x58, 0x58, 0x64, 0x7a, 0x43, 0x41, 0x69, 0x4d, 0x46, 0x4f, 0x45, 0x59, 0x59, 0x5c, 0x0a,\n\t0x09, 0x74, 0x53, 0x48, 0x54, 0x48, 0x59, 0x7a, 0x55, 0x78, 0x77, 0x41, 0x47, 0x44, 0x79, 0x4d, 0x4a, 0x37, \n\t0x52, 0x38, 0x2b, 0x39, 0x62, 0x75, 0x50, 0x4f, 0x59, 0x77, 0x79, 0x79, 0x39, 0x6b, 0x4c, 0x30, 0x63, 0x48, \n\t0x49, 0x44, 0x6f, 0x36, 0x4b, 0x47, 0x71, 0x74, 0x64, 0x44, 0x43, 0x78, 0x62, 0x7a, 0x36, 0x45, 0x2b, 0x61, \n\t0x75, 0x41, 0x67, 0x55, 0x6f, 0x5a, 0x6e, 0x2f, 0x77, 0x71, 0x30, 0x44, 0x34, 0x43, 0x55, 0x79, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x56, 0x64, 0x53, 0x62, 0x51, 0x6a, 0x49, 0x37, 0x44, 0x59, 0x59, 0x61, 0x52, 0x4e, 0x56, 0x4a, 0x74, \n\t0x67, 0x6c, 0x4e, 0x7a, 0x39, 0x73, 0x73, 0x47, 0x6f, 0x6e, 0x56, 0x35, 0x4e, 0x79, 0x31, 0x6e, 0x49, 0x4a, \n\t0x4f, 0x62, 0x42, 0x53, 0x42, 0x67, 0x71, 0x6a, 0x77, 0x70, 0x47, 0x47, 0x56, 0x44, 0x45, 0x44, 0x63, 0x74, \n\t0x55, 0x6d, 0x64, 0x48, 0x44, 0x53, 0x46, 0x73, 0x64, 0x4e, 0x59, 0x78, 0x53, 0x2f, 0x56, 0x55, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x52, 0x75, 0x63, 0x42, 0x31, 0x48, 0x35, 0x31, 0x4a, 0x34, 0x50, 0x57, 0x73, 0x43, 0x49, 0x69, 0x67, \n\t0x43, 0x75, 0x42, 0x37, 0x55, 0x42, 0x79, 0x41, 0x49, 0x4b, 0x44, 0x39, 0x79, 0x4f, 0x38, 0x57, 0x67, 0x5a, \n\t0x47, 0x51, 0x41, 0x63, 0x59, 0x69, 0x57, 0x51, 0x39, 0x36, 0x32, 0x57, 0x6b, 0x41, 0x43, 0x4d, 0x44, 0x6f, \n\t0x7a, 0x67, 0x64, 0x6a, 0x44, 0x41, 0x53, 0x39, 0x41, 0x59, 0x6a, 0x51, 0x65, 0x62, 0x48, 0x48, 0x59, 0x5c, 0x0a,\n\t0x09, 0x33, 0x4c, 0x34, 0x34, 0x68, 0x67, 0x70, 0x47, 0x35, 0x4c, 0x5a, 0x57, 0x47, 0x55, 0x33, 0x55, 0x66, \n\t0x6e, 0x38, 0x71, 0x68, 0x73, 0x55, 0x78, 0x74, 0x47, 0x4c, 0x62, 0x54, 0x50, 0x67, 0x77, 0x31, 0x53, 0x77, \n\t0x77, 0x53, 0x52, 0x42, 0x44, 0x36, 0x72, 0x72, 0x73, 0x6d, 0x31, 0x67, 0x38, 0x69, 0x4e, 0x35, 0x51, 0x79, \n\t0x4d, 0x52, 0x4f, 0x78, 0x52, 0x68, 0x42, 0x49, 0x46, 0x6d, 0x62, 0x79, 0x4d, 0x72, 0x44, 0x43, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x67, 0x61, 0x5a, 0x43, 0x4a, 0x56, 0x31, 0x6e, 0x73, 0x44, 0x42, 0x4b, 0x2f, 0x38, 0x39, 0x53, 0x65, \n\t0x63, 0x74, 0x5a, 0x4a, 0x62, 0x73, 0x6e, 0x47, 0x4f, 0x6e, 0x62, 0x6b, 0x72, 0x6f, 0x59, 0x78, 0x78, 0x4e, \n\t0x47, 0x6d, 0x39, 0x6a, 0x6c, 0x38, 0x56, 0x74, 0x49, 0x63, 0x59, 0x41, 0x68, 0x61, 0x53, 0x67, 0x67, 0x55, \n\t0x6f, 0x5a, 0x6e, 0x35, 0x36, 0x41, 0x65, 0x57, 0x67, 0x6e, 0x42, 0x67, 0x66, 0x73, 0x41, 0x59, 0x59, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x52, 0x4d, 0x6d, 0x7a, 0x71, 0x41, 0x43, 0x4d, 0x77, 0x77, 0x79, 0x67, 0x7a, 0x68, 0x32, 0x4f, \n\t0x47, 0x55, 0x57, 0x72, 0x6f, 0x74, 0x68, 0x6b, 0x74, 0x5a, 0x39, 0x4f, 0x4d, 0x47, 0x41, 0x43, 0x4d, 0x34, \n\t0x68, 0x4e, 0x38, 0x51, 0x44, 0x42, 0x53, 0x31, 0x33, 0x75, 0x41, 0x55, 0x56, 0x61, 0x54, 0x43, 0x36, 0x4d, \n\t0x43, 0x4c, 0x38, 0x6c, 0x2b, 0x43, 0x59, 0x59, 0x7a, 0x4c, 0x46, 0x4f, 0x32, 0x59, 0x6b, 0x69, 0x53, 0x5c, 0x0a,\n\t0x09, 0x33, 0x41, 0x74, 0x70, 0x77, 0x37, 0x54, 0x67, 0x77, 0x48, 0x30, 0x61, 0x48, 0x41, 0x77, 0x77, 0x55, \n\t0x6f, 0x64, 0x73, 0x6f, 0x33, 0x52, 0x35, 0x46, 0x4e, 0x47, 0x50, 0x62, 0x6f, 0x42, 0x52, 0x71, 0x6b, 0x78, \n\t0x58, 0x4d, 0x45, 0x6f, 0x33, 0x34, 0x32, 0x44, 0x55, 0x6f, 0x51, 0x2b, 0x31, 0x66, 0x4e, 0x65, 0x67, 0x53, \n\t0x4b, 0x39, 0x58, 0x79, 0x65, 0x55, 0x78, 0x6b, 0x35, 0x38, 0x4c, 0x7a, 0x51, 0x34, 0x77, 0x79, 0x70, 0x5c, 0x0a,\n\t0x09, 0x78, 0x4c, 0x48, 0x57, 0x48, 0x55, 0x41, 0x73, 0x34, 0x33, 0x6e, 0x69, 0x63, 0x44, 0x30, 0x74, 0x42, \n\t0x41, 0x6c, 0x45, 0x52, 0x46, 0x6b, 0x72, 0x4e, 0x54, 0x47, 0x66, 0x34, 0x47, 0x77, 0x61, 0x47, 0x48, 0x77, \n\t0x70, 0x64, 0x63, 0x74, 0x51, 0x63, 0x5a, 0x4d, 0x7a, 0x43, 0x4b, 0x67, 0x57, 0x4f, 0x42, 0x55, 0x64, 0x76, \n\t0x6c, 0x63, 0x59, 0x41, 0x77, 0x69, 0x6e, 0x39, 0x30, 0x44, 0x55, 0x59, 0x79, 0x7a, 0x6b, 0x76, 0x71, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x32, 0x45, 0x55, 0x48, 0x51, 0x4f, 0x6c, 0x58, 0x4a, 0x67, 0x33, 0x4f, 0x53, 0x36, 0x50, 0x53, \n\t0x6c, 0x73, 0x6d, 0x4d, 0x49, 0x49, 0x47, 0x49, 0x33, 0x32, 0x31, 0x49, 0x48, 0x77, 0x79, 0x62, 0x58, 0x5a, \n\t0x59, 0x56, 0x38, 0x75, 0x50, 0x43, 0x59, 0x78, 0x47, 0x36, 0x50, 0x4a, 0x34, 0x4d, 0x54, 0x4c, 0x39, 0x6f, \n\t0x64, 0x52, 0x42, 0x61, 0x37, 0x67, 0x52, 0x55, 0x61, 0x6a, 0x7a, 0x67, 0x4a, 0x54, 0x58, 0x5a, 0x48, 0x5c, 0x0a,\n\t0x09, 0x44, 0x67, 0x58, 0x75, 0x4b, 0x68, 0x56, 0x32, 0x45, 0x59, 0x70, 0x55, 0x42, 0x6a, 0x67, 0x70, 0x46, \n\t0x65, 0x52, 0x6f, 0x65, 0x52, 0x42, 0x69, 0x30, 0x64, 0x52, 0x6b, 0x42, 0x50, 0x6c, 0x72, 0x4e, 0x4a, 0x50, \n\t0x56, 0x49, 0x77, 0x36, 0x70, 0x76, 0x6c, 0x72, 0x4e, 0x70, 0x47, 0x53, 0x70, 0x59, 0x4c, 0x71, 0x55, 0x73, \n\t0x59, 0x32, 0x66, 0x75, 0x4a, 0x38, 0x2f, 0x49, 0x75, 0x4b, 0x74, 0x72, 0x37, 0x6c, 0x37, 0x6d, 0x49, 0x5c, 0x0a,\n\t0x09, 0x30, 0x7a, 0x74, 0x61, 0x62, 0x5a, 0x64, 0x48, 0x4e, 0x61, 0x2f, 0x62, 0x50, 0x6f, 0x59, 0x41, 0x6f, \n\t0x7a, 0x7a, 0x7a, 0x4e, 0x69, 0x4f, 0x4d, 0x6f, 0x71, 0x77, 0x73, 0x6a, 0x4c, 0x34, 0x49, 0x67, 0x74, 0x71, \n\t0x76, 0x50, 0x5a, 0x6a, 0x74, 0x59, 0x30, 0x41, 0x61, 0x42, 0x59, 0x6a, 0x57, 0x6b, 0x58, 0x78, 0x47, 0x54, \n\t0x5a, 0x44, 0x4c, 0x44, 0x79, 0x4d, 0x33, 0x56, 0x69, 0x30, 0x77, 0x45, 0x6d, 0x59, 0x59, 0x61, 0x62, 0x5c, 0x0a,\n\t0x09, 0x66, 0x79, 0x73, 0x7a, 0x42, 0x53, 0x49, 0x47, 0x4b, 0x45, 0x6b, 0x52, 0x62, 0x6c, 0x36, 0x44, 0x44, \n\t0x53, 0x68, 0x31, 0x77, 0x5a, 0x47, 0x48, 0x6e, 0x61, 0x53, 0x61, 0x6a, 0x42, 0x53, 0x41, 0x56, 0x61, 0x57, \n\t0x52, 0x69, 0x70, 0x39, 0x64, 0x49, 0x4c, 0x37, 0x65, 0x58, 0x4d, 0x42, 0x55, 0x36, 0x32, 0x6a, 0x4a, 0x37, \n\t0x57, 0x42, 0x59, 0x78, 0x6b, 0x62, 0x6a, 0x39, 0x4a, 0x49, 0x61, 0x33, 0x75, 0x4b, 0x47, 0x43, 0x6b, 0x5c, 0x0a,\n\t0x09, 0x35, 0x71, 0x6c, 0x39, 0x57, 0x4e, 0x6f, 0x72, 0x44, 0x53, 0x50, 0x54, 0x68, 0x64, 0x73, 0x46, 0x6a, \n\t0x46, 0x4c, 0x62, 0x4f, 0x67, 0x67, 0x59, 0x6c, 0x59, 0x6d, 0x4d, 0x32, 0x76, 0x55, 0x56, 0x47, 0x4b, 0x30, \n\t0x54, 0x6d, 0x61, 0x41, 0x4e, 0x55, 0x30, 0x4d, 0x46, 0x30, 0x63, 0x4c, 0x72, 0x6b, 0x6b, 0x6e, 0x72, 0x54, \n\t0x2b, 0x6f, 0x6e, 0x64, 0x72, 0x42, 0x76, 0x65, 0x77, 0x51, 0x59, 0x48, 0x55, 0x59, 0x78, 0x64, 0x45, 0x5c, 0x0a,\n\t0x09, 0x51, 0x2b, 0x6a, 0x46, 0x4b, 0x77, 0x47, 0x55, 0x4f, 0x58, 0x52, 0x78, 0x56, 0x47, 0x36, 0x73, 0x6c, \n\t0x54, 0x42, 0x45, 0x5a, 0x47, 0x6c, 0x59, 0x47, 0x52, 0x51, 0x65, 0x70, 0x46, 0x6d, 0x62, 0x6b, 0x41, 0x54, \n\t0x4f, 0x55, 0x48, 0x41, 0x61, 0x4d, 0x53, 0x66, 0x65, 0x6a, 0x39, 0x70, 0x66, 0x6f, 0x77, 0x6c, 0x49, 0x6e, \n\t0x58, 0x65, 0x34, 0x61, 0x52, 0x70, 0x55, 0x39, 0x62, 0x48, 0x35, 0x6c, 0x36, 0x2f, 0x59, 0x61, 0x52, 0x5c, 0x0a,\n\t0x09, 0x36, 0x42, 0x56, 0x47, 0x46, 0x30, 0x6b, 0x70, 0x44, 0x6a, 0x46, 0x6b, 0x6a, 0x53, 0x49, 0x69, 0x41, \n\t0x72, 0x67, 0x4e, 0x75, 0x45, 0x4c, 0x39, 0x55, 0x59, 0x49, 0x44, 0x39, 0x30, 0x5a, 0x48, 0x77, 0x6a, 0x50, \n\t0x43, 0x53, 0x45, 0x59, 0x51, 0x45, 0x53, 0x70, 0x4d, 0x62, 0x43, 0x36, 0x50, 0x51, 0x67, 0x7a, 0x51, 0x35, \n\t0x64, 0x45, 0x47, 0x6f, 0x33, 0x52, 0x2b, 0x56, 0x7a, 0x42, 0x4b, 0x56, 0x44, 0x47, 0x58, 0x52, 0x30, 0x5c, 0x0a,\n\t0x09, 0x59, 0x46, 0x49, 0x38, 0x4e, 0x32, 0x44, 0x51, 0x4e, 0x47, 0x61, 0x6e, 0x64, 0x46, 0x48, 0x33, 0x67, \n\t0x73, 0x33, 0x49, 0x63, 0x33, 0x47, 0x68, 0x68, 0x6c, 0x2b, 0x72, 0x50, 0x43, 0x36, 0x45, 0x73, 0x67, 0x71, \n\t0x4a, 0x33, 0x32, 0x67, 0x4c, 0x33, 0x2b, 0x41, 0x44, 0x52, 0x30, 0x45, 0x43, 0x6c, 0x52, 0x30, 0x63, 0x65, \n\t0x42, 0x39, 0x73, 0x46, 0x73, 0x72, 0x52, 0x4d, 0x63, 0x66, 0x67, 0x41, 0x38, 0x6a, 0x2b, 0x53, 0x57, 0x5c, 0x0a,\n\t0x09, 0x76, 0x52, 0x46, 0x47, 0x58, 0x6a, 0x36, 0x4d, 0x56, 0x43, 0x44, 0x6c, 0x75, 0x6a, 0x78, 0x61, 0x59, \n\t0x4a, 0x51, 0x4d, 0x39, 0x2f, 0x4a, 0x67, 0x52, 0x41, 0x63, 0x59, 0x30, 0x52, 0x32, 0x4d, 0x55, 0x68, 0x46, \n\t0x4f, 0x78, 0x56, 0x77, 0x65, 0x71, 0x52, 0x43, 0x4d, 0x4d, 0x74, 0x76, 0x58, 0x43, 0x55, 0x62, 0x36, 0x65, \n\t0x71, 0x65, 0x6f, 0x5a, 0x51, 0x4a, 0x68, 0x5a, 0x49, 0x79, 0x53, 0x4d, 0x6a, 0x42, 0x61, 0x59, 0x51, 0x5c, 0x0a,\n\t0x09, 0x54, 0x44, 0x73, 0x71, 0x54, 0x33, 0x45, 0x65, 0x6c, 0x4c, 0x45, 0x4d, 0x33, 0x4d, 0x52, 0x77, 0x63, \n\t0x7a, 0x32, 0x48, 0x4e, 0x6e, 0x43, 0x42, 0x59, 0x76, 0x6e, 0x70, 0x54, 0x75, 0x45, 0x55, 0x61, 0x53, 0x44, \n\t0x6a, 0x41, 0x69, 0x48, 0x30, 0x62, 0x59, 0x59, 0x4b, 0x53, 0x64, 0x2b, 0x42, 0x6b, 0x59, 0x4b, 0x53, 0x64, \n\t0x71, 0x71, 0x6b, 0x78, 0x5a, 0x47, 0x4f, 0x46, 0x67, 0x5a, 0x4e, 0x71, 0x75, 0x7a, 0x45, 0x57, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x2b, 0x6e, 0x51, 0x76, 0x36, 0x6e, 0x4e, 0x67, 0x63, 0x42, 0x49, 0x56, 0x77, 0x63, 0x59, 0x6d, \n\t0x63, 0x71, 0x6e, 0x74, 0x6d, 0x66, 0x67, 0x4d, 0x4c, 0x6f, 0x51, 0x78, 0x4a, 0x46, 0x4f, 0x57, 0x7a, 0x55, \n\t0x49, 0x6a, 0x52, 0x4a, 0x45, 0x61, 0x38, 0x43, 0x6e, 0x6b, 0x6a, 0x56, 0x4a, 0x61, 0x41, 0x32, 0x79, 0x65, \n\t0x6a, 0x41, 0x4c, 0x6f, 0x32, 0x52, 0x49, 0x5a, 0x6f, 0x4d, 0x52, 0x5a, 0x68, 0x6a, 0x46, 0x77, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x48, 0x52, 0x71, 0x2b, 0x57, 0x73, 0x4d, 0x4d, 0x4d, 0x6f, 0x4e, 0x53, 0x46, 0x74, 0x67, 0x46, 0x47, \n\t0x55, 0x33, 0x78, 0x6c, 0x47, 0x57, 0x47, 0x43, 0x6b, 0x6e, 0x33, 0x6a, 0x74, 0x36, 0x6b, 0x5a, 0x6f, 0x56, \n\t0x41, 0x6c, 0x47, 0x6d, 0x62, 0x72, 0x64, 0x77, 0x63, 0x69, 0x36, 0x58, 0x57, 0x4d, 0x42, 0x49, 0x38, 0x76, \n\t0x78, 0x74, 0x63, 0x47, 0x6f, 0x30, 0x2b, 0x38, 0x78, 0x4d, 0x42, 0x67, 0x6c, 0x2b, 0x69, 0x49, 0x49, 0x5c, 0x0a,\n\t0x09, 0x36, 0x73, 0x2b, 0x34, 0x7a, 0x37, 0x41, 0x64, 0x67, 0x39, 0x56, 0x49, 0x51, 0x4b, 0x51, 0x4d, 0x7a, \n\t0x38, 0x35, 0x45, 0x2f, 0x53, 0x6b, 0x6b, 0x42, 0x48, 0x76, 0x76, 0x44, 0x4a, 0x38, 0x54, 0x55, 0x6d, 0x45, \n\t0x55, 0x51, 0x55, 0x59, 0x6f, 0x45, 0x56, 0x44, 0x57, 0x79, 0x34, 0x67, 0x30, 0x61, 0x50, 0x54, 0x6f, 0x4b, \n\t0x42, 0x64, 0x47, 0x4b, 0x6c, 0x52, 0x4d, 0x4d, 0x43, 0x72, 0x68, 0x38, 0x70, 0x68, 0x72, 0x4f, 0x51, 0x5c, 0x0a,\n\t0x09, 0x74, 0x6d, 0x47, 0x45, 0x58, 0x41, 0x36, 0x78, 0x70, 0x47, 0x47, 0x68, 0x43, 0x72, 0x41, 0x4b, 0x4e, \n\t0x4f, 0x6f, 0x43, 0x67, 0x49, 0x6f, 0x34, 0x6c, 0x30, 0x65, 0x64, 0x53, 0x48, 0x52, 0x43, 0x4f, 0x48, 0x6b, \n\t0x51, 0x64, 0x77, 0x47, 0x50, 0x67, 0x50, 0x51, 0x2b, 0x64, 0x44, 0x30, 0x53, 0x67, 0x6a, 0x49, 0x6f, 0x42, \n\t0x37, 0x30, 0x48, 0x59, 0x2b, 0x32, 0x48, 0x63, 0x33, 0x2b, 0x42, 0x73, 0x57, 0x47, 0x48, 0x6e, 0x74, 0x5c, 0x0a,\n\t0x09, 0x69, 0x39, 0x55, 0x49, 0x49, 0x77, 0x30, 0x30, 0x4e, 0x68, 0x67, 0x6c, 0x45, 0x59, 0x34, 0x4e, 0x52, \n\t0x70, 0x68, 0x68, 0x6c, 0x4b, 0x52, 0x31, 0x67, 0x4e, 0x46, 0x6d, 0x63, 0x48, 0x6c, 0x45, 0x32, 0x52, 0x2b, \n\t0x62, 0x52, 0x67, 0x49, 0x6a, 0x4f, 0x79, 0x6a, 0x4d, 0x4d, 0x43, 0x71, 0x77, 0x37, 0x37, 0x33, 0x41, 0x79, \n\t0x4e, 0x52, 0x65, 0x30, 0x6e, 0x65, 0x73, 0x49, 0x6a, 0x44, 0x53, 0x38, 0x2f, 0x73, 0x4f, 0x6f, 0x36, 0x5c, 0x0a,\n\t0x09, 0x38, 0x68, 0x78, 0x58, 0x70, 0x2b, 0x78, 0x34, 0x50, 0x54, 0x79, 0x45, 0x43, 0x6b, 0x52, 0x45, 0x55, \n\t0x66, 0x53, 0x57, 0x55, 0x45, 0x50, 0x73, 0x48, 0x65, 0x37, 0x56, 0x48, 0x30, 0x49, 0x38, 0x77, 0x77, 0x69, \n\t0x6b, 0x33, 0x54, 0x45, 0x50, 0x6b, 0x77, 0x41, 0x6a, 0x4f, 0x4d, 0x6b, 0x6d, 0x55, 0x62, 0x6a, 0x4a, 0x53, \n\t0x36, 0x53, 0x52, 0x73, 0x44, 0x68, 0x42, 0x46, 0x4b, 0x4f, 0x52, 0x51, 0x59, 0x4a, 0x65, 0x56, 0x49, 0x5c, 0x0a,\n\t0x09, 0x38, 0x69, 0x6f, 0x4a, 0x6f, 0x36, 0x4c, 0x7a, 0x52, 0x56, 0x72, 0x64, 0x5a, 0x4c, 0x32, 0x4b, 0x4d, \n\t0x4f, 0x72, 0x51, 0x35, 0x73, 0x6a, 0x74, 0x51, 0x2f, 0x6f, 0x50, 0x6f, 0x38, 0x2b, 0x42, 0x6f, 0x50, 0x36, \n\t0x4d, 0x65, 0x78, 0x6d, 0x46, 0x52, 0x68, 0x30, 0x52, 0x41, 0x58, 0x77, 0x44, 0x75, 0x45, 0x74, 0x4e, 0x43, \n\t0x48, 0x5a, 0x76, 0x41, 0x2b, 0x49, 0x58, 0x59, 0x61, 0x4d, 0x44, 0x62, 0x6f, 0x4a, 0x52, 0x42, 0x42, 0x5c, 0x0a,\n\t0x09, 0x45, 0x72, 0x6a, 0x42, 0x4b, 0x58, 0x78, 0x31, 0x35, 0x67, 0x70, 0x41, 0x4a, 0x74, 0x79, 0x44, 0x42, \n\t0x4b, 0x72, 0x73, 0x4d, 0x63, 0x47, 0x4b, 0x58, 0x71, 0x71, 0x6e, 0x2f, 0x6a, 0x62, 0x54, 0x41, 0x55, 0x31, \n\t0x63, 0x76, 0x46, 0x47, 0x68, 0x71, 0x4d, 0x44, 0x48, 0x41, 0x61, 0x4a, 0x59, 0x78, 0x4d, 0x37, 0x61, 0x57, \n\t0x32, 0x78, 0x64, 0x7a, 0x6d, 0x42, 0x4d, 0x46, 0x6f, 0x4e, 0x33, 0x41, 0x4a, 0x49, 0x31, 0x51, 0x56, 0x5c, 0x0a,\n\t0x09, 0x51, 0x42, 0x51, 0x41, 0x5a, 0x36, 0x67, 0x4a, 0x63, 0x6d, 0x4d, 0x6c, 0x65, 0x69, 0x75, 0x2f, 0x46, \n\t0x67, 0x49, 0x6e, 0x66, 0x72, 0x63, 0x73, 0x44, 0x30, 0x59, 0x71, 0x59, 0x44, 0x61, 0x54, 0x35, 0x57, 0x7a, \n\t0x71, 0x33, 0x42, 0x77, 0x55, 0x6a, 0x43, 0x79, 0x61, 0x46, 0x42, 0x67, 0x56, 0x42, 0x6b, 0x57, 0x32, 0x7a, \n\t0x57, 0x72, 0x41, 0x53, 0x4e, 0x38, 0x57, 0x76, 0x55, 0x35, 0x48, 0x47, 0x48, 0x30, 0x4f, 0x69, 0x63, 0x5c, 0x0a,\n\t0x09, 0x38, 0x49, 0x4e, 0x56, 0x49, 0x51, 0x4b, 0x63, 0x4f, 0x7a, 0x54, 0x77, 0x48, 0x4c, 0x61, 0x70, 0x36, \n\t0x2f, 0x36, 0x77, 0x63, 0x52, 0x52, 0x44, 0x51, 0x59, 0x78, 0x63, 0x4d, 0x31, 0x48, 0x55, 0x5a, 0x69, 0x57, \n\t0x4a, 0x61, 0x7a, 0x37, 0x66, 0x52, 0x71, 0x75, 0x6a, 0x79, 0x57, 0x68, 0x4a, 0x48, 0x32, 0x75, 0x45, 0x43, \n\t0x79, 0x44, 0x30, 0x58, 0x56, 0x62, 0x78, 0x68, 0x6c, 0x6c, 0x72, 0x4d, 0x58, 0x6f, 0x6f, 0x4e, 0x52, 0x5c, 0x0a,\n\t0x09, 0x58, 0x6e, 0x2f, 0x4b, 0x37, 0x36, 0x2b, 0x33, 0x6d, 0x65, 0x6b, 0x7a, 0x71, 0x58, 0x63, 0x4f, 0x43, \n\t0x4f, 0x72, 0x50, 0x76, 0x4a, 0x74, 0x52, 0x71, 0x51, 0x6f, 0x52, 0x45, 0x63, 0x41, 0x68, 0x34, 0x4a, 0x4e, \n\t0x71, 0x67, 0x6c, 0x78, 0x2b, 0x47, 0x4c, 0x6d, 0x79, 0x4a, 0x77, 0x73, 0x6a, 0x6f, 0x55, 0x44, 0x43, 0x42, \n\t0x43, 0x50, 0x6c, 0x47, 0x61, 0x43, 0x75, 0x58, 0x42, 0x35, 0x54, 0x65, 0x53, 0x59, 0x59, 0x78, 0x65, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x67, 0x68, 0x4a, 0x47, 0x67, 0x4e, 0x78, 0x67, 0x4a, 0x2b, 0x67, 0x41, 0x6a, 0x79, 0x43, 0x54, \n\t0x61, 0x59, 0x4a, 0x53, 0x61, 0x46, 0x46, 0x66, 0x54, 0x52, 0x77, 0x51, 0x6a, 0x64, 0x56, 0x76, 0x55, 0x43, \n\t0x37, 0x64, 0x53, 0x78, 0x6d, 0x70, 0x6b, 0x31, 0x6b, 0x63, 0x4b, 0x49, 0x2b, 0x31, 0x35, 0x6f, 0x4a, 0x49, \n\t0x75, 0x6a, 0x37, 0x63, 0x67, 0x75, 0x59, 0x6b, 0x52, 0x61, 0x2b, 0x51, 0x67, 0x55, 0x71, 0x4b, 0x69, 0x5c, 0x0a,\n\t0x09, 0x44, 0x78, 0x45, 0x4f, 0x30, 0x78, 0x4c, 0x35, 0x4f, 0x32, 0x38, 0x4a, 0x54, 0x30, 0x77, 0x6a, 0x6a, \n\t0x4e, 0x4c, 0x50, 0x44, 0x55, 0x32, 0x65, 0x79, 0x32, 0x4e, 0x38, 0x46, 0x4c, 0x71, 0x42, 0x6b, 0x58, 0x72, \n\t0x53, 0x39, 0x67, 0x49, 0x6a, 0x51, 0x31, 0x6d, 0x62, 0x2b, 0x67, 0x55, 0x6a, 0x66, 0x56, 0x74, 0x53, 0x46, \n\t0x32, 0x4f, 0x56, 0x59, 0x4a, 0x54, 0x64, 0x78, 0x2b, 0x70, 0x5a, 0x7a, 0x75, 0x72, 0x39, 0x52, 0x57, 0x5c, 0x0a,\n\t0x09, 0x32, 0x6d, 0x32, 0x77, 0x69, 0x6a, 0x6f, 0x56, 0x2b, 0x2f, 0x69, 0x31, 0x46, 0x71, 0x35, 0x43, 0x42, \n\t0x53, 0x64, 0x41, 0x39, 0x77, 0x76, 0x70, 0x6f, 0x51, 0x37, 0x4c, 0x38, 0x48, 0x75, 0x58, 0x46, 0x45, 0x69, \n\t0x55, 0x78, 0x4d, 0x4d, 0x47, 0x72, 0x50, 0x2b, 0x2b, 0x53, 0x36, 0x50, 0x48, 0x59, 0x4c, 0x49, 0x7a, 0x55, \n\t0x4b, 0x41, 0x6b, 0x72, 0x42, 0x4b, 0x41, 0x55, 0x78, 0x75, 0x6f, 0x42, 0x52, 0x47, 0x7a, 0x68, 0x68, 0x5c, 0x0a,\n\t0x09, 0x31, 0x72, 0x42, 0x68, 0x31, 0x41, 0x45, 0x6f, 0x4f, 0x52, 0x6f, 0x72, 0x59, 0x37, 0x56, 0x4d, 0x48, \n\t0x35, 0x62, 0x32, 0x43, 0x73, 0x41, 0x6f, 0x71, 0x2b, 0x6a, 0x33, 0x7a, 0x63, 0x78, 0x37, 0x46, 0x65, 0x31, \n\t0x6a, 0x6f, 0x44, 0x41, 0x4b, 0x69, 0x4f, 0x36, 0x57, 0x6a, 0x56, 0x71, 0x56, 0x41, 0x4a, 0x45, 0x53, 0x46, \n\t0x58, 0x30, 0x77, 0x6c, 0x53, 0x45, 0x6c, 0x77, 0x63, 0x35, 0x62, 0x51, 0x6e, 0x67, 0x6b, 0x64, 0x39, 0x5c, 0x0a,\n\t0x09, 0x41, 0x73, 0x4d, 0x49, 0x6f, 0x41, 0x55, 0x79, 0x6e, 0x4c, 0x57, 0x64, 0x54, 0x30, 0x59, 0x63, 0x41, \n\t0x6f, 0x56, 0x56, 0x54, 0x62, 0x35, 0x69, 0x48, 0x41, 0x53, 0x49, 0x38, 0x51, 0x78, 0x67, 0x31, 0x47, 0x36, \n\t0x6e, 0x71, 0x58, 0x4d, 0x4b, 0x71, 0x53, 0x73, 0x56, 0x6f, 0x6d, 0x50, 0x2f, 0x74, 0x62, 0x58, 0x41, 0x49, \n\t0x4d, 0x78, 0x77, 0x75, 0x32, 0x67, 0x79, 0x6f, 0x42, 0x49, 0x6b, 0x56, 0x58, 0x41, 0x4e, 0x65, 0x70, 0x5c, 0x0a,\n\t0x09, 0x43, 0x66, 0x37, 0x75, 0x32, 0x38, 0x42, 0x76, 0x61, 0x54, 0x41, 0x53, 0x75, 0x54, 0x42, 0x53, 0x62, \n\t0x39, 0x64, 0x58, 0x30, 0x6e, 0x49, 0x57, 0x6f, 0x71, 0x46, 0x62, 0x6c, 0x4a, 0x65, 0x4b, 0x75, 0x44, 0x72, \n\t0x44, 0x4b, 0x4b, 0x79, 0x50, 0x55, 0x69, 0x37, 0x4d, 0x36, 0x35, 0x76, 0x4c, 0x6f, 0x77, 0x34, 0x6a, 0x51, \n\t0x54, 0x56, 0x67, 0x6c, 0x47, 0x77, 0x4d, 0x47, 0x6f, 0x7a, 0x30, 0x31, 0x54, 0x37, 0x42, 0x5a, 0x77, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x67, 0x31, 0x4f, 0x47, 0x32, 0x2f, 0x6d, 0x63, 0x42, 0x36, 0x73, 0x2f, 0x36, 0x6f, 0x57, 0x46, \n\t0x37, 0x68, 0x36, 0x76, 0x4b, 0x67, 0x47, 0x6a, 0x68, 0x64, 0x5a, 0x66, 0x47, 0x42, 0x2b, 0x6e, 0x39, 0x71, \n\t0x59, 0x79, 0x67, 0x46, 0x63, 0x34, 0x56, 0x65, 0x58, 0x55, 0x46, 0x52, 0x67, 0x70, 0x45, 0x44, 0x44, 0x43, \n\t0x61, 0x47, 0x4a, 0x64, 0x48, 0x43, 0x34, 0x7a, 0x36, 0x35, 0x76, 0x4b, 0x59, 0x42, 0x79, 0x50, 0x54, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x71, 0x68, 0x68, 0x6c, 0x4c, 0x6d, 0x49, 0x30, 0x7a, 0x76, 0x71, 0x58, 0x42, 0x35, 0x4c, 0x77, \n\t0x57, 0x67, 0x4a, 0x76, 0x4b, 0x39, 0x6b, 0x2b, 0x78, 0x79, 0x4e, 0x4b, 0x67, 0x4f, 0x69, 0x52, 0x4a, 0x4a, \n\t0x2f, 0x52, 0x33, 0x76, 0x41, 0x30, 0x58, 0x2f, 0x6f, 0x5a, 0x70, 0x42, 0x42, 0x42, 0x6b, 0x59, 0x36, 0x63, \n\t0x4f, 0x77, 0x77, 0x47, 0x72, 0x58, 0x4c, 0x6f, 0x77, 0x31, 0x47, 0x58, 0x6d, 0x63, 0x59, 0x4a, 0x66, 0x5c, 0x0a,\n\t0x09, 0x55, 0x6f, 0x42, 0x79, 0x4f, 0x6c, 0x71, 0x72, 0x61, 0x67, 0x4c, 0x57, 0x4f, 0x42, 0x68, 0x4f, 0x55, \n\t0x45, 0x37, 0x52, 0x4a, 0x47, 0x48, 0x65, 0x74, 0x32, 0x6d, 0x72, 0x2b, 0x5a, 0x43, 0x42, 0x67, 0x4a, 0x4a, \n\t0x61, 0x2f, 0x62, 0x50, 0x72, 0x52, 0x4c, 0x74, 0x6e, 0x73, 0x59, 0x6e, 0x59, 0x66, 0x6b, 0x69, 0x41, 0x4f, \n\t0x52, 0x58, 0x54, 0x35, 0x53, 0x69, 0x34, 0x70, 0x61, 0x61, 0x77, 0x53, 0x37, 0x66, 0x67, 0x41, 0x49, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x34, 0x78, 0x53, 0x74, 0x2f, 0x56, 0x37, 0x63, 0x48, 0x6d, 0x30, 0x77, 0x53, 0x68, 0x31, 0x43, \n\t0x39, 0x38, 0x41, 0x49, 0x33, 0x33, 0x5a, 0x43, 0x43, 0x4d, 0x56, 0x57, 0x41, 0x59, 0x59, 0x4a, 0x57, 0x55, \n\t0x30, 0x47, 0x4b, 0x6e, 0x52, 0x56, 0x52, 0x6b, 0x59, 0x35, 0x62, 0x34, 0x4b, 0x6f, 0x69, 0x78, 0x6e, 0x4c, \n\t0x6e, 0x43, 0x79, 0x5a, 0x58, 0x52, 0x31, 0x41, 0x61, 0x50, 0x78, 0x63, 0x48, 0x6c, 0x45, 0x79, 0x31, 0x5c, 0x0a,\n\t0x09, 0x50, 0x37, 0x30, 0x4e, 0x5a, 0x52, 0x31, 0x6f, 0x63, 0x4e, 0x6f, 0x7a, 0x78, 0x76, 0x61, 0x72, 0x32, \n\t0x2b, 0x48, 0x55, 0x61, 0x66, 0x41, 0x61, 0x67, 0x2f, 0x36, 0x77, 0x36, 0x71, 0x6f, 0x45, 0x71, 0x42, 0x61, \n\t0x4f, 0x48, 0x31, 0x79, 0x61, 0x54, 0x31, 0x5a, 0x35, 0x44, 0x73, 0x56, 0x76, 0x50, 0x38, 0x42, 0x32, 0x35, \n\t0x51, 0x67, 0x4f, 0x42, 0x5a, 0x59, 0x42, 0x53, 0x44, 0x78, 0x51, 0x79, 0x6a, 0x74, 0x73, 0x74, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x51, 0x63, 0x74, 0x5a, 0x33, 0x63, 0x73, 0x6f, 0x47, 0x55, 0x35, 0x31, 0x41, 0x79, 0x4d, 0x39, 0x65, \n\t0x74, 0x4a, 0x67, 0x6c, 0x4a, 0x49, 0x4a, 0x52, 0x69, 0x4c, 0x4a, 0x79, 0x6f, 0x57, 0x52, 0x30, 0x73, 0x62, \n\t0x67, 0x4c, 0x47, 0x64, 0x4e, 0x2f, 0x56, 0x6b, 0x30, 0x63, 0x68, 0x67, 0x5a, 0x74, 0x6a, 0x38, 0x58, 0x52, \n\t0x6e, 0x71, 0x65, 0x32, 0x6f, 0x65, 0x74, 0x54, 0x51, 0x4f, 0x4d, 0x31, 0x4f, 0x34, 0x4b, 0x77, 0x63, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x53, 0x70, 0x36, 0x32, 0x50, 0x54, 0x4c, 0x31, 0x53, 0x4d, 0x4c, 0x6f, 0x4c, 0x78, 0x4f, 0x56, \n\t0x55, 0x53, 0x4a, 0x55, 0x43, 0x6b, 0x61, 0x4a, 0x56, 0x34, 0x49, 0x4f, 0x70, 0x6b, 0x33, 0x68, 0x39, 0x69, \n\t0x57, 0x44, 0x50, 0x48, 0x63, 0x70, 0x54, 0x31, 0x68, 0x31, 0x67, 0x31, 0x41, 0x2f, 0x4c, 0x57, 0x51, 0x77, \n\t0x77, 0x45, 0x6c, 0x37, 0x37, 0x35, 0x4d, 0x32, 0x44, 0x55, 0x54, 0x53, 0x63, 0x6d, 0x67, 0x69, 0x58, 0x5c, 0x0a,\n\t0x09, 0x78, 0x36, 0x4c, 0x51, 0x73, 0x57, 0x6b, 0x7a, 0x77, 0x71, 0x6a, 0x62, 0x70, 0x36, 0x38, 0x4c, 0x39, \n\t0x2b, 0x48, 0x31, 0x41, 0x71, 0x4e, 0x50, 0x53, 0x59, 0x6d, 0x30, 0x2f, 0x69, 0x63, 0x7a, 0x41, 0x6c, 0x55, \n\t0x4f, 0x52, 0x45, 0x70, 0x55, 0x39, 0x46, 0x48, 0x67, 0x73, 0x48, 0x71, 0x77, 0x2f, 0x52, 0x33, 0x58, 0x6b, \n\t0x44, 0x79, 0x38, 0x47, 0x4d, 0x4e, 0x49, 0x41, 0x56, 0x41, 0x4b, 0x52, 0x76, 0x32, 0x79, 0x6e, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x57, 0x59, 0x59, 0x61, 0x54, 0x41, 0x78, 0x67, 0x67, 0x6a, 0x35, 0x51, 0x37, 0x64, 0x61, 0x46, 0x30, \n\t0x65, 0x42, 0x77, 0x69, 0x6a, 0x4d, 0x6f, 0x43, 0x71, 0x49, 0x6f, 0x77, 0x79, 0x32, 0x39, 0x63, 0x4a, 0x52, \n\t0x76, 0x72, 0x36, 0x57, 0x4d, 0x4c, 0x49, 0x42, 0x7a, 0x34, 0x4e, 0x67, 0x76, 0x71, 0x7a, 0x62, 0x36, 0x63, \n\t0x71, 0x71, 0x68, 0x79, 0x49, 0x46, 0x42, 0x30, 0x45, 0x7a, 0x67, 0x4b, 0x53, 0x67, 0x79, 0x31, 0x58, 0x5c, 0x0a,\n\t0x09, 0x44, 0x2b, 0x41, 0x2f, 0x66, 0x48, 0x73, 0x49, 0x42, 0x76, 0x55, 0x4f, 0x6d, 0x67, 0x4b, 0x5a, 0x44, \n\t0x49, 0x7a, 0x47, 0x78, 0x75, 0x58, 0x52, 0x41, 0x71, 0x50, 0x6b, 0x47, 0x53, 0x4f, 0x31, 0x54, 0x46, 0x6b, \n\t0x59, 0x73, 0x61, 0x6c, 0x68, 0x31, 0x4a, 0x61, 0x32, 0x62, 0x6e, 0x7a, 0x58, 0x4c, 0x51, 0x39, 0x47, 0x5a, \n\t0x55, 0x47, 0x52, 0x37, 0x61, 0x4d, 0x43, 0x6c, 0x72, 0x4d, 0x58, 0x49, 0x55, 0x55, 0x6c, 0x6e, 0x68, 0x5c, 0x0a,\n\t0x09, 0x31, 0x53, 0x56, 0x55, 0x6b, 0x51, 0x4b, 0x56, 0x48, 0x52, 0x68, 0x77, 0x67, 0x74, 0x5a, 0x5a, 0x4f, \n\t0x44, 0x37, 0x65, 0x2b, 0x34, 0x4b, 0x6f, 0x4b, 0x4d, 0x42, 0x71, 0x50, 0x6b, 0x54, 0x58, 0x7a, 0x50, 0x44, \n\t0x4b, 0x4f, 0x71, 0x75, 0x44, 0x7a, 0x6d, 0x77, 0x6f, 0x67, 0x32, 0x6a, 0x41, 0x53, 0x5a, 0x2f, 0x4d, 0x34, \n\t0x77, 0x77, 0x67, 0x4b, 0x6a, 0x4f, 0x44, 0x72, 0x6f, 0x42, 0x43, 0x4e, 0x6c, 0x47, 0x36, 0x6f, 0x43, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x30, 0x7a, 0x64, 0x38, 0x6a, 0x41, 0x71, 0x37, 0x2f, 0x4a, 0x59, 0x46, 0x6b, 0x61, 0x36, 0x2b, \n\t0x67, 0x30, 0x6a, 0x55, 0x7a, 0x53, 0x6e, 0x70, 0x6e, 0x6d, 0x35, 0x2f, 0x57, 0x6e, 0x6c, 0x7a, 0x77, 0x5a, \n\t0x42, 0x34, 0x7a, 0x6e, 0x62, 0x54, 0x42, 0x73, 0x2b, 0x4d, 0x6c, 0x55, 0x53, 0x52, 0x49, 0x70, 0x32, 0x41, \n\t0x68, 0x39, 0x54, 0x45, 0x2b, 0x53, 0x52, 0x2f, 0x51, 0x52, 0x37, 0x37, 0x69, 0x43, 0x5a, 0x2f, 0x39, 0x5c, 0x0a,\n\t0x09, 0x46, 0x68, 0x46, 0x41, 0x33, 0x5a, 0x52, 0x44, 0x54, 0x5a, 0x62, 0x48, 0x56, 0x35, 0x74, 0x4d, 0x4a, \n\t0x49, 0x41, 0x38, 0x30, 0x67, 0x59, 0x41, 0x51, 0x57, 0x47, 0x4b, 0x6c, 0x52, 0x53, 0x52, 0x36, 0x4d, 0x77, \n\t0x41, 0x79, 0x6a, 0x4b, 0x50, 0x72, 0x71, 0x47, 0x6b, 0x59, 0x61, 0x45, 0x49, 0x63, 0x4a, 0x49, 0x32, 0x76, \n\t0x5a, 0x44, 0x71, 0x41, 0x59, 0x47, 0x49, 0x77, 0x73, 0x35, 0x63, 0x75, 0x41, 0x59, 0x74, 0x41, 0x77, 0x5c, 0x0a,\n\t0x09, 0x53, 0x72, 0x56, 0x52, 0x42, 0x45, 0x59, 0x38, 0x78, 0x41, 0x6a, 0x74, 0x59, 0x50, 0x4e, 0x55, 0x57, \n\t0x52, 0x41, 0x70, 0x55, 0x64, 0x48, 0x37, 0x30, 0x4b, 0x4b, 0x69, 0x31, 0x6a, 0x31, 0x58, 0x6b, 0x72, 0x6f, \n\t0x7a, 0x5a, 0x6f, 0x52, 0x52, 0x72, 0x54, 0x4f, 0x4d, 0x6f, 0x44, 0x63, 0x59, 0x4a, 0x52, 0x47, 0x4f, 0x44, \n\t0x55, 0x61, 0x59, 0x59, 0x5a, 0x53, 0x6b, 0x64, 0x51, 0x73, 0x6a, 0x48, 0x57, 0x61, 0x6b, 0x79, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x47, 0x47, 0x4d, 0x43, 0x6f, 0x36, 0x52, 0x44, 0x50, 0x31, 0x4d, 0x78, 0x41, 0x59, 0x32, 0x55, 0x46, \n\t0x52, 0x43, 0x6b, 0x59, 0x35, 0x62, 0x51, 0x37, 0x66, 0x63, 0x6c, 0x5a, 0x38, 0x41, 0x6b, 0x62, 0x72, 0x4f, \n\t0x32, 0x52, 0x54, 0x5a, 0x55, 0x47, 0x6b, 0x4b, 0x42, 0x30, 0x56, 0x53, 0x5a, 0x41, 0x72, 0x65, 0x39, 0x71, \n\t0x66, 0x48, 0x6f, 0x6f, 0x68, 0x6b, 0x67, 0x65, 0x6a, 0x2b, 0x4a, 0x62, 0x2b, 0x79, 0x43, 0x78, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x31, 0x54, 0x59, 0x47, 0x43, 0x43, 0x4f, 0x55, 0x63, 0x69, 0x67, 0x77, 0x55, 0x72, 0x64, 0x68, 0x59, \n\t0x6d, 0x42, 0x6b, 0x67, 0x4e, 0x4d, 0x6f, 0x59, 0x57, 0x52, 0x71, 0x4c, 0x37, 0x55, 0x74, 0x35, 0x6a, 0x61, \n\t0x48, 0x61, 0x42, 0x2f, 0x69, 0x41, 0x35, 0x38, 0x41, 0x51, 0x65, 0x4f, 0x35, 0x74, 0x32, 0x61, 0x33, 0x63, \n\t0x38, 0x53, 0x71, 0x4e, 0x49, 0x69, 0x55, 0x71, 0x4f, 0x69, 0x66, 0x67, 0x57, 0x61, 0x53, 0x49, 0x61, 0x5c, 0x0a,\n\t0x09, 0x46, 0x31, 0x39, 0x33, 0x65, 0x79, 0x38, 0x30, 0x4f, 0x70, 0x75, 0x53, 0x45, 0x46, 0x52, 0x6b, 0x55, \n\t0x74, 0x5a, 0x31, 0x58, 0x41, 0x62, 0x43, 0x61, 0x58, 0x78, 0x35, 0x51, 0x4d, 0x4d, 0x49, 0x71, 0x4f, 0x75, \n\t0x56, 0x45, 0x4f, 0x52, 0x75, 0x62, 0x2b, 0x31, 0x50, 0x4c, 0x56, 0x67, 0x4e, 0x45, 0x46, 0x53, 0x42, 0x36, \n\t0x6b, 0x6f, 0x71, 0x6f, 0x30, 0x69, 0x47, 0x4c, 0x4a, 0x38, 0x41, 0x42, 0x2b, 0x4b, 0x70, 0x57, 0x32, 0x5c, 0x0a,\n\t0x09, 0x76, 0x49, 0x64, 0x67, 0x31, 0x36, 0x31, 0x51, 0x71, 0x35, 0x4f, 0x61, 0x76, 0x42, 0x5a, 0x65, 0x47, \n\t0x7a, 0x59, 0x36, 0x6a, 0x43, 0x72, 0x6a, 0x38, 0x6d, 0x69, 0x44, 0x6b, 0x66, 0x6f, 0x59, 0x77, 0x4f, 0x42, \n\t0x68, 0x4a, 0x4b, 0x46, 0x39, 0x55, 0x61, 0x54, 0x4f, 0x37, 0x54, 0x47, 0x48, 0x55, 0x57, 0x59, 0x35, 0x65, \n\t0x2b, 0x46, 0x75, 0x51, 0x68, 0x69, 0x64, 0x42, 0x64, 0x42, 0x34, 0x37, 0x67, 0x2b, 0x6f, 0x6f, 0x69, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x50, 0x6f, 0x6a, 0x67, 0x71, 0x6b, 0x70, 0x4c, 0x33, 0x6f, 0x6b, 0x5a, 0x46, 0x51, 0x4f, 0x75, \n\t0x75, 0x79, 0x77, 0x48, 0x50, 0x41, 0x4b, 0x4e, 0x34, 0x47, 0x43, 0x62, 0x4d, 0x4d, 0x42, 0x49, 0x4b, 0x4a, \n\t0x48, 0x4a, 0x63, 0x48, 0x75, 0x30, 0x77, 0x30, 0x69, 0x61, 0x71, 0x54, 0x54, 0x42, 0x4b, 0x37, 0x6e, 0x37, \n\t0x5a, 0x59, 0x4e, 0x52, 0x4f, 0x72, 0x36, 0x62, 0x6c, 0x4c, 0x42, 0x67, 0x54, 0x75, 0x77, 0x52, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x62, 0x49, 0x39, 0x77, 0x79, 0x67, 0x44, 0x69, 0x69, 0x69, 0x74, 0x55, 0x6c, 0x35, 0x47, 0x5a, \n\t0x4e, 0x59, 0x48, 0x43, 0x4b, 0x4f, 0x37, 0x67, 0x45, 0x73, 0x73, 0x50, 0x33, 0x41, 0x6c, 0x56, 0x48, 0x6b, \n\t0x51, 0x4b, 0x62, 0x70, 0x50, 0x53, 0x73, 0x35, 0x55, 0x45, 0x2b, 0x53, 0x52, 0x2f, 0x66, 0x67, 0x50, 0x33, \n\t0x6f, 0x41, 0x64, 0x52, 0x76, 0x55, 0x4f, 0x4d, 0x45, 0x71, 0x2f, 0x45, 0x74, 0x4a, 0x58, 0x79, 0x31, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x31, 0x71, 0x6a, 0x48, 0x43, 0x4b, 0x45, 0x34, 0x48, 0x49, 0x34, 0x77, 0x45, 0x76, 0x63, 0x46, \n\t0x49, 0x6b, 0x44, 0x6c, 0x68, 0x75, 0x7a, 0x64, 0x57, 0x30, 0x31, 0x51, 0x6d, 0x41, 0x68, 0x6f, 0x56, 0x6a, \n\t0x4e, 0x54, 0x35, 0x73, 0x63, 0x72, 0x43, 0x4b, 0x4c, 0x75, 0x50, 0x41, 0x33, 0x4a, 0x35, 0x50, 0x41, 0x4e, \n\t0x5a, 0x36, 0x70, 0x63, 0x59, 0x75, 0x73, 0x59, 0x43, 0x52, 0x49, 0x74, 0x76, 0x61, 0x4e, 0x39, 0x42, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x35, 0x49, 0x56, 0x4e, 0x63, 0x2f, 0x66, 0x66, 0x6c, 0x6d, 0x30, 0x31, 0x41, 0x46, 0x47, 0x4d, \n\t0x5a, 0x41, 0x32, 0x6e, 0x65, 0x56, 0x73, 0x47, 0x7a, 0x68, 0x68, 0x56, 0x6c, 0x6b, 0x59, 0x53, 0x59, 0x78, \n\t0x45, 0x47, 0x42, 0x53, 0x4d, 0x55, 0x74, 0x56, 0x36, 0x67, 0x46, 0x48, 0x71, 0x62, 0x71, 0x47, 0x32, 0x44, \n\t0x57, 0x4d, 0x4b, 0x6f, 0x79, 0x35, 0x66, 0x6b, 0x6a, 0x30, 0x43, 0x33, 0x71, 0x64, 0x42, 0x30, 0x48, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x65, 0x39, 0x36, 0x6d, 0x71, 0x78, 0x67, 0x4a, 0x45, 0x69, 0x6e, 0x59, 0x43, 0x48, 0x31, 0x46, \n\t0x50, 0x48, 0x4c, 0x6d, 0x2b, 0x68, 0x50, 0x2f, 0x41, 0x64, 0x64, 0x45, 0x64, 0x73, 0x42, 0x67, 0x4d, 0x42, \n\t0x68, 0x6a, 0x46, 0x45, 0x39, 0x5a, 0x43, 0x30, 0x4a, 0x50, 0x6c, 0x62, 0x41, 0x79, 0x50, 0x59, 0x62, 0x6b, \n\t0x38, 0x70, 0x74, 0x4a, 0x48, 0x41, 0x4b, 0x4d, 0x67, 0x5a, 0x53, 0x4f, 0x65, 0x31, 0x69, 0x42, 0x67, 0x5c, 0x0a,\n\t0x09, 0x70, 0x46, 0x2b, 0x55, 0x66, 0x59, 0x64, 0x52, 0x66, 0x42, 0x45, 0x50, 0x43, 0x45, 0x62, 0x71, 0x65, \n\t0x67, 0x38, 0x77, 0x79, 0x71, 0x70, 0x72, 0x47, 0x4a, 0x32, 0x44, 0x35, 0x47, 0x41, 0x32, 0x76, 0x31, 0x6f, \n\t0x61, 0x47, 0x78, 0x41, 0x70, 0x55, 0x64, 0x45, 0x2f, 0x41, 0x59, 0x66, 0x55, 0x33, 0x38, 0x33, 0x66, 0x66, \n\t0x68, 0x6b, 0x79, 0x38, 0x43, 0x4f, 0x34, 0x31, 0x4e, 0x74, 0x77, 0x4d, 0x4d, 0x46, 0x6f, 0x55, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x77, 0x65, 0x68, 0x61, 0x41, 0x58, 0x6c, 0x38, 0x66, 0x69, 0x6c, 0x72, 0x4d, 0x35, 0x49, 0x46, 0x4c, \n\t0x4c, 0x64, 0x6b, 0x72, 0x4c, 0x53, 0x2b, 0x39, 0x51, 0x62, 0x71, 0x78, 0x67, 0x31, 0x46, 0x33, 0x55, 0x6b, \n\t0x6c, 0x6e, 0x76, 0x6f, 0x38, 0x76, 0x6a, 0x68, 0x77, 0x45, 0x61, 0x76, 0x33, 0x47, 0x7a, 0x6f, 0x62, 0x33, \n\t0x71, 0x61, 0x47, 0x78, 0x41, 0x70, 0x47, 0x67, 0x2f, 0x38, 0x41, 0x46, 0x6b, 0x2b, 0x2f, 0x6a, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x52, 0x58, 0x38, 0x75, 0x2f, 0x38, 0x4c, 0x76, 0x4c, 0x6f, 0x43, 0x6f, 0x2f, 0x61, 0x6b, 0x74, \n\t0x42, 0x6c, 0x47, 0x43, 0x6b, 0x51, 0x47, 0x36, 0x76, 0x49, 0x34, 0x51, 0x42, 0x68, 0x68, 0x68, 0x70, 0x47, \n\t0x4d, 0x38, 0x35, 0x4c, 0x36, 0x5a, 0x68, 0x69, 0x46, 0x42, 0x77, 0x2b, 0x6c, 0x58, 0x4a, 0x69, 0x58, 0x58, \n\t0x50, 0x67, 0x53, 0x37, 0x57, 0x4b, 0x31, 0x61, 0x4e, 0x78, 0x67, 0x42, 0x4a, 0x68, 0x68, 0x70, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x32, 0x4b, 0x52, 0x49, 0x61, 0x48, 0x59, 0x79, 0x2b, 0x44, 0x56, 0x54, 0x76, 0x6f, 0x53, 0x47, \n\t0x44, 0x78, 0x67, 0x70, 0x45, 0x53, 0x6c, 0x54, 0x30, 0x66, 0x34, 0x42, 0x39, 0x4b, 0x6f, 0x78, 0x61, 0x39, \n\t0x2f, 0x77, 0x58, 0x63, 0x6d, 0x4d, 0x6c, 0x43, 0x36, 0x4e, 0x6f, 0x6a, 0x6b, 0x6a, 0x45, 0x30, 0x59, 0x72, \n\t0x4e, 0x35, 0x62, 0x46, 0x62, 0x47, 0x47, 0x6c, 0x33, 0x7a, 0x38, 0x77, 0x77, 0x6f, 0x67, 0x4f, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x47, 0x6a, 0x70, 0x4d, 0x41, 0x4b, 0x4d, 0x4d, 0x49, 0x72, 0x2f, 0x53, 0x76, 0x4a, 0x68, 0x6c, \n\t0x4e, 0x51, 0x6a, 0x42, 0x61, 0x4f, 0x4f, 0x4c, 0x6f, 0x39, 0x42, 0x69, 0x59, 0x64, 0x77, 0x68, 0x77, 0x43, \n\t0x6a, 0x6a, 0x6e, 0x55, 0x37, 0x7a, 0x64, 0x38, 0x55, 0x65, 0x4d, 0x59, 0x6f, 0x74, 0x61, 0x71, 0x33, 0x6f, \n\t0x66, 0x63, 0x68, 0x44, 0x66, 0x6c, 0x44, 0x67, 0x5a, 0x47, 0x32, 0x32, 0x66, 0x59, 0x2b, 0x50, 0x67, 0x5c, 0x0a,\n\t0x09, 0x53, 0x43, 0x78, 0x6d, 0x39, 0x57, 0x4f, 0x78, 0x71, 0x43, 0x4d, 0x51, 0x4f, 0x52, 0x6f, 0x6d, 0x58, \n\t0x67, 0x50, 0x51, 0x41, 0x4a, 0x6a, 0x50, 0x77, 0x6d, 0x72, 0x54, 0x73, 0x76, 0x69, 0x55, 0x42, 0x6a, 0x67, \n\t0x4a, 0x46, 0x58, 0x36, 0x77, 0x79, 0x6a, 0x35, 0x4a, 0x38, 0x4e, 0x52, 0x71, 0x4f, 0x32, 0x6e, 0x46, 0x58, \n\t0x4c, 0x71, 0x44, 0x44, 0x79, 0x74, 0x4a, 0x4e, 0x51, 0x67, 0x35, 0x45, 0x4b, 0x74, 0x44, 0x49, 0x77, 0x5c, 0x0a,\n\t0x09, 0x4b, 0x68, 0x49, 0x4e, 0x71, 0x52, 0x6f, 0x77, 0x6a, 0x4a, 0x7a, 0x4c, 0x59, 0x37, 0x5a, 0x2b, 0x44, \n\t0x6f, 0x78, 0x2b, 0x43, 0x46, 0x78, 0x6f, 0x33, 0x72, 0x44, 0x71, 0x61, 0x65, 0x78, 0x41, 0x31, 0x49, 0x36, \n\t0x4b, 0x78, 0x45, 0x65, 0x42, 0x38, 0x42, 0x75, 0x35, 0x45, 0x59, 0x7a, 0x38, 0x2b, 0x37, 0x2b, 0x48, 0x58, \n\t0x48, 0x34, 0x34, 0x67, 0x6b, 0x67, 0x4f, 0x6a, 0x42, 0x42, 0x6d, 0x47, 0x50, 0x58, 0x4c, 0x63, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x59, 0x46, 0x6d, 0x7a, 0x46, 0x30, 0x65, 0x55, 0x78, 0x67, 0x46, 0x42, 0x51, 0x61, 0x6d, 0x58, 0x58, \n\t0x55, 0x32, 0x4d, 0x50, 0x49, 0x41, 0x4a, 0x70, 0x68, 0x75, 0x44, 0x79, 0x57, 0x68, 0x6c, 0x47, 0x71, 0x7a, \n\t0x77, 0x38, 0x68, 0x4f, 0x30, 0x33, 0x77, 0x56, 0x55, 0x64, 0x6a, 0x42, 0x36, 0x4a, 0x51, 0x41, 0x70, 0x41, \n\t0x62, 0x49, 0x4e, 0x36, 0x65, 0x4a, 0x45, 0x6d, 0x51, 0x55, 0x74, 0x4c, 0x63, 0x64, 0x70, 0x45, 0x79, 0x5c, 0x0a,\n\t0x09, 0x59, 0x56, 0x30, 0x7a, 0x77, 0x79, 0x69, 0x65, 0x5a, 0x42, 0x36, 0x47, 0x79, 0x32, 0x50, 0x30, 0x32, \n\t0x4d, 0x42, 0x67, 0x58, 0x42, 0x35, 0x74, 0x4d, 0x45, 0x72, 0x6e, 0x64, 0x77, 0x57, 0x6a, 0x38, 0x49, 0x43, \n\t0x47, 0x53, 0x32, 0x56, 0x67, 0x31, 0x43, 0x74, 0x30, 0x43, 0x72, 0x53, 0x37, 0x71, 0x57, 0x43, 0x6b, 0x64, \n\t0x6c, 0x66, 0x38, 0x4a, 0x64, 0x6e, 0x39, 0x79, 0x4e, 0x44, 0x38, 0x72, 0x50, 0x47, 0x62, 0x49, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x61, 0x64, 0x43, 0x47, 0x4e, 0x4a, 0x59, 0x67, 0x57, 0x33, 0x2f, 0x42, 0x74, 0x6f, 0x6f, 0x4e, \n\t0x2b, 0x4c, 0x6f, 0x6a, 0x76, 0x4a, 0x52, 0x6b, 0x53, 0x2f, 0x4e, 0x33, 0x62, 0x43, 0x50, 0x62, 0x64, 0x72, \n\t0x64, 0x79, 0x79, 0x6a, 0x79, 0x4d, 0x62, 0x41, 0x34, 0x77, 0x71, 0x34, 0x2f, 0x4a, 0x6f, 0x67, 0x56, 0x45, \n\t0x79, 0x33, 0x4d, 0x75, 0x44, 0x45, 0x52, 0x31, 0x67, 0x52, 0x4a, 0x63, 0x77, 0x79, 0x70, 0x76, 0x45, 0x5c, 0x0a,\n\t0x09, 0x37, 0x61, 0x41, 0x79, 0x4d, 0x4f, 0x71, 0x79, 0x33, 0x63, 0x72, 0x41, 0x4b, 0x4c, 0x4e, 0x39, 0x6e, \n\t0x57, 0x43, 0x6b, 0x72, 0x33, 0x65, 0x41, 0x55, 0x58, 0x65, 0x76, 0x67, 0x6e, 0x77, 0x55, 0x4f, 0x4a, 0x4b, \n\t0x2f, 0x73, 0x64, 0x58, 0x53, 0x57, 0x49, 0x4a, 0x49, 0x6b, 0x51, 0x54, 0x2b, 0x54, 0x50, 0x2f, 0x42, 0x6d, \n\t0x7a, 0x38, 0x34, 0x50, 0x34, 0x52, 0x49, 0x41, 0x70, 0x30, 0x6f, 0x51, 0x6b, 0x72, 0x65, 0x51, 0x64, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x67, 0x56, 0x4e, 0x54, 0x6c, 0x73, 0x56, 0x73, 0x59, 0x78, 0x52, 0x48, 0x51, 0x4f, 0x46, 0x6e, \n\t0x4f, 0x42, 0x74, 0x6b, 0x72, 0x33, 0x4d, 0x46, 0x49, 0x71, 0x36, 0x2b, 0x33, 0x62, 0x2b, 0x6f, 0x6a, 0x41, \n\t0x36, 0x4f, 0x63, 0x53, 0x45, 0x6d, 0x74, 0x30, 0x7a, 0x32, 0x4d, 0x6d, 0x69, 0x41, 0x2b, 0x41, 0x74, 0x42, \n\t0x34, 0x2f, 0x6f, 0x32, 0x4d, 0x69, 0x38, 0x59, 0x57, 0x52, 0x47, 0x46, 0x55, 0x42, 0x4d, 0x42, 0x33, 0x5c, 0x0a,\n\t0x09, 0x67, 0x41, 0x76, 0x56, 0x48, 0x79, 0x4d, 0x34, 0x74, 0x42, 0x4e, 0x2f, 0x78, 0x39, 0x58, 0x4a, 0x78, \n\t0x48, 0x55, 0x62, 0x52, 0x76, 0x56, 0x38, 0x47, 0x43, 0x6c, 0x33, 0x7a, 0x73, 0x62, 0x58, 0x63, 0x6a, 0x5a, \n\t0x75, 0x51, 0x78, 0x2f, 0x69, 0x52, 0x52, 0x64, 0x55, 0x30, 0x72, 0x59, 0x4e, 0x52, 0x6f, 0x51, 0x77, 0x6b, \n\t0x6f, 0x48, 0x78, 0x41, 0x68, 0x39, 0x4c, 0x47, 0x47, 0x58, 0x71, 0x64, 0x67, 0x65, 0x6a, 0x74, 0x69, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x4e, 0x6f, 0x33, 0x4f, 0x6b, 0x5a, 0x47, 0x66, 0x48, 0x36, 0x4b, 0x31, 0x69, 0x47, 0x6c, 0x73, \n\t0x51, 0x51, 0x51, 0x70, 0x47, 0x62, 0x77, 0x56, 0x61, 0x36, 0x73, 0x46, 0x76, 0x33, 0x6e, 0x6f, 0x68, 0x2b, \n\t0x42, 0x74, 0x5a, 0x47, 0x48, 0x6b, 0x52, 0x6a, 0x42, 0x44, 0x35, 0x4d, 0x4b, 0x71, 0x36, 0x35, 0x53, 0x78, \n\t0x59, 0x59, 0x4b, 0x54, 0x6d, 0x52, 0x58, 0x41, 0x7a, 0x77, 0x67, 0x6a, 0x4d, 0x4d, 0x4e, 0x49, 0x75, 0x5c, 0x0a,\n\t0x09, 0x77, 0x6e, 0x47, 0x43, 0x6b, 0x62, 0x56, 0x73, 0x42, 0x31, 0x41, 0x55, 0x68, 0x4e, 0x46, 0x67, 0x58, \n\t0x52, 0x35, 0x4e, 0x4b, 0x67, 0x30, 0x6a, 0x53, 0x57, 0x69, 0x5a, 0x51, 0x2b, 0x50, 0x35, 0x4e, 0x39, 0x67, \n\t0x61, 0x72, 0x61, 0x54, 0x47, 0x47, 0x6b, 0x53, 0x4a, 0x70, 0x4e, 0x77, 0x47, 0x6e, 0x42, 0x47, 0x75, 0x52, \n\t0x42, 0x66, 0x62, 0x78, 0x68, 0x47, 0x61, 0x32, 0x2f, 0x34, 0x7a, 0x50, 0x4d, 0x46, 0x55, 0x47, 0x49, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x6f, 0x75, 0x56, 0x59, 0x6e, 0x75, 0x64, 0x43, 0x74, 0x4c, 0x6f, 0x38, 0x46, 0x4c, 0x47, 0x66, \n\t0x42, 0x41, 0x69, 0x4d, 0x4e, 0x4e, 0x44, 0x59, 0x59, 0x70, 0x65, 0x61, 0x49, 0x54, 0x44, 0x44, 0x43, 0x44, \n\t0x4b, 0x4d, 0x6b, 0x72, 0x51, 0x4f, 0x4d, 0x75, 0x6e, 0x5a, 0x35, 0x56, 0x47, 0x36, 0x34, 0x6a, 0x41, 0x75, \n\t0x4d, 0x69, 0x67, 0x37, 0x52, 0x6b, 0x72, 0x71, 0x44, 0x68, 0x6c, 0x46, 0x4f, 0x4a, 0x47, 0x57, 0x45, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x51, 0x6d, 0x6f, 0x2b, 0x57, 0x31, 0x71, 0x4d, 0x44, 0x6f, 0x66, 0x71, 0x4d, 0x36, 0x6e, 0x4f, \n\t0x55, 0x70, 0x6f, 0x37, 0x45, 0x47, 0x55, 0x52, 0x45, 0x56, 0x53, 0x76, 0x68, 0x76, 0x59, 0x46, 0x36, 0x36, \n\t0x45, 0x50, 0x30, 0x37, 0x72, 0x72, 0x73, 0x75, 0x52, 0x4b, 0x33, 0x76, 0x62, 0x46, 0x37, 0x6f, 0x4a, 0x52, \n\t0x6d, 0x50, 0x6a, 0x38, 0x6a, 0x67, 0x6b, 0x47, 0x4d, 0x58, 0x48, 0x72, 0x77, 0x42, 0x70, 0x4a, 0x67, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x47, 0x32, 0x6e, 0x6f, 0x56, 0x59, 0x64, 0x53, 0x68, 0x54, 0x51, 0x56, 0x47, 0x37, 0x77, 0x50, \n\t0x42, 0x31, 0x41, 0x76, 0x47, 0x4b, 0x78, 0x71, 0x43, 0x43, 0x51, 0x43, 0x52, 0x6f, 0x67, 0x4e, 0x49, 0x2b, \n\t0x61, 0x37, 0x32, 0x71, 0x67, 0x41, 0x5a, 0x30, 0x4c, 0x7a, 0x35, 0x50, 0x4b, 0x67, 0x31, 0x6c, 0x50, 0x6b, \n\t0x66, 0x7a, 0x77, 0x79, 0x6a, 0x6f, 0x62, 0x6b, 0x38, 0x39, 0x67, 0x49, 0x6a, 0x46, 0x57, 0x67, 0x44, 0x5c, 0x0a,\n\t0x09, 0x68, 0x46, 0x45, 0x4a, 0x4f, 0x49, 0x77, 0x2f, 0x6a, 0x41, 0x78, 0x77, 0x47, 0x69, 0x57, 0x4d, 0x54, \n\t0x4f, 0x32, 0x6c, 0x74, 0x73, 0x58, 0x63, 0x70, 0x70, 0x54, 0x69, 0x55, 0x69, 0x6d, 0x35, 0x4e, 0x6c, 0x74, \n\t0x78, 0x50, 0x44, 0x51, 0x52, 0x49, 0x46, 0x70, 0x38, 0x34, 0x36, 0x58, 0x78, 0x34, 0x69, 0x65, 0x51, 0x55, \n\t0x72, 0x47, 0x67, 0x45, 0x2f, 0x69, 0x37, 0x62, 0x38, 0x4e, 0x2f, 0x38, 0x4b, 0x59, 0x32, 0x6a, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x6e, 0x6a, 0x49, 0x51, 0x52, 0x52, 0x6d, 0x32, 0x58, 0x52, 0x77, 0x75, 0x4d, 0x34, 0x6d, 0x65, \n\t0x51, 0x62, 0x44, 0x41, 0x53, 0x58, 0x67, 0x45, 0x59, 0x4b, 0x63, 0x4d, 0x31, 0x49, 0x34, 0x78, 0x69, 0x4b, \n\t0x42, 0x6a, 0x75, 0x6b, 0x68, 0x57, 0x43, 0x45, 0x55, 0x72, 0x5a, 0x62, 0x6d, 0x41, 0x6b, 0x79, 0x38, 0x46, \n\t0x68, 0x4d, 0x38, 0x47, 0x49, 0x39, 0x76, 0x72, 0x6f, 0x6a, 0x64, 0x56, 0x53, 0x5a, 0x61, 0x4a, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x36, 0x48, 0x72, 0x47, 0x55, 0x52, 0x4d, 0x42, 0x49, 0x6b, 0x55, 0x74, 0x34, 0x45, 0x33, 0x36, 0x66, \n\t0x39, 0x50, 0x4e, 0x6d, 0x38, 0x34, 0x46, 0x76, 0x35, 0x57, 0x47, 0x55, 0x66, 0x49, 0x4f, 0x57, 0x68, 0x36, \n\t0x4d, 0x50, 0x48, 0x4a, 0x68, 0x46, 0x41, 0x2f, 0x58, 0x52, 0x6d, 0x59, 0x35, 0x32, 0x30, 0x37, 0x76, 0x72, \n\t0x38, 0x74, 0x6a, 0x70, 0x49, 0x4a, 0x77, 0x6b, 0x4c, 0x61, 0x79, 0x4e, 0x67, 0x32, 0x68, 0x37, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x41, 0x73, 0x5a, 0x79, 0x76, 0x6c, 0x5a, 0x5a, 0x53, 0x55, 0x76, 0x51, 0x62, 0x4a, 0x78, 0x59, 0x79, \n\t0x78, 0x4a, 0x67, 0x5a, 0x45, 0x53, 0x6c, 0x54, 0x30, 0x62, 0x65, 0x44, 0x38, 0x56, 0x42, 0x69, 0x39, 0x65, \n\t0x70, 0x44, 0x6d, 0x62, 0x52, 0x65, 0x46, 0x6f, 0x44, 0x44, 0x42, 0x43, 0x47, 0x47, 0x42, 0x55, 0x54, 0x77, \n\t0x6e, 0x4a, 0x4d, 0x77, 0x77, 0x45, 0x67, 0x6f, 0x6b, 0x42, 0x75, 0x48, 0x79, 0x6d, 0x4d, 0x6f, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x77, 0x53, 0x68, 0x4f, 0x44, 0x2f, 0x65, 0x7a, 0x62, 0x38, 0x5a, 0x71, 0x71, 0x6f, 0x59, 0x4a, 0x6f, \n\t0x7a, 0x35, 0x48, 0x58, 0x4a, 0x76, 0x49, 0x35, 0x66, 0x46, 0x76, 0x41, 0x4b, 0x5a, 0x2f, 0x36, 0x7a, 0x72, \n\t0x47, 0x56, 0x52, 0x4d, 0x44, 0x49, 0x6b, 0x6a, 0x42, 0x36, 0x45, 0x33, 0x41, 0x45, 0x52, 0x56, 0x47, 0x72, \n\t0x54, 0x73, 0x76, 0x49, 0x54, 0x69, 0x38, 0x32, 0x77, 0x77, 0x6a, 0x72, 0x78, 0x37, 0x43, 0x79, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x38, 0x4f, 0x68, 0x69, 0x4e, 0x6e, 0x38, 0x76, 0x6a, 0x54, 0x63, 0x44, 0x58, 0x47, 0x58, 0x4e, \n\t0x4e, 0x46, 0x49, 0x67, 0x55, 0x33, 0x55, 0x2f, 0x79, 0x64, 0x6e, 0x37, 0x38, 0x50, 0x49, 0x78, 0x6b, 0x34, \n\t0x2f, 0x72, 0x2f, 0x52, 0x2f, 0x4b, 0x77, 0x6f, 0x67, 0x6c, 0x47, 0x36, 0x69, 0x73, 0x66, 0x6f, 0x33, 0x52, \n\t0x35, 0x74, 0x4d, 0x46, 0x49, 0x70, 0x4b, 0x46, 0x52, 0x43, 0x6b, 0x62, 0x64, 0x7a, 0x42, 0x6d, 0x70, 0x5c, 0x0a,\n\t0x09, 0x47, 0x6a, 0x63, 0x59, 0x70, 0x61, 0x72, 0x31, 0x47, 0x30, 0x59, 0x78, 0x4b, 0x41, 0x59, 0x45, 0x49, \n\t0x33, 0x57, 0x39, 0x4d, 0x34, 0x7a, 0x65, 0x6a, 0x52, 0x52, 0x4d, 0x2f, 0x2f, 0x62, 0x34, 0x52, 0x6b, 0x4d, \n\t0x77, 0x67, 0x53, 0x42, 0x53, 0x6f, 0x71, 0x4c, 0x2f, 0x43, 0x34, 0x51, 0x66, 0x2b, 0x49, 0x37, 0x4f, 0x6b, \n\t0x47, 0x44, 0x50, 0x44, 0x32, 0x6e, 0x64, 0x65, 0x31, 0x55, 0x49, 0x6e, 0x52, 0x67, 0x45, 0x4a, 0x68, 0x5c, 0x0a,\n\t0x09, 0x67, 0x56, 0x64, 0x6e, 0x6d, 0x30, 0x77, 0x43, 0x67, 0x43, 0x6a, 0x42, 0x56, 0x47, 0x6f, 0x67, 0x43, \n\t0x4d, 0x49, 0x42, 0x39, 0x47, 0x69, 0x63, 0x77, 0x77, 0x53, 0x73, 0x30, 0x6a, 0x6c, 0x66, 0x31, 0x4d, 0x6b, \n\t0x65, 0x32, 0x36, 0x48, 0x53, 0x63, 0x59, 0x53, 0x58, 0x31, 0x31, 0x6a, 0x47, 0x43, 0x55, 0x75, 0x56, 0x74, \n\t0x6e, 0x61, 0x51, 0x39, 0x78, 0x45, 0x35, 0x4b, 0x76, 0x4d, 0x67, 0x47, 0x61, 0x4f, 0x42, 0x41, 0x70, 0x5c, 0x0a,\n\t0x09, 0x61, 0x67, 0x4a, 0x76, 0x54, 0x4e, 0x61, 0x69, 0x4d, 0x36, 0x52, 0x35, 0x30, 0x37, 0x6e, 0x49, 0x6a, \n\t0x53, 0x4d, 0x52, 0x64, 0x4f, 0x6f, 0x64, 0x59, 0x4e, 0x51, 0x47, 0x79, 0x38, 0x52, 0x61, 0x7a, 0x67, 0x4a, \n\t0x5a, 0x6c, 0x38, 0x65, 0x63, 0x30, 0x38, 0x4c, 0x42, 0x53, 0x4a, 0x45, 0x4a, 0x52, 0x76, 0x70, 0x71, 0x6e, \n\t0x79, 0x49, 0x68, 0x4d, 0x34, 0x7a, 0x65, 0x54, 0x62, 0x6d, 0x6a, 0x58, 0x46, 0x6c, 0x4e, 0x4a, 0x49, 0x5c, 0x0a,\n\t0x09, 0x69, 0x30, 0x69, 0x65, 0x76, 0x50, 0x4a, 0x78, 0x6c, 0x53, 0x49, 0x74, 0x65, 0x58, 0x61, 0x64, 0x37, \n\t0x77, 0x62, 0x77, 0x70, 0x30, 0x36, 0x6d, 0x32, 0x49, 0x35, 0x4d, 0x46, 0x49, 0x6a, 0x4e, 0x70, 0x79, 0x56, \n\t0x69, 0x2b, 0x6a, 0x41, 0x30, 0x4d, 0x42, 0x6a, 0x41, 0x6c, 0x47, 0x67, 0x42, 0x46, 0x47, 0x38, 0x56, 0x2b, \n\t0x4a, 0x45, 0x6b, 0x32, 0x46, 0x35, 0x61, 0x78, 0x6e, 0x75, 0x49, 0x4f, 0x52, 0x41, 0x52, 0x51, 0x79, 0x5c, 0x0a,\n\t0x09, 0x74, 0x54, 0x34, 0x45, 0x6c, 0x38, 0x66, 0x76, 0x41, 0x56, 0x38, 0x46, 0x77, 0x66, 0x51, 0x4c, 0x76, \n\t0x38, 0x65, 0x34, 0x61, 0x79, 0x4a, 0x42, 0x42, 0x43, 0x6b, 0x59, 0x2f, 0x52, 0x6c, 0x77, 0x4b, 0x4d, 0x6d, \n\t0x51, 0x6b, 0x74, 0x61, 0x4f, 0x71, 0x2f, 0x46, 0x33, 0x66, 0x6a, 0x38, 0x4e, 0x6f, 0x35, 0x6f, 0x36, 0x48, \n\t0x4c, 0x4f, 0x34, 0x50, 0x49, 0x6f, 0x43, 0x6c, 0x72, 0x50, 0x4a, 0x50, 0x78, 0x75, 0x4d, 0x4b, 0x75, 0x5c, 0x0a,\n\t0x09, 0x37, 0x79, 0x4b, 0x43, 0x43, 0x5a, 0x78, 0x36, 0x4a, 0x50, 0x4d, 0x43, 0x71, 0x6a, 0x49, 0x63, 0x43, \n\t0x6f, 0x59, 0x39, 0x33, 0x78, 0x73, 0x4a, 0x7a, 0x39, 0x4b, 0x37, 0x6f, 0x34, 0x76, 0x46, 0x58, 0x56, 0x78, \n\t0x49, 0x4a, 0x49, 0x30, 0x55, 0x37, 0x67, 0x7a, 0x31, 0x4d, 0x70, 0x55, 0x72, 0x4a, 0x78, 0x37, 0x57, 0x64, \n\t0x43, 0x54, 0x32, 0x59, 0x64, 0x52, 0x6c, 0x34, 0x61, 0x53, 0x4a, 0x56, 0x31, 0x65, 0x62, 0x54, 0x42, 0x5c, 0x0a,\n\t0x09, 0x53, 0x46, 0x2f, 0x4f, 0x77, 0x45, 0x67, 0x48, 0x6c, 0x67, 0x46, 0x47, 0x6b, 0x49, 0x71, 0x6b, 0x65, \n\t0x6f, 0x5a, 0x52, 0x32, 0x63, 0x74, 0x6c, 0x77, 0x44, 0x43, 0x61, 0x41, 0x4d, 0x76, 0x5a, 0x4b, 0x35, 0x46, \n\t0x38, 0x50, 0x59, 0x79, 0x47, 0x78, 0x76, 0x5a, 0x68, 0x36, 0x70, 0x51, 0x6d, 0x47, 0x6b, 0x52, 0x4b, 0x56, \n\t0x48, 0x51, 0x32, 0x63, 0x4c, 0x6d, 0x61, 0x4a, 0x31, 0x66, 0x32, 0x73, 0x6e, 0x48, 0x54, 0x75, 0x61, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x35, 0x6f, 0x52, 0x53, 0x4d, 0x68, 0x75, 0x62, 0x79, 0x61, 0x49, 0x47, 0x52, 0x50, 0x67, 0x7a, \n\t0x7a, 0x68, 0x6d, 0x77, 0x35, 0x71, 0x38, 0x30, 0x54, 0x44, 0x52, 0x31, 0x47, 0x52, 0x66, 0x76, 0x4b, 0x53, \n\t0x38, 0x38, 0x70, 0x56, 0x77, 0x6b, 0x76, 0x6f, 0x30, 0x35, 0x39, 0x36, 0x50, 0x32, 0x31, 0x30, 0x39, 0x34, \n\t0x4a, 0x4d, 0x50, 0x33, 0x43, 0x61, 0x33, 0x49, 0x32, 0x66, 0x72, 0x77, 0x30, 0x30, 0x53, 0x42, 0x53, 0x5c, 0x0a,\n\t0x09, 0x4a, 0x49, 0x48, 0x58, 0x41, 0x4f, 0x74, 0x71, 0x59, 0x75, 0x75, 0x4f, 0x62, 0x78, 0x44, 0x73, 0x33, \n\t0x5a, 0x36, 0x61, 0x49, 0x38, 0x72, 0x41, 0x4b, 0x41, 0x61, 0x4d, 0x44, 0x55, 0x62, 0x78, 0x4c, 0x58, 0x38, \n\t0x62, 0x6a, 0x47, 0x4b, 0x58, 0x78, 0x31, 0x77, 0x59, 0x4b, 0x54, 0x43, 0x78, 0x57, 0x63, 0x35, 0x69, 0x67, \n\t0x4a, 0x48, 0x77, 0x32, 0x69, 0x64, 0x76, 0x48, 0x6f, 0x78, 0x43, 0x45, 0x75, 0x58, 0x41, 0x69, 0x43, 0x5c, 0x0a,\n\t0x09, 0x79, 0x4d, 0x52, 0x4e, 0x31, 0x34, 0x45, 0x4b, 0x31, 0x48, 0x74, 0x30, 0x43, 0x61, 0x73, 0x35, 0x7a, \n\t0x56, 0x36, 0x68, 0x66, 0x70, 0x49, 0x77, 0x75, 0x6a, 0x69, 0x35, 0x46, 0x63, 0x6c, 0x72, 0x50, 0x46, 0x59, \n\t0x36, 0x6d, 0x4a, 0x42, 0x35, 0x45, 0x53, 0x46, 0x64, 0x31, 0x4a, 0x2f, 0x47, 0x78, 0x52, 0x4c, 0x43, 0x6c, \n\t0x5a, 0x76, 0x2f, 0x4b, 0x73, 0x63, 0x49, 0x68, 0x57, 0x61, 0x33, 0x53, 0x45, 0x55, 0x54, 0x4a, 0x2f, 0x5c, 0x0a,\n\t0x09, 0x56, 0x46, 0x6e, 0x4c, 0x57, 0x63, 0x77, 0x77, 0x55, 0x75, 0x37, 0x51, 0x46, 0x58, 0x56, 0x35, 0x46, \n\t0x46, 0x36, 0x39, 0x33, 0x4a, 0x7a, 0x50, 0x71, 0x47, 0x48, 0x55, 0x5a, 0x62, 0x75, 0x56, 0x67, 0x56, 0x46, \n\t0x6d, 0x2b, 0x34, 0x77, 0x77, 0x6b, 0x6b, 0x6a, 0x2b, 0x45, 0x67, 0x54, 0x54, 0x4c, 0x35, 0x71, 0x63, 0x61, \n\t0x41, 0x67, 0x32, 0x41, 0x59, 0x67, 0x67, 0x42, 0x61, 0x4e, 0x2f, 0x42, 0x6c, 0x49, 0x66, 0x41, 0x4a, 0x5c, 0x0a,\n\t0x09, 0x64, 0x4c, 0x44, 0x39, 0x4f, 0x38, 0x38, 0x51, 0x73, 0x52, 0x66, 0x42, 0x72, 0x4a, 0x42, 0x57, 0x36, \n\t0x43, 0x55, 0x64, 0x38, 0x73, 0x5a, 0x35, 0x4d, 0x6f, 0x79, 0x41, 0x59, 0x6a, 0x7a, 0x44, 0x43, 0x4b, 0x49, \n\t0x79, 0x41, 0x78, 0x42, 0x4a, 0x64, 0x48, 0x72, 0x30, 0x45, 0x43, 0x50, 0x30, 0x32, 0x62, 0x45, 0x6b, 0x61, \n\t0x5a, 0x75, 0x74, 0x33, 0x42, 0x71, 0x43, 0x31, 0x74, 0x76, 0x5a, 0x6a, 0x4c, 0x34, 0x2b, 0x63, 0x49, 0x5c, 0x0a,\n\t0x09, 0x6e, 0x36, 0x53, 0x65, 0x4f, 0x47, 0x30, 0x4b, 0x45, 0x43, 0x6c, 0x71, 0x41, 0x71, 0x38, 0x47, 0x55, \n\t0x6c, 0x38, 0x4f, 0x62, 0x47, 0x36, 0x37, 0x47, 0x48, 0x2f, 0x33, 0x74, 0x6a, 0x61, 0x4d, 0x76, 0x45, 0x5a, \n\t0x79, 0x67, 0x51, 0x73, 0x6a, 0x6a, 0x43, 0x62, 0x45, 0x35, 0x64, 0x45, 0x4b, 0x6f, 0x32, 0x69, 0x2f, 0x34, \n\t0x76, 0x6f, 0x47, 0x62, 0x54, 0x6f, 0x59, 0x6a, 0x64, 0x37, 0x6c, 0x73, 0x51, 0x6e, 0x69, 0x58, 0x51, 0x5c, 0x0a,\n\t0x09, 0x44, 0x54, 0x4c, 0x37, 0x37, 0x61, 0x73, 0x70, 0x48, 0x6a, 0x71, 0x30, 0x30, 0x44, 0x49, 0x69, 0x55, \n\t0x71, 0x75, 0x67, 0x35, 0x34, 0x58, 0x7a, 0x6f, 0x33, 0x48, 0x4b, 0x4c, 0x4a, 0x6f, 0x4a, 0x57, 0x43, 0x6b, \n\t0x66, 0x44, 0x61, 0x38, 0x7a, 0x68, 0x47, 0x79, 0x39, 0x6d, 0x71, 0x75, 0x44, 0x7a, 0x32, 0x41, 0x69, 0x4d, \n\t0x77, 0x77, 0x79, 0x67, 0x65, 0x68, 0x6b, 0x4c, 0x32, 0x41, 0x6b, 0x6d, 0x4f, 0x57, 0x67, 0x6d, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x45, 0x34, 0x79, 0x73, 0x5a, 0x55, 0x63, 0x42, 0x6f, 0x32, 0x54, 0x39, 0x44, 0x4f, 0x42, 0x65, 0x32, \n\t0x33, 0x38, 0x4d, 0x34, 0x79, 0x35, 0x52, 0x39, 0x47, 0x75, 0x65, 0x51, 0x6b, 0x7a, 0x47, 0x41, 0x56, 0x6a, \n\t0x36, 0x79, 0x47, 0x6b, 0x41, 0x30, 0x38, 0x43, 0x31, 0x77, 0x4d, 0x2b, 0x70, 0x65, 0x66, 0x58, 0x48, 0x50, \n\t0x5a, 0x50, 0x70, 0x70, 0x35, 0x38, 0x4f, 0x66, 0x67, 0x73, 0x5a, 0x74, 0x4d, 0x42, 0x76, 0x51, 0x74, 0x5c, 0x0a,\n\t0x09, 0x42, 0x45, 0x42, 0x6e, 0x36, 0x30, 0x37, 0x49, 0x4d, 0x4d, 0x49, 0x47, 0x68, 0x42, 0x34, 0x43, 0x4e, \n\t0x6c, 0x4b, 0x31, 0x7a, 0x32, 0x57, 0x79, 0x44, 0x6a, 0x50, 0x44, 0x38, 0x73, 0x48, 0x2f, 0x68, 0x68, 0x57, \n\t0x72, 0x79, 0x4d, 0x48, 0x33, 0x34, 0x35, 0x4e, 0x55, 0x6b, 0x50, 0x6f, 0x6a, 0x70, 0x68, 0x50, 0x52, 0x6c, \n\t0x2f, 0x33, 0x6c, 0x6e, 0x36, 0x43, 0x42, 0x6d, 0x45, 0x61, 0x54, 0x49, 0x75, 0x49, 0x38, 0x4f, 0x32, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x37, 0x2f, 0x4b, 0x50, 0x32, 0x53, 0x37, 0x4c, 0x4c, 0x4a, 0x64, 0x42, 0x67, 0x6e, 0x45, 0x64, \n\t0x53, 0x54, 0x4a, 0x6c, 0x53, 0x47, 0x44, 0x39, 0x74, 0x38, 0x6f, 0x58, 0x53, 0x5a, 0x70, 0x63, 0x62, 0x6b, \n\t0x6f, 0x66, 0x66, 0x30, 0x77, 0x4e, 0x46, 0x66, 0x62, 0x42, 0x30, 0x69, 0x59, 0x7a, 0x78, 0x58, 0x6a, 0x6d, \n\t0x57, 0x45, 0x37, 0x58, 0x51, 0x7a, 0x70, 0x70, 0x55, 0x36, 0x74, 0x45, 0x75, 0x32, 0x57, 0x75, 0x6d, 0x5c, 0x0a,\n\t0x09, 0x61, 0x46, 0x75, 0x69, 0x6a, 0x7a, 0x36, 0x2b, 0x72, 0x48, 0x49, 0x62, 0x4e, 0x4f, 0x47, 0x7a, 0x7a, \n\t0x4b, 0x39, 0x45, 0x36, 0x34, 0x4c, 0x70, 0x4c, 0x31, 0x39, 0x48, 0x37, 0x6e, 0x74, 0x6e, 0x6b, 0x41, 0x49, \n\t0x58, 0x38, 0x43, 0x32, 0x44, 0x2f, 0x39, 0x34, 0x71, 0x74, 0x79, 0x4e, 0x71, 0x78, 0x36, 0x4b, 0x73, 0x71, \n\t0x58, 0x54, 0x52, 0x4d, 0x52, 0x61, 0x56, 0x6f, 0x48, 0x58, 0x6b, 0x6e, 0x6f, 0x58, 0x35, 0x53, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x64, 0x65, 0x65, 0x33, 0x61, 0x4f, 0x33, 0x34, 0x48, 0x74, 0x54, 0x71, 0x6d, 0x63, 0x67, 0x6f, 0x35, \n\t0x66, 0x49, 0x34, 0x31, 0x70, 0x61, 0x7a, 0x61, 0x68, 0x74, 0x52, 0x5a, 0x4a, 0x52, 0x45, 0x53, 0x2b, 0x6e, \n\t0x49, 0x53, 0x4e, 0x53, 0x6d, 0x30, 0x6b, 0x65, 0x74, 0x54, 0x47, 0x52, 0x55, 0x49, 0x69, 0x71, 0x70, 0x5a, \n\t0x47, 0x52, 0x55, 0x64, 0x50, 0x4c, 0x61, 0x75, 0x45, 0x34, 0x36, 0x4d, 0x70, 0x49, 0x67, 0x44, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x55, 0x4a, 0x48, 0x6a, 0x69, 0x43, 0x76, 0x32, 0x4f, 0x5a, 0x59, 0x4e, 0x63, 0x71, 0x63, 0x73, 0x55, \n\t0x76, 0x45, 0x78, 0x6d, 0x39, 0x42, 0x38, 0x6e, 0x2b, 0x41, 0x6e, 0x73, 0x78, 0x74, 0x74, 0x70, 0x30, 0x45, \n\t0x52, 0x45, 0x6b, 0x55, 0x52, 0x48, 0x41, 0x33, 0x77, 0x42, 0x2f, 0x72, 0x65, 0x61, 0x4a, 0x6d, 0x55, 0x56, \n\t0x6d, 0x58, 0x2f, 0x67, 0x42, 0x78, 0x50, 0x52, 0x69, 0x46, 0x4b, 0x6c, 0x59, 0x49, 0x71, 0x4f, 0x67, 0x5c, 0x0a,\n\t0x09, 0x31, 0x59, 0x36, 0x41, 0x39, 0x4d, 0x67, 0x6f, 0x6a, 0x6f, 0x71, 0x69, 0x2f, 0x45, 0x78, 0x6b, 0x6c, \n\t0x43, 0x78, 0x4c, 0x63, 0x32, 0x51, 0x55, 0x52, 0x54, 0x74, 0x43, 0x6a, 0x58, 0x62, 0x55, 0x79, 0x43, 0x69, \n\t0x75, 0x71, 0x30, 0x5a, 0x49, 0x6d, 0x63, 0x69, 0x6f, 0x48, 0x66, 0x46, 0x6b, 0x49, 0x36, 0x4e, 0x34, 0x6d, \n\t0x5a, 0x7a, 0x49, 0x4b, 0x45, 0x79, 0x58, 0x4b, 0x37, 0x75, 0x7a, 0x42, 0x37, 0x44, 0x58, 0x79, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x67, 0x55, 0x46, 0x56, 0x6b, 0x62, 0x73, 0x47, 0x67, 0x63, 0x49, 0x69, 0x50, 0x41, 0x76, 0x33, 0x2b, \n\t0x5a, 0x34, 0x4e, 0x34, 0x6c, 0x35, 0x4c, 0x71, 0x66, 0x79, 0x52, 0x4f, 0x4c, 0x44, 0x57, 0x6f, 0x2f, 0x76, \n\t0x6b, 0x6a, 0x74, 0x70, 0x42, 0x6b, 0x6c, 0x4e, 0x64, 0x50, 0x6d, 0x6e, 0x63, 0x44, 0x50, 0x41, 0x4d, 0x33, \n\t0x70, 0x6c, 0x33, 0x79, 0x33, 0x30, 0x39, 0x5a, 0x58, 0x54, 0x69, 0x34, 0x69, 0x79, 0x70, 0x45, 0x79, 0x5c, 0x0a,\n\t0x09, 0x58, 0x2f, 0x52, 0x33, 0x51, 0x4d, 0x70, 0x62, 0x55, 0x36, 0x34, 0x74, 0x73, 0x66, 0x36, 0x64, 0x44, \n\t0x36, 0x65, 0x66, 0x73, 0x4b, 0x37, 0x56, 0x73, 0x35, 0x46, 0x52, 0x59, 0x63, 0x74, 0x5a, 0x6a, 0x30, 0x78, \n\t0x6b, 0x6c, 0x43, 0x77, 0x72, 0x45, 0x56, 0x49, 0x56, 0x58, 0x52, 0x36, 0x46, 0x69, 0x4f, 0x36, 0x65, 0x61, \n\t0x65, 0x6f, 0x31, 0x4d, 0x72, 0x4c, 0x64, 0x69, 0x65, 0x74, 0x48, 0x5a, 0x4e, 0x54, 0x48, 0x73, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x31, 0x46, 0x52, 0x72, 0x36, 0x6b, 0x64, 0x65, 0x4e, 0x65, 0x2f, 0x44, 0x73, 0x4f, 0x47, 0x69, 0x45, \n\t0x45, 0x49, 0x4a, 0x65, 0x61, 0x74, 0x47, 0x37, 0x65, 0x54, 0x2f, 0x50, 0x37, 0x42, 0x35, 0x55, 0x50, 0x57, \n\t0x6d, 0x62, 0x61, 0x66, 0x41, 0x75, 0x53, 0x5a, 0x75, 0x48, 0x74, 0x48, 0x31, 0x4e, 0x74, 0x53, 0x68, 0x41, \n\t0x70, 0x61, 0x67, 0x47, 0x76, 0x41, 0x4e, 0x62, 0x55, 0x52, 0x50, 0x2b, 0x68, 0x6d, 0x32, 0x6e, 0x65, 0x5c, 0x0a,\n\t0x09, 0x65, 0x67, 0x48, 0x55, 0x47, 0x74, 0x46, 0x64, 0x73, 0x68, 0x67, 0x71, 0x42, 0x68, 0x68, 0x56, 0x78, \n\t0x75, 0x55, 0x78, 0x42, 0x30, 0x59, 0x69, 0x44, 0x30, 0x61, 0x43, 0x50, 0x42, 0x69, 0x4a, 0x2b, 0x71, 0x77, \n\t0x46, 0x4a, 0x68, 0x57, 0x46, 0x55, 0x5a, 0x6d, 0x68, 0x57, 0x34, 0x46, 0x32, 0x75, 0x34, 0x4b, 0x52, 0x6c, \n\t0x4c, 0x52, 0x75, 0x32, 0x6b, 0x75, 0x77, 0x62, 0x38, 0x31, 0x63, 0x52, 0x31, 0x50, 0x77, 0x30, 0x42, 0x5c, 0x0a,\n\t0x09, 0x47, 0x61, 0x74, 0x78, 0x78, 0x55, 0x2b, 0x6b, 0x6e, 0x61, 0x2f, 0x43, 0x62, 0x52, 0x78, 0x30, 0x50, \n\t0x48, 0x4d, 0x52, 0x6f, 0x71, 0x6f, 0x30, 0x30, 0x35, 0x4e, 0x49, 0x75, 0x6c, 0x44, 0x4e, 0x46, 0x65, 0x54, \n\t0x2f, 0x4a, 0x64, 0x74, 0x45, 0x69, 0x31, 0x4f, 0x72, 0x4f, 0x2f, 0x39, 0x58, 0x36, 0x38, 0x72, 0x59, 0x38, \n\t0x47, 0x76, 0x36, 0x6b, 0x4d, 0x30, 0x63, 0x4c, 0x68, 0x56, 0x32, 0x61, 0x59, 0x46, 0x76, 0x30, 0x4c, 0x5c, 0x0a,\n\t0x09, 0x39, 0x6a, 0x35, 0x49, 0x38, 0x4d, 0x43, 0x64, 0x79, 0x45, 0x4e, 0x37, 0x6b, 0x58, 0x34, 0x54, 0x4d, \n\t0x54, 0x4f, 0x50, 0x4f, 0x50, 0x46, 0x52, 0x65, 0x43, 0x63, 0x2b, 0x73, 0x6a, 0x31, 0x45, 0x69, 0x79, 0x65, \n\t0x74, 0x31, 0x57, 0x46, 0x61, 0x61, 0x76, 0x68, 0x6c, 0x47, 0x4b, 0x62, 0x4a, 0x41, 0x43, 0x6e, 0x62, 0x45, \n\t0x39, 0x72, 0x5a, 0x59, 0x56, 0x6f, 0x38, 0x67, 0x53, 0x32, 0x54, 0x39, 0x64, 0x51, 0x77, 0x4c, 0x66, 0x5c, 0x0a,\n\t0x09, 0x58, 0x58, 0x4e, 0x45, 0x79, 0x4c, 0x32, 0x34, 0x44, 0x55, 0x4d, 0x43, 0x33, 0x77, 0x6b, 0x63, 0x75, \n\t0x37, 0x77, 0x6d, 0x58, 0x6a, 0x73, 0x4b, 0x65, 0x69, 0x77, 0x37, 0x51, 0x79, 0x51, 0x37, 0x63, 0x43, 0x37, \n\t0x5a, 0x59, 0x5a, 0x70, 0x76, 0x6e, 0x62, 0x44, 0x2b, 0x4c, 0x76, 0x57, 0x43, 0x72, 0x52, 0x55, 0x61, 0x6a, \n\t0x61, 0x34, 0x37, 0x5a, 0x51, 0x2f, 0x37, 0x47, 0x46, 0x65, 0x4c, 0x55, 0x46, 0x38, 0x75, 0x65, 0x42, 0x5c, 0x0a,\n\t0x09, 0x32, 0x36, 0x5a, 0x66, 0x65, 0x6d, 0x58, 0x70, 0x74, 0x71, 0x71, 0x69, 0x77, 0x6e, 0x7a, 0x5a, 0x7a, \n\t0x43, 0x43, 0x43, 0x42, 0x45, 0x59, 0x43, 0x2b, 0x42, 0x72, 0x77, 0x66, 0x44, 0x58, 0x50, 0x4f, 0x2b, 0x6f, \n\t0x55, 0x5a, 0x6c, 0x2f, 0x30, 0x67, 0x54, 0x44, 0x53, 0x36, 0x51, 0x41, 0x6a, 0x2f, 0x2b, 0x36, 0x62, 0x61, \n\t0x58, 0x37, 0x37, 0x38, 0x77, 0x51, 0x50, 0x62, 0x6a, 0x66, 0x32, 0x49, 0x78, 0x61, 0x33, 0x55, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x79, 0x61, 0x64, 0x53, 0x65, 0x38, 0x4f, 0x51, 0x32, 0x43, 0x4b, 0x77, 0x77, 0x61, 0x74, 0x38, \n\t0x56, 0x4d, 0x38, 0x4a, 0x49, 0x6d, 0x63, 0x50, 0x70, 0x43, 0x6b, 0x5a, 0x53, 0x42, 0x52, 0x44, 0x74, 0x74, \n\t0x69, 0x77, 0x77, 0x6b, 0x69, 0x74, 0x37, 0x77, 0x59, 0x2f, 0x65, 0x6a, 0x74, 0x6c, 0x4d, 0x4d, 0x42, 0x4c, \n\t0x36, 0x61, 0x6d, 0x63, 0x59, 0x79, 0x65, 0x55, 0x6d, 0x7a, 0x57, 0x74, 0x33, 0x6c, 0x59, 0x76, 0x41, 0x5c, 0x0a,\n\t0x09, 0x59, 0x6e, 0x6d, 0x43, 0x78, 0x69, 0x2b, 0x64, 0x67, 0x44, 0x64, 0x62, 0x41, 0x33, 0x67, 0x2f, 0x79, \n\t0x44, 0x38, 0x48, 0x32, 0x41, 0x77, 0x67, 0x32, 0x75, 0x78, 0x44, 0x73, 0x31, 0x69, 0x53, 0x38, 0x45, 0x48, \n\t0x48, 0x31, 0x4d, 0x78, 0x73, 0x63, 0x4f, 0x68, 0x42, 0x31, 0x71, 0x38, 0x34, 0x49, 0x78, 0x70, 0x79, 0x4e, \n\t0x5a, 0x51, 0x37, 0x61, 0x65, 0x48, 0x77, 0x53, 0x30, 0x52, 0x33, 0x30, 0x4a, 0x71, 0x58, 0x66, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x48, 0x31, 0x63, 0x39, 0x35, 0x6a, 0x68, 0x52, 0x43, 0x41, 0x58, 0x44, 0x70, 0x41, 0x38, 0x39, 0x49, \n\t0x76, 0x73, 0x33, 0x48, 0x65, 0x78, 0x35, 0x43, 0x72, 0x4b, 0x38, 0x70, 0x77, 0x61, 0x49, 0x43, 0x57, 0x73, \n\t0x30, 0x41, 0x2f, 0x58, 0x42, 0x35, 0x46, 0x59, 0x37, 0x62, 0x44, 0x30, 0x5a, 0x76, 0x51, 0x59, 0x5a, 0x72, \n\t0x55, 0x56, 0x7a, 0x73, 0x50, 0x30, 0x2f, 0x79, 0x37, 0x44, 0x6e, 0x55, 0x48, 0x49, 0x59, 0x42, 0x41, 0x5c, 0x0a,\n\t0x09, 0x34, 0x74, 0x2b, 0x7a, 0x6a, 0x4a, 0x51, 0x38, 0x42, 0x4c, 0x77, 0x48, 0x78, 0x46, 0x68, 0x44, 0x71, \n\t0x49, 0x77, 0x32, 0x50, 0x59, 0x69, 0x55, 0x69, 0x65, 0x73, 0x39, 0x77, 0x4b, 0x76, 0x30, 0x2f, 0x4e, 0x62, \n\t0x32, 0x79, 0x32, 0x6c, 0x74, 0x2b, 0x30, 0x38, 0x7a, 0x6a, 0x4c, 0x77, 0x36, 0x72, 0x63, 0x76, 0x50, 0x70, \n\t0x58, 0x6e, 0x35, 0x75, 0x59, 0x58, 0x37, 0x43, 0x33, 0x62, 0x74, 0x59, 0x4f, 0x4e, 0x4c, 0x5a, 0x79, 0x5c, 0x0a,\n\t0x09, 0x43, 0x58, 0x44, 0x6a, 0x49, 0x32, 0x4c, 0x6f, 0x2b, 0x4e, 0x75, 0x51, 0x52, 0x4b, 0x2f, 0x5a, 0x36, \n\t0x44, 0x79, 0x55, 0x73, 0x62, 0x4e, 0x78, 0x6a, 0x4a, 0x6c, 0x53, 0x62, 0x42, 0x33, 0x6c, 0x56, 0x7a, 0x5a, \n\t0x6b, 0x45, 0x46, 0x44, 0x78, 0x31, 0x42, 0x72, 0x67, 0x64, 0x76, 0x39, 0x2f, 0x65, 0x75, 0x6c, 0x78, 0x2f, \n\t0x62, 0x6a, 0x62, 0x45, 0x32, 0x50, 0x59, 0x67, 0x67, 0x42, 0x61, 0x50, 0x2f, 0x42, 0x50, 0x35, 0x46, 0x5c, 0x0a,\n\t0x09, 0x7a, 0x31, 0x2b, 0x2f, 0x2b, 0x6d, 0x79, 0x43, 0x2f, 0x66, 0x65, 0x45, 0x46, 0x36, 0x67, 0x43, 0x49, \n\t0x2f, 0x2b, 0x2b, 0x62, 0x57, 0x78, 0x38, 0x36, 0x35, 0x7a, 0x53, 0x2f, 0x63, 0x6e, 0x6c, 0x51, 0x32, 0x78, \n\t0x63, 0x38, 0x47, 0x6c, 0x6b, 0x63, 0x36, 0x50, 0x39, 0x76, 0x4a, 0x45, 0x61, 0x33, 0x57, 0x67, 0x77, 0x36, \n\t0x70, 0x2f, 0x4c, 0x59, 0x35, 0x63, 0x77, 0x38, 0x6a, 0x78, 0x45, 0x59, 0x31, 0x37, 0x5a, 0x41, 0x64, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x65, 0x6d, 0x53, 0x39, 0x51, 0x36, 0x2f, 0x55, 0x2b, 0x67, 0x54, 0x41, 0x4b, 0x48, 0x6c, 0x6f, \n\t0x75, 0x32, 0x4b, 0x42, 0x64, 0x59, 0x72, 0x35, 0x78, 0x6f, 0x48, 0x6e, 0x35, 0x72, 0x73, 0x38, 0x47, 0x65, \n\t0x39, 0x65, 0x5a, 0x66, 0x75, 0x6b, 0x56, 0x50, 0x62, 0x63, 0x33, 0x4c, 0x6e, 0x49, 0x67, 0x69, 0x71, 0x54, \n\t0x41, 0x36, 0x4b, 0x31, 0x6f, 0x74, 0x2f, 0x54, 0x78, 0x6d, 0x36, 0x78, 0x2f, 0x38, 0x78, 0x2f, 0x44, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x61, 0x44, 0x6f, 0x6c, 0x72, 0x7a, 0x77, 0x36, 0x6d, 0x78, 0x63, 0x65, 0x4b, 0x59, 0x79, 0x7a, \n\t0x31, 0x4a, 0x4f, 0x38, 0x75, 0x42, 0x65, 0x57, 0x70, 0x65, 0x65, 0x33, 0x37, 0x36, 0x54, 0x56, 0x73, 0x72, \n\t0x6c, 0x30, 0x51, 0x49, 0x6a, 0x6f, 0x59, 0x50, 0x47, 0x42, 0x43, 0x4d, 0x36, 0x77, 0x45, 0x69, 0x44, 0x56, \n\t0x67, 0x79, 0x6a, 0x71, 0x51, 0x56, 0x74, 0x42, 0x30, 0x78, 0x37, 0x74, 0x58, 0x6c, 0x67, 0x5a, 0x45, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x4c, 0x64, 0x68, 0x38, 0x70, 0x32, 0x4a, 0x68, 0x46, 0x6e, 0x73, 0x41, 0x37, 0x5a, 0x75, 0x72, \n\t0x6c, 0x34, 0x71, 0x67, 0x70, 0x47, 0x65, 0x7a, 0x6f, 0x48, 0x57, 0x72, 0x6a, 0x4a, 0x41, 0x65, 0x69, 0x72, \n\t0x4e, 0x61, 0x42, 0x6c, 0x77, 0x45, 0x48, 0x31, 0x63, 0x54, 0x67, 0x38, 0x45, 0x37, 0x57, 0x4c, 0x2f, 0x39, \n\t0x41, 0x38, 0x6b, 0x79, 0x52, 0x66, 0x2f, 0x65, 0x4e, 0x42, 0x50, 0x66, 0x66, 0x33, 0x6c, 0x4e, 0x48, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x76, 0x5a, 0x62, 0x38, 0x4f, 0x2b, 0x35, 0x50, 0x51, 0x73, 0x6a, 0x5a, 0x56, 0x34, 0x6f, 0x7a, \n\t0x33, 0x49, 0x57, 0x62, 0x34, 0x69, 0x57, 0x73, 0x37, 0x55, 0x70, 0x71, 0x45, 0x2b, 0x6e, 0x64, 0x32, 0x44, \n\t0x59, 0x4d, 0x43, 0x71, 0x6a, 0x41, 0x63, 0x4e, 0x49, 0x66, 0x30, 0x6c, 0x57, 0x48, 0x74, 0x35, 0x41, 0x62, \n\t0x70, 0x69, 0x66, 0x46, 0x79, 0x6f, 0x71, 0x37, 0x34, 0x54, 0x5a, 0x62, 0x38, 0x6f, 0x31, 0x2f, 0x78, 0x5c, 0x0a,\n\t0x09, 0x76, 0x65, 0x31, 0x69, 0x6d, 0x32, 0x66, 0x4f, 0x4c, 0x75, 0x6e, 0x74, 0x6f, 0x61, 0x4e, 0x7a, 0x6b, \n\t0x51, 0x4b, 0x56, 0x4b, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x4a, 0x36, 0x39, 0x54, 0x61, 0x74, 0x33, 0x7a, 0x58, \n\t0x5a, 0x6f, 0x33, 0x66, 0x67, 0x6c, 0x71, 0x64, 0x5a, 0x72, 0x58, 0x2f, 0x6b, 0x64, 0x66, 0x2b, 0x6d, 0x78, \n\t0x64, 0x65, 0x53, 0x46, 0x59, 0x6a, 0x64, 0x57, 0x55, 0x75, 0x5a, 0x34, 0x4d, 0x6a, 0x47, 0x72, 0x68, 0x5c, 0x0a,\n\t0x09, 0x78, 0x53, 0x42, 0x36, 0x74, 0x4a, 0x79, 0x56, 0x6d, 0x47, 0x47, 0x6b, 0x4c, 0x77, 0x73, 0x51, 0x4d, \n\t0x30, 0x64, 0x6c, 0x64, 0x32, 0x43, 0x59, 0x4d, 0x4f, 0x70, 0x32, 0x45, 0x72, 0x6a, 0x49, 0x52, 0x76, 0x51, \n\t0x49, 0x6f, 0x2b, 0x42, 0x41, 0x73, 0x57, 0x65, 0x47, 0x62, 0x42, 0x4a, 0x7a, 0x39, 0x58, 0x58, 0x76, 0x36, \n\t0x4b, 0x6b, 0x58, 0x69, 0x5a, 0x6b, 0x36, 0x38, 0x2b, 0x2b, 0x34, 0x70, 0x61, 0x65, 0x32, 0x78, 0x6c, 0x5c, 0x0a,\n\t0x09, 0x45, 0x4f, 0x52, 0x4a, 0x6f, 0x55, 0x47, 0x4a, 0x30, 0x50, 0x66, 0x46, 0x44, 0x50, 0x33, 0x37, 0x6a, \n\t0x75, 0x73, 0x2f, 0x6a, 0x33, 0x58, 0x59, 0x39, 0x2f, 0x36, 0x33, 0x66, 0x36, 0x30, 0x70, 0x38, 0x38, 0x75, \n\t0x42, 0x66, 0x2f, 0x68, 0x7a, 0x64, 0x6a, 0x68, 0x35, 0x46, 0x79, 0x6c, 0x38, 0x77, 0x45, 0x6f, 0x2b, 0x54, \n\t0x70, 0x62, 0x73, 0x38, 0x4d, 0x6f, 0x78, 0x53, 0x51, 0x42, 0x4c, 0x32, 0x34, 0x50, 0x49, 0x72, 0x36, 0x5c, 0x0a,\n\t0x09, 0x54, 0x44, 0x59, 0x71, 0x67, 0x75, 0x72, 0x43, 0x71, 0x42, 0x38, 0x54, 0x36, 0x78, 0x33, 0x71, 0x78, \n\t0x7a, 0x43, 0x53, 0x76, 0x59, 0x42, 0x49, 0x67, 0x48, 0x66, 0x69, 0x37, 0x42, 0x75, 0x44, 0x70, 0x65, 0x61, \n\t0x79, 0x6d, 0x4b, 0x6c, 0x31, 0x4c, 0x6a, 0x2b, 0x42, 0x63, 0x69, 0x41, 0x79, 0x53, 0x4a, 0x73, 0x76, 0x53, \n\t0x70, 0x75, 0x2f, 0x53, 0x4d, 0x6e, 0x36, 0x52, 0x58, 0x2b, 0x4c, 0x58, 0x44, 0x6d, 0x6b, 0x56, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x74, 0x61, 0x2f, 0x73, 0x31, 0x58, 0x4a, 0x4a, 0x59, 0x68, 0x4b, 0x41, 0x43, 0x71, 0x6f, 0x73, 0x75, \n\t0x6a, 0x6d, 0x44, 0x6e, 0x61, 0x76, 0x42, 0x4f, 0x54, 0x41, 0x4b, 0x4d, 0x75, 0x32, 0x35, 0x55, 0x49, 0x67, \n\t0x71, 0x57, 0x4e, 0x45, 0x70, 0x58, 0x54, 0x38, 0x6b, 0x36, 0x63, 0x75, 0x31, 0x47, 0x75, 0x2b, 0x57, 0x65, \n\t0x4c, 0x4b, 0x59, 0x2b, 0x35, 0x74, 0x39, 0x7a, 0x51, 0x64, 0x54, 0x76, 0x6a, 0x4c, 0x41, 0x65, 0x69, 0x5c, 0x0a,\n\t0x09, 0x66, 0x44, 0x57, 0x42, 0x33, 0x77, 0x58, 0x32, 0x71, 0x6f, 0x6e, 0x79, 0x30, 0x45, 0x46, 0x7a, 0x36, \n\t0x53, 0x34, 0x56, 0x37, 0x4e, 0x6f, 0x42, 0x68, 0x2f, 0x59, 0x70, 0x45, 0x56, 0x41, 0x62, 0x4d, 0x74, 0x32, \n\t0x37, 0x50, 0x46, 0x70, 0x67, 0x46, 0x45, 0x64, 0x41, 0x56, 0x68, 0x68, 0x35, 0x75, 0x54, 0x43, 0x79, 0x52, \n\t0x6b, 0x57, 0x77, 0x61, 0x57, 0x45, 0x6b, 0x31, 0x33, 0x31, 0x6f, 0x42, 0x69, 0x55, 0x71, 0x74, 0x69, 0x5c, 0x0a,\n\t0x09, 0x58, 0x6d, 0x36, 0x6b, 0x33, 0x76, 0x2b, 0x4e, 0x6e, 0x6e, 0x69, 0x4e, 0x6b, 0x36, 0x38, 0x32, 0x2b, \n\t0x2f, 0x75, 0x61, 0x73, 0x32, 0x4a, 0x6b, 0x45, 0x4f, 0x52, 0x42, 0x59, 0x70, 0x55, 0x64, 0x46, 0x39, 0x77, \n\t0x4f, 0x2b, 0x67, 0x75, 0x44, 0x72, 0x4b, 0x39, 0x66, 0x36, 0x2f, 0x67, 0x2b, 0x68, 0x76, 0x76, 0x77, 0x57, \n\t0x6a, 0x79, 0x36, 0x4d, 0x4e, 0x52, 0x6f, 0x6e, 0x4c, 0x59, 0x78, 0x36, 0x4d, 0x79, 0x49, 0x65, 0x52, 0x5c, 0x0a,\n\t0x09, 0x36, 0x4d, 0x35, 0x79, 0x56, 0x73, 0x78, 0x75, 0x74, 0x65, 0x2f, 0x49, 0x5a, 0x6f, 0x54, 0x52, 0x53, \n\t0x70, 0x66, 0x52, 0x6b, 0x41, 0x44, 0x76, 0x70, 0x50, 0x6b, 0x33, 0x42, 0x51, 0x66, 0x58, 0x39, 0x34, 0x68, \n\t0x35, 0x77, 0x38, 0x76, 0x46, 0x6d, 0x30, 0x67, 0x4f, 0x52, 0x44, 0x6c, 0x53, 0x59, 0x48, 0x51, 0x70, 0x38, \n\t0x4a, 0x59, 0x6b, 0x6f, 0x38, 0x65, 0x37, 0x49, 0x79, 0x62, 0x35, 0x39, 0x32, 0x34, 0x7a, 0x75, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x79, 0x4b, 0x63, 0x45, 0x68, 0x57, 0x4a, 0x63, 0x74, 0x5a, 0x55, 0x5a, 0x39, 0x46, 0x54, 0x4d, 0x30, \n\t0x62, 0x39, 0x77, 0x4f, 0x77, 0x77, 0x36, 0x68, 0x6f, 0x55, 0x56, 0x74, 0x47, 0x52, 0x57, 0x45, 0x6b, 0x6a, \n\t0x37, 0x51, 0x36, 0x46, 0x7a, 0x4c, 0x49, 0x4f, 0x32, 0x48, 0x75, 0x65, 0x72, 0x6e, 0x61, 0x50, 0x45, 0x73, \n\t0x30, 0x61, 0x73, 0x7a, 0x39, 0x72, 0x2f, 0x48, 0x2f, 0x57, 0x6d, 0x73, 0x76, 0x63, 0x69, 0x44, 0x71, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x41, 0x52, 0x47, 0x6b, 0x67, 0x38, 0x42, 0x6e, 0x77, 0x47, 0x67, 0x31, 0x58, 0x38, 0x51, 0x42, \n\t0x51, 0x2f, 0x64, 0x41, 0x36, 0x32, 0x57, 0x47, 0x55, 0x62, 0x44, 0x73, 0x70, 0x78, 0x4e, 0x54, 0x56, 0x69, \n\t0x62, 0x59, 0x45, 0x51, 0x62, 0x52, 0x72, 0x50, 0x48, 0x70, 0x4e, 0x4e, 0x31, 0x47, 0x53, 0x2f, 0x75, 0x6b, \n\t0x6a, 0x41, 0x71, 0x57, 0x48, 0x6a, 0x55, 0x4d, 0x4a, 0x4a, 0x72, 0x35, 0x55, 0x45, 0x6b, 0x35, 0x75, 0x5c, 0x0a,\n\t0x09, 0x70, 0x4e, 0x37, 0x39, 0x69, 0x5a, 0x35, 0x34, 0x6a, 0x70, 0x4f, 0x76, 0x4e, 0x76, 0x75, 0x37, 0x46, \n\t0x30, 0x2f, 0x55, 0x6d, 0x54, 0x41, 0x31, 0x45, 0x42, 0x4b, 0x54, 0x41, 0x36, 0x48, 0x62, 0x67, 0x4f, 0x76, \n\t0x37, 0x76, 0x35, 0x67, 0x46, 0x7a, 0x4a, 0x67, 0x47, 0x44, 0x33, 0x2f, 0x51, 0x6b, 0x67, 0x4b, 0x75, 0x2f, \n\t0x79, 0x36, 0x4e, 0x55, 0x52, 0x30, 0x34, 0x62, 0x62, 0x2b, 0x61, 0x6c, 0x39, 0x4d, 0x71, 0x57, 0x56, 0x5c, 0x0a,\n\t0x09, 0x67, 0x46, 0x47, 0x5a, 0x71, 0x47, 0x53, 0x55, 0x4d, 0x4c, 0x4c, 0x34, 0x44, 0x56, 0x6b, 0x6c, 0x77, \n\t0x44, 0x74, 0x68, 0x2f, 0x6f, 0x33, 0x42, 0x34, 0x59, 0x31, 0x39, 0x59, 0x69, 0x37, 0x37, 0x2f, 0x62, 0x6a, \n\t0x4e, 0x4b, 0x41, 0x65, 0x69, 0x63, 0x6c, 0x70, 0x44, 0x38, 0x6d, 0x49, 0x6b, 0x33, 0x63, 0x58, 0x69, 0x48, \n\t0x52, 0x54, 0x73, 0x65, 0x55, 0x43, 0x62, 0x48, 0x2f, 0x4c, 0x4d, 0x4d, 0x46, 0x4c, 0x65, 0x55, 0x54, 0x5c, 0x0a,\n\t0x09, 0x50, 0x43, 0x4b, 0x49, 0x4b, 0x49, 0x56, 0x41, 0x47, 0x54, 0x38, 0x54, 0x4b, 0x69, 0x42, 0x78, 0x68, \n\t0x46, 0x6b, 0x2b, 0x57, 0x7a, 0x57, 0x38, 0x50, 0x33, 0x37, 0x76, 0x49, 0x30, 0x43, 0x42, 0x68, 0x5a, 0x34, \n\t0x44, 0x41, 0x71, 0x47, 0x4d, 0x6c, 0x6d, 0x4f, 0x52, 0x42, 0x35, 0x4a, 0x38, 0x78, 0x64, 0x4b, 0x56, 0x65, \n\t0x62, 0x48, 0x78, 0x66, 0x31, 0x47, 0x6e, 0x4e, 0x2f, 0x65, 0x6c, 0x32, 0x70, 0x75, 0x70, 0x4d, 0x71, 0x5c, 0x0a,\n\t0x09, 0x42, 0x36, 0x4b, 0x43, 0x57, 0x76, 0x79, 0x54, 0x4d, 0x43, 0x71, 0x53, 0x65, 0x77, 0x37, 0x66, 0x7a, \n\t0x35, 0x62, 0x5a, 0x56, 0x2b, 0x50, 0x6c, 0x44, 0x45, 0x75, 0x36, 0x6c, 0x4e, 0x79, 0x2f, 0x75, 0x7a, 0x75, \n\t0x58, 0x52, 0x78, 0x75, 0x4d, 0x68, 0x46, 0x63, 0x41, 0x52, 0x71, 0x49, 0x44, 0x6a, 0x47, 0x4c, 0x34, 0x57, \n\t0x47, 0x41, 0x30, 0x64, 0x32, 0x79, 0x42, 0x48, 0x54, 0x4f, 0x6c, 0x44, 0x51, 0x5a, 0x47, 0x50, 0x62, 0x5c, 0x0a,\n\t0x09, 0x38, 0x4b, 0x55, 0x72, 0x59, 0x2f, 0x4b, 0x44, 0x56, 0x6e, 0x4b, 0x42, 0x59, 0x61, 0x4b, 0x32, 0x4c, \n\t0x4c, 0x39, 0x4c, 0x4f, 0x59, 0x72, 0x6a, 0x48, 0x2f, 0x44, 0x6a, 0x63, 0x6b, 0x69, 0x2b, 0x56, 0x41, 0x56, \n\t0x45, 0x4b, 0x4c, 0x66, 0x33, 0x49, 0x70, 0x2b, 0x41, 0x47, 0x73, 0x62, 0x5a, 0x7a, 0x44, 0x4d, 0x51, 0x76, \n\t0x2f, 0x32, 0x4f, 0x2f, 0x32, 0x67, 0x2f, 0x30, 0x50, 0x6b, 0x2b, 0x2f, 0x79, 0x6d, 0x41, 0x4f, 0x6a, 0x5c, 0x0a,\n\t0x09, 0x45, 0x56, 0x6e, 0x4f, 0x69, 0x73, 0x5a, 0x63, 0x36, 0x4f, 0x2f, 0x64, 0x53, 0x55, 0x4f, 0x43, 0x55, \n\t0x56, 0x2f, 0x65, 0x53, 0x79, 0x74, 0x62, 0x31, 0x69, 0x2f, 0x59, 0x53, 0x45, 0x33, 0x67, 0x48, 0x54, 0x76, \n\t0x37, 0x59, 0x72, 0x6e, 0x53, 0x58, 0x42, 0x58, 0x54, 0x62, 0x6b, 0x69, 0x6d, 0x79, 0x6f, 0x47, 0x6f, 0x70, \n\t0x4c, 0x62, 0x38, 0x2f, 0x59, 0x30, 0x77, 0x56, 0x59, 0x65, 0x31, 0x35, 0x74, 0x73, 0x34, 0x5a, 0x75, 0x5c, 0x0a,\n\t0x09, 0x48, 0x43, 0x66, 0x72, 0x59, 0x74, 0x6c, 0x77, 0x38, 0x77, 0x65, 0x73, 0x74, 0x5a, 0x67, 0x52, 0x56, \n\t0x47, 0x42, 0x6d, 0x74, 0x5a, 0x69, 0x4b, 0x49, 0x69, 0x72, 0x38, 0x43, 0x46, 0x4e, 0x55, 0x34, 0x77, 0x4b, \n\t0x68, 0x45, 0x74, 0x79, 0x59, 0x4a, 0x7a, 0x68, 0x74, 0x34, 0x4a, 0x38, 0x35, 0x38, 0x4e, 0x6c, 0x70, 0x76, \n\t0x66, 0x45, 0x41, 0x32, 0x50, 0x2b, 0x62, 0x64, 0x65, 0x33, 0x37, 0x6e, 0x43, 0x4a, 0x70, 0x49, 0x44, 0x5c, 0x0a,\n\t0x09, 0x55, 0x52, 0x66, 0x61, 0x38, 0x67, 0x38, 0x33, 0x68, 0x7a, 0x44, 0x79, 0x67, 0x78, 0x65, 0x77, 0x5a, \n\t0x62, 0x61, 0x33, 0x4e, 0x31, 0x38, 0x56, 0x79, 0x63, 0x50, 0x37, 0x77, 0x30, 0x6e, 0x67, 0x4f, 0x50, 0x6f, \n\t0x77, 0x77, 0x71, 0x6a, 0x65, 0x42, 0x6f, 0x45, 0x52, 0x52, 0x75, 0x6e, 0x6e, 0x68, 0x6f, 0x7a, 0x47, 0x61, \n\t0x6b, 0x41, 0x37, 0x75, 0x74, 0x46, 0x68, 0x35, 0x4e, 0x6c, 0x68, 0x70, 0x50, 0x35, 0x4e, 0x76, 0x61, 0x5c, 0x0a,\n\t0x09, 0x56, 0x66, 0x52, 0x38, 0x77, 0x66, 0x58, 0x33, 0x41, 0x6e, 0x54, 0x57, 0x6c, 0x6a, 0x44, 0x71, 0x4d, \n\t0x43, 0x37, 0x71, 0x56, 0x69, 0x36, 0x38, 0x77, 0x4f, 0x75, 0x64, 0x5a, 0x36, 0x70, 0x5a, 0x69, 0x71, 0x4d, \n\t0x66, 0x2f, 0x4f, 0x69, 0x66, 0x78, 0x71, 0x64, 0x45, 0x39, 0x79, 0x49, 0x4f, 0x70, 0x53, 0x57, 0x39, 0x35, \n\t0x33, 0x43, 0x30, 0x77, 0x33, 0x45, 0x46, 0x73, 0x58, 0x6e, 0x73, 0x54, 0x38, 0x39, 0x4e, 0x37, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x51, 0x71, 0x6f, 0x74, 0x52, 0x46, 0x2b, 0x58, 0x73, 0x69, 0x72, 0x52, 0x33, 0x66, 0x41, 0x32, \n\t0x67, 0x38, 0x72, 0x5a, 0x6d, 0x41, 0x55, 0x54, 0x31, 0x69, 0x50, 0x32, 0x75, 0x55, 0x78, 0x63, 0x58, 0x47, \n\t0x63, 0x4e, 0x37, 0x38, 0x55, 0x57, 0x31, 0x52, 0x6a, 0x44, 0x43, 0x4e, 0x52, 0x79, 0x77, 0x65, 0x52, 0x6d, \n\t0x4b, 0x6b, 0x33, 0x78, 0x63, 0x4c, 0x55, 0x30, 0x35, 0x69, 0x71, 0x73, 0x66, 0x43, 0x65, 0x7a, 0x66, 0x5c, 0x0a,\n\t0x09, 0x64, 0x43, 0x61, 0x78, 0x45, 0x35, 0x45, 0x50, 0x55, 0x67, 0x4d, 0x54, 0x75, 0x46, 0x58, 0x4e, 0x74, \n\t0x59, 0x46, 0x55, 0x66, 0x50, 0x2f, 0x79, 0x77, 0x7a, 0x6a, 0x52, 0x37, 0x4e, 0x61, 0x45, 0x4c, 0x4a, 0x6a, \n\t0x51, 0x31, 0x69, 0x39, 0x30, 0x65, 0x52, 0x2b, 0x6d, 0x79, 0x52, 0x5a, 0x34, 0x5a, 0x52, 0x51, 0x5a, 0x64, \n\t0x48, 0x4b, 0x34, 0x78, 0x45, 0x42, 0x78, 0x68, 0x46, 0x45, 0x56, 0x51, 0x52, 0x79, 0x31, 0x6b, 0x78, 0x5c, 0x0a,\n\t0x09, 0x64, 0x78, 0x7a, 0x6f, 0x48, 0x32, 0x55, 0x30, 0x37, 0x71, 0x51, 0x74, 0x66, 0x55, 0x78, 0x68, 0x31, \n\t0x4b, 0x68, 0x5a, 0x43, 0x67, 0x42, 0x43, 0x49, 0x49, 0x36, 0x5a, 0x66, 0x59, 0x56, 0x63, 0x61, 0x2b, 0x30, \n\t0x55, 0x55, 0x7a, 0x6e, 0x6c, 0x4e, 0x72, 0x6b, 0x63, 0x69, 0x48, 0x72, 0x51, 0x34, 0x6a, 0x75, 0x76, 0x51, \n\t0x64, 0x52, 0x72, 0x79, 0x4e, 0x57, 0x4e, 0x58, 0x53, 0x7a, 0x4f, 0x50, 0x70, 0x6d, 0x70, 0x65, 0x73, 0x5c, 0x0a,\n\t0x09, 0x2f, 0x76, 0x66, 0x73, 0x6a, 0x31, 0x31, 0x51, 0x52, 0x45, 0x61, 0x52, 0x6a, 0x56, 0x4f, 0x73, 0x42, \n\t0x49, 0x41, 0x63, 0x37, 0x49, 0x4c, 0x47, 0x63, 0x46, 0x33, 0x73, 0x4a, 0x4a, 0x68, 0x59, 0x59, 0x71, 0x41, \n\t0x37, 0x76, 0x72, 0x4e, 0x51, 0x49, 0x59, 0x69, 0x61, 0x6b, 0x72, 0x52, 0x39, 0x30, 0x41, 0x41, 0x41, 0x37, \n\t0x61, 0x53, 0x55, 0x52, 0x42, 0x56, 0x46, 0x6e, 0x37, 0x2f, 0x4a, 0x68, 0x33, 0x2f, 0x4e, 0x7a, 0x6e, 0x5c, 0x0a,\n\t0x09, 0x35, 0x4a, 0x48, 0x6d, 0x46, 0x30, 0x53, 0x6a, 0x78, 0x73, 0x4a, 0x66, 0x75, 0x53, 0x47, 0x5a, 0x54, \n\t0x51, 0x35, 0x45, 0x50, 0x57, 0x72, 0x78, 0x62, 0x36, 0x36, 0x44, 0x6d, 0x67, 0x66, 0x4e, 0x31, 0x6a, 0x61, \n\t0x4f, 0x6d, 0x6e, 0x73, 0x4f, 0x4e, 0x61, 0x2b, 0x33, 0x70, 0x78, 0x30, 0x44, 0x50, 0x34, 0x4a, 0x48, 0x44, \n\t0x6f, 0x79, 0x45, 0x79, 0x49, 0x56, 0x52, 0x2b, 0x2f, 0x6d, 0x6a, 0x4e, 0x49, 0x7a, 0x36, 0x5a, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x72, 0x6c, 0x31, 0x46, 0x67, 0x56, 0x4a, 0x73, 0x4b, 0x49, 0x36, 0x4d, 0x69, 0x47, 0x75, 0x5a, \n\t0x37, 0x61, 0x62, 0x6d, 0x4e, 0x64, 0x4e, 0x38, 0x75, 0x67, 0x4a, 0x67, 0x33, 0x52, 0x34, 0x48, 0x69, 0x36, \n\t0x4a, 0x6b, 0x37, 0x35, 0x45, 0x62, 0x72, 0x39, 0x38, 0x52, 0x55, 0x6a, 0x59, 0x56, 0x33, 0x62, 0x39, 0x34, \n\t0x58, 0x57, 0x6f, 0x76, 0x49, 0x67, 0x61, 0x67, 0x50, 0x32, 0x76, 0x4c, 0x65, 0x6d, 0x36, 0x42, 0x52, 0x5c, 0x0a,\n\t0x09, 0x68, 0x2f, 0x58, 0x6d, 0x70, 0x57, 0x79, 0x64, 0x66, 0x7a, 0x6d, 0x65, 0x56, 0x2b, 0x71, 0x74, 0x68, \n\t0x5a, 0x54, 0x38, 0x56, 0x6a, 0x52, 0x4a, 0x48, 0x51, 0x2f, 0x48, 0x44, 0x44, 0x43, 0x4b, 0x50, 0x2b, 0x71, \n\t0x59, 0x50, 0x47, 0x47, 0x64, 0x68, 0x6c, 0x46, 0x78, 0x79, 0x31, 0x6e, 0x52, 0x70, 0x65, 0x56, 0x73, 0x4f, \n\t0x77, 0x49, 0x79, 0x77, 0x55, 0x68, 0x4d, 0x48, 0x31, 0x58, 0x73, 0x6c, 0x6a, 0x34, 0x4d, 0x48, 0x30, 0x5c, 0x0a,\n\t0x09, 0x5a, 0x6c, 0x56, 0x4c, 0x42, 0x64, 0x63, 0x56, 0x54, 0x57, 0x6a, 0x55, 0x44, 0x4d, 0x4e, 0x56, 0x62, \n\t0x45, 0x58, 0x50, 0x30, 0x58, 0x61, 0x4e, 0x52, 0x59, 0x2b, 0x50, 0x76, 0x76, 0x6c, 0x2b, 0x31, 0x35, 0x30, \n\t0x38, 0x6d, 0x42, 0x71, 0x45, 0x2f, 0x61, 0x38, 0x74, 0x36, 0x62, 0x77, 0x6a, 0x74, 0x70, 0x47, 0x36, 0x30, \n\t0x76, 0x63, 0x65, 0x7a, 0x43, 0x36, 0x36, 0x68, 0x31, 0x65, 0x57, 0x67, 0x44, 0x69, 0x59, 0x68, 0x76, 0x5c, 0x0a,\n\t0x09, 0x33, 0x33, 0x74, 0x70, 0x49, 0x47, 0x56, 0x67, 0x35, 0x45, 0x57, 0x76, 0x66, 0x4d, 0x53, 0x33, 0x2f, \n\t0x4c, 0x74, 0x77, 0x65, 0x59, 0x77, 0x6e, 0x76, 0x50, 0x76, 0x74, 0x38, 0x69, 0x6a, 0x6d, 0x6a, 0x69, 0x38, \n\t0x32, 0x58, 0x77, 0x54, 0x44, 0x68, 0x56, 0x48, 0x33, 0x2f, 0x30, 0x56, 0x59, 0x32, 0x78, 0x57, 0x4c, 0x30, \n\t0x36, 0x44, 0x4f, 0x2f, 0x7a, 0x53, 0x38, 0x51, 0x42, 0x77, 0x31, 0x2f, 0x51, 0x79, 0x35, 0x34, 0x52, 0x5c, 0x0a,\n\t0x09, 0x38, 0x53, 0x44, 0x58, 0x65, 0x4a, 0x46, 0x5a, 0x45, 0x37, 0x53, 0x6e, 0x33, 0x55, 0x6c, 0x6e, 0x2b, \n\t0x34, 0x47, 0x61, 0x59, 0x62, 0x73, 0x4e, 0x48, 0x36, 0x6d, 0x44, 0x68, 0x75, 0x79, 0x2b, 0x75, 0x6f, 0x64, \n\t0x78, 0x45, 0x5a, 0x52, 0x62, 0x42, 0x4a, 0x77, 0x53, 0x67, 0x42, 0x55, 0x73, 0x30, 0x4d, 0x6f, 0x33, 0x68, \n\t0x65, 0x70, 0x32, 0x65, 0x58, 0x52, 0x77, 0x75, 0x4d, 0x39, 0x47, 0x47, 0x59, 0x7a, 0x65, 0x56, 0x52, 0x5c, 0x0a,\n\t0x09, 0x58, 0x52, 0x64, 0x65, 0x4e, 0x46, 0x39, 0x55, 0x38, 0x42, 0x53, 0x72, 0x4b, 0x6f, 0x79, 0x4b, 0x7a, \n\t0x47, 0x55, 0x4a, 0x38, 0x45, 0x36, 0x4d, 0x33, 0x41, 0x67, 0x38, 0x67, 0x58, 0x66, 0x38, 0x2f, 0x47, 0x76, \n\t0x6c, 0x75, 0x6e, 0x2b, 0x74, 0x61, 0x4e, 0x52, 0x59, 0x65, 0x4c, 0x65, 0x37, 0x53, 0x31, 0x5a, 0x45, 0x44, \n\t0x6b, 0x52, 0x39, 0x31, 0x70, 0x62, 0x33, 0x33, 0x6f, 0x53, 0x59, 0x6d, 0x55, 0x4a, 0x75, 0x4e, 0x44, 0x5c, 0x0a,\n\t0x09, 0x38, 0x71, 0x54, 0x6a, 0x6a, 0x71, 0x64, 0x4f, 0x6f, 0x6c, 0x37, 0x35, 0x54, 0x55, 0x47, 0x6b, 0x6f, \n\t0x45, 0x70, 0x4d, 0x46, 0x49, 0x4e, 0x55, 0x34, 0x7a, 0x77, 0x53, 0x69, 0x2b, 0x35, 0x57, 0x2b, 0x44, 0x55, \n\t0x65, 0x7a, 0x79, 0x6d, 0x41, 0x73, 0x6a, 0x4c, 0x78, 0x39, 0x47, 0x38, 0x62, 0x38, 0x69, 0x6c, 0x72, 0x4f, \n\t0x31, 0x4b, 0x63, 0x54, 0x43, 0x69, 0x63, 0x58, 0x33, 0x66, 0x59, 0x78, 0x68, 0x35, 0x4a, 0x32, 0x79, 0x5c, 0x0a,\n\t0x09, 0x47, 0x45, 0x4c, 0x6f, 0x78, 0x49, 0x55, 0x50, 0x79, 0x64, 0x58, 0x57, 0x32, 0x57, 0x4b, 0x6d, 0x37, \n\t0x6d, 0x37, 0x56, 0x6c, 0x35, 0x41, 0x44, 0x30, 0x51, 0x43, 0x30, 0x2b, 0x48, 0x63, 0x33, 0x68, 0x4c, 0x66, \n\t0x32, 0x4e, 0x31, 0x6f, 0x66, 0x46, 0x79, 0x64, 0x76, 0x50, 0x5a, 0x31, 0x47, 0x72, 0x66, 0x42, 0x70, 0x37, \n\t0x38, 0x30, 0x73, 0x64, 0x6f, 0x53, 0x52, 0x69, 0x43, 0x4f, 0x6b, 0x50, 0x42, 0x67, 0x70, 0x41, 0x42, 0x5c, 0x0a,\n\t0x09, 0x71, 0x6c, 0x35, 0x61, 0x78, 0x6f, 0x7a, 0x49, 0x65, 0x57, 0x49, 0x55, 0x55, 0x31, 0x70, 0x6a, 0x41, \n\t0x53, 0x30, 0x33, 0x56, 0x71, 0x6a, 0x7a, 0x2f, 0x75, 0x58, 0x32, 0x51, 0x51, 0x76, 0x46, 0x6e, 0x4d, 0x31, \n\t0x4e, 0x33, 0x6b, 0x64, 0x45, 0x6b, 0x35, 0x45, 0x41, 0x31, 0x49, 0x69, 0x2b, 0x2b, 0x2b, 0x48, 0x6a, 0x45, \n\t0x33, 0x6a, 0x56, 0x78, 0x72, 0x66, 0x6b, 0x79, 0x63, 0x63, 0x75, 0x77, 0x66, 0x4d, 0x31, 0x55, 0x76, 0x5c, 0x0a,\n\t0x09, 0x64, 0x74, 0x72, 0x50, 0x62, 0x79, 0x48, 0x35, 0x6d, 0x6d, 0x78, 0x79, 0x68, 0x36, 0x79, 0x4f, 0x73, \n\t0x4d, 0x4c, 0x49, 0x4d, 0x38, 0x4f, 0x6f, 0x62, 0x35, 0x61, 0x7a, 0x6d, 0x47, 0x47, 0x6b, 0x44, 0x4d, 0x63, \n\t0x36, 0x75, 0x54, 0x79, 0x4b, 0x32, 0x57, 0x4d, 0x51, 0x2b, 0x6e, 0x66, 0x52, 0x38, 0x6a, 0x53, 0x65, 0x4d, \n\t0x50, 0x71, 0x6b, 0x32, 0x44, 0x4c, 0x39, 0x4a, 0x75, 0x2b, 0x34, 0x4f, 0x52, 0x62, 0x65, 0x34, 0x79, 0x5c, 0x0a,\n\t0x09, 0x42, 0x55, 0x56, 0x67, 0x35, 0x45, 0x41, 0x39, 0x54, 0x69, 0x75, 0x36, 0x34, 0x4e, 0x59, 0x62, 0x53, \n\t0x36, 0x38, 0x55, 0x6c, 0x78, 0x79, 0x6a, 0x46, 0x2f, 0x79, 0x45, 0x79, 0x6a, 0x34, 0x32, 0x6b, 0x76, 0x46, \n\t0x6f, 0x2b, 0x48, 0x57, 0x72, 0x30, 0x4e, 0x49, 0x36, 0x39, 0x42, 0x63, 0x6e, 0x66, 0x4c, 0x43, 0x4b, 0x4e, \n\t0x36, 0x46, 0x4f, 0x55, 0x49, 0x4d, 0x34, 0x77, 0x53, 0x57, 0x35, 0x44, 0x52, 0x75, 0x6a, 0x79, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x2b, 0x52, 0x4f, 0x4b, 0x54, 0x31, 0x36, 0x44, 0x48, 0x55, 0x5a, 0x46, 0x69, 0x39, 0x6f, 0x79, 0x42, \n\t0x67, 0x4f, 0x6a, 0x53, 0x35, 0x43, 0x38, 0x54, 0x6a, 0x52, 0x71, 0x7a, 0x4c, 0x2f, 0x35, 0x6d, 0x68, 0x4b, \n\t0x4e, 0x4f, 0x63, 0x56, 0x79, 0x49, 0x42, 0x71, 0x77, 0x46, 0x74, 0x39, 0x78, 0x4e, 0x57, 0x4a, 0x75, 0x43, \n\t0x72, 0x6d, 0x32, 0x38, 0x57, 0x6c, 0x78, 0x38, 0x6a, 0x45, 0x76, 0x5a, 0x61, 0x5a, 0x68, 0x66, 0x63, 0x5c, 0x0a,\n\t0x09, 0x35, 0x49, 0x7a, 0x4d, 0x77, 0x6a, 0x5a, 0x68, 0x64, 0x44, 0x2b, 0x47, 0x67, 0x77, 0x45, 0x6c, 0x35, \n\t0x37, 0x48, 0x69, 0x63, 0x44, 0x6f, 0x33, 0x6a, 0x34, 0x70, 0x6a, 0x78, 0x44, 0x4e, 0x44, 0x4b, 0x58, 0x52, \n\t0x78, 0x75, 0x4d, 0x76, 0x42, 0x72, 0x65, 0x34, 0x73, 0x6b, 0x6b, 0x7a, 0x79, 0x6f, 0x56, 0x55, 0x61, 0x2f, \n\t0x76, 0x70, 0x5a, 0x56, 0x6f, 0x74, 0x77, 0x63, 0x59, 0x58, 0x51, 0x75, 0x38, 0x68, 0x50, 0x42, 0x44, 0x5c, 0x0a,\n\t0x09, 0x43, 0x30, 0x35, 0x64, 0x79, 0x6f, 0x46, 0x6f, 0x43, 0x46, 0x70, 0x38, 0x2b, 0x39, 0x57, 0x49, 0x32, \n\t0x57, 0x6e, 0x6b, 0x32, 0x73, 0x61, 0x58, 0x78, 0x53, 0x4f, 0x50, 0x66, 0x52, 0x35, 0x7a, 0x55, 0x30, 0x59, \n\t0x44, 0x47, 0x31, 0x6d, 0x54, 0x79, 0x4d, 0x4d, 0x37, 0x32, 0x33, 0x4d, 0x7a, 0x42, 0x68, 0x69, 0x46, 0x51, \n\t0x37, 0x59, 0x59, 0x4f, 0x50, 0x45, 0x74, 0x66, 0x41, 0x56, 0x47, 0x79, 0x70, 0x41, 0x73, 0x31, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x58, 0x52, 0x42, 0x71, 0x50, 0x45, 0x70, 0x32, 0x67, 0x41, 0x6c, 0x72, 0x4f, 0x31, 0x42, 0x74, 0x36, \n\t0x57, 0x6b, 0x38, 0x73, 0x64, 0x76, 0x45, 0x47, 0x38, 0x4a, 0x47, 0x74, 0x4a, 0x37, 0x77, 0x4a, 0x47, 0x32, \n\t0x34, 0x44, 0x6e, 0x41, 0x30, 0x73, 0x41, 0x73, 0x37, 0x39, 0x2f, 0x61, 0x59, 0x6b, 0x47, 0x6e, 0x46, 0x51, \n\t0x35, 0x45, 0x41, 0x31, 0x4a, 0x69, 0x32, 0x2b, 0x37, 0x4b, 0x68, 0x71, 0x6d, 0x72, 0x58, 0x39, 0x44, 0x5c, 0x0a,\n\t0x09, 0x50, 0x47, 0x4c, 0x72, 0x4d, 0x35, 0x69, 0x66, 0x7a, 0x76, 0x34, 0x50, 0x4f, 0x75, 0x32, 0x78, 0x2b, \n\t0x74, 0x57, 0x33, 0x45, 0x4f, 0x79, 0x2b, 0x72, 0x54, 0x30, 0x52, 0x4c, 0x54, 0x77, 0x7a, 0x6a, 0x42, 0x4c, \n\t0x54, 0x4e, 0x41, 0x75, 0x4d, 0x76, 0x46, 0x70, 0x6e, 0x47, 0x49, 0x33, 0x43, 0x63, 0x72, 0x59, 0x2b, 0x67, \n\t0x31, 0x68, 0x38, 0x52, 0x42, 0x2b, 0x65, 0x63, 0x75, 0x34, 0x44, 0x6a, 0x45, 0x78, 0x46, 0x69, 0x35, 0x5c, 0x0a,\n\t0x09, 0x65, 0x39, 0x44, 0x38, 0x6d, 0x7a, 0x6b, 0x65, 0x77, 0x42, 0x42, 0x36, 0x46, 0x65, 0x35, 0x55, 0x41, \n\t0x30, 0x52, 0x43, 0x33, 0x2b, 0x78, 0x58, 0x66, 0x44, 0x57, 0x2f, 0x74, 0x72, 0x7a, 0x65, 0x2b, 0x49, 0x6b, \n\t0x34, 0x39, 0x35, 0x47, 0x76, 0x50, 0x54, 0x36, 0x32, 0x71, 0x2b, 0x6d, 0x4a, 0x74, 0x47, 0x72, 0x69, 0x2b, \n\t0x7a, 0x2b, 0x68, 0x2f, 0x76, 0x70, 0x48, 0x58, 0x37, 0x78, 0x52, 0x46, 0x59, 0x47, 0x70, 0x31, 0x68, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x4e, 0x79, 0x4f, 0x4e, 0x38, 0x4e, 0x49, 0x76, 0x59, 0x4d, 0x32, 0x47, 0x4d, 0x76, 0x5a, 0x37, \n\t0x50, 0x4e, 0x47, 0x65, 0x53, 0x36, 0x50, 0x59, 0x6d, 0x6f, 0x42, 0x4d, 0x58, 0x39, 0x63, 0x75, 0x52, 0x42, \n\t0x6b, 0x53, 0x50, 0x59, 0x68, 0x75, 0x65, 0x6c, 0x74, 0x50, 0x51, 0x67, 0x38, 0x45, 0x33, 0x67, 0x41, 0x48, \n\t0x49, 0x54, 0x36, 0x49, 0x53, 0x45, 0x4c, 0x6e, 0x67, 0x7a, 0x4a, 0x2f, 0x49, 0x46, 0x54, 0x7a, 0x31, 0x5c, 0x0a,\n\t0x09, 0x72, 0x36, 0x70, 0x36, 0x63, 0x6a, 0x6a, 0x36, 0x77, 0x6a, 0x70, 0x75, 0x71, 0x50, 0x6b, 0x58, 0x73, \n\t0x4f, 0x33, 0x38, 0x44, 0x79, 0x32, 0x68, 0x59, 0x41, 0x38, 0x59, 0x52, 0x48, 0x70, 0x74, 0x37, 0x6b, 0x72, \n\t0x76, 0x2f, 0x6b, 0x73, 0x35, 0x6a, 0x2b, 0x78, 0x64, 0x50, 0x44, 0x43, 0x39, 0x6c, 0x76, 0x49, 0x6f, 0x4d, \n\t0x57, 0x53, 0x44, 0x39, 0x38, 0x44, 0x53, 0x52, 0x6f, 0x49, 0x67, 0x4d, 0x66, 0x2f, 0x47, 0x62, 0x34, 0x5c, 0x0a,\n\t0x09, 0x66, 0x6c, 0x72, 0x51, 0x43, 0x76, 0x39, 0x4a, 0x69, 0x5a, 0x54, 0x52, 0x73, 0x68, 0x2b, 0x56, 0x44, \n\t0x2f, 0x79, 0x77, 0x72, 0x50, 0x52, 0x44, 0x6d, 0x35, 0x45, 0x6f, 0x6a, 0x63, 0x41, 0x48, 0x6f, 0x72, 0x7a, \n\t0x41, 0x42, 0x78, 0x6d, 0x45, 0x63, 0x4a, 0x42, 0x52, 0x57, 0x52, 0x6c, 0x45, 0x39, 0x51, 0x4b, 0x51, 0x41, \n\t0x55, 0x49, 0x47, 0x67, 0x45, 0x54, 0x4b, 0x71, 0x41, 0x30, 0x70, 0x77, 0x37, 0x7a, 0x41, 0x42, 0x36, 0x5c, 0x0a,\n\t0x09, 0x52, 0x53, 0x50, 0x30, 0x6a, 0x57, 0x70, 0x62, 0x49, 0x63, 0x67, 0x6b, 0x63, 0x43, 0x34, 0x62, 0x4a, \n\t0x63, 0x66, 0x68, 0x69, 0x35, 0x64, 0x72, 0x41, 0x64, 0x58, 0x52, 0x57, 0x52, 0x71, 0x61, 0x67, 0x77, 0x6e, \n\t0x38, 0x50, 0x47, 0x56, 0x6f, 0x33, 0x31, 0x4c, 0x55, 0x6e, 0x6d, 0x7a, 0x58, 0x6f, 0x51, 0x2b, 0x44, 0x56, \n\t0x67, 0x4f, 0x38, 0x44, 0x73, 0x4b, 0x78, 0x79, 0x45, 0x38, 0x6c, 0x53, 0x59, 0x4c, 0x77, 0x35, 0x45, 0x5c, 0x0a,\n\t0x09, 0x6f, 0x39, 0x48, 0x53, 0x65, 0x35, 0x2b, 0x4b, 0x58, 0x47, 0x73, 0x69, 0x70, 0x75, 0x72, 0x48, 0x79, \n\t0x72, 0x32, 0x48, 0x74, 0x2b, 0x47, 0x4a, 0x34, 0x38, 0x57, 0x50, 0x5a, 0x78, 0x2f, 0x2b, 0x38, 0x34, 0x35, \n\t0x2f, 0x48, 0x44, 0x4f, 0x2f, 0x2f, 0x6a, 0x62, 0x45, 0x37, 0x46, 0x46, 0x74, 0x47, 0x50, 0x6e, 0x4e, 0x43, \n\t0x41, 0x41, 0x57, 0x47, 0x41, 0x55, 0x74, 0x4a, 0x44, 0x49, 0x48, 0x52, 0x69, 0x47, 0x77, 0x37, 0x44, 0x5c, 0x0a,\n\t0x09, 0x44, 0x79, 0x46, 0x53, 0x42, 0x6c, 0x59, 0x53, 0x52, 0x6c, 0x4e, 0x4d, 0x56, 0x6c, 0x68, 0x5a, 0x45, \n\t0x43, 0x48, 0x52, 0x31, 0x47, 0x79, 0x43, 0x67, 0x76, 0x67, 0x74, 0x47, 0x68, 0x42, 0x35, 0x44, 0x4e, 0x49, \n\t0x2b, 0x4d, 0x43, 0x49, 0x77, 0x65, 0x68, 0x6b, 0x69, 0x72, 0x4b, 0x46, 0x7a, 0x63, 0x30, 0x47, 0x35, 0x45, \n\t0x57, 0x33, 0x33, 0x34, 0x31, 0x59, 0x71, 0x71, 0x4f, 0x58, 0x46, 0x37, 0x64, 0x52, 0x36, 0x50, 0x32, 0x5c, 0x0a,\n\t0x09, 0x49, 0x2b, 0x4b, 0x6b, 0x6f, 0x37, 0x39, 0x6f, 0x4b, 0x68, 0x66, 0x73, 0x75, 0x5a, 0x50, 0x56, 0x72, \n\t0x2f, 0x77, 0x70, 0x2f, 0x75, 0x35, 0x74, 0x55, 0x47, 0x74, 0x6f, 0x7a, 0x78, 0x6a, 0x56, 0x30, 0x73, 0x4d, \n\t0x30, 0x39, 0x59, 0x33, 0x39, 0x76, 0x72, 0x67, 0x38, 0x61, 0x73, 0x4d, 0x30, 0x6f, 0x62, 0x6b, 0x38, 0x57, \n\t0x69, 0x31, 0x6e, 0x34, 0x7a, 0x6b, 0x6b, 0x66, 0x5a, 0x69, 0x6d, 0x44, 0x4e, 0x66, 0x69, 0x5a, 0x35, 0x5c, 0x0a,\n\t0x09, 0x69, 0x32, 0x6e, 0x46, 0x7a, 0x75, 0x74, 0x6a, 0x34, 0x4d, 0x62, 0x5a, 0x69, 0x6d, 0x76, 0x62, 0x48, \n\t0x76, 0x49, 0x44, 0x52, 0x41, 0x75, 0x59, 0x68, 0x6f, 0x78, 0x44, 0x72, 0x38, 0x35, 0x7a, 0x38, 0x44, 0x63, \n\t0x39, 0x4d, 0x77, 0x4e, 0x34, 0x32, 0x59, 0x6e, 0x2f, 0x35, 0x4c, 0x34, 0x4f, 0x38, 0x78, 0x2f, 0x51, 0x63, \n\t0x68, 0x50, 0x42, 0x71, 0x6e, 0x76, 0x70, 0x53, 0x70, 0x55, 0x31, 0x38, 0x47, 0x51, 0x64, 0x43, 0x4f, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x4f, 0x49, 0x49, 0x53, 0x41, 0x62, 0x6d, 0x79, 0x43, 0x6a, 0x77, 0x67, 0x63, 0x41, 0x65, 0x47, \n\t0x51, 0x56, 0x2b, 0x4f, 0x7a, 0x6f, 0x79, 0x52, 0x6b, 0x5a, 0x42, 0x38, 0x73, 0x38, 0x59, 0x47, 0x53, 0x6e, \n\t0x52, 0x54, 0x66, 0x6e, 0x49, 0x4b, 0x4d, 0x72, 0x33, 0x6d, 0x77, 0x53, 0x48, 0x64, 0x6b, 0x54, 0x70, 0x4a, \n\t0x54, 0x53, 0x38, 0x79, 0x4f, 0x68, 0x75, 0x42, 0x4d, 0x2f, 0x42, 0x51, 0x61, 0x69, 0x30, 0x33, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x42, 0x73, 0x7a, 0x4c, 0x54, 0x30, 0x6b, 0x64, 0x50, 0x69, 0x78, 0x65, 0x63, 0x42, 0x6e, 0x77, 0x65, \n\t0x4f, 0x4e, 0x70, 0x57, 0x72, 0x6e, 0x66, 0x68, 0x54, 0x54, 0x50, 0x2f, 0x71, 0x6d, 0x78, 0x47, 0x7a, 0x57, \n\t0x38, 0x76, 0x42, 0x4b, 0x47, 0x69, 0x31, 0x34, 0x57, 0x4b, 0x43, 0x55, 0x51, 0x77, 0x6b, 0x47, 0x34, 0x77, \n\t0x69, 0x77, 0x46, 0x68, 0x68, 0x70, 0x4d, 0x4c, 0x46, 0x42, 0x4b, 0x4e, 0x6f, 0x4f, 0x47, 0x65, 0x44, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x57, 0x79, 0x75, 0x49, 0x41, 0x38, 0x39, 0x61, 0x4a, 0x75, 0x58, 0x4d, 0x63, 0x74, 0x57, 0x74, \n\t0x72, 0x38, 0x77, 0x2b, 0x67, 0x48, 0x77, 0x62, 0x47, 0x43, 0x6e, 0x45, 0x41, 0x35, 0x43, 0x5a, 0x65, 0x56, \n\t0x41, 0x4e, 0x49, 0x5a, 0x53, 0x59, 0x50, 0x51, 0x54, 0x77, 0x46, 0x65, 0x41, 0x6e, 0x7a, 0x61, 0x56, 0x45, \n\t0x31, 0x4e, 0x7a, 0x54, 0x44, 0x33, 0x39, 0x64, 0x64, 0x51, 0x66, 0x2f, 0x5a, 0x51, 0x73, 0x6a, 0x46, 0x5c, 0x0a,\n\t0x09, 0x53, 0x77, 0x47, 0x47, 0x48, 0x55, 0x42, 0x6f, 0x73, 0x5a, 0x52, 0x67, 0x70, 0x77, 0x44, 0x44, 0x43, \n\t0x53, 0x53, 0x6f, 0x52, 0x6b, 0x68, 0x46, 0x45, 0x38, 0x66, 0x32, 0x53, 0x42, 0x6b, 0x55, 0x7a, 0x6d, 0x69, \n\t0x41, 0x77, 0x77, 0x57, 0x6a, 0x75, 0x45, 0x58, 0x4e, 0x37, 0x56, 0x2b, 0x33, 0x77, 0x52, 0x30, 0x6a, 0x37, \n\t0x6e, 0x55, 0x37, 0x53, 0x4e, 0x4d, 0x4f, 0x31, 0x4b, 0x34, 0x44, 0x65, 0x42, 0x51, 0x77, 0x42, 0x7a, 0x5c, 0x0a,\n\t0x09, 0x72, 0x33, 0x51, 0x51, 0x4b, 0x69, 0x73, 0x48, 0x6f, 0x6a, 0x47, 0x56, 0x41, 0x71, 0x4d, 0x46, 0x34, \n\t0x46, 0x38, 0x4a, 0x6e, 0x39, 0x6f, 0x31, 0x71, 0x76, 0x35, 0x6a, 0x54, 0x32, 0x66, 0x71, 0x46, 0x31, 0x34, \n\t0x46, 0x6a, 0x64, 0x6b, 0x73, 0x6a, 0x50, 0x77, 0x6f, 0x41, 0x72, 0x4c, 0x42, 0x4b, 0x4c, 0x37, 0x44, 0x5a, \n\t0x6f, 0x46, 0x52, 0x41, 0x70, 0x78, 0x75, 0x59, 0x61, 0x52, 0x48, 0x53, 0x52, 0x6b, 0x59, 0x52, 0x63, 0x5c, 0x0a,\n\t0x09, 0x4d, 0x77, 0x48, 0x55, 0x59, 0x72, 0x44, 0x79, 0x4e, 0x58, 0x44, 0x31, 0x51, 0x42, 0x52, 0x6c, 0x39, \n\t0x47, 0x38, 0x50, 0x76, 0x41, 0x45, 0x58, 0x41, 0x51, 0x36, 0x6c, 0x59, 0x4f, 0x52, 0x47, 0x4d, 0x73, 0x42, \n\t0x55, 0x59, 0x43, 0x2b, 0x44, 0x50, 0x43, 0x65, 0x53, 0x50, 0x6a, 0x74, 0x35, 0x33, 0x46, 0x39, 0x43, 0x4a, \n\t0x54, 0x54, 0x33, 0x6b, 0x6c, 0x74, 0x52, 0x39, 0x39, 0x6d, 0x68, 0x6c, 0x47, 0x51, 0x52, 0x70, 0x49, 0x5c, 0x0a,\n\t0x09, 0x47, 0x52, 0x67, 0x46, 0x66, 0x6e, 0x69, 0x79, 0x32, 0x47, 0x43, 0x6b, 0x44, 0x4d, 0x58, 0x4d, 0x4d, \n\t0x41, 0x71, 0x68, 0x30, 0x31, 0x63, 0x59, 0x48, 0x62, 0x71, 0x2f, 0x50, 0x33, 0x66, 0x53, 0x75, 0x6f, 0x66, \n\t0x52, 0x50, 0x77, 0x44, 0x76, 0x67, 0x50, 0x41, 0x52, 0x4b, 0x67, 0x65, 0x68, 0x37, 0x75, 0x56, 0x41, 0x4e, \n\t0x4f, 0x5a, 0x53, 0x59, 0x41, 0x54, 0x77, 0x5a, 0x4f, 0x41, 0x4c, 0x77, 0x47, 0x4e, 0x73, 0x35, 0x57, 0x5c, 0x0a,\n\t0x09, 0x75, 0x50, 0x66, 0x43, 0x4a, 0x54, 0x54, 0x33, 0x6b, 0x56, 0x59, 0x6d, 0x61, 0x4c, 0x47, 0x55, 0x59, \n\t0x4b, 0x6b, 0x41, 0x59, 0x42, 0x49, 0x34, 0x45, 0x4d, 0x4a, 0x39, 0x47, 0x37, 0x67, 0x56, 0x48, 0x79, 0x66, \n\t0x4a, 0x46, 0x4d, 0x74, 0x6a, 0x45, 0x34, 0x63, 0x47, 0x2b, 0x34, 0x4c, 0x63, 0x4f, 0x46, 0x30, 0x51, 0x61, \n\t0x43, 0x50, 0x77, 0x4c, 0x4f, 0x69, 0x52, 0x50, 0x6d, 0x2f, 0x73, 0x42, 0x42, 0x71, 0x42, 0x63, 0x35, 0x5c, 0x0a,\n\t0x09, 0x45, 0x45, 0x32, 0x49, 0x74, 0x4b, 0x48, 0x61, 0x6d, 0x63, 0x44, 0x76, 0x32, 0x38, 0x71, 0x4b, 0x71, \n\t0x56, 0x6b, 0x61, 0x50, 0x2f, 0x50, 0x62, 0x31, 0x42, 0x2f, 0x33, 0x36, 0x32, 0x46, 0x43, 0x57, 0x52, 0x6a, \n\t0x46, 0x38, 0x7a, 0x70, 0x57, 0x47, 0x4b, 0x57, 0x66, 0x4c, 0x38, 0x72, 0x41, 0x4b, 0x49, 0x35, 0x6f, 0x62, \n\t0x44, 0x44, 0x53, 0x37, 0x35, 0x62, 0x70, 0x4d, 0x4a, 0x4a, 0x42, 0x53, 0x41, 0x67, 0x5a, 0x49, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x65, 0x58, 0x6b, 0x59, 0x63, 0x66, 0x69, 0x48, 0x5a, 0x73, 0x4b, 0x44, 0x42, 0x36, 0x45, 0x48, 0x67, \n\t0x5a, 0x63, 0x42, 0x58, 0x43, 0x41, 0x61, 0x68, 0x66, 0x63, 0x69, 0x43, 0x61, 0x49, 0x47, 0x6e, 0x52, 0x30, \n\t0x66, 0x38, 0x41, 0x50, 0x67, 0x71, 0x59, 0x33, 0x65, 0x6d, 0x46, 0x51, 0x43, 0x77, 0x63, 0x7a, 0x39, 0x53, \n\t0x70, 0x4c, 0x36, 0x4e, 0x32, 0x79, 0x68, 0x50, 0x4e, 0x4d, 0x49, 0x6f, 0x42, 0x59, 0x34, 0x4e, 0x52, 0x5c, 0x0a,\n\t0x09, 0x66, 0x4d, 0x76, 0x66, 0x42, 0x71, 0x4d, 0x67, 0x43, 0x50, 0x4f, 0x74, 0x4d, 0x49, 0x70, 0x75, 0x31, \n\t0x64, 0x74, 0x67, 0x46, 0x41, 0x4f, 0x4a, 0x38, 0x4c, 0x47, 0x42, 0x44, 0x49, 0x79, 0x69, 0x50, 0x4c, 0x6d, \n\t0x30, 0x45, 0x37, 0x6c, 0x32, 0x4b, 0x4e, 0x6d, 0x76, 0x77, 0x69, 0x6f, 0x50, 0x6f, 0x30, 0x75, 0x41, 0x33, \n\t0x77, 0x4d, 0x65, 0x42, 0x70, 0x68, 0x37, 0x6c, 0x59, 0x4e, 0x51, 0x76, 0x2b, 0x52, 0x41, 0x4e, 0x49, 0x5c, 0x0a,\n\t0x09, 0x46, 0x53, 0x67, 0x48, 0x51, 0x4b, 0x63, 0x42, 0x62, 0x77, 0x41, 0x6d, 0x50, 0x42, 0x36, 0x4c, 0x66, \n\t0x79, 0x54, 0x6e, 0x67, 0x63, 0x55, 0x36, 0x66, 0x2b, 0x44, 0x74, 0x35, 0x52, 0x70, 0x78, 0x68, 0x68, 0x4a, \n\t0x4e, 0x58, 0x35, 0x49, 0x78, 0x4f, 0x4d, 0x31, 0x46, 0x76, 0x33, 0x4a, 0x68, 0x6a, 0x4a, 0x4f, 0x49, 0x4c, \n\t0x71, 0x45, 0x6b, 0x5a, 0x78, 0x42, 0x47, 0x53, 0x44, 0x55, 0x64, 0x41, 0x6b, 0x32, 0x48, 0x39, 0x33, 0x5c, 0x0a,\n\t0x09, 0x65, 0x79, 0x36, 0x70, 0x2f, 0x7a, 0x41, 0x4b, 0x67, 0x4c, 0x38, 0x56, 0x38, 0x4c, 0x65, 0x41, 0x44, \n\t0x77, 0x35, 0x43, 0x2f, 0x5a, 0x59, 0x44, 0x30, 0x59, 0x52, 0x4b, 0x69, 0x34, 0x35, 0x65, 0x44, 0x6e, 0x77, \n\t0x59, 0x79, 0x48, 0x35, 0x49, 0x54, 0x50, 0x6d, 0x39, 0x61, 0x6f, 0x39, 0x36, 0x45, 0x6f, 0x30, 0x6e, 0x50, \n\t0x42, 0x2b, 0x78, 0x63, 0x4c, 0x77, 0x46, 0x52, 0x71, 0x30, 0x32, 0x57, 0x45, 0x77, 0x77, 0x55, 0x75, 0x5c, 0x0a,\n\t0x09, 0x36, 0x63, 0x47, 0x57, 0x45, 0x55, 0x51, 0x63, 0x59, 0x4f, 0x49, 0x7a, 0x38, 0x4b, 0x63, 0x73, 0x72, \n\t0x44, 0x53, 0x4b, 0x34, 0x38, 0x6a, 0x44, 0x79, 0x79, 0x7a, 0x37, 0x68, 0x66, 0x48, 0x5a, 0x55, 0x50, 0x6f, \n\t0x2f, 0x75, 0x42, 0x56, 0x77, 0x43, 0x58, 0x78, 0x55, 0x55, 0x64, 0x68, 0x50, 0x6f, 0x76, 0x42, 0x36, 0x49, \n\t0x4a, 0x6c, 0x77, 0x4b, 0x6b, 0x34, 0x34, 0x41, 0x50, 0x41, 0x76, 0x38, 0x7a, 0x56, 0x53, 0x44, 0x31, 0x5c, 0x0a,\n\t0x09, 0x65, 0x30, 0x6b, 0x51, 0x67, 0x74, 0x6f, 0x6a, 0x6e, 0x30, 0x54, 0x6a, 0x63, 0x63, 0x39, 0x43, 0x4c, \n\t0x4a, 0x35, 0x6b, 0x68, 0x70, 0x48, 0x66, 0x51, 0x70, 0x30, 0x6a, 0x47, 0x69, 0x71, 0x4d, 0x34, 0x71, 0x65, \n\t0x76, 0x64, 0x52, 0x67, 0x46, 0x47, 0x77, 0x54, 0x37, 0x74, 0x6d, 0x50, 0x66, 0x74, 0x77, 0x34, 0x79, 0x77, \n\t0x2b, 0x68, 0x66, 0x45, 0x62, 0x77, 0x4a, 0x4f, 0x41, 0x77, 0x77, 0x37, 0x77, 0x41, 0x30, 0x4d, 0x44, 0x5c, 0x0a,\n\t0x09, 0x6b, 0x51, 0x62, 0x51, 0x4a, 0x70, 0x30, 0x64, 0x45, 0x7a, 0x43, 0x61, 0x4f, 0x6a, 0x78, 0x79, 0x63, \n\t0x70, 0x4f, 0x6f, 0x7a, 0x43, 0x52, 0x47, 0x6f, 0x6e, 0x50, 0x5a, 0x37, 0x36, 0x59, 0x33, 0x34, 0x46, 0x37, \n\t0x39, 0x69, 0x66, 0x55, 0x4f, 0x36, 0x61, 0x4b, 0x57, 0x2f, 0x73, 0x35, 0x38, 0x45, 0x6f, 0x6d, 0x6a, 0x2b, \n\t0x79, 0x77, 0x79, 0x69, 0x49, 0x37, 0x73, 0x44, 0x5a, 0x59, 0x4b, 0x53, 0x42, 0x70, 0x67, 0x43, 0x4d, 0x5c, 0x0a,\n\t0x09, 0x67, 0x76, 0x30, 0x2f, 0x44, 0x42, 0x39, 0x4e, 0x55, 0x4e, 0x55, 0x64, 0x6a, 0x48, 0x59, 0x42, 0x72, \n\t0x77, 0x46, 0x35, 0x51, 0x5a, 0x7a, 0x75, 0x49, 0x44, 0x52, 0x59, 0x4f, 0x52, 0x42, 0x74, 0x49, 0x69, 0x6c, \n\t0x41, 0x71, 0x67, 0x4e, 0x76, 0x42, 0x50, 0x34, 0x4b, 0x32, 0x41, 0x70, 0x59, 0x59, 0x42, 0x53, 0x39, 0x71, \n\t0x37, 0x70, 0x34, 0x45, 0x76, 0x55, 0x66, 0x65, 0x53, 0x72, 0x65, 0x4b, 0x61, 0x63, 0x69, 0x76, 0x45, 0x5c, 0x0a,\n\t0x09, 0x62, 0x57, 0x50, 0x69, 0x53, 0x65, 0x6a, 0x44, 0x62, 0x43, 0x4b, 0x4c, 0x72, 0x6c, 0x62, 0x34, 0x4e, \n\t0x52, 0x45, 0x44, 0x31, 0x68, 0x33, 0x53, 0x32, 0x4d, 0x6b, 0x6d, 0x56, 0x4a, 0x73, 0x4f, 0x2b, 0x48, 0x34, \n\t0x4b, 0x65, 0x73, 0x6d, 0x39, 0x6f, 0x37, 0x55, 0x55, 0x77, 0x2b, 0x67, 0x6a, 0x4f, 0x42, 0x64, 0x78, 0x45, \n\t0x39, 0x4a, 0x54, 0x33, 0x2f, 0x36, 0x6d, 0x38, 0x58, 0x72, 0x65, 0x76, 0x55, 0x67, 0x78, 0x79, 0x49, 0x5c, 0x0a,\n\t0x09, 0x4e, 0x70, 0x6d, 0x30, 0x36, 0x47, 0x67, 0x72, 0x34, 0x51, 0x4e, 0x35, 0x62, 0x77, 0x42, 0x6d, 0x38, \n\t0x6d, 0x41, 0x45, 0x51, 0x4b, 0x31, 0x42, 0x37, 0x61, 0x53, 0x66, 0x70, 0x6e, 0x62, 0x79, 0x7a, 0x79, 0x4f, \n\t0x4f, 0x2b, 0x54, 0x45, 0x53, 0x7a, 0x79, 0x4e, 0x6c, 0x53, 0x47, 0x61, 0x46, 0x55, 0x66, 0x79, 0x4f, 0x6d, \n\t0x67, 0x31, 0x47, 0x45, 0x56, 0x43, 0x73, 0x4d, 0x45, 0x71, 0x41, 0x5a, 0x59, 0x46, 0x52, 0x30, 0x43, 0x5c, 0x0a,\n\t0x09, 0x4c, 0x59, 0x73, 0x79, 0x30, 0x73, 0x62, 0x33, 0x77, 0x56, 0x6f, 0x2b, 0x4e, 0x35, 0x65, 0x54, 0x58, \n\t0x77, 0x65, 0x75, 0x44, 0x47, 0x75, 0x4c, 0x36, 0x44, 0x30, 0x50, 0x44, 0x6b, 0x51, 0x4c, 0x52, 0x4a, 0x70, \n\t0x51, 0x48, 0x70, 0x55, 0x59, 0x52, 0x41, 0x65, 0x6a, 0x56, 0x43, 0x4b, 0x45, 0x39, 0x6d, 0x47, 0x32, 0x41, \n\t0x55, 0x72, 0x30, 0x2f, 0x4e, 0x34, 0x35, 0x33, 0x30, 0x42, 0x4c, 0x7a, 0x6a, 0x48, 0x6f, 0x74, 0x33, 0x5c, 0x0a,\n\t0x09, 0x39, 0x4b, 0x50, 0x43, 0x73, 0x73, 0x6c, 0x37, 0x61, 0x59, 0x45, 0x64, 0x52, 0x73, 0x6b, 0x7a, 0x53, \n\t0x42, 0x59, 0x59, 0x79, 0x53, 0x42, 0x38, 0x36, 0x4e, 0x45, 0x4b, 0x49, 0x35, 0x6d, 0x4f, 0x6b, 0x41, 0x69, \n\t0x66, 0x52, 0x35, 0x49, 0x48, 0x64, 0x6f, 0x54, 0x6d, 0x61, 0x63, 0x6b, 0x47, 0x47, 0x6e, 0x62, 0x61, 0x66, \n\t0x47, 0x37, 0x65, 0x42, 0x66, 0x77, 0x31, 0x34, 0x51, 0x76, 0x45, 0x45, 0x6d, 0x44, 0x2b, 0x44, 0x78, 0x5c, 0x0a,\n\t0x09, 0x32, 0x41, 0x68, 0x69, 0x30, 0x48, 0x6f, 0x6b, 0x30, 0x75, 0x44, 0x55, 0x69, 0x50, 0x42, 0x76, 0x34, \n\t0x43, 0x49, 0x56, 0x34, 0x4e, 0x7a, 0x49, 0x52, 0x4a, 0x64, 0x68, 0x69, 0x46, 0x69, 0x55, 0x42, 0x39, 0x47, \n\t0x75, 0x2f, 0x6f, 0x52, 0x2b, 0x4d, 0x64, 0x38, 0x36, 0x4f, 0x68, 0x36, 0x66, 0x33, 0x73, 0x31, 0x6e, 0x54, \n\t0x6b, 0x59, 0x7a, 0x56, 0x57, 0x6b, 0x7a, 0x33, 0x44, 0x53, 0x4b, 0x34, 0x76, 0x49, 0x51, 0x2f, 0x66, 0x5c, 0x0a,\n\t0x09, 0x6a, 0x39, 0x78, 0x59, 0x4d, 0x57, 0x39, 0x62, 0x4a, 0x69, 0x31, 0x4a, 0x33, 0x45, 0x56, 0x34, 0x4f, \n\t0x2f, 0x35, 0x73, 0x59, 0x43, 0x4e, 0x4f, 0x64, 0x42, 0x41, 0x61, 0x6a, 0x52, 0x79, 0x49, 0x6e, 0x49, 0x41, \n\t0x4d, 0x6b, 0x45, 0x35, 0x43, 0x69, 0x4e, 0x63, 0x44, 0x70, 0x34, 0x4d, 0x38, 0x58, 0x73, 0x32, 0x77, 0x77, \n\t0x6b, 0x68, 0x56, 0x66, 0x51, 0x5a, 0x76, 0x79, 0x79, 0x4d, 0x51, 0x38, 0x38, 0x65, 0x46, 0x2f, 0x32, 0x5c, 0x0a,\n\t0x09, 0x61, 0x4f, 0x51, 0x6b, 0x7a, 0x4e, 0x59, 0x37, 0x59, 0x50, 0x79, 0x59, 0x46, 0x52, 0x45, 0x76, 0x45, \n\t0x6f, 0x4d, 0x47, 0x71, 0x74, 0x68, 0x32, 0x2f, 0x66, 0x72, 0x78, 0x2b, 0x47, 0x31, 0x59, 0x50, 0x68, 0x75, \n\t0x32, 0x61, 0x6d, 0x62, 0x62, 0x42, 0x74, 0x47, 0x2b, 0x78, 0x41, 0x69, 0x41, 0x38, 0x43, 0x48, 0x79, 0x64, \n\t0x36, 0x55, 0x52, 0x55, 0x63, 0x67, 0x45, 0x59, 0x74, 0x42, 0x79, 0x4b, 0x6e, 0x6c, 0x46, 0x4a, 0x41, 0x5c, 0x0a,\n\t0x09, 0x45, 0x6d, 0x49, 0x47, 0x65, 0x44, 0x6e, 0x49, 0x31, 0x77, 0x42, 0x50, 0x61, 0x79, 0x63, 0x62, 0x4b, \n\t0x6e, 0x62, 0x36, 0x32, 0x59, 0x57, 0x48, 0x6d, 0x46, 0x36, 0x41, 0x78, 0x6a, 0x78, 0x69, 0x65, 0x67, 0x37, \n\t0x71, 0x30, 0x77, 0x69, 0x76, 0x6f, 0x5a, 0x6a, 0x78, 0x6f, 0x30, 0x51, 0x39, 0x4c, 0x61, 0x53, 0x2f, 0x41, \n\t0x66, 0x34, 0x47, 0x42, 0x45, 0x31, 0x6f, 0x62, 0x55, 0x42, 0x72, 0x46, 0x64, 0x6c, 0x63, 0x44, 0x53, 0x5c, 0x0a,\n\t0x09, 0x66, 0x4a, 0x72, 0x58, 0x33, 0x6b, 0x70, 0x6c, 0x30, 0x50, 0x76, 0x42, 0x2f, 0x34, 0x64, 0x36, 0x41, \n\t0x56, 0x37, 0x34, 0x51, 0x44, 0x55, 0x44, 0x58, 0x6b, 0x51, 0x4f, 0x52, 0x6b, 0x31, 0x4e, 0x49, 0x5a, 0x7a, \n\t0x34, 0x69, 0x57, 0x6b, 0x74, 0x2f, 0x39, 0x5a, 0x34, 0x46, 0x58, 0x45, 0x72, 0x34, 0x36, 0x38, 0x6f, 0x69, \n\t0x75, 0x59, 0x4e, 0x53, 0x70, 0x72, 0x4b, 0x56, 0x2b, 0x71, 0x56, 0x4d, 0x71, 0x58, 0x66, 0x59, 0x51, 0x5c, 0x0a,\n\t0x09, 0x38, 0x41, 0x55, 0x45, 0x6e, 0x77, 0x5a, 0x53, 0x6e, 0x31, 0x61, 0x64, 0x2f, 0x79, 0x4e, 0x33, 0x4f, \n\t0x37, 0x35, 0x4b, 0x63, 0x69, 0x42, 0x79, 0x36, 0x71, 0x69, 0x6c, 0x4d, 0x31, 0x4c, 0x44, 0x74, 0x68, 0x71, \n\t0x68, 0x4a, 0x2f, 0x4f, 0x4c, 0x68, 0x65, 0x42, 0x46, 0x77, 0x43, 0x4e, 0x53, 0x68, 0x55, 0x63, 0x50, 0x6f, \n\t0x31, 0x55, 0x45, 0x6c, 0x77, 0x44, 0x2f, 0x52, 0x6d, 0x67, 0x61, 0x74, 0x78, 0x61, 0x33, 0x36, 0x2b, 0x5c, 0x0a,\n\t0x09, 0x42, 0x54, 0x58, 0x54, 0x6b, 0x51, 0x4f, 0x52, 0x57, 0x57, 0x42, 0x69, 0x51, 0x51, 0x43, 0x41, 0x46, \n\t0x50, 0x42, 0x4a, 0x35, 0x4c, 0x61, 0x4a, 0x50, 0x36, 0x56, 0x47, 0x42, 0x36, 0x42, 0x44, 0x43, 0x36, 0x48, \n\t0x2f, 0x67, 0x36, 0x63, 0x41, 0x48, 0x77, 0x54, 0x55, 0x49, 0x59, 0x4a, 0x5a, 0x72, 0x2f, 0x59, 0x77, 0x65, \n\t0x67, 0x71, 0x73, 0x75, 0x42, 0x79, 0x4b, 0x6b, 0x72, 0x4c, 0x5a, 0x33, 0x5a, 0x68, 0x70, 0x4c, 0x79, 0x5c, 0x0a,\n\t0x09, 0x69, 0x30, 0x38, 0x54, 0x65, 0x69, 0x4c, 0x39, 0x49, 0x6f, 0x49, 0x6e, 0x41, 0x6b, 0x38, 0x69, 0x74, \n\t0x4c, 0x50, 0x4e, 0x2f, 0x35, 0x42, 0x39, 0x4f, 0x52, 0x67, 0x64, 0x42, 0x6d, 0x34, 0x48, 0x72, 0x6f, 0x72, \n\t0x2b, 0x58, 0x55, 0x6e, 0x30, 0x41, 0x55, 0x4e, 0x56, 0x38, 0x36, 0x39, 0x78, 0x38, 0x42, 0x6b, 0x6e, 0x4f, \n\t0x52, 0x41, 0x35, 0x39, 0x55, 0x58, 0x4c, 0x5a, 0x35, 0x36, 0x57, 0x54, 0x51, 0x78, 0x50, 0x68, 0x53, 0x5c, 0x0a,\n\t0x09, 0x6c, 0x43, 0x47, 0x44, 0x30, 0x57, 0x65, 0x43, 0x54, 0x77, 0x56, 0x44, 0x78, 0x2b, 0x44, 0x39, 0x51, \n\t0x49, 0x52, 0x34, 0x62, 0x66, 0x49, 0x78, 0x45, 0x53, 0x52, 0x49, 0x43, 0x6f, 0x2b, 0x59, 0x6a, 0x36, 0x42, \n\t0x6b, 0x46, 0x7a, 0x36, 0x71, 0x74, 0x79, 0x66, 0x66, 0x70, 0x47, 0x34, 0x43, 0x48, 0x67, 0x54, 0x75, 0x41, \n\t0x4f, 0x59, 0x4a, 0x66, 0x70, 0x46, 0x48, 0x50, 0x67, 0x47, 0x57, 0x38, 0x35, 0x45, 0x44, 0x6b, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x54, 0x4d, 0x74, 0x6e, 0x5a, 0x59, 0x5a, 0x79, 0x43, 0x49, 0x2b, 0x33, 0x55, 0x68, 0x50, 0x76, 0x45, \n\t0x35, 0x35, 0x45, 0x68, 0x4a, 0x39, 0x4b, 0x51, 0x39, 0x52, 0x39, 0x52, 0x4c, 0x30, 0x46, 0x6a, 0x51, 0x32, \n\t0x38, 0x65, 0x68, 0x50, 0x52, 0x57, 0x45, 0x50, 0x55, 0x56, 0x36, 0x43, 0x78, 0x2f, 0x75, 0x58, 0x6d, 0x33, \n\t0x6d, 0x4e, 0x66, 0x45, 0x69, 0x7a, 0x50, 0x45, 0x36, 0x78, 0x73, 0x53, 0x5a, 0x70, 0x5a, 0x65, 0x4b, 0x5c, 0x0a,\n\t0x09, 0x32, 0x44, 0x7a, 0x71, 0x54, 0x4a, 0x67, 0x63, 0x68, 0x70, 0x4b, 0x46, 0x6f, 0x2b, 0x36, 0x37, 0x54, \n\t0x34, 0x6b, 0x2f, 0x5a, 0x66, 0x6f, 0x79, 0x5a, 0x65, 0x6b, 0x41, 0x46, 0x52, 0x6f, 0x77, 0x58, 0x31, 0x47, \n\t0x45, 0x52, 0x48, 0x45, 0x50, 0x56, 0x56, 0x61, 0x4b, 0x79, 0x33, 0x71, 0x4b, 0x30, 0x2b, 0x43, 0x74, 0x68, \n\t0x56, 0x65, 0x39, 0x72, 0x79, 0x71, 0x48, 0x66, 0x42, 0x61, 0x59, 0x42, 0x79, 0x58, 0x33, 0x70, 0x31, 0x5c, 0x0a,\n\t0x09, 0x47, 0x70, 0x34, 0x43, 0x42, 0x50, 0x44, 0x30, 0x54, 0x4c, 0x6f, 0x41, 0x39, 0x51, 0x6e, 0x75, 0x64, \n\t0x68, 0x70, 0x31, 0x34, 0x49, 0x38, 0x41, 0x67, 0x6d, 0x76, 0x4d, 0x52, 0x70, 0x4e, 0x4f, 0x6d, 0x30, 0x73, \n\t0x4f, 0x52, 0x45, 0x37, 0x39, 0x30, 0x4f, 0x4f, 0x42, 0x59, 0x2f, 0x4b, 0x4c, 0x42, 0x50, 0x72, 0x79, 0x48, \n\t0x77, 0x74, 0x50, 0x75, 0x50, 0x50, 0x50, 0x43, 0x58, 0x41, 0x67, 0x63, 0x75, 0x71, 0x50, 0x66, 0x74, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x59, 0x71, 0x6f, 0x62, 0x6c, 0x32, 0x5a, 0x48, 0x39, 0x6f, 0x77, 0x6d, 0x66, 0x57, 0x33, 0x4a, \n\t0x79, 0x63, 0x69, 0x42, 0x79, 0x36, 0x6f, 0x75, 0x65, 0x55, 0x72, 0x78, 0x6f, 0x61, 0x71, 0x6a, 0x32, 0x53, \n\t0x6f, 0x51, 0x67, 0x75, 0x50, 0x48, 0x59, 0x66, 0x6d, 0x2b, 0x50, 0x30, 0x35, 0x6a, 0x4a, 0x67, 0x63, 0x69, \n\t0x70, 0x61, 0x79, 0x31, 0x39, 0x35, 0x4c, 0x51, 0x34, 0x36, 0x48, 0x6c, 0x71, 0x58, 0x6a, 0x6d, 0x68, 0x5c, 0x0a,\n\t0x09, 0x66, 0x34, 0x74, 0x65, 0x4a, 0x48, 0x39, 0x66, 0x51, 0x71, 0x4f, 0x78, 0x4d, 0x49, 0x68, 0x74, 0x63, \n\t0x78, 0x6f, 0x76, 0x4f, 0x52, 0x41, 0x35, 0x39, 0x61, 0x61, 0x41, 0x52, 0x65, 0x43, 0x6e, 0x4d, 0x75, 0x6b, \n\t0x32, 0x34, 0x2f, 0x71, 0x30, 0x35, 0x6f, 0x48, 0x6e, 0x39, 0x33, 0x32, 0x62, 0x6e, 0x4d, 0x5a, 0x4f, 0x44, \n\t0x6b, 0x52, 0x4f, 0x76, 0x65, 0x71, 0x4a, 0x36, 0x4f, 0x65, 0x52, 0x55, 0x50, 0x2f, 0x71, 0x30, 0x5a, 0x5c, 0x0a,\n\t0x09, 0x43, 0x36, 0x37, 0x67, 0x47, 0x38, 0x44, 0x45, 0x38, 0x51, 0x33, 0x48, 0x48, 0x4b, 0x6f, 0x4c, 0x62, \n\t0x50, 0x61, 0x51, 0x7a, 0x6b, 0x51, 0x4f, 0x54, 0x55, 0x71, 0x30, 0x35, 0x4e, 0x72, 0x56, 0x6e, 0x39, 0x67, \n\t0x36, 0x51, 0x43, 0x6f, 0x55, 0x42, 0x4e, 0x2f, 0x77, 0x31, 0x6d, 0x70, 0x74, 0x33, 0x77, 0x62, 0x4a, 0x50, \n\t0x4c, 0x67, 0x63, 0x69, 0x70, 0x56, 0x35, 0x31, 0x71, 0x7a, 0x79, 0x72, 0x79, 0x4d, 0x4a, 0x73, 0x33, 0x5c, 0x0a,\n\t0x09, 0x51, 0x2f, 0x68, 0x69, 0x72, 0x64, 0x4d, 0x6d, 0x6c, 0x67, 0x4f, 0x52, 0x55, 0x36, 0x2b, 0x79, 0x67, \n\t0x65, 0x68, 0x47, 0x6f, 0x71, 0x2b, 0x6e, 0x70, 0x69, 0x55, 0x2f, 0x68, 0x7a, 0x35, 0x35, 0x6a, 0x66, 0x65, \n\t0x38, 0x63, 0x6a, 0x34, 0x6a, 0x54, 0x70, 0x4d, 0x6d, 0x42, 0x79, 0x4b, 0x6e, 0x72, 0x72, 0x54, 0x30, 0x34, \n\t0x64, 0x50, 0x69, 0x67, 0x4f, 0x63, 0x6e, 0x4c, 0x55, 0x58, 0x65, 0x44, 0x6c, 0x78, 0x6e, 0x6d, 0x43, 0x5c, 0x0a,\n\t0x09, 0x63, 0x36, 0x45, 0x2f, 0x68, 0x59, 0x65, 0x71, 0x6a, 0x47, 0x63, 0x36, 0x67, 0x31, 0x6b, 0x4c, 0x74, \n\t0x2b, 0x62, 0x6a, 0x41, 0x62, 0x36, 0x31, 0x52, 0x35, 0x4f, 0x52, 0x41, 0x35, 0x39, 0x61, 0x4a, 0x54, 0x67, \n\t0x44, 0x6c, 0x44, 0x2b, 0x6e, 0x63, 0x68, 0x2b, 0x44, 0x70, 0x43, 0x58, 0x47, 0x48, 0x49, 0x32, 0x77, 0x4f, \n\t0x38, 0x47, 0x62, 0x67, 0x46, 0x69, 0x41, 0x4f, 0x68, 0x52, 0x34, 0x6d, 0x46, 0x78, 0x55, 0x63, 0x50, 0x5c, 0x0a,\n\t0x09, 0x61, 0x42, 0x75, 0x64, 0x78, 0x6b, 0x41, 0x4f, 0x52, 0x45, 0x36, 0x39, 0x36, 0x4c, 0x47, 0x57, 0x39, \n\t0x48, 0x64, 0x45, 0x30, 0x63, 0x35, 0x6c, 0x71, 0x57, 0x67, 0x6f, 0x54, 0x4e, 0x74, 0x46, 0x49, 0x4e, 0x61, \n\t0x41, 0x33, 0x77, 0x58, 0x43, 0x54, 0x33, 0x53, 0x45, 0x4d, 0x50, 0x70, 0x76, 0x67, 0x39, 0x70, 0x49, 0x70, \n\t0x2b, 0x72, 0x4c, 0x67, 0x63, 0x69, 0x70, 0x46, 0x35, 0x6e, 0x75, 0x75, 0x56, 0x38, 0x67, 0x66, 0x53, 0x5c, 0x0a,\n\t0x09, 0x36, 0x4c, 0x34, 0x48, 0x49, 0x46, 0x36, 0x58, 0x48, 0x5a, 0x41, 0x65, 0x6c, 0x50, 0x4c, 0x59, 0x45, \n\t0x41, 0x7a, 0x37, 0x73, 0x64, 0x65, 0x45, 0x4e, 0x49, 0x49, 0x51, 0x2f, 0x41, 0x6a, 0x63, 0x73, 0x32, 0x73, \n\t0x52, 0x79, 0x49, 0x6e, 0x48, 0x71, 0x52, 0x2f, 0x6d, 0x37, 0x47, 0x4f, 0x76, 0x43, 0x2f, 0x41, 0x55, 0x52, \n\t0x4e, 0x51, 0x71, 0x31, 0x35, 0x6b, 0x48, 0x67, 0x49, 0x46, 0x76, 0x4c, 0x6f, 0x4e, 0x6d, 0x53, 0x4e, 0x5c, 0x0a,\n\t0x09, 0x32, 0x69, 0x2f, 0x74, 0x44, 0x32, 0x31, 0x6c, 0x36, 0x6f, 0x33, 0x50, 0x41, 0x4a, 0x38, 0x4e, 0x6f, \n\t0x53, 0x56, 0x4f, 0x47, 0x4e, 0x5a, 0x47, 0x4f, 0x31, 0x56, 0x50, 0x44, 0x6b, 0x52, 0x4f, 0x76, 0x53, 0x6a, \n\t0x39, 0x78, 0x72, 0x33, 0x67, 0x72, 0x32, 0x58, 0x41, 0x64, 0x6f, 0x43, 0x5a, 0x6c, 0x2f, 0x31, 0x58, 0x2f, \n\t0x47, 0x72, 0x48, 0x5a, 0x59, 0x71, 0x56, 0x31, 0x65, 0x33, 0x78, 0x67, 0x76, 0x66, 0x66, 0x44, 0x34, 0x5c, 0x0a,\n\t0x09, 0x65, 0x66, 0x48, 0x41, 0x6f, 0x2f, 0x69, 0x33, 0x30, 0x48, 0x67, 0x75, 0x56, 0x79, 0x6e, 0x2f, 0x56, \n\t0x77, 0x6d, 0x69, 0x51, 0x35, 0x45, 0x44, 0x6e, 0x31, 0x6f, 0x67, 0x41, 0x68, 0x77, 0x74, 0x47, 0x56, 0x34, \n\t0x4e, 0x76, 0x41, 0x2b, 0x30, 0x45, 0x77, 0x39, 0x77, 0x65, 0x4b, 0x30, 0x36, 0x4a, 0x41, 0x6e, 0x62, 0x43, \n\t0x2b, 0x4a, 0x64, 0x50, 0x43, 0x31, 0x4e, 0x51, 0x79, 0x38, 0x4c, 0x73, 0x49, 0x76, 0x6a, 0x44, 0x67, 0x5c, 0x0a,\n\t0x09, 0x62, 0x58, 0x57, 0x71, 0x73, 0x42, 0x79, 0x49, 0x6e, 0x48, 0x72, 0x52, 0x62, 0x64, 0x48, 0x66, 0x4b, \n\t0x34, 0x41, 0x58, 0x45, 0x38, 0x6a, 0x30, 0x63, 0x30, 0x4e, 0x68, 0x67, 0x48, 0x4f, 0x35, 0x4d, 0x6b, 0x32, \n\t0x55, 0x2b, 0x75, 0x71, 0x68, 0x39, 0x2f, 0x4e, 0x37, 0x6f, 0x46, 0x36, 0x48, 0x36, 0x5a, 0x6d, 0x62, 0x35, \n\t0x64, 0x72, 0x61, 0x6a, 0x65, 0x35, 0x52, 0x6f, 0x73, 0x32, 0x72, 0x2b, 0x71, 0x67, 0x33, 0x77, 0x47, 0x5c, 0x0a,\n\t0x09, 0x6d, 0x73, 0x64, 0x54, 0x36, 0x68, 0x4d, 0x2b, 0x4d, 0x31, 0x4d, 0x73, 0x41, 0x58, 0x48, 0x73, 0x79, \n\t0x2f, 0x4f, 0x76, 0x32, 0x46, 0x56, 0x56, 0x46, 0x72, 0x37, 0x67, 0x47, 0x32, 0x41, 0x62, 0x35, 0x73, 0x54, \n\t0x66, 0x31, 0x41, 0x31, 0x44, 0x64, 0x53, 0x2b, 0x64, 0x35, 0x6a, 0x64, 0x77, 0x78, 0x72, 0x57, 0x35, 0x30, \n\t0x71, 0x4c, 0x42, 0x63, 0x52, 0x4f, 0x58, 0x55, 0x76, 0x67, 0x51, 0x2f, 0x79, 0x75, 0x7a, 0x4c, 0x41, 0x5c, 0x0a,\n\t0x09, 0x52, 0x32, 0x61, 0x2f, 0x4d, 0x7a, 0x62, 0x39, 0x77, 0x6d, 0x76, 0x69, 0x65, 0x61, 0x4a, 0x4c, 0x45, \n\t0x50, 0x4c, 0x4e, 0x53, 0x49, 0x2f, 0x36, 0x4d, 0x2b, 0x38, 0x65, 0x79, 0x61, 0x59, 0x36, 0x56, 0x56, 0x75, \n\t0x46, 0x7a, 0x66, 0x4f, 0x64, 0x6e, 0x4c, 0x70, 0x52, 0x36, 0x36, 0x49, 0x6e, 0x67, 0x52, 0x64, 0x39, 0x31, \n\t0x37, 0x37, 0x6d, 0x55, 0x33, 0x2f, 0x32, 0x72, 0x61, 0x50, 0x64, 0x49, 0x4b, 0x64, 0x4b, 0x79, 0x6f, 0x5c, 0x0a,\n\t0x09, 0x48, 0x49, 0x79, 0x63, 0x6c, 0x70, 0x35, 0x48, 0x4a, 0x44, 0x4d, 0x79, 0x63, 0x6e, 0x70, 0x35, 0x48, \n\t0x4c, 0x67, 0x63, 0x6a, 0x4a, 0x79, 0x57, 0x6e, 0x6b, 0x63, 0x69, 0x42, 0x79, 0x63, 0x6e, 0x49, 0x61, 0x75, \n\t0x52, 0x79, 0x49, 0x6e, 0x4a, 0x79, 0x63, 0x52, 0x69, 0x34, 0x48, 0x49, 0x69, 0x63, 0x6e, 0x70, 0x35, 0x48, \n\t0x4c, 0x67, 0x63, 0x6a, 0x4a, 0x79, 0x57, 0x6e, 0x6b, 0x63, 0x69, 0x42, 0x79, 0x63, 0x6e, 0x49, 0x61, 0x5c, 0x0a,\n\t0x09, 0x75, 0x52, 0x79, 0x49, 0x6e, 0x4a, 0x79, 0x63, 0x52, 0x71, 0x37, 0x2f, 0x44, 0x33, 0x54, 0x67, 0x78, \n\t0x7a, 0x73, 0x35, 0x75, 0x6a, 0x53, 0x4b, 0x41, 0x41, 0x41, 0x41, 0x41, 0x45, 0x6c, 0x46, 0x54, 0x6b, 0x53, \n\t0x75, 0x51, 0x6d, 0x43, 0x43, 0x5c, 0x0a,\n\t0x09, 0x22, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x33, 0x30, 0x6c, 0x6f, 0x67, 0x2e, 0x6c, 0x75, 0x61, 0x20, 0x62, 0x65, 0x67, 0x69, \n\t0x6e, 0x73, 0x0a,\n\t0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, \n\t0x71, 0x75, 0x69, 0x72, 0x65, 0x5f, 0x33, 0x30, 0x6c, 0x6f, 0x67, 0x28, 0x29, 0x0a,\n\t0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x2c, 0x20, 0x70, 0x61, 0x69, \n\t0x72, 0x73, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, \n\t0x2c, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x61, \n\t0x73, 0x73, 0x65, 0x72, 0x74, 0x2c, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, \n\t0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, \n\t0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x0a,\n\t0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x4d, 0x74, 0x2c, 0x20, 0x5f, 0x69, 0x6e, \n\t0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x2c, \n\t0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x6d, \n\t0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x7b, 0x5f, 0x5f, 0x6d, 0x6f, 0x64, \n\t0x65, 0x3d, 0x27, 0x6b, 0x27, 0x7d, 0x29, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, \n\t0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x7b, 0x5f, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x3d, 0x27, 0x6b, 0x27, \n\t0x7d, 0x29, 0x0a,\n\t0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, \n\t0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x28, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x2c, 0x20, \n\t0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x5f, 0x63, 0x6c, \n\t0x61, 0x73, 0x73, 0x65, 0x73, 0x5b, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5d, 0x2c, 0x20, 0x28, 0x27, 0x57, 0x72, \n\t0x6f, 0x6e, 0x67, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x2e, 0x20, 0x45, \n\t0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3a, 0x25, 0x73, 0x2e, 0x27, \n\t0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x29, 0x29, 0x20, \n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, \n\t0x65, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x74, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x2c, 0x20, 0x61, \n\t0x54, 0x79, 0x70, 0x65, 0x29, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x3b, \n\t0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x72, \n\t0x20, 0x7b, 0x7d, 0x0a,\n\t0x09, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, \n\t0x73, 0x28, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a,\n\t0x09, 0x09, 0x69, 0x66, 0x20, 0x61, 0x54, 0x79, 0x70, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x79, 0x70, \n\t0x65, 0x28, 0x76, 0x29, 0x3d, 0x3d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, \n\t0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, \n\t0x20, 0x61, 0x54, 0x79, 0x70, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x09, 0x09, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, 0x29, 0x20, 0x3d, 0x3d, 0x20, \n\t0x27, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x27, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6b, 0x20, 0x7e, 0x3d, 0x20, 0x22, \n\t0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x5b, 0x6b, 0x5d, \n\t0x20, 0x3d, 0x20, 0x64, 0x65, 0x65, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x76, 0x29, 0x20, 0x65, 0x6c, \n\t0x73, 0x65, 0x20, 0x72, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x3b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, \n\t0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x2e, 0x2e, 0x2e, \n\t0x29, 0x0a,\n\t0x09, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x28, 0x73, 0x65, \n\t0x6c, 0x66, 0x2c, 0x20, 0x27, 0x6e, 0x65, 0x77, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x63, \n\t0x6c, 0x61, 0x73, 0x73, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x27, 0x29, 0x3b, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, \n\t0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0x63, 0x6c, 0x61, 0x73, 0x73, \n\t0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x7d, 0x3b, 0x20, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, \n\t0x65, 0x73, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, \n\t0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x3b, 0x20, 0x73, \n\t0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, \n\t0x63, 0x65, 0x2c, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a,\n\t0x09, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x20, 0x74, 0x68, \n\t0x65, 0x6e, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x69, 0x6e, \n\t0x69, 0x74, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x27, 0x20, 0x74, 0x68, 0x65, \n\t0x6e, 0x20, 0x64, 0x65, 0x65, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x69, \n\t0x6e, 0x69, 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x29, 0x20, 0x65, 0x6c, 0x73, \n\t0x65, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x28, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, \n\t0x63, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x3b, 0x20, 0x65, 0x6e, 0x64, 0x3b, \n\t0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x78, \n\t0x74, 0x65, 0x6e, 0x64, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x65, \n\t0x78, 0x74, 0x72, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x29, 0x0a,\n\t0x09, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x28, 0x73, 0x65, \n\t0x6c, 0x66, 0x2c, 0x20, 0x27, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x27, 0x29, \n\t0x3b, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x65, 0x69, 0x72, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, \n\t0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x5b, 0x68, 0x65, 0x69, 0x72, 0x5d, 0x20, 0x3d, 0x20, \n\t0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x68, 0x65, 0x69, 0x72, 0x29, 0x3b, 0x20, 0x64, 0x65, \n\t0x65, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x61, \n\t0x6d, 0x73, 0x2c, 0x20, 0x64, 0x65, 0x65, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x73, 0x65, 0x6c, 0x66, \n\t0x2c, 0x20, 0x68, 0x65, 0x69, 0x72, 0x29, 0x29, 0x3b, 0x0a,\n\t0x09, 0x20, 0x20, 0x68, 0x65, 0x69, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x68, 0x65, 0x69, 0x72, \n\t0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x68, 0x65, 0x69, 0x72, 0x2e, 0x73, 0x75, 0x70, \n\t0x65, 0x72, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, \n\t0x61, 0x6e, 0x64, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x6e, \n\t0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x68, 0x65, 0x69, 0x72, 0x2c, \n\t0x20, 0x73, 0x65, 0x6c, 0x66, 0x3b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x6d, \n\t0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x68, 0x65, 0x69, 0x72, 0x2c, 0x73, 0x65, 0x6c, 0x66, \n\t0x29, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x62, 0x61, 0x73, 0x65, 0x4d, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, \n\t0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, \n\t0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6e, \n\t0x65, 0x77, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x20, 0x5f, 0x5f, 0x74, 0x6f, 0x73, \n\t0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, \n\t0x65, 0x6c, 0x66, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x0a,\n\t0x09, 0x20, 0x20, 0x69, 0x66, 0x20, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x5b, 0x73, \n\t0x65, 0x6c, 0x66, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, \n\t0x22, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x27, 0x25, 0x73, 0x27, 0x20, \n\t0x28, 0x25, 0x73, 0x29, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x72, 0x61, 0x77, 0x67, \n\t0x65, 0x74, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x2c, 0x27, 0x6e, 0x61, 0x6d, \n\t0x65, 0x27, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x3f, 0x27, 0x2c, 0x20, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, \n\t0x6e, 0x63, 0x65, 0x73, 0x5b, 0x73, 0x65, 0x6c, 0x66, 0x5d, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, \n\t0x5b, 0x73, 0x65, 0x6c, 0x66, 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x22, 0x63, 0x6c, 0x61, 0x73, 0x73, \n\t0x20, 0x27, 0x25, 0x73, 0x27, 0x20, 0x28, 0x25, 0x73, 0x29, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, \n\t0x74, 0x28, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x27, 0x6e, 0x61, 0x6d, \n\t0x65, 0x27, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x3f, 0x27, 0x2c, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, \n\t0x73, 0x5b, 0x73, 0x65, 0x6c, 0x66, 0x5d, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x7d, 0x3b, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x5b, 0x62, 0x61, \n\t0x73, 0x65, 0x4d, 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x62, \n\t0x61, 0x73, 0x65, 0x4d, 0x74, 0x29, 0x3b, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, \n\t0x6c, 0x65, 0x28, 0x62, 0x61, 0x73, 0x65, 0x4d, 0x74, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x74, 0x6f, 0x73, 0x74, \n\t0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x62, 0x61, 0x73, 0x65, 0x4d, 0x74, 0x2e, 0x5f, 0x5f, 0x74, 0x6f, \n\t0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x29, 0x0a,\n\t0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x69, 0x73, \n\t0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, \n\t0x6c, 0x61, 0x73, 0x73, 0x2c, 0x20, 0x6f, 0x66, 0x73, 0x75, 0x70, 0x65, 0x72, 0x29, 0x20, 0x6c, 0x6f, 0x63, \n\t0x61, 0x6c, 0x20, 0x69, 0x73, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6e, \n\t0x6f, 0x74, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x5b, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5d, \n\t0x3b, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x66, 0x73, 0x75, 0x70, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, \n\t0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x73, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x61, 0x6e, 0x64, \n\t0x20, 0x28, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x6f, \n\t0x66, 0x73, 0x75, 0x70, 0x65, 0x72, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x3b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, \n\t0x6e, 0x20, 0x69, 0x73, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x73, 0x49, \n\t0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, \n\t0x28, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2c, 0x20, 0x6f, 0x66, 0x63, 0x6c, 0x61, 0x73, 0x73, \n\t0x29, 0x20, 0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x73, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, \n\t0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, \n\t0x63, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5d, 0x3b, 0x20, 0x69, 0x66, 0x20, \n\t0x6f, 0x66, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, \n\t0x6e, 0x20, 0x69, 0x73, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, \n\t0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x3d, 0x3d, 0x20, \n\t0x6f, 0x66, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x3b, 0x20, 0x72, 0x65, 0x74, 0x75, \n\t0x72, 0x6e, 0x20, 0x69, 0x73, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x7d, \n\t0x3b, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, \n\t0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x74, 0x74, 0x72, 0x29, 0x0a,\n\t0x09, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x65, 0x70, 0x5f, \n\t0x63, 0x6f, 0x70, 0x79, 0x28, 0x61, 0x74, 0x74, 0x72, 0x29, 0x3b, 0x20, 0x63, 0x2e, 0x6d, 0x69, 0x78, 0x69, \n\t0x6e, 0x73, 0x3d, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, \n\t0x2c, 0x7b, 0x5f, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x3d, 0x27, 0x6b, 0x27, 0x7d, 0x29, 0x3b, 0x20, 0x5f, 0x63, \n\t0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x5b, 0x63, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, \n\t0x6e, 0x67, 0x28, 0x63, 0x29, 0x3b, 0x20, 0x63, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x63, 0x2e, 0x5f, \n\t0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x63, 0x2e, 0x5f, 0x5f, 0x63, 0x61, 0x6c, \n\t0x6c, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x2e, 0x6e, 0x61, 0x6d, 0x65, \n\t0x2c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x4d, 0x74, 0x2e, 0x5f, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, \n\t0x67, 0x2c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x4d, 0x74, 0x2e, 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x0a,\n\t0x09, 0x20, 0x20, 0x63, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, \n\t0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x6d, 0x69, 0x78, 0x69, 0x6e, 0x29, 0x20, \n\t0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, \n\t0x20, 0x27, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x28, 0x6d, 0x69, 0x78, 0x69, 0x6e, 0x29, 0x27, 0x29, \n\t0x3b, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6d, 0x69, 0x78, 0x69, 0x6e, 0x73, 0x5b, 0x6d, 0x69, 0x78, 0x69, \n\t0x6e, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, \n\t0x64, 0x65, 0x65, 0x70, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x6d, 0x69, 0x78, 0x69, 0x6e, 0x2c, 0x20, 0x73, \n\t0x65, 0x6c, 0x66, 0x2c, 0x20, 0x27, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x20, 0x65, \n\t0x6e, 0x64, 0x0a,\n\t0x09, 0x20, 0x20, 0x63, 0x2e, 0x6e, 0x65, 0x77, 0x2c, 0x20, 0x63, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, \n\t0x2c, 0x20, 0x63, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x2e, 0x69, 0x6e, 0x63, \n\t0x6c, 0x75, 0x64, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, \n\t0x65, 0x2c, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x2c, 0x20, 0x63, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, \n\t0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x6d, 0x69, 0x78, 0x69, 0x6e, 0x29, 0x20, 0x61, \n\t0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x27, \n\t0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x6d, 0x69, 0x78, 0x69, 0x6e, 0x29, 0x27, 0x29, 0x20, \n\t0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x73, 0x65, \n\t0x6c, 0x66, 0x2e, 0x6d, 0x69, 0x78, 0x69, 0x6e, 0x73, 0x5b, 0x6d, 0x69, 0x78, 0x69, 0x6e, 0x5d, 0x20, 0x6f, \n\t0x72, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, \n\t0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x3a, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, \n\t0x73, 0x28, 0x6d, 0x69, 0x78, 0x69, 0x6e, 0x29, 0x29, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x20, 0x20, 0x63, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, \n\t0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x29, \n\t0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x28, 0x73, 0x65, 0x6c, 0x66, \n\t0x2c, 0x20, 0x27, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x73, 0x28, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x29, 0x27, \n\t0x29, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x70, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x65, \n\t0x6c, 0x66, 0x3b, 0x20, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x20, 0x73, 0x75, 0x70, 0x65, 0x72, 0x20, 0x3d, \n\t0x20, 0x73, 0x75, 0x70, 0x65, 0x72, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, \n\t0x20, 0x28, 0x73, 0x75, 0x70, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x6f, \n\t0x72, 0x20, 0x73, 0x75, 0x70, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x3b, 0x20, 0x72, \n\t0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, \n\t0x75, 0x70, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, \n\t0x62, 0x6c, 0x65, 0x28, 0x63, 0x2c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x4d, 0x74, 0x29, 0x20, 0x65, 0x6e, 0x64, \n\t0x3b, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x2e, 0x5f, 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, \n\t0x4f, 0x4e, 0x20, 0x3d, 0x20, 0x27, 0x33, 0x30, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x6c, 0x69, 0x62, \n\t0x72, 0x61, 0x72, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, \n\t0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x4c, 0x75, 0x61, 0x27, 0x3b, \n\t0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x2e, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x20, 0x3d, 0x20, \n\t0x27, 0x33, 0x30, 0x6c, 0x6f, 0x67, 0x20, 0x76, 0x31, 0x2e, 0x30, 0x2e, 0x30, 0x27, 0x3b, 0x20, 0x63, 0x6c, \n\t0x61, 0x73, 0x73, 0x2e, 0x5f, 0x55, 0x52, 0x4c, 0x20, 0x3d, 0x20, 0x27, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, \n\t0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x59, 0x6f, 0x6e, 0x61, 0x62, 0x61, \n\t0x2f, 0x33, 0x30, 0x6c, 0x6f, 0x67, 0x27, 0x3b, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x2e, 0x5f, 0x4c, 0x49, \n\t0x43, 0x45, 0x4e, 0x53, 0x45, 0x20, 0x3d, 0x20, 0x27, 0x4d, 0x49, 0x54, 0x20, 0x4c, 0x49, 0x43, 0x45, 0x4e, \n\t0x53, 0x45, 0x20, 0x3c, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x70, 0x65, \n\t0x6e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, \n\t0x65, 0x73, 0x2f, 0x6d, 0x69, 0x74, 0x2d, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x70, 0x68, 0x70, \n\t0x3e, 0x27, 0x0a,\n\t0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, \n\t0x6c, 0x65, 0x28, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x2c, 0x7b, 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, \n\t0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x5f, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x72, \n\t0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x20, \n\t0x65, 0x6e, 0x64, 0x20, 0x7d, 0x29, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x33, 0x30, 0x6c, 0x6f, 0x67, 0x2e, 0x6c, 0x75, 0x61, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x0a,\n\t0x0a,\n\t0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, \n\t0x75, 0x69, 0x72, 0x65, 0x5f, 0x33, 0x30, 0x6c, 0x6f, 0x67, 0x28, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x5f, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x20, 0x2d, 0x2d, 0x20, \n\t0x54, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x6c, 0x61, 0x70, 0x73, 0x65, \n\t0x64, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x0a,\n\t0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x30, 0x20, \n\t0x2d, 0x2d, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x68, 0x79, \n\t0x73, 0x69, 0x63, 0x73, 0x20, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x0a,\n\t0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x53, 0x54, 0x45, 0x50, 0x20, 0x3d, 0x20, 0x31, 0x2f, 0x32, 0x30, \n\t0x20, 0x2d, 0x2d, 0x20, 0x32, 0x30, 0x48, 0x7a, 0x20, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x0a,\n\t0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x44, 0x65, 0x62, 0x75, 0x67, 0x20, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x0a,\n\t0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x44, 0x45, 0x42, 0x55, 0x47, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, \n\t0x73, 0x65, 0x0a,\n\t0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, \n\t0x65, 0x0a,\n\t0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, \n\t0x6e, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x0a,\n\t0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x63, 0x6f, 0x75, 0x6e, \n\t0x74, 0x20, 0x3d, 0x20, 0x30, 0x0a,\n\t0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x41, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, \n\t0x69, 0x6e, 0x73, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x78, 0x2c, 0x79, 0x2c, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x20, \n\t0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, \n\t0x72, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74, \n\t0x68, 0x6f, 0x73, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x0a,\n\t0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, \n\t0x73, 0x73, 0x28, 0x22, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x69, 0x6e, \n\t0x69, 0x74, 0x28, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x30, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x67, \n\t0x65, 0x74, 0x58, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x79, 0x30, 0x20, 0x3d, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x67, \n\t0x65, 0x74, 0x59, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x67, \n\t0x65, 0x74, 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x28, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x31, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, \n\t0x30, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x78, 0x31, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x78, \n\t0x30, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x79, 0x31, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x79, \n\t0x30, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x72, \n\t0x30, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, \n\t0x6e, 0x65, 0x78, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x42, 0x6f, 0x64, \n\t0x79, 0x2c, 0x20, 0x61, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x74, 0x2e, 0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x73, 0x61, \n\t0x76, 0x65, 0x28, 0x62, 0x6f, 0x64, 0x79, 0x2c, 0x20, 0x74, 0x29, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, \n\t0x31, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x78, \n\t0x31, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x79, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x79, \n\t0x31, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x72, \n\t0x31, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x78, 0x31, 0x20, 0x3d, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x67, \n\t0x65, 0x74, 0x58, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x79, 0x31, 0x20, 0x3d, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x67, \n\t0x65, 0x74, 0x59, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x67, \n\t0x65, 0x74, 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x28, 0x29, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x67, 0x65, \n\t0x74, 0x28, 0x74, 0x29, 0x0a,\n\t0x09, 0x09, 0x74, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x74, 0x2c, 0x20, \n\t0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x31, 0x29, 0x0a,\n\t0x09, 0x09, 0x74, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x74, 0x2c, 0x20, \n\t0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x30, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x20, 0x2d, 0x20, 0x73, \n\t0x65, 0x6c, 0x66, 0x2e, 0x74, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x31, \n\t0x20, 0x2d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x30, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x78, \n\t0x30, 0x20, 0x2b, 0x20, 0x70, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x78, 0x31, 0x20, 0x2d, \n\t0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x78, 0x30, 0x29, 0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x79, \n\t0x30, 0x20, 0x2b, 0x20, 0x70, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x79, 0x31, 0x20, 0x2d, \n\t0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x79, 0x30, 0x29, 0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x72, \n\t0x30, 0x20, 0x2b, 0x20, 0x70, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x72, 0x31, 0x20, 0x2d, \n\t0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x72, 0x30, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x72, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x66, \n\t0x6f, 0x72, 0x20, 0x66, 0x69, 0x67, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x77, 0x68, \n\t0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x79, 0x65, 0x73, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, \n\t0x6e, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, \n\t0x2e, 0x0a,\n\t0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x42, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, \n\t0x73, 0x73, 0x28, 0x22, 0x42, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x42, 0x6c, 0x69, 0x6e, 0x6b, 0x3a, 0x69, 0x6e, \n\t0x69, 0x74, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x2d, 0x2d, 0x20, 0x57, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x68, 0x69, 0x74, \n\t0x73, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2c, 0x20, 0x77, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x74, 0x68, \n\t0x65, 0x20, 0x65, 0x79, 0x65, 0x73, 0x2e, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x5f, 0x74, 0x20, 0x3d, 0x20, \n\t0x30, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x2d, 0x2d, 0x20, 0x57, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x68, 0x69, 0x74, \n\t0x73, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2c, 0x20, 0x77, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x20, 0x74, \n\t0x68, 0x65, 0x20, 0x65, 0x79, 0x65, 0x73, 0x2e, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, \n\t0x74, 0x20, 0x3d, 0x20, 0x35, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x42, 0x6c, 0x69, 0x6e, 0x6b, 0x3a, 0x75, 0x70, \n\t0x64, 0x61, 0x74, 0x65, 0x28, 0x64, 0x74, 0x29, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, \n\t0x74, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x30, 0x2c, 0x20, 0x73, 0x65, \n\t0x6c, 0x66, 0x2e, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x74, 0x20, 0x2d, 0x20, \n\t0x64, 0x74, 0x29, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x5f, 0x74, 0x20, 0x3d, 0x20, \n\t0x6d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x30, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, \n\t0x6c, 0x6f, 0x73, 0x65, 0x64, 0x5f, 0x74, 0x20, 0x2d, 0x20, 0x64, 0x74, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x62, 0x6c, 0x69, \n\t0x6e, 0x6b, 0x5f, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x09, 0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x6b, \n\t0x5f, 0x74, 0x20, 0x3d, 0x20, 0x35, 0x20, 0x2b, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x68, \n\t0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x28, 0x30, 0x2c, 0x20, 0x33, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x5f, 0x74, 0x20, 0x3d, \n\t0x20, 0x30, 0x2e, 0x31, 0x0a,\n\t0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x42, 0x6c, 0x69, 0x6e, 0x6b, 0x3a, 0x69, 0x73, \n\t0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x6c, 0x6f, 0x73, \n\t0x65, 0x64, 0x5f, 0x74, 0x20, 0x3e, 0x20, 0x30, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x44, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x20, 0x28, 0x54, 0x4d, 0x29, 0x0a,\n\t0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x44, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x20, 0x3d, 0x20, \n\t0x63, 0x6c, 0x61, 0x73, 0x73, 0x28, 0x22, 0x44, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x22, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, \n\t0x3a, 0x69, 0x6e, 0x69, 0x74, 0x28, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, \n\t0x2e, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x42, 0x6f, 0x64, 0x79, 0x28, 0x77, \n\t0x6f, 0x72, 0x6c, 0x64, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x22, 0x64, 0x79, 0x6e, 0x61, 0x6d, \n\t0x69, 0x63, 0x22, 0x29, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x6e, \n\t0x65, 0x61, 0x72, 0x44, 0x61, 0x6d, 0x70, 0x69, 0x6e, 0x67, 0x28, 0x30, 0x2e, 0x38, 0x29, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x73, 0x65, 0x74, 0x41, 0x6e, 0x67, \n\t0x75, 0x6c, 0x61, 0x72, 0x44, 0x61, 0x6d, 0x70, 0x69, 0x6e, 0x67, 0x28, 0x30, 0x2e, 0x38, 0x29, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x68, 0x61, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, \n\t0x65, 0x2e, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x50, 0x6f, 0x6c, 0x79, 0x67, \n\t0x6f, 0x6e, 0x53, 0x68, 0x61, 0x70, 0x65, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2c, \n\t0x20, 0x2d, 0x35, 0x35, 0x2c, 0x20, 0x2d, 0x36, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x39, 0x30, 0x2c, 0x20, \n\t0x35, 0x35, 0x2c, 0x20, 0x2d, 0x36, 0x30, 0x29, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x68, 0x61, 0x70, 0x65, 0x3a, 0x73, 0x65, 0x74, 0x52, 0x65, \n\t0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x30, 0x2e, 0x35, 0x29, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x20, \n\t0x3d, 0x20, 0x69, 0x6d, 0x67, 0x5f, 0x64, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x72, \n\t0x6d, 0x61, 0x6c, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x3d, \n\t0x20, 0x69, 0x6d, 0x67, 0x5f, 0x64, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x69, 0x6e, \n\t0x6b, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x69, 0x6d, 0x67, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x69, 0x6d, 0x67, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x62, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x42, 0x6c, 0x69, \n\t0x6e, 0x6b, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, \n\t0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x4d, 0x6f, 0x75, 0x73, 0x65, 0x4a, 0x6f, \n\t0x69, 0x6e, 0x74, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2c, 0x20, 0x78, 0x2c, 0x20, \n\t0x79, 0x20, 0x2d, 0x20, 0x38, 0x30, 0x29, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x53, 0x74, 0x61, \n\t0x74, 0x65, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, \n\t0x3a, 0x73, 0x74, 0x65, 0x70, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x73, 0x61, 0x76, 0x65, 0x28, \n\t0x73, 0x65, 0x6c, 0x66, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2c, 0x20, 0x67, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x69, 0x66, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x67, 0x5f, \n\t0x73, 0x74, 0x65, 0x70, 0x20, 0x25, 0x20, 0x35, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x74, 0x68, 0x65, \n\t0x6e, 0x0a,\n\t0x09, 0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x61, 0x70, 0x70, 0x6c, 0x79, \n\t0x46, 0x6f, 0x72, 0x63, 0x65, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, \n\t0x6e, 0x64, 0x6f, 0x6d, 0x28, 0x33, 0x30, 0x2c, 0x20, 0x35, 0x30, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x0a,\n\t0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, \n\t0x3a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x28, 0x64, 0x74, 0x29, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x62, 0x6c, 0x69, 0x6e, 0x6b, 0x3a, 0x75, 0x70, 0x64, 0x61, 0x74, \n\t0x65, 0x28, 0x64, 0x74, 0x29, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, \n\t0x3a, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x72, 0x20, 0x3d, 0x20, \n\t0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x67, 0x65, 0x74, 0x28, 0x67, 0x5f, 0x74, \n\t0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, \n\t0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6d, 0x67, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, \n\t0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x0a,\n\t0x09, 0x09, 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x62, 0x6c, 0x69, 0x6e, 0x6b, 0x3a, 0x69, 0x73, \n\t0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x28, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x09, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x69, 0x6d, 0x67, 0x5f, \n\t0x62, 0x6c, 0x69, 0x6e, 0x6b, 0x0a,\n\t0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, \n\t0x61, 0x77, 0x28, 0x69, 0x6d, 0x67, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x72, 0x2c, 0x20, 0x31, \n\t0x2c, 0x20, 0x31, 0x2c, 0x20, 0x69, 0x6d, 0x67, 0x3a, 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, 0x74, 0x68, 0x28, \n\t0x29, 0x20, 0x2f, 0x20, 0x32, 0x2c, 0x20, 0x69, 0x6d, 0x67, 0x3a, 0x67, 0x65, 0x74, 0x48, 0x65, 0x69, 0x67, \n\t0x68, 0x74, 0x28, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x69, 0x66, 0x20, 0x44, 0x45, 0x42, 0x55, 0x47, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, \n\t0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x30, 0x2e, 0x38, 0x2c, 0x20, 0x30, 0x2e, 0x33, 0x2c, 0x20, \n\t0x30, 0x2e, 0x31, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, \n\t0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x28, 0x22, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x2c, 0x20, 0x73, 0x65, 0x6c, \n\t0x66, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x67, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x69, \n\t0x6e, 0x74, 0x73, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x68, 0x61, 0x70, 0x65, 0x3a, 0x67, 0x65, 0x74, \n\t0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x28, 0x29, 0x29, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, \n\t0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x78, 0x2c, 0x20, 0x61, 0x79, 0x20, 0x3d, 0x20, \n\t0x73, 0x65, 0x6c, 0x66, 0x3a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x6f, \n\t0x69, 0x6e, 0x74, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x63, \n\t0x69, 0x72, 0x63, 0x6c, 0x65, 0x28, 0x22, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x2c, 0x20, 0x61, 0x78, 0x2c, 0x20, \n\t0x61, 0x79, 0x2c, 0x20, 0x33, 0x29, 0x0a,\n\t0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, \n\t0x74, 0x6f, 0x20, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x68, 0x61, 0x69, \n\t0x6e, 0x2e, 0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, \n\t0x3a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, \n\t0x29, 0x0a,\n\t0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x62, 0x6f, 0x64, 0x79, \n\t0x3a, 0x67, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x34, 0x2c, 0x20, \n\t0x39, 0x30, 0x29, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x62, \n\t0x75, 0x69, 0x6c, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, \n\t0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x22, 0x23, 0x20, 0x6e, 0x6f, 0x67, \n\t0x61, 0x6d, 0x65, 0x22, 0x2c, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, \n\t0x74, 0x73, 0x20, 0x77, 0x68, 0x61, 0x74, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, \n\t0x22, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x22, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, \n\t0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x0a,\n\t0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, \n\t0x73, 0x73, 0x28, 0x22, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x22, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x3a, 0x69, 0x6e, \n\t0x69, 0x74, 0x28, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x73, 0x74, \n\t0x72, 0x2c, 0x20, 0x64, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x29, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x44, 0x52, 0x41, 0x57, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x20, \n\t0x3d, 0x20, 0x7b, 0x0a,\n\t0x09, 0x09, 0x09, 0x6e, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x31, 0x31, 0x2c, 0x20, 0x69, \n\t0x6d, 0x67, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x67, 0x5f, 0x6e, 0x20, 0x7d, 0x2c, 0x0a,\n\t0x09, 0x09, 0x09, 0x6f, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x31, 0x31, 0x2c, 0x20, 0x69, \n\t0x6d, 0x67, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x67, 0x5f, 0x6f, 0x20, 0x7d, 0x2c, 0x0a,\n\t0x09, 0x09, 0x09, 0x67, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x31, 0x31, 0x2c, 0x20, 0x69, \n\t0x6d, 0x67, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x67, 0x5f, 0x67, 0x20, 0x7d, 0x2c, 0x0a,\n\t0x09, 0x09, 0x09, 0x61, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x31, 0x31, 0x2c, 0x20, 0x69, \n\t0x6d, 0x67, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x67, 0x5f, 0x61, 0x20, 0x7d, 0x2c, 0x0a,\n\t0x09, 0x09, 0x09, 0x6d, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x31, 0x31, 0x2c, 0x20, 0x69, \n\t0x6d, 0x67, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x67, 0x5f, 0x6d, 0x20, 0x7d, 0x2c, 0x0a,\n\t0x09, 0x09, 0x09, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x31, 0x31, 0x2c, 0x20, 0x69, \n\t0x6d, 0x67, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x67, 0x5f, 0x65, 0x20, 0x7d, 0x2c, 0x0a,\n\t0x09, 0x09, 0x09, 0x5b, 0x22, 0x20, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x34, \n\t0x2c, 0x20, 0x69, 0x6d, 0x67, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x7d, 0x2c, 0x0a,\n\t0x09, 0x09, 0x09, 0x5b, 0x22, 0x23, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x37, \n\t0x2c, 0x20, 0x69, 0x6d, 0x67, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x67, 0x5f, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, \n\t0x20, 0x7d, 0x0a,\n\t0x09, 0x09, 0x7d, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x3d, 0x31, 0x2c, 0x23, 0x73, 0x74, 0x72, 0x20, 0x64, 0x6f, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x69, \n\t0x6c, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x69, 0x20, 0x3e, 0x3d, 0x32, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x09, 0x09, 0x09, 0x09, 0x70, 0x72, 0x65, 0x76, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6c, 0x69, \n\t0x6e, 0x6b, 0x73, 0x5b, 0x69, 0x20, 0x2d, 0x20, 0x31, 0x5d, 0x0a,\n\t0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, \n\t0x72, 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x69, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x78, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x79, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x44, 0x52, 0x41, \n\t0x57, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, \n\t0x28, 0x62, 0x79, 0x74, 0x65, 0x29, 0x5d, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6c, \n\t0x69, 0x6e, 0x6b, 0x2e, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x72, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x70, 0x72, 0x65, 0x76, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, \n\t0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x09, 0x09, 0x09, 0x09, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x65, 0x76, 0x2e, \n\t0x79, 0x20, 0x2b, 0x20, 0x70, 0x72, 0x65, 0x76, 0x2e, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x20, 0x2b, 0x20, \n\t0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x0a,\n\t0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, \n\t0x65, 0x2e, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x42, 0x6f, 0x64, 0x79, 0x28, \n\t0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x78, 0x2c, 0x20, 0x6c, 0x69, 0x6e, \n\t0x6b, 0x2e, 0x79, 0x2c, 0x20, 0x22, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x22, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x73, 0x65, 0x74, 0x4c, 0x69, \n\t0x6e, 0x65, 0x61, 0x72, 0x44, 0x61, 0x6d, 0x70, 0x69, 0x6e, 0x67, 0x28, 0x30, 0x2e, 0x35, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x73, 0x65, 0x74, 0x41, 0x6e, \n\t0x67, 0x75, 0x6c, 0x61, 0x72, 0x44, 0x61, 0x6d, 0x70, 0x69, 0x6e, 0x67, 0x28, 0x30, 0x2e, 0x35, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x73, 0x68, 0x61, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, \n\t0x76, 0x65, 0x2e, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x43, 0x69, 0x72, 0x63, \n\t0x6c, 0x65, 0x53, 0x68, 0x61, 0x70, 0x65, 0x28, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2c, \n\t0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x73, 0x68, 0x61, 0x70, 0x65, 0x3a, 0x73, 0x65, 0x74, 0x44, \n\t0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x28, 0x30, 0x2e, 0x31, 0x20, 0x2f, 0x20, 0x69, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x53, 0x74, \n\t0x61, 0x74, 0x65, 0x28, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x4e, 0x6f, 0x74, 0x65, 0x3a, 0x20, 0x65, 0x76, 0x65, 0x72, 0x79, 0x20, \n\t0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x62, 0x65, 0x20, \n\t0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x75, \n\t0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x2e, 0x20, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x77, 0x69, 0x73, 0x65, 0x20, \n\t0x74, 0x68, 0x65, 0x0a,\n\t0x09, 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, \n\t0x65, 0x61, 0x73, 0x69, 0x6c, 0x79, 0x20, 0x67, 0x6f, 0x65, 0x73, 0x20, 0x68, 0x61, 0x79, 0x77, 0x69, 0x72, \n\t0x65, 0x20, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72, 0x20, 0x73, 0x70, 0x65, 0x65, 0x64, 0x73, \n\t0x2e, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x70, 0x72, 0x65, 0x76, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, \n\t0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x09, 0x09, 0x09, 0x09, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x6c, \n\t0x6f, 0x76, 0x65, 0x2e, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x52, 0x65, 0x76, \n\t0x6f, 0x6c, 0x75, 0x74, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x62, 0x6f, \n\t0x64, 0x79, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x76, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2c, 0x20, 0x6c, 0x69, 0x6e, \n\t0x6b, 0x2e, 0x78, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x79, 0x20, 0x2d, 0x20, 0x6c, 0x69, 0x6e, 0x6b, \n\t0x2e, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x20, 0x2f, 0x20, 0x32, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x09, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x32, 0x20, 0x3d, 0x20, 0x6c, \n\t0x6f, 0x76, 0x65, 0x2e, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x52, 0x6f, 0x70, \n\t0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2c, 0x20, \n\t0x64, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2c, 0x20, 0x6c, 0x69, 0x6e, \n\t0x6b, 0x2e, 0x78, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x79, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, \n\t0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x79, 0x20, 0x2d, 0x20, 0x79, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x0a,\n\t0x09, 0x09, 0x09, 0x09, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x6c, \n\t0x6f, 0x76, 0x65, 0x2e, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x52, 0x65, 0x76, \n\t0x6f, 0x6c, 0x75, 0x74, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x62, 0x6f, \n\t0x64, 0x79, 0x2c, 0x20, 0x64, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2c, \n\t0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x78, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x79, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x65, \n\t0x6c, 0x66, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x29, 0x0a,\n\t0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x3a, 0x73, 0x74, \n\t0x65, 0x70, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x69, \n\t0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x29, 0x20, \n\t0x64, 0x6f, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x73, 0x61, 0x76, 0x65, \n\t0x28, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2c, 0x20, 0x67, 0x5f, 0x73, 0x74, 0x65, 0x70, \n\t0x29, 0x0a,\n\t0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x3a, 0x75, 0x70, \n\t0x64, 0x61, 0x74, 0x65, 0x28, 0x64, 0x74, 0x29, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x3a, 0x64, 0x72, \n\t0x61, 0x77, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x69, \n\t0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x29, 0x20, \n\t0x64, 0x6f, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x6c, 0x69, \n\t0x6e, 0x6b, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x67, 0x65, 0x74, 0x28, 0x67, 0x5f, 0x74, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x72, 0x6f, \n\t0x70, 0x65, 0x2c, 0x20, 0x78, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x72, 0x6f, \n\t0x70, 0x65, 0x2c, 0x20, 0x79, 0x29, 0x0a,\n\t0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, \n\t0x74, 0x4c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x28, 0x33, 0x29, 0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, \n\t0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x2e, \n\t0x37, 0x29, 0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6c, 0x69, \n\t0x6e, 0x65, 0x28, 0x72, 0x6f, 0x70, 0x65, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x69, \n\t0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x29, 0x20, \n\t0x64, 0x6f, 0x0a,\n\t0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x69, 0x6d, \n\t0x67, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x72, 0x20, \n\t0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x67, 0x65, 0x74, 0x28, 0x67, \n\t0x5f, 0x74, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x78, 0x2c, 0x20, 0x6f, 0x79, 0x20, 0x3d, \n\t0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x69, 0x6d, 0x67, 0x3a, 0x67, 0x65, 0x74, \n\t0x57, 0x69, 0x64, 0x74, 0x68, 0x28, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, \n\t0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x69, 0x6d, 0x67, 0x3a, 0x67, 0x65, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, \n\t0x28, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x0a,\n\t0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, \n\t0x73, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, \n\t0x64, 0x72, 0x61, 0x77, 0x28, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x69, 0x6d, 0x67, \n\t0x2c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x72, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x6f, \n\t0x78, 0x2c, 0x20, 0x6f, 0x79, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x69, 0x66, 0x20, 0x44, 0x45, 0x42, 0x55, 0x47, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x09, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x69, 0x6e, 0x20, \n\t0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x29, \n\t0x20, 0x64, 0x6f, 0x0a,\n\t0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, \n\t0x73, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x6c, \n\t0x69, 0x6e, 0x6b, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x67, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, \n\t0x6f, 0x6e, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, \n\t0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x28, 0x22, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x2c, 0x20, 0x78, 0x2c, 0x20, \n\t0x79, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x73, 0x68, 0x61, 0x70, 0x65, 0x3a, 0x67, 0x65, 0x74, 0x52, \n\t0x61, 0x64, 0x69, 0x75, 0x73, 0x28, 0x29, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x44, 0x72, 0x61, 0x77, 0x73, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x73, 0x20, 0x69, \n\t0x6e, 0x20, 0x61, 0x20, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, 0x74, \n\t0x65, 0x72, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x31, 0x2c, 0x32, 0x2c, 0x33, 0x2c, 0x34, 0x2c, 0x20, 0x62, 0x75, \n\t0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x65, \n\t0x61, 0x63, 0x68, 0x20, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x2e, 0x0a,\n\t0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x20, \n\t0x3d, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x28, 0x22, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x54, 0x72, 0x61, 0x63, \n\t0x6b, 0x22, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x78, 0x2c, 0x79, 0x3a, 0x20, 0x54, 0x6f, 0x70, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x20, \n\t0x63, 0x6f, 0x72, 0x6e, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x74, 0x72, \n\t0x61, 0x63, 0x6b, 0x2e, 0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x54, 0x72, 0x61, \n\t0x63, 0x6b, 0x3a, 0x69, 0x6e, 0x69, 0x74, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, \n\t0x65, 0x74, 0x2c, 0x20, 0x73, 0x70, 0x65, 0x65, 0x64, 0x2c, 0x20, 0x69, 0x6d, 0x67, 0x29, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x78, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x79, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x6f, 0x66, 0x66, \n\t0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x68, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x3d, \n\t0x20, 0x35, 0x30, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x69, 0x6d, 0x67, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x67, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x68, 0x5f, \n\t0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x2b, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x69, 0x6d, 0x67, \n\t0x3a, 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, 0x74, 0x68, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x70, 0x65, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, \n\t0x65, 0x64, 0x20, 0x2d, 0x2d, 0x20, 0x70, 0x78, 0x2f, 0x73, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, \n\t0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, 0x74, \n\t0x68, 0x28, 0x29, 0x20, 0x2f, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x77, 0x20, 0x2b, 0x20, 0x32, 0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x6d, 0x67, \n\t0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, \n\t0x6d, 0x28, 0x31, 0x2c, 0x20, 0x34, 0x29, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x54, 0x72, 0x61, \n\t0x63, 0x6b, 0x3a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x28, 0x64, 0x74, 0x29, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x54, 0x72, 0x61, \n\t0x63, 0x6b, 0x3a, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x62, 0x73, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, \n\t0x20, 0x3d, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x6f, \n\t0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x70, 0x65, 0x65, \n\t0x64, 0x20, 0x2a, 0x20, 0x67, 0x5f, 0x74, 0x29, 0x29, 0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x61, \n\t0x62, 0x73, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x25, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x77, 0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, \n\t0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x2e, \n\t0x33, 0x29, 0x0a,\n\t0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x3d, 0x31, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x6f, \n\t0x75, 0x6e, 0x74, 0x20, 0x64, 0x6f, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x78, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x65, 0x6c, \n\t0x66, 0x2e, 0x69, 0x6d, 0x67, 0x3a, 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, 0x74, 0x68, 0x28, 0x29, 0x20, 0x2b, \n\t0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x68, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x29, 0x20, 0x2b, \n\t0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x2d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x77, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, \n\t0x79, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6d, 0x67, 0x5f, 0x6e, 0x6f, 0x20, 0x3d, 0x20, \n\t0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x61, 0x62, 0x73, 0x5f, 0x6f, 0x66, \n\t0x66, 0x73, 0x65, 0x74, 0x20, 0x2f, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x77, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, \n\t0x72, 0x61, 0x77, 0x28, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x5b, 0x31, \n\t0x20, 0x2b, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, \n\t0x6d, 0x67, 0x20, 0x2b, 0x20, 0x69, 0x20, 0x2d, 0x20, 0x69, 0x6d, 0x67, 0x5f, 0x6e, 0x6f, 0x29, 0x20, 0x25, \n\t0x20, 0x34, 0x5d, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x30, 0x35, 0x29, 0x0a,\n\t0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6c, \n\t0x61, 0x73, 0x73, 0x28, 0x22, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x73, 0x22, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x73, 0x3a, 0x69, \n\t0x6e, 0x69, 0x74, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x5f, 0x68, 0x65, 0x69, 0x67, \n\t0x68, 0x74, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x30, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x6f, 0x76, \n\t0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x48, 0x65, 0x69, 0x67, \n\t0x68, 0x74, 0x28, 0x29, 0x20, 0x2f, 0x20, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, \n\t0x74, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x0a,\n\t0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x3d, 0x31, 0x2c, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x64, 0x6f, 0x0a,\n\t0x09, 0x09, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x65, \n\t0x6c, 0x66, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x2c, 0x20, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x54, 0x72, \n\t0x61, 0x63, 0x6b, 0x28, 0x30, 0x2c, 0x20, 0x32, 0x30, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x20, 0x2d, 0x20, 0x31, \n\t0x29, 0x20, 0x2a, 0x20, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2c, 0x20, \n\t0x69, 0x6d, 0x67, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x31, 0x3a, 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, \n\t0x74, 0x68, 0x28, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x69, 0x2c, 0x20, 0x34, 0x30, 0x2c, 0x20, \n\t0x69, 0x6d, 0x67, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x31, 0x29, 0x29, 0x0a,\n\t0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x73, 0x3a, 0x64, \n\t0x72, 0x61, 0x77, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x69, \n\t0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x29, \n\t0x20, 0x64, 0x6f, 0x0a,\n\t0x09, 0x09, 0x09, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x3a, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x2d, 0x2d, 0x20, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x69, \n\t0x7a, 0x65, 0x2e, 0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x77, \n\t0x6f, 0x72, 0x6c, 0x64, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x65, 0x74, 0x52, 0x61, 0x6e, \n\t0x64, 0x6f, 0x6d, 0x53, 0x65, 0x65, 0x64, 0x28, 0x31, 0x32, 0x33, 0x34, 0x35, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x78, 0x2c, 0x20, 0x77, 0x79, 0x20, 0x3d, 0x20, 0x6c, \n\t0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x44, 0x69, \n\t0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x68, 0x79, \n\t0x73, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x28, 0x30, 0x2c, 0x20, 0x39, \n\t0x2e, 0x38, 0x31, 0x2a, 0x36, 0x34, 0x29, 0x0a,\n\t0x09, 0x09, 0x64, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x44, 0x75, 0x63, 0x6b, 0x6c, \n\t0x6f, 0x6f, 0x6e, 0x28, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2c, 0x20, 0x77, 0x78, 0x20, 0x2f, 0x20, 0x32, 0x2c, \n\t0x20, 0x77, 0x79, 0x20, 0x2f, 0x20, 0x32, 0x20, 0x2d, 0x20, 0x31, 0x30, 0x30, 0x29, 0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x78, 0x2c, 0x20, 0x61, 0x79, 0x20, 0x3d, 0x20, 0x64, \n\t0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x3a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, \n\t0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x28, 0x77, 0x6f, \n\t0x72, 0x6c, 0x64, 0x2c, 0x20, 0x61, 0x78, 0x2c, 0x20, 0x61, 0x79, 0x2c, 0x20, 0x22, 0x20, 0x20, 0x6e, 0x20, \n\t0x6f, 0x20, 0x23, 0x20, 0x67, 0x20, 0x61, 0x20, 0x6d, 0x20, 0x65, 0x20, 0x23, 0x20, 0x22, 0x2c, 0x20, 0x64, \n\t0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x29, 0x0a,\n\t0x09, 0x09, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x73, 0x28, \n\t0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x67, 0x5f, 0x6f, 0x62, 0x6a, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x0a,\n\t0x09, 0x09, 0x09, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2c, 0x0a,\n\t0x09, 0x09, 0x09, 0x64, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x0a,\n\t0x09, 0x09, 0x7d, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6c, 0x6f, 0x61, \n\t0x64, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x72, 0x6e, 0x61, \n\t0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, \n\t0x2e, 0x67, 0x65, 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x65, 0x74, 0x54, \n\t0x69, 0x74, 0x6c, 0x65, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x67, \n\t0x65, 0x74, 0x54, 0x69, 0x74, 0x6c, 0x65, 0x28, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x2d, 0x20, 0x22, \n\t0x20, 0x2e, 0x2e, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, \n\t0x74, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x34, \n\t0x33, 0x2f, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x31, 0x36, 0x35, 0x2f, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x32, \n\t0x33, 0x2f, 0x32, 0x35, 0x35, 0x29, 0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x74, \n\t0x4d, 0x65, 0x74, 0x65, 0x72, 0x28, 0x36, 0x34, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x70, 0x69, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x3d, \n\t0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x67, 0x65, 0x74, 0x44, 0x50, \n\t0x49, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x29, 0x20, 0x3e, 0x20, 0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x32, \n\t0x20, 0x6f, 0x72, 0x20, 0x31, 0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, \n\t0x20, 0x7b, 0x64, 0x70, 0x69, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x70, 0x69, 0x73, 0x63, \n\t0x61, 0x6c, 0x65, 0x7d, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x6e, 0x20, 0x3d, 0x20, 0x52, 0x2e, 0x63, 0x68, \n\t0x61, 0x69, 0x6e, 0x5b, 0x64, 0x70, 0x69, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5d, 0x2e, 0x6e, 0x5f, 0x70, 0x6e, \n\t0x67, 0x0a,\n\t0x09, 0x09, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x6f, 0x20, 0x3d, 0x20, 0x52, 0x2e, 0x63, 0x68, \n\t0x61, 0x69, 0x6e, 0x5b, 0x64, 0x70, 0x69, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5d, 0x2e, 0x6f, 0x5f, 0x70, 0x6e, \n\t0x67, 0x0a,\n\t0x09, 0x09, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x67, 0x20, 0x3d, 0x20, 0x52, 0x2e, 0x63, 0x68, \n\t0x61, 0x69, 0x6e, 0x5b, 0x64, 0x70, 0x69, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5d, 0x2e, 0x67, 0x5f, 0x70, 0x6e, \n\t0x67, 0x0a,\n\t0x09, 0x09, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x61, 0x20, 0x3d, 0x20, 0x52, 0x2e, 0x63, 0x68, \n\t0x61, 0x69, 0x6e, 0x5b, 0x64, 0x70, 0x69, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5d, 0x2e, 0x61, 0x5f, 0x70, 0x6e, \n\t0x67, 0x0a,\n\t0x09, 0x09, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x6d, 0x20, 0x3d, 0x20, 0x52, 0x2e, 0x63, 0x68, \n\t0x61, 0x69, 0x6e, 0x5b, 0x64, 0x70, 0x69, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5d, 0x2e, 0x6d, 0x5f, 0x70, 0x6e, \n\t0x67, 0x0a,\n\t0x09, 0x09, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x65, 0x20, 0x3d, 0x20, 0x52, 0x2e, 0x63, 0x68, \n\t0x61, 0x69, 0x6e, 0x5b, 0x64, 0x70, 0x69, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5d, 0x2e, 0x65, 0x5f, 0x70, 0x6e, \n\t0x67, 0x0a,\n\t0x09, 0x09, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x20, 0x3d, \n\t0x20, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5b, 0x64, 0x70, 0x69, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5d, \n\t0x2e, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x5f, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x09, 0x52, 0x2e, 0x64, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x2e, 0x62, 0x6c, 0x69, 0x6e, 0x6b, \n\t0x20, 0x3d, 0x20, 0x52, 0x2e, 0x64, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x5b, 0x64, 0x70, 0x69, 0x73, \n\t0x63, 0x61, 0x6c, 0x65, 0x5d, 0x2e, 0x62, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x09, 0x52, 0x2e, 0x64, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x2e, 0x6e, 0x6f, 0x72, 0x6d, 0x61, \n\t0x6c, 0x20, 0x3d, 0x20, 0x52, 0x2e, 0x64, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x5b, 0x64, 0x70, 0x69, \n\t0x73, 0x63, 0x61, 0x6c, 0x65, 0x5d, 0x2e, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x5f, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x09, 0x52, 0x2e, 0x62, 0x67, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x52, \n\t0x2e, 0x62, 0x67, 0x5b, 0x64, 0x70, 0x69, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5d, 0x2e, 0x63, 0x6c, 0x6f, 0x75, \n\t0x64, 0x5f, 0x31, 0x5f, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x09, 0x52, 0x2e, 0x62, 0x67, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x52, \n\t0x2e, 0x62, 0x67, 0x5b, 0x64, 0x70, 0x69, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5d, 0x2e, 0x63, 0x6c, 0x6f, 0x75, \n\t0x64, 0x5f, 0x32, 0x5f, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x09, 0x52, 0x2e, 0x62, 0x67, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x52, \n\t0x2e, 0x62, 0x67, 0x5b, 0x64, 0x70, 0x69, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5d, 0x2e, 0x63, 0x6c, 0x6f, 0x75, \n\t0x64, 0x5f, 0x33, 0x5f, 0x70, 0x6e, 0x67, 0x0a,\n\t0x09, 0x09, 0x52, 0x2e, 0x62, 0x67, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x52, \n\t0x2e, 0x62, 0x67, 0x5b, 0x64, 0x70, 0x69, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5d, 0x2e, 0x63, 0x6c, 0x6f, 0x75, \n\t0x64, 0x5f, 0x34, 0x5f, 0x70, 0x6e, 0x67, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x64, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x72, \n\t0x6d, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, \n\t0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x52, 0x2e, 0x64, 0x75, 0x63, \n\t0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x2e, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, \n\t0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a,\n\t0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x64, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x69, \n\t0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, \n\t0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x52, 0x2e, 0x64, 0x75, 0x63, 0x6b, \n\t0x6c, 0x6f, 0x6f, 0x6e, 0x2e, 0x62, 0x6c, 0x69, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, \n\t0x67, 0x73, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x6e, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, \n\t0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x52, \n\t0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x6e, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, \n\t0x29, 0x0a,\n\t0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x6f, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, \n\t0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x52, \n\t0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x6f, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, \n\t0x29, 0x0a,\n\t0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, \n\t0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x52, \n\t0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x67, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, \n\t0x29, 0x0a,\n\t0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x61, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, \n\t0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x52, \n\t0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x61, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, \n\t0x29, 0x0a,\n\t0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x6d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, \n\t0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x52, \n\t0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x6d, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, \n\t0x29, 0x0a,\n\t0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, \n\t0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x52, \n\t0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x65, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, \n\t0x29, 0x0a,\n\t0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, \n\t0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78, 0x74, \n\t0x75, 0x72, 0x65, 0x28, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, \n\t0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x6c, 0x6f, \n\t0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78, \n\t0x74, 0x75, 0x72, 0x65, 0x28, 0x52, 0x2e, 0x62, 0x67, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x31, 0x2c, \n\t0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a,\n\t0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x6c, 0x6f, \n\t0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78, \n\t0x74, 0x75, 0x72, 0x65, 0x28, 0x52, 0x2e, 0x62, 0x67, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x32, 0x2c, \n\t0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a,\n\t0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x6c, 0x6f, \n\t0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78, \n\t0x74, 0x75, 0x72, 0x65, 0x28, 0x52, 0x2e, 0x62, 0x67, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x33, 0x2c, \n\t0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a,\n\t0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x6c, 0x6f, \n\t0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78, \n\t0x74, 0x75, 0x72, 0x65, 0x28, 0x52, 0x2e, 0x62, 0x67, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x34, 0x2c, \n\t0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x0a,\n\t0x09, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x31, 0x2c, 0x0a,\n\t0x09, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x32, 0x2c, 0x0a,\n\t0x09, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x33, 0x2c, 0x0a,\n\t0x09, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x34, 0x2c, 0x0a,\n\t0x09, 0x09, 0x7d, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x28, 0x29, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x75, 0x70, 0x64, \n\t0x61, 0x74, 0x65, 0x28, 0x64, 0x74, 0x29, 0x0a,\n\t0x09, 0x09, 0x67, 0x5f, 0x74, 0x20, 0x3d, 0x20, 0x67, 0x5f, 0x74, 0x20, 0x2b, 0x20, 0x64, 0x74, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x67, 0x5f, 0x74, 0x20, 0x3e, 0x20, 0x67, 0x5f, 0x73, 0x74, \n\t0x65, 0x70, 0x20, 0x64, 0x6f, 0x0a,\n\t0x09, 0x09, 0x09, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x3a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x28, 0x53, 0x54, \n\t0x45, 0x50, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x67, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x67, 0x5f, 0x73, 0x74, 0x65, 0x70, \n\t0x20, 0x2b, 0x20, 0x53, 0x54, 0x45, 0x50, 0x0a,\n\t0x09, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, \n\t0x72, 0x73, 0x28, 0x67, 0x5f, 0x6f, 0x62, 0x6a, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a,\n\t0x09, 0x09, 0x09, 0x09, 0x76, 0x3a, 0x73, 0x74, 0x65, 0x70, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x09, 0x09, 0x67, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x3d, 0x20, \n\t0x67, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x2b, 0x20, 0x31, 0x0a,\n\t0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, \n\t0x67, 0x5f, 0x6f, 0x62, 0x6a, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a,\n\t0x09, 0x09, 0x09, 0x67, 0x5f, 0x6f, 0x62, 0x6a, 0x73, 0x5b, 0x69, 0x5d, 0x3a, 0x75, 0x70, 0x64, 0x61, 0x74, \n\t0x65, 0x28, 0x64, 0x74, 0x29, 0x0a,\n\t0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x72, 0x61, \n\t0x77, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x73, 0x3a, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, \n\t0x67, 0x5f, 0x6f, 0x62, 0x6a, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a,\n\t0x09, 0x09, 0x09, 0x67, 0x5f, 0x6f, 0x62, 0x6a, 0x73, 0x5b, 0x69, 0x5d, 0x3a, 0x64, 0x72, 0x61, 0x77, 0x28, \n\t0x29, 0x0a,\n\t0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x69, 0x66, 0x20, 0x44, 0x45, 0x42, 0x55, 0x47, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, \n\t0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, \n\t0x2e, 0x35, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, \n\t0x72, 0x69, 0x6e, 0x74, 0x28, 0x22, 0x46, 0x50, 0x53, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6c, 0x6f, \n\t0x76, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x46, 0x50, 0x53, 0x28, 0x29, 0x2c, \n\t0x20, 0x35, 0x30, 0x2c, 0x20, 0x35, 0x30, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, \n\t0x72, 0x69, 0x6e, 0x74, 0x28, 0x22, 0x54, 0x69, 0x6d, 0x65, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x67, \n\t0x5f, 0x74, 0x2c, 0x20, 0x35, 0x30, 0x2c, 0x20, 0x36, 0x35, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, \n\t0x72, 0x69, 0x6e, 0x74, 0x28, 0x22, 0x67, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, \n\t0x20, 0x67, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x2c, 0x20, 0x35, 0x30, 0x2c, 0x20, 0x38, 0x30, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, \n\t0x72, 0x69, 0x6e, 0x74, 0x28, 0x22, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, \n\t0x67, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2c, 0x20, 0x35, 0x30, 0x2c, \n\t0x20, 0x39, 0x35, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, \n\t0x72, 0x69, 0x6e, 0x74, 0x28, 0x22, 0x53, 0x74, 0x65, 0x70, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x67, \n\t0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2c, 0x20, 0x35, 0x30, 0x2c, 0x20, 0x31, \n\t0x31, 0x30, 0x29, 0x0a,\n\t0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x67, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x3d, 0x20, \n\t0x67, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x2b, 0x20, 0x31, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6d, 0x6f, 0x75, \n\t0x73, 0x65, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x62, 0x2c, \n\t0x20, 0x69, 0x73, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x2c, 0x20, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x73, 0x29, 0x0a,\n\t0x09, 0x09, 0x2d, 0x2d, 0x20, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2d, 0x74, 0x61, 0x70, 0x20, 0x74, 0x68, \n\t0x65, 0x20, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x28, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x75, 0x73, 0x69, \n\t0x6e, 0x67, 0x20, 0x61, 0x20, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x20, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x29, \n\t0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x69, 0x74, 0x2e, 0x0a,\n\t0x09, 0x09, 0x69, 0x66, 0x20, 0x69, 0x73, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, \n\t0x6c, 0x69, 0x63, 0x6b, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, \n\t0x73, 0x68, 0x6f, 0x77, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x6f, 0x78, 0x28, 0x22, 0x45, 0x78, \n\t0x69, 0x74, 0x20, 0x4e, 0x6f, 0x2d, 0x47, 0x61, 0x6d, 0x65, 0x20, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x22, \n\t0x2c, 0x20, 0x22, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x4f, 0x4b, 0x22, 0x2c, 0x20, 0x22, 0x43, 0x61, 0x6e, 0x63, \n\t0x65, 0x6c, 0x22, 0x7d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x69, \n\t0x74, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6b, 0x65, 0x79, \n\t0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x28, 0x6b, 0x65, 0x79, 0x29, 0x0a,\n\t0x09, 0x09, 0x69, 0x66, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x65, 0x73, 0x63, 0x61, 0x70, \n\t0x65, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x69, 0x74, \n\t0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x72, 0x65, 0x73, \n\t0x69, 0x7a, 0x65, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x28, 0x29, 0x0a,\n\t0x09, 0x09, 0x67, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x67, 0x5f, 0x74, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, \n\t0x66, 0x28, 0x74, 0x29, 0x0a,\n\t0x09, 0x09, 0x74, 0x2e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x4c, 0x5c, 0x31, 0x39, 0x35, \n\t0x5c, 0x31, 0x35, 0x30, 0x56, 0x45, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, \n\t0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x28, 0x22, 0x20, 0x2e, 0x2e, \n\t0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x64, \n\t0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x29, 0x22, 0x0a,\n\t0x09, 0x09, 0x74, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x61, 0x6d, 0x6d, 0x61, \n\t0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a,\n\t0x09, 0x09, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x20, \n\t0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a,\n\t0x09, 0x09, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x6f, 0x75, 0x6e, 0x64, 0x20, \n\t0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a,\n\t0x09, 0x09, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, \n\t0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a,\n\t0x09, 0x09, 0x74, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x61, 0x62, \n\t0x6c, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a,\n\t0x09, 0x09, 0x74, 0x2e, 0x68, 0x69, 0x67, 0x68, 0x64, 0x70, 0x69, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a,\n\t0x0a,\n\t0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x22, \n\t0x69, 0x4f, 0x53, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,\n\t0x09, 0x09, 0x09, 0x74, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, \n\t0x6c, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a,\n\t0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x57, \n\t0x69, 0x74, 0x68, 0x4e, 0x65, 0x77, 0x47, 0x61, 0x6d, 0x65, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a,\n\t0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x69, 0x74, 0x28, \n\t0x22, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, 0x2c, 0x20, 0x7b, 0x5f, 0x6e, 0x6f, 0x47, 0x61, 0x6d, \n\t0x65, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x7b, 0x67, 0x61, \n\t0x6d, 0x65, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x7d, 0x29, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, \n\t0x65, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x29, 0x0a,\n\t0x09, 0x09, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x57, 0x69, 0x74, 0x68, 0x4e, 0x65, 0x77, 0x47, 0x61, \n\t0x6d, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, \n\t0x65, 0x28, 0x29, 0x29, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x69, 0x72, \n\t0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x28, 0x70, 0x61, 0x74, 0x68, \n\t0x29, 0x0a,\n\t0x09, 0x09, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x57, 0x69, 0x74, 0x68, 0x4e, 0x65, 0x77, 0x47, 0x61, \n\t0x6d, 0x65, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a,\n\t0x09, 0x65, 0x6e, 0x64, 0x0a,\n\t0x65, 0x6e, 0x64, 0x0a,\n\t0x0a,\n\t0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6e, 0x6f, 0x67, 0x61, 0x6d, 0x65, 0x0a,\n}; // [nogame.lua]\n} // love\n"
  },
  {
    "path": "testing/classes/TestMethod.lua",
    "content": "-- @class - TestMethod\r\n-- @desc - used to run a specific method from a module's /test/ suite\r\n--         each assertion is tracked and then printed to output\r\nTestMethod = {\r\n\r\n\r\n  -- @method - TestMethod:new()\r\n  -- @desc - create a new TestMethod object\r\n  -- @param {string} method - string of method name to run\r\n  -- @param {TestMethod} testmethod - parent testmethod this test belongs to\r\n  -- @return {table} - returns the new Test object\r\n  new = function(self, method, testmodule)\r\n    local test = {\r\n      testmodule = testmodule,\r\n      method = method,\r\n      asserts = {},\r\n      start = love.timer.getTime(),\r\n      finish = 0,\r\n      count = 0,\r\n      passed = false,\r\n      skipped = false,\r\n      skipreason = '',\r\n      rgba_tolerance = 0,\r\n      pixel_tolerance = 0,\r\n      fatal = '',\r\n      message = nil,\r\n      result = {},\r\n      colors = {\r\n        red = {1, 0, 0, 1},\r\n        redpale = {1, 0.5, 0.5, 1},\r\n        red07 = {0.7, 0, 0, 1},\r\n        green = {0, 1, 0, 1},\r\n        greenhalf = {0, 0.5, 0, 1},\r\n        greenfade = {0, 1, 0, 0.5},\r\n        blue = {0, 0, 1, 1},\r\n        bluefade = {0, 0, 1, 0.5},\r\n        yellow = {1, 1, 0, 1},\r\n        pink = {1, 0, 1, 1},\r\n        black = {0, 0, 0, 1},\r\n        white = {1, 1, 1, 1},\r\n        lovepink = {214/255, 86/255, 151/255, 1},\r\n        loveblue = {83/255, 168/255, 220/255, 1}\r\n      },\r\n      imgs = 1,\r\n      delay = 0,\r\n      delayed = false,\r\n      store = {},\r\n      co = nil\r\n    }\r\n    setmetatable(test, self)\r\n    self.__index = self\r\n    return test\r\n  end,\r\n\r\n\r\n  -- @method - TestMethod:assertEquals()\r\n  -- @desc - used to assert two values are equals\r\n  -- @param {any} expected - expected value of the test\r\n  -- @param {any} actual - actual value of the test\r\n  -- @param {string} label - label for this test to use in exports\r\n  -- @return {nil}\r\n  assertEquals = function(self, expected, actual, label)\r\n    self.count = self.count + 1\r\n    table.insert(self.asserts, {\r\n      key = 'assert ' .. tostring(self.count),\r\n      passed = expected == actual,\r\n      message = 'expected \\'' .. tostring(expected) .. '\\' got \\'' ..\r\n        tostring(actual) .. '\\'',\r\n      test = label or 'no label given'\r\n    })\r\n  end,\r\n\r\n\r\n  -- @method - TestMethod:assertTrue()\r\n  -- @desc - used to assert a value is true\r\n  -- @param {any} value - value to test\r\n  -- @param {string} label - label for this test to use in exports\r\n  -- @return {nil}\r\n  assertTrue = function(self, value, label)\r\n    self.count = self.count + 1\r\n    table.insert(self.asserts, {\r\n      key = 'assert ' .. tostring(self.count),\r\n      passed = value == true,\r\n      message = 'expected \\'true\\' got \\'' ..\r\n        tostring(value) .. '\\'',\r\n      test = label or 'no label given'\r\n    })\r\n  end,\r\n\r\n\r\n  -- @method - TestMethod:assertFalse()\r\n  -- @desc - used to assert a value is false\r\n  -- @param {any} value - value to test\r\n  -- @param {string} label - label for this test to use in exports\r\n  -- @return {nil}\r\n  assertFalse = function(self, value, label)\r\n    self.count = self.count + 1\r\n    table.insert(self.asserts, {\r\n      key = 'assert ' .. tostring(self.count),\r\n      passed = value == false,\r\n      message = 'expected \\'false\\' got \\'' ..\r\n        tostring(value) .. '\\'',\r\n      test = label or 'no label given'\r\n    })\r\n  end,\r\n\r\n\r\n  -- @method - TestMethod:assertNotEquals()\r\n  -- @desc - used to assert two values are not equal\r\n  -- @param {any} expected - expected value of the test\r\n  -- @param {any} actual - actual value of the test\r\n  -- @param {string} label - label for this test to use in exports\r\n  -- @return {nil}\r\n  assertNotEquals = function(self, expected, actual, label)\r\n    self.count = self.count + 1\r\n    table.insert(self.asserts, {\r\n      key = 'assert ' .. tostring(self.count),\r\n      passed = expected ~= actual,\r\n      message = 'avoiding \\'' .. tostring(expected) .. '\\' got \\'' ..\r\n        tostring(actual) .. '\\'',\r\n      test = label or 'no label given'\r\n    })\r\n  end,\r\n\r\n\r\n  -- @method - TestMethod:assertRange()\r\n  -- @desc - used to check a value is within an expected range\r\n  -- @param {number} actual - actual value of the test\r\n  -- @param {number} min - minimum value the actual should be >= to\r\n  -- @param {number} max - maximum value the actual should be <= to\r\n  -- @param {string} label - label for this test to use in exports\r\n  -- @return {nil}\r\n  assertRange = function(self, actual, min, max, label)\r\n    self.count = self.count + 1\r\n    table.insert(self.asserts, {\r\n      key = 'assert ' .. tostring(self.count),\r\n      passed = actual >= min and actual <= max,\r\n      message = 'value \\'' .. tostring(actual) .. '\\' out of range \\'' ..\r\n        tostring(min) .. '-' .. tostring(max) .. '\\'',\r\n      test = label or 'no label given'\r\n    })\r\n  end,\r\n\r\n\r\n  -- @method - TestMethod:assertMatch()\r\n  -- @desc - used to check a value is within a list of values\r\n  -- @param {number} list - list of valid values for the test\r\n  -- @param {number} actual - actual value of the test to check is in the list\r\n  -- @param {string} label - label for this test to use in exports\r\n  -- @return {nil}\r\n  assertMatch = function(self, list, actual, label)\r\n    self.count = self.count + 1\r\n    local found = false\r\n    for l=1,#list do\r\n      if list[l] == actual then found = true end;\r\n    end\r\n    table.insert(self.asserts, {\r\n      key = 'assert ' .. tostring(self.count),\r\n      passed = found == true,\r\n      message = 'value \\'' .. tostring(actual) .. '\\' not found in \\'' ..\r\n        table.concat(list, ',') .. '\\'',\r\n      test = label or 'no label given'\r\n    })\r\n  end,\r\n\r\n\r\n  -- @method - TestMethod:assertGreaterEqual()\r\n  -- @desc - used to check a value is >= than a certain target value\r\n  -- @param {any} target - value to check the test agaisnt\r\n  -- @param {any} actual - actual value of the test\r\n  -- @param {string} label - label for this test to use in exports\r\n  -- @return {nil}\r\n  assertGreaterEqual = function(self, target, actual, label)\r\n    self.count = self.count + 1\r\n    local passing = false\r\n    if target ~= nil and actual ~= nil then\r\n      passing = actual >= target\r\n    end\r\n    table.insert(self.asserts, {\r\n      key = 'assert ' .. tostring(self.count),\r\n      passed = passing,\r\n      message = 'value \\'' .. tostring(actual) .. '\\' not >= \\'' ..\r\n        tostring(target) .. '\\'',\r\n      test = label or 'no label given'\r\n    })\r\n  end,\r\n\r\n\r\n  -- @method - TestMethod:assertLessEqual()\r\n  -- @desc - used to check a value is <= than a certain target value\r\n  -- @param {any} target - value to check the test agaisnt\r\n  -- @param {any} actual - actual value of the test\r\n  -- @param {string} label - label for this test to use in exports\r\n  -- @return {nil}\r\n  assertLessEqual = function(self, target, actual, label)\r\n    self.count = self.count + 1\r\n    local passing = false\r\n    if target ~= nil and actual ~= nil then\r\n      passing = actual <= target\r\n    end\r\n    table.insert(self.asserts, {\r\n      key = 'assert ' .. tostring(self.count),\r\n      passed = passing,\r\n      message = 'value \\'' .. tostring(actual) .. '\\' not <= \\'' ..\r\n        tostring(target) .. '\\'',\r\n      test = label or 'no label given'\r\n    })\r\n  end,\r\n\r\n\r\n  -- @method - TestMethod:assertObject()\r\n  -- @desc - used to check a table is a love object, this runs 3 seperate\r\n  --         tests to check table has the basic properties of an object\r\n  -- @note - actual object functionality tests have their own methods\r\n  -- @param {table} obj - table to check is a valid love object\r\n  -- @return {nil}\r\n  assertObject = function(self, obj)\r\n    self:assertNotNil(obj)\r\n    self:assertEquals('userdata', type(obj), 'check is userdata')\r\n    if obj ~= nil then\r\n      self:assertNotEquals(nil, obj:type(), 'check has :type()')\r\n    end\r\n  end,\r\n\r\n\r\n  -- @method - TestMethod:assertCoords()\r\n  -- @desc - used to check a pair of values (usually coordinates)\r\n  -- @param {table} obj - table to check is a valid love object\r\n  -- @return {nil}\r\n  assertCoords = function(self, expected, actual, label)\r\n    self.count = self.count + 1\r\n    local passing = false\r\n    if expected ~= nil and actual ~= nil then\r\n      if expected[1] == actual[1] and expected[2] == actual[2] then\r\n        passing = true\r\n      end\r\n    end\r\n    table.insert(self.asserts, {\r\n      key = 'assert ' .. tostring(self.count),\r\n      passed = passing,\r\n      message = 'expected \\'' .. tostring(expected[1]) .. 'x,' ..\r\n        tostring(expected[2]) .. 'y\\' got \\'' ..\r\n        tostring(actual[1]) .. 'x,' .. tostring(actual[2]) .. 'y\\'',\r\n      test = label or 'no label given'\r\n    })\r\n  end,\r\n\r\n\r\n  -- @method - TestMethod:assertNotNil()\r\n  -- @desc - quick assert for value not nil\r\n  -- @param {any} value - value to check not nil\r\n  -- @return {nil}\r\n  assertNotNil = function (self, value, err)\r\n    self:assertNotEquals(nil, value, 'check not nil')\r\n    if err ~= nil then\r\n      table.insert(self.asserts, {\r\n        key = 'assert ' .. tostring(self.count),\r\n        passed = false,\r\n        message = err,\r\n        test = 'assert not nil catch'\r\n      })\r\n    end\r\n  end,\r\n\r\n\r\n  -- @method - TestMethod:compareImg()\r\n  -- @desc - compares a given image to the 'expected' version, with a tolerance of\r\n  --         1px in any direction, and then saves it as the 'actual' version for\r\n  --         report viewing\r\n  -- @param {table} imgdata - imgdata to save as a png\r\n  -- @return {nil}\r\n  compareImg = function(self, imgdata)\r\n    local expected_path = 'tempoutput/expected/love.test.graphics.' ..\r\n      self.method .. '-' .. tostring(self.imgs) .. '.png'\r\n    local ok, chunk, _ = pcall(love.image.newImageData, expected_path)\r\n    if ok == false then return self:assertEquals(true, false, chunk) end\r\n    local expected = chunk\r\n    local iw = imgdata:getWidth()-1\r\n    local ih = imgdata:getHeight()-1\r\n    local differences = {}\r\n    local rgba_tolerance = self.rgba_tolerance * (1/255)\r\n\r\n    -- for each pixel, compare the expected vs the actual pixel data\r\n    -- by default rgba_tolerance is 0\r\n    for ix=0,iw do\r\n      for iy=0,ih do\r\n        local ir, ig, ib, ia = imgdata:getPixel(ix, iy)\r\n        local points = {\r\n          {expected:getPixel(ix, iy)}\r\n        }\r\n        if self.pixel_tolerance > 0 then\r\n          if ix > 0 and iy < ih-1 then table.insert(points, {expected:getPixel(ix-1, iy+1)}) end\r\n          if ix > 0 then table.insert(points, {expected:getPixel(ix-1, iy)}) end\r\n          if ix > 0 and iy > 0 then table.insert(points, {expected:getPixel(ix-1, iy-1)}) end\r\n          if iy < ih-1 then table.insert(points, {expected:getPixel(ix, iy+1)}) end\r\n          if iy > 0 then table.insert(points, {expected:getPixel(ix, iy-1)}) end\r\n          if ix < iw-1 and iy < ih-1 then table.insert(points, {expected:getPixel(ix+1, iy+1)}) end\r\n          if ix < iw-1 then table.insert(points, {expected:getPixel(ix+1, iy)}) end\r\n          if ix < iw-1 and iy > 0 then table.insert(points, {expected:getPixel(ix+1, iy-1)}) end\r\n        end\r\n        local has_match_r = false\r\n        local has_match_g = false\r\n        local has_match_b = false\r\n        local has_match_a = false\r\n        for t=1,#points do\r\n          local epoint = points[t]\r\n          if ir >= epoint[1] - rgba_tolerance and ir <= epoint[1] + rgba_tolerance then has_match_r = true; end\r\n          if ig >= epoint[2] - rgba_tolerance and ig <= epoint[2] + rgba_tolerance then has_match_g = true; end\r\n          if ib >= epoint[3] - rgba_tolerance and ib <= epoint[3] + rgba_tolerance then has_match_b = true; end\r\n          if ia >= epoint[4] - rgba_tolerance and ia <= epoint[4] + rgba_tolerance then has_match_a = true; end\r\n        end\r\n        local matching = has_match_r and has_match_g and has_match_b and has_match_a\r\n        local ymatch = ''\r\n        local nmatch = ''\r\n        if has_match_r then ymatch = ymatch .. 'r' else nmatch = nmatch .. 'r' end\r\n        if has_match_g then ymatch = ymatch .. 'g' else nmatch = nmatch .. 'g' end\r\n        if has_match_b then ymatch = ymatch .. 'b' else nmatch = nmatch .. 'b' end\r\n        if has_match_a then ymatch = ymatch .. 'a' else nmatch = nmatch .. 'a' end\r\n        local pixel = tostring(ir)..','..tostring(ig)..','..tostring(ib)..','..tostring(ia)\r\n        self:assertEquals(true, matching, 'compare image pixel (' .. pixel .. ') at ' ..\r\n          tostring(ix) .. ',' .. tostring(iy) .. ', matching = ' .. ymatch ..\r\n          ', not matching = ' .. nmatch .. ' (' .. self.method .. '-' .. tostring(self.imgs) .. ')'\r\n        )\r\n        -- add difference co-ord for rendering later\r\n        if matching ~= true then\r\n          table.insert(differences, ix+1)\r\n          table.insert(differences, iy+1)\r\n        end\r\n      end\r\n    end\r\n    local path = 'tempoutput/actual/love.test.graphics.' ..\r\n      self.method .. '-' .. tostring(self.imgs) .. '.png'\r\n    imgdata:encode('png', path)\r\n\r\n    -- if we have differences draw them to a new canvas to display in HTML report\r\n    local dpath = 'tempoutput/difference/love.test.graphics.' ..\r\n      self.method .. '-' .. tostring(self.imgs) .. '.png'\r\n    if #differences > 0 then\r\n      local difference = love.graphics.newCanvas(iw+1, ih+1)\r\n      love.graphics.setCanvas(difference)\r\n        love.graphics.clear(0, 0, 0, 1)\r\n        love.graphics.setColor(1, 0, 1, 1)\r\n        love.graphics.points(differences)\r\n        love.graphics.setColor(1, 1, 1, 1)\r\n      love.graphics.setCanvas()\r\n      love.graphics.readbackTexture(difference):encode('png', dpath)\r\n\r\n    -- otherwise clear the old difference file (if any) to stop it coming up \r\n    -- in future reports when there's no longer a difference\r\n    elseif love.filesystem.openFile(dpath, 'r') then\r\n      love.filesystem.remove(dpath)\r\n    end\r\n\r\n    self.imgs = self.imgs + 1\r\n  end,\r\n\r\n\r\n  -- @method - TestMethod:exportImg()\r\n  -- @desc - exports the given imgdata to the 'output/expected/' folder, to use when\r\n  --         writing new graphics tests to set the expected image output\r\n  -- @NOTE - you should not leave this method in when you are finished this is\r\n  --         for test writing only\r\n  -- @param {table} imgdata - imgdata to save as a png\r\n  -- @param {integer} imgdata - index of the png, graphic tests are run sequentially\r\n  --                            and each test image is numbered in order that its\r\n  --                            compared to, so set the number here to match\r\n  -- @return {nil}\r\n  exportImg = function(self, imgdata, index)\r\n    local path = 'tempoutput/expected/love.test.graphics.' ..\r\n      self.method .. '-' .. tostring(index) .. '.png'\r\n    imgdata:encode('png', path)\r\n  end,\r\n\r\n\r\n  -- @method - TestMethod:skipTest()\r\n  -- @desc - used to mark this test as skipped for a specific reason\r\n  -- @param {string} reason - reason why method is being skipped\r\n  -- @return {nil}\r\n  skipTest = function(self, reason)\r\n    self.skipped = true\r\n    self.skipreason = reason\r\n  end,\r\n\r\n\r\n  -- @method - TestMethod:waitFrames()\r\n  -- @desc - yields the method for x amount of frames\r\n  -- @param {number} frames - no. frames to wait\r\n  -- @return {nil}\r\n  waitFrames = function(self, frames)\r\n    for _=1,frames do coroutine.yield() end\r\n  end,\r\n\r\n\r\n  -- @method - TestMethod:waitSeconds()\r\n  -- @desc - yields the method for x amount of seconds\r\n  -- @param {number} seconds - no. seconds to wait\r\n  -- @return {nil}\r\n  waitSeconds = function(self, seconds)\r\n    local start = love.timer.getTime()\r\n    while love.timer.getTime() < start + seconds do\r\n      coroutine.yield()\r\n    end\r\n  end,\r\n\r\n\r\n  -- @method - TestMethod:isOS()\r\n  -- @desc - checks for a specific OS (or list of OSs)\r\n  -- @param {string/s} - each arg passed will be checked as a valid OS, as long\r\n  --                     as one passed the function will return true\r\n  -- @return {boolean} - returns true if one of the OSs given matches actual OS\r\n  isOS = function(self, ...)\r\n    for os=1,select(\"#\", ...) do\r\n      if select(os, ...) == love.test.current_os then return true end\r\n    end\r\n    return false\r\n  end,\r\n\r\n  -- @method - TestMethod:isLuaVersion()\r\n  -- @desc - checks for a specific Lua version (or list of versions)\r\n  -- @param {number} - the minimum Lua version to check against\r\n  -- @return {boolean} - returns true if the current Lua version is at least the given version\r\n  isAtLeastLuaVersion = function(self, version)\r\n    return love.test.lua_version >= version\r\n  end,\r\n\r\n  -- @method - TestMethod:isLuaJITEnabled()\r\n  -- @desc - checks if LuaJIT is enabled\r\n  -- @return {boolean} - returns true if LuaJIT is enabled\r\n  isLuaJITEnabled = function(self)\r\n    return love.test.has_lua_jit\r\n  end,\r\n\r\n  -- @method - TestMethod:evaluateTest()\r\n  -- @desc - evaluates the results of all assertions for a final restult\r\n  -- @return {nil}\r\n  evaluateTest = function(self)\r\n    local failure = ''\r\n    local failures = 0\r\n\r\n    -- check all asserts for failures, additional failures are also printed\r\n    local assert_failures = {}\r\n    for a=1,#self.asserts do\r\n      if not self.asserts[a].passed and not self.skipped then\r\n        if failure == '' then failure = self.asserts[a] end\r\n        table.insert(assert_failures, self.asserts[a])\r\n        failures = failures + 1\r\n      end\r\n    end\r\n    if self.fatal ~= '' then failure = self.fatal end\r\n    local passed = tostring(#self.asserts - failures)\r\n    local total = '(' .. passed .. '/' .. tostring(#self.asserts) .. ')'\r\n\r\n    -- skipped tests have a special log\r\n    if self.skipped then\r\n      self.testmodule.skipped = self.testmodule.skipped + 1\r\n      love.test.totals[3] = love.test.totals[3] + 1\r\n      self.result = {\r\n        total = '',\r\n        result = \"SKIP\",\r\n        passed = false,\r\n        message = '(0/0) - method skipped [' .. self.skipreason .. ']',\r\n        failures = {}\r\n      }\r\n    else\r\n\r\n      -- if no failure but has asserts, then passed\r\n      if failure == '' and #self.asserts > 0 then\r\n        self.passed = true\r\n        self.testmodule.passed = self.testmodule.passed + 1\r\n        love.test.totals[1] = love.test.totals[1] + 1\r\n        self.result = {\r\n          total = total,\r\n          result = 'PASS',\r\n          passed = true,\r\n          message = nil,\r\n          failures = {}\r\n        }\r\n\r\n      -- otherwise it failed\r\n      else\r\n        self.passed = false\r\n        self.testmodule.failed = self.testmodule.failed + 1\r\n        love.test.totals[2] = love.test.totals[2] + 1\r\n\r\n        -- no asserts means invalid test\r\n        if #self.asserts == 0 then\r\n          local msg = 'no asserts defined'\r\n          if self.fatal ~= '' then msg = self.fatal end\r\n          self.result = {\r\n            total = total,\r\n            result = 'FAIL',\r\n            passed = false,\r\n            key = 'test',\r\n            message = msg,\r\n            failures = {}\r\n          }\r\n\r\n        -- otherwise we had failures, log the first and supply the list of\r\n        -- additional failures if any for printResult()\r\n        else\r\n          local key = failure['key']\r\n          if failure['test'] ~= nil then\r\n            key = key .. ' [' .. failure['test'] .. ']'\r\n          end\r\n          local msg = failure['message']\r\n          if self.fatal ~= '' then\r\n            key = 'code'\r\n            msg = self.fatal\r\n          end\r\n          self.result = {\r\n            total = total,\r\n            result = 'FAIL',\r\n            passed = false,\r\n            key = key,\r\n            message = msg,\r\n            failures = assert_failures\r\n          }\r\n        end\r\n      end\r\n    end\r\n    self:printResult()\r\n  end,\r\n\r\n\r\n  -- @method - TestMethod:printResult()\r\n  -- @desc - prints the result of the test to the console as well as appends\r\n  --         the XML + HTML for the test to the testsuite output\r\n  -- @return {nil}\r\n  printResult = function(self)\r\n\r\n    -- get total timestamp\r\n    self.finish = love.timer.getTime() - self.start\r\n    love.test.time = love.test.time + self.finish\r\n    self.testmodule.time = self.testmodule.time + self.finish\r\n    local endtime = UtilTimeFormat(love.timer.getTime() - self.start)\r\n\r\n    -- get failure/skip message for output (if any)\r\n    local failure = ''\r\n    local output = ''\r\n    if not self.passed and not self.skipped then\r\n      failure = '\\t\\t\\t<failure message=\"' .. self.result.key .. ' ' ..\r\n        self.result.message .. '\">' .. self.result.key .. ' ' .. self.result.message .. '</failure>\\n'\r\n        output = self.result.key .. ' ' ..  self.result.message\r\n      -- append failures if any to report md\r\n      love.test.mdfailures = love.test.mdfailures .. '> 🔴 ' .. self.method .. '  \\n' ..\r\n        '> ' .. output .. '  \\n\\n'\r\n    end\r\n    if output == '' and self.skipped then\r\n      failure = '\\t\\t\\t<skipped message=\"' .. self.skipreason .. '\" />\\n'\r\n      output = self.skipreason\r\n    end\r\n\r\n\r\n    -- append XML for the test class result\r\n    self.testmodule.xml = self.testmodule.xml .. '\\t\\t<testcase classname=\"' ..\r\n      self.method .. '\" name=\"' .. self.method .. '\" assertions=\"' .. tostring(#self.asserts) ..\r\n      '\" time=\"' .. endtime .. '\">\\n' ..\r\n      failure .. '\\t\\t</testcase>\\n'\r\n\r\n    -- unused currently, adds a preview image for certain graphics methods to the output\r\n    local preview = ''\r\n    if self.testmodule.module == 'graphics' then\r\n      local filename = 'love.test.graphics.' .. self.method\r\n      for f=1,5 do\r\n        local fstr = tostring(f)\r\n        if love.filesystem.openFile('tempoutput/actual/' .. filename .. '-' .. fstr .. '.png', 'r') then\r\n          preview = preview .. '<div class=\"preview-wrap\">'\r\n          preview = preview .. '<div class=\"preview\">' .. '<img src=\"expected/' .. filename .. '-' .. fstr .. '.png\"/><p>Expected</p></div>' ..\r\n            '<div class=\"preview\">' .. '<img src=\"actual/' .. filename .. '-' .. fstr .. '.png\"/><p>Actual</p></div>'\r\n          if love.filesystem.openFile('tempoutput/difference/' .. filename .. '-' .. fstr .. '.png', 'r') then\r\n            preview = preview .. '<div class=\"preview\">' .. '<img src=\"difference/' .. filename .. '-' .. fstr .. '.png\"/><p>Difference</p></div>'\r\n          end\r\n          preview = preview .. '</div>'\r\n        end\r\n      end\r\n    end\r\n\r\n    -- append HTML for the test class result\r\n    local status = ''\r\n    local cls = 'red'\r\n    if self.passed then status = '<div class=\"icon pass\"></div>'; cls = 'green' end\r\n    if self.skipped then status = ''; cls = 'yellow' end\r\n    self.testmodule.html = self.testmodule.html ..\r\n      '<tr class=\" ' .. cls .. '\">' ..\r\n        '<td>' .. status .. '</td>' ..\r\n        '<td>' .. self.method .. '</td>' ..\r\n        '<td>' .. endtime .. 's</td>' ..\r\n        '<td>' .. output .. preview .. '</td>' ..\r\n      '</tr>'\r\n\r\n    -- add message if assert failed\r\n    local msg = ''\r\n    if self.result.message ~= nil and not self.skipped then\r\n      msg = ' - ' .. self.result.key ..\r\n        ' failed - (' .. self.result.message .. ')'\r\n    end\r\n    if self.skipped then\r\n      msg = self.result.message\r\n    end\r\n\r\n    -- log final test result to console\r\n    -- i know its hacky but its neat soz\r\n    local tested = 'love.' .. self.testmodule.module .. '.' .. self.method .. '()'\r\n    local matching = string.sub(self.testmodule.spacer, string.len(tested), 40)\r\n    self.testmodule:log(\r\n      self.testmodule.colors[self.result.result],\r\n      '  ' .. tested .. matching,\r\n      ' ==> ' .. self.result.result .. ' - ' .. endtime .. 's ' ..\r\n      self.result.total .. msg\r\n    )\r\n\r\n    -- if we failed on multiple asserts, list them here - makes it easier for\r\n    -- debugging new methods added that are failing multiple asserts\r\n    if #self.result.failures > 1 then\r\n      for f=2,#self.result.failures do\r\n        local addf = self.result.failures[f]\r\n        self.testmodule:log(\r\n          self.testmodule.colors[self.result.result],\r\n          '  ' .. tested .. matching,\r\n          ' ==> ' ..\r\n          addf['key'] .. ' [' .. addf['test'] .. '] failed - ' .. addf['message']\r\n        )\r\n      end\r\n    end\r\n\r\n  end\r\n\r\n\r\n}\r\n"
  },
  {
    "path": "testing/classes/TestModule.lua",
    "content": "-- @class - TestModule\r\n-- @desc - used to run tests for a given module, each test method will spawn\r\n--         a love.test.Test object\r\nTestModule = {\r\n\r\n\r\n  -- @method - TestModule:new()\r\n  -- @desc - create a new Suite object\r\n  -- @param {string} module - string of love module the suite is for\r\n  -- @return {table} - returns the new Suite object\r\n  new = function(self, module, method)\r\n    local testmodule = {\r\n      time = 0,\r\n      spacer = '                                        ',\r\n      colors = {\r\n        PASS = 'green', FAIL = 'red', SKIP = 'grey'\r\n      },\r\n      colormap = {\r\n        grey = '\\27[37m',\r\n        green = '\\27[32m',\r\n        red = '\\27[31m',\r\n        yellow = '\\27[33m'\r\n      },\r\n      xml = '',\r\n      html = '',\r\n      tests = {},\r\n      running = {},\r\n      called = {},\r\n      passed = 0,\r\n      failed = 0,\r\n      skipped = 0,\r\n      module = module,\r\n      method = method,\r\n      index = 1,\r\n      start = false,\r\n    }\r\n    setmetatable(testmodule, self)\r\n    self.__index = self\r\n    return testmodule\r\n  end,\r\n\r\n\r\n  -- @method - TestModule:log()\r\n  -- @desc - log to console with specific colors, split out to make it easier\r\n  --         to adjust all console output across the tests\r\n  -- @param {string} color - color key to use for the log\r\n  -- @param {string} line - main message to write (LHS)\r\n  -- @param {string} result - result message to write (RHS)\r\n  -- @return {nil}\r\n  log = function(self, color, line, result)\r\n    if result == nil then result = '' end\r\n    print(self.colormap[color] .. line .. result)\r\n  end,\r\n\r\n\r\n  -- @method - TestModule:runTests()\r\n  -- @desc - starts the running of tests and sets up the list of methods to test\r\n  -- @param {string} module - module to set for the test suite\r\n  -- @param {string} method - specific method to test, if nil all methods tested\r\n  -- @return {nil}\r\n  runTests = function(self)\r\n    self.running = {}\r\n    self.passed = 0\r\n    self.failed = 0\r\n    if self.method ~= nil then\r\n      table.insert(self.running, self.method)\r\n    else\r\n      for i,_ in pairs(love.test[self.module]) do\r\n        table.insert(self.running, i)\r\n      end\r\n      table.sort(self.running)\r\n    end\r\n    self.index = 1\r\n    self.start = true\r\n    self:log('yellow', '\\nlove.' .. self.module .. '.testmodule.start')\r\n  end,\r\n\r\n\r\n  -- @method - TestModule:printResult()\r\n  -- @desc - prints the result of the module to the console as well as appends\r\n  --         the XML + HTML for the test to the testsuite output\r\n  -- @return {nil}\r\n  printResult = function(self)\r\n    local finaltime = UtilTimeFormat(self.time)\r\n    local status = '<div class=\"icon fail\"></div>'\r\n    if self.failed == 0 then status = '<div class=\"icon pass\"></div>' end\r\n    -- add md row to main output\r\n    love.test.mdrows = love.test.mdrows .. '| ' .. status .. \r\n      ' ' .. self.module .. \r\n      ' | ' .. tostring(self.passed) .. \r\n      ' | ' .. tostring(self.failed) .. \r\n      ' | ' .. tostring(self.skipped) .. \r\n      ' | ' .. finaltime .. 's |' .. '\\n'\r\n    -- add xml to main output\r\n    love.test.xml = love.test.xml .. '\\t<testsuite name=\"love.' .. self.module .. \r\n      '\" tests=\"' .. tostring(self.passed) .. \r\n      '\" failures=\"' .. tostring(self.failed) .. \r\n      '\" skipped=\"' .. tostring(self.skipped) ..\r\n      '\" time=\"' .. finaltime .. '\">\\n' .. self.xml .. '\\t</testsuite>\\n'\r\n    -- add html to main output\r\n    local module_cls = 'toggle close'\r\n    local module_txt = '▶'\r\n    local wrap_cls = ''\r\n    if self.failed > 0 then\r\n      module_cls = 'toggle open'\r\n      module_txt = '▼'\r\n      wrap_cls = 'fail'\r\n    end\r\n    love.test.html = love.test.html .. '<div class=\"module ' .. wrap_cls .. '\">' ..\r\n      '<div class=\"' .. module_cls .. '\" onclick=\"toggle(this)\">' .. module_txt .. '</div>' .. \r\n      '<h2>' .. status .. '&nbsp;love.' .. self.module .. '</h2><ul class=\"summary\">' ..\r\n      '<li class=\"l' .. tostring(self.passed) .. '\">' .. tostring(self.passed) .. ' Passed</li>' ..\r\n      '<li class=\"l' .. tostring(self.failed) .. '\">' .. tostring(self.failed) .. ' Failed</li>' ..\r\n      '<li class=\"l' .. tostring(self.skipped) .. '\">' .. tostring(self.skipped) .. ' Skipped</li>' ..\r\n      '<li>' .. finaltime .. 's</li>' .. '</ul><br/><br/>' ..\r\n      '<table><thead><tr><td width=\"20px\"></td><td width=\"100px\">Method</td><td width=\"60px\">Time</td><td>Details</td></tr></thead><tbody>' ..\r\n      self.html .. '</tbody></table></div>'\r\n    -- print module results to console\r\n    self:log('yellow', 'love.' .. self.module .. '.testmodule.end')\r\n    local failedcol = '\\27[31m'\r\n    if self.failed == 0 then failedcol = '\\27[37m' end\r\n    self:log('green', tostring(self.passed) .. ' PASSED' .. ' || ' .. \r\n      failedcol .. tostring(self.failed) .. ' FAILED || \\27[37m' .. \r\n      tostring(self.skipped) .. ' SKIPPED || ' .. finaltime .. 's')\r\n    self.start = false\r\n    self.fakequit = false\r\n  end\r\n\r\n\r\n}\r\n"
  },
  {
    "path": "testing/classes/TestSuite.lua",
    "content": "TestSuite = {\n\n\n  -- @method - TestSuite:new()\n  -- @desc - creates a new TestSuite object that handles all the tests\n  -- @return {table} - returns the new TestSuite object\n  new = function(self)\n    local test = {\n\n      -- testsuite internals\n      modules = {},\n      module = nil,\n      test = nil,\n      testcanvas = nil,\n      current = 1,\n      output = '',\n      totals = {0, 0, 0},\n      time = 0,\n      xml = '',\n      html = '',\n      mdrows = '',\n      mdfailures = '',\n      delayed = nil,\n      fakequit = false,\n      windowmode = true,\n      current_os = love._os,\n      lua_version = tonumber(_VERSION:match(\"%d%.%d\")),\n      has_lua_jit = type(jit) == 'table',\n\n      -- love modules to test\n      audio = {},\n      data = {},\n      event = {},\n      filesystem = {},\n      font = {},\n      graphics = {},\n      image = {},\n      joystick = {},\n      love = {},\n      keyboard = {},\n      math = {},\n      mouse = {},\n      physics = {},\n      sensor = {},\n      sound = {},\n      system = {},\n      thread = {},\n      timer = {},\n      touch = {},\n      video = {},\n      window = {}\n\n    }\n    setmetatable(test, self)\n    self.__index = self\n    return test\n  end,\n\n\n  -- @method - TestSuite:runSuite()\n  -- @desc - called in love.update, runs through every method or every module\n  -- @param {number} delta - delta from love.update to track time elapsed\n  -- @return {nil}\n  runSuite = function(self, delta)\n\n      -- stagger between tests\n    if self.module ~= nil then\n\n        if self.module.start then\n\n          -- work through each test method 1 by 1\n          if self.module.index <= #self.module.running then\n\n            -- run method once\n            if self.module.called[self.module.index] == nil then\n              self.module.called[self.module.index] = true\n              local method = self.module.running[self.module.index]\n              self.test = TestMethod:new(method, self.module)\n              TextRun = 'love.' .. self.module.module .. '.' .. method\n\n              self.test.co = coroutine.create(function()\n                local ok, chunk, err = pcall(\n                  love.test[love.test.module.module][method],\n                  love.test.test\n                )\n                if ok == false then\n                  love.test.test['passed'] = false\n                  love.test.test['fatal'] = tostring(chunk) .. tostring(err)\n                end\n              end)\n\n\n            -- once called we have a corouting, so just call resume every frame\n            -- until we have finished\n            else\n\n              -- move onto next yield if any\n              -- pauses can be set with TestMethod:waitFrames(frames)\n              coroutine.resume(self.test.co)\n\n              -- when wait finished (or no yields)\n              if coroutine.status(self.test.co) == 'dead' then\n                -- now we're all done evaluate the test\n                local ok, chunk, err = pcall(self.test.evaluateTest, self.test)\n                if ok == false then\n                  self.test.passed = false\n                  self.test.fatal = tostring(chunk) .. tostring(err)\n                end\n                -- save having to :release() anything we made in the last test\n                collectgarbage(\"collect\")\n                -- move onto the next test\n                self.module.index = self.module.index + 1\n              end\n\n            end\n\n          -- once all tests have run\n          else\n\n            -- print module results and add to output\n            self.module:printResult()\n\n            -- if we have more modules to go run the next one\n            self.current = self.current + 1\n            if #self.modules >= self.current then\n              self.module = self.modules[self.current]\n              self.module:runTests()\n\n            -- otherwise print the final results and export output\n            else\n              self:printResult()\n              love.event.quit(0)\n            end\n\n          end\n        end\n      end\n\n  end,\n\n\n  -- @method - TestSuite:printResult()\n  -- @desc - prints the result of the whole test suite as well as writes\n  --         the MD, XML + HTML of the testsuite output\n  -- @return {nil}\n  printResult = function(self)\n    local finaltime = UtilTimeFormat(self.time)\n\n    -- in case we dont have love.graphics loaded, for future module specific disabling\n    local name = 'NONE'\n    local version = 'NONE'\n    local vendor = 'NONE'\n    local device = 'NONE'\n    if love.graphics then\n      name, version, vendor, device = love.graphics.getRendererInfo()\n    end\n\n    local md = '<!-- PASSED ' .. tostring(self.totals[1]) ..\n      ' || FAILED ' .. tostring(self.totals[2]) ..\n      ' || SKIPPED ' .. tostring(self.totals[3]) ..\n      ' || TIME ' .. finaltime .. ' -->\\n\\n### Info\\n' ..\n      '**' .. tostring(self.totals[1] + self.totals[2] + self.totals[3]) .. '** tests were completed in **' ..\n      finaltime .. 's** with **' ..\n      tostring(self.totals[1]) .. '** passed, **' ..\n      tostring(self.totals[2]) .. '** failed, and **' ..\n      tostring(self.totals[3]) .. '** skipped\\n\\n' ..\n      'Renderer: ' .. name .. ' | ' .. version .. ' | ' .. vendor .. ' | ' .. device .. '\\n\\n' ..\n      '### Report\\n' ..\n      '| Module                | Pass | Fail | Skip | Time   |\\n' ..\n      '| --------------------- | ------ | ------ | ------- | ------ |\\n' ..\n      self.mdrows .. '\\n### Failures\\n' .. self.mdfailures\n\n    local xml = '<testsuites name=\"love.test\" tests=\"' .. tostring(self.totals[1]) ..\n      '\" failures=\"' .. tostring(self.totals[2]) ..\n      '\" skipped=\"' .. tostring(self.totals[3]) ..\n      '\" time=\"' .. finaltime .. '\">\\n'\n\n    local status = '<div class=\"icon fail\"></div>'\n    if self.totals[2] == 0 then status = '<div class=\"icon pass\"></div>' end\n    local html = [[\n      <html>\n        <head>\n          <style>\n          * { font-family: monospace; margin: 0; font-size: 11px; padding: 0; }\n          body { margin: 40px 50px 50px 50px; overflow-y: scroll; background: #222; }\n          h1 { font-weight: normal; color: #eee; font-size: 12px; width: 140px; border-radius: 2px; padding: 5px 0; float: left; background: #333;  }\n          h2 { font-weight: normal; color: #eee; font-size: 12px; width: 140px; border-radius: 2px;  }\n          .summary { z-index: 10; position: relative; list-style: none; margin: 0; padding: 0; float: right; } \n          .summary li { color: #111; float: left; border-radius: 2px; background: #eee; padding: 5px; margin-right: 10px; text-align: right; }\n          table { color: #eee; background: #444; margin: 5px 0 0 10px; width: calc(100% - 20px); max-width: 800px; border-collapse: collapse }\n          table thead { background: #333; }\n          table th, table td { padding: 2px 4px; font-size: 11px; }\n          tr.red { background: #d26666; color: #111; }\n          tr.yellow { background: slategrey; }\n          .wrap { max-width: 800px; padding-top: 30px; margin: auto; position: relative; }\n          .preview-wrap { display: inline-block; height: 80px; padding: 5px 0 0 5px; margin: 5px; background: rgba(0, 0, 0, 0.1); }\n          .preview { width: 64px; height: 80px; float: left; margin-right: 10px; }\n          .preview:nth-last-child(1) { margin-right: 5px; }\n          .preview img { width: 100%; image-rendering: pixelated; }\n          .preview p { text-align: center; }\n          .module { margin-top: 10px; position: relative; }\n          .module h2 { float: left; margin: 0; padding: 5px 0 0 35px; }\n          .module .toggle { background: #2d9966; color: #111; left: 10px; width: 14px; border-radius: 2px; padding: 6px; text-align: center; cursor: pointer; position: absolute; }\n          .module.fail .toggle { background: #d26666; }  \n          .module.fail h2 { color: #d26666; }\n          .toggle.close ~ table { display: none; }\n          .summary li:nth-child(1) { background: #2d9966; min-width: 70px; }\n          .summary li:nth-child(2) { background: #d26666; min-width: 70px; }\n          .summary li:nth-child(3) { background: slategrey; min-width: 70px; }\n          .summary li:nth-child(4) { background: #bbb; min-width: 60px; }\n          .summary li.l0 { opacity: 0.2; }\n          .renderer { position: absolute; top: 8px; right: 10px; color: #eee; }\n          h1 { width: 100%; top: 0; position: absolute; height: 50px; left: 0; }\n          table .icon.pass { position: relative; width: 8px; height: 8px; border-radius: 8px; margin-left: 6px; }\n          table .icon.pass:after { content: '✓'; top: -3px; position: absolute; color: #2d9966; font-size: 12px;  }\n          </style>\n          <script type=\"text/javascript\">\n            function toggle(el) { \n              el.className = el.className == 'toggle close' ? 'toggle open' : 'toggle close'; \n              el.innerText = el.className == 'toggle close' ? '▶' : '▼';\n            }\n          </script>\n        </head>\n        <body>]]\n    local wrap_cls = ''\n    if self.totals[2] > 0 then wrap_cls = 'fail' end\n    html = html .. '<div class=\"wrap ' .. wrap_cls .. '\"><h1>' .. status .. '&nbsp;love.test report</h1>' ..\n    '<p class=\"renderer\">Renderer: ' .. name .. ' | ' .. version .. ' | ' .. vendor .. ' | ' .. device .. '</p>' ..\n    '<ul class=\"summary\">'\n    html = html ..\n      '<li>' .. tostring(self.totals[1]) .. ' Passed</li>' ..\n      '<li>' .. tostring(self.totals[2]) .. ' Failed</li>' ..\n      '<li>' .. tostring(self.totals[3]) .. ' Skipped</li>' ..\n      '<li>' .. finaltime .. 's</li></ul><br/><br/>'\n\n    love.filesystem.write('tempoutput/' .. self.output .. '.xml', xml .. self.xml .. '</testsuites>')\n    love.filesystem.write('tempoutput/' .. self.output .. '.html', html .. self.html .. '</div></body></html>')\n    love.filesystem.write('tempoutput/' .. self.output .. '.md', md)\n\n    self.module:log('grey', '\\nFINISHED - ' .. finaltime .. 's\\n')\n    local failedcol = '\\27[31m'\n    if self.totals[2] == 0 then failedcol = '\\27[37m' end\n    self.module:log('green', tostring(self.totals[1]) .. ' PASSED' .. ' || ' .. failedcol .. tostring(self.totals[2]) .. ' FAILED || \\27[37m' .. tostring(self.totals[3]) .. ' SKIPPED')\n\n  end\n\n\n}\n"
  },
  {
    "path": "testing/conf.lua",
    "content": "function love.conf(t)\n  print(\"love.conf\")\n  t.console = true\n  t.window.name = 'love.test'\n  t.window.width = 360\n  t.window.height = 240\n  t.window.resizable = true\n  t.window.depth = true\n  t.window.stencil = true\n  t.window.usedpiscale = false\nend\n\n-- custom crash message here to catch anything that might occur with modules \n-- loading before we hit main.lua\nlocal function error_printer(msg, layer)\n  print((debug.traceback(\"Error: \" .. tostring(msg), 1+(layer or 1)):gsub(\"\\n[^\\n]+$\", \"\")))\nend\nfunction love.errorhandler(msg)\n  msg = tostring(msg)\n  error_printer(msg, 2)\nend\n"
  },
  {
    "path": "testing/examples/lovetest_runAllTests.html",
    "content": "<html><head><style>* { font-family: monospace; margin: 0; font-size: 11px; padding: 0; } body { margin: 50px; } h1 { padding-bottom: 10px; font-size: 13px; } h2 { padding: 20px 0 10px 0; font-size: 12px; } .summary { list-style: none; margin: 0; padding: 0; } .summary li { float: left; background: #eee; padding: 5px; margin-right: 10px; } table { background: #eee; margin-top: 10px; width: 100%; max-width: 800px; border-collapse: collapse } table thead { background: #ddd; } table th, table td { padding: 2px; } tr.red { color: red } .wrap { max-width: 800px; margin: auto; } .preview { width: 64px; height: 80px; float: left; margin-right: 10px; } .preview img { width: 100% } .preview p { text-align: center; }</style></head><body><div class=\"wrap\"><h1>🔴&nbsp;love.test</h1><ul class=\"summary\"><li>🟢&nbsp;343 Tests</li><li>🔴&nbsp;2 Failures</li><li>🟡&nbsp;10 Skipped</li><li>14.567s</li></ul><br/><br/><h2>🟢&nbsp;love.audio</h2><ul class=\"summary\"><li>🟢&nbsp;31 Tests</li><li>🔴&nbsp;0 Failures</li><li>🟡&nbsp;0 Skipped</li><li>1.328s</li><ul><br/><br/><table><thead><tr><td width=\"20px\"></td><td width=\"100px\">Method</td><td width=\"60px\">Time</td><td>Details</td></tr></thead><tbody><tr class=\" \"><td>🟢</td><td>RecordingDevice</td><td>0.816s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>Source</td><td>0.021s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getActiveEffects</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getActiveSourceCount</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getDistanceModel</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getDopplerScale</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getEffect</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getMaxSceneEffects</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getMaxSourceEffects</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getOrientation</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getPlaybackDevice</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getPlaybackDevices</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getPosition</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getRecordingDevices</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getVelocity</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getVolume</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>isEffectsSupported</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newQueueableSource</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newSource</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>pause</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>play</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setDistanceModel</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setDopplerScale</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setEffect</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setMixWithSystem</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setOrientation</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setPlaybackDevice</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setPosition</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setVelocity</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setVolume</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>stop</td><td>0.018s</td><td></td></tr></tbody></table><h2>🟢&nbsp;love.data</h2><ul class=\"summary\"><li>🟢&nbsp;12 Tests</li><li>🔴&nbsp;0 Failures</li><li>🟡&nbsp;0 Skipped</li><li>0.197s</li><ul><br/><br/><table><thead><tr><td width=\"20px\"></td><td width=\"100px\">Method</td><td width=\"60px\">Time</td><td>Details</td></tr></thead><tbody><tr class=\" \"><td>🟢</td><td>ByteData</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>CompressedData</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>compress</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>decode</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>decompress</td><td>0.013s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>encode</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getPackedSize</td><td>0.015s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>hash</td><td>0.019s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newByteData</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newDataView</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>pack</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>unpack</td><td>0.018s</td><td></td></tr></tbody></table><h2>🟢&nbsp;love.event</h2><ul class=\"summary\"><li>🟢&nbsp;4 Tests</li><li>🔴&nbsp;0 Failures</li><li>🟡&nbsp;2 Skipped</li><li>0.100s</li><ul><br/><br/><table><thead><tr><td width=\"20px\"></td><td width=\"100px\">Method</td><td width=\"60px\">Time</td><td>Details</td></tr></thead><tbody><tr class=\" \"><td>🟢</td><td>clear</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>poll</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟡</td><td>pump</td><td>0.016s</td><td>used internally</td></tr><tr class=\" \"><td>🟢</td><td>push</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>quit</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟡</td><td>wait</td><td>0.018s</td><td>used internally</td></tr></tbody></table><h2>🟢&nbsp;love.filesystem</h2><ul class=\"summary\"><li>🟢&nbsp;33 Tests</li><li>🔴&nbsp;0 Failures</li><li>🟡&nbsp;2 Skipped</li><li>0.601s</li><ul><br/><br/><table><thead><tr><td width=\"20px\"></td><td width=\"100px\">Method</td><td width=\"60px\">Time</td><td>Details</td></tr></thead><tbody><tr class=\" \"><td>🟢</td><td>File</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>FileData</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>append</td><td>0.019s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>areSymlinksEnabled</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>createDirectory</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getAppdataDirectory</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getCRequirePath</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getDirectoryItems</td><td>0.019s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getFullCommonPath</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getIdentity</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getInfo</td><td>0.019s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getRealDirectory</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getRequirePath</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getSaveDirectory</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟡</td><td>getSource</td><td>0.018s</td><td>used internally</td></tr><tr class=\" \"><td>🟢</td><td>getSourceBaseDirectory</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getUserDirectory</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getWorkingDirectory</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>isFused</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>lines</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>load</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>mount</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>mountCommonPath</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>mountFullPath</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newFileData</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>openFile</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>read</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>remove</td><td>0.019s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setCRequirePath</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setIdentity</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setRequirePath</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟡</td><td>setSource</td><td>0.016s</td><td>used internally</td></tr><tr class=\" \"><td>🟢</td><td>unmount</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>unmountFullPath</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>write</td><td>0.018s</td><td></td></tr></tbody></table><h2>🟢&nbsp;love.font</h2><ul class=\"summary\"><li>🟢&nbsp;7 Tests</li><li>🔴&nbsp;0 Failures</li><li>🟡&nbsp;0 Skipped</li><li>0.116s</li><ul><br/><br/><table><thead><tr><td width=\"20px\"></td><td width=\"100px\">Method</td><td width=\"60px\">Time</td><td>Details</td></tr></thead><tbody><tr class=\" \"><td>🟢</td><td>GlyphData</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>Rasterizer</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newBMFontRasterizer</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newGlyphData</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newImageRasterizer</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newRasterizer</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newTrueTypeRasterizer</td><td>0.016s</td><td></td></tr></tbody></table><h2>🔴&nbsp;love.graphics</h2><ul class=\"summary\"><li>🟢&nbsp;104 Tests</li><li>🔴&nbsp;1 Failures</li><li>🟡&nbsp;2 Skipped</li><li>3.463s</li><ul><br/><br/><table><thead><tr><td width=\"20px\"></td><td width=\"100px\">Method</td><td width=\"60px\">Time</td><td>Details</td></tr></thead><tbody><tr class=\" \"><td>🟢</td><td>Buffer</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>Canvas</td><td>0.086s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.Canvas-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.Canvas-1.png\"/><p>Actual</p></div><div class=\"preview\"><img src=\"expected/love.test.graphics.Canvas-2.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.Canvas-2.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>Font</td><td>0.021s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.Font-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.Font-1.png\"/><p>Actual</p></div><div class=\"preview\"><img src=\"expected/love.test.graphics.Font-2.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.Font-2.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>Image</td><td>0.041s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.Image-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.Image-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>Mesh</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>ParticleSystem</td><td>0.040s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.ParticleSystem-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.ParticleSystem-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>Quad</td><td>0.025s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.Quad-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.Quad-1.png\"/><p>Actual</p></div></td></tr><tr class=\" red\"><td>🔴</td><td>Shader</td><td>0.028s</td><td>assert 4 [check shader valid] expected '' got 'vertex shader:\npixel shader:\n'<div class=\"preview\"><img src=\"expected/love.test.graphics.Shader-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.Shader-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟡</td><td>ShaderStorageBuffer</td><td>0.017s</td><td>GLSL 4 and shader storage buffers are not supported on this system</td></tr><tr class=\" \"><td>🟢</td><td>SpriteBatch</td><td>0.085s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.SpriteBatch-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.SpriteBatch-1.png\"/><p>Actual</p></div><div class=\"preview\"><img src=\"expected/love.test.graphics.SpriteBatch-2.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.SpriteBatch-2.png\"/><p>Actual</p></div><div class=\"preview\"><img src=\"expected/love.test.graphics.SpriteBatch-3.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.SpriteBatch-3.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>Text</td><td>0.026s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.Text-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.Text-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>Video</td><td>0.885s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.Video-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.Video-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>applyTransform</td><td>0.034s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.applyTransform-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.applyTransform-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>arc</td><td>0.021s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.arc-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.arc-1.png\"/><p>Actual</p></div><div class=\"preview\"><img src=\"expected/love.test.graphics.arc-2.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.arc-2.png\"/><p>Actual</p></div><div class=\"preview\"><img src=\"expected/love.test.graphics.arc-3.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.arc-3.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>captureScreenshot</td><td>0.349s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>circle</td><td>0.018s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.circle-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.circle-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>clear</td><td>0.018s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.clear-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.clear-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟡</td><td>discard</td><td>0.017s</td><td>cant test this worked</td></tr><tr class=\" \"><td>🟢</td><td>draw</td><td>0.032s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.draw-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.draw-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>drawInstanced</td><td>0.034s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.drawInstanced-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.drawInstanced-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>drawLayer</td><td>0.031s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.drawLayer-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.drawLayer-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>ellipse</td><td>0.019s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.ellipse-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.ellipse-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>flushBatch</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getBackgroundColor</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getBlendMode</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getCanvas</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getColor</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getColorMask</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getDPIScale</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getDefaultFilter</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getDepthMode</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getDimensions</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getFont</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getFrontFaceWinding</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getHeight</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getLineJoin</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getLineStyle</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getLineWidth</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getMeshCullMode</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getPixelDimensions</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getPixelHeight</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getPixelWidth</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getPointSize</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getRendererInfo</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getScissor</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getShader</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getStackDepth</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getStats</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getStencilState</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getSupported</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getSystemLimits</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getTextureFormats</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getTextureTypes</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getWidth</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>intersectScissor</td><td>0.018s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.intersectScissor-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.intersectScissor-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>inverseTransformPoint</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>isActive</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>isGammaCorrect</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>isWireframe</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>line</td><td>0.018s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.line-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.line-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>newArrayImage</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newCanvas</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newCubeImage</td><td>0.020s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newFont</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newImage</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newImageFont</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newMesh</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newParticleSystem</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newQuad</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newShader</td><td>0.028s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newSpriteBatch</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newTextBatch</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newVideo</td><td>0.021s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newVolumeImage</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>origin</td><td>0.019s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.origin-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.origin-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>points</td><td>0.022s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.points-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.points-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>polygon</td><td>0.017s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.polygon-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.polygon-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>pop</td><td>0.017s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.pop-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.pop-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>print</td><td>0.028s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.print-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.print-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>printf</td><td>0.020s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.printf-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.printf-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>push</td><td>0.019s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.push-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.push-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>rectangle</td><td>0.024s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.rectangle-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.rectangle-1.png\"/><p>Actual</p></div><div class=\"preview\"><img src=\"expected/love.test.graphics.rectangle-2.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.rectangle-2.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>replaceTransform</td><td>0.020s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.replaceTransform-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.replaceTransform-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>reset</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>rotate</td><td>0.035s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.rotate-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.rotate-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>scale</td><td>0.019s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.scale-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.scale-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>setBackgroundColor</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setBlendMode</td><td>0.038s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.setBlendMode-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.setBlendMode-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>setCanvas</td><td>0.018s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.setCanvas-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.setCanvas-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>setColor</td><td>0.020s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.setColor-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.setColor-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>setColorMask</td><td>0.028s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.setColorMask-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.setColorMask-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>setDefaultFilter</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setDepthMode</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setFont</td><td>0.020s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.setFont-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.setFont-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>setFrontFaceWinding</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setLineJoin</td><td>0.033s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.setLineJoin-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.setLineJoin-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>setLineStyle</td><td>0.019s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.setLineStyle-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.setLineStyle-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>setLineWidth</td><td>0.019s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.setLineWidth-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.setLineWidth-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>setMeshCullMode</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setScissor</td><td>0.019s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.setScissor-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.setScissor-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>setShader</td><td>0.031s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.setShader-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.setShader-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>setStencilState</td><td>0.018s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.setStencilState-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.setStencilState-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>setWireframe</td><td>0.018s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.setWireframe-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.setWireframe-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>shear</td><td>0.020s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.shear-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.shear-1.png\"/><p>Actual</p></div><div class=\"preview\"><img src=\"expected/love.test.graphics.shear-2.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.shear-2.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>transformPoint</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>translate</td><td>0.018s</td><td><div class=\"preview\"><img src=\"expected/love.test.graphics.translate-1.png\"/><p>Expected</p></div><div class=\"preview\"><img src=\"actual/love.test.graphics.translate-1.png\"/><p>Actual</p></div></td></tr><tr class=\" \"><td>🟢</td><td>validateShader</td><td>0.026s</td><td></td></tr></tbody></table><h2>🟢&nbsp;love.image</h2><ul class=\"summary\"><li>🟢&nbsp;5 Tests</li><li>🔴&nbsp;0 Failures</li><li>🟡&nbsp;0 Skipped</li><li>0.093s</li><ul><br/><br/><table><thead><tr><td width=\"20px\"></td><td width=\"100px\">Method</td><td width=\"60px\">Time</td><td>Details</td></tr></thead><tbody><tr class=\" \"><td>🟢</td><td>CompressedImageData</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>ImageData</td><td>0.026s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>isCompressed</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newCompressedData</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newImageData</td><td>0.017s</td><td></td></tr></tbody></table><h2>🟢&nbsp;love.joystick</h2><ul class=\"summary\"><li>🟢&nbsp;6 Tests</li><li>🔴&nbsp;0 Failures</li><li>🟡&nbsp;0 Skipped</li><li>0.116s</li><ul><br/><br/><table><thead><tr><td width=\"20px\"></td><td width=\"100px\">Method</td><td width=\"60px\">Time</td><td>Details</td></tr></thead><tbody><tr class=\" \"><td>🟢</td><td>getGamepadMappingString</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getJoystickCount</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getJoysticks</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>loadGamepadMappings</td><td>0.023s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>saveGamepadMappings</td><td>0.024s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setGamepadMapping</td><td>0.018s</td><td></td></tr></tbody></table><h2>🟢&nbsp;love.keyboard</h2><ul class=\"summary\"><li>🟢&nbsp;10 Tests</li><li>🔴&nbsp;0 Failures</li><li>🟡&nbsp;0 Skipped</li><li>0.170s</li><ul><br/><br/><table><thead><tr><td width=\"20px\"></td><td width=\"100px\">Method</td><td width=\"60px\">Time</td><td>Details</td></tr></thead><tbody><tr class=\" \"><td>🟢</td><td>getKeyFromScancode</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getScancodeFromKey</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>hasKeyRepeat</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>hasScreenKeyboard</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>hasTextInput</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>isDown</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>isModifierActive</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>isScancodeDown</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setKeyRepeat</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setTextInput</td><td>0.017s</td><td></td></tr></tbody></table><h2>🟢&nbsp;love.love</h2><ul class=\"summary\"><li>🟢&nbsp;6 Tests</li><li>🔴&nbsp;0 Failures</li><li>🟡&nbsp;0 Skipped</li><li>0.100s</li><ul><br/><br/><table><thead><tr><td width=\"20px\"></td><td width=\"100px\">Method</td><td width=\"60px\">Time</td><td>Details</td></tr></thead><tbody><tr class=\" \"><td>🟢</td><td>errhand</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getVersion</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>hasDeprecationOutput</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>isVersionCompatible</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>run</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setDeprecationOutput</td><td>0.017s</td><td></td></tr></tbody></table><h2>🟢&nbsp;love.math</h2><ul class=\"summary\"><li>🟢&nbsp;20 Tests</li><li>🔴&nbsp;0 Failures</li><li>🟡&nbsp;0 Skipped</li><li>0.334s</li><ul><br/><br/><table><thead><tr><td width=\"20px\"></td><td width=\"100px\">Method</td><td width=\"60px\">Time</td><td>Details</td></tr></thead><tbody><tr class=\" \"><td>🟢</td><td>BezierCurve</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>RandomGenerator</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>Transform</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>colorFromBytes</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>colorToBytes</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>gammaToLinear</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getRandomSeed</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getRandomState</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>isConvex</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>linearToGamma</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newBezierCurve</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newRandomGenerator</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newTransform</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>perlinNoise</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>random</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>randomNormal</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setRandomSeed</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setRandomState</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>simplexNoise</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>triangulate</td><td>0.017s</td><td></td></tr></tbody></table><h2>🔴&nbsp;love.mouse</h2><ul class=\"summary\"><li>🟢&nbsp;17 Tests</li><li>🔴&nbsp;1 Failures</li><li>🟡&nbsp;0 Skipped</li><li>0.301s</li><ul><br/><br/><table><thead><tr><td width=\"20px\"></td><td width=\"100px\">Method</td><td width=\"60px\">Time</td><td>Details</td></tr></thead><tbody><tr class=\" \"><td>🟢</td><td>getCursor</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getPosition</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getRelativeMode</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getSystemCursor</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getX</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getY</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>isCursorSupported</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>isDown</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>isGrabbed</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>isVisible</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newCursor</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setCursor</td><td>0.017s</td><td></td></tr><tr class=\" red\"><td>🔴</td><td>setGrabbed</td><td>0.016s</td><td>assert 2 [check now grabbed] expected 'true' got 'false'</td></tr><tr class=\" \"><td>🟢</td><td>setPosition</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setRelativeMode</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setVisible</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setX</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setY</td><td>0.017s</td><td></td></tr></tbody></table><h2>🟢&nbsp;love.physics</h2><ul class=\"summary\"><li>🟢&nbsp;26 Tests</li><li>🔴&nbsp;0 Failures</li><li>🟡&nbsp;0 Skipped</li><li>0.435s</li><ul><br/><br/><table><thead><tr><td width=\"20px\"></td><td width=\"100px\">Method</td><td width=\"60px\">Time</td><td>Details</td></tr></thead><tbody><tr class=\" \"><td>🟢</td><td>Body</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>Contact</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>Joint</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>Shape</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>World</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getDistance</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getMeter</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newBody</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newChainShape</td><td>0.013s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newCircleShape</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newDistanceJoint</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newEdgeShape</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newFrictionJoint</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newGearJoint</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newMotorJoint</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newMouseJoint</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newPolygonShape</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newPrismaticJoint</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newPulleyJoint</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newRectangleShape</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newRevoluteJoint</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newRopeJoint</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newWeldJoint</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newWheelJoint</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newWorld</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setMeter</td><td>0.016s</td><td></td></tr></tbody></table><h2>🟢&nbsp;love.sensor</h2><ul class=\"summary\"><li>🟢&nbsp;1 Tests</li><li>🔴&nbsp;0 Failures</li><li>🟡&nbsp;0 Skipped</li><li>0.017s</li><ul><br/><br/><table><thead><tr><td width=\"20px\"></td><td width=\"100px\">Method</td><td width=\"60px\">Time</td><td>Details</td></tr></thead><tbody><tr class=\" \"><td>🟢</td><td>hasSensor</td><td>0.017s</td><td></td></tr></tbody></table><h2>🟢&nbsp;love.sound</h2><ul class=\"summary\"><li>🟢&nbsp;4 Tests</li><li>🔴&nbsp;0 Failures</li><li>🟡&nbsp;0 Skipped</li><li>0.075s</li><ul><br/><br/><table><thead><tr><td width=\"20px\"></td><td width=\"100px\">Method</td><td width=\"60px\">Time</td><td>Details</td></tr></thead><tbody><tr class=\" \"><td>🟢</td><td>Decoder</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>SoundData</td><td>0.022s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newDecoder</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newSoundData</td><td>0.019s</td><td></td></tr></tbody></table><h2>🟢&nbsp;love.system</h2><ul class=\"summary\"><li>🟢&nbsp;7 Tests</li><li>🔴&nbsp;0 Failures</li><li>🟡&nbsp;2 Skipped</li><li>0.150s</li><ul><br/><br/><table><thead><tr><td width=\"20px\"></td><td width=\"100px\">Method</td><td width=\"60px\">Time</td><td>Details</td></tr></thead><tbody><tr class=\" \"><td>🟢</td><td>getClipboardText</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getOS</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getPowerInfo</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getPreferredLocales</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getProcessorCount</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>hasBackgroundMusic</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟡</td><td>openURL</td><td>0.017s</td><td>cant test this worked</td></tr><tr class=\" \"><td>🟢</td><td>setClipboardText</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟡</td><td>vibrate</td><td>0.016s</td><td>cant test this worked</td></tr></tbody></table><h2>🟢&nbsp;love.thread</h2><ul class=\"summary\"><li>🟢&nbsp;5 Tests</li><li>🔴&nbsp;0 Failures</li><li>🟡&nbsp;0 Skipped</li><li>0.306s</li><ul><br/><br/><table><thead><tr><td width=\"20px\"></td><td width=\"100px\">Method</td><td width=\"60px\">Time</td><td>Details</td></tr></thead><tbody><tr class=\" \"><td>🟢</td><td>Channel</td><td>0.231s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>Thread</td><td>0.024s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getChannel</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newChannel</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newThread</td><td>0.015s</td><td></td></tr></tbody></table><h2>🟢&nbsp;love.timer</h2><ul class=\"summary\"><li>🟢&nbsp;6 Tests</li><li>🔴&nbsp;0 Failures</li><li>🟡&nbsp;0 Skipped</li><li>0.298s</li><ul><br/><br/><table><thead><tr><td width=\"20px\"></td><td width=\"100px\">Method</td><td width=\"60px\">Time</td><td>Details</td></tr></thead><tbody><tr class=\" \"><td>🟢</td><td>getAverageDelta</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getDelta</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getFPS</td><td>0.015s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getTime</td><td>0.118s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>sleep</td><td>0.117s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>step</td><td>0.016s</td><td></td></tr></tbody></table><h2>🟢&nbsp;love.touch</h2><ul class=\"summary\"><li>🟢&nbsp;3 Tests</li><li>🔴&nbsp;0 Failures</li><li>🟡&nbsp;0 Skipped</li><li>0.051s</li><ul><br/><br/><table><thead><tr><td width=\"20px\"></td><td width=\"100px\">Method</td><td width=\"60px\">Time</td><td>Details</td></tr></thead><tbody><tr class=\" \"><td>🟢</td><td>getPosition</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getPressure</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getTouches</td><td>0.017s</td><td></td></tr></tbody></table><h2>🟢&nbsp;love.video</h2><ul class=\"summary\"><li>🟢&nbsp;2 Tests</li><li>🔴&nbsp;0 Failures</li><li>🟡&nbsp;0 Skipped</li><li>0.038s</li><ul><br/><br/><table><thead><tr><td width=\"20px\"></td><td width=\"100px\">Method</td><td width=\"60px\">Time</td><td>Details</td></tr></thead><tbody><tr class=\" \"><td>🟢</td><td>VideoStream</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>newVideoStream</td><td>0.020s</td><td></td></tr></tbody></table><h2>🟢&nbsp;love.window</h2><ul class=\"summary\"><li>🟢&nbsp;34 Tests</li><li>🔴&nbsp;0 Failures</li><li>🟡&nbsp;2 Skipped</li><li>6.275s</li><ul><br/><br/><table><thead><tr><td width=\"20px\"></td><td width=\"100px\">Method</td><td width=\"60px\">Time</td><td>Details</td></tr></thead><tbody><tr class=\" \"><td>🟢</td><td>focus</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>fromPixels</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getDPIScale</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getDesktopDimensions</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getDisplayCount</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getDisplayName</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getDisplayOrientation</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getFullscreen</td><td>1.351s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getFullscreenModes</td><td>0.013s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getIcon</td><td>0.019s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getMode</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getPosition</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getSafeArea</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getTitle</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>getVSync</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>hasFocus</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>hasMouseFocus</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>isDisplaySleepEnabled</td><td>0.016s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>isMaximized</td><td>0.186s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>isMinimized</td><td>0.816s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>isOpen</td><td>0.014s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>isVisible</td><td>0.017s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>maximize</td><td>0.186s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>minimize</td><td>0.807s</td><td></td></tr><tr class=\" \"><td>🟡</td><td>requestAttention</td><td>0.016s</td><td>cant test this worked</td></tr><tr class=\" \"><td>🟢</td><td>restore</td><td>0.966s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setDisplaySleepEnabled</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setFullscreen</td><td>1.356s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setIcon</td><td>0.015s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setMode</td><td>0.020s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setPosition</td><td>0.183s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setTitle</td><td>0.018s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>setVSync</td><td>0.015s</td><td></td></tr><tr class=\" \"><td>🟡</td><td>showMessageBox</td><td>0.002s</td><td>cant test this worked</td></tr><tr class=\" \"><td>🟢</td><td>toPixels</td><td>0.002s</td><td></td></tr><tr class=\" \"><td>🟢</td><td>updateMode</td><td>0.010s</td><td></td></tr></tbody></table></div></body></html>"
  },
  {
    "path": "testing/examples/lovetest_runAllTests.md",
    "content": "<!-- PASSED 343 || FAILED 2 || SKIPPED 10 || TIME 14.567 -->\n\n### Info\n**355** tests were completed in **14.567s** with **343** passed, **2** failed, and **10** skipped\n\nRenderer: OpenGL | 4.1 Metal - 76.3 | Apple | Apple M1 Max\n\n### Report\n| Module                | Pass | Fail | Skip | Time   |\n| --------------------- | ------ | ------ | ------- | ------ |\n| 🟢 audio | 31 | 0 | 0 | 1.328s |\n| 🟢 data | 12 | 0 | 0 | 0.197s |\n| 🟢 event | 4 | 0 | 2 | 0.100s |\n| 🟢 filesystem | 33 | 0 | 2 | 0.601s |\n| 🟢 font | 7 | 0 | 0 | 0.116s |\n| 🔴 graphics | 104 | 1 | 2 | 3.463s |\n| 🟢 image | 5 | 0 | 0 | 0.093s |\n| 🟢 joystick | 6 | 0 | 0 | 0.116s |\n| 🟢 keyboard | 10 | 0 | 0 | 0.170s |\n| 🟢 love | 6 | 0 | 0 | 0.100s |\n| 🟢 math | 20 | 0 | 0 | 0.334s |\n| 🔴 mouse | 17 | 1 | 0 | 0.301s |\n| 🟢 physics | 26 | 0 | 0 | 0.435s |\n| 🟢 sensor | 1 | 0 | 0 | 0.017s |\n| 🟢 sound | 4 | 0 | 0 | 0.075s |\n| 🟢 system | 7 | 0 | 2 | 0.150s |\n| 🟢 thread | 5 | 0 | 0 | 0.306s |\n| 🟢 timer | 6 | 0 | 0 | 0.298s |\n| 🟢 touch | 3 | 0 | 0 | 0.051s |\n| 🟢 video | 2 | 0 | 0 | 0.038s |\n| 🟢 window | 34 | 0 | 2 | 6.275s |\n\n### Failures\n> 🔴 Shader  \n> assert 4 [check shader valid] expected '' got 'vertex shader:\npixel shader:\n'  \n\n> 🔴 setGrabbed  \n> assert 2 [check now grabbed] expected 'true' got 'false'  \n\n"
  },
  {
    "path": "testing/examples/lovetest_runAllTests.xml",
    "content": "<testsuites name=\"love.test\" tests=\"343\" failures=\"2\" skipped=\"10\" time=\"14.567\">\n\t<testsuite name=\"love.audio\" tests=\"31\" failures=\"0\" skipped=\"0\" time=\"1.328\">\n\t\t<testcase classname=\"RecordingDevice\" name=\"RecordingDevice\" assertions=\"20\" time=\"0.816\">\n\t\t</testcase>\n\t\t<testcase classname=\"Source\" name=\"Source\" assertions=\"54\" time=\"0.021\">\n\t\t</testcase>\n\t\t<testcase classname=\"getActiveEffects\" name=\"getActiveEffects\" assertions=\"3\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"getActiveSourceCount\" name=\"getActiveSourceCount\" assertions=\"3\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"getDistanceModel\" name=\"getDistanceModel\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getDopplerScale\" name=\"getDopplerScale\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getEffect\" name=\"getEffect\" assertions=\"4\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"getMaxSceneEffects\" name=\"getMaxSceneEffects\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getMaxSourceEffects\" name=\"getMaxSourceEffects\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getOrientation\" name=\"getOrientation\" assertions=\"6\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getPlaybackDevice\" name=\"getPlaybackDevice\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getPlaybackDevices\" name=\"getPlaybackDevices\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getPosition\" name=\"getPosition\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getRecordingDevices\" name=\"getRecordingDevices\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getVelocity\" name=\"getVelocity\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getVolume\" name=\"getVolume\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"isEffectsSupported\" name=\"isEffectsSupported\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newQueueableSource\" name=\"newQueueableSource\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newSource\" name=\"newSource\" assertions=\"6\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"pause\" name=\"pause\" assertions=\"2\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"play\" name=\"play\" assertions=\"1\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"setDistanceModel\" name=\"setDistanceModel\" assertions=\"7\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"setDopplerScale\" name=\"setDopplerScale\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"setEffect\" name=\"setEffect\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"setMixWithSystem\" name=\"setMixWithSystem\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"setOrientation\" name=\"setOrientation\" assertions=\"6\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"setPlaybackDevice\" name=\"setPlaybackDevice\" assertions=\"4\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"setPosition\" name=\"setPosition\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"setVelocity\" name=\"setVelocity\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"setVolume\" name=\"setVolume\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"stop\" name=\"stop\" assertions=\"2\" time=\"0.018\">\n\t\t</testcase>\n\t</testsuite>\n\t<testsuite name=\"love.data\" tests=\"12\" failures=\"0\" skipped=\"0\" time=\"0.197\">\n\t\t<testcase classname=\"ByteData\" name=\"ByteData\" assertions=\"11\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"CompressedData\" name=\"CompressedData\" assertions=\"12\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"compress\" name=\"compress\" assertions=\"62\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"decode\" name=\"decode\" assertions=\"4\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"decompress\" name=\"decompress\" assertions=\"18\" time=\"0.013\">\n\t\t</testcase>\n\t\t<testcase classname=\"encode\" name=\"encode\" assertions=\"15\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getPackedSize\" name=\"getPackedSize\" assertions=\"3\" time=\"0.015\">\n\t\t</testcase>\n\t\t<testcase classname=\"hash\" name=\"hash\" assertions=\"12\" time=\"0.019\">\n\t\t</testcase>\n\t\t<testcase classname=\"newByteData\" name=\"newByteData\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newDataView\" name=\"newDataView\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"pack\" name=\"pack\" assertions=\"4\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"unpack\" name=\"unpack\" assertions=\"3\" time=\"0.018\">\n\t\t</testcase>\n\t</testsuite>\n\t<testsuite name=\"love.event\" tests=\"4\" failures=\"0\" skipped=\"2\" time=\"0.100\">\n\t\t<testcase classname=\"clear\" name=\"clear\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"poll\" name=\"poll\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"pump\" name=\"pump\" assertions=\"0\" time=\"0.016\">\n\t\t\t<skipped message=\"used internally\" />\n\t\t</testcase>\n\t\t<testcase classname=\"push\" name=\"push\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"quit\" name=\"quit\" assertions=\"1\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"wait\" name=\"wait\" assertions=\"0\" time=\"0.018\">\n\t\t\t<skipped message=\"used internally\" />\n\t\t</testcase>\n\t</testsuite>\n\t<testsuite name=\"love.filesystem\" tests=\"33\" failures=\"0\" skipped=\"2\" time=\"0.601\">\n\t\t<testcase classname=\"File\" name=\"File\" assertions=\"36\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"FileData\" name=\"FileData\" assertions=\"12\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"append\" name=\"append\" assertions=\"6\" time=\"0.019\">\n\t\t</testcase>\n\t\t<testcase classname=\"areSymlinksEnabled\" name=\"areSymlinksEnabled\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"createDirectory\" name=\"createDirectory\" assertions=\"3\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"getAppdataDirectory\" name=\"getAppdataDirectory\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getCRequirePath\" name=\"getCRequirePath\" assertions=\"1\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"getDirectoryItems\" name=\"getDirectoryItems\" assertions=\"2\" time=\"0.019\">\n\t\t</testcase>\n\t\t<testcase classname=\"getFullCommonPath\" name=\"getFullCommonPath\" assertions=\"7\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getIdentity\" name=\"getIdentity\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getInfo\" name=\"getInfo\" assertions=\"4\" time=\"0.019\">\n\t\t</testcase>\n\t\t<testcase classname=\"getRealDirectory\" name=\"getRealDirectory\" assertions=\"1\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"getRequirePath\" name=\"getRequirePath\" assertions=\"1\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"getSaveDirectory\" name=\"getSaveDirectory\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getSource\" name=\"getSource\" assertions=\"0\" time=\"0.018\">\n\t\t\t<skipped message=\"used internally\" />\n\t\t</testcase>\n\t\t<testcase classname=\"getSourceBaseDirectory\" name=\"getSourceBaseDirectory\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getUserDirectory\" name=\"getUserDirectory\" assertions=\"1\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"getWorkingDirectory\" name=\"getWorkingDirectory\" assertions=\"1\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"isFused\" name=\"isFused\" assertions=\"1\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"lines\" name=\"lines\" assertions=\"6\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"load\" name=\"load\" assertions=\"6\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"mount\" name=\"mount\" assertions=\"5\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"mountCommonPath\" name=\"mountCommonPath\" assertions=\"7\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"mountFullPath\" name=\"mountFullPath\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newFileData\" name=\"newFileData\" assertions=\"1\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"openFile\" name=\"openFile\" assertions=\"4\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"read\" name=\"read\" assertions=\"6\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"remove\" name=\"remove\" assertions=\"5\" time=\"0.019\">\n\t\t</testcase>\n\t\t<testcase classname=\"setCRequirePath\" name=\"setCRequirePath\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"setIdentity\" name=\"setIdentity\" assertions=\"1\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"setRequirePath\" name=\"setRequirePath\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"setSource\" name=\"setSource\" assertions=\"0\" time=\"0.016\">\n\t\t\t<skipped message=\"used internally\" />\n\t\t</testcase>\n\t\t<testcase classname=\"unmount\" name=\"unmount\" assertions=\"2\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"unmountFullPath\" name=\"unmountFullPath\" assertions=\"2\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"write\" name=\"write\" assertions=\"3\" time=\"0.018\">\n\t\t</testcase>\n\t</testsuite>\n\t<testsuite name=\"love.font\" tests=\"7\" failures=\"0\" skipped=\"0\" time=\"0.116\">\n\t\t<testcase classname=\"GlyphData\" name=\"GlyphData\" assertions=\"17\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"Rasterizer\" name=\"Rasterizer\" assertions=\"13\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"newBMFontRasterizer\" name=\"newBMFontRasterizer\" assertions=\"3\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"newGlyphData\" name=\"newGlyphData\" assertions=\"3\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"newImageRasterizer\" name=\"newImageRasterizer\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newRasterizer\" name=\"newRasterizer\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newTrueTypeRasterizer\" name=\"newTrueTypeRasterizer\" assertions=\"6\" time=\"0.016\">\n\t\t</testcase>\n\t</testsuite>\n\t<testsuite name=\"love.graphics\" tests=\"104\" failures=\"1\" skipped=\"2\" time=\"3.463\">\n\t\t<testcase classname=\"Buffer\" name=\"Buffer\" assertions=\"30\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"Canvas\" name=\"Canvas\" assertions=\"18857\" time=\"0.086\">\n\t\t</testcase>\n\t\t<testcase classname=\"Font\" name=\"Font\" assertions=\"356\" time=\"0.021\">\n\t\t</testcase>\n\t\t<testcase classname=\"Image\" name=\"Image\" assertions=\"3763\" time=\"0.041\">\n\t\t</testcase>\n\t\t<testcase classname=\"Mesh\" name=\"Mesh\" assertions=\"49\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"ParticleSystem\" name=\"ParticleSystem\" assertions=\"3808\" time=\"0.040\">\n\t\t</testcase>\n\t\t<testcase classname=\"Quad\" name=\"Quad\" assertions=\"3728\" time=\"0.025\">\n\t\t</testcase>\n\t\t<testcase classname=\"Shader\" name=\"Shader\" assertions=\"177\" time=\"0.028\">\n\t\t\t<failure message=\"assert 4 [check shader valid] expected '' got 'vertex shader:\npixel shader:\n'\">assert 4 [check shader valid] expected '' got 'vertex shader:\npixel shader:\n'</failure>\n\t\t</testcase>\n\t\t<testcase classname=\"ShaderStorageBuffer\" name=\"ShaderStorageBuffer\" assertions=\"0\" time=\"0.017\">\n\t\t\t<skipped message=\"GLSL 4 and shader storage buffers are not supported on this system\" />\n\t\t</testcase>\n\t\t<testcase classname=\"SpriteBatch\" name=\"SpriteBatch\" assertions=\"18624\" time=\"0.085\">\n\t\t</testcase>\n\t\t<testcase classname=\"Text\" name=\"Text\" assertions=\"3735\" time=\"0.026\">\n\t\t</testcase>\n\t\t<testcase classname=\"Video\" name=\"Video\" assertions=\"247033\" time=\"0.885\">\n\t\t</testcase>\n\t\t<testcase classname=\"applyTransform\" name=\"applyTransform\" assertions=\"169\" time=\"0.034\">\n\t\t</testcase>\n\t\t<testcase classname=\"arc\" name=\"arc\" assertions=\"2523\" time=\"0.021\">\n\t\t</testcase>\n\t\t<testcase classname=\"captureScreenshot\" name=\"captureScreenshot\" assertions=\"2\" time=\"0.349\">\n\t\t</testcase>\n\t\t<testcase classname=\"circle\" name=\"circle\" assertions=\"841\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"clear\" name=\"clear\" assertions=\"169\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"discard\" name=\"discard\" assertions=\"0\" time=\"0.017\">\n\t\t\t<skipped message=\"cant test this worked\" />\n\t\t</testcase>\n\t\t<testcase classname=\"draw\" name=\"draw\" assertions=\"841\" time=\"0.032\">\n\t\t</testcase>\n\t\t<testcase classname=\"drawInstanced\" name=\"drawInstanced\" assertions=\"3721\" time=\"0.034\">\n\t\t</testcase>\n\t\t<testcase classname=\"drawLayer\" name=\"drawLayer\" assertions=\"3721\" time=\"0.031\">\n\t\t</testcase>\n\t\t<testcase classname=\"ellipse\" name=\"ellipse\" assertions=\"841\" time=\"0.019\">\n\t\t</testcase>\n\t\t<testcase classname=\"flushBatch\" name=\"flushBatch\" assertions=\"1\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"getBackgroundColor\" name=\"getBackgroundColor\" assertions=\"8\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getBlendMode\" name=\"getBlendMode\" assertions=\"4\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getCanvas\" name=\"getCanvas\" assertions=\"4\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getColor\" name=\"getColor\" assertions=\"8\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getColorMask\" name=\"getColorMask\" assertions=\"8\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getDPIScale\" name=\"getDPIScale\" assertions=\"1\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"getDefaultFilter\" name=\"getDefaultFilter\" assertions=\"3\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"getDepthMode\" name=\"getDepthMode\" assertions=\"2\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"getDimensions\" name=\"getDimensions\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getFont\" name=\"getFont\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getFrontFaceWinding\" name=\"getFrontFaceWinding\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getHeight\" name=\"getHeight\" assertions=\"1\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"getLineJoin\" name=\"getLineJoin\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getLineStyle\" name=\"getLineStyle\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getLineWidth\" name=\"getLineWidth\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getMeshCullMode\" name=\"getMeshCullMode\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getPixelDimensions\" name=\"getPixelDimensions\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getPixelHeight\" name=\"getPixelHeight\" assertions=\"1\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"getPixelWidth\" name=\"getPixelWidth\" assertions=\"1\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"getPointSize\" name=\"getPointSize\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getRendererInfo\" name=\"getRendererInfo\" assertions=\"4\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"getScissor\" name=\"getScissor\" assertions=\"8\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getShader\" name=\"getShader\" assertions=\"1\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"getStackDepth\" name=\"getStackDepth\" assertions=\"4\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"getStats\" name=\"getStats\" assertions=\"7\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getStencilState\" name=\"getStencilState\" assertions=\"6\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getSupported\" name=\"getSupported\" assertions=\"17\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getSystemLimits\" name=\"getSystemLimits\" assertions=\"13\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getTextureFormats\" name=\"getTextureFormats\" assertions=\"79\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getTextureTypes\" name=\"getTextureTypes\" assertions=\"4\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getWidth\" name=\"getWidth\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"intersectScissor\" name=\"intersectScissor\" assertions=\"169\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"inverseTransformPoint\" name=\"inverseTransformPoint\" assertions=\"4\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"isActive\" name=\"isActive\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"isGammaCorrect\" name=\"isGammaCorrect\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"isWireframe\" name=\"isWireframe\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"line\" name=\"line\" assertions=\"169\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"newArrayImage\" name=\"newArrayImage\" assertions=\"3\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"newCanvas\" name=\"newCanvas\" assertions=\"6\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newCubeImage\" name=\"newCubeImage\" assertions=\"3\" time=\"0.020\">\n\t\t</testcase>\n\t\t<testcase classname=\"newFont\" name=\"newFont\" assertions=\"6\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"newImage\" name=\"newImage\" assertions=\"3\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"newImageFont\" name=\"newImageFont\" assertions=\"3\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"newMesh\" name=\"newMesh\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newParticleSystem\" name=\"newParticleSystem\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newQuad\" name=\"newQuad\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newShader\" name=\"newShader\" assertions=\"3\" time=\"0.028\">\n\t\t</testcase>\n\t\t<testcase classname=\"newSpriteBatch\" name=\"newSpriteBatch\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newTextBatch\" name=\"newTextBatch\" assertions=\"3\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"newVideo\" name=\"newVideo\" assertions=\"3\" time=\"0.021\">\n\t\t</testcase>\n\t\t<testcase classname=\"newVolumeImage\" name=\"newVolumeImage\" assertions=\"3\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"origin\" name=\"origin\" assertions=\"169\" time=\"0.019\">\n\t\t</testcase>\n\t\t<testcase classname=\"points\" name=\"points\" assertions=\"169\" time=\"0.022\">\n\t\t</testcase>\n\t\t<testcase classname=\"polygon\" name=\"polygon\" assertions=\"169\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"pop\" name=\"pop\" assertions=\"169\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"print\" name=\"print\" assertions=\"169\" time=\"0.028\">\n\t\t</testcase>\n\t\t<testcase classname=\"printf\" name=\"printf\" assertions=\"841\" time=\"0.020\">\n\t\t</testcase>\n\t\t<testcase classname=\"push\" name=\"push\" assertions=\"169\" time=\"0.019\">\n\t\t</testcase>\n\t\t<testcase classname=\"rectangle\" name=\"rectangle\" assertions=\"338\" time=\"0.024\">\n\t\t</testcase>\n\t\t<testcase classname=\"replaceTransform\" name=\"replaceTransform\" assertions=\"169\" time=\"0.020\">\n\t\t</testcase>\n\t\t<testcase classname=\"reset\" name=\"reset\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"rotate\" name=\"rotate\" assertions=\"169\" time=\"0.035\">\n\t\t</testcase>\n\t\t<testcase classname=\"scale\" name=\"scale\" assertions=\"169\" time=\"0.019\">\n\t\t</testcase>\n\t\t<testcase classname=\"setBackgroundColor\" name=\"setBackgroundColor\" assertions=\"4\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"setBlendMode\" name=\"setBlendMode\" assertions=\"169\" time=\"0.038\">\n\t\t</testcase>\n\t\t<testcase classname=\"setCanvas\" name=\"setCanvas\" assertions=\"172\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"setColor\" name=\"setColor\" assertions=\"173\" time=\"0.020\">\n\t\t</testcase>\n\t\t<testcase classname=\"setColorMask\" name=\"setColorMask\" assertions=\"173\" time=\"0.028\">\n\t\t</testcase>\n\t\t<testcase classname=\"setDefaultFilter\" name=\"setDefaultFilter\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"setDepthMode\" name=\"setDepthMode\" assertions=\"8\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"setFont\" name=\"setFont\" assertions=\"169\" time=\"0.020\">\n\t\t</testcase>\n\t\t<testcase classname=\"setFrontFaceWinding\" name=\"setFrontFaceWinding\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"setLineJoin\" name=\"setLineJoin\" assertions=\"169\" time=\"0.033\">\n\t\t</testcase>\n\t\t<testcase classname=\"setLineStyle\" name=\"setLineStyle\" assertions=\"169\" time=\"0.019\">\n\t\t</testcase>\n\t\t<testcase classname=\"setLineWidth\" name=\"setLineWidth\" assertions=\"169\" time=\"0.019\">\n\t\t</testcase>\n\t\t<testcase classname=\"setMeshCullMode\" name=\"setMeshCullMode\" assertions=\"3\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"setScissor\" name=\"setScissor\" assertions=\"169\" time=\"0.019\">\n\t\t</testcase>\n\t\t<testcase classname=\"setShader\" name=\"setShader\" assertions=\"169\" time=\"0.031\">\n\t\t</testcase>\n\t\t<testcase classname=\"setStencilState\" name=\"setStencilState\" assertions=\"169\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"setWireframe\" name=\"setWireframe\" assertions=\"169\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"shear\" name=\"shear\" assertions=\"338\" time=\"0.020\">\n\t\t</testcase>\n\t\t<testcase classname=\"transformPoint\" name=\"transformPoint\" assertions=\"4\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"translate\" name=\"translate\" assertions=\"169\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"validateShader\" name=\"validateShader\" assertions=\"2\" time=\"0.026\">\n\t\t</testcase>\n\t</testsuite>\n\t<testsuite name=\"love.image\" tests=\"5\" failures=\"0\" skipped=\"0\" time=\"0.093\">\n\t\t<testcase classname=\"CompressedImageData\" name=\"CompressedImageData\" assertions=\"13\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"ImageData\" name=\"ImageData\" assertions=\"17\" time=\"0.026\">\n\t\t</testcase>\n\t\t<testcase classname=\"isCompressed\" name=\"isCompressed\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newCompressedData\" name=\"newCompressedData\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newImageData\" name=\"newImageData\" assertions=\"6\" time=\"0.017\">\n\t\t</testcase>\n\t</testsuite>\n\t<testsuite name=\"love.joystick\" tests=\"6\" failures=\"0\" skipped=\"0\" time=\"0.116\">\n\t\t<testcase classname=\"getGamepadMappingString\" name=\"getGamepadMappingString\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getJoystickCount\" name=\"getJoystickCount\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getJoysticks\" name=\"getJoysticks\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"loadGamepadMappings\" name=\"loadGamepadMappings\" assertions=\"1\" time=\"0.023\">\n\t\t</testcase>\n\t\t<testcase classname=\"saveGamepadMappings\" name=\"saveGamepadMappings\" assertions=\"1\" time=\"0.024\">\n\t\t</testcase>\n\t\t<testcase classname=\"setGamepadMapping\" name=\"setGamepadMapping\" assertions=\"24\" time=\"0.018\">\n\t\t</testcase>\n\t</testsuite>\n\t<testsuite name=\"love.keyboard\" tests=\"10\" failures=\"0\" skipped=\"0\" time=\"0.170\">\n\t\t<testcase classname=\"getKeyFromScancode\" name=\"getKeyFromScancode\" assertions=\"1\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"getScancodeFromKey\" name=\"getScancodeFromKey\" assertions=\"1\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"hasKeyRepeat\" name=\"hasKeyRepeat\" assertions=\"1\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"hasScreenKeyboard\" name=\"hasScreenKeyboard\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"hasTextInput\" name=\"hasTextInput\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"isDown\" name=\"isDown\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"isModifierActive\" name=\"isModifierActive\" assertions=\"4\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"isScancodeDown\" name=\"isScancodeDown\" assertions=\"1\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"setKeyRepeat\" name=\"setKeyRepeat\" assertions=\"1\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"setTextInput\" name=\"setTextInput\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t</testsuite>\n\t<testsuite name=\"love.love\" tests=\"6\" failures=\"0\" skipped=\"0\" time=\"0.100\">\n\t\t<testcase classname=\"errhand\" name=\"errhand\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getVersion\" name=\"getVersion\" assertions=\"4\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"hasDeprecationOutput\" name=\"hasDeprecationOutput\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"isVersionCompatible\" name=\"isVersionCompatible\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"run\" name=\"run\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"setDeprecationOutput\" name=\"setDeprecationOutput\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t</testsuite>\n\t<testsuite name=\"love.math\" tests=\"20\" failures=\"0\" skipped=\"0\" time=\"0.334\">\n\t\t<testcase classname=\"BezierCurve\" name=\"BezierCurve\" assertions=\"31\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"RandomGenerator\" name=\"RandomGenerator\" assertions=\"10\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"Transform\" name=\"Transform\" assertions=\"14\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"colorFromBytes\" name=\"colorFromBytes\" assertions=\"12\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"colorToBytes\" name=\"colorToBytes\" assertions=\"12\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"gammaToLinear\" name=\"gammaToLinear\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getRandomSeed\" name=\"getRandomSeed\" assertions=\"2\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"getRandomState\" name=\"getRandomState\" assertions=\"1\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"isConvex\" name=\"isConvex\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"linearToGamma\" name=\"linearToGamma\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newBezierCurve\" name=\"newBezierCurve\" assertions=\"3\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"newRandomGenerator\" name=\"newRandomGenerator\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newTransform\" name=\"newTransform\" assertions=\"3\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"perlinNoise\" name=\"perlinNoise\" assertions=\"4\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"random\" name=\"random\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"randomNormal\" name=\"randomNormal\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"setRandomSeed\" name=\"setRandomSeed\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"setRandomState\" name=\"setRandomState\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"simplexNoise\" name=\"simplexNoise\" assertions=\"4\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"triangulate\" name=\"triangulate\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t</testsuite>\n\t<testsuite name=\"love.mouse\" tests=\"17\" failures=\"1\" skipped=\"0\" time=\"0.301\">\n\t\t<testcase classname=\"getCursor\" name=\"getCursor\" assertions=\"4\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"getPosition\" name=\"getPosition\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getRelativeMode\" name=\"getRelativeMode\" assertions=\"2\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"getSystemCursor\" name=\"getSystemCursor\" assertions=\"4\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getX\" name=\"getX\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getY\" name=\"getY\" assertions=\"2\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"isCursorSupported\" name=\"isCursorSupported\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"isDown\" name=\"isDown\" assertions=\"1\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"isGrabbed\" name=\"isGrabbed\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"isVisible\" name=\"isVisible\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newCursor\" name=\"newCursor\" assertions=\"3\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"setCursor\" name=\"setCursor\" assertions=\"4\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"setGrabbed\" name=\"setGrabbed\" assertions=\"2\" time=\"0.016\">\n\t\t\t<failure message=\"assert 2 [check now grabbed] expected 'true' got 'false'\">assert 2 [check now grabbed] expected 'true' got 'false'</failure>\n\t\t</testcase>\n\t\t<testcase classname=\"setPosition\" name=\"setPosition\" assertions=\"4\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"setRelativeMode\" name=\"setRelativeMode\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"setVisible\" name=\"setVisible\" assertions=\"2\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"setX\" name=\"setX\" assertions=\"2\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"setY\" name=\"setY\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t</testsuite>\n\t<testsuite name=\"love.physics\" tests=\"26\" failures=\"0\" skipped=\"0\" time=\"0.435\">\n\t\t<testcase classname=\"Body\" name=\"Body\" assertions=\"90\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"Contact\" name=\"Contact\" assertions=\"23\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"Joint\" name=\"Joint\" assertions=\"19\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"Shape\" name=\"Shape\" assertions=\"55\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"World\" name=\"World\" assertions=\"37\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"getDistance\" name=\"getDistance\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getMeter\" name=\"getMeter\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newBody\" name=\"newBody\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newChainShape\" name=\"newChainShape\" assertions=\"3\" time=\"0.013\">\n\t\t</testcase>\n\t\t<testcase classname=\"newCircleShape\" name=\"newCircleShape\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newDistanceJoint\" name=\"newDistanceJoint\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newEdgeShape\" name=\"newEdgeShape\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newFrictionJoint\" name=\"newFrictionJoint\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newGearJoint\" name=\"newGearJoint\" assertions=\"3\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"newMotorJoint\" name=\"newMotorJoint\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newMouseJoint\" name=\"newMouseJoint\" assertions=\"3\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"newPolygonShape\" name=\"newPolygonShape\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newPrismaticJoint\" name=\"newPrismaticJoint\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newPulleyJoint\" name=\"newPulleyJoint\" assertions=\"3\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"newRectangleShape\" name=\"newRectangleShape\" assertions=\"6\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"newRevoluteJoint\" name=\"newRevoluteJoint\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newRopeJoint\" name=\"newRopeJoint\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newWeldJoint\" name=\"newWeldJoint\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newWheelJoint\" name=\"newWheelJoint\" assertions=\"3\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"newWorld\" name=\"newWorld\" assertions=\"3\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"setMeter\" name=\"setMeter\" assertions=\"2\" time=\"0.016\">\n\t\t</testcase>\n\t</testsuite>\n\t<testsuite name=\"love.sensor\" tests=\"1\" failures=\"0\" skipped=\"0\" time=\"0.017\">\n\t\t<testcase classname=\"hasSensor\" name=\"hasSensor\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t</testsuite>\n\t<testsuite name=\"love.sound\" tests=\"4\" failures=\"0\" skipped=\"0\" time=\"0.075\">\n\t\t<testcase classname=\"Decoder\" name=\"Decoder\" assertions=\"14\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"SoundData\" name=\"SoundData\" assertions=\"22\" time=\"0.022\">\n\t\t</testcase>\n\t\t<testcase classname=\"newDecoder\" name=\"newDecoder\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newSoundData\" name=\"newSoundData\" assertions=\"6\" time=\"0.019\">\n\t\t</testcase>\n\t</testsuite>\n\t<testsuite name=\"love.system\" tests=\"7\" failures=\"0\" skipped=\"2\" time=\"0.150\">\n\t\t<testcase classname=\"getClipboardText\" name=\"getClipboardText\" assertions=\"1\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"getOS\" name=\"getOS\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getPowerInfo\" name=\"getPowerInfo\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getPreferredLocales\" name=\"getPreferredLocales\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getProcessorCount\" name=\"getProcessorCount\" assertions=\"1\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"hasBackgroundMusic\" name=\"hasBackgroundMusic\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"openURL\" name=\"openURL\" assertions=\"0\" time=\"0.017\">\n\t\t\t<skipped message=\"cant test this worked\" />\n\t\t</testcase>\n\t\t<testcase classname=\"setClipboardText\" name=\"setClipboardText\" assertions=\"1\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"vibrate\" name=\"vibrate\" assertions=\"0\" time=\"0.016\">\n\t\t\t<skipped message=\"cant test this worked\" />\n\t\t</testcase>\n\t</testsuite>\n\t<testsuite name=\"love.thread\" tests=\"5\" failures=\"0\" skipped=\"0\" time=\"0.306\">\n\t\t<testcase classname=\"Channel\" name=\"Channel\" assertions=\"10\" time=\"0.231\">\n\t\t</testcase>\n\t\t<testcase classname=\"Thread\" name=\"Thread\" assertions=\"7\" time=\"0.024\">\n\t\t</testcase>\n\t\t<testcase classname=\"getChannel\" name=\"getChannel\" assertions=\"3\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"newChannel\" name=\"newChannel\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"newThread\" name=\"newThread\" assertions=\"3\" time=\"0.015\">\n\t\t</testcase>\n\t</testsuite>\n\t<testsuite name=\"love.timer\" tests=\"6\" failures=\"0\" skipped=\"0\" time=\"0.298\">\n\t\t<testcase classname=\"getAverageDelta\" name=\"getAverageDelta\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getDelta\" name=\"getDelta\" assertions=\"1\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"getFPS\" name=\"getFPS\" assertions=\"1\" time=\"0.015\">\n\t\t</testcase>\n\t\t<testcase classname=\"getTime\" name=\"getTime\" assertions=\"1\" time=\"0.118\">\n\t\t</testcase>\n\t\t<testcase classname=\"sleep\" name=\"sleep\" assertions=\"1\" time=\"0.117\">\n\t\t</testcase>\n\t\t<testcase classname=\"step\" name=\"step\" assertions=\"1\" time=\"0.016\">\n\t\t</testcase>\n\t</testsuite>\n\t<testsuite name=\"love.touch\" tests=\"3\" failures=\"0\" skipped=\"0\" time=\"0.051\">\n\t\t<testcase classname=\"getPosition\" name=\"getPosition\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getPressure\" name=\"getPressure\" assertions=\"2\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"getTouches\" name=\"getTouches\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t</testsuite>\n\t<testsuite name=\"love.video\" tests=\"2\" failures=\"0\" skipped=\"0\" time=\"0.038\">\n\t\t<testcase classname=\"VideoStream\" name=\"VideoStream\" assertions=\"9\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"newVideoStream\" name=\"newVideoStream\" assertions=\"3\" time=\"0.020\">\n\t\t</testcase>\n\t</testsuite>\n\t<testsuite name=\"love.window\" tests=\"34\" failures=\"0\" skipped=\"2\" time=\"6.275\">\n\t\t<testcase classname=\"focus\" name=\"focus\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"fromPixels\" name=\"fromPixels\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getDPIScale\" name=\"getDPIScale\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getDesktopDimensions\" name=\"getDesktopDimensions\" assertions=\"2\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"getDisplayCount\" name=\"getDisplayCount\" assertions=\"1\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"getDisplayName\" name=\"getDisplayName\" assertions=\"1\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"getDisplayOrientation\" name=\"getDisplayOrientation\" assertions=\"1\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"getFullscreen\" name=\"getFullscreen\" assertions=\"2\" time=\"1.351\">\n\t\t</testcase>\n\t\t<testcase classname=\"getFullscreenModes\" name=\"getFullscreenModes\" assertions=\"1\" time=\"0.013\">\n\t\t</testcase>\n\t\t<testcase classname=\"getIcon\" name=\"getIcon\" assertions=\"2\" time=\"0.019\">\n\t\t</testcase>\n\t\t<testcase classname=\"getMode\" name=\"getMode\" assertions=\"3\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getPosition\" name=\"getPosition\" assertions=\"2\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getSafeArea\" name=\"getSafeArea\" assertions=\"4\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"getTitle\" name=\"getTitle\" assertions=\"1\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"getVSync\" name=\"getVSync\" assertions=\"1\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"hasFocus\" name=\"hasFocus\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"hasMouseFocus\" name=\"hasMouseFocus\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"isDisplaySleepEnabled\" name=\"isDisplaySleepEnabled\" assertions=\"3\" time=\"0.016\">\n\t\t</testcase>\n\t\t<testcase classname=\"isMaximized\" name=\"isMaximized\" assertions=\"2\" time=\"0.186\">\n\t\t</testcase>\n\t\t<testcase classname=\"isMinimized\" name=\"isMinimized\" assertions=\"2\" time=\"0.816\">\n\t\t</testcase>\n\t\t<testcase classname=\"isOpen\" name=\"isOpen\" assertions=\"1\" time=\"0.014\">\n\t\t</testcase>\n\t\t<testcase classname=\"isVisible\" name=\"isVisible\" assertions=\"1\" time=\"0.017\">\n\t\t</testcase>\n\t\t<testcase classname=\"maximize\" name=\"maximize\" assertions=\"2\" time=\"0.186\">\n\t\t</testcase>\n\t\t<testcase classname=\"minimize\" name=\"minimize\" assertions=\"2\" time=\"0.807\">\n\t\t</testcase>\n\t\t<testcase classname=\"requestAttention\" name=\"requestAttention\" assertions=\"0\" time=\"0.016\">\n\t\t\t<skipped message=\"cant test this worked\" />\n\t\t</testcase>\n\t\t<testcase classname=\"restore\" name=\"restore\" assertions=\"1\" time=\"0.966\">\n\t\t</testcase>\n\t\t<testcase classname=\"setDisplaySleepEnabled\" name=\"setDisplaySleepEnabled\" assertions=\"2\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"setFullscreen\" name=\"setFullscreen\" assertions=\"2\" time=\"1.356\">\n\t\t</testcase>\n\t\t<testcase classname=\"setIcon\" name=\"setIcon\" assertions=\"1\" time=\"0.015\">\n\t\t</testcase>\n\t\t<testcase classname=\"setMode\" name=\"setMode\" assertions=\"4\" time=\"0.020\">\n\t\t</testcase>\n\t\t<testcase classname=\"setPosition\" name=\"setPosition\" assertions=\"2\" time=\"0.183\">\n\t\t</testcase>\n\t\t<testcase classname=\"setTitle\" name=\"setTitle\" assertions=\"1\" time=\"0.018\">\n\t\t</testcase>\n\t\t<testcase classname=\"setVSync\" name=\"setVSync\" assertions=\"1\" time=\"0.015\">\n\t\t</testcase>\n\t\t<testcase classname=\"showMessageBox\" name=\"showMessageBox\" assertions=\"0\" time=\"0.002\">\n\t\t\t<skipped message=\"cant test this worked\" />\n\t\t</testcase>\n\t\t<testcase classname=\"toPixels\" name=\"toPixels\" assertions=\"1\" time=\"0.002\">\n\t\t</testcase>\n\t\t<testcase classname=\"updateMode\" name=\"updateMode\" assertions=\"4\" time=\"0.010\">\n\t\t</testcase>\n\t</testsuite>\n</testsuites>"
  },
  {
    "path": "testing/main.lua",
    "content": "-- load test objs\r\nrequire('classes.TestSuite')\r\nrequire('classes.TestModule')\r\nrequire('classes.TestMethod')\r\n\r\n-- create testsuite obj\r\nlove.test = TestSuite:new()\r\n\r\n-- load test scripts if module is active\r\n-- this is so in future if we have per-module disabling it'll still run\r\nif love ~= nil then require('tests.love') end\r\nif love.audio ~= nil then require('tests.audio') end\r\nif love.data ~= nil then require('tests.data') end\r\nif love.event ~= nil then require('tests.event') end\r\nif love.filesystem ~= nil then require('tests.filesystem') end\r\nif love.font ~= nil then require('tests.font') end\r\nif love.graphics ~= nil then require('tests.graphics') end\r\nif love.image ~= nil then require('tests.image') end\r\nif love.joystick ~= nil then require('tests.joystick') end\r\nif love.keyboard ~= nil then require('tests.keyboard') end\r\nif love.math ~= nil then require('tests.math') end\r\nif love.mouse ~= nil then require('tests.mouse') end\r\nif love.physics ~= nil then require('tests.physics') end\r\nif love.sensor ~= nil then require('tests.sensor') end\r\nif love.sound ~= nil then require('tests.sound') end\r\nif love.system ~= nil then require('tests.system') end\r\nif love.thread ~= nil then require('tests.thread') end\r\nif love.timer ~= nil then require('tests.timer') end\r\nif love.touch ~= nil then require('tests.touch') end\r\nif love.video ~= nil then require('tests.video') end\r\nif love.window ~= nil then require('tests.window') end\r\n\r\n-- love.load\r\n-- load given arguments and run the test suite\r\nlove.load = function(args)\r\n\r\n  -- setup basic img to display\r\n  if love.window ~= nil then\r\n    love.window.updateMode(360, 240, {\r\n      fullscreen = false,\r\n      resizable = true,\r\n      centered = true\r\n    })\r\n\r\n    -- set up some graphics to draw if enabled\r\n    if love.graphics ~= nil then\r\n      love.graphics.setDefaultFilter(\"nearest\", \"nearest\")\r\n      love.graphics.setLineStyle('rough')\r\n      love.graphics.setLineWidth(1)\r\n      Logo = {\r\n        texture = love.graphics.newImage('resources/love.png'),\r\n        img = nil\r\n      }\r\n      Logo.img = love.graphics.newQuad(0, 0, 64, 64, Logo.texture)\r\n      Font = love.graphics.newFont('resources/font.ttf', 8, 'normal')\r\n      TextCommand = 'Loading...'\r\n      TextRun = ''\r\n    end\r\n\r\n  end\r\n\r\n  -- mount for output later\r\n  if love.filesystem.mountFullPath then\r\n    love.filesystem.mountFullPath(love.filesystem.getSource() .. \"/output\", \"tempoutput\", \"readwrite\")\r\n  end\r\n\r\n  -- get all args with any comma lists split out as seperate\r\n  local arglist = {}\r\n  for a=1,#args do\r\n    local splits = UtilStringSplit(args[a], '([^,]+)')\r\n    for s=1,#splits do\r\n      table.insert(arglist, splits[s])\r\n    end\r\n  end\r\n\r\n  -- convert args to the cmd to run, modules, method (if any) and disabled\r\n  local testcmd = '--all'\r\n  local module = ''\r\n  local method = ''\r\n  local cmderr = 'Invalid flag used'\r\n  local modules = {\r\n    'audio', 'data', 'event', 'filesystem', 'font', 'graphics', 'image',\r\n    'joystick', 'keyboard', 'love', 'math', 'mouse', 'physics', 'sensor',\r\n    'sound', 'system', 'thread', 'timer', 'touch', 'video', 'window'\r\n  }\r\n  GITHUB_RUNNER = false\r\n  for a=1,#arglist do\r\n    if testcmd == '--method' then\r\n      if module == '' and (arglist[a] == 'love' or love[ arglist[a] ] ~= nil) then \r\n        module = arglist[a] \r\n        table.insert(modules, module)\r\n      elseif module ~= '' and love[module] ~= nil and method == '' then\r\n        if love.test[module][arglist[a]] ~= nil then method = arglist[a] end\r\n      end\r\n    end\r\n    if testcmd == '--modules' then\r\n      if (arglist[a] == 'love' or love[ arglist[a] ] ~= nil) and arglist[a] ~= '--isRunner' then \r\n        table.insert(modules, arglist[a]) \r\n      end\r\n    end\r\n    if arglist[a] == '--method' then\r\n      testcmd = arglist[a]\r\n      modules = {}\r\n    end\r\n    if arglist[a] == '--modules' then\r\n      testcmd = arglist[a]\r\n      modules = {}\r\n    end\r\n    if arglist[a] == '--isRunner' then\r\n      GITHUB_RUNNER = true\r\n    end\r\n  end\r\n\r\n  -- method uses the module + method given\r\n  if testcmd == '--method' then\r\n    local testmodule = TestModule:new(module, method)\r\n    table.insert(love.test.modules, testmodule)\r\n    if module ~= '' and method ~= '' then\r\n      love.test.module = testmodule\r\n      love.test.module:log('grey', '--method \"' .. module .. '\" \"' .. method .. '\"')\r\n      love.test.output = 'lovetest_method_' .. module .. '_' .. method\r\n    else\r\n      if method == '' then cmderr = 'No valid method specified' end\r\n      if module == '' then cmderr = 'No valid module specified' end\r\n    end\r\n  end\r\n\r\n  -- modules runs all methods for all the modules given\r\n  if testcmd == '--modules' then\r\n    local modulelist = {}\r\n    for m=1,#modules do\r\n      local testmodule = TestModule:new(modules[m])\r\n      table.insert(love.test.modules, testmodule)\r\n      table.insert(modulelist, modules[m])\r\n    end\r\n    if #modulelist > 0 then\r\n      love.test.module = love.test.modules[1]\r\n      love.test.module:log('grey', '--modules \"' .. table.concat(modulelist, '\" \"') .. '\"')\r\n      love.test.output = 'lovetest_modules_' .. table.concat(modulelist, '_')\r\n    else\r\n      cmderr = 'No modules specified'\r\n    end\r\n  end\r\n\r\n  -- otherwise default runs all methods for all modules\r\n  if arglist[1] == nil or arglist[1] == '' or arglist[1] == '--all' then\r\n    for m=1,#modules do\r\n      local testmodule = TestModule:new(modules[m])\r\n      table.insert(love.test.modules, testmodule)\r\n    end\r\n    love.test.module = love.test.modules[1]\r\n    love.test.module:log('grey', '--all')\r\n    love.test.output = 'lovetest_all'\r\n  end\r\n\r\n  if GITHUB_RUNNER then\r\n    love.test.module:log('grey', '--isRunner')\r\n  end\r\n\r\n  -- invalid command\r\n  if love.test.module == nil then\r\n    print(cmderr)\r\n    love.event.quit(0)\r\n  else \r\n    -- start first module\r\n    TextCommand = testcmd\r\n    love.test.module:runTests()\r\n  end\r\n\r\nend\r\n\r\n-- love.update\r\n-- run test suite logic \r\nlove.update = function(delta)\r\n  love.test:runSuite(delta)\r\nend\r\n\r\n\r\n-- love.draw\r\n-- draw a little logo to the screen\r\nlove.draw = function()\r\n  local lw = (love.graphics.getWidth() - 128) / 2\r\n  local lh = (love.graphics.getHeight() - 128) / 2\r\n  love.graphics.draw(Logo.texture, Logo.img, lw, lh, 0, 2, 2)\r\n  love.graphics.setFont(Font)\r\n  love.graphics.print(TextCommand, 4, 12, 0, 2, 2)\r\n  love.graphics.print(TextRun, 4, 32, 0, 2, 2)\r\nend\r\n\r\n\r\n-- love.quit\r\n-- add a hook to allow test modules to fake quit\r\nlove.quit = function()\r\n  if love.test.module ~= nil and love.test.module.fakequit then\r\n    return true\r\n  else\r\n    return false\r\n  end\r\nend\r\n\r\n\r\n-- added so bad threads dont fail\r\nfunction love.threaderror(thread, errorstr) end\r\n\r\n\r\n-- string split helper\r\nfunction UtilStringSplit(str, splitter)\r\n  local splits = {}\r\n  for word in string.gmatch(str, splitter) do\r\n    table.insert(splits, word)\r\n  end\r\n  return splits\r\nend\r\n\r\n\r\n-- string time formatter\r\nfunction UtilTimeFormat(seconds)\r\n  return string.format(\"%.3f\", tostring(seconds))\r\nend\r\n"
  },
  {
    "path": "testing/output/actual/notes.txt",
    "content": "# Actual Graphics Output\nThe images generated by the tests"
  },
  {
    "path": "testing/output/difference/notes.txt",
    "content": "# Graphic Differences\nIf a graphics test fails then a \"difference\" image will be created to highlight \nthe differences between the actual + expected image, for use in the HTML report"
  },
  {
    "path": "testing/output/expected/notes.txt",
    "content": "# Expected Graphics Output\nThe images expected by the tests"
  },
  {
    "path": "testing/output/notes.txt",
    "content": "# Testing Output\nAny tests run will output an XML, MD, and HTML file here, assuming the tests are run with readwrite permissions for this repo"
  },
  {
    "path": "testing/readme.md",
    "content": "# Lövetest\r\nTest suite for the [Löve](https://github.com/love2d/love) APIs, based off of [this issue](https://github.com/love2d/love/issues/1745).\r\n\r\nCurrently written for [Löve 12](https://github.com/love2d/love/tree/12.0-development), which is still in development. As such the test suite may fail if you try to run it with an older version of Löve due to it trying to call methods that don't exist.\r\n\r\nWhile the test suite is part of the main Löve repo, the test suite has it's own repo [here](https://github.com/ellraiser/love-test) so that it can be used with other builds like [love-potion](https://github.com/lovebrew/lovepotion). If you would like to contribute to the test suite please raise a PR on the [love-test](https://github.com/ellraiser/love-test) repo.\r\n\r\n---\r\n\r\n## Features\r\n- [x] Simple pass/fail tests written in Lua with minimal setup \r\n- [x] Ability to run all tests with a simple command\r\n- [x] Ability to see how many tests are passing/failing\r\n- [x] Ability to run a subset of tests\r\n- [x] Ability to easily run an individual test\r\n- [x] Ability to see all visual results at a glance\r\n- [x] Compare graphics test output with an expected output\r\n- [x] Automatic testing that happens after every commit\r\n- [x] No platform-specific dependencies / scripts\r\n\r\n---\r\n\r\n## Coverage\r\nThis is the status of all module tests.  \r\nSee the **Todo** section for outstanding tasks if you want to contribute!\r\n| Module            | Done | Skip | Modules          | Done | Skip |\r\n| ----------------- | ---- | ---- | ---------------- | ---- | ---- |\r\n| 🟢 audio          |   31 |   0  | 🟢 mouse          |   18 |   0  |\r\n| 🟢 data           |   12 |   0  | 🟢 physics        |   26 |   0  |\r\n| 🟢 event          |    4 |   2  | 🟢 sensor         |    1 |   0  |\r\n| 🟢 filesystem     |   33 |   2  | 🟢 sound          |    4 |   0  |\r\n| 🟢 font           |    7 |   0  | 🟢 system         |    7 |   2  |\r\n| 🟢 graphics       |  105 |   1  | 🟢 thread         |    5 |   0  |\r\n| 🟢 image          |    5 |   0  | 🟢 timer          |    6 |   0  |\r\n| 🟢 joystick       |    6 |   0  | 🟢 touch          |    3 |   0  |\r\n| 🟢 keyboard       |   10 |   0  | 🟢 video          |    2 |   0  |\r\n| 🟢 love           |    6 |   0  | 🟢 window         |   34 |   2  |\r\n| 🟢 math           |   20 |   0  | \r\n\r\n> The following modules are covered but at a basic level as we can't emulate hardware input nicely for all platforms + virtual runners:  \r\n> `joystick`, `keyboard`, `mouse`, `sensor` and `touch`\r\n\r\n---\r\n\r\n## Running Tests\r\nThe testsuite aims to keep things as simple as possible, and just runs all the tests inside Löve to match how they'd be used by developers in-engine.\r\nTo run the tests, download the repo and then run the main.lua as you would a Löve game, i.e:\r\n\r\nWINDOWS: `& 'c:\\Program Files\\LOVE\\love.exe' PATH_TO_TESTING_FOLDER/main.lua --console`  \r\nMACOS: `/Applications/love.app/Contents/MacOS/love PATH_TO_TESTING_FOLDER/main.lua`  \r\nLINUX: `./love.AppImage PATH_TO_TESTING_FOLDER/main.lua`\r\n\r\nBy default all tests will be run for all modules.  \r\nIf you want to specify a module/s you can use:  \r\n`--modules filesystem,audio`  \r\nIf you want to specify only 1 specific method only you can use:  \r\n`--method filesystem write`\r\n\r\nAll results will be printed in the console per method as PASS, FAIL, or SKIP with total assertions met on a module level and overall level.  \r\n\r\nWhen finished, the following files will be generated in the `/output` directory with a summary of the test results:\r\n- an `XML` file in the style of [JUnit XML](https://www.ibm.com/docs/en/developer-for-zos/14.1?topic=formats-junit-xml-format)\r\n- a `HTML` file that shows the report + any visual test results\r\n- a `Markdown` file you can use with [this github action](https://github.com/ellraiser/love-test-report)\r\n> An example of all types of output can be found in the `/examples`  \r\n> The visual results of any graphic tests can be found in `/output/actual`\r\n\r\n---\r\n\r\n## Architecture\r\nEach method and object has it's own test method written in `/tests` under the matching module name.\r\n\r\nWhen you run the tests, a single TestSuite object is created which handles the progress + totals for all the tests.  \r\nEach module has a TestModule object created, and each test method has a TestMethod object created which keeps track of assertions for that method. You can currently do the following assertions:\r\n- **assertNotNil**(value)\r\n- **assertEquals**(expected, actual, label)\r\n- **assertTrue**(value, label)\r\n- **assertFalse**(value, label)\r\n- **assertNotEquals**(expected, actual, label)\r\n- **assertRange**(actual, min, max, label)\r\n- **assertMatch**({option1, option2, option3 ...}, actual, label) \r\n- **assertGreaterEqual**(expected, actual, label)\r\n- **assertLessEqual**(expected, actual, label)\r\n- **assertObject**(table)\r\n- **assertCoords**(expected, actual, label)\r\n\r\nExample test method:\r\n```lua\r\n-- love.filesystem.read test method\r\n-- all methods should be put under love.test.MODULE.METHOD, matching the API\r\nlove.test.filesystem.read = function(test)\r\n  -- setup any data needed then run any asserts using the passed test object\r\n  local content, size = love.filesystem.read('resources/test.txt')\r\n  test:assertNotNil(content)\r\n  test:assertEquals('helloworld', content, 'check content match')\r\n  test:assertEquals(10, size, 'check size match')\r\n  content, size = love.filesystem.read('resources/test.txt', 5)\r\n  test:assertNotNil(content)\r\n  test:assertEquals('hello', content, 'check content match')\r\n  test:assertEquals(5, size, 'check size match')\r\n  -- no need to return anything or cleanup, GCC is called after each method\r\nend\r\n```\r\n\r\nEach test is run inside it's own coroutine - you can use `test:waitFrames(frames)` or `test:waitSeconds(seconds)` to pause the test for a small period if you need to check things that won't happen for a few frames/seconds.\r\n\r\nAfter each test method is ran, the assertions are totalled up, printed, and we move onto the next method! Once all methods in the suite are run a total pass/fail/skip is given for that module and we move onto the next module (if any)\r\n\r\nFor sanity-checking, if it's currently not covered or it's not possible to test the method we can set the test to be skipped with `test:skipTest(reason)` - this way we still see the method listed in the test output without it affected the pass/fail totals\r\n\r\n---\r\n\r\n## Todo\r\nIf you would like to contribute to the test suite please raise a PR with the main [love-test](https://github.com/ellraiser/love-test) repo.\r\n\r\nThere is a list of outstanding methods that require test coverage in `todo.md`, expanding on any existing tests is also very welcome!\r\n\r\n---\r\n\r\n## Graphics Tolerance\r\nBy default all graphic tests are run with pixel precision and 0 rgba tolerance.  \r\n\r\nHowever there are a couple of methods that on some platforms require some slight tolerance to allow for tiny differences in rendering.\r\n| Test                        |    OS     |      Exception      | Reason |\r\n| --------------------------  | --------- | ------------------- | ------ |\r\n| love.graphics.drawInstanced |  Windows  |   1rgba tolerance   | On Windows there's a couple pixels a tiny bit off, most likely due to complexity of the mesh drawn |\r\n| love.graphics.setBlendMode  |  Win/Lin  |   1rgba tolerance   | Blendmodes have some small varience on some machines |\r\n\r\n---\r\n\r\n## Runner Exceptions\r\nThe automated tests through Github work for the most part however there are a few exceptions that have to be accounted for due to limitations of the VMs and the graphics emulation used.  \r\n\r\nThese exceptions are either skipped, or handled by using a 1px or 1/255rgba tolerance - when run locally on real hardware, these tests pass fine at the default 0 tolerance.  \r\nYou can specify the test suite is being run on a runner by adding the `--isRunner` flag in your workflow file, i.e.:  \r\n`& 'c:\\Program Files\\LOVE\\love.exe' PATH_TO_TESTING_FOLDER/main.lua --console --all --isRunner`\r\n| Test                       |    OS     |      Exception      | Reason |\r\n| -------------------------- | --------- | ------------------- | ------ |\r\n| love.graphics.setWireframe |   MacOS   |    1px tolerance    | Wireframes are offset by 1,1 when drawn |\r\n| love.graphica.arc          |   MacOS   |       Skipped       | Arc curves are drawn slightly off at really low scale  |\r\n| love.graphics.setLineStyle |   Linux   |   1rgba tolerance   | 'Rough' lines blend differently with the background rgba |\r\n| love.audio.RecordingDevice |    All    |       Skipped       | Recording devices can't be emulated on runners |\r\n"
  },
  {
    "path": "testing/resources/alsoft.conf",
    "content": "# OpenAL config file.\n#\n# Option blocks may appear multiple times, and duplicated options will take the\n# last value specified. Environment variables may be specified within option\n# values, and are automatically substituted when the config file is loaded.\n# Environment variable names may only contain alpha-numeric characters (a-z,\n# A-Z, 0-9) and underscores (_), and are prefixed with $. For example,\n# specifying \"$HOME/file.ext\" would typically result in something like\n# \"/home/user/file.ext\". To specify an actual \"$\" character, use \"$$\".\n#\n# Device-specific values may be specified by including the device name in the\n# block name, with \"general\" replaced by the device name. That is, general\n# options for the device \"Name of Device\" would be in the [Name of Device]\n# block, while ALSA options would be in the [alsa/Name of Device] block.\n# Options marked as \"(global)\" are not influenced by the device.\n#\n# The system-wide settings can be put in /etc/openal/alsoft.conf and user-\n# specific override settings in $HOME/.alsoftrc.\n# For Windows, these settings should go into $AppData\\alsoft.ini\n#\n# Option and block names are case-senstive. The supplied values are only hints\n# and may not be honored (though generally it'll try to get as close as\n# possible). Note: options that are left unset may default to app- or system-\n# specified values. These are the current available settings:\n\n##\n## General stuff\n##\n[general]\n\n## disable-cpu-exts: (global)\n#  Disables use of specialized methods that use specific CPU intrinsics.\n#  Certain methods may utilize CPU extensions for improved performance, and\n#  this option is useful for preventing some or all of those methods from being\n#  used. The available extensions are: sse, sse2, sse3, sse4.1, and neon.\n#  Specifying 'all' disables use of all such specialized methods.\n#disable-cpu-exts =\n\n## drivers: (global)\n#  Sets the backend driver list order, comma-seperated. Unknown backends and\n#  duplicated names are ignored. Unlisted backends won't be considered for use\n#  unless the list is ended with a comma (e.g. 'oss,' will try OSS first before\n#  other backends, while 'oss' will try OSS only). Backends prepended with -\n#  won't be considered for use (e.g. '-oss,' will try all available backends\n#  except OSS). An empty list means to try all backends.\ndrivers = wave\n\n## channels:\n#  Sets the output channel configuration. If left unspecified, one will try to\n#  be detected from the system, and defaulting to stereo. The available values\n#  are: mono, stereo, quad, surround51, surround51rear, surround61, surround71,\n#  ambi1, ambi2, ambi3. Note that the ambi* configurations provide ambisonic\n#  channels of the given order (using ACN ordering and SN3D normalization by\n#  default), which need to be decoded to play correctly on speakers.\n#channels =\n\n## sample-type:\n#  Sets the output sample type. Currently, all mixing is done with 32-bit float\n#  and converted to the output sample type as needed. Available values are:\n#  int8    - signed 8-bit int\n#  uint8   - unsigned 8-bit int\n#  int16   - signed 16-bit int\n#  uint16  - unsigned 16-bit int\n#  int32   - signed 32-bit int\n#  uint32  - unsigned 32-bit int\n#  float32 - 32-bit float\n#sample-type = float32\n\n## frequency:\n#  Sets the output frequency. If left unspecified it will try to detect a\n#  default from the system, otherwise it will default to 44100.\n#frequency =\n\n## period_size:\n#  Sets the update period size, in frames. This is the number of frames needed\n#  for each mixing update. Acceptable values range between 64 and 8192.\n#period_size = 1024\n\n## periods:\n#  Sets the number of update periods. Higher values create a larger mix ahead,\n#  which helps protect against skips when the CPU is under load, but increases\n#  the delay between a sound getting mixed and being heard. Acceptable values\n#  range between 2 and 16.\n#periods = 3\n\n## stereo-mode:\n#  Specifies if stereo output is treated as being headphones or speakers. With\n#  headphones, HRTF or crossfeed filters may be used for better audio quality.\n#  Valid settings are auto, speakers, and headphones.\n#stereo-mode = auto\n\n## stereo-encoding:\n#  Specifies the encoding method for non-HRTF stereo output. 'panpot' (default)\n#  uses standard amplitude panning (aka pair-wise, stereo pair, etc) between\n#  -30 and +30 degrees, while 'uhj' creates stereo-compatible two-channel UHJ\n#  output, which encodes some surround sound information into stereo output\n#  that can be decoded with a surround sound receiver. If crossfeed filters are\n#  used, UHJ is disabled.\n#stereo-encoding = panpot\n\n## ambi-format:\n#  Specifies the channel order and normalization for the \"ambi*\" set of channel\n#  configurations. Valid settings are: fuma, acn+sn3d, acn+n3d\n#ambi-format = acn+sn3d\n\n## hrtf:\n#  Controls HRTF processing. These filters provide better spatialization of\n#  sounds while using headphones, but do require a bit more CPU power. The\n#  default filters will only work with 44100hz or 48000hz stereo output. While\n#  HRTF is used, the cf_level option is ignored. Setting this to auto (default)\n#  will allow HRTF to be used when headphones are detected or the app requests\n#  it, while setting true or false will forcefully enable or disable HRTF\n#  respectively.\n#hrtf = auto\n\n## default-hrtf:\n#  Specifies the default HRTF to use. When multiple HRTFs are available, this\n#  determines the preferred one to use if none are specifically requested. Note\n#  that this is the enumerated HRTF name, not necessarily the filename.\n#default-hrtf =\n\n## hrtf-paths:\n#  Specifies a comma-separated list of paths containing HRTF data sets. The\n#  format of the files are described in docs/hrtf.txt. The files within the\n#  directories must have the .mhr file extension to be recognized. By default,\n#  OS-dependent data paths will be used. They will also be used if the list\n#  ends with a comma. On Windows this is:\n#  $AppData\\openal\\hrtf\n#  And on other systems, it's (in order):\n#  $XDG_DATA_HOME/openal/hrtf  (defaults to $HOME/.local/share/openal/hrtf)\n#  $XDG_DATA_DIRS/openal/hrtf  (defaults to /usr/local/share/openal/hrtf and\n#                               /usr/share/openal/hrtf)\n#hrtf-paths =\n\n## cf_level:\n#  Sets the crossfeed level for stereo output. Valid values are:\n#  0 - No crossfeed\n#  1 - Low crossfeed\n#  2 - Middle crossfeed\n#  3 - High crossfeed (virtual speakers are closer to itself)\n#  4 - Low easy crossfeed\n#  5 - Middle easy crossfeed\n#  6 - High easy crossfeed\n#  Users of headphones may want to try various settings. Has no effect on non-\n#  stereo modes.\n#cf_level = 0\n\n## resampler: (global)\n#  Selects the resampler used when mixing sources. Valid values are:\n#  point - nearest sample, no interpolation\n#  linear - extrapolates samples using a linear slope between samples\n#  cubic - extrapolates samples using a Catmull-Rom spline\n#  bsinc12 - extrapolates samples using a band-limited Sinc filter (varying\n#            between 12 and 24 points, with anti-aliasing)\n#  bsinc24 - extrapolates samples using a band-limited Sinc filter (varying\n#            between 24 and 48 points, with anti-aliasing)\n#resampler = linear\n\n## rt-prio: (global)\n#  Sets real-time priority for the mixing thread. Not all drivers may use this\n#  (eg. PortAudio) as they already control the priority of the mixing thread.\n#  0 and negative values will disable it. Note that this may constitute a\n#  security risk since a real-time priority thread can indefinitely block\n#  normal-priority threads if it fails to wait. As such, the default is\n#  disabled.\n#rt-prio = 0\n\n## sources:\n#  Sets the maximum number of allocatable sources. Lower values may help for\n#  systems with apps that try to play more sounds than the CPU can handle.\n#sources = 256\n\n## slots:\n#  Sets the maximum number of Auxiliary Effect Slots an app can create. A slot\n#  can use a non-negligible amount of CPU time if an effect is set on it even\n#  if no sources are feeding it, so this may help when apps use more than the\n#  system can handle.\n#slots = 64\n\n## sends:\n#  Limits the number of auxiliary sends allowed per source. Setting this higher\n#  than the default has no effect.\n#sends = 16\n\n## front-stablizer:\n#  Applies filters to \"stablize\" front sound imaging. A psychoacoustic method\n#  is used to generate a front-center channel signal from the front-left and\n#  front-right channels, improving the front response by reducing the combing\n#  artifacts and phase errors. Consequently, it will only work with channel\n#  configurations that include front-left, front-right, and front-center.\n#front-stablizer = false\n\n## output-limiter:\n#  Applies a gain limiter on the final mixed output. This reduces the volume\n#  when the output samples would otherwise clamp, avoiding excessive clipping\n#  noise.\n#output-limiter = true\n\n## dither:\n#  Applies dithering on the final mix, for 8- and 16-bit output by default.\n#  This replaces the distortion created by nearest-value quantization with low-\n#  level whitenoise.\n#dither = true\n\n## dither-depth:\n#  Quantization bit-depth for dithered output. A value of 0 (or less) will\n#  match the output sample depth. For int32, uint32, and float32 output, 0 will\n#  disable dithering because they're at or beyond the rendered precision. The\n#  maximum dither depth is 24.\n#dither-depth = 0\n\n## volume-adjust:\n#  A global volume adjustment for source output, expressed in decibels. The\n#  value is logarithmic, so +6 will be a scale of (approximately) 2x, +12 will\n#  be a scale of 4x, etc. Similarly, -6 will be x1/2, and -12 is about x1/4. A\n#  value of 0 means no change.\n#volume-adjust = 0\n\n## excludefx: (global)\n#  Sets which effects to exclude, preventing apps from using them. This can\n#  help for apps that try to use effects which are too CPU intensive for the\n#  system to handle. Available effects are: eaxreverb,reverb,autowah,chorus,\n#  compressor,distortion,echo,equalizer,flanger,modulator,dedicated,pshifter,\n#  fshifter\n#excludefx =\n\n## default-reverb: (global)\n#  A reverb preset that applies by default to all sources on send 0\n#  (applications that set their own slots on send 0 will override this).\n#  Available presets are: None, Generic, PaddedCell, Room, Bathroom,\n#  Livingroom, Stoneroom, Auditorium, ConcertHall, Cave, Arena, Hangar,\n#  CarpetedHallway, Hallway, StoneCorridor, Alley, Forest, City, Moutains,\n#  Quarry, Plain, ParkingLot, SewerPipe, Underwater, Drugged, Dizzy, Psychotic.\n#default-reverb =\n\n## trap-alc-error: (global)\n#  Generates a SIGTRAP signal when an ALC device error is generated, on systems\n#  that support it. This helps when debugging, while trying to find the cause\n#  of a device error. On Windows, a breakpoint exception is generated.\n#trap-alc-error = false\n\n## trap-al-error: (global)\n#  Generates a SIGTRAP signal when an AL context error is generated, on systems\n#  that support it. This helps when debugging, while trying to find the cause\n#  of a context error. On Windows, a breakpoint exception is generated.\n#trap-al-error = false\n\n##\n## Ambisonic decoder stuff\n##\n[decoder]\n\n## hq-mode:\n#  Enables a high-quality ambisonic decoder. This mode is capable of frequency-\n#  dependent processing, creating a better reproduction of 3D sound rendering\n#  over surround sound speakers. Enabling this also requires specifying decoder\n#  configuration files for the appropriate speaker configuration you intend to\n#  use (see the quad, surround51, etc options below). Currently, up to third-\n#  order decoding is supported.\nhq-mode = false\n\n## distance-comp:\n#  Enables compensation for the speakers' relative distances to the listener.\n#  This applies the necessary delays and attenuation to make the speakers\n#  behave as though they are all equidistant, which is important for proper\n#  playback of 3D sound rendering. Requires the proper distances to be\n#  specified in the decoder configuration file.\ndistance-comp = true\n\n## nfc:\n#  Enables near-field control filters. This simulates and compensates for low-\n#  frequency effects caused by the curvature of nearby sound-waves, which\n#  creates a more realistic perception of sound distance. Note that the effect\n#  may be stronger or weaker than intended if the application doesn't use or\n#  specify an appropriate unit scale, or if incorrect speaker distances are set\n#  in the decoder configuration file. Requires hq-mode to be enabled.\nnfc = true\n\n## nfc-ref-delay\n#  Specifies the reference delay value for ambisonic output. When channels is\n#  set to one of the ambi* formats, this option enables NFC-HOA output with the\n#  specified Reference Delay parameter. The specified value can then be shared\n#  with an appropriate NFC-HOA decoder to reproduce correct near-field effects.\n#  Keep in mind that despite being designed for higher-order ambisonics, this\n#  applies to first-order output all the same. When left unset, normal output\n#  is created with no near-field simulation.\nnfc-ref-delay =\n\n## quad:\n#  Decoder configuration file for Quadraphonic channel output. See\n#  docs/ambdec.txt for a description of the file format.\nquad =\n\n## surround51:\n#  Decoder configuration file for 5.1 Surround (Side and Rear) channel output.\n#  See docs/ambdec.txt for a description of the file format.\nsurround51 =\n\n## surround61:\n#  Decoder configuration file for 6.1 Surround channel output. See\n#  docs/ambdec.txt for a description of the file format.\nsurround61 =\n\n## surround71:\n#  Decoder configuration file for 7.1 Surround channel output. See\n#  docs/ambdec.txt for a description of the file format. Note: This can be used\n#  to enable 3D7.1 with the appropriate configuration and speaker placement,\n#  see docs/3D7.1.txt.\nsurround71 =\n\n##\n## Reverb effect stuff (includes EAX reverb)\n##\n[reverb]\n\n## boost: (global)\n#  A global amplification for reverb output, expressed in decibels. The value\n#  is logarithmic, so +6 will be a scale of (approximately) 2x, +12 will be a\n#  scale of 4x, etc. Similarly, -6 will be about half, and -12 about 1/4th. A\n#  value of 0 means no change.\n#boost = 0\n\n##\n## PulseAudio backend stuff\n##\n[pulse]\n\n## spawn-server: (global)\n#  Attempts to autospawn a PulseAudio server whenever needed (initializing the\n#  backend, enumerating devices, etc). Setting autospawn to false in Pulse's\n#  client.conf will still prevent autospawning even if this is set to true.\n#spawn-server = true\n\n## allow-moves: (global)\n#  Allows PulseAudio to move active streams to different devices. Note that the\n#  device specifier (seen by applications) will not be updated when this\n#  occurs, and neither will the AL device configuration (sample rate, format,\n#  etc).\n#allow-moves = false\n\n## fix-rate:\n#  Specifies whether to match the playback stream's sample rate to the device's\n#  sample rate. Enabling this forces OpenAL Soft to mix sources and effects\n#  directly to the actual output rate, avoiding a second resample pass by the\n#  PulseAudio server.\n#fix-rate = false\n\n##\n## ALSA backend stuff\n##\n[alsa]\n\n## device: (global)\n#  Sets the device name for the default playback device.\n#device = default\n\n## device-prefix: (global)\n#  Sets the prefix used by the discovered (non-default) playback devices. This\n#  will be appended with \"CARD=c,DEV=d\", where c is the card id and d is the\n#  device index for the requested device name.\n#device-prefix = plughw:\n\n## device-prefix-*: (global)\n#  Card- and device-specific prefixes may be used to override the device-prefix\n#  option. The option may specify the card id (eg, device-prefix-NVidia), or\n#  the card id and device index (eg, device-prefix-NVidia-0). The card id is\n#  case-sensitive.\n#device-prefix- =\n\n## capture: (global)\n#  Sets the device name for the default capture device.\n#capture = default\n\n## capture-prefix: (global)\n#  Sets the prefix used by the discovered (non-default) capture devices. This\n#  will be appended with \"CARD=c,DEV=d\", where c is the card id and d is the\n#  device number for the requested device name.\n#capture-prefix = plughw:\n\n## capture-prefix-*: (global)\n#  Card- and device-specific prefixes may be used to override the\n#  capture-prefix option. The option may specify the card id (eg,\n#  capture-prefix-NVidia), or the card id and device index (eg,\n#  capture-prefix-NVidia-0). The card id is case-sensitive.\n#capture-prefix- =\n\n## mmap:\n#  Sets whether to try using mmap mode (helps reduce latencies and CPU\n#  consumption). If mmap isn't available, it will automatically fall back to\n#  non-mmap mode. True, yes, on, and non-0 values will attempt to use mmap. 0\n#  and anything else will force mmap off.\n#mmap = true\n\n## allow-resampler:\n#  Specifies whether to allow ALSA's built-in resampler. Enabling this will\n#  allow the playback device to be set to a different sample rate than the\n#  actual output, causing ALSA to apply its own resampling pass after OpenAL\n#  Soft resamples and mixes the sources and effects for output.\n#allow-resampler = false\n\n##\n## OSS backend stuff\n##\n[oss]\n\n## device: (global)\n#  Sets the device name for OSS output.\n#device = /dev/dsp\n\n## capture: (global)\n#  Sets the device name for OSS capture.\n#capture = /dev/dsp\n\n##\n## Solaris backend stuff\n##\n[solaris]\n\n## device: (global)\n#  Sets the device name for Solaris output.\n#device = /dev/audio\n\n##\n## QSA backend stuff\n##\n[qsa]\n\n##\n## JACK backend stuff\n##\n[jack]\n\n## spawn-server: (global)\n#  Attempts to autospawn a JACK server whenever needed (initializing the\n#  backend, opening devices, etc).\n#spawn-server = false\n\n## buffer-size:\n#  Sets the update buffer size, in samples, that the backend will keep buffered\n#  to handle the server's real-time processing requests. This value must be a\n#  power of 2, or else it will be rounded up to the next power of 2. If it is\n#  less than JACK's buffer update size, it will be clamped. This option may\n#  be useful in case the server's update size is too small and doesn't give the\n#  mixer time to keep enough audio available for the processing requests.\n#buffer-size = 0\n\n##\n## WASAPI backend stuff\n##\n[wasapi]\n\n##\n## DirectSound backend stuff\n##\n[dsound]\n\n##\n## Windows Multimedia backend stuff\n##\n[winmm]\n\n##\n## PortAudio backend stuff\n##\n[port]\n\n## device: (global)\n#  Sets the device index for output. Negative values will use the default as\n#  given by PortAudio itself.\n#device = -1\n\n## capture: (global)\n#  Sets the device index for capture. Negative values will use the default as\n#  given by PortAudio itself.\n#capture = -1\n\n##\n## Wave File Writer stuff\n##\n[wave]\n\n## file: (global)\n#  Sets the filename of the wave file to write to. An empty name prevents the\n#  backend from opening, even when explicitly requested.\n#  THIS WILL OVERWRITE EXISTING FILES WITHOUT QUESTION!\nfile = output.wav\n\n## bformat: (global)\n#  Creates AMB format files using first-order ambisonics instead of a standard\n#  single- or multi-channel .wav file.\n#bformat = false"
  },
  {
    "path": "testing/resources/mappings.txt",
    "content": "03000000300f00000a01000000000000,3 In 1 Conversion Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b8,x:b3,y:b0,platform:Windows,\n03000000fa2d00000100000000000000,3dRudder Foot Motion Controller,leftx:a0,lefty:a1,rightx:a5,righty:a2,platform:Windows,\n03000000d0160000040d000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows,\n03000000d0160000050d000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows,\n03000000d0160000060d000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows,\n03000000d0160000070d000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows,\n03000000d0160000600a000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows,\n03000000c82d00000031000000000000,8BitDo Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00000531000000000000,8BitDo Adapter 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00000951000000000000,8BitDo Dogbone,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightx:a3,righty:a5,start:b11,platform:Windows,\n03000000008000000210000000000000,8BitDo F30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n030000003512000011ab000000000000,8BitDo F30 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000c82d00001028000000000000,8BitDo F30 Arcade Joystick,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d000011ab000000000000,8BitDo F30 Arcade Joystick,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000801000000900000000000000,8BitDo F30 Arcade Stick,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00001038000000000000,8BitDo F30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000090000000000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00001251000000000000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00001151000000000000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000150000000000000,8BitDo M30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000151000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00000650000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00005106000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,guide:b2,leftshoulder:b8,lefttrigger:b9,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00002090000000000000,8BitDo Micro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000310000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00000451000000000000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightx:a3,righty:a5,start:b11,platform:Windows,\n03000000c82d00002028000000000000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00008010000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d0000e002000000000000,8BitDo N30,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b6,platform:Windows,\n03000000c82d00000190000000000000,8BitDo N30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00001590000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00006528000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000290000000000000,8BitDo N64,+rightx:b9,+righty:b3,-rightx:b4,-righty:b8,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,platform:Windows,\n03000000c82d00003038000000000000,8BitDo N64,+rightx:b9,+righty:b3,-rightx:b4,-righty:b8,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,platform:Windows,\n03000000c82d00006928000000000000,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b11,platform:Windows,\n03000000c82d00002590000000000000,8BitDo NEOGEO,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n030000003512000012ab000000000000,8BitDo NES30,a:b2,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Windows,\n03000000c82d000012ab000000000000,8BitDo NES30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,\n03000000022000000090000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000203800000900000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00002038000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000751000000000000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00000851000000000000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00000360000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000361000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000660000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000131000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000231000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000331000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000431000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00002867000000000000,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a2,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b10,x:b3,y:b4,platform:Windows,\n03000000c82d00000130000000000000,8BitDo SF30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000060000000000000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000061000000000000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,\n03000000102800000900000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d000021ab000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00003028000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,\n030000003512000020ab000000000000,8BitDo SN30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000030000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000351000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a2,rightshoulder:b7,rightx:a3,righty:a5,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00001290000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d000020ab000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00004028000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00006228000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000021000000000000,8BitDo SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000260000000000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000261000000000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00001230000000000000,8BitDo Ultimate,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00001530000000000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00001630000000000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00001730000000000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00001130000000000000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00001330000000000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00000121000000000000,8BitDo Xbox One SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000a00500003232000000000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00001890000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00003032000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,\n030000008f0e00001200000000000000,Acme GA02,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows,\n03000000c01100000355000000000000,Acrux,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000fa190000f0ff000000000000,Acteck AGJ 3200,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000d1180000402c000000000000,ADT1,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a3,rightx:a2,righty:a5,x:b3,y:b4,platform:Windows,\n030000006f0e00008801000000000000,Afterglow Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000341a00003608000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00000263000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00001101000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00001401000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00001402000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00001901000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00001a01000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00001301000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000006f0e00001302000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000006f0e00001304000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000006f0e00001413000000000000,Afterglow Xbox Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00003901000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000ab1200000103000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000ad1b000000f9000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000100000008200000000000000,Akishop Customs PS360,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n030000007c1800000006000000000000,Alienware Dual Compatible PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows,\n03000000491900001904000000000000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows,\n03000000710100001904000000000000,Amazon Luna Controller,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b8,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b4,rightstick:b7,rightx:a3,righty:a4,start:b6,x:b3,y:b2,platform:Windows,\n03000000830500000160000000000000,Arcade,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b3,x:b4,y:b4,platform:Windows,\n03000000120c0000100e000000000000,Armor 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000490b00004406000000000000,ASCII Seamic Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,\n03000000869800002500000000000000,Astro C40 TR PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000a30c00002700000000000000,Astro City Mini,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,\n03000000a30c00002800000000000000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,\n03000000050b00000579000000000000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000050b00000679000000000000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000503200000110000000000000,Atari VCS Classic Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,start:b3,platform:Windows,\n03000000503200000210000000000000,Atari VCS Modern Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows,\n03000000e4150000103f000000000000,Batarang,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000d6200000e557000000000000,Batarang PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000c01100001352000000000000,Battalife Joystick,a:b6,b:b7,back:b2,leftshoulder:b0,leftx:a0,lefty:a1,rightshoulder:b1,start:b3,x:b4,y:b5,platform:Windows,\n030000006f0e00003201000000000000,Battlefield 4 PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000ad1b000001f9000000000000,BB 070,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000d62000002a79000000000000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000bc2000005250000000000000,Beitong G3,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b5,righttrigger:b9,rightx:a3,righty:a4,start:b15,x:b3,y:b4,platform:Windows,\n030000000d0500000208000000000000,Belkin Nostromo N40,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows,\n03000000bc2000006012000000000000,Betop 2126F,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000bc2000000055000000000000,Betop BFM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000bc2000006312000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000bc2000006321000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000bc2000006412000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000c01100000555000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000c01100000655000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000790000000700000000000000,Betop Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows,\n03000000808300000300000000000000,Betop Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows,\n030000006f0e00006401000000000000,BF One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows,\n03000000300f00000202000000000000,Bigben,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a5,righty:a2,start:b7,x:b2,y:b3,platform:Windows,\n030000006b1400000209000000000000,Bigben,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006b1400000055000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n030000006b1400000103000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows,\n03000000120c0000200e000000000000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000210e000000000000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000f10e000000000000,Brook PS2 Adapter,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000310c000000000000,Brook Super Converter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,\n03000000d81d00000b00000000000000,Buffalo BSGP1601 Series,a:b5,b:b3,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b4,y:b2,platform:Windows,\n030000005b1c00002400000000000000,Capcom Home Arcade Controller,a:b3,b:b4,back:b7,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b6,x:b0,y:b1,platform:Windows,\n030000005b1c00002500000000000000,Capcom Home Arcade Controller,a:b3,b:b4,back:b7,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b6,x:b0,y:b1,platform:Windows,\n030000006d04000042c2000000000000,ChillStream,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000e82000006058000000000000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000457500000401000000000000,Cobra,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000b0400003365000000000000,Competition Pro,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Windows,\n030000004c050000c505000000000000,CronusMax Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000d814000007cd000000000000,Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000d8140000cefa000000000000,Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000260900008888000000000000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a4,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Windows,\n030000003807000002cb000000000000,Cyborg,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000a306000022f6000000000000,Cyborg V.3 Rumble,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows,\n03000000f806000000a3000000000000,DA Leader,a:b7,b:b6,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b0,leftstick:b8,lefttrigger:b1,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:b3,rightx:a2,righty:a3,start:b12,x:b4,y:b5,platform:Windows,\n030000001a1c00000001000000000000,Datel Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000451300000830000000000000,Defender Game Racer X7,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000791d00000103000000000000,Dual Box Wii,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000c0160000e105000000000000,Dual Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,\n030000004f040000070f000000000000,Dual Power,a:b8,b:b9,back:b4,dpdown:b1,dpleft:b2,dpright:b3,dpup:b0,leftshoulder:b13,leftstick:b6,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b12,rightstick:b7,righttrigger:b15,start:b5,x:b10,y:b11,platform:Windows,\n030000004f04000012b3000000000000,Dual Power 3,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows,\n030000004f04000020b3000000000000,Dual Trigger,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows,\n03000000bd12000002e0000000000000,Dual Vibration Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Windows,\n03000000ff1100003133000000000000,DualForce,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b1,platform:Windows,\n030000008f0e00000910000000000000,DualShock 2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Windows,\n03000000317300000100000000000000,DualShock 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n030000006f0e00003001000000000000,EA Sports PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000fc0400000250000000000000,Easy Grip,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,\n030000006e0500000a20000000000000,Elecom DUX60 MMO,a:b2,b:b3,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b14,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b15,righttrigger:b13,rightx:a3,righty:a4,start:b20,x:b0,y:b1,platform:Windows,\n03000000b80500000410000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows,\n03000000b80500000610000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows,\n030000006e0500000520000000000000,Elecom P301U PlayStation Controller Adapter,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows,\n03000000411200004450000000000000,Elecom U1012,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows,\n030000006e0500000320000000000000,Elecom U3613M,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows,\n030000006e0500000e20000000000000,Elecom U3912T,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows,\n030000006e0500000f20000000000000,Elecom U4013S,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows,\n030000006e0500001320000000000000,Elecom U4113,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006e0500001020000000000000,Elecom U4113S,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows,\n030000006e0500000720000000000000,Elecom W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows,\n030000007d0400000640000000000000,Eliminator AfterShock,a:b1,b:b2,back:b9,dpdown:+a3,dpleft:-a5,dpright:+a5,dpup:-a3,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a4,righty:a2,start:b8,x:b0,y:b3,platform:Windows,\n03000000120c0000f61c000000000000,Elite,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000430b00000300000000000000,EMS Production PS2 Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n03000000242f000000b7000000000000,ESM 9110,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Windows,\n03000000101c0000181c000000000000,Essential,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b4,leftx:a1,lefty:a0,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n030000008f0e00000f31000000000000,EXEQ,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows,\n03000000341a00000108000000000000,EXEQ RF Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n030000006f0e00008401000000000000,Faceoff Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00008101000000000000,Faceoff Deluxe Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00008001000000000000,Faceoff Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000021000000090000000000000,FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n0300000011040000c600000000000000,FC801,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows,\n03000000852100000201000000000000,FF GP1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000ad1b000028f0000000000000,Fightpad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000ad1b00002ef0000000000000,Fightpad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000ad1b000038f0000000000000,Fightpad TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows,\n03005036852100000000000000000000,Final Fantasy XIV Online Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000f806000001a3000000000000,Firestorm,a:b9,b:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b0,leftstick:b10,lefttrigger:b1,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,start:b12,x:b8,y:b4,platform:Windows,\n03000000b50700000399000000000000,Firestorm 2,a:b2,b:b4,back:b10,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,righttrigger:b9,start:b11,x:b3,y:b5,platform:Windows,\n03000000b50700001302000000000000,Firestorm D3,a:b0,b:b2,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,x:b1,y:b3,platform:Windows,\n03000000b40400001024000000000000,Flydigi Apex,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000151900004000000000000000,Flydigi Vader 2,a:b27,b:b26,back:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b23,leftstick:b17,lefttrigger:b21,leftx:a0,lefty:a1,misc1:b15,paddle1:b11,paddle2:b10,paddle3:b13,paddle4:b12,rightshoulder:b22,rightstick:b16,righttrigger:b20,rightx:a3,righty:a4,start:b18,x:b25,y:b24,platform:Windows,\n03000000b40400001124000000000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b14,paddle1:b4,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b2,y:b3,platform:Windows,\n03000000b40400001224000000000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b2,paddle1:b16,paddle2:b17,paddle3:b14,paddle4:b15,rightshoulder:b7,rightstick:b13,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n030000008305000000a0000000000000,G08XU,a:b0,b:b1,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b5,x:b2,y:b3,platform:Windows,\n0300000066f700000100000000000000,Game VIB Joystick,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows,\n03000000260900002625000000000000,GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,lefttrigger:a4,leftx:a0,lefty:a1,righttrigger:a5,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Windows,\n03000000341a000005f7000000000000,GameCube Controller,a:b2,b:b3,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b1,y:b0,platform:Windows,\n03000000430b00000500000000000000,GameCube Controller,a:b0,b:b2,dpdown:b10,dpleft:b8,dpright:b9,dpup:b11,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a3,rightx:a5,righty:a2,start:b7,x:b1,y:b3,platform:Windows,\n03000000790000004718000000000000,GameCube Controller,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows,\n03000000790000004618000000000000,GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows,\n030000008f0e00000d31000000000000,Gamepad 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000ac0500003d03000000000000,GameSir G3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000ac0500005b05000000000000,GameSir G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000ac0500002d02000000000000,GameSir G4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000ac0500004d04000000000000,GameSir G4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000ac0500001a06000000000000,GameSir-T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n030000004c0e00001035000000000000,Gamester,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n030000000d0f00001110000000000000,GameStick Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n0300000047530000616d000000000000,GameStop,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000c01100000140000000000000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000b62500000100000000000000,Gametel GT004 01,a:b3,b:b0,dpdown:b10,dpleft:b9,dpright:b8,dpup:b11,leftshoulder:b4,rightshoulder:b5,start:b7,x:b1,y:b2,platform:Windows,\n030000008f0e00001411000000000000,Gamo2 Divaller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000a857000000000000,Gator Claw,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000c9110000f055000000000000,GC100XF,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n030000008305000009a0000000000000,Genius,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n030000008305000031b0000000000000,Genius Maxfire Blaze 3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000451300000010000000000000,Genius Maxfire Grandias 12,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n030000005c1a00003330000000000000,Genius MaxFire Grandias 12V,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows,\n03000000300f00000b01000000000000,GGE909 Recoil,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n03000000f0250000c283000000000000,Gioteck PlayStation Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000f025000021c1000000000000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000f025000031c1000000000000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000f0250000c383000000000000,Gioteck VX2 PlayStation Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000f0250000c483000000000000,Gioteck VX2 PlayStation Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n030000004f04000026b3000000000000,GP XID,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n0300000079000000d418000000000000,GPD Win,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000c6240000025b000000000000,GPX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000007d0400000840000000000000,Gravis Destroyer Tilt,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,x:b0,y:b3,platform:Windows,\n030000007d0400000540000000000000,Gravis Eliminator Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n03000000280400000140000000000000,Gravis GamePad Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a3,dpup:-a4,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n030000008f0e00000610000000000000,GreenAsia,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a5,righty:a2,start:b11,x:b3,y:b0,platform:Windows,\n03000000ac0500006b05000000000000,GT2a,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000341a00000302000000000000,Hama Scorpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00004900000000000000,Hatsune Miku Sho PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000001008000001e1000000000000,Havit HV G60,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b0,platform:Windows,\n030000000d0f00000c00000000000000,HEXT,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000d81400000862000000000000,HitBox Edition Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows,\n03000000632500002605000000000000,HJD X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n030000000d0f00000a00000000000000,Hori DOA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000000d0f00008500000000000000,Hori Fighting Commander 2016 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00002500000000000000,Hori Fighting Commander 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00002d00000000000000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00005f00000000000000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00005e00000000000000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00008400000000000000,Hori Fighting Commander 5,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00005100000000000000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00008600000000000000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000000d0f0000ba00000000000000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000000d0f00008800000000000000,Hori Fighting Stick mini 4 (PS3),a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows,\n030000000d0f00008700000000000000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00001000000000000000,Hori Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00003200000000000000,Hori Fightstick 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f0000c000000000000000,Hori Fightstick 4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000000d0f00000d00000000000000,Hori Fightstick EX2,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n030000000d0f00003701000000000000,Hori Fightstick Mini,a:b1,b:b0,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Windows,\n030000000d0f00004000000000000000,Hori Fightstick Mini 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00002100000000000000,Hori Fightstick V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00002700000000000000,Hori Fightstick V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f0000a000000000000000,Hori Grip TAC4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b13,x:b0,y:b3,platform:Windows,\n030000000d0f0000a500000000000000,Hori Miku Project Diva X HD PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f0000a600000000000000,Hori Miku Project Diva X HD PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00000101000000000000,Hori Mini Hatsune Miku FT,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00005400000000000000,Hori Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00000900000000000000,Hori Pad 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00004d00000000000000,Hori Pad A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00003801000000000000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Windows,\n030000000d0f00009200000000000000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00002301000000000000,Hori PS4 Controller Light,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n030000000d0f00001100000000000000,Hori Real Arcade Pro 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00002600000000000000,Hori Real Arcade Pro 3P,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00004b00000000000000,Hori Real Arcade Pro 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00006a00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00006b00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00008a00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00008b00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00006f00000000000000,Hori Real Arcade Pro 4 VLX,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00007000000000000000,Hori Real Arcade Pro 4 VLX,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00003d00000000000000,Hori Real Arcade Pro N3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b10,leftstick:b4,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b6,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f0000ae00000000000000,Hori Real Arcade Pro N4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000000d0f00008c00000000000000,Hori Real Arcade Pro P4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000000d0f0000aa00000000000000,Hori Real Arcade Pro S,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f0000d800000000000000,Hori Real Arcade Pro S,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Windows,\n030000000d0f00002200000000000000,Hori Real Arcade Pro V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00005b00000000000000,Hori Real Arcade Pro V4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00005c00000000000000,Hori Real Arcade Pro V4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f0000af00000000000000,Hori Real Arcade Pro VHS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00001b00000000000000,Hori Real Arcade Pro VX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000ad1b000002f5000000000000,Hori Real Arcade Pro VX,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Windows,\n030000000d0f00009c00000000000000,Hori TAC Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f0000c900000000000000,Hori Taiko Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00006400000000000000,Horipad 3TP,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00001300000000000000,Horipad 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00005500000000000000,Horipad 4 FPS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00006e00000000000000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00006600000000000000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00004200000000000000,Horipad A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000ad1b000001f5000000000000,Horipad EXT2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000000d0f0000ee00000000000000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f0000c100000000000000,Horipad Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f0000f600000000000000,Horipad Nintendo Switch Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n030000000d0f00006700000000000000,Horipad One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000000d0f0000dc00000000000000,Horipad Switch,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000242e00000b20000000000000,Hyperkin Admiral N64 Controller,+rightx:b11,+righty:b13,-rightx:b8,-righty:b12,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,platform:Windows,\n03000000242e0000ff0b000000000000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Windows,\n03000000790000004e95000000000000,Hyperkin N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a5,righty:a2,start:b9,platform:Windows,\n03000000242e00006a38000000000000,Hyperkin Trooper 2,a:b0,b:b1,back:b4,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b3,start:b5,platform:Windows,\n03000000d81d00000e00000000000000,iBuffalo AC02 Arcade Joystick,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,rightx:a2,righty:a5,start:b8,x:b4,y:b5,platform:Windows,\n03000000d81d00000f00000000000000,iBuffalo BSGP1204 Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000d81d00001000000000000000,iBuffalo BSGP1204P Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n030000005c0a00000285000000000000,iDroidCon,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b6,platform:Windows,\n03000000696400006964000000000000,iDroidCon Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000511d00000230000000000000,iGUGU Gamecore,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b1,leftstick:b4,lefttrigger:b3,leftx:a0,lefty:a1,rightshoulder:b0,righttrigger:b2,platform:Windows,\n03000000b50700001403000000000000,Impact Black,a:b2,b:b3,back:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows,\n030000006f0e00002401000000000000,Injustice Fightstick PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n03000000830500005130000000000000,InterAct ActionPad,a:b0,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,\n03000000ef0500000300000000000000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows,\n03000000fd0500000230000000000000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a5,start:b11,x:b0,y:b1,platform:Windows,\n03000000fd0500000030000000000000,Interact GoPad,a:b3,b:b4,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Windows,\n03000000fd0500003902000000000000,InterAct Hammerhead,a:b3,b:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b2,lefttrigger:b8,rightshoulder:b7,rightstick:b5,righttrigger:b9,start:b10,x:b0,y:b1,platform:Windows,\n03000000fd0500002a26000000000000,InterAct Hammerhead FX,a:b3,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b0,y:b1,platform:Windows,\n03000000fd0500002f26000000000000,InterAct Hammerhead FX,a:b4,b:b5,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b1,y:b2,platform:Windows,\n03000000fd0500005302000000000000,InterAct ProPad,a:b3,b:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Windows,\n03000000ac0500002c02000000000000,Ipega Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000491900000204000000000000,Ipega PG9023,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000491900000304000000000000,Ipega PG9087,+righty:+a5,-righty:-a4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,start:b11,x:b3,y:b4,platform:Windows,\n030000007e0500000620000000000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Windows,\n030000007e0500000720000000000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows,\n03000000250900000017000000000000,Joypad Adapter,a:b2,b:b1,back:b9,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b8,x:b3,y:b0,platform:Windows,\n03000000bd12000003c0000000000000,Joypad Alpha Shock,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000ff1100004033000000000000,JPD FFB,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a2,start:b15,x:b3,y:b0,platform:Windows,\n03000000242f00002d00000000000000,JYS Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000242f00008a00000000000000,JYS Adapter,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows,\n03000000c4100000c082000000000000,KADE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000828200000180000000000000,Keio,a:b4,b:b5,back:b8,leftshoulder:b2,lefttrigger:b3,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b9,x:b0,y:b1,platform:Windows,\n03000000790000000200000000000000,King PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows,\n03000000bd12000001e0000000000000,Leadership,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n030000006f0e00000103000000000000,Logic3,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000006f0e00000104000000000000,Logic3,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000008f0e00001300000000000000,Logic3,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n030000006d040000d1ca000000000000,Logitech ChillStream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006d040000d2ca000000000000,Logitech Cordless Precision,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006d04000011c2000000000000,Logitech Cordless Wingman,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b5,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b2,righttrigger:b7,rightx:a3,righty:a4,x:b4,platform:Windows,\n030000006d04000016c2000000000000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006d0400001dc2000000000000,Logitech F310,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000006d04000018c2000000000000,Logitech F510,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006d0400001ec2000000000000,Logitech F510,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000006d04000019c2000000000000,Logitech F710,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006d0400001fc2000000000000,Logitech F710,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000006d0400001ac2000000000000,Logitech Precision,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n030000006d04000009c2000000000000,Logitech WingMan,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows,\n030000006d0400000bc2000000000000,Logitech WingMan Action Pad,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b8,lefttrigger:a5~,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b5,righttrigger:a2~,start:b8,x:b3,y:b4,platform:Windows,\n030000006d0400000ac2000000000000,Logitech WingMan RumblePad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,rightx:a3,righty:a4,x:b3,y:b4,platform:Windows,\n03000000380700005645000000000000,Lynx,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000222200006000000000000000,Macally,a:b1,b:b2,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b33,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700003888000000000000,Mad Catz Arcade Fightstick TE S Plus PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700008532000000000000,Mad Catz Arcade Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700006352000000000000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700006652000000000000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700005032000000000000,Mad Catz Fightpad Pro PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700005082000000000000,Mad Catz Fightpad Pro PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700008031000000000000,Mad Catz FightStick Alpha PS3\t,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000003807000038b7000000000000,Mad Catz Fightstick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows,\n03000000380700008433000000000000,Mad Catz Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700008483000000000000,Mad Catz Fightstick TE S PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700008134000000000000,Mad Catz Fightstick TE2 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b4,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700008184000000000000,Mad Catz Fightstick TE2 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,leftstick:b10,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700006252000000000000,Mad Catz Micro CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700008232000000000000,Mad Catz PlayStation Brawlpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700008731000000000000,Mad Catz PlayStation Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000003807000056a8000000000000,Mad Catz PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700001888000000000000,Mad Catz SFIV Fightstick PS3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000380700008081000000000000,Mad Catz SFV Arcade Fightstick Alpha PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700001847000000000000,Mad Catz Street Fighter 4 Xbox 360 FightStick,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows,\n03000000380700008034000000000000,Mad Catz TE2 PS3 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700008084000000000000,Mad Catz TE2 PS4 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000002a0600001024000000000000,Matricom,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows,\n030000009f000000adbb000000000000,MaxJoypad Virtual Controller,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n03000000250900000128000000000000,Mayflash Arcade Stick,a:b1,b:b2,back:b8,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b5,y:b6,platform:Windows,\n030000008f0e00001330000000000000,Mayflash Controller Adapter,a:b1,b:b2,back:b8,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3~,righty:a2,start:b9,x:b0,y:b3,platform:Windows,\n03000000242f00003700000000000000,Mayflash F101,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n03000000790000003018000000000000,Mayflash F300 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n03000000242f00003900000000000000,Mayflash F300 Elite Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000790000004418000000000000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows,\n03000000790000004318000000000000,Mayflash GameCube Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows,\n03000000242f00007300000000000000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows,\n0300000079000000d218000000000000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000d620000010a7000000000000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000242f0000f400000000000000,Mayflash N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a5,start:b9,platform:Windows,\n03000000790000007918000000000000,Mayflash N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,righttrigger:b7,rightx:a3,righty:a2,start:b8,platform:Windows,\n030000008f0e00001030000000000000,Mayflash Saturn Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:b7,rightshoulder:b6,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,\n0300000025090000e803000000000000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows,\n03000000790000000318000000000000,Mayflash Wii DolphinBar,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows,\n03000000790000000018000000000000,Mayflash Wii U Pro Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000790000002418000000000000,Mega Drive Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b2,start:b9,x:b3,y:b4,platform:Windows,\n0300000079000000ae18000000000000,Mega Drive Controller,a:b0,b:b1,back:b7,dpdown:b14,dpleft:b15,dpright:b13,dpup:b2,rightshoulder:b6,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,\n03000000c0160000990a000000000000,Mega Drive Controller,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,righttrigger:b2,start:b3,platform:Windows,\n030000005e0400002800000000000000,Microsoft Dual Strike,a:b3,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,rightx:a0,righty:a1~,start:b5,x:b1,y:b0,platform:Windows,\n030000005e0400000300000000000000,Microsoft SideWinder,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows,\n030000005e0400000700000000000000,Microsoft SideWinder,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,\n030000005e0400000e00000000000000,Microsoft SideWinder Freestyle Pro,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,start:b8,x:b3,y:b4,platform:Windows,\n030000005e0400002700000000000000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Windows,\n03000000280d00000202000000000000,Miller Lite Cantroller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b5,x:b2,y:b3,platform:Windows,\n03000000ad1b000023f0000000000000,MLG,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a6,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n03000000ad1b00003ef0000000000000,MLG Fightstick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows,\n03000000380700006382000000000000,MLG PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000004523000015e0000000000000,Mobapad Chitu HD,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000491900000904000000000000,Mobapad Chitu HD,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000ffff00000000000000000000,Mocute M053,a:b3,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b11,leftstick:b7,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b6,righttrigger:b4,rightx:a3,righty:a4,start:b8,x:b1,y:b0,platform:Windows,\n03000000d6200000e589000000000000,Moga 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows,\n03000000d62000007162000000000000,Moga Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows,\n03000000d6200000ad0d000000000000,Moga Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000c62400002a89000000000000,Moga XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c62400002b89000000000000,Moga XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c62400001a89000000000000,Moga XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c62400001b89000000000000,Moga XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000250900006688000000000000,MP-8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n03000000091200004488000000000000,MUSIA PlayStation 2 Input Display,a:b0,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b7,righttrigger:b11,rightx:a2,righty:a3,start:b5,x:b1,y:b3,platform:Windows,\n03000000f70600000100000000000000,N64 Adaptoid,+rightx:b2,+righty:b1,-rightx:b4,-righty:b5,a:b0,b:b3,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,platform:Windows,\n030000006b140000010c000000000000,Nacon GC 400ES,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n030000006b1400001106000000000000,Nacon Revolution 3 PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n0300000085320000170d000000000000,Nacon Revolution 5 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n0300000085320000190d000000000000,Nacon Revolution 5 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n030000006b140000100d000000000000,Nacon Revolution Infinity PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006b140000080d000000000000,Nacon Revolution Unlimited Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000bd12000001c0000000000000,Nebular,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n03000000eb0300000000000000000000,NeGcon Adapter,a:a2,b:b13,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,lefttrigger:a4,leftx:a1,righttrigger:b11,start:b3,x:a3,y:b12,platform:Windows,\n0300000038070000efbe000000000000,NEO SE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n0300000092120000474e000000000000,NeoGeo X Arcade Stick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b3,y:b2,platform:Windows,\n03000000921200004b46000000000000,NES 2 port Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b11,platform:Windows,\n03000000000f00000100000000000000,NES Controller,a:b1,b:b0,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Windows,\n03000000921200004346000000000000,NES Controller,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Windows,\n03000000790000004518000000000000,NEXILUX GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows,\n030000001008000001e5000000000000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Windows,\n03000000050b00000045000000000000,Nexus,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Windows,\n03000000152000000182000000000000,NGDS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Windows,\n030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n030000000d0500000308000000000000,Nostromo N45,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Windows,\n030000007e0500001920000000000000,NSO N64 Controller,+rightx:b8,+righty:b2,-rightx:b3,-righty:b7,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,righttrigger:b10,start:b9,platform:Windows,\n030000007e0500001720000000000000,NSO SNES Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b15,start:b9,x:b2,y:b3,platform:Windows,\n03000000550900001472000000000000,NVIDIA Controller,a:b11,b:b10,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b5,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b4,righttrigger:a5,rightx:a3,righty:a6,start:b3,x:b9,y:b8,platform:Windows,\n03000000550900001072000000000000,NVIDIA Shield,a:b9,b:b8,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b3,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b2,righttrigger:a4,rightx:a2,righty:a5,start:b0,x:b7,y:b6,platform:Windows,\n030000005509000000b4000000000000,NVIDIA Virtual,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000120c00000288000000000000,Nyko Air Flo Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n030000004b120000014d000000000000,Nyko Airflo,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a3,leftstick:a0,lefttrigger:b6,rightshoulder:b5,rightstick:a2,righttrigger:b7,start:b9,x:b2,y:b3,platform:Windows,\n03000000d62000001d57000000000000,Nyko Airflo PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000791d00000900000000000000,Nyko Playpad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000782300000a10000000000000,Onlive Controller,a:b15,b:b14,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b11,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b13,y:b12,platform:Windows,\n030000000d0f00000401000000000000,Onyx,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000008916000001fd000000000000,Onza CE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a3,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000008916000000fd000000000000,Onza TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000d62000006d57000000000000,OPP PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006b14000001a1000000000000,Orange Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows,\n03000000362800000100000000000000,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b13,rightx:a3,righty:a4,x:b1,y:b2,platform:Windows,\n03000000120c0000f60e000000000000,P4 Gamepad,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b7,rightshoulder:b4,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows,\n03000000790000002201000000000000,PC Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n030000006f0e00008501000000000000,PDP Fightpad Pro GameCube Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n030000006f0e00000901000000000000,PDP PS3 Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n030000008f0e00004100000000000000,PlaySega,a:b1,b:b0,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b8,x:b4,y:b3,platform:Windows,\n03000000666600006706000000000000,PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Windows,\n03000000e30500009605000000000000,PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n030000004c050000da0c000000000000,PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,\n03000000632500002306000000000000,PlayStation Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows,\n03000000f0250000c183000000000000,PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000d9040000160f000000000000,PlayStation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n030000004c0500003713000000000000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,\n03000000d620000011a7000000000000,PowerA Core Plus GameCube Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000dd62000015a7000000000000,PowerA Fusion Nintendo Switch Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000d620000012a7000000000000,PowerA Fusion Nintendo Switch Fight Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000dd62000016a7000000000000,PowerA Fusion Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000d620000013a7000000000000,PowerA Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000d62000006dca000000000000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n0300000062060000d570000000000000,PowerA PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000d620000014a7000000000000,PowerA Spectra Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006d04000084ca000000000000,Precision,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n03000000d62000009557000000000000,Pro Elite PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000c62400001a53000000000000,Pro Ex Mini,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000d62000009f31000000000000,Pro Ex mini PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000d6200000c757000000000000,Pro Ex mini PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000110e000000000000,Pro5,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000100800000100000000000000,PS1 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n030000008f0e00007530000000000000,PS1 Controller,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b1,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000100800000300000000000000,PS2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n03000000250900000088000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n03000000250900006888000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b6,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n03000000250900008888000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n030000006b1400000303000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n030000009d0d00001330000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000151a00006222000000000000,PS2 Dual Plus Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n03000000120a00000100000000000000,PS3 Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000120c00001307000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c00001cf1000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000f90e000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000250900000118000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n03000000250900000218000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n03000000250900000500000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b0,y:b3,platform:Windows,\n030000004c0500006802000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b10,lefttrigger:a3~,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:a4~,rightx:a2,righty:a5,start:b8,x:b3,y:b0,platform:Windows,\n030000004f1f00000800000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n03000000632500007505000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000888800000803000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b0,platform:Windows,\n03000000888800000804000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Windows,\n030000008f0e00000300000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows,\n030000008f0e00001431000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000ba2200002010000000000000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b2,platform:Windows,\n03000000120c00000807000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000111e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000121e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000130e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000150e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000180e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000181e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000191e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c00001e0e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000a957000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000aa57000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000f21c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000f31c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000f41c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000f51c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000f70e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000120e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000160e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000001a1e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000004c050000a00b000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n030000004c050000cc09000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000004c050000e60c000000000000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n030000004c050000f20d000000000000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000830500005020000000000000,PSX,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b2,y:b3,platform:Windows,\n03000000300f00000111000000000000,Qanba 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000300f00000211000000000000,Qanba 2P,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000300f00000011000000000000,Qanba Arcade Stick 1008,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b10,x:b0,y:b3,platform:Windows,\n03000000300f00001611000000000000,Qanba Arcade Stick 4018,a:b1,b:b2,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows,\n03000000222c00000025000000000000,Qanba Dragon Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000222c00000020000000000000,Qanba Drone Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,rightshoulder:b5,righttrigger:a4,start:b9,x:b0,y:b3,platform:Windows,\n03000000300f00001211000000000000,Qanba Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000300f00001210000000000000,Qanba Joystick Plus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows,\n03000000341a00000104000000000000,Qanba Joystick Q4RAF,a:b5,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b1,y:b2,platform:Windows,\n03000000222c00000223000000000000,Qanba Obsidian Arcade Stick PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000222c00000023000000000000,Qanba Obsidian Arcade Stick PS4,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000008a2400006682000000000000,R1 Mobile Controller,a:b3,b:b1,back:b7,leftx:a0,lefty:a1,start:b6,x:b4,y:b0,platform:Windows,\n03000000086700006626000000000000,RadioShack,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows,\n03000000ff1100004733000000000000,Ramox FPS Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b0,platform:Windows,\n030000009b2800002300000000000000,Raphnet 3DO Adapter,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b2,start:b3,platform:Windows,\n030000009b2800006900000000000000,Raphnet 3DO Adapter,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b2,start:b3,platform:Windows,\n030000009b2800000800000000000000,Raphnet Dreamcast Adapter,a:b2,b:b1,dpdown:b5,dpleft:b6,dpright:b7,dpup:b4,lefttrigger:a2,leftx:a0,righttrigger:a3,righty:a1,start:b3,x:b10,y:b9,platform:Windows,\n030000009b2800006200000000000000,Raphnet GameCube Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows,\n030000009b2800003200000000000000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:+a2,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows,\n030000009b2800006000000000000000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:+a2,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows,\n030000009b2800001800000000000000,Raphnet Jaguar Adapter,a:b2,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b0,righttrigger:b10,start:b3,x:b11,y:b12,platform:Windows,\n030000009b2800006300000000000000,Raphnet N64 Adapter,+rightx:b9,+righty:b7,-rightx:b8,-righty:b6,a:b0,b:b1,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,lefttrigger:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Windows,\n030000009b2800000200000000000000,Raphnet NES Adapter,a:b7,b:b6,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b4,platform:Windows,\n030000009b2800004400000000000000,Raphnet PS1 and PS2 Adapter,a:b1,b:b2,back:b5,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b9,rightx:a3,righty:a4,start:b4,x:b0,y:b3,platform:Windows,\n030000009b2800004300000000000000,Raphnet Saturn,a:b0,b:b1,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows,\n030000009b2800000500000000000000,Raphnet Saturn Adapter 2.0,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows,\n030000009b2800000300000000000000,Raphnet SNES Adapter,a:b0,b:b4,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows,\n030000009b2800005600000000000000,Raphnet SNES Adapter,a:b1,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows,\n030000009b2800005700000000000000,Raphnet SNES Adapter,a:b1,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows,\n030000009b2800001e00000000000000,Raphnet Vectrex Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a1,lefty:a2,x:b2,y:b3,platform:Windows,\n030000009b2800002b00000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows,\n030000009b2800002c00000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows,\n030000009b2800008000000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows,\n03000000321500000003000000000000,Razer Hydra,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000f8270000bf0b000000000000,Razer Kishi,a:b6,b:b7,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b18,leftshoulder:b12,leftstick:b19,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b13,rightstick:b20,righttrigger:b15,rightx:a3,righty:a4,start:b17,x:b9,y:b10,platform:Windows,\n03000000321500000204000000000000,Razer Panthera PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000321500000104000000000000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000321500000010000000000000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000321500000507000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000321500000707000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000321500000710000000000000,Razer Raiju TE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000321500000a10000000000000,Razer Raiju TE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000321500000410000000000000,Razer Raiju UE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000321500000910000000000000,Razer Raiju UE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000321500000011000000000000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000321500000009000000000000,Razer Serval,+lefty:+a2,-lefty:-a1,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,leftx:a0,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000921200004547000000000000,Retro Bit Sega Genesis Controller Adapter,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b6,x:b3,y:b4,platform:Windows,\n03000000790000001100000000000000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows,\n03000000830500006020000000000000,Retro Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b8,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows,\n0300000003040000c197000000000000,Retrode Adapter,a:b0,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows,\n03000000bd12000013d0000000000000,Retrolink Sega Saturn Classic Controller,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b5,lefttrigger:b6,rightshoulder:b2,righttrigger:b7,start:b8,x:b3,y:b4,platform:Windows,\n03000000bd12000015d0000000000000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows,\n03000000341200000400000000000000,RetroUSB N64 RetroPort,+rightx:b8,+righty:b10,-rightx:b9,-righty:b11,a:b7,b:b6,dpdown:b2,dpleft:b1,dpright:b0,dpup:b3,leftshoulder:b13,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b12,start:b4,platform:Windows,\n0300000000f000000300000000000000,RetroUSB RetroPad,a:b1,b:b5,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows,\n0300000000f00000f100000000000000,RetroUSB Super RetroPort,a:b1,b:b5,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows,\n03000000830500000960000000000000,Revenger,a:b0,b:b1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b3,x:b4,y:b5,platform:Windows,\n030000006b140000010d000000000000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000006b140000020d000000000000,Revolution Pro Controller 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000006b140000130d000000000000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00001f01000000000000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000006f0e00004601000000000000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000c6240000fefa000000000000,Rock Candy Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000006f0e00008701000000000000,Rock Candy Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00001e01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00002801000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00002f01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000050b0000e318000000000000,ROG Chakram,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows,\n03000000050b0000e518000000000000,ROG Chakram,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows,\n03000000050b00005819000000000000,ROG Chakram Core,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows,\n03000000050b0000181a000000000000,ROG Chakram X,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows,\n03000000050b00001a1a000000000000,ROG Chakram X,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows,\n03000000050b00001c1a000000000000,ROG Chakram X,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows,\n030000004f04000001d0000000000000,Rumble Force,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows,\n030000008916000000fe000000000000,Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000c6240000045d000000000000,Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000a30600001af5000000000000,Saitek Cyborg,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,\n03000000a306000023f6000000000000,Saitek Cyborg V.1 Game,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows,\n03000000300f00001201000000000000,Saitek Dual Analog,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows,\n03000000a30600000701000000000000,Saitek P220,a:b2,b:b3,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,x:b0,y:b1,platform:Windows,\n03000000a30600000cff000000000000,Saitek P2500 Force Rumble,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b0,y:b1,platform:Windows,\n03000000a30600000d5f000000000000,Saitek P2600,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b8,x:b0,y:b3,platform:Windows,\n03000000a30600000dff000000000000,Saitek P2600,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b8,x:b0,y:b3,platform:Windows,\n03000000a30600000c04000000000000,Saitek P2900,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows,\n03000000a306000018f5000000000000,Saitek P3200,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,\n03000000300f00001001000000000000,Saitek P480 Rumble,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows,\n03000000a30600000901000000000000,Saitek P880,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b8,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b5,rightx:a3,righty:a2,x:b0,y:b1,platform:Windows,\n03000000a30600000b04000000000000,Saitek P990,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows,\n03000000a30600002106000000000000,Saitek PS1000 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows,\n03000000a306000020f6000000000000,Saitek PS2700 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows,\n03000000300f00001101000000000000,Saitek Rumble,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows,\n03000000e804000000a0000000000000,Samsung EIGP20,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c01100000252000000000000,Sanwa Easy Grip,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,\n03000000c01100004350000000000000,Sanwa Micro Grip P3,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,x:b3,y:b2,platform:Windows,\n03000000411200004550000000000000,Sanwa Micro Grip Pro,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a1,righty:a2,start:b9,x:b1,y:b3,platform:Windows,\n03000000c01100004150000000000000,Sanwa Micro Grip Pro,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows,\n03000000c01100004450000000000000,Sanwa Online Grip,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,rightstick:b11,righttrigger:b9,rightx:a3,righty:a2,start:b14,x:b3,y:b4,platform:Windows,\n03000000730700000401000000000000,Sanwa PlayOnline Mobile,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Windows,\n03000000830500006120000000000000,Sanwa Smart Grip II,a:b0,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,x:b1,y:b3,platform:Windows,\n03000000c01100000051000000000000,Satechi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n030000004f04000028b3000000000000,Score A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000952e00002577000000000000,Scuf PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000a30c00002500000000000000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Windows,\n03000000a30c00002400000000000000,Sega Mega Drive Mini 6B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,\n03000000d804000086e6000000000000,Sega Multi Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows,\n0300000000050000289b000000000000,Sega Saturn Adapter,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows,\n0300000000f000000800000000000000,Sega Saturn Controller,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b7,righttrigger:b3,start:b0,x:b5,y:b6,platform:Windows,\n03000000730700000601000000000000,Sega Saturn Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,\n03000000b40400000a01000000000000,Sega Saturn Controller,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows,\n030000003b07000004a1000000000000,SFX,a:b0,b:b2,back:b7,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b5,start:b8,x:b1,y:b3,platform:Windows,\n03000000f82100001900000000000000,Shogun Bros Chameleon X1,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n03000000120c00001c1e000000000000,SnakeByte 4S PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n0300000081170000960a000000000000,SNES Controller,a:b4,b:b0,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b5,y:b1,platform:Windows,\n03000000811700009d0a000000000000,SNES Controller,a:b0,b:b4,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows,\n030000008b2800000300000000000000,SNES Controller,a:b0,b:b4,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows,\n03000000921200004653000000000000,SNES Controller,a:b0,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows,\n03000000ff000000cb01000000000000,Sony PlayStation Portable,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows,\n03000000341a00000208000000000000,Speedlink 6555,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:-a4,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a3,righty:a2,start:b7,x:b2,y:b3,platform:Windows,\n03000000341a00000908000000000000,Speedlink 6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000380700001722000000000000,Speedlink Competition Pro,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,x:b2,y:b3,platform:Windows,\n030000008f0e00000800000000000000,Speedlink Strike FX,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000c01100000591000000000000,Speedlink Torid,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000d11800000094000000000000,Stadia Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b11,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows,\n03000000de280000fc11000000000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000de280000ff11000000000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000120c0000160e000000000000,Steel Play Metaltech PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000110100001914000000000000,SteelSeries,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000381000001214000000000000,SteelSeries Free,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows,\n03000000110100003114000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000381000003014000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000381000003114000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000381000001814000000000000,SteelSeries Stratus XL,a:b0,b:b1,back:b18,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b19,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b2,y:b3,platform:Windows,\n03000000790000001c18000000000000,STK 7024X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000380700003847000000000000,Street Fighter Fightstick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,start:b7,x:b2,y:b3,platform:Windows,\n030000001f08000001e4000000000000,Super Famicom Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows,\n03000000790000000418000000000000,Super Famicom Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b33,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows,\n03000000341200001300000000000000,Super Racer,a:b2,b:b3,back:b8,leftshoulder:b5,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b7,x:b0,y:b1,platform:Windows,\n03000000457500002211000000000000,Szmy Power PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000004f0400000ab1000000000000,T16000M,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b10,x:b2,y:b3,platform:Windows,\n030000000d0f00007b00000000000000,TAC GEAR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000e40a00000207000000000000,Taito Egret II Mini Controller,a:b4,b:b2,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b9,rightshoulder:b0,righttrigger:b1,start:b7,x:b8,y:b3,platform:Windows,\n03000000d814000001a0000000000000,TE Kitty,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000fa1900000706000000000000,Team 5,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000b50700001203000000000000,Techmobility X6-38V,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows,\n03000000ba2200000701000000000000,Technology Innovation PS2 Adapter,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b2,platform:Windows,\n03000000c61100001000000000000000,Tencent Xianyou Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,x:b3,y:b4,platform:Windows,\n03000000790000002601000000000000,TGZ,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows,\n03000000591c00002400000000000000,THEC64 Joystick,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows,\n03000000591c00002600000000000000,THEGamepad,a:b2,b:b1,back:b6,leftx:a0,lefty:a1,start:b7,x:b3,y:b0,platform:Windows,\n030000004f04000015b3000000000000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows,\n030000004f04000023b3000000000000,Thrustmaster Dual Trigger PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000004f0400000ed0000000000000,ThrustMaster eSwap Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000004f04000008d0000000000000,ThrustMaster Ferrari 150 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Windows,\n030000004f04000004b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows,\n030000004f04000003d0000000000000,ThrustMaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b7,leftshoulder:a3,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:a4,rightstick:b11,righttrigger:b5,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000004f04000009d0000000000000,ThrustMaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006d04000088ca000000000000,Thunderpad,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n03000000666600000288000000000000,TigerGame PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n03000000666600000488000000000000,TigerGame PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n030000004f04000007d0000000000000,TMini,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000571d00002100000000000000,Tomee NES Controller Adapter,a:b1,b:b0,back:b2,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,start:b3,platform:Windows,\n03000000571d00002000000000000000,Tomee SNES Controller Adapter,a:b0,b:b1,back:b6,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows,\n03000000d62000006000000000000000,Tournament PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000c01100000055000000000000,Tronsmart,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n030000005f140000c501000000000000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000b80500000210000000000000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n030000004f04000087b6000000000000,TWCS Throttle,dpdown:b8,dpleft:b9,dpright:b7,dpup:b6,leftstick:b5,lefttrigger:-a5,leftx:a0,lefty:a1,righttrigger:+a5,platform:Windows,\n03000000411200000450000000000000,Twin Shock,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a4,start:b11,x:b3,y:b0,platform:Windows,\n03000000d90400000200000000000000,TwinShock PS2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n03000000151900005678000000000000,Uniplay U6,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000101c0000171c000000000000,uRage Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n030000000b0400003065000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows,\n03000000242f00006e00000000000000,USB Controller,a:b1,b:b4,back:b10,leftshoulder:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b7,rightx:a2,righty:a5,start:b11,x:b0,y:b3,platform:Windows,\n03000000300f00000701000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n03000000341a00002308000000000000,USB Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000666600000188000000000000,USB Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n030000006b1400000203000000000000,USB Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000790000000a00000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows,\n03000000b404000081c6000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows,\n03000000b50700001503000000000000,USB Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b0,y:b1,platform:Windows,\n03000000bd12000012d0000000000000,USB Controller,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows,\n03000000ff1100004133000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n03000000632500002305000000000000,USB Vibration Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000790000001a18000000000000,Venom,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000790000001b18000000000000,Venom Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00000302000000000000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00000702000000000000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n0300000034120000adbe000000000000,vJoy Device,a:b0,b:b1,back:b15,dpdown:b6,dpleft:b7,dpright:b8,dpup:b5,guide:b16,leftshoulder:b9,leftstick:b13,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b14,righttrigger:b12,rightx:a3,righty:a4,start:b4,x:b2,y:b3,platform:Windows,\n03000000120c0000ab57000000000000,Warrior Joypad JS083,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000007e0500003003000000000000,Wii U Pro,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,leftshoulder:b6,leftstick:b11,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b12,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows,\n0300000032150000030a000000000000,Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n0300000032150000140a000000000000,Wolverine,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000002e160000efbe000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,rightshoulder:b5,righttrigger:b11,start:b7,x:b2,y:b3,platform:Windows,\n03000000380700001647000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000380700002045000000000000,Xbox 360 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700002644000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a2,righty:a5,start:b8,x:b2,y:b3,platform:Windows,\n03000000380700002647000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000003807000026b7000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000380700003647000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a7,righty:a5,start:b7,x:b2,y:b3,platform:Windows,\n030000005e0400001907000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e0400008e02000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e0400009102000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000ad1b000000fd000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000ad1b000001fd000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000ad1b000016f0000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000ad1b00008e02000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000c62400000053000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000c6240000fdfa000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000380700002847000000000000,Xbox 360 Fightpad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e040000a102000000000000,Xbox 360 Wireless Receiver,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e0400000a0b000000000000,Xbox Adaptive Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000120c00000a88000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a2,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n03000000120c00001088000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2~,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5~,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000002a0600002000000000000000,Xbox Controller,a:b0,b:b1,back:b13,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,leftshoulder:b5,leftstick:b14,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b15,righttrigger:b7,rightx:a2,righty:a5,start:b12,x:b2,y:b3,platform:Windows,\n03000000300f00008888000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:b13,dpleft:b10,dpright:b11,dpup:b12,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n03000000380700001645000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n03000000380700002645000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000380700003645000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n03000000380700008645000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e0400000202000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n030000005e0400008502000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e0400008702000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b7,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n030000005e0400008902000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b10,leftstick:b8,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b9,righttrigger:b4,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n030000000d0f00006300000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e0400000c0b000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e040000d102000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e040000dd02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e040000e002000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e040000e302000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e040000ea02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e040000fd02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e040000ff02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000006f0e0000a802000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000006f0e0000c802000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000c62400003a54000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e040000130b000000000000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000341a00000608000000000000,Xeox,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000450c00002043000000000000,Xeox SL6556BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n030000006f0e00000300000000000000,XGear,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n03000000e0ff00000201000000000000,Xiaomi Black Shark (L),back:b0,dpdown:b11,dpleft:b9,dpright:b10,dpup:b8,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,platform:Windows,\n03000000172700004431000000000000,Xiaomi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a7,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000172700003350000000000000,Xiaomi XMGP01YM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000bc2000005060000000000000,Xiaomi XMGP01YM,+lefty:+a2,+righty:+a5,-lefty:-a1,-righty:-a4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,start:b11,x:b3,y:b4,platform:Windows,\nxinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000007d0400000340000000000000,Xterminator Digital Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:-a4,lefttrigger:+a4,leftx:a0,lefty:a1,paddle1:b7,paddle2:b6,rightshoulder:b5,rightstick:b9,righttrigger:b2,rightx:a3,righty:a5,start:b8,x:b3,y:b4,platform:Windows,\n03000000790000004f18000000000000,ZDT Android Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000120c00000500000000000000,Zeroplus Adapter,a:b2,b:b1,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b0,righttrigger:b5,rightx:a3,righty:a2,start:b8,x:b3,y:b0,platform:Windows,\n03000000120c0000101e000000000000,Zeroplus P4 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000008f0e00000300000009010000,2 In 1 Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,\n03000000c82d00000031000001000000,8BitDo Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00000531000000020000,8BitDo Adapter 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00000951000000010000,8BitDo Dogbone,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Mac OS X,\n03000000c82d00000090000001000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00001038000000010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00001251000000010000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00001251000000020000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00001151000000010000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00001151000000020000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000a30c00002400000006020000,8BitDo M30,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,guide:b9,leftshoulder:b6,lefttrigger:b5,rightshoulder:b4,righttrigger:b7,start:b8,x:b3,y:b0,platform:Mac OS X,\n03000000c82d00000151000000010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00000650000001000000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00005106000000010000,8BitDo M30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b2,leftshoulder:b6,lefttrigger:a5,rightshoulder:b7,righttrigger:a4,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00002090000000010000,8BitDo Micro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000451000000010000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Mac OS X,\n03000000c82d00001590000001000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00006928000000010000,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Mac OS X,\n03000000c82d00002590000000010000,8BitDo NEOGEO,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00002590000001000000,8BitDo NEOGEO,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00002690000000010000,8BitDo NEOGEOa:b0,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,b:b1,back:b10,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000003512000012ab000001000000,8BitDo NES30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d000012ab000001000000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00002028000000010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000022000000090000001000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000203800000900000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000190000001000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000751000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00000851000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00000660000000010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000660000000020000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000131000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000231000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000331000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000431000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00002867000000010000,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b3,y:b4,platform:Mac OS X,\n03000000102800000900000000000000,8BitDo SFC30 Joystick,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000351000000010000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00001290000001000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00004028000000010000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000160000001000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000260000001000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000261000000010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00001230000000010000,8BitDo Ultimate,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00001530000001000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00001630000001000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00001730000001000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00001130000000020000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00001330000001000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00001330000000020000,8BitDo Ultimate Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000a00500003232000008010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000a00500003232000009010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00001890000001000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a31,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000491900001904000001010000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Mac OS X,\n03000000710100001904000000010000,Amazon Luna Controller,a:b0,b:b1,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Mac OS X,\n03000000a30c00002700000003030000,Astro City Mini,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X,\n03000000a30c00002800000003030000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X,\n03000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,\n03000000050b00000579000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b42,paddle1:b9,paddle2:b11,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X,\n03000000050b00000679000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b23,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X,\n03000000503200000110000047010000,Atari VCS Classic Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b3,start:b2,platform:Mac OS X,\n03000000503200000210000047010000,Atari VCS Modern Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Mac OS X,\n03000000c62400001a89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X,\n03000000c62400001b89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000d62000002a79000000010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000120c0000200e000000010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000120c0000210e000000010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000008305000031b0000000000000,Cideko AK08b,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000d8140000cecf000000000000,Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000260900008888000088020000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Mac OS X,\n03000000a306000022f6000001030000,Cyborg V3 Rumble Pad PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000791d00000103000009010000,Dual Box Wii Classic Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,\n030000006e0500000720000010020000,Elecom JC-W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Mac OS X,\n030000006f0e00008401000003010000,Faceoff Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b13,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000151900004000000001000000,Flydigi Vader 2,a:b14,b:b15,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Mac OS X,\n03000000b40400001124000001040000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b14,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000b40400001224000003030000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b2,paddle1:b16,paddle2:b17,paddle3:b14,paddle4:b15,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000790000004618000000010000,GameCube Controller Adapter,a:b4,b:b0,dpdown:b56,dpleft:b60,dpright:b52,dpup:b48,lefttrigger:a12,leftx:a0,lefty:a4,rightshoulder:b28,righttrigger:a16,rightx:a20,righty:a8,start:b36,x:b8,y:b12,platform:Mac OS X,\n03000000ac0500001a06000002020000,GameSir-T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000ad1b000001f9000000000000,Gamestop BB070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,\n03000000c01100000140000000010000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000006f0e00000102000000000000,GameStop Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n03000000ff1100003133000007010000,GameWare PC Control Pad,a:b2,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b0,platform:Mac OS X,\n030000007d0400000540000001010000,Gravis Eliminator Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000280400000140000000020000,Gravis GamePad Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000008f0e00000300000007010000,GreenAsia Joystick,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Mac OS X,\n030000000d0f00002d00000000100000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00005f00000000000000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00005f00000000010000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00005e00000000000000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00005e00000000010000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00008400000000010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00008500000000010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000341a00000302000014010000,Hori Fighting Stick Mini,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00008800000000010000,Hori Fighting Stick mini 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00008700000000010000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00004d00000000000000,Hori Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00003801000008010000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Mac OS X,\n030000000d0f00009200000000010000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f0000aa00000072050000,Hori Real Arcade Pro for Nintendo Switch,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,\n030000000d0f00000002000015010000,Hori Switch Split Pad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00006e00000000010000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00006600000000010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00006600000000000000,Horipad FPS Plus 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f0000ee00000000010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000242e0000ff0b000000010000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Mac OS X,\n03000000790000004e95000000010000,Hyperkin N64 Controller Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a5,righty:a2,start:b9,platform:Mac OS X,\n03000000830500006020000000000000,iBuffalo Super Famicom Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Mac OS X,\n03000000ef0500000300000000020000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Mac OS X,\n03000000fd0500000030000010010000,Interact GoPad,a:b3,b:b4,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Mac OS X,\n030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Mac OS X,\n030000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Mac OS X,\n03000000242f00002d00000007010000,JYS Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,\n030000006d04000019c2000000000000,Logitech Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000006d04000016c2000000020000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000006d04000016c2000000030000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000006d04000016c2000014040000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000006d04000016c2000000000000,Logitech F310,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000006d04000018c2000000000000,Logitech F510,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000006d04000019c2000005030000,Logitech F710,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000006d0400001fc2000000000000,Logitech F710,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n030000006d04000018c2000000010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3~,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000380700005032000000010000,Mad Catz PS3 Fightpad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000380700008433000000010000,Mad Catz PS3 Fightstick TE S Plus,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000380700005082000000010000,Mad Catz PS4 Fightpad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000380700008483000000010000,Mad Catz PS4 Fightstick TE S Plus,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000790000000600000007010000,Marvo GT-004,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,\n030000008f0e00001330000011010000,Mayflash Controller Adapter,a:b2,b:b4,back:b16,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b12,lefttrigger:b16,leftx:a0,lefty:a2,rightshoulder:b14,rightx:a6~,righty:a4,start:b18,x:b0,y:b6,platform:Mac OS X,\n03000000790000004318000000010000,Mayflash GameCube Adapter,a:b4,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a12,leftx:a0,lefty:a4,rightshoulder:b28,righttrigger:a16,rightx:a20,righty:a8,start:b36,x:b8,y:b12,platform:Mac OS X,\n03000000790000004418000000010000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000242f00007300000000020000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Mac OS X,\n0300000079000000d218000026010000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,\n03000000d620000010a7000003010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000008f0e00001030000011010000,Mayflash Saturn Adapter,a:b0,b:b2,dpdown:b28,dpleft:b30,dpright:b26,dpup:b24,leftshoulder:b10,lefttrigger:b14,rightshoulder:b12,righttrigger:b4,start:b18,x:b6,y:b8,platform:Mac OS X,\n0300000025090000e803000000000000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Mac OS X,\n03000000790000000318000000010000,Mayflash Wii DolphinBar,a:b8,b:b12,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b44,leftshoulder:b16,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b4,platform:Mac OS X,\n03000000790000000018000000000000,Mayflash Wii U Pro Adapter,a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X,\n03000000790000000018000000010000,Mayflash Wii U Pro Adapter,a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X,\n030000005e0400002800000002010000,Microsoft Dual Strike,a:b3,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,rightx:a0,righty:a1~,start:b5,x:b1,y:b0,platform:Mac OS X,\n030000005e0400000300000006010000,Microsoft SideWinder,a:b0,b:b1,back:b9,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Mac OS X,\n030000005e0400000700000006010000,Microsoft SideWinder,a:b0,b:b1,back:b8,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Mac OS X,\n030000005e0400002700000001010000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Mac OS X,\n030000004523000015e0000072050000,Mobapad Chitu HD,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,\n03000000d62000007162000001000000,Moga Pro 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Mac OS X,\n03000000c62400002a89000000010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c62400002b89000000010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000632500007505000000020000,NeoGeo mini PAD Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b2,y:b3,platform:Mac OS X,\n03000000921200004b46000003020000,NES 2-port Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b11,platform:Mac OS X,\n030000001008000001e5000006010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Mac OS X,\n030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,\n030000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,\n050000007e05000009200000ff070000,Nintendo Switch Pro Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b3,y:b2,platform:Mac OS X,\n030000007e0500001920000001000000,NSO N64 Controller,+rightx:b8,+righty:b7,-rightx:b3,-righty:b2,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,righttrigger:b10,start:b9,platform:Mac OS X,\n030000007e0500001720000001000000,NSO SNES Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b15,start:b9,x:b2,y:b3,platform:Mac OS X,\n03000000550900001472000025050000,NVIDIA Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Mac OS X,\n030000004b120000014d000000010000,Nyko Airflo EX,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Mac OS X,\n030000006f0e00000901000002010000,PDP PS3 Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000008f0e00000300000000000000,Piranha Xtreme PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Mac OS X,\n03000000666600006706000088020000,PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Mac OS X,\n030000004c050000da0c000000010000,PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X,\n030000004c0500003713000000010000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000d620000011a7000000020000,PowerA Core Plus Gamecube Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,\n03000000d620000011a7000010050000,PowerA Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000d62000006dca000000010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000100800000300000006010000,PS2 Adapter,a:b2,b:b1,back:b8,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,\n030000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X,\n030000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X,\n030000004c0500006802000072050000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X,\n030000004c050000a00b000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n030000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n050000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n050000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n030000005e040000e002000001000000,PXN P30 Pro Mobile,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X,\n03000000222c00000225000000010000,Qanba Dragon Arcade Joystick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000222c00000020000000010000,Qanba Drone Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000008916000000fd000000000000,Razer Onza TE,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n03000000321500000204000000010000,Razer Panthera PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000321500000104000000010000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000321500000010000000010000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000321500000507000001010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000321500000011000000010000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000321500000009000000020000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X,\n030000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X,\n0300000032150000030a000000000000,Razer Wildcat,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n03000000632500008005000000010000,Redgear,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,\n030000000d0f0000c100000072050000,Retro Bit Sega Genesis 6B Controller,a:b2,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b8,rightshoulder:b6,righttrigger:b7,start:b9,x:b3,y:b0,platform:Mac OS X,\n03000000921200004547000000020000,Retro Bit Sega Genesis Controller Adapter,a:b0,b:b2,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,lefttrigger:b14,rightshoulder:b10,righttrigger:b4,start:b12,x:b6,y:b8,platform:Mac OS X,\n03000000790000001100000000000000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000790000001100000005010000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b4,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000830500006020000000010000,Retro Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b8,righttrigger:b9,start:b7,x:b2,y:b3,platform:Mac OS X,\n0300000003040000c197000000000000,Retrode Adapter,a:b0,b:b4,back:b2,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b6,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Mac OS X,\n03000000790000001100000006010000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X,\n03000000341200000400000000000000,RetroUSB N64 RetroPort,+rightx:b8,+righty:b10,-rightx:b9,-righty:b11,a:b7,b:b6,dpdown:b2,dpleft:b1,dpright:b0,dpup:b3,leftshoulder:b13,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b12,start:b4,platform:Mac OS X,\n030000006b140000010d000000010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000006b140000130d000000010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000004c0500006802000002100000,Rii RK707,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b2,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b3,righttrigger:b9,rightx:a2,righty:a3,start:b1,x:b15,y:b12,platform:Mac OS X,\n030000006f0e00008701000005010000,Rock Candy Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000c6240000fefa000000000000,Rock Candy PS3,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n03000000e804000000a000001b010000,Samsung EIGP20,a:b1,b:b3,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b11,leftx:a1,lefty:a3,rightshoulder:b12,rightx:a4,righty:a5,start:b16,x:b7,y:b9,platform:Mac OS X,\n03000000730700000401000000010000,Sanwa PlayOnline Mobile,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Mac OS X,\n03000000a30c00002500000006020000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Mac OS X,\n03000000811700007e05000000000000,Sega Saturn,a:b2,b:b4,dpdown:b16,dpleft:b15,dpright:b14,dpup:b17,leftshoulder:b8,lefttrigger:a5,leftx:a0,lefty:a2,rightshoulder:b9,righttrigger:a4,start:b13,x:b0,y:b6,platform:Mac OS X,\n03000000b40400000a01000000000000,Sega Saturn,a:b0,b:b1,back:b5,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b2,leftshoulder:b6,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Mac OS X,\n030000003512000021ab000000000000,SFC30 Joystick,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,\n0300000000f00000f100000000000000,SNES RetroPort,a:b2,b:b3,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b5,rightshoulder:b7,start:b6,x:b0,y:b1,platform:Mac OS X,\n030000004c050000a00b000000000000,Sony DualShock 4 Adapter,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000004c050000cc09000000000000,Sony DualShock 4 V2,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000d11800000094000000010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X,\n030000005e0400008e02000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n03000000110100002014000000000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X,\n03000000110100002014000001000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X,\n03000000381000002014000001000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X,\n05000000484944204465766963650000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X,\n050000004e696d6275732b0000000000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X,\n03000000381000003014000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n03000000381000003114000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n03000000110100001714000000000000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,start:b12,x:b2,y:b3,platform:Mac OS X,\n03000000110100001714000020010000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,start:b12,x:b2,y:b3,platform:Mac OS X,\n030000000d0f0000f600000000010000,Switch Hori Pad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,\n03000000457500002211000000010000,SZMY Power PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000790000001c18000003100000,TGZ Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000591c00002400000021000000,THEC64 Joystick,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Mac OS X,\n03000000591c00002600000021000000,THEGamepad,a:b2,b:b1,back:b6,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Mac OS X,\n030000004f04000015b3000000000000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Mac OS X,\n030000004f0400000ed0000000020000,ThrustMaster eSwap Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Mac OS X,\n03000000571d00002100000021000000,Tomee NES Controller Adapter,a:b1,b:b0,back:b2,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,start:b3,platform:Mac OS X,\n03000000bd12000015d0000000010000,Tomee Retro Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X,\n03000000bd12000015d0000000000000,Tomee SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X,\n03000000571d00002000000021000000,Tomee SNES Controller Adapter,a:b0,b:b1,back:b6,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Mac OS X,\n030000005f140000c501000000020000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,\n03000000100800000100000000000000,Twin USB Joystick,a:b4,b:b2,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b12,leftstick:b20,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b14,rightstick:b22,righttrigger:b10,rightx:a6,righty:a4,start:b18,x:b6,y:b0,platform:Mac OS X,\n03000000632500002605000000010000,Uberwith Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000151900005678000010010000,Uniplay U6,a:b3,b:b6,back:b25,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,leftstick:b31,lefttrigger:b21,leftx:a1,lefty:a3,rightshoulder:b19,rightstick:b33,righttrigger:b23,rightx:a4,righty:a5,start:b27,x:b11,y:b13,platform:Mac OS X,\n030000006f0e00000302000025040000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000006f0e00000702000003060000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,\n050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,back:b7,dpdown:b3,dpleft:b0,dpright:b1,dpup:b2,guide:b8,leftshoulder:b11,lefttrigger:b12,leftx:a0,lefty:a1,start:b6,x:b10,y:b9,platform:Mac OS X,\n050000005769696d6f74652028313800,Wii U Pro Controller,a:b16,b:b15,back:b7,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b8,leftshoulder:b19,leftstick:b23,lefttrigger:b21,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b24,righttrigger:b22,rightx:a2,righty:a3,start:b6,x:b18,y:b17,platform:Mac OS X,\n030000005e0400008e02000000000000,Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n030000006f0e00000104000000000000,Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n03000000c6240000045d000000000000,Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n030000005e0400000a0b000000000000,Xbox Adaptive Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n030000005e040000050b000003090000,Xbox Elite Controller Series 2,a:b0,b:b1,back:b31,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b53,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000130b000011050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000200b000011050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000200b000013050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000200b000015050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000d102000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n030000005e040000dd02000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n030000005e040000e002000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X,\n030000005e040000e002000003090000,Xbox One Controller,a:b0,b:b1,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000e302000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n030000005e040000ea02000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n030000005e040000fd02000003090000,Xbox One Controller,a:b0,b:b1,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c62400003a54000000000000,Xbox One PowerA Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n030000005e040000130b000001050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000130b000009050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000130b000013050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000130b000015050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000172700004431000029010000,XiaoMi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000120c0000100e000000010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000120c0000101e000000010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000005e0400008e02000020010000,8BitDo Adapter,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000c82d00000031000011010000,8BitDo Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00000951000000010000,8BitDo Dogbone,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Linux,\n03000000021000000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00001038000000010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00001251000011010000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00001251000000010000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00001151000011010000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00001151000000010000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000151000000010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00000650000011010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b11,x:b3,y:b4,platform:Linux,\n05000000c82d00005106000000010000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00002090000011010000,8BitDo Micro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00002090000000010000,8BitDo Micro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000451000000010000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Linux,\n03000000c82d00001590000011010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00006928000000010000,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Linux,\n05000000c82d00002590000001000000,8BitDo NEOGEO,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000008000000210000011010000,8BitDo NES30,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n03000000c82d00000310000011010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux,\n05000000c82d00008010000000010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux,\n03000000022000000090000011010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000190000011010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000203800000900000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00002038000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000751000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000c82d00000851000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00000660000011010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00001030000011010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00000660000000010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000020000000000000,8BitDo Pro 2 for Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n06000000c82d00000020000006010000,8BitDo Pro 2 for Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000c82d00000131000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000231000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000331000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000431000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00002867000000010000,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b3,y:b4,platform:Linux,\n05000000c82d00000060000000010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00000061000000010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n030000003512000012ab000010010000,8BitDo SFC30,a:b2,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Linux,\n030000003512000021ab000010010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d000021ab000010010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,\n05000000102800000900000000010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00003028000000010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00000351000000010000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000160000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00001290000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00006228000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000260000011010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00000261000000010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000202800000900000000010000,8BitDo SNES30,a:b1,b:b0,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00001230000000010000,8BitDo Ultimate,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00001530000011010000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00001630000011010000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00001730000011010000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00001130000011010000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00000760000011010000,8BitDo Ultimate Wireless,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00001230000011010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00001330000011010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00000631000014010000,8BitDo Ultimate Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000c82d00000121000011010000,8BitDo Xbox One SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000c82d00000121000000010000,8BitDo Xbox One SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000a00500003232000001000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux,\n05000000a00500003232000008010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00001890000011010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,\n050000005e040000e002000030110000,8BitDo Zero 2,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux,\n05000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c01100000355000011010000,Acrux Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006f0e00008801000011010000,Afterglow Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006f0e00003901000000430000,Afterglow Prismatic Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e00003901000013020000,Afterglow Prismatic Controller 048-007-NA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e00001302000000010000,Afterglow Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e00003901000020060000,Afterglow Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000100000008200000011010000,Akishop Customs PS360,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n030000007c1800000006000010010000,Alienware Dual Compatible Game PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Linux,\n05000000491900000204000021000000,Amazon Fire Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b17,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b12,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000491900001904000011010000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Linux,\n05000000710100001904000000010000,Amazon Luna Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux,\n03000000790000003018000011010000,Arcade Fightstick F300,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n03000000a30c00002700000011010000,Astro City Mini,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,\n03000000a30c00002800000011010000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,\n05000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux,\n05000000050b00000045000040000000,ASUS Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux,\n03000000050b00000579000011010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b36,paddle1:b52,paddle2:b53,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000050b00000679000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b21,paddle1:b22,paddle2:b23,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000503200000110000000000000,Atari Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux,\n03000000503200000110000011010000,Atari Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux,\n05000000503200000110000000000000,Atari Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux,\n05000000503200000110000044010000,Atari Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux,\n05000000503200000110000046010000,Atari Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux,\n03000000503200000210000000000000,Atari Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Linux,\n03000000503200000210000011010000,Atari Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux,\n05000000503200000210000000000000,Atari Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux,\n05000000503200000210000045010000,Atari Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux,\n05000000503200000210000046010000,Atari Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux,\n05000000503200000210000047010000,Atari VCS Modern Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:-a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Linux,\n03000000c62400001b89000011010000,BDA MOGA XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000d62000002a79000011010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000c21100000791000011010000,Be1 GC101 Controller 1.03,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n03000000c31100000791000011010000,Be1 GC101 Controller 1.03,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n030000005e0400008e02000003030000,Be1 GC101 Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000bc2000004d50000011010000,BEITONG A1T2 BFM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000bc2000000055000001000000,BETOP AX1 BFM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000bc2000006412000011010000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b30,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n030000006b1400000209000011010000,Bigben,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000120c0000200e000011010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000120c0000210e000011010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000120c0000f70e000011010000,Brook Universal Fighting Board,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n03000000e82000006058000001010000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n030000000b0400003365000000010000,Competition Pro,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Linux,\n03000000260900008888000000010000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Linux,\n03000000a306000022f6000011010000,Cyborg V3 Rumble,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux,\n03000000791d00000103000010010000,Dual Box Wii Classic Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n030000006f0e00003001000001010000,EA Sports PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000c11100000191000011010000,EasySMX,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n03000000242f00009100000000010000,EasySMX ESM-9101,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006e0500000320000010010000,Elecom U3613M,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Linux,\n030000006e0500000720000010010000,Elecom W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Linux,\n030000007d0400000640000010010000,Eliminator AfterShock,a:b1,b:b2,back:b9,dpdown:+a3,dpleft:-a5,dpright:+a5,dpup:-a3,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a4,righty:a2,start:b8,x:b0,y:b3,platform:Linux,\n03000000430b00000300000000010000,EMS Production PS2 Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Linux,\n030000006f0e00008401000011010000,Faceoff Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006f0e00008101000011010000,Faceoff Deluxe Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006f0e00008001000011010000,Faceoff Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03005036852100000201000010010000,Final Fantasy XIV Online Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000b40400001124000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b14,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000b40400001224000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b2,paddle1:b16,paddle2:b17,paddle3:b14,paddle4:b15,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000151900004000000001000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b14,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n030000007e0500003703000000000000,GameCube Adapter,a:b0,b:b1,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux,\n19000000030000000300000002030000,GameForce Controller,a:b1,b:b0,back:b8,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b14,lefttrigger:b6,leftx:a1,lefty:a0,rightshoulder:b5,rightstick:b15,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux,\n03000000ac0500005b05000010010000,GameSir G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n03000000bc2000000055000011010000,GameSir G3w,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000558500001b06000010010000,GameSir G4 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000ac0500002d0200001b010000,GameSir G4s,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b33,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000ac0500007a05000011010000,GameSir G5,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b16,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000bc2000005656000011010000,GameSir T4w,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000ac0500001a06000011010000,GameSir-T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n030000006f0e00000104000000010000,Gamestop Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000008f0e00000800000010010000,Gasia PlayStation Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n03000000451300000010000010010000,Genius Maxfire Grandias 12,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n190000004b4800000010000000010000,GO-Advance Controller,a:b1,b:b0,back:b10,dpdown:b7,dpleft:b8,dpright:b9,dpup:b6,leftshoulder:b4,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b13,start:b15,x:b2,y:b3,platform:Linux,\n190000004b4800000010000001010000,GO-Advance Controller,a:b1,b:b0,back:b12,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,leftshoulder:b4,leftstick:b13,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b16,righttrigger:b15,start:b17,x:b2,y:b3,platform:Linux,\n190000004b4800000011000000010000,GO-Super Controller,a:b1,b:b0,back:b12,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b16,leftshoulder:b4,leftstick:b14,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b15,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b2,y:b3,platform:Linux,\n03000000f0250000c183000010010000,Goodbetterbest Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n0300000079000000d418000000010000,GPD Win 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400008e02000001010000,GPD Win Max 2 (6800U) Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000007d0400000540000000010000,Gravis Eliminator Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n03000000280400000140000000010000,Gravis GamePad Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n030000008f0e00000610000000010000,GreenAsia Electronics Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Linux,\n030000008f0e00001200000010010000,GreenAsia Joystick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux,\n0500000047532067616d657061640000,GS gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n03000000f0250000c383000010010000,GT VX2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n06000000adde0000efbe000002010000,Hidromancer Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000d81400000862000011010000,HitBox PS3 PC Analog Mode,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b12,x:b0,y:b3,platform:Linux,\n03000000c9110000f055000011010000,HJC Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n030000000d0f00000d00000000010000,Hori,a:b0,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b3,rightshoulder:b7,start:b9,x:b1,y:b2,platform:Linux,\n030000000d0f00006d00000020010000,Hori EDGE 301,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:+a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000000d0f00008400000011010000,Hori Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00005f00000011010000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00005e00000011010000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00005001000009040000,Hori Fighting Commander OCTA Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000000d0f00008500000010010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00008600000002010000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n030000000d0f00003701000013010000,Hori Fighting Stick Mini,a:b1,b:b0,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b3,y:b2,platform:Linux,\n030000000d0f00008800000011010000,Hori Fighting Stick mini 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00008700000011010000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,rightshoulder:b5,rightstick:b11,righttrigger:a4,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00001000000011010000,Hori Fightstick 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n03000000ad1b000003f5000033050000,Hori Fightstick VX,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b8,guide:b10,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux,\n030000000d0f00004d00000011010000,Hori Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000000d0f00003801000011010000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Linux,\n030000000d0f00009200000011010000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00001100000011010000,Hori Real Arcade Pro 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00002200000011010000,Hori Real Arcade Pro 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00006a00000011010000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00006b00000011010000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00001600000000010000,Hori Real Arcade Pro EXSE,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux,\n030000000d0f0000aa00000011010000,Hori Real Arcade Pro for Nintendo Switch,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n030000000d0f00008501000015010000,Hori Switch Split Pad Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000000d0f00006e00000011010000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00006600000011010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f0000ee00000011010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f0000c100000011010000,Horipad Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00006700000001010000,Horipad One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n050000000d0f0000f600000001000000,Horipad Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n03000000341a000005f7000010010000,HuiJia GameCube Controller Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux,\n05000000242e00000b20000001000000,Hyperkin Admiral N64 Controller,+rightx:b11,+righty:b13,-rightx:b8,-righty:b12,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,platform:Linux,\n03000000242e0000ff0b000011010000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Linux,\n03000000242e00006a38000010010000,Hyperkin Trooper 2,a:b0,b:b1,back:b4,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b3,start:b5,platform:Linux,\n03000000242e00008816000001010000,Hyperkin X91,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000f00300008d03000011010000,HyperX Clutch,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000830500006020000010010000,iBuffalo Super Famicom Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux,\n050000006964726f69643a636f6e0000,idroidcon Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000b50700001503000010010000,Impact,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux,\n03000000d80400008200000003000000,IMS PCU0,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b5,x:b3,y:b2,platform:Linux,\n03000000120c00000500000010010000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Linux,\n03000000ef0500000300000000010000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Linux,\n03000000fd0500000030000000010000,InterAct GoPad,a:b3,b:b4,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Linux,\n03000000fd0500002a26000000010000,InterAct HammerHead FX,a:b3,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b2,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b5,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Linux,\n0500000049190000020400001b010000,Ipega PG 9069,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b161,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000632500007505000011010000,Ipega PG 9099,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n0500000049190000030400001b010000,Ipega PG9099,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000491900000204000000000000,Ipega PG9118,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000300f00001001000010010000,Jess Tech Dual Analog Rumble,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux,\n03000000300f00000b01000010010000,Jess Tech GGE909 PC Recoil,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,\n03000000ba2200002010000001010000,Jess Technology Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,\n030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Linux,\n050000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Linux,\n030000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Linux,\n050000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Linux,\n03000000bd12000003c0000010010000,Joypad Alpha Shock,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000242f00002d00000011010000,JYS Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n03000000242f00008a00000011010000,JYS Adapter,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Linux,\n030000006f0e00000103000000020000,Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006d040000d1ca000000000000,Logitech Chillstream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006d040000d1ca000011010000,Logitech Chillstream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006d04000019c2000010010000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006d04000016c2000010010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006d04000016c2000011010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006d0400001dc2000014400000,Logitech F310,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006d0400001ec2000019200000,Logitech F510,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006d0400001ec2000020200000,Logitech F510,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006d04000019c2000011010000,Logitech F710,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006d0400001fc2000005030000,Logitech F710,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006d04000018c2000010010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006d04000011c2000010010000,Logitech WingMan Cordless RumblePad,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b10,rightx:a3,righty:a4,start:b8,x:b3,y:b4,platform:Linux,\n030000006d0400000ac2000010010000,Logitech WingMan RumblePad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,rightx:a3,righty:a4,x:b3,y:b4,platform:Linux,\n05000000380700006652000025010000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000380700008532000010010000,Mad Catz Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n03000000380700005032000011010000,Mad Catz Fightpad Pro PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000380700005082000011010000,Mad Catz Fightpad Pro PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000ad1b00002ef0000090040000,Mad Catz Fightpad SFxT,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Linux,\n03000000380700008034000011010000,Mad Catz Fightstick PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000380700008084000011010000,Mad Catz Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000380700008433000011010000,Mad Catz Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000380700008483000011010000,Mad Catz Fightstick TE S PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000380700001888000010010000,Mad Catz Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000380700003888000010010000,Mad Catz Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:a0,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000380700001647000010040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000380700003847000090040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n03000000ad1b000016f0000090040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000120c00000500000000010000,Manta Dualshock 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux,\n030000008f0e00001330000010010000,Mayflash Controller Adapter,a:b1,b:b2,back:b8,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3~,righty:a2,start:b9,x:b0,y:b3,platform:Linux,\n03000000790000004318000010010000,Mayflash GameCube Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux,\n03000000790000004418000010010000,Mayflash GameCube Controller,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux,\n03000000242f00007300000011010000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Linux,\n0300000079000000d218000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000d620000010a7000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000242f0000f700000001010000,Mayflash Magic S Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000008f0e00001030000010010000,Mayflash Saturn Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:b7,rightshoulder:b6,righttrigger:b2,start:b9,x:b3,y:b4,platform:Linux,\n0300000025090000e803000001010000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux,\n03000000790000000318000011010000,Mayflash Wii DolphinBar,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Linux,\n03000000790000000018000011010000,Mayflash Wii U Pro Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000b50700001203000010010000,Mega World Logic 3 Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux,\n03000000b50700004f00000000010000,Mega World Logic 3 Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Linux,\n03000000780000000600000010010000,Microntek Joystick,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,\n030000005e0400002800000000010000,Microsoft Dual Strike,a:b3,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,rightx:a0,righty:a1~,start:b5,x:b1,y:b0,platform:Linux,\n030000005e0400000300000000010000,Microsoft SideWinder,a:b0,b:b1,back:b9,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Linux,\n030000005e0400000700000000010000,Microsoft SideWinder,a:b0,b:b1,back:b8,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Linux,\n030000005e0400000e00000000010000,Microsoft SideWinder Freestyle Pro,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Linux,\n030000005e0400002700000000010000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Linux,\n030000005e0400008502000000010000,Microsoft Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux,\n030000005e0400008902000021010000,Microsoft Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux,\n030000005e0400008e02000001000000,Microsoft Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.1,dpleft:h0.2,dpright:h0.8,dpup:h0.4,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400008e02000004010000,Microsoft Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400008e02000056210000,Microsoft Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400008e02000062230000,Microsoft Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000d102000001010000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000d102000003020000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000dd02000003020000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000ea02000008040000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n060000005e040000120b000009050000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000e302000003020000,Microsoft Xbox One Elite,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000000b000007040000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b12,paddle2:b14,paddle3:b13,paddle4:b15,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000000b000008040000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b12,paddle2:b14,paddle3:b13,paddle4:b15,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n050000005e040000050b000003090000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e0400008e02000030110000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b13,paddle3:b12,paddle4:b14,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000120b00000b050000,Microsoft Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000030000000300000002000000,Miroof,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux,\n03000000790000001c18000010010000,Mobapad Chitu HD,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000004d4f435554452d3035335800,Mocute 053X,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n05000000e80400006e0400001b010000,Mocute 053X M59,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000004d4f435554452d3035305800,Mocute 054X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000d6200000e589000001000000,Moga 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux,\n05000000d6200000ad0d000001000000,Moga Pro,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux,\n05000000d62000007162000001000000,Moga Pro 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux,\n03000000c62400002b89000011010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000c62400002a89000000010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b22,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000c62400001a89000000010000,MOGA XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000250900006688000000010000,MP8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux,\n030000005e0400008e02000010020000,MSI GC20 V2,a:b0,b:b1,back:b6,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006b1400000906000014010000,Nacon Asymmetric Wireless PS4 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006b140000010c000010010000,Nacon GC 400ES,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n03000000853200000706000012010000,Nacon GC-100,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000000d0f00000900000010010000,Natec Genesis P44,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000004f1f00000800000011010000,NeoGeo PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n0300000092120000474e000000010000,NeoGeo X Arcade Stick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b3,y:b2,platform:Linux,\n03000000790000004518000010010000,Nexilux GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux,\n030000001008000001e5000010010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Linux,\n060000007e0500003713000000000000,Nintendo 3DS,a:b0,b:b1,back:b8,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux,\n030000009b2800008000000020020000,Nintendo Classic Controller,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Linux,\n030000007e0500003703000000016800,Nintendo GameCube Controller,a:b0,b:b2,dpdown:b6,dpleft:b4,dpright:b5,dpup:b7,lefttrigger:a4,leftx:a0,lefty:a1~,rightshoulder:b9,righttrigger:a5,rightx:a2,righty:a3~,start:b8,x:b1,y:b3,platform:Linux,\n03000000790000004618000010010000,Nintendo GameCube Controller Adapter,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a5~,righty:a2~,start:b9,x:b2,y:b3,platform:Linux,\n060000004e696e74656e646f20537700,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,\n060000007e0500000620000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,\n060000007e0500000820000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,\n050000004c69632050726f20436f6e00,Nintendo Switch Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n050000007e0500000620000001800000,Nintendo Switch Left Joy-Con,a:b16,b:b15,back:b4,leftshoulder:b6,leftstick:b12,leftx:a1,lefty:a0~,rightshoulder:b8,start:b9,x:b14,y:b17,platform:Linux,\n030000007e0500000920000000026803,Nintendo Switch Pro Controller,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Linux,\n030000007e0500000920000011810000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,\n050000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n050000007e0500000920000001800000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,\n050000007e0500000720000001800000,Nintendo Switch Right Joy-Con,a:b1,b:b2,back:b9,leftshoulder:b4,leftstick:b10,leftx:a1~,lefty:a0,rightshoulder:b6,start:b8,x:b0,y:b3,platform:Linux,\n05000000010000000100000003000000,Nintendo Wii Remote,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n050000007e0500003003000001000000,Nintendo Wii U Pro Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux,\n030000000d0500000308000010010000,Nostromo n45 Dual Analog,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Linux,\n030000007e0500001920000011810000,NSO N64 Controller,+rightx:b10,+righty:b8,-rightx:b9,-righty:b7,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b3,lefttrigger:b2,leftx:a0,lefty:a1,misc1:b12,rightshoulder:b4,righttrigger:b5,start:b6,platform:Linux,\n050000007e0500001920000001000000,NSO N64 Controller,+rightx:b8,+righty:b7,-rightx:b3,-righty:b2,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,righttrigger:b10,start:b9,platform:Linux,\n050000007e0500001920000001800000,NSO N64 Controller,+rightx:b10,+righty:b8,-rightx:b9,-righty:b7,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b3,lefttrigger:b2,leftx:a0,lefty:a1,misc1:b12,rightshoulder:b4,righttrigger:b5,start:b6,platform:Linux,\n030000007e0500001720000011810000,NSO SNES Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux,\n050000007e0500001720000001000000,NSO SNES Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:b7,rightshoulder:b6,righttrigger:b8,start:b10,x:b3,y:b2,platform:Linux,\n050000007e0500001720000001800000,NSO SNES Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux,\n03000000550900001072000011010000,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,\n03000000550900001472000011010000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux,\n05000000550900001472000001000000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux,\n03000000451300000830000010010000,NYKO CORE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n19000000010000000100000001010000,ODROID Go 2,a:b1,b:b0,dpdown:b7,dpleft:b8,dpright:b9,dpup:b6,guide:b10,leftshoulder:b4,leftstick:b12,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b13,righttrigger:b14,start:b15,x:b2,y:b3,platform:Linux,\n19000000010000000200000011000000,ODROID Go 2,a:b1,b:b0,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b12,leftshoulder:b4,leftstick:b14,lefttrigger:b13,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b15,righttrigger:b16,start:b17,x:b2,y:b3,platform:Linux,\n03000000c0160000dc27000001010000,OnyxSoft Dual JoyDivision,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,platform:Linux,\n05000000362800000100000002010000,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux,\n05000000362800000100000003010000,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux,\n05000000362800000100000004010000,OUYA Controller,a:b0,b:b3,back:b14,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b13,rightx:a3,righty:a4,start:b16,x:b1,y:b2,platform:Linux,\n03000000830500005020000010010000,Padix Rockfire PlayStation Bridge,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b2,y:b3,platform:Linux,\n03000000ff1100003133000010010000,PC Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n030000006f0e0000b802000001010000,PDP Afterglow Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e0000b802000013020000,PDP Afterglow Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e00006401000001010000,PDP Battlefield One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e0000d702000006640000,PDP Black Camo Wired Xbox Series X Controller,a:b0,b:b1,back:b6,dpdown:b13,dpleft:b14,dpright:b13,dpup:b14,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e00003101000000010000,PDP EA Sports Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e00008501000011010000,PDP Fightpad Pro Gamecube Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n030000006f0e0000c802000012010000,PDP Kingdom Hearts Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e00002801000011010000,PDP PS3 Rock Candy Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006f0e00000901000011010000,PDP PS3 Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n03000000ad1b000004f9000000010000,PDP Xbox 360 Versus Fighting,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e0000a802000023020000,PDP Xbox One Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n030000006f0e0000a702000023020000,PDP Xbox One Raven Black,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e0000d802000006640000,PDP Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e0000ef02000007640000,PDP Xbox Series Kinetic Wired Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000666600006706000000010000,PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Linux,\n030000004c050000da0c000011010000,PlayStation Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,\n03000000d9040000160f000000010000,PlayStation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,\n030000004c0500003713000011010000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux,\n03000000c62400000053000000010000,PowerA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000c62400003a54000001010000,PowerA 1428124-01,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000d620000011a7000011010000,PowerA Core Plus Gamecube Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n03000000dd62000015a7000011010000,PowerA Fusion Nintendo Switch Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000d620000012a7000011010000,PowerA Fusion Nintendo Switch Fight Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000d62000000140000001010000,PowerA Fusion Pro 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000dd62000016a7000000000000,PowerA Fusion Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000c62400001a53000000010000,PowerA Mini Pro Ex,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000d620000013a7000011010000,PowerA Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000d62000006dca000011010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000d620000014a7000011010000,PowerA Spectra Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000c62400001a58000001010000,PowerA Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000d62000000220000001010000,PowerA Xbox One Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux,\n03000000d62000000228000001010000,PowerA Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000c62400001a54000001010000,PowerA Xbox One Mini Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000d62000000240000001010000,PowerA Xbox One Spectra Infinity,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000d62000000f20000001010000,PowerA Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b7,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006d040000d2ca000011010000,Precision Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000ff1100004133000010010000,PS2 Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,\n03000000341a00003608000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000004c0500006802000010010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux,\n030000004c0500006802000010810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n030000004c0500006802000011010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux,\n030000004c0500006802000011810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n030000005f1400003102000010010000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n030000006f0e00001402000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000008f0e00000300000010010000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n050000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux,\n050000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:a12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:a13,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux,\n050000004c0500006802000000800000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n050000004c0500006802000000810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n05000000504c415953544154494f4e00,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux,\n060000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux,\n030000004c050000a00b000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n030000004c050000a00b000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n030000004c050000c405000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n030000004c050000c405000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n030000004c050000cc09000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n030000004c050000cc09000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n03000000c01100000140000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n050000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n050000004c050000c405000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n050000004c050000c405000001800000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n050000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n050000004c050000cc09000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n050000004c050000cc09000001800000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n030000004c050000e60c000011010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n030000004c050000e60c000011810000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n030000004c050000f20d000011010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n050000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n050000004c050000e60c000000810000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n050000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n03000000300f00001211000011010000,Qanba Arcade Joystick,a:b2,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b9,x:b1,y:b3,platform:Linux,\n03000000222c00000225000011010000,Qanba Dragon Arcade Joystick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000222c00000025000011010000,Qanba Dragon Arcade Joystick (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000222c00000020000011010000,Qanba Drone Arcade PS4 Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,rightshoulder:b5,righttrigger:a4,start:b9,x:b0,y:b3,platform:Linux,\n03000000300f00001210000010010000,Qanba Joystick Plus,a:b0,b:b1,back:b8,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,start:b9,x:b2,y:b3,platform:Linux,\n03000000222c00000223000011010000,Qanba Obsidian Arcade Joystick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000222c00000023000011010000,Qanba Obsidian Arcade Joystick (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n030000009b2800000300000001010000,Raphnet 4nes4snes,a:b0,b:b4,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Linux,\n030000009b2800004200000001010000,Raphnet Dual NES Adapter,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Linux,\n030000009b2800003200000001010000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux,\n030000009b2800006000000001010000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux,\n03000000f8270000bf0b000011010000,Razer Kishi,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n030000008916000001fd000024010000,Razer Onza Classic Edition,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000321500000204000011010000,Razer Panthera PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000321500000104000011010000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000321500000810000011010000,Razer Panthera PS4 Evo Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000321500000010000011010000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000321500000507000000010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000321500000a10000001000000,Razer Raiju Tournament Edition,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000321500000011000011010000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n030000008916000000fe000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000c6240000045d000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000c6240000045d000025010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000321500000009000011010000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,\n050000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,\n0300000032150000030a000001010000,Razer Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000321500000b10000011010000,Razer Wolverine PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n03000000790000001100000010010000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Linux,\n0300000003040000c197000011010000,Retrode Adapter,a:b0,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Linux,\n190000004b4800000111000000010000,RetroGame Joypad,a:b1,b:b0,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n0300000081170000990a000001010000,Retronic Adapter,a:b0,leftx:a0,lefty:a1,platform:Linux,\n0300000000f000000300000000010000,RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux,\n00000000526574726f53746f6e653200,RetroStone 2 Controller,a:b1,b:b0,back:b10,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,righttrigger:b9,start:b11,x:b4,y:b3,platform:Linux,\n03000000341200000400000000010000,RetroUSB N64 RetroPort,+rightx:b8,+righty:b10,-rightx:b9,-righty:b11,a:b7,b:b6,dpdown:b2,dpleft:b1,dpright:b0,dpup:b3,leftshoulder:b13,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b12,start:b4,platform:Linux,\n030000006b140000010d000011010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n030000006b140000130d000011010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n030000006f0e00001f01000000010000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e00008701000011010000,Rock Candy Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006f0e00001e01000011010000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000c6240000fefa000000010000,Rock Candy Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e00004601000001010000,Rock Candy Xbox One Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000a306000023f6000011010000,Saitek Cyborg V1 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux,\n03000000a30600001005000000010000,Saitek P150,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b2,righttrigger:b5,x:b3,y:b4,platform:Linux,\n03000000a30600000701000000010000,Saitek P220,a:b2,b:b3,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,x:b0,y:b1,platform:Linux,\n03000000a30600000cff000010010000,Saitek P2500 Force Rumble,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b0,y:b1,platform:Linux,\n03000000a30600000c04000011010000,Saitek P2900,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b12,x:b0,y:b3,platform:Linux,\n03000000a306000018f5000010010000,Saitek P3200 Rumble,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux,\n03000000300f00001201000010010000,Saitek P380,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux,\n03000000a30600000901000000010000,Saitek P880,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,x:b0,y:b1,platform:Linux,\n03000000a30600000b04000000010000,Saitek P990 Dual Analog,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b8,x:b0,y:b3,platform:Linux,\n03000000a306000020f6000011010000,Saitek PS2700 Rumble,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux,\n05000000e804000000a000001b010000,Samsung EIGP20,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000d81d00000e00000010010000,Savior,a:b0,b:b1,back:b8,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,start:b9,x:b4,y:b5,platform:Linux,\n03000000a30c00002500000011010000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Linux,\n03000000790000001100000011010000,Sega Saturn,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b4,start:b9,x:b0,y:b3,platform:Linux,\n03000000790000002201000011010000,Sega Saturn,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux,\n03000000b40400000a01000000010000,Sega Saturn,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Linux,\n030000001f08000001e4000010010000,SFC Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Linux,\n03000000632500002305000010010000,ShanWan Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n03000000632500002605000010010000,Shanwan Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000632500007505000010010000,Shanwan Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n03000000bc2000000055000010010000,Shanwan Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000f025000021c1000010010000,Shanwan Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n03000000341a00000908000010010000,SL6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n050000004c050000cc09000001000000,Sony DualShock 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000ff000000cb01000010010000,Sony PlayStation Portable,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux,\n03000000250900000500000000010000,Sony PS2 pad with SmartJoy Adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux,\n030000005e0400008e02000073050000,Speedlink Torid,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400008e02000020200000,SpeedLink Xeox Pro Analog,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000d11800000094000011010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,\n05000000d11800000094000000010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,\n03000000de2800000112000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux,\n03000000de2800000112000011010000,Steam Controller,a:b2,b:b3,back:b10,dpdown:+a5,dpleft:-a4,dpright:+a4,dpup:-a5,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,paddle1:b15,paddle2:b16,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a3,start:b11,x:b4,y:b5,platform:Linux,\n03000000de2800000211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux,\n03000000de2800000211000011010000,Steam Controller,a:b2,b:b3,back:b10,dpdown:b18,dpleft:b19,dpright:b20,dpup:b17,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b16,paddle2:b15,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b5,platform:Linux,\n03000000de2800004211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux,\n03000000de2800004211000011010000,Steam Controller,a:b2,b:b3,back:b10,dpdown:b18,dpleft:b19,dpright:b20,dpup:b17,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,paddle1:b16,paddle2:b15,rightshoulder:b7,righttrigger:a6,rightx:a2,righty:a3,start:b11,x:b4,y:b5,platform:Linux,\n03000000de280000fc11000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n05000000de2800000212000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux,\n05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux,\n05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux,\n03000000de2800000512000010010000,Steam Deck,a:b3,b:b4,back:b11,dpdown:b17,dpleft:b18,dpright:b19,dpup:b16,guide:b13,leftshoulder:b7,leftstick:b14,lefttrigger:a9,leftx:a0,lefty:a1,rightshoulder:b8,rightstick:b15,righttrigger:a8,rightx:a2,righty:a3,start:b12,x:b5,y:b6,platform:Linux,\n03000000de280000ff11000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n050000004e696d6275732b0000000000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b10,guide:b11,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b12,x:b2,y:b3,platform:Linux,\n03000000381000003014000075010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000381000003114000075010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n0500000011010000311400001b010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b32,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000110100001914000009010000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000ad1b000038f0000090040000,Street Fighter IV Fightstick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000003b07000004a1000000010000,Suncom SFX Plus,a:b0,b:b2,back:b7,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b9,righttrigger:b5,start:b8,x:b1,y:b3,platform:Linux,\n03000000666600000488000000010000,Super Joy Box 5 Pro,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux,\n0300000000f00000f100000000010000,Super RetroPort,a:b1,b:b5,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux,\n030000008f0e00000d31000010010000,SZMY Power 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000457500000401000011010000,SZMY Power DS4 Wired Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000457500002211000010010000,SZMY Power Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n030000008f0e00001431000010010000,SZMY Power PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000ba2200000701000001010000,Technology Innovation PS2 Adapter,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b2,platform:Linux,\n03000000790000001c18000011010000,TGZ Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000591c00002400000010010000,THEC64 Joystick,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux,\n03000000591c00002600000010010000,THEGamepad,a:b2,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Linux,\n030000004f04000015b3000001010000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux,\n030000004f04000015b3000010010000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux,\n030000004f04000020b3000010010000,Thrustmaster Dual Trigger,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux,\n030000004f04000023b3000000010000,Thrustmaster Dual Trigger PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n030000004f0400000ed0000011010000,Thrustmaster eSwap Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000b50700000399000000010000,Thrustmaster Firestorm Digital 2,a:b2,b:b4,back:b11,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,rightstick:b0,righttrigger:b9,start:b1,x:b3,y:b5,platform:Linux,\n030000004f04000003b3000010010000,Thrustmaster Firestorm Dual Analog 2,a:b0,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b9,rightx:a2,righty:a3,x:b1,y:b3,platform:Linux,\n030000004f04000000b3000010010000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Linux,\n030000004f04000004b3000010010000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux,\n030000004f04000026b3000002040000,Thrustmaster GP XID,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000c6240000025b000002020000,Thrustmaster GPX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000004f04000008d0000000010000,Thrustmaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n030000004f04000009d0000000010000,Thrustmaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000004f04000007d0000000010000,Thrustmaster T Mini,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000004f04000012b3000010010000,Thrustmaster Vibrating Gamepad,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux,\n03000000571d00002000000010010000,Tomee SNES Adapter,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux,\n03000000bd12000015d0000010010000,Tomee SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Linux,\n03000000d814000007cd000011010000,Toodles 2008 Chimp PC PS3,a:b0,b:b1,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux,\n030000005e0400008e02000070050000,Torid,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000c01100000591000011010000,Torid,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n03000000680a00000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux,\n03000000780300000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux,\n03000000e00d00000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux,\n03000000f00600000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux,\n030000005f140000c501000010010000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n06000000f51000000870000003010000,Turtle Beach Recon,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000100800000100000010010000,Twin PS2 Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,\n03000000151900005678000010010000,Uniplay U6,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000100800000300000010010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,\n03000000790000000600000007010000,USB gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Linux,\n03000000790000001100000000010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:a0,dpleft:a1,dpright:a2,dpup:a4,start:b9,platform:Linux,\n030000006f0e00000302000011010000,Victrix Pro Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n030000006f0e00000702000011010000,Victrix Pro Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n05000000ac0500003232000001000000,VR Box Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux,\n05000000434f4d4d414e440000000000,VX Gaming Command Series,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n0000000058626f782033363020576900,Xbox 360 Controller,a:b0,b:b1,back:b14,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b7,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux,\n030000005e0400001907000000010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400008e02000010010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400008e02000014010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400009102000007010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000a102000000010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000a102000007010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000a102000030060000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400008e02000000010000,Xbox 360 EasySMX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000a102000014010000,Xbox 360 Receiver,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400000202000000010000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux,\n030000006f0e00001304000000010000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000ffff0000ffff000000010000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux,\n0000000058626f782047616d65706100,Xbox Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400000a0b000005040000,Xbox One Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux,\n030000005e040000d102000002010000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000ea02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000ea02000001030000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n050000005e040000e002000003090000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n050000005e040000fd02000003090000,Xbox One Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000fd02000030110000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n050000005e040000e302000002090000,Xbox One Elite,a:b0,b:b1,back:b136,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000220b000013050000,Xbox One Elite 2 Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000050b000002090000,Xbox One Elite Series 2,a:b0,b:b1,back:b136,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n030000005e040000ea02000011050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n060000005e040000ea0200000b050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n060000005e040000ea0200000d050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000120b000001050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000120b000005050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000120b000007050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000120b000009050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000120b00000d050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000120b00000f050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000130b000001050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000130b000007050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000130b000009050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000130b000011050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000130b000013050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000130b000015050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n060000005e040000120b000007050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n060000005e040000120b00000b050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n060000005e040000120b00000f050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n060000005e040000120b00000d050000,Xbox Series X Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n050000005e040000200b000013050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000450c00002043000010010000,XEOX SL6556 BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n05000000172700004431000029010000,XiaoMi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Linux,\n03000000c0160000e105000001010000,XinMo Dual Arcade,a:b4,b:b3,back:b6,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b9,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b1,y:b0,platform:Linux,\nxinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000120c0000100e000011010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000120c0000101e000011010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n38653964633230666463343334313533,8BitDo Adapter,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n36666264316630653965636634386234,8BitDo Adapter 2,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n38426974446f20417263616465205374,8BitDo Arcade Stick,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b5,leftshoulder:b9,lefttrigger:a4,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n61393962646434393836356631636132,8BitDo Arcade Stick,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android,\n64323139346131306233636562663738,8BitDo Arcade Stick,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android,\n64643565386136613265663236636564,8BitDo Arcade Stick,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android,\n33313433353539306634656436353432,8BitDo Dogbone,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n38426974446f20446f67626f6e65204d,8BitDo Dogbone,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android,\n34343439373236623466343934376233,8BitDo FC30 Pro,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b28,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b29,righttrigger:b7,start:b5,x:b30,y:b2,platform:Android,\n38426974446f2038426974446f204c69,8BitDo Lite,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n30643332373663313263316637356631,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38426974446f204c6974652032000000,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n62656331626461363634633735353032,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38393936616436383062666232653338,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38426974446f204c6974652053450000,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n39356430616562366466646636643435,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n05000000c82d000006500000ffff3f00,8BitDo M30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b17,leftshoulder:b9,lefttrigger:a5,rightshoulder:b10,righttrigger:a4,start:b6,x:b3,y:b2,platform:Android,\n05000000c82d000051060000ffff3f00,8BitDo M30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b17,leftshoulder:b9,lefttrigger:a4,rightshoulder:b10,righttrigger:a5,start:b6,x:b3,y:b2,platform:Android,\n32323161363037623637326438643634,8BitDo M30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n33656266353630643966653238646264,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,start:b10,x:b19,y:b2,platform:Android,\n38426974446f204d3330204d6f646b69,8BitDo M30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n39366630663062373237616566353437,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,start:b6,x:b2,y:b3,platform:Android,\n64653533313537373934323436343563,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,start:b6,x:b2,y:b3,platform:Android,\n66356438346136366337386437653934,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,start:b18,x:b19,y:b2,platform:Android,\n66393064393162303732356665666366,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,start:b6,x:b2,y:b3,platform:Android,\n38426974446f204d6963726f2067616d,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android,\n61653365323561356263373333643266,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android,\n62613137616239666338343866326336,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android,\n33663431326134333366393233616633,8BitDo N30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android,\n38426974446f204e3330204d6f646b69,8BitDo N30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android,\n05000000c82d000015900000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n05000000c82d000065280000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b17,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38323035343766666239373834336637,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,platform:Android,\n38426974446f204e3634204d6f646b69,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,platform:Android,\n32363135613966656338666638666237,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n35363534633333373639386466346631,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n38426974446f204e454f47454f204750,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n39383963623932353561633733306334,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000000220000000900000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n050000002038000009000000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38313433643131656262306631373166,8BitDo P30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n38326536643339353865323063616339,8BitDo P30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n38426974446f2050333020636c617373,8BitDo P30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n35376664343164386333616535333434,8BitDo Pro 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,start:b10,x:b19,y:b2,platform:Android,\n38426974446f2038426974446f205072,8BitDo Pro 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38426974446f2050726f203200000000,8BitDo Pro 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n62373739366537363166326238653463,8BitDo Pro 2,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b3,y:b2,platform:Android,\n38386464613034326435626130396565,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38426974446f2038426974446f205265,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n66303230343038613365623964393766,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38426974446f20533330204d6f646b69,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n66316462353561376330346462316137,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n05000000c82d000000600000ffff3f00,8BitDo SF30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n05000000c82d000000610000ffff3f00,8BitDo SF30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38426974646f20534633302050726f00,8BitDo SF30 Pro,a:b1,b:b0,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b17,platform:Android,\n61623334636338643233383735326439,8BitDo SFC30,a:b0,b:b1,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b31,start:b5,x:b30,y:b2,platform:Android,\n05000000c82d000012900000ffff3f00,8BitDo SN30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android,\n05000000c82d000062280000ffff3f00,8BitDo SN30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android,\n38316230613931613964356666353839,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38426974446f20534e3330204d6f646b,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n65323563303231646531383162646335,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n35383531346263653330306238353131,8BitDo SN30 PP,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n05000000c82d000001600000ffff3f00,8BitDo SN30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n05000000c82d000002600000ffff0f00,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b17,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n36653638656632326235346264663661,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android,\n38303232393133383836366330346462,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android,\n38346630346135363335366265656666,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38426974446f20534e33302050726f2b,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n536f6e7920436f6d707574657220456e,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n66306331643531333230306437353936,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n050000002028000009000000ffff3f00,8BitDo SNES30,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n050000003512000020ab000000780f00,8BitDo SNES30,a:b21,b:b20,back:b30,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b26,rightshoulder:b27,start:b31,x:b24,y:b23,platform:Android,\n33666663316164653937326237613331,8BitDo Zero,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android,\n38426974646f205a65726f2047616d65,8BitDo Zero,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android,\n05000000c82d000018900000ffff0f00,8BitDo Zero 2,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android,\n05000000c82d000030320000ffff0f00,8BitDo Zero 2,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android,\n33663434393362303033616630346337,8BitDo Zero 2,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,\n34656330626361666438323266633963,8BitDo Zero 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android,\n63396666386564393334393236386630,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android,\n63633435623263373466343461646430,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android,\n32333634613735616163326165323731,Amazon Luna Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android,\n417374726f2063697479206d696e6920,Astro City Mini,a:b23,b:b22,back:b29,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b25,righttrigger:b26,start:b30,x:b24,y:b21,platform:Android,\n35643263313264386134376362363435,Atari VCS Classic Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,start:b6,platform:Android,\n32353831643566306563643065356239,Atari VCS Modern Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n32303165626138343962363666346165,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,\n38383337343564366131323064613561,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,\n34313430343161653665353737323365,Elecom JC-W01U,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android,\n4875694a6961204a432d573031550000,Elecom JC-W01U,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android,\n30363230653635633863366338623265,Evo VR,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,x:b2,y:b3,platform:Android,\n05000000b404000011240000dfff3f00,Flydigi Vader 2,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n05000000bc20000000550000ffff3f00,GameSir G3w,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n34323662653333636330306631326233,Google Nexus,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n35383633353935396534393230616564,Google Stadia Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n05000000d6020000e5890000dfff3f00,GPD XD Plus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android,\n05000000d6020000e5890000dfff3f80,GPD XD Plus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a3,rightx:a4,righty:a5,start:b6,x:b2,y:b3,platform:Android,\n66633030656131663837396562323935,Hori Battle,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,\n35623466343433653739346434636330,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,\n484f524920434f2e2c4c54442e203130,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,\n484f524920434f2e2c4c544420205041,Hori Gem Pad 3,a:b1,b:b17,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b0,y:b2,platform:Android,\n65656436646661313232656661616130,Hori PC Engine Mini Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b18,platform:Android,\n31303433326562636431653534636633,Hori Real Arcade Pro 3,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,\n32656664353964393561366362333636,Hori Switch Split Pad Pro,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,\n30306539356238653637313730656134,HORIPAD Switch Pro Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android,\n48797065726b696e2050616400000000,Hyperkin Admiral N64 Controller,+rightx:b6,+righty:b7,-rightx:b17,-righty:b5,a:b1,b:b0,leftshoulder:b3,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,platform:Android,\n62333331353131353034386136626636,Hyperkin Admiral N64 Controller,+rightx:b6,+righty:b7,-rightx:b17,-righty:b5,a:b1,b:b0,leftshoulder:b3,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,platform:Android,\n31306635363562663834633739396333,Hyperkin N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android,\n5368616e57616e202020202048797065,Hyperkin N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android,\n0500000083050000602000000ffe0000,iBuffalo SNES Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b15,rightshoulder:b16,start:b10,x:b2,y:b3,platform:Android,\n5553422c322d6178697320382d627574,iBuffalo Super Famicom Controller,a:b1,b:b0,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,rightshoulder:b18,start:b10,x:b3,y:b2,platform:Android,\n64306137363261396266353433303531,InterAct GoPad,a:b24,b:b25,leftshoulder:b23,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,x:b21,y:b22,platform:Android,\n532e542e442e20496e74657261637420,InterAct HammerHead FX,a:b23,b:b24,back:b30,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,leftstick:b22,lefttrigger:b28,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b25,righttrigger:b29,rightx:a2,righty:a3,start:b31,x:b20,y:b21,platform:Android,\n65346535636333663931613264643164,Joy-Con,a:b21,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b23,y:b24,platform:Android,\n33346566643039343630376565326335,Joy-Con (L),a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android,\n35313531613435623366313835326238,Joy-Con (L),a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android,\n4a6f792d436f6e20284c290000000000,Joy-Con (L),a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android,\n38383665633039363066383334653465,Joy-Con (R),a:b0,b:b1,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,\n39363561613936303237333537383931,Joy-Con (R),a:b0,b:b1,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,\n4a6f792d436f6e202852290000000000,Joy-Con (R),a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,\n39656136363638323036303865326464,JYS Aapter,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,\n63316564383539663166353034616434,JYS Adapter,a:b1,b:b3,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b0,y:b2,platform:Android,\n64623163333561643339623235373232,Logitech F310,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n35623364393661626231343866613337,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n4c6f6769746563682047616d65706164,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n64396331333230326333313330336533,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n39653365373864633935383236363438,Logitech G Cloud,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n416d617a6f6e2047616d6520436f6e74,Luna Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,\n4c756e612047616d6570616400000000,Luna Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n30363066623539323534363639323363,Magic NS,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,\n31353762393935386662336365626334,Magic NS,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,\n39623565346366623931666633323530,Magic NS,a:b1,b:b3,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b0,y:b2,platform:Android,\n6d6179666c617368206c696d69746564,Mayflash GameCube Adapter,a:b22,b:b21,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a5,righty:a2,start:b30,x:b23,y:b24,platform:Android,\n436f6e74726f6c6c6572000000000000,Mayflash N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android,\n65666330633838383061313633326461,Mayflash N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android,\n37316565396364386635383230353365,Mayflash Saturn Adapter,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android,\n4875694a696120205553422047616d65,Mayflash Saturn Adapter,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android,\n535a4d792d706f776572204c54442043,Mayflash Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b31,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android,\n30653962643666303631376438373532,Mayflash Wii DolphinBar,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b0,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android,\n39346131396233376535393665363161,Mayflash Wii U Pro Adapter,a:b22,b:b23,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,leftstick:b31,lefttrigger:b27,rightshoulder:b26,rightstick:b0,righttrigger:b28,rightx:a0,righty:a1,start:b30,x:b21,y:b24,platform:Android,\n31323564663862633234646330373138,Mega Drive,a:b23,b:b22,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b25,righttrigger:b26,start:b30,x:b24,y:b21,platform:Android,\n37333564393261653735306132613061,Mega Drive,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android,\n64363363336633363736393038313464,Mega Drive,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b2,y:b3,platform:Android,\n33323763323132376537376266393366,Microsoft Dual Strike,a:b24,b:b23,back:b25,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b29,rightshoulder:b78,rightx:a0,righty:a1~,start:b26,x:b22,y:b21,platform:Android,\n30306461613834333439303734316539,Microsoft SideWinder Pro,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b20,lefttrigger:b9,rightshoulder:b19,righttrigger:b10,start:b17,x:b2,y:b3,platform:Android,\n32386235353630393033393135613831,Microsoft Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n4d4f42415041442050726f2d48440000,Mobapad Chitu HD,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n4d4f435554452d303533582d4d35312d,Mocute 053X,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n33343361376163623438613466616531,Mocute M053,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n39306635663061636563316166303966,Mocute M053,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n7573622067616d657061642020202020,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Android,\n050000007e05000009200000ffff0f00,Nintendo Switch Pro Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b17,y:b2,platform:Android,\n34323437396534643531326161633738,Nintendo Switch Pro Controller,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,misc1:b5,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n50726f20436f6e74726f6c6c65720000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b2,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b10,rightx:a2,righty:a3,start:b18,y:b3,platform:Android,\n36326533353166323965623661303933,NSO N64 Controller,+rightx:b17,+righty:b10,-rightx:b2,-righty:b19,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,righttrigger:b15,start:b18,platform:Android,\n4e363420436f6e74726f6c6c65720000,NSO N64 Controller,+rightx:b17,+righty:b10,-rightx:b2,-righty:b19,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,righttrigger:b15,start:b18,platform:Android,\n534e455320436f6e74726f6c6c657200,NSO SNES Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,\n64623863346133633561626136366634,NSO SNES Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,\n050000005509000003720000cf7f3f00,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000005509000010720000ffff3f00,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000005509000014720000df7f3f00,NVIDIA Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android,\n050000005509000014720000df7f3f80,NVIDIA Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a3,rightx:a4,righty:a5,start:b6,x:b2,y:b3,platform:Android,\n37336435666338653565313731303834,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n4e564944494120436f72706f72617469,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n61363931656135336130663561616264,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n39383335313438623439373538343266,OUYA Controller,a:b0,b:b2,dpdown:b18,dpleft:b15,dpright:b16,dpup:b17,leftshoulder:b3,leftstick:b9,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,x:b1,y:b19,platform:Android,\n4f5559412047616d6520436f6e74726f,OUYA Controller,a:b0,b:b2,dpdown:b18,dpleft:b15,dpright:b6,dpup:b17,leftshoulder:b3,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b19,platform:Android,\n506572666f726d616e63652044657369,PDP PS3 Rock Candy Controller,a:b1,b:b17,back:h0.2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b0,y:b2,platform:Android,\n62653335326261303663356263626339,PlayStation Classic Controller,a:b19,b:b1,back:b17,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,lefttrigger:b3,rightshoulder:b10,righttrigger:b20,start:b18,x:b2,y:b0,platform:Android,\n536f6e7920496e746572616374697665,PlayStation Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n576972656c65737320436f6e74726f6c,PlayStation Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n61653962353232366130326530363061,Pokken,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,rightshoulder:b20,righttrigger:b10,start:b18,x:b0,y:b2,platform:Android,\n32666633663735353234363064386132,PS2,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a3,righty:a2,start:b30,x:b24,y:b21,platform:Android,\n050000004c05000068020000dfff3f00,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n536f6e7920504c415953544154494f4e,PS3 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n61363034663839376638653463633865,PS3 Controller,a:b0,b:b1,back:b15,dpdown:a14,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n66366539656564653432353139356536,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n66383132326164626636313737373037,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000004c050000c405000000783f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000004c050000c4050000fffe3f00,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android,\n050000004c050000c4050000fffe3f80,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a3,rightx:a4,righty:a5,start:b16,x:b0,y:b2,platform:Android,\n050000004c050000c4050000ffff3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000004c050000cc090000fffe3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000004c050000cc090000ffff3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n30303839663330346632363232623138,PS4 Controller,a:b1,b:b17,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android,\n31326235383662333266633463653332,PS4 Controller,a:b1,b:b16,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b17,x:b0,y:b2,platform:Android,\n31373231336561636235613666323035,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n31663838336334393132303338353963,PS4 Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n34613139376634626133336530386430,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n35643031303033326130316330353564,PS4 Controller,a:b1,b:b17,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android,\n37626233336235343937333961353732,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n37626464343430636562316661643863,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n38393161636261653636653532386639,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n63313733393535663339656564343962,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n63393662363836383439353064663939,PS4 Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n65366465656364636137653363376531,PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,\n66613532303965383534396638613230,PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,\n050000004c050000e60c0000fffe3f00,PS5 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android,\n050000004c050000e60c0000fffe3f80,PS5 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a3,rightx:a4,righty:a5,start:b16,x:b0,y:b2,platform:Android,\n050000004c050000e60c0000ffff3f00,PS5 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n32346465346533616263386539323932,PS5 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n32633532643734376632656664383733,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,\n37363764353731323963323639666565,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,\n61303162353165316365336436343139,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,\n64336263393933626535303339616332,Qanba 4RAF,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android,\n36626666353861663864336130363137,Razer Junglecat,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n05000000f8270000bf0b0000ffff3f00,Razer Kishi,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n62653861643333663663383332396665,Razer Kishi,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000003215000005070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000003215000007070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000003215000000090000bf7f3f00,Razer Serval,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android,\n5a6869587520526574726f2042697420,Retro Bit Saturn Controller,a:b21,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b26,rightshoulder:b27,righttrigger:b28,start:b30,x:b23,y:b24,platform:Android,\n32417865732031314b6579732047616d,Retro Bit SNES Controller,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android,\n36313938306539326233393732613361,Retro Bit SNES Controller,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android,\n526574726f466c616720576972656420,Retro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,rightshoulder:b18,start:b10,x:b2,y:b3,platform:Android,\n61343739353764363165343237303336,Retro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,lefttrigger:b18,leftx:a0,lefty:a1,start:b10,x:b2,y:b3,platform:Android,\n526574726f696420506f636b65742043,Retroid Pocket,a:b1,b:b0,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n582d426f7820436f6e74726f6c6c6572,Retroid Pocket,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n38653130373365613538333235303036,Retroid Pocket 2,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n64363363336633363736393038313463,Retrolink,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b6,platform:Android,\n37393234373533633333323633646531,RetroUSB N64 RetroPort,+rightx:b17,+righty:b15,-rightx:b18,-righty:b6,a:b10,b:b9,dpdown:b19,dpleft:b1,dpright:b0,dpup:b2,leftshoulder:b7,lefttrigger:b20,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Android,\n5365616c6965436f6d707574696e6720,RetroUSB N64 RetroPort,+rightx:b17,+righty:b15,-rightx:b18,-righty:b6,a:b10,b:b9,dpdown:b19,dpleft:b1,dpright:b0,dpup:b2,leftshoulder:b7,lefttrigger:b20,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Android,\n526574726f5553422e636f6d20534e45,RetroUSB SNES RetroPort,a:b1,b:b20,back:b19,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b2,x:b0,y:b3,platform:Android,\n64643037633038386238303966376137,RetroUSB SNES RetroPort,a:b1,b:b20,back:b19,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b2,x:b0,y:b3,platform:Android,\n37656564346533643138636436356230,Rock Candy Switch Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,\n33373336396634316434323337666361,RumblePad 2,a:b22,b:b23,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b24,platform:Android,\n36363537303435333566386638366333,Samsung EIGP20,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n53616d73756e672047616d6520506164,Samsung EIGP20,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n66386565396238363534313863353065,Sanwa PlayOnline Mobile,a:b21,b:b22,back:b23,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b24,platform:Android,\n32383165316333383766336338373261,Saturn,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android,\n38613865396530353338373763623431,Saturn,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,lefttrigger:b10,rightshoulder:b20,righttrigger:b19,start:b17,x:b2,y:b3,platform:Android,\n61316232336262373631343137633631,Saturn,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android,\n30353835333338613130373363646337,SG H510,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android,\n66386262366536653765333235343634,SG H510,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android,\n66633132393363353531373465633064,SG H510,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android,\n62653761636366393366613135366338,SN30 PP,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38376662666661636265313264613039,SNES,a:b0,b:b1,back:b9,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android,\n5346432f555342205061640000000000,SNES Adapter,a:b0,b:b1,back:b9,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android,\n5553422047616d657061642000000000,SNES Controller,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android,\n63303964303462366136616266653561,Sony PSP,a:b21,b:b22,back:b27,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b28,x:b23,y:b24,platform:Android,\n63376637643462343766333462383235,Sony Vita,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a3,righty:a4,start:b18,x:b0,y:b2,platform:Android,\n476f6f676c65204c4c43205374616469,Stadia Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n5374616469614e3848532d6532633400,Stadia Controller,a:b0,b:b1,back:b15,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android,\n05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android,\n0500000011010000201400000f7e0f00,SteelSeries Nimbus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,x:b19,y:b2,platform:Android,\n35306436396437373135383665646464,SteelSeries Nimbus Plus,a:b0,b:b1,leftshoulder:b3,leftstick:b17,lefttrigger:b9,leftx:a0,rightshoulder:b20,rightstick:b18,righttrigger:b10,rightx:a2,x:b19,y:b2,platform:Android,\n54475a20436f6e74726f6c6c65720000,TGZ Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n62363434353532386238336663643836,TGZ Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n37323236633763666465316365313236,THEC64 Joystick,a:b21,b:b22,back:b27,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b27,x:b23,y:b24,platform:Android,\n38346162326232346533316164363336,THEGamepad,a:b23,b:b22,back:b27,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b28,x:b24,y:b21,platform:Android,\n050000004f0400000ed00000fffe3f00,ThrustMaster eSwap Pro Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n5477696e20555342204a6f7973746963,Twin Joystick,a:b22,b:b21,back:b28,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,leftstick:b30,lefttrigger:b24,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b31,righttrigger:b25,rightx:a3,righty:a2,start:b29,x:b23,y:b20,platform:Android,\n30623739343039643830333266346439,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b24,paddle2:b23,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n31643365666432386133346639383937,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b24,paddle2:b23,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n30386438313564306161393537333663,Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android,\n33333034646336346339646538643633,Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android,\n050000005e0400008e02000000783f00,Xbox 360 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n30396232393162346330326334636566,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n38313038323730383864666463383533,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n58626f782033363020576972656c6573,Xbox 360 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n65353331386662343338643939643636,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n65613532386633373963616462363038,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n47656e6572696320582d426f78207061,Xbox Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n4d6963726f736f667420582d426f7820,Xbox Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n64633436313965656664373634323364,Xbox Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000005e04000091020000ff073f00,Xbox One Controller,a:b0,b:b1,back:b4,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,\n050000005e04000091020000ff073f80,Xbox One Controller,a:b0,b:b1,back:b4,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000005e040000e00200000ffe3f00,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b17,y:b2,platform:Android,\n050000005e040000e00200000ffe3f80,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a2,righty:a3,start:b10,x:b17,y:b2,platform:Android,\n050000005e040000e0020000ffff3f00,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b4,leftshoulder:b3,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b17,y:b2,platform:Android,\n050000005e040000e0020000ffff3f80,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b4,leftshoulder:b3,leftstick:b8,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b7,righttrigger:a5,rightx:a2,righty:a3,start:b10,x:b17,y:b2,platform:Android,\n050000005e040000fd020000ffff3f00,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n33356661323266333733373865656366,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n34356136633366613530316338376136,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,x:b17,y:b2,platform:Android,\n35623965373264386238353433656138,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n36616131643361333337396261666433,Xbox One Controller,a:b0,b:b1,back:b15,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n58626f7820576972656c65737320436f,Xbox One Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000005e040000000b000000783f00,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,\n050000005e040000000b000000783f80,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000005e040000050b0000ffff3f00,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a6,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000005e040000e002000000783f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000005e040000ea02000000783f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000005e040000fd020000ff7f3f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000005e040000120b000000783f00,Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,\n050000005e040000120b000000783f80,Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000005e040000130b0000ffff3f00,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n65633038363832353634653836396239,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000001727000044310000ffff3f00,XiaoMi Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a6,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android,\n05000000ac0500000100000000006d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS,\n05000000ac050000010000004f066d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS,\n05000000ac05000001000000cf076d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS,\n05000000ac05000001000000df076d01,*,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS,\n05000000ac05000001000000ff076d01,*,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS,\n05000000ac0500000200000000006d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS,\n05000000ac050000020000004f066d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS,\n050000008a35000003010000ff070000,Backbone One,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS,\n050000008a35000004010000ff070000,Backbone One,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS,\n4d466947616d65706164010000000000,MFi Extended Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:iOS,\n4d466947616d65706164020000000000,MFi Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,platform:iOS,\n050000007e050000062000000f060000,Nintendo Switch Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b2,leftshoulder:b4,rightshoulder:b5,x:b1,y:b3,platform:iOS,\n050000007e050000062000004f060000,Nintendo Switch Joy-Con (L),+leftx:h0.1,+lefty:h0.2,-leftx:h0.4,-lefty:h0.8,dpdown:b2,dpleft:b0,dpright:b3,dpup:b1,leftshoulder:b4,misc1:b6,rightshoulder:b5,platform:iOS,\n050000007e05000008200000df070000,Nintendo Switch Joy-Con (L/R),a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS,\n050000007e0500000e200000df070000,Nintendo Switch Joy-Con (L/R),a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:iOS,\n050000007e050000072000004f060000,Nintendo Switch Joy-Con (R),+rightx:h0.4,+righty:h0.8,-rightx:h0.1,-righty:h0.2,a:b1,b:b0,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b3,y:b2,platform:iOS,\n050000007e05000009200000df870000,Nintendo Switch Pro Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b10,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:iOS,\n050000007e05000009200000ff870000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS,\n050000004c050000cc090000df070000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS,\n050000004c050000cc090000df870001,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS,\n050000004c050000cc090000ff070000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS,\n050000004c050000cc090000ff870001,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,touchpad:b11,x:b2,y:b3,platform:iOS,\n050000004c050000cc090000ff876d01,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS,\n050000004c050000e60c0000df870000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,touchpad:b10,x:b2,y:b3,platform:iOS,\n050000004c050000e60c0000ff870000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,touchpad:b11,x:b2,y:b3,platform:iOS,\n05000000ac0500000300000000006d03,Remote,a:b0,b:b2,leftx:a0,lefty:a1,platform:iOS,\n05000000ac0500000300000043006d03,Remote,a:b0,b:b2,leftx:a0,lefty:a1,platform:iOS,\n05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:iOS,\n05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:iOS,\n050000005e040000050b0000df070001,Xbox Elite Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b10,paddle2:b12,paddle3:b11,paddle4:b13,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS,\n050000005e040000050b0000ff070001,Xbox Elite Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b13,paddle3:b12,paddle4:b14,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS,\n050000005e040000e0020000df070000,Xbox One Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS,\n050000005e040000e0020000ff070000,Xbox One Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS,\n050000005e040000130b0000df870001,Xbox Series X Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b10,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS,\n050000005e040000130b0000ff870001,Xbox Series X Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS,\n"
  },
  {
    "path": "testing/resources/test.txt",
    "content": "helloworld"
  },
  {
    "path": "testing/resources/vk_layer_settings.txt",
    "content": "\r\n# VK_LAYER_KHRONOS_validation\r\n\r\n# Fine Grained Locking\r\n# =====================\r\n# <LayerIdentifier>.fine_grained_locking\r\n# Enable fine grained locking for Core Validation, which should improve\r\n# performance in multithreaded applications. This setting allows the\r\n# optimization to be disabled for debugging.\r\nkhronos_validation.fine_grained_locking = true\r\n\r\n# Core\r\n# =====================\r\n# <LayerIdentifier>.validate_core\r\n# The main, heavy-duty validation checks. This may be valuable early in the\r\n# development cycle to reduce validation output while correcting\r\n# parameter/object usage errors.\r\nkhronos_validation.validate_core = true\r\n\r\n# Image Layout\r\n# =====================\r\n# <LayerIdentifier>.check_image_layout\r\n# Check that the layout of each image subresource is correct whenever it is used\r\n# by a command buffer. These checks are very CPU intensive for some\r\n# applications.\r\nkhronos_validation.check_image_layout = true\r\n\r\n# Command Buffer State\r\n# =====================\r\n# <LayerIdentifier>.check_command_buffer\r\n# Check that all Vulkan objects used by a command buffer have not been\r\n# destroyed. These checks can be CPU intensive for some applications.\r\nkhronos_validation.check_command_buffer = true\r\n\r\n# Object in Use\r\n# =====================\r\n# <LayerIdentifier>.check_object_in_use\r\n# Check that Vulkan objects are not in use by a command buffer when they are\r\n# destroyed.\r\nkhronos_validation.check_object_in_use = true\r\n\r\n# Query\r\n# =====================\r\n# <LayerIdentifier>.check_query\r\n# Checks for commands that use VkQueryPool objects.\r\nkhronos_validation.check_query = true\r\n\r\n# Shader\r\n# =====================\r\n# <LayerIdentifier>.check_shaders\r\n# Shader checks. These checks can be CPU intensive during application start up,\r\n# especially if Shader Validation Caching is also disabled.\r\nkhronos_validation.check_shaders = true\r\n\r\n# Caching\r\n# =====================\r\n# <LayerIdentifier>.check_shaders_caching\r\n# Enable caching of shader validation results.\r\nkhronos_validation.check_shaders_caching = true\r\n\r\n# Handle Wrapping\r\n# =====================\r\n# <LayerIdentifier>.unique_handles\r\n# Handle wrapping checks. Disable this feature if you are exerience crashes when\r\n# creating new extensions or developing new Vulkan objects/structures.\r\nkhronos_validation.unique_handles = true\r\n\r\n# Object Lifetime\r\n# =====================\r\n# <LayerIdentifier>.object_lifetime\r\n# Object tracking checks. This may not always be necessary late in a development\r\n# cycle.\r\nkhronos_validation.object_lifetime = true\r\n\r\n# Stateless Parameter\r\n# =====================\r\n# <LayerIdentifier>.stateless_param\r\n# Stateless parameter checks. This may not always be necessary late in a\r\n# development cycle.\r\nkhronos_validation.stateless_param = true\r\n\r\n# Thread Safety\r\n# =====================\r\n# <LayerIdentifier>.thread_safety\r\n# Thread checks. In order to not degrade performance, it might be best to run\r\n# your program with thread-checking disabled most of the time, enabling it\r\n# occasionally for a quick sanity check or when debugging difficult application\r\n# behaviors.\r\nkhronos_validation.thread_safety = true\r\n\r\n# Synchronization\r\n# =====================\r\n# <LayerIdentifier>.validate_sync\r\n# Enable synchronization validation during command buffers recording. This\r\n# feature reports resource access conflicts due to missing or incorrect\r\n# synchronization operations between actions (Draw, Copy, Dispatch, Blit)\r\n# reading or writing the same regions of memory.\r\nkhronos_validation.validate_sync = true\r\n\r\n# QueueSubmit Synchronization Validation\r\n# =====================\r\n# <LayerIdentifier>.sync_queue_submit\r\n# Enable synchronization validation between submitted command buffers when\r\n# Synchronization Validation is enabled. This option will increase the\r\n# synchronization performance cost.\r\nkhronos_validation.sync_queue_submit = true\r\n\r\n# GPU Base\r\n# =====================\r\n# <LayerIdentifier>.validate_gpu_based\r\n# Setting an option here will enable specialized areas of validation\r\nkhronos_validation.validate_gpu_based = GPU_BASED_NONE\r\n\r\n# Redirect Printf messages to stdout\r\n# =====================\r\n# <LayerIdentifier>.printf_to_stdout\r\n# Enable redirection of Debug Printf messages from the debug callback to stdout\r\n#khronos_validation.printf_to_stdout = true\r\n\r\n# Printf verbose\r\n# =====================\r\n# <LayerIdentifier>.printf_verbose\r\n# Set the verbosity of debug printf messages\r\n#khronos_validation.printf_verbose = false\r\n\r\n# Printf buffer size\r\n# =====================\r\n# <LayerIdentifier>.printf_buffer_size\r\n# Set the size in bytes of the buffer used by debug printf\r\n#khronos_validation.printf_buffer_size = 1024\r\n\r\n# Shader instrumentation\r\n# =====================\r\n# <LayerIdentifier>.gpuav_shader_instrumentation\r\n# Instrument shaders to validate descriptors, descriptor indexing, buffer device\r\n# addresses and ray queries. Warning: will considerably slow down shader\r\n# executions.\r\n#khronos_validation.gpuav_shader_instrumentation = true\r\n\r\n# Descriptors indexing\r\n# =====================\r\n# <LayerIdentifier>.gpuav_descriptor_checks\r\n# Enable descriptors and buffer out of bounds validation when using descriptor\r\n# indexing\r\nkhronos_validation.gpuav_descriptor_checks = true\r\n\r\n# Generate warning on out of bounds accesses even if buffer robustness is enabled\r\n# =====================\r\n# <LayerIdentifier>.gpuav_warn_on_robust_oob\r\n# Warn on out of bounds accesses even if robustness is enabled\r\nkhronos_validation.gpuav_warn_on_robust_oob = true\r\n\r\n# Out of bounds buffer device addresses\r\n# =====================\r\n# <LayerIdentifier>.gpuav_buffer_address_oob\r\n# Check for\r\nkhronos_validation.gpuav_buffer_address_oob = true\r\n\r\n# Maximum number of buffer device addresses in use at one time\r\n# =====================\r\n# <LayerIdentifier>.gpuav_max_buffer_device_addresses\r\n\r\nkhronos_validation.gpuav_max_buffer_device_addresses = 10000\r\n\r\n# RayQuery SPIR-V Instructions\r\n# =====================\r\n# <LayerIdentifier>.gpuav_validate_ray_query\r\n# Enable shader instrumentation on OpRayQueryInitializeKHR\r\nkhronos_validation.gpuav_validate_ray_query = true\r\n\r\n# Cache instrumented shaders rather than instrumenting them on every run\r\n# =====================\r\n# <LayerIdentifier>.gpuav_cache_instrumented_shaders\r\n# Enable instrumented shader caching\r\nkhronos_validation.gpuav_cache_instrumented_shaders = true\r\n\r\n# Enable instrumenting shaders selectively\r\n# =====================\r\n# <LayerIdentifier>.gpuav_select_instrumented_shaders\r\n# Select which shaders to instrument passing a VkValidationFeaturesEXT struct\r\n# with GPU-AV enabled in the VkShaderModuleCreateInfo pNext\r\nkhronos_validation.gpuav_select_instrumented_shaders = false\r\n\r\n# Buffer content validation\r\n# =====================\r\n# <LayerIdentifier>.gpuav_buffers_validation\r\n# Validate buffers containing parameters used in indirect Vulkan commands, or\r\n# used in copy commands\r\n#khronos_validation.gpuav_buffers_validation = true\r\n\r\n# Indirect draws parameters\r\n# =====================\r\n# <LayerIdentifier>.gpuav_indirect_draws_buffers\r\n# Validate buffers containing draw parameters used in indirect draw commands\r\nkhronos_validation.gpuav_indirect_draws_buffers = true\r\n\r\n# Indirect dispatches parameters\r\n# =====================\r\n# <LayerIdentifier>.indirect_dispatches\r\n# Validate buffers containing dispatch parameters used in indirect dispatch\r\n# commands\r\nkhronos_validation.indirect_dispatches = true\r\n\r\n# Indirect trace rays parameters\r\n# =====================\r\n# <LayerIdentifier>.indirect_trace_rays\r\n# Validate buffers containing ray tracing parameters used in indirect ray\r\n# tracing commands\r\nkhronos_validation.indirect_trace_rays = true\r\n\r\n# Buffer copies\r\n# =====================\r\n# <LayerIdentifier>.gpuav_buffer_copies\r\n# Validate copies involving a VkBuffer. Right now only validates copy buffer to\r\n# image.\r\nkhronos_validation.gpuav_buffer_copies = true\r\n\r\n# Reserve Descriptor Set Binding Slot\r\n# =====================\r\n# <LayerIdentifier>.gpuav_reserve_binding_slot\r\n# Specifies that the validation layers reserve a descriptor set binding slot for\r\n# their own use. The layer reports a value for\r\n# VkPhysicalDeviceLimits::maxBoundDescriptorSets that is one less than the value\r\n# reported by the device. If the device supports the binding of only one\r\n# descriptor set, the validation layer does not perform GPU-assisted validation.\r\n#khronos_validation.gpuav_reserve_binding_slot = true\r\n\r\n# Linear Memory Allocation Mode\r\n# =====================\r\n# <LayerIdentifier>.gpuav_vma_linear_output\r\n# Use VMA linear memory allocations for GPU-AV output buffers instead of finding\r\n# best place for new allocations among free regions to optimize memory usage.\r\n# Enabling this setting reduces performance cost but disabling this method\r\n# minimizes memory usage.\r\n#khronos_validation.gpuav_vma_linear_output = true\r\n\r\n# Validate instrumented shaders\r\n# =====================\r\n# <LayerIdentifier>.gpuav_debug_validate_instrumented_shaders\r\n# Run spirv-val after doing shader instrumentation\r\n#khronos_validation.gpuav_debug_validate_instrumented_shaders = false\r\n\r\n# Dump instrumented shaders\r\n# =====================\r\n# <LayerIdentifier>.gpuav_debug_dump_instrumented_shaders\r\n# Will dump the instrumented shaders (before and after) to working directory\r\n#khronos_validation.gpuav_debug_dump_instrumented_shaders = false\r\n\r\n# Best Practices\r\n# =====================\r\n# <LayerIdentifier>.validate_best_practices\r\n# Outputs warnings related to common misuse of the API, but which are not\r\n# explicitly prohibited by the specification.\r\nkhronos_validation.validate_best_practices = true\r\n\r\n# ARM-specific best practices\r\n# =====================\r\n# <LayerIdentifier>.validate_best_practices_arm\r\n# Outputs warnings for spec-conforming but non-ideal code on ARM GPUs.\r\nkhronos_validation.validate_best_practices_arm = false\r\n\r\n# AMD-specific best practices\r\n# =====================\r\n# <LayerIdentifier>.validate_best_practices_amd\r\n# Outputs warnings for spec-conforming but non-ideal code on AMD GPUs.\r\nkhronos_validation.validate_best_practices_amd = false\r\n\r\n# IMG-specific best practices\r\n# =====================\r\n# <LayerIdentifier>.validate_best_practices_img\r\n# Outputs warnings for spec-conforming but non-ideal code on Imagination GPUs.\r\nkhronos_validation.validate_best_practices_img = false\r\n\r\n# NVIDIA-specific best practices\r\n# =====================\r\n# <LayerIdentifier>.validate_best_practices_nvidia\r\n# Outputs warnings for spec-conforming but non-ideal code on NVIDIA GPUs.\r\nkhronos_validation.validate_best_practices_nvidia = false\r\n\r\n# Debug Action\r\n# =====================\r\n# <LayerIdentifier>.debug_action\r\n# Specifies what action is to be taken when a layer reports information\r\nkhronos_validation.debug_action = VK_DBG_LAYER_ACTION_LOG_MSG\r\n\r\n# Log Filename\r\n# =====================\r\n# <LayerIdentifier>.log_filename\r\n# Specifies the output filename\r\nkhronos_validation.log_filename = stdout\r\n\r\n# Message Severity\r\n# =====================\r\n# <LayerIdentifier>.report_flags\r\n# Comma-delineated list of options specifying the types of messages to be\r\n# reported\r\nkhronos_validation.report_flags = error\r\n\r\n# Limit Duplicated Messages\r\n# =====================\r\n# <LayerIdentifier>.enable_message_limit\r\n# Enable limiting of duplicate messages.\r\nkhronos_validation.enable_message_limit = false\r\n\r\n# Max Duplicated Messages\r\n# =====================\r\n# <LayerIdentifier>.duplicate_message_limit\r\n# Maximum number of times any single validation message should be reported.\r\n#khronos_validation.duplicate_message_limit = 10\r\n\r\n# Mute Message VUIDs\r\n# =====================\r\n# <LayerIdentifier>.message_id_filter\r\n# List of VUIDs and VUID identifers which are to be IGNORED by the validation\r\n# layer\r\nkhronos_validation.message_id_filter = \r\n\r\n# Display Application Name\r\n# =====================\r\n# <LayerIdentifier>.message_format_display_application_name\r\n# Useful when running multiple instances to know which instance the message is\r\n# from.\r\nkhronos_validation.message_format_display_application_name = false\r\n\r\n"
  },
  {
    "path": "testing/tests/audio.lua",
    "content": "-- love.audio\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n------------------------------------OBJECTS-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- RecordingDevice (love.audio.getRecordingDevices)\nlove.test.audio.RecordingDevice = function(test)\n\n  -- skip recording device on runners, they cant emulate it\n  if GITHUB_RUNNER then\n    return test:skipTest('cant emulate recording devices in CI')\n  end\n\n  -- check devices first\n  local devices = love.audio.getRecordingDevices()\n  if #devices == 0 then\n    return test:skipTest('cant test this works: no recording devices found')\n  end\n\n  -- check object created and basics\n  local device = devices[1]\n  test:assertObject(device)\n  test:assertMatch({1, 2}, device:getChannelCount(), 'check channel count is 1 or 2')\n  test:assertNotEquals(nil, device:getName(), 'check has name')\n\n  -- check initial data is empty as we haven't recorded anything yet \n  test:assertNotNil(device:getBitDepth())\n  test:assertEquals(nil, device:getData(), 'check initial data empty')\n  test:assertEquals(0, device:getSampleCount(), 'check initial sample empty')\n  test:assertNotNil(device:getSampleRate())\n  test:assertFalse(device:isRecording(), 'check not recording')\n\n  -- start recording for a short time\n  local startrecording = device:start(32000, 4000, 16, 1)\n  test:waitFrames(10)\n  test:assertTrue(startrecording, 'check recording started')\n  test:assertTrue(device:isRecording(), 'check now recording')\n  test:assertEquals(4000, device:getSampleRate(), 'check sample rate set')\n  test:assertEquals(16, device:getBitDepth(), 'check bit depth set')\n  test:assertEquals(1, device:getChannelCount(), 'check channel count set')\n  local recording = device:stop()\n  test:waitFrames(10)\n\n  -- after recording \n  test:assertFalse(device:isRecording(), 'check not recording')\n  test:assertEquals(nil, device:getData(), 'using stop should clear buffer')\n  test:assertObject(recording)\n\nend\n\n\n-- Source (love.audio.newSource)\nlove.test.audio.Source = function(test)\n\n  -- create stereo source\n  local stereo = love.audio.newSource('resources/click.ogg', 'static')\n  test:assertObject(stereo)\n\n  -- check stereo props\n  test:assertEquals(2, stereo:getChannelCount(), 'check stereo src')\n  test:assertRange(stereo:getDuration(\"seconds\"), 0, 0.1, 'check stereo seconds')\n  test:assertNotNil(stereo:getFreeBufferCount())\n  test:assertEquals('static', stereo:getType(), 'check stereo type')\n\n  -- check cloning a stereo\n  local clone = stereo:clone()\n  test:assertEquals(2, clone:getChannelCount(), 'check clone stereo src')\n  test:assertRange(clone:getDuration(\"seconds\"), 0, 0.1, 'check clone stereo seconds')\n  test:assertNotNil(clone:getFreeBufferCount())\n  test:assertEquals('static', clone:getType(), 'check cloned stereo type')\n\n  -- mess with stereo playing\n  test:assertFalse(stereo:isPlaying(), 'check not playing')\n  stereo:setLooping(true)\n  stereo:play()\n  test:assertTrue(stereo:isPlaying(), 'check now playing')\n  test:assertTrue(stereo:isLooping(), 'check now playing')\n  stereo:pause()\n  stereo:seek(0.01, 'seconds')\n  test:assertEquals(0.01, stereo:tell('seconds'), 'check seek/tell')\n  stereo:stop()\n  test:assertFalse(stereo:isPlaying(), 'check stopped playing')\n\n  -- check volume limits\n  stereo:setVolumeLimits(0.1, 0.5)\n  local min, max = stereo:getVolumeLimits()\n  test:assertRange(min, 0.1, 0.2, 'check min limit')\n  test:assertRange(max, 0.5, 0.6, 'check max limit')\n\n  -- check setting volume\n  stereo:setVolume(1)\n  test:assertEquals(1, stereo:getVolume(), 'check set volume')\n  stereo:setVolume(0)\n  test:assertEquals(0, stereo:getVolume(), 'check set volume')\n\n  -- change some get/set props that can apply to stereo\n  stereo:setPitch(2)\n  test:assertEquals(2, stereo:getPitch(), 'check pitch change')\n\n  -- create mono source\n  local mono = love.audio.newSource('resources/clickmono.ogg', 'stream')\n  test:assertObject(mono)\n  test:assertEquals(1, mono:getChannelCount(), 'check mono src')\n  test:assertEquals(2927, mono:getDuration(\"samples\"), 'check mono seconds')\n  test:assertEquals('stream', mono:getType(), 'check mono type')\n\n  -- air absorption\n  test:assertEquals(0, mono:getAirAbsorption(), 'get air absorption')\n  mono:setAirAbsorption(1)\n  test:assertEquals(1, mono:getAirAbsorption(), 'set air absorption')\n\n  -- cone\n  mono:setCone(0, 90*(math.pi/180), 1)\n  local ia, oa, ov = mono:getCone()\n  test:assertEquals(0, ia, 'check cone ia')\n  test:assertEquals(math.floor(9000*(math.pi/180)), math.floor(oa*100), 'check cone oa')\n  test:assertEquals(1, ov, 'check cone ov')\n\n  -- direction\n  mono:setDirection(3, 1, -1)\n  local x, y, z = mono:getDirection()\n  test:assertEquals(3, x, 'check direction x')\n  test:assertEquals(1, y, 'check direction y')\n  test:assertEquals(-1, z, 'check direction z')\n\n  -- relative\n  mono:setRelative(true)\n  test:assertTrue(mono:isRelative(), 'check set relative')\n\n  -- position\n  mono:setPosition(1, 2, 3)\n  x, y, z = mono:getPosition()\n  test:assertEquals(x, 1, 'check pos x')\n  test:assertEquals(y, 2, 'check pos y')\n  test:assertEquals(z, 3, 'check pos z')\n\n  -- velocity\n  mono:setVelocity(1, 3, 4)\n  x, y, z = mono:getVelocity()\n  test:assertEquals(x, 1, 'check velocity x')\n  test:assertEquals(y, 3, 'check velocity x')\n  test:assertEquals(z, 4, 'check velocity x')\n\n  -- rolloff\n  mono:setRolloff(1)\n  test:assertEquals(1, mono:getRolloff(), 'check rolloff set')\n\n  -- create queue source\n  local queue = love.audio.newQueueableSource(44100, 16, 1, 3)\n  local sdata = love.sound.newSoundData(1024, 44100, 16, 1)\n  test:assertObject(queue)\n  local run = queue:queue(sdata)\n  test:assertTrue(run, 'check queued sound')\n  queue:stop()\n\n  -- check making a filer\n  local setfilter = stereo:setFilter({\n    type = 'lowpass',\n    volume = 0.5,\n    highgain = 0.3\n  })\n  test:assertTrue(setfilter, 'check filter applied')\n  local filter = stereo:getFilter()\n  test:assertEquals('lowpass', filter.type, 'check filter type')\n  test:assertEquals(0.5, filter.volume, 'check filter volume')\n  test:assertRange(filter.highgain, 0.3, 0.4, 'check filter highgain')\n  test:assertEquals(nil, filter.lowgain, 'check filter lowgain')\n\n  -- add an effect\n  local effsource = love.audio.newSource('resources/click.ogg', 'static')\n  love.audio.setEffect('testeffect', {\n    type = 'flanger',\n    volume = 0.75\n  })\n  local seteffect, err = effsource:setEffect('testeffect', {\n    type = 'highpass',\n    volume = 0.3,\n    lowgain = 0.1\n  })\n\n  -- both these fail on 12 using stereo or mono, no err\n  test:assertTrue(seteffect, 'check effect was applied')\n  local filtersettings = effsource:getEffect('effectthatdoesntexist', {})\n  test:assertNotNil(filtersettings)\n\n  love.audio.stop(stereo)\n  love.audio.stop(mono)\n  love.audio.stop(effsource)\n\nend\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n------------------------------------METHODS-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.audio.getActiveEffects\nlove.test.audio.getActiveEffects = function(test)\n  -- check we get a value\n  test:assertNotNil(love.audio.getActiveEffects())\n  -- check setting an effect active\n  love.audio.setEffect('testeffect', {\n    type = 'chorus',\n    volume = 0.75\n  })\n  test:assertEquals(1, #love.audio.getActiveEffects(), 'check 1 effect running')\n  test:assertEquals('testeffect', love.audio.getActiveEffects()[1], 'check effect details')\nend\n\n\n-- love.audio.getActiveSourceCount\nlove.test.audio.getActiveSourceCount = function(test)\n  -- check we get a value\n  test:assertNotNil(love.audio.getActiveSourceCount())\n  -- check source isn't active by default\n  local testsource = love.audio.newSource('resources/click.ogg', 'static')\n  love.audio.stop(testsource)\n  test:assertEquals(0, love.audio.getActiveSourceCount(), 'check not active')\n  -- check playing a source marks it as active\n  love.audio.play(testsource)\n  test:assertEquals(1, love.audio.getActiveSourceCount(), 'check now active')\n  love.audio.pause()\nend\n\n\n-- love.audio.getDistanceModel\nlove.test.audio.getDistanceModel = function(test)\n  -- check we get a value\n  test:assertNotNil(love.audio.getDistanceModel())\n  -- check default value from documentation\n  test:assertEquals('inverseclamped', love.audio.getDistanceModel(), 'check default value')\n  -- check get correct value after setting\n  love.audio.setDistanceModel('inverse')\n  test:assertEquals('inverse', love.audio.getDistanceModel(), 'check setting model')\nend\n\n\n-- love.audio.getDopplerScale\nlove.test.audio.getDopplerScale = function(test)\n  -- check default value\n  test:assertEquals(1, love.audio.getDopplerScale(), 'check default 1')\n  -- check correct value after setting to 0\n  love.audio.setDopplerScale(0)\n  test:assertEquals(0, love.audio.getDopplerScale(), 'check setting to 0')\n  love.audio.setDopplerScale(1)\nend\n\n\n-- love.audio.getEffect\nlove.test.audio.getEffect = function(test)\n  -- check getting a non-existent effect\n  test:assertEquals(nil, love.audio.getEffect('madeupname'), 'check wrong name')\n  -- check getting a valid effect\n  love.audio.setEffect('testeffect', {\n    type = 'chorus',\n    volume = 0.75\n  })\n  test:assertNotNil(love.audio.getEffect('testeffect'))\n  -- check effect values match creation values\n  test:assertEquals('chorus', love.audio.getEffect('testeffect').type, 'check effect type')\n  test:assertEquals(0.75, love.audio.getEffect('testeffect').volume, 'check effect volume')\nend\n\n\n-- love.audio.getMaxSceneEffects\n-- @NOTE feel like this is platform specific number so best we can do is a nil?\nlove.test.audio.getMaxSceneEffects = function(test)\n  test:assertNotNil(love.audio.getMaxSceneEffects())\nend\n\n\n-- love.audio.getMaxSourceEffects\n-- @NOTE feel like this is platform specific number so best we can do is a nil?\nlove.test.audio.getMaxSourceEffects = function(test)\n  test:assertNotNil(love.audio.getMaxSourceEffects())\nend\n\n\n-- love.audio.getOrientation\n-- @NOTE is there an expected default listener pos?\nlove.test.audio.getOrientation = function(test)\n  -- checking getting values matches what was set\n  love.audio.setOrientation(1, 2, 3, 4, 5, 6)\n  local fx, fy, fz, ux, uy, uz = love.audio.getOrientation()\n  test:assertEquals(1, fx, 'check fx orientation')\n  test:assertEquals(2, fy, 'check fy orientation')\n  test:assertEquals(3, fz, 'check fz orientation')\n  test:assertEquals(4, ux, 'check ux orientation')\n  test:assertEquals(5, uy, 'check uy orientation')\n  test:assertEquals(6, uz, 'check uz orientation')\nend\n\n\n-- love.audio.getPlaybackDevice\nlove.test.audio.getPlaybackDevice = function(test)\n  test:assertNotNil(love.audio.getPlaybackDevice)\n  test:assertNotNil(love.audio.getPlaybackDevice())\nend\n\n\n-- love.audio.getPlaybackDevices\nlove.test.audio.getPlaybackDevices = function(test)\n  test:assertNotNil(love.audio.getPlaybackDevices)\n  test:assertGreaterEqual(0, #love.audio.getPlaybackDevices(), 'check table')\nend\n\n\n-- love.audio.getPosition\n-- @NOTE is there an expected default listener pos?\nlove.test.audio.getPosition = function(test)\n  -- check getting values matches what was set\n  love.audio.setPosition(1, 2, 3)\n  local x, y, z = love.audio.getPosition()\n  test:assertEquals(1, x, 'check x position')\n  test:assertEquals(2, y, 'check y position')\n  test:assertEquals(3, z, 'check z position')\nend\n\n\n-- love.audio.getRecordingDevices\n-- @NOTE hardware dependent so best can do is not nil check\nlove.test.audio.getRecordingDevices = function(test)\n  test:assertNotNil(love.audio.getRecordingDevices())\nend\n\n\n-- love.audio.getVelocity\nlove.test.audio.getVelocity = function(test)\n  -- check getting values matches what was set\n  love.audio.setVelocity(1, 2, 3)\n  local x, y, z = love.audio.getVelocity()\n  test:assertEquals(1, x, 'check x velocity')\n  test:assertEquals(2, y, 'check y velocity')\n  test:assertEquals(3, z, 'check z velocity')\nend\n\n\n-- love.audio.getVolume\nlove.test.audio.getVolume = function(test)\n  -- check getting values matches what was set\n  love.audio.setVolume(0.5)\n  test:assertEquals(0.5, love.audio.getVolume(), 'check matches set')\nend\n\n\n-- love.audio.isEffectsSupported\nlove.test.audio.isEffectsSupported = function(test)\n  test:assertNotNil(love.audio.isEffectsSupported())\nend\n\n\n-- love.audio.newQueueableSource\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.audio.newQueueableSource = function(test)\n  test:assertObject(love.audio.newQueueableSource(32, 8, 1, 8))\nend\n\n\n-- love.audio.newSource\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.audio.newSource = function(test)\n  test:assertObject(love.audio.newSource('resources/click.ogg', 'static'))\n  test:assertObject(love.audio.newSource('resources/click.ogg', 'stream'))\nend\n\n\n-- love.audio.pause\nlove.test.audio.pause = function(test)\n  -- check nothing paused (as should be nothing playing)\n  local nopauses = love.audio.pause()\n  test:assertEquals(0, #nopauses, 'check nothing paused')\n  -- check 1 source paused after playing/pausing 1\n  local source = love.audio.newSource('resources/click.ogg', 'static')\n  love.audio.play(source)\n  local onepause = love.audio.pause()\n  test:assertEquals(1, #onepause, 'check 1 paused')\n  love.audio.stop(source)\nend\n\n\n-- love.audio.play\nlove.test.audio.play = function(test)\n  -- check playing source is detected\n  local source = love.audio.newSource('resources/click.ogg', 'static')\n  love.audio.play(source)\n  test:assertTrue(source:isPlaying(), 'check something playing')\n  love.audio.stop()\nend\n\n\n-- love.audio.setDistanceModel\nlove.test.audio.setDistanceModel = function(test)\n  -- check setting each of the distance models is accepted and val returned\n  local distancemodel = {\n    'none', 'inverse', 'inverseclamped', 'linear', 'linearclamped',\n    'exponent', 'exponentclamped'\n  }\n  for d=1,#distancemodel do\n    love.audio.setDistanceModel(distancemodel[d])\n    test:assertEquals(distancemodel[d], love.audio.getDistanceModel(),\n      'check model set to ' .. distancemodel[d])\n  end\nend\n\n\n-- love.audio.setDopplerScale\nlove.test.audio.setDopplerScale = function(test)\n  -- check setting value is returned properly\n  love.audio.setDopplerScale(0)\n  test:assertEquals(0, love.audio.getDopplerScale(), 'check set to 0')\n  love.audio.setDopplerScale(1)\n  test:assertEquals(1, love.audio.getDopplerScale(), 'check set to 1')\nend\n\n\n-- love.audio.setEffect\nlove.test.audio.setEffect = function(test)\n  -- check effect is set correctly\n  local effect = love.audio.setEffect('testeffect', {\n    type = 'chorus',\n    volume = 0.75\n  })\n  test:assertTrue(effect, 'check effect created')\n  -- check values set match\n  local settings = love.audio.getEffect('testeffect')\n  test:assertEquals('chorus', settings.type, 'check effect type')\n  test:assertEquals(0.75, settings.volume, 'check effect volume')\nend\n\n\n-- love.audio.setMixWithSystem\nlove.test.audio.setMixWithSystem = function(test)\n  test:assertNotNil(love.audio.setMixWithSystem(true))\nend\n\n\n-- love.audio.setOrientation\nlove.test.audio.setOrientation = function(test)\n  -- check setting orientation vals are returned\n  love.audio.setOrientation(1, 2, 3, 4, 5, 6)\n  local fx, fy, fz, ux, uy, uz = love.audio.getOrientation()\n  test:assertEquals(1, fx, 'check fx orientation')\n  test:assertEquals(2, fy, 'check fy orientation')\n  test:assertEquals(3, fz, 'check fz orientation')\n  test:assertEquals(4, ux, 'check ux orientation')\n  test:assertEquals(5, uy, 'check uy orientation')\n  test:assertEquals(6, uz, 'check uz orientation')\nend\n\n\n-- love.audio.setPlaybackDevice\nlove.test.audio.setPlaybackDevice = function(test)\n  -- check method\n  test:assertNotNil(love.audio.setPlaybackDevice)\n\n  -- check blank string name\n  test:assertTrue(love.audio.setPlaybackDevice(''), 'check blank device is fine')\n\n  -- check invalid name\n  test:assertFalse(love.audio.setPlaybackDevice('loveFM'), 'check invalid device fails')\n\n  -- check setting already set\n  test:assertTrue(love.audio.setPlaybackDevice(love.audio.getPlaybackDevice()), 'check existing device is fine')\n  \n  -- if other devices to play with lets set a different one\n  local devices = love.audio.getPlaybackDevices()\n  if #devices > 1 then\n    local another = ''\n    local current = love.audio.getPlaybackDevice()\n    for a=1,#devices do\n      if devices[a] ~= current then\n        another = devices[a]\n        break\n      end\n    end\n    if another ~= '' then\n      -- check setting new device\n      local success4, msg4 = love.audio.setPlaybackDevice(another)\n      test:assertTrue(success4, 'check setting different device')\n      -- check resetting to default\n      local success5, msg5 = love.audio.setPlaybackDevice()\n      test:assertTrue(success5, 'check resetting')\n      test:assertEquals(current, love.audio.getPlaybackDevice())\n    end\n  end\nend\n\n\n-- love.audio.setPosition\nlove.test.audio.setPosition = function(test)\n  -- check setting position vals are returned\n  love.audio.setPosition(1, 2, 3)\n  local x, y, z = love.audio.getPosition()\n  test:assertEquals(1, x, 'check x position')\n  test:assertEquals(2, y, 'check y position')\n  test:assertEquals(3, z, 'check z position')\nend\n\n\n-- love.audio.setVelocity\nlove.test.audio.setVelocity = function(test)\n  -- check setting velocity vals are returned\n  love.audio.setVelocity(1, 2, 3)\n  local x, y, z = love.audio.getVelocity()\n  test:assertEquals(1, x, 'check x velocity')\n  test:assertEquals(2, y, 'check y velocity')\n  test:assertEquals(3, z, 'check z velocity')\nend\n\n\n-- love.audio.setVolume\nlove.test.audio.setVolume = function(test)\n  -- check setting volume works\n  love.audio.setVolume(0.5)\n  test:assertEquals(0.5, love.audio.getVolume(), 'check set to 0.5')\nend\n\n\n-- love.audio.stop\nlove.test.audio.stop = function(test)\n  -- check source is playing first\n  local source = love.audio.newSource('resources/click.ogg', 'static')\n  love.audio.play(source)\n  test:assertTrue(source:isPlaying(), 'check is playing')\n  -- check source is then stopped\n  love.audio.stop()\n  test:assertFalse(source:isPlaying(), 'check stopped playing')\nend\n"
  },
  {
    "path": "testing/tests/data.lua",
    "content": "-- love.data\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n------------------------------------OBJECTS-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- ByteData (love.data.newByteData)\nlove.test.data.ByteData = function(test)\n\n  -- create new obj\n  local data = love.data.newByteData('helloworld')\n  test:assertObject(data)\n\n  -- check properties match expected\n  test:assertEquals('helloworld', data:getString(), 'check data string')\n  test:assertEquals(10, data:getSize(), 'check data size')\n\n  -- check cloning the bytedata\n  local cloneddata = data:clone()\n  test:assertObject(cloneddata)\n  test:assertEquals('helloworld', cloneddata:getString(), 'check cloned data')\n  test:assertEquals(10, cloneddata:getSize(), 'check cloned size')\n\n  -- check pointer access if allowed\n  if data:getFFIPointer() ~= nil and ffi ~= nil then\n    local pointer = data:getFFIPointer()\n    local ptr = ffi.cast('uint8_t*', pointer)\n    local byte5 = ptr[4]\n    test:assertEquals('o', byte5)\n  end\n\n  -- check overwriting the byte data string\n  data:setString('love!', 5)\n  test:assertEquals('hellolove!', data:getString(), 'check change string')\n\nend\n\n\n-- CompressedData (love.data.compress)\nlove.test.data.CompressedData = function(test)\n\n  -- create new compressed data\n  local cdata = love.data.compress('data', 'zlib', 'helloworld', -1)\n  test:assertObject(cdata)\n  test:assertEquals('zlib', cdata:getFormat(), 'check format used')\n\n  -- check properties match expected\n  test:assertEquals(18, cdata:getSize())\n  test:assertEquals('helloworld', love.data.decompress('data', cdata):getString())\n\n  -- check cloning the data\n  local clonedcdata = cdata:clone()\n  test:assertObject(clonedcdata)\n  test:assertEquals('zlib', clonedcdata:getFormat())\n  test:assertEquals(18, clonedcdata:getSize())\n  test:assertEquals('helloworld', love.data.decompress('data', clonedcdata):getString())\n\nend\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n------------------------------------METHODS-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.data.compress\nlove.test.data.compress = function(test)\n  -- here just testing each combo 'works' - in decompress's test method\n  -- we actually check the compress + decompress give the right value back\n  local compressions = {\n    { love.data.compress('string', 'lz4', 'helloworld', -1), 'string'},\n    { love.data.compress('string', 'lz4', 'helloworld', 0), 'string'},\n    { love.data.compress('string', 'lz4', 'helloworld', 9), 'string'},\n    { love.data.compress('string', 'zlib', 'helloworld', -1), 'string'},\n    { love.data.compress('string', 'zlib', 'helloworld', 0), 'string'},\n    { love.data.compress('string', 'zlib', 'helloworld', 9), 'string'},\n    { love.data.compress('string', 'gzip', 'helloworld', -1), 'string'},\n    { love.data.compress('string', 'gzip', 'helloworld', 0), 'string'},\n    { love.data.compress('string', 'gzip', 'helloworld', 9), 'string'},\n    { love.data.compress('string', 'deflate', 'aaaaaa', 1), 'string'},\n    { love.data.compress('string', 'deflate', 'heloworld', -1), 'string'},\n    { love.data.compress('string', 'deflate', 'heloworld', 0), 'string'},\n    { love.data.compress('string', 'deflate', 'heloworld', 9), 'string'},\n    { love.data.compress('data', 'lz4', 'helloworld', -1), 'userdata'},\n    { love.data.compress('data', 'lz4', 'helloworld', 0), 'userdata'},\n    { love.data.compress('data', 'lz4', 'helloworld', 9), 'userdata'},\n    { love.data.compress('data', 'zlib', 'helloworld', -1), 'userdata'},\n    { love.data.compress('data', 'zlib', 'helloworld', 0), 'userdata'},\n    { love.data.compress('data', 'zlib', 'helloworld', 9), 'userdata'},\n    { love.data.compress('data', 'gzip', 'helloworld', -1), 'userdata'},\n    { love.data.compress('data', 'gzip', 'helloworld', 0), 'userdata'},\n    { love.data.compress('data', 'gzip', 'helloworld', 9), 'userdata'},\n    { love.data.compress('data', 'deflate', 'heloworld', -1), 'userdata'},\n    { love.data.compress('data', 'deflate', 'heloworld', 0), 'userdata'},\n    { love.data.compress('data', 'deflate', 'heloworld', 9), 'userdata'},\n  }\n  for c=1,#compressions do\n    test:assertNotNil(compressions[c][1])\n    -- sense check return type and make sure bytedata returns are an object\n    test:assertEquals(compressions[c][2], type(compressions[c][1]), 'check is userdata')\n    if compressions[c][2] == 'userdata' then\n      test:assertNotEquals(nil, compressions[c][1]:type(), 'check has :type()')\n    end\n  end\nend\n\n\n-- love.data.decode\nlove.test.data.decode = function(test)\n  -- setup encoded strings\n  local str1 = love.data.encode('string', 'base64', 'helloworld', 0)\n  local str2 = love.data.encode('string', 'hex', 'helloworld')\n  local str3 = love.data.encode('data', 'base64', 'helloworld', 0)\n  local str4 = love.data.encode('data', 'hex', 'helloworld')\n  -- check value matches expected when decoded back\n  test:assertEquals('helloworld', love.data.decode('string', 'base64', str1), 'check string base64 decode')\n  test:assertEquals('helloworld', love.data.decode('string', 'hex', str2), 'check string hex decode')\n  test:assertEquals(love.data.newByteData('helloworld'):getString(), love.data.decode('data', 'base64', str3):getString(), 'check data base64 decode')\n  test:assertEquals(love.data.newByteData('helloworld'):getString(), love.data.decode('data', 'hex', str4):getString(), 'check data hex decode')\nend\n\n\n-- love.data.decompress\nlove.test.data.decompress = function(test)\n  -- setup compressed data for each combination\n  local str1 = love.data.compress('string', 'lz4', 'helloworld', -1)\n  local str2 = love.data.compress('string', 'lz4', 'helloworld', 0)\n  local str3 = love.data.compress('string', 'lz4', 'helloworld', 9)\n  local str4 = love.data.compress('string', 'zlib', 'helloworld', -1)\n  local str5 = love.data.compress('string', 'zlib', 'helloworld', 0)\n  local str6 = love.data.compress('string', 'zlib', 'helloworld', 9)\n  local str7 = love.data.compress('string', 'gzip', 'helloworld', -1)\n  local str8 = love.data.compress('string', 'gzip', 'helloworld', 0)\n  local str9 = love.data.compress('string', 'gzip', 'helloworld', 9)\n  local str10 = love.data.compress('data', 'lz4', 'helloworld', -1)\n  local str11 = love.data.compress('data', 'lz4', 'helloworld', 0)\n  local str12 = love.data.compress('data', 'lz4', 'helloworld', 9)\n  local str13 = love.data.compress('data', 'zlib', 'helloworld', -1)\n  local str14 = love.data.compress('data', 'zlib', 'helloworld', 0)\n  local str15 = love.data.compress('data', 'zlib', 'helloworld', 9)\n  local str16 = love.data.compress('data', 'gzip', 'helloworld', -1)\n  local str17 = love.data.compress('data', 'gzip', 'helloworld', 0)\n  local str18 = love.data.compress('data', 'gzip', 'helloworld', 9)\n  -- check decompressed value matches whats expected\n  test:assertEquals('helloworld', love.data.decompress('string', 'lz4', str1), 'check string lz4 decompress')\n  test:assertEquals('helloworld', love.data.decompress('string', 'lz4', str2), 'check string lz4 decompress')\n  test:assertEquals('helloworld', love.data.decompress('string', 'lz4', str3), 'check string lz4 decompress')\n  test:assertEquals('helloworld', love.data.decompress('string', 'zlib', str4), 'check string zlib decompress')\n  test:assertEquals('helloworld', love.data.decompress('string', 'zlib', str5), 'check string zlib decompress')\n  test:assertEquals('helloworld', love.data.decompress('string', 'zlib', str6), 'check string zlib decompress')\n  test:assertEquals('helloworld', love.data.decompress('string', 'gzip', str7), 'check string glib decompress')\n  test:assertEquals('helloworld', love.data.decompress('string', 'gzip', str8), 'check string glib decompress')\n  test:assertEquals('helloworld', love.data.decompress('string', 'gzip', str9), 'check string glib decompress')\n  test:assertEquals(love.data.newByteData('helloworld'):getString(), love.data.decompress('data', 'lz4', str10):getString(), 'check data lz4 decompress')\n  test:assertEquals(love.data.newByteData('helloworld'):getString(), love.data.decompress('data', 'lz4', str11):getString(), 'check data lz4 decompress')\n  test:assertEquals(love.data.newByteData('helloworld'):getString(), love.data.decompress('data', 'lz4', str12):getString(), 'check data lz4 decompress')\n  test:assertEquals(love.data.newByteData('helloworld'):getString(), love.data.decompress('data', 'zlib', str13):getString(), 'check data zlib decompress')\n  test:assertEquals(love.data.newByteData('helloworld'):getString(), love.data.decompress('data', 'zlib', str14):getString(), 'check data zlib decompress')\n  test:assertEquals(love.data.newByteData('helloworld'):getString(), love.data.decompress('data', 'zlib', str15):getString(), 'check data zlib decompress')\n  test:assertEquals(love.data.newByteData('helloworld'):getString(), love.data.decompress('data', 'gzip', str16):getString(), 'check data glib decompress')\n  test:assertEquals(love.data.newByteData('helloworld'):getString(), love.data.decompress('data', 'gzip', str17):getString(), 'check data glib decompress')\n  test:assertEquals(love.data.newByteData('helloworld'):getString(), love.data.decompress('data', 'gzip', str18):getString(), 'check data glib decompress')\nend\n\n\n-- love.data.encode\nlove.test.data.encode = function(test)\n  -- here just testing each combo 'works' - in decode's test method\n  -- we actually check the encode + decode give the right value back\n  local encodes = {\n    { love.data.encode('string', 'base64', 'helloworld', 0), 'string'},\n    { love.data.encode('string', 'base64', 'helloworld', 2), 'string'},\n    { love.data.encode('string', 'hex', 'helloworld'), 'string'},\n    { love.data.encode('data', 'base64', 'helloworld', 0), 'userdata'},\n    { love.data.encode('data', 'base64', 'helloworld', 2), 'userdata'},\n    { love.data.encode('data', 'hex', 'helloworld'), 'userdata'}\n  }\n  for e=1,#encodes do\n    test:assertNotNil(encodes[e][1])\n    -- sense check return type and make sure bytedata returns are an object\n    test:assertEquals(encodes[e][2], type(encodes[e][1]), 'check is usedata')\n    if encodes[e][2] == 'userdata' then\n      test:assertNotEquals(nil, encodes[e][1]:type(), 'check has :type()')\n    end\n  end\n\nend\n\n\n-- love.data.getPackedSize\nlove.test.data.getPackedSize = function(test)\n  local pack1 = love.data.getPackedSize('>xI3b')\n  local pack2 = love.data.getPackedSize('>I2B')\n  local pack3 = love.data.getPackedSize('>I4I4I4I4x')\n  test:assertEquals(5, pack1, 'check pack size 1')\n  test:assertEquals(3, pack2, 'check pack size 2')\n  test:assertEquals(17, pack3, 'check pack size 3')\nend\n\n\n-- love.data.hash\nlove.test.data.hash = function(test)\n  -- setup all the different hashing types\n  local str1 = love.data.hash('string', 'md5', 'helloworld')\n  local str2 = love.data.hash('string', 'sha1', 'helloworld')\n  local str3 = love.data.hash('string', 'sha224', 'helloworld')\n  local str4 = love.data.hash('string', 'sha256', 'helloworld')\n  local str5 = love.data.hash('string', 'sha384', 'helloworld')\n  local str6 = love.data.hash('string', 'sha512', 'helloworld')\n  local data1 = love.data.hash('data', 'md5', 'helloworld')\n  local data2 = love.data.hash('data', 'sha1', 'helloworld')\n  local data3 = love.data.hash('data', 'sha224', 'helloworld')\n  local data4 = love.data.hash('data', 'sha256', 'helloworld')\n  local data5 = love.data.hash('data', 'sha384', 'helloworld')\n  local data6 = love.data.hash('data', 'sha512', 'helloworld')\n  -- check encoded hash value matches what's expected for that algo\n    -- test container string\n  test:assertEquals('fc5e038d38a57032085441e7fe7010b0', love.data.encode(\"string\", \"hex\", str1), 'check string md5 encode')\n  test:assertEquals('6adfb183a4a2c94a2f92dab5ade762a47889a5a1', love.data.encode(\"string\", \"hex\", str2), 'check string sha1 encode')\n  test:assertEquals('b033d770602994efa135c5248af300d81567ad5b59cec4bccbf15bcc', love.data.encode(\"string\", \"hex\", str3), 'check string sha224 encode')\n  test:assertEquals('936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af', love.data.encode(\"string\", \"hex\", str4), 'check string sha256 encode')\n  test:assertEquals('97982a5b1414b9078103a1c008c4e3526c27b41cdbcf80790560a40f2a9bf2ed4427ab1428789915ed4b3dc07c454bd9', love.data.encode(\"string\", \"hex\", str5), 'check string sha384 encode')\n  test:assertEquals('1594244d52f2d8c12b142bb61f47bc2eaf503d6d9ca8480cae9fcf112f66e4967dc5e8fa98285e36db8af1b8ffa8b84cb15e0fbcf836c3deb803c13f37659a60', love.data.encode(\"string\", \"hex\", str6), 'check string sha512 encode')\n    -- test container data\n  test:assertEquals('fc5e038d38a57032085441e7fe7010b0', love.data.encode(\"string\", \"hex\", data1), 'check data md5 encode')\n  test:assertEquals('6adfb183a4a2c94a2f92dab5ade762a47889a5a1', love.data.encode(\"string\", \"hex\", data2), 'check data sha1 encode')\n  test:assertEquals('b033d770602994efa135c5248af300d81567ad5b59cec4bccbf15bcc', love.data.encode(\"string\", \"hex\", data3), 'check data sha224 encode')\n  test:assertEquals('936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af', love.data.encode(\"string\", \"hex\", data4), 'check data sha256 encode')\n  test:assertEquals('97982a5b1414b9078103a1c008c4e3526c27b41cdbcf80790560a40f2a9bf2ed4427ab1428789915ed4b3dc07c454bd9', love.data.encode(\"string\", \"hex\", data5), 'check data sha384 encode')\n  test:assertEquals('1594244d52f2d8c12b142bb61f47bc2eaf503d6d9ca8480cae9fcf112f66e4967dc5e8fa98285e36db8af1b8ffa8b84cb15e0fbcf836c3deb803c13f37659a60', love.data.encode(\"string\", \"hex\", data6), 'check data sha512 encode')\nend\n\n\n-- love.data.newByteData\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.data.newByteData = function(test)\n  test:assertObject(love.data.newByteData('helloworld'))\nend\n\n\n-- love.data.newDataView\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.data.newDataView = function(test)\n  test:assertObject(love.data.newDataView(love.data.newByteData('helloworld'), 0, 10))\nend\n\n\n-- love.data.pack\nlove.test.data.pack = function(test)\n  local packed1 = love.data.pack('string', '>I4I4I4I4', 9999, 1000, 1010, 2030)\n  local packed2 = love.data.pack('data', '>I4I4I4I4', 9999, 1000, 1010, 2030)\n  local a, b, c, d = love.data.unpack('>I4I4I4I4', packed1)\n  local e, f, g, h = love.data.unpack('>I4I4I4I4', packed2)\n  test:assertEquals(9999+9999, a+e, 'check packed 1')\n  test:assertEquals(1000+1000, b+f, 'check packed 2')\n  test:assertEquals(1010+1010, c+g, 'check packed 3')\n  test:assertEquals(2030+2030, d+h, 'check packed 4')\nend\n\n\n-- love.data.unpack\nlove.test.data.unpack = function(test)\n  local packed1 = love.data.pack('string', '>s5s4I3', 'hello', 'love', 100)\n  local packed2 = love.data.pack('data', '>s5I2', 'world', 20)\n  local a, b, c = love.data.unpack('>s5s4I3', packed1)\n  local d, e = love.data.unpack('>s5I2', packed2)\n  test:assertEquals(a .. ' ' .. d, 'hello world', 'check unpack 1')\n  test:assertEquals(b, 'love', 'check unpack 2')\n  test:assertEquals(c - e, 80, 'check unpack 3')\nend\n"
  },
  {
    "path": "testing/tests/event.lua",
    "content": "-- love.event\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n------------------------------------METHODS-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.event.clear\nlove.test.event.clear = function(test)\n  -- push some events first\n  love.event.push('test', 1, 2, 3)\n  love.event.push('test', 1, 2, 3)\n  love.event.push('test', 1, 2, 3)\n  -- check after calling clear there are no events left\n  love.event.clear()\n  local count = 0\n  for n, a, b, c, d, e, f in love.event.poll() do\n    count = count + 1\n  end\n  test:assertEquals(0, count, 'check no events')\nend\n\n\n-- love.event.poll\nlove.test.event.poll = function(test)\n  -- push some events first\n  love.event.push('test', 1, 2, 3)\n  love.event.push('test', 1, 2, 3)\n  love.event.push('test', 1, 2, 3)\n  -- check poll recieves all events\n  local count = 0\n  for n, a, b, c, d, e, f in love.event.poll() do\n    count = count + 1\n  end\n  test:assertEquals(3, count, 'check 3 events')\nend\n\n\n-- love.event.pump\n-- @NOTE dont think can really test as internally used\nlove.test.event.pump = function(test)\n  test:skipTest('used internally')\nend\n\n\n-- love.event.push\nlove.test.event.push = function(test)\n  -- check pushing some different types\n  love.event.push('add', 1, 2, 3)\n  love.event.push('ignore', 1, 2, 3)\n  love.event.push('add', 1, 2, 3)\n  love.event.push('ignore', 1, 2, 3)\n  local count = 0\n  for n, a, b, c, d, e, f in love.event.poll() do\n    if n == 'add' then\n      count = count + a + b + c\n    end\n  end\n  test:assertEquals(12, count, 'check total events')\nend\n\n\n-- love.event.quit\nlove.test.event.quit = function(test)\n  -- setting this overrides the quit hook to prevent actually quitting\n  love.test.module.fakequit = true\n  love.event.quit(0)\n  -- if it failed we'd have quit here\n  test:assertTrue(true, 'check quit hook called')\nend\n\n\n-- love.event.wait\n-- @NOTE not sure best way to test this one\nlove.test.event.wait = function(test)\n  test:skipTest('used internally')\nend\n"
  },
  {
    "path": "testing/tests/filesystem.lua",
    "content": "-- love.filesystem\r\n\r\n\r\n--------------------------------------------------------------------------------\r\n--------------------------------------------------------------------------------\r\n------------------------------------OBJECTS-------------------------------------\r\n--------------------------------------------------------------------------------\r\n--------------------------------------------------------------------------------\r\n\r\n\r\n-- File (love.filesystem.newFile)\r\nlove.test.filesystem.File = function(test)\r\n\r\n  -- setup a file to play with\r\n  local file1 = love.filesystem.openFile('data.txt', 'w')\r\n  file1:write('helloworld')\r\n  test:assertObject(file1)\r\n  file1:close()\r\n\r\n  -- test read mode\r\n  file1:open('r')\r\n  test:assertEquals('r', file1:getMode(), 'check read mode')\r\n  local contents, size = file1:read()\r\n  test:assertEquals('helloworld', contents)\r\n  test:assertEquals(10, size, 'check file read')\r\n  test:assertEquals(10, file1:getSize())\r\n  local ok1, err1 = file1:write('hello')\r\n  test:assertNotEquals(nil, err1, 'check cant write in read mode')\r\n  local iterator = file1:lines()\r\n  test:assertNotEquals(nil, iterator, 'check can read lines')\r\n  test:assertEquals('data.txt', file1:getFilename(), 'check filename matches')\r\n  file1:close()\r\n\r\n  -- test write mode\r\n  file1:open('w')\r\n  test:assertEquals('w', file1:getMode(), 'check write mode')\r\n  contents, size = file1:read()\r\n  test:assertEquals(nil, contents, 'check cant read file in write mode')\r\n  test:assertEquals('string', type(size), 'check err message shown')\r\n  local ok2, err2 = file1:write('helloworld')\r\n  test:assertTrue(ok2, 'check file write')\r\n  test:assertEquals(nil, err2, 'check no err writing')\r\n\r\n  -- test open/closing\r\n  file1:open('r')\r\n  test:assertTrue(file1:isOpen(), 'check file is open')\r\n  file1:close()\r\n  test:assertFalse(file1:isOpen(), 'check file gets closed')\r\n  file1:close()\r\n\r\n  -- test buffering and flushing\r\n  file1:open('w')\r\n  local ok3, err3 = file1:setBuffer('full', 10000)\r\n  test:assertTrue(ok3)\r\n  test:assertEquals('full', file1:getBuffer())\r\n  file1:write('replacedcontent')\r\n  file1:flush()\r\n  file1:close()\r\n  file1:open('r')\r\n  contents, size = file1:read()\r\n  test:assertEquals('replacedcontent', contents, 'check buffered content was written')\r\n  file1:close()\r\n\r\n  -- loop through file data with seek/tell until EOF\r\n  file1:open('r')\r\n  local counter = 0\r\n  for i=1,100 do\r\n    file1:seek(i)\r\n    test:assertEquals(i, file1:tell())\r\n    if file1:isEOF() == true then\r\n      counter = i\r\n      break\r\n    end\r\n  end\r\n  test:assertEquals(counter, 15)\r\n  file1:close()\r\n\r\nend\r\n\r\n\r\n-- FileData (love.filesystem.newFileData)\r\nlove.test.filesystem.FileData = function(test)\r\n\r\n  -- create new obj\r\n  local fdata = love.filesystem.newFileData('helloworld', 'test.txt')\r\n  test:assertObject(fdata)\r\n  test:assertEquals('test.txt', fdata:getFilename())\r\n  test:assertEquals('txt', fdata:getExtension())\r\n\r\n  -- check properties match expected\r\n  test:assertEquals('helloworld', fdata:getString(), 'check data string')\r\n  test:assertEquals(10, fdata:getSize(), 'check data size')\r\n\r\n  -- check cloning the bytedata\r\n  local clonedfdata = fdata:clone()\r\n  test:assertObject(clonedfdata)\r\n  test:assertEquals('helloworld', clonedfdata:getString(), 'check cloned data')\r\n  test:assertEquals(10, clonedfdata:getSize(), 'check cloned size')\r\n\r\nend\r\n\r\n\r\n--------------------------------------------------------------------------------\r\n--------------------------------------------------------------------------------\r\n------------------------------------METHODS-------------------------------------\r\n--------------------------------------------------------------------------------\r\n--------------------------------------------------------------------------------\r\n\r\n\r\n-- love.filesystem.append\r\nlove.test.filesystem.append = function(test)\r\n\t-- create a new file to test with\r\n\tlove.filesystem.write('filesystem.append.txt', 'foo')\r\n\t-- try appending text and check new file contents/size matches\r\n\tlocal success, message = love.filesystem.append('filesystem.append.txt', 'bar')\r\n  test:assertNotEquals(false, success, 'check success')\r\n  test:assertEquals(nil, message, 'check no error msg')\r\n\tlocal contents, size = love.filesystem.read('filesystem.append.txt')\r\n\ttest:assertEquals(contents, 'foobar', 'check file contents')\r\n\ttest:assertEquals(size, 6, 'check file size')\r\n  -- check appending a specific no. of bytes\r\n  love.filesystem.append('filesystem.append.txt', 'foobarfoobarfoo', 6)\r\n  contents, size = love.filesystem.read('filesystem.append.txt')\r\n  test:assertEquals(contents, 'foobarfoobar', 'check appended contents')\r\n  test:assertEquals(size, 12, 'check appended size')\r\n  -- cleanup\r\n  love.filesystem.remove('filesystem.append.txt')\r\nend\r\n\r\n\r\n-- love.filesystem.areSymlinksEnabled\r\n-- @NOTE best can do here is just check not nil\r\nlove.test.filesystem.areSymlinksEnabled = function(test)\r\n  test:assertNotNil(love.filesystem.areSymlinksEnabled())\r\nend\r\n\r\n\r\n-- love.filesystem.createDirectory\r\nlove.test.filesystem.createDirectory = function(test)\r\n  -- try creating a dir + subdir and check both exist\r\n  local success = love.filesystem.createDirectory('foo/bar')\r\n  test:assertNotEquals(false, success, 'check success')\r\n  test:assertNotEquals(nil, love.filesystem.getInfo('foo', 'directory'), 'check directory created')\r\n  test:assertNotEquals(nil, love.filesystem.getInfo('foo/bar', 'directory'), 'check subdirectory created')\r\n  -- cleanup\r\n  love.filesystem.remove('foo/bar')\r\n  love.filesystem.remove('foo')\r\nend\r\n\r\n\r\n-- love.filesystem.getAppdataDirectory\r\n-- @NOTE i think this is too platform dependent to be tested nicely\r\nlove.test.filesystem.getAppdataDirectory = function(test)\r\n  test:assertNotNil(love.filesystem.getAppdataDirectory())\r\nend\r\n\r\n\r\n-- love.filesystem.getCRequirePath\r\nlove.test.filesystem.getCRequirePath = function(test)\r\n  -- check default value from documentation\r\n  test:assertEquals('??', love.filesystem.getCRequirePath(), 'check default value')\r\nend\r\n\r\n\r\n-- love.filesystem.getDirectoryItems\r\nlove.test.filesystem.getDirectoryItems = function(test)\r\n  -- create a dir + subdir with 2 files\r\n  love.filesystem.createDirectory('foo/bar')\r\n\tlove.filesystem.write('foo/file1.txt', 'file1')\r\n  love.filesystem.write('foo/bar/file2.txt', 'file2')\r\n  -- check both the file + subdir exist in the item list\r\n  local files = love.filesystem.getDirectoryItems('foo')\r\n  local hasfile = false\r\n  local hasdir = false\r\n  for _,v in ipairs(files) do\r\n    local info = love.filesystem.getInfo('foo/'..v)\r\n    if v == 'bar' and info.type == 'directory' then hasdir = true end\r\n    if v == 'file1.txt' and info.type == 'file' then hasfile = true end\r\n  end\r\n  test:assertTrue(hasfile, 'check file exists')\r\n  test:assertTrue(hasdir, 'check directory exists')\r\n  -- cleanup\r\n  love.filesystem.remove('foo/file1.txt')\r\n  love.filesystem.remove('foo/bar/file2.txt')\r\n  love.filesystem.remove('foo/bar')\r\n  love.filesystem.remove('foo')\r\nend\r\n\r\n\r\n-- love.filesystem.getFullCommonPath\r\nlove.test.filesystem.getFullCommonPath = function(test)\r\n  -- check standard paths\r\n  local appsavedir = love.filesystem.getFullCommonPath('appsavedir')\r\n  local appdocuments = love.filesystem.getFullCommonPath('appdocuments')\r\n  local userhome = love.filesystem.getFullCommonPath('userhome')\r\n  local userappdata = love.filesystem.getFullCommonPath('userappdata')\r\n  local userdesktop = love.filesystem.getFullCommonPath('userdesktop')\r\n  local userdocuments = love.filesystem.getFullCommonPath('userdocuments')\r\n  test:assertNotNil(appsavedir)\r\n  test:assertNotNil(appdocuments)\r\n  test:assertNotNil(userhome)\r\n  test:assertNotNil(userappdata)\r\n  test:assertNotNil(userdesktop)\r\n  test:assertNotNil(userdocuments)\r\n  -- check invalid path\r\n  local ok = pcall(love.filesystem.getFullCommonPath, 'fakepath')\r\n  test:assertFalse(ok, 'check invalid common path')\r\nend\r\n\r\n\r\n-- love.filesystem.getIdentity\r\nlove.test.filesystem.getIdentity = function(test)\r\n  -- check setting identity matches\r\n  local original = love.filesystem.getIdentity()\r\n  love.filesystem.setIdentity('lover')\r\n  test:assertEquals('lover', love.filesystem.getIdentity(), 'check identity matches')\r\n  -- put back to original value\r\n  love.filesystem.setIdentity(original)\r\nend\r\n\r\n\r\n-- love.filesystem.getRealDirectory\r\nlove.test.filesystem.getRealDirectory = function(test)\r\n  -- make a test dir + file first\r\n  love.filesystem.createDirectory('foo')\r\n  love.filesystem.write('foo/test.txt', 'test')\r\n  -- check save dir matches the real dir we just wrote to\r\n  test:assertEquals(love.filesystem.getSaveDirectory(),\r\n    love.filesystem.getRealDirectory('foo/test.txt'), 'check directory matches')\r\n  -- cleanup\r\n  love.filesystem.remove('foo/test.txt')\r\n  love.filesystem.remove('foo')\r\nend\r\n\r\n\r\n-- love.filesystem.getRequirePath\r\nlove.test.filesystem.getRequirePath = function(test)\r\n  test:assertEquals('?.lua;?/init.lua',\r\n    love.filesystem.getRequirePath(), 'check default value')\r\nend\r\n\r\n\r\n-- love.filesystem.getSource\r\n-- @NOTE i dont think we can test this cos love calls it first\r\nlove.test.filesystem.getSource = function(test)\r\n  test:skipTest('used internally')\r\nend\r\n\r\n\r\n-- love.filesystem.getSourceBaseDirectory\r\n-- @NOTE i think this is too platform dependent to be tested nicely\r\nlove.test.filesystem.getSourceBaseDirectory = function(test)\r\n  test:assertNotNil(love.filesystem.getSourceBaseDirectory())\r\nend\r\n\r\n\r\n-- love.filesystem.getUserDirectory\r\n-- @NOTE i think this is too platform dependent to be tested nicely\r\nlove.test.filesystem.getUserDirectory = function(test)\r\n  test:assertNotNil(love.filesystem.getUserDirectory())\r\nend\r\n\r\n\r\n-- love.filesystem.getWorkingDirectory\r\n-- @NOTE i think this is too platform dependent to be tested nicely\r\nlove.test.filesystem.getWorkingDirectory = function(test)\r\n  test:assertNotNil(love.filesystem.getWorkingDirectory())\r\nend\r\n\r\n\r\n-- love.filesystem.getSaveDirectory\r\n-- @NOTE i think this is too platform dependent to be tested nicely\r\nlove.test.filesystem.getSaveDirectory = function(test)\r\n  test:assertNotNil(love.filesystem.getSaveDirectory())\r\nend\r\n\r\n\r\n-- love.filesystem.getInfo\r\nlove.test.filesystem.getInfo = function(test)\r\n  -- create a dir and subdir with a file\r\n  love.filesystem.createDirectory('foo/bar')\r\n  love.filesystem.write('foo/bar/file2.txt', 'file2')\r\n  -- check getinfo returns the correct values\r\n  test:assertEquals(nil, love.filesystem.getInfo('foo/bar/file2.txt', 'directory'), 'check not directory')\r\n  test:assertNotEquals(nil, love.filesystem.getInfo('foo/bar/file2.txt'), 'check info not nil')\r\n  test:assertEquals(love.filesystem.getInfo('foo/bar/file2.txt').size, 5, 'check info size match')\r\n  test:assertFalse(love.filesystem.getInfo('foo/bar/file2.txt').readonly, 'check readonly')\r\n  -- @TODO test modified timestamp from info.modtime?\r\n  -- cleanup\r\n  love.filesystem.remove('foo/bar/file2.txt')\r\n  love.filesystem.remove('foo/bar')\r\n  love.filesystem.remove('foo')\r\nend\r\n\r\n\r\n-- love.filesystem.isFused\r\nlove.test.filesystem.isFused = function(test)\r\n  -- kinda assuming you'd run the testsuite in a non-fused game\r\n  test:assertEquals(love.filesystem.isFused(), false, 'check not fused')\r\nend\r\n\r\n\r\n-- love.filesystem.lines\r\nlove.test.filesystem.lines = function(test)\r\n  -- check lines returns the 3 lines expected\r\n  love.filesystem.write('file.txt', 'line1\\nline2\\nline3')\r\n  local linenum = 1\r\n  for line in love.filesystem.lines('file.txt') do\r\n    test:assertEquals('line' .. tostring(linenum), line, 'check line matches')\r\n    -- also check it removes newlines like the docs says it does\r\n    test:assertEquals(nil, string.find(line, '\\n'), 'check newline removed')\r\n    linenum = linenum + 1\r\n  end\r\n  -- cleanup\r\n  love.filesystem.remove('file.txt')\r\nend\r\n\r\n\r\n-- love.filesystem.load\r\nlove.test.filesystem.load = function(test)\r\n  -- setup some fake lua files\r\n  love.filesystem.write('test1.lua', 'function test()\\nreturn 1\\nend\\nreturn test()')\r\n  love.filesystem.write('test2.lua', 'function test()\\nreturn 1')\r\n\r\n  if test:isAtLeastLuaVersion(5.2) or test:isLuaJITEnabled() then\r\n    -- check file that doesn't exist\r\n    local chunk1, errormsg1 = love.filesystem.load('faker.lua', 'b')\r\n    test:assertEquals(nil, chunk1, 'check file doesnt exist')\r\n    -- check valid lua file (text load)\r\n    local chunk2, errormsg2 = love.filesystem.load('test1.lua', 't')\r\n    test:assertEquals(nil, errormsg2, 'check no error message')\r\n    test:assertEquals(1, chunk2(), 'check lua file runs')\r\n  else\r\n    local _, errormsg3 = love.filesystem.load('test1.lua', 'b')\r\n    test:assertNotEquals(nil, errormsg3, 'check for an error message')\r\n\r\n    local _, errormsg4 = love.filesystem.load('test1.lua', 't')\r\n    test:assertNotEquals(nil, errormsg4, 'check for an error message')\r\n  end\r\n\r\n  -- check valid lua file (any load)\r\n  local chunk5, errormsg5 = love.filesystem.load('test1.lua', 'bt')\r\n  test:assertEquals(nil, errormsg5, 'check no error message')\r\n  test:assertEquals(1, chunk5(), 'check lua file runs')\r\n\r\n  -- check invalid lua file\r\n  local ok, chunk, err = pcall(love.filesystem.load, 'test2.lua')\r\n  test:assertFalse(ok, 'check invalid lua file')\r\n  -- cleanup\r\n  love.filesystem.remove('test1.lua')\r\n  love.filesystem.remove('test2.lua')\r\nend\r\n\r\n\r\n-- love.filesystem.mount\r\nlove.test.filesystem.mount = function(test)\r\n  -- write an example zip to savedir to use\r\n  local contents, size = love.filesystem.read('resources/test.zip') -- contains test.txt\r\n  love.filesystem.write('test.zip', contents, size)\r\n  -- check mounting file and check contents are mounted\r\n  local success = love.filesystem.mount('test.zip', 'test')\r\n  test:assertTrue(success, 'check success')\r\n  test:assertNotEquals(nil, love.filesystem.getInfo('test'), 'check mount not nil')\r\n  test:assertEquals('directory', love.filesystem.getInfo('test').type, 'check directory made')\r\n  test:assertNotEquals(nil, love.filesystem.getInfo('test/test.txt'), 'check file not nil')\r\n  test:assertEquals('file', love.filesystem.getInfo('test/test.txt').type, 'check file type')\r\n  -- cleanup\r\n  love.filesystem.remove('test/test.txt')\r\n  love.filesystem.remove('test')\r\n  love.filesystem.remove('test.zip')\r\nend\r\n\r\n\r\n-- love.filesystem.mountFullPath\r\nlove.test.filesystem.mountFullPath = function(test)\r\n  -- mount something in the working directory\r\n  local mount = love.filesystem.mountFullPath(love.filesystem.getSource() .. '/tests', 'tests', 'read')\r\n  test:assertTrue(mount, 'check can mount')\r\n  -- check reading file through mounted path label\r\n  local contents, _ = love.filesystem.read('tests/audio.lua')\r\n  test:assertNotEquals(nil, contents)\r\n  local unmount = love.filesystem.unmountFullPath(love.filesystem.getSource() .. '/tests')\r\n  test:assertTrue(unmount, 'reset mount')\r\nend\r\n\r\n\r\n-- love.filesystem.unmountFullPath\r\nlove.test.filesystem.unmountFullPath = function(test)\r\n  -- try unmounting something we never mounted\r\n  local unmount1 = love.filesystem.unmountFullPath(love.filesystem.getSource() .. '/faker')\r\n  test:assertFalse(unmount1, 'check not mounted to start with')\r\n  -- mount something to unmount after\r\n  love.filesystem.mountFullPath(love.filesystem.getSource() .. '/tests', 'tests', 'read')\r\n  local unmount2 = love.filesystem.unmountFullPath(love.filesystem.getSource() .. '/tests')\r\n  test:assertTrue(unmount2, 'check unmounted')\r\nend\r\n\r\n\r\n-- love.filesystem.mountCommonPath\r\nlove.test.filesystem.mountCommonPath = function(test)\r\n  -- check if we can mount all the expected paths\r\n  local mount1 = love.filesystem.mountCommonPath('appsavedir', 'appsavedir', 'readwrite')\r\n  local mount2 = love.filesystem.mountCommonPath('appdocuments', 'appdocuments', 'readwrite')\r\n  local mount3 = love.filesystem.mountCommonPath('userhome', 'userhome', 'readwrite')\r\n  local mount4 = love.filesystem.mountCommonPath('userappdata', 'userappdata', 'readwrite')\r\n  -- userdesktop isnt valid on linux\r\n  if not test:isOS('Linux') then\r\n    local mount5 = love.filesystem.mountCommonPath('userdesktop', 'userdesktop', 'readwrite')\r\n    test:assertTrue(mount5, 'check mount userdesktop')\r\n  end\r\n  local mount6 = love.filesystem.mountCommonPath('userdocuments', 'userdocuments', 'readwrite')\r\n  local ok = pcall(love.filesystem.mountCommonPath, 'fakepath', 'fake', 'readwrite')\r\n  test:assertFalse(mount1, 'check mount appsavedir') -- This is already mounted, we can't do it again.\r\n  test:assertTrue(mount2, 'check mount appdocuments')\r\n  test:assertTrue(mount3, 'check mount userhome')\r\n  test:assertTrue(mount4, 'check mount userappdata')\r\n  test:assertTrue(mount6, 'check mount userdocuments')\r\n  test:assertFalse(ok, 'check mount invalid common path fails')\r\nend\r\n\r\n\r\n-- love.filesystem.unmountCommonPath\r\n--love.test.filesystem.unmountCommonPath = function(test)\r\n--  -- check unmounting invalid\r\n--  local ok = pcall(love.filesystem.unmountCommonPath, 'fakepath')\r\n--  test:assertFalse(ok, 'check unmount invalid common path')\r\n--  -- check mounting valid paths\r\n--  love.filesystem.mountCommonPath('appsavedir', 'appsavedir', 'read')\r\n--  love.filesystem.mountCommonPath('appdocuments', 'appdocuments', 'read')\r\n--  love.filesystem.mountCommonPath('userhome', 'userhome', 'read')\r\n--  love.filesystem.mountCommonPath('userappdata', 'userappdata', 'read')\r\n--  love.filesystem.mountCommonPath('userdesktop', 'userdesktop', 'read')\r\n--  love.filesystem.mountCommonPath('userdocuments', 'userdocuments', 'read')\r\n--  local unmount1 = love.filesystem.unmountCommonPath('appsavedir')\r\n--  local unmount2 = love.filesystem.unmountCommonPath('appdocuments')\r\n--  local unmount3 = love.filesystem.unmountCommonPath('userhome')\r\n--  local unmount4 = love.filesystem.unmountCommonPath('userappdata')\r\n--  local unmount5 = love.filesystem.unmountCommonPath('userdesktop')\r\n--  local unmount6 = love.filesystem.unmountCommonPath('userdocuments')\r\n--  test:assertTrue(unmount1, 'check unmount appsavedir')\r\n--  test:assertTrue(unmount2, 'check unmount appdocuments')\r\n--  test:assertTrue(unmount3, 'check unmount userhome')\r\n--  test:assertTrue(unmount4, 'check unmount userappdata')\r\n--  test:assertTrue(unmount5, 'check unmount userdesktop')\r\n--  test:assertTrue(unmount6, 'check unmount userdocuments')\r\n--  -- remount or future tests fail\r\n--  love.filesystem.mountCommonPath('appsavedir', 'appsavedir', 'readwrite')\r\n--  love.filesystem.mountCommonPath('appdocuments', 'appdocuments', 'readwrite')\r\n--  love.filesystem.mountCommonPath('userhome', 'userhome', 'readwrite')\r\n--  love.filesystem.mountCommonPath('userappdata', 'userappdata', 'readwrite')\r\n--  love.filesystem.mountCommonPath('userdesktop', 'userdesktop', 'readwrite')\r\n--  love.filesystem.mountCommonPath('userdocuments', 'userdocuments', 'readwrite')\r\n--end\r\n\r\n\r\n-- love.filesystem.openFile\r\n-- @NOTE this is just basic nil checking, objs have their own test method\r\nlove.test.filesystem.openFile = function(test)\r\n  test:assertNotNil(love.filesystem.openFile('file2.txt', 'w'))\r\n  test:assertNotNil(love.filesystem.openFile('file2.txt', 'r'))\r\n  test:assertNotNil(love.filesystem.openFile('file2.txt', 'a'))\r\n  test:assertNotNil(love.filesystem.openFile('file2.txt', 'c'))\r\n  love.filesystem.remove('file2.txt')\r\nend\r\n\r\n\r\n-- love.filesystem.newFileData\r\n-- @NOTE this is just basic nil checking, objs have their own test method\r\nlove.test.filesystem.newFileData = function(test)\r\n  test:assertNotNil(love.filesystem.newFileData('helloworld', 'file1'))\r\nend\r\n\r\n\r\n-- love.filesystem.read\r\nlove.test.filesystem.read = function(test)\r\n  -- check reading a full file\r\n  local content, size = love.filesystem.read('resources/test.txt')\r\n  test:assertNotEquals(nil, content, 'check not nil')\r\n  test:assertEquals('helloworld', content, 'check content match')\r\n  test:assertEquals(10, size, 'check size match')\r\n  -- check reading partial file\r\n  content, size = love.filesystem.read('resources/test.txt', 5)\r\n  test:assertNotEquals(nil, content, 'check not nil')\r\n  test:assertEquals('hello', content, 'check content match')\r\n  test:assertEquals(5, size, 'check size match')\r\nend\r\n\r\n\r\n-- love.filesystem.remove\r\nlove.test.filesystem.remove = function(test)\r\n  -- create a dir + subdir with a file\r\n  love.filesystem.createDirectory('foo/bar')\r\n  love.filesystem.write('foo/bar/file2.txt', 'helloworld')\r\n  -- check removing files + dirs (should fail to remove dir if file inside)\r\n  test:assertFalse(love.filesystem.remove('foo'), 'check fail when file inside')\r\n  test:assertFalse(love.filesystem.remove('foo/bar'), 'check fail when file inside')\r\n  test:assertTrue(love.filesystem.remove('foo/bar/file2.txt'), 'check file removed')\r\n  test:assertTrue(love.filesystem.remove('foo/bar'), 'check subdirectory removed')\r\n  test:assertTrue(love.filesystem.remove('foo'), 'check directory removed')\r\n  -- cleanup not needed here hopefully...\r\nend\r\n\r\n\r\n-- love.filesystem.setCRequirePath\r\nlove.test.filesystem.setCRequirePath = function(test)\r\n  -- check setting path val is returned\r\n  love.filesystem.setCRequirePath('/??')\r\n  test:assertEquals('/??', love.filesystem.getCRequirePath(), 'check crequirepath value')\r\n  love.filesystem.setCRequirePath('??')\r\nend\r\n\r\n\r\n-- love.filesystem.setIdentity\r\nlove.test.filesystem.setIdentity = function(test)\r\n  -- check setting identity val is returned\r\n  local original = love.filesystem.getIdentity()\r\n  love.filesystem.setIdentity('lover')\r\n  test:assertEquals('lover', love.filesystem.getIdentity(), 'check indentity value')\r\n  -- return value to original\r\n  love.filesystem.setIdentity(original)\r\nend\r\n\r\n\r\n-- love.filesystem.setRequirePath\r\nlove.test.filesystem.setRequirePath = function(test)\r\n  -- check setting path val is returned\r\n  love.filesystem.setRequirePath('?.lua;?/start.lua')\r\n  test:assertEquals('?.lua;?/start.lua', love.filesystem.getRequirePath(), 'check require path')\r\n  -- reset to default\r\n  love.filesystem.setRequirePath('?.lua;?/init.lua')\r\nend\r\n\r\n\r\n-- love.filesystem.setSource\r\nlove.test.filesystem.setSource = function(test)\r\n  test:skipTest('used internally')\r\nend\r\n\r\n\r\n-- love.filesystem.unmount\r\nlove.test.filesystem.unmount = function(test)\r\n  -- create a zip file mounted to use\r\n  local contents, size = love.filesystem.read('resources/test.zip') -- contains test.txt\r\n  love.filesystem.write('test.zip', contents, size)\r\n  love.filesystem.mount('test.zip', 'test')\r\n  -- check mounted, unmount, then check its unmounted\r\n  test:assertNotEquals(nil, love.filesystem.getInfo('test/test.txt'), 'check mount exists')\r\n  love.filesystem.unmount('test.zip')\r\n  test:assertEquals(nil, love.filesystem.getInfo('test/test.txt'), 'check unmounted')\r\n  -- cleanup\r\n  love.filesystem.remove('test/test.txt')\r\n  love.filesystem.remove('test')\r\n  love.filesystem.remove('test.zip')\r\nend\r\n\r\n\r\n-- love.filesystem.write\r\nlove.test.filesystem.write = function(test)\r\n  -- check writing a bunch of files matches whats read back\r\n  love.filesystem.write('test1.txt', 'helloworld')\r\n  love.filesystem.write('test2.txt', 'helloworld', 10)\r\n  love.filesystem.write('test3.txt', 'helloworld', 5)\r\n  test:assertEquals('helloworld', love.filesystem.read('test1.txt'), 'check read file')\r\n  test:assertEquals('helloworld', love.filesystem.read('test2.txt'), 'check read all')\r\n  test:assertEquals('hello', love.filesystem.read('test3.txt'), 'check read partial')\r\n  -- cleanup\r\n  love.filesystem.remove('test1.txt')\r\n  love.filesystem.remove('test2.txt')\r\n  love.filesystem.remove('test3.txt')\r\nend\r\n"
  },
  {
    "path": "testing/tests/font.lua",
    "content": "-- love.font\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n------------------------------------OBJECTS-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- GlyphData (love.font.newGlyphData)\nlove.test.font.GlyphData = function(test)\n\n  -- create obj\n  local rasterizer = love.font.newRasterizer('resources/font.ttf')\n  local gdata = love.font.newGlyphData(rasterizer, 97) -- 'a'\n  test:assertObject(gdata)\n\n  -- check properties match expected\n  test:assertNotNil(gdata:getString())\n  test:assertEquals(128, gdata:getSize(), 'check data size')\n  test:assertEquals(9, gdata:getAdvance(), 'check advance')\n  test:assertEquals('la8', gdata:getFormat(), 'check format')\n\n  -- @TODO \n  --[[\n    currently these will return 0 and '' respectively as not implemented\n    https://github.com/love2d/love/blob/12.0-development/src/modules/font/freetype/TrueTypeRasterizer.cpp#L140-L141\n    \"basically I haven't decided what to do here yet, because of the more \n    advanced text shaping that happens in love 12 having a unicode codepoint \n    associated with a glyph probably doesn't make sense in the first place\"\n  ]]--\n  --test:assertEquals(97, gdata:getGlyph(), 'check glyph number') - returns 0\n  --test:assertEquals('a', gdata:getGlyphString(), 'check glyph string') - returns ''\n\n  -- check height + width\n  test:assertEquals(8, gdata:getHeight(), 'check height')\n  test:assertEquals(8, gdata:getWidth(), 'check width')\n\n  -- check boundary / dimensions\n  local x, y, w, h = gdata:getBoundingBox()\n  local dw, dh = gdata:getDimensions()\n  test:assertEquals(0, x, 'check bbox x')\n  test:assertEquals(-3, y, 'check bbox y')\n  test:assertEquals(8, w, 'check bbox w')\n  test:assertEquals(14, h, 'check bbox h')\n  test:assertEquals(8, dw, 'check dim width')\n  test:assertEquals(8, dh, 'check dim height')\n\n  -- check bearing\n  local bw, bh = gdata:getBearing()\n  test:assertEquals(0, bw, 'check bearing w')\n  test:assertEquals(11, bh, 'check bearing h')\n\nend\n\n\n-- Rasterizer (love.font.newRasterizer)\nlove.test.font.Rasterizer = function(test)\n\n  -- create obj\n  local rasterizer = love.font.newRasterizer('resources/font.ttf')\n  test:assertObject(rasterizer)\n\n  -- check advance\n  test:assertEquals(9, rasterizer:getAdvance(), 'check advance')\n\n  -- check ascent/descent\n  test:assertEquals(9, rasterizer:getAscent(), 'check ascent')\n  test:assertEquals(-3, rasterizer:getDescent(), 'check descent')\n\n  -- check glyphcount\n  test:assertEquals(77, rasterizer:getGlyphCount(), 'check glyph count')\n\n  -- check specific glyphs\n  test:assertObject(rasterizer:getGlyphData('L'))\n  test:assertTrue(rasterizer:hasGlyphs('L', 'O', 'V', 'E'), 'check LOVE')\n\n  -- check height + lineheight\n  test:assertEquals(12, rasterizer:getHeight(), 'check height')\n  test:assertEquals(15, rasterizer:getLineHeight(), 'check line height')\n\nend\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n------------------------------------METHODS-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.font.newBMFontRasterizer\nlove.test.font.newBMFontRasterizer = function(test)\n  local rasterizer = love.font.newBMFontRasterizer('resources/love.png');\n  test:assertObject(rasterizer)\nend\n\n\n-- love.font.newGlyphData\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.font.newGlyphData = function(test)\n  local img = love.image.newImageData('resources/love.png')\n  local rasterizer = love.font.newImageRasterizer(img, 'ABC', 0, 1);\n  local glyphdata = love.font.newGlyphData(rasterizer, 65)\n  test:assertObject(glyphdata)\nend\n\n\n-- love.font.newImageRasterizer\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.font.newImageRasterizer = function(test)\n  local img = love.image.newImageData('resources/love.png')\n  local rasterizer = love.font.newImageRasterizer(img, 'ABC', 0, 1);\n  test:assertObject(rasterizer)\nend\n\n\n-- love.font.newRasterizer\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.font.newRasterizer = function(test)\n  test:assertObject(love.font.newRasterizer('resources/font.ttf'))\nend\n\n\n-- love.font.newTrueTypeRasterizer\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.font.newTrueTypeRasterizer = function(test)\n  test:assertObject(love.font.newTrueTypeRasterizer(12, \"normal\", 1))\n  test:assertObject(love.font.newTrueTypeRasterizer('resources/font.ttf', 8, \"normal\", 1))\nend\n"
  },
  {
    "path": "testing/tests/graphics.lua",
    "content": "-- love.graphics\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n------------------------------------OBJECTS-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- GraphicsBuffer (love.graphics.newBuffer)\nlove.test.graphics.Buffer = function(test)\n\n  -- setup vertex data and create some buffers\n  local vertexformat = {\n    {name=\"VertexPosition\", format=\"floatvec2\", location=0},\n    {name=\"VertexTexCoord\", format=\"floatvec2\", location=1},\n    {name=\"VertexColor\", format=\"unorm8vec4\", location=2},\n  }\n  local vertexdata = {\n    {0,  0,  0, 0, 1, 0, 1, 1},\n    {10, 0,  1, 0, 0, 1, 1, 1},\n    {10, 10, 1, 1, 0, 0, 1, 1},\n    {0,  10, 0, 1, 1, 0, 0, 1},\n  }\n  local flatvertexdata = {}\n  for i, vert in ipairs(vertexdata) do\n    for j, v in ipairs(vert) do\n      table.insert(flatvertexdata, v)\n    end\n  end\n  local vertexbuffer1 = love.graphics.newBuffer(vertexformat, 4, {vertex=true, debugname='testvertexbuffer'})\n  local vertexbuffer2 = love.graphics.newBuffer(vertexformat, vertexdata, {vertex=true})\n  test:assertObject(vertexbuffer1)\n  test:assertObject(vertexbuffer2)\n\n  -- check buffer properties\n  test:assertEquals(4, vertexbuffer1:getElementCount(), 'check vertex count 1')\n  test:assertEquals(4, vertexbuffer2:getElementCount(), 'check vertex count 2')\n  -- vertex buffers have their elements tightly packed.\n  test:assertEquals(20, vertexbuffer1:getElementStride(), 'check vertex array stride')\n  test:assertEquals(20 * 4, vertexbuffer1:getSize(), 'check vertex buffer size')\n  vertexbuffer1:setArrayData(vertexdata)\n  vertexbuffer1:setArrayData(flatvertexdata)\n  vertexbuffer1:clear(8, 8) -- partial clear (the first texcoord)\n\n  -- check buffer types\n  test:assertTrue(vertexbuffer1:isBufferType('vertex'), 'check is vertex buffer')\n  test:assertFalse(vertexbuffer1:isBufferType('index'), 'check is not index buffer')\n  test:assertFalse(vertexbuffer1:isBufferType('texel'), 'check is not texel buffer')\n  test:assertFalse(vertexbuffer1:isBufferType('shaderstorage'), 'check is not shader storage buffer')\n\n  -- check debug name\n  test:assertEquals('testvertexbuffer', vertexbuffer1:getDebugName(), 'check buffer debug name')\n\n  -- check buffer format and format properties\n  local format = vertexbuffer1:getFormat()\n  test:assertEquals('table', type(format), 'check buffer format is table')\n  test:assertEquals(#vertexformat, #format, 'check buffer format length')\n  for i, v in ipairs(vertexformat) do\n    test:assertEquals(v.name, format[i].name, string.format('check buffer format %d name', i))\n    test:assertEquals(v.format, format[i].format, string.format('check buffer format %d format', i))\n    test:assertEquals(0, format[i].arraylength, string.format('check buffer format %d array length', i))\n    test:assertNotNil(format[i].offset)\n  end\n\n  -- check index buffer\n  local indexbuffer = love.graphics.newBuffer('uint16', 128, {index=true})\n  test:assertTrue(indexbuffer:isBufferType('index'), 'check is index buffer')\n\nend\n\n\n-- Shader Storage GraphicsBuffer (love.graphics.newBuffer)\n-- Separated from the above test so we can skip it when they aren't supported.\nlove.test.graphics.ShaderStorageBuffer = function(test)\n  if not love.graphics.getSupported().glsl4 then\n    test:skipTest('GLSL 4 and shader storage buffers are not supported on this system')\n    return\n  end\n\n  -- setup buffer\n  local format = {\n    { name=\"1\", format=\"float\" },\n    { name=\"2\", format=\"floatmat4x4\" },\n    { name=\"3\", format=\"floatvec2\" }\n  }\n  local buffer = love.graphics.newBuffer(format, 1, {shaderstorage = true})\n  test:assertEquals(96, buffer:getElementStride(), 'check shader storage buffer element stride')\n\n  -- set new data\n  local data = {}\n  for i = 1, 19 do\n    data[i] = 0\n  end\n  buffer:setArrayData(data)\n\nend\n\n\n-- Canvas (love.graphics.newCanvas)\nlove.test.graphics.Canvas = function(test)\n\n  -- create canvas with defaults\n  local canvas = love.graphics.newCanvas(100, 100, {\n    type = '2d',\n    format = 'normal',\n    readable = true,\n    msaa = 0,\n    dpiscale = love.graphics.getDPIScale(),\n    mipmaps = 'auto',\n    debugname = 'testcanvas'\n  })\n  test:assertObject(canvas)\n  test:assertTrue(canvas:isCanvas(), 'check is canvas')\n  test:assertFalse(canvas:isComputeWritable(), 'check not compute writable')\n\n  -- check dpi\n  test:assertEquals(love.graphics.getDPIScale(), canvas:getDPIScale(), 'check dpi scale')\n\n  -- check depth\n  test:assertEquals(1, canvas:getDepth(), 'check depth is 2d')\n  test:assertEquals(nil, canvas:getDepthSampleMode(), 'check depth sample nil')\n\n  local maxanisotropy = love.graphics.getSystemLimits().anisotropy\n\n  -- check fliter\n  local min1, mag1, ani1 = canvas:getFilter()\n  test:assertEquals('nearest', min1, 'check filter def min')\n  test:assertEquals('nearest', mag1, 'check filter def mag')\n  test:assertEquals(1, ani1, 'check filter def ani')\n  canvas:setFilter('linear', 'linear', 2)\n  local min2, mag2, ani2 = canvas:getFilter()\n  test:assertEquals('linear', min2, 'check filter changed min')\n  test:assertEquals('linear', mag2, 'check filter changed mag')\n  test:assertEquals(math.min(maxanisotropy, 2), ani2, 'check filter changed ani')\n\n  -- check layer\n  test:assertEquals(1, canvas:getLayerCount(), 'check 1 layer for 2d')\n\n  -- check texture type\n  test:assertEquals('2d', canvas:getTextureType(), 'check 2d')\n\n  -- check texture wrap\n  local horiz1, vert1 = canvas:getWrap()\n  test:assertEquals('clamp', horiz1, 'check def wrap h')\n  test:assertEquals('clamp', vert1, 'check def wrap v')\n  canvas:setWrap('repeat', 'repeat')\n  local horiz2, vert2 = canvas:getWrap()\n  test:assertEquals('repeat', horiz2, 'check changed wrap h')\n  test:assertEquals('repeat', vert2, 'check changed wrap v')\n\n    -- check readable\n  test:assertTrue(canvas:isReadable(), 'check canvas readable')\n\n  -- check msaa\n  test:assertEquals(1, canvas:getMSAA(), 'check samples match')\n\n  -- check dimensions\n  local cw, ch = canvas:getDimensions()\n  test:assertEquals(100, cw, 'check canvas dim w')\n  test:assertEquals(100, ch, 'check canvas dim h')\n  test:assertEquals(cw, canvas:getWidth(), 'check canvas w matches dim')\n  test:assertEquals(ch, canvas:getHeight(), 'check canvas h matches dim')\n  local pw, ph = canvas:getPixelDimensions()\n  test:assertEquals(100*love.graphics.getDPIScale(), pw, 'check pixel dim w')\n  test:assertEquals(100*love.graphics.getDPIScale(), ph, 'check pixel dim h')\n  test:assertEquals(pw, canvas:getPixelWidth(), 'check pixel w matches dim')\n  test:assertEquals(ph, canvas:getPixelHeight(), 'check pixel h matches dim')\n\n  -- check mipmaps\n  local mode, sharpness = canvas:getMipmapFilter()\n  test:assertEquals('linear', mode, 'check def minmap filter  mode')\n  test:assertEquals(0, sharpness, 'check def minmap filter sharpness')\n  local name, version, vendor, device = love.graphics.getRendererInfo()\n  canvas:setMipmapFilter('nearest', 1)\n  mode, sharpness = canvas:getMipmapFilter()\n  test:assertEquals('nearest', mode, 'check changed minmap filter  mode')\n  -- @NOTE mipmap sharpness wont work on opengl/metal\n  if string.match(name, 'OpenGL ES') == nil and string.match(name, 'Metal') == nil then\n    test:assertEquals(1, sharpness, 'check changed minmap filter sharpness')\n  end\n  test:assertGreaterEqual(2, canvas:getMipmapCount()) -- docs say no mipmaps should return 1\n  test:assertEquals('auto', canvas:getMipmapMode())\n\n  -- check debug name\n  test:assertEquals('testcanvas', canvas:getDebugName())\n\n  -- check basic rendering\n  canvas:renderTo(function()\n    love.graphics.setColor(1, 0, 0)\n    love.graphics.rectangle('fill', 0, 0, 200, 200)\n    love.graphics.setColor(1, 1, 1, 1)\n  end)\n  local imgdata1 = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata1)\n\n  -- check using canvas in love.graphics.draw()\n  local xcanvas = love.graphics.newCanvas()\n  love.graphics.setCanvas(xcanvas)\n    love.graphics.draw(canvas, 0, 0)\n  love.graphics.setCanvas()\n  local imgdata2 = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata2)\n\n  -- check y-down\n  local shader1 = love.graphics.newShader[[\n    vec4 effect(vec4 c, Image tex, vec2 tc, vec2 pc) {\n      return tc.y > 0.5 ? vec4(1.0, 0.0, 0.0, 1.0) : vec4(0.0, 1.0, 0.0, 1.0);\n    }\n  ]]\n  local shader2 = love.graphics.newShader[[\n    vec4 effect(vec4 c, Image tex, vec2 tc, vec2 pc) {\n      // rounding during quantization from float to unorm8 doesn't seem to be\n      // totally consistent across devices, lets do it ourselves.\n      highp vec2 value = pc / love_ScreenSize.xy;\n      highp vec2 quantized = (floor(255.0 * value + 0.5) + 0.1) / 255.0;\n      return vec4(quantized, 0.0, 1.0);\n    }\n  ]]\n  local img = love.graphics.newImage(love.image.newImageData(1, 1))\n\n  love.graphics.push(\"all\")\n    love.graphics.setCanvas(canvas)\n    love.graphics.setShader(shader1)\n    love.graphics.draw(img, 0, 0, 0, canvas:getDimensions())\n  love.graphics.pop()\n  local imgdata3 = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata3)\n\n  love.graphics.push(\"all\")\n    love.graphics.setCanvas(canvas)\n    love.graphics.setShader(shader2)\n    love.graphics.draw(img, 0, 0, 0, canvas:getDimensions())\n  love.graphics.pop()\n  local imgdata4 = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata4)\n\n\n  -- check depth samples\n  local dcanvas = love.graphics.newCanvas(100, 100, {\n    type = '2d',\n    format = 'depth16',\n    readable = true\n  })\n  test:assertEquals(nil, dcanvas:getDepthSampleMode(), 'check depth sample mode nil by def')\n  dcanvas:setDepthSampleMode('equal')\n  test:assertEquals('equal', dcanvas:getDepthSampleMode(), 'check depth sample mode set')\n\n  -- check compute writeable (wont work on opengl mac)\n  if love.graphics.getSupported().glsl4 then\n    local ccanvas = love.graphics.newCanvas(100, 100, {\n      type = '2d',\n      format = 'rgba8',\n      computewrite = true\n    })\n    test:assertTrue(ccanvas:isComputeWritable())\n  end\n\nend\n\n\n-- Font (love.graphics.newFont)\nlove.test.graphics.Font = function(test)\n\n  -- create obj\n  local font = love.graphics.newFont('resources/font.ttf', 8)\n  test:assertObject(font)\n\n  -- check ascent/descent\n  test:assertEquals(6, font:getAscent(), 'check ascent')\n  test:assertEquals(-2, font:getDescent(), 'check descent')\n\n  -- check baseline\n  test:assertEquals(6, font:getBaseline(), 'check baseline')\n\n  -- check dpi \n  test:assertEquals(1, font:getDPIScale(), 'check dpi')\n\n  -- check filter\n  test:assertEquals('nearest', font:getFilter(), 'check filter def')\n  font:setFilter('linear', 'linear')\n  test:assertEquals('linear', font:getFilter(), 'check filter change')\n  font:setFilter('nearest', 'nearest')\n\n  -- check height + lineheight\n  test:assertEquals(8, font:getHeight(), 'check height')\n  test:assertEquals(1, font:getLineHeight(), 'check line height')\n  font:setLineHeight(2)\n  test:assertEquals(2, font:getLineHeight(), 'check changed line height')\n  font:setLineHeight(1) -- reset for drawing + wrap later\n\n  -- check width + kerning\n  test:assertEquals(0, font:getKerning('a', 'b'), 'check kerning')\n  test:assertEquals(24, font:getWidth('test'), 'check data size')\n\n  -- check specific glyphs\n  test:assertTrue(font:hasGlyphs('test'), 'check data size')\n\n  -- check font wrapping\n  local width, wrappedtext = font:getWrap('LÖVE is an *awesome* framework you can use to make 2D games in Lua.', 50)\n  test:assertEquals(48, width, 'check actual wrap width')\n  test:assertEquals(8, #wrappedtext, 'check wrapped lines')\n  test:assertEquals('LÖVE is an ', wrappedtext[1], 'check wrapped line')\n\n  -- check drawing font \n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setCanvas(canvas)\n    love.graphics.setFont(font)\n    love.graphics.print('Aa', 0, 5)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\n\n  -- check font substitution\n  local fontab = love.graphics.newImageFont('resources/font-letters-ab.png', 'AB')\n  local fontcd = love.graphics.newImageFont('resources/font-letters-cd.png', 'CD')\n  fontab:setFallbacks(fontcd)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 0)\n    love.graphics.setFont(fontab)\n    love.graphics.print('AB', 0, 0) -- should come from fontab\n    love.graphics.print('CD', 0, 9) -- should come from fontcd\n  love.graphics.setCanvas()\n  local imgdata2 = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata2)\n\nend\n\n\n-- Image (love.graphics.newImage)\nlove.test.graphics.Image = function(test)\n\n  -- create object\n  local image = love.graphics.newImage('resources/love.png', {\n    dpiscale = 1,\n    mipmaps = true\n  })\n  test:assertObject(image)\n  test:assertFalse(image:isCanvas(), 'check not canvas')\n  test:assertFalse(image:isComputeWritable(), 'check not compute writable')\n\n  -- check dpi\n  test:assertEquals(love.graphics.getDPIScale(), image:getDPIScale(), 'check dpi scale')\n\n  -- check depth\n  test:assertEquals(1, image:getDepth(), 'check depth is 2d')\n  test:assertEquals(nil, image:getDepthSampleMode(), 'check depth sample nil')\n\n  local maxanisotropy = love.graphics.getSystemLimits().anisotropy\n\n  -- check filter\n  local min1, mag1, ani1 = image:getFilter()\n  test:assertEquals('nearest', min1, 'check filter def min')\n  test:assertEquals('nearest', mag1, 'check filter def mag')\n  test:assertEquals(1, ani1, 'check filter def ani')\n  image:setFilter('linear', 'linear', 2)\n  local min2, mag2, ani2 = image:getFilter()\n  test:assertEquals('linear', min2, 'check filter changed min')\n  test:assertEquals('linear', mag2, 'check filter changed mag')\n  test:assertEquals(math.min(maxanisotropy, 2), ani2, 'check filter changed ani')\n  image:setFilter('nearest', 'nearest', 1)\n\n  -- check layers\n  test:assertEquals(1, image:getLayerCount(), 'check 1 layer for 2d')\n\n  -- check texture type\n  test:assertEquals('2d', image:getTextureType(), 'check 2d')\n\n  -- check texture wrapping\n  local horiz1, vert1 = image:getWrap()\n  test:assertEquals('clamp', horiz1, 'check def wrap h')\n  test:assertEquals('clamp', vert1, 'check def wrap v')\n  image:setWrap('repeat', 'repeat')\n  local horiz2, vert2 = image:getWrap()\n  test:assertEquals('repeat', horiz2, 'check changed wrap h')\n  test:assertEquals('repeat', vert2, 'check changed wrap v')\n\n    -- check readable\n  test:assertTrue(image:isReadable(), 'check canvas readable')\n\n  -- check msaa\n  test:assertEquals(1, image:getMSAA(), 'check samples match')\n\n  -- check dimensions\n  local cw, ch = image:getDimensions()\n  test:assertEquals(64, cw, 'check canvas dim w')\n  test:assertEquals(64, ch, 'check canvas dim h')\n  test:assertEquals(cw, image:getWidth(), 'check canvas w matches dim')\n  test:assertEquals(ch, image:getHeight(), 'check canvas h matches dim')\n  local pw, ph = image:getPixelDimensions()\n  test:assertEquals(64*love.graphics.getDPIScale(), pw, 'check pixel dim w')\n  test:assertEquals(64*love.graphics.getDPIScale(), ph, 'check pixel dim h')\n  test:assertEquals(pw, image:getPixelWidth(), 'check pixel w matches dim')\n  test:assertEquals(ph, image:getPixelHeight(), 'check pixel h matches dim')\n\n  -- check mipmaps\n  local mode, sharpness = image:getMipmapFilter()\n  test:assertEquals('linear', mode, 'check def minmap filter  mode')\n  test:assertEquals(0, sharpness, 'check def minmap filter sharpness')\n  local name, version, vendor, device = love.graphics.getRendererInfo()\n  -- @note mipmap sharpness wont work on opengl/metal\n  image:setMipmapFilter('nearest', 1)\n  mode, sharpness = image:getMipmapFilter()\n  test:assertEquals('nearest', mode, 'check changed minmap filter  mode')\n  if string.match(name, 'OpenGL ES') == nil and string.match(name, 'Metal') == nil then\n    test:assertEquals(1, sharpness, 'check changed minmap filter sharpness')\n  end\n  test:assertGreaterEqual(2, image:getMipmapCount()) -- docs say no mipmaps should return 1?\n\n  -- check image properties\n  test:assertFalse(image:isCompressed(), 'check not compressed')\n  test:assertFalse(image:isFormatLinear(), 'check not linear')\n  local cimage = love.graphics.newImage('resources/love.dxt1')\n  test:assertObject(cimage)\n  test:assertTrue(cimage:isCompressed(), 'check is compressed')\n\n  -- check pixel replacement\n  local rimage = love.image.newImageData('resources/loveinv.png')\n  image:replacePixels(rimage)\n  local canvas = love.graphics.newCanvas(64, 64)\n  love.graphics.setCanvas(canvas)\n    love.graphics.draw(image, 0, 0)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  local r1, g1, b1 = imgdata:getPixel(25, 25)\n  test:assertEquals(3, r1+g1+b1, 'check back to white')\n  test:compareImg(imgdata)\n\nend\n\n\n-- Mesh (love.graphics.newMesh)\nlove.test.graphics.Mesh = function(test)\n\n  -- create 2d mesh with pretty colors\n  local image = love.graphics.newImage('resources/love.png')\n  local vertices = {\n\t\t{ 0, 0, 0, 0, 1, 0, 0 },\n\t\t{ image:getWidth(), 0, 1, 0, 0, 1, 0 },\n\t\t{ image:getWidth(), image:getHeight(), 1, 1, 0, 0, 1 },\n\t\t{ 0, image:getHeight(), 0, 1, 1, 1, 0 },\n  }\n  local mesh1 = love.graphics.newMesh(vertices, 'fan')\n  test:assertObject(mesh1)\n\n  -- check draw mode\n  test:assertEquals('fan', mesh1:getDrawMode(), 'check draw mode')\n  mesh1:setDrawMode('triangles')\n  test:assertEquals('triangles', mesh1:getDrawMode(), 'check draw mode set')\n\n  -- check draw range\n  local min1, max1 = mesh1:getDrawRange()\n  test:assertEquals(nil, min1, 'check draw range not set')\n  mesh1:setDrawRange(1, 10)\n  local min2, max2 = mesh1:getDrawRange()\n  test:assertEquals(1, min2, 'check draw range set min')\n  test:assertEquals(10, max2, 'check draw range set max')\n\n  -- check texture pointer\n  test:assertEquals(nil, mesh1:getTexture(), 'check no texture')\n  mesh1:setTexture(image)\n  test:assertEquals(image:getHeight(), mesh1:getTexture():getHeight(), 'check texture match w')\n  test:assertEquals(image:getWidth(), mesh1:getTexture():getWidth(), 'check texture match h')\n\n  -- check vertext count\n  test:assertEquals(4, mesh1:getVertexCount(), 'check vertex count')\n\n  -- check def vertex format\n  local format = mesh1:getVertexFormat()\n  test:assertEquals('floatvec2', format[2].format, 'check def vertex format 2')\n  test:assertEquals('VertexColor', format[3].name, 'check def vertex format 3')\n\n  -- check vertext attributes\n  test:assertTrue(mesh1:isAttributeEnabled('VertexPosition'), 'check def attribute VertexPosition')\n  test:assertTrue(mesh1:isAttributeEnabled('VertexTexCoord'), 'check def attribute VertexTexCoord')\n  test:assertTrue(mesh1:isAttributeEnabled('VertexColor'), 'check def attribute VertexColor')\n  mesh1:setAttributeEnabled('VertexPosition', false)\n  mesh1:setAttributeEnabled('VertexTexCoord', false)\n  mesh1:setAttributeEnabled('VertexColor', false)\n  test:assertFalse(mesh1:isAttributeEnabled('VertexPosition'), 'check disable attribute VertexPosition')\n  test:assertFalse(mesh1:isAttributeEnabled('VertexTexCoord'), 'check disable attribute VertexTexCoord')\n  test:assertFalse(mesh1:isAttributeEnabled('VertexColor'), 'check disable attribute VertexColor')\n\n  -- check vertex itself\n  local x1, y1, u1, v1, r1, g1, b1, a1 = mesh1:getVertex(1)\n  test:assertEquals(0, x1, 'check vertex props x')\n  test:assertEquals(0, y1, 'check vertex props y')\n  test:assertEquals(0, u1, 'check vertex props u')\n  test:assertEquals(0, v1, 'check vertex props v')\n  test:assertEquals(1, r1, 'check vertex props r')\n  test:assertEquals(0, g1, 'check vertex props g')\n  test:assertEquals(0, b1, 'check vertex props b')\n  test:assertEquals(1, a1, 'check vertex props a')\n\n  -- check setting a specific vertex\n  mesh1:setVertex(2, image:getWidth(), 0, 1, 0, 0, 1, 1, 1)\n  local x2, y2, u2, v2, r2, g2, b2, a2 = mesh1:getVertex(2)\n  test:assertEquals(image:getWidth(), x2, 'check changed vertex props x')\n  test:assertEquals(0, y2, 'check changed vertex props y')\n  test:assertEquals(1, u2, 'check changed vertex props u')\n  test:assertEquals(0, v2, 'check changed vertex props v')\n  test:assertEquals(0, r2, 'check changed vertex props r')\n  test:assertEquals(1, g2, 'check changed vertex props g')\n  test:assertEquals(1, b2, 'check changed vertex props b')\n  test:assertEquals(1, a2, 'check changed vertex props a')\n\n  -- check setting a specific vertex attribute \n  local r3, g3, b3, a3  = mesh1:getVertexAttribute(3, 3)\n  test:assertEquals(1, b3, 'check specific vertex color')\n  mesh1:setVertexAttribute(4, 3, 1, 0, 1)\n  local r4, g4, b4, a4  = mesh1:getVertexAttribute(4, 3)\n  test:assertEquals(0, g4, 'check changed vertex color')\n\n  -- check setting a vertice\n  mesh1:setVertices(vertices)\n  local r5, g5, b5, a5  = mesh1:getVertexAttribute(4, 3)\n  local x6, y6, u6, v6, r6, g6, b6, a6 = mesh1:getVertex(2)\n  test:assertEquals(1, g5, 'check reset vertex color 1')\n  test:assertEquals(0, b5, 'check reset vertex color 2')\n\n  -- check setting the vertex map \n  local vmap1 = mesh1:getVertexMap()\n  test:assertEquals(nil, vmap1, 'check no map by def')\n  mesh1:setVertexMap({4, 1, 2, 3})\n  local vmap2 = mesh1:getVertexMap()\n  test:assertEquals(4, #vmap2, 'check set map len')\n  test:assertEquals(2, vmap2[3], 'check set map val')\n\n  -- check using custom attributes\n  local mesh2 = love.graphics.newMesh({\n    { name = 'VertexPosition', format = 'floatvec2', location = 0},\n    { name = 'VertexTexCoord', format = 'floatvec2', location = 1},\n    { name = 'VertexColor', format = 'floatvec4', location = 2},\n    { name = 'CustomValue1', format = 'floatvec2', location = 3},\n    { name = 'CustomValue2', format = 'uint16', location = 4}\n  }, {\n\t\t{ 0, 0, 0, 0, 1, 0, 0, 1, 2, 1, 1005 },\n\t\t{ image:getWidth(), 0, 1, 0, 0, 1, 0, 0, 2, 2, 2005 },\n\t\t{ image:getWidth(), image:getHeight(), 1, 1, 0, 0, 1, 0, 2, 3, 3005 },\n\t\t{ 0, image:getHeight(), 0, 1, 1, 1, 0, 0, 2, 4, 4005 },\n  }, 'fan')\n  local c1, c2 = mesh2:getVertexAttribute(1, 4)\n  local c3 = mesh2:getVertexAttribute(1, 5)\n  test:assertEquals(2, c1, 'check custom attribute val 1')\n  test:assertEquals(1, c2, 'check custom attribute val 2')\n  test:assertEquals(1005, c3, 'check custom attribute val 3')\n\n  -- check attaching custom attribute + detaching\n  mesh1:attachAttribute('CustomValue1', mesh2)\n  test:assertTrue(mesh1:isAttributeEnabled('CustomValue1'), 'check custom attribute attached')\n  mesh1:detachAttribute('CustomValue1')\n  local obj, err = pcall(mesh1.isAttributeEnabled, mesh1, 'CustomValue1')\n  test:assertNotEquals(nil, err, 'check attribute detached')\n  mesh1:detachAttribute('VertexPosition')\n  test:assertTrue(mesh1:isAttributeEnabled('VertexPosition'), 'check cant detach def attribute')\n\nend\n\n\n-- ParticleSystem (love.graphics.newParticleSystem)\nlove.test.graphics.ParticleSystem = function(test)\n\n  -- create new system \n  local image = love.graphics.newImage('resources/pixel.png')\n  local quad1 = love.graphics.newQuad(0, 0, 1, 1, image)\n  local quad2 = love.graphics.newQuad(0, 0, 1, 1, image)\n  local psystem = love.graphics.newParticleSystem(image, 1000)\n  test:assertObject(psystem)\n\n  -- check psystem state properties \n  psystem:start()\n  psystem:update(1)\n  test:assertTrue(psystem:isActive(), 'check active')\n  test:assertFalse(psystem:isPaused(), 'checked not paused by def')\n  test:assertFalse(psystem:hasRelativeRotation(), 'check rel rot def')\n  psystem:pause()\n  test:assertTrue(psystem:isPaused(), 'check now paused')\n  test:assertFalse(psystem:isStopped(), 'check not stopped by def')\n  psystem:stop()\n  test:assertTrue(psystem:isStopped(), 'check now stopped')\n  psystem:start()\n  psystem:reset()\n  \n  -- check emitting some particles\n  -- need to set a lifespan at minimum or none will be counted \n  local min, max = psystem:getParticleLifetime()\n  test:assertEquals(0, min, 'check def lifetime min')\n  test:assertEquals(0, max, 'check def lifetime max')\n  psystem:setParticleLifetime(1, 2)\n  psystem:emit(10)\n  psystem:update(1)\n  test:assertEquals(10, psystem:getCount(), 'check added particles')\n  psystem:reset()\n  test:assertEquals(0, psystem:getCount(), 'check reset')\n\n  -- check setting colors\n  local colors1 = {psystem:getColors()}\n  test:assertEquals(1, #colors1, 'check 1 color by def')\n  psystem:setColors(1, 1, 1, 1, 1, 0, 0, 1)\n  local colors2 = {psystem:getColors()}\n  test:assertEquals(2, #colors2, 'check set colors')\n  test:assertEquals(1, colors2[2][1], 'check set color')\n\n  -- check setting direction\n  test:assertEquals(0, psystem:getDirection(), 'check def direction')\n  psystem:setDirection(90 * (math.pi/180))\n  test:assertEquals(math.floor(math.pi/2*100), math.floor(psystem:getDirection()*100), 'check set direction')\n\n  -- check emission area options\n  psystem:setEmissionArea('normal', 100, 50)\n  psystem:setEmissionArea('ellipse', 100, 50)\n  psystem:setEmissionArea('borderellipse', 100, 50)\n  psystem:setEmissionArea('borderrectangle', 100, 50)\n  psystem:setEmissionArea('none', 100, 50)\n  psystem:setEmissionArea('uniform', 100, 50)\n  local dist, dx, dy, angle, rel = psystem:getEmissionArea()\n  test:assertEquals('uniform', dist, 'check emission area dist')\n  test:assertEquals(100, dx, 'check emission area dx')\n  test:assertEquals(50, dy, 'check emission area dy')\n  test:assertEquals(0, angle, 'check emission area angle')\n  test:assertFalse(rel, 'check emission area rel')\n\n  -- check emission rate\n  test:assertEquals(0, psystem:getEmissionRate(), 'check def emission rate')\n  psystem:setEmissionRate(1)\n  test:assertEquals(1, psystem:getEmissionRate(), 'check changed emission rate')\n\n  -- check emission lifetime\n  test:assertEquals(-1, psystem:getEmitterLifetime(), 'check def emitter life')\n  psystem:setEmitterLifetime(10)\n  test:assertEquals(10, psystem:getEmitterLifetime(), 'check changed emitter life')\n\n  -- check insert mode\n  test:assertEquals('top', psystem:getInsertMode(), 'check def insert mode')\n  psystem:setInsertMode('bottom')\n  psystem:setInsertMode('random')\n  test:assertEquals('random', psystem:getInsertMode(), 'check change insert mode')\n\n  -- check linear acceleration\n  local xmin1, ymin1, xmax1, ymax1 = psystem:getLinearAcceleration()\n  test:assertEquals(0, xmin1, 'check def lin acceleration xmin')\n  test:assertEquals(0, ymin1, 'check def lin acceleration ymin')\n  test:assertEquals(0, xmax1, 'check def lin acceleration xmax')\n  test:assertEquals(0, ymax1, 'check def lin acceleration ymax')\n  psystem:setLinearAcceleration(1, 2, 3, 4)\n  local xmin2, ymin2, xmax2, ymax2 = psystem:getLinearAcceleration()\n  test:assertEquals(1, xmin2, 'check change lin acceleration xmin')\n  test:assertEquals(2, ymin2, 'check change lin acceleration ymin')\n  test:assertEquals(3, xmax2, 'check change lin acceleration xmax')\n  test:assertEquals(4, ymax2, 'check change lin acceleration ymax')\n\n  -- check linear damping\n  local min3, max3 = psystem:getLinearDamping()\n  test:assertEquals(0, min3, 'check def lin damping min')\n  test:assertEquals(0, max3, 'check def lin damping max')\n  psystem:setLinearDamping(1, 2)\n  local min4, max4 = psystem:getLinearDamping()\n  test:assertEquals(1, min4, 'check change lin damping min')\n  test:assertEquals(2, max4, 'check change lin damping max')\n\n  -- check offset\n  local ox1, oy1 = psystem:getOffset()\n  test:assertEquals(0.5, ox1, 'check def offset x') -- 0.5 cos middle of pixel image which is 1x1\n  test:assertEquals(0.5, oy1, 'check def offset y')\n  psystem:setOffset(0, 10)\n  local ox2, oy2 = psystem:getOffset()\n  test:assertEquals(0, ox2, 'check change offset x')\n  test:assertEquals(10, oy2, 'check change offset y')\n\n  -- check lifetime (we set it earlier)\n  local min5, max5 = psystem:getParticleLifetime()\n  test:assertEquals(1, min5, 'check p lifetime min')\n  test:assertEquals(2, max5, 'check p lifetime max')\n\n  -- check position\n  local x1, y1 = psystem:getPosition()\n  test:assertEquals(0, x1, 'check emitter x')\n  test:assertEquals(0, y1, 'check emitter y')\n  psystem:setPosition(10, 12)\n  local x2, y2 = psystem:getPosition()\n  test:assertEquals(10, x2, 'check set emitter x')\n  test:assertEquals(12, y2, 'check set emitter y')\n\n  -- check quads\n  test:assertEquals(0, #psystem:getQuads(), 'check def quads')\n  psystem:setQuads({quad1})\n  psystem:setQuads(quad1, quad2)\n  test:assertEquals(2, #psystem:getQuads(), 'check set quads')\n\n  -- check radial acceleration\n  local min6, max6 = psystem:getRadialAcceleration()\n  test:assertEquals(0, min6, 'check def rad accel min')\n  test:assertEquals(0, max6, 'check def rad accel max')\n  psystem:setRadialAcceleration(1, 2)\n  local min7, max7 = psystem:getRadialAcceleration()\n  test:assertEquals(1, min7, 'check change rad accel min')\n  test:assertEquals(2, max7, 'check change rad accel max')\n\n  -- check rotation\n  local min8, max8 = psystem:getRotation()\n  test:assertEquals(0, min8, 'check def rot min')\n  test:assertEquals(0, max8, 'check def rot max')\n  psystem:setRotation(90 * (math.pi/180), 180 * (math.pi/180))\n  local min8, max8 = psystem:getRotation()\n  test:assertEquals(math.floor(math.pi/2*100), math.floor(min8*100), 'check set rot min')\n  test:assertEquals(math.floor(math.pi*100), math.floor(max8*100), 'check set rot max')\n\n  -- check variation\n  test:assertEquals(0, psystem:getSizeVariation(), 'check def variation')\n  psystem:setSizeVariation(1)\n  test:assertEquals(1, psystem:getSizeVariation(), 'check change variation')\n\n  -- check sizes\n  test:assertEquals(1, #{psystem:getSizes()}, 'check def size')\n  psystem:setSizes(1, 2, 4, 1, 3, 2)\n  local sizes = {psystem:getSizes()}\n  test:assertEquals(6, #sizes, 'check set sizes')\n  test:assertEquals(3, sizes[5], 'check set size')\n\n  -- check speed\n  local min9, max9 = psystem:getSpeed()\n  test:assertEquals(0, min9, 'check def speed min')\n  test:assertEquals(0, max9, 'check def speed max')\n  psystem:setSpeed(1, 10)\n  local min10, max10 = psystem:getSpeed()\n  test:assertEquals(1, min10, 'check change speed min')\n  test:assertEquals(10, max10, 'check change speed max')\n\n  -- check variation + spin\n  local variation = psystem:getSpinVariation()\n  test:assertEquals(0, variation, 'check def spin variation')\n  psystem:setSpinVariation(1)\n  test:assertEquals(1, psystem:getSpinVariation(), 'check change spin variation')\n  psystem:setSpin(1, 2)\n  local min11, max11 = psystem:getSpin()\n  test:assertEquals(1, min11, 'check change spin min')\n  test:assertEquals(2, max11, 'check change spin max')\n\n  -- check spread\n  test:assertEquals(0, psystem:getSpread(), 'check def spread')\n  psystem:setSpread(90 * (math.pi/180))\n  test:assertEquals(math.floor(math.pi/2*100), math.floor(psystem:getSpread()*100), 'check change spread')\n\n  -- tangential acceleration\n  local min12, max12 = psystem:getTangentialAcceleration()\n  test:assertEquals(0, min12, 'check def tan accel min')\n  test:assertEquals(0, max12, 'check def tan accel max')\n  psystem:setTangentialAcceleration(1, 2)\n  local min13, max13 = psystem:getTangentialAcceleration()\n  test:assertEquals(1, min13, 'check change tan accel min')\n  test:assertEquals(2, max13, 'check change tan accel max')\n\n  -- check texture\n  test:assertNotEquals(nil, psystem:getTexture(), 'check texture obj')\n  test:assertObject(psystem:getTexture())\n  psystem:setTexture(love.graphics.newImage('resources/love.png'))\n  test:assertObject(psystem:getTexture())\n\n  -- try a graphics test!\n  -- hard to get exactly because of the variation but we can use some pixel \n  -- tolerance and volume to try and cover the randomness\n  local psystem2 = love.graphics.newParticleSystem(image, 5000)\n  psystem2:setEmissionArea('uniform', 2, 64)\n  psystem2:setColors(1, 0, 0, 1)\n  psystem2:setDirection(0 * math.pi/180)\n  psystem2:setEmitterLifetime(100)\n  psystem2:setEmissionRate(5000)\n  local psystem3 = psystem2:clone()\n  psystem3:setPosition(64, 0)\n  psystem3:setColors(0, 1, 0, 1)\n  psystem3:setDirection(180 * (math.pi/180))\n  psystem2:start()\n  psystem3:start()\n  psystem2:update(1)\n  psystem3:update(1)\n  local canvas = love.graphics.newCanvas(64, 64)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.draw(psystem2, 0, 0)\n    love.graphics.draw(psystem3, 0, 0)\n  love.graphics.setCanvas()\n  -- this should result in a bunch of red pixels on the left 2px of the canvas\n  -- and a bunch of green pixels on the right 2px of the canvas\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test.pixel_tolerance = 1\n  test:compareImg(imgdata)\n  \nend\n\n\n-- Quad (love.graphics.newQuad)\nlove.test.graphics.Quad = function(test)\n\n  -- create quad obj\n  local texture = love.graphics.newImage('resources/love.png')\n  local quad = love.graphics.newQuad(0, 0, 32, 32, texture)\n  test:assertObject(quad)\n\n  -- check properties\n  test:assertEquals(1, quad:getLayer(), 'check default layer')\n  quad:setLayer(2)\n  test:assertEquals(2, quad:getLayer(), 'check changed layer')\n  local sw, sh = quad:getTextureDimensions()\n  test:assertEquals(64, sw, 'check texture w')\n  test:assertEquals(64, sh, 'check texture h')\n\n  -- check drawing and viewport changes\n  local canvas = love.graphics.newCanvas(64, 64)\n  love.graphics.setCanvas(canvas)\n    love.graphics.draw(texture, quad, 0, 0)\n    quad:setViewport(32, 32, 32, 32, 64, 64)\n    love.graphics.draw(texture, quad, 32, 32)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\n\nend\n\n\n-- Shader (love.graphics.newShader)\nlove.test.graphics.Shader = function(test)\n\n  -- check valid shader\n  local pixelcode1 = [[\n    uniform Image tex2;\n    vec4 effect(vec4 color, Image tex, vec2 texture_coords, vec2 screen_coords) { \n      vec4 texturecolor = Texel(tex2, texture_coords); \n      return texturecolor * color;\n    }\n  ]]\n  local vertexcode1 = [[\n    vec4 position(mat4 transform_projection, vec4 vertex_position) { \n      return transform_projection * vertex_position; \n    }\n  ]]\n  local shader1 = love.graphics.newShader(pixelcode1, vertexcode1, {debugname = 'testshader'})\n  test:assertObject(shader1)\n  test:assertEquals('', shader1:getWarnings(), 'check shader valid')\n  test:assertFalse(shader1:hasUniform('tex1'), 'check invalid uniform')\n  test:assertTrue(shader1:hasUniform('tex2'), 'check valid uniform')\n  test:assertEquals('testshader', shader1:getDebugName())\n\n  -- check invalid shader\n  local pixelcode2 = [[\n    uniform float ww;\n    vec4 effect(vec4 color, Image tex, vec2 texture_coords, vec2 screen_coords) { \n      vec4 texturecolor = Texel(tex, texture_coords);\n      float unused = ww * 3 * color;\n      return texturecolor * color;\n    }\n  ]]\n  local res, err = pcall(love.graphics.newShader, pixelcode2, vertexcode1)\n  test:assertNotEquals(nil, err, 'check shader compile fails')\n\n  -- check using a shader to draw + sending uniforms\n  -- shader will return a given color if overwrite set to 1, otherwise def. draw\n  local pixelcode3 = [[\n    uniform vec4 col;\n    uniform float overwrite;\n    vec4 effect(vec4 color, Image tex, vec2 texture_coords, vec2 screen_coords) { \n      vec4 texcol = Texel(tex, texture_coords); \n      if (overwrite == 1.0) {\n        return col;\n      } else {\n        return texcol * color;\n      }\n    }\n  ]]\n  local shader3 = love.graphics.newShader(pixelcode3, vertexcode1)\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.push(\"all\")\n    love.graphics.setCanvas(canvas)\n    -- set color to yellow\n    love.graphics.setColor(1, 1, 0, 1)\n    -- turn shader 'on' and use red to draw\n    shader3:send('overwrite', 1)\n    shader3:sendColor('col', {1, 0, 0, 1})\n    love.graphics.setShader(shader3)\n      love.graphics.rectangle('fill', 0, 0, 8, 8)\n    love.graphics.setShader()\n    -- turn shader 'off' and draw again\n    shader3:send('overwrite', 0)\n    love.graphics.setShader(shader3)\n      love.graphics.rectangle('fill', 8, 8, 8, 8)\n  love.graphics.pop()\n\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\n\n  -- test some uncommon paths for shader uniforms\n  local shader4 = love.graphics.newShader[[\n    uniform bool booleans[5];\n    vec4 effect(vec4 vcolor, Image tex, vec2 tc, vec2 pc) {\n      return booleans[3] ? vec4(0, 1, 0, 0) : vec4(1, 0, 0, 0);\n    }\n  ]]\n\n  shader4:send(\"booleans\", false, true, true)\n\n  local shader5 = love.graphics.newShader[[\n    uniform sampler2D textures[5];\n    vec4 effect(vec4 vcolor, Image tex, vec2 tc, vec2 pc) {\n      return Texel(textures[2], tc) + Texel(textures[3], tc);\n    }\n  ]]\n\n  local canvas2 = love.graphics.newCanvas(1, 1)\n  love.graphics.setCanvas(canvas2)\n  love.graphics.clear(0, 0.5, 0, 1)\n  love.graphics.setCanvas()\n\n  shader5:send(\"textures\", canvas2, canvas2, canvas2, canvas2, canvas2)\n\n  local shader6 = love.graphics.newShader[[\n    struct Data {\n      bool boolValue;\n      float floatValue;\n      sampler2D tex;\n    };\n\n    uniform Data data;\n    uniform Data dataArray[3];\n\n    vec4 effect(vec4 vcolor, Image tex, vec2 tc, vec2 pc) {\n      return (data.boolValue && dataArray[1].boolValue) ? Texel(dataArray[0].tex, tc) : vec4(0.0, 0.0, 0.0, 0.0);\n    }\n  ]]\n\n  shader6:send(\"data.boolValue\", true)\n  shader6:send(\"dataArray[1].boolValue\", true)\n  shader6:send(\"dataArray[0].tex\", canvas2)\n\n  local shader7 = love.graphics.newShader[[\n    uniform vec3 vec3s[3];\n\n    vec4 effect(vec4 vcolor, Image tex, vec2 tc, vec2 pc) {\n      return vec4(vec3s[1], 1.0);\n    }\n  ]]\n\n  shader7:send(\"vec3s\", {0, 0, 1}, {0, 1, 0}, {1, 0, 0})\n\n  local canvas3 = love.graphics.newCanvas(16, 16)\n  love.graphics.push(\"all\")\n    love.graphics.setCanvas(canvas3)\n    love.graphics.setShader(shader7)\n    love.graphics.rectangle(\"fill\", 0, 0, 16, 16)\n  love.graphics.pop()\n  local imgdata2 = love.graphics.readbackTexture(canvas3)\n  test:compareImg(imgdata2)\n\n  if love.graphics.getSupported().glsl3 then\n    local shader8 = love.graphics.newShader[[\n      #pragma language glsl3\n      #ifdef GL_ES\n        precision highp float;\n      #endif\n\n      varying vec4 VaryingUnused1;\n      varying mat3 VaryingMatrix;\n      flat varying ivec4 VaryingInt;\n\n      #ifdef VERTEX\n      layout(location = 0) in vec4 VertexPosition;\n      layout(location = 1) in ivec4 IntAttributeUnused;\n\n      void vertexmain()\n      {\n        VaryingMatrix = mat3(vec3(1, 0, 0), vec3(0, 1, 0), vec3(0, 0, 1));\n        VaryingInt = ivec4(1, 1, 1, 1);\n        love_Position = TransformProjectionMatrix * VertexPosition;\n      }\n      #endif\n\n      #ifdef PIXEL\n      out ivec4 outData;\n\n      void pixelmain()\n      {\n        outData = ivec4(VaryingMatrix[1][1] > 0.0 ? 1 : 0, 1, VaryingInt.x, 1);\n      }\n      #endif\n    ]]\n\n    local canvas4 = love.graphics.newCanvas(16, 16, {format=\"rgba8i\"})\n      love.graphics.push(\"all\")\n      love.graphics.setBlendMode(\"none\")\n      love.graphics.setCanvas(canvas4)\n      love.graphics.setShader(shader8)\n      love.graphics.rectangle(\"fill\", 0, 0, 16, 16)\n    love.graphics.pop()\n\n    local intimagedata = love.graphics.readbackTexture(canvas4)\n    local imgdata3 = love.image.newImageData(16, 16, \"rgba8\")\n    for y=0, 15 do\n      for x=0, 15 do\n        local ir, ig, ib, ia = intimagedata:getInt8(4 * (y * 16 + x), 4)\n        imgdata3:setPixel(x, y, ir, ig, ib, ia)\n      end\n    end\n    test:compareImg(imgdata3)\n  else\n    test:assertTrue(true, \"skip shader IO test\")\n  end\nend\n\n\n-- SpriteBatch (love.graphics.newSpriteBatch)\nlove.test.graphics.SpriteBatch = function(test)\n\n  -- create batch\n  local texture1 = love.graphics.newImage('resources/cubemap.png')\n  local texture2 = love.graphics.newImage('resources/love.png')\n  local quad1 = love.graphics.newQuad(32, 12, 1, 1, texture2) -- lovepink\n  local quad2 = love.graphics.newQuad(32, 32, 1, 1, texture2) -- white\n  local sbatch = love.graphics.newSpriteBatch(texture1, 5000)\n  test:assertObject(sbatch)\n\n  -- check initial count\n  test:assertEquals(0, sbatch:getCount(), 'check batch size')\n\n  -- check buffer size\n  test:assertEquals(5000, sbatch:getBufferSize(), 'check batch size')\n\n  -- check height/width/texture\n  test:assertEquals(texture1:getWidth(), sbatch:getTexture():getWidth(), 'check texture match w')\n  test:assertEquals(texture1:getHeight(), sbatch:getTexture():getHeight(), 'check texture match h')\n  sbatch:setTexture(texture2)\n  test:assertEquals(texture2:getWidth(), sbatch:getTexture():getWidth(), 'check texture change w')\n  test:assertEquals(texture2:getHeight(), sbatch:getTexture():getHeight(), 'check texture change h')\n\n  -- check colors\n  local r1, g1, b1, a1 = sbatch:getColor()\n  test:assertEquals(1, r1, 'check initial color r')\n  test:assertEquals(1, g1, 'check initial color g')\n  test:assertEquals(1, b1, 'check initial color b')\n  test:assertEquals(1, a1, 'check initial color a')\n  sbatch:setColor(1, 0, 0, 1)\n  local r2, g2, b2, a2 = sbatch:getColor()\n  test:assertEquals(1, r2, 'check set color r')\n  test:assertEquals(0, g2, 'check set color g')\n  test:assertEquals(0, b2, 'check set color b')\n  test:assertEquals(1, a2, 'check set color a')\n\n  -- check adding sprites\n  local offset_x = 0\n  local offset_y = 0\n  local color = 'white'\n  sbatch:setColor(1, 1, 1, 1)\n  local sprites = {}\n  for s=1,4096 do\n    local spr = sbatch:add(quad1, offset_x, offset_y, 0, 1, 1)\n    table.insert(sprites, {spr, offset_x, offset_y})\n    offset_x = offset_x + 1\n    if s % 64 == 0 then\n      -- alternate row colors\n      if color == 'white' then\n        color = 'red'\n        sbatch:setColor(1, 0, 0, 1)\n      else\n        color = 'white'\n        sbatch:setColor(1, 1, 1, 1)\n      end\n      offset_y = offset_y + 1\n      offset_x = 0\n    end\n  end\n  test:assertEquals(4096, sbatch:getCount())\n\n  -- test drawing and setting\n  local canvas = love.graphics.newCanvas(64, 64)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.draw(sbatch, 0, 0)\n  love.graphics.setCanvas()\n  local imgdata1 = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata1)\n\n  -- use set to change some sprites\n  for s=1,2048 do\n    sbatch:set(sprites[s][1], quad2, sprites[s][2], sprites[s][3]+1, 0, 1, 1)\n  end\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.draw(sbatch, 0, 0)\n  love.graphics.setCanvas()\n  local imgdata2 = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata2)\n\n  -- set drawRange and redraw\n  sbatch:setDrawRange(1025, 2048)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.draw(sbatch, 0, 0)\n  love.graphics.setCanvas()\n  local imgdata3 = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata3)\n\n  -- clear and redraw\n  sbatch:clear()\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.draw(sbatch, 0, 0)\n  love.graphics.setCanvas()\n  local imgdata4 = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata4)\n\n  -- array texture sbatch\n  local texture3 = love.graphics.newArrayImage({\n    'resources/love.png',\n    'resources/loveinv.png'\n  })\n  local asbatch = love.graphics.newSpriteBatch(texture3, 4096)\n  local quad3 = love.graphics.newQuad(32, 52, 1, 1, texture3) -- loveblue\n  sprites = {}\n  for s=1,4096 do\n    local spr = asbatch:addLayer(1, quad3, 0, s, math.floor(s/64), 1, 1)\n    table.insert(sprites, {spr, s, math.floor(s/64)})\n  end\n  test:assertEquals(4096, asbatch:getCount(), 'check max batch size applies')\n  for s=1,2048 do\n    asbatch:setLayer(sprites[s][1], 2, sprites[s][2], sprites[s][3], 0, 1, 1)\n  end\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.draw(asbatch, 0, 0)\n  love.graphics.setCanvas()\n  local imgdata5 = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata5)\n\nend\n\n\n-- Text (love.graphics.newTextBatch)\nlove.test.graphics.Text = function(test)\n\n  -- setup text object\n  local font = love.graphics.newFont('resources/font.ttf', 8)\n  local plaintext = love.graphics.newTextBatch(font, 'test')\n  test:assertObject(plaintext)\n\n  -- check height/width/dimensions\n  test:assertEquals(font:getHeight(), plaintext:getFont():getHeight(), 'check font matches')\n  local tw, th = plaintext:getDimensions()\n  test:assertEquals(24, tw, 'check initial dim w')\n  test:assertEquals(8, th, 'check initial dim h')\n  test:assertEquals(tw, plaintext:getWidth(), 'check initial dim w')\n  test:assertEquals(th, plaintext:getHeight(), 'check initial dim h')\n\n  -- check changing text effects dimensions\n  plaintext:add('more text', 100, 0, 0)\n  test:assertEquals(49, plaintext:getDimensions(), 'check adding text')\n  plaintext:set('test')\n  test:assertEquals(24, plaintext:getDimensions(), 'check resetting text')\n  plaintext:clear()\n  test:assertEquals(0, plaintext:getDimensions(), 'check clearing text')\n\n  -- check drawing + setting more complex text\n  local colortext = love.graphics.newTextBatch(font, {{1, 0, 0, 1}, 'test'})\n  test:assertObject(colortext)\n  colortext:setf('LÖVE is an *awesome* framework you can use to make 2D games in Lua', 60, 'right')\n  colortext:addf({{1, 1, 0}, 'overlap'}, 1000, 'left')\n  local font2 = love.graphics.newFont('resources/font.ttf', 8)\n  colortext:setFont(font2)\n  local canvas = love.graphics.newCanvas(64, 64)\n  love.graphics.setCanvas(canvas)\n    love.graphics.draw(colortext, 0, 10)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\n\nend\n\n\n-- Video (love.graphics.newVideo)\nlove.test.graphics.Video = function(test)\n\n  -- create video obj\n  local video = love.graphics.newVideo('resources/sample.ogv')\n  test:assertObject(video)\n\n  -- check dimensions\n  local w, h = video:getDimensions()\n  test:assertEquals(496, w, 'check vid dim w')\n  test:assertEquals(502, h, 'check vid dim h')\n  test:assertEquals(w, video:getWidth(), 'check vid width match')\n  test:assertEquals(h, video:getHeight(), 'check vid height match')\n\n  -- check filters\n  local min1, mag1, ani1 = video:getFilter()\n  test:assertEquals('nearest', min1, 'check def filter min')\n  test:assertEquals('nearest', mag1, 'check def filter mag')\n  test:assertEquals(1, ani1, 'check def filter ani')\n  video:setFilter('linear', 'linear', 2)\n  local min2, mag2, ani2 = video:getFilter()\n  test:assertEquals('linear', min2, 'check changed filter min')\n  test:assertEquals('linear', mag2, 'check changed filter mag')\n  test:assertEquals(2, ani2, 'check changed filter ani')\n\n  -- check video playing\n  test:assertFalse(video:isPlaying(), 'check paused by default')\n  test:assertEquals(0, video:tell(), 'check 0:00 by default')\n\n  -- covered by their own obj tests in video but check returns obj\n  local source = video:getSource()\n  test:assertObject(source)\n  local stream = video:getStream()\n  test:assertObject(stream)\n\n  -- check playing / pausing / seeking states\n  video:play()\n  test:waitSeconds(0.25)\n  video:pause()\n  -- runners can be a bit funny and just not play anything sometimes\n  if not GITHUB_RUNNER then\n    test:assertRange(video:tell(), 0.2, 0.35, 'check video playing for 0.25s')\n  end\n  video:seek(0.2)\n  test:assertEquals(0.2, video:tell(), 'check video seeking')\n  video:rewind()\n  test:assertEquals(0, video:tell(), 'check video rewind')\n  video:setFilter('nearest', 'nearest', 1)\n\n  -- check actuall drawing with the vid \n  local canvas = love.graphics.newCanvas(500, 500)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(1, 0, 0, 1)\n    love.graphics.draw(video, 0, 0)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\n\nend\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n------------------------------------DRAWING-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.graphics.arc\nlove.test.graphics.arc = function(test)\n  -- draw some arcs using pi format\n  local canvas = love.graphics.newCanvas(32, 32)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.setColor(1, 1, 1, 1)\n    love.graphics.arc('line', \"pie\", 16, 16, 16, 0 * (math.pi/180), 360 * (math.pi/180), 10)\n    love.graphics.arc('fill', \"pie\", 16, 16, 16, 270 * (math.pi/180), 45 * (math.pi/180), 10)\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.arc('line', \"pie\", 16, 16, 16, 0 * (math.pi/180), 90 * (math.pi/180), 10)\n    love.graphics.setColor(1, 1, 0, 1)\n    love.graphics.arc('line', \"pie\", 16, 16, 16, 180 * (math.pi/180), 135 * (math.pi/180), 10)\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata1 = love.graphics.readbackTexture(canvas)\n  -- draw some arcs with open format\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.setColor(1, 1, 1, 1)\n    love.graphics.arc('line', \"open\", 16, 16, 16, 0 * (math.pi/180), 315 * (math.pi/180), 10)\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.arc('fill', \"open\", 16, 16, 16, 0 * (math.pi/180), 180 * (math.pi/180), 10)\n    love.graphics.setColor(1, 1, 0, 1)\n    love.graphics.arc('fill', \"open\", 16, 16, 16, 180 * (math.pi/180), 270 * (math.pi/180), 10)\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata2 = love.graphics.readbackTexture(canvas)\n  -- draw some arcs with closed format\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.setColor(1, 1, 1, 1)\n    love.graphics.arc('line', \"closed\", 16, 16, 16, 0 * (math.pi/180), 315 * (math.pi/180), 10)\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.arc('fill', \"closed\", 16, 16, 16, 0 * (math.pi/180), 180 * (math.pi/180), 10)\n    love.graphics.setColor(1, 1, 0, 1)\n    love.graphics.arc('line', \"closed\", 16, 16, 16, 180 * (math.pi/180), 90 * (math.pi/180), 10)\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata3 = love.graphics.readbackTexture(canvas)\n  if GITHUB_RUNNER and test:isOS('OS X') then\n    -- on macosx runners, the arcs are not drawn as accurately at low res\n    -- there's a couple pixels different in the curve of the arc but as we\n    -- are at such a low resolution I think that can be expected\n    -- on real hardware the test passes fine though  \n    test:assertTrue(true, 'skip test')\n  else\n    test:compareImg(imgdata1)\n    test:compareImg(imgdata2)\n    test:compareImg(imgdata3)\n  end\nend\n\n\n-- love.graphics.circle\nlove.test.graphics.circle = function(test)\n  -- draw some circles\n  local canvas = love.graphics.newCanvas(32, 32)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.setColor(1, 1, 1, 1)\n    love.graphics.circle('fill', 16, 16, 16)\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.circle('line', 16, 16, 16)\n    love.graphics.setColor(1, 1, 0, 1)\n    love.graphics.circle('fill', 16, 16, 8)\n    love.graphics.setColor(0, 1, 0, 1)\n    love.graphics.circle('fill', 16, 16, 4)\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n\n-- love.graphics.clear\nlove.test.graphics.clear = function(test)\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.clear(1, 1, 0, 1)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.discard\nlove.test.graphics.discard = function(test)\n  -- from the docs: \"on some desktops this may do nothing\"\n  test:skipTest('cant test this worked')\nend\n\n\n-- love.graphics.draw\nlove.test.graphics.draw = function(test)\n  local canvas1 = love.graphics.newCanvas(32, 32)\n  local canvas2 = love.graphics.newCanvas(32, 32)\n  local transform = love.math.newTransform( )\n  transform:translate(16, 0)\n  transform:scale(0.5, 0.5)\n  love.graphics.setCanvas(canvas1)\n    love.graphics.clear(0, 0, 0, 1)\n    -- img, offset\n    love.graphics.draw(Logo.texture, Logo.img, 0, 0, 0, 1, 1, 16, 16)\n  love.graphics.setCanvas()\n  love.graphics.setCanvas(canvas2)\n    love.graphics.clear(1, 0, 0, 1)\n    -- canvas, scale, shear, transform obj\n    love.graphics.draw(canvas1, 0, 0, 0, 1, 1, 0, 0, 2, 2)\n    love.graphics.draw(canvas1, 0, 16, 0, 0.5, 0.5)\n    love.graphics.draw(canvas1, 16, 16, 0, 0.5, 0.5)\n    love.graphics.draw(canvas1, transform)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas2)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.drawInstanced\nlove.test.graphics.drawInstanced = function(test)\n  local image = love.graphics.newImage('resources/love.png')\n  local vertices = {\n\t\t{ 0, 0, 0, 0, 1, 0, 0 },\n\t\t{ image:getWidth(), 0, 1, 0, 0, 1, 0 },\n\t\t{ image:getWidth(), image:getHeight(), 1, 1, 0, 0, 1 },\n\t\t{ 0, image:getHeight(), 0, 1, 1, 1, 0 },\n  }\n  local mesh = love.graphics.newMesh(vertices, 'fan')\n  local canvas = love.graphics.newCanvas(64, 64)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.drawInstanced(mesh, 1000, 0, 0, 0, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  -- need 1 tolerance here just cos of the amount of colors\n  test.rgba_tolerance = 1\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.drawLayer\nlove.test.graphics.drawLayer = function(test)\n  local image = love.graphics.newArrayImage({\n    'resources/love.png', 'resources/loveinv.png',\n    'resources/love.png', 'resources/loveinv.png'\n  })\n  local canvas = love.graphics.newCanvas(64, 64)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.drawLayer(image, 1, 0, 0, 0, 1, 1)\n    love.graphics.drawLayer(image, 2, 32, 0, 0, 0.5, 0.5)\n    love.graphics.drawLayer(image, 4, 0, 32, 0, 0.5, 0.5)\n    love.graphics.drawLayer(image, 3, 32, 32, 0, 2, 2, 16, 16)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.ellipse\nlove.test.graphics.ellipse = function(test)\n  local canvas = love.graphics.newCanvas(32, 32)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.ellipse('fill', 16, 16, 16, 8)\n    love.graphics.setColor(1, 1, 0, 1)\n    love.graphics.ellipse('fill', 24, 24, 10, 24)\n    love.graphics.setColor(1, 0, 1, 1)\n    love.graphics.ellipse('fill', 16, 0, 8, 16)\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.flushBatch\nlove.test.graphics.flushBatch = function(test)\n  love.graphics.flushBatch()\n  local initial = love.graphics.getStats()['drawcalls']\n  local canvas = love.graphics.newCanvas(32, 32)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.rectangle('fill', 0, 0, 32, 32)\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  love.graphics.flushBatch()\n  local after = love.graphics.getStats()['drawcalls']\n  test:assertEquals(initial+1, after, 'check drawcalls increased')\nend\n\n\n-- love.graphics.line\nlove.test.graphics.line = function(test)\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.line(1,1,16,1,16,16,1,16,1,1)\n    love.graphics.setColor(1, 1, 0, 1)\n    love.graphics.line({0,0,8,8,16,0,8,8,16,16,8,8,0,16})\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.points\nlove.test.graphics.points = function(test)\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.push(\"all\")\n    love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.translate(0.5, 0.5) -- draw points at the center of pixels\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.points(0,0,15,0,15,15,0,15,0,0)\n    love.graphics.setColor(1, 1, 0, 1)\n    love.graphics.points({1,1,7,7,14,1,7,8,14,14,8,8,1,14,8,7})\n  love.graphics.pop()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.polygon\nlove.test.graphics.polygon = function(test)\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.polygon(\"fill\", 1, 1, 4, 5, 8, 10, 16, 2, 7, 3, 5, 16, 16, 16, 1, 8)\n    love.graphics.setColor(1, 1, 0, 1)\n    love.graphics.polygon(\"line\", {2, 2, 4, 5, 3, 7, 8, 15, 12, 4, 5, 10})\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.print\nlove.test.graphics.print = function(test)\n  love.graphics.setFont(Font)\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.print('love', 0, 3, 0, 1, 1, 0, 0)\n    love.graphics.setColor(0, 1, 0, 1)\n    love.graphics.print('ooo', 0, 3, 0, 2, 2, 0, 0)\n    love.graphics.setColor(0, 0, 1, 1)\n    love.graphics.print('hello', 0, 3, 90*(math.pi/180), 1, 1, 0, 8)\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.printf\nlove.test.graphics.printf = function(test)\n  love.graphics.setFont(Font)\n  local canvas = love.graphics.newCanvas(32, 32)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.printf('love', 0, 0, 8, \"left\")\n    love.graphics.setColor(0, 1, 0, 1)\n    love.graphics.printf('love', 0, 5, 16, \"right\")\n    love.graphics.setColor(0, 0, 1, 1)\n    love.graphics.printf('love', 0, 7, 32, \"center\")\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.rectangle\nlove.test.graphics.rectangle = function(test)\n  -- setup, draw a 16x16 red rectangle with a blue central square\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.rectangle('fill', 0, 0, 16, 16)\n    love.graphics.setColor(0, 0, 1, 1)\n    love.graphics.rectangle('fill', 6, 6, 4, 4)\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata1 = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata1)\n  -- clear canvas to do some line testing\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.rectangle('line', 1, 1, 15, 15) -- red border\n    love.graphics.setColor(0, 0, 1, 1)\n    love.graphics.rectangle('line', 1, 1, 2, 15) -- 3x16 left aligned blue outline\n    love.graphics.setColor(0, 1, 0, 1)\n    love.graphics.rectangle('line', 11, 1, 5, 15) -- 6x16 right aligned green outline\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata2 = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata2)\nend\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------OBJECT CREATION---------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.graphics.captureScreenshot\nlove.test.graphics.captureScreenshot = function(test)\n  love.graphics.captureScreenshot('example-screenshot.png')\n  test:waitFrames(1)\n  -- need to wait until end of the frame for the screenshot\n  test:assertTrue(love.filesystem.exists('example-screenshot.png'))\n  love.filesystem.remove('example-screenshot.png')\n  -- test callback version\n  local cbdata = nil\n  local prevtextcommand = TextCommand\n  TextCommand = \"Capturing screenshot\"\n  love.graphics.captureScreenshot(function (idata)\n    test:assertNotEquals(nil, idata, 'check we have image data')\n    cbdata = idata\n  end)\n  test:waitFrames(1)\n  TextCommand = prevtextcommand\n  test:assertNotNil(cbdata)\n\n  if test:isOS('iOS', 'Android') then\n    -- Mobile operating systems don't let us control the window resolution,\n    -- so we can't compare the reference image properly.\n    test:assertTrue(true, 'skip test')\n  else\n    test:compareImg(cbdata)\n  end\nend\n\n\n-- love.graphics.newArrayImage\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.graphics.newArrayImage = function(test)\n  test:assertObject(love.graphics.newArrayImage({\n    'resources/love.png', 'resources/love2.png', 'resources/love3.png'\n  }))\nend\n\n-- love.graphics.newCanvas\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.graphics.newCanvas = function(test)\n  test:assertObject(love.graphics.newCanvas(16, 16, {\n    type = '2d',\n    format = 'normal',\n    readable = true,\n    msaa = 0,\n    dpiscale = 1,\n    mipmaps = 'none'\n  }))\n  test:assertObject(love.graphics.newCanvas(1000, 1000))\nend\n\n\n-- love.graphics.newCubeImage\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.graphics.newCubeImage = function(test)\n  test:assertObject(love.graphics.newCubeImage('resources/cubemap.png', {\n    mipmaps = false,\n    linear = false\n  }))\nend\n\n\n-- love.graphics.newFont\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.graphics.newFont = function(test)\n  test:assertObject(love.graphics.newFont('resources/font.ttf'))\n  test:assertObject(love.graphics.newFont('resources/font.ttf', 8, \"normal\", 1))\nend\n\n\n-- love.graphics.newImage\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.graphics.newImage = function(test)\n  test:assertObject(love.graphics.newImage('resources/love.png', {\n    mipmaps = false,\n    linear = false,\n    dpiscale = 1\n  }))\nend\n\n\n-- love.graphics.newImageFont\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.graphics.newImageFont = function(test)\n  test:assertObject(love.graphics.newImageFont('resources/love.png', 'ABCD', 1))\nend\n\n\n-- love.graphics.newMesh\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.graphics.newMesh = function(test)\n  test:assertObject(love.graphics.newMesh({{1, 1, 0, 0, 1, 1, 1, 1}}, 'fan', 'dynamic'))\nend\n\n\n-- love.graphics.newParticleSystem\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.graphics.newParticleSystem = function(test)\n  local imgdata = love.graphics.newImage('resources/love.png')\n  test:assertObject(love.graphics.newParticleSystem(imgdata, 1000))\nend\n\n\n-- love.graphics.newQuad\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.graphics.newQuad = function(test)\n  local imgdata = love.graphics.newImage('resources/love.png')\n  test:assertObject(love.graphics.newQuad(0, 0, 16, 16, imgdata))\nend\n\n\n-- love.graphics.newShader\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.graphics.newShader = function(test)\n  local pixelcode = [[\n    vec4 effect(vec4 color, Image tex, vec2 texture_coords, vec2 screen_coords) { \n      vec4 texturecolor = Texel(tex, texture_coords); \n      return texturecolor * color;\n    }\n  ]]\n  local vertexcode = [[\n    vec4 position(mat4 transform_projection, vec4 vertex_position) { \n      return transform_projection * vertex_position; \n    }\n  ]]\n  test:assertObject(love.graphics.newShader(pixelcode, vertexcode))\nend\n\n\n-- love.graphics.newSpriteBatch\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.graphics.newSpriteBatch = function(test)\n  local imgdata = love.graphics.newImage('resources/love.png')\n  test:assertObject(love.graphics.newSpriteBatch(imgdata, 1000))\nend\n\n\n-- love.graphics.newTextBatch\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.graphics.newTextBatch = function(test)\n  local font = love.graphics.newFont('resources/font.ttf')\n  test:assertObject(love.graphics.newTextBatch(font, 'helloworld'))\nend\n\n\n-- love.graphics.newTexture\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.graphics.newTexture = function(test)\n  local imgdata = love.image.newImageData('resources/love.png')\n  test:assertObject(love.graphics.newTexture(imgdata))\nend\n\n\n-- love.graphics.newVideo\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.graphics.newVideo = function(test)\n  test:assertObject(love.graphics.newVideo('resources/sample.ogv', {\n    audio = false,\n    dpiscale = 1\n  }))\nend\n\n\n-- love.graphics.newVolumeImage\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.graphics.newVolumeImage = function(test)\n  test:assertObject(love.graphics.newVolumeImage({\n    'resources/love.png', 'resources/love2.png', 'resources/love3.png'\n  }, {\n    mipmaps = false,\n    linear = false\n  }))\nend\n\n\n-- love.graphics.validateShader\nlove.test.graphics.validateShader = function(test)\n  local pixelcode = [[\n    vec4 effect(vec4 color, Image tex, vec2 texture_coords, vec2 screen_coords) { \n      vec4 texturecolor = Texel(tex, texture_coords); \n      return texturecolor * color;\n    }\n  ]]\n  local vertexcode = [[\n    vec4 position(mat4 transform_projection, vec4 vertex_position) { \n      return transform_projection * vertex_position; \n    }\n  ]]\n  -- check made up code first\n  local status, _ = love.graphics.validateShader(true, 'nothing here', 'or here')\n  test:assertFalse(status, 'check invalid shader code')\n  -- check real code \n  status, _ = love.graphics.validateShader(true, pixelcode, vertexcode)\n  test:assertTrue(status, 'check valid shader code')\nend\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n---------------------------------GRAPHICS STATE---------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.graphics.getBackgroundColor\nlove.test.graphics.getBackgroundColor = function(test)\n  -- check default bg is black\n  local r, g, b, a = love.graphics.getBackgroundColor()\n  test:assertEquals(0, r, 'check default background r')\n  test:assertEquals(0, g, 'check default background g')\n  test:assertEquals(0, b, 'check default background b')\n  test:assertEquals(1, a, 'check default background a')\n  -- check set value returns correctly\n  love.graphics.setBackgroundColor(1, 1, 1, 0)\n  r, g, b, a = love.graphics.getBackgroundColor()\n  test:assertEquals(1, r, 'check updated background r')\n  test:assertEquals(1, g, 'check updated background g')\n  test:assertEquals(1, b, 'check updated background b')\n  test:assertEquals(0, a, 'check updated background a')\n  love.graphics.setBackgroundColor(0, 0, 0, 1) -- reset\nend\n\n\n-- love.graphics.getBlendMode\nlove.test.graphics.getBlendMode = function(test)\n  -- check default blend mode\n  local mode, alphamode = love.graphics.getBlendMode()\n  test:assertEquals('alpha', mode, 'check default blend mode')\n  test:assertEquals('alphamultiply', alphamode, 'check default alpha blend')\n  -- check set mode returns correctly\n  love.graphics.setBlendMode('add', 'premultiplied')\n  mode, alphamode = love.graphics.getBlendMode()\n  test:assertEquals('add', mode, 'check changed blend mode')\n  test:assertEquals('premultiplied', alphamode, 'check changed alpha blend')\n  love.graphics.setBlendMode('alpha', 'alphamultiply') -- reset\nend\n\n\n-- love.graphics.getCanvas\nlove.test.graphics.getCanvas = function(test)\n  -- by default should be nil if drawing to real screen\n  test:assertEquals(nil, love.graphics.getCanvas(), 'check no canvas set')\n  -- should return not nil when we target a canvas\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setCanvas(canvas)\n  test:assertObject(love.graphics.getCanvas())\n  love.graphics.setCanvas()\nend\n\n\n-- love.graphics.getColor\nlove.test.graphics.getColor = function(test)\n  -- by default should be white\n  local r, g, b, a = love.graphics.getColor()\n  test:assertEquals(1, r, 'check default color r')\n  test:assertEquals(1, g, 'check default color g')\n  test:assertEquals(1, b, 'check default color b')\n  test:assertEquals(1, a, 'check default color a')\n  -- check set color is returned correctly\n  love.graphics.setColor(0, 0, 0, 0)\n  r, g, b, a = love.graphics.getColor()\n  test:assertEquals(0, r, 'check changed color r')\n  test:assertEquals(0, g, 'check changed color g')\n  test:assertEquals(0, b, 'check changed color b')\n  test:assertEquals(0, a, 'check changed color a')\n  love.graphics.setColor(1, 1, 1, 1) -- reset\nend\n\n\n-- love.graphics.getColorMask\nlove.test.graphics.getColorMask = function(test)\n  -- by default should all be active\n  local r, g, b, a = love.graphics.getColorMask()\n  test:assertTrue(r, 'check default color mask r')\n  test:assertTrue(g, 'check default color mask g')\n  test:assertTrue(b, 'check default color mask b')\n  test:assertTrue(a, 'check default color mask a')\n  -- check set color mask is returned correctly\n  love.graphics.setColorMask(false, false, true, false)\n  r, g, b, a = love.graphics.getColorMask()\n  test:assertFalse(r, 'check changed color mask r')\n  test:assertFalse(g, 'check changed color mask g')\n  test:assertTrue( b, 'check changed color mask b')\n  test:assertFalse(a, 'check changed color mask a')\n  love.graphics.setColorMask(true, true, true, true) -- reset\nend\n\n\n-- love.graphics.getDefaultFilter\nlove.test.graphics.getDefaultFilter = function(test)\n  -- we set this already for testsuite so we know what it should be\n  local min, mag, anisotropy = love.graphics.getDefaultFilter()\n  test:assertEquals('nearest', min, 'check default filter min')\n  test:assertEquals('nearest', mag, 'check default filter mag')\n  test:assertEquals(1, anisotropy, 'check default filter mag')\nend\n\n\n-- love.graphics.getDepthMode\nlove.test.graphics.getDepthMode = function(test)\n  -- by default should be always/write\n  local comparemode, write = love.graphics.getDepthMode()\n  test:assertEquals('always', comparemode, 'check default compare depth')\n  test:assertFalse(write, 'check default depth buffer write')\nend\n\n\n-- love.graphics.getFont\nlove.test.graphics.getFont = function(test)\n  test:assertObject(love.graphics.getFont())\nend\n\n\n-- love.graphics.getFrontFaceWinding\nlove.test.graphics.getFrontFaceWinding = function(test)\n  -- check default winding\n  test:assertEquals('ccw', love.graphics.getFrontFaceWinding())\n  -- check setting value changes it correctly\n  love.graphics.setFrontFaceWinding('cw')\n  test:assertEquals('cw', love.graphics.getFrontFaceWinding())\n  love.graphics.setFrontFaceWinding('ccw') -- reset\nend\n\n\n-- love.graphics.getLineJoin\nlove.test.graphics.getLineJoin = function(test)\n  -- check default line join\n  test:assertEquals('miter', love.graphics.getLineJoin())\n  -- check set value returned correctly\n  love.graphics.setLineJoin('none')\n  test:assertEquals('none', love.graphics.getLineJoin())\n  love.graphics.setLineJoin('miter') -- reset\nend\n\n\n-- love.graphics.getLineStyle\nlove.test.graphics.getLineStyle = function(test)\n  -- we know this should be as testsuite sets it!\n  test:assertEquals('rough', love.graphics.getLineStyle())\n  -- check set value returned correctly\n  love.graphics.setLineStyle('smooth')\n  test:assertEquals('smooth', love.graphics.getLineStyle())\n  love.graphics.setLineStyle('rough') -- reset\nend\n\n\n-- love.graphics.getLineWidth\nlove.test.graphics.getLineWidth = function(test)\n  -- we know this should be as testsuite sets it!\n  test:assertEquals(1, love.graphics.getLineWidth())\n  -- check set value returned correctly\n  love.graphics.setLineWidth(10)\n  test:assertEquals(10, love.graphics.getLineWidth())\n  love.graphics.setLineWidth(1) -- reset\nend\n\n\n-- love.graphics.getMeshCullMode\nlove.test.graphics.getMeshCullMode = function(test)\n  -- get default mesh culling\n  test:assertEquals('none', love.graphics.getMeshCullMode())\n  -- check set value returned correctly\n  love.graphics.setMeshCullMode('front')\n  test:assertEquals('front', love.graphics.getMeshCullMode())\n  love.graphics.setMeshCullMode('back') -- reset\nend\n\n\n-- love.graphics.getPointSize\nlove.test.graphics.getPointSize = function(test)\n  -- get default point size\n  test:assertEquals(1, love.graphics.getPointSize())\n  -- check set value returned correctly\n  love.graphics.setPointSize(10)\n  test:assertEquals(10, love.graphics.getPointSize())\n  love.graphics.setPointSize(1) -- reset\nend\n\n\n-- love.graphics.getScissor\nlove.test.graphics.getScissor = function(test)\n  -- should be no scissor atm\n  local x, y, w, h = love.graphics.getScissor()\n  test:assertEquals(nil, x, 'check no scissor')\n  test:assertEquals(nil, y, 'check no scissor')\n  test:assertEquals(nil, w, 'check no scissor')\n  test:assertEquals(nil, h, 'check no scissor')\n  -- check set value returned correctly\n  love.graphics.setScissor(0, 0, 16, 16)\n  x, y, w, h = love.graphics.getScissor()\n  test:assertEquals(0, x, 'check scissor set')\n  test:assertEquals(0, y, 'check scissor set')\n  test:assertEquals(16, w, 'check scissor set')\n  test:assertEquals(16, h, 'check scissor set')\n  love.graphics.setScissor() -- reset\nend\n\n\n-- love.graphics.getShader\nlove.test.graphics.getShader = function(test)\n  -- should be no shader active\n  test:assertEquals(nil, love.graphics.getShader(), 'check no active shader')\nend\n\n\n-- love.graphics.getStackDepth\nlove.test.graphics.getStackDepth = function(test)\n  -- by default should be none\n  test:assertEquals(0, love.graphics.getStackDepth(), 'check no transforms in stack')\n  -- now add 3\n  love.graphics.push()\n  love.graphics.push()\n  love.graphics.push()\n  test:assertEquals(3, love.graphics.getStackDepth(), 'check 3 transforms in stack')\n  -- now remove 2\n  love.graphics.pop()\n  love.graphics.pop()\n  test:assertEquals(1, love.graphics.getStackDepth(), 'check 1 transforms in stack')\n  -- now back to 0\n  love.graphics.pop()\n  test:assertEquals(0, love.graphics.getStackDepth(), 'check no transforms in stack')\nend\n\n\n-- love.graphics.getStencilState\nlove.test.graphics.getStencilState = function(test)\n  -- check default vals\n  local action, comparemode, value = love.graphics.getStencilState( )\n  test:assertEquals('keep', action, 'check default stencil action')\n  test:assertEquals('always', comparemode, 'check default stencil compare')\n  test:assertEquals(0, value, 'check default stencil value')\n  -- check set stencil values is returned\n  love.graphics.setStencilState('replace', 'less', 255)\n  local action, comparemode, value = love.graphics.getStencilState()\n  test:assertEquals('replace', action, 'check changed stencil action')\n  test:assertEquals('less', comparemode, 'check changed stencil compare')\n  test:assertEquals(255, value, 'check changed stencil value')\n  love.graphics.setStencilState() -- reset\nend\n\n\n-- love.graphics.intersectScissor\nlove.test.graphics.intersectScissor = function(test)\n  -- make a scissor for the left half, then interset to make the top half\n  -- then we should be able to fill the canvas with red and only top 4x4 is filled\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.origin()\n    love.graphics.setScissor(0, 0, 8, 16)\n    love.graphics.intersectScissor(0, 0, 4, 4)\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.rectangle('fill', 0, 0, 16, 16)\n    love.graphics.setColor(1, 1, 1, 1)\n    love.graphics.setScissor()\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.isActive\nlove.test.graphics.isActive = function(test)\n  test:assertTrue(love.graphics.isActive(), 'check graphics is active') -- i mean if you got this far\nend\n\n\n-- love.graphics.isGammaCorrect\nlove.test.graphics.isGammaCorrect = function(test)\n  -- we know the config so know this is false\n  test:assertNotNil(love.graphics.isGammaCorrect())\nend\n\n\n-- love.graphics.isWireframe\nlove.test.graphics.isWireframe = function(test)\n  local name, version, vendor, device = love.graphics.getRendererInfo()\n  if string.match(name, 'OpenGL ES') then\n    test:skipTest('Wireframe not supported on OpenGL ES')\n  else\n    -- check off by default\n    test:assertFalse(love.graphics.isWireframe(), 'check no wireframe by default')\n    -- check on when enabled\n    love.graphics.setWireframe(true)\n    test:assertTrue(love.graphics.isWireframe(), 'check wireframe is set')\n    love.graphics.setWireframe(false) -- reset\n  end\nend\n\n\n-- love.graphics.reset\nlove.test.graphics.reset = function(test)\n  -- reset should reset current canvas and any colors/scissor\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setBackgroundColor(0, 0, 1, 1)\n  love.graphics.setColor(0, 1, 0, 1)\n  love.graphics.setCanvas(canvas)\n  love.graphics.reset()\n  local r, g, b, a = love.graphics.getBackgroundColor()\n  test:assertEquals(1, r+g+b+a, 'check background reset')\n  r, g, b, a = love.graphics.getColor()\n  test:assertEquals(4, r+g+b+a, 'check color reset')\n  test:assertEquals(nil, love.graphics.getCanvas(), 'check canvas reset')\n  love.graphics.setDefaultFilter(\"nearest\", \"nearest\")\n  love.graphics.setLineStyle('rough')\n  love.graphics.setPointSize(1)\n  love.graphics.setLineWidth(1)\nend\n\n\n-- love.graphics.setBackgroundColor\nlove.test.graphics.setBackgroundColor = function(test)\n  -- check background is set\n  love.graphics.setBackgroundColor(1, 0, 0, 1)\n  local r, g, b, a = love.graphics.getBackgroundColor()\n  test:assertEquals(1, r, 'check set bg r')\n  test:assertEquals(0, g, 'check set bg g')\n  test:assertEquals(0, b, 'check set bg b')\n  test:assertEquals(1, a, 'check set bg a')\n  love.graphics.setBackgroundColor(0, 0, 0, 1)\nend\n\n\n-- love.graphics.setBlendMode\nlove.test.graphics.setBlendMode = function(test)\n  -- create fully white canvas, then draw diff. pixels through blendmodes\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0.5, 0.5, 0.5, 1)\n    love.graphics.setBlendMode('add', 'alphamultiply')\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.rectangle('fill', 0, 0, 1, 1)\n    love.graphics.setBlendMode('subtract', 'alphamultiply')\n    love.graphics.setColor(1, 1, 1, 0.5)\n    love.graphics.rectangle('fill', 15, 0, 1, 1)\n    love.graphics.setBlendMode('multiply', 'premultiplied')\n    love.graphics.setColor(0, 1, 0, 1)\n    love.graphics.rectangle('fill', 15, 15, 1, 1)\n    love.graphics.setBlendMode('replace', 'premultiplied')\n    love.graphics.setColor(0, 0, 1, 0.5)\n    love.graphics.rectangle('fill', 0, 15, 1, 1)\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  love.graphics.setBlendMode('alpha', 'alphamultiply') -- reset \n  -- need 1rgba tolerance here on some machines\n  test.rgba_tolerance = 1\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.setCanvas\nlove.test.graphics.setCanvas = function(test)\n  -- make 2 canvas, set to each, draw one to the other, check output\n  local canvas1 = love.graphics.newCanvas(16, 16)\n  local canvas2 = love.graphics.newCanvas(16, 16, {mipmaps = \"auto\"})\n  love.graphics.setCanvas(canvas1)\n    test:assertEquals(canvas1, love.graphics.getCanvas(), 'check canvas 1 set')\n    love.graphics.clear(1, 0, 0, 1)\n  love.graphics.setCanvas(canvas2)\n    test:assertEquals(canvas2, love.graphics.getCanvas(), 'check canvas 2 set')\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.draw(canvas1, 0, 0)\n  love.graphics.setCanvas()\n  test:assertEquals(nil, love.graphics.getCanvas(), 'check no canvas set')\n  local imgdata = love.graphics.readbackTexture(canvas2)\n  test:compareImg(imgdata)\n  local imgdata2 = love.graphics.readbackTexture(canvas2, 1, 2) -- readback mipmap\n  test:compareImg(imgdata2)\nend\n\n\n-- love.graphics.setColor\nlove.test.graphics.setColor = function(test)\n  -- set colors, draw rect, check color \n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.setColor(1, 0, 0, 1)\n    local r, g, b, a = love.graphics.getColor()\n    test:assertEquals(1, r, 'check r set')\n    test:assertEquals(0, g, 'check g set')\n    test:assertEquals(0, b, 'check b set')\n    test:assertEquals(1, a, 'check a set')\n\n    love.graphics.rectangle('fill', 0, 0, 16, 1)\n    love.graphics.setColor(1, 1, 0, 1)\n    love.graphics.rectangle('fill', 0, 1, 16, 1)\n    love.graphics.setColor(0, 1, 0, 0.5)\n    love.graphics.rectangle('fill', 0, 2, 16, 1)\n    love.graphics.setColor(0, 0, 1, 1)\n    love.graphics.rectangle('fill', 0, 3, 16, 1)\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.setColorMask\nlove.test.graphics.setColorMask = function(test)\n  -- set mask, draw stuff, check output pixels\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    -- mask off blue\n    love.graphics.setColorMask(true, true, false, true)\n    local r, g, b, a = love.graphics.getColorMask()\n    test:assertEquals(r, true, 'check r mask')\n    test:assertEquals(g, true, 'check g mask')\n    test:assertEquals(b, false, 'check b mask')\n    test:assertEquals(a, true, 'check a mask')\n    -- draw \"black\" which should then turn to yellow\n    love.graphics.setColor(1, 1, 1, 1)\n    love.graphics.rectangle('fill', 0, 0, 16, 16)\n    love.graphics.setColorMask(true, true, true, true)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.setDefaultFilter\nlove.test.graphics.setDefaultFilter = function(test)\n  -- check setting filter val works\n  love.graphics.setDefaultFilter('linear', 'linear', 1)\n  local min, mag, anisotropy = love.graphics.getDefaultFilter()\n  test:assertEquals('linear', min, 'check default filter min')\n  test:assertEquals('linear', mag, 'check default filter mag')\n  test:assertEquals(1, anisotropy, 'check default filter mag')\n  love.graphics.setDefaultFilter('nearest', 'nearest', 1) -- reset\nend\n\n\n-- love.graphics.setDepthMode\nlove.test.graphics.setDepthMode = function(test)\n  -- check documented modes are valid\n  local comparemode, write = love.graphics.getDepthMode()\n  local modes = {\n    'equal', 'notequal', 'less', 'lequal', 'gequal',\n    'greater', 'never', 'always'\n  }\n  for m=1,#modes do\n    love.graphics.setDepthMode(modes[m], true)\n    test:assertEquals(modes[m], love.graphics.getDepthMode(), 'check depth mode ' .. modes[m] .. ' set')\n  end\n  love.graphics.setDepthMode(comparemode, write)\n  -- @TODO better graphics drawing specific test\nend\n\n\n-- love.graphics.setFont\nlove.test.graphics.setFont = function(test)\n  -- set font doesnt return anything so draw with the test font\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setFont(Font)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.print('love', 0, 3)\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.setFrontFaceWinding\nlove.test.graphics.setFrontFaceWinding = function(test)\n  -- check documented modes are valid\n  local original = love.graphics.getFrontFaceWinding()\n  love.graphics.setFrontFaceWinding('cw')\n  test:assertEquals('cw', love.graphics.getFrontFaceWinding(), 'check ffw cw set')\n  love.graphics.setFrontFaceWinding('ccw')\n  test:assertEquals('ccw', love.graphics.getFrontFaceWinding(), 'check ffw ccw set')\n  love.graphics.setFrontFaceWinding(original)\n  -- @TODO better graphics drawing specific test\n\n  local shader = love.graphics.newShader[[\nvec4 effect(vec4 c, Image tex, vec2 tc, vec2 pc) {\n  return gl_FrontFacing ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0); \n}\n  ]]\n  local dummyimg = love.graphics.newImage(love.image.newImageData(1, 1))\n\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.push(\"all\")\n    love.graphics.setCanvas(canvas)\n    love.graphics.setShader(shader)\n    love.graphics.draw(dummyimg, 0, 0, 0, 16, 16)\n  love.graphics.pop()\n\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.setLineJoin\nlove.test.graphics.setLineJoin = function(test)\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setFont(Font)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    local line = {0,1,8,1,8,8}\n    love.graphics.setLineStyle('rough')\n    love.graphics.setLineWidth(2)\n    love.graphics.setColor(1, 0, 0)\n    love.graphics.setLineJoin('bevel')\n    love.graphics.line(line)\n    love.graphics.translate(0, 4)\n    love.graphics.setColor(1, 1, 0)\n    love.graphics.setLineJoin('none')\n    love.graphics.line(line)\n    love.graphics.translate(0, 4)\n    love.graphics.setColor(0, 0, 1)\n    love.graphics.setLineJoin('miter')\n    love.graphics.line(line)\n    love.graphics.setColor(1, 1, 1)\n    love.graphics.setLineWidth(1)\n    love.graphics.origin()\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.setLineStyle\nlove.test.graphics.setLineStyle = function(test)\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setFont(Font)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.setColor(1, 0, 0)\n    local line = {0,1,16,1}\n    love.graphics.setLineStyle('rough')\n    love.graphics.line(line)\n    love.graphics.translate(0, 4)\n    love.graphics.setLineStyle('smooth')\n    love.graphics.line(line)\n    love.graphics.setLineStyle('rough')\n    love.graphics.setColor(1, 1, 1)\n    love.graphics.origin()\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  -- linux runner needs a 1/255 tolerance for the blend between a rough line + bg \n  if GITHUB_RUNNER and test:isOS('Linux') then\n    test.rgba_tolerance = 1\n  end\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.setLineWidth\nlove.test.graphics.setLineWidth = function(test)\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setFont(Font)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    local line = {0,1,8,1,8,8}\n    love.graphics.setColor(1, 0, 0)\n    love.graphics.setLineWidth(2)\n    love.graphics.line(line)\n    love.graphics.translate(0, 4)\n    love.graphics.setColor(1, 1, 0)\n    love.graphics.setLineWidth(3)\n    love.graphics.line(line)\n    love.graphics.translate(0, 4)\n    love.graphics.setColor(0, 0, 1)\n    love.graphics.setLineWidth(4)\n    love.graphics.line(line)\n    love.graphics.setColor(1, 1, 1)\n    love.graphics.setLineWidth(1)\n    love.graphics.origin()\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.setMeshCullMode\nlove.test.graphics.setMeshCullMode = function(test)\n  -- check documented modes are valid\n  local original = love.graphics.getMeshCullMode()\n  local modes = {'back', 'front', 'none'}\n  for m=1,#modes do\n    love.graphics.setMeshCullMode(modes[m])\n    test:assertEquals(modes[m], love.graphics.getMeshCullMode(), 'check mesh cull mode ' .. modes[m] .. ' was set')\n  end\n  love.graphics.setMeshCullMode(original)\n  -- @TODO better graphics drawing specific test\nend\n\n\n-- love.graphics.setScissor\nlove.test.graphics.setScissor = function(test)\n  -- make a scissor for the left half\n  -- then we should be able to fill the canvas with red and only left is filled\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.origin()\n    love.graphics.setScissor(0, 0, 8, 16)\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.rectangle('fill', 0, 0, 16, 16)\n    love.graphics.setColor(1, 1, 1, 1)\n    love.graphics.setScissor()\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.setShader\nlove.test.graphics.setShader = function(test)\n  -- make a shader that will only ever draw yellow\n  local pixelcode = [[\n    vec4 effect(vec4 color, Image tex, vec2 texture_coords, vec2 screen_coords) { \n      vec4 texturecolor = Texel(tex, texture_coords); \n      return vec4(1.0,1.0,0.0,1.0);\n    }\n  ]]\n  local vertexcode = [[\n    vec4 position(mat4 transform_projection, vec4 vertex_position) { \n      return transform_projection * vertex_position; \n    }\n  ]]\n  local shader = love.graphics.newShader(pixelcode, vertexcode)\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.setShader(shader)\n      -- draw red rectangle\n      love.graphics.setColor(1, 0, 0, 1)\n      love.graphics.rectangle('fill', 0, 0, 16, 16)\n    love.graphics.setShader()\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.setStencilState\nlove.test.graphics.setStencilState = function(test)\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setCanvas({canvas, stencil=true})\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.setStencilState('replace', 'always', 1)\n    love.graphics.circle('fill', 8, 8, 6)\n    love.graphics.setStencilState('keep', 'greater', 0)\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.rectangle('fill', 0, 0, 16, 16)\n    love.graphics.setColor(1, 1, 1, 1)\n    love.graphics.setStencilState()\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.setWireframe\nlove.test.graphics.setWireframe = function(test)\n  local name, version, vendor, device = love.graphics.getRendererInfo()\n  if string.match(name, 'OpenGL ES') then\n    test:skipTest('Wireframe not supported on OpenGL ES')\n  else\n    -- check wireframe outlines\n    love.graphics.setWireframe(true)\n    local canvas = love.graphics.newCanvas(16, 16)\n    love.graphics.setCanvas(canvas)\n      love.graphics.clear(0, 0, 0, 1)\n      love.graphics.setColor(1, 1, 0, 1)\n      love.graphics.rectangle('fill', 2, 2, 13, 13)\n      love.graphics.setColor(1, 1, 1, 1)\n    love.graphics.setCanvas()\n    love.graphics.setWireframe(false)\n    local imgdata = love.graphics.readbackTexture(canvas)\n    -- on macOS runners wireframes are drawn 1px off from the target\n    if GITHUB_RUNNER and test:isOS('OS X') then\n      test.pixel_tolerance = 1\n    end\n    test:compareImg(imgdata)\n  end\nend\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n-------------------------------COORDINATE SYSTEM--------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.graphics.applyTransform\nlove.test.graphics.applyTransform = function(test)\n  -- use transform object to translate the drawn rectangle\n  local transform = love.math.newTransform()\n  transform:translate(10, 0)\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.applyTransform(transform)\n    love.graphics.rectangle('fill', 0, 0, 1, 1)\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.inverseTransformPoint\nlove.test.graphics.inverseTransformPoint = function(test)\n  -- start with 0, 0\n  local sx, sy = love.graphics.inverseTransformPoint(0, 0)\n  test:assertEquals(0, sx, 'check starting x is 0')\n  test:assertEquals(0, sy, 'check starting y is 0')\n  -- check translation effects the point \n  love.graphics.translate(1, 5)\n  sx, sy = love.graphics.inverseTransformPoint(1, 5)\n  test:assertEquals(0, sx, 'check transformed x is 0')\n  test:assertEquals(0, sy, 'check transformed y is 0')\n  love.graphics.origin()\nend\n\n\n-- love.graphics.origin\nlove.test.graphics.origin = function(test)\n  -- if we do some translations and scaling\n  -- using .origin() should reset it all and draw the pixel at 0,0\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.origin()\n    love.graphics.translate(10, 10)\n    love.graphics.scale(1, 1)\n    love.graphics.shear(20, 20)\n    love.graphics.origin()\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.rectangle('fill', 0, 0, 1, 1)\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.pop\nlove.test.graphics.pop = function(test)\n  -- if we push at the start, and then run a pop\n  -- it should reset it all and draw the pixel at 0,0\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.push()\n    love.graphics.translate(10, 10)\n    love.graphics.scale(1, 1)\n    love.graphics.shear(20, 20)\n    love.graphics.pop()\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.rectangle('fill', 0, 0, 1, 1)\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.push\nlove.test.graphics.push = function(test)\n  -- if we push at the start, do some stuff, then another push\n  -- 1 pop should only go back 1 push and draw the pixel at 1, 1\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.push()\n    love.graphics.scale(1, 1)\n    love.graphics.shear(20, 20)\n    love.graphics.push()\n    love.graphics.translate(1, 1)\n    love.graphics.pop()\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.rectangle('fill', 0, 0, 1, 1)\n    love.graphics.setColor(1, 1, 1, 1)\n    love.graphics.pop()\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.replaceTransform\nlove.test.graphics.replaceTransform = function(test)\n  -- if use transform object to translate\n  -- set some normal transforms first which should get overwritten\n  local transform = love.math.newTransform()\n  transform:translate(10, 0)\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.scale(2, 2)\n    love.graphics.translate(10, 10)\n    love.graphics.replaceTransform(transform)\n    love.graphics.rectangle('fill', 0, 0, 1, 1)\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.rotate\nlove.test.graphics.rotate = function(test)\n  -- starting at 0,0, we rotate by 90deg and then draw\n  -- we can then check the drawn rectangle is rotated\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.translate(4, 0)\n    love.graphics.rotate(90 * (math.pi/180))\n    love.graphics.rectangle('fill', 0, 0, 4, 4)\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.scale\nlove.test.graphics.scale = function(test)\n  -- starting at 0,0, we scale by 4x and then draw\n  -- we can then check the drawn rectangle covers the whole canvas\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.scale(4, 4)\n    love.graphics.rectangle('fill', 0, 0, 4, 4)\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n-- love.graphics.shear\nlove.test.graphics.shear = function(test)\n  -- starting at 0,0, we shear by 2x and then draw\n  -- we can then check the drawn rectangle has moved over\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.origin()\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.shear(2, 0)\n    love.graphics.rectangle('fill', 0, 0, 4, 4)\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata1 = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata1)\n  -- same again at 0,0, we shear by 2y and then draw\n  -- we can then check the drawn rectangle has moved down\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.origin()\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.shear(0, 2)\n    love.graphics.rectangle('fill', 0, 0, 4, 4)\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata2 = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata2)\nend\n\n\n-- love.graphics.transformPoint\nlove.test.graphics.transformPoint = function(test)\n  -- start with 0, 0\n  local sx, sy = love.graphics.transformPoint(0, 0)\n  test:assertEquals(0, sx, 'check starting x is 0')\n  test:assertEquals(0, sy, 'check starting y is 0')\n  -- check translation effects the point \n  love.graphics.translate(1, 5)\n  sx, sy = love.graphics.transformPoint(0, 0)\n  test:assertEquals(1, sx, 'check transformed x is 0')\n  test:assertEquals(5, sy, 'check transformed y is 10')\nend\n\n\n-- love.graphics.translate\nlove.test.graphics.translate = function(test)\n  -- starting at 0,0, we translate 4 times and draw a pixel at each point\n  -- we can then check the 4 points are now red\n  local canvas = love.graphics.newCanvas(16, 16)\n  love.graphics.setCanvas(canvas)\n    love.graphics.clear(0, 0, 0, 1)\n    love.graphics.setColor(1, 0, 0, 1)\n    love.graphics.translate(5, 0)\n    love.graphics.rectangle('fill', 0, 0, 1, 1)\n    love.graphics.translate(0, 5)\n    love.graphics.rectangle('fill', 0, 0, 1, 1)\n    love.graphics.translate(-5, 0)\n    love.graphics.rectangle('fill', 0, 0, 1, 1)\n    love.graphics.translate(0, -5)\n    love.graphics.rectangle('fill', 0, 0, 1, 1)\n    love.graphics.setColor(1, 1, 1, 1)\n  love.graphics.setCanvas()\n  local imgdata = love.graphics.readbackTexture(canvas)\n  test:compareImg(imgdata)\nend\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n-------------------------------------WINDOW-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.graphics.getDPIScale\n-- @NOTE hardware dependent so can't check result\nlove.test.graphics.getDPIScale = function(test)\n  test:assertNotNil(love.graphics.getDPIScale())\nend\n\n\n-- love.graphics.getDimensions\nlove.test.graphics.getDimensions = function(test)\n  -- check graphics dimensions match window dimensions \n  local gwidth, gheight = love.graphics.getDimensions()\n  local wwidth, wheight, _ = love.window.getMode()\n  test:assertEquals(wwidth, gwidth, 'check graphics dimension w matches window w')\n  test:assertEquals(wheight, gheight, 'check graphics dimension h matches window h')\nend\n\n\n-- love.graphics.getHeight\nlove.test.graphics.getHeight = function(test)\n  -- check graphics height match window height \n  local wwidth, wheight, _ = love.window.getMode()\n  test:assertEquals(wheight, love.graphics.getHeight(), 'check graphics h matches window h')\nend\n\n\n-- love.graphics.getPixelDimensions\nlove.test.graphics.getPixelDimensions = function(test)\n  -- check graphics dimensions match window dimensions relative to dpi\n  local dpi = love.graphics.getDPIScale()\n  local gwidth, gheight = love.graphics.getPixelDimensions()\n  local wwidth, wheight, _ = love.window.getMode()\n  test:assertEquals(wwidth, gwidth/dpi, 'check graphics pixel dpi w matches window w')\n  test:assertEquals(wheight, gheight/dpi, 'check graphics pixel dpi h matches window h')\nend\n\n\n-- love.graphics.getPixelHeight\nlove.test.graphics.getPixelHeight = function(test)\n  -- check graphics height match window height relative to dpi\n  local dpi = love.graphics.getDPIScale()\n  local wwidth, wheight, _ = love.window.getMode()\n  test:assertEquals(wheight,love.graphics.getPixelHeight()/dpi, 'check graphics pixel dpi h matches window h')\nend\n\n\n-- love.graphics.getPixelWidth\nlove.test.graphics.getPixelWidth = function(test)\n  -- check graphics width match window width relative to dpi\n  local dpi = love.graphics.getDPIScale()\n  local wwidth, wheight, _ = love.window.getMode()\n  test:assertEquals(wwidth, love.graphics.getWidth()/dpi, 'check graphics pixel dpi w matches window w')\nend\n\n\n-- love.graphics.getWidth\nlove.test.graphics.getWidth = function(test)\n  -- check graphics width match window width \n  local wwidth, wheight, _ = love.window.getMode()\n  test:assertEquals(wwidth, love.graphics.getWidth(), 'check graphics w matches window w')\nend\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n-------------------------------SYSTEM INFORMATION-------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.graphics.getTextureFormats\nlove.test.graphics.getTextureFormats = function(test)\n  local formats = {\n    'hdr', 'r8i', 'r8ui', 'r16i', 'r16ui', 'r32i', 'r32ui', 'rg8i', 'rg8ui',\n    'rg16i', 'rg16ui', 'rg32i', 'rg32ui', 'bgra8', 'r8', 'rgba8i', 'rgba8ui',\n    'rgba16i', 'rg8', 'rgba32i', 'rgba32ui', 'rgba8', 'DXT1', 'r16', 'DXT5',\n    'rg16', 'BC4s', 'rgba16', 'BC5s', 'r16f', 'BC6hs', 'BC7', 'PVR1rgb2',\n    'rg16f', 'PVR1rgba2', 'rgba16f', 'ETC1', 'r32f', 'ETC2rgba', 'rg32f',\n    'EACr', 'rgba32f', 'EACrg', 'rgba4', 'ASTC4x4', 'ASTC5x4', 'rgb5a1',\n    'ASTC6x5', 'rgb565', 'ASTC8x5', 'ASTC8x6', 'rgb10a2', 'ASTC10x5',\n    'rg11b10f', 'ASTC10x8', 'ASTC10x10', 'ASTC12x10', 'ASTC12x12', 'normal',\n    'srgba8', 'la8', 'ASTC10x6', 'ASTC8x8', 'ASTC6x6', 'ASTC5x5', 'EACrgs',\n    'EACrs', 'ETC2rgba1', 'ETC2rgb', 'PVR1rgba4', 'PVR1rgb4', 'BC6h',\n    'BC5', 'BC4', 'DXT3', 'rgba16ui', 'bgra8srgb',\n    'depth16', 'depth24', 'depth32f', 'depth24stencil8', 'depth32fstencil8', 'stencil8'\n  }\n  local supported = love.graphics.getTextureFormats({ canvas = true })\n  test:assertNotNil(supported)\n  for f=1,#formats do\n    test:assertNotEquals(nil, supported[formats[f] ], 'expected a key for format: ' .. formats[f])\n  end\nend\n\n\n-- love.graphics.getRendererInfo\n-- @NOTE hardware dependent so best can do is nil checking\nlove.test.graphics.getRendererInfo = function(test)\n  local name, version, vendor, device = love.graphics.getRendererInfo()\n  test:assertNotNil(name)\n  test:assertNotNil(version)\n  test:assertNotNil(vendor)\n  test:assertNotNil(device)\nend\n\n\n-- love.graphics.getStats\n-- @NOTE cant really predict some of these so just nil check for most\nlove.test.graphics.getStats = function(test)\n  local stattypes = {\n    'drawcalls', 'canvasswitches', 'texturememory', 'shaderswitches',\n    'drawcallsbatched', 'textures', 'fonts'\n  }\n  local stats = love.graphics.getStats()\n  for s=1,#stattypes do\n    test:assertNotEquals(nil, stats[stattypes[s] ], 'expected a key for stat: ' .. stattypes[s])\n  end\nend\n\n\n-- love.graphics.getSupported\nlove.test.graphics.getSupported = function(test)\n  -- cant check values as hardware dependent but we can check the keys in the \n  -- table match what the documentation lists\n  local gfs = {\n    'clampzero', 'lighten', 'glsl3', 'instancing', 'fullnpot', \n    'pixelshaderhighp', 'shaderderivatives', 'indirectdraw',\n    'copytexturetobuffer', 'multicanvasformats', \n    'clampone', 'glsl4'\n  }\n  local features = love.graphics.getSupported()\n  for g=1,#gfs do\n    test:assertNotEquals(nil, features[gfs[g] ], 'expected a key for graphic feature: ' .. gfs[g])\n  end\nend\n\n\n-- love.graphics.getSystemLimits\nlove.test.graphics.getSystemLimits = function(test)\n  -- cant check values as hardware dependent but we can check the keys in the \n  -- table match what the documentation lists\n  local glimits = {\n    'texelbuffersize', 'shaderstoragebuffersize', 'threadgroupsx', \n    'threadgroupsy', 'pointsize', 'texturesize', 'texturelayers', 'volumetexturesize',\n    'cubetexturesize', 'anisotropy', 'texturemsaa', 'multicanvas', 'threadgroupsz'\n  }\n  local limits = love.graphics.getSystemLimits()\n  for g=1,#glimits do\n    test:assertNotEquals(nil, limits[glimits[g] ], 'expected a key for system limit: ' .. glimits[g])\n  end\nend\n\n\n-- love.graphics.getTextureTypes\nlove.test.graphics.getTextureTypes = function(test)\n  -- cant check values as hardware dependent but we can check the keys in the \n  -- table match what the documentation lists\n  local ttypes = {\n    '2d', 'array', 'cube', 'volume'\n  }\n  local types = love.graphics.getTextureTypes()\n  for t=1,#ttypes do\n    test:assertNotEquals(nil, types[ttypes[t] ], 'expected a key for texture type: ' .. ttypes[t])\n  end\nend\n"
  },
  {
    "path": "testing/tests/image.lua",
    "content": "-- love.image\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n------------------------------------OBJECTS-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- CompressedImageData (love.image.newCompressedImageData)\nlove.test.image.CompressedImageData = function(test)\n\n  -- create obj\n  local idata = love.image.newCompressedData('resources/love.dxt1')\n  test:assertObject(idata)\n\n  -- check string + size\n  test:assertNotEquals(nil, idata:getString(), 'check data string')\n  test:assertEquals(2744, idata:getSize(), 'check data size')\n\n  -- check img dimensions\n  local iw, ih = idata:getDimensions()\n  test:assertEquals(64, iw, 'check image dimension w')\n  test:assertEquals(64, ih, 'check image dimension h')\n  test:assertEquals(64, idata:getWidth(), 'check image direct w')\n  test:assertEquals(64, idata:getHeight(), 'check image direct h')\n\n  -- check format\n  test:assertEquals('DXT1', idata:getFormat(), 'check image format')\n\n  -- check mipmap count\n  test:assertEquals(7, idata:getMipmapCount(), 'check mipmap count')\n\n  -- check linear\n  test:assertFalse(idata:isLinear(), 'check not linear')\n  idata:setLinear(true)\n  test:assertTrue(idata:isLinear(), 'check now linear')\n\nend\n\n\n-- ImageData (love.image.newImageData)\nlove.test.image.ImageData = function(test)\n\n  -- create obj\n  local idata = love.image.newImageData('resources/love.png')\n  test:assertObject(idata)\n\n  -- check string + size\n  test:assertNotEquals(nil, idata:getString(), 'check data string')\n  test:assertEquals(16384, idata:getSize(), 'check data size')\n\n  -- check img dimensions\n  local iw, ih = idata:getDimensions()\n  test:assertEquals(64, iw, 'check image dimension w')\n  test:assertEquals(64, ih, 'check image dimension h')\n  test:assertEquals(64, idata:getWidth(), 'check image direct w')\n  test:assertEquals(64, idata:getHeight(), 'check image direct h')\n\n  -- check format\n  test:assertEquals('rgba8', idata:getFormat(), 'check image format')\n  \n  -- manipulate image data so white heart is black\n  local mapdata = function(x, y, r, g, b, a)\n    if r == 1 and g == 1 and b == 1 then\n      r = 0; g = 0; b = 0\n    end\n    return r, g, b, a\n  end\n  idata:mapPixel(mapdata, 0, 0, 64, 64)\n  local r1, g1, b1 = idata:getPixel(25, 25)\n  test:assertEquals(0, r1+g1+b1, 'check mapped black')\n\n  -- map some other data into the idata\n  local idata2 = love.image.newImageData('resources/loveinv.png')\n  idata:paste(idata2, 0, 0, 0, 0)\n  r1, g1, b1 = idata:getPixel(25, 25)\n  test:assertEquals(3, r1+g1+b1, 'check back to white')\n\n  -- set pixels directly\n  idata:setPixel(25, 25, 1, 0, 0, 1)\n  local r2, g2, b2 = idata:getPixel(25, 25)\n  test:assertEquals(1, r2+g2+b2, 'check set to red')\n\n  -- check encoding to an image (png)\n  idata:encode('png', 'test-encode.png')\n  local read1 = love.filesystem.openFile('test-encode.png', 'r')\n  test:assertNotNil(read1)\n  love.filesystem.remove('test-encode.png')\n\n  -- check encoding to an image (exr)\n  local edata = love.image.newImageData(100, 100, 'r16f')\n  edata:encode('exr', 'test-encode.exr')\n  local read2 = love.filesystem.openFile('test-encode.exr', 'r')\n  test:assertNotNil(read2)\n  love.filesystem.remove('test-encode.exr')\n\n  -- check linear\n  test:assertFalse(idata:isLinear(), 'check not linear')\n  idata:setLinear(true)\n  test:assertTrue(idata:isLinear(), 'check now linear')\n\nend\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n------------------------------------METHODS-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.image.isCompressed\n-- @NOTE really we need to test each of the files listed here:\n-- https://love2d.org/wiki/CompressedImageFormat\n-- also need to be platform dependent (e.g. dxt not suppored on phones)\nlove.test.image.isCompressed = function(test)\n  test:assertTrue(love.image.isCompressed('resources/love.dxt1'), \n    'check dxt1 valid compressed image')\nend\n\n\n-- love.image.newCompressedData\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.image.newCompressedData = function(test)\n  test:assertObject(love.image.newCompressedData('resources/love.dxt1'))\nend\n\n\n-- love.image.newImageData\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.image.newImageData = function(test)\n  test:assertObject(love.image.newImageData('resources/love.png'))\n  test:assertObject(love.image.newImageData(16, 16, 'rgba8', nil))\nend\n"
  },
  {
    "path": "testing/tests/joystick.lua",
    "content": "-- love.joystick\n-- @NOTE we can't test this module fully as it's hardware dependent\n-- however we can test methods do what is expected and can handle certain params\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n------------------------------------METHODS-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.joystick.getGamepadMappingString\nlove.test.joystick.getGamepadMappingString = function(test)\n  local mapping = love.joystick.getGamepadMappingString('faker')\n  test:assertEquals(nil, mapping, 'check no mapping for fake gui')\nend\n\n\n-- love.joystick.getJoystickCount\nlove.test.joystick.getJoystickCount = function(test)\n  local count = love.joystick.getJoystickCount()\n  test:assertGreaterEqual(0, count, 'check number')\nend\n\n\n-- love.joystick.getJoysticks\nlove.test.joystick.getJoysticks = function(test)\n  local joysticks = love.joystick.getJoysticks()\n  test:assertGreaterEqual(0, #joysticks, 'check is count')\nend\n\n\n-- love.joystick.loadGamepadMappings\nlove.test.joystick.loadGamepadMappings = function(test)\n  local ok, err = pcall(love.joystick.loadGamepadMappings, 'fakefile.txt')\n  test:assertEquals(false, ok, 'check invalid file')\n  love.joystick.loadGamepadMappings('resources/mappings.txt')\nend\n\n\n-- love.joystick.saveGamepadMappings\nlove.test.joystick.saveGamepadMappings = function(test)\n  love.joystick.loadGamepadMappings('resources/mappings.txt')\n  local mapping = love.joystick.saveGamepadMappings()\n  test:assertGreaterEqual(0, #mapping, 'check something mapped')\nend\n\n\n-- love.joystick.setGamepadMapping\nlove.test.joystick.setGamepadMapping = function(test)\n  local guid = '030000005e040000130b000011050000'\n  local mappings = {\n    love.joystick.setGamepadMapping(guid, 'a', 'button', 1, nil),\n    love.joystick.setGamepadMapping(guid, 'b', 'button', 2, nil),\n    love.joystick.setGamepadMapping(guid, 'x', 'button', 3, nil),\n    love.joystick.setGamepadMapping(guid, 'y', 'button', 4, nil),\n    love.joystick.setGamepadMapping(guid, 'back', 'button', 5, nil),\n    love.joystick.setGamepadMapping(guid, 'start', 'button', 6, nil),\n    love.joystick.setGamepadMapping(guid, 'guide', 'button', 7, nil),\n    love.joystick.setGamepadMapping(guid, 'leftstick', 'button', 8, nil),\n    love.joystick.setGamepadMapping(guid, 'leftshoulder', 'button', 9, nil),\n    love.joystick.setGamepadMapping(guid, 'rightstick', 'button', 10, nil),\n    love.joystick.setGamepadMapping(guid, 'rightshoulder', 'button', 11, nil),\n    love.joystick.setGamepadMapping(guid, 'dpup', 'button', 12, nil),\n    love.joystick.setGamepadMapping(guid, 'dpdown', 'button', 13, nil),\n    love.joystick.setGamepadMapping(guid, 'dpleft', 'button', 14, nil),\n    love.joystick.setGamepadMapping(guid, 'dpright', 'button', 15, nil),\n    love.joystick.setGamepadMapping(guid, 'dpup', 'button', 12, 'u'),\n    love.joystick.setGamepadMapping(guid, 'dpdown', 'button', 13, 'd'),\n    love.joystick.setGamepadMapping(guid, 'dpleft', 'button', 14, 'l'),\n    love.joystick.setGamepadMapping(guid, 'dpright', 'button', 15, 'r'),\n    love.joystick.setGamepadMapping(guid, 'dpup', 'hat', 12, 'lu'),\n    love.joystick.setGamepadMapping(guid, 'dpdown', 'hat', 13, 'ld'),\n    love.joystick.setGamepadMapping(guid, 'dpleft', 'hat', 14, 'ru'),\n    love.joystick.setGamepadMapping(guid, 'dpright', 'hat', 15, 'rd'),\n    love.joystick.setGamepadMapping(guid, 'leftstick', 'axis', 8, 'c')\n  }\n  for m=1,#mappings do\n    test:assertEquals(true, mappings[m], 'check mapping #' .. tostring(m))\n  end\nend\n"
  },
  {
    "path": "testing/tests/keyboard.lua",
    "content": "-- love.keyboard\n-- @NOTE we can't test this module fully as it's hardware dependent\n-- however we can test methods do what is expected and can handle certain params\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n------------------------------------METHODS-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.keyboard.getKeyFromScancode\nlove.test.keyboard.getKeyFromScancode = function(test)\n  test:assertEquals('function', type(love.keyboard.getKeyFromScancode))\nend\n\n\n-- love.keyboard.getScancodeFromKey\nlove.test.keyboard.getScancodeFromKey = function(test)\n  test:assertEquals('function', type(love.keyboard.getScancodeFromKey))\nend\n\n\n-- love.keyboard.hasKeyRepeat\nlove.test.keyboard.hasKeyRepeat = function(test)\n  local enabled = love.keyboard.hasKeyRepeat()\n  test:assertNotNil(enabled)\nend\n\n\n-- love.keyboard.hasScreenKeyboard\nlove.test.keyboard.hasScreenKeyboard = function(test)\n  local enabled = love.keyboard.hasScreenKeyboard()\n  test:assertNotNil(enabled)\nend\n\n\n-- love.keyboard.hasTextInput\nlove.test.keyboard.hasTextInput = function(test)\n  local enabled = love.keyboard.hasTextInput()\n  test:assertNotNil(enabled)\nend\n\n\n-- love.keyboard.isDown\nlove.test.keyboard.isDown = function(test)\n  local keydown = love.keyboard.isDown('a')\n  test:assertNotNil(keydown)\nend\n\n\n-- love.keyboard.isScancodeDown\nlove.test.keyboard.isScancodeDown = function(test)\n  local keydown = love.keyboard.isScancodeDown('a')\n  test:assertNotNil(keydown)\nend\n\n\n-- love.keyboard.setKeyRepeat\nlove.test.keyboard.setKeyRepeat = function(test)\n  love.keyboard.setKeyRepeat(true)\n  local enabled = love.keyboard.hasKeyRepeat()\n  test:assertEquals(true, enabled, 'check key repeat set')\nend\n\n\n-- love.keyboard.isModifierActive\nlove.test.keyboard.isModifierActive = function(test)\n  local active1 = love.keyboard.isModifierActive('numlock')\n  local active2 = love.keyboard.isModifierActive('capslock')\n  local active3 = love.keyboard.isModifierActive('scrolllock')\n  local active4 = love.keyboard.isModifierActive('mode')\n  test:assertNotNil(active1)\n  test:assertNotNil(active2)\n  test:assertNotNil(active3)\n  test:assertNotNil(active4)\nend\n\n\n-- love.keyboard.setTextInput\nlove.test.keyboard.setTextInput = function(test)\n  love.keyboard.setTextInput(false)\n  test:assertEquals(false, love.keyboard.hasTextInput(), 'check disable text input')\nend\n"
  },
  {
    "path": "testing/tests/love.lua",
    "content": "-- love\n-- tests for the main love hooks + methods, mainly just that they exist\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n------------------------------------METHODS-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.getVersion\nlove.test.love.getVersion = function(test)\n  local major, minor, revision, codename = love.getVersion()\n  test:assertGreaterEqual(0, major, 'check major is number')\n  test:assertGreaterEqual(0, minor, 'check minor is number')\n  test:assertGreaterEqual(0, revision, 'check revision is number')\n  test:assertTrue(codename ~= nil, 'check has codename')\nend\n\n\n-- love.hasDeprecationOutput\nlove.test.love.hasDeprecationOutput = function(test)\n  local enabled = love.hasDeprecationOutput()\n  test:assertEquals(true, enabled, 'check enabled by default')\nend\n\n\n-- love.isVersionCompatible\nlove.test.love.isVersionCompatible = function(test)\n  local major, minor, revision, _ = love.getVersion()\n  test:assertTrue(love.isVersionCompatible(major, minor, revision), 'check own version')\nend\n\n\n-- love.setDeprecationOutput\nlove.test.love.setDeprecationOutput = function(test)\n  local enabled = love.hasDeprecationOutput()\n  test:assertEquals(true, enabled, 'check enabled by default')\n  love.setDeprecationOutput(false)\n  test:assertEquals(false, love.hasDeprecationOutput(), 'check disable')\n  love.setDeprecationOutput(true)\nend\n\n\n-- love.errhand\nlove.test.love.errhand = function(test)\n  test:assertTrue(type(love.errhand) == 'function', 'check defined')\nend\n\n\n-- love.run\nlove.test.love.run = function(test)\n  test:assertTrue(type(love.run) == 'function', 'check defined')\nend\n"
  },
  {
    "path": "testing/tests/math.lua",
    "content": "-- love.math\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n------------------------------------OBJECTS-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- BezierCurve (love.math.newBezierCurve)\nlove.test.math.BezierCurve = function(test)\n\n  -- create obj\n  local curve = love.math.newBezierCurve(1, 1, 2, 2, 3, 1)\n  local px, py = curve:getControlPoint(2)\n  test:assertObject(curve)\n\n  -- check initial properties\n  test:assertCoords({2, 2}, {px, py}, 'check point x/y')\n  test:assertEquals(3, curve:getControlPointCount(), 'check 3 points')\n  test:assertEquals(2, curve:getDegree(), 'check degree is points-1')\n\n  -- check some values on the curve\n  test:assertEquals(1, curve:evaluate(0), 'check curve evaluation 0')\n  test:assertRange(curve:evaluate(0.1), 1.2, 1.3, 'check curve evaluation 0.1')\n  test:assertRange(curve:evaluate(0.2), 1.4, 1.5, 'check curve evaluation 0.2')\n  test:assertRange(curve:evaluate(0.5), 2, 2.1, 'check curve evaluation 0.5')\n  test:assertEquals(3, curve:evaluate(1), 'check curve evaluation 1')\n\n  -- check derivative\n  local deriv = curve:getDerivative()\n  test:assertObject(deriv)\n  test:assertEquals(2, deriv:getControlPointCount(), 'check deriv points')\n  test:assertRange(deriv:evaluate(0.1), 2, 2.1, 'check deriv evaluation 0.1')\n\n  -- check segment\n  local segment = curve:getSegment(0, 0.5)\n  test:assertObject(segment)\n  test:assertEquals(3, segment:getControlPointCount(), 'check segment points')\n  test:assertRange(segment:evaluate(0.1), 1, 1.1, 'check segment evaluation 0.1')\n\n  -- mess with control points\n  curve:removeControlPoint(2)\n  curve:insertControlPoint(4, 1, -1)\n  curve:insertControlPoint(5, 3, -1)\n  curve:insertControlPoint(6, 2, -1)\n  curve:setControlPoint(2, 3, 2)\n  test:assertEquals(5, curve:getControlPointCount(), 'check 3 points still')\n  local px1, py1 = curve:getControlPoint(1)\n  local px2, py2 = curve:getControlPoint(3)\n  local px3, py3 = curve:getControlPoint(5)\n  test:assertCoords({1, 1}, {px1, py1}, 'check modified point 1')\n  test:assertCoords({5, 3}, {px2, py2}, 'check modified point 1')\n  test:assertCoords({3, 1}, {px3, py3}, 'check modified point 1')\n\n  -- check render lists\n  local coords1 = curve:render(5)\n  local coords2 = curve:renderSegment(0, 0.1, 5)\n  test:assertEquals(196, #coords1, 'check coords')\n  test:assertEquals(20, #coords2, 'check segment coords')\n\n  -- check translation values\n  px, py = curve:getControlPoint(2)\n  test:assertCoords({3, 2}, {px, py}, 'check pretransform x/y')\n  curve:rotate(90 * (math.pi/180), 0, 0)\n  px, py = curve:getControlPoint(2)\n  test:assertCoords({-2, 3}, {px, py}, 'check rotated x/y')\n  curve:scale(2, 0, 0)\n  px, py = curve:getControlPoint(2)\n  test:assertCoords({-4, 6}, {px, py}, 'check scaled x/y')\n  curve:translate(5, -5)\n  px, py = curve:getControlPoint(2)\n  test:assertCoords({1, 1}, {px, py}, 'check translated x/y')\n\nend\n\n\n-- RandomGenerator (love.math.RandomGenerator)\n-- @NOTE as this checks random numbers the chances this fails is very unlikely, but not 0...\n-- if you've managed to proc it congrats! your prize is to rerun the testsuite again\nlove.test.math.RandomGenerator = function(test)\n\n  -- create object\n  local rng1 = love.math.newRandomGenerator(3418323524, 20529293)\n  test:assertObject(rng1)\n\n  -- check set properties\n  local low, high = rng1:getSeed()\n  test:assertEquals(3418323524, low, 'check seed low')\n  test:assertEquals(20529293, high, 'check seed high')\n\n  -- check states\n  local rng2 = love.math.newRandomGenerator(1448323524, 10329293)\n  test:assertNotEquals(rng1:random(), rng2:random(), 'check not matching states')\n  test:assertNotEquals(rng1:randomNormal(), rng2:randomNormal(), 'check not matching states')\n\n  -- check setting state works\n  rng2:setState(rng1:getState())\n  test:assertEquals(rng1:random(), rng2:random(), 'check now matching')\n\n  -- check overwriting seed works, should change output\n  rng1:setSeed(os.time())\n  test:assertNotEquals(rng1:random(), rng2:random(), 'check not matching states')\n  test:assertNotEquals(rng1:randomNormal(), rng2:randomNormal(), 'check not matching states')\n\nend\n\n\n-- Transform (love.math.Transform)\nlove.test.math.Transform = function(test)\n\n  -- create obj\n  local transform = love.math.newTransform(0, 0, 0, 1, 1, 0, 0, 0, 0)\n  test:assertObject(transform)\n\n  -- set some values and check the matrix and transformPoint values\n  transform:translate(10, 8)\n  transform:scale(2, 3)\n  transform:rotate(90*(math.pi/180))\n  transform:shear(1, 2)\n  local px, py = transform:transformPoint(1, 1)\n  test:assertCoords({4, 14}, {px, py}, 'check transformation methods')\n  transform:reset()\n  px, py = transform:transformPoint(1, 1)\n  test:assertCoords({1, 1}, {px, py}, 'check reset')\n\n  -- apply a transform to another transform\n  local transform2 = love.math.newTransform()\n  transform2:translate(5, 3)\n  transform:apply(transform2)\n  px, py = transform:transformPoint(1, 1)\n  test:assertCoords({6, 4}, {px, py}, 'check apply other transform')\n\n  -- check cloning a transform\n  local transform3 = transform:clone()\n  px, py = transform3:transformPoint(1, 1)\n  test:assertCoords({6, 4}, {px, py}, 'check clone transform')\n\n  -- check inverse and inverseTransform\n  transform:reset()\n  transform:translate(-14, 6)\n  local ipx, ipy = transform:inverseTransformPoint(0, 0)\n  transform:inverse()\n  px, py = transform:transformPoint(0, 0)\n  test:assertCoords({-px, -py}, {ipx, ipy}, 'check inverse points transform')\n\n  -- check matrix manipulation\n  transform:setTransformation(0, 0, 0, 1, 1, 0, 0, 0, 0)\n  transform:translate(4, 4)\n  local m1, m2, m3, m4, m5, m6, m7, m8, \n    m9, m10, m11, m12, m13, m14, m15, m16 = transform:getMatrix()\n  test:assertEquals(4, m4, 'check translate matrix x')\n  test:assertEquals(4, m8, 'check translate matrix y')\n  transform:setMatrix(m1, m2, m3, 3, m5, m6, m7, 1, m9, m10, m11, m12, m13, m14, m15, m16)\n  px, py = transform:transformPoint(1, 1)\n  test:assertCoords({4, 2}, {px, py}, 'check set matrix')\n\n  -- check affine vs non affine\n  transform:reset()\n  test:assertTrue(transform:isAffine2DTransform(), 'check affine 1')\n  transform:translate(4, 3)\n  test:assertTrue(transform:isAffine2DTransform(), 'check affine 2')\n  transform:setMatrix(1, 3, 4, 5.5, 1, 4.5, 2, 1, 3.4, 5.1, 4.1, 13, 1, 1, 2, 3)\n  test:assertFalse(transform:isAffine2DTransform(), 'check not affine')\n\nend\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n------------------------------------METHODS-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.math.colorFromBytes\nlove.test.math.colorFromBytes = function(test)\n  -- check random value\n  local r1, g1, b1, a1 = love.math.colorFromBytes(51, 51, 51, 51)\n  test:assertEquals(r1, 0.2, 'check r from bytes')\n  test:assertEquals(g1, 0.2, 'check g from bytes')\n  test:assertEquals(b1, 0.2, 'check b from bytes')\n  test:assertEquals(a1, 0.2, 'check a from bytes')\n  -- check \"max\" value\n  local r2, g2, b2, a2 = love.math.colorFromBytes(255, 255, 255, 255)\n  test:assertEquals(r2, 1, 'check r from bytes')\n  test:assertEquals(g2, 1, 'check g from bytes')\n  test:assertEquals(b2, 1, 'check b from bytes')\n  test:assertEquals(a2, 1, 'check a from bytes')\n  -- check \"min\" value\n  local r3, g3, b3, a3 = love.math.colorFromBytes(0, 0, 0, 0)\n  test:assertEquals(r3, 0, 'check r from bytes')\n  test:assertEquals(g3, 0, 'check g from bytes')\n  test:assertEquals(b3, 0, 'check b from bytes')\n  test:assertEquals(a3, 0, 'check a from bytes')\nend\n\n\n-- love.math.colorToBytes\nlove.test.math.colorToBytes = function(test)\n  -- check random value\n  local r1, g1, b1, a1 = love.math.colorToBytes(0.2, 0.2, 0.2, 0.2)\n  test:assertEquals(r1, 51, 'check bytes from r')\n  test:assertEquals(g1, 51, 'check bytes from g')\n  test:assertEquals(b1, 51, 'check bytes from b')\n  test:assertEquals(a1, 51, 'check bytes from a')\n  -- check \"max\" value\n  local r2, g2, b2, a2 = love.math.colorToBytes(1, 1, 1, 1)\n  test:assertEquals(r2, 255, 'check bytes from r')\n  test:assertEquals(g2, 255, 'check bytes from g')\n  test:assertEquals(b2, 255, 'check bytes from b')\n  test:assertEquals(a2, 255, 'check bytes from a')\n  -- check \"min\" value\n  local r3, g3, b3, a3 = love.math.colorToBytes(0, 0, 0, 0)\n  test:assertEquals(r3, 0, 'check bytes from r')\n  test:assertEquals(g3, 0, 'check bytes from g')\n  test:assertEquals(b3, 0, 'check bytes from b')\n  test:assertEquals(a3, 0, 'check bytes from a')\nend\n\n\n-- love.math.gammaToLinear\n-- @NOTE I tried doing the same formula as the source from MathModule.cpp\n-- but get test failues due to slight differences\nlove.test.math.gammaToLinear = function(test)\n  local lr, lg, lb = love.math.gammaToLinear(1, 0.8, 0.02)\n  --local eg = ((0.8 + 0.055) / 1.055)^2.4\n  --local eb = 0.02 / 12.92\n  test:assertGreaterEqual(0, lr, 'check gamma r to linear')\n  test:assertGreaterEqual(0, lg, 'check gamma g to linear')\n  test:assertGreaterEqual(0, lb, 'check gamma b to linear')\nend\n\n\n-- love.math.getRandomSeed\n-- @NOTE whenever i run this high is always 0, is that intended?\nlove.test.math.getRandomSeed = function(test)\n  local low, high = love.math.getRandomSeed()\n  test:assertGreaterEqual(0, low, 'check random seed low')\n  test:assertGreaterEqual(0, high, 'check random seed high')\nend\n\n\n-- love.math.getRandomState\nlove.test.math.getRandomState = function(test)\n  test:assertNotNil(love.math.getRandomState())\nend\n\n\n-- love.math.isConvex\nlove.test.math.isConvex = function(test)\n  local isconvex = love.math.isConvex({0, 0, 1, 0, 1, 1, 1, 0, 0, 0}) -- square\n  local notconvex = love.math.isConvex({1, 2, 2, 4, 3, 4, 2, 1, 3, 1}) -- weird shape\n  test:assertTrue(isconvex, 'check polygon convex')\n  test:assertFalse(notconvex, 'check polygon not convex')\nend\n\n\n-- love.math.linearToGammer\n-- @NOTE I tried doing the same formula as the source from MathModule.cpp\n-- but get test failues due to slight differences\nlove.test.math.linearToGamma = function(test)\n  local gr, gg, gb = love.math.linearToGamma(1, 0.8, 0.001)\n  --local eg = 1.055 * (0.8^1/2.4) - 0.055\n  --local eb = 0.001 * 12.92\n  test:assertGreaterEqual(0, gr, 'check linear r to gamme')\n  test:assertGreaterEqual(0, gg, 'check linear g to gamme')\n  test:assertGreaterEqual(0, gb, 'check linear b to gamme')\nend\n\n\n-- love.math.newBezierCurve\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.math.newBezierCurve = function(test)\n  test:assertObject(love.math.newBezierCurve({0, 0, 0, 1, 1, 1, 2, 1}))\nend\n\n\n-- love.math.newRandomGenerator\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.math.newRandomGenerator = function(test)\n  test:assertObject(love.math.newRandomGenerator())\nend\n\n\n-- love.math.newTransform\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.math.newTransform = function(test)\n  test:assertObject(love.math.newTransform())\nend\n\n\n-- love.math.perlinNoise\nlove.test.math.perlinNoise = function(test)\n  -- check some noise values\n  -- output should be consistent if given the same input\n  local noise1 = love.math.perlinNoise(100)\n  local noise2 = love.math.perlinNoise(1, 10)\n  local noise3 = love.math.perlinNoise(1043, 31.123, 999)\n  local noise4 = love.math.perlinNoise(99.222, 10067, 8, 1843)\n  test:assertRange(noise1, 0.5, 0.51, 'check noise 1 dimension')\n  test:assertRange(noise2, 0.5, 0.51, 'check noise 2 dimensions')\n  test:assertRange(noise3, 0.56, 0.57, 'check noise 3 dimensions')\n  test:assertRange(noise4, 0.52, 0.53, 'check noise 4 dimensions')\nend\n\n\n-- love.math.simplexNoise\nlove.test.math.simplexNoise = function(test)\n  -- check some noise values\n  -- output should be consistent if given the same input\n  local noise1 = love.math.simplexNoise(100)\n  local noise2 = love.math.simplexNoise(1, 10)\n  local noise3 = love.math.simplexNoise(1043, 31.123, 999)\n  local noise4 = love.math.simplexNoise(99.222, 10067, 8, 1843)\n  -- rounded to avoid floating point issues \n  test:assertRange(noise1, 0.5, 0.51, 'check noise 1 dimension')\n  test:assertRange(noise2, 0.47, 0.48, 'check noise 2 dimensions')\n  test:assertRange(noise3, 0.26, 0.27, 'check noise 3 dimensions')\n  test:assertRange(noise4, 0.53, 0.54, 'check noise 4 dimensions')\nend\n\n\n-- love.math.random\nlove.test.math.random = function(test)\n  -- check some random ranges\n  love.math.setRandomSeed(123)\n  test:assertRange(love.math.random(), 0.37068322251462, 0.37068322251464, \"check random algorithm\")\n  test:assertEquals(love.math.random(10), 4, \"check single random param\")\n  test:assertEquals(love.math.random(15, 100), 92, \"check two random params\")\nend\n\n\n-- love.math.randomNormal\nlove.test.math.randomNormal = function(test)\n  love.math.setRandomSeed(1234)\n  test:assertRange(love.math.randomNormal(1, 2), 1.0813614997253, 1.0813614997255, 'check randomNormal two params')\nend\n\n\n-- love.math.setRandomSeed\n-- @NOTE same with getRandomSeed, high is always 0 when I tested it?\nlove.test.math.setRandomSeed = function(test)\n  love.math.setRandomSeed(9001)\n  local low, high = love.math.getRandomSeed()\n  test:assertEquals(9001, low, 'check seed low set')\n  test:assertEquals(0, high, 'check seed high set')\nend\n\n\n-- love.math.setRandomState\nlove.test.math.setRandomState = function(test)\n  -- check setting state matches value returned\n  local rs1 = love.math.getRandomState()\n  love.math.setRandomState(rs1)\n  local rs2 = love.math.getRandomState()\n  test:assertEquals(rs1, rs2, 'check random state set')\nend\n\n\n-- love.math.triangulate\nlove.test.math.triangulate = function(test)\n  local triangles1 = love.math.triangulate({0, 0, 1, 0, 1, 1, 1, 0, 0, 0}) -- square\n  local triangles2 = love.math.triangulate({1, 2, 2, 4, 3, 4, 2, 1, 3, 1}) -- weird shape\n  test:assertEquals(3, #triangles1, 'check polygon triangles')\n  test:assertEquals(3, #triangles2, 'check polygon triangles')\nend\n"
  },
  {
    "path": "testing/tests/mouse.lua",
    "content": "-- love.mouse\n-- @NOTE we can't test this module fully as it's hardware dependent\n-- however we can test methods do what is expected and can handle certain params\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n------------------------------------METHODS-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.mouse.getCursor\nlove.test.mouse.getCursor = function(test)\n  local cursor = love.mouse.getCursor()\n  test:assertEquals(nil, cursor, 'check nil initially')\n  -- try setting a cursor to check return if supported\n  if love.mouse.isCursorSupported() then\n    love.mouse.setCursor(love.mouse.getSystemCursor(\"hand\"))\n    local newcursor = love.mouse.getCursor()\n    test:assertObject(newcursor)\n    love.mouse.setCursor()\n  end\nend\n\n\n-- love.mouse.getPosition\nlove.test.mouse.getPosition = function(test)\n  love.mouse.setPosition(0, 0) -- cant predict\n  local x, y = love.mouse.getPosition()\n  test:assertEquals(0, x, 'check x pos')\n  test:assertEquals(0, y, 'check y pos')\nend\n\n\n-- love.mouse.getRelativeMode\nlove.test.mouse.getRelativeMode = function(test)\n  local enabled = love.mouse.getRelativeMode()\n  test:assertEquals(false, enabled, 'check relative mode')\n  love.mouse.setRelativeMode(true)\n  test:assertEquals(true, love.mouse.getRelativeMode(), 'check enabling')\nend\n\n\n-- love.mouse.getSystemCursor\nlove.test.mouse.getSystemCursor = function(test)\n  local hand = love.mouse.getSystemCursor('hand')\n  test:assertObject(hand)\n  local ok, err = pcall(love.mouse.getSystemCursor, 'love')\n  test:assertEquals(false, ok, 'check invalid cursor')\nend\n\n\n-- love.mouse.getX\nlove.test.mouse.getX = function(test)\n  love.mouse.setPosition(0, 0) -- cant predict\n  local x = love.mouse.getX()\n  test:assertEquals(0, x, 'check x pos')\n  love.mouse.setX(10)\n  test:assertEquals(10, love.mouse.getX(), 'check set x')\nend\n\n\n-- love.mouse.getY\nlove.test.mouse.getY = function(test)\n  love.mouse.setPosition(0, 0) -- cant predict\n  local y = love.mouse.getY()\n  test:assertEquals(0, y, 'check x pos')\n  love.mouse.setY(10)\n  test:assertEquals(10, love.mouse.getY(), 'check set y')\nend\n\n\n-- love.mouse.isCursorSupported\nlove.test.mouse.isCursorSupported = function(test)\n  test:assertNotNil(love.mouse.isCursorSupported())\nend\n\n\n-- love.mouse.isDown\nlove.test.mouse.isDown = function(test)\n  test:assertNotNil(love.mouse.isDown())\nend\n\n\n-- love.mouse.isGrabbed\nlove.test.mouse.isGrabbed = function(test)\n  test:assertNotNil(love.mouse.isGrabbed())\nend\n\n\n-- love.mouse.isVisible\nlove.test.mouse.isVisible = function(test)\n  local visible = love.mouse.isVisible()\n  test:assertEquals(true, visible, 'check visible default')\n  love.mouse.setVisible(false)\n  test:assertEquals(false, love.mouse.isVisible(), 'check invisible')\n  love.mouse.setVisible(true)\nend\n\n\n-- love.mouse.newCursor\nlove.test.mouse.newCursor = function(test)\n  -- new cursor might fail if not supported\n  if love.mouse.isCursorSupported() then\n    local cursor = love.mouse.newCursor('resources/love.png', 0, 0)\n    test:assertObject(cursor)\n  else\n    test:skipTest('cursor not supported on this system')\n  end\nend\n\n\n-- love.mouse.setCursor\nlove.test.mouse.setCursor = function(test)\n  -- cant set cursor if not supported\n  if love.mouse.isCursorSupported() then\n    love.mouse.setCursor()\n    test:assertEquals(nil, love.mouse.getCursor(), 'check reset')\n    love.mouse.setCursor(love.mouse.getSystemCursor('hand'))\n    test:assertObject(love.mouse.getCursor())\n  else\n    test:skipTest('cursor not supported on this system')\n  end\nend\n\n\n-- love.mouse.setGrabbed\n-- @NOTE can fail if you move the mouse a bunch while the test runs\nlove.test.mouse.setGrabbed = function(test)\n  test:assertEquals(false, love.mouse.isGrabbed(), 'check not grabbed')\n  love.mouse.setGrabbed(true)\n  test:assertEquals(true, love.mouse.isGrabbed(), 'check now grabbed')\n  love.mouse.setGrabbed(false)\nend\n\n\n-- love.mouse.setPosition\nlove.test.mouse.setPosition = function(test)\n  love.mouse.setPosition(10, 10)\n  local x, y = love.mouse.getPosition()\n  test:assertEquals(10, x, 'check x position')\n  test:assertEquals(10, y, 'check y position')\n  love.mouse.setPosition(15, 20)\n  local x2, y2 = love.mouse.getPosition()\n  test:assertEquals(15, x2, 'check new x position')\n  test:assertEquals(20, y2, 'check new y position')\nend\n\n\n-- love.mouse.setRelativeMode\nlove.test.mouse.setRelativeMode = function(test)\n  love.mouse.setRelativeMode(true)\n  local enabled = love.mouse.getRelativeMode()\n  test:assertEquals(true, enabled, 'check relative mode')\n  love.mouse.setRelativeMode(false)\n  test:assertEquals(false, love.mouse.getRelativeMode(), 'check disabling')\nend\n\n\n-- love.mouse.setVisible\nlove.test.mouse.setVisible = function(test)\n  local visible = love.mouse.isVisible()\n  test:assertEquals(true, visible, 'check visible default')\n  love.mouse.setVisible(false)\n  test:assertEquals(false, love.mouse.isVisible(), 'check invisible')\n  love.mouse.setVisible(true)\nend\n\n\n-- love.mouse.setX\nlove.test.mouse.setX = function(test)\n  love.mouse.setX(30)\n  local x = love.mouse.getX()\n  test:assertEquals(30, x, 'check x pos')\n  love.mouse.setX(10)\n  test:assertEquals(10, love.mouse.getX(), 'check set x')\nend\n\n\n-- love.mouse.setY\nlove.test.mouse.setY = function(test)\n  love.mouse.setY(12)\n  local y = love.mouse.getY()\n  test:assertEquals(12, y, 'check x pos')\n  love.mouse.setY(10)\n  test:assertEquals(10, love.mouse.getY(), 'check set y')\nend\n"
  },
  {
    "path": "testing/tests/physics.lua",
    "content": "-- love.physics\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n----------------------------------OBJECTS---------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- Body (love.physics.newBody)\nlove.test.physics.Body = function(test)\n\n  -- create body\n  local world = love.physics.newWorld(1, 1, true)\n  local body1 = love.physics.newBody(world, 0, 0, 'static')\n  local body2 = love.physics.newBody(world, 30, 30, 'dynamic')\n  love.physics.newRectangleShape(body1, 5, 5, 10, 10)\n  love.physics.newRectangleShape(body2, 5, 5, 10, 10)\n  test:assertObject(body1)\n\n  -- check shapes\n  test:assertEquals(1, #body1:getShapes(), 'check shapes total 1')\n  test:assertEquals(1, #body2:getShapes(), 'check shapes total 2')\n  test:assertNotEquals(nil, body1:getShape(), 'check shape 1')\n  test:assertNotEquals(nil, body2:getShape(), 'check shape 2')\n\n  -- check body active\n  test:assertTrue(body1:isActive(), 'check active by def')\n\n  -- check body bullet\n  test:assertFalse(body1:isBullet(), 'check not bullet by def')\n  body1:setBullet(true)\n  test:assertTrue(body1:isBullet(), 'check set bullet')\n\n  -- check fixed rotation\n  test:assertFalse(body1:isFixedRotation(), 'check fix rot def')\n  body1:setFixedRotation(true)\n  test:assertTrue(body1:isFixedRotation(), 'check set fix rot')\n\n  -- check sleeping/waking\n  test:assertTrue(body1:isSleepingAllowed(), 'check sleep def')\n  body1:setSleepingAllowed(false)\n  test:assertFalse(body1:isSleepingAllowed(), 'check set sleep')\n  body1:setSleepingAllowed(true)\n  world:update(1)\n  test:assertFalse(body1:isAwake(), 'check fell asleep')\n  body1:setSleepingAllowed(false)\n  body1:setType('dynamic')\n  test:assertTrue(body1:isAwake(), 'check waking up')\n\n  -- check touching\n  test:assertFalse(body1:isTouching(body2))\n  body2:setPosition(5, 5)\n  world:update(1)\n  test:assertTrue(body1:isTouching(body2))\n\n  -- check children lists\n  test:assertEquals(1, #body1:getContacts(), 'check contact list')\n  test:assertEquals(0, #body1:getJoints(), 'check joints list')\n  love.physics.newDistanceJoint(body1, body2, 5, 5, 10, 10, true)\n  test:assertEquals(1, #body1:getJoints(), 'check joints list')\n\n  -- check local points\n  local x, y = body1:getLocalCenter()\n  test:assertRange(x, 5, 6, 'check local center x')\n  test:assertRange(y, 5, 6, 'check local center y')\n  local lx, ly = body1:getLocalPoint(10, 10)\n  test:assertRange(lx, 10, 11, 'check local point x')\n  test:assertRange(ly, 9, 10, 'check local point y')\n  local lx1, ly1, lx2, ly2 = body1:getLocalPoints(0, 5, 5, 10)\n  test:assertRange(lx1, 0, 1, 'check local points x 1')\n  test:assertRange(ly1, 3, 4, 'check local points y 1')\n  test:assertRange(lx2, 5, 6, 'check local points x 2')\n  test:assertRange(ly2, 9, 10, 'check local points y 2')\n\n  -- check world points\n  local wx, wy = body1:getWorldPoint(10.4, 9)\n  test:assertRange(wx, 10, 11, 'check world point x')\n  test:assertRange(wy, 10, 11, 'check world point y')\n  local wx1, wy1, wx2, wy2 = body1:getWorldPoints(0.4, 4, 5.4, 9)\n  test:assertRange(wx1, 0, 1, 'check world points x 1')\n  test:assertRange(wy1, 5, 6, 'check world points y 1')\n  test:assertRange(wx2, 5, 6, 'check world points x 2')\n  test:assertRange(wy2, 10, 11, 'check world points y 2')\n\n  -- check angular damping + velocity\n  test:assertEquals(0, body1:getAngularDamping(), 'check angular damping')\n  test:assertEquals(0, body1:getAngularVelocity(), 'check angular velocity')\n\n  -- check world props\n  test:assertObject(body1:getWorld())\n  test:assertEquals(2, body1:getWorld():getBodyCount(), 'check world count')\n  local cx, cy = body1:getWorldCenter()\n  test:assertRange(cx, 4, 5, 'check world center x')\n  test:assertRange(cy, 6, 7, 'check world center y')\n  local vx, vy = body1:getWorldVector(5, 10)\n  test:assertEquals(5, vx, 'check vector x')\n  test:assertEquals(10, vy, 'check vector y')\n\n  -- check inertia\n  test:assertRange(body1:getInertia(), 5, 6, 'check inertia')\n\n  -- check angle\n  test:assertEquals(0, body1:getAngle(), 'check def angle')\n  body1:setAngle(90 * (math.pi/180))\n  test:assertEquals(math.floor(math.pi/2*100), math.floor(body1:getAngle()*100), 'check set angle')\n\n  -- check gravity scale\n  test:assertEquals(1, body1:getGravityScale(), 'check def grav')\n  body1:setGravityScale(2)\n  test:assertEquals(2, body1:getGravityScale(), 'check change grav')\n\n  -- check damping\n  test:assertEquals(0, body1:getLinearDamping(), 'check def lin damping')\n  body1:setLinearDamping(0.1)\n  test:assertRange(body1:getLinearDamping(), 0, 0.2, 'check change lin damping')\n\n  -- check velocity\n  local x2, y2 = body1:getLinearVelocity()\n  test:assertEquals(1, x2, 'check def lin velocity x')\n  test:assertEquals(1, y2, 'check def lin velocity y')\n  body1:setLinearVelocity(4, 5)\n  local x3, y3 = body1:getLinearVelocity()\n  test:assertEquals(4, x3, 'check change lin velocity x')\n  test:assertEquals(5, y3, 'check change lin velocity y')\n\n  -- check mass \n  test:assertRange(body1:getMass(), 0.1, 0.2, 'check def mass')\n  body1:setMass(10)\n  test:assertEquals(10, body1:getMass(), 'check change mass')\n  body1:setMassData(3, 5, 10, 1)\n  local x4, y4, mass4, inertia4 = body1:getMassData()\n  test:assertEquals(3, x4, 'check mass data change x')\n  test:assertEquals(5, y4, 'check mass data change y')\n  test:assertEquals(10, mass4, 'check mass data change mass')\n  test:assertRange(inertia4, 340, 341, 'check mass data change inertia')\n  body1:resetMassData()\n  local x5, y5, mass5, inertia5 = body1:getMassData()\n  test:assertRange(x5, 5, 6, 'check mass data reset x')\n  test:assertRange(y5, 5, 6, 'check mass data reset y')\n  test:assertRange(mass5, 0.1, 0.2, 'check mass data reset mass')\n  test:assertRange(inertia5, 5, 6, 'check mass data reset inertia')\n  test:assertFalse(body1:hasCustomMassData())\n\n  -- check position\n  local x6, y6 = body1:getPosition()\n  test:assertRange(x6, -1, 0, 'check position x')\n  test:assertRange(y6, 0, 1, 'check position y')\n  body1:setPosition(10, 4)\n  local x7, y7 = body1:getPosition()\n  test:assertEquals(x7, 10, 'check set position x')\n  test:assertEquals(y7, 4, 'check set position y')\n\n  -- check type\n  test:assertEquals('dynamic', body1:getType(), 'check type match')\n  body1:setType('kinematic')\n  body1:setType('static')\n  test:assertEquals('static', body1:getType(), 'check type change')\n\n  -- check userdata\n  test:assertEquals(nil, body1:getUserData(), 'check user data')\n  body1:setUserData({ love = 'cool' })\n  test:assertEquals('cool', body1:getUserData().love, 'check set user data')\n\n  -- check x/y direct\n  test:assertEquals(10, math.floor(body1:getX()), 'check get x')\n  test:assertEquals(4, math.floor(body1:getY()), 'check get y')\n  body1:setX(0)\n  body1:setY(0)\n  test:assertEquals(0, body1:getX(), 'check get x')\n  test:assertEquals(0, body1:getY(), 'check get y')\n\n  -- apply angular impulse\n  local vel = body2:getAngularVelocity()\n  test:assertRange(vel, 0, 0, 'check velocity before')\n  body2:applyAngularImpulse(10)\n  local vel1 = body2:getAngularVelocity()\n  test:assertRange(vel1, 5, 6, 'check velocity after 1')\n\n  -- apply standard force\n  local ang1 = body2:getAngle()\n  test:assertRange(ang1, 0.1, 0.2, 'check initial angle 1')\n  body2:applyForce(2, 3)\n  world:update(2)\n  local vel2 = body2:getAngularVelocity()\n  local ang2 = body2:getAngle()\n  test:assertRange(ang2, -0.1, 0, 'check angle after 2')\n  test:assertRange(vel2, 1, 2, 'check velocity after 2')\n\n  -- apply linear impulse\n  body2:applyLinearImpulse(-4, -59)\n  world:update(1)\n  local ang3 = body2:getAngle()\n  local vel3 = body2:getAngularVelocity()\n  test:assertRange(ang3, -2, -1, 'check angle after 3')\n  test:assertRange(vel3, 0, 1, 'check velocity after 3')\n\n  -- apply torque\n  body2:applyTorque(4)\n  world:update(2)\n  local ang4 = body2:getAngle()\n  local vel4 = body2:getAngularVelocity()\n  test:assertRange(ang4, -1, 0, 'check angle after 4')\n  test:assertRange(vel4, 0, 1, 'check velocity after 4')\n\n  -- check destroy\n  test:assertFalse(body1:isDestroyed(), 'check not destroyed')\n  body1:destroy()\n  test:assertTrue(body1:isDestroyed(), 'check destroyed')\n\nend\n\n\n-- Contact (love.physics.World:getContacts)\nlove.test.physics.Contact = function(test)\n\n  -- create a setup so we can access some contact objects\n  local world = love.physics.newWorld(1, 1, true)\n  local body1 = love.physics.newBody(world, 0, 0, 'dynamic')\n  local body2 = love.physics.newBody(world, 10, 10, 'dynamic')\n  local rectangle1 = love.physics.newRectangleShape(body1, 0, 0, 10, 10)\n  local rectangle2 = love.physics.newRectangleShape(body2, 0, 0, 10, 10)\n  rectangle1:setUserData('rec1')\n  rectangle2:setUserData('rec2')\n\n  -- used to check for collisions + no. of collisions\n  local collided = false\n  local pass = 1\n\n  -- set callback for contact start \n  world:setCallbacks(\n    function(shape_a, shape_b, contact)\n      collided = true\n\n      -- check contact object\n      test:assertObject(contact)\n\n      -- check child indices\n      local indexA, indexB = contact:getChildren()\n      test:assertEquals(1, indexA, 'check child indice a')\n      test:assertEquals(1, indexB, 'check child indice b')\n\n      -- check shapes match using userdata\n      local shapeA, shapeB = contact:getShapes()\n      test:assertEquals(shape_a:getUserData(), shapeA:getUserData(), 'check shape a matches')\n      test:assertEquals(shape_b:getUserData(), shapeB:getUserData(), 'check shape b matches')\n\n      -- check normal pos\n      local nx, ny = contact:getNormal()\n      test:assertEquals(1, nx, 'check normal x')\n      test:assertEquals(0, ny, 'check normal y')\n\n      -- check actual pos\n      local px1, py1, px2, py2 = contact:getPositions()\n      test:assertRange(px1, 5, 6, 'check collide x 1')\n      test:assertRange(py1, 5, 6, 'check collide y 1')\n      test:assertRange(px2, 5, 6, 'check collide x 2')\n      test:assertRange(py2, 5, 6, 'check collide y 2')\n\n      -- check touching\n      test:assertTrue(contact:isTouching(), 'check touching')\n\n      -- check enabled (we pass through twice to test on/off)\n      test:assertEquals(pass == 1, contact:isEnabled(), 'check enabled for pass ' .. tostring(pass))\n\n      -- check friction\n      test:assertRange(contact:getFriction(), 0.2, 0.3, 'check def friction')\n      contact:setFriction(0.1)\n      test:assertRange(contact:getFriction(), 0.1, 0.2, 'check set friction')\n      contact:resetFriction()\n      test:assertRange(contact:getFriction(), 0.2, 0.3, 'check reset friction')\n\n      -- check restitution\n      test:assertEquals(0, contact:getRestitution(), 'check def restitution')\n      contact:setRestitution(1)\n      test:assertEquals(1, contact:getRestitution(), 'check set restitution')\n      contact:resetRestitution()\n      test:assertEquals(0, contact:getRestitution(), 'check reset restitution')\n      pass = pass + 1\n\n    end, function() end, function(shape_a, shape_b, contact) \n      if pass > 2 then\n        contact:setEnabled(false)\n      end\n    end, function() end\n  )\n\n  -- check bodies collided\n  world:update(1)\n  test:assertTrue(collided, 'check bodies collided')\n\n  -- update again for enabled check\n  world:update(1)\n  test:assertEquals(2, pass, 'check ran twice')\n\nend\n\n\n-- Joint (love.physics.newDistanceJoint)\nlove.test.physics.Joint = function(test)\n\n  -- make joint\n  local world = love.physics.newWorld(1, 1, true)\n  local body1 = love.physics.newBody(world, 10, 10, 'dynamic')\n  local body2 = love.physics.newBody(world, 20, 20, 'dynamic')\n  local joint = love.physics.newDistanceJoint(body1, body2, 10, 10, 20, 20, true)\n  test:assertObject(joint)\n\n  -- check type\n  test:assertEquals('distance', joint:getType(), 'check joint type')\n\n  -- check not destroyed\n  test:assertFalse(joint:isDestroyed(), 'check not destroyed')\n\n\n  -- check reaction props\n  world:update(1)\n  local rx1, ry1 = joint:getReactionForce(1)\n  test:assertEquals(0, rx1, 'check reaction force x')\n  test:assertEquals(0, ry1, 'check reaction force y')\n  local rx2, ry2 = joint:getReactionTorque(1)\n  test:assertEquals(0, rx2, 'check reaction torque x')\n  test:assertEquals(nil, ry2, 'check reaction torque y')\n\n  -- check body pointer\n  local b1, b2 = joint:getBodies()\n  test:assertEquals(body1:getX(), b1:getX(), 'check body 1')\n  test:assertEquals(body2:getX(), b2:getX(), 'check body 2')\n\n  -- check joint anchors\n  local x1, y1, x2, y2 = joint:getAnchors()\n  test:assertRange(x1, 10, 11, 'check anchor x1')\n  test:assertRange(y1, 10, 11, 'check anchor y1')\n  test:assertRange(x2, 20, 21, 'check anchor x2')\n  test:assertRange(y2, 20, 21, 'check anchor y2')\n  test:assertTrue(joint:getCollideConnected(), 'check not colliding')\n\n  -- test userdata\n  test:assertEquals(nil, joint:getUserData(), 'check no data by def')\n  joint:setUserData('hello')\n  test:assertEquals('hello', joint:getUserData(), 'check set userdata')\n\n  -- destroy\n  joint:destroy()\n  test:assertTrue(joint:isDestroyed(), 'check destroyed')\n\nend\n\n\n-- Shape (love.physics.newCircleShape)\n-- @NOTE in 12.0 fixtures have been merged into shapes\nlove.test.physics.Shape = function(test)\n\n  -- create shape\n  local world = love.physics.newWorld(0, 0, false)\n  local body1 = love.physics.newBody(world, 0, 0, 'dynamic')\n  local shape1 = love.physics.newRectangleShape(body1, 5, 5, 10, 10)\n  test:assertObject(shape1)\n\n  -- check child count\n  test:assertEquals(1, shape1:getChildCount(), 'check child count')\n\n  -- check radius\n  test:assertRange(shape1:getRadius(), 0, 0.4, 'check radius')\n\n  -- check type match\n  test:assertEquals('polygon', shape1:getType(), 'check rectangle type')\n\n  -- check body pointer\n  test:assertEquals(0, shape1:getBody():getX(), 'check body link')\n\n  -- check category \n  test:assertEquals(1, shape1:getCategory(), 'check def category')\n  shape1:setCategory(3, 5, 6)\n  local categories = {shape1:getCategory()}\n  test:assertEquals(14, categories[1] + categories[2] + categories[3], 'check set category')\n\n  -- check sensor prop\n  test:assertFalse(shape1:isSensor(), 'check sensor def')\n  shape1:setSensor(true)\n  test:assertTrue(shape1:isSensor(), 'check set sensor')\n  shape1:setSensor(false)\n\n  -- check not destroyed\n  test:assertFalse(shape1:isDestroyed(), 'check not destroyed')\n\n  -- check user data\n  test:assertEquals(nil, shape1:getUserData(), 'check no user data')\n  shape1:setUserData({ test = 14 })\n  test:assertEquals(14, shape1:getUserData().test, 'check user data set')\n\n  -- check bounding box\n  -- polygons have an additional skin radius to help with collisions\n  -- so this wont be 0, 0, 10, 10 as you'd think but has an additional 0.3 padding\n  local topLeftX, topLeftY, bottomRightX, bottomRightY = shape1:computeAABB(0, 0, 0, 1)\n  local tlx, tly, brx, bry = shape1:getBoundingBox(1)\n  test:assertEquals(topLeftX, tlx, 'check bbox methods match tlx')\n  test:assertEquals(topLeftY, tly, 'check bbox methods match tly')\n  test:assertEquals(bottomRightX, brx, 'check bbox methods match brx')\n  test:assertEquals(bottomRightY, bry, 'check bbox methods match bry')\n  test:assertEquals(topLeftX, topLeftY, 'check bbox tl 1')\n  test:assertRange(topLeftY, -0.3, -0.2, 'check bbox tl 2')\n  test:assertEquals(bottomRightX, bottomRightY, 'check bbox br 1')\n  test:assertRange(bottomRightX, 10.3, 10.4, 'check bbox br 2')\n\n  -- check density\n  test:assertEquals(1, shape1:getDensity(), 'check def density')\n  shape1:setDensity(5)\n  test:assertEquals(5, shape1:getDensity(), 'check set density')\n\n  -- check mass\n  local x1, y1, mass1, inertia1 = shape1:getMassData()\n  test:assertRange(x1, 5, 5.1, 'check shape mass pos x')\n  test:assertRange(y1, 5, 5.1, 'check shape mass pos y')\n  test:assertRange(mass1, 0.5, 0.6, 'check mass at 1 density')\n  test:assertRange(inertia1, 0, 0.1, 'check intertia at 1 density')\n  local x2, y2, mass2, inertia2 = shape1:computeMass(1000)\n  test:assertRange(mass2, 111, 112, 'check mass at 1000 density')\n  test:assertRange(inertia2, 7407, 7408, 'check intertia at 1000 density')\n\n  -- check friction\n  test:assertRange(shape1:getFriction(), 0.2, 0.3, 'check def friction')\n  shape1:setFriction(1)\n  test:assertEquals(1, shape1:getFriction(), 'check set friction')\n\n  -- check restitution\n  test:assertEquals(0, shape1:getRestitution(), 'check def restitution')\n  shape1:setRestitution(0.5)\n  test:assertRange(shape1:getRestitution(), 0.5, 0.6, 'check set restitution')\n\n  -- check points\n  local bodyp = love.physics.newBody(world, 0, 0, 'dynamic')\n  local shape2 = love.physics.newRectangleShape(bodyp, 5, 5, 10, 10)\n  test:assertTrue(shape2:testPoint(5, 5), 'check point 5,5')\n  test:assertTrue(shape2:testPoint(10, 10, 0, 15, 15), 'check point 15,15 after translate 10,10')\n  test:assertFalse(shape2:testPoint(5, 5, 90, 10, 10), 'check point 10,10 after translate 5,5,90')\n  test:assertFalse(shape2:testPoint(10, 10, 90, 5, 5), 'check point 5,5 after translate 10,10,90')\n  test:assertFalse(shape2:testPoint(15, 15), 'check point 15,15')\n\n  -- check ray cast\n  local xn1, yn1, fraction1 = shape2:rayCast(-20, -20, 20, 20, 100, 0, 0, 0, 1)\n  test:assertNotEquals(nil, xn1, 'check ray 1 x')\n  test:assertNotEquals(nil, xn1, 'check ray 1 y')\n  local xn2, yn2, fraction2 = shape2:rayCast(10, 10, -150, -150, 100, 0, 0, 0, 1)\n  test:assertEquals(nil, xn2, 'check ray 2 x')\n  test:assertEquals(nil, yn2, 'check ray 2 y')\n\n  -- check filtering\n  test:assertEquals(nil, shape2:getMask(), 'check no mask')\n  shape2:setMask(1, 2, 3)\n  test:assertEquals(3, #{shape2:getMask()}, 'check set mask')\n  test:assertEquals(0, shape2:getGroupIndex(), 'check no index')\n  shape2:setGroupIndex(-1)\n  test:assertEquals(-1, shape2:getGroupIndex(), 'check set index')\n  local cat, mask, group = shape2:getFilterData()\n  test:assertEquals(1, cat, 'check filter cat')\n  test:assertEquals(65528, mask, 'check filter mask')\n  test:assertEquals(-1, group, 'check filter group')\n\n  -- check destroyed\n  shape1:destroy()\n  test:assertTrue(shape1:isDestroyed(), 'check destroyed')\n  shape2:destroy()\n\n  -- run some collision checks using filters, setup new shapes \n  local body2 = love.physics.newBody(world, 5, 5, 'dynamic')\n  local shape3 = love.physics.newRectangleShape(body1, 0, 0, 10, 10)\n  local shape4 = love.physics.newRectangleShape(body2, 0, 0, 10, 10)\n  local collisions = 0\n  world:setCallbacks(\n    function() collisions = collisions + 1 end,\n    function() end,\n    function() end,\n    function() end\n  )\n\n  -- same positive group do collide\n  shape3:setGroupIndex(1)\n  shape4:setGroupIndex(1)\n  world:update(1)\n  test:assertEquals(1, collisions, 'check positive group collide')\n\n  -- check negative group dont collide\n  shape3:setGroupIndex(-1)\n  shape4:setGroupIndex(-1)\n  body2:setPosition(20, 20); world:update(1); body2:setPosition(0, 0); world:update(1)\n  test:assertEquals(1, collisions, 'check negative group collide')\n\n  -- check masks do collide\n  shape3:setGroupIndex(0)\n  shape4:setGroupIndex(0)\n  shape3:setCategory(2)\n  shape4:setMask(3)\n  body2:setPosition(20, 20); world:update(1); body2:setPosition(0, 0); world:update(1)\n  test:assertEquals(2, collisions, 'check mask collide')\n\n  -- check masks not colliding\n  shape3:setCategory(2)\n  shape4:setMask(2, 4, 6)\n  body2:setPosition(20, 20); world:update(1); body2:setPosition(0, 0); world:update(1)\n  test:assertEquals(2, collisions, 'check mask not collide')\n\nend\n\n\n-- World (love.physics.newWorld)\nlove.test.physics.World = function(test)\n\n  -- create new world\n  local world = love.physics.newWorld(0, 0, false)\n  local body1 = love.physics.newBody(world, 0, 0, 'dynamic')\n  local rectangle1 = love.physics.newRectangleShape(body1, 0, 0, 10, 10)\n  test:assertObject(world)\n\n  -- check bodies in world\n  test:assertEquals(1, #world:getBodies(), 'check 1 body')\n  test:assertEquals(0, world:getBodies()[1]:getX(), 'check body prop x')\n  test:assertEquals(0, world:getBodies()[1]:getY(), 'check body prop y')\n  world:translateOrigin(-10, -10) -- check affects bodies\n  test:assertRange(world:getBodies()[1]:getX(), 9, 11, 'check body prop change x')\n  test:assertRange(world:getBodies()[1]:getY(), 9, 11, 'check body prop change y')\n  test:assertEquals(1, world:getBodyCount(), 'check 1 body count')\n\n  -- check shapes in world\n  test:assertEquals(1, #world:getShapesInArea(0, 0, 10, 10), 'check shapes in area #1')\n  test:assertEquals(0, #world:getShapesInArea(20, 20, 30, 30), 'check shapes in area #1')\n\n  -- check world status\n  test:assertFalse(world:isLocked(), 'check not updating')\n  test:assertFalse(world:isSleepingAllowed(), 'check no sleep (till brooklyn)')\n  world:setSleepingAllowed(true)\n  test:assertTrue(world:isSleepingAllowed(), 'check can sleep')\n\n  -- check world objects\n  test:assertEquals(0, #world:getJoints(), 'check no joints')\n  test:assertEquals(0, world:getJointCount(), 'check no joints count')\n  test:assertEquals(0, world:getGravity(), 'check def gravity')\n  test:assertEquals(0, #world:getContacts(), 'check no contacts')\n  test:assertEquals(0, world:getContactCount(), 'check no contact count')\n\n  -- check callbacks are called\n  local beginContact, endContact, preSolve, postSolve = world:getCallbacks()\n  test:assertEquals(nil, beginContact, 'check no begin contact callback')\n  test:assertEquals(nil, endContact, 'check no end contact callback')\n  test:assertEquals(nil, preSolve, 'check no pre solve callback')\n  test:assertEquals(nil, postSolve, 'check no post solve callback')\n  local beginContactCheck = false\n  local endContactCheck = false\n  local preSolveCheck = false\n  local postSolveCheck = false\n  local collisions = 0\n  world:setCallbacks(\n    function() beginContactCheck = true; collisions = collisions + 1 end,\n    function() endContactCheck = true end,\n    function() preSolveCheck = true end,\n    function() postSolveCheck = true end\n  )\n\n  -- setup so we can collide stuff to call the callbacks\n  local body2 = love.physics.newBody(world, 10, 10, 'dynamic')\n  local rectangle2 = love.physics.newRectangleShape(body2, 0, 0, 10, 10)\n  test:assertFalse(beginContactCheck, 'check world didnt update after adding body')\n  world:update(1)\n  test:assertTrue(beginContactCheck, 'check contact start')\n  test:assertTrue(preSolveCheck, 'check pre solve')\n  test:assertTrue(postSolveCheck, 'check post solve')\n  body2:setPosition(100, 100)\n  world:update(1)\n  test:assertTrue(endContactCheck, 'check contact end')\n\n  -- check point checking\n  local shapes = 0\n  world:queryShapesInArea(0, 0, 10, 10, function(x)\n    shapes = shapes + 1\n  end)\n  test:assertEquals(1, shapes, 'check shapes in area')\n\n  -- check raycast\n  world:rayCast(0, 0, 200, 200, function(x)\n    shapes = shapes + 1\n    return 1\n  end)\n  test:assertEquals(3, shapes, 'check shapes in raycast')\n  test:assertEquals(world:rayCastClosest(0, 0, 200, 200), rectangle1, 'check closest raycast')\n  test:assertNotEquals(nil, world:rayCastAny(0, 0, 200, 200), 'check any raycast')\n\n  -- change collision logic\n  test:assertEquals(nil, world:getContactFilter(), 'check def filter')\n  world:update(1)\n  world:setContactFilter(function(s1, s2)\n    return false -- nothing collides\n  end)\n  body2:setPosition(10, 10)\n  world:update(1)\n  test:assertEquals(1, collisions, 'check collision logic change')\n\n  -- check gravity\n  world:setGravity(1, 1)\n  test:assertEquals(1, world:getGravity(), 'check grav change')\n\n  -- check destruction\n  test:assertFalse(world:isDestroyed(), 'check not destroyed')\n  world:destroy()\n  test:assertTrue(world:isDestroyed(), 'check world destroyed')\n\nend\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n------------------------------------METHODS-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.physics.getDistance\nlove.test.physics.getDistance = function(test)\n  -- setup two fixtues to check\n  local world = love.physics.newWorld(0, 0, false)\n  local body = love.physics.newBody(world, 10, 10, 'static')\n  local shape1 = love.physics.newEdgeShape(body, 0, 0, 5, 5)\n  local shape2 = love.physics.newEdgeShape(body, 10, 10, 15, 15)\n  -- check distance between them\n  test:assertRange(love.physics.getDistance(shape1, shape2), 6, 7, 'check distance matches')\nend\n\n\n-- love.physics.getMeter\nlove.test.physics.getMeter = function(test)\n  -- check value set is returned\n  love.physics.setMeter(30)\n  test:assertEquals(30, love.physics.getMeter(), 'check meter matches')\nend\n\n\n-- love.physics.newBody\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.physics.newBody = function(test)\n  local world = love.physics.newWorld(1, 1, true)\n  local body = love.physics.newBody(world, 10, 10, 'static')\n  test:assertObject(body)\nend\n\n\n-- love.physics.newChainShape\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.physics.newChainShape = function(test)\n  local world = love.physics.newWorld(1, 1, true)\n  local body = love.physics.newBody(world, 10, 10, 'static')\n  test:assertObject(love.physics.newChainShape(body, true, 0, 0, 1, 0, 1, 1, 0, 1))\nend\n\n\n-- love.physics.newCircleShape\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.physics.newCircleShape = function(test)\n  local world = love.physics.newWorld(1, 1, true)\n  local body = love.physics.newBody(world, 10, 10, 'static')\n  test:assertObject(love.physics.newCircleShape(body, 10))\nend\n\n\n-- love.physics.newDistanceJoint\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.physics.newDistanceJoint = function(test)\n  local world = love.physics.newWorld(1, 1, true)\n  local body1 = love.physics.newBody(world, 10, 10, 'static')\n  local body2 = love.physics.newBody(world, 20, 20, 'static')\n  local obj = love.physics.newDistanceJoint(body1, body2, 10, 10, 20, 20, true)\n  test:assertObject(obj)\nend\n\n\n-- love.physics.newEdgeShape\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.physics.newEdgeShape = function(test)\n  local world = love.physics.newWorld(1, 1, true)\n  local body = love.physics.newBody(world, 10, 10, 'static')\n  local obj = love.physics.newEdgeShape(body, 0, 0, 10, 10)\n  test:assertObject(obj)\nend\n\n\n-- love.physics.newFrictionJoint\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.physics.newFrictionJoint = function(test)\n  local world = love.physics.newWorld(1, 1, true)\n  local body1 = love.physics.newBody(world, 10, 10, 'static')\n  local body2 = love.physics.newBody(world, 20, 20, 'static')\n  local obj = love.physics.newFrictionJoint(body1, body2, 15, 15, true)\n  test:assertObject(obj)\nend\n\n\n-- love.physics.newGearJoint\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.physics.newGearJoint = function(test)\n  local world = love.physics.newWorld(1, 1, true)\n  local body1 = love.physics.newBody(world, 10, 10, 'dynamic')\n  local body2 = love.physics.newBody(world, 20, 20, 'dynamic')\n  local body3 = love.physics.newBody(world, 30, 30, 'dynamic')\n  local body4 = love.physics.newBody(world, 40, 40, 'dynamic')\n  local joint1 = love.physics.newPrismaticJoint(body1, body2, 10, 10, 20, 20, true)\n  local joint2 = love.physics.newPrismaticJoint(body3, body4, 30, 30, 40, 40, true)\n  local obj = love.physics.newGearJoint(joint1, joint2, 1, true)\n  test:assertObject(obj)\nend\n\n\n-- love.physics.newMotorJoint\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.physics.newMotorJoint = function(test)\n  local world = love.physics.newWorld(1, 1, true)\n  local body1 = love.physics.newBody(world, 10, 10, 'static')\n  local body2 = love.physics.newBody(world, 20, 20, 'static')\n  local obj = love.physics.newMotorJoint(body1, body2, 1)\n  test:assertObject(obj)\nend\n\n\n-- love.physics.newMouseJoint\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.physics.newMouseJoint = function(test)\n  local world = love.physics.newWorld(1, 1, true)\n  local body = love.physics.newBody(world, 10, 10, 'static')\n  local obj = love.physics.newMouseJoint(body, 10, 10)\n  test:assertObject(obj)\nend\n\n\n-- love.physics.newPolygonShape\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.physics.newPolygonShape = function(test)\n  local world = love.physics.newWorld(1, 1, true)\n  local body = love.physics.newBody(world, 10, 10, 'static')\n  local obj = love.physics.newPolygonShape(body, {0, 0, 2, 3, 2, 1, 3, 1, 5, 1})\n  test:assertObject(obj)\nend\n\n\n-- love.physics.newPrismaticJoint\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.physics.newPrismaticJoint = function(test)\n  local world = love.physics.newWorld(1, 1, true)\n  local body1 = love.physics.newBody(world, 10, 10, 'static')\n  local body2 = love.physics.newBody(world, 20, 20, 'static')\n  local obj = love.physics.newPrismaticJoint(body1, body2, 10, 10, 20, 20, true)\n  test:assertObject(obj)\nend\n\n\n-- love.physics.newPulleyJoint\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.physics.newPulleyJoint = function(test)\n  local world = love.physics.newWorld(1, 1, true)\n  local body1 = love.physics.newBody(world, 10, 10, 'static')\n  local body2 = love.physics.newBody(world, 20, 20, 'static')\n  local obj = love.physics.newPulleyJoint(body1, body2, 10, 10, 20, 20, 15, 15, 25, 25, 1, true)\n  test:assertObject(obj)\nend\n\n\n-- love.physics.newRectangleShape\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.physics.newRectangleShape = function(test)\n  local world = love.physics.newWorld(1, 1, true)\n  local body = love.physics.newBody(world, 10, 10, 'static')\n  local shape1 = love.physics.newRectangleShape(body, 10, 20)\n  local shape2 = love.physics.newRectangleShape(body, 10, 10, 40, 30, 10)\n  test:assertObject(shape1)\n  test:assertObject(shape2)\nend\n\n\n-- love.physics.newRevoluteJoint\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.physics.newRevoluteJoint = function(test)\n  local world = love.physics.newWorld(1, 1, true)\n  local body1 = love.physics.newBody(world, 10, 10, 'static')\n  local body2 = love.physics.newBody(world, 20, 20, 'static')\n  local obj = love.physics.newRevoluteJoint(body1, body2, 10, 10, true)\n  test:assertObject(obj)\nend\n\n\n-- love.physics.newRopeJoint\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.physics.newRopeJoint = function(test)\n  local world = love.physics.newWorld(1, 1, true)\n  local body1 = love.physics.newBody(world, 10, 10, 'static')\n  local body2 = love.physics.newBody(world, 20, 20, 'static')\n  local obj = love.physics.newRopeJoint(body1, body2, 10, 10, 20, 20, 50, true)\n  test:assertObject(obj)\nend\n\n\n-- love.physics.newWeldJoint\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.physics.newWeldJoint = function(test)\n  local world = love.physics.newWorld(1, 1, true)\n  local body1 = love.physics.newBody(world, 10, 10, 'static')\n  local body2 = love.physics.newBody(world, 20, 20, 'static')\n  local obj = love.physics.newWeldJoint(body1, body2, 10, 10, true)\n  test:assertObject(obj)\nend\n\n\n-- love.physics.newWheelJoint\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.physics.newWheelJoint = function(test)\n  local world = love.physics.newWorld(1, 1, true)\n  local body1 = love.physics.newBody(world, 10, 10, 'static')\n  local body2 = love.physics.newBody(world, 20, 20, 'static')\n  local obj = love.physics.newWheelJoint(body1, body2, 10, 10, 5, 5, true)\n  test:assertObject(obj)\nend\n\n\n-- love.physics.newWorld\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.physics.newWorld = function(test)\n  local world = love.physics.newWorld(1, 1, true)\n  test:assertObject(world)\nend\n\n\n-- love.physics.setMeter\nlove.test.physics.setMeter = function(test)\n  -- set initial meter\n  local world = love.physics.newWorld(1, 1, true)\n  love.physics.setMeter(30)\n  local body = love.physics.newBody(world, 300, 300, \"dynamic\")\n  -- check changing meter changes pos value relatively\n  love.physics.setMeter(10)\n  local x, y = body:getPosition()\n  test:assertEquals(100, x, 'check pos x')\n  test:assertEquals(100, y, 'check pos y')\nend\n"
  },
  {
    "path": "testing/tests/sensor.lua",
    "content": "-- love.sensor\n-- @NOTE we can't test this module fully as it's hardware dependent\n-- however we can test methods do what is expected and can handle certain params\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n------------------------------------HELPERS-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\nlocal function testIsEnabled(test, sensorType)\n  love.sensor.setEnabled(sensorType, true)\n  test:assertTrue(love.sensor.isEnabled(sensorType), 'check ' .. sensorType .. ' enabled')\n  love.sensor.setEnabled(sensorType, false)\n  test:assertFalse(love.sensor.isEnabled(sensorType), 'check ' .. sensorType .. ' disabled')\nend\n\n\nlocal function testGetName(test, sensorType)\n  love.sensor.setEnabled(sensorType, true)\n  local ok, name = pcall(love.sensor.getName, sensorType)\n  test:assertTrue(ok, 'check sensor.getName(\"' .. sensorType .. '\") success')\n  test:assertEquals(type(name), 'string', 'check sensor.getName(\"' .. sensorType .. '\") return value type')\n\n  love.sensor.setEnabled(sensorType, false)\n  ok, name = pcall(love.sensor.getName, sensorType)\n  test:assertFalse(ok, 'check sensor.getName(\"' .. sensorType .. '\") errors when disabled')\nend\n\n\nlocal function testGetData(test, sensorType)\n  love.sensor.setEnabled(sensorType, true)\n  local ok, x, y, z = pcall(love.sensor.getData, sensorType)\n  test:assertTrue(ok, 'check sensor.getData(\"' .. sensorType .. '\") success')\n  if ok then\n    test:assertNotNil(x)\n    test:assertNotNil(y)\n    test:assertNotNil(z)\n  end\n\n  love.sensor.setEnabled(sensorType, false)\n  ok, x, y, z = pcall(love.sensor.getData, sensorType)\n  test:assertFalse(ok, 'check sensor.getData(\"' .. sensorType .. '\") errors when disabled')\nend\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n------------------------------------METHODS-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.sensor.hasSensor\nlove.test.sensor.hasSensor = function(test)\n  -- but we can make sure that the SensorTypes can be passed\n  local accelerometer = love.sensor.hasSensor('accelerometer')\n  local gyroscope = love.sensor.hasSensor('gyroscope')\n  test:assertNotNil(accelerometer)\n  test:assertNotNil(gyroscope)\nend\n\n\n-- love.sensor.isEnabled and love.sensor.setEnabled\nlove.test.sensor.isEnabled = function(test)\n  local accelerometer = love.sensor.hasSensor('accelerometer')\n  local gyroscope = love.sensor.hasSensor('gyroscope')\n\n  if accelerometer or gyroscope then\n    if accelerometer then testIsEnabled(test, 'accelerometer') end\n    if gyroscope then testIsEnabled(test, 'gyroscope') end\n  else\n    test:skipTest('neither accelerometer nor gyroscope are supported in this system')\n  end\nend\n\n\n-- love.sensor.getName\nlove.test.sensor.getName = function(test)\n  local accelerometer = love.sensor.hasSensor('accelerometer')\n  local gyroscope = love.sensor.hasSensor('gyroscope')\n\n  if accelerometer or gyroscope then\n    if accelerometer then testGetName(test, 'accelerometer') end\n    if gyroscope then testGetName(test, 'gyroscope') end\n  else\n    test:skipTest('neither accelerometer nor gyroscope are supported in this system')\n  end\nend\n\n\n-- love.sensor.getData\nlove.test.sensor.getData = function(test)\n  local accelerometer = love.sensor.hasSensor('accelerometer')\n  local gyroscope = love.sensor.hasSensor('gyroscope')\n\n  if accelerometer or gyroscope then\n    if accelerometer then testGetData(test, 'accelerometer') end\n    if gyroscope then testGetData(test, 'gyroscope') end\n  else\n    test:skipTest('neither accelerometer nor gyroscope are supported in this system')\n  end\nend\n"
  },
  {
    "path": "testing/tests/sound.lua",
    "content": "-- love.sound\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n------------------------------------OBJECTS-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- Decoder (love.sound.newDecoder)\nlove.test.sound.Decoder = function(test)\n\n  -- create obj\n  local decoder = love.sound.newDecoder('resources/click.ogg')\n  test:assertObject(decoder)\n\n  -- check bit depth\n  test:assertMatch({8, 16}, decoder:getBitDepth(), 'check bit depth')\n\n  -- check channel count\n  test:assertMatch({1, 2}, decoder:getChannelCount(), 'check channel count')\n\n  -- check duration\n  test:assertRange(decoder:getDuration(), 0.06, 0.07, 'check duration')\n\n  -- check sample rate\n  test:assertEquals(44100, decoder:getSampleRate(), 'check sample rate')\n\n  -- check makes sound data (test in method below)\n  test:assertObject(decoder:decode())\n\n  -- check cloning sound\n  local clone = decoder:clone()\n  test:assertMatch({8, 16}, clone:getBitDepth(), 'check cloned bit depth')\n  test:assertMatch({1, 2}, clone:getChannelCount(), 'check cloned channel count')\n  test:assertRange(clone:getDuration(), 0.06, 0.07, 'check cloned duration')\n  test:assertEquals(44100, clone:getSampleRate(), 'check cloned sample rate')\n\nend\n\n\n-- SoundData (love.sound.newSoundData)\nlove.test.sound.SoundData = function(test)\n\n  -- create obj\n  local sdata = love.sound.newSoundData('resources/click.ogg')\n  test:assertObject(sdata)\n\n  -- check data size + string\n  test:assertEquals(11708, sdata:getSize(), 'check size')\n  test:assertNotNil(sdata:getString())\n\n  -- check bit depth\n  test:assertMatch({8, 16}, sdata:getBitDepth(), 'check bit depth')\n\n  -- check channel count\n  test:assertMatch({1, 2}, sdata:getChannelCount(), 'check channel count')\n\n  -- check duration\n  test:assertRange(sdata:getDuration(), 0.06, 0.07, 'check duration')\n\n  -- check samples\n  test:assertEquals(44100, sdata:getSampleRate(), 'check sample rate')\n  test:assertEquals(2927, sdata:getSampleCount(), 'check sample count')\n\n  -- check cloning\n  local clone = sdata:clone()\n  test:assertEquals(11708, clone:getSize(), 'check clone size')\n  test:assertNotNil(clone:getString())\n  test:assertMatch({8, 16}, clone:getBitDepth(), 'check clone bit depth')\n  test:assertMatch({1, 2}, clone:getChannelCount(), 'check clone channel count')\n  test:assertRange(clone:getDuration(), 0.06, 0.07, 'check clone duration')\n  test:assertEquals(44100, clone:getSampleRate(), 'check clone sample rate')\n  test:assertEquals(2927, clone:getSampleCount(), 'check clone sample count')\n\n  -- check sample setting\n  test:assertRange(sdata:getSample(0.001), -0.1, 0, 'check sample 1')\n  test:assertRange(sdata:getSample(0.005), -0.1, 0, 'check sample 1')\n  sdata:setSample(0.002, 1)\n  test:assertEquals(1, sdata:getSample(0.002), 'check setting sample manually')\n\n  -- check copying from another sound\n  local copy1 = love.sound.newSoundData('resources/tone.ogg')\n  local copy2 = love.sound.newSoundData('resources/pop.ogg')\n  local before = copy2:getSample(0.02)\n  copy2:copyFrom(copy1, 0.01, 1, 0.02)\n  test:assertNotEquals(before, copy2:getSample(0.02), 'check changed')\n\n  -- check slicing\n  local count = math.floor(copy1:getSampleCount()/2)\n  local slice = copy1:slice(0, count)\n  test:assertEquals(count, slice:getSampleCount(), 'check slice length')\n\nend\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n------------------------------------METHODS-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n\n-- love.sound.newDecoder\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.sound.newDecoder = function(test)\n  test:assertObject(love.sound.newDecoder('resources/click.ogg'))\nend\n\n\n-- love.sound.newSoundData\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.sound.newSoundData = function(test)\n  test:assertObject(love.sound.newSoundData('resources/click.ogg'))\n  test:assertObject(love.sound.newSoundData(math.floor((1/32)*44100), 44100, 16, 1))\nend\n"
  },
  {
    "path": "testing/tests/system.lua",
    "content": "-- love.system\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n----------------------------------METHODS---------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.system.getClipboardText\nlove.test.system.getClipboardText = function(test)\n  -- ignore if not using window\n  if love.test.windowmode == false then \n    return test:skipTest('clipboard only available in window mode') \n  end\n  -- check clipboard value is set\n  love.system.setClipboardText('helloworld')\n  test:assertEquals('helloworld', love.system.getClipboardText(), 'check clipboard match')\nend\n\n\n-- love.system.getOS\nlove.test.system.getOS = function(test)\n  -- check os is in documented values\n  local os = love.system.getOS()\n  local options = {'OS X', 'Windows', 'Linux', 'Android', 'iOS'}\n  test:assertMatch(options, os, 'check value matches')\nend\n\n\n-- love.system.getPreferredLocales\nlove.test.system.getPreferredLocales = function(test)\n  local locale = love.system.getPreferredLocales()\n  test:assertNotNil(locale)\n  test:assertEquals('table', type(locale), 'check returns table')\nend\n\n\n-- love.system.getPowerInfo\nlove.test.system.getPowerInfo = function(test)\n  -- check battery state is one of the documented states\n  local state, percent, seconds = love.system.getPowerInfo()\n  local states = {'unknown', 'battery', 'nobattery', 'charging', 'charged'}\n  test:assertMatch(states, state, 'check value matches')\n  -- if percent/seconds check within expected range\n  if percent ~= nil then\n    test:assertRange(percent, 0, 100, 'check battery percent within range')\n  end\n  if seconds ~= nil then\n    test:assertNotNil(seconds)\n  end\nend\n\n\n-- love.system.getProcessorCount\nlove.test.system.getProcessorCount = function(test)\n  test:assertNotNil(love.system.getProcessorCount()) -- youd hope right\nend\n\n\n-- love.system.getMemorySize\nlove.test.system.getMemorySize = function(test)\n  test:assertNotNil(love.system.getMemorySize())\nend\n\n\n-- love.system.hasBackgroundMusic\nlove.test.system.hasBackgroundMusic = function(test)\n  test:assertNotNil(love.system.hasBackgroundMusic())\nend\n\n\n-- love.system.openURL\nlove.test.system.openURL = function(test)\n  test:skipTest('cant test this worked')\n  --test:assertNotEquals(nil, love.system.openURL('https://love2d.org'), 'check open URL')\nend\n\n\n-- love.system.getClipboardText\nlove.test.system.setClipboardText = function(test)\n  -- ignore if not using window\n  if love.test.windowmode == false then \n    return test:skipTest('clipboard only available in window mode') \n  end\n  -- check value returned is what was set\n  love.system.setClipboardText('helloworld')\n  test:assertEquals('helloworld', love.system.getClipboardText(), 'check set text')\nend\n\n\n-- love.system.vibrate\n-- @NOTE cant really test this\nlove.test.system.vibrate = function(test)\n  test:skipTest('cant test this worked')\nend\n"
  },
  {
    "path": "testing/tests/thread.lua",
    "content": "-- love.thread\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n----------------------------------OBJECTS---------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- Channel (love.thread.newChannel)\nlove.test.thread.Channel = function(test)\n\n  -- create channel\n  local channel = love.thread.getChannel('test')\n  test:assertObject(channel)\n\n  -- setup thread to use\n  local threadcode1 = [[\n    require(\"love.timer\")\n    love.timer.sleep(0.1)\n    love.thread.getChannel('test'):push('hello world')\n    love.timer.sleep(0.1)\n    love.thread.getChannel('test'):push('me again')\n  ]]\n  local thread1 = love.thread.newThread(threadcode1)\n  thread1:start()\n\n  -- check message sent from thread to channel\n  local msg1 = channel:demand()\n  test:assertEquals('hello world', msg1, 'check 1st message was sent')\n  thread1:wait()\n  test:assertEquals(1, channel:getCount(), 'check still another message')\n  test:assertEquals('me again', channel:peek(), 'check 2nd message pending')\n  local msg2 = channel:pop()\n  test:assertEquals('me again', msg2, 'check 2nd message was sent')\n  channel:clear()\n\n  -- setup another thread for some ping pong\n  local threadcode2 = [[\n    local function setChannel(channel, value)\n      channel:clear()\n      return channel:push(value)\n    end\n    local channel = love.thread.getChannel('test')\n    local waiting = true\n    local sent = nil\n    while waiting == true do\n      if sent == nil then\n        sent = channel:performAtomic(setChannel, 'ping')\n      end\n      if channel:hasRead(sent) then\n        local msg = channel:demand()\n        if msg == 'pong' then \n          channel:push(msg)\n          waiting = false\n        end\n      end\n    end\n  ]]\n\n  -- first we run a thread that will send 1 ping\n  local thread2 = love.thread.newThread(threadcode2)\n  thread2:start()\n\n  -- we wait for that ping to be sent and then send a pong back\n  local msg3 = channel:demand()\n  test:assertEquals('ping', msg3, 'check message recieved 1')\n\n  -- thread should be waiting for us, and checking is the ping was read\n  channel:supply('pong', 1)\n\n  -- if it was then it should send back our pong and thread should die\n  thread2:wait()\n  local msg4 = channel:pop()\n  test:assertEquals('pong', msg4, 'check message recieved 2')\n  test:assertEquals(0, channel:getCount())\n\nend\n\n\n-- Thread (love.thread.newThread)\nlove.test.thread.Thread = function(test)\n\n  -- create thread\n  local threadcode = [[\n    local b = 0\n    for a=1,100000 do \n      b = b + a \n    end\n  ]]\n  local thread = love.thread.newThread(threadcode)\n  test:assertObject(thread)\n\n  -- check thread runs\n  thread:start()\n  test:assertTrue(thread:isRunning(), 'check started')\n  thread:wait()\n  test:assertFalse(thread:isRunning(), 'check finished')\n  test:assertEquals(nil, thread:getError(), 'check no errors')\n\n  -- check an invalid thread\n  local badthreadcode = 'local b = 0\\nreturn b + \"string\" .. 10'\n  local badthread = love.thread.newThread(badthreadcode)\n  badthread:start()\n  badthread:wait()\n  test:assertNotNil(badthread:getError())\n\nend\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n----------------------------------METHODS---------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.thread.getChannel\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.thread.getChannel = function(test)\n  test:assertObject(love.thread.getChannel('test'))\nend\n\n\n-- love.thread.newChannel\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.thread.newChannel = function(test)\n  test:assertObject(love.thread.newChannel())\nend\n\n\n-- love.thread.newThread\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.thread.newThread = function(test)\n  test:assertObject(love.thread.newThread('classes/TestSuite.lua'))\nend\n"
  },
  {
    "path": "testing/tests/timer.lua",
    "content": "-- love.timer\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n----------------------------------METHODS---------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.timer.getAverageDelta\n-- @NOTE not sure if you could reliably get a specific delta?\nlove.test.timer.getAverageDelta = function(test)\n  test:assertNotNil(love.timer.getAverageDelta())\nend\n\n-- love.timer.getDelta\n-- @NOTE not sure if you could reliably get a specific delta?\nlove.test.timer.getDelta = function(test)\n  test:assertNotNil(love.timer.getDelta())\nend\n\n\n-- love.timer.getFPS\n-- @NOTE not sure if you could reliably get a specific FPS?\nlove.test.timer.getFPS = function(test)\n  test:assertNotNil(love.timer.getFPS())\nend\n\n\n-- love.timer.getTime\nlove.test.timer.getTime = function(test)\n  local starttime = love.timer.getTime()\n  love.timer.sleep(0.1)\n  local endtime = love.timer.getTime() - starttime\n  test:assertRange(endtime, 0.05, 1, 'check 0.1s passes')\nend\n\n\n-- love.timer.sleep\nlove.test.timer.sleep = function(test)\n  local starttime = love.timer.getTime()\n  love.timer.sleep(0.1)\n  test:assertRange(love.timer.getTime() - starttime, 0.05, 1, 'check 0.1s passes')\nend\n\n\n-- love.timer.step\n-- @NOTE not sure if you could reliably get a specific step val?\nlove.test.timer.step = function(test)\n  test:assertNotNil(love.timer.step())\nend\n"
  },
  {
    "path": "testing/tests/touch.lua",
    "content": "-- love.touch\n-- @NOTE we can't test this module fully as it's hardware dependent\n-- however we can test methods do what is expected and can handle certain params\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n------------------------------------METHODS-------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.touch.getPosition\n-- @TODO is there a way to fake the touchid pointer?\nlove.test.touch.getPosition = function(test)\n  test:assertNotNil(love.touch.getPosition)\n  test:assertEquals('function', type(love.touch.getPosition))\nend\n\n\n-- love.touch.getPressure\n-- @TODO is there a way to fake the touchid pointer?\nlove.test.touch.getPressure = function(test)\n  test:assertNotNil(love.touch.getPressure)\n  test:assertEquals('function', type(love.touch.getPressure))\nend\n\n\n-- love.touch.getTouches\nlove.test.touch.getTouches = function(test)\n  test:assertEquals('function', type(love.touch.getTouches))\nend\n"
  },
  {
    "path": "testing/tests/video.lua",
    "content": "-- love.video\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n----------------------------------OBJECTS---------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- VideoStream (love.thread.newVideoStream)\nlove.test.video.VideoStream = function(test)\n\n  -- create obj\n  local video = love.video.newVideoStream('resources/sample.ogv')\n  test:assertObject(video)\n\n  -- check def properties\n  test:assertEquals('resources/sample.ogv', video:getFilename(), 'check filename')\n  test:assertFalse(video:isPlaying(), 'check not playing by def')\n\n  -- check playing and pausing states\n  video:play()\n  test:assertTrue(video:isPlaying(), 'check now playing')\n  video:seek(0.3)\n  test:assertRange(video:tell(), 0.3, 0.4, 'check seek/tell')\n  video:rewind()\n  test:assertRange(video:tell(), 0, 0.1, 'check rewind')\n  video:pause()\n  test:assertFalse(video:isPlaying(), 'check paused')\n\nend\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n----------------------------------METHODS---------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.video.newVideoStream\n-- @NOTE this is just basic nil checking, objs have their own test method\nlove.test.video.newVideoStream = function(test)\n  test:assertObject(love.video.newVideoStream('resources/sample.ogv'))\nend\n"
  },
  {
    "path": "testing/tests/window.lua",
    "content": "-- love.window\n\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n----------------------------------METHODS---------------------------------------\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n\n-- love.window.focus\nlove.test.window.focus = function(test)\n  -- cant test as doesnt return anything\n  test:assertEquals('function', type(love.window.focus), 'check method exists')\nend\n\n\n-- love.window.fromPixels\nlove.test.window.fromPixels = function(test)\n  -- check dpi/pixel ratio as expected\n  local dpi = love.window.getDPIScale()\n  local pixels = love.window.fromPixels(100)\n  test:assertEquals(100/dpi, pixels, 'check dpi ratio')\nend\n\n\n-- love.window.getDPIScale\n-- @NOTE dependent on hardware so best can do is not nil\nlove.test.window.getDPIScale = function(test)\n  test:assertNotNil(test)\nend\n\n\n-- love.window.getDesktopDimensions\n-- @NOTE dependent on hardware so best can do is not nil\nlove.test.window.getDesktopDimensions = function(test)\n  local w, h = love.window.getDesktopDimensions()\n  test:assertNotNil(w)\n  test:assertNotNil(h)\nend\n\n\n-- love.window.getDisplayCount\n-- @NOTE cant wait for the test suite to be run headless and fail here\nlove.test.window.getDisplayCount = function(test)\n  test:assertGreaterEqual(1, love.window.getDisplayCount(), 'check 1 display')\nend\n\n\n-- love.window.getDisplayName\n-- @NOTE dependent on hardware so best can do is not nil\nlove.test.window.getDisplayName = function(test)\n  test:assertNotNil(love.window.getDisplayName(1))\nend\n\n\n-- love.window.getDisplayOrientation\n-- @NOTE dependent on hardware so best can do is not nil\nlove.test.window.getDisplayOrientation = function(test)\n  test:assertNotNil(love.window.getDisplayOrientation(1))\nend\n\n\n-- love.window.getFullscreen\nlove.test.window.getFullscreen = function(test)\n  if GITHUB_RUNNER and test:isOS('Linux') then\n    return test:skipTest(\"xvfb on Linux doesn't support fullscreen\")\n  end\n\n  -- check not fullscreen to start\n  test:assertFalse(love.window.getFullscreen(), 'check not fullscreen')\n  love.window.setFullscreen(true)\n  -- check now fullscreen\n  test:assertTrue(love.window.getFullscreen(), 'check now fullscreen')\n  love.window.setFullscreen(false) -- reset\nend\n\n\n-- love.window.getFullscreenModes\n-- @NOTE dependent on hardware so best can do is not nil\nlove.test.window.getFullscreenModes = function(test)\n  test:assertNotNil(love.window.getFullscreenModes(1))\nend\n\n\n-- love.window.getIcon\nlove.test.window.getIcon = function(test)\n  -- check icon nil by default if not set\n  test:assertEquals(nil, love.window.getIcon(), 'check nil by default')\n  local icon = love.image.newImageData('resources/love.png')\n  -- check getting icon not nil after setting\n  love.window.setIcon(icon)\n  test:assertNotNil(love.window.getIcon())\nend\n\n\n-- love.window.getMode\n-- @NOTE could prob add more checks on the flags here based on conf.lua\nlove.test.window.getMode = function(test)\n  local w, h, flags = love.window.getMode()\n  test:assertEquals(360, w, 'check w')\n  test:assertEquals(240, h, 'check h')\n  test:assertFalse(flags[\"fullscreen\"], 'check fullscreen')\nend\n\n\n-- love.window.getPosition\n-- @NOTE anything we could check display index agaisn't in getPosition return?\nlove.test.window.getPosition = function(test)\n  love.window.setPosition(100, 100, 1)\n  local x, y, _ = love.window.getPosition()\n  test:assertEquals(100, x, 'check position x')\n  test:assertEquals(100, y, 'check position y')\nend\n\n\n-- love.window.getSafeArea\n-- @NOTE dependent on hardware so best can do is not nil\nlove.test.window.getSafeArea = function(test)\n  local x, y, w, h = love.window.getSafeArea()\n  test:assertNotNil(x)\n  test:assertNotNil(y)\n  test:assertNotNil(w)\n  test:assertNotNil(h)\nend\n\n\n-- love.window.getTitle\nlove.test.window.getTitle = function(test)\n  -- check title returned is what was set\n  love.window.setTitle('love.testing')\n  test:assertEquals('love.testing', love.window.getTitle(), 'check title match')\n  love.window.setTitle('love.test')\nend\n\n\n-- love.window.getVSync\nlove.test.window.getVSync = function(test)\n  test:assertNotNil(love.window.getVSync())\nend\n\n\n-- love.window.hasFocus\n-- @NOTE cant really test as cant force focus\nlove.test.window.hasFocus = function(test)\n  test:assertNotNil(love.window.hasFocus())\nend\n\n\n-- love.window.hasMouseFocus\n-- @NOTE cant really test as cant force focus\nlove.test.window.hasMouseFocus = function(test)\n  test:assertNotNil(love.window.hasMouseFocus())\nend\n\n\n-- love.window.isDisplaySleepEnabled\nlove.test.window.isDisplaySleepEnabled = function(test)\n  test:assertNotNil(love.window.isDisplaySleepEnabled())\n  -- check disabled\n  love.window.setDisplaySleepEnabled(false)\n  test:assertFalse(love.window.isDisplaySleepEnabled(), 'check sleep disabled')\n  -- check enabled\n  love.window.setDisplaySleepEnabled(true)\n  test:assertTrue(love.window.isDisplaySleepEnabled(), 'check sleep enabled')\nend\n\n\n-- love.window.isMaximized\nlove.test.window.isMaximized = function(test)\n  if GITHUB_RUNNER and test:isOS('Linux') then\n    return test:skipTest(\"xvfb on Linux doesn't support window maximization\")\n  end\n\n  test:assertFalse(love.window.isMaximized(), 'check window not maximized')\n  love.window.maximize()\n  test:waitFrames(10)\n  -- on MACOS maximize wont get recognised immedietely so wait a few frames\n  test:assertTrue(love.window.isMaximized(), 'check window now maximized')\n  love.window.restore()\nend\n\n\n-- love.window.isMinimized\nlove.test.window.isMinimized = function(test)\n  if GITHUB_RUNNER and test:isOS('Linux') then\n    return test:skipTest(\"xvfb on Linux doesn't support window minimization\")\n  end\n\n  -- check not minimized to start\n  test:assertFalse(love.window.isMinimized(), 'check window not minimized')\n  -- try to minimize\n  love.window.minimize()\n  test:waitFrames(10)\n  -- on linux minimize won't get recognized immediately, so wait a few frames\n  test:assertTrue(love.window.isMinimized(), 'check window minimized')\n  love.window.restore()\nend\n\n\n-- love.window.isOccluded\nlove.test.window.isOccluded = function(test)\n  love.window.focus()\n  test:assertFalse(love.window.isOccluded(), 'check window not occluded')\nend\n\n\n-- love.window.isOpen\nlove.test.window.isOpen = function(test)\n  -- check open initially\n  test:assertTrue(love.window.isOpen(), 'check window open')\n  -- we check closing in test.window.close\nend\n\n\n-- love.window.isVisible\nlove.test.window.isVisible = function(test)\n  -- check visible initially\n  test:assertTrue(love.window.isVisible(), 'check window visible')\nend\n\n\n-- love.window.maximize\nlove.test.window.maximize = function(test)\n  if GITHUB_RUNNER and test:isOS('Linux') then\n    return test:skipTest(\"xvfb on Linux doesn't support window maximization\")\n  end\n\n  test:assertFalse(love.window.isMaximized(), 'check window not maximized')\n  -- check maximizing is set\n  love.window.maximize()\n  test:waitFrames(10)\n  -- on macos we need to wait a few frames\n  test:assertTrue(love.window.isMaximized(), 'check window maximized')\n  love.window.restore()\nend\n\n\n-- love.window.minimize\nlove.test.window.minimize = function(test)\n  if GITHUB_RUNNER and test:isOS('Linux') then\n    return test:skipTest(\"xvfb on Linux doesn't support window minimization\")\n  end\n\n  test:assertFalse(love.window.isMinimized(), 'check window not minimized')\n  -- check minimizing is set\n  love.window.minimize()\n  test:waitFrames(10)\n  -- on linux we need to wait a few frames\n  test:assertTrue(love.window.isMinimized(), 'check window maximized')\n  love.window.restore()\nend\n\n\n-- love.window.requestAttention\nlove.test.window.requestAttention = function(test)\n  test:skipTest('cant test this worked')\nend\n\n\n-- love.window.restore\nlove.test.window.restore = function(test)\n  if GITHUB_RUNNER and test:isOS('Linux') then\n    return test:skipTest(\"xvfb on Linux doesn't support window minimization\")\n  end\n\n  -- check minimized to start\n  love.window.minimize()\n  test:waitFrames(10)\n  love.window.restore()\n  test:waitFrames(10)\n  -- check restoring the state of the window\n  test:assertFalse(love.window.isMinimized(), 'check window restored')\nend\n\n\n-- love.window.setDisplaySleepEnabled\nlove.test.window.setDisplaySleepEnabled = function(test)\n  -- check disabling sleep\n  love.window.setDisplaySleepEnabled(false)\n  test:assertFalse(love.window.isDisplaySleepEnabled(), 'check sleep disabled')\n  -- check setting it back to enabled\n  love.window.setDisplaySleepEnabled(true)\n  test:assertTrue(love.window.isDisplaySleepEnabled(), 'check sleep enabled')\nend\n\n\n-- love.window.setFullscreen\nlove.test.window.setFullscreen = function(test)\n  if GITHUB_RUNNER and test:isOS('Linux') then\n    return test:skipTest(\"xvfb on Linux doesn't support fullscreen\")\n  end\n\n  -- check fullscreen is set\n  love.window.setFullscreen(true)\n  test:assertTrue(love.window.getFullscreen(), 'check fullscreen')\n  -- check setting back to normal\n  love.window.setFullscreen(false)\n  test:assertFalse(love.window.getFullscreen(), 'check not fullscreen')\nend\n\n\n-- love.window.setIcon\n-- @NOTE could check the image data itself?\nlove.test.window.setIcon = function(test)\n  -- check setting an icon returns the val\n  local icon = love.image.newImageData('resources/love.png')\n  love.window.setIcon(icon)\n  test:assertNotEquals(nil, love.window.getIcon(), 'check icon not nil')\nend\n\n\n-- love.window.setMode\n-- @NOTE same as getMode could be checking more flag properties\nlove.test.window.setMode = function(test)\n  -- set window mode\n  love.window.setMode(512, 512, {\n    fullscreen = false,\n    resizable = false\n  })\n  -- check what we set is returned\n  local width, height, flags = love.window.getMode()\n  test:assertEquals(512, width, 'check window w match')\n  test:assertEquals(512, height, 'check window h match')\n  test:assertFalse(flags[\"fullscreen\"], 'check window not fullscreen')\n  test:assertFalse(flags[\"resizable\"], 'check window not resizeable')\n  love.window.setMode(360, 240, {\n    fullscreen = false,\n    resizable = true\n  })\nend\n\n-- love.window.setPosition\nlove.test.window.setPosition = function(test)\n  -- check position is returned\n  love.window.setPosition(100, 100, 1)\n  test:waitFrames(10)\n  local x, y, _ = love.window.getPosition()\n  test:assertEquals(100, x, 'check position x')\n  test:assertEquals(100, y, 'check position y')\nend\n\n\n-- love.window.setTitle\nlove.test.window.setTitle = function(test)\n  -- check setting title val is returned\n  love.window.setTitle('love.testing')\n  test:assertEquals('love.testing', love.window.getTitle(), 'check title matches')\n  love.window.setTitle('love.test')\nend\n\n\n-- love.window.setVSync\nlove.test.window.setVSync = function(test)\n  love.window.setVSync(0)\n  test:assertNotNil(love.window.getVSync())\nend\n\n\n-- love.window.showMessageBox\n-- @NOTE if running headless would need to skip anyway cos can't press it\nlove.test.window.showMessageBox = function(test)\n  test:skipTest('cant test this worked')\nend\n\n\n-- love.window.toPixels\nlove.test.window.toPixels = function(test)\n  -- check dpi/pixel ratio is as expected\n  local dpi = love.window.getDPIScale()\n  local pixels = love.window.toPixels(50)\n  test:assertEquals(50*dpi, pixels, 'check dpi ratio')\nend\n\n\n-- love.window.updateMode\nlove.test.window.updateMode = function(test)\n  -- set initial mode\n  love.window.setMode(512, 512, {\n    fullscreen = false,\n    resizable = false\n  })\n  -- update mode with some props but not others\n  love.window.updateMode(360, 240, nil)\n  -- check only changed values changed\n  local width, height, flags = love.window.getMode()\n  test:assertEquals(360, width, 'check window w match')\n  test:assertEquals(240, height, 'check window h match')\n  test:assertFalse(flags[\"fullscreen\"], 'check window not fullscreen')\n  test:assertFalse(flags[\"resizable\"], 'check window not resizeable')\n  love.window.setMode(360, 240, { -- reset\n    fullscreen = false,\n    resizable = true\n  })\n\n  -- test different combinations of the backbuffer depth/stencil buffer.\n  test:waitFrames(1)\n  love.window.updateMode(360, 240, {depth = false, stencil = false})\n  test:waitFrames(1)\n  love.window.updateMode(360, 240, {depth = true, stencil = true})\n  test:waitFrames(1)\n  love.window.updateMode(360, 240, {depth = true, stencil = false})\n  test:waitFrames(1)\n  love.window.updateMode(360, 240, {depth = false, stencil = true})\nend\n"
  },
  {
    "path": "testing/todo.md",
    "content": "# TODO\nThese are all the outstanding methods that require test coverage, along with a few bits that still need doing / discussion.  \n\n## General \n- ability to test loading different combinations of modules if needed?\n- check expected behaviour of mount + unmount with common path\n  try uncommenting love.filesystem.unmountCommonPath and you'll see the issues\n- revisit love.audio.setPlaybackDevice when we update openal soft for MacOS\n\n## Graphics\n- love.graphics.copyBuffer()\n- love.graphics.copyBufferToTexture()\n- love.graphics.copyTextureToBuffer()\n- love.graphics.readbackTexture()\n- love.graphics.readbackTextureAsync()\n- love.graphics.readbackBuffer()\n- love.graphics.readbackBufferAsync()\n- love.graphics.newComputeShader()\n- love.graphics.dispatchThreadgroups()\n- love.graphics.dispatchIndirect()\n- love.graphics.drawFromShader()\n- love.graphics.drawFromShaderIndirect()\n- love.graphics.drawIndirect()\n- love.graphics.getQuadIndexBuffer()\n- love.graphics.setBlendState()\n- love.graphics.resetProjection()\n- love.graphics.Mesh:getAttachedAttributes()\n- love.graphics.Shader:hasStage()\n"
  }
]